From 4cdc28ce95ee462e9e41e61de027696d6cd2de79 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Mon, 6 Jan 2014 13:39:00 +0000 Subject: [PATCH 001/445] [SP] [UI] Inventory menu code --- code/ui/ui_local.h | 13 ++ code/ui/ui_main.cpp | 423 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 435 insertions(+), 1 deletion(-) diff --git a/code/ui/ui_local.h b/code/ui/ui_local.h index f4bb5294e0..911372ca68 100644 --- a/code/ui/ui_local.h +++ b/code/ui/ui_local.h @@ -178,6 +178,19 @@ typedef struct { itemDef_t *weaponThrowButton; qhandle_t litThrowableIcon; qhandle_t unlitThrowableIcon; + + short selectedInventory1; + char selectedInventory1ItemName[64]; + short selectedInventory2; + char selectedInventory2ItemName[64]; + itemDef_t *inventory1ItemButton; + qhandle_t litInventory1Icon; + qhandle_t unlitInventory1Icon; + itemDef_t *inventory2ItemButton; + qhandle_t litInventory2Icon; + qhandle_t unlitInventory2Icon; + + short movesTitleIndex; const char *movesBaseAnim; int moveAnimTime; diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 30ec9ef0e6..ec4caa0c8f 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -123,6 +123,11 @@ static void UI_NormalThrowSelection ( void ); static void UI_HighLightThrowSelection( void ); static void UI_ClearInventory ( void ); static void UI_GiveInventory ( const int itemIndex, const int amount ); +static void UI_AddInventorySelection ( const int inventoryIndex, const int amount, const char *iconItemName,const char *litIconItemName, const char *hexBackground, const char *soundfile ); +static void UI_RemoveInventorySelection ( const int inventoryIndex ); +static void UI_HighLightInventorySelection ( const int selectionslot ); +static void UI_NormalInventorySelection ( const int selectionslot ); +static void UI_InitInventorySelect( void ); static void UI_ForcePowerWeaponsButton(qboolean activeFlag); static void UI_UpdateCharacterSkin( void ); static void UI_UpdateCharacter( qboolean changedModel ); @@ -1443,7 +1448,84 @@ static qboolean UI_RunMenuScript ( const char **args ) String_Parse(args, &amount); UI_GiveInventory(atoi(inventoryIndex),atoi(amount)); } - else if (Q_stricmp(name, "updatefightingstyle") == 0) + else if (Q_stricmp(name, "addinventoryselection") == 0) + { + const char *inventoryIndex; + String_Parse(args, &inventoryIndex); + if (!inventoryIndex) + { + return qfalse; + } + + const char *amount; + String_Parse(args, &amount); + if (!amount) + { + return qfalse; + } + + const char *itemName; + String_Parse(args, &itemName); + if (!itemName) + { + return qfalse; + } + + const char *litItemName; + String_Parse(args, &litItemName); + if (!litItemName) + { + return qfalse; + } + + const char *backgroundName; + String_Parse(args, &backgroundName); + if (!backgroundName) + { + return qfalse; + } + + const char *soundfile = NULL; + String_Parse(args, &soundfile); + + UI_AddInventorySelection(atoi(inventoryIndex),atoi(amount),itemName,litItemName, backgroundName, soundfile); + } + else if (Q_stricmp(name, "removeinventoryselection") == 0) + { + const char *inventoryIndex; + String_Parse(args, &inventoryIndex); + if (inventoryIndex) + { + UI_RemoveInventorySelection(atoi(inventoryIndex)); + } + } + else if (Q_stricmp(name, "normalinventoryselection") == 0) + { + const char *slotIndex; + String_Parse(args, &slotIndex); + if (!slotIndex) + { + return qfalse; + } + + UI_NormalInventorySelection(atoi(slotIndex)); + } + else if (Q_stricmp(name, "highlightinventoryselection") == 0) + { + const char *slotIndex; + String_Parse(args, &slotIndex); + if (!slotIndex) + { + return qfalse; + } + + UI_HighLightInventorySelection(atoi(slotIndex)); + } + else if (Q_stricmp(name, "initinventoryselect") == 0) + { + UI_InitInventorySelect(); + } + else if (Q_stricmp(name, "updatefightingstyle") == 0) { UI_UpdateFightingStyle(); } @@ -5971,6 +6053,345 @@ static void UI_HighLightThrowSelection ( void ) item->window.background = uiInfo.litThrowableIcon; } +//. Find inventory allocation screen NEXT button and make active/inactive +static void UI_InventoryAllocBeginButton(qboolean activeFlag) +{ + menuDef_t *menu; + menu = Menu_GetFocused(); // Get current menu + + if (!menu) + { + return; + } + + // Find begin button + itemDef_t *item; + item = Menu_FindItemByName(menu, "nextbutton"); + + if (item) + { + // Make it active + if (activeFlag) + { + item->window.flags &= ~WINDOW_INACTIVE; + } + else + { + item->window.flags |= WINDOW_INACTIVE; + } + } +} + +// If we have both inventory items, turn on the begin mission button, +static void UI_InventorySelectionsComplete( void ) +{ + // We need two inventory items + if (( uiInfo.selectedInventory1 != NOWEAPON ) && + ( uiInfo.selectedInventory2 != NOWEAPON )) + { + UI_InventoryAllocBeginButton(qtrue); // Turn it on + } + else + { + UI_InventoryAllocBeginButton(qfalse); // Turn it off + } +} + +// Update the player weapons with the chosen weapon +static void UI_AddInventorySelection ( const int inventoryIndex, const int amount, const char *iconItemName,const char *litIconItemName, const char *hexBackground, const char *soundfile ) +{ + itemDef_s *item, *iconItem,*litIconItem; + menuDef_t *menu; + + menu = Menu_GetFocused(); // Get current menu + + if (!menu) + { + return; + } + + iconItem = (itemDef_s *) Menu_FindItemByName(menu, iconItemName ); + litIconItem = (itemDef_s *) Menu_FindItemByName(menu, litIconItemName ); + + const char *chosenItemName, *chosenButtonName; + + // has this weapon already been chosen? + if (inventoryIndex == uiInfo.selectedInventory1) + { + UI_RemoveInventorySelection ( 1 ); + return; + } + else if (inventoryIndex == uiInfo.selectedInventory2) + { + UI_RemoveInventorySelection ( 2 ); + return; + } + + // See if either slot is empty + if ( uiInfo.selectedInventory1 == NOWEAPON ) + { + chosenItemName = "choseninventory1_icon"; + chosenButtonName = "choseninventory1_button"; + uiInfo.selectedInventory1 = inventoryIndex; + + memcpy( uiInfo.selectedInventory1ItemName,hexBackground,sizeof(uiInfo.selectedInventory1ItemName)); + + //Save the lit and unlit icons for the selected weapon slot + uiInfo.litInventory1Icon = litIconItem->window.background; + uiInfo.unlitInventory1Icon = iconItem->window.background; + + uiInfo.inventory1ItemButton = uiInfo.runScriptItem; + uiInfo.inventory1ItemButton->descText = "@MENUS_CLICKREMOVE"; + } + else if ( uiInfo.selectedWeapon2 == NOWEAPON ) + { + chosenItemName = "choseninventory2_icon"; + chosenButtonName = "choseninventory2_button"; + uiInfo.selectedInventory2 = inventoryIndex; + + memcpy( uiInfo.selectedInventory2ItemName,hexBackground,sizeof(uiInfo.selectedInventory2ItemName)); + + //Save the lit and unlit icons for the selected weapon slot + uiInfo.litInventory2Icon = litIconItem->window.background; + uiInfo.unlitInventory2Icon = iconItem->window.background; + + uiInfo.inventory2ItemButton = uiInfo.runScriptItem; + uiInfo.inventory2ItemButton->descText = "@MENUS_CLICKREMOVE"; + } + else // Both slots are used, can't add it. + { + return; + } + + item = (itemDef_s *) Menu_FindItemByName(menu, chosenItemName ); + if ((item) && (iconItem)) + { + item->window.background = iconItem->window.background; + item->window.flags |= WINDOW_VISIBLE; + } + + // Turn on chosenweapon button so player can unchoose the weapon + item = (itemDef_s *) Menu_FindItemByName(menu, chosenButtonName ); + if (item) + { + item->window.background = iconItem->window.background; + item->window.flags |= WINDOW_VISIBLE; + } + + // Switch hex background to be 'on' + item = (itemDef_s *) Menu_FindItemByName(menu, hexBackground ); + if (item) + { + item->window.foreColor[0] = 0; + item->window.foreColor[1] = 1; + item->window.foreColor[2] = 0; + item->window.foreColor[3] = 1; + + } + + // Get player state + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + + // NOTE : this UIScript can now be run from outside the game, so don't + // return out here, just skip this part + if (cl) + { + // Add weapon + if (cl->gentity && cl->gentity->client) + { + playerState_t* pState = cl->gentity->client; + + if ((inventoryIndex>0) && (inventoryIndexinventory[ inventoryIndex ] = amount; + } + } + } + + if( soundfile ) + { + DC->startLocalSound(DC->registerSound(soundfile, qfalse), CHAN_LOCAL ); + } + + UI_InventorySelectionsComplete(); // Test to see if the mission begin button should turn on or off + + +} + + +// Update the player weapons with the chosen weapon +static void UI_RemoveInventorySelection ( const int inventorySelectionIndex ) +{ + itemDef_s *item; + menuDef_t *menu; + const char *chosenItemName, *chosenButtonName,*background; + int inventoryIndex; + + menu = Menu_GetFocused(); // Get current menu + + // Which item has it? + if ( inventorySelectionIndex == 1 ) + { + chosenItemName = "choseninventory1_icon"; + chosenButtonName = "choseninventory1_button"; + background = uiInfo.selectedInventory1ItemName; + inventoryIndex = uiInfo.selectedInventory1; + + if (uiInfo.inventory1ItemButton) + { + uiInfo.inventory1ItemButton->descText = "@MENUS_CLICKSELECT"; + uiInfo.inventory1ItemButton = NULL; + } + } + else if ( inventorySelectionIndex == 2 ) + { + chosenItemName = "choseninventory2_icon"; + chosenButtonName = "choseninventory2_button"; + background = uiInfo.selectedInventory2ItemName; + inventoryIndex = uiInfo.selectedInventory2; + + if (uiInfo.inventory2ItemButton) + { + uiInfo.inventory2ItemButton->descText = "@MENUS_CLICKSELECT"; + uiInfo.inventory2ItemButton = NULL; + } + } + else + { + return; + } + + // Reset background of upper icon + item = (itemDef_s *) Menu_FindItemByName( menu, background ); + if ( item ) + { + item->window.foreColor[0] = 0.0f; + item->window.foreColor[1] = 0.5f; + item->window.foreColor[2] = 0.0f; + item->window.foreColor[3] = 1.0f; + } + + // Hide it icon + item = (itemDef_s *) Menu_FindItemByName( menu, chosenItemName ); + if ( item ) + { + item->window.flags &= ~WINDOW_VISIBLE; + } + + // Hide button + item = (itemDef_s *) Menu_FindItemByName( menu, chosenButtonName ); + if ( item ) + { + item->window.flags &= ~WINDOW_VISIBLE; + } + + // Get player state + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + + // NOTE : this UIScript can now be run from outside the game, so don't + // return out here, just skip this part + if (cl) // No client, get out + { + + // Remove weapon + if (cl->gentity && cl->gentity->client) + { + playerState_t* pState = cl->gentity->client; + + if ((inventoryIndex>=0) && (inventoryIndexinventory[ inventoryIndex ] = 0; + } + } + + } + + // Now do a little clean up + if ( inventorySelectionIndex == 1 ) + { + uiInfo.selectedInventory1 = NOWEAPON; + memset(uiInfo.selectedInventory1ItemName,0,sizeof(uiInfo.selectedInventory1ItemName)); + } + else if ( inventorySelectionIndex == 2 ) + { + uiInfo.selectedInventory2 = NOWEAPON; + memset(uiInfo.selectedInventory2ItemName,0,sizeof(uiInfo.selectedInventory2ItemName)); + } + + DC->startLocalSound(DC->registerSound("sound/interface/weapon_deselect.mp3", qfalse), CHAN_LOCAL ); + + UI_InventorySelectionsComplete(); // Test to see if the mission begin button should turn on or off + + +} + +static void UI_NormalInventorySelection ( const int selectionslot ) +{ + itemDef_s *item; + menuDef_t *menu; + + menu = Menu_GetFocused(); // Get current menu + if (!menu) + { + return; + } + + if (selectionslot == 1) + { + item = (itemDef_s *) Menu_FindItemByName( menu, "choseninventory1_icon" ); + if (item) + { + item->window.background = uiInfo.unlitInventory1Icon; + } + } + + if (selectionslot == 2) + { + item = (itemDef_s *) Menu_FindItemByName( menu, "choseninventory2_icon" ); + if (item) + { + item->window.background = uiInfo.unlitInventory2Icon; + } + } +} + +static void UI_HighLightInventorySelection ( const int selectionslot ) +{ + itemDef_s *item; + menuDef_t *menu; + + menu = Menu_GetFocused(); // Get current menu + if (!menu) + { + return; + } + + if (selectionslot == 1) + { + item = (itemDef_s *) Menu_FindItemByName( menu, "choseninventory1_icon" ); + if (item) + { + item->window.background = uiInfo.litInventory1Icon; + } + } + + if (selectionslot == 2) + { + item = (itemDef_s *) Menu_FindItemByName( menu, "choseninventory2_icon" ); + if (item) + { + item->window.background = uiInfo.litInventory2Icon; + } + } +} + +static void UI_InitInventorySelect( void ) +{ + UI_InventoryAllocBeginButton(qfalse); + uiInfo.selectedInventory1 = NOWEAPON; + uiInfo.selectedInventory2 = NOWEAPON; +} + static void UI_GetSaberCvars ( void ) { Cvar_Set ( "ui_saber_type", Cvar_VariableString ( "g_saber_type" ) ); From 6b4abd2ace0e5c3aae692c627a856381a8a718d1 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Mon, 6 Jan 2014 17:10:42 +0000 Subject: [PATCH 002/445] [SP] Save games now have screenshots. Screenshots are put into saves/screenshots/savename.jpg Still need to do cleaning up and make them work in loading screen (currently only work in UI). --- code/client/cl_ui.cpp | 2 ++ code/client/client.h | 2 ++ code/rd-common/tr_public.h | 1 + code/rd-vanilla/tr_draw.cpp | 35 +++++++++++++++++------------------ code/rd-vanilla/tr_init.cpp | 1 + code/server/sv_savegame.cpp | 22 +++++++++++++++++++++- code/ui/ui_atoms.cpp | 2 +- code/ui/ui_main.cpp | 19 ++++++++++++++++++- code/ui/ui_public.h | 3 +++ 9 files changed, 66 insertions(+), 21 deletions(-) diff --git a/code/client/cl_ui.cpp b/code/client/cl_ui.cpp index 7a3d746e9f..aab37ea1a8 100644 --- a/code/client/cl_ui.cpp +++ b/code/client/cl_ui.cpp @@ -260,6 +260,8 @@ void CL_InitUI( void ) { uii.R_SetColor = re.SetColor; uii.R_DrawStretchPic = re.DrawStretchPic; uii.UpdateScreen = SCR_UpdateScreen; + + uii.PrecacheScreenshot = SCR_PrecacheScreenshot; uii.R_LerpTag = re.LerpTag; diff --git a/code/client/client.h b/code/client/client.h index f9e842120b..2a7958b1ed 100644 --- a/code/client/client.h +++ b/code/client/client.h @@ -374,6 +374,8 @@ void SCR_DrawSmallStringExt( int x, int y, const char *string, float *setColor, void SCR_DrawBigChar( int x, int y, int ch ); void SCR_DrawSmallChar( int x, int y, int ch ); +void SCR_PrecacheScreenshot(); + // // cl_cin.c // diff --git a/code/rd-common/tr_public.h b/code/rd-common/tr_public.h index 2b12c56cd2..6b7aba1ec1 100644 --- a/code/rd-common/tr_public.h +++ b/code/rd-common/tr_public.h @@ -256,6 +256,7 @@ typedef struct { void (*R_LoadDataImage)(const char *name, byte **pic, int *width, int *height); void (*R_InvertImage)(byte *data, int width, int height, int depth); int (*SavePNG)( const char *filename, byte *buf, size_t width, size_t height, int byteDepth ); + void (*SaveJPG)( const char * filename, int quality, int image_width, int image_height, byte *image_buffer, int padding ); void (*R_InitWorldEffects)(void); void (*R_CreateAutomapImage)( const char *name, const byte *pic, int width, int height, qboolean mipmap, qboolean allowPicmip, qboolean allowTC, qboolean glWrapClampMode ); diff --git a/code/rd-vanilla/tr_draw.cpp b/code/rd-vanilla/tr_draw.cpp index cf1b9aff6f..2796b17c90 100644 --- a/code/rd-vanilla/tr_draw.cpp +++ b/code/rd-vanilla/tr_draw.cpp @@ -197,50 +197,49 @@ void RE_GetScreenShot(byte *data, int w, int h) #else +extern byte *RB_ReadPixels(int x, int y, int width, int height, size_t *offset, int *padlen); void RE_GetScreenShot(byte *buffer, int w, int h) { byte *source; byte *src, *dst; + size_t offset = 0, memcount; + int padlen; + int x, y; int r, g, b; float xScale, yScale; int xx, yy; - qglFinish(); // try and fix broken Radeon cards (7500 & 8500) that don't read screen pixels properly - - source = (byte *)Z_Malloc(glConfig.vidWidth * glConfig.vidHeight * 3, TAG_TEMP_WORKSPACE, qfalse); - if(!source) - { - return; - } - qglReadPixels (0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_RGB, GL_UNSIGNED_BYTE, source ); + + source = RB_ReadPixels(0, 0, glConfig.vidWidth, glConfig.vidHeight, &offset, &padlen); + memcount = (glConfig.vidWidth * 3 + padlen) * glConfig.vidHeight; + + // gamma correct + if(glConfig.deviceSupportsGamma) + R_GammaCorrect(source + offset, memcount); - assert (w == h); - int count = 0; // resample from source - xScale = glConfig.vidWidth / (4.0 * w); - yScale = glConfig.vidHeight / (3.0 * w); - for ( y = 0 ; y < w ; y++ ) { + xScale = glConfig.vidWidth / (4.0*w); + yScale = glConfig.vidHeight / (3.0*h); + for ( y = 0 ; y < h ; y++ ) { for ( x = 0 ; x < w ; x++ ) { r = g = b = 0; for ( yy = 0 ; yy < 3 ; yy++ ) { for ( xx = 0 ; xx < 4 ; xx++ ) { - src = source + 3 * ( glConfig.vidWidth * (int)( (y*3+yy)*yScale ) + (int)( (x*4+xx)*xScale ) ); + src = source + offset + 3 * ( glConfig.vidWidth * (int)( (y*3+yy)*yScale ) + (int)( (x*4+xx)*xScale ) ); r += src[0]; g += src[1]; b += src[2]; } } - dst = buffer + 4 * ( y * w + x ); + dst = buffer + 3 * ( y * w + x ); dst[0] = r / 12; dst[1] = g / 12; dst[2] = b / 12; - count++; } } - assert(count == w * h); - Z_Free(source); + ri.Z_Free(source); } #endif diff --git a/code/rd-vanilla/tr_init.cpp b/code/rd-vanilla/tr_init.cpp index 15ae9729d0..75ef8dc67b 100644 --- a/code/rd-vanilla/tr_init.cpp +++ b/code/rd-vanilla/tr_init.cpp @@ -1783,6 +1783,7 @@ extern "C" Q_EXPORT refexport_t* QDECL GetRefAPI ( int apiVersion, refimport_t * re.R_LoadDataImage = R_LoadDataImage; re.R_InvertImage = R_InvertImage; re.SavePNG = RE_SavePNG; + re.SaveJPG = RE_SaveJPG; re.R_InitWorldEffects = R_InitWorldEffects; re.R_CreateAutomapImage = R_CreateAutomapImage; re.R_ClearStuffToStopGhoul2CrashingThings = R_ClearStuffToStopGhoul2CrashingThings; diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 36b2498270..fb7901c98c 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -1017,6 +1017,21 @@ qboolean SG_GameAllowedToSaveHere(qboolean inCamera) return ge->GameAllowedToSaveHere(); } +void SG_WriteScreenshotNew(const char *psPathlessBaseName) +{ + char checkname[MAX_OSPATH]; + byte *pbRawScreenshot = NULL; + qboolean isValid; + + pbRawScreenshot = SCR_GetScreenshot(&isValid); + Com_sprintf( checkname, sizeof(checkname), "saves/screenshots/%s.jpg", psPathlessBaseName ); + + if (isValid) + { + re.SaveJPG(checkname, JPEG_IMAGE_QUALITY, SG_SCR_WIDTH, SG_SCR_HEIGHT, pbRawScreenshot, 0); + } +} + qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) { if (!qbAutosave && !SG_GameAllowedToSaveHere(qfalse)) //full check @@ -1078,7 +1093,12 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) } SG_Move( "current", psPathlessBaseName ); - + + if ( !qbAutosave ) + { + //do screenshot stuff here + SG_WriteScreenshotNew(psPathlessBaseName); + } sv_testsave->integer = iPrevTestSave; return qtrue; diff --git a/code/ui/ui_atoms.cpp b/code/ui/ui_atoms.cpp index d93d40a9c6..d8a42f9c33 100644 --- a/code/ui/ui_atoms.cpp +++ b/code/ui/ui_atoms.cpp @@ -404,7 +404,7 @@ UI_SaveMenu_f */ static void UI_SaveMenu_f( void ) { -// ui.PrecacheScreenshot(); + ui.PrecacheScreenshot(); trap_Key_SetCatcher( KEYCATCH_UI ); Menus_ActivateByName("ingamesaveMenu"); diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index ec4caa0c8f..5a81e0d0a9 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -3755,7 +3755,22 @@ static void UI_OwnerDraw(float x, float y, float w, float h, float text_x, float case UI_ALLMAPS_SELECTION://saved game thumbnail int levelshot; - levelshot = ui.R_RegisterShaderNoMip( va( "levelshots/%s", s_savedata[s_savegame.currentLine].currentSaveFileMap ) ); + levelshot = 0; + if (s_savedata[s_savegame.currentLine].currentSaveFileName) + { + //To avoid error messages when these screenshots are missing + fileHandle_t fp; + ui.FS_FOpenFile(va( "saves/screenshots/%s.jpg", s_savedata[s_savegame.currentLine].currentSaveFileName ), &fp, FS_READ); + if (fp) + { + ui.FS_FCloseFile(fp); + levelshot = ui.R_RegisterShaderNoMip( va( "saves/screenshots/%s", s_savedata[s_savegame.currentLine].currentSaveFileName ) ); + } + } + if (!levelshot) + { + levelshot = ui.R_RegisterShaderNoMip( va( "levelshots/%s", s_savedata[s_savegame.currentLine].currentSaveFileMap ) ); + } if (levelshot) { ui.R_DrawStretchPic( x, y, w, h, 0, 0, 1, 1, levelshot ); @@ -4021,6 +4036,8 @@ UI_InGameMenu */ void UI_InGameMenu(const char*menuID) { + ui.PrecacheScreenshot(); + Menus_CloseByName("mainhud"); if (menuID) diff --git a/code/ui/ui_public.h b/code/ui/ui_public.h index eb4a3de87a..4473c7300d 100644 --- a/code/ui/ui_public.h +++ b/code/ui/ui_public.h @@ -91,6 +91,9 @@ typedef struct { // force a screen update, only used during gamestate load void (*UpdateScreen)( void ); + + // stuff for savegame screenshots... + void (*PrecacheScreenshot)( void ); //========= model collision =============== From 945b060378cfa0bb99e807105717ec464c9c24cc Mon Sep 17 00:00:00 2001 From: dusty22 Date: Tue, 29 Apr 2014 16:39:06 -0400 Subject: [PATCH 003/445] Assassin droids can fire with shields up now too? --- code/game/AI_AssassinDroid.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/AI_AssassinDroid.cpp b/code/game/AI_AssassinDroid.cpp index 38703a9f32..7d19a88992 100644 --- a/code/game/AI_AssassinDroid.cpp +++ b/code/game/AI_AssassinDroid.cpp @@ -168,7 +168,7 @@ void BubbleShield_Update() // If We Have Enough Armor And Are Not Shooting Right Now, Kick The Shield On //---------------------------------------------------------------------------- - if (NPC->client->ps.stats[STAT_ARMOR]>100 && TIMER_Done(NPC, "ShieldsDown")) + if (NPC->client->ps.stats[STAT_ARMOR]>100 /*&& TIMER_Done(NPC, "ShieldsDown")*/) //now they can shoot while shield is up? - Dusty { // Check On Timers To Raise And Lower Shields //-------------------------------------------- From 78ffb9420a00187896ca8d922100e1b23e7ce7be Mon Sep 17 00:00:00 2001 From: Dusty Date: Mon, 18 Aug 2014 14:15:05 -0400 Subject: [PATCH 004/445] assassin droids; saber system - assassin droids can fire with shields up now - fixed causing assassin droids to never lower shields - saber system mods work now toggleable by g_saberNewCombat - g_saberLocksEnabled now allows you to disable saber locks (more for testing purposes) - bugs: saber locks are very infrequent, special attacks don't work correctly in the new system yet --- code/game/AI_AssassinDroid.cpp | 2 +- code/game/NPC_combat.cpp | 5 +- code/game/bg_panimate.cpp | 18 +- code/game/g_main.cpp | 11 +- code/game/wp_saber.cpp | 6742 +++++++++++++++++--------------- 5 files changed, 3700 insertions(+), 3078 deletions(-) diff --git a/code/game/AI_AssassinDroid.cpp b/code/game/AI_AssassinDroid.cpp index 7d19a88992..069690e0f2 100644 --- a/code/game/AI_AssassinDroid.cpp +++ b/code/game/AI_AssassinDroid.cpp @@ -168,7 +168,7 @@ void BubbleShield_Update() // If We Have Enough Armor And Are Not Shooting Right Now, Kick The Shield On //---------------------------------------------------------------------------- - if (NPC->client->ps.stats[STAT_ARMOR]>100 /*&& TIMER_Done(NPC, "ShieldsDown")*/) //now they can shoot while shield is up? - Dusty + if (NPC->client->ps.stats[STAT_ARMOR]>100 && TIMER_Done(NPC, "ShieldsDown")) //now they can shoot while shield is up, had to edit npc_combat or something - Dusty { // Check On Timers To Raise And Lower Shields //-------------------------------------------- diff --git a/code/game/NPC_combat.cpp b/code/game/NPC_combat.cpp index 3e954f97d7..b9ddbde2f9 100644 --- a/code/game/NPC_combat.cpp +++ b/code/game/NPC_combat.cpp @@ -1186,10 +1186,11 @@ void WeaponThink( qboolean inCombat ) } // can't shoot while shield is up - if (NPC->flags&FL_SHIELDED && NPC->client->NPC_class==CLASS_ASSASSIN_DROID) + /*if (NPC->flags&FL_SHIELDED && NPC->client->NPC_class==CLASS_ASSASSIN_DROID) { return; - } + }*/ + //now we can? - Dusty // Can't Fire While Cloaked if (NPC->client && diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index 41b0d561f0..fc73dac5c1 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -563,15 +563,15 @@ int PM_PowerLevelForSaberAnim( playerState_t *ps, int saberNum ) } if ( anim >= BOTH_A2_T__B_ && anim <= BOTH_D2_B____ ) { - return FORCE_LEVEL_2; + return FORCE_LEVEL_3; } if ( anim >= BOTH_A3_T__B_ && anim <= BOTH_D3_B____ ) { - return FORCE_LEVEL_3; + return FORCE_LEVEL_5; } if ( anim >= BOTH_A4_T__B_ && anim <= BOTH_D4_B____ ) {//desann - return FORCE_LEVEL_4; + return FORCE_LEVEL_5; } if ( anim >= BOTH_A5_T__B_ && anim <= BOTH_D5_B____ ) {//tavion @@ -583,7 +583,7 @@ int PM_PowerLevelForSaberAnim( playerState_t *ps, int saberNum ) } if ( anim >= BOTH_A7_T__B_ && anim <= BOTH_D7_B____ ) {//staff - return FORCE_LEVEL_2; + return FORCE_LEVEL_4; } if ( ( anim >= BOTH_P1_S1_T_ && anim <= BOTH_P1_S1_BR ) || ( anim >= BOTH_P6_S6_T_ && anim <= BOTH_P6_S6_BR ) @@ -593,12 +593,16 @@ int PM_PowerLevelForSaberAnim( playerState_t *ps, int saberNum ) { case SS_STRONG: case SS_DESANN: - return FORCE_LEVEL_3; + return FORCE_LEVEL_5; break; - case SS_TAVION: case SS_STAFF: - case SS_DUAL: + return FORCE_LEVEL_4; + break; case SS_MEDIUM: + return FORCE_LEVEL_3; + break; + case SS_DUAL: + case SS_TAVION: return FORCE_LEVEL_2; break; case SS_FAST: diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 8623a7ef98..5c38fb3bef 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -197,6 +197,12 @@ cvar_t *g_saber_color; cvar_t *g_saber2_color; cvar_t *g_saberDarkSideSaberColor; +//new cvars - Dusty +cvar_t *g_saberNewCombat; +cvar_t *g_char_forcepoints; +cvar_t *g_saberLocksEnabled; + + // kef -- used with DebugTraceForNPC cvar_t *g_npcdebug; @@ -652,7 +658,6 @@ void G_InitCvars( void ) { g_debugMelee = gi.cvar( "g_debugMelee", "0", CVAR_CHEAT );//just for debugging/development, test kicks and grabs g_saberRestrictForce = gi.cvar( "g_saberRestrictForce", "0", CVAR_ARCHIVE );//restricts certain force powers when using a 2-handed saber or 2 sabers g_saberPickuppableDroppedSabers = gi.cvar( "g_saberPickuppableDroppedSabers", "0", CVAR_CHEAT );//lets you pick up sabers that are dropped - g_AIsurrender = gi.cvar( "g_AIsurrender", "0", CVAR_CHEAT ); g_numEntities = gi.cvar( "g_numEntities", "0", 0 ); @@ -685,6 +690,10 @@ void G_InitCvars( void ) { gi.cvar( "g_clearstats", "1", CVAR_ROM|CVAR_NORESTART); + //new cvars yay - Dusty + g_saberNewCombat = gi.cvar("g_saberNewCombat", "1", CVAR_ARCHIVE | CVAR_CHEAT); + g_saberLocksEnabled = gi.cvar("g_saberLocksEnabled", "1", CVAR_ARCHIVE | CVAR_CHEAT); + g_char_forcepoints = gi.cvar("g_char_forcepoints", "100", CVAR_ARCHIVE | CVAR_CHEAT | CVAR_SAVEGAME ); } /* ============ diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index f450034a21..938ea5e8eb 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -159,11 +159,17 @@ extern cvar_t *g_saberAutoBlocking; extern cvar_t *g_saberRealisticCombat; extern cvar_t *g_saberDamageCapping; extern cvar_t *g_saberNewControlScheme; +extern cvar_t *g_saberNewCombat; +extern cvar_t *g_saberLocksEnabled; //Dusty, new cvar, hopefully I declared it in g_main.cpp correctly extern int g_crosshairEntNum; qboolean g_saberNoEffects = qfalse; qboolean g_noClashFlare = qfalse; int g_saberFlashTime = 0; +int hitOwnerBreakLimit; +int hitOwnerRecoveryTime; //how long left to recover a defense point +int hitOwnerRecoveryInterval = 1500; //interval at which defense points are recovered, 1.5 seconds +int hitOwnerBreakCounter; //keeping track of how many strong attacks the defender blocks in a short time period vec3_t g_saberFlashPos = {0,0,0}; int forcePowerDarkLight[NUM_FORCE_POWERS] = //0 == neutral @@ -4569,31 +4575,108 @@ void WP_SaberDamageTrace( gentity_t *ent, int saberNum, int bladeNum ) // we animate so much faster that the arc is pretty much flat... int entPowerLevel = 0; - if ( ent->client->NPC_class == CLASS_SABER_DROID ) + +if ( g_saberNewCombat->integer ) //new code start +{ + int stylePowerModifier = 0; + int stylePowerLevel = PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum); + + /*Power level base numbers instead of being 1,2, and 3 now are doubled. And Saber Offense is the main determinant. + Saber Offense - + 1: entPowerLevel = 2 + 2: entPowerLevel = 4 + 3: entPowerLevel = 6 + + So +2 is like one Offense level higher. +1 is like half of a level. Strong style gives a +2 bonus as can be seen below. + + Then the style power modifier based on which saber style is used, enhancement force powers, breakParrybonuses, and whether or not you are in a transition as opposed to a slash, or a special attack should modify the power (not in that order, I have no idea what order haha) - Dusty*/ + + + switch (stylePowerLevel) // check what the saber style is and set power modifier accordingly + { + case 1: + stylePowerModifier = -2; + break; + case 2: + stylePowerModifier = -1; + break; + case 3: + stylePowerModifier = 0; + break; + case 4: + stylePowerModifier = 1; + break; + case 5: + stylePowerModifier = 2; + break; + } + + if (PM_SaberInTransitionAny(ent->client->ps.saberMove)) // if in a transition that still counts as attacking for stronger styles, but this is so you're not as strong quite as a regular slash + { + stylePowerLevel -= 1; + } + if (ent->client->NPC_class == CLASS_SABER_DROID) //FIXME D: saber droids do their own thing... they need to be incorporated into this system I suppose? + { + entPowerLevel = SaberDroid_PowerLevelForSaberAnim(ent); + } + else + { + entPowerLevel = (2 * ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE]) + stylePowerModifier; + } + + if (PM_SaberInSpecialAttack(ent->client->ps.saberMove)) //now for special moves + { + entPowerLevel += 2; + } + //now for modifiers based on any enhancement powers active + if (!ent->s.number && (ent->client->ps.forcePowersActive&(1 << FP_SPEED))) + { + entPowerLevel += 1 * ent->client->ps.forcePowerLevel[FP_SPEED]; + } + + if (entPowerLevel) //this is saying, if we HAVE a power level, i.e. we are slashing not just idling then... + { + if (ent->client->ps.forceRageRecoveryTime > level.time) + { + entPowerLevel -= 2; + } + else if (ent->client->ps.forcePowersActive & (1 << FP_RAGE)) + { + + entPowerLevel += ((ent->client->ps.forcePowerLevel[FP_RAGE] * 1) + 1); + + } + } +} //new code end +else //Dusty, old code start. +{ + if (ent->client->NPC_class == CLASS_SABER_DROID) { - entPowerLevel = SaberDroid_PowerLevelForSaberAnim( ent ); + entPowerLevel = SaberDroid_PowerLevelForSaberAnim(ent); } - else if ( !ent->s.number && (ent->client->ps.forcePowersActive&(1<s.number && (ent->client->ps.forcePowersActive&(1 << FP_SPEED))) { entPowerLevel = FORCE_LEVEL_3; } else { - entPowerLevel = PM_PowerLevelForSaberAnim( &ent->client->ps, saberNum ); + entPowerLevel = PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum); } - if ( entPowerLevel ) + if (entPowerLevel) { - if ( ent->client->ps.forceRageRecoveryTime > level.time ) + if (ent->client->ps.forceRageRecoveryTime > level.time) { entPowerLevel = FORCE_LEVEL_1; } - else if ( ent->client->ps.forcePowersActive & (1 << FP_RAGE) ) + else if (ent->client->ps.forcePowersActive & (1 << FP_RAGE)) { entPowerLevel += ent->client->ps.forcePowerLevel[FP_RAGE]; } - } + } +} //Dusty, old code end. + if ( ent->client->ps.saberInFlight ) {//flying sabers are much more deadly //unless you're dead @@ -5075,8 +5158,23 @@ void WP_SaberDamageTrace( gentity_t *ent, int saberNum, int bladeNum ) gentity_t *hitEnt = &g_entities[saberHitEntity]; gentity_t *hitOwner = NULL; - int hitOwnerPowerLevel = FORCE_LEVEL_0; + int hitOwnerPowerLevel = FORCE_LEVEL_0; + +if ( g_saberNewCombat->integer ) //Dusty, new code start. +{ + if ( hitEnt ) + { + hitOwner = hitEnt->owner; + } + if ( hitOwner && hitOwner->client ) + { + hitOwnerPowerLevel = 2 * hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; + hitOwnerBreakLimit = hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; + } +} +else +{ if ( hitEnt ) { hitOwner = hitEnt->owner; @@ -5084,7 +5182,11 @@ void WP_SaberDamageTrace( gentity_t *ent, int saberNum, int bladeNum ) if ( hitOwner && hitOwner->client ) { hitOwnerPowerLevel = PM_PowerLevelForSaberAnim( &hitOwner->client->ps ); - /* + } +} + //Dusty, code end. + + /* //old crud here if ( entPowerLevel >= FORCE_LEVEL_3 && PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) ) {//a special "unblockable" attack @@ -5096,7 +5198,7 @@ void WP_SaberDamageTrace( gentity_t *ent, int saberNum, int bladeNum ) } } */ - } + //FIXME: check for certain anims, facing, etc, to make them lock into a sabers-locked pose //SEF_LOCKED @@ -5109,513 +5211,1001 @@ void WP_SaberDamageTrace( gentity_t *ent, int saberNum, int bladeNum ) inFlightSaberBlocked = qtrue; } - //FIXME: based on strength, position and angle of attack & defense, decide if: - // defender and attacker lock sabers - // *defender's parry should hold and attack bounces (or deflects, based on angle of sabers) - // *defender's parry is somewhat broken and both bounce (or deflect) - // *defender's parry is broken and they bounce while attacker's attack deflects or carries through (especially if they're dead) - // defender is knocked down and attack goes through - - //Check deflections and broken parries - if ( hitOwner && hitOwner->health > 0 && ent->health > 0 //both are alive - && !inFlightSaberBlocked && hitOwner->client && !hitOwner->client->ps.saberInFlight && !ent->client->ps.saberInFlight//both have sabers in-hand - && ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN - && ent->client->ps.saberLockTime < level.time - && hitOwner->client->ps.saberLockTime < level.time ) - {//2 in-hand sabers hit - //FIXME: defender should not parry or block at all if not in a saber anim... like, if in a roll or knockdown... - if ( baseDamage ) - {//there is damage involved, not just effects - qboolean entAttacking = qfalse; - qboolean hitOwnerAttacking = qfalse; - qboolean entDefending = qfalse; - qboolean hitOwnerDefending = qfalse; - qboolean forceLock = qfalse; - - if ( (ent->client->NPC_class == CLASS_KYLE && (ent->spawnflags&1) && hitOwner->s.number < MAX_CLIENTS ) - || (hitOwner->client->NPC_class == CLASS_KYLE && (hitOwner->spawnflags&1) && ent->s.number < MAX_CLIENTS ) ) - {//Player vs. Kyle Boss == lots of saberlocks - if ( !Q_irand( 0, 2 ) ) - { - forceLock = qtrue; + if ( g_saberNewCombat->integer ) + { //new code start + + //hitOwner BreakCounter, BreakLimit, RecoveryInterval, RecoveryTime + //how many strong attacks (where saber offense + saber style modifier total power is greater than defender's defense strength) can be deflected before defender gets tired and his defense breaks, saber defense 1 is 1 hit, 2 is 2 hits, etc. + + //FIXME: based on strength, position and angle of attack & defense, decide if: + // defender and attacker lock sabers + // *defender's parry should hold and attack bounces (or deflects, based on angle of sabers) + // *defender's parry is somewhat broken and both bounce (or deflect) + // *defender's parry is broken and they bounce while attacker's attack deflects or carries through (especially if they're dead) + // defender is knocked down and attack goes through + + //Check deflections and broken parries + if (hitOwner && hitOwner->health > 0 && ent->health > 0 //both are alive + && !inFlightSaberBlocked && hitOwner->client && !hitOwner->client->ps.saberInFlight && !ent->client->ps.saberInFlight//both have sabers in-hand + && ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN + && ent->client->ps.saberLockTime < level.time + && hitOwner->client->ps.saberLockTime < level.time) + {//2 in-hand sabers hit + //FIXME: defender should not parry or block at all if not in a saber anim... like, if in a roll or knockdown... + if (baseDamage) + {//there is damage involved, not just effects + qboolean entAttacking = qfalse; + qboolean hitOwnerAttacking = qfalse; + qboolean entDefending = qfalse; + qboolean hitOwnerDefending = qfalse; + qboolean forceLock = qfalse; + + if ((ent->client->NPC_class == CLASS_KYLE && (ent->spawnflags & 1) && hitOwner->s.number < MAX_CLIENTS) + || (hitOwner->client->NPC_class == CLASS_KYLE && (hitOwner->spawnflags & 1) && ent->s.number < MAX_CLIENTS)) + {//Player vs. Kyle Boss == lots of saberlocks + if (!Q_irand(0, 2)) + { + forceLock = qtrue; + } } - } - - if ( PM_SaberInAttack( ent->client->ps.saberMove ) || PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) ) - { - entAttacking = qtrue; - } - else if ( entPowerLevel > FORCE_LEVEL_2 ) - {//stronger styles count as attacking even if in a transition - if ( PM_SaberInTransitionAny( ent->client->ps.saberMove ) ) + + if (PM_SaberInAttack(ent->client->ps.saberMove) || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) { entAttacking = qtrue; } - } - if ( PM_SaberInParry( ent->client->ps.saberMove ) - || ent->client->ps.saberMove == LS_READY ) - { - entDefending = qtrue; - } + else if (PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) > FORCE_LEVEL_3) + {//now it checks specifically for style, and only strong, staff, and desann styles get this, before it only looked at ent's strength + if (PM_SaberInTransitionAny(ent->client->ps.saberMove)) + { + entAttacking = qtrue; + } + } + if (PM_SaberInParry(ent->client->ps.saberMove) + || ent->client->ps.saberMove == LS_READY) + { + entDefending = qtrue; + } - if ( ent->client->ps.torsoAnim == BOTH_A1_SPECIAL - || ent->client->ps.torsoAnim == BOTH_A2_SPECIAL - || ent->client->ps.torsoAnim == BOTH_A3_SPECIAL ) - {//parry/block/break-parry bonus for single-style kata moves - entPowerLevel++; - } - if ( entAttacking ) - {//add twoHanded bonus and breakParryBonus to entPowerLevel here - //This makes staff too powerful - if ( (ent->client->ps.saber[saberNum].saberFlags&SFL_TWO_HANDED) ) + if (ent->client->ps.torsoAnim == BOTH_A1_SPECIAL + || ent->client->ps.torsoAnim == BOTH_A2_SPECIAL + || ent->client->ps.torsoAnim == BOTH_A3_SPECIAL) + {//parry/block/break-parry bonus for single-style kata moves + entPowerLevel += 2; + } + if (entAttacking) //I'm removing all two-handed power bonuses, now it's purely for force power stuff - Dusty + {//add twoHanded bonus and breakParryBonus to entPowerLevel here + //This makes staff too powerful + /*if ((ent->client->ps.saber[saberNum].saberFlags&SFL_TWO_HANDED)) + { + entPowerLevel++; + }*/ + //FIXME: what if dualSabers && both sabers are hitting at same time? + if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum)) + { + entPowerLevel += ent->client->ps.saber[saberNum].breakParryBonus; + } + else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum)) + { + entPowerLevel += ent->client->ps.saber[saberNum].breakParryBonus2; + } + } + else if (entDefending) + {//add twoHanded bonus and dualSaber bonus and parryBonus to entPowerLevel here + /*if ((ent->client->ps.saber[saberNum].saberFlags&SFL_TWO_HANDED) + || (ent->client->ps.dualSabers && ent->client->ps.saber[1].Active())) + { + entPowerLevel++; + }*/ + //FIXME: what about second saber if dualSabers? + entPowerLevel += ent->client->ps.saber[saberNum].parryBonus; + } + + if (PM_SaberInAttack(hitOwner->client->ps.saberMove) || PM_SaberInSpecialAttack(hitOwner->client->ps.torsoAnim)) { - entPowerLevel++; + hitOwnerAttacking = qtrue; + } + else if (hitOwnerPowerLevel > FORCE_LEVEL_2) + {//stronger styles count as attacking even if in a transition + if (PM_SaberInTransitionAny(hitOwner->client->ps.saberMove)) + { + hitOwnerAttacking = qtrue; + } } - //FIXME: what if dualSabers && both sabers are hitting at same time? - if ( !WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) ) + if (PM_SaberInParry(hitOwner->client->ps.saberMove) + || hitOwner->client->ps.saberMove == LS_READY) { - entPowerLevel += ent->client->ps.saber[saberNum].breakParryBonus; + hitOwnerDefending = qtrue; + } + + if (hitOwner->client->ps.torsoAnim == BOTH_A1_SPECIAL + || hitOwner->client->ps.torsoAnim == BOTH_A2_SPECIAL + || hitOwner->client->ps.torsoAnim == BOTH_A3_SPECIAL) + {//parry/block/break-parry bonus for single-style kata moves + hitOwnerPowerLevel += 2; } - else if ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) ) + if (hitOwnerAttacking) + {//add twoHanded bonus and breakParryBonus to entPowerLevel here + /*if ((hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED)) + { + hitOwnerPowerLevel++; + }*/ + hitOwnerPowerLevel += hitOwner->client->ps.saber[0].breakParryBonus; + if (hitOwner->client->ps.dualSabers && Q_irand(0, 1)) + {//FIXME: assumes both sabers are hitting at same time...? + //what the heck is this extra 1 for?! - Dusty + hitOwnerPowerLevel += 1 + hitOwner->client->ps.saber[1].breakParryBonus; + } + } + else if (hitOwnerDefending) + {//add twoHanded bonus and dualSaber bonus and parryBonus to entPowerLevel here + /*if ((hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED) + || (hitOwner->client->ps.dualSabers && hitOwner->client->ps.saber[1].Active())) + { + hitOwnerPowerLevel++; + }*/ + hitOwnerPowerLevel += hitOwner->client->ps.saber[0].parryBonus; + if (hitOwner->client->ps.dualSabers && Q_irand(0, 1)) + {//FIXME: assumes both sabers are defending at same time...? + //what the heck is this extra 1 for?! - Dusty + hitOwnerPowerLevel += 1 + hitOwner->client->ps.saber[1].parryBonus; + } + } + + if (PM_SuperBreakLoseAnim(ent->client->ps.torsoAnim) + || PM_SuperBreakWinAnim(ent->client->ps.torsoAnim) + || PM_SuperBreakLoseAnim(hitOwner->client->ps.torsoAnim) + || PM_SuperBreakWinAnim(hitOwner->client->ps.torsoAnim)) + {//don't mess with this + collisionResolved = qtrue; + } + else if ( g_saberLocksEnabled->integer + && entAttacking + && hitOwnerAttacking + && !Q_irand(0, g_saberLockRandomNess->integer) + && (g_debugSaberLock->integer || forceLock + || entPowerLevel == hitOwnerPowerLevel + || (entPowerLevel > FORCE_LEVEL_2 && hitOwnerPowerLevel > FORCE_LEVEL_2) + || (entPowerLevel < FORCE_LEVEL_3 && hitOwnerPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && Q_irand(0, 3)) + || (entPowerLevel < FORCE_LEVEL_2 && hitOwnerPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && Q_irand(0, 2)) + || (hitOwnerPowerLevel < FORCE_LEVEL_3 && entPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && !Q_irand(0, 1)) + || (hitOwnerPowerLevel < FORCE_LEVEL_2 && entPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && !Q_irand(0, 1))) + && WP_SabersCheckLock(ent, hitOwner)) { - entPowerLevel += ent->client->ps.saber[saberNum].breakParryBonus2; + collisionResolved = qtrue; } - } - else if ( entDefending ) - {//add twoHanded bonus and dualSaber bonus and parryBonus to entPowerLevel here - if ( (ent->client->ps.saber[saberNum].saberFlags&SFL_TWO_HANDED) - || (ent->client->ps.dualSabers && ent->client->ps.saber[1].Active()) ) + else if ( g_saberLocksEnabled->integer + && hitOwnerAttacking + && entDefending + && !Q_irand(0, g_saberLockRandomNess->integer * 3) + && (g_debugSaberLock->integer || forceLock || + ((ent->client->ps.saberMove != LS_READY || (hitOwnerPowerLevel - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand(-6, 0)) + && ((hitOwnerPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) || + (hitOwnerPowerLevel < FORCE_LEVEL_2 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) || + (hitOwnerPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (hitOwnerPowerLevel - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) + && WP_SabersCheckLock(hitOwner, ent)) { - entPowerLevel++; + collisionResolved = qtrue; + } + else if (entAttacking && hitOwnerDefending) + {//I'm attacking hit, they're parrying + qboolean activeDefense = (hitOwner->s.number || g_saberAutoBlocking->integer || hitOwner->client->ps.saberBlockingTime > level.time); + if ( g_saberLocksEnabled->integer + && !Q_irand(0, g_saberLockRandomNess->integer * 3) + && activeDefense + && (g_debugSaberLock->integer || forceLock || + ((hitOwner->client->ps.saberMove != LS_READY || (entPowerLevel - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand(-6, 0)) + && ((entPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) + || (entPowerLevel < FORCE_LEVEL_2 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) + || (entPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (entPowerLevel - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) + && WP_SabersCheckLock(ent, hitOwner)) + { + collisionResolved = qtrue; + } + else if (saberHitFraction < 1.0f) + {//an actual collision + if ( (hitOwnerBreakCounter < hitOwnerBreakLimit) && activeDefense) + {//tired defenders cannot deflect + //based on angle of attack & angle of defensive saber, see if I should deflect off in another dir rather than bounce back + deflected = WP_GetSaberDeflectionAngle(ent, hitOwner); + //just so Jedi knows that he was blocked + ent->client->ps.saberEventFlags |= SEF_BLOCKED; + } + if (entPowerLevel > hitOwnerPowerLevel) + { //if the attack was strong add to the stagger/break counter here + hitOwnerBreakCounter += (entPowerLevel - hitOwnerPowerLevel); + hitOwnerRecoveryTime = level.time + hitOwnerRecoveryInterval; + } + //base parry breaks on animation (saber attack level), not FP_SABER_OFFENSE + if (entPowerLevel < hitOwnerPowerLevel + //&& ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] < FORCE_LEVEL_3//if you have high saber offense, you cannot have your attack knocked away, regardless of what style you're using? + //&& hitOwner->client->ps.saberAnimLevel != FORCE_LEVEL_5 + && activeDefense + && (hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] >= FORCE_LEVEL_3 || (hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]>FORCE_LEVEL_1&&Q_irand(0, 1)))) // 50% chance for knockaway with saber defense 2 + {//knockaways can make fast-attacker go into a broken parry anim if the ent is using fast or med (but not Tavion) + //make me parry + WP_SaberParry(hitOwner, ent, saberNum, bladeNum); + //turn the parry into a knockaway + hitOwner->client->ps.saberBounceMove = PM_KnockawayForParry(hitOwner->client->ps.saberBlocked); + //make them go into a broken parry + ent->client->ps.saberBounceMove = PM_BrokenParryForAttack(ent->client->ps.saberMove); + ent->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; + if (saberNum == 0) + {//FIXME: can only lose right-hand saber for now + if (!(ent->client->ps.saber[saberNum].saberFlags&SFL_NOT_DISARMABLE) + && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] < FORCE_LEVEL_2 + //^changed DEFENSE to OFFENSE + //&& (ent->s.number||g_saberRealisticCombat->integer) + && Q_irand(0, hitOwner->client->ps.SaberDisarmBonus(0)) > 0 + && (hitOwner->s.number || g_saberAutoBlocking->integer || !Q_irand(0, 2)))//if player defending and autoblocking is on, this is less likely to happen, so don't do the random check + {//knocked the saber right out of his hand! (never happens to player) + //Get a good velocity to send the saber in based on my parry move + vec3_t throwDir; + if (!PM_VelocityForBlockedMove(&hitOwner->client->ps, throwDir)) + { + PM_VelocityForSaberMove(&ent->client->ps, throwDir); + } + WP_SaberLose(ent, throwDir); + } + } + //just so Jedi knows that he was blocked + ent->client->ps.saberEventFlags |= SEF_BLOCKED; +#ifndef FINAL_BUILD + if (d_saberCombat->integer) + { + gi.Printf(S_COLOR_RED"%s knockaway %s's attack, new move = %s, anim = %s\n", hitOwner->NPC_type, ent->NPC_type, saberMoveData[ent->client->ps.saberBounceMove].name, animTable[saberMoveData[ent->client->ps.saberBounceMove].animToUse].name); + } +#endif + } + else if (!activeDefense//they're not defending i.e. not holding +block with auto-blocking turned on? + || ( hitOwnerBreakCounter > hitOwnerBreakLimit //too tired to defend strong attacks + && hitOwnerPowerLevel < entPowerLevel))//they are defending, but their defense strength is lower than my attack... + /*|| (!deflected && Q_irand(0, PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]PM_PowerLevelForSaberAnim( &hitOwner->client->ps )) > 0))*/ + //^um what does that do anyway? Just add randomness? + {//broke their parry altogether + if (ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] >= 3) + {//saber offense 3 (and up?) gets to continue completely uninterrupted + ent->client->ps.saberEventFlags &= ~SEF_BLOCKED; + ent->client->ps.saberBounceMove = LS_NONE; + brokenParry = qtrue; + } + //do some time-consuming saber-knocked-aside broken parry anim + hitOwner->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; + hitOwner->client->ps.saberBounceMove = LS_NONE; + //FIXME: for now, you always disarm the right-hand saber + if (!(hitOwner->client->ps.saber[0].saberFlags&SFL_NOT_DISARMABLE) + && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] < FORCE_LEVEL_2 + //&& (ent->s.number||g_saberRealisticCombat->integer) + && Q_irand(0, 2 - ent->client->ps.SaberDisarmBonus(bladeNum)) <= 0) + {//knocked the saber right out of his hand! + //get the right velocity for my attack direction + vec3_t throwDir; + PM_VelocityForSaberMove(&ent->client->ps, throwDir); + WP_SaberLose(hitOwner, throwDir); + if ((ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0, 3)) + || (ent->client->ps.saberAnimLevel == SS_DESANN&&!Q_irand(0, 1))) + {// a strong attack + if (WP_BrokenParryKnockDown(hitOwner)) + { + hitOwner->client->ps.saberBlocked = BLOCKED_NONE; + hitOwner->client->ps.saberBounceMove = LS_NONE; + } + } + } + else + { + if ((ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0, 5)) + || (ent->client->ps.saberAnimLevel == SS_DESANN&&!Q_irand(0, 3))) + {// a strong attack + if (WP_BrokenParryKnockDown(hitOwner)) + { + hitOwner->client->ps.saberBlocked = BLOCKED_NONE; + hitOwner->client->ps.saberBounceMove = LS_NONE; + } + } + } +#ifndef FINAL_BUILD + if (d_saberCombat->integer) + { + if (ent->client->ps.saberEventFlags&SEF_BLOCKED) + { + gi.Printf(S_COLOR_RED"%s parry broken (bounce/deflect)!\n", hitOwner->targetname); + } + else + { + gi.Printf(S_COLOR_RED"%s parry broken (follow-through)!\n", hitOwner->targetname); + } + } +#endif + } + else + {//just a parry, possibly the hitOwner can knockaway the ent + WP_SaberParry(hitOwner, ent, saberNum, bladeNum); + if (PM_SaberInBounce(ent->client->ps.saberMove) //FIXME: saberMove not set until pmove! + && activeDefense + && hitOwner->client->ps.saberAnimLevel != SS_FAST //&& hitOwner->client->ps.saberAnimLevel != FORCE_LEVEL_5 + && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) + {//attacker bounced off, and defender has ability to do knockaways, so do one unless we're using fast attacks + //turn the parry into a knockaway + hitOwner->client->ps.saberBounceMove = PM_KnockawayForParry(hitOwner->client->ps.saberBlocked); + } + else if ((ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0, 6)) + || (ent->client->ps.saberAnimLevel == SS_DESANN && !Q_irand(0, 3))) + {// a strong attack can sometimes do a knockdown + //HMM... maybe only if they're moving backwards? + if (WP_BrokenParryKnockDown(hitOwner)) + { + hitOwner->client->ps.saberBlocked = BLOCKED_NONE; + hitOwner->client->ps.saberBounceMove = LS_NONE; + } + } + } + collisionResolved = qtrue; + } + } + /* + else if ( entDefending && hitOwnerAttacking ) + {//I'm parrying, they're attacking + if ( hitOwnerPowerLevel < FORCE_LEVEL_3 ) + {//strong attacks cannot be deflected + //based on angle of attack & angle of defensive saber, see if I should deflect off in another dir rather than bounce back + deflected = WP_GetSaberDeflectionAngle( hitOwner, ent ); + //just so Jedi knows that he was blocked + hitOwner->client->ps.saberEventFlags |= SEF_BLOCKED; + } + //FIXME: base parry breaks on animation (saber attack level), not FP_SABER_OFFENSE + if ( hitOwnerPowerLevel > FORCE_LEVEL_2 || (!deflected && Q_irand( 0, PM_PowerLevelForSaberAnim( &hitOwner->client->ps ) - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] ) > 0 ) ) + {//broke my parry altogether + if ( hitOwnerPowerLevel > FORCE_LEVEL_2 || Q_irand( 0, hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] ) ) + {//chance of continuing with the attack (not bouncing back) + hitOwner->client->ps.saberEventFlags &= ~SEF_BLOCKED; + hitOwner->client->ps.saberBounceMove = LS_NONE; + } + //do some time-consuming saber-knocked-aside broken parry anim + ent->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; + #ifndef FINAL_BUILD + if ( d_saberCombat->integer ) + { + if ( hitOwner->client->ps.saberEventFlags&SEF_BLOCKED ) + { + gi.Printf( S_COLOR_RED"%s parry broken (bounce/deflect)!\n", ent->targetname ); + } + else + { + gi.Printf( S_COLOR_RED"%s parry broken (follow-through)!\n", ent->targetname ); + } + } + #endif + } + else + { + WP_SaberParry( ent, hitOwner, saberNum, bladeNum ); + } + collisionResolved = qtrue; + } + */ + else + {//some other kind of in-hand saber collision } - //FIXME: what about second saber if dualSabers? - entPowerLevel += ent->client->ps.saber[saberNum].parryBonus; } + } + else + {//some kind of in-flight collision + } - if ( PM_SaberInAttack( hitOwner->client->ps.saberMove ) || PM_SaberInSpecialAttack( hitOwner->client->ps.torsoAnim ) ) - { - hitOwnerAttacking = qtrue; + if (saberHitFraction < 1.0f) + { + if (!collisionResolved && baseDamage) + {//some other kind of in-hand saber collision + //handle my reaction + if (!ent->client->ps.saberInFlight + && ent->client->ps.saberLockTime < level.time) + {//my saber is in hand + if (ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN) + { + if (PM_SaberInAttack(ent->client->ps.saberMove) || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim) || + (entPowerLevel > FORCE_LEVEL_2&&!PM_SaberInIdle(ent->client->ps.saberMove) && !PM_SaberInParry(ent->client->ps.saberMove) && !PM_SaberInReflect(ent->client->ps.saberMove))) + {//in the middle of attacking + if ((ent->client->ps.saberAnimLevel == SS_STRONG + || ent->client->ps.saberAnimLevel == SS_DESANN) + && hitOwner->health > 0) + {//don't deflect/bounce in strong attack or when enemy is dead + WP_GetSaberDeflectionAngle(ent, hitOwner); + ent->client->ps.saberEventFlags |= SEF_BLOCKED; + //since it was blocked/deflected, take away any damage done + //FIXME: what if the damage was done before the parry? + WP_SaberClearDamageForEntNum(ent, hitOwner->s.number, saberNum, bladeNum); + } + } + else + {//saber collided when not attacking, parry it + //since it was blocked/deflected, take away any damage done + //FIXME: what if the damage was done before the parry? + WP_SaberClearDamageForEntNum(ent, hitOwner->s.number, saberNum, bladeNum); + /* + if ( ent->s.number || g_saberAutoBlocking->integer || ent->client->ps.saberBlockingTime > level.time ) + {//either an NPC or a player who has blocking + if ( !PM_SaberInTransitionAny( ent->client->ps.saberMove ) && !PM_SaberInBounce( ent->client->ps.saberMove ) ) + {//I'm not attacking, in transition or in a bounce, so play a parry + //just so Jedi knows that he parried something + WP_SaberBlockNonRandom( ent, saberHitLocation, qfalse ); + } + ent->client->ps.saberEventFlags |= SEF_PARRIED; + } + */ + } + } + else + { + //since it was blocked/deflected, take away any damage done + //FIXME: what if the damage was done before the parry? + WP_SaberClearDamageForEntNum(ent, hitOwner->s.number, saberNum, bladeNum); + } + } + else + {//nothing happens to *me* when my inFlight saber hits something + } + //handle their reaction + if (hitOwner + && hitOwner->health > 0 + && hitOwner->client + && !hitOwner->client->ps.saberInFlight + && hitOwner->client->ps.saberLockTime < level.time) + {//their saber is in hand + if (PM_SaberInAttack(hitOwner->client->ps.saberMove) || PM_SaberInSpecialAttack(hitOwner->client->ps.torsoAnim) || + (hitOwner->client->ps.saberAnimLevel > SS_MEDIUM&&!PM_SaberInIdle(hitOwner->client->ps.saberMove) && !PM_SaberInParry(hitOwner->client->ps.saberMove) && !PM_SaberInReflect(hitOwner->client->ps.saberMove))) + {//in the middle of attacking + /* + if ( hitOwner->client->ps.saberAnimLevel < SS_STRONG ) + {//don't deflect/bounce in strong attack + WP_GetSaberDeflectionAngle( hitOwner, ent ); + hitOwner->client->ps.saberEventFlags |= SEF_BLOCKED; + } + */ + } + else + {//saber collided when not attacking, parry it + if (!PM_SaberInBrokenParry(hitOwner->client->ps.saberMove)) + {//not currently in a broken parry + if (!WP_SaberParry(hitOwner, ent, saberNum, bladeNum)) + {//FIXME: hitOwner can't parry, do some time-consuming saber-knocked-aside broken parry anim? + //hitOwner->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; + } + } + } + } + else + {//nothing happens to *hitOwner* when their inFlight saber hits something + } } - else if ( hitOwnerPowerLevel > FORCE_LEVEL_2 ) - {//stronger styles count as attacking even if in a transition - if ( PM_SaberInTransitionAny( hitOwner->client->ps.saberMove ) ) + + //collision must have been handled by now + //Set the blocked attack bounce value in saberBlocked so we actually play our saberBounceMove anim + if (ent->client->ps.saberEventFlags & SEF_BLOCKED) + { + if (ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN) { - hitOwnerAttacking = qtrue; + ent->client->ps.saberBlocked = BLOCKED_ATK_BOUNCE; } } - if ( PM_SaberInParry( hitOwner->client->ps.saberMove ) - || hitOwner->client->ps.saberMove == LS_READY ) + /* + if ( hitOwner && hitOwner->client->ps.saberEventFlags & SEF_BLOCKED ) { - hitOwnerDefending = qtrue; + hitOwner->client->ps.saberBlocked = BLOCKED_ATK_BOUNCE; } + */ + } + } //new code end + else + { //old code start + //FIXME: based on strength, position and angle of attack & defense, decide if: + // defender and attacker lock sabers + // *defender's parry should hold and attack bounces (or deflects, based on angle of sabers) + // *defender's parry is somewhat broken and both bounce (or deflect) + // *defender's parry is broken and they bounce while attacker's attack deflects or carries through (especially if they're dead) + // defender is knocked down and attack goes through + + //Check deflections and broken parries + if (hitOwner && hitOwner->health > 0 && ent->health > 0 //both are alive + && !inFlightSaberBlocked && hitOwner->client && !hitOwner->client->ps.saberInFlight && !ent->client->ps.saberInFlight//both have sabers in-hand + && ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN + && ent->client->ps.saberLockTime < level.time + && hitOwner->client->ps.saberLockTime < level.time) + {//2 in-hand sabers hit + //FIXME: defender should not parry or block at all if not in a saber anim... like, if in a roll or knockdown... + if (baseDamage) + {//there is damage involved, not just effects + qboolean entAttacking = qfalse; + qboolean hitOwnerAttacking = qfalse; + qboolean entDefending = qfalse; + qboolean hitOwnerDefending = qfalse; + qboolean forceLock = qfalse; + + if ((ent->client->NPC_class == CLASS_KYLE && (ent->spawnflags & 1) && hitOwner->s.number < MAX_CLIENTS) + || (hitOwner->client->NPC_class == CLASS_KYLE && (hitOwner->spawnflags & 1) && ent->s.number < MAX_CLIENTS)) + {//Player vs. Kyle Boss == lots of saberlocks + if (!Q_irand(0, 2)) + { + forceLock = qtrue; + } + } - if ( hitOwner->client->ps.torsoAnim == BOTH_A1_SPECIAL - || hitOwner->client->ps.torsoAnim == BOTH_A2_SPECIAL - || hitOwner->client->ps.torsoAnim == BOTH_A3_SPECIAL ) - {//parry/block/break-parry bonus for single-style kata moves - hitOwnerPowerLevel++; - } - if ( hitOwnerAttacking ) - {//add twoHanded bonus and breakParryBonus to entPowerLevel here - if ( (hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED) ) + if (PM_SaberInAttack(ent->client->ps.saberMove) || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) { - hitOwnerPowerLevel++; + entAttacking = qtrue; } - hitOwnerPowerLevel += hitOwner->client->ps.saber[0].breakParryBonus; - if ( hitOwner->client->ps.dualSabers && Q_irand( 0, 1 ) ) - {//FIXME: assumes both sabers are hitting at same time...? - hitOwnerPowerLevel += 1 + hitOwner->client->ps.saber[1].breakParryBonus; + else if (entPowerLevel > FORCE_LEVEL_2) + {//stronger styles count as attacking even if in a transition + if (PM_SaberInTransitionAny(ent->client->ps.saberMove)) + { + entAttacking = qtrue; + } } - } - else if ( hitOwnerDefending ) - {//add twoHanded bonus and dualSaber bonus and parryBonus to entPowerLevel here - if ( (hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED) - || (hitOwner->client->ps.dualSabers && hitOwner->client->ps.saber[1].Active()) ) + if (PM_SaberInParry(ent->client->ps.saberMove) + || ent->client->ps.saberMove == LS_READY) + { + entDefending = qtrue; + } + + if (ent->client->ps.torsoAnim == BOTH_A1_SPECIAL + || ent->client->ps.torsoAnim == BOTH_A2_SPECIAL + || ent->client->ps.torsoAnim == BOTH_A3_SPECIAL) + {//parry/block/break-parry bonus for single-style kata moves + entPowerLevel++; + } + if (entAttacking) + {//add twoHanded bonus and breakParryBonus to entPowerLevel here + //This makes staff too powerful + if ((ent->client->ps.saber[saberNum].saberFlags&SFL_TWO_HANDED)) + { + entPowerLevel++; + } + //FIXME: what if dualSabers && both sabers are hitting at same time? + if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum)) + { + entPowerLevel += ent->client->ps.saber[saberNum].breakParryBonus; + } + else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum)) + { + entPowerLevel += ent->client->ps.saber[saberNum].breakParryBonus2; + } + } + else if (entDefending) + {//add twoHanded bonus and dualSaber bonus and parryBonus to entPowerLevel here + if ((ent->client->ps.saber[saberNum].saberFlags&SFL_TWO_HANDED) + || (ent->client->ps.dualSabers && ent->client->ps.saber[1].Active())) + { + entPowerLevel++; + } + //FIXME: what about second saber if dualSabers? + entPowerLevel += ent->client->ps.saber[saberNum].parryBonus; + } + + if (PM_SaberInAttack(hitOwner->client->ps.saberMove) || PM_SaberInSpecialAttack(hitOwner->client->ps.torsoAnim)) + { + hitOwnerAttacking = qtrue; + } + else if (hitOwnerPowerLevel > FORCE_LEVEL_2) + {//stronger styles count as attacking even if in a transition + if (PM_SaberInTransitionAny(hitOwner->client->ps.saberMove)) + { + hitOwnerAttacking = qtrue; + } + } + if (PM_SaberInParry(hitOwner->client->ps.saberMove) + || hitOwner->client->ps.saberMove == LS_READY) { + hitOwnerDefending = qtrue; + } + + if (hitOwner->client->ps.torsoAnim == BOTH_A1_SPECIAL + || hitOwner->client->ps.torsoAnim == BOTH_A2_SPECIAL + || hitOwner->client->ps.torsoAnim == BOTH_A3_SPECIAL) + {//parry/block/break-parry bonus for single-style kata moves hitOwnerPowerLevel++; } - hitOwnerPowerLevel += hitOwner->client->ps.saber[0].parryBonus; - if ( hitOwner->client->ps.dualSabers && Q_irand( 0, 1 ) ) - {//FIXME: assumes both sabers are defending at same time...? - hitOwnerPowerLevel += 1 + hitOwner->client->ps.saber[1].parryBonus; + if (hitOwnerAttacking) + {//add twoHanded bonus and breakParryBonus to entPowerLevel here + if ((hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED)) + { + hitOwnerPowerLevel++; + } + hitOwnerPowerLevel += hitOwner->client->ps.saber[0].breakParryBonus; + if (hitOwner->client->ps.dualSabers && Q_irand(0, 1)) + {//FIXME: assumes both sabers are hitting at same time...? + hitOwnerPowerLevel += 1 + hitOwner->client->ps.saber[1].breakParryBonus; + } + } + else if (hitOwnerDefending) + {//add twoHanded bonus and dualSaber bonus and parryBonus to entPowerLevel here + if ((hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED) + || (hitOwner->client->ps.dualSabers && hitOwner->client->ps.saber[1].Active())) + { + hitOwnerPowerLevel++; + } + hitOwnerPowerLevel += hitOwner->client->ps.saber[0].parryBonus; + if (hitOwner->client->ps.dualSabers && Q_irand(0, 1)) + {//FIXME: assumes both sabers are defending at same time...? + hitOwnerPowerLevel += 1 + hitOwner->client->ps.saber[1].parryBonus; + } } - } - if ( PM_SuperBreakLoseAnim( ent->client->ps.torsoAnim ) - || PM_SuperBreakWinAnim( ent->client->ps.torsoAnim ) - || PM_SuperBreakLoseAnim( hitOwner->client->ps.torsoAnim ) - || PM_SuperBreakWinAnim( hitOwner->client->ps.torsoAnim ) ) - {//don't mess with this - collisionResolved = qtrue; - } - else if ( entAttacking - && hitOwnerAttacking - && !Q_irand( 0, g_saberLockRandomNess->integer ) - && ( g_debugSaberLock->integer || forceLock - || entPowerLevel == hitOwnerPowerLevel - || (entPowerLevel > FORCE_LEVEL_2 && hitOwnerPowerLevel > FORCE_LEVEL_2 ) - || (entPowerLevel < FORCE_LEVEL_3 && hitOwnerPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && Q_irand( 0, 3 )) - || (entPowerLevel < FORCE_LEVEL_2 && hitOwnerPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && Q_irand( 0, 2 )) - || (hitOwnerPowerLevel < FORCE_LEVEL_3 && entPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && !Q_irand( 0, 1 )) - || (hitOwnerPowerLevel < FORCE_LEVEL_2 && entPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && !Q_irand( 0, 1 ))) - && WP_SabersCheckLock( ent, hitOwner ) ) - { - collisionResolved = qtrue; - } - else if ( hitOwnerAttacking - && entDefending - && !Q_irand( 0, g_saberLockRandomNess->integer*3 ) - && (g_debugSaberLock->integer || forceLock || - ((ent->client->ps.saberMove != LS_READY || (hitOwnerPowerLevel-ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand( -6, 0 ) ) - && ((hitOwnerPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2 )|| - (hitOwnerPowerLevel < FORCE_LEVEL_2 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1 )|| - (hitOwnerPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand( 0, (hitOwnerPowerLevel-ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE]+1)*2 ))) )) - && WP_SabersCheckLock( hitOwner, ent ) ) - { - collisionResolved = qtrue; - } - else if ( entAttacking && hitOwnerDefending ) - {//I'm attacking hit, they're parrying - qboolean activeDefense = (hitOwner->s.number||g_saberAutoBlocking->integer||hitOwner->client->ps.saberBlockingTime > level.time); - if ( !Q_irand( 0, g_saberLockRandomNess->integer*3 ) - && activeDefense + if (PM_SuperBreakLoseAnim(ent->client->ps.torsoAnim) + || PM_SuperBreakWinAnim(ent->client->ps.torsoAnim) + || PM_SuperBreakLoseAnim(hitOwner->client->ps.torsoAnim) + || PM_SuperBreakWinAnim(hitOwner->client->ps.torsoAnim)) + {//don't mess with this + collisionResolved = qtrue; + } + else if (entAttacking + && hitOwnerAttacking + && !Q_irand(0, g_saberLockRandomNess->integer) + && (g_debugSaberLock->integer || forceLock + || entPowerLevel == hitOwnerPowerLevel + || (entPowerLevel > FORCE_LEVEL_2 && hitOwnerPowerLevel > FORCE_LEVEL_2) + || (entPowerLevel < FORCE_LEVEL_3 && hitOwnerPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && Q_irand(0, 3)) + || (entPowerLevel < FORCE_LEVEL_2 && hitOwnerPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && Q_irand(0, 2)) + || (hitOwnerPowerLevel < FORCE_LEVEL_3 && entPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && !Q_irand(0, 1)) + || (hitOwnerPowerLevel < FORCE_LEVEL_2 && entPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && !Q_irand(0, 1))) + && WP_SabersCheckLock(ent, hitOwner)) + { + collisionResolved = qtrue; + } + else if (hitOwnerAttacking + && entDefending + && !Q_irand(0, g_saberLockRandomNess->integer * 3) && (g_debugSaberLock->integer || forceLock || - ((hitOwner->client->ps.saberMove != LS_READY || (entPowerLevel-hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand( -6, 0 ) ) - && ( ( entPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2 ) - || ( entPowerLevel < FORCE_LEVEL_2 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1 ) - || ( entPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand( 0, (entPowerLevel-hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]+1)*2 )) ) )) - && WP_SabersCheckLock( ent, hitOwner ) ) + ((ent->client->ps.saberMove != LS_READY || (hitOwnerPowerLevel - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand(-6, 0)) + && ((hitOwnerPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) || + (hitOwnerPowerLevel < FORCE_LEVEL_2 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) || + (hitOwnerPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (hitOwnerPowerLevel - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) + && WP_SabersCheckLock(hitOwner, ent)) { collisionResolved = qtrue; } - else if ( saberHitFraction < 1.0f ) - {//an actual collision - if ( entPowerLevel < FORCE_LEVEL_3 && activeDefense ) - {//strong attacks cannot be deflected - //based on angle of attack & angle of defensive saber, see if I should deflect off in another dir rather than bounce back - deflected = WP_GetSaberDeflectionAngle( ent, hitOwner ); - //just so Jedi knows that he was blocked - ent->client->ps.saberEventFlags |= SEF_BLOCKED; - } - //base parry breaks on animation (saber attack level), not FP_SABER_OFFENSE - if ( entPowerLevel < FORCE_LEVEL_3 - //&& ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] < FORCE_LEVEL_3//if you have high saber offense, you cannot have your attack knocked away, regardless of what style you're using? - //&& hitOwner->client->ps.saberAnimLevel != FORCE_LEVEL_5 + else if (entAttacking && hitOwnerDefending) + {//I'm attacking hit, they're parrying + qboolean activeDefense = (hitOwner->s.number || g_saberAutoBlocking->integer || hitOwner->client->ps.saberBlockingTime > level.time); + if (!Q_irand(0, g_saberLockRandomNess->integer * 3) && activeDefense - && (hitOwnerPowerLevel > FORCE_LEVEL_2||(hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]>FORCE_LEVEL_2&&Q_irand(0,hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE]))) ) - {//knockaways can make fast-attacker go into a broken parry anim if the ent is using fast or med (but not Tavion) - //make me parry - WP_SaberParry( hitOwner, ent, saberNum, bladeNum ); - //turn the parry into a knockaway - hitOwner->client->ps.saberBounceMove = PM_KnockawayForParry( hitOwner->client->ps.saberBlocked ); - //make them go into a broken parry - ent->client->ps.saberBounceMove = PM_BrokenParryForAttack( ent->client->ps.saberMove ); - ent->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; - if ( saberNum == 0 ) - {//FIXME: can only lose right-hand saber for now - if ( !(ent->client->ps.saber[saberNum].saberFlags&SFL_NOT_DISARMABLE) - && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] < FORCE_LEVEL_2 - //&& (ent->s.number||g_saberRealisticCombat->integer) - && Q_irand( 0, hitOwner->client->ps.SaberDisarmBonus( 0 ) ) > 0 - && (hitOwner->s.number || g_saberAutoBlocking->integer || !Q_irand( 0, 2 )) )//if player defending and autoblocking is on, this is less likely to happen, so don't do the random check - {//knocked the saber right out of his hand! (never happens to player) - //Get a good velocity to send the saber in based on my parry move - vec3_t throwDir; - if ( !PM_VelocityForBlockedMove( &hitOwner->client->ps, throwDir ) ) - { - PM_VelocityForSaberMove( &ent->client->ps, throwDir ); + && (g_debugSaberLock->integer || forceLock || + ((hitOwner->client->ps.saberMove != LS_READY || (entPowerLevel - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand(-6, 0)) + && ((entPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) + || (entPowerLevel < FORCE_LEVEL_2 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) + || (entPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (entPowerLevel - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) + && WP_SabersCheckLock(ent, hitOwner)) + { + collisionResolved = qtrue; + } + else if (saberHitFraction < 1.0f) + {//an actual collision + if (entPowerLevel < FORCE_LEVEL_3 && activeDefense) + {//strong attacks cannot be deflected + //based on angle of attack & angle of defensive saber, see if I should deflect off in another dir rather than bounce back + deflected = WP_GetSaberDeflectionAngle(ent, hitOwner); + //just so Jedi knows that he was blocked + ent->client->ps.saberEventFlags |= SEF_BLOCKED; + } + //base parry breaks on animation (saber attack level), not FP_SABER_OFFENSE + if (entPowerLevel < FORCE_LEVEL_3 + //&& ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] < FORCE_LEVEL_3//if you have high saber offense, you cannot have your attack knocked away, regardless of what style you're using? + //&& hitOwner->client->ps.saberAnimLevel != FORCE_LEVEL_5 + && activeDefense + && (hitOwnerPowerLevel > FORCE_LEVEL_2 || (hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]>FORCE_LEVEL_2&&Q_irand(0, hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE])))) + {//knockaways can make fast-attacker go into a broken parry anim if the ent is using fast or med (but not Tavion) + //make me parry + WP_SaberParry(hitOwner, ent, saberNum, bladeNum); + //turn the parry into a knockaway + hitOwner->client->ps.saberBounceMove = PM_KnockawayForParry(hitOwner->client->ps.saberBlocked); + //make them go into a broken parry + ent->client->ps.saberBounceMove = PM_BrokenParryForAttack(ent->client->ps.saberMove); + ent->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; + if (saberNum == 0) + {//FIXME: can only lose right-hand saber for now + if (!(ent->client->ps.saber[saberNum].saberFlags&SFL_NOT_DISARMABLE) + && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] < FORCE_LEVEL_2 + //&& (ent->s.number||g_saberRealisticCombat->integer) + && Q_irand(0, hitOwner->client->ps.SaberDisarmBonus(0)) > 0 + && (hitOwner->s.number || g_saberAutoBlocking->integer || !Q_irand(0, 2)))//if player defending and autoblocking is on, this is less likely to happen, so don't do the random check + {//knocked the saber right out of his hand! (never happens to player) + //Get a good velocity to send the saber in based on my parry move + vec3_t throwDir; + if (!PM_VelocityForBlockedMove(&hitOwner->client->ps, throwDir)) + { + PM_VelocityForSaberMove(&ent->client->ps, throwDir); + } + WP_SaberLose(ent, throwDir); } - WP_SaberLose( ent, throwDir ); } - } - //just so Jedi knows that he was blocked - ent->client->ps.saberEventFlags |= SEF_BLOCKED; + //just so Jedi knows that he was blocked + ent->client->ps.saberEventFlags |= SEF_BLOCKED; #ifndef FINAL_BUILD - if ( d_saberCombat->integer ) - { - gi.Printf( S_COLOR_RED"%s knockaway %s's attack, new move = %s, anim = %s\n", hitOwner->NPC_type, ent->NPC_type, saberMoveData[ent->client->ps.saberBounceMove].name, animTable[saberMoveData[ent->client->ps.saberBounceMove].animToUse].name ); - } + if (d_saberCombat->integer) + { + gi.Printf(S_COLOR_RED"%s knockaway %s's attack, new move = %s, anim = %s\n", hitOwner->NPC_type, ent->NPC_type, saberMoveData[ent->client->ps.saberBounceMove].name, animTable[saberMoveData[ent->client->ps.saberBounceMove].animToUse].name); + } #endif - } - else if ( !activeDefense//they're not defending - || (entPowerLevel > FORCE_LEVEL_2 //I hit hard - && hitOwnerPowerLevel < entPowerLevel)//they are defending, but their defense strength is lower than my attack... - || (!deflected && Q_irand( 0, PM_PowerLevelForSaberAnim( &ent->client->ps, saberNum ) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]/*PM_PowerLevelForSaberAnim( &hitOwner->client->ps )*/ ) > 0 ) ) - {//broke their parry altogether - if ( entPowerLevel > FORCE_LEVEL_2 || Q_irand( 0, ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] ) ) - {//chance of continuing with the attack (not bouncing back) - ent->client->ps.saberEventFlags &= ~SEF_BLOCKED; - ent->client->ps.saberBounceMove = LS_NONE; - brokenParry = qtrue; } - //do some time-consuming saber-knocked-aside broken parry anim - hitOwner->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; - hitOwner->client->ps.saberBounceMove = LS_NONE; - //FIXME: for now, you always disarm the right-hand saber - if ( !(hitOwner->client->ps.saber[0].saberFlags&SFL_NOT_DISARMABLE) - && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] < FORCE_LEVEL_2 - //&& (ent->s.number||g_saberRealisticCombat->integer) - && Q_irand( 0, 2-ent->client->ps.SaberDisarmBonus( bladeNum ) ) <= 0 ) - {//knocked the saber right out of his hand! - //get the right velocity for my attack direction - vec3_t throwDir; - PM_VelocityForSaberMove( &ent->client->ps, throwDir ); - WP_SaberLose( hitOwner, throwDir ); - if ( (ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0,3) ) - || ( ent->client->ps.saberAnimLevel==SS_DESANN&&!Q_irand(0,1) ) ) - {// a strong attack - if ( WP_BrokenParryKnockDown( hitOwner ) ) - { - hitOwner->client->ps.saberBlocked = BLOCKED_NONE; - hitOwner->client->ps.saberBounceMove = LS_NONE; - } + else if (!activeDefense//they're not defending + || (entPowerLevel > FORCE_LEVEL_2 //I hit hard + && hitOwnerPowerLevel < entPowerLevel)//they are defending, but their defense strength is lower than my attack... + || (!deflected && Q_irand(0, PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]/*PM_PowerLevelForSaberAnim( &hitOwner->client->ps )*/) > 0)) + {//broke their parry altogether + if (entPowerLevel > FORCE_LEVEL_2 || Q_irand(0, ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE])) + {//chance of continuing with the attack (not bouncing back) + ent->client->ps.saberEventFlags &= ~SEF_BLOCKED; + ent->client->ps.saberBounceMove = LS_NONE; + brokenParry = qtrue; } - } - else - { - if ( (ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0,5) ) - || ( ent->client->ps.saberAnimLevel==SS_DESANN&&!Q_irand(0,3) ) ) - {// a strong attack - if ( WP_BrokenParryKnockDown( hitOwner ) ) - { - hitOwner->client->ps.saberBlocked = BLOCKED_NONE; - hitOwner->client->ps.saberBounceMove = LS_NONE; + //do some time-consuming saber-knocked-aside broken parry anim + hitOwner->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; + hitOwner->client->ps.saberBounceMove = LS_NONE; + //FIXME: for now, you always disarm the right-hand saber + if (!(hitOwner->client->ps.saber[0].saberFlags&SFL_NOT_DISARMABLE) + && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] < FORCE_LEVEL_2 + //&& (ent->s.number||g_saberRealisticCombat->integer) + && Q_irand(0, 2 - ent->client->ps.SaberDisarmBonus(bladeNum)) <= 0) + {//knocked the saber right out of his hand! + //get the right velocity for my attack direction + vec3_t throwDir; + PM_VelocityForSaberMove(&ent->client->ps, throwDir); + WP_SaberLose(hitOwner, throwDir); + if ((ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0, 3)) + || (ent->client->ps.saberAnimLevel == SS_DESANN&&!Q_irand(0, 1))) + {// a strong attack + if (WP_BrokenParryKnockDown(hitOwner)) + { + hitOwner->client->ps.saberBlocked = BLOCKED_NONE; + hitOwner->client->ps.saberBounceMove = LS_NONE; + } } } - } -#ifndef FINAL_BUILD - if ( d_saberCombat->integer ) - { - if ( ent->client->ps.saberEventFlags&SEF_BLOCKED ) + else { - gi.Printf( S_COLOR_RED"%s parry broken (bounce/deflect)!\n", hitOwner->targetname ); + if ((ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0, 5)) + || (ent->client->ps.saberAnimLevel == SS_DESANN&&!Q_irand(0, 3))) + {// a strong attack + if (WP_BrokenParryKnockDown(hitOwner)) + { + hitOwner->client->ps.saberBlocked = BLOCKED_NONE; + hitOwner->client->ps.saberBounceMove = LS_NONE; + } + } } - else +#ifndef FINAL_BUILD + if (d_saberCombat->integer) { - gi.Printf( S_COLOR_RED"%s parry broken (follow-through)!\n", hitOwner->targetname ); + if (ent->client->ps.saberEventFlags&SEF_BLOCKED) + { + gi.Printf(S_COLOR_RED"%s parry broken (bounce/deflect)!\n", hitOwner->targetname); + } + else + { + gi.Printf(S_COLOR_RED"%s parry broken (follow-through)!\n", hitOwner->targetname); + } } - } #endif - } - else - {//just a parry, possibly the hitOwner can knockaway the ent - WP_SaberParry( hitOwner, ent, saberNum, bladeNum ); - if ( PM_SaberInBounce( ent->client->ps.saberMove ) //FIXME: saberMove not set until pmove! - && activeDefense - && hitOwner->client->ps.saberAnimLevel != SS_FAST //&& hitOwner->client->ps.saberAnimLevel != FORCE_LEVEL_5 - && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2 ) - {//attacker bounced off, and defender has ability to do knockaways, so do one unless we're using fast attacks - //turn the parry into a knockaway - hitOwner->client->ps.saberBounceMove = PM_KnockawayForParry( hitOwner->client->ps.saberBlocked ); } - else if ( (ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0,6) ) - || ( ent->client->ps.saberAnimLevel==SS_DESANN && !Q_irand(0,3) ) ) - {// a strong attack can sometimes do a knockdown - //HMM... maybe only if they're moving backwards? - if ( WP_BrokenParryKnockDown( hitOwner ) ) - { - hitOwner->client->ps.saberBlocked = BLOCKED_NONE; - hitOwner->client->ps.saberBounceMove = LS_NONE; + else + {//just a parry, possibly the hitOwner can knockaway the ent + WP_SaberParry(hitOwner, ent, saberNum, bladeNum); + if (PM_SaberInBounce(ent->client->ps.saberMove) //FIXME: saberMove not set until pmove! + && activeDefense + && hitOwner->client->ps.saberAnimLevel != SS_FAST //&& hitOwner->client->ps.saberAnimLevel != FORCE_LEVEL_5 + && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) + {//attacker bounced off, and defender has ability to do knockaways, so do one unless we're using fast attacks + //turn the parry into a knockaway + hitOwner->client->ps.saberBounceMove = PM_KnockawayForParry(hitOwner->client->ps.saberBlocked); + } + else if ((ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0, 6)) + || (ent->client->ps.saberAnimLevel == SS_DESANN && !Q_irand(0, 3))) + {// a strong attack can sometimes do a knockdown + //HMM... maybe only if they're moving backwards? + if (WP_BrokenParryKnockDown(hitOwner)) + { + hitOwner->client->ps.saberBlocked = BLOCKED_NONE; + hitOwner->client->ps.saberBounceMove = LS_NONE; + } } } + collisionResolved = qtrue; } - collisionResolved = qtrue; } - } - /* - else if ( entDefending && hitOwnerAttacking ) - {//I'm parrying, they're attacking + /* + else if ( entDefending && hitOwnerAttacking ) + {//I'm parrying, they're attacking if ( hitOwnerPowerLevel < FORCE_LEVEL_3 ) {//strong attacks cannot be deflected - //based on angle of attack & angle of defensive saber, see if I should deflect off in another dir rather than bounce back - deflected = WP_GetSaberDeflectionAngle( hitOwner, ent ); - //just so Jedi knows that he was blocked - hitOwner->client->ps.saberEventFlags |= SEF_BLOCKED; + //based on angle of attack & angle of defensive saber, see if I should deflect off in another dir rather than bounce back + deflected = WP_GetSaberDeflectionAngle( hitOwner, ent ); + //just so Jedi knows that he was blocked + hitOwner->client->ps.saberEventFlags |= SEF_BLOCKED; } //FIXME: base parry breaks on animation (saber attack level), not FP_SABER_OFFENSE if ( hitOwnerPowerLevel > FORCE_LEVEL_2 || (!deflected && Q_irand( 0, PM_PowerLevelForSaberAnim( &hitOwner->client->ps ) - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] ) > 0 ) ) {//broke my parry altogether - if ( hitOwnerPowerLevel > FORCE_LEVEL_2 || Q_irand( 0, hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] ) ) - {//chance of continuing with the attack (not bouncing back) - hitOwner->client->ps.saberEventFlags &= ~SEF_BLOCKED; - hitOwner->client->ps.saberBounceMove = LS_NONE; - } - //do some time-consuming saber-knocked-aside broken parry anim - ent->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; -#ifndef FINAL_BUILD - if ( d_saberCombat->integer ) - { - if ( hitOwner->client->ps.saberEventFlags&SEF_BLOCKED ) - { - gi.Printf( S_COLOR_RED"%s parry broken (bounce/deflect)!\n", ent->targetname ); - } - else - { - gi.Printf( S_COLOR_RED"%s parry broken (follow-through)!\n", ent->targetname ); - } - } -#endif + if ( hitOwnerPowerLevel > FORCE_LEVEL_2 || Q_irand( 0, hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] ) ) + {//chance of continuing with the attack (not bouncing back) + hitOwner->client->ps.saberEventFlags &= ~SEF_BLOCKED; + hitOwner->client->ps.saberBounceMove = LS_NONE; + } + //do some time-consuming saber-knocked-aside broken parry anim + ent->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; + #ifndef FINAL_BUILD + if ( d_saberCombat->integer ) + { + if ( hitOwner->client->ps.saberEventFlags&SEF_BLOCKED ) + { + gi.Printf( S_COLOR_RED"%s parry broken (bounce/deflect)!\n", ent->targetname ); } else { - WP_SaberParry( ent, hitOwner, saberNum, bladeNum ); + gi.Printf( S_COLOR_RED"%s parry broken (follow-through)!\n", ent->targetname ); + } + } + #endif + } + else + { + WP_SaberParry( ent, hitOwner, saberNum, bladeNum ); } collisionResolved = qtrue; - } - */ - else - {//some other kind of in-hand saber collision + } + */ + else + {//some other kind of in-hand saber collision + } } } - } - else - {//some kind of in-flight collision - } + else + {//some kind of in-flight collision + } - if ( saberHitFraction < 1.0f ) - { - if ( !collisionResolved && baseDamage ) - {//some other kind of in-hand saber collision - //handle my reaction - if ( !ent->client->ps.saberInFlight - && ent->client->ps.saberLockTime < level.time ) - {//my saber is in hand - if ( ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN ) - { - if ( PM_SaberInAttack( ent->client->ps.saberMove ) || PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) || - (entPowerLevel > FORCE_LEVEL_2&&!PM_SaberInIdle(ent->client->ps.saberMove)&&!PM_SaberInParry(ent->client->ps.saberMove)&&!PM_SaberInReflect(ent->client->ps.saberMove)) ) - {//in the middle of attacking - if ( entPowerLevel < FORCE_LEVEL_3 && hitOwner->health > 0 ) - {//don't deflect/bounce in strong attack or when enemy is dead - WP_GetSaberDeflectionAngle( ent, hitOwner ); - ent->client->ps.saberEventFlags |= SEF_BLOCKED; + if (saberHitFraction < 1.0f) + { + if (!collisionResolved && baseDamage) + {//some other kind of in-hand saber collision + //handle my reaction + if (!ent->client->ps.saberInFlight + && ent->client->ps.saberLockTime < level.time) + {//my saber is in hand + if (ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN) + { + if (PM_SaberInAttack(ent->client->ps.saberMove) || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim) || + (entPowerLevel > FORCE_LEVEL_2&&!PM_SaberInIdle(ent->client->ps.saberMove) && !PM_SaberInParry(ent->client->ps.saberMove) && !PM_SaberInReflect(ent->client->ps.saberMove))) + {//in the middle of attacking + if (entPowerLevel < FORCE_LEVEL_3 && hitOwner->health > 0) + {//don't deflect/bounce in strong attack or when enemy is dead + WP_GetSaberDeflectionAngle(ent, hitOwner); + ent->client->ps.saberEventFlags |= SEF_BLOCKED; + //since it was blocked/deflected, take away any damage done + //FIXME: what if the damage was done before the parry? + WP_SaberClearDamageForEntNum(ent, hitOwner->s.number, saberNum, bladeNum); + } + } + else + {//saber collided when not attacking, parry it //since it was blocked/deflected, take away any damage done //FIXME: what if the damage was done before the parry? - WP_SaberClearDamageForEntNum( ent, hitOwner->s.number, saberNum, bladeNum ); - } - } - else - {//saber collided when not attacking, parry it - //since it was blocked/deflected, take away any damage done - //FIXME: what if the damage was done before the parry? - WP_SaberClearDamageForEntNum( ent, hitOwner->s.number, saberNum, bladeNum ); - /* - if ( ent->s.number || g_saberAutoBlocking->integer || ent->client->ps.saberBlockingTime > level.time ) - {//either an NPC or a player who has blocking + WP_SaberClearDamageForEntNum(ent, hitOwner->s.number, saberNum, bladeNum); + /* + if ( ent->s.number || g_saberAutoBlocking->integer || ent->client->ps.saberBlockingTime > level.time ) + {//either an NPC or a player who has blocking if ( !PM_SaberInTransitionAny( ent->client->ps.saberMove ) && !PM_SaberInBounce( ent->client->ps.saberMove ) ) {//I'm not attacking, in transition or in a bounce, so play a parry - //just so Jedi knows that he parried something - WP_SaberBlockNonRandom( ent, saberHitLocation, qfalse ); + //just so Jedi knows that he parried something + WP_SaberBlockNonRandom( ent, saberHitLocation, qfalse ); } ent->client->ps.saberEventFlags |= SEF_PARRIED; + } + */ } - */ + } + else + { + //since it was blocked/deflected, take away any damage done + //FIXME: what if the damage was done before the parry? + WP_SaberClearDamageForEntNum(ent, hitOwner->s.number, saberNum, bladeNum); } } else - { - //since it was blocked/deflected, take away any damage done - //FIXME: what if the damage was done before the parry? - WP_SaberClearDamageForEntNum( ent, hitOwner->s.number, saberNum, bladeNum ); - } - } - else - {//nothing happens to *me* when my inFlight saber hits something - } - //handle their reaction - if ( hitOwner - && hitOwner->health > 0 - && hitOwner->client - && !hitOwner->client->ps.saberInFlight - && hitOwner->client->ps.saberLockTime < level.time ) - {//their saber is in hand - if ( PM_SaberInAttack( hitOwner->client->ps.saberMove ) || PM_SaberInSpecialAttack( hitOwner->client->ps.torsoAnim ) || - (hitOwner->client->ps.saberAnimLevel > SS_MEDIUM&&!PM_SaberInIdle(hitOwner->client->ps.saberMove)&&!PM_SaberInParry(hitOwner->client->ps.saberMove)&&!PM_SaberInReflect(hitOwner->client->ps.saberMove)) ) - {//in the middle of attacking - /* - if ( hitOwner->client->ps.saberAnimLevel < SS_STRONG ) - {//don't deflect/bounce in strong attack + {//nothing happens to *me* when my inFlight saber hits something + } + //handle their reaction + if (hitOwner + && hitOwner->health > 0 + && hitOwner->client + && !hitOwner->client->ps.saberInFlight + && hitOwner->client->ps.saberLockTime < level.time) + {//their saber is in hand + if (PM_SaberInAttack(hitOwner->client->ps.saberMove) || PM_SaberInSpecialAttack(hitOwner->client->ps.torsoAnim) || + (hitOwner->client->ps.saberAnimLevel > SS_MEDIUM&&!PM_SaberInIdle(hitOwner->client->ps.saberMove) && !PM_SaberInParry(hitOwner->client->ps.saberMove) && !PM_SaberInReflect(hitOwner->client->ps.saberMove))) + {//in the middle of attacking + /* + if ( hitOwner->client->ps.saberAnimLevel < SS_STRONG ) + {//don't deflect/bounce in strong attack WP_GetSaberDeflectionAngle( hitOwner, ent ); hitOwner->client->ps.saberEventFlags |= SEF_BLOCKED; + } + */ } - */ - } - else - {//saber collided when not attacking, parry it - if ( !PM_SaberInBrokenParry( hitOwner->client->ps.saberMove ) ) - {//not currently in a broken parry - if ( !WP_SaberParry( hitOwner, ent, saberNum, bladeNum ) ) - {//FIXME: hitOwner can't parry, do some time-consuming saber-knocked-aside broken parry anim? - //hitOwner->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; + else + {//saber collided when not attacking, parry it + if (!PM_SaberInBrokenParry(hitOwner->client->ps.saberMove)) + {//not currently in a broken parry + if (!WP_SaberParry(hitOwner, ent, saberNum, bladeNum)) + {//FIXME: hitOwner can't parry, do some time-consuming saber-knocked-aside broken parry anim? + //hitOwner->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; + } } } } + else + {//nothing happens to *hitOwner* when their inFlight saber hits something + } } - else - {//nothing happens to *hitOwner* when their inFlight saber hits something - } - } - //collision must have been handled by now - //Set the blocked attack bounce value in saberBlocked so we actually play our saberBounceMove anim - if ( ent->client->ps.saberEventFlags & SEF_BLOCKED ) - { - if ( ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN ) + //collision must have been handled by now + //Set the blocked attack bounce value in saberBlocked so we actually play our saberBounceMove anim + if (ent->client->ps.saberEventFlags & SEF_BLOCKED) { - ent->client->ps.saberBlocked = BLOCKED_ATK_BOUNCE; + if (ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN) + { + ent->client->ps.saberBlocked = BLOCKED_ATK_BOUNCE; + } } - } - /* - if ( hitOwner && hitOwner->client->ps.saberEventFlags & SEF_BLOCKED ) - { + /* + if ( hitOwner && hitOwner->client->ps.saberEventFlags & SEF_BLOCKED ) + { hitOwner->client->ps.saberBlocked = BLOCKED_ATK_BOUNCE; + } + */ } - */ - } + } //old code end + - if ( saberHitFraction < 1.0f || collisionResolved ) + if (saberHitFraction < 1.0f || collisionResolved) {//either actually hit or locked - if ( ent->client->ps.saberLockTime < level.time ) + if (ent->client->ps.saberLockTime < level.time) { - if ( inFlightSaberBlocked ) + if (inFlightSaberBlocked) {//FIXME: never hear this sound - WP_SaberBounceSound( ent, hitOwner, &g_entities[ent->client->ps.saberEntityNum], 0, 0, qfalse ); + WP_SaberBounceSound(ent, hitOwner, &g_entities[ent->client->ps.saberEntityNum], 0, 0, qfalse); } else { - if ( deflected ) + if (deflected) { - WP_SaberBounceSound( ent, hitOwner, NULL, saberNum, bladeNum, qtrue ); + WP_SaberBounceSound(ent, hitOwner, NULL, saberNum, bladeNum, qtrue); } else { - WP_SaberBlockSound( ent, hitOwner, saberNum, bladeNum ); + WP_SaberBlockSound(ent, hitOwner, saberNum, bladeNum); } } - if ( !g_saberNoEffects ) + if (!g_saberNoEffects) { - WP_SaberBlockEffect( ent, saberNum, bladeNum, saberHitLocation, saberHitNormal, qfalse ); + WP_SaberBlockEffect(ent, saberNum, bladeNum, saberHitLocation, saberHitNormal, qfalse); } } // Set the little screen flash - only when an attack is blocked - if ( !g_noClashFlare ) + if (!g_noClashFlare) { - g_saberFlashTime = level.time-50; - VectorCopy( saberHitLocation, g_saberFlashPos ); + g_saberFlashTime = level.time - 50; + VectorCopy(saberHitLocation, g_saberFlashPos); } } - if ( saberHitFraction < 1.0f ) + if (saberHitFraction < 1.0f) { - if ( inFlightSaberBlocked ) + if (inFlightSaberBlocked) {//we threw a saber and it was blocked, do any effects, etc. int knockAway = 5; - if ( hitEnt - && hitOwner - && hitOwner->client - && (PM_SaberInAttack( hitOwner->client->ps.saberMove ) || PM_SaberInSpecialAttack( hitOwner->client->ps.torsoAnim ) || PM_SpinningSaberAnim( hitOwner->client->ps.torsoAnim )) ) + if (hitEnt + && hitOwner + && hitOwner->client + && (PM_SaberInAttack(hitOwner->client->ps.saberMove) || PM_SaberInSpecialAttack(hitOwner->client->ps.torsoAnim) || PM_SpinningSaberAnim(hitOwner->client->ps.torsoAnim))) {//if hit someone who was in an attack or spin anim, more likely to have in-flight saber knocked away - if ( hitOwnerPowerLevel > FORCE_LEVEL_2 ) + if (hitOwnerPowerLevel > FORCE_LEVEL_2) {//strong attacks almost always knock it aside! knockAway = 1; } @@ -5623,216 +6213,216 @@ void WP_SaberDamageTrace( gentity_t *ent, int saberNum, int bladeNum ) {//33% chance knockAway = 2; } - knockAway -= hitOwner->client->ps.SaberDisarmBonus( 0 ); + knockAway -= hitOwner->client->ps.SaberDisarmBonus(0); } - if ( Q_irand( 0, knockAway ) <= 0 || //random - ( hitOwner - && hitOwner->client - && hitOwner->NPC - && (hitOwner->NPC->aiFlags&NPCAI_BOSS_CHARACTER) - ) //or if blocked by a Boss character FIXME: or base on defense level? + if (Q_irand(0, knockAway) <= 0 || //random + (hitOwner + && hitOwner->client + && hitOwner->NPC + && (hitOwner->NPC->aiFlags&NPCAI_BOSS_CHARACTER) + ) //or if blocked by a Boss character FIXME: or base on defense level? )//FIXME: player should not auto-block a flying saber, let him override the parry with an attack to knock the saber from the air, rather than this random chance {//knock it aside and turn it off - if ( !g_saberNoEffects ) + if (!g_saberNoEffects) { - if ( !WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].hitOtherEffect ) + if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].hitOtherEffect) { - G_PlayEffect( ent->client->ps.saber[saberNum].hitOtherEffect, saberHitLocation, saberHitNormal ); + G_PlayEffect(ent->client->ps.saber[saberNum].hitOtherEffect, saberHitLocation, saberHitNormal); } - else if ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].hitOtherEffect2 ) + else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].hitOtherEffect2) { - G_PlayEffect( ent->client->ps.saber[saberNum].hitOtherEffect2, saberHitLocation, saberHitNormal ); + G_PlayEffect(ent->client->ps.saber[saberNum].hitOtherEffect2, saberHitLocation, saberHitNormal); } else { - G_PlayEffect( "saber/saber_cut", saberHitLocation, saberHitNormal ); + G_PlayEffect("saber/saber_cut", saberHitLocation, saberHitNormal); } } - if ( hitEnt ) + if (hitEnt) { vec3_t newDir; - VectorSubtract( g_entities[ent->client->ps.saberEntityNum].currentOrigin, hitEnt->currentOrigin, newDir ); - VectorNormalize( newDir ); - G_ReflectMissile( ent, &g_entities[ent->client->ps.saberEntityNum], newDir ); + VectorSubtract(g_entities[ent->client->ps.saberEntityNum].currentOrigin, hitEnt->currentOrigin, newDir); + VectorNormalize(newDir); + G_ReflectMissile(ent, &g_entities[ent->client->ps.saberEntityNum], newDir); } - Jedi_PlayDeflectSound( hitOwner ); - WP_SaberDrop( ent, &g_entities[ent->client->ps.saberEntityNum] ); + Jedi_PlayDeflectSound(hitOwner); + WP_SaberDrop(ent, &g_entities[ent->client->ps.saberEntityNum]); } else { - if ( !Q_irand( 0, 2 ) && hitEnt ) + if (!Q_irand(0, 2) && hitEnt) { vec3_t newDir; - VectorSubtract( g_entities[ent->client->ps.saberEntityNum].currentOrigin, hitEnt->currentOrigin, newDir ); - VectorNormalize( newDir ); - G_ReflectMissile( ent, &g_entities[ent->client->ps.saberEntityNum], newDir ); + VectorSubtract(g_entities[ent->client->ps.saberEntityNum].currentOrigin, hitEnt->currentOrigin, newDir); + VectorNormalize(newDir); + G_ReflectMissile(ent, &g_entities[ent->client->ps.saberEntityNum], newDir); } - WP_SaberReturn( ent, &g_entities[ent->client->ps.saberEntityNum] ); + WP_SaberReturn(ent, &g_entities[ent->client->ps.saberEntityNum]); } } } } - if ( ent->client->ps.saberLockTime > level.time ) + if (ent->client->ps.saberLockTime > level.time) { - if ( ent->s.number < ent->client->ps.saberLockEnemy - && !Q_irand( 0, 3 ) ) + if (ent->s.number < ent->client->ps.saberLockEnemy + && !Q_irand(0, 3)) {//need to make some kind of effect - vec3_t hitNorm = {0,0,1}; - if ( WP_SabersIntersection( ent, &g_entities[ent->client->ps.saberLockEnemy], g_saberFlashPos ) ) + vec3_t hitNorm = { 0, 0, 1 }; + if (WP_SabersIntersection(ent, &g_entities[ent->client->ps.saberLockEnemy], g_saberFlashPos)) { - if ( Q_irand( 0, 10 ) ) + if (Q_irand(0, 10)) { - if ( !g_saberNoEffects ) + if (!g_saberNoEffects) { - WP_SaberBlockEffect( ent, saberNum, bladeNum, g_saberFlashPos, hitNorm, qfalse ); + WP_SaberBlockEffect(ent, saberNum, bladeNum, g_saberFlashPos, hitNorm, qfalse); } } else { - if ( !g_noClashFlare ) + if (!g_noClashFlare) { - g_saberFlashTime = level.time-50; + g_saberFlashTime = level.time - 50; } - if ( !g_saberNoEffects ) + if (!g_saberNoEffects) { - WP_SaberBlockEffect( ent, saberNum, bladeNum, g_saberFlashPos, hitNorm, qtrue ); + WP_SaberBlockEffect(ent, saberNum, bladeNum, g_saberFlashPos, hitNorm, qtrue); } } - WP_SaberBlockSound( ent, &g_entities[ent->client->ps.saberLockEnemy], 0, 0 ); + WP_SaberBlockSound(ent, &g_entities[ent->client->ps.saberLockEnemy], 0, 0); } } } else { - if ( hit_wall + if (hit_wall && (ent->client->ps.saber[saberNum].saberFlags&SFL_BOUNCE_ON_WALLS) - && (PM_SaberInAttackPure( ent->client->ps.saberMove ) //only in a normal attack anim - || ent->client->ps.saberMove == LS_A_JUMP_T__B_ ) //or in the strong jump-fwd-attack "death from above" move + && (PM_SaberInAttackPure(ent->client->ps.saberMove) //only in a normal attack anim + || ent->client->ps.saberMove == LS_A_JUMP_T__B_) //or in the strong jump-fwd-attack "death from above" move ) {//bounce off walls //do anim ent->client->ps.saberBlocked = BLOCKED_ATK_BOUNCE; - ent->client->ps.saberBounceMove = LS_D1_BR+(saberMoveData[ent->client->ps.saberMove].startQuad-Q_BR); + ent->client->ps.saberBounceMove = LS_D1_BR + (saberMoveData[ent->client->ps.saberMove].startQuad - Q_BR); //do bounce sound & force feedback - WP_SaberBounceOnWallSound( ent, saberNum, bladeNum ); + WP_SaberBounceOnWallSound(ent, saberNum, bladeNum); //do hit effect - if ( !g_saberNoEffects ) + if (!g_saberNoEffects) { - if ( !WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].hitOtherEffect ) + if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].hitOtherEffect) { - G_PlayEffect( ent->client->ps.saber[saberNum].hitOtherEffect, saberHitLocation, saberHitNormal ); + G_PlayEffect(ent->client->ps.saber[saberNum].hitOtherEffect, saberHitLocation, saberHitNormal); } - else if ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].hitOtherEffect2 ) + else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].hitOtherEffect2) { - G_PlayEffect( ent->client->ps.saber[saberNum].hitOtherEffect2, saberHitLocation, saberHitNormal ); + G_PlayEffect(ent->client->ps.saber[saberNum].hitOtherEffect2, saberHitLocation, saberHitNormal); } else { - G_PlayEffect( "saber/saber_cut", saberHitLocation, saberHitNormal ); + G_PlayEffect("saber/saber_cut", saberHitLocation, saberHitNormal); } } //do radius damage/knockback, if any - if ( !WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) ) + if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum)) { - WP_SaberRadiusDamage( ent, saberHitLocation, ent->client->ps.saber[saberNum].splashRadius, ent->client->ps.saber[saberNum].splashDamage, ent->client->ps.saber[saberNum].splashKnockback ); + WP_SaberRadiusDamage(ent, saberHitLocation, ent->client->ps.saber[saberNum].splashRadius, ent->client->ps.saber[saberNum].splashDamage, ent->client->ps.saber[saberNum].splashKnockback); } else { - WP_SaberRadiusDamage( ent, saberHitLocation, ent->client->ps.saber[saberNum].splashRadius2, ent->client->ps.saber[saberNum].splashDamage2, ent->client->ps.saber[saberNum].splashKnockback2 ); + WP_SaberRadiusDamage(ent, saberHitLocation, ent->client->ps.saber[saberNum].splashRadius2, ent->client->ps.saber[saberNum].splashDamage2, ent->client->ps.saber[saberNum].splashKnockback2); } } } - if ( WP_SaberApplyDamage( ent, baseDamage, baseDFlags, brokenParry, saberNum, bladeNum, (qboolean)(saberNum==0&&ent->client->ps.saberInFlight) ) ) + if (WP_SaberApplyDamage(ent, baseDamage, baseDFlags, brokenParry, saberNum, bladeNum, (qboolean)(saberNum == 0 && ent->client->ps.saberInFlight))) {//actually did damage to something #ifndef FINAL_BUILD - if ( d_saberCombat->integer ) + if (d_saberCombat->integer) { - gi.Printf( "base damage was %4.2f\n", baseDamage ); + gi.Printf("base damage was %4.2f\n", baseDamage); } #endif - WP_SaberHitSound( ent, saberNum, bladeNum ); + WP_SaberHitSound(ent, saberNum, bladeNum); } - - if ( hit_wall ) + + if (hit_wall) { //just so Jedi knows that he hit a wall ent->client->ps.saberEventFlags |= SEF_HITWALL; - if ( ent->s.number == 0 ) + if (ent->s.number == 0) { - AddSoundEvent( ent, ent->currentOrigin, 128, AEL_DISCOVERED, qfalse, qtrue );//FIXME: is this impact on ground or not? - AddSightEvent( ent, ent->currentOrigin, 256, AEL_DISCOVERED, 50 ); + AddSoundEvent(ent, ent->currentOrigin, 128, AEL_DISCOVERED, qfalse, qtrue);//FIXME: is this impact on ground or not? + AddSightEvent(ent, ent->currentOrigin, 256, AEL_DISCOVERED, 50); } } } -void WP_SabersDamageTrace( gentity_t *ent, qboolean noEffects ) +void WP_SabersDamageTrace(gentity_t *ent, qboolean noEffects) { - if ( !ent->client ) + if (!ent->client) { return; } - if ( PM_SuperBreakLoseAnim( ent->client->ps.torsoAnim ) ) + if (PM_SuperBreakLoseAnim(ent->client->ps.torsoAnim)) { return; } // Saber 1. g_saberNoEffects = noEffects; - for ( int i = 0; i < ent->client->ps.saber[0].numBlades; i++ ) + for (int i = 0; i < ent->client->ps.saber[0].numBlades; i++) { // If the Blade is not active and the length is 0, don't trace it, try the next blade... - if ( !ent->client->ps.saber[0].blade[i].active && ent->client->ps.saber[0].blade[i].length == 0 ) + if (!ent->client->ps.saber[0].blade[i].active && ent->client->ps.saber[0].blade[i].length == 0) continue; - if ( i != 0 ) + if (i != 0) {//not first blade - if ( ent->client->ps.saber[0].type == SABER_BROAD || - ent->client->ps.saber[0].type == SABER_SAI || - ent->client->ps.saber[0].type == SABER_CLAW ) + if (ent->client->ps.saber[0].type == SABER_BROAD || + ent->client->ps.saber[0].type == SABER_SAI || + ent->client->ps.saber[0].type == SABER_CLAW) { g_saberNoEffects = qtrue; } } g_noClashFlare = qfalse; - if ( (!WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[0], i ) && (ent->client->ps.saber[0].saberFlags2&SFL2_NO_CLASH_FLARE) ) - || ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[0], i ) && (ent->client->ps.saber[0].saberFlags2&SFL2_NO_CLASH_FLARE2) ) ) + if ((!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[0], i) && (ent->client->ps.saber[0].saberFlags2&SFL2_NO_CLASH_FLARE)) + || (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[0], i) && (ent->client->ps.saber[0].saberFlags2&SFL2_NO_CLASH_FLARE2))) { g_noClashFlare = qtrue; } - WP_SaberDamageTrace( ent, 0, i ); + WP_SaberDamageTrace(ent, 0, i); } // Saber 2. g_saberNoEffects = noEffects; - if ( ent->client->ps.dualSabers ) + if (ent->client->ps.dualSabers) { - for ( int i = 0; i < ent->client->ps.saber[1].numBlades; i++ ) + for (int i = 0; i < ent->client->ps.saber[1].numBlades; i++) { // If the Blade is not active and the length is 0, don't trace it, try the next blade... - if ( !ent->client->ps.saber[1].blade[i].active && ent->client->ps.saber[1].blade[i].length == 0 ) + if (!ent->client->ps.saber[1].blade[i].active && ent->client->ps.saber[1].blade[i].length == 0) continue; - if ( i != 0 ) + if (i != 0) {//not first blade - if ( ent->client->ps.saber[1].type == SABER_BROAD || - ent->client->ps.saber[1].type == SABER_SAI || - ent->client->ps.saber[1].type == SABER_CLAW ) + if (ent->client->ps.saber[1].type == SABER_BROAD || + ent->client->ps.saber[1].type == SABER_SAI || + ent->client->ps.saber[1].type == SABER_CLAW) { g_saberNoEffects = qtrue; } } g_noClashFlare = qfalse; - if ( (!WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[1], i ) && (ent->client->ps.saber[1].saberFlags2&SFL2_NO_CLASH_FLARE) ) - || ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[1], i ) && (ent->client->ps.saber[1].saberFlags2&SFL2_NO_CLASH_FLARE2) ) ) + if ((!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[1], i) && (ent->client->ps.saber[1].saberFlags2&SFL2_NO_CLASH_FLARE)) + || (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[1], i) && (ent->client->ps.saber[1].saberFlags2&SFL2_NO_CLASH_FLARE2))) { g_noClashFlare = qtrue; } - WP_SaberDamageTrace( ent, 1, i ); + WP_SaberDamageTrace(ent, 1, i); } } g_saberNoEffects = qfalse; @@ -5852,126 +6442,126 @@ WP_SaberImpact ================ */ -void WP_SaberImpact( gentity_t *owner, gentity_t *saber, trace_t *trace ) +void WP_SaberImpact(gentity_t *owner, gentity_t *saber, trace_t *trace) { gentity_t *other; other = &g_entities[trace->entityNum]; - if ( other->takedamage && (other->svFlags&SVF_BBRUSH) ) + if (other->takedamage && (other->svFlags&SVF_BBRUSH)) {//a breakable brush? break it! - if ( (other->spawnflags&1)//INVINCIBLE - ||(other->flags&FL_DMG_BY_HEAVY_WEAP_ONLY) )//HEAVY weapon damage only + if ((other->spawnflags & 1)//INVINCIBLE + || (other->flags&FL_DMG_BY_HEAVY_WEAP_ONLY))//HEAVY weapon damage only {//can't actually break it //no hit effect (besides regular client-side one) } - else if ( other->NPC_targetname && - (!owner||!owner->targetname||Q_stricmp(owner->targetname,other->NPC_targetname)) ) + else if (other->NPC_targetname && + (!owner || !owner->targetname || Q_stricmp(owner->targetname, other->NPC_targetname))) {//only breakable by an entity who is not the attacker //no hit effect (besides regular client-side one) } else { vec3_t dir; - VectorCopy( saber->s.pos.trDelta, dir ); - VectorNormalize( dir ); + VectorCopy(saber->s.pos.trDelta, dir); + VectorNormalize(dir); - int dmg = other->health*2; - if ( other->health > 50 && dmg > 20 && !(other->svFlags&SVF_GLASS_BRUSH) ) + int dmg = other->health * 2; + if (other->health > 50 && dmg > 20 && !(other->svFlags&SVF_GLASS_BRUSH)) { dmg = 20; } - G_Damage( other, saber, owner, dir, trace->endpos, dmg, 0, MOD_SABER ); - if ( owner + G_Damage(other, saber, owner, dir, trace->endpos, dmg, 0, MOD_SABER); + if (owner && owner->client - && owner->client->ps.saber[0].hitOtherEffect ) + && owner->client->ps.saber[0].hitOtherEffect) { - G_PlayEffect( owner->client->ps.saber[0].hitOtherEffect, trace->endpos, dir ); + G_PlayEffect(owner->client->ps.saber[0].hitOtherEffect, trace->endpos, dir); } else { - G_PlayEffect( "saber/saber_cut", trace->endpos, dir ); + G_PlayEffect("saber/saber_cut", trace->endpos, dir); } - if ( owner->s.number == 0 ) + if (owner->s.number == 0) { - AddSoundEvent( owner, trace->endpos, 256, AEL_DISCOVERED ); - AddSightEvent( owner, trace->endpos, 512, AEL_DISCOVERED, 50 ); + AddSoundEvent(owner, trace->endpos, 256, AEL_DISCOVERED); + AddSightEvent(owner, trace->endpos, 512, AEL_DISCOVERED, 50); } - return; + return; } } - if ( saber->s.pos.trType == TR_LINEAR ) + if (saber->s.pos.trType == TR_LINEAR) { //hit a wall? send it back - WP_SaberReturn( saber->owner, saber ); + WP_SaberReturn(saber->owner, saber); } - if ( other && !other->client && (other->contents&CONTENTS_LIGHTSABER) )//&& other->s.weapon == WP_SABER ) + if (other && !other->client && (other->contents&CONTENTS_LIGHTSABER))//&& other->s.weapon == WP_SABER ) {//2 in-flight sabers collided! //Big flash //FIXME: bigger effect/sound? //FIXME: STILL DOESNT WORK!!! - WP_SaberBlockSound( saber->owner, NULL, 0, 0 ); + WP_SaberBlockSound(saber->owner, NULL, 0, 0); //G_Sound( saber, G_SoundIndex( va( "sound/weapons/saber/saberblock%d.wav", Q_irand(1, 9) ) ) ); - WP_SaberBlockEffect( saber->owner, 0, 0, trace->endpos, NULL, qfalse); + WP_SaberBlockEffect(saber->owner, 0, 0, trace->endpos, NULL, qfalse); qboolean noFlare = qfalse; - if ( saber->owner + if (saber->owner && saber->owner->client - && (saber->owner->client->ps.saber[0].saberFlags2&SFL2_NO_CLASH_FLARE) ) + && (saber->owner->client->ps.saber[0].saberFlags2&SFL2_NO_CLASH_FLARE)) { noFlare = qtrue; } - if ( !noFlare ) + if (!noFlare) { - g_saberFlashTime = level.time-50; - VectorCopy( trace->endpos, g_saberFlashPos ); + g_saberFlashTime = level.time - 50; + VectorCopy(trace->endpos, g_saberFlashPos); } } - if ( owner && owner->s.number == 0 && owner->client ) + if (owner && owner->s.number == 0 && owner->client) { //Add the event - if ( owner->client->ps.SaberLength() > 0 ) + if (owner->client->ps.SaberLength() > 0) {//saber is on, very suspicious - if ( (!owner->client->ps.saberInFlight && owner->client->ps.groundEntityNum == ENTITYNUM_WORLD)//holding saber and on ground - || saber->s.pos.trType == TR_STATIONARY )//saber out there somewhere and on ground + if ((!owner->client->ps.saberInFlight && owner->client->ps.groundEntityNum == ENTITYNUM_WORLD)//holding saber and on ground + || saber->s.pos.trType == TR_STATIONARY)//saber out there somewhere and on ground {//an on-ground alert - AddSoundEvent( owner, saber->currentOrigin, 128, AEL_DISCOVERED, qfalse, qtrue ); + AddSoundEvent(owner, saber->currentOrigin, 128, AEL_DISCOVERED, qfalse, qtrue); } else {//an in-air alert - AddSoundEvent( owner, saber->currentOrigin, 128, AEL_DISCOVERED ); + AddSoundEvent(owner, saber->currentOrigin, 128, AEL_DISCOVERED); } - AddSightEvent( owner, saber->currentOrigin, 256, AEL_DISCOVERED, 50 ); + AddSightEvent(owner, saber->currentOrigin, 256, AEL_DISCOVERED, 50); } else {//saber is off, not as suspicious - AddSoundEvent( owner, saber->currentOrigin, 128, AEL_SUSPICIOUS ); - AddSightEvent( owner, saber->currentOrigin, 256, AEL_SUSPICIOUS ); + AddSoundEvent(owner, saber->currentOrigin, 128, AEL_SUSPICIOUS); + AddSightEvent(owner, saber->currentOrigin, 256, AEL_SUSPICIOUS); } } // check for bounce - if ( !other->takedamage && ( saber->s.eFlags & ( EF_BOUNCE | EF_BOUNCE_HALF ) ) ) + if (!other->takedamage && (saber->s.eFlags & (EF_BOUNCE | EF_BOUNCE_HALF))) { // Check to see if there is a bounce count - if ( saber->bounceCount ) { + if (saber->bounceCount) { // decrement number of bounces and then see if it should be done bouncing - if ( --saber->bounceCount <= 0 ) { + if (--saber->bounceCount <= 0) { // He (or she) will bounce no more (after this current bounce, that is). - saber->s.eFlags &= ~( EF_BOUNCE | EF_BOUNCE_HALF ); - if ( saber->s.pos.trType == TR_LINEAR && owner && owner->client && owner->client->ps.saberEntityState == SES_RETURNING ) + saber->s.eFlags &= ~(EF_BOUNCE | EF_BOUNCE_HALF); + if (saber->s.pos.trType == TR_LINEAR && owner && owner->client && owner->client->ps.saberEntityState == SES_RETURNING) { - WP_SaberDrop( saber->owner, saber ); + WP_SaberDrop(saber->owner, saber); } return; } - else + else {//bounced and still have bounces left - if ( saber->s.pos.trType == TR_LINEAR && owner && owner->client && owner->client->ps.saberEntityState == SES_RETURNING ) + if (saber->s.pos.trType == TR_LINEAR && owner && owner->client && owner->client->ps.saberEntityState == SES_RETURNING) {//under telekinetic control - if ( !gi.inPVS( saber->currentOrigin, owner->client->renderInfo.handRPoint ) ) + if (!gi.inPVS(saber->currentOrigin, owner->client->renderInfo.handRPoint)) {//not in the PVS of my master saber->bounceCount -= 25; } @@ -5979,21 +6569,21 @@ void WP_SaberImpact( gentity_t *owner, gentity_t *saber, trace_t *trace ) } } - if ( saber->s.pos.trType == TR_LINEAR && owner && owner->client && owner->client->ps.saberEntityState == SES_RETURNING ) + if (saber->s.pos.trType == TR_LINEAR && owner && owner->client && owner->client->ps.saberEntityState == SES_RETURNING) { //don't home for a few frames so we can get around this thing trace_t bounceTr; vec3_t end; - float owner_dist = Distance( owner->client->renderInfo.handRPoint, saber->currentOrigin ); + float owner_dist = Distance(owner->client->renderInfo.handRPoint, saber->currentOrigin); - VectorMA( saber->currentOrigin, 10, trace->plane.normal, end ); - gi.trace( &bounceTr, saber->currentOrigin, saber->mins, saber->maxs, end, owner->s.number, saber->clipmask, (EG2_Collision)0, 0 ); - VectorCopy( bounceTr.endpos, saber->currentOrigin ); - if ( owner_dist > 0 ) + VectorMA(saber->currentOrigin, 10, trace->plane.normal, end); + gi.trace(&bounceTr, saber->currentOrigin, saber->mins, saber->maxs, end, owner->s.number, saber->clipmask, (EG2_Collision)0, 0); + VectorCopy(bounceTr.endpos, saber->currentOrigin); + if (owner_dist > 0) { - if ( owner_dist > 50 ) + if (owner_dist > 50) { - owner->client->ps.saberEntityDist = owner_dist-50; + owner->client->ps.saberEntityDist = owner_dist - 50; } else { @@ -6002,62 +6592,62 @@ void WP_SaberImpact( gentity_t *owner, gentity_t *saber, trace_t *trace ) } return; } - - G_BounceMissile( saber, trace ); - - if ( saber->s.pos.trType == TR_GRAVITY ) + + G_BounceMissile(saber, trace); + + if (saber->s.pos.trType == TR_GRAVITY) {//bounced //play a bounce sound - WP_SaberFallSound( owner, saber ); + WP_SaberFallSound(owner, saber); //change rotation - VectorCopy( saber->currentAngles, saber->s.apos.trBase ); + VectorCopy(saber->currentAngles, saber->s.apos.trBase); saber->s.apos.trType = TR_LINEAR; saber->s.apos.trTime = level.time; - VectorSet( saber->s.apos.trDelta, Q_irand( -300, 300 ), Q_irand( -300, 300 ), Q_irand( -300, 300 ) ); + VectorSet(saber->s.apos.trDelta, Q_irand(-300, 300), Q_irand(-300, 300), Q_irand(-300, 300)); } //see if we stopped - else if ( saber->s.pos.trType == TR_STATIONARY ) + else if (saber->s.pos.trType == TR_STATIONARY) {//stopped //play a bounce sound - WP_SaberFallSound( owner, saber ); + WP_SaberFallSound(owner, saber); //stop rotation - VectorClear( saber->s.apos.trDelta ); - pitch_roll_for_slope( saber, trace->plane.normal, saber->currentAngles ); + VectorClear(saber->s.apos.trDelta); + pitch_roll_for_slope(saber, trace->plane.normal, saber->currentAngles); saber->currentAngles[0] += SABER_PITCH_HACK; - VectorCopy( saber->currentAngles, saber->s.apos.trBase ); + VectorCopy(saber->currentAngles, saber->s.apos.trBase); //remember when it fell so it can return automagically saber->aimDebounceTime = level.time; } } - else if ( other->client && other->health > 0 - && ( (other->NPC && (other->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) - //|| other->client->NPC_class == CLASS_ALORA - || other->client->NPC_class == CLASS_BOBAFETT - || ( other->client->ps.powerups[PW_GALAK_SHIELD] > 0 ) ) ) + else if (other->client && other->health > 0 + && ((other->NPC && (other->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) + //|| other->client->NPC_class == CLASS_ALORA + || other->client->NPC_class == CLASS_BOBAFETT + || (other->client->ps.powerups[PW_GALAK_SHIELD] > 0))) {//Luke, Desann and Tavion slap thrown sabers aside - WP_SaberDrop( owner, saber ); - WP_SaberBlockSound( owner, other, 0, 0 ); + WP_SaberDrop(owner, saber); + WP_SaberBlockSound(owner, other, 0, 0); //G_Sound( saber, G_SoundIndex( va( "sound/weapons/saber/saberblock%d.wav", Q_irand(1, 9) ) ) ); - WP_SaberBlockEffect( owner, 0, 0, trace->endpos, NULL, qfalse ); + WP_SaberBlockEffect(owner, 0, 0, trace->endpos, NULL, qfalse); qboolean noFlare = qfalse; - if ( owner + if (owner && owner->client - && (owner->client->ps.saber[0].saberFlags2&SFL2_NO_CLASH_FLARE) ) + && (owner->client->ps.saber[0].saberFlags2&SFL2_NO_CLASH_FLARE)) { noFlare = qtrue; } - if ( !noFlare ) + if (!noFlare) { - g_saberFlashTime = level.time-50; - VectorCopy( trace->endpos, g_saberFlashPos ); + g_saberFlashTime = level.time - 50; + VectorCopy(trace->endpos, g_saberFlashPos); } //FIXME: make Luke/Desann/Tavion play an attack anim or some other special anim when this happens - Jedi_PlayDeflectSound( other ); + Jedi_PlayDeflectSound(other); } } -extern float G_PointDistFromLineSegment( const vec3_t start, const vec3_t end, const vec3_t from ); -void WP_SaberInFlightReflectCheck( gentity_t *self, usercmd_t *ucmd ) +extern float G_PointDistFromLineSegment(const vec3_t start, const vec3_t end, const vec3_t from); +void WP_SaberInFlightReflectCheck(gentity_t *self, usercmd_t *ucmd) { gentity_t *ent; gentity_t *entityList[MAX_GENTITIES]; @@ -6069,84 +6659,84 @@ void WP_SaberInFlightReflectCheck( gentity_t *self, usercmd_t *ucmd ) int radius = 180; vec3_t center; vec3_t tip; - vec3_t up = {0,0,1}; + vec3_t up = { 0, 0, 1 }; qboolean willHit = qfalse; - if ( self->NPC && (self->NPC->scriptFlags&SCF_IGNORE_ALERTS) ) + if (self->NPC && (self->NPC->scriptFlags&SCF_IGNORE_ALERTS)) {//don't react to things flying at me... return; } //sanity checks: make sure we actually have a saberent - if ( self->client->ps.weapon != WP_SABER ) + if (self->client->ps.weapon != WP_SABER) { return; } - if ( !self->client->ps.saberInFlight ) + if (!self->client->ps.saberInFlight) { return; } - if ( !self->client->ps.SaberLength() ) + if (!self->client->ps.SaberLength()) { return; } - if ( self->client->ps.saberEntityNum == ENTITYNUM_NONE ) + if (self->client->ps.saberEntityNum == ENTITYNUM_NONE) { return; } gentity_t *saberent = &g_entities[self->client->ps.saberEntityNum]; - if ( !saberent ) + if (!saberent) { return; } //okay, enough damn sanity checks - VectorCopy( saberent->currentOrigin, center ); + VectorCopy(saberent->currentOrigin, center); - for ( i = 0 ; i < 3 ; i++ ) + for (i = 0; i < 3; i++) { mins[i] = center[i] - radius; maxs[i] = center[i] + radius; } - numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); + numListedEntities = gi.EntitiesInBox(mins, maxs, entityList, MAX_GENTITIES); //FIXME: check visibility? - for ( e = 0 ; e < numListedEntities ; e++ ) + for (e = 0; e < numListedEntities; e++) { - ent = entityList[ e ]; + ent = entityList[e]; if (ent == self) continue; if (ent->owner == self) continue; - if ( !(ent->inuse) ) + if (!(ent->inuse)) continue; - if ( ent->s.eType != ET_MISSILE ) + if (ent->s.eType != ET_MISSILE) { - if ( ent->client || ent->s.weapon != WP_SABER ) + if (ent->client || ent->s.weapon != WP_SABER) {//FIXME: wake up bad guys? continue; } - if ( ent->s.eFlags & EF_NODRAW ) + if (ent->s.eFlags & EF_NODRAW) { continue; } - if ( Q_stricmp( "lightsaber", ent->classname ) != 0 ) + if (Q_stricmp("lightsaber", ent->classname) != 0) {//not a lightsaber continue; } } else {//FIXME: make exploding missiles explode? - if ( ent->s.pos.trType == TR_STATIONARY ) + if (ent->s.pos.trType == TR_STATIONARY) {//nothing you can do with a stationary missile continue; } - if ( ent->splashDamage || ent->splashRadius ) + if (ent->splashDamage || ent->splashRadius) {//can't deflect exploding missiles - if ( DistanceSquared( ent->currentOrigin, center ) < 256 )//16 squared + if (DistanceSquared(ent->currentOrigin, center) < 256)//16 squared { - G_MissileImpacted( ent, saberent, ent->currentOrigin, up ); + G_MissileImpacted(ent, saberent, ent->currentOrigin, up); } continue; } @@ -6156,28 +6746,28 @@ void WP_SaberInFlightReflectCheck( gentity_t *self, usercmd_t *ucmd ) //do this for all blades willHit = qfalse; numSabers = 1; - if ( self->client->ps.dualSabers ) + if (self->client->ps.dualSabers) { numSabers = 2; } - for ( int saberNum = 0; saberNum < numSabers; saberNum++ ) + for (int saberNum = 0; saberNum < numSabers; saberNum++) { - for ( int bladeNum = 0; bladeNum < self->client->ps.saber[saberNum].numBlades; bladeNum++ ) + for (int bladeNum = 0; bladeNum < self->client->ps.saber[saberNum].numBlades; bladeNum++) { - VectorMA( self->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, self->client->ps.saber[saberNum].blade[bladeNum].length, self->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, tip ); - - if( G_PointDistFromLineSegment( self->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, tip, ent->currentOrigin ) <= 32 ) + VectorMA(self->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, self->client->ps.saber[saberNum].blade[bladeNum].length, self->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, tip); + + if (G_PointDistFromLineSegment(self->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, tip, ent->currentOrigin) <= 32) { willHit = qtrue; break; } } - if ( willHit ) + if (willHit) { break; } } - if ( !willHit ) + if (!willHit) { continue; } @@ -6187,40 +6777,40 @@ void WP_SaberInFlightReflectCheck( gentity_t *self, usercmd_t *ucmd ) } - if ( ent_count ) + if (ent_count) { vec3_t fx_dir; // we are done, do we have any to deflect? - if ( ent_count ) + if (ent_count) { - for ( int x = 0; x < ent_count; x++ ) + for (int x = 0; x < ent_count; x++) { - if ( missile_list[x]->s.weapon == WP_SABER ) + if (missile_list[x]->s.weapon == WP_SABER) {//just send it back - if ( missile_list[x]->owner && missile_list[x]->owner->client && missile_list[x]->owner->client->ps.saber[0].Active() && missile_list[x]->s.pos.trType == TR_LINEAR && missile_list[x]->owner->client->ps.saberEntityState != SES_RETURNING ) + if (missile_list[x]->owner && missile_list[x]->owner->client && missile_list[x]->owner->client->ps.saber[0].Active() && missile_list[x]->s.pos.trType == TR_LINEAR && missile_list[x]->owner->client->ps.saberEntityState != SES_RETURNING) {//it's on and being controlled //FIXME: prevent it from damaging me? - WP_SaberReturn( missile_list[x]->owner, missile_list[x] ); - VectorNormalize2( missile_list[x]->s.pos.trDelta, fx_dir ); - WP_SaberBlockEffect( self, 0, 0, missile_list[x]->currentOrigin, fx_dir, qfalse ); - if ( missile_list[x]->owner->client->ps.saberInFlight && self->client->ps.saberInFlight ) + WP_SaberReturn(missile_list[x]->owner, missile_list[x]); + VectorNormalize2(missile_list[x]->s.pos.trDelta, fx_dir); + WP_SaberBlockEffect(self, 0, 0, missile_list[x]->currentOrigin, fx_dir, qfalse); + if (missile_list[x]->owner->client->ps.saberInFlight && self->client->ps.saberInFlight) { - WP_SaberBlockSound( self, missile_list[x]->owner, 0, 0 ); + WP_SaberBlockSound(self, missile_list[x]->owner, 0, 0); //G_Sound( missile_list[x], G_SoundIndex( va( "sound/weapons/saber/saberblock%d.wav", Q_irand(1, 9) ) ) ); qboolean noFlare = qfalse; - if ( (missile_list[x]->owner->client->ps.saber[0].saberFlags2&SFL2_NO_CLASH_FLARE) - && (self->client->ps.saber[0].saberFlags2&SFL2_NO_CLASH_FLARE) ) + if ((missile_list[x]->owner->client->ps.saber[0].saberFlags2&SFL2_NO_CLASH_FLARE) + && (self->client->ps.saber[0].saberFlags2&SFL2_NO_CLASH_FLARE)) { noFlare = qtrue; } - if ( !noFlare ) + if (!noFlare) { - g_saberFlashTime = level.time-50; + g_saberFlashTime = level.time - 50; gentity_t *saber = &g_entities[self->client->ps.saberEntityNum]; vec3_t org; - VectorSubtract( missile_list[x]->currentOrigin, saber->currentOrigin, org ); - VectorMA( saber->currentOrigin, 0.5, org, org ); - VectorCopy( org, g_saberFlashPos ); + VectorSubtract(missile_list[x]->currentOrigin, saber->currentOrigin, org); + VectorMA(saber->currentOrigin, 0.5, org, org); + VectorCopy(org, g_saberFlashPos); } } } @@ -6228,68 +6818,68 @@ void WP_SaberInFlightReflectCheck( gentity_t *self, usercmd_t *ucmd ) else {//bounce it vec3_t reflectAngle, forward; - if ( self->client && !self->s.number ) + if (self->client && !self->s.number) { self->client->sess.missionStats.saberBlocksCnt++; } - VectorCopy( saberent->s.apos.trBase, reflectAngle ); - reflectAngle[PITCH] = Q_flrand( -90, 90 ); - AngleVectors( reflectAngle, forward, NULL, NULL ); - - G_ReflectMissile( self, missile_list[x], forward ); + VectorCopy(saberent->s.apos.trBase, reflectAngle); + reflectAngle[PITCH] = Q_flrand(-90, 90); + AngleVectors(reflectAngle, forward, NULL, NULL); + + G_ReflectMissile(self, missile_list[x], forward); //do an effect - VectorNormalize2( missile_list[x]->s.pos.trDelta, fx_dir ); - G_PlayEffect( "blaster/deflect", missile_list[x]->currentOrigin, fx_dir ); + VectorNormalize2(missile_list[x]->s.pos.trDelta, fx_dir); + G_PlayEffect("blaster/deflect", missile_list[x]->currentOrigin, fx_dir); } } } } } -qboolean WP_SaberValidateEnemy( gentity_t *self, gentity_t *enemy ) +qboolean WP_SaberValidateEnemy(gentity_t *self, gentity_t *enemy) { - if ( !enemy ) + if (!enemy) { return qfalse; } - if ( !enemy || enemy == self || !enemy->inuse || !enemy->client ) + if (!enemy || enemy == self || !enemy->inuse || !enemy->client) {//not valid return qfalse; } - if ( enemy->health <= 0 ) + if (enemy->health <= 0) {//corpse return qfalse; } /* if ( enemy->client->ps.weapon == WP_SABER - && enemy->client->ps.SaberActive() ) + && enemy->client->ps.SaberActive() ) {//not other saber-users? - return qfalse; + return qfalse; } */ - if ( enemy->s.number >= MAX_CLIENTS ) + if (enemy->s.number >= MAX_CLIENTS) {//NPCs can cheat and use the homing saber throw 3 on the player - if ( enemy->client->ps.forcePowersKnown ) + if (enemy->client->ps.forcePowersKnown) {//not other jedi? return qfalse; } } - if ( DistanceSquared( self->client->renderInfo.handRPoint, enemy->currentOrigin ) > saberThrowDistSquared[self->client->ps.forcePowerLevel[FP_SABERTHROW]] ) + if (DistanceSquared(self->client->renderInfo.handRPoint, enemy->currentOrigin) > saberThrowDistSquared[self->client->ps.forcePowerLevel[FP_SABERTHROW]]) {//too far return qfalse; } - if ( (!InFront( enemy->currentOrigin, self->currentOrigin, self->client->ps.viewangles, 0.0f) || !G_ClearLOS( self, self->client->renderInfo.eyePoint, enemy ) ) - && ( DistanceHorizontalSquared( enemy->currentOrigin, self->currentOrigin ) > 65536 || fabs(enemy->currentOrigin[2]-self->currentOrigin[2]) > 384 ) ) + if ((!InFront(enemy->currentOrigin, self->currentOrigin, self->client->ps.viewangles, 0.0f) || !G_ClearLOS(self, self->client->renderInfo.eyePoint, enemy)) + && (DistanceHorizontalSquared(enemy->currentOrigin, self->currentOrigin) > 65536 || fabs(enemy->currentOrigin[2] - self->currentOrigin[2]) > 384)) {//(not in front or not clear LOS) & greater than 256 away return qfalse; } - if ( enemy->client->playerTeam == self->client->playerTeam ) + if (enemy->client->playerTeam == self->client->playerTeam) {//on same team return qfalse; } @@ -6299,21 +6889,21 @@ qboolean WP_SaberValidateEnemy( gentity_t *self, gentity_t *enemy ) return qtrue; } -float WP_SaberRateEnemy( gentity_t *enemy, vec3_t center, vec3_t forward, float radius ) +float WP_SaberRateEnemy(gentity_t *enemy, vec3_t center, vec3_t forward, float radius) { float rating; vec3_t dir; - VectorSubtract( enemy->currentOrigin, center, dir ); - rating = (1.0f-(VectorNormalize( dir )/radius)); - rating *= DotProduct( forward, dir ); + VectorSubtract(enemy->currentOrigin, center, dir); + rating = (1.0f - (VectorNormalize(dir) / radius)); + rating *= DotProduct(forward, dir); return rating; } -gentity_t *WP_SaberFindEnemy( gentity_t *self, gentity_t *saber ) +gentity_t *WP_SaberFindEnemy(gentity_t *self, gentity_t *saber) { -//FIXME: should be a more intelligent way of doing this, like auto aim? -//closest, most in front... did damage to... took damage from? How do we know who the player is focusing on? + //FIXME: should be a more intelligent way of doing this, like auto aim? + //closest, most in front... did damage to... took damage from? How do we know who the player is focusing on? gentity_t *ent, *bestEnt = NULL; gentity_t *entityList[MAX_GENTITIES]; int numListedEntities; @@ -6324,38 +6914,38 @@ gentity_t *WP_SaberFindEnemy( gentity_t *self, gentity_t *saber ) //FIXME: no need to do this in 1st person? fwdangles[1] = self->client->ps.viewangles[1]; - AngleVectors( fwdangles, forward, NULL, NULL ); + AngleVectors(fwdangles, forward, NULL, NULL); - VectorCopy( saber->currentOrigin, center ); + VectorCopy(saber->currentOrigin, center); - for ( i = 0 ; i < 3 ; i++ ) + for (i = 0; i < 3; i++) { mins[i] = center[i] - radius; maxs[i] = center[i] + radius; } //if the saber has an enemy from the last time it looked, init to that one - if ( WP_SaberValidateEnemy( self, saber->enemy ) ) + if (WP_SaberValidateEnemy(self, saber->enemy)) { - if ( gi.inPVS( self->currentOrigin, saber->enemy->currentOrigin ) ) + if (gi.inPVS(self->currentOrigin, saber->enemy->currentOrigin)) {//potentially visible - if ( G_ClearLOS( self, self->client->renderInfo.eyePoint, saber->enemy ) ) + if (G_ClearLOS(self, self->client->renderInfo.eyePoint, saber->enemy)) {//can see him bestEnt = saber->enemy; - bestRating = WP_SaberRateEnemy( bestEnt, center, forward, radius ); + bestRating = WP_SaberRateEnemy(bestEnt, center, forward, radius); } } } //If I have an enemy, see if that's even better - if ( WP_SaberValidateEnemy( self, self->enemy ) ) + if (WP_SaberValidateEnemy(self, self->enemy)) { - float myEnemyRating = WP_SaberRateEnemy( self->enemy, center, forward, radius ); - if ( myEnemyRating > bestRating ) + float myEnemyRating = WP_SaberRateEnemy(self->enemy, center, forward, radius); + if (myEnemyRating > bestRating) { - if ( gi.inPVS( self->currentOrigin, self->enemy->currentOrigin ) ) + if (gi.inPVS(self->currentOrigin, self->enemy->currentOrigin)) {//potentially visible - if ( G_ClearLOS( self, self->client->renderInfo.eyePoint, self->enemy ) ) + if (G_ClearLOS(self, self->client->renderInfo.eyePoint, self->enemy)) {//can see him bestEnt = self->enemy; bestRating = myEnemyRating; @@ -6364,36 +6954,36 @@ gentity_t *WP_SaberFindEnemy( gentity_t *self, gentity_t *saber ) } } - numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); - - if ( !numListedEntities ) + numListedEntities = gi.EntitiesInBox(mins, maxs, entityList, MAX_GENTITIES); + + if (!numListedEntities) {//should we clear the enemy? return bestEnt; } - for ( e = 0 ; e < numListedEntities ; e++ ) + for (e = 0; e < numListedEntities; e++) { - ent = entityList[ e ]; + ent = entityList[e]; - if ( ent == self || ent == saber || ent == bestEnt ) + if (ent == self || ent == saber || ent == bestEnt) { continue; } - if ( !WP_SaberValidateEnemy( self, ent ) ) + if (!WP_SaberValidateEnemy(self, ent)) {//doesn't meet criteria of valid look enemy (don't check current since we would have done that before this func's call continue; } - if ( !gi.inPVS( self->currentOrigin, ent->currentOrigin ) ) + if (!gi.inPVS(self->currentOrigin, ent->currentOrigin)) {//not even potentially visible continue; } - if ( !G_ClearLOS( self, self->client->renderInfo.eyePoint, ent ) ) + if (!G_ClearLOS(self, self->client->renderInfo.eyePoint, ent)) {//can't see him continue; } //rate him based on how close & how in front he is - rating = WP_SaberRateEnemy( ent, center, forward, radius ); - if ( rating > bestRating ) + rating = WP_SaberRateEnemy(ent, center, forward, radius); + if (rating > bestRating) { bestEnt = ent; bestRating = rating; @@ -6402,105 +6992,105 @@ gentity_t *WP_SaberFindEnemy( gentity_t *self, gentity_t *saber ) return bestEnt; } -void WP_RunSaber( gentity_t *self, gentity_t *saber ) +void WP_RunSaber(gentity_t *self, gentity_t *saber) { vec3_t origin, oldOrg; trace_t tr; - VectorCopy( saber->currentOrigin, oldOrg ); + VectorCopy(saber->currentOrigin, oldOrg); // get current position - EvaluateTrajectory( &saber->s.pos, level.time, origin ); + EvaluateTrajectory(&saber->s.pos, level.time, origin); // get current angles - EvaluateTrajectory( &saber->s.apos, level.time, saber->currentAngles ); + EvaluateTrajectory(&saber->s.apos, level.time, saber->currentAngles); // trace a line from the previous position to the current position, // ignoring interactions with the missile owner int clipmask = saber->clipmask; - if ( !self || !self->client || self->client->ps.SaberLength() <= 0 ) + if (!self || !self->client || self->client->ps.SaberLength() <= 0) {//don't keep hitting other sabers when turned off clipmask &= ~CONTENTS_LIGHTSABER; } - gi.trace( &tr, saber->currentOrigin, saber->mins, saber->maxs, origin, - saber->owner ? saber->owner->s.number : ENTITYNUM_NONE, clipmask, (EG2_Collision)0, 0 ); + gi.trace(&tr, saber->currentOrigin, saber->mins, saber->maxs, origin, + saber->owner ? saber->owner->s.number : ENTITYNUM_NONE, clipmask, (EG2_Collision)0, 0); - VectorCopy( tr.endpos, saber->currentOrigin ); + VectorCopy(tr.endpos, saber->currentOrigin); - if ( self->client->ps.SaberActive() ) + if (self->client->ps.SaberActive()) { - if ( self->client->ps.saberInFlight || (self->client->ps.weaponTime&&!Q_irand( 0, 100 )) ) + if (self->client->ps.saberInFlight || (self->client->ps.weaponTime&&!Q_irand(0, 100))) {//make enemies run from a lit saber in flight or from me when I'm attacking - if ( !Q_irand( 0, 10 ) ) + if (!Q_irand(0, 10)) {//not so often... - AddSightEvent( self, saber->currentOrigin, self->client->ps.SaberLength()*3, AEL_DANGER, 100 ); + AddSightEvent(self, saber->currentOrigin, self->client->ps.SaberLength() * 3, AEL_DANGER, 100); } } } - if ( tr.startsolid ) + if (tr.startsolid) { tr.fraction = 0; } - gi.linkentity( saber ); + gi.linkentity(saber); //touch push triggers? - if ( tr.fraction != 1 ) + if (tr.fraction != 1) { - WP_SaberImpact( self, saber, &tr ); + WP_SaberImpact(self, saber, &tr); } - if ( saber->s.pos.trType == TR_LINEAR ) + if (saber->s.pos.trType == TR_LINEAR) {//home //figure out where saber should be - vec3_t forward, saberHome, saberDest, fwdangles = {0}; + vec3_t forward, saberHome, saberDest, fwdangles = { 0 }; - VectorCopy( self->client->ps.viewangles, fwdangles ); - if ( self->s.number ) + VectorCopy(self->client->ps.viewangles, fwdangles); + if (self->s.number) { fwdangles[0] -= 8; } - else if ( cg.renderingThirdPerson ) + else if (cg.renderingThirdPerson) { fwdangles[0] -= 5; } - if ( self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_1 - || self->client->ps.saberEntityState == SES_RETURNING - || VectorCompare( saber->s.pos.trDelta, vec3_origin ) ) + if (self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_1 + || self->client->ps.saberEntityState == SES_RETURNING + || VectorCompare(saber->s.pos.trDelta, vec3_origin)) {//control if it's returning or just starting float saberSpeed = 500;//FIXME: based on force level? float dist; gentity_t *enemy = NULL; - AngleVectors( fwdangles, forward, NULL, NULL ); + AngleVectors(fwdangles, forward, NULL, NULL); - if ( self->client->ps.saberEntityDist < 100 ) + if (self->client->ps.saberEntityDist < 100) {//make the saber head to my hand- the bolt it was attached to - VectorCopy( self->client->renderInfo.handRPoint, saberHome ); + VectorCopy(self->client->renderInfo.handRPoint, saberHome); } else {//aim saber from eyes - VectorCopy( self->client->renderInfo.eyePoint, saberHome ); + VectorCopy(self->client->renderInfo.eyePoint, saberHome); } - VectorMA( saberHome, self->client->ps.saberEntityDist, forward, saberDest ); + VectorMA(saberHome, self->client->ps.saberEntityDist, forward, saberDest); - if ( self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_2 - && self->client->ps.saberEntityState == SES_LEAVING ) + if (self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_2 + && self->client->ps.saberEntityState == SES_LEAVING) {//max level - if ( self->enemy && - !WP_SaberValidateEnemy( self, self->enemy ) ) + if (self->enemy && + !WP_SaberValidateEnemy(self, self->enemy)) {//if my enemy isn't valid to auto-aim at, don't autoaim } else { //pick an enemy - enemy = WP_SaberFindEnemy( self, saber ); - if ( enemy ) + enemy = WP_SaberFindEnemy(self, saber); + if (enemy) {//home in on enemy - float enemyDist = Distance( self->client->renderInfo.handRPoint, enemy->currentOrigin ); - VectorCopy( enemy->currentOrigin, saberDest ); - saberDest[2] += enemy->maxs[2]/2.0f;//FIXME: when in a knockdown anim, the saber float above them... do we care? + float enemyDist = Distance(self->client->renderInfo.handRPoint, enemy->currentOrigin); + VectorCopy(enemy->currentOrigin, saberDest); + saberDest[2] += enemy->maxs[2] / 2.0f;//FIXME: when in a knockdown anim, the saber float above them... do we care? self->client->ps.saberEntityDist = enemyDist; //once you pick an enemy, stay with it! saber->enemy = enemy; @@ -6508,24 +7098,24 @@ void WP_RunSaber( gentity_t *self, gentity_t *saber ) } } } - + //Make the saber head there - VectorSubtract( saberDest, saber->currentOrigin, saber->s.pos.trDelta ); - dist = VectorNormalize( saber->s.pos.trDelta ); - if ( self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_2 && self->client->ps.saberEntityState == SES_LEAVING && !enemy ) + VectorSubtract(saberDest, saber->currentOrigin, saber->s.pos.trDelta); + dist = VectorNormalize(saber->s.pos.trDelta); + if (self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_2 && self->client->ps.saberEntityState == SES_LEAVING && !enemy) { - if ( dist < 200 ) + if (dist < 200) { - saberSpeed = 400 - (dist*2); + saberSpeed = 400 - (dist * 2); } } - else if ( self->client->ps.saberEntityState == SES_LEAVING && dist < 50 ) + else if (self->client->ps.saberEntityState == SES_LEAVING && dist < 50) { saberSpeed = dist * 2 + 30; - if ( (enemy && dist > enemy->maxs[0]) || (!enemy && dist > 24) ) + if ((enemy && dist > enemy->maxs[0]) || (!enemy && dist > 24)) {//auto-tracking an enemy and we can't hit him - if ( saberSpeed < 120 ) + if (saberSpeed < 120) {//clamp to a minimum speed saberSpeed = 120; } @@ -6534,135 +7124,135 @@ void WP_RunSaber( gentity_t *self, gentity_t *saber ) /* if ( self->client->ps.saberEntityState == SES_RETURNING ) {//FIXME: if returning, move faster? - saberSpeed = 800; - if ( dist < 200 ) - { - saberSpeed -= 400 - (dist*2); - } + saberSpeed = 800; + if ( dist < 200 ) + { + saberSpeed -= 400 - (dist*2); + } } */ - VectorScale( saber->s.pos.trDelta, saberSpeed, saber->s.pos.trDelta ); + VectorScale(saber->s.pos.trDelta, saberSpeed, saber->s.pos.trDelta); //SnapVector( saber->s.pos.trDelta ); // save net bandwidth - VectorCopy( saber->currentOrigin, saber->s.pos.trBase ); + VectorCopy(saber->currentOrigin, saber->s.pos.trBase); saber->s.pos.trTime = level.time; saber->s.pos.trType = TR_LINEAR; } else { - VectorCopy( saber->currentOrigin, saber->s.pos.trBase ); + VectorCopy(saber->currentOrigin, saber->s.pos.trBase); saber->s.pos.trTime = level.time; saber->s.pos.trType = TR_LINEAR; } //if it's heading back, point it's base at us - if ( self->client->ps.saberEntityState == SES_RETURNING - && !(self->client->ps.saber[0].saberFlags&SFL_RETURN_DAMAGE) )//type != SABER_STAR ) + if (self->client->ps.saberEntityState == SES_RETURNING + && !(self->client->ps.saber[0].saberFlags&SFL_RETURN_DAMAGE))//type != SABER_STAR ) { fwdangles[0] += SABER_PITCH_HACK; - VectorCopy( fwdangles, saber->s.apos.trBase ); + VectorCopy(fwdangles, saber->s.apos.trBase); saber->s.apos.trTime = level.time; saber->s.apos.trType = TR_INTERPOLATE; - VectorClear( saber->s.apos.trDelta ); + VectorClear(saber->s.apos.trDelta); } } } -qboolean WP_SaberLaunch( gentity_t *self, gentity_t *saber, qboolean thrown, qboolean noFail = qfalse ) +qboolean WP_SaberLaunch(gentity_t *self, gentity_t *saber, qboolean thrown, qboolean noFail = qfalse) {//FIXME: probably need a debounce time - vec3_t saberMins={-3.0f,-3.0f,-3.0f}; - vec3_t saberMaxs={3.0f,3.0f,3.0f}; + vec3_t saberMins = { -3.0f, -3.0f, -3.0f }; + vec3_t saberMaxs = { 3.0f, 3.0f, 3.0f }; trace_t trace; - if ( self->client->NPC_class == CLASS_SABER_DROID ) + if (self->client->NPC_class == CLASS_SABER_DROID) {//saber droids can't drop their saber return qfalse; } - if ( !noFail ) + if (!noFail) { - if ( thrown ) + if (thrown) {//this is a regular throw, so see if it's legal - if ( self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_2) { - if ( !WP_ForcePowerUsable( self, FP_SABERTHROW, 20 ) ) + if (!WP_ForcePowerUsable(self, FP_SABERTHROW, 20)) { return qfalse; } } else { - if ( !WP_ForcePowerUsable( self, FP_SABERTHROW, 0 ) ) + if (!WP_ForcePowerUsable(self, FP_SABERTHROW, 0)) { return qfalse; } } } - if ( !self->s.number && (cg.zoomMode || in_camera) ) + if (!self->s.number && (cg.zoomMode || in_camera)) {//can't saber throw when zoomed in or in cinematic return qfalse; } //make sure it won't start in solid - gi.trace( &trace, self->client->renderInfo.handRPoint, saberMins, saberMaxs, self->client->renderInfo.handRPoint, saber->s.number, MASK_SOLID, (EG2_Collision)0, 0 ); - if ( trace.startsolid || trace.allsolid ) + gi.trace(&trace, self->client->renderInfo.handRPoint, saberMins, saberMaxs, self->client->renderInfo.handRPoint, saber->s.number, MASK_SOLID, (EG2_Collision)0, 0); + if (trace.startsolid || trace.allsolid) { return qfalse; } //make sure I'm not throwing it on the other side of a door or wall or whatever - gi.trace( &trace, self->currentOrigin, vec3_origin, vec3_origin, self->client->renderInfo.handRPoint, self->s.number, MASK_SOLID, (EG2_Collision)0, 0 ); - if ( trace.startsolid || trace.allsolid || trace.fraction < 1.0f ) + gi.trace(&trace, self->currentOrigin, vec3_origin, vec3_origin, self->client->renderInfo.handRPoint, self->s.number, MASK_SOLID, (EG2_Collision)0, 0); + if (trace.startsolid || trace.allsolid || trace.fraction < 1.0f) { return qfalse; } - if ( thrown ) + if (thrown) {//this is a regular throw, so take force power - if ( self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_2) {//at max skill, the cost increases as keep it out - WP_ForcePowerStart( self, FP_SABERTHROW, 10 ); + WP_ForcePowerStart(self, FP_SABERTHROW, 10); } else { - WP_ForcePowerStart( self, FP_SABERTHROW, 0 ); + WP_ForcePowerStart(self, FP_SABERTHROW, 0); } } } //clear the enemy saber->enemy = NULL; -//===FIXME!!!============================================================================================== + //===FIXME!!!============================================================================================== //We should copy the right-hand saber's g2 instance to the thrown saber //Then back again when you catch it!!! -//===FIXME!!!============================================================================================== + //===FIXME!!!============================================================================================== //draw it saber->s.eFlags &= ~EF_NODRAW; saber->svFlags |= SVF_BROADCAST; saber->svFlags &= ~SVF_NOCLIENT; - + //place it - VectorCopy( self->client->renderInfo.handRPoint, saber->currentOrigin );//muzzlePoint - VectorCopy( saber->currentOrigin, saber->s.pos.trBase ); + VectorCopy(self->client->renderInfo.handRPoint, saber->currentOrigin);//muzzlePoint + VectorCopy(saber->currentOrigin, saber->s.pos.trBase); saber->s.pos.trTime = level.time; saber->s.pos.trType = TR_LINEAR; - VectorClear( saber->s.pos.trDelta ); - gi.linkentity( saber ); + VectorClear(saber->s.pos.trDelta); + gi.linkentity(saber); //spin it - VectorClear( saber->s.apos.trBase ); + VectorClear(saber->s.apos.trBase); saber->s.apos.trTime = level.time; saber->s.apos.trType = TR_LINEAR; - if ( self->health > 0 && thrown ) + if (self->health > 0 && thrown) {//throwing it saber->s.apos.trBase[1] = self->client->ps.viewangles[1]; saber->s.apos.trBase[0] = SABER_PITCH_HACK; } else {//dropping it - vectoangles( self->client->renderInfo.muzzleDir, saber->s.apos.trBase ); + vectoangles(self->client->renderInfo.muzzleDir, saber->s.apos.trBase); } - VectorClear( saber->s.apos.trDelta ); + VectorClear(saber->s.apos.trDelta); - switch ( self->client->ps.forcePowerLevel[FP_SABERTHROW] ) + switch (self->client->ps.forcePowerLevel[FP_SABERTHROW]) {//FIXME: make a table? default: case FORCE_LEVEL_1: @@ -6685,21 +7275,21 @@ qboolean WP_SaberLaunch( gentity_t *self, gentity_t *saber, qboolean thrown, qbo { self->client->ps.forcePowerDebounce[FP_SABERTHROW] = level.time + 1000;//so we can keep it out for a minimum amount of time } - - if ( thrown ) + + if (thrown) {//this is a regular throw, so turn the saber on //turn saber on - if ( (self->client->ps.saber[0].saberFlags&SFL_SINGLE_BLADE_THROWABLE) )//SaberStaff() ) + if ((self->client->ps.saber[0].saberFlags&SFL_SINGLE_BLADE_THROWABLE))//SaberStaff() ) {//only first blade can be on - if ( !self->client->ps.saber[0].blade[0].active ) + if (!self->client->ps.saber[0].blade[0].active) {//turn on first one - self->client->ps.SaberBladeActivate( 0, 0 ); + self->client->ps.SaberBladeActivate(0, 0); } - for ( int i = 1; i < self->client->ps.saber[0].numBlades; i++ ) + for (int i = 1; i < self->client->ps.saber[0].numBlades; i++) {//turn off all others - if ( self->client->ps.saber[0].blade[i].active ) + if (self->client->ps.saber[0].blade[i].active) { - self->client->ps.SaberBladeActivate( 0, i, qfalse ); + self->client->ps.SaberBladeActivate(0, i, qfalse); } } } @@ -6709,17 +7299,17 @@ qboolean WP_SaberLaunch( gentity_t *self, gentity_t *saber, qboolean thrown, qbo //self->client->ps.SaberActivate(); } //turn on the saber trail - self->client->ps.saber[0].ActivateTrail( 150 ); + self->client->ps.saber[0].ActivateTrail(150); } //reset the mins - VectorCopy( saberMins, saber->mins ); - VectorCopy( saberMaxs, saber->maxs ); + VectorCopy(saberMins, saber->mins); + VectorCopy(saberMaxs, saber->maxs); saber->contents = 0;//CONTENTS_LIGHTSABER; saber->clipmask = MASK_SOLID | CONTENTS_LIGHTSABER; // remove the ghoul2 right-hand saber model on the player - if ( self->weaponModel[0] > 0 ) + if (self->weaponModel[0] > 0) { gi.G2API_RemoveGhoul2Model(self->ghoul2, self->weaponModel[0]); self->weaponModel[0] = -1; @@ -6728,18 +7318,18 @@ qboolean WP_SaberLaunch( gentity_t *self, gentity_t *saber, qboolean thrown, qbo return qtrue; } -qboolean WP_SaberLose( gentity_t *self, vec3_t throwDir ) +qboolean WP_SaberLose(gentity_t *self, vec3_t throwDir) { - if ( !self || !self->client || self->client->ps.saberEntityNum <= 0 ) + if (!self || !self->client || self->client->ps.saberEntityNum <= 0) {//WTF?!! We lost it already? return qfalse; } - if ( self->client->NPC_class == CLASS_SABER_DROID ) + if (self->client->NPC_class == CLASS_SABER_DROID) {//saber droids can't drop their saber return qfalse; } gentity_t *dropped = &g_entities[self->client->ps.saberEntityNum]; - if ( !self->client->ps.saberInFlight ) + if (!self->client->ps.saberInFlight) {//not alreay in air /* qboolean noForceThrow = qfalse; @@ -6747,97 +7337,97 @@ qboolean WP_SaberLose( gentity_t *self, vec3_t throwDir ) self->client->ps.forcePowersKnown |= (1<client->ps.forcePowerLevel[FP_SABERTHROW] < FORCE_LEVEL_1 ) { - noForceThrow = qtrue; - self->client->ps.forcePowerLevel[FP_SABERTHROW] = FORCE_LEVEL_1; + noForceThrow = qtrue; + self->client->ps.forcePowerLevel[FP_SABERTHROW] = FORCE_LEVEL_1; } */ //throw it - if ( !WP_SaberLaunch( self, dropped, qfalse ) ) + if (!WP_SaberLaunch(self, dropped, qfalse)) {//couldn't throw it return qfalse; } /* if ( noForceThrow ) { - self->client->ps.forcePowerLevel[FP_SABERTHROW] = FORCE_LEVEL_0; + self->client->ps.forcePowerLevel[FP_SABERTHROW] = FORCE_LEVEL_0; } */ } - if ( self->client->ps.saber[0].Active() ) + if (self->client->ps.saber[0].Active()) {//on //drop it instantly - WP_SaberDrop( self, dropped ); + WP_SaberDrop(self, dropped); } //optionally give it some thrown velocity - if ( throwDir && !VectorCompare( throwDir, vec3_origin ) ) + if (throwDir && !VectorCompare(throwDir, vec3_origin)) { - VectorCopy( throwDir, dropped->s.pos.trDelta ); + VectorCopy(throwDir, dropped->s.pos.trDelta); } //don't pull it back on the next frame - if ( self->NPC ) + if (self->NPC) { self->NPC->last_ucmd.buttons &= ~BUTTON_ATTACK; } return qtrue; } -void WP_SetSaberOrigin( gentity_t *self, vec3_t newOrg ) +void WP_SetSaberOrigin(gentity_t *self, vec3_t newOrg) { - if ( !self || !self->client ) + if (!self || !self->client) { return; } - if ( self->client->ps.saberEntityNum <= 0 || self->client->ps.saberEntityNum >= ENTITYNUM_WORLD ) + if (self->client->ps.saberEntityNum <= 0 || self->client->ps.saberEntityNum >= ENTITYNUM_WORLD) {//no saber ent to reposition return; } - if ( self->client->NPC_class == CLASS_SABER_DROID ) + if (self->client->NPC_class == CLASS_SABER_DROID) {//saber droids can't drop their saber return; } gentity_t *dropped = &g_entities[self->client->ps.saberEntityNum]; - if ( !self->client->ps.saberInFlight ) + if (!self->client->ps.saberInFlight) {//not already in air qboolean noForceThrow = qfalse; //make it so we can throw it - self->client->ps.forcePowersKnown |= (1<client->ps.forcePowerLevel[FP_SABERTHROW] < FORCE_LEVEL_1 ) + self->client->ps.forcePowersKnown |= (1 << FP_SABERTHROW); + if (self->client->ps.forcePowerLevel[FP_SABERTHROW] < FORCE_LEVEL_1) { noForceThrow = qtrue; self->client->ps.forcePowerLevel[FP_SABERTHROW] = FORCE_LEVEL_1; } //throw it - if ( !WP_SaberLaunch( self, dropped, qfalse, qtrue ) ) + if (!WP_SaberLaunch(self, dropped, qfalse, qtrue)) {//couldn't throw it return; } - if ( noForceThrow ) + if (noForceThrow) { self->client->ps.forcePowerLevel[FP_SABERTHROW] = FORCE_LEVEL_0; } } - VectorCopy( newOrg, dropped->s.origin ); - VectorCopy( newOrg, dropped->currentOrigin ); - VectorCopy( newOrg, dropped->s.pos.trBase ); + VectorCopy(newOrg, dropped->s.origin); + VectorCopy(newOrg, dropped->currentOrigin); + VectorCopy(newOrg, dropped->s.pos.trBase); //drop it instantly - WP_SaberDrop( self, dropped ); + WP_SaberDrop(self, dropped); //don't pull it back on the next frame - if ( self->NPC ) + if (self->NPC) { self->NPC->last_ucmd.buttons &= ~BUTTON_ATTACK; } } -void WP_SaberCatch( gentity_t *self, gentity_t *saber, qboolean switchToSaber ) +void WP_SaberCatch(gentity_t *self, gentity_t *saber, qboolean switchToSaber) {//FIXME: probably need a debounce time - if ( self->health > 0 && !PM_SaberInBrokenParry( self->client->ps.saberMove ) && self->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN ) + if (self->health > 0 && !PM_SaberInBrokenParry(self->client->ps.saberMove) && self->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN) { //clear the enemy saber->enemy = NULL; -//===FIXME!!!============================================================================================== - //We should copy the thrown saber's g2 instance to the right-hand saber - //When you catch it, and vice-versa when you throw it!!! -//===FIXME!!!============================================================================================== + //===FIXME!!!============================================================================================== + //We should copy the thrown saber's g2 instance to the right-hand saber + //When you catch it, and vice-versa when you throw it!!! + //===FIXME!!!============================================================================================== //don't draw it saber->s.eFlags |= EF_NODRAW; saber->svFlags &= SVF_BROADCAST; @@ -6852,31 +7442,31 @@ void WP_SaberCatch( gentity_t *self, gentity_t *saber, qboolean switchToSaber ) self->client->ps.saberEntityState = SES_LEAVING; //turn off the saber trail - self->client->ps.saber[0].DeactivateTrail( 75 ); + self->client->ps.saber[0].DeactivateTrail(75); //reset its contents/clipmask saber->contents = CONTENTS_LIGHTSABER;// | CONTENTS_SHOTCLIP; saber->clipmask = MASK_SHOT | CONTENTS_LIGHTSABER; //play catch sound - G_Sound( saber, G_SoundIndex( "sound/weapons/saber/saber_catch.wav" ) ); + G_Sound(saber, G_SoundIndex("sound/weapons/saber/saber_catch.wav")); //FIXME: if an NPC, don't turn it back on if no enemy or enemy is dead... //if it's not our current weapon, make it our current weapon - if ( self->client->ps.weapon == WP_SABER ) + if (self->client->ps.weapon == WP_SABER) {//only do the first saber since we only throw the first one - WP_SaberAddG2SaberModels( self, qfalse ); + WP_SaberAddG2SaberModels(self, qfalse); } - if ( switchToSaber ) + if (switchToSaber) { - if ( self->client->ps.weapon != WP_SABER ) + if (self->client->ps.weapon != WP_SABER) { - CG_ChangeWeapon( WP_SABER ); + CG_ChangeWeapon(WP_SABER); } else {//if it's not active, turn it on - if ( (self->client->ps.saber[0].saberFlags&SFL_SINGLE_BLADE_THROWABLE) )//SaberStaff() ) + if ((self->client->ps.saber[0].saberFlags&SFL_SINGLE_BLADE_THROWABLE))//SaberStaff() ) {//only first blade can be on - if ( !self->client->ps.saber[0].blade[0].active ) + if (!self->client->ps.saber[0].blade[0].active) {//only turn it on if first blade is off, otherwise, leave as-is self->client->ps.saber[0].Activate(); } @@ -6891,23 +7481,23 @@ void WP_SaberCatch( gentity_t *self, gentity_t *saber, qboolean switchToSaber ) } -void WP_SaberReturn( gentity_t *self, gentity_t *saber ) +void WP_SaberReturn(gentity_t *self, gentity_t *saber) { - if ( PM_SaberInBrokenParry( self->client->ps.saberMove ) || self->client->ps.saberBlocked == BLOCKED_PARRY_BROKEN ) + if (PM_SaberInBrokenParry(self->client->ps.saberMove) || self->client->ps.saberBlocked == BLOCKED_PARRY_BROKEN) { return; } - if ( self && self->client ) + if (self && self->client) {//still alive and stuff //FIXME: when it's returning, flies butt first, but seems to do a lot of damage when going through people... hmm... self->client->ps.saberEntityState = SES_RETURNING; //turn down the saber trail - if ( !(self->client->ps.saber[0].saberFlags&SFL_RETURN_DAMAGE) )//type != SABER_STAR ) + if (!(self->client->ps.saber[0].saberFlags&SFL_RETURN_DAMAGE))//type != SABER_STAR ) { - self->client->ps.saber[0].DeactivateTrail( 75 ); + self->client->ps.saber[0].DeactivateTrail(75); } } - if ( !(saber->s.eFlags&EF_BOUNCE) ) + if (!(saber->s.eFlags&EF_BOUNCE)) { saber->s.eFlags |= EF_BOUNCE; saber->bounceCount = 300; @@ -6915,7 +7505,7 @@ void WP_SaberReturn( gentity_t *self, gentity_t *saber ) } -void WP_SaberDrop( gentity_t *self, gentity_t *saber ) +void WP_SaberDrop(gentity_t *self, gentity_t *saber) { //clear the enemy saber->enemy = NULL; @@ -6926,13 +7516,13 @@ void WP_SaberDrop( gentity_t *self, gentity_t *saber ) //make it bounce some saber->s.eFlags |= EF_BOUNCE_HALF; //make it spin - VectorCopy( saber->currentAngles, saber->s.apos.trBase ); + VectorCopy(saber->currentAngles, saber->s.apos.trBase); saber->s.apos.trType = TR_LINEAR; saber->s.apos.trTime = level.time; - VectorSet( saber->s.apos.trDelta, Q_irand( -300, 300 ), saber->s.apos.trDelta[1], Q_irand( -300, 300 ) ); - if ( !saber->s.apos.trDelta[1] ) + VectorSet(saber->s.apos.trDelta, Q_irand(-300, 300), saber->s.apos.trDelta[1], Q_irand(-300, 300)); + if (!saber->s.apos.trDelta[1]) { - saber->s.apos.trDelta[1] = Q_irand( -300, 300 ); + saber->s.apos.trDelta[1] = Q_irand(-300, 300); } //force it to be ready to return self->client->ps.saberEntityDist = 0; @@ -6940,35 +7530,35 @@ void WP_SaberDrop( gentity_t *self, gentity_t *saber ) //turn it off self->client->ps.saber[0].Deactivate(); //turn off the saber trail - self->client->ps.saber[0].DeactivateTrail( 75 ); + self->client->ps.saber[0].DeactivateTrail(75); //play the saber turning off sound - G_SoundIndexOnEnt( saber, CHAN_AUTO, self->client->ps.saber[0].soundOff ); + G_SoundIndexOnEnt(saber, CHAN_AUTO, self->client->ps.saber[0].soundOff); - if ( self->health <= 0 ) + if (self->health <= 0) {//owner is dead! saber->s.time = level.time;//will make us free ourselves after a time } } -void WP_SaberPull( gentity_t *self, gentity_t *saber ) +void WP_SaberPull(gentity_t *self, gentity_t *saber) { - if ( PM_SaberInBrokenParry( self->client->ps.saberMove ) || self->client->ps.saberBlocked == BLOCKED_PARRY_BROKEN ) + if (PM_SaberInBrokenParry(self->client->ps.saberMove) || self->client->ps.saberBlocked == BLOCKED_PARRY_BROKEN) { return; } - if ( self->health > 0 ) + if (self->health > 0) { //take off gravity saber->s.pos.trType = TR_LINEAR; //take off bounce saber->s.eFlags &= EF_BOUNCE_HALF; //play sound - G_Sound( self, G_SoundIndex( "sound/weapons/force/pull.wav" ) ); + G_Sound(self, G_SoundIndex("sound/weapons/force/pull.wav")); } } -const char *saberColorStringForColor[SABER_PURPLE+1] = +const char *saberColorStringForColor[SABER_PURPLE + 1] = { "red",//SABER_RED "orange",//SABER_ORANGE @@ -6979,64 +7569,64 @@ const char *saberColorStringForColor[SABER_PURPLE+1] = }; // Check if we are throwing it, launch it if needed, update position if needed. -void WP_SaberThrow( gentity_t *self, usercmd_t *ucmd ) +void WP_SaberThrow(gentity_t *self, usercmd_t *ucmd) { vec3_t saberDiff; trace_t tr; //static float SABER_SPEED = 10; gentity_t *saberent; - - if ( self->client->ps.saberEntityNum <= 0 || self->client->ps.saberEntityNum >= ENTITYNUM_WORLD ) + + if (self->client->ps.saberEntityNum <= 0 || self->client->ps.saberEntityNum >= ENTITYNUM_WORLD) {//WTF?!! We lost it? return; } - - if ( self->client->ps.torsoAnim == BOTH_LOSE_SABER ) + + if (self->client->ps.torsoAnim == BOTH_LOSE_SABER) {//can't catch it while it's being yanked from your hand! return; } - if ( !g_saberNewControlScheme->integer ) + if (!g_saberNewControlScheme->integer) { - if ( PM_SaberInKata( (saberMoveName_t)self->client->ps.saberMove ) ) + if (PM_SaberInKata((saberMoveName_t)self->client->ps.saberMove)) {//don't throw saber when in special attack (alt+attack) return; } - if ( (ucmd->buttons&BUTTON_ATTACK) - && (ucmd->buttons&BUTTON_ALT_ATTACK) - && !self->client->ps.saberInFlight ) + if ((ucmd->buttons&BUTTON_ATTACK) + && (ucmd->buttons&BUTTON_ALT_ATTACK) + && !self->client->ps.saberInFlight) {//trying to do special attack, don't throw it return; } - else if ( self->client->ps.torsoAnim == BOTH_A1_SPECIAL + else if (self->client->ps.torsoAnim == BOTH_A1_SPECIAL || self->client->ps.torsoAnim == BOTH_A2_SPECIAL - || self->client->ps.torsoAnim == BOTH_A3_SPECIAL ) + || self->client->ps.torsoAnim == BOTH_A3_SPECIAL) {//don't throw in these anims! return; } } saberent = &g_entities[self->client->ps.saberEntityNum]; - VectorSubtract( self->client->renderInfo.handRPoint, saberent->currentOrigin, saberDiff ); + VectorSubtract(self->client->renderInfo.handRPoint, saberent->currentOrigin, saberDiff); //is our saber in flight? - if ( !self->client->ps.saberInFlight ) + if (!self->client->ps.saberInFlight) {//saber is not in flight right now - if ( self->client->ps.weapon != WP_SABER ) + if (self->client->ps.weapon != WP_SABER) {//don't even have it out return; } - else if ( (ucmd->buttons&BUTTON_ALT_ATTACK) && !(self->client->ps.pm_flags&PMF_ALT_ATTACK_HELD) ) + else if ((ucmd->buttons&BUTTON_ALT_ATTACK) && !(self->client->ps.pm_flags&PMF_ALT_ATTACK_HELD)) {//still holding it, not still holding attack from a previous throw, so throw it. - if ( !(self->client->ps.saberEventFlags&SEF_INWATER) && WP_SaberLaunch( self, saberent, qtrue ) ) + if (!(self->client->ps.saberEventFlags&SEF_INWATER) && WP_SaberLaunch(self, saberent, qtrue)) { - if ( self->client && !self->s.number ) + if (self->client && !self->s.number) { self->client->sess.missionStats.saberThrownCnt++; } //need to recalc this because we just moved it - VectorSubtract( self->client->renderInfo.handRPoint, saberent->currentOrigin, saberDiff ); + VectorSubtract(self->client->renderInfo.handRPoint, saberent->currentOrigin, saberDiff); } else {//couldn't throw it @@ -7048,183 +7638,183 @@ void WP_SaberThrow( gentity_t *self, usercmd_t *ucmd ) return; } } - else + else {//inflight //is our saber currently on it's way back to us? - if ( self->client->ps.saberEntityState == SES_RETURNING ) + if (self->client->ps.saberEntityState == SES_RETURNING) {//see if we're close enough to pick it up - if ( VectorLengthSquared( saberDiff ) <= 256 )//16 squared//G_BoundsOverlap( self->absmin, self->absmax, saberent->absmin, saberent->absmax ) )// + if (VectorLengthSquared(saberDiff) <= 256)//16 squared//G_BoundsOverlap( self->absmin, self->absmax, saberent->absmin, saberent->absmax ) )// {//caught it vec3_t axisPoint; trace_t trace; - VectorCopy( self->currentOrigin, axisPoint ); + VectorCopy(self->currentOrigin, axisPoint); axisPoint[2] = self->client->renderInfo.handRPoint[2]; - gi.trace( &trace, axisPoint, vec3_origin, vec3_origin, self->client->renderInfo.handRPoint, self->s.number, MASK_SOLID, (EG2_Collision)0, 0 ); - if ( !trace.startsolid && trace.fraction >= 1.0f ) + gi.trace(&trace, axisPoint, vec3_origin, vec3_origin, self->client->renderInfo.handRPoint, self->s.number, MASK_SOLID, (EG2_Collision)0, 0); + if (!trace.startsolid && trace.fraction >= 1.0f) {//our hand isn't through a wall - WP_SaberCatch( self, saberent, qtrue ); + WP_SaberCatch(self, saberent, qtrue); //NPC_SetAnim( self, SETANIM_TORSO, TORSO_HANDRETRACT1, SETANIM_FLAG_OVERRIDE ); } return; } } - if ( saberent->s.pos.trType != TR_STATIONARY ) + if (saberent->s.pos.trType != TR_STATIONARY) {//saber is in flight, lerp it - if ( self->health <= 0 )//&& level.time > saberent->s.time + 5000 ) + if (self->health <= 0)//&& level.time > saberent->s.time + 5000 ) {//make us free ourselves after a time - if ( g_saberPickuppableDroppedSabers->integer - && G_DropSaberItem( self->client->ps.saber[0].name, self->client->ps.saber[0].blade[0].color, saberent->currentOrigin, saberent->s.pos.trDelta, saberent->currentAngles ) != NULL ) + if (g_saberPickuppableDroppedSabers->integer + && G_DropSaberItem(self->client->ps.saber[0].name, self->client->ps.saber[0].blade[0].color, saberent->currentOrigin, saberent->s.pos.trDelta, saberent->currentAngles) != NULL) {//dropped it //free it - G_FreeEntity( saberent ); + G_FreeEntity(saberent); //forget it self->client->ps.saberEntityNum = ENTITYNUM_NONE; return; } } - WP_RunSaber( self, saberent ); + WP_RunSaber(self, saberent); } else {//it fell on the ground - if ( self->health <= 0 )//&& level.time > saberent->s.time + 5000 ) + if (self->health <= 0)//&& level.time > saberent->s.time + 5000 ) {//make us free ourselves after a time - if ( g_saberPickuppableDroppedSabers->integer ) + if (g_saberPickuppableDroppedSabers->integer) {//spawn an item - G_DropSaberItem( self->client->ps.saber[0].name, self->client->ps.saber[0].blade[0].color, saberent->currentOrigin, saberent->s.pos.trDelta, saberent->currentAngles ); + G_DropSaberItem(self->client->ps.saber[0].name, self->client->ps.saber[0].blade[0].color, saberent->currentOrigin, saberent->s.pos.trDelta, saberent->currentAngles); } //free it - G_FreeEntity( saberent ); + G_FreeEntity(saberent); //forget it self->client->ps.saberEntityNum = ENTITYNUM_NONE; return; } - if ( (!self->s.number && level.time - saberent->aimDebounceTime > 15000) - || (self->s.number && level.time - saberent->aimDebounceTime > 5000) ) + if ((!self->s.number && level.time - saberent->aimDebounceTime > 15000) + || (self->s.number && level.time - saberent->aimDebounceTime > 5000)) {//(only for player) been missing for 15 seconds, automagicially return - WP_SaberCatch( self, saberent, qfalse ); + WP_SaberCatch(self, saberent, qfalse); return; } } } //are we still trying to use the saber? - if ( self->client->ps.weapon != WP_SABER ) + if (self->client->ps.weapon != WP_SABER) {//switched away - if ( !self->client->ps.saberInFlight ) + if (!self->client->ps.saberInFlight) {//wasn't throwing saber return; } - else if ( saberent->s.pos.trType == TR_LINEAR ) + else if (saberent->s.pos.trType == TR_LINEAR) {//switched away while controlling it, just drop the saber - WP_SaberDrop( self, saberent ); + WP_SaberDrop(self, saberent); return; } else {//it's on the ground, see if it's inside us (touching) - if ( G_PointInBounds( saberent->currentOrigin, self->absmin, self->absmax ) ) + if (G_PointInBounds(saberent->currentOrigin, self->absmin, self->absmax)) {//it's in us, pick it up automatically - WP_SaberPull( self, saberent ); + WP_SaberPull(self, saberent); } } } - else if ( saberent->s.pos.trType != TR_LINEAR ) + else if (saberent->s.pos.trType != TR_LINEAR) {//weapon is saber and not flying - if ( self->client->ps.saberInFlight ) + if (self->client->ps.saberInFlight) {//we dropped it - if ( ucmd->buttons & BUTTON_ATTACK )//|| self->client->ps.weaponstate == WEAPON_RAISING )//ucmd->buttons & BUTTON_ALT_ATTACK || + if (ucmd->buttons & BUTTON_ATTACK)//|| self->client->ps.weaponstate == WEAPON_RAISING )//ucmd->buttons & BUTTON_ALT_ATTACK || {//we actively want to pick it up or we just switched to it, so pull it back - gi.trace( &tr, saberent->currentOrigin, saberent->mins, saberent->maxs, self->client->renderInfo.handRPoint, self->s.number, MASK_SOLID, (EG2_Collision)0, 0 ); + gi.trace(&tr, saberent->currentOrigin, saberent->mins, saberent->maxs, self->client->renderInfo.handRPoint, self->s.number, MASK_SOLID, (EG2_Collision)0, 0); - if ( tr.allsolid || tr.startsolid || tr.fraction < 1.0f ) + if (tr.allsolid || tr.startsolid || tr.fraction < 1.0f) {//can't pick it up yet, no LOS return; } //clear LOS, pick it up - WP_SaberPull( self, saberent ); + WP_SaberPull(self, saberent); } else {//see if it's inside us (touching) - if ( G_PointInBounds( saberent->currentOrigin, self->absmin, self->absmax ) ) + if (G_PointInBounds(saberent->currentOrigin, self->absmin, self->absmax)) {//it's in us, pick it up automatically - WP_SaberPull( self, saberent ); + WP_SaberPull(self, saberent); } } } } - else if ( self->health <= 0 && self->client->ps.saberInFlight ) + else if (self->health <= 0 && self->client->ps.saberInFlight) {//we died, drop it - WP_SaberDrop( self, saberent ); + WP_SaberDrop(self, saberent); return; } - else if ( !self->client->ps.saber[0].Active() && self->client->ps.saberEntityState != SES_RETURNING ) + else if (!self->client->ps.saber[0].Active() && self->client->ps.saberEntityState != SES_RETURNING) {//we turned it off, drop it - WP_SaberDrop( self, saberent ); + WP_SaberDrop(self, saberent); return; } - + //TODO: if deactivate saber in flight, should it drop? - - if ( saberent->s.pos.trType != TR_LINEAR ) + + if (saberent->s.pos.trType != TR_LINEAR) {//don't home return; } - float saberDist = VectorLength( saberDiff ); - if ( self->client->ps.saberEntityState == SES_LEAVING ) + float saberDist = VectorLength(saberDiff); + if (self->client->ps.saberEntityState == SES_LEAVING) {//saber still flying forward - if ( self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_2) {//still holding it out - if ( !(ucmd->buttons&BUTTON_ALT_ATTACK) && self->client->ps.forcePowerDebounce[FP_SABERTHROW] < level.time ) + if (!(ucmd->buttons&BUTTON_ALT_ATTACK) && self->client->ps.forcePowerDebounce[FP_SABERTHROW] < level.time) {//done throwing, return to me - if ( self->client->ps.saber[0].Active() ) + if (self->client->ps.saber[0].Active()) {//still on - WP_SaberReturn( self, saberent ); + WP_SaberReturn(self, saberent); } } - else if ( level.time - self->client->ps.saberThrowTime >= 100 ) + else if (level.time - self->client->ps.saberThrowTime >= 100) { - if ( WP_ForcePowerAvailable( self, FP_SABERTHROW, 1 ) ) + if (WP_ForcePowerAvailable(self, FP_SABERTHROW, 1)) { - WP_ForcePowerDrain( self, FP_SABERTHROW, 1 ); + WP_ForcePowerDrain(self, FP_SABERTHROW, 1); self->client->ps.saberThrowTime = level.time; } else {//out of force power, return to me - WP_SaberReturn( self, saberent ); + WP_SaberReturn(self, saberent); } } } else { - if ( !(ucmd->buttons&BUTTON_ALT_ATTACK) && self->client->ps.forcePowerDebounce[FP_SABERTHROW] < level.time ) + if (!(ucmd->buttons&BUTTON_ALT_ATTACK) && self->client->ps.forcePowerDebounce[FP_SABERTHROW] < level.time) {//not holding button and has been out at least 1 second, return to me - if ( self->client->ps.saber[0].Active() ) + if (self->client->ps.saber[0].Active()) {//still on - WP_SaberReturn( self, saberent ); + WP_SaberReturn(self, saberent); } } - else if ( level.time - self->client->ps.saberThrowTime > 3000 - || (self->client->ps.forcePowerLevel[FP_SABERTHROW]==FORCE_LEVEL_1&&saberDist>=self->client->ps.saberEntityDist) ) + else if (level.time - self->client->ps.saberThrowTime > 3000 + || (self->client->ps.forcePowerLevel[FP_SABERTHROW] == FORCE_LEVEL_1&&saberDist >= self->client->ps.saberEntityDist)) {//been out too long, or saber throw 1 went too far, return to me - if ( self->client->ps.saber[0].Active() ) + if (self->client->ps.saber[0].Active()) {//still on - WP_SaberReturn( self, saberent ); + WP_SaberReturn(self, saberent); } } } } - if ( self->client->ps.saberEntityState == SES_RETURNING ) + if (self->client->ps.saberEntityState == SES_RETURNING) { - if ( self->client->ps.saberEntityDist > 0 ) + if (self->client->ps.saberEntityDist > 0) { self->client->ps.saberEntityDist -= 25; } - if ( self->client->ps.saberEntityDist < 0 ) + if (self->client->ps.saberEntityDist < 0) { self->client->ps.saberEntityDist = 0; } - else if ( saberDist < self->client->ps.saberEntityDist ) + else if (saberDist < self->client->ps.saberEntityDist) {//if it's coming back to me, never push it away self->client->ps.saberEntityDist = saberDist; } @@ -7237,9 +7827,9 @@ void WP_SaberThrow( gentity_t *self, usercmd_t *ucmd ) //SABER BLOCKING============================================================================ //SABER BLOCKING============================================================================ //SABER BLOCKING============================================================================ -int WP_MissileBlockForBlock( int saberBlock ) +int WP_MissileBlockForBlock(int saberBlock) { - switch( saberBlock ) + switch (saberBlock) { case BLOCKED_UPPER_RIGHT: return BLOCKED_UPPER_RIGHT_PROJ; @@ -7260,47 +7850,47 @@ int WP_MissileBlockForBlock( int saberBlock ) return saberBlock; } -void WP_SaberBlockNonRandom( gentity_t *self, vec3_t hitloc, qboolean missileBlock ) +void WP_SaberBlockNonRandom(gentity_t *self, vec3_t hitloc, qboolean missileBlock) { - vec3_t diff, fwdangles={0,0,0}, right; + vec3_t diff, fwdangles = { 0, 0, 0 }, right; float rightdot; float zdiff; - if ( self->client->ps.weaponstate == WEAPON_DROPPING || - self->client->ps.weaponstate == WEAPON_RAISING ) + if (self->client->ps.weaponstate == WEAPON_DROPPING || + self->client->ps.weaponstate == WEAPON_RAISING) {//don't block while changing weapons return; } - if ( PM_SuperBreakLoseAnim( self->client->ps.torsoAnim ) - || PM_SuperBreakWinAnim( self->client->ps.torsoAnim ) ) + if (PM_SuperBreakLoseAnim(self->client->ps.torsoAnim) + || PM_SuperBreakWinAnim(self->client->ps.torsoAnim)) { return; } //NPCs don't auto-block - if ( !missileBlock && self->s.number != 0 && self->client->ps.saberBlocked != BLOCKED_NONE ) + if (!missileBlock && self->s.number != 0 && self->client->ps.saberBlocked != BLOCKED_NONE) { return; } - VectorSubtract( hitloc, self->client->renderInfo.eyePoint, diff ); + VectorSubtract(hitloc, self->client->renderInfo.eyePoint, diff); diff[2] = 0; - VectorNormalize( diff ); + VectorNormalize(diff); fwdangles[1] = self->client->ps.viewangles[1]; // Ultimately we might care if the shot was ahead or behind, but for now, just quadrant is fine. - AngleVectors( fwdangles, NULL, right, NULL ); + AngleVectors(fwdangles, NULL, right, NULL); rightdot = DotProduct(right, diff); zdiff = hitloc[2] - self->client->renderInfo.eyePoint[2]; - + //FIXME: take torsoAngles into account? - if ( zdiff > -5 )//0 )//40 ) + if (zdiff > -5)//0 )//40 ) { - if ( rightdot > 0.3 ) + if (rightdot > 0.3) { self->client->ps.saberBlocked = BLOCKED_UPPER_RIGHT; } - else if ( rightdot < -0.3 ) + else if (rightdot < -0.3) { self->client->ps.saberBlocked = BLOCKED_UPPER_LEFT; } @@ -7309,17 +7899,17 @@ void WP_SaberBlockNonRandom( gentity_t *self, vec3_t hitloc, qboolean missileBlo self->client->ps.saberBlocked = BLOCKED_TOP; } } - else if ( zdiff > -22 )//-20 )//20 ) + else if (zdiff > -22)//-20 )//20 ) { - if ( zdiff < -10 )//30 ) + if (zdiff < -10)//30 ) {//hmm, pretty low, but not low enough to use the low block, so we need to duck //NPC should duck, but NPC should never get here } - if ( rightdot > 0.1 ) + if (rightdot > 0.1) { self->client->ps.saberBlocked = BLOCKED_UPPER_RIGHT; } - else if ( rightdot < -0.1 ) + else if (rightdot < -0.1) { self->client->ps.saberBlocked = BLOCKED_UPPER_LEFT; } @@ -7330,7 +7920,7 @@ void WP_SaberBlockNonRandom( gentity_t *self, vec3_t hitloc, qboolean missileBlo } else { - if ( rightdot >= 0 ) + if (rightdot >= 0) { self->client->ps.saberBlocked = BLOCKED_LOWER_RIGHT; } @@ -7341,27 +7931,27 @@ void WP_SaberBlockNonRandom( gentity_t *self, vec3_t hitloc, qboolean missileBlo } #ifndef FINAL_BUILD - if ( d_saberCombat->integer ) + if (d_saberCombat->integer) { - if ( !self->s.number ) + if (!self->s.number) { - gi.Printf( "EyeZ: %4.2f HitZ: %4.2f zdiff: %4.2f rdot: %4.2f\n", self->client->renderInfo.eyePoint[2], hitloc[2], zdiff, rightdot ); - switch ( self->client->ps.saberBlocked ) + gi.Printf("EyeZ: %4.2f HitZ: %4.2f zdiff: %4.2f rdot: %4.2f\n", self->client->renderInfo.eyePoint[2], hitloc[2], zdiff, rightdot); + switch (self->client->ps.saberBlocked) { case BLOCKED_TOP: - gi.Printf( "BLOCKED_TOP\n" ); + gi.Printf("BLOCKED_TOP\n"); break; case BLOCKED_UPPER_RIGHT: - gi.Printf( "BLOCKED_UPPER_RIGHT\n" ); + gi.Printf("BLOCKED_UPPER_RIGHT\n"); break; case BLOCKED_UPPER_LEFT: - gi.Printf( "BLOCKED_UPPER_LEFT\n" ); + gi.Printf("BLOCKED_UPPER_LEFT\n"); break; case BLOCKED_LOWER_RIGHT: - gi.Printf( "BLOCKED_LOWER_RIGHT\n" ); + gi.Printf("BLOCKED_LOWER_RIGHT\n"); break; case BLOCKED_LOWER_LEFT: - gi.Printf( "BLOCKED_LOWER_LEFT\n" ); + gi.Printf("BLOCKED_LOWER_LEFT\n"); break; default: break; @@ -7370,22 +7960,22 @@ void WP_SaberBlockNonRandom( gentity_t *self, vec3_t hitloc, qboolean missileBlo } #endif - if ( missileBlock ) + if (missileBlock) { - self->client->ps.saberBlocked = WP_MissileBlockForBlock( self->client->ps.saberBlocked ); + self->client->ps.saberBlocked = WP_MissileBlockForBlock(self->client->ps.saberBlocked); } - if ( self->client->ps.saberBlocked != BLOCKED_NONE ) + if (self->client->ps.saberBlocked != BLOCKED_NONE) { - int parryReCalcTime = Jedi_ReCalcParryTime( self, EVASION_PARRY ); - if ( self->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] < level.time + parryReCalcTime ) + int parryReCalcTime = Jedi_ReCalcParryTime(self, EVASION_PARRY); + if (self->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] < level.time + parryReCalcTime) { self->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] = level.time + parryReCalcTime; } } } -void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ) +void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) { float dist; gentity_t *ent, *incoming = NULL; @@ -7394,50 +7984,50 @@ void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ) vec3_t mins, maxs; int i, e; float closestDist, radius = 256; - vec3_t forward, dir, missile_dir, fwdangles = {0}; + vec3_t forward, dir, missile_dir, fwdangles = { 0 }; trace_t trace; vec3_t traceTo, entDir; qboolean dodgeOnlySabers = qfalse; - if ( self->NPC && (self->NPC->scriptFlags&SCF_IGNORE_ALERTS) ) + if (self->NPC && (self->NPC->scriptFlags&SCF_IGNORE_ALERTS)) {//don't react to things flying at me... return; } - if ( self->health <= 0 ) + if (self->health <= 0) {//dead don't try to block (NOTE: actual deflection happens in missile code) return; } - if ( PM_InKnockDown( &self->client->ps ) ) + if (PM_InKnockDown(&self->client->ps)) {//can't block when knocked down return; } - if ( PM_SuperBreakLoseAnim( self->client->ps.torsoAnim ) - || PM_SuperBreakWinAnim( self->client->ps.torsoAnim ) ) + if (PM_SuperBreakLoseAnim(self->client->ps.torsoAnim) + || PM_SuperBreakWinAnim(self->client->ps.torsoAnim)) {//can't block while in break anim return; } - if ( Rosh_BeingHealed( self ) ) + if (Rosh_BeingHealed(self)) { return; } - if ( self->client->NPC_class == CLASS_ROCKETTROOPER ) + if (self->client->NPC_class == CLASS_ROCKETTROOPER) {//rockettrooper - if ( self->client->ps.groundEntityNum != ENTITYNUM_NONE ) + if (self->client->ps.groundEntityNum != ENTITYNUM_NONE) {//must be in air return; } - if ( Q_irand( 0, 4-(g_spskill->integer*2) ) ) + if (Q_irand(0, 4 - (g_spskill->integer * 2))) {//easier level guys do this less return; } - if ( Q_irand( 0, 3 ) ) + if (Q_irand(0, 3)) {//base level: 25% chance of looking for something to dodge - if ( Q_irand( 0, 1 ) ) + if (Q_irand(0, 1)) {//dodge sabers twice as frequently as other projectiles dodgeOnlySabers = qtrue; } @@ -7448,169 +8038,169 @@ void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ) } } - if ( self->client->NPC_class == CLASS_BOBAFETT ) + if (self->client->NPC_class == CLASS_BOBAFETT) {//Boba doesn't dodge quite as much - if ( Q_irand( 0, 2-g_spskill->integer) ) + if (Q_irand(0, 2 - g_spskill->integer)) {//easier level guys do this less return; } } - if ( self->client->NPC_class != CLASS_BOBAFETT + if (self->client->NPC_class != CLASS_BOBAFETT && (self->client->NPC_class != CLASS_REBORN || self->s.weapon == WP_SABER) - && (self->client->NPC_class != CLASS_ROCKETTROOPER||!self->NPC||self->NPC->rankclient->NPC_class != CLASS_ROCKETTROOPER || !self->NPC || self->NPC->rankinteger + if (g_debugMelee->integer && (ucmd->buttons & BUTTON_USE) && cg.renderingThirdPerson - && G_OkayToLean( &self->client->ps, ucmd, qfalse ) - && (self->client->ps.forcePowersActive&(1<client->ps, ucmd, qfalse) + && (self->client->ps.forcePowersActive&(1 << FP_SPEED))) { } else { - if ( self->client->ps.weapon != WP_SABER ) + if (self->client->ps.weapon != WP_SABER) { return; } - if ( self->client->ps.saberInFlight ) + if (self->client->ps.saberInFlight) { return; } - if ( self->s.number < MAX_CLIENTS ) + if (self->s.number < MAX_CLIENTS) { - if ( !self->client->ps.SaberLength() ) + if (!self->client->ps.SaberLength()) {//player doesn't auto-activate return; } - if ( !g_saberAutoBlocking->integer && self->client->ps.saberBlockingTimeinteger && self->client->ps.saberBlockingTimeclient->ps.saber[0].saberFlags&SFL_NOT_ACTIVE_BLOCKING) ) + if ((self->client->ps.saber[0].saberFlags&SFL_NOT_ACTIVE_BLOCKING)) {//can't actively block with this saber type return; } } - if ( !self->s.number ) + if (!self->s.number) {//don't do this if already attacking! - if ( ucmd->buttons & BUTTON_ATTACK - || PM_SaberInAttack( self->client->ps.saberMove ) - || PM_SaberInSpecialAttack( self->client->ps.torsoAnim ) - || PM_SaberInTransitionAny( self->client->ps.saberMove )) + if (ucmd->buttons & BUTTON_ATTACK + || PM_SaberInAttack(self->client->ps.saberMove) + || PM_SaberInSpecialAttack(self->client->ps.torsoAnim) + || PM_SaberInTransitionAny(self->client->ps.saberMove)) { return; } } - if ( self->client->ps.forcePowerLevel[FP_SABER_DEFENSE] < FORCE_LEVEL_1 ) + if (self->client->ps.forcePowerLevel[FP_SABER_DEFENSE] < FORCE_LEVEL_1) {//you have not the SKILLZ return; } - if ( self->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] > level.time ) + if (self->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] > level.time) {//can't block while already blocking return; } - if ( self->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_LIGHTNING)) {//can't block while zapping return; } - if ( self->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_DRAIN)) {//can't block while draining return; } - if ( self->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_PUSH)) {//can't block while shoving return; } - if ( self->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_GRIP)) {//can't block while gripping (FIXME: or should it break the grip? Pain should break the grip, I think...) return; } } fwdangles[1] = self->client->ps.viewangles[1]; - AngleVectors( fwdangles, forward, NULL, NULL ); + AngleVectors(fwdangles, forward, NULL, NULL); - for ( i = 0 ; i < 3 ; i++ ) + for (i = 0; i < 3; i++) { mins[i] = self->currentOrigin[i] - radius; maxs[i] = self->currentOrigin[i] + radius; } - numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); + numListedEntities = gi.EntitiesInBox(mins, maxs, entityList, MAX_GENTITIES); closestDist = radius; - for ( e = 0 ; e < numListedEntities ; e++ ) + for (e = 0; e < numListedEntities; e++) { - ent = entityList[ e ]; + ent = entityList[e]; if (ent == self) continue; if (ent->owner == self) continue; - if ( !(ent->inuse) ) + if (!(ent->inuse)) continue; - if ( dodgeOnlySabers ) + if (dodgeOnlySabers) {//only care about thrown sabers - if ( ent->client + if (ent->client || ent->s.weapon != WP_SABER || !ent->classname || !ent->classname[0] - || Q_stricmp( "lightsaber", ent->classname ) ) + || Q_stricmp("lightsaber", ent->classname)) {//not a lightsaber, ignore it continue; } } - if ( ent->s.eType != ET_MISSILE && !(ent->s.eFlags&EF_MISSILE_STICK) ) + if (ent->s.eType != ET_MISSILE && !(ent->s.eFlags&EF_MISSILE_STICK)) {//not a normal projectile - if ( ent->client || ent->s.weapon != WP_SABER ) + if (ent->client || ent->s.weapon != WP_SABER) {//FIXME: wake up bad guys? continue; } - if ( ent->s.eFlags & EF_NODRAW ) + if (ent->s.eFlags & EF_NODRAW) { continue; } - if ( Q_stricmp( "lightsaber", ent->classname ) != 0 ) + if (Q_stricmp("lightsaber", ent->classname) != 0) {//not a lightsaber //FIXME: what about general objects that are small in size- like rocks, etc... continue; } //a lightsaber.. make sure it's on and inFlight - if ( !ent->owner || !ent->owner->client ) + if (!ent->owner || !ent->owner->client) { continue; } - if ( !ent->owner->client->ps.saberInFlight ) + if (!ent->owner->client->ps.saberInFlight) {//not in flight continue; } - if ( ent->owner->client->ps.SaberLength() <= 0 ) + if (ent->owner->client->ps.SaberLength() <= 0) {//not on continue; } - if ( ent->owner->health <= 0 && g_saberRealisticCombat->integer < 2 ) + if (ent->owner->health <= 0 && g_saberRealisticCombat->integer < 2) {//it's not doing damage, so ignore it continue; } } else { - if ( ent->s.pos.trType == TR_STATIONARY && !self->s.number ) + if (ent->s.pos.trType == TR_STATIONARY && !self->s.number) {//nothing you can do with a stationary missile if you're the player continue; } @@ -7618,56 +8208,56 @@ void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ) float dot1, dot2; //see if they're in front of me - VectorSubtract( ent->currentOrigin, self->currentOrigin, dir ); - dist = VectorNormalize( dir ); + VectorSubtract(ent->currentOrigin, self->currentOrigin, dir); + dist = VectorNormalize(dir); //FIXME: handle detpacks, proximity mines and tripmines - if ( ent->s.weapon == WP_THERMAL ) + if (ent->s.weapon == WP_THERMAL) {//thermal detonator! - if ( self->NPC && dist < ent->splashRadius ) - { - if ( dist < ent->splashRadius && - ent->nextthink < level.time + 600 && - ent->count && - self->client->ps.groundEntityNum != ENTITYNUM_NONE && - (ent->s.pos.trType == TR_STATIONARY|| - ent->s.pos.trType == TR_INTERPOLATE|| - (dot1 = DotProduct( dir, forward )) < SABER_REFLECT_MISSILE_CONE|| - !WP_ForcePowerUsable( self, FP_PUSH, 0 )) ) + if (self->NPC && dist < ent->splashRadius) + { + if (dist < ent->splashRadius && + ent->nextthink < level.time + 600 && + ent->count && + self->client->ps.groundEntityNum != ENTITYNUM_NONE && + (ent->s.pos.trType == TR_STATIONARY || + ent->s.pos.trType == TR_INTERPOLATE || + (dot1 = DotProduct(dir, forward)) < SABER_REFLECT_MISSILE_CONE || + !WP_ForcePowerUsable(self, FP_PUSH, 0))) {//TD is close enough to hurt me, I'm on the ground and the thing is at rest or behind me and about to blow up, or I don't have force-push so force-jump! //FIXME: sometimes this might make me just jump into it...? self->client->ps.forceJumpCharge = 480; } - else if ( self->client->NPC_class != CLASS_BOBAFETT + else if (self->client->NPC_class != CLASS_BOBAFETT && (self->client->NPC_class != CLASS_REBORN || self->s.weapon == WP_SABER) - && self->client->NPC_class != CLASS_ROCKETTROOPER ) + && self->client->NPC_class != CLASS_ROCKETTROOPER) {//FIXME: check forcePushRadius[NPC->client->ps.forcePowerLevel[FP_PUSH]] - if ( !ent->owner || !OnSameTeam( self, ent->owner ) ) + if (!ent->owner || !OnSameTeam(self, ent->owner)) { - ForceThrow( self, qfalse ); + ForceThrow(self, qfalse); } } } continue; } - else if ( ent->splashDamage && ent->splashRadius ) + else if (ent->splashDamage && ent->splashRadius) {//exploding missile //FIXME: handle tripmines and detpacks somehow... // maybe do a force-gesture that makes them explode? // But what if we're within it's splashradius? - if ( !self->s.number ) + if (!self->s.number) {//players don't auto-handle these at all continue; } - else + else { - if ( self->client->NPC_class == CLASS_BOBAFETT - || self->client->NPC_class == CLASS_ROCKETTROOPER ) + if (self->client->NPC_class == CLASS_BOBAFETT + || self->client->NPC_class == CLASS_ROCKETTROOPER) { /* if ( ent->s.pos.trType == TR_STATIONARY && (ent->s.eFlags&EF_MISSILE_STICK) ) {//sorry, you're scrooged here - //FIXME: maybe jump or go up if on ground? - continue; + //FIXME: maybe jump or go up if on ground? + continue; } //else it's a rocket, try to evade it */ @@ -7675,51 +8265,51 @@ void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ) } else {//normal Jedi - if ( ent->s.pos.trType == TR_STATIONARY && (ent->s.eFlags&EF_MISSILE_STICK) - && (self->client->NPC_class != CLASS_REBORN || self->s.weapon == WP_SABER) ) + if (ent->s.pos.trType == TR_STATIONARY && (ent->s.eFlags&EF_MISSILE_STICK) + && (self->client->NPC_class != CLASS_REBORN || self->s.weapon == WP_SABER)) {//a placed explosive like a tripmine or detpack - if ( InFOV( ent->currentOrigin, self->client->renderInfo.eyePoint, self->client->ps.viewangles, 90, 90 ) ) + if (InFOV(ent->currentOrigin, self->client->renderInfo.eyePoint, self->client->ps.viewangles, 90, 90)) {//in front of me - if ( G_ClearLOS( self, ent ) ) + if (G_ClearLOS(self, ent)) {//can see it vec3_t throwDir; //make the gesture - ForceThrow( self, qfalse ); + ForceThrow(self, qfalse); //take it off the wall and toss it ent->s.pos.trType = TR_GRAVITY; ent->s.eType = ET_MISSILE; ent->s.eFlags &= ~EF_MISSILE_STICK; ent->s.eFlags |= EF_BOUNCE_HALF; - AngleVectors( ent->currentAngles, throwDir, NULL, NULL ); - VectorMA( ent->currentOrigin, ent->maxs[0]+4, throwDir, ent->currentOrigin ); - VectorCopy( ent->currentOrigin, ent->s.pos.trBase ); - VectorScale( throwDir, 300, ent->s.pos.trDelta ); + AngleVectors(ent->currentAngles, throwDir, NULL, NULL); + VectorMA(ent->currentOrigin, ent->maxs[0] + 4, throwDir, ent->currentOrigin); + VectorCopy(ent->currentOrigin, ent->s.pos.trBase); + VectorScale(throwDir, 300, ent->s.pos.trDelta); ent->s.pos.trDelta[2] += 150; - VectorMA( ent->s.pos.trDelta, 800, dir, ent->s.pos.trDelta ); + VectorMA(ent->s.pos.trDelta, 800, dir, ent->s.pos.trDelta); ent->s.pos.trTime = level.time; // move a bit on the very first frame - VectorCopy( ent->currentOrigin, ent->s.pos.trBase ); + VectorCopy(ent->currentOrigin, ent->s.pos.trBase); ent->owner = self; // make it explode, but with less damage ent->splashDamage /= 3; ent->splashRadius /= 3; ent->e_ThinkFunc = thinkF_WP_Explode; - ent->nextthink = level.time + Q_irand( 500, 3000 ); + ent->nextthink = level.time + Q_irand(500, 3000); } } } - else if ( dist < ent->splashRadius - && self->client->ps.groundEntityNum != ENTITYNUM_NONE - && ( DotProduct( dir, forward ) < SABER_REFLECT_MISSILE_CONE - || !WP_ForcePowerUsable( self, FP_PUSH, 0 ) ) ) + else if (dist < ent->splashRadius + && self->client->ps.groundEntityNum != ENTITYNUM_NONE + && (DotProduct(dir, forward) < SABER_REFLECT_MISSILE_CONE + || !WP_ForcePowerUsable(self, FP_PUSH, 0))) {//NPCs try to evade it self->client->ps.forceJumpCharge = 480; } - else if ( (self->client->NPC_class != CLASS_REBORN || self->s.weapon == WP_SABER) ) + else if ((self->client->NPC_class != CLASS_REBORN || self->s.weapon == WP_SABER)) {//else, try to force-throw it away - if ( !ent->owner || !OnSameTeam( self, ent->owner ) ) + if (!ent->owner || !OnSameTeam(self, ent->owner)) { //FIXME: check forcePushRadius[NPC->client->ps.forcePowerLevel[FP_PUSH]] - ForceThrow( self, qfalse ); + ForceThrow(self, qfalse); } } //otherwise, can't block it, so we're screwed @@ -7728,45 +8318,45 @@ void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ) } } - if ( ent->s.weapon != WP_SABER ) + if (ent->s.weapon != WP_SABER) {//only block shots coming from behind - if ( (dot1 = DotProduct( dir, forward )) < SABER_REFLECT_MISSILE_CONE ) + if ((dot1 = DotProduct(dir, forward)) < SABER_REFLECT_MISSILE_CONE) continue; } - else if ( !self->s.number ) + else if (!self->s.number) {//player never auto-blocks thrown sabers continue; }//NPCs always try to block sabers coming from behind! //see if they're heading towards me - VectorCopy( ent->s.pos.trDelta, missile_dir ); - VectorNormalize( missile_dir ); - if ( (dot2 = DotProduct( dir, missile_dir )) > 0 ) + VectorCopy(ent->s.pos.trDelta, missile_dir); + VectorNormalize(missile_dir); + if ((dot2 = DotProduct(dir, missile_dir)) > 0) continue; //FIXME: must have a clear trace to me, too... - if ( dist < closestDist ) + if (dist < closestDist) { - VectorCopy( self->currentOrigin, traceTo ); + VectorCopy(self->currentOrigin, traceTo); traceTo[2] = self->absmax[2] - 4; - gi.trace( &trace, ent->currentOrigin, ent->mins, ent->maxs, traceTo, ent->s.number, ent->clipmask, (EG2_Collision)0, 0 ); - if ( trace.allsolid || trace.startsolid || (trace.fraction < 1.0f && trace.entityNum != self->s.number && trace.entityNum != self->client->ps.saberEntityNum) ) + gi.trace(&trace, ent->currentOrigin, ent->mins, ent->maxs, traceTo, ent->s.number, ent->clipmask, (EG2_Collision)0, 0); + if (trace.allsolid || trace.startsolid || (trace.fraction < 1.0f && trace.entityNum != self->s.number && trace.entityNum != self->client->ps.saberEntityNum)) {//okay, try one more check - VectorNormalize2( ent->s.pos.trDelta, entDir ); - VectorMA( ent->currentOrigin, radius, entDir, traceTo ); - gi.trace( &trace, ent->currentOrigin, ent->mins, ent->maxs, traceTo, ent->s.number, ent->clipmask, (EG2_Collision)0, 0 ); - if ( trace.allsolid || trace.startsolid || (trace.fraction < 1.0f && trace.entityNum != self->s.number && trace.entityNum != self->client->ps.saberEntityNum) ) + VectorNormalize2(ent->s.pos.trDelta, entDir); + VectorMA(ent->currentOrigin, radius, entDir, traceTo); + gi.trace(&trace, ent->currentOrigin, ent->mins, ent->maxs, traceTo, ent->s.number, ent->clipmask, (EG2_Collision)0, 0); + if (trace.allsolid || trace.startsolid || (trace.fraction < 1.0f && trace.entityNum != self->s.number && trace.entityNum != self->client->ps.saberEntityNum)) {//can't hit me, ignore it continue; } } - if ( self->s.number != 0 ) + if (self->s.number != 0) {//An NPC - if ( self->NPC && !self->enemy && ent->owner ) + if (self->NPC && !self->enemy && ent->owner) { - if ( ent->owner->health >= 0 && (!ent->owner->client || ent->owner->client->playerTeam != self->client->playerTeam) ) + if (ent->owner->health >= 0 && (!ent->owner->client || ent->owner->client->playerTeam != self->client->playerTeam)) { - G_SetEnemy( self, ent->owner ); + G_SetEnemy(self, ent->owner); } } } @@ -7776,34 +8366,34 @@ void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ) } } - if ( incoming ) + if (incoming) { - if ( self->NPC && !G_ControlledByPlayer( self ) ) + if (self->NPC && !G_ControlledByPlayer(self)) { - if ( Jedi_WaitingAmbush( self ) ) + if (Jedi_WaitingAmbush(self)) { - Jedi_Ambush( self ); + Jedi_Ambush(self); } - if ( ( self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_ROCKETTROOPER ) - && self->client->moveType == MT_FLYSWIM - && incoming->methodOfDeath != MOD_ROCKET_ALT ) + if ((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_ROCKETTROOPER) + && self->client->moveType == MT_FLYSWIM + && incoming->methodOfDeath != MOD_ROCKET_ALT) {//a hovering Boba Fett, not a tracking rocket - if ( !Q_irand( 0, 1 ) ) + if (!Q_irand(0, 1)) {//strafe self->NPC->standTime = 0; - self->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] = level.time + Q_irand( 1000, 2000 ); + self->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] = level.time + Q_irand(1000, 2000); } - if ( !Q_irand( 0, 1 ) ) + if (!Q_irand(0, 1)) {//go up/down - TIMER_Set( self, "heightChange", Q_irand( 1000, 3000 ) ); - self->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] = level.time + Q_irand( 1000, 2000 ); + TIMER_Set(self, "heightChange", Q_irand(1000, 3000)); + self->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] = level.time + Q_irand(1000, 2000); } } - else if ( self->client->NPC_class != CLASS_ROCKETTROOPER - && Jedi_SaberBlockGo( self, &self->NPC->last_ucmd, NULL, NULL, incoming ) != EVASION_NONE ) + else if (self->client->NPC_class != CLASS_ROCKETTROOPER + && Jedi_SaberBlockGo(self, &self->NPC->last_ucmd, NULL, NULL, incoming) != EVASION_NONE) {//make sure to turn on your saber if it's not on - if ( self->client->NPC_class != CLASS_BOBAFETT - && (self->client->NPC_class != CLASS_REBORN || self->s.weapon == WP_SABER) ) + if (self->client->NPC_class != CLASS_BOBAFETT + && (self->client->NPC_class != CLASS_REBORN || self->s.weapon == WP_SABER)) { self->client->ps.SaberActivate(); } @@ -7811,28 +8401,28 @@ void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ) } else//player { - if ( !(ucmd->buttons & BUTTON_USE) )//self->s.weapon == WP_SABER && self->client->ps.SaberActive() ) + if (!(ucmd->buttons & BUTTON_USE))//self->s.weapon == WP_SABER && self->client->ps.SaberActive() ) { - WP_SaberBlockNonRandom( self, incoming->currentOrigin, qtrue ); + WP_SaberBlockNonRandom(self, incoming->currentOrigin, qtrue); } else { vec3_t diff, start, end; float dist; - VectorSubtract( incoming->currentOrigin, self->currentOrigin, diff ); - dist = VectorLength( diff ); - VectorNormalize2( incoming->s.pos.trDelta, entDir ); - VectorMA( incoming->currentOrigin, dist, entDir, start ); - VectorCopy( self->currentOrigin, end ); - end[2] += self->maxs[2]*0.75f; - gi.trace( &trace, start, incoming->mins, incoming->maxs, end, incoming->s.number, MASK_SHOT, G2_COLLIDE, 10 ); + VectorSubtract(incoming->currentOrigin, self->currentOrigin, diff); + dist = VectorLength(diff); + VectorNormalize2(incoming->s.pos.trDelta, entDir); + VectorMA(incoming->currentOrigin, dist, entDir, start); + VectorCopy(self->currentOrigin, end); + end[2] += self->maxs[2] * 0.75f; + gi.trace(&trace, start, incoming->mins, incoming->maxs, end, incoming->s.number, MASK_SHOT, G2_COLLIDE, 10); - Jedi_DodgeEvasion( self, incoming->owner, &trace, HL_NONE ); + Jedi_DodgeEvasion(self, incoming->owner, &trace, HL_NONE); } - if ( incoming->owner && incoming->owner->client && (!self->enemy || self->enemy->s.weapon != WP_SABER) )//keep enemy jedi over shooters + if (incoming->owner && incoming->owner->client && (!self->enemy || self->enemy->s.weapon != WP_SABER))//keep enemy jedi over shooters { self->enemy = incoming->owner; - NPC_SetLookTarget( self, incoming->owner->s.number, level.time+1000 ); + NPC_SetLookTarget(self, incoming->owner->s.number, level.time + 1000); } } } @@ -7850,23 +8440,23 @@ void WP_SetSaberMove(gentity_t *self, short blocked) self->client->ps.saberBlocked = blocked; } -extern void CG_CubeOutline( vec3_t mins, vec3_t maxs, int time, unsigned int color, float alpha ); -void WP_SaberUpdate( gentity_t *self, usercmd_t *ucmd ) +extern void CG_CubeOutline(vec3_t mins, vec3_t maxs, int time, unsigned int color, float alpha); +void WP_SaberUpdate(gentity_t *self, usercmd_t *ucmd) { //float swap; float minsize = 16; - if(0)// if ( self->s.number != 0 ) + if (0)// if ( self->s.number != 0 ) {//for now only the player can do this // not anymore return; } - if ( !self->client ) + if (!self->client) { return; } - - if ( self->client->ps.saberEntityNum < 0 || self->client->ps.saberEntityNum >= ENTITYNUM_WORLD ) + + if (self->client->ps.saberEntityNum < 0 || self->client->ps.saberEntityNum >= ENTITYNUM_WORLD) {//never got one return; } @@ -7879,7 +8469,7 @@ void WP_SaberUpdate( gentity_t *self, usercmd_t *ucmd ) //vec3_t sabermins={-8,-8,-8}, sabermaxs={8,8,8}; gentity_t *saberent; - + if (self->client->ps.saberEntityNum <= 0) {//WTF?!! We lost it? return; @@ -7888,26 +8478,26 @@ void WP_SaberUpdate( gentity_t *self, usercmd_t *ucmd ) saberent = &g_entities[self->client->ps.saberEntityNum]; //FIXME: Based on difficulty level/jedi saber combat skill, make this bounding box fatter/smaller - if ( self->client->ps.saberBlocked != BLOCKED_NONE ) + if (self->client->ps.saberBlocked != BLOCKED_NONE) {//we're blocking, increase min size minsize = 32; } - if ( G_InCinematicSaberAnim( self ) ) + if (G_InCinematicSaberAnim(self)) {//fake some blocking self->client->ps.saberBlocking = BLK_TIGHT; - if ( self->client->ps.saber[0].Active() ) + if (self->client->ps.saber[0].Active()) { - self->client->ps.saber[0].ActivateTrail( 150 ); + self->client->ps.saber[0].ActivateTrail(150); } - if ( self->client->ps.saber[1].Active() ) + if (self->client->ps.saber[1].Active()) { - self->client->ps.saber[1].ActivateTrail( 150 ); + self->client->ps.saber[1].ActivateTrail(150); } } - + //is our saber in flight? - if ( !self->client->ps.saberInFlight ) + if (!self->client->ps.saberInFlight) { // It isn't, which means we can update its position as we will. qboolean alwaysBlock[MAX_SABERS][MAX_BLADES]; qboolean forceBlock = qfalse; @@ -7917,39 +8507,39 @@ void WP_SaberUpdate( gentity_t *self, usercmd_t *ucmd ) VectorClear(saberent->mins); VectorClear(saberent->maxs); - Vehicle_t *pVeh = G_IsRidingVehicle( self ); - if ( !self->client->ps.SaberActive() + Vehicle_t *pVeh = G_IsRidingVehicle(self); + if (!self->client->ps.SaberActive() || !self->client->ps.saberBlocking - || PM_InKnockDown( &self->client->ps ) - || PM_SuperBreakLoseAnim( self->client->ps.torsoAnim ) - || (pVeh && pVeh->m_pVehicleInfo && pVeh->m_pVehicleInfo->type != VH_ANIMAL && pVeh->m_pVehicleInfo->type != VH_FLIER) )//riding a vehicle that you cannot block shots on + || PM_InKnockDown(&self->client->ps) + || PM_SuperBreakLoseAnim(self->client->ps.torsoAnim) + || (pVeh && pVeh->m_pVehicleInfo && pVeh->m_pVehicleInfo->type != VH_ANIMAL && pVeh->m_pVehicleInfo->type != VH_FLIER))//riding a vehicle that you cannot block shots on {//can't block if saber isn't on int i, j; - for ( i = 0; i < MAX_SABERS; i++ ) + for (i = 0; i < MAX_SABERS; i++) { //initialize to not blocking - for ( j = 0; j < MAX_BLADES; j++ ) + for (j = 0; j < MAX_BLADES; j++) { alwaysBlock[i][j] = qfalse; } - if ( i > 0 && !self->client->ps.dualSabers ) + if (i > 0 && !self->client->ps.dualSabers) {//not using a second saber, leave it not blocking } else { - if ( (self->client->ps.saber[i].saberFlags2&SFL2_ALWAYS_BLOCK) ) + if ((self->client->ps.saber[i].saberFlags2&SFL2_ALWAYS_BLOCK)) { - for ( j = 0; j < self->client->ps.saber[i].numBlades; j++ ) + for (j = 0; j < self->client->ps.saber[i].numBlades; j++) { alwaysBlock[i][j] = qtrue; forceBlock = qtrue; } } - if ( self->client->ps.saber[i].bladeStyle2Start > 0 ) + if (self->client->ps.saber[i].bladeStyle2Start > 0) { - for ( j = self->client->ps.saber[i].bladeStyle2Start; j < self->client->ps.saber[i].numBlades; j++ ) + for (j = self->client->ps.saber[i].bladeStyle2Start; j < self->client->ps.saber[i].numBlades; j++) { - if ( (self->client->ps.saber[i].saberFlags2&SFL2_ALWAYS_BLOCK2) ) + if ((self->client->ps.saber[i].saberFlags2&SFL2_ALWAYS_BLOCK2)) { alwaysBlock[i][j] = qtrue; forceBlock = qtrue; @@ -7962,121 +8552,121 @@ void WP_SaberUpdate( gentity_t *self, usercmd_t *ucmd ) } } } - if ( !forceBlock ) + if (!forceBlock) { noBlocking = qtrue; } - else if ( !self->client->ps.saberBlocking ) + else if (!self->client->ps.saberBlocking) {//turn blocking on! self->client->ps.saberBlocking = BLK_TIGHT; } } - if ( noBlocking ) + if (noBlocking) { //VectorClear(saberent->mins); //VectorClear(saberent->maxs); G_SetOrigin(saberent, self->currentOrigin); } - else if ( self->client->ps.saberBlocking == BLK_TIGHT - || self->client->ps.saberBlocking == BLK_WIDE ) + else if (self->client->ps.saberBlocking == BLK_TIGHT + || self->client->ps.saberBlocking == BLK_WIDE) {//FIXME: keep bbox in front of player, even when wide? vec3_t saberOrg; - if ( !forceBlock - && ( (self->s.number&&!Jedi_SaberBusy(self)&&!g_saberRealisticCombat->integer) || (self->s.number == 0 && self->client->ps.saberBlocking == BLK_WIDE && (g_saberAutoBlocking->integer||self->client->ps.saberBlockingTime>level.time)) ) - && self->client->ps.weaponTime <= 0 - && !G_InCinematicSaberAnim( self ) ) + if (!forceBlock + && ((self->s.number&&!Jedi_SaberBusy(self) && !g_saberRealisticCombat->integer) || (self->s.number == 0 && self->client->ps.saberBlocking == BLK_WIDE && (g_saberAutoBlocking->integer || self->client->ps.saberBlockingTime>level.time))) + && self->client->ps.weaponTime <= 0 + && !G_InCinematicSaberAnim(self)) {//full-size blocking for non-attacking player with g_saberAutoBlocking on - vec3_t saberang={0,0,0}, fwd, sabermins={-8,-8,-8}, sabermaxs={8,8,8}; + vec3_t saberang = { 0, 0, 0 }, fwd, sabermins = { -8, -8, -8 }, sabermaxs = { 8, 8, 8 }; saberang[YAW] = self->client->ps.viewangles[YAW]; - AngleVectors( saberang, fwd, NULL, NULL ); + AngleVectors(saberang, fwd, NULL, NULL); - VectorMA( self->currentOrigin, 12, fwd, saberOrg ); - - VectorAdd( self->mins, sabermins, saberent->mins ); - VectorAdd( self->maxs, sabermaxs, saberent->maxs ); + VectorMA(self->currentOrigin, 12, fwd, saberOrg); + + VectorAdd(self->mins, sabermins, saberent->mins); + VectorAdd(self->maxs, sabermaxs, saberent->maxs); saberent->contents = CONTENTS_LIGHTSABER; - G_SetOrigin( saberent, saberOrg ); + G_SetOrigin(saberent, saberOrg); } else { vec3_t saberBase, saberTip; int numSabers = 1; - if ( self->client->ps.dualSabers ) + if (self->client->ps.dualSabers) { numSabers = 2; } - for ( int saberNum = 0; saberNum < numSabers; saberNum++ ) + for (int saberNum = 0; saberNum < numSabers; saberNum++) { - for ( int bladeNum = 0; bladeNum < self->client->ps.saber[saberNum].numBlades; bladeNum++ ) + for (int bladeNum = 0; bladeNum < self->client->ps.saber[saberNum].numBlades; bladeNum++) { - if ( self->client->ps.saber[saberNum].blade[bladeNum].length <= 0.0f ) + if (self->client->ps.saber[saberNum].blade[bladeNum].length <= 0.0f) {//don't include blades that are not on... continue; } - if ( forceBlock ) + if (forceBlock) {//doing blade-specific bbox-sizing only, see if this blade should be counted - if ( !alwaysBlock[saberNum][bladeNum] ) + if (!alwaysBlock[saberNum][bladeNum]) {//this blade doesn't count right now continue; } } - VectorCopy( self->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, saberBase ); - VectorMA( saberBase, self->client->ps.saber[saberNum].blade[bladeNum].length, self->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, saberTip ); - VectorMA( saberBase, self->client->ps.saber[saberNum].blade[bladeNum].length*0.5, self->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, saberOrg ); - for ( int i = 0; i < 3; i++ ) + VectorCopy(self->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, saberBase); + VectorMA(saberBase, self->client->ps.saber[saberNum].blade[bladeNum].length, self->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, saberTip); + VectorMA(saberBase, self->client->ps.saber[saberNum].blade[bladeNum].length*0.5, self->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, saberOrg); + for (int i = 0; i < 3; i++) { /* if ( saberTip[i] > self->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint[i] ) { - saberent->maxs[i] = saberTip[i] - saberOrg[i] + 8;//self->client->renderInfo.muzzlePoint[i]; - saberent->mins[i] = self->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint[i] - saberOrg[i] - 8; + saberent->maxs[i] = saberTip[i] - saberOrg[i] + 8;//self->client->renderInfo.muzzlePoint[i]; + saberent->mins[i] = self->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint[i] - saberOrg[i] - 8; } else //if ( saberTip[i] < self->client->renderInfo.muzzlePoint[i] ) { - saberent->maxs[i] = self->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint[i] - saberOrg[i] + 8; - saberent->mins[i] = saberTip[i] - saberOrg[i] - 8;//self->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint[i]; + saberent->maxs[i] = self->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint[i] - saberOrg[i] + 8; + saberent->mins[i] = saberTip[i] - saberOrg[i] - 8;//self->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint[i]; } */ float newSizeTip = (saberTip[i] - saberOrg[i]); - newSizeTip += (newSizeTip>=0)?8:-8; + newSizeTip += (newSizeTip >= 0) ? 8 : -8; float newSizeBase = (saberBase[i] - saberOrg[i]); - newSizeBase += (newSizeBase>=0)?8:-8; - if ( newSizeTip > saberent->maxs[i] ) + newSizeBase += (newSizeBase >= 0) ? 8 : -8; + if (newSizeTip > saberent->maxs[i]) { saberent->maxs[i] = newSizeTip; } - if ( newSizeBase > saberent->maxs[i] ) + if (newSizeBase > saberent->maxs[i]) { saberent->maxs[i] = newSizeBase; } - if ( newSizeTip < saberent->mins[i] ) + if (newSizeTip < saberent->mins[i]) { saberent->mins[i] = newSizeTip; } - if ( newSizeBase < saberent->mins[i] ) + if (newSizeBase < saberent->mins[i]) { saberent->mins[i] = newSizeBase; } } } } - if ( !forceBlock ) + if (!forceBlock) {//not doing special "alwaysBlock" bbox - if ( self->client->ps.weaponTime > 0 - || self->s.number - || g_saberAutoBlocking->integer - || self->client->ps.saberBlockingTime > level.time ) + if (self->client->ps.weaponTime > 0 + || self->s.number + || g_saberAutoBlocking->integer + || self->client->ps.saberBlockingTime > level.time) {//if attacking or blocking (or an NPC), inflate to a minimum size - for ( int i = 0; i < 3; i++ ) + for (int i = 0; i < 3; i++) { - if ( saberent->maxs[i] < minsize ) + if (saberent->maxs[i] < minsize) { saberent->maxs[i] = minsize; } - if ( saberent->mins[i] > -minsize ) + if (saberent->mins[i] > -minsize) { saberent->mins[i] = -minsize; } @@ -8084,63 +8674,63 @@ void WP_SaberUpdate( gentity_t *self, usercmd_t *ucmd ) } } saberent->contents = CONTENTS_LIGHTSABER; - G_SetOrigin( saberent, saberOrg ); + G_SetOrigin(saberent, saberOrg); } } /* else if (self->client->ps.saberBlocking == BLK_WIDE) { // Assuming that we are not swinging, the saber's bounding box should be around the player. - vec3_t saberang={0,0,0}, fwd; + vec3_t saberang={0,0,0}, fwd; - saberang[YAW] = self->client->ps.viewangles[YAW]; - AngleVectors( saberang, fwd, NULL, NULL ); + saberang[YAW] = self->client->ps.viewangles[YAW]; + AngleVectors( saberang, fwd, NULL, NULL ); - VectorMA(self->currentOrigin, 12, fwd, saberloc); - - VectorAdd(self->mins, sabermins, saberent->mins); - VectorAdd(self->maxs, sabermaxs, saberent->maxs); + VectorMA(self->currentOrigin, 12, fwd, saberloc); + + VectorAdd(self->mins, sabermins, saberent->mins); + VectorAdd(self->maxs, sabermaxs, saberent->maxs); - saberent->contents = CONTENTS_LIGHTSABER; + saberent->contents = CONTENTS_LIGHTSABER; - G_SetOrigin( saberent, saberloc); + G_SetOrigin( saberent, saberloc); } else if (self->client->ps.saberBlocking == BLK_TIGHT) { // If the player is swinging, the bbox is around just the saber - VectorCopy(self->client->renderInfo.muzzlePoint, sabermins); - // Put the limits of the bbox around the saber size. - VectorMA(sabermins, self->client->ps.saberLength, self->client->renderInfo.muzzleDir, sabermaxs); + VectorCopy(self->client->renderInfo.muzzlePoint, sabermins); + // Put the limits of the bbox around the saber size. + VectorMA(sabermins, self->client->ps.saberLength, self->client->renderInfo.muzzleDir, sabermaxs); - // Now make the mins into mins and the maxs into maxs - if (sabermins[0] > sabermaxs[0]) - { - swap = sabermins[0]; - sabermins[0] = sabermaxs[0]; - sabermaxs[0] = swap; - } - if (sabermins[1] > sabermaxs[1]) - { - swap = sabermins[1]; - sabermins[1] = sabermaxs[1]; - sabermaxs[1] = swap; - } - if (sabermins[2] > sabermaxs[2]) - { - swap = sabermins[2]; - sabermins[2] = sabermaxs[2]; - sabermaxs[2] = swap; - } + // Now make the mins into mins and the maxs into maxs + if (sabermins[0] > sabermaxs[0]) + { + swap = sabermins[0]; + sabermins[0] = sabermaxs[0]; + sabermaxs[0] = swap; + } + if (sabermins[1] > sabermaxs[1]) + { + swap = sabermins[1]; + sabermins[1] = sabermaxs[1]; + sabermaxs[1] = swap; + } + if (sabermins[2] > sabermaxs[2]) + { + swap = sabermins[2]; + sabermins[2] = sabermaxs[2]; + sabermaxs[2] = swap; + } - // Now the loc is halfway between the (absolute) mins and maxs - VectorAdd(sabermins, sabermaxs, saberloc); - VectorScale(saberloc, 0.5, saberloc); + // Now the loc is halfway between the (absolute) mins and maxs + VectorAdd(sabermins, sabermaxs, saberloc); + VectorScale(saberloc, 0.5, saberloc); - // Finally, turn the mins and maxs, which are absolute, into relative mins and maxs. - VectorSubtract(sabermins, saberloc, saberent->mins); - VectorSubtract(sabermaxs, saberloc, saberent->maxs); + // Finally, turn the mins and maxs, which are absolute, into relative mins and maxs. + VectorSubtract(sabermins, saberloc, saberent->mins); + VectorSubtract(sabermaxs, saberloc, saberent->maxs); - saberent->contents = CONTENTS_LIGHTSABER;// | CONTENTS_SHOTCLIP; + saberent->contents = CONTENTS_LIGHTSABER;// | CONTENTS_SHOTCLIP; - G_SetOrigin( saberent, saberloc); + G_SetOrigin( saberent, saberloc); } */ else @@ -8154,69 +8744,69 @@ void WP_SaberUpdate( gentity_t *self, usercmd_t *ucmd ) } else { - WP_SaberInFlightReflectCheck( self, ucmd ); + WP_SaberInFlightReflectCheck(self, ucmd); } #ifndef FINAL_BUILD - if ( d_saberCombat->integer > 2 ) + if (d_saberCombat->integer > 2) { - CG_CubeOutline( saberent->absmin, saberent->absmax, 50, WPDEBUG_SaberColor( self->client->ps.saber[0].blade[0].color ), 1 ); + CG_CubeOutline(saberent->absmin, saberent->absmax, 50, WPDEBUG_SaberColor(self->client->ps.saber[0].blade[0].color), 1); } #endif } #define MAX_RADIUS_ENTS 256 //NOTE: This can cause entities to be lost -qboolean G_CheckEnemyPresence( gentity_t *ent, int dir, float radius, float tolerance ) +qboolean G_CheckEnemyPresence(gentity_t *ent, int dir, float radius, float tolerance) { - gentity_t *radiusEnts[ MAX_RADIUS_ENTS ]; + gentity_t *radiusEnts[MAX_RADIUS_ENTS]; vec3_t mins, maxs; int numEnts; vec3_t checkDir, dir2checkEnt; float dist; int i; - switch( dir ) + switch (dir) { case DIR_RIGHT: - AngleVectors( ent->currentAngles, NULL, checkDir, NULL ); + AngleVectors(ent->currentAngles, NULL, checkDir, NULL); break; case DIR_LEFT: - AngleVectors( ent->currentAngles, NULL, checkDir, NULL ); - VectorScale( checkDir, -1, checkDir ); + AngleVectors(ent->currentAngles, NULL, checkDir, NULL); + VectorScale(checkDir, -1, checkDir); break; case DIR_FRONT: - AngleVectors( ent->currentAngles, checkDir, NULL, NULL ); + AngleVectors(ent->currentAngles, checkDir, NULL, NULL); break; case DIR_BACK: - AngleVectors( ent->currentAngles, checkDir, NULL, NULL ); - VectorScale( checkDir, -1, checkDir ); + AngleVectors(ent->currentAngles, checkDir, NULL, NULL); + VectorScale(checkDir, -1, checkDir); break; } //Get all ents in range, see if they're living clients and enemies, then check dot to them... //Setup the bbox to search in - for ( i = 0; i < 3; i++ ) + for (i = 0; i < 3; i++) { mins[i] = ent->currentOrigin[i] - radius; maxs[i] = ent->currentOrigin[i] + radius; } //Get a number of entities in a given space - numEnts = gi.EntitiesInBox( mins, maxs, radiusEnts, MAX_RADIUS_ENTS ); + numEnts = gi.EntitiesInBox(mins, maxs, radiusEnts, MAX_RADIUS_ENTS); - for ( i = 0; i < numEnts; i++ ) + for (i = 0; i < numEnts; i++) { //Don't consider self - if ( radiusEnts[i] == ent ) + if (radiusEnts[i] == ent) continue; //Must be valid - if ( G_ValidEnemy( ent, radiusEnts[i] ) == qfalse ) + if (G_ValidEnemy(ent, radiusEnts[i]) == qfalse) continue; - VectorSubtract( radiusEnts[i]->currentOrigin, ent->currentOrigin, dir2checkEnt ); - dist = VectorNormalize( dir2checkEnt ); - if ( dist <= radius - && DotProduct( dir2checkEnt, checkDir ) >= tolerance ) + VectorSubtract(radiusEnts[i]->currentOrigin, ent->currentOrigin, dir2checkEnt); + dist = VectorNormalize(dir2checkEnt); + if (dist <= radius + && DotProduct(dir2checkEnt, checkDir) >= tolerance) { //stop on the first one return qtrue; @@ -8230,57 +8820,57 @@ qboolean G_CheckEnemyPresence( gentity_t *ent, int dir, float radius, float tole //OTHER JEDI POWERS========================================================================= //OTHER JEDI POWERS========================================================================= //OTHER JEDI POWERS========================================================================= -extern gentity_t *TossClientItems( gentity_t *self ); -extern void ChangeWeapon( gentity_t *ent, int newWeapon ); -void WP_DropWeapon( gentity_t *dropper, vec3_t velocity ) +extern gentity_t *TossClientItems(gentity_t *self); +extern void ChangeWeapon(gentity_t *ent, int newWeapon); +void WP_DropWeapon(gentity_t *dropper, vec3_t velocity) { - if ( !dropper || !dropper->client ) + if (!dropper || !dropper->client) { return; } int replaceWeap = WP_NONE; int oldWeap = dropper->s.weapon; - gentity_t *weapon = TossClientItems( dropper ); - if ( oldWeap == WP_THERMAL && dropper->NPC ) + gentity_t *weapon = TossClientItems(dropper); + if (oldWeap == WP_THERMAL && dropper->NPC) {//Hmm, maybe all NPCs should go into melee? Not too many, though, or they mob you and look silly replaceWeap = WP_MELEE; } - if ( dropper->ghoul2.IsValid() ) + if (dropper->ghoul2.IsValid()) { - if ( dropper->weaponModel[0] > 0 ) + if (dropper->weaponModel[0] > 0) {//NOTE: guess you never drop the left-hand weapon, eh? - gi.G2API_RemoveGhoul2Model( dropper->ghoul2, dropper->weaponModel[0] ); + gi.G2API_RemoveGhoul2Model(dropper->ghoul2, dropper->weaponModel[0]); dropper->weaponModel[0] = -1; } } //FIXME: does this work on the player? - dropper->client->ps.stats[STAT_WEAPONS] |= ( 1 << replaceWeap ); - if ( !dropper->s.number ) + dropper->client->ps.stats[STAT_WEAPONS] |= (1 << replaceWeap); + if (!dropper->s.number) { - if ( oldWeap == WP_THERMAL ) + if (oldWeap == WP_THERMAL) { dropper->client->ps.ammo[weaponData[oldWeap].ammoIndex] -= weaponData[oldWeap].energyPerShot; } else { - dropper->client->ps.stats[STAT_WEAPONS] &= ~( 1 << oldWeap ); + dropper->client->ps.stats[STAT_WEAPONS] &= ~(1 << oldWeap); } - CG_ChangeWeapon( replaceWeap ); + CG_ChangeWeapon(replaceWeap); } else { - dropper->client->ps.stats[STAT_WEAPONS] &= ~( 1 << oldWeap ); + dropper->client->ps.stats[STAT_WEAPONS] &= ~(1 << oldWeap); } - ChangeWeapon( dropper, replaceWeap ); + ChangeWeapon(dropper, replaceWeap); dropper->s.weapon = replaceWeap; - if ( dropper->NPC ) + if (dropper->NPC) { dropper->NPC->last_ucmd.weapon = replaceWeap; } - if ( weapon != NULL && velocity && !VectorCompare( velocity, vec3_origin ) ) + if (weapon != NULL && velocity && !VectorCompare(velocity, vec3_origin)) {//weapon should have a direction to it's throw - VectorScale( velocity, 3, weapon->s.pos.trDelta );//NOTE: Presumes it is moving already...? - if ( weapon->s.pos.trDelta[2] < 150 ) + VectorScale(velocity, 3, weapon->s.pos.trDelta);//NOTE: Presumes it is moving already...? + if (weapon->s.pos.trDelta[2] < 150) {//this is presuming you don't want them to drop the weapon down on you... weapon->s.pos.trDelta[2] = 150; } @@ -8289,37 +8879,37 @@ void WP_DropWeapon( gentity_t *dropper, vec3_t velocity ) } } -void WP_KnockdownTurret( gentity_t *self, gentity_t *pas ) +void WP_KnockdownTurret(gentity_t *self, gentity_t *pas) { //knock it over - VectorCopy( pas->currentOrigin, pas->s.pos.trBase ); + VectorCopy(pas->currentOrigin, pas->s.pos.trBase); pas->s.pos.trType = TR_LINEAR_STOP; pas->s.pos.trDuration = 250; - pas->s.pos.trTime = level.time; - pas->s.pos.trDelta[2] = ( 12.0f / ( pas->s.pos.trDuration * 0.001f ) ); + pas->s.pos.trTime = level.time; + pas->s.pos.trDelta[2] = (12.0f / (pas->s.pos.trDuration * 0.001f)); - VectorCopy( pas->currentAngles, pas->s.apos.trBase ); + VectorCopy(pas->currentAngles, pas->s.apos.trBase); pas->s.apos.trType = TR_LINEAR_STOP; - pas->s.apos.trDuration = 250; - pas->s.apos.trTime = level.time; + pas->s.apos.trDuration = 250; + pas->s.apos.trTime = level.time; //FIXME: pick pitch/roll that always tilts it directly away from pusher - pas->s.apos.trDelta[PITCH] = ( 100.0f / ( pas->s.apos.trDuration * 0.001f ) ); + pas->s.apos.trDelta[PITCH] = (100.0f / (pas->s.apos.trDuration * 0.001f)); //kill it pas->count = 0; pas->nextthink = -1; - G_Sound( pas, G_SoundIndex( "sound/chars/turret/shutdown.wav" )); + G_Sound(pas, G_SoundIndex("sound/chars/turret/shutdown.wav")); //push effect? pas->forcePushTime = level.time + 600; // let the push effect last for 600 ms } -void WP_ForceThrowHazardTrooper( gentity_t *self, gentity_t *trooper, qboolean pull ) +void WP_ForceThrowHazardTrooper(gentity_t *self, gentity_t *trooper, qboolean pull) { - if ( !self || !self->client ) + if (!self || !self->client) { return; } - if ( !trooper || !trooper->client ) + if (!trooper || !trooper->client) { return; } @@ -8327,21 +8917,21 @@ void WP_ForceThrowHazardTrooper( gentity_t *self, gentity_t *trooper, qboolean p //all levels: see effect on them, they notice us trooper->forcePushTime = level.time + 600; // let the push effect last for 600 ms - if ( (pull&&self->client->ps.forcePowerLevel[FP_PULL]>FORCE_LEVEL_1) - || (!pull&&self->client->ps.forcePowerLevel[FP_PUSH]>FORCE_LEVEL_1) ) + if ((pull&&self->client->ps.forcePowerLevel[FP_PULL]>FORCE_LEVEL_1) + || (!pull&&self->client->ps.forcePowerLevel[FP_PUSH]>FORCE_LEVEL_1)) {//level 2: they stop for a couple seconds and make a sound - trooper->painDebounceTime = level.time + Q_irand( 1500, 2500 ); - G_AddVoiceEvent( trooper, Q_irand(EV_PUSHED1, EV_PUSHED3), Q_irand( 1000, 3000 ) ); - GEntity_PainFunc( trooper, self, self, trooper->currentOrigin, 0, MOD_MELEE ); + trooper->painDebounceTime = level.time + Q_irand(1500, 2500); + G_AddVoiceEvent(trooper, Q_irand(EV_PUSHED1, EV_PUSHED3), Q_irand(1000, 3000)); + GEntity_PainFunc(trooper, self, self, trooper->currentOrigin, 0, MOD_MELEE); - if ( (pull&&self->client->ps.forcePowerLevel[FP_PULL]>FORCE_LEVEL_2) - || (!pull&&self->client->ps.forcePowerLevel[FP_PUSH]>FORCE_LEVEL_2) ) + if ((pull&&self->client->ps.forcePowerLevel[FP_PULL]>FORCE_LEVEL_2) + || (!pull&&self->client->ps.forcePowerLevel[FP_PUSH]>FORCE_LEVEL_2)) {//level 3: they actually play a pushed anim and stumble a bit - vec3_t hazAngles = {0,trooper->currentAngles[YAW],0}; + vec3_t hazAngles = { 0, trooper->currentAngles[YAW], 0 }; int anim = -1; - if ( InFront( self->currentOrigin, trooper->currentOrigin, hazAngles ) ) + if (InFront(self->currentOrigin, trooper->currentOrigin, hazAngles)) {//I'm on front of him - if ( pull ) + if (pull) { anim = BOTH_PAIN4; } @@ -8352,7 +8942,7 @@ void WP_ForceThrowHazardTrooper( gentity_t *self, gentity_t *trooper, qboolean p } else {//I'm behind him - if ( pull ) + if (pull) { anim = BOTH_PAIN1; } @@ -8361,83 +8951,83 @@ void WP_ForceThrowHazardTrooper( gentity_t *self, gentity_t *trooper, qboolean p anim = BOTH_PAIN4; } } - if ( anim != -1 ) + if (anim != -1) { - if ( anim == BOTH_PAIN1 ) + if (anim == BOTH_PAIN1) {//make them take a couple steps back - AngleVectors( hazAngles, trooper->client->ps.velocity, NULL, NULL ); - VectorScale( trooper->client->ps.velocity, -40.0f, trooper->client->ps.velocity ); + AngleVectors(hazAngles, trooper->client->ps.velocity, NULL, NULL); + VectorScale(trooper->client->ps.velocity, -40.0f, trooper->client->ps.velocity); trooper->client->ps.pm_flags |= PMF_TIME_NOFRICTION; } - else if ( anim == BOTH_PAIN4 ) + else if (anim == BOTH_PAIN4) {//make them stumble forward - AngleVectors( hazAngles, trooper->client->ps.velocity, NULL, NULL ); - VectorScale( trooper->client->ps.velocity, 80.0f, trooper->client->ps.velocity ); + AngleVectors(hazAngles, trooper->client->ps.velocity, NULL, NULL); + VectorScale(trooper->client->ps.velocity, 80.0f, trooper->client->ps.velocity); trooper->client->ps.pm_flags |= PMF_TIME_NOFRICTION; } - NPC_SetAnim( trooper, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(trooper, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); trooper->painDebounceTime += trooper->client->ps.torsoAnimTimer; trooper->client->ps.pm_time = trooper->client->ps.torsoAnimTimer; } } - if ( trooper->NPC ) + if (trooper->NPC) { - if ( trooper->NPC->shotTime < trooper->painDebounceTime ) + if (trooper->NPC->shotTime < trooper->painDebounceTime) { trooper->NPC->shotTime = trooper->painDebounceTime; } } - trooper->client->ps.weaponTime = trooper->painDebounceTime-level.time; + trooper->client->ps.weaponTime = trooper->painDebounceTime - level.time; } else {//level 1: no pain reaction, but they should still notice - if ( trooper->enemy == NULL//not mad at anyone + if (trooper->enemy == NULL//not mad at anyone && trooper->client->playerTeam != self->client->playerTeam//not on our team && !(trooper->svFlags&SVF_LOCKEDENEMY)//not locked on an enemy && !(trooper->svFlags&SVF_IGNORE_ENEMIES)//not ignoring enemie - && !(self->flags&FL_NOTARGET) )//I'm not in notarget + && !(self->flags&FL_NOTARGET))//I'm not in notarget {//not already mad at them and can get mad at them, do so - G_SetEnemy( trooper, self ); + G_SetEnemy(trooper, self); } } } -void WP_ResistForcePush( gentity_t *self, gentity_t *pusher, qboolean noPenalty ) +void WP_ResistForcePush(gentity_t *self, gentity_t *pusher, qboolean noPenalty) { int parts; qboolean runningResist = qfalse; - if ( !self || self->health <= 0 || !self->client || !pusher || !pusher->client ) + if (!self || self->health <= 0 || !self->client || !pusher || !pusher->client) { return; } //NOTE: don't interrupt big anims with this! - if ( !PM_SaberCanInterruptMove( self->client->ps.saberMove, self->client->ps.torsoAnim ) ) + if (!PM_SaberCanInterruptMove(self->client->ps.saberMove, self->client->ps.torsoAnim)) {//can't interrupt my current torso anim/sabermove with this, so ignore it entirely! return; } - if ( (!self->s.number - ||( self->NPC && (self->NPC->aiFlags&NPCAI_BOSS_CHARACTER) ) - ||( self->client && self->client->NPC_class == CLASS_SHADOWTROOPER ) - /* - || self->client->NPC_class == CLASS_DESANN - || !Q_stricmp("Yoda",self->NPC_type) - || self->client->NPC_class == CLASS_LUKE*/ - ) - && (VectorLengthSquared( self->client->ps.velocity ) > 10000 || self->client->ps.forcePowerLevel[FP_PUSH] >= FORCE_LEVEL_3 || self->client->ps.forcePowerLevel[FP_PULL] >= FORCE_LEVEL_3 ) ) + if ((!self->s.number + || (self->NPC && (self->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) + || (self->client && self->client->NPC_class == CLASS_SHADOWTROOPER) + /* + || self->client->NPC_class == CLASS_DESANN + || !Q_stricmp("Yoda",self->NPC_type) + || self->client->NPC_class == CLASS_LUKE*/ + ) + && (VectorLengthSquared(self->client->ps.velocity) > 10000 || self->client->ps.forcePowerLevel[FP_PUSH] >= FORCE_LEVEL_3 || self->client->ps.forcePowerLevel[FP_PULL] >= FORCE_LEVEL_3)) { runningResist = qtrue; } - if ( !runningResist - && self->client->ps.groundEntityNum != ENTITYNUM_NONE - && !PM_SpinningSaberAnim( self->client->ps.legsAnim ) - && !PM_FlippingAnim( self->client->ps.legsAnim ) - && !PM_RollingAnim( self->client->ps.legsAnim ) - && !PM_InKnockDown( &self->client->ps ) - && !PM_CrouchAnim( self->client->ps.legsAnim )) + if (!runningResist + && self->client->ps.groundEntityNum != ENTITYNUM_NONE + && !PM_SpinningSaberAnim(self->client->ps.legsAnim) + && !PM_FlippingAnim(self->client->ps.legsAnim) + && !PM_RollingAnim(self->client->ps.legsAnim) + && !PM_InKnockDown(&self->client->ps) + && !PM_CrouchAnim(self->client->ps.legsAnim)) {//if on a surface and not in a spin or flip, play full body resist parts = SETANIM_BOTH; } @@ -8445,19 +9035,19 @@ void WP_ResistForcePush( gentity_t *self, gentity_t *pusher, qboolean noPenalty {//play resist just in torso parts = SETANIM_TORSO; } - NPC_SetAnim( self, parts, BOTH_RESISTPUSH, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, parts, BOTH_RESISTPUSH, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); - if ( !noPenalty ) + if (!noPenalty) { - if ( !runningResist ) + if (!runningResist) { - VectorClear( self->client->ps.velocity ); + VectorClear(self->client->ps.velocity); //still stop them from attacking or moving for a bit, though //FIXME: maybe push just a little (like, slide)? self->client->ps.weaponTime = 1000; - if ( self->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_SPEED)) { - self->client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value ); + self->client->ps.weaponTime = floor(self->client->ps.weaponTime * g_timescale->value); } self->client->ps.pm_time = self->client->ps.weaponTime; self->client->ps.pm_flags |= PMF_TIME_KNOCKBACK; @@ -8467,9 +9057,9 @@ void WP_ResistForcePush( gentity_t *self, gentity_t *pusher, qboolean noPenalty else { self->client->ps.weaponTime = 600; - if ( self->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_SPEED)) { - self->client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value ); + self->client->ps.weaponTime = floor(self->client->ps.weaponTime * g_timescale->value); } } } @@ -8478,41 +9068,41 @@ void WP_ResistForcePush( gentity_t *self, gentity_t *pusher, qboolean noPenalty //reset to 0 in case it's still > 0 from a previous push //self->client->pushEffectFadeTime = 0; - if ( !pusher //??? + if (!pusher //??? || pusher == self->enemy//my enemy tried to push me - || (pusher->client && pusher->client->playerTeam != self->client->playerTeam) )//someone not on my team tried to push me + || (pusher->client && pusher->client->playerTeam != self->client->playerTeam))//someone not on my team tried to push me { - Jedi_PlayBlockedPushSound( self ); + Jedi_PlayBlockedPushSound(self); } } -extern qboolean Boba_StopKnockdown( gentity_t *self, gentity_t *pusher, const vec3_t pushDir, qboolean forceKnockdown ); -extern qboolean Jedi_StopKnockdown( gentity_t *self, gentity_t *pusher, const vec3_t pushDir ); -void WP_ForceKnockdown( gentity_t *self, gentity_t *pusher, qboolean pull, qboolean strongKnockdown, qboolean breakSaberLock ) +extern qboolean Boba_StopKnockdown(gentity_t *self, gentity_t *pusher, const vec3_t pushDir, qboolean forceKnockdown); +extern qboolean Jedi_StopKnockdown(gentity_t *self, gentity_t *pusher, const vec3_t pushDir); +void WP_ForceKnockdown(gentity_t *self, gentity_t *pusher, qboolean pull, qboolean strongKnockdown, qboolean breakSaberLock) { - if ( !self || !self->client || !pusher || !pusher->client ) + if (!self || !self->client || !pusher || !pusher->client) { return; } - if ( self->client->NPC_class == CLASS_ROCKETTROOPER ) + if (self->client->NPC_class == CLASS_ROCKETTROOPER) { return; } - else if ( PM_LockedAnim( self->client->ps.legsAnim ) ) + else if (PM_LockedAnim(self->client->ps.legsAnim)) {//stuck doing something else return; } - else if ( Rosh_BeingHealed( self ) ) + else if (Rosh_BeingHealed(self)) { return; } //break out of a saberLock? - if ( self->client->ps.saberLockTime > level.time ) + if (self->client->ps.saberLockTime > level.time) { - if ( breakSaberLock - || (pusher && self->client->ps.saberLockEnemy == pusher->s.number) ) + if (breakSaberLock + || (pusher && self->client->ps.saberLockEnemy == pusher->s.number)) { self->client->ps.saberLockTime = 0; self->client->ps.saberLockEnemy = ENTITYNUM_NONE; @@ -8523,76 +9113,76 @@ void WP_ForceKnockdown( gentity_t *self, gentity_t *pusher, qboolean pull, qbool } } - if ( self->health > 0 ) + if (self->health > 0) { - if ( !self->s.number ) + if (!self->s.number) { - NPC_SetPainEvent( self ); + NPC_SetPainEvent(self); } else { - GEntity_PainFunc( self, pusher, pusher, self->currentOrigin, 0, MOD_MELEE ); + GEntity_PainFunc(self, pusher, pusher, self->currentOrigin, 0, MOD_MELEE); } vec3_t pushDir; - if ( pull ) + if (pull) { - VectorSubtract( pusher->currentOrigin, self->currentOrigin, pushDir ); + VectorSubtract(pusher->currentOrigin, self->currentOrigin, pushDir); } else { - VectorSubtract( self->currentOrigin, pusher->currentOrigin, pushDir ); + VectorSubtract(self->currentOrigin, pusher->currentOrigin, pushDir); } //FIXME: sometimes do this for some NPC force-users, too! - if ( Boba_StopKnockdown( self, pusher, pushDir, qtrue ) ) + if (Boba_StopKnockdown(self, pusher, pushDir, qtrue)) {//He can backflip instead of be knocked down return; } - else if ( Jedi_StopKnockdown( self, pusher, pushDir ) ) + else if (Jedi_StopKnockdown(self, pusher, pushDir)) {//They can backflip instead of be knocked down return; } - - G_CheckLedgeDive( self, 72, pushDir, qfalse, qfalse ); - if ( !PM_SpinningSaberAnim( self->client->ps.legsAnim ) - && !PM_FlippingAnim( self->client->ps.legsAnim ) - && !PM_RollingAnim( self->client->ps.legsAnim ) - && !PM_InKnockDown( &self->client->ps ) ) + G_CheckLedgeDive(self, 72, pushDir, qfalse, qfalse); + + if (!PM_SpinningSaberAnim(self->client->ps.legsAnim) + && !PM_FlippingAnim(self->client->ps.legsAnim) + && !PM_RollingAnim(self->client->ps.legsAnim) + && !PM_InKnockDown(&self->client->ps)) { int knockAnim = BOTH_KNOCKDOWN1;//default knockdown - if ( pusher->client->NPC_class == CLASS_DESANN && self->client->NPC_class != CLASS_LUKE ) + if (pusher->client->NPC_class == CLASS_DESANN && self->client->NPC_class != CLASS_LUKE) {//desann always knocks down, unless you're Luke strongKnockdown = qtrue; } - if ( !self->s.number - && !strongKnockdown - && ( (!pull&&(self->client->ps.forcePowerLevel[FP_PUSH]>FORCE_LEVEL_1||!g_spskill->integer)) || (pull&&(self->client->ps.forcePowerLevel[FP_PULL]>FORCE_LEVEL_1||!g_spskill->integer)) ) ) + if (!self->s.number + && !strongKnockdown + && ((!pull && (self->client->ps.forcePowerLevel[FP_PUSH]>FORCE_LEVEL_1 || !g_spskill->integer)) || (pull && (self->client->ps.forcePowerLevel[FP_PULL]>FORCE_LEVEL_1 || !g_spskill->integer)))) {//player only knocked down if pushed *hard* - if ( self->s.weapon == WP_SABER ) + if (self->s.weapon == WP_SABER) {//temp HACK: these are the only 2 pain anims that look good when holding a saber - knockAnim = PM_PickAnim( self, BOTH_PAIN2, BOTH_PAIN3 ); + knockAnim = PM_PickAnim(self, BOTH_PAIN2, BOTH_PAIN3); } else { - knockAnim = PM_PickAnim( self, BOTH_PAIN1, BOTH_PAIN18 ); + knockAnim = PM_PickAnim(self, BOTH_PAIN1, BOTH_PAIN18); } } - else if ( PM_CrouchAnim( self->client->ps.legsAnim ) ) + else if (PM_CrouchAnim(self->client->ps.legsAnim)) {//crouched knockdown knockAnim = BOTH_KNOCKDOWN4; } else {//plain old knockdown - vec3_t pLFwd, pLAngles = {0,self->client->ps.viewangles[YAW],0}; - vec3_t sFwd, sAngles = {0,pusher->client->ps.viewangles[YAW],0}; - AngleVectors( pLAngles, pLFwd, NULL, NULL ); - AngleVectors( sAngles, sFwd, NULL, NULL ); - if ( DotProduct( sFwd, pLFwd ) > 0.2f ) + vec3_t pLFwd, pLAngles = { 0, self->client->ps.viewangles[YAW], 0 }; + vec3_t sFwd, sAngles = { 0, pusher->client->ps.viewangles[YAW], 0 }; + AngleVectors(pLAngles, pLFwd, NULL, NULL); + AngleVectors(sAngles, sFwd, NULL, NULL); + if (DotProduct(sFwd, pLFwd) > 0.2f) {//pushing him from behind //FIXME: check to see if we're aiming below or above the waist? - if ( pull ) + if (pull) { knockAnim = BOTH_KNOCKDOWN1; } @@ -8603,7 +9193,7 @@ void WP_ForceKnockdown( gentity_t *self, gentity_t *pusher, qboolean pull, qbool } else {//pushing him from front - if ( pull ) + if (pull) { knockAnim = BOTH_KNOCKDOWN3; } @@ -8613,37 +9203,37 @@ void WP_ForceKnockdown( gentity_t *self, gentity_t *pusher, qboolean pull, qbool } } } - if ( knockAnim == BOTH_KNOCKDOWN1 && strongKnockdown ) + if (knockAnim == BOTH_KNOCKDOWN1 && strongKnockdown) {//push *hard* knockAnim = BOTH_KNOCKDOWN2; } - NPC_SetAnim( self, SETANIM_BOTH, knockAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - if ( self->s.number >= MAX_CLIENTS ) + NPC_SetAnim(self, SETANIM_BOTH, knockAnim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + if (self->s.number >= MAX_CLIENTS) {//randomize getup times - but not for boba int addTime; - if ( self->client->NPC_class == CLASS_BOBAFETT ) + if (self->client->NPC_class == CLASS_BOBAFETT) { - addTime = Q_irand( -500, 0 ); + addTime = Q_irand(-500, 0); } else { - addTime = Q_irand( -300, 300 ); + addTime = Q_irand(-300, 300); } self->client->ps.legsAnimTimer += addTime; self->client->ps.torsoAnimTimer += addTime; } else {//player holds extra long so you have more time to decide to do the quick getup - if ( PM_KnockDownAnim( self->client->ps.legsAnim ) ) + if (PM_KnockDownAnim(self->client->ps.legsAnim)) { self->client->ps.legsAnimTimer += PLAYER_KNOCKDOWN_HOLD_EXTRA_TIME; self->client->ps.torsoAnimTimer += PLAYER_KNOCKDOWN_HOLD_EXTRA_TIME; } } // - if ( pusher->NPC && pusher->enemy == self ) + if (pusher->NPC && pusher->enemy == self) {//pushed pushed down his enemy - G_AddVoiceEvent( pusher, Q_irand( EV_GLOAT1, EV_GLOAT3 ), 3000 ); + G_AddVoiceEvent(pusher, Q_irand(EV_GLOAT1, EV_GLOAT3), 3000); pusher->NPC->blockedSpeechDebounceTime = level.time + 3000; } } @@ -8651,50 +9241,50 @@ void WP_ForceKnockdown( gentity_t *self, gentity_t *pusher, qboolean pull, qbool self->forcePushTime = level.time + 600; // let the push effect last for 600 ms } -qboolean WP_ForceThrowable( gentity_t *ent, gentity_t *forwardEnt, gentity_t *self, qboolean pull, float cone, float radius, vec3_t forward ) +qboolean WP_ForceThrowable(gentity_t *ent, gentity_t *forwardEnt, gentity_t *self, qboolean pull, float cone, float radius, vec3_t forward) { if (ent == self) return qfalse; - if ( ent->owner == self && ent->s.weapon != WP_THERMAL )//can push your own thermals + if (ent->owner == self && ent->s.weapon != WP_THERMAL)//can push your own thermals return qfalse; - if ( !(ent->inuse) ) + if (!(ent->inuse)) return qfalse; - if ( ent->NPC && ent->NPC->scriptFlags & SCF_NO_FORCE ) + if (ent->NPC && ent->NPC->scriptFlags & SCF_NO_FORCE) { - if ( ent->s.weapon == WP_SABER ) + if (ent->s.weapon == WP_SABER) {//Hmm, should jedi do the resist behavior? If this is on, perhaps it's because of a cinematic? - WP_ResistForcePush( ent, self, qtrue ); + WP_ResistForcePush(ent, self, qtrue); } return qfalse; } - if ( (ent->flags&FL_FORCE_PULLABLE_ONLY) && !pull ) + if ((ent->flags&FL_FORCE_PULLABLE_ONLY) && !pull) {//simple HACK: cannot force-push ammo rack items (because they may start in solid) return qfalse; } //FIXME: don't push it if I already pushed it a little while ago - if ( ent->s.eType != ET_MISSILE ) + if (ent->s.eType != ET_MISSILE) { - if ( ent->client ) + if (ent->client) { - if ( ent->client->ps.pullAttackTime > level.time ) + if (ent->client->ps.pullAttackTime > level.time) { return qfalse; } } - if ( cone >= 1.0f ) + if (cone >= 1.0f) {//must be pointing right at them - if ( ent != forwardEnt ) + if (ent != forwardEnt) {//must be the person I'm looking right at - if ( ent->client && !pull + if (ent->client && !pull && ent->client->ps.forceGripEntityNum == self->s.number - && (self->s.eFlags&EF_FORCE_GRIPPED) ) + && (self->s.eFlags&EF_FORCE_GRIPPED)) {//this is the guy that's force-gripping me, use a wider cone regardless of force power level } else { - if ( ent->client && !pull + if (ent->client && !pull && ent->client->ps.forceDrainEntityNum == self->s.number - && (self->s.eFlags&EF_FORCE_DRAINED) ) + && (self->s.eFlags&EF_FORCE_DRAINED)) {//this is the guy that's force-draining me, use a wider cone regardless of force power level } else @@ -8704,28 +9294,28 @@ qboolean WP_ForceThrowable( gentity_t *ent, gentity_t *forwardEnt, gentity_t *se } } } - if ( ent->s.eType != ET_ITEM && ent->e_ThinkFunc != thinkF_G_RunObject )//|| !(ent->flags&FL_DROPPED_ITEM) )//was only dropped items + if (ent->s.eType != ET_ITEM && ent->e_ThinkFunc != thinkF_G_RunObject)//|| !(ent->flags&FL_DROPPED_ITEM) )//was only dropped items { //FIXME: need pushable objects - if ( ent->s.eFlags & EF_NODRAW ) + if (ent->s.eFlags & EF_NODRAW) { return qfalse; } - if ( !ent->client ) + if (!ent->client) { - if ( Q_stricmp( "lightsaber", ent->classname ) != 0 ) + if (Q_stricmp("lightsaber", ent->classname) != 0) {//not a lightsaber - if ( !(ent->svFlags&SVF_GLASS_BRUSH) ) + if (!(ent->svFlags&SVF_GLASS_BRUSH)) {//and not glass - if ( Q_stricmp( "func_door", ent->classname ) != 0 || !(ent->spawnflags & 2/*MOVER_FORCE_ACTIVATE*/) ) + if (Q_stricmp("func_door", ent->classname) != 0 || !(ent->spawnflags & 2/*MOVER_FORCE_ACTIVATE*/)) {//not a force-usable door - if ( Q_stricmp( "func_static", ent->classname ) != 0 || (!(ent->spawnflags&1/*F_PUSH*/)&&!(ent->spawnflags&2/*F_PULL*/)) || (ent->spawnflags&32/*SOLITARY*/) ) + if (Q_stricmp("func_static", ent->classname) != 0 || (!(ent->spawnflags & 1/*F_PUSH*/) && !(ent->spawnflags & 2/*F_PULL*/)) || (ent->spawnflags & 32/*SOLITARY*/)) {//not a force-usable func_static or, it is one, but it's solitary, so you only press it when looking right at it - if ( Q_stricmp( "limb", ent->classname ) ) + if (Q_stricmp("limb", ent->classname)) {//not a limb - if ( ent->s.weapon == WP_TURRET && !Q_stricmp( "PAS", ent->classname ) && ent->s.apos.trType == TR_STATIONARY ) + if (ent->s.weapon == WP_TURRET && !Q_stricmp("PAS", ent->classname) && ent->s.apos.trType == TR_STATIONARY) {//can knock over placed turrets - if ( !self->s.number || self->enemy != ent ) + if (!self->s.number || self->enemy != ent) {//only NPCs who are actively mad at this turret can push it over return qfalse; } @@ -8737,7 +9327,7 @@ qboolean WP_ForceThrowable( gentity_t *ent, gentity_t *forwardEnt, gentity_t *se } } } - else if ( ent->moverState != MOVER_POS1 && ent->moverState != MOVER_POS2 ) + else if (ent->moverState != MOVER_POS1 && ent->moverState != MOVER_POS2) {//not at rest return qfalse; } @@ -8745,68 +9335,68 @@ qboolean WP_ForceThrowable( gentity_t *ent, gentity_t *forwardEnt, gentity_t *se } //return qfalse; } - else if ( ent->client->NPC_class == CLASS_MARK1 ) + else if (ent->client->NPC_class == CLASS_MARK1) {//can't push Mark1 unless push 3 - if ( pull || self->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_3 ) + if (pull || self->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_3) { return qfalse; } } - else if ( ent->client->NPC_class == CLASS_GALAKMECH + else if (ent->client->NPC_class == CLASS_GALAKMECH || ent->client->NPC_class == CLASS_ATST - || ent->client->NPC_class == CLASS_RANCOR + || ent->client->NPC_class == CLASS_RANCOR || ent->client->NPC_class == CLASS_WAMPA - || ent->client->NPC_class == CLASS_SAND_CREATURE ) + || ent->client->NPC_class == CLASS_SAND_CREATURE) {//can't push ATST or Galak or Rancor or Wampa return qfalse; } - else if ( ent->s.weapon == WP_EMPLACED_GUN ) + else if (ent->s.weapon == WP_EMPLACED_GUN) {//FIXME: maybe can pull them out? return qfalse; } - else if ( ent->client->playerTeam == self->client->playerTeam && self->enemy && self->enemy != ent ) + else if (ent->client->playerTeam == self->client->playerTeam && self->enemy && self->enemy != ent) {//can't accidently push a teammate while in combat return qfalse; } - else if ( G_IsRidingVehicle( ent ) - && (ent->s.eFlags&EF_NODRAW) ) + else if (G_IsRidingVehicle(ent) + && (ent->s.eFlags&EF_NODRAW)) {//can't push/pull anyone riding *inside* vehicle return qfalse; } } - else if ( ent->s.eType == ET_ITEM ) + else if (ent->s.eType == ET_ITEM) { - if ( (ent->flags&FL_NO_KNOCKBACK) ) + if ((ent->flags&FL_NO_KNOCKBACK)) { return qfalse; } - if ( ent->item - && ent->item->giType == IT_HOLDABLE - && ent->item->giTag == INV_SECURITY_KEY ) + if (ent->item + && ent->item->giType == IT_HOLDABLE + && ent->item->giTag == INV_SECURITY_KEY) //&& (ent->flags&FL_DROPPED_ITEM) ??? {//dropped security keys can't be pushed? But placed ones can...? does this make any sense? - if ( !pull || self->s.number ) + if (!pull || self->s.number) {//can't push, NPC's can't do anything to it return qfalse; } - else + else { - if ( g_crosshairEntNum != ent->s.number ) + if (g_crosshairEntNum != ent->s.number) {//player can pull it if looking *right* at it - if ( cone >= 1.0f ) + if (cone >= 1.0f) {//we did a forwardEnt trace - if ( forwardEnt != ent ) + if (forwardEnt != ent) {//must be pointing right at them return qfalse; } } - else if ( forward ) + else if (forward) {//do a forwardEnt trace trace_t tr; vec3_t end; - VectorMA( self->client->renderInfo.eyePoint, radius, forward, end ); - gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_OPAQUE|CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_ITEM|CONTENTS_CORPSE, (EG2_Collision)0, 0 );//was MASK_SHOT, changed to match crosshair trace - if ( tr.entityNum != ent->s.number ) + VectorMA(self->client->renderInfo.eyePoint, radius, forward, end); + gi.trace(&tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_OPAQUE | CONTENTS_SOLID | CONTENTS_BODY | CONTENTS_ITEM | CONTENTS_CORPSE, (EG2_Collision)0, 0);//was MASK_SHOT, changed to match crosshair trace + if (tr.entityNum != ent->s.number) {//last chance return qfalse; } @@ -8818,7 +9408,7 @@ qboolean WP_ForceThrowable( gentity_t *ent, gentity_t *forwardEnt, gentity_t *se } else { - switch ( ent->s.weapon ) + switch (ent->s.weapon) {//only missiles with mass are force-pushable case WP_SABER: case WP_FLECHETTE: @@ -8828,16 +9418,16 @@ qboolean WP_ForceThrowable( gentity_t *ent, gentity_t *forwardEnt, gentity_t *se case WP_TRIP_MINE: case WP_DET_PACK: break; - //only alt-fire of this weapon is force-pushable + //only alt-fire of this weapon is force-pushable case WP_REPEATER: - if ( ent->methodOfDeath != MOD_REPEATER_ALT ) + if (ent->methodOfDeath != MOD_REPEATER_ALT) {//not an alt-fire missile return qfalse; } break; - //everything else cannot be pushed + //everything else cannot be pushed case WP_ATST_SIDE: - if ( ent->methodOfDeath != MOD_EXPLOSIVE ) + if (ent->methodOfDeath != MOD_EXPLOSIVE) {//not a rocket return qfalse; } @@ -8847,11 +9437,11 @@ qboolean WP_ForceThrowable( gentity_t *ent, gentity_t *forwardEnt, gentity_t *se break; } - if ( ent->s.pos.trType == TR_STATIONARY && (ent->s.eFlags&EF_MISSILE_STICK) ) + if (ent->s.pos.trType == TR_STATIONARY && (ent->s.eFlags&EF_MISSILE_STICK)) {//can't force-push/pull stuck missiles (detpacks, tripmines) return qfalse; } - if ( ent->s.pos.trType == TR_STATIONARY && ent->s.weapon != WP_THERMAL ) + if (ent->s.pos.trType == TR_STATIONARY && ent->s.weapon != WP_THERMAL) {//only thermal detonators can be pushed once stopped return qfalse; } @@ -8859,7 +9449,7 @@ qboolean WP_ForceThrowable( gentity_t *ent, gentity_t *forwardEnt, gentity_t *se return qtrue; } -void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) +void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) {//FIXME: pass in a target ent so we (an NPC) can push/pull just one targeted ent. //shove things in front of you away float dist; @@ -8872,39 +9462,39 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) int i, e; int ent_count = 0; int radius; - vec3_t center, ent_org, size, forward, right, end, dir, fwdangles = {0}; + vec3_t center, ent_org, size, forward, right, end, dir, fwdangles = { 0 }; float dot1, cone; trace_t tr; int anim, hold, soundIndex, cost, actualCost; qboolean noResist = qfalse; - if ( self->health <= 0 ) + if (self->health <= 0) { return; } - if ( self->client->ps.leanofs ) + if (self->client->ps.leanofs) {//can't force-throw while leaning return; } - if ( self->client->ps.forcePowerDebounce[FP_PUSH] > level.time ) + if (self->client->ps.forcePowerDebounce[FP_PUSH] > level.time) {//already pushing- now you can't haul someone across the room, sorry return; } - if ( self->client->ps.forcePowerDebounce[FP_PULL] > level.time ) + if (self->client->ps.forcePowerDebounce[FP_PULL] > level.time) {//already pulling- now you can't haul someone across the room, sorry return; } - if ( self->client->ps.pullAttackTime > level.time ) + if (self->client->ps.pullAttackTime > level.time) {//already pull-attacking return; } - if ( !self->s.number && (cg.zoomMode || in_camera) ) + if (!self->s.number && (cg.zoomMode || in_camera)) {//can't force throw/pull when zoomed in or in cinematic return; } - if ( self->client->ps.saberLockTime > level.time ) + if (self->client->ps.saberLockTime > level.time) { - if ( pull || self->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_3 ) + if (pull || self->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_3) {//this can be a way to break out return; } @@ -8913,16 +9503,16 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) self->client->ps.saberLockEnemy = ENTITYNUM_NONE; } - if ( self->client->ps.legsAnim == BOTH_KNOCKDOWN3 + if (self->client->ps.legsAnim == BOTH_KNOCKDOWN3 || (self->client->ps.torsoAnim == BOTH_FORCE_GETUP_F1 && self->client->ps.torsoAnimTimer > 400) || (self->client->ps.torsoAnim == BOTH_FORCE_GETUP_F2 && self->client->ps.torsoAnimTimer > 900) || (self->client->ps.torsoAnim == BOTH_GETUP3 && self->client->ps.torsoAnimTimer > 500) || (self->client->ps.torsoAnim == BOTH_GETUP4 && self->client->ps.torsoAnimTimer > 300) - || (self->client->ps.torsoAnim == BOTH_GETUP5 && self->client->ps.torsoAnimTimer > 500) ) + || (self->client->ps.torsoAnim == BOTH_GETUP5 && self->client->ps.torsoAnimTimer > 500)) {//we're face-down, so we'd only be force-push/pulling the floor return; } - if ( pull ) + if (pull) { radius = forcePushPullRadius[self->client->ps.forcePowerLevel[FP_PULL]]; } @@ -8931,57 +9521,57 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) radius = forcePushPullRadius[self->client->ps.forcePowerLevel[FP_PUSH]]; } - if ( !radius ) + if (!radius) {//no ability to do this yet - return; + return; } - if ( pull ) + if (pull) { cost = forcePowerNeeded[FP_PULL]; - if ( !WP_ForcePowerUsable( self, FP_PULL, cost ) ) + if (!WP_ForcePowerUsable(self, FP_PULL, cost)) { return; } //make sure this plays and that you cannot press fire for about 200ms after this anim = BOTH_FORCEPULL; - soundIndex = G_SoundIndex( "sound/weapons/force/pull.wav" ); + soundIndex = G_SoundIndex("sound/weapons/force/pull.wav"); hold = 200; } else { cost = forcePowerNeeded[FP_PUSH]; - if ( !WP_ForcePowerUsable( self, FP_PUSH, cost ) ) + if (!WP_ForcePowerUsable(self, FP_PUSH, cost)) { return; } //make sure this plays and that you cannot press fire for about 1 second after this anim = BOTH_FORCEPUSH; - soundIndex = G_SoundIndex( "sound/weapons/force/push.wav" ); + soundIndex = G_SoundIndex("sound/weapons/force/push.wav"); hold = 650; } int parts = SETANIM_TORSO; - if ( !PM_InKnockDown( &self->client->ps ) ) + if (!PM_InKnockDown(&self->client->ps)) { - if ( self->client->ps.saberLockTime > level.time ) + if (self->client->ps.saberLockTime > level.time) { self->client->ps.saberLockTime = 0; self->painDebounceTime = level.time + 2000; hold += 1000; parts = SETANIM_BOTH; } - else if ( !VectorLengthSquared( self->client->ps.velocity ) && !(self->client->ps.pm_flags&PMF_DUCKED)) + else if (!VectorLengthSquared(self->client->ps.velocity) && !(self->client->ps.pm_flags&PMF_DUCKED)) { parts = SETANIM_BOTH; } } - NPC_SetAnim( self, parts, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART ); + NPC_SetAnim(self, parts, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_RESTART); self->client->ps.saberMove = self->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in self->client->ps.saberBlocked = BLOCKED_NONE; - if ( self->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_SPEED)) { - hold = floor( hold*g_timescale->value ); + hold = floor(hold*g_timescale->value); } self->client->ps.weaponTime = hold;//was 1000, but want to swing sooner //do effect... FIXME: build-up or delay this until in proper part of anim @@ -8989,21 +9579,21 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) //reset to 0 in case it's still > 0 from a previous push self->client->pushEffectFadeTime = 0; - G_Sound( self, soundIndex ); + G_Sound(self, soundIndex); - if ( (!pull && self->client->ps.forcePowersForced&(1<client->ps.forcePowersForced&(1<client->NPC_class==CLASS_KYLE&&(self->spawnflags&1)&&TIMER_Done( self, "kyleTakesSaber" )) ) + if ((!pull && self->client->ps.forcePowersForced&(1 << FP_PUSH)) + || (pull && self->client->ps.forcePowersForced&(1 << FP_PULL)) + || (pull&&self->client->NPC_class == CLASS_KYLE && (self->spawnflags & 1) && TIMER_Done(self, "kyleTakesSaber"))) { noResist = qtrue; } - VectorCopy( self->client->ps.viewangles, fwdangles ); + VectorCopy(self->client->ps.viewangles, fwdangles); //fwdangles[1] = self->client->ps.viewangles[1]; - AngleVectors( fwdangles, forward, right, NULL ); - VectorCopy( self->currentOrigin, center ); + AngleVectors(fwdangles, forward, right, NULL); + VectorCopy(self->currentOrigin, center); - if ( pull ) + if (pull) { cone = forcePullCone[self->client->ps.forcePowerLevel[FP_PULL]]; } @@ -9014,19 +9604,19 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) // if ( cone >= 1.0f ) {//must be pointing right at them - VectorMA( self->client->renderInfo.eyePoint, radius, forward, end ); - gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_OPAQUE|CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_ITEM|CONTENTS_CORPSE, (EG2_Collision)0, 0 );//was MASK_SHOT, changed to match crosshair trace - if ( tr.entityNum < ENTITYNUM_WORLD ) + VectorMA(self->client->renderInfo.eyePoint, radius, forward, end); + gi.trace(&tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_OPAQUE | CONTENTS_SOLID | CONTENTS_BODY | CONTENTS_ITEM | CONTENTS_CORPSE, (EG2_Collision)0, 0);//was MASK_SHOT, changed to match crosshair trace + if (tr.entityNum < ENTITYNUM_WORLD) {//found something right in front of self, forwardEnt = &g_entities[tr.entityNum]; - if ( !forwardEnt->client && !Q_stricmp( "func_static", forwardEnt->classname ) ) + if (!forwardEnt->client && !Q_stricmp("func_static", forwardEnt->classname)) { - if ( (forwardEnt->spawnflags&1/*F_PUSH*/)||(forwardEnt->spawnflags&2/*F_PULL*/) ) + if ((forwardEnt->spawnflags & 1/*F_PUSH*/) || (forwardEnt->spawnflags & 2/*F_PULL*/)) {//push/pullable - if ( (forwardEnt->spawnflags&32/*SOLITARY*/) ) + if ((forwardEnt->spawnflags & 32/*SOLITARY*/)) {//can only push/pull ME, ignore all others - if ( forwardEnt->NPC_targetname == NULL - || (self->targetname&&Q_stricmp( forwardEnt->NPC_targetname, self->targetname ) == 0) ) + if (forwardEnt->NPC_targetname == NULL + || (self->targetname&&Q_stricmp(forwardEnt->NPC_targetname, self->targetname) == 0)) {//anyone can push it or only 1 person can push it and it's me push_list[0] = forwardEnt; ent_count = numListedEntities = 1; @@ -9037,123 +9627,125 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) } } - if ( forwardEnt ) + if (forwardEnt) { - if ( G_TryingPullAttack( self, &self->client->usercmd, qtrue ) ) + if (G_TryingPullAttack(self, &self->client->usercmd, qtrue)) {//we're going to try to do a pull attack on our forwardEnt - if ( WP_ForceThrowable( forwardEnt, forwardEnt, self, pull, cone, radius, forward ) ) + if (WP_ForceThrowable(forwardEnt, forwardEnt, self, pull, cone, radius, forward)) {//we will actually pull-attack him, so don't pull him or anything else here //activate the power, here, though, so the later check that actually does the pull attack knows we tried to pull - self->client->ps.forcePowersActive |= (1<client->ps.forcePowersActive |= (1 << FP_PULL); self->client->ps.forcePowerDebounce[FP_PULL] = level.time + 100; //force-pulling return; } } } - if ( !numListedEntities ) + if (!numListedEntities) { - for ( i = 0 ; i < 3 ; i++ ) + for (i = 0; i < 3; i++) { mins[i] = center[i] - radius; maxs[i] = center[i] + radius; } - numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); + numListedEntities = gi.EntitiesInBox(mins, maxs, entityList, MAX_GENTITIES); - for ( e = 0 ; e < numListedEntities ; e++ ) + for (e = 0; e < numListedEntities; e++) { - ent = entityList[ e ]; + ent = entityList[e]; - if ( !WP_ForceThrowable( ent, forwardEnt, self, pull, cone, radius, forward ) ) + if (!WP_ForceThrowable(ent, forwardEnt, self, pull, cone, radius, forward)) { continue; } //this is all to see if we need to start a saber attack, if it's in flight, this doesn't matter // find the distance from the edge of the bounding box - for ( i = 0 ; i < 3 ; i++ ) + for (i = 0; i < 3; i++) { - if ( center[i] < ent->absmin[i] ) + if (center[i] < ent->absmin[i]) { v[i] = ent->absmin[i] - center[i]; - } else if ( center[i] > ent->absmax[i] ) + } + else if (center[i] > ent->absmax[i]) { v[i] = center[i] - ent->absmax[i]; - } else + } + else { v[i] = 0; } } - VectorSubtract( ent->absmax, ent->absmin, size ); - VectorMA( ent->absmin, 0.5, size, ent_org ); + VectorSubtract(ent->absmax, ent->absmin, size); + VectorMA(ent->absmin, 0.5, size, ent_org); //see if they're in front of me - VectorSubtract( ent_org, center, dir ); - VectorNormalize( dir ); - if ( cone < 1.0f ) + VectorSubtract(ent_org, center, dir); + VectorNormalize(dir); + if (cone < 1.0f) {//must be within the forward cone - if ( ent->client && !pull + if (ent->client && !pull && ent->client->ps.forceGripEntityNum == self->s.number - && (self->s.eFlags&EF_FORCE_GRIPPED) ) + && (self->s.eFlags&EF_FORCE_GRIPPED)) {//this is the guy that's force-gripping me, use a wider cone regardless of force power level - if ( (dot1 = DotProduct( dir, forward )) < cone-0.3f ) + if ((dot1 = DotProduct(dir, forward)) < cone - 0.3f) continue; } - else if ( ent->client && !pull + else if (ent->client && !pull && ent->client->ps.forceDrainEntityNum == self->s.number - && (self->s.eFlags&EF_FORCE_DRAINED) ) + && (self->s.eFlags&EF_FORCE_DRAINED)) {//this is the guy that's force-draining me, use a wider cone regardless of force power level - if ( (dot1 = DotProduct( dir, forward )) < cone-0.3f ) + if ((dot1 = DotProduct(dir, forward)) < cone - 0.3f) continue; } - else if ( ent->s.eType == ET_MISSILE )//&& ent->s.eType != ET_ITEM && ent->e_ThinkFunc != thinkF_G_RunObject ) + else if (ent->s.eType == ET_MISSILE)//&& ent->s.eType != ET_ITEM && ent->e_ThinkFunc != thinkF_G_RunObject ) {//missiles are easier to force-push, never require direct trace (FIXME: maybe also items and general physics objects) - if ( (dot1 = DotProduct( dir, forward )) < cone-0.3f ) + if ((dot1 = DotProduct(dir, forward)) < cone - 0.3f) continue; } - else if ( (dot1 = DotProduct( dir, forward )) < cone ) + else if ((dot1 = DotProduct(dir, forward)) < cone) { continue; } } - else if ( ent->s.eType == ET_MISSILE ) + else if (ent->s.eType == ET_MISSILE) {//a missile and we're at force level 1... just use a small cone, but not ridiculously small - if ( (dot1 = DotProduct( dir, forward )) < 0.75f ) + if ((dot1 = DotProduct(dir, forward)) < 0.75f) { continue; } }//else is an NPC or brush entity that our forward trace would have to hit - dist = VectorLength( v ); + dist = VectorLength(v); //Now check and see if we can actually deflect it //method1 //if within a certain range, deflect it - if ( ent->s.eType == ET_MISSILE && cone >= 1.0f ) + if (ent->s.eType == ET_MISSILE && cone >= 1.0f) {//smaller radius on missile checks at force push 1 - if ( dist >= 192 ) + if (dist >= 192) { continue; } } - else if ( dist >= radius ) + else if (dist >= radius) { continue; } - + //in PVS? - if ( !ent->bmodel && !gi.inPVS( ent_org, self->client->renderInfo.eyePoint ) ) + if (!ent->bmodel && !gi.inPVS(ent_org, self->client->renderInfo.eyePoint)) {//must be in PVS continue; } - if ( ent != forwardEnt ) + if (ent != forwardEnt) {//don't need to trace against forwardEnt again - //really should have a clear LOS to this thing... - gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, ent_org, self->s.number, MASK_FORCE_PUSH, (EG2_Collision)0, 0 );//was MASK_SHOT, but changed to match above trace and crosshair trace - if ( tr.fraction < 1.0f && tr.entityNum != ent->s.number ) + //really should have a clear LOS to this thing... + gi.trace(&tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, ent_org, self->s.number, MASK_FORCE_PUSH, (EG2_Collision)0, 0);//was MASK_SHOT, but changed to match above trace and crosshair trace + if (tr.fraction < 1.0f && tr.entityNum != ent->s.number) {//must have clear LOS continue; } @@ -9165,49 +9757,49 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) } } - if ( ent_count ) + if (ent_count) { - for ( int x = 0; x < ent_count; x++ ) + for (int x = 0; x < ent_count; x++) { - if ( push_list[x]->client ) + if (push_list[x]->client) { vec3_t pushDir; - float knockback = pull?0:200; - + float knockback = pull ? 0 : 200; + //SIGH band-aid... - if ( push_list[x]->s.number >= MAX_CLIENTS - && self->s.number < MAX_CLIENTS ) + if (push_list[x]->s.number >= MAX_CLIENTS + && self->s.number < MAX_CLIENTS) { - if ( (push_list[x]->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_GRIP)) //&& push_list[x]->client->ps.forcePowerDebounce[FP_GRIP] < level.time - && push_list[x]->client->ps.forceGripEntityNum == self->s.number ) + && push_list[x]->client->ps.forceGripEntityNum == self->s.number) { - WP_ForcePowerStop( push_list[x], FP_GRIP ); + WP_ForcePowerStop(push_list[x], FP_GRIP); } - if ( (push_list[x]->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_DRAIN)) //&& push_list[x]->client->ps.forcePowerDebounce[FP_DRAIN] < level.time - && push_list[x]->client->ps.forceDrainEntityNum == self->s.number ) + && push_list[x]->client->ps.forceDrainEntityNum == self->s.number) { - WP_ForcePowerStop( push_list[x], FP_DRAIN ); + WP_ForcePowerStop(push_list[x], FP_DRAIN); } } - if ( Rosh_BeingHealed( push_list[x] ) ) + if (Rosh_BeingHealed(push_list[x])) { continue; } - if ( push_list[x]->client->NPC_class == CLASS_HAZARD_TROOPER - && push_list[x]->health > 0 ) + if (push_list[x]->client->NPC_class == CLASS_HAZARD_TROOPER + && push_list[x]->health > 0) {//living hazard troopers resist push/pull - WP_ForceThrowHazardTrooper( self, push_list[x], pull ); + WP_ForceThrowHazardTrooper(self, push_list[x], pull); continue; } - if ( fake ) + if (fake) {//always resist - WP_ResistForcePush( push_list[x], self, qfalse ); + WP_ResistForcePush(push_list[x], self, qfalse); continue; } -//FIXMEFIXMEFIXMEFIXMEFIXME: extern a lot of this common code when I have the time!!! + //FIXMEFIXMEFIXMEFIXMEFIXME: extern a lot of this common code when I have the time!!! int powerLevel, powerUse; if (pull) { @@ -9219,33 +9811,33 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) powerLevel = self->client->ps.forcePowerLevel[FP_PUSH]; powerUse = FP_PUSH; } - int modPowerLevel = WP_AbsorbConversion( push_list[x], push_list[x]->client->ps.forcePowerLevel[FP_ABSORB], self, powerUse, powerLevel, forcePowerNeeded[self->client->ps.forcePowerLevel[powerUse]] ); - if (push_list[x]->client->NPC_class==CLASS_ASSASSIN_DROID || - push_list[x]->client->NPC_class==CLASS_HAZARD_TROOPER) + int modPowerLevel = WP_AbsorbConversion(push_list[x], push_list[x]->client->ps.forcePowerLevel[FP_ABSORB], self, powerUse, powerLevel, forcePowerNeeded[self->client->ps.forcePowerLevel[powerUse]]); + if (push_list[x]->client->NPC_class == CLASS_ASSASSIN_DROID || + push_list[x]->client->NPC_class == CLASS_HAZARD_TROOPER) { modPowerLevel = 0; // devides throw by 10 } //First, if this is the player we're push/pulling, see if he can counter it - if ( modPowerLevel != -1 + if (modPowerLevel != -1 && !noResist - && InFront( self->currentOrigin, push_list[x]->client->renderInfo.eyePoint, push_list[x]->client->ps.viewangles, 0.3f ) ) + && InFront(self->currentOrigin, push_list[x]->client->renderInfo.eyePoint, push_list[x]->client->ps.viewangles, 0.3f)) {//absorbed and I'm in front of them //counter it - if ( push_list[x]->client->ps.forcePowerLevel[FP_ABSORB] > FORCE_LEVEL_2 ) + if (push_list[x]->client->ps.forcePowerLevel[FP_ABSORB] > FORCE_LEVEL_2) {//no reaction at all } else { - WP_ResistForcePush( push_list[x], self, qfalse ); + WP_ResistForcePush(push_list[x], self, qfalse); push_list[x]->client->ps.saberMove = push_list[x]->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in push_list[x]->client->ps.saberBlocked = BLOCKED_NONE; } continue; } - else if ( !push_list[x]->s.number ) + else if (!push_list[x]->s.number) {//player - if ( !noResist + if (!noResist && push_list[x]->health > 0 //alive && push_list[x]->client //client && push_list[x]->client->ps.forceRageRecoveryTime < level.time //not recobering from rage @@ -9253,20 +9845,20 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) //&& push_list[x]->client->ps.torsoAnim != BOTH_HUGGER1// wasn't trying to grip-drain anyone && push_list[x]->client->ps.torsoAnim != BOTH_FORCE_DRAIN_GRAB_START// wasn't trying to grip-drain anyone && push_list[x]->client->ps.torsoAnim != BOTH_FORCE_DRAIN_GRAB_HOLD// wasn't trying to grip-drain anyone - && ((self->client->NPC_class != CLASS_DESANN&&Q_stricmp("Yoda",self->NPC_type)) || !Q_irand( 0, 2 ) )//only 30% chance of resisting a Desann push + && ((self->client->NPC_class != CLASS_DESANN&&Q_stricmp("Yoda", self->NPC_type)) || !Q_irand(0, 2))//only 30% chance of resisting a Desann push && push_list[x]->client->ps.groundEntityNum != ENTITYNUM_NONE//on the ground - && !PM_InKnockDown( &push_list[x]->client->ps )//not knocked down already + && !PM_InKnockDown(&push_list[x]->client->ps)//not knocked down already && push_list[x]->client->ps.saberLockTime < level.time//not involved in a saberLock && push_list[x]->client->ps.weaponTime < level.time//not attacking or otherwise busy - && (push_list[x]->client->ps.weapon == WP_SABER||push_list[x]->client->ps.weapon == WP_MELEE) )//using saber or fists + && (push_list[x]->client->ps.weapon == WP_SABER || push_list[x]->client->ps.weapon == WP_MELEE))//using saber or fists {//trying to push or pull the player! - if ( push_list[x]->client->ps.powerups[PW_FORCE_PUSH] > level.time//player was pushing/pulling too - ||( pull && Q_irand( 0, (push_list[x]->client->ps.forcePowerLevel[FP_PULL] - self->client->ps.forcePowerLevel[FP_PULL])*2+1 ) > 0 )//player's pull is high enough - ||( !pull && Q_irand( 0, (push_list[x]->client->ps.forcePowerLevel[FP_PUSH] - self->client->ps.forcePowerLevel[FP_PUSH])*2+1 ) > 0 ) )//player's push is high enough + if (push_list[x]->client->ps.powerups[PW_FORCE_PUSH] > level.time//player was pushing/pulling too + || (pull && Q_irand(0, (push_list[x]->client->ps.forcePowerLevel[FP_PULL] - self->client->ps.forcePowerLevel[FP_PULL]) * 2 + 1) > 0)//player's pull is high enough + || (!pull && Q_irand(0, (push_list[x]->client->ps.forcePowerLevel[FP_PUSH] - self->client->ps.forcePowerLevel[FP_PUSH]) * 2 + 1) > 0))//player's push is high enough {//player's force push/pull is high enough to try to stop me - if ( InFront( self->currentOrigin, push_list[x]->client->renderInfo.eyePoint, push_list[x]->client->ps.viewangles, 0.3f ) ) + if (InFront(self->currentOrigin, push_list[x]->client->renderInfo.eyePoint, push_list[x]->client->ps.viewangles, 0.3f)) {//I'm in front of player - WP_ResistForcePush( push_list[x], self, qfalse ); + WP_ResistForcePush(push_list[x], self, qfalse); push_list[x]->client->ps.saberMove = push_list[x]->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in push_list[x]->client->ps.saberBlocked = BLOCKED_NONE; continue; @@ -9274,42 +9866,42 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) } } } - else if ( push_list[x]->client && Jedi_WaitingAmbush( push_list[x] ) ) + else if (push_list[x]->client && Jedi_WaitingAmbush(push_list[x])) { - WP_ForceKnockdown( push_list[x], self, pull, qtrue, qfalse ); + WP_ForceKnockdown(push_list[x], self, pull, qtrue, qfalse); continue; } - G_KnockOffVehicle( push_list[x], self, pull ); - - if ( !pull + G_KnockOffVehicle(push_list[x], self, pull); + + if (!pull && push_list[x]->client->ps.forceDrainEntityNum == self->s.number - && (self->s.eFlags&EF_FORCE_DRAINED) ) + && (self->s.eFlags&EF_FORCE_DRAINED)) {//stop them from draining me now, dammit! - WP_ForcePowerStop( push_list[x], FP_DRAIN ); + WP_ForcePowerStop(push_list[x], FP_DRAIN); } //okay, everyone else (or player who couldn't resist it)... - if ( ((self->s.number == 0 && Q_irand( 0, 2 ) ) || Q_irand( 0, 2 ) ) && push_list[x]->client && push_list[x]->health > 0 //a living client - && push_list[x]->client->ps.weapon == WP_SABER //Jedi - && push_list[x]->health > 0 //alive - && push_list[x]->client->ps.forceRageRecoveryTime < level.time //not recobering from rage - && ((self->client->NPC_class != CLASS_DESANN&&Q_stricmp("Yoda",self->NPC_type)) || !Q_irand( 0, 2 ) )//only 30% chance of resisting a Desann push - && push_list[x]->client->ps.groundEntityNum != ENTITYNUM_NONE //on the ground - && InFront( self->currentOrigin, push_list[x]->currentOrigin, push_list[x]->client->ps.viewangles, 0.3f ) //I'm in front of him - && ( push_list[x]->client->ps.powerups[PW_FORCE_PUSH] > level.time ||//he's pushing too - (push_list[x]->s.number != 0 && push_list[x]->client->ps.weaponTime < level.time)//not the player and not attacking (NPC jedi auto-defend against pushes) - ) + if (((self->s.number == 0 && Q_irand(0, 2)) || Q_irand(0, 2)) && push_list[x]->client && push_list[x]->health > 0 //a living client + && push_list[x]->client->ps.weapon == WP_SABER //Jedi + && push_list[x]->health > 0 //alive + && push_list[x]->client->ps.forceRageRecoveryTime < level.time //not recobering from rage + && ((self->client->NPC_class != CLASS_DESANN&&Q_stricmp("Yoda", self->NPC_type)) || !Q_irand(0, 2))//only 30% chance of resisting a Desann push + && push_list[x]->client->ps.groundEntityNum != ENTITYNUM_NONE //on the ground + && InFront(self->currentOrigin, push_list[x]->currentOrigin, push_list[x]->client->ps.viewangles, 0.3f) //I'm in front of him + && (push_list[x]->client->ps.powerups[PW_FORCE_PUSH] > level.time ||//he's pushing too + (push_list[x]->s.number != 0 && push_list[x]->client->ps.weaponTime < level.time)//not the player and not attacking (NPC jedi auto-defend against pushes) + ) ) {//Jedi don't get pushed, they resist as long as they aren't already attacking and are on the ground - if ( push_list[x]->client->ps.saberLockTime > level.time ) + if (push_list[x]->client->ps.saberLockTime > level.time) {//they're in a lock - if ( push_list[x]->client->ps.saberLockEnemy != self->s.number ) + if (push_list[x]->client->ps.saberLockEnemy != self->s.number) {//they're not in a lock with me continue; } - else if ( pull || self->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_3 || - push_list[x]->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2 ) + else if (pull || self->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_3 || + push_list[x]->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2) {//they're in a lock with me, but my push is too weak continue; } @@ -9317,152 +9909,152 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) {//we will knock them down self->painDebounceTime = 0; self->client->ps.weaponTime = 500; - if ( self->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_SPEED)) { - self->client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value ); + self->client->ps.weaponTime = floor(self->client->ps.weaponTime * g_timescale->value); } } } int resistChance = Q_irand(0, 2); - if ( push_list[x]->s.number >= MAX_CLIENTS ) + if (push_list[x]->s.number >= MAX_CLIENTS) {//NPC - if ( g_spskill->integer == 1 ) + if (g_spskill->integer == 1) {//stupid tweak for graham resistChance = Q_irand(0, 3); } } - if ( noResist || - ( !pull - && modPowerLevel == -1 - && self->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2 - && !resistChance - && push_list[x]->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_3 ) + if (noResist || + (!pull + && modPowerLevel == -1 + && self->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2 + && !resistChance + && push_list[x]->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_3) ) {//a level 3 push can even knock down a jedi - if ( PM_InKnockDown( &push_list[x]->client->ps ) ) + if (PM_InKnockDown(&push_list[x]->client->ps)) {//can't knock them down again continue; } - WP_ForceKnockdown( push_list[x], self, pull, qfalse, qtrue ); + WP_ForceKnockdown(push_list[x], self, pull, qfalse, qtrue); } else { - WP_ResistForcePush( push_list[x], self, qfalse ); + WP_ResistForcePush(push_list[x], self, qfalse); } } - else + else { //UGH: FIXME: for enemy jedi, they should probably always do force pull 3, and not your weapon (if player?)! //shove them - if ( push_list[x]->NPC - && push_list[x]->NPC->jumpState == JS_JUMPING ) + if (push_list[x]->NPC + && push_list[x]->NPC->jumpState == JS_JUMPING) {//don't interrupt a scripted jump //WP_ResistForcePush( push_list[x], self, qfalse ); push_list[x]->forcePushTime = level.time + 600; // let the push effect last for 600 ms continue; } - if ( push_list[x]->s.number - && (push_list[x]->message || (push_list[x]->flags&FL_NO_KNOCKBACK)) ) + if (push_list[x]->s.number + && (push_list[x]->message || (push_list[x]->flags&FL_NO_KNOCKBACK))) {//an NPC who has a key //don't push me... FIXME: maybe can pull the key off me? - WP_ForceKnockdown( push_list[x], self, pull, qfalse, qfalse ); + WP_ForceKnockdown(push_list[x], self, pull, qfalse, qfalse); continue; } - if ( pull ) + if (pull) { - VectorSubtract( self->currentOrigin, push_list[x]->currentOrigin, pushDir ); - if ( self->client->ps.forcePowerLevel[FP_PULL] >= FORCE_LEVEL_3 - && self->client->NPC_class == CLASS_KYLE - && (self->spawnflags&1) - && TIMER_Done( self, "kyleTakesSaber" ) + VectorSubtract(self->currentOrigin, push_list[x]->currentOrigin, pushDir); + if (self->client->ps.forcePowerLevel[FP_PULL] >= FORCE_LEVEL_3 + && self->client->NPC_class == CLASS_KYLE + && (self->spawnflags & 1) + && TIMER_Done(self, "kyleTakesSaber") && push_list[x]->client - && push_list[x]->client->ps.weapon == WP_SABER + && push_list[x]->client->ps.weapon == WP_SABER && !push_list[x]->client->ps.saberInFlight - && push_list[x]->client->ps.saberEntityNum < ENTITYNUM_WORLD - && !PM_InOnGroundAnim( &push_list[x]->client->ps ) ) + && push_list[x]->client->ps.saberEntityNum < ENTITYNUM_WORLD + && !PM_InOnGroundAnim(&push_list[x]->client->ps)) { vec3_t throwVec; - VectorScale( pushDir, 10.0f, throwVec ); - WP_SaberLose( push_list[x], throwVec ); - NPC_SetAnim( push_list[x], SETANIM_BOTH, BOTH_LOSE_SABER, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + VectorScale(pushDir, 10.0f, throwVec); + WP_SaberLose(push_list[x], throwVec); + NPC_SetAnim(push_list[x], SETANIM_BOTH, BOTH_LOSE_SABER, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); push_list[x]->client->ps.torsoAnimTimer += 500; push_list[x]->client->ps.pm_time = push_list[x]->client->ps.weaponTime = push_list[x]->client->ps.torsoAnimTimer; push_list[x]->client->ps.pm_flags |= PMF_TIME_KNOCKBACK; push_list[x]->client->ps.saberMove = LS_NONE; push_list[x]->aimDebounceTime = level.time + push_list[x]->client->ps.torsoAnimTimer; - VectorClear( push_list[x]->client->ps.velocity ); - VectorClear( push_list[x]->client->ps.moveDir ); + VectorClear(push_list[x]->client->ps.velocity); + VectorClear(push_list[x]->client->ps.moveDir); //Kyle will stand around for a bit, too... self->client->ps.pm_time = self->client->ps.weaponTime = 2000; self->client->ps.pm_flags |= PMF_TIME_KNOCKBACK; self->painDebounceTime = level.time + self->client->ps.weaponTime; - TIMER_Set( self, "kyleTakesSaber", Q_irand( 60000, 180000 ) );//don't do this again for a while - G_AddVoiceEvent( self, Q_irand(EV_TAUNT1,EV_TAUNT3), Q_irand( 4000, 6000 ) ); - VectorClear( self->client->ps.velocity ); - VectorClear( self->client->ps.moveDir ); + TIMER_Set(self, "kyleTakesSaber", Q_irand(60000, 180000));//don't do this again for a while + G_AddVoiceEvent(self, Q_irand(EV_TAUNT1, EV_TAUNT3), Q_irand(4000, 6000)); + VectorClear(self->client->ps.velocity); + VectorClear(self->client->ps.moveDir); continue; } - else if ( push_list[x]->NPC - && (push_list[x]->NPC->scriptFlags&SCF_DONT_FLEE) ) + else if (push_list[x]->NPC + && (push_list[x]->NPC->scriptFlags&SCF_DONT_FLEE)) {//*SIGH*... if an NPC can't flee, they can't run after and pick up their weapon, do don't drop it } - else if ( self->client->ps.forcePowerLevel[FP_PULL] > FORCE_LEVEL_1 + else if (self->client->ps.forcePowerLevel[FP_PULL] > FORCE_LEVEL_1 && push_list[x]->client->NPC_class != CLASS_ROCKETTROOPER//rockettroopers never drop their weapon && push_list[x]->client->NPC_class != CLASS_VEHICLE && push_list[x]->client->NPC_class != CLASS_BOBAFETT && push_list[x]->client->NPC_class != CLASS_TUSKEN && push_list[x]->client->NPC_class != CLASS_HAZARD_TROOPER && push_list[x]->client->NPC_class != CLASS_ASSASSIN_DROID - && push_list[x]->s.weapon != WP_SABER - && push_list[x]->s.weapon != WP_MELEE - && push_list[x]->s.weapon != WP_THERMAL + && push_list[x]->s.weapon != WP_SABER + && push_list[x]->s.weapon != WP_MELEE + && push_list[x]->s.weapon != WP_THERMAL && push_list[x]->s.weapon != WP_CONCUSSION // so rax can't drop his - ) + ) {//yank the weapon - NOTE: level 1 just knocks them down, not take weapon //FIXME: weapon yank anim if not a knockdown? - if ( InFront( self->currentOrigin, push_list[x]->currentOrigin, push_list[x]->client->ps.viewangles, 0.0f ) ) + if (InFront(self->currentOrigin, push_list[x]->currentOrigin, push_list[x]->client->ps.viewangles, 0.0f)) {//enemy has to be facing me, too... - WP_DropWeapon( push_list[x], pushDir ); + WP_DropWeapon(push_list[x], pushDir); } } - knockback += VectorNormalize( pushDir ); - if ( knockback > 200 ) + knockback += VectorNormalize(pushDir); + if (knockback > 200) { knockback = 200; } - if ( self->client->ps.forcePowerLevel[FP_PULL] < FORCE_LEVEL_3 ) + if (self->client->ps.forcePowerLevel[FP_PULL] < FORCE_LEVEL_3) {//maybe just knock them down knockback /= 3; } } else { - VectorSubtract( push_list[x]->currentOrigin, self->currentOrigin, pushDir ); - knockback -= VectorNormalize( pushDir ); - if ( knockback < 100 ) + VectorSubtract(push_list[x]->currentOrigin, self->currentOrigin, pushDir); + knockback -= VectorNormalize(pushDir); + if (knockback < 100) { knockback = 100; } //scale for push level - if ( self->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_2) {//maybe just knock them down knockback /= 3; } - else if ( self->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2 ) + else if (self->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2) {//super-hard push //Hmm, maybe in this case can even nudge/knockdown a jedi? Especially if close? //knockback *= 5; } } - if ( modPowerLevel != -1 ) + if (modPowerLevel != -1) { - if ( !modPowerLevel ) + if (!modPowerLevel) { knockback /= 10.0f; } - else if ( modPowerLevel == 1 ) + else if (modPowerLevel == 1) { knockback /= 6.0f; } @@ -9472,81 +10064,81 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) } } //actually push/pull the enemy - G_Throw( push_list[x], pushDir, knockback ); + G_Throw(push_list[x], pushDir, knockback); //make it so they don't actually hurt me when pulled at me... push_list[x]->forcePuller = self->s.number; - if ( push_list[x]->client->ps.groundEntityNum != ENTITYNUM_NONE ) + if (push_list[x]->client->ps.groundEntityNum != ENTITYNUM_NONE) {//if on the ground, make sure they get shoved up some - if ( push_list[x]->client->ps.velocity[2] < knockback ) + if (push_list[x]->client->ps.velocity[2] < knockback) { push_list[x]->client->ps.velocity[2] = knockback; } } - if ( push_list[x]->health > 0 ) + if (push_list[x]->health > 0) {//target is still alive - if ( (push_list[x]->s.number||(cg.renderingThirdPerson&&!cg.zoomMode)) //NPC or 3rd person player + if ((push_list[x]->s.number || (cg.renderingThirdPerson&&!cg.zoomMode)) //NPC or 3rd person player && ((!pull&&self->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_2 && push_list[x]->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_1) //level 1 push - || (pull && self->client->ps.forcePowerLevel[FP_PULL] < FORCE_LEVEL_2 && push_list[x]->client->ps.forcePowerLevel[FP_PULL] < FORCE_LEVEL_1)) )//level 1 pull + || (pull && self->client->ps.forcePowerLevel[FP_PULL] < FORCE_LEVEL_2 && push_list[x]->client->ps.forcePowerLevel[FP_PULL] < FORCE_LEVEL_1)))//level 1 pull {//NPC or third person player (without force push/pull skill), and force push/pull level is at 1 - WP_ForceKnockdown( push_list[x], self, pull, (!pull&&knockback>150), qfalse ); + WP_ForceKnockdown(push_list[x], self, pull, (!pull&&knockback>150), qfalse); } - else if ( !push_list[x]->s.number ) + else if (!push_list[x]->s.number) {//player, have to force an anim on him - WP_ForceKnockdown( push_list[x], self, pull, (!pull&&knockback>150), qfalse ); + WP_ForceKnockdown(push_list[x], self, pull, (!pull&&knockback>150), qfalse); } else {//NPC and force-push/pull at level 2 or higher - WP_ForceKnockdown( push_list[x], self, pull, (!pull&&knockback>100), qfalse ); + WP_ForceKnockdown(push_list[x], self, pull, (!pull&&knockback>100), qfalse); } } push_list[x]->forcePushTime = level.time + 600; // let the push effect last for 600 ms } } - else if ( !fake ) + else if (!fake) {//not a fake push/pull - if ( push_list[x]->s.weapon == WP_SABER && (push_list[x]->contents&CONTENTS_LIGHTSABER) ) + if (push_list[x]->s.weapon == WP_SABER && (push_list[x]->contents&CONTENTS_LIGHTSABER)) {//a thrown saber, just send it back /* if ( pull ) {//steal it? } - else */if ( push_list[x]->owner && push_list[x]->owner->client && push_list[x]->owner->client->ps.SaberActive() && push_list[x]->s.pos.trType == TR_LINEAR && push_list[x]->owner->client->ps.saberEntityState != SES_RETURNING ) + else */if (push_list[x]->owner && push_list[x]->owner->client && push_list[x]->owner->client->ps.SaberActive() && push_list[x]->s.pos.trType == TR_LINEAR && push_list[x]->owner->client->ps.saberEntityState != SES_RETURNING) {//it's on and being controlled //FIXME: prevent it from damaging me? - if ( self->s.number == 0 || Q_irand( 0, 2 ) ) + if (self->s.number == 0 || Q_irand(0, 2)) {//certain chance of throwing it aside and turning it off? //give it some velocity away from me //FIXME: maybe actually push or pull it? - if ( Q_irand( 0, 1 ) ) + if (Q_irand(0, 1)) { - VectorScale( right, -1, right ); + VectorScale(right, -1, right); } - G_ReflectMissile( self, push_list[x], right ); + G_ReflectMissile(self, push_list[x], right); //FIXME: isn't turning off!!! - WP_SaberDrop( push_list[x]->owner, push_list[x] ); + WP_SaberDrop(push_list[x]->owner, push_list[x]); } else { - WP_SaberReturn( push_list[x]->owner, push_list[x] ); + WP_SaberReturn(push_list[x]->owner, push_list[x]); } //different effect? } } - else if ( push_list[x]->s.eType == ET_MISSILE - && push_list[x]->s.pos.trType != TR_STATIONARY - && (push_list[x]->s.pos.trType != TR_INTERPOLATE||push_list[x]->s.weapon != WP_THERMAL) )//rolling and stationary thermal detonators are dealt with below + else if (push_list[x]->s.eType == ET_MISSILE + && push_list[x]->s.pos.trType != TR_STATIONARY + && (push_list[x]->s.pos.trType != TR_INTERPOLATE || push_list[x]->s.weapon != WP_THERMAL))//rolling and stationary thermal detonators are dealt with below { vec3_t dir2Me; - VectorSubtract( self->currentOrigin, push_list[x]->currentOrigin, dir2Me ); - float dot = DotProduct( push_list[x]->s.pos.trDelta, dir2Me ); - if ( pull ) + VectorSubtract(self->currentOrigin, push_list[x]->currentOrigin, dir2Me); + float dot = DotProduct(push_list[x]->s.pos.trDelta, dir2Me); + if (pull) {//deflect rather than reflect? } - else + else { - if ( push_list[x]->s.eFlags&EF_MISSILE_STICK ) + if (push_list[x]->s.eFlags&EF_MISSILE_STICK) {//caught a sticky in-air push_list[x]->s.eType = ET_MISSILE; push_list[x]->s.eFlags &= ~EF_MISSILE_STICK; @@ -9554,137 +10146,137 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) push_list[x]->splashDamage /= 3; push_list[x]->splashRadius /= 3; push_list[x]->e_ThinkFunc = thinkF_WP_Explode; - push_list[x]->nextthink = level.time + Q_irand( 500, 3000 ); + push_list[x]->nextthink = level.time + Q_irand(500, 3000); } - if ( dot >= 0 ) + if (dot >= 0) {//it's heading towards me - G_ReflectMissile( self, push_list[x], forward ); + G_ReflectMissile(self, push_list[x], forward); } else { - VectorScale( push_list[x]->s.pos.trDelta, 1.25f, push_list[x]->s.pos.trDelta ); + VectorScale(push_list[x]->s.pos.trDelta, 1.25f, push_list[x]->s.pos.trDelta); } //deflect sound //G_Sound( push_list[x], G_SoundIndex( va("sound/weapons/blaster/reflect%d.wav", Q_irand( 1, 3 ) ) ) ); //push_list[x]->forcePushTime = level.time + 600; // let the push effect last for 600 ms } - if ( push_list[x]->s.eType == ET_MISSILE - && push_list[x]->s.weapon == WP_ROCKET_LAUNCHER - && push_list[x]->damage < 60 ) + if (push_list[x]->s.eType == ET_MISSILE + && push_list[x]->s.weapon == WP_ROCKET_LAUNCHER + && push_list[x]->damage < 60) {//pushing away a rocket raises it's damage to the max for NPCs push_list[x]->damage = 60; } } - else if ( push_list[x]->svFlags & SVF_GLASS_BRUSH ) + else if (push_list[x]->svFlags & SVF_GLASS_BRUSH) {//break the glass trace_t tr; vec3_t pushDir; float damage = 800; - AngleVectors( self->client->ps.viewangles, forward, NULL, NULL ); - VectorNormalize( forward ); - VectorMA( self->client->renderInfo.eyePoint, radius, forward, end ); - gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 ); - if ( tr.entityNum != push_list[x]->s.number || tr.fraction == 1.0 || tr.allsolid || tr.startsolid ) + AngleVectors(self->client->ps.viewangles, forward, NULL, NULL); + VectorNormalize(forward); + VectorMA(self->client->renderInfo.eyePoint, radius, forward, end); + gi.trace(&tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, (EG2_Collision)0, 0); + if (tr.entityNum != push_list[x]->s.number || tr.fraction == 1.0 || tr.allsolid || tr.startsolid) {//must be pointing right at it continue; } - if ( pull ) + if (pull) { - VectorSubtract( self->client->renderInfo.eyePoint, tr.endpos, pushDir ); + VectorSubtract(self->client->renderInfo.eyePoint, tr.endpos, pushDir); } else { - VectorSubtract( tr.endpos, self->client->renderInfo.eyePoint, pushDir ); + VectorSubtract(tr.endpos, self->client->renderInfo.eyePoint, pushDir); } /* VectorSubtract( push_list[x]->absmax, push_list[x]->absmin, size ); VectorMA( push_list[x]->absmin, 0.5, size, center ); if ( pull ) { - VectorSubtract( self->client->renderInfo.eyePoint, center, pushDir ); + VectorSubtract( self->client->renderInfo.eyePoint, center, pushDir ); } else { - VectorSubtract( center, self->client->renderInfo.eyePoint, pushDir ); + VectorSubtract( center, self->client->renderInfo.eyePoint, pushDir ); } */ - damage -= VectorNormalize( pushDir ); - if ( damage < 200 ) + damage -= VectorNormalize(pushDir); + if (damage < 200) { damage = 200; } - VectorScale( pushDir, damage, pushDir ); + VectorScale(pushDir, damage, pushDir); - G_Damage( push_list[x], self, self, pushDir, tr.endpos, damage, 0, MOD_UNKNOWN ); + G_Damage(push_list[x], self, self, pushDir, tr.endpos, damage, 0, MOD_UNKNOWN); } - else if ( !Q_stricmp( "func_static", push_list[x]->classname ) ) + else if (!Q_stricmp("func_static", push_list[x]->classname)) {//force-usable func_static - if ( !pull && (push_list[x]->spawnflags&1/*F_PUSH*/) ) + if (!pull && (push_list[x]->spawnflags & 1/*F_PUSH*/)) { - if ( push_list[x]->NPC_targetname == NULL - || (self->targetname&&Q_stricmp( push_list[x]->NPC_targetname, self->targetname ) == 0) ) + if (push_list[x]->NPC_targetname == NULL + || (self->targetname&&Q_stricmp(push_list[x]->NPC_targetname, self->targetname) == 0)) {//anyone can pull it or only 1 person can push it and it's me - GEntity_UseFunc( push_list[x], self, self ); + GEntity_UseFunc(push_list[x], self, self); } } - else if ( pull && (push_list[x]->spawnflags&2/*F_PULL*/) ) + else if (pull && (push_list[x]->spawnflags & 2/*F_PULL*/)) { - if ( push_list[x]->NPC_targetname == NULL - || (self->targetname&&Q_stricmp( push_list[x]->NPC_targetname, self->NPC_targetname ) == 0) ) + if (push_list[x]->NPC_targetname == NULL + || (self->targetname&&Q_stricmp(push_list[x]->NPC_targetname, self->NPC_targetname) == 0)) {//anyone can push it or only 1 person can push it and it's me - GEntity_UseFunc( push_list[x], self, self ); + GEntity_UseFunc(push_list[x], self, self); } } } - else if ( !Q_stricmp( "func_door", push_list[x]->classname ) && (push_list[x]->spawnflags&2/*MOVER_FORCE_ACTIVATE*/) ) + else if (!Q_stricmp("func_door", push_list[x]->classname) && (push_list[x]->spawnflags & 2/*MOVER_FORCE_ACTIVATE*/)) {//push/pull the door vec3_t pos1, pos2; - AngleVectors( self->client->ps.viewangles, forward, NULL, NULL ); - VectorNormalize( forward ); - VectorMA( self->client->renderInfo.eyePoint, radius, forward, end ); - gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 ); - if ( tr.entityNum != push_list[x]->s.number || tr.fraction == 1.0 || tr.allsolid || tr.startsolid ) + AngleVectors(self->client->ps.viewangles, forward, NULL, NULL); + VectorNormalize(forward); + VectorMA(self->client->renderInfo.eyePoint, radius, forward, end); + gi.trace(&tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, (EG2_Collision)0, 0); + if (tr.entityNum != push_list[x]->s.number || tr.fraction == 1.0 || tr.allsolid || tr.startsolid) {//must be pointing right at it continue; } - if ( VectorCompare( vec3_origin, push_list[x]->s.origin ) ) + if (VectorCompare(vec3_origin, push_list[x]->s.origin)) {//does not have an origin brush, so pos1 & pos2 are relative to world origin, need to calc center - VectorSubtract( push_list[x]->absmax, push_list[x]->absmin, size ); - VectorMA( push_list[x]->absmin, 0.5, size, center ); - if ( (push_list[x]->spawnflags&1) && push_list[x]->moverState == MOVER_POS1 ) + VectorSubtract(push_list[x]->absmax, push_list[x]->absmin, size); + VectorMA(push_list[x]->absmin, 0.5, size, center); + if ((push_list[x]->spawnflags & 1) && push_list[x]->moverState == MOVER_POS1) {//if at pos1 and started open, make sure we get the center where it *started* because we're going to add back in the relative values pos1 and pos2 - VectorSubtract( center, push_list[x]->pos1, center ); + VectorSubtract(center, push_list[x]->pos1, center); } - else if ( !(push_list[x]->spawnflags&1) && push_list[x]->moverState == MOVER_POS2 ) + else if (!(push_list[x]->spawnflags & 1) && push_list[x]->moverState == MOVER_POS2) {//if at pos2, make sure we get the center where it *started* because we're going to add back in the relative values pos1 and pos2 - VectorSubtract( center, push_list[x]->pos2, center ); + VectorSubtract(center, push_list[x]->pos2, center); } - VectorAdd( center, push_list[x]->pos1, pos1 ); - VectorAdd( center, push_list[x]->pos2, pos2 ); + VectorAdd(center, push_list[x]->pos1, pos1); + VectorAdd(center, push_list[x]->pos2, pos2); } else {//actually has an origin, pos1 and pos2 are absolute - VectorCopy( push_list[x]->currentOrigin, center ); - VectorCopy( push_list[x]->pos1, pos1 ); - VectorCopy( push_list[x]->pos2, pos2 ); + VectorCopy(push_list[x]->currentOrigin, center); + VectorCopy(push_list[x]->pos1, pos1); + VectorCopy(push_list[x]->pos2, pos2); } - if ( Distance( pos1, self->client->renderInfo.eyePoint ) < Distance( pos2, self->client->renderInfo.eyePoint ) ) + if (Distance(pos1, self->client->renderInfo.eyePoint) < Distance(pos2, self->client->renderInfo.eyePoint)) {//pos1 is closer - if ( push_list[x]->moverState == MOVER_POS1 ) + if (push_list[x]->moverState == MOVER_POS1) {//at the closest pos - if ( pull ) + if (pull) {//trying to pull, but already at closest point, so screw it continue; } } - else if ( push_list[x]->moverState == MOVER_POS2 ) + else if (push_list[x]->moverState == MOVER_POS2) {//at farthest pos - if ( !pull ) + if (!pull) {//trying to push, but already at farthest point, so screw it continue; } @@ -9692,196 +10284,196 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) } else {//pos2 is closer - if ( push_list[x]->moverState == MOVER_POS1 ) + if (push_list[x]->moverState == MOVER_POS1) {//at the farthest pos - if ( !pull ) + if (!pull) {//trying to push, but already at farthest point, so screw it continue; } } - else if ( push_list[x]->moverState == MOVER_POS2 ) + else if (push_list[x]->moverState == MOVER_POS2) {//at closest pos - if ( pull ) + if (pull) {//trying to pull, but already at closest point, so screw it continue; } } } - GEntity_UseFunc( push_list[x], self, self ); + GEntity_UseFunc(push_list[x], self, self); } - else if ( push_list[x]->s.eType == ET_MISSILE/*thermal resting on ground*/ - || push_list[x]->s.eType == ET_ITEM - || push_list[x]->e_ThinkFunc == thinkF_G_RunObject || Q_stricmp( "limb", push_list[x]->classname ) == 0 ) + else if (push_list[x]->s.eType == ET_MISSILE/*thermal resting on ground*/ + || push_list[x]->s.eType == ET_ITEM + || push_list[x]->e_ThinkFunc == thinkF_G_RunObject || Q_stricmp("limb", push_list[x]->classname) == 0) {//general object, toss it vec3_t pushDir, kvel; - float knockback = pull?0:200; + float knockback = pull ? 0 : 200; float mass = 200; - if ( pull ) + if (pull) { - if ( push_list[x]->s.eType == ET_ITEM ) + if (push_list[x]->s.eType == ET_ITEM) {//pull it to a little higher point vec3_t adjustedOrg; - VectorCopy( self->currentOrigin, adjustedOrg ); - adjustedOrg[2] += self->maxs[2]/3; - VectorSubtract( adjustedOrg, push_list[x]->currentOrigin, pushDir ); + VectorCopy(self->currentOrigin, adjustedOrg); + adjustedOrg[2] += self->maxs[2] / 3; + VectorSubtract(adjustedOrg, push_list[x]->currentOrigin, pushDir); } - else if ( self->enemy //I have an enemy + else if (self->enemy //I have an enemy //&& push_list[x]->s.eType != ET_ITEM //not an item && self->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2 //have push 3 or greater && InFront(push_list[x]->currentOrigin, self->currentOrigin, self->currentAngles, 0.25f)//object is generally in front of me && InFront(self->enemy->currentOrigin, self->currentOrigin, self->currentAngles, 0.75f)//enemy is pretty much right in front of me && !InFront(push_list[x]->currentOrigin, self->enemy->currentOrigin, self->enemy->currentAngles, -0.25f)//object is generally behind enemy //FIXME: check dist to enemy and clear LOS to enemy and clear Path between object and enemy? - && ( (self->NPC&&(noResist||Q_irand(0,RANK_CAPTAIN)NPC->rank) )//NPC with enough skill - ||( self->s.numberNPC && (noResist || Q_irand(0, RANK_CAPTAIN)NPC->rank))//NPC with enough skill + || (self->s.numbermass > TARGETED_OBJECT_PUSH_MASS_MAX ) {//already pushed too many things - //FIXME: pick closest? - continue; + //FIXME: pick closest? + continue; } targetedObjectMassTotal += push_list[x]->mass; */ - VectorSubtract( self->enemy->currentOrigin, push_list[x]->currentOrigin, pushDir ); + VectorSubtract(self->enemy->currentOrigin, push_list[x]->currentOrigin, pushDir); } else { - VectorSubtract( self->currentOrigin, push_list[x]->currentOrigin, pushDir ); + VectorSubtract(self->currentOrigin, push_list[x]->currentOrigin, pushDir); } - knockback += VectorNormalize( pushDir ); - if ( knockback > 200 ) + knockback += VectorNormalize(pushDir); + if (knockback > 200) { knockback = 200; } - if ( push_list[x]->s.eType == ET_ITEM - && push_list[x]->item - && push_list[x]->item->giType == IT_HOLDABLE - && push_list[x]->item->giTag == INV_SECURITY_KEY ) + if (push_list[x]->s.eType == ET_ITEM + && push_list[x]->item + && push_list[x]->item->giType == IT_HOLDABLE + && push_list[x]->item->giTag == INV_SECURITY_KEY) {//security keys are pulled with less enthusiasm - if ( knockback > 100 ) + if (knockback > 100) { knockback = 100; } } - else if ( knockback > 200 ) + else if (knockback > 200) { knockback = 200; } } else { - if ( self->enemy //I have an enemy + if (self->enemy //I have an enemy && push_list[x]->s.eType != ET_ITEM //not an item && self->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2 //have push 3 or greater && InFront(push_list[x]->currentOrigin, self->currentOrigin, self->currentAngles, 0.25f)//object is generally in front of me && InFront(self->enemy->currentOrigin, self->currentOrigin, self->currentAngles, 0.75f)//enemy is pretty much right in front of me && InFront(push_list[x]->currentOrigin, self->enemy->currentOrigin, self->enemy->currentAngles, 0.25f)//object is generally in front of enemy //FIXME: check dist to enemy and clear LOS to enemy and clear Path between object and enemy? - && ( (self->NPC&&(noResist||Q_irand(0,RANK_CAPTAIN)NPC->rank) )//NPC with enough skill - ||( self->s.numberNPC && (noResist || Q_irand(0, RANK_CAPTAIN)NPC->rank))//NPC with enough skill + || (self->s.numbermass > TARGETED_OBJECT_PUSH_MASS_MAX ) {//already pushed too many things - //FIXME: pick closest? - continue; + //FIXME: pick closest? + continue; } targetedObjectMassTotal += push_list[x]->mass; */ - VectorSubtract( self->enemy->currentOrigin, push_list[x]->currentOrigin, pushDir ); + VectorSubtract(self->enemy->currentOrigin, push_list[x]->currentOrigin, pushDir); } else { - VectorSubtract( push_list[x]->currentOrigin, self->currentOrigin, pushDir ); + VectorSubtract(push_list[x]->currentOrigin, self->currentOrigin, pushDir); } - knockback -= VectorNormalize( pushDir ); - if ( knockback < 100 ) + knockback -= VectorNormalize(pushDir); + if (knockback < 100) { knockback = 100; } } //FIXME: if pull a FL_FORCE_PULLABLE_ONLY, clear the flag, assuming it's no longer in solid? or check? - VectorCopy( push_list[x]->currentOrigin, push_list[x]->s.pos.trBase ); + VectorCopy(push_list[x]->currentOrigin, push_list[x]->s.pos.trBase); push_list[x]->s.pos.trTime = level.time; // move a bit on the very first frame - if ( push_list[x]->s.pos.trType != TR_INTERPOLATE ) + if (push_list[x]->s.pos.trType != TR_INTERPOLATE) {//don't do this to rolling missiles push_list[x]->s.pos.trType = TR_GRAVITY; } - if ( push_list[x]->e_ThinkFunc == thinkF_G_RunObject && push_list[x]->physicsBounce ) + if (push_list[x]->e_ThinkFunc == thinkF_G_RunObject && push_list[x]->physicsBounce) {//it's a pushable misc_model_breakable, use it's mass instead of our one-size-fits-all mass mass = push_list[x]->physicsBounce;//same as push_list[x]->mass, right? } - if ( mass < 50 ) + if (mass < 50) {//??? mass = 50; } - if ( g_gravity->value > 0 ) + if (g_gravity->value > 0) { - VectorScale( pushDir, g_knockback->value * knockback / mass * 0.8, kvel ); + VectorScale(pushDir, g_knockback->value * knockback / mass * 0.8, kvel); kvel[2] = pushDir[2] * g_knockback->value * knockback / mass * 1.5; } else { - VectorScale( pushDir, g_knockback->value * knockback / mass, kvel ); + VectorScale(pushDir, g_knockback->value * knockback / mass, kvel); } - VectorAdd( push_list[x]->s.pos.trDelta, kvel, push_list[x]->s.pos.trDelta ); - if ( g_gravity->value > 0 ) + VectorAdd(push_list[x]->s.pos.trDelta, kvel, push_list[x]->s.pos.trDelta); + if (g_gravity->value > 0) { - if ( push_list[x]->s.pos.trDelta[2] < knockback ) + if (push_list[x]->s.pos.trDelta[2] < knockback) { push_list[x]->s.pos.trDelta[2] = knockback; } } //no trDuration? - if ( push_list[x]->e_ThinkFunc != thinkF_G_RunObject ) + if (push_list[x]->e_ThinkFunc != thinkF_G_RunObject) {//objects spin themselves? //spin it //FIXME: messing with roll ruins the rotational center??? push_list[x]->s.apos.trTime = level.time; push_list[x]->s.apos.trType = TR_LINEAR; - VectorClear( push_list[x]->s.apos.trDelta ); - push_list[x]->s.apos.trDelta[1] = Q_irand( -800, 800 ); + VectorClear(push_list[x]->s.apos.trDelta); + push_list[x]->s.apos.trDelta[1] = Q_irand(-800, 800); } - if ( Q_stricmp( "limb", push_list[x]->classname ) == 0 ) + if (Q_stricmp("limb", push_list[x]->classname) == 0) {//make sure it runs it's physics push_list[x]->e_ThinkFunc = thinkF_LimbThink; push_list[x]->nextthink = level.time + FRAMETIME; } push_list[x]->forcePushTime = level.time + 600; // let the push effect last for 600 ms push_list[x]->forcePuller = self->s.number;//remember this regardless - if ( push_list[x]->item && push_list[x]->item->giTag == INV_SECURITY_KEY ) + if (push_list[x]->item && push_list[x]->item->giTag == INV_SECURITY_KEY) { - AddSightEvent( player, push_list[x]->currentOrigin, 128, AEL_DISCOVERED );//security keys are more important + AddSightEvent(player, push_list[x]->currentOrigin, 128, AEL_DISCOVERED);//security keys are more important } else { - AddSightEvent( player, push_list[x]->currentOrigin, 128, AEL_SUSPICIOUS );//hmm... or should this always be discovered? + AddSightEvent(player, push_list[x]->currentOrigin, 128, AEL_SUSPICIOUS);//hmm... or should this always be discovered? } } - else if ( push_list[x]->s.weapon == WP_TURRET - && !Q_stricmp( "PAS", push_list[x]->classname ) - && push_list[x]->s.apos.trType == TR_STATIONARY ) + else if (push_list[x]->s.weapon == WP_TURRET + && !Q_stricmp("PAS", push_list[x]->classname) + && push_list[x]->s.apos.trType == TR_STATIONARY) {//a portable turret - WP_KnockdownTurret( self, push_list[x] ); + WP_KnockdownTurret(self, push_list[x]); } } } - if ( pull ) + if (pull) { - if ( self->client->ps.forcePowerLevel[FP_PULL] > FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_PULL] > FORCE_LEVEL_2) {//at level 3, can pull multiple, so it costs more - actualCost = forcePowerNeeded[FP_PULL]*ent_count; - if ( actualCost > 50 ) + actualCost = forcePowerNeeded[FP_PULL] * ent_count; + if (actualCost > 50) { actualCost = 50; } - else if ( actualCost < cost ) + else if (actualCost < cost) { actualCost = cost; } @@ -9890,30 +10482,30 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) { actualCost = cost; } - WP_ForcePowerStart( self, FP_PULL, actualCost ); + WP_ForcePowerStart(self, FP_PULL, actualCost); } else { - if ( self->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2) {//at level 3, can push multiple, so costs more - actualCost = forcePowerNeeded[FP_PUSH]*ent_count; - if ( actualCost > 50 ) + actualCost = forcePowerNeeded[FP_PUSH] * ent_count; + if (actualCost > 50) { actualCost = 50; } - else if ( actualCost < cost ) + else if (actualCost < cost) { actualCost = cost; } } - else if ( self->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_1 ) + else if (self->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_1) {//at level 2, can push multiple, so costs more - actualCost = floor(forcePowerNeeded[FP_PUSH]*ent_count/1.5f); - if ( actualCost > 50 ) + actualCost = floor(forcePowerNeeded[FP_PUSH] * ent_count / 1.5f); + if (actualCost > 50) { actualCost = 50; } - else if ( actualCost < cost ) + else if (actualCost < cost) { actualCost = cost; } @@ -9922,23 +10514,23 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) { actualCost = cost; } - WP_ForcePowerStart( self, FP_PUSH, actualCost ); + WP_ForcePowerStart(self, FP_PUSH, actualCost); } } else {//didn't push or pull anything? don't penalize them too much - if ( pull ) + if (pull) { - WP_ForcePowerStart( self, FP_PULL, 5 ); + WP_ForcePowerStart(self, FP_PULL, 5); } else { - WP_ForcePowerStart( self, FP_PUSH, 5 ); + WP_ForcePowerStart(self, FP_PUSH, 5); } } - if ( pull ) + if (pull) { - if ( self->NPC ) + if (self->NPC) {//NPCs can push more often //FIXME: vary by rank and game skill? self->client->ps.forcePowerDebounce[FP_PULL] = level.time + 200; @@ -9950,7 +10542,7 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) } else { - if ( self->NPC ) + if (self->NPC) {//NPCs can push more often //FIXME: vary by rank and game skill? self->client->ps.forcePowerDebounce[FP_PUSH] = level.time + 200; @@ -9962,17 +10554,17 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) } } -void WP_DebounceForceDeactivateTime( gentity_t *self ) +void WP_DebounceForceDeactivateTime(gentity_t *self) { //FIXME: if these are interruptable, should they also drain power at a constant rate // rather than just taking one lump sum of force power upfront? - if ( self && self->client ) + if (self && self->client) { - if ( self->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_SPEED) + || self->client->ps.forcePowersActive&(1 << FP_PROTECT) + || self->client->ps.forcePowersActive&(1 << FP_ABSORB) + || self->client->ps.forcePowersActive&(1 << FP_RAGE) + || self->client->ps.forcePowersActive&(1 << FP_SEE)) {//already running another power that can be manually, stopped don't debounce so long self->client->ps.forceAllowDeactivateTime = level.time + 500; } @@ -9984,134 +10576,134 @@ void WP_DebounceForceDeactivateTime( gentity_t *self ) } } -void ForceSpeed( gentity_t *self, int duration ) +void ForceSpeed(gentity_t *self, int duration) { - if ( self->health <= 0 ) + if (self->health <= 0) { return; } if (self->client->ps.forceAllowDeactivateTime < level.time && - (self->client->ps.forcePowersActive & (1 << FP_SPEED)) ) + (self->client->ps.forcePowersActive & (1 << FP_SPEED))) {//stop using it - WP_ForcePowerStop( self, FP_SPEED ); + WP_ForcePowerStop(self, FP_SPEED); return; } - if ( !WP_ForcePowerUsable( self, FP_SPEED, 0 ) ) + if (!WP_ForcePowerUsable(self, FP_SPEED, 0)) { return; } - if ( self->client->ps.saberLockTime > level.time ) + if (self->client->ps.saberLockTime > level.time) {//FIXME: can this be a way to break out? return; } - - WP_DebounceForceDeactivateTime( self ); - WP_ForcePowerStart( self, FP_SPEED, 0 ); - if ( duration ) + WP_DebounceForceDeactivateTime(self); + + WP_ForcePowerStart(self, FP_SPEED, 0); + if (duration) { self->client->ps.forcePowerDuration[FP_SPEED] = level.time + duration; } - G_Sound( self, G_SoundIndex( "sound/weapons/force/speed.wav" ) ); + G_Sound(self, G_SoundIndex("sound/weapons/force/speed.wav")); } -void WP_StartForceHealEffects( gentity_t *self ) +void WP_StartForceHealEffects(gentity_t *self) { - if ( self->ghoul2.size() ) + if (self->ghoul2.size()) { - if ( self->chestBolt != -1 ) + if (self->chestBolt != -1) { - G_PlayEffect( G_EffectIndex( "force/heal2" ), self->playerModel, self->chestBolt, self->s.number, self->currentOrigin, 3000, qtrue ); + G_PlayEffect(G_EffectIndex("force/heal2"), self->playerModel, self->chestBolt, self->s.number, self->currentOrigin, 3000, qtrue); } /* if ( self->headBolt != -1 ) { - G_PlayEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->headBolt, self->s.number, self->currentOrigin, 3000, qtrue ); + G_PlayEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->headBolt, self->s.number, self->currentOrigin, 3000, qtrue ); } if ( self->cervicalBolt != -1 ) { - G_PlayEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->cervicalBolt, self->s.number, self->currentOrigin, 3000, qtrue ); + G_PlayEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->cervicalBolt, self->s.number, self->currentOrigin, 3000, qtrue ); } if ( self->chestBolt != -1 ) { - G_PlayEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->chestBolt, self->s.number, self->currentOrigin, 3000, qtrue ); + G_PlayEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->chestBolt, self->s.number, self->currentOrigin, 3000, qtrue ); } if ( self->gutBolt != -1 ) { - G_PlayEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->gutBolt, self->s.number, self->currentOrigin, 3000, qtrue ); + G_PlayEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->gutBolt, self->s.number, self->currentOrigin, 3000, qtrue ); } if ( self->kneeLBolt != -1 ) { - G_PlayEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->kneeLBolt, self->s.number, self->currentOrigin, 3000, qtrue ); + G_PlayEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->kneeLBolt, self->s.number, self->currentOrigin, 3000, qtrue ); } if ( self->kneeRBolt != -1 ) { - G_PlayEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->kneeRBolt, self->s.number, self->currentOrigin, 3000, qtrue ); + G_PlayEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->kneeRBolt, self->s.number, self->currentOrigin, 3000, qtrue ); } if ( self->elbowLBolt != -1 ) { - G_PlayEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->elbowLBolt, self->s.number, self->currentOrigin, 3000, qtrue ); + G_PlayEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->elbowLBolt, self->s.number, self->currentOrigin, 3000, qtrue ); } if ( self->elbowRBolt != -1 ) { - G_PlayEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->elbowRBolt, self->s.number, self->currentOrigin, 3000, qtrue ); + G_PlayEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->elbowRBolt, self->s.number, self->currentOrigin, 3000, qtrue ); } */ } } -void WP_StopForceHealEffects( gentity_t *self ) +void WP_StopForceHealEffects(gentity_t *self) { - if ( self->ghoul2.size() ) + if (self->ghoul2.size()) { - if ( self->chestBolt != -1 ) + if (self->chestBolt != -1) { - G_StopEffect( G_EffectIndex( "force/heal2" ), self->playerModel, self->chestBolt, self->s.number ); + G_StopEffect(G_EffectIndex("force/heal2"), self->playerModel, self->chestBolt, self->s.number); } /* if ( self->headBolt != -1 ) { - G_StopEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->headBolt, self->s.number ); + G_StopEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->headBolt, self->s.number ); } if ( self->cervicalBolt != -1 ) { - G_StopEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->cervicalBolt, self->s.number ); + G_StopEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->cervicalBolt, self->s.number ); } if ( self->chestBolt != -1 ) { - G_StopEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->chestBolt, self->s.number ); + G_StopEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->chestBolt, self->s.number ); } if ( self->gutBolt != -1 ) { - G_StopEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->gutBolt, self->s.number ); + G_StopEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->gutBolt, self->s.number ); } if ( self->kneeLBolt != -1 ) { - G_StopEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->kneeLBolt, self->s.number ); + G_StopEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->kneeLBolt, self->s.number ); } if ( self->kneeRBolt != -1 ) { - G_StopEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->kneeRBolt, self->s.number ); + G_StopEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->kneeRBolt, self->s.number ); } if ( self->elbowLBolt != -1 ) { - G_StopEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->elbowLBolt, self->s.number ); + G_StopEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->elbowLBolt, self->s.number ); } if ( self->elbowRBolt != -1 ) { - G_StopEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->elbowRBolt, self->s.number ); + G_StopEffect( G_EffectIndex( "force/heal_joint" ), self->playerModel, self->elbowRBolt, self->s.number ); } */ } } -int FP_MaxForceHeal( gentity_t *self ) +int FP_MaxForceHeal(gentity_t *self) { - if ( self->s.number >= MAX_CLIENTS ) + if (self->s.number >= MAX_CLIENTS) { return MAX_FORCE_HEAL_HARD; } - switch ( g_spskill->integer ) + switch (g_spskill->integer) { case 0://easy return MAX_FORCE_HEAL_EASY; @@ -10126,64 +10718,64 @@ int FP_MaxForceHeal( gentity_t *self ) } } -int FP_ForceHealInterval( gentity_t *self ) +int FP_ForceHealInterval(gentity_t *self) { - return (self->client->ps.forcePowerLevel[FP_HEAL]>FORCE_LEVEL_2)?50:FORCE_HEAL_INTERVAL; + return (self->client->ps.forcePowerLevel[FP_HEAL]>FORCE_LEVEL_2) ? 50 : FORCE_HEAL_INTERVAL; } -void ForceHeal( gentity_t *self ) +void ForceHeal(gentity_t *self) { - if ( self->health <= 0 || self->client->ps.stats[STAT_MAX_HEALTH] <= self->health ) + if (self->health <= 0 || self->client->ps.stats[STAT_MAX_HEALTH] <= self->health) { return; } - if ( !WP_ForcePowerUsable( self, FP_HEAL, 20 ) ) + if (!WP_ForcePowerUsable(self, FP_HEAL, 20)) {//must have enough force power for at least 5 points of health return; } - if ( self->painDebounceTime > level.time || (self->client->ps.weaponTime&&self->client->ps.weapon!=WP_NONE) ) + if (self->painDebounceTime > level.time || (self->client->ps.weaponTime&&self->client->ps.weapon != WP_NONE)) {//can't initiate a heal while taking pain or attacking return; } - if ( self->client->ps.saberLockTime > level.time ) + if (self->client->ps.saberLockTime > level.time) {//FIXME: can this be a way to break out? return; } /* if ( self->client->ps.forcePowerLevel[FP_HEAL] > FORCE_LEVEL_2 ) {//instant heal - //no more than available force power - int max = self->client->ps.forcePower; - if ( max > MAX_FORCE_HEAL ) - {//no more than max allowed - max = MAX_FORCE_HEAL; - } - if ( max > self->client->ps.stats[STAT_MAX_HEALTH] - self->health ) - {//no more than what's missing - max = self->client->ps.stats[STAT_MAX_HEALTH] - self->health; - } - self->health += max; - WP_ForcePowerDrain( self, FP_HEAL, max ); - G_SoundOnEnt( self, CHAN_VOICE, va( "sound/weapons/force/heal%d.mp3", Q_irand( 1, 4 ) ) ); + //no more than available force power + int max = self->client->ps.forcePower; + if ( max > MAX_FORCE_HEAL ) + {//no more than max allowed + max = MAX_FORCE_HEAL; + } + if ( max > self->client->ps.stats[STAT_MAX_HEALTH] - self->health ) + {//no more than what's missing + max = self->client->ps.stats[STAT_MAX_HEALTH] - self->health; + } + self->health += max; + WP_ForcePowerDrain( self, FP_HEAL, max ); + G_SoundOnEnt( self, CHAN_VOICE, va( "sound/weapons/force/heal%d.mp3", Q_irand( 1, 4 ) ) ); } else */ { //start health going up //NPC_SetAnim( self, SETANIM_TORSO, ?, SETANIM_FLAG_OVERRIDE ); - WP_ForcePowerStart( self, FP_HEAL, 0 ); - if ( self->client->ps.forcePowerLevel[FP_HEAL] < FORCE_LEVEL_2 ) + WP_ForcePowerStart(self, FP_HEAL, 0); + if (self->client->ps.forcePowerLevel[FP_HEAL] < FORCE_LEVEL_2) {//must meditate //FIXME: holster weapon (select WP_NONE?) //FIXME: BOTH_FORCEHEAL_START - NPC_SetAnim( self, SETANIM_BOTH, BOTH_FORCEHEAL_START, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_BOTH, BOTH_FORCEHEAL_START, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); self->client->ps.saberMove = self->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in self->client->ps.saberBlocked = BLOCKED_NONE; self->client->ps.torsoAnimTimer = self->client->ps.legsAnimTimer = FP_ForceHealInterval(self)*FP_MaxForceHeal(self) + 2000;//??? - WP_DeactivateSaber( self );//turn off saber when meditating + WP_DeactivateSaber(self);//turn off saber when meditating } else {//just a quick gesture @@ -10195,30 +10787,30 @@ void ForceHeal( gentity_t *self ) */ } } - + //FIXME: always play healing effect - G_SoundOnEnt( self, CHAN_ITEM, "sound/weapons/force/heal.mp3" ); + G_SoundOnEnt(self, CHAN_ITEM, "sound/weapons/force/heal.mp3"); } -extern void NPC_PlayConfusionSound( gentity_t *self ); -extern void NPC_Jedi_PlayConfusionSound( gentity_t *self ); -qboolean WP_CheckBreakControl( gentity_t *self ) +extern void NPC_PlayConfusionSound(gentity_t *self); +extern void NPC_Jedi_PlayConfusionSound(gentity_t *self); +qboolean WP_CheckBreakControl(gentity_t *self) { - if ( !self ) + if (!self) { return qfalse; } - if ( !self->s.number ) + if (!self->s.number) {//player - if ( self->client && self->client->ps.forcePowerLevel[FP_TELEPATHY] > FORCE_LEVEL_3 ) + if (self->client && self->client->ps.forcePowerLevel[FP_TELEPATHY] > FORCE_LEVEL_3) {//control-level - if ( self->client->ps.viewEntity > 0 && self->client->ps.viewEntity < ENTITYNUM_WORLD ) + if (self->client->ps.viewEntity > 0 && self->client->ps.viewEntity < ENTITYNUM_WORLD) {//we are in a viewentity gentity_t *controlled = &g_entities[self->client->ps.viewEntity]; - if ( controlled->NPC && controlled->NPC->controlledTime > level.time ) + if (controlled->NPC && controlled->NPC->controlledTime > level.time) {//it is an NPC we controlled //clear it and return - G_ClearViewEntity( self ); + G_ClearViewEntity(self); return qtrue; } } @@ -10226,15 +10818,15 @@ qboolean WP_CheckBreakControl( gentity_t *self ) } else {//NPC - if ( self->NPC && self->NPC->controlledTime > level.time ) + if (self->NPC && self->NPC->controlledTime > level.time) {//being controlled gentity_t *controller = &g_entities[0]; - if ( controller->client && controller->client->ps.viewEntity == self->s.number ) + if (controller->client && controller->client->ps.viewEntity == self->s.number) {//we are being controlled by player - if ( controller->client->ps.forcePowerLevel[FP_TELEPATHY] > FORCE_LEVEL_3 ) + if (controller->client->ps.forcePowerLevel[FP_TELEPATHY] > FORCE_LEVEL_3) {//control-level mind trick //clear the control and return - G_ClearViewEntity( controller ); + G_ClearViewEntity(controller); return qtrue; } } @@ -10244,61 +10836,61 @@ qboolean WP_CheckBreakControl( gentity_t *self ) } extern bool Pilot_AnyVehiclesRegistered(); -void ForceTelepathy( gentity_t *self ) +void ForceTelepathy(gentity_t *self) { trace_t tr; vec3_t end, forward; gentity_t *traceEnt; qboolean targetLive = qfalse; - if ( WP_CheckBreakControl( self ) ) + if (WP_CheckBreakControl(self)) { return; } - if ( self->health <= 0 ) + if (self->health <= 0) { return; } //FIXME: if mind trick 3 and aiming at an enemy need more force power - if ( !WP_ForcePowerUsable( self, FP_TELEPATHY, 0 ) ) + if (!WP_ForcePowerUsable(self, FP_TELEPATHY, 0)) { return; } - if ( self->client->ps.weaponTime >= 800 ) + if (self->client->ps.weaponTime >= 800) {//just did one! return; } - if ( self->client->ps.saberLockTime > level.time ) + if (self->client->ps.saberLockTime > level.time) {//FIXME: can this be a way to break out? return; } - AngleVectors( self->client->ps.viewangles, forward, NULL, NULL ); - VectorNormalize( forward ); - VectorMA( self->client->renderInfo.eyePoint, 2048, forward, end ); - + AngleVectors(self->client->ps.viewangles, forward, NULL, NULL); + VectorNormalize(forward); + VectorMA(self->client->renderInfo.eyePoint, 2048, forward, end); + //Cause a distraction if enemy is not fighting - gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_OPAQUE|CONTENTS_BODY, (EG2_Collision)0, 0 ); - if ( tr.entityNum == ENTITYNUM_NONE || tr.fraction == 1.0 || tr.allsolid || tr.startsolid ) + gi.trace(&tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_OPAQUE | CONTENTS_BODY, (EG2_Collision)0, 0); + if (tr.entityNum == ENTITYNUM_NONE || tr.fraction == 1.0 || tr.allsolid || tr.startsolid) { return; } - + traceEnt = &g_entities[tr.entityNum]; - - if( traceEnt->NPC && traceEnt->NPC->scriptFlags & SCF_NO_FORCE ) + + if (traceEnt->NPC && traceEnt->NPC->scriptFlags & SCF_NO_FORCE) { return; } - if ( traceEnt && traceEnt->client ) + if (traceEnt && traceEnt->client) { - switch ( traceEnt->client->NPC_class ) + switch (traceEnt->client->NPC_class) { case CLASS_GALAKMECH://cant grip him, he's in armor case CLASS_ATST://much too big to grip! - //no droids either + //no droids either case CLASS_PROBE: case CLASS_GONK: case CLASS_R2D2: @@ -10314,7 +10906,7 @@ void ForceTelepathy( gentity_t *self ) case CLASS_BOBAFETT: break; case CLASS_RANCOR: - if ( !(traceEnt->spawnflags&1) ) + if (!(traceEnt->spawnflags & 1)) { targetLive = qtrue; } @@ -10324,34 +10916,34 @@ void ForceTelepathy( gentity_t *self ) break; } } - if ( targetLive - && traceEnt->NPC - && traceEnt->health > 0 ) + if (targetLive + && traceEnt->NPC + && traceEnt->health > 0) {//hit an organic non-player - if ( G_ActivateBehavior( traceEnt, BSET_MINDTRICK ) ) + if (G_ActivateBehavior(traceEnt, BSET_MINDTRICK)) {//activated a script on him //FIXME: do the visual sparkles effect on their heads, still? - WP_ForcePowerStart( self, FP_TELEPATHY, 0 ); + WP_ForcePowerStart(self, FP_TELEPATHY, 0); } - else if ( traceEnt->client->playerTeam != self->client->playerTeam ) + else if (traceEnt->client->playerTeam != self->client->playerTeam) {//an enemy int override = 0; - if ( (traceEnt->NPC->scriptFlags&SCF_NO_MIND_TRICK) ) + if ((traceEnt->NPC->scriptFlags&SCF_NO_MIND_TRICK)) { - if ( traceEnt->client->NPC_class == CLASS_GALAKMECH ) + if (traceEnt->client->NPC_class == CLASS_GALAKMECH) { - G_AddVoiceEvent( traceEnt, Q_irand( EV_CONFUSE1, EV_CONFUSE3 ), Q_irand( 3000, 5000 ) ); + G_AddVoiceEvent(traceEnt, Q_irand(EV_CONFUSE1, EV_CONFUSE3), Q_irand(3000, 5000)); } } - else if ( self->client->ps.forcePowerLevel[FP_TELEPATHY] > FORCE_LEVEL_3 ) + else if (self->client->ps.forcePowerLevel[FP_TELEPATHY] > FORCE_LEVEL_3) {//control them, even jedi - G_SetViewEntity( self, traceEnt ); + G_SetViewEntity(self, traceEnt); traceEnt->NPC->controlledTime = level.time + 30000; } - else if ( traceEnt->s.weapon != WP_SABER - && traceEnt->client->NPC_class != CLASS_REBORN ) + else if (traceEnt->s.weapon != WP_SABER + && traceEnt->client->NPC_class != CLASS_REBORN) {//haha! Jedi aren't easily confused! - if ( self->client->ps.forcePowerLevel[FP_TELEPATHY] > FORCE_LEVEL_2 + if (self->client->ps.forcePowerLevel[FP_TELEPATHY] > FORCE_LEVEL_2 && traceEnt->s.weapon != WP_NONE //don't charm people who aren't capable of fighting... like ugnaughts and droids, just confuse them && traceEnt->client->NPC_class != CLASS_TUSKEN//don't charm them, just confuse them && traceEnt->client->NPC_class != CLASS_NOGHRI//don't charm them, just confuse them @@ -10360,15 +10952,15 @@ void ForceTelepathy( gentity_t *self ) {//turn them to our side //if mind trick 3 and aiming at an enemy need more force power override = 50; - if ( self->client->ps.forcePower < 50 ) + if (self->client->ps.forcePower < 50) { return; } - if ( traceEnt->enemy ) + if (traceEnt->enemy) { - G_ClearEnemy( traceEnt ); + G_ClearEnemy(traceEnt); } - if ( traceEnt->NPC ) + if (traceEnt->NPC) { //traceEnt->NPC->tempBehavior = BS_FOLLOW_LEADER; traceEnt->client->leader = self; @@ -10380,70 +10972,70 @@ void ForceTelepathy( gentity_t *self ) traceEnt->client->playerTeam = saveTeam; //FIXME: need a *charmed* timer on this...? Or do TEAM_PLAYERS assume that "confusion" means they should switch to team_enemy when done? traceEnt->NPC->charmedTime = level.time + mindTrickTime[self->client->ps.forcePowerLevel[FP_TELEPATHY]]; - if ( traceEnt->ghoul2.size() && traceEnt->headBolt != -1 ) + if (traceEnt->ghoul2.size() && traceEnt->headBolt != -1) {//FIXME: what if already playing effect? - G_PlayEffect( G_EffectIndex( "force/confusion" ), traceEnt->playerModel, traceEnt->headBolt, traceEnt->s.number, traceEnt->currentOrigin, mindTrickTime[self->client->ps.forcePowerLevel[FP_TELEPATHY]], qtrue ); + G_PlayEffect(G_EffectIndex("force/confusion"), traceEnt->playerModel, traceEnt->headBolt, traceEnt->s.number, traceEnt->currentOrigin, mindTrickTime[self->client->ps.forcePowerLevel[FP_TELEPATHY]], qtrue); } } else {//just confuse them //somehow confuse them? Set don't fire to true for a while? Drop their aggression? Maybe just take their enemy away and don't let them pick one up for a while unless shot? traceEnt->NPC->confusionTime = level.time + mindTrickTime[self->client->ps.forcePowerLevel[FP_TELEPATHY]];//confused for about 10 seconds - if ( traceEnt->ghoul2.size() && traceEnt->headBolt != -1 ) + if (traceEnt->ghoul2.size() && traceEnt->headBolt != -1) {//FIXME: what if already playing effect? - G_PlayEffect( G_EffectIndex( "force/confusion" ), traceEnt->playerModel, traceEnt->headBolt, traceEnt->s.number, traceEnt->currentOrigin, mindTrickTime[self->client->ps.forcePowerLevel[FP_TELEPATHY]], qtrue ); + G_PlayEffect(G_EffectIndex("force/confusion"), traceEnt->playerModel, traceEnt->headBolt, traceEnt->s.number, traceEnt->currentOrigin, mindTrickTime[self->client->ps.forcePowerLevel[FP_TELEPATHY]], qtrue); } - NPC_PlayConfusionSound( traceEnt ); - if ( traceEnt->enemy ) + NPC_PlayConfusionSound(traceEnt); + if (traceEnt->enemy) { - G_ClearEnemy( traceEnt ); + G_ClearEnemy(traceEnt); } } } else { - NPC_Jedi_PlayConfusionSound( traceEnt ); + NPC_Jedi_PlayConfusionSound(traceEnt); } - WP_ForcePowerStart( self, FP_TELEPATHY, override ); + WP_ForcePowerStart(self, FP_TELEPATHY, override); } - else if ( traceEnt->client->playerTeam == self->client->playerTeam ) + else if (traceEnt->client->playerTeam == self->client->playerTeam) {//an ally //maybe just have him look at you? Respond? Take your enemy? - if ( traceEnt->client->ps.pm_type < PM_DEAD && traceEnt->NPC!=NULL && !(traceEnt->NPC->scriptFlags&SCF_NO_RESPONSE) ) + if (traceEnt->client->ps.pm_type < PM_DEAD && traceEnt->NPC != NULL && !(traceEnt->NPC->scriptFlags&SCF_NO_RESPONSE)) { - NPC_UseResponse( traceEnt, self, qfalse ); - WP_ForcePowerStart( self, FP_TELEPATHY, 1 ); + NPC_UseResponse(traceEnt, self, qfalse); + WP_ForcePowerStart(self, FP_TELEPATHY, 1); } }//NOTE: no effect on TEAM_NEUTRAL? vec3_t eyeDir; - AngleVectors( traceEnt->client->renderInfo.eyeAngles, eyeDir, NULL, NULL ); - VectorNormalize( eyeDir ); - G_PlayEffect( "force/force_touch", traceEnt->client->renderInfo.eyePoint, eyeDir ); + AngleVectors(traceEnt->client->renderInfo.eyeAngles, eyeDir, NULL, NULL); + VectorNormalize(eyeDir); + G_PlayEffect("force/force_touch", traceEnt->client->renderInfo.eyePoint, eyeDir); //make sure this plays and that you cannot press fire for about 1 second after this //FIXME: BOTH_FORCEMINDTRICK or BOTH_FORCEDISTRACT - NPC_SetAnim( self, SETANIM_TORSO, BOTH_MINDTRICK1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_TORSO, BOTH_MINDTRICK1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); //FIXME: build-up or delay this until in proper part of anim } - else + else { - if ( self->client->ps.forcePowerLevel[FP_TELEPATHY] > FORCE_LEVEL_1 && tr.fraction * 2048 > 64 ) + if (self->client->ps.forcePowerLevel[FP_TELEPATHY] > FORCE_LEVEL_1 && tr.fraction * 2048 > 64) {//don't create a diversion less than 64 from you of if at power level 1 //use distraction anim instead - G_PlayEffect( G_EffectIndex( "force/force_touch" ), tr.endpos, tr.plane.normal ); + G_PlayEffect(G_EffectIndex("force/force_touch"), tr.endpos, tr.plane.normal); //FIXME: these events don't seem to always be picked up...? - AddSoundEvent( self, tr.endpos, 512, AEL_SUSPICIOUS, qtrue, qtrue ); - AddSightEvent( self, tr.endpos, 512, AEL_SUSPICIOUS, 50 ); - WP_ForcePowerStart( self, FP_TELEPATHY, 0 ); + AddSoundEvent(self, tr.endpos, 512, AEL_SUSPICIOUS, qtrue, qtrue); + AddSightEvent(self, tr.endpos, 512, AEL_SUSPICIOUS, 50); + WP_ForcePowerStart(self, FP_TELEPATHY, 0); } - NPC_SetAnim( self, SETANIM_TORSO, BOTH_MINDTRICK2, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_TORSO, BOTH_MINDTRICK2, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); } self->client->ps.saberMove = self->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in self->client->ps.saberBlocked = BLOCKED_NONE; self->client->ps.weaponTime = 1000; - if ( self->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_SPEED)) { - self->client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value ); + self->client->ps.weaponTime = floor(self->client->ps.weaponTime * g_timescale->value); } } @@ -10451,91 +11043,91 @@ void ForceTelepathy( gentity_t *self ) //#define JK2_RAGDOLL_GRIPNOHEALTH //rww - RAGDOLL_END -void ForceGrip( gentity_t *self ) +void ForceGrip(gentity_t *self) {//FIXME: make enemy Jedi able to use this trace_t tr; vec3_t end, forward; gentity_t *traceEnt = NULL; - if ( self->health <= 0 ) + if (self->health <= 0) { return; } - if ( !self->s.number && (cg.zoomMode || in_camera) ) + if (!self->s.number && (cg.zoomMode || in_camera)) {//can't force grip when zoomed in or in cinematic return; } - if ( self->client->ps.leanofs ) + if (self->client->ps.leanofs) {//can't force-grip while leaning return; } - if ( self->client->ps.forceGripEntityNum <= ENTITYNUM_WORLD ) + if (self->client->ps.forceGripEntityNum <= ENTITYNUM_WORLD) {//already gripping - if ( self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) { self->client->ps.forcePowerDuration[FP_GRIP] = level.time + 100; self->client->ps.weaponTime = 1000; - if ( self->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_SPEED)) { - self->client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value ); + self->client->ps.weaponTime = floor(self->client->ps.weaponTime * g_timescale->value); } } return; } - if ( !WP_ForcePowerUsable( self, FP_GRIP, 0 ) ) + if (!WP_ForcePowerUsable(self, FP_GRIP, 0)) {//can't use it right now return; } - if ( self->client->ps.forcePower < 26 ) + if (self->client->ps.forcePower < 26) {//need 20 to start, 6 to hold it for any decent amount of time... return; } - if ( self->client->ps.weaponTime ) + if (self->client->ps.weaponTime) {//busy return; } - if ( self->client->ps.saberLockTime > level.time ) + if (self->client->ps.saberLockTime > level.time) {//FIXME: can this be a way to break out? return; } //Cause choking anim + health drain in ent in front of me - NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCEGRIP_HOLD, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_TORSO, BOTH_FORCEGRIP_HOLD, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); self->client->ps.saberMove = self->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in self->client->ps.saberBlocked = BLOCKED_NONE; self->client->ps.weaponTime = 1000; - if ( self->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_SPEED)) { - self->client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value ); + self->client->ps.weaponTime = floor(self->client->ps.weaponTime * g_timescale->value); } - AngleVectors( self->client->ps.viewangles, forward, NULL, NULL ); - VectorNormalize( forward ); - VectorMA( self->client->renderInfo.handLPoint, FORCE_GRIP_DIST, forward, end ); - - if ( self->enemy ) + AngleVectors(self->client->ps.viewangles, forward, NULL, NULL); + VectorNormalize(forward); + VectorMA(self->client->renderInfo.handLPoint, FORCE_GRIP_DIST, forward, end); + + if (self->enemy) {//I have an enemy - if ( !self->enemy->message - && !(self->flags&FL_NO_KNOCKBACK) ) + if (!self->enemy->message + && !(self->flags&FL_NO_KNOCKBACK)) {//don't auto-pickup guys with keys - if ( DistanceSquared( self->enemy->currentOrigin, self->currentOrigin ) < FORCE_GRIP_DIST_SQUARED ) + if (DistanceSquared(self->enemy->currentOrigin, self->currentOrigin) < FORCE_GRIP_DIST_SQUARED) {//close enough to grab float minDot = 0.5f; - if ( self->s.number < MAX_CLIENTS ) + if (self->s.number < MAX_CLIENTS) {//player needs to be facing more directly minDot = 0.2f; } - if ( InFront( self->enemy->currentOrigin, self->client->renderInfo.eyePoint, self->client->ps.viewangles, minDot ) ) //self->s.number || //NPCs can always lift enemy since we assume they're looking at them...? + if (InFront(self->enemy->currentOrigin, self->client->renderInfo.eyePoint, self->client->ps.viewangles, minDot)) //self->s.number || //NPCs can always lift enemy since we assume they're looking at them...? {//need to be facing the enemy - if ( gi.inPVS( self->enemy->currentOrigin, self->client->renderInfo.eyePoint ) ) + if (gi.inPVS(self->enemy->currentOrigin, self->client->renderInfo.eyePoint)) {//must be in PVS - gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, self->enemy->currentOrigin, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 ); - if ( tr.fraction == 1.0f || tr.entityNum == self->enemy->s.number ) + gi.trace(&tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, self->enemy->currentOrigin, self->s.number, MASK_SHOT, (EG2_Collision)0, 0); + if (tr.fraction == 1.0f || tr.entityNum == self->enemy->s.number) {//must have clear LOS traceEnt = self->enemy; } @@ -10544,37 +11136,37 @@ void ForceGrip( gentity_t *self ) } } } - if ( !traceEnt ) + if (!traceEnt) {//okay, trace straight ahead and see what's there - gi.trace( &tr, self->client->renderInfo.handLPoint, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 ); - if ( tr.entityNum >= ENTITYNUM_WORLD || tr.fraction == 1.0 || tr.allsolid || tr.startsolid ) + gi.trace(&tr, self->client->renderInfo.handLPoint, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, (EG2_Collision)0, 0); + if (tr.entityNum >= ENTITYNUM_WORLD || tr.fraction == 1.0 || tr.allsolid || tr.startsolid) { return; } traceEnt = &g_entities[tr.entityNum]; } -//rww - RAGDOLL_BEGIN + //rww - RAGDOLL_BEGIN #ifdef JK2_RAGDOLL_GRIPNOHEALTH - if ( !traceEnt || traceEnt == self/*???*/ || traceEnt->bmodel || (traceEnt->NPC && traceEnt->NPC->scriptFlags & SCF_NO_FORCE) ) + if (!traceEnt || traceEnt == self/*???*/ || traceEnt->bmodel || (traceEnt->NPC && traceEnt->NPC->scriptFlags & SCF_NO_FORCE)) { return; } #else -//rww - RAGDOLL_END - if ( !traceEnt || traceEnt == self/*???*/ || traceEnt->bmodel || (traceEnt->health <= 0 && traceEnt->takedamage) || (traceEnt->NPC && traceEnt->NPC->scriptFlags & SCF_NO_FORCE) ) + //rww - RAGDOLL_END + if (!traceEnt || traceEnt == self/*???*/ || traceEnt->bmodel || (traceEnt->health <= 0 && traceEnt->takedamage) || (traceEnt->NPC && traceEnt->NPC->scriptFlags & SCF_NO_FORCE)) { return; } -//rww - RAGDOLL_BEGIN + //rww - RAGDOLL_BEGIN #endif -//rww - RAGDOLL_END + //rww - RAGDOLL_END - if ( traceEnt->m_pVehicle != NULL ) + if (traceEnt->m_pVehicle != NULL) {//is it a vehicle //grab pilot if there is one - if ( traceEnt->m_pVehicle->m_pPilot != NULL - && traceEnt->m_pVehicle->m_pPilot->client != NULL ) + if (traceEnt->m_pVehicle->m_pPilot != NULL + && traceEnt->m_pVehicle->m_pPilot->client != NULL) {//grip the pilot traceEnt = traceEnt->m_pVehicle->m_pPilot; } @@ -10583,33 +11175,33 @@ void ForceGrip( gentity_t *self ) return; } } - if ( traceEnt->client ) + if (traceEnt->client) { - if ( traceEnt->client->ps.forceJumpZStart ) + if (traceEnt->client->ps.forceJumpZStart) {//can't catch them in mid force jump - FIXME: maybe base it on velocity? return; } - if ( traceEnt->client->ps.pullAttackTime > level.time ) + if (traceEnt->client->ps.pullAttackTime > level.time) {//can't grip someone who is being pull-attacked or is pull-attacking return; } - if ( !Q_stricmp("Yoda",traceEnt->NPC_type) ) + if (!Q_stricmp("Yoda", traceEnt->NPC_type)) { - Jedi_PlayDeflectSound( traceEnt ); - ForceThrow( traceEnt, qfalse ); + Jedi_PlayDeflectSound(traceEnt); + ForceThrow(traceEnt, qfalse); return; } - if ( G_IsRidingVehicle( traceEnt ) - && (traceEnt->s.eFlags&EF_NODRAW) ) + if (G_IsRidingVehicle(traceEnt) + && (traceEnt->s.eFlags&EF_NODRAW)) {//riding *inside* vehicle return; } - switch ( traceEnt->client->NPC_class ) + switch (traceEnt->client->NPC_class) { case CLASS_GALAKMECH://cant grip him, he's in armor - G_AddVoiceEvent( traceEnt, Q_irand(EV_PUSHED1, EV_PUSHED3), Q_irand( 3000, 5000 ) ); + G_AddVoiceEvent(traceEnt, Q_irand(EV_PUSHED1, EV_PUSHED3), Q_irand(3000, 5000)); return; break; case CLASS_HAZARD_TROOPER://cant grip him, he's in armor @@ -10621,7 +11213,7 @@ void ForceGrip( gentity_t *self ) case CLASS_SAND_CREATURE://much too big to grip! return; break; - //no droids either...? + //no droids either...? case CLASS_GONK: case CLASS_R2D2: case CLASS_R5D2: @@ -10632,7 +11224,7 @@ void ForceGrip( gentity_t *self ) //*sigh*... in JK3, you'll be able to grab and move *anything*... return; break; - //not even combat droids? (No animation for being gripped...) + //not even combat droids? (No animation for being gripped...) case CLASS_SABER_DROID: case CLASS_ASSASSIN_DROID: //*sigh*... in JK3, you'll be able to grab and move *anything*... @@ -10650,39 +11242,39 @@ void ForceGrip( gentity_t *self ) case CLASS_KYLE: case CLASS_TAVION: case CLASS_LUKE: - Jedi_PlayDeflectSound( traceEnt ); - ForceThrow( traceEnt, qfalse ); + Jedi_PlayDeflectSound(traceEnt); + ForceThrow(traceEnt, qfalse); return; break; case CLASS_REBORN: case CLASS_SHADOWTROOPER: case CLASS_ALORA: case CLASS_JEDI: - if ( traceEnt->NPC && traceEnt->NPC->rank > RANK_CIVILIAN && self->client->ps.forcePowerLevel[FP_GRIP] < FORCE_LEVEL_2 ) + if (traceEnt->NPC && traceEnt->NPC->rank > RANK_CIVILIAN && self->client->ps.forcePowerLevel[FP_GRIP] < FORCE_LEVEL_2) { - Jedi_PlayDeflectSound( traceEnt ); - ForceThrow( traceEnt, qfalse ); + Jedi_PlayDeflectSound(traceEnt); + ForceThrow(traceEnt, qfalse); return; } break; default: break; } - if ( traceEnt->s.weapon == WP_EMPLACED_GUN ) + if (traceEnt->s.weapon == WP_EMPLACED_GUN) {//FIXME: maybe can pull them out? return; } - if ( self->enemy && traceEnt != self->enemy && traceEnt->client->playerTeam == self->client->playerTeam ) + if (self->enemy && traceEnt != self->enemy && traceEnt->client->playerTeam == self->client->playerTeam) {//can't accidently grip your teammate in combat return; } -//=CHECKABSORB=== - if ( -1 != WP_AbsorbConversion( traceEnt, traceEnt->client->ps.forcePowerLevel[FP_ABSORB], self, FP_GRIP, self->client->ps.forcePowerLevel[FP_GRIP], forcePowerNeeded[self->client->ps.forcePowerLevel[FP_GRIP]]) ) + //=CHECKABSORB=== + if (-1 != WP_AbsorbConversion(traceEnt, traceEnt->client->ps.forcePowerLevel[FP_ABSORB], self, FP_GRIP, self->client->ps.forcePowerLevel[FP_GRIP], forcePowerNeeded[self->client->ps.forcePowerLevel[FP_GRIP]])) { //WP_ForcePowerStop( self, FP_GRIP ); return; } -//=============== + //=============== } else {//can't grip non-clients... right? @@ -10694,34 +11286,34 @@ void ForceGrip( gentity_t *self ) } // Make sure to turn off Force Protection and Force Absorb. - if (self->client->ps.forcePowersActive & (1 << FP_PROTECT) ) + if (self->client->ps.forcePowersActive & (1 << FP_PROTECT)) { - WP_ForcePowerStop( self, FP_PROTECT ); + WP_ForcePowerStop(self, FP_PROTECT); } - if (self->client->ps.forcePowersActive & (1 << FP_ABSORB) ) + if (self->client->ps.forcePowersActive & (1 << FP_ABSORB)) { - WP_ForcePowerStop( self, FP_ABSORB ); + WP_ForcePowerStop(self, FP_ABSORB); } - WP_ForcePowerStart( self, FP_GRIP, 20 ); + WP_ForcePowerStart(self, FP_GRIP, 20); //FIXME: rule out other things? //FIXME: Jedi resist, like the push and pull? self->client->ps.forceGripEntityNum = traceEnt->s.number; - if ( traceEnt->client ) + if (traceEnt->client) { Vehicle_t *pVeh; - if ( ( pVeh = G_IsRidingVehicle( traceEnt ) ) != NULL ) + if ((pVeh = G_IsRidingVehicle(traceEnt)) != NULL) {//riding vehicle? pull him off! //FIXME: if in an AT-ST or X-Wing, shouldn't do this... :) //pull him off of it //((CVehicleNPC *)traceEnt->NPC)->Eject( traceEnt ); - pVeh->m_pVehicleInfo->Eject( pVeh, traceEnt, qtrue ); + pVeh->m_pVehicleInfo->Eject(pVeh, traceEnt, qtrue); //G_DriveVehicle( traceEnt, NULL, NULL ); } - G_AddVoiceEvent( traceEnt, Q_irand(EV_PUSHED1, EV_PUSHED3), 2000 ); - if ( self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2 || traceEnt->s.weapon == WP_SABER ) + G_AddVoiceEvent(traceEnt, Q_irand(EV_PUSHED1, EV_PUSHED3), 2000); + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2 || traceEnt->s.weapon == WP_SABER) {//if we pick up & carry, drop their weap - if ( traceEnt->s.weapon + if (traceEnt->s.weapon && traceEnt->client->NPC_class != CLASS_ROCKETTROOPER && traceEnt->client->NPC_class != CLASS_VEHICLE && traceEnt->client->NPC_class != CLASS_HAZARD_TROOPER @@ -10729,52 +11321,52 @@ void ForceGrip( gentity_t *self ) && traceEnt->client->NPC_class != CLASS_BOBAFETT && traceEnt->client->NPC_class != CLASS_ASSASSIN_DROID && traceEnt->s.weapon != WP_CONCUSSION // so rax can't drop his - ) + ) { - if ( traceEnt->client->NPC_class == CLASS_BOBAFETT ) + if (traceEnt->client->NPC_class == CLASS_BOBAFETT) {//he doesn't drop them, just puts it away - ChangeWeapon( traceEnt, WP_MELEE ); + ChangeWeapon(traceEnt, WP_MELEE); } - else if ( traceEnt->s.weapon == WP_MELEE ) + else if (traceEnt->s.weapon == WP_MELEE) {//they can't take that away from me, oh no... } - else if ( traceEnt->NPC - && (traceEnt->NPC->scriptFlags&SCF_DONT_FLEE) ) + else if (traceEnt->NPC + && (traceEnt->NPC->scriptFlags&SCF_DONT_FLEE)) {//*SIGH*... if an NPC can't flee, they can't run after and pick up their weapon, do don't drop it } - else if ( traceEnt->s.weapon != WP_SABER ) + else if (traceEnt->s.weapon != WP_SABER) { - WP_DropWeapon( traceEnt, NULL ); + WP_DropWeapon(traceEnt, NULL); } else { //turn it off? traceEnt->client->ps.SaberDeactivate(); - G_SoundOnEnt( traceEnt, CHAN_WEAPON, "sound/weapons/saber/saberoffquick.wav" ); + G_SoundOnEnt(traceEnt, CHAN_WEAPON, "sound/weapons/saber/saberoffquick.wav"); } } } //else FIXME: need a one-armed choke if we're not on a high enough level to make them drop their gun - VectorCopy( traceEnt->client->renderInfo.headPoint, self->client->ps.forceGripOrg ); + VectorCopy(traceEnt->client->renderInfo.headPoint, self->client->ps.forceGripOrg); } else { - VectorCopy( traceEnt->currentOrigin, self->client->ps.forceGripOrg ); + VectorCopy(traceEnt->currentOrigin, self->client->ps.forceGripOrg); } self->client->ps.forceGripOrg[2] += 48;//FIXME: define? - if ( self->client->ps.forcePowerLevel[FP_GRIP] < FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_GRIP] < FORCE_LEVEL_2) {//just a duration self->client->ps.forcePowerDebounce[FP_GRIP] = level.time + 250; self->client->ps.forcePowerDuration[FP_GRIP] = level.time + 5000; - - if ( self->m_pVehicle && self->m_pVehicle->m_pVehicleInfo->Inhabited( self->m_pVehicle ) ) + + if (self->m_pVehicle && self->m_pVehicle->m_pVehicleInfo->Inhabited(self->m_pVehicle)) {//empty vehicles don't make gripped noise - traceEnt->s.loopSound = G_SoundIndex( "sound/weapons/force/grip.mp3" ); + traceEnt->s.loopSound = G_SoundIndex("sound/weapons/force/grip.mp3"); } } else { - if ( self->client->ps.forcePowerLevel[FP_GRIP] == FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_GRIP] == FORCE_LEVEL_2) {//lifting sound? or always? } //if ( traceEnt->s.number ) @@ -10784,24 +11376,24 @@ void ForceGrip( gentity_t *self ) /* else {//player should take damage right away - self->client->ps.forcePowerDebounce[FP_GRIP] = level.time + 250; + self->client->ps.forcePowerDebounce[FP_GRIP] = level.time + 250; } */ - // force grip sound should only play when the target is alive? - // if (traceEnt->health>0) - // { - self->s.loopSound = G_SoundIndex( "sound/weapons/force/grip.mp3" ); - // } + // force grip sound should only play when the target is alive? + // if (traceEnt->health>0) + // { + self->s.loopSound = G_SoundIndex("sound/weapons/force/grip.mp3"); + // } } } -qboolean ForceLightningCheck2Handed( gentity_t *self ) +qboolean ForceLightningCheck2Handed(gentity_t *self) { - if ( self && self->client ) + if (self && self->client) { - if ( self->s.weapon == WP_NONE - || self->s.weapon == WP_MELEE - || (self->s.weapon == WP_SABER && !self->client->ps.SaberActive()) ) + if (self->s.weapon == WP_NONE + || self->s.weapon == WP_MELEE + || (self->s.weapon == WP_SABER && !self->client->ps.SaberActive())) { return qtrue; } @@ -10809,9 +11401,9 @@ qboolean ForceLightningCheck2Handed( gentity_t *self ) return qfalse; } -void ForceLightningAnim( gentity_t *self ) +void ForceLightningAnim(gentity_t *self) { - if ( !self || !self->client ) + if (!self || !self->client) { return; } @@ -10820,164 +11412,164 @@ void ForceLightningAnim( gentity_t *self ) int startAnim = BOTH_FORCELIGHTNING_START; int holdAnim = BOTH_FORCELIGHTNING_HOLD; - if ( self->client->ps.forcePowerLevel[FP_LIGHTNING] >= FORCE_LEVEL_3 - && ForceLightningCheck2Handed( self ) ) + if (self->client->ps.forcePowerLevel[FP_LIGHTNING] >= FORCE_LEVEL_3 + && ForceLightningCheck2Handed(self)) {//empty handed lightning 3 startAnim = BOTH_FORCE_2HANDEDLIGHTNING_START; holdAnim = BOTH_FORCE_2HANDEDLIGHTNING_HOLD; } //FIXME: if standing still, play on whole body? Especially 2-handed version - if ( self->client->ps.torsoAnim == startAnim ) + if (self->client->ps.torsoAnim == startAnim) { - if ( !self->client->ps.torsoAnimTimer ) + if (!self->client->ps.torsoAnimTimer) { - NPC_SetAnim( self, SETANIM_TORSO, holdAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_TORSO, holdAnim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } else { - NPC_SetAnim( self, SETANIM_TORSO, startAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_TORSO, startAnim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } } else { - NPC_SetAnim( self, SETANIM_TORSO, holdAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_TORSO, holdAnim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } } -void ForceLightning( gentity_t *self ) +void ForceLightning(gentity_t *self) { - if ( self->health <= 0 ) + if (self->health <= 0) { return; } - if ( !self->s.number && (cg.zoomMode || in_camera) ) + if (!self->s.number && (cg.zoomMode || in_camera)) {//can't force lightning when zoomed in or in cinematic return; } - if ( self->client->ps.leanofs ) + if (self->client->ps.leanofs) {//can't force-lightning while leaning return; } - if ( self->client->ps.forcePower < 25 || !WP_ForcePowerUsable( self, FP_LIGHTNING, 0 ) ) + if (self->client->ps.forcePower < 25 || !WP_ForcePowerUsable(self, FP_LIGHTNING, 0)) { return; } - if ( self->client->ps.forcePowerDebounce[FP_LIGHTNING] > level.time ) + if (self->client->ps.forcePowerDebounce[FP_LIGHTNING] > level.time) {//stops it while using it and also after using it, up to 3 second delay return; } - if ( self->client->ps.saberLockTime > level.time ) + if (self->client->ps.saberLockTime > level.time) {//FIXME: can this be a way to break out? return; } // Make sure to turn off Force Protection and Force Absorb. - if (self->client->ps.forcePowersActive & (1 << FP_PROTECT) ) + if (self->client->ps.forcePowersActive & (1 << FP_PROTECT)) { - WP_ForcePowerStop( self, FP_PROTECT ); + WP_ForcePowerStop(self, FP_PROTECT); } - if (self->client->ps.forcePowersActive & (1 << FP_ABSORB) ) + if (self->client->ps.forcePowersActive & (1 << FP_ABSORB)) { - WP_ForcePowerStop( self, FP_ABSORB ); + WP_ForcePowerStop(self, FP_ABSORB); } //Shoot lightning from hand //make sure this plays and that you cannot press fire for about 1 second after this - if ( self->client->ps.forcePowerLevel[FP_LIGHTNING] < FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_LIGHTNING] < FORCE_LEVEL_2) { - NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCELIGHTNING, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_TORSO, BOTH_FORCELIGHTNING, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } else { - ForceLightningAnim( self ); + ForceLightningAnim(self); /* if ( ForceLightningCheck2Handed( self ) ) {//empty handed lightning 3 - NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCE_2HANDEDLIGHTNING_START, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCE_2HANDEDLIGHTNING_START, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); } else {//one-handed lightning 3 - NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCELIGHTNING_START, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCELIGHTNING_START, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); } */ } self->client->ps.saberMove = self->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in self->client->ps.saberBlocked = BLOCKED_NONE; - G_SoundOnEnt( self, CHAN_BODY, "sound/weapons/force/lightning.wav" ); - if ( self->client->ps.forcePowerLevel[FP_LIGHTNING] < FORCE_LEVEL_2 ) + G_SoundOnEnt(self, CHAN_BODY, "sound/weapons/force/lightning.wav"); + if (self->client->ps.forcePowerLevel[FP_LIGHTNING] < FORCE_LEVEL_2) {//short burst //G_SoundOnEnt( self, CHAN_BODY, "sound/weapons/force/lightning.wav" ); } else {//holding it - self->s.loopSound = G_SoundIndex( "sound/weapons/force/lightning2.wav" ); + self->s.loopSound = G_SoundIndex("sound/weapons/force/lightning2.wav"); } - + //FIXME: build-up or delay this until in proper part of anim self->client->ps.weaponTime = self->client->ps.torsoAnimTimer; - WP_ForcePowerStart( self, FP_LIGHTNING, self->client->ps.torsoAnimTimer ); + WP_ForcePowerStart(self, FP_LIGHTNING, self->client->ps.torsoAnimTimer); } -void ForceLightningDamage( gentity_t *self, gentity_t *traceEnt, vec3_t dir, float dist, float dot, vec3_t impactPoint ) +void ForceLightningDamage(gentity_t *self, gentity_t *traceEnt, vec3_t dir, float dist, float dot, vec3_t impactPoint) { - if( traceEnt->NPC && traceEnt->NPC->scriptFlags & SCF_NO_FORCE ) + if (traceEnt->NPC && traceEnt->NPC->scriptFlags & SCF_NO_FORCE) { return; } - if ( traceEnt && traceEnt->takedamage ) + if (traceEnt && traceEnt->takedamage) { - if ( !traceEnt->client || traceEnt->client->playerTeam != self->client->playerTeam || self->enemy == traceEnt || traceEnt->enemy == self ) + if (!traceEnt->client || traceEnt->client->playerTeam != self->client->playerTeam || self->enemy == traceEnt || traceEnt->enemy == self) {//an enemy or object int dmg; //FIXME: check for client using FP_ABSORB - if ( self->client->ps.forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_2) {//more damage if closer and more in front dmg = 1; - if ( self->client->NPC_class == CLASS_REBORN - && self->client->ps.weapon == WP_NONE ) + if (self->client->NPC_class == CLASS_REBORN + && self->client->ps.weapon == WP_NONE) {//Cultist: looks fancy, but does less damage } else { - if ( dist < 100 ) + if (dist < 100) { dmg += 2; } - else if ( dist < 200 ) + else if (dist < 200) { dmg += 1; } - if ( dot > 0.9f ) + if (dot > 0.9f) { dmg += 2; } - else if ( dot > 0.7f ) + else if (dot > 0.7f) { dmg += 1; } } - if ( self->client->ps.torsoAnim == BOTH_FORCE_2HANDEDLIGHTNING + if (self->client->ps.torsoAnim == BOTH_FORCE_2HANDEDLIGHTNING || self->client->ps.torsoAnim == BOTH_FORCE_2HANDEDLIGHTNING_START || self->client->ps.torsoAnim == BOTH_FORCE_2HANDEDLIGHTNING_HOLD - || self->client->ps.torsoAnim == BOTH_FORCE_2HANDEDLIGHTNING_RELEASE ) + || self->client->ps.torsoAnim == BOTH_FORCE_2HANDEDLIGHTNING_RELEASE) {//jackin' 'em up, Palpatine-style dmg *= 2; } } else { - dmg = Q_irand( 1, 3 );//*self->client->ps.forcePowerLevel[FP_LIGHTNING]; + dmg = Q_irand(1, 3);//*self->client->ps.forcePowerLevel[FP_LIGHTNING]; } - if ( traceEnt->client - && traceEnt->health > 0 - && traceEnt->NPC - && (traceEnt->NPC->aiFlags&NPCAI_BOSS_CHARACTER) ) + if (traceEnt->client + && traceEnt->health > 0 + && traceEnt->NPC + && (traceEnt->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) {//Luke, Desann Tavion and Kyle can shield themselves from the attack //FIXME: shield effect or something? int parts; - if ( traceEnt->client->ps.groundEntityNum != ENTITYNUM_NONE && !PM_SpinningSaberAnim( traceEnt->client->ps.legsAnim ) && !PM_FlippingAnim( traceEnt->client->ps.legsAnim ) && !PM_RollingAnim( traceEnt->client->ps.legsAnim ) ) + if (traceEnt->client->ps.groundEntityNum != ENTITYNUM_NONE && !PM_SpinningSaberAnim(traceEnt->client->ps.legsAnim) && !PM_FlippingAnim(traceEnt->client->ps.legsAnim) && !PM_RollingAnim(traceEnt->client->ps.legsAnim)) {//if on a surface and not in a spin or flip, play full body resist parts = SETANIM_BOTH; } @@ -10986,44 +11578,44 @@ void ForceLightningDamage( gentity_t *self, gentity_t *traceEnt, vec3_t dir, flo parts = SETANIM_TORSO; } //FIXME: don't interrupt big anims with this! - NPC_SetAnim( traceEnt, parts, BOTH_RESISTPUSH, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - Jedi_PlayDeflectSound( traceEnt ); - dmg = Q_irand(0,1); + NPC_SetAnim(traceEnt, parts, BOTH_RESISTPUSH, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + Jedi_PlayDeflectSound(traceEnt); + dmg = Q_irand(0, 1); } - else if ( traceEnt->s.weapon == WP_SABER ) + else if (traceEnt->s.weapon == WP_SABER) {//saber can block lightning - if ( traceEnt->client //a client + if (traceEnt->client //a client && !traceEnt->client->ps.saberInFlight//saber in hand - && ( traceEnt->client->ps.saberMove == LS_READY || PM_SaberInParry( traceEnt->client->ps.saberMove ) || PM_SaberInReturn( traceEnt->client->ps.saberMove ) )//not attacking with saber - && InFOV( self->currentOrigin, traceEnt->currentOrigin, traceEnt->client->ps.viewangles, 20, 35 ) //I'm in front of them - && !PM_InKnockDown( &traceEnt->client->ps ) //they're not in a knockdown - && !PM_SuperBreakLoseAnim( traceEnt->client->ps.torsoAnim ) - && !PM_SuperBreakWinAnim( traceEnt->client->ps.torsoAnim ) - && !PM_SaberInSpecialAttack( traceEnt->client->ps.torsoAnim ) - && !PM_InSpecialJump( traceEnt->client->ps.torsoAnim ) - && (!traceEnt->s.number||(traceEnt->NPC&&traceEnt->NPC->rank>=RANK_LT_COMM)) )//the player or a tough jedi/reborn + && (traceEnt->client->ps.saberMove == LS_READY || PM_SaberInParry(traceEnt->client->ps.saberMove) || PM_SaberInReturn(traceEnt->client->ps.saberMove))//not attacking with saber + && InFOV(self->currentOrigin, traceEnt->currentOrigin, traceEnt->client->ps.viewangles, 20, 35) //I'm in front of them + && !PM_InKnockDown(&traceEnt->client->ps) //they're not in a knockdown + && !PM_SuperBreakLoseAnim(traceEnt->client->ps.torsoAnim) + && !PM_SuperBreakWinAnim(traceEnt->client->ps.torsoAnim) + && !PM_SaberInSpecialAttack(traceEnt->client->ps.torsoAnim) + && !PM_InSpecialJump(traceEnt->client->ps.torsoAnim) + && (!traceEnt->s.number || (traceEnt->NPC&&traceEnt->NPC->rank >= RANK_LT_COMM)))//the player or a tough jedi/reborn { - if ( Q_irand( 0, traceEnt->client->ps.forcePowerLevel[FP_SABER_DEFENSE]*3 ) > 0 )//more of a chance of defending if saber defense is high + if (Q_irand(0, traceEnt->client->ps.forcePowerLevel[FP_SABER_DEFENSE] * 3) > 0)//more of a chance of defending if saber defense is high { dmg = 0; } - if ( (traceEnt->client->ps.forcePowersActive&(1<client->ps.forcePowerLevel[FP_ABSORB] > FORCE_LEVEL_2 ) + if ((traceEnt->client->ps.forcePowersActive&(1 << FP_ABSORB)) + && traceEnt->client->ps.forcePowerLevel[FP_ABSORB] > FORCE_LEVEL_2) {//no parry, just absorb } else { //make them do a parry traceEnt->client->ps.saberBlocked = BLOCKED_UPPER_LEFT; - int parryReCalcTime = Jedi_ReCalcParryTime( traceEnt, EVASION_PARRY ); - if ( traceEnt->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] < level.time + parryReCalcTime ) + int parryReCalcTime = Jedi_ReCalcParryTime(traceEnt, EVASION_PARRY); + if (traceEnt->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] < level.time + parryReCalcTime) { traceEnt->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] = level.time + parryReCalcTime; } - traceEnt->client->ps.weaponTime = Q_irand( 100, 300 );//hold this move - can't attack! - FIXME: unless dual sabers? + traceEnt->client->ps.weaponTime = Q_irand(100, 300);//hold this move - can't attack! - FIXME: unless dual sabers? } } - else if ( Q_irand( 0, 1 ) ) + else if (Q_irand(0, 1)) {//jedi less likely to be damaged dmg = 0; } @@ -11032,13 +11624,13 @@ void ForceLightningDamage( gentity_t *self, gentity_t *traceEnt, vec3_t dir, flo dmg = 1; } } - if ( traceEnt && traceEnt->client && traceEnt->client->ps.powerups[PW_GALAK_SHIELD] ) + if (traceEnt && traceEnt->client && traceEnt->client->ps.powerups[PW_GALAK_SHIELD]) { //has shield up dmg = 0; } int modPowerLevel = -1; - + if (traceEnt->client) { modPowerLevel = WP_AbsorbConversion(traceEnt, traceEnt->client->ps.forcePowerLevel[FP_ABSORB], self, FP_LIGHTNING, self->client->ps.forcePowerLevel[FP_LIGHTNING], 1); @@ -11046,39 +11638,39 @@ void ForceLightningDamage( gentity_t *self, gentity_t *traceEnt, vec3_t dir, flo if (modPowerLevel != -1) { - if ( !modPowerLevel ) + if (!modPowerLevel) { dmg = 0; } - else if ( modPowerLevel == 1 ) + else if (modPowerLevel == 1) { - dmg = floor((float)dmg/4.0f); + dmg = floor((float)dmg / 4.0f); } - else if ( modPowerLevel == 2 ) + else if (modPowerLevel == 2) { - dmg = floor((float)dmg/2.0f); + dmg = floor((float)dmg / 2.0f); } } //FIXME: if ForceDrain, sap force power and add health to self, use different sound & effects - if ( dmg ) + if (dmg) { - G_Damage( traceEnt, self, self, dir, impactPoint, dmg, 0, MOD_FORCE_LIGHTNING ); + G_Damage(traceEnt, self, self, dir, impactPoint, dmg, 0, MOD_FORCE_LIGHTNING); } - if ( traceEnt->client ) + if (traceEnt->client) { - if ( !Q_irand( 0, 2 ) ) + if (!Q_irand(0, 2)) { - G_Sound( traceEnt, G_SoundIndex( va( "sound/weapons/force/lightninghit%d.wav", Q_irand( 1, 3 ) ) ) ); + G_Sound(traceEnt, G_SoundIndex(va("sound/weapons/force/lightninghit%d.wav", Q_irand(1, 3)))); } - traceEnt->s.powerups |= ( 1 << PW_SHOCKED ); + traceEnt->s.powerups |= (1 << PW_SHOCKED); // If we are dead or we are a bot, we can do the full version class_t npc_class = traceEnt->client->NPC_class; - if ( traceEnt->health <= 0 || ( npc_class == CLASS_SEEKER || npc_class == CLASS_PROBE || - npc_class == CLASS_MOUSE || npc_class == CLASS_GONK || npc_class == CLASS_R2D2 || npc_class == CLASS_REMOTE || - npc_class == CLASS_R5D2 || npc_class == CLASS_PROTOCOL || npc_class == CLASS_MARK1 || - npc_class == CLASS_MARK2 || npc_class == CLASS_INTERROGATOR || npc_class == CLASS_ATST ) || - npc_class == CLASS_SENTRY ) + if (traceEnt->health <= 0 || (npc_class == CLASS_SEEKER || npc_class == CLASS_PROBE || + npc_class == CLASS_MOUSE || npc_class == CLASS_GONK || npc_class == CLASS_R2D2 || npc_class == CLASS_REMOTE || + npc_class == CLASS_R5D2 || npc_class == CLASS_PROTOCOL || npc_class == CLASS_MARK1 || + npc_class == CLASS_MARK2 || npc_class == CLASS_INTERROGATOR || npc_class == CLASS_ATST) || + npc_class == CLASS_SENTRY) { traceEnt->client->ps.powerups[PW_SHOCKED] = level.time + 4000; } @@ -11091,100 +11683,102 @@ void ForceLightningDamage( gentity_t *self, gentity_t *traceEnt, vec3_t dir, flo } } -void ForceShootLightning( gentity_t *self ) +void ForceShootLightning(gentity_t *self) { trace_t tr; vec3_t end, forward; gentity_t *traceEnt; - if ( self->health <= 0 ) + if (self->health <= 0) { return; } - if ( !self->s.number && cg.zoomMode ) + if (!self->s.number && cg.zoomMode) {//can't force lightning when zoomed in return; } - AngleVectors( self->client->ps.viewangles, forward, NULL, NULL ); - VectorNormalize( forward ); + AngleVectors(self->client->ps.viewangles, forward, NULL, NULL); + VectorNormalize(forward); //FIXME: if lightning hits water, do water-only-flagged radius damage from that point - if ( self->client->ps.forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_2) {//arc vec3_t center, mins, maxs, dir, ent_org, size, v; float radius = 512, dot, dist; gentity_t *entityList[MAX_GENTITIES]; int e, numListedEntities, i; - VectorCopy( self->currentOrigin, center ); - for ( i = 0 ; i < 3 ; i++ ) + VectorCopy(self->currentOrigin, center); + for (i = 0; i < 3; i++) { mins[i] = center[i] - radius; maxs[i] = center[i] + radius; } - numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); + numListedEntities = gi.EntitiesInBox(mins, maxs, entityList, MAX_GENTITIES); - for ( e = 0 ; e < numListedEntities ; e++ ) + for (e = 0; e < numListedEntities; e++) { traceEnt = entityList[e]; - if ( !traceEnt ) + if (!traceEnt) continue; - if ( traceEnt == self ) + if (traceEnt == self) continue; - if ( traceEnt->owner == self && traceEnt->s.weapon != WP_THERMAL )//can push your own thermals + if (traceEnt->owner == self && traceEnt->s.weapon != WP_THERMAL)//can push your own thermals continue; - if ( !traceEnt->inuse ) + if (!traceEnt->inuse) continue; - if ( !traceEnt->takedamage ) + if (!traceEnt->takedamage) continue; /* if ( traceEnt->health <= 0 )//no torturing corpses - continue; + continue; */ //this is all to see if we need to start a saber attack, if it's in flight, this doesn't matter // find the distance from the edge of the bounding box - for ( i = 0 ; i < 3 ; i++ ) + for (i = 0; i < 3; i++) { - if ( center[i] < traceEnt->absmin[i] ) + if (center[i] < traceEnt->absmin[i]) { v[i] = traceEnt->absmin[i] - center[i]; - } else if ( center[i] > traceEnt->absmax[i] ) + } + else if (center[i] > traceEnt->absmax[i]) { v[i] = center[i] - traceEnt->absmax[i]; - } else + } + else { v[i] = 0; } } - VectorSubtract( traceEnt->absmax, traceEnt->absmin, size ); - VectorMA( traceEnt->absmin, 0.5, size, ent_org ); + VectorSubtract(traceEnt->absmax, traceEnt->absmin, size); + VectorMA(traceEnt->absmin, 0.5, size, ent_org); //see if they're in front of me //must be within the forward cone - VectorSubtract( ent_org, center, dir ); - VectorNormalize( dir ); - if ( (dot = DotProduct( dir, forward )) < 0.5 ) + VectorSubtract(ent_org, center, dir); + VectorNormalize(dir); + if ((dot = DotProduct(dir, forward)) < 0.5) continue; //must be close enough - dist = VectorLength( v ); - if ( dist >= radius ) + dist = VectorLength(v); + if (dist >= radius) { continue; } - + //in PVS? - if ( !traceEnt->bmodel && !gi.inPVS( ent_org, self->client->renderInfo.handLPoint ) ) + if (!traceEnt->bmodel && !gi.inPVS(ent_org, self->client->renderInfo.handLPoint)) {//must be in PVS continue; } //Now check and see if we can actually hit it - gi.trace( &tr, self->client->renderInfo.handLPoint, vec3_origin, vec3_origin, ent_org, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 ); - if ( tr.fraction < 1.0f && tr.entityNum != traceEnt->s.number ) + gi.trace(&tr, self->client->renderInfo.handLPoint, vec3_origin, vec3_origin, ent_org, self->s.number, MASK_SHOT, (EG2_Collision)0, 0); + if (tr.fraction < 1.0f && tr.entityNum != traceEnt->s.number) {//must have clear LOS continue; } @@ -11192,7 +11786,7 @@ void ForceShootLightning( gentity_t *self ) // ok, we are within the radius, add us to the incoming list //FIXME: maybe add up the ents and do more damage the less ents there are // as if we're spreading out the damage? - ForceLightningDamage( self, traceEnt, dir, dist, dot, ent_org ); + ForceLightningDamage(self, traceEnt, dir, dist, dot, ent_org); } } @@ -11202,27 +11796,27 @@ void ForceShootLightning( gentity_t *self ) int traces = 0; vec3_t start; - VectorCopy( self->client->renderInfo.handLPoint, start ); - VectorMA( self->client->renderInfo.handLPoint, 2048, forward, end ); - - while ( traces < 10 ) + VectorCopy(self->client->renderInfo.handLPoint, start); + VectorMA(self->client->renderInfo.handLPoint, 2048, forward, end); + + while (traces < 10) {//need to loop this in case we hit a Jedi who dodges the shot - gi.trace( &tr, start, vec3_origin, vec3_origin, end, ignore, MASK_SHOT, G2_RETURNONHIT, 10 ); - if ( tr.entityNum == ENTITYNUM_NONE || tr.fraction == 1.0 || tr.allsolid || tr.startsolid ) + gi.trace(&tr, start, vec3_origin, vec3_origin, end, ignore, MASK_SHOT, G2_RETURNONHIT, 10); + if (tr.entityNum == ENTITYNUM_NONE || tr.fraction == 1.0 || tr.allsolid || tr.startsolid) { return; } traceEnt = &g_entities[tr.entityNum]; //NOTE: only NPCs do this auto-dodge - if ( traceEnt + if (traceEnt && traceEnt->s.number >= MAX_CLIENTS && traceEnt->client - && traceEnt->client->ps.forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0 )//&& traceEnt->NPC + && traceEnt->client->ps.forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0)//&& traceEnt->NPC {//FIXME: need a more reliable way to know we hit a jedi? - if ( !Jedi_DodgeEvasion( traceEnt, self, &tr, HL_NONE ) ) + if (!Jedi_DodgeEvasion(traceEnt, self, &tr, HL_NONE)) {//act like we didn't even hit him - VectorCopy( tr.endpos, start ); + VectorCopy(tr.endpos, start); ignore = tr.entityNum; traces++; continue; @@ -11231,64 +11825,64 @@ void ForceShootLightning( gentity_t *self ) //a Jedi is not dodging this shot break; } - + traceEnt = &g_entities[tr.entityNum]; - ForceLightningDamage( self, traceEnt, forward, 0, 0, tr.endpos ); + ForceLightningDamage(self, traceEnt, forward, 0, 0, tr.endpos); } } -void WP_DeactivateSaber( gentity_t *self, qboolean clearLength ) +void WP_DeactivateSaber(gentity_t *self, qboolean clearLength) { - if ( !self || !self->client ) + if (!self || !self->client) { return; } //keep my saber off! - if ( self->client->ps.SaberActive() ) + if (self->client->ps.SaberActive()) { self->client->ps.SaberDeactivate(); - if ( clearLength ) + if (clearLength) { - self->client->ps.SetSaberLength( 0 ); + self->client->ps.SetSaberLength(0); } - G_SoundIndexOnEnt( self, CHAN_WEAPON, self->client->ps.saber[0].soundOff ); + G_SoundIndexOnEnt(self, CHAN_WEAPON, self->client->ps.saber[0].soundOff); } } -static void ForceShootDrain( gentity_t *self ); +static void ForceShootDrain(gentity_t *self); -void ForceDrainGrabStart( gentity_t *self ) +void ForceDrainGrabStart(gentity_t *self) { - NPC_SetAnim( self, SETANIM_BOTH, BOTH_FORCE_DRAIN_GRAB_START, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_BOTH, BOTH_FORCE_DRAIN_GRAB_START, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); self->client->ps.saberMove = self->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in self->client->ps.saberBlocked = BLOCKED_NONE; self->client->ps.weaponTime = 1000; - if ( self->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_SPEED)) { - self->client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value ); + self->client->ps.weaponTime = floor(self->client->ps.weaponTime * g_timescale->value); } //actually grabbing someone, so turn off the saber! - WP_DeactivateSaber( self, qtrue ); + WP_DeactivateSaber(self, qtrue); } -qboolean ForceDrain2( gentity_t *self ) +qboolean ForceDrain2(gentity_t *self) {//FIXME: make enemy Jedi able to use this trace_t tr; vec3_t end, forward; gentity_t *traceEnt = NULL; - if ( self->health <= 0 ) + if (self->health <= 0) { return qtrue; } - if ( !self->s.number && (cg.zoomMode || in_camera) ) + if (!self->s.number && (cg.zoomMode || in_camera)) {//can't force grip when zoomed in or in cinematic return qtrue; } - if ( self->client->ps.leanofs ) + if (self->client->ps.leanofs) {//can't force-drain while leaning return qtrue; } @@ -11296,89 +11890,89 @@ qboolean ForceDrain2( gentity_t *self ) /* if ( self->client->ps.SaberLength() > 0 ) {//can't do this if saber is on! - return qfalse; + return qfalse; } */ - if ( self->client->ps.forceDrainEntityNum <= ENTITYNUM_WORLD ) + if (self->client->ps.forceDrainEntityNum <= ENTITYNUM_WORLD) {//already draining //keep my saber off! - WP_DeactivateSaber( self, qtrue ); - if ( self->client->ps.forcePowerLevel[FP_DRAIN] > FORCE_LEVEL_1 ) + WP_DeactivateSaber(self, qtrue); + if (self->client->ps.forcePowerLevel[FP_DRAIN] > FORCE_LEVEL_1) { self->client->ps.forcePowerDuration[FP_DRAIN] = level.time + 100; self->client->ps.weaponTime = 1000; - if ( self->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_SPEED)) { - self->client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value ); + self->client->ps.weaponTime = floor(self->client->ps.weaponTime * g_timescale->value); } } return qtrue; } - if ( self->client->ps.forcePowerDebounce[FP_DRAIN] > level.time ) + if (self->client->ps.forcePowerDebounce[FP_DRAIN] > level.time) {//stops it while using it and also after using it, up to 3 second delay return qtrue; } - if ( self->client->ps.weaponTime > 0 ) + if (self->client->ps.weaponTime > 0) {//busy return qtrue; } - if ( self->client->ps.forcePower < 25 || !WP_ForcePowerUsable( self, FP_DRAIN, 0 ) ) + if (self->client->ps.forcePower < 25 || !WP_ForcePowerUsable(self, FP_DRAIN, 0)) { return qtrue; } - if ( self->client->ps.saberLockTime > level.time ) + if (self->client->ps.saberLockTime > level.time) {//in saberlock return qtrue; } //NOTE: from here on, if it fails, it's okay to try a normal drain, so return qfalse - if ( self->client->ps.groundEntityNum == ENTITYNUM_NONE ) + if (self->client->ps.groundEntityNum == ENTITYNUM_NONE) {//in air return qfalse; } //Cause choking anim + health drain in ent in front of me - AngleVectors( self->client->ps.viewangles, forward, NULL, NULL ); - VectorNormalize( forward ); - VectorMA( self->client->renderInfo.eyePoint, FORCE_DRAIN_DIST, forward, end ); - + AngleVectors(self->client->ps.viewangles, forward, NULL, NULL); + VectorNormalize(forward); + VectorMA(self->client->renderInfo.eyePoint, FORCE_DRAIN_DIST, forward, end); + //okay, trace straight ahead and see what's there - gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 ); - if ( tr.entityNum >= ENTITYNUM_WORLD || tr.fraction == 1.0 || tr.allsolid || tr.startsolid ) + gi.trace(&tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, (EG2_Collision)0, 0); + if (tr.entityNum >= ENTITYNUM_WORLD || tr.fraction == 1.0 || tr.allsolid || tr.startsolid) { return qfalse; } traceEnt = &g_entities[tr.entityNum]; - if ( !traceEnt || traceEnt == self/*???*/ || traceEnt->bmodel || (traceEnt->health <= 0 && traceEnt->takedamage) || (traceEnt->NPC && traceEnt->NPC->scriptFlags & SCF_NO_FORCE) ) + if (!traceEnt || traceEnt == self/*???*/ || traceEnt->bmodel || (traceEnt->health <= 0 && traceEnt->takedamage) || (traceEnt->NPC && traceEnt->NPC->scriptFlags & SCF_NO_FORCE)) { return qfalse; } - if ( traceEnt->client ) + if (traceEnt->client) { - if ( traceEnt->client->ps.forceJumpZStart ) + if (traceEnt->client->ps.forceJumpZStart) {//can't catch them in mid force jump - FIXME: maybe base it on velocity? return qfalse; } - if ( traceEnt->client->ps.groundEntityNum == ENTITYNUM_NONE ) + if (traceEnt->client->ps.groundEntityNum == ENTITYNUM_NONE) {//can't catch them in mid air return qfalse; } - if ( !Q_stricmp("Yoda",traceEnt->NPC_type) ) + if (!Q_stricmp("Yoda", traceEnt->NPC_type)) { - Jedi_PlayDeflectSound( traceEnt ); - ForceThrow( traceEnt, qfalse ); + Jedi_PlayDeflectSound(traceEnt); + ForceThrow(traceEnt, qfalse); return qtrue; } - switch ( traceEnt->client->NPC_class ) + switch (traceEnt->client->NPC_class) { case CLASS_GALAKMECH://cant grab him, he's in armor - G_AddVoiceEvent( traceEnt, Q_irand(EV_PUSHED1, EV_PUSHED3), Q_irand( 3000, 5000 ) ); + G_AddVoiceEvent(traceEnt, Q_irand(EV_PUSHED1, EV_PUSHED3), Q_irand(3000, 5000)); return qfalse; break; case CLASS_ROCKETTROOPER://cant grab him, he's in armor @@ -11388,7 +11982,7 @@ qboolean ForceDrain2( gentity_t *self ) case CLASS_ATST://much too big to grab! return qfalse; break; - //no droids either + //no droids either case CLASS_GONK: case CLASS_R2D2: case CLASS_R5D2: @@ -11411,46 +12005,46 @@ qboolean ForceDrain2( gentity_t *self ) case CLASS_KYLE: case CLASS_TAVION: case CLASS_LUKE: - Jedi_PlayDeflectSound( traceEnt ); - ForceThrow( traceEnt, qfalse ); + Jedi_PlayDeflectSound(traceEnt); + ForceThrow(traceEnt, qfalse); return qtrue; break; case CLASS_REBORN: case CLASS_SHADOWTROOPER: - //case CLASS_ALORA: + //case CLASS_ALORA: case CLASS_JEDI: - if ( traceEnt->NPC - && traceEnt->NPC->rank > RANK_CIVILIAN - && self->client->ps.forcePowerLevel[FP_DRAIN] < FORCE_LEVEL_2 - && traceEnt->client->ps.weaponTime <= 0 ) - { - ForceDrainGrabStart( self ); - Jedi_PlayDeflectSound( traceEnt ); - ForceThrow( traceEnt, qfalse ); + if (traceEnt->NPC + && traceEnt->NPC->rank > RANK_CIVILIAN + && self->client->ps.forcePowerLevel[FP_DRAIN] < FORCE_LEVEL_2 + && traceEnt->client->ps.weaponTime <= 0) + { + ForceDrainGrabStart(self); + Jedi_PlayDeflectSound(traceEnt); + ForceThrow(traceEnt, qfalse); return qtrue; } break; default: break; } - if ( traceEnt->s.weapon == WP_EMPLACED_GUN ) + if (traceEnt->s.weapon == WP_EMPLACED_GUN) {//FIXME: maybe can pull them out? return qfalse; } - if ( traceEnt != self->enemy && OnSameTeam(self, traceEnt) ) + if (traceEnt != self->enemy && OnSameTeam(self, traceEnt)) {//can't accidently grip-drain your teammate return qfalse; } -//=CHECKABSORB=== + //=CHECKABSORB=== /* if ( -1 != WP_AbsorbConversion( traceEnt, traceEnt->client->ps.forcePowerLevel[FP_ABSORB], self, FP_DRAIN, self->client->ps.forcePowerLevel[FP_DRAIN], forcePowerNeeded[self->client->ps.forcePowerLevel[FP_DRAIN]]) ) { - //WP_ForcePowerStop( self, FP_DRAIN ); - return; + //WP_ForcePowerStop( self, FP_DRAIN ); + return; } */ -//=============== - if ( !FP_ForceDrainGrippableEnt( traceEnt ) ) + //=============== + if (!FP_ForceDrainGrippableEnt(traceEnt)) { return qfalse; } @@ -11460,85 +12054,85 @@ qboolean ForceDrain2( gentity_t *self ) return qfalse; } - ForceDrainGrabStart( self ); + ForceDrainGrabStart(self); - WP_ForcePowerStart( self, FP_DRAIN, 10 ); + WP_ForcePowerStart(self, FP_DRAIN, 10); self->client->ps.forceDrainEntityNum = traceEnt->s.number; -// G_AddVoiceEvent( traceEnt, Q_irand(EV_PUSHED1, EV_PUSHED3), 2000 ); - G_AddVoiceEvent( traceEnt, Q_irand(EV_CHOKE1, EV_CHOKE3), 2000 ); - if ( /*self->client->ps.forcePowerLevel[FP_DRAIN] > FORCE_LEVEL_2 ||*/ traceEnt->s.weapon == WP_SABER ) + // G_AddVoiceEvent( traceEnt, Q_irand(EV_PUSHED1, EV_PUSHED3), 2000 ); + G_AddVoiceEvent(traceEnt, Q_irand(EV_CHOKE1, EV_CHOKE3), 2000); + if ( /*self->client->ps.forcePowerLevel[FP_DRAIN] > FORCE_LEVEL_2 ||*/ traceEnt->s.weapon == WP_SABER) {//if we pick up, turn off their weapon - WP_DeactivateSaber( traceEnt, qtrue ); + WP_DeactivateSaber(traceEnt, qtrue); } /* if ( self->client->ps.forcePowerLevel[FP_DRAIN] < FORCE_LEVEL_2 ) {//just a duration - self->client->ps.forcePowerDebounce[FP_DRAIN] = level.time + 250; - self->client->ps.forcePowerDuration[FP_DRAIN] = level.time + 5000; + self->client->ps.forcePowerDebounce[FP_DRAIN] = level.time + 250; + self->client->ps.forcePowerDuration[FP_DRAIN] = level.time + 5000; } */ - G_SoundOnEnt( self, CHAN_BODY, "sound/weapons/force/drain.mp3" ); + G_SoundOnEnt(self, CHAN_BODY, "sound/weapons/force/drain.mp3"); -// NPC_SetAnim( traceEnt, SETANIM_BOTH, BOTH_HUGGEE1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - NPC_SetAnim( traceEnt, SETANIM_BOTH, BOTH_FORCE_DRAIN_GRABBED, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - - WP_SabersCheckLock2( self, traceEnt, LOCK_FORCE_DRAIN ); + // NPC_SetAnim( traceEnt, SETANIM_BOTH, BOTH_HUGGEE1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(traceEnt, SETANIM_BOTH, BOTH_FORCE_DRAIN_GRABBED, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + + WP_SabersCheckLock2(self, traceEnt, LOCK_FORCE_DRAIN); return qtrue; } -void ForceDrain( gentity_t *self, qboolean triedDrain2 ) +void ForceDrain(gentity_t *self, qboolean triedDrain2) { - if ( self->health <= 0 ) + if (self->health <= 0) { return; } - if ( !triedDrain2 && self->client->ps.weaponTime > 0 ) + if (!triedDrain2 && self->client->ps.weaponTime > 0) { return; } - if ( self->client->ps.forcePower < 25 || !WP_ForcePowerUsable( self, FP_DRAIN, 0 ) ) + if (self->client->ps.forcePower < 25 || !WP_ForcePowerUsable(self, FP_DRAIN, 0)) { return; } - if ( self->client->ps.forcePowerDebounce[FP_DRAIN] > level.time ) + if (self->client->ps.forcePowerDebounce[FP_DRAIN] > level.time) {//stops it while using it and also after using it, up to 3 second delay return; } - if ( self->client->ps.saberLockTime > level.time ) + if (self->client->ps.saberLockTime > level.time) {//FIXME: can this be a way to break out? return; } // Make sure to turn off Force Protection and Force Absorb. - if ( self->client->ps.forcePowersActive & (1 << FP_PROTECT) ) + if (self->client->ps.forcePowersActive & (1 << FP_PROTECT)) { - WP_ForcePowerStop( self, FP_PROTECT ); + WP_ForcePowerStop(self, FP_PROTECT); } - if ( self->client->ps.forcePowersActive & (1 << FP_ABSORB) ) + if (self->client->ps.forcePowersActive & (1 << FP_ABSORB)) { - WP_ForcePowerStop( self, FP_ABSORB ); + WP_ForcePowerStop(self, FP_ABSORB); } - G_SoundOnEnt( self, CHAN_BODY, "sound/weapons/force/drain.mp3" ); - - WP_ForcePowerStart( self, FP_DRAIN, 0 ); + G_SoundOnEnt(self, CHAN_BODY, "sound/weapons/force/drain.mp3"); + + WP_ForcePowerStart(self, FP_DRAIN, 0); } -qboolean FP_ForceDrainableEnt( gentity_t *victim ) +qboolean FP_ForceDrainableEnt(gentity_t *victim) { - if ( !victim || !victim->client ) + if (!victim || !victim->client) { return qfalse; } - switch ( victim->client->NPC_class ) + switch (victim->client->NPC_class) { case CLASS_SAND_CREATURE://?? case CLASS_ATST: // technically droid... @@ -11566,17 +12160,17 @@ qboolean FP_ForceDrainableEnt( gentity_t *victim ) return qtrue; } -qboolean FP_ForceDrainGrippableEnt( gentity_t *victim ) +qboolean FP_ForceDrainGrippableEnt(gentity_t *victim) { - if ( !victim || !victim->client ) + if (!victim || !victim->client) { return qfalse; } - if ( !FP_ForceDrainableEnt( victim ) ) + if (!FP_ForceDrainableEnt(victim)) { return qfalse; } - switch ( victim->client->NPC_class ) + switch (victim->client->NPC_class) { case CLASS_RANCOR: case CLASS_SAND_CREATURE: @@ -11594,27 +12188,27 @@ qboolean FP_ForceDrainGrippableEnt( gentity_t *victim ) return qtrue; } -void ForceDrainDamage( gentity_t *self, gentity_t *traceEnt, vec3_t dir, vec3_t impactPoint ) +void ForceDrainDamage(gentity_t *self, gentity_t *traceEnt, vec3_t dir, vec3_t impactPoint) { - if ( traceEnt - && traceEnt->health > 0 - && traceEnt->takedamage - && FP_ForceDrainableEnt( traceEnt ) ) + if (traceEnt + && traceEnt->health > 0 + && traceEnt->takedamage + && FP_ForceDrainableEnt(traceEnt)) { - if ( traceEnt->client - && (!OnSameTeam(self, traceEnt)||self->enemy==traceEnt)//don't drain an ally unless that is actually my current enemy - && self->client->ps.forceDrainTime < level.time ) + if (traceEnt->client + && (!OnSameTeam(self, traceEnt) || self->enemy == traceEnt)//don't drain an ally unless that is actually my current enemy + && self->client->ps.forceDrainTime < level.time) {//an enemy or object int modPowerLevel = -1; int dmg = self->client->ps.forcePowerLevel[FP_DRAIN] + 1; - int dflags = (DAMAGE_NO_ARMOR|DAMAGE_NO_KNOCKBACK|DAMAGE_NO_HIT_LOC);//|DAMAGE_NO_KILL); - if ( traceEnt->s.number == self->client->ps.forceDrainEntityNum ) + int dflags = (DAMAGE_NO_ARMOR | DAMAGE_NO_KNOCKBACK | DAMAGE_NO_HIT_LOC);//|DAMAGE_NO_KILL); + if (traceEnt->s.number == self->client->ps.forceDrainEntityNum) {//grabbing hold of them does more damage/drains more, and can actually kill them dmg += 3; dflags |= DAMAGE_IGNORE_TEAM; //dflags &= ~DAMAGE_NO_KILL; } - + if (traceEnt->client) { //check for client using FP_ABSORB @@ -11622,28 +12216,28 @@ void ForceDrainDamage( gentity_t *self, gentity_t *traceEnt, vec3_t dir, vec3_t //Since this is drain, don't absorb any power, but nullify the affect it has } - if ( modPowerLevel != -1 ) + if (modPowerLevel != -1) { - if ( !modPowerLevel ) + if (!modPowerLevel) { dmg = 0; } - else if ( modPowerLevel == 1 ) + else if (modPowerLevel == 1) { dmg = 1; } - else if ( modPowerLevel == 2 ) + else if (modPowerLevel == 2) { dmg = 2; } } - if ( dmg ) + if (dmg) { - int drain = 0; - if ( traceEnt->client->ps.forcePower ) + int drain = 0; + if (traceEnt->client->ps.forcePower) { - if ( dmg > traceEnt->client->ps.forcePower ) + if (dmg > traceEnt->client->ps.forcePower) { drain = traceEnt->client->ps.forcePower; dmg -= drain; @@ -11660,61 +12254,61 @@ void ForceDrainDamage( gentity_t *self, gentity_t *traceEnt, vec3_t dir, vec3_t /* if ( (dflags&DAMAGE_NO_KILL) ) {//must cap damage - if ( traceEnt->health <= 1 ) - {//can't drain more than they have - dmg = 0; - } - else if ( dmg >= traceEnt->health ) - {//no more than they have, leaving one for them - dmg = traceEnt->health-1; - } + if ( traceEnt->health <= 1 ) + {//can't drain more than they have + dmg = 0; + } + else if ( dmg >= traceEnt->health ) + {//no more than they have, leaving one for them + dmg = traceEnt->health-1; + } } */ int maxHealth = self->client->ps.stats[STAT_MAX_HEALTH]; - if ( self->client->ps.forcePowerLevel[FP_DRAIN] > FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_DRAIN] > FORCE_LEVEL_2) {//overcharge health - maxHealth = floor( (float)self->client->ps.stats[STAT_MAX_HEALTH] * 1.25f ); + maxHealth = floor((float)self->client->ps.stats[STAT_MAX_HEALTH] * 1.25f); } if (self->client->ps.stats[STAT_HEALTH] < maxHealth && self->health > 0 && self->client->ps.stats[STAT_HEALTH] > 0) { - self->health += (drain+dmg); - if (self->health > maxHealth ) + self->health += (drain + dmg); + if (self->health > maxHealth) { self->health = maxHealth; } self->client->ps.stats[STAT_HEALTH] = self->health; - if ( self->health > self->client->ps.stats[STAT_MAX_HEALTH] ) + if (self->health > self->client->ps.stats[STAT_MAX_HEALTH]) { self->flags |= FL_OVERCHARGED_HEALTH; } } - if ( dmg ) + if (dmg) {//do damage, too - G_Damage( traceEnt, self, self, dir, impactPoint, dmg, dflags, MOD_FORCE_DRAIN ); + G_Damage(traceEnt, self, self, dir, impactPoint, dmg, dflags, MOD_FORCE_DRAIN); } - else if ( drain ) + else if (drain) { /* - if ( traceEnt->s.number == self->client->ps.forceDrainEntityNum - || traceEnt->s.number < MAX_CLIENTS ) + if ( traceEnt->s.number == self->client->ps.forceDrainEntityNum + || traceEnt->s.number < MAX_CLIENTS ) {//grip-draining (or player - only does sound) */ - NPC_SetPainEvent( traceEnt ); + NPC_SetPainEvent(traceEnt); /* } else { - GEntity_PainFunc( traceEnt, self, self, impactPoint, 0, MOD_FORCE_DRAIN ); + GEntity_PainFunc( traceEnt, self, self, impactPoint, 0, MOD_FORCE_DRAIN ); } */ } - if ( !Q_irand( 0, 2 ) ) + if (!Q_irand(0, 2)) { - G_Sound( traceEnt, G_SoundIndex( "sound/weapons/force/drained.mp3" ) ); + G_Sound(traceEnt, G_SoundIndex("sound/weapons/force/drained.mp3")); } traceEnt->client->ps.forcePowerRegenDebounceTime = level.time + 800; //don't let the client being drained get force power back right away @@ -11723,17 +12317,17 @@ void ForceDrainDamage( gentity_t *self, gentity_t *traceEnt, vec3_t dir, vec3_t } } -qboolean WP_CheckForceDraineeStopMe( gentity_t *self, gentity_t *drainee ) +qboolean WP_CheckForceDraineeStopMe(gentity_t *self, gentity_t *drainee) { - if ( drainee->NPC - && drainee->client - && (drainee->client->ps.forcePowersKnown&(1<client->ps.forcePowerDebounce[FP_DRAIN]>self->client->ps.forcePowerLevel[FP_DRAIN]*500)//at level 1, I always get at least 500ms of drain, at level 3 I get 1500ms - && !Q_irand( 0, 100-(drainee->NPC->stats.evasion*10)-(g_spskill->integer*12) ) ) + if (drainee->NPC + && drainee->client + && (drainee->client->ps.forcePowersKnown&(1 << FP_PUSH)) + && level.time - (self->client->ps.forcePowerDebounce[FP_DRAIN]>self->client->ps.forcePowerLevel[FP_DRAIN] * 500)//at level 1, I always get at least 500ms of drain, at level 3 I get 1500ms + && !Q_irand(0, 100 - (drainee->NPC->stats.evasion * 10) - (g_spskill->integer * 12))) {//a jedi who broke free - ForceThrow( drainee, qfalse ); + ForceThrow(drainee, qfalse); //FIXME: I need to go into some pushed back anim... - WP_ForcePowerStop( self, FP_DRAIN ); + WP_ForcePowerStop(self, FP_DRAIN); //can't drain again for 2 seconds self->client->ps.forcePowerDebounce[FP_DRAIN] = level.time + 4000; return qtrue; @@ -11741,126 +12335,128 @@ qboolean WP_CheckForceDraineeStopMe( gentity_t *self, gentity_t *drainee ) return qfalse; } -void ForceShootDrain( gentity_t *self ) +void ForceShootDrain(gentity_t *self) { trace_t tr; vec3_t end, forward; gentity_t *traceEnt; int numDrained = 0; - if ( self->health <= 0 ) + if (self->health <= 0) { return; } - - if ( self->client->ps.forcePowerDebounce[FP_DRAIN] <= level.time ) + + if (self->client->ps.forcePowerDebounce[FP_DRAIN] <= level.time) { - AngleVectors( self->client->ps.viewangles, forward, NULL, NULL ); - VectorNormalize( forward ); + AngleVectors(self->client->ps.viewangles, forward, NULL, NULL); + VectorNormalize(forward); - if ( self->client->ps.forcePowerLevel[FP_DRAIN] > FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_DRAIN] > FORCE_LEVEL_2) {//arc vec3_t center, mins, maxs, dir, ent_org, size, v; float radius = MAX_DRAIN_DISTANCE, dot, dist; gentity_t *entityList[MAX_GENTITIES]; int e, numListedEntities, i; - VectorCopy( self->client->ps.origin, center ); - for ( i = 0 ; i < 3 ; i++ ) + VectorCopy(self->client->ps.origin, center); + for (i = 0; i < 3; i++) { mins[i] = center[i] - radius; maxs[i] = center[i] + radius; } - numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); + numListedEntities = gi.EntitiesInBox(mins, maxs, entityList, MAX_GENTITIES); - for ( e = 0 ; e < numListedEntities ; e++ ) + for (e = 0; e < numListedEntities; e++) { traceEnt = entityList[e]; - if ( !traceEnt ) + if (!traceEnt) continue; - if ( traceEnt == self ) + if (traceEnt == self) continue; - if ( !traceEnt->inuse ) + if (!traceEnt->inuse) continue; - if ( !traceEnt->takedamage ) + if (!traceEnt->takedamage) continue; - if ( traceEnt->health <= 0 )//no torturing corpses + if (traceEnt->health <= 0)//no torturing corpses continue; - if ( !traceEnt->client ) + if (!traceEnt->client) continue; /* if ( !traceEnt->client->ps.forcePower ) - continue; + continue; */ - // if (traceEnt->client->ps.forceSide == FORCE_DARKSIDE) // We no longer care if the victim is dark or light - // continue; + // if (traceEnt->client->ps.forceSide == FORCE_DARKSIDE) // We no longer care if the victim is dark or light + // continue; if (self->enemy != traceEnt//not my enemy && OnSameTeam(self, traceEnt))//on my team continue; //this is all to see if we need to start a saber attack, if it's in flight, this doesn't matter // find the distance from the edge of the bounding box - for ( i = 0 ; i < 3 ; i++ ) + for (i = 0; i < 3; i++) { - if ( center[i] < traceEnt->absmin[i] ) + if (center[i] < traceEnt->absmin[i]) { v[i] = traceEnt->absmin[i] - center[i]; - } else if ( center[i] > traceEnt->absmax[i] ) + } + else if (center[i] > traceEnt->absmax[i]) { v[i] = center[i] - traceEnt->absmax[i]; - } else + } + else { v[i] = 0; } } - VectorSubtract( traceEnt->absmax, traceEnt->absmin, size ); - VectorMA( traceEnt->absmin, 0.5, size, ent_org ); + VectorSubtract(traceEnt->absmax, traceEnt->absmin, size); + VectorMA(traceEnt->absmin, 0.5, size, ent_org); //see if they're in front of me //must be within the forward cone - VectorSubtract( ent_org, center, dir ); - VectorNormalize( dir ); - if ( (dot = DotProduct( dir, forward )) < 0.5 ) + VectorSubtract(ent_org, center, dir); + VectorNormalize(dir); + if ((dot = DotProduct(dir, forward)) < 0.5) continue; //must be close enough - dist = VectorLength( v ); - if ( dist >= radius ) + dist = VectorLength(v); + if (dist >= radius) { continue; } - + //in PVS? - if ( !traceEnt->bmodel && !gi.inPVS( ent_org, self->client->renderInfo.handLPoint ) ) + if (!traceEnt->bmodel && !gi.inPVS(ent_org, self->client->renderInfo.handLPoint)) {//must be in PVS continue; } //Now check and see if we can actually hit it - gi.trace( &tr, self->client->ps.origin, vec3_origin, vec3_origin, ent_org, self->s.number, MASK_SHOT, G2_RETURNONHIT, 10 ); - if ( tr.fraction < 1.0f && tr.entityNum != traceEnt->s.number ) + gi.trace(&tr, self->client->ps.origin, vec3_origin, vec3_origin, ent_org, self->s.number, MASK_SHOT, G2_RETURNONHIT, 10); + if (tr.fraction < 1.0f && tr.entityNum != traceEnt->s.number) {//must have clear LOS continue; } - if ( traceEnt + if (traceEnt && traceEnt->s.number >= MAX_CLIENTS && traceEnt->client - && traceEnt->client->ps.forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0 )//&& traceEnt->NPC - { - if ( !Q_irand( 0, 4 ) && !Jedi_DodgeEvasion( traceEnt, self, &tr, HL_NONE ) ) + && traceEnt->client->ps.forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0)//&& traceEnt->NPC + { + if (!Q_irand(0, 4) && !Jedi_DodgeEvasion(traceEnt, self, &tr, HL_NONE)) {//act like we didn't even hit him continue; } - } + } // ok, we are within the radius, add us to the incoming list - if ( WP_CheckForceDraineeStopMe( self, traceEnt ) ) + if (WP_CheckForceDraineeStopMe(self, traceEnt)) { continue; } - ForceDrainDamage( self, traceEnt, dir, ent_org ); + ForceDrainDamage(self, traceEnt, dir, ent_org); numDrained++; } @@ -11871,29 +12467,29 @@ void ForceShootDrain( gentity_t *self ) int traces = 0; vec3_t start; - VectorCopy( self->client->renderInfo.handLPoint, start ); - VectorMA( start, MAX_DRAIN_DISTANCE, forward, end ); - - while ( traces < 10 ) + VectorCopy(self->client->renderInfo.handLPoint, start); + VectorMA(start, MAX_DRAIN_DISTANCE, forward, end); + + while (traces < 10) {//need to loop this in case we hit a Jedi who dodges the shot - gi.trace( &tr, start, vec3_origin, vec3_origin, end, ignore, MASK_SHOT, G2_RETURNONHIT, 10 ); - if ( tr.entityNum == ENTITYNUM_NONE || tr.fraction == 1.0 || tr.allsolid || tr.startsolid ) + gi.trace(&tr, start, vec3_origin, vec3_origin, end, ignore, MASK_SHOT, G2_RETURNONHIT, 10); + if (tr.entityNum == ENTITYNUM_NONE || tr.fraction == 1.0 || tr.allsolid || tr.startsolid) { //always take 1 force point per frame that we're shooting this - WP_ForcePowerDrain( self, FP_DRAIN, 1 ); + WP_ForcePowerDrain(self, FP_DRAIN, 1); return; } traceEnt = &g_entities[tr.entityNum]; //NOTE: only NPCs do this auto-dodge - if ( traceEnt + if (traceEnt && traceEnt->s.number >= MAX_CLIENTS && traceEnt->client - && traceEnt->client->ps.forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0 )//&& traceEnt->NPC - { - if ( !Q_irand( 0, 2 ) && !Jedi_DodgeEvasion( traceEnt, self, &tr, HL_NONE ) ) + && traceEnt->client->ps.forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0)//&& traceEnt->NPC + { + if (!Q_irand(0, 2) && !Jedi_DodgeEvasion(traceEnt, self, &tr, HL_NONE)) {//act like we didn't even hit him - VectorCopy( tr.endpos, start ); + VectorCopy(tr.endpos, start); ignore = tr.entityNum; traces++; continue; @@ -11903,9 +12499,9 @@ void ForceShootDrain( gentity_t *self ) break; } traceEnt = &g_entities[tr.entityNum]; - if ( !WP_CheckForceDraineeStopMe( self, traceEnt ) ) + if (!WP_CheckForceDraineeStopMe(self, traceEnt)) { - ForceDrainDamage( self, traceEnt, forward, tr.endpos ); + ForceDrainDamage(self, traceEnt, forward, tr.endpos); } numDrained = 1; } @@ -11913,156 +12509,156 @@ void ForceShootDrain( gentity_t *self ) self->client->ps.forcePowerDebounce[FP_DRAIN] = level.time + 200;//so we don't drain so damn fast! } self->client->ps.forcePowerRegenDebounceTime = level.time + 500; - - if ( !numDrained ) + + if (!numDrained) {//always take 1 force point per frame that we're shooting this - WP_ForcePowerDrain( self, FP_DRAIN, 1 ); + WP_ForcePowerDrain(self, FP_DRAIN, 1); } else { - WP_ForcePowerDrain( self, FP_DRAIN, numDrained );//was 2, but... + WP_ForcePowerDrain(self, FP_DRAIN, numDrained);//was 2, but... } return; } -void ForceDrainEnt( gentity_t *self, gentity_t *drainEnt ) +void ForceDrainEnt(gentity_t *self, gentity_t *drainEnt) { - if ( self->health <= 0 ) + if (self->health <= 0) { return; } - - if ( self->client->ps.forcePowerDebounce[FP_DRAIN] <= level.time ) + + if (self->client->ps.forcePowerDebounce[FP_DRAIN] <= level.time) { - if ( !drainEnt ) + if (!drainEnt) return; - if ( drainEnt == self ) + if (drainEnt == self) return; - if ( !drainEnt->inuse ) + if (!drainEnt->inuse) return; - if ( !drainEnt->takedamage ) + if (!drainEnt->takedamage) return; - if ( drainEnt->health <= 0 )//no torturing corpses + if (drainEnt->health <= 0)//no torturing corpses return; - if ( !drainEnt->client ) + if (!drainEnt->client) return; if (OnSameTeam(self, drainEnt)) return; vec3_t fwd; - AngleVectors( self->client->ps.viewangles, fwd, NULL, NULL ); + AngleVectors(self->client->ps.viewangles, fwd, NULL, NULL); drainEnt->painDebounceTime = 0; - ForceDrainDamage( self, drainEnt, fwd, drainEnt->currentOrigin ); + ForceDrainDamage(self, drainEnt, fwd, drainEnt->currentOrigin); drainEnt->painDebounceTime = level.time + 2000; - if ( drainEnt->s.number ) + if (drainEnt->s.number) { - if ( self->client->ps.forcePowerLevel[FP_DRAIN] > FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_DRAIN] > FORCE_LEVEL_2) {//do damage faster at level 3 - self->client->ps.forcePowerDebounce[FP_DRAIN] = level.time + Q_irand( 100, 500 ); + self->client->ps.forcePowerDebounce[FP_DRAIN] = level.time + Q_irand(100, 500); } else { - self->client->ps.forcePowerDebounce[FP_DRAIN] = level.time + Q_irand( 200, 800 ); + self->client->ps.forcePowerDebounce[FP_DRAIN] = level.time + Q_irand(200, 800); } } else {//player takes damage faster - self->client->ps.forcePowerDebounce[FP_DRAIN] = level.time + Q_irand( 100, 500 ); + self->client->ps.forcePowerDebounce[FP_DRAIN] = level.time + Q_irand(100, 500); } } self->client->ps.forcePowerRegenDebounceTime = level.time + 500; } -void ForceSeeing( gentity_t *self ) +void ForceSeeing(gentity_t *self) { - if ( self->health <= 0 ) + if (self->health <= 0) { return; } if (self->client->ps.forceAllowDeactivateTime < level.time && - (self->client->ps.forcePowersActive & (1 << FP_SEE)) ) + (self->client->ps.forcePowersActive & (1 << FP_SEE))) { - WP_ForcePowerStop( self, FP_SEE ); + WP_ForcePowerStop(self, FP_SEE); return; } - if ( !WP_ForcePowerUsable( self, FP_SEE, 0 ) ) + if (!WP_ForcePowerUsable(self, FP_SEE, 0)) { return; } - WP_DebounceForceDeactivateTime( self ); + WP_DebounceForceDeactivateTime(self); - WP_ForcePowerStart( self, FP_SEE, 0 ); + WP_ForcePowerStart(self, FP_SEE, 0); - G_SoundOnEnt( self, CHAN_ITEM, "sound/weapons/force/see.wav" ); + G_SoundOnEnt(self, CHAN_ITEM, "sound/weapons/force/see.wav"); } -void ForceProtect( gentity_t *self ) +void ForceProtect(gentity_t *self) { - if ( self->health <= 0 ) + if (self->health <= 0) { return; } if (self->client->ps.forceAllowDeactivateTime < level.time && - (self->client->ps.forcePowersActive & (1 << FP_PROTECT)) ) + (self->client->ps.forcePowersActive & (1 << FP_PROTECT))) { - WP_ForcePowerStop( self, FP_PROTECT ); + WP_ForcePowerStop(self, FP_PROTECT); return; } - if ( !WP_ForcePowerUsable( self, FP_PROTECT, 0 ) ) + if (!WP_ForcePowerUsable(self, FP_PROTECT, 0)) { return; } // Make sure to turn off Force Rage and Force Absorb. - if (self->client->ps.forcePowersActive & (1 << FP_RAGE) ) + if (self->client->ps.forcePowersActive & (1 << FP_RAGE)) { - WP_ForcePowerStop( self, FP_RAGE ); + WP_ForcePowerStop(self, FP_RAGE); } - WP_DebounceForceDeactivateTime( self ); + WP_DebounceForceDeactivateTime(self); - WP_ForcePowerStart( self, FP_PROTECT, 0 ); + WP_ForcePowerStart(self, FP_PROTECT, 0); - if ( self->client->ps.saberLockTime < level.time ) + if (self->client->ps.saberLockTime < level.time) { - if ( self->client->ps.forcePowerLevel[FP_PROTECT] < FORCE_LEVEL_3 ) + if (self->client->ps.forcePowerLevel[FP_PROTECT] < FORCE_LEVEL_3) {//animate int parts = SETANIM_BOTH; int anim = BOTH_FORCE_PROTECT; - if ( self->client->ps.forcePowerLevel[FP_PROTECT] > FORCE_LEVEL_1 ) + if (self->client->ps.forcePowerLevel[FP_PROTECT] > FORCE_LEVEL_1) {//level 2 only does it on torso (can keep running) parts = SETANIM_TORSO; anim = BOTH_FORCE_PROTECT_FAST; } else { - if ( self->client->ps.groundEntityNum != ENTITYNUM_NONE ) + if (self->client->ps.groundEntityNum != ENTITYNUM_NONE) { - VectorClear( self->client->ps.velocity ); + VectorClear(self->client->ps.velocity); } - if ( self->NPC ) + if (self->NPC) { - VectorClear( self->client->ps.moveDir ); + VectorClear(self->client->ps.moveDir); self->client->ps.speed = 0; } //FIXME: what if in air? } - NPC_SetAnim( self, parts, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, parts, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); //don't move or attack during this anim - if ( self->client->ps.forcePowerLevel[FP_PROTECT] < FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_PROTECT] < FORCE_LEVEL_2) { self->client->ps.pm_flags |= PMF_TIME_KNOCKBACK; self->client->ps.pm_time = self->client->ps.weaponTime = self->client->ps.torsoAnimTimer; - if ( self->s.number ) + if (self->s.number) {//NPC self->painDebounceTime = level.time + self->client->ps.torsoAnimTimer; } @@ -12079,53 +12675,53 @@ void ForceProtect( gentity_t *self ) } } -void ForceAbsorb( gentity_t *self ) +void ForceAbsorb(gentity_t *self) { - if ( self->health <= 0 ) + if (self->health <= 0) { return; } if (self->client->ps.forceAllowDeactivateTime < level.time && - (self->client->ps.forcePowersActive & (1 << FP_ABSORB)) ) + (self->client->ps.forcePowersActive & (1 << FP_ABSORB))) { - WP_ForcePowerStop( self, FP_ABSORB ); + WP_ForcePowerStop(self, FP_ABSORB); return; } - if ( !WP_ForcePowerUsable( self, FP_ABSORB, 0 ) ) + if (!WP_ForcePowerUsable(self, FP_ABSORB, 0)) { return; } // Make sure to turn off Force Rage and Force Protection. - if (self->client->ps.forcePowersActive & (1 << FP_RAGE) ) + if (self->client->ps.forcePowersActive & (1 << FP_RAGE)) { - WP_ForcePowerStop( self, FP_RAGE ); + WP_ForcePowerStop(self, FP_RAGE); } - WP_DebounceForceDeactivateTime( self ); + WP_DebounceForceDeactivateTime(self); - WP_ForcePowerStart( self, FP_ABSORB, 0 ); + WP_ForcePowerStart(self, FP_ABSORB, 0); - if ( self->client->ps.saberLockTime < level.time ) + if (self->client->ps.saberLockTime < level.time) { - if ( self->client->ps.forcePowerLevel[FP_ABSORB] < FORCE_LEVEL_3 ) + if (self->client->ps.forcePowerLevel[FP_ABSORB] < FORCE_LEVEL_3) {//must animate int parts = SETANIM_BOTH; - if ( self->client->ps.forcePowerLevel[FP_ABSORB] > FORCE_LEVEL_1 ) + if (self->client->ps.forcePowerLevel[FP_ABSORB] > FORCE_LEVEL_1) {//level 2 only does it on torso (can keep running) parts = SETANIM_TORSO; } else { - if ( self->client->ps.groundEntityNum != ENTITYNUM_NONE ) + if (self->client->ps.groundEntityNum != ENTITYNUM_NONE) { - VectorClear( self->client->ps.velocity ); + VectorClear(self->client->ps.velocity); } - if ( self->NPC ) + if (self->NPC) { - VectorClear( self->client->ps.moveDir ); + VectorClear(self->client->ps.moveDir); self->client->ps.speed = 0; } //FIXME: what if in air? @@ -12134,16 +12730,16 @@ void ForceAbsorb( gentity_t *self ) //if in air, only do on torso - NOTE: or moving? if ( self->client->ps.groundEntityNum == ENTITYNUM_NONE )//|| !VectorCompare( self->client->ps.velocity, vec3_origin ) ) { - parts = SETANIM_TORSO; + parts = SETANIM_TORSO; } */ - NPC_SetAnim( self, parts, BOTH_FORCE_ABSORB, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, parts, BOTH_FORCE_ABSORB, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); self->client->ps.weaponTime = self->client->ps.torsoAnimTimer; - if ( parts == SETANIM_BOTH ) + if (parts == SETANIM_BOTH) {//can't move self->client->ps.pm_flags |= PMF_TIME_KNOCKBACK; self->client->ps.pm_time = self->client->ps.legsAnimTimer = self->client->ps.torsoAnimTimer;// = self->client->ps.forcePowerDuration[FP_ABSORB]; - if ( self->s.number ) + if (self->s.number) {//NPC self->painDebounceTime = level.time + self->client->ps.pm_time;//self->client->ps.forcePowerDuration[FP_ABSORB]; } @@ -12160,9 +12756,9 @@ void ForceAbsorb( gentity_t *self ) } } -void ForceRage( gentity_t *self ) +void ForceRage(gentity_t *self) { - if ( self->health <= 0 ) + if (self->health <= 0) { return; } @@ -12170,13 +12766,13 @@ void ForceRage( gentity_t *self ) //FIXME: prevent them from using any other force powers when raging? if (self->client->ps.forceAllowDeactivateTime < level.time && - (self->client->ps.forcePowersActive & (1 << FP_RAGE)) ) + (self->client->ps.forcePowersActive & (1 << FP_RAGE))) { - WP_ForcePowerStop( self, FP_RAGE ); + WP_ForcePowerStop(self, FP_RAGE); return; } - if ( !WP_ForcePowerUsable( self, FP_RAGE, 0 ) ) + if (!WP_ForcePowerUsable(self, FP_RAGE, 0)) { return; } @@ -12186,8 +12782,8 @@ void ForceRage( gentity_t *self ) return; } - if ( self->s.number < MAX_CLIENTS - && self->health < 25 ) + if (self->s.number < MAX_CLIENTS + && self->health < 25) {//have to have at least 25 health to start it return; } @@ -12198,32 +12794,32 @@ void ForceRage( gentity_t *self ) } // Make sure to turn off Force Protection and Force Absorb. - if (self->client->ps.forcePowersActive & (1 << FP_PROTECT) ) + if (self->client->ps.forcePowersActive & (1 << FP_PROTECT)) { - WP_ForcePowerStop( self, FP_PROTECT ); + WP_ForcePowerStop(self, FP_PROTECT); } - if (self->client->ps.forcePowersActive & (1 << FP_ABSORB) ) + if (self->client->ps.forcePowersActive & (1 << FP_ABSORB)) { - WP_ForcePowerStop( self, FP_ABSORB ); + WP_ForcePowerStop(self, FP_ABSORB); } - WP_DebounceForceDeactivateTime( self ); + WP_DebounceForceDeactivateTime(self); - WP_ForcePowerStart( self, FP_RAGE, 0 ); + WP_ForcePowerStart(self, FP_RAGE, 0); - if ( self->client->ps.saberLockTime < level.time ) + if (self->client->ps.saberLockTime < level.time) { - if ( self->client->ps.forcePowerLevel[FP_RAGE] < FORCE_LEVEL_3 ) + if (self->client->ps.forcePowerLevel[FP_RAGE] < FORCE_LEVEL_3) {//must animate - if ( self->client->ps.forcePowerLevel[FP_RAGE] < FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_RAGE] < FORCE_LEVEL_2) {//have to stand still for whole length of anim //FIXME: if in air, only do on torso? - NPC_SetAnim( self, SETANIM_BOTH, BOTH_FORCE_RAGE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_BOTH, BOTH_FORCE_RAGE, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); //don't attack during this anim self->client->ps.weaponTime = self->client->ps.torsoAnimTimer; self->client->ps.pm_flags |= PMF_TIME_KNOCKBACK; self->client->ps.pm_time = self->client->ps.torsoAnimTimer; - if ( self->s.number ) + if (self->s.number) {//NPC self->painDebounceTime = level.time + self->client->ps.torsoAnimTimer; } @@ -12234,7 +12830,7 @@ void ForceRage( gentity_t *self ) } else { - NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCE_RAGE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_TORSO, BOTH_FORCE_RAGE, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); //don't attack during this anim self->client->ps.weaponTime = self->client->ps.torsoAnimTimer; } @@ -12245,51 +12841,51 @@ void ForceRage( gentity_t *self ) } } -void ForceJumpCharge( gentity_t *self, usercmd_t *ucmd ) +void ForceJumpCharge(gentity_t *self, usercmd_t *ucmd) { - float forceJumpChargeInterval = forceJumpStrength[0] / (FORCE_JUMP_CHARGE_TIME/FRAMETIME); + float forceJumpChargeInterval = forceJumpStrength[0] / (FORCE_JUMP_CHARGE_TIME / FRAMETIME); - if ( self->health <= 0 ) + if (self->health <= 0) { return; } - if ( !self->s.number && cg.zoomMode ) + if (!self->s.number && cg.zoomMode) {//can't force jump when zoomed in return; } //need to play sound - if ( !self->client->ps.forceJumpCharge ) + if (!self->client->ps.forceJumpCharge) {//FIXME: this should last only as long as the actual charge-up - G_SoundOnEnt( self, CHAN_BODY, "sound/weapons/force/jumpbuild.wav" ); + G_SoundOnEnt(self, CHAN_BODY, "sound/weapons/force/jumpbuild.wav"); } //Increment self->client->ps.forceJumpCharge += forceJumpChargeInterval; //clamp to max strength for current level - if ( self->client->ps.forceJumpCharge > forceJumpStrength[self->client->ps.forcePowerLevel[FP_LEVITATION]] ) + if (self->client->ps.forceJumpCharge > forceJumpStrength[self->client->ps.forcePowerLevel[FP_LEVITATION]]) { self->client->ps.forceJumpCharge = forceJumpStrength[self->client->ps.forcePowerLevel[FP_LEVITATION]]; } //clamp to max available force power - if ( self->client->ps.forceJumpCharge/forceJumpChargeInterval/(FORCE_JUMP_CHARGE_TIME/FRAMETIME)*forcePowerNeeded[FP_LEVITATION] > self->client->ps.forcePower ) + if (self->client->ps.forceJumpCharge / forceJumpChargeInterval / (FORCE_JUMP_CHARGE_TIME / FRAMETIME)*forcePowerNeeded[FP_LEVITATION] > self->client->ps.forcePower) {//can't use more than you have - self->client->ps.forceJumpCharge = self->client->ps.forcePower*forceJumpChargeInterval/(FORCE_JUMP_CHARGE_TIME/FRAMETIME); + self->client->ps.forceJumpCharge = self->client->ps.forcePower*forceJumpChargeInterval / (FORCE_JUMP_CHARGE_TIME / FRAMETIME); } //FIXME: a simple tap should always do at least a normal height's jump? } -int WP_GetVelocityForForceJump( gentity_t *self, vec3_t jumpVel, usercmd_t *ucmd ) +int WP_GetVelocityForForceJump(gentity_t *self, vec3_t jumpVel, usercmd_t *ucmd) { float pushFwd = 0, pushRt = 0; vec3_t view, forward, right; - VectorCopy( self->client->ps.viewangles, view ); + VectorCopy(self->client->ps.viewangles, view); view[0] = 0; - AngleVectors( view, forward, right, NULL ); - if ( ucmd->forwardmove && ucmd->rightmove ) + AngleVectors(view, forward, right, NULL); + if (ucmd->forwardmove && ucmd->rightmove) { - if ( ucmd->forwardmove > 0 ) + if (ucmd->forwardmove > 0) { pushFwd = 50; } @@ -12297,7 +12893,7 @@ int WP_GetVelocityForForceJump( gentity_t *self, vec3_t jumpVel, usercmd_t *ucmd { pushFwd = -50; } - if ( ucmd->rightmove > 0 ) + if (ucmd->rightmove > 0) { pushRt = 50; } @@ -12306,41 +12902,41 @@ int WP_GetVelocityForForceJump( gentity_t *self, vec3_t jumpVel, usercmd_t *ucmd pushRt = -50; } } - else if ( ucmd->forwardmove || ucmd->rightmove ) + else if (ucmd->forwardmove || ucmd->rightmove) { - if ( ucmd->forwardmove > 0 ) + if (ucmd->forwardmove > 0) { pushFwd = 100; } - else if ( ucmd->forwardmove < 0 ) + else if (ucmd->forwardmove < 0) { pushFwd = -100; } - else if ( ucmd->rightmove > 0 ) + else if (ucmd->rightmove > 0) { pushRt = 100; } - else if ( ucmd->rightmove < 0 ) + else if (ucmd->rightmove < 0) { pushRt = -100; } } - VectorMA( self->client->ps.velocity, pushFwd, forward, jumpVel ); - VectorMA( self->client->ps.velocity, pushRt, right, jumpVel ); + VectorMA(self->client->ps.velocity, pushFwd, forward, jumpVel); + VectorMA(self->client->ps.velocity, pushRt, right, jumpVel); jumpVel[2] += self->client->ps.forceJumpCharge;//forceJumpStrength; - if ( pushFwd > 0 && self->client->ps.forceJumpCharge > 200 ) + if (pushFwd > 0 && self->client->ps.forceJumpCharge > 200) { return FJ_FORWARD; } - else if ( pushFwd < 0 && self->client->ps.forceJumpCharge > 200 ) + else if (pushFwd < 0 && self->client->ps.forceJumpCharge > 200) { return FJ_BACKWARD; } - else if ( pushRt > 0 && self->client->ps.forceJumpCharge > 200 ) + else if (pushRt > 0 && self->client->ps.forceJumpCharge > 200) { return FJ_RIGHT; } - else if ( pushRt < 0 && self->client->ps.forceJumpCharge > 200 ) + else if (pushRt < 0 && self->client->ps.forceJumpCharge > 200) { return FJ_LEFT; } @@ -12350,76 +12946,76 @@ int WP_GetVelocityForForceJump( gentity_t *self, vec3_t jumpVel, usercmd_t *ucmd } } -void ForceJump( gentity_t *self, usercmd_t *ucmd ) +void ForceJump(gentity_t *self, usercmd_t *ucmd) { - if ( self->client->ps.forcePowerDuration[FP_LEVITATION] > level.time ) + if (self->client->ps.forcePowerDuration[FP_LEVITATION] > level.time) { return; } - if ( !WP_ForcePowerUsable( self, FP_LEVITATION, 0 ) ) + if (!WP_ForcePowerUsable(self, FP_LEVITATION, 0)) { return; } - if ( self->s.groundEntityNum == ENTITYNUM_NONE ) + if (self->s.groundEntityNum == ENTITYNUM_NONE) { return; } - if ( self->client->ps.pm_flags&PMF_JUMP_HELD ) + if (self->client->ps.pm_flags&PMF_JUMP_HELD) { return; } - if ( self->health <= 0 ) + if (self->health <= 0) { return; } - if ( !self->s.number && (cg.zoomMode || in_camera) ) + if (!self->s.number && (cg.zoomMode || in_camera)) {//can't force jump when zoomed in or in cinematic return; } - if ( self->client->ps.saberLockTime > level.time ) + if (self->client->ps.saberLockTime > level.time) {//FIXME: can this be a way to break out? return; } - if ( self->client->NPC_class == CLASS_BOBAFETT - || self->client->NPC_class == CLASS_ROCKETTROOPER ) + if (self->client->NPC_class == CLASS_BOBAFETT + || self->client->NPC_class == CLASS_ROCKETTROOPER) { - if ( self->client->ps.forceJumpCharge > 300 ) + if (self->client->ps.forceJumpCharge > 300) { JET_FlyStart(NPC); } else { - G_AddEvent( self, EV_JUMP, 0 ); + G_AddEvent(self, EV_JUMP, 0); } } else { - G_SoundOnEnt( self, CHAN_BODY, "sound/weapons/force/jump.wav" ); + G_SoundOnEnt(self, CHAN_BODY, "sound/weapons/force/jump.wav"); } - float forceJumpChargeInterval = forceJumpStrength[self->client->ps.forcePowerLevel[FP_LEVITATION]]/(FORCE_JUMP_CHARGE_TIME/FRAMETIME); + float forceJumpChargeInterval = forceJumpStrength[self->client->ps.forcePowerLevel[FP_LEVITATION]] / (FORCE_JUMP_CHARGE_TIME / FRAMETIME); int anim; vec3_t jumpVel; - switch( WP_GetVelocityForForceJump( self, jumpVel, ucmd ) ) + switch (WP_GetVelocityForForceJump(self, jumpVel, ucmd)) { case FJ_FORWARD: - if ( ((self->client->NPC_class == CLASS_BOBAFETT||self->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forceJumpCharge > 300 ) + if (((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forceJumpCharge > 300) || (self->client->ps.saber[0].saberFlags&SFL_NO_FLIPS) - || (self->client->ps.dualSabers && (self->client->ps.saber[1].saberFlags&SFL_NO_FLIPS) ) - || ( self->NPC && - self->NPC->rank != RANK_CREWMAN && - self->NPC->rank <= RANK_LT_JG ) ) + || (self->client->ps.dualSabers && (self->client->ps.saber[1].saberFlags&SFL_NO_FLIPS)) + || (self->NPC && + self->NPC->rank != RANK_CREWMAN && + self->NPC->rank <= RANK_LT_JG)) {//can't do acrobatics anim = BOTH_FORCEJUMP1; } else { - if ( self->client->NPC_class == CLASS_ALORA && Q_irand( 0, 3 ) ) + if (self->client->NPC_class == CLASS_ALORA && Q_irand(0, 3)) { - anim = Q_irand( BOTH_ALORA_FLIP_1, BOTH_ALORA_FLIP_3 ); + anim = Q_irand(BOTH_ALORA_FLIP_1, BOTH_ALORA_FLIP_3); } else { @@ -12428,12 +13024,12 @@ void ForceJump( gentity_t *self, usercmd_t *ucmd ) } break; case FJ_BACKWARD: - if ( ((self->client->NPC_class == CLASS_BOBAFETT||self->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forceJumpCharge > 300 ) + if (((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forceJumpCharge > 300) || (self->client->ps.saber[0].saberFlags&SFL_NO_FLIPS) - || (self->client->ps.dualSabers && (self->client->ps.saber[1].saberFlags&SFL_NO_FLIPS) ) - || ( self->NPC && - self->NPC->rank != RANK_CREWMAN && - self->NPC->rank <= RANK_LT_JG ) ) + || (self->client->ps.dualSabers && (self->client->ps.saber[1].saberFlags&SFL_NO_FLIPS)) + || (self->NPC && + self->NPC->rank != RANK_CREWMAN && + self->NPC->rank <= RANK_LT_JG)) {//can't do acrobatics anim = BOTH_FORCEJUMPBACK1; } @@ -12443,12 +13039,12 @@ void ForceJump( gentity_t *self, usercmd_t *ucmd ) } break; case FJ_RIGHT: - if ( ((self->client->NPC_class == CLASS_BOBAFETT||self->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forceJumpCharge > 300 ) + if (((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forceJumpCharge > 300) || (self->client->ps.saber[0].saberFlags&SFL_NO_FLIPS) - || (self->client->ps.dualSabers && (self->client->ps.saber[1].saberFlags&SFL_NO_FLIPS) ) - || ( self->NPC && - self->NPC->rank != RANK_CREWMAN && - self->NPC->rank <= RANK_LT_JG ) ) + || (self->client->ps.dualSabers && (self->client->ps.saber[1].saberFlags&SFL_NO_FLIPS)) + || (self->NPC && + self->NPC->rank != RANK_CREWMAN && + self->NPC->rank <= RANK_LT_JG)) {//can't do acrobatics anim = BOTH_FORCEJUMPRIGHT1; } @@ -12458,12 +13054,12 @@ void ForceJump( gentity_t *self, usercmd_t *ucmd ) } break; case FJ_LEFT: - if ( ((self->client->NPC_class == CLASS_BOBAFETT||self->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forceJumpCharge > 300 ) + if (((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forceJumpCharge > 300) || (self->client->ps.saber[0].saberFlags&SFL_NO_FLIPS) - || (self->client->ps.dualSabers && (self->client->ps.saber[1].saberFlags&SFL_NO_FLIPS) ) - || ( self->NPC && - self->NPC->rank != RANK_CREWMAN && - self->NPC->rank <= RANK_LT_JG ) ) + || (self->client->ps.dualSabers && (self->client->ps.saber[1].saberFlags&SFL_NO_FLIPS)) + || (self->NPC && + self->NPC->rank != RANK_CREWMAN && + self->NPC->rank <= RANK_LT_JG)) {//can't do acrobatics anim = BOTH_FORCEJUMPLEFT1; } @@ -12479,20 +13075,20 @@ void ForceJump( gentity_t *self, usercmd_t *ucmd ) } int parts = SETANIM_BOTH; - if ( self->client->ps.weaponTime ) + if (self->client->ps.weaponTime) {//FIXME: really only care if we're in a saber attack anim.. maybe trail length? parts = SETANIM_LEGS; } - NPC_SetAnim( self, parts, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, parts, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); //FIXME: sound effect self->client->ps.forceJumpZStart = self->currentOrigin[2];//remember this for when we land - VectorCopy( jumpVel, self->client->ps.velocity ); + VectorCopy(jumpVel, self->client->ps.velocity); //wasn't allowing them to attack when jumping, but that was annoying //self->client->ps.weaponTime = self->client->ps.torsoAnimTimer; - WP_ForcePowerStart( self, FP_LEVITATION, self->client->ps.forceJumpCharge/forceJumpChargeInterval/(FORCE_JUMP_CHARGE_TIME/FRAMETIME)*forcePowerNeeded[FP_LEVITATION] ); + WP_ForcePowerStart(self, FP_LEVITATION, self->client->ps.forceJumpCharge / forceJumpChargeInterval / (FORCE_JUMP_CHARGE_TIME / FRAMETIME)*forcePowerNeeded[FP_LEVITATION]); //self->client->ps.forcePowerDuration[FP_LEVITATION] = level.time + self->client->ps.weaponTime; self->client->ps.forceJumpCharge = 0; } @@ -12531,7 +13127,7 @@ int WP_AbsorbConversion(gentity_t *attacked, int atdAbsLevel, gentity_t *attacke } //let the attacker absorb an amount of force used in this attack based on his level of absorb - addTot = (atForceSpent/3)*attacked->client->ps.forcePowerLevel[FP_ABSORB]; + addTot = (atForceSpent / 3)*attacked->client->ps.forcePowerLevel[FP_ABSORB]; if (addTot < 1 && atForceSpent >= 1) { @@ -12543,21 +13139,33 @@ int WP_AbsorbConversion(gentity_t *attacked, int atdAbsLevel, gentity_t *attacke attacked->client->ps.forcePower = attacked->client->ps.forcePowerMax; } - G_SoundOnEnt( attacked, CHAN_ITEM, "sound/weapons/force/absorbhit.wav" ); + G_SoundOnEnt(attacked, CHAN_ITEM, "sound/weapons/force/absorbhit.wav"); return getLevel; } -void WP_ForcePowerRegenerate( gentity_t *self, int overrideAmt ) +void WP_ForcePowerRegenerate(gentity_t *self, int overrideAmt) { - if ( !self->client ) + if (g_saberNewCombat->integer) //you must be regening FP to regen block points + { + if (hitOwnerBreakCounter) + { + if (level.time >= hitOwnerRecoveryTime) + { + hitOwnerBreakCounter -= 1; + hitOwnerRecoveryTime = level.time + hitOwnerRecoveryInterval; + } + } + } + + if (!self->client) { return; } - if ( self->client->ps.forcePower < self->client->ps.forcePowerMax ) + if (self->client->ps.forcePower < self->client->ps.forcePowerMax) { - if ( overrideAmt ) + if (overrideAmt) { self->client->ps.forcePower += overrideAmt; } @@ -12565,37 +13173,37 @@ void WP_ForcePowerRegenerate( gentity_t *self, int overrideAmt ) { self->client->ps.forcePower++; } - if ( self->client->ps.forcePower > self->client->ps.forcePowerMax ) + if (self->client->ps.forcePower > self->client->ps.forcePowerMax) { self->client->ps.forcePower = self->client->ps.forcePowerMax; } } } -void WP_ForcePowerDrain( gentity_t *self, forcePowers_t forcePower, int overrideAmt ) +void WP_ForcePowerDrain(gentity_t *self, forcePowers_t forcePower, int overrideAmt) { - if ( self->NPC ) + if (self->NPC) {//For now, NPCs have infinite force power return; } //take away the power int drain = overrideAmt; - if ( !drain ) + if (!drain) { drain = forcePowerNeeded[forcePower]; } - if ( !drain ) + if (!drain) { return; } self->client->ps.forcePower -= drain; - if ( self->client->ps.forcePower < 0 ) + if (self->client->ps.forcePower < 0) { self->client->ps.forcePower = 0; } } -void WP_ForcePowerStart( gentity_t *self, forcePowers_t forcePower, int overrideAmt ) +void WP_ForcePowerStart(gentity_t *self, forcePowers_t forcePower, int overrideAmt) { int duration = 0; @@ -12604,22 +13212,22 @@ void WP_ForcePowerStart( gentity_t *self, forcePowers_t forcePower, int override //and it in //set up duration time - switch( (int)forcePower ) + switch ((int)forcePower) { case FP_HEAL: - self->client->ps.forcePowersActive |= ( 1 << forcePower ); + self->client->ps.forcePowersActive |= (1 << forcePower); self->client->ps.forceHealCount = 0; - WP_StartForceHealEffects( self ); + WP_StartForceHealEffects(self); break; case FP_LEVITATION: - self->client->ps.forcePowersActive |= ( 1 << forcePower ); + self->client->ps.forcePowersActive |= (1 << forcePower); break; case FP_SPEED: //duration is always 5 seconds, player time duration = ceil(FORCE_SPEED_DURATION*forceSpeedValue[self->client->ps.forcePowerLevel[FP_SPEED]]);//FIXME: because the timescale scales down (not instant), this doesn't end up being exactly right... - self->client->ps.forcePowersActive |= ( 1 << forcePower ); - self->s.loopSound = G_SoundIndex( "sound/weapons/force/speedloop.wav" ); - if ( self->client->ps.forcePowerLevel[FP_SPEED] > FORCE_LEVEL_2 ) + self->client->ps.forcePowersActive |= (1 << forcePower); + self->s.loopSound = G_SoundIndex("sound/weapons/force/speedloop.wav"); + if (self->client->ps.forcePowerLevel[FP_SPEED] > FORCE_LEVEL_2) {//HACK: just using this as a timestamp for when the power started, setting debounce to current time shouldn't adversely affect anything else self->client->ps.forcePowerDebounce[FP_SPEED] = level.time; } @@ -12627,36 +13235,36 @@ void WP_ForcePowerStart( gentity_t *self, forcePowers_t forcePower, int override case FP_PUSH: break; case FP_PULL: - self->client->ps.forcePowersActive |= ( 1 << forcePower ); + self->client->ps.forcePowersActive |= (1 << forcePower); break; case FP_TELEPATHY: break; case FP_GRIP: duration = 1000; - self->client->ps.forcePowersActive |= ( 1 << forcePower ); + self->client->ps.forcePowersActive |= (1 << forcePower); //HACK: just using this as a timestamp for when the power started, setting debounce to current time shouldn't adversely affect anything else //self->client->ps.forcePowerDebounce[forcePower] = level.time; break; case FP_LIGHTNING: duration = overrideAmt; overrideAmt = 0; - self->client->ps.forcePowersActive |= ( 1 << forcePower ); + self->client->ps.forcePowersActive |= (1 << forcePower); break; - //new Jedi Academy force powers + //new Jedi Academy force powers case FP_RAGE: //duration is always 5 seconds, player time - duration = ceil(FORCE_RAGE_DURATION*forceSpeedValue[self->client->ps.forcePowerLevel[FP_RAGE]-1]);//FIXME: because the timescale scales down (not instant), this doesn't end up being exactly right... - self->client->ps.forcePowersActive |= ( 1 << forcePower ); - G_SoundOnEnt( self, CHAN_ITEM, "sound/weapons/force/rage.mp3" ); - self->s.loopSound = G_SoundIndex( "sound/weapons/force/rageloop.wav" ); - if ( self->chestBolt != -1 ) + duration = ceil(FORCE_RAGE_DURATION*forceSpeedValue[self->client->ps.forcePowerLevel[FP_RAGE] - 1]);//FIXME: because the timescale scales down (not instant), this doesn't end up being exactly right... + self->client->ps.forcePowersActive |= (1 << forcePower); + G_SoundOnEnt(self, CHAN_ITEM, "sound/weapons/force/rage.mp3"); + self->s.loopSound = G_SoundIndex("sound/weapons/force/rageloop.wav"); + if (self->chestBolt != -1) { - G_PlayEffect( G_EffectIndex( "force/rage2" ), self->playerModel, self->chestBolt, self->s.number, self->currentOrigin, duration, qtrue ); + G_PlayEffect(G_EffectIndex("force/rage2"), self->playerModel, self->chestBolt, self->s.number, self->currentOrigin, duration, qtrue); } break; case FP_DRAIN: - if ( self->client->ps.forcePowerLevel[forcePower] > FORCE_LEVEL_1 - && self->client->ps.forceDrainEntityNum >= ENTITYNUM_WORLD ) + if (self->client->ps.forcePowerLevel[forcePower] > FORCE_LEVEL_1 + && self->client->ps.forceDrainEntityNum >= ENTITYNUM_WORLD) { duration = overrideAmt; overrideAmt = 0; @@ -12667,10 +13275,10 @@ void WP_ForcePowerStart( gentity_t *self, forcePowers_t forcePower, int override { duration = 1000; } - self->client->ps.forcePowersActive |= ( 1 << forcePower ); + self->client->ps.forcePowersActive |= (1 << forcePower); break; case FP_PROTECT: - switch ( self->client->ps.forcePowerLevel[FP_PROTECT] ) + switch (self->client->ps.forcePowerLevel[FP_PROTECT]) { case FORCE_LEVEL_3: duration = 20000; @@ -12684,22 +13292,22 @@ void WP_ForcePowerStart( gentity_t *self, forcePowers_t forcePower, int override duration = 10000; break; } - self->client->ps.forcePowersActive |= ( 1 << forcePower ); - G_SoundOnEnt( self, CHAN_ITEM, "sound/weapons/force/protect.mp3" ); - self->s.loopSound = G_SoundIndex( "sound/weapons/force/protectloop.wav" ); + self->client->ps.forcePowersActive |= (1 << forcePower); + G_SoundOnEnt(self, CHAN_ITEM, "sound/weapons/force/protect.mp3"); + self->s.loopSound = G_SoundIndex("sound/weapons/force/protectloop.wav"); break; case FP_ABSORB: duration = 20000; - self->client->ps.forcePowersActive |= ( 1 << forcePower ); - G_SoundOnEnt( self, CHAN_ITEM, "sound/weapons/force/absorb.mp3" ); - self->s.loopSound = G_SoundIndex( "sound/weapons/force/absorbloop.wav" ); + self->client->ps.forcePowersActive |= (1 << forcePower); + G_SoundOnEnt(self, CHAN_ITEM, "sound/weapons/force/absorb.mp3"); + self->s.loopSound = G_SoundIndex("sound/weapons/force/absorbloop.wav"); break; case FP_SEE: - if ( self->client->ps.forcePowerLevel[FP_SEE] == FORCE_LEVEL_1 ) + if (self->client->ps.forcePowerLevel[FP_SEE] == FORCE_LEVEL_1) { duration = 5000; } - else if ( self->client->ps.forcePowerLevel[FP_SEE] == FORCE_LEVEL_2 ) + else if (self->client->ps.forcePowerLevel[FP_SEE] == FORCE_LEVEL_2) { duration = 10000; } @@ -12708,14 +13316,14 @@ void WP_ForcePowerStart( gentity_t *self, forcePowers_t forcePower, int override duration = 20000; } - self->client->ps.forcePowersActive |= ( 1 << forcePower ); - G_SoundOnEnt( self, CHAN_ITEM, "sound/weapons/force/see.mp3" ); - self->s.loopSound = G_SoundIndex( "sound/weapons/force/seeloop.wav" ); + self->client->ps.forcePowersActive |= (1 << forcePower); + G_SoundOnEnt(self, CHAN_ITEM, "sound/weapons/force/see.mp3"); + self->s.loopSound = G_SoundIndex("sound/weapons/force/seeloop.wav"); break; default: break; } - if ( duration ) + if (duration) { self->client->ps.forcePowerDuration[forcePower] = level.time + duration; } @@ -12723,27 +13331,27 @@ void WP_ForcePowerStart( gentity_t *self, forcePowers_t forcePower, int override { self->client->ps.forcePowerDuration[forcePower] = 0; } - - WP_ForcePowerDrain( self, forcePower, overrideAmt ); - if ( !self->s.number ) + WP_ForcePowerDrain(self, forcePower, overrideAmt); + + if (!self->s.number) { self->client->sess.missionStats.forceUsed[(int)forcePower]++; } } -qboolean WP_ForcePowerAvailable( gentity_t *self, forcePowers_t forcePower, int overrideAmt ) +qboolean WP_ForcePowerAvailable(gentity_t *self, forcePowers_t forcePower, int overrideAmt) { - if ( forcePower == FP_LEVITATION ) + if (forcePower == FP_LEVITATION) { return qtrue; } - int drain = overrideAmt?overrideAmt:forcePowerNeeded[forcePower]; - if ( !drain ) + int drain = overrideAmt ? overrideAmt : forcePowerNeeded[forcePower]; + if (!drain) { return qtrue; } - if ( self->client->ps.forcePower < drain ) + if (self->client->ps.forcePower < drain) { //G_AddEvent( self, EV_NOAMMO, 0 ); return qfalse; @@ -12751,105 +13359,105 @@ qboolean WP_ForcePowerAvailable( gentity_t *self, forcePowers_t forcePower, int return qtrue; } -extern void CG_PlayerLockedWeaponSpeech( int jumping ); -extern qboolean Rosh_TwinNearBy( gentity_t *self ); -qboolean WP_ForcePowerUsable( gentity_t *self, forcePowers_t forcePower, int overrideAmt ) +extern void CG_PlayerLockedWeaponSpeech(int jumping); +extern qboolean Rosh_TwinNearBy(gentity_t *self); +qboolean WP_ForcePowerUsable(gentity_t *self, forcePowers_t forcePower, int overrideAmt) { - if ( !(self->client->ps.forcePowersKnown & ( 1 << forcePower )) ) + if (!(self->client->ps.forcePowersKnown & (1 << forcePower))) {//don't know this power return qfalse; } - else if ( self->NPC && (self->NPC->aiFlags&NPCAI_ROSH) ) + else if (self->NPC && (self->NPC->aiFlags&NPCAI_ROSH)) { - if ( ((1<client->ps.forcePowerLevel[forcePower] <= 0 ) + + if (self->client->ps.forcePowerLevel[forcePower] <= 0) {//can't use this power return qfalse; } - if( (self->flags&FL_LOCK_PLAYER_WEAPONS) ) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one + if ((self->flags&FL_LOCK_PLAYER_WEAPONS)) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one { - if ( self->s.number < MAX_CLIENTS ) + if (self->s.number < MAX_CLIENTS) { - CG_PlayerLockedWeaponSpeech( qfalse ); + CG_PlayerLockedWeaponSpeech(qfalse); } return qfalse; } - if ( in_camera && self->s.number < MAX_CLIENTS ) + if (in_camera && self->s.number < MAX_CLIENTS) {//player can't turn on force powers duing cinematics return qfalse; } - if ( PM_LockedAnim( self->client->ps.torsoAnim ) && self->client->ps.torsoAnimTimer ) + if (PM_LockedAnim(self->client->ps.torsoAnim) && self->client->ps.torsoAnimTimer) {//no force powers during these special anims return qfalse; } - if ( PM_SuperBreakLoseAnim( self->client->ps.torsoAnim ) - || PM_SuperBreakWinAnim( self->client->ps.torsoAnim ) ) + if (PM_SuperBreakLoseAnim(self->client->ps.torsoAnim) + || PM_SuperBreakWinAnim(self->client->ps.torsoAnim)) { return qfalse; } - if ( (self->client->ps.forcePowersActive & ( 1 << forcePower )) ) + if ((self->client->ps.forcePowersActive & (1 << forcePower))) {//already using this power return qfalse; } /* if ( !self->client->ps.forcePowerLevel[(int)(forcePower)] ) { - return qfalse; + return qfalse; } */ - if ( self->client->NPC_class == CLASS_ATST ) + if (self->client->NPC_class == CLASS_ATST) {//Doh! No force powers in an AT-ST! return qfalse; } Vehicle_t *pVeh = NULL; - if ( (pVeh = G_IsRidingVehicle( self )) != NULL ) + if ((pVeh = G_IsRidingVehicle(self)) != NULL) {//Doh! No force powers when flying a vehicle! - if ( pVeh->m_pVehicleInfo->numHands > 1 ) + if (pVeh->m_pVehicleInfo->numHands > 1) {//if in a two-handed vehicle return qfalse; } } - if ( self->client->ps.viewEntity > 0 && self->client->ps.viewEntity < ENTITYNUM_WORLD ) + if (self->client->ps.viewEntity > 0 && self->client->ps.viewEntity < ENTITYNUM_WORLD) {//Doh! No force powers when controlling an NPC return qfalse; } - if ( self->client->ps.eFlags & EF_LOCKED_TO_WEAPON ) + if (self->client->ps.eFlags & EF_LOCKED_TO_WEAPON) {//Doh! No force powers when in an emplaced gun! return qfalse; } - - if ( (self->client->ps.saber[0].saberFlags&SFL_SINGLE_BLADE_THROWABLE)//SaberStaff() //using staff + + if ((self->client->ps.saber[0].saberFlags&SFL_SINGLE_BLADE_THROWABLE)//SaberStaff() //using staff && !self->client->ps.dualSabers //only 1, in right hand - && !self->client->ps.saber[0].blade[1].active )//only first blade is on + && !self->client->ps.saber[0].blade[1].active)//only first blade is on {//allow power //FIXME: externalize this condition seperately? } else { - if ( forcePower == FP_SABERTHROW && (self->client->ps.saber[0].saberFlags&SFL_NOT_THROWABLE) ) + if (forcePower == FP_SABERTHROW && (self->client->ps.saber[0].saberFlags&SFL_NOT_THROWABLE)) {//cannot throw this kind of saber return qfalse; } - if ( self->client->ps.saber[0].Active() ) + if (self->client->ps.saber[0].Active()) { - if ( (self->client->ps.saber[0].saberFlags&SFL_TWO_HANDED) ) + if ((self->client->ps.saber[0].saberFlags&SFL_TWO_HANDED)) { - if ( g_saberRestrictForce->integer ) + if (g_saberRestrictForce->integer) { - switch ( forcePower ) + switch (forcePower) { case FP_PUSH: case FP_PULL: @@ -12863,20 +13471,20 @@ qboolean WP_ForcePowerUsable( gentity_t *self, forcePowers_t forcePower, int ove } } } - if ( (self->client->ps.saber[0].saberFlags&SFL_TWO_HANDED) - || (self->client->ps.dualSabers && self->client->ps.saber[1].Active()) ) + if ((self->client->ps.saber[0].saberFlags&SFL_TWO_HANDED) + || (self->client->ps.dualSabers && self->client->ps.saber[1].Active())) {//this saber requires the use of two hands OR our other hand is using an active saber too - if ( (self->client->ps.saber[0].forceRestrictions&(1<client->ps.saber[0].forceRestrictions&(1 << forcePower))) {//this power is verboten when using this saber return qfalse; } } } - if ( self->client->ps.dualSabers && self->client->ps.saber[1].Active() ) + if (self->client->ps.dualSabers && self->client->ps.saber[1].Active()) { - if ( g_saberRestrictForce->integer ) + if (g_saberRestrictForce->integer) { - switch ( forcePower ) + switch (forcePower) { case FP_PUSH: case FP_PULL: @@ -12889,50 +13497,50 @@ qboolean WP_ForcePowerUsable( gentity_t *self, forcePowers_t forcePower, int ove break; } } - if ( (self->client->ps.saber[1].forceRestrictions&(1<client->ps.saber[1].forceRestrictions&(1 << forcePower))) {//this power is verboten when using this saber return qfalse; } } } - return WP_ForcePowerAvailable( self, forcePower, overrideAmt ); + return WP_ForcePowerAvailable(self, forcePower, overrideAmt); } -void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ) +void WP_ForcePowerStop(gentity_t *self, forcePowers_t forcePower) { gentity_t *gripEnt; gentity_t *drainEnt; - if ( !(self->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << forcePower))) {//umm, wasn't doing it, so... return; } - self->client->ps.forcePowersActive &= ~( 1 << forcePower ); + self->client->ps.forcePowersActive &= ~(1 << forcePower); - switch( (int)forcePower ) + switch ((int)forcePower) { case FP_HEAL: //if ( self->client->ps.forcePowerLevel[FP_HEAL] < FORCE_LEVEL_3 ) - {//wasn't an instant heal and heal is now done - if ( self->client->ps.forcePowerLevel[FP_HEAL] < FORCE_LEVEL_2 ) - {//if in meditation pose, must come out of it - //FIXME: BOTH_FORCEHEAL_STOP - if ( self->client->ps.legsAnim == BOTH_FORCEHEAL_START ) - { - NPC_SetAnim( self, SETANIM_LEGS, BOTH_FORCEHEAL_STOP, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - } - if ( self->client->ps.torsoAnim == BOTH_FORCEHEAL_START ) - { - NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCEHEAL_STOP, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - } - self->client->ps.saberMove = self->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in - self->client->ps.saberBlocked = BLOCKED_NONE; - } - } - WP_StopForceHealEffects( self ); - if (self->health >= self->client->ps.stats[STAT_MAX_HEALTH]/3) + {//wasn't an instant heal and heal is now done + if (self->client->ps.forcePowerLevel[FP_HEAL] < FORCE_LEVEL_2) + {//if in meditation pose, must come out of it + //FIXME: BOTH_FORCEHEAL_STOP + if (self->client->ps.legsAnim == BOTH_FORCEHEAL_START) + { + NPC_SetAnim(self, SETANIM_LEGS, BOTH_FORCEHEAL_STOP, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + } + if (self->client->ps.torsoAnim == BOTH_FORCEHEAL_START) + { + NPC_SetAnim(self, SETANIM_TORSO, BOTH_FORCEHEAL_STOP, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + } + self->client->ps.saberMove = self->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in + self->client->ps.saberBlocked = BLOCKED_NONE; + } + } + WP_StopForceHealEffects(self); + if (self->health >= self->client->ps.stats[STAT_MAX_HEALTH] / 3) { gi.G2API_ClearSkinGore(self->ghoul2); } @@ -12941,11 +13549,11 @@ void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ) self->client->ps.forcePowerDebounce[FP_LEVITATION] = 0; break; case FP_SPEED: - if ( !self->s.number ) + if (!self->s.number) {//player using force speed - if ( g_timescale->value != 1.0 ) + if (g_timescale->value != 1.0) { - if ( !(self->client->ps.forcePowersActive&(1<client->ps.forcePowerLevel[FP_RAGE] < FORCE_LEVEL_2 ) + if (!(self->client->ps.forcePowersActive&(1 << FP_RAGE)) || self->client->ps.forcePowerLevel[FP_RAGE] < FORCE_LEVEL_2) {//not slowed down because of force rage gi.cvar_set("timescale", "1"); } @@ -12962,72 +13570,72 @@ void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ) case FP_TELEPATHY: break; case FP_GRIP: - if ( self->NPC ) + if (self->NPC) { - TIMER_Set( self, "gripping", -level.time ); + TIMER_Set(self, "gripping", -level.time); } - if ( self->client->ps.forceGripEntityNum < ENTITYNUM_WORLD ) + if (self->client->ps.forceGripEntityNum < ENTITYNUM_WORLD) { gripEnt = &g_entities[self->client->ps.forceGripEntityNum]; - if ( gripEnt ) + if (gripEnt) { gripEnt->s.loopSound = 0; - if ( gripEnt->client ) + if (gripEnt->client) { gripEnt->client->ps.eFlags &= ~EF_FORCE_GRIPPED; - if ( self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) {//sanity-cap the velocity - float gripVel = VectorNormalize( gripEnt->client->ps.velocity ); - if ( gripVel > 500.0f ) + float gripVel = VectorNormalize(gripEnt->client->ps.velocity); + if (gripVel > 500.0f) { gripVel = 500.0f; } - VectorScale( gripEnt->client->ps.velocity, gripVel, gripEnt->client->ps.velocity ); + VectorScale(gripEnt->client->ps.velocity, gripVel, gripEnt->client->ps.velocity); } //FIXME: they probably dropped their weapon, should we make them flee? Or should AI handle no-weapon behavior? -//rww - RAGDOLL_BEGIN + //rww - RAGDOLL_BEGIN #ifndef JK2_RAGDOLL_GRIPNOHEALTH -//rww - RAGDOLL_END - if ( gripEnt->health > 0 ) -//rww - RAGDOLL_BEGIN + //rww - RAGDOLL_END + if (gripEnt->health > 0) + //rww - RAGDOLL_BEGIN #endif -//rww - RAGDOLL_END + //rww - RAGDOLL_END { int holdTime = 500; - if ( gripEnt->health > 0 ) + if (gripEnt->health > 0) { - G_AddEvent( gripEnt, EV_WATER_CLEAR, 0 ); + G_AddEvent(gripEnt, EV_WATER_CLEAR, 0); } - if ( gripEnt->client->ps.forcePowerDebounce[FP_PUSH] > level.time ) + if (gripEnt->client->ps.forcePowerDebounce[FP_PUSH] > level.time) {//they probably pushed out of it holdTime = 0; } - else if ( gripEnt->s.weapon == WP_SABER ) + else if (gripEnt->s.weapon == WP_SABER) {//jedi recover faster - holdTime = self->client->ps.forcePowerLevel[FP_GRIP]*200; + holdTime = self->client->ps.forcePowerLevel[FP_GRIP] * 200; } else { - holdTime = self->client->ps.forcePowerLevel[FP_GRIP]*500; + holdTime = self->client->ps.forcePowerLevel[FP_GRIP] * 500; } //stop the anims soon, keep them locked in place for a bit - if ( gripEnt->client->ps.torsoAnim == BOTH_CHOKE1 || gripEnt->client->ps.torsoAnim == BOTH_CHOKE3 ) + if (gripEnt->client->ps.torsoAnim == BOTH_CHOKE1 || gripEnt->client->ps.torsoAnim == BOTH_CHOKE3) {//stop choking anim on torso - if ( gripEnt->client->ps.torsoAnimTimer > holdTime ) + if (gripEnt->client->ps.torsoAnimTimer > holdTime) { gripEnt->client->ps.torsoAnimTimer = holdTime; } } - if ( gripEnt->client->ps.legsAnim == BOTH_CHOKE1 || gripEnt->client->ps.legsAnim == BOTH_CHOKE3 ) + if (gripEnt->client->ps.legsAnim == BOTH_CHOKE1 || gripEnt->client->ps.legsAnim == BOTH_CHOKE3) {//stop choking anim on legs gripEnt->client->ps.legsAnimTimer = 0; - if ( holdTime ) + if (holdTime) { //lock them in place for a bit gripEnt->client->ps.pm_time = gripEnt->client->ps.torsoAnimTimer; gripEnt->client->ps.pm_flags |= PMF_TIME_KNOCKBACK; - if ( gripEnt->s.number ) + if (gripEnt->s.number) {//NPC gripEnt->painDebounceTime = level.time + gripEnt->client->ps.torsoAnimTimer; } @@ -13037,16 +13645,16 @@ void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ) } } } - if ( gripEnt->NPC ) + if (gripEnt->NPC) { - if ( !(gripEnt->NPC->aiFlags&NPCAI_DIE_ON_IMPACT) ) + if (!(gripEnt->NPC->aiFlags&NPCAI_DIE_ON_IMPACT)) {//not falling to their death gripEnt->NPC->nextBStateThink = level.time + holdTime; } //if still alive after stopped gripping, let them wake others up - if ( gripEnt->health > 0 ) + if (gripEnt->health > 0) { - G_AngerAlert( gripEnt ); + G_AngerAlert(gripEnt); } } } @@ -13054,9 +13662,9 @@ void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ) else { gripEnt->s.eFlags &= ~EF_FORCE_GRIPPED; - if ( gripEnt->s.eType == ET_MISSILE ) + if (gripEnt->s.eType == ET_MISSILE) {//continue normal movement - if ( gripEnt->s.weapon == WP_THERMAL ) + if (gripEnt->s.weapon == WP_THERMAL) { gripEnt->s.pos.trType = TR_INTERPOLATE; } @@ -13064,7 +13672,7 @@ void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ) { gripEnt->s.pos.trType = TR_LINEAR;//FIXME: what about gravity-effected projectiles? } - VectorCopy( gripEnt->currentOrigin, gripEnt->s.pos.trBase ); + VectorCopy(gripEnt->currentOrigin, gripEnt->s.pos.trBase); gripEnt->s.pos.trTime = level.time; } else @@ -13072,7 +13680,7 @@ void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ) gripEnt->e_ThinkFunc = thinkF_G_RunObject; gripEnt->nextthink = level.time + FRAMETIME; gripEnt->s.pos.trType = TR_GRAVITY; - VectorCopy( gripEnt->currentOrigin, gripEnt->s.pos.trBase ); + VectorCopy(gripEnt->currentOrigin, gripEnt->s.pos.trBase); gripEnt->s.pos.trTime = level.time; } } @@ -13080,27 +13688,27 @@ void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ) self->s.loopSound = 0; self->client->ps.forceGripEntityNum = ENTITYNUM_NONE; } - if ( self->client->ps.torsoAnim == BOTH_FORCEGRIP_HOLD ) + if (self->client->ps.torsoAnim == BOTH_FORCEGRIP_HOLD) { - NPC_SetAnim( self, SETANIM_BOTH, BOTH_FORCEGRIP_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_BOTH, BOTH_FORCEGRIP_RELEASE, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } break; case FP_LIGHTNING: - if ( self->NPC ) + if (self->NPC) { - TIMER_Set( self, "holdLightning", -level.time ); + TIMER_Set(self, "holdLightning", -level.time); } - if ( self->client->ps.torsoAnim == BOTH_FORCELIGHTNING_HOLD - || self->client->ps.torsoAnim == BOTH_FORCELIGHTNING_START ) + if (self->client->ps.torsoAnim == BOTH_FORCELIGHTNING_HOLD + || self->client->ps.torsoAnim == BOTH_FORCELIGHTNING_START) { - NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCELIGHTNING_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_TORSO, BOTH_FORCELIGHTNING_RELEASE, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } - else if ( self->client->ps.torsoAnim == BOTH_FORCE_2HANDEDLIGHTNING_HOLD - || self->client->ps.torsoAnim == BOTH_FORCE_2HANDEDLIGHTNING_START ) + else if (self->client->ps.torsoAnim == BOTH_FORCE_2HANDEDLIGHTNING_HOLD + || self->client->ps.torsoAnim == BOTH_FORCE_2HANDEDLIGHTNING_START) { - NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCE_2HANDEDLIGHTNING_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_TORSO, BOTH_FORCE_2HANDEDLIGHTNING_RELEASE, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } - if ( self->client->ps.forcePowerLevel[FP_LIGHTNING] < FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_LIGHTNING] < FORCE_LEVEL_2) {//don't do it again for 3 seconds, minimum... FIXME: this should be automatic once regeneration is slower (normal) self->client->ps.forcePowerDebounce[FP_LIGHTNING] = level.time + 3000;//FIXME: define? } @@ -13112,15 +13720,15 @@ void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ) break; case FP_RAGE: self->client->ps.forceRageRecoveryTime = level.time + 10000;//recover for 10 seconds - if ( self->client->ps.forcePowerDuration[FP_RAGE] > level.time ) + if (self->client->ps.forcePowerDuration[FP_RAGE] > level.time) {//still had time left, we cut it short self->client->ps.forceRageRecoveryTime -= (self->client->ps.forcePowerDuration[FP_RAGE] - level.time);//minus however much time you had left when you cut it short } - if ( !self->s.number ) + if (!self->s.number) {//player using force speed - if ( g_timescale->value != 1.0 ) + if (g_timescale->value != 1.0) { - if ( !(self->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_SPEED))) {//not slowed down because of force speed gi.cvar_set("timescale", "1"); } @@ -13129,21 +13737,21 @@ void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ) //FIXME: reset my current anim, keeping current frame, but with proper anim speed // otherwise, the anim will continue playing at high speed self->s.loopSound = 0; - if ( self->NPC ) + if (self->NPC) { - Jedi_RageStop( self ); + Jedi_RageStop(self); } - if ( self->chestBolt != -1 ) + if (self->chestBolt != -1) { - G_StopEffect("force/rage2", self->playerModel, self->chestBolt, self->s.number ); + G_StopEffect("force/rage2", self->playerModel, self->chestBolt, self->s.number); } break; case FP_DRAIN: - if ( self->NPC ) + if (self->NPC) { - TIMER_Set( self, "draining", -level.time ); + TIMER_Set(self, "draining", -level.time); } - if ( self->client->ps.forcePowerLevel[FP_DRAIN] < FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_DRAIN] < FORCE_LEVEL_2) {//don't do it again for 3 seconds, minimum... FIXME: this should be automatic once regeneration is slower (normal) self->client->ps.forcePowerDebounce[FP_DRAIN] = level.time + 3000;//FIXME: define? } @@ -13153,57 +13761,57 @@ void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ) self->s.loopSound = 0; } //drop them - if ( self->client->ps.forceDrainEntityNum < ENTITYNUM_WORLD ) + if (self->client->ps.forceDrainEntityNum < ENTITYNUM_WORLD) { drainEnt = &g_entities[self->client->ps.forceDrainEntityNum]; - if ( drainEnt ) + if (drainEnt) { - if ( drainEnt->client ) + if (drainEnt->client) { drainEnt->client->ps.eFlags &= ~EF_FORCE_DRAINED; //VectorClear( drainEnt->client->ps.velocity ); - if ( drainEnt->health > 0 ) + if (drainEnt->health > 0) { - if ( drainEnt->client->ps.forcePowerDebounce[FP_PUSH] > level.time ) + if (drainEnt->client->ps.forcePowerDebounce[FP_PUSH] > level.time) {//they probably pushed out of it } else { //NPC_SetAnim( drainEnt, SETANIM_BOTH, BOTH_HUGGEESTOP1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - if ( drainEnt->client->ps.torsoAnim != BOTH_FORCEPUSH ) + if (drainEnt->client->ps.torsoAnim != BOTH_FORCEPUSH) {//don't stop the push drainEnt->client->ps.torsoAnimTimer = 0; } drainEnt->client->ps.legsAnimTimer = 0; } - if ( drainEnt->NPC ) + if (drainEnt->NPC) {//if still alive after stopped draining, let them wake others up - G_AngerAlert( drainEnt ); + G_AngerAlert(drainEnt); } } else {//leave the effect playing on them for a few seconds //drainEnt->client->ps.eFlags |= EF_FORCE_DRAINED; - drainEnt->s.powerups |= ( 1 << PW_DRAINED ); - drainEnt->client->ps.powerups[PW_DRAINED] = level.time + Q_irand( 1000, 4000 ); + drainEnt->s.powerups |= (1 << PW_DRAINED); + drainEnt->client->ps.powerups[PW_DRAINED] = level.time + Q_irand(1000, 4000); } } } self->client->ps.forceDrainEntityNum = ENTITYNUM_NONE; } - if ( self->client->ps.torsoAnim == BOTH_HUGGER1 ) + if (self->client->ps.torsoAnim == BOTH_HUGGER1) {//old anim - NPC_SetAnim( self, SETANIM_BOTH, BOTH_HUGGERSTOP1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_BOTH, BOTH_HUGGERSTOP1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } - else if ( self->client->ps.torsoAnim == BOTH_FORCE_DRAIN_GRAB_START - || self->client->ps.torsoAnim == BOTH_FORCE_DRAIN_GRAB_HOLD ) + else if (self->client->ps.torsoAnim == BOTH_FORCE_DRAIN_GRAB_START + || self->client->ps.torsoAnim == BOTH_FORCE_DRAIN_GRAB_HOLD) {//new anim - NPC_SetAnim( self, SETANIM_BOTH, BOTH_FORCE_DRAIN_GRAB_END, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_BOTH, BOTH_FORCE_DRAIN_GRAB_END, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } - else if ( self->client->ps.torsoAnim == BOTH_FORCE_DRAIN_HOLD - || self->client->ps.torsoAnim == BOTH_FORCE_DRAIN_START ) + else if (self->client->ps.torsoAnim == BOTH_FORCE_DRAIN_HOLD + || self->client->ps.torsoAnim == BOTH_FORCE_DRAIN_START) { - NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCE_DRAIN_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_TORSO, BOTH_FORCE_DRAIN_RELEASE, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } break; case FP_PROTECT: @@ -13211,20 +13819,20 @@ void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ) break; case FP_ABSORB: self->s.loopSound = 0; - if ( self->client->ps.legsAnim == BOTH_FORCE_ABSORB_START ) + if (self->client->ps.legsAnim == BOTH_FORCE_ABSORB_START) { - NPC_SetAnim( self, SETANIM_LEGS, BOTH_FORCE_ABSORB_END, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_LEGS, BOTH_FORCE_ABSORB_END, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } - if ( self->client->ps.torsoAnim == BOTH_FORCE_ABSORB_START ) + if (self->client->ps.torsoAnim == BOTH_FORCE_ABSORB_START) { - NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCE_ABSORB_END, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_TORSO, BOTH_FORCE_ABSORB_END, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } - if ( self->client->ps.forcePowerLevel[FP_ABSORB] < FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_ABSORB] < FORCE_LEVEL_2) {//was stuck, free us in case we interrupted it or something self->client->ps.weaponTime = 0; self->client->ps.pm_flags &= ~PMF_TIME_KNOCKBACK; self->client->ps.pm_time = 0; - if ( self->s.number ) + if (self->s.number) {//NPC self->painDebounceTime = 0; } @@ -13242,45 +13850,45 @@ void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ) } } -void WP_ForceForceThrow( gentity_t *thrower ) +void WP_ForceForceThrow(gentity_t *thrower) { - if ( !thrower || !thrower->client ) + if (!thrower || !thrower->client) { return; } qboolean removePush = qfalse; qboolean relock = qfalse; - if ( !(thrower->client->ps.forcePowersKnown&(1<client->ps.forcePowersKnown&(1 << FP_PUSH))) {//give them push just for this specific purpose - thrower->client->ps.forcePowersKnown |= (1<client->ps.forcePowersKnown |= (1 << FP_PUSH); thrower->client->ps.forcePowerLevel[FP_PUSH] = FORCE_LEVEL_1; removePush = qtrue; } - if ( thrower->NPC + if (thrower->NPC && (thrower->NPC->aiFlags&NPCAI_HEAL_ROSH) - && (thrower->flags&FL_LOCK_PLAYER_WEAPONS) ) + && (thrower->flags&FL_LOCK_PLAYER_WEAPONS)) { thrower->flags &= ~FL_LOCK_PLAYER_WEAPONS; relock = qtrue; } - - ForceThrow( thrower, qfalse ); - if ( relock ) + ForceThrow(thrower, qfalse); + + if (relock) { thrower->flags |= FL_LOCK_PLAYER_WEAPONS; } - if ( thrower ) + if (thrower) {//take it back off - thrower->client->ps.forcePowersKnown &= ~(1<client->ps.forcePowersKnown &= ~(1 << FP_PUSH); thrower->client->ps.forcePowerLevel[FP_PUSH] = FORCE_LEVEL_0; } } -extern qboolean PM_ForceJumpingUp( gentity_t *gent ); -static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd_t *cmd ) +extern qboolean PM_ForceJumpingUp(gentity_t *gent); +static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_t *cmd) { float speed, newSpeed; gentity_t *gripEnt, *drainEnt; @@ -13288,131 +13896,131 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd float dist; extern usercmd_t ucmd; - switch( (int)forcePower ) + switch ((int)forcePower) { case FP_HEAL: - if ( self->client->ps.forceHealCount >= FP_MaxForceHeal(self) || self->health >= self->client->ps.stats[STAT_MAX_HEALTH] ) + if (self->client->ps.forceHealCount >= FP_MaxForceHeal(self) || self->health >= self->client->ps.stats[STAT_MAX_HEALTH]) {//fully healed or used up all 25 - if ( !Q3_TaskIDPending( self, TID_CHAN_VOICE ) ) + if (!Q3_TaskIDPending(self, TID_CHAN_VOICE)) { - int index = Q_irand( 1, 4 ); - if ( self->s.number < MAX_CLIENTS ) + int index = Q_irand(1, 4); + if (self->s.number < MAX_CLIENTS) { - G_SoundOnEnt( self, CHAN_VOICE, va( "sound/weapons/force/heal%d_%c.mp3", index, g_sex->string[0] ) ); + G_SoundOnEnt(self, CHAN_VOICE, va("sound/weapons/force/heal%d_%c.mp3", index, g_sex->string[0])); } - else if ( self->NPC ) + else if (self->NPC) { - if ( self->NPC->blockedSpeechDebounceTime <= level.time ) + if (self->NPC->blockedSpeechDebounceTime <= level.time) {//enough time has passed since our last speech - if ( Q3_TaskIDPending( self, TID_CHAN_VOICE ) ) + if (Q3_TaskIDPending(self, TID_CHAN_VOICE)) {//not playing a scripted line //say "Ahhh...." - if ( self->NPC->stats.sex == SEX_MALE - || self->NPC->stats.sex == SEX_NEUTRAL ) + if (self->NPC->stats.sex == SEX_MALE + || self->NPC->stats.sex == SEX_NEUTRAL) { - G_SoundOnEnt( self, CHAN_VOICE, va( "sound/weapons/force/heal%d_m.mp3", index ) ); + G_SoundOnEnt(self, CHAN_VOICE, va("sound/weapons/force/heal%d_m.mp3", index)); } else//all other sexes use female sounds { - G_SoundOnEnt( self, CHAN_VOICE, va( "sound/weapons/force/heal%d_f.mp3", index ) ); + G_SoundOnEnt(self, CHAN_VOICE, va("sound/weapons/force/heal%d_f.mp3", index)); } } } } } - WP_ForcePowerStop( self, forcePower ); + WP_ForcePowerStop(self, forcePower); } - else if ( self->client->ps.forcePowerLevel[FP_HEAL] < FORCE_LEVEL_3 && ( (cmd->buttons&BUTTON_ATTACK) || (cmd->buttons&BUTTON_ALT_ATTACK) || self->painDebounceTime > level.time || (self->client->ps.weaponTime&&self->client->ps.weapon!=WP_NONE) ) ) + else if (self->client->ps.forcePowerLevel[FP_HEAL] < FORCE_LEVEL_3 && ((cmd->buttons&BUTTON_ATTACK) || (cmd->buttons&BUTTON_ALT_ATTACK) || self->painDebounceTime > level.time || (self->client->ps.weaponTime&&self->client->ps.weapon != WP_NONE))) {//attacked or was hit while healing... //stop healing - WP_ForcePowerStop( self, forcePower ); + WP_ForcePowerStop(self, forcePower); } - else if ( self->client->ps.forcePowerLevel[FP_HEAL] < FORCE_LEVEL_2 && ( cmd->rightmove || cmd->forwardmove || cmd->upmove > 0 ) ) + else if (self->client->ps.forcePowerLevel[FP_HEAL] < FORCE_LEVEL_2 && (cmd->rightmove || cmd->forwardmove || cmd->upmove > 0)) {//moved while healing... FIXME: also, in WP_ForcePowerStart, stop healing if any other force power is used //stop healing - WP_ForcePowerStop( self, forcePower ); + WP_ForcePowerStop(self, forcePower); } - else if ( self->client->ps.forcePowerDebounce[FP_HEAL] < level.time ) + else if (self->client->ps.forcePowerDebounce[FP_HEAL] < level.time) {//time to heal again - if ( WP_ForcePowerAvailable( self, forcePower, 4 ) ) + if (WP_ForcePowerAvailable(self, forcePower, 4)) {//have available power - int healInterval = FP_ForceHealInterval( self ); + int healInterval = FP_ForceHealInterval(self); int healAmount = 1;//hard, normal healing rate - if ( self->s.number < MAX_CLIENTS ) + if (self->s.number < MAX_CLIENTS) { - if ( g_spskill->integer == 1 ) + if (g_spskill->integer == 1) {//medium, heal twice as fast healAmount *= 2; } - else if ( g_spskill->integer == 0 ) + else if (g_spskill->integer == 0) {//easy, heal 3 times as fast... healAmount *= 3; } } - if ( self->health + healAmount > self->client->ps.stats[STAT_MAX_HEALTH] ) + if (self->health + healAmount > self->client->ps.stats[STAT_MAX_HEALTH]) { healAmount = self->client->ps.stats[STAT_MAX_HEALTH] - self->health; } self->health += healAmount; self->client->ps.forceHealCount += healAmount; self->client->ps.forcePowerDebounce[FP_HEAL] = level.time + healInterval; - WP_ForcePowerDrain( self, forcePower, 4 ); + WP_ForcePowerDrain(self, forcePower, 4); } else {//stop - WP_ForcePowerStop( self, forcePower ); + WP_ForcePowerStop(self, forcePower); } } break; case FP_LEVITATION: - if ( self->client->ps.groundEntityNum != ENTITYNUM_NONE && !self->client->ps.forceJumpZStart ) + if (self->client->ps.groundEntityNum != ENTITYNUM_NONE && !self->client->ps.forceJumpZStart) {//done with jump - WP_ForcePowerStop( self, forcePower ); + WP_ForcePowerStop(self, forcePower); } else { - if ( PM_ForceJumpingUp( self ) ) + if (PM_ForceJumpingUp(self)) {//holding jump in air - if ( cmd->upmove > 10 ) + if (cmd->upmove > 10) {//still trying to go up - if ( WP_ForcePowerAvailable( self, FP_LEVITATION, 1 ) ) + if (WP_ForcePowerAvailable(self, FP_LEVITATION, 1)) { - if ( self->client->ps.forcePowerDebounce[FP_LEVITATION] < level.time ) + if (self->client->ps.forcePowerDebounce[FP_LEVITATION] < level.time) { - WP_ForcePowerDrain( self, FP_LEVITATION, 5 ); + WP_ForcePowerDrain(self, FP_LEVITATION, 5); self->client->ps.forcePowerDebounce[FP_LEVITATION] = level.time + 100; } - self->client->ps.forcePowersActive |= ( 1 << FP_LEVITATION ); + self->client->ps.forcePowersActive |= (1 << FP_LEVITATION); self->client->ps.forceJumpCharge = 1;//just used as a flag for the player, cleared when he lands } else {//cut the jump short - WP_ForcePowerStop( self, forcePower ); + WP_ForcePowerStop(self, forcePower); } } else {//cut the jump short - WP_ForcePowerStop( self, forcePower ); + WP_ForcePowerStop(self, forcePower); } } else { - WP_ForcePowerStop( self, forcePower ); + WP_ForcePowerStop(self, forcePower); } } break; case FP_SPEED: speed = forceSpeedValue[self->client->ps.forcePowerLevel[FP_SPEED]]; - if ( !self->s.number ) + if (!self->s.number) {//player using force speed - if ( !(self->client->ps.forcePowersActive&(1<client->ps.forcePowerLevel[FP_SPEED] >= self->client->ps.forcePowerLevel[FP_RAGE] ) + if (!(self->client->ps.forcePowersActive&(1 << FP_RAGE)) + || self->client->ps.forcePowerLevel[FP_SPEED] >= self->client->ps.forcePowerLevel[FP_RAGE]) {//either not using rage or rage is at a lower level than speed gi.cvar_set("timescale", va("%4.2f", speed)); - if ( g_timescale->value > speed ) + if (g_timescale->value > speed) { newSpeed = g_timescale->value - 0.05; - if ( newSpeed < speed ) + if (newSpeed < speed) { newSpeed = speed; } @@ -13428,171 +14036,171 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd case FP_TELEPATHY: break; case FP_GRIP: - if ( !WP_ForcePowerAvailable( self, FP_GRIP, 0 ) - || (self->client->ps.forcePowerLevel[FP_GRIP]>FORCE_LEVEL_1&&!self->s.number&&!(cmd->buttons&BUTTON_FORCEGRIP)) ) + if (!WP_ForcePowerAvailable(self, FP_GRIP, 0) + || (self->client->ps.forcePowerLevel[FP_GRIP]>FORCE_LEVEL_1&&!self->s.number&&!(cmd->buttons&BUTTON_FORCEGRIP))) { - WP_ForcePowerStop( self, FP_GRIP ); + WP_ForcePowerStop(self, FP_GRIP); return; } - else if ( self->client->ps.forceGripEntityNum >= 0 && self->client->ps.forceGripEntityNum < ENTITYNUM_WORLD ) + else if (self->client->ps.forceGripEntityNum >= 0 && self->client->ps.forceGripEntityNum < ENTITYNUM_WORLD) { gripEnt = &g_entities[self->client->ps.forceGripEntityNum]; - if ( !gripEnt || !gripEnt->inuse ) + if (!gripEnt || !gripEnt->inuse) {//invalid or freed ent - WP_ForcePowerStop( self, FP_GRIP ); + WP_ForcePowerStop(self, FP_GRIP); return; } - else -//rww - RAGDOLL_BEGIN + else + //rww - RAGDOLL_BEGIN #ifndef JK2_RAGDOLL_GRIPNOHEALTH -//rww - RAGDOLL_END - if ( gripEnt->health <= 0 && gripEnt->takedamage )//FIXME: what about things that never had health or lose takedamage when they die? + //rww - RAGDOLL_END + if (gripEnt->health <= 0 && gripEnt->takedamage)//FIXME: what about things that never had health or lose takedamage when they die? {//either invalid ent, or dead ent - WP_ForcePowerStop( self, FP_GRIP ); + WP_ForcePowerStop(self, FP_GRIP); return; } - else -//rww - RAGDOLL_BEGIN + else + //rww - RAGDOLL_BEGIN #endif -//rww - RAGDOLL_END - if ( self->client->ps.forcePowerLevel[FP_GRIP] == FORCE_LEVEL_1 + //rww - RAGDOLL_END + if (self->client->ps.forcePowerLevel[FP_GRIP] == FORCE_LEVEL_1 && gripEnt->client - && gripEnt->client->ps.groundEntityNum == ENTITYNUM_NONE - && gripEnt->client->moveType != MT_FLYSWIM ) + && gripEnt->client->ps.groundEntityNum == ENTITYNUM_NONE + && gripEnt->client->moveType != MT_FLYSWIM) { - WP_ForcePowerStop( self, FP_GRIP ); + WP_ForcePowerStop(self, FP_GRIP); return; } - else if ( gripEnt->client && gripEnt->client->moveType == MT_FLYSWIM && VectorLengthSquared( gripEnt->client->ps.velocity ) > (300*300) ) + else if (gripEnt->client && gripEnt->client->moveType == MT_FLYSWIM && VectorLengthSquared(gripEnt->client->ps.velocity) > (300 * 300)) {//flying creature broke free - WP_ForcePowerStop( self, FP_GRIP ); + WP_ForcePowerStop(self, FP_GRIP); return; } - else if ( gripEnt->client + else if (gripEnt->client && gripEnt->health>0 //dead dudes don't fly && (gripEnt->client->NPC_class == CLASS_BOBAFETT || gripEnt->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forcePowerDebounce[FP_GRIP] < level.time - && !Q_irand( 0, 3 ) + && !Q_irand(0, 3) ) {//boba fett - fly away! gripEnt->client->ps.forceJumpCharge = 0;//so we don't play the force flip anim gripEnt->client->ps.velocity[2] = 250; gripEnt->client->ps.forceJumpZStart = gripEnt->currentOrigin[2];//so we don't take damage if we land at same height gripEnt->client->ps.pm_flags |= PMF_JUMPING; - G_AddEvent( gripEnt, EV_JUMP, 0 ); - JET_FlyStart( gripEnt ); - WP_ForcePowerStop( self, FP_GRIP ); + G_AddEvent(gripEnt, EV_JUMP, 0); + JET_FlyStart(gripEnt); + WP_ForcePowerStop(self, FP_GRIP); return; } - else if ( gripEnt->NPC - && gripEnt->client - && gripEnt->client->ps.forcePowersKnown - && (gripEnt->client->NPC_class==CLASS_REBORN||gripEnt->client->ps.weapon==WP_SABER) + else if (gripEnt->NPC + && gripEnt->client + && gripEnt->client->ps.forcePowersKnown + && (gripEnt->client->NPC_class == CLASS_REBORN || gripEnt->client->ps.weapon == WP_SABER) && !Jedi_CultistDestroyer(gripEnt) - && !Q_irand( 0, 100-(gripEnt->NPC->stats.evasion*8)-(g_spskill->integer*20) ) ) + && !Q_irand(0, 100 - (gripEnt->NPC->stats.evasion * 8) - (g_spskill->integer * 20))) {//a jedi who broke free FIXME: maybe have some minimum grip length- a reaction time? - WP_ForceForceThrow( gripEnt ); + WP_ForceForceThrow(gripEnt); //FIXME: I need to go into some pushed back anim... - WP_ForcePowerStop( self, FP_GRIP ); + WP_ForcePowerStop(self, FP_GRIP); return; } - else if ( PM_SaberInAttack( self->client->ps.saberMove ) - || PM_SaberInStart( self->client->ps.saberMove ) ) + else if (PM_SaberInAttack(self->client->ps.saberMove) + || PM_SaberInStart(self->client->ps.saberMove)) {//started an attack - WP_ForcePowerStop( self, FP_GRIP ); + WP_ForcePowerStop(self, FP_GRIP); return; } else { int gripLevel = self->client->ps.forcePowerLevel[FP_GRIP]; - if ( gripEnt->client ) + if (gripEnt->client) { - gripLevel = WP_AbsorbConversion( gripEnt, gripEnt->client->ps.forcePowerLevel[FP_ABSORB], self, FP_GRIP, self->client->ps.forcePowerLevel[FP_GRIP], forcePowerNeeded[gripLevel] ); + gripLevel = WP_AbsorbConversion(gripEnt, gripEnt->client->ps.forcePowerLevel[FP_ABSORB], self, FP_GRIP, self->client->ps.forcePowerLevel[FP_GRIP], forcePowerNeeded[gripLevel]); } - if ( !gripLevel ) + if (!gripLevel) { - WP_ForcePowerStop( self, forcePower ); + WP_ForcePowerStop(self, forcePower); return; } - if ( self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) {//holding it - NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCEGRIP_HOLD, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - if ( self->client->ps.torsoAnimTimer < 100 ){//we were already playing this anim, we didn't want to restart it, but we want to hold it for at least 100ms, sooo.... - + NPC_SetAnim(self, SETANIM_TORSO, BOTH_FORCEGRIP_HOLD, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + if (self->client->ps.torsoAnimTimer < 100){//we were already playing this anim, we didn't want to restart it, but we want to hold it for at least 100ms, sooo.... + self->client->ps.torsoAnimTimer = 100; } } //get their org - VectorCopy( self->client->ps.viewangles, angles ); + VectorCopy(self->client->ps.viewangles, angles); angles[0] -= 10; - AngleVectors( angles, dir, NULL, NULL ); - if ( gripEnt->client ) + AngleVectors(angles, dir, NULL, NULL); + if (gripEnt->client) {//move - VectorCopy( gripEnt->client->renderInfo.headPoint, gripEntOrg ); + VectorCopy(gripEnt->client->renderInfo.headPoint, gripEntOrg); } else { - VectorCopy( gripEnt->currentOrigin, gripEntOrg ); + VectorCopy(gripEnt->currentOrigin, gripEntOrg); } //how far are they - dist = Distance( self->client->renderInfo.handLPoint, gripEntOrg ); - if ( self->client->ps.forcePowerLevel[FP_GRIP] == FORCE_LEVEL_2 && - (!InFront( gripEntOrg, self->client->renderInfo.handLPoint, self->client->ps.viewangles, 0.3f ) || - DistanceSquared( gripEntOrg, self->client->renderInfo.handLPoint ) > FORCE_GRIP_DIST_SQUARED)) + dist = Distance(self->client->renderInfo.handLPoint, gripEntOrg); + if (self->client->ps.forcePowerLevel[FP_GRIP] == FORCE_LEVEL_2 && + (!InFront(gripEntOrg, self->client->renderInfo.handLPoint, self->client->ps.viewangles, 0.3f) || + DistanceSquared(gripEntOrg, self->client->renderInfo.handLPoint) > FORCE_GRIP_DIST_SQUARED)) {//must face them - WP_ForcePowerStop( self, FP_GRIP ); + WP_ForcePowerStop(self, FP_GRIP); return; } //check for lift or carry - if ( self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2 - && (!gripEnt->client || (!gripEnt->message&&!(gripEnt->flags&FL_NO_KNOCKBACK))) ) + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2 + && (!gripEnt->client || (!gripEnt->message&&!(gripEnt->flags&FL_NO_KNOCKBACK)))) {//carry //cap dist - if ( dist > FORCE_GRIP_3_MAX_DIST ) + if (dist > FORCE_GRIP_3_MAX_DIST) { dist = FORCE_GRIP_3_MAX_DIST; } - else if ( dist < FORCE_GRIP_3_MIN_DIST ) + else if (dist < FORCE_GRIP_3_MIN_DIST) { dist = FORCE_GRIP_3_MIN_DIST; } - VectorMA( self->client->renderInfo.handLPoint, dist, dir, gripOrg ); + VectorMA(self->client->renderInfo.handLPoint, dist, dir, gripOrg); } - else if ( self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + else if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) {//just lift - VectorCopy( self->client->ps.forceGripOrg, gripOrg ); + VectorCopy(self->client->ps.forceGripOrg, gripOrg); } else { - VectorCopy( gripEnt->currentOrigin, gripOrg ); + VectorCopy(gripEnt->currentOrigin, gripOrg); } - if ( self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) {//if holding him, make sure there's a clear LOS between my hand and him trace_t gripTrace; - gi.trace( &gripTrace, self->client->renderInfo.handLPoint, NULL, NULL, gripEntOrg, ENTITYNUM_NONE, MASK_FORCE_PUSH, (EG2_Collision)0, 0 ); - if ( gripTrace.startsolid + gi.trace(&gripTrace, self->client->renderInfo.handLPoint, NULL, NULL, gripEntOrg, ENTITYNUM_NONE, MASK_FORCE_PUSH, (EG2_Collision)0, 0); + if (gripTrace.startsolid || gripTrace.allsolid - || gripTrace.fraction < 1.0f ) + || gripTrace.fraction < 1.0f) {//no clear trace, drop them - WP_ForcePowerStop( self, FP_GRIP ); + WP_ForcePowerStop(self, FP_GRIP); return; } } //now move them - if ( gripEnt->client ) + if (gripEnt->client) { - if ( self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) {//level 1 just holds them - VectorSubtract( gripOrg, gripEntOrg, gripEnt->client->ps.velocity ); - if ( self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2 - && (!gripEnt->client || (!gripEnt->message&&!(gripEnt->flags&FL_NO_KNOCKBACK)) ) ) + VectorSubtract(gripOrg, gripEntOrg, gripEnt->client->ps.velocity); + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2 + && (!gripEnt->client || (!gripEnt->message&&!(gripEnt->flags&FL_NO_KNOCKBACK)))) {//level 2 just lifts them - float gripDist = VectorNormalize( gripEnt->client->ps.velocity )/3.0f; - if ( gripDist < 20.0f ) + float gripDist = VectorNormalize(gripEnt->client->ps.velocity) / 3.0f; + if (gripDist < 20.0f) { if (gripDist<2.0f) { @@ -13600,32 +14208,32 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd } else { - VectorScale( gripEnt->client->ps.velocity, (gripDist*gripDist), gripEnt->client->ps.velocity ); + VectorScale(gripEnt->client->ps.velocity, (gripDist*gripDist), gripEnt->client->ps.velocity); } } else { - VectorScale( gripEnt->client->ps.velocity, (gripDist*gripDist), gripEnt->client->ps.velocity ); + VectorScale(gripEnt->client->ps.velocity, (gripDist*gripDist), gripEnt->client->ps.velocity); } } } //stop them from thinking gripEnt->client->ps.pm_time = 2000; gripEnt->client->ps.pm_flags |= PMF_TIME_KNOCKBACK; - if ( gripEnt->NPC ) + if (gripEnt->NPC) { - if ( !(gripEnt->NPC->aiFlags&NPCAI_DIE_ON_IMPACT) ) + if (!(gripEnt->NPC->aiFlags&NPCAI_DIE_ON_IMPACT)) {//not falling to their death gripEnt->NPC->nextBStateThink = level.time + 2000; } - if ( self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) {//level 1 just holds them - vectoangles( dir, angles ); - gripEnt->NPC->desiredYaw = AngleNormalize180(angles[YAW]+180); + vectoangles(dir, angles); + gripEnt->NPC->desiredYaw = AngleNormalize180(angles[YAW] + 180); gripEnt->NPC->desiredPitch = -angles[PITCH]; SaveNPCGlobals(); - SetNPCGlobals( gripEnt ); - NPC_UpdateAngles( qtrue, qtrue ); + SetNPCGlobals(gripEnt); + NPC_UpdateAngles(qtrue, qtrue); gripEnt->NPC->last_ucmd.angles[0] = ucmd.angles[0]; gripEnt->NPC->last_ucmd.angles[1] = ucmd.angles[1]; gripEnt->NPC->last_ucmd.angles[2] = ucmd.angles[2]; @@ -13633,29 +14241,29 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd //FIXME: why does he turn back to his original angles once he dies or is let go? } } - else if ( !gripEnt->s.number ) + else if (!gripEnt->s.number) { //vectoangles( dir, angles ); //gripEnt->client->ps.viewangles[0] = -angles[0]; //gripEnt->client->ps.viewangles[1] = AngleNormalize180(angles[YAW]+180); gripEnt->enemy = self; - NPC_SetLookTarget( gripEnt, self->s.number, level.time+1000 ); + NPC_SetLookTarget(gripEnt, self->s.number, level.time + 1000); } gripEnt->client->ps.eFlags |= EF_FORCE_GRIPPED; //dammit! Make sure that saber stays off! - WP_DeactivateSaber( gripEnt ); + WP_DeactivateSaber(gripEnt); } else {//move - if ( self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) {//level 1 just holds them - VectorCopy( gripEnt->currentOrigin, gripEnt->s.pos.trBase ); - VectorSubtract( gripOrg, gripEntOrg, gripEnt->s.pos.trDelta ); - if ( self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2 - && (!gripEnt->client || (!gripEnt->message&&!(gripEnt->flags&FL_NO_KNOCKBACK))) ) + VectorCopy(gripEnt->currentOrigin, gripEnt->s.pos.trBase); + VectorSubtract(gripOrg, gripEntOrg, gripEnt->s.pos.trDelta); + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2 + && (!gripEnt->client || (!gripEnt->message&&!(gripEnt->flags&FL_NO_KNOCKBACK)))) {//level 2 just lifts them - VectorScale( gripEnt->s.pos.trDelta, 10, gripEnt->s.pos.trDelta ); + VectorScale(gripEnt->s.pos.trDelta, 10, gripEnt->s.pos.trDelta); } gripEnt->s.pos.trType = TR_LINEAR; gripEnt->s.pos.trTime = level.time; @@ -13663,85 +14271,85 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd gripEnt->s.eFlags |= EF_FORCE_GRIPPED; } - + //Shouldn't this be discovered? //AddSightEvent( self, gripOrg, 128, AEL_DANGER, 20 ); - AddSightEvent( self, gripOrg, 128, AEL_DISCOVERED, 20 ); + AddSightEvent(self, gripOrg, 128, AEL_DISCOVERED, 20); - if ( self->client->ps.forcePowerDebounce[FP_GRIP] < level.time ) + if (self->client->ps.forcePowerDebounce[FP_GRIP] < level.time) { //GEntity_PainFunc( gripEnt, self, self, gripOrg, 0, MOD_CRUSH ); - if ( !gripEnt->client + if (!gripEnt->client || gripEnt->client->NPC_class != CLASS_VEHICLE || (gripEnt->m_pVehicle - && gripEnt->m_pVehicle->m_pVehicleInfo - && gripEnt->m_pVehicle->m_pVehicleInfo->type == VH_ANIMAL) ) + && gripEnt->m_pVehicle->m_pVehicleInfo + && gripEnt->m_pVehicle->m_pVehicleInfo->type == VH_ANIMAL)) {//we don't damage the empty vehicle gripEnt->painDebounceTime = 0; int gripDmg = forceGripDamage[self->client->ps.forcePowerLevel[FP_GRIP]]; - if ( gripLevel != -1 ) + if (gripLevel != -1) { - if ( gripLevel == 1 ) + if (gripLevel == 1) { - gripDmg = floor((float)gripDmg/3.0f); + gripDmg = floor((float)gripDmg / 3.0f); } else //if ( gripLevel == 2 ) { - gripDmg = floor((float)gripDmg/1.5f); + gripDmg = floor((float)gripDmg / 1.5f); } } - G_Damage( gripEnt, self, self, dir, gripOrg, gripDmg, DAMAGE_NO_ARMOR, MOD_CRUSH );//MOD_??? + G_Damage(gripEnt, self, self, dir, gripOrg, gripDmg, DAMAGE_NO_ARMOR, MOD_CRUSH);//MOD_??? } - if ( gripEnt->s.number ) + if (gripEnt->s.number) { - if ( self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2) {//do damage faster at level 3 - self->client->ps.forcePowerDebounce[FP_GRIP] = level.time + Q_irand( 150, 750 ); + self->client->ps.forcePowerDebounce[FP_GRIP] = level.time + Q_irand(150, 750); } else { - self->client->ps.forcePowerDebounce[FP_GRIP] = level.time + Q_irand( 250, 1000 ); + self->client->ps.forcePowerDebounce[FP_GRIP] = level.time + Q_irand(250, 1000); } } else {//player takes damage faster - self->client->ps.forcePowerDebounce[FP_GRIP] = level.time + Q_irand( 100, 600 ); + self->client->ps.forcePowerDebounce[FP_GRIP] = level.time + Q_irand(100, 600); } - if ( forceGripDamage[self->client->ps.forcePowerLevel[FP_GRIP]] > 0 ) + if (forceGripDamage[self->client->ps.forcePowerLevel[FP_GRIP]] > 0) {//no damage at level 1 - WP_ForcePowerDrain( self, FP_GRIP, 3 ); + WP_ForcePowerDrain(self, FP_GRIP, 3); } - if ( self->client->NPC_class == CLASS_KYLE - && (self->spawnflags&1) ) + if (self->client->NPC_class == CLASS_KYLE + && (self->spawnflags & 1)) {//"Boss" Kyle - if ( gripEnt->client ) + if (gripEnt->client) { - if ( !Q_irand( 0, 2 ) ) + if (!Q_irand(0, 2)) {//toss him aside! vec3_t vRt; - AngleVectors( self->currentAngles, NULL, vRt, NULL ); + AngleVectors(self->currentAngles, NULL, vRt, NULL); //stop gripping - TIMER_Set( self, "gripping", -level.time ); - WP_ForcePowerStop( self, FP_GRIP ); + TIMER_Set(self, "gripping", -level.time); + WP_ForcePowerStop(self, FP_GRIP); //now toss him - if ( Q_irand( 0, 1 ) ) + if (Q_irand(0, 1)) {//throw him to my left - NPC_SetAnim( self, SETANIM_BOTH, BOTH_TOSS1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - VectorScale( vRt, -1500.0f, gripEnt->client->ps.velocity ); - G_Knockdown( gripEnt, self, vRt, 500, qfalse ); + NPC_SetAnim(self, SETANIM_BOTH, BOTH_TOSS1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + VectorScale(vRt, -1500.0f, gripEnt->client->ps.velocity); + G_Knockdown(gripEnt, self, vRt, 500, qfalse); } else {//throw him to my right - NPC_SetAnim( self, SETANIM_BOTH, BOTH_TOSS2, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - VectorScale( vRt, 1500.0f, gripEnt->client->ps.velocity ); - G_Knockdown( gripEnt, self, vRt, 500, qfalse ); + NPC_SetAnim(self, SETANIM_BOTH, BOTH_TOSS2, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + VectorScale(vRt, 1500.0f, gripEnt->client->ps.velocity); + G_Knockdown(gripEnt, self, vRt, 500, qfalse); } //don't do anything for a couple seconds self->client->ps.weaponTime = self->client->ps.torsoAnimTimer + 2000; self->painDebounceTime = level.time + self->client->ps.weaponTime; //stop moving - VectorClear( self->client->ps.velocity ); - VectorClear( self->client->ps.moveDir ); + VectorClear(self->client->ps.velocity); + VectorClear(self->client->ps.moveDir); return; } } @@ -13750,35 +14358,35 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd else { //WP_ForcePowerDrain( self, FP_GRIP, 0 ); - if ( !gripEnt->enemy ) + if (!gripEnt->enemy) { - if ( gripEnt->client + if (gripEnt->client && gripEnt->client->playerTeam == TEAM_PLAYER && self->s.number < MAX_CLIENTS && self->client - && self->client->playerTeam == TEAM_PLAYER ) + && self->client->playerTeam == TEAM_PLAYER) {//this shouldn't make allies instantly turn on you, let the damage->pain routine determine how allies should react to this } else { - G_SetEnemy( gripEnt, self ); + G_SetEnemy(gripEnt, self); } } } - if ( gripEnt->client && gripEnt->health > 0 ) + if (gripEnt->client && gripEnt->health > 0) { int anim = BOTH_CHOKE3; //left-handed choke - if ( gripEnt->client->ps.weapon == WP_NONE || gripEnt->client->ps.weapon == WP_MELEE ) + if (gripEnt->client->ps.weapon == WP_NONE || gripEnt->client->ps.weapon == WP_MELEE) { anim = BOTH_CHOKE1; //two-handed choke } - if ( self->client->ps.forcePowerLevel[FP_GRIP] < FORCE_LEVEL_2 ) + if (self->client->ps.forcePowerLevel[FP_GRIP] < FORCE_LEVEL_2) {//still on ground, only set anim on torso - NPC_SetAnim( gripEnt, SETANIM_TORSO, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(gripEnt, SETANIM_TORSO, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } else {//in air, set on whole body - NPC_SetAnim( gripEnt, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(gripEnt, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } gripEnt->painDebounceTime = level.time + 2000; } @@ -13786,33 +14394,33 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd } break; case FP_LIGHTNING: - if ( self->client->ps.forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_1 ) + if (self->client->ps.forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_1) {//higher than level 1 - if ( cmd->buttons & BUTTON_FORCE_LIGHTNING ) + if (cmd->buttons & BUTTON_FORCE_LIGHTNING) {//holding it keeps it going self->client->ps.forcePowerDuration[FP_LIGHTNING] = level.time + 500; - ForceLightningAnim( self ); + ForceLightningAnim(self); } } - if ( !WP_ForcePowerAvailable( self, forcePower, 0 ) ) + if (!WP_ForcePowerAvailable(self, forcePower, 0)) { - WP_ForcePowerStop( self, forcePower ); + WP_ForcePowerStop(self, forcePower); } else { - ForceShootLightning( self ); - if ( self->client->ps.torsoAnim == BOTH_FORCE_2HANDEDLIGHTNING + ForceShootLightning(self); + if (self->client->ps.torsoAnim == BOTH_FORCE_2HANDEDLIGHTNING || self->client->ps.torsoAnim == BOTH_FORCE_2HANDEDLIGHTNING_START || self->client->ps.torsoAnim == BOTH_FORCE_2HANDEDLIGHTNING_HOLD - || self->client->ps.torsoAnim == BOTH_FORCE_2HANDEDLIGHTNING_RELEASE ) + || self->client->ps.torsoAnim == BOTH_FORCE_2HANDEDLIGHTNING_RELEASE) {//jackin' 'em up, Palpatine-style //extra cost - WP_ForcePowerDrain( self, forcePower, 0 ); + WP_ForcePowerDrain(self, forcePower, 0); } - WP_ForcePowerDrain( self, forcePower, 0 ); + WP_ForcePowerDrain(self, forcePower, 0); } break; - //new Jedi Academy force powers + //new Jedi Academy force powers case FP_RAGE: if (self->health < 1) { @@ -13840,7 +14448,7 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd self->client->ps.forceRageDrainTime = level.time + addTime; } - if ( self->health < 1 ) + if (self->health < 1) { self->health = 1; //WP_ForcePowerStop( self, forcePower ); @@ -13849,17 +14457,17 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd { self->client->ps.stats[STAT_HEALTH] = self->health; - speed = forceSpeedValue[self->client->ps.forcePowerLevel[FP_RAGE]-1]; - if ( !self->s.number ) + speed = forceSpeedValue[self->client->ps.forcePowerLevel[FP_RAGE] - 1]; + if (!self->s.number) {//player using force rage - if ( !(self->client->ps.forcePowersActive&(1<client->ps.forcePowerLevel[FP_RAGE] > self->client->ps.forcePowerLevel[FP_SPEED]+1 ) + if (!(self->client->ps.forcePowersActive&(1 << FP_SPEED)) + || self->client->ps.forcePowerLevel[FP_RAGE] > self->client->ps.forcePowerLevel[FP_SPEED] + 1) {//either not using speed or speed is at a lower level than rage gi.cvar_set("timescale", va("%4.2f", speed)); - if ( g_timescale->value > speed ) + if (g_timescale->value > speed) { newSpeed = g_timescale->value - 0.05; - if ( newSpeed < speed ) + if (newSpeed < speed) { newSpeed = speed; } @@ -13870,70 +14478,70 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd } break; case FP_DRAIN: - if ( cmd->buttons & BUTTON_FORCE_DRAIN ) + if (cmd->buttons & BUTTON_FORCE_DRAIN) {//holding it keeps it going self->client->ps.forcePowerDuration[FP_DRAIN] = level.time + 500; } - if ( !WP_ForcePowerAvailable( self, forcePower, 0 ) ) + if (!WP_ForcePowerAvailable(self, forcePower, 0)) {//no more force power, stop - WP_ForcePowerStop( self, forcePower ); + WP_ForcePowerStop(self, forcePower); } - else if ( self->client->ps.forceDrainEntityNum >= 0 && self->client->ps.forceDrainEntityNum < ENTITYNUM_WORLD ) + else if (self->client->ps.forceDrainEntityNum >= 0 && self->client->ps.forceDrainEntityNum < ENTITYNUM_WORLD) {//holding someone - if ( !WP_ForcePowerAvailable( self, FP_DRAIN, 0 ) + if (!WP_ForcePowerAvailable(self, FP_DRAIN, 0) || (self->client->ps.forcePowerLevel[FP_DRAIN]>FORCE_LEVEL_1 - && !self->s.number - && !(cmd->buttons&BUTTON_FORCE_DRAIN) - && self->client->ps.forcePowerDuration[FP_DRAIN]s.number + && !(cmd->buttons&BUTTON_FORCE_DRAIN) + && self->client->ps.forcePowerDuration[FP_DRAIN]client->ps.forceDrainEntityNum]; - if ( !drainEnt ) + if (!drainEnt) {//invalid ent - WP_ForcePowerStop( self, FP_DRAIN ); + WP_ForcePowerStop(self, FP_DRAIN); return; } - else if ( (drainEnt->health <= 0&&drainEnt->takedamage) )//FIXME: what about things that never had health or lose takedamage when they die? + else if ((drainEnt->health <= 0 && drainEnt->takedamage))//FIXME: what about things that never had health or lose takedamage when they die? {//dead ent - WP_ForcePowerStop( self, FP_DRAIN ); + WP_ForcePowerStop(self, FP_DRAIN); return; } - else if ( drainEnt->client && drainEnt->client->moveType == MT_FLYSWIM && VectorLengthSquared( NPC->client->ps.velocity ) > (300*300) ) + else if (drainEnt->client && drainEnt->client->moveType == MT_FLYSWIM && VectorLengthSquared(NPC->client->ps.velocity) > (300 * 300)) {//flying creature broke free - WP_ForcePowerStop( self, FP_DRAIN ); + WP_ForcePowerStop(self, FP_DRAIN); return; } - else if ( drainEnt->client + else if (drainEnt->client && drainEnt->health>0 //dead dudes don't fly && (drainEnt->client->NPC_class == CLASS_BOBAFETT || drainEnt->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forcePowerDebounce[FP_DRAIN] < level.time - && !Q_irand( 0, 10 ) ) + && !Q_irand(0, 10)) {//boba fett - fly away! drainEnt->client->ps.forceJumpCharge = 0;//so we don't play the force flip anim drainEnt->client->ps.velocity[2] = 250; drainEnt->client->ps.forceJumpZStart = drainEnt->currentOrigin[2];//so we don't take damage if we land at same height drainEnt->client->ps.pm_flags |= PMF_JUMPING; - G_AddEvent( drainEnt, EV_JUMP, 0 ); - JET_FlyStart( drainEnt ); - WP_ForcePowerStop( self, FP_DRAIN ); + G_AddEvent(drainEnt, EV_JUMP, 0); + JET_FlyStart(drainEnt); + WP_ForcePowerStop(self, FP_DRAIN); return; } - else if ( drainEnt->NPC - && drainEnt->client + else if (drainEnt->NPC + && drainEnt->client && drainEnt->client->ps.forcePowersKnown - && (drainEnt->client->NPC_class==CLASS_REBORN||drainEnt->client->ps.weapon==WP_SABER) + && (drainEnt->client->NPC_class == CLASS_REBORN || drainEnt->client->ps.weapon == WP_SABER) && !Jedi_CultistDestroyer(drainEnt) - && level.time-(self->client->ps.forcePowerDebounce[FP_DRAIN]>self->client->ps.forcePowerLevel[FP_DRAIN]*500)//at level 1, I always get at least 500ms of drain, at level 3 I get 1500ms - && !Q_irand( 0, 100-(drainEnt->NPC->stats.evasion*8)-(g_spskill->integer*15) ) ) + && level.time - (self->client->ps.forcePowerDebounce[FP_DRAIN]>self->client->ps.forcePowerLevel[FP_DRAIN] * 500)//at level 1, I always get at least 500ms of drain, at level 3 I get 1500ms + && !Q_irand(0, 100 - (drainEnt->NPC->stats.evasion * 8) - (g_spskill->integer * 15))) {//a jedi who broke free FIXME: maybe have some minimum grip length- a reaction time? - WP_ForceForceThrow( drainEnt ); + WP_ForceForceThrow(drainEnt); //FIXME: I need to go into some pushed back anim... - WP_ForcePowerStop( self, FP_DRAIN ); + WP_ForcePowerStop(self, FP_DRAIN); //can't drain again for 2 seconds self->client->ps.forcePowerDebounce[FP_DRAIN] = level.time + 4000; return; @@ -13944,145 +14552,145 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd int drainLevel = WP_AbsorbConversion( drainEnt, drainEnt->client->ps.forcePowerLevel[FP_ABSORB], self, FP_DRAIN, self->client->ps.forcePowerLevel[FP_DRAIN], forcePowerNeeded[self->client->ps.forcePowerLevel[FP_DRAIN]] ); if ( !drainLevel ) { - WP_ForcePowerStop( self, forcePower ); - return; + WP_ForcePowerStop( self, forcePower ); + return; } */ //NPC_SetAnim( self, SETANIM_BOTH, BOTH_HUGGER1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - if ( self->client->ps.torsoAnim != BOTH_FORCE_DRAIN_GRAB_START - || !self->client->ps.torsoAnimTimer ) + if (self->client->ps.torsoAnim != BOTH_FORCE_DRAIN_GRAB_START + || !self->client->ps.torsoAnimTimer) { - NPC_SetAnim( self, SETANIM_BOTH, BOTH_FORCE_DRAIN_GRAB_HOLD, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_BOTH, BOTH_FORCE_DRAIN_GRAB_HOLD, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } - if ( self->handLBolt != -1 ) + if (self->handLBolt != -1) { - G_PlayEffect( G_EffectIndex( "force/drain_hand" ), self->playerModel, self->handLBolt, self->s.number, self->currentOrigin, 200, qtrue ); + G_PlayEffect(G_EffectIndex("force/drain_hand"), self->playerModel, self->handLBolt, self->s.number, self->currentOrigin, 200, qtrue); } - if ( self->handRBolt != -1 ) + if (self->handRBolt != -1) { - G_PlayEffect( G_EffectIndex( "force/drain_hand" ), self->playerModel, self->handRBolt, self->s.number, self->currentOrigin, 200, qtrue ); + G_PlayEffect(G_EffectIndex("force/drain_hand"), self->playerModel, self->handRBolt, self->s.number, self->currentOrigin, 200, qtrue); } - + //how far are they - dist = Distance( self->client->renderInfo.eyePoint, drainEnt->currentOrigin ); - if ( DistanceSquared( drainEnt->currentOrigin, self->currentOrigin ) > FORCE_DRAIN_DIST_SQUARED ) + dist = Distance(self->client->renderInfo.eyePoint, drainEnt->currentOrigin); + if (DistanceSquared(drainEnt->currentOrigin, self->currentOrigin) > FORCE_DRAIN_DIST_SQUARED) {//must be close, got away somehow! - WP_ForcePowerStop( self, FP_DRAIN ); + WP_ForcePowerStop(self, FP_DRAIN); return; } //keep my saber off! - WP_DeactivateSaber( self, qtrue ); - if ( drainEnt->client ) + WP_DeactivateSaber(self, qtrue); + if (drainEnt->client) { //now move them - VectorCopy( self->client->ps.viewangles, angles ); + VectorCopy(self->client->ps.viewangles, angles); angles[0] = 0; - AngleVectors( angles, dir, NULL, NULL ); + AngleVectors(angles, dir, NULL, NULL); /* VectorMA( self->currentOrigin, self->maxs[0], dir, drainEnt->client->ps.forceDrainOrg ); trace_t trace; gi.trace( &trace, drainEnt->currentOrigin, drainEnt->mins, drainEnt->maxs, drainEnt->client->ps.forceDrainOrg, drainEnt->s.number, drainEnt->clipmask ); if ( !trace.startsolid && !trace.allsolid ) { - G_SetOrigin( drainEnt, trace.endpos ); - gi.linkentity( drainEnt ); - VectorClear( drainEnt->client->ps.velocity ); + G_SetOrigin( drainEnt, trace.endpos ); + gi.linkentity( drainEnt ); + VectorClear( drainEnt->client->ps.velocity ); } VectorMA( self->currentOrigin, self->maxs[0]*0.5f, dir, drainEnt->client->ps.forceDrainOrg ); */ //stop them from thinking drainEnt->client->ps.pm_time = 2000; drainEnt->client->ps.pm_flags |= PMF_TIME_KNOCKBACK; - if ( drainEnt->NPC ) + if (drainEnt->NPC) { - if ( !(drainEnt->NPC->aiFlags&NPCAI_DIE_ON_IMPACT) ) + if (!(drainEnt->NPC->aiFlags&NPCAI_DIE_ON_IMPACT)) {//not falling to their death drainEnt->NPC->nextBStateThink = level.time + 2000; } - vectoangles( dir, angles ); - drainEnt->NPC->desiredYaw = AngleNormalize180(angles[YAW]+180); + vectoangles(dir, angles); + drainEnt->NPC->desiredYaw = AngleNormalize180(angles[YAW] + 180); drainEnt->NPC->desiredPitch = -angles[PITCH]; SaveNPCGlobals(); - SetNPCGlobals( drainEnt ); - NPC_UpdateAngles( qtrue, qtrue ); + SetNPCGlobals(drainEnt); + NPC_UpdateAngles(qtrue, qtrue); drainEnt->NPC->last_ucmd.angles[0] = ucmd.angles[0]; drainEnt->NPC->last_ucmd.angles[1] = ucmd.angles[1]; drainEnt->NPC->last_ucmd.angles[2] = ucmd.angles[2]; RestoreNPCGlobals(); //FIXME: why does he turn back to his original angles once he dies or is let go? } - else if ( !drainEnt->s.number ) + else if (!drainEnt->s.number) { drainEnt->enemy = self; - NPC_SetLookTarget( drainEnt, self->s.number, level.time+1000 ); + NPC_SetLookTarget(drainEnt, self->s.number, level.time + 1000); } drainEnt->client->ps.eFlags |= EF_FORCE_DRAINED; //dammit! Make sure that saber stays off! - WP_DeactivateSaber( drainEnt, qtrue ); + WP_DeactivateSaber(drainEnt, qtrue); } //Shouldn't this be discovered? - AddSightEvent( self, drainEnt->currentOrigin, 128, AEL_DISCOVERED, 20 ); + AddSightEvent(self, drainEnt->currentOrigin, 128, AEL_DISCOVERED, 20); - if ( self->client->ps.forcePowerDebounce[FP_DRAIN] < level.time ) + if (self->client->ps.forcePowerDebounce[FP_DRAIN] < level.time) { - int drainLevel = WP_AbsorbConversion( drainEnt, drainEnt->client->ps.forcePowerLevel[FP_ABSORB], self, FP_DRAIN, self->client->ps.forcePowerLevel[FP_DRAIN], forcePowerNeeded[self->client->ps.forcePowerLevel[FP_DRAIN]] ); - if ( (drainLevel && drainLevel == -1) - || Q_irand( drainLevel, 3 ) < 3 ) + int drainLevel = WP_AbsorbConversion(drainEnt, drainEnt->client->ps.forcePowerLevel[FP_ABSORB], self, FP_DRAIN, self->client->ps.forcePowerLevel[FP_DRAIN], forcePowerNeeded[self->client->ps.forcePowerLevel[FP_DRAIN]]); + if ((drainLevel && drainLevel == -1) + || Q_irand(drainLevel, 3) < 3) {//the drain is being absorbed - ForceDrainEnt( self, drainEnt ); + ForceDrainEnt(self, drainEnt); } - WP_ForcePowerDrain( self, FP_DRAIN, 3 ); + WP_ForcePowerDrain(self, FP_DRAIN, 3); } else { - if ( !Q_irand( 0, 4 ) ) + if (!Q_irand(0, 4)) { - WP_ForcePowerDrain( self, FP_DRAIN, 1 ); + WP_ForcePowerDrain(self, FP_DRAIN, 1); } - if ( !drainEnt->enemy ) + if (!drainEnt->enemy) { - G_SetEnemy( drainEnt, self ); + G_SetEnemy(drainEnt, self); } } - if ( drainEnt->health > 0 ) + if (drainEnt->health > 0) {//still alive //NPC_SetAnim( drainEnt, SETANIM_BOTH, BOTH_HUGGEE1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - NPC_SetAnim( drainEnt, SETANIM_BOTH, BOTH_FORCE_DRAIN_GRABBED, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(drainEnt, SETANIM_BOTH, BOTH_FORCE_DRAIN_GRABBED, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } } } } - else if ( self->client->ps.forcePowerLevel[forcePower] > FORCE_LEVEL_1 ) + else if (self->client->ps.forcePowerLevel[forcePower] > FORCE_LEVEL_1) {//regular distance-drain - if ( cmd->buttons & BUTTON_FORCE_DRAIN ) + if (cmd->buttons & BUTTON_FORCE_DRAIN) {//holding it keeps it going self->client->ps.forcePowerDuration[FP_DRAIN] = level.time + 500; - if ( self->client->ps.torsoAnim == BOTH_FORCE_DRAIN_START ) + if (self->client->ps.torsoAnim == BOTH_FORCE_DRAIN_START) { - if ( !self->client->ps.torsoAnimTimer ) + if (!self->client->ps.torsoAnimTimer) { - NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCE_DRAIN_HOLD, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_TORSO, BOTH_FORCE_DRAIN_HOLD, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } else { - NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCE_DRAIN_START, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_TORSO, BOTH_FORCE_DRAIN_START, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } } else { - NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCE_DRAIN_HOLD, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(self, SETANIM_TORSO, BOTH_FORCE_DRAIN_HOLD, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } } - if ( !WP_ForcePowerAvailable( self, forcePower, 0 ) ) + if (!WP_ForcePowerAvailable(self, forcePower, 0)) { - WP_ForcePowerStop( self, forcePower ); + WP_ForcePowerStop(self, forcePower); } else { - ForceShootDrain( self ); + ForceShootDrain(self); } } break; @@ -14097,55 +14705,55 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd } } -void WP_CheckForcedPowers( gentity_t *self, usercmd_t *ucmd ) +void WP_CheckForcedPowers(gentity_t *self, usercmd_t *ucmd) { - for ( int forcePower = FP_FIRST; forcePower < NUM_FORCE_POWERS; forcePower++ ) + for (int forcePower = FP_FIRST; forcePower < NUM_FORCE_POWERS; forcePower++) { - if ( (self->client->ps.forcePowersForced&(1<client->ps.forcePowersForced&(1 << forcePower))) { - switch ( forcePower ) + switch (forcePower) { case FP_HEAL: - ForceHeal( self ); + ForceHeal(self); //do only once - self->client->ps.forcePowersForced &= ~(1<client->ps.forcePowersForced &= ~(1 << forcePower); break; case FP_LEVITATION: //nothing break; case FP_SPEED: - ForceSpeed( self ); + ForceSpeed(self); //do only once - self->client->ps.forcePowersForced &= ~(1<client->ps.forcePowersForced &= ~(1 << forcePower); break; case FP_PUSH: - ForceThrow( self, qfalse ); + ForceThrow(self, qfalse); //do only once - self->client->ps.forcePowersForced &= ~(1<client->ps.forcePowersForced &= ~(1 << forcePower); break; case FP_PULL: - ForceThrow( self, qtrue ); + ForceThrow(self, qtrue); //do only once - self->client->ps.forcePowersForced &= ~(1<client->ps.forcePowersForced &= ~(1 << forcePower); break; case FP_TELEPATHY: //FIXME: target at enemy? - ForceTelepathy( self ); + ForceTelepathy(self); //do only once - self->client->ps.forcePowersForced &= ~(1<client->ps.forcePowersForced &= ~(1 << forcePower); break; case FP_GRIP: - ucmd->buttons &= ~(BUTTON_ATTACK|BUTTON_ALT_ATTACK|BUTTON_FORCE_FOCUS|BUTTON_FORCE_DRAIN|BUTTON_FORCE_LIGHTNING); + ucmd->buttons &= ~(BUTTON_ATTACK | BUTTON_ALT_ATTACK | BUTTON_FORCE_FOCUS | BUTTON_FORCE_DRAIN | BUTTON_FORCE_LIGHTNING); ucmd->buttons |= BUTTON_FORCEGRIP; //holds until cleared break; case FP_LIGHTNING: - ucmd->buttons &= ~(BUTTON_ATTACK|BUTTON_ALT_ATTACK|BUTTON_FORCE_FOCUS|BUTTON_FORCEGRIP|BUTTON_FORCE_DRAIN); + ucmd->buttons &= ~(BUTTON_ATTACK | BUTTON_ALT_ATTACK | BUTTON_FORCE_FOCUS | BUTTON_FORCEGRIP | BUTTON_FORCE_DRAIN); ucmd->buttons |= BUTTON_FORCE_LIGHTNING; //holds until cleared break; case FP_SABERTHROW: - ucmd->buttons &= ~(BUTTON_ATTACK|BUTTON_FORCE_FOCUS|BUTTON_FORCEGRIP|BUTTON_FORCE_DRAIN|BUTTON_FORCE_LIGHTNING); + ucmd->buttons &= ~(BUTTON_ATTACK | BUTTON_FORCE_FOCUS | BUTTON_FORCEGRIP | BUTTON_FORCE_DRAIN | BUTTON_FORCE_LIGHTNING); ucmd->buttons |= BUTTON_ALT_ATTACK; //holds until cleared? break; @@ -14156,22 +14764,22 @@ void WP_CheckForcedPowers( gentity_t *self, usercmd_t *ucmd ) //nothing break; case FP_RAGE: - ForceRage( self ); + ForceRage(self); //do only once - self->client->ps.forcePowersForced &= ~(1<client->ps.forcePowersForced &= ~(1 << forcePower); break; case FP_PROTECT: - ForceProtect( self ); + ForceProtect(self); //do only once - self->client->ps.forcePowersForced &= ~(1<client->ps.forcePowersForced &= ~(1 << forcePower); break; case FP_ABSORB: - ForceAbsorb( self ); + ForceAbsorb(self); //do only once - self->client->ps.forcePowersForced &= ~(1<client->ps.forcePowersForced &= ~(1 << forcePower); break; case FP_DRAIN: - ucmd->buttons &= ~(BUTTON_ATTACK|BUTTON_ALT_ATTACK|BUTTON_FORCE_FOCUS|BUTTON_FORCEGRIP|BUTTON_FORCE_LIGHTNING); + ucmd->buttons &= ~(BUTTON_ATTACK | BUTTON_ALT_ATTACK | BUTTON_FORCE_FOCUS | BUTTON_FORCEGRIP | BUTTON_FORCE_LIGHTNING); ucmd->buttons |= BUTTON_FORCE_DRAIN; //holds until cleared break; @@ -14183,36 +14791,36 @@ void WP_CheckForcedPowers( gentity_t *self, usercmd_t *ucmd ) } } -void WP_ForcePowersUpdate( gentity_t *self, usercmd_t *ucmd ) +void WP_ForcePowersUpdate(gentity_t *self, usercmd_t *ucmd) { qboolean usingForce = qfalse; int i; //see if any force powers are running - if ( !self ) + if (!self) { return; } - if ( !self->client ) + if (!self->client) { return; } - if ( self->health <= 0 ) + if (self->health <= 0) {//if dead, deactivate any active force powers - for ( i = 0; i < NUM_FORCE_POWERS; i++ ) + for (i = 0; i < NUM_FORCE_POWERS; i++) { - if ( self->client->ps.forcePowerDuration[i] || (self->client->ps.forcePowersActive&( 1 << i )) ) + if (self->client->ps.forcePowerDuration[i] || (self->client->ps.forcePowersActive&(1 << i))) { - WP_ForcePowerStop( self, (forcePowers_t)i ); + WP_ForcePowerStop(self, (forcePowers_t)i); self->client->ps.forcePowerDuration[i] = 0; } } return; } - WP_CheckForcedPowers( self, ucmd ); + WP_CheckForcedPowers(self, ucmd); - if ( !self->s.number ) + if (!self->s.number) {//player uses different kind of force-jump } else @@ -14220,102 +14828,102 @@ void WP_ForcePowersUpdate( gentity_t *self, usercmd_t *ucmd ) /* if ( ucmd->buttons & BUTTON_FORCEJUMP ) {//just charging up - ForceJumpCharge( self, ucmd ); + ForceJumpCharge( self, ucmd ); } else */ - if ( self->client->ps.forceJumpCharge ) + if (self->client->ps.forceJumpCharge) {//let go of charge button, have charge //if leave the ground by some other means, cancel the force jump so we don't suddenly jump when we land. - if ( self->client->ps.groundEntityNum == ENTITYNUM_NONE - && !PM_SwimmingAnim( self->client->ps.legsAnim ) ) + if (self->client->ps.groundEntityNum == ENTITYNUM_NONE + && !PM_SwimmingAnim(self->client->ps.legsAnim)) {//FIXME: stop sound? //self->client->ps.forceJumpCharge = 0; //FIXME: actually, we want this to still be cleared... don't clear it if the button isn't being pressed, but clear it if not holding button and not on ground. } else {//still on ground, so jump - ForceJump( self, ucmd ); + ForceJump(self, ucmd); return; } } } - if ( ucmd->buttons & BUTTON_FORCEGRIP ) + if (ucmd->buttons & BUTTON_FORCEGRIP) { - ForceGrip( self ); + ForceGrip(self); } - if ( !self->s.number - && self->client->NPC_class == CLASS_BOBAFETT ) + if (!self->s.number + && self->client->NPC_class == CLASS_BOBAFETT) {//Boba Fett - if ( ucmd->buttons & BUTTON_FORCE_LIGHTNING ) + if (ucmd->buttons & BUTTON_FORCE_LIGHTNING) {//start flamethrower - Boba_DoFlameThrower( self ); + Boba_DoFlameThrower(self); return; } - else if ( self->client->ps.forcePowerDuration[FP_LIGHTNING] ) + else if (self->client->ps.forcePowerDuration[FP_LIGHTNING]) { self->client->ps.forcePowerDuration[FP_LIGHTNING] = 0; - Boba_StopFlameThrower( self ); + Boba_StopFlameThrower(self); return; } } - else if ( ucmd->buttons & BUTTON_FORCE_LIGHTNING ) + else if (ucmd->buttons & BUTTON_FORCE_LIGHTNING) { - ForceLightning( self ); + ForceLightning(self); } - if ( ucmd->buttons & BUTTON_FORCE_DRAIN ) + if (ucmd->buttons & BUTTON_FORCE_DRAIN) { - if ( !ForceDrain2( self ) ) + if (!ForceDrain2(self)) {//can't drain-grip someone right in front - if ( self->client->ps.forcePowerLevel[FP_DRAIN] > FORCE_LEVEL_1 ) + if (self->client->ps.forcePowerLevel[FP_DRAIN] > FORCE_LEVEL_1) {//try ranged - ForceDrain( self, qtrue ); + ForceDrain(self, qtrue); } } } - for ( i = 0; i < NUM_FORCE_POWERS; i++ ) + for (i = 0; i < NUM_FORCE_POWERS; i++) { - if ( self->client->ps.forcePowerDuration[i] ) + if (self->client->ps.forcePowerDuration[i]) { - if ( self->client->ps.forcePowerDuration[i] < level.time ) + if (self->client->ps.forcePowerDuration[i] < level.time) { - if ( (self->client->ps.forcePowersActive&( 1 << i )) ) + if ((self->client->ps.forcePowersActive&(1 << i))) {//turn it off - WP_ForcePowerStop( self, (forcePowers_t)i ); + WP_ForcePowerStop(self, (forcePowers_t)i); } self->client->ps.forcePowerDuration[i] = 0; } } - if ( (self->client->ps.forcePowersActive&( 1 << i )) ) + if ((self->client->ps.forcePowersActive&(1 << i))) { usingForce = qtrue; - WP_ForcePowerRun( self, (forcePowers_t)i, ucmd ); + WP_ForcePowerRun(self, (forcePowers_t)i, ucmd); } } - if ( self->client->ps.saberInFlight ) + if (self->client->ps.saberInFlight) {//don't regen force power while throwing saber - if ( self->client->ps.saberEntityNum < ENTITYNUM_NONE && self->client->ps.saberEntityNum > 0 )//player is 0 + if (self->client->ps.saberEntityNum < ENTITYNUM_NONE && self->client->ps.saberEntityNum > 0)//player is 0 {// - if ( &g_entities[self->client->ps.saberEntityNum] != NULL && g_entities[self->client->ps.saberEntityNum].s.pos.trType == TR_LINEAR ) + if (&g_entities[self->client->ps.saberEntityNum] != NULL && g_entities[self->client->ps.saberEntityNum].s.pos.trType == TR_LINEAR) {//fell to the ground and we're trying to pull it back usingForce = qtrue; } } } - if ( PM_ForceUsingSaberAnim( self->client->ps.torsoAnim ) ) + if (PM_ForceUsingSaberAnim(self->client->ps.torsoAnim)) { usingForce = qtrue; } - if ( !usingForce ) + if (!usingForce) {//when not using the force, regenerate at 10 points per second - if ( self->client->ps.forcePowerRegenDebounceTime < level.time ) + if (self->client->ps.forcePowerRegenDebounceTime < level.time) { - WP_ForcePowerRegenerate( self, self->client->ps.forcePowerRegenAmount ); + WP_ForcePowerRegenerate(self, self->client->ps.forcePowerRegenAmount); self->client->ps.forcePowerRegenDebounceTime = level.time + self->client->ps.forcePowerRegenRate; - if ( self->client->ps.forceRageRecoveryTime >= level.time ) + if (self->client->ps.forceRageRecoveryTime >= level.time) {//regen half as fast self->client->ps.forcePowerRegenDebounceTime += self->client->ps.forcePowerRegenRate; } @@ -14323,18 +14931,18 @@ void WP_ForcePowersUpdate( gentity_t *self, usercmd_t *ucmd ) } } -void WP_InitForcePowers( gentity_t *ent ) +void WP_InitForcePowers(gentity_t *ent) { - if ( !ent || !ent->client ) + if (!ent || !ent->client) { return; } - if ( !ent->client->ps.forcePowerMax ) + if (!ent->client->ps.forcePowerMax) { ent->client->ps.forcePowerMax = FORCE_POWER_MAX; } - if ( !ent->client->ps.forcePowerRegenRate ) + if (!ent->client->ps.forcePowerRegenRate) { ent->client->ps.forcePowerRegenRate = 100; } @@ -14346,16 +14954,16 @@ void WP_InitForcePowers( gentity_t *ent ) ent->client->ps.forceDrainTime = 0; ent->client->ps.pullAttackTime = 0; - if ( ent->s.number < MAX_CLIENTS ) + if (ent->s.number < MAX_CLIENTS) {//player - if ( !g_cheats->integer )//devmaps give you all the FP + if (!g_cheats->integer)//devmaps give you all the FP { ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] = FORCE_LEVEL_1; ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] = FORCE_LEVEL_1; } else { - ent->client->ps.forcePowersKnown = ( 1 << FP_HEAL )|( 1 << FP_LEVITATION )|( 1 << FP_SPEED )|( 1 << FP_PUSH )|( 1 << FP_PULL )|( 1 << FP_TELEPATHY )|( 1 << FP_GRIP )|( 1 << FP_LIGHTNING)|( 1 << FP_SABERTHROW)|( 1 << FP_SABER_DEFENSE )|( 1 << FP_SABER_OFFENSE )|( 1<< FP_RAGE )|( 1<< FP_DRAIN )|( 1<< FP_PROTECT )|( 1<< FP_ABSORB )|( 1<< FP_SEE ); + ent->client->ps.forcePowersKnown = (1 << FP_HEAL) | (1 << FP_LEVITATION) | (1 << FP_SPEED) | (1 << FP_PUSH) | (1 << FP_PULL) | (1 << FP_TELEPATHY) | (1 << FP_GRIP) | (1 << FP_LIGHTNING) | (1 << FP_SABERTHROW) | (1 << FP_SABER_DEFENSE) | (1 << FP_SABER_OFFENSE) | (1 << FP_RAGE) | (1 << FP_DRAIN) | (1 << FP_PROTECT) | (1 << FP_ABSORB) | (1 << FP_SEE); ent->client->ps.forcePowerLevel[FP_HEAL] = FORCE_LEVEL_2; ent->client->ps.forcePowerLevel[FP_LEVITATION] = FORCE_LEVEL_2; ent->client->ps.forcePowerLevel[FP_PUSH] = FORCE_LEVEL_1; @@ -14381,12 +14989,12 @@ void WP_InitForcePowers( gentity_t *ent ) bool WP_DoingMoronicForcedAnimationForForcePowers(gentity_t *ent) { // :P --eez - if( !ent->client ) return false; - if( ent->client->ps.legsAnim == BOTH_FORCE_ABSORB_START || + if (!ent->client) return false; + if (ent->client->ps.legsAnim == BOTH_FORCE_ABSORB_START || ent->client->ps.legsAnim == BOTH_FORCE_ABSORB_END || ent->client->ps.legsAnim == BOTH_FORCE_ABSORB || ent->client->ps.torsoAnim == BOTH_FORCE_RAGE || - ent->client->ps.legsAnim == BOTH_FORCE_PROTECT ) + ent->client->ps.legsAnim == BOTH_FORCE_PROTECT) return true; return false; } From 4260cc0cc3c726722afbab1f890758ff0f275c49 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Fri, 22 Aug 2014 16:09:39 +0100 Subject: [PATCH 005/445] [SP] plays effect when blocking lightning w/ saber --- code/game/wp_saber.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 938ea5e8eb..04f0a52439 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -11512,6 +11512,10 @@ void ForceLightning(gentity_t *self) void ForceLightningDamage(gentity_t *self, gentity_t *traceEnt, vec3_t dir, float dist, float dot, vec3_t impactPoint) { + + qboolean blockedWithSaber = qfalse; + qboolean blockedWithHand = qfalse; + if (traceEnt->NPC && traceEnt->NPC->scriptFlags & SCF_NO_FORCE) { return; @@ -11581,6 +11585,7 @@ void ForceLightningDamage(gentity_t *self, gentity_t *traceEnt, vec3_t dir, floa NPC_SetAnim(traceEnt, parts, BOTH_RESISTPUSH, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); Jedi_PlayDeflectSound(traceEnt); dmg = Q_irand(0, 1); + blockedWithHand = (dmg == 0) ? qtrue : qfalse; } else if (traceEnt->s.weapon == WP_SABER) {//saber can block lightning @@ -11605,6 +11610,7 @@ void ForceLightningDamage(gentity_t *self, gentity_t *traceEnt, vec3_t dir, floa } else { + blockedWithSaber = qtrue; //make them do a parry traceEnt->client->ps.saberBlocked = BLOCKED_UPPER_LEFT; int parryReCalcTime = Jedi_ReCalcParryTime(traceEnt, EVASION_PARRY); @@ -11617,6 +11623,7 @@ void ForceLightningDamage(gentity_t *self, gentity_t *traceEnt, vec3_t dir, floa } else if (Q_irand(0, 1)) {//jedi less likely to be damaged + blockedWithSaber = qtrue; dmg = 0; } else @@ -11674,6 +11681,26 @@ void ForceLightningDamage(gentity_t *self, gentity_t *traceEnt, vec3_t dir, floa { traceEnt->client->ps.powerups[PW_SHOCKED] = level.time + 4000; } + else if (blockedWithSaber) + { + traceEnt->client->ps.powerups[PW_SHOCKED] = 0; + vec3_t end, fwd, right, up; + VectorNegate(dir, fwd); + + //randomise direction a bit + MakeNormalVectors(fwd, right, up); + VectorMA(fwd, random(), right, fwd); + VectorMA(fwd, random(), up, fwd); + VectorNormalize(fwd); + + VectorMA( traceEnt->client->ps.saber[0].blade[0].muzzlePoint, traceEnt->client->ps.saber[0].blade[0].length*Q_flrand(0, 1), traceEnt->client->ps.saber[0].blade[0].muzzleDir, end );//FIXME: pick a random blade? + G_PlayEffect( G_EffectIndex("force/lightning"), end, fwd); + } + else if (blockedWithHand) + { + //probably play an effect on the hand. + traceEnt->client->ps.powerups[PW_SHOCKED] = 0; + } else //short version { traceEnt->client->ps.powerups[PW_SHOCKED] = level.time + 500; From 1888e92071aad6b6960608d93e495009ad0c08cf Mon Sep 17 00:00:00 2001 From: redsaurus Date: Fri, 22 Aug 2014 19:47:10 +0100 Subject: [PATCH 006/445] [SP] Saber/push reflect changes When g_spskill >=2, the player aims deflected blaster shots and pushed projectiles towards crosshair rather than at enemies. For perfect reflection with saber, need to be blocking. Also made perfect reflection with push depend on push force power level, not saber defence force power level. --- code/cgame/cg_draw.cpp | 2 + code/game/g_missile.cpp | 149 +++++++++++++++++++++++++++++++--------- code/game/wp_saber.cpp | 12 ++-- 3 files changed, 124 insertions(+), 39 deletions(-) diff --git a/code/cgame/cg_draw.cpp b/code/cgame/cg_draw.cpp index 822555aa68..742fd28194 100644 --- a/code/cgame/cg_draw.cpp +++ b/code/cgame/cg_draw.cpp @@ -2725,6 +2725,7 @@ static void CG_ScanForRocketLock( void ) CG_ScanForCrosshairEntity ================= */ +extern vec3_t g_crosshairWorldCoord; extern Vehicle_t *G_IsRidingVehicle( gentity_t *ent ); extern float forcePushPullRadius[]; static void CG_ScanForCrosshairEntity( qboolean scanAll ) @@ -2916,6 +2917,7 @@ static void CG_ScanForCrosshairEntity( qboolean scanAll ) //draw crosshair at endpoint CG_DrawCrosshair( trace.endpos ); + VectorCopy( trace.endpos, g_crosshairWorldCoord ); g_crosshairEntNum = trace.entityNum; g_crosshairEntDist = 4096*trace.fraction; diff --git a/code/game/g_missile.cpp b/code/game/g_missile.cpp index 1bb3970e88..f1f8e7468a 100644 --- a/code/game/g_missile.cpp +++ b/code/game/g_missile.cpp @@ -138,12 +138,15 @@ G_ReflectMissile Reflect the missile roughly back at it's owner ================ */ +vec3_t g_crosshairWorldCoord = {0, 0, 0}; extern gentity_t *Jedi_FindEnemyInCone( gentity_t *self, gentity_t *fallback, float minDot ); -void G_ReflectMissile( gentity_t *ent, gentity_t *missile, vec3_t forward ) +extern cvar_t *g_saberAutoBlocking; +void G_ReflectMissile( gentity_t *ent, gentity_t *missile, vec3_t forward, forcePowers_t powerToUse ) { vec3_t bounce_dir; int i; float speed; + qboolean perfectReflection = qfalse; qboolean reflected = qfalse; gentity_t *owner = ent; @@ -154,30 +157,80 @@ void G_ReflectMissile( gentity_t *ent, gentity_t *missile, vec3_t forward ) //save the original speed speed = VectorNormalize( missile->s.pos.trDelta ); - - if ( ent && owner && owner->client && !owner->client->ps.saberInFlight && - (owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2 || (owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]>FORCE_LEVEL_1&&!Q_irand( 0, 3 )) ) ) - {//if high enough defense skill and saber in-hand (100% at level 3, 25% at level 2, 0% at level 1), reflections are perfectly deflected toward an enemy - gentity_t *enemy; - if ( owner->enemy && Q_irand( 0, 3 ) ) - {//toward current enemy 75% of the time - enemy = owner->enemy; + + if ( ent && owner && owner->client && + (owner->client->ps.forcePowerLevel[powerToUse] > FORCE_LEVEL_2 || (owner->client->ps.forcePowerLevel[powerToUse]>FORCE_LEVEL_1&&!Q_irand( 0, 3 )) ) ) + //if high enough force skill (100% at level 3, 25% at level 2, 0% at level 1), reflections are perfectly deflected toward an enemy + { + perfectReflection = qtrue; + } + + if ( powerToUse == FP_SABER_DEFENSE ) + { + if ( owner->client->ps.saberInFlight ) + {//but need saber in-hand for perfect reflection + perfectReflection = qfalse; } - else - {//find another enemy - enemy = Jedi_FindEnemyInCone( owner, owner->enemy, 0.3f ); + + if ( g_spskill->integer >= 2 && !g_saberAutoBlocking->integer && owner->client->ps.saberBlockingTime < level.time ) + {//but need to be blocking for perfect reflection on higher difficulties + perfectReflection = qfalse; } - if ( enemy ) + } + + if ( perfectReflection ) + { + if (g_spskill->integer < 2 || owner->s.clientNum >= MAX_CLIENTS) //either by autoaim (lower difficulties) { - vec3_t bullseye; - CalcEntitySpot( enemy, SPOT_HEAD, bullseye ); - bullseye[0] += Q_irand( -4, 4 ); - bullseye[1] += Q_irand( -4, 4 ); - bullseye[2] += Q_irand( -16, 4 ); - VectorSubtract( bullseye, missile->currentOrigin, bounce_dir ); + gentity_t *enemy; + if ( owner->enemy && Q_irand( 0, 3 ) ) + {//toward current enemy 75% of the time + enemy = owner->enemy; + } + else + {//find another enemy + enemy = Jedi_FindEnemyInCone( owner, owner->enemy, 0.3f ); + } + if ( enemy ) + { + vec3_t bullseye; + CalcEntitySpot( enemy, SPOT_HEAD, bullseye ); + bullseye[0] += Q_irand( -4, 4 ); + bullseye[1] += Q_irand( -4, 4 ); + bullseye[2] += Q_irand( -16, 4 ); + VectorSubtract( bullseye, missile->currentOrigin, bounce_dir ); + VectorNormalize( bounce_dir ); + if ( !PM_SaberInParry( owner->client->ps.saberMove ) + && !PM_SaberInReflect( owner->client->ps.saberMove ) + && !PM_SaberInIdle( owner->client->ps.saberMove ) ) + {//a bit more wild + if ( PM_SaberInAttack( owner->client->ps.saberMove ) + || PM_SaberInTransitionAny( owner->client->ps.saberMove ) + || PM_SaberInSpecialAttack( owner->client->ps.torsoAnim ) ) + {//moderately more wild + for ( i = 0; i < 3; i++ ) + { + bounce_dir[i] += Q_flrand( -0.2f, 0.2f ); + } + } + else + {//mildly more wild + for ( i = 0; i < 3; i++ ) + { + bounce_dir[i] += Q_flrand( -0.1f, 0.1f ); + } + } + } + VectorNormalize( bounce_dir ); + reflected = qtrue; + } + } + else //or by where the crosshair is (higher difficulties) + { + VectorSubtract( g_crosshairWorldCoord, missile->currentOrigin, bounce_dir ); VectorNormalize( bounce_dir ); - if ( !PM_SaberInParry( owner->client->ps.saberMove ) - && !PM_SaberInReflect( owner->client->ps.saberMove ) + if ( !PM_SaberInParry( owner->client->ps.saberMove ) + && !PM_SaberInReflect( owner->client->ps.saberMove ) && !PM_SaberInIdle( owner->client->ps.saberMove ) ) {//a bit more wild if ( PM_SaberInAttack( owner->client->ps.saberMove ) @@ -203,21 +256,51 @@ void G_ReflectMissile( gentity_t *ent, gentity_t *missile, vec3_t forward ) } if ( !reflected ) { - if ( missile->owner && missile->s.weapon != WP_SABER ) - {//bounce back at them if you can - VectorSubtract( missile->owner->currentOrigin, missile->currentOrigin, bounce_dir ); - VectorNormalize( bounce_dir ); + if ( g_spskill->integer < 2 || owner->s.clientNum >= MAX_CLIENTS ) + { + if ( missile->owner && missile->s.weapon != WP_SABER) + {//bounce back at them if you can + VectorSubtract( missile->owner->currentOrigin, missile->currentOrigin, bounce_dir ); + VectorNormalize( bounce_dir ); + } + else + { + vec3_t missile_dir; + + VectorSubtract( ent->currentOrigin, missile->currentOrigin, missile_dir ); + VectorCopy( missile->s.pos.trDelta, bounce_dir ); + VectorScale( bounce_dir, DotProduct( forward, missile_dir ), bounce_dir ); + VectorNormalize( bounce_dir ); + } } - else + else //deflect off at an angle. { - vec3_t missile_dir; - - VectorSubtract( ent->currentOrigin, missile->currentOrigin, missile_dir ); - VectorCopy( missile->s.pos.trDelta, bounce_dir ); - VectorScale( bounce_dir, DotProduct( forward, missile_dir ), bounce_dir ); + vec3_t deflect_dir, missile_dir; + float forceFactor; + VectorSubtract( g_crosshairWorldCoord, missile->currentOrigin, deflect_dir ); + VectorCopy( missile->s.pos.trDelta, missile_dir ); + VectorNormalize( missile_dir ); + VectorNormalize( deflect_dir ); + + //bigger forceFactors make the reflected shots go closer to the crosshair + switch( owner->client->ps.forcePowerLevel[powerToUse] ) + { + case FORCE_LEVEL_1: + forceFactor = 2.0f; + break; + case FORCE_LEVEL_2: + forceFactor = 3.0f; + break; + default: + forceFactor = 10.0f; + break; + } + + VectorMA(missile_dir, forceFactor, deflect_dir, bounce_dir ); + VectorNormalize( bounce_dir ); } - if ( owner->s.weapon == WP_SABER && owner->client ) + if ( owner->s.weapon == WP_SABER && owner->client && powerToUse == FP_SABER_DEFENSE) {//saber if ( owner->client->ps.saberInFlight ) {//reflecting off a thrown saber is totally wild @@ -835,7 +918,7 @@ extern bool WP_DoingMoronicForcedAnimationForForcePowers(gentity_t *ent); { VectorSubtract(ent->currentOrigin, other->currentOrigin, diff); VectorNormalize(diff); - G_ReflectMissile( other, ent, diff); + G_ReflectMissile( other, ent, diff, FP_SABER_DEFENSE); if ( other->owner && other->owner->client ) { other->owner->client->ps.saberEventFlags |= SEF_DEFLECTED; diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 04f0a52439..a009b1325f 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -68,7 +68,7 @@ extern void G_AddVoiceEvent( gentity_t *self, int event, int speakDebounceTime ) extern void CG_ChangeWeapon( int num ); extern void CG_SaberDoWeaponHitMarks( gclient_t *client, gentity_t *saberEnt, gentity_t *hitEnt, int saberNum, int bladeNum, vec3_t hitPos, vec3_t hitDir, vec3_t uaxis, vec3_t splashBackDir, float sizeTimeScale ); extern void G_AngerAlert( gentity_t *self ); -extern void G_ReflectMissile( gentity_t *ent, gentity_t *missile, vec3_t forward ); +extern void G_ReflectMissile( gentity_t *ent, gentity_t *missile, vec3_t forward, forcePowers_t powerToUse ); extern int G_CheckLedgeDive( gentity_t *self, float checkDist, const vec3_t checkVel, qboolean tryOpposite, qboolean tryPerp ); extern void G_BounceMissile( gentity_t *ent, trace_t *trace ); extern qboolean G_PointInBounds( const vec3_t point, const vec3_t mins, const vec3_t maxs ); @@ -6246,7 +6246,7 @@ else VectorSubtract(g_entities[ent->client->ps.saberEntityNum].currentOrigin, hitEnt->currentOrigin, newDir); VectorNormalize(newDir); - G_ReflectMissile(ent, &g_entities[ent->client->ps.saberEntityNum], newDir); + G_ReflectMissile(ent, &g_entities[ent->client->ps.saberEntityNum], newDir, FP_SABER_DEFENSE); } Jedi_PlayDeflectSound(hitOwner); WP_SaberDrop(ent, &g_entities[ent->client->ps.saberEntityNum]); @@ -6258,7 +6258,7 @@ else vec3_t newDir; VectorSubtract(g_entities[ent->client->ps.saberEntityNum].currentOrigin, hitEnt->currentOrigin, newDir); VectorNormalize(newDir); - G_ReflectMissile(ent, &g_entities[ent->client->ps.saberEntityNum], newDir); + G_ReflectMissile(ent, &g_entities[ent->client->ps.saberEntityNum], newDir, FP_SABER_DEFENSE); } WP_SaberReturn(ent, &g_entities[ent->client->ps.saberEntityNum]); } @@ -6826,7 +6826,7 @@ void WP_SaberInFlightReflectCheck(gentity_t *self, usercmd_t *ucmd) reflectAngle[PITCH] = Q_flrand(-90, 90); AngleVectors(reflectAngle, forward, NULL, NULL); - G_ReflectMissile(self, missile_list[x], forward); + G_ReflectMissile(self, missile_list[x], forward, FP_SABER_DEFENSE); //do an effect VectorNormalize2(missile_list[x]->s.pos.trDelta, fx_dir); G_PlayEffect("blaster/deflect", missile_list[x]->currentOrigin, fx_dir); @@ -10115,7 +10115,7 @@ void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) { VectorScale(right, -1, right); } - G_ReflectMissile(self, push_list[x], right); + G_ReflectMissile(self, push_list[x], right, pull ? FP_PULL : FP_PUSH); //FIXME: isn't turning off!!! WP_SaberDrop(push_list[x]->owner, push_list[x]); } @@ -10150,7 +10150,7 @@ void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) } if (dot >= 0) {//it's heading towards me - G_ReflectMissile(self, push_list[x], forward); + G_ReflectMissile(self, push_list[x], forward, FP_PUSH); } else { From c7ed57c2e2cf30fb595b0c9055d6ae63f4c3af8f Mon Sep 17 00:00:00 2001 From: Dusty Date: Sun, 2 Nov 2014 19:27:26 -0500 Subject: [PATCH 007/445] Merging my changes in, fixed some issues. Saber system changes: - Saber locks should be less frequent - Special moves/katas give power bonuses appropriately, not quite finished yet though - Merged in Red's changes to deflections into my wp_saber.cpp - Some things that were broken should work correctly now AI: - Jedi are smarter about using kicks - Jedi reactivate saber after escaping a drain or grip, with speed depending on rank - Jedi don't use dark rage if below 50% HP, if far away from player - Jedi kick off dark rage if they go below 25% HP Other: - Some errors and crashes related to loading save games and checkpoints may be fixed --- code/game/AI_Jedi.cpp | 34 +- code/game/bg_panimate.cpp | 1524 +++++++++++++++++++++++++------------ code/game/g_active.cpp | 4 + code/game/g_client.cpp | 42 - code/game/g_main.cpp | 15 +- code/game/g_shared.h | 5 + code/game/wp_saber.cpp | 259 +++++-- code/qcommon/msg.cpp | 1 + code/qcommon/q_shared.h | 1 + 9 files changed, 1269 insertions(+), 616 deletions(-) diff --git a/code/game/AI_Jedi.cpp b/code/game/AI_Jedi.cpp index edea36666c..775558638e 100644 --- a/code/game/AI_Jedi.cpp +++ b/code/game/AI_Jedi.cpp @@ -1244,7 +1244,11 @@ static void Jedi_CheckDecreaseSaberAnimLevel( void ) } static qboolean Jedi_DecideKick( void ) -{ +{ + if ( !enemy_in_striking_range ) + { //more distance checks before calls too, this is just some redundancy + return qfalse; + } if ( PM_InKnockDown( &NPC->client->ps ) ) { return qfalse; @@ -1547,7 +1551,7 @@ static void Jedi_CombatDistance( int enemy_dist ) } else { - if ( Jedi_DecideKick() ) + if ( Jedi_DecideKick() && enemy_dist <= 16 ) {//let's try a kick if ( G_PickAutoMultiKick( NPC, qfalse, qtrue ) != LS_NONE || (G_CanKickEntity(NPC, NPC->enemy ) && G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE ) ) @@ -1670,13 +1674,13 @@ static void Jedi_CombatDistance( int enemy_dist ) ForceAbsorb( NPC ); usedForce = qtrue; } - else if ( (NPC->client->ps.forcePowersKnown&(1<client->ps.forcePowersKnown&(1<client->ps.forcePowersActive&(1< 384 ) @@ -1949,7 +1953,7 @@ static void Jedi_CombatDistance( int enemy_dist ) if ( NPCInfo->stats.aggression < 4 ) {//back off and defend if ( Jedi_DecideKick() ) - {//let's try a kick + {//let's try a kick, only if enemy is at least in striking range by now if ( G_PickAutoMultiKick( NPC, qfalse, qtrue ) != LS_NONE || (G_CanKickEntity(NPC, NPC->enemy ) && G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE ) ) {//kicked! @@ -1978,10 +1982,12 @@ static void Jedi_CombatDistance( int enemy_dist ) //Move forward and back? } } - //if really really mad, rage! + //if really really mad, rage! But less likely if low HP, or if the enemy is far away. if ( NPCInfo->stats.aggression > Q_irand( 5, 15 ) - && NPC->health < NPC->max_health*0.75f - && !Q_irand( 0, 2 ) ) + && ( NPC->health > NPC->max_health*0.5f || !Q_irand(0, 3) ) //if weak, only 25% chance + && !( NPC->health < NPC->max_health*0.25f ) //never if less than 1/4 HP, "too weak" + && !Q_irand( 0, 2 ) + && enemy_dist < 284 ) //can't be really far away { if ( (NPC->client->ps.forcePowersKnown&(1<client->ps.forcePowersActive&(1<enemy )&&G_PickAutoKick( NPC, NPC->enemy, qtrue )!=LS_NONE) + || (G_CanKickEntity(NPC, NPC->enemy )&&G_PickAutoKick( NPC, NPC->enemy, qtrue )!=LS_NONE + && enemy_dist <= 16 ) // lets be close if we're kicking ) ) {//kicked @@ -4357,7 +4364,7 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en if ( !Q_irand( 0, 5 ) || !Jedi_Strafe( 300, 1000, 0, 1000, qfalse ) ) {//certain chance they will pick an alternative evasion //if couldn't strafe, try a different kind of evasion... - if ( Jedi_DecideKick() && G_CanKickEntity(NPC, NPC->enemy ) && G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE ) + if ( Jedi_DecideKick() && G_CanKickEntity(NPC, NPC->enemy ) && G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE && enemy_dist <= 16 ) {//kicked! TIMER_Set( NPC, "kickDebounce", Q_irand( 3000, 10000 ) ); } @@ -6553,9 +6560,11 @@ qboolean Jedi_CheckKataAttack( void ) if ( Q_irand( 0, g_spskill->integer+1 ) //50% chance on easy, 66% on medium, 75% on hard && !Q_irand( 0, 9 ) )//10% chance overall {//base on skill level + if ( enemy_in_striking_range ) //need to actually be close to the enemy + { ucmd.upmove = 0; - VectorClear( NPC->client->ps.moveDir ); - if ( g_saberNewControlScheme->integer ) + VectorClear(NPC->client->ps.moveDir); + if (g_saberNewControlScheme->integer) { ucmd.buttons |= BUTTON_FORCE_FOCUS; } @@ -6565,6 +6574,7 @@ qboolean Jedi_CheckKataAttack( void ) } return qtrue; } + } } } } diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index fc73dac5c1..b57801b71b 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -48,6 +48,7 @@ extern cvar_t *g_saberAnimSpeed; extern cvar_t *g_saberAutoAim; extern cvar_t *g_speederControlScheme; extern cvar_t *g_saberNewControlScheme; +extern cvar_t *g_saberNewCombat; extern qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f ); extern void WP_ForcePowerDrain( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); @@ -544,525 +545,1044 @@ int PM_AnimLevelForSaberAnim( int anim ) return FORCE_LEVEL_0; } -int PM_PowerLevelForSaberAnim( playerState_t *ps, int saberNum ) +int PM_PowerLevelForSaberAnim(playerState_t *ps, int saberNum) { - int anim = ps->torsoAnim; - int animTimeElapsed = PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)anim ) - ps->torsoAnimTimer; - if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_D1_B____ ) - { - //FIXME: these two need their own style - if ( ps->saber[0].type == SABER_LANCE ) - { - return FORCE_LEVEL_4; + if (g_saberNewCombat->integer) + { //new code + int anim = ps->torsoAnim; + int animTimeElapsed = PM_AnimLength(g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)anim) - ps->torsoAnimTimer; + if (anim >= BOTH_A1_T__B_ && anim <= BOTH_D1_B____) + { + //FIXME: these two need their own style + if (ps->saber[0].type == SABER_LANCE) + { + return FORCE_LEVEL_4; + } + else if (ps->saber[0].type == SABER_TRIDENT) + { + return FORCE_LEVEL_3; + } + return FORCE_LEVEL_1; } - else if ( ps->saber[0].type == SABER_TRIDENT ) + if (anim >= BOTH_A2_T__B_ && anim <= BOTH_D2_B____) { return FORCE_LEVEL_3; } - return FORCE_LEVEL_1; - } - if ( anim >= BOTH_A2_T__B_ && anim <= BOTH_D2_B____ ) - { - return FORCE_LEVEL_3; - } - if ( anim >= BOTH_A3_T__B_ && anim <= BOTH_D3_B____ ) - { - return FORCE_LEVEL_5; - } - if ( anim >= BOTH_A4_T__B_ && anim <= BOTH_D4_B____ ) - {//desann - return FORCE_LEVEL_5; - } - if ( anim >= BOTH_A5_T__B_ && anim <= BOTH_D5_B____ ) - {//tavion - return FORCE_LEVEL_2; - } - if ( anim >= BOTH_A6_T__B_ && anim <= BOTH_D6_B____ ) - {//dual - return FORCE_LEVEL_2; - } - if ( anim >= BOTH_A7_T__B_ && anim <= BOTH_D7_B____ ) - {//staff - return FORCE_LEVEL_4; - } - if ( ( anim >= BOTH_P1_S1_T_ && anim <= BOTH_P1_S1_BR ) - || ( anim >= BOTH_P6_S6_T_ && anim <= BOTH_P6_S6_BR ) - || ( anim >= BOTH_P7_S7_T_ && anim <= BOTH_P7_S7_BR ) ) - {//parries - switch ( ps->saberAnimLevel ) + if (anim >= BOTH_A3_T__B_ && anim <= BOTH_D3_B____) { - case SS_STRONG: - case SS_DESANN: return FORCE_LEVEL_5; - break; - case SS_STAFF: - return FORCE_LEVEL_4; - break; - case SS_MEDIUM: - return FORCE_LEVEL_3; - break; - case SS_DUAL: - case SS_TAVION: - return FORCE_LEVEL_2; - break; - case SS_FAST: - return FORCE_LEVEL_1; - break; - default: - return FORCE_LEVEL_0; - break; } - } - if ( ( anim >= BOTH_K1_S1_T_ && anim <= BOTH_K1_S1_BR ) - || ( anim >= BOTH_K6_S6_T_ && anim <= BOTH_K6_S6_BR ) - || ( anim >= BOTH_K7_S7_T_ && anim <= BOTH_K7_S7_BR ) ) - {//knockaways - return FORCE_LEVEL_3; - } - if ( ( anim >= BOTH_V1_BR_S1 && anim <= BOTH_V1_B__S1 ) - || ( anim >= BOTH_V6_BR_S6 && anim <= BOTH_V6_B__S6 ) - || ( anim >= BOTH_V7_BR_S7 && anim <= BOTH_V7_B__S7 ) ) - {//knocked-away attacks - return FORCE_LEVEL_1; - } - if ( ( anim >= BOTH_H1_S1_T_ && anim <= BOTH_H1_S1_BR ) - || ( anim >= BOTH_H6_S6_T_ && anim <= BOTH_H6_S6_BR ) - || ( anim >= BOTH_H7_S7_T_ && anim <= BOTH_H7_S7_BR ) ) - {//broken parries - return FORCE_LEVEL_0; - } - switch ( anim ) - { - case BOTH_A2_STABBACK1: - if ( ps->torsoAnimTimer < 450 ) - {//end of anim - return FORCE_LEVEL_0; - } - else if ( animTimeElapsed < 400 ) - {//beginning of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_3; - break; - case BOTH_ATTACK_BACK: - if ( ps->torsoAnimTimer < 500 ) - {//end of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_3; - break; - case BOTH_CROUCHATTACKBACK1: - if ( ps->torsoAnimTimer < 800 ) - {//end of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_3; - break; - case BOTH_BUTTERFLY_LEFT: - case BOTH_BUTTERFLY_RIGHT: - case BOTH_BUTTERFLY_FL1: - case BOTH_BUTTERFLY_FR1: - //FIXME: break up? - return FORCE_LEVEL_3; - break; - case BOTH_FJSS_TR_BL: - case BOTH_FJSS_TL_BR: - //FIXME: break up? - return FORCE_LEVEL_3; - break; - case BOTH_K1_S1_T_: //# knockaway saber top - case BOTH_K1_S1_TR: //# knockaway saber top right - case BOTH_K1_S1_TL: //# knockaway saber top left - case BOTH_K1_S1_BL: //# knockaway saber bottom left - case BOTH_K1_S1_B_: //# knockaway saber bottom - case BOTH_K1_S1_BR: //# knockaway saber bottom right - //FIXME: break up? - return FORCE_LEVEL_3; - break; - case BOTH_LUNGE2_B__T_: - if ( ps->torsoAnimTimer < 400 ) - {//end of anim - return FORCE_LEVEL_0; + if (anim >= BOTH_A4_T__B_ && anim <= BOTH_D4_B____) + {//desann + return FORCE_LEVEL_5; } - else if ( animTimeElapsed < 150 ) - {//beginning of anim - return FORCE_LEVEL_0; + if (anim >= BOTH_A5_T__B_ && anim <= BOTH_D5_B____) + {//tavion + return FORCE_LEVEL_2; } - return FORCE_LEVEL_3; - break; - case BOTH_FORCELEAP2_T__B_: - if ( ps->torsoAnimTimer < 400 ) - {//end of anim - return FORCE_LEVEL_0; + if (anim >= BOTH_A6_T__B_ && anim <= BOTH_D6_B____) + {//dual + return FORCE_LEVEL_2; } - else if ( animTimeElapsed < 550 ) - {//beginning of anim - return FORCE_LEVEL_0; + if (anim >= BOTH_A7_T__B_ && anim <= BOTH_D7_B____) + {//staff + return FORCE_LEVEL_4; } - return FORCE_LEVEL_3; - break; - case BOTH_VS_ATR_S: - case BOTH_VS_ATL_S: - case BOTH_VT_ATR_S: - case BOTH_VT_ATL_S: - return FORCE_LEVEL_3;//??? - break; - case BOTH_JUMPFLIPSLASHDOWN1: - if ( ps->torsoAnimTimer <= 900 ) - {//end of anim - return FORCE_LEVEL_0; + if ((anim >= BOTH_P1_S1_T_ && anim <= BOTH_P1_S1_BR) + || (anim >= BOTH_P6_S6_T_ && anim <= BOTH_P6_S6_BR) + || (anim >= BOTH_P7_S7_T_ && anim <= BOTH_P7_S7_BR)) + {//parries + switch (ps->saberAnimLevel) + { + case SS_DESANN: + case SS_STRONG: + return FORCE_LEVEL_5; + break; + case SS_STAFF: + return FORCE_LEVEL_4; + break; + case SS_MEDIUM: + return FORCE_LEVEL_3; + break; + case SS_DUAL: + case SS_TAVION: + return FORCE_LEVEL_2; + break; + case SS_FAST: + return FORCE_LEVEL_1; + break; + default: + return FORCE_LEVEL_0; + break; + } } - else if ( animTimeElapsed < 550 ) - {//beginning of anim - return FORCE_LEVEL_0; + if ((anim >= BOTH_K1_S1_T_ && anim <= BOTH_K1_S1_BR) + || (anim >= BOTH_K6_S6_T_ && anim <= BOTH_K6_S6_BR) + || (anim >= BOTH_K7_S7_T_ && anim <= BOTH_K7_S7_BR)) + {//knockaways + return FORCE_LEVEL_3; } - return FORCE_LEVEL_3; - break; - case BOTH_JUMPFLIPSTABDOWN: - if ( ps->torsoAnimTimer <= 1200 ) - {//end of anim - return FORCE_LEVEL_0; + if ((anim >= BOTH_V1_BR_S1 && anim <= BOTH_V1_B__S1) + || (anim >= BOTH_V6_BR_S6 && anim <= BOTH_V6_B__S6) + || (anim >= BOTH_V7_BR_S7 && anim <= BOTH_V7_B__S7)) + {//knocked-away attacks + return FORCE_LEVEL_1; } - else if ( animTimeElapsed <= 250 ) - {//beginning of anim + if ((anim >= BOTH_H1_S1_T_ && anim <= BOTH_H1_S1_BR) + || (anim >= BOTH_H6_S6_T_ && anim <= BOTH_H6_S6_BR) + || (anim >= BOTH_H7_S7_T_ && anim <= BOTH_H7_S7_BR)) + {//broken parries return FORCE_LEVEL_0; } - return FORCE_LEVEL_3; - break; - case BOTH_JUMPATTACK6: - /* - if (pm->ps) + switch (anim) { + case BOTH_A2_STABBACK1: + if (ps->torsoAnimTimer < 450) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_ATTACK_BACK: + if (ps->torsoAnimTimer < 500) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_CROUCHATTACKBACK1: + if (ps->torsoAnimTimer < 800) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + //FIXME: break up? + return FORCE_LEVEL_5; + break; + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + //FIXME: break up? + return FORCE_LEVEL_5; + break; + case BOTH_K1_S1_T_: //# knockaway saber top + case BOTH_K1_S1_TR: //# knockaway saber top right + case BOTH_K1_S1_TL: //# knockaway saber top left + case BOTH_K1_S1_BL: //# knockaway saber bottom left + case BOTH_K1_S1_B_: //# knockaway saber bottom + case BOTH_K1_S1_BR: //# knockaway saber bottom right + //FIXME: break up? + return FORCE_LEVEL_5; + break; + case BOTH_LUNGE2_B__T_: + if (ps->torsoAnimTimer < 400) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 150) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_FORCELEAP2_T__B_: + if (ps->torsoAnimTimer < 400) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 550) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + return FORCE_LEVEL_5;//??? + break; + case BOTH_JUMPFLIPSLASHDOWN1: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 550) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_JUMPFLIPSTABDOWN: + if (ps->torsoAnimTimer <= 1200) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed <= 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_JUMPATTACK6: + /* + if (pm->ps) + { if ( ( pm->ps->legsAnimTimer >= 1450 - && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 400 ) - ||(pm->ps->legsAnimTimer >= 400 - && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 1100 ) ) + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 400 ) + ||(pm->ps->legsAnimTimer >= 400 + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 1100 ) ) {//pretty much sideways - return FORCE_LEVEL_3; + return FORCE_LEVEL_5; + } + } + */ + if ((ps->torsoAnimTimer >= 1450 + && animTimeElapsed >= 400) + || (ps->torsoAnimTimer >= 400 + && animTimeElapsed >= 1100)) + {//pretty much sideways + return FORCE_LEVEL_5; } - } - */ - if ( ( ps->torsoAnimTimer >= 1450 - && animTimeElapsed >= 400 ) - ||(ps->torsoAnimTimer >= 400 - && animTimeElapsed >= 1100 ) ) - {//pretty much sideways - return FORCE_LEVEL_3; - } - return FORCE_LEVEL_0; - break; - case BOTH_JUMPATTACK7: - if ( ps->torsoAnimTimer <= 1200 ) - {//end of anim - return FORCE_LEVEL_0; - } - else if ( animTimeElapsed < 200 ) - {//beginning of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_3; - break; - case BOTH_SPINATTACK6: - if ( animTimeElapsed <= 200 ) - {//beginning of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_3; - break; - case BOTH_SPINATTACK7: - if ( ps->torsoAnimTimer <= 500 ) - {//end of anim - return FORCE_LEVEL_0; - } - else if ( animTimeElapsed < 500 ) - {//beginning of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_3; - break; - case BOTH_FORCELONGLEAP_ATTACK: - if ( animTimeElapsed <= 200 ) - {//1st four frames of anim - return FORCE_LEVEL_3; - } - break; - /* - case BOTH_A7_KICK_F://these kicks attack, too - case BOTH_A7_KICK_B: - case BOTH_A7_KICK_R: - case BOTH_A7_KICK_L: - //FIXME: break up - return FORCE_LEVEL_3; - break; - */ - case BOTH_STABDOWN: - if ( ps->torsoAnimTimer <= 900 ) - {//end of anim - return FORCE_LEVEL_3; - } - break; - case BOTH_STABDOWN_STAFF: - if ( ps->torsoAnimTimer <= 850 ) - {//end of anim - return FORCE_LEVEL_3; - } - break; - case BOTH_STABDOWN_DUAL: - if ( ps->torsoAnimTimer <= 900 ) - {//end of anim - return FORCE_LEVEL_3; - } - break; - case BOTH_A6_SABERPROTECT: - if ( ps->torsoAnimTimer < 650 ) - {//end of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_3; - break; - case BOTH_A7_SOULCAL: - if ( ps->torsoAnimTimer < 650 ) - {//end of anim - return FORCE_LEVEL_0; - } - else if ( animTimeElapsed < 600 ) - {//beginning of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_3; - break; - case BOTH_A1_SPECIAL: - if ( ps->torsoAnimTimer < 600 ) - {//end of anim - return FORCE_LEVEL_0; - } - else if ( animTimeElapsed < 200 ) - {//beginning of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_3; - break; - case BOTH_A2_SPECIAL: - if ( ps->torsoAnimTimer < 300 ) - {//end of anim - return FORCE_LEVEL_0; - } - else if ( animTimeElapsed < 200 ) - {//beginning of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_3; - break; - case BOTH_A3_SPECIAL: - if ( ps->torsoAnimTimer < 700 ) - {//end of anim - return FORCE_LEVEL_0; - } - else if ( animTimeElapsed < 200 ) - {//beginning of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_3; - break; - case BOTH_FLIP_ATTACK7: - return FORCE_LEVEL_3; - break; - case BOTH_PULL_IMPALE_STAB: - if ( ps->torsoAnimTimer < 1000 ) - {//end of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_3; - break; - case BOTH_PULL_IMPALE_SWING: - if ( ps->torsoAnimTimer < 500 )//750 ) - {//end of anim - return FORCE_LEVEL_0; - } - else if ( animTimeElapsed < 650 )//600 ) - {//beginning of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_3; - break; - case BOTH_ALORA_SPIN_SLASH: - if ( ps->torsoAnimTimer < 900 ) - {//end of anim - return FORCE_LEVEL_0; - } - else if ( animTimeElapsed < 250 ) - {//beginning of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_3; - break; - case BOTH_A6_FB: - if ( ps->torsoAnimTimer < 250 ) - {//end of anim - return FORCE_LEVEL_0; - } - else if ( animTimeElapsed < 250 ) - {//beginning of anim return FORCE_LEVEL_0; - } - return FORCE_LEVEL_3; - break; - case BOTH_A6_LR: - if ( ps->torsoAnimTimer < 250 ) - {//end of anim + break; + case BOTH_JUMPATTACK7: + if (ps->torsoAnimTimer <= 1200) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_SPINATTACK6: + if (animTimeElapsed <= 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_SPINATTACK7: + if (ps->torsoAnimTimer <= 500) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 500) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_FORCELONGLEAP_ATTACK: + if (animTimeElapsed <= 200) + {//1st four frames of anim + return FORCE_LEVEL_5; + } + break; + /* + case BOTH_A7_KICK_F://these kicks attack, too + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + //FIXME: break up + return FORCE_LEVEL_5; + break; + */ + case BOTH_STABDOWN: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_5; + } + break; + case BOTH_STABDOWN_STAFF: + if (ps->torsoAnimTimer <= 850) + {//end of anim + return FORCE_LEVEL_5; + } + break; + case BOTH_STABDOWN_DUAL: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_5; + } + break; + case BOTH_A6_SABERPROTECT: + if (ps->torsoAnimTimer < 650) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A7_SOULCAL: + if (ps->torsoAnimTimer < 650) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 600) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A1_SPECIAL: + if (ps->torsoAnimTimer < 600) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A2_SPECIAL: + if (ps->torsoAnimTimer < 300) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A3_SPECIAL: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_FLIP_ATTACK7: + return FORCE_LEVEL_5; + break; + case BOTH_PULL_IMPALE_STAB: + if (ps->torsoAnimTimer < 1000) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_PULL_IMPALE_SWING: + if (ps->torsoAnimTimer < 500)//750 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 650)//600 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_ALORA_SPIN_SLASH: + if (ps->torsoAnimTimer < 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A6_FB: + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A6_LR: + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A7_HILT: return FORCE_LEVEL_0; - } - else if ( animTimeElapsed < 250 ) - {//beginning of anim + break; + //===SABERLOCK SUPERBREAKS START=========================================================================== + case BOTH_LK_S_DL_T_SB_1_W: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_ST_S_SB_1_W: + if (ps->torsoAnimTimer < 300) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + if (ps->torsoAnimTimer < 150) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_DL_T_SB_1_W: + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + if (animTimeElapsed < 1000) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_ST_T_SB_1_W: + if (ps->torsoAnimTimer < 950) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 650) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_S_S_SB_1_W: + if (saberNum != 0) + {//only right hand saber does damage in this suberbreak + return FORCE_LEVEL_0; + } + if (ps->torsoAnimTimer < 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 450) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_S_T_SB_1_W: + if (saberNum != 0) + {//only right hand saber does damage in this suberbreak + return FORCE_LEVEL_0; + } + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 150) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_DL_S_SB_1_W: + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_DL_T_SB_1_W: + //special suberbreak - doesn't kill, just kicks them backwards return FORCE_LEVEL_0; + break; + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + if (ps->torsoAnimTimer < 800) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 350) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + return FORCE_LEVEL_5; + break; + //===SABERLOCK SUPERBREAKS START=========================================================================== + case BOTH_HANG_ATTACK: + //FIME: break up + if (ps->torsoAnimTimer < 1000) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + else + {//sweet spot + return FORCE_LEVEL_5; + } + break; + case BOTH_ROLL_STAB: + if (animTimeElapsed > 400) + {//end of anim + return FORCE_LEVEL_0; + } + else + { + return FORCE_LEVEL_5; + } + break; } - return FORCE_LEVEL_3; - break; - case BOTH_A7_HILT: return FORCE_LEVEL_0; - break; -//===SABERLOCK SUPERBREAKS START=========================================================================== - case BOTH_LK_S_DL_T_SB_1_W: - if ( ps->torsoAnimTimer < 700 ) - {//end of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_5; - break; - case BOTH_LK_S_ST_S_SB_1_W: - if ( ps->torsoAnimTimer < 300 ) - {//end of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_5; - break; - case BOTH_LK_S_DL_S_SB_1_W: - case BOTH_LK_S_S_S_SB_1_W: - if ( ps->torsoAnimTimer < 700 ) - {//end of anim - return FORCE_LEVEL_0; - } - else if ( animTimeElapsed < 400 ) - {//beginning of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_5; - break; - case BOTH_LK_S_ST_T_SB_1_W: - case BOTH_LK_S_S_T_SB_1_W: - if ( ps->torsoAnimTimer < 150 ) - {//end of anim - return FORCE_LEVEL_0; - } - else if ( animTimeElapsed < 400 ) - {//beginning of anim - return FORCE_LEVEL_0; - } - return FORCE_LEVEL_5; - break; - case BOTH_LK_DL_DL_T_SB_1_W: - return FORCE_LEVEL_5; - break; - case BOTH_LK_DL_DL_S_SB_1_W: - case BOTH_LK_DL_ST_S_SB_1_W: - if ( animTimeElapsed < 1000 ) - {//beginning of anim - return FORCE_LEVEL_0; + } + else + { //old code + int anim = ps->torsoAnim; + int animTimeElapsed = PM_AnimLength(g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)anim) - ps->torsoAnimTimer; + if (anim >= BOTH_A1_T__B_ && anim <= BOTH_D1_B____) + { + //FIXME: these two need their own style + if (ps->saber[0].type == SABER_LANCE) + { + return FORCE_LEVEL_4; + } + else if (ps->saber[0].type == SABER_TRIDENT) + { + return FORCE_LEVEL_3; + } + return FORCE_LEVEL_1; } - return FORCE_LEVEL_5; - break; - case BOTH_LK_DL_ST_T_SB_1_W: - if ( ps->torsoAnimTimer < 950 ) - {//end of anim - return FORCE_LEVEL_0; + if (anim >= BOTH_A2_T__B_ && anim <= BOTH_D2_B____) + { + return FORCE_LEVEL_3; } - else if ( animTimeElapsed < 650 ) - {//beginning of anim - return FORCE_LEVEL_0; + if (anim >= BOTH_A3_T__B_ && anim <= BOTH_D3_B____) + { + return FORCE_LEVEL_5; } - return FORCE_LEVEL_5; - break; - case BOTH_LK_DL_S_S_SB_1_W: - if ( saberNum != 0 ) - {//only right hand saber does damage in this suberbreak - return FORCE_LEVEL_0; + if (anim >= BOTH_A4_T__B_ && anim <= BOTH_D4_B____) + {//desann + return FORCE_LEVEL_5; } - if ( ps->torsoAnimTimer < 900 ) - {//end of anim - return FORCE_LEVEL_0; + if (anim >= BOTH_A5_T__B_ && anim <= BOTH_D5_B____) + {//tavion + return FORCE_LEVEL_2; } - else if ( animTimeElapsed < 450 ) - {//beginning of anim - return FORCE_LEVEL_0; + if (anim >= BOTH_A6_T__B_ && anim <= BOTH_D6_B____) + {//dual + return FORCE_LEVEL_2; } - return FORCE_LEVEL_5; - break; - case BOTH_LK_DL_S_T_SB_1_W: - if ( saberNum != 0 ) - {//only right hand saber does damage in this suberbreak - return FORCE_LEVEL_0; + if (anim >= BOTH_A7_T__B_ && anim <= BOTH_D7_B____) + {//staff + return FORCE_LEVEL_4; } - if ( ps->torsoAnimTimer < 250 ) - {//end of anim - return FORCE_LEVEL_0; + if ((anim >= BOTH_P1_S1_T_ && anim <= BOTH_P1_S1_BR) + || (anim >= BOTH_P6_S6_T_ && anim <= BOTH_P6_S6_BR) + || (anim >= BOTH_P7_S7_T_ && anim <= BOTH_P7_S7_BR)) + {//parries + switch (ps->saberAnimLevel) + { + case SS_STRONG: + case SS_DESANN: + return FORCE_LEVEL_3; + break; + case SS_TAVION: + case SS_STAFF: + case SS_DUAL: + case SS_MEDIUM: + return FORCE_LEVEL_2; + break; + case SS_FAST: + return FORCE_LEVEL_1; + break; + default: + return FORCE_LEVEL_0; + break; + } } - else if ( animTimeElapsed < 150 ) - {//beginning of anim - return FORCE_LEVEL_0; + if ((anim >= BOTH_K1_S1_T_ && anim <= BOTH_K1_S1_BR) + || (anim >= BOTH_K6_S6_T_ && anim <= BOTH_K6_S6_BR) + || (anim >= BOTH_K7_S7_T_ && anim <= BOTH_K7_S7_BR)) + {//knockaways + return FORCE_LEVEL_3; } - return FORCE_LEVEL_5; - break; - case BOTH_LK_ST_DL_S_SB_1_W: - return FORCE_LEVEL_5; - break; - case BOTH_LK_ST_DL_T_SB_1_W: - //special suberbreak - doesn't kill, just kicks them backwards - return FORCE_LEVEL_0; - break; - case BOTH_LK_ST_ST_S_SB_1_W: - case BOTH_LK_ST_S_S_SB_1_W: - if ( ps->torsoAnimTimer < 800 ) - {//end of anim - return FORCE_LEVEL_0; + if ((anim >= BOTH_V1_BR_S1 && anim <= BOTH_V1_B__S1) + || (anim >= BOTH_V6_BR_S6 && anim <= BOTH_V6_B__S6) + || (anim >= BOTH_V7_BR_S7 && anim <= BOTH_V7_B__S7)) + {//knocked-away attacks + return FORCE_LEVEL_1; } - else if ( animTimeElapsed < 350 ) - {//beginning of anim + if ((anim >= BOTH_H1_S1_T_ && anim <= BOTH_H1_S1_BR) + || (anim >= BOTH_H6_S6_T_ && anim <= BOTH_H6_S6_BR) + || (anim >= BOTH_H7_S7_T_ && anim <= BOTH_H7_S7_BR)) + {//broken parries return FORCE_LEVEL_0; } - return FORCE_LEVEL_5; - break; - case BOTH_LK_ST_ST_T_SB_1_W: - case BOTH_LK_ST_S_T_SB_1_W: - return FORCE_LEVEL_5; - break; -//===SABERLOCK SUPERBREAKS START=========================================================================== - case BOTH_HANG_ATTACK: - //FIME: break up - if ( ps->torsoAnimTimer < 1000 ) - {//end of anim + switch (anim) + { + case BOTH_A2_STABBACK1: + if (ps->torsoAnimTimer < 450) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_ATTACK_BACK: + if (ps->torsoAnimTimer < 500) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_CROUCHATTACKBACK1: + if (ps->torsoAnimTimer < 800) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + //FIXME: break up? + return FORCE_LEVEL_3; + break; + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + //FIXME: break up? + return FORCE_LEVEL_3; + break; + case BOTH_K1_S1_T_: //# knockaway saber top + case BOTH_K1_S1_TR: //# knockaway saber top right + case BOTH_K1_S1_TL: //# knockaway saber top left + case BOTH_K1_S1_BL: //# knockaway saber bottom left + case BOTH_K1_S1_B_: //# knockaway saber bottom + case BOTH_K1_S1_BR: //# knockaway saber bottom right + //FIXME: break up? + return FORCE_LEVEL_3; + break; + case BOTH_LUNGE2_B__T_: + if (ps->torsoAnimTimer < 400) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 150) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_FORCELEAP2_T__B_: + if (ps->torsoAnimTimer < 400) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 550) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + return FORCE_LEVEL_3;//??? + break; + case BOTH_JUMPFLIPSLASHDOWN1: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 550) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_JUMPFLIPSTABDOWN: + if (ps->torsoAnimTimer <= 1200) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed <= 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_JUMPATTACK6: + /* + if (pm->ps) + { + if ( ( pm->ps->legsAnimTimer >= 1450 + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 400 ) + ||(pm->ps->legsAnimTimer >= 400 + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 1100 ) ) + {//pretty much sideways + return FORCE_LEVEL_3; + } + } + */ + if ((ps->torsoAnimTimer >= 1450 + && animTimeElapsed >= 400) + || (ps->torsoAnimTimer >= 400 + && animTimeElapsed >= 1100)) + {//pretty much sideways + return FORCE_LEVEL_3; + } return FORCE_LEVEL_0; - } - else if ( animTimeElapsed < 250 ) - {//beginning of anim + break; + case BOTH_JUMPATTACK7: + if (ps->torsoAnimTimer <= 1200) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_SPINATTACK6: + if (animTimeElapsed <= 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_SPINATTACK7: + if (ps->torsoAnimTimer <= 500) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 500) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_FORCELONGLEAP_ATTACK: + if (animTimeElapsed <= 200) + {//1st four frames of anim + return FORCE_LEVEL_3; + } + break; + /* + case BOTH_A7_KICK_F://these kicks attack, too + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + //FIXME: break up + return FORCE_LEVEL_3; + break; + */ + case BOTH_STABDOWN: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_3; + } + break; + case BOTH_STABDOWN_STAFF: + if (ps->torsoAnimTimer <= 850) + {//end of anim + return FORCE_LEVEL_3; + } + break; + case BOTH_STABDOWN_DUAL: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_3; + } + break; + case BOTH_A6_SABERPROTECT: + if (ps->torsoAnimTimer < 650) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A7_SOULCAL: + if (ps->torsoAnimTimer < 650) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 600) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A1_SPECIAL: + if (ps->torsoAnimTimer < 600) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A2_SPECIAL: + if (ps->torsoAnimTimer < 300) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A3_SPECIAL: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_FLIP_ATTACK7: + return FORCE_LEVEL_3; + break; + case BOTH_PULL_IMPALE_STAB: + if (ps->torsoAnimTimer < 1000) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_PULL_IMPALE_SWING: + if (ps->torsoAnimTimer < 500)//750 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 650)//600 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_ALORA_SPIN_SLASH: + if (ps->torsoAnimTimer < 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A6_FB: + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A6_LR: + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A7_HILT: return FORCE_LEVEL_0; - } - else - {//sweet spot + break; + //===SABERLOCK SUPERBREAKS START=========================================================================== + case BOTH_LK_S_DL_T_SB_1_W: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } return FORCE_LEVEL_5; - } - break; - case BOTH_ROLL_STAB: - if ( animTimeElapsed > 400 ) - {//end of anim + break; + case BOTH_LK_S_ST_S_SB_1_W: + if (ps->torsoAnimTimer < 300) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + if (ps->torsoAnimTimer < 150) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_DL_T_SB_1_W: + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + if (animTimeElapsed < 1000) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_ST_T_SB_1_W: + if (ps->torsoAnimTimer < 950) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 650) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_S_S_SB_1_W: + if (saberNum != 0) + {//only right hand saber does damage in this suberbreak + return FORCE_LEVEL_0; + } + if (ps->torsoAnimTimer < 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 450) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_S_T_SB_1_W: + if (saberNum != 0) + {//only right hand saber does damage in this suberbreak + return FORCE_LEVEL_0; + } + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 150) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_DL_S_SB_1_W: + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_DL_T_SB_1_W: + //special suberbreak - doesn't kill, just kicks them backwards return FORCE_LEVEL_0; + break; + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + if (ps->torsoAnimTimer < 800) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 350) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + return FORCE_LEVEL_5; + break; + //===SABERLOCK SUPERBREAKS START=========================================================================== + case BOTH_HANG_ATTACK: + //FIME: break up + if (ps->torsoAnimTimer < 1000) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + else + {//sweet spot + return FORCE_LEVEL_5; + } + break; + case BOTH_ROLL_STAB: + if (animTimeElapsed > 400) + {//end of anim + return FORCE_LEVEL_0; + } + else + { + return FORCE_LEVEL_3; + } + break; } - else - { - return FORCE_LEVEL_3; - } - break; + return FORCE_LEVEL_0; } - return FORCE_LEVEL_0; } qboolean PM_InAnimForSaberMove( int anim, int saberMove ) @@ -2060,14 +2580,22 @@ qboolean PM_SaberKataDone( int curmove = LS_NONE, int newmove = LS_NONE ) } } } - else + else if ( g_saberNewCombat->integer ) //new code {//FIXME: have chainAngle influence fast and medium chains as well? - if ( (pm->ps->saberAnimLevel == FORCE_LEVEL_2 || pm->ps->saberAnimLevel == SS_DUAL) + if ( (pm->ps->saberAnimLevel == FORCE_LEVEL_3 || pm->ps->saberAnimLevel == SS_DUAL) && pm->ps->saberAttackChainCount > Q_irand( 2, 5 ) ) { return qtrue; } } + else //old code + {//FIXME: have chainAngle influence fast and medium chains as well? + if ((pm->ps->saberAnimLevel == FORCE_LEVEL_2 || pm->ps->saberAnimLevel == SS_DUAL) + && pm->ps->saberAttackChainCount > Q_irand(2, 5)) + { + return qtrue; + } + } return qfalse; } @@ -2152,8 +2680,8 @@ saberMoveName_t PM_PickBackStab( void ) return LS_A_BACK; } } - else if ( pm->ps->saberAnimLevel == FORCE_LEVEL_2 - || pm->ps->saberAnimLevel == SS_DUAL ) + else if ( (pm->ps->saberAnimLevel == FORCE_LEVEL_3 + || pm->ps->saberAnimLevel == SS_DUAL) && g_saberNewCombat->integer ) //new code {//using medium attacks or dual sabers if ( pm->ps->pm_flags & PMF_DUCKED ) { @@ -2164,6 +2692,18 @@ saberMoveName_t PM_PickBackStab( void ) return LS_A_BACK; } } + else if (pm->ps->saberAnimLevel == FORCE_LEVEL_2 + || pm->ps->saberAnimLevel == SS_DUAL) //old code + {//using medium attacks or dual sabers + if (pm->ps->pm_flags & PMF_DUCKED) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } else { return LS_A_BACKSTAB; @@ -4520,14 +5060,28 @@ void PM_SaberStartTransAnim( int saberAnimLevel, int anim, float *animSpeed, gen anim <= BOTH_T3_BL_TL ) || ( anim >= BOTH_T5_BR__R && anim <= BOTH_T5_BL_TL ) ) - { - if ( saberAnimLevel == FORCE_LEVEL_1 || saberAnimLevel == FORCE_LEVEL_5 ) - {//FIXME: should not be necc for FORCE_LEVEL_1's - *animSpeed *= 1.5; + { //what is this doing here exactly? + if ( g_saberNewCombat->integer ) //new code + { + if (saberAnimLevel == FORCE_LEVEL_1 /*|| saberAnimLevel == FORCE_LEVEL_5*/) + {//FIXME: should not be necc for FORCE_LEVEL_1's + *animSpeed *= 1.5; + } + else if (saberAnimLevel == FORCE_LEVEL_5) + { //both Desann and Strong styles suffer some transition speed penalty or something? + *animSpeed *= 0.75; + } } - else if ( saberAnimLevel == FORCE_LEVEL_3 ) + else //old code { - *animSpeed *= 0.75; + if (saberAnimLevel == FORCE_LEVEL_1 || saberAnimLevel == FORCE_LEVEL_5) + {//FIXME: should not be necc for FORCE_LEVEL_1's + *animSpeed *= 1.5; + } + else if (saberAnimLevel == FORCE_LEVEL_3) + { + *animSpeed *= 0.75; + } } } } diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index 83c5842bd4..0119a46e54 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -43,6 +43,8 @@ extern void WP_SaberReflectCheck( gentity_t *self, usercmd_t *ucmd ); extern void WP_SaberUpdate( gentity_t *self, usercmd_t *ucmd ); extern void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ); extern void WP_ForcePowersUpdate( gentity_t *self, usercmd_t *ucmd ); +extern void WP_BlockPointsRegenerate( gentity_t *self ); + extern gentity_t *SeekerAcquiresTarget ( gentity_t *ent, vec3_t pos ); extern void FireSeeker( gentity_t *owner, gentity_t *target, vec3_t origin, vec3_t dir ); extern qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f ); @@ -5277,6 +5279,8 @@ extern cvar_t *g_skippingcin; WP_ForcePowersUpdate( ent, ucmd ); + WP_BlockPointsRegenerate( ent ); + //if we have the saber in hand, check for starting a block to reflect shots if ( ent->s.number < MAX_CLIENTS//player || ( ent->NPC && G_JediInNormalAI( ent ) ) )//NPC jedi not in a special AI mode diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index fac033fa32..386ca86cce 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -835,48 +835,6 @@ static void Player_RestoreFromPrevLevel(gentity_t *ent, SavedGameJustLoaded_e eS client->ps.forceGripEntityNum = client->ps.forceDrainEntityNum = ENTITYNUM_NONE; } - - - // if we're in DEMO mode read in the forcepowers from the - // demo cvar, even though we already might have read in something from above - if(eSavedGameJustLoaded == eNO && gi.Cvar_VariableIntegerValue("com_demo") ) - { - // the new JK2 stuff - force powers, etc... - // - gi.Cvar_VariableStringBuffer( "demo_playerfplvl", s, sizeof(s) ); - int j=0; - var = strtok( s, " " ); - while( var != NULL ) - { - /* While there are tokens in "s" */ - client->ps.forcePowerLevel[j] = atoi(var); - if( client->ps.forcePowerLevel[j] ) - { - client->ps.forcePowersKnown |= (1 << j ); - } - j++; - /* Get next token: */ - var = strtok( NULL, " " ); - } - assert (j==NUM_FORCE_POWERS); - - client->ps.forceGripEntityNum = client->ps.forceDrainEntityNum = ENTITYNUM_NONE; - - // now do weapons - gi.Cvar_VariableStringBuffer( "demo_playerwpns", s, sizeof(s) ); - - client->ps.stats[STAT_WEAPONS] = atoi(s); - - for(j=0 ; jps.stats[STAT_WEAPONS] & (1<ps.ammo[weaponData[j].ammoIndex] = ammoData[weaponData[j].ammoIndex].max; - } - } - - } } } diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 5c38fb3bef..b0b1e11d7a 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -199,8 +199,16 @@ cvar_t *g_saberDarkSideSaberColor; //new cvars - Dusty cvar_t *g_saberNewCombat; -cvar_t *g_char_forcepoints; cvar_t *g_saberLocksEnabled; +cvar_t *g_saberDmgScale; +cvar_t *g_saberWalkAnims; + +cvar_t *g_char_forcepoints; +cvar_t *g_char_ParryBonus; +cvar_t *g_char_BreakParryBonus; +cvar_t *g_char_ForceAffinity; +cvar_t *g_char_ForceFocus; +cvar_t *g_char_ForceSensitivity; // kef -- used with DebugTraceForNPC @@ -645,7 +653,7 @@ void G_InitCvars( void ) { com_buildScript = gi.cvar ("com_buildscript", "0", 0); g_saberAutoBlocking = gi.cvar( "g_saberAutoBlocking", "1", CVAR_CHEAT );//must press +block button to do any blocking - g_saberRealisticCombat = gi.cvar( "g_saberMoreRealistic", "0", CVAR_CHEAT );//makes collision more precise, increases damage + g_saberRealisticCombat = gi.cvar( "g_saberMoreRealistic", "0", CVAR_SAVEGAME | CVAR_CHEAT );//makes collision more precise, increases damage debug_subdivision = gi.cvar( "debug_subdivision", "0", CVAR_CHEAT|CVAR_INIT );//debug for dismemberment g_dismemberProbabilities = gi.cvar ( "g_dismemberProbabilities", "1", CVAR_CHEAT );//0 = ignore probabilities, 1 = use probabilities g_saberDamageCapping = gi.cvar( "g_saberDamageCapping", "1", CVAR_CHEAT );//caps damage of sabers vs players and NPC who use sabers @@ -693,7 +701,8 @@ void G_InitCvars( void ) { //new cvars yay - Dusty g_saberNewCombat = gi.cvar("g_saberNewCombat", "1", CVAR_ARCHIVE | CVAR_CHEAT); g_saberLocksEnabled = gi.cvar("g_saberLocksEnabled", "1", CVAR_ARCHIVE | CVAR_CHEAT); - g_char_forcepoints = gi.cvar("g_char_forcepoints", "100", CVAR_ARCHIVE | CVAR_CHEAT | CVAR_SAVEGAME ); + g_saberDmgScale = gi.cvar("g_saberDamageScale", "1", CVAR_SAVEGAME | CVAR_CHEAT); + g_char_forcepoints = gi.cvar("g_char_forcepoints", "100", CVAR_CHEAT | CVAR_SAVEGAME ); } /* ============ diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 6575b4a8c4..9366386c0f 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -677,6 +677,11 @@ Ghoul2 Insert End int pushDebounceTime; int aimDebounceTime; int useDebounceTime; + //new variables + int saberReactivateTime; //time after something deactivates a saber for AI to turn it back on + int breakLimit; + int breakRecoveryTime; //how long left to recover a defense point + int breakCounter; //keeping track of how many strong attacks the defender blocks in a //a short time period //Unions for miscellaneous fields used under very specific circumstances union diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 938ea5e8eb..4c6633c01e 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -45,6 +45,7 @@ static float sabersCrossed; static int saberHitEntity; static int numVictims = 0; + extern cvar_t *g_sex; extern cvar_t *g_timescale; extern cvar_t *g_dismemberment; @@ -68,7 +69,7 @@ extern void G_AddVoiceEvent( gentity_t *self, int event, int speakDebounceTime ) extern void CG_ChangeWeapon( int num ); extern void CG_SaberDoWeaponHitMarks( gclient_t *client, gentity_t *saberEnt, gentity_t *hitEnt, int saberNum, int bladeNum, vec3_t hitPos, vec3_t hitDir, vec3_t uaxis, vec3_t splashBackDir, float sizeTimeScale ); extern void G_AngerAlert( gentity_t *self ); -extern void G_ReflectMissile( gentity_t *ent, gentity_t *missile, vec3_t forward ); +extern void G_ReflectMissile(gentity_t *ent, gentity_t *missile, vec3_t forward, forcePowers_t powerToUse); extern int G_CheckLedgeDive( gentity_t *self, float checkDist, const vec3_t checkVel, qboolean tryOpposite, qboolean tryPerp ); extern void G_BounceMissile( gentity_t *ent, trace_t *trace ); extern qboolean G_PointInBounds( const vec3_t point, const vec3_t mins, const vec3_t maxs ); @@ -160,16 +161,20 @@ extern cvar_t *g_saberRealisticCombat; extern cvar_t *g_saberDamageCapping; extern cvar_t *g_saberNewControlScheme; extern cvar_t *g_saberNewCombat; -extern cvar_t *g_saberLocksEnabled; //Dusty, new cvar, hopefully I declared it in g_main.cpp correctly +extern cvar_t *g_saberLocksEnabled; +extern cvar_t *g_saberDmgScale; extern int g_crosshairEntNum; qboolean g_saberNoEffects = qfalse; qboolean g_noClashFlare = qfalse; int g_saberFlashTime = 0; -int hitOwnerBreakLimit; -int hitOwnerRecoveryTime; //how long left to recover a defense point -int hitOwnerRecoveryInterval = 1500; //interval at which defense points are recovered, 1.5 seconds -int hitOwnerBreakCounter; //keeping track of how many strong attacks the defender blocks in a short time period + +//new variables - Dusty +const int hitOwnerRecoveryInterval = 1500; //interval at which defense points are recovered, 1.5 seconds +/*extern int hitOwnerBreakLimit; +extern int hitOwnerRecoveryTime; //how long left to recover a defense point +extern int hitOwnerBreakCounter; //keeping track of how many strong attacks the defender blocks in a //a short time period*/ + vec3_t g_saberFlashPos = {0,0,0}; int forcePowerDarkLight[NUM_FORCE_POWERS] = //0 == neutral @@ -227,9 +232,9 @@ float forceJumpStrength[NUM_FORCE_POWER_LEVELS] = float forceJumpHeight[NUM_FORCE_POWER_LEVELS] = { 32,//normal jump (+stepheight+crouchdiff = 66) - 96,//(+stepheight+crouchdiff = 130) - 192,//(+stepheight+crouchdiff = 226) - 384//(+stepheight+crouchdiff = 418) + 96*1.25,//(+stepheight+crouchdiff = 130) + 192*1.25,//(+stepheight+crouchdiff = 226) + 384*1.25//(+stepheight+crouchdiff = 418) //384 }; float forceJumpHeightMax[NUM_FORCE_POWER_LEVELS] = @@ -237,7 +242,7 @@ float forceJumpHeightMax[NUM_FORCE_POWER_LEVELS] = 66,//normal jump (32+stepheight(18)+crouchdiff(24) = 74) 130,//(96+stepheight(18)+crouchdiff(24) = 138) 226,//(192+stepheight(18)+crouchdiff(24) = 234) - 418//(384+stepheight(18)+crouchdiff(24) = 426) + 418//(384+stepheight(18)+crouchdiff(24) = 426) //418 }; float forcePushPullRadius[NUM_FORCE_POWER_LEVELS] = @@ -4579,7 +4584,7 @@ void WP_SaberDamageTrace( gentity_t *ent, int saberNum, int bladeNum ) if ( g_saberNewCombat->integer ) //new code start { int stylePowerModifier = 0; - int stylePowerLevel = PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum); + int stylePowerLevel = PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum); //this here should account for special moves now correctly /*Power level base numbers instead of being 1,2, and 3 now are doubled. And Saber Offense is the main determinant. Saber Offense - @@ -4606,14 +4611,14 @@ if ( g_saberNewCombat->integer ) //new code start case 4: stylePowerModifier = 1; break; - case 5: + case 5: //special attacks count as this in bg_panimate stylePowerModifier = 2; break; } if (PM_SaberInTransitionAny(ent->client->ps.saberMove)) // if in a transition that still counts as attacking for stronger styles, but this is so you're not as strong quite as a regular slash { - stylePowerLevel -= 1; + stylePowerLevel -= 2; } if (ent->client->NPC_class == CLASS_SABER_DROID) //FIXME D: saber droids do their own thing... they need to be incorporated into this system I suppose? { @@ -4625,12 +4630,13 @@ if ( g_saberNewCombat->integer ) //new code start } if (PM_SaberInSpecialAttack(ent->client->ps.saberMove)) //now for special moves - { + { //special moves get a 2nd boost on top of the one in bg_panimate entPowerLevel += 2; - } + } + //now for modifiers based on any enhancement powers active if (!ent->s.number && (ent->client->ps.forcePowersActive&(1 << FP_SPEED))) - { + { //min power bonus is +1, max bonus is +3 entPowerLevel += 1 * ent->client->ps.forcePowerLevel[FP_SPEED]; } @@ -4641,9 +4647,9 @@ if ( g_saberNewCombat->integer ) //new code start entPowerLevel -= 2; } else if (ent->client->ps.forcePowersActive & (1 << FP_RAGE)) - { + { //min power bonus is +2, max is +4, slightly more than Speed 3 - entPowerLevel += ((ent->client->ps.forcePowerLevel[FP_RAGE] * 1) + 1); + entPowerLevel += ent->client->ps.forcePowerLevel[FP_RAGE] + 1; } } @@ -4801,39 +4807,98 @@ else //Dusty, old code start. //FIXME: more damage for higher attack power levels? // More damage based on length/color of saber? //FIXME: Desann does double damage? - if ( g_saberRealisticCombat->integer ) + if (g_saberNewCombat->integer) //new code { - switch ( entPowerLevel ) + float saberDmgMultiplier = g_saberDmgScale->value; + + if (g_saberRealisticCombat->integer) { - default: - case FORCE_LEVEL_3: - baseDamage = 10.0f; - break; - case FORCE_LEVEL_2: - baseDamage = 5.0f; - break; - case FORCE_LEVEL_0: - case FORCE_LEVEL_1: - baseDamage = 2.5f; - break; + switch ((ent->client->ps.saberAnimLevel)) + { + default: + case FORCE_LEVEL_5: + baseDamage = 10.0f * saberDmgMultiplier; + break; + case FORCE_LEVEL_4: //Staff, medium, duals all do same damage + case FORCE_LEVEL_3: + case FORCE_LEVEL_2: + baseDamage = 5.0f * saberDmgMultiplier; + break; + case FORCE_LEVEL_0: + case FORCE_LEVEL_1: //FIXME: Fast damage is so low... + baseDamage = 2.5f * saberDmgMultiplier; + break; + } } - } - else - { - if ( g_spskill->integer > 0 - && ent->s.number < MAX_CLIENTS - && ( ent->client->ps.torsoAnim == BOTH_ROLL_STAB + else + { + if (g_spskill->integer > 0 + && ent->s.number < MAX_CLIENTS + && (ent->client->ps.torsoAnim == BOTH_ROLL_STAB || ent->client->ps.torsoAnim == BOTH_SPINATTACK6 || ent->client->ps.torsoAnim == BOTH_SPINATTACK7 - || ent->client->ps.torsoAnim == BOTH_LUNGE2_B__T_ ) ) - {//*sigh*, these anim do less damage since they're so easy to do - baseDamage = 2.5f; + || ent->client->ps.torsoAnim == BOTH_LUNGE2_B__T_)) + {//*sigh*, these anim do less damage since they're so easy to do + baseDamage = 2.5f; + } + else + { + switch ((ent->client->ps.saberAnimLevel)) + { + default: + case FORCE_LEVEL_5: + baseDamage = 7.5f * saberDmgMultiplier; + break; + case FORCE_LEVEL_4: //Staff, medium, duals all do same damage + case FORCE_LEVEL_3: + case FORCE_LEVEL_2: + baseDamage = 5.0f * saberDmgMultiplier; + break; + case FORCE_LEVEL_0: + case FORCE_LEVEL_1: //FIXME: Fast damage is so low... + baseDamage = 2.5f * saberDmgMultiplier; + break; + } + } + } + } + else //old code + { + if (g_saberRealisticCombat->integer) + { + switch (entPowerLevel) + { + default: + case FORCE_LEVEL_3: + baseDamage = 10.0f; + break; + case FORCE_LEVEL_2: + baseDamage = 5.0f; + break; + case FORCE_LEVEL_0: + case FORCE_LEVEL_1: + baseDamage = 2.5f; + break; + } } else { - baseDamage = 2.5f * (float)entPowerLevel; + if (g_spskill->integer > 0 + && ent->s.number < MAX_CLIENTS + && (ent->client->ps.torsoAnim == BOTH_ROLL_STAB + || ent->client->ps.torsoAnim == BOTH_SPINATTACK6 + || ent->client->ps.torsoAnim == BOTH_SPINATTACK7 + || ent->client->ps.torsoAnim == BOTH_LUNGE2_B__T_)) + {//*sigh*, these anim do less damage since they're so easy to do + baseDamage = 2.5f; + } + else + { + baseDamage = 2.5f * (float)entPowerLevel; + } } } + } else {//saber is transitioning, defending or idle, don't do as much damage @@ -5170,7 +5235,7 @@ if ( g_saberNewCombat->integer ) //Dusty, new code start. if ( hitOwner && hitOwner->client ) { hitOwnerPowerLevel = 2 * hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; - hitOwnerBreakLimit = hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; + hitOwner->breakLimit = hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; } } else @@ -5266,12 +5331,12 @@ else entDefending = qtrue; } - if (ent->client->ps.torsoAnim == BOTH_A1_SPECIAL + /*if (ent->client->ps.torsoAnim == BOTH_A1_SPECIAL || ent->client->ps.torsoAnim == BOTH_A2_SPECIAL || ent->client->ps.torsoAnim == BOTH_A3_SPECIAL) {//parry/block/break-parry bonus for single-style kata moves entPowerLevel += 2; - } + }*/ if (entAttacking) //I'm removing all two-handed power bonuses, now it's purely for force power stuff - Dusty {//add twoHanded bonus and breakParryBonus to entPowerLevel here //This makes staff too powerful @@ -5317,12 +5382,12 @@ else hitOwnerDefending = qtrue; } - if (hitOwner->client->ps.torsoAnim == BOTH_A1_SPECIAL + /*if (hitOwner->client->ps.torsoAnim == BOTH_A1_SPECIAL || hitOwner->client->ps.torsoAnim == BOTH_A2_SPECIAL || hitOwner->client->ps.torsoAnim == BOTH_A3_SPECIAL) {//parry/block/break-parry bonus for single-style kata moves hitOwnerPowerLevel += 2; - } + }*/ if (hitOwnerAttacking) {//add twoHanded bonus and breakParryBonus to entPowerLevel here /*if ((hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED)) @@ -5364,11 +5429,11 @@ else && !Q_irand(0, g_saberLockRandomNess->integer) && (g_debugSaberLock->integer || forceLock || entPowerLevel == hitOwnerPowerLevel - || (entPowerLevel > FORCE_LEVEL_2 && hitOwnerPowerLevel > FORCE_LEVEL_2) - || (entPowerLevel < FORCE_LEVEL_3 && hitOwnerPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && Q_irand(0, 3)) - || (entPowerLevel < FORCE_LEVEL_2 && hitOwnerPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && Q_irand(0, 2)) - || (hitOwnerPowerLevel < FORCE_LEVEL_3 && entPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && !Q_irand(0, 1)) - || (hitOwnerPowerLevel < FORCE_LEVEL_2 && entPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && !Q_irand(0, 1))) + || (entPowerLevel > 6 && hitOwnerPowerLevel > 6) + || (entPowerLevel < 6 && hitOwnerPowerLevel < 6 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && Q_irand(0, 3)) + || (entPowerLevel < 4 && hitOwnerPowerLevel < 6 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && Q_irand(0, 2)) + || (hitOwnerPowerLevel < 6 && entPowerLevel < 6 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && !Q_irand(0, 1)) + || (hitOwnerPowerLevel < 6 && entPowerLevel < 4 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && !Q_irand(0, 1))) && WP_SabersCheckLock(ent, hitOwner)) { collisionResolved = qtrue; @@ -5379,9 +5444,9 @@ else && !Q_irand(0, g_saberLockRandomNess->integer * 3) && (g_debugSaberLock->integer || forceLock || ((ent->client->ps.saberMove != LS_READY || (hitOwnerPowerLevel - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand(-6, 0)) - && ((hitOwnerPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) || - (hitOwnerPowerLevel < FORCE_LEVEL_2 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) || - (hitOwnerPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (hitOwnerPowerLevel - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) + && ((hitOwnerPowerLevel < 6 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) || + (hitOwnerPowerLevel < 4 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) || + (hitOwnerPowerLevel < 6 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (hitOwnerPowerLevel - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) && WP_SabersCheckLock(hitOwner, ent)) { collisionResolved = qtrue; @@ -5394,16 +5459,16 @@ else && activeDefense && (g_debugSaberLock->integer || forceLock || ((hitOwner->client->ps.saberMove != LS_READY || (entPowerLevel - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand(-6, 0)) - && ((entPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) - || (entPowerLevel < FORCE_LEVEL_2 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) - || (entPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (entPowerLevel - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) + && ((entPowerLevel < 6 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) + || (entPowerLevel < 4 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) + || (entPowerLevel < 6 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (entPowerLevel - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) && WP_SabersCheckLock(ent, hitOwner)) { collisionResolved = qtrue; } else if (saberHitFraction < 1.0f) {//an actual collision - if ( (hitOwnerBreakCounter < hitOwnerBreakLimit) && activeDefense) + if ((hitOwner->breakCounter <= hitOwner->breakLimit) && activeDefense) {//tired defenders cannot deflect //based on angle of attack & angle of defensive saber, see if I should deflect off in another dir rather than bounce back deflected = WP_GetSaberDeflectionAngle(ent, hitOwner); @@ -5412,8 +5477,8 @@ else } if (entPowerLevel > hitOwnerPowerLevel) { //if the attack was strong add to the stagger/break counter here - hitOwnerBreakCounter += (entPowerLevel - hitOwnerPowerLevel); - hitOwnerRecoveryTime = level.time + hitOwnerRecoveryInterval; + hitOwner->breakCounter += (entPowerLevel - hitOwnerPowerLevel); + hitOwner->breakRecoveryTime = level.time + hitOwnerRecoveryInterval; } //base parry breaks on animation (saber attack level), not FP_SABER_OFFENSE if (entPowerLevel < hitOwnerPowerLevel @@ -5456,8 +5521,8 @@ else } #endif } - else if (!activeDefense//they're not defending i.e. not holding +block with auto-blocking turned on? - || ( hitOwnerBreakCounter > hitOwnerBreakLimit //too tired to defend strong attacks + else if (!activeDefense//they're not defending i.e. not holding +block with auto-blocking turned off? + || (hitOwner->breakCounter > hitOwner->breakLimit //too tired to defend strong attacks && hitOwnerPowerLevel < entPowerLevel))//they are defending, but their defense strength is lower than my attack... /*|| (!deflected && Q_irand(0, PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]PM_PowerLevelForSaberAnim( &hitOwner->client->ps )) > 0))*/ //^um what does that do anyway? Just add randomness? @@ -6246,7 +6311,7 @@ else VectorSubtract(g_entities[ent->client->ps.saberEntityNum].currentOrigin, hitEnt->currentOrigin, newDir); VectorNormalize(newDir); - G_ReflectMissile(ent, &g_entities[ent->client->ps.saberEntityNum], newDir); + G_ReflectMissile(ent, &g_entities[ent->client->ps.saberEntityNum], newDir, FP_SABER_DEFENSE); } Jedi_PlayDeflectSound(hitOwner); WP_SaberDrop(ent, &g_entities[ent->client->ps.saberEntityNum]); @@ -6258,7 +6323,7 @@ else vec3_t newDir; VectorSubtract(g_entities[ent->client->ps.saberEntityNum].currentOrigin, hitEnt->currentOrigin, newDir); VectorNormalize(newDir); - G_ReflectMissile(ent, &g_entities[ent->client->ps.saberEntityNum], newDir); + G_ReflectMissile(ent, &g_entities[ent->client->ps.saberEntityNum], newDir, FP_SABER_DEFENSE); } WP_SaberReturn(ent, &g_entities[ent->client->ps.saberEntityNum]); } @@ -6826,7 +6891,7 @@ void WP_SaberInFlightReflectCheck(gentity_t *self, usercmd_t *ucmd) reflectAngle[PITCH] = Q_flrand(-90, 90); AngleVectors(reflectAngle, forward, NULL, NULL); - G_ReflectMissile(self, missile_list[x], forward); + G_ReflectMissile(self, missile_list[x], forward, FP_SABER_DEFENSE); //do an effect VectorNormalize2(missile_list[x]->s.pos.trDelta, fx_dir); G_PlayEffect("blaster/deflect", missile_list[x]->currentOrigin, fx_dir); @@ -10115,7 +10180,7 @@ void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) { VectorScale(right, -1, right); } - G_ReflectMissile(self, push_list[x], right); + G_ReflectMissile(self, push_list[x], right, pull ? FP_PULL : FP_PUSH); //FIXME: isn't turning off!!! WP_SaberDrop(push_list[x]->owner, push_list[x]); } @@ -10150,7 +10215,7 @@ void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) } if (dot >= 0) {//it's heading towards me - G_ReflectMissile(self, push_list[x], forward); + G_ReflectMissile(self, push_list[x], forward, FP_PUSH); } else { @@ -12325,6 +12390,7 @@ qboolean WP_CheckForceDraineeStopMe(gentity_t *self, gentity_t *drainee) && level.time - (self->client->ps.forcePowerDebounce[FP_DRAIN]>self->client->ps.forcePowerLevel[FP_DRAIN] * 500)//at level 1, I always get at least 500ms of drain, at level 3 I get 1500ms && !Q_irand(0, 100 - (drainee->NPC->stats.evasion * 10) - (g_spskill->integer * 12))) {//a jedi who broke free + ForceThrow(drainee, qfalse); //FIXME: I need to go into some pushed back anim... WP_ForcePowerStop(self, FP_DRAIN); @@ -13144,20 +13210,34 @@ int WP_AbsorbConversion(gentity_t *attacked, int atdAbsLevel, gentity_t *attacke return getLevel; } -void WP_ForcePowerRegenerate(gentity_t *self, int overrideAmt) +void WP_BlockPointsRegenerate(gentity_t *self) { - if (g_saberNewCombat->integer) //you must be regening FP to regen block points + if (g_saberNewCombat->integer) //FIXME: you must be regening FP to regen block points? { - if (hitOwnerBreakCounter) + if (self->breakCounter) //must have block points that need to be regained { - if (level.time >= hitOwnerRecoveryTime) + if (level.time >= self->breakRecoveryTime) { - hitOwnerBreakCounter -= 1; - hitOwnerRecoveryTime = level.time + hitOwnerRecoveryInterval; + self->breakCounter -= 1; + self->breakRecoveryTime = level.time + hitOwnerRecoveryInterval; } } } - + + if (self->NPC) + { + if (self->saberReactivateTime) //checking for stun after saber deactivation from Grip/Drain + { + if (level.time >= self->saberReactivateTime) + { + self->client->ps.SaberActivate(); + } + } + } +} + +void WP_ForcePowerRegenerate(gentity_t *self, int overrideAmt) +{ if (!self->client) { return; @@ -14101,6 +14181,21 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ && !Q_irand(0, 100 - (gripEnt->NPC->stats.evasion * 8) - (g_spskill->integer * 20))) {//a jedi who broke free FIXME: maybe have some minimum grip length- a reaction time? WP_ForceForceThrow(gripEnt); + + if (gripEnt->NPC->rank >= RANK_COMMANDER //saber reactivation AI here. + || (gripEnt->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) + { //tough guys reactivate their saber faster after being gripped + gripEnt->saberReactivateTime = 0; + } + else //if (gripEnt->NPC->rank >= RANK_LT_COMM) + { //weaker/less skilled guys are stunned after a grip for longer + gripEnt->saberReactivateTime = level.time + 1000; + } + /*else + { + gripEnt->saberReactivateTime = level.time + (2000 + Q_irand(0, 1000)); + }*/ + //FIXME: I need to go into some pushed back anim... WP_ForcePowerStop(self, FP_GRIP); return; @@ -14541,6 +14636,22 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ {//a jedi who broke free FIXME: maybe have some minimum grip length- a reaction time? WP_ForceForceThrow(drainEnt); //FIXME: I need to go into some pushed back anim... + + //saber reactivate time - same rules as for Grip + if (drainEnt->NPC->rank >= RANK_COMMANDER + || (drainEnt->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) + { //tough guys reactivate their saber faster after being gripped + drainEnt->saberReactivateTime = 0; + } + else /*if (drainEnt->NPC->rank >= RANK_LT_COMM)*/ + { //weaker/less skilled guys are stunned after a grip for longer + drainEnt->saberReactivateTime = level.time + 1000; + } + /*else + { + drainEnt->saberReactivateTime = level.time + (2000 + Q_irand(0, 1000)); + }*/ + WP_ForcePowerStop(self, FP_DRAIN); //can't drain again for 2 seconds self->client->ps.forcePowerDebounce[FP_DRAIN] = level.time + 4000; diff --git a/code/qcommon/msg.cpp b/code/qcommon/msg.cpp index 0a18d6ae00..31fa14a1f7 100644 --- a/code/qcommon/msg.cpp +++ b/code/qcommon/msg.cpp @@ -1015,6 +1015,7 @@ static const netField_t playerStateFields[] = { PSF(serverViewOrg[1]), 0 }, { PSF(serverViewOrg[2]), 0 }, { PSF(forceRageRecoveryTime), 32 }, + }; /* diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 8f194b6497..99ec671df4 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -2165,6 +2165,7 @@ typedef struct playerState_s { int saberLockTime; int saberLockEnemy; int saberStylesKnown; + #ifdef JK2_MODE char *saberModel; #endif From e7747f3846ef6c306b36fdcc6ff4135177e17ec0 Mon Sep 17 00:00:00 2001 From: Dusty Date: Sun, 28 Dec 2014 21:00:58 -0500 Subject: [PATCH 008/445] Another huge amount of changes, I really need to stop doing these bulk commits.... Let's see: AI stuff - - Armed Grenadiers (Grans) with wp_melee will now punch you every second or two at point blank range even with a saber out - Code in place but not working yet for melee cultists to push/dodge missiles and explosives - Code in place but unused/not working for Stormtrooper based NPCs to use close-range punches - Class_Imperial commander ranked NPCs and Class_Rodian NPCs with WP_Blaster use burst fire Saber dueling: - Saber Offense level controls an attacker's knockaway recovery speed when their attack is broken (done through the code using saberAnimSpeedModifier) - Special attacks should use an either it-breaks-or-it-is-blocked property ignoring the combo counter (untested) Other: - WP_melee now does 7/5 damage for the player (right hand/left hand) - only Class_Gran, Class_Trandoshan, and Chewie NPCs get heavy melee now (the really strong punches) - All other NPCs should punch faster but do the same damage as the player per punch - g_debugmelee 1 and regular WP_MELEE have the same punching speed now - holding use disables saber throw (eventually this should let you throw kicks instead of saber throwing) --- code/cgame/cg_main.cpp | 2 +- code/game/AI_Grenadier.cpp | 9 +- code/game/AI_Jedi.cpp | 4 + code/game/AI_Stormtrooper.cpp | 22 ++ code/game/NPC_combat.cpp | 9 +- code/game/NPC_spawn.cpp | 25 ++- code/game/bg_panimate.cpp | 43 +++- code/game/bg_pmove.cpp | 51 +++-- code/game/g_active.cpp | 37 +++- code/game/g_main.cpp | 6 +- code/game/wp_melee.cpp | 11 +- code/game/wp_saber.cpp | 367 +++++++++++++++++++++++++++++++--- code/ui/ui_shared.cpp | 4 +- 13 files changed, 510 insertions(+), 80 deletions(-) diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 84f990036c..4160e2216b 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -408,7 +408,7 @@ static cvarTable_t cvarTable[] = { { &cg_thirdPersonAngle, "cg_thirdPersonAngle", "0", 0 }, { &cg_thirdPersonPitchOffset, "cg_thirdPersonPitchOffset", "0", 0 }, { &cg_thirdPersonVertOffset, "cg_thirdPersonVertOffset", "16", 0}, - { &cg_thirdPersonCameraDamp, "cg_thirdPersonCameraDamp", "0.3", 0}, + { &cg_thirdPersonCameraDamp, "cg_thirdPersonCameraDamp", "0.3", CVAR_ARCHIVE }, { &cg_thirdPersonTargetDamp, "cg_thirdPersonTargetDamp", "0.5", 0}, { &cg_thirdPersonHorzOffset, "cg_thirdPersonHorzOffset", "0", 0}, diff --git a/code/game/AI_Grenadier.cpp b/code/game/AI_Grenadier.cpp index a6d0ee4a2b..5fc2d52625 100644 --- a/code/game/AI_Grenadier.cpp +++ b/code/game/AI_Grenadier.cpp @@ -507,8 +507,13 @@ void NPC_BSGrenadier_Attack( void ) enemyDist = DistanceSquared( NPC->enemy->currentOrigin, NPC->currentOrigin ); //See if we should switch to melee attack - if ( enemyDist < 16384 && (!NPC->enemy->client||NPC->enemy->client->ps.weapon != WP_SABER||(!NPC->enemy->client->ps.SaberActive())) )//128 - {//enemy is close and not using saber + if ( (enemyDist < 16384 + && (!NPC->enemy->client||NPC->enemy->client->ps.weapon != WP_SABER||(!NPC->enemy->client->ps.SaberActive()))) + || + (enemyDist < 4096 //64 squared + && Q_irand(0,1)))//50% chance to throw a punch if player is super close + // 50% chance if enemy very close to use melee on saber wielding enemy + {//enemy is close and not using saber or very close and random chance if ( NPC->client->ps.weapon == WP_THERMAL ) {//grenadier trace_t trace; diff --git a/code/game/AI_Jedi.cpp b/code/game/AI_Jedi.cpp index 775558638e..6fb2438945 100644 --- a/code/game/AI_Jedi.cpp +++ b/code/game/AI_Jedi.cpp @@ -2423,6 +2423,10 @@ evasionType_t Jedi_CheckFlipEvasions( gentity_t *self, float rightdot, float zdi allowCartWheels = qfalse; } } + if (self->client->ps.forcePowerLevel[FP_LEVITATION] < FORCE_LEVEL_1) + { //can't do no-handed cartwheels without a bit of force jumping ability + allowCartWheels = qfalse; + } if ( PM_SaberInAttack( self->client->ps.saberMove ) || PM_SaberInStart( self->client->ps.saberMove ) ) diff --git a/code/game/AI_Stormtrooper.cpp b/code/game/AI_Stormtrooper.cpp index 61f83cb534..403c67b775 100644 --- a/code/game/AI_Stormtrooper.cpp +++ b/code/game/AI_Stormtrooper.cpp @@ -2350,12 +2350,34 @@ void NPC_BSST_Attack( void ) if ( enemyDist < MIN_ROCKET_DIST_SQUARED )//128 {//enemy within 128 + /*if ( enemyDist < (64*64) ) + {//enemy is close and not using saber or very close and random chance + if (NPC->client->ps.weapon != WP_MELEE) + {//I'm not in melee + trace_t trace; + gi.trace(&trace, NPC->currentOrigin, NPC->enemy->mins, NPC->enemy->maxs, NPC->enemy->currentOrigin, NPC->s.number, NPC->enemy->clipmask, (EG2_Collision)0, 0); + if (!trace.allsolid && !trace.startsolid && (trace.fraction == 1.0 || trace.entityNum == NPC->enemy->s.number)) + {//I can get right to him + //reset fire-timing variables + NPC_ChangeWeapon(WP_MELEE); + } + } + } + else if (enemyDist > 65536 || (NPC->enemy->client && NPC->enemy->client->ps.weapon == WP_SABER && NPC->enemy->client->ps.SaberActive()))//256 + {//enemy is far or using saber + if (NPC->client->ps.weapon == WP_MELEE && (NPC->client->ps.stats[STAT_WEAPONS] & (1 << WP_THERMAL))) + {//fisticuffs, make switch to thermal if have it + //reset fire-timing variables + NPC_ChangeWeapon(WP_THERMAL); + } + }*/ //melee punch stuff if ( (NPC->client->ps.weapon == WP_FLECHETTE || NPC->client->ps.weapon == WP_REPEATER) && (NPCInfo->scriptFlags & SCF_ALT_FIRE) ) {//shooting an explosive, but enemy too close, switch to primary fire NPCInfo->scriptFlags &= ~SCF_ALT_FIRE; //FIXME: we can never go back to alt-fire this way since, after this, we don't know if we were initially supposed to use alt-fire or not... } + } else if ( enemyDist > 65536 )//256 squared { diff --git a/code/game/NPC_combat.cpp b/code/game/NPC_combat.cpp index b9ddbde2f9..5b7eba3801 100644 --- a/code/game/NPC_combat.cpp +++ b/code/game/NPC_combat.cpp @@ -928,7 +928,14 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) case WP_MELEE: case WP_TUSKEN_STAFF: ent->NPC->aiFlags &= ~NPCAI_BURST_WEAPON; - ent->NPC->burstSpacing = 1000;//attackdebounce + if (ent->NPC->aiFlags & NPCAI_HEAVY_MELEE) + { //heavy melee guys punch a bit slower + ent->NPC->burstSpacing = 1000;//attackdebounce + } + else + { //regular melee guys punch faster but weaker + ent->NPC->burstSpacing = 500;//attackdebounce + } break; case WP_ATST_MAIN: diff --git a/code/game/NPC_spawn.cpp b/code/game/NPC_spawn.cpp index 0620e63d1e..d6e3ecc343 100644 --- a/code/game/NPC_spawn.cpp +++ b/code/game/NPC_spawn.cpp @@ -361,9 +361,12 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) ent->NPC->scriptFlags |= (SCF_DONT_FLEE|SCF_IGNORE_ALERTS); ent->NPC->ignorePain = qtrue; } - if ( Q_stricmp( "chewie", ent->NPC_type ) ) + if ( !Q_stricmp( "chewie", ent->NPC_type ) + || ent->client->NPC_class == CLASS_GRAN + || ent->client->NPC_class == CLASS_TRANDOSHAN ) { //in case chewie ever loses his gun... + //or if Trando or Gran want to get rough ent->NPC->aiFlags |= NPCAI_HEAVY_MELEE; } //================== @@ -603,13 +606,14 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) NPCInfo->scriptFlags |= SCF_PILOT; ST_ClearTimers( ent ); - if ( ent->NPC->rank >= RANK_COMMANDER ) - {//commanders use alt-fire - //ent->NPC->scriptFlags |= SCF_ALT_FIRE; + if ( ent->NPC->rank >= RANK_COMMANDER + && ent->client->NPC_class == CLASS_IMPERIAL ) + {//imp commanders and rodians with E11s use alt-fire + ent->NPC->scriptFlags |= SCF_ALT_FIRE; } - if ( !Q_stricmp( "rodian2", ent->NPC_type ) ) + if ( ent->client->NPC_class == CLASS_RODIAN ) { - //ent->NPC->scriptFlags |= SCF_ALT_FIRE; + ent->NPC->scriptFlags |= SCF_ALT_FIRE; } break; } @@ -1070,7 +1074,14 @@ void NPC_Begin (gentity_t *ent) } else { - ent->NPC->stats.health += ent->NPC->stats.health/4 * g_spskill->integer; // 100% on easy, 125% on medium, 150% on hard + if (ent->client->playerTeam == TEAM_PLAYER) + { //good guys lose health for difficulty, don't gain + ent->NPC->stats.health = (ent->NPC->stats.health * 1.5) - (ent->NPC->stats.health / 4 * g_spskill->integer); // 150% on easy, 125% on medium, 100% on hard + } + else + { //bad guys get health bonuses + ent->NPC->stats.health += ent->NPC->stats.health / 4 * g_spskill->integer; // 100% on easy, 125% on medium, 150% on hard + } } } diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index b57801b71b..0af60a639d 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -4988,22 +4988,51 @@ void PM_SetTorsoAnimTimer( gentity_t *ent, int *torsoAnimTimer, int time ) extern qboolean PM_SpinningSaberAnim( int anim ); extern float saberAnimSpeedMod[NUM_FORCE_POWER_LEVELS]; -void PM_SaberStartTransAnim( int saberAnimLevel, int anim, float *animSpeed, gentity_t *gent ) +void PM_SaberStartTransAnim(int saberAnimLevel, int anim, float *animSpeed, gentity_t *gent) { - if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_ROLL_STAB ) + if (g_saberNewCombat->integer) //new code { - if ( g_saberAnimSpeed->value != 1.0f ) + if ( anim == BOTH_V1_BL_S1 + || anim == BOTH_V1_BR_S1 + || anim == BOTH_V1_TL_S1 + || anim == BOTH_V1_TR_S1 + || anim == BOTH_V1_T__S1 + || (anim >= BOTH_V6_BL_S6 && anim <= BOTH_V7__R_S7) ) + { //we're in a broken attack + //speed up recovery from broken attacks based on SO level + *animSpeed = saberAnimSpeedMod[gent->client->ps.forcePowerLevel[FP_SABER_OFFENSE]]; + } + if (g_saberAnimSpeed->value != 1.0f) + { + *animSpeed *= g_saberAnimSpeed->value; + } + else if (gent && gent->client && gent->client->ps.weapon == WP_SABER) + { + if (gent->client->ps.saber[0].animSpeedScale != 1.0f) + { + *animSpeed *= gent->client->ps.saber[0].animSpeedScale; + } + if (gent->client->ps.dualSabers + && gent->client->ps.saber[1].animSpeedScale != 1.0f) + { + *animSpeed *= gent->client->ps.saber[1].animSpeedScale; + } + } + } + else //old code + { + if (g_saberAnimSpeed->value != 1.0f) { *animSpeed *= g_saberAnimSpeed->value; } - else if ( gent && gent->client && gent->client->ps.weapon == WP_SABER ) + else if (gent && gent->client && gent->client->ps.weapon == WP_SABER) { - if ( gent->client->ps.saber[0].animSpeedScale != 1.0f ) + if (gent->client->ps.saber[0].animSpeedScale != 1.0f) { *animSpeed *= gent->client->ps.saber[0].animSpeedScale; } - if ( gent->client->ps.dualSabers - && gent->client->ps.saber[1].animSpeedScale != 1.0f ) + if (gent->client->ps.dualSabers + && gent->client->ps.saber[1].animSpeedScale != 1.0f) { *animSpeed *= gent->client->ps.saber[1].animSpeedScale; } diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 1b0f8df6fa..19fb98408c 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -111,6 +111,7 @@ extern qboolean G_TryingCartwheel( gentity_t *self, usercmd_t *cmd ); extern qboolean G_TryingSpecial( gentity_t *self, usercmd_t *cmd ); extern qboolean G_TryingJumpAttack( gentity_t *self, usercmd_t *cmd ); extern qboolean G_TryingJumpForwardAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean WP_ForcePowerUsable(gentity_t *self, forcePowers_t forcePower, int overrideAmt); extern void WP_SaberSwingSound( gentity_t *ent, int saberNum, swingType_t swingType ); extern qboolean WP_UseFirstValidSaberStyle( gentity_t *ent, int *saberAnimLevel ); extern qboolean WP_SaberStyleValidForSaber( gentity_t *ent, int saberAnimLevel ); @@ -142,6 +143,7 @@ extern cvar_t *g_debugMelee; extern cvar_t *g_saberNewControlScheme; extern cvar_t *g_stepSlideFix; extern cvar_t *g_saberAutoBlocking; +extern cvar_t *g_autoRoll; static void PM_SetWaterLevelAtPoint( vec3_t org, int *waterlevel, int *watertype ); @@ -3496,12 +3498,9 @@ static void PM_CrashLandDamage( int damage ) damage = 1000; dflags |= DAMAGE_DIE_ON_IMPACT; } - else + else if ( !(pm->gent->flags&FL_NO_IMPACT_DMG) ) { damage = PM_DamageForDelta( damage ); - - if ( (pm->gent->flags&FL_NO_IMPACT_DMG) ) - return; } if ( damage ) @@ -3771,8 +3770,9 @@ static qboolean PM_TryRoll( void ) return qfalse; } } - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && (!cg.renderingThirdPerson || cg.zoomMode) ) + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && (cg.renderingThirdPerson || cg.zoomMode) ) {//player can't do this in 1st person + // now you can - Dusty ;) return qfalse; } if ( !pm->gent ) @@ -8358,9 +8358,10 @@ static void PM_Footsteps( void ) && ( !PM_InRollIgnoreTimer( pm->ps )||(!pm->ps->legsAnimTimer&&pm->cmd.upmove<0) ) )//not in a roll (or you just finished one and you're still holding crouch) { qboolean rolled = qfalse; - if ( PM_RunningAnim( pm->ps->legsAnim ) + if ( ((PM_RunningAnim( pm->ps->legsAnim ) || pm->ps->legsAnim == BOTH_FORCEHEAL_START - || PM_CanRollFromSoulCal( pm->ps )) + || PM_CanRollFromSoulCal( pm->ps )) && + (g_autoRoll->integer || pm->cmd.buttons&BUTTON_USE))) {//roll! rolled = PM_TryRoll(); } @@ -11058,13 +11059,19 @@ qboolean PM_PickAutoMultiKick( qboolean allowSingles ) qboolean PM_SaberThrowable( void ) { + //player gets to kick if holding use + if ( (pm->cmd.buttons&BUTTON_USE) ) + { + return qfalse; + } + //ugh, hard-coding this is bad... if ( pm->ps->saberAnimLevel == SS_STAFF ) { return qfalse; } - if ( !(pm->ps->saber[0].saberFlags&SFL_NOT_THROWABLE) ) + if (!(pm->ps->saber[0].saberFlags&SFL_NOT_THROWABLE) && !(pm->cmd.buttons&BUTTON_USE)) {//yes, this saber is always throwable return qtrue; } @@ -11094,14 +11101,18 @@ qboolean PM_SaberThrowable( void ) qboolean PM_CheckAltKickAttack( void ) { - if ( (pm->cmd.buttons&BUTTON_ALT_ATTACK) + if ( ((pm->cmd.buttons&BUTTON_ALT_ATTACK) && (!(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD) ||PM_SaberInReturn(pm->ps->saberMove)) && (!PM_FlippingAnim(pm->ps->legsAnim)||pm->ps->legsAnimTimer<=250) - && (!PM_SaberThrowable()) + //&& PM_SaberThrowable() + && (!WP_ForcePowerUsable(pm->gent, FP_SABERTHROW, 20)) //make sure saber throw is disabled before trying to kick && pm->ps->SaberActive() && !(pm->ps->saber[0].saberFlags&SFL_NO_KICKS)//okay to do kicks with this saber - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_KICKS) )//okay to do kicks with this saber + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_KICKS) )//okay to do kicks with the 2nd saber ) + || ((pm->cmd.buttons&BUTTON_ALT_ATTACK) + && !(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD) + && pm->cmd.buttons&BUTTON_USE)) { return qtrue; } @@ -13304,6 +13315,7 @@ Generates weapon events and modifes the weapon counter static void PM_Weapon( void ) { int addTime, amount, trueCount = 1; + int punch = 0; qboolean delayed_fire = qfalse; if ( (pm->ps->eFlags&EF_HELD_BY_WAMPA) ) @@ -13646,10 +13658,17 @@ static void PM_Weapon( void ) { if ( PM_DroidMelee( pm->gent->client->NPC_class ) ) { - if ( rand() & 1 ) - PM_SetAnim(pm,SETANIM_BOTH,BOTH_MELEE1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); + if (punch == 0) + { + PM_SetAnim(pm, SETANIM_BOTH, BOTH_MELEE1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + punch = 1; + } else - PM_SetAnim(pm,SETANIM_BOTH,BOTH_MELEE2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); + { + PM_SetAnim(pm, SETANIM_BOTH, BOTH_MELEE2, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + punch = 0; + } + } else { @@ -13931,8 +13950,8 @@ static void PM_Weapon( void ) addTime = weaponData[pm->ps->weapon].fireTime; } } - else if ( (pm->ps->weapon == WP_MELEE && (pm->ps->clientNum>=MAX_CLIENTS||!g_debugMelee->integer) ) - || pm->ps->weapon == WP_TUSKEN_STAFF + else if ( /*(pm->ps->weapon == WP_MELEE && (pm->ps->clientNum>=MAX_CLIENTS||!g_debugMelee->integer) ) //will commenting this fix firetime discrepancy for melee with kungfu? + ||*/ pm->ps->weapon == WP_TUSKEN_STAFF || (pm->ps->weapon == WP_TUSKEN_RIFLE&&!(pm->cmd.buttons&BUTTON_ALT_ATTACK)) ) { PM_AddEvent( EV_FIRE_WEAPON ); diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index 24b430d265..ba98da8ba7 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -44,6 +44,7 @@ extern void WP_SaberUpdate( gentity_t *self, usercmd_t *ucmd ); extern void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ); extern void WP_ForcePowersUpdate( gentity_t *self, usercmd_t *ucmd ); extern void WP_BlockPointsRegenerate( gentity_t *self ); +extern void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd); extern gentity_t *SeekerAcquiresTarget ( gentity_t *ent, vec3_t pos ); extern void FireSeeker( gentity_t *owner, gentity_t *target, vec3_t origin, vec3_t dir ); @@ -1292,7 +1293,25 @@ void DoImpact( gentity_t *self, gentity_t *other, qboolean damageSelf, trace_t * magnitude = 0; } - G_Damage( self, NULL, NULL, NULL, self->currentOrigin, magnitude/2, DAMAGE_NO_ARMOR, MOD_FALLING );//FIXME: MOD_IMPACT + if( (!Q_stricmp(self->NPC_type, "rosh_penin") || + !Q_stricmp(self->NPC_type, "rosh_penin_noforce")) && + !Q_stricmp(level.mapname, "yavin1b") ) + { + // This is a small little fix I implemented over a matter of 3 commits due to bugs/etc. + // There is an EXTREMELY frustrating bug on yavin1b where Rosh can take enough damage from howlers to the point + // where, during one section where he jumps over a stream, he can suffer falling damage and die. So the player + // would be forced to repeat the level over and over again. + // Despite it being clearly a jump, the scripters for the level somehow forgot to add a cushion brush on + // the landing zone where Rosh would be, (fucking woglodytes that Raven outsourced the levels to, I swear...) + // resulting in a very weird and unnatural death. So it didn't make any sense. So I did the nasty thing and did + // it through code. + // This could also probably explain why Rosh suddenly dies for NO reason whatsoever in rare occasions on Jedi + // Master/Jedi Knight mode at the start of the level. --eezstreet + } + else + { + G_Damage( self, NULL, NULL, NULL, self->currentOrigin, magnitude/2, DAMAGE_NO_ARMOR, MOD_FALLING );//FIXME: MOD_IMPACT + } } } } @@ -5264,11 +5283,21 @@ extern cvar_t *g_skippingcin; WP_BlockPointsRegenerate( ent ); //if we have the saber in hand, check for starting a block to reflect shots - if ( ent->s.number < MAX_CLIENTS//player - || ( ent->NPC && G_JediInNormalAI( ent ) ) )//NPC jedi not in a special AI mode + if ((ent->s.number < MAX_CLIENTS//player + || (ent->NPC && G_JediInNormalAI(ent)))) //NPC jedi not in a special AI mode { - WP_SaberStartMissileBlockCheck( ent, ucmd ); + if (ent->client->ps.weapon == WP_SABER) + { + WP_SaberStartMissileBlockCheck(ent, ucmd); + } + } + + if (ent->NPC && ent->client->ps.weapon == WP_MELEE) + {//we may be a melee force user, use a check for explosives and saber throws + Jedi_MeleeEvasionDefense(ent, ucmd); } + + // Update the position of the saber, and check to see if we're throwing it if ( client->ps.saberEntityNum != ENTITYNUM_NONE ) diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index b0b1e11d7a..a00e98a954 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -200,8 +200,9 @@ cvar_t *g_saberDarkSideSaberColor; //new cvars - Dusty cvar_t *g_saberNewCombat; cvar_t *g_saberLocksEnabled; -cvar_t *g_saberDmgScale; +cvar_t *g_saberDamageScale; cvar_t *g_saberWalkAnims; +cvar_t *g_autoRoll; cvar_t *g_char_forcepoints; cvar_t *g_char_ParryBonus; @@ -701,8 +702,9 @@ void G_InitCvars( void ) { //new cvars yay - Dusty g_saberNewCombat = gi.cvar("g_saberNewCombat", "1", CVAR_ARCHIVE | CVAR_CHEAT); g_saberLocksEnabled = gi.cvar("g_saberLocksEnabled", "1", CVAR_ARCHIVE | CVAR_CHEAT); - g_saberDmgScale = gi.cvar("g_saberDamageScale", "1", CVAR_SAVEGAME | CVAR_CHEAT); + g_saberDamageScale = gi.cvar("g_saberDamageScale", "1", CVAR_SAVEGAME | CVAR_CHEAT); g_char_forcepoints = gi.cvar("g_char_forcepoints", "100", CVAR_CHEAT | CVAR_SAVEGAME ); + g_autoRoll = gi.cvar("g_autoRoll", "1", CVAR_ARCHIVE ); } /* ============ diff --git a/code/game/wp_melee.cpp b/code/game/wp_melee.cpp index 6680f7d87e..b4876483f7 100644 --- a/code/game/wp_melee.cpp +++ b/code/game/wp_melee.cpp @@ -28,7 +28,7 @@ void WP_Melee( gentity_t *ent ) gentity_t *tr_ent; trace_t tr; vec3_t mins, maxs, end; - int damage = ent->s.number ? (g_spskill->integer*2)+1 : 3; + int damage = ent->s.number ? 5 : 5; float range = ent->s.number ? 64 : 32; VectorMA( muzzle, range, forwardVec, end ); @@ -47,14 +47,11 @@ void WP_Melee( gentity_t *ent ) if ( ent->client && !PM_DroidMelee( ent->client->NPC_class ) ) { - if ( ent->s.number || ent->alt_fire ) + if (ent->client->ps.torsoAnim == BOTH_MELEE2) { - damage *= Q_irand( 2, 3 ); - } - else - { - damage *= Q_irand( 1, 2 ); + damage = 7; } + //else damage = 5 } if ( tr_ent && tr_ent->takedamage ) diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 0b7facb94b..f7bc772225 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -162,7 +162,7 @@ extern cvar_t *g_saberDamageCapping; extern cvar_t *g_saberNewControlScheme; extern cvar_t *g_saberNewCombat; extern cvar_t *g_saberLocksEnabled; -extern cvar_t *g_saberDmgScale; +extern cvar_t *g_saberDamageScale; extern int g_crosshairEntNum; qboolean g_saberNoEffects = qfalse; @@ -329,18 +329,18 @@ int saberThrowDistSquared[NUM_FORCE_POWER_LEVELS] = int parryDebounce[NUM_FORCE_POWER_LEVELS] = { - 500,//if don't even have defense, can't use defense! + 500,//defense 0 300, 150, 50 }; float saberAnimSpeedMod[NUM_FORCE_POWER_LEVELS] = -{ - 0.0f,//if don't even have offense, can't use offense! - 0.75f, +{ //controls how fast you recover from having your attack knocked away + 0.75f,//offense 0 1.0f, - 2.0f + 1.25f, + 1.5f }; stringID_table_t SaberStyleTable[] = @@ -4809,7 +4809,7 @@ else //Dusty, old code start. //FIXME: Desann does double damage? if (g_saberNewCombat->integer) //new code { - float saberDmgMultiplier = g_saberDmgScale->value; + float saberDmgMultiplier = g_saberDamageScale->value; if (g_saberRealisticCombat->integer) { @@ -4817,18 +4817,20 @@ else //Dusty, old code start. { default: case FORCE_LEVEL_5: - baseDamage = 10.0f * saberDmgMultiplier; + baseDamage = 10.0f; break; case FORCE_LEVEL_4: //Staff, medium, duals all do same damage case FORCE_LEVEL_3: case FORCE_LEVEL_2: - baseDamage = 5.0f * saberDmgMultiplier; + baseDamage = 5.0f; break; case FORCE_LEVEL_0: case FORCE_LEVEL_1: //FIXME: Fast damage is so low... - baseDamage = 2.5f * saberDmgMultiplier; + baseDamage = 2.5f; break; } + + baseDamage *= saberDmgMultiplier; } else { @@ -4839,7 +4841,7 @@ else //Dusty, old code start. || ent->client->ps.torsoAnim == BOTH_SPINATTACK7 || ent->client->ps.torsoAnim == BOTH_LUNGE2_B__T_)) {//*sigh*, these anim do less damage since they're so easy to do - baseDamage = 2.5f; + baseDamage = 2.5f * saberDmgMultiplier; } else { @@ -4847,18 +4849,20 @@ else //Dusty, old code start. { default: case FORCE_LEVEL_5: - baseDamage = 7.5f * saberDmgMultiplier; + baseDamage = 7.5f; break; case FORCE_LEVEL_4: //Staff, medium, duals all do same damage case FORCE_LEVEL_3: case FORCE_LEVEL_2: - baseDamage = 5.0f * saberDmgMultiplier; + baseDamage = 5.0f; break; case FORCE_LEVEL_0: case FORCE_LEVEL_1: //FIXME: Fast damage is so low... - baseDamage = 2.5f * saberDmgMultiplier; + baseDamage = 2.5f; break; } + + baseDamage *= saberDmgMultiplier; } } } @@ -5429,11 +5433,12 @@ else && !Q_irand(0, g_saberLockRandomNess->integer) && (g_debugSaberLock->integer || forceLock || entPowerLevel == hitOwnerPowerLevel - || (entPowerLevel > 6 && hitOwnerPowerLevel > 6) - || (entPowerLevel < 6 && hitOwnerPowerLevel < 6 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && Q_irand(0, 3)) - || (entPowerLevel < 4 && hitOwnerPowerLevel < 6 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && Q_irand(0, 2)) - || (hitOwnerPowerLevel < 6 && entPowerLevel < 6 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && !Q_irand(0, 1)) - || (hitOwnerPowerLevel < 6 && entPowerLevel < 4 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && !Q_irand(0, 1))) + || (entPowerLevel > 6 && hitOwnerPowerLevel > 6) + //more chance when both are using SO 3 and strong attacks + || (ent->client->ps.saberAnimLevel < 5 && hitOwner->client->ps.saberAnimLevel < 5 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && Q_irand(0, 3)) + || (ent->client->ps.saberAnimLevel < 3 && hitOwner->client->ps.saberAnimLevel < 5 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && Q_irand(0, 2)) + || (hitOwner->client->ps.saberAnimLevel < 5 && ent->client->ps.saberAnimLevel < 5 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && !Q_irand(0, 1)) + || (hitOwner->client->ps.saberAnimLevel < 5 && hitOwner->client->ps.saberAnimLevel < 3 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && !Q_irand(0, 1))) && WP_SabersCheckLock(ent, hitOwner)) { collisionResolved = qtrue; @@ -5444,9 +5449,9 @@ else && !Q_irand(0, g_saberLockRandomNess->integer * 3) && (g_debugSaberLock->integer || forceLock || ((ent->client->ps.saberMove != LS_READY || (hitOwnerPowerLevel - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand(-6, 0)) - && ((hitOwnerPowerLevel < 6 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) || - (hitOwnerPowerLevel < 4 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) || - (hitOwnerPowerLevel < 6 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (hitOwnerPowerLevel - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) + && ((hitOwner->client->ps.saberAnimLevel < 5 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) || + (hitOwner->client->ps.saberAnimLevel < 3 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) || + (hitOwner->client->ps.saberAnimLevel < 5 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (hitOwnerPowerLevel - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) && WP_SabersCheckLock(hitOwner, ent)) { collisionResolved = qtrue; @@ -5459,9 +5464,9 @@ else && activeDefense && (g_debugSaberLock->integer || forceLock || ((hitOwner->client->ps.saberMove != LS_READY || (entPowerLevel - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand(-6, 0)) - && ((entPowerLevel < 6 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) - || (entPowerLevel < 4 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) - || (entPowerLevel < 6 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (entPowerLevel - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) + && (ent->client->ps.saberAnimLevel < 5 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) + || (ent->client->ps.saberAnimLevel < 3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) + || (hitOwner->client->ps.saberAnimLevel < 5 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (entPowerLevel - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2)))) && WP_SabersCheckLock(ent, hitOwner)) { collisionResolved = qtrue; @@ -5477,8 +5482,11 @@ else } if (entPowerLevel > hitOwnerPowerLevel) { //if the attack was strong add to the stagger/break counter here - hitOwner->breakCounter += (entPowerLevel - hitOwnerPowerLevel); - hitOwner->breakRecoveryTime = level.time + hitOwnerRecoveryInterval; + if (!PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) + { //special attacks just break, no counters + hitOwner->breakCounter += (entPowerLevel - hitOwnerPowerLevel); + hitOwner->breakRecoveryTime = level.time + hitOwnerRecoveryInterval; + } } //base parry breaks on animation (saber attack level), not FP_SABER_OFFENSE if (entPowerLevel < hitOwnerPowerLevel @@ -5523,12 +5531,15 @@ else } else if (!activeDefense//they're not defending i.e. not holding +block with auto-blocking turned off? || (hitOwner->breakCounter > hitOwner->breakLimit //too tired to defend strong attacks - && hitOwnerPowerLevel < entPowerLevel))//they are defending, but their defense strength is lower than my attack... + && hitOwnerPowerLevel < entPowerLevel) + || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim))//they are defending, but their defense strength is lower than my attack... + //or they are doing a special which has slightly + //different rules /*|| (!deflected && Q_irand(0, PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]PM_PowerLevelForSaberAnim( &hitOwner->client->ps )) > 0))*/ //^um what does that do anyway? Just add randomness? {//broke their parry altogether - if (ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] >= 3) - {//saber offense 3 (and up?) gets to continue completely uninterrupted + if (ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] >= 3 || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) + {//saber offense 3 (and up?) gets to continue completely uninterrupted after breaking their guard ent->client->ps.saberEventFlags &= ~SEF_BLOCKED; ent->client->ps.saberBounceMove = LS_NONE; brokenParry = qtrue; @@ -8040,6 +8051,297 @@ void WP_SaberBlockNonRandom(gentity_t *self, vec3_t hitloc, qboolean missileBloc } } +void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) +{ //allows melee force users to push/dodge explosives and saber throws which is normally tied to a saber block check + + float dist; + gentity_t *ent, *incoming = NULL; + gentity_t *entityList[MAX_GENTITIES]; + int numListedEntities; + vec3_t mins, maxs; + int i, e; + float closestDist, radius = 256; + vec3_t forward, dir, missile_dir, fwdangles = { 0 }; + trace_t trace; + vec3_t traceTo, entDir; + qboolean dodgeOnlySabers = qfalse; + + if (self->NPC && (self->NPC->scriptFlags&SCF_IGNORE_ALERTS)) + {//don't react to things flying at me... + return; + } + if (self->health <= 0) + {//dead push/evade + return; + } + + if (PM_InKnockDown(&self->client->ps)) + {//can't block when knocked down + return; + } + + if (PM_SuperBreakLoseAnim(self->client->ps.torsoAnim) + || PM_SuperBreakWinAnim(self->client->ps.torsoAnim)) + {//can't block while in break anim + return; + } + + if (Rosh_BeingHealed(self)) + { + return; + } + + if (self->client->NPC_class == CLASS_ROCKETTROOPER) + {//rockettrooper + if (self->client->ps.groundEntityNum != ENTITYNUM_NONE) + {//must be in air + return; + } + if (Q_irand(0, 4 - (g_spskill->integer * 2))) + {//easier level guys do this less + return; + } + if (Q_irand(0, 3)) + {//base level: 25% chance of looking for something to dodge + if (Q_irand(0, 1)) + {//dodge sabers twice as frequently as other projectiles + dodgeOnlySabers = qtrue; + } + else + { + return; + } + } + } + + if (self->client->NPC_class == CLASS_BOBAFETT) + {//Boba doesn't dodge quite as much + if (Q_irand(0, 2 - g_spskill->integer)) + {//easier level guys do this less + return; + } + } + + if (self->NPC->rank < RANK_LT) //lower rank melee users can't do this stuff + { + if (g_debugMelee->integer + && (ucmd->buttons & BUTTON_USE) + && cg.renderingThirdPerson + && G_OkayToLean(&self->client->ps, ucmd, qfalse) + && (self->client->ps.forcePowersActive&(1 << FP_SPEED))) + { + } + else + { + + if (self->client->ps.forcePowersActive&(1 << FP_LIGHTNING)) + {//can't block while zapping + return; + } + + if (self->client->ps.forcePowersActive&(1 << FP_DRAIN)) + {//can't block while draining + return; + } + + if (self->client->ps.forcePowersActive&(1 << FP_PUSH)) + {//can't block while shoving + return; + } + + if (self->client->ps.forcePowersActive&(1 << FP_GRIP)) + {//can't block while gripping (FIXME: or should it break the grip? Pain should break the grip, I think...) + return; + } + } + + fwdangles[1] = self->client->ps.viewangles[1]; + AngleVectors(fwdangles, forward, NULL, NULL); + + for (i = 0; i < 3; i++) + { + mins[i] = self->currentOrigin[i] - radius; + maxs[i] = self->currentOrigin[i] + radius; + } + + numListedEntities = gi.EntitiesInBox(mins, maxs, entityList, MAX_GENTITIES); + + closestDist = radius; + + for (e = 0; e < numListedEntities; e++) + { + ent = entityList[e]; + + if (ent == self) + continue; + if (ent->owner == self) + continue; + if (!(ent->inuse)) + continue; + if (dodgeOnlySabers) + {//only care about thrown sabers + if (ent->client + || ent->s.weapon != WP_SABER + || !ent->classname + || !ent->classname[0] + || Q_stricmp("lightsaber", ent->classname)) + {//not a lightsaber, ignore it + continue; + } + } + if (ent->s.eType != ET_MISSILE && !(ent->s.eFlags&EF_MISSILE_STICK)) + {//not a normal projectile + if (ent->client || ent->s.weapon != WP_SABER) + {//FIXME: wake up bad guys? + continue; + } + if (ent->s.eFlags & EF_NODRAW) + { + continue; + } + if (Q_stricmp("lightsaber", ent->classname) != 0) + {//not a lightsaber + //FIXME: what about general objects that are small in size- like rocks, etc... + continue; + } + //a lightsaber.. make sure it's on and inFlight + if (!ent->owner || !ent->owner->client) + { + continue; + } + if (!ent->owner->client->ps.saberInFlight) + {//not in flight + continue; + } + if (ent->owner->client->ps.SaberLength() <= 0) + {//not on + continue; + } + if (ent->owner->health <= 0 && g_saberRealisticCombat->integer < 2) + {//it's not doing damage, so ignore it + continue; + } + } + else + { + if (ent->s.pos.trType == TR_STATIONARY && !self->s.number) + {//nothing you can do with a stationary missile if you're the player + continue; + } + } + + float dot1, dot2; + //see if they're in front of me + VectorSubtract(ent->currentOrigin, self->currentOrigin, dir); + dist = VectorNormalize(dir); + //FIXME: handle detpacks, proximity mines and tripmines + if (ent->s.weapon == WP_THERMAL) + {//thermal detonator! + if (self->NPC && dist < ent->splashRadius) + { + if (dist < ent->splashRadius && + ent->nextthink < level.time + 600 && + ent->count && + self->client->ps.groundEntityNum != ENTITYNUM_NONE && + (ent->s.pos.trType == TR_STATIONARY || + ent->s.pos.trType == TR_INTERPOLATE || + (dot1 = DotProduct(dir, forward)) < SABER_REFLECT_MISSILE_CONE || + !WP_ForcePowerUsable(self, FP_PUSH, 0))) + {//TD is close enough to hurt me, I'm on the ground and the thing is at rest or behind me and about to blow up, or I don't have force-push so force-jump! + //FIXME: sometimes this might make me just jump into it...? + self->client->ps.forceJumpCharge = 480; + } + else + {//FIXME: check forcePushRadius[NPC->client->ps.forcePowerLevel[FP_PUSH]] + if (!ent->owner || !OnSameTeam(self, ent->owner)) + { + ForceThrow(self, qfalse); + } + } + } + continue; + } + else if (ent->splashDamage && ent->splashRadius) + {//exploding missile + //FIXME: handle tripmines and detpacks somehow... + // maybe do a force-gesture that makes them explode? + // But what if we're within it's splashradius? + if (!self->s.number) + {//players don't auto-handle these at all + continue; + } + else + { + if (self->client->NPC_class == CLASS_BOBAFETT + || self->client->NPC_class == CLASS_ROCKETTROOPER) + { + /* + if ( ent->s.pos.trType == TR_STATIONARY && (ent->s.eFlags&EF_MISSILE_STICK) ) + {//sorry, you're scrooged here + //FIXME: maybe jump or go up if on ground? + continue; + } + //else it's a rocket, try to evade it + */ + //HMM... let's see what happens if these guys try to avoid tripmines and detpacks, too...? + } + else + {//I dont care if I'm a rocket trooper or boba fett cuz I'm not, I'm a MELEE JEDAI + if (ent->s.pos.trType == TR_STATIONARY && (ent->s.eFlags&EF_MISSILE_STICK)) + {//a placed explosive like a tripmine or detpack + if (InFOV(ent->currentOrigin, self->client->renderInfo.eyePoint, self->client->ps.viewangles, 90, 90)) + {//in front of me + if (G_ClearLOS(self, ent)) + {//can see it + vec3_t throwDir; + //make the gesture + ForceThrow(self, qfalse); + //take it off the wall and toss it + ent->s.pos.trType = TR_GRAVITY; + ent->s.eType = ET_MISSILE; + ent->s.eFlags &= ~EF_MISSILE_STICK; + ent->s.eFlags |= EF_BOUNCE_HALF; + AngleVectors(ent->currentAngles, throwDir, NULL, NULL); + VectorMA(ent->currentOrigin, ent->maxs[0] + 4, throwDir, ent->currentOrigin); + VectorCopy(ent->currentOrigin, ent->s.pos.trBase); + VectorScale(throwDir, 300, ent->s.pos.trDelta); + ent->s.pos.trDelta[2] += 150; + VectorMA(ent->s.pos.trDelta, 800, dir, ent->s.pos.trDelta); + ent->s.pos.trTime = level.time; // move a bit on the very first frame + VectorCopy(ent->currentOrigin, ent->s.pos.trBase); + ent->owner = self; + // make it explode, but with less damage + ent->splashDamage /= 3; + ent->splashRadius /= 3; + ent->e_ThinkFunc = thinkF_WP_Explode; + ent->nextthink = level.time + Q_irand(500, 3000); + } + } + } + else if (dist < ent->splashRadius + && self->client->ps.groundEntityNum != ENTITYNUM_NONE + && (DotProduct(dir, forward) < SABER_REFLECT_MISSILE_CONE + || !WP_ForcePowerUsable(self, FP_PUSH, 0))) + {//NPCs try to evade it + self->client->ps.forceJumpCharge = 480; + } + else + {//else, try to force-throw it away + if (!ent->owner || !OnSameTeam(self, ent->owner)) + { + //FIXME: check forcePushRadius[NPC->client->ps.forcePowerLevel[FP_PUSH]] + ForceThrow(self, qfalse); + } + } + //otherwise, can't block it, so we're screwed + continue; + } + } + } + } + } +} + void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) { float dist; @@ -13553,8 +13855,9 @@ qboolean WP_ForcePowerUsable(gentity_t *self, forcePowers_t forcePower, int over } else { - if (forcePower == FP_SABERTHROW && (self->client->ps.saber[0].saberFlags&SFL_NOT_THROWABLE)) - {//cannot throw this kind of saber + if ((forcePower == FP_SABERTHROW && self->client->ps.saber[0].saberFlags&SFL_NOT_THROWABLE) + || (forcePower == FP_SABERTHROW && self->client->buttons & BUTTON_USE)) + {//cannot throw this type of saber or player is in kick mode return qfalse; } diff --git a/code/ui/ui_shared.cpp b/code/ui/ui_shared.cpp index 3936067b8f..98cd4df82b 100644 --- a/code/ui/ui_shared.cpp +++ b/code/ui/ui_shared.cpp @@ -5413,7 +5413,9 @@ static const char *g_bindCommands[] = { "weapon 8", "weapon 9", "weapprev", - "zoom" + "zoom", + "weapon", + "give weapon_melee" }; #define g_bindCount ARRAY_LEN(g_bindCommands) From bfda9ecfef432b752706bb21542c535488d8f564 Mon Sep 17 00:00:00 2001 From: dusty22 Date: Tue, 7 Jul 2015 19:25:23 -0400 Subject: [PATCH 009/445] Got the pull from JACoders done finally... (massive sigh of relief/defeat) What I just said --- CHANGELOG.txt | 18 +- CMakeLists.txt | 186 +- CMakeModules/FindSDL2.cmake | 34 +- CMakeModules/InstallConfig.cmake | 163 + CMakeModules/InstallZIP.cmake | 83 + CMakeModules/LICENSE_1_0.txt | 26 + README.md | 21 +- code/CMakeLists.txt | 148 +- code/Ragl/graph_region.h | 28 +- code/Ragl/graph_triangulate.h | 28 +- code/Ragl/graph_vs.h | 28 +- code/Ragl/kdtree_vs.h | 28 +- code/Ragl/ragl_common.h | 28 +- code/Ratl/array_vs.h | 28 +- code/Ratl/bits_vs.h | 28 +- code/Ratl/grid_vs.h | 28 +- code/Ratl/handle_pool_vs.h | 42 +- code/Ratl/hash_pool_vs.h | 28 +- code/Ratl/heap_vs.h | 28 +- code/Ratl/list_vs.h | 28 +- code/Ratl/map_vs.h | 281 +- code/Ratl/pool_vs.h | 42 +- code/Ratl/queue_vs.h | 35 +- code/Ratl/ratl.cpp | 55 +- code/Ratl/ratl_common.h | 50 +- code/Ratl/scheduler_vs.h | 28 +- code/Ratl/stack_vs.h | 32 +- code/Ratl/string_vs.h | 28 +- code/Ratl/vector_vs.h | 32 +- code/Ravl/CBounds.cpp | 28 +- code/Ravl/CBounds.h | 30 +- code/Ravl/CMatrix.h | 30 +- code/Ravl/CVec.cpp | 35 +- code/Ravl/CVec.h | 28 +- code/Rufl/hfile.cpp | 30 +- code/Rufl/hfile.h | 37 +- code/Rufl/hstring.cpp | 30 +- code/Rufl/hstring.h | 28 +- code/cgame/FX_ATSTMain.cpp | 29 +- code/cgame/FX_Blaster.cpp | 29 +- code/cgame/FX_Bowcaster.cpp | 31 +- code/cgame/FX_BryarPistol.cpp | 29 +- code/cgame/FX_Concussion.cpp | 31 +- code/cgame/FX_DEMP2.cpp | 29 +- code/cgame/FX_Disruptor.cpp | 29 +- code/cgame/FX_Emplaced.cpp | 31 +- code/cgame/FX_Flechette.cpp | 31 +- code/cgame/FX_HeavyRepeater.cpp | 31 +- code/cgame/FX_NoghriShot.cpp | 29 +- code/cgame/FX_RocketLauncher.cpp | 30 +- code/cgame/FX_TuskenShot.cpp | 29 +- code/cgame/FxPrimitives.cpp | 281 +- code/cgame/FxPrimitives.h | 28 +- code/cgame/FxScheduler.cpp | 31 +- code/cgame/FxScheduler.h | 37 +- code/cgame/FxSystem.cpp | 29 +- code/cgame/FxSystem.h | 28 +- code/cgame/FxTemplate.cpp | 29 +- code/cgame/FxUtil.cpp | 29 +- code/cgame/FxUtil.h | 28 +- code/cgame/animtable.h | 37 +- code/cgame/cg_camera.cpp | 29 +- code/cgame/cg_camera.h | 35 +- code/cgame/cg_consolecmds.cpp | 38 +- code/cgame/cg_credits.cpp | 50 +- code/cgame/cg_draw.cpp | 232 +- code/cgame/cg_drawtools.cpp | 36 +- code/cgame/cg_effects.cpp | 36 +- code/cgame/cg_ents.cpp | 92 +- code/cgame/cg_event.cpp | 122 +- code/cgame/cg_headers.cpp | 29 +- code/cgame/cg_headers.h | 28 +- code/cgame/cg_info.cpp | 39 +- code/cgame/cg_lights.cpp | 32 +- code/cgame/cg_local.h | 44 +- code/cgame/cg_localents.cpp | 36 +- code/cgame/cg_main.cpp | 552 +- code/cgame/cg_marks.cpp | 54 +- code/cgame/cg_media.h | 48 +- code/cgame/cg_players.cpp | 1012 +- code/cgame/cg_playerstate.cpp | 35 +- code/cgame/cg_predict.cpp | 35 +- code/cgame/cg_public.h | 35 +- code/cgame/cg_scoreboard.cpp | 36 +- code/cgame/cg_servercmds.cpp | 36 +- code/cgame/cg_snapshot.cpp | 36 +- code/cgame/cg_syscalls.cpp | 37 +- code/cgame/cg_text.cpp | 30 +- code/cgame/cg_view.cpp | 258 +- code/cgame/cg_weapons.cpp | 47 +- code/cgame/common_headers.h | 29 +- code/cgame/strip_objectives.h | 28 +- code/client/cl_cgame.cpp | 68 +- code/client/cl_cin.cpp | 53 +- code/client/cl_console.cpp | 44 +- code/client/cl_input.cpp | 108 +- code/client/cl_keys.cpp | 54 +- code/client/cl_main.cpp | 82 +- code/client/cl_mp3.cpp | 32 +- code/client/cl_mp3.h | 28 +- code/client/cl_parse.cpp | 38 +- code/client/cl_scrn.cpp | 82 +- code/client/cl_ui.cpp | 71 +- code/client/client.h.BACKUP.2896.h | 425 + code/client/client.h.BACKUP.7476.h | 425 + code/client/client.h.BACKUP.8932.h | 425 + code/client/client.h.BASE.2896.h | 417 + code/client/client.h.BASE.7476.h | 417 + code/client/client.h.BASE.8932.h | 417 + code/client/client.h.LOCAL.2896.h | 419 + code/client/client.h.LOCAL.7476.h | 419 + code/client/client.h.LOCAL.8932.h | 419 + code/client/client.h.REMOTE.2896.h | 421 + code/client/client.h.REMOTE.7476.h | 421 + code/client/client.h.REMOTE.8932.h | 421 + code/client/client_ui.h | 29 +- code/client/eax/EaxMan.h | 5 +- code/client/keycodes.h | 29 +- code/client/keys.h | 29 +- code/client/snd_ambient.cpp | 48 +- code/client/snd_ambient.h | 52 +- code/client/snd_dma.cpp | 85 +- code/client/snd_local.h | 37 +- code/client/snd_mem.cpp | 41 +- code/client/snd_mix.cpp | 39 +- code/client/snd_music.cpp | 42 +- code/client/snd_music.h | 30 +- code/client/snd_public.h | 37 +- code/client/vmachine.cpp | 134 +- code/client/vmachine.h | 79 +- code/game/AI_Animal.cpp | 28 +- code/game/AI_AssassinDroid.cpp | 28 +- code/game/AI_Atst.cpp | 28 +- code/game/AI_BobaFett.cpp | 28 +- code/game/AI_Civilian.cpp | 28 +- code/game/AI_Default.cpp | 28 +- code/game/AI_Droid.cpp | 28 +- code/game/AI_GalakMech.cpp | 28 +- code/game/AI_Grenadier.cpp | 28 +- code/game/AI_HazardTrooper.cpp | 28 +- code/game/AI_Howler.cpp | 28 +- code/game/AI_ImperialProbe.cpp | 28 +- code/game/AI_Interrogator.cpp | 59 +- code/game/AI_Jedi.cpp | 8 +- code/game/AI_Mark1.cpp | 28 +- code/game/AI_Mark2.cpp | 28 +- code/game/AI_MineMonster.cpp | 28 +- code/game/AI_Rancor.cpp | 28 +- code/game/AI_Remote.cpp | 28 +- code/game/AI_RocketTrooper.cpp | 28 +- code/game/AI_SaberDroid.cpp | 28 +- code/game/AI_SandCreature.cpp | 29 +- code/game/AI_Seeker.cpp | 29 +- code/game/AI_Sentry.cpp | 28 +- code/game/AI_Sniper.cpp | 28 +- code/game/AI_Stormtrooper.cpp | 29 +- code/game/AI_Tusken.cpp | 28 +- code/game/AI_Utils.cpp | 28 +- code/game/AI_Wampa.cpp | 29 +- code/game/AnimalNPC.cpp | 76 +- code/game/CMakeLists.txt | 52 +- code/game/FighterNPC.cpp | 130 +- code/game/G_Timer.cpp | 28 +- code/game/NPC.cpp | 28 +- code/game/NPC_behavior.cpp | 187 +- code/game/NPC_combat.cpp | 346 +- code/game/NPC_goal.cpp | 28 +- code/game/NPC_misc.cpp | 28 +- code/game/NPC_move.cpp | 28 +- code/game/NPC_reactions.cpp | 28 +- code/game/NPC_senses.cpp | 28 +- code/game/NPC_sounds.cpp | 28 +- code/game/NPC_spawn.cpp | 63 +- code/game/NPC_stats.cpp | 712 +- code/game/NPC_utils.cpp | 222 +- code/game/Q3_Interface.cpp | 877 +- code/game/Q3_Interface.h | 40 +- code/game/SpeederNPC.cpp | 92 +- code/game/WalkerNPC.cpp | 62 +- code/game/ai.h | 28 +- code/game/anims.h | 30 +- code/game/b_local.h | 28 +- code/game/b_public.h | 31 +- code/game/bg_local.h | 35 +- code/game/bg_misc.cpp | 76 +- code/game/bg_pangles.cpp | 180 +- code/game/bg_panimate.cpp | 3889 +++-- code/game/bg_panimate.cpp.BACKUP.8780.cpp | 7964 +++++++++ code/game/bg_panimate.cpp.BASE.8780.cpp | 7255 ++++++++ code/game/bg_panimate.cpp.LOCAL.8780.cpp | 7842 +++++++++ code/game/bg_panimate.cpp.REMOTE.8780.cpp | 7258 ++++++++ code/game/bg_public.h | 35 +- code/game/bg_slidemove.cpp | 90 +- code/game/bg_vehicleLoad.cpp | 548 +- code/game/bset.h | 28 +- code/game/bstate.h | 28 +- code/game/channels.h | 28 +- code/game/common_headers.h | 28 +- code/game/dmstates.h | 28 +- code/game/events.h | 28 +- code/game/fields.h | 30 +- code/game/g_active.cpp | 53 +- code/game/g_breakable.cpp | 28 +- code/game/g_camera.cpp | 29 +- code/game/g_client.cpp | 40 +- code/game/g_cmds.cpp | 36 +- code/game/g_combat.cpp | 35 +- code/game/g_emplaced.cpp | 28 +- code/game/g_functions.cpp | 28 +- code/game/g_functions.h | 28 +- code/game/g_fx.cpp | 74 +- code/game/g_inventory.cpp | 28 +- code/game/g_itemLoad.cpp | 263 +- code/game/g_items.cpp | 36 +- code/game/g_items.h | 35 +- code/game/g_local.h | 37 +- code/game/g_main.cpp | 149 +- code/game/g_mem.cpp | 35 +- code/game/g_misc.cpp | 35 +- code/game/g_misc_model.cpp | 28 +- code/game/g_missile.cpp | 35 +- code/game/g_mover.cpp | 35 +- code/game/g_nav.cpp | 28 +- code/game/g_nav.h | 28 +- code/game/g_navigator.cpp | 284 +- code/game/g_navigator.h | 28 +- code/game/g_navnew.cpp | 28 +- code/game/g_object.cpp | 29 +- code/game/g_objectives.cpp | 29 +- code/game/g_public.h | 41 +- code/game/g_rail.cpp | 28 +- code/game/g_ref.cpp | 58 +- code/game/g_roff.cpp | 28 +- code/game/g_roff.h | 28 +- code/game/g_savegame.cpp | 178 +- code/game/g_session.cpp | 35 +- code/game/g_shared.h | 28 +- code/game/g_spawn.cpp | 55 +- code/game/g_svcmds.cpp | 117 +- code/game/g_target.cpp | 36 +- code/game/g_trigger.cpp | 35 +- code/game/g_turret.cpp | 28 +- code/game/g_usable.cpp | 29 +- code/game/g_utils.cpp | 41 +- code/game/g_vehicles.cpp | 165 +- code/game/g_vehicles.h | 31 +- code/game/g_weapon.cpp | 279 +- code/game/g_weaponLoad.cpp | 28 +- code/game/genericparser2.cpp | 38 +- code/game/genericparser2.h | 34 +- code/game/ghoul2_shared.h | 60 +- code/game/hitlocs.h | 28 +- code/game/npc_headers.h | 28 +- code/game/objectives.h | 28 +- code/game/say.h | 29 +- code/game/statindex.h | 35 +- code/game/surfaceflags.h | 32 +- code/game/teams.h | 29 +- code/game/w_local.h | 28 +- code/game/weapons.h | 35 +- code/game/wp_atst.cpp | 28 +- code/game/wp_blaster_pistol.cpp | 28 +- code/game/wp_blaster_rifle.cpp | 30 +- code/game/wp_bot_laser.cpp | 28 +- code/game/wp_bowcaster.cpp | 28 +- code/game/wp_concussion.cpp | 28 +- code/game/wp_demp2.cpp | 28 +- code/game/wp_det_pack.cpp | 28 +- code/game/wp_disruptor.cpp | 28 +- code/game/wp_emplaced_gun.cpp | 28 +- code/game/wp_flechette.cpp | 28 +- code/game/wp_melee.cpp | 28 +- code/game/wp_noghri_stick.cpp | 28 +- code/game/wp_repeater.cpp | 28 +- code/game/wp_rocket_launcher.cpp | 28 +- code/game/wp_saber.h | 28 +- code/game/wp_saberLoad.cpp | 143 +- code/game/wp_stun_baton.cpp | 28 +- code/game/wp_thermal.cpp | 54 +- code/game/wp_trip_mine.cpp | 29 +- code/game/wp_tusken.cpp | 28 +- code/ghoul2/G2.h | 44 +- code/ghoul2/ghoul2_gore.h | 35 +- code/icarus/BlockStream.cpp | 28 +- code/icarus/IcarusImplementation.cpp | 28 +- code/icarus/IcarusImplementation.h | 47 +- code/icarus/IcarusInterface.h | 28 +- code/icarus/Sequence.cpp | 28 +- code/icarus/Sequencer.cpp | 38 +- code/icarus/StdAfx.h | 38 +- code/icarus/TaskManager.cpp | 28 +- code/icarus/blockstream.h | 30 +- code/icarus/sequence.h | 32 +- code/icarus/sequencer.h | 34 +- code/icarus/taskmanager.h | 40 +- code/macosx/macosx_glimp.h | 37 - code/mp3code/cdct.c | 4 - code/mp3code/config.h | 2 - code/mp3code/csbtb.c | 3 - code/mp3code/csbtl3.c | 3 - code/mp3code/cup.c | 6 - code/mp3code/cupini.c | 10 - code/mp3code/cupl1.c | 4 - code/mp3code/cupl3.c | 4 + code/mp3code/cwin.c | 39 +- code/mp3code/cwinb.c | 3 - code/mp3code/cwinm.c | 6 - code/mp3code/jdw.h | 6 - code/mp3code/l3.h | 32 +- code/mp3code/l3dq.c | 8 - code/mp3code/l3init.c | 14 +- code/mp3code/mhead.h | 4 - code/mp3code/mp3struct.h | 9 - code/mp3code/uph.c | 7 - code/mp3code/wavep.c | 3 - code/qcommon/MiniHeap.h | 28 +- code/qcommon/chash.h | 5 +- code/qcommon/cm_load.cpp | 35 +- code/qcommon/cm_local.h | 35 +- code/qcommon/cm_patch.cpp | 52 +- code/qcommon/cm_patch.h | 35 +- code/qcommon/cm_polylib.cpp | 31 +- code/qcommon/cm_polylib.h | 35 +- code/qcommon/cm_public.h | 35 +- code/qcommon/cm_test.cpp | 36 +- code/qcommon/cm_trace.cpp | 35 +- code/qcommon/cmd.cpp | 108 +- code/qcommon/common.cpp | 180 +- code/qcommon/cvar.cpp | 54 +- code/qcommon/{files_pc.cpp => files.cpp} | 1672 +- code/qcommon/files.h | 127 - code/qcommon/files_common.cpp | 661 - code/qcommon/files_console.cpp | 1029 -- code/qcommon/matcomp.cpp | 79 +- code/qcommon/md4.cpp | 411 +- code/qcommon/msg.cpp | 37 +- code/qcommon/net_chan.cpp | 61 +- code/qcommon/persistence.cpp | 20 + code/qcommon/q_math.cpp | 226 +- code/qcommon/q_platform.h | 28 +- code/qcommon/q_shared.cpp | 304 +- code/qcommon/q_shared.h | 115 +- code/qcommon/qcommon.h | 215 +- code/qcommon/qfiles.h | 35 +- code/qcommon/sstring.h | 28 +- code/qcommon/stringed_ingame.cpp | 77 +- code/qcommon/stringed_ingame.h | 28 +- code/qcommon/stringed_interface.cpp | 39 +- code/qcommon/stringed_interface.h | 34 +- code/qcommon/strip.cpp | 78 +- code/qcommon/strippublic.h | 28 +- code/qcommon/stv_version.h | 34 +- code/qcommon/tags.h | 28 +- code/qcommon/timing.h | 28 +- code/qcommon/tri_coll_test.cpp | 36 +- code/qcommon/tri_coll_test.h | 5 +- code/qcommon/z_memman_pc.cpp | 32 +- code/rd-common/mdx_format.h | 28 +- code/rd-common/tr_common.h | 27 + code/rd-common/tr_font.cpp | 254 +- code/rd-common/tr_font.h | 28 +- code/rd-common/tr_image_jpg.cpp | 181 +- code/rd-common/tr_image_load.cpp | 26 +- code/rd-common/tr_image_png.cpp | 28 +- code/rd-common/tr_image_tga.cpp | 26 +- code/rd-common/tr_noise.cpp | 40 +- code/rd-common/tr_public.h | 68 +- code/rd-common/tr_types.h | 38 +- code/rd-vanilla/CMakeLists.txt | 98 +- code/rd-vanilla/G2_API.cpp | 172 +- code/rd-vanilla/G2_bolts.cpp | 44 +- code/rd-vanilla/G2_bones.cpp | 41 +- code/rd-vanilla/G2_misc.cpp | 58 +- code/rd-vanilla/G2_surfaces.cpp | 68 +- code/rd-vanilla/glext.h | 13792 +++++++++++++--- code/rd-vanilla/qgl.h | 1090 +- code/rd-vanilla/tr_WorldEffects.cpp | 37 +- code/rd-vanilla/tr_WorldEffects.h | 28 +- code/rd-vanilla/tr_arb.cpp | 192 + code/rd-vanilla/tr_backend.cpp | 434 +- code/rd-vanilla/tr_bsp.cpp | 68 +- code/rd-vanilla/tr_cmds.cpp | 117 +- code/rd-vanilla/tr_curve.cpp | 40 +- code/rd-vanilla/tr_draw.cpp | 100 +- code/rd-vanilla/tr_flares.cpp | 430 - code/rd-vanilla/tr_ghoul2.cpp | 298 +- code/rd-vanilla/tr_image.cpp | 675 +- code/rd-vanilla/tr_init.cpp | 1034 +- code/rd-vanilla/tr_light.cpp | 39 +- code/rd-vanilla/tr_local.h | 92 +- code/rd-vanilla/tr_main.cpp | 146 +- code/rd-vanilla/tr_marks.cpp | 40 +- code/rd-vanilla/tr_mesh.cpp | 38 +- code/rd-vanilla/tr_model.cpp | 87 +- code/rd-vanilla/tr_quicksprite.cpp | 46 +- code/rd-vanilla/tr_quicksprite.h | 46 +- code/rd-vanilla/tr_scene.cpp | 34 +- code/rd-vanilla/tr_shade.cpp | 173 +- code/rd-vanilla/tr_shade_calc.cpp | 127 +- code/rd-vanilla/tr_shader.cpp | 449 +- code/rd-vanilla/tr_shadows.cpp | 70 +- code/rd-vanilla/tr_skin.cpp | 484 + code/rd-vanilla/tr_sky.cpp | 108 +- code/rd-vanilla/tr_stl.cpp | 58 +- code/rd-vanilla/tr_stl.h | 28 +- code/rd-vanilla/tr_subs.cpp | 35 +- code/rd-vanilla/tr_surface.cpp | 191 +- code/rd-vanilla/tr_surfacesprites.cpp | 31 +- code/rd-vanilla/tr_world.cpp | 37 +- code/sdl/sdl_glimp.cpp | 1090 -- code/sdl/sdl_input.cpp | 938 -- code/sdl/sdl_qgl.h | 393 - code/sdl/sdl_snd.cpp | 293 - code/server/exe_headers.cpp | 32 +- code/server/exe_headers.h | 28 +- code/server/server.h | 35 +- code/server/sv_ccmds.cpp | 54 +- code/server/sv_client.cpp | 34 +- code/server/sv_game.cpp | 726 +- code/server/sv_init.cpp | 37 +- code/server/sv_main.cpp | 39 +- code/server/sv_savegame.cpp | 130 +- code/server/sv_snapshot.cpp | 40 +- code/server/sv_world.cpp | 39 +- code/sys/sys_loadlib.h | 59 - code/sys/sys_local.h | 15 - code/sys/sys_main.cpp | 385 - code/sys/sys_unix.cpp | 636 - code/ui/gameinfo.cpp | 32 +- code/ui/gameinfo.h | 28 +- code/ui/menudef.h | 28 +- code/ui/ui_atoms.cpp | 35 +- code/ui/ui_connect.cpp | 65 +- code/ui/ui_debug.cpp | 747 - code/ui/ui_local.h | 67 +- code/ui/ui_main.cpp | 1301 +- code/ui/ui_public.h | 37 +- code/ui/ui_saber.cpp | 30 +- code/ui/ui_shared.cpp | 3170 ++-- code/ui/ui_shared.h | 46 +- code/ui/ui_splash.cpp | 292 - code/ui/ui_splash.h | 11 - code/ui/ui_syscalls.cpp | 40 +- code/win32/AutoVersion.h | 5 +- code/win32/afxres.h | 5 +- code/win32/win_gamma.cpp | 5 +- code/win32/win_glimp.cpp | 5 +- code/win32/win_input.cpp | 5 +- code/win32/win_local.h | 5 +- code/win32/win_main.cpp | 126 +- code/win32/win_qgl.cpp | 5 +- code/win32/win_shared.cpp | 5 +- code/win32/win_snd.cpp | 5 +- code/win32/win_syscon.cpp | 5 +- code/win32/win_wndproc.cpp | 15 +- codeJK2/cgame/FX_ATSTMain.cpp | 28 +- codeJK2/cgame/FX_Blaster.cpp | 28 +- codeJK2/cgame/FX_Bowcaster.cpp | 28 +- codeJK2/cgame/FX_BryarPistol.cpp | 28 +- codeJK2/cgame/FX_DEMP2.cpp | 28 +- codeJK2/cgame/FX_Disruptor.cpp | 28 +- codeJK2/cgame/FX_Emplaced.cpp | 28 +- codeJK2/cgame/FX_Flechette.cpp | 28 +- codeJK2/cgame/FX_HeavyRepeater.cpp | 28 +- codeJK2/cgame/FX_RocketLauncher.cpp | 28 +- codeJK2/cgame/FxPrimitives.cpp | 274 +- codeJK2/cgame/FxPrimitives.h | 28 +- codeJK2/cgame/FxScheduler.cpp | 164 +- codeJK2/cgame/FxScheduler.h | 33 +- codeJK2/cgame/FxSystem.cpp | 28 +- codeJK2/cgame/FxSystem.h | 28 +- codeJK2/cgame/FxTemplate.cpp | 207 +- codeJK2/cgame/FxUtil.cpp | 28 +- codeJK2/cgame/FxUtil.h | 28 +- codeJK2/cgame/animtable.h | 31 +- codeJK2/cgame/cg_camera.cpp | 29 +- codeJK2/cgame/cg_camera.h | 28 +- codeJK2/cgame/cg_consolecmds.cpp | 36 +- codeJK2/cgame/cg_credits.cpp | 32 +- codeJK2/cgame/cg_draw.cpp | 35 +- codeJK2/cgame/cg_drawtools.cpp | 35 +- codeJK2/cgame/cg_effects.cpp | 35 +- codeJK2/cgame/cg_ents.cpp | 35 +- codeJK2/cgame/cg_event.cpp | 99 +- codeJK2/cgame/cg_info.cpp | 44 +- codeJK2/cgame/cg_lights.cpp | 33 +- codeJK2/cgame/cg_local.h | 35 +- codeJK2/cgame/cg_localents.cpp | 35 +- codeJK2/cgame/cg_main.cpp | 474 +- codeJK2/cgame/cg_marks.cpp | 45 +- codeJK2/cgame/cg_media.h | 48 +- codeJK2/cgame/cg_players.cpp | 783 +- codeJK2/cgame/cg_playerstate.cpp | 35 +- codeJK2/cgame/cg_predict.cpp | 35 +- codeJK2/cgame/cg_public.h | 35 +- codeJK2/cgame/cg_scoreboard.cpp | 35 +- codeJK2/cgame/cg_servercmds.cpp | 35 +- codeJK2/cgame/cg_snapshot.cpp | 35 +- codeJK2/cgame/cg_syscalls.cpp | 36 +- codeJK2/cgame/cg_text.cpp | 136 +- codeJK2/cgame/cg_view.cpp | 35 +- codeJK2/cgame/cg_weapons.cpp | 336 +- codeJK2/cgame/strip_objectives.h | 28 +- codeJK2/game/AI_Atst.cpp | 32 +- codeJK2/game/AI_Default.cpp | 28 +- codeJK2/game/AI_Droid.cpp | 31 +- codeJK2/game/AI_GalakMech.cpp | 31 +- codeJK2/game/AI_Grenadier.cpp | 31 +- codeJK2/game/AI_Howler.cpp | 31 +- codeJK2/game/AI_ImperialProbe.cpp | 31 +- codeJK2/game/AI_Interrogator.cpp | 31 +- codeJK2/game/AI_Jedi.cpp | 312 +- codeJK2/game/AI_Mark1.cpp | 30 +- codeJK2/game/AI_Mark2.cpp | 31 +- codeJK2/game/AI_MineMonster.cpp | 31 +- codeJK2/game/AI_Remote.cpp | 31 +- codeJK2/game/AI_Seeker.cpp | 31 +- codeJK2/game/AI_Sentry.cpp | 31 +- codeJK2/game/AI_Sniper.cpp | 31 +- codeJK2/game/AI_Stormtrooper.cpp | 137 +- codeJK2/game/AI_Utils.cpp | 31 +- codeJK2/game/CMakeLists.txt | 36 +- codeJK2/game/G_Timer.cpp | 31 +- codeJK2/game/NPC.cpp | 117 +- codeJK2/game/NPC_behavior.cpp | 137 +- codeJK2/game/NPC_combat.cpp | 29 +- codeJK2/game/NPC_goal.cpp | 33 +- codeJK2/game/NPC_misc.cpp | 36 +- codeJK2/game/NPC_move.cpp | 32 +- codeJK2/game/NPC_reactions.cpp | 31 +- codeJK2/game/NPC_senses.cpp | 32 +- codeJK2/game/NPC_sounds.cpp | 32 +- codeJK2/game/NPC_spawn.cpp | 33 +- codeJK2/game/NPC_stats.cpp | 506 +- codeJK2/game/NPC_utils.cpp | 32 +- codeJK2/game/Q3_Interface.cpp | 197 +- codeJK2/game/Q3_Interface.h | 28 +- codeJK2/game/Q3_Registers.cpp | 32 +- codeJK2/game/Q3_Registers.h | 28 +- codeJK2/game/ai.h | 28 +- codeJK2/game/anims.h | 28 +- codeJK2/game/b_local.h | 28 +- codeJK2/game/b_public.h | 28 +- codeJK2/game/bg_local.h | 35 +- codeJK2/game/bg_misc.cpp | 79 +- codeJK2/game/bg_pangles.cpp | 35 +- codeJK2/game/bg_panimate.cpp | 531 +- codeJK2/game/bg_pmove.cpp | 766 +- codeJK2/game/bg_public.h | 35 +- codeJK2/game/bg_slidemove.cpp | 81 +- codeJK2/game/bset.h | 28 +- codeJK2/game/bstate.h | 28 +- codeJK2/game/channels.h | 28 +- codeJK2/game/characters.h | 28 +- codeJK2/game/dmstates.h | 28 +- codeJK2/game/events.h | 28 +- codeJK2/game/fields.h | 32 +- codeJK2/game/g_ICARUS.cpp | 30 +- codeJK2/game/g_active.cpp | 37 +- codeJK2/game/g_breakable.cpp | 30 +- codeJK2/game/g_camera.cpp | 30 +- codeJK2/game/g_client.cpp | 218 +- codeJK2/game/g_cmds.cpp | 37 +- codeJK2/game/g_combat.cpp | 386 +- codeJK2/game/g_functions.cpp | 33 +- codeJK2/game/g_functions.h | 28 +- codeJK2/game/g_fx.cpp | 56 +- codeJK2/game/g_headers.h | 28 +- codeJK2/game/g_icarus.h | 28 +- codeJK2/game/g_inventory.cpp | 31 +- codeJK2/game/g_itemLoad.cpp | 696 +- codeJK2/game/g_items.cpp | 179 +- codeJK2/game/g_items.h | 28 +- codeJK2/game/g_local.h | 35 +- codeJK2/game/g_main.cpp | 125 +- codeJK2/game/g_mem.cpp | 39 +- codeJK2/game/g_misc.cpp | 259 +- codeJK2/game/g_misc_model.cpp | 77 +- codeJK2/game/g_missile.cpp | 37 +- codeJK2/game/g_mover.cpp | 216 +- codeJK2/game/g_nav.cpp | 96 +- codeJK2/game/g_nav.h | 28 +- codeJK2/game/g_navigator.cpp | 177 +- codeJK2/game/g_navigator.h | 48 +- codeJK2/game/g_navnew.cpp | 62 +- codeJK2/game/g_object.cpp | 30 +- codeJK2/game/g_objectives.cpp | 30 +- codeJK2/game/g_public.h | 37 +- codeJK2/game/g_ref.cpp | 55 +- codeJK2/game/g_roff.cpp | 32 +- codeJK2/game/g_roff.h | 28 +- codeJK2/game/g_savegame.cpp | 134 +- codeJK2/game/g_session.cpp | 46 +- codeJK2/game/g_shared.h | 28 +- codeJK2/game/g_spawn.cpp | 39 +- codeJK2/game/g_svcmds.cpp | 39 +- codeJK2/game/g_target.cpp | 39 +- codeJK2/game/g_trigger.cpp | 31 +- codeJK2/game/g_turret.cpp | 132 +- codeJK2/game/g_usable.cpp | 37 +- codeJK2/game/g_utils.cpp | 132 +- codeJK2/game/g_weapon.cpp | 92 +- codeJK2/game/g_weaponLoad.cpp | 183 +- codeJK2/game/genericparser2.cpp | 40 +- codeJK2/game/genericparser2.h | 32 +- codeJK2/game/ghoul2_shared.h | 29 +- codeJK2/game/npc_headers.h | 30 +- codeJK2/game/objectives.h | 28 +- codeJK2/game/say.h | 28 +- codeJK2/game/statindex.h | 31 +- codeJK2/game/surfaceflags.h | 31 +- codeJK2/game/teams.h | 29 +- codeJK2/game/w_local.h | 28 +- codeJK2/game/weapons.h | 35 +- codeJK2/game/wp_atst.cpp | 28 +- codeJK2/game/wp_blaster_rifle.cpp | 28 +- codeJK2/game/wp_bot_laser.cpp | 28 +- codeJK2/game/wp_bowcaster.cpp | 29 +- codeJK2/game/wp_bryar_pistol.cpp | 28 +- codeJK2/game/wp_demp2.cpp | 28 +- codeJK2/game/wp_det_pack.cpp | 36 +- codeJK2/game/wp_disruptor.cpp | 28 +- codeJK2/game/wp_emplaced_gun.cpp | 28 +- codeJK2/game/wp_flechette.cpp | 28 +- codeJK2/game/wp_melee.cpp | 28 +- codeJK2/game/wp_repeater.cpp | 28 +- codeJK2/game/wp_rocket_launcher.cpp | 28 +- codeJK2/game/wp_saber.cpp | 485 +- codeJK2/game/wp_saber.h | 28 +- codeJK2/game/wp_stun_baton.cpp | 28 +- codeJK2/game/wp_thermal.cpp | 48 +- codeJK2/game/wp_trip_mine.cpp | 34 +- codeJK2/icarus/BlockStream.cpp | 33 +- codeJK2/icarus/Instance.cpp | 28 +- codeJK2/icarus/Sequence.cpp | 28 +- codeJK2/icarus/Sequencer.cpp | 38 +- codeJK2/icarus/TaskManager.cpp | 28 +- codeJK2/icarus/blockstream.h | 43 +- codeJK2/icarus/icarus.h | 44 +- codeJK2/icarus/instance.h | 28 +- codeJK2/icarus/interface.h | 28 +- codeJK2/icarus/interpreter.h | 28 +- codeJK2/icarus/sequence.h | 28 +- codeJK2/icarus/sequencer.h | 40 +- codeJK2/icarus/taskmanager.h | 28 +- codeJK2/icarus/tokenizer.h | 92 +- codeJK2/win32/AutoVersion.h | 5 +- codeJK2/win32/afxres.h | 5 +- codemp/CMakeLists.txt | 262 +- codemp/Ratl/bits_vs.h | 22 + codemp/Ratl/ratl_common.h | 26 +- codemp/Ratl/vector_vs.h | 26 +- codemp/Ravl/CVec.h | 22 + codemp/botlib/aasfile.h | 23 + codemp/botlib/be_aas.h | 27 +- codemp/botlib/be_aas_bsp.h | 24 +- codemp/botlib/be_aas_bspq3.cpp | 22 + codemp/botlib/be_aas_cluster.cpp | 22 + codemp/botlib/be_aas_cluster.h | 24 +- codemp/botlib/be_aas_debug.cpp | 22 + codemp/botlib/be_aas_debug.h | 24 +- codemp/botlib/be_aas_def.h | 24 +- codemp/botlib/be_aas_entity.cpp | 22 + codemp/botlib/be_aas_entity.h | 25 +- codemp/botlib/be_aas_file.cpp | 22 + codemp/botlib/be_aas_file.h | 25 +- codemp/botlib/be_aas_funcs.h | 25 +- codemp/botlib/be_aas_main.cpp | 22 + codemp/botlib/be_aas_main.h | 25 +- codemp/botlib/be_aas_move.cpp | 22 + codemp/botlib/be_aas_move.h | 25 +- codemp/botlib/be_aas_optimize.cpp | 22 + codemp/botlib/be_aas_optimize.h | 25 +- codemp/botlib/be_aas_reach.cpp | 22 + codemp/botlib/be_aas_reach.h | 25 +- codemp/botlib/be_aas_route.cpp | 26 +- codemp/botlib/be_aas_route.h | 25 +- codemp/botlib/be_aas_routealt.cpp | 22 + codemp/botlib/be_aas_routealt.h | 25 +- codemp/botlib/be_aas_sample.cpp | 22 + codemp/botlib/be_aas_sample.h | 25 +- codemp/botlib/be_ai_char.cpp | 22 + codemp/botlib/be_ai_char.h | 26 +- codemp/botlib/be_ai_chat.cpp | 22 + codemp/botlib/be_ai_chat.h | 27 +- codemp/botlib/be_ai_gen.cpp | 22 + codemp/botlib/be_ai_gen.h | 26 +- codemp/botlib/be_ai_goal.cpp | 22 + codemp/botlib/be_ai_goal.h | 27 +- codemp/botlib/be_ai_move.cpp | 22 + codemp/botlib/be_ai_move.h | 26 +- codemp/botlib/be_ai_weap.cpp | 22 + codemp/botlib/be_ai_weap.h | 26 +- codemp/botlib/be_ai_weight.cpp | 22 + codemp/botlib/be_ai_weight.h | 25 +- codemp/botlib/be_ea.cpp | 22 + codemp/botlib/be_ea.h | 26 +- codemp/botlib/be_interface.cpp | 22 + codemp/botlib/be_interface.h | 25 +- codemp/botlib/botlib.h | 25 +- codemp/botlib/l_crc.cpp | 22 + codemp/botlib/l_crc.h | 25 +- codemp/botlib/l_libvar.cpp | 22 + codemp/botlib/l_libvar.h | 25 +- codemp/botlib/l_log.cpp | 22 + codemp/botlib/l_log.h | 25 +- codemp/botlib/l_memory.cpp | 22 + codemp/botlib/l_memory.h | 25 +- codemp/botlib/l_precomp.cpp | 24 +- codemp/botlib/l_precomp.h | 25 +- codemp/botlib/l_script.cpp | 22 + codemp/botlib/l_script.h | 25 +- codemp/botlib/l_struct.cpp | 22 + codemp/botlib/l_struct.h | 24 +- codemp/botlib/l_utils.h | 25 +- codemp/cgame/CMakeLists.txt | 65 +- codemp/cgame/animtable.h | 25 +- codemp/cgame/cg_consolecmds.c | 26 +- codemp/cgame/cg_cvar.c | 23 + codemp/cgame/cg_draw.c | 25 +- codemp/cgame/cg_drawtools.c | 25 +- codemp/cgame/cg_effects.c | 25 +- codemp/cgame/cg_ents.c | 28 +- codemp/cgame/cg_event.c | 25 +- codemp/cgame/cg_info.c | 25 +- codemp/cgame/cg_light.c | 30 +- codemp/cgame/cg_local.h | 26 +- codemp/cgame/cg_localents.c | 24 +- codemp/cgame/cg_main.c | 26 +- codemp/cgame/cg_marks.c | 25 +- codemp/cgame/cg_newDraw.c | 23 + codemp/cgame/cg_players.c | 41 +- codemp/cgame/cg_playerstate.c | 27 +- codemp/cgame/cg_predict.c | 39 +- codemp/cgame/cg_public.h | 26 +- codemp/cgame/cg_saga.c | 24 +- codemp/cgame/cg_scoreboard.c | 25 +- codemp/cgame/cg_servercmds.c | 26 +- codemp/cgame/cg_snapshot.c | 25 +- codemp/cgame/cg_spawn.c | 23 + codemp/cgame/cg_syscalls.c | 27 +- codemp/cgame/cg_turret.c | 22 + codemp/cgame/cg_view.c | 25 +- codemp/cgame/cg_weaponinit.c | 22 + codemp/cgame/cg_weapons.c | 25 +- codemp/cgame/cg_xcvar.h | 22 + codemp/cgame/fx_blaster.c | 22 + codemp/cgame/fx_bowcaster.c | 22 + codemp/cgame/fx_bryarpistol.c | 22 + codemp/cgame/fx_demp2.c | 22 + codemp/cgame/fx_disruptor.c | 22 + codemp/cgame/fx_flechette.c | 22 + codemp/cgame/fx_force.c | 22 + codemp/cgame/fx_heavyrepeater.c | 22 + codemp/cgame/fx_local.h | 22 + codemp/cgame/fx_rocketlauncher.c | 22 + codemp/client/FXExport.cpp | 22 + codemp/client/FXExport.h | 22 + codemp/client/FxPrimitives.cpp | 147 +- codemp/client/FxPrimitives.h | 22 + codemp/client/FxScheduler.cpp | 43 +- codemp/client/FxScheduler.h | 39 +- codemp/client/FxSystem.cpp | 22 + codemp/client/FxSystem.h | 22 + codemp/client/FxTemplate.cpp | 22 + codemp/client/FxUtil.cpp | 22 + codemp/client/FxUtil.h | 22 + codemp/client/cl_avi.cpp | 8 +- codemp/client/cl_cgame.cpp | 33 +- codemp/client/cl_cgameapi.cpp | 22 +- codemp/client/cl_cgameapi.h | 20 + codemp/client/cl_cin.cpp | 24 + codemp/client/cl_console.cpp | 24 + codemp/client/cl_input.cpp | 50 +- codemp/client/cl_keys.cpp | 40 +- codemp/client/cl_lan.cpp | 23 + codemp/client/cl_lan.h | 23 + codemp/client/cl_main.cpp | 60 +- codemp/client/cl_net_chan.cpp | 23 + codemp/client/cl_parse.cpp | 31 +- codemp/client/cl_scrn.cpp | 34 +- codemp/client/cl_ui.cpp | 23 + codemp/client/cl_uiapi.cpp | 33 +- codemp/client/cl_uiapi.h | 20 + codemp/client/client.h | 25 +- codemp/client/keys.h | 23 + codemp/client/snd_ambient.cpp | 39 +- codemp/client/snd_ambient.h | 44 +- codemp/client/snd_dma.cpp | 43 +- codemp/client/snd_local.h | 25 +- codemp/client/snd_mem.cpp | 25 +- codemp/client/snd_mix.cpp | 27 +- codemp/client/snd_mp3.cpp | 23 + codemp/client/snd_mp3.h | 22 + codemp/client/snd_music.cpp | 62 +- codemp/client/snd_music.h | 22 + codemp/client/snd_public.h | 25 +- codemp/game/AnimalNPC.c | 21 + codemp/game/CMakeLists.txt | 65 +- codemp/game/FighterNPC.c | 22 + codemp/game/NPC.c | 22 + codemp/game/NPC_AI_Atst.c | 22 + codemp/game/NPC_AI_Default.c | 22 + codemp/game/NPC_AI_Droid.c | 22 + codemp/game/NPC_AI_GalakMech.c | 22 + codemp/game/NPC_AI_Grenadier.c | 22 + codemp/game/NPC_AI_Howler.c | 22 + codemp/game/NPC_AI_ImperialProbe.c | 22 + codemp/game/NPC_AI_Interrogator.c | 22 + codemp/game/NPC_AI_Jedi.c | 22 + codemp/game/NPC_AI_Mark1.c | 22 + codemp/game/NPC_AI_Mark2.c | 22 + codemp/game/NPC_AI_MineMonster.c | 22 + codemp/game/NPC_AI_Rancor.c | 22 + codemp/game/NPC_AI_Remote.c | 22 + codemp/game/NPC_AI_Seeker.c | 22 + codemp/game/NPC_AI_Sentry.c | 22 + codemp/game/NPC_AI_Sniper.c | 22 + codemp/game/NPC_AI_Stormtrooper.c | 22 + codemp/game/NPC_AI_Utils.c | 22 + codemp/game/NPC_AI_Wampa.c | 22 + codemp/game/NPC_behavior.c | 22 + codemp/game/NPC_combat.c | 22 + codemp/game/NPC_goal.c | 22 + codemp/game/NPC_misc.c | 22 + codemp/game/NPC_move.c | 22 + codemp/game/NPC_reactions.c | 22 + codemp/game/NPC_senses.c | 22 + codemp/game/NPC_sounds.c | 22 + codemp/game/NPC_spawn.c | 28 +- codemp/game/NPC_stats.c | 22 + codemp/game/NPC_utils.c | 22 + codemp/game/SpeederNPC.c | 21 + codemp/game/WalkerNPC.c | 21 + codemp/game/ai.h | 22 + codemp/game/ai_main.c | 24 +- codemp/game/ai_main.h | 23 + codemp/game/ai_util.c | 23 + codemp/game/ai_wpnav.c | 23 + codemp/game/anims.h | 22 + codemp/game/b_local.h | 22 + codemp/game/b_public.h | 22 + codemp/game/bg_g2_utils.c | 25 +- codemp/game/bg_local.h | 25 +- codemp/game/bg_misc.c | 27 +- codemp/game/bg_panimate.c | 22 + codemp/game/bg_pmove.c | 25 +- codemp/game/bg_public.h | 25 +- codemp/game/bg_saber.c | 23 + codemp/game/bg_saberLoad.c | 24 +- codemp/game/bg_saga.c | 24 +- codemp/game/bg_saga.h | 22 + codemp/game/bg_slidemove.c | 25 +- codemp/game/bg_vehicleLoad.c | 532 +- codemp/game/bg_vehicles.h | 25 +- codemp/game/bg_weapons.c | 24 +- codemp/game/bg_weapons.h | 23 + codemp/game/chars.h | 25 +- codemp/game/g_ICARUScb.c | 22 + codemp/game/g_ICARUScb.h | 22 + codemp/game/g_active.c | 173 +- codemp/game/g_bot.c | 31 +- codemp/game/g_client.c | 40 +- codemp/game/g_cmds.c | 75 +- codemp/game/g_combat.c | 25 +- codemp/game/g_cvar.c | 23 + codemp/game/g_exphysics.c | 24 +- codemp/game/g_items.c | 25 +- codemp/game/g_local.h | 30 +- codemp/game/g_log.c | 22 + codemp/game/g_main.c | 47 +- codemp/game/g_mem.c | 29 +- codemp/game/g_misc.c | 25 +- codemp/game/g_missile.c | 25 +- codemp/game/g_mover.c | 45 +- codemp/game/g_nav.c | 22 + codemp/game/g_nav.h | 22 + codemp/game/g_navnew.c | 22 + codemp/game/g_object.c | 22 + codemp/game/g_public.h | 35 +- codemp/game/g_saga.c | 26 +- codemp/game/g_session.c | 31 +- codemp/game/g_spawn.c | 27 +- codemp/game/g_svcmds.c | 27 +- codemp/game/g_syscalls.c | 27 +- codemp/game/g_target.c | 28 +- codemp/game/g_team.c | 25 +- codemp/game/g_team.h | 26 +- codemp/game/g_timer.c | 22 + codemp/game/g_trigger.c | 25 +- codemp/game/g_turret.c | 25 +- codemp/game/g_turret_G2.c | 22 + codemp/game/g_utils.c | 25 +- codemp/game/g_vehicleTurret.c | 22 + codemp/game/g_vehicles.c | 22 + codemp/game/g_weapon.c | 25 +- codemp/game/g_xcvar.h | 22 + codemp/game/inv.h | 23 + codemp/game/match.h | 23 + codemp/game/npc_headers.h | 22 + codemp/game/surfaceflags.h | 25 +- codemp/game/teams.h | 23 + codemp/game/tri_coll_test.c | 18 + codemp/game/w_force.c | 34 +- codemp/game/w_saber.c | 22 + codemp/game/w_saber.h | 22 + codemp/ghoul2/G2.h | 22 + codemp/ghoul2/G2_gore.cpp | 22 + codemp/ghoul2/G2_gore.h | 29 +- codemp/ghoul2/g2_local.h | 32 +- codemp/ghoul2/ghoul2_shared.h | 43 +- codemp/icarus/BlockStream.cpp | 28 +- codemp/icarus/GameInterface.cpp | 22 + codemp/icarus/GameInterface.h | 29 +- codemp/icarus/Instance.cpp | 22 + codemp/icarus/Interface.cpp | 22 + codemp/icarus/Memory.cpp | 22 + codemp/icarus/Q3_Interface.cpp | 22 + codemp/icarus/Q3_Interface.h | 22 + codemp/icarus/Q3_Registers.cpp | 22 + codemp/icarus/Q3_Registers.h | 26 +- codemp/icarus/Sequence.cpp | 22 + codemp/icarus/Sequencer.cpp | 33 +- codemp/icarus/TaskManager.cpp | 22 + codemp/icarus/blockstream.h | 37 +- codemp/icarus/icarus.h | 40 +- codemp/icarus/instance.h | 28 +- codemp/icarus/interface.h | 22 + codemp/icarus/interpreter.h | 31 +- codemp/icarus/sequence.h | 28 +- codemp/icarus/sequencer.h | 42 +- codemp/icarus/taskmanager.h | 36 +- codemp/icarus/tokenizer.h | 40 +- codemp/macosx/macosx_qgl.h | 5097 ------ codemp/mp3code/cdct.c | 4 - codemp/mp3code/config.h | 2 - codemp/mp3code/csbtb.c | 3 - codemp/mp3code/csbtl3.c | 3 - codemp/mp3code/cup.c | 5 - codemp/mp3code/cupini.c | 9 - codemp/mp3code/cupl1.c | 4 - codemp/mp3code/cupl3.c | 4 + codemp/mp3code/cwin.c | 39 +- codemp/mp3code/cwinb.c | 3 - codemp/mp3code/cwinm.c | 6 - codemp/mp3code/jdw.h | 6 - codemp/mp3code/l3.h | 32 +- codemp/mp3code/l3dq.c | 8 - codemp/mp3code/l3init.c | 14 +- codemp/mp3code/mhead.h | 5 - codemp/mp3code/mp3struct.h | 9 - codemp/mp3code/uph.c | 7 - codemp/mp3code/wavep.c | 3 - codemp/null/null_client.cpp | 23 + codemp/null/null_input.cpp | 22 + codemp/null/null_renderer.cpp | 23 + codemp/null/null_snddma.cpp | 23 + codemp/qcommon/GenericParser2.cpp | 25 +- codemp/qcommon/GenericParser2.h | 23 + codemp/qcommon/MiniHeap.h | 22 + codemp/qcommon/RoffSystem.cpp | 74 +- codemp/qcommon/RoffSystem.h | 33 +- codemp/qcommon/cm_load.cpp | 48 +- codemp/qcommon/cm_local.h | 23 + codemp/qcommon/cm_patch.cpp | 29 +- codemp/qcommon/cm_patch.h | 23 + codemp/qcommon/cm_polylib.cpp | 23 + codemp/qcommon/cm_polylib.h | 23 + codemp/qcommon/cm_public.h | 23 + codemp/qcommon/cm_test.cpp | 23 + codemp/qcommon/cm_trace.cpp | 23 + codemp/qcommon/cmd.cpp | 24 + codemp/qcommon/common.cpp | 176 +- codemp/qcommon/cvar.cpp | 60 +- codemp/qcommon/disablewarnings.h | 23 + codemp/qcommon/files.cpp | 37 +- codemp/qcommon/game_version.h | 31 +- codemp/qcommon/huffman.cpp | 23 + codemp/qcommon/matcomp.cpp | 61 +- codemp/qcommon/matcomp.h | 22 + codemp/qcommon/md4.cpp | 14 +- codemp/qcommon/msg.cpp | 100 +- codemp/qcommon/net_chan.cpp | 24 + codemp/qcommon/net_ip.cpp | 39 +- codemp/qcommon/persistence.cpp | 20 + codemp/qcommon/q_math.c | 32 +- codemp/qcommon/q_math.cpp | 23 + codemp/qcommon/q_platform.h | 28 +- codemp/qcommon/q_shared.c | 112 +- codemp/qcommon/q_shared.cpp | 23 + codemp/qcommon/q_shared.h | 48 +- codemp/qcommon/qcommon.h | 188 +- codemp/qcommon/qfiles.h | 23 + codemp/qcommon/sstring.h | 22 + codemp/qcommon/stringed_ingame.cpp | 73 +- codemp/qcommon/stringed_ingame.h | 22 + codemp/qcommon/stringed_interface.cpp | 33 +- codemp/qcommon/stringed_interface.h | 28 +- codemp/qcommon/tags.h | 22 + codemp/qcommon/timing.h | 22 + codemp/qcommon/vm.cpp | 34 +- codemp/qcommon/z_memman_pc.cpp | 26 +- codemp/rd-common/mdx_format.h | 22 + codemp/rd-common/tr_common.h | 23 + codemp/rd-common/tr_font.cpp | 38 +- codemp/rd-common/tr_font.h | 22 + codemp/rd-common/tr_image_jpg.cpp | 33 +- codemp/rd-common/tr_image_load.cpp | 24 + codemp/rd-common/tr_image_png.cpp | 24 + codemp/rd-common/tr_image_tga.cpp | 24 + codemp/rd-common/tr_noise.cpp | 24 + codemp/rd-common/tr_public.h | 41 +- codemp/rd-common/tr_types.h | 30 +- codemp/rd-dedicated/G2_API.cpp | 67 +- codemp/rd-dedicated/G2_bolts.cpp | 22 + codemp/rd-dedicated/G2_bones.cpp | 33 +- codemp/rd-dedicated/G2_misc.cpp | 52 +- codemp/rd-dedicated/G2_surfaces.cpp | 27 +- codemp/rd-dedicated/glext.h | 3034 ---- codemp/rd-dedicated/tr_backend.cpp | 23 + codemp/rd-dedicated/tr_ghoul2.cpp | 31 +- codemp/rd-dedicated/tr_init.cpp | 31 +- codemp/rd-dedicated/tr_local.h | 34 +- codemp/rd-dedicated/tr_main.cpp | 28 +- codemp/rd-dedicated/tr_mesh.cpp | 23 + codemp/rd-dedicated/tr_model.cpp | 42 +- codemp/rd-dedicated/tr_shader.cpp | 25 +- codemp/rd-dedicated/tr_skin.cpp | 32 +- codemp/rd-vanilla/CMakeLists.txt | 99 +- codemp/rd-vanilla/G2_API.cpp | 89 +- codemp/rd-vanilla/G2_bolts.cpp | 22 + codemp/rd-vanilla/G2_bones.cpp | 33 +- codemp/rd-vanilla/G2_misc.cpp | 54 +- codemp/rd-vanilla/G2_surfaces.cpp | 27 +- codemp/rd-vanilla/glext.h | 13768 ++++++++++++--- codemp/rd-vanilla/qgl.h | 1110 +- codemp/rd-vanilla/tr_WorldEffects.cpp | 28 +- codemp/rd-vanilla/tr_WorldEffects.h | 22 + codemp/rd-vanilla/tr_arb.cpp | 86 +- codemp/rd-vanilla/tr_backend.cpp | 425 +- codemp/rd-vanilla/tr_bsp.cpp | 27 +- codemp/rd-vanilla/tr_cmds.cpp | 38 +- codemp/rd-vanilla/tr_curve.cpp | 23 + codemp/rd-vanilla/tr_decals.cpp | 23 + codemp/rd-vanilla/tr_ghoul2.cpp | 35 +- codemp/rd-vanilla/tr_image.cpp | 177 +- codemp/rd-vanilla/tr_init.cpp | 807 +- codemp/rd-vanilla/tr_light.cpp | 26 +- codemp/rd-vanilla/tr_local.h | 65 +- codemp/rd-vanilla/tr_main.cpp | 28 +- codemp/rd-vanilla/tr_marks.cpp | 23 + codemp/rd-vanilla/tr_mesh.cpp | 23 + codemp/rd-vanilla/tr_model.cpp | 42 +- codemp/rd-vanilla/tr_quicksprite.cpp | 33 +- codemp/rd-vanilla/tr_quicksprite.h | 24 +- codemp/rd-vanilla/tr_scene.cpp | 27 +- codemp/rd-vanilla/tr_shade.cpp | 45 +- codemp/rd-vanilla/tr_shade_calc.cpp | 45 +- codemp/rd-vanilla/tr_shader.cpp | 186 +- codemp/rd-vanilla/tr_shadows.cpp | 53 +- codemp/rd-vanilla/tr_skin.cpp | 24 +- codemp/rd-vanilla/tr_sky.cpp | 23 + codemp/rd-vanilla/tr_subs.cpp | 33 +- codemp/rd-vanilla/tr_surface.cpp | 57 +- codemp/rd-vanilla/tr_surfacesprites.cpp | 22 + codemp/rd-vanilla/tr_world.cpp | 23 + codemp/sdl/sdl_glimp.cpp | 1105 -- codemp/server/NPCNav/navigator.cpp | 51 +- codemp/server/NPCNav/navigator.h | 46 +- codemp/server/server.h | 24 + codemp/server/sv_bot.cpp | 25 +- codemp/server/sv_ccmds.cpp | 123 +- codemp/server/sv_client.cpp | 57 +- codemp/server/sv_game.cpp | 23 + codemp/server/sv_gameapi.cpp | 28 +- codemp/server/sv_gameapi.h | 20 + codemp/server/sv_init.cpp | 34 +- codemp/server/sv_main.cpp | 42 +- codemp/server/sv_net_chan.cpp | 23 + codemp/server/sv_snapshot.cpp | 23 + codemp/server/sv_world.cpp | 30 +- codemp/sys/snapvector.cpp | 42 - codemp/sys/sys_loadlib.h | 26 - codemp/sys/sys_local.h | 13 - codemp/sys/sys_main.cpp | 624 - codemp/ui/CMakeLists.txt | 65 +- codemp/ui/keycodes.h | 26 +- codemp/ui/menudef.h | 22 + codemp/ui/ui_atoms.c | 25 +- codemp/ui/ui_cvar.c | 23 + codemp/ui/ui_force.c | 23 +- codemp/ui/ui_force.h | 22 + codemp/ui/ui_gameinfo.c | 25 +- codemp/ui/ui_local.h | 57 +- codemp/ui/ui_main.c | 333 +- codemp/ui/ui_public.h | 26 +- codemp/ui/ui_saber.c | 23 +- codemp/ui/ui_shared.c | 66 +- codemp/ui/ui_shared.h | 24 + codemp/ui/ui_syscalls.c | 27 +- codemp/ui/ui_xcvar.h | 22 + codemp/win32/glw_win.h | 5 +- codemp/win32/win_local.h | 1 + codemp/win32/win_main.cpp | 790 +- codemp/win32/win_main_ded.cpp | 979 +- codemp/win32/win_shared.cpp | 252 +- lib/SDL2/include/SDL.h | 163 + lib/SDL2/include/SDL_assert.h | 284 + lib/SDL2/include/SDL_atomic.h | 260 + lib/SDL2/include/SDL_audio.h | 506 + lib/SDL2/include/SDL_bits.h | 97 + lib/SDL2/include/SDL_blendmode.h | 63 + lib/SDL2/include/SDL_clipboard.h | 71 + lib/SDL2/include/SDL_config.h | 210 + lib/SDL2/include/SDL_cpuinfo.h | 156 + lib/SDL2/include/SDL_endian.h | 239 + lib/SDL2/include/SDL_error.h | 76 + lib/SDL2/include/SDL_events.h | 723 + lib/SDL2/include/SDL_filesystem.h | 136 + lib/SDL2/include/SDL_gamecontroller.h | 316 + lib/SDL2/include/SDL_gesture.h | 87 + lib/SDL2/include/SDL_haptic.h | 1225 ++ lib/SDL2/include/SDL_hints.h | 517 + lib/SDL2/include/SDL_joystick.h | 253 + lib/SDL2/include/SDL_keyboard.h | 217 + lib/SDL2/include/SDL_keycode.h | 341 + lib/SDL2/include/SDL_loadso.h | 81 + lib/SDL2/include/SDL_log.h | 211 + lib/SDL2/include/SDL_main.h | 155 + lib/SDL2/include/SDL_messagebox.h | 144 + lib/SDL2/include/SDL_mouse.h | 224 + lib/SDL2/include/SDL_mutex.h | 251 + lib/SDL2/include/SDL_name.h | 33 + lib/SDL2/include/SDL_opengl.h | 11126 +++++++++++++ lib/SDL2/include/SDL_opengles.h | 38 + lib/SDL2/include/SDL_opengles2.h | 2790 ++++ lib/SDL2/include/SDL_pixels.h | 429 + lib/SDL2/include/SDL_platform.h | 164 + lib/SDL2/include/SDL_power.h | 75 + lib/SDL2/include/SDL_quit.h | 58 + lib/SDL2/include/SDL_rect.h | 138 + lib/SDL2/include/SDL_render.h | 870 + lib/SDL2/include/SDL_revision.h | 2 + lib/SDL2/include/SDL_rwops.h | 232 + lib/SDL2/include/SDL_scancode.h | 401 + lib/SDL2/include/SDL_shape.h | 143 + lib/SDL2/include/SDL_stdinc.h | 405 + lib/SDL2/include/SDL_surface.h | 503 + lib/SDL2/include/SDL_system.h | 191 + lib/SDL2/include/SDL_syswm.h | 272 + lib/SDL2/include/SDL_test.h | 68 + lib/SDL2/include/SDL_test_assert.h | 105 + lib/SDL2/include/SDL_test_common.h | 188 + lib/SDL2/include/SDL_test_compare.h | 69 + lib/SDL2/include/SDL_test_crc32.h | 124 + lib/SDL2/include/SDL_test_font.h | 76 + lib/SDL2/include/SDL_test_fuzzer.h | 384 + lib/SDL2/include/SDL_test_harness.h | 123 + lib/SDL2/include/SDL_test_images.h | 78 + lib/SDL2/include/SDL_test_log.h | 67 + lib/SDL2/include/SDL_test_md5.h | 129 + lib/SDL2/include/SDL_test_random.h | 115 + lib/SDL2/include/SDL_thread.h | 287 + lib/SDL2/include/SDL_timer.h | 115 + lib/SDL2/include/SDL_touch.h | 86 + lib/SDL2/include/SDL_types.h | 29 + lib/SDL2/include/SDL_version.h | 162 + lib/SDL2/include/SDL_video.h | 979 ++ lib/SDL2/include/begin_code.h | 140 + lib/SDL2/include/close_code.h | 37 + lib/SDL2/lib/x64/SDL2.lib | Bin 0 -> 113700 bytes lib/SDL2/lib/x64/SDL2main.lib | Bin 0 -> 42824 bytes lib/SDL2/lib/x64/SDL2test.lib | Bin 0 -> 842536 bytes lib/SDL2/lib/x86/SDL2.lib | Bin 0 -> 116400 bytes lib/SDL2/lib/x86/SDL2main.lib | Bin 0 -> 40536 bytes lib/SDL2/lib/x86/SDL2test.lib | Bin 0 -> 821670 bytes lib/libpng/png.c | 630 +- lib/libpng/png.h | 98 +- lib/libpng/pngconf.h | 6 +- lib/libpng/pngerror.c | 85 +- lib/libpng/pngget.c | 144 +- lib/libpng/pnginfo.h | 2 +- lib/libpng/pnglibconf.h | 10 +- lib/libpng/pngmem.c | 12 +- lib/libpng/pngpread.c | 260 +- lib/libpng/pngpriv.h | 26 +- lib/libpng/pngread.c | 281 +- lib/libpng/pngrio.c | 4 +- lib/libpng/pngrtran.c | 415 +- lib/libpng/pngrutil.c | 461 +- lib/libpng/pngset.c | 100 +- lib/libpng/pngstruct.h | 4 +- lib/libpng/pngtrans.c | 40 +- lib/libpng/pngwio.c | 6 +- lib/libpng/pngwrite.c | 291 +- lib/libpng/pngwtran.c | 40 +- lib/libpng/pngwutil.c | 173 +- lib/minizip/ioapi.c | 5 + lib/minizip/unzip.cpp | 9 +- lib/minizip/unzip.h | 5 + rv-readme.txt | 22 + shared/icons/OpenJK_IconPSD.psd | Bin 0 -> 1672382 bytes shared/icons/OpenJK_Icon_1024.png | Bin 0 -> 298812 bytes shared/icons/OpenJK_Icon_128.png | Bin 0 -> 15714 bytes shared/icons/OpenJK_Icon_16.png | Bin 0 -> 1514 bytes shared/icons/OpenJK_Icon_32.png | Bin 0 -> 2678 bytes shared/icons/OpenJK_Icon_64.png | Bin 0 -> 6056 bytes shared/icons/icon.ico | Bin 0 -> 3262 bytes shared/icons/license.txt | 28 + shared/icons/ocgDGfu.png | Bin 0 -> 7788 bytes shared/sdl/sdl_icon.h | 188 + {codemp => shared}/sdl/sdl_input.cpp | 400 +- {codemp => shared}/sdl/sdl_qgl.h | 60 +- .../sdl_snd.cpp => shared/sdl/sdl_sound.cpp | 17 + shared/sdl/sdl_window.cpp | 813 + shared/sys/con_local.h | 34 + shared/sys/con_log.cpp | 78 + .../sys/con_passive.cpp | 65 +- shared/sys/con_tty.cpp | 535 + shared/sys/con_win32.cpp | 555 + shared/sys/snapvector.cpp | 65 + shared/sys/sys_event.cpp | 137 + shared/sys/sys_loadlib.h | 47 + shared/sys/sys_local.h | 41 + shared/sys/sys_main.cpp | 748 + shared/sys/sys_public.h | 204 + {codemp => shared}/sys/sys_unix.cpp | 352 +- shared/sys/sys_win32.cpp | 587 + {codemp => shared}/sys/unix_local.h | 0 1229 files changed, 134184 insertions(+), 54147 deletions(-) create mode 100644 CMakeModules/InstallConfig.cmake create mode 100644 CMakeModules/InstallZIP.cmake create mode 100644 CMakeModules/LICENSE_1_0.txt create mode 100644 code/client/client.h.BACKUP.2896.h create mode 100644 code/client/client.h.BACKUP.7476.h create mode 100644 code/client/client.h.BACKUP.8932.h create mode 100644 code/client/client.h.BASE.2896.h create mode 100644 code/client/client.h.BASE.7476.h create mode 100644 code/client/client.h.BASE.8932.h create mode 100644 code/client/client.h.LOCAL.2896.h create mode 100644 code/client/client.h.LOCAL.7476.h create mode 100644 code/client/client.h.LOCAL.8932.h create mode 100644 code/client/client.h.REMOTE.2896.h create mode 100644 code/client/client.h.REMOTE.7476.h create mode 100644 code/client/client.h.REMOTE.8932.h create mode 100644 code/game/bg_panimate.cpp.BACKUP.8780.cpp create mode 100644 code/game/bg_panimate.cpp.BASE.8780.cpp create mode 100644 code/game/bg_panimate.cpp.LOCAL.8780.cpp create mode 100644 code/game/bg_panimate.cpp.REMOTE.8780.cpp delete mode 100755 code/macosx/macosx_glimp.h rename code/qcommon/{files_pc.cpp => files.cpp} (52%) delete mode 100644 code/qcommon/files.h delete mode 100644 code/qcommon/files_common.cpp delete mode 100644 code/qcommon/files_console.cpp create mode 100644 code/rd-vanilla/tr_arb.cpp delete mode 100644 code/rd-vanilla/tr_flares.cpp create mode 100644 code/rd-vanilla/tr_skin.cpp delete mode 100644 code/sdl/sdl_glimp.cpp delete mode 100644 code/sdl/sdl_input.cpp delete mode 100644 code/sdl/sdl_qgl.h delete mode 100644 code/sdl/sdl_snd.cpp delete mode 100644 code/sys/sys_loadlib.h delete mode 100644 code/sys/sys_local.h delete mode 100644 code/sys/sys_main.cpp delete mode 100644 code/sys/sys_unix.cpp delete mode 100644 code/ui/ui_debug.cpp delete mode 100644 code/ui/ui_splash.cpp delete mode 100644 code/ui/ui_splash.h delete mode 100755 codemp/macosx/macosx_qgl.h delete mode 100644 codemp/rd-dedicated/glext.h delete mode 100644 codemp/sdl/sdl_glimp.cpp delete mode 100644 codemp/sys/snapvector.cpp delete mode 100644 codemp/sys/sys_loadlib.h delete mode 100644 codemp/sys/sys_local.h delete mode 100644 codemp/sys/sys_main.cpp create mode 100644 lib/SDL2/include/SDL.h create mode 100644 lib/SDL2/include/SDL_assert.h create mode 100644 lib/SDL2/include/SDL_atomic.h create mode 100644 lib/SDL2/include/SDL_audio.h create mode 100644 lib/SDL2/include/SDL_bits.h create mode 100644 lib/SDL2/include/SDL_blendmode.h create mode 100644 lib/SDL2/include/SDL_clipboard.h create mode 100644 lib/SDL2/include/SDL_config.h create mode 100644 lib/SDL2/include/SDL_cpuinfo.h create mode 100644 lib/SDL2/include/SDL_endian.h create mode 100644 lib/SDL2/include/SDL_error.h create mode 100644 lib/SDL2/include/SDL_events.h create mode 100644 lib/SDL2/include/SDL_filesystem.h create mode 100644 lib/SDL2/include/SDL_gamecontroller.h create mode 100644 lib/SDL2/include/SDL_gesture.h create mode 100644 lib/SDL2/include/SDL_haptic.h create mode 100644 lib/SDL2/include/SDL_hints.h create mode 100644 lib/SDL2/include/SDL_joystick.h create mode 100644 lib/SDL2/include/SDL_keyboard.h create mode 100644 lib/SDL2/include/SDL_keycode.h create mode 100644 lib/SDL2/include/SDL_loadso.h create mode 100644 lib/SDL2/include/SDL_log.h create mode 100644 lib/SDL2/include/SDL_main.h create mode 100644 lib/SDL2/include/SDL_messagebox.h create mode 100644 lib/SDL2/include/SDL_mouse.h create mode 100644 lib/SDL2/include/SDL_mutex.h create mode 100644 lib/SDL2/include/SDL_name.h create mode 100644 lib/SDL2/include/SDL_opengl.h create mode 100644 lib/SDL2/include/SDL_opengles.h create mode 100644 lib/SDL2/include/SDL_opengles2.h create mode 100644 lib/SDL2/include/SDL_pixels.h create mode 100644 lib/SDL2/include/SDL_platform.h create mode 100644 lib/SDL2/include/SDL_power.h create mode 100644 lib/SDL2/include/SDL_quit.h create mode 100644 lib/SDL2/include/SDL_rect.h create mode 100644 lib/SDL2/include/SDL_render.h create mode 100644 lib/SDL2/include/SDL_revision.h create mode 100644 lib/SDL2/include/SDL_rwops.h create mode 100644 lib/SDL2/include/SDL_scancode.h create mode 100644 lib/SDL2/include/SDL_shape.h create mode 100644 lib/SDL2/include/SDL_stdinc.h create mode 100644 lib/SDL2/include/SDL_surface.h create mode 100644 lib/SDL2/include/SDL_system.h create mode 100644 lib/SDL2/include/SDL_syswm.h create mode 100644 lib/SDL2/include/SDL_test.h create mode 100644 lib/SDL2/include/SDL_test_assert.h create mode 100644 lib/SDL2/include/SDL_test_common.h create mode 100644 lib/SDL2/include/SDL_test_compare.h create mode 100644 lib/SDL2/include/SDL_test_crc32.h create mode 100644 lib/SDL2/include/SDL_test_font.h create mode 100644 lib/SDL2/include/SDL_test_fuzzer.h create mode 100644 lib/SDL2/include/SDL_test_harness.h create mode 100644 lib/SDL2/include/SDL_test_images.h create mode 100644 lib/SDL2/include/SDL_test_log.h create mode 100644 lib/SDL2/include/SDL_test_md5.h create mode 100644 lib/SDL2/include/SDL_test_random.h create mode 100644 lib/SDL2/include/SDL_thread.h create mode 100644 lib/SDL2/include/SDL_timer.h create mode 100644 lib/SDL2/include/SDL_touch.h create mode 100644 lib/SDL2/include/SDL_types.h create mode 100644 lib/SDL2/include/SDL_version.h create mode 100644 lib/SDL2/include/SDL_video.h create mode 100644 lib/SDL2/include/begin_code.h create mode 100644 lib/SDL2/include/close_code.h create mode 100644 lib/SDL2/lib/x64/SDL2.lib create mode 100644 lib/SDL2/lib/x64/SDL2main.lib create mode 100644 lib/SDL2/lib/x64/SDL2test.lib create mode 100644 lib/SDL2/lib/x86/SDL2.lib create mode 100644 lib/SDL2/lib/x86/SDL2main.lib create mode 100644 lib/SDL2/lib/x86/SDL2test.lib create mode 100644 rv-readme.txt create mode 100644 shared/icons/OpenJK_IconPSD.psd create mode 100644 shared/icons/OpenJK_Icon_1024.png create mode 100644 shared/icons/OpenJK_Icon_128.png create mode 100644 shared/icons/OpenJK_Icon_16.png create mode 100644 shared/icons/OpenJK_Icon_32.png create mode 100644 shared/icons/OpenJK_Icon_64.png create mode 100644 shared/icons/icon.ico create mode 100644 shared/icons/license.txt create mode 100644 shared/icons/ocgDGfu.png create mode 100644 shared/sdl/sdl_icon.h rename {codemp => shared}/sdl/sdl_input.cpp (70%) rename {codemp => shared}/sdl/sdl_qgl.h (86%) rename codemp/sdl/sdl_snd.cpp => shared/sdl/sdl_sound.cpp (96%) create mode 100644 shared/sdl/sdl_window.cpp create mode 100644 shared/sys/con_local.h create mode 100644 shared/sys/con_log.cpp rename codemp/macosx/macosx_glimp.h => shared/sys/con_passive.cpp (59%) mode change 100755 => 100644 create mode 100644 shared/sys/con_tty.cpp create mode 100644 shared/sys/con_win32.cpp create mode 100644 shared/sys/snapvector.cpp create mode 100644 shared/sys/sys_event.cpp create mode 100644 shared/sys/sys_loadlib.h create mode 100644 shared/sys/sys_local.h create mode 100644 shared/sys/sys_main.cpp create mode 100644 shared/sys/sys_public.h rename {codemp => shared}/sys/sys_unix.cpp (64%) create mode 100644 shared/sys/sys_win32.cpp rename {codemp => shared}/sys/unix_local.h (100%) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index dfeec60e13..32bc8d6a1a 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -24,7 +24,7 @@ Key: - removed, + added, * modified [SP/MP] * Fixed incorrect alphagen enum usage. [SP/MP] * Fixed widescreen resolution changes causing black screen when UI restarted. [SP/MP] * Fixed crash when trying to run custom resolutions with a listen server. -[MP] * Fixed crash related to ragnos NPC +[MP] * Fixed client crash related to ragnos NPC [SP] * Fixed intro cinematic only displaying as white screen when on non 4:3 aspect ratio. [MP] * gamecode: Fixes some voting issues relating to clients disconnecting and/or switching teams. [MP] * gamecode: Fixed some voting issues relating to bad percentage calculation for passing/failing. @@ -56,7 +56,7 @@ Key: - removed, + added, * modified [MP] + New serverside kick commands kickall kickbots and kicknum (alias to clientkick). [SP/MP] * Improved command line parsing based off of ioquake3 patches. [SP/MP] * Improved echo command by preserving colors based off of ioquake3 patches. -[SP/MP] * Improved GL_Extensions using ioquake3 to prevent crashes on newer cards. +[SP/MP] * Improved GL_Extensions printing using ioquake3 fix to prevent crashes on newer cards. [SP/MP] * Removed cheat protection from r_we cmd, r_dynamicGlow* cvars [MP] * Fixed invalid r_textureBitsLM resulting in fullbright mode without cheats [SP/MP] - Removed CD Check Code @@ -64,10 +64,10 @@ Key: - removed, + added, * modified [SP/MP] - Removed Anti-Tamper Code. [SP/MP] - Removed force feedback code [SP/MP] * Shift-Escape will now also open the console as an alternate (e.g.: keyboard doesn't support the normal console key) +[SP/MP] * Escape key will now close the console before anything else if the console is open [SP/MP] * Removed shift key requirement to open console [SP/MP] + Raw Mouse Input added to windows (in_mouse 2). An in_restart required if changed while game is running. [MP] + gamecode: /clientlist displays clients by id/name and if they are a bot. (Shows real client id unlike serverstatus) -[SP/MP] + Added XInput support for XBOX 360 controllers (Windows only, in_joystick 2). SDL on *nix supports this as well. [SP/MP] + Updated the JPG library [MP] * svsay command prints to dedicated console [SP/MP] * Alt-tab works properly @@ -105,13 +105,12 @@ Key: - removed, + added, * modified [SP] + gamecode: Added cg_dynamicCrosshair (default 1) [MP] + Added support for surfaceSprites flattened in MP. (Fixes surface sprites on t2_trip) [SP/MP] * Fixed never fading shadow in text -[SP/MP] + trap_R_DrawRotatePic/2 allows full shader support now [SP] * MAX_SHADER_FILES bumped to 4096 from 1024 to match MP [MP] + Added in-engine ban code from ioquake3. Cmds: sv_rehashbans, sv_listbans, sv_banaddr, sv_exceptaddr, sv_bandel, sv_exceptdel, sv_flushbans. CVar: sv_banFile [SP/MP] * Fix up font renderer glyph positioning [MP] + addFavorite -[SP/MP] * Fixed overstrike mode when using any UI edit box -[SP/MP] * Fix crash when standing on an NPC who has been knocked down +[SP/MP] * gamecode: Fixed overstrike mode when using any UI edit box +[SP/MP] * gamecode: Fix crash when standing on an NPC who has been knocked down [MP] + gamecode: fx_wind entity [MP] * gamecode: fx_rain entity supports most options from SP now. LIGHTNING/shaking not supported, acidrain doesn't actually hurt [MP] * gamecode: more customRGBA options from SP on NPCs @@ -136,10 +135,11 @@ Key: - removed, + added, * modified [MP] + Server side demo recording per client (from their pov) support [MP] * CVar code in engine is more robust. Protects against clients setting systeminfo cvars they should not etc. More accurate warning messages when servers/vms/clients set cvars they should not. [SP] + Add modelscale and modelscale_vec support to misc_model_ghoul -[MP] * Fix teamoverlay not making you look dead in siege when in limbo -[MP] + Add sv_blockJumpSelect cvar to help prevent use of modded clients using an exploit with FP_LEVIATHAN with old mods +[MP] * gamecode: Fix teamoverlay not making you look dead in siege when in limbo +[MP] + Add sv_blockJumpSelect cvar to help prevent use of modded clients using an exploit with FP_LEVITATION with old mods [MP] * Fix exploit with usercmd bytes set to -128 [SP/MP] + Add stopmusic command [SP] * Fix external lightmap support [MP] + Add external lightmap support from SP -[SP/MP] * General buffer safety cleanup \ No newline at end of file +[SP/MP] * General buffer safety cleanup +[SP/MP] * Fix stencil shadows not working if a model has more than 500 vertexes. diff --git a/CMakeLists.txt b/CMakeLists.txt index c3b260d29c..fc20ac7f63 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,28 @@ +#============================================================================ +# Copyright (C) 2013 - 2015, OpenJK contributors +# +# This file is part of the OpenJK source code. +# +# OpenJK is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +#============================================================================ + cmake_minimum_required(VERSION 2.8.8) + +# Set CMake policies +if(POLICY CMP0043) + cmake_policy(SET CMP0043 OLD) # Don't ignore COMPILE_DEFINITION_ +endif() + # For checks in subdirectories set(InOpenJK TRUE) @@ -37,35 +61,59 @@ else() option(UseInternalPNG "Whether to use the included libpng instead of a locally installed one" OFF) endif() +if(WIN32 OR APPLE) + option(UseInternalJPEG "Whether to use the included libjpeg instead of a locally installed one" ON) +else() + option(UseInternalJPEG "Whether to use the included libjpeg instead of a locally installed one" OFF) +endif() + if(APPLE) option(MakeApplicationBundles "Whether to build .app application bundles for engines built" ON) else() set(MakeApplicationBundles OFF) endif() -option(PackageDir "Where to place the installer/package." "${CMAKE_SOURCE_DIR}/package") +if(MSVC) + option(UseInternalSDL2 "Whether to use the included SDL2 library instead of a locally installed one" ON) +else() + set(UseInternalSDL2 OFF) +endif() # Custom CMake Modules needed list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}/CMakeModules") -# Arch Suffix -if (CMAKE_SIZEOF_VOID_P MATCHES "8") - set(ARCH_BITS 64) - if(WIN32) +# ${Architecture} must match ARCH_STRING in q_platform.h, +# and is used in DLL names (jagamex86.dll, jagamex86.dylib, jagamei386.so). +if(WIN32) + set(X86 ON) + if(CMAKE_SIZEOF_VOID_P MATCHES "8") set(Architecture "x86_64") set(WIN64 TRUE) else() - set(Architecture "x86_64") - endif() -else() - set(ARCH_BITS 32) - if(WIN32) set(Architecture "x86") set(WIN64 FALSE) - elseif(APPLE) - set(Architecture "x86") + endif() +else() + set(X86 OFF) + if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") + set(Architecture "arm") + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$") + set(X86 ON) + if(APPLE) + set(Architecture "x86") + else() + # e.g. Linux + set(Architecture "i386") + endif() + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^x86.64$") + set(X86 ON) + set(Architecture "x86_64") + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "powerpc") + set(Architecture "ppc") + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "powerpc64") + set(Architecture "ppc64") else() - set(Architecture "i386") + set(Architecture "${CMAKE_SYSTEM_PROCESSOR}") endif() endif() @@ -74,7 +122,6 @@ message("Architecture is ${Architecture}") # Current Git SHA1 hash include(GetGitRevisionDescription) get_git_head_revision(GIT_REFSPEC GIT_SHA1) -# TODO: actually use the Git SHA1 for something? message("Git revision is ${GIT_SHA1}") # Binary names @@ -92,39 +139,42 @@ set(JK2SPGame "jospgame${Architecture}") set(JK2SPVanillaRenderer "rdjosp-vanilla_${Architecture}") # Library names set(MPBotLib "botlib") +set(SharedLib "shared") # Paths set(SPDir "${CMAKE_SOURCE_DIR}/code") set(MPDir "${CMAKE_SOURCE_DIR}/codemp") set(JK2SPDir "${CMAKE_SOURCE_DIR}/codeJK2") +set(SharedDir ${CMAKE_SOURCE_DIR}/shared) -# Common settings -if(WIN32) - if(MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") # enable parallel compilation - endif(MSVC) - if(WIN64) - if(MSVC) - set(SharedDefines "WIN64" "_CRT_SECURE_NO_WARNINGS") - else() - set(SharedDefines "WIN64") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /arch:SSE2") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2") - endif() - else() - if(MSVC) - set(SharedDefines "_CRT_SECURE_NO_WARNINGS") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /arch:SSE2") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2") - endif() - endif() -else() - if (APPLE) - set(SharedDefines "MACOS_X") - # set(SharedDefines "MACOS_X" "_M_IX86") - #else() - # set(SharedDefines "__linux__" "_M_IX86") - endif() +include(InstallConfig) + +# Operating settings +if(WIN64) + set(SharedDefines ${SharedDefines} "WIN64") +endif() + +if (APPLE) + set(SharedDefines "MACOS_X") +endif() + +# Compiler settings +if(MSVC) + + set(SharedDefines ${SharedDefines} "NOMINMAX") + set(SharedDefines ${SharedDefines} "_CRT_SECURE_NO_WARNINGS") + set(SharedDefines ${SharedDefines} "_SCL_SECURE_NO_WARNINGS") + set(SharedDefines ${SharedDefines} "_CRT_NONSTDC_NO_DEPRECATE") + + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /arch:SSE2") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP") + + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") + +elseif (("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") OR ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")) + # I hope this doesn't come back to bite me in the butt later on. + # Realistically though, can the C and CXX compilers be different? # removes the -rdynamic flag at linking (which causes crashes for some reason) set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") @@ -134,8 +184,10 @@ else() set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -ggdb") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -ggdb") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2") + if (X86) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2") + endif() set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3") @@ -144,9 +196,15 @@ else() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-comment") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mstackrealign") - #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpmath=sse") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsigned-char") + if (X86) + # "x86 vm will crash without -mstackrealign since MMX + # instructions will be used no matter what and they + # corrupt the frame pointer in VM calls" + # -ioquake3 Makefile + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mstackrealign") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpmath=sse") + endif() elseif("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-comment") @@ -159,15 +217,19 @@ else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-comment") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mstackrealign") - #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-but-set-variable") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpmath=sse") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsigned-char") + if (X86) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mstackrealign") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpmath=sse") + endif() elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-writable-strings") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-comment") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-invalid-offsetof") endif() +else() + message(ERROR "Unsupported compiler") endif() if (NOT CMAKE_BUILD_TYPE) @@ -180,6 +242,14 @@ if(BuildPortableVersion) set(SharedDefines ${SharedDefines} "_PORTABLE_VERSION") endif() +if(UseInternalJPEG) + set(SharedDefines ${SharedDefines} "USE_INTERNAL_JPEG") +endif() + +if(UseInternalZlib) + set(SharedDefines ${SharedDefines} "USE_INTERNAL_ZLIB") +endif() + set(OpenJKLibDir "${CMAKE_SOURCE_DIR}/lib") if(NOT MSVC) @@ -195,21 +265,3 @@ if(BuildJK2SPGame) add_subdirectory("${JK2SPDir}/game") endif() add_subdirectory(${MPDir}) - -# CPack for installer creation -# TODO: Which version are we? -set(CPACK_PACKAGE_VERSION_MAJOR "0") -set(CPACK_PACKAGE_VERSION_MINOR "1") -set(CPACK_PACKAGE_VERSION_PATCH "0") -# I'm just not appending the version for now -set(CPACK_PACKAGE_FILE_NAME "OpenJK-${CMAKE_SYSTEM_NAME}-${Architecture}") - -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "An improved Jedi Academy") -set(CPACK_PACKAGE_VENDOR "JACoders") -set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md") -set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt") -set(CPACK_PACKAGE_DIRECTORY ${PACKAGE_DIR}) -set(CPACK_BINARY_ZIP ON) # always create at least a zip file -set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0) # prevent additional directory in zip - -include(CPack) diff --git a/CMakeModules/FindSDL2.cmake b/CMakeModules/FindSDL2.cmake index 34ea8dbc09..5be23d6e13 100644 --- a/CMakeModules/FindSDL2.cmake +++ b/CMakeModules/FindSDL2.cmake @@ -55,15 +55,33 @@ #============================================================================= # Copyright 2003-2009 Kitware, Inc. # -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: # -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= -# (To distribute this file outside of CMake, substitute the full -# License text for the above reference.) +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# * Neither the names of Kitware, Inc., the Insight Software Consortium, +# nor the names of their contributors may be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SET(SDL2_SEARCH_PATHS ~/Library/Frameworks diff --git a/CMakeModules/InstallConfig.cmake b/CMakeModules/InstallConfig.cmake new file mode 100644 index 0000000000..8e0094a6e9 --- /dev/null +++ b/CMakeModules/InstallConfig.cmake @@ -0,0 +1,163 @@ +#============================================================================ +# Copyright (C) 2015, OpenJK contributors +# +# This file is part of the OpenJK source code. +# +# OpenJK is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +#============================================================================ + +# Subdirectories to package JK2 and JKA into +set(JKAInstallDir "JediAcademy") +set(JK2InstallDir "JediOutcast") + +# Install components +set(JKAMPCoreComponent "JKAMPCore") +set(JKAMPServerComponent "JKAMPServer") +set(JKAMPClientComponent "JKAMPClient") +set(JKASPClientComponent "JKASPClient") +set(JK2SPClientComponent "JK2SPClient") + +# Component display names +include(CPackComponent) + +set(CPACK_COMPONENT_JKAMPCORE_DISPLAY_NAME "Core") +set(CPACK_COMPONENT_JKAMPCORE_REQUIRED TRUE) +set(CPACK_COMPONENT_JKAMPCORE_DESCRIPTION "Core files shared by the multiplayer client and server executables.") +set(CPACK_COMPONENT_JKAMPCLIENT_DISPLAY_NAME "Client") +set(CPACK_COMPONENT_JKAMPCLIENT_DESCRIPTION "Files required to play the multiplayer game.") +set(CPACK_COMPONENT_JKAMPSERVER_DISPLAY_NAME "Server") +set(CPACK_COMPONENT_JKAMPSERVER_DESCRIPTION "Files required to run a Jedi Academy server.") +set(CPACK_COMPONENT_JKASPCLIENT_DISPLAY_NAME "Core") +set(CPACK_COMPONENT_JKASPCLIENT_DESCRIPTION "Files required to play the Jedi Academy single player game.") +set(CPACK_COMPONENT_JK2SPCLIENT_DISPLAY_NAME "Core") +set(CPACK_COMPONENT_JK2SPCLIENT_DESCRIPTION "Files required to play the Jedi Outcast single player game.") +set(CPACK_COMPONENTS_ALL + ${JKAMPCoreComponent} + ${JKAMPClientComponent} + ${JKAMPServerComponent} + ${JKASPClientComponent}) + +set(CPACK_ARCHIVE_COMPONENT_INSTALL ON) + +# Component groups +set(CPACK_COMPONENT_JKAMPCORE_GROUP "JKAMP") +set(CPACK_COMPONENT_JKAMPCLIENT_GROUP "JKAMP") +set(CPACK_COMPONENT_JKAMPSERVER_GROUP "JKAMP") +set(CPACK_COMPONENT_JKASPCLIENT_GROUP "JKASP") +set(CPACK_COMPONENT_JK2SPCLIENT_GROUP "JK2SP") + +cpack_add_component_group(JKAMP + DISPLAY_NAME "Jedi Academy Multiplayer" + DESCRIPTION "Jedi Academy multiplayer game") +cpack_add_component_group(JKASP + DISPLAY_NAME "Jedi Academy Single Player" + DESCRIPTION "Jedi Academy single player game") +cpack_add_component_group(JK2SP + DISPLAY_NAME "Jedi Outcast Single Player" + DESCRIPTION "Jedi Outcast single player game") + +if(WIN32) + include(CPackNSIS) + set(CPACK_NSIS_DISPLAY_NAME "OpenJK") + set(CPACK_NSIS_PACKAGE_NAME "OpenJK") + set(CPACK_NSIS_MUI_ICON "${SharedDir}/icons/icon.ico") + set(CPACK_NSIS_MUI_UNIICON "${SharedDir}/icons/icon.ico") + set(CPACK_NSIS_URL_INFO_ABOUT "http://openjk.org") + + set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) + include(InstallRequiredSystemLibraries) + + if(BuildMPEngine) + string(REPLACE "/" "\\\\" ICON "${MPDir}/win32/icon.ico") + set(CPACK_NSIS_CREATE_ICONS_EXTRA + "${CPACK_NSIS_CREATE_ICONS_EXTRA} + CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Jedi Academy MP.lnk' \\\\ + '$INSTDIR\\\\${MPEngine}.exe' \\\\ + '' \\\\ + '${ICON}'") + + set(CPACK_NSIS_DELETE_ICONS_EXTRA + "${CPACK_NSIS_DELETE_ICONS_EXTRA} + Delete '$SMPROGRAMS\\\\$MUI_TEMP\\\\Jedi Academy MP.lnk'") + + install(FILES ${MPDir}/OpenAL32.dll ${MPDir}/EaxMan.dll + DESTINATION ${JKAInstallDir} + COMPONENT ${JKAMPClientComponent}) + + install(PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} + DESTINATION ${JKAInstallDir} + COMPONENT ${JKAMPClientComponent}) + endif() + + if(BuildSPEngine) + string(REPLACE "/" "\\\\" ICON "${SPDir}/win32/starwars.ico") + set(CPACK_NSIS_CREATE_ICONS_EXTRA + "${CPACK_NSIS_CREATE_ICONS_EXTRA} + CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Jedi Academy SP.lnk' \\\\ + '$INSTDIR\\\\${SPEngine}.exe' \\\\ + '' \\\\ + '${ICON}'") + + set(CPACK_NSIS_DELETE_ICONS_EXTRA + "${CPACK_NSIS_DELETE_ICONS_EXTRA} + Delete '$SMPROGRAMS\\\\$MUI_TEMP\\\\Jedi Academy SP.lnk'") + + install(FILES ${MPDir}/OpenAL32.dll ${MPDir}/EaxMan.dll + DESTINATION ${JKAInstallDir} + COMPONENT ${JKASPClientComponent}) + + install(PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} + DESTINATION ${JKAInstallDir} + COMPONENT ${JKASPClientComponent}) + endif() + + # Don't run this for now until we have JK2 SP working + if(FALSE AND BuildJK2SPEngine) + string(REPLACE "/" "\\\\" ICON "${SPDir}/win32/starwars.ico") + set(CPACK_NSIS_CREATE_ICONS_EXTRA + "${CPACK_NSIS_CREATE_ICONS_EXTRA} + CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Jedi Outcast SP.lnk' \\\\ + '$INSTDIR\\\\${JK2SPEngine}.exe' \\\\ + '' \\\\ + '${ICON}'") + + set(CPACK_NSIS_DELETE_ICONS_EXTRA + "${CPACK_NSIS_DELETE_ICONS_EXTRA} + Delete '$SMPROGRAMS\\\\$MUI_TEMP\\\\Jedi Outcast SP.lnk'") + + install(FILES ${MPDir}/OpenAL32.dll ${MPDir}/EaxMan.dll + DESTINATION ${JK2InstallDir} + COMPONENT ${JK2SPClientComponent}) + + install(PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} + DESTINATION ${JK2InstallDir} + COMPONENT ${JK2SPClientComponent}) + endif() +endif() + +# CPack for installer creation +set(CPACK_PACKAGE_VERSION_MAJOR "1") +set(CPACK_PACKAGE_VERSION_MINOR "0") +set(CPACK_PACKAGE_VERSION_PATCH "0") +set(CPACK_PACKAGE_FILE_NAME "OpenJK-${CMAKE_SYSTEM_NAME}-${Architecture}") + +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "An improved Jedi Academy") +set(CPACK_PACKAGE_VENDOR "JACoders") +set(CPACK_PACKAGE_INSTALL_DIRECTORY "OpenJK") +set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md") +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt") +set(CPACK_PACKAGE_DIRECTORY ${PACKAGE_DIR}) +set(CPACK_BINARY_ZIP ON) # always create at least a zip file +set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0) # prevent additional directory in zip + +include(CPack) \ No newline at end of file diff --git a/CMakeModules/InstallZIP.cmake b/CMakeModules/InstallZIP.cmake new file mode 100644 index 0000000000..c975b723bf --- /dev/null +++ b/CMakeModules/InstallZIP.cmake @@ -0,0 +1,83 @@ +#============================================================================= +# Copyright 2007-2009 Kitware, Inc. +# Copyright 2015 OpenJK contributors +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# * Neither the names of Kitware, Inc., the Insight Software Consortium, +# nor the names of their contributors may be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#============================================================================= + +include(CMakeParseArguments) + +unset(ZIP_EXECUTABLE CACHE) +if(WIN32) + if(NOT ZIP_EXECUTABLE) + find_program(ZIP_EXECUTABLE wzzip PATHS "$ENV{ProgramFiles}/WinZip") + if(ZIP_EXECUTABLE) + set(ZIP_COMMAND "${ZIP_EXECUTABLE}" -P "" ) + endif() + endif() + + if(NOT ZIP_EXECUTABLE) + find_program(ZIP_EXECUTABLE 7z PATHS "$ENV{ProgramFiles}/7-Zip") + if(ZIP_EXECUTABLE) + set(ZIP_COMMAND "${ZIP_EXECUTABLE}" a -tzip "" ) + endif() + endif() + + if(NOT ZIP_EXECUTABLE) + find_program(ZIP_EXECUTABLE winrar PATHS "$ENV{ProgramFiles}/WinRAR") + if(ZIP_EXECUTABLE) + set(ZIP_COMMAND "${ZIP_EXECUTABLE}" a "" ) + endif() + endif() +endif() + +if(NOT ZIP_EXECUTABLE) + if(WIN32) + find_package(Cygwin) + find_program(ZIP_EXECUTABLE zip PATHS "${CYGWIN_INSTALL_PATH}/bin") + else() + find_program(ZIP_EXECUTABLE zip) + endif() + + if(ZIP_EXECUTABLE) + set(ZIP_COMMAND "${ZIP_EXECUTABLE}" -r "" . -i) + endif() +endif() + +function(add_zip_command output) + set(MultiValueArgs FILES DEPENDS) + cmake_parse_arguments(ARGS "" "" "${MultiValueArgs}" ${ARGN}) + + set(ZipCommand ${ZIP_COMMAND}) + string(REPLACE "${output}" ZipCommand "${ZipCommand}") + string(REPLACE "${ARGS_FILES}" ZipCommand "${ZipCommand}") + add_custom_command(OUTPUT ${output} + COMMAND ${ZipCommand} + DEPENDS ${ARGS_DEPENDS}) +endfunction(add_zip_command) diff --git a/CMakeModules/LICENSE_1_0.txt b/CMakeModules/LICENSE_1_0.txt new file mode 100644 index 0000000000..d928544d42 --- /dev/null +++ b/CMakeModules/LICENSE_1_0.txt @@ -0,0 +1,26 @@ +This license applies to files in this directory that refer to +the Boost Software License, version 1.0 by name: + +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index 5ebb3a3156..30cde3d101 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,13 @@ The purpose of this project is to maintain and improve the Jedi Academy and Jedi Major enhancement changes are very low priority at this time unless patches are made available and which do not alter the core functionality of gameplay or the stock renderer itself. -Please use discretion when making issue requests on github. The [JKHub sub-forum](http://jkhub.org/forum/51-discussion/) is a better place for larger discussions on changes that aren't actually bugs. +Please use discretion when making issue requests on GitHub. The [JKHub sub-forum](http://jkhub.org/forum/51-discussion/) is a better place for support queries, discussions, and feature requests. ## Jedi Outcast Support ## -_Do not make issues regarding Jedi Outcast support problems at this time. It is considered mostly unfinished, broken and use at your own risk!_ +_Do not make issues regarding Jedi Outcast problems at this time. It is considered mostly unfinished, broken, and to be used at your own risk!_ -There is no Multiplayer code for JK2MP at all on our repository at this time. The Singleplayer support must be explicitly turned on in your own compile. The prebuilt versions will not include this. +There is no Multiplayer code for JK2MP at all on our repository at this time. The Single-player support must be explicitly turned on in your own compile. The pre-built versions will not include this. ## 64-bit Support @@ -43,6 +43,7 @@ First, install Jedi Academy. If you don't already own the game you can buy it fr ## Dependencies ## +* SDL2 (2.0.3+) (included on Windows) * OpenGL * OpenAL (included on Windows) * libpng (included on Windows) @@ -51,23 +52,23 @@ First, install Jedi Academy. If you don't already own the game you can buy it fr ## Dedicated Server ## -In order to run dedicated server, you must use the openjkded binary, running dedicated from the main executable is currently not allowed because it is broken with the addition of modular renderer. +In order to run a dedicated server, you must use the openjkded binary. Running dedicated from the main executable is currently not possible because it was broken with the addition of modular renderer. ## Developer Notes ## OpenJK is licensed under GPLv2 as free software. You are free to use, modify and redistribute OpenJK following the terms in LICENSE.txt. -Please be aware of the implications of the GPLv2 licence. In short, be prepared to share your code. +Please be aware of the implications of the GPLv2 licence. In short, be prepared to share your code under the same GPLv2 licence. ### If you wish to contribute to OpenJK, please do the following ### -* [Fork](https://github.com/JACoders/OpenJK/fork) the project on Github +* [Fork](https://github.com/JACoders/OpenJK/fork) the project on GitHub * Create a new branch and make your changes * Send a [pull request](https://help.github.com/articles/creating-a-pull-request) to upstream (JACoders/OpenJK) ### If you wish to base your work off OpenJK (mod or engine) ### -* [Fork](https://github.com/JACoders/OpenJK/fork) the project on Github +* [Fork](https://github.com/JACoders/OpenJK/fork) the project on GitHub * Change the GAMEVERSION define in codemp/game/g_local.h from "OpenJK" to your project name -* If you make a nice change, please consider backporting to upstream via pull request as described above. This is so everyone benefits without having to reinvent the wheel for every project. +* If you make a nice change, please consider back-porting to upstream via pull request as described above. This is so everyone benefits without having to reinvent the wheel for every project. ### Reserved renderer names ### * rd-vanilla (JA's original renderer) @@ -79,8 +80,8 @@ Please be aware of the implications of the GPLv2 licence. In short, be prepared * rd-palpatine (Maintainer: mrwonko) * rd-sidious (Maintainer: mrwonko) -### Engine "hax" ### -* You will no longer be able to use runtime memory patches. Consider forking OpenJK and adding your engine modifications directly. +### Engine hacks in existing mods ### +Mods which make use of runtime memory patches may fail to run under OpenJK, and in the worst case will cause the program to crash. Consider forking OpenJK and adding your engine modifications directly, or applying these patches only if you are running on the retail engine. ### Links of Interest ### * [Buildbot](http://jk.xd.cm/) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index ac3019589b..003b0720c3 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1,4 +1,20 @@ -cmake_minimum_required(VERSION 2.8) +#============================================================================ +# Copyright (C) 2013 - 2015, OpenJK contributors +# +# This file is part of the OpenJK source code. +# +# OpenJK is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +#============================================================================ # Make sure the user is not executing this script directly if(NOT InOpenJK) @@ -22,19 +38,15 @@ if(BuildSPEngine OR BuildJK2SPEngine) # Defines set(SPEngineDefines ${SharedDefines} "_JK2EXE") # it's called JK2EXE but it really just means Singleplayer Exe - set(SPEngineIncludeDirectories ${SPEngineIncludeDirectories} ${OpenJKLibDir}) + set(SPEngineIncludeDirectories + ${SPEngineIncludeDirectories} + ${SharedDir} + ${SPDir} + ${OpenJKLibDir}) # Dependencies - - if (NOT WIN32) - # OpenGL - find_package(OpenGL REQUIRED) - set(SPEngineIncludeDirectories ${SPEngineIncludeDirectories} ${OPENGL_INCLUDE_DIR}) - set(SPEngineLibraries ${SPEngineLibraries} ${OPENGL_LIBRARIES}) - endif() - # OpenAL (is optionally included for Windows) - if(WIN32 AND NOT WIN64) + if(MSVC AND NOT WIN64) if(UseInternalOpenAL) # There's a libs/OpenAL32.lib # (mrw) TODO Is this actually required on windows? It is loaded at runtime, should not be linked? @@ -57,12 +69,30 @@ if(BuildSPEngine OR BuildJK2SPEngine) set(SPEngineFiles ${SPEngineFiles} ${SPEngineEAXFiles}) endif() - if(NOT WIN32) + if(UseInternalSDL2) + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(SPEngineLibraries + ${SPEngineLibraries} + ${OpenJKLibDir}/SDL2/lib/x86/SDL2.lib + ${OpenJKLibDir}/SDL2/lib/x86/SDL2main.lib + ) + else() + set(SPEngineLibraries + ${SPEngineLibraries} + ${OpenJKLibDir}/SDL2/lib/x64/SDL2.lib + ${OpenJKLibDir}/SDL2/lib/x64/SDL2main.lib + ) + endif() + + set(SPEngineIncludeDirectories + ${SPEngineIncludeDirectories} + ${OpenJKLibDir}/SDL2/include + ) + else() find_package(SDL2 REQUIRED) set(SPEngineIncludeDirectories ${SPEngineIncludeDirectories} ${SDL2_INCLUDE_DIR}) set(SPEngineLibraries ${SPEngineLibraries} ${SDL2_LIBRARY}) - endif(NOT WIN32) - + endif() # Source Files @@ -118,8 +148,7 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SPDir}/qcommon/common.cpp" "${SPDir}/qcommon/cvar.cpp" - "${SPDir}/qcommon/files_common.cpp" - "${SPDir}/qcommon/files_pc.cpp" + "${SPDir}/qcommon/files.cpp" "${SPDir}/qcommon/md4.cpp" "${SPDir}/qcommon/msg.cpp" @@ -141,7 +170,6 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SPDir}/qcommon/tags.h" "${SPDir}/qcommon/z_memman_pc.cpp" "${SPDir}/qcommon/qfiles.h" - "${SPDir}/qcommon/files.h" "${SPDir}/qcommon/qcommon.h" "${SPDir}/qcommon/stv_version.h" "${SPDir}/qcommon/timing.h" @@ -283,38 +311,46 @@ if(BuildSPEngine OR BuildJK2SPEngine) source_group("cgame" FILES ${SPEngineCGameFiles}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineCGameFiles}) - - # if(WIN32) set(SPEngineWin32Files - "${SPDir}/win32/afxres.h" - "${SPDir}/win32/win_input.cpp" - "${SPDir}/win32/win_main.cpp" - "${SPDir}/win32/win_shared.cpp" - "${SPDir}/win32/win_snd.cpp" - "${SPDir}/win32/win_syscon.cpp" - "${SPDir}/win32/win_wndproc.cpp" - "${SPDir}/win32/win_local.h" - "${SPDir}/win32/AutoVersion.h" "${SPDir}/win32/resource.h" - "${SPDir}/win32/glw_win.h" "${SPDir}/win32/winquake.rc" ) source_group("win32" FILES ${SPEngineWin32Files}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineWin32Files}) - else(WIN32) + endif() + + set(SPEngineSysFiles + "${SharedDir}/sys/sys_main.cpp" + "${SharedDir}/sys/sys_event.cpp" + "${SharedDir}/sys/sys_local.h" + "${SharedDir}/sys/sys_public.h" + "${SharedDir}/sys/sys_loadlib.h" + "${SharedDir}/sys/con_local.h" + "${SharedDir}/sys/con_log.cpp" + "${SharedDir}/sdl/sdl_qgl.h" + "${SharedDir}/sdl/sdl_sound.cpp" + "${SharedDir}/sdl/sdl_input.cpp" + "${SharedDir}/sdl/sdl_window.cpp" + "${SharedDir}/sdl/sdl_icon.h" + ) + + if(WIN32) set(SPEngineSysFiles - "${SPDir}/sys/sys_main.cpp" - "${SPDir}/sys/sys_unix.cpp" - "${SPDir}/sys/sys_local.h" - "${SPDir}/sys/sys_loadlib.h" - "${SPDir}/sdl/sdl_qgl.h" - "${SPDir}/sdl/sdl_snd.cpp" - "${SPDir}/sdl/sdl_input.cpp" + ${SPEngineSysFiles} + "${SharedDir}/sys/sys_win32.cpp" + "${SharedDir}/sys/con_passive.cpp" ) - source_group("sys" FILES ${SPEngineSysFiles}) - set(SPEngineFiles ${SPEngineFiles} ${SPEngineSysFiles}) - endif(WIN32) + else() + set(SPEngineSysFiles + ${SPEngineSysFiles} + "${SharedDir}/sys/sys_unix.cpp" + "${SharedDir}/sys/con_tty.cpp" + ) + endif() + + source_group("sys" FILES ${SPEngineSysFiles}) + set(SPEngineFiles ${SPEngineFiles} ${SPEngineSysFiles}) if(UseInternalZlib) set(SPEngineZlibFiles @@ -355,7 +391,7 @@ if(BuildSPEngine OR BuildJK2SPEngine) endif(UseInternalZlib) # project macro so we can invoke it twice: for jk2 and for ja - function(add_sp_project ProjectName Label SPDirName) + function(add_sp_project ProjectName Label SPDirName InstallDir Component) if(MakeApplicationBundles) set_source_files_properties(${SPDirName}/macosx/OpenJK.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) set(SPEngineFiles ${SPEngineFiles} ${SPDirName}/macosx/OpenJK.icns) @@ -365,6 +401,17 @@ if(BuildSPEngine OR BuildJK2SPEngine) if(WIN32) add_executable(${ProjectName} WIN32 ${SPEngineFiles}) + if(UseInternalSDL2) + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(SPEngineExtraInstallFiles + ${OpenJKLibDir}/SDL2/bin/x86/SDL2.dll + ) + else() + set(SPEngineExtraInstallFiles + ${OpenJKLibDir}/SDL2/bin/x64/SDL2.dll + ) + endif() + endif() else(WIN32) if(MakeApplicationBundles) add_executable(${ProjectName} MACOSX_BUNDLE ${SPEngineFiles}) @@ -375,9 +422,20 @@ if(BuildSPEngine OR BuildJK2SPEngine) endif(WIN32) if(MakeApplicationBundles) - install(TARGETS ${ProjectName} BUNDLE DESTINATION ".") + install(TARGETS ${ProjectName} + BUNDLE + DESTINATION ${InstallDir} + COMPONENT ${Component}) else(MakeApplicationBundles) - install(TARGETS ${ProjectName} RUNTIME DESTINATION ".") + install(TARGETS ${ProjectName} + RUNTIME + DESTINATION ${InstallDir} + COMPONENT ${Component}) + if(SPEngineExtraInstallFiles) + install(FILES ${SPEngineExtraInstallFiles} + DESTINATION ${InstallDir} + COMPONENT ${Component}) + endif() endif(MakeApplicationBundles) set_target_properties(${ProjectName} PROPERTIES COMPILE_DEFINITIONS_RELWITHDEBINFO "${SPEngineDefines};${ReleaseDefines}") @@ -391,11 +449,11 @@ if(BuildSPEngine OR BuildJK2SPEngine) endif(SPEngineLibraries) endfunction(add_sp_project) if(BuildSPEngine) - add_sp_project(${SPEngine} "SP Client" ${SPDir}) + add_sp_project(${SPEngine} "SP Client" ${SPDir} ${JKAInstallDir} ${JKASPClientComponent}) endif(BuildSPEngine) if(BuildJK2SPEngine) set(SPEngineDefines ${SPEngineDefines} "JK2_MODE") - add_sp_project(${JK2SPEngine} "JK2 SP Client" ${JK2SPDir}) + add_sp_project(${JK2SPEngine} "JK2 SP Client" ${JK2SPDir} ${JK2InstallDir} ${JK2SPClientComponent}) endif(BuildJK2SPEngine) endif(BuildSPEngine OR BuildJK2SPEngine) diff --git a/code/Ragl/graph_region.h b/code/Ragl/graph_region.h index 0c51e84ae6..46e8fbbaa0 100644 --- a/code/Ragl/graph_region.h +++ b/code/Ragl/graph_region.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY diff --git a/code/Ragl/graph_triangulate.h b/code/Ragl/graph_triangulate.h index 8dcce5d422..c43a9d7ea7 100644 --- a/code/Ragl/graph_triangulate.h +++ b/code/Ragl/graph_triangulate.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY diff --git a/code/Ragl/graph_vs.h b/code/Ragl/graph_vs.h index c47935e1c0..f0f1c1a1f7 100644 --- a/code/Ragl/graph_vs.h +++ b/code/Ragl/graph_vs.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activison //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY diff --git a/code/Ragl/kdtree_vs.h b/code/Ragl/kdtree_vs.h index 73a60c3486..451261645b 100644 --- a/code/Ragl/kdtree_vs.h +++ b/code/Ragl/kdtree_vs.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY diff --git a/code/Ragl/ragl_common.h b/code/Ragl/ragl_common.h index 66ba081dc0..c30d602ce0 100644 --- a/code/Ragl/ragl_common.h +++ b/code/Ragl/ragl_common.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY diff --git a/code/Ratl/array_vs.h b/code/Ratl/array_vs.h index 66b4556960..523511d4ba 100644 --- a/code/Ratl/array_vs.h +++ b/code/Ratl/array_vs.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY diff --git a/code/Ratl/bits_vs.h b/code/Ratl/bits_vs.h index 751c79c60f..0080172b6f 100644 --- a/code/Ratl/bits_vs.h +++ b/code/Ratl/bits_vs.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY diff --git a/code/Ratl/grid_vs.h b/code/Ratl/grid_vs.h index ac064f8822..0730aafce9 100644 --- a/code/Ratl/grid_vs.h +++ b/code/Ratl/grid_vs.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY diff --git a/code/Ratl/handle_pool_vs.h b/code/Ratl/handle_pool_vs.h index 6d5b2aad0c..1985e3582b 100644 --- a/code/Ratl/handle_pool_vs.h +++ b/code/Ratl/handle_pool_vs.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY @@ -60,11 +64,7 @@ template class handle_pool_base : public pool_root { public: -#ifdef _WIN32 - typedef typename T TStorageTraits; -#else typedef T TStorageTraits; -#endif typedef typename T::TValue TTValue; //////////////////////////////////////////////////////////////////////////////////// // Capacity Enum @@ -250,10 +250,7 @@ class handle_pool_base : public pool_root //////////////////////////////////////////////////////////////////////////////////// // Get An Iterator To The Object At handle //////////////////////////////////////////////////////////////////////////////////// -#ifndef _WIN32 - typename -#endif - pool_root::iterator at(int handle) + typename pool_root::iterator at(int handle) { assert(is_used(handle)); return pool_root::at_index(handle&mMASK_HANDLE_TO_INDEX); @@ -262,10 +259,7 @@ class handle_pool_base : public pool_root //////////////////////////////////////////////////////////////////////////////////// // Get An Iterator To The Object At handle //////////////////////////////////////////////////////////////////////////////////// -#ifndef _WIN32 - typename -#endif - pool_root::const_iterator at(int handle) const + typename pool_root::const_iterator at(int handle) const { assert(is_used(handle)); return pool_root::at_index(handle&mMASK_HANDLE_TO_INDEX); diff --git a/code/Ratl/hash_pool_vs.h b/code/Ratl/hash_pool_vs.h index 6c43fae450..879e9310d0 100644 --- a/code/Ratl/hash_pool_vs.h +++ b/code/Ratl/hash_pool_vs.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY diff --git a/code/Ratl/heap_vs.h b/code/Ratl/heap_vs.h index 1cbb796eca..17aa3ff431 100644 --- a/code/Ratl/heap_vs.h +++ b/code/Ratl/heap_vs.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY diff --git a/code/Ratl/list_vs.h b/code/Ratl/list_vs.h index aa0ddd5050..f244898138 100644 --- a/code/Ratl/list_vs.h +++ b/code/Ratl/list_vs.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY diff --git a/code/Ratl/map_vs.h b/code/Ratl/map_vs.h index 1a1d17d172..7f525d2e46 100644 --- a/code/Ratl/map_vs.h +++ b/code/Ratl/map_vs.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY @@ -49,14 +53,14 @@ namespace ratl // this is private to the set, but you have no access to it, soooo.. - + class tree_node { int mParent; int mLeft; int mRight; public: - enum + enum { RED_BIT = 0x40000000, // to save space we are putting the red bool in a high bit // this is in the parent only @@ -116,11 +120,7 @@ template class tree_base { public: -#ifdef _WIN32 - typedef typename T TStorageTraits; -#else typedef T TStorageTraits; -#endif typedef typename T::TValue TTValue; //////////////////////////////////////////////////////////////////////////////////// // Capacity Enum @@ -226,7 +226,7 @@ class tree_base //////////////////////////////////////////////////////////////////////////////////// int insert_internal(const TTValue &key, int &at) { - // If At Is A NULL_NODE, We Have Found A Leaf. + // If At Is A NULL_NODE, We Have Found A Leaf. //---------------------------------------------- if (at==tree_node::NULL_NODE) { @@ -239,7 +239,7 @@ class tree_base int nxtChild; // The Child We Will Eventually Add Underneath - int altChild; // The "other" Child + //int altChild; // The "other" Child bool nxtRotateLeft; int excessRedChild; // If The Insert Results In An Excess Red Child, This Will Be It @@ -258,7 +258,7 @@ class tree_base link_left(at,mLastAdd);//T::node(mPool[at]).set_left(mLastAdd); // If mLeft Of The Current Node Is NULL, We Must Have Added DIRECTLY Below nAt } nxtChild = T::node(mPool[at]).left(); - altChild = T::node(mPool[at]).right(); + //altChild = T::node(mPool[at]).right(); nxtRotateLeft = false; } else if (mPool[at] < key) @@ -272,7 +272,7 @@ class tree_base link_right(at,mLastAdd); // T::node(mPool[at]).set_right(mLastAdd); // If mRight Of The Current Node Is NULL, We Must Have Added DIRECTLY Below nAt } nxtChild = T::node(mPool[at]).right(); - altChild = T::node(mPool[at]).left(); + //altChild = T::node(mPool[at]).left(); nxtRotateLeft = true; } @@ -284,23 +284,23 @@ class tree_base return tree_node::NULL_NODE; } - + // If The Add Resulted In An Excess Red Child, We Need To Change Colors And Rotate - //--------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- if (excessRedChild!=tree_node::NULL_NODE) { // If Both Childeren Are Red, Just Switch And Be Done //---------------------------------------------------- - if (T::node(mPool[at]).right()!=tree_node::NULL_NODE && - T::node(mPool[at]).left()!=tree_node::NULL_NODE && - T::node(mPool[T::node(mPool[at]).right()]).red() && + if (T::node(mPool[at]).right()!=tree_node::NULL_NODE && + T::node(mPool[at]).left()!=tree_node::NULL_NODE && + T::node(mPool[T::node(mPool[at]).right()]).red() && T::node(mPool[T::node(mPool[at]).left()]).red()) { set_colors(T::node(mPool[at]), true, false); } else { - int excessRedChildCompare = + int excessRedChildCompare = (nxtRotateLeft)?(T::node(mPool[nxtChild]).right()):(T::node(mPool[nxtChild]).left()); if (excessRedChild==excessRedChildCompare) { @@ -328,15 +328,15 @@ class tree_base set_colors(T::node(mPool[at]), false, true); } } - + if (T::node(mPool[at]).red()) { - if (T::node(mPool[at]).left()!=tree_node::NULL_NODE && + if (T::node(mPool[at]).left()!=tree_node::NULL_NODE && T::node(mPool[T::node(mPool[at]).left()]).red()) { return T::node(mPool[at]).left(); } - if (T::node(mPool[at]).right()!=tree_node::NULL_NODE && + if (T::node(mPool[at]).right()!=tree_node::NULL_NODE && T::node(mPool[T::node(mPool[at]).right()]).red()) { return T::node(mPool[at]).right(); @@ -437,8 +437,8 @@ class tree_base { parent_successor=successor; successor = T::node(mPool[successor]).left(); - } - + } + int successor_right = T::node(mPool[successor]).right(); @@ -473,8 +473,8 @@ class tree_base } } - link_left(at,tree_node::NULL_NODE); - link_right(at,successor_right); + link_left(at,tree_node::NULL_NODE); + link_right(at,successor_right); at=successor; int a=T::node(mPool[at]).right(); @@ -560,7 +560,7 @@ class tree_base { // If Both X and Y are Empty, Or Both Are Red //-------------------------------------------- - if ((x==tree_node::NULL_NODE || !T::node(mPool[x]).red()) && + if ((x==tree_node::NULL_NODE || !T::node(mPool[x]).red()) && (y==tree_node::NULL_NODE || !T::node(mPool[y]).red())) { bool atWasRed = T::node(mPool[at]).red(); // Remember what mPool[at] WAS @@ -629,7 +629,7 @@ class tree_base //////////////////////////////////////////////////////////////////////////////////// int front(int at) const { - if (at!=tree_node::NULL_NODE && + if (at!=tree_node::NULL_NODE && T::node(mPool[at]).left()!=tree_node::NULL_NODE) { return front(T::node(mPool[at]).left()); @@ -759,7 +759,7 @@ class tree_base //////////////////////////////////////////////////////////////////////////////////// void alloc_key(const TTValue &key) { - + //fixme handle duplicates more sensibly? assert(!full()); mLastAdd = mPool.alloc(key); // Grab A New One @@ -770,7 +770,7 @@ class tree_base // Allocs an item, when filled, call insert_alloced //////////////////////////////////////////////////////////////////////////////////// TTValue & alloc_key() - { + { assert(!full()); mLastAdd = mPool.alloc(); // Grab A New One T::node(mPool[mLastAdd]).init(); // Initialize Our Data And Color @@ -796,7 +796,7 @@ class tree_base void insert_alloced_key() { - assert(mLastAdd>=0&&mLastAdd=0&&mLastAdd=0&&mLastAdd=0&&mLastAdd { public: -#ifdef _WIN32 - typedef typename T TStorageTraits; -#else typedef T TStorageTraits; -#endif typedef typename T::TValue TTValue; //////////////////////////////////////////////////////////////////////////////////// // Capacity Enum @@ -867,7 +863,7 @@ class set_base : public tree_base //////////////////////////////////////////////////////////////////////////////////// void insert(const TTValue &key) { - + assert(!IS_MULTI || find_index(key)==tree_node::NULL_NODE); //fixme handle duplicates more sensibly? alloc_key(key); @@ -879,7 +875,7 @@ class set_base : public tree_base // Allocs an item, when filled, call insert_alloced //////////////////////////////////////////////////////////////////////////////////// TTValue & alloc() - { + { return tree_base::alloc_key(); } @@ -930,14 +926,14 @@ class set_base : public tree_base set_base* mOwner; public: - iterator(set_base *owner=0, int loc=tree_node::NULL_NODE) : - mOwner(owner), - mLoc(loc) + iterator(set_base *owner=0, int loc=tree_node::NULL_NODE) : + mOwner(owner), + mLoc(loc) { } - iterator(const iterator &o) : - mOwner(o.mOwner), - mLoc(o.mLoc) + iterator(const iterator &o) : + mOwner(o.mOwner), + mLoc(o.mLoc) { } @@ -948,28 +944,28 @@ class set_base : public tree_base } iterator operator++() //prefix - { - assert(mOwner); + { + assert(mOwner); mLoc=mOwner->next(mLoc); return *this; } iterator operator++(int) //postfix { - assert(mOwner); + assert(mOwner); iterator old(*this); mLoc=mOwner->next(mLoc); return old; } iterator operator--() //prefix - { - assert(mOwner); + { + assert(mOwner); mLoc=mOwner->previous(mLoc); return *this; } iterator operator--(int) //postfix { - assert(mOwner); + assert(mOwner); iterator old(*this); mLoc=mOwner->previous(mLoc); return old; @@ -978,15 +974,15 @@ class set_base : public tree_base bool operator!=(const iterator p) const {return (mLoc!=p.mLoc || mOwner!=p.mOwner);} bool operator==(const iterator p) const {return (mLoc==p.mLoc && mOwner==p.mOwner);} - const TTValue & operator*() const + const TTValue & operator*() const { - assert(mOwner); + assert(mOwner); assert(mLoc>=0&&mLocindex_to_key(mLoc); } - const TTValue * operator->() const + const TTValue * operator->() const { - assert(mOwner); + assert(mOwner); assert(mLoc>=0&&mLocindex_to_key(mLoc); } @@ -1000,19 +996,19 @@ class set_base : public tree_base const set_base* mOwner; public: - const_iterator(const set_base *owner=0, int loc=tree_node::NULL_NODE) : - mOwner(owner), - mLoc(loc) + const_iterator(const set_base *owner=0, int loc=tree_node::NULL_NODE) : + mOwner(owner), + mLoc(loc) { } - const_iterator(const const_iterator &o) : - mOwner(o.mOwner), - mLoc(o.mLoc) + const_iterator(const const_iterator &o) : + mOwner(o.mOwner), + mLoc(o.mLoc) { } - const_iterator(const iterator &o) : - mOwner(o.mOwner), - mLoc(o.mLoc) + const_iterator(const iterator &o) : + mOwner(o.mOwner), + mLoc(o.mLoc) { } void operator=(const const_iterator &o) @@ -1028,28 +1024,28 @@ class set_base : public tree_base const_iterator operator++() //prefix - { - assert(mOwner); + { + assert(mOwner); mLoc=mOwner->next(mLoc); return *this; } const_iterator operator++(int) //postfix { - assert(mOwner); + assert(mOwner); const_iterator old(*this); mLoc=mOwner->next(mLoc); return old; } const_iterator operator--() //prefix - { - assert(mOwner); + { + assert(mOwner); mLoc=mOwner->previous(mLoc); return *this; } const_iterator operator--(int) //postfix { - assert(mOwner); + assert(mOwner); const_iterator old(*this); mLoc=mOwner->previous(mLoc); return old; @@ -1060,15 +1056,15 @@ class set_base : public tree_base bool operator!=(const iterator p) const {return (mLoc!=p.mLoc || mOwner!=p.mOwner);} bool operator==(const iterator p) const {return (mLoc==p.mLoc && mOwner==p.mOwner);} - const TTValue & operator*() const + const TTValue & operator*() const { - assert(mOwner); + assert(mOwner); assert(mLoc>=0&&mLocindex_to_key(mLoc); } - const TTValue * operator->() const + const TTValue * operator->() const { - assert(mOwner); + assert(mOwner); assert(mLoc>=0&&mLocindex_to_key(mLoc); } @@ -1081,7 +1077,7 @@ class set_base : public tree_base //////////////////////////////////////////////////////////////////////////////////// iterator find(const TTValue &key) { - return iterator(this,find_index(key)); + return iterator(this,find_index(key)); } //////////////////////////////////////////////////////////////////////////////////// @@ -1089,7 +1085,7 @@ class set_base : public tree_base //////////////////////////////////////////////////////////////////////////////////// iterator begin() { - return iterator(this, tree_base::front()); + return iterator(this, tree_base::front()); } //////////////////////////////////////////////////////////////////////////////////// @@ -1113,7 +1109,7 @@ class set_base : public tree_base //////////////////////////////////////////////////////////////////////////////////// const_iterator find(const TTValue &key) const { - return const_iterator(this, find_index(key)); + return const_iterator(this, find_index(key)); } //////////////////////////////////////////////////////////////////////////////////// @@ -1121,7 +1117,7 @@ class set_base : public tree_base //////////////////////////////////////////////////////////////////////////////////// const_iterator begin() const { - return const_iterator(this, tree_base::front()); + return const_iterator(this, tree_base::front()); } //////////////////////////////////////////////////////////////////////////////////// @@ -1207,17 +1203,10 @@ template class map_base : public tree_base { public: -#ifdef _WIN32 - typedef typename K TKeyStorageTraits; -#else typedef K TKeyStorageTraits; -#endif typedef typename K::TValue TKTValue; -#ifdef _WIN32 - typedef typename V TValueStorageTraits; -#else + typedef V TValueStorageTraits; -#endif typedef typename V::TValue TVTValue; //////////////////////////////////////////////////////////////////////////////////// // Capacity Enum @@ -1244,7 +1233,7 @@ class map_base : public tree_base assert(!IS_MULTI || (tree_base::find_index(key)==tree_node::NULL_NODE)); //fixme handle duplicates more sensibly? tree_base::alloc_key(key); - tree_base::insert_alloced_key(); + tree_base::insert_alloced_key(); assert(check_validity()); mValues.construct(tree_base::index_of_alloced_key(),value); } @@ -1254,11 +1243,11 @@ class map_base : public tree_base //////////////////////////////////////////////////////////////////////////////////// TVTValue &insert(const TKTValue &key) { - + assert(!IS_MULTI || (tree_base::find_index(key)==tree_node::NULL_NODE)); //fixme handle duplicates more sensibly? tree_base::alloc_key(key); - tree_base::insert_alloced_key(); + tree_base::insert_alloced_key(); int idx=tree_base::index_of_alloced_key(); assert(check_validity()); @@ -1270,11 +1259,11 @@ class map_base : public tree_base //////////////////////////////////////////////////////////////////////////////////// TRatlNew *insert_raw(const TKTValue &key) { - + assert(!IS_MULTI || (tree_base::find_index(key)==tree_node::NULL_NODE)); //fixme handle duplicates more sensibly? tree_base::alloc_key(key); - tree_base::insert_alloced_key(); + tree_base::insert_alloced_key(); assert(check_validity()); return mValues.alloc_raw(tree_base::index_of_alloced_key()); } @@ -1283,7 +1272,7 @@ class map_base : public tree_base // After calling alloc_key*, you may call this to alloc the value //////////////////////////////////////////////////////////////////////////////////// TVTValue &alloc_value() - { + { mValues.construct(tree_base::index_of_alloced_key()); return mValues[tree_base::index_of_alloced_key()]; } @@ -1333,12 +1322,12 @@ class map_base : public tree_base map_base* mOwner; public: - iterator(map_base *owner=0, int loc=tree_node::NULL_NODE) : - mLoc(loc), + iterator(map_base *owner=0, int loc=tree_node::NULL_NODE) : + mLoc(loc), mOwner(owner) { } - iterator(const iterator &o) : + iterator(const iterator &o) : mLoc(o.mLoc), mOwner(o.mOwner) { @@ -1351,28 +1340,28 @@ class map_base : public tree_base } iterator operator++() //prefix - { - assert(mOwner); + { + assert(mOwner); mLoc=mOwner->next(mLoc); return *this; } iterator operator++(int) //postfix { - assert(mOwner); + assert(mOwner); iterator old(*this); mLoc=mOwner->next(mLoc); return old; } iterator operator--() //prefix - { - assert(mOwner); + { + assert(mOwner); mLoc=mOwner->previous(mLoc); return *this; } iterator operator--(int) //postfix { - assert(mOwner); + assert(mOwner); iterator old(*this); mLoc=mOwner->previous(mLoc); return old; @@ -1381,27 +1370,27 @@ class map_base : public tree_base bool operator!=(const iterator &p) const {return (mLoc!=p.mLoc || mOwner!=p.mOwner);} bool operator==(const iterator &p) const {return (mLoc==p.mLoc && mOwner==p.mOwner);} - TVTValue & operator*() const + TVTValue & operator*() const { - assert(mOwner); + assert(mOwner); assert(mLoc>=0&&mLocmValues[mLoc]; } - const TKTValue & key() const + const TKTValue & key() const { - assert(mOwner); + assert(mOwner); assert(mLoc>=0&&mLocindex_to_key(mLoc); - } - TVTValue & value() const + } + TVTValue & value() const { - assert(mOwner); + assert(mOwner); assert(mLoc>=0&&mLocmValues[mLoc]; } - TVTValue * operator->() const + TVTValue * operator->() const { - assert(mOwner); + assert(mOwner); assert(mLoc>=0&&mLocmValues[mLoc]; } @@ -1414,19 +1403,19 @@ class map_base : public tree_base const map_base* mOwner; public: - const_iterator(const map_base *owner=0, int loc=tree_node::NULL_NODE) : - mOwner(owner), - mLoc(loc) + const_iterator(const map_base *owner=0, int loc=tree_node::NULL_NODE) : + mOwner(owner), + mLoc(loc) { } - const_iterator(const const_iterator &o) : - mOwner(o.mOwner), - mLoc(o.mLoc) + const_iterator(const const_iterator &o) : + mOwner(o.mOwner), + mLoc(o.mLoc) { } - const_iterator(const iterator &o) : - mOwner(o.mOwner), - mLoc(o.mLoc) + const_iterator(const iterator &o) : + mOwner(o.mOwner), + mLoc(o.mLoc) { } void operator=(const const_iterator &o) @@ -1442,28 +1431,28 @@ class map_base : public tree_base const_iterator operator++() //prefix - { - assert(mOwner); + { + assert(mOwner); mLoc=mOwner->next(mLoc); return *this; } const_iterator operator++(int) //postfix { - assert(mOwner); + assert(mOwner); const_iterator old(*this); mLoc=mOwner->next(mLoc); return old; } const_iterator operator--() //prefix - { - assert(mOwner); + { + assert(mOwner); mLoc=mOwner->previous(mLoc); return *this; } const_iterator operator--(int) //postfix { - assert(mOwner); + assert(mOwner); const_iterator old(*this); mLoc=mOwner->previous(mLoc); return old; @@ -1474,27 +1463,27 @@ class map_base : public tree_base bool operator!=(const iterator &p) const {return (mLoc!=p.mLoc || mOwner!=p.mOwner);} bool operator==(const iterator &p) const {return (mLoc==p.mLoc && mOwner==p.mOwner);} - const TVTValue & operator*() const + const TVTValue & operator*() const { - assert(mOwner); + assert(mOwner); assert(mLoc>=0&&mLocmValues[mLoc]; } - const TKTValue & key() const + const TKTValue & key() const { - assert(mOwner); + assert(mOwner); assert(mLoc>=0&&mLocindex_to_key(mLoc); - } - const TVTValue & value() const + } + const TVTValue & value() const { - assert(mOwner); + assert(mOwner); assert(mLoc>=0&&mLocmValues[mLoc]; } - const TVTValue * operator->() const + const TVTValue * operator->() const { - assert(mOwner); + assert(mOwner); assert(mLoc>=0&&mLocmValues[mLoc]; } @@ -1507,7 +1496,7 @@ class map_base : public tree_base //////////////////////////////////////////////////////////////////////////////////// iterator find(const TKTValue &key) { - return iterator(this,tree_base::find_index(key)); + return iterator(this,tree_base::find_index(key)); } //////////////////////////////////////////////////////////////////////////////////// @@ -1515,7 +1504,7 @@ class map_base : public tree_base //////////////////////////////////////////////////////////////////////////////////// iterator begin() { - return iterator(this, tree_base::front()); + return iterator(this, tree_base::front()); } //////////////////////////////////////////////////////////////////////////////////// @@ -1539,7 +1528,7 @@ class map_base : public tree_base //////////////////////////////////////////////////////////////////////////////////// const_iterator find(const TKTValue &key) const { - return const_iterator(this, find_index(key)); + return const_iterator(this, find_index(key)); } //////////////////////////////////////////////////////////////////////////////////// @@ -1547,7 +1536,7 @@ class map_base : public tree_base //////////////////////////////////////////////////////////////////////////////////// const_iterator begin() const { - return const_iterator(this, tree_base::front()); + return const_iterator(this, tree_base::front()); } //////////////////////////////////////////////////////////////////////////////////// diff --git a/code/Ratl/pool_vs.h b/code/Ratl/pool_vs.h index 126f0273f8..b13e472ec1 100644 --- a/code/Ratl/pool_vs.h +++ b/code/Ratl/pool_vs.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY @@ -58,11 +62,7 @@ template class pool_root : public ratl_base { public: -#ifdef _WIN32 - typedef typename T TStorageTraits; -#else typedef T TStorageTraits; -#endif typedef typename T::TValue TTValue; //////////////////////////////////////////////////////////////////////////////////// // Capacity Enum @@ -531,10 +531,7 @@ class pool_base : public pool_root //////////////////////////////////////////////////////////////////////////////////// // Get An Iterator To The Object At index //////////////////////////////////////////////////////////////////////////////////// -#ifndef _WIN32 - typename -#endif - pool_root::iterator at(int index) + typename pool_root::iterator at(int index) { return pool_root::at_index(index); } @@ -542,10 +539,7 @@ class pool_base : public pool_root //////////////////////////////////////////////////////////////////////////////////// // Get An Iterator To The Object At index //////////////////////////////////////////////////////////////////////////////////// -#ifndef _WIN32 - typename -#endif - pool_root::const_iterator at(int index) const + typename pool_root::const_iterator at(int index) const { return pool_root::at_index(index); } diff --git a/code/Ratl/queue_vs.h b/code/Ratl/queue_vs.h index 8c7eeae2dc..0927bf0e94 100644 --- a/code/Ratl/queue_vs.h +++ b/code/Ratl/queue_vs.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY @@ -59,11 +63,7 @@ template class queue_base : public ratl_base { public: -#ifdef _WIN32 - typedef typename T TStorageTraits; -#else typedef T TStorageTraits; -#endif typedef typename T::TValue TTValue; //////////////////////////////////////////////////////////////////////////////////// // Capacity Enum @@ -100,9 +100,6 @@ class queue_base : public ratl_base public: -#ifdef _WIN32 - typedef T TStorageTraits; -#endif //////////////////////////////////////////////////////////////////////////////////// // Constructor diff --git a/code/Ratl/ratl.cpp b/code/Ratl/ratl.cpp index ec8e30e1e3..b6830ddc02 100644 --- a/code/Ratl/ratl.cpp +++ b/code/Ratl/ratl.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision #include "../qcommon/q_shared.h" @@ -81,7 +85,7 @@ void ratl_base::load(hfile& file) } //////////////////////////////////////////////////////////////////////////////////////// -// A Profile Print Function +// A Profile Print Function //////////////////////////////////////////////////////////////////////////////////////// #if !defined(FINAL_BUILD) void ratl_base::ProfilePrint(const char * format, ...) @@ -119,30 +123,5 @@ void ratl_base::ProfilePrint(const char * format, ...) { } #endif - -namespace str -{ - void to_upper(char *dest) - { - for (int i=0; i. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY @@ -63,20 +67,6 @@ This file is part of Jedi Academy. #if !defined(RATL_COMMON_INC) #define RATL_COMMON_INC -//////////////////////////////////////////////////////////////////////////////////////// -// In VC++, Don't Bother With These Warnings -//////////////////////////////////////////////////////////////////////////////////////// -#if defined(_MSC_VER) && !defined(__MWERKS__) - #pragma warning ( disable : 4786 ) // Truncated to 255 characters warning - #pragma warning ( disable : 4284 ) // nevamind what this is - #pragma warning ( disable : 4100 ) // unreferenced formal parameter - #pragma warning ( disable : 4512 ) // unable to generate default operator= - #pragma warning ( disable : 4130 ) // logical operation on address of string constant - #pragma warning ( disable : 4127 ) // conditional expression is constant - #pragma warning ( disable : 4996 ) // This function or variable may be unsafe. -#endif - - //////////////////////////////////////////////////////////////////////////////////////// // Includes //////////////////////////////////////////////////////////////////////////////////////// @@ -263,10 +253,6 @@ namespace str { return strtok(s,gap); } - - void to_upper(char *dest); - void to_lower(char *dest); - void printf(char *dest,const char *formatS, ...); } @@ -1014,11 +1000,7 @@ class array_base : public ratl_base //////////////////////////////////////////////////////////////////////////////////// // Data //////////////////////////////////////////////////////////////////////////////////// -#ifdef _WIN32 - typedef typename T TStorageTraits; -#else typedef T TStorageTraits; -#endif typedef typename T::TArray TTArray; typedef typename T::TValue TTValue; typedef typename T::TConstructed TTConstructed; diff --git a/code/Ratl/scheduler_vs.h b/code/Ratl/scheduler_vs.h index e2941d0dcc..1ba834d338 100644 --- a/code/Ratl/scheduler_vs.h +++ b/code/Ratl/scheduler_vs.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY diff --git a/code/Ratl/stack_vs.h b/code/Ratl/stack_vs.h index 96c07dafcb..2f88d0d537 100644 --- a/code/Ratl/stack_vs.h +++ b/code/Ratl/stack_vs.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY @@ -54,11 +58,7 @@ template class stack_base : public ratl_base { public: -#ifdef _WIN32 - typedef typename T TStorageTraits; -#else typedef T TStorageTraits; -#endif typedef typename T::TValue TTValue; //////////////////////////////////////////////////////////////////////////////////// // Capacity Enum diff --git a/code/Ratl/string_vs.h b/code/Ratl/string_vs.h index 84a2234b6c..8fd1a7a122 100644 --- a/code/Ratl/string_vs.h +++ b/code/Ratl/string_vs.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY diff --git a/code/Ratl/vector_vs.h b/code/Ratl/vector_vs.h index ae6bca4a73..7f42865920 100644 --- a/code/Ratl/vector_vs.h +++ b/code/Ratl/vector_vs.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY @@ -56,11 +60,7 @@ template class vector_base : public ratl_base { public: -#ifdef _WIN32 - typedef typename T TStorageTraits; -#else typedef T TStorageTraits; -#endif typedef typename T::TValue TTValue; //////////////////////////////////////////////////////////////////////////////////// // Capacity Enum diff --git a/code/Ravl/CBounds.cpp b/code/Ravl/CBounds.cpp index 74f85b6885..675e15ac49 100644 --- a/code/Ravl/CBounds.cpp +++ b/code/Ravl/CBounds.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY diff --git a/code/Ravl/CBounds.h b/code/Ravl/CBounds.h index 79fd59ddf6..92b8258057 100644 --- a/code/Ravl/CBounds.h +++ b/code/Ravl/CBounds.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY @@ -203,4 +207,4 @@ class CBBox }; //}; -#endif \ No newline at end of file +#endif diff --git a/code/Ravl/CMatrix.h b/code/Ravl/CMatrix.h index c18cffe78f..5ca79f52fd 100644 --- a/code/Ravl/CMatrix.h +++ b/code/Ravl/CMatrix.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY @@ -180,4 +184,4 @@ class CMatrix //} -#endif \ No newline at end of file +#endif diff --git a/code/Ravl/CVec.cpp b/code/Ravl/CVec.cpp index 8748260818..2997e3b4e7 100644 --- a/code/Ravl/CVec.cpp +++ b/code/Ravl/CVec.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY diff --git a/code/Ravl/CVec.h b/code/Ravl/CVec.h index 0bfd918719..335dca3836 100644 --- a/code/Ravl/CVec.h +++ b/code/Ravl/CVec.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD TEMPLATE LIBRARY diff --git a/code/Rufl/hfile.cpp b/code/Rufl/hfile.cpp index fda0a77757..7484daeea1 100644 --- a/code/Rufl/hfile.cpp +++ b/code/Rufl/hfile.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD USEFUL FUNCTION LIBRARY @@ -78,7 +82,7 @@ struct SOpenFile }; typedef ratl::handle_pool_vs TFilePool; -TFilePool& Pool() +static TFilePool& Pool() { static TFilePool TFP; return TFP; diff --git a/code/Rufl/hfile.h b/code/Rufl/hfile.h index 149aa024a7..780bfae066 100644 --- a/code/Rufl/hfile.h +++ b/code/Rufl/hfile.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD USEFUL FUNCTION LIBRARY @@ -76,4 +81,4 @@ class hfile }; -#endif // hfile_H \ No newline at end of file +#endif // hfile_H diff --git a/code/Rufl/hstring.cpp b/code/Rufl/hstring.cpp index 3adead6c28..6d3959561e 100644 --- a/code/Rufl/hstring.cpp +++ b/code/Rufl/hstring.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD USEFUL FUNCTION LIBRARY @@ -62,7 +66,7 @@ This file is part of Jedi Academy. typedef ratl::hash_pool TStrPool; -TStrPool& Pool() +static TStrPool& Pool() { static TStrPool TSP; return TSP; diff --git a/code/Rufl/hstring.h b/code/Rufl/hstring.h index ea97628371..539b1107b6 100644 --- a/code/Rufl/hstring.h +++ b/code/Rufl/hstring.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2002-2013 Activision //////////////////////////////////////////////////////////////////////////////////////// // RAVEN STANDARD USEFUL FUNCTION LIBRARY diff --git a/code/cgame/FX_ATSTMain.cpp b/code/cgame/FX_ATSTMain.cpp index 932077d9f9..04d7ac1227 100644 --- a/code/cgame/FX_ATSTMain.cpp +++ b/code/cgame/FX_ATSTMain.cpp @@ -1,24 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Bowcaster Weapon -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" diff --git a/code/cgame/FX_Blaster.cpp b/code/cgame/FX_Blaster.cpp index 188401503f..0c8be637a3 100644 --- a/code/cgame/FX_Blaster.cpp +++ b/code/cgame/FX_Blaster.cpp @@ -1,24 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Blaster Weapon -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_local.h" diff --git a/code/cgame/FX_Bowcaster.cpp b/code/cgame/FX_Bowcaster.cpp index 9d616b8773..36f14302b2 100644 --- a/code/cgame/FX_Bowcaster.cpp +++ b/code/cgame/FX_Bowcaster.cpp @@ -1,24 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Bowcaster Weapon -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" @@ -80,4 +83,4 @@ FX_BowcasterHitPlayer void FX_BowcasterHitPlayer( vec3_t origin, vec3_t normal, qboolean humanoid ) { theFxScheduler.PlayEffect( cgs.effects.bowcasterImpactEffect, origin, normal ); -} \ No newline at end of file +} diff --git a/code/cgame/FX_BryarPistol.cpp b/code/cgame/FX_BryarPistol.cpp index 7a75976ec7..8e8fb0af1f 100644 --- a/code/cgame/FX_BryarPistol.cpp +++ b/code/cgame/FX_BryarPistol.cpp @@ -1,24 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Bryar Pistol Weapon Effects -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" diff --git a/code/cgame/FX_Concussion.cpp b/code/cgame/FX_Concussion.cpp index 3fd21afbf1..11d3442cf6 100644 --- a/code/cgame/FX_Concussion.cpp +++ b/code/cgame/FX_Concussion.cpp @@ -1,24 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Concussion Rifle Weapon -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" @@ -112,4 +115,4 @@ void FX_ConcAltMiss( vec3_t origin, vec3_t normal ) FX_AddBezier( origin, pos, c1, vec3_origin, c2, vec3_origin, 6.0f, 6.0f, 0.0f, 0.0f, 0.2f, 0.5f, WHITE, WHITE, 0.0f, 4000, cgi_R_RegisterShader( "gfx/effects/smokeTrail" ), FX_ALPHA_WAVE ); theFxScheduler.PlayEffect( "concussion/alt_miss", origin, normal ); -} \ No newline at end of file +} diff --git a/code/cgame/FX_DEMP2.cpp b/code/cgame/FX_DEMP2.cpp index cb44fa47d2..9be17f62ac 100644 --- a/code/cgame/FX_DEMP2.cpp +++ b/code/cgame/FX_DEMP2.cpp @@ -1,24 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // DEMP2 Weapon -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" diff --git a/code/cgame/FX_Disruptor.cpp b/code/cgame/FX_Disruptor.cpp index 002dde90c3..64a63836dc 100644 --- a/code/cgame/FX_Disruptor.cpp +++ b/code/cgame/FX_Disruptor.cpp @@ -1,24 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Disruptor Weapon -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" diff --git a/code/cgame/FX_Emplaced.cpp b/code/cgame/FX_Emplaced.cpp index 1848217bd0..5d24e9fd65 100644 --- a/code/cgame/FX_Emplaced.cpp +++ b/code/cgame/FX_Emplaced.cpp @@ -1,24 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Emplaced Weapon -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" @@ -160,4 +163,4 @@ void FX_TurretProjectileThink( centity_t *cent, const struct weaponInfo_s *weapo } theFxScheduler.PlayEffect( "turret/shot", cent->lerpOrigin, forward ); -} \ No newline at end of file +} diff --git a/code/cgame/FX_Flechette.cpp b/code/cgame/FX_Flechette.cpp index d6599ee9a1..424418704d 100644 --- a/code/cgame/FX_Flechette.cpp +++ b/code/cgame/FX_Flechette.cpp @@ -1,24 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Golan Arms Flechette Weapon -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" @@ -87,4 +90,4 @@ void FX_FlechetteAltProjectileThink( centity_t *cent, const struct weaponInfo_s } theFxScheduler.PlayEffect( cgs.effects.flechetteAltShotEffect, cent->lerpOrigin, forward ); -} \ No newline at end of file +} diff --git a/code/cgame/FX_HeavyRepeater.cpp b/code/cgame/FX_HeavyRepeater.cpp index ec2ee4a536..4c1e758506 100644 --- a/code/cgame/FX_HeavyRepeater.cpp +++ b/code/cgame/FX_HeavyRepeater.cpp @@ -1,24 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Heavy Repeater Weapon -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" @@ -106,4 +109,4 @@ void FX_RepeaterAltHitPlayer( vec3_t origin, vec3_t normal, qboolean humanoid ) { theFxScheduler.PlayEffect( "repeater/concussion", origin ); // theFxScheduler.PlayEffect( "repeater/alt_wall_impact2", origin, normal ); -} \ No newline at end of file +} diff --git a/code/cgame/FX_NoghriShot.cpp b/code/cgame/FX_NoghriShot.cpp index 40787b8a63..98f68a0ea0 100644 --- a/code/cgame/FX_NoghriShot.cpp +++ b/code/cgame/FX_NoghriShot.cpp @@ -1,24 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Noghri Rifle -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_local.h" diff --git a/code/cgame/FX_RocketLauncher.cpp b/code/cgame/FX_RocketLauncher.cpp index 243ab1bdb8..4b4ce4a380 100644 --- a/code/cgame/FX_RocketLauncher.cpp +++ b/code/cgame/FX_RocketLauncher.cpp @@ -1,24 +1,26 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Rocket Launcher Weapon - -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" diff --git a/code/cgame/FX_TuskenShot.cpp b/code/cgame/FX_TuskenShot.cpp index bdb45c5a3f..78fa466796 100644 --- a/code/cgame/FX_TuskenShot.cpp +++ b/code/cgame/FX_TuskenShot.cpp @@ -1,24 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Tusken Rifle -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_local.h" diff --git a/code/cgame/FxPrimitives.cpp b/code/cgame/FxPrimitives.cpp index a01e6ed4eb..9ef7d90721 100644 --- a/code/cgame/FxPrimitives.cpp +++ b/code/cgame/FxPrimitives.cpp @@ -1,22 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this include must remain at the top of every CPP file #include "common_headers.h" #if !defined(FX_SCHEDULER_H_INC) @@ -54,7 +57,7 @@ void ClampVec( vec3_t dat, byte *res ) } res[i] = (unsigned char)r; - } + } } void GetOrigin( int clientID, vec3_t org ) @@ -193,7 +196,7 @@ bool CParticle::Update() GetOrigin( mClientID, org ); GetDir( mClientID, dir ); - + vectoangles( dir, ang ); AngleVectors( ang, ax[0], ax[1], ax[2] ); } @@ -219,7 +222,7 @@ bool CParticle::Update() // Now move us to where we should be at the given time VectorMA( org, time, realVel, mOrigin1 ); - + } else if (( mTimeStart < theFxHelper.mTime ) && UpdateOrigin() == false ) { @@ -265,7 +268,7 @@ bool CParticle::UpdateOrigin() { bool solid; - if ( (mFlags&FX_EXPENSIVE_PHYSICS) + if ( (mFlags&FX_EXPENSIVE_PHYSICS) && fx_expensivePhysics.integer ) { solid = true; // by setting this to true, we force a real trace to happen @@ -355,12 +358,12 @@ bool CParticle::UpdateOrigin() void CParticle::UpdateSize() { // completely biased towards start if it doesn't get overridden - float perc1 = 1.0f, perc2 = 1.0f; + float perc1 = 1.0f, perc2 = 1.0f; if ( (mFlags & FX_SIZE_LINEAR) ) - { + { // calculate element biasing - perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) + perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) / (float)(mTimeEnd - mTimeStart); } @@ -368,9 +371,9 @@ void CParticle::UpdateSize() if (( mFlags & FX_SIZE_PARM_MASK ) == FX_SIZE_NONLINEAR ) { if ( theFxHelper.mTime > mSizeParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = 1.0f - (float)(theFxHelper.mTime - mSizeParm) + perc2 = 1.0f - (float)(theFxHelper.mTime - mSizeParm) / (float)(mTimeEnd - mSizeParm); } @@ -380,22 +383,22 @@ void CParticle::UpdateSize() perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } } else if (( mFlags & FX_SIZE_PARM_MASK ) == FX_SIZE_WAVE ) - { + { // wave gen, with parm being the frequency multiplier perc1 = perc1 * (float)cos( (theFxHelper.mTime - mTimeStart) * mSizeParm ); } else if (( mFlags & FX_SIZE_PARM_MASK ) == FX_SIZE_CLAMP ) { if ( theFxHelper.mTime < mSizeParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = (float)(mSizeParm - theFxHelper.mTime) + perc2 = (float)(mSizeParm - theFxHelper.mTime) / (float)(mSizeParm - mTimeStart); } else @@ -404,12 +407,12 @@ void CParticle::UpdateSize() } if ( (mFlags & FX_SIZE_LINEAR) ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } @@ -417,7 +420,7 @@ void CParticle::UpdateSize() // If needed, RAND can coexist with linear and either non-linear or wave. if (( mFlags & FX_SIZE_RAND )) - { + { // Random simply modulates the existing value perc1 = random() * perc1; } @@ -431,13 +434,13 @@ void CParticle::UpdateSize() void CParticle::UpdateRGB() { // completely biased towards start if it doesn't get overridden - float perc1 = 1.0f, perc2 = 1.0f; + float perc1 = 1.0f, perc2 = 1.0f; vec3_t res; if ( (mFlags & FX_RGB_LINEAR) ) - { + { // calculate element biasing - perc1 = 1.0f - (float)( theFxHelper.mTime - mTimeStart ) + perc1 = 1.0f - (float)( theFxHelper.mTime - mTimeStart ) / (float)( mTimeEnd - mTimeStart ); } @@ -445,34 +448,34 @@ void CParticle::UpdateRGB() if (( mFlags & FX_RGB_PARM_MASK ) == FX_RGB_NONLINEAR ) { if ( theFxHelper.mTime > mRGBParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = 1.0f - (float)( theFxHelper.mTime - mRGBParm ) + perc2 = 1.0f - (float)( theFxHelper.mTime - mRGBParm ) / (float)( mTimeEnd - mRGBParm ); } if ( (mFlags & FX_RGB_LINEAR) ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } } else if (( mFlags & FX_RGB_PARM_MASK ) == FX_RGB_WAVE ) - { + { // wave gen, with parm being the frequency multiplier perc1 = perc1 * (float)cos(( theFxHelper.mTime - mTimeStart ) * mRGBParm ); } else if (( mFlags & FX_RGB_PARM_MASK ) == FX_RGB_CLAMP ) { if ( theFxHelper.mTime < mRGBParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = (float)(mRGBParm - theFxHelper.mTime) + perc2 = (float)(mRGBParm - theFxHelper.mTime) / (float)(mRGBParm - mTimeStart); } else @@ -481,12 +484,12 @@ void CParticle::UpdateRGB() } if (( mFlags & FX_RGB_LINEAR )) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } @@ -494,12 +497,12 @@ void CParticle::UpdateRGB() // If needed, RAND can coexist with linear and either non-linear or wave. if (( mFlags & FX_RGB_RAND )) - { + { // Random simply modulates the existing value perc1 = random() * perc1; } - // Now get the correct color + // Now get the correct color VectorScale( mRGBStart, perc1, res ); VectorMA( res, (1.0f - perc1), mRGBEnd, mRefEnt.angles ); // angles is a temp storage, will get clamped to a byte in the UpdateAlpha section } @@ -514,9 +517,9 @@ void CParticle::UpdateAlpha() float perc1 = 1.0f, perc2 = 1.0f; if ( mFlags & FX_ALPHA_LINEAR ) - { + { // calculate element biasing - perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) + perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) / (float)(mTimeEnd - mTimeStart); } @@ -524,34 +527,34 @@ void CParticle::UpdateAlpha() if (( mFlags & FX_ALPHA_PARM_MASK ) == FX_ALPHA_NONLINEAR ) { if ( theFxHelper.mTime > mAlphaParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = 1.0f - (float)(theFxHelper.mTime - mAlphaParm) + perc2 = 1.0f - (float)(theFxHelper.mTime - mAlphaParm) / (float)(mTimeEnd - mAlphaParm); } if ( mFlags & FX_ALPHA_LINEAR ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } } else if (( mFlags & FX_ALPHA_PARM_MASK ) == FX_ALPHA_WAVE ) - { + { // wave gen, with parm being the frequency multiplier perc1 = perc1 * (float)cos( (theFxHelper.mTime - mTimeStart) * mAlphaParm ); } else if (( mFlags & FX_ALPHA_PARM_MASK ) == FX_ALPHA_CLAMP ) { if ( theFxHelper.mTime < mAlphaParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = (float)(mAlphaParm - theFxHelper.mTime) + perc2 = (float)(mAlphaParm - theFxHelper.mTime) / (float)(mAlphaParm - mTimeStart); } else @@ -560,12 +563,12 @@ void CParticle::UpdateAlpha() } if ( mFlags & FX_ALPHA_LINEAR ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } @@ -585,7 +588,7 @@ void CParticle::UpdateAlpha() // If needed, RAND can coexist with linear and either non-linear or wave. if ( (mFlags & FX_ALPHA_RAND) ) - { + { // Random simply modulates the existing value perc1 = random() * perc1; } @@ -664,7 +667,7 @@ bool COrientedParticle::Update() { return false; } - + if ( mFlags & FX_RELATIVE ) { if ( mClientID < 0 || mClientID >= ENTITYNUM_WORLD ) @@ -695,7 +698,7 @@ bool COrientedParticle::Update() GetOrigin( mClientID, org ); GetDir( mClientID, dir ); - + vectoangles( dir, ang ); AngleVectors( ang, ax[0], ax[1], ax[2] ); } @@ -782,7 +785,7 @@ bool CLine::Update() { return false; } - + if ( mFlags & FX_RELATIVE ) { if ( mClientID < 0 || mClientID >= ENTITYNUM_WORLD ) @@ -813,7 +816,7 @@ bool CLine::Update() } VectorAdd(mOrigin1, mOrgOffset, mOrigin1); //add the offset to the bolt point - + vec3_t end; trace_t trace; if ( mFlags & FX_APPLY_PHYSICS ) @@ -864,7 +867,7 @@ void CElectricity::Initialize() if ( mFlags & FX_BRANCH ) { - mRefEnt.renderfx |= RF_FORKED; + mRefEnt.renderfx |= RF_FORKED; } if ( mFlags & FX_TAPER ) @@ -900,7 +903,7 @@ bool CElectricity::Update() { return false; } - + //Handle Relative and Bolted Effects if ( mFlags & FX_RELATIVE ) {//add mOrgOffset to bolt position and store in mOrigin1 @@ -933,7 +936,7 @@ bool CElectricity::Update() //add the offset to the bolt point VectorAdd(mOrigin1, mOrgOffset, mOrigin1); - + //add the endpoint offset to the start to get the final offset VectorMA( mOrigin1, mVel[0], ax[0], mOrigin2 ); VectorMA( mOrigin2, mVel[1], ax[1], mOrigin2 ); @@ -996,7 +999,7 @@ bool CTail::Update() { return false; } - + if ( !fx_freeze.integer ) { VectorCopy( mOrigin1, mOldOrigin ); @@ -1088,12 +1091,12 @@ bool CTail::Update() void CTail::UpdateLength() { // completely biased towards start if it doesn't get overridden - float perc1 = 1.0f, perc2 = 1.0f; + float perc1 = 1.0f, perc2 = 1.0f; if ( mFlags & FX_LENGTH_LINEAR ) - { + { // calculate element biasing - perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) + perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) / (float)(mTimeEnd - mTimeStart); } @@ -1101,34 +1104,34 @@ void CTail::UpdateLength() if (( mFlags & FX_LENGTH_PARM_MASK ) == FX_LENGTH_NONLINEAR ) { if ( theFxHelper.mTime > mLengthParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = 1.0f - (float)(theFxHelper.mTime - mLengthParm) + perc2 = 1.0f - (float)(theFxHelper.mTime - mLengthParm) / (float)(mTimeEnd - mLengthParm); } if ( mFlags & FX_LENGTH_LINEAR ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } } else if (( mFlags & FX_LENGTH_PARM_MASK ) == FX_LENGTH_WAVE ) - { + { // wave gen, with parm being the frequency multiplier perc1 = perc1 * (float)cos( (theFxHelper.mTime - mTimeStart) * mLengthParm ); } else if (( mFlags & FX_LENGTH_PARM_MASK ) == FX_LENGTH_CLAMP ) { if ( theFxHelper.mTime < mLengthParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = (float)(mLengthParm - theFxHelper.mTime) + perc2 = (float)(mLengthParm - theFxHelper.mTime) / (float)(mLengthParm - mTimeStart); } else @@ -1137,12 +1140,12 @@ void CTail::UpdateLength() } if ( mFlags & FX_LENGTH_LINEAR ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } @@ -1150,7 +1153,7 @@ void CTail::UpdateLength() // If needed, RAND can coexist with linear and either non-linear or wave. if ( mFlags & FX_LENGTH_RAND ) - { + { // Random simply modulates the existing value perc1 = random() * perc1; } @@ -1200,12 +1203,12 @@ void CCylinder::Draw() void CCylinder::UpdateSize2() { // completely biased towards start if it doesn't get overridden - float perc1 = 1.0f, perc2 = 1.0f; + float perc1 = 1.0f, perc2 = 1.0f; if ( mFlags & FX_SIZE2_LINEAR ) - { + { // calculate element biasing - perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) + perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) / (float)(mTimeEnd - mTimeStart); } @@ -1213,34 +1216,34 @@ void CCylinder::UpdateSize2() if (( mFlags & FX_SIZE2_PARM_MASK ) == FX_SIZE2_NONLINEAR ) { if ( theFxHelper.mTime > mSize2Parm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = 1.0f - (float)(theFxHelper.mTime - mSize2Parm) + perc2 = 1.0f - (float)(theFxHelper.mTime - mSize2Parm) / (float)(mTimeEnd - mSize2Parm); } if ( (mFlags & FX_SIZE2_LINEAR) ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } } else if (( mFlags & FX_SIZE2_PARM_MASK ) == FX_SIZE2_WAVE ) - { + { // wave gen, with parm being the frequency multiplier perc1 = perc1 * (float)cos( (theFxHelper.mTime - mTimeStart) * mSize2Parm ); } else if (( mFlags & FX_SIZE2_PARM_MASK ) == FX_SIZE2_CLAMP ) { if ( theFxHelper.mTime < mSize2Parm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = (float)(mSize2Parm - theFxHelper.mTime) + perc2 = (float)(mSize2Parm - theFxHelper.mTime) / (float)(mSize2Parm - mTimeStart); } else @@ -1249,12 +1252,12 @@ void CCylinder::UpdateSize2() } if ( mFlags & FX_SIZE2_LINEAR ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } @@ -1262,7 +1265,7 @@ void CCylinder::UpdateSize2() // If needed, RAND can coexist with linear and either non-linear or wave. if ( mFlags & FX_SIZE2_RAND ) - { + { // Random simply modulates the existing value perc1 = random() * perc1; } @@ -1278,7 +1281,7 @@ bool CCylinder::Update() { return false; } - + if ( mFlags & FX_RELATIVE ) { if ( mClientID < 0 || mClientID >= ENTITYNUM_WORLD ) @@ -1309,7 +1312,7 @@ bool CCylinder::Update() } VectorAdd(mOrigin1, mOrgOffset, mOrigin1); //add the offset to the bolt point - + VectorCopy( ax[0], mRefEnt.axis[0] ); //FIXME: should mNormal be a modifier on the forward axis? /* @@ -1363,7 +1366,7 @@ void CEmitter::Draw() if ( mFlags & FX_EMIT_FX ) { vec3_t org, v; - float ftime, time2, + float ftime, time2, step; int i, t, dif; @@ -1375,7 +1378,7 @@ void CEmitter::Draw() dif = 0; - for ( t = mOldTime; t <= theFxHelper.mTime; t += TRAIL_RATE ) + for ( t = mOldTime; t <= theFxHelper.mTime; t += TRAIL_RATE ) { dif += TRAIL_RATE; @@ -1387,17 +1390,17 @@ void CEmitter::Draw() time2 = ftime * ftime * 0.5f; // Predict the new position - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { org[i] = mOldOrigin[i] + ftime * v[i] + time2 * v[i]; } - + // Only perform physics if this object is tagged to do so if ( (mFlags & FX_APPLY_PHYSICS) ) { bool solid; - if ( (mFlags&FX_EXPENSIVE_PHYSICS) + if ( (mFlags&FX_EXPENSIVE_PHYSICS) && fx_expensivePhysics.integer ) { solid = true; // by setting this to true, we force a real trace to happen @@ -1431,7 +1434,7 @@ void CEmitter::Draw() // Is it time to draw an effect? if ( DistanceSquared( org, mOldOrigin ) >= step ) - { + { // Pick a new target step distance and square it step = mDensity + crandom() * mVariance; step *= step; @@ -1458,7 +1461,7 @@ bool CEmitter::Update() { return false; } - + //FIXME: Handle Relative and Bolted Effects /* if ( mFlags & FX_RELATIVE ) @@ -1523,7 +1526,7 @@ bool CLight::Update() { return false; } - + //FIXME: Handle Relative and Bolted Effects /* if ( mFlags & FX_RELATIVE ) @@ -1553,12 +1556,12 @@ bool CLight::Update() void CLight::UpdateSize() { // completely biased towards start if it doesn't get overridden - float perc1 = 1.0f, perc2 = 1.0f; + float perc1 = 1.0f, perc2 = 1.0f; if ( mFlags & FX_SIZE_LINEAR ) - { + { // calculate element biasing - perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) + perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) / (float)(mTimeEnd - mTimeStart); } @@ -1566,34 +1569,34 @@ void CLight::UpdateSize() if (( mFlags & FX_SIZE_PARM_MASK ) == FX_SIZE_NONLINEAR ) { if ( theFxHelper.mTime > mSizeParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = 1.0f - (float)(theFxHelper.mTime - mSizeParm) + perc2 = 1.0f - (float)(theFxHelper.mTime - mSizeParm) / (float)(mTimeEnd - mSizeParm); } if ( (mFlags & FX_SIZE_LINEAR) ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } } else if (( mFlags & FX_SIZE_PARM_MASK ) == FX_SIZE_WAVE ) - { + { // wave gen, with parm being the frequency multiplier perc1 = perc1 * (float)cos( (theFxHelper.mTime - mTimeStart) * mSizeParm ); } else if (( mFlags & FX_SIZE_PARM_MASK ) == FX_SIZE_CLAMP ) { if ( theFxHelper.mTime < mSizeParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = (float)(mSizeParm - theFxHelper.mTime) + perc2 = (float)(mSizeParm - theFxHelper.mTime) / (float)(mSizeParm - mTimeStart); } else @@ -1602,12 +1605,12 @@ void CLight::UpdateSize() } if ( mFlags & FX_SIZE_LINEAR ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } @@ -1615,7 +1618,7 @@ void CLight::UpdateSize() // If needed, RAND can coexist with linear and either non-linear or wave. if ( mFlags & FX_SIZE_RAND ) - { + { // Random simply modulates the existing value perc1 = random() * perc1; } @@ -1629,13 +1632,13 @@ void CLight::UpdateSize() void CLight::UpdateRGB() { // completely biased towards start if it doesn't get overridden - float perc1 = 1.0f, perc2 = 1.0f; + float perc1 = 1.0f, perc2 = 1.0f; vec3_t res; if ( mFlags & FX_RGB_LINEAR ) - { + { // calculate element biasing - perc1 = 1.0f - (float)( theFxHelper.mTime - mTimeStart ) + perc1 = 1.0f - (float)( theFxHelper.mTime - mTimeStart ) / (float)( mTimeEnd - mTimeStart ); } @@ -1643,34 +1646,34 @@ void CLight::UpdateRGB() if (( mFlags & FX_RGB_PARM_MASK ) == FX_RGB_NONLINEAR ) { if ( theFxHelper.mTime > mRGBParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = 1.0f - (float)( theFxHelper.mTime - mRGBParm ) + perc2 = 1.0f - (float)( theFxHelper.mTime - mRGBParm ) / (float)( mTimeEnd - mRGBParm ); } if ( mFlags & FX_RGB_LINEAR ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } } else if (( mFlags & FX_RGB_PARM_MASK ) == FX_RGB_WAVE ) - { + { // wave gen, with parm being the frequency multiplier perc1 = perc1 * (float)cos(( theFxHelper.mTime - mTimeStart ) * mRGBParm ); } else if (( mFlags & FX_RGB_PARM_MASK ) == FX_RGB_CLAMP ) { if ( theFxHelper.mTime < mRGBParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = (float)(mRGBParm - theFxHelper.mTime) + perc2 = (float)(mRGBParm - theFxHelper.mTime) / (float)(mRGBParm - mTimeStart); } else @@ -1679,12 +1682,12 @@ void CLight::UpdateRGB() } if ( mFlags & FX_RGB_LINEAR ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } @@ -1692,12 +1695,12 @@ void CLight::UpdateRGB() // If needed, RAND can coexist with linear and either non-linear or wave. if ( mFlags & FX_RGB_RAND ) - { + { // Random simply modulates the existing value perc1 = random() * perc1; } - // Now get the correct color + // Now get the correct color VectorScale( mRGBStart, perc1, res ); mRefEnt.lightingOrigin[0] = res[0] + ( 1.0f - perc1 ) * mRGBEnd[0]; @@ -1801,7 +1804,7 @@ bool CTrail::Update() { return false; } - + //FIXME: Handle Relative and Bolted Effects /* if ( mFlags & FX_RELATIVE ) @@ -1914,7 +1917,7 @@ void CPoly::CalcRotateMatrix() /*Pitch - aroundx Yaw - around z 1 0 0 c -s 0 -0 c -s s c 0 +0 c -s s c 0 0 s c 0 0 1 */ mRot[0][0] = cosZ; @@ -1931,7 +1934,7 @@ void CPoly::CalcRotateMatrix() Roll c 0 s - 0 1 0 + 0 1 0 -s 0 c */ mLastFrameTime = theFxHelper.mFrameTime; @@ -1962,8 +1965,8 @@ void CPoly::Rotate() //---------------------------- bool CPoly::Update() { - vec3_t mOldOrigin; - + vec3_t mOldOrigin = { 0.0f }; + //FIXME: Handle Relative and Bolted Effects /* if ( mFlags & FX_RELATIVE ) @@ -2080,7 +2083,7 @@ bool CBezier::Update( void ) ftime = cg.frametime * 0.001f; time2 = ftime * ftime * 0.5f; - for ( int i = 0; i < 3; i++ ) + for ( int i = 0; i < 3; i++ ) { mControl1[i] = mControl1[i] + ftime * mControl1Vel[i] + time2 * mControl1Vel[i]; mControl2[i] = mControl2[i] + ftime * mControl2Vel[i] + time2 * mControl2Vel[i]; @@ -2176,7 +2179,7 @@ inline void CBezier::DrawSegment( vec3_t start, vec3_t end, float texcoord1, flo const float BEZIER_RESOLUTION = 16.0f; //---------------------------- -void CBezier::Draw( void ) +void CBezier::Draw( void ) { vec3_t pos, old_pos; float mu, mum1; @@ -2211,7 +2214,7 @@ void CBezier::Draw( void ) pos[i] = mum13 * mOrigin1[i] + group1 * mControl1[i] + group2 * mControl2[i] + mu3 * mOrigin2[i]; } -// if ( m_flags & FXF_WRAP ) +// if ( m_flags & FXF_WRAP ) // { tc2 = mu * tex; // } @@ -2277,7 +2280,7 @@ void CFlash::Init( void ) } //---------------------------- -void CFlash::Draw( void ) +void CFlash::Draw( void ) { // Interestingly, if znear is set > than this, then the flash // doesn't appear at all. @@ -2296,14 +2299,14 @@ void CFlash::Draw( void ) mRefEnt.lightingOrigin[i] = 0.0f; } } - mRefEnt.shaderRGBA[0] = mRefEnt.lightingOrigin[0] * 255; - mRefEnt.shaderRGBA[1] = mRefEnt.lightingOrigin[1] * 255; - mRefEnt.shaderRGBA[2] = mRefEnt.lightingOrigin[2] * 255; + mRefEnt.shaderRGBA[0] = mRefEnt.lightingOrigin[0] * 255; + mRefEnt.shaderRGBA[1] = mRefEnt.lightingOrigin[1] * 255; + mRefEnt.shaderRGBA[2] = mRefEnt.lightingOrigin[2] * 255; mRefEnt.shaderRGBA[3] = 255; VectorCopy( cg.refdef.vieworg, mRefEnt.origin ); VectorMA( mRefEnt.origin, FLASH_DISTANCE_FROM_VIEWER, cg.refdef.viewaxis[0], mRefEnt.origin ); - + // This is assuming that the screen is wider than it is tall. mRefEnt.radius = FLASH_DISTANCE_FROM_VIEWER * tan (DEG2RAD (cg.refdef.fov_x * 0.5f)); diff --git a/code/cgame/FxPrimitives.h b/code/cgame/FxPrimitives.h index ab979a6e84..bc36af0af2 100644 --- a/code/cgame/FxPrimitives.h +++ b/code/cgame/FxPrimitives.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #if !defined(FX_SYSTEM_H_INC) #include "FxSystem.h" diff --git a/code/cgame/FxScheduler.cpp b/code/cgame/FxScheduler.cpp index 8315bafd0b..3135ced7dc 100644 --- a/code/cgame/FxScheduler.cpp +++ b/code/cgame/FxScheduler.cpp @@ -1,22 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this include must remain at the top of every CPP file #include "common_headers.h" @@ -45,7 +48,7 @@ CFxScheduler theFxScheduler; // don't even ask,. it's to do with loadsave... // -vector < sstring_t > g_vstrEffectsNeededPerSlot; +std::vector < sstring_t > g_vstrEffectsNeededPerSlot; SLoopedEffect gLoopedEffectArray[MAX_LOOPED_FX]; // must be in sync with CFxScheduler::mLoopedEffectArray void CFxScheduler::FX_CopeWithAnyLoadedSaveGames(void) { diff --git a/code/cgame/FxScheduler.h b/code/cgame/FxScheduler.h index 8180eb5f11..92ba692d55 100644 --- a/code/cgame/FxScheduler.h +++ b/code/cgame/FxScheduler.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #if !defined(FX_UTIL_H_INC) #include "FxUtil.h" @@ -27,9 +31,6 @@ typedef sstring_t fxString_t; #ifndef FX_SCHEDULER_H_INC #define FX_SCHEDULER_H_INC -using namespace std; - - #define FX_FILE_PATH "effects" #define FX_MAX_TRACE_DIST WORLD_SIZE @@ -78,7 +79,7 @@ class CMediaHandles { private: - vector mMediaList; + std::vector mMediaList; public: @@ -435,9 +436,9 @@ class CFxScheduler // this makes looking up the index based on the string name much easier - typedef map TEffectID; + typedef std::map TEffectID; - typedef list TScheduledEffect; + typedef std::list TScheduledEffect; // Effects SEffectTemplate mEffectTemplates[FX_MAX_EFFECTS]; diff --git a/code/cgame/FxSystem.cpp b/code/cgame/FxSystem.cpp index 7c106ec423..4e90d1d7ec 100644 --- a/code/cgame/FxSystem.cpp +++ b/code/cgame/FxSystem.cpp @@ -1,22 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this include must remain at the top of every FXxxxx.CPP file #include "common_headers.h" #if !defined(FX_SCHEDULER_H_INC) diff --git a/code/cgame/FxSystem.h b/code/cgame/FxSystem.h index 72426adb8c..b321d6c9c3 100644 --- a/code/cgame/FxSystem.h +++ b/code/cgame/FxSystem.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #if !defined(CG_LOCAL_H_INC) #include "cg_local.h" diff --git a/code/cgame/FxTemplate.cpp b/code/cgame/FxTemplate.cpp index f6fb5b2727..8e6f016e6d 100644 --- a/code/cgame/FxTemplate.cpp +++ b/code/cgame/FxTemplate.cpp @@ -1,22 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this include must remain at the top of every CPP file #include "common_headers.h" #if !defined(FX_SCHEDULER_H_INC) diff --git a/code/cgame/FxUtil.cpp b/code/cgame/FxUtil.cpp index 65e09c0555..ba932b372e 100644 --- a/code/cgame/FxUtil.cpp +++ b/code/cgame/FxUtil.cpp @@ -1,22 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this include must remain at the top of every CPP file #include "common_headers.h" #if !defined(FX_SCHEDULER_H_INC) diff --git a/code/cgame/FxUtil.h b/code/cgame/FxUtil.h index 6459a2f92f..7d6a26d126 100644 --- a/code/cgame/FxUtil.h +++ b/code/cgame/FxUtil.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #if !defined(FX_PRIMITIVES_H_INC) #include "FxPrimitives.h" diff --git a/code/cgame/animtable.h b/code/cgame/animtable.h index 9234dad19f..107c094d75 100644 --- a/code/cgame/animtable.h +++ b/code/cgame/animtable.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // special file included only by cg_players.cpp & ui_players.cpp // @@ -1599,7 +1604,9 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] = ENUM2STRING(BOTH_STAND_TO_KNEEL), ENUM2STRING(BOTH_KNEEL_TO_STAND), +#ifndef BASE_SAVE_COMPAT ENUM2STRING(BOTH_KNEELATTACK), +#endif ENUM2STRING(BOTH_TUSKENATTACK1), ENUM2STRING(BOTH_TUSKENATTACK2), diff --git a/code/cgame/cg_camera.cpp b/code/cgame/cg_camera.cpp index 39c7e3eb80..d191727b54 100644 --- a/code/cgame/cg_camera.cpp +++ b/code/cgame/cg_camera.cpp @@ -1,24 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //Client camera controls for cinematics -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" diff --git a/code/cgame/cg_camera.h b/code/cgame/cg_camera.h index 3c5152fda2..7cf0a1610a 100644 --- a/code/cgame/cg_camera.h +++ b/code/cgame/cg_camera.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #pragma once diff --git a/code/cgame/cg_consolecmds.cpp b/code/cgame/cg_consolecmds.cpp index 2b566165a1..b17f946095 100644 --- a/code/cgame/cg_consolecmds.cpp +++ b/code/cgame/cg_consolecmds.cpp @@ -1,25 +1,29 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_consolecmds.c -- text commands typed in at the local console, or // executed by a key binding -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" //just for cgs.... @@ -291,6 +295,7 @@ static const char *gcmds[] = { "give", "gloat", "god", + "invuse", "kill", "meditate", "nav", @@ -299,6 +304,7 @@ static const char *gcmds[] = { "npc", "playermodel", "playerteam", + "playertint", "runscript", "saber", "saberAttackCycle", diff --git a/code/cgame/cg_credits.cpp b/code/cgame/cg_credits.cpp index 9b818db03c..ca31908d3f 100644 --- a/code/cgame/cg_credits.cpp +++ b/code/cgame/cg_credits.cpp @@ -1,33 +1,33 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- cg_credits.cpp // // module for end credits code -// this line must stay at top so the whole PCH thing works... -// #include "cg_headers.h" #include "cg_media.h" -#define max(a,b) (((a) > (b)) ? (a) : (b)) - #define fCARD_FADESECONDS 1.0f // fade up time, also fade down time #define fCARD_SUSTAINSECONDS 2.0f // hold time before fade down #define fLINE_SECONDTOSCROLLUP 15.0f // how long one line takes to scroll up the screen @@ -42,7 +42,7 @@ vec4_t gv4Color = {0}; struct StringAndSize_t { int iStrLenPixels; - string str; + std::string str; StringAndSize_t() { @@ -86,7 +86,7 @@ struct CreditCard_t { int iTime; StringAndSize_t strTitle; - vector vstrText; + std::vector vstrText; CreditCard_t() { @@ -98,12 +98,12 @@ struct CreditLine_t { int iLine; StringAndSize_t strText; - vector vstrText; + std::vector vstrText; bool bDotted; }; -typedef list CreditLines_t; -typedef list CreditCards_t; +typedef std::list CreditLines_t; +typedef std::list CreditCards_t; struct CreditData_t { @@ -184,7 +184,7 @@ static const char *UpperCaseFirstLettersOnly(const char *psTest) return sTemp; } -static const char *GetSubString(string &strResult) +static const char *GetSubString(std::string &strResult) { static char sTemp[MAX_LINE_BYTES]; @@ -424,7 +424,7 @@ void CG_Credits_Init( const char *psStripReference, vec4_t *pv4Color) CreditLine.iLine = iLineNumber; CreditLine.bDotted = true; - string strResult(sLine); + std::string strResult(sLine); const char *p; while ((p=GetSubString(strResult)) != NULL) { @@ -467,7 +467,7 @@ void CG_Credits_Init( const char *psStripReference, vec4_t *pv4Color) { CreditCard_t CreditCard; - string strResult(sLine); + std::string strResult(sLine); const char *p; while ((p=GetSubString(strResult)) != NULL) { @@ -623,7 +623,7 @@ qboolean CG_Credits_Draw( void ) int iYpos = SCREEN_HEIGHT + (CreditLine.iLine * iFontHeight); iYpos-= (int) (fPixelsPerSecond * fSecondsElapsed); - int iTextLinesThisItem = max(CreditLine.vstrText.size(),1); + int iTextLinesThisItem = Q_max( (int)CreditLine.vstrText.size(), 1); if (iYpos + (iTextLinesThisItem * iFontHeight) < 0) { // scrolled off top of screen, so erase it... diff --git a/code/cgame/cg_draw.cpp b/code/cgame/cg_draw.cpp index 742fd28194..3be5a10b56 100644 --- a/code/cgame/cg_draw.cpp +++ b/code/cgame/cg_draw.cpp @@ -1,25 +1,29 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_draw.c -- draw all of the graphical elements during // active (after loading) gameplay -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" @@ -1643,18 +1647,205 @@ static void CG_DrawBatteryCharge( void ) } } +#define SimpleHud_DrawString( x, y, str, color ) cgi_R_Font_DrawString( x, y, str, color, (int)0x80000000 | cgs.media.qhFontSmall, -1, 1.0f ) + +static void CG_DrawSimpleSaberStyle( const centity_t *cent ) +{ + uint32_t calcColor; + char num[7] = { 0 }; + int weapX = 16; + + if ( !cent->currentState.weapon ) // We don't have a weapon right now + { + return; + } + + if ( cent->currentState.weapon != WP_SABER || !cent->gent ) + { + return; + } + + if ( !cg.saberAnimLevelPending && cent->gent && cent->gent->client ) + {//uninitialized after a loadgame, cheat across and get it + cg.saberAnimLevelPending = cent->gent->client->ps.saberAnimLevel; + } + + switch ( cg.saberAnimLevelPending ) + { + default: + case SS_FAST: + Com_sprintf( num, sizeof( num ), "FAST" ); + calcColor = CT_ICON_BLUE; + weapX = 0; + break; + case SS_MEDIUM: + Com_sprintf( num, sizeof( num ), "MEDIUM" ); + calcColor = CT_YELLOW; + break; + case SS_STRONG: + Com_sprintf( num, sizeof( num ), "STRONG" ); + calcColor = CT_HUD_RED; + break; + case SS_DESANN: + Com_sprintf( num, sizeof( num ), "DESANN" ); + calcColor = CT_HUD_RED; + break; + case SS_TAVION: + Com_sprintf( num, sizeof( num ), "TAVION" ); + calcColor = CT_ICON_BLUE; + break; + case SS_DUAL: + Com_sprintf( num, sizeof( num ), "AKIMBO" ); + calcColor = CT_HUD_ORANGE; + break; + case SS_STAFF: + Com_sprintf( num, sizeof( num ), "STAFF" ); + calcColor = CT_HUD_ORANGE; + break; + } + + SimpleHud_DrawString( SCREEN_WIDTH - (weapX + 16 + 32), (SCREEN_HEIGHT - 80) + 40, num, colorTable[calcColor] ); +} + +static void CG_DrawSimpleAmmo( const centity_t *cent ) +{ + playerState_t *ps; + uint32_t calcColor; + int currValue = 0; + char num[16] = { 0 }; + + if ( !cent->currentState.weapon ) // We don't have a weapon right now + { + return; + } + + ps = &cg.snap->ps; + + currValue = ps->ammo[weaponData[cent->currentState.weapon].ammoIndex]; + + // No ammo + if ( currValue < 0 || (weaponData[cent->currentState.weapon].energyPerShot == 0 && weaponData[cent->currentState.weapon].altEnergyPerShot == 0) ) + { + SimpleHud_DrawString( SCREEN_WIDTH - (16 + 32), (SCREEN_HEIGHT - 80) + 40, "--", colorTable[CT_HUD_ORANGE] ); + return; + } + + // + // ammo + // + if ( cg.oldammo < currValue ) + { + cg.oldAmmoTime = cg.time + 200; + } + + cg.oldammo = currValue; + + + // Determine the color of the numeric field + + // Firing or reloading? + if ( (cg.predicted_player_state.weaponstate == WEAPON_FIRING + && cg.predicted_player_state.weaponTime > 100) ) + { + calcColor = CT_LTGREY; + } + else + { + if ( currValue > 0 ) + { + if ( cg.oldAmmoTime > cg.time ) + { + calcColor = CT_YELLOW; + } + else + { + calcColor = CT_HUD_ORANGE; + } + } + else + { + calcColor = CT_RED; + } + } + + Com_sprintf( num, sizeof( num ), "%i", currValue ); + + SimpleHud_DrawString( SCREEN_WIDTH - (16 + 32), (SCREEN_HEIGHT - 80) + 40, num, colorTable[calcColor] ); +} + +static void CG_DrawSimpleForcePower( const centity_t *cent ) +{ + uint32_t calcColor; + char num[16] = { 0 }; + qboolean flash = qfalse; + + if ( !cent->gent || !cent->gent->client->ps.forcePowersKnown ) + { + return; + } + + // Make the hud flash by setting forceHUDTotalFlashTime above cg.time + if ( cg.forceHUDTotalFlashTime > cg.time ) + { + flash = qtrue; + if ( cg.forceHUDNextFlashTime < cg.time ) + { + cg.forceHUDNextFlashTime = cg.time + 400; + cgi_S_StartSound( NULL, 0, CHAN_AUTO, cgs.media.noforceSound ); + if ( cg.forceHUDActive ) + { + cg.forceHUDActive = qfalse; + } + else + { + cg.forceHUDActive = qtrue; + } + + } + } + else // turn HUD back on if it had just finished flashing time. + { + cg.forceHUDNextFlashTime = 0; + cg.forceHUDActive = qtrue; + } + + // Determine the color of the numeric field + calcColor = flash ? CT_RED : CT_ICON_BLUE; + + Com_sprintf( num, sizeof( num ), "%i", cent->gent->client->ps.forcePower ); + + SimpleHud_DrawString( SCREEN_WIDTH - (16 + 32), (SCREEN_HEIGHT - 80) + 40 + 14, num, colorTable[calcColor] ); +} + /* ================ CG_DrawHUD ================ */ -extern void *cgi_UI_GetMenuByName( const char *menu ); -extern void cgi_UI_Menu_Paint( void *menu, qboolean force ); static void CG_DrawHUD( centity_t *cent ) { int value; int sectionXPos,sectionYPos,sectionWidth,sectionHeight; + if ( cg_hudFiles.integer ) + { + int x = 0; + int y = SCREEN_HEIGHT - 80; + + SimpleHud_DrawString( x + 16, y + 40, va( "%i", cg.snap->ps.stats[STAT_HEALTH] ), colorTable[CT_HUD_RED] ); + + SimpleHud_DrawString( x + 18 + 14, y + 40 + 14, va( "%i", cg.snap->ps.stats[STAT_ARMOR] ), colorTable[CT_HUD_GREEN] ); + + CG_DrawSimpleForcePower( cent ); + + if ( cent->currentState.weapon == WP_SABER ) + CG_DrawSimpleSaberStyle( cent ); + else + CG_DrawSimpleAmmo( cent ); + + return; + } + // Draw the lower left section of the HUD if (cgi_UI_GetMenuInfo("lefthud",§ionXPos,§ionYPos,§ionWidth,§ionHeight)) { @@ -3923,6 +4114,11 @@ void CG_DrawIconBackground(void) qhandle_t background; const float shutdownTime = 130.0f; + if ( cg_hudFiles.integer ) + { //simple hud + return; + } + // Are we in zoom mode or the HUD is turned off? if (( cg.zoomMode != 0 ) || !( cg_drawHUD.integer )) { diff --git a/code/cgame/cg_drawtools.cpp b/code/cgame/cg_drawtools.cpp index 738928d3a8..28e1b8253b 100644 --- a/code/cgame/cg_drawtools.cpp +++ b/code/cgame/cg_drawtools.cpp @@ -1,22 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" diff --git a/code/cgame/cg_effects.cpp b/code/cgame/cg_effects.cpp index 55263e51e2..a5c5db574d 100644 --- a/code/cgame/cg_effects.cpp +++ b/code/cgame/cg_effects.cpp @@ -1,24 +1,28 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_effects.c -- these functions generate localentities -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" diff --git a/code/cgame/cg_ents.cpp b/code/cgame/cg_ents.cpp index b2698fb335..f6fde1971f 100644 --- a/code/cgame/cg_ents.cpp +++ b/code/cgame/cg_ents.cpp @@ -1,24 +1,28 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_ents.c -- present snapshot entities, happens every single frame -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" @@ -1118,7 +1122,57 @@ static void CG_Missile( centity_t *cent ) { VectorCopy( s1->angles, cent->lerpAngles ); } - if ( cent->gent->alt_fire ) + if ( s1->otherEntityNum2 && (g_vehWeaponInfo[s1->otherEntityNum2].iShotFX || g_vehWeaponInfo[s1->otherEntityNum2].iModel) ) + { + vec3_t forward; + + if (s1->eFlags & EF_USE_ANGLEDELTA) + { + AngleVectors(cent->currentState.angles, forward, 0, 0); + } + else + { + if ( VectorNormalize2( cent->gent->s.pos.trDelta, forward ) == 0.0f ) + { + if ( VectorNormalize2( s1->pos.trDelta, forward ) == 0.0f ) + { + forward[2] = 1.0f; + } + } + } + + // hack the scale of the forward vector if we were just fired or bounced...this will shorten up the tail for a split second so tails don't clip so harshly + int dif = cg.time - cent->gent->s.pos.trTime; + + if ( dif < 75 ) + { + if ( dif < 0 ) + { + dif = 0; + } + + float scale = ( dif / 75.0f ) * 0.95f + 0.05f; + + VectorScale( forward, scale, forward ); + } + + CG_PlayEffectID(g_vehWeaponInfo[s1->otherEntityNum2].iShotFX, cent->lerpOrigin, forward); + if ( g_vehWeaponInfo[s1->otherEntityNum2].iLoopSound ) + { + vec3_t velocity; + EvaluateTrajectoryDelta( ¢->currentState.pos, cg.time, velocity ); + if (cgs.sound_precache[g_vehWeaponInfo[s1->otherEntityNum2].iLoopSound] != NULL_SFX) + { + cgi_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, velocity, cgs.sound_precache[g_vehWeaponInfo[s1->otherEntityNum2].iLoopSound] ); + } + } + //add custom model + if ( !g_vehWeaponInfo[s1->otherEntityNum2].iModel ) + { + return; + } + } + else if ( cent->gent->alt_fire ) { // add trails if ( weapon->alt_missileTrailFunc ) @@ -1174,7 +1228,9 @@ Ghoul2 Insert End ent.skinNum = cg.clientFrame & 1; ent.renderfx = /*weapon->missileRenderfx | */RF_NOSHADOW; - if ( cent->gent->alt_fire ) + if ( s1->otherEntityNum2 && g_vehWeaponInfo[s1->otherEntityNum2].iModel && cgs.model_draw[g_vehWeaponInfo[s1->otherEntityNum2].iModel] != NULL_HANDLE) + ent.hModel = cgs.model_draw[g_vehWeaponInfo[s1->otherEntityNum2].iModel]; + else if ( cent->gent->alt_fire ) ent.hModel = weapon->alt_missileModel; else ent.hModel = weapon->missileModel; diff --git a/code/cgame/cg_event.cpp b/code/cgame/cg_event.cpp index afa923c473..41e0ea51f4 100644 --- a/code/cgame/cg_event.cpp +++ b/code/cgame/cg_event.cpp @@ -1,24 +1,28 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_event.c -- handle entity events at snapshot or playerstate transitions -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" @@ -91,11 +95,11 @@ void CG_ItemPickup( int itemNum, qboolean bHadItem ) { cg.itemPickupBlendTime = cg.time; if (bg_itemlist[itemNum].classname && bg_itemlist[itemNum].classname[0]) - { + { char text[1024], data[1024]; if (cgi_SP_GetStringTextString("SP_INGAME_PICKUPLINE",text, sizeof(text)) ) - { + { if ( cgi_SP_GetStringTextString( va("SP_INGAME_%s",bg_itemlist[itemNum].classname ), data, sizeof( data ))) { // Com_Printf("%s %s\n", text, data ); @@ -104,9 +108,9 @@ void CG_ItemPickup( int itemNum, qboolean bHadItem ) { } } } - + // see if it should be the grabbed weapon - if ( bg_itemlist[itemNum].giType == IT_WEAPON ) + if ( bg_itemlist[itemNum].giType == IT_WEAPON ) { const int nCurWpn = cg.predicted_player_state.weapon; const int nNewWpn = bg_itemlist[itemNum].giTag; @@ -179,7 +183,7 @@ void UseItem(int itemNum) cent = &cg_entities[cg.snap->ps.clientNum]; - switch ( itemNum ) + switch ( itemNum ) { case INV_ELECTROBINOCULARS: CG_ToggleBinoculars(); @@ -207,7 +211,7 @@ void UseItem(int itemNum) CG_UseForce =============== */ -static void CG_UseForce( centity_t *cent ) +static void CG_UseForce( centity_t *cent ) { //FIXME: sound or graphic change or something? //actual force power action is on game/pm side @@ -218,27 +222,27 @@ static void CG_UseForce( centity_t *cent ) CG_UseItem =============== */ -static void CG_UseItem( centity_t *cent ) +static void CG_UseItem( centity_t *cent ) { int itemNum; entityState_t *es; es = ¢->currentState; - + itemNum = cg.inventorySelect; - if ( itemNum < 0 || itemNum > INV_MAX ) + if ( itemNum < 0 || itemNum > INV_MAX ) { itemNum = 0; } // print a message if the local player - if ( es->number == cg.snap->ps.clientNum ) + if ( es->number == cg.snap->ps.clientNum ) { - if ( !itemNum ) + if ( !itemNum ) { // CG_CenterPrint( "No item to use", SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); - } - else + } + else { // item = BG_FindItemForHoldable( itemNum ); // CG_CenterPrint( va("Use %s", item->pickup_name), SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); @@ -322,12 +326,12 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { break; case EV_FALL_MEDIUM: DEBUGNAME("EV_FALL_MEDIUM"); - // use normal pain sound - - if ( g_entities[es->number].health <= 0 ) + // use normal pain sound - + if ( g_entities[es->number].health <= 0 ) {//dead cgi_S_StartSound( NULL, es->number, CHAN_AUTO, cgs.media.landSound ); } - else if ( g_entities[es->number].s.weapon == WP_SABER + else if ( g_entities[es->number].s.weapon == WP_SABER || (g_entities[es->number].client && (g_entities[es->number].client->ps.forcePowersKnown&(1<number, CHAN_BODY, "*land1.wav", CS_BASIC ); @@ -408,32 +412,32 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { DEBUGNAME("EV_LAVA_TOUCH"); cgi_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.lavaInSound ); break; - + case EV_LAVA_LEAVE: DEBUGNAME("EV_LAVA_LEAVE"); cgi_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.lavaOutSound ); break; - + case EV_LAVA_UNDER: DEBUGNAME("EV_LAVA_UNDER"); cgi_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.lavaUnSound ); break; - + case EV_WATER_TOUCH: DEBUGNAME("EV_WATER_TOUCH"); cgi_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.watrInSound ); break; - + case EV_WATER_LEAVE: DEBUGNAME("EV_WATER_LEAVE"); cgi_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.watrOutSound ); break; - + case EV_WATER_UNDER: DEBUGNAME("EV_WATER_UNDER"); cgi_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.watrUnSound ); break; - + case EV_WATER_CLEAR: DEBUGNAME("EV_WATER_CLEAR"); CG_TryPlayCustomSound(NULL, es->number, CHAN_AUTO, "*gasp.wav", CS_BASIC ); @@ -456,10 +460,10 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { gitem_t *item; int index; qboolean bHadItem = qfalse; - + index = es->eventParm; // player predicted - if ( (char)index < 0 ) + if ( (char)index < 0 ) { index = -(char)index; bHadItem = qtrue; @@ -532,7 +536,7 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { case EV_DISRUPTOR_MAIN_SHOT: DEBUGNAME("EV_DISRUPTOR_MAIN_SHOT"); - FX_DisruptorMainShot( cent->currentState.origin2, cent->lerpOrigin ); + FX_DisruptorMainShot( cent->currentState.origin2, cent->lerpOrigin ); break; case EV_DISRUPTOR_SNIPER_SHOT: @@ -561,7 +565,7 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { // case EV_POWERUP_SEEKER_FIRE: // DEBUGNAME("EV_POWERUP_SEEKER_FIRE"); -// CG_FireSeeker( cent ); +// CG_FireSeeker( cent ); // break; case EV_POWERUP_BATTLESUIT: @@ -577,11 +581,11 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { DEBUGNAME("EV_KOTHOS_BEAM"); if ( Q_irand( 0, 1 ) ) { - FX_KothosBeam( cg_entities[cent->currentState.otherEntityNum].gent->client->renderInfo.handRPoint, cg_entities[cent->currentState.otherEntityNum2].lerpOrigin ); + FX_KothosBeam( cg_entities[cent->currentState.otherEntityNum].gent->client->renderInfo.handRPoint, cg_entities[cent->currentState.otherEntityNum2].lerpOrigin ); } else { - FX_KothosBeam( cg_entities[cent->currentState.otherEntityNum].gent->client->renderInfo.handLPoint, cg_entities[cent->currentState.otherEntityNum2].lerpOrigin ); + FX_KothosBeam( cg_entities[cent->currentState.otherEntityNum].gent->client->renderInfo.handLPoint, cg_entities[cent->currentState.otherEntityNum2].lerpOrigin ); } break; //================================================================= @@ -608,7 +612,7 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { int disintLength = 0; qhandle_t disintSound1 = NULL_HANDLE; qhandle_t disintSound2 = NULL_HANDLE; - qhandle_t disintSound3 = NULL_HANDLE; + //qhandle_t disintSound3 = NULL_HANDLE; switch( disintPW ) { @@ -616,7 +620,7 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { disintEffect = EF_DISINTEGRATION;//ef_ disintSound1 = cgs.media.disintegrateSound;//with scream disintSound2 = cgs.media.disintegrate2Sound;//no scream - disintSound3 = cgs.media.disintegrate3Sound;//with inhuman scream + //disintSound3 = cgs.media.disintegrate3Sound;//with inhuman scream disintLength = 2000; makeNotSolid = qtrue; break; @@ -706,12 +710,24 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { case EV_MISSILE_HIT: DEBUGNAME("EV_MISSILE_HIT"); - CG_MissileHitPlayer( cent, es->weapon, position, cent->gent->pos1, cent->gent->alt_fire ); + if ( CG_VehicleWeaponImpact( cent ) ) + { + } + else + { + CG_MissileHitPlayer( cent, es->weapon, position, cent->gent->pos1, cent->gent->alt_fire ); + } break; case EV_MISSILE_MISS: DEBUGNAME("EV_MISSILE_MISS"); - CG_MissileHitWall( cent, es->weapon, position, cent->gent->pos1, cent->gent->alt_fire ); + if ( CG_VehicleWeaponImpact( cent ) ) + { + } + else + { + CG_MissileHitWall( cent, es->weapon, position, cent->gent->pos1, cent->gent->alt_fire ); + } break; case EV_BMODEL_SOUND: @@ -721,11 +737,11 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { case EV_GENERAL_SOUND: DEBUGNAME("EV_GENERAL_SOUND"); - if ( cgs.sound_precache[ es->eventParm ] ) + if ( cgs.sound_precache[ es->eventParm ] ) { cgi_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.sound_precache[ es->eventParm ] ); - } - else + } + else { s = CG_ConfigString( CS_SOUNDS + es->eventParm ); CG_TryPlayCustomSound(NULL, es->number, CHAN_AUTO, s, CS_BASIC ); @@ -1075,12 +1091,12 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { DEBUGNAME("EV_USE_INV_LIGHTAMP_GOGGLES"); UseItem(INV_LIGHTAMP_GOGGLES ); break; - + case EV_USE_INV_SENTRY: DEBUGNAME("EV_USE_INV_SENTRY"); UseItem(INV_SENTRY ); break; - + case EV_DEBUG_LINE: DEBUGNAME("EV_DEBUG_LINE"); CG_TestLine(position, es->origin2, es->time, (unsigned int)(es->time2), es->weapon); diff --git a/code/cgame/cg_headers.cpp b/code/cgame/cg_headers.cpp index 7266b2356d..d39130e306 100644 --- a/code/cgame/cg_headers.cpp +++ b/code/cgame/cg_headers.cpp @@ -1,21 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" diff --git a/code/cgame/cg_headers.h b/code/cgame/cg_headers.h index 382892e189..24ad1810d9 100644 --- a/code/cgame/cg_headers.h +++ b/code/cgame/cg_headers.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Precompiled header file for the client game diff --git a/code/cgame/cg_info.cpp b/code/cgame/cg_info.cpp index 5ea7a318c0..c36376c0ee 100644 --- a/code/cgame/cg_info.cpp +++ b/code/cgame/cg_info.cpp @@ -1,22 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" @@ -832,7 +836,8 @@ void CG_DrawInformation( void ) { else { CG_DrawLoadingScreen(levelshot, s); - cgi_UI_MenuPaintAll(); + cgi_UI_Menu_Paint( cgi_UI_GetMenuByName( "loadscreen" ), qtrue ); + //cgi_UI_MenuPaintAll(); } CG_LoadBar(); diff --git a/code/cgame/cg_lights.cpp b/code/cgame/cg_lights.cpp index c14712c64c..4891e135af 100644 --- a/code/cgame/cg_lights.cpp +++ b/code/cgame/cg_lights.cpp @@ -1,22 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" typedef struct clightstyle_s { @@ -82,7 +85,8 @@ void CG_RunLightStyles (void) ls->value[2] = ls->map[ofs%ls->length][2]; ls->value[3] = 255; //ls->map[ofs%ls->length][3]; } - trap_R_SetLightStyle(i, *(int*)ls->value); + const byteAlias_t *ba = (byteAlias_t *)&ls->value; + trap_R_SetLightStyle( i, ba->i ); } } diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index 4722f09077..1d4d1a84c9 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __CG_LOCAL_H__ #define __CG_LOCAL_H__ @@ -706,13 +711,11 @@ Ghoul2 Insert End #define CG_FORMATMASK 0x00000007 #define CG_SMALLFONT 0x00000010 #define CG_BIGFONT 0x00000020 // default -#define CG_GIANTFONT 0x00000040 + #define CG_DROPSHADOW 0x00000800 #define CG_BLINK 0x00001000 #define CG_INVERSE 0x00002000 #define CG_PULSE 0x00004000 -#define CG_UNDERLINE 0x00008000 -#define CG_TINYFONT 0x00010000 void CG_DrawRect( float x, float y, float width, float height, float size, const float *color ); @@ -1167,6 +1170,8 @@ void CG_MissileHitWall( centity_t *cent, int weapon, vec3_t origin, vec3_t dir, void CG_DrawTargetBeam( vec3_t start, vec3_t end, vec3_t norm, const char *beamFx, const char *impactFx ); +qboolean CG_VehicleWeaponImpact( centity_t *cent ); + /* Ghoul2 Insert Start @@ -1209,6 +1214,9 @@ void cgi_UI_MenuCloseAll(void); void cgi_UI_String_Init(void); int cgi_UI_GetMenuItemInfo(const char *menuFile,const char *itemName,int *x,int *y,int *w,int *h,vec4_t color,qhandle_t *background); int cgi_UI_GetMenuInfo(char *menuFile,int *x,int *y,int *w,int *h); +void cgi_UI_Menu_Paint( void *menu, qboolean force ); +void *cgi_UI_GetMenuByName( const char *menu ); + void SetWeaponSelectTime(void); diff --git a/code/cgame/cg_localents.cpp b/code/cgame/cg_localents.cpp index b008a87628..381933373d 100644 --- a/code/cgame/cg_localents.cpp +++ b/code/cgame/cg_localents.cpp @@ -1,25 +1,29 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_localents.c -- every frame, generate renderer commands for locally // processed entities, like smoke puffs, gibs, shells, etc. -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 4160e2216b..fb03e500b3 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "cg_media.h" #include "FxScheduler.h" @@ -24,7 +29,7 @@ This file is part of Jedi Academy. #include "../qcommon/sstring.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h -typedef map< sstring_t, unsigned char, less, allocator< unsigned char > > namePrecache_m; +typedef std::map< sstring_t, unsigned char > namePrecache_m; extern namePrecache_m *as_preCacheMap; extern void CG_RegisterNPCCustomSounds( clientInfo_t *ci ); extern qboolean G_AddSexToMunroString ( char *string, qboolean qDoBoth ); @@ -37,7 +42,7 @@ void CG_Shutdown( void ); int CG_GetCameraPos( vec3_t camerapos ); int CG_GetCameraAng( vec3_t cameraang ); void UseItem(int itemNum); -const char *CG_DisplayBoxedText(int iBoxX, int iBoxY, int iBoxWidth, int iBoxHeight, +const char *CG_DisplayBoxedText(int iBoxX, int iBoxY, int iBoxWidth, int iBoxHeight, const char *psText, int iFontHandle, float fScale, const vec4_t v4Color); @@ -386,7 +391,7 @@ static cvarTable_t cvarTable[] = { #ifndef FINAL_BUILD { &cg_gun_frame, "gun_frame", "0", CVAR_CHEAT }, { &cg_debugAnimTarget, "cg_debugAnimTarget", "0", CVAR_CHEAT }, -#endif +#endif { &cg_gun_x, "cg_gunX", "0", CVAR_ARCHIVE }, { &cg_gun_y, "cg_gunY", "0", CVAR_ARCHIVE }, { &cg_gun_z, "cg_gunZ", "0", CVAR_ARCHIVE }, @@ -410,7 +415,7 @@ static cvarTable_t cvarTable[] = { { &cg_thirdPersonVertOffset, "cg_thirdPersonVertOffset", "16", 0}, { &cg_thirdPersonCameraDamp, "cg_thirdPersonCameraDamp", "0.3", CVAR_ARCHIVE }, { &cg_thirdPersonTargetDamp, "cg_thirdPersonTargetDamp", "0.5", 0}, - + { &cg_thirdPersonHorzOffset, "cg_thirdPersonHorzOffset", "0", 0}, { &cg_thirdPersonAlpha, "cg_thirdPersonAlpha", "1.0", CVAR_ARCHIVE }, { &cg_thirdPersonAutoAlpha, "cg_thirdPersonAutoAlpha", "0", 0 }, @@ -426,8 +431,8 @@ static cvarTable_t cvarTable[] = { // but we also reference them here { &cg_paused, "cl_paused", "0", CVAR_ROM }, - { &cg_developer, "developer", "", 0 }, - { &cg_timescale, "timescale", "1", 0 }, + { &cg_developer, "developer", "", 0 }, + { &cg_timescale, "timescale", "1", 0 }, { &cg_skippingcin, "skippingCinematic", "0", CVAR_ROM}, { &cg_missionInfoFlashTime, "cg_missionInfoFlashTime", "10000", 0 }, { &cg_hudFiles, "cg_hudFiles", "ui/jahud.txt", CVAR_ARCHIVE}, @@ -482,9 +487,9 @@ void CG_UpdateCvars( void ) { } } -int CG_CrosshairPlayer( void ) +int CG_CrosshairPlayer( void ) { - if ( cg.time > ( cg.crosshairClientTime + 1000 ) ) + if ( cg.time > ( cg.crosshairClientTime + 1000 ) ) { return -1; } @@ -526,7 +531,7 @@ int CG_GetCameraPos( vec3_t camerapos ) { VectorCopy( cg.refdef.vieworg, camerapos ); return 1; } - else if (cg.snap && (cg.snap->ps.weapon == WP_SABER||cg.snap->ps.weapon == WP_MELEE) )//implied: !cg.renderingThirdPerson + else if (cg.snap && (cg.snap->ps.weapon == WP_SABER||cg.snap->ps.weapon == WP_MELEE) )//implied: !cg.renderingThirdPerson {//first person saber hack VectorCopy( cg.refdef.vieworg, camerapos ); return 1; @@ -534,9 +539,9 @@ int CG_GetCameraPos( vec3_t camerapos ) { return 0; } -int CG_GetCameraAng( vec3_t cameraang ) +int CG_GetCameraAng( vec3_t cameraang ) { - if ( in_camera) + if ( in_camera) { VectorCopy(client_camera.angles, cameraang); return 1; @@ -618,7 +623,7 @@ void CG_RegisterItemSounds( int itemNum ) { len = s-start; if (len >= MAX_QPATH || len < 5) { - CG_Error( "PrecacheItem: %s has bad precache string", + CG_Error( "PrecacheItem: %s has bad precache string", item->classname); return; } @@ -704,7 +709,7 @@ static void CG_RegisterSounds( void ) { cgs.media.messageLitSound = cgi_S_RegisterSound( "sound/interface/update" ); cgs.media.noforceSound = cgi_S_RegisterSound( "sound/weapons/force/noforce" ); - + cgs.media.watrInSound = cgi_S_RegisterSound ("sound/player/watr_in.wav"); cgs.media.watrOutSound = cgi_S_RegisterSound ("sound/player/watr_out.wav"); cgs.media.watrUnSound = cgi_S_RegisterSound ("sound/player/watr_un.wav"); @@ -844,7 +849,7 @@ CG_RegisterClientSkin qboolean CG_RegisterClientSkin( clientInfo_t *ci, const char *headModelName, const char *headSkinName, const char *torsoModelName, const char *torsoSkinName, - const char *legsModelName, const char *legsSkinName) + const char *legsModelName, const char *legsSkinName) { char hfilename[MAX_QPATH]; char tfilename[MAX_QPATH]; @@ -894,7 +899,7 @@ CG_RegisterClientModelname qboolean CG_RegisterClientModelname( clientInfo_t *ci, const char *headModelName, const char *headSkinName, const char *torsoModelName, const char *torsoSkinName, - const char *legsModelName, const char *legsSkinName ) + const char *legsModelName, const char *legsSkinName ) { /* Ghoul2 Insert Start @@ -909,7 +914,7 @@ Ghoul2 Insert Start } Com_sprintf( filename, sizeof( filename ), "models/players/%s/lower.mdr", legsModelName ); ci->legsModel = cgi_R_RegisterModel( filename ); - if ( !ci->legsModel ) + if ( !ci->legsModel ) {//he's not skeletal, try the old way Com_sprintf( filename, sizeof( filename ), "models/players/%s/lower.md3", legsModelName ); ci->legsModel = cgi_R_RegisterModel( filename ); @@ -924,11 +929,11 @@ Ghoul2 Insert Start {//You are trying to set one Com_sprintf( filename, sizeof( filename ), "models/players/%s/upper.mdr", torsoModelName ); ci->torsoModel = cgi_R_RegisterModel( filename ); - if ( !ci->torsoModel ) + if ( !ci->torsoModel ) {//he's not skeletal, try the old way Com_sprintf( filename, sizeof( filename ), "models/players/%s/upper.md3", torsoModelName ); ci->torsoModel = cgi_R_RegisterModel( filename ); - if ( !ci->torsoModel ) + if ( !ci->torsoModel ) { Com_Printf( S_COLOR_RED"Failed to load model file %s\n", filename ); return qfalse; @@ -944,7 +949,7 @@ Ghoul2 Insert Start {//You are trying to set one Com_sprintf( filename, sizeof( filename ), "models/players/%s/head.md3", headModelName ); ci->headModel = cgi_R_RegisterModel( filename ); - if ( !ci->headModel ) + if ( !ci->headModel ) { Com_Printf( S_COLOR_RED"Failed to load model file %s\n", filename ); return qfalse; @@ -957,7 +962,7 @@ Ghoul2 Insert Start // if any skins failed to load, return failure - if ( !CG_RegisterClientSkin( ci, headModelName, headSkinName, torsoModelName, torsoSkinName, legsModelName, legsSkinName ) ) + if ( !CG_RegisterClientSkin( ci, headModelName, headSkinName, torsoModelName, torsoSkinName, legsModelName, legsSkinName ) ) { //Com_Printf( "Failed to load skin file: %s : %s/%s : %s/%s : %s\n", headModelName, headSkinName, torsoModelName, torsoSkinName, legsModelName, legsSkinName ); return qfalse; @@ -966,7 +971,7 @@ Ghoul2 Insert Start //FIXME: for now, uses the legs model dir for anim cfg, but should we set this in some sort of NPCs.cfg? // load the animation file set ci->animFileIndex = G_ParseAnimFileSet(legsModelName); - if (ci->animFileIndex<0) + if (ci->animFileIndex<0) { Com_Printf( S_COLOR_RED"Failed to load animation file set models/players/%s\n", legsModelName ); return qfalse; @@ -997,12 +1002,12 @@ void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri) Q_strncpyz( legsModelName, ri->legsModelName, sizeof( legsModelName ) ); //Legs skin slash = strchr( legsModelName, '/' ); - if ( !slash ) + if ( !slash ) { // modelName didn not include a skin name Q_strncpyz( legsSkinName, "default", sizeof( legsSkinName ) ); - } - else + } + else { Q_strncpyz( legsSkinName, slash + 1, sizeof( legsSkinName ) ); // truncate modelName @@ -1014,12 +1019,12 @@ void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri) Q_strncpyz( torsoModelName, ri->torsoModelName, sizeof( torsoModelName ) ); //Torso skin slash = strchr( torsoModelName, '/' ); - if ( !slash ) + if ( !slash ) { // modelName didn't include a skin name Q_strncpyz( torsoSkinName, "default", sizeof( torsoSkinName ) ); - } - else + } + else { Q_strncpyz( torsoSkinName, slash + 1, sizeof( torsoSkinName ) ); // truncate modelName @@ -1037,12 +1042,12 @@ void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri) Q_strncpyz( headModelName, ri->headModelName, sizeof( headModelName ) ); //Head skin slash = strchr( headModelName, '/' ); - if ( !slash ) + if ( !slash ) { // modelName didn not include a skin name Q_strncpyz( headSkinName, "default", sizeof( headSkinName ) ); - } - else + } + else { Q_strncpyz( headSkinName, slash + 1, sizeof( headSkinName ) ); // truncate modelName @@ -1054,9 +1059,9 @@ void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri) headModelName[0] = 0; } - if ( !CG_RegisterClientModelname( ci, headModelName, headSkinName, torsoModelName, torsoSkinName, legsModelName, legsSkinName) ) + if ( !CG_RegisterClientModelname( ci, headModelName, headSkinName, torsoModelName, torsoSkinName, legsModelName, legsSkinName) ) { - if ( !CG_RegisterClientModelname( ci, DEFAULT_HEADMODEL, "default", DEFAULT_TORSOMODEL, "default", DEFAULT_LEGSMODEL, "default" ) ) + if ( !CG_RegisterClientModelname( ci, DEFAULT_HEADMODEL, "default", DEFAULT_TORSOMODEL, "default", DEFAULT_LEGSMODEL, "default" ) ) { CG_Error( "DEFAULT_MODELS failed to register"); } @@ -1065,7 +1070,7 @@ void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri) //------------------------------------- // CG_RegisterEffects -// +// // Handles precaching all effect files // and any shader, model, or sound // files an effect may use. @@ -1080,11 +1085,11 @@ static void CG_RegisterEffects( void ) int i, numFailed=0; // Register external effects - for ( i = 1 ; i < MAX_FX ; i++ ) + for ( i = 1 ; i < MAX_FX ; i++ ) { effectName = ( char *)CG_ConfigString( CS_EFFECTS + i ); - if ( !effectName[0] ) + if ( !effectName[0] ) { break; } @@ -1102,11 +1107,11 @@ static void CG_RegisterEffects( void ) } // Start world effects - for ( i = 1 ; i < MAX_WORLD_FX ; i++ ) + for ( i = 1 ; i < MAX_WORLD_FX ; i++ ) { effectName = ( char *)CG_ConfigString( CS_WORLD_FX + i ); - if ( !effectName[0] ) + if ( !effectName[0] ) { break; } @@ -1186,44 +1191,44 @@ void CG_RegisterClientModels (int entityNum) //=================================================================================== -HUDMenuItem_t forceTics[] = +HUDMenuItem_t forceTics[] = { - { "rightHUD", "force_tic1", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top - { "rightHUD", "force_tic2", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top - { "rightHUD", "force_tic3", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top - { "rightHUD", "force_tic4", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top + { "rightHUD", "force_tic1", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top + { "rightHUD", "force_tic2", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top + { "rightHUD", "force_tic3", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top + { "rightHUD", "force_tic4", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top }; -HUDMenuItem_t ammoTics[] = +HUDMenuItem_t ammoTics[] = { - { "rightHUD", "ammo_tic1", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top - { "rightHUD", "ammo_tic2", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top - { "rightHUD", "ammo_tic3", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top - { "rightHUD", "ammo_tic4", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top + { "rightHUD", "ammo_tic1", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top + { "rightHUD", "ammo_tic2", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top + { "rightHUD", "ammo_tic3", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top + { "rightHUD", "ammo_tic4", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top }; -HUDMenuItem_t armorTics[] = +HUDMenuItem_t armorTics[] = { - { "leftHUD", "armor_tic1", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top - { "leftHUD", "armor_tic2", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, - { "leftHUD", "armor_tic3", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, - { "leftHUD", "armor_tic4", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, + { "leftHUD", "armor_tic1", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top + { "leftHUD", "armor_tic2", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, + { "leftHUD", "armor_tic3", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, + { "leftHUD", "armor_tic4", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, }; -HUDMenuItem_t healthTics[] = +HUDMenuItem_t healthTics[] = { - { "leftHUD", "health_tic1", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top - { "leftHUD", "health_tic2", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // - { "leftHUD", "health_tic3", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // + { "leftHUD", "health_tic1", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Top + { "leftHUD", "health_tic2", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // + { "leftHUD", "health_tic3", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // { "leftHUD", "health_tic4", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // Bottom }; -HUDMenuItem_t otherHUDBits[] = +HUDMenuItem_t otherHUDBits[] = { { "lefthud", "healthamount", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // OHB_HEALTHAMOUNT { "lefthud", "armoramount", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // OHB_ARMORAMOUNT - { "righthud", "forceamount", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // OHB_FORCEAMOUNT + { "righthud", "forceamount", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // OHB_FORCEAMOUNT { "righthud", "ammoamount", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // OHB_AMMOAMOUNT { "righthud", "saberstyle_strong", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // OHB_SABERSTYLE_STRONG { "righthud", "saberstyle_medium", 0, 0, 0, 0, { 0.0f, 0.0f, 0.0f, 0.0f }, NULL_HANDLE }, // OHB_SABERSTYLE_MEDIUM @@ -1376,7 +1381,7 @@ static void CG_RegisterGraphics( void ) { cg.loadLCARSStage = 5; CG_LoadingString( "game media models" ); - + // Chunk models //FIXME: jfm:? bother to conditionally load these if an ent has this material type? for ( i = 0; i < NUM_CHUNK_MODELS; i++ ) @@ -1490,7 +1495,7 @@ static void CG_RegisterGraphics( void ) { Q_strncpyz(items, CG_ConfigString(CS_ITEMS), sizeof(items)); for ( i = 1 ; i < bg_numItems ; i++ ) { - if ( items[ i ] == '1' ) + if ( items[ i ] == '1' ) { if (bg_itemlist[i].classname) { @@ -1594,7 +1599,7 @@ Ghoul2 Insert Start Ghoul2 Insert End */ - for (i=0 ; istartTime = cg.time; ex->endTime = ex->startTime + 51; VectorCopy( origin, ex->refEntity.origin ); - + ex->refEntity.customShader = cgi_R_RegisterShader( "gfx/misc/nav_node" ); float scale = 16.0f; @@ -2208,7 +2213,7 @@ void CG_DrawNode( vec3_t origin, int type ) ex->color[2] = 0; break; } - + ex->radius = scale; } @@ -2229,7 +2234,7 @@ void CG_DrawRadius( vec3_t origin, unsigned int radius, int type ) ex->startTime = cg.time; ex->endTime = ex->startTime + 51; VectorCopy( origin, ex->refEntity.origin ); - + ex->refEntity.customShader = cgi_R_RegisterShader( "gfx/misc/nav_radius" ); switch ( type ) @@ -2269,7 +2274,7 @@ CG_DrawEdge void CG_DrawEdge( vec3_t start, vec3_t end, int type ) { switch ( type ) - { + { // NAVIGATION EDGES BETWEEN POINTS //===================================== case EDGE_NORMAL: @@ -2281,7 +2286,7 @@ void CG_DrawEdge( vec3_t start, vec3_t end, int type ) { FX_AddLine( start, end, 8.0f, 15.0f, 0.0f, 0.5f, 0.5f, 51, cgi_R_RegisterShader( "gfx/misc/nav_line" ), 0 ); } - break; + break; case EDGE_BLOCKED: { vec3_t color = { 255, 0, 0 }; // RED @@ -2333,7 +2338,7 @@ void CG_DrawEdge( vec3_t start, vec3_t end, int type ) - // NEAREST NAV + // NEAREST NAV //===================================== case EDGE_NEARESTVALID: { @@ -2359,7 +2364,7 @@ void CG_DrawEdge( vec3_t start, vec3_t end, int type ) } break; case EDGE_CELL_EMPTY: - { + { vec3_t color = { 255, 0, 0 }; // RED FX_AddLine( -1, start, end, 1.0f, 1.0f, 0, 1.0f, 1.0f, FX_ALPHA_LINEAR, color, color, 0, 51, cgi_R_RegisterShader( "gfx/misc/whiteline2" ), 0, 0 ); } @@ -2467,7 +2472,7 @@ void CG_DrawCombatPoint( vec3_t origin, int type ) ex->radius = 8; ex->endTime = ex->startTime + 51; VectorCopy( origin, ex->refEntity.origin ); - + ex->refEntity.customShader = cgi_R_RegisterShader( "gfx/misc/nav_cpoint" ); ex->color[0] = 255; @@ -2516,7 +2521,7 @@ void CG_DrawAlert( vec3_t origin, float rating ) // new hud stuff ( mission pack ) // ============================== // -qboolean CG_Asset_Parse(const char **p) +qboolean CG_Asset_Parse(const char **p) { const char *token; const char *tempStr; @@ -2529,12 +2534,12 @@ qboolean CG_Asset_Parse(const char **p) return qfalse; } - if (Q_stricmp(token, "{") != 0) + if (Q_stricmp(token, "{") != 0) { return qfalse; } - - while ( 1 ) + + while ( 1 ) { token = COM_ParseExt(p, qtrue); if (!token) @@ -2542,13 +2547,13 @@ qboolean CG_Asset_Parse(const char **p) return qfalse; } - if (Q_stricmp(token, "}") == 0) + if (Q_stricmp(token, "}") == 0) { return qtrue; } // font - if (Q_stricmp(token, "font") == 0) + if (Q_stricmp(token, "font") == 0) { /* int pointSize; @@ -2556,7 +2561,7 @@ qboolean CG_Asset_Parse(const char **p) cgi_UI_Parse_String(tempStr); cgi_UI_Parse_Int(&pointSize); - if (!tempStr || !pointSize) + if (!tempStr || !pointSize) { return qfalse; } @@ -2566,9 +2571,9 @@ qboolean CG_Asset_Parse(const char **p) } // smallFont - if (Q_stricmp(token, "smallFont") == 0) + if (Q_stricmp(token, "smallFont") == 0) { - if (!COM_ParseString(p, &tempStr) || !COM_ParseInt(p, &pointSize)) + if (!COM_ParseString(p, &tempStr) || !COM_ParseInt(p, &pointSize)) { return qfalse; } @@ -2577,9 +2582,9 @@ qboolean CG_Asset_Parse(const char **p) } // smallFont - because the HUD file needs it for MP. - if (Q_stricmp(token, "small2Font") == 0) + if (Q_stricmp(token, "small2Font") == 0) { - if (!COM_ParseString(p, &tempStr) || !COM_ParseInt(p, &pointSize)) + if (!COM_ParseString(p, &tempStr) || !COM_ParseInt(p, &pointSize)) { return qfalse; } @@ -2588,10 +2593,10 @@ qboolean CG_Asset_Parse(const char **p) } // font - if (Q_stricmp(token, "bigfont") == 0) + if (Q_stricmp(token, "bigfont") == 0) { int pointSize; - if (!COM_ParseString(p, &tempStr) || !COM_ParseInt(p, &pointSize)) + if (!COM_ParseString(p, &tempStr) || !COM_ParseInt(p, &pointSize)) { return qfalse; } @@ -2600,9 +2605,9 @@ qboolean CG_Asset_Parse(const char **p) } // gradientbar - if (Q_stricmp(token, "gradientbar") == 0) + if (Q_stricmp(token, "gradientbar") == 0) { - if (!COM_ParseString(p, &tempStr)) + if (!COM_ParseString(p, &tempStr)) { return qfalse; } @@ -2611,9 +2616,9 @@ qboolean CG_Asset_Parse(const char **p) } // enterMenuSound - if (Q_stricmp(token, "menuEnterSound") == 0) + if (Q_stricmp(token, "menuEnterSound") == 0) { - if (!COM_ParseString(p, &tempStr)) + if (!COM_ParseString(p, &tempStr)) { return qfalse; } @@ -2622,9 +2627,9 @@ qboolean CG_Asset_Parse(const char **p) } // exitMenuSound - if (Q_stricmp(token, "menuExitSound") == 0) + if (Q_stricmp(token, "menuExitSound") == 0) { - if (!COM_ParseString(p, &tempStr)) + if (!COM_ParseString(p, &tempStr)) { return qfalse; } @@ -2633,9 +2638,9 @@ qboolean CG_Asset_Parse(const char **p) } // itemFocusSound - if (Q_stricmp(token, "itemFocusSound") == 0) + if (Q_stricmp(token, "itemFocusSound") == 0) { - if (!COM_ParseString(p, &tempStr)) + if (!COM_ParseString(p, &tempStr)) { return qfalse; } @@ -2644,9 +2649,9 @@ qboolean CG_Asset_Parse(const char **p) } // menuBuzzSound - if (Q_stricmp(token, "menuBuzzSound") == 0) + if (Q_stricmp(token, "menuBuzzSound") == 0) { - if (!COM_ParseString(p, &tempStr)) + if (!COM_ParseString(p, &tempStr)) { return qfalse; } @@ -2654,9 +2659,9 @@ qboolean CG_Asset_Parse(const char **p) continue; } - if (Q_stricmp(token, "cursor") == 0) + if (Q_stricmp(token, "cursor") == 0) { -// if (!COM_ParseString(p, &cgDC.Assets.cursorStr)) +// if (!COM_ParseString(p, &cgDC.Assets.cursorStr)) // { // return qfalse; // } @@ -2664,55 +2669,55 @@ qboolean CG_Asset_Parse(const char **p) continue; } - if (Q_stricmp(token, "fadeClamp") == 0) + if (Q_stricmp(token, "fadeClamp") == 0) { -// if (!COM_ParseFloat(p, &cgDC.Assets.fadeClamp)) +// if (!COM_ParseFloat(p, &cgDC.Assets.fadeClamp)) // { // return qfalse; // } continue; } - if (Q_stricmp(token, "fadeCycle") == 0) + if (Q_stricmp(token, "fadeCycle") == 0) { -// if (!COM_ParseInt(p, &cgDC.Assets.fadeCycle)) +// if (!COM_ParseInt(p, &cgDC.Assets.fadeCycle)) // { // return qfalse; // } continue; } - if (Q_stricmp(token, "fadeAmount") == 0) + if (Q_stricmp(token, "fadeAmount") == 0) { -// if (!COM_ParseFloat(p, &cgDC.Assets.fadeAmount)) +// if (!COM_ParseFloat(p, &cgDC.Assets.fadeAmount)) // { // return qfalse; // } continue; } - if (Q_stricmp(token, "shadowX") == 0) + if (Q_stricmp(token, "shadowX") == 0) { -// if (!COM_ParseFloat(p, &cgDC.Assets.shadowX)) +// if (!COM_ParseFloat(p, &cgDC.Assets.shadowX)) // { // return qfalse; // } continue; } - if (Q_stricmp(token, "shadowY") == 0) + if (Q_stricmp(token, "shadowY") == 0) { -// if (!COM_ParseFloat(p, &cgDC.Assets.shadowY)) +// if (!COM_ParseFloat(p, &cgDC.Assets.shadowY)) // { // return qfalse; // } continue; } - if (Q_stricmp(token, "shadowColor") == 0) + if (Q_stricmp(token, "shadowColor") == 0) { /* - if (!PC_Color_Parse(handle, &cgDC.Assets.shadowColor)) + if (!PC_Color_Parse(handle, &cgDC.Assets.shadowColor)) { return qfalse; } @@ -2731,7 +2736,7 @@ void cgi_UI_EndParseSession(char *buf); CG_ParseMenu(); ================= */ -void CG_ParseMenu(const char *menuFile) +void CG_ParseMenu(const char *menuFile) { char *token; int result; @@ -2754,7 +2759,7 @@ void CG_ParseMenu(const char *menuFile) } p = buf; - while ( 1 ) + while ( 1 ) { cgi_UI_ParseExt(&token); @@ -2773,19 +2778,19 @@ void CG_ParseMenu(const char *menuFile) // break; //} -// if ( *token == '}' ) +// if ( *token == '}' ) // { // break; // } - if (Q_stricmp(token, "assetGlobalDef") == 0) + if (Q_stricmp(token, "assetGlobalDef") == 0) { /* - if (CG_Asset_Parse(handle)) + if (CG_Asset_Parse(handle)) { continue; - } - else + } + else { break; } @@ -2793,7 +2798,7 @@ void CG_ParseMenu(const char *menuFile) } - if (Q_stricmp(token, "menudef") == 0) + if (Q_stricmp(token, "menudef") == 0) { // start a new menu cgi_UI_Menu_New(p); @@ -2810,33 +2815,33 @@ CG_Load_Menu(); ================= */ -qboolean CG_Load_Menu( const char **p) +qboolean CG_Load_Menu( const char **p) { const char *token; token = COM_ParseExt(p, qtrue); - if (token[0] != '{') + if (token[0] != '{') { return qfalse; } - while ( 1 ) + while ( 1 ) { token = COM_ParseExt(p, qtrue); - - if (Q_stricmp(token, "}") == 0) + + if (Q_stricmp(token, "}") == 0) { return qtrue; } - if ( !token || token[0] == 0 ) + if ( !token || token[0] == 0 ) { return qfalse; } - CG_ParseMenu(token); + CG_ParseMenu(token); } return qfalse; } @@ -2847,28 +2852,32 @@ CG_LoadMenus(); ================= */ -void CG_LoadMenus(const char *menuFile) +void CG_LoadMenus(const char *menuFile) { const char *token; const char *p; - int len, start; + int len/*, start*/; fileHandle_t f; char buf[MAX_MENUDEFFILE]; - start = cgi_Milliseconds(); + //start = cgi_Milliseconds(); len = cgi_FS_FOpenFile( menuFile, &f, FS_READ ); - if ( !f ) + if ( !f ) { - CG_Printf( "hud menu file not found: %s, using default\n", menuFile ); + if ( Q_isanumber( menuFile ) ) // cg_hudFiles 1 + CG_Printf( S_COLOR_GREEN "hud menu file skipped, using default\n" ); + else + CG_Printf( S_COLOR_YELLOW "hud menu file not found: %s, using default\n", menuFile ); + len = cgi_FS_FOpenFile( "ui/jahud.txt", &f, FS_READ ); - if (!f) + if (!f) { cgi_Error( S_COLOR_RED "default menu file not found: ui/hud.txt, unable to continue!\n" ); } } - if ( len >= MAX_MENUDEFFILE ) + if ( len >= MAX_MENUDEFFILE ) { cgi_FS_FCloseFile( f ); cgi_Error( va( S_COLOR_RED "menu file too large: %s is %i, max allowed is %i", menuFile, len, MAX_MENUDEFFILE ) ); @@ -2878,7 +2887,7 @@ void CG_LoadMenus(const char *menuFile) cgi_FS_Read( buf, len, f ); buf[len] = 0; cgi_FS_FCloseFile( f ); - + // COM_Compress(buf); // cgi_UI_Menu_Reset(); @@ -2886,27 +2895,26 @@ void CG_LoadMenus(const char *menuFile) p = buf; COM_BeginParseSession(); - while ( 1 ) + while ( 1 ) { token = COM_ParseExt( &p, qtrue ); - if( !token || token[0] == 0 || token[0] == '}') + if( !token || token[0] == 0 || token[0] == '}') { break; } - if ( Q_stricmp( token, "}" ) == 0 ) + if ( Q_stricmp( token, "}" ) == 0 ) { break; } - if (Q_stricmp(token, "loadmenu") == 0) + if (Q_stricmp(token, "loadmenu") == 0) { - int menuLoad = CG_Load_Menu(&p); - if (menuLoad) + if (CG_Load_Menu(&p)) { continue; - } - else + } + else { break; } @@ -2923,7 +2931,7 @@ CG_LoadHudMenu(); ================= */ -void CG_LoadHudMenu(void) +void CG_LoadHudMenu(void) { const char *hudSet; /* @@ -2937,7 +2945,7 @@ void CG_LoadHudMenu(void) cgDC.registerModel = &trap_R_RegisterModel; cgDC.modelBounds = &trap_R_ModelBounds; cgDC.fillRect = &CG_FillRect; - cgDC.drawRect = &CG_DrawRect; + cgDC.drawRect = &CG_DrawRect; cgDC.drawSides = &CG_DrawSides; cgDC.drawTopBottom = &CG_DrawTopBottom; cgDC.clearScene = &trap_R_ClearScene; @@ -2959,8 +2967,8 @@ void CG_LoadHudMenu(void) cgDC.feederItemImage = &CG_FeederItemImage; cgDC.feederItemText = &CG_FeederItemText; cgDC.feederSelection = &CG_FeederSelection; - cgDC.Error = &Com_Error; - cgDC.Print = &Com_Printf; + cgDC.Error = &Com_Error; + cgDC.Print = &Com_Printf; cgDC.ownerDrawWidth = &CG_OwnerDrawWidth; cgDC.registerSound = &trap_S_RegisterSound; cgDC.startBackgroundTrack = &trap_S_StartBackgroundTrack; @@ -2969,15 +2977,15 @@ void CG_LoadHudMenu(void) cgDC.stopCinematic = &CG_StopCinematic; cgDC.drawCinematic = &CG_DrawCinematic; cgDC.runCinematicFrame = &CG_RunCinematicFrame; -*/ +*/ // Init_Display(&cgDC); // cgi_UI_String_Init(); // cgi_UI_Menu_Reset(); - + hudSet = cg_hudFiles.string; - if (hudSet[0] == '\0') + if (hudSet[0] == '\0') { hudSet = "ui/jahud.txt"; } @@ -2999,7 +3007,7 @@ INVENTORY SELECTION CG_InventorySelectable =============== */ -static inline qboolean CG_InventorySelectable( int index) +static inline qboolean CG_InventorySelectable( int index) { if (cg.snap->ps.inventory[index]) // Is there any in the inventory? { @@ -3035,28 +3043,28 @@ static inline void SetInventoryTime(void) CG_DPPrevInventory_f =============== */ -void CG_DPPrevInventory_f( void ) +void CG_DPPrevInventory_f( void ) { int i; - if ( !cg.snap ) + if ( !cg.snap ) { return; } const int original = cg.DataPadInventorySelect; - for ( i = 0 ; i < INV_MAX ; i++ ) + for ( i = 0 ; i < INV_MAX ; i++ ) { cg.DataPadInventorySelect--; if ((cg.DataPadInventorySelect < INV_ELECTROBINOCULARS) || (cg.DataPadInventorySelect >= INV_MAX)) - { - cg.DataPadInventorySelect = (INV_MAX - 1); + { + cg.DataPadInventorySelect = (INV_MAX - 1); } - + if ( CG_InventorySelectable( cg.DataPadInventorySelect ) ) - { + { return; } } @@ -3068,28 +3076,28 @@ void CG_DPPrevInventory_f( void ) CG_DPNextInventory_f =============== */ -void CG_DPNextInventory_f( void ) +void CG_DPNextInventory_f( void ) { int i; - if ( !cg.snap ) + if ( !cg.snap ) { return; } const int original = cg.DataPadInventorySelect; - for ( i = 0 ; i < INV_MAX ; i++ ) + for ( i = 0 ; i < INV_MAX ; i++ ) { cg.DataPadInventorySelect++; if ((cg.DataPadInventorySelect < INV_ELECTROBINOCULARS) || (cg.DataPadInventorySelect >= INV_MAX)) - { - cg.DataPadInventorySelect = INV_ELECTROBINOCULARS; + { + cg.DataPadInventorySelect = INV_ELECTROBINOCULARS; } - if ( CG_InventorySelectable( cg.DataPadInventorySelect ) && (inv_icons[cg.DataPadInventorySelect])) - { + if ( CG_InventorySelectable( cg.DataPadInventorySelect ) && (inv_icons[cg.DataPadInventorySelect])) + { return; } } @@ -3102,19 +3110,19 @@ void CG_DPNextInventory_f( void ) CG_NextInventory_f =============== */ -void CG_NextInventory_f( void ) +void CG_NextInventory_f( void ) { int i; float *color; - if ( !cg.snap ) + if ( !cg.snap ) { return; } // The first time it's been hit so just show inventory but don't advance in inventory. - color = CG_FadeColor( cg.inventorySelectTime, WEAPON_SELECT_TIME ); - if ( !color ) + color = CG_FadeColor( cg.inventorySelectTime, WEAPON_SELECT_TIME ); + if ( !color ) { SetInventoryTime(); return; @@ -3122,17 +3130,17 @@ void CG_NextInventory_f( void ) const int original = cg.inventorySelect; - for ( i = 0 ; i < INV_MAX ; i++ ) + for ( i = 0 ; i < INV_MAX ; i++ ) { cg.inventorySelect++; if ((cg.inventorySelect < INV_ELECTROBINOCULARS) || (cg.inventorySelect >= INV_MAX)) - { - cg.inventorySelect = INV_ELECTROBINOCULARS; + { + cg.inventorySelect = INV_ELECTROBINOCULARS; } - if ( CG_InventorySelectable( cg.inventorySelect ) && (inv_icons[cg.inventorySelect])) - { + if ( CG_InventorySelectable( cg.inventorySelect ) && (inv_icons[cg.inventorySelect])) + { cgi_S_StartSound (NULL, 0, CHAN_AUTO, cgs.media.selectSound2 ); SetInventoryTime(); return; @@ -3156,19 +3164,19 @@ this func was moved to Cmd_UseInventory_f in g_cmds.cpp CG_PrevInventory_f =============== */ -void CG_PrevInventory_f( void ) +void CG_PrevInventory_f( void ) { int i; float *color; - if ( !cg.snap ) + if ( !cg.snap ) { return; } // The first time it's been hit so just show inventory but don't advance in inventory. - color = CG_FadeColor( cg.inventorySelectTime, WEAPON_SELECT_TIME ); - if ( !color ) + color = CG_FadeColor( cg.inventorySelectTime, WEAPON_SELECT_TIME ); + if ( !color ) { SetInventoryTime(); return; @@ -3176,17 +3184,17 @@ void CG_PrevInventory_f( void ) const int original = cg.inventorySelect; - for ( i = 0 ; i < INV_MAX ; i++ ) + for ( i = 0 ; i < INV_MAX ; i++ ) { cg.inventorySelect--; if ((cg.inventorySelect < INV_ELECTROBINOCULARS) || (cg.inventorySelect >= INV_MAX)) - { - cg.inventorySelect = (INV_MAX - 1); + { + cg.inventorySelect = (INV_MAX - 1); } - - if ( CG_InventorySelectable( cg.inventorySelect ) && (inv_icons[cg.inventorySelect])) - { + + if ( CG_InventorySelectable( cg.inventorySelect ) && (inv_icons[cg.inventorySelect])) + { cgi_S_StartSound (NULL, 0, CHAN_AUTO, cgs.media.selectSound2 ); SetInventoryTime(); return; @@ -3206,7 +3214,7 @@ gitem_t *FindInventoryItemTag(int tag) { int i; - for ( i = 1 ; i < bg_numItems ; i++ ) + for ( i = 1 ; i < bg_numItems ; i++ ) { if ( bg_itemlist[i].giTag == tag && bg_itemlist[i].giType == IT_HOLDABLE ) // I guess giTag's aren't unique amongst items..must also make sure it's a holdable { @@ -3225,21 +3233,21 @@ gitem_t *FindInventoryItemTag(int tag) CG_DrawInventorySelect =================== */ -void CG_DrawInventorySelect( void ) +void CG_DrawInventorySelect( void ) { int i; int holdCount,iconCnt; int sideLeftIconCnt,sideRightIconCnt; int count; int holdX; - int height; + //int height; // int tag; float addX; vec4_t textColor = { .312f, .75f, .621f, 1.0f }; char text[1024]={0}; // don't display if dead - if ( cg.predicted_player_state.stats[STAT_HEALTH] <= 0 || ( cg.snap->ps.viewEntity > 0 && cg.snap->ps.viewEntity < ENTITYNUM_WORLD )) + if ( cg.predicted_player_state.stats[STAT_HEALTH] <= 0 || ( cg.snap->ps.viewEntity > 0 && cg.snap->ps.viewEntity < ENTITYNUM_WORLD )) { return; } @@ -3262,9 +3270,9 @@ void CG_DrawInventorySelect( void ) // count the number of items owned count = 0; - for ( i = 0 ; i < INV_MAX ; i++ ) + for ( i = 0 ; i < INV_MAX ; i++ ) { - if (CG_InventorySelectable(i) && inv_icons[i]) + if (CG_InventorySelectable(i) && inv_icons[i]) { count++; } @@ -3273,7 +3281,7 @@ void CG_DrawInventorySelect( void ) if (!count) { cgi_SP_GetStringTextString("SP_INGAME_EMPTY_INV",text, sizeof(text) ); - int w = cgi_R_Font_StrLenPixels( text, cgs.media.qhFontSmall, 1.0f ); + int w = cgi_R_Font_StrLenPixels( text, cgs.media.qhFontSmall, 1.0f ); int x = ( SCREEN_WIDTH - w ) / 2; CG_DrawProportionalString(x, y2 + 22, text, CG_CENTER | CG_SMALLFONT, colorTable[CT_ICON_BLUE]); return; @@ -3315,7 +3323,7 @@ void CG_DrawInventorySelect( void ) // Left side ICONS // Work backwards from current icon holdX = x - ((bigIconSize/2) + pad + smallIconSize); - height = smallIconSize * cg.iconHUDPercent; + //height = smallIconSize * cg.iconHUDPercent; addX = (float) smallIconSize * .75; for (iconCnt=0;iconCntps.inventory[i], 6, 12, + CG_DrawNumField (holdX + addX, y + smallIconSize, 2, cg.snap->ps.inventory[i], 6, 12, NUM_FONT_SMALL,qfalse); holdX -= (smallIconSize+pad); @@ -3346,14 +3354,14 @@ void CG_DrawInventorySelect( void ) } // Current Center Icon - height = bigIconSize * cg.iconHUDPercent; + //height = bigIconSize * cg.iconHUDPercent; if (inv_icons[cg.inventorySelect]) { cgi_R_SetColor(NULL); CG_DrawPic( x-(bigIconSize/2), (y-((bigIconSize-smallIconSize)/2))+10, bigIconSize, bigIconSize, inv_icons[cg.inventorySelect] ); addX = (float) bigIconSize * .75; cgi_R_SetColor(colorTable[CT_ICON_BLUE]); - CG_DrawNumField ((x-(bigIconSize/2)) + addX, y, 2, cg.snap->ps.inventory[cg.inventorySelect], 6, 12, + CG_DrawNumField ((x-(bigIconSize/2)) + addX, y, 2, cg.snap->ps.inventory[cg.inventorySelect], 6, 12, NUM_FONT_SMALL,qfalse); if (inv_names[cg.inventorySelect]) @@ -3366,10 +3374,10 @@ void CG_DrawInventorySelect( void ) char itemName[256], data[1024]; // FIXME: do these really need to be this large?? does it matter? Com_sprintf( itemName, sizeof(itemName), "SP_INGAME_%s", item->classname ); - + if ( cgi_SP_GetStringTextString( itemName, data, sizeof( data ))) { - int w = cgi_R_Font_StrLenPixels( data, cgs.media.qhFontSmall, 1.0f ); + int w = cgi_R_Font_StrLenPixels( data, cgs.media.qhFontSmall, 1.0f ); int x = ( SCREEN_WIDTH - w ) / 2; cgi_R_Font_DrawString( x, (SCREEN_HEIGHT - 24), data, textColor, cgs.media.qhFontSmall, -1, 1.0f); @@ -3387,7 +3395,7 @@ void CG_DrawInventorySelect( void ) // Right side ICONS // Work forwards from current icon holdX = x + (bigIconSize/2) + pad; - height = smallIconSize * cg.iconHUDPercent; + //height = smallIconSize * cg.iconHUDPercent; addX = (float) smallIconSize * .75; for (iconCnt=0;iconCntps.inventory[i], 6, 12, + CG_DrawNumField (holdX + addX, y + smallIconSize, 2, cg.snap->ps.inventory[i], 6, 12, NUM_FONT_SMALL,qfalse); holdX += (smallIconSize+pad); @@ -3419,7 +3427,7 @@ void CG_DrawInventorySelect( void ) int cgi_UI_GetItemText(char *menuFile,char *itemName, char *text); -const char *inventoryDesc[15] = +const char *inventoryDesc[15] = { "NEURO_SAAV_DESC", "BACTA_DESC", @@ -3436,14 +3444,14 @@ const char *inventoryDesc[15] = CG_DrawDataPadInventorySelect =================== */ -void CG_DrawDataPadInventorySelect( void ) +void CG_DrawDataPadInventorySelect( void ) { int i; int holdCount,iconCnt; int sideLeftIconCnt,sideRightIconCnt; int count; int holdX; - int height; + //int height; float addX; char text[1024]={0}; vec4_t textColor = { .312f, .75f, .621f, 1.0f }; @@ -3451,9 +3459,9 @@ void CG_DrawDataPadInventorySelect( void ) // count the number of items owned count = 0; - for ( i = 0 ; i < INV_MAX ; i++ ) + for ( i = 0 ; i < INV_MAX ; i++ ) { - if (CG_InventorySelectable(i) && inv_icons[i]) + if (CG_InventorySelectable(i) && inv_icons[i]) { count++; } @@ -3463,7 +3471,7 @@ void CG_DrawDataPadInventorySelect( void ) if (!count) { cgi_SP_GetStringTextString("SP_INGAME_EMPTY_INV",text, sizeof(text) ); - int w = cgi_R_Font_StrLenPixels( text, cgs.media.qhFontSmall, 1.0f ); + int w = cgi_R_Font_StrLenPixels( text, cgs.media.qhFontSmall, 1.0f ); int x = ( SCREEN_WIDTH - w ) / 2; CG_DrawProportionalString(x, 300 + 22, text, CG_CENTER | CG_SMALLFONT, colorTable[CT_ICON_BLUE]); return; @@ -3508,7 +3516,7 @@ void CG_DrawDataPadInventorySelect( void ) // Left side ICONS // Work backwards from current icon holdX = centerXPos - ((bigIconSize/2) + bigPad + smallIconSize); - height = smallIconSize * cg.iconHUDPercent; + //height = smallIconSize * cg.iconHUDPercent; addX = (float) smallIconSize * .75; for (iconCnt=0;iconCntps.inventory[i], 6, 12, + CG_DrawNumField (holdX + addX, graphicYPos + smallIconSize, 2, cg.snap->ps.inventory[i], 6, 12, NUM_FONT_SMALL,qfalse); holdX -= (smallIconSize+pad); @@ -3539,14 +3547,14 @@ void CG_DrawDataPadInventorySelect( void ) } // Current Center Icon - height = bigIconSize * cg.iconHUDPercent; + //height = bigIconSize * cg.iconHUDPercent; if (inv_icons[cg.DataPadInventorySelect]) { cgi_R_SetColor(colorTable[CT_WHITE]); CG_DrawPic( centerXPos-(bigIconSize/2), (graphicYPos-((bigIconSize-smallIconSize)/2))+10, bigIconSize, bigIconSize, inv_icons[cg.DataPadInventorySelect] ); addX = (float) bigIconSize * .75; cgi_R_SetColor(colorTable[CT_ICON_BLUE]); - CG_DrawNumField ((centerXPos-(bigIconSize/2)) + addX, graphicYPos, 2, cg.snap->ps.inventory[cg.DataPadInventorySelect], 6, 12, + CG_DrawNumField ((centerXPos-(bigIconSize/2)) + addX, graphicYPos, 2, cg.snap->ps.inventory[cg.DataPadInventorySelect], 6, 12, NUM_FONT_SMALL,qfalse); } @@ -3560,7 +3568,7 @@ void CG_DrawDataPadInventorySelect( void ) // Right side ICONS // Work forwards from current icon holdX = centerXPos + (bigIconSize/2) + bigPad; - height = smallIconSize * cg.iconHUDPercent; + //height = smallIconSize * cg.iconHUDPercent; addX = (float) smallIconSize * .75; for (iconCnt=0;iconCntps.inventory[i], 6, 12, + CG_DrawNumField (holdX + addX, graphicYPos + smallIconSize, 2, cg.snap->ps.inventory[i], 6, 12, NUM_FONT_SMALL,qfalse); holdX += (smallIconSize+pad); @@ -3599,7 +3607,7 @@ void CG_DrawDataPadInventorySelect( void ) CG_DisplayBoxedText(70,50,500,300,text, cgs.media.qhFontSmall, 0.7f, - textColor + textColor ); } } @@ -3625,7 +3633,7 @@ void SetForcePowerTime(void) } } -int showPowers[MAX_SHOWPOWERS] = +int showPowers[MAX_SHOWPOWERS] = { FP_ABSORB, FP_HEAL, @@ -3643,7 +3651,7 @@ int showPowers[MAX_SHOWPOWERS] = FP_GRIP, }; -const char *showPowersName[MAX_SHOWPOWERS] = +const char *showPowersName[MAX_SHOWPOWERS] = { "SP_INGAME_ABSORB2", "SP_INGAME_HEAL2", @@ -3662,7 +3670,7 @@ const char *showPowersName[MAX_SHOWPOWERS] = }; // Keep these with groups light side, core, and dark side -int showDataPadPowers[MAX_DPSHOWPOWERS] = +int showDataPadPowers[MAX_DPSHOWPOWERS] = { // Light side FP_ABSORB, @@ -3698,7 +3706,7 @@ qboolean ForcePower_Valid(int index) assert (MAX_SHOWPOWERS == ( sizeof(showPowers)/sizeof(showPowers[0]) )); assert (index < MAX_SHOWPOWERS ); //is this a valid index? - if (player->client->ps.forcePowersKnown & (1 << showPowers[index]) && + if (player->client->ps.forcePowersKnown & (1 << showPowers[index]) && player->client->ps.forcePowerLevel[showPowers[index]]) // Does he have the force power? { return qtrue; @@ -3712,11 +3720,11 @@ qboolean ForcePower_Valid(int index) CG_NextForcePower_f =============== */ -void CG_NextForcePower_f( void ) +void CG_NextForcePower_f( void ) { int i; - if ( !cg.snap || in_camera ) + if ( !cg.snap || in_camera ) { return; } @@ -3730,13 +3738,13 @@ void CG_NextForcePower_f( void ) const int original = cg.forcepowerSelect; - for ( i = 0; i < MAX_SHOWPOWERS; i++ ) + for ( i = 0; i < MAX_SHOWPOWERS; i++ ) { cg.forcepowerSelect++; if (cg.forcepowerSelect >= MAX_SHOWPOWERS) - { - cg.forcepowerSelect = 0; + { + cg.forcepowerSelect = 0; } if (ForcePower_Valid(cg.forcepowerSelect)) // Does he have the force power? @@ -3754,11 +3762,11 @@ void CG_NextForcePower_f( void ) CG_PrevForcePower_f =============== */ -void CG_PrevForcePower_f( void ) +void CG_PrevForcePower_f( void ) { int i; - if ( !cg.snap || in_camera ) + if ( !cg.snap || in_camera ) { return; } @@ -3772,13 +3780,13 @@ void CG_PrevForcePower_f( void ) const int original = cg.forcepowerSelect; - for ( i = 0; i < MAX_SHOWPOWERS; i++ ) + for ( i = 0; i < MAX_SHOWPOWERS; i++ ) { cg.forcepowerSelect--; if (cg.forcepowerSelect < 0) - { - cg.forcepowerSelect = MAX_SHOWPOWERS - 1; + { + cg.forcepowerSelect = MAX_SHOWPOWERS - 1; } if (ForcePower_Valid(cg.forcepowerSelect)) // Does he have the force power? @@ -3797,7 +3805,7 @@ void CG_PrevForcePower_f( void ) CG_DrawForceSelect =================== */ -void CG_DrawForceSelect( void ) +void CG_DrawForceSelect( void ) { int i; int count; @@ -3809,7 +3817,7 @@ void CG_DrawForceSelect( void ) // don't display if dead - if ( cg.predicted_player_state.stats[STAT_HEALTH] <= 0 || ( cg.snap->ps.viewEntity > 0 && cg.snap->ps.viewEntity < ENTITYNUM_WORLD )) + if ( cg.predicted_player_state.stats[STAT_HEALTH] <= 0 || ( cg.snap->ps.viewEntity > 0 && cg.snap->ps.viewEntity < ENTITYNUM_WORLD )) { return; } @@ -3899,7 +3907,7 @@ void CG_DrawForceSelect( void ) if (force_icons[showPowers[i]]) { - CG_DrawPic( holdX, y + yOffset, smallIconSize, smallIconSize, force_icons[showPowers[i]] ); + CG_DrawPic( holdX, y + yOffset, smallIconSize, smallIconSize, force_icons[showPowers[i]] ); holdX -= (smallIconSize+pad); } } @@ -3943,7 +3951,7 @@ void CG_DrawForceSelect( void ) // This only a temp solution. if (cgi_SP_GetStringTextString( showPowersName[cg.forcepowerSelect], text, sizeof(text) )) { - int w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 1.0f); + int w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 1.0f); int x = ( SCREEN_WIDTH - w ) / 2; cgi_R_Font_DrawString(x, (SCREEN_HEIGHT - 24) + yOffset, text, colorTable[CT_ICON_BLUE], cgs.media.qhFontSmall, -1, 1.0f); } @@ -3959,7 +3967,7 @@ qboolean ForcePowerDataPad_Valid(int index) gentity_t *player = &g_entities[0]; assert (index < MAX_DPSHOWPOWERS); - if (player->client->ps.forcePowersKnown & (1 << showDataPadPowers[index]) && + if (player->client->ps.forcePowersKnown & (1 << showDataPadPowers[index]) && player->client->ps.forcePowerLevel[showDataPadPowers[index]]) // Does he have the force power? { return qtrue; @@ -3973,25 +3981,25 @@ qboolean ForcePowerDataPad_Valid(int index) CG_DPNextForcePower_f =============== */ -void CG_DPNextForcePower_f( void ) +void CG_DPNextForcePower_f( void ) { int i; int original; - if ( !cg.snap ) + if ( !cg.snap ) { return; } original = cg.DataPadforcepowerSelect; - for ( i = 0; i= MAX_DPSHOWPOWERS) - { - cg.DataPadforcepowerSelect = 0; + { + cg.DataPadforcepowerSelect = 0; } if (ForcePowerDataPad_Valid(cg.DataPadforcepowerSelect)) // Does he have the force power? @@ -4008,25 +4016,25 @@ void CG_DPNextForcePower_f( void ) CG_DPPrevForcePower_f =============== */ -void CG_DPPrevForcePower_f( void ) +void CG_DPPrevForcePower_f( void ) { int i; int original; - if ( !cg.snap ) + if ( !cg.snap ) { return; } original = cg.DataPadforcepowerSelect; - for ( i = 0; i. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_marks.c -- wall marks -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" @@ -126,9 +130,9 @@ passed to the renderer. #define MAX_MARK_FRAGMENTS 128 #define MAX_MARK_POINTS 384 -void CG_ImpactMark( qhandle_t markShader, const vec3_t origin, const vec3_t dir, - float orientation, float red, float green, float blue, float alpha, - qboolean alphaFade, float radius, qboolean temporary ) { +void CG_ImpactMark( qhandle_t markShader, const vec3_t origin, const vec3_t dir, float orientation, float red, + float green, float blue, float alpha, qboolean alphaFade, float radius, qboolean temporary ) +{ vec3_t axis[3]; float texCoordScale; vec3_t originalPoints[4]; @@ -185,14 +189,16 @@ void CG_ImpactMark( qhandle_t markShader, const vec3_t origin, const vec3_t dir, mf->numPoints = MAX_VERTS_ON_POLY; } for ( j = 0, v = verts ; j < mf->numPoints ; j++, v++ ) { - vec3_t delta; + vec3_t delta; VectorCopy( markPoints[mf->firstPoint + j], v->xyz ); VectorSubtract( v->xyz, origin, delta ); - v->st[0] = 0.5 + DotProduct( delta, axis[1] ) * texCoordScale; - v->st[1] = 0.5 + DotProduct( delta, axis[2] ) * texCoordScale; - *(int *)v->modulate = *(int *)colors; + v->st[0] = 0.5f + DotProduct( delta, axis[1] ) * texCoordScale; + v->st[1] = 0.5f + DotProduct( delta, axis[2] ) * texCoordScale; + for ( int k = 0; k < 4; k++ ) { + v->modulate[k] = colors[k]; + } } // if it is a temporary (shadow) mark, add it immediately and forget about it @@ -255,7 +261,7 @@ void CG_AddMarks( void ) { mp->verts[j].modulate[3] = fade; } } - else + else { float f = (float)t / MARK_FADE_TIME; for ( j = 0 ; j < mp->poly.numVerts ; j++ ) { diff --git a/code/cgame/cg_media.h b/code/cgame/cg_media.h index 6813c5e325..6e045f3187 100644 --- a/code/cgame/cg_media.h +++ b/code/cgame/cg_media.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __CG_MEDIA_H_ #define __CG_MEDIA_H_ @@ -81,7 +86,7 @@ extern HUDMenuItem_t forceTics[]; extern HUDMenuItem_t otherHUDBits[]; -typedef enum +typedef enum { OHB_HEALTHAMOUNT = 0, OHB_ARMORAMOUNT, @@ -99,7 +104,7 @@ typedef enum #define NUM_CHUNK_MODELS 4 -enum +enum { CHUNK_METAL1 = 0, CHUNK_METAL2, @@ -256,7 +261,6 @@ typedef struct { // sounds sfxHandle_t disintegrateSound; sfxHandle_t disintegrate2Sound; - sfxHandle_t disintegrate3Sound; sfxHandle_t grenadeBounce1; sfxHandle_t grenadeBounce2; @@ -264,7 +268,7 @@ typedef struct { sfxHandle_t flechetteStickSound; sfxHandle_t detPackStickSound; sfxHandle_t tripMineStickSound; - + sfxHandle_t selectSound; sfxHandle_t selectSound2; sfxHandle_t overchargeSlowSound; @@ -277,7 +281,7 @@ typedef struct { // sfxHandle_t talkSound; sfxHandle_t noAmmoSound; - + sfxHandle_t landSound; sfxHandle_t rollSound; sfxHandle_t messageLitSound; @@ -299,7 +303,7 @@ typedef struct { sfxHandle_t zoomLoop; sfxHandle_t zoomEnd; sfxHandle_t disruptorZoomLoop; - + //new stuff for Jedi Academy sfxHandle_t drainSound; @@ -372,7 +376,7 @@ typedef struct { glconfig_t glconfig; // rendering configuration int serverCommandSequence; // reliable command stream counter - + // parsed from serverinfo int dmflags; int teamflags; diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index 2c120e5313..5430b8a05f 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -1,22 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #define CG_PLAYERS_CPP @@ -46,7 +50,7 @@ taken from the entityState_t //rww - generic function for applying a shader to the skin. extern vmCvar_t cg_g2Marks; -void CG_AddGhoul2Mark(int type, float size, vec3_t hitloc, vec3_t hitdirection, +void CG_AddGhoul2Mark(int type, float size, vec3_t hitloc, vec3_t hitdirection, int entnum, vec3_t entposition, float entangle, CGhoul2Info_v &ghoul2, vec3_t modelScale, int lifeTime, int firstModel, vec3_t uaxis ) { if ( !cg_g2Marks.integer ) @@ -72,7 +76,7 @@ void CG_AddGhoul2Mark(int type, float size, vec3_t hitloc, vec3_t hitdirection, } goreSkin.fadeRGB = true; //fade on RGB and alpha instead of just alpha (not needed for all shaders, but whatever) */ - + goreSkin.currentTime = cg.time; goreSkin.entNum = entnum; goreSkin.SSize = size; @@ -119,8 +123,8 @@ void CG_AddGhoul2Mark(int type, float size, vec3_t hitloc, vec3_t hitdirection, gi.G2API_AddSkinGore(ghoul2,goreSkin); } -qboolean CG_RegisterClientModelname( clientInfo_t *ci, const char *headModelName, const char *headSkinName, - const char *torsoModelName, const char *torsoSkinName, +qboolean CG_RegisterClientModelname( clientInfo_t *ci, const char *headModelName, const char *headSkinName, + const char *torsoModelName, const char *torsoSkinName, const char *legsModelName, const char *legsSkinName ); static void CG_PlayerFootsteps( centity_t *const cent, footstepType_t footStepType ); @@ -139,7 +143,7 @@ extern qboolean PM_SuperBreakWinAnim( int anim ); //Basic set of custom sounds that everyone needs // (keep numbers in ascending order in order for variant-capping to work) -const char *cg_customBasicSoundNames[MAX_CUSTOM_BASIC_SOUNDS] = +const char *cg_customBasicSoundNames[MAX_CUSTOM_BASIC_SOUNDS] = { "*death1.wav", "*death2.wav", @@ -159,7 +163,7 @@ const char *cg_customBasicSoundNames[MAX_CUSTOM_BASIC_SOUNDS] = //Used as a supplement to the basic set for enemies and hazard team // (keep numbers in ascending order in order for variant-capping to work) -const char *cg_customCombatSoundNames[MAX_CUSTOM_COMBAT_SOUNDS] = +const char *cg_customCombatSoundNames[MAX_CUSTOM_COMBAT_SOUNDS] = { "*anger1.wav", //Say when acquire an enemy when didn't have one before "*anger2.wav", @@ -182,7 +186,7 @@ const char *cg_customCombatSoundNames[MAX_CUSTOM_COMBAT_SOUNDS] = //Used as a supplement to the basic set for stormtroopers // (keep numbers in ascending order in order for variant-capping to work) -const char *cg_customExtraSoundNames[MAX_CUSTOM_EXTRA_SOUNDS] = +const char *cg_customExtraSoundNames[MAX_CUSTOM_EXTRA_SOUNDS] = { "*chase1.wav", "*chase2.wav", @@ -224,7 +228,7 @@ const char *cg_customExtraSoundNames[MAX_CUSTOM_EXTRA_SOUNDS] = //Used as a supplement to the basic set for jedi // (keep numbers in ascending order in order for variant-capping to work) -const char *cg_customJediSoundNames[MAX_CUSTOM_JEDI_SOUNDS] = +const char *cg_customJediSoundNames[MAX_CUSTOM_JEDI_SOUNDS] = { "*combat1.wav", "*combat2.wav", @@ -253,13 +257,13 @@ const char *cg_customJediSoundNames[MAX_CUSTOM_JEDI_SOUNDS] = // done at registration time only... // -// cuts down on sound-variant registration for low end machines, +// cuts down on sound-variant registration for low end machines, // eg *gloat1.wav (plus...2,...3) can be capped to all be just *gloat1.wav // static const char *GetCustomSound_VariantCapped(const char *ppsTable[], int iEntryNum, qboolean bForceVariant1) { extern vmCvar_t cg_VariantSoundCap; - + // const int iVariantCap = 2; // test const int &iVariantCap = cg_VariantSoundCap.integer; @@ -303,7 +307,7 @@ static const char *GetCustomSound_VariantCapped(const char *ppsTable[], int iEnt } } - // didn't find an entry corresponding to either the random name, or the xxxx1 version, + // didn't find an entry corresponding to either the random name, or the xxxx1 version, // so give up and drop through to return the original... // } @@ -318,8 +322,8 @@ extern cvar_t *com_buildScript; static void CG_RegisterCustomSounds(clientInfo_t *ci, int iSoundEntryBase, int iTableEntries, const char *ppsTable[], const char *psDir ) -{ - for ( int i=0 ; isounds[i + iSoundEntryBase] = hSFX; } } @@ -364,17 +368,17 @@ static void CG_RegisterCustomSounds(clientInfo_t *ci, int iSoundEntryBase, CG_CustomSound NOTE: when you call this, check the value. If zero, do not try to play the sound. - Either that or when a sound that doesn't exist is played, don't play the null + Either that or when a sound that doesn't exist is played, don't play the null sound honk and don't display the error message ================ */ -static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int customSoundSet ) +static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int customSoundSet ) { clientInfo_t *ci; int i; - if ( soundName[0] != '*' ) + if ( soundName[0] != '*' ) { return cgi_S_RegisterSound( soundName ); } @@ -400,9 +404,9 @@ static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int cus // There should always be a clientInfo structure if there is a client, but just make sure... if ( ci ) { - for ( i = 0 ; i < MAX_CUSTOM_BASIC_SOUNDS && cg_customBasicSoundNames[i] ; i++ ) + for ( i = 0 ; i < MAX_CUSTOM_BASIC_SOUNDS && cg_customBasicSoundNames[i] ; i++ ) { - if ( !Q_stricmp( soundName, cg_customBasicSoundNames[i] ) ) + if ( !Q_stricmp( soundName, cg_customBasicSoundNames[i] ) ) { return ci->sounds[i]; } @@ -413,9 +417,9 @@ static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int cus // There should always be a clientInfo structure if there is a client, but just make sure... if ( ci ) { - for ( i = 0 ; i < MAX_CUSTOM_COMBAT_SOUNDS && cg_customCombatSoundNames[i] ; i++ ) + for ( i = 0 ; i < MAX_CUSTOM_COMBAT_SOUNDS && cg_customCombatSoundNames[i] ; i++ ) { - if ( !Q_stricmp( soundName, cg_customCombatSoundNames[i] ) ) + if ( !Q_stricmp( soundName, cg_customCombatSoundNames[i] ) ) { return ci->sounds[i+MAX_CUSTOM_BASIC_SOUNDS]; } @@ -426,9 +430,9 @@ static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int cus // There should always be a clientInfo structure if there is a client, but just make sure... if ( ci ) { - for ( i = 0 ; i < MAX_CUSTOM_EXTRA_SOUNDS && cg_customExtraSoundNames[i] ; i++ ) + for ( i = 0 ; i < MAX_CUSTOM_EXTRA_SOUNDS && cg_customExtraSoundNames[i] ; i++ ) { - if ( !Q_stricmp( soundName, cg_customExtraSoundNames[i] ) ) + if ( !Q_stricmp( soundName, cg_customExtraSoundNames[i] ) ) { return ci->sounds[i+MAX_CUSTOM_BASIC_SOUNDS+MAX_CUSTOM_COMBAT_SOUNDS]; } @@ -439,9 +443,9 @@ static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int cus // There should always be a clientInfo structure if there is a client, but just make sure... if ( ci ) { - for ( i = 0 ; i < MAX_CUSTOM_JEDI_SOUNDS && cg_customJediSoundNames[i] ; i++ ) + for ( i = 0 ; i < MAX_CUSTOM_JEDI_SOUNDS && cg_customJediSoundNames[i] ; i++ ) { - if ( !Q_stricmp( soundName, cg_customJediSoundNames[i] ) ) + if ( !Q_stricmp( soundName, cg_customJediSoundNames[i] ) ) { return ci->sounds[i+MAX_CUSTOM_BASIC_SOUNDS+MAX_CUSTOM_COMBAT_SOUNDS+MAX_CUSTOM_EXTRA_SOUNDS]; } @@ -453,30 +457,30 @@ static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int cus //no set specified, search all if ( ci ) { - for ( i = 0 ; i < MAX_CUSTOM_BASIC_SOUNDS && cg_customBasicSoundNames[i] ; i++ ) + for ( i = 0 ; i < MAX_CUSTOM_BASIC_SOUNDS && cg_customBasicSoundNames[i] ; i++ ) { - if ( !Q_stricmp( soundName, cg_customBasicSoundNames[i] ) ) + if ( !Q_stricmp( soundName, cg_customBasicSoundNames[i] ) ) { return ci->sounds[i]; } } - for ( i = 0 ; i < MAX_CUSTOM_COMBAT_SOUNDS && cg_customCombatSoundNames[i] ; i++ ) + for ( i = 0 ; i < MAX_CUSTOM_COMBAT_SOUNDS && cg_customCombatSoundNames[i] ; i++ ) { - if ( !Q_stricmp( soundName, cg_customCombatSoundNames[i] ) ) + if ( !Q_stricmp( soundName, cg_customCombatSoundNames[i] ) ) { return ci->sounds[i+MAX_CUSTOM_BASIC_SOUNDS]; } } - for ( i = 0 ; i < MAX_CUSTOM_EXTRA_SOUNDS && cg_customExtraSoundNames[i] ; i++ ) + for ( i = 0 ; i < MAX_CUSTOM_EXTRA_SOUNDS && cg_customExtraSoundNames[i] ; i++ ) { - if ( !Q_stricmp( soundName, cg_customExtraSoundNames[i] ) ) + if ( !Q_stricmp( soundName, cg_customExtraSoundNames[i] ) ) { return ci->sounds[i+MAX_CUSTOM_BASIC_SOUNDS+MAX_CUSTOM_COMBAT_SOUNDS]; } } - for ( i = 0 ; i < MAX_CUSTOM_JEDI_SOUNDS && cg_customJediSoundNames[i] ; i++ ) + for ( i = 0 ; i < MAX_CUSTOM_JEDI_SOUNDS && cg_customJediSoundNames[i] ; i++ ) { - if ( !Q_stricmp( soundName, cg_customJediSoundNames[i] ) ) + if ( !Q_stricmp( soundName, cg_customJediSoundNames[i] ) ) { return ci->sounds[i+MAX_CUSTOM_BASIC_SOUNDS+MAX_CUSTOM_COMBAT_SOUNDS+MAX_CUSTOM_EXTRA_SOUNDS]; } @@ -511,7 +515,7 @@ CG_NewClientinfo For player only, NPCs get them through NPC_stats and G_ModelIndex ====================== */ -void CG_NewClientinfo( int clientNum ) +void CG_NewClientinfo( int clientNum ) { clientInfo_t *ci; const char *configstring; @@ -521,7 +525,7 @@ void CG_NewClientinfo( int clientNum ) configstring = CG_ConfigString( clientNum + CS_PLAYERS ); - if ( !configstring[0] ) + if ( !configstring[0] ) { return; // player just left } @@ -546,39 +550,39 @@ void CG_NewClientinfo( int clientNum ) // legsModel v = Info_ValueForKey( configstring, "legsModel" ); - + Q_strncpyz( g_entities[clientNum].client->renderInfo.legsModelName, v, sizeof( g_entities[clientNum].client->renderInfo.legsModelName), qtrue); // torsoModel v = Info_ValueForKey( configstring, "torsoModel" ); - + Q_strncpyz( g_entities[clientNum].client->renderInfo.torsoModelName, v, - sizeof( g_entities[clientNum].client->renderInfo.torsoModelName), qtrue); - + sizeof( g_entities[clientNum].client->renderInfo.torsoModelName), qtrue); + // headModel v = Info_ValueForKey( configstring, "headModel" ); - + Q_strncpyz( g_entities[clientNum].client->renderInfo.headModelName, v, sizeof( g_entities[clientNum].client->renderInfo.headModelName), qtrue); // sounds v = Info_ValueForKey( configstring, "snd" ); - + ci->customBasicSoundDir = G_NewString( v ); //player uses only the basic custom and combat sound sets, not the extra or jedi - CG_RegisterCustomSounds(ci, + CG_RegisterCustomSounds(ci, 0, // int iSoundEntryBase, MAX_CUSTOM_BASIC_SOUNDS, // int iTableEntries, - cg_customBasicSoundNames, // const char *ppsTable[], + cg_customBasicSoundNames, // const char *ppsTable[], ci->customBasicSoundDir // const char *psDir ); - CG_RegisterCustomSounds(ci, + CG_RegisterCustomSounds(ci, MAX_CUSTOM_BASIC_SOUNDS, // int iSoundEntryBase, MAX_CUSTOM_COMBAT_SOUNDS, // int iTableEntries, - cg_customCombatSoundNames, // const char *ppsTable[], + cg_customCombatSoundNames, // const char *ppsTable[], ci->customBasicSoundDir // const char *psDir ); ci->infoValid = qfalse; @@ -596,40 +600,40 @@ void CG_RegisterNPCCustomSounds( clientInfo_t *ci ) if ( ci->customBasicSoundDir && ci->customBasicSoundDir[0] ) { - CG_RegisterCustomSounds(ci, + CG_RegisterCustomSounds(ci, 0, // int iSoundEntryBase, MAX_CUSTOM_BASIC_SOUNDS, // int iTableEntries, - cg_customBasicSoundNames, // const char *ppsTable[], + cg_customBasicSoundNames, // const char *ppsTable[], ci->customBasicSoundDir // const char *psDir ); } if ( ci->customCombatSoundDir && ci->customCombatSoundDir[0] ) { - CG_RegisterCustomSounds(ci, + CG_RegisterCustomSounds(ci, MAX_CUSTOM_BASIC_SOUNDS, // int iSoundEntryBase, MAX_CUSTOM_COMBAT_SOUNDS, // int iTableEntries, - cg_customCombatSoundNames, // const char *ppsTable[], + cg_customCombatSoundNames, // const char *ppsTable[], ci->customCombatSoundDir // const char *psDir ); } if ( ci->customExtraSoundDir && ci->customExtraSoundDir[0] ) { - CG_RegisterCustomSounds(ci, + CG_RegisterCustomSounds(ci, MAX_CUSTOM_BASIC_SOUNDS+MAX_CUSTOM_COMBAT_SOUNDS, // int iSoundEntryBase, MAX_CUSTOM_EXTRA_SOUNDS, // int iTableEntries, - cg_customExtraSoundNames, // const char *ppsTable[], + cg_customExtraSoundNames, // const char *ppsTable[], ci->customExtraSoundDir // const char *psDir ); } if ( ci->customJediSoundDir && ci->customJediSoundDir[0] ) { - CG_RegisterCustomSounds(ci, + CG_RegisterCustomSounds(ci, MAX_CUSTOM_BASIC_SOUNDS+MAX_CUSTOM_COMBAT_SOUNDS+MAX_CUSTOM_EXTRA_SOUNDS, // int iSoundEntryBase, MAX_CUSTOM_JEDI_SOUNDS, // int iTableEntries, - cg_customJediSoundNames, // const char *ppsTable[], + cg_customJediSoundNames, // const char *ppsTable[], ci->customJediSoundDir // const char *psDir ); } @@ -694,7 +698,7 @@ resets all the eventcache so that a vid restart will recache them void CG_ClearAnimEvtCache( void ) { int i; - for (i=0; i < level.numKnownAnimFileSets; i++) + for (i=0; i < level.numKnownAnimFileSets; i++) { // TODO: Make this work again? // level.knownAnimFileSets[i].eventsParsed = qfalse; @@ -706,11 +710,11 @@ void CG_ClearAnimEvtCache( void ) CG_SetLerpFrameAnimation =============== */ -static void CG_SetLerpFrameAnimation( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation ) +static void CG_SetLerpFrameAnimation( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation ) { animation_t *anim; - if ( newAnimation < 0 || newAnimation >= MAX_ANIMATIONS ) + if ( newAnimation < 0 || newAnimation >= MAX_ANIMATIONS ) { #ifdef FINAL_BUILD newAnimation = 0; @@ -756,14 +760,14 @@ static qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnima // see if the animation sequence is switching //FIXME: allow multiple-frame overlapped lerping between sequences? - Possibly last 3 of last seq and first 3 of next seq? - if ( newAnimation != lf->animationNumber || !lf->animation ) + if ( newAnimation != lf->animationNumber || !lf->animation ) { CG_SetLerpFrameAnimation( ci, lf, newAnimation ); } // if we have passed the current frame, move it to // oldFrame and calculate a new frame - if ( cg.time >= lf->frameTime ) + if ( cg.time >= lf->frameTime ) { lf->oldFrame = lf->frame; lf->oldFrameTime = lf->frameTime; @@ -778,7 +782,7 @@ static qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnima else*/ { animFrameTime = abs(anim->frameLerp); - + //special hack for player to ensure quick weapon change if ( entNum == 0 ) { @@ -789,17 +793,17 @@ static qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnima } } - if ( cg.time < lf->animationTime ) + if ( cg.time < lf->animationTime ) { lf->frameTime = lf->animationTime; // initial lerp - } - else + } + else { lf->frameTime = lf->oldFrameTime + animFrameTime; } f = ( lf->frameTime - lf->animationTime ) / animFrameTime; - if ( f >= anim->numFrames ) + if ( f >= anim->numFrames ) {//Reached the end of the anim //FIXME: Need to set a flag here to TASK_COMPLETE f -= anim->numFrames; @@ -814,8 +818,8 @@ static qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnima f %= (anim->numFrames - anim->loopFrames); } f += anim->loopFrames; - } - else + } + else { f = anim->numFrames - 1; if (f<0) @@ -837,7 +841,7 @@ static qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnima lf->frame = anim->firstFrame + f; } - if ( cg.time > lf->frameTime ) + if ( cg.time > lf->frameTime ) { lf->frameTime = cg.time; } @@ -845,21 +849,21 @@ static qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnima newFrame = qtrue; } - if ( lf->frameTime > cg.time + 200 ) + if ( lf->frameTime > cg.time + 200 ) { lf->frameTime = cg.time; } - if ( lf->oldFrameTime > cg.time ) + if ( lf->oldFrameTime > cg.time ) { lf->oldFrameTime = cg.time; } // calculate current lerp value - if ( lf->frameTime == lf->oldFrameTime ) + if ( lf->frameTime == lf->oldFrameTime ) { lf->backlerp = 0; - } - else + } + else { lf->backlerp = 1.0 - (float)( cg.time - lf->oldFrameTime ) / ( lf->frameTime - lf->oldFrameTime ); } @@ -873,7 +877,7 @@ static qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnima CG_ClearLerpFrame =============== */ -static void CG_ClearLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int animationNumber ) +static void CG_ClearLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int animationNumber ) { lf->frameTime = lf->oldFrameTime = cg.time; CG_SetLerpFrameAnimation( ci, lf, animationNumber ); @@ -905,7 +909,7 @@ static void CG_PlayerAnimation( centity_t *cent, int *legsOld, int *legs, float legsAnim = cent->gent->client->ps.legsAnim; // do the shuffle turn frames locally (MAN this is an Fugly-ass hack!) - + if ( cent->pe.legs.yawing ) { legsTurnAnim = PM_GetTurnAnim( cent->gent, legsAnim ); @@ -918,8 +922,8 @@ static void CG_PlayerAnimation( centity_t *cent, int *legsOld, int *legs, float //breaks things since any task waiting for a lower anim to complete //never will finish if this happens!!! //cent->gent->client->ps.legsAnimTimer = 0; - } - else + } + else { newLegsFrame = CG_RunLerpFrame( ci, ¢->pe.legs, legsAnim, cent->gent->client->renderInfo.legsFpsMod, cent->gent->s.number); } @@ -994,7 +998,7 @@ static void CG_PlayerAnimEventDo( centity_t *cent, animevent_t *animEvent ) const int holdSnd = animEvent->eventData[ AED_SOUNDINDEX_START+Q_irand( 0, animEvent->eventData[AED_SOUND_NUMRANDOMSNDS] ) ]; if ( holdSnd > 0 ) { - if ( cgs.sound_precache[ holdSnd ] ) + if ( cgs.sound_precache[ holdSnd ] ) { cgi_S_StartSound( NULL, cent->currentState.clientNum, channel, cgs.sound_precache[holdSnd ] ); } @@ -1102,7 +1106,7 @@ static void CG_PlayerAnimEventDo( centity_t *cent, animevent_t *animEvent ) if ( animEvent->stringData != NULL && cent && cent->gent && cent->gent->ghoul2.size() ) {//have a bolt name we want to use animEvent->eventData[AED_MODELINDEX] = cent->gent->playerModel; - if ( ( Q_stricmpn( "*blade", animEvent->stringData, 6 ) == 0 + if ( ( Q_stricmpn( "*blade", animEvent->stringData, 6 ) == 0 || Q_stricmp( "*flash", animEvent->stringData ) == 0 ) && cent->gent->weaponModel[0] > 0 ) {//must be a weapon, try weapon 0? @@ -1124,10 +1128,10 @@ static void CG_PlayerAnimEventDo( centity_t *cent, animevent_t *animEvent ) } if ( animEvent->eventData[AED_BOLTINDEX] != -1 ) {//have a bolt we want to play the effect on - CG_PlayEffectIDBolted( animEvent->eventData[AED_EFFECTINDEX], - animEvent->eventData[AED_MODELINDEX], - animEvent->eventData[AED_BOLTINDEX], - cent->currentState.clientNum, + CG_PlayEffectIDBolted( animEvent->eventData[AED_EFFECTINDEX], + animEvent->eventData[AED_MODELINDEX], + animEvent->eventData[AED_BOLTINDEX], + cent->currentState.clientNum, cent->lerpOrigin ); } else @@ -1162,7 +1166,7 @@ static void CG_PlayerAnimEventDo( centity_t *cent, animevent_t *animEvent ) VectorScale( fwd, animEvent->eventData[AED_MOVE_FWD], cent->gent->client->ps.velocity ); VectorMA( cent->gent->client->ps.velocity, animEvent->eventData[AED_MOVE_RT], rt, cent->gent->client->ps.velocity ); VectorMA( cent->gent->client->ps.velocity, animEvent->eventData[AED_MOVE_UP], up, cent->gent->client->ps.velocity ); - + if ( animEvent->eventData[AED_MOVE_UP] > 0 ) {//a jump cent->gent->client->ps.pm_flags |= PMF_JUMPING; @@ -1188,12 +1192,12 @@ static void CG_PlayerAnimEvents( int animFileIndex, qboolean torso, int oldFrame qboolean doEvent = qfalse, inSameAnim = qfalse, loopAnim = qfalse, match = qfalse, animBackward = qfalse; animevent_t *animEvents = NULL; int glaIndex = -1; - + if ( g_entities[entNum].ghoul2.size() ) { glaIndex = gi.G2API_GetAnimIndex(&(g_entities[entNum].ghoul2[0])); } - + if ( torso ) { animEvents = level.knownAnimFileSets[animFileIndex].torsoAnimEvents; @@ -1276,7 +1280,7 @@ static void CG_PlayerAnimEvents( int animFileIndex, qboolean torso, int oldFrame {//hmm, didn't pass through it linearally, see if we looped if ( animEvents[i].keyFrame >= firstFrame && animEvents[i].keyFrame < lastFrame ) {//keyframe is in this anim - if ( oldFrame > animEvents[i].keyFrame + if ( oldFrame > animEvents[i].keyFrame && frame > oldFrame ) {//old to new passed through keyframe match = qtrue; @@ -1294,7 +1298,7 @@ static void CG_PlayerAnimEvents( int animFileIndex, qboolean torso, int oldFrame {//hmm, didn't pass through it linearally, see if we looped if ( animEvents[i].keyFrame >= firstFrame && animEvents[i].keyFrame < lastFrame ) {//keyframe is in this anim - if ( oldFrame < animEvents[i].keyFrame + if ( oldFrame < animEvents[i].keyFrame && frame < oldFrame ) {//old to new passed through keyframe match = qtrue; @@ -1312,7 +1316,7 @@ static void CG_PlayerAnimEvents( int animFileIndex, qboolean torso, int oldFrame case AEV_SOUNDCHAN: case AEV_SOUND: // Determine probability of playing sound - if (!animEvents[i].eventData[AED_SOUND_PROBABILITY]) // 100% + if (!animEvents[i].eventData[AED_SOUND_PROBABILITY]) // 100% { doEvent = qtrue; } @@ -1323,7 +1327,7 @@ static void CG_PlayerAnimEvents( int animFileIndex, qboolean torso, int oldFrame break; case AEV_SABER_SWING: // Determine probability of playing sound - if (!animEvents[i].eventData[AED_SABER_SWING_PROBABILITY]) // 100% + if (!animEvents[i].eventData[AED_SABER_SWING_PROBABILITY]) // 100% { doEvent = qtrue; } @@ -1334,7 +1338,7 @@ static void CG_PlayerAnimEvents( int animFileIndex, qboolean torso, int oldFrame break; case AEV_SABER_SPIN: // Determine probability of playing sound - if (!animEvents[i].eventData[AED_SABER_SPIN_PROBABILITY]) // 100% + if (!animEvents[i].eventData[AED_SABER_SPIN_PROBABILITY]) // 100% { doEvent = qtrue; } @@ -1344,9 +1348,9 @@ static void CG_PlayerAnimEvents( int animFileIndex, qboolean torso, int oldFrame } break; case AEV_FOOTSTEP: - // Determine probability of playing sound + // Determine probability of playing sound //Com_Printf( "Footstep event on frame %d, even should be on frame %d, off by %d\n", frame, animEvents[i].keyFrame, frame-animEvents[i].keyFrame ); - if (!animEvents[i].eventData[AED_FOOTSTEP_PROBABILITY]) // 100% + if (!animEvents[i].eventData[AED_FOOTSTEP_PROBABILITY]) // 100% { doEvent = qtrue; } @@ -1357,7 +1361,7 @@ static void CG_PlayerAnimEvents( int animFileIndex, qboolean torso, int oldFrame break; case AEV_EFFECT: // Determine probability of playing sound - if (!animEvents[i].eventData[AED_EFFECT_PROBABILITY]) // 100% + if (!animEvents[i].eventData[AED_EFFECT_PROBABILITY]) // 100% { doEvent = qtrue; } @@ -1368,7 +1372,7 @@ static void CG_PlayerAnimEvents( int animFileIndex, qboolean torso, int oldFrame break; case AEV_FIRE: // Determine probability of playing sound - if (!animEvents[i].eventData[AED_FIRE_PROBABILITY]) // 100% + if (!animEvents[i].eventData[AED_FIRE_PROBABILITY]) // 100% { doEvent = qtrue; } @@ -1391,7 +1395,7 @@ static void CG_PlayerAnimEvents( int animFileIndex, qboolean torso, int oldFrame } }// end if event matches }// end if model matches - }// end for + }// end for } static void CGG2_AnimEvents( centity_t *cent ) @@ -1448,7 +1452,7 @@ CG_UpdateAngleClamp Turn curAngle toward destAngle at angleSpeed, but stay within clampMin and Max ================== */ -static void CG_UpdateAngleClamp( float destAngle, float clampMin, float clampMax, float angleSpeed, float *curAngle, float normalAngle) +static void CG_UpdateAngleClamp( float destAngle, float clampMin, float clampMax, float angleSpeed, float *curAngle, float normalAngle) { float swing; float move; @@ -1467,10 +1471,10 @@ static void CG_UpdateAngleClamp( float destAngle, float clampMin, float clampMax scale = fabs( swing ); if (swing > 0) { - if ( swing < clampMax * 0.25 ) + if ( swing < clampMax * 0.25 ) {//Pretty small way to go scale = 0.25; - } + } else if ( swing > clampMax * 2.0 ) {//Way out of our range scale = 2.0; @@ -1478,14 +1482,14 @@ static void CG_UpdateAngleClamp( float destAngle, float clampMin, float clampMax else {//Scale it smoothly scale = swing/clampMax; - } + } } else// if (swing < 0) { - if ( swing > clampMin * 0.25 ) + if ( swing > clampMin * 0.25 ) {//Pretty small way to go scale = 0.5; - } + } else if ( swing < clampMin * 2.0 ) {//Way out of our range scale = 2.0; @@ -1493,15 +1497,15 @@ static void CG_UpdateAngleClamp( float destAngle, float clampMin, float clampMax else {//Scale it smoothly scale = swing/clampMin; - } + } } actualSpeed = scale * angleSpeed; // swing towards the destination angle - if ( swing >= 0 ) + if ( swing >= 0 ) { move = cg.frametime * actualSpeed; - if ( move >= swing ) + if ( move >= swing ) {//our turnspeed is so fast, no need to swing, just match *curAngle = destAngle; } @@ -1509,11 +1513,11 @@ static void CG_UpdateAngleClamp( float destAngle, float clampMin, float clampMax { *curAngle = AngleNormalize360( *curAngle + move ); } - } - else if ( swing < 0 ) + } + else if ( swing < 0 ) { move = cg.frametime * -actualSpeed; - if ( move <= swing ) + if ( move <= swing ) {//our turnspeed is so fast, no need to swing, just match *curAngle = destAngle; } @@ -1522,15 +1526,15 @@ static void CG_UpdateAngleClamp( float destAngle, float clampMin, float clampMax *curAngle = AngleNormalize180( *curAngle + move ); } } - + swing = AngleSubtract( *curAngle, normalAngle ); // clamp to no more than normalAngle + tolerance - if ( swing > clampMax ) + if ( swing > clampMax ) { *curAngle = AngleNormalize180( normalAngle + clampMax ); - } - else if ( swing < clampMin ) + } + else if ( swing < clampMin ) { *curAngle = AngleNormalize180( normalAngle + clampMin ); } @@ -1552,11 +1556,11 @@ CG_SwingAngles locked mode (Don't turn unless you exceed the swing/clamp tolerance) ================== */ -static void CG_SwingAngles( float destAngle, - float swingTolMin, float swingTolMax, +static void CG_SwingAngles( float destAngle, + float swingTolMin, float swingTolMax, float clampMin, float clampMax, - float angleSpeed, float *curAngle, - qboolean *turning ) + float angleSpeed, float *curAngle, + qboolean *turning ) { float swing; float move; @@ -1574,7 +1578,7 @@ static void CG_SwingAngles( float destAngle, } //If we're not turning, then we're done - if ( *turning == qfalse) + if ( *turning == qfalse) return; // modify the angleSpeed depending on the delta @@ -1589,15 +1593,15 @@ static void CG_SwingAngles( float destAngle, return; } - if ( swing < swingTolMax * 0.5 ) + if ( swing < swingTolMax * 0.5 ) {//Pretty small way to go scale = 0.5; - } - else if ( scale < swingTolMax ) + } + else if ( scale < swingTolMax ) {//More than halfway to go scale = 1.0; - } - else + } + else {//Way out of our range scale = 2.0; } @@ -1610,47 +1614,47 @@ static void CG_SwingAngles( float destAngle, return; } - if ( swing > swingTolMin * 0.5 ) + if ( swing > swingTolMin * 0.5 ) {//Pretty small way to go scale = 0.5; - } - else if ( scale > swingTolMin ) + } + else if ( scale > swingTolMin ) {//More than halfway to go scale = 1.0; - } - else + } + else {//Way out of our range scale = 2.0; } } // swing towards the destination angle - if ( swing >= 0 ) + if ( swing >= 0 ) { move = cg.frametime * scale * angleSpeed; - if ( move >= swing ) + if ( move >= swing ) {//our turnspeed is so fast, no need to swing, just match move = swing; } *curAngle = AngleNormalize360( *curAngle + move ); - } - else if ( swing < 0 ) + } + else if ( swing < 0 ) { move = cg.frametime * scale * -angleSpeed; - if ( move <= swing ) + if ( move <= swing ) {//our turnspeed is so fast, no need to swing, just match move = swing; } *curAngle = AngleNormalize360( *curAngle + move ); } - + // clamp to no more than tolerance - if ( swing > clampMax ) + if ( swing > clampMax ) { *curAngle = AngleNormalize360( destAngle - (clampMax - 1) ); - } - else if ( swing < clampMin ) + } + else if ( swing < clampMin ) { *curAngle = AngleNormalize360( destAngle + (-clampMin - 1) ); } @@ -1667,16 +1671,16 @@ extern vmCvar_t cg_drawBreath; static void CG_BreathPuffs( centity_t *cent, vec3_t angles, vec3_t origin ) { gclient_s *client = cent->gent->client; - + /* cg_drawBreath.integer == 0 - Don't draw at all. == 1 - Draw both (but bubbles only when under water). == 2 - Draw only cold breath. == 3 - Draw only under water bubbles (when under water) */ - if ( !client - || cg_drawBreath.integer == 0 - || !cg.renderingThirdPerson - || client->ps.pm_type == PM_DEAD + if ( !client + || cg_drawBreath.integer == 0 + || !cg.renderingThirdPerson + || client->ps.pm_type == PM_DEAD || client->breathPuffTime > cg.time ) { return; @@ -1723,7 +1727,7 @@ static void CG_BreathPuffs( centity_t *cent, vec3_t angles, vec3_t origin ) } #define LOOK_DEFAULT_SPEED 0.15f -#define LOOK_TALKING_SPEED 0.15f +#define LOOK_TALKING_SPEED 0.15f static qboolean CG_CheckLookTarget( centity_t *cent, vec3_t lookAngles, float *lookingSpeed ) { @@ -1742,7 +1746,7 @@ static qboolean CG_CheckLookTarget( centity_t *cent, vec3_t lookAngles, float *l //Now calc head angle to lookTarget, if any if ( cent->gent->client->renderInfo.lookTarget >= 0 && cent->gent->client->renderInfo.lookTarget < ENTITYNUM_WORLD ) { - vec3_t lookDir, lookOrg, eyeOrg; + vec3_t lookDir, lookOrg = { 0.0f }, eyeOrg; if ( cent->gent->client->renderInfo.lookMode == LM_ENT ) { centity_t *lookCent = &cg_entities[cent->gent->client->renderInfo.lookTarget]; @@ -1826,7 +1830,7 @@ static qboolean CG_CheckLookTarget( centity_t *cent, vec3_t lookAngles, float *l CG_AddHeadBob ================= */ -static qboolean CG_AddHeadBob( centity_t *cent, vec3_t addTo ) +static qboolean CG_AddHeadBob( centity_t *cent, vec3_t addTo ) { renderInfo_t *renderInfo = ¢->gent->client->renderInfo; const int volume = gi.VoiceVolume[cent->gent->s.clientNum]; @@ -2049,8 +2053,8 @@ static void CG_G2ClientSpineAngles( centity_t *cent, vec3_t viewAngles, const ve VectorClear( thoracicAngles ); VectorClear( ulAngles ); VectorClear( llAngles ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, POSITIVE_Y, POSITIVE_Z, cgs.model_draw ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->lowerLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, POSITIVE_Y, POSITIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, POSITIVE_Y, POSITIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->lowerLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, POSITIVE_Y, POSITIVE_Z, cgs.model_draw ); return; } */ @@ -2063,9 +2067,9 @@ static void CG_G2ClientSpineAngles( centity_t *cent, vec3_t viewAngles, const ve return; } - if ( cg_motionBoneComp.integer - && !PM_FlippingAnim( cent->currentState.legsAnim ) - && !PM_SpinningSaberAnim( cent->currentState.legsAnim ) + if ( cg_motionBoneComp.integer + && !PM_FlippingAnim( cent->currentState.legsAnim ) + && !PM_SpinningSaberAnim( cent->currentState.legsAnim ) && !PM_SpinningSaberAnim( cent->currentState.torsoAnim ) && cent->currentState.legsAnim != cent->currentState.torsoAnim //NOTE: presumes your legs & torso are on the same frame, though they *should* be because PM_SetAnimFinal tries to keep them in synch && !G_ClassHasBadBones( cent->gent->client->NPC_class ) )//these guys' bones are so fucked up we shouldn't even bother with this motion bone comp... @@ -2087,7 +2091,7 @@ static void CG_G2ClientSpineAngles( centity_t *cent, vec3_t viewAngles, const ve dummyRootBone = gi.G2API_GetBoneIndex( &dummyGhoul2[0], "model_root", qtrue ); dummyHipsBolt = gi.G2API_AddBolt( &dummyGhoul2[0], "pelvis" ); } - + gi.G2API_GetBoneAnimIndex( ¢->gent->ghoul2[cent->gent->playerModel], cent->gent->lowerLumbarBone, cg.time, &upperFrame, &junk, &junk, &junk, &animSpeed, cgs.model_draw ); //set the dummyGhoul2 lower body to same frame as upper gi.G2API_SetBoneAnimIndex(&dummyGhoul2[0], dummyRootBone, upperFrame, upperFrame, BONE_ANIM_OVERRIDE_FREEZE, 1, cg.time, upperFrame, 0 ); @@ -2186,7 +2190,7 @@ static void CG_G2ClientSpineAngles( centity_t *cent, vec3_t viewAngles, const ve ulAngles[ROLL] = viewAngles[ROLL]*0.35f; llAngles[ROLL] = viewAngles[ROLL]*0.45f+motionBoneCorrectAngles[ROLL]; } - + if ( G_IsRidingVehicle( cent->gent ) )// && type == VH_SPEEDER ? {//aim torso forward too ulAngles[YAW] = llAngles[YAW] = 0; @@ -2207,14 +2211,14 @@ static void CG_G2ClientSpineAngles( centity_t *cent, vec3_t viewAngles, const ve ulAngles[YAW] = ulAngles[ROLL] = 0.0f; } G_BoneOrientationsForClass( cent->gent->client->NPC_class, "upper_lumbar", &oUp, &oRt, &oFwd ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, ulAngles, BONE_ANGLES_POSTMULT, oUp, oRt, oFwd, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, ulAngles, BONE_ANGLES_POSTMULT, oUp, oRt, oFwd, cgs.model_draw); G_BoneOrientationsForClass( cent->gent->client->NPC_class, "lower_lumbar", &oUp, &oRt, &oFwd ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->lowerLumbarBone, llAngles, BONE_ANGLES_POSTMULT, oUp, oRt, oFwd, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->lowerLumbarBone, llAngles, BONE_ANGLES_POSTMULT, oUp, oRt, oFwd, cgs.model_draw); } else { - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, ulAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->lowerLumbarBone, llAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, ulAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->lowerLumbarBone, llAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); } } @@ -2226,9 +2230,9 @@ static void CG_G2ClientNeckAngles( centity_t *cent, const vec3_t lookAngles, vec VectorClear( thoracicAngles ); VectorClear( headAngles ); VectorClear( neckAngles ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, POSITIVE_Y, POSITIVE_Z, cgs.model_draw ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, POSITIVE_Y, POSITIVE_Z, cgs.model_draw ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, POSITIVE_Y, POSITIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, POSITIVE_Y, POSITIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, POSITIVE_Y, POSITIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, POSITIVE_Y, POSITIVE_Z, cgs.model_draw ); return; } */ @@ -2352,8 +2356,8 @@ static void CG_G2ClientNeckAngles( centity_t *cent, const vec3_t lookAngles, vec /* ABORTED ATTEMPT AT AIMING GUN WITH SHOULDER WHEN ON BIKE... POSSIBLY RETURN TO THIS LATER if ( cent->gent && cent->gent->client && - cent->gent->enemy && - cent->gent->humerusRBone!=-1 && + cent->gent->enemy && + cent->gent->humerusRBone!=-1 && (cent->gent->client->ps.torsoAnim==BOTH_VS_ATR_G || cent->gent->client->ps.torsoAnim==BOTH_VS_ATF_G)) { vec3_t toEnemy; @@ -2382,12 +2386,12 @@ static void CG_G2ClientNeckAngles( centity_t *cent, const vec3_t lookAngles, vec gi.G2API_GiveMeVectorFromMatrix( boltMatrix, NEGATIVE_Y, actorAim ); vectoangles( actorAim, actorAngles ); vectoangles( toEnemy, toEnemyAngles ); - + boltAngles[0] = AngleDelta(actorAngles[0], toEnemyAngles[0]); boltAngles[1] = AngleDelta(actorAngles[1], toEnemyAngles[1]); boltAngles[2] = AngleDelta(actorAngles[2], toEnemyAngles[2]); - BG_G2SetBoneAngles( cent, actor, actor->humerusRBone, boltAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + BG_G2SetBoneAngles( cent, actor, actor->humerusRBone, boltAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); } }*/ } @@ -2399,7 +2403,7 @@ static void CG_G2ClientNeckAngles( centity_t *cent, const vec3_t lookAngles, vec G_BoneOrientationsForClass( cent->gent->client->NPC_class, "cranium", &oUp, &oRt, &oFwd ); BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, headAngles, BONE_ANGLES_POSTMULT, oUp, oRt, oFwd, cgs.model_draw ); G_BoneOrientationsForClass( cent->gent->client->NPC_class, "cervical", &oUp, &oRt, &oFwd ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, neckAngles, BONE_ANGLES_POSTMULT, oUp, oRt, oFwd, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, neckAngles, BONE_ANGLES_POSTMULT, oUp, oRt, oFwd, cgs.model_draw); } if ( cent->gent->client->NPC_class != CLASS_SABER_DROID ) {//saber droid doesn't use thoracic @@ -2408,14 +2412,14 @@ static void CG_G2ClientNeckAngles( centity_t *cent, const vec3_t lookAngles, vec thoracicAngles[YAW] = thoracicAngles[ROLL] = 0.0f; } G_BoneOrientationsForClass( cent->gent->client->NPC_class, "thoracic", &oUp, &oRt, &oFwd ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, thoracicAngles, BONE_ANGLES_POSTMULT, oUp, oRt, oFwd, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, thoracicAngles, BONE_ANGLES_POSTMULT, oUp, oRt, oFwd, cgs.model_draw); } } else { BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, headAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, neckAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, thoracicAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, neckAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, thoracicAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); } } @@ -2493,9 +2497,9 @@ Handles seperate torso motion */ extern int PM_TurnAnimForLegsAnim( gentity_t *gent, int anim ); extern float PM_GetTimeScaleMod( gentity_t *gent ); -static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) +static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) { - vec3_t headAngles, neckAngles, chestAngles, thoracicAngles = {0,0,0};//legsAngles, torsoAngles, + vec3_t headAngles, neckAngles, chestAngles, thoracicAngles = {0,0,0};//legsAngles, torsoAngles, vec3_t ulAngles, llAngles; //float speed; //vec3_t velocity; @@ -2515,20 +2519,20 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) //int i; qboolean looking = qfalse, talking = qfalse; - if ( cent->gent + if ( cent->gent && (cent->gent->flags&FL_NO_ANGLES) ) {//flatten out all bone angles we might have been overriding cent->lerpAngles[PITCH] = cent->lerpAngles[ROLL] = 0; VectorCopy( cent->lerpAngles, angles ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); cent->pe.torso.pitchAngle = 0; cent->pe.torso.yawAngle = 0; - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->lowerLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->lowerLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); cent->pe.legs.pitchAngle = angles[0]; cent->pe.legs.yawAngle = angles[1]; @@ -2549,14 +2553,14 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) VectorCopy( cent->lerpAngles, angles ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); cent->pe.torso.pitchAngle = 0; cent->pe.torso.yawAngle = 0; - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->lowerLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->lowerLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); cent->pe.legs.pitchAngle = angles[0]; cent->pe.legs.yawAngle = angles[1]; @@ -2568,13 +2572,13 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) return; } - if ( cent->gent && cent->gent->client - && (cent->gent->client->NPC_class != CLASS_GONK ) - && (cent->gent->client->NPC_class != CLASS_INTERROGATOR) - && (cent->gent->client->NPC_class != CLASS_SENTRY) - && (cent->gent->client->NPC_class != CLASS_PROBE ) - && (cent->gent->client->NPC_class != CLASS_R2D2 ) - && (cent->gent->client->NPC_class != CLASS_R5D2) + if ( cent->gent && cent->gent->client + && (cent->gent->client->NPC_class != CLASS_GONK ) + && (cent->gent->client->NPC_class != CLASS_INTERROGATOR) + && (cent->gent->client->NPC_class != CLASS_SENTRY) + && (cent->gent->client->NPC_class != CLASS_PROBE ) + && (cent->gent->client->NPC_class != CLASS_R2D2 ) + && (cent->gent->client->NPC_class != CLASS_R5D2) && (cent->gent->client->NPC_class != CLASS_ATST||!cent->gent->s.number) ) {// If we are rendering third person, we should just force the player body to always fully face // whatever way they are looking, otherwise, you can end up with gun shots coming off of the @@ -2609,7 +2613,7 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) viewAngles[YAW] = viewAngles[ROLL] = 0; if ( cent->gent && cent->gent->client && cent->gent->client->NPC_class == CLASS_RANCOR ) {//rancor uses full pitch - if ( cent->gent->count ) + if ( cent->gent->count ) {//don't look up or down at enemy when he's in your hand... viewAngles[PITCH] = 0.0f; } @@ -2627,7 +2631,7 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) { vec3_t eDir, eAngles, lookFrom; VectorCopy( cent->lerpOrigin, lookFrom ); - lookFrom[2] += cent->gent->maxs[2]*0.6f; + lookFrom[2] += cent->gent->maxs[2]*0.6f; VectorSubtract( cg_entities[cent->gent->enemy->s.number].lerpOrigin, lookFrom, eDir ); vectoangles( eDir, eAngles ); viewAngles[PITCH] = AngleNormalize180(eAngles[0]); @@ -2681,7 +2685,7 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) if ( cent->gent && cent->gent->client && cent->gent->client->NPC_class == CLASS_ATST ) { lookAngles[YAW] = 0; - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, lookAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, lookAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); VectorCopy( viewAngles, lookAngles ); } else @@ -2704,13 +2708,13 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) if ( turnAnim != -1 && cent->gent->health > 0 ) { animation_t *animations = level.knownAnimFileSets[cent->gent->client->clientInfo.animFileIndex].animations; - + if ( !animatingHips || ( animations[turnAnim].firstFrame != startFrame ) )// only set the anim if we aren't going to do the same animation again { float animSpeed = 50.0f / animations[turnAnim].frameLerp * PM_GetTimeScaleMod( cent->gent ); gi.G2API_SetBoneAnimIndex( ¢->gent->ghoul2[cent->gent->playerModel], cent->gent->hipsBone, - animations[turnAnim].firstFrame, animations[turnAnim].firstFrame+animations[turnAnim].numFrames, + animations[turnAnim].firstFrame, animations[turnAnim].firstFrame+animations[turnAnim].numFrames, BONE_ANIM_OVERRIDE_LOOP/*|BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND*/, animSpeed, cg.time, -1, 100 ); } } @@ -2888,7 +2892,7 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) VectorCopy( cent->lerpAngles, lookAngles ); lookAngles[0] = lookAngles[2] = 0; lookAngles[YAW] -= trailingLegsAngles[YAW]; - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, lookAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, lookAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); } else { @@ -2900,11 +2904,11 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) // All other entities else if ( cent->gent && cent->gent->client ) { - if ( (cent->gent->client->NPC_class == CLASS_PROBE ) - || (cent->gent->client->NPC_class == CLASS_R2D2 ) - || (cent->gent->client->NPC_class == CLASS_R5D2) - || (cent->gent->client->NPC_class == CLASS_RANCOR) - || (cent->gent->client->NPC_class == CLASS_WAMPA) + if ( (cent->gent->client->NPC_class == CLASS_PROBE ) + || (cent->gent->client->NPC_class == CLASS_R2D2 ) + || (cent->gent->client->NPC_class == CLASS_R5D2) + || (cent->gent->client->NPC_class == CLASS_RANCOR) + || (cent->gent->client->NPC_class == CLASS_WAMPA) || (cent->gent->client->NPC_class == CLASS_ATST) ) { VectorCopy( cent->lerpAngles, angles ); @@ -2941,7 +2945,7 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) AnglesToAxis( trailingLegsAngles, legs ); } /* - else if ( cent->gent->client + else if ( cent->gent->client && (cent->gent->client->NPC_class == CLASS_WAMPA||cent->gent->client->NPC_class == CLASS_RANCOR) ) { CG_ATSTLegsYaw( cent, trailingLegsAngles ); @@ -3027,7 +3031,7 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) } else { - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, lookAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, lookAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); } //return; } @@ -3044,7 +3048,7 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) } } -static void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], vec3_t head[3] ) +static void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], vec3_t head[3] ) { vec3_t legsAngles, torsoAngles, headAngles; vec3_t lookAngles, viewAngles; @@ -3072,11 +3076,11 @@ static void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], v //VectorClear( viewAngles ); VectorCopy( cent->lerpAngles, viewAngles ); - + viewAngles[YAW] = viewAngles[ROLL] = 0; viewAngles[PITCH] *= 0.5; AnglesToAxis( viewAngles, head ); - + viewAngles[PITCH] *= 0.75; cent->pe.torso.pitchAngle = viewAngles[PITCH]; cent->pe.torso.yawAngle = viewAngles[YAW]; @@ -3134,13 +3138,13 @@ static void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], v if ( cent->gent && cent->gent->next_roff_time && cent->gent->next_roff_time >= cg.time ) {//Following a roff, body must keep up with head, yaw-wise - headYawClampMin = - headYawClampMax = - torsoYawSwingTolMin = - torsoYawSwingTolMax = - torsoYawClampMin = - torsoYawClampMax = - legsYawSwingTolMin = + headYawClampMin = + headYawClampMax = + torsoYawSwingTolMin = + torsoYawSwingTolMax = + torsoYawClampMin = + torsoYawClampMax = + legsYawSwingTolMin = legsYawSwingTolMax = 0; } @@ -3150,7 +3154,7 @@ static void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], v { headYawClampMin = -70; headYawClampMax = 70; - + //These next two are only used for a calc below- this clamp is done in PM_UpdateViewAngles headPitchClampMin = -90; headPitchClampMax = 90; @@ -3169,7 +3173,7 @@ static void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], v yawSpeed = maxYawSpeed = CG_SWINGSPEED; } - + if(yawSpeed <= 0) {//Just in case yawSpeed = 0.5f; //was 0.33 @@ -3186,7 +3190,7 @@ static void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], v //Clamp and swing the legs legsAngles[YAW] = headAngles[YAW]; - + if(cent->gent->client->renderInfo.renderFlags & RF_LOCKEDANGLE) { cent->gent->client->renderInfo.legsYaw = cent->pe.legs.yawAngle = cent->gent->client->renderInfo.lockYaw; @@ -3246,7 +3250,7 @@ static void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], v cent->gent->client->renderInfo.legsYaw = legsAngles[YAW]; } */ - + // torso // If applicable, swing the lower parts to catch up with the head CG_SwingAngles( headAngles[YAW], torsoYawSwingTolMin, torsoYawSwingTolMax, headYawClampMin, headYawClampMax, yawSpeed, ¢->pe.torso.yawAngle, ¢->pe.torso.yawing); @@ -3255,15 +3259,15 @@ static void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], v // ---------- pitch ----------- //As the body twists to its extents, the back tends to arch backwards - + float dest; // only show a fraction of the pitch angle in the torso - if ( headAngles[PITCH] > 180 ) + if ( headAngles[PITCH] > 180 ) { dest = (-360 + headAngles[PITCH]) * 0.75; - } - else + } + else { dest = headAngles[PITCH] * 0.75; } @@ -3320,7 +3324,7 @@ static void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], v {//Keep this type of looking for a second after stopped looking cent->gent->client->renderInfo.lookingDebounceTime = cg.time + 1000; } - + if ( cent->gent->client->renderInfo.lookingDebounceTime > cg.time ) { //Calc our actual desired head angles @@ -3340,8 +3344,8 @@ static void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], v if ( !cent->gent->enemy || cent->gent->enemy->s.number != cent->gent->client->renderInfo.lookTarget ) { - //NOTE: Hacky, yes, I know, but necc. - //We want to turn the body to follow the lookTarget + //NOTE: Hacky, yes, I know, but necc. + //We want to turn the body to follow the lookTarget //ONLY IF WE DON'T HAVE AN ENEMY OR OUR ENEMY IS NOT OUR LOOKTARGET //This is the piece of code that was making the enemies not face where //they were actually aiming. @@ -3358,7 +3362,7 @@ static void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], v scale = fabs( swing ) / ( torsoPitchClampMax + 0.01 ); //NOTENOTE: Some ents have a clamp of 0, which is bad for division scale *= LOOK_SWING_SCALE; - torsoAngles[PITCH] = legsAngles[PITCH] - ( swing * scale ); + torsoAngles[PITCH] = legsAngles[PITCH] - ( swing * scale ); } } else @@ -3416,7 +3420,7 @@ CG_PlayerPowerups =============== */ extern void CG_Seeker( centity_t *cent ); -static void CG_PlayerPowerups( centity_t *cent ) +static void CG_PlayerPowerups( centity_t *cent ) { if ( !cent->currentState.powerups ) { @@ -3442,7 +3446,7 @@ static void CG_PlayerPowerups( centity_t *cent ) } */ // invul gives a dlight -// if ( cent->currentState.powerups & ( 1 << PW_BATTLESUIT ) ) +// if ( cent->currentState.powerups & ( 1 << PW_BATTLESUIT ) ) // { // cgi_R_AddLightToScene( cent->lerpOrigin, 200 + (rand()&31), 0.8f, 0.8f, 0.2f ); // } @@ -3474,15 +3478,15 @@ static qboolean _PlayerShadow( const vec3_t origin, const float orientation, flo *shadowPlane = trace.endpos[2] + 1; // no mark for stencil or projection shadows - if ( cg_shadows.integer == 1 + if ( cg_shadows.integer == 1 || (in_camera && cg_shadows.integer == 2) )//don't want stencil shadows during a cinematic - { + { // fade the shadow out with height alpha = 1.0 - trace.fraction; // add the mark as a temporary, so it goes directly to the renderer // without taking a spot in the cg_marks array - CG_ImpactMark( markShader, trace.endpos, trace.plane.normal, + CG_ImpactMark( markShader, trace.endpos, trace.plane.normal, orientation, 1,1,1,alpha, qfalse, radius, qtrue ); } return qtrue; @@ -3505,7 +3509,7 @@ static qboolean CG_PlayerShadow( centity_t *const cent, float *const shadowPlane } // no shadows when cloaked - if ( cent->currentState.powerups & ( 1 << PW_CLOAKED )) + if ( cent->currentState.powerups & ( 1 << PW_CLOAKED )) { return qfalse; } @@ -3523,8 +3527,8 @@ static qboolean CG_PlayerShadow( centity_t *const cent, float *const shadowPlane if (cent->gent->rootBone>=0 && cent->gent->ghoul2.IsValid() && cent->gent->ghoul2[0].animModelIndexOffset)//If it has an animOffset it's a cinematic anim { //i might be running out of my bounding box, so get my root origin mdxaBone_t boltMatrix; - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->rootBone, - &boltMatrix, tempAngles, cent->lerpOrigin, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->rootBone, + &boltMatrix, tempAngles, cent->lerpOrigin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, rootOrigin ); } @@ -3544,16 +3548,16 @@ static qboolean CG_PlayerShadow( centity_t *const cent, float *const shadowPlane qboolean bShadowed; mdxaBone_t boltMatrix; vec3_t sideOrigin; - - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footLBolt, - &boltMatrix, tempAngles, cent->lerpOrigin, + + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footLBolt, + &boltMatrix, tempAngles, cent->lerpOrigin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, sideOrigin ); sideOrigin[2] += 30; //fudge up a bit for coplaner bShadowed = _PlayerShadow(sideOrigin, 0, shadowPlane, 28, cgs.media.shadowMarkShader); - - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footRBolt, - &boltMatrix, tempAngles, cent->lerpOrigin, cg.time, + + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footRBolt, + &boltMatrix, tempAngles, cent->lerpOrigin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, sideOrigin ); sideOrigin[2] += 30; //fudge up a bit for coplaner @@ -3581,13 +3585,13 @@ void CG_LandingEffect( vec3_t origin, vec3_t normal, int material ) case MATERIAL_MUD: effectID = cgs.effects.landingMud; break; - case MATERIAL_DIRT: + case MATERIAL_DIRT: effectID = cgs.effects.landingDirt; break; - case MATERIAL_SAND: + case MATERIAL_SAND: effectID = cgs.effects.landingSand; break; - case MATERIAL_SNOW: + case MATERIAL_SNOW: effectID = cgs.effects.landingSnow; break; case MATERIAL_GRAVEL: @@ -3601,11 +3605,11 @@ void CG_LandingEffect( vec3_t origin, vec3_t normal, int material ) } } #define FOOTSTEP_DISTANCE 32 -static void _PlayerFootStep( const vec3_t origin, - const vec3_t traceDir, - const float orientation, - const float radius, - centity_t *const cent, footstepType_t footStepType ) +static void _PlayerFootStep( const vec3_t origin, + const vec3_t traceDir, + const float orientation, + const float radius, + centity_t *const cent, footstepType_t footStepType ) { vec3_t end, mins = {-7, -7, 0}, maxs = {7, 7, 2}; trace_t trace; @@ -3621,7 +3625,7 @@ static void _PlayerFootStep( const vec3_t origin, cgi_CM_BoxTrace( &trace, origin, end, mins, maxs, 0, MASK_PLAYERSOLID ); // no shadow if too high - if ( trace.fraction >= 1.0f ) + if ( trace.fraction >= 1.0f ) { return; } @@ -3638,7 +3642,7 @@ static void _PlayerFootStep( const vec3_t origin, } effectID = cgs.effects.footstepMud; break; - case MATERIAL_DIRT: + case MATERIAL_DIRT: bMark = true; if ( footStepType == FOOTSTEP_HEAVY_R || footStepType == FOOTSTEP_HEAVY_L) { soundType = FOOTSTEP_DIRTRUN; @@ -3647,7 +3651,7 @@ static void _PlayerFootStep( const vec3_t origin, } effectID = cgs.effects.footstepSand; break; - case MATERIAL_SAND: + case MATERIAL_SAND: bMark = true; if ( footStepType == FOOTSTEP_HEAVY_R || footStepType == FOOTSTEP_HEAVY_L) { soundType = FOOTSTEP_SANDRUN; @@ -3656,7 +3660,7 @@ static void _PlayerFootStep( const vec3_t origin, } effectID = cgs.effects.footstepSand; break; - case MATERIAL_SNOW: + case MATERIAL_SNOW: bMark = true; if ( footStepType == FOOTSTEP_HEAVY_R || footStepType == FOOTSTEP_HEAVY_L) { soundType = FOOTSTEP_SNOWRUN; @@ -3665,22 +3669,22 @@ static void _PlayerFootStep( const vec3_t origin, } effectID = cgs.effects.footstepSnow; break; - case MATERIAL_SHORTGRASS: - case MATERIAL_LONGGRASS: + case MATERIAL_SHORTGRASS: + case MATERIAL_LONGGRASS: if ( footStepType == FOOTSTEP_HEAVY_R || footStepType == FOOTSTEP_HEAVY_L) { soundType = FOOTSTEP_GRASSRUN; } else { soundType = FOOTSTEP_GRASSWALK; } break; - case MATERIAL_SOLIDMETAL: + case MATERIAL_SOLIDMETAL: if ( footStepType == FOOTSTEP_HEAVY_R || footStepType == FOOTSTEP_HEAVY_L) { soundType = FOOTSTEP_METALRUN; } else { soundType = FOOTSTEP_METALWALK; } break; - case MATERIAL_HOLLOWMETAL: + case MATERIAL_HOLLOWMETAL: if ( footStepType == FOOTSTEP_HEAVY_R || footStepType == FOOTSTEP_HEAVY_L) { soundType = FOOTSTEP_PIPERUN; } else { @@ -3723,16 +3727,16 @@ static void _PlayerFootStep( const vec3_t origin, case MATERIAL_BPGLASS: case MATERIAL_DRYLEAVES: case MATERIAL_GREENLEAVES: - case MATERIAL_TILES: + case MATERIAL_TILES: case MATERIAL_PLASTER: case MATERIAL_SHATTERGLASS: case MATERIAL_ARMOR: case MATERIAL_COMPUTER: - case MATERIAL_CONCRETE: - case MATERIAL_ROCK: - case MATERIAL_ICE: - case MATERIAL_MARBLE: + case MATERIAL_CONCRETE: + case MATERIAL_ROCK: + case MATERIAL_ICE: + case MATERIAL_MARBLE: if ( footStepType == FOOTSTEP_HEAVY_R || footStepType == FOOTSTEP_HEAVY_L) { soundType = FOOTSTEP_STONERUN; } else { @@ -3741,7 +3745,7 @@ static void _PlayerFootStep( const vec3_t origin, break; } - if (soundType < FOOTSTEP_TOTAL) + if (soundType < FOOTSTEP_TOTAL) { cgi_S_StartSound( NULL, cent->currentState.clientNum, CHAN_BODY, cgs.media.footsteps[soundType][Q_irand( 0, 3)] ); } @@ -3799,14 +3803,14 @@ static void _PlayerFootStep( const vec3_t origin, projNormal[1]=0.0f; projNormal[2]=1.0f; } - CG_ImpactMark( footMarkShader, trace.endpos,projNormal, + CG_ImpactMark( footMarkShader, trace.endpos,projNormal, orientation, 1,1,1, 1.0f, qfalse, radius, qfalse ); } extern vmCvar_t cg_footsteps; static void CG_PlayerFootsteps( centity_t *const cent, footstepType_t footStepType ) { - if ( cg_footsteps.integer == 0 ) + if ( cg_footsteps.integer == 0 ) { return; } @@ -3835,13 +3839,13 @@ static void CG_PlayerFootsteps( centity_t *const cent, footstepType_t footStepTy tempAngles[ROLL] = 0; int footBolt = cent->gent->footLBolt; - if ( footStepType == FOOTSTEP_HEAVY_R || footStepType == FOOTSTEP_R) + if ( footStepType == FOOTSTEP_HEAVY_R || footStepType == FOOTSTEP_R) { footBolt = cent->gent->footRBolt; } //FIXME: get yaw orientation of the foot and use on decal - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, footBolt, - &boltMatrix, tempAngles, cent->lerpOrigin, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, footBolt, + &boltMatrix, tempAngles, cent->lerpOrigin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, sideOrigin ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, NEGATIVE_Y, footDownDir ); @@ -3856,14 +3860,14 @@ static void _PlayerSplash( const vec3_t origin, const vec3_t velocity, const flo vec3_t start, end; trace_t trace; int contents; - + VectorCopy( origin, end ); end[2] -= 24; // if the feet aren't in liquid, don't make a mark // this won't handle moving water brushes, but they wouldn't draw right anyway... contents = cgi_CM_PointContents( end, 0 ); - if ( !( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) ) + if ( !( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) ) { return; } @@ -3880,7 +3884,7 @@ static void _PlayerSplash( const vec3_t origin, const vec3_t velocity, const flo // if the head isn't out of liquid, don't make a mark contents = cgi_CM_PointContents( start, 0 ); - if ( contents & ( CONTENTS_SOLID | CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) + if ( contents & ( CONTENTS_SOLID | CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) { return; } @@ -3888,7 +3892,7 @@ static void _PlayerSplash( const vec3_t origin, const vec3_t velocity, const flo // trace down to find the surface cgi_CM_BoxTrace( &trace, start, end, NULL, NULL, 0, ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ); - if ( trace.fraction == 1.0 ) + if ( trace.fraction == 1.0 ) { return; } @@ -3898,9 +3902,9 @@ static void _PlayerSplash( const vec3_t origin, const vec3_t velocity, const flo end[0] += crandom() * 3.0f; end[1] += crandom() * 3.0f; end[2] += 1.0f; //fudge up - + int t = VectorLengthSquared( velocity ); - + if ( t > 8192 ) // oh, magic number { t = 8192; @@ -3908,11 +3912,11 @@ static void _PlayerSplash( const vec3_t origin, const vec3_t velocity, const flo float alpha = ( t / 8192.0f ) * 0.6f + 0.2f; - FX_AddOrientedParticle( -1, end, trace.plane.normal, NULL, NULL, - 6.0f, radius + random() * 48.0f, 0, + FX_AddOrientedParticle( -1, end, trace.plane.normal, NULL, NULL, + 6.0f, radius + random() * 48.0f, 0, alpha, 0.0f, 0.0f, - WHITE, WHITE, 0.0f, - random() * 360, crandom() * 6.0f, NULL, NULL, 0.0f, 0 ,0, 1200, + WHITE, WHITE, 0.0f, + random() * 360, crandom() * 6.0f, NULL, NULL, 0.0f, 0 ,0, 1200, cgs.media.wakeMarkShader, FX_ALPHA_LINEAR | FX_SIZE_LINEAR ); } @@ -3923,9 +3927,9 @@ CG_PlayerSplash Draw a mark at the water surface =============== */ -static void CG_PlayerSplash( centity_t *cent ) +static void CG_PlayerSplash( centity_t *cent ) { - if ( !cg_shadows.integer ) + if ( !cg_shadows.integer ) { return; } @@ -3944,26 +3948,26 @@ static void CG_PlayerSplash( centity_t *cent ) tempAngles[PITCH] = 0; tempAngles[YAW] = cent->pe.legs.yawAngle; tempAngles[ROLL] = 0; - - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footLBolt, - &boltMatrix, tempAngles, cent->lerpOrigin, + + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footLBolt, + &boltMatrix, tempAngles, cent->lerpOrigin, cg.time, cgs.model_draw, cent->currentState.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, sideOrigin ); sideOrigin[2] += 22; //fudge up a bit for coplaner _PlayerSplash( sideOrigin, cl->ps.velocity, 42, cent->gent->maxs[2] ); - - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footRBolt, - &boltMatrix, tempAngles, cent->lerpOrigin, cg.time, + + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footRBolt, + &boltMatrix, tempAngles, cent->lerpOrigin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, sideOrigin ); sideOrigin[2] += 22; //fudge up a bit for coplaner - _PlayerSplash( sideOrigin, cl->ps.velocity, 42, cent->gent->maxs[2] ); + _PlayerSplash( sideOrigin, cl->ps.velocity, 42, cent->gent->maxs[2] ); } else { // player splash mark - _PlayerSplash( cent->lerpOrigin, cl->ps.velocity, 36, cl->renderInfo.eyePoint[2] - cent->lerpOrigin[2] + 5 ); + _PlayerSplash( cent->lerpOrigin, cl->ps.velocity, 36, cl->renderInfo.eyePoint[2] - cent->lerpOrigin[2] + 5 ); } cent->gent->disconnectDebounceTime = cg.time + 125 + random() * 50.0f; @@ -3978,7 +3982,7 @@ CG_LightningBolt =============== */ #if 0 -static void CG_LightningBolt( centity_t *cent, vec3_t origin ) +static void CG_LightningBolt( centity_t *cent, vec3_t origin ) { // FIXME: This sound also plays when the weapon first fires which causes little sputtering sounds..not exactly cool // Must be currently firing @@ -3986,7 +3990,7 @@ static void CG_LightningBolt( centity_t *cent, vec3_t origin ) return; //Must be a durational weapon -// if ( cent->currentState.weapon == WP_DEMP2 && cent->currentState.eFlags & EF_ALT_FIRING ) +// if ( cent->currentState.weapon == WP_DEMP2 && cent->currentState.eFlags & EF_ALT_FIRING ) // { /*nothing*/ } // else { @@ -4014,7 +4018,7 @@ static void CG_LightningBolt( centity_t *cent, vec3_t origin ) AngleVectors( angs, forward, NULL, NULL ); VectorMA( org, weaponData[cent->currentState.weapon].range, forward, end ); - + CG_Trace( &trace, org, vec3_origin, vec3_origin, end, cent->currentState.number, MASK_SHOT ); traceEnt = &g_entities[ trace.entityNum ]; @@ -4030,14 +4034,14 @@ static void CG_LightningBolt( centity_t *cent, vec3_t origin ) { impact = qfalse; } - + // Add in the effect switch ( cent->currentState.weapon ) { case WP_DEMP2: // vec3_t org; -extern void FX_DEMP2_AltBeam( vec3_t start, vec3_t end, vec3_t normal, //qboolean spark, +extern void FX_DEMP2_AltBeam( vec3_t start, vec3_t end, vec3_t normal, //qboolean spark, vec3_t targ1, vec3_t targ2 ); // Move the beam back a bit to help cover up the poly edges on the fire beam @@ -4187,7 +4191,7 @@ void CG_ForcePushBlur( const vec3_t org, qboolean darkSide ) ex->pos.trTime = cg.time; ex->pos.trType = TR_LINEAR; VectorScale( cg.refdef.viewaxis[1], 55, ex->pos.trDelta ); - + if ( darkSide ) {//make it red ex->color[0] = 60; @@ -4213,7 +4217,7 @@ void CG_ForcePushBlur( const vec3_t org, qboolean darkSide ) ex->pos.trTime = cg.time; ex->pos.trType = TR_LINEAR; VectorScale( cg.refdef.viewaxis[1], -55, ex->pos.trDelta ); - + if ( darkSide ) {//make it red ex->color[0] = 60; @@ -4240,8 +4244,8 @@ static void CG_ForcePushBodyBlur( centity_t *cent, const vec3_t origin, vec3_t t // Do a torso based blur if (cent->gent->torsoBolt>=0) { - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->torsoBolt, - &boltMatrix, tempAngles, origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->torsoBolt, + &boltMatrix, tempAngles, origin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); CG_ForcePushBlur( fxOrg ); @@ -4250,8 +4254,8 @@ static void CG_ForcePushBodyBlur( centity_t *cent, const vec3_t origin, vec3_t t if (cent->gent->handRBolt>=0) { // Do a right-hand based blur - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->handRBolt, - &boltMatrix, tempAngles, origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->handRBolt, + &boltMatrix, tempAngles, origin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); CG_ForcePushBlur( fxOrg ); @@ -4260,8 +4264,8 @@ static void CG_ForcePushBodyBlur( centity_t *cent, const vec3_t origin, vec3_t t if (cent->gent->handLBolt>=0) { // Do a left-hand based blur - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->handLBolt, - &boltMatrix, tempAngles, origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->handLBolt, + &boltMatrix, tempAngles, origin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); CG_ForcePushBlur( fxOrg ); @@ -4270,8 +4274,8 @@ static void CG_ForcePushBodyBlur( centity_t *cent, const vec3_t origin, vec3_t t // Do the knees if (cent->gent->kneeLBolt>=0) { - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->kneeLBolt, - &boltMatrix, tempAngles, origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->kneeLBolt, + &boltMatrix, tempAngles, origin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); CG_ForcePushBlur( fxOrg ); @@ -4279,8 +4283,8 @@ static void CG_ForcePushBodyBlur( centity_t *cent, const vec3_t origin, vec3_t t if (cent->gent->kneeRBolt>=0) { - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->kneeRBolt, - &boltMatrix, tempAngles, origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->kneeRBolt, + &boltMatrix, tempAngles, origin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); CG_ForcePushBlur( fxOrg ); @@ -4289,16 +4293,16 @@ static void CG_ForcePushBodyBlur( centity_t *cent, const vec3_t origin, vec3_t t if (cent->gent->elbowLBolt>=0) { // Do the elbows - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->elbowLBolt, - &boltMatrix, tempAngles, origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->elbowLBolt, + &boltMatrix, tempAngles, origin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); CG_ForcePushBlur( fxOrg ); } if (cent->gent->elbowRBolt>=0) { - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->elbowRBolt, - &boltMatrix, tempAngles, origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->elbowRBolt, + &boltMatrix, tempAngles, origin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); CG_ForcePushBlur( fxOrg ); @@ -4364,8 +4368,8 @@ static void CG_ForceElectrocution( centity_t *cent, const vec3_t origin, vec3_t } if (bolt>=0) { - found = gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, bolt, - &boltMatrix, tempAngles, origin, cg.time, + found = gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, bolt, + &boltMatrix, tempAngles, origin, cg.time, cgs.model_draw, cent->currentState.modelScale); } // Make sure that it's safe to even try and get these values out of the Matrix, otherwise the values could be garbage @@ -4419,7 +4423,7 @@ static void CG_ForceElectrocution( centity_t *cent, const vec3_t origin, vec3_t if ( tr.fraction < 1.0f || random() > 0.94f || alwaysDo ) { FX_AddElectricity( -1, fxOrg, tr.endpos, - 1.5f, 4.0f, 0.0f, + 1.5f, 4.0f, 0.0f, 1.0f, 0.5f, 0.0f, rgb, rgb, 0.0f, 5.5f, random() * 50 + 100, shader, FX_ALPHA_LINEAR | FX_SIZE_LINEAR | FX_BRANCH | FX_GROW | FX_TAPER, -1, -1 ); @@ -4432,8 +4436,8 @@ static void CG_BoltedEffects( centity_t *cent, const vec3_t origin, vec3_t tempA { Vehicle_t *pVeh = cent->gent->m_pVehicle; gentity_t *parent = cent->gent; - if (pVeh->m_ulFlags&VEH_ARMORLOW - && (pVeh->m_iLastFXTime<=cg.time) + if (pVeh->m_ulFlags&VEH_ARMORLOW + && (pVeh->m_iLastFXTime<=cg.time) && Q_irand(0,1)==0 ) { pVeh->m_iLastFXTime = cg.time + 50;//Q_irand(50, 100); @@ -4457,7 +4461,7 @@ qboolean CG_PlayerCanSeeCent( centity_t *cent ) return qtrue; } - if ( g_entities[0].client->ps.forcePowerLevel[FP_SEE] < FORCE_LEVEL_2 + if ( g_entities[0].client->ps.forcePowerLevel[FP_SEE] < FORCE_LEVEL_2 && cent->currentState.eType != ET_PLAYER ) {//TEST: level 1 only sees force hints and enemies return qfalse; @@ -4501,7 +4505,7 @@ qboolean CG_PlayerCanSeeCent( centity_t *cent ) dot += (0.99f-dot)*centDist/range;//the farther away they are, the more in front they have to be AngleVectors( cg.refdefViewAngles, lookDir, NULL, NULL ); - + if ( DotProduct( centDir, lookDir ) < dot ) {//not in force sight cone return qfalse; @@ -4525,9 +4529,9 @@ void CG_AddForceSightShell( refEntity_t *ent, centity_t *cent ) // See through walls. ent->renderfx |= (RF_MORELIGHT|RF_NODEPTH); - if ( (cent->currentState.eFlags&EF_FORCE_VISIBLE) + if ( (cent->currentState.eFlags&EF_FORCE_VISIBLE) || (cent->currentState.eType == ET_PLAYER && cent->gent && cent->gent->message) ) - { + { ent->shaderRGBA[0] = 0; ent->shaderRGBA[1] = 0; ent->shaderRGBA[2] = 255; @@ -4603,7 +4607,7 @@ void CG_AddForceSightShell( refEntity_t *ent, centity_t *cent ) ent->renderfx &= ~RF_NODEPTH; } */ - + //FIXME: make it darker or more translucent the further away it is? cgi_R_AddRefEntityToScene( ent ); @@ -4652,15 +4656,15 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen ent->shaderRGBA[3] = gent->client->renderInfo.customRGBA[3]; // If certain states are active, we don't want to add in the regular body - if ( !gent->client->ps.powerups[PW_CLOAKED] && - !gent->client->ps.powerups[PW_UNCLOAKING] && + if ( !gent->client->ps.powerups[PW_CLOAKED] && + !gent->client->ps.powerups[PW_UNCLOAKING] && !gent->client->ps.powerups[PW_DISRUPTION] ) { cgi_R_AddRefEntityToScene( ent ); } - + // Disruptor Gun Alt-fire - if ( gent->client->ps.powerups[PW_DISRUPTION] ) + if ( gent->client->ps.powerups[PW_DISRUPTION] ) { // I guess when something dies, it looks like pos1 gets set to the impact point on death, we can do fun stuff with this vec3_t tempAng; @@ -4688,8 +4692,8 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen vec3_t fxOrg; mdxaBone_t boltMatrix; - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, gent->playerModel, gent->torsoBolt, - &boltMatrix, gent->currentAngles, ent->origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, gent->playerModel, gent->torsoBolt, + &boltMatrix, gent->currentAngles, ent->origin, cg.time, cgs.model_draw, gent->s.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); @@ -4709,8 +4713,8 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen if (( powerups & ( 1 << PW_UNCLOAKING ))) {//in the middle of cloaking - if ((cg.snap->ps.forcePowersActive & (1 << FP_SEE)) - && cg.snap->ps.clientNum != cent->currentState.number + if ((cg.snap->ps.forcePowersActive & (1 << FP_SEE)) + && cg.snap->ps.clientNum != cent->currentState.number && CG_PlayerCanSeeCent( cent )) {//just draw him cgi_R_AddRefEntityToScene( ent ); @@ -4718,7 +4722,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen else { float perc = (float)(gent->client->ps.powerups[PW_UNCLOAKING] - cg.time) / 2000.0f; - if (( powerups & ( 1 << PW_CLOAKED ))) + if (( powerups & ( 1 << PW_CLOAKED ))) {//actually cloaking, so reverse it perc = 1.0f - perc; } @@ -4741,10 +4745,10 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen } } } - else if (( powerups & ( 1 << PW_CLOAKED ))) + else if (( powerups & ( 1 << PW_CLOAKED ))) {//fully cloaked - if ((cg.snap->ps.forcePowersActive & (1 << FP_SEE)) - && cg.snap->ps.clientNum != cent->currentState.number + if ((cg.snap->ps.forcePowersActive & (1 << FP_SEE)) + && cg.snap->ps.clientNum != cent->currentState.number && CG_PlayerCanSeeCent( cent )) {//just draw him cgi_R_AddRefEntityToScene( ent ); @@ -4770,7 +4774,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen // Electricity //------------------------------------------------ - if ( (powerups & ( 1 << PW_SHOCKED )) ) + if ( (powerups & ( 1 << PW_SHOCKED )) ) { int dif = gent->client->ps.powerups[PW_SHOCKED] - cg.time; @@ -4778,7 +4782,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen { // fade out over the last 500 ms int brightness = 255; - + if ( dif < 500 ) { brightness = floor((dif - 500.0f) / 500.0f * 255.0f ); @@ -4790,7 +4794,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen if ( rand() & 1 ) { - ent->customShader = cgs.media.electricBodyShader; + ent->customShader = cgs.media.electricBodyShader; } else { @@ -4802,12 +4806,12 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen if ( random() > 0.9f ) cgi_S_StartSound ( ent->origin, gent->s.number, CHAN_AUTO, cgi_S_RegisterSound( "sound/effects/energy_crackle.wav" ) ); } - } + } // FORCE speed does blur trails //------------------------------------------------------ if ( cg_speedTrail.integer - && (gent->client->ps.forcePowersActive & (1 << FP_SPEED) //in force speed + && (gent->client->ps.forcePowersActive & (1 << FP_SPEED) //in force speed || cent->gent->client->ps.legsAnim == BOTH_FORCELONGLEAP_START//or force long jump - FIXME: only 1st half of that anim? || cent->gent->client->ps.legsAnim == BOTH_FORCELONGLEAP_ATTACK )//or force long jump attack && (gent->s.number || cg.renderingThirdPerson) ) // looks dumb doing this with first peron mode on @@ -4818,14 +4822,14 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen ex = CG_AllocLocalEntity(); ex->leType = LE_FADE_MODEL; memcpy( &ex->refEntity, ent, sizeof( refEntity_t )); - + ex->refEntity.renderfx |= (RF_ALPHA_FADE | RF_NOSHADOW | RF_G2MINLOD ) ; //ex->refEntity.renderfx |= RF_ALPHA_FADE; ex->startTime = cg.time; ex->endTime = ex->startTime + 75; VectorCopy( ex->refEntity.origin, ex->pos.trBase ); VectorClear( ex->pos.trDelta ); - + if ( gent->client->renderInfo.customRGBA[0] || gent->client->renderInfo.customRGBA[1] || gent->client->renderInfo.customRGBA[2] ) @@ -4843,7 +4847,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen // Personal Shields //------------------------ - if ( powerups & ( 1 << PW_BATTLESUIT )) + if ( powerups & ( 1 << PW_BATTLESUIT )) { float diff = gent->client->ps.powerups[PW_BATTLESUIT] - cg.time; float t; @@ -4852,7 +4856,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen { t = 1.0f - ( diff / (ARMOR_EFFECT_TIME * 2.0f)); // Only display when we have damage - if ( t < 0.0f || t > 1.0f ) + if ( t < 0.0f || t > 1.0f ) { } else @@ -4862,7 +4866,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen ent->renderfx &= ~RF_ALPHA_FADE; ent->renderfx |= RF_RGB_TINT; ent->customShader = cgs.media.personalShieldShader; - + cgi_R_AddRefEntityToScene( ent ); } } @@ -4943,7 +4947,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen if ( rand() & 1 ) { - ent->customShader = cgs.media.electricBodyShader; + ent->customShader = cgs.media.electricBodyShader; } else { @@ -4976,7 +4980,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen { ent->customShader = cgs.media.playerShieldDamage; } - + cgi_R_AddRefEntityToScene( ent ); } else if ( cent->gent->client->ps.forcePowersActive & (1 << FP_PROTECT) ) @@ -4996,7 +5000,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen { ent->customShader = cgs.media.playerShieldDamage; } - + cgi_R_AddRefEntityToScene( ent ); } else if ( cent->gent->client->ps.forcePowersActive & (1 << FP_ABSORB)) @@ -5016,16 +5020,16 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen { ent->customShader = cgs.media.playerShieldDamage; } - + cgi_R_AddRefEntityToScene( ent ); } - if ((cg.snap->ps.forcePowersActive & (1 << FP_SEE)) - && cg.snap->ps.clientNum != cent->currentState.number + if ((cg.snap->ps.forcePowersActive & (1 << FP_SEE)) + && cg.snap->ps.clientNum != cent->currentState.number && (cent->currentState.eFlags&EF_FORCE_VISIBLE || ((cent->gent->health > 0 || cent->gent->message ) && cent->currentState.eType == ET_PLAYER//other things handle this in their own render funcs - && CG_PlayerCanSeeCent( cent )) + && CG_PlayerCanSeeCent( cent )) ) ) {//force sight draws auras around living things @@ -5043,7 +5047,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen if ( rand() & 1 ) { - ent->customShader = cgs.media.electricBodyShader; + ent->customShader = cgs.media.electricBodyShader; } else { @@ -5089,16 +5093,16 @@ static void CG_G2SetHeadBlink( centity_t *cent, qboolean bStart ) } } gi.G2API_SetBoneAnglesIndex( &gent->ghoul2[gent->playerModel], hLeye, desiredAngles, - BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, blendTime, cg.time ); + BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, blendTime, cg.time ); const int hReye = gi.G2API_GetBoneIndex( &gent->ghoul2[0], "reye", qtrue ); if (hReye == -1) { return; } - + if (!bWink) gi.G2API_SetBoneAnglesIndex( &gent->ghoul2[gent->playerModel], hReye, desiredAngles, - BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, blendTime, cg.time ); + BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, blendTime, cg.time ); } /* @@ -5130,7 +5134,7 @@ static void CG_G2SetHeadAnim( centity_t *cent, int anim ) int lastFrame; if ( animSpeed < 0 ) {//play anim backwards - + lastFrame = animations[anim].firstFrame -1; firstFrame = (animations[anim].numFrames -1) + animations[anim].firstFrame ; } @@ -5143,7 +5147,7 @@ static void CG_G2SetHeadAnim( centity_t *cent, int anim ) // first decide if we are doing an animation on the head already // int startFrame, endFrame; // const qboolean animatingHead = gi.G2API_GetAnimRangeIndex(&gent->ghoul2[gent->playerModel], cent->gent->faceBone, &startFrame, &endFrame); - + // if (!animatingHead || ( animations[anim].firstFrame != startFrame ) )// only set the anim if we aren't going to do the same animation again { gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], cent->gent->faceBone, @@ -5157,26 +5161,26 @@ static qboolean CG_G2PlayerHeadAnims( centity_t *cent ) { return qfalse; } - + if (cent->gent->faceBone == BONE_INDEX_INVALID) { // i don't have a face return qfalse; } int anim = -1; - + if ( cent->gent->health <= 0 ) {//Dead people close their eyes and don't make faces! anim = FACE_DEAD; } - else + else { if (!cent->gent->client->facial_blink) { // set the timers cent->gent->client->facial_blink = cg.time + Q_flrand(4000.0, 8000.0); cent->gent->client->facial_timer = cg.time + Q_flrand(6000.0, 10000.0); } - + //are we blinking? if (cent->gent->client->facial_blink < 0) { // yes, check if we are we done blinking ? @@ -5186,8 +5190,8 @@ static qboolean CG_G2PlayerHeadAnims( centity_t *cent ) CG_G2SetHeadBlink( cent, qfalse ); //stop the blink } } - else // no we aren't blinking - { + else // no we aren't blinking + { if (cent->gent->client->facial_blink < cg.time)// but should we start ? { CG_G2SetHeadBlink( cent, qtrue ); @@ -5199,9 +5203,9 @@ static qboolean CG_G2PlayerHeadAnims( centity_t *cent ) { cent->gent->client->facial_blink = -(cg.time + 300.0f);// set blink timer } - } + } } - + if (gi.VoiceVolume[cent->gent->s.clientNum] > 0) // if we aren't talking, then it will be 0, -1 for talking but paused { @@ -5210,7 +5214,7 @@ static qboolean CG_G2PlayerHeadAnims( centity_t *cent ) if ( cent->gent->client->breathPuffTime > cg.time + 300 ) {//when talking, do breath puff cent->gent->client->breathPuffTime = cg.time; - } + } } else if (gi.VoiceVolume[cent->gent->s.clientNum] == -1 ) {//talking but silent @@ -5230,7 +5234,7 @@ static qboolean CG_G2PlayerHeadAnims( centity_t *cent ) anim = cent->gent->client->facial_anim; } } - else // no we aren't auxing + else // no we aren't auxing { // but should we start ? if (cent->gent->client->facial_timer < cg.time) {//yes @@ -5238,8 +5242,8 @@ static qboolean CG_G2PlayerHeadAnims( centity_t *cent ) // set aux timer cent->gent->client->facial_timer = -(cg.time + 2000.0); anim = cent->gent->client->facial_anim; - } - } + } + } }//talking }//dead if (anim != -1) @@ -5265,7 +5269,7 @@ int CG_PlayerHeadExtension( centity_t *cent, refEntity_t *head ) if (ci->extensions && (gi.VoiceVolume[cent->gent->s.clientNum] > 0)) {//FIXME: When talking, look at talkTarget, if any //ALSO: When talking, add a head bob/movement on syllables - when gi.VoiceVolume[] changes drastically - + if ( cent->gent->health <= 0 ) {//Dead people close their eyes and don't make faces! They also tell no tales... BUM BUM BAHHHHHHH! //Make them always blink and frown @@ -5283,7 +5287,7 @@ int CG_PlayerHeadExtension( centity_t *cent, refEntity_t *head ) int add_in = 0; // deal with blink first - + //Dead people close their eyes and don't make faces! They also tell no tales... BUM BUM BAHHHHHHH! if ( cent->gent->health <= 0 ) { @@ -5316,7 +5320,7 @@ int CG_PlayerHeadExtension( centity_t *cent, refEntity_t *head ) add_in = 4; } } - // no we aren't frowning + // no we aren't frowning else { // but should we start ? @@ -5352,7 +5356,7 @@ int CG_PlayerHeadExtension( centity_t *cent, refEntity_t *head ) cent->gent->client->facial_blink = cg.time + Q_flrand(3000.0, 5000.0); } } - // no we aren't blinking + // no we aren't blinking else { // but should we start ? @@ -5380,7 +5384,7 @@ int CG_PlayerHeadExtension( centity_t *cent, refEntity_t *head ) cent->gent->client->facial_frown = cg.time + Q_flrand(6000.0, 10000.0); } } - // no we aren't frowning + // no we aren't frowning else { // but should we start ? @@ -5420,7 +5424,7 @@ void CG_GetTagWorldPosition( refEntity_t *model, char *tag, vec3_t pos, vec3_t a 1.0f - model->backlerp, tag ); VectorCopy( model->origin, pos ); - for ( int i = 0 ; i < 3 ; i++ ) + for ( int i = 0 ; i < 3 ; i++ ) { VectorMA( pos, orientation.origin[i], model->axis[i], pos ); } @@ -5493,18 +5497,18 @@ static void CG_StopWeaponSounds( centity_t *cent ) } } - cgi_S_AddLoopingSound( cent->currentState.number, - cent->lerpOrigin, - vec3_origin, + cgi_S_AddLoopingSound( cent->currentState.number, + cent->lerpOrigin, + vec3_origin, cgs.sound_precache[g_entities[cent->currentState.clientNum].client->ps.saber[0].soundLoop] ); return; } if ( cent->currentState.weapon == WP_STUN_BATON || cent->currentState.weapon == WP_CONCUSSION ) { //idling sounds - cgi_S_AddLoopingSound( cent->currentState.number, - cent->lerpOrigin, - vec3_origin, + cgi_S_AddLoopingSound( cent->currentState.number, + cent->lerpOrigin, + vec3_origin, weapon->firingSound ); return; } @@ -5540,8 +5544,8 @@ void CG_SaberDoWeaponHitMarks( gclient_t *client, gentity_t *saberEnt, gentity_t { if ( client && sizeTimeScale > 0.0f - && hitEnt - && hitEnt->client + && hitEnt + && hitEnt->client && hitEnt->ghoul2.size() ) {//burn mark with glow //FIXME: set the correct angle based on direction of swing @@ -5549,7 +5553,7 @@ void CG_SaberDoWeaponHitMarks( gclient_t *client, gentity_t *saberEnt, gentity_t int lifeTime = (1.01-(float)(hitEnt->health)/hitEnt->max_health) * (float)Q_irand( 5000, 10000 ); float size = 0.0f; int weaponMarkShader = 0, markShader = cgs.media.bdecal_saberglowmark; - + //First: do mark decal on hitEnt if ( WP_SaberBladeUseSecondBladeStyle( &client->ps.saber[saberNum], bladeNum ) ) { @@ -5574,12 +5578,12 @@ void CG_SaberDoWeaponHitMarks( gclient_t *client, gentity_t *saberEnt, gentity_t size = Q_flrand( 2.0f, 3.0f ) * sizeTimeScale; CG_AddGhoul2Mark( markShader, size, hitPos, hitDir, hitEnt->s.number, hitEnt->client->ps.origin, hitEnt->client->renderInfo.legsYaw, hitEnt->ghoul2, hitEnt->s.modelScale, - lifeTime, 0, uaxis ); + lifeTime, 0, uaxis ); } //now do weaponMarkShader - splashback decal on weapon if ( WP_SaberBladeUseSecondBladeStyle( &client->ps.saber[saberNum], bladeNum ) ) - { + { if ( client->ps.saber[saberNum].g2WeaponMarkShader2[0] ) {//we have a shader to use instead of the standard mark shader weaponMarkShader = cgi_R_RegisterShader( client->ps.saber[saberNum].g2WeaponMarkShader2 ); @@ -5615,7 +5619,7 @@ void CG_SaberDoWeaponHitMarks( gclient_t *client, gentity_t *saberEnt, gentity_t { CG_AddGhoul2Mark( weaponMarkShader, size, hitPos, backDir, splatterOnCent->currentState.number, splatterOnCent->lerpOrigin, yawAngle, splatterOnCent->gent->ghoul2, splatterOnCent->currentState.modelScale, - lifeTime, saberNum+1, uaxis/*splashBackDir*/ ); + lifeTime, saberNum+1, uaxis/*splashBackDir*/ ); } } } @@ -5652,7 +5656,7 @@ static void CG_DoSaberLight( saberInfo_t *saber ) int lastBlade; //RGB combine all the colors of the sabers you're using into one averaged color! if ( !saber ) - { + { return; } @@ -5714,7 +5718,7 @@ static void CG_DoSaberLight( saberInfo_t *saber ) } if ( totallength ) - {//actually have something to do + {//actually have something to do if ( numpositions == 1 ) {//only 1 blade, midpoint is already set (halfway between the start and end of that blade), rgb is already set, so it diameter } @@ -5775,7 +5779,7 @@ static void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax // Find the midpoint of the saber for lighting purposes VectorMA( origin, length * 0.5f, dir, mid ); - + switch( color ) { case SABER_RED: @@ -5818,7 +5822,7 @@ static void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax // 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. + // 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 ) { @@ -5885,7 +5889,7 @@ static void CG_CreateSaberMarks( vec3_t start, vec3_t end, vec3_t normal ) CrossProduct( axis[1], axis[0], axis[2] ); // create the full polygon that we'll project - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { originalPoints[0][i] = start[i] - radius * axis[1][i] - radius * axis[2][i]; originalPoints[1][i] = end[i] + radius * axis[1][i] - radius * axis[2][i]; @@ -5900,19 +5904,19 @@ static void CG_CreateSaberMarks( vec3_t start, vec3_t end, vec3_t normal ) projection, MAX_MARK_POINTS, markPoints[0], MAX_MARK_FRAGMENTS, markFragments ); - for ( i = 0, mf = markFragments ; i < numFragments ; i++, mf++ ) + for ( i = 0, mf = markFragments ; i < numFragments ; i++, mf++ ) { // we have an upper limit on the complexity of polygons that we store persistantly - if ( mf->numPoints > MAX_VERTS_ON_POLY ) + if ( mf->numPoints > MAX_VERTS_ON_POLY ) { mf->numPoints = MAX_VERTS_ON_POLY; } - for ( j = 0, v = verts ; j < mf->numPoints ; j++, v++ ) + for ( j = 0, v = verts ; j < mf->numPoints ; j++, v++ ) { vec3_t delta; - // Set up our texture coords, this may need some work + // Set up our texture coords, this may need some work VectorCopy( markPoints[mf->firstPoint + j], v->xyz ); VectorAdd( end, start, mid ); VectorScale( mid, 0.5f, mid ); @@ -5954,7 +5958,7 @@ void CG_CheckSaberInWater( centity_t *cent, centity_t *scent, int saberNum, int { return; } - if ( !scent || + if ( !scent || modelIndex == -1 || scent->gent->ghoul2.size() <= modelIndex || scent->gent->ghoul2[modelIndex].mBltlist.size() <= 0 || //using a camera puts away your saber so you have no bolts @@ -5962,7 +5966,7 @@ void CG_CheckSaberInWater( centity_t *cent, centity_t *scent, int saberNum, int { return; } - if ( cent && cent->gent && cent->gent->client + if ( cent && cent->gent && cent->gent->client && (cent->gent->client->ps.saber[saberNum].saberFlags&SFL_ON_IN_WATER) ) {//saber can stay on underwater return; @@ -5990,7 +5994,7 @@ void CG_CheckSaberInWater( centity_t *cent, centity_t *scent, int saberNum, int static void CG_AddSaberBladeGo( centity_t *cent, centity_t *scent, refEntity_t *saber, int renderfx, int modelIndex, vec3_t origin, vec3_t angles, int saberNum, int bladeNum ) { - vec3_t org_, end,//org_future, + vec3_t org_, end,//org_future, axis_[3] = {{0,0,0}, {0,0,0}, {0,0,0}};//, axis_future[3]={0,0,0, 0,0,0, 0,0,0}; // shut the compiler up trace_t trace; float length; @@ -6011,7 +6015,7 @@ Ghoul2 Insert Start // if (scent->gent->ghoul2.size()) if(1) { - if ( !scent || + if ( !scent || modelIndex == -1 || scent->gent->ghoul2.size() <= modelIndex || scent->gent->ghoul2[modelIndex].mModelindex == -1 ) @@ -6391,8 +6395,8 @@ Ghoul2 Insert End if (cent->gent->rootBone>=0 && cent->gent->ghoul2.IsValid() && cent->gent->ghoul2[0].animModelIndexOffset)//If it has an animOffset it's a cinematic anim { //i might be running out of my bounding box, so get my root origin mdxaBone_t boltMatrix; - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->rootBone, - &boltMatrix, angles, cent->lerpOrigin, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->rootBone, + &boltMatrix, angles, cent->lerpOrigin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, rootOrigin ); } @@ -6450,7 +6454,7 @@ Ghoul2 Insert End {//tracing from base to end gi.trace( &trace, org_, NULL, NULL, end, cent->currentState.clientNum, traceMask|CONTENTS_WATER|CONTENTS_SLIME, (EG2_Collision)0, 0 ); } - + if ( trace.fraction < 1.0f ) { if ( (trace.contents&CONTENTS_WATER) || (trace.contents&CONTENTS_SLIME) ) @@ -6486,7 +6490,7 @@ Ghoul2 Insert End || ( WP_SaberBladeUseSecondBladeStyle( &client->ps.saber[saberNum], bladeNum ) && !(client->ps.saber[saberNum].saberFlags2&SFL2_NO_WALL_MARKS2) ) ) { if ( !(trace.surfaceFlags & SURF_NOIMPACT) // never spark on sky - && (trace.entityNum == ENTITYNUM_WORLD || cg_entities[trace.entityNum].currentState.solid == SOLID_BMODEL) + && (trace.entityNum == ENTITYNUM_WORLD || cg_entities[trace.entityNum].currentState.solid == SOLID_BMODEL) && Q_irand( 1, client->ps.saber[saberNum].numBlades ) == 1 ) { //was "sparks/spark" @@ -6496,7 +6500,7 @@ Ghoul2 Insert End // All I need is a bool to mark whether I have a previous point to work with. //....come up with something better.. if ( client->ps.saber[saberNum].blade[bladeNum].trail.haveOldPos[i] ) - { + { if ( trace.entityNum == ENTITYNUM_WORLD || (cg_entities[trace.entityNum].currentState.eFlags & EF_PERMANENT) || cg_entities[trace.entityNum].currentState.eType == ET_TERRAIN ) {//only put marks on architecture if ( (!WP_SaberBladeUseSecondBladeStyle( &client->ps.saber[saberNum], bladeNum ) && !(client->ps.saber[saberNum].saberFlags2&SFL2_NO_WALL_MARKS)) @@ -6504,7 +6508,7 @@ Ghoul2 Insert End { // Let's do some cool burn/glowing mark bits!!! CG_CreateSaberMarks( client->ps.saber[saberNum].blade[bladeNum].trail.oldPos[i], trace.endpos, trace.plane.normal ); - + if ( Q_irand( 1, client->ps.saber[saberNum].numBlades ) == 1 ) { //make a sound @@ -6518,13 +6522,13 @@ Ghoul2 Insert End } else if ( !i ) {//can put marks on G2 clients (but only on base to tip trace) - gentity_t *hitEnt = &g_entities[trace.entityNum]; + gentity_t *hitEnt = &g_entities[trace.entityNum]; vec3_t uaxis, splashBackDir; VectorSubtract(client->ps.saber[saberNum].blade[bladeNum].trail.oldPos[i], trace.endpos, uaxis); VectorScale( axis_[0], -1, splashBackDir ); //FIXME: if not hitting the first model on the enemy, don't do this! CG_SaberDoWeaponHitMarks( client, (scent!=NULL?scent->gent:NULL), hitEnt, saberNum, bladeNum, trace.endpos, axis_[0], uaxis, splashBackDir, 0.25f ); - } + } } else { @@ -6559,7 +6563,7 @@ Ghoul2 Insert End || (WP_SaberBladeUseSecondBladeStyle( &client->ps.saber[saberNum], bladeNum ) && !(client->ps.saber[saberNum].saberFlags2&SFL2_NO_WALL_MARKS2)) ) { // Hmmm, no impact this frame, but we have an old point - // Let's put the mark there, we should use an endcap mark to close the line, but we + // Let's put the mark there, we should use an endcap mark to close the line, but we // can probably just get away with a round mark //CG_ImpactMark( cgs.media.rivetMarkShader, client->ps.saber[saberNum].blade[bladeNum].trail.oldPos[i], client->ps.saber[saberNum].blade[bladeNum].trail.oldNormal[i], // 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, qfalse, 1.1f, qfalse ); @@ -6596,9 +6600,9 @@ Ghoul2 Insert End // if we happen to be timescaled or running in a high framerate situation, we don't want to flood // the system with very small trail slices...but perhaps doing it by distance would yield better results? if ( saberTrail->lastTime > cg.time ) - {//after a pause, cg.time jumps ahead in time for one frame + {//after a pause, cg.time jumps ahead in time for one frame //and lastTime gets set to that and will freak out, so, since - //it's never valid for saberTrail->lastTime to be > cg.time, + //it's never valid for saberTrail->lastTime to be > cg.time, //cap it to cg.time here saberTrail->lastTime = cg.time; } @@ -6614,7 +6618,7 @@ Ghoul2 Insert End ) { switch( client->ps.saber[saberNum].blade[bladeNum].color ) - { + { case SABER_RED: VectorSet( rgb1, 255.0f, 0.0f, 0.0f ); break; @@ -6654,9 +6658,9 @@ Ghoul2 Insert End fx->mShader = cgs.media.swordTrailShader; duration = saberTrail->duration/2.0f; // stay around twice as long VectorSet( rgb1, 32.0f, 32.0f, 32.0f ); // make the sith sword trail pretty faint - } - else - { + } + else + { fx->mShader = cgs.media.saberBlurShader; duration = saberTrail->duration/5.0f; } @@ -6683,7 +6687,7 @@ Ghoul2 Insert End // new tip VectorCopy( rgb1, fx->mVerts[1].rgb ); fx->mVerts[1].alpha = 255.0f; - + fx->mVerts[1].ST[0] = 0.0f; fx->mVerts[1].ST[1] = 0.0f; fx->mVerts[1].destST[0] = 0.99f; @@ -6705,12 +6709,12 @@ Ghoul2 Insert End fx->mVerts[3].ST[0] = 0.99f - oldAlpha; // NOTE: this just happens to contain the value I want fx->mVerts[3].ST[1] = 0.99f; fx->mVerts[3].destST[0] = 0.99f + fx->mVerts[2].ST[0]; - fx->mVerts[3].destST[1] = 0.99f; - + fx->mVerts[3].destST[1] = 0.99f; + // fx->SetFlags( FX_USE_ALPHA ); FX_AddPrimitive( (CEffect**)&fx, duration );//SABER_TRAIL_TIME ); } - } + } // we must always do this, even if we aren't active..otherwise we won't know where to pick up from VectorCopy( org_, saberTrail->base ); @@ -6728,7 +6732,7 @@ Ghoul2 Insert End qboolean noDlight = qfalse; if ( client->ps.saber[saberNum].numBlades >= 3 || (!WP_SaberBladeUseSecondBladeStyle( &client->ps.saber[saberNum], bladeNum ) && (client->ps.saber[saberNum].saberFlags2&SFL2_NO_DLIGHT) ) - || ( WP_SaberBladeUseSecondBladeStyle( &client->ps.saber[saberNum], bladeNum ) && (client->ps.saber[saberNum].saberFlags2&SFL2_NO_DLIGHT2) ) + || ( WP_SaberBladeUseSecondBladeStyle( &client->ps.saber[saberNum], bladeNum ) && (client->ps.saber[saberNum].saberFlags2&SFL2_NO_DLIGHT2) ) ) { noDlight = qtrue; @@ -6787,7 +6791,7 @@ CG_Player You can have and stack multiple animated pieces (not just legs and torso) You can attach "bolt-ons" that either animate or don't (weapons, heads, borg pieces) You can attach any object to any tag on any object (weapon on the head, etc.) - + Basically, keep a list of objects: Root object (in this case, the legs) with this info: model @@ -6814,7 +6818,7 @@ CG_Player tag to attach it's tag_parent to angle offset to attach it with - ALSO: + ALSO: Move the auto angle setting back up to the game Implement 3-axis scaling Implement alpha @@ -6834,7 +6838,7 @@ void CG_Player( centity_t *cent ) { float shadowPlane; const weaponData_t *wData = NULL; - if ( cent->currentState.eFlags & EF_NODRAW ) + if ( cent->currentState.eFlags & EF_NODRAW ) { return; } @@ -6873,7 +6877,7 @@ void CG_Player( centity_t *cent ) { ci = ¢->gent->client->clientInfo; - if ( !ci->infoValid ) + if ( !ci->infoValid ) { return; } @@ -6911,7 +6915,7 @@ Ghoul2 Insert Start // get the player model information ent.renderfx = 0; - if ( !cg.renderingThirdPerson || cg.zoomMode ) + if ( !cg.renderingThirdPerson || cg.zoomMode ) {//in first person or zoomed in if ( cg.snap->ps.viewEntity <= 0 || cg.snap->ps.viewEntity >= ENTITYNUM_WORLD) {//no viewentity @@ -6941,7 +6945,7 @@ Ghoul2 Insert Start ent.renderfx |= RF_SHADOW_ONLY; } - if ( (cg_shadows.integer == 2 && !in_camera) || (cg_shadows.integer == 3 && shadow) ) + if ( (cg_shadows.integer == 2 && !in_camera) || (cg_shadows.integer == 3 && shadow) ) { ent.renderfx |= RF_SHADOW_PLANE; } @@ -6976,8 +6980,8 @@ Ghoul2 Insert Start chair->gent->pos1[YAW] = AngleSubtract( cent->lerpAngles[YAW], chair->gent->s.angles[YAW] );//remember which dir our turret is facing for later cent->lerpAngles[ROLL] = 0; - BG_G2SetBoneAngles( chair, chair->gent, chair->gent->lowerLumbarBone, chair->gent->pos1, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_X, NEGATIVE_Y, cgs.model_draw ); - BG_G2SetBoneAngles( chair, chair->gent, chair->gent->upperLumbarBone, temp, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_X, NEGATIVE_Y, cgs.model_draw ); + BG_G2SetBoneAngles( chair, chair->gent, chair->gent->lowerLumbarBone, chair->gent->pos1, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_X, NEGATIVE_Y, cgs.model_draw ); + BG_G2SetBoneAngles( chair, chair->gent, chair->gent->upperLumbarBone, temp, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_X, NEGATIVE_Y, cgs.model_draw ); } else { @@ -6988,15 +6992,15 @@ Ghoul2 Insert Start chair->gent->s.apos.trBase[YAW] = cent->lerpAngles[YAW]; temp[PITCH] = -cent->lerpAngles[PITCH]; cent->lerpAngles[ROLL] = 0; - BG_G2SetBoneAngles( chair, chair->gent, chair->gent->lowerLumbarBone, temp, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, cgs.model_draw ); + BG_G2SetBoneAngles( chair, chair->gent, chair->gent->lowerLumbarBone, temp, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, cgs.model_draw ); } - //gi.G2API_SetBoneAngles( &chair->gent->ghoul2[0], "swivel_bone", temp, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, cgs.model_draw ); + //gi.G2API_SetBoneAngles( &chair->gent->ghoul2[0], "swivel_bone", temp, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, cgs.model_draw ); VectorCopy( temp, chair->gent->lastAngles ); gi.G2API_StopBoneAnimIndex( ¢->gent->ghoul2[cent->gent->playerModel], cent->gent->hipsBone ); // Getting the seat bolt here - gi.G2API_GetBoltMatrix( chair->gent->ghoul2, chair->gent->playerModel, chair->gent->headBolt, + gi.G2API_GetBoltMatrix( chair->gent->ghoul2, chair->gent->playerModel, chair->gent->headBolt, &boltMatrix, chair->gent->s.apos.trBase, chair->gent->currentOrigin, cg.time, cgs.model_draw, chair->currentState.modelScale ); @@ -7044,7 +7048,7 @@ Ghoul2 Insert Start CG_CalcEntityLerpPositions( vehEnt ); // Get the driver tag. mdxaBone_t boltMatrix; - gi.G2API_GetBoltMatrix( vehEnt->gent->ghoul2, vehEnt->gent->playerModel, vehEnt->gent->crotchBolt, + gi.G2API_GetBoltMatrix( vehEnt->gent->ghoul2, vehEnt->gent->playerModel, vehEnt->gent->crotchBolt, &boltMatrix, vehEnt->lerpAngles, vehEnt->lerpOrigin, (cg.time?cg.time:level.time), NULL, vehEnt->currentState.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, ent.origin ); @@ -7077,7 +7081,7 @@ Ghoul2 Insert Start } vec3_t rancAngles = {0}; rancAngles[YAW] = monster->lerpAngles[YAW]; - gi.G2API_GetBoltMatrix( monster->gent->ghoul2, monster->gent->playerModel, boltIndex, + gi.G2API_GetBoltMatrix( monster->gent->ghoul2, monster->gent->playerModel, boltIndex, &boltMatrix, rancAngles, monster->lerpOrigin, cg.time, cgs.model_draw, monster->currentState.modelScale ); // Storing ent position, bolt position, and bolt axis @@ -7132,8 +7136,8 @@ Ghoul2 Insert Start cent->gent->client->ps.eFlags &= ~(EF_HELD_BY_WAMPA|EF_HELD_BY_RANCOR); } } - else if ( (cent->gent->client->ps.eFlags&EF_HELD_BY_SAND_CREATURE) - && cent->gent + else if ( (cent->gent->client->ps.eFlags&EF_HELD_BY_SAND_CREATURE) + && cent->gent && cent->gent->activator ) { centity_t *sand_creature = &cg_entities[cent->gent->activator->s.number]; @@ -7144,7 +7148,7 @@ Ghoul2 Insert Start //in hand vec3_t scAngles = {0}; scAngles[YAW] = sand_creature->lerpAngles[YAW]; - gi.G2API_GetBoltMatrix( sand_creature->gent->ghoul2, sand_creature->gent->playerModel, sand_creature->gent->gutBolt, + gi.G2API_GetBoltMatrix( sand_creature->gent->ghoul2, sand_creature->gent->playerModel, sand_creature->gent->gutBolt, &boltMatrix, scAngles, sand_creature->lerpOrigin, cg.time, cgs.model_draw, sand_creature->currentState.modelScale ); // Storing ent position, bolt position, and bolt axis @@ -7173,13 +7177,13 @@ Ghoul2 Insert Start } else { -//--------------- +//--------------- CG_G2PlayerAngles( cent, ent.axis, tempAngles); //Deal with facial expressions CG_G2PlayerHeadAnims( cent ); - + /* - if ( cent->gent->client->ps.eFlags & EF_FORCE_DRAINED + if ( cent->gent->client->ps.eFlags & EF_FORCE_DRAINED && !VectorCompare( cent->gent->client->ps.forceDrainOrg, vec3_origin ) ) {//HACKHACKHACK!!!! being drained VectorCopy( cent->gent->client->ps.forceDrainOrg, ent.origin); @@ -7196,8 +7200,8 @@ Ghoul2 Insert Start } VectorCopy( ent.origin, ent.oldorigin); VectorCopy( ent.origin, ent.lightingOrigin ); - } - + } + if ( cent->gent && cent->gent->client ) { cent->gent->client->ps.legsYaw = tempAngles[YAW]; @@ -7206,14 +7210,14 @@ Ghoul2 Insert Start //HACK - add swoop model /* - if ( cent->currentState.vehicleIndex != VEHICLE_NONE + if ( cent->currentState.vehicleIndex != VEHICLE_NONE && g_vehicleInfo[cent->currentState.vehicleIndex].type == VH_SPEEDER ) {//add it at my origin //FIXME: should be a G2 model refEntity_t swoopEnt; memset (&swoopEnt, 0, sizeof(swoopEnt)); - + VectorCopy( cent->lerpOrigin, swoopEnt.origin ); VectorMA( swoopEnt.origin, -32, ent.axis[2], swoopEnt.origin ); VectorCopy( swoopEnt.origin, swoopEnt.oldorigin ); @@ -7228,7 +7232,7 @@ extern vmCvar_t cg_thirdPersonAlpha; if ( (cent->gent->s.number == 0 || G_ControlledByPlayer( cent->gent )) ) { - float alpha = 1.0f; + float alpha = 1.0f; if ( (cg.overrides.active&CG_OVERRIDE_3RD_PERSON_APH) ) { alpha = cg.overrides.thirdPersonAlpha; @@ -7250,7 +7254,7 @@ extern vmCvar_t cg_thirdPersonAlpha; if ( cent->gent && cent->gent->health > 0 && cent->gent->max_health > 0 ) {//draw a health bar over them CG_AddHealthBarEnt( cent->currentState.clientNum ); - } + } } CG_AddRefEntityWithPowerups( &ent, cent->currentState.powerups, cent ); VectorCopy( tempAngles, cent->renderAngles ); @@ -7264,9 +7268,9 @@ extern vmCvar_t cg_thirdPersonAlpha; VectorCopy( ent.origin, cent->gent->client->renderInfo.torsoPoint ); VectorCopy( cent->lerpAngles, cent->gent->client->renderInfo.torsoAngles ); VectorCopy( ent.origin, cent->gent->client->renderInfo.crotchPoint ); - if ( cent->currentState.number != 0 - || cg.renderingThirdPerson - || cg.snap->ps.stats[STAT_HEALTH] <= 0 + if ( cent->currentState.number != 0 + || cg.renderingThirdPerson + || cg.snap->ps.stats[STAT_HEALTH] <= 0 || ( !cg.renderingThirdPerson && (cg.snap->ps.weapon == WP_SABER||cg.snap->ps.weapon == WP_MELEE) )//First person saber ) {//in some third person mode or NPC @@ -7286,41 +7290,41 @@ extern vmCvar_t cg_thirdPersonAlpha; if ( cent->gent->handRBolt != -1 ) { - //Get handRPoint - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->handRBolt, - &boltMatrix, G2Angles, ent.origin, cg.time, + //Get handRPoint + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->handRBolt, + &boltMatrix, G2Angles, ent.origin, cg.time, cgs.model_draw, cent->currentState.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, cent->gent->client->renderInfo.handRPoint ); } if ( cent->gent->handLBolt != -1 ) { //always get handLPoint too...? - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->handLBolt, - &boltMatrix, G2Angles, ent.origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->handLBolt, + &boltMatrix, G2Angles, ent.origin, cg.time, cgs.model_draw, cent->currentState.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, cent->gent->client->renderInfo.handLPoint ); } if ( cent->gent->footLBolt != -1 ) { //get the feet - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footLBolt, - &boltMatrix, G2Angles, ent.origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footLBolt, + &boltMatrix, G2Angles, ent.origin, cg.time, cgs.model_draw, cent->currentState.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, cent->gent->client->renderInfo.footLPoint ); } - + if ( cent->gent->footRBolt != -1 ) { - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footRBolt, - &boltMatrix, G2Angles, ent.origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footRBolt, + &boltMatrix, G2Angles, ent.origin, cg.time, cgs.model_draw, cent->currentState.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, cent->gent->client->renderInfo.footRPoint ); } //Handle saber - if ( cent->gent - && cent->gent->client - && ( cent->currentState.weapon == WP_SABER || cent->gent->client->ps.saberInFlight ) + if ( cent->gent + && cent->gent->client + && ( cent->currentState.weapon == WP_SABER || cent->gent->client->ps.saberInFlight ) && cent->gent->client->NPC_class != CLASS_ATST ) {//FIXME: somehow saberactive is getting lost over the network //loop this and do for both sabers @@ -7338,7 +7342,7 @@ extern vmCvar_t cg_thirdPersonAlpha; //loop this and do for both blades for ( int bladeNum = 0; bladeNum < cent->gent->client->ps.saber[saberNum].numBlades; bladeNum++ ) { - if ( !cent->gent->client->ps.saber[saberNum].blade[bladeNum].active || + if ( !cent->gent->client->ps.saber[saberNum].blade[bladeNum].active || cent->gent->client->ps.saber[saberNum].blade[bladeNum].length > cent->gent->client->ps.saber[saberNum].blade[bladeNum].lengthMax )//hack around network lag for now {//saber blade is off if ( cent->gent->client->ps.saber[saberNum].blade[bladeNum].length > 0 ) @@ -7353,14 +7357,14 @@ extern vmCvar_t cg_thirdPersonAlpha; } } } - else + else {//saber blade is on if ( cent->gent->client->ps.saber[saberNum].blade[bladeNum].length < cent->gent->client->ps.saber[saberNum].blade[bladeNum].lengthMax ) { if ( !cent->gent->client->ps.saber[saberNum].blade[bladeNum].length ) { qhandle_t saberOnSound = cgs.sound_precache[g_entities[cent->currentState.clientNum].client->ps.saber[saberNum].soundOn]; - if ( !cent->gent->client->ps.weaponTime + if ( !cent->gent->client->ps.weaponTime && !saberNum//first saber only && !bladeNum )//first blade only {//make us play the turn on anim @@ -7408,8 +7412,8 @@ extern vmCvar_t cg_thirdPersonAlpha; { if ( !cent->gent->client->ps.saberInFlight || saberNum != 0 )//&& cent->gent->client->ps.saberActive) {//holding the saber in-hand - // CGhoul2Info *currentModel = ¢->gent->ghoul2[1]; - // CGhoul2Info *nextModel = ¢->gent->ghoul2[1]; + // CGhoul2Info *currentModel = ¢->gent->ghoul2[1]; + // CGhoul2Info *nextModel = ¢->gent->ghoul2[1]; //FIXME: need a version of this that *doesn't* need the mFileName in the ghoul2 //FIXME: use an actual surfaceIndex? char handName[MAX_QPATH]; @@ -7444,17 +7448,17 @@ extern vmCvar_t cg_thirdPersonAlpha; CG_CheckSaberInWater( cent, cent, saberNum, cent->gent->weaponModel[saberNum], ent.origin, tempAngles ); } } - if ( cent->currentState.weapon == WP_SABER + if ( cent->currentState.weapon == WP_SABER && (cent->gent->client->ps.saber[saberNum].blade[bladeNum].length > 0 || cent->gent->client->ps.saberInFlight) ) { calcedMp = qtrue; - } + } } } //add the light if ( cent->gent->client->ps.dualSabers ) { - if ( cent->gent->client->ps.saber[0].Length() > 0.0f + if ( cent->gent->client->ps.saber[0].Length() > 0.0f && !cent->gent->client->ps.saberInFlight ) { if ( cent->gent->client->ps.saber[0].numBlades > 2 ) @@ -7480,23 +7484,23 @@ extern vmCvar_t cg_thirdPersonAlpha; } } - if ( cent->currentState.number != 0 - || cg.renderingThirdPerson - || cg.snap->ps.stats[STAT_HEALTH] <= 0 + if ( cent->currentState.number != 0 + || cg.renderingThirdPerson + || cg.snap->ps.stats[STAT_HEALTH] <= 0 || ( !cg.renderingThirdPerson && (cg.snap->ps.weapon == WP_SABER||cg.snap->ps.weapon == WP_MELEE) )//First person saber ) {//if NPC, third person, or dead, unless using saber //Get eyePoint & eyeAngles /* - if ( cg.snap->ps.viewEntity > 0 - && cg.snap->ps.viewEntity < ENTITYNUM_WORLD + if ( cg.snap->ps.viewEntity > 0 + && cg.snap->ps.viewEntity < ENTITYNUM_WORLD && cg.snap->ps.viewEntity == cent->currentState.clientNum ) {//player is in an entity camera view, ME VectorCopy( ent.origin, cent->gent->client->renderInfo.eyePoint ); VectorCopy( tempAngles, cent->gent->client->renderInfo.eyeAngles ); VectorCopy( ent.origin, cent->gent->client->renderInfo.headPoint ); } - else + else */if ( cent->gent->headBolt == -1 ) {//no headBolt VectorCopy( ent.origin, cent->gent->client->renderInfo.eyePoint ); @@ -7652,7 +7656,7 @@ extern vmCvar_t cg_thirdPersonAlpha; if ( cent->gent->m_pVehicle->m_iMuzzleTag[i] != -1 ) { gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->m_pVehicle->m_iMuzzleTag[i], &boltMatrix, cent->lerpAngles, ent.origin, cg.time, cgs.model_draw, cent->currentState.modelScale ); - gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, cent->gent->m_pVehicle->m_Muzzles[i].m_vMuzzlePos ); + gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, cent->gent->m_pVehicle->m_Muzzles[i].m_vMuzzlePos ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, NEGATIVE_Y, cent->gent->m_pVehicle->m_Muzzles[i].m_vMuzzleDir ); VectorMA(cent->gent->m_pVehicle->m_Muzzles[i].m_vMuzzlePos, 0.075f, velocity, cent->gent->m_pVehicle->m_Muzzles[i].m_vMuzzlePos); } @@ -7678,7 +7682,7 @@ extern vmCvar_t cg_thirdPersonAlpha; oldOne = (cent->gent->count)?0:1; } if ( ( cent->gent->weaponModel[cent->gent->count] != -1) - && ( cent->gent->ghoul2.size() > cent->gent->weaponModel[cent->gent->count] ) + && ( cent->gent->ghoul2.size() > cent->gent->weaponModel[cent->gent->count] ) && ( cent->gent->ghoul2[cent->gent->weaponModel[cent->gent->count]].mModelindex != -1) ) {//get whichever one we're using now mdxaBone_t boltMatrix; @@ -7781,7 +7785,7 @@ extern vmCvar_t cg_thirdPersonAlpha; } else {//use the current one - theFxScheduler.PlayEffect( effect, cent->gent->client->renderInfo.muzzlePoint, + theFxScheduler.PlayEffect( effect, cent->gent->client->renderInfo.muzzlePoint, cent->gent->client->renderInfo.muzzleDir ); } } @@ -7809,7 +7813,7 @@ extern vmCvar_t cg_thirdPersonAlpha; {//being pushed CG_ForcePushBodyBlur( cent, ent.origin, tempAngles ); } - + //This is now being done via an effect and the animevents.cfg //if ( cent->gent->client->ps.powerups[PW_FORCE_PUSH] > cg.time || if ( (cent->gent->client->ps.forcePowersActive & (1<gent->client->renderInfo.handLPoint, fxDir );//theFxScheduler.RegisterEffect( "force/dr1" ) } - if ( cent->gent->client->ps.forcePowersActive&(1<gent->client->ps.forcePowersActive&(1<gent->client->ps.forceDrainEntityNum >= ENTITYNUM_WORLD ) {//doing the draining and not on a single person vec3_t tAng, fxDir; @@ -7894,7 +7898,7 @@ extern vmCvar_t cg_thirdPersonAlpha; AngleVectors( cent->gent->client->renderInfo.eyeAngles, eyeFwd, NULL, NULL ); theFxScheduler.PlayEffect( "rockettrooper/light_cone", cent->gent->client->renderInfo.eyePoint, eyeFwd ); // stay a bit back from the server-side's trace impact point...this may not be enough? - VectorMA( cent->gent->client->renderInfo.eyePoint, cent->gent->speed - 5, eyeFwd, org ); + VectorMA( cent->gent->client->renderInfo.eyePoint, cent->gent->speed - 5, eyeFwd, org ); float radius = cent->gent->speed; if ( radius < 128.0f ) { @@ -7909,7 +7913,7 @@ extern vmCvar_t cg_thirdPersonAlpha; } //"refraction" effect -rww if ( cent->gent->client->ps.powerups[PW_FORCE_PUSH] > cg.time ) - { + { CG_ForcePushRefraction(cent->gent->client->renderInfo.handLPoint, cent); } else if ( cent->gent->client->ps.powerups[PW_FORCE_PUSH_RHAND] > cg.time ) @@ -7930,7 +7934,7 @@ extern vmCvar_t cg_thirdPersonAlpha; if ( cent->gent && cent->gent->client && cent->gent->client->ps.weapon == WP_SABER ) { extern qboolean PM_KickingAnim( int anim ); - if ( !PM_KickingAnim( cent->gent->client->ps.torsoAnim ) + if ( !PM_KickingAnim( cent->gent->client->ps.torsoAnim ) || cent->gent->client->ps.torsoAnim == BOTH_A7_KICK_S ) {//not kicking (unless it's the spinning kick) if ( cg_timescale.value < 1.0f && (cent->gent->client->ps.forcePowersActive&(1<ps.viewEntity <= 0 || cg.snap->ps.viewEntity >= ENTITYNUM_WORLD) {//no viewentity @@ -8027,8 +8031,8 @@ Ghoul2 Insert End } } } - - if ( (cg_shadows.integer == 2) || (cg_shadows.integer == 3 && shadow) ) + + if ( (cg_shadows.integer == 2) || (cg_shadows.integer == 3 && shadow) ) { renderfx |= RF_SHADOW_PLANE; } @@ -8063,7 +8067,7 @@ Ghoul2 Insert End VectorCopy( cent->lerpOrigin, legs.origin ); - //Scale applied to a refEnt will apply to any models attached to it... + //Scale applied to a refEnt will apply to any models attached to it... //This seems to copy the scale to every piece attached, kinda cool, but doesn't //allow the body to be scaled up without scaling a bolt on or whatnot... //Only apply scale if it's not 100% scale... @@ -8098,7 +8102,7 @@ Ghoul2 Insert End CG_AddRefEntityWithPowerups( &legs, cent->currentState.powerups, cent ); // if the model failed, allow the default nullmodel to be displayed - if (!legs.hModel) + if (!legs.hModel) { return; } @@ -8107,7 +8111,7 @@ Ghoul2 Insert End // add the torso // torso.hModel = ci->torsoModel; - if (torso.hModel) + if (torso.hModel) { orientation_t tag_torso; @@ -8128,7 +8132,7 @@ Ghoul2 Insert End // add the head // head.hModel = ci->headModel; - if (head.hModel) + if (head.hModel) { orientation_t tag_head; @@ -8181,7 +8185,7 @@ Ghoul2 Insert End weapon = &cg_weapons[cent->currentState.weapon]; gun.hModel = weapon->weaponWorldModel; - if (gun.hModel) + if (gun.hModel) { qboolean drawGun = qtrue; //FIXME: allow scale, animation and angle offsets @@ -8189,7 +8193,7 @@ Ghoul2 Insert End //FIXME: allow it to be put anywhere and move this out of if(torso.hModel) //Will have to call CG_PositionRotatedEntityOnTag - + CG_PositionEntityOnTag( &gun, &torso, torso.hModel, "tag_weapon"); //--------------------- start saber hacks @@ -8275,7 +8279,7 @@ Ghoul2 Insert End if ( drawGun ) { - CG_AddRefEntityWithPowerups( &gun, + CG_AddRefEntityWithPowerups( &gun, (cent->currentState.powerups & ((1<muzzleFlashTime > 0 && wData && !(cent->currentState.eFlags & EF_LOCKED_TO_WEAPON )) { @@ -8328,7 +8332,7 @@ Ghoul2 Insert End } } } - + if ( !calcedMp && !(cent->currentState.eFlags & EF_LOCKED_TO_WEAPON )) {// Set the muzzle point orientation_t orientation; @@ -8338,7 +8342,7 @@ Ghoul2 Insert End // FIXME: allow origin offsets along tag? VectorCopy( gun.origin, cent->gent->client->renderInfo.muzzlePoint ); - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { VectorMA( cent->gent->client->renderInfo.muzzlePoint, orientation.origin[i], gun.axis[i], cent->gent->client->renderInfo.muzzlePoint ); } @@ -8367,8 +8371,8 @@ Ghoul2 Insert End { playerState_t *ps = &cg.predicted_player_state; - if (( ps->weaponstate == WEAPON_CHARGING_ALT && ps->weapon == WP_BRYAR_PISTOL ) - || ( ps->weaponstate == WEAPON_CHARGING_ALT && ps->weapon == WP_BLASTER_PISTOL ) + if (( ps->weaponstate == WEAPON_CHARGING_ALT && ps->weapon == WP_BRYAR_PISTOL ) + || ( ps->weaponstate == WEAPON_CHARGING_ALT && ps->weapon == WP_BLASTER_PISTOL ) || ( ps->weapon == WP_BOWCASTER && ps->weaponstate == WEAPON_CHARGING ) || ( ps->weapon == WP_DEMP2 && ps->weaponstate == WEAPON_CHARGING_ALT )) { @@ -8432,7 +8436,7 @@ on and coontinue from there. */ void CG_ResetPlayerEntity( centity_t *cent ) { // cent->errorTime = -99999; // guarantee no error decay added -// cent->extrapolated = qfalse; +// cent->extrapolated = qfalse; if ( cent->gent && cent->gent->ghoul2.size() ) { diff --git a/code/cgame/cg_playerstate.cpp b/code/cgame/cg_playerstate.cpp index b02eaf59c0..1f6321fd9e 100644 --- a/code/cgame/cg_playerstate.cpp +++ b/code/cgame/cg_playerstate.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_playerstate.c -- this file acts on changes in a new playerState_t // With normal play, this will be done after local prediction, but when diff --git a/code/cgame/cg_predict.cpp b/code/cgame/cg_predict.cpp index 4db1ea6564..3caa7a38c2 100644 --- a/code/cgame/cg_predict.cpp +++ b/code/cgame/cg_predict.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_predict.c -- this file generates cg.predicted_player_state by either // interpolating between snapshots from the server or locally predicting diff --git a/code/cgame/cg_public.h b/code/cgame/cg_public.h index c1968db095..a17bb5a7f5 100644 --- a/code/cgame/cg_public.h +++ b/code/cgame/cg_public.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef _CG_PUBLIC_H #define _CG_PUBLIC_H diff --git a/code/cgame/cg_scoreboard.cpp b/code/cgame/cg_scoreboard.cpp index 722dbd5579..a085b050dc 100644 --- a/code/cgame/cg_scoreboard.cpp +++ b/code/cgame/cg_scoreboard.cpp @@ -1,22 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" diff --git a/code/cgame/cg_servercmds.cpp b/code/cgame/cg_servercmds.cpp index d1d80e3760..5f1f569992 100644 --- a/code/cgame/cg_servercmds.cpp +++ b/code/cgame/cg_servercmds.cpp @@ -1,24 +1,28 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_servercmds.c -- text commands sent by the server -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" diff --git a/code/cgame/cg_snapshot.cpp b/code/cgame/cg_snapshot.cpp index 91a009afe9..1e0c9fd244 100644 --- a/code/cgame/cg_snapshot.cpp +++ b/code/cgame/cg_snapshot.cpp @@ -1,25 +1,29 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_snapshot.c -- things that happen on snapshot transition, // not necessarily every single frame -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" diff --git a/code/cgame/cg_syscalls.cpp b/code/cgame/cg_syscalls.cpp index a943bb8aa4..41092b3fd9 100644 --- a/code/cgame/cg_syscalls.cpp +++ b/code/cgame/cg_syscalls.cpp @@ -1,25 +1,28 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" - // this file is only included when building a dll //prototypes diff --git a/code/cgame/cg_text.cpp b/code/cgame/cg_text.cpp index 9e484b2ccd..e250f331e3 100644 --- a/code/cgame/cg_text.cpp +++ b/code/cgame/cg_text.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_text.c -- @@ -242,7 +246,7 @@ void CG_CaptionText( const char *str, int sound) // we only care about some sound dirs... if (!Q_stricmpn(str,"sound/chars/",12)) // whichever language it is, it'll be pathed as english at this point { - Com_Printf("WARNING: CG_CaptionText given invalid text key :'%s'\n",str); + Com_Printf("WARNING: CG_CaptionText given invalid text key: '%s'\n", str); } else { diff --git a/code/cgame/cg_view.cpp b/code/cgame/cg_view.cpp index a3b37a6d0f..7119bb82e2 100644 --- a/code/cgame/cg_view.cpp +++ b/code/cgame/cg_view.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_view.c -- setup all the parameters (position, angle, etc) // for a 3D rendering @@ -49,7 +54,7 @@ enhanced into a single model testing facility. Model viewing can begin with either "testmodel " or "testgun ". -The names must be the full pathname after the basedir, like +The names must be the full pathname after the basedir, like "models/weapons/v_launch/tris.md3" or "players/male/tris.md3" Testmodel will create a fake entity 100 units in front of the current view @@ -133,7 +138,7 @@ void CG_ListModelSurfaces_f (void) void CG_ListModelBones_f (void) { // test to see if we got enough args - if ( cgi_Argc() < 2 ) + if ( cgi_Argc() < 2 ) { return; } @@ -145,7 +150,7 @@ void CG_ListModelBones_f (void) void CG_TestModelSurfaceOnOff_f(void) { // test to see if we got enough args - if ( cgi_Argc() < 3 ) + if ( cgi_Argc() < 3 ) { return; } @@ -158,14 +163,14 @@ void CG_TestModelSetAnglespre_f(void) { vec3_t angles; - if ( cgi_Argc() < 3 ) + if ( cgi_Argc() < 3 ) { return; } CGhoul2Info_v &ghoul2 = *((CGhoul2Info_v *)cg.testModelEntity.ghoul2); - angles[0] = atof(CG_Argv(2)); - angles[1] = atof(CG_Argv(3)); + angles[0] = atof(CG_Argv(2)); + angles[1] = atof(CG_Argv(3)); angles[2] = atof(CG_Argv(4)); gi.G2API_SetBoneAngles(&ghoul2[cg.testModel], CG_Argv(1), angles, BONE_ANGLES_PREMULT, POSITIVE_X, POSITIVE_Z, POSITIVE_Y, NULL, 0, 0); } @@ -174,14 +179,14 @@ void CG_TestModelSetAnglespost_f(void) { vec3_t angles; - if ( cgi_Argc() < 3 ) + if ( cgi_Argc() < 3 ) { return; } CGhoul2Info_v &ghoul2 = *((CGhoul2Info_v *)cg.testModelEntity.ghoul2); - angles[0] = atof(CG_Argv(2)); - angles[1] = atof(CG_Argv(3)); + angles[0] = atof(CG_Argv(2)); + angles[1] = atof(CG_Argv(3)); angles[2] = atof(CG_Argv(4)); gi.G2API_SetBoneAngles(&ghoul2[cg.testModel], CG_Argv(1), angles, BONE_ANGLES_POSTMULT, POSITIVE_X, POSITIVE_Z, POSITIVE_Y, NULL, 0, 0); } @@ -267,7 +272,7 @@ void CG_TestModelPrevSkin_f (void) { } static void CG_AddTestModel (void) { - // re-register the model, because the level may have changed + // re-register the model, because the level may have changed /* cg.testModelEntity.hModel = cgi_R_RegisterModel( cg.testModelName ); if (! cg.testModelEntity.hModel ) { CG_Printf ("Can't register model\n"); @@ -334,7 +339,7 @@ cg.refdefViewAngles =============== */ - + /* =============== CG_CalcIdealThirdPersonViewTarget @@ -372,13 +377,13 @@ static void CG_CalcIdealThirdPersonViewTarget(void) // Add in the new viewheight cameraFocusLoc[2] += cg.predicted_player_state.viewheight; - if ( cg.snap + if ( cg.snap && (cg.snap->ps.eFlags&EF_HELD_BY_SAND_CREATURE) ) { VectorCopy( cameraFocusLoc, cameraIdealTarget ); cameraIdealTarget[2] += 192; } - else if ( cg.snap + else if ( cg.snap && (cg.snap->ps.eFlags&EF_HELD_BY_WAMPA) ) { VectorCopy( cameraFocusLoc, cameraIdealTarget ); @@ -407,7 +412,7 @@ static void CG_CalcIdealThirdPersonViewTarget(void) VectorCopy(cameraFocusLoc, nudgepos); nudgepos[2]+=CAMERA_CROUCH_NUDGE; - CG_Trace(&trace, cameraFocusLoc, cameramins, cameramaxs, nudgepos, + CG_Trace(&trace, cameraFocusLoc, cameramins, cameramaxs, nudgepos, ( usesViewEntity ) ? cg.snap->ps.viewEntity : cg.predicted_player_state.clientNum, MASK_CAMERACLIP); if (trace.fraction < 1.0) { @@ -420,7 +425,7 @@ static void CG_CalcIdealThirdPersonViewTarget(void) } } - + /* =============== @@ -434,20 +439,20 @@ static void CG_CalcIdealThirdPersonViewLocation(void) { VectorMA(cameraIdealTarget, -(cg.overrides.thirdPersonRange), camerafwd, cameraIdealLoc); } - else if ( cg.snap + else if ( cg.snap && (cg.snap->ps.eFlags&EF_HELD_BY_RANCOR) && cg_entities[cg.snap->ps.clientNum].gent->activator ) {//stay back VectorMA(cameraIdealTarget, -180.0f*cg_entities[cg.snap->ps.clientNum].gent->activator->s.modelScale[0], camerafwd, cameraIdealLoc); } - else if ( cg.snap + else if ( cg.snap && (cg.snap->ps.eFlags&EF_HELD_BY_WAMPA) && cg_entities[cg.snap->ps.clientNum].gent->activator && cg_entities[cg.snap->ps.clientNum].gent->activator->inuse ) {//stay back VectorMA(cameraIdealTarget, -120.0f*cg_entities[cg.snap->ps.clientNum].gent->activator->s.modelScale[0], camerafwd, cameraIdealLoc); } - else if ( cg.snap + else if ( cg.snap && (cg.snap->ps.eFlags&EF_HELD_BY_SAND_CREATURE) && cg_entities[cg.snap->ps.clientNum].gent->activator ) {//stay back @@ -457,7 +462,7 @@ static void CG_CalcIdealThirdPersonViewLocation(void) { VectorMA(cameraIdealTarget, -(cg_thirdPersonRange.value), camerafwd, cameraIdealLoc); } - + if ( cg.renderingThirdPerson && (cg.snap->ps.forcePowersActive&(1<client->ps.forcePowerDuration[FP_SPEED] ) { float timeLeft = player->client->ps.forcePowerDuration[FP_SPEED] - cg.time; @@ -545,7 +550,7 @@ static void CG_UpdateThirdPersonTargetDamp(void) VectorCopy(cameraIdealTarget, cameraCurTarget); } else if (cg_thirdPersonTargetDamp.value>=0.0) - { + { // Calculate the difference from the current position to the new one. VectorSubtract(cameraIdealTarget, cameraCurTarget, targetdiff); @@ -554,13 +559,13 @@ static void CG_UpdateThirdPersonTargetDamp(void) dampfactor = 1.0-cg_thirdPersonTargetDamp.value; // We must exponent the amount LEFT rather than the amount bled off dtime = (float)(cg.time-cameraLastFrame) * (1.0/cg_timescale.value) * (1.0/(float)CAMERA_DAMP_INTERVAL); // Our dampfactor is geared towards a time interval equal to "1". - // Note that since there are a finite number of "practical" delta millisecond values possible, + // Note that since there are a finite number of "practical" delta millisecond values possible, // the ratio should be initialized into a chart ultimately. if ( cg_smoothCamera.integer ) ratio = powf( dampfactor, dtime ); else ratio = Q_powf( dampfactor, dtime ); - + // This value is how much distance is "left" from the ideal. VectorMA(cameraIdealTarget, -ratio, targetdiff, cameraCurTarget); ///////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -570,7 +575,7 @@ static void CG_UpdateThirdPersonTargetDamp(void) // First thing we do is trace from the first person viewpoint out to the new target location. if ( cg.snap - && (cg.snap->ps.eFlags&EF_HELD_BY_SAND_CREATURE) + && (cg.snap->ps.eFlags&EF_HELD_BY_SAND_CREATURE) && cg_entities[cg.snap->ps.clientNum].gent->activator ) {//if being held by a sand creature, trace from his actual origin, since we could be underground or otherwise in solid once he eats us CG_Trace(&trace, cg_entities[cg_entities[cg.snap->ps.clientNum].gent->activator->s.number].lerpOrigin, cameramins, cameramaxs, cameraCurTarget, cg.predicted_player_state.clientNum, MASK_CAMERACLIP); @@ -600,8 +605,8 @@ static void CG_UpdateThirdPersonCameraDamp(void) // Set the cameraIdealLoc CG_CalcIdealThirdPersonViewLocation(); - - + + // First thing we do is calculate the appropriate damping factor for the camera. dampfactor=0.0f; if ( CG_OnMovingPlat( &cg.snap->ps ) ) @@ -618,7 +623,7 @@ static void CG_UpdateThirdPersonCameraDamp(void) pitch = Q_fabs(cameraFocusAngles[PITCH]); // The higher the pitch, the larger the factor, so as you look up, it damps a lot less. - pitch /=115.0f; + pitch /=115.0f; dampfactor = (1.0-cg.overrides.thirdPersonCameraDamp)*(pitch*pitch); dampfactor += cg.overrides.thirdPersonCameraDamp; @@ -632,7 +637,7 @@ static void CG_UpdateThirdPersonCameraDamp(void) pitch = Q_fabs(cameraFocusAngles[PITCH]); // The higher the pitch, the larger the factor, so as you look up, it damps a lot less. - pitch /= 115.0f; + pitch /= 115.0f; dampfactor = (1.0-cg_thirdPersonCameraDamp.value)*(pitch*pitch); dampfactor += cg_thirdPersonCameraDamp.value; @@ -649,7 +654,7 @@ static void CG_UpdateThirdPersonCameraDamp(void) VectorCopy(cameraIdealLoc, cameraCurLoc); } else if (dampfactor>=0.0) - { + { // Calculate the difference from the current position to the new one. VectorSubtract(cameraIdealLoc, cameraCurLoc, locdiff); @@ -658,13 +663,13 @@ static void CG_UpdateThirdPersonCameraDamp(void) dampfactor = 1.0-dampfactor; // We must exponent the amount LEFT rather than the amount bled off dtime = (float)(cg.time-cameraLastFrame) * (1.0/cg_timescale.value) * (1.0/(float)CAMERA_DAMP_INTERVAL); // Our dampfactor is geared towards a time interval equal to "1". - // Note that since there are a finite number of "practical" delta millisecond values possible, + // Note that since there are a finite number of "practical" delta millisecond values possible, // the ratio should be initialized into a chart ultimately. if ( cg_smoothCamera.integer ) ratio = powf( dampfactor, dtime ); else ratio = Q_powf( dampfactor, dtime ); - + // This value is how much distance is "left" from the ideal. VectorMA(cameraIdealLoc, -ratio, locdiff, cameraCurLoc); ///////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -674,7 +679,7 @@ static void CG_UpdateThirdPersonCameraDamp(void) // CG_Trace(&trace, cameraFocusLoc, cameramins, cameramaxs, cameraCurLoc, cg.predicted_player_state.clientNum, MASK_CAMERACLIP); // (OLD) Now we trace from the new target location to the new view location, to make sure there is nothing in the way. if ( cg.snap - && (cg.snap->ps.eFlags&EF_HELD_BY_SAND_CREATURE) + && (cg.snap->ps.eFlags&EF_HELD_BY_SAND_CREATURE) && cg_entities[cg.snap->ps.clientNum].gent->activator ) {//if being held by a sand creature, trace from his actual origin, since we could be underground or otherwise in solid once he eats us CG_Trace( &trace, cg_entities[cg_entities[cg.snap->ps.clientNum].gent->activator->s.number].lerpOrigin, cameramins, cameramaxs, cameraCurLoc, cg.predicted_player_state.clientNum, MASK_CAMERACLIP); @@ -727,7 +732,7 @@ CG_OffsetThirdPersonView =============== */ extern qboolean MatrixMode; -static void CG_OffsetThirdPersonView( void ) +static void CG_OffsetThirdPersonView( void ) { vec3_t diff; float deltayaw; @@ -738,8 +743,8 @@ static void CG_OffsetThirdPersonView( void ) // Set camera viewing direction. VectorCopy( cg.refdefViewAngles, cameraFocusAngles ); - if ( cg.snap - && (cg.snap->ps.eFlags&EF_HELD_BY_RANCOR) + if ( cg.snap + && (cg.snap->ps.eFlags&EF_HELD_BY_RANCOR) && cg_entities[cg.snap->ps.clientNum].gent->activator ) { centity_t *monster = &cg_entities[cg_entities[cg.snap->ps.clientNum].gent->activator->s.number]; @@ -763,7 +768,7 @@ static void CG_OffsetThirdPersonView( void ) cameraFocusAngles[YAW] += cg_thirdPersonAngle.value; } } - else if ( cg.predicted_player_state.stats[STAT_HEALTH] <= 0 ) + else if ( cg.predicted_player_state.stats[STAT_HEALTH] <= 0 ) {// if dead, look at killer if ( MatrixMode ) { @@ -986,7 +991,7 @@ static void CG_OffsetThirdPersonOverheadView( void ) { VectorCopy( cg.refdef.vieworg, view ); - // Move straight up from the player, making sure to always go at least the min camera height, + // Move straight up from the player, making sure to always go at least the min camera height, // otherwise, the camera will clip into the head of the player. float tpRange = cg.overrides.thirdPersonRange ? cg.overrides.thirdPersonRange : cg_thirdPersonRange.value; if ( tpRange < MIN_CAMERA_HEIGHT ) @@ -1012,17 +1017,17 @@ static void CG_OffsetThirdPersonOverheadView( void ) { angs[PITCH] = MAX_CAMERA_PITCH; } - // Convert our new desired camera angles and store them where they will get used by the engine + // Convert our new desired camera angles and store them where they will get used by the engine // when setting up the actual camera view. AnglesToAxis( angs, cg.refdef.viewaxis ); cg.refdefViewAngles[PITCH] = 0; g_entities[0].client->ps.delta_angles[PITCH] = 0; - + // Trace a ray from the origin to the viewpoint to make sure the view isn't // in a solid block. CG_Trace( &trace, cg.refdef.vieworg, mins, maxs, view, cg.predicted_player_state.clientNum, MASK_CAMERACLIP); - if ( trace.fraction != 1.0 ) + if ( trace.fraction != 1.0 ) { VectorCopy( trace.endpos, cg.refdef.vieworg ); } @@ -1035,11 +1040,11 @@ static void CG_OffsetThirdPersonOverheadView( void ) { // this causes a compiler bug on mac MrC compiler static void CG_StepOffset( void ) { int timeDelta; - + // smooth out stair climbing timeDelta = cg.time - cg.stepTime; if ( timeDelta < STEP_TIME ) { - cg.refdef.vieworg[2] -= cg.stepChange + cg.refdef.vieworg[2] -= cg.stepChange * (STEP_TIME - timeDelta) / STEP_TIME; } } @@ -1064,7 +1069,7 @@ static void CG_OffsetFirstPersonView( qboolean firstPersonSaber ) { float f; vec3_t predictedVelocity; int timeDelta; - + if ( cg.snap->ps.pm_type == PM_INTERMISSION ) { return; } @@ -1073,7 +1078,7 @@ static void CG_OffsetFirstPersonView( qboolean firstPersonSaber ) { angles = cg.refdefViewAngles; // if dead, fix the angle and don't add any kick - if ( cg.snap->ps.stats[STAT_HEALTH] <= 0 ) + if ( cg.snap->ps.stats[STAT_HEALTH] <= 0 ) { angles[ROLL] = 40; angles[PITCH] = -15; @@ -1147,7 +1152,7 @@ static void CG_OffsetFirstPersonView( qboolean firstPersonSaber ) { delta = DotProduct ( predictedVelocity, cg.refdef.viewaxis[0]); angles[PITCH] += delta * cg_runpitch.value; - + delta = DotProduct ( predictedVelocity, cg.refdef.viewaxis[1]); angles[ROLL] -= delta * cg_runroll.value; @@ -1235,7 +1240,7 @@ static void CG_OffsetFirstPersonView( qboolean firstPersonSaber ) { { #define NECK_LENGTH 8 vec3_t forward, up; - + cg.refdef.vieworg[2] -= NECK_LENGTH; AngleVectors( cg.refdefViewAngles, forward, NULL, up ); VectorMA( cg.refdef.vieworg, 3, forward, cg.refdef.vieworg ); @@ -1252,7 +1257,7 @@ CG_CalcFovFromX Calcs Y FOV from given X FOV ==================== */ -qboolean CG_CalcFOVFromX( float fov_x ) +qboolean CG_CalcFOVFromX( float fov_x ) { float x; float fov_y; @@ -1273,7 +1278,7 @@ qboolean CG_CalcFOVFromX( float fov_x ) fov_y = fov_y * 360 / M_PI; // there's a problem with this, it only takes the leafbrushes into account, not the entity brushes, - // so if you give slime/water etc properties to a func_door area brush in order to move the whole water + // so if you give slime/water etc properties to a func_door area brush in order to move the whole water // level up/down this doesn't take into account the door position, so warps the view the whole time // whether the water is up or not. // warp if underwater @@ -1292,7 +1297,7 @@ qboolean CG_CalcFOVFromX( float fov_x ) fov_y -= v; inwater = qtrue; } - else + else { inwater = qfalse; } @@ -1348,9 +1353,9 @@ static qboolean CG_CalcFov( void ) { // if in intermission, use a fixed value fov_x = 80; } - else if ( cg.snap - && cg.snap->ps.viewEntity > 0 - && cg.snap->ps.viewEntity < ENTITYNUM_WORLD + else if ( cg.snap + && cg.snap->ps.viewEntity > 0 + && cg.snap->ps.viewEntity < ENTITYNUM_WORLD && (!cg.renderingThirdPerson || g_entities[cg.snap->ps.viewEntity].e_DieFunc == dieF_camera_die) ) { // if in entity camera view, use a special FOV @@ -1379,8 +1384,8 @@ static qboolean CG_CalcFov( void ) { fov_x = 120;//FIXME: read from the NPC's fov stats? } } - } - else if ( (!cg.zoomMode || cg.zoomMode > 2) && (cg.snap->ps.forcePowersActive&(1<client->ps.forcePowerDuration[FP_SPEED] )//cg.renderingThirdPerson && + } + else if ( (!cg.zoomMode || cg.zoomMode > 2) && (cg.snap->ps.forcePowersActive&(1<client->ps.forcePowerDuration[FP_SPEED] )//cg.renderingThirdPerson && { fov_x = CG_ForceSpeedFOV(); } else { @@ -1432,7 +1437,7 @@ static qboolean CG_CalcFov( void ) { if ( zoomSoundTime < cg.time ) { sfxHandle_t snd; - + if ( cg.zoomMode == 1 ) { snd = cgs.media.zoomLoop; @@ -1444,7 +1449,7 @@ static qboolean CG_CalcFov( void ) { // huh? This could probably just be added as a looping sound?? cgi_S_StartSound( cg.refdef.vieworg, ENTITYNUM_WORLD, CHAN_LOCAL, snd ); - zoomSoundTime = cg.time + 150; + zoomSoundTime = cg.time + 150; } } } @@ -1470,7 +1475,7 @@ CG_DamageBlendBlob =============== */ -static void CG_DamageBlendBlob( void ) +static void CG_DamageBlendBlob( void ) { int t; int maxTime; @@ -1512,13 +1517,13 @@ CG_SaberClashFlare extern int g_saberFlashTime; extern vec3_t g_saberFlashPos; extern qboolean CG_WorldCoordToScreenCoord(vec3_t worldCoord, int *x, int *y); -void CG_SaberClashFlare( void ) +void CG_SaberClashFlare( void ) { int t, maxTime = 150; t = cg.time - g_saberFlashTime; - if ( t <= 0 || t >= maxTime ) + if ( t <= 0 || t >= maxTime ) { return; } @@ -1573,7 +1578,7 @@ Sets cg.refdef view values */ static qboolean CG_CalcViewValues( void ) { playerState_t *ps; - qboolean viewEntIsHumanoid = qfalse; + //qboolean viewEntIsHumanoid = qfalse; qboolean viewEntIsCam = qfalse; memset( &cg.refdef, 0, sizeof( cg.refdef ) ); @@ -1585,7 +1590,7 @@ static qboolean CG_CalcViewValues( void ) { g_entities[cg.snap->ps.viewEntity].client) { ps = &g_entities[cg.snap->ps.viewEntity].client->ps; - viewEntIsHumanoid = qtrue; + //viewEntIsHumanoid = qtrue; } else { @@ -1660,8 +1665,8 @@ static qboolean CG_CalcViewValues( void ) { } } - if ( (cg.renderingThirdPerson||cg.snap->ps.weapon == WP_SABER||cg.snap->ps.weapon == WP_MELEE) - && !cg.zoomMode + if ( (cg.renderingThirdPerson||cg.snap->ps.weapon == WP_SABER||cg.snap->ps.weapon == WP_MELEE) + && !cg.zoomMode && !viewEntIsCam ) { // back away from character @@ -1685,8 +1690,8 @@ static qboolean CG_CalcViewValues( void ) { } CG_OffsetThirdPersonView(); // } - } - else + } + else { // offset for local bobbing and kicks CG_OffsetFirstPersonView( qfalse ); @@ -1724,7 +1729,7 @@ static qboolean CG_CalcViewValues( void ) { /* if ( in_camera ) { - Com_Printf( "%s %s\n", vtos(client_camera.origin), vtos(cg.refdef.vieworg) ); + Com_Printf( "%s %s\n", vtos(client_camera.origin), vtos(cg.refdef.vieworg) ); } */ @@ -1739,7 +1744,7 @@ static qboolean CG_CalcViewValues( void ) { AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis ); - if ( cg.hyperspace ) + if ( cg.hyperspace ) { cg.refdef.rdflags |= RDF_NOWORLDMODEL | RDF_HYPERSPACE; } @@ -1754,16 +1759,16 @@ static qboolean CG_CalcViewValues( void ) { CG_PowerupTimerSounds ===================== */ -static void CG_PowerupTimerSounds( void ) +static void CG_PowerupTimerSounds( void ) { int i, time; - + // powerup timers going away - for ( i = 0 ; i < MAX_POWERUPS ; i++ ) + for ( i = 0 ; i < MAX_POWERUPS ; i++ ) { time = cg.snap->ps.powerups[i]; - if ( time > 0 && time < cg.time ) + if ( time > 0 && time < cg.time ) { // add any special powerup expiration sounds here // switch( i ) @@ -1828,54 +1833,27 @@ static void CG_DrawSkyBoxPortal(void) { CG_Error( "CG_DrawSkyBoxPortal: error parsing skybox configstring. No fog state\n"); } - else + else { - vec4_t fogColor; - int fogStart, fogEnd; - - if(atoi(token)) - { // this camera has fog - token = COM_ParseExt(&cstr, qfalse); - - if (!token || !token[0]) - { + if ( atoi( token ) ) { + // this camera has fog + token = COM_ParseExt( &cstr, qfalse ); + if ( !VALIDSTRING( token ) ) { CG_Error( "CG_DrawSkyBoxPortal: error parsing skybox configstring. No fog[0]\n"); } - fogColor[0] = atof(token); token = COM_ParseExt(&cstr, qfalse); - if (!token || !token[0]) - { + if ( !VALIDSTRING( token ) ) { CG_Error( "CG_DrawSkyBoxPortal: error parsing skybox configstring. No fog[1]\n"); } - fogColor[1] = atof(token); token = COM_ParseExt(&cstr, qfalse); - if (!token || !token[0]) - { + if ( !VALIDSTRING( token ) ) { CG_Error( "CG_DrawSkyBoxPortal: error parsing skybox configstring. No fog[2]\n"); } - fogColor[2] = atof(token); - - token = COM_ParseExt(&cstr, qfalse); - if (!token || !token[0]) - { - fogStart = 0; - } - else - { - fogStart = atoi(token); - } - token = COM_ParseExt(&cstr, qfalse); - if (!token || !token[0]) - { - fogEnd = 0; - } - else - { - fogEnd = atoi(token); - } + COM_ParseExt( &cstr, qfalse ); + COM_ParseExt( &cstr, qfalse ); } } @@ -1897,11 +1875,11 @@ static void CG_DrawSkyBoxPortal(void) if (cg.zoomMode) { fov_x = cg_zoomFov; - } + } else { fov_x = (cg.overrides.active&CG_OVERRIDE_FOV) ? cg.overrides.fov : cg_fov.value; - if ( fov_x < 1 ) + if ( fov_x < 1 ) { fov_x = 1; } @@ -1941,7 +1919,7 @@ static void CG_DrawSkyBoxPortal(void) cg.refdef.fov_y = fov_y; */ //inherit fov and axis from whatever the player is doing (regular, camera overrides or zoomed, whatever) - if ( !cg.hyperspace ) + if ( !cg.hyperspace ) { CG_AddPacketEntities(qtrue); //rww - There was no proper way to put real entities inside the portal view before. //This will put specially flagged entities in the render. @@ -1966,8 +1944,8 @@ void CG_RunEmplacedWeapon() *gun = player->owner; // Override the camera when we are locked onto the gun. - if ( player - && gun + if ( player + && gun && !gun->bounceCount//not an eweb && ( player->s.eFlags & EF_LOCKED_TO_WEAPON )) { @@ -2058,7 +2036,7 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView ) { // let the client system know what our weapon and zoom settings are //FIXME: should really send forcePowersActive over network onto cg.snap->ps... const int fpActive = cg_entities[0].gent->client->ps.forcePowersActive; - const bool matrixMode = !!(fpActive & (1 << FP_SPEED) | (1 << FP_RAGE)); + const bool matrixMode = !!(fpActive & ((1 << FP_SPEED) | (1 << FP_RAGE))); float speed = cg.refdef.fov_y / 75.0 * (matrixMode ? 1.0f : cg_timescale.value); //FIXME: junk code, BUG:168 @@ -2072,12 +2050,12 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView ) { wasForceSpeed=isForceSpeed; // - + float mPitchOverride = 0.0f; float mYawOverride = 0.0f; if ( cg.snap->ps.clientNum == 0 ) {//pointless check, but.. - if ( cg_entities[0].gent->s.eFlags & EF_LOCKED_TO_WEAPON ) + if ( cg_entities[0].gent->s.eFlags & EF_LOCKED_TO_WEAPON ) { speed *= 0.25f; } @@ -2092,7 +2070,7 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView ) { } if ( pVeh->m_pVehicleInfo->mouseYaw ) { - mYawOverride = pVeh->m_pVehicleInfo->mouseYaw; + mYawOverride = pVeh->m_pVehicleInfo->mouseYaw; } } } @@ -2109,8 +2087,8 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView ) { cg.zoomMode = 0; } // decide on third person view - cg.renderingThirdPerson = cg_thirdPerson.integer - || (cg.snap->ps.stats[STAT_HEALTH] <= 0) + cg.renderingThirdPerson = cg_thirdPerson.integer + || (cg.snap->ps.stats[STAT_HEALTH] <= 0) || (cg.snap->ps.eFlags&EF_HELD_BY_SAND_CREATURE) || ((g_entities[0].client&&g_entities[0].client->NPC_class==CLASS_ATST) || (cg.snap->ps.weapon == WP_SABER || cg.snap->ps.weapon == WP_MELEE) ); @@ -2127,7 +2105,7 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView ) { CGCam_RenderScene(); } else - { + { //Finish any fading that was happening CGCam_UpdateFade(); // build cg.refdef @@ -2155,7 +2133,7 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView ) { // first person blend blobs, done after AnglesToAxis if ( !cg.renderingThirdPerson ) { - CG_DamageBlendBlob(); + CG_DamageBlendBlob(); } // build the render lists @@ -2206,8 +2184,8 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView ) { } // Don't draw the in-view weapon when in camera mode - if ( !in_camera - && !cg_pano.integer + if ( !in_camera + && !cg_pano.integer && cg.snap->ps.weapon != WP_SABER && ( cg.snap->ps.viewEntity == 0 || cg.snap->ps.viewEntity >= ENTITYNUM_WORLD ) ) { @@ -2221,7 +2199,7 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView ) { } } - if ( !cg.hyperspace && fx_freeze.integer<2 ) + if ( !cg.hyperspace && fx_freeze.integer<2 ) { //Add all effects theFxScheduler.AddScheduledEffects( false ); @@ -2231,7 +2209,7 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView ) { if ( cg.testModelEntity.hModel ) { CG_AddTestModel(); } - + memcpy( cg.refdef.areamask, cg.snap->areamask, sizeof( cg.refdef.areamask ) ); // update audio positions @@ -2241,7 +2219,7 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView ) { /* vec3_t listener_origin; VectorCopy( cg.refdef.vieworg, listener_origin ); - if ( cg.snap->ps.forcePowersActive&(1<ps.forcePowersActive&(1<ps.forcePowerLevel[FP_SEE] >= FORCE_LEVEL_2 ) {//FIXME: if I can see through walls, why not actually move the listener_position through the wall too? if ( g_crosshairEntNum < ENTITYNUM_WORLD @@ -2265,7 +2243,7 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView ) { if ( cg_pano.integer ) { // let's grab a panorama! cg.levelShot = qtrue; //hide the 2d - VectorClear(cg.refdefViewAngles); + VectorClear(cg.refdefViewAngles); cg.refdefViewAngles[YAW] = -360 * cg_pano.integer/cg_panoNumShots.integer; //choose angle AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis ); CG_DrawActive( stereoView ); diff --git a/code/cgame/cg_weapons.cpp b/code/cgame/cg_weapons.cpp index e22c41cb8e..7a65c47518 100644 --- a/code/cgame/cg_weapons.cpp +++ b/code/cgame/cg_weapons.cpp @@ -1,22 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" #include "cg_media.h" @@ -2891,6 +2895,17 @@ void CG_MissileStick( centity_t *cent, int weapon, vec3_t position ) } } +qboolean CG_VehicleWeaponImpact( centity_t *cent ) +{//see if this is a missile entity that's owned by a vehicle and should do a special, overridden impact effect + if (cent->currentState.otherEntityNum2 + && g_vehWeaponInfo[cent->currentState.otherEntityNum2].iImpactFX) + {//missile is from a special vehWeapon + CG_PlayEffectID(g_vehWeaponInfo[cent->currentState.otherEntityNum2].iImpactFX, cent->lerpOrigin, cent->gent->pos1); + return qtrue; + } + return qfalse; +} + /* ================= CG_MissileHitWall diff --git a/code/cgame/common_headers.h b/code/cgame/common_headers.h index be16503ae4..858d9b14e2 100644 --- a/code/cgame/common_headers.h +++ b/code/cgame/common_headers.h @@ -1,22 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this line must stay at top so the whole PCH thing works... #include "cg_headers.h" // I am a dummy header file that takes the place of the PCH files in SoF2. This is done so that we can easily diff --git a/code/cgame/strip_objectives.h b/code/cgame/strip_objectives.h index e782f8707c..af2ae5905b 100644 --- a/code/cgame/strip_objectives.h +++ b/code/cgame/strip_objectives.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __strip_objectives_h #define __strip_objectives_h diff --git a/code/client/cl_cgame.cpp b/code/client/cl_cgame.cpp index 21e87ce436..e56e17ee49 100644 --- a/code/client/cl_cgame.cpp +++ b/code/client/cl_cgame.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cl_cgame.c -- client system interaction with client game @@ -25,6 +30,8 @@ This file is part of Jedi Academy. #include "client.h" #include "vmachine.h" +#include "qcommon/stringed_ingame.h" +#include "sys/sys_loadlib.h" vm_t cgvm; /* @@ -51,6 +58,31 @@ extern qboolean R_inPVS( vec3_t p1, vec3_t p2 ); void UI_SetActiveMenu( const char* menuname,const char *menuID ); +qboolean CL_InitCGameVM( void *gameLibrary ) +{ + typedef intptr_t SyscallProc( intptr_t, ... ); + typedef void DllEntryProc( SyscallProc * ); + + DllEntryProc *dllEntry = (DllEntryProc *)Sys_LoadFunction( gameLibrary, "dllEntry" ); + cgvm.entryPoint = (intptr_t (*)(int,...))Sys_LoadFunction( gameLibrary, "vmMain" ); + + if ( !cgvm.entryPoint || !dllEntry ) { +#ifdef JK2_MODE + const char *gamename = "jospgame"; +#else + const char *gamename = "jagame"; +#endif + + Com_Printf( "CL_InitCGameVM: client game entry point not found in %s" ARCH_STRING DLL_EXT ": %s\n", + gamename, Sys_LibraryError() ); + return qfalse; + } + + dllEntry( VM_DllSyscall ); + + return qtrue; +} + /* ==================== CL_GetGameState @@ -239,11 +271,6 @@ void CL_AddCgameCommand( const char *cmdName ) { Cmd_AddCommand( cmdName, NULL ); } -void CL_CgameError( const char *string ) { - Com_Error( ERR_DROP, "%s", string ); -} - - /* ===================== CL_ConfigstringModified @@ -774,7 +801,6 @@ CL_CgameSystemCalls The cgame module is making a system call ==================== */ -void *VM_ArgPtr( int intValue ); void CM_SnapPVS(vec3_t origin,byte *buffer); extern void Menu_Paint(menuDef_t *menu, qboolean forcePaint); extern menuDef_t *Menus_FindByName(const char *p); diff --git a/code/client/cl_cin.cpp b/code/client/cl_cin.cpp index 4fe7871e84..84b2b158d5 100644 --- a/code/client/cl_cin.cpp +++ b/code/client/cl_cin.cpp @@ -1,23 +1,27 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" /***************************************************************************** @@ -38,9 +42,7 @@ This file is part of Jedi Academy. #include "client.h" #include "client_ui.h" // CHC #include "snd_local.h" -#ifndef _WIN32 -#include -#endif +#include "qcommon/stringed_ingame.h" #define MAXSIZE 8 #define MINSIZE 4 @@ -1861,7 +1863,7 @@ static void PlayCinematic(const char *arg, const char *s, qboolean qbInGame) { psAudioFile = "music/cinematic_1"; #ifdef JK2_MODE - hCrawl = re.RegisterShaderNoMip( va("menu/video/tc_%d", sp_language->string) ); + hCrawl = re.RegisterShaderNoMip( va("menu/video/tc_%d", sp_language->integer) ); if(!hCrawl) { // failed, so go back to english @@ -1953,6 +1955,15 @@ qboolean CL_CheckPendingCinematic(void) return qfalse; } +/* +================== +CL_CompleteCinematic +================== +*/ +void CL_CompleteCinematic( char *args, int argNum ) { + if ( argNum == 2 ) + Field_CompleteFilename( "video", "roq", qtrue, qfalse ); +} void CL_PlayCinematic_f(void) { diff --git a/code/client/cl_console.cpp b/code/client/cl_console.cpp index b30332dc78..76c957f1be 100644 --- a/code/client/cl_console.cpp +++ b/code/client/cl_console.cpp @@ -1,30 +1,34 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // console.c -// leave this as first line for PCH reasons... -// -#include "../server/exe_headers.h" - +#include "server/exe_headers.h" #include "client.h" -#include "../qcommon/stv_version.h" +#include "qcommon/stringed_ingame.h" +#include "qcommon/stv_version.h" int g_console_field_width = 78; diff --git a/code/client/cl_input.cpp b/code/client/cl_input.cpp index a52df7018d..300510f489 100644 --- a/code/client/cl_input.cpp +++ b/code/client/cl_input.cpp @@ -1,28 +1,30 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cl.input.c -- builds an intended movement command to send to the server -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - #include "client.h" #include "client_ui.h" @@ -477,55 +479,45 @@ void CL_JoystickMove( usercmd_t *cmd ) { return; } - if( in_joystick->integer == 2 ) - { - if(abs(cl.joystickAxis[AXIS_FORWARD]) >= 30) cmd->forwardmove = cl.joystickAxis[AXIS_FORWARD]; - if(abs(cl.joystickAxis[AXIS_SIDE]) >= 30) cmd->rightmove = cl.joystickAxis[AXIS_SIDE]; + if ( !(in_speed.active ^ cl_run->integer) ) { + cmd->buttons |= BUTTON_WALKING; + } + + if ( in_speed.active ) { anglespeed = 0.001 * cls.frametime * cl_anglespeedkey->value; - cl.viewangles[YAW] -= (cl_yawspeed->value / 100.0f) * (cl.joystickAxis[AXIS_YAW]/1024.0f); - cl.viewangles[PITCH] += (cl_pitchspeed->value / 100.0f) * (cl.joystickAxis[AXIS_PITCH]/1024.0f); + } else { + anglespeed = 0.001 * cls.frametime; } - else - { - if ( !(in_speed.active ^ cl_run->integer) ) { - cmd->buttons |= BUTTON_WALKING; - } - if ( in_speed.active ) { - anglespeed = 0.001 * cls.frametime * cl_anglespeedkey->value; - } else { - anglespeed = 0.001 * cls.frametime; + if ( !in_strafe.active ) { + if ( cl_mYawOverride ) + { + cl.viewangles[YAW] += 5.0f * cl_mYawOverride * cl.joystickAxis[AXIS_SIDE]; } - - if ( !in_strafe.active ) { - if ( cl_mYawOverride ) - { - cl.viewangles[YAW] += 5.0f * cl_mYawOverride * cl.joystickAxis[AXIS_SIDE]; - } - else - { - cl.viewangles[YAW] += anglespeed * (cl_yawspeed->value / 100.0f) * cl.joystickAxis[AXIS_SIDE]; - } - } else + else { - cmd->rightmove = ClampChar( cmd->rightmove + cl.joystickAxis[AXIS_SIDE] ); + cl.viewangles[YAW] += anglespeed * (cl_yawspeed->value / 100.0f) * cl.joystickAxis[AXIS_SIDE]; } + } + else + { + cmd->rightmove = ClampChar( cmd->rightmove + cl.joystickAxis[AXIS_SIDE] ); + } - if ( in_mlooking ) { - if ( cl_mPitchOverride ) - { - cl.viewangles[PITCH] += 5.0f * cl_mPitchOverride * cl.joystickAxis[AXIS_FORWARD]; - } - else - { - cl.viewangles[PITCH] += anglespeed * (cl_pitchspeed->value / 100.0f) * cl.joystickAxis[AXIS_FORWARD]; - } - } else { - cmd->forwardmove = ClampChar( cmd->forwardmove + cl.joystickAxis[AXIS_FORWARD] ); + if ( in_mlooking ) { + if ( cl_mPitchOverride ) + { + cl.viewangles[PITCH] += 5.0f * cl_mPitchOverride * cl.joystickAxis[AXIS_FORWARD]; } - - cmd->upmove = ClampChar( cmd->upmove + cl.joystickAxis[AXIS_UP] ); + else + { + cl.viewangles[PITCH] += anglespeed * (cl_pitchspeed->value / 100.0f) * cl.joystickAxis[AXIS_FORWARD]; + } + } else { + cmd->forwardmove = ClampChar( cmd->forwardmove + cl.joystickAxis[AXIS_FORWARD] ); } + + cmd->upmove = ClampChar( cmd->upmove + cl.joystickAxis[AXIS_UP] ); } /* diff --git a/code/client/cl_keys.cpp b/code/client/cl_keys.cpp index 7e00b50bed..3e57df4497 100644 --- a/code/client/cl_keys.cpp +++ b/code/client/cl_keys.cpp @@ -1,23 +1,27 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" @@ -481,19 +485,19 @@ Field_Paste */ void Field_CharEvent( field_t *edit, int ch ); void Field_Paste( field_t *edit ) { - char *cbd; - int pasteLen, i; + char *cbd, *c; - cbd = Sys_GetClipboardData(); + c = cbd = Sys_GetClipboardData(); if ( !cbd ) { return; } // send as if typed, so insert / overstrike works properly - pasteLen = strlen( cbd ); - for ( i = 0 ; i < pasteLen ; i++ ) { - Field_CharEvent( edit, cbd[i] ); + while( *c ) + { + uint32_t utf32 = ConvertUTF8ToUTF32( c, &c ); + Field_CharEvent( edit, ConvertUTF32ToExpectedCharset( utf32 ) ); } Z_Free( cbd ); @@ -1022,7 +1026,7 @@ void Key_Bind_f( void ) { if ( c == 2 ) { if ( kg.keys[b].binding && kg.keys[b].binding[0] ) - Com_Printf( S_COLOR_GREY"Bind "S_COLOR_WHITE"%s = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\""S_COLOR_WHITE"\n", Key_KeynumToString( b ), kg.keys[b].binding ); + Com_Printf( S_COLOR_GREY "Bind " S_COLOR_WHITE "%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", Key_KeynumToString( b ), kg.keys[b].binding ); else Com_Printf( "\"%s\" is not bound\n", Key_KeynumToString( b ) ); return; @@ -1062,7 +1066,7 @@ Key_Bindlist_f void Key_Bindlist_f( void ) { for ( size_t i=0; i. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cl_main.c -- client main loop -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - #include "client.h" #include "client_ui.h" #include #include "../ghoul2/G2.h" - -#ifndef _WIN32 -#include "../sys/sys_loadlib.h" -#include "../sys/sys_local.h" -#endif +#include "qcommon/stringed_ingame.h" +#include "sys/sys_loadlib.h" #define RETRANSMIT_TIMEOUT 3000 // time between connection packet retransmits @@ -74,9 +74,7 @@ cvar_t *cl_activeAction; cvar_t *cl_inGameVideo; -#ifndef _WIN32 cvar_t *cl_consoleKeys; -#endif clientActive_t cl; clientConnection_t clc; @@ -986,7 +984,6 @@ CL_RefPrintf DLL glue ================ */ -#define MAXPRINTMSG 4096 void QDECL CL_RefPrintf( int print_level, const char *fmt, ...) { va_list argptr; char msg[MAXPRINTMSG]; @@ -1021,15 +1018,6 @@ const char *String_GetStringValue( const char *reference ) #endif } -#ifdef _WIN32 -// DLL glue --eez -WinVars_t *GetWindowsVariables( void ) -{ - extern WinVars_t g_wv; - return &g_wv; -} -#endif - extern qboolean gbAlreadyDoingLoad; extern void *gpvCachedMapDiskImage; extern char gsCachedMapDiskImage[MAX_QPATH]; @@ -1083,7 +1071,7 @@ static CMiniHeap *GetG2VertSpaceServer( void ) { void CL_InitRef( void ) { refexport_t *ret; - refimport_t rit; + static refimport_t rit; char dllName[MAX_OSPATH]; GetRefAPI_t GetRefAPI; @@ -1105,6 +1093,8 @@ void CL_InitRef( void ) { Com_Error( ERR_FATAL, "Failed to load renderer" ); } + memset( &rit, 0, sizeof( rit ) ); + GetRefAPI = (GetRefAPI_t)Sys_LoadFunction( rendererLib, "GetRefAPI" ); if ( !GetRefAPI ) Com_Error( ERR_FATAL, "Can't load symbol GetRefAPI: '%s'", Sys_LibraryError() ); @@ -1158,11 +1148,11 @@ void CL_InitRef( void ) { RIT(Hunk_ClearToMark); -#ifndef _WIN32 - RIT(IN_Init); - RIT(IN_Shutdown); - RIT(IN_Restart); -#endif + rit.WIN_Init = WIN_Init; + rit.WIN_SetGamma = WIN_SetGamma; + rit.WIN_Shutdown = WIN_Shutdown; + rit.WIN_Present = WIN_Present; + rit.GL_GetProcAddress = WIN_GL_GetProcAddress; rit.PD_Load = PD_Load; rit.PD_Store = PD_Store; @@ -1170,11 +1160,8 @@ void CL_InitRef( void ) { rit.Error = Com_Error; rit.FS_FileExists = S_FileExists; rit.GetG2VertSpaceServer = GetG2VertSpaceServer; -#ifdef _WIN32 - rit.GetWinVars = GetWindowsVariables; -#endif rit.LowPhysicalMemory = Sys_LowPhysicalMemory; - rit.Milliseconds = Sys_Milliseconds; + rit.Milliseconds = Sys_Milliseconds2; rit.Printf = CL_RefPrintf; rit.SE_GetString = String_GetStringValue; @@ -1205,6 +1192,8 @@ void CL_InitRef( void ) { //=========================================================================================== +void CL_CompleteCinematic( char *args, int argNum ); + /* ==================== CL_Init @@ -1274,10 +1263,8 @@ void CL_Init( void ) { m_side = Cvar_Get ("m_side", "0.25", CVAR_ARCHIVE); m_filter = Cvar_Get ("m_filter", "0", CVAR_ARCHIVE); -#ifndef _WIN32 // ~ and `, as keys and characters cl_consoleKeys = Cvar_Get( "cl_consoleKeys", "~ ` 0x7e 0x60", CVAR_ARCHIVE); -#endif // userinfo #ifdef JK2_MODE @@ -1307,6 +1294,7 @@ void CL_Init( void ) { Cmd_AddCommand ("vid_restart", CL_Vid_Restart_f); Cmd_AddCommand ("disconnect", CL_Disconnect_f); Cmd_AddCommand ("cinematic", CL_PlayCinematic_f); + Cmd_SetCommandCompletionFunc( "cinematic", CL_CompleteCinematic ); Cmd_AddCommand ("ingamecinematic", CL_PlayInGameCinematic_f); Cmd_AddCommand ("uimenu", CL_GenericMenu_f); Cmd_AddCommand ("datapad", CL_DataPad_f); diff --git a/code/client/cl_mp3.cpp b/code/client/cl_mp3.cpp index 1ffb738be1..1b4a878a43 100644 --- a/code/client/cl_mp3.cpp +++ b/code/client/cl_mp3.cpp @@ -1,30 +1,30 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- cl_mp3.cpp // // (The interface module between all the MP3 stuff and Trek) -// -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - #include "client.h" #include "cl_mp3.h" // only included directly by a few snd_xxxx.cpp files plus this one #include "../mp3code/mp3struct.h" // keep this rather awful file secret from the rest of the program diff --git a/code/client/cl_mp3.h b/code/client/cl_mp3.h index a7a716ef2a..032343146f 100644 --- a/code/client/cl_mp3.h +++ b/code/client/cl_mp3.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- cl_mp3.h // diff --git a/code/client/cl_parse.cpp b/code/client/cl_parse.cpp index 1d92e5a21f..63ebaf99f9 100644 --- a/code/client/cl_parse.cpp +++ b/code/client/cl_parse.cpp @@ -1,28 +1,30 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cl_parse.c -- parse a message received from the server -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - #include "client.h" #include "client_ui.h" diff --git a/code/client/cl_scrn.cpp b/code/client/cl_scrn.cpp index 4b49caf5e0..dbe09cb6f8 100644 --- a/code/client/cl_scrn.cpp +++ b/code/client/cl_scrn.cpp @@ -1,28 +1,31 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cl_scrn.c -- master for refresh, status bar, console, chat, notify, etc -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - #include "client.h" #include "client_ui.h" @@ -414,16 +417,6 @@ void SCR_DrawScreenField( stereoFrame_t stereoFrame ) { qboolean uiFullscreen = _UI_IsFullscreen(); - // wide aspect ratio screens need to have the sides cleared - // unless they are displaying game renderings - if ( uiFullscreen || (cls.state != CA_ACTIVE && cls.state != CA_CINEMATIC) ) { - if ( cls.glconfig.vidWidth * 480 > cls.glconfig.vidHeight * 640 ) { - re.SetColor( g_color_table[0] ); - re.DrawStretchPic( 0, 0, cls.glconfig.vidWidth, cls.glconfig.vidHeight, 0, 0, 0, 0, 0 ); - re.SetColor( NULL ); - } - } - // if the menu is going to cover the entire screen, we // don't need to render anything under it if ( !uiFullscreen ) { @@ -501,18 +494,23 @@ void SCR_UpdateScreen( void ) { } recursive = qtrue; - // if running in stereo, we need to draw the frame twice - if ( cls.glconfig.stereoEnabled ) { - SCR_DrawScreenField( STEREO_LEFT ); - SCR_DrawScreenField( STEREO_RIGHT ); - } else { - SCR_DrawScreenField( STEREO_CENTER ); - } + // If there is no VM, there are also no rendering commands issued. Stop the renderer in + // that case. + if ( cls.uiStarted ) + { + // if running in stereo, we need to draw the frame twice + if ( cls.glconfig.stereoEnabled ) { + SCR_DrawScreenField( STEREO_LEFT ); + SCR_DrawScreenField( STEREO_RIGHT ); + } else { + SCR_DrawScreenField( STEREO_CENTER ); + } - if ( com_speeds->integer ) { - re.EndFrame( &time_frontend, &time_backend ); - } else { - re.EndFrame( NULL, NULL ); + if ( com_speeds->integer ) { + re.EndFrame( &time_frontend, &time_backend ); + } else { + re.EndFrame( NULL, NULL ); + } } recursive = 0; @@ -584,9 +582,10 @@ void SCR_SetScreenshot(const byte *pbData, int w, int h) } +#ifdef JK2_MODE // This is just a client-side wrapper for the function RE_TempRawImage_ReadFromFile() in the renderer code... // -/* + byte* SCR_TempRawImage_ReadFromFile(const char *psLocalFilename, int *piWidth, int *piHeight, byte *pbReSampleBuffer, qboolean qbVertFlip) { return re.TempRawImage_ReadFromFile(psLocalFilename, piWidth, piHeight, pbReSampleBuffer, qbVertFlip); @@ -598,5 +597,6 @@ void SCR_TempRawImage_CleanUp() { re.TempRawImage_CleanUp(); } -*/ +#endif + diff --git a/code/client/cl_ui.cpp b/code/client/cl_ui.cpp index aab37ea1a8..83d891e6b0 100644 --- a/code/client/cl_ui.cpp +++ b/code/client/cl_ui.cpp @@ -1,36 +1,40 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - #include "client.h" #include "client_ui.h" +#include "qcommon/stringed_ingame.h" #include "vmachine.h" -int PC_ReadTokenHandle(int handle, struct pc_token_s *pc_token); - intptr_t CL_UISystemCalls( intptr_t *args ); //prototypes +#ifdef JK2_MODE +extern qboolean SG_GetSaveImage( const char *psPathlessBaseName, void *pvAddress ); +#endif extern int SG_GetSaveGameComment(const char *psPathlessBaseName, char *sComment, char *sMapName); extern qboolean SG_GameAllowedToSaveHere(qboolean inCamera); extern void SG_StoreSaveGameComment(const char *sComment); @@ -67,16 +71,19 @@ GetClipboardData ==================== */ static void GetClipboardData( char *buf, int buflen ) { - char *cbd; - - cbd = Sys_GetClipboardData(); + char *cbd, *c; + c = cbd = Sys_GetClipboardData(); if ( !cbd ) { *buf = 0; return; } - Q_strncpyz( buf, cbd, buflen ); + for ( int i = 0, end = buflen - 1; *c && i < end; i++ ) + { + uint32_t utf32 = ConvertUTF8ToUTF32( c, &c ); + buf[i] = ConvertUTF32ToExpectedCharset( utf32 ); + } Z_Free( cbd ); } @@ -154,7 +161,9 @@ static int GetConfigString(int index, char *buf, int size) CL_ShutdownUI ==================== */ +void UI_Shutdown( void ); void CL_ShutdownUI( void ) { + UI_Shutdown(); Key_SetCatcher( Key_GetCatcher( ) & ~KEYCATCH_UI ); cls.uiStarted = qfalse; } @@ -241,14 +250,18 @@ void CL_InitUI( void ) { uii.Language_UsesSpaces = re.Language_UsesSpaces; uii.AnyLanguage_ReadCharFromString = re.AnyLanguage_ReadCharFromString; - //uii.SG_GetSaveImage = SG_GetSaveImage; +#ifdef JK2_MODE + uii.SG_GetSaveImage = SG_GetSaveImage; +#endif uii.SG_GetSaveGameComment = SG_GetSaveGameComment; uii.SG_StoreSaveGameComment = SG_StoreSaveGameComment; uii.SG_GameAllowedToSaveHere= SG_GameAllowedToSaveHere; //uii.SCR_GetScreenshot = SCR_GetScreenshot; - //uii.DrawStretchRaw = re.DrawStretchRaw; +#ifdef JK2_MODE + uii.DrawStretchRaw = re.DrawStretchRaw; +#endif uii.R_ClearScene = re.ClearScene; uii.R_AddRefEntityToScene = re.AddRefEntityToScene; uii.R_AddPolyToScene = re.AddPolyToScene; @@ -263,6 +276,10 @@ void CL_InitUI( void ) { uii.PrecacheScreenshot = SCR_PrecacheScreenshot; +#ifdef JK2_MODE + uii.PrecacheScreenshot = SCR_PrecacheScreenshot; +#endif + uii.R_LerpTag = re.LerpTag; uii.S_StartLocalLoopingSound= S_StartLocalLoopingSound; @@ -292,7 +309,7 @@ void CL_InitUI( void ) { uii.GetConfigString = (void (*)(int, char *, int))GetConfigString; - uii.Milliseconds = Sys_Milliseconds; + uii.Milliseconds = Sys_Milliseconds2; UI_Init(UI_API_VERSION, &uii, (cls.state > CA_DISCONNECTED && cls.state <= CA_ACTIVE)); diff --git a/code/client/client.h.BACKUP.2896.h b/code/client/client.h.BACKUP.2896.h new file mode 100644 index 0000000000..a47a70e68e --- /dev/null +++ b/code/client/client.h.BACKUP.2896.h @@ -0,0 +1,425 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +// client.h -- primary header for client +#pragma once + +#include "../qcommon/q_shared.h" +#include "../qcommon/qcommon.h" +#include "../rd-common/tr_public.h" +#include "keys.h" +#include "snd_public.h" +#include "../cgame/cg_public.h" + +// snapshots are a view of the server at a given time +typedef struct { + qboolean valid; // cleared if delta parsing was invalid + int snapFlags; // rate delayed and dropped commands + + int serverTime; // server time the message is valid for (in msec) + + int messageNum; // copied from netchan->incoming_sequence + int deltaNum; // messageNum the delta is from + int ping; // time from when cmdNum-1 was sent to time packet was reeceived + byte areamask[MAX_MAP_AREA_BYTES]; // portalarea visibility bits + + int cmdNum; // the next cmdNum the server is expecting + playerState_t ps; // complete information about the current player at this time + + int numEntities; // all of the entities that need to be presented + int parseEntitiesNum; // at the time of this snapshot + + int serverCommandNum; // execute all commands up to this before + // making the snapshot current +} clSnapshot_t; + + + +/* +============================================================================= + +the clientActive_t structure is wiped completely at every +new gamestate_t, potentially several times during an established connection + +============================================================================= +*/ + +// the parseEntities array must be large enough to hold PACKET_BACKUP frames of +// entities, so that when a delta compressed message arives from the server +// it can be un-deltad from the original +#define MAX_PARSE_ENTITIES 512 + +extern int g_console_field_width; + +typedef struct { + int timeoutcount; + + clSnapshot_t frame; // latest received from server + + int serverTime; + int oldServerTime; // to prevent time from flowing bakcwards + int oldFrameServerTime; // to check tournament restarts + int serverTimeDelta; // cl.serverTime = cls.realtime + cl.serverTimeDelta + // this value changes as net lag varies + qboolean extrapolatedSnapshot; // set if any cgame frame has been forced to extrapolate + // cleared when CL_AdjustTimeDelta looks at it + qboolean newSnapshots; // set on parse, cleared when CL_AdjustTimeDelta looks at it + + gameState_t gameState; // configstrings + char mapname[MAX_QPATH]; // extracted from CS_SERVERINFO + + int parseEntitiesNum; // index (not anded off) into cl_parse_entities[] + + int mouseDx[2], mouseDy[2]; // added to by mouse events + int mouseIndex; + int joystickAxis[MAX_JOYSTICK_AXIS]; // set by joystick events + + int cgameUserCmdValue; // current weapon to add to usercmd_t + float cgameSensitivity; + + // cmds[cmdNumber] is the predicted command, [cmdNumber-1] is the last + // properly generated command + usercmd_t cmds[CMD_BACKUP]; // each mesage will send several old cmds + int cmdNumber; // incremented each frame, because multiple + // frames may need to be packed into a single packet + + int packetTime[PACKET_BACKUP]; // cls.realtime sent, for calculating pings + int packetCmdNumber[PACKET_BACKUP]; // cmdNumber when packet was sent + + // the client maintains its own idea of view angles, which are + // sent to the server each frame. It is cleared to 0 upon entering each level. + // the server sends a delta each frame which is added to the locally + // tracked view angles to account for standing on rotating objects, + // and teleport direction changes + vec3_t viewangles; + + // these are just parsed out of the configstrings for convenience + int serverId; + + // non-gameserver infornamtion + int cinematictime; // cls.realtime for first cinematic frame (FIXME: NO LONGER USED!, but I wasn't sure if I could remove it because of struct sizes assumed elsewhere? -Ste) + + // big stuff at end of structure so most offsets are 15 bits or less + clSnapshot_t frames[PACKET_BACKUP]; + + entityState_t parseEntities[MAX_PARSE_ENTITIES]; + + //DJC added - making force powers in single player work like those in + //multiplayer. This makes hot swapping code more portable. + qboolean gcmdSendValue; + byte gcmdValue; +} clientActive_t; + +extern clientActive_t cl; + +/* +============================================================================= + +the clientConnection_t structure is wiped when disconnecting from a server, +either to go to a full screen console, or connect to a different server + +A connection can be to either a server through the network layer, +or just a streaming cinematic. + +============================================================================= +*/ + + +typedef struct { + int lastPacketSentTime; // for retransmits + int lastPacketTime; + char servername[MAX_OSPATH]; // name of server from original connect + netadr_t serverAddress; + int connectTime; // for connection retransmits + int connectPacketCount; // for display on connection dialog + + int challenge; // from the server to use for connecting + + int reliableSequence; + int reliableAcknowledge; + char *reliableCommands[MAX_RELIABLE_COMMANDS]; + + // reliable messages received from server + int serverCommandSequence; + char *serverCommands[MAX_RELIABLE_COMMANDS]; + + // big stuff at end of structure so most offsets are 15 bits or less + netchan_t netchan; +} clientConnection_t; + +extern clientConnection_t clc; + +/* +================================================================== + +the clientStatic_t structure is never wiped, and is used even when +no client connection is active at all + +================================================================== +*/ + +typedef struct { + connstate_t state; // connection status + + char servername[MAX_OSPATH]; // name of server from original connect (used by reconnect) + + // when the server clears the hunk, all of these must be restarted + qboolean rendererStarted; + qboolean soundStarted; + qboolean soundRegistered; + qboolean uiStarted; + qboolean cgameStarted; + + int framecount; + int frametime; // msec since last frame + float frametimeFraction; // fraction of a msec since last frame + + int realtime; // ignores pause + float realtimeFraction; // fraction of a msec accumulated + int realFrametime; // ignoring pause, so console always works + + // update server info + char updateInfoString[MAX_INFO_STRING]; + + // rendering info + glconfig_t glconfig; + qhandle_t charSetShader; + qhandle_t whiteShader; + qhandle_t consoleShader; +} clientStatic_t; + +#define CON_TEXTSIZE 0x30000 //was 32768 +#define NUM_CON_TIMES 4 + +typedef struct { + qboolean initialized; + + short text[CON_TEXTSIZE]; + int current; // line where next message will be printed + int x; // offset in current line for next print + int display; // bottom of console displays this line + + int linewidth; // characters across screen + int totallines; // total lines in console scrollback + + float xadjust; // for wide aspect screens + float yadjust; + + float displayFrac; // aproaches finalFrac at scr_conspeed + float finalFrac; // 0.0 to 1.0 lines of console to display + + int vislines; // in scanlines + + int times[NUM_CON_TIMES]; // cls.realtime time the line was generated + // for transparent notify lines + vec4_t color; +} console_t; + +extern clientStatic_t cls; + +//============================================================================= + +extern refexport_t re; // interface to refresh .dll + + +// +// cvars +// +extern cvar_t *cl_nodelta; +extern cvar_t *cl_debugMove; +extern cvar_t *cl_noprint; +extern cvar_t *cl_timegraph; +extern cvar_t *cl_packetdup; +extern cvar_t *cl_shownet; +extern cvar_t *cl_timeNudge; +extern cvar_t *cl_showTimeDelta; + +extern cvar_t *cl_yawspeed; +extern cvar_t *cl_pitchspeed; +extern cvar_t *cl_run; +extern cvar_t *cl_anglespeedkey; + +extern cvar_t *cl_sensitivity; +extern cvar_t *cl_freelook; + +extern cvar_t *cl_mouseAccel; +extern cvar_t *cl_showMouseRate; + +extern cvar_t *cl_inGameVideo; + +extern cvar_t *m_pitch; +extern cvar_t *m_yaw; +extern cvar_t *m_forward; +extern cvar_t *m_side; +extern cvar_t *m_filter; + +extern cvar_t *cl_activeAction; + +extern cvar_t *cl_consoleKeys; + +//================================================= + +// +// cl_main +// + +void CL_Init (void); + +void CL_AddReliableCommand( const char *cmd ); + +void CL_Disconnect_f (void); +void CL_Vid_Restart_f( void ); +void CL_Snd_Restart_f (void); + +qboolean CL_CheckPaused(void); + +// +// cl_input +// +typedef struct { + int down[2]; // key nums holding it down + unsigned downtime; // msec timestamp + unsigned msec; // msec down this frame if both a down and up happened + qboolean active; // current state + qboolean wasPressed; // set when down, not cleared when up +} kbutton_t; + +extern kbutton_t in_mlook, in_klook; +extern kbutton_t in_strafe; +extern kbutton_t in_speed; + +void CL_InitInput (void); +void CL_SendCmd (void); +void CL_ClearState (void); +void CL_ReadPackets (void); +void CL_UpdateHotSwap(void); +bool CL_ExtendSelectTime(void); + +void CL_WritePacket( void ); +void IN_CenterView (void); + +float CL_KeyState (kbutton_t *key); +const char *Key_KeynumToString( int keynum/*, qboolean bTranslate*/ ); //note: translate is only called for menu display not configs + +// +// cl_parse.c +// +extern int cl_connectedToCheatServer; + +void CL_SystemInfoChanged( void ); +void CL_ParseServerMessage( msg_t *msg ); + +//==================================================================== + +// +// console +// +void Con_DrawCharacter (int cx, int line, int num); + +void Con_CheckResize (void); +void Con_Init (void); +void Con_Clear_f (void); +void Con_ToggleConsole_f (void); +void Con_DrawNotify (void); +void Con_ClearNotify (void); +void Con_RunConsole (void); +void Con_DrawConsole (void); +void Con_PageUp( void ); +void Con_PageDown( void ); +void Con_Top( void ); +void Con_Bottom( void ); +void Con_Close( void ); + + +// +// cl_scrn.c +// +void SCR_Init (void); +void SCR_UpdateScreen (void); + +void SCR_DebugGraph (float value, int color); + +int SCR_GetBigStringWidth( const char *str ); // returns in virtual 640x480 coordinates + +void SCR_FillRect( float x, float y, float width, float height, + const float *color ); +void SCR_DrawPic( float x, float y, float width, float height, qhandle_t hShader ); +void SCR_DrawNamedPic( float x, float y, float width, float height, const char *picname ); + +void SCR_DrawBigString( int x, int y, const char *s, float alpha, qboolean noColorEscape ); // draws a string with embedded color control characters with fade +void SCR_DrawBigStringColor( int x, int y, const char *s, vec4_t color, qboolean noColorEscape ); // ignores embedded color control characters +void SCR_DrawSmallStringExt( int x, int y, const char *string, float *setColor, qboolean forceColor, qboolean noColorEscape ); +void SCR_DrawBigChar( int x, int y, int ch ); +void SCR_DrawSmallChar( int x, int y, int ch ); + +<<<<<<< HEAD +void SCR_PrecacheScreenshot(); +======= +#ifdef JK2_MODE +void SCR_PrecacheScreenshot(); +#endif +>>>>>>> 38e3edc40da09b9c20f585a3b939ff493be8bf50 + +// +// cl_cin.c +// +void CL_PlayCinematic_f( void ); +void CL_PlayInGameCinematic_f(void); +qboolean CL_CheckPendingCinematic(void); +qboolean CL_IsRunningInGameCinematic(void); +qboolean CL_InGameCinematicOnStandBy(void); +void SCR_DrawCinematic (void); +void SCR_RunCinematic (void); +void SCR_StopCinematic( qboolean bAllowRefusal = qfalse ); + +int CIN_PlayCinematic( const char *arg0, int xpos, int ypos, int width, int height, int bits, const char *psAudioFile /* = NULL */); +e_status CIN_StopCinematic(int handle); +e_status CIN_RunCinematic (int handle); +void CIN_DrawCinematic (int handle); +void CIN_SetExtents (int handle, int x, int y, int w, int h); +void CIN_SetLooping (int handle, qboolean loop); +void CIN_UploadCinematic(int handle); +void CIN_CloseAllVideos(void); + +// +// cl_cgame.c +// +qboolean CL_InitCGameVM( void *gameLibrary ); +void CL_InitCGame( void ); +void CL_ShutdownCGame( void ); +qboolean CL_GameCommand( void ); +void CL_CGameRendering( stereoFrame_t stereo ); +void CL_SetCGameTime( void ); +void CL_FirstSnapshot( void ); + + +// +// cl_ui.c +// +void CL_InitUI( void ); +void CL_ShutdownUI( void ); +void CL_GenericMenu_f(void); +void CL_DataPad_f(void); +void CL_EndScreenDissolve_f(void); +int Key_GetCatcher( void ); +void Key_SetCatcher( int catcher ); diff --git a/code/client/client.h.BACKUP.7476.h b/code/client/client.h.BACKUP.7476.h new file mode 100644 index 0000000000..a47a70e68e --- /dev/null +++ b/code/client/client.h.BACKUP.7476.h @@ -0,0 +1,425 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +// client.h -- primary header for client +#pragma once + +#include "../qcommon/q_shared.h" +#include "../qcommon/qcommon.h" +#include "../rd-common/tr_public.h" +#include "keys.h" +#include "snd_public.h" +#include "../cgame/cg_public.h" + +// snapshots are a view of the server at a given time +typedef struct { + qboolean valid; // cleared if delta parsing was invalid + int snapFlags; // rate delayed and dropped commands + + int serverTime; // server time the message is valid for (in msec) + + int messageNum; // copied from netchan->incoming_sequence + int deltaNum; // messageNum the delta is from + int ping; // time from when cmdNum-1 was sent to time packet was reeceived + byte areamask[MAX_MAP_AREA_BYTES]; // portalarea visibility bits + + int cmdNum; // the next cmdNum the server is expecting + playerState_t ps; // complete information about the current player at this time + + int numEntities; // all of the entities that need to be presented + int parseEntitiesNum; // at the time of this snapshot + + int serverCommandNum; // execute all commands up to this before + // making the snapshot current +} clSnapshot_t; + + + +/* +============================================================================= + +the clientActive_t structure is wiped completely at every +new gamestate_t, potentially several times during an established connection + +============================================================================= +*/ + +// the parseEntities array must be large enough to hold PACKET_BACKUP frames of +// entities, so that when a delta compressed message arives from the server +// it can be un-deltad from the original +#define MAX_PARSE_ENTITIES 512 + +extern int g_console_field_width; + +typedef struct { + int timeoutcount; + + clSnapshot_t frame; // latest received from server + + int serverTime; + int oldServerTime; // to prevent time from flowing bakcwards + int oldFrameServerTime; // to check tournament restarts + int serverTimeDelta; // cl.serverTime = cls.realtime + cl.serverTimeDelta + // this value changes as net lag varies + qboolean extrapolatedSnapshot; // set if any cgame frame has been forced to extrapolate + // cleared when CL_AdjustTimeDelta looks at it + qboolean newSnapshots; // set on parse, cleared when CL_AdjustTimeDelta looks at it + + gameState_t gameState; // configstrings + char mapname[MAX_QPATH]; // extracted from CS_SERVERINFO + + int parseEntitiesNum; // index (not anded off) into cl_parse_entities[] + + int mouseDx[2], mouseDy[2]; // added to by mouse events + int mouseIndex; + int joystickAxis[MAX_JOYSTICK_AXIS]; // set by joystick events + + int cgameUserCmdValue; // current weapon to add to usercmd_t + float cgameSensitivity; + + // cmds[cmdNumber] is the predicted command, [cmdNumber-1] is the last + // properly generated command + usercmd_t cmds[CMD_BACKUP]; // each mesage will send several old cmds + int cmdNumber; // incremented each frame, because multiple + // frames may need to be packed into a single packet + + int packetTime[PACKET_BACKUP]; // cls.realtime sent, for calculating pings + int packetCmdNumber[PACKET_BACKUP]; // cmdNumber when packet was sent + + // the client maintains its own idea of view angles, which are + // sent to the server each frame. It is cleared to 0 upon entering each level. + // the server sends a delta each frame which is added to the locally + // tracked view angles to account for standing on rotating objects, + // and teleport direction changes + vec3_t viewangles; + + // these are just parsed out of the configstrings for convenience + int serverId; + + // non-gameserver infornamtion + int cinematictime; // cls.realtime for first cinematic frame (FIXME: NO LONGER USED!, but I wasn't sure if I could remove it because of struct sizes assumed elsewhere? -Ste) + + // big stuff at end of structure so most offsets are 15 bits or less + clSnapshot_t frames[PACKET_BACKUP]; + + entityState_t parseEntities[MAX_PARSE_ENTITIES]; + + //DJC added - making force powers in single player work like those in + //multiplayer. This makes hot swapping code more portable. + qboolean gcmdSendValue; + byte gcmdValue; +} clientActive_t; + +extern clientActive_t cl; + +/* +============================================================================= + +the clientConnection_t structure is wiped when disconnecting from a server, +either to go to a full screen console, or connect to a different server + +A connection can be to either a server through the network layer, +or just a streaming cinematic. + +============================================================================= +*/ + + +typedef struct { + int lastPacketSentTime; // for retransmits + int lastPacketTime; + char servername[MAX_OSPATH]; // name of server from original connect + netadr_t serverAddress; + int connectTime; // for connection retransmits + int connectPacketCount; // for display on connection dialog + + int challenge; // from the server to use for connecting + + int reliableSequence; + int reliableAcknowledge; + char *reliableCommands[MAX_RELIABLE_COMMANDS]; + + // reliable messages received from server + int serverCommandSequence; + char *serverCommands[MAX_RELIABLE_COMMANDS]; + + // big stuff at end of structure so most offsets are 15 bits or less + netchan_t netchan; +} clientConnection_t; + +extern clientConnection_t clc; + +/* +================================================================== + +the clientStatic_t structure is never wiped, and is used even when +no client connection is active at all + +================================================================== +*/ + +typedef struct { + connstate_t state; // connection status + + char servername[MAX_OSPATH]; // name of server from original connect (used by reconnect) + + // when the server clears the hunk, all of these must be restarted + qboolean rendererStarted; + qboolean soundStarted; + qboolean soundRegistered; + qboolean uiStarted; + qboolean cgameStarted; + + int framecount; + int frametime; // msec since last frame + float frametimeFraction; // fraction of a msec since last frame + + int realtime; // ignores pause + float realtimeFraction; // fraction of a msec accumulated + int realFrametime; // ignoring pause, so console always works + + // update server info + char updateInfoString[MAX_INFO_STRING]; + + // rendering info + glconfig_t glconfig; + qhandle_t charSetShader; + qhandle_t whiteShader; + qhandle_t consoleShader; +} clientStatic_t; + +#define CON_TEXTSIZE 0x30000 //was 32768 +#define NUM_CON_TIMES 4 + +typedef struct { + qboolean initialized; + + short text[CON_TEXTSIZE]; + int current; // line where next message will be printed + int x; // offset in current line for next print + int display; // bottom of console displays this line + + int linewidth; // characters across screen + int totallines; // total lines in console scrollback + + float xadjust; // for wide aspect screens + float yadjust; + + float displayFrac; // aproaches finalFrac at scr_conspeed + float finalFrac; // 0.0 to 1.0 lines of console to display + + int vislines; // in scanlines + + int times[NUM_CON_TIMES]; // cls.realtime time the line was generated + // for transparent notify lines + vec4_t color; +} console_t; + +extern clientStatic_t cls; + +//============================================================================= + +extern refexport_t re; // interface to refresh .dll + + +// +// cvars +// +extern cvar_t *cl_nodelta; +extern cvar_t *cl_debugMove; +extern cvar_t *cl_noprint; +extern cvar_t *cl_timegraph; +extern cvar_t *cl_packetdup; +extern cvar_t *cl_shownet; +extern cvar_t *cl_timeNudge; +extern cvar_t *cl_showTimeDelta; + +extern cvar_t *cl_yawspeed; +extern cvar_t *cl_pitchspeed; +extern cvar_t *cl_run; +extern cvar_t *cl_anglespeedkey; + +extern cvar_t *cl_sensitivity; +extern cvar_t *cl_freelook; + +extern cvar_t *cl_mouseAccel; +extern cvar_t *cl_showMouseRate; + +extern cvar_t *cl_inGameVideo; + +extern cvar_t *m_pitch; +extern cvar_t *m_yaw; +extern cvar_t *m_forward; +extern cvar_t *m_side; +extern cvar_t *m_filter; + +extern cvar_t *cl_activeAction; + +extern cvar_t *cl_consoleKeys; + +//================================================= + +// +// cl_main +// + +void CL_Init (void); + +void CL_AddReliableCommand( const char *cmd ); + +void CL_Disconnect_f (void); +void CL_Vid_Restart_f( void ); +void CL_Snd_Restart_f (void); + +qboolean CL_CheckPaused(void); + +// +// cl_input +// +typedef struct { + int down[2]; // key nums holding it down + unsigned downtime; // msec timestamp + unsigned msec; // msec down this frame if both a down and up happened + qboolean active; // current state + qboolean wasPressed; // set when down, not cleared when up +} kbutton_t; + +extern kbutton_t in_mlook, in_klook; +extern kbutton_t in_strafe; +extern kbutton_t in_speed; + +void CL_InitInput (void); +void CL_SendCmd (void); +void CL_ClearState (void); +void CL_ReadPackets (void); +void CL_UpdateHotSwap(void); +bool CL_ExtendSelectTime(void); + +void CL_WritePacket( void ); +void IN_CenterView (void); + +float CL_KeyState (kbutton_t *key); +const char *Key_KeynumToString( int keynum/*, qboolean bTranslate*/ ); //note: translate is only called for menu display not configs + +// +// cl_parse.c +// +extern int cl_connectedToCheatServer; + +void CL_SystemInfoChanged( void ); +void CL_ParseServerMessage( msg_t *msg ); + +//==================================================================== + +// +// console +// +void Con_DrawCharacter (int cx, int line, int num); + +void Con_CheckResize (void); +void Con_Init (void); +void Con_Clear_f (void); +void Con_ToggleConsole_f (void); +void Con_DrawNotify (void); +void Con_ClearNotify (void); +void Con_RunConsole (void); +void Con_DrawConsole (void); +void Con_PageUp( void ); +void Con_PageDown( void ); +void Con_Top( void ); +void Con_Bottom( void ); +void Con_Close( void ); + + +// +// cl_scrn.c +// +void SCR_Init (void); +void SCR_UpdateScreen (void); + +void SCR_DebugGraph (float value, int color); + +int SCR_GetBigStringWidth( const char *str ); // returns in virtual 640x480 coordinates + +void SCR_FillRect( float x, float y, float width, float height, + const float *color ); +void SCR_DrawPic( float x, float y, float width, float height, qhandle_t hShader ); +void SCR_DrawNamedPic( float x, float y, float width, float height, const char *picname ); + +void SCR_DrawBigString( int x, int y, const char *s, float alpha, qboolean noColorEscape ); // draws a string with embedded color control characters with fade +void SCR_DrawBigStringColor( int x, int y, const char *s, vec4_t color, qboolean noColorEscape ); // ignores embedded color control characters +void SCR_DrawSmallStringExt( int x, int y, const char *string, float *setColor, qboolean forceColor, qboolean noColorEscape ); +void SCR_DrawBigChar( int x, int y, int ch ); +void SCR_DrawSmallChar( int x, int y, int ch ); + +<<<<<<< HEAD +void SCR_PrecacheScreenshot(); +======= +#ifdef JK2_MODE +void SCR_PrecacheScreenshot(); +#endif +>>>>>>> 38e3edc40da09b9c20f585a3b939ff493be8bf50 + +// +// cl_cin.c +// +void CL_PlayCinematic_f( void ); +void CL_PlayInGameCinematic_f(void); +qboolean CL_CheckPendingCinematic(void); +qboolean CL_IsRunningInGameCinematic(void); +qboolean CL_InGameCinematicOnStandBy(void); +void SCR_DrawCinematic (void); +void SCR_RunCinematic (void); +void SCR_StopCinematic( qboolean bAllowRefusal = qfalse ); + +int CIN_PlayCinematic( const char *arg0, int xpos, int ypos, int width, int height, int bits, const char *psAudioFile /* = NULL */); +e_status CIN_StopCinematic(int handle); +e_status CIN_RunCinematic (int handle); +void CIN_DrawCinematic (int handle); +void CIN_SetExtents (int handle, int x, int y, int w, int h); +void CIN_SetLooping (int handle, qboolean loop); +void CIN_UploadCinematic(int handle); +void CIN_CloseAllVideos(void); + +// +// cl_cgame.c +// +qboolean CL_InitCGameVM( void *gameLibrary ); +void CL_InitCGame( void ); +void CL_ShutdownCGame( void ); +qboolean CL_GameCommand( void ); +void CL_CGameRendering( stereoFrame_t stereo ); +void CL_SetCGameTime( void ); +void CL_FirstSnapshot( void ); + + +// +// cl_ui.c +// +void CL_InitUI( void ); +void CL_ShutdownUI( void ); +void CL_GenericMenu_f(void); +void CL_DataPad_f(void); +void CL_EndScreenDissolve_f(void); +int Key_GetCatcher( void ); +void Key_SetCatcher( int catcher ); diff --git a/code/client/client.h.BACKUP.8932.h b/code/client/client.h.BACKUP.8932.h new file mode 100644 index 0000000000..a47a70e68e --- /dev/null +++ b/code/client/client.h.BACKUP.8932.h @@ -0,0 +1,425 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +// client.h -- primary header for client +#pragma once + +#include "../qcommon/q_shared.h" +#include "../qcommon/qcommon.h" +#include "../rd-common/tr_public.h" +#include "keys.h" +#include "snd_public.h" +#include "../cgame/cg_public.h" + +// snapshots are a view of the server at a given time +typedef struct { + qboolean valid; // cleared if delta parsing was invalid + int snapFlags; // rate delayed and dropped commands + + int serverTime; // server time the message is valid for (in msec) + + int messageNum; // copied from netchan->incoming_sequence + int deltaNum; // messageNum the delta is from + int ping; // time from when cmdNum-1 was sent to time packet was reeceived + byte areamask[MAX_MAP_AREA_BYTES]; // portalarea visibility bits + + int cmdNum; // the next cmdNum the server is expecting + playerState_t ps; // complete information about the current player at this time + + int numEntities; // all of the entities that need to be presented + int parseEntitiesNum; // at the time of this snapshot + + int serverCommandNum; // execute all commands up to this before + // making the snapshot current +} clSnapshot_t; + + + +/* +============================================================================= + +the clientActive_t structure is wiped completely at every +new gamestate_t, potentially several times during an established connection + +============================================================================= +*/ + +// the parseEntities array must be large enough to hold PACKET_BACKUP frames of +// entities, so that when a delta compressed message arives from the server +// it can be un-deltad from the original +#define MAX_PARSE_ENTITIES 512 + +extern int g_console_field_width; + +typedef struct { + int timeoutcount; + + clSnapshot_t frame; // latest received from server + + int serverTime; + int oldServerTime; // to prevent time from flowing bakcwards + int oldFrameServerTime; // to check tournament restarts + int serverTimeDelta; // cl.serverTime = cls.realtime + cl.serverTimeDelta + // this value changes as net lag varies + qboolean extrapolatedSnapshot; // set if any cgame frame has been forced to extrapolate + // cleared when CL_AdjustTimeDelta looks at it + qboolean newSnapshots; // set on parse, cleared when CL_AdjustTimeDelta looks at it + + gameState_t gameState; // configstrings + char mapname[MAX_QPATH]; // extracted from CS_SERVERINFO + + int parseEntitiesNum; // index (not anded off) into cl_parse_entities[] + + int mouseDx[2], mouseDy[2]; // added to by mouse events + int mouseIndex; + int joystickAxis[MAX_JOYSTICK_AXIS]; // set by joystick events + + int cgameUserCmdValue; // current weapon to add to usercmd_t + float cgameSensitivity; + + // cmds[cmdNumber] is the predicted command, [cmdNumber-1] is the last + // properly generated command + usercmd_t cmds[CMD_BACKUP]; // each mesage will send several old cmds + int cmdNumber; // incremented each frame, because multiple + // frames may need to be packed into a single packet + + int packetTime[PACKET_BACKUP]; // cls.realtime sent, for calculating pings + int packetCmdNumber[PACKET_BACKUP]; // cmdNumber when packet was sent + + // the client maintains its own idea of view angles, which are + // sent to the server each frame. It is cleared to 0 upon entering each level. + // the server sends a delta each frame which is added to the locally + // tracked view angles to account for standing on rotating objects, + // and teleport direction changes + vec3_t viewangles; + + // these are just parsed out of the configstrings for convenience + int serverId; + + // non-gameserver infornamtion + int cinematictime; // cls.realtime for first cinematic frame (FIXME: NO LONGER USED!, but I wasn't sure if I could remove it because of struct sizes assumed elsewhere? -Ste) + + // big stuff at end of structure so most offsets are 15 bits or less + clSnapshot_t frames[PACKET_BACKUP]; + + entityState_t parseEntities[MAX_PARSE_ENTITIES]; + + //DJC added - making force powers in single player work like those in + //multiplayer. This makes hot swapping code more portable. + qboolean gcmdSendValue; + byte gcmdValue; +} clientActive_t; + +extern clientActive_t cl; + +/* +============================================================================= + +the clientConnection_t structure is wiped when disconnecting from a server, +either to go to a full screen console, or connect to a different server + +A connection can be to either a server through the network layer, +or just a streaming cinematic. + +============================================================================= +*/ + + +typedef struct { + int lastPacketSentTime; // for retransmits + int lastPacketTime; + char servername[MAX_OSPATH]; // name of server from original connect + netadr_t serverAddress; + int connectTime; // for connection retransmits + int connectPacketCount; // for display on connection dialog + + int challenge; // from the server to use for connecting + + int reliableSequence; + int reliableAcknowledge; + char *reliableCommands[MAX_RELIABLE_COMMANDS]; + + // reliable messages received from server + int serverCommandSequence; + char *serverCommands[MAX_RELIABLE_COMMANDS]; + + // big stuff at end of structure so most offsets are 15 bits or less + netchan_t netchan; +} clientConnection_t; + +extern clientConnection_t clc; + +/* +================================================================== + +the clientStatic_t structure is never wiped, and is used even when +no client connection is active at all + +================================================================== +*/ + +typedef struct { + connstate_t state; // connection status + + char servername[MAX_OSPATH]; // name of server from original connect (used by reconnect) + + // when the server clears the hunk, all of these must be restarted + qboolean rendererStarted; + qboolean soundStarted; + qboolean soundRegistered; + qboolean uiStarted; + qboolean cgameStarted; + + int framecount; + int frametime; // msec since last frame + float frametimeFraction; // fraction of a msec since last frame + + int realtime; // ignores pause + float realtimeFraction; // fraction of a msec accumulated + int realFrametime; // ignoring pause, so console always works + + // update server info + char updateInfoString[MAX_INFO_STRING]; + + // rendering info + glconfig_t glconfig; + qhandle_t charSetShader; + qhandle_t whiteShader; + qhandle_t consoleShader; +} clientStatic_t; + +#define CON_TEXTSIZE 0x30000 //was 32768 +#define NUM_CON_TIMES 4 + +typedef struct { + qboolean initialized; + + short text[CON_TEXTSIZE]; + int current; // line where next message will be printed + int x; // offset in current line for next print + int display; // bottom of console displays this line + + int linewidth; // characters across screen + int totallines; // total lines in console scrollback + + float xadjust; // for wide aspect screens + float yadjust; + + float displayFrac; // aproaches finalFrac at scr_conspeed + float finalFrac; // 0.0 to 1.0 lines of console to display + + int vislines; // in scanlines + + int times[NUM_CON_TIMES]; // cls.realtime time the line was generated + // for transparent notify lines + vec4_t color; +} console_t; + +extern clientStatic_t cls; + +//============================================================================= + +extern refexport_t re; // interface to refresh .dll + + +// +// cvars +// +extern cvar_t *cl_nodelta; +extern cvar_t *cl_debugMove; +extern cvar_t *cl_noprint; +extern cvar_t *cl_timegraph; +extern cvar_t *cl_packetdup; +extern cvar_t *cl_shownet; +extern cvar_t *cl_timeNudge; +extern cvar_t *cl_showTimeDelta; + +extern cvar_t *cl_yawspeed; +extern cvar_t *cl_pitchspeed; +extern cvar_t *cl_run; +extern cvar_t *cl_anglespeedkey; + +extern cvar_t *cl_sensitivity; +extern cvar_t *cl_freelook; + +extern cvar_t *cl_mouseAccel; +extern cvar_t *cl_showMouseRate; + +extern cvar_t *cl_inGameVideo; + +extern cvar_t *m_pitch; +extern cvar_t *m_yaw; +extern cvar_t *m_forward; +extern cvar_t *m_side; +extern cvar_t *m_filter; + +extern cvar_t *cl_activeAction; + +extern cvar_t *cl_consoleKeys; + +//================================================= + +// +// cl_main +// + +void CL_Init (void); + +void CL_AddReliableCommand( const char *cmd ); + +void CL_Disconnect_f (void); +void CL_Vid_Restart_f( void ); +void CL_Snd_Restart_f (void); + +qboolean CL_CheckPaused(void); + +// +// cl_input +// +typedef struct { + int down[2]; // key nums holding it down + unsigned downtime; // msec timestamp + unsigned msec; // msec down this frame if both a down and up happened + qboolean active; // current state + qboolean wasPressed; // set when down, not cleared when up +} kbutton_t; + +extern kbutton_t in_mlook, in_klook; +extern kbutton_t in_strafe; +extern kbutton_t in_speed; + +void CL_InitInput (void); +void CL_SendCmd (void); +void CL_ClearState (void); +void CL_ReadPackets (void); +void CL_UpdateHotSwap(void); +bool CL_ExtendSelectTime(void); + +void CL_WritePacket( void ); +void IN_CenterView (void); + +float CL_KeyState (kbutton_t *key); +const char *Key_KeynumToString( int keynum/*, qboolean bTranslate*/ ); //note: translate is only called for menu display not configs + +// +// cl_parse.c +// +extern int cl_connectedToCheatServer; + +void CL_SystemInfoChanged( void ); +void CL_ParseServerMessage( msg_t *msg ); + +//==================================================================== + +// +// console +// +void Con_DrawCharacter (int cx, int line, int num); + +void Con_CheckResize (void); +void Con_Init (void); +void Con_Clear_f (void); +void Con_ToggleConsole_f (void); +void Con_DrawNotify (void); +void Con_ClearNotify (void); +void Con_RunConsole (void); +void Con_DrawConsole (void); +void Con_PageUp( void ); +void Con_PageDown( void ); +void Con_Top( void ); +void Con_Bottom( void ); +void Con_Close( void ); + + +// +// cl_scrn.c +// +void SCR_Init (void); +void SCR_UpdateScreen (void); + +void SCR_DebugGraph (float value, int color); + +int SCR_GetBigStringWidth( const char *str ); // returns in virtual 640x480 coordinates + +void SCR_FillRect( float x, float y, float width, float height, + const float *color ); +void SCR_DrawPic( float x, float y, float width, float height, qhandle_t hShader ); +void SCR_DrawNamedPic( float x, float y, float width, float height, const char *picname ); + +void SCR_DrawBigString( int x, int y, const char *s, float alpha, qboolean noColorEscape ); // draws a string with embedded color control characters with fade +void SCR_DrawBigStringColor( int x, int y, const char *s, vec4_t color, qboolean noColorEscape ); // ignores embedded color control characters +void SCR_DrawSmallStringExt( int x, int y, const char *string, float *setColor, qboolean forceColor, qboolean noColorEscape ); +void SCR_DrawBigChar( int x, int y, int ch ); +void SCR_DrawSmallChar( int x, int y, int ch ); + +<<<<<<< HEAD +void SCR_PrecacheScreenshot(); +======= +#ifdef JK2_MODE +void SCR_PrecacheScreenshot(); +#endif +>>>>>>> 38e3edc40da09b9c20f585a3b939ff493be8bf50 + +// +// cl_cin.c +// +void CL_PlayCinematic_f( void ); +void CL_PlayInGameCinematic_f(void); +qboolean CL_CheckPendingCinematic(void); +qboolean CL_IsRunningInGameCinematic(void); +qboolean CL_InGameCinematicOnStandBy(void); +void SCR_DrawCinematic (void); +void SCR_RunCinematic (void); +void SCR_StopCinematic( qboolean bAllowRefusal = qfalse ); + +int CIN_PlayCinematic( const char *arg0, int xpos, int ypos, int width, int height, int bits, const char *psAudioFile /* = NULL */); +e_status CIN_StopCinematic(int handle); +e_status CIN_RunCinematic (int handle); +void CIN_DrawCinematic (int handle); +void CIN_SetExtents (int handle, int x, int y, int w, int h); +void CIN_SetLooping (int handle, qboolean loop); +void CIN_UploadCinematic(int handle); +void CIN_CloseAllVideos(void); + +// +// cl_cgame.c +// +qboolean CL_InitCGameVM( void *gameLibrary ); +void CL_InitCGame( void ); +void CL_ShutdownCGame( void ); +qboolean CL_GameCommand( void ); +void CL_CGameRendering( stereoFrame_t stereo ); +void CL_SetCGameTime( void ); +void CL_FirstSnapshot( void ); + + +// +// cl_ui.c +// +void CL_InitUI( void ); +void CL_ShutdownUI( void ); +void CL_GenericMenu_f(void); +void CL_DataPad_f(void); +void CL_EndScreenDissolve_f(void); +int Key_GetCatcher( void ); +void Key_SetCatcher( int catcher ); diff --git a/code/client/client.h.BASE.2896.h b/code/client/client.h.BASE.2896.h new file mode 100644 index 0000000000..89cf670b37 --- /dev/null +++ b/code/client/client.h.BASE.2896.h @@ -0,0 +1,417 @@ +/* +This file is part of Jedi Academy. + + Jedi Academy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + Jedi Academy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Jedi Academy. If not, see . +*/ +// Copyright 2001-2013 Raven Software + +// client.h -- primary header for client +#pragma once +#ifndef __CLIENT_H__ +#define __CLIENT_H__ + +#include "../qcommon/q_shared.h" +#include "../qcommon/qcommon.h" +#include "../rd-common/tr_public.h" +#include "keys.h" +#include "snd_public.h" +#include "../cgame/cg_public.h" + +// snapshots are a view of the server at a given time +typedef struct { + qboolean valid; // cleared if delta parsing was invalid + int snapFlags; // rate delayed and dropped commands + + int serverTime; // server time the message is valid for (in msec) + + int messageNum; // copied from netchan->incoming_sequence + int deltaNum; // messageNum the delta is from + int ping; // time from when cmdNum-1 was sent to time packet was reeceived + byte areamask[MAX_MAP_AREA_BYTES]; // portalarea visibility bits + + int cmdNum; // the next cmdNum the server is expecting + playerState_t ps; // complete information about the current player at this time + + int numEntities; // all of the entities that need to be presented + int parseEntitiesNum; // at the time of this snapshot + + int serverCommandNum; // execute all commands up to this before + // making the snapshot current +} clSnapshot_t; + + + +/* +============================================================================= + +the clientActive_t structure is wiped completely at every +new gamestate_t, potentially several times during an established connection + +============================================================================= +*/ + +// the parseEntities array must be large enough to hold PACKET_BACKUP frames of +// entities, so that when a delta compressed message arives from the server +// it can be un-deltad from the original +#define MAX_PARSE_ENTITIES 512 + +extern int g_console_field_width; + +typedef struct { + int timeoutcount; + + clSnapshot_t frame; // latest received from server + + int serverTime; + int oldServerTime; // to prevent time from flowing bakcwards + int oldFrameServerTime; // to check tournament restarts + int serverTimeDelta; // cl.serverTime = cls.realtime + cl.serverTimeDelta + // this value changes as net lag varies + qboolean extrapolatedSnapshot; // set if any cgame frame has been forced to extrapolate + // cleared when CL_AdjustTimeDelta looks at it + qboolean newSnapshots; // set on parse, cleared when CL_AdjustTimeDelta looks at it + + gameState_t gameState; // configstrings + char mapname[MAX_QPATH]; // extracted from CS_SERVERINFO + + int parseEntitiesNum; // index (not anded off) into cl_parse_entities[] + + int mouseDx[2], mouseDy[2]; // added to by mouse events + int mouseIndex; + int joystickAxis[MAX_JOYSTICK_AXIS]; // set by joystick events + + int cgameUserCmdValue; // current weapon to add to usercmd_t + float cgameSensitivity; + + // cmds[cmdNumber] is the predicted command, [cmdNumber-1] is the last + // properly generated command + usercmd_t cmds[CMD_BACKUP]; // each mesage will send several old cmds + int cmdNumber; // incremented each frame, because multiple + // frames may need to be packed into a single packet + + int packetTime[PACKET_BACKUP]; // cls.realtime sent, for calculating pings + int packetCmdNumber[PACKET_BACKUP]; // cmdNumber when packet was sent + + // the client maintains its own idea of view angles, which are + // sent to the server each frame. It is cleared to 0 upon entering each level. + // the server sends a delta each frame which is added to the locally + // tracked view angles to account for standing on rotating objects, + // and teleport direction changes + vec3_t viewangles; + + // these are just parsed out of the configstrings for convenience + int serverId; + + // non-gameserver infornamtion + int cinematictime; // cls.realtime for first cinematic frame (FIXME: NO LONGER USED!, but I wasn't sure if I could remove it because of struct sizes assumed elsewhere? -Ste) + + // big stuff at end of structure so most offsets are 15 bits or less + clSnapshot_t frames[PACKET_BACKUP]; + + entityState_t parseEntities[MAX_PARSE_ENTITIES]; + + //DJC added - making force powers in single player work like those in + //multiplayer. This makes hot swapping code more portable. + qboolean gcmdSendValue; + byte gcmdValue; +} clientActive_t; + +extern clientActive_t cl; + +/* +============================================================================= + +the clientConnection_t structure is wiped when disconnecting from a server, +either to go to a full screen console, or connect to a different server + +A connection can be to either a server through the network layer, +or just a streaming cinematic. + +============================================================================= +*/ + + +typedef struct { + int lastPacketSentTime; // for retransmits + int lastPacketTime; + char servername[MAX_OSPATH]; // name of server from original connect + netadr_t serverAddress; + int connectTime; // for connection retransmits + int connectPacketCount; // for display on connection dialog + + int challenge; // from the server to use for connecting + + int reliableSequence; + int reliableAcknowledge; + char *reliableCommands[MAX_RELIABLE_COMMANDS]; + + // reliable messages received from server + int serverCommandSequence; + char *serverCommands[MAX_RELIABLE_COMMANDS]; + + // big stuff at end of structure so most offsets are 15 bits or less + netchan_t netchan; +} clientConnection_t; + +extern clientConnection_t clc; + +/* +================================================================== + +the clientStatic_t structure is never wiped, and is used even when +no client connection is active at all + +================================================================== +*/ + +typedef struct { + connstate_t state; // connection status + + char servername[MAX_OSPATH]; // name of server from original connect (used by reconnect) + + // when the server clears the hunk, all of these must be restarted + qboolean rendererStarted; + qboolean soundStarted; + qboolean soundRegistered; + qboolean uiStarted; + qboolean cgameStarted; + + int framecount; + int frametime; // msec since last frame + float frametimeFraction; // fraction of a msec since last frame + + int realtime; // ignores pause + float realtimeFraction; // fraction of a msec accumulated + int realFrametime; // ignoring pause, so console always works + + // update server info + char updateInfoString[MAX_INFO_STRING]; + + // rendering info + glconfig_t glconfig; + qhandle_t charSetShader; + qhandle_t whiteShader; + qhandle_t consoleShader; +} clientStatic_t; + +#define CON_TEXTSIZE 0x30000 //was 32768 +#define NUM_CON_TIMES 4 + +typedef struct { + qboolean initialized; + + short text[CON_TEXTSIZE]; + int current; // line where next message will be printed + int x; // offset in current line for next print + int display; // bottom of console displays this line + + int linewidth; // characters across screen + int totallines; // total lines in console scrollback + + float xadjust; // for wide aspect screens + float yadjust; + + float displayFrac; // aproaches finalFrac at scr_conspeed + float finalFrac; // 0.0 to 1.0 lines of console to display + + int vislines; // in scanlines + + int times[NUM_CON_TIMES]; // cls.realtime time the line was generated + // for transparent notify lines + vec4_t color; +} console_t; + +extern clientStatic_t cls; + +//============================================================================= + +extern refexport_t re; // interface to refresh .dll + + +// +// cvars +// +extern cvar_t *cl_nodelta; +extern cvar_t *cl_debugMove; +extern cvar_t *cl_noprint; +extern cvar_t *cl_timegraph; +extern cvar_t *cl_packetdup; +extern cvar_t *cl_shownet; +extern cvar_t *cl_timeNudge; +extern cvar_t *cl_showTimeDelta; + +extern cvar_t *cl_yawspeed; +extern cvar_t *cl_pitchspeed; +extern cvar_t *cl_run; +extern cvar_t *cl_anglespeedkey; + +extern cvar_t *cl_sensitivity; +extern cvar_t *cl_freelook; + +extern cvar_t *cl_mouseAccel; +extern cvar_t *cl_showMouseRate; + +extern cvar_t *cl_inGameVideo; + +extern cvar_t *m_pitch; +extern cvar_t *m_yaw; +extern cvar_t *m_forward; +extern cvar_t *m_side; +extern cvar_t *m_filter; + +extern cvar_t *cl_activeAction; + +#ifndef _WIN32 +extern cvar_t *cl_consoleKeys; +#endif + +//================================================= + +// +// cl_main +// + +void CL_Init (void); + +void CL_AddReliableCommand( const char *cmd ); + +void CL_Disconnect_f (void); +void CL_Vid_Restart_f( void ); +void CL_Snd_Restart_f (void); + +qboolean CL_CheckPaused(void); + +// +// cl_input +// +typedef struct { + int down[2]; // key nums holding it down + unsigned downtime; // msec timestamp + unsigned msec; // msec down this frame if both a down and up happened + qboolean active; // current state + qboolean wasPressed; // set when down, not cleared when up +} kbutton_t; + +extern kbutton_t in_mlook, in_klook; +extern kbutton_t in_strafe; +extern kbutton_t in_speed; + +void CL_InitInput (void); +void CL_SendCmd (void); +void CL_ClearState (void); +void CL_ReadPackets (void); +void CL_UpdateHotSwap(void); +bool CL_ExtendSelectTime(void); + +void CL_WritePacket( void ); +void IN_CenterView (void); + +float CL_KeyState (kbutton_t *key); +const char *Key_KeynumToString( int keynum/*, qboolean bTranslate*/ ); //note: translate is only called for menu display not configs + +// +// cl_parse.c +// +extern int cl_connectedToCheatServer; + +void CL_SystemInfoChanged( void ); +void CL_ParseServerMessage( msg_t *msg ); + +//==================================================================== + +// +// console +// +void Con_DrawCharacter (int cx, int line, int num); + +void Con_CheckResize (void); +void Con_Init (void); +void Con_Clear_f (void); +void Con_ToggleConsole_f (void); +void Con_DrawNotify (void); +void Con_ClearNotify (void); +void Con_RunConsole (void); +void Con_DrawConsole (void); +void Con_PageUp( void ); +void Con_PageDown( void ); +void Con_Top( void ); +void Con_Bottom( void ); +void Con_Close( void ); + + +// +// cl_scrn.c +// +void SCR_Init (void); +void SCR_UpdateScreen (void); + +void SCR_DebugGraph (float value, int color); + +int SCR_GetBigStringWidth( const char *str ); // returns in virtual 640x480 coordinates + +void SCR_FillRect( float x, float y, float width, float height, + const float *color ); +void SCR_DrawPic( float x, float y, float width, float height, qhandle_t hShader ); +void SCR_DrawNamedPic( float x, float y, float width, float height, const char *picname ); + +void SCR_DrawBigString( int x, int y, const char *s, float alpha, qboolean noColorEscape ); // draws a string with embedded color control characters with fade +void SCR_DrawBigStringColor( int x, int y, const char *s, vec4_t color, qboolean noColorEscape ); // ignores embedded color control characters +void SCR_DrawSmallStringExt( int x, int y, const char *string, float *setColor, qboolean forceColor, qboolean noColorEscape ); +void SCR_DrawBigChar( int x, int y, int ch ); +void SCR_DrawSmallChar( int x, int y, int ch ); + +// +// cl_cin.c +// +void CL_PlayCinematic_f( void ); +void CL_PlayInGameCinematic_f(void); +qboolean CL_CheckPendingCinematic(void); +qboolean CL_IsRunningInGameCinematic(void); +qboolean CL_InGameCinematicOnStandBy(void); +void SCR_DrawCinematic (void); +void SCR_RunCinematic (void); +void SCR_StopCinematic( qboolean bAllowRefusal = qfalse ); + +int CIN_PlayCinematic( const char *arg0, int xpos, int ypos, int width, int height, int bits, const char *psAudioFile /* = NULL */); +e_status CIN_StopCinematic(int handle); +e_status CIN_RunCinematic (int handle); +void CIN_DrawCinematic (int handle); +void CIN_SetExtents (int handle, int x, int y, int w, int h); +void CIN_SetLooping (int handle, qboolean loop); +void CIN_UploadCinematic(int handle); +void CIN_CloseAllVideos(void); + +// +// cl_cgame.c +// +void CL_InitCGame( void ); +void CL_ShutdownCGame( void ); +qboolean CL_GameCommand( void ); +void CL_CGameRendering( stereoFrame_t stereo ); +void CL_SetCGameTime( void ); +void CL_FirstSnapshot( void ); + + +// +// cl_ui.c +// +void CL_InitUI( void ); +void CL_ShutdownUI( void ); +void CL_GenericMenu_f(void); +void CL_DataPad_f(void); +void CL_EndScreenDissolve_f(void); +int Key_GetCatcher( void ); +void Key_SetCatcher( int catcher ); + +#endif //__CLIENT_H__ diff --git a/code/client/client.h.BASE.7476.h b/code/client/client.h.BASE.7476.h new file mode 100644 index 0000000000..89cf670b37 --- /dev/null +++ b/code/client/client.h.BASE.7476.h @@ -0,0 +1,417 @@ +/* +This file is part of Jedi Academy. + + Jedi Academy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + Jedi Academy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Jedi Academy. If not, see . +*/ +// Copyright 2001-2013 Raven Software + +// client.h -- primary header for client +#pragma once +#ifndef __CLIENT_H__ +#define __CLIENT_H__ + +#include "../qcommon/q_shared.h" +#include "../qcommon/qcommon.h" +#include "../rd-common/tr_public.h" +#include "keys.h" +#include "snd_public.h" +#include "../cgame/cg_public.h" + +// snapshots are a view of the server at a given time +typedef struct { + qboolean valid; // cleared if delta parsing was invalid + int snapFlags; // rate delayed and dropped commands + + int serverTime; // server time the message is valid for (in msec) + + int messageNum; // copied from netchan->incoming_sequence + int deltaNum; // messageNum the delta is from + int ping; // time from when cmdNum-1 was sent to time packet was reeceived + byte areamask[MAX_MAP_AREA_BYTES]; // portalarea visibility bits + + int cmdNum; // the next cmdNum the server is expecting + playerState_t ps; // complete information about the current player at this time + + int numEntities; // all of the entities that need to be presented + int parseEntitiesNum; // at the time of this snapshot + + int serverCommandNum; // execute all commands up to this before + // making the snapshot current +} clSnapshot_t; + + + +/* +============================================================================= + +the clientActive_t structure is wiped completely at every +new gamestate_t, potentially several times during an established connection + +============================================================================= +*/ + +// the parseEntities array must be large enough to hold PACKET_BACKUP frames of +// entities, so that when a delta compressed message arives from the server +// it can be un-deltad from the original +#define MAX_PARSE_ENTITIES 512 + +extern int g_console_field_width; + +typedef struct { + int timeoutcount; + + clSnapshot_t frame; // latest received from server + + int serverTime; + int oldServerTime; // to prevent time from flowing bakcwards + int oldFrameServerTime; // to check tournament restarts + int serverTimeDelta; // cl.serverTime = cls.realtime + cl.serverTimeDelta + // this value changes as net lag varies + qboolean extrapolatedSnapshot; // set if any cgame frame has been forced to extrapolate + // cleared when CL_AdjustTimeDelta looks at it + qboolean newSnapshots; // set on parse, cleared when CL_AdjustTimeDelta looks at it + + gameState_t gameState; // configstrings + char mapname[MAX_QPATH]; // extracted from CS_SERVERINFO + + int parseEntitiesNum; // index (not anded off) into cl_parse_entities[] + + int mouseDx[2], mouseDy[2]; // added to by mouse events + int mouseIndex; + int joystickAxis[MAX_JOYSTICK_AXIS]; // set by joystick events + + int cgameUserCmdValue; // current weapon to add to usercmd_t + float cgameSensitivity; + + // cmds[cmdNumber] is the predicted command, [cmdNumber-1] is the last + // properly generated command + usercmd_t cmds[CMD_BACKUP]; // each mesage will send several old cmds + int cmdNumber; // incremented each frame, because multiple + // frames may need to be packed into a single packet + + int packetTime[PACKET_BACKUP]; // cls.realtime sent, for calculating pings + int packetCmdNumber[PACKET_BACKUP]; // cmdNumber when packet was sent + + // the client maintains its own idea of view angles, which are + // sent to the server each frame. It is cleared to 0 upon entering each level. + // the server sends a delta each frame which is added to the locally + // tracked view angles to account for standing on rotating objects, + // and teleport direction changes + vec3_t viewangles; + + // these are just parsed out of the configstrings for convenience + int serverId; + + // non-gameserver infornamtion + int cinematictime; // cls.realtime for first cinematic frame (FIXME: NO LONGER USED!, but I wasn't sure if I could remove it because of struct sizes assumed elsewhere? -Ste) + + // big stuff at end of structure so most offsets are 15 bits or less + clSnapshot_t frames[PACKET_BACKUP]; + + entityState_t parseEntities[MAX_PARSE_ENTITIES]; + + //DJC added - making force powers in single player work like those in + //multiplayer. This makes hot swapping code more portable. + qboolean gcmdSendValue; + byte gcmdValue; +} clientActive_t; + +extern clientActive_t cl; + +/* +============================================================================= + +the clientConnection_t structure is wiped when disconnecting from a server, +either to go to a full screen console, or connect to a different server + +A connection can be to either a server through the network layer, +or just a streaming cinematic. + +============================================================================= +*/ + + +typedef struct { + int lastPacketSentTime; // for retransmits + int lastPacketTime; + char servername[MAX_OSPATH]; // name of server from original connect + netadr_t serverAddress; + int connectTime; // for connection retransmits + int connectPacketCount; // for display on connection dialog + + int challenge; // from the server to use for connecting + + int reliableSequence; + int reliableAcknowledge; + char *reliableCommands[MAX_RELIABLE_COMMANDS]; + + // reliable messages received from server + int serverCommandSequence; + char *serverCommands[MAX_RELIABLE_COMMANDS]; + + // big stuff at end of structure so most offsets are 15 bits or less + netchan_t netchan; +} clientConnection_t; + +extern clientConnection_t clc; + +/* +================================================================== + +the clientStatic_t structure is never wiped, and is used even when +no client connection is active at all + +================================================================== +*/ + +typedef struct { + connstate_t state; // connection status + + char servername[MAX_OSPATH]; // name of server from original connect (used by reconnect) + + // when the server clears the hunk, all of these must be restarted + qboolean rendererStarted; + qboolean soundStarted; + qboolean soundRegistered; + qboolean uiStarted; + qboolean cgameStarted; + + int framecount; + int frametime; // msec since last frame + float frametimeFraction; // fraction of a msec since last frame + + int realtime; // ignores pause + float realtimeFraction; // fraction of a msec accumulated + int realFrametime; // ignoring pause, so console always works + + // update server info + char updateInfoString[MAX_INFO_STRING]; + + // rendering info + glconfig_t glconfig; + qhandle_t charSetShader; + qhandle_t whiteShader; + qhandle_t consoleShader; +} clientStatic_t; + +#define CON_TEXTSIZE 0x30000 //was 32768 +#define NUM_CON_TIMES 4 + +typedef struct { + qboolean initialized; + + short text[CON_TEXTSIZE]; + int current; // line where next message will be printed + int x; // offset in current line for next print + int display; // bottom of console displays this line + + int linewidth; // characters across screen + int totallines; // total lines in console scrollback + + float xadjust; // for wide aspect screens + float yadjust; + + float displayFrac; // aproaches finalFrac at scr_conspeed + float finalFrac; // 0.0 to 1.0 lines of console to display + + int vislines; // in scanlines + + int times[NUM_CON_TIMES]; // cls.realtime time the line was generated + // for transparent notify lines + vec4_t color; +} console_t; + +extern clientStatic_t cls; + +//============================================================================= + +extern refexport_t re; // interface to refresh .dll + + +// +// cvars +// +extern cvar_t *cl_nodelta; +extern cvar_t *cl_debugMove; +extern cvar_t *cl_noprint; +extern cvar_t *cl_timegraph; +extern cvar_t *cl_packetdup; +extern cvar_t *cl_shownet; +extern cvar_t *cl_timeNudge; +extern cvar_t *cl_showTimeDelta; + +extern cvar_t *cl_yawspeed; +extern cvar_t *cl_pitchspeed; +extern cvar_t *cl_run; +extern cvar_t *cl_anglespeedkey; + +extern cvar_t *cl_sensitivity; +extern cvar_t *cl_freelook; + +extern cvar_t *cl_mouseAccel; +extern cvar_t *cl_showMouseRate; + +extern cvar_t *cl_inGameVideo; + +extern cvar_t *m_pitch; +extern cvar_t *m_yaw; +extern cvar_t *m_forward; +extern cvar_t *m_side; +extern cvar_t *m_filter; + +extern cvar_t *cl_activeAction; + +#ifndef _WIN32 +extern cvar_t *cl_consoleKeys; +#endif + +//================================================= + +// +// cl_main +// + +void CL_Init (void); + +void CL_AddReliableCommand( const char *cmd ); + +void CL_Disconnect_f (void); +void CL_Vid_Restart_f( void ); +void CL_Snd_Restart_f (void); + +qboolean CL_CheckPaused(void); + +// +// cl_input +// +typedef struct { + int down[2]; // key nums holding it down + unsigned downtime; // msec timestamp + unsigned msec; // msec down this frame if both a down and up happened + qboolean active; // current state + qboolean wasPressed; // set when down, not cleared when up +} kbutton_t; + +extern kbutton_t in_mlook, in_klook; +extern kbutton_t in_strafe; +extern kbutton_t in_speed; + +void CL_InitInput (void); +void CL_SendCmd (void); +void CL_ClearState (void); +void CL_ReadPackets (void); +void CL_UpdateHotSwap(void); +bool CL_ExtendSelectTime(void); + +void CL_WritePacket( void ); +void IN_CenterView (void); + +float CL_KeyState (kbutton_t *key); +const char *Key_KeynumToString( int keynum/*, qboolean bTranslate*/ ); //note: translate is only called for menu display not configs + +// +// cl_parse.c +// +extern int cl_connectedToCheatServer; + +void CL_SystemInfoChanged( void ); +void CL_ParseServerMessage( msg_t *msg ); + +//==================================================================== + +// +// console +// +void Con_DrawCharacter (int cx, int line, int num); + +void Con_CheckResize (void); +void Con_Init (void); +void Con_Clear_f (void); +void Con_ToggleConsole_f (void); +void Con_DrawNotify (void); +void Con_ClearNotify (void); +void Con_RunConsole (void); +void Con_DrawConsole (void); +void Con_PageUp( void ); +void Con_PageDown( void ); +void Con_Top( void ); +void Con_Bottom( void ); +void Con_Close( void ); + + +// +// cl_scrn.c +// +void SCR_Init (void); +void SCR_UpdateScreen (void); + +void SCR_DebugGraph (float value, int color); + +int SCR_GetBigStringWidth( const char *str ); // returns in virtual 640x480 coordinates + +void SCR_FillRect( float x, float y, float width, float height, + const float *color ); +void SCR_DrawPic( float x, float y, float width, float height, qhandle_t hShader ); +void SCR_DrawNamedPic( float x, float y, float width, float height, const char *picname ); + +void SCR_DrawBigString( int x, int y, const char *s, float alpha, qboolean noColorEscape ); // draws a string with embedded color control characters with fade +void SCR_DrawBigStringColor( int x, int y, const char *s, vec4_t color, qboolean noColorEscape ); // ignores embedded color control characters +void SCR_DrawSmallStringExt( int x, int y, const char *string, float *setColor, qboolean forceColor, qboolean noColorEscape ); +void SCR_DrawBigChar( int x, int y, int ch ); +void SCR_DrawSmallChar( int x, int y, int ch ); + +// +// cl_cin.c +// +void CL_PlayCinematic_f( void ); +void CL_PlayInGameCinematic_f(void); +qboolean CL_CheckPendingCinematic(void); +qboolean CL_IsRunningInGameCinematic(void); +qboolean CL_InGameCinematicOnStandBy(void); +void SCR_DrawCinematic (void); +void SCR_RunCinematic (void); +void SCR_StopCinematic( qboolean bAllowRefusal = qfalse ); + +int CIN_PlayCinematic( const char *arg0, int xpos, int ypos, int width, int height, int bits, const char *psAudioFile /* = NULL */); +e_status CIN_StopCinematic(int handle); +e_status CIN_RunCinematic (int handle); +void CIN_DrawCinematic (int handle); +void CIN_SetExtents (int handle, int x, int y, int w, int h); +void CIN_SetLooping (int handle, qboolean loop); +void CIN_UploadCinematic(int handle); +void CIN_CloseAllVideos(void); + +// +// cl_cgame.c +// +void CL_InitCGame( void ); +void CL_ShutdownCGame( void ); +qboolean CL_GameCommand( void ); +void CL_CGameRendering( stereoFrame_t stereo ); +void CL_SetCGameTime( void ); +void CL_FirstSnapshot( void ); + + +// +// cl_ui.c +// +void CL_InitUI( void ); +void CL_ShutdownUI( void ); +void CL_GenericMenu_f(void); +void CL_DataPad_f(void); +void CL_EndScreenDissolve_f(void); +int Key_GetCatcher( void ); +void Key_SetCatcher( int catcher ); + +#endif //__CLIENT_H__ diff --git a/code/client/client.h.BASE.8932.h b/code/client/client.h.BASE.8932.h new file mode 100644 index 0000000000..89cf670b37 --- /dev/null +++ b/code/client/client.h.BASE.8932.h @@ -0,0 +1,417 @@ +/* +This file is part of Jedi Academy. + + Jedi Academy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + Jedi Academy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Jedi Academy. If not, see . +*/ +// Copyright 2001-2013 Raven Software + +// client.h -- primary header for client +#pragma once +#ifndef __CLIENT_H__ +#define __CLIENT_H__ + +#include "../qcommon/q_shared.h" +#include "../qcommon/qcommon.h" +#include "../rd-common/tr_public.h" +#include "keys.h" +#include "snd_public.h" +#include "../cgame/cg_public.h" + +// snapshots are a view of the server at a given time +typedef struct { + qboolean valid; // cleared if delta parsing was invalid + int snapFlags; // rate delayed and dropped commands + + int serverTime; // server time the message is valid for (in msec) + + int messageNum; // copied from netchan->incoming_sequence + int deltaNum; // messageNum the delta is from + int ping; // time from when cmdNum-1 was sent to time packet was reeceived + byte areamask[MAX_MAP_AREA_BYTES]; // portalarea visibility bits + + int cmdNum; // the next cmdNum the server is expecting + playerState_t ps; // complete information about the current player at this time + + int numEntities; // all of the entities that need to be presented + int parseEntitiesNum; // at the time of this snapshot + + int serverCommandNum; // execute all commands up to this before + // making the snapshot current +} clSnapshot_t; + + + +/* +============================================================================= + +the clientActive_t structure is wiped completely at every +new gamestate_t, potentially several times during an established connection + +============================================================================= +*/ + +// the parseEntities array must be large enough to hold PACKET_BACKUP frames of +// entities, so that when a delta compressed message arives from the server +// it can be un-deltad from the original +#define MAX_PARSE_ENTITIES 512 + +extern int g_console_field_width; + +typedef struct { + int timeoutcount; + + clSnapshot_t frame; // latest received from server + + int serverTime; + int oldServerTime; // to prevent time from flowing bakcwards + int oldFrameServerTime; // to check tournament restarts + int serverTimeDelta; // cl.serverTime = cls.realtime + cl.serverTimeDelta + // this value changes as net lag varies + qboolean extrapolatedSnapshot; // set if any cgame frame has been forced to extrapolate + // cleared when CL_AdjustTimeDelta looks at it + qboolean newSnapshots; // set on parse, cleared when CL_AdjustTimeDelta looks at it + + gameState_t gameState; // configstrings + char mapname[MAX_QPATH]; // extracted from CS_SERVERINFO + + int parseEntitiesNum; // index (not anded off) into cl_parse_entities[] + + int mouseDx[2], mouseDy[2]; // added to by mouse events + int mouseIndex; + int joystickAxis[MAX_JOYSTICK_AXIS]; // set by joystick events + + int cgameUserCmdValue; // current weapon to add to usercmd_t + float cgameSensitivity; + + // cmds[cmdNumber] is the predicted command, [cmdNumber-1] is the last + // properly generated command + usercmd_t cmds[CMD_BACKUP]; // each mesage will send several old cmds + int cmdNumber; // incremented each frame, because multiple + // frames may need to be packed into a single packet + + int packetTime[PACKET_BACKUP]; // cls.realtime sent, for calculating pings + int packetCmdNumber[PACKET_BACKUP]; // cmdNumber when packet was sent + + // the client maintains its own idea of view angles, which are + // sent to the server each frame. It is cleared to 0 upon entering each level. + // the server sends a delta each frame which is added to the locally + // tracked view angles to account for standing on rotating objects, + // and teleport direction changes + vec3_t viewangles; + + // these are just parsed out of the configstrings for convenience + int serverId; + + // non-gameserver infornamtion + int cinematictime; // cls.realtime for first cinematic frame (FIXME: NO LONGER USED!, but I wasn't sure if I could remove it because of struct sizes assumed elsewhere? -Ste) + + // big stuff at end of structure so most offsets are 15 bits or less + clSnapshot_t frames[PACKET_BACKUP]; + + entityState_t parseEntities[MAX_PARSE_ENTITIES]; + + //DJC added - making force powers in single player work like those in + //multiplayer. This makes hot swapping code more portable. + qboolean gcmdSendValue; + byte gcmdValue; +} clientActive_t; + +extern clientActive_t cl; + +/* +============================================================================= + +the clientConnection_t structure is wiped when disconnecting from a server, +either to go to a full screen console, or connect to a different server + +A connection can be to either a server through the network layer, +or just a streaming cinematic. + +============================================================================= +*/ + + +typedef struct { + int lastPacketSentTime; // for retransmits + int lastPacketTime; + char servername[MAX_OSPATH]; // name of server from original connect + netadr_t serverAddress; + int connectTime; // for connection retransmits + int connectPacketCount; // for display on connection dialog + + int challenge; // from the server to use for connecting + + int reliableSequence; + int reliableAcknowledge; + char *reliableCommands[MAX_RELIABLE_COMMANDS]; + + // reliable messages received from server + int serverCommandSequence; + char *serverCommands[MAX_RELIABLE_COMMANDS]; + + // big stuff at end of structure so most offsets are 15 bits or less + netchan_t netchan; +} clientConnection_t; + +extern clientConnection_t clc; + +/* +================================================================== + +the clientStatic_t structure is never wiped, and is used even when +no client connection is active at all + +================================================================== +*/ + +typedef struct { + connstate_t state; // connection status + + char servername[MAX_OSPATH]; // name of server from original connect (used by reconnect) + + // when the server clears the hunk, all of these must be restarted + qboolean rendererStarted; + qboolean soundStarted; + qboolean soundRegistered; + qboolean uiStarted; + qboolean cgameStarted; + + int framecount; + int frametime; // msec since last frame + float frametimeFraction; // fraction of a msec since last frame + + int realtime; // ignores pause + float realtimeFraction; // fraction of a msec accumulated + int realFrametime; // ignoring pause, so console always works + + // update server info + char updateInfoString[MAX_INFO_STRING]; + + // rendering info + glconfig_t glconfig; + qhandle_t charSetShader; + qhandle_t whiteShader; + qhandle_t consoleShader; +} clientStatic_t; + +#define CON_TEXTSIZE 0x30000 //was 32768 +#define NUM_CON_TIMES 4 + +typedef struct { + qboolean initialized; + + short text[CON_TEXTSIZE]; + int current; // line where next message will be printed + int x; // offset in current line for next print + int display; // bottom of console displays this line + + int linewidth; // characters across screen + int totallines; // total lines in console scrollback + + float xadjust; // for wide aspect screens + float yadjust; + + float displayFrac; // aproaches finalFrac at scr_conspeed + float finalFrac; // 0.0 to 1.0 lines of console to display + + int vislines; // in scanlines + + int times[NUM_CON_TIMES]; // cls.realtime time the line was generated + // for transparent notify lines + vec4_t color; +} console_t; + +extern clientStatic_t cls; + +//============================================================================= + +extern refexport_t re; // interface to refresh .dll + + +// +// cvars +// +extern cvar_t *cl_nodelta; +extern cvar_t *cl_debugMove; +extern cvar_t *cl_noprint; +extern cvar_t *cl_timegraph; +extern cvar_t *cl_packetdup; +extern cvar_t *cl_shownet; +extern cvar_t *cl_timeNudge; +extern cvar_t *cl_showTimeDelta; + +extern cvar_t *cl_yawspeed; +extern cvar_t *cl_pitchspeed; +extern cvar_t *cl_run; +extern cvar_t *cl_anglespeedkey; + +extern cvar_t *cl_sensitivity; +extern cvar_t *cl_freelook; + +extern cvar_t *cl_mouseAccel; +extern cvar_t *cl_showMouseRate; + +extern cvar_t *cl_inGameVideo; + +extern cvar_t *m_pitch; +extern cvar_t *m_yaw; +extern cvar_t *m_forward; +extern cvar_t *m_side; +extern cvar_t *m_filter; + +extern cvar_t *cl_activeAction; + +#ifndef _WIN32 +extern cvar_t *cl_consoleKeys; +#endif + +//================================================= + +// +// cl_main +// + +void CL_Init (void); + +void CL_AddReliableCommand( const char *cmd ); + +void CL_Disconnect_f (void); +void CL_Vid_Restart_f( void ); +void CL_Snd_Restart_f (void); + +qboolean CL_CheckPaused(void); + +// +// cl_input +// +typedef struct { + int down[2]; // key nums holding it down + unsigned downtime; // msec timestamp + unsigned msec; // msec down this frame if both a down and up happened + qboolean active; // current state + qboolean wasPressed; // set when down, not cleared when up +} kbutton_t; + +extern kbutton_t in_mlook, in_klook; +extern kbutton_t in_strafe; +extern kbutton_t in_speed; + +void CL_InitInput (void); +void CL_SendCmd (void); +void CL_ClearState (void); +void CL_ReadPackets (void); +void CL_UpdateHotSwap(void); +bool CL_ExtendSelectTime(void); + +void CL_WritePacket( void ); +void IN_CenterView (void); + +float CL_KeyState (kbutton_t *key); +const char *Key_KeynumToString( int keynum/*, qboolean bTranslate*/ ); //note: translate is only called for menu display not configs + +// +// cl_parse.c +// +extern int cl_connectedToCheatServer; + +void CL_SystemInfoChanged( void ); +void CL_ParseServerMessage( msg_t *msg ); + +//==================================================================== + +// +// console +// +void Con_DrawCharacter (int cx, int line, int num); + +void Con_CheckResize (void); +void Con_Init (void); +void Con_Clear_f (void); +void Con_ToggleConsole_f (void); +void Con_DrawNotify (void); +void Con_ClearNotify (void); +void Con_RunConsole (void); +void Con_DrawConsole (void); +void Con_PageUp( void ); +void Con_PageDown( void ); +void Con_Top( void ); +void Con_Bottom( void ); +void Con_Close( void ); + + +// +// cl_scrn.c +// +void SCR_Init (void); +void SCR_UpdateScreen (void); + +void SCR_DebugGraph (float value, int color); + +int SCR_GetBigStringWidth( const char *str ); // returns in virtual 640x480 coordinates + +void SCR_FillRect( float x, float y, float width, float height, + const float *color ); +void SCR_DrawPic( float x, float y, float width, float height, qhandle_t hShader ); +void SCR_DrawNamedPic( float x, float y, float width, float height, const char *picname ); + +void SCR_DrawBigString( int x, int y, const char *s, float alpha, qboolean noColorEscape ); // draws a string with embedded color control characters with fade +void SCR_DrawBigStringColor( int x, int y, const char *s, vec4_t color, qboolean noColorEscape ); // ignores embedded color control characters +void SCR_DrawSmallStringExt( int x, int y, const char *string, float *setColor, qboolean forceColor, qboolean noColorEscape ); +void SCR_DrawBigChar( int x, int y, int ch ); +void SCR_DrawSmallChar( int x, int y, int ch ); + +// +// cl_cin.c +// +void CL_PlayCinematic_f( void ); +void CL_PlayInGameCinematic_f(void); +qboolean CL_CheckPendingCinematic(void); +qboolean CL_IsRunningInGameCinematic(void); +qboolean CL_InGameCinematicOnStandBy(void); +void SCR_DrawCinematic (void); +void SCR_RunCinematic (void); +void SCR_StopCinematic( qboolean bAllowRefusal = qfalse ); + +int CIN_PlayCinematic( const char *arg0, int xpos, int ypos, int width, int height, int bits, const char *psAudioFile /* = NULL */); +e_status CIN_StopCinematic(int handle); +e_status CIN_RunCinematic (int handle); +void CIN_DrawCinematic (int handle); +void CIN_SetExtents (int handle, int x, int y, int w, int h); +void CIN_SetLooping (int handle, qboolean loop); +void CIN_UploadCinematic(int handle); +void CIN_CloseAllVideos(void); + +// +// cl_cgame.c +// +void CL_InitCGame( void ); +void CL_ShutdownCGame( void ); +qboolean CL_GameCommand( void ); +void CL_CGameRendering( stereoFrame_t stereo ); +void CL_SetCGameTime( void ); +void CL_FirstSnapshot( void ); + + +// +// cl_ui.c +// +void CL_InitUI( void ); +void CL_ShutdownUI( void ); +void CL_GenericMenu_f(void); +void CL_DataPad_f(void); +void CL_EndScreenDissolve_f(void); +int Key_GetCatcher( void ); +void Key_SetCatcher( int catcher ); + +#endif //__CLIENT_H__ diff --git a/code/client/client.h.LOCAL.2896.h b/code/client/client.h.LOCAL.2896.h new file mode 100644 index 0000000000..5e8ea6628a --- /dev/null +++ b/code/client/client.h.LOCAL.2896.h @@ -0,0 +1,419 @@ +/* +This file is part of Jedi Academy. + + Jedi Academy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + Jedi Academy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Jedi Academy. If not, see . +*/ +// Copyright 2001-2013 Raven Software + +// client.h -- primary header for client +#pragma once +#ifndef __CLIENT_H__ +#define __CLIENT_H__ + +#include "../qcommon/q_shared.h" +#include "../qcommon/qcommon.h" +#include "../rd-common/tr_public.h" +#include "keys.h" +#include "snd_public.h" +#include "../cgame/cg_public.h" + +// snapshots are a view of the server at a given time +typedef struct { + qboolean valid; // cleared if delta parsing was invalid + int snapFlags; // rate delayed and dropped commands + + int serverTime; // server time the message is valid for (in msec) + + int messageNum; // copied from netchan->incoming_sequence + int deltaNum; // messageNum the delta is from + int ping; // time from when cmdNum-1 was sent to time packet was reeceived + byte areamask[MAX_MAP_AREA_BYTES]; // portalarea visibility bits + + int cmdNum; // the next cmdNum the server is expecting + playerState_t ps; // complete information about the current player at this time + + int numEntities; // all of the entities that need to be presented + int parseEntitiesNum; // at the time of this snapshot + + int serverCommandNum; // execute all commands up to this before + // making the snapshot current +} clSnapshot_t; + + + +/* +============================================================================= + +the clientActive_t structure is wiped completely at every +new gamestate_t, potentially several times during an established connection + +============================================================================= +*/ + +// the parseEntities array must be large enough to hold PACKET_BACKUP frames of +// entities, so that when a delta compressed message arives from the server +// it can be un-deltad from the original +#define MAX_PARSE_ENTITIES 512 + +extern int g_console_field_width; + +typedef struct { + int timeoutcount; + + clSnapshot_t frame; // latest received from server + + int serverTime; + int oldServerTime; // to prevent time from flowing bakcwards + int oldFrameServerTime; // to check tournament restarts + int serverTimeDelta; // cl.serverTime = cls.realtime + cl.serverTimeDelta + // this value changes as net lag varies + qboolean extrapolatedSnapshot; // set if any cgame frame has been forced to extrapolate + // cleared when CL_AdjustTimeDelta looks at it + qboolean newSnapshots; // set on parse, cleared when CL_AdjustTimeDelta looks at it + + gameState_t gameState; // configstrings + char mapname[MAX_QPATH]; // extracted from CS_SERVERINFO + + int parseEntitiesNum; // index (not anded off) into cl_parse_entities[] + + int mouseDx[2], mouseDy[2]; // added to by mouse events + int mouseIndex; + int joystickAxis[MAX_JOYSTICK_AXIS]; // set by joystick events + + int cgameUserCmdValue; // current weapon to add to usercmd_t + float cgameSensitivity; + + // cmds[cmdNumber] is the predicted command, [cmdNumber-1] is the last + // properly generated command + usercmd_t cmds[CMD_BACKUP]; // each mesage will send several old cmds + int cmdNumber; // incremented each frame, because multiple + // frames may need to be packed into a single packet + + int packetTime[PACKET_BACKUP]; // cls.realtime sent, for calculating pings + int packetCmdNumber[PACKET_BACKUP]; // cmdNumber when packet was sent + + // the client maintains its own idea of view angles, which are + // sent to the server each frame. It is cleared to 0 upon entering each level. + // the server sends a delta each frame which is added to the locally + // tracked view angles to account for standing on rotating objects, + // and teleport direction changes + vec3_t viewangles; + + // these are just parsed out of the configstrings for convenience + int serverId; + + // non-gameserver infornamtion + int cinematictime; // cls.realtime for first cinematic frame (FIXME: NO LONGER USED!, but I wasn't sure if I could remove it because of struct sizes assumed elsewhere? -Ste) + + // big stuff at end of structure so most offsets are 15 bits or less + clSnapshot_t frames[PACKET_BACKUP]; + + entityState_t parseEntities[MAX_PARSE_ENTITIES]; + + //DJC added - making force powers in single player work like those in + //multiplayer. This makes hot swapping code more portable. + qboolean gcmdSendValue; + byte gcmdValue; +} clientActive_t; + +extern clientActive_t cl; + +/* +============================================================================= + +the clientConnection_t structure is wiped when disconnecting from a server, +either to go to a full screen console, or connect to a different server + +A connection can be to either a server through the network layer, +or just a streaming cinematic. + +============================================================================= +*/ + + +typedef struct { + int lastPacketSentTime; // for retransmits + int lastPacketTime; + char servername[MAX_OSPATH]; // name of server from original connect + netadr_t serverAddress; + int connectTime; // for connection retransmits + int connectPacketCount; // for display on connection dialog + + int challenge; // from the server to use for connecting + + int reliableSequence; + int reliableAcknowledge; + char *reliableCommands[MAX_RELIABLE_COMMANDS]; + + // reliable messages received from server + int serverCommandSequence; + char *serverCommands[MAX_RELIABLE_COMMANDS]; + + // big stuff at end of structure so most offsets are 15 bits or less + netchan_t netchan; +} clientConnection_t; + +extern clientConnection_t clc; + +/* +================================================================== + +the clientStatic_t structure is never wiped, and is used even when +no client connection is active at all + +================================================================== +*/ + +typedef struct { + connstate_t state; // connection status + + char servername[MAX_OSPATH]; // name of server from original connect (used by reconnect) + + // when the server clears the hunk, all of these must be restarted + qboolean rendererStarted; + qboolean soundStarted; + qboolean soundRegistered; + qboolean uiStarted; + qboolean cgameStarted; + + int framecount; + int frametime; // msec since last frame + float frametimeFraction; // fraction of a msec since last frame + + int realtime; // ignores pause + float realtimeFraction; // fraction of a msec accumulated + int realFrametime; // ignoring pause, so console always works + + // update server info + char updateInfoString[MAX_INFO_STRING]; + + // rendering info + glconfig_t glconfig; + qhandle_t charSetShader; + qhandle_t whiteShader; + qhandle_t consoleShader; +} clientStatic_t; + +#define CON_TEXTSIZE 0x30000 //was 32768 +#define NUM_CON_TIMES 4 + +typedef struct { + qboolean initialized; + + short text[CON_TEXTSIZE]; + int current; // line where next message will be printed + int x; // offset in current line for next print + int display; // bottom of console displays this line + + int linewidth; // characters across screen + int totallines; // total lines in console scrollback + + float xadjust; // for wide aspect screens + float yadjust; + + float displayFrac; // aproaches finalFrac at scr_conspeed + float finalFrac; // 0.0 to 1.0 lines of console to display + + int vislines; // in scanlines + + int times[NUM_CON_TIMES]; // cls.realtime time the line was generated + // for transparent notify lines + vec4_t color; +} console_t; + +extern clientStatic_t cls; + +//============================================================================= + +extern refexport_t re; // interface to refresh .dll + + +// +// cvars +// +extern cvar_t *cl_nodelta; +extern cvar_t *cl_debugMove; +extern cvar_t *cl_noprint; +extern cvar_t *cl_timegraph; +extern cvar_t *cl_packetdup; +extern cvar_t *cl_shownet; +extern cvar_t *cl_timeNudge; +extern cvar_t *cl_showTimeDelta; + +extern cvar_t *cl_yawspeed; +extern cvar_t *cl_pitchspeed; +extern cvar_t *cl_run; +extern cvar_t *cl_anglespeedkey; + +extern cvar_t *cl_sensitivity; +extern cvar_t *cl_freelook; + +extern cvar_t *cl_mouseAccel; +extern cvar_t *cl_showMouseRate; + +extern cvar_t *cl_inGameVideo; + +extern cvar_t *m_pitch; +extern cvar_t *m_yaw; +extern cvar_t *m_forward; +extern cvar_t *m_side; +extern cvar_t *m_filter; + +extern cvar_t *cl_activeAction; + +#ifndef _WIN32 +extern cvar_t *cl_consoleKeys; +#endif + +//================================================= + +// +// cl_main +// + +void CL_Init (void); + +void CL_AddReliableCommand( const char *cmd ); + +void CL_Disconnect_f (void); +void CL_Vid_Restart_f( void ); +void CL_Snd_Restart_f (void); + +qboolean CL_CheckPaused(void); + +// +// cl_input +// +typedef struct { + int down[2]; // key nums holding it down + unsigned downtime; // msec timestamp + unsigned msec; // msec down this frame if both a down and up happened + qboolean active; // current state + qboolean wasPressed; // set when down, not cleared when up +} kbutton_t; + +extern kbutton_t in_mlook, in_klook; +extern kbutton_t in_strafe; +extern kbutton_t in_speed; + +void CL_InitInput (void); +void CL_SendCmd (void); +void CL_ClearState (void); +void CL_ReadPackets (void); +void CL_UpdateHotSwap(void); +bool CL_ExtendSelectTime(void); + +void CL_WritePacket( void ); +void IN_CenterView (void); + +float CL_KeyState (kbutton_t *key); +const char *Key_KeynumToString( int keynum/*, qboolean bTranslate*/ ); //note: translate is only called for menu display not configs + +// +// cl_parse.c +// +extern int cl_connectedToCheatServer; + +void CL_SystemInfoChanged( void ); +void CL_ParseServerMessage( msg_t *msg ); + +//==================================================================== + +// +// console +// +void Con_DrawCharacter (int cx, int line, int num); + +void Con_CheckResize (void); +void Con_Init (void); +void Con_Clear_f (void); +void Con_ToggleConsole_f (void); +void Con_DrawNotify (void); +void Con_ClearNotify (void); +void Con_RunConsole (void); +void Con_DrawConsole (void); +void Con_PageUp( void ); +void Con_PageDown( void ); +void Con_Top( void ); +void Con_Bottom( void ); +void Con_Close( void ); + + +// +// cl_scrn.c +// +void SCR_Init (void); +void SCR_UpdateScreen (void); + +void SCR_DebugGraph (float value, int color); + +int SCR_GetBigStringWidth( const char *str ); // returns in virtual 640x480 coordinates + +void SCR_FillRect( float x, float y, float width, float height, + const float *color ); +void SCR_DrawPic( float x, float y, float width, float height, qhandle_t hShader ); +void SCR_DrawNamedPic( float x, float y, float width, float height, const char *picname ); + +void SCR_DrawBigString( int x, int y, const char *s, float alpha, qboolean noColorEscape ); // draws a string with embedded color control characters with fade +void SCR_DrawBigStringColor( int x, int y, const char *s, vec4_t color, qboolean noColorEscape ); // ignores embedded color control characters +void SCR_DrawSmallStringExt( int x, int y, const char *string, float *setColor, qboolean forceColor, qboolean noColorEscape ); +void SCR_DrawBigChar( int x, int y, int ch ); +void SCR_DrawSmallChar( int x, int y, int ch ); + +void SCR_PrecacheScreenshot(); + +// +// cl_cin.c +// +void CL_PlayCinematic_f( void ); +void CL_PlayInGameCinematic_f(void); +qboolean CL_CheckPendingCinematic(void); +qboolean CL_IsRunningInGameCinematic(void); +qboolean CL_InGameCinematicOnStandBy(void); +void SCR_DrawCinematic (void); +void SCR_RunCinematic (void); +void SCR_StopCinematic( qboolean bAllowRefusal = qfalse ); + +int CIN_PlayCinematic( const char *arg0, int xpos, int ypos, int width, int height, int bits, const char *psAudioFile /* = NULL */); +e_status CIN_StopCinematic(int handle); +e_status CIN_RunCinematic (int handle); +void CIN_DrawCinematic (int handle); +void CIN_SetExtents (int handle, int x, int y, int w, int h); +void CIN_SetLooping (int handle, qboolean loop); +void CIN_UploadCinematic(int handle); +void CIN_CloseAllVideos(void); + +// +// cl_cgame.c +// +void CL_InitCGame( void ); +void CL_ShutdownCGame( void ); +qboolean CL_GameCommand( void ); +void CL_CGameRendering( stereoFrame_t stereo ); +void CL_SetCGameTime( void ); +void CL_FirstSnapshot( void ); + + +// +// cl_ui.c +// +void CL_InitUI( void ); +void CL_ShutdownUI( void ); +void CL_GenericMenu_f(void); +void CL_DataPad_f(void); +void CL_EndScreenDissolve_f(void); +int Key_GetCatcher( void ); +void Key_SetCatcher( int catcher ); + +#endif //__CLIENT_H__ diff --git a/code/client/client.h.LOCAL.7476.h b/code/client/client.h.LOCAL.7476.h new file mode 100644 index 0000000000..5e8ea6628a --- /dev/null +++ b/code/client/client.h.LOCAL.7476.h @@ -0,0 +1,419 @@ +/* +This file is part of Jedi Academy. + + Jedi Academy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + Jedi Academy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Jedi Academy. If not, see . +*/ +// Copyright 2001-2013 Raven Software + +// client.h -- primary header for client +#pragma once +#ifndef __CLIENT_H__ +#define __CLIENT_H__ + +#include "../qcommon/q_shared.h" +#include "../qcommon/qcommon.h" +#include "../rd-common/tr_public.h" +#include "keys.h" +#include "snd_public.h" +#include "../cgame/cg_public.h" + +// snapshots are a view of the server at a given time +typedef struct { + qboolean valid; // cleared if delta parsing was invalid + int snapFlags; // rate delayed and dropped commands + + int serverTime; // server time the message is valid for (in msec) + + int messageNum; // copied from netchan->incoming_sequence + int deltaNum; // messageNum the delta is from + int ping; // time from when cmdNum-1 was sent to time packet was reeceived + byte areamask[MAX_MAP_AREA_BYTES]; // portalarea visibility bits + + int cmdNum; // the next cmdNum the server is expecting + playerState_t ps; // complete information about the current player at this time + + int numEntities; // all of the entities that need to be presented + int parseEntitiesNum; // at the time of this snapshot + + int serverCommandNum; // execute all commands up to this before + // making the snapshot current +} clSnapshot_t; + + + +/* +============================================================================= + +the clientActive_t structure is wiped completely at every +new gamestate_t, potentially several times during an established connection + +============================================================================= +*/ + +// the parseEntities array must be large enough to hold PACKET_BACKUP frames of +// entities, so that when a delta compressed message arives from the server +// it can be un-deltad from the original +#define MAX_PARSE_ENTITIES 512 + +extern int g_console_field_width; + +typedef struct { + int timeoutcount; + + clSnapshot_t frame; // latest received from server + + int serverTime; + int oldServerTime; // to prevent time from flowing bakcwards + int oldFrameServerTime; // to check tournament restarts + int serverTimeDelta; // cl.serverTime = cls.realtime + cl.serverTimeDelta + // this value changes as net lag varies + qboolean extrapolatedSnapshot; // set if any cgame frame has been forced to extrapolate + // cleared when CL_AdjustTimeDelta looks at it + qboolean newSnapshots; // set on parse, cleared when CL_AdjustTimeDelta looks at it + + gameState_t gameState; // configstrings + char mapname[MAX_QPATH]; // extracted from CS_SERVERINFO + + int parseEntitiesNum; // index (not anded off) into cl_parse_entities[] + + int mouseDx[2], mouseDy[2]; // added to by mouse events + int mouseIndex; + int joystickAxis[MAX_JOYSTICK_AXIS]; // set by joystick events + + int cgameUserCmdValue; // current weapon to add to usercmd_t + float cgameSensitivity; + + // cmds[cmdNumber] is the predicted command, [cmdNumber-1] is the last + // properly generated command + usercmd_t cmds[CMD_BACKUP]; // each mesage will send several old cmds + int cmdNumber; // incremented each frame, because multiple + // frames may need to be packed into a single packet + + int packetTime[PACKET_BACKUP]; // cls.realtime sent, for calculating pings + int packetCmdNumber[PACKET_BACKUP]; // cmdNumber when packet was sent + + // the client maintains its own idea of view angles, which are + // sent to the server each frame. It is cleared to 0 upon entering each level. + // the server sends a delta each frame which is added to the locally + // tracked view angles to account for standing on rotating objects, + // and teleport direction changes + vec3_t viewangles; + + // these are just parsed out of the configstrings for convenience + int serverId; + + // non-gameserver infornamtion + int cinematictime; // cls.realtime for first cinematic frame (FIXME: NO LONGER USED!, but I wasn't sure if I could remove it because of struct sizes assumed elsewhere? -Ste) + + // big stuff at end of structure so most offsets are 15 bits or less + clSnapshot_t frames[PACKET_BACKUP]; + + entityState_t parseEntities[MAX_PARSE_ENTITIES]; + + //DJC added - making force powers in single player work like those in + //multiplayer. This makes hot swapping code more portable. + qboolean gcmdSendValue; + byte gcmdValue; +} clientActive_t; + +extern clientActive_t cl; + +/* +============================================================================= + +the clientConnection_t structure is wiped when disconnecting from a server, +either to go to a full screen console, or connect to a different server + +A connection can be to either a server through the network layer, +or just a streaming cinematic. + +============================================================================= +*/ + + +typedef struct { + int lastPacketSentTime; // for retransmits + int lastPacketTime; + char servername[MAX_OSPATH]; // name of server from original connect + netadr_t serverAddress; + int connectTime; // for connection retransmits + int connectPacketCount; // for display on connection dialog + + int challenge; // from the server to use for connecting + + int reliableSequence; + int reliableAcknowledge; + char *reliableCommands[MAX_RELIABLE_COMMANDS]; + + // reliable messages received from server + int serverCommandSequence; + char *serverCommands[MAX_RELIABLE_COMMANDS]; + + // big stuff at end of structure so most offsets are 15 bits or less + netchan_t netchan; +} clientConnection_t; + +extern clientConnection_t clc; + +/* +================================================================== + +the clientStatic_t structure is never wiped, and is used even when +no client connection is active at all + +================================================================== +*/ + +typedef struct { + connstate_t state; // connection status + + char servername[MAX_OSPATH]; // name of server from original connect (used by reconnect) + + // when the server clears the hunk, all of these must be restarted + qboolean rendererStarted; + qboolean soundStarted; + qboolean soundRegistered; + qboolean uiStarted; + qboolean cgameStarted; + + int framecount; + int frametime; // msec since last frame + float frametimeFraction; // fraction of a msec since last frame + + int realtime; // ignores pause + float realtimeFraction; // fraction of a msec accumulated + int realFrametime; // ignoring pause, so console always works + + // update server info + char updateInfoString[MAX_INFO_STRING]; + + // rendering info + glconfig_t glconfig; + qhandle_t charSetShader; + qhandle_t whiteShader; + qhandle_t consoleShader; +} clientStatic_t; + +#define CON_TEXTSIZE 0x30000 //was 32768 +#define NUM_CON_TIMES 4 + +typedef struct { + qboolean initialized; + + short text[CON_TEXTSIZE]; + int current; // line where next message will be printed + int x; // offset in current line for next print + int display; // bottom of console displays this line + + int linewidth; // characters across screen + int totallines; // total lines in console scrollback + + float xadjust; // for wide aspect screens + float yadjust; + + float displayFrac; // aproaches finalFrac at scr_conspeed + float finalFrac; // 0.0 to 1.0 lines of console to display + + int vislines; // in scanlines + + int times[NUM_CON_TIMES]; // cls.realtime time the line was generated + // for transparent notify lines + vec4_t color; +} console_t; + +extern clientStatic_t cls; + +//============================================================================= + +extern refexport_t re; // interface to refresh .dll + + +// +// cvars +// +extern cvar_t *cl_nodelta; +extern cvar_t *cl_debugMove; +extern cvar_t *cl_noprint; +extern cvar_t *cl_timegraph; +extern cvar_t *cl_packetdup; +extern cvar_t *cl_shownet; +extern cvar_t *cl_timeNudge; +extern cvar_t *cl_showTimeDelta; + +extern cvar_t *cl_yawspeed; +extern cvar_t *cl_pitchspeed; +extern cvar_t *cl_run; +extern cvar_t *cl_anglespeedkey; + +extern cvar_t *cl_sensitivity; +extern cvar_t *cl_freelook; + +extern cvar_t *cl_mouseAccel; +extern cvar_t *cl_showMouseRate; + +extern cvar_t *cl_inGameVideo; + +extern cvar_t *m_pitch; +extern cvar_t *m_yaw; +extern cvar_t *m_forward; +extern cvar_t *m_side; +extern cvar_t *m_filter; + +extern cvar_t *cl_activeAction; + +#ifndef _WIN32 +extern cvar_t *cl_consoleKeys; +#endif + +//================================================= + +// +// cl_main +// + +void CL_Init (void); + +void CL_AddReliableCommand( const char *cmd ); + +void CL_Disconnect_f (void); +void CL_Vid_Restart_f( void ); +void CL_Snd_Restart_f (void); + +qboolean CL_CheckPaused(void); + +// +// cl_input +// +typedef struct { + int down[2]; // key nums holding it down + unsigned downtime; // msec timestamp + unsigned msec; // msec down this frame if both a down and up happened + qboolean active; // current state + qboolean wasPressed; // set when down, not cleared when up +} kbutton_t; + +extern kbutton_t in_mlook, in_klook; +extern kbutton_t in_strafe; +extern kbutton_t in_speed; + +void CL_InitInput (void); +void CL_SendCmd (void); +void CL_ClearState (void); +void CL_ReadPackets (void); +void CL_UpdateHotSwap(void); +bool CL_ExtendSelectTime(void); + +void CL_WritePacket( void ); +void IN_CenterView (void); + +float CL_KeyState (kbutton_t *key); +const char *Key_KeynumToString( int keynum/*, qboolean bTranslate*/ ); //note: translate is only called for menu display not configs + +// +// cl_parse.c +// +extern int cl_connectedToCheatServer; + +void CL_SystemInfoChanged( void ); +void CL_ParseServerMessage( msg_t *msg ); + +//==================================================================== + +// +// console +// +void Con_DrawCharacter (int cx, int line, int num); + +void Con_CheckResize (void); +void Con_Init (void); +void Con_Clear_f (void); +void Con_ToggleConsole_f (void); +void Con_DrawNotify (void); +void Con_ClearNotify (void); +void Con_RunConsole (void); +void Con_DrawConsole (void); +void Con_PageUp( void ); +void Con_PageDown( void ); +void Con_Top( void ); +void Con_Bottom( void ); +void Con_Close( void ); + + +// +// cl_scrn.c +// +void SCR_Init (void); +void SCR_UpdateScreen (void); + +void SCR_DebugGraph (float value, int color); + +int SCR_GetBigStringWidth( const char *str ); // returns in virtual 640x480 coordinates + +void SCR_FillRect( float x, float y, float width, float height, + const float *color ); +void SCR_DrawPic( float x, float y, float width, float height, qhandle_t hShader ); +void SCR_DrawNamedPic( float x, float y, float width, float height, const char *picname ); + +void SCR_DrawBigString( int x, int y, const char *s, float alpha, qboolean noColorEscape ); // draws a string with embedded color control characters with fade +void SCR_DrawBigStringColor( int x, int y, const char *s, vec4_t color, qboolean noColorEscape ); // ignores embedded color control characters +void SCR_DrawSmallStringExt( int x, int y, const char *string, float *setColor, qboolean forceColor, qboolean noColorEscape ); +void SCR_DrawBigChar( int x, int y, int ch ); +void SCR_DrawSmallChar( int x, int y, int ch ); + +void SCR_PrecacheScreenshot(); + +// +// cl_cin.c +// +void CL_PlayCinematic_f( void ); +void CL_PlayInGameCinematic_f(void); +qboolean CL_CheckPendingCinematic(void); +qboolean CL_IsRunningInGameCinematic(void); +qboolean CL_InGameCinematicOnStandBy(void); +void SCR_DrawCinematic (void); +void SCR_RunCinematic (void); +void SCR_StopCinematic( qboolean bAllowRefusal = qfalse ); + +int CIN_PlayCinematic( const char *arg0, int xpos, int ypos, int width, int height, int bits, const char *psAudioFile /* = NULL */); +e_status CIN_StopCinematic(int handle); +e_status CIN_RunCinematic (int handle); +void CIN_DrawCinematic (int handle); +void CIN_SetExtents (int handle, int x, int y, int w, int h); +void CIN_SetLooping (int handle, qboolean loop); +void CIN_UploadCinematic(int handle); +void CIN_CloseAllVideos(void); + +// +// cl_cgame.c +// +void CL_InitCGame( void ); +void CL_ShutdownCGame( void ); +qboolean CL_GameCommand( void ); +void CL_CGameRendering( stereoFrame_t stereo ); +void CL_SetCGameTime( void ); +void CL_FirstSnapshot( void ); + + +// +// cl_ui.c +// +void CL_InitUI( void ); +void CL_ShutdownUI( void ); +void CL_GenericMenu_f(void); +void CL_DataPad_f(void); +void CL_EndScreenDissolve_f(void); +int Key_GetCatcher( void ); +void Key_SetCatcher( int catcher ); + +#endif //__CLIENT_H__ diff --git a/code/client/client.h.LOCAL.8932.h b/code/client/client.h.LOCAL.8932.h new file mode 100644 index 0000000000..5e8ea6628a --- /dev/null +++ b/code/client/client.h.LOCAL.8932.h @@ -0,0 +1,419 @@ +/* +This file is part of Jedi Academy. + + Jedi Academy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + Jedi Academy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Jedi Academy. If not, see . +*/ +// Copyright 2001-2013 Raven Software + +// client.h -- primary header for client +#pragma once +#ifndef __CLIENT_H__ +#define __CLIENT_H__ + +#include "../qcommon/q_shared.h" +#include "../qcommon/qcommon.h" +#include "../rd-common/tr_public.h" +#include "keys.h" +#include "snd_public.h" +#include "../cgame/cg_public.h" + +// snapshots are a view of the server at a given time +typedef struct { + qboolean valid; // cleared if delta parsing was invalid + int snapFlags; // rate delayed and dropped commands + + int serverTime; // server time the message is valid for (in msec) + + int messageNum; // copied from netchan->incoming_sequence + int deltaNum; // messageNum the delta is from + int ping; // time from when cmdNum-1 was sent to time packet was reeceived + byte areamask[MAX_MAP_AREA_BYTES]; // portalarea visibility bits + + int cmdNum; // the next cmdNum the server is expecting + playerState_t ps; // complete information about the current player at this time + + int numEntities; // all of the entities that need to be presented + int parseEntitiesNum; // at the time of this snapshot + + int serverCommandNum; // execute all commands up to this before + // making the snapshot current +} clSnapshot_t; + + + +/* +============================================================================= + +the clientActive_t structure is wiped completely at every +new gamestate_t, potentially several times during an established connection + +============================================================================= +*/ + +// the parseEntities array must be large enough to hold PACKET_BACKUP frames of +// entities, so that when a delta compressed message arives from the server +// it can be un-deltad from the original +#define MAX_PARSE_ENTITIES 512 + +extern int g_console_field_width; + +typedef struct { + int timeoutcount; + + clSnapshot_t frame; // latest received from server + + int serverTime; + int oldServerTime; // to prevent time from flowing bakcwards + int oldFrameServerTime; // to check tournament restarts + int serverTimeDelta; // cl.serverTime = cls.realtime + cl.serverTimeDelta + // this value changes as net lag varies + qboolean extrapolatedSnapshot; // set if any cgame frame has been forced to extrapolate + // cleared when CL_AdjustTimeDelta looks at it + qboolean newSnapshots; // set on parse, cleared when CL_AdjustTimeDelta looks at it + + gameState_t gameState; // configstrings + char mapname[MAX_QPATH]; // extracted from CS_SERVERINFO + + int parseEntitiesNum; // index (not anded off) into cl_parse_entities[] + + int mouseDx[2], mouseDy[2]; // added to by mouse events + int mouseIndex; + int joystickAxis[MAX_JOYSTICK_AXIS]; // set by joystick events + + int cgameUserCmdValue; // current weapon to add to usercmd_t + float cgameSensitivity; + + // cmds[cmdNumber] is the predicted command, [cmdNumber-1] is the last + // properly generated command + usercmd_t cmds[CMD_BACKUP]; // each mesage will send several old cmds + int cmdNumber; // incremented each frame, because multiple + // frames may need to be packed into a single packet + + int packetTime[PACKET_BACKUP]; // cls.realtime sent, for calculating pings + int packetCmdNumber[PACKET_BACKUP]; // cmdNumber when packet was sent + + // the client maintains its own idea of view angles, which are + // sent to the server each frame. It is cleared to 0 upon entering each level. + // the server sends a delta each frame which is added to the locally + // tracked view angles to account for standing on rotating objects, + // and teleport direction changes + vec3_t viewangles; + + // these are just parsed out of the configstrings for convenience + int serverId; + + // non-gameserver infornamtion + int cinematictime; // cls.realtime for first cinematic frame (FIXME: NO LONGER USED!, but I wasn't sure if I could remove it because of struct sizes assumed elsewhere? -Ste) + + // big stuff at end of structure so most offsets are 15 bits or less + clSnapshot_t frames[PACKET_BACKUP]; + + entityState_t parseEntities[MAX_PARSE_ENTITIES]; + + //DJC added - making force powers in single player work like those in + //multiplayer. This makes hot swapping code more portable. + qboolean gcmdSendValue; + byte gcmdValue; +} clientActive_t; + +extern clientActive_t cl; + +/* +============================================================================= + +the clientConnection_t structure is wiped when disconnecting from a server, +either to go to a full screen console, or connect to a different server + +A connection can be to either a server through the network layer, +or just a streaming cinematic. + +============================================================================= +*/ + + +typedef struct { + int lastPacketSentTime; // for retransmits + int lastPacketTime; + char servername[MAX_OSPATH]; // name of server from original connect + netadr_t serverAddress; + int connectTime; // for connection retransmits + int connectPacketCount; // for display on connection dialog + + int challenge; // from the server to use for connecting + + int reliableSequence; + int reliableAcknowledge; + char *reliableCommands[MAX_RELIABLE_COMMANDS]; + + // reliable messages received from server + int serverCommandSequence; + char *serverCommands[MAX_RELIABLE_COMMANDS]; + + // big stuff at end of structure so most offsets are 15 bits or less + netchan_t netchan; +} clientConnection_t; + +extern clientConnection_t clc; + +/* +================================================================== + +the clientStatic_t structure is never wiped, and is used even when +no client connection is active at all + +================================================================== +*/ + +typedef struct { + connstate_t state; // connection status + + char servername[MAX_OSPATH]; // name of server from original connect (used by reconnect) + + // when the server clears the hunk, all of these must be restarted + qboolean rendererStarted; + qboolean soundStarted; + qboolean soundRegistered; + qboolean uiStarted; + qboolean cgameStarted; + + int framecount; + int frametime; // msec since last frame + float frametimeFraction; // fraction of a msec since last frame + + int realtime; // ignores pause + float realtimeFraction; // fraction of a msec accumulated + int realFrametime; // ignoring pause, so console always works + + // update server info + char updateInfoString[MAX_INFO_STRING]; + + // rendering info + glconfig_t glconfig; + qhandle_t charSetShader; + qhandle_t whiteShader; + qhandle_t consoleShader; +} clientStatic_t; + +#define CON_TEXTSIZE 0x30000 //was 32768 +#define NUM_CON_TIMES 4 + +typedef struct { + qboolean initialized; + + short text[CON_TEXTSIZE]; + int current; // line where next message will be printed + int x; // offset in current line for next print + int display; // bottom of console displays this line + + int linewidth; // characters across screen + int totallines; // total lines in console scrollback + + float xadjust; // for wide aspect screens + float yadjust; + + float displayFrac; // aproaches finalFrac at scr_conspeed + float finalFrac; // 0.0 to 1.0 lines of console to display + + int vislines; // in scanlines + + int times[NUM_CON_TIMES]; // cls.realtime time the line was generated + // for transparent notify lines + vec4_t color; +} console_t; + +extern clientStatic_t cls; + +//============================================================================= + +extern refexport_t re; // interface to refresh .dll + + +// +// cvars +// +extern cvar_t *cl_nodelta; +extern cvar_t *cl_debugMove; +extern cvar_t *cl_noprint; +extern cvar_t *cl_timegraph; +extern cvar_t *cl_packetdup; +extern cvar_t *cl_shownet; +extern cvar_t *cl_timeNudge; +extern cvar_t *cl_showTimeDelta; + +extern cvar_t *cl_yawspeed; +extern cvar_t *cl_pitchspeed; +extern cvar_t *cl_run; +extern cvar_t *cl_anglespeedkey; + +extern cvar_t *cl_sensitivity; +extern cvar_t *cl_freelook; + +extern cvar_t *cl_mouseAccel; +extern cvar_t *cl_showMouseRate; + +extern cvar_t *cl_inGameVideo; + +extern cvar_t *m_pitch; +extern cvar_t *m_yaw; +extern cvar_t *m_forward; +extern cvar_t *m_side; +extern cvar_t *m_filter; + +extern cvar_t *cl_activeAction; + +#ifndef _WIN32 +extern cvar_t *cl_consoleKeys; +#endif + +//================================================= + +// +// cl_main +// + +void CL_Init (void); + +void CL_AddReliableCommand( const char *cmd ); + +void CL_Disconnect_f (void); +void CL_Vid_Restart_f( void ); +void CL_Snd_Restart_f (void); + +qboolean CL_CheckPaused(void); + +// +// cl_input +// +typedef struct { + int down[2]; // key nums holding it down + unsigned downtime; // msec timestamp + unsigned msec; // msec down this frame if both a down and up happened + qboolean active; // current state + qboolean wasPressed; // set when down, not cleared when up +} kbutton_t; + +extern kbutton_t in_mlook, in_klook; +extern kbutton_t in_strafe; +extern kbutton_t in_speed; + +void CL_InitInput (void); +void CL_SendCmd (void); +void CL_ClearState (void); +void CL_ReadPackets (void); +void CL_UpdateHotSwap(void); +bool CL_ExtendSelectTime(void); + +void CL_WritePacket( void ); +void IN_CenterView (void); + +float CL_KeyState (kbutton_t *key); +const char *Key_KeynumToString( int keynum/*, qboolean bTranslate*/ ); //note: translate is only called for menu display not configs + +// +// cl_parse.c +// +extern int cl_connectedToCheatServer; + +void CL_SystemInfoChanged( void ); +void CL_ParseServerMessage( msg_t *msg ); + +//==================================================================== + +// +// console +// +void Con_DrawCharacter (int cx, int line, int num); + +void Con_CheckResize (void); +void Con_Init (void); +void Con_Clear_f (void); +void Con_ToggleConsole_f (void); +void Con_DrawNotify (void); +void Con_ClearNotify (void); +void Con_RunConsole (void); +void Con_DrawConsole (void); +void Con_PageUp( void ); +void Con_PageDown( void ); +void Con_Top( void ); +void Con_Bottom( void ); +void Con_Close( void ); + + +// +// cl_scrn.c +// +void SCR_Init (void); +void SCR_UpdateScreen (void); + +void SCR_DebugGraph (float value, int color); + +int SCR_GetBigStringWidth( const char *str ); // returns in virtual 640x480 coordinates + +void SCR_FillRect( float x, float y, float width, float height, + const float *color ); +void SCR_DrawPic( float x, float y, float width, float height, qhandle_t hShader ); +void SCR_DrawNamedPic( float x, float y, float width, float height, const char *picname ); + +void SCR_DrawBigString( int x, int y, const char *s, float alpha, qboolean noColorEscape ); // draws a string with embedded color control characters with fade +void SCR_DrawBigStringColor( int x, int y, const char *s, vec4_t color, qboolean noColorEscape ); // ignores embedded color control characters +void SCR_DrawSmallStringExt( int x, int y, const char *string, float *setColor, qboolean forceColor, qboolean noColorEscape ); +void SCR_DrawBigChar( int x, int y, int ch ); +void SCR_DrawSmallChar( int x, int y, int ch ); + +void SCR_PrecacheScreenshot(); + +// +// cl_cin.c +// +void CL_PlayCinematic_f( void ); +void CL_PlayInGameCinematic_f(void); +qboolean CL_CheckPendingCinematic(void); +qboolean CL_IsRunningInGameCinematic(void); +qboolean CL_InGameCinematicOnStandBy(void); +void SCR_DrawCinematic (void); +void SCR_RunCinematic (void); +void SCR_StopCinematic( qboolean bAllowRefusal = qfalse ); + +int CIN_PlayCinematic( const char *arg0, int xpos, int ypos, int width, int height, int bits, const char *psAudioFile /* = NULL */); +e_status CIN_StopCinematic(int handle); +e_status CIN_RunCinematic (int handle); +void CIN_DrawCinematic (int handle); +void CIN_SetExtents (int handle, int x, int y, int w, int h); +void CIN_SetLooping (int handle, qboolean loop); +void CIN_UploadCinematic(int handle); +void CIN_CloseAllVideos(void); + +// +// cl_cgame.c +// +void CL_InitCGame( void ); +void CL_ShutdownCGame( void ); +qboolean CL_GameCommand( void ); +void CL_CGameRendering( stereoFrame_t stereo ); +void CL_SetCGameTime( void ); +void CL_FirstSnapshot( void ); + + +// +// cl_ui.c +// +void CL_InitUI( void ); +void CL_ShutdownUI( void ); +void CL_GenericMenu_f(void); +void CL_DataPad_f(void); +void CL_EndScreenDissolve_f(void); +int Key_GetCatcher( void ); +void Key_SetCatcher( int catcher ); + +#endif //__CLIENT_H__ diff --git a/code/client/client.h.REMOTE.2896.h b/code/client/client.h.REMOTE.2896.h new file mode 100644 index 0000000000..d50be2ddcb --- /dev/null +++ b/code/client/client.h.REMOTE.2896.h @@ -0,0 +1,421 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +// client.h -- primary header for client +#pragma once + +#include "../qcommon/q_shared.h" +#include "../qcommon/qcommon.h" +#include "../rd-common/tr_public.h" +#include "keys.h" +#include "snd_public.h" +#include "../cgame/cg_public.h" + +// snapshots are a view of the server at a given time +typedef struct { + qboolean valid; // cleared if delta parsing was invalid + int snapFlags; // rate delayed and dropped commands + + int serverTime; // server time the message is valid for (in msec) + + int messageNum; // copied from netchan->incoming_sequence + int deltaNum; // messageNum the delta is from + int ping; // time from when cmdNum-1 was sent to time packet was reeceived + byte areamask[MAX_MAP_AREA_BYTES]; // portalarea visibility bits + + int cmdNum; // the next cmdNum the server is expecting + playerState_t ps; // complete information about the current player at this time + + int numEntities; // all of the entities that need to be presented + int parseEntitiesNum; // at the time of this snapshot + + int serverCommandNum; // execute all commands up to this before + // making the snapshot current +} clSnapshot_t; + + + +/* +============================================================================= + +the clientActive_t structure is wiped completely at every +new gamestate_t, potentially several times during an established connection + +============================================================================= +*/ + +// the parseEntities array must be large enough to hold PACKET_BACKUP frames of +// entities, so that when a delta compressed message arives from the server +// it can be un-deltad from the original +#define MAX_PARSE_ENTITIES 512 + +extern int g_console_field_width; + +typedef struct { + int timeoutcount; + + clSnapshot_t frame; // latest received from server + + int serverTime; + int oldServerTime; // to prevent time from flowing bakcwards + int oldFrameServerTime; // to check tournament restarts + int serverTimeDelta; // cl.serverTime = cls.realtime + cl.serverTimeDelta + // this value changes as net lag varies + qboolean extrapolatedSnapshot; // set if any cgame frame has been forced to extrapolate + // cleared when CL_AdjustTimeDelta looks at it + qboolean newSnapshots; // set on parse, cleared when CL_AdjustTimeDelta looks at it + + gameState_t gameState; // configstrings + char mapname[MAX_QPATH]; // extracted from CS_SERVERINFO + + int parseEntitiesNum; // index (not anded off) into cl_parse_entities[] + + int mouseDx[2], mouseDy[2]; // added to by mouse events + int mouseIndex; + int joystickAxis[MAX_JOYSTICK_AXIS]; // set by joystick events + + int cgameUserCmdValue; // current weapon to add to usercmd_t + float cgameSensitivity; + + // cmds[cmdNumber] is the predicted command, [cmdNumber-1] is the last + // properly generated command + usercmd_t cmds[CMD_BACKUP]; // each mesage will send several old cmds + int cmdNumber; // incremented each frame, because multiple + // frames may need to be packed into a single packet + + int packetTime[PACKET_BACKUP]; // cls.realtime sent, for calculating pings + int packetCmdNumber[PACKET_BACKUP]; // cmdNumber when packet was sent + + // the client maintains its own idea of view angles, which are + // sent to the server each frame. It is cleared to 0 upon entering each level. + // the server sends a delta each frame which is added to the locally + // tracked view angles to account for standing on rotating objects, + // and teleport direction changes + vec3_t viewangles; + + // these are just parsed out of the configstrings for convenience + int serverId; + + // non-gameserver infornamtion + int cinematictime; // cls.realtime for first cinematic frame (FIXME: NO LONGER USED!, but I wasn't sure if I could remove it because of struct sizes assumed elsewhere? -Ste) + + // big stuff at end of structure so most offsets are 15 bits or less + clSnapshot_t frames[PACKET_BACKUP]; + + entityState_t parseEntities[MAX_PARSE_ENTITIES]; + + //DJC added - making force powers in single player work like those in + //multiplayer. This makes hot swapping code more portable. + qboolean gcmdSendValue; + byte gcmdValue; +} clientActive_t; + +extern clientActive_t cl; + +/* +============================================================================= + +the clientConnection_t structure is wiped when disconnecting from a server, +either to go to a full screen console, or connect to a different server + +A connection can be to either a server through the network layer, +or just a streaming cinematic. + +============================================================================= +*/ + + +typedef struct { + int lastPacketSentTime; // for retransmits + int lastPacketTime; + char servername[MAX_OSPATH]; // name of server from original connect + netadr_t serverAddress; + int connectTime; // for connection retransmits + int connectPacketCount; // for display on connection dialog + + int challenge; // from the server to use for connecting + + int reliableSequence; + int reliableAcknowledge; + char *reliableCommands[MAX_RELIABLE_COMMANDS]; + + // reliable messages received from server + int serverCommandSequence; + char *serverCommands[MAX_RELIABLE_COMMANDS]; + + // big stuff at end of structure so most offsets are 15 bits or less + netchan_t netchan; +} clientConnection_t; + +extern clientConnection_t clc; + +/* +================================================================== + +the clientStatic_t structure is never wiped, and is used even when +no client connection is active at all + +================================================================== +*/ + +typedef struct { + connstate_t state; // connection status + + char servername[MAX_OSPATH]; // name of server from original connect (used by reconnect) + + // when the server clears the hunk, all of these must be restarted + qboolean rendererStarted; + qboolean soundStarted; + qboolean soundRegistered; + qboolean uiStarted; + qboolean cgameStarted; + + int framecount; + int frametime; // msec since last frame + float frametimeFraction; // fraction of a msec since last frame + + int realtime; // ignores pause + float realtimeFraction; // fraction of a msec accumulated + int realFrametime; // ignoring pause, so console always works + + // update server info + char updateInfoString[MAX_INFO_STRING]; + + // rendering info + glconfig_t glconfig; + qhandle_t charSetShader; + qhandle_t whiteShader; + qhandle_t consoleShader; +} clientStatic_t; + +#define CON_TEXTSIZE 0x30000 //was 32768 +#define NUM_CON_TIMES 4 + +typedef struct { + qboolean initialized; + + short text[CON_TEXTSIZE]; + int current; // line where next message will be printed + int x; // offset in current line for next print + int display; // bottom of console displays this line + + int linewidth; // characters across screen + int totallines; // total lines in console scrollback + + float xadjust; // for wide aspect screens + float yadjust; + + float displayFrac; // aproaches finalFrac at scr_conspeed + float finalFrac; // 0.0 to 1.0 lines of console to display + + int vislines; // in scanlines + + int times[NUM_CON_TIMES]; // cls.realtime time the line was generated + // for transparent notify lines + vec4_t color; +} console_t; + +extern clientStatic_t cls; + +//============================================================================= + +extern refexport_t re; // interface to refresh .dll + + +// +// cvars +// +extern cvar_t *cl_nodelta; +extern cvar_t *cl_debugMove; +extern cvar_t *cl_noprint; +extern cvar_t *cl_timegraph; +extern cvar_t *cl_packetdup; +extern cvar_t *cl_shownet; +extern cvar_t *cl_timeNudge; +extern cvar_t *cl_showTimeDelta; + +extern cvar_t *cl_yawspeed; +extern cvar_t *cl_pitchspeed; +extern cvar_t *cl_run; +extern cvar_t *cl_anglespeedkey; + +extern cvar_t *cl_sensitivity; +extern cvar_t *cl_freelook; + +extern cvar_t *cl_mouseAccel; +extern cvar_t *cl_showMouseRate; + +extern cvar_t *cl_inGameVideo; + +extern cvar_t *m_pitch; +extern cvar_t *m_yaw; +extern cvar_t *m_forward; +extern cvar_t *m_side; +extern cvar_t *m_filter; + +extern cvar_t *cl_activeAction; + +extern cvar_t *cl_consoleKeys; + +//================================================= + +// +// cl_main +// + +void CL_Init (void); + +void CL_AddReliableCommand( const char *cmd ); + +void CL_Disconnect_f (void); +void CL_Vid_Restart_f( void ); +void CL_Snd_Restart_f (void); + +qboolean CL_CheckPaused(void); + +// +// cl_input +// +typedef struct { + int down[2]; // key nums holding it down + unsigned downtime; // msec timestamp + unsigned msec; // msec down this frame if both a down and up happened + qboolean active; // current state + qboolean wasPressed; // set when down, not cleared when up +} kbutton_t; + +extern kbutton_t in_mlook, in_klook; +extern kbutton_t in_strafe; +extern kbutton_t in_speed; + +void CL_InitInput (void); +void CL_SendCmd (void); +void CL_ClearState (void); +void CL_ReadPackets (void); +void CL_UpdateHotSwap(void); +bool CL_ExtendSelectTime(void); + +void CL_WritePacket( void ); +void IN_CenterView (void); + +float CL_KeyState (kbutton_t *key); +const char *Key_KeynumToString( int keynum/*, qboolean bTranslate*/ ); //note: translate is only called for menu display not configs + +// +// cl_parse.c +// +extern int cl_connectedToCheatServer; + +void CL_SystemInfoChanged( void ); +void CL_ParseServerMessage( msg_t *msg ); + +//==================================================================== + +// +// console +// +void Con_DrawCharacter (int cx, int line, int num); + +void Con_CheckResize (void); +void Con_Init (void); +void Con_Clear_f (void); +void Con_ToggleConsole_f (void); +void Con_DrawNotify (void); +void Con_ClearNotify (void); +void Con_RunConsole (void); +void Con_DrawConsole (void); +void Con_PageUp( void ); +void Con_PageDown( void ); +void Con_Top( void ); +void Con_Bottom( void ); +void Con_Close( void ); + + +// +// cl_scrn.c +// +void SCR_Init (void); +void SCR_UpdateScreen (void); + +void SCR_DebugGraph (float value, int color); + +int SCR_GetBigStringWidth( const char *str ); // returns in virtual 640x480 coordinates + +void SCR_FillRect( float x, float y, float width, float height, + const float *color ); +void SCR_DrawPic( float x, float y, float width, float height, qhandle_t hShader ); +void SCR_DrawNamedPic( float x, float y, float width, float height, const char *picname ); + +void SCR_DrawBigString( int x, int y, const char *s, float alpha, qboolean noColorEscape ); // draws a string with embedded color control characters with fade +void SCR_DrawBigStringColor( int x, int y, const char *s, vec4_t color, qboolean noColorEscape ); // ignores embedded color control characters +void SCR_DrawSmallStringExt( int x, int y, const char *string, float *setColor, qboolean forceColor, qboolean noColorEscape ); +void SCR_DrawBigChar( int x, int y, int ch ); +void SCR_DrawSmallChar( int x, int y, int ch ); + +#ifdef JK2_MODE +void SCR_PrecacheScreenshot(); +#endif + +// +// cl_cin.c +// +void CL_PlayCinematic_f( void ); +void CL_PlayInGameCinematic_f(void); +qboolean CL_CheckPendingCinematic(void); +qboolean CL_IsRunningInGameCinematic(void); +qboolean CL_InGameCinematicOnStandBy(void); +void SCR_DrawCinematic (void); +void SCR_RunCinematic (void); +void SCR_StopCinematic( qboolean bAllowRefusal = qfalse ); + +int CIN_PlayCinematic( const char *arg0, int xpos, int ypos, int width, int height, int bits, const char *psAudioFile /* = NULL */); +e_status CIN_StopCinematic(int handle); +e_status CIN_RunCinematic (int handle); +void CIN_DrawCinematic (int handle); +void CIN_SetExtents (int handle, int x, int y, int w, int h); +void CIN_SetLooping (int handle, qboolean loop); +void CIN_UploadCinematic(int handle); +void CIN_CloseAllVideos(void); + +// +// cl_cgame.c +// +qboolean CL_InitCGameVM( void *gameLibrary ); +void CL_InitCGame( void ); +void CL_ShutdownCGame( void ); +qboolean CL_GameCommand( void ); +void CL_CGameRendering( stereoFrame_t stereo ); +void CL_SetCGameTime( void ); +void CL_FirstSnapshot( void ); + + +// +// cl_ui.c +// +void CL_InitUI( void ); +void CL_ShutdownUI( void ); +void CL_GenericMenu_f(void); +void CL_DataPad_f(void); +void CL_EndScreenDissolve_f(void); +int Key_GetCatcher( void ); +void Key_SetCatcher( int catcher ); diff --git a/code/client/client.h.REMOTE.7476.h b/code/client/client.h.REMOTE.7476.h new file mode 100644 index 0000000000..d50be2ddcb --- /dev/null +++ b/code/client/client.h.REMOTE.7476.h @@ -0,0 +1,421 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +// client.h -- primary header for client +#pragma once + +#include "../qcommon/q_shared.h" +#include "../qcommon/qcommon.h" +#include "../rd-common/tr_public.h" +#include "keys.h" +#include "snd_public.h" +#include "../cgame/cg_public.h" + +// snapshots are a view of the server at a given time +typedef struct { + qboolean valid; // cleared if delta parsing was invalid + int snapFlags; // rate delayed and dropped commands + + int serverTime; // server time the message is valid for (in msec) + + int messageNum; // copied from netchan->incoming_sequence + int deltaNum; // messageNum the delta is from + int ping; // time from when cmdNum-1 was sent to time packet was reeceived + byte areamask[MAX_MAP_AREA_BYTES]; // portalarea visibility bits + + int cmdNum; // the next cmdNum the server is expecting + playerState_t ps; // complete information about the current player at this time + + int numEntities; // all of the entities that need to be presented + int parseEntitiesNum; // at the time of this snapshot + + int serverCommandNum; // execute all commands up to this before + // making the snapshot current +} clSnapshot_t; + + + +/* +============================================================================= + +the clientActive_t structure is wiped completely at every +new gamestate_t, potentially several times during an established connection + +============================================================================= +*/ + +// the parseEntities array must be large enough to hold PACKET_BACKUP frames of +// entities, so that when a delta compressed message arives from the server +// it can be un-deltad from the original +#define MAX_PARSE_ENTITIES 512 + +extern int g_console_field_width; + +typedef struct { + int timeoutcount; + + clSnapshot_t frame; // latest received from server + + int serverTime; + int oldServerTime; // to prevent time from flowing bakcwards + int oldFrameServerTime; // to check tournament restarts + int serverTimeDelta; // cl.serverTime = cls.realtime + cl.serverTimeDelta + // this value changes as net lag varies + qboolean extrapolatedSnapshot; // set if any cgame frame has been forced to extrapolate + // cleared when CL_AdjustTimeDelta looks at it + qboolean newSnapshots; // set on parse, cleared when CL_AdjustTimeDelta looks at it + + gameState_t gameState; // configstrings + char mapname[MAX_QPATH]; // extracted from CS_SERVERINFO + + int parseEntitiesNum; // index (not anded off) into cl_parse_entities[] + + int mouseDx[2], mouseDy[2]; // added to by mouse events + int mouseIndex; + int joystickAxis[MAX_JOYSTICK_AXIS]; // set by joystick events + + int cgameUserCmdValue; // current weapon to add to usercmd_t + float cgameSensitivity; + + // cmds[cmdNumber] is the predicted command, [cmdNumber-1] is the last + // properly generated command + usercmd_t cmds[CMD_BACKUP]; // each mesage will send several old cmds + int cmdNumber; // incremented each frame, because multiple + // frames may need to be packed into a single packet + + int packetTime[PACKET_BACKUP]; // cls.realtime sent, for calculating pings + int packetCmdNumber[PACKET_BACKUP]; // cmdNumber when packet was sent + + // the client maintains its own idea of view angles, which are + // sent to the server each frame. It is cleared to 0 upon entering each level. + // the server sends a delta each frame which is added to the locally + // tracked view angles to account for standing on rotating objects, + // and teleport direction changes + vec3_t viewangles; + + // these are just parsed out of the configstrings for convenience + int serverId; + + // non-gameserver infornamtion + int cinematictime; // cls.realtime for first cinematic frame (FIXME: NO LONGER USED!, but I wasn't sure if I could remove it because of struct sizes assumed elsewhere? -Ste) + + // big stuff at end of structure so most offsets are 15 bits or less + clSnapshot_t frames[PACKET_BACKUP]; + + entityState_t parseEntities[MAX_PARSE_ENTITIES]; + + //DJC added - making force powers in single player work like those in + //multiplayer. This makes hot swapping code more portable. + qboolean gcmdSendValue; + byte gcmdValue; +} clientActive_t; + +extern clientActive_t cl; + +/* +============================================================================= + +the clientConnection_t structure is wiped when disconnecting from a server, +either to go to a full screen console, or connect to a different server + +A connection can be to either a server through the network layer, +or just a streaming cinematic. + +============================================================================= +*/ + + +typedef struct { + int lastPacketSentTime; // for retransmits + int lastPacketTime; + char servername[MAX_OSPATH]; // name of server from original connect + netadr_t serverAddress; + int connectTime; // for connection retransmits + int connectPacketCount; // for display on connection dialog + + int challenge; // from the server to use for connecting + + int reliableSequence; + int reliableAcknowledge; + char *reliableCommands[MAX_RELIABLE_COMMANDS]; + + // reliable messages received from server + int serverCommandSequence; + char *serverCommands[MAX_RELIABLE_COMMANDS]; + + // big stuff at end of structure so most offsets are 15 bits or less + netchan_t netchan; +} clientConnection_t; + +extern clientConnection_t clc; + +/* +================================================================== + +the clientStatic_t structure is never wiped, and is used even when +no client connection is active at all + +================================================================== +*/ + +typedef struct { + connstate_t state; // connection status + + char servername[MAX_OSPATH]; // name of server from original connect (used by reconnect) + + // when the server clears the hunk, all of these must be restarted + qboolean rendererStarted; + qboolean soundStarted; + qboolean soundRegistered; + qboolean uiStarted; + qboolean cgameStarted; + + int framecount; + int frametime; // msec since last frame + float frametimeFraction; // fraction of a msec since last frame + + int realtime; // ignores pause + float realtimeFraction; // fraction of a msec accumulated + int realFrametime; // ignoring pause, so console always works + + // update server info + char updateInfoString[MAX_INFO_STRING]; + + // rendering info + glconfig_t glconfig; + qhandle_t charSetShader; + qhandle_t whiteShader; + qhandle_t consoleShader; +} clientStatic_t; + +#define CON_TEXTSIZE 0x30000 //was 32768 +#define NUM_CON_TIMES 4 + +typedef struct { + qboolean initialized; + + short text[CON_TEXTSIZE]; + int current; // line where next message will be printed + int x; // offset in current line for next print + int display; // bottom of console displays this line + + int linewidth; // characters across screen + int totallines; // total lines in console scrollback + + float xadjust; // for wide aspect screens + float yadjust; + + float displayFrac; // aproaches finalFrac at scr_conspeed + float finalFrac; // 0.0 to 1.0 lines of console to display + + int vislines; // in scanlines + + int times[NUM_CON_TIMES]; // cls.realtime time the line was generated + // for transparent notify lines + vec4_t color; +} console_t; + +extern clientStatic_t cls; + +//============================================================================= + +extern refexport_t re; // interface to refresh .dll + + +// +// cvars +// +extern cvar_t *cl_nodelta; +extern cvar_t *cl_debugMove; +extern cvar_t *cl_noprint; +extern cvar_t *cl_timegraph; +extern cvar_t *cl_packetdup; +extern cvar_t *cl_shownet; +extern cvar_t *cl_timeNudge; +extern cvar_t *cl_showTimeDelta; + +extern cvar_t *cl_yawspeed; +extern cvar_t *cl_pitchspeed; +extern cvar_t *cl_run; +extern cvar_t *cl_anglespeedkey; + +extern cvar_t *cl_sensitivity; +extern cvar_t *cl_freelook; + +extern cvar_t *cl_mouseAccel; +extern cvar_t *cl_showMouseRate; + +extern cvar_t *cl_inGameVideo; + +extern cvar_t *m_pitch; +extern cvar_t *m_yaw; +extern cvar_t *m_forward; +extern cvar_t *m_side; +extern cvar_t *m_filter; + +extern cvar_t *cl_activeAction; + +extern cvar_t *cl_consoleKeys; + +//================================================= + +// +// cl_main +// + +void CL_Init (void); + +void CL_AddReliableCommand( const char *cmd ); + +void CL_Disconnect_f (void); +void CL_Vid_Restart_f( void ); +void CL_Snd_Restart_f (void); + +qboolean CL_CheckPaused(void); + +// +// cl_input +// +typedef struct { + int down[2]; // key nums holding it down + unsigned downtime; // msec timestamp + unsigned msec; // msec down this frame if both a down and up happened + qboolean active; // current state + qboolean wasPressed; // set when down, not cleared when up +} kbutton_t; + +extern kbutton_t in_mlook, in_klook; +extern kbutton_t in_strafe; +extern kbutton_t in_speed; + +void CL_InitInput (void); +void CL_SendCmd (void); +void CL_ClearState (void); +void CL_ReadPackets (void); +void CL_UpdateHotSwap(void); +bool CL_ExtendSelectTime(void); + +void CL_WritePacket( void ); +void IN_CenterView (void); + +float CL_KeyState (kbutton_t *key); +const char *Key_KeynumToString( int keynum/*, qboolean bTranslate*/ ); //note: translate is only called for menu display not configs + +// +// cl_parse.c +// +extern int cl_connectedToCheatServer; + +void CL_SystemInfoChanged( void ); +void CL_ParseServerMessage( msg_t *msg ); + +//==================================================================== + +// +// console +// +void Con_DrawCharacter (int cx, int line, int num); + +void Con_CheckResize (void); +void Con_Init (void); +void Con_Clear_f (void); +void Con_ToggleConsole_f (void); +void Con_DrawNotify (void); +void Con_ClearNotify (void); +void Con_RunConsole (void); +void Con_DrawConsole (void); +void Con_PageUp( void ); +void Con_PageDown( void ); +void Con_Top( void ); +void Con_Bottom( void ); +void Con_Close( void ); + + +// +// cl_scrn.c +// +void SCR_Init (void); +void SCR_UpdateScreen (void); + +void SCR_DebugGraph (float value, int color); + +int SCR_GetBigStringWidth( const char *str ); // returns in virtual 640x480 coordinates + +void SCR_FillRect( float x, float y, float width, float height, + const float *color ); +void SCR_DrawPic( float x, float y, float width, float height, qhandle_t hShader ); +void SCR_DrawNamedPic( float x, float y, float width, float height, const char *picname ); + +void SCR_DrawBigString( int x, int y, const char *s, float alpha, qboolean noColorEscape ); // draws a string with embedded color control characters with fade +void SCR_DrawBigStringColor( int x, int y, const char *s, vec4_t color, qboolean noColorEscape ); // ignores embedded color control characters +void SCR_DrawSmallStringExt( int x, int y, const char *string, float *setColor, qboolean forceColor, qboolean noColorEscape ); +void SCR_DrawBigChar( int x, int y, int ch ); +void SCR_DrawSmallChar( int x, int y, int ch ); + +#ifdef JK2_MODE +void SCR_PrecacheScreenshot(); +#endif + +// +// cl_cin.c +// +void CL_PlayCinematic_f( void ); +void CL_PlayInGameCinematic_f(void); +qboolean CL_CheckPendingCinematic(void); +qboolean CL_IsRunningInGameCinematic(void); +qboolean CL_InGameCinematicOnStandBy(void); +void SCR_DrawCinematic (void); +void SCR_RunCinematic (void); +void SCR_StopCinematic( qboolean bAllowRefusal = qfalse ); + +int CIN_PlayCinematic( const char *arg0, int xpos, int ypos, int width, int height, int bits, const char *psAudioFile /* = NULL */); +e_status CIN_StopCinematic(int handle); +e_status CIN_RunCinematic (int handle); +void CIN_DrawCinematic (int handle); +void CIN_SetExtents (int handle, int x, int y, int w, int h); +void CIN_SetLooping (int handle, qboolean loop); +void CIN_UploadCinematic(int handle); +void CIN_CloseAllVideos(void); + +// +// cl_cgame.c +// +qboolean CL_InitCGameVM( void *gameLibrary ); +void CL_InitCGame( void ); +void CL_ShutdownCGame( void ); +qboolean CL_GameCommand( void ); +void CL_CGameRendering( stereoFrame_t stereo ); +void CL_SetCGameTime( void ); +void CL_FirstSnapshot( void ); + + +// +// cl_ui.c +// +void CL_InitUI( void ); +void CL_ShutdownUI( void ); +void CL_GenericMenu_f(void); +void CL_DataPad_f(void); +void CL_EndScreenDissolve_f(void); +int Key_GetCatcher( void ); +void Key_SetCatcher( int catcher ); diff --git a/code/client/client.h.REMOTE.8932.h b/code/client/client.h.REMOTE.8932.h new file mode 100644 index 0000000000..d50be2ddcb --- /dev/null +++ b/code/client/client.h.REMOTE.8932.h @@ -0,0 +1,421 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +// client.h -- primary header for client +#pragma once + +#include "../qcommon/q_shared.h" +#include "../qcommon/qcommon.h" +#include "../rd-common/tr_public.h" +#include "keys.h" +#include "snd_public.h" +#include "../cgame/cg_public.h" + +// snapshots are a view of the server at a given time +typedef struct { + qboolean valid; // cleared if delta parsing was invalid + int snapFlags; // rate delayed and dropped commands + + int serverTime; // server time the message is valid for (in msec) + + int messageNum; // copied from netchan->incoming_sequence + int deltaNum; // messageNum the delta is from + int ping; // time from when cmdNum-1 was sent to time packet was reeceived + byte areamask[MAX_MAP_AREA_BYTES]; // portalarea visibility bits + + int cmdNum; // the next cmdNum the server is expecting + playerState_t ps; // complete information about the current player at this time + + int numEntities; // all of the entities that need to be presented + int parseEntitiesNum; // at the time of this snapshot + + int serverCommandNum; // execute all commands up to this before + // making the snapshot current +} clSnapshot_t; + + + +/* +============================================================================= + +the clientActive_t structure is wiped completely at every +new gamestate_t, potentially several times during an established connection + +============================================================================= +*/ + +// the parseEntities array must be large enough to hold PACKET_BACKUP frames of +// entities, so that when a delta compressed message arives from the server +// it can be un-deltad from the original +#define MAX_PARSE_ENTITIES 512 + +extern int g_console_field_width; + +typedef struct { + int timeoutcount; + + clSnapshot_t frame; // latest received from server + + int serverTime; + int oldServerTime; // to prevent time from flowing bakcwards + int oldFrameServerTime; // to check tournament restarts + int serverTimeDelta; // cl.serverTime = cls.realtime + cl.serverTimeDelta + // this value changes as net lag varies + qboolean extrapolatedSnapshot; // set if any cgame frame has been forced to extrapolate + // cleared when CL_AdjustTimeDelta looks at it + qboolean newSnapshots; // set on parse, cleared when CL_AdjustTimeDelta looks at it + + gameState_t gameState; // configstrings + char mapname[MAX_QPATH]; // extracted from CS_SERVERINFO + + int parseEntitiesNum; // index (not anded off) into cl_parse_entities[] + + int mouseDx[2], mouseDy[2]; // added to by mouse events + int mouseIndex; + int joystickAxis[MAX_JOYSTICK_AXIS]; // set by joystick events + + int cgameUserCmdValue; // current weapon to add to usercmd_t + float cgameSensitivity; + + // cmds[cmdNumber] is the predicted command, [cmdNumber-1] is the last + // properly generated command + usercmd_t cmds[CMD_BACKUP]; // each mesage will send several old cmds + int cmdNumber; // incremented each frame, because multiple + // frames may need to be packed into a single packet + + int packetTime[PACKET_BACKUP]; // cls.realtime sent, for calculating pings + int packetCmdNumber[PACKET_BACKUP]; // cmdNumber when packet was sent + + // the client maintains its own idea of view angles, which are + // sent to the server each frame. It is cleared to 0 upon entering each level. + // the server sends a delta each frame which is added to the locally + // tracked view angles to account for standing on rotating objects, + // and teleport direction changes + vec3_t viewangles; + + // these are just parsed out of the configstrings for convenience + int serverId; + + // non-gameserver infornamtion + int cinematictime; // cls.realtime for first cinematic frame (FIXME: NO LONGER USED!, but I wasn't sure if I could remove it because of struct sizes assumed elsewhere? -Ste) + + // big stuff at end of structure so most offsets are 15 bits or less + clSnapshot_t frames[PACKET_BACKUP]; + + entityState_t parseEntities[MAX_PARSE_ENTITIES]; + + //DJC added - making force powers in single player work like those in + //multiplayer. This makes hot swapping code more portable. + qboolean gcmdSendValue; + byte gcmdValue; +} clientActive_t; + +extern clientActive_t cl; + +/* +============================================================================= + +the clientConnection_t structure is wiped when disconnecting from a server, +either to go to a full screen console, or connect to a different server + +A connection can be to either a server through the network layer, +or just a streaming cinematic. + +============================================================================= +*/ + + +typedef struct { + int lastPacketSentTime; // for retransmits + int lastPacketTime; + char servername[MAX_OSPATH]; // name of server from original connect + netadr_t serverAddress; + int connectTime; // for connection retransmits + int connectPacketCount; // for display on connection dialog + + int challenge; // from the server to use for connecting + + int reliableSequence; + int reliableAcknowledge; + char *reliableCommands[MAX_RELIABLE_COMMANDS]; + + // reliable messages received from server + int serverCommandSequence; + char *serverCommands[MAX_RELIABLE_COMMANDS]; + + // big stuff at end of structure so most offsets are 15 bits or less + netchan_t netchan; +} clientConnection_t; + +extern clientConnection_t clc; + +/* +================================================================== + +the clientStatic_t structure is never wiped, and is used even when +no client connection is active at all + +================================================================== +*/ + +typedef struct { + connstate_t state; // connection status + + char servername[MAX_OSPATH]; // name of server from original connect (used by reconnect) + + // when the server clears the hunk, all of these must be restarted + qboolean rendererStarted; + qboolean soundStarted; + qboolean soundRegistered; + qboolean uiStarted; + qboolean cgameStarted; + + int framecount; + int frametime; // msec since last frame + float frametimeFraction; // fraction of a msec since last frame + + int realtime; // ignores pause + float realtimeFraction; // fraction of a msec accumulated + int realFrametime; // ignoring pause, so console always works + + // update server info + char updateInfoString[MAX_INFO_STRING]; + + // rendering info + glconfig_t glconfig; + qhandle_t charSetShader; + qhandle_t whiteShader; + qhandle_t consoleShader; +} clientStatic_t; + +#define CON_TEXTSIZE 0x30000 //was 32768 +#define NUM_CON_TIMES 4 + +typedef struct { + qboolean initialized; + + short text[CON_TEXTSIZE]; + int current; // line where next message will be printed + int x; // offset in current line for next print + int display; // bottom of console displays this line + + int linewidth; // characters across screen + int totallines; // total lines in console scrollback + + float xadjust; // for wide aspect screens + float yadjust; + + float displayFrac; // aproaches finalFrac at scr_conspeed + float finalFrac; // 0.0 to 1.0 lines of console to display + + int vislines; // in scanlines + + int times[NUM_CON_TIMES]; // cls.realtime time the line was generated + // for transparent notify lines + vec4_t color; +} console_t; + +extern clientStatic_t cls; + +//============================================================================= + +extern refexport_t re; // interface to refresh .dll + + +// +// cvars +// +extern cvar_t *cl_nodelta; +extern cvar_t *cl_debugMove; +extern cvar_t *cl_noprint; +extern cvar_t *cl_timegraph; +extern cvar_t *cl_packetdup; +extern cvar_t *cl_shownet; +extern cvar_t *cl_timeNudge; +extern cvar_t *cl_showTimeDelta; + +extern cvar_t *cl_yawspeed; +extern cvar_t *cl_pitchspeed; +extern cvar_t *cl_run; +extern cvar_t *cl_anglespeedkey; + +extern cvar_t *cl_sensitivity; +extern cvar_t *cl_freelook; + +extern cvar_t *cl_mouseAccel; +extern cvar_t *cl_showMouseRate; + +extern cvar_t *cl_inGameVideo; + +extern cvar_t *m_pitch; +extern cvar_t *m_yaw; +extern cvar_t *m_forward; +extern cvar_t *m_side; +extern cvar_t *m_filter; + +extern cvar_t *cl_activeAction; + +extern cvar_t *cl_consoleKeys; + +//================================================= + +// +// cl_main +// + +void CL_Init (void); + +void CL_AddReliableCommand( const char *cmd ); + +void CL_Disconnect_f (void); +void CL_Vid_Restart_f( void ); +void CL_Snd_Restart_f (void); + +qboolean CL_CheckPaused(void); + +// +// cl_input +// +typedef struct { + int down[2]; // key nums holding it down + unsigned downtime; // msec timestamp + unsigned msec; // msec down this frame if both a down and up happened + qboolean active; // current state + qboolean wasPressed; // set when down, not cleared when up +} kbutton_t; + +extern kbutton_t in_mlook, in_klook; +extern kbutton_t in_strafe; +extern kbutton_t in_speed; + +void CL_InitInput (void); +void CL_SendCmd (void); +void CL_ClearState (void); +void CL_ReadPackets (void); +void CL_UpdateHotSwap(void); +bool CL_ExtendSelectTime(void); + +void CL_WritePacket( void ); +void IN_CenterView (void); + +float CL_KeyState (kbutton_t *key); +const char *Key_KeynumToString( int keynum/*, qboolean bTranslate*/ ); //note: translate is only called for menu display not configs + +// +// cl_parse.c +// +extern int cl_connectedToCheatServer; + +void CL_SystemInfoChanged( void ); +void CL_ParseServerMessage( msg_t *msg ); + +//==================================================================== + +// +// console +// +void Con_DrawCharacter (int cx, int line, int num); + +void Con_CheckResize (void); +void Con_Init (void); +void Con_Clear_f (void); +void Con_ToggleConsole_f (void); +void Con_DrawNotify (void); +void Con_ClearNotify (void); +void Con_RunConsole (void); +void Con_DrawConsole (void); +void Con_PageUp( void ); +void Con_PageDown( void ); +void Con_Top( void ); +void Con_Bottom( void ); +void Con_Close( void ); + + +// +// cl_scrn.c +// +void SCR_Init (void); +void SCR_UpdateScreen (void); + +void SCR_DebugGraph (float value, int color); + +int SCR_GetBigStringWidth( const char *str ); // returns in virtual 640x480 coordinates + +void SCR_FillRect( float x, float y, float width, float height, + const float *color ); +void SCR_DrawPic( float x, float y, float width, float height, qhandle_t hShader ); +void SCR_DrawNamedPic( float x, float y, float width, float height, const char *picname ); + +void SCR_DrawBigString( int x, int y, const char *s, float alpha, qboolean noColorEscape ); // draws a string with embedded color control characters with fade +void SCR_DrawBigStringColor( int x, int y, const char *s, vec4_t color, qboolean noColorEscape ); // ignores embedded color control characters +void SCR_DrawSmallStringExt( int x, int y, const char *string, float *setColor, qboolean forceColor, qboolean noColorEscape ); +void SCR_DrawBigChar( int x, int y, int ch ); +void SCR_DrawSmallChar( int x, int y, int ch ); + +#ifdef JK2_MODE +void SCR_PrecacheScreenshot(); +#endif + +// +// cl_cin.c +// +void CL_PlayCinematic_f( void ); +void CL_PlayInGameCinematic_f(void); +qboolean CL_CheckPendingCinematic(void); +qboolean CL_IsRunningInGameCinematic(void); +qboolean CL_InGameCinematicOnStandBy(void); +void SCR_DrawCinematic (void); +void SCR_RunCinematic (void); +void SCR_StopCinematic( qboolean bAllowRefusal = qfalse ); + +int CIN_PlayCinematic( const char *arg0, int xpos, int ypos, int width, int height, int bits, const char *psAudioFile /* = NULL */); +e_status CIN_StopCinematic(int handle); +e_status CIN_RunCinematic (int handle); +void CIN_DrawCinematic (int handle); +void CIN_SetExtents (int handle, int x, int y, int w, int h); +void CIN_SetLooping (int handle, qboolean loop); +void CIN_UploadCinematic(int handle); +void CIN_CloseAllVideos(void); + +// +// cl_cgame.c +// +qboolean CL_InitCGameVM( void *gameLibrary ); +void CL_InitCGame( void ); +void CL_ShutdownCGame( void ); +qboolean CL_GameCommand( void ); +void CL_CGameRendering( stereoFrame_t stereo ); +void CL_SetCGameTime( void ); +void CL_FirstSnapshot( void ); + + +// +// cl_ui.c +// +void CL_InitUI( void ); +void CL_ShutdownUI( void ); +void CL_GenericMenu_f(void); +void CL_DataPad_f(void); +void CL_EndScreenDissolve_f(void); +int Key_GetCatcher( void ); +void Key_SetCatcher( int catcher ); diff --git a/code/client/client_ui.h b/code/client/client_ui.h index 4a6a00b18f..67789f91e8 100644 --- a/code/client/client_ui.h +++ b/code/client/client_ui.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // client_ui.h -- header for client access to ui funcs #ifndef __CLIENTUI_H__ diff --git a/code/client/eax/EaxMan.h b/code/client/eax/EaxMan.h index e451678a37..d952ae28f9 100644 --- a/code/client/eax/EaxMan.h +++ b/code/client/eax/EaxMan.h @@ -2,9 +2,8 @@ This file is part of Jedi Academy. Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. Jedi Academy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/code/client/keycodes.h b/code/client/keycodes.h index b320333438..2e750daa65 100644 --- a/code/client/keycodes.h +++ b/code/client/keycodes.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __KEYCODES_H__ #define __KEYCODES_H__ diff --git a/code/client/keys.h b/code/client/keys.h index b0bf5c7961..5f3580dcbf 100644 --- a/code/client/keys.h +++ b/code/client/keys.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "keycodes.h" diff --git a/code/client/snd_ambient.cpp b/code/client/snd_ambient.cpp index e103a9f34c..6ce8772755 100644 --- a/code/client/snd_ambient.cpp +++ b/code/client/snd_ambient.cpp @@ -1,30 +1,28 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Ambient Sound System (ASS!) - -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" -#ifdef _MSC_VER -#pragma warning ( disable : 4710 ) //not inlined -#endif #include "client.h" #include "snd_ambient.h" #include "snd_local.h" @@ -56,7 +54,7 @@ static int parsePos = 0; static char tempBuffer[1024]; //NOTENOTE: Be sure to change the mirrored code in g_spawn.cpp, and cg_main.cpp -typedef map namePrecache_m; +typedef std::map namePrecache_m; static namePrecache_m *pMap; // Used for enum / string matching @@ -92,8 +90,8 @@ static const char *keywordNames[NUM_AS_KEYWORDS]= CSetGroup::CSetGroup(void) { - m_ambientSets = new vector; - m_setMap = new map; + m_ambientSets = new std::vector; + m_setMap = new std::map; m_numSets = 0; } @@ -112,7 +110,7 @@ Free void CSetGroup::Free( void ) { - vector::iterator ai; + std::vector::iterator ai; for ( ai = m_ambientSets->begin(); ai != m_ambientSets->end(); ai++ ) { @@ -122,8 +120,8 @@ void CSetGroup::Free( void ) //Do this in place of clear() so it *really* frees the memory. delete m_ambientSets; delete m_setMap; - m_ambientSets = new vector; - m_setMap = new map; + m_ambientSets = new std::vector; + m_setMap = new std::map; m_numSets = 0; } @@ -170,7 +168,7 @@ GetSet ambientSet_t *CSetGroup::GetSet( const char *name ) { - map::iterator mi; + std::map::iterator mi; if ( name == NULL ) return NULL; diff --git a/code/client/snd_ambient.h b/code/client/snd_ambient.h index 98a529034c..4387851dd7 100644 --- a/code/client/snd_ambient.h +++ b/code/client/snd_ambient.h @@ -1,50 +1,34 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __SND_AMBIENT__ #define __SND_AMBIENT__ // Includes - -#ifdef _MSC_VER -#pragma warning ( disable : 4786 ) -#pragma warning ( disable : 4511 ) //copy constructor could not be gen -#pragma warning ( disable : 4512 ) //assign constructor could not be gen - -//these don't work because stl re-sets them -//#pragma warning ( disable : 4663 ) //spcialize class -//#pragma warning ( disable : 4018 ) //signed/unsigned -#pragma warning (disable:4503) // decorated name length xceeded, name was truncated -#pragma warning (push, 3) //go back down to 3 for the stl include -#endif - #include "../qcommon/sstring.h" // #include #include #include -#ifdef _MSC_VER -#pragma warning (pop) -#pragma warning (disable:4503) // decorated name length xceeded, name was truncated -#endif - -using namespace std; // Defines - #define AMBIENT_SET_FILENAME "sound/sound.txt" const int MAX_WAVES_PER_GROUP = 8; @@ -121,8 +105,8 @@ class CSetGroup protected: int m_numSets; - vector < ambientSet_t * > *m_ambientSets; - map < sstring_t, ambientSet_t * > *m_setMap; + std::vector < ambientSet_t * > *m_ambientSets; + std::map < sstring_t, ambientSet_t * > *m_setMap; }; // Prototypes diff --git a/code/client/snd_dma.cpp b/code/client/snd_dma.cpp index d96f6efbf1..cf3694fc1c 100644 --- a/code/client/snd_dma.cpp +++ b/code/client/snd_dma.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software /***************************************************************************** * name: snd_dma.c @@ -23,8 +28,6 @@ This file is part of Jedi Academy. * * *****************************************************************************/ -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" #include "snd_local.h" @@ -32,6 +35,9 @@ This file is part of Jedi Academy. #include "snd_music.h" #define __STDC_FORMAT_MACROS #include +#if defined(_WIN32) +#include +#endif static void S_Play_f(void); static void S_SoundList_f(void); @@ -554,9 +560,11 @@ void S_Init( void ) { if (s_eaxSet(&EAXPROPERTYID_EAX40_Source, EAXSOURCE_FLAGS, s_channels[i].alSource, &ulFlags, sizeof(ulFlags))!=AL_NO_ERROR) -#ifdef _MSC_VER - OutputDebugString("Failed to to remove Source flags\n"); + { +#ifdef _WIN32 + OutputDebugString("Failed to to remove Source flags\n"); #endif + } } s_numChannels++; @@ -2057,12 +2065,13 @@ S_RawSamples Music streaming ============ */ -void S_RawSamples( int samples, int rate, int width, int s_channels, const byte *data, float volume, qboolean bFirstOrOnlyUpdateThisFrame ) +void S_RawSamples( int samples, int rate, int width, int channels, const byte *data, float volume, qboolean bFirstOrOnlyUpdateThisFrame ) { int i; int src, dst; float scale; int intVolume; + int rawEndStart; if ( !s_soundStarted || s_soundMuted ) { return; @@ -2074,11 +2083,13 @@ void S_RawSamples( int samples, int rate, int width, int s_channels, const byte Com_DPrintf( "S_RawSamples: resetting minimum: %i < %i\n", s_rawend, s_soundtime ); s_rawend = s_soundtime; } + + rawEndStart = s_rawend; scale = (float)rate / dma.speed; //Com_Printf ("%i < %i < %i\n", s_soundtime, s_paintedtime, s_rawend); - if (s_channels == 2 && width == 2) + if (channels == 2 && width == 2) { if (scale == 1.0) { // optimized case @@ -2114,6 +2125,9 @@ void S_RawSamples( int samples, int rate, int width, int s_channels, const byte break; dst = s_rawend&(MAX_RAW_SAMPLES-1); s_rawend++; + //Don't overflow if resampling. + if (s_rawend > rawEndStart + MAX_RAW_SAMPLES) + break; s_rawsamples[dst].left = ((short *)data)[src*2] * intVolume; s_rawsamples[dst].right = ((short *)data)[src*2+1] * intVolume; } @@ -2127,13 +2141,16 @@ void S_RawSamples( int samples, int rate, int width, int s_channels, const byte break; dst = s_rawend&(MAX_RAW_SAMPLES-1); s_rawend++; + //Don't overflow if resampling. + if (s_rawend > rawEndStart + MAX_RAW_SAMPLES) + break; s_rawsamples[dst].left += ((short *)data)[src*2] * intVolume; s_rawsamples[dst].right += ((short *)data)[src*2+1] * intVolume; } } } } - else if (s_channels == 1 && width == 2) + else if (channels == 1 && width == 2) { if (bFirstOrOnlyUpdateThisFrame) { @@ -2144,6 +2161,9 @@ void S_RawSamples( int samples, int rate, int width, int s_channels, const byte break; dst = s_rawend&(MAX_RAW_SAMPLES-1); s_rawend++; + //Don't overflow if resampling. + if (s_rawend > rawEndStart + MAX_RAW_SAMPLES) + break; s_rawsamples[dst].left = ((short *)data)[src] * intVolume; s_rawsamples[dst].right = ((short *)data)[src] * intVolume; } @@ -2157,12 +2177,15 @@ void S_RawSamples( int samples, int rate, int width, int s_channels, const byte break; dst = s_rawend&(MAX_RAW_SAMPLES-1); s_rawend++; + //Don't overflow if resampling. + if (s_rawend > rawEndStart + MAX_RAW_SAMPLES) + break; s_rawsamples[dst].left += ((short *)data)[src] * intVolume; s_rawsamples[dst].right += ((short *)data)[src] * intVolume; } } } - else if (s_channels == 2 && width == 1) + else if (channels == 2 && width == 1) { intVolume *= 256; @@ -2175,6 +2198,9 @@ void S_RawSamples( int samples, int rate, int width, int s_channels, const byte break; dst = s_rawend&(MAX_RAW_SAMPLES-1); s_rawend++; + //Don't overflow if resampling. + if (s_rawend > rawEndStart + MAX_RAW_SAMPLES) + break; s_rawsamples[dst].left = ((char *)data)[src*2] * intVolume; s_rawsamples[dst].right = ((char *)data)[src*2+1] * intVolume; } @@ -2188,12 +2214,15 @@ void S_RawSamples( int samples, int rate, int width, int s_channels, const byte break; dst = s_rawend&(MAX_RAW_SAMPLES-1); s_rawend++; + //Don't overflow if resampling. + if (s_rawend > rawEndStart + MAX_RAW_SAMPLES) + break; s_rawsamples[dst].left += ((char *)data)[src*2] * intVolume; s_rawsamples[dst].right += ((char *)data)[src*2+1] * intVolume; } } } - else if (s_channels == 1 && width == 1) + else if (channels == 1 && width == 1) { intVolume *= 256; @@ -2206,6 +2235,9 @@ void S_RawSamples( int samples, int rate, int width, int s_channels, const byte break; dst = s_rawend&(MAX_RAW_SAMPLES-1); s_rawend++; + //Don't overflow if resampling. + if (s_rawend > rawEndStart + MAX_RAW_SAMPLES) + break; s_rawsamples[dst].left = (((byte *)data)[src]-128) * intVolume; s_rawsamples[dst].right = (((byte *)data)[src]-128) * intVolume; } @@ -2219,6 +2251,9 @@ void S_RawSamples( int samples, int rate, int width, int s_channels, const byte break; dst = s_rawend&(MAX_RAW_SAMPLES-1); s_rawend++; + //Don't overflow if resampling. + if (s_rawend > rawEndStart + MAX_RAW_SAMPLES) + break; s_rawsamples[dst].left += (((byte *)data)[src]-128) * intVolume; s_rawsamples[dst].right += (((byte *)data)[src]-128) * intVolume; } @@ -6038,7 +6073,7 @@ static void UpdateEAXListener() float flSin = (float)sin(-flTheta); float flCos = (float)cos(-flTheta); - for (i = 0; i < min(s_NumFXSlots,s_lNumEnvironments); i++) + for (i = 0; i < Q_min(s_NumFXSlots,s_lNumEnvironments); i++) { if (s_FXSlotInfo[i].lEnvID == s_EnvironmentID) { diff --git a/code/client/snd_local.h b/code/client/snd_local.h index fe8f3fbe7d..5d50b3f77b 100644 --- a/code/client/snd_local.h +++ b/code/client/snd_local.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // snd_local.h -- private sound definations @@ -26,7 +31,7 @@ This file is part of Jedi Academy. #include "snd_public.h" #include "../mp3code/mp3struct.h" -#if defined(_WIN32) && !defined(WIN64) +#if defined(_MSC_VER) && !defined(WIN64) #define USE_OPENAL #endif diff --git a/code/client/snd_mem.cpp b/code/client/snd_mem.cpp index 62d0dffa2b..c8ab479296 100644 --- a/code/client/snd_mem.cpp +++ b/code/client/snd_mem.cpp @@ -1,26 +1,27 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // snd_mem.c: sound caching - - -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" #include "snd_local.h" @@ -314,7 +315,7 @@ int iFilesUpdated; int iErrors; qboolean qbForceRescan; qboolean qbForceStereo; -string strErrors; +std::string strErrors; void R_CheckMP3s( const char *psDir ) { diff --git a/code/client/snd_mix.cpp b/code/client/snd_mix.cpp index facfefc864..91beab195a 100644 --- a/code/client/snd_mix.cpp +++ b/code/client/snd_mix.cpp @@ -1,29 +1,30 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // snd_mix.c -- portable code to mix sounds for snd_dma.c -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - - #include "snd_local.h" portable_samplepair_t paintbuffer[PAINTBUFFER_SIZE]; diff --git a/code/client/snd_music.cpp b/code/client/snd_music.cpp index 85bf73d511..db6cda5a4e 100644 --- a/code/client/snd_music.cpp +++ b/code/client/snd_music.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- snd_music.cpp // @@ -25,9 +29,7 @@ This file is part of Jedi Academy. #include "../qcommon/sstring.h" #include -#ifndef _WIN32 #include -#endif #include "snd_local.h" #include "cl_mp3.h" @@ -81,9 +83,9 @@ struct MusicExitTime_t // need to declare this way for operator < below // it's possible for all 3 of these to be empty if it's boss or death music // -typedef vector MusicExitPoints_t; -typedef vector MusicExitTimes_t; -typedef map MusicEntryTimes_t; // key eg "marker1" +typedef std::vector MusicExitPoints_t; +typedef std::vector MusicExitTimes_t; +typedef std::map MusicEntryTimes_t; // key eg "marker1" typedef struct { @@ -94,7 +96,7 @@ typedef struct } MusicFile_t; -typedef map MusicData_t; // string is "explore", "action", "boss" etc +typedef std::map MusicData_t; // string is "explore", "action", "boss" etc MusicData_t* MusicData = NULL; // there are now 2 of these, because of the new "uses" keyword... // @@ -347,7 +349,7 @@ static qboolean Music_ParseMusic(CGenericParser2 &Parser, MusicData_t *MusicData // static char *StripTrailingWhiteSpaceOnEveryLine(char *pText) { - string strNewText; + std::string strNewText; while (*pText) { @@ -939,7 +941,7 @@ qboolean Music_AllowedToTransition( float fPlayingTimeElapsed, // since a MusicExitTimes_t item is a sorted array, we can use the equal_range algorithm... // - pair itp = equal_range( pMusicFile->MusicExitTimes.begin(), pMusicFile->MusicExitTimes.end(), T); + std::pair itp = equal_range( pMusicFile->MusicExitTimes.begin(), pMusicFile->MusicExitTimes.end(), T); if (itp.first != pMusicFile->MusicExitTimes.begin()) itp.first--; // encompass the one before, in case we've just missed an exit point by < fTimeEpsilon if (itp.second!= pMusicFile->MusicExitTimes.end()) diff --git a/code/client/snd_music.h b/code/client/snd_music.h index 30d0c32569..190875cb59 100644 --- a/code/client/snd_music.h +++ b/code/client/snd_music.h @@ -1,27 +1,29 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- snd_music.h // // - - #ifndef SND_MUSIC_H #define SND_MUSIC_H diff --git a/code/client/snd_public.h b/code/client/snd_public.h index 8d50812029..82b4d43656 100644 --- a/code/client/snd_public.h +++ b/code/client/snd_public.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef _SND_PUBLIC_H #define _SND_PUBLIC_H @@ -37,7 +42,7 @@ float S_GetSampleLengthInMilliSeconds( sfxHandle_t sfxHandle); // cinematics and voice-over-network will send raw samples // 1.0 volume will be direct output of source samples -void S_RawSamples( int samples, int rate, int width, int s_channels, const byte *data, float volume, qboolean bFirstOrOnlyUpdateThisFrame ); +void S_RawSamples( int samples, int rate, int width, int channels, const byte *data, float volume, qboolean bFirstOrOnlyUpdateThisFrame ); // stop all sounds void S_StopSounds(void); // from snd_dma.cpp // stop all sounds and the background track diff --git a/code/client/vmachine.cpp b/code/client/vmachine.cpp index 01f58cd727..3c87d5f802 100644 --- a/code/client/vmachine.cpp +++ b/code/client/vmachine.cpp @@ -1,27 +1,30 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // vmachine.cpp -- wrapper to fake virtual machine for client #include "vmachine.h" -#ifdef _MSC_VER -#pragma warning (disable : 4514) -#endif + /* ============================================================== @@ -31,97 +34,50 @@ VIRTUAL MACHINE */ intptr_t VM_Call( int callnum, ... ) { -// assert (cgvm.entryPoint); - //Getting crashes here on OSX with debug dlls. -#if !id386 || defined(MACOS_X) - intptr_t args[10]; + intptr_t args[10] = { 0 }; va_list ap; - if (cgvm.entryPoint) - { - va_start(ap, callnum); - for (size_t i = 0; i < ARRAY_LEN(args); i++) { - args[i] = va_arg(ap, intptr_t); - } + + if ( cgvm.entryPoint ) { + va_start( ap, callnum ); + for ( size_t i = 0; i < ARRAY_LEN( args ); i++ ) + args[i] = va_arg( ap, intptr_t ); va_end(ap); - return cgvm.entryPoint( callnum, args[0], args[1], args[2], args[3], - args[4], args[5], args[6], args[7], - args[8], args[9]); - } -#else - if (cgvm.entryPoint) - { - return cgvm.entryPoint( (&callnum)[0], (&callnum)[1], (&callnum)[2], (&callnum)[3], - (&callnum)[4], (&callnum)[5], (&callnum)[6], (&callnum)[7], - (&callnum)[8], (&callnum)[9] ); + return cgvm.entryPoint( callnum, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], + args[8], args[9]); } - -#endif return -1; } -/* -============ -VM_DllSyscall - -we pass this to the cgame dll to call back into the client -============ -*/ -/* from MP - ============ - VM_DllSyscall - - Dlls will call this directly - - rcg010206 The horror; the horror. - - The syscall mechanism relies on stack manipulation to get it's args. - This is likely due to C's inability to pass "..." parameters to - a function in one clean chunk. On PowerPC Linux, these parameters - are not necessarily passed on the stack, so while (&arg[0] == arg) - is true, (&arg[1] == 2nd function parameter) is not necessarily - accurate, as arg's value might have been stored to the stack or - other piece of scratch memory to give it a valid address, but the - next parameter might still be sitting in a register. - - Quake's syscall system also assumes that the stack grows downward, - and that any needed types can be squeezed, safely, into a signed int. - - This hack below copies all needed values for an argument to a - array in memory, so that Quake can get the correct values. This can - also be used on systems where the stack grows upwards, as the - presumably standard and safe stdargs.h macros are used. - - As for having enough space in a signed int for your datatypes, well, - it might be better to wait for DOOM 3 before you start porting. :) - - The original code, while probably still inherently dangerous, seems - to work well enough for the platforms it already works on. Rather - than add the performance hit for those platforms, the original code - is still in use there. - - For speed, we just grab 15 arguments, and don't worry about exactly - how many the syscall actually needs; the extra is thrown away. - - ============ - */ - +// The syscall mechanism relies on stack manipulation to get it's args. +// This is likely due to C's inability to pass "..." parameters to a function in one clean chunk. +// On PowerPC Linux, these parameters are not necessarily passed on the stack, so while (&arg[0] == arg) is true, +// (&arg[1] == 2nd function parameter) is not necessarily accurate, as arg's value might have been stored to the stack +// or other piece of scratch memory to give it a valid address, but the next parameter might still be sitting in a +// register. +// QVM's syscall system also assumes that the stack grows downward, and that any needed types can be squeezed, safely, +// into a signed int. +// This hack below copies all needed values for an argument to an array in memory, so that QVM can get the correct values. +// This can also be used on systems where the stack grows upwards, as the presumably standard and safe stdargs.h macros +// are used. +// The original code, while probably still inherently dangerous, seems to work well enough for the platforms it already +// works on. Rather than add the performance hit for those platforms, the original code is still in use there. +// For speed, we just grab 9 arguments, and don't worry about exactly how many the syscall actually needs; the extra is +// thrown away. extern intptr_t CL_CgameSystemCalls( intptr_t *args ); intptr_t VM_DllSyscall( intptr_t arg, ... ) { -// return cgvm->systemCall( &arg ); #if !id386 || defined __clang__ || defined MACOS_X // rcg010206 - see commentary above intptr_t args[16]; - size_t i; va_list ap; args[0] = arg; - va_start(ap, arg); - for (i = 1; i < sizeof (args) / sizeof (args[i]); i++) - args[i] = va_arg(ap, intptr_t); - va_end(ap); + va_start( ap, arg ); + for (size_t i = 1; i < ARRAY_LEN (args); i++) + args[i] = va_arg( ap, intptr_t ); + va_end( ap ); return CL_CgameSystemCalls( args ); #else // original id code diff --git a/code/client/vmachine.h b/code/client/vmachine.h index 45851bd245..8102d75db5 100644 --- a/code/client/vmachine.h +++ b/code/client/vmachine.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // vmachine.h -- virtual machine header for client #ifndef __VMACHINE_H__ @@ -65,46 +70,14 @@ VIRTUAL MACHINE ============================================================== */ -struct vm_s { +typedef struct vm_s { intptr_t (*entryPoint)( int callNum, ... ); -}; - -typedef struct vm_s vm_t; +} vm_t; -extern vm_t cgvm; // interface to cgame dll or vm +extern vm_t cgvm; -extern intptr_t VM_Call( int callnum, ... ); -extern intptr_t VM_DllSyscall( intptr_t arg, ... ); -extern void CL_ShutdownCGame(void); - -/* -================ -VM_Create - -it will attempt to load as a system dll -================ -*/ -extern void *Sys_LoadCgame( intptr_t (**entryPoint)(int, ...), intptr_t (*systemcalls)(intptr_t, ...) ); - -inline void *VM_Create( const char *module) -{ - void *res; - // try to load as a system dll - if (!Q_stricmp("cl", module)) - { - res = Sys_LoadCgame( &cgvm.entryPoint, VM_DllSyscall ); - if ( !res) - { - //Com_Printf( "Failed.\n" ); - return 0; - } - } - else - { - res = 0; - } - - return res; -} +intptr_t VM_Call( int callnum, ... ); +intptr_t VM_DllSyscall( intptr_t arg, ... ); +void CL_ShutdownCGame( void ); #endif //__VMACHINE_H__ diff --git a/code/game/AI_Animal.cpp b/code/game/AI_Animal.cpp index 389c6f5bb5..f5fa149f77 100644 --- a/code/game/AI_Animal.cpp +++ b/code/game/AI_Animal.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "b_local.h" #include "g_navigator.h" diff --git a/code/game/AI_AssassinDroid.cpp b/code/game/AI_AssassinDroid.cpp index 069690e0f2..72d4af244a 100644 --- a/code/game/AI_AssassinDroid.cpp +++ b/code/game/AI_AssassinDroid.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "bg_public.h" #include "b_local.h" diff --git a/code/game/AI_Atst.cpp b/code/game/AI_Atst.cpp index d3efc935f6..50b49fa9f5 100644 --- a/code/game/AI_Atst.cpp +++ b/code/game/AI_Atst.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "b_local.h" #include "g_functions.h" diff --git a/code/game/AI_BobaFett.cpp b/code/game/AI_BobaFett.cpp index a274a438f8..72a95f6102 100644 --- a/code/game/AI_BobaFett.cpp +++ b/code/game/AI_BobaFett.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //////////////////////////////////////////////////////////////////////////////////////// // RAVEN SOFTWARE - STAR WARS: JK II diff --git a/code/game/AI_Civilian.cpp b/code/game/AI_Civilian.cpp index c09b128369..81eb42d276 100644 --- a/code/game/AI_Civilian.cpp +++ b/code/game/AI_Civilian.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "../cgame/cg_local.h" #include "b_local.h" diff --git a/code/game/AI_Default.cpp b/code/game/AI_Default.cpp index 821141f489..be1410c488 100644 --- a/code/game/AI_Default.cpp +++ b/code/game/AI_Default.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "../cgame/cg_local.h" #include "b_local.h" diff --git a/code/game/AI_Droid.cpp b/code/game/AI_Droid.cpp index d5e6757908..d49b816e32 100644 --- a/code/game/AI_Droid.cpp +++ b/code/game/AI_Droid.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "b_local.h" #include "g_functions.h" diff --git a/code/game/AI_GalakMech.cpp b/code/game/AI_GalakMech.cpp index c150d681b0..2730ab0d9b 100644 --- a/code/game/AI_GalakMech.cpp +++ b/code/game/AI_GalakMech.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //////////////////////////////////////////////////////////////////////////////////////// // RAVEN SOFTWARE - STAR WARS: JK III diff --git a/code/game/AI_Grenadier.cpp b/code/game/AI_Grenadier.cpp index 5fc2d52625..988946f8c3 100644 --- a/code/game/AI_Grenadier.cpp +++ b/code/game/AI_Grenadier.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "b_local.h" #include "g_nav.h" diff --git a/code/game/AI_HazardTrooper.cpp b/code/game/AI_HazardTrooper.cpp index 0b2bec6f62..6e5fdb0afb 100644 --- a/code/game/AI_HazardTrooper.cpp +++ b/code/game/AI_HazardTrooper.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //////////////////////////////////////////////////////////////////////////////////////// // RAVEN SOFTWARE - STAR WARS: JK II diff --git a/code/game/AI_Howler.cpp b/code/game/AI_Howler.cpp index d720a9e031..9f10dda137 100644 --- a/code/game/AI_Howler.cpp +++ b/code/game/AI_Howler.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "b_local.h" #include "../cgame/cg_camera.h" diff --git a/code/game/AI_ImperialProbe.cpp b/code/game/AI_ImperialProbe.cpp index aef588996c..32a8ec453a 100644 --- a/code/game/AI_ImperialProbe.cpp +++ b/code/game/AI_ImperialProbe.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "b_local.h" #include "g_nav.h" diff --git a/code/game/AI_Interrogator.cpp b/code/game/AI_Interrogator.cpp index 959f6fafeb..6ad508dbc8 100644 --- a/code/game/AI_Interrogator.cpp +++ b/code/game/AI_Interrogator.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + #include "b_local.h" #include "g_nav.h" @@ -86,18 +91,18 @@ void Interrogator_PartsMove(void) if ((NPC->pos1[1] < 60) || (NPC->pos1[1] > 300)) { - NPC->pos1[1]+=Q_irand( -20, 20 ); // Pitch + NPC->pos1[1]+=Q_irand( -20, 20 ); // Pitch } else if (NPC->pos1[1] > 180) { - NPC->pos1[1]=Q_irand( 300, 360 ); // Pitch + NPC->pos1[1]=Q_irand( 300, 360 ); // Pitch } - else + else { - NPC->pos1[1]=Q_irand( 0, 60 ); // Pitch + NPC->pos1[1]=Q_irand( 0, 60 ); // Pitch } - gi.G2API_SetBoneAnglesIndex( &NPC->ghoul2[NPC->playerModel], NPC->genericBone1, NPC->pos1, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &NPC->ghoul2[NPC->playerModel], NPC->genericBone1, NPC->pos1, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); TIMER_Set( NPC, "syringeDelay", Q_irand( 100, 1000 ) ); } @@ -126,13 +131,13 @@ void Interrogator_PartsMove(void) } NPC->pos2[0] = AngleNormalize360( NPC->pos2[0]); - gi.G2API_SetBoneAnglesIndex( &NPC->ghoul2[NPC->playerModel], NPC->genericBone2, NPC->pos2, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &NPC->ghoul2[NPC->playerModel], NPC->genericBone2, NPC->pos2, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } // Claw NPC->pos3[1] += Q_irand( 10, 30 ); NPC->pos3[1] = AngleNormalize360( NPC->pos3[1]); - gi.G2API_SetBoneAnglesIndex( &NPC->ghoul2[NPC->playerModel], NPC->genericBone3, NPC->pos3, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &NPC->ghoul2[NPC->playerModel], NPC->genericBone3, NPC->pos3, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } @@ -145,7 +150,7 @@ Interrogator_MaintainHeight ------------------------- */ void Interrogator_MaintainHeight( void ) -{ +{ float dif; // vec3_t endPos; // trace_t trace; @@ -158,7 +163,7 @@ void Interrogator_MaintainHeight( void ) if ( NPC->enemy ) { // Find the height difference - dif = (NPC->enemy->currentOrigin[2] + NPC->enemy->maxs[2]) - NPC->currentOrigin[2]; + dif = (NPC->enemy->currentOrigin[2] + NPC->enemy->maxs[2]) - NPC->currentOrigin[2]; // cap to prevent dramatic height shifts if ( fabs( dif ) > 2 ) @@ -270,7 +275,7 @@ void Interrogator_Strafe( void ) if ( NPC->enemy ) { // Find the height difference - dif = (NPC->enemy->currentOrigin[2] + 32) - NPC->currentOrigin[2]; + dif = (NPC->enemy->currentOrigin[2] + 32) - NPC->currentOrigin[2]; // cap to prevent dramatic height shifts if ( fabs( dif ) > 8 ) @@ -282,7 +287,7 @@ void Interrogator_Strafe( void ) } - // Set the strafe start time + // Set the strafe start time NPC->fx_time = level.time; NPCInfo->standTime = level.time + 3000 + random() * 500; } @@ -299,8 +304,8 @@ Interrogator_Hunt void Interrogator_Hunt( qboolean visible, qboolean advance ) { - float distance, speed; - vec3_t forward; + float speed; + vec3_t forward; Interrogator_PartsMove(); @@ -338,7 +343,7 @@ void Interrogator_Hunt( qboolean visible, qboolean advance ) else { VectorSubtract( NPC->enemy->currentOrigin, NPC->currentOrigin, forward ); - distance = VectorNormalize( forward ); + VectorNormalize( forward ); } speed = HUNTER_FORWARD_BASE_SPEED + HUNTER_FORWARD_MULTIPLIER * g_spskill->integer; @@ -408,7 +413,7 @@ void Interrogator_Attack( void ) } // Rate our distance to the target, and our visibilty - float distance = (int) DistanceHorizontalSquared( NPC->currentOrigin, NPC->enemy->currentOrigin ); + float distance = (int) DistanceHorizontalSquared( NPC->currentOrigin, NPC->enemy->currentOrigin ); qboolean visible = NPC_ClearLOS( NPC->enemy ); qboolean advance = (qboolean)(distance > MIN_DISTANCE*MIN_DISTANCE ); diff --git a/code/game/AI_Jedi.cpp b/code/game/AI_Jedi.cpp index 6fb2438945..d4ba7e2dc0 100644 --- a/code/game/AI_Jedi.cpp +++ b/code/game/AI_Jedi.cpp @@ -4368,7 +4368,7 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en if ( !Q_irand( 0, 5 ) || !Jedi_Strafe( 300, 1000, 0, 1000, qfalse ) ) {//certain chance they will pick an alternative evasion //if couldn't strafe, try a different kind of evasion... - if ( Jedi_DecideKick() && G_CanKickEntity(NPC, NPC->enemy ) && G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE && enemy_dist <= 16 ) + if ( Jedi_DecideKick() && G_CanKickEntity(NPC, NPC->enemy ) && G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE ) {//kicked! TIMER_Set( NPC, "kickDebounce", Q_irand( 3000, 10000 ) ); } @@ -5806,7 +5806,6 @@ static void Jedi_Combat( void ) { vec3_t enemy_dir, enemy_movedir, enemy_dest; float enemy_dist, enemy_movespeed; - qboolean enemy_lost = qfalse; trace_t trace; //See where enemy will be 300 ms from now @@ -5911,7 +5910,6 @@ static void Jedi_Combat( void ) } }*/ - enemy_lost = qtrue; } } } @@ -6567,8 +6565,8 @@ qboolean Jedi_CheckKataAttack( void ) if ( enemy_in_striking_range ) //need to actually be close to the enemy { ucmd.upmove = 0; - VectorClear(NPC->client->ps.moveDir); - if (g_saberNewControlScheme->integer) + VectorClear( NPC->client->ps.moveDir ); + if ( g_saberNewControlScheme->integer ) { ucmd.buttons |= BUTTON_FORCE_FOCUS; } diff --git a/code/game/AI_Mark1.cpp b/code/game/AI_Mark1.cpp index d8445bb1f0..ec3636cdbb 100644 --- a/code/game/AI_Mark1.cpp +++ b/code/game/AI_Mark1.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "b_local.h" #include "g_nav.h" diff --git a/code/game/AI_Mark2.cpp b/code/game/AI_Mark2.cpp index 200d5fb674..5f04a6c636 100644 --- a/code/game/AI_Mark2.cpp +++ b/code/game/AI_Mark2.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "../cgame/cg_local.h" #include "g_functions.h" diff --git a/code/game/AI_MineMonster.cpp b/code/game/AI_MineMonster.cpp index 2f553df83f..4fe9ec6e4d 100644 --- a/code/game/AI_MineMonster.cpp +++ b/code/game/AI_MineMonster.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "b_local.h" #include "../cgame/cg_local.h" diff --git a/code/game/AI_Rancor.cpp b/code/game/AI_Rancor.cpp index 6e886a011a..4a3a7a91a9 100644 --- a/code/game/AI_Rancor.cpp +++ b/code/game/AI_Rancor.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "b_local.h" #include "../cgame/cg_local.h" diff --git a/code/game/AI_Remote.cpp b/code/game/AI_Remote.cpp index 6aadf73a46..1e2ae228cb 100644 --- a/code/game/AI_Remote.cpp +++ b/code/game/AI_Remote.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "b_local.h" #include "g_nav.h" diff --git a/code/game/AI_RocketTrooper.cpp b/code/game/AI_RocketTrooper.cpp index f5d13f8b38..701e3197cc 100644 --- a/code/game/AI_RocketTrooper.cpp +++ b/code/game/AI_RocketTrooper.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "b_local.h" extern qboolean PM_FlippingAnim( int anim ); diff --git a/code/game/AI_SaberDroid.cpp b/code/game/AI_SaberDroid.cpp index 5034b3ab2a..3230643584 100644 --- a/code/game/AI_SaberDroid.cpp +++ b/code/game/AI_SaberDroid.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "b_local.h" #include "g_nav.h" diff --git a/code/game/AI_SandCreature.cpp b/code/game/AI_SandCreature.cpp index 52588c5f26..1a059cee46 100644 --- a/code/game/AI_SandCreature.cpp +++ b/code/game/AI_SandCreature.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + #include "b_local.h" #include "../cgame/cg_camera.h" #include "../cgame/cg_local.h" diff --git a/code/game/AI_Seeker.cpp b/code/game/AI_Seeker.cpp index a913ec03a4..c5b5b2a0a0 100644 --- a/code/game/AI_Seeker.cpp +++ b/code/game/AI_Seeker.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + #include "b_local.h" #include "g_nav.h" #include "../cgame/cg_local.h" diff --git a/code/game/AI_Sentry.cpp b/code/game/AI_Sentry.cpp index ec7ae3c404..d75c5a9263 100644 --- a/code/game/AI_Sentry.cpp +++ b/code/game/AI_Sentry.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "b_local.h" #include "g_nav.h" diff --git a/code/game/AI_Sniper.cpp b/code/game/AI_Sniper.cpp index 7a7bb9e014..8de90a145d 100644 --- a/code/game/AI_Sniper.cpp +++ b/code/game/AI_Sniper.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "b_local.h" #include "g_nav.h" diff --git a/code/game/AI_Stormtrooper.cpp b/code/game/AI_Stormtrooper.cpp index 403c67b775..9429815671 100644 --- a/code/game/AI_Stormtrooper.cpp +++ b/code/game/AI_Stormtrooper.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + #include "b_local.h" #include "g_nav.h" #include "anims.h" diff --git a/code/game/AI_Tusken.cpp b/code/game/AI_Tusken.cpp index 67b9a2dabe..113b7bb3a0 100644 --- a/code/game/AI_Tusken.cpp +++ b/code/game/AI_Tusken.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "b_local.h" #include "g_nav.h" diff --git a/code/game/AI_Utils.cpp b/code/game/AI_Utils.cpp index aab8d8e11e..d7cb2c59eb 100644 --- a/code/game/AI_Utils.cpp +++ b/code/game/AI_Utils.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // These utilities are meant for strictly non-player, non-team NPCs. // These functions are in their own file because they are only intended diff --git a/code/game/AI_Wampa.cpp b/code/game/AI_Wampa.cpp index 6b1a21aa83..a5e5a611cc 100644 --- a/code/game/AI_Wampa.cpp +++ b/code/game/AI_Wampa.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + #include "b_local.h" #include "g_navigator.h" diff --git a/code/game/AnimalNPC.cpp b/code/game/AnimalNPC.cpp index 1f7d63d2a4..6b6aa54931 100644 --- a/code/game/AnimalNPC.cpp +++ b/code/game/AnimalNPC.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //seems to be a compiler bug, it doesn't clean out the #ifdefs between dif-compiles //or something, so the headers spew errors on these defs from the previous compile. @@ -190,7 +194,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) /************************************************************************************/ //Client sets ucmds and such for speed alterations - float speedInc, speedIdleDec, speedIdle, speedIdleAccel, speedMin, speedMax; + float speedInc, speedIdleDec, speedIdle, /*speedIdleAccel, */speedMin, speedMax; float fWalkSpeedMax; int curTime; bgEntity_t *parent = pVeh->m_pParentEntity; @@ -225,7 +229,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) speedMax = pVeh->m_pVehicleInfo->speedMax; speedIdle = pVeh->m_pVehicleInfo->speedIdle; - speedIdleAccel = pVeh->m_pVehicleInfo->accelIdle * pVeh->m_fTimeModifier; + //speedIdleAccel = pVeh->m_pVehicleInfo->accelIdle * pVeh->m_fTimeModifier; speedMin = pVeh->m_pVehicleInfo->speedMin; @@ -273,7 +277,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) if ( parentPS->speed || parentPS->groundEntityNum == ENTITYNUM_NONE || pVeh->m_ucmd.forwardmove || pVeh->m_ucmd.upmove > 0 ) - { + { if ( pVeh->m_ucmd.forwardmove > 0 && speedInc ) { parentPS->speed += speedInc; @@ -320,7 +324,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) //pVeh->m_ucmd.rightmove = 0; - /*if ( !pVeh->m_pVehicleInfo->strafePerc + /*if ( !pVeh->m_pVehicleInfo->strafePerc || (!g_speederControlScheme->value && !parent->s.number) ) {//if in a strafe-capable vehicle, clear strafing unless using alternate control scheme pVeh->m_ucmd.rightmove = 0; @@ -359,8 +363,8 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) /* BEGIN Here is where make sure the vehicle is properly oriented. BEGIN */ /********************************************************************************/ bgEntity_t *parent = pVeh->m_pParentEntity; - playerState_t *parentPS, *riderPS; - + playerState_t /**parentPS, */*riderPS; + #ifdef _JK2MP bgEntity_t *rider = NULL; if (parent->s.owner != ENTITYNUM_NONE) @@ -394,7 +398,7 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) parentPS = parent->playerState; riderPS = rider->playerState; #else - parentPS = &parent->client->ps; + //parentPS = &parent->client->ps; riderPS = &rider->client->ps; #endif @@ -437,7 +441,7 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) else { float turnSpeed = pVeh->m_pVehicleInfo->turningSpeed; - if ( !pVeh->m_pVehicleInfo->turnWhenStopped + if ( !pVeh->m_pVehicleInfo->turnWhenStopped && !parentPS->speed )//FIXME: or !pVeh->m_ucmd.forwardmove? {//can't turn when not moving //FIXME: or ramp up to max turnSpeed? @@ -597,29 +601,29 @@ static void AnimalTailSwipe(Vehicle_t* pVeh, gentity_t *parent, gentity_t *pilot */ static void AnimateVehicle( Vehicle_t *pVeh ) { - animNumber_t Anim = BOTH_VT_IDLE; + animNumber_t Anim = BOTH_VT_IDLE; int iFlags = SETANIM_FLAG_NORMAL, iBlend = 300; gentity_t * pilot = (gentity_t *)pVeh->m_pPilot; gentity_t * parent = (gentity_t *)pVeh->m_pParentEntity; - playerState_t * pilotPS; - playerState_t * parentPS; + //playerState_t * pilotPS; + //playerState_t * parentPS; float fSpeedPercToMax; #ifdef _JK2MP pilotPS = (pilot)?(pilot->playerState):(0); parentPS = parent->playerState; #else - pilotPS = (pilot)?(&pilot->client->ps):(0); - parentPS = &parent->client->ps; + //pilotPS = (pilot)?(&pilot->client->ps):(0); + //parentPS = &parent->client->ps; #endif // We're dead (boarding is reused here so I don't have to make another variable :-). - if ( parent->health <= 0 ) + if ( parent->health <= 0 ) { if ( pVeh->m_iBoarding != -999 ) // Animate the death just once! { pVeh->m_iBoarding = -999; - iFlags = SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD; + iFlags = SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD; // FIXME! Why do you keep repeating over and over!!?!?!? Bastard! //Vehicle_SetAnim( parent, SETANIM_LEGS, BOTH_VT_DEATH1, iFlags, iBlend ); @@ -700,7 +704,7 @@ static void AnimateVehicle( Vehicle_t *pVeh ) // Percentage of maximum speed relative to current speed. //float fSpeed = VectorLength( client->ps.velocity ); - fSpeedPercToMax = parent->client->ps.speed / pVeh->m_pVehicleInfo->speedMax; + fSpeedPercToMax = parent->client->ps.speed / pVeh->m_pVehicleInfo->speedMax; // Going in reverse... @@ -746,15 +750,15 @@ static void AnimateRiders( Vehicle_t *pVeh ) gentity_t *pilot = (gentity_t *)pVeh->m_pPilot; gentity_t *parent = (gentity_t *)pVeh->m_pParentEntity; playerState_t *pilotPS; - playerState_t *parentPS; + //playerState_t *parentPS; float fSpeedPercToMax; #ifdef _JK2MP pilotPS = pVeh->m_pPilot->playerState; - parentPS = pVeh->m_pPilot->playerState; + //parentPS = pVeh->m_pPilot->playerState; #else pilotPS = &pVeh->m_pPilot->client->ps; - parentPS = &pVeh->m_pParentEntity->client->ps; + //parentPS = &pVeh->m_pParentEntity->client->ps; #endif // Boarding animation. @@ -808,7 +812,7 @@ static void AnimateRiders( Vehicle_t *pVeh ) // Put Away Saber When It Is Not Active //-------------------------------------- #ifndef _JK2MP - if (HasWeapon && + if (HasWeapon && (pVeh->m_pPilot->s.number>=MAX_CLIENTS || (cg.weaponSelectTime+500)weapon==WP_SABER && (Turbo || !pilotPS->SaberActive()))) { @@ -829,7 +833,7 @@ static void AnimateRiders( Vehicle_t *pVeh ) { return; } -#else +#else if (pilotPS->torsoAnim>=BOTH_VT_ATL_S && pilotPS->torsoAnim<=BOTH_VT_ATF_G) { float bodyCurrent = 0.0f; @@ -862,7 +866,7 @@ static void AnimateRiders( Vehicle_t *pVeh ) } WeaponPose = (pVeh->m_ulFlags&VEH_SABERINLEFTHAND)?(WPOSE_SABERLEFT):(WPOSE_SABERRIGHT); } - + if (Attacking && WeaponPose) {// Attack! @@ -883,12 +887,12 @@ static void AnimateRiders( Vehicle_t *pVeh ) if (pVeh->m_pPilot->enemy) { vec3_t toEnemy; - float toEnemyDistance; + //float toEnemyDistance; vec3_t actorRight; float actorRightDot; VectorSubtract(pVeh->m_pPilot->currentOrigin, pVeh->m_pPilot->enemy->currentOrigin, toEnemy); - toEnemyDistance = VectorNormalize(toEnemy); + /*toEnemyDistance = */VectorNormalize(toEnemy); AngleVectors(pVeh->m_pParentEntity->currentAngles, 0, actorRight, 0); actorRightDot = DotProduct(toEnemy, actorRight); diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 7872d1c6d3..5ac3816c1c 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -1,4 +1,20 @@ -cmake_minimum_required(VERSION 2.8.8) +#============================================================================ +# Copyright (C) 2013 - 2015, OpenJK contributors +# +# This file is part of the OpenJK source code. +# +# OpenJK is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +#============================================================================ # Make sure the user is not executing this script directly if(NOT InOpenJK) @@ -6,7 +22,12 @@ if(NOT InOpenJK) endif(NOT InOpenJK) set(SPGameDefines ${SharedDefines}) -set(SPGameIncludeDirectories "${SPDir}/game") +set(SPGameIncludeDirectories + ${SharedDir} + ${SPDir} + "${SPDir}/game" + ) + if(WIN32) set(SPGameLibraries "winmm") endif(WIN32) @@ -157,6 +178,7 @@ set(SPGameGameFiles "${SPDir}/game/surfaceflags.h" "${SPDir}/game/teams.h" "${SPDir}/game/weapons.h" + "${SPDir}/game/w_local.h" "${SPDir}/game/wp_saber.h" "${SPDir}/game/g_vehicles.h" ) @@ -338,20 +360,30 @@ endif(WIN32) add_library(${SPGame} SHARED ${SPGameFiles}) -if(NOT WIN32) +if(NOT MSVC) # remove "lib" prefix for .so/.dylib files set_target_properties(${SPGame} PROPERTIES PREFIX "") -endif(NOT WIN32) +endif() if(WIN32) - install(TARGETS ${SPGame} RUNTIME DESTINATION "OpenJK") + install(TARGETS ${SPGame} + RUNTIME + DESTINATION "${JKAInstallDir}/OpenJK" + COMPONENT ${JKASPClientComponent}) else(WIN32) if(MakeApplicationBundles AND BuildSPEngine) - install(TARGETS ${SPGame} LIBRARY DESTINATION "${SPEngine}.app/Contents/MacOS/OpenJK") - else(MakeApplicationBundles AND BuildSPEngine) - install(TARGETS ${SPGame} LIBRARY DESTINATION "OpenJK") - endif(MakeApplicationBundles AND BuildSPEngine) -endif(WIN32) + install(TARGETS ${SPGame} + LIBRARY + DESTINATION "${JKAInstallDir}/${SPEngine}.app/Contents/MacOS/OpenJK" + COMPONENT ${JKASPClientComponent}) + else() + install(TARGETS ${SPGame} + LIBRARY + DESTINATION "${JKAInstallDir}/OpenJK" + COMPONENT ${JKASPClientComponent}) + endif() +endif() + set_target_properties(${SPGame} PROPERTIES COMPILE_DEFINITIONS_RELWITHDEBINFO "${SPGameDefines};${ReleaseDefines}") set_target_properties(${SPGame} PROPERTIES COMPILE_DEFINITIONS_MINSIZEREL "${SPGameDefines};${ReleaseDefines}") set_target_properties(${SPGame} PROPERTIES COMPILE_DEFINITIONS_RELEASE "${SPGameDefines};${ReleaseDefines}") diff --git a/code/game/FighterNPC.cpp b/code/game/FighterNPC.cpp index ac5ce677f5..9345e40717 100644 --- a/code/game/FighterNPC.cpp +++ b/code/game/FighterNPC.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //seems to be a compiler bug, it doesn't clean out the #ifdefs between dif-compiles //or something, so the headers spew errors on these defs from the previous compile. @@ -114,7 +118,7 @@ bool BG_FighterUpdate(Vehicle_t *pVeh, const usercmd_t *pUcmd, vec3_t trMins, ve { vec3_t bottom; playerState_t *parentPS; - qboolean isDead = qfalse; + //qboolean isDead = qfalse; #ifdef QAGAME //don't do this on client // Make sure the riders are not visible or collidable. pVeh->m_pVehicleInfo->Ghost( pVeh, pVeh->m_pPilot ); @@ -158,13 +162,13 @@ bool BG_FighterUpdate(Vehicle_t *pVeh, const usercmd_t *pUcmd, vec3_t trMins, ve } #ifdef _JK2MP - isDead = (qboolean)((parentPS->eFlags&EF_DEAD)!=0); + //isDead = (qboolean)((parentPS->eFlags&EF_DEAD)!=0); #else - isDead = (parentPS->stats[STAT_HEALTH] <= 0 ); + //isDead = (parentPS->stats[STAT_HEALTH] <= 0 ); #endif /* - if ( isDead || + if ( isDead || (pVeh->m_pVehicleInfo->surfDestruction && pVeh->m_iRemovedSurfaces ) ) {//can't land if dead or spiralling out of control @@ -196,7 +200,7 @@ static bool Update( Vehicle_t *pVeh, const usercmd_t *pUcmd ) { assert(pVeh->m_pParentEntity); if (!BG_FighterUpdate(pVeh, pUcmd, ((gentity_t *)pVeh->m_pParentEntity)->mins, - ((gentity_t *)pVeh->m_pParentEntity)->maxs, + ((gentity_t *)pVeh->m_pParentEntity)->maxs, #ifdef _JK2MP g_gravity.value, #else @@ -234,7 +238,7 @@ static bool Eject( Vehicle_t *pVeh, bgEntity_t *pEnt, qboolean forceEject ) { return true; } - + return false; } @@ -250,7 +254,7 @@ static float PredictedAngularDecrement(float scale, float timeMod, float origina { fixedBaseDec = -fixedBaseDec; } - + fixedBaseDec *= (1.0f+(1.0f-scale)); if (fixedBaseDec < 0.1f) @@ -282,8 +286,8 @@ static float PredictedAngularDecrement(float scale, float timeMod, float origina #ifdef QAGAME//only do this check on GAME side, because if it's CGAME, it's being predicted, and it's only predicted if the local client is the driver qboolean FighterIsInSpace( gentity_t *gParent ) { - if ( gParent - && gParent->client + if ( gParent + && gParent->client && gParent->client->inSpaceIndex && gParent->client->inSpaceIndex < ENTITYNUM_WORLD ) { @@ -421,7 +425,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) //G_EntitySound( ((gentity_t *)(pVeh->m_pParentEntity)), CHAN_LOCAL, pVeh->m_pVehicleInfo->soundHyper ); #elif defined CGAME//MP CGAME-side trap_S_StartSound( NULL, pm->ps->clientNum, CHAN_LOCAL, pVeh->m_pVehicleInfo->soundHyper ); -#endif +#endif } parentPS->speed = HYPERSPACE_SPEED; @@ -453,12 +457,12 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) if ( isLandingOrLaunching//going slow enough to start landing && (pVeh->m_ucmd.forwardmove<=0||pVeh->m_LandTrace.fraction<=FIGHTER_MIN_TAKEOFF_FRACTION) )//not trying to accelerate away already (or: you are trying to, but not high enough off the ground yet) {//FIXME: if start to move forward and fly over something low while still going relatively slow, you may try to land even though you don't mean to... - //float fInvFrac = 1.0f - pVeh->m_LandTrace.fraction; + //float fInvFrac = 1.0f - pVeh->m_LandTrace.fraction; if ( pVeh->m_ucmd.upmove > 0 ) { #ifdef _JK2MP - if ( parentPS->velocity[2] <= 0 + if ( parentPS->velocity[2] <= 0 && pVeh->m_pVehicleInfo->soundTakeOff ) {//taking off for the first time #ifdef QAGAME//MP GAME-side @@ -474,7 +478,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) } else if ( pVeh->m_ucmd.forwardmove < 0 ) { - if ( pVeh->m_LandTrace.fraction != 0.0f ) + if ( pVeh->m_LandTrace.fraction != 0.0f ) { parentPS->velocity[2] -= pVeh->m_pVehicleInfo->acceleration * pVeh->m_fTimeModifier; } @@ -489,7 +493,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) //parentPS->velocity[2] *= pVeh->m_LandTrace.fraction; //it's not an angle, but hey parentPS->velocity[2] = PredictedAngularDecrement(pVeh->m_LandTrace.fraction, pVeh->m_fTimeModifier*5.0f, parentPS->velocity[2]); - + parentPS->speed = 0; } } @@ -531,7 +535,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) G_EntitySound( ((gentity_t *)(pVeh->m_pParentEntity)), CHAN_AUTO, pVeh->m_pVehicleInfo->soundTurbo ); #elif defined CGAME//MP CGAME-side //trap_S_StartSound( NULL, pVeh->m_pParentEntity->s.number, CHAN_AUTO, pVeh->m_pVehicleInfo->soundTurbo ); -#endif +#endif } } } @@ -592,7 +596,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) parentPS->speed = 0; pVeh->m_ucmd.forwardmove = 0; } - else if ( !pVeh->m_pVehicleInfo->Inhabited( pVeh ) + else if ( !pVeh->m_pVehicleInfo->Inhabited( pVeh ) && parentPS->speed > 0 ) {//pilot jumped out while we were moving forward (not landing or landed) so just keep the throttle locked //Why set forwardmove? PMove code doesn't use it... does it? @@ -600,14 +604,14 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) } #endif else if ( ( parentPS->speed || parentPS->groundEntityNum == ENTITYNUM_NONE || - pVeh->m_ucmd.forwardmove || pVeh->m_ucmd.upmove > 0 ) && pVeh->m_LandTrace.fraction >= 0.05f ) + pVeh->m_ucmd.forwardmove || pVeh->m_ucmd.upmove > 0 ) && pVeh->m_LandTrace.fraction >= 0.05f ) { if ( pVeh->m_ucmd.forwardmove > 0 && speedInc ) { parentPS->speed += speedInc; pVeh->m_ucmd.forwardmove = 127; } - else if ( pVeh->m_ucmd.forwardmove < 0 + else if ( pVeh->m_ucmd.forwardmove < 0 || pVeh->m_ucmd.upmove < 0 ) {//decelerating or braking if ( pVeh->m_ucmd.upmove < 0 ) @@ -687,7 +691,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) // If they've launched, apply some constant motion. if ( (pVeh->m_LandTrace.fraction >= 1.0f //no ground || pVeh->m_LandTrace.plane.normal[2] < MIN_LANDING_SLOPE )//or can't land on ground below us - && speedIdle > 0 ) + && speedIdle > 0 ) {//not above ground and have an idle speed //float fSpeed = pVeh->m_pParentEntity->client->ps.speed; if ( parentPS->speed < speedIdle ) @@ -742,7 +746,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) #if 1//This is working now, but there are some transitional jitters... Rich? //STRAFING============================================================================== - if ( pVeh->m_pVehicleInfo->strafePerc + if ( pVeh->m_pVehicleInfo->strafePerc #ifdef QAGAME//only do this check on GAME side, because if it's CGAME, it's being predicted, and it's only predicted if the local client is the driver && pVeh->m_pVehicleInfo->Inhabited( pVeh )//has to have a driver in order to be capable of landing #endif @@ -965,10 +969,10 @@ static void FighterDamageRoutine( Vehicle_t *pVeh, bgEntity_t *parent, playerSta */ if ( !(pVeh->m_pParentEntity->s.number%3) ) {//NOT everyone should do this - pVeh->m_vOrientation[PITCH] += pVeh->m_fTimeModifier; + pVeh->m_vOrientation[PITCH] += pVeh->m_fTimeModifier; if ( !BG_UnrestrainedPitchRoll( riderPS, pVeh ) ) { - if ( pVeh->m_vOrientation[PITCH] > 60.0f ) + if ( pVeh->m_vOrientation[PITCH] > 60.0f ) { pVeh->m_vOrientation[PITCH] = 60.0f; } @@ -976,10 +980,10 @@ static void FighterDamageRoutine( Vehicle_t *pVeh, bgEntity_t *parent, playerSta } else if ( !(pVeh->m_pParentEntity->s.number%2) ) { - pVeh->m_vOrientation[PITCH] -= pVeh->m_fTimeModifier; + pVeh->m_vOrientation[PITCH] -= pVeh->m_fTimeModifier; if ( !BG_UnrestrainedPitchRoll( riderPS, pVeh ) ) { - if ( pVeh->m_vOrientation[PITCH] > -60.0f ) + if ( pVeh->m_vOrientation[PITCH] > -60.0f ) { pVeh->m_vOrientation[PITCH] = -60.0f; } @@ -1001,7 +1005,7 @@ static void FighterDamageRoutine( Vehicle_t *pVeh, bgEntity_t *parent, playerSta //if we get into here we have at least one broken piece pVeh->m_ucmd.upmove = 0; - + //if you're off the ground and not suspended, pitch down //FIXME: not in space! if ( pVeh->m_LandTrace.fraction >= 0.1f ) @@ -1012,10 +1016,10 @@ static void FighterDamageRoutine( Vehicle_t *pVeh, bgEntity_t *parent, playerSta //FIXME: don't bias towards pitching down when in space... if ( !(pVeh->m_pParentEntity->s.number%2) ) {//NOT everyone should do this - pVeh->m_vOrientation[PITCH] += pVeh->m_fTimeModifier; + pVeh->m_vOrientation[PITCH] += pVeh->m_fTimeModifier; if ( !BG_UnrestrainedPitchRoll( riderPS, pVeh ) ) { - if ( pVeh->m_vOrientation[PITCH] > 60.0f ) + if ( pVeh->m_vOrientation[PITCH] > 60.0f ) { pVeh->m_vOrientation[PITCH] = 60.0f; } @@ -1023,10 +1027,10 @@ static void FighterDamageRoutine( Vehicle_t *pVeh, bgEntity_t *parent, playerSta } else if ( !(pVeh->m_pParentEntity->s.number%3) ) { - pVeh->m_vOrientation[PITCH] -= pVeh->m_fTimeModifier; + pVeh->m_vOrientation[PITCH] -= pVeh->m_fTimeModifier; if ( !BG_UnrestrainedPitchRoll( riderPS, pVeh ) ) { - if ( pVeh->m_vOrientation[PITCH] > -60.0f ) + if ( pVeh->m_vOrientation[PITCH] > -60.0f ) { pVeh->m_vOrientation[PITCH] = -60.0f; } @@ -1236,7 +1240,7 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) return; } #endif - + if ( pVeh->m_iDropTime >= curTime ) {//you can only YAW during this parentPS->viewangles[YAW] = pVeh->m_vOrientation[YAW] = riderPS->viewangles[YAW]; @@ -1316,7 +1320,7 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) // If we're landed, we shouldn't be able to do anything but take off. if ( isLandingOrLanded //going slow enough to start landing - && !pVeh->m_iRemovedSurfaces + && !pVeh->m_iRemovedSurfaces && parentPS->electrifyTimespeed > 0.0f ) @@ -1330,7 +1334,7 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) pVeh->m_vOrientation[PITCH] = PredictedAngularDecrement(0.83f, angleTimeMod*10.0f, pVeh->m_vOrientation[PITCH]); } } - if ( pVeh->m_LandTrace.fraction > 0.1f + if ( pVeh->m_LandTrace.fraction > 0.1f || pVeh->m_LandTrace.plane.normal[2] < MIN_LANDING_SLOPE ) {//off the ground, at least (or not on a valid landing surf) // Dampen the turn rate based on the current height. @@ -1345,7 +1349,7 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) && (!(pVeh->m_pParentEntity->s.number%4)||!(pVeh->m_pParentEntity->s.number%5)) ) {//no yaw control } - else if ( pVeh->m_pPilot && pVeh->m_pPilot->s.number < MAX_CLIENTS && parentPS->speed > 0.0f )//&& !( pVeh->m_ucmd.forwardmove > 0 && pVeh->m_LandTrace.fraction != 1.0f ) ) + else if ( pVeh->m_pPilot && pVeh->m_pPilot->s.number < MAX_CLIENTS && parentPS->speed > 0.0f )//&& !( pVeh->m_ucmd.forwardmove > 0 && pVeh->m_LandTrace.fraction != 1.0f ) ) { if ( BG_UnrestrainedPitchRoll( riderPS, pVeh ) ) { @@ -1388,7 +1392,7 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) #endif // If we are not hitting the ground, allow the fighter to pitch up and down. - if ( !FighterOverValidLandingSurface( pVeh ) + if ( !FighterOverValidLandingSurface( pVeh ) || parentPS->speed > MIN_LANDING_SPEED ) //if ( ( pVeh->m_LandTrace.fraction >= 1.0f || pVeh->m_ucmd.forwardmove != 0 ) && pVeh->m_LandTrace.fraction >= 0.0f ) { @@ -1397,14 +1401,14 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) #ifdef _JK2MP FighterPitchAdjust(pVeh, riderPS, parentPS); #else - pVeh->m_vOrientation[PITCH] = riderPS->viewangles[PITCH]; + pVeh->m_vOrientation[PITCH] = riderPS->viewangles[PITCH]; #endif FighterNoseMalfunctionCheck( pVeh, parentPS ); // Adjust the roll based on the turn amount and dampen it a little. fYawDelta = AngleSubtract(pVeh->m_vOrientation[YAW], pVeh->m_vPrevOrientation[YAW]); //pVeh->m_vOrientation[YAW] - pVeh->m_vPrevOrientation[YAW]; - if ( fYawDelta > 8.0f ) + if ( fYawDelta > 8.0f ) { fYawDelta = 8.0f; } @@ -1433,9 +1437,9 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) } // If you are directly impacting the ground, even out your pitch. - if ( isLandingOrLanded ) + if ( isLandingOrLanded ) {//only if capable of landing - if ( !isDead + if ( !isDead && parentPS->electrifyTimem_pVehicleInfo->surfDestruction || !pVeh->m_iRemovedSurfaces ) ) {//not crashing or spiralling out of control... @@ -1475,8 +1479,8 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) pVeh->m_ucmd.forwardmove = Q_irand( -32, 127 ); pVeh->m_ucmd.upmove = Q_irand( -127, 127 ); pVeh->m_vOrientation[YAW] += Q_flrand( -10, 10 ); - pVeh->m_vOrientation[PITCH] += pVeh->m_fTimeModifier; - if ( pVeh->m_vOrientation[PITCH] > 60.0f ) + pVeh->m_vOrientation[PITCH] += pVeh->m_fTimeModifier; + if ( pVeh->m_vOrientation[PITCH] > 60.0f ) { pVeh->m_vOrientation[PITCH] = 60.0f; } @@ -1488,17 +1492,17 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) */ // If no one is in this vehicle and it's up in the sky, pitch it forward as it comes tumbling down. #ifdef QAGAME //never gonna happen on client anyway, we can't be getting predicted unless the predicting client is boarded - if ( !pVeh->m_pVehicleInfo->Inhabited( pVeh ) - && pVeh->m_LandTrace.fraction >= groundFraction - && !FighterIsInSpace( (gentity_t *)parent ) + if ( !pVeh->m_pVehicleInfo->Inhabited( pVeh ) + && pVeh->m_LandTrace.fraction >= groundFraction + && !FighterIsInSpace( (gentity_t *)parent ) && !FighterSuspended( pVeh, parentPS ) ) { pVeh->m_ucmd.upmove = 0; //pVeh->m_ucmd.forwardmove = 0; - pVeh->m_vOrientation[PITCH] += pVeh->m_fTimeModifier; + pVeh->m_vOrientation[PITCH] += pVeh->m_fTimeModifier; if ( !BG_UnrestrainedPitchRoll( riderPS, pVeh ) ) { - if ( pVeh->m_vOrientation[PITCH] > 60.0f ) + if ( pVeh->m_vOrientation[PITCH] > 60.0f ) { pVeh->m_vOrientation[PITCH] = 60.0f; } @@ -1532,8 +1536,8 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) pVeh->m_vOrientation[ROLL] += (strafeDif*0.1f)*pVeh->m_fTimeModifier; if ( !BG_UnrestrainedPitchRoll( riderPS, pVeh ) ) {//cap it reasonably - if ( pVeh->m_pVehicleInfo->rollLimit != -1 - && !pVeh->m_iRemovedSurfaces + if ( pVeh->m_pVehicleInfo->rollLimit != -1 + && !pVeh->m_iRemovedSurfaces && parentPS->electrifyTimem_vOrientation[ROLL] > pVeh->m_pVehicleInfo->rollLimit ) @@ -1565,7 +1569,7 @@ extern void PM_SetAnim(pmove_t *pm,int setAnimParts,int anim,int setAnimFlags, i // This function makes sure that the vehicle is properly animated. static void AnimateVehicle( Vehicle_t *pVeh ) { - int Anim = -1; + int Anim = -1; int iFlags = SETANIM_FLAG_NORMAL, iBlend = 300; qboolean isLanding = qfalse, isLanded = qfalse; #ifdef _JK2MP @@ -1599,8 +1603,8 @@ static void AnimateVehicle( Vehicle_t *pVeh ) isLanding = FighterIsLanding( pVeh, parentPS ); isLanded = FighterIsLanded( pVeh, parentPS ); - // if we're above launch height (way up in the air)... - if ( !isLanding && !isLanded ) + // if we're above launch height (way up in the air)... + if ( !isLanding && !isLanded ) { if ( !( pVeh->m_ulFlags & VEH_WINGSOPEN ) ) { @@ -1640,7 +1644,7 @@ static void AnimateVehicle( Vehicle_t *pVeh ) { pVeh->m_ulFlags &= ~VEH_GEARSOPEN; Anim = BOTH_GEARS_CLOSE; - //iFlags = SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD; + //iFlags = SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD; } // If gears are closed, and we are below launch height, close the wings. else diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index b3d4e09d26..f5740e3a2b 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "g_local.h" #include "../Rufl/hstring.h" diff --git a/code/game/NPC.cpp b/code/game/NPC.cpp index e615ce6c0c..ed69d69fb9 100644 --- a/code/game/NPC.cpp +++ b/code/game/NPC.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // // NPC.cpp - generic functions diff --git a/code/game/NPC_behavior.cpp b/code/game/NPC_behavior.cpp index a56a08a6e8..9f51936ccd 100644 --- a/code/game/NPC_behavior.cpp +++ b/code/game/NPC_behavior.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //NPC_behavior.cpp /* @@ -80,7 +84,7 @@ void NPC_BSAdvanceFight (void) //Yaw to enemy VectorMA(NPC->enemy->absmin, 0.5, NPC->enemy->maxs, enemy_org); CalcEntitySpot( NPC, SPOT_WEAPON, muzzle ); - + VectorSubtract (enemy_org, muzzle, delta); vectoangles ( delta, angleToEnemy ); distanceToEnemy = VectorNormalize(delta); @@ -99,7 +103,7 @@ void NPC_BSAdvanceFight (void) if(enemyVisibility == VIS_FOV) {//He's in our FOV - + attack_ok = qtrue; CalcEntitySpot( NPC->enemy, SPOT_HEAD, enemy_head); @@ -187,7 +191,7 @@ void NPC_BSAdvanceFight (void) // NPC->cantHitEnemyCounter++; } else - {//FIXME: + {//FIXME: NPC_UpdateShootAngles(NPC->client->ps.viewangles, qtrue, qtrue); } @@ -212,7 +216,7 @@ void MakeOwnerInvis (gentity_t *self); void BeamOut (gentity_t *self) { // gentity_t *tent = G_Spawn(); - + /* tent->owner = self; tent->think = MakeOwnerInvis; @@ -227,7 +231,7 @@ void BeamOut (gentity_t *self) self->svFlags |= SVF_BEAMING; } -void NPC_BSCinematic( void ) +void NPC_BSCinematic( void ) { if( NPCInfo->scriptFlags & SCF_FIRE_WEAPON ) @@ -258,7 +262,7 @@ void NPC_BSCinematic( void ) CalcEntitySpot( NPCInfo->watchTarget, SPOT_HEAD_LEAN, viewSpot ); VectorSubtract( viewSpot, eyes, viewvec ); - + vectoangles( viewvec, viewangles ); NPCInfo->lockedDesiredYaw = NPCInfo->desiredYaw = viewangles[YAW]; @@ -268,7 +272,7 @@ void NPC_BSCinematic( void ) NPC_UpdateAngles( qtrue, qtrue ); } -void NPC_BSWait( void ) +void NPC_BSWait( void ) { NPC_UpdateAngles( qtrue, qtrue ); } @@ -326,7 +330,7 @@ void NPC_BSInvestigate (void) if( level.time < NPCInfo->walkDebounceTime ) {//walk toward investigateGoal - + / * NPCInfo->goalEntity = NPCInfo->tempGoal; VectorCopy(NPCInfo->investigateGoal, NPCInfo->tempGoal->currentOrigin); @@ -348,14 +352,14 @@ void NPC_BSInvestigate (void) if(NPCInfo->hlookCount > 30) { - if(Q_irand(0, 10) > 7) + if(Q_irand(0, 10) > 7) { NPCInfo->hlookCount = 0; } } else if(NPCInfo->hlookCount < -30) { - if(Q_irand(0, 10) > 7) + if(Q_irand(0, 10) > 7) { NPCInfo->hlookCount = 0; } @@ -364,7 +368,7 @@ void NPC_BSInvestigate (void) { NPCInfo->hlookCount = Q_irand(-1, 1); } - else if(Q_irand(0, 10) > 7) + else if(Q_irand(0, 10) > 7) { if(NPCInfo->hlookCount > 0) { @@ -378,14 +382,14 @@ void NPC_BSInvestigate (void) if(NPCInfo->vlookCount >= 15) { - if(Q_irand(0, 10) > 7) + if(Q_irand(0, 10) > 7) { NPCInfo->vlookCount = 0; } } else if(NPCInfo->vlookCount <= -15) { - if(Q_irand(0, 10) > 7) + if(Q_irand(0, 10) > 7) { NPCInfo->vlookCount = 0; } @@ -394,7 +398,7 @@ void NPC_BSInvestigate (void) { NPCInfo->vlookCount = Q_irand(-1, 1); } - else if(Q_irand(0, 10) > 8) + else if(Q_irand(0, 10) > 8) { if(NPCInfo->vlookCount > 0) { @@ -444,17 +448,17 @@ qboolean NPC_CheckInvestigate( int alertEventNum ) return qfalse; } - if ( owner->s.eType != ET_PLAYER && owner == NPCInfo->goalEntity ) + if ( owner->s.eType != ET_PLAYER && owner == NPCInfo->goalEntity ) { return qfalse; } - if ( owner->s.eFlags & EF_NODRAW ) + if ( owner->s.eFlags & EF_NODRAW ) { return qfalse; } - if ( owner->flags & FL_NOTARGET ) + if ( owner->flags & FL_NOTARGET ) { return qfalse; } @@ -517,9 +521,9 @@ qboolean NPC_CheckInvestigate( int alertEventNum ) /* -void NPC_BSSleep( void ) +void NPC_BSSleep( void ) */ -void NPC_BSSleep( void ) +void NPC_BSSleep( void ) { int alertEvent = NPC_CheckAlertEvents( qtrue, qfalse ); @@ -573,15 +577,15 @@ bool NPC_BSFollowLeader_UpdateLeader(void) } if ( NPCInfo->behaviorState == BS_FOLLOW_LEADER ) { - NPCInfo->behaviorState = BS_DEFAULT; + NPCInfo->behaviorState = BS_DEFAULT; } if ( NPCInfo->defaultBehavior == BS_FOLLOW_LEADER ) { - NPCInfo->defaultBehavior = BS_DEFAULT; + NPCInfo->defaultBehavior = BS_DEFAULT; } return false; } - return true; + return true; } @@ -602,8 +606,8 @@ void NPC_BSFollowLeader_UpdateEnemy(void) if ( eventID > -1 && level.alertEvents[eventID].level >= AEL_SUSPICIOUS && (NPCInfo->scriptFlags&SCF_LOOK_FOR_ENEMIES) ) { //NPCInfo->lastAlertID = level.alertEvents[eventID].ID; - if ( !level.alertEvents[eventID].owner || - !level.alertEvents[eventID].owner->client || + if ( !level.alertEvents[eventID].owner || + !level.alertEvents[eventID].owner->client || level.alertEvents[eventID].owner->health <= 0 || level.alertEvents[eventID].owner->client->playerTeam != NPC->client->enemyTeam ) {//not an enemy @@ -622,8 +626,8 @@ void NPC_BSFollowLeader_UpdateEnemy(void) } if ( !NPC->enemy ) { - if ( NPC->client->leader - && NPC->client->leader->enemy + if ( NPC->client->leader + && NPC->client->leader->enemy && NPC->client->leader->enemy != NPC && ( (NPC->client->leader->enemy->client&&NPC->client->leader->enemy->client->playerTeam==NPC->client->enemyTeam) ||(NPC->client->leader->enemy->svFlags&SVF_NONNPC_ENEMY&&NPC->client->leader->enemy->noDamageTeam==NPC->client->enemyTeam) ) @@ -635,7 +639,7 @@ void NPC_BSFollowLeader_UpdateEnemy(void) } } } - else + else { if ( NPC->enemy->health <= 0 || (NPC->enemy->flags&FL_NOTARGET) ) { @@ -670,16 +674,15 @@ bool NPC_BSFollowLeader_AttackEnemy(void) if ( enemyVisibility > VIS_PVS ) {//face vec3_t enemy_org, muzzle, delta, angleToEnemy; - float distanceToEnemy; CalcEntitySpot( NPC->enemy, SPOT_HEAD, enemy_org ); NPC_AimWiggle( enemy_org ); CalcEntitySpot( NPC, SPOT_WEAPON, muzzle ); - + VectorSubtract( enemy_org, muzzle, delta); vectoangles( delta, angleToEnemy ); - distanceToEnemy = VectorNormalize( delta ); + VectorNormalize( delta ); NPCInfo->desiredYaw = angleToEnemy[YAW]; NPCInfo->desiredPitch = angleToEnemy[PITCH]; @@ -688,7 +691,7 @@ bool NPC_BSFollowLeader_AttackEnemy(void) if ( enemyVisibility >= VIS_SHOOT ) {//shoot NPC_AimAdjust( 2 ); - if ( NPC_GetHFOVPercentage( NPC->enemy->currentOrigin, NPC->currentOrigin, NPC->client->ps.viewangles, NPCInfo->stats.hfov ) > 0.6f + if ( NPC_GetHFOVPercentage( NPC->enemy->currentOrigin, NPC->currentOrigin, NPC->client->ps.viewangles, NPCInfo->stats.hfov ) > 0.6f && NPC_GetHFOVPercentage( NPC->enemy->currentOrigin, NPC->currentOrigin, NPC->client->ps.viewangles, NPCInfo->stats.vfov ) > 0.5f ) {//actually withing our front cone WeaponThink( qtrue ); @@ -698,7 +701,7 @@ bool NPC_BSFollowLeader_AttackEnemy(void) { NPC_AimAdjust( 1 ); } - + //NPC_CheckCanAttack(1.0, qfalse); } else @@ -710,8 +713,8 @@ bool NPC_BSFollowLeader_AttackEnemy(void) bool NPC_BSFollowLeader_CanAttack(void) { - return (NPC->enemy - && NPC->client->ps.weapon + return (NPC->enemy + && NPC->client->ps.weapon && !(NPCInfo->aiFlags&NPCAI_HEAL_ROSH) //Kothos twins never go after their enemy ); } @@ -719,10 +722,10 @@ bool NPC_BSFollowLeader_CanAttack(void) bool NPC_BSFollowLeader_InFullBodyAttack(void) { return ( - NPC->client->ps.legsAnim==BOTH_ATTACK1 || - NPC->client->ps.legsAnim==BOTH_ATTACK2 || - NPC->client->ps.legsAnim==BOTH_ATTACK3 || - NPC->client->ps.legsAnim==BOTH_MELEE1 || + NPC->client->ps.legsAnim==BOTH_ATTACK1 || + NPC->client->ps.legsAnim==BOTH_ATTACK2 || + NPC->client->ps.legsAnim==BOTH_ATTACK3 || + NPC->client->ps.legsAnim==BOTH_MELEE1 || NPC->client->ps.legsAnim==BOTH_MELEE2 ); } @@ -738,7 +741,7 @@ void NPC_BSFollowLeader_LookAtLeader(void) VectorNormalize(delta); NPC->NPC->desiredYaw = angleToLeader[YAW]; NPC->NPC->desiredPitch = angleToLeader[PITCH]; - + NPC_UpdateAngles(qtrue, qtrue); } @@ -798,8 +801,8 @@ void NPC_BSFollowLeader (void) { // If Too Close, Back Away Some //------------------------------ - if (STEER::Reached(NPC, NPC->client->leader, 65.0f)) - { + if (STEER::Reached(NPC, NPC->client->leader, 65.0f)) + { STEER::Evade(NPC, NPC->client->leader); } else @@ -913,7 +916,7 @@ void NPC_BSJump (void) //FIXME: length of xy will change curve of parabola, need to account for this //somewhere... PARA_WIDTH - + z = (sqrt(apexHeight + z) - sqrt(apexHeight)); assert(z >= 0); @@ -931,13 +934,13 @@ void NPC_BSJump (void) VectorMA( p1, xy, dir, apex ); apex[2] += apexHeight; - + VectorCopy(apex, NPC->pos1); - + //Now we have the apex, aim for it height = apex[2] - NPC->currentOrigin[2]; time = sqrt( height / ( .5 * NPC->client->ps.gravity ) ); - if ( !time ) + if ( !time ) { // gi.Printf("ERROR no time in jump\n"); return; @@ -969,8 +972,8 @@ void NPC_BSJump (void) if ( NPC->s.groundEntityNum != ENTITYNUM_NONE) {//Landed, start landing anim - //FIXME: if the - VectorClear(NPC->client->ps.velocity); + //FIXME: if the + VectorClear(NPC->client->ps.velocity); NPC_SetAnim(NPC, SETANIM_BOTH, BOTH_LAND1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); NPCInfo->jumpState = JS_LANDING; //FIXME: landsound? @@ -1155,7 +1158,7 @@ void NPC_BSSearch (void) vec3_t branchPos, lookDir; NAV::GetNodePosition(NAV::ChooseRandomNeighbor(NPCInfo->tempGoal->waypoint), branchPos); - + VectorSubtract( branchPos, NPCInfo->tempGoal->currentOrigin, lookDir ); NPCInfo->desiredYaw = AngleNormalize360( vectoyaw( lookDir ) + Q_flrand( -45, 45 ) ); } @@ -1225,7 +1228,7 @@ void NPC_BSNoClip ( void ) float fDot, rDot, uDot; VectorSubtract( NPCInfo->goalEntity->currentOrigin, NPC->currentOrigin, dir ); - + vectoangles( dir, angles ); NPCInfo->desiredYaw = angles[YAW]; @@ -1300,7 +1303,7 @@ void NPC_BSWander (void) { // If Debounce Time Has Expired, Choose A New Sub State //------------------------------------------------------ - if (NPCInfo->investigateDebounceTimeinvestigateDebounceTimeaiFlags&NPCAI_BLOCKED) && (level.time-NPCInfo->blockedDebounceTime)>1000)) { // Clear Out Flags From The Previous Substate @@ -1316,7 +1319,7 @@ void NPC_BSWander (void) bool RandomPathNode = (NEXTSUBSTATE<9); //(NEXTSUBSTATE<4); bool PathlessWander = false; //(NEXTSUBSTATE<9) - + // Random Path Node //------------------ @@ -1395,7 +1398,7 @@ void NPC_BSFaceLeader (void) VectorNormalize( delta ); NPC->NPC->desiredYaw = angleToLeader[YAW]; NPC->NPC->desiredPitch = angleToLeader[PITCH]; - + NPC_UpdateAngles(qtrue, qtrue); } */ @@ -1426,18 +1429,18 @@ qboolean NPC_CanSurrender( void ) case CLASS_RANCOR: case CLASS_SAND_CREATURE: case CLASS_WAMPA: - case CLASS_INTERROGATOR: // droid - case CLASS_JAN: - case CLASS_JEDI: + case CLASS_INTERROGATOR: // droid + case CLASS_JAN: + case CLASS_JEDI: case CLASS_KYLE: - case CLASS_LANDO: + case CLASS_LANDO: case CLASS_LIZARD: - case CLASS_LUKE: + case CLASS_LUKE: case CLASS_MARK1: // droid case CLASS_MARK2: // droid case CLASS_GALAKMECH: // droid case CLASS_MINEMONSTER: - case CLASS_MONMOTHA: + case CLASS_MONMOTHA: case CLASS_MORGANKATARN: case CLASS_MOUSE: // droid case CLASS_MURJJ: @@ -1508,7 +1511,7 @@ void NPC_Surrender( void ) { return; } - if ( NPC->s.weapon != WP_NONE && + if ( NPC->s.weapon != WP_NONE && NPC->s.weapon != WP_MELEE && NPC->s.weapon != WP_SABER ) { @@ -1569,8 +1572,8 @@ void NPC_Surrender( void ) qboolean NPC_CheckSurrender( void ) { - if ( !g_AIsurrender->integer - && NPC->client->NPC_class != CLASS_UGNAUGHT + if ( !g_AIsurrender->integer + && NPC->client->NPC_class != CLASS_UGNAUGHT && NPC->client->NPC_class != CLASS_JAWA ) {//not enabled return qfalse; @@ -1582,7 +1585,7 @@ qboolean NPC_CheckSurrender( void ) && NPC->enemy->health > 20 && NPC->enemy->painDebounceTime < level.time - 3000 && NPC->enemy->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] < level.time - 1000 ) {//don't surrender if scripted to run somewhere or if we're in the air or if we're busy or if we don't have an enemy or if the enemy is not mad at me or is hurt or not a threat or busy being attacked //FIXME: even if not in a group, don't surrender if there are other enemies in the PVS and within a certain range? - if ( NPC->s.weapon != WP_ROCKET_LAUNCHER + if ( NPC->s.weapon != WP_ROCKET_LAUNCHER && NPC->s.weapon != WP_CONCUSSION && NPC->s.weapon != WP_REPEATER && NPC->s.weapon != WP_FLECHETTE @@ -1618,7 +1621,7 @@ qboolean NPC_CheckSurrender( void ) } if ( !NPCInfo->group || (NPCInfo->group && NPCInfo->group->numGroup <= 1) ) {//I'm alone but I was in a group//FIXME: surrender anyway if just melee or no weap? - if ( NPC->s.weapon == WP_NONE + if ( NPC->s.weapon == WP_NONE //NPC has a weapon || NPC->enemy == player || (NPC->enemy->s.weapon == WP_SABER&&NPC->enemy->client&&NPC->enemy->client->ps.SaberActive()) @@ -1679,11 +1682,11 @@ void NPC_JawaFleeSound( void ) if ( NPC && NPC->client && NPC->client->NPC_class == CLASS_JAWA - && !Q_irand( 0, 3 ) + && !Q_irand( 0, 3 ) && NPCInfo->blockedSpeechDebounceTime < level.time && !Q3_TaskIDPending(NPC, TID_CHAN_VOICE ) ) - {//ooteenee!!!! - //Com_Printf( "ooteenee!!!!\n" ); + {//ooteenee!!!! + //Com_Printf( "ooteenee!!!!\n" ); G_SoundOnEnt(NPC, CHAN_VOICE, "sound/chars/jawa/misc/ooh-tee-nee.wav" ); NPCInfo->blockedSpeechDebounceTime = level.time + 2000; } @@ -1695,7 +1698,7 @@ qboolean NPC_BSFlee( void ) { bool enemyRecentlySeen = false; float enemyTooCloseDist = 50.0f; - bool reachedEscapePoint = false; + bool reachedEscapePoint = false; bool hasEscapePoint = false; bool moveSuccess = false; bool inSurrender = (level.timesurrenderTime); @@ -1727,7 +1730,7 @@ qboolean NPC_BSFlee( void ) NPC->client->NPC_class!=CLASS_PRISONER && // Prisoners can't pickup weapons NPCInfo->rank>RANK_CIVILIAN && // Neither can civilians TIMER_Done(NPC, "panic") && // Panic causes him to run for a bit, don't pickup weapons - TIMER_Done(NPC, "CheckForWeaponToPickup") && + TIMER_Done(NPC, "CheckForWeaponToPickup") && G_CanPickUpWeapons( NPC ) //Allowed To Pick Up Dropped Weapons ) { @@ -1788,7 +1791,7 @@ qboolean NPC_BSFlee( void ) // If Super Close To The Enemy, Run In The Other Direction //--------------------------------------------------------- - if (enemyRecentlySeen && + if (enemyRecentlySeen && Distance(NPC->enemy->currentOrigin, NPC->currentOrigin)enemy); @@ -1855,21 +1858,21 @@ qboolean NPC_BSFlee( void ) && (level.time-NPCInfo->surrenderTime) > 3000 )//and haven't just finished surrendering { NPC_FaceEnemy(); - NPC_Surrender(); + NPC_Surrender(); } } - + // Time To Choose A New Escape Point? //------------------------------------ if ((!hasEscapePoint || reachedEscapePoint) && TIMER_Done(NPC, "FindNewEscapePointDebounce")) { TIMER_Set(NPC, "FindNewEscapePointDebounce", 2500); - int escapePoint = NPC_FindCombatPoint( - NPC->currentOrigin, - NPC->enemy->currentOrigin, - NPC->currentOrigin, - CP_COVER|CP_AVOID_ENEMY|CP_HAS_ROUTE, + int escapePoint = NPC_FindCombatPoint( + NPC->currentOrigin, + NPC->enemy->currentOrigin, + NPC->currentOrigin, + CP_COVER|CP_AVOID_ENEMY|CP_HAS_ROUTE, 128 ); if (escapePoint!=-1) { @@ -1884,8 +1887,8 @@ qboolean NPC_BSFlee( void ) // If Only Temporarly In Flee, Think About Perhaps Returning To Combat //--------------------------------------------------------------------- if (NPCInfo->tempBehavior==BS_FLEE && - TIMER_Done(NPC, "flee") && - NPC->s.weapon != WP_NONE && + TIMER_Done(NPC, "flee") && + NPC->s.weapon != WP_NONE && NPC->s.weapon != WP_MELEE ) { @@ -1957,14 +1960,14 @@ void NPC_StartFlee( gentity_t *enemy, vec3_t dangerPoint, int dangerLevel, int f } else {//couldn't find a place to hide - //FIXME: re-implement the old BS_FLEE behavior of following any the waypoint edge + //FIXME: re-implement the old BS_FLEE behavior of following any the waypoint edge // that leads away from the danger point. NPC_SetMoveGoal( NPC, NPC->currentOrigin, 0/*goalRadius*/, qtrue, cp ); } if ( dangerLevel > AEL_DANGER//geat danger always makes people turn and run || NPC->s.weapon == WP_NONE //melee/unarmed guys turn and run, others keep facing you and shooting - || NPC->s.weapon == WP_MELEE + || NPC->s.weapon == WP_MELEE || NPC->s.weapon == WP_TUSKEN_STAFF ) { NPCInfo->tempBehavior = BS_FLEE;//we don't want to do this forever! diff --git a/code/game/NPC_combat.cpp b/code/game/NPC_combat.cpp index 5b7eba3801..8cb1cdf17c 100644 --- a/code/game/NPC_combat.cpp +++ b/code/game/NPC_combat.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //NPC_combat.cpp @@ -82,7 +86,7 @@ void G_AngerAlert( gentity_t *self ) return; } //FIXME: hmm.... with all the other new alerts now, is this still neccesary or even a good idea...? - G_AlertTeam( self, self->enemy, ANGER_ALERT_RADIUS, ANGER_ALERT_SOUND_RADIUS ); + G_AlertTeam( self, self->enemy, ANGER_ALERT_RADIUS, ANGER_ALERT_SOUND_RADIUS ); } /* @@ -147,7 +151,7 @@ qboolean G_CheckSaberAllyAttackDelay( gentity_t *self, gentity_t *enemy ) { return qfalse; } - if ( self->NPC + if ( self->NPC && self->client->leader == player && self->enemy && self->enemy->s.weapon != WP_SABER @@ -195,7 +199,7 @@ void G_AttackDelay( gentity_t *self, gentity_t *enemy ) VectorNormalize( dir ); AngleVectors( self->client->renderInfo.eyeAngles, fwd, NULL, NULL ); //dir[2] = fwd[2] = 0;//ignore z diff? - + attDelay = (4-g_spskill->integer)*500;//initial: from 1000ms delay on hard to 2000ms delay on easy if ( self->client->playerTeam == TEAM_PLAYER ) {//invert @@ -231,14 +235,14 @@ void G_AttackDelay( gentity_t *self, gentity_t *enemy ) case CLASS_TRANDOSHAN: attDelay -= Q_irand( 500, 1500 ); break; - case CLASS_JAN: - case CLASS_LANDO: + case CLASS_JAN: + case CLASS_LANDO: case CLASS_PRISONER: case CLASS_REBEL: attDelay -= Q_irand( 500, 1500 ); break; - case CLASS_GALAKMECH: - case CLASS_ATST: + case CLASS_GALAKMECH: + case CLASS_ATST: attDelay -= Q_irand( 1000, 2000 ); break; case CLASS_REELO: @@ -251,10 +255,10 @@ void G_AttackDelay( gentity_t *self, gentity_t *enemy ) return; break; case CLASS_INTERROGATOR: - case CLASS_PROBE: - case CLASS_MARK1: - case CLASS_MARK2: - case CLASS_SENTRY: + case CLASS_PROBE: + case CLASS_MARK1: + case CLASS_MARK2: + case CLASS_SENTRY: return; break; case CLASS_REMOTE: @@ -267,13 +271,13 @@ void G_AttackDelay( gentity_t *self, gentity_t *enemy ) case CLASS_WEEQUAY: case CLASS_TUSKEN: break; - case CLASS_JEDI: + case CLASS_JEDI: case CLASS_SHADOWTROOPER: case CLASS_TAVION: case CLASS_REBORN: - case CLASS_LUKE: - case CLASS_KYLE: - case CLASS_DESANN: + case CLASS_LUKE: + case CLASS_KYLE: + case CLASS_DESANN: break; */ default: @@ -331,7 +335,7 @@ void G_AttackDelay( gentity_t *self, gentity_t *enemy ) case WP_EMPLACED_GUN: return; break; - case WP_TURRET: // turret guns + case WP_TURRET: // turret guns return; break; case WP_BOT_LASER: // Probe droid - Laser blast @@ -399,7 +403,7 @@ void G_AimSet( gentity_t *self, int aim ); void G_SetEnemy( gentity_t *self, gentity_t *enemy ) { int event = 0; - + //Must be valid if ( enemy == NULL ) return; @@ -437,12 +441,12 @@ void G_SetEnemy( gentity_t *self, gentity_t *enemy ) assert( enemy != self ); } #endif// _DEBUG - + // if ( enemy->client && enemy->client->playerTeam == TEAM_DISGUISE ) // {//unmask the player // enemy->client->playerTeam = TEAM_PLAYER; // } - + if ( self->client && self->NPC && enemy->client && enemy->client->playerTeam == self->client->playerTeam ) {//Probably a damn script! if ( self->NPC->charmedTime > level.time ) @@ -479,7 +483,7 @@ void G_SetEnemy( gentity_t *self, gentity_t *enemy ) //Special case- if player is being hunted by his own people, set the player's team to team_free - if ( self->client->playerTeam == TEAM_PLAYER + if ( self->client->playerTeam == TEAM_PLAYER && enemy->s.number == 0 && enemy->client && enemy->client->playerTeam == TEAM_PLAYER ) @@ -492,7 +496,7 @@ void G_SetEnemy( gentity_t *self, gentity_t *enemy ) if( G_ActivateBehavior( self, BSET_ANGER ) ) { } - else if ( self->client + else if ( self->client && self->client->NPC_class == CLASS_KYLE && self->client->leader == player && !TIMER_Done( self, "kyleAngerSoundDebounce" ) ) @@ -540,10 +544,10 @@ void G_SetEnemy( gentity_t *self, gentity_t *enemy ) } } } - + if ( event ) {//yell - if ( self->client + if ( self->client && self->client->NPC_class == CLASS_KYLE && self->client->leader == player ) {//don't yell that you have an enemy more than once every 4-8 seconds @@ -552,9 +556,9 @@ void G_SetEnemy( gentity_t *self, gentity_t *enemy ) G_AddVoiceEvent( self, event, 2000 ); } } - + if ( self->s.weapon == WP_BLASTER || self->s.weapon == WP_REPEATER || - self->s.weapon == WP_THERMAL || self->s.weapon == WP_BLASTER_PISTOL + self->s.weapon == WP_THERMAL || self->s.weapon == WP_BLASTER_PISTOL || self->s.weapon == WP_BOWCASTER ) {//Hmm, how about sniper and bowcaster? //When first get mad, aim is bad @@ -581,7 +585,7 @@ void G_SetEnemy( gentity_t *self, gentity_t *enemy ) G_AimSet( self, Q_irand( self->NPC->stats.aim - (maxErr*(3-g_spskill->integer)), self->NPC->stats.aim - (minErr*(3-g_spskill->integer)) ) ); } } - + //Alert anyone else in the area if ( Q_stricmp( "desperado", self->NPC_type ) != 0 && Q_stricmp( "paladin", self->NPC_type ) != 0 ) {//special holodeck enemies exception @@ -617,7 +621,7 @@ void G_SetEnemy( gentity_t *self, gentity_t *enemy ) } return; } - + //Otherwise, just picking up another enemy if ( event ) @@ -632,41 +636,41 @@ void G_SetEnemy( gentity_t *self, gentity_t *enemy ) /* -int ChooseBestWeapon( void ) +int ChooseBestWeapon( void ) { int n; int weapon; // check weapons in the NPC's weapon preference order - for ( n = 0; n < MAX_WEAPONS; n++ ) + for ( n = 0; n < MAX_WEAPONS; n++ ) { weapon = NPCInfo->weaponOrder[n]; - if ( weapon == WP_NONE ) + if ( weapon == WP_NONE ) { break; } - if ( !HaveWeapon( weapon ) ) + if ( !HaveWeapon( weapon ) ) { continue; } - if ( client->ps.ammo[weaponData[weapon].ammoIndex] ) + if ( client->ps.ammo[weaponData[weapon].ammoIndex] ) { return weapon; } } // check weapons serially (mainly in case a weapon is not on the NPC's list) - for ( weapon = 1; weapon < WP_NUM_WEAPONS; weapon++ ) + for ( weapon = 1; weapon < WP_NUM_WEAPONS; weapon++ ) { - if ( !HaveWeapon( weapon ) ) + if ( !HaveWeapon( weapon ) ) { continue; } - if ( client->ps.ammo[weaponData[weapon].ammoIndex] ) + if ( client->ps.ammo[weaponData[weapon].ammoIndex] ) { return weapon; } @@ -676,7 +680,7 @@ int ChooseBestWeapon( void ) } */ -void ChangeWeapon( gentity_t *ent, int newWeapon ) +void ChangeWeapon( gentity_t *ent, int newWeapon ) { if ( !ent || !ent->client || !ent->NPC ) { @@ -689,7 +693,7 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) ent->NPC->attackHold = 0; ent->NPC->currentAmmo = ent->client->ps.ammo[weaponData[newWeapon].ammoIndex]; - switch ( newWeapon ) + switch ( newWeapon ) { case WP_BRYAR_PISTOL://prifle ent->NPC->aiFlags &= ~NPCAI_BURST_WEAPON; @@ -702,12 +706,15 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) {//commando ent->NPC->aiFlags |= NPCAI_BURST_WEAPON; ent->NPC->burstMin = 4; +#ifdef BASE_SAVE_COMPAT + ent->NPC->burstMean = 8; +#endif ent->NPC->burstMax = 12; if ( g_spskill->integer == 0 ) ent->NPC->burstSpacing = 600;//attack debounce else if ( g_spskill->integer == 1 ) ent->NPC->burstSpacing = 400;//attack debounce - else + else ent->NPC->burstSpacing = 250;//attack debounce } else if ( ent->client->NPC_class == CLASS_SABOTEUR ) @@ -716,7 +723,7 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) ent->NPC->burstSpacing = 900;//attack debounce else if ( g_spskill->integer == 1 ) ent->NPC->burstSpacing = 600;//attack debounce - else + else ent->NPC->burstSpacing = 400;//attack debounce } else @@ -726,7 +733,7 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) ent->NPC->burstSpacing = 1000;//attack debounce else if ( g_spskill->integer == 1 ) ent->NPC->burstSpacing = 750;//attack debounce - else + else ent->NPC->burstSpacing = 500;//attack debounce } break; @@ -738,7 +745,7 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) ent->NPC->burstSpacing = 600;//attack debounce else if ( g_spskill->integer == 1 ) ent->NPC->burstSpacing = 400;//attack debounce - else + else ent->NPC->burstSpacing = 200;//attack debounce break; @@ -800,7 +807,7 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) ent->NPC->burstSpacing = 1000;//attack debounce else if ( g_spskill->integer == 1 ) ent->NPC->burstSpacing = 750;//attack debounce - else + else ent->NPC->burstSpacing = 500;//attack debounce break; @@ -814,12 +821,15 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) { ent->NPC->aiFlags |= NPCAI_BURST_WEAPON; ent->NPC->burstMin = 3; +#ifdef BASE_SAVE_COMPAT + ent->NPC->burstMean = 6; +#endif ent->NPC->burstMax = 10; if ( g_spskill->integer == 0 ) ent->NPC->burstSpacing = 1500;//attack debounce else if ( g_spskill->integer == 1 ) ent->NPC->burstSpacing = 1000;//attack debounce - else + else ent->NPC->burstSpacing = 500;//attack debounce } break; @@ -848,7 +858,7 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) ent->NPC->burstSpacing = 2500;//attack debounce else if ( g_spskill->integer == 1 ) ent->NPC->burstSpacing = 2000;//attack debounce - else + else ent->NPC->burstSpacing = 1500;//attack debounce break; @@ -864,7 +874,7 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) ent->NPC->burstSpacing = 2300;//attack debounce else if ( g_spskill->integer == 1 ) ent->NPC->burstSpacing = 1800;//attack debounce - else + else ent->NPC->burstSpacing = 1200;//attack debounce } break; @@ -878,7 +888,7 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) else if ( g_spskill->integer == 1 ) // ent->NPC->burstSpacing = 2500;//attack debounce ent->NPC->burstSpacing = 3000;//attack debounce - else + else ent->NPC->burstSpacing = 2000;//attack debounce break; @@ -890,7 +900,7 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) ent->NPC->burstSpacing = 2000;//2 seconds ent->NPC->attackHold = 1000;//Hold attack button for a 1-second burst break; - + case WP_TRICORDER: ent->NPC->aiFlags |= NPCAI_BURST_WEAPON; ent->NPC->burstMin = 5; @@ -904,12 +914,15 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) { ent->NPC->aiFlags |= NPCAI_BURST_WEAPON; ent->NPC->burstMin = 3; +#ifdef BASE_SAVE_COMPAT + ent->NPC->burstMean = 3; +#endif ent->NPC->burstMax = 3; if ( g_spskill->integer == 0 ) ent->NPC->burstSpacing = 1500;//attack debounce else if ( g_spskill->integer == 1 ) ent->NPC->burstSpacing = 1000;//attack debounce - else + else ent->NPC->burstSpacing = 500;//attack debounce } else @@ -919,7 +932,7 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) ent->NPC->burstSpacing = 1000;//attack debounce else if ( g_spskill->integer == 1 ) ent->NPC->burstSpacing = 750;//attack debounce - else + else ent->NPC->burstSpacing = 500;//attack debounce // ent->NPC->burstSpacing = 1000;//attackdebounce } @@ -946,7 +959,7 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) ent->NPC->burstSpacing = 1000;//attack debounce else if ( g_spskill->integer == 1 ) ent->NPC->burstSpacing = 750;//attack debounce - else + else ent->NPC->burstSpacing = 500;//attack debounce break; @@ -960,13 +973,16 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) // ent->NPC->burstSpacing = 300;//attack debounce // else if ( g_spskill->integer == 1 ) // ent->NPC->burstSpacing = 200;//attack debounce - // else + // else // ent->NPC->burstSpacing = 100;//attack debounce } else { ent->NPC->aiFlags |= NPCAI_BURST_WEAPON; ent->NPC->burstMin = 2; // 3 shots, really +#ifdef BASE_SAVE_COMPAT + ent->NPC->burstMean = 2; +#endif ent->NPC->burstMax = 2; if ( ent->owner ) // if we have an owner, it should be the chair at this point...so query the chair for its shot debounce times, etc. @@ -980,7 +996,7 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) { ent->NPC->burstSpacing = ent->owner->wait + 200;//attack debounce } - else + else { ent->NPC->burstSpacing = ent->owner->wait;//attack debounce } @@ -996,7 +1012,7 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) { ent->NPC->burstSpacing = 1000;//attack debounce } - else + else { ent->NPC->burstSpacing = 800;//attack debounce } @@ -1010,7 +1026,7 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) ent->NPC->burstSpacing = 2250;//attack debounce else if ( g_spskill->integer == 1 ) ent->NPC->burstSpacing = 1500;//attack debounce - else + else ent->NPC->burstSpacing = 750;//attack debounce break; @@ -1020,7 +1036,7 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) } } -void NPC_ChangeWeapon( int newWeapon ) +void NPC_ChangeWeapon( int newWeapon ) { qboolean changing = qfalse; if ( newWeapon != NPC->client->ps.weapon ) @@ -1049,13 +1065,13 @@ void NPC_ApplyWeaponFireDelay(void) How long, if at all, in msec the actual fire should delay from the time the attack was started */ void NPC_ApplyWeaponFireDelay(void) -{ +{ if ( NPC->attackDebounceTime > level.time ) {//Just fired, if attacking again, must be a burst fire, so don't add delay //NOTE: Borg AI uses attackDebounceTime "incorrectly", so this will always return for them! return; } - + switch(client->ps.weapon) { case WP_BOT_LASER: @@ -1065,7 +1081,7 @@ void NPC_ApplyWeaponFireDelay(void) case WP_THERMAL: if ( client->ps.clientNum ) - {//NPCs delay... + {//NPCs delay... //FIXME: player should, too, but would feel weird in 1st person, even though it // would look right in 3rd person. Really should have a wind-up anim // for player as he holds down the fire button to throw, then play @@ -1100,7 +1116,7 @@ void NPC_ApplyWeaponFireDelay(void) ShootThink ------------------------- */ -void ShootThink( void ) +void ShootThink( void ) { int delay; @@ -1110,21 +1126,21 @@ void ShootThink( void ) NPC_ApplyWeaponFireDelay(); - if ( NPCInfo->aiFlags & NPCAI_BURST_WEAPON ) + if ( NPCInfo->aiFlags & NPCAI_BURST_WEAPON ) { - if ( !NPCInfo->burstCount ) + if ( !NPCInfo->burstCount ) { NPCInfo->burstCount = Q_irand( NPCInfo->burstMin, NPCInfo->burstMax ); delay = 0; } - else + else { NPCInfo->burstCount--; - if ( NPCInfo->burstCount == 0 ) + if ( NPCInfo->burstCount == 0 ) { delay = NPCInfo->burstSpacing + Q_irand(-150, 150); } - else + else { delay = 0; } @@ -1145,7 +1161,7 @@ void ShootThink( void ) { delay = NPC->owner->random + 100; } - else + else { delay = NPC->owner->random; } @@ -1160,7 +1176,7 @@ void ShootThink( void ) { delay = 300; } - else + else { delay = 200; } @@ -1168,7 +1184,7 @@ void ShootThink( void ) } } } - else + else { delay = NPCInfo->burstSpacing + Q_irand(-150, 150); } @@ -1178,15 +1194,15 @@ void ShootThink( void ) } /* -static void WeaponThink( qboolean inCombat ) +static void WeaponThink( qboolean inCombat ) FIXME makes this so there's a delay from event that caused us to check to actually doing it Added: hacks for Borg */ -void WeaponThink( qboolean inCombat ) +void WeaponThink( qboolean inCombat ) { ucmd.buttons &= ~BUTTON_ATTACK; - if ( client->ps.weaponstate == WEAPON_RAISING || client->ps.weaponstate == WEAPON_DROPPING ) + if ( client->ps.weaponstate == WEAPON_RAISING || client->ps.weaponstate == WEAPON_DROPPING ) { ucmd.weapon = client->ps.weapon; return; @@ -1200,7 +1216,7 @@ void WeaponThink( qboolean inCombat ) //now we can? - Dusty // Can't Fire While Cloaked - if (NPC->client && + if (NPC->client && (NPC->client->ps.powerups[PW_CLOAKED] || (level.timeclient->ps.powerups[PW_UNCLOAKING]))) { return; @@ -1211,21 +1227,21 @@ void WeaponThink( qboolean inCombat ) return; } - if ( client->ps.weaponstate != WEAPON_READY && client->ps.weaponstate != WEAPON_FIRING && client->ps.weaponstate != WEAPON_IDLE) + if ( client->ps.weaponstate != WEAPON_READY && client->ps.weaponstate != WEAPON_FIRING && client->ps.weaponstate != WEAPON_IDLE) { return; } - if ( level.time < NPCInfo->shotTime ) + if ( level.time < NPCInfo->shotTime ) { return; } //MCG - Begin - //For now, no-one runs out of ammo + //For now, no-one runs out of ammo if ( NPC->client->ps.ammo[ weaponData[client->ps.weapon].ammoIndex ] < weaponData[client->ps.weapon].energyPerShot ) - { + { Add_Ammo( NPC, client->ps.weapon, weaponData[client->ps.weapon].energyPerShot*10 ); } else if ( NPC->client->ps.ammo[ weaponData[client->ps.weapon].ammoIndex ] < weaponData[client->ps.weapon].altEnergyPerShot ) @@ -1241,7 +1257,7 @@ void WeaponThink( qboolean inCombat ) HaveWeapon */ -qboolean HaveWeapon( int weapon ) +qboolean HaveWeapon( int weapon ) { return ( client->ps.stats[STAT_WEAPONS] & ( 1 << weapon ) ); } @@ -1282,7 +1298,7 @@ this function does not check teams, invulnerability, notarget, etc.... Added: If can't shoot center, try head, if not, see if it's close enough to try anyway. */ -qboolean CanShoot ( gentity_t *ent, gentity_t *shooter ) +qboolean CanShoot ( gentity_t *ent, gentity_t *shooter ) { trace_t tr; vec3_t muzzle; @@ -1296,18 +1312,18 @@ qboolean CanShoot ( gentity_t *ent, gentity_t *shooter ) traceEnt = &g_entities[ tr.entityNum ]; // point blank, baby! - if (tr.startsolid && (shooter->NPC) && (shooter->NPC->touchedByPlayer) ) + if (tr.startsolid && (shooter->NPC) && (shooter->NPC->touchedByPlayer) ) { traceEnt = shooter->NPC->touchedByPlayer; } - + if ( ShotThroughGlass( &tr, ent, spot, MASK_SHOT ) ) { traceEnt = &g_entities[ tr.entityNum ]; } // shot is dead on - if ( traceEnt == ent ) + if ( traceEnt == ent ) { return qtrue; } @@ -1317,7 +1333,7 @@ qboolean CanShoot ( gentity_t *ent, gentity_t *shooter ) CalcEntitySpot( ent, SPOT_HEAD, spot ); gi.trace ( &tr, muzzle, NULL, NULL, spot, shooter->s.number, MASK_SHOT, (EG2_Collision)0, 0 ); traceEnt = &g_entities[ tr.entityNum ]; - if ( traceEnt == ent) + if ( traceEnt == ent) { return qtrue; } @@ -1332,7 +1348,7 @@ qboolean CanShoot ( gentity_t *ent, gentity_t *shooter ) } //MCG - End // shot would hit a non-client - if ( !traceEnt->client ) + if ( !traceEnt->client ) { return qfalse; } @@ -1340,13 +1356,13 @@ qboolean CanShoot ( gentity_t *ent, gentity_t *shooter ) // shot is blocked by another player // he's already dead, so go ahead - if ( traceEnt->health <= 0 ) + if ( traceEnt->health <= 0 ) { return qtrue; } // don't deliberately shoot a teammate - if ( traceEnt->client && ( traceEnt->client->playerTeam == shooter->client->playerTeam ) ) + if ( traceEnt->client && ( traceEnt->client->playerTeam == shooter->client->playerTeam ) ) { return qfalse; } @@ -1357,31 +1373,31 @@ qboolean CanShoot ( gentity_t *ent, gentity_t *shooter ) /* -void NPC_CheckPossibleEnemy( gentity_t *other, visibility_t vis ) +void NPC_CheckPossibleEnemy( gentity_t *other, visibility_t vis ) Added: hacks for scripted NPCs */ -void NPC_CheckPossibleEnemy( gentity_t *other, visibility_t vis ) +void NPC_CheckPossibleEnemy( gentity_t *other, visibility_t vis ) { // is he is already our enemy? - if ( other == NPC->enemy ) + if ( other == NPC->enemy ) return; - if ( other->flags & FL_NOTARGET ) + if ( other->flags & FL_NOTARGET ) return; // we already have an enemy and this guy is in our FOV, see if this guy would be better - if ( NPC->enemy && vis == VIS_FOV ) + if ( NPC->enemy && vis == VIS_FOV ) { - if ( NPCInfo->enemyLastSeenTime - level.time < 2000 ) + if ( NPCInfo->enemyLastSeenTime - level.time < 2000 ) { return; } - if ( enemyVisibility == VIS_UNKNOWN ) + if ( enemyVisibility == VIS_UNKNOWN ) { enemyVisibility = NPC_CheckVisibility ( NPC->enemy, CHECK_360|CHECK_FOV ); } - if ( enemyVisibility == VIS_FOV ) + if ( enemyVisibility == VIS_FOV ) { return; } @@ -1392,14 +1408,14 @@ void NPC_CheckPossibleEnemy( gentity_t *other, visibility_t vis ) G_SetEnemy( NPC, other ); } - if ( vis == VIS_FOV ) + if ( vis == VIS_FOV ) { NPCInfo->enemyLastSeenTime = level.time; VectorCopy( other->currentOrigin, NPCInfo->enemyLastSeenLocation ); NPCInfo->enemyLastHeardTime = 0; VectorClear( NPCInfo->enemyLastHeardLocation ); - } - else + } + else { NPCInfo->enemyLastSeenTime = 0; VectorClear( NPCInfo->enemyLastSeenLocation ); @@ -1422,7 +1438,7 @@ Only makes you keep your weapon up after you fire */ int NPC_AttackDebounceForWeapon (void) { - switch ( NPC->client->ps.weapon ) + switch ( NPC->client->ps.weapon ) { /* case WP_BLASTER://scav rifle @@ -1436,7 +1452,7 @@ int NPC_AttackDebounceForWeapon (void) case WP_SABER: return 100; break; - + case WP_TRICORDER: return 0;//tricorder @@ -1455,7 +1471,7 @@ int NPC_AttackDebounceForWeapon (void) break; case WP_BOT_LASER: - + if ( g_spskill->integer == 0 ) return 2000; @@ -1479,7 +1495,7 @@ float NPC_MaxDistSquaredForWeapon (void) return NPCInfo->stats.shootDistance * NPCInfo->stats.shootDistance; } - switch ( NPC->s.weapon ) + switch ( NPC->s.weapon ) { case WP_BLASTER://scav rifle return 1024 * 1024;//should be shorter? @@ -1508,7 +1524,7 @@ float NPC_MaxDistSquaredForWeapon (void) case WP_SABER: return 1024 * 1024; break; - + case WP_TRICORDER: return 0;//tricorder @@ -1537,7 +1553,7 @@ qboolean NPC_EnemyTooFar(gentity_t *enemy, float dist, qboolean toShoot) { vec3_t vec; - + if ( !toShoot ) {//Not trying to actually press fire button with this check if ( NPC->client->ps.weapon == WP_SABER ) @@ -1545,7 +1561,7 @@ qboolean NPC_EnemyTooFar(gentity_t *enemy, float dist, qboolean toShoot) return qfalse; } } - + if(!dist) { @@ -1595,8 +1611,8 @@ gentity_t *NPC_PickEnemy( gentity_t *closestTo, int enemyTeam, qboolean checkVis return NULL; } - if ( NPCInfo->behaviorState == BS_STAND_AND_SHOOT || - NPCInfo->behaviorState == BS_HUNT_AND_KILL ) + if ( NPCInfo->behaviorState == BS_STAND_AND_SHOOT || + NPCInfo->behaviorState == BS_HUNT_AND_KILL ) {//Formations guys don't require inFov to pick up a target //These other behavior states are active battle states and should not //use FOV. FOV checks are for enemies who are patrolling, guarding, etc. @@ -1645,9 +1661,9 @@ gentity_t *NPC_PickEnemy( gentity_t *closestTo, int enemyTeam, qboolean checkVis {//They're only hidden from a certain direction, check float dot; VectorNormalize( diff ); - dot = DotProduct( newenemy->client->hiddenDir, diff ); + dot = DotProduct( newenemy->client->hiddenDir, diff ); if ( dot > 0.5 ) - {//I'm not looking in the right dir toward them to see them + {//I'm not looking in the right dir toward them to see them failed = qtrue; } else @@ -1788,9 +1804,9 @@ gentity_t *NPC_PickEnemy( gentity_t *closestTo, int enemyTeam, qboolean checkVis float dot; VectorNormalize( diff ); - dot = DotProduct( newenemy->client->hiddenDir, diff ); + dot = DotProduct( newenemy->client->hiddenDir, diff ); if ( dot > 0.5 ) - {//I'm not looking in the right dir toward them to see them + {//I'm not looking in the right dir toward them to see them continue; } else @@ -1855,7 +1871,7 @@ gentity_t *NPC_PickEnemy( gentity_t *closestTo, int enemyTeam, qboolean checkVis } } - + if (findClosest) {//FIXME: you can pick up an enemy around a corner this way. return closestEnemy; @@ -1962,7 +1978,7 @@ gentity_t *NPC_PickAlly ( qboolean facingEachOther, float range, qboolean ignore } } - + return closestAlly; } @@ -2046,7 +2062,7 @@ gentity_t *NPC_CheckEnemy( qboolean findNew, qboolean tooFarOk, qboolean setEnem } else if ( !gi.inPVS(NPC->currentOrigin, NPC->enemy->currentOrigin ) ) {//FIXME: should this be a line-of site check? - //FIXME: a lot of things check PVS AGAIN when deciding whether + //FIXME: a lot of things check PVS AGAIN when deciding whether //or not to shoot, redundant! //Should we lose the enemy? //FIXME: if lose enemy, run lostenemyscript @@ -2095,7 +2111,7 @@ gentity_t *NPC_CheckEnemy( qboolean findNew, qboolean tooFarOk, qboolean setEnem } closestTo = NPC; - //FIXME: check your defendEnt, if you have one, see if their enemy is different + //FIXME: check your defendEnt, if you have one, see if their enemy is different //than yours, or, if they don't have one, pick the closest enemy to THEM? if ( NPCInfo->defendEnt ) {//Trying to protect someone @@ -2154,7 +2170,7 @@ gentity_t *NPC_CheckEnemy( qboolean findNew, qboolean tooFarOk, qboolean setEnem } } } - + //if ( !forcefindNew ) { if ( !foundenemy ) @@ -2165,20 +2181,20 @@ gentity_t *NPC_CheckEnemy( qboolean findNew, qboolean tooFarOk, qboolean setEnem G_ClearEnemy(NPC); } } - + NPC->cantHitEnemyCounter = 0; } //FIXME: if we can't find any at all, go into INdependant NPC AI, pursue and kill } - if ( NPC->enemy && NPC->enemy->client ) + if ( NPC->enemy && NPC->enemy->client ) { if(NPC->enemy->client->playerTeam && NPC->enemy->client->playerTeam != TEAM_FREE) { // assert( NPC->client->playerTeam != NPC->enemy->client->playerTeam); - if( NPC->client->playerTeam != NPC->enemy->client->playerTeam - && NPC->client->enemyTeam != TEAM_FREE + if( NPC->client->playerTeam != NPC->enemy->client->playerTeam + && NPC->client->enemyTeam != TEAM_FREE && NPC->client->enemyTeam != NPC->enemy->client->playerTeam ) { NPC->client->enemyTeam = NPC->enemy->client->playerTeam; @@ -2218,15 +2234,15 @@ qboolean NPC_ClearShot( gentity_t *ent ) { gi.trace ( &tr, muzzle, NULL, NULL, ent->currentOrigin, NPC->s.number, MASK_SHOT, (EG2_Collision)0, 0 ); } - + if ( tr.startsolid || tr.allsolid ) { return qfalse; } - if ( tr.entityNum == ent->s.number ) + if ( tr.entityNum == ent->s.number ) return qtrue; - + return qfalse; } @@ -2263,7 +2279,7 @@ int NPC_ShotEntity( gentity_t *ent, vec3_t impactPos ) CalcEntitySpot( NPC, SPOT_WEAPON, muzzle ); } CalcEntitySpot( ent, SPOT_CHEST, targ ); - + // add aim error // use weapon instead of specific npc types, although you could add certain npc classes if you wanted // if ( NPC->client->playerTeam == TEAM_SCAVENGERS ) @@ -2377,7 +2393,7 @@ qboolean NPC_CheckCanAttack (float attack_scale, qboolean stationary) NPC_AimWiggle( enemy_org ); CalcEntitySpot( NPC, SPOT_WEAPON, muzzle ); - + VectorSubtract (enemy_org, muzzle, delta); vectoangles ( delta, angleToEnemy ); distanceToEnemy = VectorNormalize(delta); @@ -2408,7 +2424,7 @@ qboolean NPC_CheckCanAttack (float attack_scale, qboolean stationary) if(enemyVisibility >= VIS_FOV) {//He's in our FOV - + attack_ok = qtrue; //CalcEntitySpot( NPC->enemy, SPOT_HEAD, enemy_head); @@ -2502,7 +2518,7 @@ qboolean NPC_CheckCanAttack (float attack_scale, qboolean stationary) {//Too close to shoot! attack_ok = qfalse; } - else + else {//Hey, it might kill him, do it! attack_scale *= 2;// } @@ -2558,12 +2574,12 @@ IdealDistance determines what the NPC's ideal distance from it's enemy should be in the current situation */ -float IdealDistance ( gentity_t *self ) +float IdealDistance ( gentity_t *self ) { float ideal; ideal = 225 - 20 * NPCInfo->stats.aggression; - switch ( NPC->s.weapon ) + switch ( NPC->s.weapon ) { case WP_ROCKET_LAUNCHER: ideal += 200; @@ -2659,7 +2675,7 @@ NPC_CollectCombatPoints ------------------------- */ -typedef map< float, int > combatPoint_m; +typedef std::map< float, int > combatPoint_m; static int NPC_CollectCombatPoints( const vec3_t origin, const float radius, combatPoint_m &points, const int flags ) { @@ -2688,7 +2704,7 @@ static int NPC_CollectCombatPoints( const vec3_t origin, const float radius, com ///Make sure this is an investigate combat point if ( ( flags & CP_INVESTIGATE ) && ( level.combatPoints[i].flags & CPF_INVESTIGATE ) ) continue; - + //Squad points are only valid if we're looking for them if ( ( level.combatPoints[i].flags & CPF_SQUAD ) && ( ( flags & CP_SQUAD ) == qfalse ) ) continue; @@ -2742,7 +2758,7 @@ int NPC_FindCombatPoint( const vec3_t position, const vec3_t avoidPosition, vec3 vec3_t eDir2Me, eDir2CP, weaponOffset; vec3_t enemyPosition; float dotToCp; - float distSqPointToNPC; + //float distSqPointToNPC; float distSqPointToEnemy; float distSqPointToEnemyHoriz; float distSqPointToEnemyCheck; @@ -2797,7 +2813,7 @@ int NPC_FindCombatPoint( const vec3_t position, const vec3_t avoidPosition, vec3 } //Get some distances for reasoning - distSqPointToNPC = (*cpi).first; + //distSqPointToNPC = (*cpi).first; distSqPointToEnemy = DistanceSquared (level.combatPoints[i].origin, enemyPosition); distSqPointToEnemyHoriz = DistanceHorizontalSquared(level.combatPoints[i].origin, enemyPosition); @@ -2843,7 +2859,7 @@ int NPC_FindCombatPoint( const vec3_t position, const vec3_t avoidPosition, vec3 VectorNormalize( eDir2CP ); dotToCp = DotProduct( eDir2Me, eDir2CP ); - + //Not far enough behind enemy from current pos if ( dotToCp >= 0.4 ) { @@ -2911,19 +2927,19 @@ int NPC_FindCombatPoint( const vec3_t position, const vec3_t avoidPosition, vec3 return best; } -int NPC_FindCombatPointRetry( const vec3_t position, - const vec3_t avoidPosition, - vec3_t destPosition, - int *cpFlags, - float avoidDist, +int NPC_FindCombatPointRetry( const vec3_t position, + const vec3_t avoidPosition, + vec3_t destPosition, + int *cpFlags, + float avoidDist, const int ignorePoint ) { int cp = -1; - cp = NPC_FindCombatPoint( position, - avoidPosition, - destPosition, - *cpFlags, - avoidDist, + cp = NPC_FindCombatPoint( position, + avoidPosition, + destPosition, + *cpFlags, + avoidDist, ignorePoint ); while ( cp == -1 && (*cpFlags&~CP_HAS_ROUTE) != CP_ANY ) {//start "OR"ing out certain flags to see if we can find *any* point @@ -3009,13 +3025,13 @@ int NPC_FindCombatPointRetry( const vec3_t position, */ } //now try again - cp = NPC_FindCombatPoint( position, - avoidPosition, - destPosition, - *cpFlags, - avoidDist, + cp = NPC_FindCombatPoint( position, + avoidPosition, + destPosition, + *cpFlags, + avoidDist, ignorePoint ); - } + } return cp; } /* @@ -3040,7 +3056,7 @@ int NPC_FindSquadPoint( vec3_t position ) //Must be vacant if ( level.combatPoints[i].occupied == qtrue ) continue; - + dist = DistanceSquared( position, level.combatPoints[i].origin ); //The point cannot take us past the player @@ -3102,7 +3118,7 @@ qboolean NPC_FreeCombatPoint( int combatPointID, qboolean failed ) //Free it level.combatPoints[combatPointID].occupied = qfalse; - + return qtrue; } @@ -3148,9 +3164,9 @@ gentity_t *NPC_SearchForWeapons( void ) // } if(!PInUse(i)) continue; - + found=&g_entities[i]; - + //FIXME: Also look for ammo_racks that have weapons on them? if ( found->s.eType != ET_ITEM ) { @@ -3201,14 +3217,14 @@ extern void Q3_TaskIDComplete( gentity_t *ent, taskID_t taskType ); extern qboolean G_CanPickUpWeapons( gentity_t *other ); void NPC_CheckGetNewWeapon( void ) { - if ( NPC->client + if ( NPC->client && !G_CanPickUpWeapons( NPC ) ) {//this NPC can't pick up weapons... return; } if ( NPC->s.weapon == WP_NONE && NPC->enemy ) {//if running away because dropped weapon... - if ( NPCInfo->goalEntity + if ( NPCInfo->goalEntity && NPCInfo->goalEntity == NPCInfo->tempGoal && NPCInfo->goalEntity->enemy && !NPCInfo->goalEntity->enemy->inuse ) diff --git a/code/game/NPC_goal.cpp b/code/game/NPC_goal.cpp index bf3861d502..9fa60ed56f 100644 --- a/code/game/NPC_goal.cpp +++ b/code/game/NPC_goal.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //b_goal.cpp #include "b_local.h" diff --git a/code/game/NPC_misc.cpp b/code/game/NPC_misc.cpp index 29c79f46f0..e02b3f19fb 100644 --- a/code/game/NPC_misc.cpp +++ b/code/game/NPC_misc.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // // NPC_misc.cpp diff --git a/code/game/NPC_move.cpp b/code/game/NPC_move.cpp index 468efb0aca..3fe8ab88fa 100644 --- a/code/game/NPC_move.cpp +++ b/code/game/NPC_move.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // // NPC_move.cpp diff --git a/code/game/NPC_reactions.cpp b/code/game/NPC_reactions.cpp index c6d74cc7c2..c329d2a567 100644 --- a/code/game/NPC_reactions.cpp +++ b/code/game/NPC_reactions.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //NPC_reactions.cpp diff --git a/code/game/NPC_senses.cpp b/code/game/NPC_senses.cpp index 498beabc31..0ec223e6d8 100644 --- a/code/game/NPC_senses.cpp +++ b/code/game/NPC_senses.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //NPC_senses.cpp diff --git a/code/game/NPC_sounds.cpp b/code/game/NPC_sounds.cpp index 6b433bb0cc..978637e93a 100644 --- a/code/game/NPC_sounds.cpp +++ b/code/game/NPC_sounds.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //NPC_sounds.cpp diff --git a/code/game/NPC_spawn.cpp b/code/game/NPC_spawn.cpp index d6e3ecc343..b75e75bf48 100644 --- a/code/game/NPC_spawn.cpp +++ b/code/game/NPC_spawn.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //b_spawn.cpp //added by MCG @@ -1632,7 +1636,31 @@ gentity_t *NPC_Spawn_Do( gentity_t *ent, qboolean fullSpawnNow ) newent->m_pVehicle->m_pParentEntity = newent; newent->m_pVehicle->m_pVehicleInfo->Initialize( newent->m_pVehicle ); newent->client->NPC_class = CLASS_VEHICLE; - + if ( g_vehicleInfo[iVehIndex].type == VH_FIGHTER ) + {//FIXME: EXTERN!!! + newent->flags |= (FL_NO_KNOCKBACK|FL_SHIELDED);//don't get pushed around, blasters bounce off + } + //WTF?!!! Ships spawning in pointing straight down! + //set them up to start landed + newent->m_pVehicle->m_vOrientation[YAW] = ent->s.angles[YAW]; + newent->m_pVehicle->m_vOrientation[PITCH] = newent->m_pVehicle->m_vOrientation[ROLL] = 0.0f; + G_SetAngles( newent, newent->m_pVehicle->m_vOrientation ); + SetClientViewAngle( newent, newent->m_pVehicle->m_vOrientation ); + + //newent->m_pVehicle->m_ulFlags |= VEH_GEARSOPEN; + //why? this would just make it so the initial anim never got played... -rww + //There was no initial anim, it would just open the gear even though it's already on the ground (fixed now, made an initial anim) + + //For SUSPEND spawnflag, the amount of time to drop like a rock after SUSPEND turns off + newent->fly_sound_debounce_time = ent->fly_sound_debounce_time; + + //for no-pilot-death delay + newent->damage = ent->damage; + + //no-pilot-death distance + newent->speed = ent->speed; + + newent->model2 = ent->model2;//for droidNPC } else { @@ -4096,9 +4124,8 @@ static void NPC_Spawn_f(void) NPCspawner->e_ThinkFunc = thinkF_G_FreeEntity; NPCspawner->nextthink = level.time + FRAMETIME; - char *npc_type = gi.argv( 2 ); - if (!npc_type ) + if (!npc_type || !npc_type[0] ) { gi.Printf( S_COLOR_RED"Error, expected:\n NPC spawn [NPC type (from NCPCs.cfg)]\n" ); return; @@ -4108,7 +4135,7 @@ static void NPC_Spawn_f(void) {//spawning a vehicle isVehicle = qtrue; npc_type = gi.argv( 3 ); - if (!npc_type ) + if (!npc_type || !npc_type[0] ) { gi.Printf( S_COLOR_RED"Error, expected:\n NPC spawn vehicle [NPC type (from NCPCs.cfg)]\n" ); return; @@ -4169,6 +4196,10 @@ static void NPC_Spawn_f(void) NPCspawner->spawnflags |= 4; SP_NPC_Jedi( NPCspawner ); } + else if ( isVehicle ) + { + SP_NPC_Vehicle( NPCspawner ); + } else { NPC_Spawn( NPCspawner, NPCspawner, NPCspawner ); diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index b1514fd650..19611d82ce 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //NPC_stats.cpp #include "b_local.h" @@ -36,26 +40,26 @@ extern vec3_t playerMins; extern vec3_t playerMaxs; extern stringID_table_t WPTable[]; -#define MAX_MODELS_PER_LEVEL 40 +#define MAX_MODELS_PER_LEVEL 60 hstring modelsAlreadyDone[MAX_MODELS_PER_LEVEL]; -stringID_table_t animEventTypeTable[] = +stringID_table_t animEventTypeTable[] = { ENUM2STRING(AEV_SOUND), //# animID AEV_SOUND framenum soundpath randomlow randomhi chancetoplay ENUM2STRING(AEV_FOOTSTEP), //# animID AEV_FOOTSTEP framenum footstepType ENUM2STRING(AEV_EFFECT), //# animID AEV_EFFECT framenum effectpath boltName ENUM2STRING(AEV_FIRE), //# animID AEV_FIRE framenum altfire chancetofire ENUM2STRING(AEV_MOVE), //# animID AEV_MOVE framenum forwardpush rightpush uppush - ENUM2STRING(AEV_SOUNDCHAN), //# animID AEV_SOUNDCHAN framenum CHANNEL soundpath randomlow randomhi chancetoplay - ENUM2STRING(AEV_SABER_SWING), //# animID AEV_SABER_SWING framenum CHANNEL randomlow randomhi chancetoplay - ENUM2STRING(AEV_SABER_SPIN), //# animID AEV_SABER_SPIN framenum CHANNEL chancetoplay + ENUM2STRING(AEV_SOUNDCHAN), //# animID AEV_SOUNDCHAN framenum CHANNEL soundpath randomlow randomhi chancetoplay + ENUM2STRING(AEV_SABER_SWING), //# animID AEV_SABER_SWING framenum CHANNEL randomlow randomhi chancetoplay + ENUM2STRING(AEV_SABER_SPIN), //# animID AEV_SABER_SPIN framenum CHANNEL chancetoplay //must be terminated { NULL,-1 } }; -stringID_table_t footstepTypeTable[] = +stringID_table_t footstepTypeTable[] = { ENUM2STRING(FOOTSTEP_R), ENUM2STRING(FOOTSTEP_L), @@ -108,10 +112,10 @@ stringID_table_t ClassTable[] = ENUM2STRING(CLASS_NONE), // hopefully this will never be used by an npc), just covering all bases ENUM2STRING(CLASS_ATST), // technically droid... ENUM2STRING(CLASS_BARTENDER), - ENUM2STRING(CLASS_BESPIN_COP), + ENUM2STRING(CLASS_BESPIN_COP), ENUM2STRING(CLASS_CLAW), ENUM2STRING(CLASS_COMMANDO), - ENUM2STRING(CLASS_DESANN), + ENUM2STRING(CLASS_DESANN), ENUM2STRING(CLASS_FISH), ENUM2STRING(CLASS_FLIER2), ENUM2STRING(CLASS_GALAK), @@ -124,18 +128,18 @@ stringID_table_t ClassTable[] = ENUM2STRING(CLASS_WAMPA), ENUM2STRING(CLASS_IMPERIAL), ENUM2STRING(CLASS_IMPWORKER), - ENUM2STRING(CLASS_INTERROGATOR), // droid - ENUM2STRING(CLASS_JAN), - ENUM2STRING(CLASS_JEDI), + ENUM2STRING(CLASS_INTERROGATOR), // droid + ENUM2STRING(CLASS_JAN), + ENUM2STRING(CLASS_JEDI), ENUM2STRING(CLASS_KYLE), - ENUM2STRING(CLASS_LANDO), + ENUM2STRING(CLASS_LANDO), ENUM2STRING(CLASS_LIZARD), - ENUM2STRING(CLASS_LUKE), + ENUM2STRING(CLASS_LUKE), ENUM2STRING(CLASS_MARK1), // droid ENUM2STRING(CLASS_MARK2), // droid ENUM2STRING(CLASS_GALAKMECH), // droid ENUM2STRING(CLASS_MINEMONSTER), - ENUM2STRING(CLASS_MONMOTHA), + ENUM2STRING(CLASS_MONMOTHA), ENUM2STRING(CLASS_MORGANKATARN), ENUM2STRING(CLASS_MOUSE), // droid ENUM2STRING(CLASS_MURJJ), @@ -178,7 +182,7 @@ stringID_table_t ClassTable[] = NPC_ReactionTime */ //FIXME use grandom in here -int NPC_ReactionTime ( void ) +int NPC_ReactionTime ( void ) { return 200 * ( 6 - NPCInfo->stats.reactions ); } @@ -187,18 +191,18 @@ int NPC_ReactionTime ( void ) // parse support routines // -qboolean G_ParseLiteral( const char **data, const char *string ) +qboolean G_ParseLiteral( const char **data, const char *string ) { const char *token; token = COM_ParseExt( data, qtrue ); - if ( token[0] == 0 ) + if ( token[0] == 0 ) { gi.Printf( "unexpected EOF\n" ); return qtrue; } - if ( Q_stricmp( token, string ) ) + if ( Q_stricmp( token, string ) ) { gi.Printf( "required string '%s' missing\n", string ); return qtrue; @@ -210,52 +214,52 @@ qboolean G_ParseLiteral( const char **data, const char *string ) // // NPC parameters file : ext_data/NPCs/*.npc* // -#define MAX_NPC_DATA_SIZE 0x40000 +#define MAX_NPC_DATA_SIZE 0x80000 char NPCParms[MAX_NPC_DATA_SIZE]; /* -static rank_t TranslateRankName( const char *name ) +static rank_t TranslateRankName( const char *name ) Should be used to determine pip bolt-ons */ -static rank_t TranslateRankName( const char *name ) +static rank_t TranslateRankName( const char *name ) { - if ( !Q_stricmp( name, "civilian" ) ) + if ( !Q_stricmp( name, "civilian" ) ) { return RANK_CIVILIAN; } - if ( !Q_stricmp( name, "crewman" ) ) + if ( !Q_stricmp( name, "crewman" ) ) { return RANK_CREWMAN; } - - if ( !Q_stricmp( name, "ensign" ) ) + + if ( !Q_stricmp( name, "ensign" ) ) { return RANK_ENSIGN; } - - if ( !Q_stricmp( name, "ltjg" ) ) + + if ( !Q_stricmp( name, "ltjg" ) ) { return RANK_LT_JG; } - - if ( !Q_stricmp( name, "lt" ) ) + + if ( !Q_stricmp( name, "lt" ) ) { return RANK_LT; } - - if ( !Q_stricmp( name, "ltcomm" ) ) + + if ( !Q_stricmp( name, "ltcomm" ) ) { return RANK_LT_COMM; } - - if ( !Q_stricmp( name, "commander" ) ) + + if ( !Q_stricmp( name, "commander" ) ) { return RANK_COMMANDER; } - - if ( !Q_stricmp( name, "captain" ) ) + + if ( !Q_stricmp( name, "captain" ) ) { return RANK_CAPTAIN; } @@ -263,33 +267,33 @@ static rank_t TranslateRankName( const char *name ) return RANK_CIVILIAN; } -saber_colors_t TranslateSaberColor( const char *name ) +saber_colors_t TranslateSaberColor( const char *name ) { - if ( !Q_stricmp( name, "red" ) ) + if ( !Q_stricmp( name, "red" ) ) { return SABER_RED; } - if ( !Q_stricmp( name, "orange" ) ) + if ( !Q_stricmp( name, "orange" ) ) { return SABER_ORANGE; } - if ( !Q_stricmp( name, "yellow" ) ) + if ( !Q_stricmp( name, "yellow" ) ) { return SABER_YELLOW; } - if ( !Q_stricmp( name, "green" ) ) + if ( !Q_stricmp( name, "green" ) ) { return SABER_GREEN; } - if ( !Q_stricmp( name, "blue" ) ) + if ( !Q_stricmp( name, "blue" ) ) { return SABER_BLUE; } - if ( !Q_stricmp( name, "purple" ) ) + if ( !Q_stricmp( name, "purple" ) ) { return SABER_PURPLE; } - if ( !Q_stricmp( name, "random" ) ) + if ( !Q_stricmp( name, "random" ) ) { return ((saber_colors_t)(Q_irand( SABER_ORANGE, SABER_PURPLE ))); } @@ -330,7 +334,7 @@ static int ItemNameToNumber( const char *name, int itemType ) { } */ -static int MoveTypeNameToEnum( const char *name ) +static int MoveTypeNameToEnum( const char *name ) { if(!Q_stricmp("runjump", name)) { @@ -417,10 +421,10 @@ static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, cons char stringData[MAX_QPATH]; // get past starting bracket - while(1) + while(1) { token = COM_Parse( text_p ); - if ( !Q_stricmp( token, "{" ) ) + if ( !Q_stricmp( token, "{" ) ) { break; } @@ -431,21 +435,21 @@ static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, cons // has an event of that type, it stomps it // read information for each frame - while ( 1 ) + while ( 1 ) { // Get base frame of sequence token = COM_Parse( text_p ); - if ( !token || !token[0]) + if ( !token || !token[0]) { break; } - if ( !Q_stricmp( token, "}" ) ) // At end of block + if ( !Q_stricmp( token, "}" ) ) // At end of block { break; } - //Compare to same table as animations used + //Compare to same table as animations used // so we don't have to use actual numbers for animation first frames, // just need offsets. //This way when animation numbers change, this table won't have to be updated, @@ -479,13 +483,13 @@ static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, cons // Get offset to frame within sequence token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) { break; } keyFrame = atoi( token ); - if ( bIsFrameSkipped && + if ( bIsFrameSkipped && (animations[animNum].numFrames>2) // important, else frame 1 gets divided down and becomes frame 0. Carcass & Assimilate also work this way ) { @@ -521,7 +525,7 @@ static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, cons { case AEV_SOUNDCHAN: //# animID AEV_SOUNDCHAN framenum CHANNEL soundpath randomlow randomhi chancetoplay token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) { break; } @@ -548,7 +552,7 @@ static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, cons else if ( Q_stricmp( token, "CHAN_VOICE" ) == 0 ) { animEvents[curAnimEvent].eventData[AED_SOUNDCHANNEL] = CHAN_VOICE; - } + } else { animEvents[curAnimEvent].eventData[AED_SOUNDCHANNEL] = CHAN_AUTO; @@ -557,21 +561,21 @@ static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, cons case AEV_SOUND: //# animID AEV_SOUND framenum soundpath randomlow randomhi chancetoplay //get soundstring token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) { break; } strcpy(stringData, token); //get lowest value token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) {//WARNING! BAD TABLE! break; } lowestVal = atoi( token ); //get highest value token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) {//WARNING! BAD TABLE! break; } @@ -601,7 +605,7 @@ static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, cons } //get probability token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) {//WARNING! BAD TABLE! break; } @@ -660,14 +664,14 @@ static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, cons case AEV_FOOTSTEP: //# animID AEV_FOOTSTEP framenum footstepType //get footstep type token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) { break; - } + } animEvents[curAnimEvent].eventData[AED_FOOTSTEP_TYPE] = GetIDForString(footstepTypeTable, token); //get probability token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) {//WARNING! BAD TABLE! break; } @@ -676,7 +680,7 @@ static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, cons case AEV_EFFECT: //# animID AEV_EFFECT framenum effectpath boltName //get effect index token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) { break; } @@ -695,10 +699,10 @@ static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, cons animEvents[curAnimEvent].eventData[AED_EFFECTINDEX] = tempVal; //get bolt index token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) { break; - } + } if ( Q_stricmp( "none", token ) != 0 && Q_stricmp( "NULL", token ) != 0 ) {//actually are specifying a bolt to use animEvents[curAnimEvent].stringData = G_NewString( token ); @@ -708,7 +712,7 @@ static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, cons //animEvent->eventData[AED_BOLTINDEX] = gi.G2API_AddBolt( ¢->gent->ghoul2[cent->gent->playerModel], animEvent->stringData ); //get probability token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) {//WARNING! BAD TABLE! break; } @@ -717,14 +721,14 @@ static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, cons case AEV_FIRE: //# animID AEV_FIRE framenum altfire chancetofire //get altfire token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) {//WARNING! BAD TABLE! break; } animEvents[curAnimEvent].eventData[AED_FIRE_ALT] = atoi( token ); //get probability token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) {//WARNING! BAD TABLE! break; } @@ -733,7 +737,7 @@ static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, cons case AEV_MOVE: //# animID AEV_MOVE framenum forwardpush rightpush uppush //get forward push token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) {//WARNING! BAD TABLE! break; } @@ -742,7 +746,7 @@ static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, cons animEvents[curAnimEvent].eventData[AED_MOVE_FWD] = tempVal; //get right push token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) {//WARNING! BAD TABLE! break; } @@ -751,7 +755,7 @@ static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, cons animEvents[curAnimEvent].eventData[AED_MOVE_RT] = tempVal; //get upwards push token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) {//WARNING! BAD TABLE! break; } @@ -769,7 +773,7 @@ static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, cons { lastAnimEvent++; } - } + } } @@ -805,11 +809,11 @@ void G_ParseAnimationEvtFile(int glaIndex, const char* eventsDirectory, int file //------------------------------------- Com_sprintf(eventsPath, MAX_QPATH, "models/players/%s/animevents.cfg", eventsDirectory); len = cgi_FS_FOpenFile(eventsPath, &f, FS_READ); - if ( len <= 0 ) + if ( len <= 0 ) {//no file return; } - if ( len >= (int)(sizeof( text ) - 1) ) + if ( len >= (int)(sizeof( text ) - 1) ) { cgi_FS_FCloseFile( f ); CG_Printf( "File %s too long\n", eventsPath ); @@ -840,11 +844,11 @@ void G_ParseAnimationEvtFile(int glaIndex, const char* eventsDirectory, int file // read information for batches of sounds (UPPER or LOWER) COM_BeginParseSession(); - while ( 1 ) + while ( 1 ) { // Get base frame of sequence token = COM_Parse( &text_p ); - if ( !token || !token[0] ) + if ( !token || !token[0] ) { break; } @@ -852,12 +856,12 @@ void G_ParseAnimationEvtFile(int glaIndex, const char* eventsDirectory, int file //these stomp anything set in the include file (if it's an event of the same type on the same frame)! if ( !Q_stricmp(token,"UPPEREVENTS") ) // A batch of upper events { - ParseAnimationEvtBlock(glaIndex, modelIndex, eventsPath, torsoAnimEvents, animations, afileset.torsoAnimEventCount, &text_p, bIsFrameSkipped); + ParseAnimationEvtBlock(glaIndex, modelIndex, eventsPath, torsoAnimEvents, animations, afileset.torsoAnimEventCount, &text_p, bIsFrameSkipped); } else if ( !Q_stricmp(token,"LOWEREVENTS") ) // A batch of lower events { - ParseAnimationEvtBlock(glaIndex, modelIndex, eventsPath, legsAnimEvents, animations, afileset.legsAnimEventCount, &text_p, bIsFrameSkipped); + ParseAnimationEvtBlock(glaIndex, modelIndex, eventsPath, legsAnimEvents, animations, afileset.legsAnimEventCount, &text_p, bIsFrameSkipped); } } COM_EndParseSession(); @@ -872,7 +876,7 @@ models/players/visor/animation.cfg, etc ====================== */ -qboolean G_ParseAnimationFile(int glaIndex, const char *skeletonName, int fileIndex) +qboolean G_ParseAnimationFile(int glaIndex, const char *skeletonName, int fileIndex) { char text[80000]; int len = 0; @@ -888,16 +892,16 @@ qboolean G_ParseAnimationFile(int glaIndex, const char *skeletonName, int fileIn //------------------------------------------------------------------------------- Com_sprintf(skeletonPath, MAX_QPATH, "models/players/%s/%s.cfg", skeletonName, skeletonName); len = gi.RE_GetAnimationCFG(skeletonPath, text, sizeof(text)); - if ( len <= 0 ) + if ( len <= 0 ) { Com_sprintf(skeletonPath, MAX_QPATH, "models/players/%s/animation.cfg", skeletonName); len = gi.RE_GetAnimationCFG(skeletonPath, text, sizeof(text)); - if ( len <= 0 ) + if ( len <= 0 ) { return qfalse; } } - if ( len >= (int)(sizeof( text ) - 1) ) + if ( len >= (int)(sizeof( text ) - 1) ) { G_Error( "G_ParseAnimationFile: File %s too long\n (%d > %d)", skeletonName, len, sizeof( text ) - 1); return qfalse; @@ -908,13 +912,13 @@ qboolean G_ParseAnimationFile(int glaIndex, const char *skeletonName, int fileIn // Read In Each Token //-------------------- COM_BeginParseSession(); - while(1) + while(1) { token = COM_Parse( &text_p ); // If No Token, We've Reached The End Of The File //------------------------------------------------ - if ( !token || !token[0]) + if ( !token || !token[0]) { break; } @@ -930,7 +934,7 @@ qboolean G_ParseAnimationFile(int glaIndex, const char *skeletonName, int fileIn Com_Printf(S_COLOR_RED"WARNING: Unknown token %s in %s\n", token, skeletonPath); } #endif - //unrecognized animation so skip to end of line, + //unrecognized animation so skip to end of line, while (token[0]) { token = COM_ParseExt( &text_p, qfalse ); //returns empty string when next token is EOL @@ -945,7 +949,7 @@ qboolean G_ParseAnimationFile(int glaIndex, const char *skeletonName, int fileIn // First Frame //------------- token = COM_Parse( &text_p ); - if ( !token ) + if ( !token ) { break; } @@ -955,7 +959,7 @@ qboolean G_ParseAnimationFile(int glaIndex, const char *skeletonName, int fileIn // Num Frames //------------ token = COM_Parse( &text_p ); - if ( !token ) + if ( !token ) { break; } @@ -965,7 +969,7 @@ qboolean G_ParseAnimationFile(int glaIndex, const char *skeletonName, int fileIn // Loop Frames //------------- token = COM_Parse( &text_p ); - if ( !token ) + if ( !token ) { break; } @@ -975,12 +979,12 @@ qboolean G_ParseAnimationFile(int glaIndex, const char *skeletonName, int fileIn // FPS //----- token = COM_Parse( &text_p ); - if ( !token ) + if ( !token ) { break; } fps = atof( token ); - if ( fps == 0 ) + if ( fps == 0 ) { fps = 1;//Don't allow divide by zero error } @@ -1029,7 +1033,7 @@ qboolean G_ParseAnimationFile(int glaIndex, const char *skeletonName, int fileIn //////////////////////////////////////////////////////////////////////// // G_ParseAnimFileSet // -// This function is responsible for building the animation file and +// This function is responsible for building the animation file and // the animation event file. // //////////////////////////////////////////////////////////////////////// @@ -1093,14 +1097,14 @@ int G_ParseAnimFileSet(const char *skeletonName, const char *modelName=0) legsAnimEvents[i].eventType = AEV_NONE; torsoAnimEvents[i].keyFrame = (unsigned short)-1; //65535 should never be a valid frame... :) legsAnimEvents[i].keyFrame = (unsigned short)-1; //Frame to play event on - torsoAnimEvents[i].stringData = NULL; //we allow storage of one string, temporarily (in case we have to look up an index later, + torsoAnimEvents[i].stringData = NULL; //we allow storage of one string, temporarily (in case we have to look up an index later, legsAnimEvents[i].stringData = NULL; //then make sure to set stringData to NULL so we only do the look-up once) torsoAnimEvents[i].modelOnly = 0; legsAnimEvents[i].modelOnly = 0; torsoAnimEvents[i].glaIndex = 0; legsAnimEvents[i].glaIndex = 0; - + for (j=0; jplayerModel == -1 ) { return; @@ -1216,7 +1220,7 @@ void G_LoadAnimFileSet( gentity_t *ent, const char *pModelName ) //get the location of the animation.cfg GLAName = gi.G2API_GetGLAName( &ent->ghoul2[ent->playerModel] ); //now load and parse the animation.cfg, animevents.cfg and set the animFileIndex - if ( !GLAName) + if ( !GLAName) { Com_Printf( S_COLOR_RED"Failed find animation file name models/players/%s\n", modelName ); strippedName="_humanoid"; //take a guess, maybe it's right? @@ -1235,7 +1239,7 @@ void G_LoadAnimFileSet( gentity_t *ent, const char *pModelName ) //now load and parse the animation.cfg, animevents.cfg and set the animFileIndex ent->client->clientInfo.animFileIndex = G_ParseAnimFileSet(strippedName, modelName); - if (ent->client->clientInfo.animFileIndex<0) + if (ent->client->clientInfo.animFileIndex<0) { Com_Printf( S_COLOR_RED"Failed to load animation file set models/players/%s/animation.cfg\n", modelName ); #ifndef FINAL_BUILD @@ -1261,7 +1265,7 @@ void NPC_PrecacheAnimationCFG( const char *NPC_type ) COM_BeginParseSession(); // look for the right NPC - while ( p ) + while ( p ) { token = COM_ParseExt( &p, qtrue ); if ( token[0] == 0 ) @@ -1270,7 +1274,7 @@ void NPC_PrecacheAnimationCFG( const char *NPC_type ) return; } - if ( !Q_stricmp( token, NPC_type ) ) + if ( !Q_stricmp( token, NPC_type ) ) { break; } @@ -1278,38 +1282,38 @@ void NPC_PrecacheAnimationCFG( const char *NPC_type ) SkipBracedSection( &p ); } - if ( !p ) + if ( !p ) { COM_EndParseSession( ); return; } - if ( G_ParseLiteral( &p, "{" ) ) + if ( G_ParseLiteral( &p, "{" ) ) { COM_EndParseSession( ); return; } // parse the NPC info block - while ( 1 ) + while ( 1 ) { token = COM_ParseExt( &p, qtrue ); - if ( !token[0] ) + if ( !token[0] ) { gi.Printf( S_COLOR_RED"ERROR: unexpected EOF while parsing '%s'\n", NPC_type ); COM_EndParseSession( ); return; } - if ( !Q_stricmp( token, "}" ) ) + if ( !Q_stricmp( token, "}" ) ) { break; } // legsmodel - if ( !Q_stricmp( token, "legsmodel" ) ) + if ( !Q_stricmp( token, "legsmodel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1321,9 +1325,9 @@ void NPC_PrecacheAnimationCFG( const char *NPC_type ) } // playerModel - if ( !Q_stricmp( token, "playerModel" ) ) + if ( !Q_stricmp( token, "playerModel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1374,8 +1378,8 @@ void NPC_PrecacheWeapons( team_t playerTeam, int spawnflags, char *NPCtype ) //precache the in-hand/in-world ghoul2 weapon model char weaponModel[64]; - - strcpy (weaponModel, weaponData[curWeap].weaponMdl); + + strcpy (weaponModel, weaponData[curWeap].weaponMdl); if (char *spot = strstr(weaponModel, ".md3") ) { *spot = 0; spot = strstr(weaponModel, "_w");//i'm using the in view weapon array instead of scanning the item list, so put the _w back on @@ -1596,7 +1600,7 @@ void CG_NPC_Precache ( gentity_t *spawner ) COM_BeginParseSession(); // look for the right NPC - while ( p ) + while ( p ) { token = COM_ParseExt( &p, qtrue ); if ( token[0] == 0 ) @@ -1605,7 +1609,7 @@ void CG_NPC_Precache ( gentity_t *spawner ) return; } - if ( !Q_stricmp( token, spawner->NPC_type ) ) + if ( !Q_stricmp( token, spawner->NPC_type ) ) { break; } @@ -1613,40 +1617,40 @@ void CG_NPC_Precache ( gentity_t *spawner ) SkipBracedSection( &p ); } - if ( !p ) + if ( !p ) { COM_EndParseSession( ); return; } - if ( G_ParseLiteral( &p, "{" ) ) + if ( G_ParseLiteral( &p, "{" ) ) { COM_EndParseSession( ); return; } // parse the NPC info block - while ( 1 ) + while ( 1 ) { COM_EndParseSession(); // if still in session (or using continue;) COM_BeginParseSession(); token = COM_ParseExt( &p, qtrue ); - if ( !token[0] ) + if ( !token[0] ) { gi.Printf( S_COLOR_RED"ERROR: unexpected EOF while parsing '%s'\n", spawner->NPC_type ); COM_EndParseSession( ); return; } - if ( !Q_stricmp( token, "}" ) ) + if ( !Q_stricmp( token, "}" ) ) { break; } // headmodel - if ( !Q_stricmp( token, "headmodel" ) ) + if ( !Q_stricmp( token, "headmodel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1661,11 +1665,11 @@ void CG_NPC_Precache ( gentity_t *spawner ) md3Model = qtrue; continue; } - + // torsomodel - if ( !Q_stricmp( token, "torsomodel" ) ) + if ( !Q_stricmp( token, "torsomodel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1682,44 +1686,44 @@ void CG_NPC_Precache ( gentity_t *spawner ) } // legsmodel - if ( !Q_stricmp( token, "legsmodel" ) ) + if ( !Q_stricmp( token, "legsmodel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } - Q_strncpyz( ri.legsModelName, value, sizeof(ri.legsModelName), qtrue); + Q_strncpyz( ri.legsModelName, value, sizeof(ri.legsModelName), qtrue); md3Model = qtrue; continue; } // playerModel - if ( !Q_stricmp( token, "playerModel" ) ) + if ( !Q_stricmp( token, "playerModel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } - Q_strncpyz( playerModel, value, sizeof(playerModel), qtrue); + Q_strncpyz( playerModel, value, sizeof(playerModel), qtrue); md3Model = qfalse; continue; } // customSkin - if ( !Q_stricmp( token, "customSkin" ) ) + if ( !Q_stricmp( token, "customSkin" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } - Q_strncpyz( customSkin, value, sizeof(customSkin), qtrue); + Q_strncpyz( customSkin, value, sizeof(customSkin), qtrue); continue; } // playerTeam - if ( !Q_stricmp( token, "playerTeam" ) ) + if ( !Q_stricmp( token, "playerTeam" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1727,7 +1731,7 @@ void CG_NPC_Precache ( gentity_t *spawner ) continue; } - + // snd if ( !Q_stricmp( token, "snd" ) ) { if ( COM_ParseString( &p, &value ) ) { @@ -1738,7 +1742,7 @@ void CG_NPC_Precache ( gentity_t *spawner ) //FIXME: store this in some sound field or parse in the soundTable like the animTable... Q_strncpyz( sound, value, sizeof( sound ) ); patch = strstr( sound, "/" ); - if ( patch ) + if ( patch ) { *patch = 0; } @@ -1757,7 +1761,7 @@ void CG_NPC_Precache ( gentity_t *spawner ) //FIXME: store this in some sound field or parse in the soundTable like the animTable... Q_strncpyz( sound, value, sizeof( sound ) ); patch = strstr( sound, "/" ); - if ( patch ) + if ( patch ) { *patch = 0; } @@ -1765,7 +1769,7 @@ void CG_NPC_Precache ( gentity_t *spawner ) } continue; } - + // sndextra if ( !Q_stricmp( token, "sndextra" ) ) { if ( COM_ParseString( &p, &value ) ) { @@ -1776,7 +1780,7 @@ void CG_NPC_Precache ( gentity_t *spawner ) //FIXME: store this in some sound field or parse in the soundTable like the animTable... Q_strncpyz( sound, value, sizeof( sound ) ); patch = strstr( sound, "/" ); - if ( patch ) + if ( patch ) { *patch = 0; } @@ -1795,7 +1799,7 @@ void CG_NPC_Precache ( gentity_t *spawner ) //FIXME: store this in some sound field or parse in the soundTable like the animTable... Q_strncpyz( sound, value, sizeof( sound ) ); patch = strstr( sound, "/" ); - if ( patch ) + if ( patch ) { *patch = 0; } @@ -1807,7 +1811,7 @@ void CG_NPC_Precache ( gentity_t *spawner ) //cache weapons if ( !Q_stricmp( token, "weapon" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1823,9 +1827,9 @@ void CG_NPC_Precache ( gentity_t *spawner ) } //cache sabers //saber name - if ( !Q_stricmp( token, "saber" ) ) + if ( !Q_stricmp( token, "saber" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1859,11 +1863,11 @@ void CG_NPC_Precache ( gentity_t *spawner ) } continue; } - + //second saber name - if ( !Q_stricmp( token, "saber2" ) ) + if ( !Q_stricmp( token, "saber2" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1926,7 +1930,7 @@ void NPC_BuildRandom( gentity_t *NPC ) extern void G_MatchPlayerWeapon( gentity_t *ent ); extern void G_InitPlayerFromCvars( gentity_t *ent ); extern void G_SetG2PlayerModel( gentity_t * const ent, const char *modelName, const char *customSkin, const char *surfOff, const char *surfOn ); -qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) +qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { const char *token; const char *value; @@ -1946,7 +1950,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) qboolean parsingPlayer = qfalse; strcpy(customSkin,"default"); - if ( !NPCName || !NPCName[0]) + if ( !NPCName || !NPCName[0]) { NPCName = "Player"; } @@ -1999,9 +2003,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } Q_strncpyz( ci->name, NPCName, sizeof( ci->name ) ); - + NPC->playerModel = -1; - + //Set defaults //FIXME: should probably put default torso and head models, but what about enemies //that don't have any- like Stasis? @@ -2036,7 +2040,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = 1.0f; - *(int*)ri->customRGBA=-1; + ri->customRGBA[0] = ri->customRGBA[1] = ri->customRGBA[2] = ri->customRGBA[3] = 0xFFu; if ( !Q_stricmp( "random", NPCName ) ) {//Randomly assemble an NPC @@ -2050,7 +2054,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) #pragma region(NPC Stats) #endif // look for the right NPC - while ( p ) + while ( p ) { token = COM_ParseExt( &p, qtrue ); if ( token[0] == 0 ) @@ -2059,59 +2063,59 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) return qfalse; } - if ( !Q_stricmp( token, NPCName ) ) + if ( !Q_stricmp( token, NPCName ) ) { break; } SkipBracedSection( &p ); } - if ( !p ) + if ( !p ) { COM_EndParseSession( ); return qfalse; } - if ( G_ParseLiteral( &p, "{" ) ) + if ( G_ParseLiteral( &p, "{" ) ) { COM_EndParseSession( ); return qfalse; } - + // parse the NPC info block - while ( 1 ) + while ( 1 ) { token = COM_ParseExt( &p, qtrue ); - if ( !token[0] ) + if ( !token[0] ) { gi.Printf( S_COLOR_RED"ERROR: unexpected EOF while parsing '%s'\n", NPCName ); COM_EndParseSession( ); return qfalse; } - if ( !Q_stricmp( token, "}" ) ) + if ( !Q_stricmp( token, "}" ) ) { break; } //===MODEL PROPERTIES=========================================================== // custom color - if ( !Q_stricmp( token, "customRGBA" ) ) + if ( !Q_stricmp( token, "customRGBA" ) ) { // eezstreet TODO: Put these into functions, damn it! They're too big! - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } - + if ( !Q_stricmp( value, "random") ) { ri->customRGBA[0]=Q_irand(0,255); ri->customRGBA[1]=Q_irand(0,255); ri->customRGBA[2]=Q_irand(0,255); ri->customRGBA[3]=255; - } + } else if ( !Q_stricmp( value, "random1") ) { ri->customRGBA[3]=255; @@ -2149,7 +2153,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) ri->customRGBA[2]=14; break; } - } + } else if ( !Q_stricmp( value, "jedi_hf" ) ) { ri->customRGBA[3]=255; @@ -2438,23 +2442,23 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) break; } } - else + else { ri->customRGBA[0]=atoi(value); - - if ( COM_ParseInt( &p, &n ) ) + + if ( COM_ParseInt( &p, &n ) ) { continue; } ri->customRGBA[1]=n; - - if ( COM_ParseInt( &p, &n ) ) + + if ( COM_ParseInt( &p, &n ) ) { continue; } ri->customRGBA[2]=n; - - if ( COM_ParseInt( &p, &n ) ) + + if ( COM_ParseInt( &p, &n ) ) { continue; } @@ -2464,9 +2468,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // headmodel - if ( !Q_stricmp( token, "headmodel" ) ) + if ( !Q_stricmp( token, "headmodel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -2475,9 +2479,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { ri->headModelName[0] = '\0'; //Zero the head clamp range so the torso & legs don't lag behind - ri->headYawRangeLeft = - ri->headYawRangeRight = - ri->headPitchRangeUp = + ri->headYawRangeLeft = + ri->headYawRangeRight = + ri->headPitchRangeUp = ri->headPitchRangeDown = 0; } else @@ -2486,11 +2490,11 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } continue; } - + // torsomodel - if ( !Q_stricmp( token, "torsomodel" ) ) + if ( !Q_stricmp( token, "torsomodel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -2499,9 +2503,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { ri->torsoModelName[0] = '\0'; //Zero the torso clamp range so the legs don't lag behind - ri->torsoYawRangeLeft = - ri->torsoYawRangeRight = - ri->torsoPitchRangeUp = + ri->torsoYawRangeLeft = + ri->torsoYawRangeRight = + ri->torsoPitchRangeUp = ri->torsoPitchRangeDown = 0; } else @@ -2512,45 +2516,45 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // legsmodel - if ( !Q_stricmp( token, "legsmodel" ) ) + if ( !Q_stricmp( token, "legsmodel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } - Q_strncpyz( ri->legsModelName, value, sizeof(ri->legsModelName), qtrue); + Q_strncpyz( ri->legsModelName, value, sizeof(ri->legsModelName), qtrue); //Need to do this here to get the right index ci->animFileIndex = G_ParseAnimFileSet(ri->legsModelName); continue; } // playerModel - if ( !Q_stricmp( token, "playerModel" ) ) + if ( !Q_stricmp( token, "playerModel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } - Q_strncpyz( playerModel, value, sizeof(playerModel), qtrue); + Q_strncpyz( playerModel, value, sizeof(playerModel), qtrue); md3Model = qfalse; continue; } - + // customSkin - if ( !Q_stricmp( token, "customSkin" ) ) + if ( !Q_stricmp( token, "customSkin" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } - Q_strncpyz( customSkin, value, sizeof(customSkin), qtrue); + Q_strncpyz( customSkin, value, sizeof(customSkin), qtrue); continue; } // surfOff - if ( !Q_stricmp( token, "surfOff" ) ) + if ( !Q_stricmp( token, "surfOff" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -2565,11 +2569,11 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } continue; } - + // surfOn - if ( !Q_stricmp( token, "surfOn" ) ) + if ( !Q_stricmp( token, "surfOn" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -2584,16 +2588,16 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } continue; } - + //headYawRangeLeft - if ( !Q_stricmp( token, "headYawRangeLeft" ) ) + if ( !Q_stricmp( token, "headYawRangeLeft" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2603,14 +2607,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //headYawRangeRight - if ( !Q_stricmp( token, "headYawRangeRight" ) ) + if ( !Q_stricmp( token, "headYawRangeRight" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2620,14 +2624,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //headPitchRangeUp - if ( !Q_stricmp( token, "headPitchRangeUp" ) ) + if ( !Q_stricmp( token, "headPitchRangeUp" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2635,16 +2639,16 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) ri->headPitchRangeUp = n; continue; } - + //headPitchRangeDown - if ( !Q_stricmp( token, "headPitchRangeDown" ) ) + if ( !Q_stricmp( token, "headPitchRangeDown" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2654,14 +2658,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //torsoYawRangeLeft - if ( !Q_stricmp( token, "torsoYawRangeLeft" ) ) + if ( !Q_stricmp( token, "torsoYawRangeLeft" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2671,14 +2675,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //torsoYawRangeRight - if ( !Q_stricmp( token, "torsoYawRangeRight" ) ) + if ( !Q_stricmp( token, "torsoYawRangeRight" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2688,14 +2692,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //torsoPitchRangeUp - if ( !Q_stricmp( token, "torsoPitchRangeUp" ) ) + if ( !Q_stricmp( token, "torsoPitchRangeUp" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2705,14 +2709,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //torsoPitchRangeDown - if ( !Q_stricmp( token, "torsoPitchRangeDown" ) ) + if ( !Q_stricmp( token, "torsoPitchRangeDown" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2722,14 +2726,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // Uniform XYZ scale - if ( !Q_stricmp( token, "scale" ) ) + if ( !Q_stricmp( token, "scale" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2742,14 +2746,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //X scale - if ( !Q_stricmp( token, "scaleX" ) ) + if ( !Q_stricmp( token, "scaleX" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2762,14 +2766,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //Y scale - if ( !Q_stricmp( token, "scaleY" ) ) + if ( !Q_stricmp( token, "scaleY" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2782,14 +2786,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //Z scale - if ( !Q_stricmp( token, "scaleZ" ) ) + if ( !Q_stricmp( token, "scaleZ" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2844,7 +2848,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( f < 0.0f ) + if ( f < 0.0f ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2857,14 +2861,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // evasion - if ( !Q_stricmp( token, "evasion" ) ) + if ( !Q_stricmp( token, "evasion" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 1 || n > 5 ) + if ( n < 1 || n > 5 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2909,7 +2913,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } continue; } - + // move if ( !Q_stricmp( token, "move" ) ) { if ( COM_ParseInt( &p, &n ) ) { @@ -2950,7 +2954,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( f < 0.0f ) + if ( f < 0.0f ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2985,7 +2989,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( f < 0.0f ) + if ( f < 0.0f ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -3003,7 +3007,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( f < 0.0f ) + if ( f < 0.0f ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -3020,9 +3024,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // race - // if ( !Q_stricmp( token, "race" ) ) + // if ( !Q_stricmp( token, "race" ) ) // { - // if ( COM_ParseString( &p, &value ) ) + // if ( COM_ParseString( &p, &value ) ) // { // continue; // } @@ -3031,9 +3035,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) // } // rank - if ( !Q_stricmp( token, "rank" ) ) + if ( !Q_stricmp( token, "rank" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -3046,14 +3050,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // health - if ( !Q_stricmp( token, "health" ) ) + if ( !Q_stricmp( token, "health" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -3070,12 +3074,12 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // fullName - if ( !Q_stricmp( token, "fullName" ) ) + if ( !Q_stricmp( token, "fullName" ) ) { #ifndef FINAL_BUILD gi.Printf( S_COLOR_YELLOW"WARNING: fullname ignored in NPC '%s'\n", NPCName ); #endif - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -3083,9 +3087,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // playerTeam - if ( !Q_stricmp( token, "playerTeam" ) ) + if ( !Q_stricmp( token, "playerTeam" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -3094,9 +3098,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // enemyTeam - if ( !Q_stricmp( token, "enemyTeam" ) ) + if ( !Q_stricmp( token, "enemyTeam" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -3105,9 +3109,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // class - if ( !Q_stricmp( token, "class" ) ) + if ( !Q_stricmp( token, "class" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -3134,7 +3138,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -3152,7 +3156,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -3170,7 +3174,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -3188,7 +3192,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -3206,7 +3210,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -3219,10 +3223,10 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //===MOVEMENT STATS============================================================ - - if ( !Q_stricmp( token, "width" ) ) + + if ( !Q_stricmp( token, "width" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { continue; } @@ -3232,9 +3236,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) continue; } - if ( !Q_stricmp( token, "height" ) ) + if ( !Q_stricmp( token, "height" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { continue; } @@ -3261,9 +3265,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) continue; } - if ( !Q_stricmp( token, "crouchheight" ) ) + if ( !Q_stricmp( token, "crouchheight" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { continue; } @@ -3274,9 +3278,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) if ( !parsingPlayer ) { - if ( !Q_stricmp( token, "movetype" ) ) + if ( !Q_stricmp( token, "movetype" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -3284,7 +3288,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) NPC->client->moveType = (movetype_t)MoveTypeNameToEnum(value); continue; } - + // yawSpeed if ( !Q_stricmp( token, "yawSpeed" ) ) { if ( COM_ParseInt( &p, &n ) ) { @@ -3303,14 +3307,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // walkSpeed - if ( !Q_stricmp( token, "walkSpeed" ) ) + if ( !Q_stricmp( token, "walkSpeed" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -3321,16 +3325,16 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } continue; } - + //runSpeed - if ( !Q_stricmp( token, "runSpeed" ) ) + if ( !Q_stricmp( token, "runSpeed" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -3343,14 +3347,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //acceleration - if ( !Q_stricmp( token, "acceleration" ) ) + if ( !Q_stricmp( token, "acceleration" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -3363,9 +3367,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //sex - if ( !Q_stricmp( token, "sex" ) ) + if ( !Q_stricmp( token, "sex" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { SkipRestOfLine( &p ); continue; @@ -3402,14 +3406,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //===MISC=============================================================================== // default behavior - if ( !Q_stricmp( token, "behavior" ) ) + if ( !Q_stricmp( token, "behavior" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < BS_DEFAULT || n >= NUM_BSTATES ) + if ( n < BS_DEFAULT || n >= NUM_BSTATES ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -3423,9 +3427,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // snd - if ( !Q_stricmp( token, "snd" ) ) + if ( !Q_stricmp( token, "snd" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -3434,7 +3438,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) //FIXME: store this in some sound field or parse in the soundTable like the animTable... Q_strncpyz( sound, value, sizeof( sound ) ); patch = strstr( sound, "/" ); - if ( patch ) + if ( patch ) { *patch = 0; } @@ -3444,9 +3448,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // sndcombat - if ( !Q_stricmp( token, "sndcombat" ) ) + if ( !Q_stricmp( token, "sndcombat" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -3455,7 +3459,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) //FIXME: store this in some sound field or parse in the soundTable like the animTable... Q_strncpyz( sound, value, sizeof( sound ) ); patch = strstr( sound, "/" ); - if ( patch ) + if ( patch ) { *patch = 0; } @@ -3463,11 +3467,11 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } continue; } - + // sndextra - if ( !Q_stricmp( token, "sndextra" ) ) + if ( !Q_stricmp( token, "sndextra" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -3476,7 +3480,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) //FIXME: store this in some sound field or parse in the soundTable like the animTable... Q_strncpyz( sound, value, sizeof( sound ) ); patch = strstr( sound, "/" ); - if ( patch ) + if ( patch ) { *patch = 0; } @@ -3486,9 +3490,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // sndjedi - if ( !Q_stricmp( token, "sndjedi" ) ) + if ( !Q_stricmp( token, "sndjedi" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -3497,7 +3501,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) //FIXME: store this in some sound field or parse in the soundTable like the animTable... Q_strncpyz( sound, value, sizeof( sound ) ); patch = strstr( sound, "/" ); - if ( patch ) + if ( patch ) { *patch = 0; } @@ -3508,9 +3512,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) //New NPC/jedi stats: //starting weapon - if ( !Q_stricmp( token, "weapon" ) ) + if ( !Q_stricmp( token, "weapon" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -3528,13 +3532,13 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } continue; } - + if ( !parsingPlayer ) { //altFire - if ( !Q_stricmp( token, "altFire" ) ) + if ( !Q_stricmp( token, "altFire" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; @@ -3555,7 +3559,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) int fp = GetIDForString( FPTable, token ); if ( fp >= FP_FIRST && fp < NUM_FORCE_POWERS ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; @@ -3583,9 +3587,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //max force power - if ( !Q_stricmp( token, "forcePowerMax" ) ) + if ( !Q_stricmp( token, "forcePowerMax" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; @@ -3595,9 +3599,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //force regen rate - default is 100ms - if ( !Q_stricmp( token, "forceRegenRate" ) ) + if ( !Q_stricmp( token, "forceRegenRate" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; @@ -3607,9 +3611,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //force regen amount - default is 1 (points per second) - if ( !Q_stricmp( token, "forceRegenAmount" ) ) + if ( !Q_stricmp( token, "forceRegenAmount" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; @@ -3620,9 +3624,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) //have a sabers.cfg and just name your saber in your NPCs.cfg/ICARUS script //saber name - if ( !Q_stricmp( token, "saber" ) ) + if ( !Q_stricmp( token, "saber" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -3639,11 +3643,11 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } continue; } - + //second saber name - if ( !Q_stricmp( token, "saber2" ) ) + if ( !Q_stricmp( token, "saber2" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -3673,7 +3677,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // saberColor - if ( !Q_stricmpn( token, "saberColor", 10) ) + if ( !Q_stricmpn( token, "saberColor", 10) ) { if ( !NPC->client ) { @@ -3682,7 +3686,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) if (strlen(token)==10) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -3700,7 +3704,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) gi.Printf( S_COLOR_YELLOW"WARNING: bad saberColor '%s' in %s\n", token, NPCName ); continue; } - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -3714,7 +3718,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } - if ( !Q_stricmpn( token, "saber2Color", 11 ) ) + if ( !Q_stricmpn( token, "saber2Color", 11 ) ) { if ( !NPC->client ) { @@ -3723,7 +3727,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) if (strlen(token)==11) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -3741,7 +3745,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) gi.Printf( S_COLOR_YELLOW"WARNING: bad saber2Color '%s' in %s\n", token, NPCName ); continue; } - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -3756,7 +3760,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) //saber length - if ( !Q_stricmpn( token, "saberLength", 11) ) + if ( !Q_stricmpn( token, "saberLength", 11) ) { if (strlen(token)==11) { @@ -3777,7 +3781,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) continue; } - if ( COM_ParseFloat( &p, &f ) ) + if ( COM_ParseFloat( &p, &f ) ) { SkipRestOfLine( &p ); continue; @@ -3794,7 +3798,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { NPC->client->ps.saber[0].blade[n].lengthMax = f; } - } + } else //just one { NPC->client->ps.saber[0].blade[n].lengthMax = f; @@ -3802,7 +3806,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) continue; } - if ( !Q_stricmpn( token, "saber2Length", 12) ) + if ( !Q_stricmpn( token, "saber2Length", 12) ) { if (strlen(token)==12) { @@ -3823,7 +3827,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) continue; } - if ( COM_ParseFloat( &p, &f ) ) + if ( COM_ParseFloat( &p, &f ) ) { SkipRestOfLine( &p ); continue; @@ -3850,7 +3854,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) //saber radius - if ( !Q_stricmpn( token, "saberRadius", 11 ) ) + if ( !Q_stricmpn( token, "saberRadius", 11 ) ) { if (strlen(token)==11) { @@ -3870,8 +3874,8 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) gi.Printf( S_COLOR_YELLOW"WARNING: bad saberRadius '%s' in %s\n", token, NPCName ); continue; } - - if ( COM_ParseFloat( &p, &f ) ) + + if ( COM_ParseFloat( &p, &f ) ) { SkipRestOfLine( &p ); continue; @@ -3889,7 +3893,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) NPC->client->ps.saber[0].blade[n].radius = f; } } - else + else { NPC->client->ps.saber[0].blade[n].radius = f; } @@ -3897,7 +3901,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } - if ( !Q_stricmpn( token, "saber2Radius", 12 ) ) + if ( !Q_stricmpn( token, "saber2Radius", 12 ) ) { if (strlen(token)==12) { @@ -3918,7 +3922,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) continue; } - if ( COM_ParseFloat( &p, &f ) ) + if ( COM_ParseFloat( &p, &f ) ) { SkipRestOfLine( &p ); continue; @@ -3948,9 +3952,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) //loop sound (like Vader's breathing or droid bleeps, etc.) //starting saber style - if ( !Q_stricmp( token, "saberStyle" ) ) + if ( !Q_stricmp( token, "saberStyle" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; @@ -4048,10 +4052,10 @@ Ghoul2 Insert Start { gi.Printf(S_COLOR_RED"WARNING: Unable to use skin (%s)", NPC->soundSet); } - Q_strncpyz( customSkin, *skinarray[Q_irand(0, skinarray.size()-1)], sizeof(customSkin), qtrue); + Q_strncpyz( customSkin, *skinarray[Q_irand(0, skinarray.size()-1)], sizeof(customSkin), qtrue); } if (NPC->soundSet && gi.bIsFromZone(NPC->soundSet, TAG_G_ALLOC)) { - gi.Free(NPC->soundSet); + gi.Free(NPC->soundSet); } NPC->soundSet = 0; // clear the pointer } @@ -4073,7 +4077,7 @@ Ghoul2 Insert End return qtrue; } -void NPC_LoadParms( void ) +void NPC_LoadParms( void ) { int len, totallen, npcExtFNLen, fileCnt, i; char *buffer, *holdChar, *marker; @@ -4090,7 +4094,7 @@ void NPC_LoadParms( void ) fileCnt = gi.FS_GetFileList("ext_data/npcs", ".npc", npcExtensionListBuf, sizeof(npcExtensionListBuf) ); holdChar = npcExtensionListBuf; - for ( i = 0; i < fileCnt; i++, holdChar += npcExtFNLen + 1 ) + for ( i = 0; i < fileCnt; i++, holdChar += npcExtFNLen + 1 ) { npcExtFNLen = strlen( holdChar ); @@ -4098,7 +4102,7 @@ void NPC_LoadParms( void ) len = gi.FS_ReadFile( va( "ext_data/npcs/%s", holdChar), (void **) &buffer ); - if ( len == -1 ) + if ( len == -1 ) { gi.Printf( "NPC_LoadParms: error reading file %s\n", holdChar ); } @@ -4108,7 +4112,7 @@ void NPC_LoadParms( void ) {//don't let previous file end on a } because that must be a stand-alone token strcat( marker, " " ); totallen++; - marker++; + marker++; } len = COM_Compress( buffer ); diff --git a/code/game/NPC_utils.cpp b/code/game/NPC_utils.cpp index 2ec3f3e6c8..fc507f4275 100644 --- a/code/game/NPC_utils.cpp +++ b/code/game/NPC_utils.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //NPC_utils.cpp @@ -34,7 +38,7 @@ int teamCounter[TEAM_NUM_TEAMS]; void GetAnglesForDirection( const vec3_t p1, const vec3_t p2, vec3_t out ); /* -void CalcEntitySpot ( gentity_t *ent, spot_t spot, vec3_t point ) +void CalcEntitySpot ( gentity_t *ent, spot_t spot, vec3_t point ) Added: Uses shootAngles if a NPC has them @@ -42,7 +46,7 @@ Added: Uses shootAngles if a NPC has them extern void ViewHeightFix(const gentity_t *const ent); extern void AddLeanOfs(const gentity_t *const ent, vec3_t point); extern void SubtractLeanOfs(const gentity_t *const ent, vec3_t point); -void CalcEntitySpot ( const gentity_t *ent, const spot_t spot, vec3_t point ) +void CalcEntitySpot ( const gentity_t *ent, const spot_t spot, vec3_t point ) { vec3_t forward, up, right; vec3_t start, end; @@ -53,7 +57,7 @@ void CalcEntitySpot ( const gentity_t *ent, const spot_t spot, vec3_t point ) return; } ViewHeightFix(ent); - switch ( spot ) + switch ( spot ) { case SPOT_ORIGIN: if(VectorCompare(ent->currentOrigin, vec3_origin)) @@ -90,7 +94,7 @@ void CalcEntitySpot ( const gentity_t *ent, const spot_t spot, vec3_t point ) else { VectorCopy ( ent->currentOrigin, point ); - if ( ent->client ) + if ( ent->client ) { point[2] += ent->client->ps.viewheight; } @@ -127,7 +131,7 @@ void CalcEntitySpot ( const gentity_t *ent, const spot_t spot, vec3_t point ) else { VectorCopy ( ent->currentOrigin, point ); - if ( ent->client ) + if ( ent->client ) { point[2] += ent->client->ps.viewheight; } @@ -160,7 +164,7 @@ void CalcEntitySpot ( const gentity_t *ent, const spot_t spot, vec3_t point ) case SPOT_GROUND: // if entity is on the ground, just use it's absmin - if ( ent->s.groundEntityNum != -1 ) + if ( ent->s.groundEntityNum != -1 ) { VectorCopy( ent->currentOrigin, point ); point[2] = ent->absmin[2]; @@ -173,7 +177,7 @@ void CalcEntitySpot ( const gentity_t *ent, const spot_t spot, vec3_t point ) VectorCopy( start, end ); end[2] -= 64; gi.trace( &tr, start, ent->mins, ent->maxs, end, ent->s.number, MASK_PLAYERSOLID, (EG2_Collision)0, 0 ); - if ( tr.fraction < 1.0 ) + if ( tr.fraction < 1.0 ) { VectorCopy( tr.endpos, point); break; @@ -193,7 +197,7 @@ void CalcEntitySpot ( const gentity_t *ent, const spot_t spot, vec3_t point ) //=================================================================================== /* -qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) +qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) Added: option to do just pitch or just yaw @@ -203,7 +207,7 @@ FIXME: stop compressing angles into shorts!!!! */ extern cvar_t *g_timescale; extern bool NPC_IsTrooper( gentity_t *ent ); -qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) +qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) { #if 1 @@ -216,7 +220,7 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) // if angle changes are locked; just keep the current angles // aimTime isn't even set anymore... so this code was never reached, but I need a way to lock NPC's yaw, so instead of making a new SCF_ flag, just use the existing render flag... - dmv - if ( !NPC->enemy && ( (level.time < NPCInfo->aimTime) || NPC->client->renderInfo.renderFlags & RF_LOCKEDANGLE) ) + if ( !NPC->enemy && ( (level.time < NPCInfo->aimTime) || NPC->client->renderInfo.renderFlags & RF_LOCKEDANGLE) ) { if(doPitch) targetPitch = NPCInfo->lockedDesiredPitch; @@ -224,7 +228,7 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) if(doYaw) targetYaw = NPCInfo->lockedDesiredYaw; } - else + else { // we're changing the lockedDesired Pitch/Yaw below so it's lost it's original meaning, get rid of the lock flag NPC->client->renderInfo.renderFlags &= ~RF_LOCKEDANGLE; @@ -239,7 +243,7 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) { targetYaw = NPCInfo->desiredYaw; NPCInfo->lockedDesiredYaw = NPCInfo->desiredYaw; - } + } } if ( NPC->s.weapon == WP_EMPLACED_GUN ) @@ -249,7 +253,7 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) } else { - if ( NPC->client->NPC_class == CLASS_ROCKETTROOPER + if ( NPC->client->NPC_class == CLASS_ROCKETTROOPER && !NPC->enemy ) {//just slowly lookin' around yawSpeed = 1; @@ -265,13 +269,13 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) yawSpeed *= 1.0f/g_timescale->value; } - if (!NPC_IsTrooper(NPC) + if (!NPC_IsTrooper(NPC) && NPC->enemy - && !G_IsRidingVehicle( NPC ) + && !G_IsRidingVehicle( NPC ) && NPC->client->NPC_class != CLASS_VEHICLE ) { - if (NPC->s.weapon==WP_BLASTER_PISTOL || - NPC->s.weapon==WP_BLASTER || + if (NPC->s.weapon==WP_BLASTER_PISTOL || + NPC->s.weapon==WP_BLASTER || NPC->s.weapon==WP_BOWCASTER || NPC->s.weapon==WP_REPEATER || NPC->s.weapon==WP_FLECHETTE || @@ -281,39 +285,39 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) yawSpeed *= 10.0f; } } - + if( doYaw ) { // decay yaw error error = AngleDelta ( NPC->client->ps.viewangles[YAW], targetYaw ); if( fabs(error) > MIN_ANGLE_ERROR ) { - if ( error ) + if ( error ) { exact = qfalse; decay = 60.0 + yawSpeed * 3; decay *= 50.0f / 1000.0f;//msec - if ( error < 0.0 ) + if ( error < 0.0 ) { error += decay; - if ( error > 0.0 ) + if ( error > 0.0 ) { error = 0.0; } } - else + else { error -= decay; - if ( error < 0.0 ) + if ( error < 0.0 ) { error = 0.0; } } } } - + ucmd.angles[YAW] = ANGLE2SHORT( targetYaw + error ) - client->ps.delta_angles[YAW]; } @@ -324,25 +328,25 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) error = AngleDelta ( NPC->client->ps.viewangles[PITCH], targetPitch ); if ( fabs(error) > MIN_ANGLE_ERROR ) { - if ( error ) + if ( error ) { exact = qfalse; decay = 60.0 + yawSpeed * 3; decay *= 50.0f / 1000.0f;//msec - if ( error < 0.0 ) + if ( error < 0.0 ) { error += decay; - if ( error > 0.0 ) + if ( error > 0.0 ) { error = 0.0; } } - else + else { error -= decay; - if ( error < 0.0 ) + if ( error < 0.0 ) { error = 0.0; } @@ -373,14 +377,14 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) qboolean doSound = qfalse; // if angle changes are locked; just keep the current angles - if ( level.time < NPCInfo->aimTime ) + if ( level.time < NPCInfo->aimTime ) { if(doPitch) targetPitch = NPCInfo->lockedDesiredPitch; if(doYaw) targetYaw = NPCInfo->lockedDesiredYaw; } - else + else { if(doPitch) targetPitch = NPCInfo->desiredPitch; @@ -406,7 +410,7 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) if(NPC->client->playerTeam == TEAM_BORG&& NPCInfo->behaviorState != BS_FACE&&NPCInfo->tempBehavior!= BS_FACE) {//HACK - borg turn more jittery - if ( error ) + if ( error ) { exact = qfalse; @@ -421,18 +425,18 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) } } - if ( error < 0.0)//-10.0 ) + if ( error < 0.0)//-10.0 ) { error += decay; - if ( error > 0.0 ) + if ( error > 0.0 ) { error = 0.0; } } - else if ( error > 0.0)//10.0 ) + else if ( error > 0.0)//10.0 ) { error -= decay; - if ( error < 0.0 ) + if ( error < 0.0 ) { error = 0.0; } @@ -440,26 +444,26 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) } } else*/ - - if ( error ) + + if ( error ) { exact = qfalse; decay = 60.0 + yawSpeed * 3; decay *= 50.0 / 1000.0;//msec - if ( error < 0.0 ) + if ( error < 0.0 ) { error += decay; - if ( error > 0.0 ) + if ( error > 0.0 ) { error = 0.0; } } - else + else { error -= decay; - if ( error < 0.0 ) + if ( error < 0.0 ) { error = 0.0; } @@ -480,7 +484,7 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) if(NPC->client->playerTeam == TEAM_BORG&& NPCInfo->behaviorState != BS_FACE&&NPCInfo->tempBehavior!= BS_FACE) {//HACK - borg turn more jittery - if ( error ) + if ( error ) { exact = qfalse; @@ -495,18 +499,18 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) } } - if ( error < 0.0)//-10.0 ) + if ( error < 0.0)//-10.0 ) { error += decay; - if ( error > 0.0 ) + if ( error > 0.0 ) { error = 0.0; } } - else if ( error > 0.0)//10.0 ) + else if ( error > 0.0)//10.0 ) { error -= decay; - if ( error < 0.0 ) + if ( error < 0.0 ) { error = 0.0; } @@ -514,26 +518,26 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) } } else*/ - - if ( error ) + + if ( error ) { exact = qfalse; decay = 60.0 + yawSpeed * 3; decay *= 50.0 / 1000.0;//msec - if ( error < 0.0 ) + if ( error < 0.0 ) { error += decay; - if ( error > 0.0 ) + if ( error > 0.0 ) { error = 0.0; } } - else + else { error -= decay; - if ( error < 0.0 ) + if ( error < 0.0 ) { error = 0.0; } @@ -575,11 +579,11 @@ void NPC_AimWiggle( vec3_t enemy_org ) } /* -qboolean NPC_UpdateFiringAngles ( qboolean doPitch, qboolean doYaw ) +qboolean NPC_UpdateFiringAngles ( qboolean doPitch, qboolean doYaw ) Includes aim when determining angles - so they don't always hit... */ -qboolean NPC_UpdateFiringAngles ( qboolean doPitch, qboolean doYaw ) +qboolean NPC_UpdateFiringAngles ( qboolean doPitch, qboolean doYaw ) { #if 0 @@ -590,7 +594,7 @@ qboolean NPC_UpdateFiringAngles ( qboolean doPitch, qboolean doYaw ) float targetYaw = 0; qboolean exact = qtrue; - if ( level.time < NPCInfo->aimTime ) + if ( level.time < NPCInfo->aimTime ) { if( doPitch ) targetPitch = NPCInfo->lockedDesiredPitch; @@ -598,7 +602,7 @@ qboolean NPC_UpdateFiringAngles ( qboolean doPitch, qboolean doYaw ) if( doYaw ) targetYaw = NPCInfo->lockedDesiredYaw; } - else + else { if( doPitch ) { @@ -610,7 +614,7 @@ qboolean NPC_UpdateFiringAngles ( qboolean doPitch, qboolean doYaw ) { targetYaw = NPCInfo->desiredYaw; NPCInfo->lockedDesiredYaw = NPCInfo->desiredYaw; - } + } } if( doYaw ) @@ -625,7 +629,7 @@ qboolean NPC_UpdateFiringAngles ( qboolean doPitch, qboolean doYaw ) if ( diff ) exact = qfalse; - + ucmd.angles[YAW] = ANGLE2SHORT( targetYaw + diff + error ) - client->ps.delta_angles[YAW]; } @@ -638,14 +642,14 @@ qboolean NPC_UpdateFiringAngles ( qboolean doPitch, qboolean doYaw ) if ( diff ) exact = qfalse; - + ucmd.angles[PITCH] = ANGLE2SHORT( targetPitch + diff + error ) - client->ps.delta_angles[PITCH]; } ucmd.angles[ROLL] = ANGLE2SHORT ( NPC->client->ps.viewangles[ROLL] ) - client->ps.delta_angles[ROLL]; return exact; - + #else float error, diff; @@ -655,14 +659,14 @@ qboolean NPC_UpdateFiringAngles ( qboolean doPitch, qboolean doYaw ) qboolean exact = qtrue; // if angle changes are locked; just keep the current angles - if ( level.time < NPCInfo->aimTime ) + if ( level.time < NPCInfo->aimTime ) { if(doPitch) targetPitch = NPCInfo->lockedDesiredPitch; if(doYaw) targetYaw = NPCInfo->lockedDesiredYaw; } - else + else { if(doPitch) targetPitch = NPCInfo->desiredPitch; @@ -693,31 +697,31 @@ qboolean NPC_UpdateFiringAngles ( qboolean doPitch, qboolean doYaw ) { // decay yaw diff diff = AngleDelta ( NPC->client->ps.viewangles[YAW], targetYaw ); - - if ( diff) + + if ( diff) { exact = qfalse; decay = 60.0 + 80.0; decay *= 50.0f / 1000.0f;//msec - if ( diff < 0.0 ) + if ( diff < 0.0 ) { diff += decay; - if ( diff > 0.0 ) + if ( diff > 0.0 ) { diff = 0.0; } } - else + else { diff -= decay; - if ( diff < 0.0 ) + if ( diff < 0.0 ) { diff = 0.0; } } } - + // add yaw error based on NPCInfo->aim value error = NPCInfo->lastAimErrorYaw; @@ -735,30 +739,30 @@ qboolean NPC_UpdateFiringAngles ( qboolean doPitch, qboolean doYaw ) { // decay pitch diff diff = AngleDelta ( NPC->client->ps.viewangles[PITCH], targetPitch ); - if ( diff) + if ( diff) { exact = qfalse; decay = 60.0 + 80.0; decay *= 50.0f / 1000.0f;//msec - if ( diff < 0.0 ) + if ( diff < 0.0 ) { diff += decay; - if ( diff > 0.0 ) + if ( diff > 0.0 ) { diff = 0.0; } } - else + else { diff -= decay; - if ( diff < 0.0 ) + if ( diff < 0.0 ) { diff = 0.0; } } } - + error = NPCInfo->lastAimErrorPitch; ucmd.angles[PITCH] = ANGLE2SHORT( targetPitch + diff + error ) - client->ps.delta_angles[PITCH]; @@ -774,12 +778,12 @@ qboolean NPC_UpdateFiringAngles ( qboolean doPitch, qboolean doYaw ) //=================================================================================== /* -static void NPC_UpdateShootAngles (vec3_t angles, qboolean doPitch, qboolean doYaw ) +static void NPC_UpdateShootAngles (vec3_t angles, qboolean doPitch, qboolean doYaw ) Does update angles on shootAngles */ -void NPC_UpdateShootAngles (vec3_t angles, qboolean doPitch, qboolean doYaw ) +void NPC_UpdateShootAngles (vec3_t angles, qboolean doPitch, qboolean doYaw ) {//FIXME: shoot angles either not set right or not used! float error; float decay; @@ -796,22 +800,22 @@ void NPC_UpdateShootAngles (vec3_t angles, qboolean doPitch, qboolean doYaw ) { // decay yaw error error = AngleDelta ( NPCInfo->shootAngles[YAW], targetYaw ); - if ( error ) + if ( error ) { decay = 60.0 + 80.0 * NPCInfo->stats.aim; decay *= 100.0f / 1000.0f;//msec - if ( error < 0.0 ) + if ( error < 0.0 ) { error += decay; - if ( error > 0.0 ) + if ( error > 0.0 ) { error = 0.0; } } - else + else { error -= decay; - if ( error < 0.0 ) + if ( error < 0.0 ) { error = 0.0; } @@ -824,22 +828,22 @@ void NPC_UpdateShootAngles (vec3_t angles, qboolean doPitch, qboolean doYaw ) { // decay pitch error error = AngleDelta ( NPCInfo->shootAngles[PITCH], targetPitch ); - if ( error ) + if ( error ) { decay = 60.0 + 80.0 * NPCInfo->stats.aim; decay *= 100.0f / 1000.0f;//msec - if ( error < 0.0 ) + if ( error < 0.0 ) { error += decay; - if ( error > 0.0 ) + if ( error > 0.0 ) { error = 0.0; } } - else + else { error -= decay; - if ( error < 0.0 ) + if ( error < 0.0 ) { error = 0.0; } @@ -901,7 +905,7 @@ qboolean G_ActivateBehavior (gentity_t *self, int bset ) } bs_name = self->behaviorSet[bset]; - + if( !(VALIDSTRING( bs_name )) ) { return qfalse; @@ -1281,7 +1285,7 @@ qboolean NPC_FindEnemy( qboolean checkAlerts = qfalse ) return qtrue; //See if the player is closer than our current enemy - if ( NPC->client->NPC_class != CLASS_RANCOR + if ( NPC->client->NPC_class != CLASS_RANCOR && NPC->client->NPC_class != CLASS_WAMPA && NPC->client->NPC_class != CLASS_SAND_CREATURE && NPC_CheckPlayerDistance() ) @@ -1380,7 +1384,7 @@ qboolean NPC_FacePosition( vec3_t position, qboolean doPitch ) //Find the delta between our goal and our current facing float yawDelta = AngleNormalize360( NPCInfo->desiredYaw - ( SHORT2ANGLE( ucmd.angles[YAW] + client->ps.delta_angles[YAW] ) ) ); - + //See if we are facing properly if ( fabs( yawDelta ) > VALID_ATTACK_CONE ) facing = qfalse; @@ -1390,7 +1394,7 @@ qboolean NPC_FacePosition( vec3_t position, qboolean doPitch ) //Find the delta between our goal and our current facing float currentAngles = ( SHORT2ANGLE( ucmd.angles[PITCH] + client->ps.delta_angles[PITCH] ) ); float pitchDelta = NPCInfo->desiredPitch - currentAngles; - + //See if we are facing properly if ( fabs( pitchDelta ) > VALID_ATTACK_CONE ) facing = qfalse; @@ -1531,9 +1535,9 @@ void G_CheckCharmed( gentity_t *self ) { if ( self && self->client - && self->client->playerTeam == TEAM_PLAYER + && self->client->playerTeam == TEAM_PLAYER && self->NPC - && self->NPC->charmedTime + && self->NPC->charmedTime && (self->NPC->charmedTime < level.time ||self->health <= 0) ) {//we were charmed, set us back! //NOTE: presumptions here... @@ -1565,7 +1569,7 @@ void G_GetBoltPosition( gentity_t *self, int boltIndex, vec3_t pos, int modelInd mdxaBone_t boltMatrix; vec3_t result, angles={0,self->currentAngles[YAW],0}; - gi.G2API_GetBoltMatrix( self->ghoul2, modelIndex, + gi.G2API_GetBoltMatrix( self->ghoul2, modelIndex, boltIndex, &boltMatrix, angles, self->currentOrigin, (cg.time?cg.time:level.time), NULL, self->s.modelScale ); @@ -1578,7 +1582,7 @@ void G_GetBoltPosition( gentity_t *self, int boltIndex, vec3_t pos, int modelInd float NPC_EntRangeFromBolt( gentity_t *targEnt, int boltIndex ) { - vec3_t org; + vec3_t org = { 0.0f }; if ( !targEnt ) { @@ -1601,7 +1605,7 @@ int G_GetEntsNearBolt( gentity_t *self, gentity_t **radiusEnts, float radius, in int i; //get my handRBolt's position - vec3_t org; + vec3_t org = { 0.0f }; G_GetBoltPosition( self, boltIndex, org ); diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 6f0ccaa317..5d92156e8c 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -1,24 +1,28 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // ICARUS Engine Interface File // -// This file is the only section of the ICARUS systems that +// This file is the only section of the ICARUS systems that // is not directly portable from engine to engine. // // -- jweier @@ -146,7 +150,7 @@ stringID_table_t WPTable[] = ENUM2STRING(WP_BRYAR_PISTOL), ENUM2STRING(WP_EMPLACED_GUN), ENUM2STRING(WP_BOT_LASER), // Probe droid - Laser blast - ENUM2STRING(WP_TURRET), // turret guns + ENUM2STRING(WP_TURRET), // turret guns ENUM2STRING(WP_ATST_MAIN), ENUM2STRING(WP_ATST_SIDE), ENUM2STRING(WP_TIE_FIGHTER), @@ -327,6 +331,10 @@ stringID_table_t setTable[] = ENUM2STRING(SET_FACEBLINK), ENUM2STRING(SET_FACEBLINKFROWN), ENUM2STRING(SET_FACEFROWN), + ENUM2STRING(SET_FACESMILE), + ENUM2STRING(SET_FACEGLAD), + ENUM2STRING(SET_FACEHAPPY), + ENUM2STRING(SET_FACESHOCKED), ENUM2STRING(SET_FACENORMAL), ENUM2STRING(SET_FACEEYESCLOSED), ENUM2STRING(SET_FACEEYESOPENED), @@ -484,7 +492,7 @@ stringID_table_t setTable[] = { "", SET_ } }; -qboolean COM_ParseString( char **data, char **s ); +qboolean COM_ParseString( char **data, char **s ); //======================================================================= @@ -552,7 +560,7 @@ static void SetTextColor ( vec4_t textcolor,const char *color) { Vector4Copy( colorTable[CT_WHITE], textcolor ); } - else + else { Vector4Copy( colorTable[CT_WHITE], textcolor ); } @@ -633,8 +641,8 @@ void Q3_TaskIDComplete( gentity_t *ent, taskID_t taskType ) /* ============ Q3_CheckStringCounterIncrement - Description : - Return type : static float + Description : + Return type : static float Argument : const char *string ============ */ @@ -814,7 +822,7 @@ static void Q3_SetMissionFailed(const char *TextEnum) ent->health = 0; //FIXME: what about other NPCs? Scripts? - // statusTextIndex is looked at on the client side. + // statusTextIndex is looked at on the client side. statusTextIndex = GetIDForString( missionFailedTable, TextEnum ); cg.missionStatusShow = qtrue; if ( ent->client ) @@ -978,7 +986,7 @@ Get the current game time G_AddSexToPlayerString Take any string, look for "jaden_male/" replace with "jaden_fmle/" based on "sex" -And: Take any string, look for "/mr_" replace with "/ms_" based on "sex" +And: Take any string, look for "/mr_" replace with "/ms_" based on "sex" returns qtrue if changed to ms ============= */ @@ -1082,7 +1090,7 @@ static void Q3_SetOrigin( int entID, vec3_t origin ) VectorClear (ent->client->ps.velocity); ent->client->ps.pm_time = 160; // hold time ent->client->ps.pm_flags |= PMF_TIME_KNOCKBACK; - + ent->client->ps.eFlags ^= EF_TELEPORT_BIT; // G_KillBox (ent); @@ -1099,8 +1107,8 @@ static void Q3_SetOrigin( int entID, vec3_t origin ) /* ============ MoveOwner - Description : - Return type : void + Description : + Return type : void Argument : gentity_t *self ============ */ @@ -1150,7 +1158,7 @@ static qboolean Q3_SetTeleportDest( int entID, vec3_t org ) teleporter->e_ThinkFunc = thinkF_MoveOwner; teleporter->nextthink = level.time + FRAMETIME; - + return qfalse; } else @@ -1218,8 +1226,8 @@ static void Q3_SetVelocity( int entID, int axis, float speed ) /* ============ Q3_SetAdjustAreaPortals - Description : - Return type : void + Description : + Return type : void Argument : int entID Argument : qboolean shields ============ @@ -1240,8 +1248,8 @@ static void Q3_SetAdjustAreaPortals( int entID, qboolean adjust ) /* ============ Q3_SetDmgByHeavyWeapOnly - Description : - Return type : void + Description : + Return type : void Argument : int entID Argument : qboolean dmg ============ @@ -1255,15 +1263,15 @@ static void Q3_SetDmgByHeavyWeapOnly( int entID, qboolean dmg ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetDmgByHeavyWeapOnly: invalid entID %d\n", entID); return; } - + ent->flags = (dmg) ? (ent->flags|FL_DMG_BY_HEAVY_WEAP_ONLY) : (ent->flags&~FL_DMG_BY_HEAVY_WEAP_ONLY); } /* ============ Q3_SetShielded - Description : - Return type : void + Description : + Return type : void Argument : int entID Argument : qboolean dmg ============ @@ -1277,15 +1285,15 @@ static void Q3_SetShielded( int entID, qboolean dmg ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetShielded: invalid entID %d\n", entID); return; } - + ent->flags = (dmg) ? (ent->flags|FL_SHIELDED) : (ent->flags&~FL_SHIELDED); } /* ============ Q3_SetNoGroups - Description : - Return type : void + Description : + Return type : void Argument : int entID Argument : qboolean dmg ============ @@ -1305,7 +1313,7 @@ static void Q3_SetNoGroups( int entID, qboolean noGroups ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetNoGroups: ent %s is not an NPC!\n", ent->targetname ); return; } - + ent->NPC->scriptFlags = noGroups ? (ent->NPC->scriptFlags|SCF_NO_GROUPS) : (ent->NPC->scriptFlags&~SCF_NO_GROUPS); } @@ -1321,18 +1329,18 @@ void moverCallback( gentity_t *ent ) { //complete the task Q3_TaskIDComplete( ent, TID_MOVE_NAV ); - + // play sound ent->s.loopSound = 0;//stop looping sound G_PlayDoorSound( ent, BMS_END );//play end sound - if ( ent->moverState == MOVER_1TO2 ) + if ( ent->moverState == MOVER_1TO2 ) {//reached open // reached pos2 MatchTeam( ent, MOVER_POS2, level.time ); //SetMoverState( ent, MOVER_POS2, level.time ); - } - else if ( ent->moverState == MOVER_2TO1 ) + } + else if ( ent->moverState == MOVER_2TO1 ) {//reached closed MatchTeam( ent, MOVER_POS1, level.time ); //SetMoverState( ent, MOVER_POS1, level.time ); @@ -1441,11 +1449,11 @@ Lerps the origin of an entity to its starting position gentity_t *ent = &g_entities[entID]; if(!ent) - { + { Quake3Game()->DebugPrint( WL_WARNING, "Q3_Lerp2Start: invalid entID %d\n", entID); return; } - + if ( ent->client || ent->NPC || Q_stricmp(ent->classname, "target_scriptrunner") == 0 ) { Quake3Game()->DebugPrint( WL_ERROR, "Q3_Lerp2Start: ent %d is NOT a mover!\n", entID); @@ -1468,7 +1476,7 @@ Lerps the origin of an entity to its starting position ent->s.pos.trDuration = duration * 10; //In seconds ent->s.pos.trTime = level.time; - + Q3_TaskIDSet( ent, TID_MOVE_NAV, taskID ); // starting sound G_PlayDoorLoopSound( ent ); @@ -1494,7 +1502,7 @@ Lerps the origin of an entity to its ending position Quake3Game()->DebugPrint( WL_WARNING, "Q3_Lerp2End: invalid entID %d\n", entID); return; } - + if ( ent->client || ent->NPC || Q_stricmp(ent->classname, "target_scriptrunner") == 0 ) { Quake3Game()->DebugPrint( WL_ERROR, "Q3_Lerp2End: ent %d is NOT a mover!\n", entID); @@ -1525,7 +1533,7 @@ Lerps the origin of an entity to its ending position ent->s.pos.trDuration = duration * 10; //In seconds ent->s.time = level.time; - + Q3_TaskIDSet( ent, TID_MOVE_NAV, taskID ); // starting sound G_PlayDoorLoopSound( ent ); @@ -1553,7 +1561,7 @@ Lerps the origin and angles of an entity to the destination values Quake3Game()->DebugPrint( WL_WARNING, "Q3_Lerp2Pos: invalid entID %d\n", entID); return; } - + if ( ent->client || ent->NPC || Q_stricmp(ent->classname, "target_scriptrunner") == 0 ) { Quake3Game()->DebugPrint( WL_ERROR, "Q3_Lerp2Pos: ent %d is NOT a mover!\n", entID); @@ -1670,7 +1678,7 @@ static void Q3_Lerp2Origin( int taskID, int entID, vec3_t origin, float duration Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_Lerp2Origin: invalid entID %d\n", entID); return; } - + if ( ent->client || ent->NPC || Q_stricmp(ent->classname, "target_scriptrunner") == 0 ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_Lerp2Origin: ent %d is NOT a mover!\n", entID); @@ -1740,7 +1748,7 @@ static void Q3_SetOriginOffset( int entID, int axis, float offset ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetOriginOffset: invalid entID %d\n", entID); return; } - + if ( ent->client || ent->NPC || Q_stricmp(ent->classname, "target_scriptrunner") == 0 ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetOriginOffset: ent %d is NOT a mover!\n", entID); @@ -1775,7 +1783,7 @@ Lerps the angles to the destination value Quake3Game()->DebugPrint( WL_WARNING, "Q3_Lerp2Angles: invalid entID %d\n", entID); return; } - + if ( ent->client || ent->NPC || Q_stricmp(ent->classname, "target_scriptrunner") == 0 ) { Quake3Game()->DebugPrint( WL_ERROR, "Q3_Lerp2Angles: ent %d is NOT a mover!\n", entID); @@ -1803,7 +1811,7 @@ Lerps the angles to the destination value } ent->s.apos.trTime = level.time; - + Q3_TaskIDSet( ent, TID_ANGLE_FACE, taskID ); //ent->e_ReachedFunc = reachedF_NULL; @@ -1836,7 +1844,7 @@ Gets the value of a tag by the give name case TYPE_ANGLES: //return TAG_GetAngles( ent->targetname, name, info ); return TAG_GetAngles( ent->ownername, name, info ); - break; + break; } return false; @@ -1921,8 +1929,8 @@ static qboolean Q3_SetNavGoal( int entID, const char *name ) /* ============ SetLowerAnim - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : int animID ============ @@ -1949,9 +1957,9 @@ static void SetLowerAnim( int entID, int animID) /* ============ -SetUpperAnim - Description : - Return type : static void +SetUpperAnim + Description : + Return type : static void Argument : int entID Argument : int animID ============ @@ -1995,7 +2003,7 @@ static qboolean Q3_SetAnimUpper( int entID, const char *anim_name ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetAnimUpper: unknown animation sequence '%s'\n", anim_name ); return qfalse; } - + if ( !PM_HasAnimation( &g_entities[entID], animID ) ) { return qfalse; @@ -2026,7 +2034,7 @@ static qboolean Q3_SetAnimLower( int entID, const char *anim_name ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetAnimLower: unknown animation sequence '%s'\n", anim_name ); return qfalse; } - + if ( !PM_HasAnimation( &g_entities[entID], animID ) ) { return qfalse; @@ -2039,8 +2047,8 @@ static qboolean Q3_SetAnimLower( int entID, const char *anim_name ) /* ============ Q3_SetAnimHoldTime - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : int int_data Argument : qboolean lower @@ -2063,7 +2071,7 @@ static void Q3_SetAnimHoldTime( int entID, int int_data, qboolean lower ) Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetAnimHoldTime: ent %d is NOT a player or NPC!\n", entID); return; } - + if(lower) { PM_SetLegsAnimTimer( ent, &ent->client->ps.legsAnimTimer, int_data ); @@ -2180,7 +2188,7 @@ static void Q3_SetLeader( int entID, const char *name ) } } -stringID_table_t teamTable [] = +stringID_table_t teamTable [] = { ENUM2STRING(TEAM_FREE), // ENUM2STRING(TEAM_STARFLEET), @@ -2206,8 +2214,8 @@ stringID_table_t teamTable [] = /* ============ Q3_SetPlayerTeam - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : const char *teamName ============ @@ -2237,8 +2245,8 @@ static void Q3_SetPlayerTeam( int entID, const char *teamName ) /* ============ Q3_SetEnemyTeam - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : const char *teamName ============ @@ -2258,7 +2266,7 @@ static void Q3_SetEnemyTeam( int entID, const char *teamName ) Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetEnemyTeam: ent %d is NOT a player or NPC!\n", entID); return; } - + ent->client->enemyTeam = (team_t)GetIDForString( teamTable, teamName ); } @@ -2266,8 +2274,8 @@ static void Q3_SetEnemyTeam( int entID, const char *teamName ) /* ============ Q3_SetHealth - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : int data ============ @@ -2281,7 +2289,7 @@ static void Q3_SetHealth( int entID, int data ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetHealth: invalid entID %d\n", entID); return; } - + // FIXME : should we really let you set health on a dead guy? // this close to gold I won't change it, but warn you about it if( ent->health <= 0 ) @@ -2309,7 +2317,7 @@ static void Q3_SetHealth( int entID, int data ) ent->client->ps.stats[STAT_HEALTH] = data; if ( ent->s.number == 0 ) - {//clamp health to max + {//clamp health to max if ( ent->client->ps.stats[STAT_HEALTH] > ent->client->ps.stats[STAT_MAX_HEALTH] ) { ent->health = ent->client->ps.stats[STAT_HEALTH] = ent->client->ps.stats[STAT_MAX_HEALTH]; @@ -2330,8 +2338,8 @@ static void Q3_SetHealth( int entID, int data ) /* ============ Q3_SetArmor - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : int data ============ @@ -2345,7 +2353,7 @@ static void Q3_SetArmor( int entID, int data ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetArmor: invalid entID %d\n", entID); return; } - + if(!ent->client) { return; @@ -2364,11 +2372,11 @@ static void Q3_SetArmor( int entID, int data ) /* ============ Q3_SetBState - Description : - Return type : static qboolean + Description : + Return type : static qboolean Argument : int entID Argument : const char *bs_name -FIXME: this should be a general NPC wrapper function +FIXME: this should be a general NPC wrapper function that is called ANY time a bState is changed... ============ */ @@ -2382,7 +2390,7 @@ static qboolean Q3_SetBState( int entID, const char *bs_name ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetBState: invalid entID %d\n", entID); return qtrue; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetBState: '%s' is not an NPC\n", ent->targetname ); @@ -2395,7 +2403,7 @@ static qboolean Q3_SetBState( int entID, const char *bs_name ) if ( bSID == BS_SEARCH || bSID == BS_WANDER ) { //FIXME: Reimplement - + if( ent->waypoint != WAYPOINT_NONE ) { NPC_BSSearchStart( ent->waypoint, bSID ); @@ -2415,7 +2423,7 @@ static qboolean Q3_SetBState( int entID, const char *bs_name ) } } } - + ent->NPC->tempBehavior = BS_DEFAULT;//need to clear any temp behaviour if ( ent->NPC->behaviorState == BS_NOCLIP && bSID != BS_NOCLIP ) @@ -2485,8 +2493,8 @@ static qboolean Q3_SetBState( int entID, const char *bs_name ) /* ============ Q3_SetTempBState - Description : - Return type : static qboolean + Description : + Return type : static qboolean Argument : int entID Argument : const char *bs_name ============ @@ -2501,7 +2509,7 @@ static qboolean Q3_SetTempBState( int entID, const char *bs_name ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetTempBState: invalid entID %d\n", entID); return qtrue; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetTempBState: '%s' is not an NPC\n", ent->targetname ); @@ -2535,8 +2543,8 @@ static qboolean Q3_SetTempBState( int entID, const char *bs_name ) /* ============ Q3_SetDefaultBState - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : const char *bs_name ============ @@ -2551,7 +2559,7 @@ static void Q3_SetDefaultBState( int entID, const char *bs_name ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetDefaultBState: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetDefaultBState: '%s' is not an NPC\n", ent->targetname ); @@ -2569,8 +2577,8 @@ static void Q3_SetDefaultBState( int entID, const char *bs_name ) /* ============ Q3_SetDPitch - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : float data ============ @@ -2584,13 +2592,13 @@ static void Q3_SetDPitch( int entID, float data ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetDPitch: invalid entID %d\n", entID); return; } - + if ( !ent->NPC || !ent->client ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetDPitch: '%s' is not an NPC\n", ent->targetname ); return; } - + int pitchMin = -ent->client->renderInfo.headPitchRangeUp + 1; int pitchMax = ent->client->renderInfo.headPitchRangeDown - 1; @@ -2620,8 +2628,8 @@ static void Q3_SetDPitch( int entID, float data ) /* ============ Q3_SetDYaw - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : float data ============ @@ -2629,13 +2637,13 @@ Q3_SetDYaw static void Q3_SetDYaw( int entID, float data ) { gentity_t *ent = &g_entities[entID]; - + if ( !ent ) { Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetDYaw: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetDYaw: '%s' is not an NPC\n", ent->targetname ); @@ -2656,8 +2664,8 @@ static void Q3_SetDYaw( int entID, float data ) /* ============ Q3_SetShootDist - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : float data ============ @@ -2671,7 +2679,7 @@ static void Q3_SetShootDist( int entID, float data ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetShootDist: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetShootDist: '%s' is not an NPC\n", ent->targetname ); @@ -2685,8 +2693,8 @@ static void Q3_SetShootDist( int entID, float data ) /* ============ Q3_SetVisrange - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : float data ============ @@ -2700,7 +2708,7 @@ static void Q3_SetVisrange( int entID, float data ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetVisrange: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetVisrange: '%s' is not an NPC\n", ent->targetname ); @@ -2714,8 +2722,8 @@ static void Q3_SetVisrange( int entID, float data ) /* ============ Q3_SetEarshot - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : float data ============ @@ -2729,7 +2737,7 @@ static void Q3_SetEarshot( int entID, float data ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetEarshot: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetEarshot: '%s' is not an NPC\n", ent->targetname ); @@ -2743,8 +2751,8 @@ static void Q3_SetEarshot( int entID, float data ) /* ============ Q3_SetVigilance - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : float data ============ @@ -2758,7 +2766,7 @@ static void Q3_SetVigilance( int entID, float data ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetVigilance: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetVigilance: '%s' is not an NPC\n", ent->targetname ); @@ -2772,8 +2780,8 @@ static void Q3_SetVigilance( int entID, float data ) /* ============ Q3_SetVFOV - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : int data ============ @@ -2787,7 +2795,7 @@ static void Q3_SetVFOV( int entID, int data ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetVFOV: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetVFOV: '%s' is not an NPC\n", ent->targetname ); @@ -2801,8 +2809,8 @@ static void Q3_SetVFOV( int entID, int data ) /* ============ Q3_SetHFOV - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : int data ============ @@ -2816,7 +2824,7 @@ static void Q3_SetHFOV( int entID, int data ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetHFOV: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetHFOV: '%s' is not an NPC\n", ent->targetname ); @@ -2830,8 +2838,8 @@ static void Q3_SetHFOV( int entID, int data ) /* ============ Q3_SetWidth - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : float data ============ @@ -2839,13 +2847,13 @@ Q3_SetWidth static void Q3_SetWidth( int entID, int data ) { gentity_t *ent = &g_entities[entID]; - + if ( !ent ) { Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetWidth: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetWidth: '%s' is not an NPC\n", ent->targetname ); @@ -2859,8 +2867,8 @@ static void Q3_SetWidth( int entID, int data ) /* ============ Q3_GetTimeScale - Description : - Return type : static DWORD + Description : + Return type : static DWORD Argument : void ============ */ @@ -2875,8 +2883,8 @@ Q3_GetTimeScale /* ============ Q3_SetTimeScale - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : const char *data ============ @@ -2896,8 +2904,8 @@ static void Q3_SetTimeScale( int entID, const char *data ) /* ============ Q3_SetInvisible - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : qboolean invisible ============ @@ -2911,7 +2919,7 @@ static void Q3_SetInvisible( int entID, qboolean invisible ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetInvisible: invalid entID %d\n", entID); return; } - + if ( invisible ) { self->s.eFlags |= EF_NODRAW; @@ -2934,8 +2942,8 @@ static void Q3_SetInvisible( int entID, qboolean invisible ) /* ============ Q3_SetVampire - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : qboolean vampire ============ @@ -2949,7 +2957,7 @@ static void Q3_SetVampire( int entID, qboolean vampire ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetVampire: entID %d not a client\n", entID); return; } - + if ( vampire ) { self->client->ps.powerups[PW_DISINT_2] = Q3_INFINITE; @@ -2962,8 +2970,8 @@ static void Q3_SetVampire( int entID, qboolean vampire ) /* ============ Q3_SetGreetAllies - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : qboolean greet ============ @@ -2977,7 +2985,7 @@ static void Q3_SetGreetAllies( int entID, qboolean greet ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetGreetAllies: invalid entID %d\n", entID); return; } - + if ( !self->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetGreetAllies: ent %s is not an NPC!\n", self->targetname ); @@ -2997,9 +3005,9 @@ static void Q3_SetGreetAllies( int entID, qboolean greet ) /* ============ -Q3_SetViewTarget - Description : - Return type : static void +Q3_SetViewTarget + Description : + Return type : static void Argument : int entID Argument : const char *name ============ @@ -3015,26 +3023,26 @@ static void Q3_SetViewTarget (int entID, const char *name) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetViewTarget: invalid entID %d\n", entID); return; } - + if ( !self->client ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetViewTarget: '%s' is not a player/NPC!\n", self->targetname ); return; } - + //FIXME: Exception handle here if (viewtarget == NULL) { Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetViewTarget: can't find ViewTarget: '%s'\n", name ); return; } - + //FIXME: should we set behavior to BS_FACE and keep facing this ent as it moves //around for a script-specified length of time...? VectorCopy ( self->currentOrigin, selfspot ); selfspot[2] += self->client->ps.viewheight; - if ( viewtarget->client && (!g_skippingcin || !g_skippingcin->integer ) ) + if ( viewtarget->client && (!g_skippingcin || !g_skippingcin->integer ) ) { VectorCopy ( viewtarget->client->renderInfo.eyePoint, viewspot ); } @@ -3042,9 +3050,9 @@ static void Q3_SetViewTarget (int entID, const char *name) { VectorCopy ( viewtarget->currentOrigin, viewspot ); } - + VectorSubtract( viewspot, selfspot, viewvec ); - + vectoangles( viewvec, viewangles ); Q3_SetDYaw( entID, viewangles[YAW] ); @@ -3057,9 +3065,9 @@ static void Q3_SetViewTarget (int entID, const char *name) /* ============ -Q3_SetWatchTarget - Description : - Return type : static void +Q3_SetWatchTarget + Description : + Return type : static void Argument : int entID Argument : const char *name ============ @@ -3074,13 +3082,13 @@ static void Q3_SetWatchTarget (int entID, const char *name) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetWatchTarget: invalid entID %d\n", entID); return; } - + if ( !self->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetWatchTarget: '%s' is not an NPC!\n", self->targetname ); return; } - + if ( Q_stricmp( "NULL", name ) == 0 || Q_stricmp( "NONE", name ) == 0 || ( self->targetname && (Q_stricmp( self->targetname, name ) == 0) ) ) {//clearing watchTarget self->NPC->watchTarget = NULL; @@ -3092,7 +3100,7 @@ static void Q3_SetWatchTarget (int entID, const char *name) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetWatchTarget: can't find WatchTarget: '%s'\n", name ); return; } - + self->NPC->watchTarget = watchTarget; } @@ -3139,7 +3147,7 @@ void Q3_SetICARUSFreeze( int entID, const char *name, qboolean freeze ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetICARUSFreeze: invalid ent %s\n", name); return; } - + if ( freeze ) { self->svFlags |= SVF_ICARUS_FREEZE; @@ -3153,8 +3161,8 @@ void Q3_SetICARUSFreeze( int entID, const char *name, qboolean freeze ) /* ============ Q3_SetViewEntity - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : const char *name ============ @@ -3177,7 +3185,7 @@ void Q3_SetViewEntity(int entID, const char *name) Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetViewEntity: invalid entID %d\n", entID); return; } - + if ( !self->client ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetViewEntity: '%s' is not a player!\n", self->targetname ); @@ -3189,7 +3197,7 @@ void Q3_SetViewEntity(int entID, const char *name) G_ClearViewEntity( self ); return; } - + if ( viewtarget == NULL ) { Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetViewEntity: can't find ViewEntity: '%s'\n", name ); @@ -3201,9 +3209,9 @@ void Q3_SetViewEntity(int entID, const char *name) /* ============ -Q3_SetWeapon - Description : - Return type : static void +Q3_SetWeapon + Description : + Return type : static void Argument : int entID Argument : const char *wp_name ============ @@ -3212,7 +3220,7 @@ extern gentity_t *TossClientItems( gentity_t *self ); void G_SetWeapon( gentity_t *self, int wp ) { qboolean hadWeapon = qfalse; - + if ( !self->client ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetWeapon: '%s' is not a player/NPC!\n", self->targetname ); @@ -3313,9 +3321,9 @@ static void Q3_SetWeapon (int entID, const char *wp_name) /* ============ -Q3_SetItem - Description : - Return type : static void +Q3_SetItem + Description : + Return type : static void Argument : int entID Argument : const char *wp_name ============ @@ -3330,7 +3338,7 @@ static void Q3_SetItem (int entID, const char *item_name) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetWeapon: invalid entID %d\n", entID); return; } - + if ( !self->client ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetWeapon: '%s' is not a player/NPC!\n", self->targetname ); @@ -3339,7 +3347,7 @@ static void Q3_SetItem (int entID, const char *item_name) inv = GetIDForString( INVTable, item_name ); - + gitem_t *item = FindItemForInventory(inv); RegisterItem( item ); //make sure the item is cached in case this runs at startup @@ -3352,7 +3360,7 @@ static void Q3_SetItem (int entID, const char *item_name) { self->client->ps.inventory[inv] = 1; return; - } + } // else Bacta, seeker, sentry if( self->client->ps.inventory[inv] < 5 ) { @@ -3364,9 +3372,9 @@ static void Q3_SetItem (int entID, const char *item_name) /* ============ -Q3_SetWalkSpeed - Description : - Return type : static void +Q3_SetWalkSpeed + Description : + Return type : static void Argument : int entID Argument : int int_data ============ @@ -3380,7 +3388,7 @@ static void Q3_SetWalkSpeed (int entID, int int_data) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetWalkSpeed: invalid entID %d\n", entID); return; } - + if ( !self->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetWalkSpeed: '%s' is not an NPC!\n", self->targetname ); @@ -3398,9 +3406,9 @@ static void Q3_SetWalkSpeed (int entID, int int_data) /* ============ -Q3_SetRunSpeed - Description : - Return type : static void +Q3_SetRunSpeed + Description : + Return type : static void Argument : int entID Argument : int int_data ============ @@ -3414,7 +3422,7 @@ static void Q3_SetRunSpeed (int entID, int int_data) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetRunSpeed: invalid entID %d\n", entID); return; } - + if ( !self->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetRunSpeed: '%s' is not an NPC!\n", self->targetname ); @@ -3432,9 +3440,9 @@ static void Q3_SetRunSpeed (int entID, int int_data) /* ============ -Q3_SetYawSpeed - Description : - Return type : static void +Q3_SetYawSpeed + Description : + Return type : static void Argument : int entID Argument : float float_data ============ @@ -3448,7 +3456,7 @@ static void Q3_SetYawSpeed (int entID, float float_data) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetYawSpeed: invalid entID %d\n", entID); return; } - + if ( !self->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetYawSpeed: '%s' is not an NPC!\n", self->targetname ); @@ -3462,8 +3470,8 @@ static void Q3_SetYawSpeed (int entID, float float_data) /* ============ Q3_SetAggression - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : int int_data ============ @@ -3478,7 +3486,7 @@ static void Q3_SetAggression(int entID, int int_data) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetAggression: invalid entID %d\n", entID); return; } - + if ( !self->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetAggression: '%s' is not an NPC!\n", self->targetname ); @@ -3495,8 +3503,8 @@ static void Q3_SetAggression(int entID, int int_data) /* ============ Q3_SetAim - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : int int_data ============ @@ -3510,7 +3518,7 @@ static void Q3_SetAim(int entID, int int_data) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetAim: invalid entID %d\n", entID); return; } - + if ( !self->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetAim: '%s' is not an NPC!\n", self->targetname ); @@ -3527,8 +3535,8 @@ static void Q3_SetAim(int entID, int int_data) /* ============ Q3_SetFriction - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : int int_data ============ @@ -3542,7 +3550,7 @@ static void Q3_SetFriction(int entID, int int_data) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetFriction: invalid entID %d\n", entID); return; } - + if ( !self->client ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetFriction: '%s' is not an NPC/player!\n", self->targetname ); @@ -3556,8 +3564,8 @@ static void Q3_SetFriction(int entID, int int_data) /* ============ Q3_SetGravity - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : float float_data ============ @@ -3571,7 +3579,7 @@ static void Q3_SetGravity(int entID, float float_data) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetGravity: invalid entID %d\n", entID); return; } - + if ( !self->client ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetGravity: '%s' is not an NPC/player!\n", self->targetname ); @@ -3587,8 +3595,8 @@ static void Q3_SetGravity(int entID, float float_data) /* ============ Q3_SetWait - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : float float_data ============ @@ -3602,7 +3610,7 @@ static void Q3_SetWait(int entID, float float_data) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetWait: invalid entID %d\n", entID); return; } - + self->wait = float_data; } @@ -3616,7 +3624,7 @@ static void Q3_SetShotSpacing(int entID, int int_data) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetShotSpacing: invalid entID %d\n", entID); return; } - + if ( !self->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetShotSpacing: '%s' is not an NPC!\n", self->targetname ); @@ -3630,8 +3638,8 @@ static void Q3_SetShotSpacing(int entID, int int_data) /* ============ Q3_SetFollowDist - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : float float_data ============ @@ -3645,7 +3653,7 @@ static void Q3_SetFollowDist(int entID, float float_data) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetFollowDist: invalid entID %d\n", entID); return; } - + if ( !self->client || !self->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetFollowDist: '%s' is not an NPC!\n", self->targetname ); @@ -3659,8 +3667,8 @@ static void Q3_SetFollowDist(int entID, float float_data) /* ============ Q3_SetScale - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : float float_data ============ @@ -3674,7 +3682,7 @@ static void Q3_SetScale(int entID, float float_data) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetScale: invalid entID %d\n", entID); return; } - + self->s.scale = float_data; } @@ -3683,7 +3691,7 @@ static void Q3_SetScale(int entID, float float_data) ============ Q3_SetRenderCullRadius Description : allows NPCs to be drawn even when their origin is very far away from their model - Return type : static void + Return type : static void Argument : int entID Argument : float float_data (the new radius for render culling) ============ @@ -3697,7 +3705,7 @@ static void Q3_SetRenderCullRadius(int entID, float float_data) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetRenderCullRadius: invalid entID %d\n", entID); return; } - + self->s.radius = float_data; } @@ -3705,8 +3713,8 @@ static void Q3_SetRenderCullRadius(int entID, float float_data) /* ============ Q3_SetCount - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : const char *data ============ @@ -3722,7 +3730,7 @@ static void Q3_SetCount(int entID, const char *data) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetCount: invalid entID %d\n", entID); return; } - + if ( (val = Q3_CheckStringCounterIncrement( data )) ) { self->count += (int)(val); @@ -3736,9 +3744,9 @@ static void Q3_SetCount(int entID, const char *data) /* ============ -Q3_SetSquadName - Description : - Return type : static void +Q3_SetSquadName + Description : + Return type : static void Argument : int entID Argument : const char *squadname ============ @@ -3753,7 +3761,7 @@ static void Q3_SetSquadName (int entID, const char *squadname) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetSquadName: invalid entID %d\n", entID); return; } - + if ( !self->client ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetSquadName: '%s' is not an NPC/player!\n", self->targetname ); @@ -3773,9 +3781,9 @@ static void Q3_SetSquadName (int entID, const char *squadname) /* ============ -Q3_SetTargetName - Description : - Return type : static void +Q3_SetTargetName + Description : + Return type : static void Argument : int entID Argument : const char *targetname ============ @@ -3803,9 +3811,9 @@ static void Q3_SetTargetName (int entID, const char *targetname) /* ============ -Q3_SetTarget - Description : - Return type : static void +Q3_SetTarget + Description : + Return type : static void Argument : int entID Argument : const char *target ============ @@ -3833,8 +3841,8 @@ static void Q3_SetTarget (int entID, const char *target) /* ============ Q3_SetTarget2 - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : const char *target ============ @@ -3860,9 +3868,9 @@ static void Q3_SetTarget2 (int entID, const char *target2) } /* ============ -Q3_SetRemoveTarget - Description : - Return type : static void +Q3_SetRemoveTarget + Description : + Return type : static void Argument : int entID Argument : const char *target ============ @@ -3896,9 +3904,9 @@ static void Q3_SetRemoveTarget (int entID, const char *target) /* ============ -Q3_SetPainTarget - Description : - Return type : void +Q3_SetPainTarget + Description : + Return type : void Argument : int entID Argument : const char *targetname ============ @@ -4035,15 +4043,15 @@ static void Q3_GiveSecurityKey( int entID, char *keyname ) // Set the inventory select, just in case it hasn't original = cg.inventorySelect; - for ( i = 0 ; i < INV_MAX ; i++ ) + for ( i = 0 ; i < INV_MAX ; i++ ) { if ((cg.inventorySelect < INV_ELECTROBINOCULARS) || (cg.inventorySelect >= INV_MAX)) - { - cg.inventorySelect = (INV_MAX - 1); + { + cg.inventorySelect = (INV_MAX - 1); } - - if ( G_InventorySelectable( cg.inventorySelect,other ) ) - { + + if ( G_InventorySelectable( cg.inventorySelect,other ) ) + { return; } cg.inventorySelect++; @@ -4055,8 +4063,8 @@ static void Q3_GiveSecurityKey( int entID, char *keyname ) /* ============ Q3_SetParm - Description : - Return type : void + Description : + Return type : void Argument : int entID Argument : int parmNum Argument : const char *parmValue @@ -4122,13 +4130,13 @@ static void Q3_SetCaptureGoal( int entID, const char *name ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetCaptureGoal: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetCaptureGoal: '%s' is not an NPC!\n", ent->targetname ); return; } - + //FIXME: Exception handle here if (goal == NULL) { @@ -4163,7 +4171,7 @@ static void Q3_SetEvent( int entID, const char *event_name ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetEvent: invalid entID %d\n", entID); return; } - + event = GetIDForString( eventTable, event_name ); switch( event ) { @@ -4203,7 +4211,7 @@ Uses an entity /*static void Q3_Use( int entID, const char *target ) { gentity_t *ent = &g_entities[entID]; - + if ( !ent ) { Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_Use: invalid entID %d\n", entID); @@ -4310,7 +4318,7 @@ static qboolean Q3_SetBehaviorSet( int entID, int toSet, const char *scriptname) { // gi.TagFree( ent->behaviorSet[bSet] ); } - + ent->behaviorSet[bSet] = G_NewString( (char *) scriptname ); //FIXME: This really isn't good... } @@ -4340,7 +4348,7 @@ static void Q3_SetDelayScriptTime(int entID, int delayTime) ent->delayScriptTime = level.time + delayTime; } - + /* ============ Q3_SetIgnorePain @@ -4357,7 +4365,7 @@ static void Q3_SetIgnorePain( int entID, qboolean data) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetIgnorePain: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetIgnorePain: '%s' is not an NPC!\n", ent->targetname ); @@ -4383,7 +4391,7 @@ static void Q3_SetIgnoreEnemies( int entID, qboolean data) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetIgnoreEnemies: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetIgnoreEnemies: '%s' is not an NPC!\n", ent->targetname ); @@ -4416,7 +4424,7 @@ static void Q3_SetIgnoreAlerts( int entID, qboolean data) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetIgnoreAlerts: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetIgnoreAlerts: '%s' is not an NPC!\n", ent->targetname ); @@ -4500,7 +4508,7 @@ static void Q3_SetDontFire( int entID, qboolean add) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetDontFire: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetDontFire: '%s' is not an NPC!\n", ent->targetname ); @@ -4533,7 +4541,7 @@ static void Q3_SetFireWeapon(int entID, qboolean add) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_FireWeapon: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetFireWeapon: '%s' is not an NPC!\n", ent->targetname ); @@ -4566,7 +4574,7 @@ static void Q3_SetFireWeaponNoAnim(int entID, qboolean add) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_FireWeaponNoAnim: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetFireWeaponNoAnim: '%s' is not an NPC!\n", ent->targetname ); @@ -4599,7 +4607,7 @@ static void Q3_SetSafeRemove(int entID, qboolean add) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetSafeRemove: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetSafeRemove: '%s' is not an NPC!\n", ent->targetname ); @@ -4632,20 +4640,20 @@ static void Q3_SetBobaJetPack(int entID, qboolean add) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetBobaJetPack: invalid entID %d\n", entID); return; } - + if ( !ent->NPC ) { Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetBobaJetPack: '%s' is not an NPC!\n", ent->targetname ); return; } - + // make sure we this is Boba Fett if ( ent->client && ent->client->NPC_class != CLASS_BOBAFETT ) { Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetBobaJetPack: '%s' is not Boba Fett!\n", ent->targetname ); return; } - + if(add) { if ( ent->genericBolt1 != -1 ) @@ -4693,7 +4701,7 @@ static void Q3_SetInactive(int entID, qboolean add) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetInactive: invalid entID %d\n", entID); return; } - + if(add) { ent->svFlags |= SVF_INACTIVE; @@ -4720,7 +4728,7 @@ static void Q3_SetFuncUsableVisible(int entID, qboolean visible ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetFuncUsableVisible: invalid entID %d\n", entID); return; } - + // Yeah, I know that this doesn't even do half of what the func_usable use code does, but if I've got two things on top of each other...and only // one is visible at a time....and neither can ever be used......and finally, the shader on it has the shader_anim stuff going on....It doesn't seem // like I can easily use the other version without nasty side effects. @@ -4758,7 +4766,7 @@ static void Q3_SetLockedEnemy ( int entID, qboolean locked) Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_SetLockedEnemy: '%s' is not an NPC!\n", ent->targetname ); return; } - + //FIXME: make an NPCAI_FLAG if(locked) { @@ -4965,7 +4973,7 @@ static void Q3_SetForcedMarch( int entID, qboolean add) ============ Q3_SetChaseEnemies -indicates whether the npc should chase after an enemy +indicates whether the npc should chase after an enemy ============ */ static void Q3_SetChaseEnemies( int entID, qboolean add) @@ -5509,7 +5517,7 @@ static void Q3_SetInvincible( int entID, qboolean invincible) } return; } - + if ( invincible ) { ent->flags |= FL_GODMODE; @@ -5522,8 +5530,8 @@ static void Q3_SetInvincible( int entID, qboolean invincible) /* ============ Q3_SetForceInvincible - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : qboolean forceInv ============ @@ -5537,7 +5545,7 @@ static void Q3_SetForceInvincible( int entID, qboolean forceInv ) Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetForceInvincible: entID %d not a client\n", entID); return; } - + Q3_SetInvincible( entID, forceInv ); if ( forceInv ) { @@ -5585,8 +5593,8 @@ static void Q3_SetNoAvoid( int entID, qboolean noAvoid) /* ============ SolidifyOwner - Description : - Return type : void + Description : + Return type : void Argument : gentity_t *self ============ */ @@ -5628,7 +5636,7 @@ Q3_SetSolid static qboolean Q3_SetSolid( int entID, qboolean solid) { gentity_t *ent = &g_entities[entID]; - + if ( !ent ) { Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetSolid: invalid entID %d\n", entID); @@ -5647,7 +5655,7 @@ static qboolean Q3_SetSolid( int entID, qboolean solid) solidifier->e_ThinkFunc = thinkF_SolidifyOwner; solidifier->nextthink = level.time + FRAMETIME; - + ent->contents = oldContents; return qfalse; } @@ -5799,7 +5807,7 @@ static void Q3_SetLockAngle( int entID, const char *lockAngle) { ent->client->renderInfo.renderFlags |= RF_LOCKEDANGLE; - + if(Q_stricmp("auto", lockAngle) == 0) {//use current yaw if( ent->NPC ) // I need this to work on NPCs, so their locked value @@ -5898,7 +5906,7 @@ static void Q3_AddRHandModel( int entID, char *addModel) if ( ent->cinematicModel != -1 ) { // attach it to the hand - gi.G2API_AttachG2Model(&ent->ghoul2[ent->cinematicModel], &ent->ghoul2[ent->playerModel], + gi.G2API_AttachG2Model(&ent->ghoul2[ent->cinematicModel], &ent->ghoul2[ent->playerModel], ent->handRBolt, ent->playerModel); } } @@ -5916,7 +5924,7 @@ static void Q3_AddLHandModel( int entID, char *addModel) if ( ent->cinematicModel != -1 ) { // attach it to the hand - gi.G2API_AttachG2Model(&ent->ghoul2[ent->cinematicModel], &ent->ghoul2[ent->playerModel], + gi.G2API_AttachG2Model(&ent->ghoul2[ent->cinematicModel], &ent->ghoul2[ent->playerModel], ent->handLBolt, ent->playerModel); } } @@ -6005,7 +6013,7 @@ static void Q3_Face( int entID,int expression, float holdtime) Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "Q3_Face: '%s' is not an NPC/player!\n", ent->targetname ); return; } - + //FIXME: change to milliseconds to be consistant! holdtime *= 1000; @@ -6032,6 +6040,28 @@ static void Q3_Face( int entID,int expression, float holdtime) ent->client->facial_anim = FACE_FROWN; break; + //Extra facial expressions: + case SET_FACESMILE: + ent->client->facial_blink = -(level.time + holdtime); + ent->client->facial_timer = -(level.time + holdtime); + ent->client->facial_anim = FACE_SMILE; + break; + case SET_FACEGLAD: + ent->client->facial_blink = 1; + ent->client->facial_timer = -(level.time + holdtime); + ent->client->facial_anim = FACE_TALK1; + break; + case SET_FACEHAPPY: + ent->client->facial_blink = -(level.time + holdtime); + ent->client->facial_timer = -(level.time + holdtime); + ent->client->facial_anim = FACE_TALK1; + break; + case SET_FACESHOCKED: + ent->client->facial_blink = -1; + ent->client->facial_timer = -(level.time + holdtime); + ent->client->facial_anim = FACE_TALK3; + break; + case SET_FACENORMAL: ent->client->facial_timer = level.time + Q_flrand(6000.0, 10000.0); ent->client->facial_blink = level.time + Q_flrand(3000.0, 5000.0); @@ -6044,8 +6074,8 @@ static void Q3_Face( int entID,int expression, float holdtime) /* ============ Q3_SetPlayerUsable - Description : - Return type : void + Description : + Return type : void Argument : int entID Argument : qboolean usable ============ @@ -6073,8 +6103,8 @@ static void Q3_SetPlayerUsable( int entID, qboolean usable ) /* ============ Q3_SetDisableShaderAnims - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : int disabled ============ @@ -6102,8 +6132,8 @@ static void Q3_SetDisableShaderAnims( int entID, int disabled ) /* ============ Q3_SetShaderAnim - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : int disabled ============ @@ -6167,8 +6197,8 @@ void Q3_SetForcePower( int entID, int forcePower, qboolean powerOn ) /* ============ Q3_SetStartFrame - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : int startFrame ============ @@ -6200,8 +6230,8 @@ static void Q3_SetStartFrame( int entID, int startFrame ) /* ============ Q3_SetEndFrame - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : int endFrame ============ @@ -6231,8 +6261,8 @@ static void Q3_SetEndFrame( int entID, int endFrame ) /* ============ Q3_SetAnimFrame - Description : - Return type : static void + Description : + Return type : static void Argument : int entID Argument : int startFrame ============ @@ -6302,8 +6332,8 @@ void InflateOwner( gentity_t *self ) /* ============ Q3_SetLoopAnim - Description : - Return type : void + Description : + Return type : void Argument : int entID Argument : qboolean loopAnim ============ @@ -6331,8 +6361,8 @@ static void Q3_SetLoopAnim( int entID, qboolean loopAnim ) /* ============ Q3_SetShields - Description : - Return type : void + Description : + Return type : void Argument : int entID Argument : qboolean shields ============ @@ -6366,8 +6396,8 @@ static void Q3_SetShields( int entID, qboolean shields ) /* ============ Q3_SetSaberActive - Description : - Return type : void + Description : + Return type : void Argument : int entID Argument : qboolean shields ============ @@ -6413,7 +6443,7 @@ static void Q3_SetSaberActive( int entID, qboolean active ) return; } } - + if ( active ) { ent->client->ps.SaberActivate(); @@ -6485,8 +6515,8 @@ static void Q3_SetSaberBladeActive( int entID, int iSaber, int iBlade, qboolean /* ============ Q3_SetNoKnockback - Description : - Return type : void + Description : + Return type : void Argument : int entID Argument : qboolean noKnockback ============ @@ -6514,8 +6544,8 @@ static void Q3_SetNoKnockback( int entID, qboolean noKnockback ) /* ============ Q3_SetCleanDamagingEnts - Description : - Return type : void + Description : + Return type : void ============ */ static void Q3_SetCleanDamagingEnts( void ) @@ -6556,8 +6586,8 @@ static void Q3_SetCleanDamagingEnts( void ) /* ============ Q3_SetInterface - Description : - Return type : void + Description : + Return type : void Argument : int entID Argument : const char *data ============ @@ -6570,8 +6600,8 @@ static void Q3_SetInterface( int entID, const char *data ) /* ============ Q3_SetLocation - Description : - Return type : qboolean + Description : + Return type : qboolean Argument : int entID Argument : const char *location ============ @@ -6580,7 +6610,7 @@ static qboolean Q3_SetLocation( int entID, const char *location ) { gentity_t *ent = &g_entities[entID]; char *currentLoc; - + if ( !ent ) { return qtrue; @@ -6599,8 +6629,8 @@ static qboolean Q3_SetLocation( int entID, const char *location ) /* ============ Q3_SetPlayerLocked - Description : - Return type : void + Description : + Return type : void Argument : int entID Argument : qboolean locked ============ @@ -6620,8 +6650,8 @@ static void Q3_SetPlayerLocked( int entID, qboolean locked ) /* ============ Q3_SetLockPlayerWeapons - Description : - Return type : void + Description : + Return type : void Argument : int entID Argument : qboolean locked ============ @@ -6636,15 +6666,15 @@ static void Q3_SetLockPlayerWeapons( int entID, qboolean locked ) { ent->flags |= FL_LOCK_PLAYER_WEAPONS; } - + } /* ============ Q3_SetNoImpactDamage - Description : - Return type : void + Description : + Return type : void Argument : int entID Argument : qboolean locked ============ @@ -6665,7 +6695,7 @@ static void Q3_SetNoImpactDamage( int entID, qboolean noImp ) { ent->flags |= FL_NO_IMPACT_DMG; } - + } extern void CG_CameraAutoAim( const char *name ); @@ -6674,8 +6704,8 @@ extern void CG_CameraAutoTrack( const char *name ); /* ============ Q3_SetVar - Description : - Return type : static void + Description : + Return type : static void Argument : int taskID Argument : int entID Argument : const char *type_name @@ -6688,7 +6718,7 @@ Q3_SetVar float float_data; float val = 0.0f; - + if ( vret != VTYPE_NONE ) { switch ( vret ) @@ -6725,8 +6755,8 @@ Q3_SetVar /* ============ Q3_RemoveEnt - Description : - Return type : void + Description : + Return type : void Argument : gentity_t *victim ============ */ @@ -6783,8 +6813,8 @@ static void Q3_RemoveEnt( gentity_t *victim ) /* ============ MakeOwnerInvis - Description : - Return type : void + Description : + Return type : void Argument : gentity_t *self ============ */ @@ -6804,8 +6834,8 @@ void MakeOwnerInvis(gentity_t *self) /* ============ MakeOwnerEnergy - Description : - Return type : void + Description : + Return type : void Argument : gentity_t *self ============ */ @@ -6825,8 +6855,8 @@ void MakeOwnerEnergy(gentity_t *self) /* ============ Q3_Remove - Description : - Return type : void + Description : + Return type : void Argument : int entID Argument : const char *name ============ @@ -6876,8 +6906,8 @@ static void Q3_Remove( int entID, const char *name ) /* ============ RemoveOwner - Description : - Return type : void + Description : + Return type : void Argument : gentity_t *self ============ */ @@ -7007,20 +7037,9 @@ SetVar void CQuake3GameInterface::SetVar( int taskID, int entID, const char *type_name, const char *data ) { int vret = VariableDeclared( type_name ) ; - float float_data; + float float_data = 0.0f; float val = 0.0f; - - int favre=0; - if( Q_stricmp( type_name, "path_enemies_dead" )==0 ) - { - favre=4; - } - if( Q_stricmp( type_name, "path_door_open" )==0 ) - { - favre = 4; - } - if ( vret != VTYPE_NONE ) { switch ( vret ) @@ -7149,7 +7168,7 @@ int CQuake3GameInterface::SetFloatVariable( const char *name, float value ) return VTYPE_FLOAT; (*vfi).second = value; - + return true; } @@ -7207,7 +7226,7 @@ void CQuake3GameInterface::VariableSaveFloats( varFloat_m &fmap ) { //Save out the map id int idSize = strlen( ((*vfi).first).c_str() ); - + //Save out the real data gi.AppendToSaveGame( INT_ID('F','I','D','L'), &idSize, sizeof( idSize ) ); gi.AppendToSaveGame( INT_ID('F','I','D','S'), (void *) ((*vfi).first).c_str(), idSize ); @@ -7233,7 +7252,7 @@ void CQuake3GameInterface::VariableSaveStrings( varString_m &smap ) { //Save out the map id int idSize = strlen( ((*vsi).first).c_str() ); - + //Save out the real data gi.AppendToSaveGame( INT_ID('S','I','D','L'), &idSize, sizeof( idSize ) ); gi.AppendToSaveGame( INT_ID('S','I','D','S'), (void *) ((*vsi).first).c_str(), idSize ); @@ -7277,7 +7296,7 @@ void CQuake3GameInterface::VariableLoadFloats( varFloat_m &fmap ) for ( int i = 0; i < numFloats; i++ ) { int idSize; - + gi.ReadFromSaveGame( INT_ID('F','I','D','L'), &idSize, sizeof( idSize ), NULL ); gi.ReadFromSaveGame( INT_ID('F','I','D','S'), &tempBuffer, idSize, NULL ); tempBuffer[ idSize ] = 0; @@ -7308,7 +7327,7 @@ void CQuake3GameInterface::VariableLoadStrings( int type, varString_m &fmap ) for ( int i = 0; i < numFloats; i++ ) { int idSize; - + gi.ReadFromSaveGame( INT_ID('S','I','D','L'), &idSize, sizeof( idSize ), NULL ); gi.ReadFromSaveGame( INT_ID('S','I','D','S'), &tempBuffer, idSize, NULL ); tempBuffer[ idSize ] = 0; @@ -7405,11 +7424,11 @@ CQuake3GameInterface::~CQuake3GameInterface() gentity_t *ent = &g_entities[0]; // Release all entities Icarus resources. - for ( int i = 0; i < globals.num_entities; i++, ent++ ) + for ( int i = 0; i < globals.num_entities; i++, ent++ ) { if ( !ent->inuse ) continue; - + FreeEntity( ent ); } @@ -7460,7 +7479,7 @@ void CQuake3GameInterface::FreeEntity( gentity_t *pEntity ) if VALIDSTRING( pEntity->script_targetname ) { char temp[1024]; - + strncpy( (char *) temp, pEntity->script_targetname, 1023 ); temp[ 1023 ] = 0; @@ -7506,7 +7525,7 @@ bool CQuake3GameInterface::ValidEntity( gentity_t *pEntity ) void CQuake3GameInterface::AssociateEntity( gentity_t *pEntity ) { char temp[1024]; - + if ( VALIDSTRING( pEntity->script_targetname ) == false ) return; @@ -7524,7 +7543,7 @@ int CQuake3GameInterface::MakeValidScriptName( char **strScriptName ) // ensure "scripts" (Q3_SCRIPT_DIR), which will be missing if this was called recursively... // MAX_FILENAME_LENGTH should really be MAX_QPATH (and 64 bytes instead of 1024), but this fits the rest of the code - char sFilename[MAX_FILENAME_LENGTH]; + char sFilename[MAX_FILENAME_LENGTH]; if ( !Q_stricmpn( *strScriptName, Q3_SCRIPT_DIR, strlen( Q3_SCRIPT_DIR ) ) ) { @@ -7537,7 +7556,7 @@ int CQuake3GameInterface::MakeValidScriptName( char **strScriptName ) return 1; } - + // First looks to see if a script has already been loaded, if so, return SCRIPT_ALREADYREGISTERED. If a script has // NOT been already cached, that script is loaded and the return is SCRIPT_REGISTERED. If a script could not // be found cached and could not be loaded we return SCRIPT_COULDNOTREGISTER. @@ -7549,7 +7568,7 @@ int CQuake3GameInterface::RegisterScript( const char *strFileName, void **ppBuf, // Ensure "scripts" (Q3_SCRIPT_DIR), which will be missing if this was called recursively... // MAX_FILENAME_LENGTH should really be MAX_QPATH (and 64 bytes instead of 1024), but this fits the rest of the code - char sFilename[MAX_FILENAME_LENGTH]; + char sFilename[MAX_FILENAME_LENGTH]; if ( !Q_stricmpn( strFileName, Q3_SCRIPT_DIR, strlen( Q3_SCRIPT_DIR ) ) ) { @@ -7578,12 +7597,12 @@ int CQuake3GameInterface::RegisterScript( const char *strFileName, void **ppBuf, // Prepare the name with the extension. char newname[MAX_FILENAME_LENGTH]; - sprintf((char *) newname, "%s%s", sFilename, IBI_EXT ); + sprintf((char *) newname, "%s%s", sFilename, IBI_EXT ); qboolean qbIgnoreFileRead = qfalse; // NOTENOTE: For the moment I've taken this back out, to avoid doubling the number of fopen()'s per file. -/*#if 0//#ifndef FINAL_BUILD +/*#if 0//#ifndef FINAL_BUILD // small update here, if called during interrogate, don't let gi.FS_ReadFile() complain because it can't // find stuff like BS_RUN_AND_SHOOT as scriptname... During FINALBUILD the message won't appear anyway, hence // the ifndef, this just cuts down on internal error reports while testing release mode... @@ -7594,7 +7613,7 @@ int CQuake3GameInterface::RegisterScript( const char *strFileName, void **ppBuf, fileHandle_t file; gi.FS_FOpenFile( newname, &file, FS_READ ); - + if ( file == NULL ) { qbIgnoreFileRead = qtrue; // warn disk code further down not to try FS_ReadFile() @@ -7614,7 +7633,7 @@ int CQuake3GameInterface::RegisterScript( const char *strFileName, void **ppBuf, { // File not found, but keep quiet during interrogate stage, because of stuff like BS_RUN_AND_SHOOT as scriptname // -/* if (!bCalledDuringInterrogate) +/* if (!bCalledDuringInterrogate) { Com_Printf(S_COLOR_RED"Could not open file '%s'\n", newname ); }*/ @@ -7631,7 +7650,7 @@ int CQuake3GameInterface::RegisterScript( const char *strFileName, void **ppBuf, // We (mem)copied the data over so release the original buffer. gi.FS_FreeFile( pBuf ); - + // Keep track of the buffer still. (*ppBuf) = pscript->buffer; @@ -7707,11 +7726,11 @@ void CQuake3GameInterface::Svcmd( void ) { g_ICARUSDebug->integer = WL_DEBUG; if ( VALIDSTRING( gi.argv( 2 ) ) ) - { + { gentity_t *ent = G_Find( NULL, FOFS( script_targetname ), gi.argv(2) ); if ( ent == NULL ) - { + { Com_Printf( "Entity \"%s\" not found!\n", gi.argv(2) ); return; } @@ -7721,7 +7740,7 @@ void CQuake3GameInterface::Svcmd( void ) m_entFilter = ( ent->s.number == m_entFilter ) ? -1 : ent->s.number; } - + Com_Printf("Logging ICARUS info for all entities\n"); } } @@ -7790,11 +7809,11 @@ void CQuake3GameInterface::DebugPrint( e_DebugPrintLevel level, const char *form case WL_ERROR: Com_Printf ( S_COLOR_RED"ERROR: %s", text ); break; - + case WL_WARNING: Com_Printf ( S_COLOR_YELLOW"WARNING: %s", text ); break; - + case WL_DEBUG: { int entNum; @@ -7953,7 +7972,7 @@ void CQuake3GameInterface::Lerp2Pos( int taskID, int entID, vec3_t origin, vec3_ DebugPrint( WL_WARNING, "Lerp2Pos: invalid entID %d\n", entID); return; } - + if ( ent->client || ent->NPC || Q_stricmp(ent->classname, "target_scriptrunner") == 0 ) { DebugPrint( WL_ERROR, "Lerp2Pos: ent %d is NOT a mover!\n", entID); @@ -8067,7 +8086,7 @@ void CQuake3GameInterface::Lerp2Angles( int taskID, int entID, vec3_t angles, fl DebugPrint( WL_WARNING, "Lerp2Angles: invalid entID %d\n", entID); return; } - + if ( ent->client || ent->NPC || Q_stricmp(ent->classname, "target_scriptrunner") == 0 ) { DebugPrint( WL_ERROR, "Lerp2Angles: ent %d is NOT a mover!\n", entID); @@ -8095,7 +8114,7 @@ void CQuake3GameInterface::Lerp2Angles( int taskID, int entID, vec3_t angles, fl } ent->s.apos.trTime = level.time; - + Q3_TaskIDSet( ent, TID_ANGLE_FACE, taskID ); //ent->e_ReachedFunc = reachedF_NULL; @@ -8126,7 +8145,7 @@ int CQuake3GameInterface::GetTag( int entID, const char *name, int lookup, vec3 case TYPE_ANGLES: //return TAG_GetAngles( ent->targetname, name, info ); return TAG_GetAngles( ent->ownername, name, info ); - break; + break; } return false; @@ -8195,7 +8214,7 @@ void CQuake3GameInterface::Set( int taskID, int entID, const char *type_name, co float_data = atof((char *) data); Q3_SetVelocity( entID, 0, float_data); break; - + case SET_YVELOCITY: float_data = atof((char *) data); Q3_SetVelocity( entID, 1, float_data); @@ -8276,7 +8295,7 @@ void CQuake3GameInterface::Set( int taskID, int entID, const char *type_name, co } } break; - + case SET_ANIM_HOLDTIME_LOWER: int_data = atoi((char *) data); Q3_SetAnimHoldTime( entID, int_data, qtrue ); @@ -8484,14 +8503,14 @@ void CQuake3GameInterface::Set( int taskID, int entID, const char *type_name, co else if(!Q_stricmp("false", ((char *)data))) Q3_SetIgnoreAlerts( entID, qfalse); break; - + case SET_DONTSHOOT: if(!Q_stricmp("true", ((char *)data))) Q3_SetDontShoot( entID, qtrue); else if(!Q_stricmp("false", ((char *)data))) Q3_SetDontShoot( entID, qfalse); break; - + case SET_DONTFIRE: if(!Q_stricmp("true", ((char *)data))) Q3_SetDontFire( entID, qtrue); @@ -8535,17 +8554,17 @@ void CQuake3GameInterface::Set( int taskID, int entID, const char *type_name, co float_data = atof((char *) data); Q3_SetVisrange( entID, float_data ); break; - + case SET_EARSHOT: float_data = atof((char *) data); Q3_SetEarshot( entID, float_data ); break; - + case SET_VIGILANCE: float_data = atof((char *) data); Q3_SetVigilance( entID, float_data ); break; - + case SET_VFOV: int_data = atoi((char *) data); Q3_SetVFOV( entID, int_data ); @@ -8567,7 +8586,7 @@ void CQuake3GameInterface::Set( int taskID, int entID, const char *type_name, co case SET_TARGET2: Q3_SetTarget2( entID, (char *) data ); break; - + case SET_LOCATION: if ( !Q3_SetLocation( entID, (char *) data ) ) { @@ -8655,128 +8674,128 @@ void CQuake3GameInterface::Set( int taskID, int entID, const char *type_name, co case SET_WALKING: if(!Q_stricmp("true", ((char *)data))) - Q3_SetWalking( entID, qtrue); + Q3_SetWalking( entID, qtrue); else - Q3_SetWalking( entID, qfalse); + Q3_SetWalking( entID, qfalse); break; case SET_RUNNING: if(!Q_stricmp("true", ((char *)data))) - Q3_SetRunning( entID, qtrue); + Q3_SetRunning( entID, qtrue); else - Q3_SetRunning( entID, qfalse); + Q3_SetRunning( entID, qfalse); break; case SET_CHASE_ENEMIES: if(!Q_stricmp("true", ((char *)data))) - Q3_SetChaseEnemies( entID, qtrue); + Q3_SetChaseEnemies( entID, qtrue); else - Q3_SetChaseEnemies( entID, qfalse); + Q3_SetChaseEnemies( entID, qfalse); break; case SET_LOOK_FOR_ENEMIES: if(!Q_stricmp("true", ((char *)data))) - Q3_SetLookForEnemies( entID, qtrue); + Q3_SetLookForEnemies( entID, qtrue); else - Q3_SetLookForEnemies( entID, qfalse); + Q3_SetLookForEnemies( entID, qfalse); break; case SET_FACE_MOVE_DIR: if(!Q_stricmp("true", ((char *)data))) - Q3_SetFaceMoveDir( entID, qtrue); + Q3_SetFaceMoveDir( entID, qtrue); else - Q3_SetFaceMoveDir( entID, qfalse); + Q3_SetFaceMoveDir( entID, qfalse); break; case SET_ALT_FIRE: if(!Q_stricmp("true", ((char *)data))) - Q3_SetAltFire( entID, qtrue); + Q3_SetAltFire( entID, qtrue); else - Q3_SetAltFire( entID, qfalse); + Q3_SetAltFire( entID, qfalse); break; case SET_DONT_FLEE: if(!Q_stricmp("true", ((char *)data))) - Q3_SetDontFlee( entID, qtrue); + Q3_SetDontFlee( entID, qtrue); else - Q3_SetDontFlee( entID, qfalse); + Q3_SetDontFlee( entID, qfalse); break; case SET_FORCED_MARCH: if(!Q_stricmp("true", ((char *)data))) - Q3_SetForcedMarch( entID, qtrue); + Q3_SetForcedMarch( entID, qtrue); else - Q3_SetForcedMarch( entID, qfalse); + Q3_SetForcedMarch( entID, qfalse); break; case SET_NO_RESPONSE: if(!Q_stricmp("true", ((char *)data))) - Q3_SetNoResponse( entID, qtrue); + Q3_SetNoResponse( entID, qtrue); else - Q3_SetNoResponse( entID, qfalse); + Q3_SetNoResponse( entID, qfalse); break; case SET_NO_COMBAT_TALK: if(!Q_stricmp("true", ((char *)data))) - Q3_SetCombatTalk( entID, qtrue); + Q3_SetCombatTalk( entID, qtrue); else - Q3_SetCombatTalk( entID, qfalse); + Q3_SetCombatTalk( entID, qfalse); break; case SET_NO_ALERT_TALK: if(!Q_stricmp("true", ((char *)data))) - Q3_SetAlertTalk( entID, qtrue); + Q3_SetAlertTalk( entID, qtrue); else - Q3_SetAlertTalk( entID, qfalse); + Q3_SetAlertTalk( entID, qfalse); break; case SET_USE_CP_NEAREST: if(!Q_stricmp("true", ((char *)data))) - Q3_SetUseCpNearest( entID, qtrue); + Q3_SetUseCpNearest( entID, qtrue); else - Q3_SetUseCpNearest( entID, qfalse); + Q3_SetUseCpNearest( entID, qfalse); break; case SET_NO_FORCE: if(!Q_stricmp("true", ((char *)data))) - Q3_SetNoForce( entID, qtrue); + Q3_SetNoForce( entID, qtrue); else - Q3_SetNoForce( entID, qfalse); + Q3_SetNoForce( entID, qfalse); break; case SET_NO_ACROBATICS: if(!Q_stricmp("true", ((char *)data))) - Q3_SetNoAcrobatics( entID, qtrue); + Q3_SetNoAcrobatics( entID, qtrue); else - Q3_SetNoAcrobatics( entID, qfalse); + Q3_SetNoAcrobatics( entID, qfalse); break; case SET_USE_SUBTITLES: if(!Q_stricmp("true", ((char *)data))) - Q3_SetUseSubtitles( entID, qtrue); + Q3_SetUseSubtitles( entID, qtrue); else - Q3_SetUseSubtitles( entID, qfalse); + Q3_SetUseSubtitles( entID, qfalse); break; case SET_NO_FALLTODEATH: if(!Q_stricmp("true", ((char *)data))) - Q3_SetNoFallToDeath( entID, qtrue); + Q3_SetNoFallToDeath( entID, qtrue); else - Q3_SetNoFallToDeath( entID, qfalse); + Q3_SetNoFallToDeath( entID, qfalse); break; case SET_DISMEMBERABLE: if(!Q_stricmp("true", ((char *)data))) - Q3_SetDismemberable( entID, qtrue); + Q3_SetDismemberable( entID, qtrue); else - Q3_SetDismemberable( entID, qfalse); + Q3_SetDismemberable( entID, qfalse); break; case SET_MORELIGHT: if(!Q_stricmp("true", ((char *)data))) - Q3_SetMoreLight( entID, qtrue); + Q3_SetMoreLight( entID, qtrue); else - Q3_SetMoreLight( entID, qfalse); + Q3_SetMoreLight( entID, qfalse); break; @@ -8790,23 +8809,23 @@ void CQuake3GameInterface::Set( int taskID, int entID, const char *type_name, co case SET_UNDYING: if(!Q_stricmp("true", ((char *)data))) - Q3_SetUndying( entID, qtrue); + Q3_SetUndying( entID, qtrue); else - Q3_SetUndying( entID, qfalse); + Q3_SetUndying( entID, qfalse); break; case SET_INVINCIBLE: if(!Q_stricmp("true", ((char *)data))) - Q3_SetInvincible( entID, qtrue); + Q3_SetInvincible( entID, qtrue); else - Q3_SetInvincible( entID, qfalse); + Q3_SetInvincible( entID, qfalse); break; case SET_NOAVOID: if(!Q_stricmp("true", ((char *)data))) - Q3_SetNoAvoid( entID, qtrue); + Q3_SetNoAvoid( entID, qtrue); else - Q3_SetNoAvoid( entID, qfalse); + Q3_SetNoAvoid( entID, qfalse); break; case SET_SOLID: @@ -8858,7 +8877,7 @@ void CQuake3GameInterface::Set( int taskID, int entID, const char *type_name, co else Q3_SetPlayerLocked( entID, qfalse ); break; - + case SET_LOCK_PLAYER_WEAPONS: if( !Q_stricmp("true", ((char *)data)) ) Q3_SetLockPlayerWeapons( entID, qtrue ); @@ -8875,18 +8894,18 @@ void CQuake3GameInterface::Set( int taskID, int entID, const char *type_name, co case SET_FORWARDMOVE: int_data = atoi((char *) data); - Q3_SetForwardMove( entID, int_data); + Q3_SetForwardMove( entID, int_data); break; case SET_RIGHTMOVE: int_data = atoi((char *) data); - Q3_SetRightMove( entID, int_data); + Q3_SetRightMove( entID, int_data); break; case SET_LOCKYAW: - Q3_SetLockAngle( entID, data); + Q3_SetLockAngle( entID, data); break; - + case SET_CAMERA_GROUP: Q3_CameraGroup(entID, (char *)data); break; @@ -8925,17 +8944,21 @@ void CQuake3GameInterface::Set( int taskID, int entID, const char *type_name, co case SET_FACEBLINK: case SET_FACEBLINKFROWN: case SET_FACEFROWN: + case SET_FACESMILE: + case SET_FACEGLAD: + case SET_FACEHAPPY: + case SET_FACESHOCKED: case SET_FACENORMAL: float_data = atof((char *) data); Q3_Face(entID, toSet, float_data); break; case SET_SCROLLTEXT: - Q3_ScrollText( (char *)data ); + Q3_ScrollText( (char *)data ); break; case SET_LCARSTEXT: - Q3_LCARSText( (char *)data ); + Q3_LCARSText( (char *)data ); break; case SET_CENTERTEXT: @@ -8943,13 +8966,13 @@ void CQuake3GameInterface::Set( int taskID, int entID, const char *type_name, co break; case SET_CAPTIONTEXTCOLOR: - Q3_SetCaptionTextColor ( (char *)data ); + Q3_SetCaptionTextColor ( (char *)data ); break; case SET_CENTERTEXTCOLOR: - Q3_SetCenterTextColor ( (char *)data ); + Q3_SetCenterTextColor ( (char *)data ); break; case SET_SCROLLTEXTCOLOR: - Q3_SetScrollTextColor ( (char *)data ); + Q3_SetScrollTextColor ( (char *)data ); break; case SET_PLAYER_USABLE: @@ -8967,7 +8990,7 @@ void CQuake3GameInterface::Set( int taskID, int entID, const char *type_name, co int_data = atoi((char *) data); Q3_SetStartFrame(entID, int_data); break; - + case SET_ENDFRAME: int_data = atoi((char *) data); Q3_SetEndFrame(entID, int_data); @@ -8981,7 +9004,7 @@ void CQuake3GameInterface::Set( int taskID, int entID, const char *type_name, co Q3_SetAnimFrame(entID, int_data); return; break; - + case SET_LOOP_ANIM: if(!Q_stricmp("true", ((char *)data))) { @@ -9015,7 +9038,7 @@ void CQuake3GameInterface::Set( int taskID, int entID, const char *type_name, co Q3_SetShields(entID, qfalse); } break; - + case SET_SABERACTIVE: if(!Q_stricmp("true", ((char *)data))) { @@ -9076,7 +9099,7 @@ void CQuake3GameInterface::Set( int taskID, int entID, const char *type_name, co Q3_SetAdjustAreaPortals( entID, qfalse ); } break; - + case SET_DMG_BY_HEAVY_WEAP_ONLY: if(!Q_stricmp("true", ((char *)data))) { @@ -9242,12 +9265,12 @@ extern void LockDoors(gentity_t *const ent); case SET_MENU_SCREEN: //UI_SetActiveMenu( (const char *) data ); - gi.SendConsoleCommand( va("uimenu %s\n", (char *)data) ); + gi.SendConsoleCommand( va("uimenu %s\n", (char *)data) ); break; case SET_OBJECTIVE_SHOW: missionInfo_Updated = qtrue; // Activate flashing text - gi.cvar_set("cg_updatedDataPadObjective", "1"); + gi.cvar_set("cg_updatedDataPadObjective", "1"); Q3_SetObjective((const char *) data ,SET_OBJ_SHOW); Q3_SetObjective((const char *) data ,SET_OBJ_PENDING); @@ -9257,7 +9280,7 @@ extern void LockDoors(gentity_t *const ent); break; case SET_OBJECTIVE_SUCCEEDED: missionInfo_Updated = qtrue; // Activate flashing text - gi.cvar_set("cg_updatedDataPadObjective", "1"); + gi.cvar_set("cg_updatedDataPadObjective", "1"); Q3_SetObjective((const char *) data ,SET_OBJ_SUCCEEDED); break; case SET_OBJECTIVE_SUCCEEDED_NO_UPDATE: @@ -9278,7 +9301,7 @@ extern void LockDoors(gentity_t *const ent); case SET_MISSIONSTATUSTEXT: Q3_SetStatusText((const char *) data); break; - + case SET_MISSIONSTATUSTIME: int_data = atoi((char *) data); cg.missionStatusDeadTime = level.time + int_data; @@ -9352,7 +9375,7 @@ extern void LockDoors(gentity_t *const ent); int_data = atoi((char *) data); Q3_SetForcePowerLevel( entID, (toSet-SET_FORCE_HEAL_LEVEL), int_data ); break; - + case SET_SABER1: case SET_SABER2: WP_SetSaber( &g_entities[entID], toSet-SET_SABER1, (char *)data ); @@ -9367,7 +9390,7 @@ extern void LockDoors(gentity_t *const ent); Use( entID, (char *)data ); // G_DriveVehicle( &g_entities[entID], NULL, (char *)data ); break; - + case SET_SECURITY_KEY: Q3_GiveSecurityKey( entID, (char *)data ); break; @@ -9509,18 +9532,18 @@ extern cvar_t *g_char_skin_legs; void CQuake3GameInterface::PrisonerObjCheck(const char *name,const char *data) { - float float_data; + float float_data = 0.0f; int holdData; if (!Q_stricmp("ui_prisonerobj_currtotal",name)) { GetFloatVariable( name, &float_data ); holdData = (int) float_data; - gi.cvar_set("ui_prisonerobj_currtotal", va("%d",holdData)); + gi.cvar_set("ui_prisonerobj_currtotal", va("%d",holdData)); } else if (!Q_stricmp("ui_prisonerobj_maxtotal",name)) { - gi.cvar_set("ui_prisonerobj_maxtotal", data); + gi.cvar_set("ui_prisonerobj_maxtotal", data); } } @@ -9528,7 +9551,7 @@ void CQuake3GameInterface::PrisonerObjCheck(const char *name,const char *data) void CQuake3GameInterface::Use( int entID, const char *name ) { gentity_t *ent = &g_entities[entID]; - + if ( !ent ) { DebugPrint( WL_WARNING, "Use: invalid entID %d\n", entID ); @@ -9812,7 +9835,7 @@ int CQuake3GameInterface::GetFloat( int entID, const char *name, float *value ) } *value = atof( ent->parms->parm[toGet - SET_PARM1] ); break; - + case SET_COUNT: *value = ent->count; break; @@ -9933,6 +9956,10 @@ int CQuake3GameInterface::GetFloat( int entID, const char *name, float *value ) case SET_FACEBLINK: //## %f="0.0" # Set face to Blink expression for number of seconds case SET_FACEBLINKFROWN: //## %f="0.0" # Set face to Blinkfrown expression for number of seconds case SET_FACEFROWN: //## %f="0.0" # Set face to Frown expression for number of seconds + case SET_FACESMILE: //## %f="0.0" # Set face to Smile expression for number of seconds + case SET_FACEGLAD: //## %f="0.0" # Set face to Glad expression for number of seconds + case SET_FACEHAPPY: //## %f="0.0" # Set face to Happy expression for number of seconds + case SET_FACESHOCKED: //## %f="0.0" # Set face to Shocked expression for number of seconds case SET_FACENORMAL: //## %f="0.0" # Set face to Normal expression for number of seconds DebugPrint( WL_WARNING, "GetFloat: SET_FACE___ not implemented\n" ); return false; @@ -10393,7 +10420,7 @@ int CQuake3GameInterface::GetFloat( int entID, const char *name, float *value ) vec3_t distSquared; VectorSubtract(player->currentOrigin, ent->s.origin, distSquared); - + *value = VectorLengthSquared(distSquared); break; } @@ -10448,7 +10475,7 @@ int CQuake3GameInterface::GetVector( int entID, const char *name, vec3_t value case SET_ANGLES: VectorCopy(ent->currentAngles, value); break; - + case SET_TELEPORT_DEST://## %v="0.0 0.0 0.0" # Set origin here as soon as the area is clear DebugPrint( WL_WARNING, "GetVector: SET_TELEPORT_DEST not implemented\n" ); return false; @@ -10939,7 +10966,7 @@ int CQuake3GameInterface::Evaluate( int p1Type, const char *p1, int p2Type, con } break; - + // // GREATER THAN OR EQUAL TO // @@ -11034,7 +11061,7 @@ void CQuake3GameInterface::DeclareVariable( int type, const char *name ) m_varFloats[ name ] = 0.0f; break; - case TK_STRING: + case TK_STRING: m_varStrings[ name ] = "NULL"; break; @@ -11197,7 +11224,7 @@ void CQuake3GameInterface::PrecacheScript( const char *name ) case SCRIPT_COULDNOTREGISTER: if ( !Q_stricmp( newname, "NULL" ) || !Q_stricmp( newname, "default" ) ) {//these are not real errors, suppress warning - return; + return; } Quake3Game()->DebugPrint( IGameInterface::WL_ERROR, "PrecacheScript: Failed to load %s!\n", newname ); assert(SCRIPT_COULDNOTREGISTER); @@ -11230,7 +11257,7 @@ void CQuake3GameInterface::PrecacheSound( const char *name ) void CQuake3GameInterface::PrecacheFromSet( const char *setname, const char *filename ) { //JW NOTENOTE: This will not catch special case get() inlines! (There's not really a good way to do that) - + // Get the id for this set identifier then check against valid types. switch ( GetIDForString( setTable, setname ) ) { @@ -11262,7 +11289,7 @@ void CQuake3GameInterface::PrecacheFromSet( const char *setname, const char *fil { fileHandle_t file; char name[MAX_OSPATH]; - + if (strstr( filename, "/") == NULL && strstr( filename, "\\") == NULL) { Com_sprintf ( name, sizeof(name), "video/%s", filename ); } else { @@ -11288,7 +11315,7 @@ void CQuake3GameInterface::PrecacheFromSet( const char *setname, const char *fil case SET_WEAPON: { const int wp = GetIDForString( WPTable, filename ); - if (wp > 0) + if (wp > 0) { gitem_t *item = FindItemForWeapon( (weapon_t) wp); RegisterItem( item ); //make sure the weapon is cached in case this runs at startup diff --git a/code/game/Q3_Interface.h b/code/game/Q3_Interface.h index d627f41549..dd206d464d 100644 --- a/code/game/Q3_Interface.h +++ b/code/game/Q3_Interface.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __Q3_INTERFACE__ #define __Q3_INTERFACE__ @@ -133,6 +137,10 @@ typedef enum //# setType_e SET_FACEBLINK, //## %f="0.0" # Set face to Blink expression for number of seconds SET_FACEBLINKFROWN, //## %f="0.0" # Set face to Blinkfrown expression for number of seconds SET_FACEFROWN, //## %f="0.0" # Set face to Frown expression for number of seconds + SET_FACESMILE, //## %f="0.0" # Set face to Smile expression for number of seconds + SET_FACEGLAD, //## %f="0.0" # Set face to Glad expression for number of seconds + SET_FACEHAPPY, //## %f="0.0" # Set face to Happy expression for number of seconds + SET_FACESHOCKED, //## %f="0.0" # Set face to Shocked expression for number of seconds SET_FACENORMAL, //## %f="0.0" # Set face to Normal expression for number of seconds SET_FACEEYESCLOSED, //## %f="0.0" # Set face to Eyes closed SET_FACEEYESOPENED, //## %f="0.0" # Set face to Eyes open @@ -544,12 +552,12 @@ typedef struct pscript_s } pscript_t; // STL map type definitions for the Entity List and Script Buffer List. -typedef map < string, int, less, allocator > entitylist_t; -typedef map < string, pscript_t*, less, allocator > scriptlist_t; +typedef std::map < std::string, int > entitylist_t; +typedef std::map < std::string, pscript_t* > scriptlist_t; // STL map type definitions for the variable containers. -typedef map < string, string > varString_m; -typedef map < string, float > varFloat_m; +typedef std::map < std::string, std::string > varString_m; +typedef std::map < std::string, float > varFloat_m; // The Quake 3 Game Interface Class for Quake3 and Icarus to use. diff --git a/code/game/SpeederNPC.cpp b/code/game/SpeederNPC.cpp index faa9f659f3..80f8464dd5 100644 --- a/code/game/SpeederNPC.cpp +++ b/code/game/SpeederNPC.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //seems to be a compiler bug, it doesn't clean out the #ifdefs between dif-compiles //or something, so the headers spew errors on these defs from the previous compile. @@ -296,29 +300,29 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) /* BEGIN Here is where we move the vehicle (forward or back or whatever). BEGIN */ /************************************************************************************/ //Client sets ucmds and such for speed alterations - float speedInc, speedIdleDec, speedIdle, speedIdleAccel, speedMin, speedMax; + float speedInc, speedIdleDec, speedIdle, /*speedIdleAccel, */speedMin, speedMax; playerState_t *parentPS; - playerState_t *pilotPS = NULL; + //playerState_t *pilotPS = NULL; int curTime; #ifdef _JK2MP parentPS = pVeh->m_pParentEntity->playerState; if (pVeh->m_pPilot) { - pilotPS = pVeh->m_pPilot->playerState; + //pilotPS = pVeh->m_pPilot->playerState; } #else parentPS = &pVeh->m_pParentEntity->client->ps; if (pVeh->m_pPilot) { - pilotPS = &pVeh->m_pPilot->client->ps; + //pilotPS = &pVeh->m_pPilot->client->ps; } #endif // If we're flying, make us accelerate at 40% (about half) acceleration rate, and restore the pitch - // to origin (straight) position (at 5% increments). - if ( pVeh->m_ulFlags & VEH_FLYING ) + // to origin (straight) position (at 5% increments). + if ( pVeh->m_ulFlags & VEH_FLYING ) { speedInc = pVeh->m_pVehicleInfo->acceleration * pVeh->m_fTimeModifier * 0.4f; } @@ -419,7 +423,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) // Slide Breaking if (pVeh->m_ulFlags&VEH_SLIDEBREAKING) { - if (pVeh->m_ucmd.forwardmove>=0 + if (pVeh->m_ucmd.forwardmove>=0 #ifndef _JK2MP || ((level.time - pVeh->m_pParentEntity->lastMoveTime)>500) #endif @@ -430,9 +434,9 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) parentPS->speed = 0; } else if ( - (curTime > pVeh->m_iTurboTime) && - !(pVeh->m_ulFlags&VEH_FLYING) && - pVeh->m_ucmd.forwardmove<0 && + (curTime > pVeh->m_iTurboTime) && + !(pVeh->m_ulFlags&VEH_FLYING) && + pVeh->m_ucmd.forwardmove<0 && fabs(pVeh->m_vOrientation[ROLL])>25.0f) { pVeh->m_ulFlags |= VEH_SLIDEBREAKING; @@ -458,12 +462,12 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) speedIdle = pVeh->m_pVehicleInfo->speedIdle; - speedIdleAccel = pVeh->m_pVehicleInfo->accelIdle * pVeh->m_fTimeModifier; + //speedIdleAccel = pVeh->m_pVehicleInfo->accelIdle * pVeh->m_fTimeModifier; speedMin = pVeh->m_pVehicleInfo->speedMin; if ( parentPS->speed || parentPS->groundEntityNum == ENTITYNUM_NONE || pVeh->m_ucmd.forwardmove || pVeh->m_ucmd.upmove > 0 ) - { + { if ( pVeh->m_ucmd.forwardmove > 0 && speedInc ) { parentPS->speed += speedInc; @@ -499,7 +503,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) } else { - if ( !pVeh->m_pVehicleInfo->strafePerc + if ( !pVeh->m_pVehicleInfo->strafePerc #ifdef _JK2MP || (0 && pVeh->m_pParentEntity->s.number < MAX_CLIENTS) ) #else @@ -554,9 +558,9 @@ void ProcessOrientCommands( Vehicle_t *pVeh ) /* BEGIN Here is where make sure the vehicle is properly oriented. BEGIN */ /********************************************************************************/ playerState_t *riderPS; - playerState_t *parentPS; #ifdef _JK2MP + playerState_t *parentPS; float angDif; if (pVeh->m_pPilot) @@ -567,7 +571,7 @@ void ProcessOrientCommands( Vehicle_t *pVeh ) { riderPS = pVeh->m_pParentEntity->playerState; } - parentPS = pVeh->m_pParentEntity->playerState; + //parentPS = pVeh->m_pParentEntity->playerState; //pVeh->m_vOrientation[YAW] = 0.0f;//riderPS->viewangles[YAW]; angDif = AngleSubtract(pVeh->m_vOrientation[YAW], riderPS->viewangles[YAW]); @@ -606,15 +610,15 @@ void ProcessOrientCommands( Vehicle_t *pVeh ) { riderPS = &rider->client->ps; } - parentPS = &pVeh->m_pParentEntity->client->ps; + //parentPS = &pVeh->m_pParentEntity->client->ps; if (pVeh->m_ulFlags & VEH_FLYING) { pVeh->m_vOrientation[YAW] += pVeh->m_vAngularVelocity; } else if ( - (pVeh->m_ulFlags & VEH_SLIDEBREAKING) || // No Angles Control While Out Of Control - (pVeh->m_ulFlags & VEH_OUTOFCONTROL) // No Angles Control While Out Of Control + (pVeh->m_ulFlags & VEH_SLIDEBREAKING) || // No Angles Control While Out Of Control + (pVeh->m_ulFlags & VEH_OUTOFCONTROL) // No Angles Control While Out Of Control ) { // Any ability to change orientation? @@ -676,10 +680,10 @@ extern void G_StartMatrixEffect( gentity_t *ent, int meFlags = 0, int length = 1 void AnimateRiders( Vehicle_t *pVeh ) { animNumber_t Anim = BOTH_VS_IDLE; - float fSpeedPercToMax; + //float fSpeedPercToMax; int iFlags = SETANIM_FLAG_NORMAL, iBlend = 300; playerState_t *pilotPS; - playerState_t *parentPS; + //playerState_t *parentPS; int curTime; @@ -734,7 +738,7 @@ void AnimateRiders( Vehicle_t *pVeh ) // Set the animation, which won't be interrupted until it's completed. // TODO: But what if he's killed? Should the animation remain persistant??? iFlags = SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD; - + #ifdef _JK2MP BG_SetAnim(pVeh->m_pPilot->playerState, bgAllAnims[pVeh->m_pPilot->localAnimIndex].anims, SETANIM_BOTH, Anim, iFlags, iBlend); @@ -789,10 +793,10 @@ void AnimateRiders( Vehicle_t *pVeh ) #ifdef _JK2MP pilotPS = pVeh->m_pPilot->playerState; - parentPS = pVeh->m_pPilot->playerState; + //parentPS = pVeh->m_pPilot->playerState; #else pilotPS = &pVeh->m_pPilot->client->ps; - parentPS = &pVeh->m_pParentEntity->client->ps; + //parentPS = &pVeh->m_pParentEntity->client->ps; #endif #ifndef _JK2MP//SP @@ -805,7 +809,7 @@ void AnimateRiders( Vehicle_t *pVeh ) #endif // Percentage of maximum speed relative to current speed. - fSpeedPercToMax = parentPS->speed / pVeh->m_pVehicleInfo->speedMax; + //fSpeedPercToMax = parentPS->speed / pVeh->m_pVehicleInfo->speedMax; /* // Going in reverse... #ifdef _JK2MP @@ -828,7 +832,7 @@ void AnimateRiders( Vehicle_t *pVeh ) G_RemoveWeaponModels(pVeh->m_pPilot); } } - else + else */ { bool HasWeapon = ((pilotPS->weapon != WP_NONE) && (pilotPS->weapon != WP_MELEE)); @@ -854,7 +858,7 @@ void AnimateRiders( Vehicle_t *pVeh ) // Put Away Saber When It Is Not Active //-------------------------------------- #ifndef _JK2MP - if (HasWeapon && + if (HasWeapon && (pVeh->m_pPilot->s.number>=MAX_CLIENTS || (cg.weaponSelectTime+500)weapon==WP_SABER && !pilotPS->SaberActive()))) { @@ -876,7 +880,7 @@ void AnimateRiders( Vehicle_t *pVeh ) { return; } -#else +#else if (pilotPS->torsoAnim>=BOTH_VS_ATL_S && pilotPS->torsoAnim<=BOTH_VS_ATF_G) { float bodyCurrent = 0.0f; @@ -909,13 +913,13 @@ void AnimateRiders( Vehicle_t *pVeh ) } WeaponPose = (pVeh->m_ulFlags&VEH_SABERINLEFTHAND)?(WPOSE_SABERLEFT):(WPOSE_SABERRIGHT); } - + if (Attacking && WeaponPose) {// Attack! iBlend = 100; iFlags = SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART; - + // Auto Aiming //=============================================== if (!Left && !Right) // Allow player strafe keys to override @@ -924,12 +928,12 @@ void AnimateRiders( Vehicle_t *pVeh ) if (pVeh->m_pPilot->enemy) { vec3_t toEnemy; - float toEnemyDistance; + //float toEnemyDistance; vec3_t actorRight; float actorRightDot; VectorSubtract(pVeh->m_pPilot->currentOrigin, pVeh->m_pPilot->enemy->currentOrigin, toEnemy); - toEnemyDistance = VectorNormalize(toEnemy); + /*toEnemyDistance = */VectorNormalize(toEnemy); AngleVectors(pVeh->m_pParentEntity->currentAngles, 0, actorRight, 0); actorRightDot = DotProduct(toEnemy, actorRight); @@ -944,7 +948,7 @@ void AnimateRiders( Vehicle_t *pVeh ) Right = Left = false; } } - else + else #endif if (pilotPS->weapon==WP_SABER && !Left && !Right) { diff --git a/code/game/WalkerNPC.cpp b/code/game/WalkerNPC.cpp index a4dbab3853..4ec0bb2e53 100644 --- a/code/game/WalkerNPC.cpp +++ b/code/game/WalkerNPC.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //seems to be a compiler bug, it doesn't clean out the #ifdefs between dif-compiles //or something, so the headers spew errors on these defs from the previous compile. @@ -148,7 +152,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) /************************************************************************************/ //Client sets ucmds and such for speed alterations - float speedInc, speedIdleDec, speedIdle, speedIdleAccel, speedMin, speedMax; + float speedInc, speedIdleDec, speedIdle, /*speedIdleAccel, */speedMin, speedMax; float fWalkSpeedMax; bgEntity_t *parent = pVeh->m_pParentEntity; #ifdef _JK2MP @@ -161,7 +165,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) speedMax = pVeh->m_pVehicleInfo->speedMax; speedIdle = pVeh->m_pVehicleInfo->speedIdle; - speedIdleAccel = pVeh->m_pVehicleInfo->accelIdle * pVeh->m_fTimeModifier; + //speedIdleAccel = pVeh->m_pVehicleInfo->accelIdle * pVeh->m_fTimeModifier; speedMin = pVeh->m_pVehicleInfo->speedMin; #ifdef _JK2MP @@ -182,7 +186,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) if ( parentPS->speed || parentPS->groundEntityNum == ENTITYNUM_NONE || pVeh->m_ucmd.forwardmove || pVeh->m_ucmd.upmove > 0 ) - { + { if ( pVeh->m_ucmd.forwardmove > 0 && speedInc ) { parentPS->speed += speedInc; @@ -229,7 +233,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) pVeh->m_ucmd.rightmove = 0; - /*if ( !pVeh->m_pVehicleInfo->strafePerc + /*if ( !pVeh->m_pVehicleInfo->strafePerc || (!g_speederControlScheme->value && !parent->s.number) ) {//if in a strafe-capable vehicle, clear strafing unless using alternate control scheme pVeh->m_ucmd.rightmove = 0; @@ -272,7 +276,7 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) /********************************************************************************/ /* BEGIN Here is where make sure the vehicle is properly oriented. BEGIN */ /********************************************************************************/ - float speed; + //float speed; bgEntity_t *parent = pVeh->m_pParentEntity; playerState_t *parentPS, *riderPS; @@ -303,7 +307,7 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) riderPS = &rider->client->ps; #endif - speed = VectorLength( parentPS->velocity ); + //speed = VectorLength( parentPS->velocity ); // If the player is the rider... if ( rider->s.number < MAX_CLIENTS ) @@ -320,7 +324,7 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) else { float turnSpeed = pVeh->m_pVehicleInfo->turningSpeed; - if ( !pVeh->m_pVehicleInfo->turnWhenStopped + if ( !pVeh->m_pVehicleInfo->turnWhenStopped && !parentPS->speed )//FIXME: or !pVeh->m_ucmd.forwardmove? {//can't turn when not moving //FIXME: or ramp up to max turnSpeed? @@ -368,18 +372,18 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) // This function makes sure that the vehicle is properly animated. static void AnimateVehicle( Vehicle_t *pVeh ) { - animNumber_t Anim = BOTH_STAND1; + animNumber_t Anim = BOTH_STAND1; int iFlags = SETANIM_FLAG_NORMAL, iBlend = 300; gentity_t *parent = (gentity_t *)pVeh->m_pParentEntity; float fSpeedPercToMax; // We're dead (boarding is reused here so I don't have to make another variable :-). - if ( parent->health <= 0 ) + if ( parent->health <= 0 ) { if ( pVeh->m_iBoarding != -999 ) // Animate the death just once! { pVeh->m_iBoarding = -999; - iFlags = SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD; + iFlags = SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD; // FIXME! Why do you keep repeating over and over!!?!?!? Bastard! //Vehicle_SetAnim( parent, SETANIM_LEGS, BOTH_VT_DEATH1, iFlags, iBlend ); @@ -403,16 +407,16 @@ static void AnimateVehicle( Vehicle_t *pVeh ) // Percentage of maximum speed relative to current speed. //float fSpeed = VectorLength( client->ps.velocity ); - fSpeedPercToMax = parent->client->ps.speed / pVeh->m_pVehicleInfo->speedMax; + fSpeedPercToMax = parent->client->ps.speed / pVeh->m_pVehicleInfo->speedMax; // If we're moving... if ( fSpeedPercToMax > 0.0f ) //fSpeedPercToMax >= 0.85f ) - { - float fYawDelta; + { + //float fYawDelta; iBlend = 300; iFlags = SETANIM_FLAG_OVERRIDE; - fYawDelta = pVeh->m_vPrevOrientation[YAW] - pVeh->m_vOrientation[YAW]; + //fYawDelta = pVeh->m_vPrevOrientation[YAW] - pVeh->m_vOrientation[YAW]; // NOTE: Mikes suggestion for fixing the stuttering walk (left/right) is to maintain the // current frame between animations. I have no clue how to do this and have to work on other @@ -420,7 +424,7 @@ static void AnimateVehicle( Vehicle_t *pVeh ) // If we're walking (or our speed is less than .275%)... if ( ( pVeh->m_ucmd.buttons & BUTTON_WALKING ) || fSpeedPercToMax < 0.275f ) - { + { // Make them lean if we're turning. /*if ( fYawDelta < -0.0001f ) { @@ -464,10 +468,10 @@ static void AnimateVehicle( Vehicle_t *pVeh ) } else { - //int iChance = Q_irand( 0, 20000 ); + //int iChance = Q_irand( 0, 20000 ); // Every once in a while buck or do a different idle... - iFlags = SETANIM_FLAG_NORMAL | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD; + iFlags = SETANIM_FLAG_NORMAL | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD; iBlend = 600; #ifdef _JK2MP if (parent->client->ps.m_iVehicleNum) diff --git a/code/game/ai.h b/code/game/ai.h index 20a95ccf1a..da79271682 100644 --- a/code/game/ai.h +++ b/code/game/ai.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __AI__ #define __AI__ diff --git a/code/game/anims.h b/code/game/anims.h index b1c8928995..d63e2a1560 100644 --- a/code/game/anims.h +++ b/code/game/anims.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __ANIMS_H__ #define __ANIMS_H__ @@ -1601,7 +1605,9 @@ typedef enum //# animNumber_e BOTH_STAND_TO_KNEEL, BOTH_KNEEL_TO_STAND, +#ifndef BASE_SAVE_COMPAT BOTH_KNEELATTACK, +#endif BOTH_TUSKENATTACK1, BOTH_TUSKENATTACK2, diff --git a/code/game/b_local.h b/code/game/b_local.h index 467abefc3d..8387c58590 100644 --- a/code/game/b_local.h +++ b/code/game/b_local.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //B_local.h //re-added by MCG diff --git a/code/game/b_public.h b/code/game/b_public.h index 14ef203b6c..67916b99c5 100644 --- a/code/game/b_public.h +++ b/code/game/b_public.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __B_PUBLIC_H__ #define __B_PUBLIC_H__ @@ -187,6 +191,9 @@ typedef struct int shotTime; int burstCount; int burstMin; +#ifdef BASE_SAVE_COMPAT + int burstMean; // keeping for original save compatibility +#endif int burstMax; int burstSpacing; int attackHold; diff --git a/code/game/bg_local.h b/code/game/bg_local.h index df92d2e08e..88e1e4eb76 100644 --- a/code/game/bg_local.h +++ b/code/game/bg_local.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // bg_local.h -- local definitions for the bg (both games) files diff --git a/code/game/bg_misc.cpp b/code/game/bg_misc.cpp index 0b5c777d5c..8bf42c7f28 100644 --- a/code/game/bg_misc.cpp +++ b/code/game/bg_misc.cpp @@ -1,22 +1,26 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this include must remain at the top of every bg_xxxx CPP file #include "common_headers.h" // included in both game dll and client @@ -260,19 +264,19 @@ gitem_t *FindItemForWeapon( weapon_t weapon ) { } //---------------------------------------------- -gitem_t *FindItemForInventory( int inv ) +gitem_t *FindItemForInventory( int inv ) { int i; gitem_t *it; // Now just check for any other kind of item. - for ( i = 1 ; i < bg_numItems ; i++ ) + for ( i = 1 ; i < bg_numItems ; i++ ) { it = &bg_itemlist[i]; if ( it->giType == IT_HOLDABLE ) { - if ( it->giTag == inv ) + if ( it->giTag == inv ) { return it; } @@ -289,13 +293,13 @@ FindItemForWeapon =============== */ -gitem_t *FindItemForAmmo( ammo_t ammo ) +gitem_t *FindItemForAmmo( ammo_t ammo ) { int i; - for ( i = 1 ; i < bg_numItems ; i++ ) + for ( i = 1 ; i < bg_numItems ; i++ ) { - if ( bg_itemlist[i].giType == IT_AMMO && bg_itemlist[i].giTag == ammo ) + if ( bg_itemlist[i].giType == IT_AMMO && bg_itemlist[i].giTag == ammo ) { return &bg_itemlist[i]; } @@ -344,8 +348,8 @@ qboolean BG_CanItemBeGrabbed( const entityState_t *ent, const playerState_t *ps case IT_WEAPON: // See if we already have this weapon. - if ( !(ps->stats[ STAT_WEAPONS ] & ( 1 << item->giTag ))) - { + if ( !(ps->stats[ STAT_WEAPONS ] & ( 1 << item->giTag ))) + { // Don't have this weapon yet, so pick it up. return qtrue; } @@ -358,7 +362,7 @@ qboolean BG_CanItemBeGrabbed( const entityState_t *ent, const playerState_t *ps if ( ps->ammo[weaponData[item->giTag].ammoIndex] >= ammoData[weaponData[item->giTag].ammoIndex].max ) { // full, so don't grab the item - return qfalse; + return qfalse; } return qtrue; // could use more of this type of ammo, so grab the item @@ -390,7 +394,7 @@ qboolean BG_CanItemBeGrabbed( const entityState_t *ent, const playerState_t *ps break; } - if ( ps->ammo[ item->giTag ] >= ammoData[item->giTag].max ) // checkme + if ( ps->ammo[ item->giTag ] >= ammoData[item->giTag].max ) // checkme { return qfalse; // can't hold any more } @@ -426,7 +430,7 @@ qboolean BG_CanItemBeGrabbed( const entityState_t *ent, const playerState_t *ps case IT_BATTERY: // don't pick up if already at max - if ( ps->batteryCharge >= MAX_BATTERIES ) + if ( ps->batteryCharge >= MAX_BATTERIES ) { return qfalse; } @@ -435,7 +439,7 @@ qboolean BG_CanItemBeGrabbed( const entityState_t *ent, const playerState_t *ps case IT_HOLOCRON: // pretty lame but for now you can always pick these up return qtrue; - + case IT_HOLDABLE: if ( item->giTag >= INV_ELECTROBINOCULARS && item->giTag <= INV_SENTRY ) @@ -482,20 +486,20 @@ void EvaluateTrajectory( const trajectory_t *tr, int atTime, vec3_t result ) { VectorMA( tr->trBase, phase, tr->trDelta, result ); break; case TR_LINEAR_STOP: - if ( atTime > tr->trTime + tr->trDuration ) + if ( atTime > tr->trTime + tr->trDuration ) { atTime = tr->trTime + tr->trDuration; } //old totally linear deltaTime = ( atTime - tr->trTime ) * 0.001F; // milliseconds to seconds - if ( deltaTime < 0 ) + if ( deltaTime < 0 ) {//going past the total duration deltaTime = 0; } VectorMA( tr->trBase, deltaTime, tr->trDelta, result ); break; case TR_NONLINEAR_STOP: - if ( atTime > tr->trTime + tr->trDuration ) + if ( atTime > tr->trTime + tr->trDuration ) { atTime = tr->trTime + tr->trDuration; } @@ -547,7 +551,7 @@ void EvaluateTrajectoryDelta( const trajectory_t *tr, int atTime, vec3_t result VectorScale( tr->trDelta, phase, result ); break; case TR_LINEAR_STOP: - if ( atTime > tr->trTime + tr->trDuration ) + if ( atTime > tr->trTime + tr->trDuration ) { VectorClear( result ); return; @@ -606,15 +610,15 @@ This is done after each set of usercmd_t on the server, and after local prediction on the client ======================== */ -void PlayerStateToEntityState( playerState_t *ps, entityState_t *s ) +void PlayerStateToEntityState( playerState_t *ps, entityState_t *s ) { int i; - if ( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPECTATOR ) + if ( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPECTATOR ) { s->eType = ET_INVISIBLE; - } - /*else if ( ps->stats[STAT_HEALTH] <= GIB_HEALTH ) + } + /*else if ( ps->stats[STAT_HEALTH] <= GIB_HEALTH ) { s->eType = ET_INVISIBLE; } */ @@ -687,14 +691,14 @@ void PlayerStateToEntityState( playerState_t *ps, entityState_t *s ) side = DotProduct (ps->velocity, right); sign = side < 0 ? -1 : 1; side = fabs(side); - + value = 2; // g_rollangle->value; if (side < 200 /* g_rollspeed->value */ ) side = side * value / 200; // g_rollspeed->value; else side = value; - + s->angles[ROLL] = (int)(side*sign * 4); } #endif @@ -709,7 +713,7 @@ Items can be picked up without actually touching their physical bounds ============ */ qboolean BG_PlayerTouchesItem( playerState_t *ps, entityState_t *item, int atTime ) { - vec3_t origin; + vec3_t origin = { 0.0f }; EvaluateTrajectory( &item->pos, atTime, origin ); diff --git a/code/game/bg_pangles.cpp b/code/game/bg_pangles.cpp index cb983fab77..052dc31cf0 100644 --- a/code/game/bg_pangles.cpp +++ b/code/game/bg_pangles.cpp @@ -1,22 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this include must remain at the top of every bg_xxxx CPP file #include "common_headers.h" // define GAME_INCLUDE so that g_public.h does not define the @@ -55,8 +59,8 @@ extern cvar_t *g_debugMelee; void BG_IK_MoveLimb( CGhoul2Info_v &ghoul2, int boltIndex, char *animBone, char *firstBone, char *secondBone, - int time, entityState_t *ent, int animFileIndex, int basePose, - vec3_t desiredPos, qboolean *ikInProgress, vec3_t origin, + int time, entityState_t *ent, int animFileIndex, int basePose, + vec3_t desiredPos, qboolean *ikInProgress, vec3_t origin, vec3_t angles, vec3_t scale, int blendTime, qboolean forceHalt ) { mdxaBone_t holdPointMatrix; @@ -91,7 +95,7 @@ void BG_IK_MoveLimb( CGhoul2Info_v &ghoul2, int boltIndex, char *animBone, char ikP.pcjOverrides = 0; ikP.radius = 10.0f; VectorCopy( scale, ikP.scale ); - + //base pose frames for the limb ikP.startFrame = anim->firstFrame + anim->numFrames; ikP.endFrame = anim->firstFrame + anim->numFrames; @@ -213,7 +217,7 @@ void BG_IK_MoveLimb( CGhoul2Info_v &ghoul2, int boltIndex, char *animBone, char gi.G2API_SetBoneIKState( ghoul2, time, "thoracic", IKS_NONE, NULL ); gi.G2API_SetBoneIKState( ghoul2, time, secondBone, IKS_NONE, NULL ); gi.G2API_SetBoneIKState( ghoul2, time, firstBone, IKS_NONE, NULL ); - + //then reset the angles/anims on these PCJs gi.G2API_SetBoneAngles( &ghoul2[0], "lower_lumbar", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, time ); gi.G2API_SetBoneAngles( &ghoul2[0], "upper_lumbar", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, time ); @@ -231,7 +235,7 @@ void BG_IK_MoveLimb( CGhoul2Info_v &ghoul2, int boltIndex, char *animBone, char //And finally, get rid of all the ik state effector data by calling with null bone name (similar to how we init it). gi.G2API_SetBoneIKState( ghoul2, time, NULL, IKS_NONE, NULL ); - + *ikInProgress = qfalse; } } @@ -282,9 +286,9 @@ void PM_IKUpdate( gentity_t *ent ) { //point the limb BG_IK_MoveLimb( ent->ghoul2, grabbedByBolt, animBone, firstBone, secondBone, - level.time, &ent->s, ent->client->clientInfo.animFileIndex, + level.time, &ent->s, ent->client->clientInfo.animFileIndex, ent->client->ps.torsoAnim/*BOTH_DEAD1*/, boltOrg, &ent->client->ps.ikStatus, - ent->client->ps.origin, ent->client->ps.viewangles, ent->s.modelScale, + ent->client->ps.origin, ent->client->ps.viewangles, ent->s.modelScale, 500, qfalse ); //now see if we need to be turned and/or pulled @@ -295,7 +299,7 @@ void PM_IKUpdate( gentity_t *ent ) gi.G2API_GetBoltMatrix( ent->ghoul2, 0, grabbedByBolt, &boltMatrix, tAngles, ent->client->ps.origin, level.time, 0, ent->s.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, grabbedByOrg ); - + //check for turn vec3_t org2Targ, org2Bolt; VectorSubtract( boltOrg, ent->currentOrigin, org2Targ ); @@ -354,9 +358,9 @@ void PM_IKUpdate( gentity_t *ent ) if ( ent->client->ps.heldByBolt ) { BG_IK_MoveLimb( ent->ghoul2, ent->client->ps.heldByBolt, animBone, firstBone, secondBone, - level.time, &ent->s, ent->client->clientInfo.animFileIndex, - ent->client->ps.torsoAnim/*BOTH_DEAD1*/, (float *)vec3_origin, - &ent->client->ps.ikStatus, ent->client->ps.origin, + level.time, &ent->s, ent->client->clientInfo.animFileIndex, + ent->client->ps.torsoAnim/*BOTH_DEAD1*/, (float *)vec3_origin, + &ent->client->ps.ikStatus, ent->client->ps.origin, ent->client->ps.viewangles, ent->s.modelScale, 500, qtrue ); } } @@ -368,7 +372,7 @@ void BG_G2SetBoneAngles( centity_t *cent, gentity_t *gent, int boneIndex, const { if (boneIndex!=-1) { - gi.G2API_SetBoneAnglesIndex( ¢->gent->ghoul2[0], boneIndex, angles, flags, up, right, forward, modelList, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( ¢->gent->ghoul2[0], boneIndex, angles, flags, up, right, forward, modelList, 0, 0 ); } } @@ -381,7 +385,7 @@ void PM_ScaleUcmd( playerState_t *ps, usercmd_t *cmd, gentity_t *gent ) //clamp the turn rate int maxPitchSpeed = MAX_PITCHSPEED_X_WING;//switch, eventually? Or read from file? int diff = AngleNormalize180(SHORT2ANGLE((cmd->angles[PITCH]+ps->delta_angles[PITCH]))) - floor(ps->viewangles[PITCH]); - + if ( diff > maxPitchSpeed ) { cmd->angles[PITCH] = ANGLE2SHORT( ps->viewangles[PITCH] + maxPitchSpeed ) - ps->delta_angles[PITCH]; @@ -464,9 +468,9 @@ qboolean PM_AdjustAnglesToPuller( gentity_t *ent, gentity_t *puller, usercmd_t * qboolean PM_AdjustAngleForWallRun( gentity_t *ent, usercmd_t *ucmd, qboolean doMove ) { if (( ent->client->ps.legsAnim == BOTH_WALL_RUN_RIGHT || ent->client->ps.legsAnim == BOTH_WALL_RUN_LEFT ) && ent->client->ps.legsAnimTimer > 500 ) - {//wall-running and not at end of anim + {//wall-running and not at end of anim //stick to wall, if there is one - vec3_t fwd, rt, traceTo, mins = {ent->mins[0],ent->mins[1],0}, maxs = {ent->maxs[0],ent->maxs[1],24}, fwdAngles = {0, ent->client->ps.viewangles[YAW], 0}; + vec3_t fwd, rt, traceTo, mins = {ent->mins[0],ent->mins[1],0}, maxs = {ent->maxs[0],ent->maxs[1],24}, fwdAngles = {0, ent->client->ps.viewangles[YAW], 0}; trace_t trace; float dist, yawAdjust=0.0f; @@ -484,13 +488,13 @@ qboolean PM_AdjustAngleForWallRun( gentity_t *ent, usercmd_t *ucmd, qboolean doM } VectorMA( ent->currentOrigin, dist, rt, traceTo ); gi.trace( &trace, ent->currentOrigin, mins, maxs, traceTo, ent->s.number, ent->clipmask, (EG2_Collision)0, 0 ); - if ( trace.fraction < 1.0f + if ( trace.fraction < 1.0f && (trace.plane.normal[2] >= 0.0f && trace.plane.normal[2] <= 0.4f) )//&& ent->client->ps.groundEntityNum == ENTITYNUM_NONE ) { trace_t trace2; vec3_t traceTo2; vec3_t wallRunFwd, wallRunAngles = {0}; - + wallRunAngles[YAW] = vectoyaw( trace.plane.normal )+yawAdjust; AngleVectors( wallRunAngles, wallRunFwd, NULL, NULL ); @@ -500,8 +504,8 @@ qboolean PM_AdjustAngleForWallRun( gentity_t *ent, usercmd_t *ucmd, qboolean doM {//wall we can't run on in front of us trace.fraction = 1.0f;//just a way to get it to kick us off the wall below } - } - if ( trace.fraction < 1.0f + } + if ( trace.fraction < 1.0f && (trace.plane.normal[2] >= 0.0f && trace.plane.normal[2] <= 0.4f) )//&& ent->client->ps.groundEntityNum == ENTITYNUM_NONE ) {//still a vertical wall there //FIXME: don't pull around 90 turns @@ -544,7 +548,7 @@ qboolean PM_AdjustAngleForWallRun( gentity_t *ent, usercmd_t *ucmd, qboolean doM } //pull me toward the wall VectorScale( trace.plane.normal, -128, ent->client->ps.velocity ); - if ( ent->client->ps.legsAnimTimer > 500 ) + if ( ent->client->ps.legsAnimTimer > 500 ) {//not at end of anim yet, pushing forward //FIXME: or MA? float speed = 175; @@ -557,7 +561,7 @@ qboolean PM_AdjustAngleForWallRun( gentity_t *ent, usercmd_t *ucmd, qboolean doM speed = 250;//running speed } VectorMA( ent->client->ps.velocity, speed, fwd, ent->client->ps.velocity ); - } + } ent->client->ps.velocity[2] = zVel;//preserve z velocity //VectorMA( ent->client->ps.velocity, -128, trace.plane.normal, ent->client->ps.velocity ); //pull me toward the wall, too @@ -688,7 +692,7 @@ qboolean PM_AdjustAnglesForBackAttack( gentity_t *ent, usercmd_t *ucmd ) ucmd->angles[PITCH] = ANGLE2SHORT( ent->client->ps.viewangles[PITCH] ) - ent->client->ps.delta_angles[PITCH]; ucmd->angles[YAW] = ANGLE2SHORT( ent->client->ps.viewangles[YAW] ) - ent->client->ps.delta_angles[YAW]; } - else + else {//keep player facing away from their enemy vec3_t enemyBehindDir; VectorSubtract( ent->currentOrigin, ent->enemy->currentOrigin, enemyBehindDir ); @@ -727,8 +731,8 @@ qboolean PM_AdjustAnglesForSaberLock( gentity_t *ent, usercmd_t *ucmd ) int G_MinGetUpTime( gentity_t *ent ) { - if ( ent - && ent->client + if ( ent + && ent->client && ( ent->client->ps.legsAnim == BOTH_PLAYER_PA_3_FLY || ent->client->ps.legsAnim == BOTH_LK_DL_ST_T_SB_1_L || ent->client->ps.legsAnim == BOTH_RELEASED ) ) @@ -768,7 +772,7 @@ qboolean PM_AdjustAnglesForKnockdown( gentity_t *ent, usercmd_t *ucmd, qboolean {//being knocked down or getting up, can't do anything! if ( !angleClampOnly ) { - if ( ent->client->ps.legsAnimTimer > G_MinGetUpTime( ent ) + if ( ent->client->ps.legsAnimTimer > G_MinGetUpTime( ent ) || (ent->s.number >= MAX_CLIENTS&&!G_ControlledByPlayer(ent)) ) {//can't get up yet ucmd->forwardmove = 0; @@ -838,7 +842,7 @@ qboolean PM_AdjustAngleForWallRunUp( gentity_t *ent, usercmd_t *ucmd, qboolean d if ( ent->client->ps.legsAnim == BOTH_FORCEWALLRUNFLIP_START ) {//wall-running up //stick to wall, if there is one - vec3_t fwd, traceTo, mins = {ent->mins[0],ent->mins[1],0}, maxs = {ent->maxs[0],ent->maxs[1],24}, fwdAngles = {0, ent->client->ps.viewangles[YAW], 0}; + vec3_t fwd, traceTo, mins = {ent->mins[0],ent->mins[1],0}, maxs = {ent->maxs[0],ent->maxs[1],24}, fwdAngles = {0, ent->client->ps.viewangles[YAW], 0}; trace_t trace; float dist = 128; @@ -854,9 +858,9 @@ qboolean PM_AdjustAngleForWallRunUp( gentity_t *ent, usercmd_t *ucmd, qboolean d VectorCopy( top, bottom ); bottom[2] -= 64.0f;//was 32.0f gi.trace( &trace2, top, ent->mins, ent->maxs, bottom, ent->s.number, ent->clipmask, (EG2_Collision)0, 0 ); - if ( !trace2.allsolid - && !trace2.startsolid - && trace2.fraction < 1.0f + if ( !trace2.allsolid + && !trace2.startsolid + && trace2.fraction < 1.0f && trace2.plane.normal[2] > 0.7f )//slope we can stand on {//cool, do the alt-flip and land on whetever it is we just scaled up VectorScale( fwd, 100, ent->client->ps.velocity ); @@ -870,10 +874,10 @@ qboolean PM_AdjustAngleForWallRunUp( gentity_t *ent, usercmd_t *ucmd, qboolean d return qfalse; } } - if ( //ucmd->upmove <= 0 && - ent->client->ps.legsAnimTimer > 0 - && ucmd->forwardmove > 0 - && trace.fraction < 1.0f + if ( //ucmd->upmove <= 0 && + ent->client->ps.legsAnimTimer > 0 + && ucmd->forwardmove > 0 + && trace.fraction < 1.0f && (trace.plane.normal[2] >= 0.0f && trace.plane.normal[2] <= MAX_WALL_RUN_Z_NORMAL) ) {//still a vertical wall there //make sure there's not a ceiling above us! @@ -966,7 +970,7 @@ qboolean PM_AdjustAngleForWallJump( gentity_t *ent, usercmd_t *ucmd, qboolean do || PM_InReboundHold( ent->client->ps.legsAnim ) ) {//hugging wall, getting ready to jump off //stick to wall, if there is one - vec3_t checkDir, traceTo, mins = {ent->mins[0],ent->mins[1],0}, maxs = {ent->maxs[0],ent->maxs[1],24}, fwdAngles = {0, ent->client->ps.viewangles[YAW], 0}; + vec3_t checkDir, traceTo, mins = {ent->mins[0],ent->mins[1],0}, maxs = {ent->maxs[0],ent->maxs[1],24}, fwdAngles = {0, ent->client->ps.viewangles[YAW], 0}; trace_t trace; float dist = 128, yawAdjust; switch ( ent->client->ps.legsAnim ) @@ -1022,7 +1026,7 @@ qboolean PM_AdjustAngleForWallJump( gentity_t *ent, usercmd_t *ucmd, qboolean do } VectorMA( ent->currentOrigin, dist, checkDir, traceTo ); gi.trace( &trace, ent->currentOrigin, mins, maxs, traceTo, ent->s.number, ent->clipmask, (EG2_Collision)0, 0 ); - if ( //ucmd->upmove <= 0 && + if ( //ucmd->upmove <= 0 && ent->client->ps.legsAnimTimer > 100 && trace.fraction < 1.0f && fabs(trace.plane.normal[2]) <= MAX_WALL_GRAB_SLOPE ) {//still a vertical wall there @@ -1060,7 +1064,7 @@ qboolean PM_AdjustAngleForWallJump( gentity_t *ent, usercmd_t *ucmd, qboolean do ent->client->ps.pm_flags |= PMF_STUCK_TO_WALL; return qtrue; } - else if ( doMove + else if ( doMove && (ent->client->ps.pm_flags&PMF_STUCK_TO_WALL)) {//jump off //push off of it! @@ -1092,7 +1096,7 @@ qboolean PM_AdjustAngleForWallJump( gentity_t *ent, usercmd_t *ucmd, qboolean do qboolean PM_AdjustAnglesForBFKick( gentity_t *self, usercmd_t *ucmd, vec3_t fwdAngs, qboolean aimFront ) { //Auto-aim the player at the ent in front/back of them - //FIXME: camera angle should always be in front/behind me for the 2 kicks + //FIXME: camera angle should always be in front/behind me for the 2 kicks // (to hide how far away the two entities really are) //FIXME: don't let the people we're auto-aiming at move? gentity_t *ent; @@ -1104,12 +1108,12 @@ qboolean PM_AdjustAnglesForBFKick( gentity_t *self, usercmd_t *ucmd, vec3_t fwdA float distToEnt, bestDist = Q3_INFINITE; float dot, bestDot = -1.1f; float bestYaw = Q3_INFINITE; - + AngleVectors( fwdAngs, v_fwd, NULL, NULL ); - + VectorCopy( self->currentOrigin, center ); - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { mins[i] = center[i] - radius; maxs[i] = center[i] + radius; @@ -1117,7 +1121,7 @@ qboolean PM_AdjustAnglesForBFKick( gentity_t *self, usercmd_t *ucmd, vec3_t fwdA int numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); - for ( e = 0 ; e < numListedEntities ; e++ ) + for ( e = 0 ; e < numListedEntities ; e++ ) { ent = entityList[ e ]; @@ -1149,7 +1153,7 @@ qboolean PM_AdjustAnglesForBFKick( gentity_t *self, usercmd_t *ucmd, vec3_t fwdA distToEnt = VectorNormalize( vec2Ent ); if ( distToEnt > radius ) continue; - + if ( !aimFront ) {//aim away from them VectorScale( vec2Ent, -1, vec2Ent ); @@ -1340,7 +1344,7 @@ qboolean G_OkayToLean( playerState_t *ps, usercmd_t *cmd, qboolean interruptOkay && ps->groundEntityNum != ENTITYNUM_NONE//on ground && ( (interruptOkay//okay to interrupt a lean && PM_DodgeAnim( ps->torsoAnim ) )//already leaning - || + || (!ps->weaponTime//not attacking or being prevented from attacking && !ps->legsAnimTimer//not in any held legs anim && !ps->torsoAnimTimer) //not in any held torso anim @@ -1364,16 +1368,16 @@ are being updated isntead of a full move //FIXME: Now that they pmove twice per think, they snap-look really fast ================ */ -void PM_UpdateViewAngles( playerState_t *ps, usercmd_t *cmd, gentity_t *gent ) +void PM_UpdateViewAngles( playerState_t *ps, usercmd_t *cmd, gentity_t *gent ) { short temp; float rootPitch = 0, pitchMin=-75, pitchMax=75, yawMin=0, yawMax=0, lockedYawValue = 0; //just to shut up warnings int i; vec3_t start, end, tmins, tmaxs, right; trace_t trace; - qboolean lockedYaw = qfalse, clamped = qfalse; + qboolean lockedYaw = qfalse/*, clamped = qfalse*/; - if ( ps->pm_type == PM_INTERMISSION ) + if ( ps->pm_type == PM_INTERMISSION ) { return; // no view changes at all } @@ -1386,7 +1390,7 @@ void PM_UpdateViewAngles( playerState_t *ps, usercmd_t *cmd, gentity_t *gent ) } #endif - if ( ps->pm_type != PM_SPECTATOR && ps->stats[STAT_HEALTH] <= 0 ) + if ( ps->pm_type != PM_SPECTATOR && ps->stats[STAT_HEALTH] <= 0 ) { return; // no view changes at all } @@ -1401,7 +1405,7 @@ void PM_UpdateViewAngles( playerState_t *ps, usercmd_t *cmd, gentity_t *gent ) { pitchMin = 0 - gent->client->renderInfo.headPitchRangeUp - gent->client->renderInfo.torsoPitchRangeUp; pitchMax = gent->client->renderInfo.headPitchRangeDown + gent->client->renderInfo.torsoPitchRangeDown; - + yawMin = 0 - gent->client->renderInfo.headYawRangeLeft - gent->client->renderInfo.torsoYawRangeLeft; yawMax = gent->client->renderInfo.headYawRangeRight + gent->client->renderInfo.torsoYawRangeRight; @@ -1489,35 +1493,35 @@ void PM_UpdateViewAngles( playerState_t *ps, usercmd_t *cmd, gentity_t *gent ) const short yawClampMax = ANGLE2SHORT(lockedYawValue+yawMax); // circularly clamp the angles with deltas - for (i=0 ; i<3 ; i++) + for (i=0 ; i<3 ; i++) { temp = cmd->angles[i] + ps->delta_angles[i]; - if ( i == PITCH ) + if ( i == PITCH ) { //FIXME get this limit from the NPCs stats? // don't let the player look up or down more than 90 degrees - if ( temp > pitchClampMax ) + if ( temp > pitchClampMax ) { ps->delta_angles[i] = (pitchClampMax - cmd->angles[i]) & 0xffff; //& clamp to short temp = pitchClampMax; - clamped = qtrue; - } - else if ( temp < pitchClampMin ) + //clamped = qtrue; + } + else if ( temp < pitchClampMin ) { ps->delta_angles[i] = (pitchClampMin - cmd->angles[i]) & 0xffff; //& clamp to short temp = pitchClampMin; - clamped = qtrue; + //clamped = qtrue; } } /* - if ( i == ROLL && ps->vehicleIndex != VEHICLE_NONE ) + if ( i == ROLL && ps->vehicleIndex != VEHICLE_NONE ) { - if ( temp > pitchClampMax ) + if ( temp > pitchClampMax ) { ps->delta_angles[i] = (pitchClampMax - cmd->angles[i]) & 0xffff; temp = pitchClampMax; - } - else if ( temp < pitchClampMin ) + } + else if ( temp < pitchClampMin ) { ps->delta_angles[i] = (pitchClampMin - cmd->angles[i]) & 0xffff; temp = pitchClampMin; @@ -1526,7 +1530,7 @@ void PM_UpdateViewAngles( playerState_t *ps, usercmd_t *cmd, gentity_t *gent ) */ //FIXME: Are we losing precision here? Is this why it jitters? /* - if ( i == YAW && lockedYaw ) + if ( i == YAW && lockedYaw ) { float multiplier = 1.0f; float newYaw = SHORT2ANGLE(temp); @@ -1543,14 +1547,14 @@ void PM_UpdateViewAngles( playerState_t *ps, usercmd_t *cmd, gentity_t *gent ) yawDiff = 360 + yawDiff; } // don't let the player look left or right more than the clamp, if any - if ( yawDiff > yawMax ) + if ( yawDiff > yawMax ) { - clamped = qtrue; + //clamped = qtrue; ps->viewangles[i] = AngleNormalize180( lockedYawValue+((yawMax-2)*multiplier) ); - } - else if ( yawDiff < yawMin ) + } + else if ( yawDiff < yawMin ) { - clamped = qtrue; + //clamped = qtrue; ps->viewangles[i] = AngleNormalize180( lockedYawValue+((yawMin+2)*multiplier) ); } else @@ -1559,21 +1563,21 @@ void PM_UpdateViewAngles( playerState_t *ps, usercmd_t *cmd, gentity_t *gent ) } } */ - if ( i == YAW && lockedYaw ) + if ( i == YAW && lockedYaw ) { //FIXME get this limit from the NPCs stats? // don't let the player look up or down more than 90 degrees - if ( temp > yawClampMax ) + if ( temp > yawClampMax ) { ps->delta_angles[i] = (yawClampMax - cmd->angles[i]) & 0xffff; //& clamp to short temp = yawClampMax; - clamped = qtrue; - } - else if ( temp < yawClampMin ) + //clamped = qtrue; + } + else if ( temp < yawClampMin ) { ps->delta_angles[i] = (yawClampMin - cmd->angles[i]) & 0xffff; //& clamp to short temp = yawClampMin; - clamped = qtrue; + //clamped = qtrue; } ps->viewangles[i] = SHORT2ANGLE(temp); } @@ -1701,7 +1705,7 @@ void PM_UpdateViewAngles( playerState_t *ps, usercmd_t *cmd, gentity_t *gent ) if ( anim != -1 ) { int extraHoldTime = 0; - if ( PM_DodgeAnim( ps->torsoAnim ) + if ( PM_DodgeAnim( ps->torsoAnim ) && !PM_DodgeHoldAnim( ps->torsoAnim ) ) {//already in a dodge //use the hold pose, don't start it all over again diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index 0af60a639d..11eac24275 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -1,20 +1,20 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors +This file is part of the OpenJK source code. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // this include must remain at the top of every bg_xxxx CPP file #include "common_headers.h" @@ -50,61 +50,61 @@ extern cvar_t *g_speederControlScheme; extern cvar_t *g_saberNewControlScheme; extern cvar_t *g_saberNewCombat; -extern qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f ); -extern void WP_ForcePowerDrain( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); -extern qboolean ValidAnimFileIndex ( int index ); -extern qboolean PM_ControlledByPlayer( void ); -extern qboolean PM_DroidMelee( int npc_class ); -extern qboolean PM_PainAnim( int anim ); -extern qboolean PM_JumpingAnim( int anim ); -extern qboolean PM_FlippingAnim( int anim ); -extern qboolean PM_RollingAnim( int anim ); -extern qboolean PM_SwimmingAnim( int anim ); -extern qboolean PM_InKnockDown( playerState_t *ps ); -extern qboolean PM_InRoll( playerState_t *ps ); -extern qboolean PM_DodgeAnim( int anim ); -extern qboolean PM_InSlopeAnim( int anim ); -extern qboolean PM_ForceAnim( int anim ); -extern qboolean PM_InKnockDownOnGround( playerState_t *ps ); -extern qboolean PM_InSpecialJump( int anim ); -extern qboolean PM_RunningAnim( int anim ); -extern qboolean PM_WalkingAnim( int anim ); -extern qboolean PM_SwimmingAnim( int anim ); -extern qboolean PM_JumpingAnim( int anim ); -extern qboolean PM_SaberStanceAnim( int anim ); -extern qboolean PM_SaberDrawPutawayAnim( int anim ); -extern void PM_SetJumped( float height, qboolean force ); -extern qboolean PM_InGetUpNoRoll( playerState_t *ps ); -extern qboolean PM_CrouchAnim( int anim ); -extern qboolean G_TryingKataAttack( gentity_t *self, usercmd_t *cmd ); -extern qboolean G_TryingCartwheel( gentity_t *self, usercmd_t *cmd ); -extern qboolean G_TryingSpecial( gentity_t *self, usercmd_t *cmd ); -extern qboolean G_TryingJumpAttack( gentity_t *self, usercmd_t *cmd ); -extern qboolean G_TryingJumpForwardAttack( gentity_t *self, usercmd_t *cmd ); -extern qboolean G_TryingLungeAttack( gentity_t *self, usercmd_t *cmd ); -extern qboolean G_TryingPullAttack( gentity_t *self, usercmd_t *cmd, qboolean amPulling ); -extern qboolean G_InCinematicSaberAnim( gentity_t *self ); -extern qboolean G_ControlledByPlayer( gentity_t *self ); +extern qboolean InFront(vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f); +extern void WP_ForcePowerDrain(gentity_t *self, forcePowers_t forcePower, int overrideAmt); +extern qboolean ValidAnimFileIndex(int index); +extern qboolean PM_ControlledByPlayer(void); +extern qboolean PM_DroidMelee(int npc_class); +extern qboolean PM_PainAnim(int anim); +extern qboolean PM_JumpingAnim(int anim); +extern qboolean PM_FlippingAnim(int anim); +extern qboolean PM_RollingAnim(int anim); +extern qboolean PM_SwimmingAnim(int anim); +extern qboolean PM_InKnockDown(playerState_t *ps); +extern qboolean PM_InRoll(playerState_t *ps); +extern qboolean PM_DodgeAnim(int anim); +extern qboolean PM_InSlopeAnim(int anim); +extern qboolean PM_ForceAnim(int anim); +extern qboolean PM_InKnockDownOnGround(playerState_t *ps); +extern qboolean PM_InSpecialJump(int anim); +extern qboolean PM_RunningAnim(int anim); +extern qboolean PM_WalkingAnim(int anim); +extern qboolean PM_SwimmingAnim(int anim); +extern qboolean PM_JumpingAnim(int anim); +extern qboolean PM_SaberStanceAnim(int anim); +extern qboolean PM_SaberDrawPutawayAnim(int anim); +extern void PM_SetJumped(float height, qboolean force); +extern qboolean PM_InGetUpNoRoll(playerState_t *ps); +extern qboolean PM_CrouchAnim(int anim); +extern qboolean G_TryingKataAttack(gentity_t *self, usercmd_t *cmd); +extern qboolean G_TryingCartwheel(gentity_t *self, usercmd_t *cmd); +extern qboolean G_TryingSpecial(gentity_t *self, usercmd_t *cmd); +extern qboolean G_TryingJumpAttack(gentity_t *self, usercmd_t *cmd); +extern qboolean G_TryingJumpForwardAttack(gentity_t *self, usercmd_t *cmd); +extern qboolean G_TryingLungeAttack(gentity_t *self, usercmd_t *cmd); +extern qboolean G_TryingPullAttack(gentity_t *self, usercmd_t *cmd, qboolean amPulling); +extern qboolean G_InCinematicSaberAnim(gentity_t *self); +extern qboolean G_ControlledByPlayer(gentity_t *self); extern int g_crosshairEntNum; -int PM_AnimLength( int index, animNumber_t anim ); -qboolean PM_LockedAnim( int anim ); -qboolean PM_StandingAnim( int anim ); -qboolean PM_InOnGroundAnim ( playerState_t *ps ); -qboolean PM_SuperBreakWinAnim( int anim ); -qboolean PM_SuperBreakLoseAnim( int anim ); -qboolean PM_LockedAnim( int anim ); -saberMoveName_t PM_SaberFlipOverAttackMove( void ); -qboolean PM_CheckFlipOverAttackMove( qboolean checkEnemy ); -saberMoveName_t PM_SaberJumpForwardAttackMove( void ); -qboolean PM_CheckJumpForwardAttackMove( void ); -saberMoveName_t PM_SaberBackflipAttackMove( void ); -qboolean PM_CheckBackflipAttackMove( void ); -saberMoveName_t PM_SaberDualJumpAttackMove( void ); -qboolean PM_CheckDualJumpAttackMove( void ); -saberMoveName_t PM_SaberLungeAttackMove( qboolean fallbackToNormalLunge ); -qboolean PM_CheckLungeAttackMove( void ); +int PM_AnimLength(int index, animNumber_t anim); +qboolean PM_LockedAnim(int anim); +qboolean PM_StandingAnim(int anim); +qboolean PM_InOnGroundAnim(playerState_t *ps); +qboolean PM_SuperBreakWinAnim(int anim); +qboolean PM_SuperBreakLoseAnim(int anim); +qboolean PM_LockedAnim(int anim); +saberMoveName_t PM_SaberFlipOverAttackMove(void); +qboolean PM_CheckFlipOverAttackMove(qboolean checkEnemy); +saberMoveName_t PM_SaberJumpForwardAttackMove(void); +qboolean PM_CheckJumpForwardAttackMove(void); +saberMoveName_t PM_SaberBackflipAttackMove(void); +qboolean PM_CheckBackflipAttackMove(void); +saberMoveName_t PM_SaberDualJumpAttackMove(void); +qboolean PM_CheckDualJumpAttackMove(void); +saberMoveName_t PM_SaberLungeAttackMove(qboolean fallbackToNormalLunge); +qboolean PM_CheckLungeAttackMove(void); // Okay, here lies the much-dreaded Pat-created FSM movement chart... Heretic II strikes again! // Why am I inflicting this on you? Well, it's better than hardcoded states. // Ideally this will be replaced with an external file or more sophisticated move-picker @@ -119,209 +119,209 @@ qboolean PM_CheckLungeAttackMove( void ); //FIXME: add the alternate anims for each style? saberMoveData_t saberMoveData[LS_MOVE_MAX] = {// NB:randomized // name anim(do all styles?)startQ endQ setanimflag blend, blocking chain_idle chain_attack trailLen - {"None", BOTH_STAND1, Q_R, Q_R, AFLAG_IDLE, 350, BLK_NO, LS_NONE, LS_NONE, 0 }, // LS_NONE = 0, + { "None", BOTH_STAND1, Q_R, Q_R, AFLAG_IDLE, 350, BLK_NO, LS_NONE, LS_NONE, 0 }, // LS_NONE = 0, // General movements with saber - {"Ready", BOTH_STAND2, Q_R, Q_R, AFLAG_IDLE, 350, BLK_WIDE, LS_READY, LS_S_R2L, 0 }, // LS_READY, - {"Draw", BOTH_STAND1TO2, Q_R, Q_R, AFLAG_FINISH, 350, BLK_NO, LS_READY, LS_S_R2L, 0 }, // LS_DRAW, - {"Putaway", BOTH_STAND2TO1, Q_R, Q_R, AFLAG_FINISH, 350, BLK_NO, LS_READY, LS_S_R2L, 0 }, // LS_PUTAWAY, + { "Ready", BOTH_STAND2, Q_R, Q_R, AFLAG_IDLE, 350, BLK_WIDE, LS_READY, LS_S_R2L, 0 }, // LS_READY, + { "Draw", BOTH_STAND1TO2, Q_R, Q_R, AFLAG_FINISH, 350, BLK_NO, LS_READY, LS_S_R2L, 0 }, // LS_DRAW, + { "Putaway", BOTH_STAND2TO1, Q_R, Q_R, AFLAG_FINISH, 350, BLK_NO, LS_READY, LS_S_R2L, 0 }, // LS_PUTAWAY, // Attacks //UL2LR - {"TL2BR Att", BOTH_A1_TL_BR, Q_TL, Q_BR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_TL2BR, LS_R_TL2BR, 200 }, // LS_A_TL2BR + { "TL2BR Att", BOTH_A1_TL_BR, Q_TL, Q_BR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_TL2BR, LS_R_TL2BR, 200 }, // LS_A_TL2BR //SLASH LEFT - {"L2R Att", BOTH_A1__L__R, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_L2R, LS_R_L2R, 200 }, // LS_A_L2R + { "L2R Att", BOTH_A1__L__R, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_L2R, LS_R_L2R, 200 }, // LS_A_L2R //LL2UR - {"BL2TR Att", BOTH_A1_BL_TR, Q_BL, Q_TR, AFLAG_ACTIVE, 50, BLK_TIGHT, LS_R_BL2TR, LS_R_BL2TR, 200 }, // LS_A_BL2TR + { "BL2TR Att", BOTH_A1_BL_TR, Q_BL, Q_TR, AFLAG_ACTIVE, 50, BLK_TIGHT, LS_R_BL2TR, LS_R_BL2TR, 200 }, // LS_A_BL2TR //LR2UL - {"BR2TL Att", BOTH_A1_BR_TL, Q_BR, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_BR2TL, LS_R_BR2TL, 200 }, // LS_A_BR2TL + { "BR2TL Att", BOTH_A1_BR_TL, Q_BR, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_BR2TL, LS_R_BR2TL, 200 }, // LS_A_BR2TL //SLASH RIGHT - {"R2L Att", BOTH_A1__R__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_R2L, LS_R_R2L, 200 },// LS_A_R2L + { "R2L Att", BOTH_A1__R__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_R2L, LS_R_R2L, 200 },// LS_A_R2L //UR2LL - {"TR2BL Att", BOTH_A1_TR_BL, Q_TR, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_TR2BL, LS_R_TR2BL, 200 }, // LS_A_TR2BL + { "TR2BL Att", BOTH_A1_TR_BL, Q_TR, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_TR2BL, LS_R_TR2BL, 200 }, // LS_A_TR2BL //SLASH DOWN - {"T2B Att", BOTH_A1_T__B_, Q_T, Q_B, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_T2B, LS_R_T2B, 200 }, // LS_A_T2B + { "T2B Att", BOTH_A1_T__B_, Q_T, Q_B, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_T2B, LS_R_T2B, 200 }, // LS_A_T2B //special attacks - {"Back Stab", BOTH_A2_STABBACK1, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACKSTAB - {"Back Att", BOTH_ATTACK_BACK, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACK - {"CR Back Att", BOTH_CROUCHATTACKBACK1,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACK_CR - {"RollStab", BOTH_ROLL_STAB, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_ROLL_STAB - {"Lunge Att", BOTH_LUNGE2_B__T_, Q_B, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_LUNGE - {"Jump Att", BOTH_FORCELEAP2_T__B_,Q_T, Q_B, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_JUMP_T__B_ - {"Flip Stab", BOTH_JUMPFLIPSTABDOWN,Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_T___R, 200 }, // LS_A_FLIP_STAB - {"Flip Slash", BOTH_JUMPFLIPSLASHDOWN1,Q_L,Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R_T_, 200 }, // LS_A_FLIP_SLASH - {"DualJump Atk",BOTH_JUMPATTACK6, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_BL_TR, 200 }, // LS_JUMPATTACK_DUAL - - {"DualJumpAtkL_A",BOTH_ARIAL_LEFT, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_A_TL2BR, 200 }, // LS_JUMPATTACK_ARIAL_LEFT - {"DualJumpAtkR_A",BOTH_ARIAL_RIGHT, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_A_TR2BL, 200 }, // LS_JUMPATTACK_ARIAL_RIGHT - - {"DualJumpAtkL_A",BOTH_CARTWHEEL_LEFT, Q_R,Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_TL_BR, 200 }, // LS_JUMPATTACK_CART_LEFT - {"DualJumpAtkR_A",BOTH_CARTWHEEL_RIGHT, Q_R,Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_TR_BL, 200 }, // LS_JUMPATTACK_CART_RIGHT - - {"DualJumpAtkLStaff", BOTH_BUTTERFLY_FL1,Q_R,Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__L__R, 200 }, // LS_JUMPATTACK_STAFF_LEFT - {"DualJumpAtkRStaff", BOTH_BUTTERFLY_FR1,Q_R,Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R__L, 200 }, // LS_JUMPATTACK_STAFF_RIGHT - - {"ButterflyLeft", BOTH_BUTTERFLY_LEFT,Q_R,Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__L__R, 200 }, // LS_BUTTERFLY_LEFT - {"ButterflyRight", BOTH_BUTTERFLY_RIGHT,Q_R,Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R__L, 200 }, // LS_BUTTERFLY_RIGHT - - {"BkFlip Atk", BOTH_JUMPATTACK7, Q_B, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_T___R, 200 }, // LS_A_BACKFLIP_ATK - {"DualSpinAtk", BOTH_SPINATTACK6, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK_DUAL - {"StfSpinAtk", BOTH_SPINATTACK7, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK - {"LngLeapAtk", BOTH_FORCELONGLEAP_ATTACK,Q_R,Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_LEAP_ATTACK - {"SwoopAtkR", BOTH_VS_ATR_S, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 200 }, // LS_SWOOP_ATTACK_RIGHT - {"SwoopAtkL", BOTH_VS_ATL_S, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 200 }, // LS_SWOOP_ATTACK_LEFT - {"TauntaunAtkR",BOTH_VT_ATR_S, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_TAUNTAUN_ATTACK_RIGHT - {"TauntaunAtkL",BOTH_VT_ATL_S, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_TAUNTAUN_ATTACK_LEFT - {"StfKickFwd", BOTH_A7_KICK_F, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_F - {"StfKickBack", BOTH_A7_KICK_B, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_B - {"StfKickRight",BOTH_A7_KICK_R, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_R - {"StfKickLeft", BOTH_A7_KICK_L, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_L - {"StfKickSpin", BOTH_A7_KICK_S, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_S - {"StfKickBkFwd",BOTH_A7_KICK_BF, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_BF - {"StfKickSplit",BOTH_A7_KICK_RL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_RL - {"StfKickFwdAir",BOTH_A7_KICK_F_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_F_AIR - {"StfKickBackAir",BOTH_A7_KICK_B_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_B_AIR - {"StfKickRightAir",BOTH_A7_KICK_R_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_R_AIR - {"StfKickLeftAir",BOTH_A7_KICK_L_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_L_AIR - {"StabDown", BOTH_STABDOWN, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN - {"StabDownStf", BOTH_STABDOWN_STAFF,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN_STAFF - {"StabDownDual",BOTH_STABDOWN_DUAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN_DUAL - {"dualspinprot",BOTH_A6_SABERPROTECT,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 500 }, // LS_DUAL_SPIN_PROTECT - {"StfSoulCal", BOTH_A7_SOULCAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 500 }, // LS_STAFF_SOULCAL - {"specialfast", BOTH_A1_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000}, // LS_A1_SPECIAL - {"specialmed", BOTH_A2_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000}, // LS_A2_SPECIAL - {"specialstr", BOTH_A3_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000}, // LS_A3_SPECIAL - {"upsidedwnatk",BOTH_FLIP_ATTACK7, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200}, // LS_UPSIDE_DOWN_ATTACK - {"pullatkstab", BOTH_PULL_IMPALE_STAB,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200}, // LS_PULL_ATTACK_STAB - {"pullatkswing",BOTH_PULL_IMPALE_SWING,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200}, // LS_PULL_ATTACK_SWING - {"AloraSpinAtk",BOTH_ALORA_SPIN_SLASH,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK_ALORA - {"Dual FB Atk", BOTH_A6_FB, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_DUAL_FB - {"Dual LR Atk", BOTH_A6_LR, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_DUAL_LR - {"StfHiltBash", BOTH_A7_HILT, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_HILT_BASH + { "Back Stab", BOTH_A2_STABBACK1, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACKSTAB + { "Back Att", BOTH_ATTACK_BACK, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACK + { "CR Back Att", BOTH_CROUCHATTACKBACK1, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACK_CR + { "RollStab", BOTH_ROLL_STAB, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_ROLL_STAB + { "Lunge Att", BOTH_LUNGE2_B__T_, Q_B, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_LUNGE + { "Jump Att", BOTH_FORCELEAP2_T__B_, Q_T, Q_B, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_JUMP_T__B_ + { "Flip Stab", BOTH_JUMPFLIPSTABDOWN, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_T___R, 200 }, // LS_A_FLIP_STAB + { "Flip Slash", BOTH_JUMPFLIPSLASHDOWN1, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R_T_, 200 }, // LS_A_FLIP_SLASH + { "DualJump Atk", BOTH_JUMPATTACK6, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_BL_TR, 200 }, // LS_JUMPATTACK_DUAL + + { "DualJumpAtkL_A", BOTH_ARIAL_LEFT, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_A_TL2BR, 200 }, // LS_JUMPATTACK_ARIAL_LEFT + { "DualJumpAtkR_A", BOTH_ARIAL_RIGHT, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_A_TR2BL, 200 }, // LS_JUMPATTACK_ARIAL_RIGHT + + { "DualJumpAtkL_A", BOTH_CARTWHEEL_LEFT, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_TL_BR, 200 }, // LS_JUMPATTACK_CART_LEFT + { "DualJumpAtkR_A", BOTH_CARTWHEEL_RIGHT, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_TR_BL, 200 }, // LS_JUMPATTACK_CART_RIGHT + + { "DualJumpAtkLStaff", BOTH_BUTTERFLY_FL1, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__L__R, 200 }, // LS_JUMPATTACK_STAFF_LEFT + { "DualJumpAtkRStaff", BOTH_BUTTERFLY_FR1, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R__L, 200 }, // LS_JUMPATTACK_STAFF_RIGHT + + { "ButterflyLeft", BOTH_BUTTERFLY_LEFT, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__L__R, 200 }, // LS_BUTTERFLY_LEFT + { "ButterflyRight", BOTH_BUTTERFLY_RIGHT, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R__L, 200 }, // LS_BUTTERFLY_RIGHT + + { "BkFlip Atk", BOTH_JUMPATTACK7, Q_B, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_T___R, 200 }, // LS_A_BACKFLIP_ATK + { "DualSpinAtk", BOTH_SPINATTACK6, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK_DUAL + { "StfSpinAtk", BOTH_SPINATTACK7, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK + { "LngLeapAtk", BOTH_FORCELONGLEAP_ATTACK, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_LEAP_ATTACK + { "SwoopAtkR", BOTH_VS_ATR_S, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 200 }, // LS_SWOOP_ATTACK_RIGHT + { "SwoopAtkL", BOTH_VS_ATL_S, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 200 }, // LS_SWOOP_ATTACK_LEFT + { "TauntaunAtkR", BOTH_VT_ATR_S, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_TAUNTAUN_ATTACK_RIGHT + { "TauntaunAtkL", BOTH_VT_ATL_S, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_TAUNTAUN_ATTACK_LEFT + { "StfKickFwd", BOTH_A7_KICK_F, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_F + { "StfKickBack", BOTH_A7_KICK_B, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_B + { "StfKickRight", BOTH_A7_KICK_R, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_R + { "StfKickLeft", BOTH_A7_KICK_L, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_L + { "StfKickSpin", BOTH_A7_KICK_S, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_S + { "StfKickBkFwd", BOTH_A7_KICK_BF, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_BF + { "StfKickSplit", BOTH_A7_KICK_RL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_RL + { "StfKickFwdAir", BOTH_A7_KICK_F_AIR, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_F_AIR + { "StfKickBackAir", BOTH_A7_KICK_B_AIR, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_B_AIR + { "StfKickRightAir", BOTH_A7_KICK_R_AIR, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_R_AIR + { "StfKickLeftAir", BOTH_A7_KICK_L_AIR, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_L_AIR + { "StabDown", BOTH_STABDOWN, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN + { "StabDownStf", BOTH_STABDOWN_STAFF, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN_STAFF + { "StabDownDual", BOTH_STABDOWN_DUAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN_DUAL + { "dualspinprot", BOTH_A6_SABERPROTECT, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 500 }, // LS_DUAL_SPIN_PROTECT + { "StfSoulCal", BOTH_A7_SOULCAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 500 }, // LS_STAFF_SOULCAL + { "specialfast", BOTH_A1_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000 }, // LS_A1_SPECIAL + { "specialmed", BOTH_A2_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000 }, // LS_A2_SPECIAL + { "specialstr", BOTH_A3_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000 }, // LS_A3_SPECIAL + { "upsidedwnatk", BOTH_FLIP_ATTACK7, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_UPSIDE_DOWN_ATTACK + { "pullatkstab", BOTH_PULL_IMPALE_STAB, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_PULL_ATTACK_STAB + { "pullatkswing", BOTH_PULL_IMPALE_SWING, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_PULL_ATTACK_SWING + { "AloraSpinAtk", BOTH_ALORA_SPIN_SLASH, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK_ALORA + { "Dual FB Atk", BOTH_A6_FB, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_DUAL_FB + { "Dual LR Atk", BOTH_A6_LR, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_DUAL_LR + { "StfHiltBash", BOTH_A7_HILT, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_HILT_BASH //starts - {"TL2BR St", BOTH_S1_S1_TL, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_TL2BR, LS_A_TL2BR, 200 }, // LS_S_TL2BR - {"L2R St", BOTH_S1_S1__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_L2R, LS_A_L2R, 200 }, // LS_S_L2R - {"BL2TR St", BOTH_S1_S1_BL, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_BL2TR, LS_A_BL2TR, 200 }, // LS_S_BL2TR - {"BR2TL St", BOTH_S1_S1_BR, Q_R, Q_BR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_BR2TL, LS_A_BR2TL, 200 }, // LS_S_BR2TL - {"R2L St", BOTH_S1_S1__R, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_R2L, LS_A_R2L, 200 }, // LS_S_R2L - {"TR2BL St", BOTH_S1_S1_TR, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_TR2BL, LS_A_TR2BL, 200 }, // LS_S_TR2BL - {"T2B St", BOTH_S1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_T2B, LS_A_T2B, 200 }, // LS_S_T2B - + { "TL2BR St", BOTH_S1_S1_TL, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_TL2BR, LS_A_TL2BR, 200 }, // LS_S_TL2BR + { "L2R St", BOTH_S1_S1__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_L2R, LS_A_L2R, 200 }, // LS_S_L2R + { "BL2TR St", BOTH_S1_S1_BL, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_BL2TR, LS_A_BL2TR, 200 }, // LS_S_BL2TR + { "BR2TL St", BOTH_S1_S1_BR, Q_R, Q_BR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_BR2TL, LS_A_BR2TL, 200 }, // LS_S_BR2TL + { "R2L St", BOTH_S1_S1__R, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_R2L, LS_A_R2L, 200 }, // LS_S_R2L + { "TR2BL St", BOTH_S1_S1_TR, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_TR2BL, LS_A_TR2BL, 200 }, // LS_S_TR2BL + { "T2B St", BOTH_S1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_T2B, LS_A_T2B, 200 }, // LS_S_T2B + //returns - {"TL2BR Ret", BOTH_R1_BR_S1, Q_BR, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_TL2BR - {"L2R Ret", BOTH_R1__R_S1, Q_R, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_L2R - {"BL2TR Ret", BOTH_R1_TR_S1, Q_TR, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_BL2TR - {"BR2TL Ret", BOTH_R1_TL_S1, Q_TL, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_BR2TL - {"R2L Ret", BOTH_R1__L_S1, Q_L, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_R2L - {"TR2BL Ret", BOTH_R1_BL_S1, Q_BL, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_TR2BL - {"T2B Ret", BOTH_R1_B__S1, Q_B, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_T2B + { "TL2BR Ret", BOTH_R1_BR_S1, Q_BR, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_TL2BR + { "L2R Ret", BOTH_R1__R_S1, Q_R, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_L2R + { "BL2TR Ret", BOTH_R1_TR_S1, Q_TR, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_BL2TR + { "BR2TL Ret", BOTH_R1_TL_S1, Q_TL, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_BR2TL + { "R2L Ret", BOTH_R1__L_S1, Q_L, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_R2L + { "TR2BL Ret", BOTH_R1_BL_S1, Q_BL, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_TR2BL + { "T2B Ret", BOTH_R1_B__S1, Q_B, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_T2B //Transitions - {"BR2R Trans", BOTH_T1_BR__R, Q_BR, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc bottom right to right - {"BR2TR Trans", BOTH_T1_BR_TR, Q_BR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc bottom right to top right (use: BOTH_T1_TR_BR) - {"BR2T Trans", BOTH_T1_BR_T_, Q_BR, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc bottom right to top (use: BOTH_T1_T__BR) - {"BR2TL Trans", BOTH_T1_BR_TL, Q_BR, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast weak spin bottom right to top left - {"BR2L Trans", BOTH_T1_BR__L, Q_BR, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast weak spin bottom right to left - {"BR2BL Trans", BOTH_T1_BR_BL, Q_BR, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin bottom right to bottom left - {"R2BR Trans", BOTH_T1__R_BR, Q_R, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc right to bottom right (use: BOTH_T1_BR__R) - {"R2TR Trans", BOTH_T1__R_TR, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc right to top right - {"R2T Trans", BOTH_T1__R_T_, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast ar right to top (use: BOTH_T1_T___R) - {"R2TL Trans", BOTH_T1__R_TL, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc right to top left - {"R2L Trans", BOTH_T1__R__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast weak spin right to left - {"R2BL Trans", BOTH_T1__R_BL, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin right to bottom left - {"TR2BR Trans", BOTH_T1_TR_BR, Q_TR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc top right to bottom right - {"TR2R Trans", BOTH_T1_TR__R, Q_TR, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top right to right (use: BOTH_T1__R_TR) - {"TR2T Trans", BOTH_T1_TR_T_, Q_TR, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc top right to top (use: BOTH_T1_T__TR) - {"TR2TL Trans", BOTH_T1_TR_TL, Q_TR, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc top right to top left - {"TR2L Trans", BOTH_T1_TR__L, Q_TR, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top right to left - {"TR2BL Trans", BOTH_T1_TR_BL, Q_TR, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin top right to bottom left - {"T2BR Trans", BOTH_T1_T__BR, Q_T, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc top to bottom right - {"T2R Trans", BOTH_T1_T___R, Q_T, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top to right - {"T2TR Trans", BOTH_T1_T__TR, Q_T, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc top to top right - {"T2TL Trans", BOTH_T1_T__TL, Q_T, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc top to top left - {"T2L Trans", BOTH_T1_T___L, Q_T, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top to left - {"T2BL Trans", BOTH_T1_T__BL, Q_T, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc top to bottom left - {"TL2BR Trans", BOTH_T1_TL_BR, Q_TL, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin top left to bottom right - {"TL2R Trans", BOTH_T1_TL__R, Q_TL, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top left to right (use: BOTH_T1__R_TL) - {"TL2TR Trans", BOTH_T1_TL_TR, Q_TL, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc top left to top right (use: BOTH_T1_TR_TL) - {"TL2T Trans", BOTH_T1_TL_T_, Q_TL, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc top left to top (use: BOTH_T1_T__TL) - {"TL2L Trans", BOTH_T1_TL__L, Q_TL, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top left to left (use: BOTH_T1__L_TL) - {"TL2BL Trans", BOTH_T1_TL_BL, Q_TL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc top left to bottom left - {"L2BR Trans", BOTH_T1__L_BR, Q_L, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin left to bottom right - {"L2R Trans", BOTH_T1__L__R, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast weak spin left to right - {"L2TR Trans", BOTH_T1__L_TR, Q_L, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc left to top right (use: BOTH_T1_TR__L) - {"L2T Trans", BOTH_T1__L_T_, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc left to top (use: BOTH_T1_T___L) - {"L2TL Trans", BOTH_T1__L_TL, Q_L, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc left to top left - {"L2BL Trans", BOTH_T1__L_BL, Q_L, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc left to bottom left (use: BOTH_T1_BL__L) - {"BL2BR Trans", BOTH_T1_BL_BR, Q_BL, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin bottom left to bottom right - {"BL2R Trans", BOTH_T1_BL__R, Q_BL, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast weak spin bottom left to right - {"BL2TR Trans", BOTH_T1_BL_TR, Q_BL, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast weak spin bottom left to top right - {"BL2T Trans", BOTH_T1_BL_T_, Q_BL, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc bottom left to top (use: BOTH_T1_T__BL) - {"BL2TL Trans", BOTH_T1_BL_TL, Q_BL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc bottom left to top left (use: BOTH_T1_TL_BL) - {"BL2L Trans", BOTH_T1_BL__L, Q_BL, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc bottom left to left + { "BR2R Trans", BOTH_T1_BR__R, Q_BR, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc bottom right to right + { "BR2TR Trans", BOTH_T1_BR_TR, Q_BR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc bottom right to top right (use: BOTH_T1_TR_BR) + { "BR2T Trans", BOTH_T1_BR_T_, Q_BR, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc bottom right to top (use: BOTH_T1_T__BR) + { "BR2TL Trans", BOTH_T1_BR_TL, Q_BR, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast weak spin bottom right to top left + { "BR2L Trans", BOTH_T1_BR__L, Q_BR, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast weak spin bottom right to left + { "BR2BL Trans", BOTH_T1_BR_BL, Q_BR, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin bottom right to bottom left + { "R2BR Trans", BOTH_T1__R_BR, Q_R, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc right to bottom right (use: BOTH_T1_BR__R) + { "R2TR Trans", BOTH_T1__R_TR, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc right to top right + { "R2T Trans", BOTH_T1__R_T_, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast ar right to top (use: BOTH_T1_T___R) + { "R2TL Trans", BOTH_T1__R_TL, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc right to top left + { "R2L Trans", BOTH_T1__R__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast weak spin right to left + { "R2BL Trans", BOTH_T1__R_BL, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin right to bottom left + { "TR2BR Trans", BOTH_T1_TR_BR, Q_TR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc top right to bottom right + { "TR2R Trans", BOTH_T1_TR__R, Q_TR, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top right to right (use: BOTH_T1__R_TR) + { "TR2T Trans", BOTH_T1_TR_T_, Q_TR, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc top right to top (use: BOTH_T1_T__TR) + { "TR2TL Trans", BOTH_T1_TR_TL, Q_TR, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc top right to top left + { "TR2L Trans", BOTH_T1_TR__L, Q_TR, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top right to left + { "TR2BL Trans", BOTH_T1_TR_BL, Q_TR, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin top right to bottom left + { "T2BR Trans", BOTH_T1_T__BR, Q_T, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc top to bottom right + { "T2R Trans", BOTH_T1_T___R, Q_T, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top to right + { "T2TR Trans", BOTH_T1_T__TR, Q_T, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc top to top right + { "T2TL Trans", BOTH_T1_T__TL, Q_T, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc top to top left + { "T2L Trans", BOTH_T1_T___L, Q_T, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top to left + { "T2BL Trans", BOTH_T1_T__BL, Q_T, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc top to bottom left + { "TL2BR Trans", BOTH_T1_TL_BR, Q_TL, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin top left to bottom right + { "TL2R Trans", BOTH_T1_TL__R, Q_TL, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top left to right (use: BOTH_T1__R_TL) + { "TL2TR Trans", BOTH_T1_TL_TR, Q_TL, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc top left to top right (use: BOTH_T1_TR_TL) + { "TL2T Trans", BOTH_T1_TL_T_, Q_TL, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc top left to top (use: BOTH_T1_T__TL) + { "TL2L Trans", BOTH_T1_TL__L, Q_TL, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top left to left (use: BOTH_T1__L_TL) + { "TL2BL Trans", BOTH_T1_TL_BL, Q_TL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc top left to bottom left + { "L2BR Trans", BOTH_T1__L_BR, Q_L, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin left to bottom right + { "L2R Trans", BOTH_T1__L__R, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast weak spin left to right + { "L2TR Trans", BOTH_T1__L_TR, Q_L, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc left to top right (use: BOTH_T1_TR__L) + { "L2T Trans", BOTH_T1__L_T_, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc left to top (use: BOTH_T1_T___L) + { "L2TL Trans", BOTH_T1__L_TL, Q_L, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc left to top left + { "L2BL Trans", BOTH_T1__L_BL, Q_L, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc left to bottom left (use: BOTH_T1_BL__L) + { "BL2BR Trans", BOTH_T1_BL_BR, Q_BL, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin bottom left to bottom right + { "BL2R Trans", BOTH_T1_BL__R, Q_BL, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast weak spin bottom left to right + { "BL2TR Trans", BOTH_T1_BL_TR, Q_BL, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast weak spin bottom left to top right + { "BL2T Trans", BOTH_T1_BL_T_, Q_BL, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc bottom left to top (use: BOTH_T1_T__BL) + { "BL2TL Trans", BOTH_T1_BL_TL, Q_BL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc bottom left to top left (use: BOTH_T1_TL_BL) + { "BL2L Trans", BOTH_T1_BL__L, Q_BL, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc bottom left to left //Bounces - {"Bounce BR", BOTH_B1_BR___, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_T1_BR_TR, 150 }, - {"Bounce R", BOTH_B1__R___, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_T1__R__L, 150 }, - {"Bounce TR", BOTH_B1_TR___, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_TR_TL, 150 }, - {"Bounce T", BOTH_B1_T____, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, - {"Bounce TL", BOTH_B1_TL___, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_T1_TL_TR, 150 }, - {"Bounce L", BOTH_B1__L___, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_T1__L__R, 150 }, - {"Bounce BL", BOTH_B1_BL___, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_T1_BL_TR, 150 }, + { "Bounce BR", BOTH_B1_BR___, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_T1_BR_TR, 150 }, + { "Bounce R", BOTH_B1__R___, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_T1__R__L, 150 }, + { "Bounce TR", BOTH_B1_TR___, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_TR_TL, 150 }, + { "Bounce T", BOTH_B1_T____, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + { "Bounce TL", BOTH_B1_TL___, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_T1_TL_TR, 150 }, + { "Bounce L", BOTH_B1__L___, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_T1__L__R, 150 }, + { "Bounce BL", BOTH_B1_BL___, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_T1_BL_TR, 150 }, //Deflected attacks (like bounces, but slide off enemy saber, not straight back) - {"Deflect BR", BOTH_D1_BR___, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_T1_BR_TR, 150 }, - {"Deflect R", BOTH_D1__R___, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_T1__R__L, 150 }, - {"Deflect TR", BOTH_D1_TR___, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_TR_TL, 150 }, - {"Deflect T", BOTH_B1_T____, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, - {"Deflect TL", BOTH_D1_TL___, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_T1_TL_TR, 150 }, - {"Deflect L", BOTH_D1__L___, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_T1__L__R, 150 }, - {"Deflect BL", BOTH_D1_BL___, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_T1_BL_TR, 150 }, - {"Deflect B", BOTH_D1_B____, Q_B, Q_B, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + { "Deflect BR", BOTH_D1_BR___, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_T1_BR_TR, 150 }, + { "Deflect R", BOTH_D1__R___, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_T1__R__L, 150 }, + { "Deflect TR", BOTH_D1_TR___, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_TR_TL, 150 }, + { "Deflect T", BOTH_B1_T____, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + { "Deflect TL", BOTH_D1_TL___, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_T1_TL_TR, 150 }, + { "Deflect L", BOTH_D1__L___, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_T1__L__R, 150 }, + { "Deflect BL", BOTH_D1_BL___, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_T1_BL_TR, 150 }, + { "Deflect B", BOTH_D1_B____, Q_B, Q_B, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, //Reflected attacks - {"Reflected BR",BOTH_V1_BR_S1, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_BR - {"Reflected R", BOTH_V1__R_S1, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1__R - {"Reflected TR",BOTH_V1_TR_S1, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_TR - {"Reflected T", BOTH_V1_T__S1, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_T_ - {"Reflected TL",BOTH_V1_TL_S1, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_TL - {"Reflected L", BOTH_V1__L_S1, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1__L - {"Reflected BL",BOTH_V1_BL_S1, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_BL - {"Reflected B", BOTH_V1_B__S1, Q_B, Q_B, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_B_ + { "Reflected BR", BOTH_V1_BR_S1, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_BR + { "Reflected R", BOTH_V1__R_S1, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1__R + { "Reflected TR", BOTH_V1_TR_S1, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_TR + { "Reflected T", BOTH_V1_T__S1, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_T_ + { "Reflected TL", BOTH_V1_TL_S1, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_TL + { "Reflected L", BOTH_V1__L_S1, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1__L + { "Reflected BL", BOTH_V1_BL_S1, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_BL + { "Reflected B", BOTH_V1_B__S1, Q_B, Q_B, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_B_ // Broken parries - {"BParry Top", BOTH_H1_S1_T_, Q_T, Q_B, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UP, - {"BParry UR", BOTH_H1_S1_TR, Q_TR, Q_BL, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UR, - {"BParry UL", BOTH_H1_S1_TL, Q_TL, Q_BR, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UL, - {"BParry LR", BOTH_H1_S1_BL, Q_BL, Q_TR, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LR, - {"BParry Bot", BOTH_H1_S1_B_, Q_B, Q_T, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LL - {"BParry LL", BOTH_H1_S1_BR, Q_BR, Q_TL, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LL + { "BParry Top", BOTH_H1_S1_T_, Q_T, Q_B, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UP, + { "BParry UR", BOTH_H1_S1_TR, Q_TR, Q_BL, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UR, + { "BParry UL", BOTH_H1_S1_TL, Q_TL, Q_BR, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UL, + { "BParry LR", BOTH_H1_S1_BL, Q_BL, Q_TR, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LR, + { "BParry Bot", BOTH_H1_S1_B_, Q_B, Q_T, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LL + { "BParry LL", BOTH_H1_S1_BR, Q_BR, Q_TL, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LL // Knockaways - {"Knock Top", BOTH_K1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_T1_T__BR, 150 }, // LS_PARRY_UP, - {"Knock UR", BOTH_K1_S1_TR, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_T1_TR__R, 150 }, // LS_PARRY_UR, - {"Knock UL", BOTH_K1_S1_TL, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_T1_TL__L, 150 }, // LS_PARRY_UL, - {"Knock LR", BOTH_K1_S1_BL, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_T1_BL_TL, 150 }, // LS_PARRY_LR, - {"Knock LL", BOTH_K1_S1_BR, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_T1_BR_TR, 150 }, // LS_PARRY_LL + { "Knock Top", BOTH_K1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_T1_T__BR, 150 }, // LS_PARRY_UP, + { "Knock UR", BOTH_K1_S1_TR, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_T1_TR__R, 150 }, // LS_PARRY_UR, + { "Knock UL", BOTH_K1_S1_TL, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_T1_TL__L, 150 }, // LS_PARRY_UL, + { "Knock LR", BOTH_K1_S1_BL, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_T1_BL_TL, 150 }, // LS_PARRY_LR, + { "Knock LL", BOTH_K1_S1_BR, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_T1_BR_TR, 150 }, // LS_PARRY_LL // Parry - {"Parry Top", BOTH_P1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_T2B, 150 }, // LS_PARRY_UP, - {"Parry UR", BOTH_P1_S1_TR, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_TR2BL, 150 }, // LS_PARRY_UR, - {"Parry UL", BOTH_P1_S1_TL, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_A_TL2BR, 150 }, // LS_PARRY_UL, - {"Parry LR", BOTH_P1_S1_BL, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_A_BR2TL, 150 }, // LS_PARRY_LR, - {"Parry LL", BOTH_P1_S1_BR, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_A_BL2TR, 150 }, // LS_PARRY_LL + { "Parry Top", BOTH_P1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_T2B, 150 }, // LS_PARRY_UP, + { "Parry UR", BOTH_P1_S1_TR, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_TR2BL, 150 }, // LS_PARRY_UR, + { "Parry UL", BOTH_P1_S1_TL, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_A_TL2BR, 150 }, // LS_PARRY_UL, + { "Parry LR", BOTH_P1_S1_BL, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_A_BR2TL, 150 }, // LS_PARRY_LR, + { "Parry LL", BOTH_P1_S1_BR, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_A_BL2TR, 150 }, // LS_PARRY_LL // Reflecting a missile - {"Reflect Top", BOTH_P1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_T2B, 300 }, // LS_PARRY_UP, - {"Reflect UR", BOTH_P1_S1_TL, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_A_TL2BR, 300 }, // LS_PARRY_UR, - {"Reflect UL", BOTH_P1_S1_TR, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_TR2BL, 300 }, // LS_PARRY_UL, - {"Reflect LR", BOTH_P1_S1_BR, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_A_BL2TR, 300 }, // LS_PARRY_LR - {"Reflect LL", BOTH_P1_S1_BL, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_A_BR2TL, 300 }, // LS_PARRY_LL, + { "Reflect Top", BOTH_P1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_T2B, 300 }, // LS_PARRY_UP, + { "Reflect UR", BOTH_P1_S1_TL, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_A_TL2BR, 300 }, // LS_PARRY_UR, + { "Reflect UL", BOTH_P1_S1_TR, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_TR2BL, 300 }, // LS_PARRY_UL, + { "Reflect LR", BOTH_P1_S1_BR, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_A_BL2TR, 300 }, // LS_PARRY_LR + { "Reflect LL", BOTH_P1_S1_BL, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_A_BR2TL, 300 }, // LS_PARRY_LL, }; -saberMoveName_t transitionMove[Q_NUM_QUADS][Q_NUM_QUADS] = +saberMoveName_t transitionMove[Q_NUM_QUADS][Q_NUM_QUADS] = { { LS_NONE, //Can't transition to same pos! @@ -405,140 +405,140 @@ saberMoveName_t transitionMove[Q_NUM_QUADS][Q_NUM_QUADS] = } }; -void PM_VelocityForSaberMove( playerState_t *ps, vec3_t throwDir ) +void PM_VelocityForSaberMove(playerState_t *ps, vec3_t throwDir) { - vec3_t vForward, vRight, vUp, startQ, endQ; + vec3_t vForward = { 0.0f }, vRight = { 0.0f }, vUp = { 0.0f }, startQ = { 0.0f }, endQ = { 0.0f }; - AngleVectors( ps->viewangles, vForward, vRight, vUp ); + AngleVectors(ps->viewangles, vForward, vRight, vUp); - switch ( saberMoveData[ps->saberMove].startQuad ) + switch (saberMoveData[ps->saberMove].startQuad) { case Q_BR: - VectorScale( vRight, 1, startQ ); - VectorMA( startQ, -1, vUp, startQ ); + VectorScale(vRight, 1, startQ); + VectorMA(startQ, -1, vUp, startQ); break; case Q_R: - VectorScale( vRight, 2, startQ ); + VectorScale(vRight, 2, startQ); break; case Q_TR: - VectorScale( vRight, 1, startQ ); - VectorMA( startQ, 1, vUp, startQ ); + VectorScale(vRight, 1, startQ); + VectorMA(startQ, 1, vUp, startQ); break; case Q_T: - VectorScale( vUp, 2, startQ ); + VectorScale(vUp, 2, startQ); break; case Q_TL: - VectorScale( vRight, -1, startQ ); - VectorMA( startQ, 1, vUp, startQ ); + VectorScale(vRight, -1, startQ); + VectorMA(startQ, 1, vUp, startQ); break; case Q_L: - VectorScale( vRight, -2, startQ ); + VectorScale(vRight, -2, startQ); break; case Q_BL: - VectorScale( vRight, -1, startQ ); - VectorMA( startQ, -1, vUp, startQ ); + VectorScale(vRight, -1, startQ); + VectorMA(startQ, -1, vUp, startQ); break; case Q_B: - VectorScale( vUp, -2, startQ ); + VectorScale(vUp, -2, startQ); break; } - switch ( saberMoveData[ps->saberMove].endQuad ) + switch (saberMoveData[ps->saberMove].endQuad) { case Q_BR: - VectorScale( vRight, 1, endQ ); - VectorMA( endQ, -1, vUp, endQ ); + VectorScale(vRight, 1, endQ); + VectorMA(endQ, -1, vUp, endQ); break; case Q_R: - VectorScale( vRight, 2, endQ ); + VectorScale(vRight, 2, endQ); break; case Q_TR: - VectorScale( vRight, 1, endQ ); - VectorMA( endQ, 1, vUp, endQ ); + VectorScale(vRight, 1, endQ); + VectorMA(endQ, 1, vUp, endQ); break; case Q_T: - VectorScale( vUp, 2, endQ ); + VectorScale(vUp, 2, endQ); break; case Q_TL: - VectorScale( vRight, -1, endQ ); - VectorMA( endQ, 1, vUp, endQ ); + VectorScale(vRight, -1, endQ); + VectorMA(endQ, 1, vUp, endQ); break; case Q_L: - VectorScale( vRight, -2, endQ ); + VectorScale(vRight, -2, endQ); break; case Q_BL: - VectorScale( vRight, -1, endQ ); - VectorMA( endQ, -1, vUp, endQ ); + VectorScale(vRight, -1, endQ); + VectorMA(endQ, -1, vUp, endQ); break; case Q_B: - VectorScale( vUp, -2, endQ ); + VectorScale(vUp, -2, endQ); break; } - VectorMA( endQ, 2, vForward, endQ ); - VectorScale( throwDir, 125, throwDir );//FIXME: pass in the throw strength? - VectorSubtract( endQ, startQ, throwDir ); + VectorMA(endQ, 2, vForward, endQ); + VectorScale(throwDir, 125, throwDir);//FIXME: pass in the throw strength? + VectorSubtract(endQ, startQ, throwDir); } -qboolean PM_VelocityForBlockedMove( playerState_t *ps, vec3_t throwDir ) +qboolean PM_VelocityForBlockedMove(playerState_t *ps, vec3_t throwDir) { vec3_t vForward, vRight, vUp; - AngleVectors( ps->viewangles, vForward, vRight, vUp ); - switch ( ps->saberBlocked ) + AngleVectors(ps->viewangles, vForward, vRight, vUp); + switch (ps->saberBlocked) { case BLOCKED_UPPER_RIGHT: - VectorScale( vRight, 1, throwDir ); - VectorMA( throwDir, 1, vUp, throwDir ); + VectorScale(vRight, 1, throwDir); + VectorMA(throwDir, 1, vUp, throwDir); break; case BLOCKED_UPPER_LEFT: - VectorScale( vRight, -1, throwDir ); - VectorMA( throwDir, 1, vUp, throwDir ); + VectorScale(vRight, -1, throwDir); + VectorMA(throwDir, 1, vUp, throwDir); break; case BLOCKED_LOWER_RIGHT: - VectorScale( vRight, 1, throwDir ); - VectorMA( throwDir, -1, vUp, throwDir ); + VectorScale(vRight, 1, throwDir); + VectorMA(throwDir, -1, vUp, throwDir); break; case BLOCKED_LOWER_LEFT: - VectorScale( vRight, -1, throwDir ); - VectorMA( throwDir, -1, vUp, throwDir ); + VectorScale(vRight, -1, throwDir); + VectorMA(throwDir, -1, vUp, throwDir); break; case BLOCKED_TOP: - VectorScale( vUp, 2, throwDir ); + VectorScale(vUp, 2, throwDir); break; default: return qfalse; break; } - VectorMA( throwDir, 2, vForward, throwDir ); - VectorScale( throwDir, 250, throwDir );//FIXME: pass in the throw strength? + VectorMA(throwDir, 2, vForward, throwDir); + VectorScale(throwDir, 250, throwDir);//FIXME: pass in the throw strength? return qtrue; } -int PM_AnimLevelForSaberAnim( int anim ) +int PM_AnimLevelForSaberAnim(int anim) { - if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_D1_B____ ) + if (anim >= BOTH_A1_T__B_ && anim <= BOTH_D1_B____) { return FORCE_LEVEL_1; } - if ( anim >= BOTH_A2_T__B_ && anim <= BOTH_D2_B____ ) + if (anim >= BOTH_A2_T__B_ && anim <= BOTH_D2_B____) { return FORCE_LEVEL_2; } - if ( anim >= BOTH_A3_T__B_ && anim <= BOTH_D3_B____ ) + if (anim >= BOTH_A3_T__B_ && anim <= BOTH_D3_B____) { return FORCE_LEVEL_3; } - if ( anim >= BOTH_A4_T__B_ && anim <= BOTH_D4_B____ ) + if (anim >= BOTH_A4_T__B_ && anim <= BOTH_D4_B____) {//desann return FORCE_LEVEL_4; } - if ( anim >= BOTH_A5_T__B_ && anim <= BOTH_D5_B____ ) + if (anim >= BOTH_A5_T__B_ && anim <= BOTH_D5_B____) {//tavion return FORCE_LEVEL_5; } - if ( anim >= BOTH_A6_T__B_ && anim <= BOTH_D6_B____ ) + if (anim >= BOTH_A6_T__B_ && anim <= BOTH_D6_B____) {//dual return SS_DUAL; } - if ( anim >= BOTH_A7_T__B_ && anim <= BOTH_D7_B____ ) + if (anim >= BOTH_A7_T__B_ && anim <= BOTH_D7_B____) {//staff return SS_STAFF; } @@ -1585,9 +1585,9 @@ int PM_PowerLevelForSaberAnim(playerState_t *ps, int saberNum) } } -qboolean PM_InAnimForSaberMove( int anim, int saberMove ) +qboolean PM_InAnimForSaberMove(int anim, int saberMove) { - switch ( anim ) + switch (anim) {//special case anims case BOTH_A2_STABBACK1: case BOTH_ATTACK_BACK: @@ -1636,7 +1636,7 @@ qboolean PM_InAnimForSaberMove( int anim, int saberMove ) case BOTH_PULL_IMPALE_SWING: case BOTH_ALORA_SPIN_SLASH: case BOTH_A6_FB: - case BOTH_A6_LR: + case BOTH_A6_LR: case BOTH_A7_HILT: case BOTH_LK_S_DL_S_SB_1_W: case BOTH_LK_S_DL_T_SB_1_W: @@ -1659,68 +1659,68 @@ qboolean PM_InAnimForSaberMove( int anim, int saberMove ) case BOTH_HANG_ATTACK: return qtrue; } - if ( PM_SaberDrawPutawayAnim( anim ) ) + if (PM_SaberDrawPutawayAnim(anim)) { - if ( saberMove == LS_DRAW || saberMove == LS_PUTAWAY ) + if (saberMove == LS_DRAW || saberMove == LS_PUTAWAY) { return qtrue; } return qfalse; } - else if ( PM_SaberStanceAnim( anim ) ) + else if (PM_SaberStanceAnim(anim)) { - if ( saberMove == LS_READY ) + if (saberMove == LS_READY) { return qtrue; } return qfalse; } - int animLevel = PM_AnimLevelForSaberAnim( anim ); - if ( animLevel <= 0 ) + int animLevel = PM_AnimLevelForSaberAnim(anim); + if (animLevel <= 0) {//NOTE: this will always return false for the ready poses and putaway/draw... return qfalse; } //drop the anim to the first level and start the checks there - anim -= (animLevel-FORCE_LEVEL_1)*SABER_ANIM_GROUP_SIZE; + anim -= (animLevel - FORCE_LEVEL_1)*SABER_ANIM_GROUP_SIZE; //check level 1 - if ( anim == saberMoveData[saberMove].animToUse ) + if (anim == saberMoveData[saberMove].animToUse) { return qtrue; } //check level 2 anim += SABER_ANIM_GROUP_SIZE; - if ( anim == saberMoveData[saberMove].animToUse ) + if (anim == saberMoveData[saberMove].animToUse) { return qtrue; } //check level 3 anim += SABER_ANIM_GROUP_SIZE; - if ( anim == saberMoveData[saberMove].animToUse ) + if (anim == saberMoveData[saberMove].animToUse) { return qtrue; } //check level 4 anim += SABER_ANIM_GROUP_SIZE; - if ( anim == saberMoveData[saberMove].animToUse ) + if (anim == saberMoveData[saberMove].animToUse) { return qtrue; } //check level 5 anim += SABER_ANIM_GROUP_SIZE; - if ( anim == saberMoveData[saberMove].animToUse ) + if (anim == saberMoveData[saberMove].animToUse) { return qtrue; } - if ( anim >= BOTH_P1_S1_T_ && anim <= BOTH_H1_S1_BR ) + if (anim >= BOTH_P1_S1_T_ && anim <= BOTH_H1_S1_BR) {//parries, knockaways and broken parries - return (anim==saberMoveData[saberMove].animToUse); + return (anim == saberMoveData[saberMove].animToUse); } return qfalse; } -qboolean PM_SaberInIdle( int move ) +qboolean PM_SaberInIdle(int move) { - switch ( move ) + switch (move) { case LS_NONE: case LS_READY: @@ -1731,9 +1731,9 @@ qboolean PM_SaberInIdle( int move ) } return qfalse; } -qboolean PM_SaberInSpecialAttack( int anim ) +qboolean PM_SaberInSpecialAttack(int anim) { - switch ( anim ) + switch (anim) { case BOTH_A2_STABBACK1: case BOTH_ATTACK_BACK: @@ -1782,7 +1782,7 @@ qboolean PM_SaberInSpecialAttack( int anim ) case BOTH_PULL_IMPALE_SWING: case BOTH_ALORA_SPIN_SLASH: case BOTH_A6_FB: - case BOTH_A6_LR: + case BOTH_A6_LR: case BOTH_A7_HILT: case BOTH_LK_S_DL_S_SB_1_W: case BOTH_LK_S_DL_T_SB_1_W: @@ -1808,21 +1808,21 @@ qboolean PM_SaberInSpecialAttack( int anim ) return qfalse; } -qboolean PM_SaberInAttackPure( int move ) +qboolean PM_SaberInAttackPure(int move) { - if ( move >= LS_A_TL2BR && move <= LS_A_T2B ) + if (move >= LS_A_TL2BR && move <= LS_A_T2B) { return qtrue; } return qfalse; } -qboolean PM_SaberInAttack( int move ) +qboolean PM_SaberInAttack(int move) { - if ( move >= LS_A_TL2BR && move <= LS_A_T2B ) + if (move >= LS_A_TL2BR && move <= LS_A_T2B) { return qtrue; } - switch ( move ) + switch (move) { case LS_A_BACK: case LS_A_BACK_CR: @@ -1880,106 +1880,106 @@ qboolean PM_SaberInAttack( int move ) } return qfalse; } -qboolean PM_SaberInTransition( int move ) +qboolean PM_SaberInTransition(int move) { - if ( move >= LS_T1_BR__R && move <= LS_T1_BL__L ) + if (move >= LS_T1_BR__R && move <= LS_T1_BL__L) { return qtrue; } return qfalse; } -qboolean PM_SaberInStart( int move ) +qboolean PM_SaberInStart(int move) { - if ( move >= LS_S_TL2BR && move <= LS_S_T2B ) + if (move >= LS_S_TL2BR && move <= LS_S_T2B) { return qtrue; } return qfalse; } -qboolean PM_SaberInReturn( int move ) +qboolean PM_SaberInReturn(int move) { - if ( move >= LS_R_TL2BR && move <= LS_R_T2B ) + if (move >= LS_R_TL2BR && move <= LS_R_T2B) { return qtrue; } return qfalse; } -qboolean PM_SaberInTransitionAny( int move ) +qboolean PM_SaberInTransitionAny(int move) { - if ( PM_SaberInStart( move ) ) + if (PM_SaberInStart(move)) { return qtrue; } - else if ( PM_SaberInTransition( move ) ) + else if (PM_SaberInTransition(move)) { return qtrue; } - else if ( PM_SaberInReturn( move ) ) + else if (PM_SaberInReturn(move)) { return qtrue; } return qfalse; } -qboolean PM_SaberInBounce( int move ) +qboolean PM_SaberInBounce(int move) { - if ( move >= LS_B1_BR && move <= LS_B1_BL ) + if (move >= LS_B1_BR && move <= LS_B1_BL) { return qtrue; } - if ( move >= LS_D1_BR && move <= LS_D1_BL ) + if (move >= LS_D1_BR && move <= LS_D1_BL) { return qtrue; } return qfalse; } -qboolean PM_SaberInBrokenParry( int move ) +qboolean PM_SaberInBrokenParry(int move) { - if ( move >= LS_V1_BR && move <= LS_V1_B_ ) + if (move >= LS_V1_BR && move <= LS_V1_B_) { return qtrue; } - if ( move >= LS_H1_T_ && move <= LS_H1_BL ) + if (move >= LS_H1_T_ && move <= LS_H1_BL) { return qtrue; } return qfalse; } -qboolean PM_SaberInDeflect( int move ) +qboolean PM_SaberInDeflect(int move) { - if ( move >= LS_D1_BR && move <= LS_D1_B_ ) + if (move >= LS_D1_BR && move <= LS_D1_B_) { return qtrue; } return qfalse; } -qboolean PM_SaberInParry( int move ) +qboolean PM_SaberInParry(int move) { - if ( move >= LS_PARRY_UP && move <= LS_PARRY_LL ) + if (move >= LS_PARRY_UP && move <= LS_PARRY_LL) { return qtrue; } return qfalse; } -qboolean PM_SaberInKnockaway( int move ) +qboolean PM_SaberInKnockaway(int move) { - if ( move >= LS_K1_T_ && move <= LS_K1_BL ) + if (move >= LS_K1_T_ && move <= LS_K1_BL) { return qtrue; } return qfalse; } -qboolean PM_SaberInReflect( int move ) +qboolean PM_SaberInReflect(int move) { - if ( move >= LS_REFLECT_UP && move <= LS_REFLECT_LL ) + if (move >= LS_REFLECT_UP && move <= LS_REFLECT_LL) { return qtrue; } return qfalse; } -qboolean PM_SaberInSpecial( int move ) +qboolean PM_SaberInSpecial(int move) { - switch( move ) + switch (move) { case LS_A_BACK: case LS_A_BACK_CR: @@ -2037,9 +2037,9 @@ qboolean PM_SaberInSpecial( int move ) return qfalse; } -qboolean PM_KickMove( int move ) +qboolean PM_KickMove(int move) { - switch( move ) + switch (move) { case LS_KICK_F: case LS_KICK_B: @@ -2058,11 +2058,11 @@ qboolean PM_KickMove( int move ) return qfalse; } -qboolean PM_SaberCanInterruptMove( int move, int anim ) +qboolean PM_SaberCanInterruptMove(int move, int anim) { - if ( PM_InAnimForSaberMove( anim, move ) ) + if (PM_InAnimForSaberMove(anim, move)) { - switch( move ) + switch (move) { case LS_A_BACK: case LS_A_BACK_CR: @@ -2108,44 +2108,44 @@ qboolean PM_SaberCanInterruptMove( int move, int anim ) return qfalse; } - if ( PM_SaberInAttackPure( move ) ) + if (PM_SaberInAttackPure(move)) { return qfalse; } - if ( PM_SaberInStart( move ) ) + if (PM_SaberInStart(move)) { return qfalse; } - if ( PM_SaberInTransition( move ) ) + if (PM_SaberInTransition(move)) { return qfalse; } - if ( PM_SaberInBounce( move ) ) + if (PM_SaberInBounce(move)) { return qfalse; } - if ( PM_SaberInBrokenParry( move ) ) + if (PM_SaberInBrokenParry(move)) { return qfalse; } - if ( PM_SaberInDeflect( move ) ) + if (PM_SaberInDeflect(move)) { return qfalse; } - if ( PM_SaberInParry( move ) ) + if (PM_SaberInParry(move)) { return qfalse; } - if ( PM_SaberInKnockaway( move ) ) + if (PM_SaberInKnockaway(move)) { return qfalse; } - if ( PM_SaberInReflect( move ) ) + if (PM_SaberInReflect(move)) { return qfalse; } } - switch ( anim ) + switch (anim) { case BOTH_A2_STABBACK1: case BOTH_ATTACK_BACK: @@ -2186,7 +2186,7 @@ qboolean PM_SaberCanInterruptMove( int move, int anim ) case BOTH_PULL_IMPALE_SWING: case BOTH_ALORA_SPIN_SLASH: case BOTH_A6_FB: - case BOTH_A6_LR: + case BOTH_A6_LR: case BOTH_A7_HILT: case BOTH_LK_S_DL_S_SB_1_W: case BOTH_LK_S_DL_T_SB_1_W: @@ -2212,12 +2212,12 @@ qboolean PM_SaberCanInterruptMove( int move, int anim ) return qtrue; } -saberMoveName_t PM_BrokenParryForAttack( int move ) +saberMoveName_t PM_BrokenParryForAttack(int move) { //Our attack was knocked away by a knockaway parry //FIXME: need actual anims for this //FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center - switch ( saberMoveData[move].startQuad ) + switch (saberMoveData[move].startQuad) { case Q_B: return LS_V1_B_; @@ -2247,15 +2247,15 @@ saberMoveName_t PM_BrokenParryForAttack( int move ) return LS_NONE; } -saberMoveName_t PM_BrokenParryForParry( int move ) +saberMoveName_t PM_BrokenParryForParry(int move) { //FIXME: need actual anims for this //FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center - switch ( move ) + switch (move) { case LS_PARRY_UP: //Hmm... since we don't know what dir the hit came from, randomly pick knock down or knock back - if ( Q_irand( 0, 1 ) ) + if (Q_irand(0, 1)) { return LS_H1_B_; } @@ -2283,11 +2283,11 @@ saberMoveName_t PM_BrokenParryForParry( int move ) return LS_NONE; } -saberMoveName_t PM_KnockawayForParry( int move ) +saberMoveName_t PM_KnockawayForParry(int move) { //FIXME: need actual anims for this //FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center - switch ( move ) + switch (move) { case BLOCKED_TOP://LS_PARRY_UP: return LS_K1_T_;//push up @@ -2309,9 +2309,9 @@ saberMoveName_t PM_KnockawayForParry( int move ) //return LS_NONE; } -saberMoveName_t PM_SaberBounceForAttack( int move ) +saberMoveName_t PM_SaberBounceForAttack(int move) { - switch ( saberMoveData[move].startQuad ) + switch (saberMoveData[move].startQuad) { case Q_B: case Q_BR: @@ -2339,9 +2339,9 @@ saberMoveName_t PM_SaberBounceForAttack( int move ) return LS_NONE; } -saberMoveName_t PM_AttackMoveForQuad( int quad ) +saberMoveName_t PM_AttackMoveForQuad(int quad) { - switch ( quad ) + switch (quad) { case Q_B: case Q_BR: @@ -2369,7 +2369,7 @@ saberMoveName_t PM_AttackMoveForQuad( int quad ) return LS_NONE; } -int saberMoveTransitionAngle[Q_NUM_QUADS][Q_NUM_QUADS] = +int saberMoveTransitionAngle[Q_NUM_QUADS][Q_NUM_QUADS] = { { 0,//Q_BR,Q_BR, @@ -2453,20 +2453,20 @@ int saberMoveTransitionAngle[Q_NUM_QUADS][Q_NUM_QUADS] = } }; -int PM_SaberAttackChainAngle( int move1, int move2 ) +int PM_SaberAttackChainAngle(int move1, int move2) { - if ( move1 == -1 || move2 == -1 ) + if (move1 == -1 || move2 == -1) { return -1; } return saberMoveTransitionAngle[saberMoveData[move1].endQuad][saberMoveData[move2].startQuad]; } -qboolean PM_SaberKataDone( int curmove = LS_NONE, int newmove = LS_NONE ) +qboolean PM_SaberKataDone(int curmove = LS_NONE, int newmove = LS_NONE) { - if ( pm->ps->forceRageRecoveryTime > level.time ) + if (pm->ps->forceRageRecoveryTime > level.time) {//rage recovery, only 1 swing at a time (tired) - if ( pm->ps->saberAttackChainCount > 0 ) + if (pm->ps->saberAttackChainCount > 0) {//swung once return qtrue; } @@ -2475,17 +2475,17 @@ qboolean PM_SaberKataDone( int curmove = LS_NONE, int newmove = LS_NONE ) return qfalse; } } - else if ( (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1 << FP_RAGE))) {//infinite chaining when raged return qfalse; } - else if ( pm->ps->saber[0].maxChain == -1 ) + else if (pm->ps->saber[0].maxChain == -1) { return qfalse; } - else if ( pm->ps->saber[0].maxChain != 0 ) + else if (pm->ps->saber[0].maxChain != 0) { - if ( pm->ps->saberAttackChainCount >= pm->ps->saber[0].maxChain ) + if (pm->ps->saberAttackChainCount >= pm->ps->saber[0].maxChain) { return qtrue; } @@ -2495,7 +2495,7 @@ qboolean PM_SaberKataDone( int curmove = LS_NONE, int newmove = LS_NONE ) } } - if ( pm->ps->saberAnimLevel == SS_DESANN || pm->ps->saberAnimLevel == SS_TAVION ) + if (pm->ps->saberAnimLevel == SS_DESANN || pm->ps->saberAnimLevel == SS_TAVION) {//desann and tavion can link up as many attacks as they want return qfalse; } @@ -2503,87 +2503,87 @@ qboolean PM_SaberKataDone( int curmove = LS_NONE, int newmove = LS_NONE ) // not you can chain? Like if you were completely missed, you can't chain as much, or...? // And/Or based on FP_SABER_OFFENSE level? So number of attacks you can chain // increases with your FP_SABER_OFFENSE skill? - if ( pm->ps->saberAnimLevel == SS_STAFF ) + if (pm->ps->saberAnimLevel == SS_STAFF) { //TEMP: for now, let staff attacks infinitely chain return qfalse; /* if ( pm->ps->saberAttackChainCount > Q_irand( 3, 4 ) ) { - return qtrue; + return qtrue; } else if ( pm->ps->saberAttackChainCount > 0 ) { - int chainAngle = PM_SaberAttackChainAngle( curmove, newmove ); - if ( chainAngle < 135 || chainAngle > 215 ) - {//if trying to chain to a move that doesn't continue the momentum - if ( pm->ps->saberAttackChainCount > 1 ) - { - return qtrue; - } - } - else if ( chainAngle == 180 ) - {//continues the momentum perfectly, allow it to chain 66% of the time - if ( pm->ps->saberAttackChainCount > 2 ) - { - return qtrue; - } - } - else - {//would continue the movement somewhat, 50% chance of continuing - if ( pm->ps->saberAttackChainCount > 3 ) - { - return qtrue; - } - } + int chainAngle = PM_SaberAttackChainAngle( curmove, newmove ); + if ( chainAngle < 135 || chainAngle > 215 ) + {//if trying to chain to a move that doesn't continue the momentum + if ( pm->ps->saberAttackChainCount > 1 ) + { + return qtrue; + } + } + else if ( chainAngle == 180 ) + {//continues the momentum perfectly, allow it to chain 66% of the time + if ( pm->ps->saberAttackChainCount > 2 ) + { + return qtrue; + } + } + else + {//would continue the movement somewhat, 50% chance of continuing + if ( pm->ps->saberAttackChainCount > 3 ) + { + return qtrue; + } + } } */ } - else if ( pm->ps->saberAnimLevel == SS_DUAL ) + else if (pm->ps->saberAnimLevel == SS_DUAL) { //TEMP: for now, let staff attacks infinitely chain return qfalse; } - else if ( pm->ps->saberAnimLevel == FORCE_LEVEL_3 ) + else if (pm->ps->saberAnimLevel == FORCE_LEVEL_3) { - if ( curmove == LS_NONE || newmove == LS_NONE ) + if (curmove == LS_NONE || newmove == LS_NONE) { - if ( pm->ps->saberAnimLevel >= FORCE_LEVEL_3 && pm->ps->saberAttackChainCount > Q_irand( 0, 1 ) ) + if (pm->ps->saberAnimLevel >= FORCE_LEVEL_3 && pm->ps->saberAttackChainCount > Q_irand(0, 1)) { return qtrue; } } - else if ( pm->ps->saberAttackChainCount > Q_irand( 2, 3 ) ) + else if (pm->ps->saberAttackChainCount > Q_irand(2, 3)) { return qtrue; } - else if ( pm->ps->saberAttackChainCount > 0 ) + else if (pm->ps->saberAttackChainCount > 0) { - int chainAngle = PM_SaberAttackChainAngle( curmove, newmove ); - if ( chainAngle < 135 || chainAngle > 215 ) + int chainAngle = PM_SaberAttackChainAngle(curmove, newmove); + if (chainAngle < 135 || chainAngle > 215) {//if trying to chain to a move that doesn't continue the momentum return qtrue; } - else if ( chainAngle == 180 ) + else if (chainAngle == 180) {//continues the momentum perfectly, allow it to chain 66% of the time - if ( pm->ps->saberAttackChainCount > 1 ) + if (pm->ps->saberAttackChainCount > 1) { return qtrue; } } else {//would continue the movement somewhat, 50% chance of continuing - if ( pm->ps->saberAttackChainCount > 2 ) + if (pm->ps->saberAttackChainCount > 2) { return qtrue; } } } } - else if ( g_saberNewCombat->integer ) //new code + else if (g_saberNewCombat->integer) //new code {//FIXME: have chainAngle influence fast and medium chains as well? - if ( (pm->ps->saberAnimLevel == FORCE_LEVEL_3 || pm->ps->saberAnimLevel == SS_DUAL) - && pm->ps->saberAttackChainCount > Q_irand( 2, 5 ) ) + if ((pm->ps->saberAnimLevel == FORCE_LEVEL_3 || pm->ps->saberAnimLevel == SS_DUAL) + && pm->ps->saberAttackChainCount > Q_irand(2, 5)) { return qtrue; } @@ -2599,40 +2599,40 @@ qboolean PM_SaberKataDone( int curmove = LS_NONE, int newmove = LS_NONE ) return qfalse; } -qboolean PM_CheckEnemyInBack( float backCheckDist ) +qboolean PM_CheckEnemyInBack(float backCheckDist) { - if ( !pm->gent || !pm->gent->client ) + if (!pm->gent || !pm->gent->client) { return qfalse; } - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) - && !g_saberAutoAim->integer && pm->cmd.forwardmove >= 0 ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + && !g_saberAutoAim->integer && pm->cmd.forwardmove >= 0) {//don't auto-backstab return qfalse; } - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) + if (pm->ps->groundEntityNum == ENTITYNUM_NONE) {//only when on ground return qfalse; } trace_t trace; - vec3_t end, fwd, fwdAngles = {0,pm->ps->viewangles[YAW],0}; + vec3_t end, fwd, fwdAngles = { 0, pm->ps->viewangles[YAW], 0 }; - AngleVectors( fwdAngles, fwd, NULL, NULL ); - VectorMA( pm->ps->origin, -backCheckDist, fwd, end ); + AngleVectors(fwdAngles, fwd, NULL, NULL); + VectorMA(pm->ps->origin, -backCheckDist, fwd, end); - pm->trace( &trace, pm->ps->origin, vec3_origin, vec3_origin, end, pm->ps->clientNum, CONTENTS_SOLID|CONTENTS_BODY, (EG2_Collision)0, 0 ); - if ( trace.fraction < 1.0f && trace.entityNum < ENTITYNUM_WORLD ) + pm->trace(&trace, pm->ps->origin, vec3_origin, vec3_origin, end, pm->ps->clientNum, CONTENTS_SOLID | CONTENTS_BODY, (EG2_Collision)0, 0); + if (trace.fraction < 1.0f && trace.entityNum < ENTITYNUM_WORLD) { gentity_t *traceEnt = &g_entities[trace.entityNum]; - if ( traceEnt - && traceEnt->health > 0 - && traceEnt->client - && traceEnt->client->playerTeam == pm->gent->client->enemyTeam - && traceEnt->client->ps.groundEntityNum != ENTITYNUM_NONE ) + if (traceEnt + && traceEnt->health > 0 + && traceEnt->client + && traceEnt->client->playerTeam == pm->gent->client->enemyTeam + && traceEnt->client->ps.groundEntityNum != ENTITYNUM_NONE) { - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer())) {//player - if ( pm->gent ) + if (pm->gent) {//set player enemy to traceEnt so he auto-aims at him pm->gent->enemy = traceEnt; } @@ -2643,16 +2643,16 @@ qboolean PM_CheckEnemyInBack( float backCheckDist ) return qfalse; } -saberMoveName_t PM_PickBackStab( void ) +saberMoveName_t PM_PickBackStab(void) { - if ( !pm->gent || !pm->gent->client ) + if (!pm->gent || !pm->gent->client) { return LS_READY; } - if ( pm->ps->dualSabers - && pm->ps->saber[1].Active() ) + if (pm->ps->dualSabers + && pm->ps->saber[1].Active()) { - if ( pm->ps->pm_flags & PMF_DUCKED ) + if (pm->ps->pm_flags & PMF_DUCKED) { return LS_A_BACK_CR; } @@ -2661,17 +2661,17 @@ saberMoveName_t PM_PickBackStab( void ) return LS_A_BACK; } } - if ( pm->gent->client->ps.saberAnimLevel == SS_TAVION ) + if (pm->gent->client->ps.saberAnimLevel == SS_TAVION) { return LS_A_BACKSTAB; } - else if ( pm->gent->client->ps.saberAnimLevel == SS_DESANN ) + else if (pm->gent->client->ps.saberAnimLevel == SS_DESANN) { - if ( pm->ps->saberMove == LS_READY || !Q_irand( 0, 3 ) ) + if (pm->ps->saberMove == LS_READY || !Q_irand(0, 3)) { return LS_A_BACKSTAB; } - else if ( pm->ps->pm_flags & PMF_DUCKED ) + else if (pm->ps->pm_flags & PMF_DUCKED) { return LS_A_BACK_CR; } @@ -2680,10 +2680,10 @@ saberMoveName_t PM_PickBackStab( void ) return LS_A_BACK; } } - else if ( (pm->ps->saberAnimLevel == FORCE_LEVEL_3 - || pm->ps->saberAnimLevel == SS_DUAL) && g_saberNewCombat->integer ) //new code + else if ((pm->ps->saberAnimLevel == FORCE_LEVEL_3 + || pm->ps->saberAnimLevel == SS_DUAL) && g_saberNewCombat->integer) //new code {//using medium attacks or dual sabers - if ( pm->ps->pm_flags & PMF_DUCKED ) + if (pm->ps->pm_flags & PMF_DUCKED) { return LS_A_BACK_CR; } @@ -2710,33 +2710,33 @@ saberMoveName_t PM_PickBackStab( void ) } } -saberMoveName_t PM_CheckStabDown( void ) +saberMoveName_t PM_CheckStabDown(void) { - if ( !pm->gent || !pm->gent->enemy || !pm->gent->enemy->client ) + if (!pm->gent || !pm->gent->enemy || !pm->gent->enemy->client) { return LS_NONE; } - if ( (pm->ps->saber[0].saberFlags&SFL_NO_STABDOWN) ) + if ((pm->ps->saber[0].saberFlags&SFL_NO_STABDOWN)) { return LS_NONE; } - if ( pm->ps->dualSabers - && (pm->ps->saber[1].saberFlags&SFL_NO_STABDOWN) ) + if (pm->ps->dualSabers + && (pm->ps->saber[1].saberFlags&SFL_NO_STABDOWN)) { return LS_NONE; } - if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + if (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) //PLAYER ONLY {//player - if ( G_TryingKataAttack( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + if (G_TryingKataAttack(pm->gent, &pm->cmd))//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus {//want to try a special return LS_NONE; } } - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer())) {//player - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE )//in air + if (pm->ps->groundEntityNum == ENTITYNUM_NONE)//in air {//sorry must be on ground (or have just jumped) - if ( level.time-pm->ps->lastOnGround <= 50 && (pm->ps->pm_flags&PMF_JUMPING) ) + if (level.time - pm->ps->lastOnGround <= 50 && (pm->ps->pm_flags&PMF_JUMPING)) {//just jumped, it's okay } else @@ -2748,24 +2748,24 @@ saberMoveName_t PM_CheckStabDown( void ) if ( pm->cmd.upmove > 0 ) {//trying to jump } - else if ( pm->ps->groundEntityNum == ENTITYNUM_NONE //in air - && level.time-pm->ps->lastOnGround <= 250 //just left ground - && (pm->ps->pm_flags&PMF_JUMPING) )//jumped + else if ( pm->ps->groundEntityNum == ENTITYNUM_NONE //in air + && level.time-pm->ps->lastOnGround <= 250 //just left ground + && (pm->ps->pm_flags&PMF_JUMPING) )//jumped {//just jumped } else { - return LS_NONE; + return LS_NONE; } */ pm->ps->velocity[2] = 0; pm->cmd.upmove = 0; } - else if ( (pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) ) + else if ((pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer())) {//NPC - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE )//in air + if (pm->ps->groundEntityNum == ENTITYNUM_NONE)//in air {//sorry must be on ground (or have just jumped) - if ( level.time-pm->ps->lastOnGround <= 250 && (pm->ps->pm_flags&PMF_JUMPING) ) + if (level.time - pm->ps->lastOnGround <= 250 && (pm->ps->pm_flags&PMF_JUMPING)) {//just jumped, it's okay } else @@ -2773,44 +2773,44 @@ saberMoveName_t PM_CheckStabDown( void ) return LS_NONE; } } - if ( !pm->gent->NPC ) + if (!pm->gent->NPC) {//wtf??? return LS_NONE; } - if ( Q_irand( 0, RANK_CAPTAIN ) > pm->gent->NPC->rank ) + if (Q_irand(0, RANK_CAPTAIN) > pm->gent->NPC->rank) {//lower ranks do this less often return LS_NONE; } } - vec3_t enemyDir, faceFwd, facingAngles = {0, pm->ps->viewangles[YAW], 0}; - AngleVectors( facingAngles, faceFwd, NULL, NULL ); - VectorSubtract( pm->gent->enemy->currentOrigin, pm->ps->origin, enemyDir ); + vec3_t enemyDir, faceFwd, facingAngles = { 0, pm->ps->viewangles[YAW], 0 }; + AngleVectors(facingAngles, faceFwd, NULL, NULL); + VectorSubtract(pm->gent->enemy->currentOrigin, pm->ps->origin, enemyDir); float enemyZDiff = enemyDir[2]; enemyDir[2] = 0; - float enemyHDist = VectorNormalize( enemyDir )-(pm->gent->maxs[0]+pm->gent->enemy->maxs[0]); - float dot = DotProduct( enemyDir, faceFwd ); + float enemyHDist = VectorNormalize(enemyDir) - (pm->gent->maxs[0] + pm->gent->enemy->maxs[0]); + float dot = DotProduct(enemyDir, faceFwd); if ( //(pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) - dot > 0.65f + dot > 0.65f //&& enemyHDist >= 32 //was 48 && enemyHDist <= 164//was 112 - && PM_InKnockDownOnGround( &pm->gent->enemy->client->ps )//still on ground - && !PM_InGetUpNoRoll( &pm->gent->enemy->client->ps )//not getting up yet - && enemyZDiff <= 20 ) + && PM_InKnockDownOnGround(&pm->gent->enemy->client->ps)//still on ground + && !PM_InGetUpNoRoll(&pm->gent->enemy->client->ps)//not getting up yet + && enemyZDiff <= 20) {//guy is on the ground below me, do a top-down attack - if ( pm->gent->enemy->s.number >= MAX_CLIENTS - || !G_ControlledByPlayer( pm->gent->enemy ) ) + if (pm->gent->enemy->s.number >= MAX_CLIENTS + || !G_ControlledByPlayer(pm->gent->enemy)) {//don't get up while I'm doing this //stop them from trying to get up for at least another 3 seconds - TIMER_Set( pm->gent->enemy, "noGetUpStraight", 3000 ); + TIMER_Set(pm->gent->enemy, "noGetUpStraight", 3000); } //pick the right anim - if ( pm->ps->saberAnimLevel == SS_DUAL - || (pm->ps->dualSabers&&pm->ps->saber[1].Active()) ) + if (pm->ps->saberAnimLevel == SS_DUAL + || (pm->ps->dualSabers&&pm->ps->saber[1].Active())) { return LS_STABDOWN_DUAL; } - else if ( pm->ps->saberAnimLevel == SS_STAFF ) + else if (pm->ps->saberAnimLevel == SS_STAFF) { return LS_STABDOWN_STAFF; } @@ -2822,78 +2822,78 @@ saberMoveName_t PM_CheckStabDown( void ) return LS_NONE; } -extern saberMoveName_t PM_NPCSaberAttackFromQuad( int quad ); -saberMoveName_t PM_SaberFlipOverAttackMove( void ); -saberMoveName_t PM_AttackForEnemyPos( qboolean allowFB, qboolean allowStabDown ) +extern saberMoveName_t PM_NPCSaberAttackFromQuad(int quad); +saberMoveName_t PM_SaberFlipOverAttackMove(void); +saberMoveName_t PM_AttackForEnemyPos(qboolean allowFB, qboolean allowStabDown) { saberMoveName_t autoMove = LS_INVALID; - if( !pm->gent->enemy ) + if (!pm->gent->enemy) { return LS_NONE; } - vec3_t enemy_org, enemyDir, faceFwd, faceRight, faceUp, facingAngles = {0, pm->ps->viewangles[YAW], 0}; - AngleVectors( facingAngles, faceFwd, faceRight, faceUp ); + vec3_t enemy_org, enemyDir, faceFwd, faceRight, faceUp, facingAngles = { 0, pm->ps->viewangles[YAW], 0 }; + AngleVectors(facingAngles, faceFwd, faceRight, faceUp); //FIXME: predict enemy position? - if ( pm->gent->enemy->client ) + if (pm->gent->enemy->client) { //VectorCopy( pm->gent->enemy->currentOrigin, enemy_org ); //HMM... using this will adjust for bbox size, so let's do that... vec3_t size; - VectorSubtract( pm->gent->enemy->absmax, pm->gent->enemy->absmin, size ); - VectorMA( pm->gent->enemy->absmin, 0.5, size, enemy_org ); + VectorSubtract(pm->gent->enemy->absmax, pm->gent->enemy->absmin, size); + VectorMA(pm->gent->enemy->absmin, 0.5, size, enemy_org); - VectorSubtract( pm->gent->enemy->client->renderInfo.eyePoint, pm->ps->origin, enemyDir ); + VectorSubtract(pm->gent->enemy->client->renderInfo.eyePoint, pm->ps->origin, enemyDir); } else { - if ( pm->gent->enemy->bmodel && VectorCompare( vec3_origin, pm->gent->enemy->currentOrigin ) ) + if (pm->gent->enemy->bmodel && VectorCompare(vec3_origin, pm->gent->enemy->currentOrigin)) {//a brush model without an origin brush vec3_t size; - VectorSubtract( pm->gent->enemy->absmax, pm->gent->enemy->absmin, size ); - VectorMA( pm->gent->enemy->absmin, 0.5, size, enemy_org ); + VectorSubtract(pm->gent->enemy->absmax, pm->gent->enemy->absmin, size); + VectorMA(pm->gent->enemy->absmin, 0.5, size, enemy_org); } else { - VectorCopy( pm->gent->enemy->currentOrigin, enemy_org ); + VectorCopy(pm->gent->enemy->currentOrigin, enemy_org); } - VectorSubtract( enemy_org, pm->ps->origin, enemyDir ); + VectorSubtract(enemy_org, pm->ps->origin, enemyDir); } float enemyZDiff = enemyDir[2]; - float enemyDist = VectorNormalize( enemyDir ); - float dot = DotProduct( enemyDir, faceFwd ); - if ( dot > 0 ) + float enemyDist = VectorNormalize(enemyDir); + float dot = DotProduct(enemyDir, faceFwd); + if (dot > 0) {//enemy is in front - if ( allowStabDown ) + if (allowStabDown) {//okay to try this saberMoveName_t stabDownMove = PM_CheckStabDown(); - if ( stabDownMove != LS_NONE ) + if (stabDownMove != LS_NONE) { return stabDownMove; } } - if ( (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) - && dot > 0.65f + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + && dot > 0.65f && enemyDist <= 64 && pm->gent->enemy->client - && (enemyZDiff <= 20 || PM_InKnockDownOnGround( &pm->gent->enemy->client->ps ) || PM_CrouchAnim( pm->gent->enemy->client->ps.legsAnim ) ) ) + && (enemyZDiff <= 20 || PM_InKnockDownOnGround(&pm->gent->enemy->client->ps) || PM_CrouchAnim(pm->gent->enemy->client->ps.legsAnim))) {//swing down at them return LS_A_T2B; } - if ( allowFB ) + if (allowFB) {//directly in front anim allowed - if ( !(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK)) ) + if (!(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK))) {//okay to do backstabs with this saber - if ( enemyDist > 200 || pm->gent->enemy->health <= 0 ) + if (enemyDist > 200 || pm->gent->enemy->health <= 0) {//hmm, look in back for an enemy - if ( pm->ps->clientNum && !PM_ControlledByPlayer() ) + if (pm->ps->clientNum && !PM_ControlledByPlayer()) {//player should never do this automatically - if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + if (pm->ps->groundEntityNum != ENTITYNUM_NONE) {//only when on ground - if ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) + if (pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand(0, pm->gent->NPC->rank) > RANK_ENSIGN) {//only fencers and higher can do this, higher rank does it more - if ( PM_CheckEnemyInBack( 100 ) ) + if (PM_CheckEnemyInBack(100)) { return PM_PickBackStab(); } @@ -2903,17 +2903,17 @@ saberMoveName_t PM_AttackForEnemyPos( qboolean allowFB, qboolean allowStabDown ) } } //this is the default only if they're *right* in front... - if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) - || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) ) + if ((pm->ps->clientNum&&!PM_ControlledByPlayer()) + || ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode)) {//NPC or player not in 1st person - if ( PM_CheckFlipOverAttackMove( qtrue ) ) + if (PM_CheckFlipOverAttackMove(qtrue)) {//enemy must be close and in front return PM_SaberFlipOverAttackMove(); } } - if ( PM_CheckLungeAttackMove() ) + if (PM_CheckLungeAttackMove()) {//NPC - autoMove = PM_SaberLungeAttackMove( qtrue ); + autoMove = PM_SaberLungeAttackMove(qtrue); } else { @@ -2922,7 +2922,7 @@ saberMoveName_t PM_AttackForEnemyPos( qboolean allowFB, qboolean allowStabDown ) } else {//pick a random one - if ( Q_irand( 0, 1 ) ) + if (Q_irand(0, 1)) { autoMove = LS_A_TR2BL; } @@ -2931,63 +2931,63 @@ saberMoveName_t PM_AttackForEnemyPos( qboolean allowFB, qboolean allowStabDown ) autoMove = LS_A_TL2BR; } } - float dotR = DotProduct( enemyDir, faceRight ); - if ( dotR > 0.35 ) + float dotR = DotProduct(enemyDir, faceRight); + if (dotR > 0.35) {//enemy is to far right autoMove = LS_A_L2R; } - else if ( dotR < -0.35 ) + else if (dotR < -0.35) {//far left autoMove = LS_A_R2L; } - else if ( dotR > 0.15 ) + else if (dotR > 0.15) {//enemy is to near right autoMove = LS_A_TR2BL; } - else if ( dotR < -0.15 ) + else if (dotR < -0.15) {//near left autoMove = LS_A_TL2BR; } - if ( DotProduct( enemyDir, faceUp ) > 0.5 ) + if (DotProduct(enemyDir, faceUp) > 0.5) {//enemy is above me - if ( autoMove == LS_A_TR2BL ) + if (autoMove == LS_A_TR2BL) { autoMove = LS_A_BL2TR; } - else if ( autoMove == LS_A_TL2BR ) + else if (autoMove == LS_A_TL2BR) { autoMove = LS_A_BR2TL; } } } - else if ( allowFB ) + else if (allowFB) {//back attack allowed //if ( !PM_InKnockDown( pm->ps ) ) - if ( !(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK)) ) + if (!(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK))) {//okay to do backstabs with this saber - if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + if (pm->ps->groundEntityNum != ENTITYNUM_NONE) {//only when on ground - if ( !pm->gent->enemy->client || pm->gent->enemy->client->ps.groundEntityNum != ENTITYNUM_NONE ) + if (!pm->gent->enemy->client || pm->gent->enemy->client->ps.groundEntityNum != ENTITYNUM_NONE) {//enemy not a client or is a client and on ground - if ( dot < -0.75f + if (dot < -0.75f && enemyDist < 128 - && (pm->ps->saberAnimLevel == SS_FAST || pm->ps->saberAnimLevel == SS_STAFF || (pm->gent->client &&(pm->gent->client->NPC_class == CLASS_TAVION||pm->gent->client->NPC_class == CLASS_ALORA)&&Q_irand(0,2))) ) + && (pm->ps->saberAnimLevel == SS_FAST || pm->ps->saberAnimLevel == SS_STAFF || (pm->gent->client && (pm->gent->client->NPC_class == CLASS_TAVION || pm->gent->client->NPC_class == CLASS_ALORA) && Q_irand(0, 2)))) {//fast back-stab - if ( !(pm->ps->pm_flags&PMF_DUCKED) && pm->cmd.upmove >= 0 ) + if (!(pm->ps->pm_flags&PMF_DUCKED) && pm->cmd.upmove >= 0) {//can't do it while ducked? - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || (pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG) ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) || (pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG)) {//only fencers and above can do this autoMove = LS_A_BACKSTAB; } } } - else if ( pm->ps->saberAnimLevel != SS_FAST - && pm->ps->saberAnimLevel != SS_STAFF ) + else if (pm->ps->saberAnimLevel != SS_FAST + && pm->ps->saberAnimLevel != SS_STAFF) {//higher level back spin-attacks - if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) ) + if ((pm->ps->clientNum&&!PM_ControlledByPlayer()) || ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode)) { - if ( (pm->ps->pm_flags&PMF_DUCKED) || pm->cmd.upmove < 0 ) + if ((pm->ps->pm_flags&PMF_DUCKED) || pm->cmd.upmove < 0) { autoMove = LS_A_BACK_CR; } @@ -3004,70 +3004,70 @@ saberMoveName_t PM_AttackForEnemyPos( qboolean allowFB, qboolean allowStabDown ) return autoMove; } -qboolean PM_InSecondaryStyle( void ) +qboolean PM_InSecondaryStyle(void) { - if ( pm->ps->saber[0].numBlades > 1 + if (pm->ps->saber[0].numBlades > 1 && pm->ps->saber[0].singleBladeStyle - && (pm->ps->saber[0].stylesForbidden&(1<ps->saber[0].singleBladeStyle)) - && pm->ps->saberAnimLevel == pm->ps->saber[0].singleBladeStyle ) + && (pm->ps->saber[0].stylesForbidden&(1 << pm->ps->saber[0].singleBladeStyle)) + && pm->ps->saberAnimLevel == pm->ps->saber[0].singleBladeStyle) { return qtrue; } - if ( pm->ps->dualSabers - && !pm->ps->saber[1].Active() )//pm->ps->saberAnimLevel != SS_DUAL ) + if (pm->ps->dualSabers + && !pm->ps->saber[1].Active())//pm->ps->saberAnimLevel != SS_DUAL ) { return qtrue; } return qfalse; } -saberMoveName_t PM_SaberLungeAttackMove( qboolean fallbackToNormalLunge ) +saberMoveName_t PM_SaberLungeAttackMove(qboolean fallbackToNormalLunge) { - G_DrainPowerForSpecialMove( pm->gent, FP_SABER_OFFENSE, SABER_ALT_ATTACK_POWER_FB ); + G_DrainPowerForSpecialMove(pm->gent, FP_SABER_OFFENSE, SABER_ALT_ATTACK_POWER_FB); //see if we have an overridden (or cancelled) lunge move - if ( pm->ps->saber[0].lungeAtkMove != LS_INVALID ) + if (pm->ps->saber[0].lungeAtkMove != LS_INVALID) { - if ( pm->ps->saber[0].lungeAtkMove != LS_NONE ) + if (pm->ps->saber[0].lungeAtkMove != LS_NONE) { return (saberMoveName_t)pm->ps->saber[0].lungeAtkMove; } } - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].lungeAtkMove != LS_INVALID ) + if (pm->ps->saber[1].lungeAtkMove != LS_INVALID) { - if ( pm->ps->saber[1].lungeAtkMove != LS_NONE ) + if (pm->ps->saber[1].lungeAtkMove != LS_NONE) { return (saberMoveName_t)pm->ps->saber[1].lungeAtkMove; } } } //no overrides, cancelled? - if ( pm->ps->saber[0].lungeAtkMove == LS_NONE ) + if (pm->ps->saber[0].lungeAtkMove == LS_NONE) { return LS_NONE; } - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].lungeAtkMove == LS_NONE ) + if (pm->ps->saber[1].lungeAtkMove == LS_NONE) { return LS_NONE; } } //do normal checks - if ( pm->gent->client->NPC_class == CLASS_ALORA && !Q_irand( 0, 3 ) ) + if (pm->gent->client->NPC_class == CLASS_ALORA && !Q_irand(0, 3)) {//alora NPC - return LS_SPINATTACK_ALORA; + return LS_SPINATTACK_ALORA; } else { - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { return LS_SPINATTACK_DUAL; } - switch ( pm->ps->saberAnimLevel ) + switch (pm->ps->saberAnimLevel) { case SS_DUAL: return LS_SPINATTACK_DUAL; @@ -3076,17 +3076,17 @@ saberMoveName_t PM_SaberLungeAttackMove( qboolean fallbackToNormalLunge ) return LS_SPINATTACK; break; default://normal lunge - if ( fallbackToNormalLunge ) + if (fallbackToNormalLunge) { vec3_t fwdAngles, jumpFwd; - VectorCopy( pm->ps->viewangles, fwdAngles ); + VectorCopy(pm->ps->viewangles, fwdAngles); fwdAngles[PITCH] = fwdAngles[ROLL] = 0; //do the lunge - AngleVectors( fwdAngles, jumpFwd, NULL, NULL ); - VectorScale( jumpFwd, 150, pm->ps->velocity ); + AngleVectors(fwdAngles, jumpFwd, NULL, NULL); + VectorScale(jumpFwd, 150, pm->ps->velocity); pm->ps->velocity[2] = 50; - PM_AddEvent( EV_JUMP ); + PM_AddEvent(EV_JUMP); return LS_A_LUNGE; } @@ -3096,15 +3096,15 @@ saberMoveName_t PM_SaberLungeAttackMove( qboolean fallbackToNormalLunge ) return LS_NONE; } -qboolean PM_CheckLungeAttackMove( void ) +qboolean PM_CheckLungeAttackMove(void) { //check to see if it's cancelled? - if ( pm->ps->saber[0].lungeAtkMove == LS_NONE ) + if (pm->ps->saber[0].lungeAtkMove == LS_NONE) { - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].lungeAtkMove == LS_NONE - || pm->ps->saber[1].lungeAtkMove == LS_INVALID ) + if (pm->ps->saber[1].lungeAtkMove == LS_NONE + || pm->ps->saber[1].lungeAtkMove == LS_INVALID) { return qfalse; } @@ -3114,44 +3114,44 @@ qboolean PM_CheckLungeAttackMove( void ) return qfalse; } } - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].lungeAtkMove == LS_NONE ) + if (pm->ps->saber[1].lungeAtkMove == LS_NONE) { - if ( pm->ps->saber[0].lungeAtkMove == LS_NONE - || pm->ps->saber[0].lungeAtkMove == LS_INVALID ) + if (pm->ps->saber[0].lungeAtkMove == LS_NONE + || pm->ps->saber[0].lungeAtkMove == LS_INVALID) { return qfalse; } } } //do normal checks - if ( pm->ps->saberAnimLevel == SS_FAST//fast + if (pm->ps->saberAnimLevel == SS_FAST//fast || pm->ps->saberAnimLevel == SS_DUAL//dual || pm->ps->saberAnimLevel == SS_STAFF //staff || pm->ps->saberAnimLevel == SS_DESANN - || pm->ps->dualSabers ) + || pm->ps->dualSabers) {//alt+back+attack using fast, dual or staff attacks - if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + if (pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer()) {//NPC - if ( pm->cmd.upmove < 0 || (pm->ps->pm_flags&PMF_DUCKED) ) + if (pm->cmd.upmove < 0 || (pm->ps->pm_flags&PMF_DUCKED)) {//ducking - if ( pm->ps->legsAnim == BOTH_STAND2 + if (pm->ps->legsAnim == BOTH_STAND2 || pm->ps->legsAnim == BOTH_SABERFAST_STANCE || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE || pm->ps->legsAnim == BOTH_SABERSTAFF_STANCE || pm->ps->legsAnim == BOTH_SABERDUAL_STANCE - || (level.time-pm->ps->lastStationary) <= 500 ) + || (level.time - pm->ps->lastStationary) <= 500) {//standing or just stopped standing - if ( pm->gent + if (pm->gent && pm->gent->NPC //NPC && pm->gent->NPC->rank >= RANK_LT_JG //high rank - && ( pm->gent->NPC->rank == RANK_LT_JG || Q_irand( -3, pm->gent->NPC->rank ) >= RANK_LT_JG )//Q_irand( 0, pm->gent->NPC->rank ) >= RANK_LT_JG ) - && !Q_irand( 0, 3-g_spskill->integer ) ) + && (pm->gent->NPC->rank == RANK_LT_JG || Q_irand(-3, pm->gent->NPC->rank) >= RANK_LT_JG)//Q_irand( 0, pm->gent->NPC->rank ) >= RANK_LT_JG ) + && !Q_irand(0, 3 - g_spskill->integer)) {//only fencer and higher can do this - if ( pm->ps->saberAnimLevel == SS_DESANN ) + if (pm->ps->saberAnimLevel == SS_DESANN) { - if ( !Q_irand( 0, 4 ) ) + if (!Q_irand(0, 4)) { return qtrue; } @@ -3166,8 +3166,8 @@ qboolean PM_CheckLungeAttackMove( void ) } else {//player - if ( G_TryingLungeAttack( pm->gent, &pm->cmd ) - && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB )/*pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB*/ )//have enough force power to pull it off + if (G_TryingLungeAttack(pm->gent, &pm->cmd) + && G_EnoughPowerForSpecialMove(pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB)/*pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB*/)//have enough force power to pull it off { return qtrue; } @@ -3177,48 +3177,48 @@ qboolean PM_CheckLungeAttackMove( void ) return qfalse; } -saberMoveName_t PM_SaberJumpForwardAttackMove( void ) +saberMoveName_t PM_SaberJumpForwardAttackMove(void) { - G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_FB ); + G_DrainPowerForSpecialMove(pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_FB); //see if we have an overridden (or cancelled) kata move - if ( pm->ps->saber[0].jumpAtkFwdMove != LS_INVALID ) + if (pm->ps->saber[0].jumpAtkFwdMove != LS_INVALID) { - if ( pm->ps->saber[0].jumpAtkFwdMove != LS_NONE ) + if (pm->ps->saber[0].jumpAtkFwdMove != LS_NONE) { return (saberMoveName_t)pm->ps->saber[0].jumpAtkFwdMove; } } - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].jumpAtkFwdMove != LS_INVALID ) + if (pm->ps->saber[1].jumpAtkFwdMove != LS_INVALID) { - if ( pm->ps->saber[1].jumpAtkFwdMove != LS_NONE ) + if (pm->ps->saber[1].jumpAtkFwdMove != LS_NONE) { return (saberMoveName_t)pm->ps->saber[1].jumpAtkFwdMove; } } } //no overrides, cancelled? - if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + if (pm->ps->saber[0].jumpAtkFwdMove == LS_NONE) { return LS_NONE; } - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + if (pm->ps->saber[1].jumpAtkFwdMove == LS_NONE) { return LS_NONE; } } - if ( pm->ps->saberAnimLevel == SS_DUAL - || pm->ps->saberAnimLevel == SS_STAFF ) + if (pm->ps->saberAnimLevel == SS_DUAL + || pm->ps->saberAnimLevel == SS_STAFF) { pm->cmd.upmove = 0;//no jump just yet - if ( pm->ps->saberAnimLevel == SS_STAFF ) + if (pm->ps->saberAnimLevel == SS_STAFF) { - if ( Q_irand(0, 1) ) + if (Q_irand(0, 1)) { return LS_JUMPATTACK_STAFF_LEFT; } @@ -3234,38 +3234,38 @@ saberMoveName_t PM_SaberJumpForwardAttackMove( void ) { vec3_t fwdAngles, jumpFwd; - VectorCopy( pm->ps->viewangles, fwdAngles ); + VectorCopy(pm->ps->viewangles, fwdAngles); fwdAngles[PITCH] = fwdAngles[ROLL] = 0; - AngleVectors( fwdAngles, jumpFwd, NULL, NULL ); - VectorScale( jumpFwd, 200, pm->ps->velocity ); + AngleVectors(fwdAngles, jumpFwd, NULL, NULL); + VectorScale(jumpFwd, 200, pm->ps->velocity); pm->ps->velocity[2] = 180; pm->ps->forceJumpZStart = pm->ps->origin[2];//so we don't take damage if we land at same height - pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; + pm->ps->pm_flags |= PMF_JUMPING | PMF_SLOW_MO_FALL; //FIXME: NPCs yell? - PM_AddEvent( EV_JUMP ); - G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); + PM_AddEvent(EV_JUMP); + G_SoundOnEnt(pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav"); pm->cmd.upmove = 0; return LS_A_JUMP_T__B_; } } -qboolean PM_CheckJumpForwardAttackMove( void ) +qboolean PM_CheckJumpForwardAttackMove(void) { - if ( pm->ps->clientNum < MAX_CLIENTS - && PM_InSecondaryStyle() ) + if (pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle()) { return qfalse; } //check to see if it's cancelled? - if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + if (pm->ps->saber[0].jumpAtkFwdMove == LS_NONE) { - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE - || pm->ps->saber[1].jumpAtkFwdMove == LS_INVALID ) + if (pm->ps->saber[1].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[1].jumpAtkFwdMove == LS_INVALID) { return qfalse; } @@ -3275,12 +3275,12 @@ qboolean PM_CheckJumpForwardAttackMove( void ) return qfalse; } } - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + if (pm->ps->saber[1].jumpAtkFwdMove == LS_NONE) { - if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE - || pm->ps->saber[0].jumpAtkFwdMove == LS_INVALID ) + if (pm->ps->saber[0].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[0].jumpAtkFwdMove == LS_INVALID) { return qfalse; } @@ -3288,28 +3288,28 @@ qboolean PM_CheckJumpForwardAttackMove( void ) } //do normal checks - if ( pm->cmd.forwardmove > 0 //going forward + if (pm->cmd.forwardmove > 0 //going forward && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //can force jump && pm->gent && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one - && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped (if not player) + && (pm->ps->groundEntityNum != ENTITYNUM_NONE || level.time - pm->ps->lastOnGround <= 250) //on ground or just jumped (if not player) ) { - if ( pm->ps->saberAnimLevel == SS_DUAL - || pm->ps->saberAnimLevel == SS_STAFF ) + if (pm->ps->saberAnimLevel == SS_DUAL + || pm->ps->saberAnimLevel == SS_STAFF) {//dual and staff - if ( !PM_SaberInTransitionAny( pm->ps->saberMove ) //not going to/from/between an attack anim - && !PM_SaberInAttack( pm->ps->saberMove ) //not in attack anim + if (!PM_SaberInTransitionAny(pm->ps->saberMove) //not going to/from/between an attack anim + && !PM_SaberInAttack(pm->ps->saberMove) //not in attack anim && pm->ps->weaponTime <= 0//not busy - && (pm->cmd.buttons&BUTTON_ATTACK) )//want to attack + && (pm->cmd.buttons&BUTTON_ATTACK))//want to attack { - if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + if (pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer()) {//NPC - if ( pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING) )//jumping NPC + if (pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING))//jumping NPC { - if ( pm->gent - && pm->gent->NPC - && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) + if (pm->gent + && pm->gent->NPC + && (pm->gent->NPC->rank == RANK_CREWMAN || pm->gent->NPC->rank >= RANK_LT)) { return qtrue; } @@ -3317,8 +3317,8 @@ qboolean PM_CheckJumpForwardAttackMove( void ) } else {//PLAYER - if ( G_TryingJumpForwardAttack( pm->gent, &pm->cmd ) - && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB ) )//have enough power to attack + if (G_TryingJumpForwardAttack(pm->gent, &pm->cmd) + && G_EnoughPowerForSpecialMove(pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB))//have enough power to attack { return qtrue; } @@ -3326,8 +3326,8 @@ qboolean PM_CheckJumpForwardAttackMove( void ) } } //check strong - else if ( pm->ps->saberAnimLevel == SS_STRONG //strong style - || pm->ps->saberAnimLevel == SS_DESANN )//desann + else if (pm->ps->saberAnimLevel == SS_STRONG //strong style + || pm->ps->saberAnimLevel == SS_DESANN)//desann { if ( //&& !PM_InKnockDown( pm->ps ) !pm->ps->dualSabers @@ -3336,27 +3336,27 @@ qboolean PM_CheckJumpForwardAttackMove( void ) {//strong attack: jump-hack /* if ( pm->ps->legsAnim == BOTH_STAND2 - || pm->ps->legsAnim == BOTH_SABERFAST_STANCE - || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE - || level.time-pm->ps->lastStationary <= 250 )//standing or just started moving + || pm->ps->legsAnim == BOTH_SABERFAST_STANCE + || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE + || level.time-pm->ps->lastStationary <= 250 )//standing or just started moving */ - if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + if (pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer()) {//NPC - if ( pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING) )//NPC jumping + if (pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING))//NPC jumping { - if ( pm->gent - && pm->gent->NPC - && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) + if (pm->gent + && pm->gent->NPC + && (pm->gent->NPC->rank == RANK_CREWMAN || pm->gent->NPC->rank >= RANK_LT)) {//only acrobat or boss and higher can do this - if ( pm->ps->legsAnim == BOTH_STAND2 - || pm->ps->legsAnim == BOTH_SABERFAST_STANCE + if (pm->ps->legsAnim == BOTH_STAND2 + || pm->ps->legsAnim == BOTH_SABERFAST_STANCE || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE - || level.time-pm->ps->lastStationary <= 250 ) + || level.time - pm->ps->lastStationary <= 250) {//standing or just started moving - if ( pm->gent->client - && pm->gent->client->NPC_class == CLASS_DESANN ) + if (pm->gent->client + && pm->gent->client->NPC_class == CLASS_DESANN) { - if ( !Q_irand( 0, 1 ) ) + if (!Q_irand(0, 1)) { return qtrue; } @@ -3371,8 +3371,8 @@ qboolean PM_CheckJumpForwardAttackMove( void ) } else {//player - if ( G_TryingJumpForwardAttack( pm->gent, &pm->cmd ) - && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB ) ) + if (G_TryingJumpForwardAttack(pm->gent, &pm->cmd) + && G_EnoughPowerForSpecialMove(pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB)) { return qtrue; } @@ -3383,34 +3383,34 @@ qboolean PM_CheckJumpForwardAttackMove( void ) return qfalse; } -saberMoveName_t PM_SaberFlipOverAttackMove( void ) +saberMoveName_t PM_SaberFlipOverAttackMove(void) { //see if we have an overridden (or cancelled) kata move - if ( pm->ps->saber[0].jumpAtkFwdMove != LS_INVALID ) + if (pm->ps->saber[0].jumpAtkFwdMove != LS_INVALID) { - if ( pm->ps->saber[0].jumpAtkFwdMove != LS_NONE ) + if (pm->ps->saber[0].jumpAtkFwdMove != LS_NONE) { return (saberMoveName_t)pm->ps->saber[0].jumpAtkFwdMove; } } - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].jumpAtkFwdMove != LS_INVALID ) + if (pm->ps->saber[1].jumpAtkFwdMove != LS_INVALID) { - if ( pm->ps->saber[1].jumpAtkFwdMove != LS_NONE ) + if (pm->ps->saber[1].jumpAtkFwdMove != LS_NONE) { return (saberMoveName_t)pm->ps->saber[1].jumpAtkFwdMove; } } } //no overrides, cancelled? - if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + if (pm->ps->saber[0].jumpAtkFwdMove == LS_NONE) { return LS_NONE; } - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + if (pm->ps->saber[1].jumpAtkFwdMove == LS_NONE) { return LS_NONE; } @@ -3419,47 +3419,47 @@ saberMoveName_t PM_SaberFlipOverAttackMove( void ) //FIXME: while in this jump, keep velocity[2] at a minimum until the end of the anim vec3_t fwdAngles, jumpFwd; - VectorCopy( pm->ps->viewangles, fwdAngles ); + VectorCopy(pm->ps->viewangles, fwdAngles); fwdAngles[PITCH] = fwdAngles[ROLL] = 0; - AngleVectors( fwdAngles, jumpFwd, NULL, NULL ); - VectorScale( jumpFwd, 150, pm->ps->velocity ); + AngleVectors(fwdAngles, jumpFwd, NULL, NULL); + VectorScale(jumpFwd, 150, pm->ps->velocity); pm->ps->velocity[2] = 250; //250 is normalized for a standing enemy at your z level, about 64 tall... adjust for actual maxs[2]-mins[2] of enemy and for zdiff in origins - if ( pm->gent && pm->gent->enemy ) + if (pm->gent && pm->gent->enemy) { //go higher for taller enemies - pm->ps->velocity[2] *= (pm->gent->enemy->maxs[2]-pm->gent->enemy->mins[2])/64.0f; + pm->ps->velocity[2] *= (pm->gent->enemy->maxs[2] - pm->gent->enemy->mins[2]) / 64.0f; //go higher for enemies higher than you, lower for those lower than you float zDiff = pm->gent->enemy->currentOrigin[2] - pm->ps->origin[2]; pm->ps->velocity[2] += (zDiff)*1.5f; //clamp to decent-looking values //FIXME: still jump too low sometimes - if ( zDiff <= 0 && pm->ps->velocity[2] < 200 ) + if (zDiff <= 0 && pm->ps->velocity[2] < 200) {//if we're on same level, don't let me jump so low, I clip into the ground pm->ps->velocity[2] = 200; } - else if ( pm->ps->velocity[2] < 50 ) + else if (pm->ps->velocity[2] < 50) { pm->ps->velocity[2] = 50; } - else if ( pm->ps->velocity[2] > 400 ) + else if (pm->ps->velocity[2] > 400) { pm->ps->velocity[2] = 400; } } pm->ps->forceJumpZStart = pm->ps->origin[2];//so we don't take damage if we land at same height - pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; + pm->ps->pm_flags |= PMF_JUMPING | PMF_SLOW_MO_FALL; //FIXME: NPCs yell? - PM_AddEvent( EV_JUMP ); - G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); + PM_AddEvent(EV_JUMP); + G_SoundOnEnt(pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav"); pm->cmd.upmove = 0; //FIXME: don't allow this to land on other people pm->gent->angle = pm->ps->viewangles[YAW];//so we know what yaw we started this at - G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_FB ); + G_DrainPowerForSpecialMove(pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_FB); - if ( Q_irand( 0, 1 ) ) + if (Q_irand(0, 1)) { return LS_A_FLIP_STAB; } @@ -3469,20 +3469,20 @@ saberMoveName_t PM_SaberFlipOverAttackMove( void ) } } -qboolean PM_CheckFlipOverAttackMove( qboolean checkEnemy ) +qboolean PM_CheckFlipOverAttackMove(qboolean checkEnemy) { - if ( pm->ps->clientNum < MAX_CLIENTS - && PM_InSecondaryStyle() ) + if (pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle()) { return qfalse; } //check to see if it's cancelled? - if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + if (pm->ps->saber[0].jumpAtkFwdMove == LS_NONE) { - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE - || pm->ps->saber[1].jumpAtkFwdMove == LS_INVALID ) + if (pm->ps->saber[1].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[1].jumpAtkFwdMove == LS_INVALID) { return qfalse; } @@ -3492,12 +3492,12 @@ qboolean PM_CheckFlipOverAttackMove( qboolean checkEnemy ) return qfalse; } } - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + if (pm->ps->saber[1].jumpAtkFwdMove == LS_NONE) { - if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE - || pm->ps->saber[0].jumpAtkFwdMove == LS_INVALID ) + if (pm->ps->saber[0].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[0].jumpAtkFwdMove == LS_INVALID) { return qfalse; } @@ -3505,22 +3505,22 @@ qboolean PM_CheckFlipOverAttackMove( qboolean checkEnemy ) } //do normal checks - if ( (pm->ps->saberAnimLevel == SS_MEDIUM //medium - || pm->ps->saberAnimLevel == SS_TAVION )//tavion + if ((pm->ps->saberAnimLevel == SS_MEDIUM //medium + || pm->ps->saberAnimLevel == SS_TAVION)//tavion && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //can force jump && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one - && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped + && (pm->ps->groundEntityNum != ENTITYNUM_NONE || level.time - pm->ps->lastOnGround <= 250) //on ground or just jumped ) { qboolean tryMove = qfalse; - if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + if (pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer()) {//NPC - if ( pm->cmd.upmove > 0//want to jump - || (pm->ps->pm_flags&PMF_JUMPING) )//jumping + if (pm->cmd.upmove > 0//want to jump + || (pm->ps->pm_flags&PMF_JUMPING))//jumping {//flip over-forward down-attack - if ( (pm->gent->NPC - && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) - && !Q_irand(0, 2) ) )//NPC who can do this, 33% chance + if ((pm->gent->NPC + && (pm->gent->NPC->rank == RANK_CREWMAN || pm->gent->NPC->rank >= RANK_LT) + && !Q_irand(0, 2)))//NPC who can do this, 33% chance {//only player or acrobat or boss and higher can do this tryMove = qtrue; } @@ -3528,15 +3528,15 @@ qboolean PM_CheckFlipOverAttackMove( qboolean checkEnemy ) } else {//player - if ( G_TryingJumpForwardAttack( pm->gent, &pm->cmd ) - && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB ) )//have enough power + if (G_TryingJumpForwardAttack(pm->gent, &pm->cmd) + && G_EnoughPowerForSpecialMove(pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB))//have enough power { - if ( !pm->cmd.rightmove ) + if (!pm->cmd.rightmove) { - if ( pm->ps->legsAnim == BOTH_JUMP1 - || pm->ps->legsAnim == BOTH_FORCEJUMP1 - || pm->ps->legsAnim == BOTH_INAIR1 - || pm->ps->legsAnim == BOTH_FORCEINAIR1 ) + if (pm->ps->legsAnim == BOTH_JUMP1 + || pm->ps->legsAnim == BOTH_FORCEJUMP1 + || pm->ps->legsAnim == BOTH_INAIR1 + || pm->ps->legsAnim == BOTH_FORCEINAIR1) {//in a non-flip forward jump tryMove = qtrue; } @@ -3544,23 +3544,23 @@ qboolean PM_CheckFlipOverAttackMove( qboolean checkEnemy ) } } - if ( tryMove ) + if (tryMove) { - if ( !checkEnemy ) + if (!checkEnemy) {//based just on command input return qtrue; } else {//based on presence of enemy - if ( pm->gent->enemy )//have an enemy + if (pm->gent->enemy)//have an enemy { - vec3_t fwdAngles = {0,pm->ps->viewangles[YAW],0}; - if ( pm->gent->enemy->health > 0 + vec3_t fwdAngles = { 0, pm->ps->viewangles[YAW], 0 }; + if (pm->gent->enemy->health > 0 && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period && pm->gent->enemy->maxs[2] > 12 - && (!pm->gent->enemy->client || !PM_InKnockDownOnGround( &pm->gent->enemy->client->ps ) ) - && DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ) < 10000 - && InFront( pm->gent->enemy->currentOrigin, pm->gent->currentOrigin, fwdAngles, 0.3f ) ) + && (!pm->gent->enemy->client || !PM_InKnockDownOnGround(&pm->gent->enemy->client->ps)) + && DistanceSquared(pm->gent->currentOrigin, pm->gent->enemy->currentOrigin) < 10000 + && InFront(pm->gent->enemy->currentOrigin, pm->gent->currentOrigin, fwdAngles, 0.3f)) {//enemy must be alive, not low to ground, close and in front return qtrue; } @@ -3572,34 +3572,34 @@ qboolean PM_CheckFlipOverAttackMove( qboolean checkEnemy ) return qfalse; } -saberMoveName_t PM_SaberBackflipAttackMove( void ) +saberMoveName_t PM_SaberBackflipAttackMove(void) { //see if we have an overridden (or cancelled) kata move - if ( pm->ps->saber[0].jumpAtkBackMove != LS_INVALID ) + if (pm->ps->saber[0].jumpAtkBackMove != LS_INVALID) { - if ( pm->ps->saber[0].jumpAtkBackMove != LS_NONE ) + if (pm->ps->saber[0].jumpAtkBackMove != LS_NONE) { return (saberMoveName_t)pm->ps->saber[0].jumpAtkBackMove; } } - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].jumpAtkBackMove != LS_INVALID ) + if (pm->ps->saber[1].jumpAtkBackMove != LS_INVALID) { - if ( pm->ps->saber[1].jumpAtkBackMove != LS_NONE ) + if (pm->ps->saber[1].jumpAtkBackMove != LS_NONE) { return (saberMoveName_t)pm->ps->saber[1].jumpAtkBackMove; } } } //no overrides, cancelled? - if ( pm->ps->saber[0].jumpAtkBackMove == LS_NONE ) + if (pm->ps->saber[0].jumpAtkBackMove == LS_NONE) { return LS_NONE; } - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].jumpAtkBackMove == LS_NONE ) + if (pm->ps->saber[1].jumpAtkBackMove == LS_NONE) { return LS_NONE; } @@ -3608,21 +3608,21 @@ saberMoveName_t PM_SaberBackflipAttackMove( void ) return LS_A_BACKFLIP_ATK; } -qboolean PM_CheckBackflipAttackMove( void ) +qboolean PM_CheckBackflipAttackMove(void) { - if ( pm->ps->clientNum < MAX_CLIENTS - && PM_InSecondaryStyle() ) + if (pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle()) { return qfalse; } //check to see if it's cancelled? - if ( pm->ps->saber[0].jumpAtkBackMove == LS_NONE ) + if (pm->ps->saber[0].jumpAtkBackMove == LS_NONE) { - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].jumpAtkBackMove == LS_NONE - || pm->ps->saber[1].jumpAtkBackMove == LS_INVALID ) + if (pm->ps->saber[1].jumpAtkBackMove == LS_NONE + || pm->ps->saber[1].jumpAtkBackMove == LS_INVALID) { return qfalse; } @@ -3632,12 +3632,12 @@ qboolean PM_CheckBackflipAttackMove( void ) return qfalse; } } - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].jumpAtkBackMove == LS_NONE ) + if (pm->ps->saber[1].jumpAtkBackMove == LS_NONE) { - if ( pm->ps->saber[0].jumpAtkBackMove == LS_NONE - || pm->ps->saber[0].jumpAtkBackMove == LS_INVALID ) + if (pm->ps->saber[0].jumpAtkBackMove == LS_NONE + || pm->ps->saber[0].jumpAtkBackMove == LS_INVALID) { return qfalse; } @@ -3645,26 +3645,26 @@ qboolean PM_CheckBackflipAttackMove( void ) } //do normal checks - if ( pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //can force jump + if (pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //can force jump && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period && pm->gent && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one //&& (pm->ps->legsAnim == BOTH_SABERSTAFF_STANCE || level.time-pm->ps->lastStationary<=250)//standing or just started moving - && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) )//on ground or just jumped (if not player) + && (pm->ps->groundEntityNum != ENTITYNUM_NONE || level.time - pm->ps->lastOnGround <= 250))//on ground or just jumped (if not player) { - if ( pm->cmd.forwardmove < 0 //moving backwards + if (pm->cmd.forwardmove < 0 //moving backwards && pm->ps->saberAnimLevel == SS_STAFF //using staff - && (pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING)) )//jumping + && (pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING)))//jumping {//jumping backwards and using staff - if ( !PM_SaberInTransitionAny( pm->ps->saberMove ) //not going to/from/between an attack anim - && !PM_SaberInAttack( pm->ps->saberMove ) //not in attack anim + if (!PM_SaberInTransitionAny(pm->ps->saberMove) //not going to/from/between an attack anim + && !PM_SaberInAttack(pm->ps->saberMove) //not in attack anim && pm->ps->weaponTime <= 0//not busy - && (pm->cmd.buttons&BUTTON_ATTACK) )//want to attack + && (pm->cmd.buttons&BUTTON_ATTACK))//want to attack {//not already attacking - if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + if (pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer()) {//NPC - if ( pm->gent - && pm->gent->NPC - && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) + if (pm->gent + && pm->gent->NPC + && (pm->gent->NPC->rank == RANK_CREWMAN || pm->gent->NPC->rank >= RANK_LT)) {//acrobat or boss and higher can do this return qtrue; } @@ -3679,65 +3679,65 @@ qboolean PM_CheckBackflipAttackMove( void ) return qfalse; } -saberMoveName_t PM_CheckDualSpinProtect( void ) +saberMoveName_t PM_CheckDualSpinProtect(void) { - if ( pm->ps->clientNum < MAX_CLIENTS - && PM_InSecondaryStyle() ) + if (pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle()) { return LS_NONE; } //see if we have an overridden (or cancelled) kata move - if ( pm->ps->saber[0].kataMove != LS_INVALID ) + if (pm->ps->saber[0].kataMove != LS_INVALID) { - if ( pm->ps->saber[0].kataMove != LS_NONE ) + if (pm->ps->saber[0].kataMove != LS_NONE) { return (saberMoveName_t)pm->ps->saber[0].kataMove; } } - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].kataMove != LS_INVALID ) + if (pm->ps->saber[1].kataMove != LS_INVALID) { - if ( pm->ps->saber[1].kataMove != LS_NONE ) + if (pm->ps->saber[1].kataMove != LS_NONE) { return (saberMoveName_t)pm->ps->saber[1].kataMove; } } } //no overrides, cancelled? - if ( pm->ps->saber[0].kataMove == LS_NONE ) + if (pm->ps->saber[0].kataMove == LS_NONE) { return LS_NONE; } - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].kataMove == LS_NONE ) + if (pm->ps->saber[1].kataMove == LS_NONE) { return LS_NONE; } } //do normal checks - if ( pm->ps->saberMove == LS_READY//ready + if (pm->ps->saberMove == LS_READY//ready //&& (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//PLAYER ONLY...? //&& pm->ps->viewangles[0] > 30 //looking down && pm->ps->saberAnimLevel == SS_DUAL//using dual saber style && pm->ps->saber[0].Active() && pm->ps->saber[1].Active()//both sabers on //&& pm->ps->forcePowerLevel[FP_PUSH]>=FORCE_LEVEL_3//force push 3 //&& ((pm->ps->forcePowersActive&(1<ps->forcePowerDebounce[FP_PUSH]>level.time)//force-pushing - && G_TryingKataAttack( pm->gent, &pm->cmd )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus - && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER, qtrue )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER//DUAL_SPIN_PROTECT_POWER//force push 3 + && G_TryingKataAttack(pm->gent, &pm->cmd)//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus + && G_EnoughPowerForSpecialMove(pm->ps->forcePower, SABER_ALT_ATTACK_POWER, qtrue)//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER//DUAL_SPIN_PROTECT_POWER//force push 3 && (pm->cmd.buttons&BUTTON_ATTACK)//pressing attack ) {//FIXME: some NPC logic to do this? /* if ( (pm->ps->pm_flags&PMF_DUCKED||pm->cmd.upmove<0)//crouching - && g_crosshairEntNum >= ENTITYNUM_WORLD ) + && g_crosshairEntNum >= ENTITYNUM_WORLD ) */ { - if ( pm->gent ) + if (pm->gent) { - G_DrainPowerForSpecialMove( pm->gent, FP_PUSH, SABER_ALT_ATTACK_POWER, qtrue );//drain the required force power + G_DrainPowerForSpecialMove(pm->gent, FP_PUSH, SABER_ALT_ATTACK_POWER, qtrue);//drain the required force power } return LS_DUAL_SPIN_PROTECT; } @@ -3745,65 +3745,65 @@ saberMoveName_t PM_CheckDualSpinProtect( void ) return LS_NONE; } -saberMoveName_t PM_CheckStaffKata( void ) +saberMoveName_t PM_CheckStaffKata(void) { - if ( pm->ps->clientNum < MAX_CLIENTS - && PM_InSecondaryStyle() ) + if (pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle()) { return LS_NONE; } //see if we have an overridden (or cancelled) kata move - if ( pm->ps->saber[0].kataMove != LS_INVALID ) + if (pm->ps->saber[0].kataMove != LS_INVALID) { - if ( pm->ps->saber[0].kataMove != LS_NONE ) + if (pm->ps->saber[0].kataMove != LS_NONE) { return (saberMoveName_t)pm->ps->saber[0].kataMove; } } - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].kataMove != LS_INVALID ) + if (pm->ps->saber[1].kataMove != LS_INVALID) { - if ( pm->ps->saber[1].kataMove != LS_NONE ) + if (pm->ps->saber[1].kataMove != LS_NONE) { return (saberMoveName_t)pm->ps->saber[1].kataMove; } } } //no overrides, cancelled? - if ( pm->ps->saber[0].kataMove == LS_NONE ) + if (pm->ps->saber[0].kataMove == LS_NONE) { return LS_NONE; } - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].kataMove == LS_NONE ) + if (pm->ps->saber[1].kataMove == LS_NONE) { return LS_NONE; } } //do normal checks - if ( pm->ps->saberMove == LS_READY//ready + if (pm->ps->saberMove == LS_READY//ready //&& (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//PLAYER ONLY...? //&& pm->ps->viewangles[0] > 30 //looking down && pm->ps->saberAnimLevel == SS_STAFF//using dual saber style && pm->ps->saber[0].Active()//saber on //&& pm->ps->forcePowerLevel[FP_PUSH]>=FORCE_LEVEL_3//force push 3 //&& ((pm->ps->forcePowersActive&(1<ps->forcePowerDebounce[FP_PUSH]>level.time)//force-pushing - && G_TryingKataAttack( pm->gent, &pm->cmd )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus - && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER, qtrue )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER//DUAL_SPIN_PROTECT_POWER//force push 3 + && G_TryingKataAttack(pm->gent, &pm->cmd)//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus + && G_EnoughPowerForSpecialMove(pm->ps->forcePower, SABER_ALT_ATTACK_POWER, qtrue)//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER//DUAL_SPIN_PROTECT_POWER//force push 3 && (pm->cmd.buttons&BUTTON_ATTACK)//pressing attack ) {//FIXME: some NPC logic to do this? /* if ( (pm->ps->pm_flags&PMF_DUCKED||pm->cmd.upmove<0)//crouching - && g_crosshairEntNum >= ENTITYNUM_WORLD ) + && g_crosshairEntNum >= ENTITYNUM_WORLD ) */ { - if ( pm->gent ) + if (pm->gent) { - G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER, qtrue );//drain the required force power + G_DrainPowerForSpecialMove(pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER, qtrue);//drain the required force power } return LS_STAFF_SOULCAL; } @@ -3811,41 +3811,41 @@ saberMoveName_t PM_CheckStaffKata( void ) return LS_NONE; } -extern qboolean WP_ForceThrowable( gentity_t *ent, gentity_t *forwardEnt, gentity_t *self, qboolean pull, float cone, float radius, vec3_t forward ); -saberMoveName_t PM_CheckPullAttack( void ) +extern qboolean WP_ForceThrowable(gentity_t *ent, gentity_t *forwardEnt, gentity_t *self, qboolean pull, float cone, float radius, vec3_t forward); +saberMoveName_t PM_CheckPullAttack(void) { - if ( pm->ps->clientNum < MAX_CLIENTS - && PM_InSecondaryStyle() ) + if (pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle()) { return LS_NONE; } - if ( (pm->ps->saber[0].saberFlags&SFL_NO_PULL_ATTACK) ) + if ((pm->ps->saber[0].saberFlags&SFL_NO_PULL_ATTACK)) { return LS_NONE; } - if ( pm->ps->dualSabers - && (pm->ps->saber[1].saberFlags&SFL_NO_PULL_ATTACK) ) + if (pm->ps->dualSabers + && (pm->ps->saber[1].saberFlags&SFL_NO_PULL_ATTACK)) { return LS_NONE; } - if ( (pm->ps->saberMove == LS_READY||PM_SaberInReturn(pm->ps->saberMove)||PM_SaberInReflect(pm->ps->saberMove))//ready + if ((pm->ps->saberMove == LS_READY || PM_SaberInReturn(pm->ps->saberMove) || PM_SaberInReflect(pm->ps->saberMove))//ready //&& (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//PLAYER ONLY && pm->ps->saberAnimLevel >= SS_FAST//single saber styles - FIXME: Tavion? && pm->ps->saberAnimLevel <= SS_STRONG//single saber styles - FIXME: Tavion? - && G_TryingPullAttack( pm->gent, &pm->cmd, qfalse )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus + && G_TryingPullAttack(pm->gent, &pm->cmd, qfalse)//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus //&& pm->cmd.forwardmove<0//pulling back && (pm->cmd.buttons&BUTTON_ATTACK)//attacking - && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB//have enough power + && G_EnoughPowerForSpecialMove(pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB)//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB//have enough power ) {//FIXME: some NPC logic to do this? - qboolean doMove = g_saberNewControlScheme->integer?qtrue:qfalse;//in new control scheme, can always do this, even if there's no-one to do it to - if ( g_saberNewControlScheme->integer - || g_crosshairEntNum < ENTITYNUM_WORLD )//in old control scheme, there has to be someone there - { + qboolean doMove = g_saberNewControlScheme->integer ? qtrue : qfalse;//in new control scheme, can always do this, even if there's no-one to do it to + if (g_saberNewControlScheme->integer + || g_crosshairEntNum < ENTITYNUM_WORLD)//in old control scheme, there has to be someone there + { saberMoveName_t pullAttackMove = LS_NONE; - if ( pm->ps->saberAnimLevel == SS_FAST ) + if (pm->ps->saberAnimLevel == SS_FAST) { pullAttackMove = LS_PULL_ATTACK_STAB; } @@ -3854,73 +3854,73 @@ saberMoveName_t PM_CheckPullAttack( void ) pullAttackMove = LS_PULL_ATTACK_SWING; } - if ( g_crosshairEntNum < ENTITYNUM_WORLD - && pm->gent && pm->gent->client ) + if (g_crosshairEntNum < ENTITYNUM_WORLD + && pm->gent && pm->gent->client) { gentity_t *targEnt = &g_entities[g_crosshairEntNum]; - if ( targEnt->client + if (targEnt->client && targEnt->health > 0 //FIXME: check other things like in knockdown, saberlock, uninterruptable anims, etc. - && !PM_InOnGroundAnim( &targEnt->client->ps ) - && !PM_LockedAnim( targEnt->client->ps.legsAnim ) - && !PM_SuperBreakLoseAnim( targEnt->client->ps.legsAnim ) - && !PM_SuperBreakWinAnim( targEnt->client->ps.legsAnim ) + && !PM_InOnGroundAnim(&targEnt->client->ps) + && !PM_LockedAnim(targEnt->client->ps.legsAnim) + && !PM_SuperBreakLoseAnim(targEnt->client->ps.legsAnim) + && !PM_SuperBreakWinAnim(targEnt->client->ps.legsAnim) && targEnt->client->ps.saberLockTime <= 0 - && WP_ForceThrowable( targEnt, targEnt, pm->gent, qtrue, 1.0f, 0.0f, NULL ) ) + && WP_ForceThrowable(targEnt, targEnt, pm->gent, qtrue, 1.0f, 0.0f, NULL)) { - if ( !g_saberNewControlScheme->integer ) + if (!g_saberNewControlScheme->integer) {//in old control scheme, make sure they're close or far enough away for the move we'll be doing - float targDist = Distance( targEnt->currentOrigin, pm->ps->origin ); - if ( pullAttackMove == LS_PULL_ATTACK_STAB ) + float targDist = Distance(targEnt->currentOrigin, pm->ps->origin); + if (pullAttackMove == LS_PULL_ATTACK_STAB) {//must be closer than 512 - if ( targDist > 384.0f ) + if (targDist > 384.0f) { return LS_NONE; } } else//if ( pullAttackMove == LS_PULL_ATTACK_SWING ) {//must be farther than 256 - if ( targDist > 512.0f ) + if (targDist > 512.0f) { return LS_NONE; } - if ( targDist < 192.0f ) + if (targDist < 192.0f) { return LS_NONE; } } } - vec3_t targAngles = {0,targEnt->client->ps.viewangles[YAW],0}; - if ( InFront( pm->ps->origin, targEnt->currentOrigin, targAngles ) ) + vec3_t targAngles = { 0, targEnt->client->ps.viewangles[YAW], 0 }; + if (InFront(pm->ps->origin, targEnt->currentOrigin, targAngles)) { - NPC_SetAnim( targEnt, SETANIM_BOTH, BOTH_PULLED_INAIR_F, SETANIM_FLAG_OVERRIDE, SETANIM_FLAG_HOLD ); + NPC_SetAnim(targEnt, SETANIM_BOTH, BOTH_PULLED_INAIR_F, SETANIM_FLAG_OVERRIDE, SETANIM_FLAG_HOLD); } else { - NPC_SetAnim( targEnt, SETANIM_BOTH, BOTH_PULLED_INAIR_B, SETANIM_FLAG_OVERRIDE, SETANIM_FLAG_HOLD ); + NPC_SetAnim(targEnt, SETANIM_BOTH, BOTH_PULLED_INAIR_B, SETANIM_FLAG_OVERRIDE, SETANIM_FLAG_HOLD); } //hold the anim until I'm with done pull anim - targEnt->client->ps.legsAnimTimer = targEnt->client->ps.torsoAnimTimer = PM_AnimLength( pm->gent->client->clientInfo.animFileIndex, (animNumber_t)saberMoveData[pullAttackMove].animToUse ); + targEnt->client->ps.legsAnimTimer = targEnt->client->ps.torsoAnimTimer = PM_AnimLength(pm->gent->client->clientInfo.animFileIndex, (animNumber_t)saberMoveData[pullAttackMove].animToUse); //set pullAttackTime - pm->gent->client->ps.pullAttackTime = targEnt->client->ps.pullAttackTime = level.time+targEnt->client->ps.legsAnimTimer; + pm->gent->client->ps.pullAttackTime = targEnt->client->ps.pullAttackTime = level.time + targEnt->client->ps.legsAnimTimer; //make us know about each other pm->gent->client->ps.pullAttackEntNum = g_crosshairEntNum; targEnt->client->ps.pullAttackEntNum = pm->ps->clientNum; //do effect and sound on me pm->ps->powerups[PW_FORCE_PUSH] = level.time + 1000; - if ( pm->gent ) + if (pm->gent) { - G_Sound( pm->gent, G_SoundIndex( "sound/weapons/force/pull.wav" ) ); + G_Sound(pm->gent, G_SoundIndex("sound/weapons/force/pull.wav")); } doMove = qtrue; } } - if ( doMove ) + if (doMove) { - if ( pm->gent ) + if (pm->gent) { - G_DrainPowerForSpecialMove( pm->gent, FP_PULL, SABER_ALT_ATTACK_POWER_FB ); + G_DrainPowerForSpecialMove(pm->gent, FP_PULL, SABER_ALT_ATTACK_POWER_FB); } return pullAttackMove; } @@ -3929,14 +3929,14 @@ saberMoveName_t PM_CheckPullAttack( void ) return LS_NONE; } -saberMoveName_t PM_CheckPlayerAttackFromParry( int curmove ) +saberMoveName_t PM_CheckPlayerAttackFromParry(int curmove) { - if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) + if (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) { - if ( curmove >= LS_PARRY_UP - && curmove <= LS_REFLECT_LL ) + if (curmove >= LS_PARRY_UP + && curmove <= LS_REFLECT_LL) {//in a parry - switch ( saberMoveData[curmove].endQuad ) + switch (saberMoveData[curmove].endQuad) { case Q_T: return LS_A_T2B; @@ -3953,7 +3953,7 @@ saberMoveName_t PM_CheckPlayerAttackFromParry( int curmove ) case Q_BL: return LS_A_BL2TR; break; - //shouldn't be a parry that ends at L, R or B + //shouldn't be a parry that ends at L, R or B } } } @@ -3961,25 +3961,25 @@ saberMoveName_t PM_CheckPlayerAttackFromParry( int curmove ) } -saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int curmove ) +saberMoveName_t PM_SaberAttackForMovement(int forwardmove, int rightmove, int curmove) { qboolean noSpecials = qfalse; - - if ( pm->ps->clientNum < MAX_CLIENTS - && PM_InSecondaryStyle() ) + + if (pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle()) { noSpecials = qtrue; } saberMoveName_t overrideJumpRightAttackMove = LS_INVALID; - if ( pm->ps->saber[0].jumpAtkRightMove != LS_INVALID ) + if (pm->ps->saber[0].jumpAtkRightMove != LS_INVALID) { - if ( pm->ps->saber[0].jumpAtkRightMove != LS_NONE ) + if (pm->ps->saber[0].jumpAtkRightMove != LS_NONE) {//actually overriding overrideJumpRightAttackMove = (saberMoveName_t)pm->ps->saber[0].jumpAtkRightMove; } - else if ( pm->ps->dualSabers - && pm->ps->saber[1].jumpAtkRightMove > LS_NONE ) + else if (pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkRightMove > LS_NONE) {//would be cancelling it, but check the second saber, too overrideJumpRightAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkRightMove; } @@ -3988,21 +3988,21 @@ saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int c overrideJumpRightAttackMove = LS_NONE; } } - else if ( pm->ps->dualSabers - && pm->ps->saber[1].jumpAtkRightMove != LS_INVALID ) + else if (pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkRightMove != LS_INVALID) {//first saber not overridden, check second overrideJumpRightAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkRightMove; } saberMoveName_t overrideJumpLeftAttackMove = LS_INVALID; - if ( pm->ps->saber[0].jumpAtkLeftMove != LS_INVALID ) + if (pm->ps->saber[0].jumpAtkLeftMove != LS_INVALID) { - if ( pm->ps->saber[0].jumpAtkLeftMove != LS_NONE ) + if (pm->ps->saber[0].jumpAtkLeftMove != LS_NONE) {//actually overriding overrideJumpLeftAttackMove = (saberMoveName_t)pm->ps->saber[0].jumpAtkLeftMove; } - else if ( pm->ps->dualSabers - && pm->ps->saber[1].jumpAtkLeftMove > LS_NONE ) + else if (pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkLeftMove > LS_NONE) {//would be cancelling it, but check the second saber, too overrideJumpLeftAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkLeftMove; } @@ -4011,84 +4011,84 @@ saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int c overrideJumpLeftAttackMove = LS_NONE; } } - else if ( pm->ps->dualSabers - && pm->ps->saber[1].jumpAtkLeftMove != LS_INVALID ) + else if (pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkLeftMove != LS_INVALID) {//first saber not overridden, check second overrideJumpLeftAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkLeftMove; } - if ( rightmove > 0 ) + if (rightmove > 0) {//moving right - if ( !noSpecials + if (!noSpecials && overrideJumpRightAttackMove != LS_NONE - && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped + && (pm->ps->groundEntityNum != ENTITYNUM_NONE || level.time - pm->ps->lastOnGround <= 250) //on ground or just jumped && (pm->cmd.buttons&BUTTON_ATTACK)//hitting attack && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0//have force jump 1 at least - && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_LR )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_LR//have enough power - && (((pm->ps->clientNum>=MAX_CLIENTS&&!PM_ControlledByPlayer())&&pm->cmd.upmove > 0)//jumping NPC - ||((pm->ps->clientNumgent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/)) )//focus-holding player + && G_EnoughPowerForSpecialMove(pm->ps->forcePower, SABER_ALT_ATTACK_POWER_LR)//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_LR//have enough power + && (((pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) && pm->cmd.upmove > 0)//jumping NPC + || ((pm->ps->clientNumgent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/)))//focus-holding player {//cartwheel right - vec3_t right, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; - if ( pm->gent ) + vec3_t right, fwdAngles = { 0, pm->ps->viewangles[YAW], 0 }; + if (pm->gent) { - G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_LR ); + G_DrainPowerForSpecialMove(pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_LR); } pm->cmd.upmove = 0; - if ( overrideJumpRightAttackMove != LS_INVALID ) + if (overrideJumpRightAttackMove != LS_INVALID) {//overridden with another move return overrideJumpRightAttackMove; } - else if ( pm->ps->saberAnimLevel == SS_STAFF ) + else if (pm->ps->saberAnimLevel == SS_STAFF) { - AngleVectors( fwdAngles, NULL, right, NULL ); - pm->ps->velocity[0] = pm->ps->velocity[1] = 0; - VectorMA( pm->ps->velocity, 190, right, pm->ps->velocity ); + AngleVectors(fwdAngles, NULL, right, NULL); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA(pm->ps->velocity, 190, right, pm->ps->velocity); return LS_BUTTERFLY_RIGHT; } else { - if ( !(pm->ps->saber[0].saberFlags&SFL_NO_CARTWHEELS) - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_CARTWHEELS)) ) + if (!(pm->ps->saber[0].saberFlags&SFL_NO_CARTWHEELS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_CARTWHEELS))) {//okay to do cartwheels with this saber /* if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) {//still on ground - VectorClear( pm->ps->velocity ); - return LS_JUMPATTACK_CART_RIGHT; + VectorClear( pm->ps->velocity ); + return LS_JUMPATTACK_CART_RIGHT; } else */ {//in air - AngleVectors( fwdAngles, NULL, right, NULL ); - pm->ps->velocity[0] = pm->ps->velocity[1] = 0; - VectorMA( pm->ps->velocity, 190, right, pm->ps->velocity ); - PM_SetJumped( JUMP_VELOCITY, qtrue ); + AngleVectors(fwdAngles, NULL, right, NULL); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA(pm->ps->velocity, 190, right, pm->ps->velocity); + PM_SetJumped(JUMP_VELOCITY, qtrue); return LS_JUMPATTACK_ARIAL_RIGHT; } } } } - else if ( pm->ps->legsAnim != BOTH_CARTWHEEL_RIGHT - && pm->ps->legsAnim != BOTH_ARIAL_RIGHT ) + else if (pm->ps->legsAnim != BOTH_CARTWHEEL_RIGHT + && pm->ps->legsAnim != BOTH_ARIAL_RIGHT) {//not in a cartwheel/arial - if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + if (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) //PLAYER ONLY {//player - if ( G_TryingSpecial(pm->gent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/ )//Holding focus + if (G_TryingSpecial(pm->gent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/)//Holding focus {//if no special worked, do nothing return LS_NONE; } } //checked all special attacks, if we're in a parry, attack from that move - saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); - if ( parryAttackMove != LS_NONE ) + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry(curmove); + if (parryAttackMove != LS_NONE) { return parryAttackMove; } //check regular attacks - if ( forwardmove > 0 ) + if (forwardmove > 0) {//forward right = TL2BR slash return LS_A_TL2BR; } - else if ( forwardmove < 0 ) + else if (forwardmove < 0) {//backward right = BL2TR uppercut return LS_A_BL2TR; } @@ -4098,79 +4098,79 @@ saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int c } } } - else if ( rightmove < 0 ) + else if (rightmove < 0) {//moving left - if ( !noSpecials + if (!noSpecials && overrideJumpLeftAttackMove != LS_NONE - && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped + && (pm->ps->groundEntityNum != ENTITYNUM_NONE || level.time - pm->ps->lastOnGround <= 250) //on ground or just jumped && (pm->cmd.buttons&BUTTON_ATTACK)//hitting attack && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0//have force jump 1 at least - && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_LR )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_LR//have enough power - && (((pm->ps->clientNum>=MAX_CLIENTS&&!PM_ControlledByPlayer())&&pm->cmd.upmove > 0)//jumping NPC - ||((pm->ps->clientNumgent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/)) )//focus-holding player + && G_EnoughPowerForSpecialMove(pm->ps->forcePower, SABER_ALT_ATTACK_POWER_LR)//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_LR//have enough power + && (((pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) && pm->cmd.upmove > 0)//jumping NPC + || ((pm->ps->clientNumgent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/)))//focus-holding player {//cartwheel left - vec3_t right, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; - if ( pm->gent ) + vec3_t right, fwdAngles = { 0, pm->ps->viewangles[YAW], 0 }; + if (pm->gent) { - G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_LR ); + G_DrainPowerForSpecialMove(pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_LR); } pm->cmd.upmove = 0; - if ( overrideJumpRightAttackMove != LS_INVALID ) + if (overrideJumpRightAttackMove != LS_INVALID) {//overridden with another move return overrideJumpRightAttackMove; } - else if ( pm->ps->saberAnimLevel == SS_STAFF ) + else if (pm->ps->saberAnimLevel == SS_STAFF) { - AngleVectors( fwdAngles, NULL, right, NULL ); - pm->ps->velocity[0] = pm->ps->velocity[1] = 0; - VectorMA( pm->ps->velocity, -190, right, pm->ps->velocity ); + AngleVectors(fwdAngles, NULL, right, NULL); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA(pm->ps->velocity, -190, right, pm->ps->velocity); return LS_BUTTERFLY_LEFT; } else { - if ( !(pm->ps->saber[0].saberFlags&SFL_NO_CARTWHEELS) - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_CARTWHEELS)) ) + if (!(pm->ps->saber[0].saberFlags&SFL_NO_CARTWHEELS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_CARTWHEELS))) {//okay to do cartwheels with this saber /* if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) {//still on ground - VectorClear( pm->ps->velocity ); - return LS_JUMPATTACK_ARIAL_LEFT; + VectorClear( pm->ps->velocity ); + return LS_JUMPATTACK_ARIAL_LEFT; } else */ { - AngleVectors( fwdAngles, NULL, right, NULL ); - pm->ps->velocity[0] = pm->ps->velocity[1] = 0; - VectorMA( pm->ps->velocity, -190, right, pm->ps->velocity ); - PM_SetJumped( JUMP_VELOCITY, qtrue ); + AngleVectors(fwdAngles, NULL, right, NULL); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA(pm->ps->velocity, -190, right, pm->ps->velocity); + PM_SetJumped(JUMP_VELOCITY, qtrue); return LS_JUMPATTACK_CART_LEFT; } } } } - else if ( pm->ps->legsAnim != BOTH_CARTWHEEL_LEFT - && pm->ps->legsAnim != BOTH_ARIAL_LEFT ) + else if (pm->ps->legsAnim != BOTH_CARTWHEEL_LEFT + && pm->ps->legsAnim != BOTH_ARIAL_LEFT) {//not in a left cartwheel/arial - if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + if (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) //PLAYER ONLY {//player - if ( G_TryingSpecial(pm->gent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/ )//Holding focus + if (G_TryingSpecial(pm->gent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/)//Holding focus {//if no special worked, do nothing return LS_NONE; } } //checked all special attacks, if we're in a parry, attack from that move - saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); - if ( parryAttackMove != LS_NONE ) + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry(curmove); + if (parryAttackMove != LS_NONE) { return parryAttackMove; } //check regular attacks - if ( forwardmove > 0 ) + if (forwardmove > 0) {//forward left = TR2BL slash return LS_A_TR2BL; } - else if ( forwardmove < 0 ) + else if (forwardmove < 0) {//backward left = BR2TL uppercut return LS_A_BR2TL; } @@ -4182,163 +4182,163 @@ saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int c } else {//not moving left or right - if ( forwardmove > 0 ) + if (forwardmove > 0) {//forward= T2B slash - saberMoveName_t stabDownMove = noSpecials?LS_NONE:PM_CheckStabDown(); - if ( stabDownMove != LS_NONE ) + saberMoveName_t stabDownMove = noSpecials ? LS_NONE : PM_CheckStabDown(); + if (stabDownMove != LS_NONE) { return stabDownMove; } - if ( ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) )//player in third person, not zoomed in + if (((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode))//player in third person, not zoomed in {//player in thirdperson, not zoomed in //flip-over attack logic - if ( !noSpecials && PM_CheckFlipOverAttackMove( qfalse ) ) + if (!noSpecials && PM_CheckFlipOverAttackMove(qfalse)) {//flip over-forward down-attack return PM_SaberFlipOverAttackMove(); } //lunge attack logic - else if ( PM_CheckLungeAttackMove() ) + else if (PM_CheckLungeAttackMove()) { - return PM_SaberLungeAttackMove( qtrue ); + return PM_SaberLungeAttackMove(qtrue); } //jump forward attack logic - else if ( !noSpecials && PM_CheckJumpForwardAttackMove() ) + else if (!noSpecials && PM_CheckJumpForwardAttackMove()) { return PM_SaberJumpForwardAttackMove(); } } //player NPC with enemy: autoMove logic - if ( pm->gent - && pm->gent->enemy - && pm->gent->enemy->client ) + if (pm->gent + && pm->gent->enemy + && pm->gent->enemy->client) {//I have an active enemy - if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) + if (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) {//a player who is running at an enemy //if the enemy is not a jedi, don't use top-down, pick a diagonal or side attack - if ( pm->gent->enemy->s.weapon != WP_SABER + if (pm->gent->enemy->s.weapon != WP_SABER && pm->gent->enemy->client->NPC_class != CLASS_REMOTE//too small to do auto-aiming accurately && pm->gent->enemy->client->NPC_class != CLASS_SEEKER//too small to do auto-aiming accurately && pm->gent->enemy->client->NPC_class != CLASS_GONK//too short to do auto-aiming accurately && pm->gent->enemy->client->NPC_class != CLASS_HOWLER//too short to do auto-aiming accurately - && g_saberAutoAim->integer ) + && g_saberAutoAim->integer) { - saberMoveName_t autoMove = PM_AttackForEnemyPos( qfalse, (qboolean)(pm->ps->clientNum>=MAX_CLIENTS&&!PM_ControlledByPlayer()) ); - if ( autoMove != LS_INVALID ) + saberMoveName_t autoMove = PM_AttackForEnemyPos(qfalse, (qboolean)(pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer())); + if (autoMove != LS_INVALID) { return autoMove; } } } - if ( pm->ps->clientNum>=MAX_CLIENTS && !PM_ControlledByPlayer() ) //NPC ONLY + if (pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer()) //NPC ONLY {//NPC - if ( PM_CheckFlipOverAttackMove( qtrue ) ) + if (PM_CheckFlipOverAttackMove(qtrue)) { return PM_SaberFlipOverAttackMove(); } } } - + //Regular NPCs - if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) //NPC ONLY + if (pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer()) //NPC ONLY {//NPC or player in third person, not zoomed in //fwd jump attack logic - if ( PM_CheckJumpForwardAttackMove() ) + if (PM_CheckJumpForwardAttackMove()) { return PM_SaberJumpForwardAttackMove(); } //lunge attack logic - else if ( PM_CheckLungeAttackMove() ) + else if (PM_CheckLungeAttackMove()) { - return PM_SaberLungeAttackMove( qtrue ); + return PM_SaberLungeAttackMove(qtrue); } } - if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + if (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) //PLAYER ONLY {//player - if ( G_TryingSpecial(pm->gent,&pm->cmd) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + if (G_TryingSpecial(pm->gent, &pm->cmd))//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus {//if no special worked, do nothing return LS_NONE; } } - + //checked all special attacks, if we're in a parry, attack from that move - saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); - if ( parryAttackMove != LS_NONE ) + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry(curmove); + if (parryAttackMove != LS_NONE) { return parryAttackMove; } //check regular attacks return LS_A_T2B; } - else if ( forwardmove < 0 ) + else if (forwardmove < 0) {//backward= T2B slash//B2T uppercut? - if ( g_saberNewControlScheme->integer ) + if (g_saberNewControlScheme->integer) { saberMoveName_t pullAtk = PM_CheckPullAttack(); - if ( pullAtk != LS_NONE ) + if (pullAtk != LS_NONE) { return pullAtk; } } - - if ( g_saberNewControlScheme->integer + + if (g_saberNewControlScheme->integer && (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) //PLAYER ONLY - && (pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus, trying special backwards attacks + && (pm->cmd.buttons&BUTTON_FORCE_FOCUS))//Holding focus, trying special backwards attacks {//player lunge attack logic - if ( ( pm->ps->dualSabers //or dual - || pm->ps->saberAnimLevel == SS_STAFF )//pm->ps->SaberStaff() )//or staff - && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB )/*pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB*/ )//have enough force power to pull it off + if ((pm->ps->dualSabers //or dual + || pm->ps->saberAnimLevel == SS_STAFF)//pm->ps->SaberStaff() )//or staff + && G_EnoughPowerForSpecialMove(pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB)/*pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB*/)//have enough force power to pull it off {//alt+back+attack using fast, dual or staff attacks - PM_SaberLungeAttackMove( qfalse ); + PM_SaberLungeAttackMove(qfalse); } } - else if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) //NPC - || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) )//player in third person, not zooomed + else if ((pm->ps->clientNum&&!PM_ControlledByPlayer()) //NPC + || ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode))//player in third person, not zooomed {//NPC or player in third person, not zoomed - if ( PM_CheckBackflipAttackMove() ) + if (PM_CheckBackflipAttackMove()) { return PM_SaberBackflipAttackMove();//backflip attack } - if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + if (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) //PLAYER ONLY {//player - if ( G_TryingSpecial(pm->gent,&pm->cmd) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + if (G_TryingSpecial(pm->gent, &pm->cmd))//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus {//if no special worked, do nothing return LS_NONE; } } //if ( !PM_InKnockDown( pm->ps ) ) //check backstabs - if ( !(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK)) ) + if (!(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK))) {//okay to do backstabs with this saber - if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + if (pm->ps->groundEntityNum != ENTITYNUM_NONE) {//only when on ground - if ( pm->gent && pm->gent->enemy ) + if (pm->gent && pm->gent->enemy) {//FIXME: or just trace for a valid enemy standing behind me? And no enemy in front? - vec3_t enemyDir, faceFwd, facingAngles = {0, pm->ps->viewangles[YAW], 0}; - AngleVectors( facingAngles, faceFwd, NULL, NULL ); - VectorSubtract( pm->gent->enemy->currentOrigin, pm->ps->origin, enemyDir ); - float dot = DotProduct( enemyDir, faceFwd ); - if ( dot < 0 ) + vec3_t enemyDir, faceFwd, facingAngles = { 0, pm->ps->viewangles[YAW], 0 }; + AngleVectors(facingAngles, faceFwd, NULL, NULL); + VectorSubtract(pm->gent->enemy->currentOrigin, pm->ps->origin, enemyDir); + float dot = DotProduct(enemyDir, faceFwd); + if (dot < 0) {//enemy is behind me - if ( dot < -0.75f - && DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ) < 16384//128 squared - && (pm->ps->saberAnimLevel == SS_FAST || pm->ps->saberAnimLevel == SS_STAFF || (pm->gent->client &&(pm->gent->client->NPC_class == CLASS_TAVION||pm->gent->client->NPC_class == CLASS_ALORA)&&Q_irand(0,1))) ) + if (dot < -0.75f + && DistanceSquared(pm->gent->currentOrigin, pm->gent->enemy->currentOrigin) < 16384//128 squared + && (pm->ps->saberAnimLevel == SS_FAST || pm->ps->saberAnimLevel == SS_STAFF || (pm->gent->client && (pm->gent->client->NPC_class == CLASS_TAVION || pm->gent->client->NPC_class == CLASS_ALORA) && Q_irand(0, 1)))) {//fast attacks and Tavion - if ( !(pm->ps->pm_flags&PMF_DUCKED) && pm->cmd.upmove >= 0 ) + if (!(pm->ps->pm_flags&PMF_DUCKED) && pm->cmd.upmove >= 0) {//can't do it while ducked? - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || (pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG) ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) || (pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG)) {//only fencers and above can do this return LS_A_BACKSTAB; } } } - else if ( pm->ps->saberAnimLevel != SS_FAST - && pm->ps->saberAnimLevel != SS_STAFF ) + else if (pm->ps->saberAnimLevel != SS_FAST + && pm->ps->saberAnimLevel != SS_STAFF) {//medium and higher attacks - if ( (pm->ps->pm_flags&PMF_DUCKED) || pm->cmd.upmove < 0 ) + if ((pm->ps->pm_flags&PMF_DUCKED) || pm->cmd.upmove < 0) { return LS_A_BACK_CR; } @@ -4350,30 +4350,30 @@ saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int c } else {//enemy in front - float enemyDistSq = DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ); - if ( ((pm->ps->saberAnimLevel == FORCE_LEVEL_1 || - pm->ps->saberAnimLevel == SS_STAFF || - pm->gent->client->NPC_class == CLASS_TAVION || - pm->gent->client->NPC_class == CLASS_ALORA || - (pm->gent->client->NPC_class == CLASS_DESANN && !Q_irand(0,3))) && + float enemyDistSq = DistanceSquared(pm->gent->currentOrigin, pm->gent->enemy->currentOrigin); + if (((pm->ps->saberAnimLevel == FORCE_LEVEL_1 || + pm->ps->saberAnimLevel == SS_STAFF || + pm->gent->client->NPC_class == CLASS_TAVION || + pm->gent->client->NPC_class == CLASS_ALORA || + (pm->gent->client->NPC_class == CLASS_DESANN && !Q_irand(0, 3))) && enemyDistSq > 16384) || - pm->gent->enemy->health <= 0 )//128 squared + pm->gent->enemy->health <= 0)//128 squared {//my enemy is pretty far in front of me and I'm using fast attacks - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || - ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) || + (pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand(0, pm->gent->NPC->rank) > RANK_ENSIGN)) {//only fencers and higher can do this, higher rank does it more - if ( PM_CheckEnemyInBack( 128 ) ) + if (PM_CheckEnemyInBack(128)) { return PM_PickBackStab(); } } } - else if ( ((pm->ps->saberAnimLevel >= FORCE_LEVEL_2 || pm->gent->client->NPC_class == CLASS_DESANN) && enemyDistSq > 40000) || pm->gent->enemy->health <= 0 )//200 squared + else if (((pm->ps->saberAnimLevel >= FORCE_LEVEL_2 || pm->gent->client->NPC_class == CLASS_DESANN) && enemyDistSq > 40000) || pm->gent->enemy->health <= 0)//200 squared {//enemy is very faw away and I'm using medium/strong attacks - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || - ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) || + (pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand(0, pm->gent->NPC->rank) > RANK_ENSIGN)) {//only fencers and higher can do this, higher rank does it more - if ( PM_CheckEnemyInBack( 164 ) ) + if (PM_CheckEnemyInBack(164)) { return PM_PickBackStab(); } @@ -4383,9 +4383,9 @@ saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int c } else {//no current enemy - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->gent && pm->gent->client ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && pm->gent && pm->gent->client) {//only player - if ( PM_CheckEnemyInBack( 128 ) ) + if (PM_CheckEnemyInBack(128)) { return PM_PickBackStab(); } @@ -4395,17 +4395,17 @@ saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int c } } - if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + if (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) //PLAYER ONLY {//player - if ( G_TryingSpecial( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + if (G_TryingSpecial(pm->gent, &pm->cmd))//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus {//if no special worked, do nothing return LS_NONE; } } - + //checked all special attacks, if we're in a parry, attack from that move - saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); - if ( parryAttackMove != LS_NONE ) + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry(curmove); + if (parryAttackMove != LS_NONE) { return parryAttackMove; } @@ -4415,25 +4415,25 @@ saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int c } else {//not moving in any direction - if ( PM_SaberInBounce( curmove ) ) + if (PM_SaberInBounce(curmove)) {//bounces should go to their default attack if you don't specify a direction but are attacking - if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + if (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) //PLAYER ONLY {//player - if ( G_TryingSpecial(pm->gent,&pm->cmd) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + if (G_TryingSpecial(pm->gent, &pm->cmd))//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus {//if no special worked, do nothing return LS_NONE; } } saberMoveName_t newmove; - if ( pm->ps->clientNum && !PM_ControlledByPlayer() && Q_irand( 0, 3 ) ) + if (pm->ps->clientNum && !PM_ControlledByPlayer() && Q_irand(0, 3)) {//use NPC random - newmove = PM_NPCSaberAttackFromQuad( saberMoveData[curmove].endQuad ); + newmove = PM_NPCSaberAttackFromQuad(saberMoveData[curmove].endQuad); } else {//player uses chain-attack newmove = saberMoveData[curmove].chain_attack; } - if ( PM_SaberKataDone( curmove, newmove ) ) + if (PM_SaberKataDone(curmove, newmove)) { return saberMoveData[curmove].chain_idle; } @@ -4442,33 +4442,33 @@ saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int c return newmove; } } - else if ( PM_SaberInKnockaway( curmove ) ) + else if (PM_SaberInKnockaway(curmove)) {//bounces should go to their default attack if you don't specify a direction but are attacking - if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + if (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) //PLAYER ONLY {//player - if ( G_TryingSpecial( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + if (G_TryingSpecial(pm->gent, &pm->cmd))//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus {//if no special worked, do nothing return LS_NONE; } } saberMoveName_t newmove; - if ( pm->ps->clientNum && !PM_ControlledByPlayer() && Q_irand( 0, 3 ) ) + if (pm->ps->clientNum && !PM_ControlledByPlayer() && Q_irand(0, 3)) {//use NPC random - newmove = PM_NPCSaberAttackFromQuad( saberMoveData[curmove].endQuad ); + newmove = PM_NPCSaberAttackFromQuad(saberMoveData[curmove].endQuad); } else { - if ( pm->ps->saberAnimLevel == SS_FAST || - pm->ps->saberAnimLevel == SS_TAVION ) + if (pm->ps->saberAnimLevel == SS_FAST || + pm->ps->saberAnimLevel == SS_TAVION) {//player is in fast attacks, so come right back down from the same spot - newmove = PM_AttackMoveForQuad( saberMoveData[curmove].endQuad ); + newmove = PM_AttackMoveForQuad(saberMoveData[curmove].endQuad); } else {//use a transition to wrap to another attack from a different dir newmove = saberMoveData[curmove].chain_attack; } } - if ( PM_SaberKataDone( curmove, newmove ) ) + if (PM_SaberKataDone(curmove, newmove)) { return saberMoveData[curmove].chain_idle; } @@ -4477,56 +4477,56 @@ saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int c return newmove; } } - else if ( curmove == LS_READY - || curmove == LS_A_FLIP_STAB + else if (curmove == LS_READY + || curmove == LS_A_FLIP_STAB || curmove == LS_A_FLIP_SLASH - || ( curmove >= LS_PARRY_UP - && curmove <= LS_REFLECT_LL ) ) + || (curmove >= LS_PARRY_UP + && curmove <= LS_REFLECT_LL)) {//Not moving at all, not too busy to attack //push + lookdown + attack + dual sabers = LS_DUAL_SPIN_PROTECT - if ( g_saberNewControlScheme->integer ) + if (g_saberNewControlScheme->integer) { - if ( PM_CheckDualSpinProtect() ) + if (PM_CheckDualSpinProtect()) { return LS_DUAL_SPIN_PROTECT; } - if ( PM_CheckStaffKata() ) + if (PM_CheckStaffKata()) { return LS_STAFF_SOULCAL; } } - if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + if (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) //PLAYER ONLY {//player - if ( G_TryingSpecial( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + if (G_TryingSpecial(pm->gent, &pm->cmd))//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus {//if no special worked, do nothing return LS_NONE; } } //checked all special attacks, if we're in a parry, attack from that move - saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); - if ( parryAttackMove != LS_NONE ) + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry(curmove); + if (parryAttackMove != LS_NONE) { return parryAttackMove; } //check regular attacks - if ( pm->ps->clientNum || g_saberAutoAim->integer ) + if (pm->ps->clientNum || g_saberAutoAim->integer) {//auto-aim - if ( pm->gent && pm->gent->enemy ) + if (pm->gent && pm->gent->enemy) {//based on enemy position, pick a proper attack - saberMoveName_t autoMove = PM_AttackForEnemyPos( qtrue, (qboolean)(pm->ps->clientNum>=MAX_CLIENTS) ); - if ( autoMove != LS_INVALID ) + saberMoveName_t autoMove = PM_AttackForEnemyPos(qtrue, (qboolean)(pm->ps->clientNum >= MAX_CLIENTS)); + if (autoMove != LS_INVALID) { return autoMove; } } - else if ( fabs(pm->ps->viewangles[0]) > 30 ) + else if (fabs(pm->ps->viewangles[0]) > 30) {//looking far up or far down uses the top to bottom attack, presuming you want a vertical attack return LS_A_T2B; } } else {//for now, just pick a random attack - return ((saberMoveName_t)Q_irand( LS_A_TL2BR, LS_A_T2B )); + return ((saberMoveName_t)Q_irand(LS_A_TL2BR, LS_A_T2B)); } } } @@ -4535,13 +4535,13 @@ saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int c return LS_NONE; } -saberMoveName_t PM_SaberAnimTransitionMove( saberMoveName_t curmove, saberMoveName_t newmove ) +saberMoveName_t PM_SaberAnimTransitionMove(saberMoveName_t curmove, saberMoveName_t newmove) { //FIXME: take FP_SABER_OFFENSE into account here somehow? int retmove = newmove; - if ( curmove == LS_READY ) + if (curmove == LS_READY) {//just standing there - switch ( newmove ) + switch (newmove) { case LS_A_TL2BR: case LS_A_L2R: @@ -4551,7 +4551,7 @@ saberMoveName_t PM_SaberAnimTransitionMove( saberMoveName_t curmove, saberMoveNa case LS_A_TR2BL: case LS_A_T2B: //transition is the start - retmove = LS_S_TL2BR + (newmove-LS_A_TL2BR); + retmove = LS_S_TL2BR + (newmove - LS_A_TL2BR); break; default: break; @@ -4559,13 +4559,13 @@ saberMoveName_t PM_SaberAnimTransitionMove( saberMoveName_t curmove, saberMoveNa } else { - switch ( newmove ) + switch (newmove) { - //transitioning to ready pose + //transitioning to ready pose case LS_READY: - switch ( curmove ) + switch (curmove) { - //transitioning from an attack + //transitioning from an attack case LS_A_TL2BR: case LS_A_L2R: case LS_A_BL2TR: @@ -4574,13 +4574,13 @@ saberMoveName_t PM_SaberAnimTransitionMove( saberMoveName_t curmove, saberMoveNa case LS_A_TR2BL: case LS_A_T2B: //transition is the return - retmove = LS_R_TL2BR + (newmove-LS_A_TL2BR); + retmove = LS_R_TL2BR + (newmove - LS_A_TL2BR); break; default: break; } break; - //transitioning to an attack + //transitioning to an attack case LS_A_TL2BR: case LS_A_L2R: case LS_A_BL2TR: @@ -4588,29 +4588,29 @@ saberMoveName_t PM_SaberAnimTransitionMove( saberMoveName_t curmove, saberMoveNa case LS_A_R2L: case LS_A_TR2BL: case LS_A_T2B: - if ( newmove == curmove ) + if (newmove == curmove) {//FIXME: need a spin or something or go to next level, but for now, just play the return //going into another attack... //allow endless chaining in level 1 attacks, several in level 2 and only one or a few in level 3 //FIXME: don't let strong attacks chain to an attack in the opposite direction ( > 45 degrees?) - if ( PM_SaberKataDone( curmove, newmove ) ) + if (PM_SaberKataDone(curmove, newmove)) {//done with this kata, must return to ready before attack again - retmove = LS_R_TL2BR + (newmove-LS_A_TL2BR); + retmove = LS_R_TL2BR + (newmove - LS_A_TL2BR); } else {//okay to chain to another attack retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad]; } } - else if ( saberMoveData[curmove].endQuad == saberMoveData[newmove].startQuad ) + else if (saberMoveData[curmove].endQuad == saberMoveData[newmove].startQuad) {//new move starts from same quadrant retmove = newmove; } else { - switch ( curmove ) + switch (curmove) { - //transitioning from an attack + //transitioning from an attack case LS_A_TL2BR: case LS_A_L2R: case LS_A_BL2TR: @@ -4628,7 +4628,7 @@ saberMoveName_t PM_SaberAnimTransitionMove( saberMoveName_t curmove, saberMoveNa case LS_D1_B_: retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad]; break; - //transitioning from a return + //transitioning from a return case LS_R_TL2BR: case LS_R_L2R: case LS_R_BL2TR: @@ -4636,25 +4636,25 @@ saberMoveName_t PM_SaberAnimTransitionMove( saberMoveName_t curmove, saberMoveNa case LS_R_R2L: case LS_R_TR2BL: case LS_R_T2B: - //transitioning from a bounce - /* - case LS_BOUNCE_UL2LL: - case LS_BOUNCE_LL2UL: - case LS_BOUNCE_L2LL: - case LS_BOUNCE_L2UL: - case LS_BOUNCE_UR2LR: - case LS_BOUNCE_LR2UR: - case LS_BOUNCE_R2LR: - case LS_BOUNCE_R2UR: - case LS_BOUNCE_TOP: - case LS_OVER_UR2UL: - case LS_OVER_UL2UR: - case LS_BOUNCE_UR: - case LS_BOUNCE_UL: - case LS_BOUNCE_LR: - case LS_BOUNCE_LL: - */ - //transitioning from a parry/reflection/knockaway/broken parry + //transitioning from a bounce + /* + case LS_BOUNCE_UL2LL: + case LS_BOUNCE_LL2UL: + case LS_BOUNCE_L2LL: + case LS_BOUNCE_L2UL: + case LS_BOUNCE_UR2LR: + case LS_BOUNCE_LR2UR: + case LS_BOUNCE_R2LR: + case LS_BOUNCE_R2UR: + case LS_BOUNCE_TOP: + case LS_OVER_UR2UL: + case LS_OVER_UL2UR: + case LS_BOUNCE_UR: + case LS_BOUNCE_UL: + case LS_BOUNCE_LR: + case LS_BOUNCE_LL: + */ + //transitioning from a parry/reflection/knockaway/broken parry case LS_PARRY_UP: case LS_PARRY_UR: case LS_PARRY_UL: @@ -4685,19 +4685,19 @@ saberMoveName_t PM_SaberAnimTransitionMove( saberMoveName_t curmove, saberMoveNa case LS_H1_BL: retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad]; break; - //NB: transitioning from transitions is fine + //NB: transitioning from transitions is fine default: break; } } break; - //transitioning to any other anim is not supported + //transitioning to any other anim is not supported default: break; } } - if ( retmove == LS_NONE ) + if (retmove == LS_NONE) { return newmove; } @@ -4711,37 +4711,37 @@ PM_LegsAnimForFrame Returns animNumber for current frame ------------------------- */ -int PM_LegsAnimForFrame( gentity_t *ent, int legsFrame ) +int PM_LegsAnimForFrame(gentity_t *ent, int legsFrame) { //Must be a valid client - if ( ent->client == NULL ) + if (ent->client == NULL) return -1; //Must have a file index entry - if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) + if (ValidAnimFileIndex(ent->client->clientInfo.animFileIndex) == qfalse) return -1; animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; int glaIndex = gi.G2API_GetAnimIndex(&(ent->ghoul2[0])); - for ( int animation = 0; animation < BOTH_CIN_1; animation++ ) //first anim after last legs + for (int animation = 0; animation < BOTH_CIN_1; animation++) //first anim after last legs { - if ( animation >= TORSO_DROPWEAP1 && animation < LEGS_TURN1 ) //first legs only anim + if (animation >= TORSO_DROPWEAP1 && animation < LEGS_TURN1) //first legs only anim {//not a possible legs anim continue; } - if ( animations[animation].glaIndex != glaIndex ) + if (animations[animation].glaIndex != glaIndex) { continue; } - if ( animations[animation].firstFrame > legsFrame ) + if (animations[animation].firstFrame > legsFrame) {//This anim starts after this frame continue; } - if ( animations[animation].firstFrame + animations[animation].numFrames < legsFrame ) + if (animations[animation].firstFrame + animations[animation].numFrames < legsFrame) {//This anim ends before this frame continue; } @@ -4750,32 +4750,32 @@ int PM_LegsAnimForFrame( gentity_t *ent, int legsFrame ) } //Not in ANY torsoAnim? SHOULD NEVER HAPPEN -// assert(0); + // assert(0); return -1; } -int PM_ValidateAnimRange( const int startFrame, const int endFrame, const float animSpeed ) +int PM_ValidateAnimRange(const int startFrame, const int endFrame, const float animSpeed) {//given a startframe and endframe, see if that lines up with any known animation animation_t *animations = level.knownAnimFileSets[0].animations; - for ( int anim = 0; anim < MAX_ANIMATIONS; anim++ ) + for (int anim = 0; anim < MAX_ANIMATIONS; anim++) { - if ( animSpeed < 0 ) + if (animSpeed < 0) {//playing backwards - if ( animations[anim].firstFrame == endFrame ) - { - if ( animations[anim].numFrames + animations[anim].firstFrame == startFrame ) + if (animations[anim].firstFrame == endFrame) + { + if (animations[anim].numFrames + animations[anim].firstFrame == startFrame) { //Com_Printf( "valid reverse anim: %s\n", animTable[anim].name ); return anim; } - } + } } else {//playing forwards - if ( animations[anim].firstFrame == startFrame ) + if (animations[anim].firstFrame == startFrame) {//This anim starts on this frame - if ( animations[anim].firstFrame + animations[anim].numFrames == endFrame ) + if (animations[anim].firstFrame + animations[anim].numFrames == endFrame) {//This anim ends on this frame //Com_Printf( "valid forward anim: %s\n", animTable[anim].name ); return anim; @@ -4786,7 +4786,7 @@ int PM_ValidateAnimRange( const int startFrame, const int endFrame, const float } //Not in ANY anim? SHOULD NEVER HAPPEN - Com_Printf( "invalid anim range %d to %d, speed %4.2f\n", startFrame, endFrame, animSpeed ); + Com_Printf("invalid anim range %d to %d, speed %4.2f\n", startFrame, endFrame, animSpeed); return -1; } /* @@ -4795,32 +4795,32 @@ PM_TorsoAnimForFrame Returns animNumber for current frame ------------------------- */ -int PM_TorsoAnimForFrame( gentity_t *ent, int torsoFrame ) +int PM_TorsoAnimForFrame(gentity_t *ent, int torsoFrame) { //Must be a valid client - if ( ent->client == NULL ) + if (ent->client == NULL) return -1; //Must have a file index entry - if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) + if (ValidAnimFileIndex(ent->client->clientInfo.animFileIndex) == qfalse) return -1; animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; int glaIndex = gi.G2API_GetAnimIndex(&(ent->ghoul2[0])); - for ( int animation = 0; animation < LEGS_TURN1; animation++ ) //first legs only anim + for (int animation = 0; animation < LEGS_TURN1; animation++) //first legs only anim { - if ( animations[animation].glaIndex != glaIndex ) + if (animations[animation].glaIndex != glaIndex) { continue; } - if ( animations[animation].firstFrame > torsoFrame ) + if (animations[animation].firstFrame > torsoFrame) {//This anim starts after this frame continue; } - if ( animations[animation].firstFrame + animations[animation].numFrames < torsoFrame ) + if (animations[animation].firstFrame + animations[animation].numFrames < torsoFrame) {//This anim ends before this frame continue; } @@ -4829,27 +4829,27 @@ int PM_TorsoAnimForFrame( gentity_t *ent, int torsoFrame ) } //Not in ANY torsoAnim? SHOULD NEVER HAPPEN -// assert(0); + // assert(0); return -1; } -qboolean PM_FinishedCurrentLegsAnim( gentity_t *self ) +qboolean PM_FinishedCurrentLegsAnim(gentity_t *self) { int junk, curFrame; float currentFrame, animSpeed; - if ( !self->client ) + if (!self->client) { return qtrue; } - gi.G2API_GetBoneAnimIndex( &self->ghoul2[self->playerModel], self->rootBone, (cg.time?cg.time:level.time), ¤tFrame, &junk, &junk, &junk, &animSpeed, NULL ); - curFrame = floor( currentFrame ); + gi.G2API_GetBoneAnimIndex(&self->ghoul2[self->playerModel], self->rootBone, (cg.time ? cg.time : level.time), ¤tFrame, &junk, &junk, &junk, &animSpeed, NULL); + curFrame = floor(currentFrame); - int legsAnim = self->client->ps.legsAnim; - animation_t *animations = level.knownAnimFileSets[self->client->clientInfo.animFileIndex].animations; + int legsAnim = self->client->ps.legsAnim; + animation_t *animations = level.knownAnimFileSets[self->client->clientInfo.animFileIndex].animations; - if ( curFrame >= animations[legsAnim].firstFrame + (animations[legsAnim].numFrames - 2) ) + if (curFrame >= animations[legsAnim].firstFrame + (animations[legsAnim].numFrames - 2)) { return qtrue; } @@ -4863,37 +4863,37 @@ PM_HasAnimation ------------------------- */ -qboolean PM_HasAnimation( gentity_t *ent, int animation ) +qboolean PM_HasAnimation(gentity_t *ent, int animation) { //Must be a valid client - if ( !ent || ent->client == NULL ) + if (!ent || ent->client == NULL) return qfalse; //must be a valid anim number - if ( animation < 0 || animation >= MAX_ANIMATIONS ) + if (animation < 0 || animation >= MAX_ANIMATIONS) { return qfalse; } //Must have a file index entry - if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) + if (ValidAnimFileIndex(ent->client->clientInfo.animFileIndex) == qfalse) return qfalse; animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; //No frames, no anim - if ( animations[animation].numFrames == 0 ) + if (animations[animation].numFrames == 0) return qfalse; //Has the sequence return qtrue; } -int PM_PickAnim( gentity_t *self, int minAnim, int maxAnim ) +int PM_PickAnim(gentity_t *self, int minAnim, int maxAnim) { int anim; int count = 0; - if ( !self ) + if (!self) { return Q_irand(minAnim, maxAnim); } @@ -4902,8 +4902,7 @@ int PM_PickAnim( gentity_t *self, int minAnim, int maxAnim ) { anim = Q_irand(minAnim, maxAnim); count++; - } - while ( !PM_HasAnimation( self, anim ) && count < 1000 ); + } while (!PM_HasAnimation(self, anim) && count < 1000); return anim; } @@ -4914,9 +4913,9 @@ PM_AnimLength ------------------------- */ -int PM_AnimLength( int index, animNumber_t anim ) +int PM_AnimLength(int index, animNumber_t anim) { - if ( ValidAnimFileIndex( index ) == false ) + if (ValidAnimFileIndex(index) == false) return 0; return level.knownAnimFileSets[index].animations[anim].numFrames * abs(level.knownAnimFileSets[index].animations[anim].frameLerp); @@ -4928,27 +4927,27 @@ PM_SetLegsAnimTimer ------------------------- */ -void PM_SetLegsAnimTimer( gentity_t *ent, int *legsAnimTimer, int time ) +void PM_SetLegsAnimTimer(gentity_t *ent, int *legsAnimTimer, int time) { *legsAnimTimer = time; - if ( *legsAnimTimer < 0 && time != -1 ) + if (*legsAnimTimer < 0 && time != -1) {//Cap timer to 0 if was counting down, but let it be -1 if that was intentional *legsAnimTimer = 0; } - if ( !*legsAnimTimer && ent && Q3_TaskIDPending( ent, TID_ANIM_LOWER ) ) + if (!*legsAnimTimer && ent && Q3_TaskIDPending(ent, TID_ANIM_LOWER)) {//Waiting for legsAnimTimer to complete, and it just got set to zero - if ( !Q3_TaskIDPending( ent, TID_ANIM_BOTH) ) + if (!Q3_TaskIDPending(ent, TID_ANIM_BOTH)) {//Not waiting for top - Q3_TaskIDComplete( ent, TID_ANIM_LOWER ); + Q3_TaskIDComplete(ent, TID_ANIM_LOWER); } - else + else {//Waiting for both to finish before complete - Q3_TaskIDClear( &ent->taskID[TID_ANIM_LOWER] );//Bottom is done, regardless - if ( !Q3_TaskIDPending( ent, TID_ANIM_UPPER) ) + Q3_TaskIDClear(&ent->taskID[TID_ANIM_LOWER]);//Bottom is done, regardless + if (!Q3_TaskIDPending(ent, TID_ANIM_UPPER)) {//top is done and we're done - Q3_TaskIDComplete( ent, TID_ANIM_BOTH ); + Q3_TaskIDComplete(ent, TID_ANIM_BOTH); } } } @@ -4960,44 +4959,44 @@ PM_SetTorsoAnimTimer ------------------------- */ -void PM_SetTorsoAnimTimer( gentity_t *ent, int *torsoAnimTimer, int time ) +void PM_SetTorsoAnimTimer(gentity_t *ent, int *torsoAnimTimer, int time) { *torsoAnimTimer = time; - if ( *torsoAnimTimer < 0 && time != -1 ) + if (*torsoAnimTimer < 0 && time != -1) {//Cap timer to 0 if was counting down, but let it be -1 if that was intentional *torsoAnimTimer = 0; } - if ( !*torsoAnimTimer && ent && Q3_TaskIDPending( ent, TID_ANIM_UPPER ) ) + if (!*torsoAnimTimer && ent && Q3_TaskIDPending(ent, TID_ANIM_UPPER)) {//Waiting for torsoAnimTimer to complete, and it just got set to zero - if ( !Q3_TaskIDPending( ent, TID_ANIM_BOTH) ) + if (!Q3_TaskIDPending(ent, TID_ANIM_BOTH)) {//Not waiting for bottom - Q3_TaskIDComplete( ent, TID_ANIM_UPPER ); + Q3_TaskIDComplete(ent, TID_ANIM_UPPER); } - else + else {//Waiting for both to finish before complete - Q3_TaskIDClear( &ent->taskID[TID_ANIM_UPPER] );//Top is done, regardless - if ( !Q3_TaskIDPending( ent, TID_ANIM_LOWER) ) + Q3_TaskIDClear(&ent->taskID[TID_ANIM_UPPER]);//Top is done, regardless + if (!Q3_TaskIDPending(ent, TID_ANIM_LOWER)) {//lower is done and we're done - Q3_TaskIDComplete( ent, TID_ANIM_BOTH ); + Q3_TaskIDComplete(ent, TID_ANIM_BOTH); } } } } -extern qboolean PM_SpinningSaberAnim( int anim ); +extern qboolean PM_SpinningSaberAnim(int anim); extern float saberAnimSpeedMod[NUM_FORCE_POWER_LEVELS]; void PM_SaberStartTransAnim(int saberAnimLevel, int anim, float *animSpeed, gentity_t *gent) { if (g_saberNewCombat->integer) //new code { - if ( anim == BOTH_V1_BL_S1 + if (anim == BOTH_V1_BL_S1 || anim == BOTH_V1_BR_S1 || anim == BOTH_V1_TL_S1 || anim == BOTH_V1_TR_S1 || anim == BOTH_V1_T__S1 - || (anim >= BOTH_V6_BL_S6 && anim <= BOTH_V7__R_S7) ) + || (anim >= BOTH_V6_BL_S6 && anim <= BOTH_V7__R_S7)) { //we're in a broken attack //speed up recovery from broken attacks based on SO level *animSpeed = saberAnimSpeedMod[gent->client->ps.forcePowerLevel[FP_SABER_OFFENSE]]; @@ -5038,43 +5037,43 @@ void PM_SaberStartTransAnim(int saberAnimLevel, int anim, float *animSpeed, gent } } } - if ( gent + if (gent && gent->client - && gent->client->ps.stats[STAT_WEAPONS]&(1<client->ps.dualSabers + && gent->client->ps.stats[STAT_WEAPONS] & (1 << WP_SCEPTER) + && gent->client->ps.dualSabers && saberAnimLevel == SS_DUAL - && gent->weaponModel[1] ) + && gent->weaponModel[1]) {//using a scepter and dual style, slow down anims - if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_H7_S7_BR ) + if (anim >= BOTH_A1_T__B_ && anim <= BOTH_H7_S7_BR) { *animSpeed *= 0.75; } } - if ( gent && gent->client && gent->client->ps.forceRageRecoveryTime > level.time ) + if (gent && gent->client && gent->client->ps.forceRageRecoveryTime > level.time) {//rage recovery - if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_H1_S1_BR ) + if (anim >= BOTH_A1_T__B_ && anim <= BOTH_H1_S1_BR) {//animate slower *animSpeed *= 0.75; } } - else if ( gent && gent->NPC && gent->NPC->rank == RANK_CIVILIAN ) + else if (gent && gent->NPC && gent->NPC->rank == RANK_CIVILIAN) {//grunt reborn - if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_R1_TR_S1 ) + if (anim >= BOTH_A1_T__B_ && anim <= BOTH_R1_TR_S1) {//his fast attacks are slower - if ( !PM_SpinningSaberAnim( anim ) ) + if (!PM_SpinningSaberAnim(anim)) { *animSpeed *= 0.75; } return; } } - else if ( gent && gent->client ) + else if (gent && gent->client) { - if ( gent->client->ps.saber[0].type == SABER_LANCE || gent->client->ps.saber[0].type == SABER_TRIDENT ) + if (gent->client->ps.saber[0].type == SABER_LANCE || gent->client->ps.saber[0].type == SABER_TRIDENT) {//FIXME: hack for now - these use the fast anims, but slowed down. Should have own style - if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_R1_TR_S1 ) + if (anim >= BOTH_A1_T__B_ && anim <= BOTH_R1_TR_S1) {//his fast attacks are slower - if ( !PM_SpinningSaberAnim( anim ) ) + if (!PM_SpinningSaberAnim(anim)) { *animSpeed *= 0.75; } @@ -5083,20 +5082,20 @@ void PM_SaberStartTransAnim(int saberAnimLevel, int anim, float *animSpeed, gent } } - if ( ( anim >= BOTH_T1_BR__R && - anim <= BOTH_T1_BL_TL ) || - ( anim >= BOTH_T3_BR__R && - anim <= BOTH_T3_BL_TL ) || - ( anim >= BOTH_T5_BR__R && - anim <= BOTH_T5_BL_TL ) ) + if ((anim >= BOTH_T1_BR__R && + anim <= BOTH_T1_BL_TL) || + (anim >= BOTH_T3_BR__R && + anim <= BOTH_T3_BL_TL) || + (anim >= BOTH_T5_BR__R && + anim <= BOTH_T5_BL_TL)) { //what is this doing here exactly? - if ( g_saberNewCombat->integer ) //new code + if (g_saberNewCombat->integer) //new code { if (saberAnimLevel == FORCE_LEVEL_1 /*|| saberAnimLevel == FORCE_LEVEL_5*/) {//FIXME: should not be necc for FORCE_LEVEL_1's *animSpeed *= 1.5; } - else if (saberAnimLevel == FORCE_LEVEL_5) + else if (saberAnimLevel == FORCE_LEVEL_5) { //both Desann and Strong styles suffer some transition speed penalty or something? *animSpeed *= 0.75; } @@ -5117,64 +5116,64 @@ void PM_SaberStartTransAnim(int saberAnimLevel, int anim, float *animSpeed, gent /* void PM_SaberStartTransAnim( int anim, int entNum, int saberOffenseLevel, float *animSpeed ) { - //check starts - if ( ( anim >= BOTH_S1_S1_T_ && - anim <= BOTH_S1_S1_TR ) || - ( anim >= BOTH_S1_S1_T_ && - anim <= BOTH_S1_S1_TR ) || - ( anim >= BOTH_S3_S1_T_ && - anim <= BOTH_S3_S1_TR ) ) - { - if ( entNum == 0 ) - { - *animSpeed *= saberAnimSpeedMod[FORCE_LEVEL_3]; - } - else - { - *animSpeed *= saberAnimSpeedMod[saberOffenseLevel]; - } - } - //Check transitions - else if ( PM_SpinningSaberAnim( anim ) ) - {//spins stay normal speed - return; - } - else if ( ( anim >= BOTH_T1_BR__R && - anim <= BOTH_T1_BL_TL ) || - ( anim >= BOTH_T2_BR__R && - anim <= BOTH_T2_BL_TL ) || - ( anim >= BOTH_T3_BR__R && - anim <= BOTH_T3_BL_TL ) ) - {//slow down the transitions - if ( entNum == 0 && saberOffenseLevel <= FORCE_LEVEL_2 ) - { - *animSpeed *= saberAnimSpeedMod[saberOffenseLevel]; - } - else - { - *animSpeed *= saberAnimSpeedMod[saberOffenseLevel]/2.0f; - } - } +//check starts +if ( ( anim >= BOTH_S1_S1_T_ && +anim <= BOTH_S1_S1_TR ) || +( anim >= BOTH_S1_S1_T_ && +anim <= BOTH_S1_S1_TR ) || +( anim >= BOTH_S3_S1_T_ && +anim <= BOTH_S3_S1_TR ) ) +{ +if ( entNum == 0 ) +{ +*animSpeed *= saberAnimSpeedMod[FORCE_LEVEL_3]; +} +else +{ +*animSpeed *= saberAnimSpeedMod[saberOffenseLevel]; +} +} +//Check transitions +else if ( PM_SpinningSaberAnim( anim ) ) +{//spins stay normal speed +return; +} +else if ( ( anim >= BOTH_T1_BR__R && +anim <= BOTH_T1_BL_TL ) || +( anim >= BOTH_T2_BR__R && +anim <= BOTH_T2_BL_TL ) || +( anim >= BOTH_T3_BR__R && +anim <= BOTH_T3_BL_TL ) ) +{//slow down the transitions +if ( entNum == 0 && saberOffenseLevel <= FORCE_LEVEL_2 ) +{ +*animSpeed *= saberAnimSpeedMod[saberOffenseLevel]; +} +else +{ +*animSpeed *= saberAnimSpeedMod[saberOffenseLevel]/2.0f; +} +} - return; +return; } */ extern qboolean player_locked; extern qboolean MatrixMode; -float PM_GetTimeScaleMod( gentity_t *gent ) +float PM_GetTimeScaleMod(gentity_t *gent) { - if ( g_timescale->value ) + if (g_timescale->value) { - if ( !MatrixMode + if (!MatrixMode && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_START && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_ATTACK - && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_LAND ) + && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_LAND) { - if ( gent && gent->s.clientNum == 0 && !player_locked && gent->client->ps.forcePowersActive&(1<s.clientNum == 0 && !player_locked && gent->client->ps.forcePowersActive&(1 << FP_SPEED)) { return (1.0 / g_timescale->value); } - else if ( gent && gent->client && gent->client->ps.forcePowersActive&(1<client && gent->client->ps.forcePowersActive&(1 << FP_SPEED)) { return (1.0 / g_timescale->value); } @@ -5183,13 +5182,13 @@ float PM_GetTimeScaleMod( gentity_t *gent ) return 1.0f; } -static inline qboolean PM_IsHumanoid( CGhoul2Info *ghlInfo ) +static inline qboolean PM_IsHumanoid(CGhoul2Info *ghlInfo) { char *GLAName; - GLAName = gi.G2API_GetGLAName( ghlInfo ); + GLAName = gi.G2API_GetGLAName(ghlInfo); assert(GLAName); - if ( !Q_stricmp( "models/players/_humanoid/_humanoid", GLAName ) ) + if (!Q_stricmp("models/players/_humanoid/_humanoid", GLAName)) { return qtrue; } @@ -5203,14 +5202,14 @@ PM_SetAnimFinal ------------------------- */ #define G2_DEBUG_TIMING (0) -void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, - int setAnimParts,int anim,int setAnimFlags, - int *torsoAnimTimer,int *legsAnimTimer, - gentity_t *gent,int blendTime) // default blendTime=350 +void PM_SetAnimFinal(int *torsoAnim, int *legsAnim, + int setAnimParts, int anim, int setAnimFlags, + int *torsoAnimTimer, int *legsAnimTimer, + gentity_t *gent, int blendTime) // default blendTime=350 { -// BASIC SETUP AND SAFETY CHECKING -//================================= + // BASIC SETUP AND SAFETY CHECKING + //================================= // If It Is A Busted Entity, Don't Do Anything Here. //--------------------------------------------------- @@ -5221,12 +5220,12 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, // Make Sure This Character Has Such An Anim And A Model //------------------------------------------------------- - if (anim<0 || anim>=MAX_ANIMATIONS || !ValidAnimFileIndex(gent->client->clientInfo.animFileIndex)) + if (anim<0 || anim >= MAX_ANIMATIONS || !ValidAnimFileIndex(gent->client->clientInfo.animFileIndex)) { - #ifndef FINAL_BUILD - if (g_AnimWarning->integer) +#ifndef FINAL_BUILD + if (g_AnimWarning->integer) { - if (anim<0 || anim>=MAX_ANIMATIONS) + if (anim<0 || anim >= MAX_ANIMATIONS) { gi.Printf(S_COLOR_RED"PM_SetAnimFinal: Invalid Anim Index (%d)!\n", anim); } @@ -5235,37 +5234,37 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, gi.Printf(S_COLOR_RED"PM_SetAnimFinal: Invalid Anim File Index (%d)!\n", gent->client->clientInfo.animFileIndex); } } - #endif +#endif return; } // Get Global Time Properties //---------------------------- - float timeScaleMod = PM_GetTimeScaleMod( gent ); - const int actualTime = (cg.time?cg.time:level.time); - const animation_t* animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; - const animation_t& curAnim = animations[anim]; + float timeScaleMod = PM_GetTimeScaleMod(gent); + const int actualTime = (cg.time ? cg.time : level.time); + const animation_t* animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; + const animation_t& curAnim = animations[anim]; // Make Sure This Character Has Such An Anim And A Model //------------------------------------------------------- - if (animations[anim].numFrames==0) + if (animations[anim].numFrames == 0) { - #ifndef FINAL_BUILD - static int LastAnimWarningNum=0; - if (LastAnimWarningNum!=anim) +#ifndef FINAL_BUILD + static int LastAnimWarningNum = 0; + if (LastAnimWarningNum != anim) { - if ((cg_debugAnim.integer==3) || // 3 = do everyone - (cg_debugAnim.integer==1 && gent->s.number==0) || // 1 = only the player - (cg_debugAnim.integer==2 && gent->s.number!=0) || // 2 = only everyone else - (cg_debugAnim.integer==4 && gent->s.number!=cg_debugAnimTarget.integer) // 4 = specific entnum - ) + if ((cg_debugAnim.integer == 3) || // 3 = do everyone + (cg_debugAnim.integer == 1 && gent->s.number == 0) || // 1 = only the player + (cg_debugAnim.integer == 2 && gent->s.number != 0) || // 2 = only everyone else + (cg_debugAnim.integer == 4 && gent->s.number != cg_debugAnimTarget.integer) // 4 = specific entnum + ) { - gi.Printf(S_COLOR_RED"PM_SetAnimFinal: Anim %s does not exist in this model (%s)!\n", animTable[anim].name, gent->NPC_type ); + gi.Printf(S_COLOR_RED"PM_SetAnimFinal: Anim %s does not exist in this model (%s)!\n", animTable[anim].name, gent->NPC_type); } } LastAnimWarningNum = anim; - #endif +#endif return; } @@ -5287,26 +5286,26 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, // Lower Offensive Skill Slows Down The Saber Start Attack Animations //-------------------------------------------------------------------- - PM_SaberStartTransAnim( gent->client->ps.saberAnimLevel, anim, &timeScaleMod, gent ); - - - -// SETUP VALUES FOR INCOMMING ANIMATION -//====================================== - const bool animFootMove = (PM_WalkingAnim(anim) || PM_RunningAnim(anim) || anim==BOTH_CROUCH1WALK || anim==BOTH_CROUCH1WALKBACK); - const bool animHoldless = (setAnimFlags&SETANIM_FLAG_HOLDLESS)!=0; - const bool animHold = (setAnimFlags&SETANIM_FLAG_HOLD)!=0; - const bool animRestart = (setAnimFlags&SETANIM_FLAG_RESTART)!=0; - const bool animOverride = (setAnimFlags&SETANIM_FLAG_OVERRIDE)!=0; - const bool animSync = (g_synchSplitAnims->integer!=0 && !animRestart); - float animCurrent = (-1.0f); - float animSpeed = (50.0f / curAnim.frameLerp * timeScaleMod); // animSpeed is 1.0 if the frameLerp (ms/frame) is 50 (20 fps). - const float animFPS = (fabsf(curAnim.frameLerp)); - const int animDurMSec = (int)(((curAnim.numFrames - 1) * animFPS) / timeScaleMod); - const int animHoldMSec = ((animHoldless && timeScaleMod==1.0f)?((animDurMSec>1)?(animDurMSec-1):(animFPS)):(animDurMSec)); - int animFlags = (curAnim.loopFrames!=-1)?(BONE_ANIM_OVERRIDE_LOOP):(BONE_ANIM_OVERRIDE_FREEZE); - int animStart = (curAnim.firstFrame); - int animEnd = (curAnim.firstFrame)+(animations[anim].numFrames); + PM_SaberStartTransAnim(gent->client->ps.saberAnimLevel, anim, &timeScaleMod, gent); + + + + // SETUP VALUES FOR INCOMMING ANIMATION + //====================================== + const bool animFootMove = (PM_WalkingAnim(anim) || PM_RunningAnim(anim) || anim == BOTH_CROUCH1WALK || anim == BOTH_CROUCH1WALKBACK); + const bool animHoldless = (setAnimFlags&SETANIM_FLAG_HOLDLESS) != 0; + const bool animHold = (setAnimFlags&SETANIM_FLAG_HOLD) != 0; + const bool animRestart = (setAnimFlags&SETANIM_FLAG_RESTART) != 0; + const bool animOverride = (setAnimFlags&SETANIM_FLAG_OVERRIDE) != 0; + const bool animSync = (g_synchSplitAnims->integer != 0 && !animRestart); + float animCurrent = (-1.0f); + float animSpeed = (50.0f / curAnim.frameLerp * timeScaleMod); // animSpeed is 1.0 if the frameLerp (ms/frame) is 50 (20 fps). + const float animFPS = (fabsf(curAnim.frameLerp)); + const int animDurMSec = (int)(((curAnim.numFrames - 1) * animFPS) / timeScaleMod); + const int animHoldMSec = ((animHoldless && timeScaleMod == 1.0f) ? ((animDurMSec>1) ? (animDurMSec - 1) : (animFPS)) : (animDurMSec)); + int animFlags = (curAnim.loopFrames != -1) ? (BONE_ANIM_OVERRIDE_LOOP) : (BONE_ANIM_OVERRIDE_FREEZE); + int animStart = (curAnim.firstFrame); + int animEnd = (curAnim.firstFrame) + (animations[anim].numFrames); // If We Have A Blend Timer, Add The Blend Flag //---------------------------------------------- @@ -5319,27 +5318,27 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, //------------------------------------------------------------- if (animSpeed<0.0f) { -// #ifndef FINAL_BUILD - #if 0 - if (g_AnimWarning->integer==1) + // #ifndef FINAL_BUILD +#if 0 + if (g_AnimWarning->integer == 1) { if (animFlags&BONE_ANIM_OVERRIDE_LOOP) { gi.Printf(S_COLOR_YELLOW"PM_SetAnimFinal: WARNING: Anim (%s) looping backwards!\n", animTable[anim].name); } } - #endif +#endif - int temp = animEnd; - animEnd = animStart; - animStart = temp; - blendTime = 0; + int temp = animEnd; + animEnd = animStart; + animStart = temp; + blendTime = 0; } // If The Animation Is Walking Or Running, Attempt To Scale The Playback Speed To Match //-------------------------------------------------------------------------------------- - if (g_noFootSlide->integer - && animFootMove + if (g_noFootSlide->integer + && animFootMove && !(animSpeed<0.0f) //FIXME: either read speed from animation.cfg or only do this for NPCs // for whom we've specifically determined the proper numbers! @@ -5355,11 +5354,11 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, && gent->client->NPC_class != CLASS_SEEKER) { bool Walking = !!PM_WalkingAnim(anim); - bool HasDual = (gent->client->ps.saberAnimLevel==SS_DUAL); - bool HasStaff = (gent->client->ps.saberAnimLevel==SS_STAFF); - float moveSpeedOfAnim = 150.0f;//g_noFootSlideRunScale->value; + bool HasDual = (gent->client->ps.saberAnimLevel == SS_DUAL); + bool HasStaff = (gent->client->ps.saberAnimLevel == SS_STAFF); + float moveSpeedOfAnim = 150.0f;//g_noFootSlideRunScale->value; - if (anim==BOTH_CROUCH1WALK || anim==BOTH_CROUCH1WALKBACK) + if (anim == BOTH_CROUCH1WALK || anim == BOTH_CROUCH1WALKBACK) { moveSpeedOfAnim = 75.0f; } @@ -5405,7 +5404,7 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, - animSpeed *= (gent->resultspeed/moveSpeedOfAnim); + animSpeed *= (gent->resultspeed / moveSpeedOfAnim); if (animSpeed<0.01f) { animSpeed = 0.01f; @@ -5421,65 +5420,65 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, } -// GET VALUES FOR EXISTING BODY ANIMATION -//========================================== - float bodySpeed = 0.0f; - float bodyCurrent = 0.0f; - int bodyStart = 0; - int bodyEnd = 0; - int bodyFlags = 0; - int bodyAnim = (*legsAnim); - int bodyBone = (gent->rootBone); - bool bodyTimerOn = ((*legsAnimTimer>0) || (*legsAnimTimer)==-1); - bool bodyPlay = ((setAnimParts&SETANIM_LEGS) && (bodyBone!=-1) && (animOverride || !bodyTimerOn)); + // GET VALUES FOR EXISTING BODY ANIMATION + //========================================== + float bodySpeed = 0.0f; + float bodyCurrent = 0.0f; + int bodyStart = 0; + int bodyEnd = 0; + int bodyFlags = 0; + int bodyAnim = (*legsAnim); + int bodyBone = (gent->rootBone); + bool bodyTimerOn = ((*legsAnimTimer>0) || (*legsAnimTimer) == -1); + bool bodyPlay = ((setAnimParts&SETANIM_LEGS) && (bodyBone != -1) && (animOverride || !bodyTimerOn)); bool bodyAnimating = !!gi.G2API_GetBoneAnimIndex(&gent->ghoul2[gent->playerModel], bodyBone, actualTime, &bodyCurrent, &bodyStart, &bodyEnd, &bodyFlags, &bodySpeed, NULL); - bool bodyOnAnimNow = (bodyAnimating && bodyAnim==anim && bodyStart==animStart && bodyEnd==animEnd); + bool bodyOnAnimNow = (bodyAnimating && bodyAnim == anim && bodyStart == animStart && bodyEnd == animEnd); bool bodyMatchTorsFrame = false; -// GET VALUES FOR EXISTING TORSO ANIMATION -//=========================================== - float torsSpeed = 0.0f; - float torsCurrent = 0.0f; - int torsStart = 0; - int torsEnd = 0; - int torsFlags = 0; - int torsAnim = (*torsoAnim); - int torsBone = (gent->lowerLumbarBone); - bool torsTimerOn = ((*torsoAnimTimer)>0 || (*torsoAnimTimer)==-1); - bool torsPlay = (gent->client->NPC_class!=CLASS_RANCOR && (setAnimParts&SETANIM_TORSO) && (torsBone!=-1) && (animOverride || !torsTimerOn)); + // GET VALUES FOR EXISTING TORSO ANIMATION + //=========================================== + float torsSpeed = 0.0f; + float torsCurrent = 0.0f; + int torsStart = 0; + int torsEnd = 0; + int torsFlags = 0; + int torsAnim = (*torsoAnim); + int torsBone = (gent->lowerLumbarBone); + bool torsTimerOn = ((*torsoAnimTimer)>0 || (*torsoAnimTimer) == -1); + bool torsPlay = (gent->client->NPC_class != CLASS_RANCOR && (setAnimParts&SETANIM_TORSO) && (torsBone != -1) && (animOverride || !torsTimerOn)); bool torsAnimating = !!gi.G2API_GetBoneAnimIndex(&gent->ghoul2[gent->playerModel], torsBone, actualTime, &torsCurrent, &torsStart, &torsEnd, &torsFlags, &torsSpeed, NULL); - bool torsOnAnimNow = (torsAnimating && torsAnim==anim && torsStart==animStart && torsEnd==animEnd); + bool torsOnAnimNow = (torsAnimating && torsAnim == anim && torsStart == animStart && torsEnd == animEnd); bool torsMatchBodyFrame = false; -// APPLY SYNC TO TORSO -//===================== - if (animSync && torsPlay && !bodyPlay && bodyOnAnimNow && (!torsOnAnimNow || torsCurrent!=bodyCurrent)) + // APPLY SYNC TO TORSO + //===================== + if (animSync && torsPlay && !bodyPlay && bodyOnAnimNow && (!torsOnAnimNow || torsCurrent != bodyCurrent)) { torsMatchBodyFrame = true; - animCurrent = bodyCurrent; + animCurrent = bodyCurrent; } - if (animSync && bodyPlay && !torsPlay && torsOnAnimNow && (!bodyOnAnimNow || bodyCurrent!=torsCurrent)) + if (animSync && bodyPlay && !torsPlay && torsOnAnimNow && (!bodyOnAnimNow || bodyCurrent != torsCurrent)) { bodyMatchTorsFrame = true; - animCurrent = torsCurrent; + animCurrent = torsCurrent; } // If Already Doing These Exact Parameters, Then Don't Play //---------------------------------------------------------- if (!animRestart) { - torsPlay &= !(torsOnAnimNow && torsSpeed==animSpeed && !torsMatchBodyFrame); - bodyPlay &= !(bodyOnAnimNow && bodySpeed==animSpeed && !bodyMatchTorsFrame); + torsPlay &= !(torsOnAnimNow && torsSpeed == animSpeed && !torsMatchBodyFrame); + bodyPlay &= !(bodyOnAnimNow && bodySpeed == animSpeed && !bodyMatchTorsFrame); } #ifndef FINAL_BUILD - if ((cg_debugAnim.integer==3) || // 3 = do everyone - (cg_debugAnim.integer==1 && gent->s.number==0) || // 1 = only the player - (cg_debugAnim.integer==2 && gent->s.number!=0) || // 2 = only everyone else - (cg_debugAnim.integer==4 && gent->s.number!=cg_debugAnimTarget.integer) // 4 = specific entnum - ) + if ((cg_debugAnim.integer == 3) || // 3 = do everyone + (cg_debugAnim.integer == 1 && gent->s.number == 0) || // 1 = only the player + (cg_debugAnim.integer == 2 && gent->s.number != 0) || // 2 = only everyone else + (cg_debugAnim.integer == 4 && gent->s.number != cg_debugAnimTarget.integer) // 4 = specific entnum + ) { if (bodyPlay || torsPlay) { @@ -5522,48 +5521,48 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, // Print It! //----------- - Com_Printf("[%10d] ent[%3d-%18s] %s anim[%3d] - %s\n", - actualTime, - gent->s.number, - entName, + Com_Printf("[%10d] ent[%3d-%18s] %s anim[%3d] - %s\n", + actualTime, + gent->s.number, + entName, location, - anim, - animTable[anim].name ); + anim, + animTable[anim].name); } } #endif -// PLAY ON THE TORSO -//======================== + // PLAY ON THE TORSO + //======================== if (torsPlay) { *torsoAnim = anim; - float oldAnimCurrent = animCurrent; - if (animCurrent!=bodyCurrent && torsOnAnimNow && !animRestart && !torsMatchBodyFrame) + float oldAnimCurrent = animCurrent; + if (animCurrent != bodyCurrent && torsOnAnimNow && !animRestart && !torsMatchBodyFrame) { animCurrent = torsCurrent; } gi.G2API_SetAnimIndex(&gent->ghoul2[gent->playerModel], curAnim.glaIndex); - gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], torsBone, - animStart, - animEnd, - (torsOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), - animSpeed, - actualTime, - animCurrent, + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], torsBone, + animStart, + animEnd, + (torsOnAnimNow && !animRestart) ? (animFlags&~BONE_ANIM_BLEND) : (animFlags), + animSpeed, + actualTime, + animCurrent, blendTime); - if (gent->motionBone!=-1) + if (gent->motionBone != -1) { - gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->motionBone, - animStart, - animEnd, - (torsOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), - animSpeed, - actualTime, - animCurrent, + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->motionBone, + animStart, + animEnd, + (torsOnAnimNow && !animRestart) ? (animFlags&~BONE_ANIM_BLEND) : (animFlags), + animSpeed, + actualTime, + animCurrent, blendTime); } @@ -5577,8 +5576,8 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, } } -// PLAY ON THE WHOLE BODY -//======================== + // PLAY ON THE WHOLE BODY + //======================== if (bodyPlay) { *legsAnim = anim; @@ -5589,13 +5588,13 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, } gi.G2API_SetAnimIndex(&gent->ghoul2[gent->playerModel], curAnim.glaIndex); - gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], bodyBone, - animStart, - animEnd, - (bodyOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), - animSpeed, - actualTime, - animCurrent, + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], bodyBone, + animStart, + animEnd, + (bodyOnAnimNow && !animRestart) ? (animFlags&~BONE_ANIM_BLEND) : (animFlags), + animSpeed, + actualTime, + animCurrent, blendTime); // If This Animation Is To Be Locked And Held, Calculate The Duration And Set The Timer @@ -5610,14 +5609,14 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, -// PRINT SOME DEBUG TEXT OF EXISTING VALUES -//========================================== + // PRINT SOME DEBUG TEXT OF EXISTING VALUES + //========================================== if (false) { gi.Printf("PLAYANIM: (%3d) Speed(%4.2f) ", anim, animSpeed); if (bodyAnimating) { - gi.Printf("BODY: (%4.2f) (%4.2f) ", bodyCurrent, bodySpeed); + gi.Printf("BODY: (%4.2f) (%4.2f) ", bodyCurrent, bodySpeed); } else { @@ -5625,7 +5624,7 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, } if (torsAnimating) { - gi.Printf("TORS: (%4.2f) (%4.2f)\n", torsCurrent, torsSpeed); + gi.Printf("TORS: (%4.2f) (%4.2f)\n", torsCurrent, torsSpeed); } else { @@ -5636,75 +5635,75 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, -void PM_SetAnim(pmove_t *pm,int setAnimParts,int anim,int setAnimFlags, int blendTime) +void PM_SetAnim(pmove_t *pm, int setAnimParts, int anim, int setAnimFlags, int blendTime) { // FIXME : once torsoAnim and legsAnim are in the same structure for NPC and Players // rename PM_SetAnimFinal to PM_SetAnim and have both NPC and Players call PM_SetAnim - if ( pm->ps->pm_type >= PM_DEAD ) + if (pm->ps->pm_type >= PM_DEAD) {//FIXME: sometimes we'll want to set anims when your dead... twitches, impacts, etc. return; } - if ( pm->gent == NULL ) + if (pm->gent == NULL) { return; } - if ( !pm->gent || pm->gent->health > 0 ) + if (!pm->gent || pm->gent->health > 0) {//don't lock anims if the guy is dead - if ( pm->ps->torsoAnimTimer - && PM_LockedAnim( pm->ps->torsoAnim ) - && !PM_LockedAnim( anim ) ) + if (pm->ps->torsoAnimTimer + && PM_LockedAnim(pm->ps->torsoAnim) + && !PM_LockedAnim(anim)) {//nothing can override these special anims setAnimParts &= ~SETANIM_TORSO; } - if ( pm->ps->legsAnimTimer - && PM_LockedAnim( pm->ps->legsAnim ) - && !PM_LockedAnim( anim ) ) + if (pm->ps->legsAnimTimer + && PM_LockedAnim(pm->ps->legsAnim) + && !PM_LockedAnim(anim)) {//nothing can override these special anims setAnimParts &= ~SETANIM_LEGS; } } - if ( !setAnimParts ) + if (!setAnimParts) { return; } if (setAnimFlags&SETANIM_FLAG_OVERRIDE) { -// pm->ps->animationTimer = 0; - + // pm->ps->animationTimer = 0; + if (setAnimParts & SETANIM_TORSO) { - if( (setAnimFlags & SETANIM_FLAG_RESTART) || pm->ps->torsoAnim != anim ) + if ((setAnimFlags & SETANIM_FLAG_RESTART) || pm->ps->torsoAnim != anim) { - PM_SetTorsoAnimTimer( pm->gent, &pm->ps->torsoAnimTimer, 0 ); + PM_SetTorsoAnimTimer(pm->gent, &pm->ps->torsoAnimTimer, 0); } } if (setAnimParts & SETANIM_LEGS) { - if( (setAnimFlags & SETANIM_FLAG_RESTART) || pm->ps->legsAnim != anim ) + if ((setAnimFlags & SETANIM_FLAG_RESTART) || pm->ps->legsAnim != anim) { - PM_SetLegsAnimTimer( pm->gent, &pm->ps->legsAnimTimer, 0 ); + PM_SetLegsAnimTimer(pm->gent, &pm->ps->legsAnimTimer, 0); } } } - PM_SetAnimFinal(&pm->ps->torsoAnim,&pm->ps->legsAnim,setAnimParts,anim,setAnimFlags,&pm->ps->torsoAnimTimer,&pm->ps->legsAnimTimer,&g_entities[pm->ps->clientNum],blendTime);//was pm->gent + PM_SetAnimFinal(&pm->ps->torsoAnim, &pm->ps->legsAnim, setAnimParts, anim, setAnimFlags, &pm->ps->torsoAnimTimer, &pm->ps->legsAnimTimer, &g_entities[pm->ps->clientNum], blendTime);//was pm->gent } -bool TorsoAgainstWindTest( gentity_t* ent ) +bool TorsoAgainstWindTest(gentity_t* ent) { if (ent&&//valid ent - ent->client&&//a client - (ent->client->ps.weapon!=WP_SABER||ent->client->ps.saberMove==LS_READY)&&//either not holding a saber or the saber is in the ready pose - (ent->s.numbercurrentOrigin) && - gi.WE_IsOutside(ent->currentOrigin) ) + ent->client &&//a client + (ent->client->ps.weapon != WP_SABER || ent->client->ps.saberMove == LS_READY) &&//either not holding a saber or the saber is in the ready pose + (ent->s.numbercurrentOrigin) && + gi.WE_IsOutside(ent->currentOrigin)) { - if (Q_stricmp(level.mapname, "t2_wedge")!=0) + if (Q_stricmp(level.mapname, "t2_wedge") != 0) { vec3_t fwd; vec3_t windDir; @@ -5714,7 +5713,7 @@ bool TorsoAgainstWindTest( gentity_t* ent ) AngleVectors(pm->gent->currentAngles, fwd, 0, 0); if (DotProduct(fwd, windDir)>0.65f) { - if (ent->client && ent->client->ps.torsoAnim!=BOTH_WIND) + if (ent->client && ent->client->ps.torsoAnim != BOTH_WIND) { NPC_SetAnim(ent, SETANIM_TORSO, BOTH_WIND, SETANIM_FLAG_NORMAL, 400); } @@ -5737,34 +5736,34 @@ PM_TorsoAnimLightsaber // only does idle-ish anims. Anything that has a timer associated, such as attacks and blocks, // are set by PM_WeaponLightsaber() -extern Vehicle_t *G_IsRidingVehicle( gentity_t *pEnt ); -extern qboolean PM_LandingAnim( int anim ); -extern qboolean PM_JumpingAnim( int anim ); -qboolean PM_InCartwheel( int anim ); +extern Vehicle_t *G_IsRidingVehicle(gentity_t *pEnt); +extern qboolean PM_LandingAnim(int anim); +extern qboolean PM_JumpingAnim(int anim); +qboolean PM_InCartwheel(int anim); void PM_TorsoAnimLightsaber() { // ********************************************************* // WEAPON_READY // ********************************************************* - if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + if (pm->ps->forcePowersActive&(1 << FP_GRIP) && pm->ps->forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) {//holding an enemy aloft with force-grip return; } - if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_1 ) + if (pm->ps->forcePowersActive&(1 << FP_LIGHTNING) && pm->ps->forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_1) {//lightning return; } - if ( pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1 << FP_DRAIN)) {//drain return; } - if ( pm->ps->saber[0].blade[0].active - && pm->ps->saber[0].blade[0].length < 3 - && !(pm->ps->saberEventFlags&SEF_HITWALL) - && pm->ps->weaponstate == WEAPON_RAISING ) + if (pm->ps->saber[0].blade[0].active + && pm->ps->saber[0].blade[0].length < 3 + && !(pm->ps->saberEventFlags&SEF_HITWALL) + && pm->ps->weaponstate == WEAPON_RAISING) { if (!G_IsRidingVehicle(pm->gent)) { @@ -5772,7 +5771,7 @@ void PM_TorsoAnimLightsaber() } return; } - else if ( !pm->ps->SaberActive() && pm->ps->SaberLength() ) + else if (!pm->ps->SaberActive() && pm->ps->SaberLength()) { if (!G_IsRidingVehicle(pm->gent)) { @@ -5783,22 +5782,22 @@ void PM_TorsoAnimLightsaber() if (pm->ps->weaponTime > 0) { // weapon is already busy. - if ( pm->ps->torsoAnim == BOTH_TOSS1 - || pm->ps->torsoAnim == BOTH_TOSS2 ) + if (pm->ps->torsoAnim == BOTH_TOSS1 + || pm->ps->torsoAnim == BOTH_TOSS2) {//in toss - if ( !pm->ps->torsoAnimTimer ) + if (!pm->ps->torsoAnimTimer) {//weird, get out of it, I guess - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } } return; } - if ( pm->ps->weaponstate == WEAPON_READY || - pm->ps->weaponstate == WEAPON_CHARGING || - pm->ps->weaponstate == WEAPON_CHARGING_ALT ) + if (pm->ps->weaponstate == WEAPON_READY || + pm->ps->weaponstate == WEAPON_CHARGING || + pm->ps->weaponstate == WEAPON_CHARGING_ALT) {//ready - if ( pm->ps->weapon == WP_SABER && (pm->ps->SaberLength()) ) + if (pm->ps->weapon == WP_SABER && (pm->ps->SaberLength())) {//saber is on // Select the proper idle Lightsaber attack move from the chart. if (pm->ps->saberMove > LS_READY && pm->ps->saberMove < LS_MOVE_MAX) @@ -5807,32 +5806,32 @@ void PM_TorsoAnimLightsaber() } else { - if ( PM_JumpingAnim( pm->ps->legsAnim ) - || PM_LandingAnim( pm->ps->legsAnim ) - || PM_InCartwheel( pm->ps->legsAnim ) - || PM_FlippingAnim( pm->ps->legsAnim )) + if (PM_JumpingAnim(pm->ps->legsAnim) + || PM_LandingAnim(pm->ps->legsAnim) + || PM_InCartwheel(pm->ps->legsAnim) + || PM_FlippingAnim(pm->ps->legsAnim)) { - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD) {//using something - if ( !pm->ps->useTime ) + if (!pm->ps->useTime) {//stopped holding it, release - PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); }//else still holding, leave it as it is } else { - if ( (PM_RunningAnim( pm->ps->legsAnim ) - || pm->ps->legsAnim == BOTH_WALK_STAFF - || pm->ps->legsAnim == BOTH_WALK_DUAL - || pm->ps->legsAnim == BOTH_WALKBACK_STAFF - || pm->ps->legsAnim == BOTH_WALKBACK_DUAL ) - && pm->ps->saberBlockingTime < cg.time ) + if ((PM_RunningAnim(pm->ps->legsAnim) + || pm->ps->legsAnim == BOTH_WALK_STAFF + || pm->ps->legsAnim == BOTH_WALK_DUAL + || pm->ps->legsAnim == BOTH_WALKBACK_STAFF + || pm->ps->legsAnim == BOTH_WALKBACK_DUAL) + && pm->ps->saberBlockingTime < cg.time) {//running w/1-handed weapon uses full-body anim - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { @@ -5843,75 +5842,75 @@ void PM_TorsoAnimLightsaber() } /* if ( PM_JumpingAnim( pm->ps->legsAnim ) - || PM_LandingAnim( pm->ps->legsAnim ) - || PM_InCartwheel( pm->ps->legsAnim ) - || PM_FlippingAnim( pm->ps->legsAnim )) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) + || PM_FlippingAnim( pm->ps->legsAnim )) {//jumping, landing cartwheel, flipping - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); } else { - PM_SetSaberMove( LS_READY ); + PM_SetSaberMove( LS_READY ); } */ } else if (TorsoAgainstWindTest(pm->gent)) { } - else if( pm->ps->legsAnim == BOTH_RUN1 ) + else if (pm->ps->legsAnim == BOTH_RUN1) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_RUN1, SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } - else if( pm->ps->legsAnim == BOTH_RUN2 )//&& pm->ps->saberAnimLevel != SS_STAFF ) + else if (pm->ps->legsAnim == BOTH_RUN2)//&& pm->ps->saberAnimLevel != SS_STAFF ) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_RUN2, SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } - else if( pm->ps->legsAnim == BOTH_RUN_STAFF ) + else if (pm->ps->legsAnim == BOTH_RUN_STAFF) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_STAFF,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_RUN_STAFF, SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } - else if( pm->ps->legsAnim == BOTH_RUN_DUAL ) + else if (pm->ps->legsAnim == BOTH_RUN_DUAL) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_DUAL,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_RUN_DUAL, SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } - else if( pm->ps->legsAnim == BOTH_WALK1 ) + else if (pm->ps->legsAnim == BOTH_WALK1) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_WALK1, SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } - else if( pm->ps->legsAnim == BOTH_WALK2 ) + else if (pm->ps->legsAnim == BOTH_WALK2) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_WALK2, SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } - else if( pm->ps->legsAnim == BOTH_WALK_STAFF ) + else if (pm->ps->legsAnim == BOTH_WALK_STAFF) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_STAFF,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_WALK_STAFF, SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } - else if( pm->ps->legsAnim == BOTH_WALK_DUAL ) + else if (pm->ps->legsAnim == BOTH_WALK_DUAL) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_DUAL,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_WALK_DUAL, SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } - else if( pm->ps->legsAnim == BOTH_CROUCH1IDLE && pm->ps->clientNum != 0 )//player falls through + else if (pm->ps->legsAnim == BOTH_CROUCH1IDLE && pm->ps->clientNum != 0)//player falls through { //??? Why nothing? What if you were running??? //PM_SetAnim(pm,SETANIM_TORSO,BOTH_CROUCH1IDLE,SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } - else if( pm->ps->legsAnim == BOTH_JUMP1 ) + else if (pm->ps->legsAnim == BOTH_JUMP1) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_JUMP1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_JUMP1, SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } else {//Used to default to both_stand1 which is an arms-down anim -// PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 + // PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 // Select the next proper pose for the lightsaber assuming that there are no attacks. if (pm->ps->saberMove > LS_READY && pm->ps->saberMove < LS_MOVE_MAX) { @@ -5919,20 +5918,20 @@ void PM_TorsoAnimLightsaber() } else { - if ( PM_JumpingAnim( pm->ps->legsAnim ) - || PM_LandingAnim( pm->ps->legsAnim ) - || PM_InCartwheel( pm->ps->legsAnim ) - || PM_FlippingAnim( pm->ps->legsAnim )) + if (PM_JumpingAnim(pm->ps->legsAnim) + || PM_LandingAnim(pm->ps->legsAnim) + || PM_InCartwheel(pm->ps->legsAnim) + || PM_FlippingAnim(pm->ps->legsAnim)) { - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD) {//using something - if ( !pm->ps->useTime ) + if (!pm->ps->useTime) {//stopped holding it, release - PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); }//else still holding, leave it as it is } else @@ -5948,95 +5947,95 @@ void PM_TorsoAnimLightsaber() // WEAPON_IDLE // ********************************************************* - else if ( pm->ps->weaponstate == WEAPON_IDLE ) + else if (pm->ps->weaponstate == WEAPON_IDLE) { if (TorsoAgainstWindTest(pm->gent)) { } - else if( pm->ps->legsAnim == BOTH_GUARD_LOOKAROUND1 ) + else if (pm->ps->legsAnim == BOTH_GUARD_LOOKAROUND1) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_LOOKAROUND1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_GUARD_LOOKAROUND1, SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } - else if( pm->ps->legsAnim == BOTH_GUARD_IDLE1 ) + else if (pm->ps->legsAnim == BOTH_GUARD_IDLE1) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_IDLE1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_GUARD_IDLE1, SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } - else if( pm->ps->legsAnim == BOTH_STAND1IDLE1 + else if (pm->ps->legsAnim == BOTH_STAND1IDLE1 || pm->ps->legsAnim == BOTH_STAND2IDLE1 || pm->ps->legsAnim == BOTH_STAND2IDLE2 || pm->ps->legsAnim == BOTH_STAND3IDLE1 - || pm->ps->legsAnim == BOTH_STAND5IDLE1 ) + || pm->ps->legsAnim == BOTH_STAND5IDLE1) { - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } - else if( pm->ps->legsAnim == BOTH_STAND2TO4 ) + else if (pm->ps->legsAnim == BOTH_STAND2TO4) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND2TO4,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND2TO4, SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } - else if( pm->ps->legsAnim == BOTH_STAND4TO2 ) + else if (pm->ps->legsAnim == BOTH_STAND4TO2) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4TO2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND4TO2, SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } - else if( pm->ps->legsAnim == BOTH_STAND4 ) + else if (pm->ps->legsAnim == BOTH_STAND4) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND4, SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } else { -// This is now set in SetSaberMove. + // This is now set in SetSaberMove. // Idle for Lightsaber - if ( pm->gent && pm->gent->client ) + if (pm->gent && pm->gent->client) { -// pm->gent->client->saberTrail.inAction = qfalse; + // pm->gent->client->saberTrail.inAction = qfalse; } qboolean saberInAir = qtrue; - if ( pm->ps->saberInFlight ) + if (pm->ps->saberInFlight) {//guiding saber - if ( PM_SaberInBrokenParry( pm->ps->saberMove ) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim( pm->ps->torsoAnim ) ) + if (PM_SaberInBrokenParry(pm->ps->saberMove) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim(pm->ps->torsoAnim)) {//we're stuck in a broken parry saberInAir = qfalse; } - if ( pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0 )//player is 0 + if (pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0)//player is 0 {// - if ( &g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY ) + if (&g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY) {//fell to the ground and we're not trying to pull it back saberInAir = qfalse; } } } - if ( pm->ps->saberInFlight - && saberInAir + if (pm->ps->saberInFlight + && saberInAir && (!pm->ps->dualSabers || !pm->ps->saber[1].Active())) { - if ( !PM_ForceAnim( pm->ps->torsoAnim ) - || pm->ps->torsoAnimTimer < 300 ) + if (!PM_ForceAnim(pm->ps->torsoAnim) + || pm->ps->torsoAnimTimer < 300) {//don't interrupt a force power anim - if ( pm->ps->torsoAnim != BOTH_LOSE_SABER - || !pm->ps->torsoAnimTimer ) + if (pm->ps->torsoAnim != BOTH_LOSE_SABER + || !pm->ps->torsoAnimTimer) { - PM_SetAnim( pm, SETANIM_TORSO,BOTH_SABERPULL,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_SABERPULL, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } } } else {//saber is on // Idle for Lightsaber - if ( pm->gent && pm->gent->client ) + if (pm->gent && pm->gent->client) { - if ( !G_InCinematicSaberAnim( pm->gent ) ) + if (!G_InCinematicSaberAnim(pm->gent)) { - pm->gent->client->ps.SaberDeactivateTrail( 0 ); + pm->gent->client->ps.SaberDeactivateTrail(0); } } // Idle for idle/ready Lightsaber -// PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONIDLE1 + // PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONIDLE1 // Select the proper idle Lightsaber attack move from the chart. if (pm->ps->saberMove > LS_READY && pm->ps->saberMove < LS_MOVE_MAX) { @@ -6044,37 +6043,37 @@ void PM_TorsoAnimLightsaber() } else { - if ( PM_JumpingAnim( pm->ps->legsAnim ) - || PM_LandingAnim( pm->ps->legsAnim ) - || PM_InCartwheel( pm->ps->legsAnim ) - || PM_FlippingAnim( pm->ps->legsAnim )) + if (PM_JumpingAnim(pm->ps->legsAnim) + || PM_LandingAnim(pm->ps->legsAnim) + || PM_InCartwheel(pm->ps->legsAnim) + || PM_FlippingAnim(pm->ps->legsAnim)) { - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD) {//using something - if ( !pm->ps->useTime ) + if (!pm->ps->useTime) {//stopped holding it, release - PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); }//else still holding, leave it as it is } else { - if ( (PM_RunningAnim( pm->ps->legsAnim ) - || pm->ps->legsAnim == BOTH_WALK_STAFF - || pm->ps->legsAnim == BOTH_WALK_DUAL - || pm->ps->legsAnim == BOTH_WALKBACK_STAFF - || pm->ps->legsAnim == BOTH_WALKBACK_DUAL ) - && pm->ps->saberBlockingTime < cg.time ) + if ((PM_RunningAnim(pm->ps->legsAnim) + || pm->ps->legsAnim == BOTH_WALK_STAFF + || pm->ps->legsAnim == BOTH_WALK_DUAL + || pm->ps->legsAnim == BOTH_WALKBACK_STAFF + || pm->ps->legsAnim == BOTH_WALKBACK_DUAL) + && pm->ps->saberBlockingTime < cg.time) {//running w/1-handed weapon uses full-body anim int setFlags = SETANIM_FLAG_NORMAL; - if ( PM_LandingAnim( pm->ps->torsoAnim ) ) + if (PM_LandingAnim(pm->ps->torsoAnim)) { setFlags = SETANIM_FLAG_OVERRIDE; } - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,setFlags); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, setFlags); } else { @@ -6097,106 +6096,106 @@ PM_TorsoAnimation ------------------------- */ -void PM_TorsoAnimation( void ) +void PM_TorsoAnimation(void) {//FIXME: Write a much smarter and more appropriate anim picking routine logic... -// int oldAnim; - if ( PM_InKnockDown( pm->ps ) || PM_InRoll( pm->ps )) + // int oldAnim; + if (PM_InKnockDown(pm->ps) || PM_InRoll(pm->ps)) {//in knockdown return; } - if ( (pm->ps->eFlags&EF_HELD_BY_WAMPA) ) + if ((pm->ps->eFlags&EF_HELD_BY_WAMPA)) { return; } - if ( (pm->ps->eFlags&EF_FORCE_DRAINED) ) + if ((pm->ps->eFlags&EF_FORCE_DRAINED)) {//being drained //PM_SetAnim( pm, SETANIM_TORSO, BOTH_HUGGEE1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); return; } - if ( (pm->ps->forcePowersActive&(1<ps->forceDrainEntityNum < ENTITYNUM_WORLD ) + if ((pm->ps->forcePowersActive&(1 << FP_DRAIN)) + && pm->ps->forceDrainEntityNum < ENTITYNUM_WORLD) {//draining //PM_SetAnim( pm, SETANIM_TORSO, BOTH_HUGGER1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); return; } - if( pm->gent && pm->gent->NPC && (pm->gent->NPC->scriptFlags & SCF_FORCED_MARCH) ) + if (pm->gent && pm->gent->NPC && (pm->gent->NPC->scriptFlags & SCF_FORCED_MARCH)) { return; } - if(pm->gent != NULL && pm->gent->client) + if (pm->gent != NULL && pm->gent->client) { pm->gent->client->renderInfo.torsoFpsMod = 1.0f; } - if ( pm->gent && pm->ps && pm->ps->eFlags & EF_LOCKED_TO_WEAPON ) + if (pm->gent && pm->ps && pm->ps->eFlags & EF_LOCKED_TO_WEAPON) { - if ( pm->gent->owner && pm->gent->owner->e_UseFunc == useF_emplaced_gun_use )//ugly way to tell, but... + if (pm->gent->owner && pm->gent->owner->e_UseFunc == useF_emplaced_gun_use)//ugly way to tell, but... {//full body - PM_SetAnim(pm,SETANIM_BOTH,BOTH_GUNSIT1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + PM_SetAnim(pm, SETANIM_BOTH, BOTH_GUNSIT1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL } else {//torso - PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUNSIT1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + PM_SetAnim(pm, SETANIM_TORSO, BOTH_GUNSIT1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL } return; } -/* else if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE && pm->ps->clientNum < MAX_CLIENTS && (m_pVehicleInfo[((CVehicleNPC *)pm->gent->NPC)->m_iVehicleTypeID].numHands == 2 || g_speederControlScheme->value == 2) ) + /* else if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE && pm->ps->clientNum < MAX_CLIENTS && (m_pVehicleInfo[((CVehicleNPC *)pm->gent->NPC)->m_iVehicleTypeID].numHands == 2 || g_speederControlScheme->value == 2) ) {//can't look around - PM_SetAnim(pm,SETANIM_TORSO,m_pVehicleInfo[((CVehicleNPC *)pm->gent->NPC)->m_iVehicleTypeID].riderAnim,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); - return; + PM_SetAnim(pm,SETANIM_TORSO,m_pVehicleInfo[((CVehicleNPC *)pm->gent->NPC)->m_iVehicleTypeID].riderAnim,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); + return; }*/ - if ( pm->ps->taunting > level.time ) + if (pm->ps->taunting > level.time) { - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ALORA ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ALORA) { - PM_SetAnim(pm,SETANIM_BOTH,BOTH_ALORA_TAUNT,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + PM_SetAnim(pm, SETANIM_BOTH, BOTH_ALORA_TAUNT, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL } - else if ( pm->ps->weapon == WP_SABER && pm->ps->saberAnimLevel == SS_DUAL && PM_HasAnimation( pm->gent, BOTH_DUAL_TAUNT ) ) + else if (pm->ps->weapon == WP_SABER && pm->ps->saberAnimLevel == SS_DUAL && PM_HasAnimation(pm->gent, BOTH_DUAL_TAUNT)) { - PM_SetAnim(pm,SETANIM_BOTH,BOTH_DUAL_TAUNT,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + PM_SetAnim(pm, SETANIM_BOTH, BOTH_DUAL_TAUNT, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL } - else if ( pm->ps->weapon == WP_SABER - && pm->ps->saberAnimLevel == SS_STAFF )//pm->ps->saber[0].type == SABER_STAFF ) + else if (pm->ps->weapon == WP_SABER + && pm->ps->saberAnimLevel == SS_STAFF)//pm->ps->saber[0].type == SABER_STAFF ) {//turn on the blades - if ( PM_HasAnimation( pm->gent, BOTH_STAFF_TAUNT ) ) + if (PM_HasAnimation(pm->gent, BOTH_STAFF_TAUNT)) { - PM_SetAnim(pm,SETANIM_BOTH,BOTH_STAFF_TAUNT,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + PM_SetAnim(pm, SETANIM_BOTH, BOTH_STAFF_TAUNT, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL } /* else { - if ( !pm->ps->saber[0].blade[0].active ) - {//first blade is off - //turn it on - pm->ps->SaberBladeActivate( 0, 0, qtrue ); - if ( !pm->ps->saber[0].blade[1].active ) - {//second blade is also off, extend time of this taunt so we have enough time to turn them both on - pm->ps->taunting = level.time + 3000; - } - } - else if ( (pm->ps->taunting - level.time) < 1500 ) - {//only 1500ms left in taunt - if ( !pm->ps->saber[0].blade[1].active ) - {//second blade is off - //turn it on - pm->ps->SaberBladeActivate( 0, 1, qtrue ); - } - } - //pose - PM_SetAnim(pm,SETANIM_BOTH,BOTH_SABERSTAFF_STANCE,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); - pm->ps->torsoAnimTimer = pm->ps->legsAnimTimer = (pm->ps->taunting - level.time); + if ( !pm->ps->saber[0].blade[0].active ) + {//first blade is off + //turn it on + pm->ps->SaberBladeActivate( 0, 0, qtrue ); + if ( !pm->ps->saber[0].blade[1].active ) + {//second blade is also off, extend time of this taunt so we have enough time to turn them both on + pm->ps->taunting = level.time + 3000; + } + } + else if ( (pm->ps->taunting - level.time) < 1500 ) + {//only 1500ms left in taunt + if ( !pm->ps->saber[0].blade[1].active ) + {//second blade is off + //turn it on + pm->ps->SaberBladeActivate( 0, 1, qtrue ); + } + } + //pose + PM_SetAnim(pm,SETANIM_BOTH,BOTH_SABERSTAFF_STANCE,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); + pm->ps->torsoAnimTimer = pm->ps->legsAnimTimer = (pm->ps->taunting - level.time); } */ } - else if ( PM_HasAnimation( pm->gent, BOTH_GESTURE1 ) ) + else if (PM_HasAnimation(pm->gent, BOTH_GESTURE1)) { - PM_SetAnim(pm,SETANIM_BOTH,BOTH_GESTURE1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL - pm->gent->client->ps.SaberActivateTrail( 100 ); + PM_SetAnim(pm, SETANIM_BOTH, BOTH_GESTURE1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + pm->gent->client->ps.SaberActivateTrail(100); //FIXME: will this reset? //FIXME: force-control (yellow glow) effect on hand and saber? } @@ -6207,106 +6206,106 @@ void PM_TorsoAnimation( void ) return; } - if (pm->ps->weapon == WP_SABER ) // WP_LIGHTSABER + if (pm->ps->weapon == WP_SABER) // WP_LIGHTSABER { qboolean saberInAir = qfalse; - if ( pm->ps->SaberLength() && !pm->ps->saberInFlight ) + if (pm->ps->SaberLength() && !pm->ps->saberInFlight) { PM_TorsoAnimLightsaber(); } else { - if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + if (pm->ps->forcePowersActive&(1 << FP_GRIP) && pm->ps->forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) {//holding an enemy aloft with force-grip return; } - if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_1 ) + if (pm->ps->forcePowersActive&(1 << FP_LIGHTNING) && pm->ps->forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_1) {//lightning return; } - if ( pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1 << FP_DRAIN)) {//drain return; } saberInAir = qtrue; - if ( PM_SaberInBrokenParry( pm->ps->saberMove ) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim( pm->ps->torsoAnim ) ) + if (PM_SaberInBrokenParry(pm->ps->saberMove) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim(pm->ps->torsoAnim)) {//we're stuck in a broken parry PM_TorsoAnimLightsaber(); } else { - if ( pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0 )//player is 0 - {// - if ( &g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY ) + if (pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0)//player is 0 + {// + if (&g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY) {//fell to the ground and we're not trying to pull it back saberInAir = qfalse; } } - if ( pm->ps->saberInFlight - && saberInAir + if (pm->ps->saberInFlight + && saberInAir && (!pm->ps->dualSabers //not using 2 sabers - || !pm->ps->saber[1].Active() //left one off - || pm->ps->torsoAnim == BOTH_SABERDUAL_STANCE//not attacking - || pm->ps->torsoAnim == BOTH_SABERPULL//not attacking - || pm->ps->torsoAnim == BOTH_STAND1//not attacking - || PM_RunningAnim( pm->ps->torsoAnim ) //not attacking - || PM_WalkingAnim( pm->ps->torsoAnim ) //not attacking - || PM_JumpingAnim( pm->ps->torsoAnim )//not attacking - || PM_SwimmingAnim( pm->ps->torsoAnim ) )//not attacking + || !pm->ps->saber[1].Active() //left one off + || pm->ps->torsoAnim == BOTH_SABERDUAL_STANCE//not attacking + || pm->ps->torsoAnim == BOTH_SABERPULL//not attacking + || pm->ps->torsoAnim == BOTH_STAND1//not attacking + || PM_RunningAnim(pm->ps->torsoAnim) //not attacking + || PM_WalkingAnim(pm->ps->torsoAnim) //not attacking + || PM_JumpingAnim(pm->ps->torsoAnim)//not attacking + || PM_SwimmingAnim(pm->ps->torsoAnim))//not attacking ) { - if ( !PM_ForceAnim( pm->ps->torsoAnim ) || pm->ps->torsoAnimTimer < 300 ) + if (!PM_ForceAnim(pm->ps->torsoAnim) || pm->ps->torsoAnimTimer < 300) {//don't interrupt a force power anim - if ( pm->ps->torsoAnim != BOTH_LOSE_SABER - || !pm->ps->torsoAnimTimer ) + if (pm->ps->torsoAnim != BOTH_LOSE_SABER + || !pm->ps->torsoAnimTimer) { - PM_SetAnim( pm, SETANIM_TORSO,BOTH_SABERPULL,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_SABERPULL, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } } } else { - if ( PM_InSlopeAnim( pm->ps->legsAnim ) ) + if (PM_InSlopeAnim(pm->ps->legsAnim)) {//HMM... this probably breaks the saber putaway and select anims - if ( pm->ps->SaberLength() > 0 ) + if (pm->ps->SaberLength() > 0) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND2, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL); } } else { - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD) {//using something - if ( !pm->ps->useTime ) + if (!pm->ps->useTime) {//stopped holding it, release - PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); }//else still holding, leave it as it is } else { - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } } } } } - if (pm->ps->weaponTime<= 0 && (pm->ps->saberMove==LS_READY || pm->ps->SaberLength()==0) && !saberInAir) + if (pm->ps->weaponTime <= 0 && (pm->ps->saberMove == LS_READY || pm->ps->SaberLength() == 0) && !saberInAir) { - TorsoAgainstWindTest(pm->gent); + TorsoAgainstWindTest(pm->gent); } return; } - if ( PM_ForceAnim( pm->ps->torsoAnim ) - && pm->ps->torsoAnimTimer > 0 ) + if (PM_ForceAnim(pm->ps->torsoAnim) + && pm->ps->torsoAnimTimer > 0) {//in a force anim, don't do a stand anim return; } @@ -6314,217 +6313,217 @@ void PM_TorsoAnimation( void ) qboolean weaponBusy = qfalse; - if ( pm->ps->weapon == WP_NONE ) + if (pm->ps->weapon == WP_NONE) { weaponBusy = qfalse; } - else if ( pm->ps->weaponstate == WEAPON_FIRING || pm->ps->weaponstate == WEAPON_CHARGING || pm->ps->weaponstate == WEAPON_CHARGING_ALT ) + else if (pm->ps->weaponstate == WEAPON_FIRING || pm->ps->weaponstate == WEAPON_CHARGING || pm->ps->weaponstate == WEAPON_CHARGING_ALT) { weaponBusy = qtrue; } - else if ( pm->ps->lastShotTime > level.time - 3000 ) + else if (pm->ps->lastShotTime > level.time - 3000) { weaponBusy = qtrue; } - else if ( pm->ps->weaponTime > 0 ) + else if (pm->ps->weaponTime > 0) { weaponBusy = qtrue; } - else if ( pm->gent && pm->gent->client->fireDelay > 0 ) + else if (pm->gent && pm->gent->client->fireDelay > 0) { weaponBusy = qtrue; } - else if ( TorsoAgainstWindTest(pm->gent) ) + else if (TorsoAgainstWindTest(pm->gent)) { return; } - else if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.zoomTime > cg.time - 5000 ) + else if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && cg.zoomTime > cg.time - 5000) {//if we used binoculars recently, aim weapon weaponBusy = qtrue; pm->ps->weaponstate = WEAPON_IDLE; } - else if ( pm->ps->pm_flags & PMF_DUCKED ) + else if (pm->ps->pm_flags & PMF_DUCKED) {//ducking is considered on alert... plus looks stupid to have arms hanging down when crouched weaponBusy = qtrue; } - if ( pm->ps->weapon == WP_NONE || - pm->ps->weaponstate == WEAPON_READY || - pm->ps->weaponstate == WEAPON_CHARGING || - pm->ps->weaponstate == WEAPON_CHARGING_ALT ) + if (pm->ps->weapon == WP_NONE || + pm->ps->weaponstate == WEAPON_READY || + pm->ps->weaponstate == WEAPON_CHARGING || + pm->ps->weaponstate == WEAPON_CHARGING_ALT) { - if ( pm->ps->weapon == WP_SABER && pm->ps->SaberLength() ) + if (pm->ps->weapon == WP_SABER && pm->ps->SaberLength()) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK1, SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 } - else if( pm->ps->legsAnim == BOTH_RUN1 && !weaponBusy ) + else if (pm->ps->legsAnim == BOTH_RUN1 && !weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_RUN1, SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_RUN2 && !weaponBusy )//&& pm->ps->saberAnimLevel != SS_STAFF ) + else if (pm->ps->legsAnim == BOTH_RUN2 && !weaponBusy)//&& pm->ps->saberAnimLevel != SS_STAFF ) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_RUN2, SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_RUN4 && !weaponBusy )//&& pm->ps->saberAnimLevel != SS_STAFF ) + else if (pm->ps->legsAnim == BOTH_RUN4 && !weaponBusy)//&& pm->ps->saberAnimLevel != SS_STAFF ) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN4,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_RUN4, SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_RUN_STAFF && !weaponBusy ) + else if (pm->ps->legsAnim == BOTH_RUN_STAFF && !weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_STAFF,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_RUN_STAFF, SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_RUN_DUAL && !weaponBusy ) + else if (pm->ps->legsAnim == BOTH_RUN_DUAL && !weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_DUAL,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_RUN_DUAL, SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_WALK1 && !weaponBusy ) + else if (pm->ps->legsAnim == BOTH_WALK1 && !weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_WALK1, SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_WALK2 && !weaponBusy ) + else if (pm->ps->legsAnim == BOTH_WALK2 && !weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_WALK2, SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_WALK_STAFF && !weaponBusy ) + else if (pm->ps->legsAnim == BOTH_WALK_STAFF && !weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_STAFF,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_WALK_STAFF, SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_WALK_DUAL&& !weaponBusy ) + else if (pm->ps->legsAnim == BOTH_WALK_DUAL&& !weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_DUAL,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_WALK_DUAL, SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_CROUCH1IDLE && pm->ps->clientNum != 0 )//player falls through + else if (pm->ps->legsAnim == BOTH_CROUCH1IDLE && pm->ps->clientNum != 0)//player falls through { //??? Why nothing? What if you were running??? //PM_SetAnim(pm,SETANIM_TORSO,BOTH_CROUCH1IDLE,SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_JUMP1 && !weaponBusy ) + else if (pm->ps->legsAnim == BOTH_JUMP1 && !weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_JUMP1,SETANIM_FLAG_NORMAL, 100); // Only blend over 100ms + PM_SetAnim(pm, SETANIM_TORSO, BOTH_JUMP1, SETANIM_FLAG_NORMAL, 100); // Only blend over 100ms } - else if( pm->ps->legsAnim == BOTH_SWIM_IDLE1 && !weaponBusy ) + else if (pm->ps->legsAnim == BOTH_SWIM_IDLE1 && !weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIM_IDLE1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_SWIM_IDLE1, SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_SWIMFORWARD && !weaponBusy ) + else if (pm->ps->legsAnim == BOTH_SWIMFORWARD && !weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIMFORWARD,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_SWIMFORWARD, SETANIM_FLAG_NORMAL); } - else if ( pm->ps->weapon == WP_NONE ) + else if (pm->ps->weapon == WP_NONE) { int legsAnim = pm->ps->legsAnim; /* - if ( PM_RollingAnim( legsAnim ) || - PM_FlippingAnim( legsAnim ) || - PM_JumpingAnim( legsAnim ) || - PM_PainAnim( legsAnim ) || - PM_SwimmingAnim( legsAnim ) ) + if ( PM_RollingAnim( legsAnim ) || + PM_FlippingAnim( legsAnim ) || + PM_JumpingAnim( legsAnim ) || + PM_PainAnim( legsAnim ) || + PM_SwimmingAnim( legsAnim ) ) */ { - PM_SetAnim(pm, SETANIM_TORSO, legsAnim, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_TORSO, legsAnim, SETANIM_FLAG_NORMAL); } } else {//Used to default to both_stand1 which is an arms-down anim - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD) {//using something - if ( !pm->ps->useTime ) + if (!pm->ps->useTime) {//stopped holding it, release - PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); }//else still holding, leave it as it is } - else if ( pm->gent != NULL - && (pm->gent->s.numbergent)) - && pm->ps->weaponstate != WEAPON_CHARGING - && pm->ps->weaponstate != WEAPON_CHARGING_ALT ) + else if (pm->gent != NULL + && (pm->gent->s.numbergent)) + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT) {//PLayer- temp hack for weapon frame - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR) {//ignore } - else if ( pm->ps->weapon == WP_MELEE ) + else if (pm->ps->weapon == WP_MELEE) {//hehe - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND6, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL); } } - else if ( PM_InSpecialJump( pm->ps->legsAnim ) ) + else if (PM_InSpecialJump(pm->ps->legsAnim)) {//use legs anim //FIXME: or just use whatever's currently playing? //PM_SetAnim( pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL ); } else { - switch(pm->ps->weapon) + switch (pm->ps->weapon) { - // ******************************************************** + // ******************************************************** case WP_SABER: // WP_LIGHTSABER // Ready pose for Lightsaber -// PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 + // PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 // Select the next proper pose for the lightsaber assuming that there are no attacks. if (pm->ps->saberMove > LS_NONE && pm->ps->saberMove < LS_MOVE_MAX) { PM_SetSaberMove(saberMoveData[pm->ps->saberMove].chain_idle); } break; - // ******************************************************** + // ******************************************************** case WP_BRYAR_PISTOL: //FIXME: if recently fired, hold the ready! - if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + if (pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY2, SETANIM_FLAG_NORMAL); } - else if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) - || PM_JumpingAnim( pm->ps->legsAnim ) - || PM_SwimmingAnim( pm->ps->legsAnim ) ) + else if (PM_RunningAnim(pm->ps->legsAnim) + || PM_WalkingAnim(pm->ps->legsAnim) + || PM_JumpingAnim(pm->ps->legsAnim) + || PM_SwimmingAnim(pm->ps->legsAnim)) {//running w/1-handed weapon uses full-body anim - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY2, SETANIM_FLAG_NORMAL); } break; case WP_BLASTER_PISTOL: - if ( pm->gent - && pm->gent->weaponModel[1] > 0 ) + if (pm->gent + && pm->gent->weaponModel[1] > 0) {//dual pistols - if ( weaponBusy ) + if (weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUNSIT1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_GUNSIT1, SETANIM_FLAG_NORMAL); } - else if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) - || PM_JumpingAnim( pm->ps->legsAnim ) - || PM_SwimmingAnim( pm->ps->legsAnim ) ) + else if (PM_RunningAnim(pm->ps->legsAnim) + || PM_WalkingAnim(pm->ps->legsAnim) + || PM_JumpingAnim(pm->ps->legsAnim) + || PM_SwimmingAnim(pm->ps->legsAnim)) {//running w/1-handed weapon uses full-body anim - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND6, SETANIM_FLAG_NORMAL); } } else {//single pistols - if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + if (pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY2, SETANIM_FLAG_NORMAL); } - else if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) - || PM_JumpingAnim( pm->ps->legsAnim ) - || PM_SwimmingAnim( pm->ps->legsAnim ) ) + else if (PM_RunningAnim(pm->ps->legsAnim) + || PM_WalkingAnim(pm->ps->legsAnim) + || PM_JumpingAnim(pm->ps->legsAnim) + || PM_SwimmingAnim(pm->ps->legsAnim)) {//running w/1-handed weapon uses full-body anim - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY2, SETANIM_FLAG_NORMAL); } } break; @@ -6532,300 +6531,300 @@ void PM_TorsoAnimation( void ) //NOTE: should never get here break; case WP_MELEE: - if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) - || PM_JumpingAnim( pm->ps->legsAnim ) - || PM_SwimmingAnim( pm->ps->legsAnim ) ) + if (PM_RunningAnim(pm->ps->legsAnim) + || PM_WalkingAnim(pm->ps->legsAnim) + || PM_JumpingAnim(pm->ps->legsAnim) + || PM_SwimmingAnim(pm->ps->legsAnim)) {//running w/1-handed weapon uses full-body anim - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR) {//ignore } - else if ( pm->gent && pm->gent->client && !PM_DroidMelee( pm->gent->client->NPC_class ) ) + else if (pm->gent && pm->gent->client && !PM_DroidMelee(pm->gent->client->NPC_class)) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND6, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL); } } break; case WP_TUSKEN_STAFF: - if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) - || PM_JumpingAnim( pm->ps->legsAnim ) - || PM_SwimmingAnim( pm->ps->legsAnim ) ) + if (PM_RunningAnim(pm->ps->legsAnim) + || PM_WalkingAnim(pm->ps->legsAnim) + || PM_JumpingAnim(pm->ps->legsAnim) + || PM_SwimmingAnim(pm->ps->legsAnim)) {//running w/1-handed weapon uses full-body anim - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND3, SETANIM_FLAG_NORMAL); } break; - + case WP_NOGHRI_STICK: - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL); //PM_SetAnim(pm,SETANIM_LEGS,BOTH_ATTACK2,SETANIM_FLAG_NORMAL); break; - + case WP_BLASTER: - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL); //PM_SetAnim(pm,SETANIM_LEGS,BOTH_ATTACK2,SETANIM_FLAG_NORMAL); break; case WP_DISRUPTOR: case WP_TUSKEN_RIFLE: - if ( (pm->ps->weaponstate != WEAPON_FIRING - && pm->ps->weaponstate != WEAPON_CHARGING - && pm->ps->weaponstate != WEAPON_CHARGING_ALT) - || PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) - || PM_JumpingAnim( pm->ps->legsAnim ) - || PM_SwimmingAnim( pm->ps->legsAnim ) ) + if ((pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT) + || PM_RunningAnim(pm->ps->legsAnim) + || PM_WalkingAnim(pm->ps->legsAnim) + || PM_JumpingAnim(pm->ps->legsAnim) + || PM_SwimmingAnim(pm->ps->legsAnim)) {//running sniper weapon uses normal ready - if ( pm->ps->clientNum ) + if (pm->ps->clientNum) { - PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL); } } else { - if ( pm->ps->clientNum ) + if (pm->ps->clientNum) { - PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD );//TORSO_WEAPONREADY4//SETANIM_FLAG_RESTART| + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD);//TORSO_WEAPONREADY4//SETANIM_FLAG_RESTART| } else { - PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL); } } break; case WP_BOT_LASER: - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONIDLE2, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); break; case WP_THERMAL: - if ( pm->ps->weaponstate != WEAPON_FIRING - && pm->ps->weaponstate != WEAPON_CHARGING + if (pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING && pm->ps->weaponstate != WEAPON_CHARGING_ALT - && (PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) - || PM_JumpingAnim( pm->ps->legsAnim ) - || PM_SwimmingAnim( pm->ps->legsAnim )) ) + && (PM_RunningAnim(pm->ps->legsAnim) + || PM_WalkingAnim(pm->ps->legsAnim) + || PM_JumpingAnim(pm->ps->legsAnim) + || PM_SwimmingAnim(pm->ps->legsAnim))) {//running w/1-handed weapon uses full-body anim - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && (pm->ps->weaponstate == WEAPON_CHARGING || pm->ps->weaponstate == WEAPON_CHARGING_ALT) ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && (pm->ps->weaponstate == WEAPON_CHARGING || pm->ps->weaponstate == WEAPON_CHARGING_ALT)) {//player pulling back to throw - if ( PM_StandingAnim( pm->ps->legsAnim ) ) + if (PM_StandingAnim(pm->ps->legsAnim)) { - PM_SetAnim( pm, SETANIM_LEGS, BOTH_THERMAL_READY, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_THERMAL_READY, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } - else if ( pm->ps->legsAnim == BOTH_THERMAL_READY ) + else if (pm->ps->legsAnim == BOTH_THERMAL_READY) {//sigh... hold it so pm_footsteps doesn't override - if ( pm->ps->legsAnimTimer < 100 ) + if (pm->ps->legsAnimTimer < 100) { pm->ps->legsAnimTimer = 100; } } - PM_SetAnim( pm, SETANIM_TORSO, BOTH_THERMAL_READY, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_THERMAL_READY, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } else { - if ( weaponBusy ) + if (weaponBusy) { - PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY10, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY10, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL); } } } break; case WP_REPEATER: - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_GALAKMECH ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_GALAKMECH) {// - if ( pm->gent->alt_fire ) + if (pm->gent->alt_fire) { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY1, SETANIM_FLAG_NORMAL); } } else { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL); } break; case WP_TRIP_MINE: case WP_DET_PACK: - if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) - || PM_JumpingAnim( pm->ps->legsAnim ) - || PM_SwimmingAnim( pm->ps->legsAnim ) ) + if (PM_RunningAnim(pm->ps->legsAnim) + || PM_WalkingAnim(pm->ps->legsAnim) + || PM_JumpingAnim(pm->ps->legsAnim) + || PM_SwimmingAnim(pm->ps->legsAnim)) {//running w/1-handed weapon uses full-body anim - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { - if ( weaponBusy ) + if (weaponBusy) { - PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL); } } break; default: - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL); break; } } } } - else if ( pm->ps->weaponstate == WEAPON_IDLE ) + else if (pm->ps->weaponstate == WEAPON_IDLE) { - if( pm->ps->legsAnim == BOTH_GUARD_LOOKAROUND1 ) + if (pm->ps->legsAnim == BOTH_GUARD_LOOKAROUND1) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_LOOKAROUND1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_GUARD_LOOKAROUND1, SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_GUARD_IDLE1 ) + else if (pm->ps->legsAnim == BOTH_GUARD_IDLE1) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_IDLE1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_GUARD_IDLE1, SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_STAND1IDLE1 + else if (pm->ps->legsAnim == BOTH_STAND1IDLE1 || pm->ps->legsAnim == BOTH_STAND2IDLE1 || pm->ps->legsAnim == BOTH_STAND2IDLE2 || pm->ps->legsAnim == BOTH_STAND3IDLE1 - || pm->ps->legsAnim == BOTH_STAND5IDLE1 ) + || pm->ps->legsAnim == BOTH_STAND5IDLE1) { - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } - else if( pm->ps->legsAnim == BOTH_STAND2TO4 ) + else if (pm->ps->legsAnim == BOTH_STAND2TO4) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND2TO4,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND2TO4, SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_STAND4TO2 ) + else if (pm->ps->legsAnim == BOTH_STAND4TO2) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4TO2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND4TO2, SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_STAND4 ) + else if (pm->ps->legsAnim == BOTH_STAND4) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND4, SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_SWIM_IDLE1 ) + else if (pm->ps->legsAnim == BOTH_SWIM_IDLE1) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIM_IDLE1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_SWIM_IDLE1, SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_SWIMFORWARD ) + else if (pm->ps->legsAnim == BOTH_SWIMFORWARD) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIMFORWARD,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_SWIMFORWARD, SETANIM_FLAG_NORMAL); } - else if ( PM_InSpecialJump( pm->ps->legsAnim ) ) + else if (PM_InSpecialJump(pm->ps->legsAnim)) {//use legs anim //FIXME: or just use whatever's currently playing? //PM_SetAnim( pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL ); } - else if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + else if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD) {//using something - if ( !pm->ps->useTime ) + if (!pm->ps->useTime) {//stopped holding it, release - PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); }//else still holding, leave it as it is } else { - if ( !weaponBusy + if (!weaponBusy && pm->ps->weapon != WP_BOWCASTER && pm->ps->weapon != WP_REPEATER && pm->ps->weapon != WP_FLECHETTE && pm->ps->weapon != WP_ROCKET_LAUNCHER && pm->ps->weapon != WP_CONCUSSION - && ( PM_RunningAnim( pm->ps->legsAnim ) - || (PM_WalkingAnim( pm->ps->legsAnim ) && (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())) - || PM_JumpingAnim( pm->ps->legsAnim ) - || PM_SwimmingAnim( pm->ps->legsAnim ) ) ) + && (PM_RunningAnim(pm->ps->legsAnim) + || (PM_WalkingAnim(pm->ps->legsAnim) && (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer())) + || PM_JumpingAnim(pm->ps->legsAnim) + || PM_SwimmingAnim(pm->ps->legsAnim))) {//running w/1-handed or light 2-handed weapon uses full-body anim if you're not using the weapon right now - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { - switch ( pm->ps->weapon ) + switch (pm->ps->weapon) { - // ******************************************************** + // ******************************************************** case WP_SABER: // WP_LIGHTSABER // Shouldn't get here, should go to TorsoAnimLightsaber break; - // ******************************************************** + // ******************************************************** case WP_BRYAR_PISTOL: - if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + if (pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY2, SETANIM_FLAG_NORMAL); } - else if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) - || PM_JumpingAnim( pm->ps->legsAnim ) - || PM_SwimmingAnim( pm->ps->legsAnim ) ) + else if (PM_RunningAnim(pm->ps->legsAnim) + || PM_WalkingAnim(pm->ps->legsAnim) + || PM_JumpingAnim(pm->ps->legsAnim) + || PM_SwimmingAnim(pm->ps->legsAnim)) {//running w/1-handed weapon uses full-body anim - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONIDLE2, SETANIM_FLAG_NORMAL); } break; case WP_BLASTER_PISTOL: - if ( pm->gent - && pm->gent->weaponModel[1] > 0 ) + if (pm->gent + && pm->gent->weaponModel[1] > 0) {//dual pistols - if ( weaponBusy ) + if (weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUNSIT1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_GUNSIT1, SETANIM_FLAG_NORMAL); } - else if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) - || PM_JumpingAnim( pm->ps->legsAnim ) - || PM_SwimmingAnim( pm->ps->legsAnim ) ) + else if (PM_RunningAnim(pm->ps->legsAnim) + || PM_WalkingAnim(pm->ps->legsAnim) + || PM_JumpingAnim(pm->ps->legsAnim) + || PM_SwimmingAnim(pm->ps->legsAnim)) {//running w/1-handed weapon uses full-body anim - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL); } } else {//single pistols - if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + if (pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY2, SETANIM_FLAG_NORMAL); } - else if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) - || PM_JumpingAnim( pm->ps->legsAnim ) - || PM_SwimmingAnim( pm->ps->legsAnim ) ) + else if (PM_RunningAnim(pm->ps->legsAnim) + || PM_WalkingAnim(pm->ps->legsAnim) + || PM_JumpingAnim(pm->ps->legsAnim) + || PM_SwimmingAnim(pm->ps->legsAnim)) {//running w/1-handed weapon uses full-body anim - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONIDLE2, SETANIM_FLAG_NORMAL); } } break; @@ -6835,36 +6834,36 @@ void PM_TorsoAnimation( void ) break; case WP_MELEE: - if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) - || PM_JumpingAnim( pm->ps->legsAnim ) - || PM_SwimmingAnim( pm->ps->legsAnim ) ) + if (PM_RunningAnim(pm->ps->legsAnim) + || PM_WalkingAnim(pm->ps->legsAnim) + || PM_JumpingAnim(pm->ps->legsAnim) + || PM_SwimmingAnim(pm->ps->legsAnim)) {//running w/1-handed weapon uses full-body anim - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR) {//ignore } - else if ( pm->gent && pm->gent->client && !PM_DroidMelee( pm->gent->client->NPC_class ) ) + else if (pm->gent && pm->gent->client && !PM_DroidMelee(pm->gent->client->NPC_class)) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND6, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL); } } break; case WP_TUSKEN_STAFF: - if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) - || PM_JumpingAnim( pm->ps->legsAnim ) - || PM_SwimmingAnim( pm->ps->legsAnim ) ) + if (PM_RunningAnim(pm->ps->legsAnim) + || PM_WalkingAnim(pm->ps->legsAnim) + || PM_JumpingAnim(pm->ps->legsAnim) + || PM_SwimmingAnim(pm->ps->legsAnim)) {//running w/1-handed weapon uses full-body anim - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { @@ -6873,124 +6872,124 @@ void PM_TorsoAnimation( void ) break; case WP_NOGHRI_STICK: - if ( weaponBusy ) + if (weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONIDLE3, SETANIM_FLAG_NORMAL); } break; case WP_BLASTER: - if ( weaponBusy ) + if (weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONIDLE3, SETANIM_FLAG_NORMAL); } break; case WP_DISRUPTOR: case WP_TUSKEN_RIFLE: - if ( (pm->ps->weaponstate != WEAPON_FIRING - && pm->ps->weaponstate != WEAPON_CHARGING - && pm->ps->weaponstate != WEAPON_CHARGING_ALT) - || PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) - || PM_JumpingAnim( pm->ps->legsAnim ) - || PM_SwimmingAnim( pm->ps->legsAnim ) ) + if ((pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT) + || PM_RunningAnim(pm->ps->legsAnim) + || PM_WalkingAnim(pm->ps->legsAnim) + || PM_JumpingAnim(pm->ps->legsAnim) + || PM_SwimmingAnim(pm->ps->legsAnim)) {//running sniper weapon uses normal ready - if ( pm->ps->clientNum ) + if (pm->ps->clientNum) { - PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL); } } else { - if ( pm->ps->clientNum ) + if (pm->ps->clientNum) { - PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL); } } break; case WP_BOT_LASER: - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONIDLE2, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); break; case WP_THERMAL: - if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) - || PM_JumpingAnim( pm->ps->legsAnim ) - || PM_SwimmingAnim( pm->ps->legsAnim ) ) + if (PM_RunningAnim(pm->ps->legsAnim) + || PM_WalkingAnim(pm->ps->legsAnim) + || PM_JumpingAnim(pm->ps->legsAnim) + || PM_SwimmingAnim(pm->ps->legsAnim)) {//running w/1-handed weapon uses full-body anim - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { - if ( weaponBusy ) + if (weaponBusy) { - PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONIDLE10, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONIDLE10, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL); } } break; case WP_REPEATER: - if ( weaponBusy ) + if (weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONIDLE3, SETANIM_FLAG_NORMAL); } break; case WP_TRIP_MINE: case WP_DET_PACK: - if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) - || PM_JumpingAnim( pm->ps->legsAnim ) - || PM_SwimmingAnim( pm->ps->legsAnim ) ) + if (PM_RunningAnim(pm->ps->legsAnim) + || PM_WalkingAnim(pm->ps->legsAnim) + || PM_JumpingAnim(pm->ps->legsAnim) + || PM_SwimmingAnim(pm->ps->legsAnim)) {//running w/1-handed weapon uses full-body anim - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); } else { - if ( weaponBusy ) + if (weaponBusy) { - PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONIDLE3, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONIDLE3, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL); } } break; default: - if ( weaponBusy ) + if (weaponBusy) { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONIDLE3, SETANIM_FLAG_NORMAL); } break; } @@ -7003,14 +7002,14 @@ void PM_TorsoAnimation( void ) // Anim checking utils //========================================================================= -int PM_GetTurnAnim( gentity_t *gent, int anim ) +int PM_GetTurnAnim(gentity_t *gent, int anim) { - if ( !gent ) + if (!gent) { return -1; } - switch( anim ) + switch (anim) { case BOTH_STAND1: //# Standing idle: no weapon: hands down case BOTH_STAND1IDLE1: //# Random standing idle @@ -7031,7 +7030,7 @@ int PM_GetTurnAnim( gentity_t *gent, int anim ) case BOTH_GESTURE2: //# Generic gesture: non-specific case BOTH_TALK1: //# Generic talk anim case BOTH_TALK2: //# Generic talk anim - if ( PM_HasAnimation( gent, LEGS_TURN1 ) ) + if (PM_HasAnimation(gent, LEGS_TURN1)) { return LEGS_TURN1; } @@ -7048,7 +7047,7 @@ int PM_GetTurnAnim( gentity_t *gent, int anim ) case BOTH_MELEE2: //# Second melee attack case BOTH_GUARD_LOOKAROUND1: //# Cradling weapon and looking around case BOTH_GUARD_IDLE1: //# Cradling weapon and standing - if ( PM_HasAnimation( gent, LEGS_TURN2 ) ) + if (PM_HasAnimation(gent, LEGS_TURN2)) { return LEGS_TURN2; } @@ -7063,18 +7062,18 @@ int PM_GetTurnAnim( gentity_t *gent, int anim ) } } -int PM_TurnAnimForLegsAnim( gentity_t *gent, int anim ) +int PM_TurnAnimForLegsAnim(gentity_t *gent, int anim) { - if ( !gent ) + if (!gent) { return -1; } - switch( anim ) + switch (anim) { case BOTH_STAND1: //# Standing idle: no weapon: hands down case BOTH_STAND1IDLE1: //# Random standing idle - if ( PM_HasAnimation( gent, BOTH_TURNSTAND1 ) ) + if (PM_HasAnimation(gent, BOTH_TURNSTAND1)) { return BOTH_TURNSTAND1; } @@ -7088,7 +7087,7 @@ int PM_TurnAnimForLegsAnim( gentity_t *gent, int anim ) case BOTH_SABERSLOW_STANCE: case BOTH_STAND2IDLE1: //# Random standing idle case BOTH_STAND2IDLE2: //# Random standing idle - if ( PM_HasAnimation( gent, BOTH_TURNSTAND2 ) ) + if (PM_HasAnimation(gent, BOTH_TURNSTAND2)) { return BOTH_TURNSTAND2; } @@ -7099,7 +7098,7 @@ int PM_TurnAnimForLegsAnim( gentity_t *gent, int anim ) break; case BOTH_STAND3: //# Standing hands behind back: at ease: etc. case BOTH_STAND3IDLE1: //# Random standing idle - if ( PM_HasAnimation( gent, BOTH_TURNSTAND3 ) ) + if (PM_HasAnimation(gent, BOTH_TURNSTAND3)) { return BOTH_TURNSTAND3; } @@ -7109,7 +7108,7 @@ int PM_TurnAnimForLegsAnim( gentity_t *gent, int anim ) } break; case BOTH_STAND4: //# two handed: gun down: relaxed stand - if ( PM_HasAnimation( gent, BOTH_TURNSTAND4 ) ) + if (PM_HasAnimation(gent, BOTH_TURNSTAND4)) { return BOTH_TURNSTAND4; } @@ -7120,7 +7119,7 @@ int PM_TurnAnimForLegsAnim( gentity_t *gent, int anim ) break; case BOTH_STAND5: //# standing idle, no weapon, hand down, back straight case BOTH_STAND5IDLE1: //# Random standing idle - if ( PM_HasAnimation( gent, BOTH_TURNSTAND5 ) ) + if (PM_HasAnimation(gent, BOTH_TURNSTAND5)) { return BOTH_TURNSTAND5; } @@ -7131,15 +7130,15 @@ int PM_TurnAnimForLegsAnim( gentity_t *gent, int anim ) break; case BOTH_CROUCH1: //# Transition from standing to crouch case BOTH_CROUCH1IDLE: //# Crouching idle - /* - case BOTH_UNCROUCH1: //# Transition from crouch to standing - case BOTH_CROUCH2TOSTAND1: //# going from crouch2 to stand1 - case BOTH_CROUCH3: //# Desann crouching down to Kyle (cin 9) - case BOTH_UNCROUCH3: //# Desann uncrouching down to Kyle (cin 9) - case BOTH_CROUCH4: //# Slower version of crouch1 for cinematics - case BOTH_UNCROUCH4: //# Slower version of uncrouch1 for cinematics - */ - if ( PM_HasAnimation( gent, BOTH_TURNCROUCH1 ) ) + /* + case BOTH_UNCROUCH1: //# Transition from crouch to standing + case BOTH_CROUCH2TOSTAND1: //# going from crouch2 to stand1 + case BOTH_CROUCH3: //# Desann crouching down to Kyle (cin 9) + case BOTH_UNCROUCH3: //# Desann uncrouching down to Kyle (cin 9) + case BOTH_CROUCH4: //# Slower version of crouch1 for cinematics + case BOTH_UNCROUCH4: //# Slower version of uncrouch1 for cinematics + */ + if (PM_HasAnimation(gent, BOTH_TURNCROUCH1)) { return BOTH_TURNCROUCH1; } @@ -7154,9 +7153,9 @@ int PM_TurnAnimForLegsAnim( gentity_t *gent, int anim ) } } -qboolean PM_InOnGroundAnim ( playerState_t *ps ) +qboolean PM_InOnGroundAnim(playerState_t *ps) { - switch( ps->legsAnim ) + switch (ps->legsAnim) { case BOTH_DEAD1: case BOTH_DEAD2: @@ -7179,21 +7178,21 @@ qboolean PM_InOnGroundAnim ( playerState_t *ps ) case BOTH_KNOCKDOWN5: //# case BOTH_LK_DL_ST_T_SB_1_L: case BOTH_RELEASED: - if ( ps->legsAnimTimer < 500 ) + if (ps->legsAnimTimer < 500) {//pretty much horizontal by this point return qtrue; } break; case BOTH_PLAYER_PA_3_FLY: - if ( ps->legsAnimTimer < 300 ) + if (ps->legsAnimTimer < 300) {//pretty much horizontal by this point return qtrue; } /* - else if ( ps->clientNum < MAX_CLIENTS - && ps->legsAnimTimer < 300 + PLAYER_KNOCKDOWN_HOLD_EXTRA_TIME ) + else if ( ps->clientNum < MAX_CLIENTS + && ps->legsAnimTimer < 300 + PLAYER_KNOCKDOWN_HOLD_EXTRA_TIME ) { - return qtrue; + return qtrue; } */ break; @@ -7212,7 +7211,7 @@ qboolean PM_InOnGroundAnim ( playerState_t *ps ) case BOTH_FORCE_GETUP_B4: case BOTH_FORCE_GETUP_B5: case BOTH_FORCE_GETUP_B6: - if ( ps->legsAnimTimer > PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)ps->legsAnim )-400 ) + if (ps->legsAnimTimer > PM_AnimLength(g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)ps->legsAnim) - 400) {//still pretty much horizontal at this point return qtrue; } @@ -7222,9 +7221,9 @@ qboolean PM_InOnGroundAnim ( playerState_t *ps ) return qfalse; } -qboolean PM_InSpecialDeathAnim( int anim ) +qboolean PM_InSpecialDeathAnim(int anim) { - switch( pm->ps->legsAnim ) + switch (pm->ps->legsAnim) { case BOTH_DEATH_ROLL: //# Death anim from a roll case BOTH_DEATH_FLIP: //# Death anim from a flip @@ -7244,9 +7243,9 @@ qboolean PM_InSpecialDeathAnim( int anim ) } } -qboolean PM_InDeathAnim ( void ) +qboolean PM_InDeathAnim(void) {//Purposely does not cover stumbledeath and falldeath... - switch( pm->ps->legsAnim ) + switch (pm->ps->legsAnim) { case BOTH_DEATH1: //# First Death anim case BOTH_DEATH2: //# Second Death anim @@ -7288,7 +7287,7 @@ qboolean PM_InDeathAnim ( void ) case BOTH_FALLDEATH1: //# Fall forward off a high cliff and splat death - start case BOTH_FALLDEATH1INAIR: //# Fall forward off a high cliff and splat death - loop case BOTH_FALLDEATH1LAND: //# Fall forward off a high cliff and splat death - hit bottom - //# #sep case BOTH_ DEAD POSES # Should be last frame of corresponding previous anims + //# #sep case BOTH_ DEAD POSES # Should be last frame of corresponding previous anims case BOTH_DEAD1: //# First Death finished pose case BOTH_DEAD2: //# Second Death finished pose case BOTH_DEAD3: //# Third Death finished pose @@ -7321,7 +7320,7 @@ qboolean PM_InDeathAnim ( void ) case BOTH_LYINGDEAD1: //# Killed lying down death finished pose case BOTH_STUMBLEDEAD1: //# Stumble forward death finished pose case BOTH_FALLDEAD1LAND: //# Fall forward and splat death finished pose - //# #sep case BOTH_ DEAD TWITCH/FLOP # React to being shot from death poses + //# #sep case BOTH_ DEAD TWITCH/FLOP # React to being shot from death poses case BOTH_DEADFLOP1: //# React to being shot from First Death finished pose case BOTH_DEADFLOP2: //# React to being shot from Second Death finished pose case BOTH_DISMEMBER_HEAD1: //# @@ -7333,14 +7332,14 @@ qboolean PM_InDeathAnim ( void ) return qtrue; break; default: - return PM_InSpecialDeathAnim( pm->ps->legsAnim ); + return PM_InSpecialDeathAnim(pm->ps->legsAnim); break; } } -qboolean PM_InCartwheel( int anim ) +qboolean PM_InCartwheel(int anim) { - switch ( anim ) + switch (anim) { case BOTH_ARIAL_LEFT: case BOTH_ARIAL_RIGHT: @@ -7353,9 +7352,9 @@ qboolean PM_InCartwheel( int anim ) return qfalse; } -qboolean PM_InButterfly( int anim ) +qboolean PM_InButterfly(int anim) { - switch ( anim ) + switch (anim) { case BOTH_BUTTERFLY_LEFT: case BOTH_BUTTERFLY_RIGHT: @@ -7367,9 +7366,9 @@ qboolean PM_InButterfly( int anim ) return qfalse; } -qboolean PM_StandingAnim( int anim ) +qboolean PM_StandingAnim(int anim) {//NOTE: does not check idles or special (cinematic) stands - switch ( anim ) + switch (anim) { case BOTH_STAND1: case BOTH_STAND2: @@ -7382,9 +7381,9 @@ qboolean PM_StandingAnim( int anim ) return qfalse; } -qboolean PM_InAirKickingAnim( int anim ) +qboolean PM_InAirKickingAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_A7_KICK_F_AIR: case BOTH_A7_KICK_B_AIR: @@ -7395,9 +7394,9 @@ qboolean PM_InAirKickingAnim( int anim ) return qfalse; } -qboolean PM_KickingAnim( int anim ) +qboolean PM_KickingAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_A7_KICK_F: case BOTH_A7_KICK_B: @@ -7406,9 +7405,9 @@ qboolean PM_KickingAnim( int anim ) case BOTH_A7_KICK_S: case BOTH_A7_KICK_BF: case BOTH_A7_KICK_RL: - //NOT a kick, but acts like one: + //NOT a kick, but acts like one: case BOTH_A7_HILT: - //NOT kicks, but do kick traces anyway + //NOT kicks, but do kick traces anyway case BOTH_GETUP_BROLL_B: case BOTH_GETUP_BROLL_F: case BOTH_GETUP_FROLL_B: @@ -7416,15 +7415,15 @@ qboolean PM_KickingAnim( int anim ) return qtrue; break; default: - return PM_InAirKickingAnim( anim ); + return PM_InAirKickingAnim(anim); break; } //return qfalse; } -qboolean PM_StabDownAnim( int anim ) +qboolean PM_StabDownAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_STABDOWN: case BOTH_STABDOWN_STAFF: @@ -7434,23 +7433,23 @@ qboolean PM_StabDownAnim( int anim ) return qfalse; } -qboolean PM_GoingToAttackDown( playerState_t *ps ) +qboolean PM_GoingToAttackDown(playerState_t *ps) { - if ( PM_StabDownAnim( ps->torsoAnim )//stabbing downward + if (PM_StabDownAnim(ps->torsoAnim)//stabbing downward || ps->saberMove == LS_A_LUNGE//lunge || ps->saberMove == LS_A_JUMP_T__B_//death from above || ps->saberMove == LS_A_T2B//attacking top to bottom || ps->saberMove == LS_S_T2B//starting at attack downward - || (PM_SaberInTransition( ps->saberMove ) && saberMoveData[ps->saberMove].endQuad == Q_T) )//transitioning to a top to bottom attack + || (PM_SaberInTransition(ps->saberMove) && saberMoveData[ps->saberMove].endQuad == Q_T))//transitioning to a top to bottom attack { return qtrue; } return qfalse; } - -qboolean PM_ForceUsingSaberAnim( int anim ) + +qboolean PM_ForceUsingSaberAnim(int anim) {//saber/acrobatic anims that should prevent you from recharging force power while you're in them... - switch ( anim ) + switch (anim) { case BOTH_JUMPFLIPSLASHDOWN1: case BOTH_JUMPFLIPSTABDOWN: @@ -7491,51 +7490,51 @@ qboolean PM_ForceUsingSaberAnim( int anim ) case BOTH_BUTTERFLY_FR1: case BOTH_WALL_RUN_RIGHT: case BOTH_WALL_RUN_RIGHT_FLIP: - case BOTH_WALL_RUN_RIGHT_STOP: + case BOTH_WALL_RUN_RIGHT_STOP: case BOTH_WALL_RUN_LEFT: case BOTH_WALL_RUN_LEFT_FLIP: - case BOTH_WALL_RUN_LEFT_STOP: + case BOTH_WALL_RUN_LEFT_STOP: case BOTH_WALL_FLIP_RIGHT: case BOTH_WALL_FLIP_LEFT: - case BOTH_FORCEJUMP1: - case BOTH_FORCEINAIR1: - case BOTH_FORCELAND1: - case BOTH_FORCEJUMPBACK1: - case BOTH_FORCEINAIRBACK1: - case BOTH_FORCELANDBACK1: - case BOTH_FORCEJUMPLEFT1: - case BOTH_FORCEINAIRLEFT1: - case BOTH_FORCELANDLEFT1: - case BOTH_FORCEJUMPRIGHT1: - case BOTH_FORCEINAIRRIGHT1: - case BOTH_FORCELANDRIGHT1: - case BOTH_FLIP_F: - case BOTH_FLIP_B: - case BOTH_FLIP_L: - case BOTH_FLIP_R: + case BOTH_FORCEJUMP1: + case BOTH_FORCEINAIR1: + case BOTH_FORCELAND1: + case BOTH_FORCEJUMPBACK1: + case BOTH_FORCEINAIRBACK1: + case BOTH_FORCELANDBACK1: + case BOTH_FORCEJUMPLEFT1: + case BOTH_FORCEINAIRLEFT1: + case BOTH_FORCELANDLEFT1: + case BOTH_FORCEJUMPRIGHT1: + case BOTH_FORCEINAIRRIGHT1: + case BOTH_FORCELANDRIGHT1: + case BOTH_FLIP_F: + case BOTH_FLIP_B: + case BOTH_FLIP_L: + case BOTH_FLIP_R: case BOTH_ALORA_FLIP_1: case BOTH_ALORA_FLIP_2: case BOTH_ALORA_FLIP_3: - case BOTH_DODGE_FL: - case BOTH_DODGE_FR: - case BOTH_DODGE_BL: - case BOTH_DODGE_BR: - case BOTH_DODGE_L: - case BOTH_DODGE_R: + case BOTH_DODGE_FL: + case BOTH_DODGE_FR: + case BOTH_DODGE_BL: + case BOTH_DODGE_BR: + case BOTH_DODGE_L: + case BOTH_DODGE_R: case BOTH_DODGE_HOLD_FL: case BOTH_DODGE_HOLD_FR: case BOTH_DODGE_HOLD_BL: case BOTH_DODGE_HOLD_BR: case BOTH_DODGE_HOLD_L: case BOTH_DODGE_HOLD_R: - case BOTH_FORCE_GETUP_F1: - case BOTH_FORCE_GETUP_F2: - case BOTH_FORCE_GETUP_B1: - case BOTH_FORCE_GETUP_B2: - case BOTH_FORCE_GETUP_B3: - case BOTH_FORCE_GETUP_B4: - case BOTH_FORCE_GETUP_B5: - case BOTH_FORCE_GETUP_B6: + case BOTH_FORCE_GETUP_F1: + case BOTH_FORCE_GETUP_F2: + case BOTH_FORCE_GETUP_B1: + case BOTH_FORCE_GETUP_B2: + case BOTH_FORCE_GETUP_B3: + case BOTH_FORCE_GETUP_B4: + case BOTH_FORCE_GETUP_B5: + case BOTH_FORCE_GETUP_B6: case BOTH_GETUP_BROLL_B: case BOTH_GETUP_BROLL_F: case BOTH_GETUP_BROLL_L: @@ -7544,11 +7543,11 @@ qboolean PM_ForceUsingSaberAnim( int anim ) case BOTH_GETUP_FROLL_F: case BOTH_GETUP_FROLL_L: case BOTH_GETUP_FROLL_R: - case BOTH_WALL_FLIP_BACK1: - case BOTH_WALL_FLIP_BACK2: - case BOTH_SPIN1: - case BOTH_FJSS_TR_BL: - case BOTH_FJSS_TL_BR: + case BOTH_WALL_FLIP_BACK1: + case BOTH_WALL_FLIP_BACK2: + case BOTH_SPIN1: + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: case BOTH_DEFLECTSLASH__R__L_FIN: case BOTH_ARIAL_F1: return qtrue; @@ -7556,22 +7555,22 @@ qboolean PM_ForceUsingSaberAnim( int anim ) return qfalse; } -qboolean G_HasKnockdownAnims( gentity_t *ent ) +qboolean G_HasKnockdownAnims(gentity_t *ent) { - if ( PM_HasAnimation( ent, BOTH_KNOCKDOWN1 ) - && PM_HasAnimation( ent, BOTH_KNOCKDOWN2 ) - && PM_HasAnimation( ent, BOTH_KNOCKDOWN3 ) - && PM_HasAnimation( ent, BOTH_KNOCKDOWN4 ) - && PM_HasAnimation( ent, BOTH_KNOCKDOWN5 ) ) + if (PM_HasAnimation(ent, BOTH_KNOCKDOWN1) + && PM_HasAnimation(ent, BOTH_KNOCKDOWN2) + && PM_HasAnimation(ent, BOTH_KNOCKDOWN3) + && PM_HasAnimation(ent, BOTH_KNOCKDOWN4) + && PM_HasAnimation(ent, BOTH_KNOCKDOWN5)) { return qtrue; } return qfalse; } -qboolean PM_InAttackRoll( int anim ) +qboolean PM_InAttackRoll(int anim) { - switch ( anim ) + switch (anim) { case BOTH_GETUP_BROLL_B: case BOTH_GETUP_BROLL_F: @@ -7582,9 +7581,9 @@ qboolean PM_InAttackRoll( int anim ) return qfalse; } -qboolean PM_LockedAnim( int anim ) +qboolean PM_LockedAnim(int anim) {//anims that can *NEVER* be overridden, regardless - switch ( anim ) + switch (anim) { case BOTH_KYLE_PA_1: case BOTH_KYLE_PA_2: @@ -7598,7 +7597,7 @@ qboolean PM_LockedAnim( int anim ) case BOTH_SCEPTER_START: case BOTH_SCEPTER_HOLD: case BOTH_SCEPTER_STOP: - //grabbed by wampa + //grabbed by wampa case BOTH_GRABBED: //# case BOTH_RELEASED: //# when Wampa drops player, transitions into fall on back case BOTH_HANG_IDLE: //# @@ -7609,9 +7608,9 @@ qboolean PM_LockedAnim( int anim ) return qfalse; } -qboolean PM_SuperBreakLoseAnim( int anim ) +qboolean PM_SuperBreakLoseAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_LK_S_DL_S_SB_1_L: //super break I lost case BOTH_LK_S_DL_T_SB_1_L: //super break I lost @@ -7637,9 +7636,9 @@ qboolean PM_SuperBreakLoseAnim( int anim ) return qfalse; } -qboolean PM_SuperBreakWinAnim( int anim ) +qboolean PM_SuperBreakWinAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_LK_S_DL_S_SB_1_W: //super break I won case BOTH_LK_S_DL_T_SB_1_W: //super break I won @@ -7665,9 +7664,9 @@ qboolean PM_SuperBreakWinAnim( int anim ) return qfalse; } -qboolean PM_SaberLockBreakAnim( int anim ) +qboolean PM_SaberLockBreakAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_BF1BREAK: case BOTH_BF2BREAK: @@ -7709,15 +7708,15 @@ qboolean PM_SaberLockBreakAnim( int anim ) case BOTH_LK_ST_S_S_B_1_W: //normal break I won case BOTH_LK_ST_S_T_B_1_L: //normal break I lost case BOTH_LK_ST_S_T_B_1_W: //normal break I won - return (PM_SuperBreakLoseAnim(anim)||PM_SuperBreakWinAnim(anim)); + return (PM_SuperBreakLoseAnim(anim) || PM_SuperBreakWinAnim(anim)); break; } return qfalse; } -qboolean PM_GetupAnimNoMove( int legsAnim ) +qboolean PM_GetupAnimNoMove(int legsAnim) { - switch( legsAnim ) + switch (legsAnim) { case BOTH_GETUP1: case BOTH_GETUP2: @@ -7739,59 +7738,59 @@ qboolean PM_GetupAnimNoMove( int legsAnim ) return qfalse; } -qboolean PM_KnockDownAnim( int anim ) +qboolean PM_KnockDownAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_KNOCKDOWN1: case BOTH_KNOCKDOWN2: case BOTH_KNOCKDOWN3: case BOTH_KNOCKDOWN4: case BOTH_KNOCKDOWN5: - /* - //special anims: - case BOTH_RELEASED: - case BOTH_LK_DL_ST_T_SB_1_L: - case BOTH_PLAYER_PA_3_FLY: - */ + /* + //special anims: + case BOTH_RELEASED: + case BOTH_LK_DL_ST_T_SB_1_L: + case BOTH_PLAYER_PA_3_FLY: + */ return qtrue; break; - /* - default: + /* + default: return PM_InGetUp( ps ); break; - */ + */ } return qfalse; } -qboolean PM_KnockDownAnimExtended( int anim ) +qboolean PM_KnockDownAnimExtended(int anim) { - switch ( anim ) + switch (anim) { case BOTH_KNOCKDOWN1: case BOTH_KNOCKDOWN2: case BOTH_KNOCKDOWN3: case BOTH_KNOCKDOWN4: case BOTH_KNOCKDOWN5: - //special anims: + //special anims: case BOTH_RELEASED: case BOTH_LK_DL_ST_T_SB_1_L: case BOTH_PLAYER_PA_3_FLY: return qtrue; break; - /* - default: + /* + default: return PM_InGetUp( ps ); break; - */ + */ } return qfalse; } -qboolean PM_SaberInKata( saberMoveName_t saberMove ) +qboolean PM_SaberInKata(saberMoveName_t saberMove) { - switch ( saberMove ) + switch (saberMove) { case LS_A1_SPECIAL: case LS_A2_SPECIAL: @@ -7805,20 +7804,20 @@ qboolean PM_SaberInKata( saberMoveName_t saberMove ) return qfalse; } -qboolean PM_CanRollFromSoulCal( playerState_t *ps ) +qboolean PM_CanRollFromSoulCal(playerState_t *ps) { - if ( ps->legsAnim == BOTH_A7_SOULCAL + if (ps->legsAnim == BOTH_A7_SOULCAL && ps->legsAnimTimer < 700 - && ps->legsAnimTimer > 250 ) + && ps->legsAnimTimer > 250) { return qtrue; } return qfalse; } -qboolean BG_FullBodyTauntAnim( int anim ) +qboolean BG_FullBodyTauntAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_GESTURE1: case BOTH_DUAL_TAUNT: diff --git a/code/game/bg_panimate.cpp.BACKUP.8780.cpp b/code/game/bg_panimate.cpp.BACKUP.8780.cpp new file mode 100644 index 0000000000..ae4457a533 --- /dev/null +++ b/code/game/bg_panimate.cpp.BACKUP.8780.cpp @@ -0,0 +1,7964 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#include "common_headers.h" + + +// define GAME_INCLUDE so that g_public.h does not define the +// short, server-visible gclient_t and gentity_t structures, +// because we define the full size ones in this file +#define GAME_INCLUDE + +#include "../qcommon/q_shared.h" +#include "g_shared.h" +#include "bg_local.h" +#include "../cgame/cg_local.h" +#include "anims.h" +#include "Q3_Interface.h" +#include "g_local.h" +#include "wp_saber.h" +#include "g_vehicles.h" + +extern pmove_t *pm; +extern pml_t pml; +extern cvar_t *g_ICARUSDebug; +extern cvar_t *g_timescale; +extern cvar_t *g_synchSplitAnims; +extern cvar_t *g_AnimWarning; +extern cvar_t *g_noFootSlide; +extern cvar_t *g_noFootSlideRunScale; +extern cvar_t *g_noFootSlideWalkScale; +extern cvar_t *g_saberAnimSpeed; +extern cvar_t *g_saberAutoAim; +extern cvar_t *g_speederControlScheme; +extern cvar_t *g_saberNewControlScheme; +extern cvar_t *g_saberNewCombat; + +extern qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f ); +extern void WP_ForcePowerDrain( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); +extern qboolean ValidAnimFileIndex ( int index ); +extern qboolean PM_ControlledByPlayer( void ); +extern qboolean PM_DroidMelee( int npc_class ); +extern qboolean PM_PainAnim( int anim ); +extern qboolean PM_JumpingAnim( int anim ); +extern qboolean PM_FlippingAnim( int anim ); +extern qboolean PM_RollingAnim( int anim ); +extern qboolean PM_SwimmingAnim( int anim ); +extern qboolean PM_InKnockDown( playerState_t *ps ); +extern qboolean PM_InRoll( playerState_t *ps ); +extern qboolean PM_DodgeAnim( int anim ); +extern qboolean PM_InSlopeAnim( int anim ); +extern qboolean PM_ForceAnim( int anim ); +extern qboolean PM_InKnockDownOnGround( playerState_t *ps ); +extern qboolean PM_InSpecialJump( int anim ); +extern qboolean PM_RunningAnim( int anim ); +extern qboolean PM_WalkingAnim( int anim ); +extern qboolean PM_SwimmingAnim( int anim ); +extern qboolean PM_JumpingAnim( int anim ); +extern qboolean PM_SaberStanceAnim( int anim ); +extern qboolean PM_SaberDrawPutawayAnim( int anim ); +extern void PM_SetJumped( float height, qboolean force ); +extern qboolean PM_InGetUpNoRoll( playerState_t *ps ); +extern qboolean PM_CrouchAnim( int anim ); +extern qboolean G_TryingKataAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingCartwheel( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingSpecial( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingJumpAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingJumpForwardAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingLungeAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingPullAttack( gentity_t *self, usercmd_t *cmd, qboolean amPulling ); +extern qboolean G_InCinematicSaberAnim( gentity_t *self ); +extern qboolean G_ControlledByPlayer( gentity_t *self ); + +extern int g_crosshairEntNum; + +int PM_AnimLength( int index, animNumber_t anim ); +qboolean PM_LockedAnim( int anim ); +qboolean PM_StandingAnim( int anim ); +qboolean PM_InOnGroundAnim ( playerState_t *ps ); +qboolean PM_SuperBreakWinAnim( int anim ); +qboolean PM_SuperBreakLoseAnim( int anim ); +qboolean PM_LockedAnim( int anim ); +saberMoveName_t PM_SaberFlipOverAttackMove( void ); +qboolean PM_CheckFlipOverAttackMove( qboolean checkEnemy ); +saberMoveName_t PM_SaberJumpForwardAttackMove( void ); +qboolean PM_CheckJumpForwardAttackMove( void ); +saberMoveName_t PM_SaberBackflipAttackMove( void ); +qboolean PM_CheckBackflipAttackMove( void ); +saberMoveName_t PM_SaberDualJumpAttackMove( void ); +qboolean PM_CheckDualJumpAttackMove( void ); +saberMoveName_t PM_SaberLungeAttackMove( qboolean fallbackToNormalLunge ); +qboolean PM_CheckLungeAttackMove( void ); +// Okay, here lies the much-dreaded Pat-created FSM movement chart... Heretic II strikes again! +// Why am I inflicting this on you? Well, it's better than hardcoded states. +// Ideally this will be replaced with an external file or more sophisticated move-picker +// once the game gets out of prototype stage. + +// Silly, but I'm replacing these macros so they are shorter! +#define AFLAG_IDLE (SETANIM_FLAG_NORMAL) +#define AFLAG_ACTIVE (SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_HOLDLESS) +#define AFLAG_WAIT (SETANIM_FLAG_HOLD | SETANIM_FLAG_HOLDLESS) +#define AFLAG_FINISH (SETANIM_FLAG_HOLD) + +//FIXME: add the alternate anims for each style? +saberMoveData_t saberMoveData[LS_MOVE_MAX] = {// NB:randomized + // name anim(do all styles?)startQ endQ setanimflag blend, blocking chain_idle chain_attack trailLen + {"None", BOTH_STAND1, Q_R, Q_R, AFLAG_IDLE, 350, BLK_NO, LS_NONE, LS_NONE, 0 }, // LS_NONE = 0, + + // General movements with saber + {"Ready", BOTH_STAND2, Q_R, Q_R, AFLAG_IDLE, 350, BLK_WIDE, LS_READY, LS_S_R2L, 0 }, // LS_READY, + {"Draw", BOTH_STAND1TO2, Q_R, Q_R, AFLAG_FINISH, 350, BLK_NO, LS_READY, LS_S_R2L, 0 }, // LS_DRAW, + {"Putaway", BOTH_STAND2TO1, Q_R, Q_R, AFLAG_FINISH, 350, BLK_NO, LS_READY, LS_S_R2L, 0 }, // LS_PUTAWAY, + + // Attacks + //UL2LR + {"TL2BR Att", BOTH_A1_TL_BR, Q_TL, Q_BR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_TL2BR, LS_R_TL2BR, 200 }, // LS_A_TL2BR + //SLASH LEFT + {"L2R Att", BOTH_A1__L__R, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_L2R, LS_R_L2R, 200 }, // LS_A_L2R + //LL2UR + {"BL2TR Att", BOTH_A1_BL_TR, Q_BL, Q_TR, AFLAG_ACTIVE, 50, BLK_TIGHT, LS_R_BL2TR, LS_R_BL2TR, 200 }, // LS_A_BL2TR + //LR2UL + {"BR2TL Att", BOTH_A1_BR_TL, Q_BR, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_BR2TL, LS_R_BR2TL, 200 }, // LS_A_BR2TL + //SLASH RIGHT + {"R2L Att", BOTH_A1__R__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_R2L, LS_R_R2L, 200 },// LS_A_R2L + //UR2LL + {"TR2BL Att", BOTH_A1_TR_BL, Q_TR, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_TR2BL, LS_R_TR2BL, 200 }, // LS_A_TR2BL + //SLASH DOWN + {"T2B Att", BOTH_A1_T__B_, Q_T, Q_B, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_T2B, LS_R_T2B, 200 }, // LS_A_T2B + //special attacks + {"Back Stab", BOTH_A2_STABBACK1, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACKSTAB + {"Back Att", BOTH_ATTACK_BACK, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACK + {"CR Back Att", BOTH_CROUCHATTACKBACK1,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACK_CR + {"RollStab", BOTH_ROLL_STAB, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_ROLL_STAB + {"Lunge Att", BOTH_LUNGE2_B__T_, Q_B, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_LUNGE + {"Jump Att", BOTH_FORCELEAP2_T__B_,Q_T, Q_B, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_JUMP_T__B_ + {"Flip Stab", BOTH_JUMPFLIPSTABDOWN,Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_T___R, 200 }, // LS_A_FLIP_STAB + {"Flip Slash", BOTH_JUMPFLIPSLASHDOWN1,Q_L,Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R_T_, 200 }, // LS_A_FLIP_SLASH + {"DualJump Atk",BOTH_JUMPATTACK6, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_BL_TR, 200 }, // LS_JUMPATTACK_DUAL + + {"DualJumpAtkL_A",BOTH_ARIAL_LEFT, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_A_TL2BR, 200 }, // LS_JUMPATTACK_ARIAL_LEFT + {"DualJumpAtkR_A",BOTH_ARIAL_RIGHT, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_A_TR2BL, 200 }, // LS_JUMPATTACK_ARIAL_RIGHT + + {"DualJumpAtkL_A",BOTH_CARTWHEEL_LEFT, Q_R,Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_TL_BR, 200 }, // LS_JUMPATTACK_CART_LEFT + {"DualJumpAtkR_A",BOTH_CARTWHEEL_RIGHT, Q_R,Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_TR_BL, 200 }, // LS_JUMPATTACK_CART_RIGHT + + {"DualJumpAtkLStaff", BOTH_BUTTERFLY_FL1,Q_R,Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__L__R, 200 }, // LS_JUMPATTACK_STAFF_LEFT + {"DualJumpAtkRStaff", BOTH_BUTTERFLY_FR1,Q_R,Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R__L, 200 }, // LS_JUMPATTACK_STAFF_RIGHT + + {"ButterflyLeft", BOTH_BUTTERFLY_LEFT,Q_R,Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__L__R, 200 }, // LS_BUTTERFLY_LEFT + {"ButterflyRight", BOTH_BUTTERFLY_RIGHT,Q_R,Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R__L, 200 }, // LS_BUTTERFLY_RIGHT + + {"BkFlip Atk", BOTH_JUMPATTACK7, Q_B, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_T___R, 200 }, // LS_A_BACKFLIP_ATK + {"DualSpinAtk", BOTH_SPINATTACK6, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK_DUAL + {"StfSpinAtk", BOTH_SPINATTACK7, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK + {"LngLeapAtk", BOTH_FORCELONGLEAP_ATTACK,Q_R,Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_LEAP_ATTACK + {"SwoopAtkR", BOTH_VS_ATR_S, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 200 }, // LS_SWOOP_ATTACK_RIGHT + {"SwoopAtkL", BOTH_VS_ATL_S, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 200 }, // LS_SWOOP_ATTACK_LEFT + {"TauntaunAtkR",BOTH_VT_ATR_S, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_TAUNTAUN_ATTACK_RIGHT + {"TauntaunAtkL",BOTH_VT_ATL_S, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_TAUNTAUN_ATTACK_LEFT + {"StfKickFwd", BOTH_A7_KICK_F, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_F + {"StfKickBack", BOTH_A7_KICK_B, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_B + {"StfKickRight",BOTH_A7_KICK_R, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_R + {"StfKickLeft", BOTH_A7_KICK_L, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_L + {"StfKickSpin", BOTH_A7_KICK_S, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_S + {"StfKickBkFwd",BOTH_A7_KICK_BF, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_BF + {"StfKickSplit",BOTH_A7_KICK_RL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_RL + {"StfKickFwdAir",BOTH_A7_KICK_F_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_F_AIR + {"StfKickBackAir",BOTH_A7_KICK_B_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_B_AIR + {"StfKickRightAir",BOTH_A7_KICK_R_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_R_AIR + {"StfKickLeftAir",BOTH_A7_KICK_L_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_L_AIR + {"StabDown", BOTH_STABDOWN, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN + {"StabDownStf", BOTH_STABDOWN_STAFF,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN_STAFF + {"StabDownDual",BOTH_STABDOWN_DUAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN_DUAL + {"dualspinprot",BOTH_A6_SABERPROTECT,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 500 }, // LS_DUAL_SPIN_PROTECT + {"StfSoulCal", BOTH_A7_SOULCAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 500 }, // LS_STAFF_SOULCAL + {"specialfast", BOTH_A1_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000}, // LS_A1_SPECIAL + {"specialmed", BOTH_A2_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000}, // LS_A2_SPECIAL + {"specialstr", BOTH_A3_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000}, // LS_A3_SPECIAL + {"upsidedwnatk",BOTH_FLIP_ATTACK7, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200}, // LS_UPSIDE_DOWN_ATTACK + {"pullatkstab", BOTH_PULL_IMPALE_STAB,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200}, // LS_PULL_ATTACK_STAB + {"pullatkswing",BOTH_PULL_IMPALE_SWING,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200}, // LS_PULL_ATTACK_SWING + {"AloraSpinAtk",BOTH_ALORA_SPIN_SLASH,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK_ALORA + {"Dual FB Atk", BOTH_A6_FB, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_DUAL_FB + {"Dual LR Atk", BOTH_A6_LR, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_DUAL_LR + {"StfHiltBash", BOTH_A7_HILT, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_HILT_BASH + + //starts + {"TL2BR St", BOTH_S1_S1_TL, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_TL2BR, LS_A_TL2BR, 200 }, // LS_S_TL2BR + {"L2R St", BOTH_S1_S1__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_L2R, LS_A_L2R, 200 }, // LS_S_L2R + {"BL2TR St", BOTH_S1_S1_BL, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_BL2TR, LS_A_BL2TR, 200 }, // LS_S_BL2TR + {"BR2TL St", BOTH_S1_S1_BR, Q_R, Q_BR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_BR2TL, LS_A_BR2TL, 200 }, // LS_S_BR2TL + {"R2L St", BOTH_S1_S1__R, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_R2L, LS_A_R2L, 200 }, // LS_S_R2L + {"TR2BL St", BOTH_S1_S1_TR, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_TR2BL, LS_A_TR2BL, 200 }, // LS_S_TR2BL + {"T2B St", BOTH_S1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_T2B, LS_A_T2B, 200 }, // LS_S_T2B + + //returns + {"TL2BR Ret", BOTH_R1_BR_S1, Q_BR, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_TL2BR + {"L2R Ret", BOTH_R1__R_S1, Q_R, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_L2R + {"BL2TR Ret", BOTH_R1_TR_S1, Q_TR, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_BL2TR + {"BR2TL Ret", BOTH_R1_TL_S1, Q_TL, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_BR2TL + {"R2L Ret", BOTH_R1__L_S1, Q_L, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_R2L + {"TR2BL Ret", BOTH_R1_BL_S1, Q_BL, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_TR2BL + {"T2B Ret", BOTH_R1_B__S1, Q_B, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_T2B + + //Transitions + {"BR2R Trans", BOTH_T1_BR__R, Q_BR, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc bottom right to right + {"BR2TR Trans", BOTH_T1_BR_TR, Q_BR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc bottom right to top right (use: BOTH_T1_TR_BR) + {"BR2T Trans", BOTH_T1_BR_T_, Q_BR, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc bottom right to top (use: BOTH_T1_T__BR) + {"BR2TL Trans", BOTH_T1_BR_TL, Q_BR, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast weak spin bottom right to top left + {"BR2L Trans", BOTH_T1_BR__L, Q_BR, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast weak spin bottom right to left + {"BR2BL Trans", BOTH_T1_BR_BL, Q_BR, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin bottom right to bottom left + {"R2BR Trans", BOTH_T1__R_BR, Q_R, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc right to bottom right (use: BOTH_T1_BR__R) + {"R2TR Trans", BOTH_T1__R_TR, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc right to top right + {"R2T Trans", BOTH_T1__R_T_, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast ar right to top (use: BOTH_T1_T___R) + {"R2TL Trans", BOTH_T1__R_TL, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc right to top left + {"R2L Trans", BOTH_T1__R__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast weak spin right to left + {"R2BL Trans", BOTH_T1__R_BL, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin right to bottom left + {"TR2BR Trans", BOTH_T1_TR_BR, Q_TR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc top right to bottom right + {"TR2R Trans", BOTH_T1_TR__R, Q_TR, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top right to right (use: BOTH_T1__R_TR) + {"TR2T Trans", BOTH_T1_TR_T_, Q_TR, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc top right to top (use: BOTH_T1_T__TR) + {"TR2TL Trans", BOTH_T1_TR_TL, Q_TR, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc top right to top left + {"TR2L Trans", BOTH_T1_TR__L, Q_TR, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top right to left + {"TR2BL Trans", BOTH_T1_TR_BL, Q_TR, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin top right to bottom left + {"T2BR Trans", BOTH_T1_T__BR, Q_T, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc top to bottom right + {"T2R Trans", BOTH_T1_T___R, Q_T, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top to right + {"T2TR Trans", BOTH_T1_T__TR, Q_T, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc top to top right + {"T2TL Trans", BOTH_T1_T__TL, Q_T, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc top to top left + {"T2L Trans", BOTH_T1_T___L, Q_T, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top to left + {"T2BL Trans", BOTH_T1_T__BL, Q_T, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc top to bottom left + {"TL2BR Trans", BOTH_T1_TL_BR, Q_TL, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin top left to bottom right + {"TL2R Trans", BOTH_T1_TL__R, Q_TL, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top left to right (use: BOTH_T1__R_TL) + {"TL2TR Trans", BOTH_T1_TL_TR, Q_TL, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc top left to top right (use: BOTH_T1_TR_TL) + {"TL2T Trans", BOTH_T1_TL_T_, Q_TL, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc top left to top (use: BOTH_T1_T__TL) + {"TL2L Trans", BOTH_T1_TL__L, Q_TL, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top left to left (use: BOTH_T1__L_TL) + {"TL2BL Trans", BOTH_T1_TL_BL, Q_TL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc top left to bottom left + {"L2BR Trans", BOTH_T1__L_BR, Q_L, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin left to bottom right + {"L2R Trans", BOTH_T1__L__R, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast weak spin left to right + {"L2TR Trans", BOTH_T1__L_TR, Q_L, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc left to top right (use: BOTH_T1_TR__L) + {"L2T Trans", BOTH_T1__L_T_, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc left to top (use: BOTH_T1_T___L) + {"L2TL Trans", BOTH_T1__L_TL, Q_L, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc left to top left + {"L2BL Trans", BOTH_T1__L_BL, Q_L, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc left to bottom left (use: BOTH_T1_BL__L) + {"BL2BR Trans", BOTH_T1_BL_BR, Q_BL, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin bottom left to bottom right + {"BL2R Trans", BOTH_T1_BL__R, Q_BL, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast weak spin bottom left to right + {"BL2TR Trans", BOTH_T1_BL_TR, Q_BL, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast weak spin bottom left to top right + {"BL2T Trans", BOTH_T1_BL_T_, Q_BL, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc bottom left to top (use: BOTH_T1_T__BL) + {"BL2TL Trans", BOTH_T1_BL_TL, Q_BL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc bottom left to top left (use: BOTH_T1_TL_BL) + {"BL2L Trans", BOTH_T1_BL__L, Q_BL, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc bottom left to left + + //Bounces + {"Bounce BR", BOTH_B1_BR___, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_T1_BR_TR, 150 }, + {"Bounce R", BOTH_B1__R___, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_T1__R__L, 150 }, + {"Bounce TR", BOTH_B1_TR___, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_TR_TL, 150 }, + {"Bounce T", BOTH_B1_T____, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + {"Bounce TL", BOTH_B1_TL___, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_T1_TL_TR, 150 }, + {"Bounce L", BOTH_B1__L___, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_T1__L__R, 150 }, + {"Bounce BL", BOTH_B1_BL___, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_T1_BL_TR, 150 }, + + //Deflected attacks (like bounces, but slide off enemy saber, not straight back) + {"Deflect BR", BOTH_D1_BR___, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_T1_BR_TR, 150 }, + {"Deflect R", BOTH_D1__R___, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_T1__R__L, 150 }, + {"Deflect TR", BOTH_D1_TR___, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_TR_TL, 150 }, + {"Deflect T", BOTH_B1_T____, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + {"Deflect TL", BOTH_D1_TL___, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_T1_TL_TR, 150 }, + {"Deflect L", BOTH_D1__L___, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_T1__L__R, 150 }, + {"Deflect BL", BOTH_D1_BL___, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_T1_BL_TR, 150 }, + {"Deflect B", BOTH_D1_B____, Q_B, Q_B, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + + //Reflected attacks + {"Reflected BR",BOTH_V1_BR_S1, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_BR + {"Reflected R", BOTH_V1__R_S1, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1__R + {"Reflected TR",BOTH_V1_TR_S1, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_TR + {"Reflected T", BOTH_V1_T__S1, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_T_ + {"Reflected TL",BOTH_V1_TL_S1, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_TL + {"Reflected L", BOTH_V1__L_S1, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1__L + {"Reflected BL",BOTH_V1_BL_S1, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_BL + {"Reflected B", BOTH_V1_B__S1, Q_B, Q_B, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_B_ + + // Broken parries + {"BParry Top", BOTH_H1_S1_T_, Q_T, Q_B, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UP, + {"BParry UR", BOTH_H1_S1_TR, Q_TR, Q_BL, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UR, + {"BParry UL", BOTH_H1_S1_TL, Q_TL, Q_BR, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UL, + {"BParry LR", BOTH_H1_S1_BL, Q_BL, Q_TR, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LR, + {"BParry Bot", BOTH_H1_S1_B_, Q_B, Q_T, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LL + {"BParry LL", BOTH_H1_S1_BR, Q_BR, Q_TL, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LL + + // Knockaways + {"Knock Top", BOTH_K1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_T1_T__BR, 150 }, // LS_PARRY_UP, + {"Knock UR", BOTH_K1_S1_TR, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_T1_TR__R, 150 }, // LS_PARRY_UR, + {"Knock UL", BOTH_K1_S1_TL, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_T1_TL__L, 150 }, // LS_PARRY_UL, + {"Knock LR", BOTH_K1_S1_BL, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_T1_BL_TL, 150 }, // LS_PARRY_LR, + {"Knock LL", BOTH_K1_S1_BR, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_T1_BR_TR, 150 }, // LS_PARRY_LL + + // Parry + {"Parry Top", BOTH_P1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_T2B, 150 }, // LS_PARRY_UP, + {"Parry UR", BOTH_P1_S1_TR, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_TR2BL, 150 }, // LS_PARRY_UR, + {"Parry UL", BOTH_P1_S1_TL, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_A_TL2BR, 150 }, // LS_PARRY_UL, + {"Parry LR", BOTH_P1_S1_BL, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_A_BR2TL, 150 }, // LS_PARRY_LR, + {"Parry LL", BOTH_P1_S1_BR, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_A_BL2TR, 150 }, // LS_PARRY_LL + + // Reflecting a missile + {"Reflect Top", BOTH_P1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_T2B, 300 }, // LS_PARRY_UP, + {"Reflect UR", BOTH_P1_S1_TL, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_A_TL2BR, 300 }, // LS_PARRY_UR, + {"Reflect UL", BOTH_P1_S1_TR, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_TR2BL, 300 }, // LS_PARRY_UL, + {"Reflect LR", BOTH_P1_S1_BR, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_A_BL2TR, 300 }, // LS_PARRY_LR + {"Reflect LL", BOTH_P1_S1_BL, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_A_BR2TL, 300 }, // LS_PARRY_LL, +}; + + +saberMoveName_t transitionMove[Q_NUM_QUADS][Q_NUM_QUADS] = +{ + { + LS_NONE, //Can't transition to same pos! + LS_T1_BR__R,//40 + LS_T1_BR_TR, + LS_T1_BR_T_, + LS_T1_BR_TL, + LS_T1_BR__L, + LS_T1_BR_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1__R_BR,//46 + LS_NONE, //Can't transition to same pos! + LS_T1__R_TR, + LS_T1__R_T_, + LS_T1__R_TL, + LS_T1__R__L, + LS_T1__R_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_TR_BR,//52 + LS_T1_TR__R, + LS_NONE, //Can't transition to same pos! + LS_T1_TR_T_, + LS_T1_TR_TL, + LS_T1_TR__L, + LS_T1_TR_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_T__BR,//58 + LS_T1_T___R, + LS_T1_T__TR, + LS_NONE, //Can't transition to same pos! + LS_T1_T__TL, + LS_T1_T___L, + LS_T1_T__BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_TL_BR,//64 + LS_T1_TL__R, + LS_T1_TL_TR, + LS_T1_TL_T_, + LS_NONE, //Can't transition to same pos! + LS_T1_TL__L, + LS_T1_TL_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1__L_BR,//70 + LS_T1__L__R, + LS_T1__L_TR, + LS_T1__L_T_, + LS_T1__L_TL, + LS_NONE, //Can't transition to same pos! + LS_T1__L_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_BL_BR,//76 + LS_T1_BL__R, + LS_T1_BL_TR, + LS_T1_BL_T_, + LS_T1_BL_TL, + LS_T1_BL__L, + LS_NONE, //Can't transition to same pos! + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_BL_BR,//NOTE: there are no transitions from bottom, so re-use the bottom right transitions + LS_T1_BR__R, + LS_T1_BR_TR, + LS_T1_BR_T_, + LS_T1_BR_TL, + LS_T1_BR__L, + LS_T1_BR_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + } +}; + +void PM_VelocityForSaberMove( playerState_t *ps, vec3_t throwDir ) +{ + vec3_t vForward = { 0.0f }, vRight = { 0.0f }, vUp = { 0.0f }, startQ = { 0.0f }, endQ = { 0.0f }; + + AngleVectors( ps->viewangles, vForward, vRight, vUp ); + + switch ( saberMoveData[ps->saberMove].startQuad ) + { + case Q_BR: + VectorScale( vRight, 1, startQ ); + VectorMA( startQ, -1, vUp, startQ ); + break; + case Q_R: + VectorScale( vRight, 2, startQ ); + break; + case Q_TR: + VectorScale( vRight, 1, startQ ); + VectorMA( startQ, 1, vUp, startQ ); + break; + case Q_T: + VectorScale( vUp, 2, startQ ); + break; + case Q_TL: + VectorScale( vRight, -1, startQ ); + VectorMA( startQ, 1, vUp, startQ ); + break; + case Q_L: + VectorScale( vRight, -2, startQ ); + break; + case Q_BL: + VectorScale( vRight, -1, startQ ); + VectorMA( startQ, -1, vUp, startQ ); + break; + case Q_B: + VectorScale( vUp, -2, startQ ); + break; + } + switch ( saberMoveData[ps->saberMove].endQuad ) + { + case Q_BR: + VectorScale( vRight, 1, endQ ); + VectorMA( endQ, -1, vUp, endQ ); + break; + case Q_R: + VectorScale( vRight, 2, endQ ); + break; + case Q_TR: + VectorScale( vRight, 1, endQ ); + VectorMA( endQ, 1, vUp, endQ ); + break; + case Q_T: + VectorScale( vUp, 2, endQ ); + break; + case Q_TL: + VectorScale( vRight, -1, endQ ); + VectorMA( endQ, 1, vUp, endQ ); + break; + case Q_L: + VectorScale( vRight, -2, endQ ); + break; + case Q_BL: + VectorScale( vRight, -1, endQ ); + VectorMA( endQ, -1, vUp, endQ ); + break; + case Q_B: + VectorScale( vUp, -2, endQ ); + break; + } + VectorMA( endQ, 2, vForward, endQ ); + VectorScale( throwDir, 125, throwDir );//FIXME: pass in the throw strength? + VectorSubtract( endQ, startQ, throwDir ); +} + +qboolean PM_VelocityForBlockedMove( playerState_t *ps, vec3_t throwDir ) +{ + vec3_t vForward, vRight, vUp; + AngleVectors( ps->viewangles, vForward, vRight, vUp ); + switch ( ps->saberBlocked ) + { + case BLOCKED_UPPER_RIGHT: + VectorScale( vRight, 1, throwDir ); + VectorMA( throwDir, 1, vUp, throwDir ); + break; + case BLOCKED_UPPER_LEFT: + VectorScale( vRight, -1, throwDir ); + VectorMA( throwDir, 1, vUp, throwDir ); + break; + case BLOCKED_LOWER_RIGHT: + VectorScale( vRight, 1, throwDir ); + VectorMA( throwDir, -1, vUp, throwDir ); + break; + case BLOCKED_LOWER_LEFT: + VectorScale( vRight, -1, throwDir ); + VectorMA( throwDir, -1, vUp, throwDir ); + break; + case BLOCKED_TOP: + VectorScale( vUp, 2, throwDir ); + break; + default: + return qfalse; + break; + } + VectorMA( throwDir, 2, vForward, throwDir ); + VectorScale( throwDir, 250, throwDir );//FIXME: pass in the throw strength? + return qtrue; +} + +int PM_AnimLevelForSaberAnim( int anim ) +{ + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_D1_B____ ) + { + return FORCE_LEVEL_1; + } + if ( anim >= BOTH_A2_T__B_ && anim <= BOTH_D2_B____ ) + { + return FORCE_LEVEL_2; + } + if ( anim >= BOTH_A3_T__B_ && anim <= BOTH_D3_B____ ) + { + return FORCE_LEVEL_3; + } + if ( anim >= BOTH_A4_T__B_ && anim <= BOTH_D4_B____ ) + {//desann + return FORCE_LEVEL_4; + } + if ( anim >= BOTH_A5_T__B_ && anim <= BOTH_D5_B____ ) + {//tavion + return FORCE_LEVEL_5; + } + if ( anim >= BOTH_A6_T__B_ && anim <= BOTH_D6_B____ ) + {//dual + return SS_DUAL; + } + if ( anim >= BOTH_A7_T__B_ && anim <= BOTH_D7_B____ ) + {//staff + return SS_STAFF; + } + return FORCE_LEVEL_0; +} + +int PM_PowerLevelForSaberAnim(playerState_t *ps, int saberNum) +{ + if (g_saberNewCombat->integer) + { //new code + int anim = ps->torsoAnim; + int animTimeElapsed = PM_AnimLength(g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)anim) - ps->torsoAnimTimer; + if (anim >= BOTH_A1_T__B_ && anim <= BOTH_D1_B____) + { + //FIXME: these two need their own style + if (ps->saber[0].type == SABER_LANCE) + { + return FORCE_LEVEL_4; + } + else if (ps->saber[0].type == SABER_TRIDENT) + { + return FORCE_LEVEL_3; + } + return FORCE_LEVEL_1; + } + if (anim >= BOTH_A2_T__B_ && anim <= BOTH_D2_B____) + { + return FORCE_LEVEL_3; + } +<<<<<<< HEAD + if (anim >= BOTH_A3_T__B_ && anim <= BOTH_D3_B____) + { + return FORCE_LEVEL_5; +======= + return FORCE_LEVEL_1; + } + if ( anim >= BOTH_A2_T__B_ && anim <= BOTH_D2_B____ ) + { + return FORCE_LEVEL_2; + } + if ( anim >= BOTH_A3_T__B_ && anim <= BOTH_D3_B____ ) + { + return FORCE_LEVEL_3; + } + if ( anim >= BOTH_A4_T__B_ && anim <= BOTH_D4_B____ ) + {//desann + return FORCE_LEVEL_4; + } + if ( anim >= BOTH_A5_T__B_ && anim <= BOTH_D5_B____ ) + {//tavion + return FORCE_LEVEL_2; + } + if ( anim >= BOTH_A6_T__B_ && anim <= BOTH_D6_B____ ) + {//dual + return FORCE_LEVEL_2; + } + if ( anim >= BOTH_A7_T__B_ && anim <= BOTH_D7_B____ ) + {//staff + return FORCE_LEVEL_2; + } + if ( ( anim >= BOTH_P1_S1_T_ && anim <= BOTH_P1_S1_BR ) + || ( anim >= BOTH_P6_S6_T_ && anim <= BOTH_P6_S6_BR ) + || ( anim >= BOTH_P7_S7_T_ && anim <= BOTH_P7_S7_BR ) ) + {//parries + switch ( ps->saberAnimLevel ) + { + case SS_STRONG: + case SS_DESANN: + return FORCE_LEVEL_3; + break; + case SS_TAVION: + case SS_STAFF: + case SS_DUAL: + case SS_MEDIUM: + return FORCE_LEVEL_2; + break; + case SS_FAST: + return FORCE_LEVEL_1; + break; + default: + return FORCE_LEVEL_0; + break; + } + } + if ( ( anim >= BOTH_K1_S1_T_ && anim <= BOTH_K1_S1_BR ) + || ( anim >= BOTH_K6_S6_T_ && anim <= BOTH_K6_S6_BR ) + || ( anim >= BOTH_K7_S7_T_ && anim <= BOTH_K7_S7_BR ) ) + {//knockaways + return FORCE_LEVEL_3; + } + if ( ( anim >= BOTH_V1_BR_S1 && anim <= BOTH_V1_B__S1 ) + || ( anim >= BOTH_V6_BR_S6 && anim <= BOTH_V6_B__S6 ) + || ( anim >= BOTH_V7_BR_S7 && anim <= BOTH_V7_B__S7 ) ) + {//knocked-away attacks + return FORCE_LEVEL_1; + } + if ( ( anim >= BOTH_H1_S1_T_ && anim <= BOTH_H1_S1_BR ) + || ( anim >= BOTH_H6_S6_T_ && anim <= BOTH_H6_S6_BR ) + || ( anim >= BOTH_H7_S7_T_ && anim <= BOTH_H7_S7_BR ) ) + {//broken parries + return FORCE_LEVEL_0; + } + switch ( anim ) + { + case BOTH_A2_STABBACK1: + if ( ps->torsoAnimTimer < 450 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 400 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_ATTACK_BACK: + if ( ps->torsoAnimTimer < 500 ) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_CROUCHATTACKBACK1: + if ( ps->torsoAnimTimer < 800 ) + {//end of anim + return FORCE_LEVEL_0; +>>>>>>> 38e3edc40da09b9c20f585a3b939ff493be8bf50 + } + if (anim >= BOTH_A4_T__B_ && anim <= BOTH_D4_B____) + {//desann + return FORCE_LEVEL_5; + } + if (anim >= BOTH_A5_T__B_ && anim <= BOTH_D5_B____) + {//tavion + return FORCE_LEVEL_2; + } + if (anim >= BOTH_A6_T__B_ && anim <= BOTH_D6_B____) + {//dual + return FORCE_LEVEL_2; + } + if (anim >= BOTH_A7_T__B_ && anim <= BOTH_D7_B____) + {//staff + return FORCE_LEVEL_4; + } + if ((anim >= BOTH_P1_S1_T_ && anim <= BOTH_P1_S1_BR) + || (anim >= BOTH_P6_S6_T_ && anim <= BOTH_P6_S6_BR) + || (anim >= BOTH_P7_S7_T_ && anim <= BOTH_P7_S7_BR)) + {//parries + switch (ps->saberAnimLevel) + { + case SS_DESANN: + case SS_STRONG: + return FORCE_LEVEL_5; + break; + case SS_STAFF: + return FORCE_LEVEL_4; + break; + case SS_MEDIUM: + return FORCE_LEVEL_3; + break; + case SS_DUAL: + case SS_TAVION: + return FORCE_LEVEL_2; + break; + case SS_FAST: + return FORCE_LEVEL_1; + break; + default: + return FORCE_LEVEL_0; + break; + } + } + if ((anim >= BOTH_K1_S1_T_ && anim <= BOTH_K1_S1_BR) + || (anim >= BOTH_K6_S6_T_ && anim <= BOTH_K6_S6_BR) + || (anim >= BOTH_K7_S7_T_ && anim <= BOTH_K7_S7_BR)) + {//knockaways + return FORCE_LEVEL_3; + } + if ((anim >= BOTH_V1_BR_S1 && anim <= BOTH_V1_B__S1) + || (anim >= BOTH_V6_BR_S6 && anim <= BOTH_V6_B__S6) + || (anim >= BOTH_V7_BR_S7 && anim <= BOTH_V7_B__S7)) + {//knocked-away attacks + return FORCE_LEVEL_1; + } + if ((anim >= BOTH_H1_S1_T_ && anim <= BOTH_H1_S1_BR) + || (anim >= BOTH_H6_S6_T_ && anim <= BOTH_H6_S6_BR) + || (anim >= BOTH_H7_S7_T_ && anim <= BOTH_H7_S7_BR)) + {//broken parries + return FORCE_LEVEL_0; + } + switch (anim) + { + case BOTH_A2_STABBACK1: + if (ps->torsoAnimTimer < 450) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_ATTACK_BACK: + if (ps->torsoAnimTimer < 500) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_CROUCHATTACKBACK1: + if (ps->torsoAnimTimer < 800) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + //FIXME: break up? + return FORCE_LEVEL_5; + break; + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + //FIXME: break up? + return FORCE_LEVEL_5; + break; + case BOTH_K1_S1_T_: //# knockaway saber top + case BOTH_K1_S1_TR: //# knockaway saber top right + case BOTH_K1_S1_TL: //# knockaway saber top left + case BOTH_K1_S1_BL: //# knockaway saber bottom left + case BOTH_K1_S1_B_: //# knockaway saber bottom + case BOTH_K1_S1_BR: //# knockaway saber bottom right + //FIXME: break up? + return FORCE_LEVEL_5; + break; + case BOTH_LUNGE2_B__T_: + if (ps->torsoAnimTimer < 400) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 150) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_FORCELEAP2_T__B_: + if (ps->torsoAnimTimer < 400) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 550) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + return FORCE_LEVEL_5;//??? + break; + case BOTH_JUMPFLIPSLASHDOWN1: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 550) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_JUMPFLIPSTABDOWN: + if (ps->torsoAnimTimer <= 1200) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed <= 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_JUMPATTACK6: + /* + if (pm->ps) + { + if ( ( pm->ps->legsAnimTimer >= 1450 +<<<<<<< HEAD + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 400 ) + ||(pm->ps->legsAnimTimer >= 400 + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 1100 ) ) +======= + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 400 ) + ||(pm->ps->legsAnimTimer >= 400 + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 1100 ) ) +>>>>>>> 38e3edc40da09b9c20f585a3b939ff493be8bf50 + {//pretty much sideways + return FORCE_LEVEL_5; + } + } + */ + if ((ps->torsoAnimTimer >= 1450 + && animTimeElapsed >= 400) + || (ps->torsoAnimTimer >= 400 + && animTimeElapsed >= 1100)) + {//pretty much sideways + return FORCE_LEVEL_5; + } + return FORCE_LEVEL_0; +<<<<<<< HEAD + break; + case BOTH_JUMPATTACK7: + if (ps->torsoAnimTimer <= 1200) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_SPINATTACK6: + if (animTimeElapsed <= 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_SPINATTACK7: + if (ps->torsoAnimTimer <= 500) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 500) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_FORCELONGLEAP_ATTACK: + if (animTimeElapsed <= 200) + {//1st four frames of anim + return FORCE_LEVEL_5; + } + break; + /* + case BOTH_A7_KICK_F://these kicks attack, too + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + //FIXME: break up + return FORCE_LEVEL_5; + break; + */ + case BOTH_STABDOWN: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_5; + } + break; + case BOTH_STABDOWN_STAFF: + if (ps->torsoAnimTimer <= 850) + {//end of anim + return FORCE_LEVEL_5; + } + break; + case BOTH_STABDOWN_DUAL: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_5; + } + break; + case BOTH_A6_SABERPROTECT: + if (ps->torsoAnimTimer < 650) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A7_SOULCAL: + if (ps->torsoAnimTimer < 650) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 600) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A1_SPECIAL: + if (ps->torsoAnimTimer < 600) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A2_SPECIAL: + if (ps->torsoAnimTimer < 300) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A3_SPECIAL: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_FLIP_ATTACK7: + return FORCE_LEVEL_5; + break; + case BOTH_PULL_IMPALE_STAB: + if (ps->torsoAnimTimer < 1000) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_PULL_IMPALE_SWING: + if (ps->torsoAnimTimer < 500)//750 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 650)//600 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_ALORA_SPIN_SLASH: + if (ps->torsoAnimTimer < 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A6_FB: + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A6_LR: + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A7_HILT: +======= + } + return FORCE_LEVEL_3; + break; + case BOTH_A6_LR: + if ( ps->torsoAnimTimer < 250 ) + {//end of anim +>>>>>>> 38e3edc40da09b9c20f585a3b939ff493be8bf50 + return FORCE_LEVEL_0; + break; + //===SABERLOCK SUPERBREAKS START=========================================================================== + case BOTH_LK_S_DL_T_SB_1_W: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_ST_S_SB_1_W: + if (ps->torsoAnimTimer < 300) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + if (ps->torsoAnimTimer < 150) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_DL_T_SB_1_W: + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + if (animTimeElapsed < 1000) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_ST_T_SB_1_W: + if (ps->torsoAnimTimer < 950) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 650) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_S_S_SB_1_W: + if (saberNum != 0) + {//only right hand saber does damage in this suberbreak + return FORCE_LEVEL_0; + } + if (ps->torsoAnimTimer < 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 450) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_S_T_SB_1_W: + if (saberNum != 0) + {//only right hand saber does damage in this suberbreak + return FORCE_LEVEL_0; + } + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 150) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_DL_S_SB_1_W: + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_DL_T_SB_1_W: + //special suberbreak - doesn't kill, just kicks them backwards + return FORCE_LEVEL_0; + break; + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + if (ps->torsoAnimTimer < 800) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 350) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + return FORCE_LEVEL_5; + break; + //===SABERLOCK SUPERBREAKS START=========================================================================== + case BOTH_HANG_ATTACK: + //FIME: break up + if (ps->torsoAnimTimer < 1000) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + else + {//sweet spot + return FORCE_LEVEL_5; + } + break; + case BOTH_ROLL_STAB: + if (animTimeElapsed > 400) + {//end of anim + return FORCE_LEVEL_0; + } + else + { + return FORCE_LEVEL_5; + } + break; + } + return FORCE_LEVEL_0; + } + else + { //old code + int anim = ps->torsoAnim; + int animTimeElapsed = PM_AnimLength(g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)anim) - ps->torsoAnimTimer; + if (anim >= BOTH_A1_T__B_ && anim <= BOTH_D1_B____) + { + //FIXME: these two need their own style + if (ps->saber[0].type == SABER_LANCE) + { + return FORCE_LEVEL_4; + } + else if (ps->saber[0].type == SABER_TRIDENT) + { + return FORCE_LEVEL_3; + } + return FORCE_LEVEL_1; + } + if (anim >= BOTH_A2_T__B_ && anim <= BOTH_D2_B____) + { + return FORCE_LEVEL_3; + } + if (anim >= BOTH_A3_T__B_ && anim <= BOTH_D3_B____) + { + return FORCE_LEVEL_5; + } + if (anim >= BOTH_A4_T__B_ && anim <= BOTH_D4_B____) + {//desann + return FORCE_LEVEL_5; + } + if (anim >= BOTH_A5_T__B_ && anim <= BOTH_D5_B____) + {//tavion + return FORCE_LEVEL_2; + } + if (anim >= BOTH_A6_T__B_ && anim <= BOTH_D6_B____) + {//dual + return FORCE_LEVEL_2; + } + if (anim >= BOTH_A7_T__B_ && anim <= BOTH_D7_B____) + {//staff + return FORCE_LEVEL_4; + } + if ((anim >= BOTH_P1_S1_T_ && anim <= BOTH_P1_S1_BR) + || (anim >= BOTH_P6_S6_T_ && anim <= BOTH_P6_S6_BR) + || (anim >= BOTH_P7_S7_T_ && anim <= BOTH_P7_S7_BR)) + {//parries + switch (ps->saberAnimLevel) + { + case SS_STRONG: + case SS_DESANN: + return FORCE_LEVEL_3; + break; + case SS_TAVION: + case SS_STAFF: + case SS_DUAL: + case SS_MEDIUM: + return FORCE_LEVEL_2; + break; + case SS_FAST: + return FORCE_LEVEL_1; + break; + default: + return FORCE_LEVEL_0; + break; + } + } + if ((anim >= BOTH_K1_S1_T_ && anim <= BOTH_K1_S1_BR) + || (anim >= BOTH_K6_S6_T_ && anim <= BOTH_K6_S6_BR) + || (anim >= BOTH_K7_S7_T_ && anim <= BOTH_K7_S7_BR)) + {//knockaways + return FORCE_LEVEL_3; + } + if ((anim >= BOTH_V1_BR_S1 && anim <= BOTH_V1_B__S1) + || (anim >= BOTH_V6_BR_S6 && anim <= BOTH_V6_B__S6) + || (anim >= BOTH_V7_BR_S7 && anim <= BOTH_V7_B__S7)) + {//knocked-away attacks + return FORCE_LEVEL_1; + } + if ((anim >= BOTH_H1_S1_T_ && anim <= BOTH_H1_S1_BR) + || (anim >= BOTH_H6_S6_T_ && anim <= BOTH_H6_S6_BR) + || (anim >= BOTH_H7_S7_T_ && anim <= BOTH_H7_S7_BR)) + {//broken parries + return FORCE_LEVEL_0; + } + switch (anim) + { + case BOTH_A2_STABBACK1: + if (ps->torsoAnimTimer < 450) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_ATTACK_BACK: + if (ps->torsoAnimTimer < 500) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_CROUCHATTACKBACK1: + if (ps->torsoAnimTimer < 800) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + //FIXME: break up? + return FORCE_LEVEL_3; + break; + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + //FIXME: break up? + return FORCE_LEVEL_3; + break; + case BOTH_K1_S1_T_: //# knockaway saber top + case BOTH_K1_S1_TR: //# knockaway saber top right + case BOTH_K1_S1_TL: //# knockaway saber top left + case BOTH_K1_S1_BL: //# knockaway saber bottom left + case BOTH_K1_S1_B_: //# knockaway saber bottom + case BOTH_K1_S1_BR: //# knockaway saber bottom right + //FIXME: break up? + return FORCE_LEVEL_3; + break; + case BOTH_LUNGE2_B__T_: + if (ps->torsoAnimTimer < 400) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 150) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_FORCELEAP2_T__B_: + if (ps->torsoAnimTimer < 400) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 550) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + return FORCE_LEVEL_3;//??? + break; + case BOTH_JUMPFLIPSLASHDOWN1: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 550) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_JUMPFLIPSTABDOWN: + if (ps->torsoAnimTimer <= 1200) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed <= 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_JUMPATTACK6: + /* + if (pm->ps) + { + if ( ( pm->ps->legsAnimTimer >= 1450 + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 400 ) + ||(pm->ps->legsAnimTimer >= 400 + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 1100 ) ) + {//pretty much sideways + return FORCE_LEVEL_3; + } + } + */ + if ((ps->torsoAnimTimer >= 1450 + && animTimeElapsed >= 400) + || (ps->torsoAnimTimer >= 400 + && animTimeElapsed >= 1100)) + {//pretty much sideways + return FORCE_LEVEL_3; + } + return FORCE_LEVEL_0; + break; + case BOTH_JUMPATTACK7: + if (ps->torsoAnimTimer <= 1200) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_SPINATTACK6: + if (animTimeElapsed <= 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_SPINATTACK7: + if (ps->torsoAnimTimer <= 500) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 500) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_FORCELONGLEAP_ATTACK: + if (animTimeElapsed <= 200) + {//1st four frames of anim + return FORCE_LEVEL_3; + } + break; + /* + case BOTH_A7_KICK_F://these kicks attack, too + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + //FIXME: break up + return FORCE_LEVEL_3; + break; + */ + case BOTH_STABDOWN: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_3; + } + break; + case BOTH_STABDOWN_STAFF: + if (ps->torsoAnimTimer <= 850) + {//end of anim + return FORCE_LEVEL_3; + } + break; + case BOTH_STABDOWN_DUAL: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_3; + } + break; + case BOTH_A6_SABERPROTECT: + if (ps->torsoAnimTimer < 650) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A7_SOULCAL: + if (ps->torsoAnimTimer < 650) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 600) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A1_SPECIAL: + if (ps->torsoAnimTimer < 600) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A2_SPECIAL: + if (ps->torsoAnimTimer < 300) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A3_SPECIAL: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_FLIP_ATTACK7: + return FORCE_LEVEL_3; + break; + case BOTH_PULL_IMPALE_STAB: + if (ps->torsoAnimTimer < 1000) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_PULL_IMPALE_SWING: + if (ps->torsoAnimTimer < 500)//750 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 650)//600 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_ALORA_SPIN_SLASH: + if (ps->torsoAnimTimer < 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A6_FB: + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A6_LR: + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A7_HILT: + return FORCE_LEVEL_0; + break; + //===SABERLOCK SUPERBREAKS START=========================================================================== + case BOTH_LK_S_DL_T_SB_1_W: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_ST_S_SB_1_W: + if (ps->torsoAnimTimer < 300) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + if (ps->torsoAnimTimer < 150) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_DL_T_SB_1_W: + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + if (animTimeElapsed < 1000) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_ST_T_SB_1_W: + if (ps->torsoAnimTimer < 950) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 650) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_S_S_SB_1_W: + if (saberNum != 0) + {//only right hand saber does damage in this suberbreak + return FORCE_LEVEL_0; + } + if (ps->torsoAnimTimer < 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 450) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_S_T_SB_1_W: + if (saberNum != 0) + {//only right hand saber does damage in this suberbreak + return FORCE_LEVEL_0; + } + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 150) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_DL_S_SB_1_W: + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_DL_T_SB_1_W: + //special suberbreak - doesn't kill, just kicks them backwards + return FORCE_LEVEL_0; + break; + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + if (ps->torsoAnimTimer < 800) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 350) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + return FORCE_LEVEL_5; + break; + //===SABERLOCK SUPERBREAKS START=========================================================================== + case BOTH_HANG_ATTACK: + //FIME: break up + if (ps->torsoAnimTimer < 1000) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + else + {//sweet spot + return FORCE_LEVEL_5; + } + break; + case BOTH_ROLL_STAB: + if (animTimeElapsed > 400) + {//end of anim + return FORCE_LEVEL_0; + } + else + { + return FORCE_LEVEL_3; + } + break; + } + return FORCE_LEVEL_0; + } +} + +qboolean PM_InAnimForSaberMove( int anim, int saberMove ) +{ + switch ( anim ) + {//special case anims + case BOTH_A2_STABBACK1: + case BOTH_ATTACK_BACK: + case BOTH_CROUCHATTACKBACK1: + case BOTH_ROLL_STAB: + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + case BOTH_LUNGE2_B__T_: + case BOTH_FORCELEAP2_T__B_: + case BOTH_JUMPFLIPSLASHDOWN1://# + case BOTH_JUMPFLIPSTABDOWN://# + case BOTH_JUMPATTACK6: + case BOTH_JUMPATTACK7: + case BOTH_SPINATTACK6: + case BOTH_SPINATTACK7: + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + case BOTH_FORCELONGLEAP_ATTACK: + case BOTH_A7_KICK_F: + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + case BOTH_A7_KICK_S: + case BOTH_A7_KICK_BF: + case BOTH_A7_KICK_RL: + case BOTH_A7_KICK_F_AIR: + case BOTH_A7_KICK_B_AIR: + case BOTH_A7_KICK_R_AIR: + case BOTH_A7_KICK_L_AIR: + case BOTH_STABDOWN: + case BOTH_STABDOWN_STAFF: + case BOTH_STABDOWN_DUAL: + case BOTH_A6_SABERPROTECT: + case BOTH_A7_SOULCAL: + case BOTH_A1_SPECIAL: + case BOTH_A2_SPECIAL: + case BOTH_A3_SPECIAL: + case BOTH_FLIP_ATTACK7: + case BOTH_PULL_IMPALE_STAB: + case BOTH_PULL_IMPALE_SWING: + case BOTH_ALORA_SPIN_SLASH: + case BOTH_A6_FB: + case BOTH_A6_LR: + case BOTH_A7_HILT: + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_DL_T_SB_1_W: + case BOTH_LK_S_ST_S_SB_1_W: + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_DL_T_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + case BOTH_LK_DL_ST_T_SB_1_W: + case BOTH_LK_DL_S_S_SB_1_W: + case BOTH_LK_DL_S_T_SB_1_W: + case BOTH_LK_ST_DL_S_SB_1_W: + case BOTH_LK_ST_DL_T_SB_1_W: + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + case BOTH_HANG_ATTACK: + return qtrue; + } + if ( PM_SaberDrawPutawayAnim( anim ) ) + { + if ( saberMove == LS_DRAW || saberMove == LS_PUTAWAY ) + { + return qtrue; + } + return qfalse; + } + else if ( PM_SaberStanceAnim( anim ) ) + { + if ( saberMove == LS_READY ) + { + return qtrue; + } + return qfalse; + } + int animLevel = PM_AnimLevelForSaberAnim( anim ); + if ( animLevel <= 0 ) + {//NOTE: this will always return false for the ready poses and putaway/draw... + return qfalse; + } + //drop the anim to the first level and start the checks there + anim -= (animLevel-FORCE_LEVEL_1)*SABER_ANIM_GROUP_SIZE; + //check level 1 + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + //check level 2 + anim += SABER_ANIM_GROUP_SIZE; + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + //check level 3 + anim += SABER_ANIM_GROUP_SIZE; + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + //check level 4 + anim += SABER_ANIM_GROUP_SIZE; + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + //check level 5 + anim += SABER_ANIM_GROUP_SIZE; + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + if ( anim >= BOTH_P1_S1_T_ && anim <= BOTH_H1_S1_BR ) + {//parries, knockaways and broken parries + return (anim==saberMoveData[saberMove].animToUse); + } + return qfalse; +} + +qboolean PM_SaberInIdle( int move ) +{ + switch ( move ) + { + case LS_NONE: + case LS_READY: + case LS_DRAW: + case LS_PUTAWAY: + return qtrue; + break; + } + return qfalse; +} +qboolean PM_SaberInSpecialAttack( int anim ) +{ + switch ( anim ) + { + case BOTH_A2_STABBACK1: + case BOTH_ATTACK_BACK: + case BOTH_CROUCHATTACKBACK1: + case BOTH_ROLL_STAB: + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + case BOTH_LUNGE2_B__T_: + case BOTH_FORCELEAP2_T__B_: + case BOTH_JUMPFLIPSLASHDOWN1://# + case BOTH_JUMPFLIPSTABDOWN://# + case BOTH_JUMPATTACK6: + case BOTH_JUMPATTACK7: + case BOTH_SPINATTACK6: + case BOTH_SPINATTACK7: + case BOTH_FORCELONGLEAP_ATTACK: + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + case BOTH_A7_KICK_F: + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + case BOTH_A7_KICK_S: + case BOTH_A7_KICK_BF: + case BOTH_A7_KICK_RL: + case BOTH_A7_KICK_F_AIR: + case BOTH_A7_KICK_B_AIR: + case BOTH_A7_KICK_R_AIR: + case BOTH_A7_KICK_L_AIR: + case BOTH_STABDOWN: + case BOTH_STABDOWN_STAFF: + case BOTH_STABDOWN_DUAL: + case BOTH_A6_SABERPROTECT: + case BOTH_A7_SOULCAL: + case BOTH_A1_SPECIAL: + case BOTH_A2_SPECIAL: + case BOTH_A3_SPECIAL: + case BOTH_FLIP_ATTACK7: + case BOTH_PULL_IMPALE_STAB: + case BOTH_PULL_IMPALE_SWING: + case BOTH_ALORA_SPIN_SLASH: + case BOTH_A6_FB: + case BOTH_A6_LR: + case BOTH_A7_HILT: + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_DL_T_SB_1_W: + case BOTH_LK_S_ST_S_SB_1_W: + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_DL_T_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + case BOTH_LK_DL_ST_T_SB_1_W: + case BOTH_LK_DL_S_S_SB_1_W: + case BOTH_LK_DL_S_T_SB_1_W: + case BOTH_LK_ST_DL_S_SB_1_W: + case BOTH_LK_ST_DL_T_SB_1_W: + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + case BOTH_HANG_ATTACK: + return qtrue; + } + return qfalse; +} + +qboolean PM_SaberInAttackPure( int move ) +{ + if ( move >= LS_A_TL2BR && move <= LS_A_T2B ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInAttack( int move ) +{ + if ( move >= LS_A_TL2BR && move <= LS_A_T2B ) + { + return qtrue; + } + switch ( move ) + { + case LS_A_BACK: + case LS_A_BACK_CR: + case LS_A_BACKSTAB: + case LS_ROLL_STAB: + case LS_A_LUNGE: + case LS_A_JUMP_T__B_: + case LS_A_FLIP_STAB: + case LS_A_FLIP_SLASH: + case LS_JUMPATTACK_DUAL: + case LS_JUMPATTACK_ARIAL_LEFT: + case LS_JUMPATTACK_ARIAL_RIGHT: + case LS_JUMPATTACK_CART_LEFT: + case LS_JUMPATTACK_CART_RIGHT: + case LS_JUMPATTACK_STAFF_LEFT: + case LS_JUMPATTACK_STAFF_RIGHT: + case LS_BUTTERFLY_LEFT: + case LS_BUTTERFLY_RIGHT: + case LS_A_BACKFLIP_ATK: + case LS_SPINATTACK_DUAL: + case LS_SPINATTACK: + case LS_LEAP_ATTACK: + case LS_SWOOP_ATTACK_RIGHT: + case LS_SWOOP_ATTACK_LEFT: + case LS_TAUNTAUN_ATTACK_RIGHT: + case LS_TAUNTAUN_ATTACK_LEFT: + case LS_KICK_F: + case LS_KICK_B: + case LS_KICK_R: + case LS_KICK_L: + case LS_KICK_S: + case LS_KICK_BF: + case LS_KICK_RL: + case LS_KICK_F_AIR: + case LS_KICK_B_AIR: + case LS_KICK_R_AIR: + case LS_KICK_L_AIR: + case LS_STABDOWN: + case LS_STABDOWN_STAFF: + case LS_STABDOWN_DUAL: + case LS_DUAL_SPIN_PROTECT: + case LS_STAFF_SOULCAL: + case LS_A1_SPECIAL: + case LS_A2_SPECIAL: + case LS_A3_SPECIAL: + case LS_UPSIDE_DOWN_ATTACK: + case LS_PULL_ATTACK_STAB: + case LS_PULL_ATTACK_SWING: + case LS_SPINATTACK_ALORA: + case LS_DUAL_FB: + case LS_DUAL_LR: + case LS_HILT_BASH: + return qtrue; + break; + } + return qfalse; +} +qboolean PM_SaberInTransition( int move ) +{ + if ( move >= LS_T1_BR__R && move <= LS_T1_BL__L ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInStart( int move ) +{ + if ( move >= LS_S_TL2BR && move <= LS_S_T2B ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInReturn( int move ) +{ + if ( move >= LS_R_TL2BR && move <= LS_R_T2B ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInTransitionAny( int move ) +{ + if ( PM_SaberInStart( move ) ) + { + return qtrue; + } + else if ( PM_SaberInTransition( move ) ) + { + return qtrue; + } + else if ( PM_SaberInReturn( move ) ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInBounce( int move ) +{ + if ( move >= LS_B1_BR && move <= LS_B1_BL ) + { + return qtrue; + } + if ( move >= LS_D1_BR && move <= LS_D1_BL ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInBrokenParry( int move ) +{ + if ( move >= LS_V1_BR && move <= LS_V1_B_ ) + { + return qtrue; + } + if ( move >= LS_H1_T_ && move <= LS_H1_BL ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInDeflect( int move ) +{ + if ( move >= LS_D1_BR && move <= LS_D1_B_ ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInParry( int move ) +{ + if ( move >= LS_PARRY_UP && move <= LS_PARRY_LL ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInKnockaway( int move ) +{ + if ( move >= LS_K1_T_ && move <= LS_K1_BL ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInReflect( int move ) +{ + if ( move >= LS_REFLECT_UP && move <= LS_REFLECT_LL ) + { + return qtrue; + } + return qfalse; +} + +qboolean PM_SaberInSpecial( int move ) +{ + switch( move ) + { + case LS_A_BACK: + case LS_A_BACK_CR: + case LS_A_BACKSTAB: + case LS_ROLL_STAB: + case LS_A_LUNGE: + case LS_A_JUMP_T__B_: + case LS_A_FLIP_STAB: + case LS_A_FLIP_SLASH: + case LS_JUMPATTACK_DUAL: + case LS_JUMPATTACK_ARIAL_LEFT: + case LS_JUMPATTACK_ARIAL_RIGHT: + case LS_JUMPATTACK_CART_LEFT: + case LS_JUMPATTACK_CART_RIGHT: + case LS_JUMPATTACK_STAFF_LEFT: + case LS_JUMPATTACK_STAFF_RIGHT: + case LS_BUTTERFLY_LEFT: + case LS_BUTTERFLY_RIGHT: + case LS_A_BACKFLIP_ATK: + case LS_SPINATTACK_DUAL: + case LS_SPINATTACK: + case LS_LEAP_ATTACK: + case LS_SWOOP_ATTACK_RIGHT: + case LS_SWOOP_ATTACK_LEFT: + case LS_TAUNTAUN_ATTACK_RIGHT: + case LS_TAUNTAUN_ATTACK_LEFT: + case LS_KICK_F: + case LS_KICK_B: + case LS_KICK_R: + case LS_KICK_L: + case LS_KICK_S: + case LS_KICK_BF: + case LS_KICK_RL: + case LS_KICK_F_AIR: + case LS_KICK_B_AIR: + case LS_KICK_R_AIR: + case LS_KICK_L_AIR: + case LS_STABDOWN: + case LS_STABDOWN_STAFF: + case LS_STABDOWN_DUAL: + case LS_DUAL_SPIN_PROTECT: + case LS_STAFF_SOULCAL: + case LS_A1_SPECIAL: + case LS_A2_SPECIAL: + case LS_A3_SPECIAL: + case LS_UPSIDE_DOWN_ATTACK: + case LS_PULL_ATTACK_STAB: + case LS_PULL_ATTACK_SWING: + case LS_SPINATTACK_ALORA: + case LS_DUAL_FB: + case LS_DUAL_LR: + case LS_HILT_BASH: + return qtrue; + } + return qfalse; +} + +qboolean PM_KickMove( int move ) +{ + switch( move ) + { + case LS_KICK_F: + case LS_KICK_B: + case LS_KICK_R: + case LS_KICK_L: + case LS_KICK_S: + case LS_KICK_BF: + case LS_KICK_RL: + case LS_HILT_BASH: + case LS_KICK_F_AIR: + case LS_KICK_B_AIR: + case LS_KICK_R_AIR: + case LS_KICK_L_AIR: + return qtrue; + } + return qfalse; +} + +qboolean PM_SaberCanInterruptMove( int move, int anim ) +{ + if ( PM_InAnimForSaberMove( anim, move ) ) + { + switch( move ) + { + case LS_A_BACK: + case LS_A_BACK_CR: + case LS_A_BACKSTAB: + case LS_ROLL_STAB: + case LS_A_LUNGE: + case LS_A_JUMP_T__B_: + case LS_A_FLIP_STAB: + case LS_A_FLIP_SLASH: + case LS_JUMPATTACK_DUAL: + case LS_JUMPATTACK_CART_LEFT: + case LS_JUMPATTACK_CART_RIGHT: + case LS_JUMPATTACK_STAFF_LEFT: + case LS_JUMPATTACK_STAFF_RIGHT: + case LS_BUTTERFLY_LEFT: + case LS_BUTTERFLY_RIGHT: + case LS_A_BACKFLIP_ATK: + case LS_SPINATTACK_DUAL: + case LS_SPINATTACK: + case LS_LEAP_ATTACK: + case LS_SWOOP_ATTACK_RIGHT: + case LS_SWOOP_ATTACK_LEFT: + case LS_TAUNTAUN_ATTACK_RIGHT: + case LS_TAUNTAUN_ATTACK_LEFT: + case LS_KICK_S: + case LS_KICK_BF: + case LS_KICK_RL: + case LS_STABDOWN: + case LS_STABDOWN_STAFF: + case LS_STABDOWN_DUAL: + case LS_DUAL_SPIN_PROTECT: + case LS_STAFF_SOULCAL: + case LS_A1_SPECIAL: + case LS_A2_SPECIAL: + case LS_A3_SPECIAL: + case LS_UPSIDE_DOWN_ATTACK: + case LS_PULL_ATTACK_STAB: + case LS_PULL_ATTACK_SWING: + case LS_SPINATTACK_ALORA: + case LS_DUAL_FB: + case LS_DUAL_LR: + case LS_HILT_BASH: + return qfalse; + } + + if ( PM_SaberInAttackPure( move ) ) + { + return qfalse; + } + if ( PM_SaberInStart( move ) ) + { + return qfalse; + } + if ( PM_SaberInTransition( move ) ) + { + return qfalse; + } + if ( PM_SaberInBounce( move ) ) + { + return qfalse; + } + if ( PM_SaberInBrokenParry( move ) ) + { + return qfalse; + } + if ( PM_SaberInDeflect( move ) ) + { + return qfalse; + } + if ( PM_SaberInParry( move ) ) + { + return qfalse; + } + if ( PM_SaberInKnockaway( move ) ) + { + return qfalse; + } + if ( PM_SaberInReflect( move ) ) + { + return qfalse; + } + } + switch ( anim ) + { + case BOTH_A2_STABBACK1: + case BOTH_ATTACK_BACK: + case BOTH_CROUCHATTACKBACK1: + case BOTH_ROLL_STAB: + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + case BOTH_LUNGE2_B__T_: + case BOTH_FORCELEAP2_T__B_: + case BOTH_JUMPFLIPSLASHDOWN1://# + case BOTH_JUMPFLIPSTABDOWN://# + case BOTH_JUMPATTACK6: + case BOTH_JUMPATTACK7: + case BOTH_SPINATTACK6: + case BOTH_SPINATTACK7: + case BOTH_FORCELONGLEAP_ATTACK: + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + case BOTH_A7_KICK_S: + case BOTH_A7_KICK_BF: + case BOTH_A7_KICK_RL: + case BOTH_STABDOWN: + case BOTH_STABDOWN_STAFF: + case BOTH_STABDOWN_DUAL: + case BOTH_A6_SABERPROTECT: + case BOTH_A7_SOULCAL: + case BOTH_A1_SPECIAL: + case BOTH_A2_SPECIAL: + case BOTH_A3_SPECIAL: + case BOTH_FLIP_ATTACK7: + case BOTH_PULL_IMPALE_STAB: + case BOTH_PULL_IMPALE_SWING: + case BOTH_ALORA_SPIN_SLASH: + case BOTH_A6_FB: + case BOTH_A6_LR: + case BOTH_A7_HILT: + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_DL_T_SB_1_W: + case BOTH_LK_S_ST_S_SB_1_W: + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_DL_T_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + case BOTH_LK_DL_ST_T_SB_1_W: + case BOTH_LK_DL_S_S_SB_1_W: + case BOTH_LK_DL_S_T_SB_1_W: + case BOTH_LK_ST_DL_S_SB_1_W: + case BOTH_LK_ST_DL_T_SB_1_W: + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + case BOTH_HANG_ATTACK: + return qfalse; + } + return qtrue; +} + +saberMoveName_t PM_BrokenParryForAttack( int move ) +{ + //Our attack was knocked away by a knockaway parry + //FIXME: need actual anims for this + //FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center + switch ( saberMoveData[move].startQuad ) + { + case Q_B: + return LS_V1_B_; + break; + case Q_BR: + return LS_V1_BR; + break; + case Q_R: + return LS_V1__R; + break; + case Q_TR: + return LS_V1_TR; + break; + case Q_T: + return LS_V1_T_; + break; + case Q_TL: + return LS_V1_TL; + break; + case Q_L: + return LS_V1__L; + break; + case Q_BL: + return LS_V1_BL; + break; + } + return LS_NONE; +} + +saberMoveName_t PM_BrokenParryForParry( int move ) +{ + //FIXME: need actual anims for this + //FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center + switch ( move ) + { + case LS_PARRY_UP: + //Hmm... since we don't know what dir the hit came from, randomly pick knock down or knock back + if ( Q_irand( 0, 1 ) ) + { + return LS_H1_B_; + } + else + { + return LS_H1_T_; + } + break; + case LS_PARRY_UR: + return LS_H1_TR; + break; + case LS_PARRY_UL: + return LS_H1_TL; + break; + case LS_PARRY_LR: + return LS_H1_BR; + break; + case LS_PARRY_LL: + return LS_H1_BL; + break; + case LS_READY: + return LS_H1_B_;//??? + break; + } + return LS_NONE; +} + +saberMoveName_t PM_KnockawayForParry( int move ) +{ + //FIXME: need actual anims for this + //FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center + switch ( move ) + { + case BLOCKED_TOP://LS_PARRY_UP: + return LS_K1_T_;//push up + break; + case BLOCKED_UPPER_RIGHT://LS_PARRY_UR: + default://case LS_READY: + return LS_K1_TR;//push up, slightly to right + break; + case BLOCKED_UPPER_LEFT://LS_PARRY_UL: + return LS_K1_TL;//push up and to left + break; + case BLOCKED_LOWER_RIGHT://LS_PARRY_LR: + return LS_K1_BR;//push down and to left + break; + case BLOCKED_LOWER_LEFT://LS_PARRY_LL: + return LS_K1_BL;//push down and to right + break; + } + //return LS_NONE; +} + +saberMoveName_t PM_SaberBounceForAttack( int move ) +{ + switch ( saberMoveData[move].startQuad ) + { + case Q_B: + case Q_BR: + return LS_B1_BR; + break; + case Q_R: + return LS_B1__R; + break; + case Q_TR: + return LS_B1_TR; + break; + case Q_T: + return LS_B1_T_; + break; + case Q_TL: + return LS_B1_TL; + break; + case Q_L: + return LS_B1__L; + break; + case Q_BL: + return LS_B1_BL; + break; + } + return LS_NONE; +} + +saberMoveName_t PM_AttackMoveForQuad( int quad ) +{ + switch ( quad ) + { + case Q_B: + case Q_BR: + return LS_A_BR2TL; + break; + case Q_R: + return LS_A_R2L; + break; + case Q_TR: + return LS_A_TR2BL; + break; + case Q_T: + return LS_A_T2B; + break; + case Q_TL: + return LS_A_TL2BR; + break; + case Q_L: + return LS_A_L2R; + break; + case Q_BL: + return LS_A_BL2TR; + break; + } + return LS_NONE; +} + +int saberMoveTransitionAngle[Q_NUM_QUADS][Q_NUM_QUADS] = +{ + { + 0,//Q_BR,Q_BR, + 45,//Q_BR,Q_R, + 90,//Q_BR,Q_TR, + 135,//Q_BR,Q_T, + 180,//Q_BR,Q_TL, + 215,//Q_BR,Q_L, + 270,//Q_BR,Q_BL, + 45,//Q_BR,Q_B, + }, + { + 45,//Q_R,Q_BR, + 0,//Q_R,Q_R, + 45,//Q_R,Q_TR, + 90,//Q_R,Q_T, + 135,//Q_R,Q_TL, + 180,//Q_R,Q_L, + 215,//Q_R,Q_BL, + 90,//Q_R,Q_B, + }, + { + 90,//Q_TR,Q_BR, + 45,//Q_TR,Q_R, + 0,//Q_TR,Q_TR, + 45,//Q_TR,Q_T, + 90,//Q_TR,Q_TL, + 135,//Q_TR,Q_L, + 180,//Q_TR,Q_BL, + 135,//Q_TR,Q_B, + }, + { + 135,//Q_T,Q_BR, + 90,//Q_T,Q_R, + 45,//Q_T,Q_TR, + 0,//Q_T,Q_T, + 45,//Q_T,Q_TL, + 90,//Q_T,Q_L, + 135,//Q_T,Q_BL, + 180,//Q_T,Q_B, + }, + { + 180,//Q_TL,Q_BR, + 135,//Q_TL,Q_R, + 90,//Q_TL,Q_TR, + 45,//Q_TL,Q_T, + 0,//Q_TL,Q_TL, + 45,//Q_TL,Q_L, + 90,//Q_TL,Q_BL, + 135,//Q_TL,Q_B, + }, + { + 215,//Q_L,Q_BR, + 180,//Q_L,Q_R, + 135,//Q_L,Q_TR, + 90,//Q_L,Q_T, + 45,//Q_L,Q_TL, + 0,//Q_L,Q_L, + 45,//Q_L,Q_BL, + 90,//Q_L,Q_B, + }, + { + 270,//Q_BL,Q_BR, + 215,//Q_BL,Q_R, + 180,//Q_BL,Q_TR, + 135,//Q_BL,Q_T, + 90,//Q_BL,Q_TL, + 45,//Q_BL,Q_L, + 0,//Q_BL,Q_BL, + 45,//Q_BL,Q_B, + }, + { + 45,//Q_B,Q_BR, + 90,//Q_B,Q_R, + 135,//Q_B,Q_TR, + 180,//Q_B,Q_T, + 135,//Q_B,Q_TL, + 90,//Q_B,Q_L, + 45,//Q_B,Q_BL, + 0//Q_B,Q_B, + } +}; + +int PM_SaberAttackChainAngle( int move1, int move2 ) +{ + if ( move1 == -1 || move2 == -1 ) + { + return -1; + } + return saberMoveTransitionAngle[saberMoveData[move1].endQuad][saberMoveData[move2].startQuad]; +} + +qboolean PM_SaberKataDone( int curmove = LS_NONE, int newmove = LS_NONE ) +{ + if ( pm->ps->forceRageRecoveryTime > level.time ) + {//rage recovery, only 1 swing at a time (tired) + if ( pm->ps->saberAttackChainCount > 0 ) + {//swung once + return qtrue; + } + else + {//allow one attack + return qfalse; + } + } + else if ( (pm->ps->forcePowersActive&(1<ps->saber[0].maxChain == -1 ) + { + return qfalse; + } + else if ( pm->ps->saber[0].maxChain != 0 ) + { + if ( pm->ps->saberAttackChainCount >= pm->ps->saber[0].maxChain ) + { + return qtrue; + } + else + { + return qfalse; + } + } + + if ( pm->ps->saberAnimLevel == SS_DESANN || pm->ps->saberAnimLevel == SS_TAVION ) + {//desann and tavion can link up as many attacks as they want + return qfalse; + } + //FIXME: instead of random, apply some sort of logical conditions to whether or + // not you can chain? Like if you were completely missed, you can't chain as much, or...? + // And/Or based on FP_SABER_OFFENSE level? So number of attacks you can chain + // increases with your FP_SABER_OFFENSE skill? + if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + //TEMP: for now, let staff attacks infinitely chain + return qfalse; + /* + if ( pm->ps->saberAttackChainCount > Q_irand( 3, 4 ) ) + { + return qtrue; + } + else if ( pm->ps->saberAttackChainCount > 0 ) + { + int chainAngle = PM_SaberAttackChainAngle( curmove, newmove ); + if ( chainAngle < 135 || chainAngle > 215 ) + {//if trying to chain to a move that doesn't continue the momentum + if ( pm->ps->saberAttackChainCount > 1 ) + { + return qtrue; + } + } + else if ( chainAngle == 180 ) + {//continues the momentum perfectly, allow it to chain 66% of the time + if ( pm->ps->saberAttackChainCount > 2 ) + { + return qtrue; + } + } + else + {//would continue the movement somewhat, 50% chance of continuing + if ( pm->ps->saberAttackChainCount > 3 ) + { + return qtrue; + } + } + } + */ + } + else if ( pm->ps->saberAnimLevel == SS_DUAL ) + { + //TEMP: for now, let staff attacks infinitely chain + return qfalse; + } + else if ( pm->ps->saberAnimLevel == FORCE_LEVEL_3 ) + { + if ( curmove == LS_NONE || newmove == LS_NONE ) + { + if ( pm->ps->saberAnimLevel >= FORCE_LEVEL_3 && pm->ps->saberAttackChainCount > Q_irand( 0, 1 ) ) + { + return qtrue; + } + } + else if ( pm->ps->saberAttackChainCount > Q_irand( 2, 3 ) ) + { + return qtrue; + } + else if ( pm->ps->saberAttackChainCount > 0 ) + { + int chainAngle = PM_SaberAttackChainAngle( curmove, newmove ); + if ( chainAngle < 135 || chainAngle > 215 ) + {//if trying to chain to a move that doesn't continue the momentum + return qtrue; + } + else if ( chainAngle == 180 ) + {//continues the momentum perfectly, allow it to chain 66% of the time + if ( pm->ps->saberAttackChainCount > 1 ) + { + return qtrue; + } + } + else + {//would continue the movement somewhat, 50% chance of continuing + if ( pm->ps->saberAttackChainCount > 2 ) + { + return qtrue; + } + } + } + } +<<<<<<< HEAD + else if ( g_saberNewCombat->integer ) //new code +======= + else +>>>>>>> 38e3edc40da09b9c20f585a3b939ff493be8bf50 + {//FIXME: have chainAngle influence fast and medium chains as well? + if ( (pm->ps->saberAnimLevel == FORCE_LEVEL_3 || pm->ps->saberAnimLevel == SS_DUAL) + && pm->ps->saberAttackChainCount > Q_irand( 2, 5 ) ) + { + return qtrue; + } + } + else //old code + {//FIXME: have chainAngle influence fast and medium chains as well? + if ((pm->ps->saberAnimLevel == FORCE_LEVEL_2 || pm->ps->saberAnimLevel == SS_DUAL) + && pm->ps->saberAttackChainCount > Q_irand(2, 5)) + { + return qtrue; + } + } + return qfalse; +} + +qboolean PM_CheckEnemyInBack( float backCheckDist ) +{ + if ( !pm->gent || !pm->gent->client ) + { + return qfalse; + } + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) + && !g_saberAutoAim->integer && pm->cmd.forwardmove >= 0 ) + {//don't auto-backstab + return qfalse; + } + if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) + {//only when on ground + return qfalse; + } + trace_t trace; + vec3_t end, fwd, fwdAngles = {0,pm->ps->viewangles[YAW],0}; + + AngleVectors( fwdAngles, fwd, NULL, NULL ); + VectorMA( pm->ps->origin, -backCheckDist, fwd, end ); + + pm->trace( &trace, pm->ps->origin, vec3_origin, vec3_origin, end, pm->ps->clientNum, CONTENTS_SOLID|CONTENTS_BODY, (EG2_Collision)0, 0 ); + if ( trace.fraction < 1.0f && trace.entityNum < ENTITYNUM_WORLD ) + { + gentity_t *traceEnt = &g_entities[trace.entityNum]; + if ( traceEnt + && traceEnt->health > 0 + && traceEnt->client + && traceEnt->client->playerTeam == pm->gent->client->enemyTeam + && traceEnt->client->ps.groundEntityNum != ENTITYNUM_NONE ) + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + {//player + if ( pm->gent ) + {//set player enemy to traceEnt so he auto-aims at him + pm->gent->enemy = traceEnt; + } + } + return qtrue; + } + } + return qfalse; +} + +saberMoveName_t PM_PickBackStab( void ) +{ + if ( !pm->gent || !pm->gent->client ) + { + return LS_READY; + } + if ( pm->ps->dualSabers + && pm->ps->saber[1].Active() ) + { + if ( pm->ps->pm_flags & PMF_DUCKED ) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } + if ( pm->gent->client->ps.saberAnimLevel == SS_TAVION ) + { + return LS_A_BACKSTAB; + } + else if ( pm->gent->client->ps.saberAnimLevel == SS_DESANN ) + { + if ( pm->ps->saberMove == LS_READY || !Q_irand( 0, 3 ) ) + { + return LS_A_BACKSTAB; + } + else if ( pm->ps->pm_flags & PMF_DUCKED ) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } +<<<<<<< HEAD + else if ( (pm->ps->saberAnimLevel == FORCE_LEVEL_3 + || pm->ps->saberAnimLevel == SS_DUAL) && g_saberNewCombat->integer ) //new code +======= + else if ( pm->ps->saberAnimLevel == FORCE_LEVEL_2 + || pm->ps->saberAnimLevel == SS_DUAL ) +>>>>>>> 38e3edc40da09b9c20f585a3b939ff493be8bf50 + {//using medium attacks or dual sabers + if ( pm->ps->pm_flags & PMF_DUCKED ) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } + else if (pm->ps->saberAnimLevel == FORCE_LEVEL_2 + || pm->ps->saberAnimLevel == SS_DUAL) //old code + {//using medium attacks or dual sabers + if (pm->ps->pm_flags & PMF_DUCKED) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } + else + { + return LS_A_BACKSTAB; + } +} + +saberMoveName_t PM_CheckStabDown( void ) +{ + if ( !pm->gent || !pm->gent->enemy || !pm->gent->enemy->client ) + { + return LS_NONE; + } + if ( (pm->ps->saber[0].saberFlags&SFL_NO_STABDOWN) ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers + && (pm->ps->saber[1].saberFlags&SFL_NO_STABDOWN) ) + { + return LS_NONE; + } + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingKataAttack( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//want to try a special + return LS_NONE; + } + } + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + {//player + if ( pm->ps->groundEntityNum == ENTITYNUM_NONE )//in air + {//sorry must be on ground (or have just jumped) + if ( level.time-pm->ps->lastOnGround <= 50 && (pm->ps->pm_flags&PMF_JUMPING) ) + {//just jumped, it's okay + } + else + { + return LS_NONE; + } + } + /* + if ( pm->cmd.upmove > 0 ) + {//trying to jump + } + else if ( pm->ps->groundEntityNum == ENTITYNUM_NONE //in air + && level.time-pm->ps->lastOnGround <= 250 //just left ground + && (pm->ps->pm_flags&PMF_JUMPING) )//jumped + {//just jumped + } + else + { + return LS_NONE; + } + */ + pm->ps->velocity[2] = 0; + pm->cmd.upmove = 0; + } + else if ( (pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) ) + {//NPC + if ( pm->ps->groundEntityNum == ENTITYNUM_NONE )//in air + {//sorry must be on ground (or have just jumped) + if ( level.time-pm->ps->lastOnGround <= 250 && (pm->ps->pm_flags&PMF_JUMPING) ) + {//just jumped, it's okay + } + else + { + return LS_NONE; + } + } + if ( !pm->gent->NPC ) + {//wtf??? + return LS_NONE; + } + if ( Q_irand( 0, RANK_CAPTAIN ) > pm->gent->NPC->rank ) + {//lower ranks do this less often + return LS_NONE; + } + } + vec3_t enemyDir, faceFwd, facingAngles = {0, pm->ps->viewangles[YAW], 0}; + AngleVectors( facingAngles, faceFwd, NULL, NULL ); + VectorSubtract( pm->gent->enemy->currentOrigin, pm->ps->origin, enemyDir ); + float enemyZDiff = enemyDir[2]; + enemyDir[2] = 0; + float enemyHDist = VectorNormalize( enemyDir )-(pm->gent->maxs[0]+pm->gent->enemy->maxs[0]); + float dot = DotProduct( enemyDir, faceFwd ); + + if ( //(pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + dot > 0.65f + //&& enemyHDist >= 32 //was 48 + && enemyHDist <= 164//was 112 + && PM_InKnockDownOnGround( &pm->gent->enemy->client->ps )//still on ground + && !PM_InGetUpNoRoll( &pm->gent->enemy->client->ps )//not getting up yet + && enemyZDiff <= 20 ) + {//guy is on the ground below me, do a top-down attack + if ( pm->gent->enemy->s.number >= MAX_CLIENTS + || !G_ControlledByPlayer( pm->gent->enemy ) ) + {//don't get up while I'm doing this + //stop them from trying to get up for at least another 3 seconds + TIMER_Set( pm->gent->enemy, "noGetUpStraight", 3000 ); + } + //pick the right anim + if ( pm->ps->saberAnimLevel == SS_DUAL + || (pm->ps->dualSabers&&pm->ps->saber[1].Active()) ) + { + return LS_STABDOWN_DUAL; + } + else if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + return LS_STABDOWN_STAFF; + } + else + { + return LS_STABDOWN; + } + } + return LS_NONE; +} + +extern saberMoveName_t PM_NPCSaberAttackFromQuad( int quad ); +saberMoveName_t PM_SaberFlipOverAttackMove( void ); +saberMoveName_t PM_AttackForEnemyPos( qboolean allowFB, qboolean allowStabDown ) +{ + saberMoveName_t autoMove = LS_INVALID; + + if( !pm->gent->enemy ) + { + return LS_NONE; + } + + vec3_t enemy_org, enemyDir, faceFwd, faceRight, faceUp, facingAngles = {0, pm->ps->viewangles[YAW], 0}; + AngleVectors( facingAngles, faceFwd, faceRight, faceUp ); + //FIXME: predict enemy position? + if ( pm->gent->enemy->client ) + { + //VectorCopy( pm->gent->enemy->currentOrigin, enemy_org ); + //HMM... using this will adjust for bbox size, so let's do that... + vec3_t size; + VectorSubtract( pm->gent->enemy->absmax, pm->gent->enemy->absmin, size ); + VectorMA( pm->gent->enemy->absmin, 0.5, size, enemy_org ); + + VectorSubtract( pm->gent->enemy->client->renderInfo.eyePoint, pm->ps->origin, enemyDir ); + } + else + { + if ( pm->gent->enemy->bmodel && VectorCompare( vec3_origin, pm->gent->enemy->currentOrigin ) ) + {//a brush model without an origin brush + vec3_t size; + VectorSubtract( pm->gent->enemy->absmax, pm->gent->enemy->absmin, size ); + VectorMA( pm->gent->enemy->absmin, 0.5, size, enemy_org ); + } + else + { + VectorCopy( pm->gent->enemy->currentOrigin, enemy_org ); + } + VectorSubtract( enemy_org, pm->ps->origin, enemyDir ); + } + float enemyZDiff = enemyDir[2]; + float enemyDist = VectorNormalize( enemyDir ); + float dot = DotProduct( enemyDir, faceFwd ); + if ( dot > 0 ) + {//enemy is in front + if ( allowStabDown ) + {//okay to try this + saberMoveName_t stabDownMove = PM_CheckStabDown(); + if ( stabDownMove != LS_NONE ) + { + return stabDownMove; + } + } + if ( (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + && dot > 0.65f + && enemyDist <= 64 && pm->gent->enemy->client + && (enemyZDiff <= 20 || PM_InKnockDownOnGround( &pm->gent->enemy->client->ps ) || PM_CrouchAnim( pm->gent->enemy->client->ps.legsAnim ) ) ) + {//swing down at them + return LS_A_T2B; + } + if ( allowFB ) + {//directly in front anim allowed + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK)) ) + {//okay to do backstabs with this saber + if ( enemyDist > 200 || pm->gent->enemy->health <= 0 ) + {//hmm, look in back for an enemy + if ( pm->ps->clientNum && !PM_ControlledByPlayer() ) + {//player should never do this automatically + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//only when on ground + if ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) + {//only fencers and higher can do this, higher rank does it more + if ( PM_CheckEnemyInBack( 100 ) ) + { + return PM_PickBackStab(); + } + } + } + } + } + } + //this is the default only if they're *right* in front... + if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) + || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) ) + {//NPC or player not in 1st person + if ( PM_CheckFlipOverAttackMove( qtrue ) ) + {//enemy must be close and in front + return PM_SaberFlipOverAttackMove(); + } + } + if ( PM_CheckLungeAttackMove() ) + {//NPC + autoMove = PM_SaberLungeAttackMove( qtrue ); + } + else + { + autoMove = LS_A_T2B; + } + } + else + {//pick a random one + if ( Q_irand( 0, 1 ) ) + { + autoMove = LS_A_TR2BL; + } + else + { + autoMove = LS_A_TL2BR; + } + } + float dotR = DotProduct( enemyDir, faceRight ); + if ( dotR > 0.35 ) + {//enemy is to far right + autoMove = LS_A_L2R; + } + else if ( dotR < -0.35 ) + {//far left + autoMove = LS_A_R2L; + } + else if ( dotR > 0.15 ) + {//enemy is to near right + autoMove = LS_A_TR2BL; + } + else if ( dotR < -0.15 ) + {//near left + autoMove = LS_A_TL2BR; + } + if ( DotProduct( enemyDir, faceUp ) > 0.5 ) + {//enemy is above me + if ( autoMove == LS_A_TR2BL ) + { + autoMove = LS_A_BL2TR; + } + else if ( autoMove == LS_A_TL2BR ) + { + autoMove = LS_A_BR2TL; + } + } + } + else if ( allowFB ) + {//back attack allowed + //if ( !PM_InKnockDown( pm->ps ) ) + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK)) ) + {//okay to do backstabs with this saber + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//only when on ground + if ( !pm->gent->enemy->client || pm->gent->enemy->client->ps.groundEntityNum != ENTITYNUM_NONE ) + {//enemy not a client or is a client and on ground + if ( dot < -0.75f + && enemyDist < 128 + && (pm->ps->saberAnimLevel == SS_FAST || pm->ps->saberAnimLevel == SS_STAFF || (pm->gent->client &&(pm->gent->client->NPC_class == CLASS_TAVION||pm->gent->client->NPC_class == CLASS_ALORA)&&Q_irand(0,2))) ) + {//fast back-stab + if ( !(pm->ps->pm_flags&PMF_DUCKED) && pm->cmd.upmove >= 0 ) + {//can't do it while ducked? + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || (pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG) ) + {//only fencers and above can do this + autoMove = LS_A_BACKSTAB; + } + } + } + else if ( pm->ps->saberAnimLevel != SS_FAST + && pm->ps->saberAnimLevel != SS_STAFF ) + {//higher level back spin-attacks + if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) ) + { + if ( (pm->ps->pm_flags&PMF_DUCKED) || pm->cmd.upmove < 0 ) + { + autoMove = LS_A_BACK_CR; + } + else + { + autoMove = LS_A_BACK; + } + } + } + } + } + } + } + return autoMove; +} + +qboolean PM_InSecondaryStyle( void ) +{ + if ( pm->ps->saber[0].numBlades > 1 + && pm->ps->saber[0].singleBladeStyle + && (pm->ps->saber[0].stylesForbidden&(1<ps->saber[0].singleBladeStyle)) + && pm->ps->saberAnimLevel == pm->ps->saber[0].singleBladeStyle ) + { + return qtrue; + } + + if ( pm->ps->dualSabers + && !pm->ps->saber[1].Active() )//pm->ps->saberAnimLevel != SS_DUAL ) + { + return qtrue; + } + return qfalse; +} + +saberMoveName_t PM_SaberLungeAttackMove( qboolean fallbackToNormalLunge ) +{ + G_DrainPowerForSpecialMove( pm->gent, FP_SABER_OFFENSE, SABER_ALT_ATTACK_POWER_FB ); + + //see if we have an overridden (or cancelled) lunge move + if ( pm->ps->saber[0].lungeAtkMove != LS_INVALID ) + { + if ( pm->ps->saber[0].lungeAtkMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].lungeAtkMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].lungeAtkMove != LS_INVALID ) + { + if ( pm->ps->saber[1].lungeAtkMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].lungeAtkMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].lungeAtkMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].lungeAtkMove == LS_NONE ) + { + return LS_NONE; + } + } + //do normal checks + if ( pm->gent->client->NPC_class == CLASS_ALORA && !Q_irand( 0, 3 ) ) + {//alora NPC + return LS_SPINATTACK_ALORA; + } + else + { + if ( pm->ps->dualSabers ) + { + return LS_SPINATTACK_DUAL; + } + switch ( pm->ps->saberAnimLevel ) + { + case SS_DUAL: + return LS_SPINATTACK_DUAL; + break; + case SS_STAFF: + return LS_SPINATTACK; + break; + default://normal lunge + if ( fallbackToNormalLunge ) + { + vec3_t fwdAngles, jumpFwd; + + VectorCopy( pm->ps->viewangles, fwdAngles ); + fwdAngles[PITCH] = fwdAngles[ROLL] = 0; + //do the lunge + AngleVectors( fwdAngles, jumpFwd, NULL, NULL ); + VectorScale( jumpFwd, 150, pm->ps->velocity ); + pm->ps->velocity[2] = 50; + PM_AddEvent( EV_JUMP ); + + return LS_A_LUNGE; + } + break; + } + } + return LS_NONE; +} + +qboolean PM_CheckLungeAttackMove( void ) +{ + //check to see if it's cancelled? + if ( pm->ps->saber[0].lungeAtkMove == LS_NONE ) + { + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].lungeAtkMove == LS_NONE + || pm->ps->saber[1].lungeAtkMove == LS_INVALID ) + { + return qfalse; + } + } + else + { + return qfalse; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].lungeAtkMove == LS_NONE ) + { + if ( pm->ps->saber[0].lungeAtkMove == LS_NONE + || pm->ps->saber[0].lungeAtkMove == LS_INVALID ) + { + return qfalse; + } + } + } + //do normal checks + if ( pm->ps->saberAnimLevel == SS_FAST//fast + || pm->ps->saberAnimLevel == SS_DUAL//dual + || pm->ps->saberAnimLevel == SS_STAFF //staff + || pm->ps->saberAnimLevel == SS_DESANN + || pm->ps->dualSabers ) + {//alt+back+attack using fast, dual or staff attacks + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->cmd.upmove < 0 || (pm->ps->pm_flags&PMF_DUCKED) ) + {//ducking + if ( pm->ps->legsAnim == BOTH_STAND2 + || pm->ps->legsAnim == BOTH_SABERFAST_STANCE + || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE + || pm->ps->legsAnim == BOTH_SABERSTAFF_STANCE + || pm->ps->legsAnim == BOTH_SABERDUAL_STANCE + || (level.time-pm->ps->lastStationary) <= 500 ) + {//standing or just stopped standing + if ( pm->gent + && pm->gent->NPC //NPC + && pm->gent->NPC->rank >= RANK_LT_JG //high rank + && ( pm->gent->NPC->rank == RANK_LT_JG || Q_irand( -3, pm->gent->NPC->rank ) >= RANK_LT_JG )//Q_irand( 0, pm->gent->NPC->rank ) >= RANK_LT_JG ) + && !Q_irand( 0, 3-g_spskill->integer ) ) + {//only fencer and higher can do this + if ( pm->ps->saberAnimLevel == SS_DESANN ) + { + if ( !Q_irand( 0, 4 ) ) + { + return qtrue; + } + } + else + { + return qtrue; + } + } + } + } + } + else + {//player + if ( G_TryingLungeAttack( pm->gent, &pm->cmd ) + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB )/*pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB*/ )//have enough force power to pull it off + { + return qtrue; + } + } + } + + return qfalse; +} + +saberMoveName_t PM_SaberJumpForwardAttackMove( void ) +{ + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_FB ); + + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].jumpAtkFwdMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkFwdMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].jumpAtkFwdMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove != LS_INVALID ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].jumpAtkFwdMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + { + return LS_NONE; + } + } + if ( pm->ps->saberAnimLevel == SS_DUAL + || pm->ps->saberAnimLevel == SS_STAFF ) + { + pm->cmd.upmove = 0;//no jump just yet + + if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + if ( Q_irand(0, 1) ) + { + return LS_JUMPATTACK_STAFF_LEFT; + } + else + { + return LS_JUMPATTACK_STAFF_RIGHT; + } + } + + return LS_JUMPATTACK_DUAL; + } + else + { + vec3_t fwdAngles, jumpFwd; + + VectorCopy( pm->ps->viewangles, fwdAngles ); + fwdAngles[PITCH] = fwdAngles[ROLL] = 0; + AngleVectors( fwdAngles, jumpFwd, NULL, NULL ); + VectorScale( jumpFwd, 200, pm->ps->velocity ); + pm->ps->velocity[2] = 180; + pm->ps->forceJumpZStart = pm->ps->origin[2];//so we don't take damage if we land at same height + pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; + + //FIXME: NPCs yell? + PM_AddEvent( EV_JUMP ); + G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); + pm->cmd.upmove = 0; + + return LS_A_JUMP_T__B_; + } +} + +qboolean PM_CheckJumpForwardAttackMove( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return qfalse; + } + + //check to see if it's cancelled? + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + { + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[1].jumpAtkFwdMove == LS_INVALID ) + { + return qfalse; + } + } + else + { + return qfalse; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + { + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[0].jumpAtkFwdMove == LS_INVALID ) + { + return qfalse; + } + } + } + //do normal checks + + if ( pm->cmd.forwardmove > 0 //going forward + && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //can force jump + && pm->gent && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped (if not player) + ) + { + if ( pm->ps->saberAnimLevel == SS_DUAL + || pm->ps->saberAnimLevel == SS_STAFF ) + {//dual and staff + if ( !PM_SaberInTransitionAny( pm->ps->saberMove ) //not going to/from/between an attack anim + && !PM_SaberInAttack( pm->ps->saberMove ) //not in attack anim + && pm->ps->weaponTime <= 0//not busy + && (pm->cmd.buttons&BUTTON_ATTACK) )//want to attack + { + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING) )//jumping NPC + { + if ( pm->gent + && pm->gent->NPC + && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) + { + return qtrue; + } + } + } + else + {//PLAYER + if ( G_TryingJumpForwardAttack( pm->gent, &pm->cmd ) + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB ) )//have enough power to attack + { + return qtrue; + } + } + } + } + //check strong + else if ( pm->ps->saberAnimLevel == SS_STRONG //strong style + || pm->ps->saberAnimLevel == SS_DESANN )//desann + { + if ( //&& !PM_InKnockDown( pm->ps ) + !pm->ps->dualSabers + //&& (pm->ps->legsAnim == BOTH_STAND2||pm->ps->legsAnim == BOTH_SABERFAST_STANCE||pm->ps->legsAnim == BOTH_SABERSLOW_STANCE||level.time-pm->ps->lastStationary<=500)//standing or just started moving + ) + {//strong attack: jump-hack + /* + if ( pm->ps->legsAnim == BOTH_STAND2 + || pm->ps->legsAnim == BOTH_SABERFAST_STANCE + || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE + || level.time-pm->ps->lastStationary <= 250 )//standing or just started moving + */ + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING) )//NPC jumping + { + if ( pm->gent + && pm->gent->NPC + && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) + {//only acrobat or boss and higher can do this + if ( pm->ps->legsAnim == BOTH_STAND2 + || pm->ps->legsAnim == BOTH_SABERFAST_STANCE + || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE + || level.time-pm->ps->lastStationary <= 250 ) + {//standing or just started moving + if ( pm->gent->client + && pm->gent->client->NPC_class == CLASS_DESANN ) + { + if ( !Q_irand( 0, 1 ) ) + { + return qtrue; + } + } + else + { + return qtrue; + } + } + } + } + } + else + {//player + if ( G_TryingJumpForwardAttack( pm->gent, &pm->cmd ) + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB ) ) + { + return qtrue; + } + } + } + } + } + return qfalse; +} + +saberMoveName_t PM_SaberFlipOverAttackMove( void ) +{ + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].jumpAtkFwdMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkFwdMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].jumpAtkFwdMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove != LS_INVALID ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].jumpAtkFwdMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + { + return LS_NONE; + } + } + //FIXME: check above for room enough to jump! + //FIXME: while in this jump, keep velocity[2] at a minimum until the end of the anim + vec3_t fwdAngles, jumpFwd; + + VectorCopy( pm->ps->viewangles, fwdAngles ); + fwdAngles[PITCH] = fwdAngles[ROLL] = 0; + AngleVectors( fwdAngles, jumpFwd, NULL, NULL ); + VectorScale( jumpFwd, 150, pm->ps->velocity ); + pm->ps->velocity[2] = 250; + //250 is normalized for a standing enemy at your z level, about 64 tall... adjust for actual maxs[2]-mins[2] of enemy and for zdiff in origins + if ( pm->gent && pm->gent->enemy ) + { //go higher for taller enemies + pm->ps->velocity[2] *= (pm->gent->enemy->maxs[2]-pm->gent->enemy->mins[2])/64.0f; + //go higher for enemies higher than you, lower for those lower than you + float zDiff = pm->gent->enemy->currentOrigin[2] - pm->ps->origin[2]; + pm->ps->velocity[2] += (zDiff)*1.5f; + //clamp to decent-looking values + //FIXME: still jump too low sometimes + if ( zDiff <= 0 && pm->ps->velocity[2] < 200 ) + {//if we're on same level, don't let me jump so low, I clip into the ground + pm->ps->velocity[2] = 200; + } + else if ( pm->ps->velocity[2] < 50 ) + { + pm->ps->velocity[2] = 50; + } + else if ( pm->ps->velocity[2] > 400 ) + { + pm->ps->velocity[2] = 400; + } + } + pm->ps->forceJumpZStart = pm->ps->origin[2];//so we don't take damage if we land at same height + pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; + + //FIXME: NPCs yell? + PM_AddEvent( EV_JUMP ); + G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); + pm->cmd.upmove = 0; + //FIXME: don't allow this to land on other people + + pm->gent->angle = pm->ps->viewangles[YAW];//so we know what yaw we started this at + + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_FB ); + + if ( Q_irand( 0, 1 ) ) + { + return LS_A_FLIP_STAB; + } + else + { + return LS_A_FLIP_SLASH; + } +} + +qboolean PM_CheckFlipOverAttackMove( qboolean checkEnemy ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return qfalse; + } + //check to see if it's cancelled? + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + { + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[1].jumpAtkFwdMove == LS_INVALID ) + { + return qfalse; + } + } + else + { + return qfalse; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + { + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[0].jumpAtkFwdMove == LS_INVALID ) + { + return qfalse; + } + } + } + //do normal checks + + if ( (pm->ps->saberAnimLevel == SS_MEDIUM //medium + || pm->ps->saberAnimLevel == SS_TAVION )//tavion + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //can force jump + && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped + ) + { + qboolean tryMove = qfalse; + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->cmd.upmove > 0//want to jump + || (pm->ps->pm_flags&PMF_JUMPING) )//jumping + {//flip over-forward down-attack + if ( (pm->gent->NPC + && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) + && !Q_irand(0, 2) ) )//NPC who can do this, 33% chance + {//only player or acrobat or boss and higher can do this + tryMove = qtrue; + } + } + } + else + {//player + if ( G_TryingJumpForwardAttack( pm->gent, &pm->cmd ) + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB ) )//have enough power + { + if ( !pm->cmd.rightmove ) + { + if ( pm->ps->legsAnim == BOTH_JUMP1 + || pm->ps->legsAnim == BOTH_FORCEJUMP1 + || pm->ps->legsAnim == BOTH_INAIR1 + || pm->ps->legsAnim == BOTH_FORCEINAIR1 ) + {//in a non-flip forward jump + tryMove = qtrue; + } + } + } + } + + if ( tryMove ) + { + if ( !checkEnemy ) + {//based just on command input + return qtrue; + } + else + {//based on presence of enemy + if ( pm->gent->enemy )//have an enemy + { + vec3_t fwdAngles = {0,pm->ps->viewangles[YAW],0}; + if ( pm->gent->enemy->health > 0 + && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period + && pm->gent->enemy->maxs[2] > 12 + && (!pm->gent->enemy->client || !PM_InKnockDownOnGround( &pm->gent->enemy->client->ps ) ) + && DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ) < 10000 + && InFront( pm->gent->enemy->currentOrigin, pm->gent->currentOrigin, fwdAngles, 0.3f ) ) + {//enemy must be alive, not low to ground, close and in front + return qtrue; + } + } + return qfalse; + } + } + } + return qfalse; +} + +saberMoveName_t PM_SaberBackflipAttackMove( void ) +{ + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].jumpAtkBackMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkBackMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].jumpAtkBackMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkBackMove != LS_INVALID ) + { + if ( pm->ps->saber[1].jumpAtkBackMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].jumpAtkBackMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].jumpAtkBackMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkBackMove == LS_NONE ) + { + return LS_NONE; + } + } + pm->cmd.upmove = 0;//no jump just yet + return LS_A_BACKFLIP_ATK; +} + +qboolean PM_CheckBackflipAttackMove( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return qfalse; + } + + //check to see if it's cancelled? + if ( pm->ps->saber[0].jumpAtkBackMove == LS_NONE ) + { + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkBackMove == LS_NONE + || pm->ps->saber[1].jumpAtkBackMove == LS_INVALID ) + { + return qfalse; + } + } + else + { + return qfalse; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkBackMove == LS_NONE ) + { + if ( pm->ps->saber[0].jumpAtkBackMove == LS_NONE + || pm->ps->saber[0].jumpAtkBackMove == LS_INVALID ) + { + return qfalse; + } + } + } + //do normal checks + + if ( pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //can force jump + && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period + && pm->gent && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one + //&& (pm->ps->legsAnim == BOTH_SABERSTAFF_STANCE || level.time-pm->ps->lastStationary<=250)//standing or just started moving + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) )//on ground or just jumped (if not player) + { + if ( pm->cmd.forwardmove < 0 //moving backwards + && pm->ps->saberAnimLevel == SS_STAFF //using staff + && (pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING)) )//jumping + {//jumping backwards and using staff + if ( !PM_SaberInTransitionAny( pm->ps->saberMove ) //not going to/from/between an attack anim + && !PM_SaberInAttack( pm->ps->saberMove ) //not in attack anim + && pm->ps->weaponTime <= 0//not busy + && (pm->cmd.buttons&BUTTON_ATTACK) )//want to attack + {//not already attacking + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->gent + && pm->gent->NPC + && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) + {//acrobat or boss and higher can do this + return qtrue; + } + } + else + {//player + return qtrue; + } + } + } + } + return qfalse; +} + +saberMoveName_t PM_CheckDualSpinProtect( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return LS_NONE; + } + + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].kataMove != LS_INVALID ) + { + if ( pm->ps->saber[0].kataMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].kataMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].kataMove != LS_INVALID ) + { + if ( pm->ps->saber[1].kataMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].kataMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].kataMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].kataMove == LS_NONE ) + { + return LS_NONE; + } + } + //do normal checks + if ( pm->ps->saberMove == LS_READY//ready + //&& (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//PLAYER ONLY...? + //&& pm->ps->viewangles[0] > 30 //looking down + && pm->ps->saberAnimLevel == SS_DUAL//using dual saber style + && pm->ps->saber[0].Active() && pm->ps->saber[1].Active()//both sabers on + //&& pm->ps->forcePowerLevel[FP_PUSH]>=FORCE_LEVEL_3//force push 3 + //&& ((pm->ps->forcePowersActive&(1<ps->forcePowerDebounce[FP_PUSH]>level.time)//force-pushing + && G_TryingKataAttack( pm->gent, &pm->cmd )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER, qtrue )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER//DUAL_SPIN_PROTECT_POWER//force push 3 + && (pm->cmd.buttons&BUTTON_ATTACK)//pressing attack + ) + {//FIXME: some NPC logic to do this? + /* + if ( (pm->ps->pm_flags&PMF_DUCKED||pm->cmd.upmove<0)//crouching + && g_crosshairEntNum >= ENTITYNUM_WORLD ) + */ + { + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_PUSH, SABER_ALT_ATTACK_POWER, qtrue );//drain the required force power + } + return LS_DUAL_SPIN_PROTECT; + } + } + return LS_NONE; +} + +saberMoveName_t PM_CheckStaffKata( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return LS_NONE; + } + + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].kataMove != LS_INVALID ) + { + if ( pm->ps->saber[0].kataMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].kataMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].kataMove != LS_INVALID ) + { + if ( pm->ps->saber[1].kataMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].kataMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].kataMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].kataMove == LS_NONE ) + { + return LS_NONE; + } + } + //do normal checks + if ( pm->ps->saberMove == LS_READY//ready + //&& (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//PLAYER ONLY...? + //&& pm->ps->viewangles[0] > 30 //looking down + && pm->ps->saberAnimLevel == SS_STAFF//using dual saber style + && pm->ps->saber[0].Active()//saber on + //&& pm->ps->forcePowerLevel[FP_PUSH]>=FORCE_LEVEL_3//force push 3 + //&& ((pm->ps->forcePowersActive&(1<ps->forcePowerDebounce[FP_PUSH]>level.time)//force-pushing + && G_TryingKataAttack( pm->gent, &pm->cmd )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER, qtrue )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER//DUAL_SPIN_PROTECT_POWER//force push 3 + && (pm->cmd.buttons&BUTTON_ATTACK)//pressing attack + ) + {//FIXME: some NPC logic to do this? + /* + if ( (pm->ps->pm_flags&PMF_DUCKED||pm->cmd.upmove<0)//crouching + && g_crosshairEntNum >= ENTITYNUM_WORLD ) + */ + { + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER, qtrue );//drain the required force power + } + return LS_STAFF_SOULCAL; + } + } + return LS_NONE; +} + +extern qboolean WP_ForceThrowable( gentity_t *ent, gentity_t *forwardEnt, gentity_t *self, qboolean pull, float cone, float radius, vec3_t forward ); +saberMoveName_t PM_CheckPullAttack( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return LS_NONE; + } + + if ( (pm->ps->saber[0].saberFlags&SFL_NO_PULL_ATTACK) ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers + && (pm->ps->saber[1].saberFlags&SFL_NO_PULL_ATTACK) ) + { + return LS_NONE; + } + + if ( (pm->ps->saberMove == LS_READY||PM_SaberInReturn(pm->ps->saberMove)||PM_SaberInReflect(pm->ps->saberMove))//ready + //&& (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//PLAYER ONLY + && pm->ps->saberAnimLevel >= SS_FAST//single saber styles - FIXME: Tavion? + && pm->ps->saberAnimLevel <= SS_STRONG//single saber styles - FIXME: Tavion? + && G_TryingPullAttack( pm->gent, &pm->cmd, qfalse )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus + //&& pm->cmd.forwardmove<0//pulling back + && (pm->cmd.buttons&BUTTON_ATTACK)//attacking + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB//have enough power + ) + {//FIXME: some NPC logic to do this? + qboolean doMove = g_saberNewControlScheme->integer?qtrue:qfalse;//in new control scheme, can always do this, even if there's no-one to do it to + if ( g_saberNewControlScheme->integer + || g_crosshairEntNum < ENTITYNUM_WORLD )//in old control scheme, there has to be someone there + { + saberMoveName_t pullAttackMove = LS_NONE; + if ( pm->ps->saberAnimLevel == SS_FAST ) + { + pullAttackMove = LS_PULL_ATTACK_STAB; + } + else + { + pullAttackMove = LS_PULL_ATTACK_SWING; + } + + if ( g_crosshairEntNum < ENTITYNUM_WORLD + && pm->gent && pm->gent->client ) + { + gentity_t *targEnt = &g_entities[g_crosshairEntNum]; + if ( targEnt->client + && targEnt->health > 0 + //FIXME: check other things like in knockdown, saberlock, uninterruptable anims, etc. + && !PM_InOnGroundAnim( &targEnt->client->ps ) + && !PM_LockedAnim( targEnt->client->ps.legsAnim ) + && !PM_SuperBreakLoseAnim( targEnt->client->ps.legsAnim ) + && !PM_SuperBreakWinAnim( targEnt->client->ps.legsAnim ) + && targEnt->client->ps.saberLockTime <= 0 + && WP_ForceThrowable( targEnt, targEnt, pm->gent, qtrue, 1.0f, 0.0f, NULL ) ) + { + if ( !g_saberNewControlScheme->integer ) + {//in old control scheme, make sure they're close or far enough away for the move we'll be doing + float targDist = Distance( targEnt->currentOrigin, pm->ps->origin ); + if ( pullAttackMove == LS_PULL_ATTACK_STAB ) + {//must be closer than 512 + if ( targDist > 384.0f ) + { + return LS_NONE; + } + } + else//if ( pullAttackMove == LS_PULL_ATTACK_SWING ) + {//must be farther than 256 + if ( targDist > 512.0f ) + { + return LS_NONE; + } + if ( targDist < 192.0f ) + { + return LS_NONE; + } + } + } + + vec3_t targAngles = {0,targEnt->client->ps.viewangles[YAW],0}; + if ( InFront( pm->ps->origin, targEnt->currentOrigin, targAngles ) ) + { + NPC_SetAnim( targEnt, SETANIM_BOTH, BOTH_PULLED_INAIR_F, SETANIM_FLAG_OVERRIDE, SETANIM_FLAG_HOLD ); + } + else + { + NPC_SetAnim( targEnt, SETANIM_BOTH, BOTH_PULLED_INAIR_B, SETANIM_FLAG_OVERRIDE, SETANIM_FLAG_HOLD ); + } + //hold the anim until I'm with done pull anim + targEnt->client->ps.legsAnimTimer = targEnt->client->ps.torsoAnimTimer = PM_AnimLength( pm->gent->client->clientInfo.animFileIndex, (animNumber_t)saberMoveData[pullAttackMove].animToUse ); + //set pullAttackTime + pm->gent->client->ps.pullAttackTime = targEnt->client->ps.pullAttackTime = level.time+targEnt->client->ps.legsAnimTimer; + //make us know about each other + pm->gent->client->ps.pullAttackEntNum = g_crosshairEntNum; + targEnt->client->ps.pullAttackEntNum = pm->ps->clientNum; + //do effect and sound on me + pm->ps->powerups[PW_FORCE_PUSH] = level.time + 1000; + if ( pm->gent ) + { + G_Sound( pm->gent, G_SoundIndex( "sound/weapons/force/pull.wav" ) ); + } + doMove = qtrue; + } + } + if ( doMove ) + { + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_PULL, SABER_ALT_ATTACK_POWER_FB ); + } + return pullAttackMove; + } + } + } + return LS_NONE; +} + +saberMoveName_t PM_CheckPlayerAttackFromParry( int curmove ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) + { + if ( curmove >= LS_PARRY_UP + && curmove <= LS_REFLECT_LL ) + {//in a parry + switch ( saberMoveData[curmove].endQuad ) + { + case Q_T: + return LS_A_T2B; + break; + case Q_TR: + return LS_A_TR2BL; + break; + case Q_TL: + return LS_A_TL2BR; + break; + case Q_BR: + return LS_A_BR2TL; + break; + case Q_BL: + return LS_A_BL2TR; + break; + //shouldn't be a parry that ends at L, R or B + } + } + } + return LS_NONE; +} + + +saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int curmove ) +{ + qboolean noSpecials = qfalse; + + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + noSpecials = qtrue; + } + + saberMoveName_t overrideJumpRightAttackMove = LS_INVALID; + if ( pm->ps->saber[0].jumpAtkRightMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkRightMove != LS_NONE ) + {//actually overriding + overrideJumpRightAttackMove = (saberMoveName_t)pm->ps->saber[0].jumpAtkRightMove; + } + else if ( pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkRightMove > LS_NONE ) + {//would be cancelling it, but check the second saber, too + overrideJumpRightAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkRightMove; + } + else + {//nope, just cancel it + overrideJumpRightAttackMove = LS_NONE; + } + } + else if ( pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkRightMove != LS_INVALID ) + {//first saber not overridden, check second + overrideJumpRightAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkRightMove; + } + + saberMoveName_t overrideJumpLeftAttackMove = LS_INVALID; + if ( pm->ps->saber[0].jumpAtkLeftMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkLeftMove != LS_NONE ) + {//actually overriding + overrideJumpLeftAttackMove = (saberMoveName_t)pm->ps->saber[0].jumpAtkLeftMove; + } + else if ( pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkLeftMove > LS_NONE ) + {//would be cancelling it, but check the second saber, too + overrideJumpLeftAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkLeftMove; + } + else + {//nope, just cancel it + overrideJumpLeftAttackMove = LS_NONE; + } + } + else if ( pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkLeftMove != LS_INVALID ) + {//first saber not overridden, check second + overrideJumpLeftAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkLeftMove; + } + if ( rightmove > 0 ) + {//moving right + if ( !noSpecials + && overrideJumpRightAttackMove != LS_NONE + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped + && (pm->cmd.buttons&BUTTON_ATTACK)//hitting attack + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0//have force jump 1 at least + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_LR )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_LR//have enough power + && (((pm->ps->clientNum>=MAX_CLIENTS&&!PM_ControlledByPlayer())&&pm->cmd.upmove > 0)//jumping NPC + ||((pm->ps->clientNumgent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/)) )//focus-holding player + {//cartwheel right + vec3_t right, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_LR ); + } + pm->cmd.upmove = 0; + if ( overrideJumpRightAttackMove != LS_INVALID ) + {//overridden with another move + return overrideJumpRightAttackMove; + } + else if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + AngleVectors( fwdAngles, NULL, right, NULL ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA( pm->ps->velocity, 190, right, pm->ps->velocity ); + return LS_BUTTERFLY_RIGHT; + } + else + { + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_CARTWHEELS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_CARTWHEELS)) ) + {//okay to do cartwheels with this saber + /* + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//still on ground + VectorClear( pm->ps->velocity ); + return LS_JUMPATTACK_CART_RIGHT; + } + else + */ + {//in air + AngleVectors( fwdAngles, NULL, right, NULL ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA( pm->ps->velocity, 190, right, pm->ps->velocity ); + PM_SetJumped( JUMP_VELOCITY, qtrue ); + return LS_JUMPATTACK_ARIAL_RIGHT; + } + } + } + } + else if ( pm->ps->legsAnim != BOTH_CARTWHEEL_RIGHT + && pm->ps->legsAnim != BOTH_ARIAL_RIGHT ) + {//not in a cartwheel/arial + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/ )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + if ( forwardmove > 0 ) + {//forward right = TL2BR slash + return LS_A_TL2BR; + } + else if ( forwardmove < 0 ) + {//backward right = BL2TR uppercut + return LS_A_BL2TR; + } + else + {//just right is a left slice + return LS_A_L2R; + } + } + } + else if ( rightmove < 0 ) + {//moving left + if ( !noSpecials + && overrideJumpLeftAttackMove != LS_NONE + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped + && (pm->cmd.buttons&BUTTON_ATTACK)//hitting attack + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0//have force jump 1 at least + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_LR )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_LR//have enough power + && (((pm->ps->clientNum>=MAX_CLIENTS&&!PM_ControlledByPlayer())&&pm->cmd.upmove > 0)//jumping NPC + ||((pm->ps->clientNumgent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/)) )//focus-holding player + {//cartwheel left + vec3_t right, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_LR ); + } + pm->cmd.upmove = 0; + if ( overrideJumpRightAttackMove != LS_INVALID ) + {//overridden with another move + return overrideJumpRightAttackMove; + } + else if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + AngleVectors( fwdAngles, NULL, right, NULL ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA( pm->ps->velocity, -190, right, pm->ps->velocity ); + return LS_BUTTERFLY_LEFT; + } + else + { + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_CARTWHEELS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_CARTWHEELS)) ) + {//okay to do cartwheels with this saber + /* + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//still on ground + VectorClear( pm->ps->velocity ); + return LS_JUMPATTACK_ARIAL_LEFT; + } + else + */ + { + AngleVectors( fwdAngles, NULL, right, NULL ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA( pm->ps->velocity, -190, right, pm->ps->velocity ); + PM_SetJumped( JUMP_VELOCITY, qtrue ); + return LS_JUMPATTACK_CART_LEFT; + } + } + } + } + else if ( pm->ps->legsAnim != BOTH_CARTWHEEL_LEFT + && pm->ps->legsAnim != BOTH_ARIAL_LEFT ) + {//not in a left cartwheel/arial + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/ )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + if ( forwardmove > 0 ) + {//forward left = TR2BL slash + return LS_A_TR2BL; + } + else if ( forwardmove < 0 ) + {//backward left = BR2TL uppercut + return LS_A_BR2TL; + } + else + {//just left is a right slice + return LS_A_R2L; + } + } + } + else + {//not moving left or right + if ( forwardmove > 0 ) + {//forward= T2B slash + saberMoveName_t stabDownMove = noSpecials?LS_NONE:PM_CheckStabDown(); + if ( stabDownMove != LS_NONE ) + { + return stabDownMove; + } + if ( ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) )//player in third person, not zoomed in + {//player in thirdperson, not zoomed in + //flip-over attack logic + if ( !noSpecials && PM_CheckFlipOverAttackMove( qfalse ) ) + {//flip over-forward down-attack + return PM_SaberFlipOverAttackMove(); + } + //lunge attack logic + else if ( PM_CheckLungeAttackMove() ) + { + return PM_SaberLungeAttackMove( qtrue ); + } + //jump forward attack logic + else if ( !noSpecials && PM_CheckJumpForwardAttackMove() ) + { + return PM_SaberJumpForwardAttackMove(); + } + } + + //player NPC with enemy: autoMove logic + if ( pm->gent + && pm->gent->enemy + && pm->gent->enemy->client ) + {//I have an active enemy + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) + {//a player who is running at an enemy + //if the enemy is not a jedi, don't use top-down, pick a diagonal or side attack + if ( pm->gent->enemy->s.weapon != WP_SABER + && pm->gent->enemy->client->NPC_class != CLASS_REMOTE//too small to do auto-aiming accurately + && pm->gent->enemy->client->NPC_class != CLASS_SEEKER//too small to do auto-aiming accurately + && pm->gent->enemy->client->NPC_class != CLASS_GONK//too short to do auto-aiming accurately + && pm->gent->enemy->client->NPC_class != CLASS_HOWLER//too short to do auto-aiming accurately + && g_saberAutoAim->integer ) + { + saberMoveName_t autoMove = PM_AttackForEnemyPos( qfalse, (qboolean)(pm->ps->clientNum>=MAX_CLIENTS&&!PM_ControlledByPlayer()) ); + if ( autoMove != LS_INVALID ) + { + return autoMove; + } + } + } + + if ( pm->ps->clientNum>=MAX_CLIENTS && !PM_ControlledByPlayer() ) //NPC ONLY + {//NPC + if ( PM_CheckFlipOverAttackMove( qtrue ) ) + { + return PM_SaberFlipOverAttackMove(); + } + } + } + + //Regular NPCs + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) //NPC ONLY + {//NPC or player in third person, not zoomed in + //fwd jump attack logic + if ( PM_CheckJumpForwardAttackMove() ) + { + return PM_SaberJumpForwardAttackMove(); + } + //lunge attack logic + else if ( PM_CheckLungeAttackMove() ) + { + return PM_SaberLungeAttackMove( qtrue ); + } + } + + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent,&pm->cmd) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + return LS_A_T2B; + } + else if ( forwardmove < 0 ) + {//backward= T2B slash//B2T uppercut? + if ( g_saberNewControlScheme->integer ) + { + saberMoveName_t pullAtk = PM_CheckPullAttack(); + if ( pullAtk != LS_NONE ) + { + return pullAtk; + } + } + + if ( g_saberNewControlScheme->integer + && (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) //PLAYER ONLY + && (pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus, trying special backwards attacks + {//player lunge attack logic + if ( ( pm->ps->dualSabers //or dual + || pm->ps->saberAnimLevel == SS_STAFF )//pm->ps->SaberStaff() )//or staff + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB )/*pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB*/ )//have enough force power to pull it off + {//alt+back+attack using fast, dual or staff attacks + PM_SaberLungeAttackMove( qfalse ); + } + } + else if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) //NPC + || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) )//player in third person, not zooomed + {//NPC or player in third person, not zoomed + if ( PM_CheckBackflipAttackMove() ) + { + return PM_SaberBackflipAttackMove();//backflip attack + } + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent,&pm->cmd) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + //if ( !PM_InKnockDown( pm->ps ) ) + //check backstabs + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK)) ) + {//okay to do backstabs with this saber + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//only when on ground + if ( pm->gent && pm->gent->enemy ) + {//FIXME: or just trace for a valid enemy standing behind me? And no enemy in front? + vec3_t enemyDir, faceFwd, facingAngles = {0, pm->ps->viewangles[YAW], 0}; + AngleVectors( facingAngles, faceFwd, NULL, NULL ); + VectorSubtract( pm->gent->enemy->currentOrigin, pm->ps->origin, enemyDir ); + float dot = DotProduct( enemyDir, faceFwd ); + if ( dot < 0 ) + {//enemy is behind me + if ( dot < -0.75f + && DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ) < 16384//128 squared + && (pm->ps->saberAnimLevel == SS_FAST || pm->ps->saberAnimLevel == SS_STAFF || (pm->gent->client &&(pm->gent->client->NPC_class == CLASS_TAVION||pm->gent->client->NPC_class == CLASS_ALORA)&&Q_irand(0,1))) ) + {//fast attacks and Tavion + if ( !(pm->ps->pm_flags&PMF_DUCKED) && pm->cmd.upmove >= 0 ) + {//can't do it while ducked? + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || (pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG) ) + {//only fencers and above can do this + return LS_A_BACKSTAB; + } + } + } + else if ( pm->ps->saberAnimLevel != SS_FAST + && pm->ps->saberAnimLevel != SS_STAFF ) + {//medium and higher attacks + if ( (pm->ps->pm_flags&PMF_DUCKED) || pm->cmd.upmove < 0 ) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } + } + else + {//enemy in front + float enemyDistSq = DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ); + if ( ((pm->ps->saberAnimLevel == FORCE_LEVEL_1 || + pm->ps->saberAnimLevel == SS_STAFF || + pm->gent->client->NPC_class == CLASS_TAVION || + pm->gent->client->NPC_class == CLASS_ALORA || + (pm->gent->client->NPC_class == CLASS_DESANN && !Q_irand(0,3))) && + enemyDistSq > 16384) || + pm->gent->enemy->health <= 0 )//128 squared + {//my enemy is pretty far in front of me and I'm using fast attacks + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || + ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) ) + {//only fencers and higher can do this, higher rank does it more + if ( PM_CheckEnemyInBack( 128 ) ) + { + return PM_PickBackStab(); + } + } + } + else if ( ((pm->ps->saberAnimLevel >= FORCE_LEVEL_2 || pm->gent->client->NPC_class == CLASS_DESANN) && enemyDistSq > 40000) || pm->gent->enemy->health <= 0 )//200 squared + {//enemy is very faw away and I'm using medium/strong attacks + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || + ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) ) + {//only fencers and higher can do this, higher rank does it more + if ( PM_CheckEnemyInBack( 164 ) ) + { + return PM_PickBackStab(); + } + } + } + } + } + else + {//no current enemy + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->gent && pm->gent->client ) + {//only player + if ( PM_CheckEnemyInBack( 128 ) ) + { + return PM_PickBackStab(); + } + } + } + } + } + } + + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + //else just swing down + return LS_A_T2B; + } + else + {//not moving in any direction + if ( PM_SaberInBounce( curmove ) ) + {//bounces should go to their default attack if you don't specify a direction but are attacking + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent,&pm->cmd) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + saberMoveName_t newmove; + if ( pm->ps->clientNum && !PM_ControlledByPlayer() && Q_irand( 0, 3 ) ) + {//use NPC random + newmove = PM_NPCSaberAttackFromQuad( saberMoveData[curmove].endQuad ); + } + else + {//player uses chain-attack + newmove = saberMoveData[curmove].chain_attack; + } + if ( PM_SaberKataDone( curmove, newmove ) ) + { + return saberMoveData[curmove].chain_idle; + } + else + { + return newmove; + } + } + else if ( PM_SaberInKnockaway( curmove ) ) + {//bounces should go to their default attack if you don't specify a direction but are attacking + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + saberMoveName_t newmove; + if ( pm->ps->clientNum && !PM_ControlledByPlayer() && Q_irand( 0, 3 ) ) + {//use NPC random + newmove = PM_NPCSaberAttackFromQuad( saberMoveData[curmove].endQuad ); + } + else + { + if ( pm->ps->saberAnimLevel == SS_FAST || + pm->ps->saberAnimLevel == SS_TAVION ) + {//player is in fast attacks, so come right back down from the same spot + newmove = PM_AttackMoveForQuad( saberMoveData[curmove].endQuad ); + } + else + {//use a transition to wrap to another attack from a different dir + newmove = saberMoveData[curmove].chain_attack; + } + } + if ( PM_SaberKataDone( curmove, newmove ) ) + { + return saberMoveData[curmove].chain_idle; + } + else + { + return newmove; + } + } + else if ( curmove == LS_READY + || curmove == LS_A_FLIP_STAB + || curmove == LS_A_FLIP_SLASH + || ( curmove >= LS_PARRY_UP + && curmove <= LS_REFLECT_LL ) ) + {//Not moving at all, not too busy to attack + //push + lookdown + attack + dual sabers = LS_DUAL_SPIN_PROTECT + if ( g_saberNewControlScheme->integer ) + { + if ( PM_CheckDualSpinProtect() ) + { + return LS_DUAL_SPIN_PROTECT; + } + if ( PM_CheckStaffKata() ) + { + return LS_STAFF_SOULCAL; + } + } + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + if ( pm->ps->clientNum || g_saberAutoAim->integer ) + {//auto-aim + if ( pm->gent && pm->gent->enemy ) + {//based on enemy position, pick a proper attack + saberMoveName_t autoMove = PM_AttackForEnemyPos( qtrue, (qboolean)(pm->ps->clientNum>=MAX_CLIENTS) ); + if ( autoMove != LS_INVALID ) + { + return autoMove; + } + } + else if ( fabs(pm->ps->viewangles[0]) > 30 ) + {//looking far up or far down uses the top to bottom attack, presuming you want a vertical attack + return LS_A_T2B; + } + } + else + {//for now, just pick a random attack + return ((saberMoveName_t)Q_irand( LS_A_TL2BR, LS_A_T2B )); + } + } + } + } + //FIXME: pick a return? + return LS_NONE; +} + +saberMoveName_t PM_SaberAnimTransitionMove( saberMoveName_t curmove, saberMoveName_t newmove ) +{ + //FIXME: take FP_SABER_OFFENSE into account here somehow? + int retmove = newmove; + if ( curmove == LS_READY ) + {//just standing there + switch ( newmove ) + { + case LS_A_TL2BR: + case LS_A_L2R: + case LS_A_BL2TR: + case LS_A_BR2TL: + case LS_A_R2L: + case LS_A_TR2BL: + case LS_A_T2B: + //transition is the start + retmove = LS_S_TL2BR + (newmove-LS_A_TL2BR); + break; + default: + break; + } + } + else + { + switch ( newmove ) + { + //transitioning to ready pose + case LS_READY: + switch ( curmove ) + { + //transitioning from an attack + case LS_A_TL2BR: + case LS_A_L2R: + case LS_A_BL2TR: + case LS_A_BR2TL: + case LS_A_R2L: + case LS_A_TR2BL: + case LS_A_T2B: + //transition is the return + retmove = LS_R_TL2BR + (newmove-LS_A_TL2BR); + break; + default: + break; + } + break; + //transitioning to an attack + case LS_A_TL2BR: + case LS_A_L2R: + case LS_A_BL2TR: + case LS_A_BR2TL: + case LS_A_R2L: + case LS_A_TR2BL: + case LS_A_T2B: + if ( newmove == curmove ) + {//FIXME: need a spin or something or go to next level, but for now, just play the return + //going into another attack... + //allow endless chaining in level 1 attacks, several in level 2 and only one or a few in level 3 + //FIXME: don't let strong attacks chain to an attack in the opposite direction ( > 45 degrees?) + if ( PM_SaberKataDone( curmove, newmove ) ) + {//done with this kata, must return to ready before attack again + retmove = LS_R_TL2BR + (newmove-LS_A_TL2BR); + } + else + {//okay to chain to another attack + retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad]; + } + } + else if ( saberMoveData[curmove].endQuad == saberMoveData[newmove].startQuad ) + {//new move starts from same quadrant + retmove = newmove; + } + else + { + switch ( curmove ) + { + //transitioning from an attack + case LS_A_TL2BR: + case LS_A_L2R: + case LS_A_BL2TR: + case LS_A_BR2TL: + case LS_A_R2L: + case LS_A_TR2BL: + case LS_A_T2B: + case LS_D1_BR: + case LS_D1__R: + case LS_D1_TR: + case LS_D1_T_: + case LS_D1_TL: + case LS_D1__L: + case LS_D1_BL: + case LS_D1_B_: + retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad]; + break; + //transitioning from a return + case LS_R_TL2BR: + case LS_R_L2R: + case LS_R_BL2TR: + case LS_R_BR2TL: + case LS_R_R2L: + case LS_R_TR2BL: + case LS_R_T2B: + //transitioning from a bounce + /* + case LS_BOUNCE_UL2LL: + case LS_BOUNCE_LL2UL: + case LS_BOUNCE_L2LL: + case LS_BOUNCE_L2UL: + case LS_BOUNCE_UR2LR: + case LS_BOUNCE_LR2UR: + case LS_BOUNCE_R2LR: + case LS_BOUNCE_R2UR: + case LS_BOUNCE_TOP: + case LS_OVER_UR2UL: + case LS_OVER_UL2UR: + case LS_BOUNCE_UR: + case LS_BOUNCE_UL: + case LS_BOUNCE_LR: + case LS_BOUNCE_LL: + */ + //transitioning from a parry/reflection/knockaway/broken parry + case LS_PARRY_UP: + case LS_PARRY_UR: + case LS_PARRY_UL: + case LS_PARRY_LR: + case LS_PARRY_LL: + case LS_REFLECT_UP: + case LS_REFLECT_UR: + case LS_REFLECT_UL: + case LS_REFLECT_LR: + case LS_REFLECT_LL: + case LS_K1_T_: + case LS_K1_TR: + case LS_K1_TL: + case LS_K1_BR: + case LS_K1_BL: + case LS_V1_BR: + case LS_V1__R: + case LS_V1_TR: + case LS_V1_T_: + case LS_V1_TL: + case LS_V1__L: + case LS_V1_BL: + case LS_V1_B_: + case LS_H1_T_: + case LS_H1_TR: + case LS_H1_TL: + case LS_H1_BR: + case LS_H1_BL: + retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad]; + break; + //NB: transitioning from transitions is fine + default: + break; + } + } + break; + //transitioning to any other anim is not supported + default: + break; + } + } + + if ( retmove == LS_NONE ) + { + return newmove; + } + + return ((saberMoveName_t)retmove); +} + +/* +------------------------- +PM_LegsAnimForFrame +Returns animNumber for current frame +------------------------- +*/ +int PM_LegsAnimForFrame( gentity_t *ent, int legsFrame ) +{ + //Must be a valid client + if ( ent->client == NULL ) + return -1; + + //Must have a file index entry + if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) + return -1; + + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + int glaIndex = gi.G2API_GetAnimIndex(&(ent->ghoul2[0])); + + for ( int animation = 0; animation < BOTH_CIN_1; animation++ ) //first anim after last legs + { + if ( animation >= TORSO_DROPWEAP1 && animation < LEGS_TURN1 ) //first legs only anim + {//not a possible legs anim + continue; + } + + if ( animations[animation].glaIndex != glaIndex ) + { + continue; + } + + if ( animations[animation].firstFrame > legsFrame ) + {//This anim starts after this frame + continue; + } + + if ( animations[animation].firstFrame + animations[animation].numFrames < legsFrame ) + {//This anim ends before this frame + continue; + } + //else, must be in this anim! + return animation; + } + + //Not in ANY torsoAnim? SHOULD NEVER HAPPEN +// assert(0); + return -1; +} + +int PM_ValidateAnimRange( const int startFrame, const int endFrame, const float animSpeed ) +{//given a startframe and endframe, see if that lines up with any known animation + animation_t *animations = level.knownAnimFileSets[0].animations; + + for ( int anim = 0; anim < MAX_ANIMATIONS; anim++ ) + { + if ( animSpeed < 0 ) + {//playing backwards + if ( animations[anim].firstFrame == endFrame ) + { + if ( animations[anim].numFrames + animations[anim].firstFrame == startFrame ) + { + //Com_Printf( "valid reverse anim: %s\n", animTable[anim].name ); + return anim; + } + } + } + else + {//playing forwards + if ( animations[anim].firstFrame == startFrame ) + {//This anim starts on this frame + if ( animations[anim].firstFrame + animations[anim].numFrames == endFrame ) + {//This anim ends on this frame + //Com_Printf( "valid forward anim: %s\n", animTable[anim].name ); + return anim; + } + } + } + //else, must not be this anim! + } + + //Not in ANY anim? SHOULD NEVER HAPPEN + Com_Printf( "invalid anim range %d to %d, speed %4.2f\n", startFrame, endFrame, animSpeed ); + return -1; +} +/* +------------------------- +PM_TorsoAnimForFrame +Returns animNumber for current frame +------------------------- +*/ +int PM_TorsoAnimForFrame( gentity_t *ent, int torsoFrame ) +{ + //Must be a valid client + if ( ent->client == NULL ) + return -1; + + //Must have a file index entry + if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) + return -1; + + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + int glaIndex = gi.G2API_GetAnimIndex(&(ent->ghoul2[0])); + + for ( int animation = 0; animation < LEGS_TURN1; animation++ ) //first legs only anim + { + if ( animations[animation].glaIndex != glaIndex ) + { + continue; + } + + if ( animations[animation].firstFrame > torsoFrame ) + {//This anim starts after this frame + continue; + } + + if ( animations[animation].firstFrame + animations[animation].numFrames < torsoFrame ) + {//This anim ends before this frame + continue; + } + //else, must be in this anim! + return animation; + } + + //Not in ANY torsoAnim? SHOULD NEVER HAPPEN +// assert(0); + return -1; +} + +qboolean PM_FinishedCurrentLegsAnim( gentity_t *self ) +{ + int junk, curFrame; + float currentFrame, animSpeed; + + if ( !self->client ) + { + return qtrue; + } + + gi.G2API_GetBoneAnimIndex( &self->ghoul2[self->playerModel], self->rootBone, (cg.time?cg.time:level.time), ¤tFrame, &junk, &junk, &junk, &animSpeed, NULL ); + curFrame = floor( currentFrame ); + + int legsAnim = self->client->ps.legsAnim; + animation_t *animations = level.knownAnimFileSets[self->client->clientInfo.animFileIndex].animations; + + if ( curFrame >= animations[legsAnim].firstFrame + (animations[legsAnim].numFrames - 2) ) + { + return qtrue; + } + + return qfalse; +} + +/* +------------------------- +PM_HasAnimation +------------------------- +*/ + +qboolean PM_HasAnimation( gentity_t *ent, int animation ) +{ + //Must be a valid client + if ( !ent || ent->client == NULL ) + return qfalse; + + //must be a valid anim number + if ( animation < 0 || animation >= MAX_ANIMATIONS ) + { + return qfalse; + } + //Must have a file index entry + if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) + return qfalse; + + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + + //No frames, no anim + if ( animations[animation].numFrames == 0 ) + return qfalse; + + //Has the sequence + return qtrue; +} + +int PM_PickAnim( gentity_t *self, int minAnim, int maxAnim ) +{ + int anim; + int count = 0; + + if ( !self ) + { + return Q_irand(minAnim, maxAnim); + } + + do + { + anim = Q_irand(minAnim, maxAnim); + count++; + } + while ( !PM_HasAnimation( self, anim ) && count < 1000 ); + + return anim; +} + +/* +------------------------- +PM_AnimLength +------------------------- +*/ + +int PM_AnimLength( int index, animNumber_t anim ) +{ + if ( ValidAnimFileIndex( index ) == false ) + return 0; + + return level.knownAnimFileSets[index].animations[anim].numFrames * abs(level.knownAnimFileSets[index].animations[anim].frameLerp); +} + +/* +------------------------- +PM_SetLegsAnimTimer +------------------------- +*/ + +void PM_SetLegsAnimTimer( gentity_t *ent, int *legsAnimTimer, int time ) +{ + *legsAnimTimer = time; + + if ( *legsAnimTimer < 0 && time != -1 ) + {//Cap timer to 0 if was counting down, but let it be -1 if that was intentional + *legsAnimTimer = 0; + } + + if ( !*legsAnimTimer && ent && Q3_TaskIDPending( ent, TID_ANIM_LOWER ) ) + {//Waiting for legsAnimTimer to complete, and it just got set to zero + if ( !Q3_TaskIDPending( ent, TID_ANIM_BOTH) ) + {//Not waiting for top + Q3_TaskIDComplete( ent, TID_ANIM_LOWER ); + } + else + {//Waiting for both to finish before complete + Q3_TaskIDClear( &ent->taskID[TID_ANIM_LOWER] );//Bottom is done, regardless + if ( !Q3_TaskIDPending( ent, TID_ANIM_UPPER) ) + {//top is done and we're done + Q3_TaskIDComplete( ent, TID_ANIM_BOTH ); + } + } + } +} + +/* +------------------------- +PM_SetTorsoAnimTimer +------------------------- +*/ + +void PM_SetTorsoAnimTimer( gentity_t *ent, int *torsoAnimTimer, int time ) +{ + *torsoAnimTimer = time; + + if ( *torsoAnimTimer < 0 && time != -1 ) + {//Cap timer to 0 if was counting down, but let it be -1 if that was intentional + *torsoAnimTimer = 0; + } + + if ( !*torsoAnimTimer && ent && Q3_TaskIDPending( ent, TID_ANIM_UPPER ) ) + {//Waiting for torsoAnimTimer to complete, and it just got set to zero + if ( !Q3_TaskIDPending( ent, TID_ANIM_BOTH) ) + {//Not waiting for bottom + Q3_TaskIDComplete( ent, TID_ANIM_UPPER ); + } + else + {//Waiting for both to finish before complete + Q3_TaskIDClear( &ent->taskID[TID_ANIM_UPPER] );//Top is done, regardless + if ( !Q3_TaskIDPending( ent, TID_ANIM_LOWER) ) + {//lower is done and we're done + Q3_TaskIDComplete( ent, TID_ANIM_BOTH ); + } + } + } +} + +extern qboolean PM_SpinningSaberAnim( int anim ); +extern float saberAnimSpeedMod[NUM_FORCE_POWER_LEVELS]; +void PM_SaberStartTransAnim(int saberAnimLevel, int anim, float *animSpeed, gentity_t *gent) +{ + if (g_saberNewCombat->integer) //new code + { + if ( anim == BOTH_V1_BL_S1 + || anim == BOTH_V1_BR_S1 + || anim == BOTH_V1_TL_S1 + || anim == BOTH_V1_TR_S1 + || anim == BOTH_V1_T__S1 + || (anim >= BOTH_V6_BL_S6 && anim <= BOTH_V7__R_S7) ) + { //we're in a broken attack + //speed up recovery from broken attacks based on SO level + *animSpeed = saberAnimSpeedMod[gent->client->ps.forcePowerLevel[FP_SABER_OFFENSE]]; + } + if (g_saberAnimSpeed->value != 1.0f) + { + *animSpeed *= g_saberAnimSpeed->value; + } + else if (gent && gent->client && gent->client->ps.weapon == WP_SABER) + { + if (gent->client->ps.saber[0].animSpeedScale != 1.0f) + { + *animSpeed *= gent->client->ps.saber[0].animSpeedScale; + } + if (gent->client->ps.dualSabers + && gent->client->ps.saber[1].animSpeedScale != 1.0f) + { + *animSpeed *= gent->client->ps.saber[1].animSpeedScale; + } + } + } + else //old code + { + if (g_saberAnimSpeed->value != 1.0f) + { + *animSpeed *= g_saberAnimSpeed->value; + } + else if (gent && gent->client && gent->client->ps.weapon == WP_SABER) + { + if (gent->client->ps.saber[0].animSpeedScale != 1.0f) + { + *animSpeed *= gent->client->ps.saber[0].animSpeedScale; + } + if (gent->client->ps.dualSabers + && gent->client->ps.saber[1].animSpeedScale != 1.0f) + { + *animSpeed *= gent->client->ps.saber[1].animSpeedScale; + } + } + } + if ( gent + && gent->client + && gent->client->ps.stats[STAT_WEAPONS]&(1<client->ps.dualSabers + && saberAnimLevel == SS_DUAL + && gent->weaponModel[1] ) + {//using a scepter and dual style, slow down anims + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_H7_S7_BR ) + { + *animSpeed *= 0.75; + } + } + if ( gent && gent->client && gent->client->ps.forceRageRecoveryTime > level.time ) + {//rage recovery + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_H1_S1_BR ) + {//animate slower + *animSpeed *= 0.75; + } + } + else if ( gent && gent->NPC && gent->NPC->rank == RANK_CIVILIAN ) + {//grunt reborn + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_R1_TR_S1 ) + {//his fast attacks are slower + if ( !PM_SpinningSaberAnim( anim ) ) + { + *animSpeed *= 0.75; + } + return; + } + } + else if ( gent && gent->client ) + { + if ( gent->client->ps.saber[0].type == SABER_LANCE || gent->client->ps.saber[0].type == SABER_TRIDENT ) + {//FIXME: hack for now - these use the fast anims, but slowed down. Should have own style + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_R1_TR_S1 ) + {//his fast attacks are slower + if ( !PM_SpinningSaberAnim( anim ) ) + { + *animSpeed *= 0.75; + } + return; + } + } + } + + if ( ( anim >= BOTH_T1_BR__R && + anim <= BOTH_T1_BL_TL ) || + ( anim >= BOTH_T3_BR__R && + anim <= BOTH_T3_BL_TL ) || + ( anim >= BOTH_T5_BR__R && + anim <= BOTH_T5_BL_TL ) ) + { //what is this doing here exactly? + if ( g_saberNewCombat->integer ) //new code + { + if (saberAnimLevel == FORCE_LEVEL_1 /*|| saberAnimLevel == FORCE_LEVEL_5*/) + {//FIXME: should not be necc for FORCE_LEVEL_1's + *animSpeed *= 1.5; + } + else if (saberAnimLevel == FORCE_LEVEL_5) + { //both Desann and Strong styles suffer some transition speed penalty or something? + *animSpeed *= 0.75; + } + } + else //old code + { + if (saberAnimLevel == FORCE_LEVEL_1 || saberAnimLevel == FORCE_LEVEL_5) + {//FIXME: should not be necc for FORCE_LEVEL_1's + *animSpeed *= 1.5; + } + else if (saberAnimLevel == FORCE_LEVEL_3) + { + *animSpeed *= 0.75; + } + } + } +} +/* +void PM_SaberStartTransAnim( int anim, int entNum, int saberOffenseLevel, float *animSpeed ) +{ + //check starts + if ( ( anim >= BOTH_S1_S1_T_ && + anim <= BOTH_S1_S1_TR ) || + ( anim >= BOTH_S1_S1_T_ && + anim <= BOTH_S1_S1_TR ) || + ( anim >= BOTH_S3_S1_T_ && + anim <= BOTH_S3_S1_TR ) ) + { + if ( entNum == 0 ) + { + *animSpeed *= saberAnimSpeedMod[FORCE_LEVEL_3]; + } + else + { + *animSpeed *= saberAnimSpeedMod[saberOffenseLevel]; + } + } + //Check transitions + else if ( PM_SpinningSaberAnim( anim ) ) + {//spins stay normal speed + return; + } + else if ( ( anim >= BOTH_T1_BR__R && + anim <= BOTH_T1_BL_TL ) || + ( anim >= BOTH_T2_BR__R && + anim <= BOTH_T2_BL_TL ) || + ( anim >= BOTH_T3_BR__R && + anim <= BOTH_T3_BL_TL ) ) + {//slow down the transitions + if ( entNum == 0 && saberOffenseLevel <= FORCE_LEVEL_2 ) + { + *animSpeed *= saberAnimSpeedMod[saberOffenseLevel]; + } + else + { + *animSpeed *= saberAnimSpeedMod[saberOffenseLevel]/2.0f; + } + } + + return; +} +*/ +extern qboolean player_locked; +extern qboolean MatrixMode; +float PM_GetTimeScaleMod( gentity_t *gent ) +{ + if ( g_timescale->value ) + { + if ( !MatrixMode + && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_START + && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_ATTACK + && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_LAND ) + { + if ( gent && gent->s.clientNum == 0 && !player_locked && gent->client->ps.forcePowersActive&(1<value); + } + else if ( gent && gent->client && gent->client->ps.forcePowersActive&(1<value); + } + } + } + return 1.0f; +} + +static inline qboolean PM_IsHumanoid( CGhoul2Info *ghlInfo ) +{ + char *GLAName; + GLAName = gi.G2API_GetGLAName( ghlInfo ); + assert(GLAName); + + if ( !Q_stricmp( "models/players/_humanoid/_humanoid", GLAName ) ) + { + return qtrue; + } + + return qfalse; +} + +/* +------------------------- +PM_SetAnimFinal +------------------------- +*/ +#define G2_DEBUG_TIMING (0) +void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, + int setAnimParts,int anim,int setAnimFlags, + int *torsoAnimTimer,int *legsAnimTimer, + gentity_t *gent,int blendTime) // default blendTime=350 +{ + +// BASIC SETUP AND SAFETY CHECKING +//================================= + + // If It Is A Busted Entity, Don't Do Anything Here. + //--------------------------------------------------- + if (!gent || !gent->client) + { + return; + } + + // Make Sure This Character Has Such An Anim And A Model + //------------------------------------------------------- + if (anim<0 || anim>=MAX_ANIMATIONS || !ValidAnimFileIndex(gent->client->clientInfo.animFileIndex)) + { + #ifndef FINAL_BUILD + if (g_AnimWarning->integer) + { + if (anim<0 || anim>=MAX_ANIMATIONS) + { + gi.Printf(S_COLOR_RED"PM_SetAnimFinal: Invalid Anim Index (%d)!\n", anim); + } + else + { + gi.Printf(S_COLOR_RED"PM_SetAnimFinal: Invalid Anim File Index (%d)!\n", gent->client->clientInfo.animFileIndex); + } + } + #endif + return; + } + + + // Get Global Time Properties + //---------------------------- + float timeScaleMod = PM_GetTimeScaleMod( gent ); + const int actualTime = (cg.time?cg.time:level.time); + const animation_t* animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; + const animation_t& curAnim = animations[anim]; + + // Make Sure This Character Has Such An Anim And A Model + //------------------------------------------------------- + if (animations[anim].numFrames==0) + { + #ifndef FINAL_BUILD + static int LastAnimWarningNum=0; + if (LastAnimWarningNum!=anim) + { + if ((cg_debugAnim.integer==3) || // 3 = do everyone + (cg_debugAnim.integer==1 && gent->s.number==0) || // 1 = only the player + (cg_debugAnim.integer==2 && gent->s.number!=0) || // 2 = only everyone else + (cg_debugAnim.integer==4 && gent->s.number!=cg_debugAnimTarget.integer) // 4 = specific entnum + ) + { + gi.Printf(S_COLOR_RED"PM_SetAnimFinal: Anim %s does not exist in this model (%s)!\n", animTable[anim].name, gent->NPC_type ); + } + } + LastAnimWarningNum = anim; + #endif + return; + } + + // If It's Not A Ghoul 2 Model, Just Remember The Anims And Stop, Because Everything Beyond This Is Ghoul2 + //--------------------------------------------------------------------------------------------------------- + if (!gi.G2API_HaveWeGhoul2Models(gent->ghoul2)) + { + if (setAnimParts&SETANIM_TORSO) + { + (*torsoAnim) = anim; + } + if (setAnimParts&SETANIM_LEGS) + { + (*legsAnim) = anim; + } + return; + } + + + // Lower Offensive Skill Slows Down The Saber Start Attack Animations + //-------------------------------------------------------------------- + PM_SaberStartTransAnim( gent->client->ps.saberAnimLevel, anim, &timeScaleMod, gent ); + + + +// SETUP VALUES FOR INCOMMING ANIMATION +//====================================== + const bool animFootMove = (PM_WalkingAnim(anim) || PM_RunningAnim(anim) || anim==BOTH_CROUCH1WALK || anim==BOTH_CROUCH1WALKBACK); + const bool animHoldless = (setAnimFlags&SETANIM_FLAG_HOLDLESS)!=0; + const bool animHold = (setAnimFlags&SETANIM_FLAG_HOLD)!=0; + const bool animRestart = (setAnimFlags&SETANIM_FLAG_RESTART)!=0; + const bool animOverride = (setAnimFlags&SETANIM_FLAG_OVERRIDE)!=0; + const bool animSync = (g_synchSplitAnims->integer!=0 && !animRestart); + float animCurrent = (-1.0f); + float animSpeed = (50.0f / curAnim.frameLerp * timeScaleMod); // animSpeed is 1.0 if the frameLerp (ms/frame) is 50 (20 fps). + const float animFPS = (fabsf(curAnim.frameLerp)); + const int animDurMSec = (int)(((curAnim.numFrames - 1) * animFPS) / timeScaleMod); + const int animHoldMSec = ((animHoldless && timeScaleMod==1.0f)?((animDurMSec>1)?(animDurMSec-1):(animFPS)):(animDurMSec)); + int animFlags = (curAnim.loopFrames!=-1)?(BONE_ANIM_OVERRIDE_LOOP):(BONE_ANIM_OVERRIDE_FREEZE); + int animStart = (curAnim.firstFrame); + int animEnd = (curAnim.firstFrame)+(animations[anim].numFrames); + + // If We Have A Blend Timer, Add The Blend Flag + //---------------------------------------------- + if (blendTime > 0) + { + animFlags |= BONE_ANIM_BLEND; + } + + // If Animation Is Going Backwards, Swap Last And First Frames + //------------------------------------------------------------- + if (animSpeed<0.0f) + { +// #ifndef FINAL_BUILD + #if 0 + if (g_AnimWarning->integer==1) + { + if (animFlags&BONE_ANIM_OVERRIDE_LOOP) + { + gi.Printf(S_COLOR_YELLOW"PM_SetAnimFinal: WARNING: Anim (%s) looping backwards!\n", animTable[anim].name); + } + } + #endif + + int temp = animEnd; + animEnd = animStart; + animStart = temp; + blendTime = 0; + } + + // If The Animation Is Walking Or Running, Attempt To Scale The Playback Speed To Match + //-------------------------------------------------------------------------------------- + if (g_noFootSlide->integer + && animFootMove + && !(animSpeed<0.0f) + //FIXME: either read speed from animation.cfg or only do this for NPCs + // for whom we've specifically determined the proper numbers! + && gent->client->NPC_class != CLASS_HOWLER + && gent->client->NPC_class != CLASS_WAMPA + && gent->client->NPC_class != CLASS_GONK + && gent->client->NPC_class != CLASS_HOWLER + && gent->client->NPC_class != CLASS_MOUSE + && gent->client->NPC_class != CLASS_PROBE + && gent->client->NPC_class != CLASS_PROTOCOL + && gent->client->NPC_class != CLASS_R2D2 + && gent->client->NPC_class != CLASS_R5D2 + && gent->client->NPC_class != CLASS_SEEKER) + { + bool Walking = !!PM_WalkingAnim(anim); + bool HasDual = (gent->client->ps.saberAnimLevel==SS_DUAL); + bool HasStaff = (gent->client->ps.saberAnimLevel==SS_STAFF); + float moveSpeedOfAnim = 150.0f;//g_noFootSlideRunScale->value; + + if (anim==BOTH_CROUCH1WALK || anim==BOTH_CROUCH1WALKBACK) + { + moveSpeedOfAnim = 75.0f; + } + else + { + if (gent->client->NPC_class == CLASS_HAZARD_TROOPER) + { + moveSpeedOfAnim = 50.0f; + } + else if (gent->client->NPC_class == CLASS_RANCOR) + { + moveSpeedOfAnim = 173.0f; + } + else + { + if (Walking) + { + if (HasDual || HasStaff) + { + moveSpeedOfAnim = 100.0f; + } + else + { + moveSpeedOfAnim = 50.0f;// g_noFootSlideWalkScale->value; + } + } + else + { + if (HasStaff) + { + moveSpeedOfAnim = 250.0f; + } + else + { + moveSpeedOfAnim = 150.0f; + } + } + } + } + + + + + + + animSpeed *= (gent->resultspeed/moveSpeedOfAnim); + if (animSpeed<0.01f) + { + animSpeed = 0.01f; + } + + // Make Sure Not To Play Too Fast An Anim + //---------------------------------------- + float maxPlaybackSpeed = (1.5f * timeScaleMod); + if (animSpeed>maxPlaybackSpeed) + { + animSpeed = maxPlaybackSpeed; + } + } + + +// GET VALUES FOR EXISTING BODY ANIMATION +//========================================== + float bodySpeed = 0.0f; + float bodyCurrent = 0.0f; + int bodyStart = 0; + int bodyEnd = 0; + int bodyFlags = 0; + int bodyAnim = (*legsAnim); + int bodyBone = (gent->rootBone); + bool bodyTimerOn = ((*legsAnimTimer>0) || (*legsAnimTimer)==-1); + bool bodyPlay = ((setAnimParts&SETANIM_LEGS) && (bodyBone!=-1) && (animOverride || !bodyTimerOn)); + bool bodyAnimating = !!gi.G2API_GetBoneAnimIndex(&gent->ghoul2[gent->playerModel], bodyBone, actualTime, &bodyCurrent, &bodyStart, &bodyEnd, &bodyFlags, &bodySpeed, NULL); + bool bodyOnAnimNow = (bodyAnimating && bodyAnim==anim && bodyStart==animStart && bodyEnd==animEnd); + bool bodyMatchTorsFrame = false; + + +// GET VALUES FOR EXISTING TORSO ANIMATION +//=========================================== + float torsSpeed = 0.0f; + float torsCurrent = 0.0f; + int torsStart = 0; + int torsEnd = 0; + int torsFlags = 0; + int torsAnim = (*torsoAnim); + int torsBone = (gent->lowerLumbarBone); + bool torsTimerOn = ((*torsoAnimTimer)>0 || (*torsoAnimTimer)==-1); + bool torsPlay = (gent->client->NPC_class!=CLASS_RANCOR && (setAnimParts&SETANIM_TORSO) && (torsBone!=-1) && (animOverride || !torsTimerOn)); + bool torsAnimating = !!gi.G2API_GetBoneAnimIndex(&gent->ghoul2[gent->playerModel], torsBone, actualTime, &torsCurrent, &torsStart, &torsEnd, &torsFlags, &torsSpeed, NULL); + bool torsOnAnimNow = (torsAnimating && torsAnim==anim && torsStart==animStart && torsEnd==animEnd); + bool torsMatchBodyFrame = false; + + +// APPLY SYNC TO TORSO +//===================== + if (animSync && torsPlay && !bodyPlay && bodyOnAnimNow && (!torsOnAnimNow || torsCurrent!=bodyCurrent)) + { + torsMatchBodyFrame = true; + animCurrent = bodyCurrent; + } + if (animSync && bodyPlay && !torsPlay && torsOnAnimNow && (!bodyOnAnimNow || bodyCurrent!=torsCurrent)) + { + bodyMatchTorsFrame = true; + animCurrent = torsCurrent; + } + + // If Already Doing These Exact Parameters, Then Don't Play + //---------------------------------------------------------- + if (!animRestart) + { + torsPlay &= !(torsOnAnimNow && torsSpeed==animSpeed && !torsMatchBodyFrame); + bodyPlay &= !(bodyOnAnimNow && bodySpeed==animSpeed && !bodyMatchTorsFrame); + } + +#ifndef FINAL_BUILD + if ((cg_debugAnim.integer==3) || // 3 = do everyone + (cg_debugAnim.integer==1 && gent->s.number==0) || // 1 = only the player + (cg_debugAnim.integer==2 && gent->s.number!=0) || // 2 = only everyone else + (cg_debugAnim.integer==4 && gent->s.number!=cg_debugAnimTarget.integer) // 4 = specific entnum + ) + { + if (bodyPlay || torsPlay) + { + char* entName = gent->targetname; + char* location; + + // Select Entity Name + //-------------------- + if (!entName || !entName[0]) + { + entName = gent->NPC_targetname; + } + if (!entName || !entName[0]) + { + entName = gent->NPC_type; + } + if (!entName || !entName[0]) + { + entName = gent->classname; + } + if (!entName || !entName[0]) + { + entName = "UNKNOWN"; + } + + // Select Play Location + //---------------------- + if (bodyPlay && torsPlay) + { + location = "BOTH "; + } + else if (bodyPlay) + { + location = "LEGS "; + } + else + { + location = "TORSO"; + } + + // Print It! + //----------- + Com_Printf("[%10d] ent[%3d-%18s] %s anim[%3d] - %s\n", + actualTime, + gent->s.number, + entName, + location, + anim, + animTable[anim].name ); + } + } +#endif + + +// PLAY ON THE TORSO +//======================== + if (torsPlay) + { + *torsoAnim = anim; + float oldAnimCurrent = animCurrent; + if (animCurrent!=bodyCurrent && torsOnAnimNow && !animRestart && !torsMatchBodyFrame) + { + animCurrent = torsCurrent; + } + + gi.G2API_SetAnimIndex(&gent->ghoul2[gent->playerModel], curAnim.glaIndex); + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], torsBone, + animStart, + animEnd, + (torsOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), + animSpeed, + actualTime, + animCurrent, + blendTime); + + if (gent->motionBone!=-1) + { + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->motionBone, + animStart, + animEnd, + (torsOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), + animSpeed, + actualTime, + animCurrent, + blendTime); + } + + animCurrent = oldAnimCurrent; + + // If This Animation Is To Be Locked And Held, Calculate The Duration And Set The Timer + //-------------------------------------------------------------------------------------- + if (animHold || animHoldless) + { + PM_SetTorsoAnimTimer(gent, torsoAnimTimer, animHoldMSec); + } + } + +// PLAY ON THE WHOLE BODY +//======================== + if (bodyPlay) + { + *legsAnim = anim; + + if (bodyOnAnimNow && !animRestart && !bodyMatchTorsFrame) + { + animCurrent = bodyCurrent; + } + + gi.G2API_SetAnimIndex(&gent->ghoul2[gent->playerModel], curAnim.glaIndex); + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], bodyBone, + animStart, + animEnd, + (bodyOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), + animSpeed, + actualTime, + animCurrent, + blendTime); + + // If This Animation Is To Be Locked And Held, Calculate The Duration And Set The Timer + //-------------------------------------------------------------------------------------- + if (animHold || animHoldless) + { + PM_SetLegsAnimTimer(gent, legsAnimTimer, animHoldMSec); + } + } + + + + + +// PRINT SOME DEBUG TEXT OF EXISTING VALUES +//========================================== + if (false) + { + gi.Printf("PLAYANIM: (%3d) Speed(%4.2f) ", anim, animSpeed); + if (bodyAnimating) + { + gi.Printf("BODY: (%4.2f) (%4.2f) ", bodyCurrent, bodySpeed); + } + else + { + gi.Printf(" "); + } + if (torsAnimating) + { + gi.Printf("TORS: (%4.2f) (%4.2f)\n", torsCurrent, torsSpeed); + } + else + { + gi.Printf("\n"); + } + } +} + + + +void PM_SetAnim(pmove_t *pm,int setAnimParts,int anim,int setAnimFlags, int blendTime) +{ // FIXME : once torsoAnim and legsAnim are in the same structure for NPC and Players + // rename PM_SetAnimFinal to PM_SetAnim and have both NPC and Players call PM_SetAnim + + if ( pm->ps->pm_type >= PM_DEAD ) + {//FIXME: sometimes we'll want to set anims when your dead... twitches, impacts, etc. + return; + } + + if ( pm->gent == NULL ) + { + return; + } + + if ( !pm->gent || pm->gent->health > 0 ) + {//don't lock anims if the guy is dead + if ( pm->ps->torsoAnimTimer + && PM_LockedAnim( pm->ps->torsoAnim ) + && !PM_LockedAnim( anim ) ) + {//nothing can override these special anims + setAnimParts &= ~SETANIM_TORSO; + } + + if ( pm->ps->legsAnimTimer + && PM_LockedAnim( pm->ps->legsAnim ) + && !PM_LockedAnim( anim ) ) + {//nothing can override these special anims + setAnimParts &= ~SETANIM_LEGS; + } + } + + if ( !setAnimParts ) + { + return; + } + + if (setAnimFlags&SETANIM_FLAG_OVERRIDE) + { +// pm->ps->animationTimer = 0; + + if (setAnimParts & SETANIM_TORSO) + { + if( (setAnimFlags & SETANIM_FLAG_RESTART) || pm->ps->torsoAnim != anim ) + { + PM_SetTorsoAnimTimer( pm->gent, &pm->ps->torsoAnimTimer, 0 ); + } + } + if (setAnimParts & SETANIM_LEGS) + { + if( (setAnimFlags & SETANIM_FLAG_RESTART) || pm->ps->legsAnim != anim ) + { + PM_SetLegsAnimTimer( pm->gent, &pm->ps->legsAnimTimer, 0 ); + } + } + } + + PM_SetAnimFinal(&pm->ps->torsoAnim,&pm->ps->legsAnim,setAnimParts,anim,setAnimFlags,&pm->ps->torsoAnimTimer,&pm->ps->legsAnimTimer,&g_entities[pm->ps->clientNum],blendTime);//was pm->gent +} + +bool TorsoAgainstWindTest( gentity_t* ent ) +{ + if (ent&&//valid ent + ent->client&&//a client + (ent->client->ps.weapon!=WP_SABER||ent->client->ps.saberMove==LS_READY)&&//either not holding a saber or the saber is in the ready pose + (ent->s.numbercurrentOrigin) && + gi.WE_IsOutside(ent->currentOrigin) ) + { + if (Q_stricmp(level.mapname, "t2_wedge")!=0) + { + vec3_t fwd; + vec3_t windDir; + if (gi.WE_GetWindVector(windDir, ent->currentOrigin)) + { + VectorScale(windDir, -1.0f, windDir); + AngleVectors(pm->gent->currentAngles, fwd, 0, 0); + if (DotProduct(fwd, windDir)>0.65f) + { + if (ent->client && ent->client->ps.torsoAnim!=BOTH_WIND) + { + NPC_SetAnim(ent, SETANIM_TORSO, BOTH_WIND, SETANIM_FLAG_NORMAL, 400); + } + return true; + } + } + } + } + return false; +} + +/* +------------------------- +PM_TorsoAnimLightsaber +------------------------- +*/ + + +// Note that this function is intended to set the animation for the player, but +// only does idle-ish anims. Anything that has a timer associated, such as attacks and blocks, +// are set by PM_WeaponLightsaber() + +extern Vehicle_t *G_IsRidingVehicle( gentity_t *pEnt ); +extern qboolean PM_LandingAnim( int anim ); +extern qboolean PM_JumpingAnim( int anim ); +qboolean PM_InCartwheel( int anim ); +void PM_TorsoAnimLightsaber() +{ + // ********************************************************* + // WEAPON_READY + // ********************************************************* + if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + {//holding an enemy aloft with force-grip + return; + } + + if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_1 ) + {//lightning + return; + } + + if ( pm->ps->forcePowersActive&(1<ps->saber[0].blade[0].active + && pm->ps->saber[0].blade[0].length < 3 + && !(pm->ps->saberEventFlags&SEF_HITWALL) + && pm->ps->weaponstate == WEAPON_RAISING ) + { + if (!G_IsRidingVehicle(pm->gent)) + { + PM_SetSaberMove(LS_DRAW); + } + return; + } + else if ( !pm->ps->SaberActive() && pm->ps->SaberLength() ) + { + if (!G_IsRidingVehicle(pm->gent)) + { + PM_SetSaberMove(LS_PUTAWAY); + } + return; + } + + if (pm->ps->weaponTime > 0) + { // weapon is already busy. + if ( pm->ps->torsoAnim == BOTH_TOSS1 + || pm->ps->torsoAnim == BOTH_TOSS2 ) + {//in toss + if ( !pm->ps->torsoAnimTimer ) + {//weird, get out of it, I guess + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + } + return; + } + + if ( pm->ps->weaponstate == WEAPON_READY || + pm->ps->weaponstate == WEAPON_CHARGING || + pm->ps->weaponstate == WEAPON_CHARGING_ALT ) + {//ready + if ( pm->ps->weapon == WP_SABER && (pm->ps->SaberLength()) ) + {//saber is on + // Select the proper idle Lightsaber attack move from the chart. + if (pm->ps->saberMove > LS_READY && pm->ps->saberMove < LS_MOVE_MAX) + { + PM_SetSaberMove(saberMoveData[pm->ps->saberMove].chain_idle); + } + else + { + if ( PM_JumpingAnim( pm->ps->legsAnim ) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) + || PM_FlippingAnim( pm->ps->legsAnim )) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + if ( (PM_RunningAnim( pm->ps->legsAnim ) + || pm->ps->legsAnim == BOTH_WALK_STAFF + || pm->ps->legsAnim == BOTH_WALK_DUAL + || pm->ps->legsAnim == BOTH_WALKBACK_STAFF + || pm->ps->legsAnim == BOTH_WALKBACK_DUAL ) + && pm->ps->saberBlockingTime < cg.time ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetSaberMove(LS_READY); + } + } + } + } + /* + if ( PM_JumpingAnim( pm->ps->legsAnim ) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) + || PM_FlippingAnim( pm->ps->legsAnim )) + {//jumping, landing cartwheel, flipping + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetSaberMove( LS_READY ); + } + */ + } + else if (TorsoAgainstWindTest(pm->gent)) + { + } + else if( pm->ps->legsAnim == BOTH_RUN1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_RUN2 )//&& pm->ps->saberAnimLevel != SS_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN2,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_RUN_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_STAFF,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_RUN_DUAL ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_DUAL,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_WALK1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_WALK2 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK2,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_WALK_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_STAFF,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_WALK_DUAL ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_DUAL,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_CROUCH1IDLE && pm->ps->clientNum != 0 )//player falls through + { + //??? Why nothing? What if you were running??? + //PM_SetAnim(pm,SETANIM_TORSO,BOTH_CROUCH1IDLE,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_JUMP1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_JUMP1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else + {//Used to default to both_stand1 which is an arms-down anim +// PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 + // Select the next proper pose for the lightsaber assuming that there are no attacks. + if (pm->ps->saberMove > LS_READY && pm->ps->saberMove < LS_MOVE_MAX) + { + PM_SetSaberMove(saberMoveData[pm->ps->saberMove].chain_idle); + } + else + { + if ( PM_JumpingAnim( pm->ps->legsAnim ) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) + || PM_FlippingAnim( pm->ps->legsAnim )) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + PM_SetSaberMove(LS_READY); + } + } + } + } + } + + // ********************************************************* + // WEAPON_IDLE + // ********************************************************* + + else if ( pm->ps->weaponstate == WEAPON_IDLE ) + { + if (TorsoAgainstWindTest(pm->gent)) + { + } + else if( pm->ps->legsAnim == BOTH_GUARD_LOOKAROUND1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_LOOKAROUND1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_GUARD_IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_IDLE1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND1IDLE1 + || pm->ps->legsAnim == BOTH_STAND2IDLE1 + || pm->ps->legsAnim == BOTH_STAND2IDLE2 + || pm->ps->legsAnim == BOTH_STAND3IDLE1 + || pm->ps->legsAnim == BOTH_STAND5IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND2TO4 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND2TO4,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND4TO2 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4TO2,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND4 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else + { +// This is now set in SetSaberMove. + // Idle for Lightsaber + if ( pm->gent && pm->gent->client ) + { +// pm->gent->client->saberTrail.inAction = qfalse; + } + + qboolean saberInAir = qtrue; + if ( pm->ps->saberInFlight ) + {//guiding saber + if ( PM_SaberInBrokenParry( pm->ps->saberMove ) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim( pm->ps->torsoAnim ) ) + {//we're stuck in a broken parry + saberInAir = qfalse; + } + if ( pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0 )//player is 0 + {// + if ( &g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY ) + {//fell to the ground and we're not trying to pull it back + saberInAir = qfalse; + } + } + } + if ( pm->ps->saberInFlight + && saberInAir + && (!pm->ps->dualSabers || !pm->ps->saber[1].Active())) + { + if ( !PM_ForceAnim( pm->ps->torsoAnim ) + || pm->ps->torsoAnimTimer < 300 ) + {//don't interrupt a force power anim + if ( pm->ps->torsoAnim != BOTH_LOSE_SABER + || !pm->ps->torsoAnimTimer ) + { + PM_SetAnim( pm, SETANIM_TORSO,BOTH_SABERPULL,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + } + } + else + {//saber is on + // Idle for Lightsaber + if ( pm->gent && pm->gent->client ) + { + if ( !G_InCinematicSaberAnim( pm->gent ) ) + { + pm->gent->client->ps.SaberDeactivateTrail( 0 ); + } + } + // Idle for idle/ready Lightsaber +// PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONIDLE1 + // Select the proper idle Lightsaber attack move from the chart. + if (pm->ps->saberMove > LS_READY && pm->ps->saberMove < LS_MOVE_MAX) + { + PM_SetSaberMove(saberMoveData[pm->ps->saberMove].chain_idle); + } + else + { + if ( PM_JumpingAnim( pm->ps->legsAnim ) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) + || PM_FlippingAnim( pm->ps->legsAnim )) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + if ( (PM_RunningAnim( pm->ps->legsAnim ) + || pm->ps->legsAnim == BOTH_WALK_STAFF + || pm->ps->legsAnim == BOTH_WALK_DUAL + || pm->ps->legsAnim == BOTH_WALKBACK_STAFF + || pm->ps->legsAnim == BOTH_WALKBACK_DUAL ) + && pm->ps->saberBlockingTime < cg.time ) + {//running w/1-handed weapon uses full-body anim + int setFlags = SETANIM_FLAG_NORMAL; + if ( PM_LandingAnim( pm->ps->torsoAnim ) ) + { + setFlags = SETANIM_FLAG_OVERRIDE; + } + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,setFlags); + } + else + { + PM_SetSaberMove(LS_READY); + } + } + } + } + } + } + } +} + + + + +/* +------------------------- +PM_TorsoAnimation +------------------------- +*/ + +void PM_TorsoAnimation( void ) +{//FIXME: Write a much smarter and more appropriate anim picking routine logic... +// int oldAnim; + if ( PM_InKnockDown( pm->ps ) || PM_InRoll( pm->ps )) + {//in knockdown + return; + } + + if ( (pm->ps->eFlags&EF_HELD_BY_WAMPA) ) + { + return; + } + + if ( (pm->ps->eFlags&EF_FORCE_DRAINED) ) + {//being drained + //PM_SetAnim( pm, SETANIM_TORSO, BOTH_HUGGEE1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + return; + } + if ( (pm->ps->forcePowersActive&(1<ps->forceDrainEntityNum < ENTITYNUM_WORLD ) + {//draining + //PM_SetAnim( pm, SETANIM_TORSO, BOTH_HUGGER1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + return; + } + + if( pm->gent && pm->gent->NPC && (pm->gent->NPC->scriptFlags & SCF_FORCED_MARCH) ) + { + return; + } + + if(pm->gent != NULL && pm->gent->client) + { + pm->gent->client->renderInfo.torsoFpsMod = 1.0f; + } + + if ( pm->gent && pm->ps && pm->ps->eFlags & EF_LOCKED_TO_WEAPON ) + { + if ( pm->gent->owner && pm->gent->owner->e_UseFunc == useF_emplaced_gun_use )//ugly way to tell, but... + {//full body + PM_SetAnim(pm,SETANIM_BOTH,BOTH_GUNSIT1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + else + {//torso + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUNSIT1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + return; + } +/* else if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE && pm->ps->clientNum < MAX_CLIENTS && (m_pVehicleInfo[((CVehicleNPC *)pm->gent->NPC)->m_iVehicleTypeID].numHands == 2 || g_speederControlScheme->value == 2) ) + {//can't look around + PM_SetAnim(pm,SETANIM_TORSO,m_pVehicleInfo[((CVehicleNPC *)pm->gent->NPC)->m_iVehicleTypeID].riderAnim,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); + return; + }*/ + + if ( pm->ps->taunting > level.time ) + { + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ALORA ) + { + PM_SetAnim(pm,SETANIM_BOTH,BOTH_ALORA_TAUNT,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + else if ( pm->ps->weapon == WP_SABER && pm->ps->saberAnimLevel == SS_DUAL && PM_HasAnimation( pm->gent, BOTH_DUAL_TAUNT ) ) + { + PM_SetAnim(pm,SETANIM_BOTH,BOTH_DUAL_TAUNT,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + else if ( pm->ps->weapon == WP_SABER + && pm->ps->saberAnimLevel == SS_STAFF )//pm->ps->saber[0].type == SABER_STAFF ) + {//turn on the blades + if ( PM_HasAnimation( pm->gent, BOTH_STAFF_TAUNT ) ) + { + PM_SetAnim(pm,SETANIM_BOTH,BOTH_STAFF_TAUNT,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + /* + else + { + if ( !pm->ps->saber[0].blade[0].active ) + {//first blade is off + //turn it on + pm->ps->SaberBladeActivate( 0, 0, qtrue ); + if ( !pm->ps->saber[0].blade[1].active ) + {//second blade is also off, extend time of this taunt so we have enough time to turn them both on + pm->ps->taunting = level.time + 3000; + } + } + else if ( (pm->ps->taunting - level.time) < 1500 ) + {//only 1500ms left in taunt + if ( !pm->ps->saber[0].blade[1].active ) + {//second blade is off + //turn it on + pm->ps->SaberBladeActivate( 0, 1, qtrue ); + } + } + //pose + PM_SetAnim(pm,SETANIM_BOTH,BOTH_SABERSTAFF_STANCE,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); + pm->ps->torsoAnimTimer = pm->ps->legsAnimTimer = (pm->ps->taunting - level.time); + } + */ + } + else if ( PM_HasAnimation( pm->gent, BOTH_GESTURE1 ) ) + { + PM_SetAnim(pm,SETANIM_BOTH,BOTH_GESTURE1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + pm->gent->client->ps.SaberActivateTrail( 100 ); + //FIXME: will this reset? + //FIXME: force-control (yellow glow) effect on hand and saber? + } + else + { + //PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE1,SETANIM_FLAG_NORMAL); + } + return; + } + + if (pm->ps->weapon == WP_SABER ) // WP_LIGHTSABER + { + qboolean saberInAir = qfalse; + if ( pm->ps->SaberLength() && !pm->ps->saberInFlight ) + { + PM_TorsoAnimLightsaber(); + } + else + { + if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + {//holding an enemy aloft with force-grip + return; + } + if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_1 ) + {//lightning + return; + } + if ( pm->ps->forcePowersActive&(1<ps->saberMove ) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim( pm->ps->torsoAnim ) ) + {//we're stuck in a broken parry + PM_TorsoAnimLightsaber(); + } + else + { + if ( pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0 )//player is 0 + {// + if ( &g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY ) + {//fell to the ground and we're not trying to pull it back + saberInAir = qfalse; + } + } + + if ( pm->ps->saberInFlight + && saberInAir + && (!pm->ps->dualSabers //not using 2 sabers + || !pm->ps->saber[1].Active() //left one off + || pm->ps->torsoAnim == BOTH_SABERDUAL_STANCE//not attacking + || pm->ps->torsoAnim == BOTH_SABERPULL//not attacking + || pm->ps->torsoAnim == BOTH_STAND1//not attacking + || PM_RunningAnim( pm->ps->torsoAnim ) //not attacking + || PM_WalkingAnim( pm->ps->torsoAnim ) //not attacking + || PM_JumpingAnim( pm->ps->torsoAnim )//not attacking + || PM_SwimmingAnim( pm->ps->torsoAnim ) )//not attacking + ) + { + if ( !PM_ForceAnim( pm->ps->torsoAnim ) || pm->ps->torsoAnimTimer < 300 ) + {//don't interrupt a force power anim + if ( pm->ps->torsoAnim != BOTH_LOSE_SABER + || !pm->ps->torsoAnimTimer ) + { + PM_SetAnim( pm, SETANIM_TORSO,BOTH_SABERPULL,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + } + } + else + { + if ( PM_InSlopeAnim( pm->ps->legsAnim ) ) + {//HMM... this probably breaks the saber putaway and select anims + if ( pm->ps->SaberLength() > 0 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND2,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + } + } + } + } + + if (pm->ps->weaponTime<= 0 && (pm->ps->saberMove==LS_READY || pm->ps->SaberLength()==0) && !saberInAir) + { + TorsoAgainstWindTest(pm->gent); + } + return; + } + + if ( PM_ForceAnim( pm->ps->torsoAnim ) + && pm->ps->torsoAnimTimer > 0 ) + {//in a force anim, don't do a stand anim + return; + } + + + qboolean weaponBusy = qfalse; + + if ( pm->ps->weapon == WP_NONE ) + { + weaponBusy = qfalse; + } + else if ( pm->ps->weaponstate == WEAPON_FIRING || pm->ps->weaponstate == WEAPON_CHARGING || pm->ps->weaponstate == WEAPON_CHARGING_ALT ) + { + weaponBusy = qtrue; + } + else if ( pm->ps->lastShotTime > level.time - 3000 ) + { + weaponBusy = qtrue; + } + else if ( pm->ps->weaponTime > 0 ) + { + weaponBusy = qtrue; + } + else if ( pm->gent && pm->gent->client->fireDelay > 0 ) + { + weaponBusy = qtrue; + } + else if ( TorsoAgainstWindTest(pm->gent) ) + { + return; + } + else if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.zoomTime > cg.time - 5000 ) + {//if we used binoculars recently, aim weapon + weaponBusy = qtrue; + pm->ps->weaponstate = WEAPON_IDLE; + } + else if ( pm->ps->pm_flags & PMF_DUCKED ) + {//ducking is considered on alert... plus looks stupid to have arms hanging down when crouched + weaponBusy = qtrue; + } + + if ( pm->ps->weapon == WP_NONE || + pm->ps->weaponstate == WEAPON_READY || + pm->ps->weaponstate == WEAPON_CHARGING || + pm->ps->weaponstate == WEAPON_CHARGING_ALT ) + { + if ( pm->ps->weapon == WP_SABER && pm->ps->SaberLength() ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 + } + else if( pm->ps->legsAnim == BOTH_RUN1 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_RUN2 && !weaponBusy )//&& pm->ps->saberAnimLevel != SS_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN2,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_RUN4 && !weaponBusy )//&& pm->ps->saberAnimLevel != SS_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN4,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_RUN_STAFF && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_STAFF,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_RUN_DUAL && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_DUAL,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_WALK1 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_WALK2 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK2,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_WALK_STAFF && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_STAFF,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_WALK_DUAL&& !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_DUAL,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_CROUCH1IDLE && pm->ps->clientNum != 0 )//player falls through + { + //??? Why nothing? What if you were running??? + //PM_SetAnim(pm,SETANIM_TORSO,BOTH_CROUCH1IDLE,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_JUMP1 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_JUMP1,SETANIM_FLAG_NORMAL, 100); // Only blend over 100ms + } + else if( pm->ps->legsAnim == BOTH_SWIM_IDLE1 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIM_IDLE1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_SWIMFORWARD && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIMFORWARD,SETANIM_FLAG_NORMAL); + } + else if ( pm->ps->weapon == WP_NONE ) + { + int legsAnim = pm->ps->legsAnim; + /* + if ( PM_RollingAnim( legsAnim ) || + PM_FlippingAnim( legsAnim ) || + PM_JumpingAnim( legsAnim ) || + PM_PainAnim( legsAnim ) || + PM_SwimmingAnim( legsAnim ) ) + */ + { + PM_SetAnim(pm, SETANIM_TORSO, legsAnim, SETANIM_FLAG_NORMAL ); + } + } + else + {//Used to default to both_stand1 which is an arms-down anim + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else if ( pm->gent != NULL + && (pm->gent->s.numbergent)) + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT ) + {//PLayer- temp hack for weapon frame + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + {//ignore + } + else if ( pm->ps->weapon == WP_MELEE ) + {//hehe + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + else if ( PM_InSpecialJump( pm->ps->legsAnim ) ) + {//use legs anim + //FIXME: or just use whatever's currently playing? + //PM_SetAnim( pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL ); + } + else + { + switch(pm->ps->weapon) + { + // ******************************************************** + case WP_SABER: // WP_LIGHTSABER + // Ready pose for Lightsaber +// PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 + // Select the next proper pose for the lightsaber assuming that there are no attacks. + if (pm->ps->saberMove > LS_NONE && pm->ps->saberMove < LS_MOVE_MAX) + { + PM_SetSaberMove(saberMoveData[pm->ps->saberMove].chain_idle); + } + break; + // ******************************************************** + + case WP_BRYAR_PISTOL: + //FIXME: if recently fired, hold the ready! + if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + break; + case WP_BLASTER_PISTOL: + if ( pm->gent + && pm->gent->weaponModel[1] > 0 ) + {//dual pistols + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUNSIT1,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + } + } + else + {//single pistols + if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + } + break; + case WP_NONE: + //NOTE: should never get here + break; + case WP_MELEE: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + {//ignore + } + else if ( pm->gent && pm->gent->client && !PM_DroidMelee( pm->gent->client->NPC_class ) ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + break; + case WP_TUSKEN_STAFF: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND3, SETANIM_FLAG_NORMAL); + } + break; + + case WP_NOGHRI_STICK: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + //PM_SetAnim(pm,SETANIM_LEGS,BOTH_ATTACK2,SETANIM_FLAG_NORMAL); + break; + + case WP_BLASTER: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + //PM_SetAnim(pm,SETANIM_LEGS,BOTH_ATTACK2,SETANIM_FLAG_NORMAL); + break; + case WP_DISRUPTOR: + case WP_TUSKEN_RIFLE: + if ( (pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT) + || PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running sniper weapon uses normal ready + if ( pm->ps->clientNum ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + } + else + { + if ( pm->ps->clientNum ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD );//TORSO_WEAPONREADY4//SETANIM_FLAG_RESTART| + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL ); + } + } + break; + case WP_BOT_LASER: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + break; + case WP_THERMAL: + if ( pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT + && (PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim )) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && (pm->ps->weaponstate == WEAPON_CHARGING || pm->ps->weaponstate == WEAPON_CHARGING_ALT) ) + {//player pulling back to throw + if ( PM_StandingAnim( pm->ps->legsAnim ) ) + { + PM_SetAnim( pm, SETANIM_LEGS, BOTH_THERMAL_READY, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + else if ( pm->ps->legsAnim == BOTH_THERMAL_READY ) + {//sigh... hold it so pm_footsteps doesn't override + if ( pm->ps->legsAnimTimer < 100 ) + { + pm->ps->legsAnimTimer = 100; + } + } + PM_SetAnim( pm, SETANIM_TORSO, BOTH_THERMAL_READY, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + else + { + if ( weaponBusy ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY10, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + } + } + } + break; + case WP_REPEATER: + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_GALAKMECH ) + {// + if ( pm->gent->alt_fire ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY1,SETANIM_FLAG_NORMAL); + } + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + break; + case WP_TRIP_MINE: + case WP_DET_PACK: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( weaponBusy ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + } + } + break; + default: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + break; + } + } + } + } + else if ( pm->ps->weaponstate == WEAPON_IDLE ) + { + if( pm->ps->legsAnim == BOTH_GUARD_LOOKAROUND1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_LOOKAROUND1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_GUARD_IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_IDLE1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_STAND1IDLE1 + || pm->ps->legsAnim == BOTH_STAND2IDLE1 + || pm->ps->legsAnim == BOTH_STAND2IDLE2 + || pm->ps->legsAnim == BOTH_STAND3IDLE1 + || pm->ps->legsAnim == BOTH_STAND5IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND2TO4 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND2TO4,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_STAND4TO2 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4TO2,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_STAND4 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_SWIM_IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIM_IDLE1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_SWIMFORWARD ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIMFORWARD,SETANIM_FLAG_NORMAL); + } + else if ( PM_InSpecialJump( pm->ps->legsAnim ) ) + {//use legs anim + //FIXME: or just use whatever's currently playing? + //PM_SetAnim( pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL ); + } + else if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + if ( !weaponBusy + && pm->ps->weapon != WP_BOWCASTER + && pm->ps->weapon != WP_REPEATER + && pm->ps->weapon != WP_FLECHETTE + && pm->ps->weapon != WP_ROCKET_LAUNCHER + && pm->ps->weapon != WP_CONCUSSION + && ( PM_RunningAnim( pm->ps->legsAnim ) + || (PM_WalkingAnim( pm->ps->legsAnim ) && (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) ) + {//running w/1-handed or light 2-handed weapon uses full-body anim if you're not using the weapon right now + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + switch ( pm->ps->weapon ) + { + // ******************************************************** + case WP_SABER: // WP_LIGHTSABER + // Shouldn't get here, should go to TorsoAnimLightsaber + break; + // ******************************************************** + + case WP_BRYAR_PISTOL: + if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_NORMAL); + } + break; + case WP_BLASTER_PISTOL: + if ( pm->gent + && pm->gent->weaponModel[1] > 0 ) + {//dual pistols + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUNSIT1,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + else + {//single pistols + if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_NORMAL); + } + } + break; + + case WP_NONE: + //NOTE: should never get here + break; + + case WP_MELEE: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + {//ignore + } + else if ( pm->gent && pm->gent->client && !PM_DroidMelee( pm->gent->client->NPC_class ) ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + break; + + case WP_TUSKEN_STAFF: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND3, SETANIM_FLAG_NORMAL); + } + break; + + case WP_NOGHRI_STICK: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + + case WP_BLASTER: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + + case WP_DISRUPTOR: + case WP_TUSKEN_RIFLE: + if ( (pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT) + || PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running sniper weapon uses normal ready + if ( pm->ps->clientNum ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + } + else + { + if ( pm->ps->clientNum ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL ); + } + } + break; + + case WP_BOT_LASER: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + break; + + case WP_THERMAL: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( weaponBusy ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONIDLE10, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + } + } + break; + + case WP_REPEATER: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + case WP_TRIP_MINE: + case WP_DET_PACK: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( weaponBusy ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONIDLE3, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + } + } + break; + + default: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + } + } + } + } +} + +//========================================================================= +// Anim checking utils +//========================================================================= + +int PM_GetTurnAnim( gentity_t *gent, int anim ) +{ + if ( !gent ) + { + return -1; + } + + switch( anim ) + { + case BOTH_STAND1: //# Standing idle: no weapon: hands down + case BOTH_STAND1IDLE1: //# Random standing idle + case BOTH_STAND2: //# Standing idle with a weapon + case BOTH_SABERFAST_STANCE: + case BOTH_SABERSLOW_STANCE: + case BOTH_STAND2IDLE1: //# Random standing idle + case BOTH_STAND2IDLE2: //# Random standing idle + case BOTH_STAND3: //# Standing hands behind back: at ease: etc. + case BOTH_STAND3IDLE1: //# Random standing idle + case BOTH_STAND4: //# two handed: gun down: relaxed stand + case BOTH_STAND5: //# standing idle, no weapon, hand down, back straight + case BOTH_STAND5IDLE1: //# Random standing idle + case BOTH_STAND6: //# one handed: gun at side: relaxed stand + case BOTH_STAND2TO4: //# Transition from stand2 to stand4 + case BOTH_STAND4TO2: //# Transition from stand4 to stand2 + case BOTH_GESTURE1: //# Generic gesture: non-specific + case BOTH_GESTURE2: //# Generic gesture: non-specific + case BOTH_TALK1: //# Generic talk anim + case BOTH_TALK2: //# Generic talk anim + if ( PM_HasAnimation( gent, LEGS_TURN1 ) ) + { + return LEGS_TURN1; + } + else + { + return -1; + } + break; + case BOTH_ATTACK1: //# Attack with generic 1-handed weapon + case BOTH_ATTACK2: //# Attack with generic 2-handed weapon + case BOTH_ATTACK3: //# Attack with heavy 2-handed weapon + case BOTH_ATTACK4: //# Attack with ??? + case BOTH_MELEE1: //# First melee attack + case BOTH_MELEE2: //# Second melee attack + case BOTH_GUARD_LOOKAROUND1: //# Cradling weapon and looking around + case BOTH_GUARD_IDLE1: //# Cradling weapon and standing + if ( PM_HasAnimation( gent, LEGS_TURN2 ) ) + { + return LEGS_TURN2; + } + else + { + return -1; + } + break; + default: + return -1; + break; + } +} + +int PM_TurnAnimForLegsAnim( gentity_t *gent, int anim ) +{ + if ( !gent ) + { + return -1; + } + + switch( anim ) + { + case BOTH_STAND1: //# Standing idle: no weapon: hands down + case BOTH_STAND1IDLE1: //# Random standing idle + if ( PM_HasAnimation( gent, BOTH_TURNSTAND1 ) ) + { + return BOTH_TURNSTAND1; + } + else + { + return -1; + } + break; + case BOTH_STAND2: //# Standing idle with a weapon + case BOTH_SABERFAST_STANCE: + case BOTH_SABERSLOW_STANCE: + case BOTH_STAND2IDLE1: //# Random standing idle + case BOTH_STAND2IDLE2: //# Random standing idle + if ( PM_HasAnimation( gent, BOTH_TURNSTAND2 ) ) + { + return BOTH_TURNSTAND2; + } + else + { + return -1; + } + break; + case BOTH_STAND3: //# Standing hands behind back: at ease: etc. + case BOTH_STAND3IDLE1: //# Random standing idle + if ( PM_HasAnimation( gent, BOTH_TURNSTAND3 ) ) + { + return BOTH_TURNSTAND3; + } + else + { + return -1; + } + break; + case BOTH_STAND4: //# two handed: gun down: relaxed stand + if ( PM_HasAnimation( gent, BOTH_TURNSTAND4 ) ) + { + return BOTH_TURNSTAND4; + } + else + { + return -1; + } + break; + case BOTH_STAND5: //# standing idle, no weapon, hand down, back straight + case BOTH_STAND5IDLE1: //# Random standing idle + if ( PM_HasAnimation( gent, BOTH_TURNSTAND5 ) ) + { + return BOTH_TURNSTAND5; + } + else + { + return -1; + } + break; + case BOTH_CROUCH1: //# Transition from standing to crouch + case BOTH_CROUCH1IDLE: //# Crouching idle + /* + case BOTH_UNCROUCH1: //# Transition from crouch to standing + case BOTH_CROUCH2TOSTAND1: //# going from crouch2 to stand1 + case BOTH_CROUCH3: //# Desann crouching down to Kyle (cin 9) + case BOTH_UNCROUCH3: //# Desann uncrouching down to Kyle (cin 9) + case BOTH_CROUCH4: //# Slower version of crouch1 for cinematics + case BOTH_UNCROUCH4: //# Slower version of uncrouch1 for cinematics + */ + if ( PM_HasAnimation( gent, BOTH_TURNCROUCH1 ) ) + { + return BOTH_TURNCROUCH1; + } + else + { + return -1; + } + break; + default: + return -1; + break; + } +} + +qboolean PM_InOnGroundAnim ( playerState_t *ps ) +{ + switch( ps->legsAnim ) + { + case BOTH_DEAD1: + case BOTH_DEAD2: + case BOTH_DEAD3: + case BOTH_DEAD4: + case BOTH_DEAD5: + case BOTH_DEADFORWARD1: + case BOTH_DEADBACKWARD1: + case BOTH_DEADFORWARD2: + case BOTH_DEADBACKWARD2: + case BOTH_LYINGDEATH1: + case BOTH_LYINGDEAD1: + case BOTH_SLEEP1: //# laying on back-rknee up-rhand on torso + return qtrue; + break; + case BOTH_KNOCKDOWN1: //# + case BOTH_KNOCKDOWN2: //# + case BOTH_KNOCKDOWN3: //# + case BOTH_KNOCKDOWN4: //# + case BOTH_KNOCKDOWN5: //# + case BOTH_LK_DL_ST_T_SB_1_L: + case BOTH_RELEASED: + if ( ps->legsAnimTimer < 500 ) + {//pretty much horizontal by this point + return qtrue; + } + break; + case BOTH_PLAYER_PA_3_FLY: + if ( ps->legsAnimTimer < 300 ) + {//pretty much horizontal by this point + return qtrue; + } + /* + else if ( ps->clientNum < MAX_CLIENTS + && ps->legsAnimTimer < 300 + PLAYER_KNOCKDOWN_HOLD_EXTRA_TIME ) + { + return qtrue; + } + */ + break; + case BOTH_GETUP1: + case BOTH_GETUP2: + case BOTH_GETUP3: + case BOTH_GETUP4: + case BOTH_GETUP5: + case BOTH_GETUP_CROUCH_F1: + case BOTH_GETUP_CROUCH_B1: + case BOTH_FORCE_GETUP_F1: + case BOTH_FORCE_GETUP_F2: + case BOTH_FORCE_GETUP_B1: + case BOTH_FORCE_GETUP_B2: + case BOTH_FORCE_GETUP_B3: + case BOTH_FORCE_GETUP_B4: + case BOTH_FORCE_GETUP_B5: + case BOTH_FORCE_GETUP_B6: + if ( ps->legsAnimTimer > PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)ps->legsAnim )-400 ) + {//still pretty much horizontal at this point + return qtrue; + } + break; + } + + return qfalse; +} + +qboolean PM_InSpecialDeathAnim( int anim ) +{ + switch( pm->ps->legsAnim ) + { + case BOTH_DEATH_ROLL: //# Death anim from a roll + case BOTH_DEATH_FLIP: //# Death anim from a flip + case BOTH_DEATH_SPIN_90_R: //# Death anim when facing 90 degrees right + case BOTH_DEATH_SPIN_90_L: //# Death anim when facing 90 degrees left + case BOTH_DEATH_SPIN_180: //# Death anim when facing backwards + case BOTH_DEATH_LYING_UP: //# Death anim when lying on back + case BOTH_DEATH_LYING_DN: //# Death anim when lying on front + case BOTH_DEATH_FALLING_DN: //# Death anim when falling on face + case BOTH_DEATH_FALLING_UP: //# Death anim when falling on back + case BOTH_DEATH_CROUCHED: //# Death anim when crouched + return qtrue; + break; + default: + return qfalse; + break; + } +} + +qboolean PM_InDeathAnim ( void ) +{//Purposely does not cover stumbledeath and falldeath... + switch( pm->ps->legsAnim ) + { + case BOTH_DEATH1: //# First Death anim + case BOTH_DEATH2: //# Second Death anim + case BOTH_DEATH3: //# Third Death anim + case BOTH_DEATH4: //# Fourth Death anim + case BOTH_DEATH5: //# Fifth Death anim + case BOTH_DEATH6: //# Sixth Death anim + case BOTH_DEATH7: //# Seventh Death anim + case BOTH_DEATH8: //# + case BOTH_DEATH9: //# + case BOTH_DEATH10: //# + case BOTH_DEATH11: //# + case BOTH_DEATH12: //# + case BOTH_DEATH13: //# + case BOTH_DEATH14: //# + case BOTH_DEATH14_UNGRIP: //# Desann's end death (cin #35) + case BOTH_DEATH14_SITUP: //# Tavion sitting up after having been thrown (cin #23) + case BOTH_DEATH15: //# + case BOTH_DEATH16: //# + case BOTH_DEATH17: //# + case BOTH_DEATH18: //# + case BOTH_DEATH19: //# + case BOTH_DEATH20: //# + case BOTH_DEATH21: //# + case BOTH_DEATH22: //# + case BOTH_DEATH23: //# + case BOTH_DEATH24: //# + case BOTH_DEATH25: //# + + case BOTH_DEATHFORWARD1: //# First Death in which they get thrown forward + case BOTH_DEATHFORWARD2: //# Second Death in which they get thrown forward + case BOTH_DEATHFORWARD3: //# Tavion's falling in cin# 23 + case BOTH_DEATHBACKWARD1: //# First Death in which they get thrown backward + case BOTH_DEATHBACKWARD2: //# Second Death in which they get thrown backward + + case BOTH_DEATH1IDLE: //# Idle while close to death + case BOTH_LYINGDEATH1: //# Death to play when killed lying down + case BOTH_STUMBLEDEATH1: //# Stumble forward and fall face first death + case BOTH_FALLDEATH1: //# Fall forward off a high cliff and splat death - start + case BOTH_FALLDEATH1INAIR: //# Fall forward off a high cliff and splat death - loop + case BOTH_FALLDEATH1LAND: //# Fall forward off a high cliff and splat death - hit bottom + //# #sep case BOTH_ DEAD POSES # Should be last frame of corresponding previous anims + case BOTH_DEAD1: //# First Death finished pose + case BOTH_DEAD2: //# Second Death finished pose + case BOTH_DEAD3: //# Third Death finished pose + case BOTH_DEAD4: //# Fourth Death finished pose + case BOTH_DEAD5: //# Fifth Death finished pose + case BOTH_DEAD6: //# Sixth Death finished pose + case BOTH_DEAD7: //# Seventh Death finished pose + case BOTH_DEAD8: //# + case BOTH_DEAD9: //# + case BOTH_DEAD10: //# + case BOTH_DEAD11: //# + case BOTH_DEAD12: //# + case BOTH_DEAD13: //# + case BOTH_DEAD14: //# + case BOTH_DEAD15: //# + case BOTH_DEAD16: //# + case BOTH_DEAD17: //# + case BOTH_DEAD18: //# + case BOTH_DEAD19: //# + case BOTH_DEAD20: //# + case BOTH_DEAD21: //# + case BOTH_DEAD22: //# + case BOTH_DEAD23: //# + case BOTH_DEAD24: //# + case BOTH_DEAD25: //# + case BOTH_DEADFORWARD1: //# First thrown forward death finished pose + case BOTH_DEADFORWARD2: //# Second thrown forward death finished pose + case BOTH_DEADBACKWARD1: //# First thrown backward death finished pose + case BOTH_DEADBACKWARD2: //# Second thrown backward death finished pose + case BOTH_LYINGDEAD1: //# Killed lying down death finished pose + case BOTH_STUMBLEDEAD1: //# Stumble forward death finished pose + case BOTH_FALLDEAD1LAND: //# Fall forward and splat death finished pose + //# #sep case BOTH_ DEAD TWITCH/FLOP # React to being shot from death poses + case BOTH_DEADFLOP1: //# React to being shot from First Death finished pose + case BOTH_DEADFLOP2: //# React to being shot from Second Death finished pose + case BOTH_DISMEMBER_HEAD1: //# + case BOTH_DISMEMBER_TORSO1: //# + case BOTH_DISMEMBER_LLEG: //# + case BOTH_DISMEMBER_RLEG: //# + case BOTH_DISMEMBER_RARM: //# + case BOTH_DISMEMBER_LARM: //# + return qtrue; + break; + default: + return PM_InSpecialDeathAnim( pm->ps->legsAnim ); + break; + } +} + +qboolean PM_InCartwheel( int anim ) +{ + switch ( anim ) + { + case BOTH_ARIAL_LEFT: + case BOTH_ARIAL_RIGHT: + case BOTH_ARIAL_F1: + case BOTH_CARTWHEEL_LEFT: + case BOTH_CARTWHEEL_RIGHT: + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_InButterfly( int anim ) +{ + switch ( anim ) + { + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_StandingAnim( int anim ) +{//NOTE: does not check idles or special (cinematic) stands + switch ( anim ) + { + case BOTH_STAND1: + case BOTH_STAND2: + case BOTH_STAND3: + case BOTH_STAND4: + case BOTH_ATTACK3: + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_InAirKickingAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_A7_KICK_F_AIR: + case BOTH_A7_KICK_B_AIR: + case BOTH_A7_KICK_R_AIR: + case BOTH_A7_KICK_L_AIR: + return qtrue; + } + return qfalse; +} + +qboolean PM_KickingAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_A7_KICK_F: + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + case BOTH_A7_KICK_S: + case BOTH_A7_KICK_BF: + case BOTH_A7_KICK_RL: + //NOT a kick, but acts like one: + case BOTH_A7_HILT: + //NOT kicks, but do kick traces anyway + case BOTH_GETUP_BROLL_B: + case BOTH_GETUP_BROLL_F: + case BOTH_GETUP_FROLL_B: + case BOTH_GETUP_FROLL_F: + return qtrue; + break; + default: + return PM_InAirKickingAnim( anim ); + break; + } + //return qfalse; +} + +qboolean PM_StabDownAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_STABDOWN: + case BOTH_STABDOWN_STAFF: + case BOTH_STABDOWN_DUAL: + return qtrue; + } + return qfalse; +} + +qboolean PM_GoingToAttackDown( playerState_t *ps ) +{ + if ( PM_StabDownAnim( ps->torsoAnim )//stabbing downward + || ps->saberMove == LS_A_LUNGE//lunge + || ps->saberMove == LS_A_JUMP_T__B_//death from above + || ps->saberMove == LS_A_T2B//attacking top to bottom + || ps->saberMove == LS_S_T2B//starting at attack downward + || (PM_SaberInTransition( ps->saberMove ) && saberMoveData[ps->saberMove].endQuad == Q_T) )//transitioning to a top to bottom attack + { + return qtrue; + } + return qfalse; +} + +qboolean PM_ForceUsingSaberAnim( int anim ) +{//saber/acrobatic anims that should prevent you from recharging force power while you're in them... + switch ( anim ) + { + case BOTH_JUMPFLIPSLASHDOWN1: + case BOTH_JUMPFLIPSTABDOWN: + case BOTH_FORCELEAP2_T__B_: + case BOTH_JUMPATTACK6: + case BOTH_JUMPATTACK7: + case BOTH_FORCELONGLEAP_START: + case BOTH_FORCELONGLEAP_ATTACK: + case BOTH_FORCEWALLRUNFLIP_START: + case BOTH_FORCEWALLRUNFLIP_END: + case BOTH_FORCEWALLRUNFLIP_ALT: + case BOTH_FORCEWALLREBOUND_FORWARD: + case BOTH_FORCEWALLREBOUND_LEFT: + case BOTH_FORCEWALLREBOUND_BACK: + case BOTH_FORCEWALLREBOUND_RIGHT: + case BOTH_FLIP_ATTACK7: + case BOTH_FLIP_HOLD7: + case BOTH_FLIP_LAND: + case BOTH_PULL_IMPALE_STAB: + case BOTH_PULL_IMPALE_SWING: + case BOTH_A6_SABERPROTECT: + case BOTH_A7_SOULCAL: + case BOTH_A1_SPECIAL: + case BOTH_A2_SPECIAL: + case BOTH_A3_SPECIAL: + case BOTH_ARIAL_LEFT: + case BOTH_ARIAL_RIGHT: + case BOTH_CARTWHEEL_LEFT: + case BOTH_CARTWHEEL_RIGHT: + case BOTH_FLIP_LEFT: + case BOTH_FLIP_BACK1: + case BOTH_FLIP_BACK2: + case BOTH_FLIP_BACK3: + case BOTH_ALORA_FLIP_B: + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + case BOTH_WALL_RUN_RIGHT: + case BOTH_WALL_RUN_RIGHT_FLIP: + case BOTH_WALL_RUN_RIGHT_STOP: + case BOTH_WALL_RUN_LEFT: + case BOTH_WALL_RUN_LEFT_FLIP: + case BOTH_WALL_RUN_LEFT_STOP: + case BOTH_WALL_FLIP_RIGHT: + case BOTH_WALL_FLIP_LEFT: + case BOTH_FORCEJUMP1: + case BOTH_FORCEINAIR1: + case BOTH_FORCELAND1: + case BOTH_FORCEJUMPBACK1: + case BOTH_FORCEINAIRBACK1: + case BOTH_FORCELANDBACK1: + case BOTH_FORCEJUMPLEFT1: + case BOTH_FORCEINAIRLEFT1: + case BOTH_FORCELANDLEFT1: + case BOTH_FORCEJUMPRIGHT1: + case BOTH_FORCEINAIRRIGHT1: + case BOTH_FORCELANDRIGHT1: + case BOTH_FLIP_F: + case BOTH_FLIP_B: + case BOTH_FLIP_L: + case BOTH_FLIP_R: + case BOTH_ALORA_FLIP_1: + case BOTH_ALORA_FLIP_2: + case BOTH_ALORA_FLIP_3: + case BOTH_DODGE_FL: + case BOTH_DODGE_FR: + case BOTH_DODGE_BL: + case BOTH_DODGE_BR: + case BOTH_DODGE_L: + case BOTH_DODGE_R: + case BOTH_DODGE_HOLD_FL: + case BOTH_DODGE_HOLD_FR: + case BOTH_DODGE_HOLD_BL: + case BOTH_DODGE_HOLD_BR: + case BOTH_DODGE_HOLD_L: + case BOTH_DODGE_HOLD_R: + case BOTH_FORCE_GETUP_F1: + case BOTH_FORCE_GETUP_F2: + case BOTH_FORCE_GETUP_B1: + case BOTH_FORCE_GETUP_B2: + case BOTH_FORCE_GETUP_B3: + case BOTH_FORCE_GETUP_B4: + case BOTH_FORCE_GETUP_B5: + case BOTH_FORCE_GETUP_B6: + case BOTH_GETUP_BROLL_B: + case BOTH_GETUP_BROLL_F: + case BOTH_GETUP_BROLL_L: + case BOTH_GETUP_BROLL_R: + case BOTH_GETUP_FROLL_B: + case BOTH_GETUP_FROLL_F: + case BOTH_GETUP_FROLL_L: + case BOTH_GETUP_FROLL_R: + case BOTH_WALL_FLIP_BACK1: + case BOTH_WALL_FLIP_BACK2: + case BOTH_SPIN1: + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + case BOTH_DEFLECTSLASH__R__L_FIN: + case BOTH_ARIAL_F1: + return qtrue; + } + return qfalse; +} + +qboolean G_HasKnockdownAnims( gentity_t *ent ) +{ + if ( PM_HasAnimation( ent, BOTH_KNOCKDOWN1 ) + && PM_HasAnimation( ent, BOTH_KNOCKDOWN2 ) + && PM_HasAnimation( ent, BOTH_KNOCKDOWN3 ) + && PM_HasAnimation( ent, BOTH_KNOCKDOWN4 ) + && PM_HasAnimation( ent, BOTH_KNOCKDOWN5 ) ) + { + return qtrue; + } + return qfalse; +} + +qboolean PM_InAttackRoll( int anim ) +{ + switch ( anim ) + { + case BOTH_GETUP_BROLL_B: + case BOTH_GETUP_BROLL_F: + case BOTH_GETUP_FROLL_B: + case BOTH_GETUP_FROLL_F: + return qtrue; + } + return qfalse; +} + +qboolean PM_LockedAnim( int anim ) +{//anims that can *NEVER* be overridden, regardless + switch ( anim ) + { + case BOTH_KYLE_PA_1: + case BOTH_KYLE_PA_2: + case BOTH_KYLE_PA_3: + case BOTH_PLAYER_PA_1: + case BOTH_PLAYER_PA_2: + case BOTH_PLAYER_PA_3: + case BOTH_PLAYER_PA_3_FLY: + case BOTH_TAVION_SCEPTERGROUND: + case BOTH_TAVION_SWORDPOWER: + case BOTH_SCEPTER_START: + case BOTH_SCEPTER_HOLD: + case BOTH_SCEPTER_STOP: + //grabbed by wampa + case BOTH_GRABBED: //# + case BOTH_RELEASED: //# when Wampa drops player, transitions into fall on back + case BOTH_HANG_IDLE: //# + case BOTH_HANG_ATTACK: //# + case BOTH_HANG_PAIN: //# + return qtrue; + } + return qfalse; +} + +qboolean PM_SuperBreakLoseAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_LK_S_DL_S_SB_1_L: //super break I lost + case BOTH_LK_S_DL_T_SB_1_L: //super break I lost + case BOTH_LK_S_ST_S_SB_1_L: //super break I lost + case BOTH_LK_S_ST_T_SB_1_L: //super break I lost + case BOTH_LK_S_S_S_SB_1_L: //super break I lost + case BOTH_LK_S_S_T_SB_1_L: //super break I lost + case BOTH_LK_DL_DL_S_SB_1_L: //super break I lost + case BOTH_LK_DL_DL_T_SB_1_L: //super break I lost + case BOTH_LK_DL_ST_S_SB_1_L: //super break I lost + case BOTH_LK_DL_ST_T_SB_1_L: //super break I lost + case BOTH_LK_DL_S_S_SB_1_L: //super break I lost + case BOTH_LK_DL_S_T_SB_1_L: //super break I lost + case BOTH_LK_ST_DL_S_SB_1_L: //super break I lost + case BOTH_LK_ST_DL_T_SB_1_L: //super break I lost + case BOTH_LK_ST_ST_S_SB_1_L: //super break I lost + case BOTH_LK_ST_ST_T_SB_1_L: //super break I lost + case BOTH_LK_ST_S_S_SB_1_L: //super break I lost + case BOTH_LK_ST_S_T_SB_1_L: //super break I lost + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_SuperBreakWinAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_LK_S_DL_S_SB_1_W: //super break I won + case BOTH_LK_S_DL_T_SB_1_W: //super break I won + case BOTH_LK_S_ST_S_SB_1_W: //super break I won + case BOTH_LK_S_ST_T_SB_1_W: //super break I won + case BOTH_LK_S_S_S_SB_1_W: //super break I won + case BOTH_LK_S_S_T_SB_1_W: //super break I won + case BOTH_LK_DL_DL_S_SB_1_W: //super break I won + case BOTH_LK_DL_DL_T_SB_1_W: //super break I won + case BOTH_LK_DL_ST_S_SB_1_W: //super break I won + case BOTH_LK_DL_ST_T_SB_1_W: //super break I won + case BOTH_LK_DL_S_S_SB_1_W: //super break I won + case BOTH_LK_DL_S_T_SB_1_W: //super break I won + case BOTH_LK_ST_DL_S_SB_1_W: //super break I won + case BOTH_LK_ST_DL_T_SB_1_W: //super break I won + case BOTH_LK_ST_ST_S_SB_1_W: //super break I won + case BOTH_LK_ST_ST_T_SB_1_W: //super break I won + case BOTH_LK_ST_S_S_SB_1_W: //super break I won + case BOTH_LK_ST_S_T_SB_1_W: //super break I won + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_SaberLockBreakAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_BF1BREAK: + case BOTH_BF2BREAK: + case BOTH_CWCIRCLEBREAK: + case BOTH_CCWCIRCLEBREAK: + case BOTH_LK_S_DL_S_B_1_L: //normal break I lost + case BOTH_LK_S_DL_S_B_1_W: //normal break I won + case BOTH_LK_S_DL_T_B_1_L: //normal break I lost + case BOTH_LK_S_DL_T_B_1_W: //normal break I won + case BOTH_LK_S_ST_S_B_1_L: //normal break I lost + case BOTH_LK_S_ST_S_B_1_W: //normal break I won + case BOTH_LK_S_ST_T_B_1_L: //normal break I lost + case BOTH_LK_S_ST_T_B_1_W: //normal break I won + case BOTH_LK_S_S_S_B_1_L: //normal break I lost + case BOTH_LK_S_S_S_B_1_W: //normal break I won + case BOTH_LK_S_S_T_B_1_L: //normal break I lost + case BOTH_LK_S_S_T_B_1_W: //normal break I won + case BOTH_LK_DL_DL_S_B_1_L: //normal break I lost + case BOTH_LK_DL_DL_S_B_1_W: //normal break I won + case BOTH_LK_DL_DL_T_B_1_L: //normal break I lost + case BOTH_LK_DL_DL_T_B_1_W: //normal break I won + case BOTH_LK_DL_ST_S_B_1_L: //normal break I lost + case BOTH_LK_DL_ST_S_B_1_W: //normal break I won + case BOTH_LK_DL_ST_T_B_1_L: //normal break I lost + case BOTH_LK_DL_ST_T_B_1_W: //normal break I won + case BOTH_LK_DL_S_S_B_1_L: //normal break I lost + case BOTH_LK_DL_S_S_B_1_W: //normal break I won + case BOTH_LK_DL_S_T_B_1_L: //normal break I lost + case BOTH_LK_DL_S_T_B_1_W: //normal break I won + case BOTH_LK_ST_DL_S_B_1_L: //normal break I lost + case BOTH_LK_ST_DL_S_B_1_W: //normal break I won + case BOTH_LK_ST_DL_T_B_1_L: //normal break I lost + case BOTH_LK_ST_DL_T_B_1_W: //normal break I won + case BOTH_LK_ST_ST_S_B_1_L: //normal break I lost + case BOTH_LK_ST_ST_S_B_1_W: //normal break I won + case BOTH_LK_ST_ST_T_B_1_L: //normal break I lost + case BOTH_LK_ST_ST_T_B_1_W: //normal break I won + case BOTH_LK_ST_S_S_B_1_L: //normal break I lost + case BOTH_LK_ST_S_S_B_1_W: //normal break I won + case BOTH_LK_ST_S_T_B_1_L: //normal break I lost + case BOTH_LK_ST_S_T_B_1_W: //normal break I won + return (PM_SuperBreakLoseAnim(anim)||PM_SuperBreakWinAnim(anim)); + break; + } + return qfalse; +} + +qboolean PM_GetupAnimNoMove( int legsAnim ) +{ + switch( legsAnim ) + { + case BOTH_GETUP1: + case BOTH_GETUP2: + case BOTH_GETUP3: + case BOTH_GETUP4: + case BOTH_GETUP5: + case BOTH_GETUP_CROUCH_F1: + case BOTH_GETUP_CROUCH_B1: + case BOTH_FORCE_GETUP_F1: + case BOTH_FORCE_GETUP_F2: + case BOTH_FORCE_GETUP_B1: + case BOTH_FORCE_GETUP_B2: + case BOTH_FORCE_GETUP_B3: + case BOTH_FORCE_GETUP_B4: + case BOTH_FORCE_GETUP_B5: + case BOTH_FORCE_GETUP_B6: + return qtrue; + } + return qfalse; +} + +qboolean PM_KnockDownAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_KNOCKDOWN1: + case BOTH_KNOCKDOWN2: + case BOTH_KNOCKDOWN3: + case BOTH_KNOCKDOWN4: + case BOTH_KNOCKDOWN5: + /* + //special anims: + case BOTH_RELEASED: + case BOTH_LK_DL_ST_T_SB_1_L: + case BOTH_PLAYER_PA_3_FLY: + */ + return qtrue; + break; + /* + default: + return PM_InGetUp( ps ); + break; + */ + } + return qfalse; +} + +qboolean PM_KnockDownAnimExtended( int anim ) +{ + switch ( anim ) + { + case BOTH_KNOCKDOWN1: + case BOTH_KNOCKDOWN2: + case BOTH_KNOCKDOWN3: + case BOTH_KNOCKDOWN4: + case BOTH_KNOCKDOWN5: + //special anims: + case BOTH_RELEASED: + case BOTH_LK_DL_ST_T_SB_1_L: + case BOTH_PLAYER_PA_3_FLY: + return qtrue; + break; + /* + default: + return PM_InGetUp( ps ); + break; + */ + } + return qfalse; +} + +qboolean PM_SaberInKata( saberMoveName_t saberMove ) +{ + switch ( saberMove ) + { + case LS_A1_SPECIAL: + case LS_A2_SPECIAL: + case LS_A3_SPECIAL: + case LS_DUAL_SPIN_PROTECT: + case LS_STAFF_SOULCAL: + return qtrue; + default: + break; + } + return qfalse; +} + +qboolean PM_CanRollFromSoulCal( playerState_t *ps ) +{ + if ( ps->legsAnim == BOTH_A7_SOULCAL + && ps->legsAnimTimer < 700 + && ps->legsAnimTimer > 250 ) + { + return qtrue; + } + return qfalse; +} + +qboolean BG_FullBodyTauntAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_GESTURE1: + case BOTH_DUAL_TAUNT: + case BOTH_STAFF_TAUNT: + case BOTH_BOW: + case BOTH_MEDITATE: + case BOTH_SHOWOFF_FAST: + case BOTH_SHOWOFF_MEDIUM: + case BOTH_SHOWOFF_STRONG: + case BOTH_SHOWOFF_DUAL: + case BOTH_SHOWOFF_STAFF: + case BOTH_VICTORY_FAST: + case BOTH_VICTORY_MEDIUM: + case BOTH_VICTORY_STRONG: + case BOTH_VICTORY_DUAL: + case BOTH_VICTORY_STAFF: + return qtrue; + break; + } + return qfalse; +} diff --git a/code/game/bg_panimate.cpp.BASE.8780.cpp b/code/game/bg_panimate.cpp.BASE.8780.cpp new file mode 100644 index 0000000000..41b0d561f0 --- /dev/null +++ b/code/game/bg_panimate.cpp.BASE.8780.cpp @@ -0,0 +1,7255 @@ +/* +This file is part of Jedi Academy. + + Jedi Academy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + Jedi Academy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Jedi Academy. If not, see . +*/ +// Copyright 2001-2013 Raven Software + +// this include must remain at the top of every bg_xxxx CPP file +#include "common_headers.h" + + +// define GAME_INCLUDE so that g_public.h does not define the +// short, server-visible gclient_t and gentity_t structures, +// because we define the full size ones in this file +#define GAME_INCLUDE + +#include "../qcommon/q_shared.h" +#include "g_shared.h" +#include "bg_local.h" +#include "../cgame/cg_local.h" +#include "anims.h" +#include "Q3_Interface.h" +#include "g_local.h" +#include "wp_saber.h" +#include "g_vehicles.h" + +extern pmove_t *pm; +extern pml_t pml; +extern cvar_t *g_ICARUSDebug; +extern cvar_t *g_timescale; +extern cvar_t *g_synchSplitAnims; +extern cvar_t *g_AnimWarning; +extern cvar_t *g_noFootSlide; +extern cvar_t *g_noFootSlideRunScale; +extern cvar_t *g_noFootSlideWalkScale; +extern cvar_t *g_saberAnimSpeed; +extern cvar_t *g_saberAutoAim; +extern cvar_t *g_speederControlScheme; +extern cvar_t *g_saberNewControlScheme; + +extern qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f ); +extern void WP_ForcePowerDrain( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); +extern qboolean ValidAnimFileIndex ( int index ); +extern qboolean PM_ControlledByPlayer( void ); +extern qboolean PM_DroidMelee( int npc_class ); +extern qboolean PM_PainAnim( int anim ); +extern qboolean PM_JumpingAnim( int anim ); +extern qboolean PM_FlippingAnim( int anim ); +extern qboolean PM_RollingAnim( int anim ); +extern qboolean PM_SwimmingAnim( int anim ); +extern qboolean PM_InKnockDown( playerState_t *ps ); +extern qboolean PM_InRoll( playerState_t *ps ); +extern qboolean PM_DodgeAnim( int anim ); +extern qboolean PM_InSlopeAnim( int anim ); +extern qboolean PM_ForceAnim( int anim ); +extern qboolean PM_InKnockDownOnGround( playerState_t *ps ); +extern qboolean PM_InSpecialJump( int anim ); +extern qboolean PM_RunningAnim( int anim ); +extern qboolean PM_WalkingAnim( int anim ); +extern qboolean PM_SwimmingAnim( int anim ); +extern qboolean PM_JumpingAnim( int anim ); +extern qboolean PM_SaberStanceAnim( int anim ); +extern qboolean PM_SaberDrawPutawayAnim( int anim ); +extern void PM_SetJumped( float height, qboolean force ); +extern qboolean PM_InGetUpNoRoll( playerState_t *ps ); +extern qboolean PM_CrouchAnim( int anim ); +extern qboolean G_TryingKataAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingCartwheel( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingSpecial( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingJumpAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingJumpForwardAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingLungeAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingPullAttack( gentity_t *self, usercmd_t *cmd, qboolean amPulling ); +extern qboolean G_InCinematicSaberAnim( gentity_t *self ); +extern qboolean G_ControlledByPlayer( gentity_t *self ); + +extern int g_crosshairEntNum; + +int PM_AnimLength( int index, animNumber_t anim ); +qboolean PM_LockedAnim( int anim ); +qboolean PM_StandingAnim( int anim ); +qboolean PM_InOnGroundAnim ( playerState_t *ps ); +qboolean PM_SuperBreakWinAnim( int anim ); +qboolean PM_SuperBreakLoseAnim( int anim ); +qboolean PM_LockedAnim( int anim ); +saberMoveName_t PM_SaberFlipOverAttackMove( void ); +qboolean PM_CheckFlipOverAttackMove( qboolean checkEnemy ); +saberMoveName_t PM_SaberJumpForwardAttackMove( void ); +qboolean PM_CheckJumpForwardAttackMove( void ); +saberMoveName_t PM_SaberBackflipAttackMove( void ); +qboolean PM_CheckBackflipAttackMove( void ); +saberMoveName_t PM_SaberDualJumpAttackMove( void ); +qboolean PM_CheckDualJumpAttackMove( void ); +saberMoveName_t PM_SaberLungeAttackMove( qboolean fallbackToNormalLunge ); +qboolean PM_CheckLungeAttackMove( void ); +// Okay, here lies the much-dreaded Pat-created FSM movement chart... Heretic II strikes again! +// Why am I inflicting this on you? Well, it's better than hardcoded states. +// Ideally this will be replaced with an external file or more sophisticated move-picker +// once the game gets out of prototype stage. + +// Silly, but I'm replacing these macros so they are shorter! +#define AFLAG_IDLE (SETANIM_FLAG_NORMAL) +#define AFLAG_ACTIVE (SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_HOLDLESS) +#define AFLAG_WAIT (SETANIM_FLAG_HOLD | SETANIM_FLAG_HOLDLESS) +#define AFLAG_FINISH (SETANIM_FLAG_HOLD) + +//FIXME: add the alternate anims for each style? +saberMoveData_t saberMoveData[LS_MOVE_MAX] = {// NB:randomized + // name anim(do all styles?)startQ endQ setanimflag blend, blocking chain_idle chain_attack trailLen + {"None", BOTH_STAND1, Q_R, Q_R, AFLAG_IDLE, 350, BLK_NO, LS_NONE, LS_NONE, 0 }, // LS_NONE = 0, + + // General movements with saber + {"Ready", BOTH_STAND2, Q_R, Q_R, AFLAG_IDLE, 350, BLK_WIDE, LS_READY, LS_S_R2L, 0 }, // LS_READY, + {"Draw", BOTH_STAND1TO2, Q_R, Q_R, AFLAG_FINISH, 350, BLK_NO, LS_READY, LS_S_R2L, 0 }, // LS_DRAW, + {"Putaway", BOTH_STAND2TO1, Q_R, Q_R, AFLAG_FINISH, 350, BLK_NO, LS_READY, LS_S_R2L, 0 }, // LS_PUTAWAY, + + // Attacks + //UL2LR + {"TL2BR Att", BOTH_A1_TL_BR, Q_TL, Q_BR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_TL2BR, LS_R_TL2BR, 200 }, // LS_A_TL2BR + //SLASH LEFT + {"L2R Att", BOTH_A1__L__R, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_L2R, LS_R_L2R, 200 }, // LS_A_L2R + //LL2UR + {"BL2TR Att", BOTH_A1_BL_TR, Q_BL, Q_TR, AFLAG_ACTIVE, 50, BLK_TIGHT, LS_R_BL2TR, LS_R_BL2TR, 200 }, // LS_A_BL2TR + //LR2UL + {"BR2TL Att", BOTH_A1_BR_TL, Q_BR, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_BR2TL, LS_R_BR2TL, 200 }, // LS_A_BR2TL + //SLASH RIGHT + {"R2L Att", BOTH_A1__R__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_R2L, LS_R_R2L, 200 },// LS_A_R2L + //UR2LL + {"TR2BL Att", BOTH_A1_TR_BL, Q_TR, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_TR2BL, LS_R_TR2BL, 200 }, // LS_A_TR2BL + //SLASH DOWN + {"T2B Att", BOTH_A1_T__B_, Q_T, Q_B, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_T2B, LS_R_T2B, 200 }, // LS_A_T2B + //special attacks + {"Back Stab", BOTH_A2_STABBACK1, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACKSTAB + {"Back Att", BOTH_ATTACK_BACK, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACK + {"CR Back Att", BOTH_CROUCHATTACKBACK1,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACK_CR + {"RollStab", BOTH_ROLL_STAB, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_ROLL_STAB + {"Lunge Att", BOTH_LUNGE2_B__T_, Q_B, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_LUNGE + {"Jump Att", BOTH_FORCELEAP2_T__B_,Q_T, Q_B, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_JUMP_T__B_ + {"Flip Stab", BOTH_JUMPFLIPSTABDOWN,Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_T___R, 200 }, // LS_A_FLIP_STAB + {"Flip Slash", BOTH_JUMPFLIPSLASHDOWN1,Q_L,Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R_T_, 200 }, // LS_A_FLIP_SLASH + {"DualJump Atk",BOTH_JUMPATTACK6, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_BL_TR, 200 }, // LS_JUMPATTACK_DUAL + + {"DualJumpAtkL_A",BOTH_ARIAL_LEFT, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_A_TL2BR, 200 }, // LS_JUMPATTACK_ARIAL_LEFT + {"DualJumpAtkR_A",BOTH_ARIAL_RIGHT, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_A_TR2BL, 200 }, // LS_JUMPATTACK_ARIAL_RIGHT + + {"DualJumpAtkL_A",BOTH_CARTWHEEL_LEFT, Q_R,Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_TL_BR, 200 }, // LS_JUMPATTACK_CART_LEFT + {"DualJumpAtkR_A",BOTH_CARTWHEEL_RIGHT, Q_R,Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_TR_BL, 200 }, // LS_JUMPATTACK_CART_RIGHT + + {"DualJumpAtkLStaff", BOTH_BUTTERFLY_FL1,Q_R,Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__L__R, 200 }, // LS_JUMPATTACK_STAFF_LEFT + {"DualJumpAtkRStaff", BOTH_BUTTERFLY_FR1,Q_R,Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R__L, 200 }, // LS_JUMPATTACK_STAFF_RIGHT + + {"ButterflyLeft", BOTH_BUTTERFLY_LEFT,Q_R,Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__L__R, 200 }, // LS_BUTTERFLY_LEFT + {"ButterflyRight", BOTH_BUTTERFLY_RIGHT,Q_R,Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R__L, 200 }, // LS_BUTTERFLY_RIGHT + + {"BkFlip Atk", BOTH_JUMPATTACK7, Q_B, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_T___R, 200 }, // LS_A_BACKFLIP_ATK + {"DualSpinAtk", BOTH_SPINATTACK6, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK_DUAL + {"StfSpinAtk", BOTH_SPINATTACK7, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK + {"LngLeapAtk", BOTH_FORCELONGLEAP_ATTACK,Q_R,Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_LEAP_ATTACK + {"SwoopAtkR", BOTH_VS_ATR_S, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 200 }, // LS_SWOOP_ATTACK_RIGHT + {"SwoopAtkL", BOTH_VS_ATL_S, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 200 }, // LS_SWOOP_ATTACK_LEFT + {"TauntaunAtkR",BOTH_VT_ATR_S, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_TAUNTAUN_ATTACK_RIGHT + {"TauntaunAtkL",BOTH_VT_ATL_S, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_TAUNTAUN_ATTACK_LEFT + {"StfKickFwd", BOTH_A7_KICK_F, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_F + {"StfKickBack", BOTH_A7_KICK_B, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_B + {"StfKickRight",BOTH_A7_KICK_R, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_R + {"StfKickLeft", BOTH_A7_KICK_L, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_L + {"StfKickSpin", BOTH_A7_KICK_S, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_S + {"StfKickBkFwd",BOTH_A7_KICK_BF, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_BF + {"StfKickSplit",BOTH_A7_KICK_RL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_RL + {"StfKickFwdAir",BOTH_A7_KICK_F_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_F_AIR + {"StfKickBackAir",BOTH_A7_KICK_B_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_B_AIR + {"StfKickRightAir",BOTH_A7_KICK_R_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_R_AIR + {"StfKickLeftAir",BOTH_A7_KICK_L_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_L_AIR + {"StabDown", BOTH_STABDOWN, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN + {"StabDownStf", BOTH_STABDOWN_STAFF,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN_STAFF + {"StabDownDual",BOTH_STABDOWN_DUAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN_DUAL + {"dualspinprot",BOTH_A6_SABERPROTECT,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 500 }, // LS_DUAL_SPIN_PROTECT + {"StfSoulCal", BOTH_A7_SOULCAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 500 }, // LS_STAFF_SOULCAL + {"specialfast", BOTH_A1_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000}, // LS_A1_SPECIAL + {"specialmed", BOTH_A2_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000}, // LS_A2_SPECIAL + {"specialstr", BOTH_A3_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000}, // LS_A3_SPECIAL + {"upsidedwnatk",BOTH_FLIP_ATTACK7, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200}, // LS_UPSIDE_DOWN_ATTACK + {"pullatkstab", BOTH_PULL_IMPALE_STAB,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200}, // LS_PULL_ATTACK_STAB + {"pullatkswing",BOTH_PULL_IMPALE_SWING,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200}, // LS_PULL_ATTACK_SWING + {"AloraSpinAtk",BOTH_ALORA_SPIN_SLASH,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK_ALORA + {"Dual FB Atk", BOTH_A6_FB, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_DUAL_FB + {"Dual LR Atk", BOTH_A6_LR, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_DUAL_LR + {"StfHiltBash", BOTH_A7_HILT, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_HILT_BASH + + //starts + {"TL2BR St", BOTH_S1_S1_TL, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_TL2BR, LS_A_TL2BR, 200 }, // LS_S_TL2BR + {"L2R St", BOTH_S1_S1__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_L2R, LS_A_L2R, 200 }, // LS_S_L2R + {"BL2TR St", BOTH_S1_S1_BL, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_BL2TR, LS_A_BL2TR, 200 }, // LS_S_BL2TR + {"BR2TL St", BOTH_S1_S1_BR, Q_R, Q_BR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_BR2TL, LS_A_BR2TL, 200 }, // LS_S_BR2TL + {"R2L St", BOTH_S1_S1__R, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_R2L, LS_A_R2L, 200 }, // LS_S_R2L + {"TR2BL St", BOTH_S1_S1_TR, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_TR2BL, LS_A_TR2BL, 200 }, // LS_S_TR2BL + {"T2B St", BOTH_S1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_T2B, LS_A_T2B, 200 }, // LS_S_T2B + + //returns + {"TL2BR Ret", BOTH_R1_BR_S1, Q_BR, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_TL2BR + {"L2R Ret", BOTH_R1__R_S1, Q_R, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_L2R + {"BL2TR Ret", BOTH_R1_TR_S1, Q_TR, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_BL2TR + {"BR2TL Ret", BOTH_R1_TL_S1, Q_TL, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_BR2TL + {"R2L Ret", BOTH_R1__L_S1, Q_L, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_R2L + {"TR2BL Ret", BOTH_R1_BL_S1, Q_BL, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_TR2BL + {"T2B Ret", BOTH_R1_B__S1, Q_B, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_T2B + + //Transitions + {"BR2R Trans", BOTH_T1_BR__R, Q_BR, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc bottom right to right + {"BR2TR Trans", BOTH_T1_BR_TR, Q_BR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc bottom right to top right (use: BOTH_T1_TR_BR) + {"BR2T Trans", BOTH_T1_BR_T_, Q_BR, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc bottom right to top (use: BOTH_T1_T__BR) + {"BR2TL Trans", BOTH_T1_BR_TL, Q_BR, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast weak spin bottom right to top left + {"BR2L Trans", BOTH_T1_BR__L, Q_BR, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast weak spin bottom right to left + {"BR2BL Trans", BOTH_T1_BR_BL, Q_BR, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin bottom right to bottom left + {"R2BR Trans", BOTH_T1__R_BR, Q_R, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc right to bottom right (use: BOTH_T1_BR__R) + {"R2TR Trans", BOTH_T1__R_TR, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc right to top right + {"R2T Trans", BOTH_T1__R_T_, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast ar right to top (use: BOTH_T1_T___R) + {"R2TL Trans", BOTH_T1__R_TL, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc right to top left + {"R2L Trans", BOTH_T1__R__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast weak spin right to left + {"R2BL Trans", BOTH_T1__R_BL, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin right to bottom left + {"TR2BR Trans", BOTH_T1_TR_BR, Q_TR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc top right to bottom right + {"TR2R Trans", BOTH_T1_TR__R, Q_TR, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top right to right (use: BOTH_T1__R_TR) + {"TR2T Trans", BOTH_T1_TR_T_, Q_TR, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc top right to top (use: BOTH_T1_T__TR) + {"TR2TL Trans", BOTH_T1_TR_TL, Q_TR, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc top right to top left + {"TR2L Trans", BOTH_T1_TR__L, Q_TR, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top right to left + {"TR2BL Trans", BOTH_T1_TR_BL, Q_TR, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin top right to bottom left + {"T2BR Trans", BOTH_T1_T__BR, Q_T, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc top to bottom right + {"T2R Trans", BOTH_T1_T___R, Q_T, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top to right + {"T2TR Trans", BOTH_T1_T__TR, Q_T, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc top to top right + {"T2TL Trans", BOTH_T1_T__TL, Q_T, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc top to top left + {"T2L Trans", BOTH_T1_T___L, Q_T, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top to left + {"T2BL Trans", BOTH_T1_T__BL, Q_T, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc top to bottom left + {"TL2BR Trans", BOTH_T1_TL_BR, Q_TL, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin top left to bottom right + {"TL2R Trans", BOTH_T1_TL__R, Q_TL, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top left to right (use: BOTH_T1__R_TL) + {"TL2TR Trans", BOTH_T1_TL_TR, Q_TL, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc top left to top right (use: BOTH_T1_TR_TL) + {"TL2T Trans", BOTH_T1_TL_T_, Q_TL, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc top left to top (use: BOTH_T1_T__TL) + {"TL2L Trans", BOTH_T1_TL__L, Q_TL, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top left to left (use: BOTH_T1__L_TL) + {"TL2BL Trans", BOTH_T1_TL_BL, Q_TL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc top left to bottom left + {"L2BR Trans", BOTH_T1__L_BR, Q_L, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin left to bottom right + {"L2R Trans", BOTH_T1__L__R, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast weak spin left to right + {"L2TR Trans", BOTH_T1__L_TR, Q_L, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc left to top right (use: BOTH_T1_TR__L) + {"L2T Trans", BOTH_T1__L_T_, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc left to top (use: BOTH_T1_T___L) + {"L2TL Trans", BOTH_T1__L_TL, Q_L, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc left to top left + {"L2BL Trans", BOTH_T1__L_BL, Q_L, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc left to bottom left (use: BOTH_T1_BL__L) + {"BL2BR Trans", BOTH_T1_BL_BR, Q_BL, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin bottom left to bottom right + {"BL2R Trans", BOTH_T1_BL__R, Q_BL, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast weak spin bottom left to right + {"BL2TR Trans", BOTH_T1_BL_TR, Q_BL, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast weak spin bottom left to top right + {"BL2T Trans", BOTH_T1_BL_T_, Q_BL, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc bottom left to top (use: BOTH_T1_T__BL) + {"BL2TL Trans", BOTH_T1_BL_TL, Q_BL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc bottom left to top left (use: BOTH_T1_TL_BL) + {"BL2L Trans", BOTH_T1_BL__L, Q_BL, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc bottom left to left + + //Bounces + {"Bounce BR", BOTH_B1_BR___, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_T1_BR_TR, 150 }, + {"Bounce R", BOTH_B1__R___, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_T1__R__L, 150 }, + {"Bounce TR", BOTH_B1_TR___, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_TR_TL, 150 }, + {"Bounce T", BOTH_B1_T____, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + {"Bounce TL", BOTH_B1_TL___, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_T1_TL_TR, 150 }, + {"Bounce L", BOTH_B1__L___, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_T1__L__R, 150 }, + {"Bounce BL", BOTH_B1_BL___, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_T1_BL_TR, 150 }, + + //Deflected attacks (like bounces, but slide off enemy saber, not straight back) + {"Deflect BR", BOTH_D1_BR___, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_T1_BR_TR, 150 }, + {"Deflect R", BOTH_D1__R___, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_T1__R__L, 150 }, + {"Deflect TR", BOTH_D1_TR___, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_TR_TL, 150 }, + {"Deflect T", BOTH_B1_T____, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + {"Deflect TL", BOTH_D1_TL___, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_T1_TL_TR, 150 }, + {"Deflect L", BOTH_D1__L___, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_T1__L__R, 150 }, + {"Deflect BL", BOTH_D1_BL___, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_T1_BL_TR, 150 }, + {"Deflect B", BOTH_D1_B____, Q_B, Q_B, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + + //Reflected attacks + {"Reflected BR",BOTH_V1_BR_S1, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_BR + {"Reflected R", BOTH_V1__R_S1, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1__R + {"Reflected TR",BOTH_V1_TR_S1, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_TR + {"Reflected T", BOTH_V1_T__S1, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_T_ + {"Reflected TL",BOTH_V1_TL_S1, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_TL + {"Reflected L", BOTH_V1__L_S1, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1__L + {"Reflected BL",BOTH_V1_BL_S1, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_BL + {"Reflected B", BOTH_V1_B__S1, Q_B, Q_B, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_B_ + + // Broken parries + {"BParry Top", BOTH_H1_S1_T_, Q_T, Q_B, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UP, + {"BParry UR", BOTH_H1_S1_TR, Q_TR, Q_BL, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UR, + {"BParry UL", BOTH_H1_S1_TL, Q_TL, Q_BR, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UL, + {"BParry LR", BOTH_H1_S1_BL, Q_BL, Q_TR, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LR, + {"BParry Bot", BOTH_H1_S1_B_, Q_B, Q_T, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LL + {"BParry LL", BOTH_H1_S1_BR, Q_BR, Q_TL, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LL + + // Knockaways + {"Knock Top", BOTH_K1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_T1_T__BR, 150 }, // LS_PARRY_UP, + {"Knock UR", BOTH_K1_S1_TR, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_T1_TR__R, 150 }, // LS_PARRY_UR, + {"Knock UL", BOTH_K1_S1_TL, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_T1_TL__L, 150 }, // LS_PARRY_UL, + {"Knock LR", BOTH_K1_S1_BL, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_T1_BL_TL, 150 }, // LS_PARRY_LR, + {"Knock LL", BOTH_K1_S1_BR, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_T1_BR_TR, 150 }, // LS_PARRY_LL + + // Parry + {"Parry Top", BOTH_P1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_T2B, 150 }, // LS_PARRY_UP, + {"Parry UR", BOTH_P1_S1_TR, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_TR2BL, 150 }, // LS_PARRY_UR, + {"Parry UL", BOTH_P1_S1_TL, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_A_TL2BR, 150 }, // LS_PARRY_UL, + {"Parry LR", BOTH_P1_S1_BL, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_A_BR2TL, 150 }, // LS_PARRY_LR, + {"Parry LL", BOTH_P1_S1_BR, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_A_BL2TR, 150 }, // LS_PARRY_LL + + // Reflecting a missile + {"Reflect Top", BOTH_P1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_T2B, 300 }, // LS_PARRY_UP, + {"Reflect UR", BOTH_P1_S1_TL, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_A_TL2BR, 300 }, // LS_PARRY_UR, + {"Reflect UL", BOTH_P1_S1_TR, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_TR2BL, 300 }, // LS_PARRY_UL, + {"Reflect LR", BOTH_P1_S1_BR, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_A_BL2TR, 300 }, // LS_PARRY_LR + {"Reflect LL", BOTH_P1_S1_BL, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_A_BR2TL, 300 }, // LS_PARRY_LL, +}; + + +saberMoveName_t transitionMove[Q_NUM_QUADS][Q_NUM_QUADS] = +{ + { + LS_NONE, //Can't transition to same pos! + LS_T1_BR__R,//40 + LS_T1_BR_TR, + LS_T1_BR_T_, + LS_T1_BR_TL, + LS_T1_BR__L, + LS_T1_BR_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1__R_BR,//46 + LS_NONE, //Can't transition to same pos! + LS_T1__R_TR, + LS_T1__R_T_, + LS_T1__R_TL, + LS_T1__R__L, + LS_T1__R_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_TR_BR,//52 + LS_T1_TR__R, + LS_NONE, //Can't transition to same pos! + LS_T1_TR_T_, + LS_T1_TR_TL, + LS_T1_TR__L, + LS_T1_TR_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_T__BR,//58 + LS_T1_T___R, + LS_T1_T__TR, + LS_NONE, //Can't transition to same pos! + LS_T1_T__TL, + LS_T1_T___L, + LS_T1_T__BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_TL_BR,//64 + LS_T1_TL__R, + LS_T1_TL_TR, + LS_T1_TL_T_, + LS_NONE, //Can't transition to same pos! + LS_T1_TL__L, + LS_T1_TL_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1__L_BR,//70 + LS_T1__L__R, + LS_T1__L_TR, + LS_T1__L_T_, + LS_T1__L_TL, + LS_NONE, //Can't transition to same pos! + LS_T1__L_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_BL_BR,//76 + LS_T1_BL__R, + LS_T1_BL_TR, + LS_T1_BL_T_, + LS_T1_BL_TL, + LS_T1_BL__L, + LS_NONE, //Can't transition to same pos! + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_BL_BR,//NOTE: there are no transitions from bottom, so re-use the bottom right transitions + LS_T1_BR__R, + LS_T1_BR_TR, + LS_T1_BR_T_, + LS_T1_BR_TL, + LS_T1_BR__L, + LS_T1_BR_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + } +}; + +void PM_VelocityForSaberMove( playerState_t *ps, vec3_t throwDir ) +{ + vec3_t vForward, vRight, vUp, startQ, endQ; + + AngleVectors( ps->viewangles, vForward, vRight, vUp ); + + switch ( saberMoveData[ps->saberMove].startQuad ) + { + case Q_BR: + VectorScale( vRight, 1, startQ ); + VectorMA( startQ, -1, vUp, startQ ); + break; + case Q_R: + VectorScale( vRight, 2, startQ ); + break; + case Q_TR: + VectorScale( vRight, 1, startQ ); + VectorMA( startQ, 1, vUp, startQ ); + break; + case Q_T: + VectorScale( vUp, 2, startQ ); + break; + case Q_TL: + VectorScale( vRight, -1, startQ ); + VectorMA( startQ, 1, vUp, startQ ); + break; + case Q_L: + VectorScale( vRight, -2, startQ ); + break; + case Q_BL: + VectorScale( vRight, -1, startQ ); + VectorMA( startQ, -1, vUp, startQ ); + break; + case Q_B: + VectorScale( vUp, -2, startQ ); + break; + } + switch ( saberMoveData[ps->saberMove].endQuad ) + { + case Q_BR: + VectorScale( vRight, 1, endQ ); + VectorMA( endQ, -1, vUp, endQ ); + break; + case Q_R: + VectorScale( vRight, 2, endQ ); + break; + case Q_TR: + VectorScale( vRight, 1, endQ ); + VectorMA( endQ, 1, vUp, endQ ); + break; + case Q_T: + VectorScale( vUp, 2, endQ ); + break; + case Q_TL: + VectorScale( vRight, -1, endQ ); + VectorMA( endQ, 1, vUp, endQ ); + break; + case Q_L: + VectorScale( vRight, -2, endQ ); + break; + case Q_BL: + VectorScale( vRight, -1, endQ ); + VectorMA( endQ, -1, vUp, endQ ); + break; + case Q_B: + VectorScale( vUp, -2, endQ ); + break; + } + VectorMA( endQ, 2, vForward, endQ ); + VectorScale( throwDir, 125, throwDir );//FIXME: pass in the throw strength? + VectorSubtract( endQ, startQ, throwDir ); +} + +qboolean PM_VelocityForBlockedMove( playerState_t *ps, vec3_t throwDir ) +{ + vec3_t vForward, vRight, vUp; + AngleVectors( ps->viewangles, vForward, vRight, vUp ); + switch ( ps->saberBlocked ) + { + case BLOCKED_UPPER_RIGHT: + VectorScale( vRight, 1, throwDir ); + VectorMA( throwDir, 1, vUp, throwDir ); + break; + case BLOCKED_UPPER_LEFT: + VectorScale( vRight, -1, throwDir ); + VectorMA( throwDir, 1, vUp, throwDir ); + break; + case BLOCKED_LOWER_RIGHT: + VectorScale( vRight, 1, throwDir ); + VectorMA( throwDir, -1, vUp, throwDir ); + break; + case BLOCKED_LOWER_LEFT: + VectorScale( vRight, -1, throwDir ); + VectorMA( throwDir, -1, vUp, throwDir ); + break; + case BLOCKED_TOP: + VectorScale( vUp, 2, throwDir ); + break; + default: + return qfalse; + break; + } + VectorMA( throwDir, 2, vForward, throwDir ); + VectorScale( throwDir, 250, throwDir );//FIXME: pass in the throw strength? + return qtrue; +} + +int PM_AnimLevelForSaberAnim( int anim ) +{ + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_D1_B____ ) + { + return FORCE_LEVEL_1; + } + if ( anim >= BOTH_A2_T__B_ && anim <= BOTH_D2_B____ ) + { + return FORCE_LEVEL_2; + } + if ( anim >= BOTH_A3_T__B_ && anim <= BOTH_D3_B____ ) + { + return FORCE_LEVEL_3; + } + if ( anim >= BOTH_A4_T__B_ && anim <= BOTH_D4_B____ ) + {//desann + return FORCE_LEVEL_4; + } + if ( anim >= BOTH_A5_T__B_ && anim <= BOTH_D5_B____ ) + {//tavion + return FORCE_LEVEL_5; + } + if ( anim >= BOTH_A6_T__B_ && anim <= BOTH_D6_B____ ) + {//dual + return SS_DUAL; + } + if ( anim >= BOTH_A7_T__B_ && anim <= BOTH_D7_B____ ) + {//staff + return SS_STAFF; + } + return FORCE_LEVEL_0; +} + +int PM_PowerLevelForSaberAnim( playerState_t *ps, int saberNum ) +{ + int anim = ps->torsoAnim; + int animTimeElapsed = PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)anim ) - ps->torsoAnimTimer; + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_D1_B____ ) + { + //FIXME: these two need their own style + if ( ps->saber[0].type == SABER_LANCE ) + { + return FORCE_LEVEL_4; + } + else if ( ps->saber[0].type == SABER_TRIDENT ) + { + return FORCE_LEVEL_3; + } + return FORCE_LEVEL_1; + } + if ( anim >= BOTH_A2_T__B_ && anim <= BOTH_D2_B____ ) + { + return FORCE_LEVEL_2; + } + if ( anim >= BOTH_A3_T__B_ && anim <= BOTH_D3_B____ ) + { + return FORCE_LEVEL_3; + } + if ( anim >= BOTH_A4_T__B_ && anim <= BOTH_D4_B____ ) + {//desann + return FORCE_LEVEL_4; + } + if ( anim >= BOTH_A5_T__B_ && anim <= BOTH_D5_B____ ) + {//tavion + return FORCE_LEVEL_2; + } + if ( anim >= BOTH_A6_T__B_ && anim <= BOTH_D6_B____ ) + {//dual + return FORCE_LEVEL_2; + } + if ( anim >= BOTH_A7_T__B_ && anim <= BOTH_D7_B____ ) + {//staff + return FORCE_LEVEL_2; + } + if ( ( anim >= BOTH_P1_S1_T_ && anim <= BOTH_P1_S1_BR ) + || ( anim >= BOTH_P6_S6_T_ && anim <= BOTH_P6_S6_BR ) + || ( anim >= BOTH_P7_S7_T_ && anim <= BOTH_P7_S7_BR ) ) + {//parries + switch ( ps->saberAnimLevel ) + { + case SS_STRONG: + case SS_DESANN: + return FORCE_LEVEL_3; + break; + case SS_TAVION: + case SS_STAFF: + case SS_DUAL: + case SS_MEDIUM: + return FORCE_LEVEL_2; + break; + case SS_FAST: + return FORCE_LEVEL_1; + break; + default: + return FORCE_LEVEL_0; + break; + } + } + if ( ( anim >= BOTH_K1_S1_T_ && anim <= BOTH_K1_S1_BR ) + || ( anim >= BOTH_K6_S6_T_ && anim <= BOTH_K6_S6_BR ) + || ( anim >= BOTH_K7_S7_T_ && anim <= BOTH_K7_S7_BR ) ) + {//knockaways + return FORCE_LEVEL_3; + } + if ( ( anim >= BOTH_V1_BR_S1 && anim <= BOTH_V1_B__S1 ) + || ( anim >= BOTH_V6_BR_S6 && anim <= BOTH_V6_B__S6 ) + || ( anim >= BOTH_V7_BR_S7 && anim <= BOTH_V7_B__S7 ) ) + {//knocked-away attacks + return FORCE_LEVEL_1; + } + if ( ( anim >= BOTH_H1_S1_T_ && anim <= BOTH_H1_S1_BR ) + || ( anim >= BOTH_H6_S6_T_ && anim <= BOTH_H6_S6_BR ) + || ( anim >= BOTH_H7_S7_T_ && anim <= BOTH_H7_S7_BR ) ) + {//broken parries + return FORCE_LEVEL_0; + } + switch ( anim ) + { + case BOTH_A2_STABBACK1: + if ( ps->torsoAnimTimer < 450 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 400 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_ATTACK_BACK: + if ( ps->torsoAnimTimer < 500 ) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_CROUCHATTACKBACK1: + if ( ps->torsoAnimTimer < 800 ) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + //FIXME: break up? + return FORCE_LEVEL_3; + break; + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + //FIXME: break up? + return FORCE_LEVEL_3; + break; + case BOTH_K1_S1_T_: //# knockaway saber top + case BOTH_K1_S1_TR: //# knockaway saber top right + case BOTH_K1_S1_TL: //# knockaway saber top left + case BOTH_K1_S1_BL: //# knockaway saber bottom left + case BOTH_K1_S1_B_: //# knockaway saber bottom + case BOTH_K1_S1_BR: //# knockaway saber bottom right + //FIXME: break up? + return FORCE_LEVEL_3; + break; + case BOTH_LUNGE2_B__T_: + if ( ps->torsoAnimTimer < 400 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 150 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_FORCELEAP2_T__B_: + if ( ps->torsoAnimTimer < 400 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 550 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + return FORCE_LEVEL_3;//??? + break; + case BOTH_JUMPFLIPSLASHDOWN1: + if ( ps->torsoAnimTimer <= 900 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 550 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_JUMPFLIPSTABDOWN: + if ( ps->torsoAnimTimer <= 1200 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed <= 250 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_JUMPATTACK6: + /* + if (pm->ps) + { + if ( ( pm->ps->legsAnimTimer >= 1450 + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 400 ) + ||(pm->ps->legsAnimTimer >= 400 + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 1100 ) ) + {//pretty much sideways + return FORCE_LEVEL_3; + } + } + */ + if ( ( ps->torsoAnimTimer >= 1450 + && animTimeElapsed >= 400 ) + ||(ps->torsoAnimTimer >= 400 + && animTimeElapsed >= 1100 ) ) + {//pretty much sideways + return FORCE_LEVEL_3; + } + return FORCE_LEVEL_0; + break; + case BOTH_JUMPATTACK7: + if ( ps->torsoAnimTimer <= 1200 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 200 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_SPINATTACK6: + if ( animTimeElapsed <= 200 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_SPINATTACK7: + if ( ps->torsoAnimTimer <= 500 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 500 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_FORCELONGLEAP_ATTACK: + if ( animTimeElapsed <= 200 ) + {//1st four frames of anim + return FORCE_LEVEL_3; + } + break; + /* + case BOTH_A7_KICK_F://these kicks attack, too + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + //FIXME: break up + return FORCE_LEVEL_3; + break; + */ + case BOTH_STABDOWN: + if ( ps->torsoAnimTimer <= 900 ) + {//end of anim + return FORCE_LEVEL_3; + } + break; + case BOTH_STABDOWN_STAFF: + if ( ps->torsoAnimTimer <= 850 ) + {//end of anim + return FORCE_LEVEL_3; + } + break; + case BOTH_STABDOWN_DUAL: + if ( ps->torsoAnimTimer <= 900 ) + {//end of anim + return FORCE_LEVEL_3; + } + break; + case BOTH_A6_SABERPROTECT: + if ( ps->torsoAnimTimer < 650 ) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A7_SOULCAL: + if ( ps->torsoAnimTimer < 650 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 600 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A1_SPECIAL: + if ( ps->torsoAnimTimer < 600 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 200 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A2_SPECIAL: + if ( ps->torsoAnimTimer < 300 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 200 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A3_SPECIAL: + if ( ps->torsoAnimTimer < 700 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 200 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_FLIP_ATTACK7: + return FORCE_LEVEL_3; + break; + case BOTH_PULL_IMPALE_STAB: + if ( ps->torsoAnimTimer < 1000 ) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_PULL_IMPALE_SWING: + if ( ps->torsoAnimTimer < 500 )//750 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 650 )//600 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_ALORA_SPIN_SLASH: + if ( ps->torsoAnimTimer < 900 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 250 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A6_FB: + if ( ps->torsoAnimTimer < 250 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 250 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A6_LR: + if ( ps->torsoAnimTimer < 250 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 250 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A7_HILT: + return FORCE_LEVEL_0; + break; +//===SABERLOCK SUPERBREAKS START=========================================================================== + case BOTH_LK_S_DL_T_SB_1_W: + if ( ps->torsoAnimTimer < 700 ) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_ST_S_SB_1_W: + if ( ps->torsoAnimTimer < 300 ) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + if ( ps->torsoAnimTimer < 700 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 400 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + if ( ps->torsoAnimTimer < 150 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 400 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_DL_T_SB_1_W: + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + if ( animTimeElapsed < 1000 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_ST_T_SB_1_W: + if ( ps->torsoAnimTimer < 950 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 650 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_S_S_SB_1_W: + if ( saberNum != 0 ) + {//only right hand saber does damage in this suberbreak + return FORCE_LEVEL_0; + } + if ( ps->torsoAnimTimer < 900 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 450 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_S_T_SB_1_W: + if ( saberNum != 0 ) + {//only right hand saber does damage in this suberbreak + return FORCE_LEVEL_0; + } + if ( ps->torsoAnimTimer < 250 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 150 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_DL_S_SB_1_W: + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_DL_T_SB_1_W: + //special suberbreak - doesn't kill, just kicks them backwards + return FORCE_LEVEL_0; + break; + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + if ( ps->torsoAnimTimer < 800 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 350 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + return FORCE_LEVEL_5; + break; +//===SABERLOCK SUPERBREAKS START=========================================================================== + case BOTH_HANG_ATTACK: + //FIME: break up + if ( ps->torsoAnimTimer < 1000 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 250 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + else + {//sweet spot + return FORCE_LEVEL_5; + } + break; + case BOTH_ROLL_STAB: + if ( animTimeElapsed > 400 ) + {//end of anim + return FORCE_LEVEL_0; + } + else + { + return FORCE_LEVEL_3; + } + break; + } + return FORCE_LEVEL_0; +} + +qboolean PM_InAnimForSaberMove( int anim, int saberMove ) +{ + switch ( anim ) + {//special case anims + case BOTH_A2_STABBACK1: + case BOTH_ATTACK_BACK: + case BOTH_CROUCHATTACKBACK1: + case BOTH_ROLL_STAB: + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + case BOTH_LUNGE2_B__T_: + case BOTH_FORCELEAP2_T__B_: + case BOTH_JUMPFLIPSLASHDOWN1://# + case BOTH_JUMPFLIPSTABDOWN://# + case BOTH_JUMPATTACK6: + case BOTH_JUMPATTACK7: + case BOTH_SPINATTACK6: + case BOTH_SPINATTACK7: + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + case BOTH_FORCELONGLEAP_ATTACK: + case BOTH_A7_KICK_F: + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + case BOTH_A7_KICK_S: + case BOTH_A7_KICK_BF: + case BOTH_A7_KICK_RL: + case BOTH_A7_KICK_F_AIR: + case BOTH_A7_KICK_B_AIR: + case BOTH_A7_KICK_R_AIR: + case BOTH_A7_KICK_L_AIR: + case BOTH_STABDOWN: + case BOTH_STABDOWN_STAFF: + case BOTH_STABDOWN_DUAL: + case BOTH_A6_SABERPROTECT: + case BOTH_A7_SOULCAL: + case BOTH_A1_SPECIAL: + case BOTH_A2_SPECIAL: + case BOTH_A3_SPECIAL: + case BOTH_FLIP_ATTACK7: + case BOTH_PULL_IMPALE_STAB: + case BOTH_PULL_IMPALE_SWING: + case BOTH_ALORA_SPIN_SLASH: + case BOTH_A6_FB: + case BOTH_A6_LR: + case BOTH_A7_HILT: + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_DL_T_SB_1_W: + case BOTH_LK_S_ST_S_SB_1_W: + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_DL_T_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + case BOTH_LK_DL_ST_T_SB_1_W: + case BOTH_LK_DL_S_S_SB_1_W: + case BOTH_LK_DL_S_T_SB_1_W: + case BOTH_LK_ST_DL_S_SB_1_W: + case BOTH_LK_ST_DL_T_SB_1_W: + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + case BOTH_HANG_ATTACK: + return qtrue; + } + if ( PM_SaberDrawPutawayAnim( anim ) ) + { + if ( saberMove == LS_DRAW || saberMove == LS_PUTAWAY ) + { + return qtrue; + } + return qfalse; + } + else if ( PM_SaberStanceAnim( anim ) ) + { + if ( saberMove == LS_READY ) + { + return qtrue; + } + return qfalse; + } + int animLevel = PM_AnimLevelForSaberAnim( anim ); + if ( animLevel <= 0 ) + {//NOTE: this will always return false for the ready poses and putaway/draw... + return qfalse; + } + //drop the anim to the first level and start the checks there + anim -= (animLevel-FORCE_LEVEL_1)*SABER_ANIM_GROUP_SIZE; + //check level 1 + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + //check level 2 + anim += SABER_ANIM_GROUP_SIZE; + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + //check level 3 + anim += SABER_ANIM_GROUP_SIZE; + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + //check level 4 + anim += SABER_ANIM_GROUP_SIZE; + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + //check level 5 + anim += SABER_ANIM_GROUP_SIZE; + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + if ( anim >= BOTH_P1_S1_T_ && anim <= BOTH_H1_S1_BR ) + {//parries, knockaways and broken parries + return (anim==saberMoveData[saberMove].animToUse); + } + return qfalse; +} + +qboolean PM_SaberInIdle( int move ) +{ + switch ( move ) + { + case LS_NONE: + case LS_READY: + case LS_DRAW: + case LS_PUTAWAY: + return qtrue; + break; + } + return qfalse; +} +qboolean PM_SaberInSpecialAttack( int anim ) +{ + switch ( anim ) + { + case BOTH_A2_STABBACK1: + case BOTH_ATTACK_BACK: + case BOTH_CROUCHATTACKBACK1: + case BOTH_ROLL_STAB: + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + case BOTH_LUNGE2_B__T_: + case BOTH_FORCELEAP2_T__B_: + case BOTH_JUMPFLIPSLASHDOWN1://# + case BOTH_JUMPFLIPSTABDOWN://# + case BOTH_JUMPATTACK6: + case BOTH_JUMPATTACK7: + case BOTH_SPINATTACK6: + case BOTH_SPINATTACK7: + case BOTH_FORCELONGLEAP_ATTACK: + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + case BOTH_A7_KICK_F: + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + case BOTH_A7_KICK_S: + case BOTH_A7_KICK_BF: + case BOTH_A7_KICK_RL: + case BOTH_A7_KICK_F_AIR: + case BOTH_A7_KICK_B_AIR: + case BOTH_A7_KICK_R_AIR: + case BOTH_A7_KICK_L_AIR: + case BOTH_STABDOWN: + case BOTH_STABDOWN_STAFF: + case BOTH_STABDOWN_DUAL: + case BOTH_A6_SABERPROTECT: + case BOTH_A7_SOULCAL: + case BOTH_A1_SPECIAL: + case BOTH_A2_SPECIAL: + case BOTH_A3_SPECIAL: + case BOTH_FLIP_ATTACK7: + case BOTH_PULL_IMPALE_STAB: + case BOTH_PULL_IMPALE_SWING: + case BOTH_ALORA_SPIN_SLASH: + case BOTH_A6_FB: + case BOTH_A6_LR: + case BOTH_A7_HILT: + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_DL_T_SB_1_W: + case BOTH_LK_S_ST_S_SB_1_W: + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_DL_T_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + case BOTH_LK_DL_ST_T_SB_1_W: + case BOTH_LK_DL_S_S_SB_1_W: + case BOTH_LK_DL_S_T_SB_1_W: + case BOTH_LK_ST_DL_S_SB_1_W: + case BOTH_LK_ST_DL_T_SB_1_W: + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + case BOTH_HANG_ATTACK: + return qtrue; + } + return qfalse; +} + +qboolean PM_SaberInAttackPure( int move ) +{ + if ( move >= LS_A_TL2BR && move <= LS_A_T2B ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInAttack( int move ) +{ + if ( move >= LS_A_TL2BR && move <= LS_A_T2B ) + { + return qtrue; + } + switch ( move ) + { + case LS_A_BACK: + case LS_A_BACK_CR: + case LS_A_BACKSTAB: + case LS_ROLL_STAB: + case LS_A_LUNGE: + case LS_A_JUMP_T__B_: + case LS_A_FLIP_STAB: + case LS_A_FLIP_SLASH: + case LS_JUMPATTACK_DUAL: + case LS_JUMPATTACK_ARIAL_LEFT: + case LS_JUMPATTACK_ARIAL_RIGHT: + case LS_JUMPATTACK_CART_LEFT: + case LS_JUMPATTACK_CART_RIGHT: + case LS_JUMPATTACK_STAFF_LEFT: + case LS_JUMPATTACK_STAFF_RIGHT: + case LS_BUTTERFLY_LEFT: + case LS_BUTTERFLY_RIGHT: + case LS_A_BACKFLIP_ATK: + case LS_SPINATTACK_DUAL: + case LS_SPINATTACK: + case LS_LEAP_ATTACK: + case LS_SWOOP_ATTACK_RIGHT: + case LS_SWOOP_ATTACK_LEFT: + case LS_TAUNTAUN_ATTACK_RIGHT: + case LS_TAUNTAUN_ATTACK_LEFT: + case LS_KICK_F: + case LS_KICK_B: + case LS_KICK_R: + case LS_KICK_L: + case LS_KICK_S: + case LS_KICK_BF: + case LS_KICK_RL: + case LS_KICK_F_AIR: + case LS_KICK_B_AIR: + case LS_KICK_R_AIR: + case LS_KICK_L_AIR: + case LS_STABDOWN: + case LS_STABDOWN_STAFF: + case LS_STABDOWN_DUAL: + case LS_DUAL_SPIN_PROTECT: + case LS_STAFF_SOULCAL: + case LS_A1_SPECIAL: + case LS_A2_SPECIAL: + case LS_A3_SPECIAL: + case LS_UPSIDE_DOWN_ATTACK: + case LS_PULL_ATTACK_STAB: + case LS_PULL_ATTACK_SWING: + case LS_SPINATTACK_ALORA: + case LS_DUAL_FB: + case LS_DUAL_LR: + case LS_HILT_BASH: + return qtrue; + break; + } + return qfalse; +} +qboolean PM_SaberInTransition( int move ) +{ + if ( move >= LS_T1_BR__R && move <= LS_T1_BL__L ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInStart( int move ) +{ + if ( move >= LS_S_TL2BR && move <= LS_S_T2B ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInReturn( int move ) +{ + if ( move >= LS_R_TL2BR && move <= LS_R_T2B ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInTransitionAny( int move ) +{ + if ( PM_SaberInStart( move ) ) + { + return qtrue; + } + else if ( PM_SaberInTransition( move ) ) + { + return qtrue; + } + else if ( PM_SaberInReturn( move ) ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInBounce( int move ) +{ + if ( move >= LS_B1_BR && move <= LS_B1_BL ) + { + return qtrue; + } + if ( move >= LS_D1_BR && move <= LS_D1_BL ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInBrokenParry( int move ) +{ + if ( move >= LS_V1_BR && move <= LS_V1_B_ ) + { + return qtrue; + } + if ( move >= LS_H1_T_ && move <= LS_H1_BL ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInDeflect( int move ) +{ + if ( move >= LS_D1_BR && move <= LS_D1_B_ ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInParry( int move ) +{ + if ( move >= LS_PARRY_UP && move <= LS_PARRY_LL ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInKnockaway( int move ) +{ + if ( move >= LS_K1_T_ && move <= LS_K1_BL ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInReflect( int move ) +{ + if ( move >= LS_REFLECT_UP && move <= LS_REFLECT_LL ) + { + return qtrue; + } + return qfalse; +} + +qboolean PM_SaberInSpecial( int move ) +{ + switch( move ) + { + case LS_A_BACK: + case LS_A_BACK_CR: + case LS_A_BACKSTAB: + case LS_ROLL_STAB: + case LS_A_LUNGE: + case LS_A_JUMP_T__B_: + case LS_A_FLIP_STAB: + case LS_A_FLIP_SLASH: + case LS_JUMPATTACK_DUAL: + case LS_JUMPATTACK_ARIAL_LEFT: + case LS_JUMPATTACK_ARIAL_RIGHT: + case LS_JUMPATTACK_CART_LEFT: + case LS_JUMPATTACK_CART_RIGHT: + case LS_JUMPATTACK_STAFF_LEFT: + case LS_JUMPATTACK_STAFF_RIGHT: + case LS_BUTTERFLY_LEFT: + case LS_BUTTERFLY_RIGHT: + case LS_A_BACKFLIP_ATK: + case LS_SPINATTACK_DUAL: + case LS_SPINATTACK: + case LS_LEAP_ATTACK: + case LS_SWOOP_ATTACK_RIGHT: + case LS_SWOOP_ATTACK_LEFT: + case LS_TAUNTAUN_ATTACK_RIGHT: + case LS_TAUNTAUN_ATTACK_LEFT: + case LS_KICK_F: + case LS_KICK_B: + case LS_KICK_R: + case LS_KICK_L: + case LS_KICK_S: + case LS_KICK_BF: + case LS_KICK_RL: + case LS_KICK_F_AIR: + case LS_KICK_B_AIR: + case LS_KICK_R_AIR: + case LS_KICK_L_AIR: + case LS_STABDOWN: + case LS_STABDOWN_STAFF: + case LS_STABDOWN_DUAL: + case LS_DUAL_SPIN_PROTECT: + case LS_STAFF_SOULCAL: + case LS_A1_SPECIAL: + case LS_A2_SPECIAL: + case LS_A3_SPECIAL: + case LS_UPSIDE_DOWN_ATTACK: + case LS_PULL_ATTACK_STAB: + case LS_PULL_ATTACK_SWING: + case LS_SPINATTACK_ALORA: + case LS_DUAL_FB: + case LS_DUAL_LR: + case LS_HILT_BASH: + return qtrue; + } + return qfalse; +} + +qboolean PM_KickMove( int move ) +{ + switch( move ) + { + case LS_KICK_F: + case LS_KICK_B: + case LS_KICK_R: + case LS_KICK_L: + case LS_KICK_S: + case LS_KICK_BF: + case LS_KICK_RL: + case LS_HILT_BASH: + case LS_KICK_F_AIR: + case LS_KICK_B_AIR: + case LS_KICK_R_AIR: + case LS_KICK_L_AIR: + return qtrue; + } + return qfalse; +} + +qboolean PM_SaberCanInterruptMove( int move, int anim ) +{ + if ( PM_InAnimForSaberMove( anim, move ) ) + { + switch( move ) + { + case LS_A_BACK: + case LS_A_BACK_CR: + case LS_A_BACKSTAB: + case LS_ROLL_STAB: + case LS_A_LUNGE: + case LS_A_JUMP_T__B_: + case LS_A_FLIP_STAB: + case LS_A_FLIP_SLASH: + case LS_JUMPATTACK_DUAL: + case LS_JUMPATTACK_CART_LEFT: + case LS_JUMPATTACK_CART_RIGHT: + case LS_JUMPATTACK_STAFF_LEFT: + case LS_JUMPATTACK_STAFF_RIGHT: + case LS_BUTTERFLY_LEFT: + case LS_BUTTERFLY_RIGHT: + case LS_A_BACKFLIP_ATK: + case LS_SPINATTACK_DUAL: + case LS_SPINATTACK: + case LS_LEAP_ATTACK: + case LS_SWOOP_ATTACK_RIGHT: + case LS_SWOOP_ATTACK_LEFT: + case LS_TAUNTAUN_ATTACK_RIGHT: + case LS_TAUNTAUN_ATTACK_LEFT: + case LS_KICK_S: + case LS_KICK_BF: + case LS_KICK_RL: + case LS_STABDOWN: + case LS_STABDOWN_STAFF: + case LS_STABDOWN_DUAL: + case LS_DUAL_SPIN_PROTECT: + case LS_STAFF_SOULCAL: + case LS_A1_SPECIAL: + case LS_A2_SPECIAL: + case LS_A3_SPECIAL: + case LS_UPSIDE_DOWN_ATTACK: + case LS_PULL_ATTACK_STAB: + case LS_PULL_ATTACK_SWING: + case LS_SPINATTACK_ALORA: + case LS_DUAL_FB: + case LS_DUAL_LR: + case LS_HILT_BASH: + return qfalse; + } + + if ( PM_SaberInAttackPure( move ) ) + { + return qfalse; + } + if ( PM_SaberInStart( move ) ) + { + return qfalse; + } + if ( PM_SaberInTransition( move ) ) + { + return qfalse; + } + if ( PM_SaberInBounce( move ) ) + { + return qfalse; + } + if ( PM_SaberInBrokenParry( move ) ) + { + return qfalse; + } + if ( PM_SaberInDeflect( move ) ) + { + return qfalse; + } + if ( PM_SaberInParry( move ) ) + { + return qfalse; + } + if ( PM_SaberInKnockaway( move ) ) + { + return qfalse; + } + if ( PM_SaberInReflect( move ) ) + { + return qfalse; + } + } + switch ( anim ) + { + case BOTH_A2_STABBACK1: + case BOTH_ATTACK_BACK: + case BOTH_CROUCHATTACKBACK1: + case BOTH_ROLL_STAB: + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + case BOTH_LUNGE2_B__T_: + case BOTH_FORCELEAP2_T__B_: + case BOTH_JUMPFLIPSLASHDOWN1://# + case BOTH_JUMPFLIPSTABDOWN://# + case BOTH_JUMPATTACK6: + case BOTH_JUMPATTACK7: + case BOTH_SPINATTACK6: + case BOTH_SPINATTACK7: + case BOTH_FORCELONGLEAP_ATTACK: + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + case BOTH_A7_KICK_S: + case BOTH_A7_KICK_BF: + case BOTH_A7_KICK_RL: + case BOTH_STABDOWN: + case BOTH_STABDOWN_STAFF: + case BOTH_STABDOWN_DUAL: + case BOTH_A6_SABERPROTECT: + case BOTH_A7_SOULCAL: + case BOTH_A1_SPECIAL: + case BOTH_A2_SPECIAL: + case BOTH_A3_SPECIAL: + case BOTH_FLIP_ATTACK7: + case BOTH_PULL_IMPALE_STAB: + case BOTH_PULL_IMPALE_SWING: + case BOTH_ALORA_SPIN_SLASH: + case BOTH_A6_FB: + case BOTH_A6_LR: + case BOTH_A7_HILT: + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_DL_T_SB_1_W: + case BOTH_LK_S_ST_S_SB_1_W: + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_DL_T_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + case BOTH_LK_DL_ST_T_SB_1_W: + case BOTH_LK_DL_S_S_SB_1_W: + case BOTH_LK_DL_S_T_SB_1_W: + case BOTH_LK_ST_DL_S_SB_1_W: + case BOTH_LK_ST_DL_T_SB_1_W: + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + case BOTH_HANG_ATTACK: + return qfalse; + } + return qtrue; +} + +saberMoveName_t PM_BrokenParryForAttack( int move ) +{ + //Our attack was knocked away by a knockaway parry + //FIXME: need actual anims for this + //FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center + switch ( saberMoveData[move].startQuad ) + { + case Q_B: + return LS_V1_B_; + break; + case Q_BR: + return LS_V1_BR; + break; + case Q_R: + return LS_V1__R; + break; + case Q_TR: + return LS_V1_TR; + break; + case Q_T: + return LS_V1_T_; + break; + case Q_TL: + return LS_V1_TL; + break; + case Q_L: + return LS_V1__L; + break; + case Q_BL: + return LS_V1_BL; + break; + } + return LS_NONE; +} + +saberMoveName_t PM_BrokenParryForParry( int move ) +{ + //FIXME: need actual anims for this + //FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center + switch ( move ) + { + case LS_PARRY_UP: + //Hmm... since we don't know what dir the hit came from, randomly pick knock down or knock back + if ( Q_irand( 0, 1 ) ) + { + return LS_H1_B_; + } + else + { + return LS_H1_T_; + } + break; + case LS_PARRY_UR: + return LS_H1_TR; + break; + case LS_PARRY_UL: + return LS_H1_TL; + break; + case LS_PARRY_LR: + return LS_H1_BR; + break; + case LS_PARRY_LL: + return LS_H1_BL; + break; + case LS_READY: + return LS_H1_B_;//??? + break; + } + return LS_NONE; +} + +saberMoveName_t PM_KnockawayForParry( int move ) +{ + //FIXME: need actual anims for this + //FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center + switch ( move ) + { + case BLOCKED_TOP://LS_PARRY_UP: + return LS_K1_T_;//push up + break; + case BLOCKED_UPPER_RIGHT://LS_PARRY_UR: + default://case LS_READY: + return LS_K1_TR;//push up, slightly to right + break; + case BLOCKED_UPPER_LEFT://LS_PARRY_UL: + return LS_K1_TL;//push up and to left + break; + case BLOCKED_LOWER_RIGHT://LS_PARRY_LR: + return LS_K1_BR;//push down and to left + break; + case BLOCKED_LOWER_LEFT://LS_PARRY_LL: + return LS_K1_BL;//push down and to right + break; + } + //return LS_NONE; +} + +saberMoveName_t PM_SaberBounceForAttack( int move ) +{ + switch ( saberMoveData[move].startQuad ) + { + case Q_B: + case Q_BR: + return LS_B1_BR; + break; + case Q_R: + return LS_B1__R; + break; + case Q_TR: + return LS_B1_TR; + break; + case Q_T: + return LS_B1_T_; + break; + case Q_TL: + return LS_B1_TL; + break; + case Q_L: + return LS_B1__L; + break; + case Q_BL: + return LS_B1_BL; + break; + } + return LS_NONE; +} + +saberMoveName_t PM_AttackMoveForQuad( int quad ) +{ + switch ( quad ) + { + case Q_B: + case Q_BR: + return LS_A_BR2TL; + break; + case Q_R: + return LS_A_R2L; + break; + case Q_TR: + return LS_A_TR2BL; + break; + case Q_T: + return LS_A_T2B; + break; + case Q_TL: + return LS_A_TL2BR; + break; + case Q_L: + return LS_A_L2R; + break; + case Q_BL: + return LS_A_BL2TR; + break; + } + return LS_NONE; +} + +int saberMoveTransitionAngle[Q_NUM_QUADS][Q_NUM_QUADS] = +{ + { + 0,//Q_BR,Q_BR, + 45,//Q_BR,Q_R, + 90,//Q_BR,Q_TR, + 135,//Q_BR,Q_T, + 180,//Q_BR,Q_TL, + 215,//Q_BR,Q_L, + 270,//Q_BR,Q_BL, + 45,//Q_BR,Q_B, + }, + { + 45,//Q_R,Q_BR, + 0,//Q_R,Q_R, + 45,//Q_R,Q_TR, + 90,//Q_R,Q_T, + 135,//Q_R,Q_TL, + 180,//Q_R,Q_L, + 215,//Q_R,Q_BL, + 90,//Q_R,Q_B, + }, + { + 90,//Q_TR,Q_BR, + 45,//Q_TR,Q_R, + 0,//Q_TR,Q_TR, + 45,//Q_TR,Q_T, + 90,//Q_TR,Q_TL, + 135,//Q_TR,Q_L, + 180,//Q_TR,Q_BL, + 135,//Q_TR,Q_B, + }, + { + 135,//Q_T,Q_BR, + 90,//Q_T,Q_R, + 45,//Q_T,Q_TR, + 0,//Q_T,Q_T, + 45,//Q_T,Q_TL, + 90,//Q_T,Q_L, + 135,//Q_T,Q_BL, + 180,//Q_T,Q_B, + }, + { + 180,//Q_TL,Q_BR, + 135,//Q_TL,Q_R, + 90,//Q_TL,Q_TR, + 45,//Q_TL,Q_T, + 0,//Q_TL,Q_TL, + 45,//Q_TL,Q_L, + 90,//Q_TL,Q_BL, + 135,//Q_TL,Q_B, + }, + { + 215,//Q_L,Q_BR, + 180,//Q_L,Q_R, + 135,//Q_L,Q_TR, + 90,//Q_L,Q_T, + 45,//Q_L,Q_TL, + 0,//Q_L,Q_L, + 45,//Q_L,Q_BL, + 90,//Q_L,Q_B, + }, + { + 270,//Q_BL,Q_BR, + 215,//Q_BL,Q_R, + 180,//Q_BL,Q_TR, + 135,//Q_BL,Q_T, + 90,//Q_BL,Q_TL, + 45,//Q_BL,Q_L, + 0,//Q_BL,Q_BL, + 45,//Q_BL,Q_B, + }, + { + 45,//Q_B,Q_BR, + 90,//Q_B,Q_R, + 135,//Q_B,Q_TR, + 180,//Q_B,Q_T, + 135,//Q_B,Q_TL, + 90,//Q_B,Q_L, + 45,//Q_B,Q_BL, + 0//Q_B,Q_B, + } +}; + +int PM_SaberAttackChainAngle( int move1, int move2 ) +{ + if ( move1 == -1 || move2 == -1 ) + { + return -1; + } + return saberMoveTransitionAngle[saberMoveData[move1].endQuad][saberMoveData[move2].startQuad]; +} + +qboolean PM_SaberKataDone( int curmove = LS_NONE, int newmove = LS_NONE ) +{ + if ( pm->ps->forceRageRecoveryTime > level.time ) + {//rage recovery, only 1 swing at a time (tired) + if ( pm->ps->saberAttackChainCount > 0 ) + {//swung once + return qtrue; + } + else + {//allow one attack + return qfalse; + } + } + else if ( (pm->ps->forcePowersActive&(1<ps->saber[0].maxChain == -1 ) + { + return qfalse; + } + else if ( pm->ps->saber[0].maxChain != 0 ) + { + if ( pm->ps->saberAttackChainCount >= pm->ps->saber[0].maxChain ) + { + return qtrue; + } + else + { + return qfalse; + } + } + + if ( pm->ps->saberAnimLevel == SS_DESANN || pm->ps->saberAnimLevel == SS_TAVION ) + {//desann and tavion can link up as many attacks as they want + return qfalse; + } + //FIXME: instead of random, apply some sort of logical conditions to whether or + // not you can chain? Like if you were completely missed, you can't chain as much, or...? + // And/Or based on FP_SABER_OFFENSE level? So number of attacks you can chain + // increases with your FP_SABER_OFFENSE skill? + if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + //TEMP: for now, let staff attacks infinitely chain + return qfalse; + /* + if ( pm->ps->saberAttackChainCount > Q_irand( 3, 4 ) ) + { + return qtrue; + } + else if ( pm->ps->saberAttackChainCount > 0 ) + { + int chainAngle = PM_SaberAttackChainAngle( curmove, newmove ); + if ( chainAngle < 135 || chainAngle > 215 ) + {//if trying to chain to a move that doesn't continue the momentum + if ( pm->ps->saberAttackChainCount > 1 ) + { + return qtrue; + } + } + else if ( chainAngle == 180 ) + {//continues the momentum perfectly, allow it to chain 66% of the time + if ( pm->ps->saberAttackChainCount > 2 ) + { + return qtrue; + } + } + else + {//would continue the movement somewhat, 50% chance of continuing + if ( pm->ps->saberAttackChainCount > 3 ) + { + return qtrue; + } + } + } + */ + } + else if ( pm->ps->saberAnimLevel == SS_DUAL ) + { + //TEMP: for now, let staff attacks infinitely chain + return qfalse; + } + else if ( pm->ps->saberAnimLevel == FORCE_LEVEL_3 ) + { + if ( curmove == LS_NONE || newmove == LS_NONE ) + { + if ( pm->ps->saberAnimLevel >= FORCE_LEVEL_3 && pm->ps->saberAttackChainCount > Q_irand( 0, 1 ) ) + { + return qtrue; + } + } + else if ( pm->ps->saberAttackChainCount > Q_irand( 2, 3 ) ) + { + return qtrue; + } + else if ( pm->ps->saberAttackChainCount > 0 ) + { + int chainAngle = PM_SaberAttackChainAngle( curmove, newmove ); + if ( chainAngle < 135 || chainAngle > 215 ) + {//if trying to chain to a move that doesn't continue the momentum + return qtrue; + } + else if ( chainAngle == 180 ) + {//continues the momentum perfectly, allow it to chain 66% of the time + if ( pm->ps->saberAttackChainCount > 1 ) + { + return qtrue; + } + } + else + {//would continue the movement somewhat, 50% chance of continuing + if ( pm->ps->saberAttackChainCount > 2 ) + { + return qtrue; + } + } + } + } + else + {//FIXME: have chainAngle influence fast and medium chains as well? + if ( (pm->ps->saberAnimLevel == FORCE_LEVEL_2 || pm->ps->saberAnimLevel == SS_DUAL) + && pm->ps->saberAttackChainCount > Q_irand( 2, 5 ) ) + { + return qtrue; + } + } + return qfalse; +} + +qboolean PM_CheckEnemyInBack( float backCheckDist ) +{ + if ( !pm->gent || !pm->gent->client ) + { + return qfalse; + } + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) + && !g_saberAutoAim->integer && pm->cmd.forwardmove >= 0 ) + {//don't auto-backstab + return qfalse; + } + if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) + {//only when on ground + return qfalse; + } + trace_t trace; + vec3_t end, fwd, fwdAngles = {0,pm->ps->viewangles[YAW],0}; + + AngleVectors( fwdAngles, fwd, NULL, NULL ); + VectorMA( pm->ps->origin, -backCheckDist, fwd, end ); + + pm->trace( &trace, pm->ps->origin, vec3_origin, vec3_origin, end, pm->ps->clientNum, CONTENTS_SOLID|CONTENTS_BODY, (EG2_Collision)0, 0 ); + if ( trace.fraction < 1.0f && trace.entityNum < ENTITYNUM_WORLD ) + { + gentity_t *traceEnt = &g_entities[trace.entityNum]; + if ( traceEnt + && traceEnt->health > 0 + && traceEnt->client + && traceEnt->client->playerTeam == pm->gent->client->enemyTeam + && traceEnt->client->ps.groundEntityNum != ENTITYNUM_NONE ) + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + {//player + if ( pm->gent ) + {//set player enemy to traceEnt so he auto-aims at him + pm->gent->enemy = traceEnt; + } + } + return qtrue; + } + } + return qfalse; +} + +saberMoveName_t PM_PickBackStab( void ) +{ + if ( !pm->gent || !pm->gent->client ) + { + return LS_READY; + } + if ( pm->ps->dualSabers + && pm->ps->saber[1].Active() ) + { + if ( pm->ps->pm_flags & PMF_DUCKED ) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } + if ( pm->gent->client->ps.saberAnimLevel == SS_TAVION ) + { + return LS_A_BACKSTAB; + } + else if ( pm->gent->client->ps.saberAnimLevel == SS_DESANN ) + { + if ( pm->ps->saberMove == LS_READY || !Q_irand( 0, 3 ) ) + { + return LS_A_BACKSTAB; + } + else if ( pm->ps->pm_flags & PMF_DUCKED ) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } + else if ( pm->ps->saberAnimLevel == FORCE_LEVEL_2 + || pm->ps->saberAnimLevel == SS_DUAL ) + {//using medium attacks or dual sabers + if ( pm->ps->pm_flags & PMF_DUCKED ) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } + else + { + return LS_A_BACKSTAB; + } +} + +saberMoveName_t PM_CheckStabDown( void ) +{ + if ( !pm->gent || !pm->gent->enemy || !pm->gent->enemy->client ) + { + return LS_NONE; + } + if ( (pm->ps->saber[0].saberFlags&SFL_NO_STABDOWN) ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers + && (pm->ps->saber[1].saberFlags&SFL_NO_STABDOWN) ) + { + return LS_NONE; + } + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingKataAttack( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//want to try a special + return LS_NONE; + } + } + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + {//player + if ( pm->ps->groundEntityNum == ENTITYNUM_NONE )//in air + {//sorry must be on ground (or have just jumped) + if ( level.time-pm->ps->lastOnGround <= 50 && (pm->ps->pm_flags&PMF_JUMPING) ) + {//just jumped, it's okay + } + else + { + return LS_NONE; + } + } + /* + if ( pm->cmd.upmove > 0 ) + {//trying to jump + } + else if ( pm->ps->groundEntityNum == ENTITYNUM_NONE //in air + && level.time-pm->ps->lastOnGround <= 250 //just left ground + && (pm->ps->pm_flags&PMF_JUMPING) )//jumped + {//just jumped + } + else + { + return LS_NONE; + } + */ + pm->ps->velocity[2] = 0; + pm->cmd.upmove = 0; + } + else if ( (pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) ) + {//NPC + if ( pm->ps->groundEntityNum == ENTITYNUM_NONE )//in air + {//sorry must be on ground (or have just jumped) + if ( level.time-pm->ps->lastOnGround <= 250 && (pm->ps->pm_flags&PMF_JUMPING) ) + {//just jumped, it's okay + } + else + { + return LS_NONE; + } + } + if ( !pm->gent->NPC ) + {//wtf??? + return LS_NONE; + } + if ( Q_irand( 0, RANK_CAPTAIN ) > pm->gent->NPC->rank ) + {//lower ranks do this less often + return LS_NONE; + } + } + vec3_t enemyDir, faceFwd, facingAngles = {0, pm->ps->viewangles[YAW], 0}; + AngleVectors( facingAngles, faceFwd, NULL, NULL ); + VectorSubtract( pm->gent->enemy->currentOrigin, pm->ps->origin, enemyDir ); + float enemyZDiff = enemyDir[2]; + enemyDir[2] = 0; + float enemyHDist = VectorNormalize( enemyDir )-(pm->gent->maxs[0]+pm->gent->enemy->maxs[0]); + float dot = DotProduct( enemyDir, faceFwd ); + + if ( //(pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + dot > 0.65f + //&& enemyHDist >= 32 //was 48 + && enemyHDist <= 164//was 112 + && PM_InKnockDownOnGround( &pm->gent->enemy->client->ps )//still on ground + && !PM_InGetUpNoRoll( &pm->gent->enemy->client->ps )//not getting up yet + && enemyZDiff <= 20 ) + {//guy is on the ground below me, do a top-down attack + if ( pm->gent->enemy->s.number >= MAX_CLIENTS + || !G_ControlledByPlayer( pm->gent->enemy ) ) + {//don't get up while I'm doing this + //stop them from trying to get up for at least another 3 seconds + TIMER_Set( pm->gent->enemy, "noGetUpStraight", 3000 ); + } + //pick the right anim + if ( pm->ps->saberAnimLevel == SS_DUAL + || (pm->ps->dualSabers&&pm->ps->saber[1].Active()) ) + { + return LS_STABDOWN_DUAL; + } + else if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + return LS_STABDOWN_STAFF; + } + else + { + return LS_STABDOWN; + } + } + return LS_NONE; +} + +extern saberMoveName_t PM_NPCSaberAttackFromQuad( int quad ); +saberMoveName_t PM_SaberFlipOverAttackMove( void ); +saberMoveName_t PM_AttackForEnemyPos( qboolean allowFB, qboolean allowStabDown ) +{ + saberMoveName_t autoMove = LS_INVALID; + + if( !pm->gent->enemy ) + { + return LS_NONE; + } + + vec3_t enemy_org, enemyDir, faceFwd, faceRight, faceUp, facingAngles = {0, pm->ps->viewangles[YAW], 0}; + AngleVectors( facingAngles, faceFwd, faceRight, faceUp ); + //FIXME: predict enemy position? + if ( pm->gent->enemy->client ) + { + //VectorCopy( pm->gent->enemy->currentOrigin, enemy_org ); + //HMM... using this will adjust for bbox size, so let's do that... + vec3_t size; + VectorSubtract( pm->gent->enemy->absmax, pm->gent->enemy->absmin, size ); + VectorMA( pm->gent->enemy->absmin, 0.5, size, enemy_org ); + + VectorSubtract( pm->gent->enemy->client->renderInfo.eyePoint, pm->ps->origin, enemyDir ); + } + else + { + if ( pm->gent->enemy->bmodel && VectorCompare( vec3_origin, pm->gent->enemy->currentOrigin ) ) + {//a brush model without an origin brush + vec3_t size; + VectorSubtract( pm->gent->enemy->absmax, pm->gent->enemy->absmin, size ); + VectorMA( pm->gent->enemy->absmin, 0.5, size, enemy_org ); + } + else + { + VectorCopy( pm->gent->enemy->currentOrigin, enemy_org ); + } + VectorSubtract( enemy_org, pm->ps->origin, enemyDir ); + } + float enemyZDiff = enemyDir[2]; + float enemyDist = VectorNormalize( enemyDir ); + float dot = DotProduct( enemyDir, faceFwd ); + if ( dot > 0 ) + {//enemy is in front + if ( allowStabDown ) + {//okay to try this + saberMoveName_t stabDownMove = PM_CheckStabDown(); + if ( stabDownMove != LS_NONE ) + { + return stabDownMove; + } + } + if ( (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + && dot > 0.65f + && enemyDist <= 64 && pm->gent->enemy->client + && (enemyZDiff <= 20 || PM_InKnockDownOnGround( &pm->gent->enemy->client->ps ) || PM_CrouchAnim( pm->gent->enemy->client->ps.legsAnim ) ) ) + {//swing down at them + return LS_A_T2B; + } + if ( allowFB ) + {//directly in front anim allowed + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK)) ) + {//okay to do backstabs with this saber + if ( enemyDist > 200 || pm->gent->enemy->health <= 0 ) + {//hmm, look in back for an enemy + if ( pm->ps->clientNum && !PM_ControlledByPlayer() ) + {//player should never do this automatically + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//only when on ground + if ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) + {//only fencers and higher can do this, higher rank does it more + if ( PM_CheckEnemyInBack( 100 ) ) + { + return PM_PickBackStab(); + } + } + } + } + } + } + //this is the default only if they're *right* in front... + if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) + || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) ) + {//NPC or player not in 1st person + if ( PM_CheckFlipOverAttackMove( qtrue ) ) + {//enemy must be close and in front + return PM_SaberFlipOverAttackMove(); + } + } + if ( PM_CheckLungeAttackMove() ) + {//NPC + autoMove = PM_SaberLungeAttackMove( qtrue ); + } + else + { + autoMove = LS_A_T2B; + } + } + else + {//pick a random one + if ( Q_irand( 0, 1 ) ) + { + autoMove = LS_A_TR2BL; + } + else + { + autoMove = LS_A_TL2BR; + } + } + float dotR = DotProduct( enemyDir, faceRight ); + if ( dotR > 0.35 ) + {//enemy is to far right + autoMove = LS_A_L2R; + } + else if ( dotR < -0.35 ) + {//far left + autoMove = LS_A_R2L; + } + else if ( dotR > 0.15 ) + {//enemy is to near right + autoMove = LS_A_TR2BL; + } + else if ( dotR < -0.15 ) + {//near left + autoMove = LS_A_TL2BR; + } + if ( DotProduct( enemyDir, faceUp ) > 0.5 ) + {//enemy is above me + if ( autoMove == LS_A_TR2BL ) + { + autoMove = LS_A_BL2TR; + } + else if ( autoMove == LS_A_TL2BR ) + { + autoMove = LS_A_BR2TL; + } + } + } + else if ( allowFB ) + {//back attack allowed + //if ( !PM_InKnockDown( pm->ps ) ) + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK)) ) + {//okay to do backstabs with this saber + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//only when on ground + if ( !pm->gent->enemy->client || pm->gent->enemy->client->ps.groundEntityNum != ENTITYNUM_NONE ) + {//enemy not a client or is a client and on ground + if ( dot < -0.75f + && enemyDist < 128 + && (pm->ps->saberAnimLevel == SS_FAST || pm->ps->saberAnimLevel == SS_STAFF || (pm->gent->client &&(pm->gent->client->NPC_class == CLASS_TAVION||pm->gent->client->NPC_class == CLASS_ALORA)&&Q_irand(0,2))) ) + {//fast back-stab + if ( !(pm->ps->pm_flags&PMF_DUCKED) && pm->cmd.upmove >= 0 ) + {//can't do it while ducked? + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || (pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG) ) + {//only fencers and above can do this + autoMove = LS_A_BACKSTAB; + } + } + } + else if ( pm->ps->saberAnimLevel != SS_FAST + && pm->ps->saberAnimLevel != SS_STAFF ) + {//higher level back spin-attacks + if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) ) + { + if ( (pm->ps->pm_flags&PMF_DUCKED) || pm->cmd.upmove < 0 ) + { + autoMove = LS_A_BACK_CR; + } + else + { + autoMove = LS_A_BACK; + } + } + } + } + } + } + } + return autoMove; +} + +qboolean PM_InSecondaryStyle( void ) +{ + if ( pm->ps->saber[0].numBlades > 1 + && pm->ps->saber[0].singleBladeStyle + && (pm->ps->saber[0].stylesForbidden&(1<ps->saber[0].singleBladeStyle)) + && pm->ps->saberAnimLevel == pm->ps->saber[0].singleBladeStyle ) + { + return qtrue; + } + + if ( pm->ps->dualSabers + && !pm->ps->saber[1].Active() )//pm->ps->saberAnimLevel != SS_DUAL ) + { + return qtrue; + } + return qfalse; +} + +saberMoveName_t PM_SaberLungeAttackMove( qboolean fallbackToNormalLunge ) +{ + G_DrainPowerForSpecialMove( pm->gent, FP_SABER_OFFENSE, SABER_ALT_ATTACK_POWER_FB ); + + //see if we have an overridden (or cancelled) lunge move + if ( pm->ps->saber[0].lungeAtkMove != LS_INVALID ) + { + if ( pm->ps->saber[0].lungeAtkMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].lungeAtkMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].lungeAtkMove != LS_INVALID ) + { + if ( pm->ps->saber[1].lungeAtkMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].lungeAtkMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].lungeAtkMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].lungeAtkMove == LS_NONE ) + { + return LS_NONE; + } + } + //do normal checks + if ( pm->gent->client->NPC_class == CLASS_ALORA && !Q_irand( 0, 3 ) ) + {//alora NPC + return LS_SPINATTACK_ALORA; + } + else + { + if ( pm->ps->dualSabers ) + { + return LS_SPINATTACK_DUAL; + } + switch ( pm->ps->saberAnimLevel ) + { + case SS_DUAL: + return LS_SPINATTACK_DUAL; + break; + case SS_STAFF: + return LS_SPINATTACK; + break; + default://normal lunge + if ( fallbackToNormalLunge ) + { + vec3_t fwdAngles, jumpFwd; + + VectorCopy( pm->ps->viewangles, fwdAngles ); + fwdAngles[PITCH] = fwdAngles[ROLL] = 0; + //do the lunge + AngleVectors( fwdAngles, jumpFwd, NULL, NULL ); + VectorScale( jumpFwd, 150, pm->ps->velocity ); + pm->ps->velocity[2] = 50; + PM_AddEvent( EV_JUMP ); + + return LS_A_LUNGE; + } + break; + } + } + return LS_NONE; +} + +qboolean PM_CheckLungeAttackMove( void ) +{ + //check to see if it's cancelled? + if ( pm->ps->saber[0].lungeAtkMove == LS_NONE ) + { + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].lungeAtkMove == LS_NONE + || pm->ps->saber[1].lungeAtkMove == LS_INVALID ) + { + return qfalse; + } + } + else + { + return qfalse; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].lungeAtkMove == LS_NONE ) + { + if ( pm->ps->saber[0].lungeAtkMove == LS_NONE + || pm->ps->saber[0].lungeAtkMove == LS_INVALID ) + { + return qfalse; + } + } + } + //do normal checks + if ( pm->ps->saberAnimLevel == SS_FAST//fast + || pm->ps->saberAnimLevel == SS_DUAL//dual + || pm->ps->saberAnimLevel == SS_STAFF //staff + || pm->ps->saberAnimLevel == SS_DESANN + || pm->ps->dualSabers ) + {//alt+back+attack using fast, dual or staff attacks + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->cmd.upmove < 0 || (pm->ps->pm_flags&PMF_DUCKED) ) + {//ducking + if ( pm->ps->legsAnim == BOTH_STAND2 + || pm->ps->legsAnim == BOTH_SABERFAST_STANCE + || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE + || pm->ps->legsAnim == BOTH_SABERSTAFF_STANCE + || pm->ps->legsAnim == BOTH_SABERDUAL_STANCE + || (level.time-pm->ps->lastStationary) <= 500 ) + {//standing or just stopped standing + if ( pm->gent + && pm->gent->NPC //NPC + && pm->gent->NPC->rank >= RANK_LT_JG //high rank + && ( pm->gent->NPC->rank == RANK_LT_JG || Q_irand( -3, pm->gent->NPC->rank ) >= RANK_LT_JG )//Q_irand( 0, pm->gent->NPC->rank ) >= RANK_LT_JG ) + && !Q_irand( 0, 3-g_spskill->integer ) ) + {//only fencer and higher can do this + if ( pm->ps->saberAnimLevel == SS_DESANN ) + { + if ( !Q_irand( 0, 4 ) ) + { + return qtrue; + } + } + else + { + return qtrue; + } + } + } + } + } + else + {//player + if ( G_TryingLungeAttack( pm->gent, &pm->cmd ) + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB )/*pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB*/ )//have enough force power to pull it off + { + return qtrue; + } + } + } + + return qfalse; +} + +saberMoveName_t PM_SaberJumpForwardAttackMove( void ) +{ + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_FB ); + + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].jumpAtkFwdMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkFwdMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].jumpAtkFwdMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove != LS_INVALID ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].jumpAtkFwdMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + { + return LS_NONE; + } + } + if ( pm->ps->saberAnimLevel == SS_DUAL + || pm->ps->saberAnimLevel == SS_STAFF ) + { + pm->cmd.upmove = 0;//no jump just yet + + if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + if ( Q_irand(0, 1) ) + { + return LS_JUMPATTACK_STAFF_LEFT; + } + else + { + return LS_JUMPATTACK_STAFF_RIGHT; + } + } + + return LS_JUMPATTACK_DUAL; + } + else + { + vec3_t fwdAngles, jumpFwd; + + VectorCopy( pm->ps->viewangles, fwdAngles ); + fwdAngles[PITCH] = fwdAngles[ROLL] = 0; + AngleVectors( fwdAngles, jumpFwd, NULL, NULL ); + VectorScale( jumpFwd, 200, pm->ps->velocity ); + pm->ps->velocity[2] = 180; + pm->ps->forceJumpZStart = pm->ps->origin[2];//so we don't take damage if we land at same height + pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; + + //FIXME: NPCs yell? + PM_AddEvent( EV_JUMP ); + G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); + pm->cmd.upmove = 0; + + return LS_A_JUMP_T__B_; + } +} + +qboolean PM_CheckJumpForwardAttackMove( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return qfalse; + } + + //check to see if it's cancelled? + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + { + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[1].jumpAtkFwdMove == LS_INVALID ) + { + return qfalse; + } + } + else + { + return qfalse; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + { + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[0].jumpAtkFwdMove == LS_INVALID ) + { + return qfalse; + } + } + } + //do normal checks + + if ( pm->cmd.forwardmove > 0 //going forward + && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //can force jump + && pm->gent && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped (if not player) + ) + { + if ( pm->ps->saberAnimLevel == SS_DUAL + || pm->ps->saberAnimLevel == SS_STAFF ) + {//dual and staff + if ( !PM_SaberInTransitionAny( pm->ps->saberMove ) //not going to/from/between an attack anim + && !PM_SaberInAttack( pm->ps->saberMove ) //not in attack anim + && pm->ps->weaponTime <= 0//not busy + && (pm->cmd.buttons&BUTTON_ATTACK) )//want to attack + { + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING) )//jumping NPC + { + if ( pm->gent + && pm->gent->NPC + && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) + { + return qtrue; + } + } + } + else + {//PLAYER + if ( G_TryingJumpForwardAttack( pm->gent, &pm->cmd ) + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB ) )//have enough power to attack + { + return qtrue; + } + } + } + } + //check strong + else if ( pm->ps->saberAnimLevel == SS_STRONG //strong style + || pm->ps->saberAnimLevel == SS_DESANN )//desann + { + if ( //&& !PM_InKnockDown( pm->ps ) + !pm->ps->dualSabers + //&& (pm->ps->legsAnim == BOTH_STAND2||pm->ps->legsAnim == BOTH_SABERFAST_STANCE||pm->ps->legsAnim == BOTH_SABERSLOW_STANCE||level.time-pm->ps->lastStationary<=500)//standing or just started moving + ) + {//strong attack: jump-hack + /* + if ( pm->ps->legsAnim == BOTH_STAND2 + || pm->ps->legsAnim == BOTH_SABERFAST_STANCE + || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE + || level.time-pm->ps->lastStationary <= 250 )//standing or just started moving + */ + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING) )//NPC jumping + { + if ( pm->gent + && pm->gent->NPC + && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) + {//only acrobat or boss and higher can do this + if ( pm->ps->legsAnim == BOTH_STAND2 + || pm->ps->legsAnim == BOTH_SABERFAST_STANCE + || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE + || level.time-pm->ps->lastStationary <= 250 ) + {//standing or just started moving + if ( pm->gent->client + && pm->gent->client->NPC_class == CLASS_DESANN ) + { + if ( !Q_irand( 0, 1 ) ) + { + return qtrue; + } + } + else + { + return qtrue; + } + } + } + } + } + else + {//player + if ( G_TryingJumpForwardAttack( pm->gent, &pm->cmd ) + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB ) ) + { + return qtrue; + } + } + } + } + } + return qfalse; +} + +saberMoveName_t PM_SaberFlipOverAttackMove( void ) +{ + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].jumpAtkFwdMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkFwdMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].jumpAtkFwdMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove != LS_INVALID ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].jumpAtkFwdMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + { + return LS_NONE; + } + } + //FIXME: check above for room enough to jump! + //FIXME: while in this jump, keep velocity[2] at a minimum until the end of the anim + vec3_t fwdAngles, jumpFwd; + + VectorCopy( pm->ps->viewangles, fwdAngles ); + fwdAngles[PITCH] = fwdAngles[ROLL] = 0; + AngleVectors( fwdAngles, jumpFwd, NULL, NULL ); + VectorScale( jumpFwd, 150, pm->ps->velocity ); + pm->ps->velocity[2] = 250; + //250 is normalized for a standing enemy at your z level, about 64 tall... adjust for actual maxs[2]-mins[2] of enemy and for zdiff in origins + if ( pm->gent && pm->gent->enemy ) + { //go higher for taller enemies + pm->ps->velocity[2] *= (pm->gent->enemy->maxs[2]-pm->gent->enemy->mins[2])/64.0f; + //go higher for enemies higher than you, lower for those lower than you + float zDiff = pm->gent->enemy->currentOrigin[2] - pm->ps->origin[2]; + pm->ps->velocity[2] += (zDiff)*1.5f; + //clamp to decent-looking values + //FIXME: still jump too low sometimes + if ( zDiff <= 0 && pm->ps->velocity[2] < 200 ) + {//if we're on same level, don't let me jump so low, I clip into the ground + pm->ps->velocity[2] = 200; + } + else if ( pm->ps->velocity[2] < 50 ) + { + pm->ps->velocity[2] = 50; + } + else if ( pm->ps->velocity[2] > 400 ) + { + pm->ps->velocity[2] = 400; + } + } + pm->ps->forceJumpZStart = pm->ps->origin[2];//so we don't take damage if we land at same height + pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; + + //FIXME: NPCs yell? + PM_AddEvent( EV_JUMP ); + G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); + pm->cmd.upmove = 0; + //FIXME: don't allow this to land on other people + + pm->gent->angle = pm->ps->viewangles[YAW];//so we know what yaw we started this at + + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_FB ); + + if ( Q_irand( 0, 1 ) ) + { + return LS_A_FLIP_STAB; + } + else + { + return LS_A_FLIP_SLASH; + } +} + +qboolean PM_CheckFlipOverAttackMove( qboolean checkEnemy ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return qfalse; + } + //check to see if it's cancelled? + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + { + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[1].jumpAtkFwdMove == LS_INVALID ) + { + return qfalse; + } + } + else + { + return qfalse; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + { + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[0].jumpAtkFwdMove == LS_INVALID ) + { + return qfalse; + } + } + } + //do normal checks + + if ( (pm->ps->saberAnimLevel == SS_MEDIUM //medium + || pm->ps->saberAnimLevel == SS_TAVION )//tavion + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //can force jump + && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped + ) + { + qboolean tryMove = qfalse; + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->cmd.upmove > 0//want to jump + || (pm->ps->pm_flags&PMF_JUMPING) )//jumping + {//flip over-forward down-attack + if ( (pm->gent->NPC + && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) + && !Q_irand(0, 2) ) )//NPC who can do this, 33% chance + {//only player or acrobat or boss and higher can do this + tryMove = qtrue; + } + } + } + else + {//player + if ( G_TryingJumpForwardAttack( pm->gent, &pm->cmd ) + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB ) )//have enough power + { + if ( !pm->cmd.rightmove ) + { + if ( pm->ps->legsAnim == BOTH_JUMP1 + || pm->ps->legsAnim == BOTH_FORCEJUMP1 + || pm->ps->legsAnim == BOTH_INAIR1 + || pm->ps->legsAnim == BOTH_FORCEINAIR1 ) + {//in a non-flip forward jump + tryMove = qtrue; + } + } + } + } + + if ( tryMove ) + { + if ( !checkEnemy ) + {//based just on command input + return qtrue; + } + else + {//based on presence of enemy + if ( pm->gent->enemy )//have an enemy + { + vec3_t fwdAngles = {0,pm->ps->viewangles[YAW],0}; + if ( pm->gent->enemy->health > 0 + && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period + && pm->gent->enemy->maxs[2] > 12 + && (!pm->gent->enemy->client || !PM_InKnockDownOnGround( &pm->gent->enemy->client->ps ) ) + && DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ) < 10000 + && InFront( pm->gent->enemy->currentOrigin, pm->gent->currentOrigin, fwdAngles, 0.3f ) ) + {//enemy must be alive, not low to ground, close and in front + return qtrue; + } + } + return qfalse; + } + } + } + return qfalse; +} + +saberMoveName_t PM_SaberBackflipAttackMove( void ) +{ + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].jumpAtkBackMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkBackMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].jumpAtkBackMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkBackMove != LS_INVALID ) + { + if ( pm->ps->saber[1].jumpAtkBackMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].jumpAtkBackMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].jumpAtkBackMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkBackMove == LS_NONE ) + { + return LS_NONE; + } + } + pm->cmd.upmove = 0;//no jump just yet + return LS_A_BACKFLIP_ATK; +} + +qboolean PM_CheckBackflipAttackMove( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return qfalse; + } + + //check to see if it's cancelled? + if ( pm->ps->saber[0].jumpAtkBackMove == LS_NONE ) + { + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkBackMove == LS_NONE + || pm->ps->saber[1].jumpAtkBackMove == LS_INVALID ) + { + return qfalse; + } + } + else + { + return qfalse; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkBackMove == LS_NONE ) + { + if ( pm->ps->saber[0].jumpAtkBackMove == LS_NONE + || pm->ps->saber[0].jumpAtkBackMove == LS_INVALID ) + { + return qfalse; + } + } + } + //do normal checks + + if ( pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //can force jump + && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period + && pm->gent && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one + //&& (pm->ps->legsAnim == BOTH_SABERSTAFF_STANCE || level.time-pm->ps->lastStationary<=250)//standing or just started moving + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) )//on ground or just jumped (if not player) + { + if ( pm->cmd.forwardmove < 0 //moving backwards + && pm->ps->saberAnimLevel == SS_STAFF //using staff + && (pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING)) )//jumping + {//jumping backwards and using staff + if ( !PM_SaberInTransitionAny( pm->ps->saberMove ) //not going to/from/between an attack anim + && !PM_SaberInAttack( pm->ps->saberMove ) //not in attack anim + && pm->ps->weaponTime <= 0//not busy + && (pm->cmd.buttons&BUTTON_ATTACK) )//want to attack + {//not already attacking + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->gent + && pm->gent->NPC + && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) + {//acrobat or boss and higher can do this + return qtrue; + } + } + else + {//player + return qtrue; + } + } + } + } + return qfalse; +} + +saberMoveName_t PM_CheckDualSpinProtect( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return LS_NONE; + } + + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].kataMove != LS_INVALID ) + { + if ( pm->ps->saber[0].kataMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].kataMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].kataMove != LS_INVALID ) + { + if ( pm->ps->saber[1].kataMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].kataMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].kataMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].kataMove == LS_NONE ) + { + return LS_NONE; + } + } + //do normal checks + if ( pm->ps->saberMove == LS_READY//ready + //&& (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//PLAYER ONLY...? + //&& pm->ps->viewangles[0] > 30 //looking down + && pm->ps->saberAnimLevel == SS_DUAL//using dual saber style + && pm->ps->saber[0].Active() && pm->ps->saber[1].Active()//both sabers on + //&& pm->ps->forcePowerLevel[FP_PUSH]>=FORCE_LEVEL_3//force push 3 + //&& ((pm->ps->forcePowersActive&(1<ps->forcePowerDebounce[FP_PUSH]>level.time)//force-pushing + && G_TryingKataAttack( pm->gent, &pm->cmd )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER, qtrue )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER//DUAL_SPIN_PROTECT_POWER//force push 3 + && (pm->cmd.buttons&BUTTON_ATTACK)//pressing attack + ) + {//FIXME: some NPC logic to do this? + /* + if ( (pm->ps->pm_flags&PMF_DUCKED||pm->cmd.upmove<0)//crouching + && g_crosshairEntNum >= ENTITYNUM_WORLD ) + */ + { + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_PUSH, SABER_ALT_ATTACK_POWER, qtrue );//drain the required force power + } + return LS_DUAL_SPIN_PROTECT; + } + } + return LS_NONE; +} + +saberMoveName_t PM_CheckStaffKata( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return LS_NONE; + } + + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].kataMove != LS_INVALID ) + { + if ( pm->ps->saber[0].kataMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].kataMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].kataMove != LS_INVALID ) + { + if ( pm->ps->saber[1].kataMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].kataMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].kataMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].kataMove == LS_NONE ) + { + return LS_NONE; + } + } + //do normal checks + if ( pm->ps->saberMove == LS_READY//ready + //&& (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//PLAYER ONLY...? + //&& pm->ps->viewangles[0] > 30 //looking down + && pm->ps->saberAnimLevel == SS_STAFF//using dual saber style + && pm->ps->saber[0].Active()//saber on + //&& pm->ps->forcePowerLevel[FP_PUSH]>=FORCE_LEVEL_3//force push 3 + //&& ((pm->ps->forcePowersActive&(1<ps->forcePowerDebounce[FP_PUSH]>level.time)//force-pushing + && G_TryingKataAttack( pm->gent, &pm->cmd )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER, qtrue )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER//DUAL_SPIN_PROTECT_POWER//force push 3 + && (pm->cmd.buttons&BUTTON_ATTACK)//pressing attack + ) + {//FIXME: some NPC logic to do this? + /* + if ( (pm->ps->pm_flags&PMF_DUCKED||pm->cmd.upmove<0)//crouching + && g_crosshairEntNum >= ENTITYNUM_WORLD ) + */ + { + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER, qtrue );//drain the required force power + } + return LS_STAFF_SOULCAL; + } + } + return LS_NONE; +} + +extern qboolean WP_ForceThrowable( gentity_t *ent, gentity_t *forwardEnt, gentity_t *self, qboolean pull, float cone, float radius, vec3_t forward ); +saberMoveName_t PM_CheckPullAttack( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return LS_NONE; + } + + if ( (pm->ps->saber[0].saberFlags&SFL_NO_PULL_ATTACK) ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers + && (pm->ps->saber[1].saberFlags&SFL_NO_PULL_ATTACK) ) + { + return LS_NONE; + } + + if ( (pm->ps->saberMove == LS_READY||PM_SaberInReturn(pm->ps->saberMove)||PM_SaberInReflect(pm->ps->saberMove))//ready + //&& (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//PLAYER ONLY + && pm->ps->saberAnimLevel >= SS_FAST//single saber styles - FIXME: Tavion? + && pm->ps->saberAnimLevel <= SS_STRONG//single saber styles - FIXME: Tavion? + && G_TryingPullAttack( pm->gent, &pm->cmd, qfalse )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus + //&& pm->cmd.forwardmove<0//pulling back + && (pm->cmd.buttons&BUTTON_ATTACK)//attacking + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB//have enough power + ) + {//FIXME: some NPC logic to do this? + qboolean doMove = g_saberNewControlScheme->integer?qtrue:qfalse;//in new control scheme, can always do this, even if there's no-one to do it to + if ( g_saberNewControlScheme->integer + || g_crosshairEntNum < ENTITYNUM_WORLD )//in old control scheme, there has to be someone there + { + saberMoveName_t pullAttackMove = LS_NONE; + if ( pm->ps->saberAnimLevel == SS_FAST ) + { + pullAttackMove = LS_PULL_ATTACK_STAB; + } + else + { + pullAttackMove = LS_PULL_ATTACK_SWING; + } + + if ( g_crosshairEntNum < ENTITYNUM_WORLD + && pm->gent && pm->gent->client ) + { + gentity_t *targEnt = &g_entities[g_crosshairEntNum]; + if ( targEnt->client + && targEnt->health > 0 + //FIXME: check other things like in knockdown, saberlock, uninterruptable anims, etc. + && !PM_InOnGroundAnim( &targEnt->client->ps ) + && !PM_LockedAnim( targEnt->client->ps.legsAnim ) + && !PM_SuperBreakLoseAnim( targEnt->client->ps.legsAnim ) + && !PM_SuperBreakWinAnim( targEnt->client->ps.legsAnim ) + && targEnt->client->ps.saberLockTime <= 0 + && WP_ForceThrowable( targEnt, targEnt, pm->gent, qtrue, 1.0f, 0.0f, NULL ) ) + { + if ( !g_saberNewControlScheme->integer ) + {//in old control scheme, make sure they're close or far enough away for the move we'll be doing + float targDist = Distance( targEnt->currentOrigin, pm->ps->origin ); + if ( pullAttackMove == LS_PULL_ATTACK_STAB ) + {//must be closer than 512 + if ( targDist > 384.0f ) + { + return LS_NONE; + } + } + else//if ( pullAttackMove == LS_PULL_ATTACK_SWING ) + {//must be farther than 256 + if ( targDist > 512.0f ) + { + return LS_NONE; + } + if ( targDist < 192.0f ) + { + return LS_NONE; + } + } + } + + vec3_t targAngles = {0,targEnt->client->ps.viewangles[YAW],0}; + if ( InFront( pm->ps->origin, targEnt->currentOrigin, targAngles ) ) + { + NPC_SetAnim( targEnt, SETANIM_BOTH, BOTH_PULLED_INAIR_F, SETANIM_FLAG_OVERRIDE, SETANIM_FLAG_HOLD ); + } + else + { + NPC_SetAnim( targEnt, SETANIM_BOTH, BOTH_PULLED_INAIR_B, SETANIM_FLAG_OVERRIDE, SETANIM_FLAG_HOLD ); + } + //hold the anim until I'm with done pull anim + targEnt->client->ps.legsAnimTimer = targEnt->client->ps.torsoAnimTimer = PM_AnimLength( pm->gent->client->clientInfo.animFileIndex, (animNumber_t)saberMoveData[pullAttackMove].animToUse ); + //set pullAttackTime + pm->gent->client->ps.pullAttackTime = targEnt->client->ps.pullAttackTime = level.time+targEnt->client->ps.legsAnimTimer; + //make us know about each other + pm->gent->client->ps.pullAttackEntNum = g_crosshairEntNum; + targEnt->client->ps.pullAttackEntNum = pm->ps->clientNum; + //do effect and sound on me + pm->ps->powerups[PW_FORCE_PUSH] = level.time + 1000; + if ( pm->gent ) + { + G_Sound( pm->gent, G_SoundIndex( "sound/weapons/force/pull.wav" ) ); + } + doMove = qtrue; + } + } + if ( doMove ) + { + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_PULL, SABER_ALT_ATTACK_POWER_FB ); + } + return pullAttackMove; + } + } + } + return LS_NONE; +} + +saberMoveName_t PM_CheckPlayerAttackFromParry( int curmove ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) + { + if ( curmove >= LS_PARRY_UP + && curmove <= LS_REFLECT_LL ) + {//in a parry + switch ( saberMoveData[curmove].endQuad ) + { + case Q_T: + return LS_A_T2B; + break; + case Q_TR: + return LS_A_TR2BL; + break; + case Q_TL: + return LS_A_TL2BR; + break; + case Q_BR: + return LS_A_BR2TL; + break; + case Q_BL: + return LS_A_BL2TR; + break; + //shouldn't be a parry that ends at L, R or B + } + } + } + return LS_NONE; +} + + +saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int curmove ) +{ + qboolean noSpecials = qfalse; + + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + noSpecials = qtrue; + } + + saberMoveName_t overrideJumpRightAttackMove = LS_INVALID; + if ( pm->ps->saber[0].jumpAtkRightMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkRightMove != LS_NONE ) + {//actually overriding + overrideJumpRightAttackMove = (saberMoveName_t)pm->ps->saber[0].jumpAtkRightMove; + } + else if ( pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkRightMove > LS_NONE ) + {//would be cancelling it, but check the second saber, too + overrideJumpRightAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkRightMove; + } + else + {//nope, just cancel it + overrideJumpRightAttackMove = LS_NONE; + } + } + else if ( pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkRightMove != LS_INVALID ) + {//first saber not overridden, check second + overrideJumpRightAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkRightMove; + } + + saberMoveName_t overrideJumpLeftAttackMove = LS_INVALID; + if ( pm->ps->saber[0].jumpAtkLeftMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkLeftMove != LS_NONE ) + {//actually overriding + overrideJumpLeftAttackMove = (saberMoveName_t)pm->ps->saber[0].jumpAtkLeftMove; + } + else if ( pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkLeftMove > LS_NONE ) + {//would be cancelling it, but check the second saber, too + overrideJumpLeftAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkLeftMove; + } + else + {//nope, just cancel it + overrideJumpLeftAttackMove = LS_NONE; + } + } + else if ( pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkLeftMove != LS_INVALID ) + {//first saber not overridden, check second + overrideJumpLeftAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkLeftMove; + } + if ( rightmove > 0 ) + {//moving right + if ( !noSpecials + && overrideJumpRightAttackMove != LS_NONE + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped + && (pm->cmd.buttons&BUTTON_ATTACK)//hitting attack + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0//have force jump 1 at least + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_LR )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_LR//have enough power + && (((pm->ps->clientNum>=MAX_CLIENTS&&!PM_ControlledByPlayer())&&pm->cmd.upmove > 0)//jumping NPC + ||((pm->ps->clientNumgent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/)) )//focus-holding player + {//cartwheel right + vec3_t right, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_LR ); + } + pm->cmd.upmove = 0; + if ( overrideJumpRightAttackMove != LS_INVALID ) + {//overridden with another move + return overrideJumpRightAttackMove; + } + else if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + AngleVectors( fwdAngles, NULL, right, NULL ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA( pm->ps->velocity, 190, right, pm->ps->velocity ); + return LS_BUTTERFLY_RIGHT; + } + else + { + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_CARTWHEELS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_CARTWHEELS)) ) + {//okay to do cartwheels with this saber + /* + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//still on ground + VectorClear( pm->ps->velocity ); + return LS_JUMPATTACK_CART_RIGHT; + } + else + */ + {//in air + AngleVectors( fwdAngles, NULL, right, NULL ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA( pm->ps->velocity, 190, right, pm->ps->velocity ); + PM_SetJumped( JUMP_VELOCITY, qtrue ); + return LS_JUMPATTACK_ARIAL_RIGHT; + } + } + } + } + else if ( pm->ps->legsAnim != BOTH_CARTWHEEL_RIGHT + && pm->ps->legsAnim != BOTH_ARIAL_RIGHT ) + {//not in a cartwheel/arial + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/ )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + if ( forwardmove > 0 ) + {//forward right = TL2BR slash + return LS_A_TL2BR; + } + else if ( forwardmove < 0 ) + {//backward right = BL2TR uppercut + return LS_A_BL2TR; + } + else + {//just right is a left slice + return LS_A_L2R; + } + } + } + else if ( rightmove < 0 ) + {//moving left + if ( !noSpecials + && overrideJumpLeftAttackMove != LS_NONE + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped + && (pm->cmd.buttons&BUTTON_ATTACK)//hitting attack + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0//have force jump 1 at least + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_LR )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_LR//have enough power + && (((pm->ps->clientNum>=MAX_CLIENTS&&!PM_ControlledByPlayer())&&pm->cmd.upmove > 0)//jumping NPC + ||((pm->ps->clientNumgent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/)) )//focus-holding player + {//cartwheel left + vec3_t right, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_LR ); + } + pm->cmd.upmove = 0; + if ( overrideJumpRightAttackMove != LS_INVALID ) + {//overridden with another move + return overrideJumpRightAttackMove; + } + else if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + AngleVectors( fwdAngles, NULL, right, NULL ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA( pm->ps->velocity, -190, right, pm->ps->velocity ); + return LS_BUTTERFLY_LEFT; + } + else + { + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_CARTWHEELS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_CARTWHEELS)) ) + {//okay to do cartwheels with this saber + /* + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//still on ground + VectorClear( pm->ps->velocity ); + return LS_JUMPATTACK_ARIAL_LEFT; + } + else + */ + { + AngleVectors( fwdAngles, NULL, right, NULL ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA( pm->ps->velocity, -190, right, pm->ps->velocity ); + PM_SetJumped( JUMP_VELOCITY, qtrue ); + return LS_JUMPATTACK_CART_LEFT; + } + } + } + } + else if ( pm->ps->legsAnim != BOTH_CARTWHEEL_LEFT + && pm->ps->legsAnim != BOTH_ARIAL_LEFT ) + {//not in a left cartwheel/arial + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/ )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + if ( forwardmove > 0 ) + {//forward left = TR2BL slash + return LS_A_TR2BL; + } + else if ( forwardmove < 0 ) + {//backward left = BR2TL uppercut + return LS_A_BR2TL; + } + else + {//just left is a right slice + return LS_A_R2L; + } + } + } + else + {//not moving left or right + if ( forwardmove > 0 ) + {//forward= T2B slash + saberMoveName_t stabDownMove = noSpecials?LS_NONE:PM_CheckStabDown(); + if ( stabDownMove != LS_NONE ) + { + return stabDownMove; + } + if ( ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) )//player in third person, not zoomed in + {//player in thirdperson, not zoomed in + //flip-over attack logic + if ( !noSpecials && PM_CheckFlipOverAttackMove( qfalse ) ) + {//flip over-forward down-attack + return PM_SaberFlipOverAttackMove(); + } + //lunge attack logic + else if ( PM_CheckLungeAttackMove() ) + { + return PM_SaberLungeAttackMove( qtrue ); + } + //jump forward attack logic + else if ( !noSpecials && PM_CheckJumpForwardAttackMove() ) + { + return PM_SaberJumpForwardAttackMove(); + } + } + + //player NPC with enemy: autoMove logic + if ( pm->gent + && pm->gent->enemy + && pm->gent->enemy->client ) + {//I have an active enemy + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) + {//a player who is running at an enemy + //if the enemy is not a jedi, don't use top-down, pick a diagonal or side attack + if ( pm->gent->enemy->s.weapon != WP_SABER + && pm->gent->enemy->client->NPC_class != CLASS_REMOTE//too small to do auto-aiming accurately + && pm->gent->enemy->client->NPC_class != CLASS_SEEKER//too small to do auto-aiming accurately + && pm->gent->enemy->client->NPC_class != CLASS_GONK//too short to do auto-aiming accurately + && pm->gent->enemy->client->NPC_class != CLASS_HOWLER//too short to do auto-aiming accurately + && g_saberAutoAim->integer ) + { + saberMoveName_t autoMove = PM_AttackForEnemyPos( qfalse, (qboolean)(pm->ps->clientNum>=MAX_CLIENTS&&!PM_ControlledByPlayer()) ); + if ( autoMove != LS_INVALID ) + { + return autoMove; + } + } + } + + if ( pm->ps->clientNum>=MAX_CLIENTS && !PM_ControlledByPlayer() ) //NPC ONLY + {//NPC + if ( PM_CheckFlipOverAttackMove( qtrue ) ) + { + return PM_SaberFlipOverAttackMove(); + } + } + } + + //Regular NPCs + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) //NPC ONLY + {//NPC or player in third person, not zoomed in + //fwd jump attack logic + if ( PM_CheckJumpForwardAttackMove() ) + { + return PM_SaberJumpForwardAttackMove(); + } + //lunge attack logic + else if ( PM_CheckLungeAttackMove() ) + { + return PM_SaberLungeAttackMove( qtrue ); + } + } + + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent,&pm->cmd) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + return LS_A_T2B; + } + else if ( forwardmove < 0 ) + {//backward= T2B slash//B2T uppercut? + if ( g_saberNewControlScheme->integer ) + { + saberMoveName_t pullAtk = PM_CheckPullAttack(); + if ( pullAtk != LS_NONE ) + { + return pullAtk; + } + } + + if ( g_saberNewControlScheme->integer + && (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) //PLAYER ONLY + && (pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus, trying special backwards attacks + {//player lunge attack logic + if ( ( pm->ps->dualSabers //or dual + || pm->ps->saberAnimLevel == SS_STAFF )//pm->ps->SaberStaff() )//or staff + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB )/*pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB*/ )//have enough force power to pull it off + {//alt+back+attack using fast, dual or staff attacks + PM_SaberLungeAttackMove( qfalse ); + } + } + else if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) //NPC + || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) )//player in third person, not zooomed + {//NPC or player in third person, not zoomed + if ( PM_CheckBackflipAttackMove() ) + { + return PM_SaberBackflipAttackMove();//backflip attack + } + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent,&pm->cmd) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + //if ( !PM_InKnockDown( pm->ps ) ) + //check backstabs + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK)) ) + {//okay to do backstabs with this saber + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//only when on ground + if ( pm->gent && pm->gent->enemy ) + {//FIXME: or just trace for a valid enemy standing behind me? And no enemy in front? + vec3_t enemyDir, faceFwd, facingAngles = {0, pm->ps->viewangles[YAW], 0}; + AngleVectors( facingAngles, faceFwd, NULL, NULL ); + VectorSubtract( pm->gent->enemy->currentOrigin, pm->ps->origin, enemyDir ); + float dot = DotProduct( enemyDir, faceFwd ); + if ( dot < 0 ) + {//enemy is behind me + if ( dot < -0.75f + && DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ) < 16384//128 squared + && (pm->ps->saberAnimLevel == SS_FAST || pm->ps->saberAnimLevel == SS_STAFF || (pm->gent->client &&(pm->gent->client->NPC_class == CLASS_TAVION||pm->gent->client->NPC_class == CLASS_ALORA)&&Q_irand(0,1))) ) + {//fast attacks and Tavion + if ( !(pm->ps->pm_flags&PMF_DUCKED) && pm->cmd.upmove >= 0 ) + {//can't do it while ducked? + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || (pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG) ) + {//only fencers and above can do this + return LS_A_BACKSTAB; + } + } + } + else if ( pm->ps->saberAnimLevel != SS_FAST + && pm->ps->saberAnimLevel != SS_STAFF ) + {//medium and higher attacks + if ( (pm->ps->pm_flags&PMF_DUCKED) || pm->cmd.upmove < 0 ) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } + } + else + {//enemy in front + float enemyDistSq = DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ); + if ( ((pm->ps->saberAnimLevel == FORCE_LEVEL_1 || + pm->ps->saberAnimLevel == SS_STAFF || + pm->gent->client->NPC_class == CLASS_TAVION || + pm->gent->client->NPC_class == CLASS_ALORA || + (pm->gent->client->NPC_class == CLASS_DESANN && !Q_irand(0,3))) && + enemyDistSq > 16384) || + pm->gent->enemy->health <= 0 )//128 squared + {//my enemy is pretty far in front of me and I'm using fast attacks + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || + ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) ) + {//only fencers and higher can do this, higher rank does it more + if ( PM_CheckEnemyInBack( 128 ) ) + { + return PM_PickBackStab(); + } + } + } + else if ( ((pm->ps->saberAnimLevel >= FORCE_LEVEL_2 || pm->gent->client->NPC_class == CLASS_DESANN) && enemyDistSq > 40000) || pm->gent->enemy->health <= 0 )//200 squared + {//enemy is very faw away and I'm using medium/strong attacks + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || + ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) ) + {//only fencers and higher can do this, higher rank does it more + if ( PM_CheckEnemyInBack( 164 ) ) + { + return PM_PickBackStab(); + } + } + } + } + } + else + {//no current enemy + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->gent && pm->gent->client ) + {//only player + if ( PM_CheckEnemyInBack( 128 ) ) + { + return PM_PickBackStab(); + } + } + } + } + } + } + + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + //else just swing down + return LS_A_T2B; + } + else + {//not moving in any direction + if ( PM_SaberInBounce( curmove ) ) + {//bounces should go to their default attack if you don't specify a direction but are attacking + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent,&pm->cmd) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + saberMoveName_t newmove; + if ( pm->ps->clientNum && !PM_ControlledByPlayer() && Q_irand( 0, 3 ) ) + {//use NPC random + newmove = PM_NPCSaberAttackFromQuad( saberMoveData[curmove].endQuad ); + } + else + {//player uses chain-attack + newmove = saberMoveData[curmove].chain_attack; + } + if ( PM_SaberKataDone( curmove, newmove ) ) + { + return saberMoveData[curmove].chain_idle; + } + else + { + return newmove; + } + } + else if ( PM_SaberInKnockaway( curmove ) ) + {//bounces should go to their default attack if you don't specify a direction but are attacking + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + saberMoveName_t newmove; + if ( pm->ps->clientNum && !PM_ControlledByPlayer() && Q_irand( 0, 3 ) ) + {//use NPC random + newmove = PM_NPCSaberAttackFromQuad( saberMoveData[curmove].endQuad ); + } + else + { + if ( pm->ps->saberAnimLevel == SS_FAST || + pm->ps->saberAnimLevel == SS_TAVION ) + {//player is in fast attacks, so come right back down from the same spot + newmove = PM_AttackMoveForQuad( saberMoveData[curmove].endQuad ); + } + else + {//use a transition to wrap to another attack from a different dir + newmove = saberMoveData[curmove].chain_attack; + } + } + if ( PM_SaberKataDone( curmove, newmove ) ) + { + return saberMoveData[curmove].chain_idle; + } + else + { + return newmove; + } + } + else if ( curmove == LS_READY + || curmove == LS_A_FLIP_STAB + || curmove == LS_A_FLIP_SLASH + || ( curmove >= LS_PARRY_UP + && curmove <= LS_REFLECT_LL ) ) + {//Not moving at all, not too busy to attack + //push + lookdown + attack + dual sabers = LS_DUAL_SPIN_PROTECT + if ( g_saberNewControlScheme->integer ) + { + if ( PM_CheckDualSpinProtect() ) + { + return LS_DUAL_SPIN_PROTECT; + } + if ( PM_CheckStaffKata() ) + { + return LS_STAFF_SOULCAL; + } + } + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + if ( pm->ps->clientNum || g_saberAutoAim->integer ) + {//auto-aim + if ( pm->gent && pm->gent->enemy ) + {//based on enemy position, pick a proper attack + saberMoveName_t autoMove = PM_AttackForEnemyPos( qtrue, (qboolean)(pm->ps->clientNum>=MAX_CLIENTS) ); + if ( autoMove != LS_INVALID ) + { + return autoMove; + } + } + else if ( fabs(pm->ps->viewangles[0]) > 30 ) + {//looking far up or far down uses the top to bottom attack, presuming you want a vertical attack + return LS_A_T2B; + } + } + else + {//for now, just pick a random attack + return ((saberMoveName_t)Q_irand( LS_A_TL2BR, LS_A_T2B )); + } + } + } + } + //FIXME: pick a return? + return LS_NONE; +} + +saberMoveName_t PM_SaberAnimTransitionMove( saberMoveName_t curmove, saberMoveName_t newmove ) +{ + //FIXME: take FP_SABER_OFFENSE into account here somehow? + int retmove = newmove; + if ( curmove == LS_READY ) + {//just standing there + switch ( newmove ) + { + case LS_A_TL2BR: + case LS_A_L2R: + case LS_A_BL2TR: + case LS_A_BR2TL: + case LS_A_R2L: + case LS_A_TR2BL: + case LS_A_T2B: + //transition is the start + retmove = LS_S_TL2BR + (newmove-LS_A_TL2BR); + break; + default: + break; + } + } + else + { + switch ( newmove ) + { + //transitioning to ready pose + case LS_READY: + switch ( curmove ) + { + //transitioning from an attack + case LS_A_TL2BR: + case LS_A_L2R: + case LS_A_BL2TR: + case LS_A_BR2TL: + case LS_A_R2L: + case LS_A_TR2BL: + case LS_A_T2B: + //transition is the return + retmove = LS_R_TL2BR + (newmove-LS_A_TL2BR); + break; + default: + break; + } + break; + //transitioning to an attack + case LS_A_TL2BR: + case LS_A_L2R: + case LS_A_BL2TR: + case LS_A_BR2TL: + case LS_A_R2L: + case LS_A_TR2BL: + case LS_A_T2B: + if ( newmove == curmove ) + {//FIXME: need a spin or something or go to next level, but for now, just play the return + //going into another attack... + //allow endless chaining in level 1 attacks, several in level 2 and only one or a few in level 3 + //FIXME: don't let strong attacks chain to an attack in the opposite direction ( > 45 degrees?) + if ( PM_SaberKataDone( curmove, newmove ) ) + {//done with this kata, must return to ready before attack again + retmove = LS_R_TL2BR + (newmove-LS_A_TL2BR); + } + else + {//okay to chain to another attack + retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad]; + } + } + else if ( saberMoveData[curmove].endQuad == saberMoveData[newmove].startQuad ) + {//new move starts from same quadrant + retmove = newmove; + } + else + { + switch ( curmove ) + { + //transitioning from an attack + case LS_A_TL2BR: + case LS_A_L2R: + case LS_A_BL2TR: + case LS_A_BR2TL: + case LS_A_R2L: + case LS_A_TR2BL: + case LS_A_T2B: + case LS_D1_BR: + case LS_D1__R: + case LS_D1_TR: + case LS_D1_T_: + case LS_D1_TL: + case LS_D1__L: + case LS_D1_BL: + case LS_D1_B_: + retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad]; + break; + //transitioning from a return + case LS_R_TL2BR: + case LS_R_L2R: + case LS_R_BL2TR: + case LS_R_BR2TL: + case LS_R_R2L: + case LS_R_TR2BL: + case LS_R_T2B: + //transitioning from a bounce + /* + case LS_BOUNCE_UL2LL: + case LS_BOUNCE_LL2UL: + case LS_BOUNCE_L2LL: + case LS_BOUNCE_L2UL: + case LS_BOUNCE_UR2LR: + case LS_BOUNCE_LR2UR: + case LS_BOUNCE_R2LR: + case LS_BOUNCE_R2UR: + case LS_BOUNCE_TOP: + case LS_OVER_UR2UL: + case LS_OVER_UL2UR: + case LS_BOUNCE_UR: + case LS_BOUNCE_UL: + case LS_BOUNCE_LR: + case LS_BOUNCE_LL: + */ + //transitioning from a parry/reflection/knockaway/broken parry + case LS_PARRY_UP: + case LS_PARRY_UR: + case LS_PARRY_UL: + case LS_PARRY_LR: + case LS_PARRY_LL: + case LS_REFLECT_UP: + case LS_REFLECT_UR: + case LS_REFLECT_UL: + case LS_REFLECT_LR: + case LS_REFLECT_LL: + case LS_K1_T_: + case LS_K1_TR: + case LS_K1_TL: + case LS_K1_BR: + case LS_K1_BL: + case LS_V1_BR: + case LS_V1__R: + case LS_V1_TR: + case LS_V1_T_: + case LS_V1_TL: + case LS_V1__L: + case LS_V1_BL: + case LS_V1_B_: + case LS_H1_T_: + case LS_H1_TR: + case LS_H1_TL: + case LS_H1_BR: + case LS_H1_BL: + retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad]; + break; + //NB: transitioning from transitions is fine + default: + break; + } + } + break; + //transitioning to any other anim is not supported + default: + break; + } + } + + if ( retmove == LS_NONE ) + { + return newmove; + } + + return ((saberMoveName_t)retmove); +} + +/* +------------------------- +PM_LegsAnimForFrame +Returns animNumber for current frame +------------------------- +*/ +int PM_LegsAnimForFrame( gentity_t *ent, int legsFrame ) +{ + //Must be a valid client + if ( ent->client == NULL ) + return -1; + + //Must have a file index entry + if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) + return -1; + + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + int glaIndex = gi.G2API_GetAnimIndex(&(ent->ghoul2[0])); + + for ( int animation = 0; animation < BOTH_CIN_1; animation++ ) //first anim after last legs + { + if ( animation >= TORSO_DROPWEAP1 && animation < LEGS_TURN1 ) //first legs only anim + {//not a possible legs anim + continue; + } + + if ( animations[animation].glaIndex != glaIndex ) + { + continue; + } + + if ( animations[animation].firstFrame > legsFrame ) + {//This anim starts after this frame + continue; + } + + if ( animations[animation].firstFrame + animations[animation].numFrames < legsFrame ) + {//This anim ends before this frame + continue; + } + //else, must be in this anim! + return animation; + } + + //Not in ANY torsoAnim? SHOULD NEVER HAPPEN +// assert(0); + return -1; +} + +int PM_ValidateAnimRange( const int startFrame, const int endFrame, const float animSpeed ) +{//given a startframe and endframe, see if that lines up with any known animation + animation_t *animations = level.knownAnimFileSets[0].animations; + + for ( int anim = 0; anim < MAX_ANIMATIONS; anim++ ) + { + if ( animSpeed < 0 ) + {//playing backwards + if ( animations[anim].firstFrame == endFrame ) + { + if ( animations[anim].numFrames + animations[anim].firstFrame == startFrame ) + { + //Com_Printf( "valid reverse anim: %s\n", animTable[anim].name ); + return anim; + } + } + } + else + {//playing forwards + if ( animations[anim].firstFrame == startFrame ) + {//This anim starts on this frame + if ( animations[anim].firstFrame + animations[anim].numFrames == endFrame ) + {//This anim ends on this frame + //Com_Printf( "valid forward anim: %s\n", animTable[anim].name ); + return anim; + } + } + } + //else, must not be this anim! + } + + //Not in ANY anim? SHOULD NEVER HAPPEN + Com_Printf( "invalid anim range %d to %d, speed %4.2f\n", startFrame, endFrame, animSpeed ); + return -1; +} +/* +------------------------- +PM_TorsoAnimForFrame +Returns animNumber for current frame +------------------------- +*/ +int PM_TorsoAnimForFrame( gentity_t *ent, int torsoFrame ) +{ + //Must be a valid client + if ( ent->client == NULL ) + return -1; + + //Must have a file index entry + if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) + return -1; + + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + int glaIndex = gi.G2API_GetAnimIndex(&(ent->ghoul2[0])); + + for ( int animation = 0; animation < LEGS_TURN1; animation++ ) //first legs only anim + { + if ( animations[animation].glaIndex != glaIndex ) + { + continue; + } + + if ( animations[animation].firstFrame > torsoFrame ) + {//This anim starts after this frame + continue; + } + + if ( animations[animation].firstFrame + animations[animation].numFrames < torsoFrame ) + {//This anim ends before this frame + continue; + } + //else, must be in this anim! + return animation; + } + + //Not in ANY torsoAnim? SHOULD NEVER HAPPEN +// assert(0); + return -1; +} + +qboolean PM_FinishedCurrentLegsAnim( gentity_t *self ) +{ + int junk, curFrame; + float currentFrame, animSpeed; + + if ( !self->client ) + { + return qtrue; + } + + gi.G2API_GetBoneAnimIndex( &self->ghoul2[self->playerModel], self->rootBone, (cg.time?cg.time:level.time), ¤tFrame, &junk, &junk, &junk, &animSpeed, NULL ); + curFrame = floor( currentFrame ); + + int legsAnim = self->client->ps.legsAnim; + animation_t *animations = level.knownAnimFileSets[self->client->clientInfo.animFileIndex].animations; + + if ( curFrame >= animations[legsAnim].firstFrame + (animations[legsAnim].numFrames - 2) ) + { + return qtrue; + } + + return qfalse; +} + +/* +------------------------- +PM_HasAnimation +------------------------- +*/ + +qboolean PM_HasAnimation( gentity_t *ent, int animation ) +{ + //Must be a valid client + if ( !ent || ent->client == NULL ) + return qfalse; + + //must be a valid anim number + if ( animation < 0 || animation >= MAX_ANIMATIONS ) + { + return qfalse; + } + //Must have a file index entry + if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) + return qfalse; + + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + + //No frames, no anim + if ( animations[animation].numFrames == 0 ) + return qfalse; + + //Has the sequence + return qtrue; +} + +int PM_PickAnim( gentity_t *self, int minAnim, int maxAnim ) +{ + int anim; + int count = 0; + + if ( !self ) + { + return Q_irand(minAnim, maxAnim); + } + + do + { + anim = Q_irand(minAnim, maxAnim); + count++; + } + while ( !PM_HasAnimation( self, anim ) && count < 1000 ); + + return anim; +} + +/* +------------------------- +PM_AnimLength +------------------------- +*/ + +int PM_AnimLength( int index, animNumber_t anim ) +{ + if ( ValidAnimFileIndex( index ) == false ) + return 0; + + return level.knownAnimFileSets[index].animations[anim].numFrames * abs(level.knownAnimFileSets[index].animations[anim].frameLerp); +} + +/* +------------------------- +PM_SetLegsAnimTimer +------------------------- +*/ + +void PM_SetLegsAnimTimer( gentity_t *ent, int *legsAnimTimer, int time ) +{ + *legsAnimTimer = time; + + if ( *legsAnimTimer < 0 && time != -1 ) + {//Cap timer to 0 if was counting down, but let it be -1 if that was intentional + *legsAnimTimer = 0; + } + + if ( !*legsAnimTimer && ent && Q3_TaskIDPending( ent, TID_ANIM_LOWER ) ) + {//Waiting for legsAnimTimer to complete, and it just got set to zero + if ( !Q3_TaskIDPending( ent, TID_ANIM_BOTH) ) + {//Not waiting for top + Q3_TaskIDComplete( ent, TID_ANIM_LOWER ); + } + else + {//Waiting for both to finish before complete + Q3_TaskIDClear( &ent->taskID[TID_ANIM_LOWER] );//Bottom is done, regardless + if ( !Q3_TaskIDPending( ent, TID_ANIM_UPPER) ) + {//top is done and we're done + Q3_TaskIDComplete( ent, TID_ANIM_BOTH ); + } + } + } +} + +/* +------------------------- +PM_SetTorsoAnimTimer +------------------------- +*/ + +void PM_SetTorsoAnimTimer( gentity_t *ent, int *torsoAnimTimer, int time ) +{ + *torsoAnimTimer = time; + + if ( *torsoAnimTimer < 0 && time != -1 ) + {//Cap timer to 0 if was counting down, but let it be -1 if that was intentional + *torsoAnimTimer = 0; + } + + if ( !*torsoAnimTimer && ent && Q3_TaskIDPending( ent, TID_ANIM_UPPER ) ) + {//Waiting for torsoAnimTimer to complete, and it just got set to zero + if ( !Q3_TaskIDPending( ent, TID_ANIM_BOTH) ) + {//Not waiting for bottom + Q3_TaskIDComplete( ent, TID_ANIM_UPPER ); + } + else + {//Waiting for both to finish before complete + Q3_TaskIDClear( &ent->taskID[TID_ANIM_UPPER] );//Top is done, regardless + if ( !Q3_TaskIDPending( ent, TID_ANIM_LOWER) ) + {//lower is done and we're done + Q3_TaskIDComplete( ent, TID_ANIM_BOTH ); + } + } + } +} + +extern qboolean PM_SpinningSaberAnim( int anim ); +extern float saberAnimSpeedMod[NUM_FORCE_POWER_LEVELS]; +void PM_SaberStartTransAnim( int saberAnimLevel, int anim, float *animSpeed, gentity_t *gent ) +{ + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_ROLL_STAB ) + { + if ( g_saberAnimSpeed->value != 1.0f ) + { + *animSpeed *= g_saberAnimSpeed->value; + } + else if ( gent && gent->client && gent->client->ps.weapon == WP_SABER ) + { + if ( gent->client->ps.saber[0].animSpeedScale != 1.0f ) + { + *animSpeed *= gent->client->ps.saber[0].animSpeedScale; + } + if ( gent->client->ps.dualSabers + && gent->client->ps.saber[1].animSpeedScale != 1.0f ) + { + *animSpeed *= gent->client->ps.saber[1].animSpeedScale; + } + } + } + if ( gent + && gent->client + && gent->client->ps.stats[STAT_WEAPONS]&(1<client->ps.dualSabers + && saberAnimLevel == SS_DUAL + && gent->weaponModel[1] ) + {//using a scepter and dual style, slow down anims + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_H7_S7_BR ) + { + *animSpeed *= 0.75; + } + } + if ( gent && gent->client && gent->client->ps.forceRageRecoveryTime > level.time ) + {//rage recovery + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_H1_S1_BR ) + {//animate slower + *animSpeed *= 0.75; + } + } + else if ( gent && gent->NPC && gent->NPC->rank == RANK_CIVILIAN ) + {//grunt reborn + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_R1_TR_S1 ) + {//his fast attacks are slower + if ( !PM_SpinningSaberAnim( anim ) ) + { + *animSpeed *= 0.75; + } + return; + } + } + else if ( gent && gent->client ) + { + if ( gent->client->ps.saber[0].type == SABER_LANCE || gent->client->ps.saber[0].type == SABER_TRIDENT ) + {//FIXME: hack for now - these use the fast anims, but slowed down. Should have own style + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_R1_TR_S1 ) + {//his fast attacks are slower + if ( !PM_SpinningSaberAnim( anim ) ) + { + *animSpeed *= 0.75; + } + return; + } + } + } + + if ( ( anim >= BOTH_T1_BR__R && + anim <= BOTH_T1_BL_TL ) || + ( anim >= BOTH_T3_BR__R && + anim <= BOTH_T3_BL_TL ) || + ( anim >= BOTH_T5_BR__R && + anim <= BOTH_T5_BL_TL ) ) + { + if ( saberAnimLevel == FORCE_LEVEL_1 || saberAnimLevel == FORCE_LEVEL_5 ) + {//FIXME: should not be necc for FORCE_LEVEL_1's + *animSpeed *= 1.5; + } + else if ( saberAnimLevel == FORCE_LEVEL_3 ) + { + *animSpeed *= 0.75; + } + } +} +/* +void PM_SaberStartTransAnim( int anim, int entNum, int saberOffenseLevel, float *animSpeed ) +{ + //check starts + if ( ( anim >= BOTH_S1_S1_T_ && + anim <= BOTH_S1_S1_TR ) || + ( anim >= BOTH_S1_S1_T_ && + anim <= BOTH_S1_S1_TR ) || + ( anim >= BOTH_S3_S1_T_ && + anim <= BOTH_S3_S1_TR ) ) + { + if ( entNum == 0 ) + { + *animSpeed *= saberAnimSpeedMod[FORCE_LEVEL_3]; + } + else + { + *animSpeed *= saberAnimSpeedMod[saberOffenseLevel]; + } + } + //Check transitions + else if ( PM_SpinningSaberAnim( anim ) ) + {//spins stay normal speed + return; + } + else if ( ( anim >= BOTH_T1_BR__R && + anim <= BOTH_T1_BL_TL ) || + ( anim >= BOTH_T2_BR__R && + anim <= BOTH_T2_BL_TL ) || + ( anim >= BOTH_T3_BR__R && + anim <= BOTH_T3_BL_TL ) ) + {//slow down the transitions + if ( entNum == 0 && saberOffenseLevel <= FORCE_LEVEL_2 ) + { + *animSpeed *= saberAnimSpeedMod[saberOffenseLevel]; + } + else + { + *animSpeed *= saberAnimSpeedMod[saberOffenseLevel]/2.0f; + } + } + + return; +} +*/ +extern qboolean player_locked; +extern qboolean MatrixMode; +float PM_GetTimeScaleMod( gentity_t *gent ) +{ + if ( g_timescale->value ) + { + if ( !MatrixMode + && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_START + && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_ATTACK + && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_LAND ) + { + if ( gent && gent->s.clientNum == 0 && !player_locked && gent->client->ps.forcePowersActive&(1<value); + } + else if ( gent && gent->client && gent->client->ps.forcePowersActive&(1<value); + } + } + } + return 1.0f; +} + +static inline qboolean PM_IsHumanoid( CGhoul2Info *ghlInfo ) +{ + char *GLAName; + GLAName = gi.G2API_GetGLAName( ghlInfo ); + assert(GLAName); + + if ( !Q_stricmp( "models/players/_humanoid/_humanoid", GLAName ) ) + { + return qtrue; + } + + return qfalse; +} + +/* +------------------------- +PM_SetAnimFinal +------------------------- +*/ +#define G2_DEBUG_TIMING (0) +void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, + int setAnimParts,int anim,int setAnimFlags, + int *torsoAnimTimer,int *legsAnimTimer, + gentity_t *gent,int blendTime) // default blendTime=350 +{ + +// BASIC SETUP AND SAFETY CHECKING +//================================= + + // If It Is A Busted Entity, Don't Do Anything Here. + //--------------------------------------------------- + if (!gent || !gent->client) + { + return; + } + + // Make Sure This Character Has Such An Anim And A Model + //------------------------------------------------------- + if (anim<0 || anim>=MAX_ANIMATIONS || !ValidAnimFileIndex(gent->client->clientInfo.animFileIndex)) + { + #ifndef FINAL_BUILD + if (g_AnimWarning->integer) + { + if (anim<0 || anim>=MAX_ANIMATIONS) + { + gi.Printf(S_COLOR_RED"PM_SetAnimFinal: Invalid Anim Index (%d)!\n", anim); + } + else + { + gi.Printf(S_COLOR_RED"PM_SetAnimFinal: Invalid Anim File Index (%d)!\n", gent->client->clientInfo.animFileIndex); + } + } + #endif + return; + } + + + // Get Global Time Properties + //---------------------------- + float timeScaleMod = PM_GetTimeScaleMod( gent ); + const int actualTime = (cg.time?cg.time:level.time); + const animation_t* animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; + const animation_t& curAnim = animations[anim]; + + // Make Sure This Character Has Such An Anim And A Model + //------------------------------------------------------- + if (animations[anim].numFrames==0) + { + #ifndef FINAL_BUILD + static int LastAnimWarningNum=0; + if (LastAnimWarningNum!=anim) + { + if ((cg_debugAnim.integer==3) || // 3 = do everyone + (cg_debugAnim.integer==1 && gent->s.number==0) || // 1 = only the player + (cg_debugAnim.integer==2 && gent->s.number!=0) || // 2 = only everyone else + (cg_debugAnim.integer==4 && gent->s.number!=cg_debugAnimTarget.integer) // 4 = specific entnum + ) + { + gi.Printf(S_COLOR_RED"PM_SetAnimFinal: Anim %s does not exist in this model (%s)!\n", animTable[anim].name, gent->NPC_type ); + } + } + LastAnimWarningNum = anim; + #endif + return; + } + + // If It's Not A Ghoul 2 Model, Just Remember The Anims And Stop, Because Everything Beyond This Is Ghoul2 + //--------------------------------------------------------------------------------------------------------- + if (!gi.G2API_HaveWeGhoul2Models(gent->ghoul2)) + { + if (setAnimParts&SETANIM_TORSO) + { + (*torsoAnim) = anim; + } + if (setAnimParts&SETANIM_LEGS) + { + (*legsAnim) = anim; + } + return; + } + + + // Lower Offensive Skill Slows Down The Saber Start Attack Animations + //-------------------------------------------------------------------- + PM_SaberStartTransAnim( gent->client->ps.saberAnimLevel, anim, &timeScaleMod, gent ); + + + +// SETUP VALUES FOR INCOMMING ANIMATION +//====================================== + const bool animFootMove = (PM_WalkingAnim(anim) || PM_RunningAnim(anim) || anim==BOTH_CROUCH1WALK || anim==BOTH_CROUCH1WALKBACK); + const bool animHoldless = (setAnimFlags&SETANIM_FLAG_HOLDLESS)!=0; + const bool animHold = (setAnimFlags&SETANIM_FLAG_HOLD)!=0; + const bool animRestart = (setAnimFlags&SETANIM_FLAG_RESTART)!=0; + const bool animOverride = (setAnimFlags&SETANIM_FLAG_OVERRIDE)!=0; + const bool animSync = (g_synchSplitAnims->integer!=0 && !animRestart); + float animCurrent = (-1.0f); + float animSpeed = (50.0f / curAnim.frameLerp * timeScaleMod); // animSpeed is 1.0 if the frameLerp (ms/frame) is 50 (20 fps). + const float animFPS = (fabsf(curAnim.frameLerp)); + const int animDurMSec = (int)(((curAnim.numFrames - 1) * animFPS) / timeScaleMod); + const int animHoldMSec = ((animHoldless && timeScaleMod==1.0f)?((animDurMSec>1)?(animDurMSec-1):(animFPS)):(animDurMSec)); + int animFlags = (curAnim.loopFrames!=-1)?(BONE_ANIM_OVERRIDE_LOOP):(BONE_ANIM_OVERRIDE_FREEZE); + int animStart = (curAnim.firstFrame); + int animEnd = (curAnim.firstFrame)+(animations[anim].numFrames); + + // If We Have A Blend Timer, Add The Blend Flag + //---------------------------------------------- + if (blendTime > 0) + { + animFlags |= BONE_ANIM_BLEND; + } + + // If Animation Is Going Backwards, Swap Last And First Frames + //------------------------------------------------------------- + if (animSpeed<0.0f) + { +// #ifndef FINAL_BUILD + #if 0 + if (g_AnimWarning->integer==1) + { + if (animFlags&BONE_ANIM_OVERRIDE_LOOP) + { + gi.Printf(S_COLOR_YELLOW"PM_SetAnimFinal: WARNING: Anim (%s) looping backwards!\n", animTable[anim].name); + } + } + #endif + + int temp = animEnd; + animEnd = animStart; + animStart = temp; + blendTime = 0; + } + + // If The Animation Is Walking Or Running, Attempt To Scale The Playback Speed To Match + //-------------------------------------------------------------------------------------- + if (g_noFootSlide->integer + && animFootMove + && !(animSpeed<0.0f) + //FIXME: either read speed from animation.cfg or only do this for NPCs + // for whom we've specifically determined the proper numbers! + && gent->client->NPC_class != CLASS_HOWLER + && gent->client->NPC_class != CLASS_WAMPA + && gent->client->NPC_class != CLASS_GONK + && gent->client->NPC_class != CLASS_HOWLER + && gent->client->NPC_class != CLASS_MOUSE + && gent->client->NPC_class != CLASS_PROBE + && gent->client->NPC_class != CLASS_PROTOCOL + && gent->client->NPC_class != CLASS_R2D2 + && gent->client->NPC_class != CLASS_R5D2 + && gent->client->NPC_class != CLASS_SEEKER) + { + bool Walking = !!PM_WalkingAnim(anim); + bool HasDual = (gent->client->ps.saberAnimLevel==SS_DUAL); + bool HasStaff = (gent->client->ps.saberAnimLevel==SS_STAFF); + float moveSpeedOfAnim = 150.0f;//g_noFootSlideRunScale->value; + + if (anim==BOTH_CROUCH1WALK || anim==BOTH_CROUCH1WALKBACK) + { + moveSpeedOfAnim = 75.0f; + } + else + { + if (gent->client->NPC_class == CLASS_HAZARD_TROOPER) + { + moveSpeedOfAnim = 50.0f; + } + else if (gent->client->NPC_class == CLASS_RANCOR) + { + moveSpeedOfAnim = 173.0f; + } + else + { + if (Walking) + { + if (HasDual || HasStaff) + { + moveSpeedOfAnim = 100.0f; + } + else + { + moveSpeedOfAnim = 50.0f;// g_noFootSlideWalkScale->value; + } + } + else + { + if (HasStaff) + { + moveSpeedOfAnim = 250.0f; + } + else + { + moveSpeedOfAnim = 150.0f; + } + } + } + } + + + + + + + animSpeed *= (gent->resultspeed/moveSpeedOfAnim); + if (animSpeed<0.01f) + { + animSpeed = 0.01f; + } + + // Make Sure Not To Play Too Fast An Anim + //---------------------------------------- + float maxPlaybackSpeed = (1.5f * timeScaleMod); + if (animSpeed>maxPlaybackSpeed) + { + animSpeed = maxPlaybackSpeed; + } + } + + +// GET VALUES FOR EXISTING BODY ANIMATION +//========================================== + float bodySpeed = 0.0f; + float bodyCurrent = 0.0f; + int bodyStart = 0; + int bodyEnd = 0; + int bodyFlags = 0; + int bodyAnim = (*legsAnim); + int bodyBone = (gent->rootBone); + bool bodyTimerOn = ((*legsAnimTimer>0) || (*legsAnimTimer)==-1); + bool bodyPlay = ((setAnimParts&SETANIM_LEGS) && (bodyBone!=-1) && (animOverride || !bodyTimerOn)); + bool bodyAnimating = !!gi.G2API_GetBoneAnimIndex(&gent->ghoul2[gent->playerModel], bodyBone, actualTime, &bodyCurrent, &bodyStart, &bodyEnd, &bodyFlags, &bodySpeed, NULL); + bool bodyOnAnimNow = (bodyAnimating && bodyAnim==anim && bodyStart==animStart && bodyEnd==animEnd); + bool bodyMatchTorsFrame = false; + + +// GET VALUES FOR EXISTING TORSO ANIMATION +//=========================================== + float torsSpeed = 0.0f; + float torsCurrent = 0.0f; + int torsStart = 0; + int torsEnd = 0; + int torsFlags = 0; + int torsAnim = (*torsoAnim); + int torsBone = (gent->lowerLumbarBone); + bool torsTimerOn = ((*torsoAnimTimer)>0 || (*torsoAnimTimer)==-1); + bool torsPlay = (gent->client->NPC_class!=CLASS_RANCOR && (setAnimParts&SETANIM_TORSO) && (torsBone!=-1) && (animOverride || !torsTimerOn)); + bool torsAnimating = !!gi.G2API_GetBoneAnimIndex(&gent->ghoul2[gent->playerModel], torsBone, actualTime, &torsCurrent, &torsStart, &torsEnd, &torsFlags, &torsSpeed, NULL); + bool torsOnAnimNow = (torsAnimating && torsAnim==anim && torsStart==animStart && torsEnd==animEnd); + bool torsMatchBodyFrame = false; + + +// APPLY SYNC TO TORSO +//===================== + if (animSync && torsPlay && !bodyPlay && bodyOnAnimNow && (!torsOnAnimNow || torsCurrent!=bodyCurrent)) + { + torsMatchBodyFrame = true; + animCurrent = bodyCurrent; + } + if (animSync && bodyPlay && !torsPlay && torsOnAnimNow && (!bodyOnAnimNow || bodyCurrent!=torsCurrent)) + { + bodyMatchTorsFrame = true; + animCurrent = torsCurrent; + } + + // If Already Doing These Exact Parameters, Then Don't Play + //---------------------------------------------------------- + if (!animRestart) + { + torsPlay &= !(torsOnAnimNow && torsSpeed==animSpeed && !torsMatchBodyFrame); + bodyPlay &= !(bodyOnAnimNow && bodySpeed==animSpeed && !bodyMatchTorsFrame); + } + +#ifndef FINAL_BUILD + if ((cg_debugAnim.integer==3) || // 3 = do everyone + (cg_debugAnim.integer==1 && gent->s.number==0) || // 1 = only the player + (cg_debugAnim.integer==2 && gent->s.number!=0) || // 2 = only everyone else + (cg_debugAnim.integer==4 && gent->s.number!=cg_debugAnimTarget.integer) // 4 = specific entnum + ) + { + if (bodyPlay || torsPlay) + { + char* entName = gent->targetname; + char* location; + + // Select Entity Name + //-------------------- + if (!entName || !entName[0]) + { + entName = gent->NPC_targetname; + } + if (!entName || !entName[0]) + { + entName = gent->NPC_type; + } + if (!entName || !entName[0]) + { + entName = gent->classname; + } + if (!entName || !entName[0]) + { + entName = "UNKNOWN"; + } + + // Select Play Location + //---------------------- + if (bodyPlay && torsPlay) + { + location = "BOTH "; + } + else if (bodyPlay) + { + location = "LEGS "; + } + else + { + location = "TORSO"; + } + + // Print It! + //----------- + Com_Printf("[%10d] ent[%3d-%18s] %s anim[%3d] - %s\n", + actualTime, + gent->s.number, + entName, + location, + anim, + animTable[anim].name ); + } + } +#endif + + +// PLAY ON THE TORSO +//======================== + if (torsPlay) + { + *torsoAnim = anim; + float oldAnimCurrent = animCurrent; + if (animCurrent!=bodyCurrent && torsOnAnimNow && !animRestart && !torsMatchBodyFrame) + { + animCurrent = torsCurrent; + } + + gi.G2API_SetAnimIndex(&gent->ghoul2[gent->playerModel], curAnim.glaIndex); + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], torsBone, + animStart, + animEnd, + (torsOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), + animSpeed, + actualTime, + animCurrent, + blendTime); + + if (gent->motionBone!=-1) + { + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->motionBone, + animStart, + animEnd, + (torsOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), + animSpeed, + actualTime, + animCurrent, + blendTime); + } + + animCurrent = oldAnimCurrent; + + // If This Animation Is To Be Locked And Held, Calculate The Duration And Set The Timer + //-------------------------------------------------------------------------------------- + if (animHold || animHoldless) + { + PM_SetTorsoAnimTimer(gent, torsoAnimTimer, animHoldMSec); + } + } + +// PLAY ON THE WHOLE BODY +//======================== + if (bodyPlay) + { + *legsAnim = anim; + + if (bodyOnAnimNow && !animRestart && !bodyMatchTorsFrame) + { + animCurrent = bodyCurrent; + } + + gi.G2API_SetAnimIndex(&gent->ghoul2[gent->playerModel], curAnim.glaIndex); + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], bodyBone, + animStart, + animEnd, + (bodyOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), + animSpeed, + actualTime, + animCurrent, + blendTime); + + // If This Animation Is To Be Locked And Held, Calculate The Duration And Set The Timer + //-------------------------------------------------------------------------------------- + if (animHold || animHoldless) + { + PM_SetLegsAnimTimer(gent, legsAnimTimer, animHoldMSec); + } + } + + + + + +// PRINT SOME DEBUG TEXT OF EXISTING VALUES +//========================================== + if (false) + { + gi.Printf("PLAYANIM: (%3d) Speed(%4.2f) ", anim, animSpeed); + if (bodyAnimating) + { + gi.Printf("BODY: (%4.2f) (%4.2f) ", bodyCurrent, bodySpeed); + } + else + { + gi.Printf(" "); + } + if (torsAnimating) + { + gi.Printf("TORS: (%4.2f) (%4.2f)\n", torsCurrent, torsSpeed); + } + else + { + gi.Printf("\n"); + } + } +} + + + +void PM_SetAnim(pmove_t *pm,int setAnimParts,int anim,int setAnimFlags, int blendTime) +{ // FIXME : once torsoAnim and legsAnim are in the same structure for NPC and Players + // rename PM_SetAnimFinal to PM_SetAnim and have both NPC and Players call PM_SetAnim + + if ( pm->ps->pm_type >= PM_DEAD ) + {//FIXME: sometimes we'll want to set anims when your dead... twitches, impacts, etc. + return; + } + + if ( pm->gent == NULL ) + { + return; + } + + if ( !pm->gent || pm->gent->health > 0 ) + {//don't lock anims if the guy is dead + if ( pm->ps->torsoAnimTimer + && PM_LockedAnim( pm->ps->torsoAnim ) + && !PM_LockedAnim( anim ) ) + {//nothing can override these special anims + setAnimParts &= ~SETANIM_TORSO; + } + + if ( pm->ps->legsAnimTimer + && PM_LockedAnim( pm->ps->legsAnim ) + && !PM_LockedAnim( anim ) ) + {//nothing can override these special anims + setAnimParts &= ~SETANIM_LEGS; + } + } + + if ( !setAnimParts ) + { + return; + } + + if (setAnimFlags&SETANIM_FLAG_OVERRIDE) + { +// pm->ps->animationTimer = 0; + + if (setAnimParts & SETANIM_TORSO) + { + if( (setAnimFlags & SETANIM_FLAG_RESTART) || pm->ps->torsoAnim != anim ) + { + PM_SetTorsoAnimTimer( pm->gent, &pm->ps->torsoAnimTimer, 0 ); + } + } + if (setAnimParts & SETANIM_LEGS) + { + if( (setAnimFlags & SETANIM_FLAG_RESTART) || pm->ps->legsAnim != anim ) + { + PM_SetLegsAnimTimer( pm->gent, &pm->ps->legsAnimTimer, 0 ); + } + } + } + + PM_SetAnimFinal(&pm->ps->torsoAnim,&pm->ps->legsAnim,setAnimParts,anim,setAnimFlags,&pm->ps->torsoAnimTimer,&pm->ps->legsAnimTimer,&g_entities[pm->ps->clientNum],blendTime);//was pm->gent +} + +bool TorsoAgainstWindTest( gentity_t* ent ) +{ + if (ent&&//valid ent + ent->client&&//a client + (ent->client->ps.weapon!=WP_SABER||ent->client->ps.saberMove==LS_READY)&&//either not holding a saber or the saber is in the ready pose + (ent->s.numbercurrentOrigin) && + gi.WE_IsOutside(ent->currentOrigin) ) + { + if (Q_stricmp(level.mapname, "t2_wedge")!=0) + { + vec3_t fwd; + vec3_t windDir; + if (gi.WE_GetWindVector(windDir, ent->currentOrigin)) + { + VectorScale(windDir, -1.0f, windDir); + AngleVectors(pm->gent->currentAngles, fwd, 0, 0); + if (DotProduct(fwd, windDir)>0.65f) + { + if (ent->client && ent->client->ps.torsoAnim!=BOTH_WIND) + { + NPC_SetAnim(ent, SETANIM_TORSO, BOTH_WIND, SETANIM_FLAG_NORMAL, 400); + } + return true; + } + } + } + } + return false; +} + +/* +------------------------- +PM_TorsoAnimLightsaber +------------------------- +*/ + + +// Note that this function is intended to set the animation for the player, but +// only does idle-ish anims. Anything that has a timer associated, such as attacks and blocks, +// are set by PM_WeaponLightsaber() + +extern Vehicle_t *G_IsRidingVehicle( gentity_t *pEnt ); +extern qboolean PM_LandingAnim( int anim ); +extern qboolean PM_JumpingAnim( int anim ); +qboolean PM_InCartwheel( int anim ); +void PM_TorsoAnimLightsaber() +{ + // ********************************************************* + // WEAPON_READY + // ********************************************************* + if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + {//holding an enemy aloft with force-grip + return; + } + + if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_1 ) + {//lightning + return; + } + + if ( pm->ps->forcePowersActive&(1<ps->saber[0].blade[0].active + && pm->ps->saber[0].blade[0].length < 3 + && !(pm->ps->saberEventFlags&SEF_HITWALL) + && pm->ps->weaponstate == WEAPON_RAISING ) + { + if (!G_IsRidingVehicle(pm->gent)) + { + PM_SetSaberMove(LS_DRAW); + } + return; + } + else if ( !pm->ps->SaberActive() && pm->ps->SaberLength() ) + { + if (!G_IsRidingVehicle(pm->gent)) + { + PM_SetSaberMove(LS_PUTAWAY); + } + return; + } + + if (pm->ps->weaponTime > 0) + { // weapon is already busy. + if ( pm->ps->torsoAnim == BOTH_TOSS1 + || pm->ps->torsoAnim == BOTH_TOSS2 ) + {//in toss + if ( !pm->ps->torsoAnimTimer ) + {//weird, get out of it, I guess + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + } + return; + } + + if ( pm->ps->weaponstate == WEAPON_READY || + pm->ps->weaponstate == WEAPON_CHARGING || + pm->ps->weaponstate == WEAPON_CHARGING_ALT ) + {//ready + if ( pm->ps->weapon == WP_SABER && (pm->ps->SaberLength()) ) + {//saber is on + // Select the proper idle Lightsaber attack move from the chart. + if (pm->ps->saberMove > LS_READY && pm->ps->saberMove < LS_MOVE_MAX) + { + PM_SetSaberMove(saberMoveData[pm->ps->saberMove].chain_idle); + } + else + { + if ( PM_JumpingAnim( pm->ps->legsAnim ) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) + || PM_FlippingAnim( pm->ps->legsAnim )) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + if ( (PM_RunningAnim( pm->ps->legsAnim ) + || pm->ps->legsAnim == BOTH_WALK_STAFF + || pm->ps->legsAnim == BOTH_WALK_DUAL + || pm->ps->legsAnim == BOTH_WALKBACK_STAFF + || pm->ps->legsAnim == BOTH_WALKBACK_DUAL ) + && pm->ps->saberBlockingTime < cg.time ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetSaberMove(LS_READY); + } + } + } + } + /* + if ( PM_JumpingAnim( pm->ps->legsAnim ) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) + || PM_FlippingAnim( pm->ps->legsAnim )) + {//jumping, landing cartwheel, flipping + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetSaberMove( LS_READY ); + } + */ + } + else if (TorsoAgainstWindTest(pm->gent)) + { + } + else if( pm->ps->legsAnim == BOTH_RUN1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_RUN2 )//&& pm->ps->saberAnimLevel != SS_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN2,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_RUN_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_STAFF,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_RUN_DUAL ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_DUAL,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_WALK1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_WALK2 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK2,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_WALK_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_STAFF,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_WALK_DUAL ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_DUAL,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_CROUCH1IDLE && pm->ps->clientNum != 0 )//player falls through + { + //??? Why nothing? What if you were running??? + //PM_SetAnim(pm,SETANIM_TORSO,BOTH_CROUCH1IDLE,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_JUMP1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_JUMP1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else + {//Used to default to both_stand1 which is an arms-down anim +// PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 + // Select the next proper pose for the lightsaber assuming that there are no attacks. + if (pm->ps->saberMove > LS_READY && pm->ps->saberMove < LS_MOVE_MAX) + { + PM_SetSaberMove(saberMoveData[pm->ps->saberMove].chain_idle); + } + else + { + if ( PM_JumpingAnim( pm->ps->legsAnim ) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) + || PM_FlippingAnim( pm->ps->legsAnim )) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + PM_SetSaberMove(LS_READY); + } + } + } + } + } + + // ********************************************************* + // WEAPON_IDLE + // ********************************************************* + + else if ( pm->ps->weaponstate == WEAPON_IDLE ) + { + if (TorsoAgainstWindTest(pm->gent)) + { + } + else if( pm->ps->legsAnim == BOTH_GUARD_LOOKAROUND1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_LOOKAROUND1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_GUARD_IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_IDLE1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND1IDLE1 + || pm->ps->legsAnim == BOTH_STAND2IDLE1 + || pm->ps->legsAnim == BOTH_STAND2IDLE2 + || pm->ps->legsAnim == BOTH_STAND3IDLE1 + || pm->ps->legsAnim == BOTH_STAND5IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND2TO4 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND2TO4,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND4TO2 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4TO2,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND4 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else + { +// This is now set in SetSaberMove. + // Idle for Lightsaber + if ( pm->gent && pm->gent->client ) + { +// pm->gent->client->saberTrail.inAction = qfalse; + } + + qboolean saberInAir = qtrue; + if ( pm->ps->saberInFlight ) + {//guiding saber + if ( PM_SaberInBrokenParry( pm->ps->saberMove ) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim( pm->ps->torsoAnim ) ) + {//we're stuck in a broken parry + saberInAir = qfalse; + } + if ( pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0 )//player is 0 + {// + if ( &g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY ) + {//fell to the ground and we're not trying to pull it back + saberInAir = qfalse; + } + } + } + if ( pm->ps->saberInFlight + && saberInAir + && (!pm->ps->dualSabers || !pm->ps->saber[1].Active())) + { + if ( !PM_ForceAnim( pm->ps->torsoAnim ) + || pm->ps->torsoAnimTimer < 300 ) + {//don't interrupt a force power anim + if ( pm->ps->torsoAnim != BOTH_LOSE_SABER + || !pm->ps->torsoAnimTimer ) + { + PM_SetAnim( pm, SETANIM_TORSO,BOTH_SABERPULL,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + } + } + else + {//saber is on + // Idle for Lightsaber + if ( pm->gent && pm->gent->client ) + { + if ( !G_InCinematicSaberAnim( pm->gent ) ) + { + pm->gent->client->ps.SaberDeactivateTrail( 0 ); + } + } + // Idle for idle/ready Lightsaber +// PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONIDLE1 + // Select the proper idle Lightsaber attack move from the chart. + if (pm->ps->saberMove > LS_READY && pm->ps->saberMove < LS_MOVE_MAX) + { + PM_SetSaberMove(saberMoveData[pm->ps->saberMove].chain_idle); + } + else + { + if ( PM_JumpingAnim( pm->ps->legsAnim ) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) + || PM_FlippingAnim( pm->ps->legsAnim )) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + if ( (PM_RunningAnim( pm->ps->legsAnim ) + || pm->ps->legsAnim == BOTH_WALK_STAFF + || pm->ps->legsAnim == BOTH_WALK_DUAL + || pm->ps->legsAnim == BOTH_WALKBACK_STAFF + || pm->ps->legsAnim == BOTH_WALKBACK_DUAL ) + && pm->ps->saberBlockingTime < cg.time ) + {//running w/1-handed weapon uses full-body anim + int setFlags = SETANIM_FLAG_NORMAL; + if ( PM_LandingAnim( pm->ps->torsoAnim ) ) + { + setFlags = SETANIM_FLAG_OVERRIDE; + } + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,setFlags); + } + else + { + PM_SetSaberMove(LS_READY); + } + } + } + } + } + } + } +} + + + + +/* +------------------------- +PM_TorsoAnimation +------------------------- +*/ + +void PM_TorsoAnimation( void ) +{//FIXME: Write a much smarter and more appropriate anim picking routine logic... +// int oldAnim; + if ( PM_InKnockDown( pm->ps ) || PM_InRoll( pm->ps )) + {//in knockdown + return; + } + + if ( (pm->ps->eFlags&EF_HELD_BY_WAMPA) ) + { + return; + } + + if ( (pm->ps->eFlags&EF_FORCE_DRAINED) ) + {//being drained + //PM_SetAnim( pm, SETANIM_TORSO, BOTH_HUGGEE1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + return; + } + if ( (pm->ps->forcePowersActive&(1<ps->forceDrainEntityNum < ENTITYNUM_WORLD ) + {//draining + //PM_SetAnim( pm, SETANIM_TORSO, BOTH_HUGGER1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + return; + } + + if( pm->gent && pm->gent->NPC && (pm->gent->NPC->scriptFlags & SCF_FORCED_MARCH) ) + { + return; + } + + if(pm->gent != NULL && pm->gent->client) + { + pm->gent->client->renderInfo.torsoFpsMod = 1.0f; + } + + if ( pm->gent && pm->ps && pm->ps->eFlags & EF_LOCKED_TO_WEAPON ) + { + if ( pm->gent->owner && pm->gent->owner->e_UseFunc == useF_emplaced_gun_use )//ugly way to tell, but... + {//full body + PM_SetAnim(pm,SETANIM_BOTH,BOTH_GUNSIT1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + else + {//torso + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUNSIT1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + return; + } +/* else if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE && pm->ps->clientNum < MAX_CLIENTS && (m_pVehicleInfo[((CVehicleNPC *)pm->gent->NPC)->m_iVehicleTypeID].numHands == 2 || g_speederControlScheme->value == 2) ) + {//can't look around + PM_SetAnim(pm,SETANIM_TORSO,m_pVehicleInfo[((CVehicleNPC *)pm->gent->NPC)->m_iVehicleTypeID].riderAnim,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); + return; + }*/ + + if ( pm->ps->taunting > level.time ) + { + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ALORA ) + { + PM_SetAnim(pm,SETANIM_BOTH,BOTH_ALORA_TAUNT,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + else if ( pm->ps->weapon == WP_SABER && pm->ps->saberAnimLevel == SS_DUAL && PM_HasAnimation( pm->gent, BOTH_DUAL_TAUNT ) ) + { + PM_SetAnim(pm,SETANIM_BOTH,BOTH_DUAL_TAUNT,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + else if ( pm->ps->weapon == WP_SABER + && pm->ps->saberAnimLevel == SS_STAFF )//pm->ps->saber[0].type == SABER_STAFF ) + {//turn on the blades + if ( PM_HasAnimation( pm->gent, BOTH_STAFF_TAUNT ) ) + { + PM_SetAnim(pm,SETANIM_BOTH,BOTH_STAFF_TAUNT,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + /* + else + { + if ( !pm->ps->saber[0].blade[0].active ) + {//first blade is off + //turn it on + pm->ps->SaberBladeActivate( 0, 0, qtrue ); + if ( !pm->ps->saber[0].blade[1].active ) + {//second blade is also off, extend time of this taunt so we have enough time to turn them both on + pm->ps->taunting = level.time + 3000; + } + } + else if ( (pm->ps->taunting - level.time) < 1500 ) + {//only 1500ms left in taunt + if ( !pm->ps->saber[0].blade[1].active ) + {//second blade is off + //turn it on + pm->ps->SaberBladeActivate( 0, 1, qtrue ); + } + } + //pose + PM_SetAnim(pm,SETANIM_BOTH,BOTH_SABERSTAFF_STANCE,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); + pm->ps->torsoAnimTimer = pm->ps->legsAnimTimer = (pm->ps->taunting - level.time); + } + */ + } + else if ( PM_HasAnimation( pm->gent, BOTH_GESTURE1 ) ) + { + PM_SetAnim(pm,SETANIM_BOTH,BOTH_GESTURE1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + pm->gent->client->ps.SaberActivateTrail( 100 ); + //FIXME: will this reset? + //FIXME: force-control (yellow glow) effect on hand and saber? + } + else + { + //PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE1,SETANIM_FLAG_NORMAL); + } + return; + } + + if (pm->ps->weapon == WP_SABER ) // WP_LIGHTSABER + { + qboolean saberInAir = qfalse; + if ( pm->ps->SaberLength() && !pm->ps->saberInFlight ) + { + PM_TorsoAnimLightsaber(); + } + else + { + if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + {//holding an enemy aloft with force-grip + return; + } + if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_1 ) + {//lightning + return; + } + if ( pm->ps->forcePowersActive&(1<ps->saberMove ) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim( pm->ps->torsoAnim ) ) + {//we're stuck in a broken parry + PM_TorsoAnimLightsaber(); + } + else + { + if ( pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0 )//player is 0 + {// + if ( &g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY ) + {//fell to the ground and we're not trying to pull it back + saberInAir = qfalse; + } + } + + if ( pm->ps->saberInFlight + && saberInAir + && (!pm->ps->dualSabers //not using 2 sabers + || !pm->ps->saber[1].Active() //left one off + || pm->ps->torsoAnim == BOTH_SABERDUAL_STANCE//not attacking + || pm->ps->torsoAnim == BOTH_SABERPULL//not attacking + || pm->ps->torsoAnim == BOTH_STAND1//not attacking + || PM_RunningAnim( pm->ps->torsoAnim ) //not attacking + || PM_WalkingAnim( pm->ps->torsoAnim ) //not attacking + || PM_JumpingAnim( pm->ps->torsoAnim )//not attacking + || PM_SwimmingAnim( pm->ps->torsoAnim ) )//not attacking + ) + { + if ( !PM_ForceAnim( pm->ps->torsoAnim ) || pm->ps->torsoAnimTimer < 300 ) + {//don't interrupt a force power anim + if ( pm->ps->torsoAnim != BOTH_LOSE_SABER + || !pm->ps->torsoAnimTimer ) + { + PM_SetAnim( pm, SETANIM_TORSO,BOTH_SABERPULL,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + } + } + else + { + if ( PM_InSlopeAnim( pm->ps->legsAnim ) ) + {//HMM... this probably breaks the saber putaway and select anims + if ( pm->ps->SaberLength() > 0 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND2,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + } + } + } + } + + if (pm->ps->weaponTime<= 0 && (pm->ps->saberMove==LS_READY || pm->ps->SaberLength()==0) && !saberInAir) + { + TorsoAgainstWindTest(pm->gent); + } + return; + } + + if ( PM_ForceAnim( pm->ps->torsoAnim ) + && pm->ps->torsoAnimTimer > 0 ) + {//in a force anim, don't do a stand anim + return; + } + + + qboolean weaponBusy = qfalse; + + if ( pm->ps->weapon == WP_NONE ) + { + weaponBusy = qfalse; + } + else if ( pm->ps->weaponstate == WEAPON_FIRING || pm->ps->weaponstate == WEAPON_CHARGING || pm->ps->weaponstate == WEAPON_CHARGING_ALT ) + { + weaponBusy = qtrue; + } + else if ( pm->ps->lastShotTime > level.time - 3000 ) + { + weaponBusy = qtrue; + } + else if ( pm->ps->weaponTime > 0 ) + { + weaponBusy = qtrue; + } + else if ( pm->gent && pm->gent->client->fireDelay > 0 ) + { + weaponBusy = qtrue; + } + else if ( TorsoAgainstWindTest(pm->gent) ) + { + return; + } + else if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.zoomTime > cg.time - 5000 ) + {//if we used binoculars recently, aim weapon + weaponBusy = qtrue; + pm->ps->weaponstate = WEAPON_IDLE; + } + else if ( pm->ps->pm_flags & PMF_DUCKED ) + {//ducking is considered on alert... plus looks stupid to have arms hanging down when crouched + weaponBusy = qtrue; + } + + if ( pm->ps->weapon == WP_NONE || + pm->ps->weaponstate == WEAPON_READY || + pm->ps->weaponstate == WEAPON_CHARGING || + pm->ps->weaponstate == WEAPON_CHARGING_ALT ) + { + if ( pm->ps->weapon == WP_SABER && pm->ps->SaberLength() ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 + } + else if( pm->ps->legsAnim == BOTH_RUN1 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_RUN2 && !weaponBusy )//&& pm->ps->saberAnimLevel != SS_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN2,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_RUN4 && !weaponBusy )//&& pm->ps->saberAnimLevel != SS_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN4,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_RUN_STAFF && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_STAFF,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_RUN_DUAL && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_DUAL,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_WALK1 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_WALK2 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK2,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_WALK_STAFF && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_STAFF,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_WALK_DUAL&& !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_DUAL,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_CROUCH1IDLE && pm->ps->clientNum != 0 )//player falls through + { + //??? Why nothing? What if you were running??? + //PM_SetAnim(pm,SETANIM_TORSO,BOTH_CROUCH1IDLE,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_JUMP1 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_JUMP1,SETANIM_FLAG_NORMAL, 100); // Only blend over 100ms + } + else if( pm->ps->legsAnim == BOTH_SWIM_IDLE1 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIM_IDLE1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_SWIMFORWARD && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIMFORWARD,SETANIM_FLAG_NORMAL); + } + else if ( pm->ps->weapon == WP_NONE ) + { + int legsAnim = pm->ps->legsAnim; + /* + if ( PM_RollingAnim( legsAnim ) || + PM_FlippingAnim( legsAnim ) || + PM_JumpingAnim( legsAnim ) || + PM_PainAnim( legsAnim ) || + PM_SwimmingAnim( legsAnim ) ) + */ + { + PM_SetAnim(pm, SETANIM_TORSO, legsAnim, SETANIM_FLAG_NORMAL ); + } + } + else + {//Used to default to both_stand1 which is an arms-down anim + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else if ( pm->gent != NULL + && (pm->gent->s.numbergent)) + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT ) + {//PLayer- temp hack for weapon frame + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + {//ignore + } + else if ( pm->ps->weapon == WP_MELEE ) + {//hehe + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + else if ( PM_InSpecialJump( pm->ps->legsAnim ) ) + {//use legs anim + //FIXME: or just use whatever's currently playing? + //PM_SetAnim( pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL ); + } + else + { + switch(pm->ps->weapon) + { + // ******************************************************** + case WP_SABER: // WP_LIGHTSABER + // Ready pose for Lightsaber +// PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 + // Select the next proper pose for the lightsaber assuming that there are no attacks. + if (pm->ps->saberMove > LS_NONE && pm->ps->saberMove < LS_MOVE_MAX) + { + PM_SetSaberMove(saberMoveData[pm->ps->saberMove].chain_idle); + } + break; + // ******************************************************** + + case WP_BRYAR_PISTOL: + //FIXME: if recently fired, hold the ready! + if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + break; + case WP_BLASTER_PISTOL: + if ( pm->gent + && pm->gent->weaponModel[1] > 0 ) + {//dual pistols + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUNSIT1,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + } + } + else + {//single pistols + if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + } + break; + case WP_NONE: + //NOTE: should never get here + break; + case WP_MELEE: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + {//ignore + } + else if ( pm->gent && pm->gent->client && !PM_DroidMelee( pm->gent->client->NPC_class ) ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + break; + case WP_TUSKEN_STAFF: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND3, SETANIM_FLAG_NORMAL); + } + break; + + case WP_NOGHRI_STICK: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + //PM_SetAnim(pm,SETANIM_LEGS,BOTH_ATTACK2,SETANIM_FLAG_NORMAL); + break; + + case WP_BLASTER: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + //PM_SetAnim(pm,SETANIM_LEGS,BOTH_ATTACK2,SETANIM_FLAG_NORMAL); + break; + case WP_DISRUPTOR: + case WP_TUSKEN_RIFLE: + if ( (pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT) + || PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running sniper weapon uses normal ready + if ( pm->ps->clientNum ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + } + else + { + if ( pm->ps->clientNum ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD );//TORSO_WEAPONREADY4//SETANIM_FLAG_RESTART| + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL ); + } + } + break; + case WP_BOT_LASER: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + break; + case WP_THERMAL: + if ( pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT + && (PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim )) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && (pm->ps->weaponstate == WEAPON_CHARGING || pm->ps->weaponstate == WEAPON_CHARGING_ALT) ) + {//player pulling back to throw + if ( PM_StandingAnim( pm->ps->legsAnim ) ) + { + PM_SetAnim( pm, SETANIM_LEGS, BOTH_THERMAL_READY, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + else if ( pm->ps->legsAnim == BOTH_THERMAL_READY ) + {//sigh... hold it so pm_footsteps doesn't override + if ( pm->ps->legsAnimTimer < 100 ) + { + pm->ps->legsAnimTimer = 100; + } + } + PM_SetAnim( pm, SETANIM_TORSO, BOTH_THERMAL_READY, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + else + { + if ( weaponBusy ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY10, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + } + } + } + break; + case WP_REPEATER: + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_GALAKMECH ) + {// + if ( pm->gent->alt_fire ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY1,SETANIM_FLAG_NORMAL); + } + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + break; + case WP_TRIP_MINE: + case WP_DET_PACK: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( weaponBusy ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + } + } + break; + default: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + break; + } + } + } + } + else if ( pm->ps->weaponstate == WEAPON_IDLE ) + { + if( pm->ps->legsAnim == BOTH_GUARD_LOOKAROUND1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_LOOKAROUND1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_GUARD_IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_IDLE1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_STAND1IDLE1 + || pm->ps->legsAnim == BOTH_STAND2IDLE1 + || pm->ps->legsAnim == BOTH_STAND2IDLE2 + || pm->ps->legsAnim == BOTH_STAND3IDLE1 + || pm->ps->legsAnim == BOTH_STAND5IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND2TO4 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND2TO4,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_STAND4TO2 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4TO2,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_STAND4 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_SWIM_IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIM_IDLE1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_SWIMFORWARD ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIMFORWARD,SETANIM_FLAG_NORMAL); + } + else if ( PM_InSpecialJump( pm->ps->legsAnim ) ) + {//use legs anim + //FIXME: or just use whatever's currently playing? + //PM_SetAnim( pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL ); + } + else if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + if ( !weaponBusy + && pm->ps->weapon != WP_BOWCASTER + && pm->ps->weapon != WP_REPEATER + && pm->ps->weapon != WP_FLECHETTE + && pm->ps->weapon != WP_ROCKET_LAUNCHER + && pm->ps->weapon != WP_CONCUSSION + && ( PM_RunningAnim( pm->ps->legsAnim ) + || (PM_WalkingAnim( pm->ps->legsAnim ) && (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) ) + {//running w/1-handed or light 2-handed weapon uses full-body anim if you're not using the weapon right now + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + switch ( pm->ps->weapon ) + { + // ******************************************************** + case WP_SABER: // WP_LIGHTSABER + // Shouldn't get here, should go to TorsoAnimLightsaber + break; + // ******************************************************** + + case WP_BRYAR_PISTOL: + if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_NORMAL); + } + break; + case WP_BLASTER_PISTOL: + if ( pm->gent + && pm->gent->weaponModel[1] > 0 ) + {//dual pistols + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUNSIT1,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + else + {//single pistols + if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_NORMAL); + } + } + break; + + case WP_NONE: + //NOTE: should never get here + break; + + case WP_MELEE: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + {//ignore + } + else if ( pm->gent && pm->gent->client && !PM_DroidMelee( pm->gent->client->NPC_class ) ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + break; + + case WP_TUSKEN_STAFF: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND3, SETANIM_FLAG_NORMAL); + } + break; + + case WP_NOGHRI_STICK: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + + case WP_BLASTER: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + + case WP_DISRUPTOR: + case WP_TUSKEN_RIFLE: + if ( (pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT) + || PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running sniper weapon uses normal ready + if ( pm->ps->clientNum ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + } + else + { + if ( pm->ps->clientNum ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL ); + } + } + break; + + case WP_BOT_LASER: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + break; + + case WP_THERMAL: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( weaponBusy ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONIDLE10, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + } + } + break; + + case WP_REPEATER: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + case WP_TRIP_MINE: + case WP_DET_PACK: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( weaponBusy ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONIDLE3, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + } + } + break; + + default: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + } + } + } + } +} + +//========================================================================= +// Anim checking utils +//========================================================================= + +int PM_GetTurnAnim( gentity_t *gent, int anim ) +{ + if ( !gent ) + { + return -1; + } + + switch( anim ) + { + case BOTH_STAND1: //# Standing idle: no weapon: hands down + case BOTH_STAND1IDLE1: //# Random standing idle + case BOTH_STAND2: //# Standing idle with a weapon + case BOTH_SABERFAST_STANCE: + case BOTH_SABERSLOW_STANCE: + case BOTH_STAND2IDLE1: //# Random standing idle + case BOTH_STAND2IDLE2: //# Random standing idle + case BOTH_STAND3: //# Standing hands behind back: at ease: etc. + case BOTH_STAND3IDLE1: //# Random standing idle + case BOTH_STAND4: //# two handed: gun down: relaxed stand + case BOTH_STAND5: //# standing idle, no weapon, hand down, back straight + case BOTH_STAND5IDLE1: //# Random standing idle + case BOTH_STAND6: //# one handed: gun at side: relaxed stand + case BOTH_STAND2TO4: //# Transition from stand2 to stand4 + case BOTH_STAND4TO2: //# Transition from stand4 to stand2 + case BOTH_GESTURE1: //# Generic gesture: non-specific + case BOTH_GESTURE2: //# Generic gesture: non-specific + case BOTH_TALK1: //# Generic talk anim + case BOTH_TALK2: //# Generic talk anim + if ( PM_HasAnimation( gent, LEGS_TURN1 ) ) + { + return LEGS_TURN1; + } + else + { + return -1; + } + break; + case BOTH_ATTACK1: //# Attack with generic 1-handed weapon + case BOTH_ATTACK2: //# Attack with generic 2-handed weapon + case BOTH_ATTACK3: //# Attack with heavy 2-handed weapon + case BOTH_ATTACK4: //# Attack with ??? + case BOTH_MELEE1: //# First melee attack + case BOTH_MELEE2: //# Second melee attack + case BOTH_GUARD_LOOKAROUND1: //# Cradling weapon and looking around + case BOTH_GUARD_IDLE1: //# Cradling weapon and standing + if ( PM_HasAnimation( gent, LEGS_TURN2 ) ) + { + return LEGS_TURN2; + } + else + { + return -1; + } + break; + default: + return -1; + break; + } +} + +int PM_TurnAnimForLegsAnim( gentity_t *gent, int anim ) +{ + if ( !gent ) + { + return -1; + } + + switch( anim ) + { + case BOTH_STAND1: //# Standing idle: no weapon: hands down + case BOTH_STAND1IDLE1: //# Random standing idle + if ( PM_HasAnimation( gent, BOTH_TURNSTAND1 ) ) + { + return BOTH_TURNSTAND1; + } + else + { + return -1; + } + break; + case BOTH_STAND2: //# Standing idle with a weapon + case BOTH_SABERFAST_STANCE: + case BOTH_SABERSLOW_STANCE: + case BOTH_STAND2IDLE1: //# Random standing idle + case BOTH_STAND2IDLE2: //# Random standing idle + if ( PM_HasAnimation( gent, BOTH_TURNSTAND2 ) ) + { + return BOTH_TURNSTAND2; + } + else + { + return -1; + } + break; + case BOTH_STAND3: //# Standing hands behind back: at ease: etc. + case BOTH_STAND3IDLE1: //# Random standing idle + if ( PM_HasAnimation( gent, BOTH_TURNSTAND3 ) ) + { + return BOTH_TURNSTAND3; + } + else + { + return -1; + } + break; + case BOTH_STAND4: //# two handed: gun down: relaxed stand + if ( PM_HasAnimation( gent, BOTH_TURNSTAND4 ) ) + { + return BOTH_TURNSTAND4; + } + else + { + return -1; + } + break; + case BOTH_STAND5: //# standing idle, no weapon, hand down, back straight + case BOTH_STAND5IDLE1: //# Random standing idle + if ( PM_HasAnimation( gent, BOTH_TURNSTAND5 ) ) + { + return BOTH_TURNSTAND5; + } + else + { + return -1; + } + break; + case BOTH_CROUCH1: //# Transition from standing to crouch + case BOTH_CROUCH1IDLE: //# Crouching idle + /* + case BOTH_UNCROUCH1: //# Transition from crouch to standing + case BOTH_CROUCH2TOSTAND1: //# going from crouch2 to stand1 + case BOTH_CROUCH3: //# Desann crouching down to Kyle (cin 9) + case BOTH_UNCROUCH3: //# Desann uncrouching down to Kyle (cin 9) + case BOTH_CROUCH4: //# Slower version of crouch1 for cinematics + case BOTH_UNCROUCH4: //# Slower version of uncrouch1 for cinematics + */ + if ( PM_HasAnimation( gent, BOTH_TURNCROUCH1 ) ) + { + return BOTH_TURNCROUCH1; + } + else + { + return -1; + } + break; + default: + return -1; + break; + } +} + +qboolean PM_InOnGroundAnim ( playerState_t *ps ) +{ + switch( ps->legsAnim ) + { + case BOTH_DEAD1: + case BOTH_DEAD2: + case BOTH_DEAD3: + case BOTH_DEAD4: + case BOTH_DEAD5: + case BOTH_DEADFORWARD1: + case BOTH_DEADBACKWARD1: + case BOTH_DEADFORWARD2: + case BOTH_DEADBACKWARD2: + case BOTH_LYINGDEATH1: + case BOTH_LYINGDEAD1: + case BOTH_SLEEP1: //# laying on back-rknee up-rhand on torso + return qtrue; + break; + case BOTH_KNOCKDOWN1: //# + case BOTH_KNOCKDOWN2: //# + case BOTH_KNOCKDOWN3: //# + case BOTH_KNOCKDOWN4: //# + case BOTH_KNOCKDOWN5: //# + case BOTH_LK_DL_ST_T_SB_1_L: + case BOTH_RELEASED: + if ( ps->legsAnimTimer < 500 ) + {//pretty much horizontal by this point + return qtrue; + } + break; + case BOTH_PLAYER_PA_3_FLY: + if ( ps->legsAnimTimer < 300 ) + {//pretty much horizontal by this point + return qtrue; + } + /* + else if ( ps->clientNum < MAX_CLIENTS + && ps->legsAnimTimer < 300 + PLAYER_KNOCKDOWN_HOLD_EXTRA_TIME ) + { + return qtrue; + } + */ + break; + case BOTH_GETUP1: + case BOTH_GETUP2: + case BOTH_GETUP3: + case BOTH_GETUP4: + case BOTH_GETUP5: + case BOTH_GETUP_CROUCH_F1: + case BOTH_GETUP_CROUCH_B1: + case BOTH_FORCE_GETUP_F1: + case BOTH_FORCE_GETUP_F2: + case BOTH_FORCE_GETUP_B1: + case BOTH_FORCE_GETUP_B2: + case BOTH_FORCE_GETUP_B3: + case BOTH_FORCE_GETUP_B4: + case BOTH_FORCE_GETUP_B5: + case BOTH_FORCE_GETUP_B6: + if ( ps->legsAnimTimer > PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)ps->legsAnim )-400 ) + {//still pretty much horizontal at this point + return qtrue; + } + break; + } + + return qfalse; +} + +qboolean PM_InSpecialDeathAnim( int anim ) +{ + switch( pm->ps->legsAnim ) + { + case BOTH_DEATH_ROLL: //# Death anim from a roll + case BOTH_DEATH_FLIP: //# Death anim from a flip + case BOTH_DEATH_SPIN_90_R: //# Death anim when facing 90 degrees right + case BOTH_DEATH_SPIN_90_L: //# Death anim when facing 90 degrees left + case BOTH_DEATH_SPIN_180: //# Death anim when facing backwards + case BOTH_DEATH_LYING_UP: //# Death anim when lying on back + case BOTH_DEATH_LYING_DN: //# Death anim when lying on front + case BOTH_DEATH_FALLING_DN: //# Death anim when falling on face + case BOTH_DEATH_FALLING_UP: //# Death anim when falling on back + case BOTH_DEATH_CROUCHED: //# Death anim when crouched + return qtrue; + break; + default: + return qfalse; + break; + } +} + +qboolean PM_InDeathAnim ( void ) +{//Purposely does not cover stumbledeath and falldeath... + switch( pm->ps->legsAnim ) + { + case BOTH_DEATH1: //# First Death anim + case BOTH_DEATH2: //# Second Death anim + case BOTH_DEATH3: //# Third Death anim + case BOTH_DEATH4: //# Fourth Death anim + case BOTH_DEATH5: //# Fifth Death anim + case BOTH_DEATH6: //# Sixth Death anim + case BOTH_DEATH7: //# Seventh Death anim + case BOTH_DEATH8: //# + case BOTH_DEATH9: //# + case BOTH_DEATH10: //# + case BOTH_DEATH11: //# + case BOTH_DEATH12: //# + case BOTH_DEATH13: //# + case BOTH_DEATH14: //# + case BOTH_DEATH14_UNGRIP: //# Desann's end death (cin #35) + case BOTH_DEATH14_SITUP: //# Tavion sitting up after having been thrown (cin #23) + case BOTH_DEATH15: //# + case BOTH_DEATH16: //# + case BOTH_DEATH17: //# + case BOTH_DEATH18: //# + case BOTH_DEATH19: //# + case BOTH_DEATH20: //# + case BOTH_DEATH21: //# + case BOTH_DEATH22: //# + case BOTH_DEATH23: //# + case BOTH_DEATH24: //# + case BOTH_DEATH25: //# + + case BOTH_DEATHFORWARD1: //# First Death in which they get thrown forward + case BOTH_DEATHFORWARD2: //# Second Death in which they get thrown forward + case BOTH_DEATHFORWARD3: //# Tavion's falling in cin# 23 + case BOTH_DEATHBACKWARD1: //# First Death in which they get thrown backward + case BOTH_DEATHBACKWARD2: //# Second Death in which they get thrown backward + + case BOTH_DEATH1IDLE: //# Idle while close to death + case BOTH_LYINGDEATH1: //# Death to play when killed lying down + case BOTH_STUMBLEDEATH1: //# Stumble forward and fall face first death + case BOTH_FALLDEATH1: //# Fall forward off a high cliff and splat death - start + case BOTH_FALLDEATH1INAIR: //# Fall forward off a high cliff and splat death - loop + case BOTH_FALLDEATH1LAND: //# Fall forward off a high cliff and splat death - hit bottom + //# #sep case BOTH_ DEAD POSES # Should be last frame of corresponding previous anims + case BOTH_DEAD1: //# First Death finished pose + case BOTH_DEAD2: //# Second Death finished pose + case BOTH_DEAD3: //# Third Death finished pose + case BOTH_DEAD4: //# Fourth Death finished pose + case BOTH_DEAD5: //# Fifth Death finished pose + case BOTH_DEAD6: //# Sixth Death finished pose + case BOTH_DEAD7: //# Seventh Death finished pose + case BOTH_DEAD8: //# + case BOTH_DEAD9: //# + case BOTH_DEAD10: //# + case BOTH_DEAD11: //# + case BOTH_DEAD12: //# + case BOTH_DEAD13: //# + case BOTH_DEAD14: //# + case BOTH_DEAD15: //# + case BOTH_DEAD16: //# + case BOTH_DEAD17: //# + case BOTH_DEAD18: //# + case BOTH_DEAD19: //# + case BOTH_DEAD20: //# + case BOTH_DEAD21: //# + case BOTH_DEAD22: //# + case BOTH_DEAD23: //# + case BOTH_DEAD24: //# + case BOTH_DEAD25: //# + case BOTH_DEADFORWARD1: //# First thrown forward death finished pose + case BOTH_DEADFORWARD2: //# Second thrown forward death finished pose + case BOTH_DEADBACKWARD1: //# First thrown backward death finished pose + case BOTH_DEADBACKWARD2: //# Second thrown backward death finished pose + case BOTH_LYINGDEAD1: //# Killed lying down death finished pose + case BOTH_STUMBLEDEAD1: //# Stumble forward death finished pose + case BOTH_FALLDEAD1LAND: //# Fall forward and splat death finished pose + //# #sep case BOTH_ DEAD TWITCH/FLOP # React to being shot from death poses + case BOTH_DEADFLOP1: //# React to being shot from First Death finished pose + case BOTH_DEADFLOP2: //# React to being shot from Second Death finished pose + case BOTH_DISMEMBER_HEAD1: //# + case BOTH_DISMEMBER_TORSO1: //# + case BOTH_DISMEMBER_LLEG: //# + case BOTH_DISMEMBER_RLEG: //# + case BOTH_DISMEMBER_RARM: //# + case BOTH_DISMEMBER_LARM: //# + return qtrue; + break; + default: + return PM_InSpecialDeathAnim( pm->ps->legsAnim ); + break; + } +} + +qboolean PM_InCartwheel( int anim ) +{ + switch ( anim ) + { + case BOTH_ARIAL_LEFT: + case BOTH_ARIAL_RIGHT: + case BOTH_ARIAL_F1: + case BOTH_CARTWHEEL_LEFT: + case BOTH_CARTWHEEL_RIGHT: + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_InButterfly( int anim ) +{ + switch ( anim ) + { + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_StandingAnim( int anim ) +{//NOTE: does not check idles or special (cinematic) stands + switch ( anim ) + { + case BOTH_STAND1: + case BOTH_STAND2: + case BOTH_STAND3: + case BOTH_STAND4: + case BOTH_ATTACK3: + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_InAirKickingAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_A7_KICK_F_AIR: + case BOTH_A7_KICK_B_AIR: + case BOTH_A7_KICK_R_AIR: + case BOTH_A7_KICK_L_AIR: + return qtrue; + } + return qfalse; +} + +qboolean PM_KickingAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_A7_KICK_F: + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + case BOTH_A7_KICK_S: + case BOTH_A7_KICK_BF: + case BOTH_A7_KICK_RL: + //NOT a kick, but acts like one: + case BOTH_A7_HILT: + //NOT kicks, but do kick traces anyway + case BOTH_GETUP_BROLL_B: + case BOTH_GETUP_BROLL_F: + case BOTH_GETUP_FROLL_B: + case BOTH_GETUP_FROLL_F: + return qtrue; + break; + default: + return PM_InAirKickingAnim( anim ); + break; + } + //return qfalse; +} + +qboolean PM_StabDownAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_STABDOWN: + case BOTH_STABDOWN_STAFF: + case BOTH_STABDOWN_DUAL: + return qtrue; + } + return qfalse; +} + +qboolean PM_GoingToAttackDown( playerState_t *ps ) +{ + if ( PM_StabDownAnim( ps->torsoAnim )//stabbing downward + || ps->saberMove == LS_A_LUNGE//lunge + || ps->saberMove == LS_A_JUMP_T__B_//death from above + || ps->saberMove == LS_A_T2B//attacking top to bottom + || ps->saberMove == LS_S_T2B//starting at attack downward + || (PM_SaberInTransition( ps->saberMove ) && saberMoveData[ps->saberMove].endQuad == Q_T) )//transitioning to a top to bottom attack + { + return qtrue; + } + return qfalse; +} + +qboolean PM_ForceUsingSaberAnim( int anim ) +{//saber/acrobatic anims that should prevent you from recharging force power while you're in them... + switch ( anim ) + { + case BOTH_JUMPFLIPSLASHDOWN1: + case BOTH_JUMPFLIPSTABDOWN: + case BOTH_FORCELEAP2_T__B_: + case BOTH_JUMPATTACK6: + case BOTH_JUMPATTACK7: + case BOTH_FORCELONGLEAP_START: + case BOTH_FORCELONGLEAP_ATTACK: + case BOTH_FORCEWALLRUNFLIP_START: + case BOTH_FORCEWALLRUNFLIP_END: + case BOTH_FORCEWALLRUNFLIP_ALT: + case BOTH_FORCEWALLREBOUND_FORWARD: + case BOTH_FORCEWALLREBOUND_LEFT: + case BOTH_FORCEWALLREBOUND_BACK: + case BOTH_FORCEWALLREBOUND_RIGHT: + case BOTH_FLIP_ATTACK7: + case BOTH_FLIP_HOLD7: + case BOTH_FLIP_LAND: + case BOTH_PULL_IMPALE_STAB: + case BOTH_PULL_IMPALE_SWING: + case BOTH_A6_SABERPROTECT: + case BOTH_A7_SOULCAL: + case BOTH_A1_SPECIAL: + case BOTH_A2_SPECIAL: + case BOTH_A3_SPECIAL: + case BOTH_ARIAL_LEFT: + case BOTH_ARIAL_RIGHT: + case BOTH_CARTWHEEL_LEFT: + case BOTH_CARTWHEEL_RIGHT: + case BOTH_FLIP_LEFT: + case BOTH_FLIP_BACK1: + case BOTH_FLIP_BACK2: + case BOTH_FLIP_BACK3: + case BOTH_ALORA_FLIP_B: + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + case BOTH_WALL_RUN_RIGHT: + case BOTH_WALL_RUN_RIGHT_FLIP: + case BOTH_WALL_RUN_RIGHT_STOP: + case BOTH_WALL_RUN_LEFT: + case BOTH_WALL_RUN_LEFT_FLIP: + case BOTH_WALL_RUN_LEFT_STOP: + case BOTH_WALL_FLIP_RIGHT: + case BOTH_WALL_FLIP_LEFT: + case BOTH_FORCEJUMP1: + case BOTH_FORCEINAIR1: + case BOTH_FORCELAND1: + case BOTH_FORCEJUMPBACK1: + case BOTH_FORCEINAIRBACK1: + case BOTH_FORCELANDBACK1: + case BOTH_FORCEJUMPLEFT1: + case BOTH_FORCEINAIRLEFT1: + case BOTH_FORCELANDLEFT1: + case BOTH_FORCEJUMPRIGHT1: + case BOTH_FORCEINAIRRIGHT1: + case BOTH_FORCELANDRIGHT1: + case BOTH_FLIP_F: + case BOTH_FLIP_B: + case BOTH_FLIP_L: + case BOTH_FLIP_R: + case BOTH_ALORA_FLIP_1: + case BOTH_ALORA_FLIP_2: + case BOTH_ALORA_FLIP_3: + case BOTH_DODGE_FL: + case BOTH_DODGE_FR: + case BOTH_DODGE_BL: + case BOTH_DODGE_BR: + case BOTH_DODGE_L: + case BOTH_DODGE_R: + case BOTH_DODGE_HOLD_FL: + case BOTH_DODGE_HOLD_FR: + case BOTH_DODGE_HOLD_BL: + case BOTH_DODGE_HOLD_BR: + case BOTH_DODGE_HOLD_L: + case BOTH_DODGE_HOLD_R: + case BOTH_FORCE_GETUP_F1: + case BOTH_FORCE_GETUP_F2: + case BOTH_FORCE_GETUP_B1: + case BOTH_FORCE_GETUP_B2: + case BOTH_FORCE_GETUP_B3: + case BOTH_FORCE_GETUP_B4: + case BOTH_FORCE_GETUP_B5: + case BOTH_FORCE_GETUP_B6: + case BOTH_GETUP_BROLL_B: + case BOTH_GETUP_BROLL_F: + case BOTH_GETUP_BROLL_L: + case BOTH_GETUP_BROLL_R: + case BOTH_GETUP_FROLL_B: + case BOTH_GETUP_FROLL_F: + case BOTH_GETUP_FROLL_L: + case BOTH_GETUP_FROLL_R: + case BOTH_WALL_FLIP_BACK1: + case BOTH_WALL_FLIP_BACK2: + case BOTH_SPIN1: + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + case BOTH_DEFLECTSLASH__R__L_FIN: + case BOTH_ARIAL_F1: + return qtrue; + } + return qfalse; +} + +qboolean G_HasKnockdownAnims( gentity_t *ent ) +{ + if ( PM_HasAnimation( ent, BOTH_KNOCKDOWN1 ) + && PM_HasAnimation( ent, BOTH_KNOCKDOWN2 ) + && PM_HasAnimation( ent, BOTH_KNOCKDOWN3 ) + && PM_HasAnimation( ent, BOTH_KNOCKDOWN4 ) + && PM_HasAnimation( ent, BOTH_KNOCKDOWN5 ) ) + { + return qtrue; + } + return qfalse; +} + +qboolean PM_InAttackRoll( int anim ) +{ + switch ( anim ) + { + case BOTH_GETUP_BROLL_B: + case BOTH_GETUP_BROLL_F: + case BOTH_GETUP_FROLL_B: + case BOTH_GETUP_FROLL_F: + return qtrue; + } + return qfalse; +} + +qboolean PM_LockedAnim( int anim ) +{//anims that can *NEVER* be overridden, regardless + switch ( anim ) + { + case BOTH_KYLE_PA_1: + case BOTH_KYLE_PA_2: + case BOTH_KYLE_PA_3: + case BOTH_PLAYER_PA_1: + case BOTH_PLAYER_PA_2: + case BOTH_PLAYER_PA_3: + case BOTH_PLAYER_PA_3_FLY: + case BOTH_TAVION_SCEPTERGROUND: + case BOTH_TAVION_SWORDPOWER: + case BOTH_SCEPTER_START: + case BOTH_SCEPTER_HOLD: + case BOTH_SCEPTER_STOP: + //grabbed by wampa + case BOTH_GRABBED: //# + case BOTH_RELEASED: //# when Wampa drops player, transitions into fall on back + case BOTH_HANG_IDLE: //# + case BOTH_HANG_ATTACK: //# + case BOTH_HANG_PAIN: //# + return qtrue; + } + return qfalse; +} + +qboolean PM_SuperBreakLoseAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_LK_S_DL_S_SB_1_L: //super break I lost + case BOTH_LK_S_DL_T_SB_1_L: //super break I lost + case BOTH_LK_S_ST_S_SB_1_L: //super break I lost + case BOTH_LK_S_ST_T_SB_1_L: //super break I lost + case BOTH_LK_S_S_S_SB_1_L: //super break I lost + case BOTH_LK_S_S_T_SB_1_L: //super break I lost + case BOTH_LK_DL_DL_S_SB_1_L: //super break I lost + case BOTH_LK_DL_DL_T_SB_1_L: //super break I lost + case BOTH_LK_DL_ST_S_SB_1_L: //super break I lost + case BOTH_LK_DL_ST_T_SB_1_L: //super break I lost + case BOTH_LK_DL_S_S_SB_1_L: //super break I lost + case BOTH_LK_DL_S_T_SB_1_L: //super break I lost + case BOTH_LK_ST_DL_S_SB_1_L: //super break I lost + case BOTH_LK_ST_DL_T_SB_1_L: //super break I lost + case BOTH_LK_ST_ST_S_SB_1_L: //super break I lost + case BOTH_LK_ST_ST_T_SB_1_L: //super break I lost + case BOTH_LK_ST_S_S_SB_1_L: //super break I lost + case BOTH_LK_ST_S_T_SB_1_L: //super break I lost + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_SuperBreakWinAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_LK_S_DL_S_SB_1_W: //super break I won + case BOTH_LK_S_DL_T_SB_1_W: //super break I won + case BOTH_LK_S_ST_S_SB_1_W: //super break I won + case BOTH_LK_S_ST_T_SB_1_W: //super break I won + case BOTH_LK_S_S_S_SB_1_W: //super break I won + case BOTH_LK_S_S_T_SB_1_W: //super break I won + case BOTH_LK_DL_DL_S_SB_1_W: //super break I won + case BOTH_LK_DL_DL_T_SB_1_W: //super break I won + case BOTH_LK_DL_ST_S_SB_1_W: //super break I won + case BOTH_LK_DL_ST_T_SB_1_W: //super break I won + case BOTH_LK_DL_S_S_SB_1_W: //super break I won + case BOTH_LK_DL_S_T_SB_1_W: //super break I won + case BOTH_LK_ST_DL_S_SB_1_W: //super break I won + case BOTH_LK_ST_DL_T_SB_1_W: //super break I won + case BOTH_LK_ST_ST_S_SB_1_W: //super break I won + case BOTH_LK_ST_ST_T_SB_1_W: //super break I won + case BOTH_LK_ST_S_S_SB_1_W: //super break I won + case BOTH_LK_ST_S_T_SB_1_W: //super break I won + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_SaberLockBreakAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_BF1BREAK: + case BOTH_BF2BREAK: + case BOTH_CWCIRCLEBREAK: + case BOTH_CCWCIRCLEBREAK: + case BOTH_LK_S_DL_S_B_1_L: //normal break I lost + case BOTH_LK_S_DL_S_B_1_W: //normal break I won + case BOTH_LK_S_DL_T_B_1_L: //normal break I lost + case BOTH_LK_S_DL_T_B_1_W: //normal break I won + case BOTH_LK_S_ST_S_B_1_L: //normal break I lost + case BOTH_LK_S_ST_S_B_1_W: //normal break I won + case BOTH_LK_S_ST_T_B_1_L: //normal break I lost + case BOTH_LK_S_ST_T_B_1_W: //normal break I won + case BOTH_LK_S_S_S_B_1_L: //normal break I lost + case BOTH_LK_S_S_S_B_1_W: //normal break I won + case BOTH_LK_S_S_T_B_1_L: //normal break I lost + case BOTH_LK_S_S_T_B_1_W: //normal break I won + case BOTH_LK_DL_DL_S_B_1_L: //normal break I lost + case BOTH_LK_DL_DL_S_B_1_W: //normal break I won + case BOTH_LK_DL_DL_T_B_1_L: //normal break I lost + case BOTH_LK_DL_DL_T_B_1_W: //normal break I won + case BOTH_LK_DL_ST_S_B_1_L: //normal break I lost + case BOTH_LK_DL_ST_S_B_1_W: //normal break I won + case BOTH_LK_DL_ST_T_B_1_L: //normal break I lost + case BOTH_LK_DL_ST_T_B_1_W: //normal break I won + case BOTH_LK_DL_S_S_B_1_L: //normal break I lost + case BOTH_LK_DL_S_S_B_1_W: //normal break I won + case BOTH_LK_DL_S_T_B_1_L: //normal break I lost + case BOTH_LK_DL_S_T_B_1_W: //normal break I won + case BOTH_LK_ST_DL_S_B_1_L: //normal break I lost + case BOTH_LK_ST_DL_S_B_1_W: //normal break I won + case BOTH_LK_ST_DL_T_B_1_L: //normal break I lost + case BOTH_LK_ST_DL_T_B_1_W: //normal break I won + case BOTH_LK_ST_ST_S_B_1_L: //normal break I lost + case BOTH_LK_ST_ST_S_B_1_W: //normal break I won + case BOTH_LK_ST_ST_T_B_1_L: //normal break I lost + case BOTH_LK_ST_ST_T_B_1_W: //normal break I won + case BOTH_LK_ST_S_S_B_1_L: //normal break I lost + case BOTH_LK_ST_S_S_B_1_W: //normal break I won + case BOTH_LK_ST_S_T_B_1_L: //normal break I lost + case BOTH_LK_ST_S_T_B_1_W: //normal break I won + return (PM_SuperBreakLoseAnim(anim)||PM_SuperBreakWinAnim(anim)); + break; + } + return qfalse; +} + +qboolean PM_GetupAnimNoMove( int legsAnim ) +{ + switch( legsAnim ) + { + case BOTH_GETUP1: + case BOTH_GETUP2: + case BOTH_GETUP3: + case BOTH_GETUP4: + case BOTH_GETUP5: + case BOTH_GETUP_CROUCH_F1: + case BOTH_GETUP_CROUCH_B1: + case BOTH_FORCE_GETUP_F1: + case BOTH_FORCE_GETUP_F2: + case BOTH_FORCE_GETUP_B1: + case BOTH_FORCE_GETUP_B2: + case BOTH_FORCE_GETUP_B3: + case BOTH_FORCE_GETUP_B4: + case BOTH_FORCE_GETUP_B5: + case BOTH_FORCE_GETUP_B6: + return qtrue; + } + return qfalse; +} + +qboolean PM_KnockDownAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_KNOCKDOWN1: + case BOTH_KNOCKDOWN2: + case BOTH_KNOCKDOWN3: + case BOTH_KNOCKDOWN4: + case BOTH_KNOCKDOWN5: + /* + //special anims: + case BOTH_RELEASED: + case BOTH_LK_DL_ST_T_SB_1_L: + case BOTH_PLAYER_PA_3_FLY: + */ + return qtrue; + break; + /* + default: + return PM_InGetUp( ps ); + break; + */ + } + return qfalse; +} + +qboolean PM_KnockDownAnimExtended( int anim ) +{ + switch ( anim ) + { + case BOTH_KNOCKDOWN1: + case BOTH_KNOCKDOWN2: + case BOTH_KNOCKDOWN3: + case BOTH_KNOCKDOWN4: + case BOTH_KNOCKDOWN5: + //special anims: + case BOTH_RELEASED: + case BOTH_LK_DL_ST_T_SB_1_L: + case BOTH_PLAYER_PA_3_FLY: + return qtrue; + break; + /* + default: + return PM_InGetUp( ps ); + break; + */ + } + return qfalse; +} + +qboolean PM_SaberInKata( saberMoveName_t saberMove ) +{ + switch ( saberMove ) + { + case LS_A1_SPECIAL: + case LS_A2_SPECIAL: + case LS_A3_SPECIAL: + case LS_DUAL_SPIN_PROTECT: + case LS_STAFF_SOULCAL: + return qtrue; + default: + break; + } + return qfalse; +} + +qboolean PM_CanRollFromSoulCal( playerState_t *ps ) +{ + if ( ps->legsAnim == BOTH_A7_SOULCAL + && ps->legsAnimTimer < 700 + && ps->legsAnimTimer > 250 ) + { + return qtrue; + } + return qfalse; +} + +qboolean BG_FullBodyTauntAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_GESTURE1: + case BOTH_DUAL_TAUNT: + case BOTH_STAFF_TAUNT: + case BOTH_BOW: + case BOTH_MEDITATE: + case BOTH_SHOWOFF_FAST: + case BOTH_SHOWOFF_MEDIUM: + case BOTH_SHOWOFF_STRONG: + case BOTH_SHOWOFF_DUAL: + case BOTH_SHOWOFF_STAFF: + case BOTH_VICTORY_FAST: + case BOTH_VICTORY_MEDIUM: + case BOTH_VICTORY_STRONG: + case BOTH_VICTORY_DUAL: + case BOTH_VICTORY_STAFF: + return qtrue; + break; + } + return qfalse; +} diff --git a/code/game/bg_panimate.cpp.LOCAL.8780.cpp b/code/game/bg_panimate.cpp.LOCAL.8780.cpp new file mode 100644 index 0000000000..0af60a639d --- /dev/null +++ b/code/game/bg_panimate.cpp.LOCAL.8780.cpp @@ -0,0 +1,7842 @@ +/* +This file is part of Jedi Academy. + + Jedi Academy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + Jedi Academy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Jedi Academy. If not, see . +*/ +// Copyright 2001-2013 Raven Software + +// this include must remain at the top of every bg_xxxx CPP file +#include "common_headers.h" + + +// define GAME_INCLUDE so that g_public.h does not define the +// short, server-visible gclient_t and gentity_t structures, +// because we define the full size ones in this file +#define GAME_INCLUDE + +#include "../qcommon/q_shared.h" +#include "g_shared.h" +#include "bg_local.h" +#include "../cgame/cg_local.h" +#include "anims.h" +#include "Q3_Interface.h" +#include "g_local.h" +#include "wp_saber.h" +#include "g_vehicles.h" + +extern pmove_t *pm; +extern pml_t pml; +extern cvar_t *g_ICARUSDebug; +extern cvar_t *g_timescale; +extern cvar_t *g_synchSplitAnims; +extern cvar_t *g_AnimWarning; +extern cvar_t *g_noFootSlide; +extern cvar_t *g_noFootSlideRunScale; +extern cvar_t *g_noFootSlideWalkScale; +extern cvar_t *g_saberAnimSpeed; +extern cvar_t *g_saberAutoAim; +extern cvar_t *g_speederControlScheme; +extern cvar_t *g_saberNewControlScheme; +extern cvar_t *g_saberNewCombat; + +extern qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f ); +extern void WP_ForcePowerDrain( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); +extern qboolean ValidAnimFileIndex ( int index ); +extern qboolean PM_ControlledByPlayer( void ); +extern qboolean PM_DroidMelee( int npc_class ); +extern qboolean PM_PainAnim( int anim ); +extern qboolean PM_JumpingAnim( int anim ); +extern qboolean PM_FlippingAnim( int anim ); +extern qboolean PM_RollingAnim( int anim ); +extern qboolean PM_SwimmingAnim( int anim ); +extern qboolean PM_InKnockDown( playerState_t *ps ); +extern qboolean PM_InRoll( playerState_t *ps ); +extern qboolean PM_DodgeAnim( int anim ); +extern qboolean PM_InSlopeAnim( int anim ); +extern qboolean PM_ForceAnim( int anim ); +extern qboolean PM_InKnockDownOnGround( playerState_t *ps ); +extern qboolean PM_InSpecialJump( int anim ); +extern qboolean PM_RunningAnim( int anim ); +extern qboolean PM_WalkingAnim( int anim ); +extern qboolean PM_SwimmingAnim( int anim ); +extern qboolean PM_JumpingAnim( int anim ); +extern qboolean PM_SaberStanceAnim( int anim ); +extern qboolean PM_SaberDrawPutawayAnim( int anim ); +extern void PM_SetJumped( float height, qboolean force ); +extern qboolean PM_InGetUpNoRoll( playerState_t *ps ); +extern qboolean PM_CrouchAnim( int anim ); +extern qboolean G_TryingKataAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingCartwheel( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingSpecial( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingJumpAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingJumpForwardAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingLungeAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingPullAttack( gentity_t *self, usercmd_t *cmd, qboolean amPulling ); +extern qboolean G_InCinematicSaberAnim( gentity_t *self ); +extern qboolean G_ControlledByPlayer( gentity_t *self ); + +extern int g_crosshairEntNum; + +int PM_AnimLength( int index, animNumber_t anim ); +qboolean PM_LockedAnim( int anim ); +qboolean PM_StandingAnim( int anim ); +qboolean PM_InOnGroundAnim ( playerState_t *ps ); +qboolean PM_SuperBreakWinAnim( int anim ); +qboolean PM_SuperBreakLoseAnim( int anim ); +qboolean PM_LockedAnim( int anim ); +saberMoveName_t PM_SaberFlipOverAttackMove( void ); +qboolean PM_CheckFlipOverAttackMove( qboolean checkEnemy ); +saberMoveName_t PM_SaberJumpForwardAttackMove( void ); +qboolean PM_CheckJumpForwardAttackMove( void ); +saberMoveName_t PM_SaberBackflipAttackMove( void ); +qboolean PM_CheckBackflipAttackMove( void ); +saberMoveName_t PM_SaberDualJumpAttackMove( void ); +qboolean PM_CheckDualJumpAttackMove( void ); +saberMoveName_t PM_SaberLungeAttackMove( qboolean fallbackToNormalLunge ); +qboolean PM_CheckLungeAttackMove( void ); +// Okay, here lies the much-dreaded Pat-created FSM movement chart... Heretic II strikes again! +// Why am I inflicting this on you? Well, it's better than hardcoded states. +// Ideally this will be replaced with an external file or more sophisticated move-picker +// once the game gets out of prototype stage. + +// Silly, but I'm replacing these macros so they are shorter! +#define AFLAG_IDLE (SETANIM_FLAG_NORMAL) +#define AFLAG_ACTIVE (SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_HOLDLESS) +#define AFLAG_WAIT (SETANIM_FLAG_HOLD | SETANIM_FLAG_HOLDLESS) +#define AFLAG_FINISH (SETANIM_FLAG_HOLD) + +//FIXME: add the alternate anims for each style? +saberMoveData_t saberMoveData[LS_MOVE_MAX] = {// NB:randomized + // name anim(do all styles?)startQ endQ setanimflag blend, blocking chain_idle chain_attack trailLen + {"None", BOTH_STAND1, Q_R, Q_R, AFLAG_IDLE, 350, BLK_NO, LS_NONE, LS_NONE, 0 }, // LS_NONE = 0, + + // General movements with saber + {"Ready", BOTH_STAND2, Q_R, Q_R, AFLAG_IDLE, 350, BLK_WIDE, LS_READY, LS_S_R2L, 0 }, // LS_READY, + {"Draw", BOTH_STAND1TO2, Q_R, Q_R, AFLAG_FINISH, 350, BLK_NO, LS_READY, LS_S_R2L, 0 }, // LS_DRAW, + {"Putaway", BOTH_STAND2TO1, Q_R, Q_R, AFLAG_FINISH, 350, BLK_NO, LS_READY, LS_S_R2L, 0 }, // LS_PUTAWAY, + + // Attacks + //UL2LR + {"TL2BR Att", BOTH_A1_TL_BR, Q_TL, Q_BR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_TL2BR, LS_R_TL2BR, 200 }, // LS_A_TL2BR + //SLASH LEFT + {"L2R Att", BOTH_A1__L__R, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_L2R, LS_R_L2R, 200 }, // LS_A_L2R + //LL2UR + {"BL2TR Att", BOTH_A1_BL_TR, Q_BL, Q_TR, AFLAG_ACTIVE, 50, BLK_TIGHT, LS_R_BL2TR, LS_R_BL2TR, 200 }, // LS_A_BL2TR + //LR2UL + {"BR2TL Att", BOTH_A1_BR_TL, Q_BR, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_BR2TL, LS_R_BR2TL, 200 }, // LS_A_BR2TL + //SLASH RIGHT + {"R2L Att", BOTH_A1__R__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_R2L, LS_R_R2L, 200 },// LS_A_R2L + //UR2LL + {"TR2BL Att", BOTH_A1_TR_BL, Q_TR, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_TR2BL, LS_R_TR2BL, 200 }, // LS_A_TR2BL + //SLASH DOWN + {"T2B Att", BOTH_A1_T__B_, Q_T, Q_B, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_T2B, LS_R_T2B, 200 }, // LS_A_T2B + //special attacks + {"Back Stab", BOTH_A2_STABBACK1, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACKSTAB + {"Back Att", BOTH_ATTACK_BACK, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACK + {"CR Back Att", BOTH_CROUCHATTACKBACK1,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACK_CR + {"RollStab", BOTH_ROLL_STAB, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_ROLL_STAB + {"Lunge Att", BOTH_LUNGE2_B__T_, Q_B, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_LUNGE + {"Jump Att", BOTH_FORCELEAP2_T__B_,Q_T, Q_B, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_JUMP_T__B_ + {"Flip Stab", BOTH_JUMPFLIPSTABDOWN,Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_T___R, 200 }, // LS_A_FLIP_STAB + {"Flip Slash", BOTH_JUMPFLIPSLASHDOWN1,Q_L,Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R_T_, 200 }, // LS_A_FLIP_SLASH + {"DualJump Atk",BOTH_JUMPATTACK6, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_BL_TR, 200 }, // LS_JUMPATTACK_DUAL + + {"DualJumpAtkL_A",BOTH_ARIAL_LEFT, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_A_TL2BR, 200 }, // LS_JUMPATTACK_ARIAL_LEFT + {"DualJumpAtkR_A",BOTH_ARIAL_RIGHT, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_A_TR2BL, 200 }, // LS_JUMPATTACK_ARIAL_RIGHT + + {"DualJumpAtkL_A",BOTH_CARTWHEEL_LEFT, Q_R,Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_TL_BR, 200 }, // LS_JUMPATTACK_CART_LEFT + {"DualJumpAtkR_A",BOTH_CARTWHEEL_RIGHT, Q_R,Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_TR_BL, 200 }, // LS_JUMPATTACK_CART_RIGHT + + {"DualJumpAtkLStaff", BOTH_BUTTERFLY_FL1,Q_R,Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__L__R, 200 }, // LS_JUMPATTACK_STAFF_LEFT + {"DualJumpAtkRStaff", BOTH_BUTTERFLY_FR1,Q_R,Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R__L, 200 }, // LS_JUMPATTACK_STAFF_RIGHT + + {"ButterflyLeft", BOTH_BUTTERFLY_LEFT,Q_R,Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__L__R, 200 }, // LS_BUTTERFLY_LEFT + {"ButterflyRight", BOTH_BUTTERFLY_RIGHT,Q_R,Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R__L, 200 }, // LS_BUTTERFLY_RIGHT + + {"BkFlip Atk", BOTH_JUMPATTACK7, Q_B, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_T___R, 200 }, // LS_A_BACKFLIP_ATK + {"DualSpinAtk", BOTH_SPINATTACK6, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK_DUAL + {"StfSpinAtk", BOTH_SPINATTACK7, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK + {"LngLeapAtk", BOTH_FORCELONGLEAP_ATTACK,Q_R,Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_LEAP_ATTACK + {"SwoopAtkR", BOTH_VS_ATR_S, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 200 }, // LS_SWOOP_ATTACK_RIGHT + {"SwoopAtkL", BOTH_VS_ATL_S, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 200 }, // LS_SWOOP_ATTACK_LEFT + {"TauntaunAtkR",BOTH_VT_ATR_S, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_TAUNTAUN_ATTACK_RIGHT + {"TauntaunAtkL",BOTH_VT_ATL_S, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_TAUNTAUN_ATTACK_LEFT + {"StfKickFwd", BOTH_A7_KICK_F, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_F + {"StfKickBack", BOTH_A7_KICK_B, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_B + {"StfKickRight",BOTH_A7_KICK_R, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_R + {"StfKickLeft", BOTH_A7_KICK_L, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_L + {"StfKickSpin", BOTH_A7_KICK_S, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_S + {"StfKickBkFwd",BOTH_A7_KICK_BF, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_BF + {"StfKickSplit",BOTH_A7_KICK_RL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_RL + {"StfKickFwdAir",BOTH_A7_KICK_F_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_F_AIR + {"StfKickBackAir",BOTH_A7_KICK_B_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_B_AIR + {"StfKickRightAir",BOTH_A7_KICK_R_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_R_AIR + {"StfKickLeftAir",BOTH_A7_KICK_L_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_L_AIR + {"StabDown", BOTH_STABDOWN, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN + {"StabDownStf", BOTH_STABDOWN_STAFF,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN_STAFF + {"StabDownDual",BOTH_STABDOWN_DUAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN_DUAL + {"dualspinprot",BOTH_A6_SABERPROTECT,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 500 }, // LS_DUAL_SPIN_PROTECT + {"StfSoulCal", BOTH_A7_SOULCAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 500 }, // LS_STAFF_SOULCAL + {"specialfast", BOTH_A1_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000}, // LS_A1_SPECIAL + {"specialmed", BOTH_A2_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000}, // LS_A2_SPECIAL + {"specialstr", BOTH_A3_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000}, // LS_A3_SPECIAL + {"upsidedwnatk",BOTH_FLIP_ATTACK7, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200}, // LS_UPSIDE_DOWN_ATTACK + {"pullatkstab", BOTH_PULL_IMPALE_STAB,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200}, // LS_PULL_ATTACK_STAB + {"pullatkswing",BOTH_PULL_IMPALE_SWING,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200}, // LS_PULL_ATTACK_SWING + {"AloraSpinAtk",BOTH_ALORA_SPIN_SLASH,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK_ALORA + {"Dual FB Atk", BOTH_A6_FB, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_DUAL_FB + {"Dual LR Atk", BOTH_A6_LR, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_DUAL_LR + {"StfHiltBash", BOTH_A7_HILT, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_HILT_BASH + + //starts + {"TL2BR St", BOTH_S1_S1_TL, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_TL2BR, LS_A_TL2BR, 200 }, // LS_S_TL2BR + {"L2R St", BOTH_S1_S1__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_L2R, LS_A_L2R, 200 }, // LS_S_L2R + {"BL2TR St", BOTH_S1_S1_BL, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_BL2TR, LS_A_BL2TR, 200 }, // LS_S_BL2TR + {"BR2TL St", BOTH_S1_S1_BR, Q_R, Q_BR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_BR2TL, LS_A_BR2TL, 200 }, // LS_S_BR2TL + {"R2L St", BOTH_S1_S1__R, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_R2L, LS_A_R2L, 200 }, // LS_S_R2L + {"TR2BL St", BOTH_S1_S1_TR, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_TR2BL, LS_A_TR2BL, 200 }, // LS_S_TR2BL + {"T2B St", BOTH_S1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_T2B, LS_A_T2B, 200 }, // LS_S_T2B + + //returns + {"TL2BR Ret", BOTH_R1_BR_S1, Q_BR, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_TL2BR + {"L2R Ret", BOTH_R1__R_S1, Q_R, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_L2R + {"BL2TR Ret", BOTH_R1_TR_S1, Q_TR, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_BL2TR + {"BR2TL Ret", BOTH_R1_TL_S1, Q_TL, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_BR2TL + {"R2L Ret", BOTH_R1__L_S1, Q_L, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_R2L + {"TR2BL Ret", BOTH_R1_BL_S1, Q_BL, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_TR2BL + {"T2B Ret", BOTH_R1_B__S1, Q_B, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_T2B + + //Transitions + {"BR2R Trans", BOTH_T1_BR__R, Q_BR, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc bottom right to right + {"BR2TR Trans", BOTH_T1_BR_TR, Q_BR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc bottom right to top right (use: BOTH_T1_TR_BR) + {"BR2T Trans", BOTH_T1_BR_T_, Q_BR, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc bottom right to top (use: BOTH_T1_T__BR) + {"BR2TL Trans", BOTH_T1_BR_TL, Q_BR, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast weak spin bottom right to top left + {"BR2L Trans", BOTH_T1_BR__L, Q_BR, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast weak spin bottom right to left + {"BR2BL Trans", BOTH_T1_BR_BL, Q_BR, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin bottom right to bottom left + {"R2BR Trans", BOTH_T1__R_BR, Q_R, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc right to bottom right (use: BOTH_T1_BR__R) + {"R2TR Trans", BOTH_T1__R_TR, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc right to top right + {"R2T Trans", BOTH_T1__R_T_, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast ar right to top (use: BOTH_T1_T___R) + {"R2TL Trans", BOTH_T1__R_TL, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc right to top left + {"R2L Trans", BOTH_T1__R__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast weak spin right to left + {"R2BL Trans", BOTH_T1__R_BL, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin right to bottom left + {"TR2BR Trans", BOTH_T1_TR_BR, Q_TR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc top right to bottom right + {"TR2R Trans", BOTH_T1_TR__R, Q_TR, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top right to right (use: BOTH_T1__R_TR) + {"TR2T Trans", BOTH_T1_TR_T_, Q_TR, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc top right to top (use: BOTH_T1_T__TR) + {"TR2TL Trans", BOTH_T1_TR_TL, Q_TR, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc top right to top left + {"TR2L Trans", BOTH_T1_TR__L, Q_TR, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top right to left + {"TR2BL Trans", BOTH_T1_TR_BL, Q_TR, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin top right to bottom left + {"T2BR Trans", BOTH_T1_T__BR, Q_T, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc top to bottom right + {"T2R Trans", BOTH_T1_T___R, Q_T, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top to right + {"T2TR Trans", BOTH_T1_T__TR, Q_T, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc top to top right + {"T2TL Trans", BOTH_T1_T__TL, Q_T, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc top to top left + {"T2L Trans", BOTH_T1_T___L, Q_T, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top to left + {"T2BL Trans", BOTH_T1_T__BL, Q_T, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc top to bottom left + {"TL2BR Trans", BOTH_T1_TL_BR, Q_TL, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin top left to bottom right + {"TL2R Trans", BOTH_T1_TL__R, Q_TL, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top left to right (use: BOTH_T1__R_TL) + {"TL2TR Trans", BOTH_T1_TL_TR, Q_TL, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc top left to top right (use: BOTH_T1_TR_TL) + {"TL2T Trans", BOTH_T1_TL_T_, Q_TL, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc top left to top (use: BOTH_T1_T__TL) + {"TL2L Trans", BOTH_T1_TL__L, Q_TL, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top left to left (use: BOTH_T1__L_TL) + {"TL2BL Trans", BOTH_T1_TL_BL, Q_TL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc top left to bottom left + {"L2BR Trans", BOTH_T1__L_BR, Q_L, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin left to bottom right + {"L2R Trans", BOTH_T1__L__R, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast weak spin left to right + {"L2TR Trans", BOTH_T1__L_TR, Q_L, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc left to top right (use: BOTH_T1_TR__L) + {"L2T Trans", BOTH_T1__L_T_, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc left to top (use: BOTH_T1_T___L) + {"L2TL Trans", BOTH_T1__L_TL, Q_L, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc left to top left + {"L2BL Trans", BOTH_T1__L_BL, Q_L, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc left to bottom left (use: BOTH_T1_BL__L) + {"BL2BR Trans", BOTH_T1_BL_BR, Q_BL, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin bottom left to bottom right + {"BL2R Trans", BOTH_T1_BL__R, Q_BL, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast weak spin bottom left to right + {"BL2TR Trans", BOTH_T1_BL_TR, Q_BL, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast weak spin bottom left to top right + {"BL2T Trans", BOTH_T1_BL_T_, Q_BL, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc bottom left to top (use: BOTH_T1_T__BL) + {"BL2TL Trans", BOTH_T1_BL_TL, Q_BL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc bottom left to top left (use: BOTH_T1_TL_BL) + {"BL2L Trans", BOTH_T1_BL__L, Q_BL, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc bottom left to left + + //Bounces + {"Bounce BR", BOTH_B1_BR___, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_T1_BR_TR, 150 }, + {"Bounce R", BOTH_B1__R___, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_T1__R__L, 150 }, + {"Bounce TR", BOTH_B1_TR___, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_TR_TL, 150 }, + {"Bounce T", BOTH_B1_T____, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + {"Bounce TL", BOTH_B1_TL___, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_T1_TL_TR, 150 }, + {"Bounce L", BOTH_B1__L___, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_T1__L__R, 150 }, + {"Bounce BL", BOTH_B1_BL___, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_T1_BL_TR, 150 }, + + //Deflected attacks (like bounces, but slide off enemy saber, not straight back) + {"Deflect BR", BOTH_D1_BR___, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_T1_BR_TR, 150 }, + {"Deflect R", BOTH_D1__R___, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_T1__R__L, 150 }, + {"Deflect TR", BOTH_D1_TR___, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_TR_TL, 150 }, + {"Deflect T", BOTH_B1_T____, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + {"Deflect TL", BOTH_D1_TL___, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_T1_TL_TR, 150 }, + {"Deflect L", BOTH_D1__L___, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_T1__L__R, 150 }, + {"Deflect BL", BOTH_D1_BL___, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_T1_BL_TR, 150 }, + {"Deflect B", BOTH_D1_B____, Q_B, Q_B, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + + //Reflected attacks + {"Reflected BR",BOTH_V1_BR_S1, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_BR + {"Reflected R", BOTH_V1__R_S1, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1__R + {"Reflected TR",BOTH_V1_TR_S1, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_TR + {"Reflected T", BOTH_V1_T__S1, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_T_ + {"Reflected TL",BOTH_V1_TL_S1, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_TL + {"Reflected L", BOTH_V1__L_S1, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1__L + {"Reflected BL",BOTH_V1_BL_S1, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_BL + {"Reflected B", BOTH_V1_B__S1, Q_B, Q_B, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_B_ + + // Broken parries + {"BParry Top", BOTH_H1_S1_T_, Q_T, Q_B, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UP, + {"BParry UR", BOTH_H1_S1_TR, Q_TR, Q_BL, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UR, + {"BParry UL", BOTH_H1_S1_TL, Q_TL, Q_BR, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UL, + {"BParry LR", BOTH_H1_S1_BL, Q_BL, Q_TR, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LR, + {"BParry Bot", BOTH_H1_S1_B_, Q_B, Q_T, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LL + {"BParry LL", BOTH_H1_S1_BR, Q_BR, Q_TL, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LL + + // Knockaways + {"Knock Top", BOTH_K1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_T1_T__BR, 150 }, // LS_PARRY_UP, + {"Knock UR", BOTH_K1_S1_TR, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_T1_TR__R, 150 }, // LS_PARRY_UR, + {"Knock UL", BOTH_K1_S1_TL, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_T1_TL__L, 150 }, // LS_PARRY_UL, + {"Knock LR", BOTH_K1_S1_BL, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_T1_BL_TL, 150 }, // LS_PARRY_LR, + {"Knock LL", BOTH_K1_S1_BR, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_T1_BR_TR, 150 }, // LS_PARRY_LL + + // Parry + {"Parry Top", BOTH_P1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_T2B, 150 }, // LS_PARRY_UP, + {"Parry UR", BOTH_P1_S1_TR, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_TR2BL, 150 }, // LS_PARRY_UR, + {"Parry UL", BOTH_P1_S1_TL, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_A_TL2BR, 150 }, // LS_PARRY_UL, + {"Parry LR", BOTH_P1_S1_BL, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_A_BR2TL, 150 }, // LS_PARRY_LR, + {"Parry LL", BOTH_P1_S1_BR, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_A_BL2TR, 150 }, // LS_PARRY_LL + + // Reflecting a missile + {"Reflect Top", BOTH_P1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_T2B, 300 }, // LS_PARRY_UP, + {"Reflect UR", BOTH_P1_S1_TL, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_A_TL2BR, 300 }, // LS_PARRY_UR, + {"Reflect UL", BOTH_P1_S1_TR, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_TR2BL, 300 }, // LS_PARRY_UL, + {"Reflect LR", BOTH_P1_S1_BR, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_A_BL2TR, 300 }, // LS_PARRY_LR + {"Reflect LL", BOTH_P1_S1_BL, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_A_BR2TL, 300 }, // LS_PARRY_LL, +}; + + +saberMoveName_t transitionMove[Q_NUM_QUADS][Q_NUM_QUADS] = +{ + { + LS_NONE, //Can't transition to same pos! + LS_T1_BR__R,//40 + LS_T1_BR_TR, + LS_T1_BR_T_, + LS_T1_BR_TL, + LS_T1_BR__L, + LS_T1_BR_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1__R_BR,//46 + LS_NONE, //Can't transition to same pos! + LS_T1__R_TR, + LS_T1__R_T_, + LS_T1__R_TL, + LS_T1__R__L, + LS_T1__R_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_TR_BR,//52 + LS_T1_TR__R, + LS_NONE, //Can't transition to same pos! + LS_T1_TR_T_, + LS_T1_TR_TL, + LS_T1_TR__L, + LS_T1_TR_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_T__BR,//58 + LS_T1_T___R, + LS_T1_T__TR, + LS_NONE, //Can't transition to same pos! + LS_T1_T__TL, + LS_T1_T___L, + LS_T1_T__BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_TL_BR,//64 + LS_T1_TL__R, + LS_T1_TL_TR, + LS_T1_TL_T_, + LS_NONE, //Can't transition to same pos! + LS_T1_TL__L, + LS_T1_TL_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1__L_BR,//70 + LS_T1__L__R, + LS_T1__L_TR, + LS_T1__L_T_, + LS_T1__L_TL, + LS_NONE, //Can't transition to same pos! + LS_T1__L_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_BL_BR,//76 + LS_T1_BL__R, + LS_T1_BL_TR, + LS_T1_BL_T_, + LS_T1_BL_TL, + LS_T1_BL__L, + LS_NONE, //Can't transition to same pos! + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_BL_BR,//NOTE: there are no transitions from bottom, so re-use the bottom right transitions + LS_T1_BR__R, + LS_T1_BR_TR, + LS_T1_BR_T_, + LS_T1_BR_TL, + LS_T1_BR__L, + LS_T1_BR_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + } +}; + +void PM_VelocityForSaberMove( playerState_t *ps, vec3_t throwDir ) +{ + vec3_t vForward, vRight, vUp, startQ, endQ; + + AngleVectors( ps->viewangles, vForward, vRight, vUp ); + + switch ( saberMoveData[ps->saberMove].startQuad ) + { + case Q_BR: + VectorScale( vRight, 1, startQ ); + VectorMA( startQ, -1, vUp, startQ ); + break; + case Q_R: + VectorScale( vRight, 2, startQ ); + break; + case Q_TR: + VectorScale( vRight, 1, startQ ); + VectorMA( startQ, 1, vUp, startQ ); + break; + case Q_T: + VectorScale( vUp, 2, startQ ); + break; + case Q_TL: + VectorScale( vRight, -1, startQ ); + VectorMA( startQ, 1, vUp, startQ ); + break; + case Q_L: + VectorScale( vRight, -2, startQ ); + break; + case Q_BL: + VectorScale( vRight, -1, startQ ); + VectorMA( startQ, -1, vUp, startQ ); + break; + case Q_B: + VectorScale( vUp, -2, startQ ); + break; + } + switch ( saberMoveData[ps->saberMove].endQuad ) + { + case Q_BR: + VectorScale( vRight, 1, endQ ); + VectorMA( endQ, -1, vUp, endQ ); + break; + case Q_R: + VectorScale( vRight, 2, endQ ); + break; + case Q_TR: + VectorScale( vRight, 1, endQ ); + VectorMA( endQ, 1, vUp, endQ ); + break; + case Q_T: + VectorScale( vUp, 2, endQ ); + break; + case Q_TL: + VectorScale( vRight, -1, endQ ); + VectorMA( endQ, 1, vUp, endQ ); + break; + case Q_L: + VectorScale( vRight, -2, endQ ); + break; + case Q_BL: + VectorScale( vRight, -1, endQ ); + VectorMA( endQ, -1, vUp, endQ ); + break; + case Q_B: + VectorScale( vUp, -2, endQ ); + break; + } + VectorMA( endQ, 2, vForward, endQ ); + VectorScale( throwDir, 125, throwDir );//FIXME: pass in the throw strength? + VectorSubtract( endQ, startQ, throwDir ); +} + +qboolean PM_VelocityForBlockedMove( playerState_t *ps, vec3_t throwDir ) +{ + vec3_t vForward, vRight, vUp; + AngleVectors( ps->viewangles, vForward, vRight, vUp ); + switch ( ps->saberBlocked ) + { + case BLOCKED_UPPER_RIGHT: + VectorScale( vRight, 1, throwDir ); + VectorMA( throwDir, 1, vUp, throwDir ); + break; + case BLOCKED_UPPER_LEFT: + VectorScale( vRight, -1, throwDir ); + VectorMA( throwDir, 1, vUp, throwDir ); + break; + case BLOCKED_LOWER_RIGHT: + VectorScale( vRight, 1, throwDir ); + VectorMA( throwDir, -1, vUp, throwDir ); + break; + case BLOCKED_LOWER_LEFT: + VectorScale( vRight, -1, throwDir ); + VectorMA( throwDir, -1, vUp, throwDir ); + break; + case BLOCKED_TOP: + VectorScale( vUp, 2, throwDir ); + break; + default: + return qfalse; + break; + } + VectorMA( throwDir, 2, vForward, throwDir ); + VectorScale( throwDir, 250, throwDir );//FIXME: pass in the throw strength? + return qtrue; +} + +int PM_AnimLevelForSaberAnim( int anim ) +{ + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_D1_B____ ) + { + return FORCE_LEVEL_1; + } + if ( anim >= BOTH_A2_T__B_ && anim <= BOTH_D2_B____ ) + { + return FORCE_LEVEL_2; + } + if ( anim >= BOTH_A3_T__B_ && anim <= BOTH_D3_B____ ) + { + return FORCE_LEVEL_3; + } + if ( anim >= BOTH_A4_T__B_ && anim <= BOTH_D4_B____ ) + {//desann + return FORCE_LEVEL_4; + } + if ( anim >= BOTH_A5_T__B_ && anim <= BOTH_D5_B____ ) + {//tavion + return FORCE_LEVEL_5; + } + if ( anim >= BOTH_A6_T__B_ && anim <= BOTH_D6_B____ ) + {//dual + return SS_DUAL; + } + if ( anim >= BOTH_A7_T__B_ && anim <= BOTH_D7_B____ ) + {//staff + return SS_STAFF; + } + return FORCE_LEVEL_0; +} + +int PM_PowerLevelForSaberAnim(playerState_t *ps, int saberNum) +{ + if (g_saberNewCombat->integer) + { //new code + int anim = ps->torsoAnim; + int animTimeElapsed = PM_AnimLength(g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)anim) - ps->torsoAnimTimer; + if (anim >= BOTH_A1_T__B_ && anim <= BOTH_D1_B____) + { + //FIXME: these two need their own style + if (ps->saber[0].type == SABER_LANCE) + { + return FORCE_LEVEL_4; + } + else if (ps->saber[0].type == SABER_TRIDENT) + { + return FORCE_LEVEL_3; + } + return FORCE_LEVEL_1; + } + if (anim >= BOTH_A2_T__B_ && anim <= BOTH_D2_B____) + { + return FORCE_LEVEL_3; + } + if (anim >= BOTH_A3_T__B_ && anim <= BOTH_D3_B____) + { + return FORCE_LEVEL_5; + } + if (anim >= BOTH_A4_T__B_ && anim <= BOTH_D4_B____) + {//desann + return FORCE_LEVEL_5; + } + if (anim >= BOTH_A5_T__B_ && anim <= BOTH_D5_B____) + {//tavion + return FORCE_LEVEL_2; + } + if (anim >= BOTH_A6_T__B_ && anim <= BOTH_D6_B____) + {//dual + return FORCE_LEVEL_2; + } + if (anim >= BOTH_A7_T__B_ && anim <= BOTH_D7_B____) + {//staff + return FORCE_LEVEL_4; + } + if ((anim >= BOTH_P1_S1_T_ && anim <= BOTH_P1_S1_BR) + || (anim >= BOTH_P6_S6_T_ && anim <= BOTH_P6_S6_BR) + || (anim >= BOTH_P7_S7_T_ && anim <= BOTH_P7_S7_BR)) + {//parries + switch (ps->saberAnimLevel) + { + case SS_DESANN: + case SS_STRONG: + return FORCE_LEVEL_5; + break; + case SS_STAFF: + return FORCE_LEVEL_4; + break; + case SS_MEDIUM: + return FORCE_LEVEL_3; + break; + case SS_DUAL: + case SS_TAVION: + return FORCE_LEVEL_2; + break; + case SS_FAST: + return FORCE_LEVEL_1; + break; + default: + return FORCE_LEVEL_0; + break; + } + } + if ((anim >= BOTH_K1_S1_T_ && anim <= BOTH_K1_S1_BR) + || (anim >= BOTH_K6_S6_T_ && anim <= BOTH_K6_S6_BR) + || (anim >= BOTH_K7_S7_T_ && anim <= BOTH_K7_S7_BR)) + {//knockaways + return FORCE_LEVEL_3; + } + if ((anim >= BOTH_V1_BR_S1 && anim <= BOTH_V1_B__S1) + || (anim >= BOTH_V6_BR_S6 && anim <= BOTH_V6_B__S6) + || (anim >= BOTH_V7_BR_S7 && anim <= BOTH_V7_B__S7)) + {//knocked-away attacks + return FORCE_LEVEL_1; + } + if ((anim >= BOTH_H1_S1_T_ && anim <= BOTH_H1_S1_BR) + || (anim >= BOTH_H6_S6_T_ && anim <= BOTH_H6_S6_BR) + || (anim >= BOTH_H7_S7_T_ && anim <= BOTH_H7_S7_BR)) + {//broken parries + return FORCE_LEVEL_0; + } + switch (anim) + { + case BOTH_A2_STABBACK1: + if (ps->torsoAnimTimer < 450) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_ATTACK_BACK: + if (ps->torsoAnimTimer < 500) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_CROUCHATTACKBACK1: + if (ps->torsoAnimTimer < 800) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + //FIXME: break up? + return FORCE_LEVEL_5; + break; + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + //FIXME: break up? + return FORCE_LEVEL_5; + break; + case BOTH_K1_S1_T_: //# knockaway saber top + case BOTH_K1_S1_TR: //# knockaway saber top right + case BOTH_K1_S1_TL: //# knockaway saber top left + case BOTH_K1_S1_BL: //# knockaway saber bottom left + case BOTH_K1_S1_B_: //# knockaway saber bottom + case BOTH_K1_S1_BR: //# knockaway saber bottom right + //FIXME: break up? + return FORCE_LEVEL_5; + break; + case BOTH_LUNGE2_B__T_: + if (ps->torsoAnimTimer < 400) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 150) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_FORCELEAP2_T__B_: + if (ps->torsoAnimTimer < 400) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 550) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + return FORCE_LEVEL_5;//??? + break; + case BOTH_JUMPFLIPSLASHDOWN1: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 550) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_JUMPFLIPSTABDOWN: + if (ps->torsoAnimTimer <= 1200) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed <= 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_JUMPATTACK6: + /* + if (pm->ps) + { + if ( ( pm->ps->legsAnimTimer >= 1450 + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 400 ) + ||(pm->ps->legsAnimTimer >= 400 + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 1100 ) ) + {//pretty much sideways + return FORCE_LEVEL_5; + } + } + */ + if ((ps->torsoAnimTimer >= 1450 + && animTimeElapsed >= 400) + || (ps->torsoAnimTimer >= 400 + && animTimeElapsed >= 1100)) + {//pretty much sideways + return FORCE_LEVEL_5; + } + return FORCE_LEVEL_0; + break; + case BOTH_JUMPATTACK7: + if (ps->torsoAnimTimer <= 1200) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_SPINATTACK6: + if (animTimeElapsed <= 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_SPINATTACK7: + if (ps->torsoAnimTimer <= 500) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 500) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_FORCELONGLEAP_ATTACK: + if (animTimeElapsed <= 200) + {//1st four frames of anim + return FORCE_LEVEL_5; + } + break; + /* + case BOTH_A7_KICK_F://these kicks attack, too + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + //FIXME: break up + return FORCE_LEVEL_5; + break; + */ + case BOTH_STABDOWN: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_5; + } + break; + case BOTH_STABDOWN_STAFF: + if (ps->torsoAnimTimer <= 850) + {//end of anim + return FORCE_LEVEL_5; + } + break; + case BOTH_STABDOWN_DUAL: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_5; + } + break; + case BOTH_A6_SABERPROTECT: + if (ps->torsoAnimTimer < 650) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A7_SOULCAL: + if (ps->torsoAnimTimer < 650) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 600) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A1_SPECIAL: + if (ps->torsoAnimTimer < 600) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A2_SPECIAL: + if (ps->torsoAnimTimer < 300) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A3_SPECIAL: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_FLIP_ATTACK7: + return FORCE_LEVEL_5; + break; + case BOTH_PULL_IMPALE_STAB: + if (ps->torsoAnimTimer < 1000) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_PULL_IMPALE_SWING: + if (ps->torsoAnimTimer < 500)//750 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 650)//600 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_ALORA_SPIN_SLASH: + if (ps->torsoAnimTimer < 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A6_FB: + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A6_LR: + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_A7_HILT: + return FORCE_LEVEL_0; + break; + //===SABERLOCK SUPERBREAKS START=========================================================================== + case BOTH_LK_S_DL_T_SB_1_W: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_ST_S_SB_1_W: + if (ps->torsoAnimTimer < 300) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + if (ps->torsoAnimTimer < 150) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_DL_T_SB_1_W: + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + if (animTimeElapsed < 1000) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_ST_T_SB_1_W: + if (ps->torsoAnimTimer < 950) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 650) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_S_S_SB_1_W: + if (saberNum != 0) + {//only right hand saber does damage in this suberbreak + return FORCE_LEVEL_0; + } + if (ps->torsoAnimTimer < 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 450) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_S_T_SB_1_W: + if (saberNum != 0) + {//only right hand saber does damage in this suberbreak + return FORCE_LEVEL_0; + } + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 150) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_DL_S_SB_1_W: + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_DL_T_SB_1_W: + //special suberbreak - doesn't kill, just kicks them backwards + return FORCE_LEVEL_0; + break; + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + if (ps->torsoAnimTimer < 800) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 350) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + return FORCE_LEVEL_5; + break; + //===SABERLOCK SUPERBREAKS START=========================================================================== + case BOTH_HANG_ATTACK: + //FIME: break up + if (ps->torsoAnimTimer < 1000) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + else + {//sweet spot + return FORCE_LEVEL_5; + } + break; + case BOTH_ROLL_STAB: + if (animTimeElapsed > 400) + {//end of anim + return FORCE_LEVEL_0; + } + else + { + return FORCE_LEVEL_5; + } + break; + } + return FORCE_LEVEL_0; + } + else + { //old code + int anim = ps->torsoAnim; + int animTimeElapsed = PM_AnimLength(g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)anim) - ps->torsoAnimTimer; + if (anim >= BOTH_A1_T__B_ && anim <= BOTH_D1_B____) + { + //FIXME: these two need their own style + if (ps->saber[0].type == SABER_LANCE) + { + return FORCE_LEVEL_4; + } + else if (ps->saber[0].type == SABER_TRIDENT) + { + return FORCE_LEVEL_3; + } + return FORCE_LEVEL_1; + } + if (anim >= BOTH_A2_T__B_ && anim <= BOTH_D2_B____) + { + return FORCE_LEVEL_3; + } + if (anim >= BOTH_A3_T__B_ && anim <= BOTH_D3_B____) + { + return FORCE_LEVEL_5; + } + if (anim >= BOTH_A4_T__B_ && anim <= BOTH_D4_B____) + {//desann + return FORCE_LEVEL_5; + } + if (anim >= BOTH_A5_T__B_ && anim <= BOTH_D5_B____) + {//tavion + return FORCE_LEVEL_2; + } + if (anim >= BOTH_A6_T__B_ && anim <= BOTH_D6_B____) + {//dual + return FORCE_LEVEL_2; + } + if (anim >= BOTH_A7_T__B_ && anim <= BOTH_D7_B____) + {//staff + return FORCE_LEVEL_4; + } + if ((anim >= BOTH_P1_S1_T_ && anim <= BOTH_P1_S1_BR) + || (anim >= BOTH_P6_S6_T_ && anim <= BOTH_P6_S6_BR) + || (anim >= BOTH_P7_S7_T_ && anim <= BOTH_P7_S7_BR)) + {//parries + switch (ps->saberAnimLevel) + { + case SS_STRONG: + case SS_DESANN: + return FORCE_LEVEL_3; + break; + case SS_TAVION: + case SS_STAFF: + case SS_DUAL: + case SS_MEDIUM: + return FORCE_LEVEL_2; + break; + case SS_FAST: + return FORCE_LEVEL_1; + break; + default: + return FORCE_LEVEL_0; + break; + } + } + if ((anim >= BOTH_K1_S1_T_ && anim <= BOTH_K1_S1_BR) + || (anim >= BOTH_K6_S6_T_ && anim <= BOTH_K6_S6_BR) + || (anim >= BOTH_K7_S7_T_ && anim <= BOTH_K7_S7_BR)) + {//knockaways + return FORCE_LEVEL_3; + } + if ((anim >= BOTH_V1_BR_S1 && anim <= BOTH_V1_B__S1) + || (anim >= BOTH_V6_BR_S6 && anim <= BOTH_V6_B__S6) + || (anim >= BOTH_V7_BR_S7 && anim <= BOTH_V7_B__S7)) + {//knocked-away attacks + return FORCE_LEVEL_1; + } + if ((anim >= BOTH_H1_S1_T_ && anim <= BOTH_H1_S1_BR) + || (anim >= BOTH_H6_S6_T_ && anim <= BOTH_H6_S6_BR) + || (anim >= BOTH_H7_S7_T_ && anim <= BOTH_H7_S7_BR)) + {//broken parries + return FORCE_LEVEL_0; + } + switch (anim) + { + case BOTH_A2_STABBACK1: + if (ps->torsoAnimTimer < 450) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_ATTACK_BACK: + if (ps->torsoAnimTimer < 500) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_CROUCHATTACKBACK1: + if (ps->torsoAnimTimer < 800) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + //FIXME: break up? + return FORCE_LEVEL_3; + break; + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + //FIXME: break up? + return FORCE_LEVEL_3; + break; + case BOTH_K1_S1_T_: //# knockaway saber top + case BOTH_K1_S1_TR: //# knockaway saber top right + case BOTH_K1_S1_TL: //# knockaway saber top left + case BOTH_K1_S1_BL: //# knockaway saber bottom left + case BOTH_K1_S1_B_: //# knockaway saber bottom + case BOTH_K1_S1_BR: //# knockaway saber bottom right + //FIXME: break up? + return FORCE_LEVEL_3; + break; + case BOTH_LUNGE2_B__T_: + if (ps->torsoAnimTimer < 400) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 150) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_FORCELEAP2_T__B_: + if (ps->torsoAnimTimer < 400) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 550) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + return FORCE_LEVEL_3;//??? + break; + case BOTH_JUMPFLIPSLASHDOWN1: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 550) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_JUMPFLIPSTABDOWN: + if (ps->torsoAnimTimer <= 1200) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed <= 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_JUMPATTACK6: + /* + if (pm->ps) + { + if ( ( pm->ps->legsAnimTimer >= 1450 + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 400 ) + ||(pm->ps->legsAnimTimer >= 400 + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 1100 ) ) + {//pretty much sideways + return FORCE_LEVEL_3; + } + } + */ + if ((ps->torsoAnimTimer >= 1450 + && animTimeElapsed >= 400) + || (ps->torsoAnimTimer >= 400 + && animTimeElapsed >= 1100)) + {//pretty much sideways + return FORCE_LEVEL_3; + } + return FORCE_LEVEL_0; + break; + case BOTH_JUMPATTACK7: + if (ps->torsoAnimTimer <= 1200) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_SPINATTACK6: + if (animTimeElapsed <= 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_SPINATTACK7: + if (ps->torsoAnimTimer <= 500) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 500) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_FORCELONGLEAP_ATTACK: + if (animTimeElapsed <= 200) + {//1st four frames of anim + return FORCE_LEVEL_3; + } + break; + /* + case BOTH_A7_KICK_F://these kicks attack, too + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + //FIXME: break up + return FORCE_LEVEL_3; + break; + */ + case BOTH_STABDOWN: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_3; + } + break; + case BOTH_STABDOWN_STAFF: + if (ps->torsoAnimTimer <= 850) + {//end of anim + return FORCE_LEVEL_3; + } + break; + case BOTH_STABDOWN_DUAL: + if (ps->torsoAnimTimer <= 900) + {//end of anim + return FORCE_LEVEL_3; + } + break; + case BOTH_A6_SABERPROTECT: + if (ps->torsoAnimTimer < 650) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A7_SOULCAL: + if (ps->torsoAnimTimer < 650) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 600) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A1_SPECIAL: + if (ps->torsoAnimTimer < 600) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A2_SPECIAL: + if (ps->torsoAnimTimer < 300) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A3_SPECIAL: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 200) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_FLIP_ATTACK7: + return FORCE_LEVEL_3; + break; + case BOTH_PULL_IMPALE_STAB: + if (ps->torsoAnimTimer < 1000) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_PULL_IMPALE_SWING: + if (ps->torsoAnimTimer < 500)//750 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 650)//600 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_ALORA_SPIN_SLASH: + if (ps->torsoAnimTimer < 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A6_FB: + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A6_LR: + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A7_HILT: + return FORCE_LEVEL_0; + break; + //===SABERLOCK SUPERBREAKS START=========================================================================== + case BOTH_LK_S_DL_T_SB_1_W: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_ST_S_SB_1_W: + if (ps->torsoAnimTimer < 300) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + if (ps->torsoAnimTimer < 700) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + if (ps->torsoAnimTimer < 150) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 400) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_DL_T_SB_1_W: + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + if (animTimeElapsed < 1000) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_ST_T_SB_1_W: + if (ps->torsoAnimTimer < 950) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 650) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_S_S_SB_1_W: + if (saberNum != 0) + {//only right hand saber does damage in this suberbreak + return FORCE_LEVEL_0; + } + if (ps->torsoAnimTimer < 900) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 450) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_S_T_SB_1_W: + if (saberNum != 0) + {//only right hand saber does damage in this suberbreak + return FORCE_LEVEL_0; + } + if (ps->torsoAnimTimer < 250) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 150) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_DL_S_SB_1_W: + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_DL_T_SB_1_W: + //special suberbreak - doesn't kill, just kicks them backwards + return FORCE_LEVEL_0; + break; + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + if (ps->torsoAnimTimer < 800) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 350) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + return FORCE_LEVEL_5; + break; + //===SABERLOCK SUPERBREAKS START=========================================================================== + case BOTH_HANG_ATTACK: + //FIME: break up + if (ps->torsoAnimTimer < 1000) + {//end of anim + return FORCE_LEVEL_0; + } + else if (animTimeElapsed < 250) + {//beginning of anim + return FORCE_LEVEL_0; + } + else + {//sweet spot + return FORCE_LEVEL_5; + } + break; + case BOTH_ROLL_STAB: + if (animTimeElapsed > 400) + {//end of anim + return FORCE_LEVEL_0; + } + else + { + return FORCE_LEVEL_3; + } + break; + } + return FORCE_LEVEL_0; + } +} + +qboolean PM_InAnimForSaberMove( int anim, int saberMove ) +{ + switch ( anim ) + {//special case anims + case BOTH_A2_STABBACK1: + case BOTH_ATTACK_BACK: + case BOTH_CROUCHATTACKBACK1: + case BOTH_ROLL_STAB: + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + case BOTH_LUNGE2_B__T_: + case BOTH_FORCELEAP2_T__B_: + case BOTH_JUMPFLIPSLASHDOWN1://# + case BOTH_JUMPFLIPSTABDOWN://# + case BOTH_JUMPATTACK6: + case BOTH_JUMPATTACK7: + case BOTH_SPINATTACK6: + case BOTH_SPINATTACK7: + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + case BOTH_FORCELONGLEAP_ATTACK: + case BOTH_A7_KICK_F: + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + case BOTH_A7_KICK_S: + case BOTH_A7_KICK_BF: + case BOTH_A7_KICK_RL: + case BOTH_A7_KICK_F_AIR: + case BOTH_A7_KICK_B_AIR: + case BOTH_A7_KICK_R_AIR: + case BOTH_A7_KICK_L_AIR: + case BOTH_STABDOWN: + case BOTH_STABDOWN_STAFF: + case BOTH_STABDOWN_DUAL: + case BOTH_A6_SABERPROTECT: + case BOTH_A7_SOULCAL: + case BOTH_A1_SPECIAL: + case BOTH_A2_SPECIAL: + case BOTH_A3_SPECIAL: + case BOTH_FLIP_ATTACK7: + case BOTH_PULL_IMPALE_STAB: + case BOTH_PULL_IMPALE_SWING: + case BOTH_ALORA_SPIN_SLASH: + case BOTH_A6_FB: + case BOTH_A6_LR: + case BOTH_A7_HILT: + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_DL_T_SB_1_W: + case BOTH_LK_S_ST_S_SB_1_W: + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_DL_T_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + case BOTH_LK_DL_ST_T_SB_1_W: + case BOTH_LK_DL_S_S_SB_1_W: + case BOTH_LK_DL_S_T_SB_1_W: + case BOTH_LK_ST_DL_S_SB_1_W: + case BOTH_LK_ST_DL_T_SB_1_W: + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + case BOTH_HANG_ATTACK: + return qtrue; + } + if ( PM_SaberDrawPutawayAnim( anim ) ) + { + if ( saberMove == LS_DRAW || saberMove == LS_PUTAWAY ) + { + return qtrue; + } + return qfalse; + } + else if ( PM_SaberStanceAnim( anim ) ) + { + if ( saberMove == LS_READY ) + { + return qtrue; + } + return qfalse; + } + int animLevel = PM_AnimLevelForSaberAnim( anim ); + if ( animLevel <= 0 ) + {//NOTE: this will always return false for the ready poses and putaway/draw... + return qfalse; + } + //drop the anim to the first level and start the checks there + anim -= (animLevel-FORCE_LEVEL_1)*SABER_ANIM_GROUP_SIZE; + //check level 1 + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + //check level 2 + anim += SABER_ANIM_GROUP_SIZE; + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + //check level 3 + anim += SABER_ANIM_GROUP_SIZE; + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + //check level 4 + anim += SABER_ANIM_GROUP_SIZE; + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + //check level 5 + anim += SABER_ANIM_GROUP_SIZE; + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + if ( anim >= BOTH_P1_S1_T_ && anim <= BOTH_H1_S1_BR ) + {//parries, knockaways and broken parries + return (anim==saberMoveData[saberMove].animToUse); + } + return qfalse; +} + +qboolean PM_SaberInIdle( int move ) +{ + switch ( move ) + { + case LS_NONE: + case LS_READY: + case LS_DRAW: + case LS_PUTAWAY: + return qtrue; + break; + } + return qfalse; +} +qboolean PM_SaberInSpecialAttack( int anim ) +{ + switch ( anim ) + { + case BOTH_A2_STABBACK1: + case BOTH_ATTACK_BACK: + case BOTH_CROUCHATTACKBACK1: + case BOTH_ROLL_STAB: + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + case BOTH_LUNGE2_B__T_: + case BOTH_FORCELEAP2_T__B_: + case BOTH_JUMPFLIPSLASHDOWN1://# + case BOTH_JUMPFLIPSTABDOWN://# + case BOTH_JUMPATTACK6: + case BOTH_JUMPATTACK7: + case BOTH_SPINATTACK6: + case BOTH_SPINATTACK7: + case BOTH_FORCELONGLEAP_ATTACK: + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + case BOTH_A7_KICK_F: + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + case BOTH_A7_KICK_S: + case BOTH_A7_KICK_BF: + case BOTH_A7_KICK_RL: + case BOTH_A7_KICK_F_AIR: + case BOTH_A7_KICK_B_AIR: + case BOTH_A7_KICK_R_AIR: + case BOTH_A7_KICK_L_AIR: + case BOTH_STABDOWN: + case BOTH_STABDOWN_STAFF: + case BOTH_STABDOWN_DUAL: + case BOTH_A6_SABERPROTECT: + case BOTH_A7_SOULCAL: + case BOTH_A1_SPECIAL: + case BOTH_A2_SPECIAL: + case BOTH_A3_SPECIAL: + case BOTH_FLIP_ATTACK7: + case BOTH_PULL_IMPALE_STAB: + case BOTH_PULL_IMPALE_SWING: + case BOTH_ALORA_SPIN_SLASH: + case BOTH_A6_FB: + case BOTH_A6_LR: + case BOTH_A7_HILT: + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_DL_T_SB_1_W: + case BOTH_LK_S_ST_S_SB_1_W: + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_DL_T_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + case BOTH_LK_DL_ST_T_SB_1_W: + case BOTH_LK_DL_S_S_SB_1_W: + case BOTH_LK_DL_S_T_SB_1_W: + case BOTH_LK_ST_DL_S_SB_1_W: + case BOTH_LK_ST_DL_T_SB_1_W: + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + case BOTH_HANG_ATTACK: + return qtrue; + } + return qfalse; +} + +qboolean PM_SaberInAttackPure( int move ) +{ + if ( move >= LS_A_TL2BR && move <= LS_A_T2B ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInAttack( int move ) +{ + if ( move >= LS_A_TL2BR && move <= LS_A_T2B ) + { + return qtrue; + } + switch ( move ) + { + case LS_A_BACK: + case LS_A_BACK_CR: + case LS_A_BACKSTAB: + case LS_ROLL_STAB: + case LS_A_LUNGE: + case LS_A_JUMP_T__B_: + case LS_A_FLIP_STAB: + case LS_A_FLIP_SLASH: + case LS_JUMPATTACK_DUAL: + case LS_JUMPATTACK_ARIAL_LEFT: + case LS_JUMPATTACK_ARIAL_RIGHT: + case LS_JUMPATTACK_CART_LEFT: + case LS_JUMPATTACK_CART_RIGHT: + case LS_JUMPATTACK_STAFF_LEFT: + case LS_JUMPATTACK_STAFF_RIGHT: + case LS_BUTTERFLY_LEFT: + case LS_BUTTERFLY_RIGHT: + case LS_A_BACKFLIP_ATK: + case LS_SPINATTACK_DUAL: + case LS_SPINATTACK: + case LS_LEAP_ATTACK: + case LS_SWOOP_ATTACK_RIGHT: + case LS_SWOOP_ATTACK_LEFT: + case LS_TAUNTAUN_ATTACK_RIGHT: + case LS_TAUNTAUN_ATTACK_LEFT: + case LS_KICK_F: + case LS_KICK_B: + case LS_KICK_R: + case LS_KICK_L: + case LS_KICK_S: + case LS_KICK_BF: + case LS_KICK_RL: + case LS_KICK_F_AIR: + case LS_KICK_B_AIR: + case LS_KICK_R_AIR: + case LS_KICK_L_AIR: + case LS_STABDOWN: + case LS_STABDOWN_STAFF: + case LS_STABDOWN_DUAL: + case LS_DUAL_SPIN_PROTECT: + case LS_STAFF_SOULCAL: + case LS_A1_SPECIAL: + case LS_A2_SPECIAL: + case LS_A3_SPECIAL: + case LS_UPSIDE_DOWN_ATTACK: + case LS_PULL_ATTACK_STAB: + case LS_PULL_ATTACK_SWING: + case LS_SPINATTACK_ALORA: + case LS_DUAL_FB: + case LS_DUAL_LR: + case LS_HILT_BASH: + return qtrue; + break; + } + return qfalse; +} +qboolean PM_SaberInTransition( int move ) +{ + if ( move >= LS_T1_BR__R && move <= LS_T1_BL__L ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInStart( int move ) +{ + if ( move >= LS_S_TL2BR && move <= LS_S_T2B ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInReturn( int move ) +{ + if ( move >= LS_R_TL2BR && move <= LS_R_T2B ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInTransitionAny( int move ) +{ + if ( PM_SaberInStart( move ) ) + { + return qtrue; + } + else if ( PM_SaberInTransition( move ) ) + { + return qtrue; + } + else if ( PM_SaberInReturn( move ) ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInBounce( int move ) +{ + if ( move >= LS_B1_BR && move <= LS_B1_BL ) + { + return qtrue; + } + if ( move >= LS_D1_BR && move <= LS_D1_BL ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInBrokenParry( int move ) +{ + if ( move >= LS_V1_BR && move <= LS_V1_B_ ) + { + return qtrue; + } + if ( move >= LS_H1_T_ && move <= LS_H1_BL ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInDeflect( int move ) +{ + if ( move >= LS_D1_BR && move <= LS_D1_B_ ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInParry( int move ) +{ + if ( move >= LS_PARRY_UP && move <= LS_PARRY_LL ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInKnockaway( int move ) +{ + if ( move >= LS_K1_T_ && move <= LS_K1_BL ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInReflect( int move ) +{ + if ( move >= LS_REFLECT_UP && move <= LS_REFLECT_LL ) + { + return qtrue; + } + return qfalse; +} + +qboolean PM_SaberInSpecial( int move ) +{ + switch( move ) + { + case LS_A_BACK: + case LS_A_BACK_CR: + case LS_A_BACKSTAB: + case LS_ROLL_STAB: + case LS_A_LUNGE: + case LS_A_JUMP_T__B_: + case LS_A_FLIP_STAB: + case LS_A_FLIP_SLASH: + case LS_JUMPATTACK_DUAL: + case LS_JUMPATTACK_ARIAL_LEFT: + case LS_JUMPATTACK_ARIAL_RIGHT: + case LS_JUMPATTACK_CART_LEFT: + case LS_JUMPATTACK_CART_RIGHT: + case LS_JUMPATTACK_STAFF_LEFT: + case LS_JUMPATTACK_STAFF_RIGHT: + case LS_BUTTERFLY_LEFT: + case LS_BUTTERFLY_RIGHT: + case LS_A_BACKFLIP_ATK: + case LS_SPINATTACK_DUAL: + case LS_SPINATTACK: + case LS_LEAP_ATTACK: + case LS_SWOOP_ATTACK_RIGHT: + case LS_SWOOP_ATTACK_LEFT: + case LS_TAUNTAUN_ATTACK_RIGHT: + case LS_TAUNTAUN_ATTACK_LEFT: + case LS_KICK_F: + case LS_KICK_B: + case LS_KICK_R: + case LS_KICK_L: + case LS_KICK_S: + case LS_KICK_BF: + case LS_KICK_RL: + case LS_KICK_F_AIR: + case LS_KICK_B_AIR: + case LS_KICK_R_AIR: + case LS_KICK_L_AIR: + case LS_STABDOWN: + case LS_STABDOWN_STAFF: + case LS_STABDOWN_DUAL: + case LS_DUAL_SPIN_PROTECT: + case LS_STAFF_SOULCAL: + case LS_A1_SPECIAL: + case LS_A2_SPECIAL: + case LS_A3_SPECIAL: + case LS_UPSIDE_DOWN_ATTACK: + case LS_PULL_ATTACK_STAB: + case LS_PULL_ATTACK_SWING: + case LS_SPINATTACK_ALORA: + case LS_DUAL_FB: + case LS_DUAL_LR: + case LS_HILT_BASH: + return qtrue; + } + return qfalse; +} + +qboolean PM_KickMove( int move ) +{ + switch( move ) + { + case LS_KICK_F: + case LS_KICK_B: + case LS_KICK_R: + case LS_KICK_L: + case LS_KICK_S: + case LS_KICK_BF: + case LS_KICK_RL: + case LS_HILT_BASH: + case LS_KICK_F_AIR: + case LS_KICK_B_AIR: + case LS_KICK_R_AIR: + case LS_KICK_L_AIR: + return qtrue; + } + return qfalse; +} + +qboolean PM_SaberCanInterruptMove( int move, int anim ) +{ + if ( PM_InAnimForSaberMove( anim, move ) ) + { + switch( move ) + { + case LS_A_BACK: + case LS_A_BACK_CR: + case LS_A_BACKSTAB: + case LS_ROLL_STAB: + case LS_A_LUNGE: + case LS_A_JUMP_T__B_: + case LS_A_FLIP_STAB: + case LS_A_FLIP_SLASH: + case LS_JUMPATTACK_DUAL: + case LS_JUMPATTACK_CART_LEFT: + case LS_JUMPATTACK_CART_RIGHT: + case LS_JUMPATTACK_STAFF_LEFT: + case LS_JUMPATTACK_STAFF_RIGHT: + case LS_BUTTERFLY_LEFT: + case LS_BUTTERFLY_RIGHT: + case LS_A_BACKFLIP_ATK: + case LS_SPINATTACK_DUAL: + case LS_SPINATTACK: + case LS_LEAP_ATTACK: + case LS_SWOOP_ATTACK_RIGHT: + case LS_SWOOP_ATTACK_LEFT: + case LS_TAUNTAUN_ATTACK_RIGHT: + case LS_TAUNTAUN_ATTACK_LEFT: + case LS_KICK_S: + case LS_KICK_BF: + case LS_KICK_RL: + case LS_STABDOWN: + case LS_STABDOWN_STAFF: + case LS_STABDOWN_DUAL: + case LS_DUAL_SPIN_PROTECT: + case LS_STAFF_SOULCAL: + case LS_A1_SPECIAL: + case LS_A2_SPECIAL: + case LS_A3_SPECIAL: + case LS_UPSIDE_DOWN_ATTACK: + case LS_PULL_ATTACK_STAB: + case LS_PULL_ATTACK_SWING: + case LS_SPINATTACK_ALORA: + case LS_DUAL_FB: + case LS_DUAL_LR: + case LS_HILT_BASH: + return qfalse; + } + + if ( PM_SaberInAttackPure( move ) ) + { + return qfalse; + } + if ( PM_SaberInStart( move ) ) + { + return qfalse; + } + if ( PM_SaberInTransition( move ) ) + { + return qfalse; + } + if ( PM_SaberInBounce( move ) ) + { + return qfalse; + } + if ( PM_SaberInBrokenParry( move ) ) + { + return qfalse; + } + if ( PM_SaberInDeflect( move ) ) + { + return qfalse; + } + if ( PM_SaberInParry( move ) ) + { + return qfalse; + } + if ( PM_SaberInKnockaway( move ) ) + { + return qfalse; + } + if ( PM_SaberInReflect( move ) ) + { + return qfalse; + } + } + switch ( anim ) + { + case BOTH_A2_STABBACK1: + case BOTH_ATTACK_BACK: + case BOTH_CROUCHATTACKBACK1: + case BOTH_ROLL_STAB: + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + case BOTH_LUNGE2_B__T_: + case BOTH_FORCELEAP2_T__B_: + case BOTH_JUMPFLIPSLASHDOWN1://# + case BOTH_JUMPFLIPSTABDOWN://# + case BOTH_JUMPATTACK6: + case BOTH_JUMPATTACK7: + case BOTH_SPINATTACK6: + case BOTH_SPINATTACK7: + case BOTH_FORCELONGLEAP_ATTACK: + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + case BOTH_A7_KICK_S: + case BOTH_A7_KICK_BF: + case BOTH_A7_KICK_RL: + case BOTH_STABDOWN: + case BOTH_STABDOWN_STAFF: + case BOTH_STABDOWN_DUAL: + case BOTH_A6_SABERPROTECT: + case BOTH_A7_SOULCAL: + case BOTH_A1_SPECIAL: + case BOTH_A2_SPECIAL: + case BOTH_A3_SPECIAL: + case BOTH_FLIP_ATTACK7: + case BOTH_PULL_IMPALE_STAB: + case BOTH_PULL_IMPALE_SWING: + case BOTH_ALORA_SPIN_SLASH: + case BOTH_A6_FB: + case BOTH_A6_LR: + case BOTH_A7_HILT: + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_DL_T_SB_1_W: + case BOTH_LK_S_ST_S_SB_1_W: + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_DL_T_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + case BOTH_LK_DL_ST_T_SB_1_W: + case BOTH_LK_DL_S_S_SB_1_W: + case BOTH_LK_DL_S_T_SB_1_W: + case BOTH_LK_ST_DL_S_SB_1_W: + case BOTH_LK_ST_DL_T_SB_1_W: + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + case BOTH_HANG_ATTACK: + return qfalse; + } + return qtrue; +} + +saberMoveName_t PM_BrokenParryForAttack( int move ) +{ + //Our attack was knocked away by a knockaway parry + //FIXME: need actual anims for this + //FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center + switch ( saberMoveData[move].startQuad ) + { + case Q_B: + return LS_V1_B_; + break; + case Q_BR: + return LS_V1_BR; + break; + case Q_R: + return LS_V1__R; + break; + case Q_TR: + return LS_V1_TR; + break; + case Q_T: + return LS_V1_T_; + break; + case Q_TL: + return LS_V1_TL; + break; + case Q_L: + return LS_V1__L; + break; + case Q_BL: + return LS_V1_BL; + break; + } + return LS_NONE; +} + +saberMoveName_t PM_BrokenParryForParry( int move ) +{ + //FIXME: need actual anims for this + //FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center + switch ( move ) + { + case LS_PARRY_UP: + //Hmm... since we don't know what dir the hit came from, randomly pick knock down or knock back + if ( Q_irand( 0, 1 ) ) + { + return LS_H1_B_; + } + else + { + return LS_H1_T_; + } + break; + case LS_PARRY_UR: + return LS_H1_TR; + break; + case LS_PARRY_UL: + return LS_H1_TL; + break; + case LS_PARRY_LR: + return LS_H1_BR; + break; + case LS_PARRY_LL: + return LS_H1_BL; + break; + case LS_READY: + return LS_H1_B_;//??? + break; + } + return LS_NONE; +} + +saberMoveName_t PM_KnockawayForParry( int move ) +{ + //FIXME: need actual anims for this + //FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center + switch ( move ) + { + case BLOCKED_TOP://LS_PARRY_UP: + return LS_K1_T_;//push up + break; + case BLOCKED_UPPER_RIGHT://LS_PARRY_UR: + default://case LS_READY: + return LS_K1_TR;//push up, slightly to right + break; + case BLOCKED_UPPER_LEFT://LS_PARRY_UL: + return LS_K1_TL;//push up and to left + break; + case BLOCKED_LOWER_RIGHT://LS_PARRY_LR: + return LS_K1_BR;//push down and to left + break; + case BLOCKED_LOWER_LEFT://LS_PARRY_LL: + return LS_K1_BL;//push down and to right + break; + } + //return LS_NONE; +} + +saberMoveName_t PM_SaberBounceForAttack( int move ) +{ + switch ( saberMoveData[move].startQuad ) + { + case Q_B: + case Q_BR: + return LS_B1_BR; + break; + case Q_R: + return LS_B1__R; + break; + case Q_TR: + return LS_B1_TR; + break; + case Q_T: + return LS_B1_T_; + break; + case Q_TL: + return LS_B1_TL; + break; + case Q_L: + return LS_B1__L; + break; + case Q_BL: + return LS_B1_BL; + break; + } + return LS_NONE; +} + +saberMoveName_t PM_AttackMoveForQuad( int quad ) +{ + switch ( quad ) + { + case Q_B: + case Q_BR: + return LS_A_BR2TL; + break; + case Q_R: + return LS_A_R2L; + break; + case Q_TR: + return LS_A_TR2BL; + break; + case Q_T: + return LS_A_T2B; + break; + case Q_TL: + return LS_A_TL2BR; + break; + case Q_L: + return LS_A_L2R; + break; + case Q_BL: + return LS_A_BL2TR; + break; + } + return LS_NONE; +} + +int saberMoveTransitionAngle[Q_NUM_QUADS][Q_NUM_QUADS] = +{ + { + 0,//Q_BR,Q_BR, + 45,//Q_BR,Q_R, + 90,//Q_BR,Q_TR, + 135,//Q_BR,Q_T, + 180,//Q_BR,Q_TL, + 215,//Q_BR,Q_L, + 270,//Q_BR,Q_BL, + 45,//Q_BR,Q_B, + }, + { + 45,//Q_R,Q_BR, + 0,//Q_R,Q_R, + 45,//Q_R,Q_TR, + 90,//Q_R,Q_T, + 135,//Q_R,Q_TL, + 180,//Q_R,Q_L, + 215,//Q_R,Q_BL, + 90,//Q_R,Q_B, + }, + { + 90,//Q_TR,Q_BR, + 45,//Q_TR,Q_R, + 0,//Q_TR,Q_TR, + 45,//Q_TR,Q_T, + 90,//Q_TR,Q_TL, + 135,//Q_TR,Q_L, + 180,//Q_TR,Q_BL, + 135,//Q_TR,Q_B, + }, + { + 135,//Q_T,Q_BR, + 90,//Q_T,Q_R, + 45,//Q_T,Q_TR, + 0,//Q_T,Q_T, + 45,//Q_T,Q_TL, + 90,//Q_T,Q_L, + 135,//Q_T,Q_BL, + 180,//Q_T,Q_B, + }, + { + 180,//Q_TL,Q_BR, + 135,//Q_TL,Q_R, + 90,//Q_TL,Q_TR, + 45,//Q_TL,Q_T, + 0,//Q_TL,Q_TL, + 45,//Q_TL,Q_L, + 90,//Q_TL,Q_BL, + 135,//Q_TL,Q_B, + }, + { + 215,//Q_L,Q_BR, + 180,//Q_L,Q_R, + 135,//Q_L,Q_TR, + 90,//Q_L,Q_T, + 45,//Q_L,Q_TL, + 0,//Q_L,Q_L, + 45,//Q_L,Q_BL, + 90,//Q_L,Q_B, + }, + { + 270,//Q_BL,Q_BR, + 215,//Q_BL,Q_R, + 180,//Q_BL,Q_TR, + 135,//Q_BL,Q_T, + 90,//Q_BL,Q_TL, + 45,//Q_BL,Q_L, + 0,//Q_BL,Q_BL, + 45,//Q_BL,Q_B, + }, + { + 45,//Q_B,Q_BR, + 90,//Q_B,Q_R, + 135,//Q_B,Q_TR, + 180,//Q_B,Q_T, + 135,//Q_B,Q_TL, + 90,//Q_B,Q_L, + 45,//Q_B,Q_BL, + 0//Q_B,Q_B, + } +}; + +int PM_SaberAttackChainAngle( int move1, int move2 ) +{ + if ( move1 == -1 || move2 == -1 ) + { + return -1; + } + return saberMoveTransitionAngle[saberMoveData[move1].endQuad][saberMoveData[move2].startQuad]; +} + +qboolean PM_SaberKataDone( int curmove = LS_NONE, int newmove = LS_NONE ) +{ + if ( pm->ps->forceRageRecoveryTime > level.time ) + {//rage recovery, only 1 swing at a time (tired) + if ( pm->ps->saberAttackChainCount > 0 ) + {//swung once + return qtrue; + } + else + {//allow one attack + return qfalse; + } + } + else if ( (pm->ps->forcePowersActive&(1<ps->saber[0].maxChain == -1 ) + { + return qfalse; + } + else if ( pm->ps->saber[0].maxChain != 0 ) + { + if ( pm->ps->saberAttackChainCount >= pm->ps->saber[0].maxChain ) + { + return qtrue; + } + else + { + return qfalse; + } + } + + if ( pm->ps->saberAnimLevel == SS_DESANN || pm->ps->saberAnimLevel == SS_TAVION ) + {//desann and tavion can link up as many attacks as they want + return qfalse; + } + //FIXME: instead of random, apply some sort of logical conditions to whether or + // not you can chain? Like if you were completely missed, you can't chain as much, or...? + // And/Or based on FP_SABER_OFFENSE level? So number of attacks you can chain + // increases with your FP_SABER_OFFENSE skill? + if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + //TEMP: for now, let staff attacks infinitely chain + return qfalse; + /* + if ( pm->ps->saberAttackChainCount > Q_irand( 3, 4 ) ) + { + return qtrue; + } + else if ( pm->ps->saberAttackChainCount > 0 ) + { + int chainAngle = PM_SaberAttackChainAngle( curmove, newmove ); + if ( chainAngle < 135 || chainAngle > 215 ) + {//if trying to chain to a move that doesn't continue the momentum + if ( pm->ps->saberAttackChainCount > 1 ) + { + return qtrue; + } + } + else if ( chainAngle == 180 ) + {//continues the momentum perfectly, allow it to chain 66% of the time + if ( pm->ps->saberAttackChainCount > 2 ) + { + return qtrue; + } + } + else + {//would continue the movement somewhat, 50% chance of continuing + if ( pm->ps->saberAttackChainCount > 3 ) + { + return qtrue; + } + } + } + */ + } + else if ( pm->ps->saberAnimLevel == SS_DUAL ) + { + //TEMP: for now, let staff attacks infinitely chain + return qfalse; + } + else if ( pm->ps->saberAnimLevel == FORCE_LEVEL_3 ) + { + if ( curmove == LS_NONE || newmove == LS_NONE ) + { + if ( pm->ps->saberAnimLevel >= FORCE_LEVEL_3 && pm->ps->saberAttackChainCount > Q_irand( 0, 1 ) ) + { + return qtrue; + } + } + else if ( pm->ps->saberAttackChainCount > Q_irand( 2, 3 ) ) + { + return qtrue; + } + else if ( pm->ps->saberAttackChainCount > 0 ) + { + int chainAngle = PM_SaberAttackChainAngle( curmove, newmove ); + if ( chainAngle < 135 || chainAngle > 215 ) + {//if trying to chain to a move that doesn't continue the momentum + return qtrue; + } + else if ( chainAngle == 180 ) + {//continues the momentum perfectly, allow it to chain 66% of the time + if ( pm->ps->saberAttackChainCount > 1 ) + { + return qtrue; + } + } + else + {//would continue the movement somewhat, 50% chance of continuing + if ( pm->ps->saberAttackChainCount > 2 ) + { + return qtrue; + } + } + } + } + else if ( g_saberNewCombat->integer ) //new code + {//FIXME: have chainAngle influence fast and medium chains as well? + if ( (pm->ps->saberAnimLevel == FORCE_LEVEL_3 || pm->ps->saberAnimLevel == SS_DUAL) + && pm->ps->saberAttackChainCount > Q_irand( 2, 5 ) ) + { + return qtrue; + } + } + else //old code + {//FIXME: have chainAngle influence fast and medium chains as well? + if ((pm->ps->saberAnimLevel == FORCE_LEVEL_2 || pm->ps->saberAnimLevel == SS_DUAL) + && pm->ps->saberAttackChainCount > Q_irand(2, 5)) + { + return qtrue; + } + } + return qfalse; +} + +qboolean PM_CheckEnemyInBack( float backCheckDist ) +{ + if ( !pm->gent || !pm->gent->client ) + { + return qfalse; + } + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) + && !g_saberAutoAim->integer && pm->cmd.forwardmove >= 0 ) + {//don't auto-backstab + return qfalse; + } + if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) + {//only when on ground + return qfalse; + } + trace_t trace; + vec3_t end, fwd, fwdAngles = {0,pm->ps->viewangles[YAW],0}; + + AngleVectors( fwdAngles, fwd, NULL, NULL ); + VectorMA( pm->ps->origin, -backCheckDist, fwd, end ); + + pm->trace( &trace, pm->ps->origin, vec3_origin, vec3_origin, end, pm->ps->clientNum, CONTENTS_SOLID|CONTENTS_BODY, (EG2_Collision)0, 0 ); + if ( trace.fraction < 1.0f && trace.entityNum < ENTITYNUM_WORLD ) + { + gentity_t *traceEnt = &g_entities[trace.entityNum]; + if ( traceEnt + && traceEnt->health > 0 + && traceEnt->client + && traceEnt->client->playerTeam == pm->gent->client->enemyTeam + && traceEnt->client->ps.groundEntityNum != ENTITYNUM_NONE ) + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + {//player + if ( pm->gent ) + {//set player enemy to traceEnt so he auto-aims at him + pm->gent->enemy = traceEnt; + } + } + return qtrue; + } + } + return qfalse; +} + +saberMoveName_t PM_PickBackStab( void ) +{ + if ( !pm->gent || !pm->gent->client ) + { + return LS_READY; + } + if ( pm->ps->dualSabers + && pm->ps->saber[1].Active() ) + { + if ( pm->ps->pm_flags & PMF_DUCKED ) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } + if ( pm->gent->client->ps.saberAnimLevel == SS_TAVION ) + { + return LS_A_BACKSTAB; + } + else if ( pm->gent->client->ps.saberAnimLevel == SS_DESANN ) + { + if ( pm->ps->saberMove == LS_READY || !Q_irand( 0, 3 ) ) + { + return LS_A_BACKSTAB; + } + else if ( pm->ps->pm_flags & PMF_DUCKED ) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } + else if ( (pm->ps->saberAnimLevel == FORCE_LEVEL_3 + || pm->ps->saberAnimLevel == SS_DUAL) && g_saberNewCombat->integer ) //new code + {//using medium attacks or dual sabers + if ( pm->ps->pm_flags & PMF_DUCKED ) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } + else if (pm->ps->saberAnimLevel == FORCE_LEVEL_2 + || pm->ps->saberAnimLevel == SS_DUAL) //old code + {//using medium attacks or dual sabers + if (pm->ps->pm_flags & PMF_DUCKED) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } + else + { + return LS_A_BACKSTAB; + } +} + +saberMoveName_t PM_CheckStabDown( void ) +{ + if ( !pm->gent || !pm->gent->enemy || !pm->gent->enemy->client ) + { + return LS_NONE; + } + if ( (pm->ps->saber[0].saberFlags&SFL_NO_STABDOWN) ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers + && (pm->ps->saber[1].saberFlags&SFL_NO_STABDOWN) ) + { + return LS_NONE; + } + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingKataAttack( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//want to try a special + return LS_NONE; + } + } + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + {//player + if ( pm->ps->groundEntityNum == ENTITYNUM_NONE )//in air + {//sorry must be on ground (or have just jumped) + if ( level.time-pm->ps->lastOnGround <= 50 && (pm->ps->pm_flags&PMF_JUMPING) ) + {//just jumped, it's okay + } + else + { + return LS_NONE; + } + } + /* + if ( pm->cmd.upmove > 0 ) + {//trying to jump + } + else if ( pm->ps->groundEntityNum == ENTITYNUM_NONE //in air + && level.time-pm->ps->lastOnGround <= 250 //just left ground + && (pm->ps->pm_flags&PMF_JUMPING) )//jumped + {//just jumped + } + else + { + return LS_NONE; + } + */ + pm->ps->velocity[2] = 0; + pm->cmd.upmove = 0; + } + else if ( (pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) ) + {//NPC + if ( pm->ps->groundEntityNum == ENTITYNUM_NONE )//in air + {//sorry must be on ground (or have just jumped) + if ( level.time-pm->ps->lastOnGround <= 250 && (pm->ps->pm_flags&PMF_JUMPING) ) + {//just jumped, it's okay + } + else + { + return LS_NONE; + } + } + if ( !pm->gent->NPC ) + {//wtf??? + return LS_NONE; + } + if ( Q_irand( 0, RANK_CAPTAIN ) > pm->gent->NPC->rank ) + {//lower ranks do this less often + return LS_NONE; + } + } + vec3_t enemyDir, faceFwd, facingAngles = {0, pm->ps->viewangles[YAW], 0}; + AngleVectors( facingAngles, faceFwd, NULL, NULL ); + VectorSubtract( pm->gent->enemy->currentOrigin, pm->ps->origin, enemyDir ); + float enemyZDiff = enemyDir[2]; + enemyDir[2] = 0; + float enemyHDist = VectorNormalize( enemyDir )-(pm->gent->maxs[0]+pm->gent->enemy->maxs[0]); + float dot = DotProduct( enemyDir, faceFwd ); + + if ( //(pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + dot > 0.65f + //&& enemyHDist >= 32 //was 48 + && enemyHDist <= 164//was 112 + && PM_InKnockDownOnGround( &pm->gent->enemy->client->ps )//still on ground + && !PM_InGetUpNoRoll( &pm->gent->enemy->client->ps )//not getting up yet + && enemyZDiff <= 20 ) + {//guy is on the ground below me, do a top-down attack + if ( pm->gent->enemy->s.number >= MAX_CLIENTS + || !G_ControlledByPlayer( pm->gent->enemy ) ) + {//don't get up while I'm doing this + //stop them from trying to get up for at least another 3 seconds + TIMER_Set( pm->gent->enemy, "noGetUpStraight", 3000 ); + } + //pick the right anim + if ( pm->ps->saberAnimLevel == SS_DUAL + || (pm->ps->dualSabers&&pm->ps->saber[1].Active()) ) + { + return LS_STABDOWN_DUAL; + } + else if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + return LS_STABDOWN_STAFF; + } + else + { + return LS_STABDOWN; + } + } + return LS_NONE; +} + +extern saberMoveName_t PM_NPCSaberAttackFromQuad( int quad ); +saberMoveName_t PM_SaberFlipOverAttackMove( void ); +saberMoveName_t PM_AttackForEnemyPos( qboolean allowFB, qboolean allowStabDown ) +{ + saberMoveName_t autoMove = LS_INVALID; + + if( !pm->gent->enemy ) + { + return LS_NONE; + } + + vec3_t enemy_org, enemyDir, faceFwd, faceRight, faceUp, facingAngles = {0, pm->ps->viewangles[YAW], 0}; + AngleVectors( facingAngles, faceFwd, faceRight, faceUp ); + //FIXME: predict enemy position? + if ( pm->gent->enemy->client ) + { + //VectorCopy( pm->gent->enemy->currentOrigin, enemy_org ); + //HMM... using this will adjust for bbox size, so let's do that... + vec3_t size; + VectorSubtract( pm->gent->enemy->absmax, pm->gent->enemy->absmin, size ); + VectorMA( pm->gent->enemy->absmin, 0.5, size, enemy_org ); + + VectorSubtract( pm->gent->enemy->client->renderInfo.eyePoint, pm->ps->origin, enemyDir ); + } + else + { + if ( pm->gent->enemy->bmodel && VectorCompare( vec3_origin, pm->gent->enemy->currentOrigin ) ) + {//a brush model without an origin brush + vec3_t size; + VectorSubtract( pm->gent->enemy->absmax, pm->gent->enemy->absmin, size ); + VectorMA( pm->gent->enemy->absmin, 0.5, size, enemy_org ); + } + else + { + VectorCopy( pm->gent->enemy->currentOrigin, enemy_org ); + } + VectorSubtract( enemy_org, pm->ps->origin, enemyDir ); + } + float enemyZDiff = enemyDir[2]; + float enemyDist = VectorNormalize( enemyDir ); + float dot = DotProduct( enemyDir, faceFwd ); + if ( dot > 0 ) + {//enemy is in front + if ( allowStabDown ) + {//okay to try this + saberMoveName_t stabDownMove = PM_CheckStabDown(); + if ( stabDownMove != LS_NONE ) + { + return stabDownMove; + } + } + if ( (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + && dot > 0.65f + && enemyDist <= 64 && pm->gent->enemy->client + && (enemyZDiff <= 20 || PM_InKnockDownOnGround( &pm->gent->enemy->client->ps ) || PM_CrouchAnim( pm->gent->enemy->client->ps.legsAnim ) ) ) + {//swing down at them + return LS_A_T2B; + } + if ( allowFB ) + {//directly in front anim allowed + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK)) ) + {//okay to do backstabs with this saber + if ( enemyDist > 200 || pm->gent->enemy->health <= 0 ) + {//hmm, look in back for an enemy + if ( pm->ps->clientNum && !PM_ControlledByPlayer() ) + {//player should never do this automatically + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//only when on ground + if ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) + {//only fencers and higher can do this, higher rank does it more + if ( PM_CheckEnemyInBack( 100 ) ) + { + return PM_PickBackStab(); + } + } + } + } + } + } + //this is the default only if they're *right* in front... + if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) + || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) ) + {//NPC or player not in 1st person + if ( PM_CheckFlipOverAttackMove( qtrue ) ) + {//enemy must be close and in front + return PM_SaberFlipOverAttackMove(); + } + } + if ( PM_CheckLungeAttackMove() ) + {//NPC + autoMove = PM_SaberLungeAttackMove( qtrue ); + } + else + { + autoMove = LS_A_T2B; + } + } + else + {//pick a random one + if ( Q_irand( 0, 1 ) ) + { + autoMove = LS_A_TR2BL; + } + else + { + autoMove = LS_A_TL2BR; + } + } + float dotR = DotProduct( enemyDir, faceRight ); + if ( dotR > 0.35 ) + {//enemy is to far right + autoMove = LS_A_L2R; + } + else if ( dotR < -0.35 ) + {//far left + autoMove = LS_A_R2L; + } + else if ( dotR > 0.15 ) + {//enemy is to near right + autoMove = LS_A_TR2BL; + } + else if ( dotR < -0.15 ) + {//near left + autoMove = LS_A_TL2BR; + } + if ( DotProduct( enemyDir, faceUp ) > 0.5 ) + {//enemy is above me + if ( autoMove == LS_A_TR2BL ) + { + autoMove = LS_A_BL2TR; + } + else if ( autoMove == LS_A_TL2BR ) + { + autoMove = LS_A_BR2TL; + } + } + } + else if ( allowFB ) + {//back attack allowed + //if ( !PM_InKnockDown( pm->ps ) ) + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK)) ) + {//okay to do backstabs with this saber + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//only when on ground + if ( !pm->gent->enemy->client || pm->gent->enemy->client->ps.groundEntityNum != ENTITYNUM_NONE ) + {//enemy not a client or is a client and on ground + if ( dot < -0.75f + && enemyDist < 128 + && (pm->ps->saberAnimLevel == SS_FAST || pm->ps->saberAnimLevel == SS_STAFF || (pm->gent->client &&(pm->gent->client->NPC_class == CLASS_TAVION||pm->gent->client->NPC_class == CLASS_ALORA)&&Q_irand(0,2))) ) + {//fast back-stab + if ( !(pm->ps->pm_flags&PMF_DUCKED) && pm->cmd.upmove >= 0 ) + {//can't do it while ducked? + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || (pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG) ) + {//only fencers and above can do this + autoMove = LS_A_BACKSTAB; + } + } + } + else if ( pm->ps->saberAnimLevel != SS_FAST + && pm->ps->saberAnimLevel != SS_STAFF ) + {//higher level back spin-attacks + if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) ) + { + if ( (pm->ps->pm_flags&PMF_DUCKED) || pm->cmd.upmove < 0 ) + { + autoMove = LS_A_BACK_CR; + } + else + { + autoMove = LS_A_BACK; + } + } + } + } + } + } + } + return autoMove; +} + +qboolean PM_InSecondaryStyle( void ) +{ + if ( pm->ps->saber[0].numBlades > 1 + && pm->ps->saber[0].singleBladeStyle + && (pm->ps->saber[0].stylesForbidden&(1<ps->saber[0].singleBladeStyle)) + && pm->ps->saberAnimLevel == pm->ps->saber[0].singleBladeStyle ) + { + return qtrue; + } + + if ( pm->ps->dualSabers + && !pm->ps->saber[1].Active() )//pm->ps->saberAnimLevel != SS_DUAL ) + { + return qtrue; + } + return qfalse; +} + +saberMoveName_t PM_SaberLungeAttackMove( qboolean fallbackToNormalLunge ) +{ + G_DrainPowerForSpecialMove( pm->gent, FP_SABER_OFFENSE, SABER_ALT_ATTACK_POWER_FB ); + + //see if we have an overridden (or cancelled) lunge move + if ( pm->ps->saber[0].lungeAtkMove != LS_INVALID ) + { + if ( pm->ps->saber[0].lungeAtkMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].lungeAtkMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].lungeAtkMove != LS_INVALID ) + { + if ( pm->ps->saber[1].lungeAtkMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].lungeAtkMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].lungeAtkMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].lungeAtkMove == LS_NONE ) + { + return LS_NONE; + } + } + //do normal checks + if ( pm->gent->client->NPC_class == CLASS_ALORA && !Q_irand( 0, 3 ) ) + {//alora NPC + return LS_SPINATTACK_ALORA; + } + else + { + if ( pm->ps->dualSabers ) + { + return LS_SPINATTACK_DUAL; + } + switch ( pm->ps->saberAnimLevel ) + { + case SS_DUAL: + return LS_SPINATTACK_DUAL; + break; + case SS_STAFF: + return LS_SPINATTACK; + break; + default://normal lunge + if ( fallbackToNormalLunge ) + { + vec3_t fwdAngles, jumpFwd; + + VectorCopy( pm->ps->viewangles, fwdAngles ); + fwdAngles[PITCH] = fwdAngles[ROLL] = 0; + //do the lunge + AngleVectors( fwdAngles, jumpFwd, NULL, NULL ); + VectorScale( jumpFwd, 150, pm->ps->velocity ); + pm->ps->velocity[2] = 50; + PM_AddEvent( EV_JUMP ); + + return LS_A_LUNGE; + } + break; + } + } + return LS_NONE; +} + +qboolean PM_CheckLungeAttackMove( void ) +{ + //check to see if it's cancelled? + if ( pm->ps->saber[0].lungeAtkMove == LS_NONE ) + { + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].lungeAtkMove == LS_NONE + || pm->ps->saber[1].lungeAtkMove == LS_INVALID ) + { + return qfalse; + } + } + else + { + return qfalse; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].lungeAtkMove == LS_NONE ) + { + if ( pm->ps->saber[0].lungeAtkMove == LS_NONE + || pm->ps->saber[0].lungeAtkMove == LS_INVALID ) + { + return qfalse; + } + } + } + //do normal checks + if ( pm->ps->saberAnimLevel == SS_FAST//fast + || pm->ps->saberAnimLevel == SS_DUAL//dual + || pm->ps->saberAnimLevel == SS_STAFF //staff + || pm->ps->saberAnimLevel == SS_DESANN + || pm->ps->dualSabers ) + {//alt+back+attack using fast, dual or staff attacks + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->cmd.upmove < 0 || (pm->ps->pm_flags&PMF_DUCKED) ) + {//ducking + if ( pm->ps->legsAnim == BOTH_STAND2 + || pm->ps->legsAnim == BOTH_SABERFAST_STANCE + || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE + || pm->ps->legsAnim == BOTH_SABERSTAFF_STANCE + || pm->ps->legsAnim == BOTH_SABERDUAL_STANCE + || (level.time-pm->ps->lastStationary) <= 500 ) + {//standing or just stopped standing + if ( pm->gent + && pm->gent->NPC //NPC + && pm->gent->NPC->rank >= RANK_LT_JG //high rank + && ( pm->gent->NPC->rank == RANK_LT_JG || Q_irand( -3, pm->gent->NPC->rank ) >= RANK_LT_JG )//Q_irand( 0, pm->gent->NPC->rank ) >= RANK_LT_JG ) + && !Q_irand( 0, 3-g_spskill->integer ) ) + {//only fencer and higher can do this + if ( pm->ps->saberAnimLevel == SS_DESANN ) + { + if ( !Q_irand( 0, 4 ) ) + { + return qtrue; + } + } + else + { + return qtrue; + } + } + } + } + } + else + {//player + if ( G_TryingLungeAttack( pm->gent, &pm->cmd ) + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB )/*pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB*/ )//have enough force power to pull it off + { + return qtrue; + } + } + } + + return qfalse; +} + +saberMoveName_t PM_SaberJumpForwardAttackMove( void ) +{ + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_FB ); + + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].jumpAtkFwdMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkFwdMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].jumpAtkFwdMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove != LS_INVALID ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].jumpAtkFwdMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + { + return LS_NONE; + } + } + if ( pm->ps->saberAnimLevel == SS_DUAL + || pm->ps->saberAnimLevel == SS_STAFF ) + { + pm->cmd.upmove = 0;//no jump just yet + + if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + if ( Q_irand(0, 1) ) + { + return LS_JUMPATTACK_STAFF_LEFT; + } + else + { + return LS_JUMPATTACK_STAFF_RIGHT; + } + } + + return LS_JUMPATTACK_DUAL; + } + else + { + vec3_t fwdAngles, jumpFwd; + + VectorCopy( pm->ps->viewangles, fwdAngles ); + fwdAngles[PITCH] = fwdAngles[ROLL] = 0; + AngleVectors( fwdAngles, jumpFwd, NULL, NULL ); + VectorScale( jumpFwd, 200, pm->ps->velocity ); + pm->ps->velocity[2] = 180; + pm->ps->forceJumpZStart = pm->ps->origin[2];//so we don't take damage if we land at same height + pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; + + //FIXME: NPCs yell? + PM_AddEvent( EV_JUMP ); + G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); + pm->cmd.upmove = 0; + + return LS_A_JUMP_T__B_; + } +} + +qboolean PM_CheckJumpForwardAttackMove( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return qfalse; + } + + //check to see if it's cancelled? + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + { + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[1].jumpAtkFwdMove == LS_INVALID ) + { + return qfalse; + } + } + else + { + return qfalse; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + { + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[0].jumpAtkFwdMove == LS_INVALID ) + { + return qfalse; + } + } + } + //do normal checks + + if ( pm->cmd.forwardmove > 0 //going forward + && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //can force jump + && pm->gent && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped (if not player) + ) + { + if ( pm->ps->saberAnimLevel == SS_DUAL + || pm->ps->saberAnimLevel == SS_STAFF ) + {//dual and staff + if ( !PM_SaberInTransitionAny( pm->ps->saberMove ) //not going to/from/between an attack anim + && !PM_SaberInAttack( pm->ps->saberMove ) //not in attack anim + && pm->ps->weaponTime <= 0//not busy + && (pm->cmd.buttons&BUTTON_ATTACK) )//want to attack + { + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING) )//jumping NPC + { + if ( pm->gent + && pm->gent->NPC + && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) + { + return qtrue; + } + } + } + else + {//PLAYER + if ( G_TryingJumpForwardAttack( pm->gent, &pm->cmd ) + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB ) )//have enough power to attack + { + return qtrue; + } + } + } + } + //check strong + else if ( pm->ps->saberAnimLevel == SS_STRONG //strong style + || pm->ps->saberAnimLevel == SS_DESANN )//desann + { + if ( //&& !PM_InKnockDown( pm->ps ) + !pm->ps->dualSabers + //&& (pm->ps->legsAnim == BOTH_STAND2||pm->ps->legsAnim == BOTH_SABERFAST_STANCE||pm->ps->legsAnim == BOTH_SABERSLOW_STANCE||level.time-pm->ps->lastStationary<=500)//standing or just started moving + ) + {//strong attack: jump-hack + /* + if ( pm->ps->legsAnim == BOTH_STAND2 + || pm->ps->legsAnim == BOTH_SABERFAST_STANCE + || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE + || level.time-pm->ps->lastStationary <= 250 )//standing or just started moving + */ + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING) )//NPC jumping + { + if ( pm->gent + && pm->gent->NPC + && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) + {//only acrobat or boss and higher can do this + if ( pm->ps->legsAnim == BOTH_STAND2 + || pm->ps->legsAnim == BOTH_SABERFAST_STANCE + || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE + || level.time-pm->ps->lastStationary <= 250 ) + {//standing or just started moving + if ( pm->gent->client + && pm->gent->client->NPC_class == CLASS_DESANN ) + { + if ( !Q_irand( 0, 1 ) ) + { + return qtrue; + } + } + else + { + return qtrue; + } + } + } + } + } + else + {//player + if ( G_TryingJumpForwardAttack( pm->gent, &pm->cmd ) + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB ) ) + { + return qtrue; + } + } + } + } + } + return qfalse; +} + +saberMoveName_t PM_SaberFlipOverAttackMove( void ) +{ + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].jumpAtkFwdMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkFwdMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].jumpAtkFwdMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove != LS_INVALID ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].jumpAtkFwdMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + { + return LS_NONE; + } + } + //FIXME: check above for room enough to jump! + //FIXME: while in this jump, keep velocity[2] at a minimum until the end of the anim + vec3_t fwdAngles, jumpFwd; + + VectorCopy( pm->ps->viewangles, fwdAngles ); + fwdAngles[PITCH] = fwdAngles[ROLL] = 0; + AngleVectors( fwdAngles, jumpFwd, NULL, NULL ); + VectorScale( jumpFwd, 150, pm->ps->velocity ); + pm->ps->velocity[2] = 250; + //250 is normalized for a standing enemy at your z level, about 64 tall... adjust for actual maxs[2]-mins[2] of enemy and for zdiff in origins + if ( pm->gent && pm->gent->enemy ) + { //go higher for taller enemies + pm->ps->velocity[2] *= (pm->gent->enemy->maxs[2]-pm->gent->enemy->mins[2])/64.0f; + //go higher for enemies higher than you, lower for those lower than you + float zDiff = pm->gent->enemy->currentOrigin[2] - pm->ps->origin[2]; + pm->ps->velocity[2] += (zDiff)*1.5f; + //clamp to decent-looking values + //FIXME: still jump too low sometimes + if ( zDiff <= 0 && pm->ps->velocity[2] < 200 ) + {//if we're on same level, don't let me jump so low, I clip into the ground + pm->ps->velocity[2] = 200; + } + else if ( pm->ps->velocity[2] < 50 ) + { + pm->ps->velocity[2] = 50; + } + else if ( pm->ps->velocity[2] > 400 ) + { + pm->ps->velocity[2] = 400; + } + } + pm->ps->forceJumpZStart = pm->ps->origin[2];//so we don't take damage if we land at same height + pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; + + //FIXME: NPCs yell? + PM_AddEvent( EV_JUMP ); + G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); + pm->cmd.upmove = 0; + //FIXME: don't allow this to land on other people + + pm->gent->angle = pm->ps->viewangles[YAW];//so we know what yaw we started this at + + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_FB ); + + if ( Q_irand( 0, 1 ) ) + { + return LS_A_FLIP_STAB; + } + else + { + return LS_A_FLIP_SLASH; + } +} + +qboolean PM_CheckFlipOverAttackMove( qboolean checkEnemy ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return qfalse; + } + //check to see if it's cancelled? + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + { + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[1].jumpAtkFwdMove == LS_INVALID ) + { + return qfalse; + } + } + else + { + return qfalse; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + { + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[0].jumpAtkFwdMove == LS_INVALID ) + { + return qfalse; + } + } + } + //do normal checks + + if ( (pm->ps->saberAnimLevel == SS_MEDIUM //medium + || pm->ps->saberAnimLevel == SS_TAVION )//tavion + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //can force jump + && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped + ) + { + qboolean tryMove = qfalse; + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->cmd.upmove > 0//want to jump + || (pm->ps->pm_flags&PMF_JUMPING) )//jumping + {//flip over-forward down-attack + if ( (pm->gent->NPC + && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) + && !Q_irand(0, 2) ) )//NPC who can do this, 33% chance + {//only player or acrobat or boss and higher can do this + tryMove = qtrue; + } + } + } + else + {//player + if ( G_TryingJumpForwardAttack( pm->gent, &pm->cmd ) + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB ) )//have enough power + { + if ( !pm->cmd.rightmove ) + { + if ( pm->ps->legsAnim == BOTH_JUMP1 + || pm->ps->legsAnim == BOTH_FORCEJUMP1 + || pm->ps->legsAnim == BOTH_INAIR1 + || pm->ps->legsAnim == BOTH_FORCEINAIR1 ) + {//in a non-flip forward jump + tryMove = qtrue; + } + } + } + } + + if ( tryMove ) + { + if ( !checkEnemy ) + {//based just on command input + return qtrue; + } + else + {//based on presence of enemy + if ( pm->gent->enemy )//have an enemy + { + vec3_t fwdAngles = {0,pm->ps->viewangles[YAW],0}; + if ( pm->gent->enemy->health > 0 + && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period + && pm->gent->enemy->maxs[2] > 12 + && (!pm->gent->enemy->client || !PM_InKnockDownOnGround( &pm->gent->enemy->client->ps ) ) + && DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ) < 10000 + && InFront( pm->gent->enemy->currentOrigin, pm->gent->currentOrigin, fwdAngles, 0.3f ) ) + {//enemy must be alive, not low to ground, close and in front + return qtrue; + } + } + return qfalse; + } + } + } + return qfalse; +} + +saberMoveName_t PM_SaberBackflipAttackMove( void ) +{ + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].jumpAtkBackMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkBackMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].jumpAtkBackMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkBackMove != LS_INVALID ) + { + if ( pm->ps->saber[1].jumpAtkBackMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].jumpAtkBackMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].jumpAtkBackMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkBackMove == LS_NONE ) + { + return LS_NONE; + } + } + pm->cmd.upmove = 0;//no jump just yet + return LS_A_BACKFLIP_ATK; +} + +qboolean PM_CheckBackflipAttackMove( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return qfalse; + } + + //check to see if it's cancelled? + if ( pm->ps->saber[0].jumpAtkBackMove == LS_NONE ) + { + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkBackMove == LS_NONE + || pm->ps->saber[1].jumpAtkBackMove == LS_INVALID ) + { + return qfalse; + } + } + else + { + return qfalse; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkBackMove == LS_NONE ) + { + if ( pm->ps->saber[0].jumpAtkBackMove == LS_NONE + || pm->ps->saber[0].jumpAtkBackMove == LS_INVALID ) + { + return qfalse; + } + } + } + //do normal checks + + if ( pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //can force jump + && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period + && pm->gent && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one + //&& (pm->ps->legsAnim == BOTH_SABERSTAFF_STANCE || level.time-pm->ps->lastStationary<=250)//standing or just started moving + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) )//on ground or just jumped (if not player) + { + if ( pm->cmd.forwardmove < 0 //moving backwards + && pm->ps->saberAnimLevel == SS_STAFF //using staff + && (pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING)) )//jumping + {//jumping backwards and using staff + if ( !PM_SaberInTransitionAny( pm->ps->saberMove ) //not going to/from/between an attack anim + && !PM_SaberInAttack( pm->ps->saberMove ) //not in attack anim + && pm->ps->weaponTime <= 0//not busy + && (pm->cmd.buttons&BUTTON_ATTACK) )//want to attack + {//not already attacking + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->gent + && pm->gent->NPC + && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) + {//acrobat or boss and higher can do this + return qtrue; + } + } + else + {//player + return qtrue; + } + } + } + } + return qfalse; +} + +saberMoveName_t PM_CheckDualSpinProtect( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return LS_NONE; + } + + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].kataMove != LS_INVALID ) + { + if ( pm->ps->saber[0].kataMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].kataMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].kataMove != LS_INVALID ) + { + if ( pm->ps->saber[1].kataMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].kataMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].kataMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].kataMove == LS_NONE ) + { + return LS_NONE; + } + } + //do normal checks + if ( pm->ps->saberMove == LS_READY//ready + //&& (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//PLAYER ONLY...? + //&& pm->ps->viewangles[0] > 30 //looking down + && pm->ps->saberAnimLevel == SS_DUAL//using dual saber style + && pm->ps->saber[0].Active() && pm->ps->saber[1].Active()//both sabers on + //&& pm->ps->forcePowerLevel[FP_PUSH]>=FORCE_LEVEL_3//force push 3 + //&& ((pm->ps->forcePowersActive&(1<ps->forcePowerDebounce[FP_PUSH]>level.time)//force-pushing + && G_TryingKataAttack( pm->gent, &pm->cmd )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER, qtrue )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER//DUAL_SPIN_PROTECT_POWER//force push 3 + && (pm->cmd.buttons&BUTTON_ATTACK)//pressing attack + ) + {//FIXME: some NPC logic to do this? + /* + if ( (pm->ps->pm_flags&PMF_DUCKED||pm->cmd.upmove<0)//crouching + && g_crosshairEntNum >= ENTITYNUM_WORLD ) + */ + { + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_PUSH, SABER_ALT_ATTACK_POWER, qtrue );//drain the required force power + } + return LS_DUAL_SPIN_PROTECT; + } + } + return LS_NONE; +} + +saberMoveName_t PM_CheckStaffKata( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return LS_NONE; + } + + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].kataMove != LS_INVALID ) + { + if ( pm->ps->saber[0].kataMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].kataMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].kataMove != LS_INVALID ) + { + if ( pm->ps->saber[1].kataMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].kataMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].kataMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].kataMove == LS_NONE ) + { + return LS_NONE; + } + } + //do normal checks + if ( pm->ps->saberMove == LS_READY//ready + //&& (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//PLAYER ONLY...? + //&& pm->ps->viewangles[0] > 30 //looking down + && pm->ps->saberAnimLevel == SS_STAFF//using dual saber style + && pm->ps->saber[0].Active()//saber on + //&& pm->ps->forcePowerLevel[FP_PUSH]>=FORCE_LEVEL_3//force push 3 + //&& ((pm->ps->forcePowersActive&(1<ps->forcePowerDebounce[FP_PUSH]>level.time)//force-pushing + && G_TryingKataAttack( pm->gent, &pm->cmd )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER, qtrue )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER//DUAL_SPIN_PROTECT_POWER//force push 3 + && (pm->cmd.buttons&BUTTON_ATTACK)//pressing attack + ) + {//FIXME: some NPC logic to do this? + /* + if ( (pm->ps->pm_flags&PMF_DUCKED||pm->cmd.upmove<0)//crouching + && g_crosshairEntNum >= ENTITYNUM_WORLD ) + */ + { + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER, qtrue );//drain the required force power + } + return LS_STAFF_SOULCAL; + } + } + return LS_NONE; +} + +extern qboolean WP_ForceThrowable( gentity_t *ent, gentity_t *forwardEnt, gentity_t *self, qboolean pull, float cone, float radius, vec3_t forward ); +saberMoveName_t PM_CheckPullAttack( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return LS_NONE; + } + + if ( (pm->ps->saber[0].saberFlags&SFL_NO_PULL_ATTACK) ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers + && (pm->ps->saber[1].saberFlags&SFL_NO_PULL_ATTACK) ) + { + return LS_NONE; + } + + if ( (pm->ps->saberMove == LS_READY||PM_SaberInReturn(pm->ps->saberMove)||PM_SaberInReflect(pm->ps->saberMove))//ready + //&& (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//PLAYER ONLY + && pm->ps->saberAnimLevel >= SS_FAST//single saber styles - FIXME: Tavion? + && pm->ps->saberAnimLevel <= SS_STRONG//single saber styles - FIXME: Tavion? + && G_TryingPullAttack( pm->gent, &pm->cmd, qfalse )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus + //&& pm->cmd.forwardmove<0//pulling back + && (pm->cmd.buttons&BUTTON_ATTACK)//attacking + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB//have enough power + ) + {//FIXME: some NPC logic to do this? + qboolean doMove = g_saberNewControlScheme->integer?qtrue:qfalse;//in new control scheme, can always do this, even if there's no-one to do it to + if ( g_saberNewControlScheme->integer + || g_crosshairEntNum < ENTITYNUM_WORLD )//in old control scheme, there has to be someone there + { + saberMoveName_t pullAttackMove = LS_NONE; + if ( pm->ps->saberAnimLevel == SS_FAST ) + { + pullAttackMove = LS_PULL_ATTACK_STAB; + } + else + { + pullAttackMove = LS_PULL_ATTACK_SWING; + } + + if ( g_crosshairEntNum < ENTITYNUM_WORLD + && pm->gent && pm->gent->client ) + { + gentity_t *targEnt = &g_entities[g_crosshairEntNum]; + if ( targEnt->client + && targEnt->health > 0 + //FIXME: check other things like in knockdown, saberlock, uninterruptable anims, etc. + && !PM_InOnGroundAnim( &targEnt->client->ps ) + && !PM_LockedAnim( targEnt->client->ps.legsAnim ) + && !PM_SuperBreakLoseAnim( targEnt->client->ps.legsAnim ) + && !PM_SuperBreakWinAnim( targEnt->client->ps.legsAnim ) + && targEnt->client->ps.saberLockTime <= 0 + && WP_ForceThrowable( targEnt, targEnt, pm->gent, qtrue, 1.0f, 0.0f, NULL ) ) + { + if ( !g_saberNewControlScheme->integer ) + {//in old control scheme, make sure they're close or far enough away for the move we'll be doing + float targDist = Distance( targEnt->currentOrigin, pm->ps->origin ); + if ( pullAttackMove == LS_PULL_ATTACK_STAB ) + {//must be closer than 512 + if ( targDist > 384.0f ) + { + return LS_NONE; + } + } + else//if ( pullAttackMove == LS_PULL_ATTACK_SWING ) + {//must be farther than 256 + if ( targDist > 512.0f ) + { + return LS_NONE; + } + if ( targDist < 192.0f ) + { + return LS_NONE; + } + } + } + + vec3_t targAngles = {0,targEnt->client->ps.viewangles[YAW],0}; + if ( InFront( pm->ps->origin, targEnt->currentOrigin, targAngles ) ) + { + NPC_SetAnim( targEnt, SETANIM_BOTH, BOTH_PULLED_INAIR_F, SETANIM_FLAG_OVERRIDE, SETANIM_FLAG_HOLD ); + } + else + { + NPC_SetAnim( targEnt, SETANIM_BOTH, BOTH_PULLED_INAIR_B, SETANIM_FLAG_OVERRIDE, SETANIM_FLAG_HOLD ); + } + //hold the anim until I'm with done pull anim + targEnt->client->ps.legsAnimTimer = targEnt->client->ps.torsoAnimTimer = PM_AnimLength( pm->gent->client->clientInfo.animFileIndex, (animNumber_t)saberMoveData[pullAttackMove].animToUse ); + //set pullAttackTime + pm->gent->client->ps.pullAttackTime = targEnt->client->ps.pullAttackTime = level.time+targEnt->client->ps.legsAnimTimer; + //make us know about each other + pm->gent->client->ps.pullAttackEntNum = g_crosshairEntNum; + targEnt->client->ps.pullAttackEntNum = pm->ps->clientNum; + //do effect and sound on me + pm->ps->powerups[PW_FORCE_PUSH] = level.time + 1000; + if ( pm->gent ) + { + G_Sound( pm->gent, G_SoundIndex( "sound/weapons/force/pull.wav" ) ); + } + doMove = qtrue; + } + } + if ( doMove ) + { + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_PULL, SABER_ALT_ATTACK_POWER_FB ); + } + return pullAttackMove; + } + } + } + return LS_NONE; +} + +saberMoveName_t PM_CheckPlayerAttackFromParry( int curmove ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) + { + if ( curmove >= LS_PARRY_UP + && curmove <= LS_REFLECT_LL ) + {//in a parry + switch ( saberMoveData[curmove].endQuad ) + { + case Q_T: + return LS_A_T2B; + break; + case Q_TR: + return LS_A_TR2BL; + break; + case Q_TL: + return LS_A_TL2BR; + break; + case Q_BR: + return LS_A_BR2TL; + break; + case Q_BL: + return LS_A_BL2TR; + break; + //shouldn't be a parry that ends at L, R or B + } + } + } + return LS_NONE; +} + + +saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int curmove ) +{ + qboolean noSpecials = qfalse; + + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + noSpecials = qtrue; + } + + saberMoveName_t overrideJumpRightAttackMove = LS_INVALID; + if ( pm->ps->saber[0].jumpAtkRightMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkRightMove != LS_NONE ) + {//actually overriding + overrideJumpRightAttackMove = (saberMoveName_t)pm->ps->saber[0].jumpAtkRightMove; + } + else if ( pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkRightMove > LS_NONE ) + {//would be cancelling it, but check the second saber, too + overrideJumpRightAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkRightMove; + } + else + {//nope, just cancel it + overrideJumpRightAttackMove = LS_NONE; + } + } + else if ( pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkRightMove != LS_INVALID ) + {//first saber not overridden, check second + overrideJumpRightAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkRightMove; + } + + saberMoveName_t overrideJumpLeftAttackMove = LS_INVALID; + if ( pm->ps->saber[0].jumpAtkLeftMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkLeftMove != LS_NONE ) + {//actually overriding + overrideJumpLeftAttackMove = (saberMoveName_t)pm->ps->saber[0].jumpAtkLeftMove; + } + else if ( pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkLeftMove > LS_NONE ) + {//would be cancelling it, but check the second saber, too + overrideJumpLeftAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkLeftMove; + } + else + {//nope, just cancel it + overrideJumpLeftAttackMove = LS_NONE; + } + } + else if ( pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkLeftMove != LS_INVALID ) + {//first saber not overridden, check second + overrideJumpLeftAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkLeftMove; + } + if ( rightmove > 0 ) + {//moving right + if ( !noSpecials + && overrideJumpRightAttackMove != LS_NONE + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped + && (pm->cmd.buttons&BUTTON_ATTACK)//hitting attack + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0//have force jump 1 at least + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_LR )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_LR//have enough power + && (((pm->ps->clientNum>=MAX_CLIENTS&&!PM_ControlledByPlayer())&&pm->cmd.upmove > 0)//jumping NPC + ||((pm->ps->clientNumgent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/)) )//focus-holding player + {//cartwheel right + vec3_t right, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_LR ); + } + pm->cmd.upmove = 0; + if ( overrideJumpRightAttackMove != LS_INVALID ) + {//overridden with another move + return overrideJumpRightAttackMove; + } + else if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + AngleVectors( fwdAngles, NULL, right, NULL ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA( pm->ps->velocity, 190, right, pm->ps->velocity ); + return LS_BUTTERFLY_RIGHT; + } + else + { + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_CARTWHEELS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_CARTWHEELS)) ) + {//okay to do cartwheels with this saber + /* + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//still on ground + VectorClear( pm->ps->velocity ); + return LS_JUMPATTACK_CART_RIGHT; + } + else + */ + {//in air + AngleVectors( fwdAngles, NULL, right, NULL ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA( pm->ps->velocity, 190, right, pm->ps->velocity ); + PM_SetJumped( JUMP_VELOCITY, qtrue ); + return LS_JUMPATTACK_ARIAL_RIGHT; + } + } + } + } + else if ( pm->ps->legsAnim != BOTH_CARTWHEEL_RIGHT + && pm->ps->legsAnim != BOTH_ARIAL_RIGHT ) + {//not in a cartwheel/arial + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/ )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + if ( forwardmove > 0 ) + {//forward right = TL2BR slash + return LS_A_TL2BR; + } + else if ( forwardmove < 0 ) + {//backward right = BL2TR uppercut + return LS_A_BL2TR; + } + else + {//just right is a left slice + return LS_A_L2R; + } + } + } + else if ( rightmove < 0 ) + {//moving left + if ( !noSpecials + && overrideJumpLeftAttackMove != LS_NONE + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped + && (pm->cmd.buttons&BUTTON_ATTACK)//hitting attack + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0//have force jump 1 at least + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_LR )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_LR//have enough power + && (((pm->ps->clientNum>=MAX_CLIENTS&&!PM_ControlledByPlayer())&&pm->cmd.upmove > 0)//jumping NPC + ||((pm->ps->clientNumgent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/)) )//focus-holding player + {//cartwheel left + vec3_t right, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_LR ); + } + pm->cmd.upmove = 0; + if ( overrideJumpRightAttackMove != LS_INVALID ) + {//overridden with another move + return overrideJumpRightAttackMove; + } + else if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + AngleVectors( fwdAngles, NULL, right, NULL ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA( pm->ps->velocity, -190, right, pm->ps->velocity ); + return LS_BUTTERFLY_LEFT; + } + else + { + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_CARTWHEELS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_CARTWHEELS)) ) + {//okay to do cartwheels with this saber + /* + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//still on ground + VectorClear( pm->ps->velocity ); + return LS_JUMPATTACK_ARIAL_LEFT; + } + else + */ + { + AngleVectors( fwdAngles, NULL, right, NULL ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA( pm->ps->velocity, -190, right, pm->ps->velocity ); + PM_SetJumped( JUMP_VELOCITY, qtrue ); + return LS_JUMPATTACK_CART_LEFT; + } + } + } + } + else if ( pm->ps->legsAnim != BOTH_CARTWHEEL_LEFT + && pm->ps->legsAnim != BOTH_ARIAL_LEFT ) + {//not in a left cartwheel/arial + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/ )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + if ( forwardmove > 0 ) + {//forward left = TR2BL slash + return LS_A_TR2BL; + } + else if ( forwardmove < 0 ) + {//backward left = BR2TL uppercut + return LS_A_BR2TL; + } + else + {//just left is a right slice + return LS_A_R2L; + } + } + } + else + {//not moving left or right + if ( forwardmove > 0 ) + {//forward= T2B slash + saberMoveName_t stabDownMove = noSpecials?LS_NONE:PM_CheckStabDown(); + if ( stabDownMove != LS_NONE ) + { + return stabDownMove; + } + if ( ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) )//player in third person, not zoomed in + {//player in thirdperson, not zoomed in + //flip-over attack logic + if ( !noSpecials && PM_CheckFlipOverAttackMove( qfalse ) ) + {//flip over-forward down-attack + return PM_SaberFlipOverAttackMove(); + } + //lunge attack logic + else if ( PM_CheckLungeAttackMove() ) + { + return PM_SaberLungeAttackMove( qtrue ); + } + //jump forward attack logic + else if ( !noSpecials && PM_CheckJumpForwardAttackMove() ) + { + return PM_SaberJumpForwardAttackMove(); + } + } + + //player NPC with enemy: autoMove logic + if ( pm->gent + && pm->gent->enemy + && pm->gent->enemy->client ) + {//I have an active enemy + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) + {//a player who is running at an enemy + //if the enemy is not a jedi, don't use top-down, pick a diagonal or side attack + if ( pm->gent->enemy->s.weapon != WP_SABER + && pm->gent->enemy->client->NPC_class != CLASS_REMOTE//too small to do auto-aiming accurately + && pm->gent->enemy->client->NPC_class != CLASS_SEEKER//too small to do auto-aiming accurately + && pm->gent->enemy->client->NPC_class != CLASS_GONK//too short to do auto-aiming accurately + && pm->gent->enemy->client->NPC_class != CLASS_HOWLER//too short to do auto-aiming accurately + && g_saberAutoAim->integer ) + { + saberMoveName_t autoMove = PM_AttackForEnemyPos( qfalse, (qboolean)(pm->ps->clientNum>=MAX_CLIENTS&&!PM_ControlledByPlayer()) ); + if ( autoMove != LS_INVALID ) + { + return autoMove; + } + } + } + + if ( pm->ps->clientNum>=MAX_CLIENTS && !PM_ControlledByPlayer() ) //NPC ONLY + {//NPC + if ( PM_CheckFlipOverAttackMove( qtrue ) ) + { + return PM_SaberFlipOverAttackMove(); + } + } + } + + //Regular NPCs + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) //NPC ONLY + {//NPC or player in third person, not zoomed in + //fwd jump attack logic + if ( PM_CheckJumpForwardAttackMove() ) + { + return PM_SaberJumpForwardAttackMove(); + } + //lunge attack logic + else if ( PM_CheckLungeAttackMove() ) + { + return PM_SaberLungeAttackMove( qtrue ); + } + } + + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent,&pm->cmd) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + return LS_A_T2B; + } + else if ( forwardmove < 0 ) + {//backward= T2B slash//B2T uppercut? + if ( g_saberNewControlScheme->integer ) + { + saberMoveName_t pullAtk = PM_CheckPullAttack(); + if ( pullAtk != LS_NONE ) + { + return pullAtk; + } + } + + if ( g_saberNewControlScheme->integer + && (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) //PLAYER ONLY + && (pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus, trying special backwards attacks + {//player lunge attack logic + if ( ( pm->ps->dualSabers //or dual + || pm->ps->saberAnimLevel == SS_STAFF )//pm->ps->SaberStaff() )//or staff + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB )/*pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB*/ )//have enough force power to pull it off + {//alt+back+attack using fast, dual or staff attacks + PM_SaberLungeAttackMove( qfalse ); + } + } + else if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) //NPC + || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) )//player in third person, not zooomed + {//NPC or player in third person, not zoomed + if ( PM_CheckBackflipAttackMove() ) + { + return PM_SaberBackflipAttackMove();//backflip attack + } + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent,&pm->cmd) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + //if ( !PM_InKnockDown( pm->ps ) ) + //check backstabs + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK)) ) + {//okay to do backstabs with this saber + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//only when on ground + if ( pm->gent && pm->gent->enemy ) + {//FIXME: or just trace for a valid enemy standing behind me? And no enemy in front? + vec3_t enemyDir, faceFwd, facingAngles = {0, pm->ps->viewangles[YAW], 0}; + AngleVectors( facingAngles, faceFwd, NULL, NULL ); + VectorSubtract( pm->gent->enemy->currentOrigin, pm->ps->origin, enemyDir ); + float dot = DotProduct( enemyDir, faceFwd ); + if ( dot < 0 ) + {//enemy is behind me + if ( dot < -0.75f + && DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ) < 16384//128 squared + && (pm->ps->saberAnimLevel == SS_FAST || pm->ps->saberAnimLevel == SS_STAFF || (pm->gent->client &&(pm->gent->client->NPC_class == CLASS_TAVION||pm->gent->client->NPC_class == CLASS_ALORA)&&Q_irand(0,1))) ) + {//fast attacks and Tavion + if ( !(pm->ps->pm_flags&PMF_DUCKED) && pm->cmd.upmove >= 0 ) + {//can't do it while ducked? + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || (pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG) ) + {//only fencers and above can do this + return LS_A_BACKSTAB; + } + } + } + else if ( pm->ps->saberAnimLevel != SS_FAST + && pm->ps->saberAnimLevel != SS_STAFF ) + {//medium and higher attacks + if ( (pm->ps->pm_flags&PMF_DUCKED) || pm->cmd.upmove < 0 ) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } + } + else + {//enemy in front + float enemyDistSq = DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ); + if ( ((pm->ps->saberAnimLevel == FORCE_LEVEL_1 || + pm->ps->saberAnimLevel == SS_STAFF || + pm->gent->client->NPC_class == CLASS_TAVION || + pm->gent->client->NPC_class == CLASS_ALORA || + (pm->gent->client->NPC_class == CLASS_DESANN && !Q_irand(0,3))) && + enemyDistSq > 16384) || + pm->gent->enemy->health <= 0 )//128 squared + {//my enemy is pretty far in front of me and I'm using fast attacks + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || + ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) ) + {//only fencers and higher can do this, higher rank does it more + if ( PM_CheckEnemyInBack( 128 ) ) + { + return PM_PickBackStab(); + } + } + } + else if ( ((pm->ps->saberAnimLevel >= FORCE_LEVEL_2 || pm->gent->client->NPC_class == CLASS_DESANN) && enemyDistSq > 40000) || pm->gent->enemy->health <= 0 )//200 squared + {//enemy is very faw away and I'm using medium/strong attacks + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || + ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) ) + {//only fencers and higher can do this, higher rank does it more + if ( PM_CheckEnemyInBack( 164 ) ) + { + return PM_PickBackStab(); + } + } + } + } + } + else + {//no current enemy + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->gent && pm->gent->client ) + {//only player + if ( PM_CheckEnemyInBack( 128 ) ) + { + return PM_PickBackStab(); + } + } + } + } + } + } + + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + //else just swing down + return LS_A_T2B; + } + else + {//not moving in any direction + if ( PM_SaberInBounce( curmove ) ) + {//bounces should go to their default attack if you don't specify a direction but are attacking + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent,&pm->cmd) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + saberMoveName_t newmove; + if ( pm->ps->clientNum && !PM_ControlledByPlayer() && Q_irand( 0, 3 ) ) + {//use NPC random + newmove = PM_NPCSaberAttackFromQuad( saberMoveData[curmove].endQuad ); + } + else + {//player uses chain-attack + newmove = saberMoveData[curmove].chain_attack; + } + if ( PM_SaberKataDone( curmove, newmove ) ) + { + return saberMoveData[curmove].chain_idle; + } + else + { + return newmove; + } + } + else if ( PM_SaberInKnockaway( curmove ) ) + {//bounces should go to their default attack if you don't specify a direction but are attacking + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + saberMoveName_t newmove; + if ( pm->ps->clientNum && !PM_ControlledByPlayer() && Q_irand( 0, 3 ) ) + {//use NPC random + newmove = PM_NPCSaberAttackFromQuad( saberMoveData[curmove].endQuad ); + } + else + { + if ( pm->ps->saberAnimLevel == SS_FAST || + pm->ps->saberAnimLevel == SS_TAVION ) + {//player is in fast attacks, so come right back down from the same spot + newmove = PM_AttackMoveForQuad( saberMoveData[curmove].endQuad ); + } + else + {//use a transition to wrap to another attack from a different dir + newmove = saberMoveData[curmove].chain_attack; + } + } + if ( PM_SaberKataDone( curmove, newmove ) ) + { + return saberMoveData[curmove].chain_idle; + } + else + { + return newmove; + } + } + else if ( curmove == LS_READY + || curmove == LS_A_FLIP_STAB + || curmove == LS_A_FLIP_SLASH + || ( curmove >= LS_PARRY_UP + && curmove <= LS_REFLECT_LL ) ) + {//Not moving at all, not too busy to attack + //push + lookdown + attack + dual sabers = LS_DUAL_SPIN_PROTECT + if ( g_saberNewControlScheme->integer ) + { + if ( PM_CheckDualSpinProtect() ) + { + return LS_DUAL_SPIN_PROTECT; + } + if ( PM_CheckStaffKata() ) + { + return LS_STAFF_SOULCAL; + } + } + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + if ( pm->ps->clientNum || g_saberAutoAim->integer ) + {//auto-aim + if ( pm->gent && pm->gent->enemy ) + {//based on enemy position, pick a proper attack + saberMoveName_t autoMove = PM_AttackForEnemyPos( qtrue, (qboolean)(pm->ps->clientNum>=MAX_CLIENTS) ); + if ( autoMove != LS_INVALID ) + { + return autoMove; + } + } + else if ( fabs(pm->ps->viewangles[0]) > 30 ) + {//looking far up or far down uses the top to bottom attack, presuming you want a vertical attack + return LS_A_T2B; + } + } + else + {//for now, just pick a random attack + return ((saberMoveName_t)Q_irand( LS_A_TL2BR, LS_A_T2B )); + } + } + } + } + //FIXME: pick a return? + return LS_NONE; +} + +saberMoveName_t PM_SaberAnimTransitionMove( saberMoveName_t curmove, saberMoveName_t newmove ) +{ + //FIXME: take FP_SABER_OFFENSE into account here somehow? + int retmove = newmove; + if ( curmove == LS_READY ) + {//just standing there + switch ( newmove ) + { + case LS_A_TL2BR: + case LS_A_L2R: + case LS_A_BL2TR: + case LS_A_BR2TL: + case LS_A_R2L: + case LS_A_TR2BL: + case LS_A_T2B: + //transition is the start + retmove = LS_S_TL2BR + (newmove-LS_A_TL2BR); + break; + default: + break; + } + } + else + { + switch ( newmove ) + { + //transitioning to ready pose + case LS_READY: + switch ( curmove ) + { + //transitioning from an attack + case LS_A_TL2BR: + case LS_A_L2R: + case LS_A_BL2TR: + case LS_A_BR2TL: + case LS_A_R2L: + case LS_A_TR2BL: + case LS_A_T2B: + //transition is the return + retmove = LS_R_TL2BR + (newmove-LS_A_TL2BR); + break; + default: + break; + } + break; + //transitioning to an attack + case LS_A_TL2BR: + case LS_A_L2R: + case LS_A_BL2TR: + case LS_A_BR2TL: + case LS_A_R2L: + case LS_A_TR2BL: + case LS_A_T2B: + if ( newmove == curmove ) + {//FIXME: need a spin or something or go to next level, but for now, just play the return + //going into another attack... + //allow endless chaining in level 1 attacks, several in level 2 and only one or a few in level 3 + //FIXME: don't let strong attacks chain to an attack in the opposite direction ( > 45 degrees?) + if ( PM_SaberKataDone( curmove, newmove ) ) + {//done with this kata, must return to ready before attack again + retmove = LS_R_TL2BR + (newmove-LS_A_TL2BR); + } + else + {//okay to chain to another attack + retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad]; + } + } + else if ( saberMoveData[curmove].endQuad == saberMoveData[newmove].startQuad ) + {//new move starts from same quadrant + retmove = newmove; + } + else + { + switch ( curmove ) + { + //transitioning from an attack + case LS_A_TL2BR: + case LS_A_L2R: + case LS_A_BL2TR: + case LS_A_BR2TL: + case LS_A_R2L: + case LS_A_TR2BL: + case LS_A_T2B: + case LS_D1_BR: + case LS_D1__R: + case LS_D1_TR: + case LS_D1_T_: + case LS_D1_TL: + case LS_D1__L: + case LS_D1_BL: + case LS_D1_B_: + retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad]; + break; + //transitioning from a return + case LS_R_TL2BR: + case LS_R_L2R: + case LS_R_BL2TR: + case LS_R_BR2TL: + case LS_R_R2L: + case LS_R_TR2BL: + case LS_R_T2B: + //transitioning from a bounce + /* + case LS_BOUNCE_UL2LL: + case LS_BOUNCE_LL2UL: + case LS_BOUNCE_L2LL: + case LS_BOUNCE_L2UL: + case LS_BOUNCE_UR2LR: + case LS_BOUNCE_LR2UR: + case LS_BOUNCE_R2LR: + case LS_BOUNCE_R2UR: + case LS_BOUNCE_TOP: + case LS_OVER_UR2UL: + case LS_OVER_UL2UR: + case LS_BOUNCE_UR: + case LS_BOUNCE_UL: + case LS_BOUNCE_LR: + case LS_BOUNCE_LL: + */ + //transitioning from a parry/reflection/knockaway/broken parry + case LS_PARRY_UP: + case LS_PARRY_UR: + case LS_PARRY_UL: + case LS_PARRY_LR: + case LS_PARRY_LL: + case LS_REFLECT_UP: + case LS_REFLECT_UR: + case LS_REFLECT_UL: + case LS_REFLECT_LR: + case LS_REFLECT_LL: + case LS_K1_T_: + case LS_K1_TR: + case LS_K1_TL: + case LS_K1_BR: + case LS_K1_BL: + case LS_V1_BR: + case LS_V1__R: + case LS_V1_TR: + case LS_V1_T_: + case LS_V1_TL: + case LS_V1__L: + case LS_V1_BL: + case LS_V1_B_: + case LS_H1_T_: + case LS_H1_TR: + case LS_H1_TL: + case LS_H1_BR: + case LS_H1_BL: + retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad]; + break; + //NB: transitioning from transitions is fine + default: + break; + } + } + break; + //transitioning to any other anim is not supported + default: + break; + } + } + + if ( retmove == LS_NONE ) + { + return newmove; + } + + return ((saberMoveName_t)retmove); +} + +/* +------------------------- +PM_LegsAnimForFrame +Returns animNumber for current frame +------------------------- +*/ +int PM_LegsAnimForFrame( gentity_t *ent, int legsFrame ) +{ + //Must be a valid client + if ( ent->client == NULL ) + return -1; + + //Must have a file index entry + if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) + return -1; + + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + int glaIndex = gi.G2API_GetAnimIndex(&(ent->ghoul2[0])); + + for ( int animation = 0; animation < BOTH_CIN_1; animation++ ) //first anim after last legs + { + if ( animation >= TORSO_DROPWEAP1 && animation < LEGS_TURN1 ) //first legs only anim + {//not a possible legs anim + continue; + } + + if ( animations[animation].glaIndex != glaIndex ) + { + continue; + } + + if ( animations[animation].firstFrame > legsFrame ) + {//This anim starts after this frame + continue; + } + + if ( animations[animation].firstFrame + animations[animation].numFrames < legsFrame ) + {//This anim ends before this frame + continue; + } + //else, must be in this anim! + return animation; + } + + //Not in ANY torsoAnim? SHOULD NEVER HAPPEN +// assert(0); + return -1; +} + +int PM_ValidateAnimRange( const int startFrame, const int endFrame, const float animSpeed ) +{//given a startframe and endframe, see if that lines up with any known animation + animation_t *animations = level.knownAnimFileSets[0].animations; + + for ( int anim = 0; anim < MAX_ANIMATIONS; anim++ ) + { + if ( animSpeed < 0 ) + {//playing backwards + if ( animations[anim].firstFrame == endFrame ) + { + if ( animations[anim].numFrames + animations[anim].firstFrame == startFrame ) + { + //Com_Printf( "valid reverse anim: %s\n", animTable[anim].name ); + return anim; + } + } + } + else + {//playing forwards + if ( animations[anim].firstFrame == startFrame ) + {//This anim starts on this frame + if ( animations[anim].firstFrame + animations[anim].numFrames == endFrame ) + {//This anim ends on this frame + //Com_Printf( "valid forward anim: %s\n", animTable[anim].name ); + return anim; + } + } + } + //else, must not be this anim! + } + + //Not in ANY anim? SHOULD NEVER HAPPEN + Com_Printf( "invalid anim range %d to %d, speed %4.2f\n", startFrame, endFrame, animSpeed ); + return -1; +} +/* +------------------------- +PM_TorsoAnimForFrame +Returns animNumber for current frame +------------------------- +*/ +int PM_TorsoAnimForFrame( gentity_t *ent, int torsoFrame ) +{ + //Must be a valid client + if ( ent->client == NULL ) + return -1; + + //Must have a file index entry + if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) + return -1; + + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + int glaIndex = gi.G2API_GetAnimIndex(&(ent->ghoul2[0])); + + for ( int animation = 0; animation < LEGS_TURN1; animation++ ) //first legs only anim + { + if ( animations[animation].glaIndex != glaIndex ) + { + continue; + } + + if ( animations[animation].firstFrame > torsoFrame ) + {//This anim starts after this frame + continue; + } + + if ( animations[animation].firstFrame + animations[animation].numFrames < torsoFrame ) + {//This anim ends before this frame + continue; + } + //else, must be in this anim! + return animation; + } + + //Not in ANY torsoAnim? SHOULD NEVER HAPPEN +// assert(0); + return -1; +} + +qboolean PM_FinishedCurrentLegsAnim( gentity_t *self ) +{ + int junk, curFrame; + float currentFrame, animSpeed; + + if ( !self->client ) + { + return qtrue; + } + + gi.G2API_GetBoneAnimIndex( &self->ghoul2[self->playerModel], self->rootBone, (cg.time?cg.time:level.time), ¤tFrame, &junk, &junk, &junk, &animSpeed, NULL ); + curFrame = floor( currentFrame ); + + int legsAnim = self->client->ps.legsAnim; + animation_t *animations = level.knownAnimFileSets[self->client->clientInfo.animFileIndex].animations; + + if ( curFrame >= animations[legsAnim].firstFrame + (animations[legsAnim].numFrames - 2) ) + { + return qtrue; + } + + return qfalse; +} + +/* +------------------------- +PM_HasAnimation +------------------------- +*/ + +qboolean PM_HasAnimation( gentity_t *ent, int animation ) +{ + //Must be a valid client + if ( !ent || ent->client == NULL ) + return qfalse; + + //must be a valid anim number + if ( animation < 0 || animation >= MAX_ANIMATIONS ) + { + return qfalse; + } + //Must have a file index entry + if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) + return qfalse; + + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + + //No frames, no anim + if ( animations[animation].numFrames == 0 ) + return qfalse; + + //Has the sequence + return qtrue; +} + +int PM_PickAnim( gentity_t *self, int minAnim, int maxAnim ) +{ + int anim; + int count = 0; + + if ( !self ) + { + return Q_irand(minAnim, maxAnim); + } + + do + { + anim = Q_irand(minAnim, maxAnim); + count++; + } + while ( !PM_HasAnimation( self, anim ) && count < 1000 ); + + return anim; +} + +/* +------------------------- +PM_AnimLength +------------------------- +*/ + +int PM_AnimLength( int index, animNumber_t anim ) +{ + if ( ValidAnimFileIndex( index ) == false ) + return 0; + + return level.knownAnimFileSets[index].animations[anim].numFrames * abs(level.knownAnimFileSets[index].animations[anim].frameLerp); +} + +/* +------------------------- +PM_SetLegsAnimTimer +------------------------- +*/ + +void PM_SetLegsAnimTimer( gentity_t *ent, int *legsAnimTimer, int time ) +{ + *legsAnimTimer = time; + + if ( *legsAnimTimer < 0 && time != -1 ) + {//Cap timer to 0 if was counting down, but let it be -1 if that was intentional + *legsAnimTimer = 0; + } + + if ( !*legsAnimTimer && ent && Q3_TaskIDPending( ent, TID_ANIM_LOWER ) ) + {//Waiting for legsAnimTimer to complete, and it just got set to zero + if ( !Q3_TaskIDPending( ent, TID_ANIM_BOTH) ) + {//Not waiting for top + Q3_TaskIDComplete( ent, TID_ANIM_LOWER ); + } + else + {//Waiting for both to finish before complete + Q3_TaskIDClear( &ent->taskID[TID_ANIM_LOWER] );//Bottom is done, regardless + if ( !Q3_TaskIDPending( ent, TID_ANIM_UPPER) ) + {//top is done and we're done + Q3_TaskIDComplete( ent, TID_ANIM_BOTH ); + } + } + } +} + +/* +------------------------- +PM_SetTorsoAnimTimer +------------------------- +*/ + +void PM_SetTorsoAnimTimer( gentity_t *ent, int *torsoAnimTimer, int time ) +{ + *torsoAnimTimer = time; + + if ( *torsoAnimTimer < 0 && time != -1 ) + {//Cap timer to 0 if was counting down, but let it be -1 if that was intentional + *torsoAnimTimer = 0; + } + + if ( !*torsoAnimTimer && ent && Q3_TaskIDPending( ent, TID_ANIM_UPPER ) ) + {//Waiting for torsoAnimTimer to complete, and it just got set to zero + if ( !Q3_TaskIDPending( ent, TID_ANIM_BOTH) ) + {//Not waiting for bottom + Q3_TaskIDComplete( ent, TID_ANIM_UPPER ); + } + else + {//Waiting for both to finish before complete + Q3_TaskIDClear( &ent->taskID[TID_ANIM_UPPER] );//Top is done, regardless + if ( !Q3_TaskIDPending( ent, TID_ANIM_LOWER) ) + {//lower is done and we're done + Q3_TaskIDComplete( ent, TID_ANIM_BOTH ); + } + } + } +} + +extern qboolean PM_SpinningSaberAnim( int anim ); +extern float saberAnimSpeedMod[NUM_FORCE_POWER_LEVELS]; +void PM_SaberStartTransAnim(int saberAnimLevel, int anim, float *animSpeed, gentity_t *gent) +{ + if (g_saberNewCombat->integer) //new code + { + if ( anim == BOTH_V1_BL_S1 + || anim == BOTH_V1_BR_S1 + || anim == BOTH_V1_TL_S1 + || anim == BOTH_V1_TR_S1 + || anim == BOTH_V1_T__S1 + || (anim >= BOTH_V6_BL_S6 && anim <= BOTH_V7__R_S7) ) + { //we're in a broken attack + //speed up recovery from broken attacks based on SO level + *animSpeed = saberAnimSpeedMod[gent->client->ps.forcePowerLevel[FP_SABER_OFFENSE]]; + } + if (g_saberAnimSpeed->value != 1.0f) + { + *animSpeed *= g_saberAnimSpeed->value; + } + else if (gent && gent->client && gent->client->ps.weapon == WP_SABER) + { + if (gent->client->ps.saber[0].animSpeedScale != 1.0f) + { + *animSpeed *= gent->client->ps.saber[0].animSpeedScale; + } + if (gent->client->ps.dualSabers + && gent->client->ps.saber[1].animSpeedScale != 1.0f) + { + *animSpeed *= gent->client->ps.saber[1].animSpeedScale; + } + } + } + else //old code + { + if (g_saberAnimSpeed->value != 1.0f) + { + *animSpeed *= g_saberAnimSpeed->value; + } + else if (gent && gent->client && gent->client->ps.weapon == WP_SABER) + { + if (gent->client->ps.saber[0].animSpeedScale != 1.0f) + { + *animSpeed *= gent->client->ps.saber[0].animSpeedScale; + } + if (gent->client->ps.dualSabers + && gent->client->ps.saber[1].animSpeedScale != 1.0f) + { + *animSpeed *= gent->client->ps.saber[1].animSpeedScale; + } + } + } + if ( gent + && gent->client + && gent->client->ps.stats[STAT_WEAPONS]&(1<client->ps.dualSabers + && saberAnimLevel == SS_DUAL + && gent->weaponModel[1] ) + {//using a scepter and dual style, slow down anims + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_H7_S7_BR ) + { + *animSpeed *= 0.75; + } + } + if ( gent && gent->client && gent->client->ps.forceRageRecoveryTime > level.time ) + {//rage recovery + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_H1_S1_BR ) + {//animate slower + *animSpeed *= 0.75; + } + } + else if ( gent && gent->NPC && gent->NPC->rank == RANK_CIVILIAN ) + {//grunt reborn + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_R1_TR_S1 ) + {//his fast attacks are slower + if ( !PM_SpinningSaberAnim( anim ) ) + { + *animSpeed *= 0.75; + } + return; + } + } + else if ( gent && gent->client ) + { + if ( gent->client->ps.saber[0].type == SABER_LANCE || gent->client->ps.saber[0].type == SABER_TRIDENT ) + {//FIXME: hack for now - these use the fast anims, but slowed down. Should have own style + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_R1_TR_S1 ) + {//his fast attacks are slower + if ( !PM_SpinningSaberAnim( anim ) ) + { + *animSpeed *= 0.75; + } + return; + } + } + } + + if ( ( anim >= BOTH_T1_BR__R && + anim <= BOTH_T1_BL_TL ) || + ( anim >= BOTH_T3_BR__R && + anim <= BOTH_T3_BL_TL ) || + ( anim >= BOTH_T5_BR__R && + anim <= BOTH_T5_BL_TL ) ) + { //what is this doing here exactly? + if ( g_saberNewCombat->integer ) //new code + { + if (saberAnimLevel == FORCE_LEVEL_1 /*|| saberAnimLevel == FORCE_LEVEL_5*/) + {//FIXME: should not be necc for FORCE_LEVEL_1's + *animSpeed *= 1.5; + } + else if (saberAnimLevel == FORCE_LEVEL_5) + { //both Desann and Strong styles suffer some transition speed penalty or something? + *animSpeed *= 0.75; + } + } + else //old code + { + if (saberAnimLevel == FORCE_LEVEL_1 || saberAnimLevel == FORCE_LEVEL_5) + {//FIXME: should not be necc for FORCE_LEVEL_1's + *animSpeed *= 1.5; + } + else if (saberAnimLevel == FORCE_LEVEL_3) + { + *animSpeed *= 0.75; + } + } + } +} +/* +void PM_SaberStartTransAnim( int anim, int entNum, int saberOffenseLevel, float *animSpeed ) +{ + //check starts + if ( ( anim >= BOTH_S1_S1_T_ && + anim <= BOTH_S1_S1_TR ) || + ( anim >= BOTH_S1_S1_T_ && + anim <= BOTH_S1_S1_TR ) || + ( anim >= BOTH_S3_S1_T_ && + anim <= BOTH_S3_S1_TR ) ) + { + if ( entNum == 0 ) + { + *animSpeed *= saberAnimSpeedMod[FORCE_LEVEL_3]; + } + else + { + *animSpeed *= saberAnimSpeedMod[saberOffenseLevel]; + } + } + //Check transitions + else if ( PM_SpinningSaberAnim( anim ) ) + {//spins stay normal speed + return; + } + else if ( ( anim >= BOTH_T1_BR__R && + anim <= BOTH_T1_BL_TL ) || + ( anim >= BOTH_T2_BR__R && + anim <= BOTH_T2_BL_TL ) || + ( anim >= BOTH_T3_BR__R && + anim <= BOTH_T3_BL_TL ) ) + {//slow down the transitions + if ( entNum == 0 && saberOffenseLevel <= FORCE_LEVEL_2 ) + { + *animSpeed *= saberAnimSpeedMod[saberOffenseLevel]; + } + else + { + *animSpeed *= saberAnimSpeedMod[saberOffenseLevel]/2.0f; + } + } + + return; +} +*/ +extern qboolean player_locked; +extern qboolean MatrixMode; +float PM_GetTimeScaleMod( gentity_t *gent ) +{ + if ( g_timescale->value ) + { + if ( !MatrixMode + && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_START + && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_ATTACK + && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_LAND ) + { + if ( gent && gent->s.clientNum == 0 && !player_locked && gent->client->ps.forcePowersActive&(1<value); + } + else if ( gent && gent->client && gent->client->ps.forcePowersActive&(1<value); + } + } + } + return 1.0f; +} + +static inline qboolean PM_IsHumanoid( CGhoul2Info *ghlInfo ) +{ + char *GLAName; + GLAName = gi.G2API_GetGLAName( ghlInfo ); + assert(GLAName); + + if ( !Q_stricmp( "models/players/_humanoid/_humanoid", GLAName ) ) + { + return qtrue; + } + + return qfalse; +} + +/* +------------------------- +PM_SetAnimFinal +------------------------- +*/ +#define G2_DEBUG_TIMING (0) +void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, + int setAnimParts,int anim,int setAnimFlags, + int *torsoAnimTimer,int *legsAnimTimer, + gentity_t *gent,int blendTime) // default blendTime=350 +{ + +// BASIC SETUP AND SAFETY CHECKING +//================================= + + // If It Is A Busted Entity, Don't Do Anything Here. + //--------------------------------------------------- + if (!gent || !gent->client) + { + return; + } + + // Make Sure This Character Has Such An Anim And A Model + //------------------------------------------------------- + if (anim<0 || anim>=MAX_ANIMATIONS || !ValidAnimFileIndex(gent->client->clientInfo.animFileIndex)) + { + #ifndef FINAL_BUILD + if (g_AnimWarning->integer) + { + if (anim<0 || anim>=MAX_ANIMATIONS) + { + gi.Printf(S_COLOR_RED"PM_SetAnimFinal: Invalid Anim Index (%d)!\n", anim); + } + else + { + gi.Printf(S_COLOR_RED"PM_SetAnimFinal: Invalid Anim File Index (%d)!\n", gent->client->clientInfo.animFileIndex); + } + } + #endif + return; + } + + + // Get Global Time Properties + //---------------------------- + float timeScaleMod = PM_GetTimeScaleMod( gent ); + const int actualTime = (cg.time?cg.time:level.time); + const animation_t* animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; + const animation_t& curAnim = animations[anim]; + + // Make Sure This Character Has Such An Anim And A Model + //------------------------------------------------------- + if (animations[anim].numFrames==0) + { + #ifndef FINAL_BUILD + static int LastAnimWarningNum=0; + if (LastAnimWarningNum!=anim) + { + if ((cg_debugAnim.integer==3) || // 3 = do everyone + (cg_debugAnim.integer==1 && gent->s.number==0) || // 1 = only the player + (cg_debugAnim.integer==2 && gent->s.number!=0) || // 2 = only everyone else + (cg_debugAnim.integer==4 && gent->s.number!=cg_debugAnimTarget.integer) // 4 = specific entnum + ) + { + gi.Printf(S_COLOR_RED"PM_SetAnimFinal: Anim %s does not exist in this model (%s)!\n", animTable[anim].name, gent->NPC_type ); + } + } + LastAnimWarningNum = anim; + #endif + return; + } + + // If It's Not A Ghoul 2 Model, Just Remember The Anims And Stop, Because Everything Beyond This Is Ghoul2 + //--------------------------------------------------------------------------------------------------------- + if (!gi.G2API_HaveWeGhoul2Models(gent->ghoul2)) + { + if (setAnimParts&SETANIM_TORSO) + { + (*torsoAnim) = anim; + } + if (setAnimParts&SETANIM_LEGS) + { + (*legsAnim) = anim; + } + return; + } + + + // Lower Offensive Skill Slows Down The Saber Start Attack Animations + //-------------------------------------------------------------------- + PM_SaberStartTransAnim( gent->client->ps.saberAnimLevel, anim, &timeScaleMod, gent ); + + + +// SETUP VALUES FOR INCOMMING ANIMATION +//====================================== + const bool animFootMove = (PM_WalkingAnim(anim) || PM_RunningAnim(anim) || anim==BOTH_CROUCH1WALK || anim==BOTH_CROUCH1WALKBACK); + const bool animHoldless = (setAnimFlags&SETANIM_FLAG_HOLDLESS)!=0; + const bool animHold = (setAnimFlags&SETANIM_FLAG_HOLD)!=0; + const bool animRestart = (setAnimFlags&SETANIM_FLAG_RESTART)!=0; + const bool animOverride = (setAnimFlags&SETANIM_FLAG_OVERRIDE)!=0; + const bool animSync = (g_synchSplitAnims->integer!=0 && !animRestart); + float animCurrent = (-1.0f); + float animSpeed = (50.0f / curAnim.frameLerp * timeScaleMod); // animSpeed is 1.0 if the frameLerp (ms/frame) is 50 (20 fps). + const float animFPS = (fabsf(curAnim.frameLerp)); + const int animDurMSec = (int)(((curAnim.numFrames - 1) * animFPS) / timeScaleMod); + const int animHoldMSec = ((animHoldless && timeScaleMod==1.0f)?((animDurMSec>1)?(animDurMSec-1):(animFPS)):(animDurMSec)); + int animFlags = (curAnim.loopFrames!=-1)?(BONE_ANIM_OVERRIDE_LOOP):(BONE_ANIM_OVERRIDE_FREEZE); + int animStart = (curAnim.firstFrame); + int animEnd = (curAnim.firstFrame)+(animations[anim].numFrames); + + // If We Have A Blend Timer, Add The Blend Flag + //---------------------------------------------- + if (blendTime > 0) + { + animFlags |= BONE_ANIM_BLEND; + } + + // If Animation Is Going Backwards, Swap Last And First Frames + //------------------------------------------------------------- + if (animSpeed<0.0f) + { +// #ifndef FINAL_BUILD + #if 0 + if (g_AnimWarning->integer==1) + { + if (animFlags&BONE_ANIM_OVERRIDE_LOOP) + { + gi.Printf(S_COLOR_YELLOW"PM_SetAnimFinal: WARNING: Anim (%s) looping backwards!\n", animTable[anim].name); + } + } + #endif + + int temp = animEnd; + animEnd = animStart; + animStart = temp; + blendTime = 0; + } + + // If The Animation Is Walking Or Running, Attempt To Scale The Playback Speed To Match + //-------------------------------------------------------------------------------------- + if (g_noFootSlide->integer + && animFootMove + && !(animSpeed<0.0f) + //FIXME: either read speed from animation.cfg or only do this for NPCs + // for whom we've specifically determined the proper numbers! + && gent->client->NPC_class != CLASS_HOWLER + && gent->client->NPC_class != CLASS_WAMPA + && gent->client->NPC_class != CLASS_GONK + && gent->client->NPC_class != CLASS_HOWLER + && gent->client->NPC_class != CLASS_MOUSE + && gent->client->NPC_class != CLASS_PROBE + && gent->client->NPC_class != CLASS_PROTOCOL + && gent->client->NPC_class != CLASS_R2D2 + && gent->client->NPC_class != CLASS_R5D2 + && gent->client->NPC_class != CLASS_SEEKER) + { + bool Walking = !!PM_WalkingAnim(anim); + bool HasDual = (gent->client->ps.saberAnimLevel==SS_DUAL); + bool HasStaff = (gent->client->ps.saberAnimLevel==SS_STAFF); + float moveSpeedOfAnim = 150.0f;//g_noFootSlideRunScale->value; + + if (anim==BOTH_CROUCH1WALK || anim==BOTH_CROUCH1WALKBACK) + { + moveSpeedOfAnim = 75.0f; + } + else + { + if (gent->client->NPC_class == CLASS_HAZARD_TROOPER) + { + moveSpeedOfAnim = 50.0f; + } + else if (gent->client->NPC_class == CLASS_RANCOR) + { + moveSpeedOfAnim = 173.0f; + } + else + { + if (Walking) + { + if (HasDual || HasStaff) + { + moveSpeedOfAnim = 100.0f; + } + else + { + moveSpeedOfAnim = 50.0f;// g_noFootSlideWalkScale->value; + } + } + else + { + if (HasStaff) + { + moveSpeedOfAnim = 250.0f; + } + else + { + moveSpeedOfAnim = 150.0f; + } + } + } + } + + + + + + + animSpeed *= (gent->resultspeed/moveSpeedOfAnim); + if (animSpeed<0.01f) + { + animSpeed = 0.01f; + } + + // Make Sure Not To Play Too Fast An Anim + //---------------------------------------- + float maxPlaybackSpeed = (1.5f * timeScaleMod); + if (animSpeed>maxPlaybackSpeed) + { + animSpeed = maxPlaybackSpeed; + } + } + + +// GET VALUES FOR EXISTING BODY ANIMATION +//========================================== + float bodySpeed = 0.0f; + float bodyCurrent = 0.0f; + int bodyStart = 0; + int bodyEnd = 0; + int bodyFlags = 0; + int bodyAnim = (*legsAnim); + int bodyBone = (gent->rootBone); + bool bodyTimerOn = ((*legsAnimTimer>0) || (*legsAnimTimer)==-1); + bool bodyPlay = ((setAnimParts&SETANIM_LEGS) && (bodyBone!=-1) && (animOverride || !bodyTimerOn)); + bool bodyAnimating = !!gi.G2API_GetBoneAnimIndex(&gent->ghoul2[gent->playerModel], bodyBone, actualTime, &bodyCurrent, &bodyStart, &bodyEnd, &bodyFlags, &bodySpeed, NULL); + bool bodyOnAnimNow = (bodyAnimating && bodyAnim==anim && bodyStart==animStart && bodyEnd==animEnd); + bool bodyMatchTorsFrame = false; + + +// GET VALUES FOR EXISTING TORSO ANIMATION +//=========================================== + float torsSpeed = 0.0f; + float torsCurrent = 0.0f; + int torsStart = 0; + int torsEnd = 0; + int torsFlags = 0; + int torsAnim = (*torsoAnim); + int torsBone = (gent->lowerLumbarBone); + bool torsTimerOn = ((*torsoAnimTimer)>0 || (*torsoAnimTimer)==-1); + bool torsPlay = (gent->client->NPC_class!=CLASS_RANCOR && (setAnimParts&SETANIM_TORSO) && (torsBone!=-1) && (animOverride || !torsTimerOn)); + bool torsAnimating = !!gi.G2API_GetBoneAnimIndex(&gent->ghoul2[gent->playerModel], torsBone, actualTime, &torsCurrent, &torsStart, &torsEnd, &torsFlags, &torsSpeed, NULL); + bool torsOnAnimNow = (torsAnimating && torsAnim==anim && torsStart==animStart && torsEnd==animEnd); + bool torsMatchBodyFrame = false; + + +// APPLY SYNC TO TORSO +//===================== + if (animSync && torsPlay && !bodyPlay && bodyOnAnimNow && (!torsOnAnimNow || torsCurrent!=bodyCurrent)) + { + torsMatchBodyFrame = true; + animCurrent = bodyCurrent; + } + if (animSync && bodyPlay && !torsPlay && torsOnAnimNow && (!bodyOnAnimNow || bodyCurrent!=torsCurrent)) + { + bodyMatchTorsFrame = true; + animCurrent = torsCurrent; + } + + // If Already Doing These Exact Parameters, Then Don't Play + //---------------------------------------------------------- + if (!animRestart) + { + torsPlay &= !(torsOnAnimNow && torsSpeed==animSpeed && !torsMatchBodyFrame); + bodyPlay &= !(bodyOnAnimNow && bodySpeed==animSpeed && !bodyMatchTorsFrame); + } + +#ifndef FINAL_BUILD + if ((cg_debugAnim.integer==3) || // 3 = do everyone + (cg_debugAnim.integer==1 && gent->s.number==0) || // 1 = only the player + (cg_debugAnim.integer==2 && gent->s.number!=0) || // 2 = only everyone else + (cg_debugAnim.integer==4 && gent->s.number!=cg_debugAnimTarget.integer) // 4 = specific entnum + ) + { + if (bodyPlay || torsPlay) + { + char* entName = gent->targetname; + char* location; + + // Select Entity Name + //-------------------- + if (!entName || !entName[0]) + { + entName = gent->NPC_targetname; + } + if (!entName || !entName[0]) + { + entName = gent->NPC_type; + } + if (!entName || !entName[0]) + { + entName = gent->classname; + } + if (!entName || !entName[0]) + { + entName = "UNKNOWN"; + } + + // Select Play Location + //---------------------- + if (bodyPlay && torsPlay) + { + location = "BOTH "; + } + else if (bodyPlay) + { + location = "LEGS "; + } + else + { + location = "TORSO"; + } + + // Print It! + //----------- + Com_Printf("[%10d] ent[%3d-%18s] %s anim[%3d] - %s\n", + actualTime, + gent->s.number, + entName, + location, + anim, + animTable[anim].name ); + } + } +#endif + + +// PLAY ON THE TORSO +//======================== + if (torsPlay) + { + *torsoAnim = anim; + float oldAnimCurrent = animCurrent; + if (animCurrent!=bodyCurrent && torsOnAnimNow && !animRestart && !torsMatchBodyFrame) + { + animCurrent = torsCurrent; + } + + gi.G2API_SetAnimIndex(&gent->ghoul2[gent->playerModel], curAnim.glaIndex); + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], torsBone, + animStart, + animEnd, + (torsOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), + animSpeed, + actualTime, + animCurrent, + blendTime); + + if (gent->motionBone!=-1) + { + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->motionBone, + animStart, + animEnd, + (torsOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), + animSpeed, + actualTime, + animCurrent, + blendTime); + } + + animCurrent = oldAnimCurrent; + + // If This Animation Is To Be Locked And Held, Calculate The Duration And Set The Timer + //-------------------------------------------------------------------------------------- + if (animHold || animHoldless) + { + PM_SetTorsoAnimTimer(gent, torsoAnimTimer, animHoldMSec); + } + } + +// PLAY ON THE WHOLE BODY +//======================== + if (bodyPlay) + { + *legsAnim = anim; + + if (bodyOnAnimNow && !animRestart && !bodyMatchTorsFrame) + { + animCurrent = bodyCurrent; + } + + gi.G2API_SetAnimIndex(&gent->ghoul2[gent->playerModel], curAnim.glaIndex); + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], bodyBone, + animStart, + animEnd, + (bodyOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), + animSpeed, + actualTime, + animCurrent, + blendTime); + + // If This Animation Is To Be Locked And Held, Calculate The Duration And Set The Timer + //-------------------------------------------------------------------------------------- + if (animHold || animHoldless) + { + PM_SetLegsAnimTimer(gent, legsAnimTimer, animHoldMSec); + } + } + + + + + +// PRINT SOME DEBUG TEXT OF EXISTING VALUES +//========================================== + if (false) + { + gi.Printf("PLAYANIM: (%3d) Speed(%4.2f) ", anim, animSpeed); + if (bodyAnimating) + { + gi.Printf("BODY: (%4.2f) (%4.2f) ", bodyCurrent, bodySpeed); + } + else + { + gi.Printf(" "); + } + if (torsAnimating) + { + gi.Printf("TORS: (%4.2f) (%4.2f)\n", torsCurrent, torsSpeed); + } + else + { + gi.Printf("\n"); + } + } +} + + + +void PM_SetAnim(pmove_t *pm,int setAnimParts,int anim,int setAnimFlags, int blendTime) +{ // FIXME : once torsoAnim and legsAnim are in the same structure for NPC and Players + // rename PM_SetAnimFinal to PM_SetAnim and have both NPC and Players call PM_SetAnim + + if ( pm->ps->pm_type >= PM_DEAD ) + {//FIXME: sometimes we'll want to set anims when your dead... twitches, impacts, etc. + return; + } + + if ( pm->gent == NULL ) + { + return; + } + + if ( !pm->gent || pm->gent->health > 0 ) + {//don't lock anims if the guy is dead + if ( pm->ps->torsoAnimTimer + && PM_LockedAnim( pm->ps->torsoAnim ) + && !PM_LockedAnim( anim ) ) + {//nothing can override these special anims + setAnimParts &= ~SETANIM_TORSO; + } + + if ( pm->ps->legsAnimTimer + && PM_LockedAnim( pm->ps->legsAnim ) + && !PM_LockedAnim( anim ) ) + {//nothing can override these special anims + setAnimParts &= ~SETANIM_LEGS; + } + } + + if ( !setAnimParts ) + { + return; + } + + if (setAnimFlags&SETANIM_FLAG_OVERRIDE) + { +// pm->ps->animationTimer = 0; + + if (setAnimParts & SETANIM_TORSO) + { + if( (setAnimFlags & SETANIM_FLAG_RESTART) || pm->ps->torsoAnim != anim ) + { + PM_SetTorsoAnimTimer( pm->gent, &pm->ps->torsoAnimTimer, 0 ); + } + } + if (setAnimParts & SETANIM_LEGS) + { + if( (setAnimFlags & SETANIM_FLAG_RESTART) || pm->ps->legsAnim != anim ) + { + PM_SetLegsAnimTimer( pm->gent, &pm->ps->legsAnimTimer, 0 ); + } + } + } + + PM_SetAnimFinal(&pm->ps->torsoAnim,&pm->ps->legsAnim,setAnimParts,anim,setAnimFlags,&pm->ps->torsoAnimTimer,&pm->ps->legsAnimTimer,&g_entities[pm->ps->clientNum],blendTime);//was pm->gent +} + +bool TorsoAgainstWindTest( gentity_t* ent ) +{ + if (ent&&//valid ent + ent->client&&//a client + (ent->client->ps.weapon!=WP_SABER||ent->client->ps.saberMove==LS_READY)&&//either not holding a saber or the saber is in the ready pose + (ent->s.numbercurrentOrigin) && + gi.WE_IsOutside(ent->currentOrigin) ) + { + if (Q_stricmp(level.mapname, "t2_wedge")!=0) + { + vec3_t fwd; + vec3_t windDir; + if (gi.WE_GetWindVector(windDir, ent->currentOrigin)) + { + VectorScale(windDir, -1.0f, windDir); + AngleVectors(pm->gent->currentAngles, fwd, 0, 0); + if (DotProduct(fwd, windDir)>0.65f) + { + if (ent->client && ent->client->ps.torsoAnim!=BOTH_WIND) + { + NPC_SetAnim(ent, SETANIM_TORSO, BOTH_WIND, SETANIM_FLAG_NORMAL, 400); + } + return true; + } + } + } + } + return false; +} + +/* +------------------------- +PM_TorsoAnimLightsaber +------------------------- +*/ + + +// Note that this function is intended to set the animation for the player, but +// only does idle-ish anims. Anything that has a timer associated, such as attacks and blocks, +// are set by PM_WeaponLightsaber() + +extern Vehicle_t *G_IsRidingVehicle( gentity_t *pEnt ); +extern qboolean PM_LandingAnim( int anim ); +extern qboolean PM_JumpingAnim( int anim ); +qboolean PM_InCartwheel( int anim ); +void PM_TorsoAnimLightsaber() +{ + // ********************************************************* + // WEAPON_READY + // ********************************************************* + if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + {//holding an enemy aloft with force-grip + return; + } + + if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_1 ) + {//lightning + return; + } + + if ( pm->ps->forcePowersActive&(1<ps->saber[0].blade[0].active + && pm->ps->saber[0].blade[0].length < 3 + && !(pm->ps->saberEventFlags&SEF_HITWALL) + && pm->ps->weaponstate == WEAPON_RAISING ) + { + if (!G_IsRidingVehicle(pm->gent)) + { + PM_SetSaberMove(LS_DRAW); + } + return; + } + else if ( !pm->ps->SaberActive() && pm->ps->SaberLength() ) + { + if (!G_IsRidingVehicle(pm->gent)) + { + PM_SetSaberMove(LS_PUTAWAY); + } + return; + } + + if (pm->ps->weaponTime > 0) + { // weapon is already busy. + if ( pm->ps->torsoAnim == BOTH_TOSS1 + || pm->ps->torsoAnim == BOTH_TOSS2 ) + {//in toss + if ( !pm->ps->torsoAnimTimer ) + {//weird, get out of it, I guess + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + } + return; + } + + if ( pm->ps->weaponstate == WEAPON_READY || + pm->ps->weaponstate == WEAPON_CHARGING || + pm->ps->weaponstate == WEAPON_CHARGING_ALT ) + {//ready + if ( pm->ps->weapon == WP_SABER && (pm->ps->SaberLength()) ) + {//saber is on + // Select the proper idle Lightsaber attack move from the chart. + if (pm->ps->saberMove > LS_READY && pm->ps->saberMove < LS_MOVE_MAX) + { + PM_SetSaberMove(saberMoveData[pm->ps->saberMove].chain_idle); + } + else + { + if ( PM_JumpingAnim( pm->ps->legsAnim ) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) + || PM_FlippingAnim( pm->ps->legsAnim )) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + if ( (PM_RunningAnim( pm->ps->legsAnim ) + || pm->ps->legsAnim == BOTH_WALK_STAFF + || pm->ps->legsAnim == BOTH_WALK_DUAL + || pm->ps->legsAnim == BOTH_WALKBACK_STAFF + || pm->ps->legsAnim == BOTH_WALKBACK_DUAL ) + && pm->ps->saberBlockingTime < cg.time ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetSaberMove(LS_READY); + } + } + } + } + /* + if ( PM_JumpingAnim( pm->ps->legsAnim ) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) + || PM_FlippingAnim( pm->ps->legsAnim )) + {//jumping, landing cartwheel, flipping + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetSaberMove( LS_READY ); + } + */ + } + else if (TorsoAgainstWindTest(pm->gent)) + { + } + else if( pm->ps->legsAnim == BOTH_RUN1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_RUN2 )//&& pm->ps->saberAnimLevel != SS_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN2,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_RUN_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_STAFF,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_RUN_DUAL ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_DUAL,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_WALK1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_WALK2 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK2,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_WALK_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_STAFF,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_WALK_DUAL ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_DUAL,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_CROUCH1IDLE && pm->ps->clientNum != 0 )//player falls through + { + //??? Why nothing? What if you were running??? + //PM_SetAnim(pm,SETANIM_TORSO,BOTH_CROUCH1IDLE,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_JUMP1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_JUMP1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else + {//Used to default to both_stand1 which is an arms-down anim +// PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 + // Select the next proper pose for the lightsaber assuming that there are no attacks. + if (pm->ps->saberMove > LS_READY && pm->ps->saberMove < LS_MOVE_MAX) + { + PM_SetSaberMove(saberMoveData[pm->ps->saberMove].chain_idle); + } + else + { + if ( PM_JumpingAnim( pm->ps->legsAnim ) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) + || PM_FlippingAnim( pm->ps->legsAnim )) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + PM_SetSaberMove(LS_READY); + } + } + } + } + } + + // ********************************************************* + // WEAPON_IDLE + // ********************************************************* + + else if ( pm->ps->weaponstate == WEAPON_IDLE ) + { + if (TorsoAgainstWindTest(pm->gent)) + { + } + else if( pm->ps->legsAnim == BOTH_GUARD_LOOKAROUND1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_LOOKAROUND1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_GUARD_IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_IDLE1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND1IDLE1 + || pm->ps->legsAnim == BOTH_STAND2IDLE1 + || pm->ps->legsAnim == BOTH_STAND2IDLE2 + || pm->ps->legsAnim == BOTH_STAND3IDLE1 + || pm->ps->legsAnim == BOTH_STAND5IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND2TO4 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND2TO4,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND4TO2 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4TO2,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND4 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else + { +// This is now set in SetSaberMove. + // Idle for Lightsaber + if ( pm->gent && pm->gent->client ) + { +// pm->gent->client->saberTrail.inAction = qfalse; + } + + qboolean saberInAir = qtrue; + if ( pm->ps->saberInFlight ) + {//guiding saber + if ( PM_SaberInBrokenParry( pm->ps->saberMove ) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim( pm->ps->torsoAnim ) ) + {//we're stuck in a broken parry + saberInAir = qfalse; + } + if ( pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0 )//player is 0 + {// + if ( &g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY ) + {//fell to the ground and we're not trying to pull it back + saberInAir = qfalse; + } + } + } + if ( pm->ps->saberInFlight + && saberInAir + && (!pm->ps->dualSabers || !pm->ps->saber[1].Active())) + { + if ( !PM_ForceAnim( pm->ps->torsoAnim ) + || pm->ps->torsoAnimTimer < 300 ) + {//don't interrupt a force power anim + if ( pm->ps->torsoAnim != BOTH_LOSE_SABER + || !pm->ps->torsoAnimTimer ) + { + PM_SetAnim( pm, SETANIM_TORSO,BOTH_SABERPULL,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + } + } + else + {//saber is on + // Idle for Lightsaber + if ( pm->gent && pm->gent->client ) + { + if ( !G_InCinematicSaberAnim( pm->gent ) ) + { + pm->gent->client->ps.SaberDeactivateTrail( 0 ); + } + } + // Idle for idle/ready Lightsaber +// PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONIDLE1 + // Select the proper idle Lightsaber attack move from the chart. + if (pm->ps->saberMove > LS_READY && pm->ps->saberMove < LS_MOVE_MAX) + { + PM_SetSaberMove(saberMoveData[pm->ps->saberMove].chain_idle); + } + else + { + if ( PM_JumpingAnim( pm->ps->legsAnim ) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) + || PM_FlippingAnim( pm->ps->legsAnim )) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + if ( (PM_RunningAnim( pm->ps->legsAnim ) + || pm->ps->legsAnim == BOTH_WALK_STAFF + || pm->ps->legsAnim == BOTH_WALK_DUAL + || pm->ps->legsAnim == BOTH_WALKBACK_STAFF + || pm->ps->legsAnim == BOTH_WALKBACK_DUAL ) + && pm->ps->saberBlockingTime < cg.time ) + {//running w/1-handed weapon uses full-body anim + int setFlags = SETANIM_FLAG_NORMAL; + if ( PM_LandingAnim( pm->ps->torsoAnim ) ) + { + setFlags = SETANIM_FLAG_OVERRIDE; + } + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,setFlags); + } + else + { + PM_SetSaberMove(LS_READY); + } + } + } + } + } + } + } +} + + + + +/* +------------------------- +PM_TorsoAnimation +------------------------- +*/ + +void PM_TorsoAnimation( void ) +{//FIXME: Write a much smarter and more appropriate anim picking routine logic... +// int oldAnim; + if ( PM_InKnockDown( pm->ps ) || PM_InRoll( pm->ps )) + {//in knockdown + return; + } + + if ( (pm->ps->eFlags&EF_HELD_BY_WAMPA) ) + { + return; + } + + if ( (pm->ps->eFlags&EF_FORCE_DRAINED) ) + {//being drained + //PM_SetAnim( pm, SETANIM_TORSO, BOTH_HUGGEE1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + return; + } + if ( (pm->ps->forcePowersActive&(1<ps->forceDrainEntityNum < ENTITYNUM_WORLD ) + {//draining + //PM_SetAnim( pm, SETANIM_TORSO, BOTH_HUGGER1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + return; + } + + if( pm->gent && pm->gent->NPC && (pm->gent->NPC->scriptFlags & SCF_FORCED_MARCH) ) + { + return; + } + + if(pm->gent != NULL && pm->gent->client) + { + pm->gent->client->renderInfo.torsoFpsMod = 1.0f; + } + + if ( pm->gent && pm->ps && pm->ps->eFlags & EF_LOCKED_TO_WEAPON ) + { + if ( pm->gent->owner && pm->gent->owner->e_UseFunc == useF_emplaced_gun_use )//ugly way to tell, but... + {//full body + PM_SetAnim(pm,SETANIM_BOTH,BOTH_GUNSIT1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + else + {//torso + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUNSIT1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + return; + } +/* else if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE && pm->ps->clientNum < MAX_CLIENTS && (m_pVehicleInfo[((CVehicleNPC *)pm->gent->NPC)->m_iVehicleTypeID].numHands == 2 || g_speederControlScheme->value == 2) ) + {//can't look around + PM_SetAnim(pm,SETANIM_TORSO,m_pVehicleInfo[((CVehicleNPC *)pm->gent->NPC)->m_iVehicleTypeID].riderAnim,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); + return; + }*/ + + if ( pm->ps->taunting > level.time ) + { + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ALORA ) + { + PM_SetAnim(pm,SETANIM_BOTH,BOTH_ALORA_TAUNT,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + else if ( pm->ps->weapon == WP_SABER && pm->ps->saberAnimLevel == SS_DUAL && PM_HasAnimation( pm->gent, BOTH_DUAL_TAUNT ) ) + { + PM_SetAnim(pm,SETANIM_BOTH,BOTH_DUAL_TAUNT,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + else if ( pm->ps->weapon == WP_SABER + && pm->ps->saberAnimLevel == SS_STAFF )//pm->ps->saber[0].type == SABER_STAFF ) + {//turn on the blades + if ( PM_HasAnimation( pm->gent, BOTH_STAFF_TAUNT ) ) + { + PM_SetAnim(pm,SETANIM_BOTH,BOTH_STAFF_TAUNT,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + /* + else + { + if ( !pm->ps->saber[0].blade[0].active ) + {//first blade is off + //turn it on + pm->ps->SaberBladeActivate( 0, 0, qtrue ); + if ( !pm->ps->saber[0].blade[1].active ) + {//second blade is also off, extend time of this taunt so we have enough time to turn them both on + pm->ps->taunting = level.time + 3000; + } + } + else if ( (pm->ps->taunting - level.time) < 1500 ) + {//only 1500ms left in taunt + if ( !pm->ps->saber[0].blade[1].active ) + {//second blade is off + //turn it on + pm->ps->SaberBladeActivate( 0, 1, qtrue ); + } + } + //pose + PM_SetAnim(pm,SETANIM_BOTH,BOTH_SABERSTAFF_STANCE,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); + pm->ps->torsoAnimTimer = pm->ps->legsAnimTimer = (pm->ps->taunting - level.time); + } + */ + } + else if ( PM_HasAnimation( pm->gent, BOTH_GESTURE1 ) ) + { + PM_SetAnim(pm,SETANIM_BOTH,BOTH_GESTURE1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + pm->gent->client->ps.SaberActivateTrail( 100 ); + //FIXME: will this reset? + //FIXME: force-control (yellow glow) effect on hand and saber? + } + else + { + //PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE1,SETANIM_FLAG_NORMAL); + } + return; + } + + if (pm->ps->weapon == WP_SABER ) // WP_LIGHTSABER + { + qboolean saberInAir = qfalse; + if ( pm->ps->SaberLength() && !pm->ps->saberInFlight ) + { + PM_TorsoAnimLightsaber(); + } + else + { + if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + {//holding an enemy aloft with force-grip + return; + } + if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_1 ) + {//lightning + return; + } + if ( pm->ps->forcePowersActive&(1<ps->saberMove ) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim( pm->ps->torsoAnim ) ) + {//we're stuck in a broken parry + PM_TorsoAnimLightsaber(); + } + else + { + if ( pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0 )//player is 0 + {// + if ( &g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY ) + {//fell to the ground and we're not trying to pull it back + saberInAir = qfalse; + } + } + + if ( pm->ps->saberInFlight + && saberInAir + && (!pm->ps->dualSabers //not using 2 sabers + || !pm->ps->saber[1].Active() //left one off + || pm->ps->torsoAnim == BOTH_SABERDUAL_STANCE//not attacking + || pm->ps->torsoAnim == BOTH_SABERPULL//not attacking + || pm->ps->torsoAnim == BOTH_STAND1//not attacking + || PM_RunningAnim( pm->ps->torsoAnim ) //not attacking + || PM_WalkingAnim( pm->ps->torsoAnim ) //not attacking + || PM_JumpingAnim( pm->ps->torsoAnim )//not attacking + || PM_SwimmingAnim( pm->ps->torsoAnim ) )//not attacking + ) + { + if ( !PM_ForceAnim( pm->ps->torsoAnim ) || pm->ps->torsoAnimTimer < 300 ) + {//don't interrupt a force power anim + if ( pm->ps->torsoAnim != BOTH_LOSE_SABER + || !pm->ps->torsoAnimTimer ) + { + PM_SetAnim( pm, SETANIM_TORSO,BOTH_SABERPULL,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + } + } + else + { + if ( PM_InSlopeAnim( pm->ps->legsAnim ) ) + {//HMM... this probably breaks the saber putaway and select anims + if ( pm->ps->SaberLength() > 0 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND2,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + } + } + } + } + + if (pm->ps->weaponTime<= 0 && (pm->ps->saberMove==LS_READY || pm->ps->SaberLength()==0) && !saberInAir) + { + TorsoAgainstWindTest(pm->gent); + } + return; + } + + if ( PM_ForceAnim( pm->ps->torsoAnim ) + && pm->ps->torsoAnimTimer > 0 ) + {//in a force anim, don't do a stand anim + return; + } + + + qboolean weaponBusy = qfalse; + + if ( pm->ps->weapon == WP_NONE ) + { + weaponBusy = qfalse; + } + else if ( pm->ps->weaponstate == WEAPON_FIRING || pm->ps->weaponstate == WEAPON_CHARGING || pm->ps->weaponstate == WEAPON_CHARGING_ALT ) + { + weaponBusy = qtrue; + } + else if ( pm->ps->lastShotTime > level.time - 3000 ) + { + weaponBusy = qtrue; + } + else if ( pm->ps->weaponTime > 0 ) + { + weaponBusy = qtrue; + } + else if ( pm->gent && pm->gent->client->fireDelay > 0 ) + { + weaponBusy = qtrue; + } + else if ( TorsoAgainstWindTest(pm->gent) ) + { + return; + } + else if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.zoomTime > cg.time - 5000 ) + {//if we used binoculars recently, aim weapon + weaponBusy = qtrue; + pm->ps->weaponstate = WEAPON_IDLE; + } + else if ( pm->ps->pm_flags & PMF_DUCKED ) + {//ducking is considered on alert... plus looks stupid to have arms hanging down when crouched + weaponBusy = qtrue; + } + + if ( pm->ps->weapon == WP_NONE || + pm->ps->weaponstate == WEAPON_READY || + pm->ps->weaponstate == WEAPON_CHARGING || + pm->ps->weaponstate == WEAPON_CHARGING_ALT ) + { + if ( pm->ps->weapon == WP_SABER && pm->ps->SaberLength() ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 + } + else if( pm->ps->legsAnim == BOTH_RUN1 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_RUN2 && !weaponBusy )//&& pm->ps->saberAnimLevel != SS_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN2,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_RUN4 && !weaponBusy )//&& pm->ps->saberAnimLevel != SS_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN4,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_RUN_STAFF && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_STAFF,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_RUN_DUAL && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_DUAL,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_WALK1 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_WALK2 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK2,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_WALK_STAFF && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_STAFF,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_WALK_DUAL&& !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_DUAL,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_CROUCH1IDLE && pm->ps->clientNum != 0 )//player falls through + { + //??? Why nothing? What if you were running??? + //PM_SetAnim(pm,SETANIM_TORSO,BOTH_CROUCH1IDLE,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_JUMP1 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_JUMP1,SETANIM_FLAG_NORMAL, 100); // Only blend over 100ms + } + else if( pm->ps->legsAnim == BOTH_SWIM_IDLE1 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIM_IDLE1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_SWIMFORWARD && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIMFORWARD,SETANIM_FLAG_NORMAL); + } + else if ( pm->ps->weapon == WP_NONE ) + { + int legsAnim = pm->ps->legsAnim; + /* + if ( PM_RollingAnim( legsAnim ) || + PM_FlippingAnim( legsAnim ) || + PM_JumpingAnim( legsAnim ) || + PM_PainAnim( legsAnim ) || + PM_SwimmingAnim( legsAnim ) ) + */ + { + PM_SetAnim(pm, SETANIM_TORSO, legsAnim, SETANIM_FLAG_NORMAL ); + } + } + else + {//Used to default to both_stand1 which is an arms-down anim + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else if ( pm->gent != NULL + && (pm->gent->s.numbergent)) + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT ) + {//PLayer- temp hack for weapon frame + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + {//ignore + } + else if ( pm->ps->weapon == WP_MELEE ) + {//hehe + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + else if ( PM_InSpecialJump( pm->ps->legsAnim ) ) + {//use legs anim + //FIXME: or just use whatever's currently playing? + //PM_SetAnim( pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL ); + } + else + { + switch(pm->ps->weapon) + { + // ******************************************************** + case WP_SABER: // WP_LIGHTSABER + // Ready pose for Lightsaber +// PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 + // Select the next proper pose for the lightsaber assuming that there are no attacks. + if (pm->ps->saberMove > LS_NONE && pm->ps->saberMove < LS_MOVE_MAX) + { + PM_SetSaberMove(saberMoveData[pm->ps->saberMove].chain_idle); + } + break; + // ******************************************************** + + case WP_BRYAR_PISTOL: + //FIXME: if recently fired, hold the ready! + if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + break; + case WP_BLASTER_PISTOL: + if ( pm->gent + && pm->gent->weaponModel[1] > 0 ) + {//dual pistols + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUNSIT1,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + } + } + else + {//single pistols + if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + } + break; + case WP_NONE: + //NOTE: should never get here + break; + case WP_MELEE: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + {//ignore + } + else if ( pm->gent && pm->gent->client && !PM_DroidMelee( pm->gent->client->NPC_class ) ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + break; + case WP_TUSKEN_STAFF: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND3, SETANIM_FLAG_NORMAL); + } + break; + + case WP_NOGHRI_STICK: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + //PM_SetAnim(pm,SETANIM_LEGS,BOTH_ATTACK2,SETANIM_FLAG_NORMAL); + break; + + case WP_BLASTER: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + //PM_SetAnim(pm,SETANIM_LEGS,BOTH_ATTACK2,SETANIM_FLAG_NORMAL); + break; + case WP_DISRUPTOR: + case WP_TUSKEN_RIFLE: + if ( (pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT) + || PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running sniper weapon uses normal ready + if ( pm->ps->clientNum ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + } + else + { + if ( pm->ps->clientNum ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD );//TORSO_WEAPONREADY4//SETANIM_FLAG_RESTART| + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL ); + } + } + break; + case WP_BOT_LASER: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + break; + case WP_THERMAL: + if ( pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT + && (PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim )) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && (pm->ps->weaponstate == WEAPON_CHARGING || pm->ps->weaponstate == WEAPON_CHARGING_ALT) ) + {//player pulling back to throw + if ( PM_StandingAnim( pm->ps->legsAnim ) ) + { + PM_SetAnim( pm, SETANIM_LEGS, BOTH_THERMAL_READY, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + else if ( pm->ps->legsAnim == BOTH_THERMAL_READY ) + {//sigh... hold it so pm_footsteps doesn't override + if ( pm->ps->legsAnimTimer < 100 ) + { + pm->ps->legsAnimTimer = 100; + } + } + PM_SetAnim( pm, SETANIM_TORSO, BOTH_THERMAL_READY, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + else + { + if ( weaponBusy ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY10, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + } + } + } + break; + case WP_REPEATER: + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_GALAKMECH ) + {// + if ( pm->gent->alt_fire ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY1,SETANIM_FLAG_NORMAL); + } + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + break; + case WP_TRIP_MINE: + case WP_DET_PACK: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( weaponBusy ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + } + } + break; + default: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + break; + } + } + } + } + else if ( pm->ps->weaponstate == WEAPON_IDLE ) + { + if( pm->ps->legsAnim == BOTH_GUARD_LOOKAROUND1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_LOOKAROUND1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_GUARD_IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_IDLE1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_STAND1IDLE1 + || pm->ps->legsAnim == BOTH_STAND2IDLE1 + || pm->ps->legsAnim == BOTH_STAND2IDLE2 + || pm->ps->legsAnim == BOTH_STAND3IDLE1 + || pm->ps->legsAnim == BOTH_STAND5IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND2TO4 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND2TO4,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_STAND4TO2 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4TO2,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_STAND4 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_SWIM_IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIM_IDLE1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_SWIMFORWARD ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIMFORWARD,SETANIM_FLAG_NORMAL); + } + else if ( PM_InSpecialJump( pm->ps->legsAnim ) ) + {//use legs anim + //FIXME: or just use whatever's currently playing? + //PM_SetAnim( pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL ); + } + else if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + if ( !weaponBusy + && pm->ps->weapon != WP_BOWCASTER + && pm->ps->weapon != WP_REPEATER + && pm->ps->weapon != WP_FLECHETTE + && pm->ps->weapon != WP_ROCKET_LAUNCHER + && pm->ps->weapon != WP_CONCUSSION + && ( PM_RunningAnim( pm->ps->legsAnim ) + || (PM_WalkingAnim( pm->ps->legsAnim ) && (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) ) + {//running w/1-handed or light 2-handed weapon uses full-body anim if you're not using the weapon right now + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + switch ( pm->ps->weapon ) + { + // ******************************************************** + case WP_SABER: // WP_LIGHTSABER + // Shouldn't get here, should go to TorsoAnimLightsaber + break; + // ******************************************************** + + case WP_BRYAR_PISTOL: + if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_NORMAL); + } + break; + case WP_BLASTER_PISTOL: + if ( pm->gent + && pm->gent->weaponModel[1] > 0 ) + {//dual pistols + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUNSIT1,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + else + {//single pistols + if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_NORMAL); + } + } + break; + + case WP_NONE: + //NOTE: should never get here + break; + + case WP_MELEE: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + {//ignore + } + else if ( pm->gent && pm->gent->client && !PM_DroidMelee( pm->gent->client->NPC_class ) ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + break; + + case WP_TUSKEN_STAFF: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND3, SETANIM_FLAG_NORMAL); + } + break; + + case WP_NOGHRI_STICK: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + + case WP_BLASTER: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + + case WP_DISRUPTOR: + case WP_TUSKEN_RIFLE: + if ( (pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT) + || PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running sniper weapon uses normal ready + if ( pm->ps->clientNum ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + } + else + { + if ( pm->ps->clientNum ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL ); + } + } + break; + + case WP_BOT_LASER: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + break; + + case WP_THERMAL: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( weaponBusy ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONIDLE10, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + } + } + break; + + case WP_REPEATER: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + case WP_TRIP_MINE: + case WP_DET_PACK: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( weaponBusy ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONIDLE3, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + } + } + break; + + default: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + } + } + } + } +} + +//========================================================================= +// Anim checking utils +//========================================================================= + +int PM_GetTurnAnim( gentity_t *gent, int anim ) +{ + if ( !gent ) + { + return -1; + } + + switch( anim ) + { + case BOTH_STAND1: //# Standing idle: no weapon: hands down + case BOTH_STAND1IDLE1: //# Random standing idle + case BOTH_STAND2: //# Standing idle with a weapon + case BOTH_SABERFAST_STANCE: + case BOTH_SABERSLOW_STANCE: + case BOTH_STAND2IDLE1: //# Random standing idle + case BOTH_STAND2IDLE2: //# Random standing idle + case BOTH_STAND3: //# Standing hands behind back: at ease: etc. + case BOTH_STAND3IDLE1: //# Random standing idle + case BOTH_STAND4: //# two handed: gun down: relaxed stand + case BOTH_STAND5: //# standing idle, no weapon, hand down, back straight + case BOTH_STAND5IDLE1: //# Random standing idle + case BOTH_STAND6: //# one handed: gun at side: relaxed stand + case BOTH_STAND2TO4: //# Transition from stand2 to stand4 + case BOTH_STAND4TO2: //# Transition from stand4 to stand2 + case BOTH_GESTURE1: //# Generic gesture: non-specific + case BOTH_GESTURE2: //# Generic gesture: non-specific + case BOTH_TALK1: //# Generic talk anim + case BOTH_TALK2: //# Generic talk anim + if ( PM_HasAnimation( gent, LEGS_TURN1 ) ) + { + return LEGS_TURN1; + } + else + { + return -1; + } + break; + case BOTH_ATTACK1: //# Attack with generic 1-handed weapon + case BOTH_ATTACK2: //# Attack with generic 2-handed weapon + case BOTH_ATTACK3: //# Attack with heavy 2-handed weapon + case BOTH_ATTACK4: //# Attack with ??? + case BOTH_MELEE1: //# First melee attack + case BOTH_MELEE2: //# Second melee attack + case BOTH_GUARD_LOOKAROUND1: //# Cradling weapon and looking around + case BOTH_GUARD_IDLE1: //# Cradling weapon and standing + if ( PM_HasAnimation( gent, LEGS_TURN2 ) ) + { + return LEGS_TURN2; + } + else + { + return -1; + } + break; + default: + return -1; + break; + } +} + +int PM_TurnAnimForLegsAnim( gentity_t *gent, int anim ) +{ + if ( !gent ) + { + return -1; + } + + switch( anim ) + { + case BOTH_STAND1: //# Standing idle: no weapon: hands down + case BOTH_STAND1IDLE1: //# Random standing idle + if ( PM_HasAnimation( gent, BOTH_TURNSTAND1 ) ) + { + return BOTH_TURNSTAND1; + } + else + { + return -1; + } + break; + case BOTH_STAND2: //# Standing idle with a weapon + case BOTH_SABERFAST_STANCE: + case BOTH_SABERSLOW_STANCE: + case BOTH_STAND2IDLE1: //# Random standing idle + case BOTH_STAND2IDLE2: //# Random standing idle + if ( PM_HasAnimation( gent, BOTH_TURNSTAND2 ) ) + { + return BOTH_TURNSTAND2; + } + else + { + return -1; + } + break; + case BOTH_STAND3: //# Standing hands behind back: at ease: etc. + case BOTH_STAND3IDLE1: //# Random standing idle + if ( PM_HasAnimation( gent, BOTH_TURNSTAND3 ) ) + { + return BOTH_TURNSTAND3; + } + else + { + return -1; + } + break; + case BOTH_STAND4: //# two handed: gun down: relaxed stand + if ( PM_HasAnimation( gent, BOTH_TURNSTAND4 ) ) + { + return BOTH_TURNSTAND4; + } + else + { + return -1; + } + break; + case BOTH_STAND5: //# standing idle, no weapon, hand down, back straight + case BOTH_STAND5IDLE1: //# Random standing idle + if ( PM_HasAnimation( gent, BOTH_TURNSTAND5 ) ) + { + return BOTH_TURNSTAND5; + } + else + { + return -1; + } + break; + case BOTH_CROUCH1: //# Transition from standing to crouch + case BOTH_CROUCH1IDLE: //# Crouching idle + /* + case BOTH_UNCROUCH1: //# Transition from crouch to standing + case BOTH_CROUCH2TOSTAND1: //# going from crouch2 to stand1 + case BOTH_CROUCH3: //# Desann crouching down to Kyle (cin 9) + case BOTH_UNCROUCH3: //# Desann uncrouching down to Kyle (cin 9) + case BOTH_CROUCH4: //# Slower version of crouch1 for cinematics + case BOTH_UNCROUCH4: //# Slower version of uncrouch1 for cinematics + */ + if ( PM_HasAnimation( gent, BOTH_TURNCROUCH1 ) ) + { + return BOTH_TURNCROUCH1; + } + else + { + return -1; + } + break; + default: + return -1; + break; + } +} + +qboolean PM_InOnGroundAnim ( playerState_t *ps ) +{ + switch( ps->legsAnim ) + { + case BOTH_DEAD1: + case BOTH_DEAD2: + case BOTH_DEAD3: + case BOTH_DEAD4: + case BOTH_DEAD5: + case BOTH_DEADFORWARD1: + case BOTH_DEADBACKWARD1: + case BOTH_DEADFORWARD2: + case BOTH_DEADBACKWARD2: + case BOTH_LYINGDEATH1: + case BOTH_LYINGDEAD1: + case BOTH_SLEEP1: //# laying on back-rknee up-rhand on torso + return qtrue; + break; + case BOTH_KNOCKDOWN1: //# + case BOTH_KNOCKDOWN2: //# + case BOTH_KNOCKDOWN3: //# + case BOTH_KNOCKDOWN4: //# + case BOTH_KNOCKDOWN5: //# + case BOTH_LK_DL_ST_T_SB_1_L: + case BOTH_RELEASED: + if ( ps->legsAnimTimer < 500 ) + {//pretty much horizontal by this point + return qtrue; + } + break; + case BOTH_PLAYER_PA_3_FLY: + if ( ps->legsAnimTimer < 300 ) + {//pretty much horizontal by this point + return qtrue; + } + /* + else if ( ps->clientNum < MAX_CLIENTS + && ps->legsAnimTimer < 300 + PLAYER_KNOCKDOWN_HOLD_EXTRA_TIME ) + { + return qtrue; + } + */ + break; + case BOTH_GETUP1: + case BOTH_GETUP2: + case BOTH_GETUP3: + case BOTH_GETUP4: + case BOTH_GETUP5: + case BOTH_GETUP_CROUCH_F1: + case BOTH_GETUP_CROUCH_B1: + case BOTH_FORCE_GETUP_F1: + case BOTH_FORCE_GETUP_F2: + case BOTH_FORCE_GETUP_B1: + case BOTH_FORCE_GETUP_B2: + case BOTH_FORCE_GETUP_B3: + case BOTH_FORCE_GETUP_B4: + case BOTH_FORCE_GETUP_B5: + case BOTH_FORCE_GETUP_B6: + if ( ps->legsAnimTimer > PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)ps->legsAnim )-400 ) + {//still pretty much horizontal at this point + return qtrue; + } + break; + } + + return qfalse; +} + +qboolean PM_InSpecialDeathAnim( int anim ) +{ + switch( pm->ps->legsAnim ) + { + case BOTH_DEATH_ROLL: //# Death anim from a roll + case BOTH_DEATH_FLIP: //# Death anim from a flip + case BOTH_DEATH_SPIN_90_R: //# Death anim when facing 90 degrees right + case BOTH_DEATH_SPIN_90_L: //# Death anim when facing 90 degrees left + case BOTH_DEATH_SPIN_180: //# Death anim when facing backwards + case BOTH_DEATH_LYING_UP: //# Death anim when lying on back + case BOTH_DEATH_LYING_DN: //# Death anim when lying on front + case BOTH_DEATH_FALLING_DN: //# Death anim when falling on face + case BOTH_DEATH_FALLING_UP: //# Death anim when falling on back + case BOTH_DEATH_CROUCHED: //# Death anim when crouched + return qtrue; + break; + default: + return qfalse; + break; + } +} + +qboolean PM_InDeathAnim ( void ) +{//Purposely does not cover stumbledeath and falldeath... + switch( pm->ps->legsAnim ) + { + case BOTH_DEATH1: //# First Death anim + case BOTH_DEATH2: //# Second Death anim + case BOTH_DEATH3: //# Third Death anim + case BOTH_DEATH4: //# Fourth Death anim + case BOTH_DEATH5: //# Fifth Death anim + case BOTH_DEATH6: //# Sixth Death anim + case BOTH_DEATH7: //# Seventh Death anim + case BOTH_DEATH8: //# + case BOTH_DEATH9: //# + case BOTH_DEATH10: //# + case BOTH_DEATH11: //# + case BOTH_DEATH12: //# + case BOTH_DEATH13: //# + case BOTH_DEATH14: //# + case BOTH_DEATH14_UNGRIP: //# Desann's end death (cin #35) + case BOTH_DEATH14_SITUP: //# Tavion sitting up after having been thrown (cin #23) + case BOTH_DEATH15: //# + case BOTH_DEATH16: //# + case BOTH_DEATH17: //# + case BOTH_DEATH18: //# + case BOTH_DEATH19: //# + case BOTH_DEATH20: //# + case BOTH_DEATH21: //# + case BOTH_DEATH22: //# + case BOTH_DEATH23: //# + case BOTH_DEATH24: //# + case BOTH_DEATH25: //# + + case BOTH_DEATHFORWARD1: //# First Death in which they get thrown forward + case BOTH_DEATHFORWARD2: //# Second Death in which they get thrown forward + case BOTH_DEATHFORWARD3: //# Tavion's falling in cin# 23 + case BOTH_DEATHBACKWARD1: //# First Death in which they get thrown backward + case BOTH_DEATHBACKWARD2: //# Second Death in which they get thrown backward + + case BOTH_DEATH1IDLE: //# Idle while close to death + case BOTH_LYINGDEATH1: //# Death to play when killed lying down + case BOTH_STUMBLEDEATH1: //# Stumble forward and fall face first death + case BOTH_FALLDEATH1: //# Fall forward off a high cliff and splat death - start + case BOTH_FALLDEATH1INAIR: //# Fall forward off a high cliff and splat death - loop + case BOTH_FALLDEATH1LAND: //# Fall forward off a high cliff and splat death - hit bottom + //# #sep case BOTH_ DEAD POSES # Should be last frame of corresponding previous anims + case BOTH_DEAD1: //# First Death finished pose + case BOTH_DEAD2: //# Second Death finished pose + case BOTH_DEAD3: //# Third Death finished pose + case BOTH_DEAD4: //# Fourth Death finished pose + case BOTH_DEAD5: //# Fifth Death finished pose + case BOTH_DEAD6: //# Sixth Death finished pose + case BOTH_DEAD7: //# Seventh Death finished pose + case BOTH_DEAD8: //# + case BOTH_DEAD9: //# + case BOTH_DEAD10: //# + case BOTH_DEAD11: //# + case BOTH_DEAD12: //# + case BOTH_DEAD13: //# + case BOTH_DEAD14: //# + case BOTH_DEAD15: //# + case BOTH_DEAD16: //# + case BOTH_DEAD17: //# + case BOTH_DEAD18: //# + case BOTH_DEAD19: //# + case BOTH_DEAD20: //# + case BOTH_DEAD21: //# + case BOTH_DEAD22: //# + case BOTH_DEAD23: //# + case BOTH_DEAD24: //# + case BOTH_DEAD25: //# + case BOTH_DEADFORWARD1: //# First thrown forward death finished pose + case BOTH_DEADFORWARD2: //# Second thrown forward death finished pose + case BOTH_DEADBACKWARD1: //# First thrown backward death finished pose + case BOTH_DEADBACKWARD2: //# Second thrown backward death finished pose + case BOTH_LYINGDEAD1: //# Killed lying down death finished pose + case BOTH_STUMBLEDEAD1: //# Stumble forward death finished pose + case BOTH_FALLDEAD1LAND: //# Fall forward and splat death finished pose + //# #sep case BOTH_ DEAD TWITCH/FLOP # React to being shot from death poses + case BOTH_DEADFLOP1: //# React to being shot from First Death finished pose + case BOTH_DEADFLOP2: //# React to being shot from Second Death finished pose + case BOTH_DISMEMBER_HEAD1: //# + case BOTH_DISMEMBER_TORSO1: //# + case BOTH_DISMEMBER_LLEG: //# + case BOTH_DISMEMBER_RLEG: //# + case BOTH_DISMEMBER_RARM: //# + case BOTH_DISMEMBER_LARM: //# + return qtrue; + break; + default: + return PM_InSpecialDeathAnim( pm->ps->legsAnim ); + break; + } +} + +qboolean PM_InCartwheel( int anim ) +{ + switch ( anim ) + { + case BOTH_ARIAL_LEFT: + case BOTH_ARIAL_RIGHT: + case BOTH_ARIAL_F1: + case BOTH_CARTWHEEL_LEFT: + case BOTH_CARTWHEEL_RIGHT: + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_InButterfly( int anim ) +{ + switch ( anim ) + { + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_StandingAnim( int anim ) +{//NOTE: does not check idles or special (cinematic) stands + switch ( anim ) + { + case BOTH_STAND1: + case BOTH_STAND2: + case BOTH_STAND3: + case BOTH_STAND4: + case BOTH_ATTACK3: + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_InAirKickingAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_A7_KICK_F_AIR: + case BOTH_A7_KICK_B_AIR: + case BOTH_A7_KICK_R_AIR: + case BOTH_A7_KICK_L_AIR: + return qtrue; + } + return qfalse; +} + +qboolean PM_KickingAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_A7_KICK_F: + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + case BOTH_A7_KICK_S: + case BOTH_A7_KICK_BF: + case BOTH_A7_KICK_RL: + //NOT a kick, but acts like one: + case BOTH_A7_HILT: + //NOT kicks, but do kick traces anyway + case BOTH_GETUP_BROLL_B: + case BOTH_GETUP_BROLL_F: + case BOTH_GETUP_FROLL_B: + case BOTH_GETUP_FROLL_F: + return qtrue; + break; + default: + return PM_InAirKickingAnim( anim ); + break; + } + //return qfalse; +} + +qboolean PM_StabDownAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_STABDOWN: + case BOTH_STABDOWN_STAFF: + case BOTH_STABDOWN_DUAL: + return qtrue; + } + return qfalse; +} + +qboolean PM_GoingToAttackDown( playerState_t *ps ) +{ + if ( PM_StabDownAnim( ps->torsoAnim )//stabbing downward + || ps->saberMove == LS_A_LUNGE//lunge + || ps->saberMove == LS_A_JUMP_T__B_//death from above + || ps->saberMove == LS_A_T2B//attacking top to bottom + || ps->saberMove == LS_S_T2B//starting at attack downward + || (PM_SaberInTransition( ps->saberMove ) && saberMoveData[ps->saberMove].endQuad == Q_T) )//transitioning to a top to bottom attack + { + return qtrue; + } + return qfalse; +} + +qboolean PM_ForceUsingSaberAnim( int anim ) +{//saber/acrobatic anims that should prevent you from recharging force power while you're in them... + switch ( anim ) + { + case BOTH_JUMPFLIPSLASHDOWN1: + case BOTH_JUMPFLIPSTABDOWN: + case BOTH_FORCELEAP2_T__B_: + case BOTH_JUMPATTACK6: + case BOTH_JUMPATTACK7: + case BOTH_FORCELONGLEAP_START: + case BOTH_FORCELONGLEAP_ATTACK: + case BOTH_FORCEWALLRUNFLIP_START: + case BOTH_FORCEWALLRUNFLIP_END: + case BOTH_FORCEWALLRUNFLIP_ALT: + case BOTH_FORCEWALLREBOUND_FORWARD: + case BOTH_FORCEWALLREBOUND_LEFT: + case BOTH_FORCEWALLREBOUND_BACK: + case BOTH_FORCEWALLREBOUND_RIGHT: + case BOTH_FLIP_ATTACK7: + case BOTH_FLIP_HOLD7: + case BOTH_FLIP_LAND: + case BOTH_PULL_IMPALE_STAB: + case BOTH_PULL_IMPALE_SWING: + case BOTH_A6_SABERPROTECT: + case BOTH_A7_SOULCAL: + case BOTH_A1_SPECIAL: + case BOTH_A2_SPECIAL: + case BOTH_A3_SPECIAL: + case BOTH_ARIAL_LEFT: + case BOTH_ARIAL_RIGHT: + case BOTH_CARTWHEEL_LEFT: + case BOTH_CARTWHEEL_RIGHT: + case BOTH_FLIP_LEFT: + case BOTH_FLIP_BACK1: + case BOTH_FLIP_BACK2: + case BOTH_FLIP_BACK3: + case BOTH_ALORA_FLIP_B: + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + case BOTH_WALL_RUN_RIGHT: + case BOTH_WALL_RUN_RIGHT_FLIP: + case BOTH_WALL_RUN_RIGHT_STOP: + case BOTH_WALL_RUN_LEFT: + case BOTH_WALL_RUN_LEFT_FLIP: + case BOTH_WALL_RUN_LEFT_STOP: + case BOTH_WALL_FLIP_RIGHT: + case BOTH_WALL_FLIP_LEFT: + case BOTH_FORCEJUMP1: + case BOTH_FORCEINAIR1: + case BOTH_FORCELAND1: + case BOTH_FORCEJUMPBACK1: + case BOTH_FORCEINAIRBACK1: + case BOTH_FORCELANDBACK1: + case BOTH_FORCEJUMPLEFT1: + case BOTH_FORCEINAIRLEFT1: + case BOTH_FORCELANDLEFT1: + case BOTH_FORCEJUMPRIGHT1: + case BOTH_FORCEINAIRRIGHT1: + case BOTH_FORCELANDRIGHT1: + case BOTH_FLIP_F: + case BOTH_FLIP_B: + case BOTH_FLIP_L: + case BOTH_FLIP_R: + case BOTH_ALORA_FLIP_1: + case BOTH_ALORA_FLIP_2: + case BOTH_ALORA_FLIP_3: + case BOTH_DODGE_FL: + case BOTH_DODGE_FR: + case BOTH_DODGE_BL: + case BOTH_DODGE_BR: + case BOTH_DODGE_L: + case BOTH_DODGE_R: + case BOTH_DODGE_HOLD_FL: + case BOTH_DODGE_HOLD_FR: + case BOTH_DODGE_HOLD_BL: + case BOTH_DODGE_HOLD_BR: + case BOTH_DODGE_HOLD_L: + case BOTH_DODGE_HOLD_R: + case BOTH_FORCE_GETUP_F1: + case BOTH_FORCE_GETUP_F2: + case BOTH_FORCE_GETUP_B1: + case BOTH_FORCE_GETUP_B2: + case BOTH_FORCE_GETUP_B3: + case BOTH_FORCE_GETUP_B4: + case BOTH_FORCE_GETUP_B5: + case BOTH_FORCE_GETUP_B6: + case BOTH_GETUP_BROLL_B: + case BOTH_GETUP_BROLL_F: + case BOTH_GETUP_BROLL_L: + case BOTH_GETUP_BROLL_R: + case BOTH_GETUP_FROLL_B: + case BOTH_GETUP_FROLL_F: + case BOTH_GETUP_FROLL_L: + case BOTH_GETUP_FROLL_R: + case BOTH_WALL_FLIP_BACK1: + case BOTH_WALL_FLIP_BACK2: + case BOTH_SPIN1: + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + case BOTH_DEFLECTSLASH__R__L_FIN: + case BOTH_ARIAL_F1: + return qtrue; + } + return qfalse; +} + +qboolean G_HasKnockdownAnims( gentity_t *ent ) +{ + if ( PM_HasAnimation( ent, BOTH_KNOCKDOWN1 ) + && PM_HasAnimation( ent, BOTH_KNOCKDOWN2 ) + && PM_HasAnimation( ent, BOTH_KNOCKDOWN3 ) + && PM_HasAnimation( ent, BOTH_KNOCKDOWN4 ) + && PM_HasAnimation( ent, BOTH_KNOCKDOWN5 ) ) + { + return qtrue; + } + return qfalse; +} + +qboolean PM_InAttackRoll( int anim ) +{ + switch ( anim ) + { + case BOTH_GETUP_BROLL_B: + case BOTH_GETUP_BROLL_F: + case BOTH_GETUP_FROLL_B: + case BOTH_GETUP_FROLL_F: + return qtrue; + } + return qfalse; +} + +qboolean PM_LockedAnim( int anim ) +{//anims that can *NEVER* be overridden, regardless + switch ( anim ) + { + case BOTH_KYLE_PA_1: + case BOTH_KYLE_PA_2: + case BOTH_KYLE_PA_3: + case BOTH_PLAYER_PA_1: + case BOTH_PLAYER_PA_2: + case BOTH_PLAYER_PA_3: + case BOTH_PLAYER_PA_3_FLY: + case BOTH_TAVION_SCEPTERGROUND: + case BOTH_TAVION_SWORDPOWER: + case BOTH_SCEPTER_START: + case BOTH_SCEPTER_HOLD: + case BOTH_SCEPTER_STOP: + //grabbed by wampa + case BOTH_GRABBED: //# + case BOTH_RELEASED: //# when Wampa drops player, transitions into fall on back + case BOTH_HANG_IDLE: //# + case BOTH_HANG_ATTACK: //# + case BOTH_HANG_PAIN: //# + return qtrue; + } + return qfalse; +} + +qboolean PM_SuperBreakLoseAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_LK_S_DL_S_SB_1_L: //super break I lost + case BOTH_LK_S_DL_T_SB_1_L: //super break I lost + case BOTH_LK_S_ST_S_SB_1_L: //super break I lost + case BOTH_LK_S_ST_T_SB_1_L: //super break I lost + case BOTH_LK_S_S_S_SB_1_L: //super break I lost + case BOTH_LK_S_S_T_SB_1_L: //super break I lost + case BOTH_LK_DL_DL_S_SB_1_L: //super break I lost + case BOTH_LK_DL_DL_T_SB_1_L: //super break I lost + case BOTH_LK_DL_ST_S_SB_1_L: //super break I lost + case BOTH_LK_DL_ST_T_SB_1_L: //super break I lost + case BOTH_LK_DL_S_S_SB_1_L: //super break I lost + case BOTH_LK_DL_S_T_SB_1_L: //super break I lost + case BOTH_LK_ST_DL_S_SB_1_L: //super break I lost + case BOTH_LK_ST_DL_T_SB_1_L: //super break I lost + case BOTH_LK_ST_ST_S_SB_1_L: //super break I lost + case BOTH_LK_ST_ST_T_SB_1_L: //super break I lost + case BOTH_LK_ST_S_S_SB_1_L: //super break I lost + case BOTH_LK_ST_S_T_SB_1_L: //super break I lost + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_SuperBreakWinAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_LK_S_DL_S_SB_1_W: //super break I won + case BOTH_LK_S_DL_T_SB_1_W: //super break I won + case BOTH_LK_S_ST_S_SB_1_W: //super break I won + case BOTH_LK_S_ST_T_SB_1_W: //super break I won + case BOTH_LK_S_S_S_SB_1_W: //super break I won + case BOTH_LK_S_S_T_SB_1_W: //super break I won + case BOTH_LK_DL_DL_S_SB_1_W: //super break I won + case BOTH_LK_DL_DL_T_SB_1_W: //super break I won + case BOTH_LK_DL_ST_S_SB_1_W: //super break I won + case BOTH_LK_DL_ST_T_SB_1_W: //super break I won + case BOTH_LK_DL_S_S_SB_1_W: //super break I won + case BOTH_LK_DL_S_T_SB_1_W: //super break I won + case BOTH_LK_ST_DL_S_SB_1_W: //super break I won + case BOTH_LK_ST_DL_T_SB_1_W: //super break I won + case BOTH_LK_ST_ST_S_SB_1_W: //super break I won + case BOTH_LK_ST_ST_T_SB_1_W: //super break I won + case BOTH_LK_ST_S_S_SB_1_W: //super break I won + case BOTH_LK_ST_S_T_SB_1_W: //super break I won + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_SaberLockBreakAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_BF1BREAK: + case BOTH_BF2BREAK: + case BOTH_CWCIRCLEBREAK: + case BOTH_CCWCIRCLEBREAK: + case BOTH_LK_S_DL_S_B_1_L: //normal break I lost + case BOTH_LK_S_DL_S_B_1_W: //normal break I won + case BOTH_LK_S_DL_T_B_1_L: //normal break I lost + case BOTH_LK_S_DL_T_B_1_W: //normal break I won + case BOTH_LK_S_ST_S_B_1_L: //normal break I lost + case BOTH_LK_S_ST_S_B_1_W: //normal break I won + case BOTH_LK_S_ST_T_B_1_L: //normal break I lost + case BOTH_LK_S_ST_T_B_1_W: //normal break I won + case BOTH_LK_S_S_S_B_1_L: //normal break I lost + case BOTH_LK_S_S_S_B_1_W: //normal break I won + case BOTH_LK_S_S_T_B_1_L: //normal break I lost + case BOTH_LK_S_S_T_B_1_W: //normal break I won + case BOTH_LK_DL_DL_S_B_1_L: //normal break I lost + case BOTH_LK_DL_DL_S_B_1_W: //normal break I won + case BOTH_LK_DL_DL_T_B_1_L: //normal break I lost + case BOTH_LK_DL_DL_T_B_1_W: //normal break I won + case BOTH_LK_DL_ST_S_B_1_L: //normal break I lost + case BOTH_LK_DL_ST_S_B_1_W: //normal break I won + case BOTH_LK_DL_ST_T_B_1_L: //normal break I lost + case BOTH_LK_DL_ST_T_B_1_W: //normal break I won + case BOTH_LK_DL_S_S_B_1_L: //normal break I lost + case BOTH_LK_DL_S_S_B_1_W: //normal break I won + case BOTH_LK_DL_S_T_B_1_L: //normal break I lost + case BOTH_LK_DL_S_T_B_1_W: //normal break I won + case BOTH_LK_ST_DL_S_B_1_L: //normal break I lost + case BOTH_LK_ST_DL_S_B_1_W: //normal break I won + case BOTH_LK_ST_DL_T_B_1_L: //normal break I lost + case BOTH_LK_ST_DL_T_B_1_W: //normal break I won + case BOTH_LK_ST_ST_S_B_1_L: //normal break I lost + case BOTH_LK_ST_ST_S_B_1_W: //normal break I won + case BOTH_LK_ST_ST_T_B_1_L: //normal break I lost + case BOTH_LK_ST_ST_T_B_1_W: //normal break I won + case BOTH_LK_ST_S_S_B_1_L: //normal break I lost + case BOTH_LK_ST_S_S_B_1_W: //normal break I won + case BOTH_LK_ST_S_T_B_1_L: //normal break I lost + case BOTH_LK_ST_S_T_B_1_W: //normal break I won + return (PM_SuperBreakLoseAnim(anim)||PM_SuperBreakWinAnim(anim)); + break; + } + return qfalse; +} + +qboolean PM_GetupAnimNoMove( int legsAnim ) +{ + switch( legsAnim ) + { + case BOTH_GETUP1: + case BOTH_GETUP2: + case BOTH_GETUP3: + case BOTH_GETUP4: + case BOTH_GETUP5: + case BOTH_GETUP_CROUCH_F1: + case BOTH_GETUP_CROUCH_B1: + case BOTH_FORCE_GETUP_F1: + case BOTH_FORCE_GETUP_F2: + case BOTH_FORCE_GETUP_B1: + case BOTH_FORCE_GETUP_B2: + case BOTH_FORCE_GETUP_B3: + case BOTH_FORCE_GETUP_B4: + case BOTH_FORCE_GETUP_B5: + case BOTH_FORCE_GETUP_B6: + return qtrue; + } + return qfalse; +} + +qboolean PM_KnockDownAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_KNOCKDOWN1: + case BOTH_KNOCKDOWN2: + case BOTH_KNOCKDOWN3: + case BOTH_KNOCKDOWN4: + case BOTH_KNOCKDOWN5: + /* + //special anims: + case BOTH_RELEASED: + case BOTH_LK_DL_ST_T_SB_1_L: + case BOTH_PLAYER_PA_3_FLY: + */ + return qtrue; + break; + /* + default: + return PM_InGetUp( ps ); + break; + */ + } + return qfalse; +} + +qboolean PM_KnockDownAnimExtended( int anim ) +{ + switch ( anim ) + { + case BOTH_KNOCKDOWN1: + case BOTH_KNOCKDOWN2: + case BOTH_KNOCKDOWN3: + case BOTH_KNOCKDOWN4: + case BOTH_KNOCKDOWN5: + //special anims: + case BOTH_RELEASED: + case BOTH_LK_DL_ST_T_SB_1_L: + case BOTH_PLAYER_PA_3_FLY: + return qtrue; + break; + /* + default: + return PM_InGetUp( ps ); + break; + */ + } + return qfalse; +} + +qboolean PM_SaberInKata( saberMoveName_t saberMove ) +{ + switch ( saberMove ) + { + case LS_A1_SPECIAL: + case LS_A2_SPECIAL: + case LS_A3_SPECIAL: + case LS_DUAL_SPIN_PROTECT: + case LS_STAFF_SOULCAL: + return qtrue; + default: + break; + } + return qfalse; +} + +qboolean PM_CanRollFromSoulCal( playerState_t *ps ) +{ + if ( ps->legsAnim == BOTH_A7_SOULCAL + && ps->legsAnimTimer < 700 + && ps->legsAnimTimer > 250 ) + { + return qtrue; + } + return qfalse; +} + +qboolean BG_FullBodyTauntAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_GESTURE1: + case BOTH_DUAL_TAUNT: + case BOTH_STAFF_TAUNT: + case BOTH_BOW: + case BOTH_MEDITATE: + case BOTH_SHOWOFF_FAST: + case BOTH_SHOWOFF_MEDIUM: + case BOTH_SHOWOFF_STRONG: + case BOTH_SHOWOFF_DUAL: + case BOTH_SHOWOFF_STAFF: + case BOTH_VICTORY_FAST: + case BOTH_VICTORY_MEDIUM: + case BOTH_VICTORY_STRONG: + case BOTH_VICTORY_DUAL: + case BOTH_VICTORY_STAFF: + return qtrue; + break; + } + return qfalse; +} diff --git a/code/game/bg_panimate.cpp.REMOTE.8780.cpp b/code/game/bg_panimate.cpp.REMOTE.8780.cpp new file mode 100644 index 0000000000..48b23f04f6 --- /dev/null +++ b/code/game/bg_panimate.cpp.REMOTE.8780.cpp @@ -0,0 +1,7258 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#include "common_headers.h" + + +// define GAME_INCLUDE so that g_public.h does not define the +// short, server-visible gclient_t and gentity_t structures, +// because we define the full size ones in this file +#define GAME_INCLUDE + +#include "../qcommon/q_shared.h" +#include "g_shared.h" +#include "bg_local.h" +#include "../cgame/cg_local.h" +#include "anims.h" +#include "Q3_Interface.h" +#include "g_local.h" +#include "wp_saber.h" +#include "g_vehicles.h" + +extern pmove_t *pm; +extern pml_t pml; +extern cvar_t *g_ICARUSDebug; +extern cvar_t *g_timescale; +extern cvar_t *g_synchSplitAnims; +extern cvar_t *g_AnimWarning; +extern cvar_t *g_noFootSlide; +extern cvar_t *g_noFootSlideRunScale; +extern cvar_t *g_noFootSlideWalkScale; +extern cvar_t *g_saberAnimSpeed; +extern cvar_t *g_saberAutoAim; +extern cvar_t *g_speederControlScheme; +extern cvar_t *g_saberNewControlScheme; + +extern qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f ); +extern void WP_ForcePowerDrain( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); +extern qboolean ValidAnimFileIndex ( int index ); +extern qboolean PM_ControlledByPlayer( void ); +extern qboolean PM_DroidMelee( int npc_class ); +extern qboolean PM_PainAnim( int anim ); +extern qboolean PM_JumpingAnim( int anim ); +extern qboolean PM_FlippingAnim( int anim ); +extern qboolean PM_RollingAnim( int anim ); +extern qboolean PM_SwimmingAnim( int anim ); +extern qboolean PM_InKnockDown( playerState_t *ps ); +extern qboolean PM_InRoll( playerState_t *ps ); +extern qboolean PM_DodgeAnim( int anim ); +extern qboolean PM_InSlopeAnim( int anim ); +extern qboolean PM_ForceAnim( int anim ); +extern qboolean PM_InKnockDownOnGround( playerState_t *ps ); +extern qboolean PM_InSpecialJump( int anim ); +extern qboolean PM_RunningAnim( int anim ); +extern qboolean PM_WalkingAnim( int anim ); +extern qboolean PM_SwimmingAnim( int anim ); +extern qboolean PM_JumpingAnim( int anim ); +extern qboolean PM_SaberStanceAnim( int anim ); +extern qboolean PM_SaberDrawPutawayAnim( int anim ); +extern void PM_SetJumped( float height, qboolean force ); +extern qboolean PM_InGetUpNoRoll( playerState_t *ps ); +extern qboolean PM_CrouchAnim( int anim ); +extern qboolean G_TryingKataAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingCartwheel( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingSpecial( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingJumpAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingJumpForwardAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingLungeAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_TryingPullAttack( gentity_t *self, usercmd_t *cmd, qboolean amPulling ); +extern qboolean G_InCinematicSaberAnim( gentity_t *self ); +extern qboolean G_ControlledByPlayer( gentity_t *self ); + +extern int g_crosshairEntNum; + +int PM_AnimLength( int index, animNumber_t anim ); +qboolean PM_LockedAnim( int anim ); +qboolean PM_StandingAnim( int anim ); +qboolean PM_InOnGroundAnim ( playerState_t *ps ); +qboolean PM_SuperBreakWinAnim( int anim ); +qboolean PM_SuperBreakLoseAnim( int anim ); +qboolean PM_LockedAnim( int anim ); +saberMoveName_t PM_SaberFlipOverAttackMove( void ); +qboolean PM_CheckFlipOverAttackMove( qboolean checkEnemy ); +saberMoveName_t PM_SaberJumpForwardAttackMove( void ); +qboolean PM_CheckJumpForwardAttackMove( void ); +saberMoveName_t PM_SaberBackflipAttackMove( void ); +qboolean PM_CheckBackflipAttackMove( void ); +saberMoveName_t PM_SaberDualJumpAttackMove( void ); +qboolean PM_CheckDualJumpAttackMove( void ); +saberMoveName_t PM_SaberLungeAttackMove( qboolean fallbackToNormalLunge ); +qboolean PM_CheckLungeAttackMove( void ); +// Okay, here lies the much-dreaded Pat-created FSM movement chart... Heretic II strikes again! +// Why am I inflicting this on you? Well, it's better than hardcoded states. +// Ideally this will be replaced with an external file or more sophisticated move-picker +// once the game gets out of prototype stage. + +// Silly, but I'm replacing these macros so they are shorter! +#define AFLAG_IDLE (SETANIM_FLAG_NORMAL) +#define AFLAG_ACTIVE (SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_HOLDLESS) +#define AFLAG_WAIT (SETANIM_FLAG_HOLD | SETANIM_FLAG_HOLDLESS) +#define AFLAG_FINISH (SETANIM_FLAG_HOLD) + +//FIXME: add the alternate anims for each style? +saberMoveData_t saberMoveData[LS_MOVE_MAX] = {// NB:randomized + // name anim(do all styles?)startQ endQ setanimflag blend, blocking chain_idle chain_attack trailLen + {"None", BOTH_STAND1, Q_R, Q_R, AFLAG_IDLE, 350, BLK_NO, LS_NONE, LS_NONE, 0 }, // LS_NONE = 0, + + // General movements with saber + {"Ready", BOTH_STAND2, Q_R, Q_R, AFLAG_IDLE, 350, BLK_WIDE, LS_READY, LS_S_R2L, 0 }, // LS_READY, + {"Draw", BOTH_STAND1TO2, Q_R, Q_R, AFLAG_FINISH, 350, BLK_NO, LS_READY, LS_S_R2L, 0 }, // LS_DRAW, + {"Putaway", BOTH_STAND2TO1, Q_R, Q_R, AFLAG_FINISH, 350, BLK_NO, LS_READY, LS_S_R2L, 0 }, // LS_PUTAWAY, + + // Attacks + //UL2LR + {"TL2BR Att", BOTH_A1_TL_BR, Q_TL, Q_BR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_TL2BR, LS_R_TL2BR, 200 }, // LS_A_TL2BR + //SLASH LEFT + {"L2R Att", BOTH_A1__L__R, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_L2R, LS_R_L2R, 200 }, // LS_A_L2R + //LL2UR + {"BL2TR Att", BOTH_A1_BL_TR, Q_BL, Q_TR, AFLAG_ACTIVE, 50, BLK_TIGHT, LS_R_BL2TR, LS_R_BL2TR, 200 }, // LS_A_BL2TR + //LR2UL + {"BR2TL Att", BOTH_A1_BR_TL, Q_BR, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_BR2TL, LS_R_BR2TL, 200 }, // LS_A_BR2TL + //SLASH RIGHT + {"R2L Att", BOTH_A1__R__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_R2L, LS_R_R2L, 200 },// LS_A_R2L + //UR2LL + {"TR2BL Att", BOTH_A1_TR_BL, Q_TR, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_TR2BL, LS_R_TR2BL, 200 }, // LS_A_TR2BL + //SLASH DOWN + {"T2B Att", BOTH_A1_T__B_, Q_T, Q_B, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_R_T2B, LS_R_T2B, 200 }, // LS_A_T2B + //special attacks + {"Back Stab", BOTH_A2_STABBACK1, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACKSTAB + {"Back Att", BOTH_ATTACK_BACK, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACK + {"CR Back Att", BOTH_CROUCHATTACKBACK1,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_BACK_CR + {"RollStab", BOTH_ROLL_STAB, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_ROLL_STAB + {"Lunge Att", BOTH_LUNGE2_B__T_, Q_B, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_LUNGE + {"Jump Att", BOTH_FORCELEAP2_T__B_,Q_T, Q_B, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_A_JUMP_T__B_ + {"Flip Stab", BOTH_JUMPFLIPSTABDOWN,Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_T___R, 200 }, // LS_A_FLIP_STAB + {"Flip Slash", BOTH_JUMPFLIPSLASHDOWN1,Q_L,Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R_T_, 200 }, // LS_A_FLIP_SLASH + {"DualJump Atk",BOTH_JUMPATTACK6, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_BL_TR, 200 }, // LS_JUMPATTACK_DUAL + + {"DualJumpAtkL_A",BOTH_ARIAL_LEFT, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_A_TL2BR, 200 }, // LS_JUMPATTACK_ARIAL_LEFT + {"DualJumpAtkR_A",BOTH_ARIAL_RIGHT, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_A_TR2BL, 200 }, // LS_JUMPATTACK_ARIAL_RIGHT + + {"DualJumpAtkL_A",BOTH_CARTWHEEL_LEFT, Q_R,Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_TL_BR, 200 }, // LS_JUMPATTACK_CART_LEFT + {"DualJumpAtkR_A",BOTH_CARTWHEEL_RIGHT, Q_R,Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_TR_BL, 200 }, // LS_JUMPATTACK_CART_RIGHT + + {"DualJumpAtkLStaff", BOTH_BUTTERFLY_FL1,Q_R,Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__L__R, 200 }, // LS_JUMPATTACK_STAFF_LEFT + {"DualJumpAtkRStaff", BOTH_BUTTERFLY_FR1,Q_R,Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R__L, 200 }, // LS_JUMPATTACK_STAFF_RIGHT + + {"ButterflyLeft", BOTH_BUTTERFLY_LEFT,Q_R,Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__L__R, 200 }, // LS_BUTTERFLY_LEFT + {"ButterflyRight", BOTH_BUTTERFLY_RIGHT,Q_R,Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1__R__L, 200 }, // LS_BUTTERFLY_RIGHT + + {"BkFlip Atk", BOTH_JUMPATTACK7, Q_B, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_T1_T___R, 200 }, // LS_A_BACKFLIP_ATK + {"DualSpinAtk", BOTH_SPINATTACK6, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK_DUAL + {"StfSpinAtk", BOTH_SPINATTACK7, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK + {"LngLeapAtk", BOTH_FORCELONGLEAP_ATTACK,Q_R,Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_LEAP_ATTACK + {"SwoopAtkR", BOTH_VS_ATR_S, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 200 }, // LS_SWOOP_ATTACK_RIGHT + {"SwoopAtkL", BOTH_VS_ATL_S, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 200 }, // LS_SWOOP_ATTACK_LEFT + {"TauntaunAtkR",BOTH_VT_ATR_S, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_TAUNTAUN_ATTACK_RIGHT + {"TauntaunAtkL",BOTH_VT_ATL_S, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_TAUNTAUN_ATTACK_LEFT + {"StfKickFwd", BOTH_A7_KICK_F, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_F + {"StfKickBack", BOTH_A7_KICK_B, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_B + {"StfKickRight",BOTH_A7_KICK_R, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_R + {"StfKickLeft", BOTH_A7_KICK_L, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_L + {"StfKickSpin", BOTH_A7_KICK_S, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_S + {"StfKickBkFwd",BOTH_A7_KICK_BF, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_BF + {"StfKickSplit",BOTH_A7_KICK_RL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_S_R2L, 200 }, // LS_KICK_RL + {"StfKickFwdAir",BOTH_A7_KICK_F_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_F_AIR + {"StfKickBackAir",BOTH_A7_KICK_B_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_B_AIR + {"StfKickRightAir",BOTH_A7_KICK_R_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_R_AIR + {"StfKickLeftAir",BOTH_A7_KICK_L_AIR,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_KICK_L_AIR + {"StabDown", BOTH_STABDOWN, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN + {"StabDownStf", BOTH_STABDOWN_STAFF,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN_STAFF + {"StabDownDual",BOTH_STABDOWN_DUAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_S_R2L, 200 }, // LS_STABDOWN_DUAL + {"dualspinprot",BOTH_A6_SABERPROTECT,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 500 }, // LS_DUAL_SPIN_PROTECT + {"StfSoulCal", BOTH_A7_SOULCAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 500 }, // LS_STAFF_SOULCAL + {"specialfast", BOTH_A1_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000}, // LS_A1_SPECIAL + {"specialmed", BOTH_A2_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000}, // LS_A2_SPECIAL + {"specialstr", BOTH_A3_SPECIAL, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 2000}, // LS_A3_SPECIAL + {"upsidedwnatk",BOTH_FLIP_ATTACK7, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200}, // LS_UPSIDE_DOWN_ATTACK + {"pullatkstab", BOTH_PULL_IMPALE_STAB,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200}, // LS_PULL_ATTACK_STAB + {"pullatkswing",BOTH_PULL_IMPALE_SWING,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200}, // LS_PULL_ATTACK_SWING + {"AloraSpinAtk",BOTH_ALORA_SPIN_SLASH,Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_SPINATTACK_ALORA + {"Dual FB Atk", BOTH_A6_FB, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_DUAL_FB + {"Dual LR Atk", BOTH_A6_LR, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_DUAL_LR + {"StfHiltBash", BOTH_A7_HILT, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_HILT_BASH + + //starts + {"TL2BR St", BOTH_S1_S1_TL, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_TL2BR, LS_A_TL2BR, 200 }, // LS_S_TL2BR + {"L2R St", BOTH_S1_S1__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_L2R, LS_A_L2R, 200 }, // LS_S_L2R + {"BL2TR St", BOTH_S1_S1_BL, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_BL2TR, LS_A_BL2TR, 200 }, // LS_S_BL2TR + {"BR2TL St", BOTH_S1_S1_BR, Q_R, Q_BR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_BR2TL, LS_A_BR2TL, 200 }, // LS_S_BR2TL + {"R2L St", BOTH_S1_S1__R, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_R2L, LS_A_R2L, 200 }, // LS_S_R2L + {"TR2BL St", BOTH_S1_S1_TR, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_TR2BL, LS_A_TR2BL, 200 }, // LS_S_TR2BL + {"T2B St", BOTH_S1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_T2B, LS_A_T2B, 200 }, // LS_S_T2B + + //returns + {"TL2BR Ret", BOTH_R1_BR_S1, Q_BR, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_TL2BR + {"L2R Ret", BOTH_R1__R_S1, Q_R, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_L2R + {"BL2TR Ret", BOTH_R1_TR_S1, Q_TR, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_BL2TR + {"BR2TL Ret", BOTH_R1_TL_S1, Q_TL, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_BR2TL + {"R2L Ret", BOTH_R1__L_S1, Q_L, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_R2L + {"TR2BL Ret", BOTH_R1_BL_S1, Q_BL, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_TR2BL + {"T2B Ret", BOTH_R1_B__S1, Q_B, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_T2B + + //Transitions + {"BR2R Trans", BOTH_T1_BR__R, Q_BR, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc bottom right to right + {"BR2TR Trans", BOTH_T1_BR_TR, Q_BR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc bottom right to top right (use: BOTH_T1_TR_BR) + {"BR2T Trans", BOTH_T1_BR_T_, Q_BR, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc bottom right to top (use: BOTH_T1_T__BR) + {"BR2TL Trans", BOTH_T1_BR_TL, Q_BR, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast weak spin bottom right to top left + {"BR2L Trans", BOTH_T1_BR__L, Q_BR, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast weak spin bottom right to left + {"BR2BL Trans", BOTH_T1_BR_BL, Q_BR, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin bottom right to bottom left + {"R2BR Trans", BOTH_T1__R_BR, Q_R, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc right to bottom right (use: BOTH_T1_BR__R) + {"R2TR Trans", BOTH_T1__R_TR, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc right to top right + {"R2T Trans", BOTH_T1__R_T_, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast ar right to top (use: BOTH_T1_T___R) + {"R2TL Trans", BOTH_T1__R_TL, Q_R, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc right to top left + {"R2L Trans", BOTH_T1__R__L, Q_R, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast weak spin right to left + {"R2BL Trans", BOTH_T1__R_BL, Q_R, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin right to bottom left + {"TR2BR Trans", BOTH_T1_TR_BR, Q_TR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc top right to bottom right + {"TR2R Trans", BOTH_T1_TR__R, Q_TR, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top right to right (use: BOTH_T1__R_TR) + {"TR2T Trans", BOTH_T1_TR_T_, Q_TR, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc top right to top (use: BOTH_T1_T__TR) + {"TR2TL Trans", BOTH_T1_TR_TL, Q_TR, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc top right to top left + {"TR2L Trans", BOTH_T1_TR__L, Q_TR, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top right to left + {"TR2BL Trans", BOTH_T1_TR_BL, Q_TR, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast weak spin top right to bottom left + {"T2BR Trans", BOTH_T1_T__BR, Q_T, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast arc top to bottom right + {"T2R Trans", BOTH_T1_T___R, Q_T, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top to right + {"T2TR Trans", BOTH_T1_T__TR, Q_T, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc top to top right + {"T2TL Trans", BOTH_T1_T__TL, Q_T, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc top to top left + {"T2L Trans", BOTH_T1_T___L, Q_T, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top to left + {"T2BL Trans", BOTH_T1_T__BL, Q_T, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc top to bottom left + {"TL2BR Trans", BOTH_T1_TL_BR, Q_TL, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin top left to bottom right + {"TL2R Trans", BOTH_T1_TL__R, Q_TL, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast arc top left to right (use: BOTH_T1__R_TL) + {"TL2TR Trans", BOTH_T1_TL_TR, Q_TL, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc top left to top right (use: BOTH_T1_TR_TL) + {"TL2T Trans", BOTH_T1_TL_T_, Q_TL, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc top left to top (use: BOTH_T1_T__TL) + {"TL2L Trans", BOTH_T1_TL__L, Q_TL, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc top left to left (use: BOTH_T1__L_TL) + {"TL2BL Trans", BOTH_T1_TL_BL, Q_TL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc top left to bottom left + {"L2BR Trans", BOTH_T1__L_BR, Q_L, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin left to bottom right + {"L2R Trans", BOTH_T1__L__R, Q_L, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast weak spin left to right + {"L2TR Trans", BOTH_T1__L_TR, Q_L, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast arc left to top right (use: BOTH_T1_TR__L) + {"L2T Trans", BOTH_T1__L_T_, Q_L, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc left to top (use: BOTH_T1_T___L) + {"L2TL Trans", BOTH_T1__L_TL, Q_L, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc left to top left + {"L2BL Trans", BOTH_T1__L_BL, Q_L, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_A_BL2TR, 150 }, //# Fast arc left to bottom left (use: BOTH_T1_BL__L) + {"BL2BR Trans", BOTH_T1_BL_BR, Q_BL, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_A_BR2TL, 150 }, //# Fast weak spin bottom left to bottom right + {"BL2R Trans", BOTH_T1_BL__R, Q_BL, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_A_R2L, 150 }, //# Fast weak spin bottom left to right + {"BL2TR Trans", BOTH_T1_BL_TR, Q_BL, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_TR2BL, 150 }, //# Fast weak spin bottom left to top right + {"BL2T Trans", BOTH_T1_BL_T_, Q_BL, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_A_T2B, 150 }, //# Fast arc bottom left to top (use: BOTH_T1_T__BL) + {"BL2TL Trans", BOTH_T1_BL_TL, Q_BL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_A_TL2BR, 150 }, //# Fast arc bottom left to top left (use: BOTH_T1_TL_BL) + {"BL2L Trans", BOTH_T1_BL__L, Q_BL, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc bottom left to left + + //Bounces + {"Bounce BR", BOTH_B1_BR___, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_T1_BR_TR, 150 }, + {"Bounce R", BOTH_B1__R___, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_T1__R__L, 150 }, + {"Bounce TR", BOTH_B1_TR___, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_TR_TL, 150 }, + {"Bounce T", BOTH_B1_T____, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + {"Bounce TL", BOTH_B1_TL___, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_T1_TL_TR, 150 }, + {"Bounce L", BOTH_B1__L___, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_T1__L__R, 150 }, + {"Bounce BL", BOTH_B1_BL___, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_T1_BL_TR, 150 }, + + //Deflected attacks (like bounces, but slide off enemy saber, not straight back) + {"Deflect BR", BOTH_D1_BR___, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_T1_BR_TR, 150 }, + {"Deflect R", BOTH_D1__R___, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_T1__R__L, 150 }, + {"Deflect TR", BOTH_D1_TR___, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_TR_TL, 150 }, + {"Deflect T", BOTH_B1_T____, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + {"Deflect TL", BOTH_D1_TL___, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_T1_TL_TR, 150 }, + {"Deflect L", BOTH_D1__L___, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_T1__L__R, 150 }, + {"Deflect BL", BOTH_D1_BL___, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_T1_BL_TR, 150 }, + {"Deflect B", BOTH_D1_B____, Q_B, Q_B, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + + //Reflected attacks + {"Reflected BR",BOTH_V1_BR_S1, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_BR + {"Reflected R", BOTH_V1__R_S1, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1__R + {"Reflected TR",BOTH_V1_TR_S1, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_TR + {"Reflected T", BOTH_V1_T__S1, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_T_ + {"Reflected TL",BOTH_V1_TL_S1, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_TL + {"Reflected L", BOTH_V1__L_S1, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1__L + {"Reflected BL",BOTH_V1_BL_S1, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_BL + {"Reflected B", BOTH_V1_B__S1, Q_B, Q_B, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_B_ + + // Broken parries + {"BParry Top", BOTH_H1_S1_T_, Q_T, Q_B, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UP, + {"BParry UR", BOTH_H1_S1_TR, Q_TR, Q_BL, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UR, + {"BParry UL", BOTH_H1_S1_TL, Q_TL, Q_BR, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_UL, + {"BParry LR", BOTH_H1_S1_BL, Q_BL, Q_TR, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LR, + {"BParry Bot", BOTH_H1_S1_B_, Q_B, Q_T, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LL + {"BParry LL", BOTH_H1_S1_BR, Q_BR, Q_TL, AFLAG_ACTIVE, 50, BLK_NO, LS_READY, LS_READY, 150 }, // LS_PARRY_LL + + // Knockaways + {"Knock Top", BOTH_K1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_T1_T__BR, 150 }, // LS_PARRY_UP, + {"Knock UR", BOTH_K1_S1_TR, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_T1_TR__R, 150 }, // LS_PARRY_UR, + {"Knock UL", BOTH_K1_S1_TL, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_T1_TL__L, 150 }, // LS_PARRY_UL, + {"Knock LR", BOTH_K1_S1_BL, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_T1_BL_TL, 150 }, // LS_PARRY_LR, + {"Knock LL", BOTH_K1_S1_BR, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_T1_BR_TR, 150 }, // LS_PARRY_LL + + // Parry + {"Parry Top", BOTH_P1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_T2B, 150 }, // LS_PARRY_UP, + {"Parry UR", BOTH_P1_S1_TR, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_TR2BL, 150 }, // LS_PARRY_UR, + {"Parry UL", BOTH_P1_S1_TL, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_A_TL2BR, 150 }, // LS_PARRY_UL, + {"Parry LR", BOTH_P1_S1_BL, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_A_BR2TL, 150 }, // LS_PARRY_LR, + {"Parry LL", BOTH_P1_S1_BR, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_A_BL2TR, 150 }, // LS_PARRY_LL + + // Reflecting a missile + {"Reflect Top", BOTH_P1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_T2B, 300 }, // LS_PARRY_UP, + {"Reflect UR", BOTH_P1_S1_TL, Q_R, Q_TR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BR2TL, LS_A_TL2BR, 300 }, // LS_PARRY_UR, + {"Reflect UL", BOTH_P1_S1_TR, Q_R, Q_TL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_BL2TR, LS_A_TR2BL, 300 }, // LS_PARRY_UL, + {"Reflect LR", BOTH_P1_S1_BR, Q_R, Q_BL, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TR2BL, LS_A_BL2TR, 300 }, // LS_PARRY_LR + {"Reflect LL", BOTH_P1_S1_BL, Q_R, Q_BR, AFLAG_ACTIVE, 50, BLK_WIDE, LS_R_TL2BR, LS_A_BR2TL, 300 }, // LS_PARRY_LL, +}; + + +saberMoveName_t transitionMove[Q_NUM_QUADS][Q_NUM_QUADS] = +{ + { + LS_NONE, //Can't transition to same pos! + LS_T1_BR__R,//40 + LS_T1_BR_TR, + LS_T1_BR_T_, + LS_T1_BR_TL, + LS_T1_BR__L, + LS_T1_BR_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1__R_BR,//46 + LS_NONE, //Can't transition to same pos! + LS_T1__R_TR, + LS_T1__R_T_, + LS_T1__R_TL, + LS_T1__R__L, + LS_T1__R_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_TR_BR,//52 + LS_T1_TR__R, + LS_NONE, //Can't transition to same pos! + LS_T1_TR_T_, + LS_T1_TR_TL, + LS_T1_TR__L, + LS_T1_TR_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_T__BR,//58 + LS_T1_T___R, + LS_T1_T__TR, + LS_NONE, //Can't transition to same pos! + LS_T1_T__TL, + LS_T1_T___L, + LS_T1_T__BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_TL_BR,//64 + LS_T1_TL__R, + LS_T1_TL_TR, + LS_T1_TL_T_, + LS_NONE, //Can't transition to same pos! + LS_T1_TL__L, + LS_T1_TL_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1__L_BR,//70 + LS_T1__L__R, + LS_T1__L_TR, + LS_T1__L_T_, + LS_T1__L_TL, + LS_NONE, //Can't transition to same pos! + LS_T1__L_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_BL_BR,//76 + LS_T1_BL__R, + LS_T1_BL_TR, + LS_T1_BL_T_, + LS_T1_BL_TL, + LS_T1_BL__L, + LS_NONE, //Can't transition to same pos! + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + }, + { + LS_T1_BL_BR,//NOTE: there are no transitions from bottom, so re-use the bottom right transitions + LS_T1_BR__R, + LS_T1_BR_TR, + LS_T1_BR_T_, + LS_T1_BR_TL, + LS_T1_BR__L, + LS_T1_BR_BL, + LS_NONE //No transitions to bottom, and no anims start there, so shouldn't need any + } +}; + +void PM_VelocityForSaberMove( playerState_t *ps, vec3_t throwDir ) +{ + vec3_t vForward = { 0.0f }, vRight = { 0.0f }, vUp = { 0.0f }, startQ = { 0.0f }, endQ = { 0.0f }; + + AngleVectors( ps->viewangles, vForward, vRight, vUp ); + + switch ( saberMoveData[ps->saberMove].startQuad ) + { + case Q_BR: + VectorScale( vRight, 1, startQ ); + VectorMA( startQ, -1, vUp, startQ ); + break; + case Q_R: + VectorScale( vRight, 2, startQ ); + break; + case Q_TR: + VectorScale( vRight, 1, startQ ); + VectorMA( startQ, 1, vUp, startQ ); + break; + case Q_T: + VectorScale( vUp, 2, startQ ); + break; + case Q_TL: + VectorScale( vRight, -1, startQ ); + VectorMA( startQ, 1, vUp, startQ ); + break; + case Q_L: + VectorScale( vRight, -2, startQ ); + break; + case Q_BL: + VectorScale( vRight, -1, startQ ); + VectorMA( startQ, -1, vUp, startQ ); + break; + case Q_B: + VectorScale( vUp, -2, startQ ); + break; + } + switch ( saberMoveData[ps->saberMove].endQuad ) + { + case Q_BR: + VectorScale( vRight, 1, endQ ); + VectorMA( endQ, -1, vUp, endQ ); + break; + case Q_R: + VectorScale( vRight, 2, endQ ); + break; + case Q_TR: + VectorScale( vRight, 1, endQ ); + VectorMA( endQ, 1, vUp, endQ ); + break; + case Q_T: + VectorScale( vUp, 2, endQ ); + break; + case Q_TL: + VectorScale( vRight, -1, endQ ); + VectorMA( endQ, 1, vUp, endQ ); + break; + case Q_L: + VectorScale( vRight, -2, endQ ); + break; + case Q_BL: + VectorScale( vRight, -1, endQ ); + VectorMA( endQ, -1, vUp, endQ ); + break; + case Q_B: + VectorScale( vUp, -2, endQ ); + break; + } + VectorMA( endQ, 2, vForward, endQ ); + VectorScale( throwDir, 125, throwDir );//FIXME: pass in the throw strength? + VectorSubtract( endQ, startQ, throwDir ); +} + +qboolean PM_VelocityForBlockedMove( playerState_t *ps, vec3_t throwDir ) +{ + vec3_t vForward, vRight, vUp; + AngleVectors( ps->viewangles, vForward, vRight, vUp ); + switch ( ps->saberBlocked ) + { + case BLOCKED_UPPER_RIGHT: + VectorScale( vRight, 1, throwDir ); + VectorMA( throwDir, 1, vUp, throwDir ); + break; + case BLOCKED_UPPER_LEFT: + VectorScale( vRight, -1, throwDir ); + VectorMA( throwDir, 1, vUp, throwDir ); + break; + case BLOCKED_LOWER_RIGHT: + VectorScale( vRight, 1, throwDir ); + VectorMA( throwDir, -1, vUp, throwDir ); + break; + case BLOCKED_LOWER_LEFT: + VectorScale( vRight, -1, throwDir ); + VectorMA( throwDir, -1, vUp, throwDir ); + break; + case BLOCKED_TOP: + VectorScale( vUp, 2, throwDir ); + break; + default: + return qfalse; + break; + } + VectorMA( throwDir, 2, vForward, throwDir ); + VectorScale( throwDir, 250, throwDir );//FIXME: pass in the throw strength? + return qtrue; +} + +int PM_AnimLevelForSaberAnim( int anim ) +{ + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_D1_B____ ) + { + return FORCE_LEVEL_1; + } + if ( anim >= BOTH_A2_T__B_ && anim <= BOTH_D2_B____ ) + { + return FORCE_LEVEL_2; + } + if ( anim >= BOTH_A3_T__B_ && anim <= BOTH_D3_B____ ) + { + return FORCE_LEVEL_3; + } + if ( anim >= BOTH_A4_T__B_ && anim <= BOTH_D4_B____ ) + {//desann + return FORCE_LEVEL_4; + } + if ( anim >= BOTH_A5_T__B_ && anim <= BOTH_D5_B____ ) + {//tavion + return FORCE_LEVEL_5; + } + if ( anim >= BOTH_A6_T__B_ && anim <= BOTH_D6_B____ ) + {//dual + return SS_DUAL; + } + if ( anim >= BOTH_A7_T__B_ && anim <= BOTH_D7_B____ ) + {//staff + return SS_STAFF; + } + return FORCE_LEVEL_0; +} + +int PM_PowerLevelForSaberAnim( playerState_t *ps, int saberNum ) +{ + int anim = ps->torsoAnim; + int animTimeElapsed = PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)anim ) - ps->torsoAnimTimer; + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_D1_B____ ) + { + //FIXME: these two need their own style + if ( ps->saber[0].type == SABER_LANCE ) + { + return FORCE_LEVEL_4; + } + else if ( ps->saber[0].type == SABER_TRIDENT ) + { + return FORCE_LEVEL_3; + } + return FORCE_LEVEL_1; + } + if ( anim >= BOTH_A2_T__B_ && anim <= BOTH_D2_B____ ) + { + return FORCE_LEVEL_2; + } + if ( anim >= BOTH_A3_T__B_ && anim <= BOTH_D3_B____ ) + { + return FORCE_LEVEL_3; + } + if ( anim >= BOTH_A4_T__B_ && anim <= BOTH_D4_B____ ) + {//desann + return FORCE_LEVEL_4; + } + if ( anim >= BOTH_A5_T__B_ && anim <= BOTH_D5_B____ ) + {//tavion + return FORCE_LEVEL_2; + } + if ( anim >= BOTH_A6_T__B_ && anim <= BOTH_D6_B____ ) + {//dual + return FORCE_LEVEL_2; + } + if ( anim >= BOTH_A7_T__B_ && anim <= BOTH_D7_B____ ) + {//staff + return FORCE_LEVEL_2; + } + if ( ( anim >= BOTH_P1_S1_T_ && anim <= BOTH_P1_S1_BR ) + || ( anim >= BOTH_P6_S6_T_ && anim <= BOTH_P6_S6_BR ) + || ( anim >= BOTH_P7_S7_T_ && anim <= BOTH_P7_S7_BR ) ) + {//parries + switch ( ps->saberAnimLevel ) + { + case SS_STRONG: + case SS_DESANN: + return FORCE_LEVEL_3; + break; + case SS_TAVION: + case SS_STAFF: + case SS_DUAL: + case SS_MEDIUM: + return FORCE_LEVEL_2; + break; + case SS_FAST: + return FORCE_LEVEL_1; + break; + default: + return FORCE_LEVEL_0; + break; + } + } + if ( ( anim >= BOTH_K1_S1_T_ && anim <= BOTH_K1_S1_BR ) + || ( anim >= BOTH_K6_S6_T_ && anim <= BOTH_K6_S6_BR ) + || ( anim >= BOTH_K7_S7_T_ && anim <= BOTH_K7_S7_BR ) ) + {//knockaways + return FORCE_LEVEL_3; + } + if ( ( anim >= BOTH_V1_BR_S1 && anim <= BOTH_V1_B__S1 ) + || ( anim >= BOTH_V6_BR_S6 && anim <= BOTH_V6_B__S6 ) + || ( anim >= BOTH_V7_BR_S7 && anim <= BOTH_V7_B__S7 ) ) + {//knocked-away attacks + return FORCE_LEVEL_1; + } + if ( ( anim >= BOTH_H1_S1_T_ && anim <= BOTH_H1_S1_BR ) + || ( anim >= BOTH_H6_S6_T_ && anim <= BOTH_H6_S6_BR ) + || ( anim >= BOTH_H7_S7_T_ && anim <= BOTH_H7_S7_BR ) ) + {//broken parries + return FORCE_LEVEL_0; + } + switch ( anim ) + { + case BOTH_A2_STABBACK1: + if ( ps->torsoAnimTimer < 450 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 400 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_ATTACK_BACK: + if ( ps->torsoAnimTimer < 500 ) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_CROUCHATTACKBACK1: + if ( ps->torsoAnimTimer < 800 ) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + //FIXME: break up? + return FORCE_LEVEL_3; + break; + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + //FIXME: break up? + return FORCE_LEVEL_3; + break; + case BOTH_K1_S1_T_: //# knockaway saber top + case BOTH_K1_S1_TR: //# knockaway saber top right + case BOTH_K1_S1_TL: //# knockaway saber top left + case BOTH_K1_S1_BL: //# knockaway saber bottom left + case BOTH_K1_S1_B_: //# knockaway saber bottom + case BOTH_K1_S1_BR: //# knockaway saber bottom right + //FIXME: break up? + return FORCE_LEVEL_3; + break; + case BOTH_LUNGE2_B__T_: + if ( ps->torsoAnimTimer < 400 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 150 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_FORCELEAP2_T__B_: + if ( ps->torsoAnimTimer < 400 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 550 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + return FORCE_LEVEL_3;//??? + break; + case BOTH_JUMPFLIPSLASHDOWN1: + if ( ps->torsoAnimTimer <= 900 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 550 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_JUMPFLIPSTABDOWN: + if ( ps->torsoAnimTimer <= 1200 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed <= 250 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_JUMPATTACK6: + /* + if (pm->ps) + { + if ( ( pm->ps->legsAnimTimer >= 1450 + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 400 ) + ||(pm->ps->legsAnimTimer >= 400 + && PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, BOTH_JUMPATTACK6 ) - pm->ps->legsAnimTimer >= 1100 ) ) + {//pretty much sideways + return FORCE_LEVEL_3; + } + } + */ + if ( ( ps->torsoAnimTimer >= 1450 + && animTimeElapsed >= 400 ) + ||(ps->torsoAnimTimer >= 400 + && animTimeElapsed >= 1100 ) ) + {//pretty much sideways + return FORCE_LEVEL_3; + } + return FORCE_LEVEL_0; + break; + case BOTH_JUMPATTACK7: + if ( ps->torsoAnimTimer <= 1200 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 200 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_SPINATTACK6: + if ( animTimeElapsed <= 200 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_SPINATTACK7: + if ( ps->torsoAnimTimer <= 500 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 500 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_FORCELONGLEAP_ATTACK: + if ( animTimeElapsed <= 200 ) + {//1st four frames of anim + return FORCE_LEVEL_3; + } + break; + /* + case BOTH_A7_KICK_F://these kicks attack, too + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + //FIXME: break up + return FORCE_LEVEL_3; + break; + */ + case BOTH_STABDOWN: + if ( ps->torsoAnimTimer <= 900 ) + {//end of anim + return FORCE_LEVEL_3; + } + break; + case BOTH_STABDOWN_STAFF: + if ( ps->torsoAnimTimer <= 850 ) + {//end of anim + return FORCE_LEVEL_3; + } + break; + case BOTH_STABDOWN_DUAL: + if ( ps->torsoAnimTimer <= 900 ) + {//end of anim + return FORCE_LEVEL_3; + } + break; + case BOTH_A6_SABERPROTECT: + if ( ps->torsoAnimTimer < 650 ) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A7_SOULCAL: + if ( ps->torsoAnimTimer < 650 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 600 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A1_SPECIAL: + if ( ps->torsoAnimTimer < 600 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 200 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A2_SPECIAL: + if ( ps->torsoAnimTimer < 300 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 200 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A3_SPECIAL: + if ( ps->torsoAnimTimer < 700 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 200 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_FLIP_ATTACK7: + return FORCE_LEVEL_3; + break; + case BOTH_PULL_IMPALE_STAB: + if ( ps->torsoAnimTimer < 1000 ) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_PULL_IMPALE_SWING: + if ( ps->torsoAnimTimer < 500 )//750 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 650 )//600 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_ALORA_SPIN_SLASH: + if ( ps->torsoAnimTimer < 900 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 250 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A6_FB: + if ( ps->torsoAnimTimer < 250 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 250 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A6_LR: + if ( ps->torsoAnimTimer < 250 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 250 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_3; + break; + case BOTH_A7_HILT: + return FORCE_LEVEL_0; + break; +//===SABERLOCK SUPERBREAKS START=========================================================================== + case BOTH_LK_S_DL_T_SB_1_W: + if ( ps->torsoAnimTimer < 700 ) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_ST_S_SB_1_W: + if ( ps->torsoAnimTimer < 300 ) + {//end of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + if ( ps->torsoAnimTimer < 700 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 400 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + if ( ps->torsoAnimTimer < 150 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 400 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_DL_T_SB_1_W: + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + if ( animTimeElapsed < 1000 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_ST_T_SB_1_W: + if ( ps->torsoAnimTimer < 950 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 650 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_S_S_SB_1_W: + if ( saberNum != 0 ) + {//only right hand saber does damage in this suberbreak + return FORCE_LEVEL_0; + } + if ( ps->torsoAnimTimer < 900 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 450 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_DL_S_T_SB_1_W: + if ( saberNum != 0 ) + {//only right hand saber does damage in this suberbreak + return FORCE_LEVEL_0; + } + if ( ps->torsoAnimTimer < 250 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 150 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_DL_S_SB_1_W: + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_DL_T_SB_1_W: + //special suberbreak - doesn't kill, just kicks them backwards + return FORCE_LEVEL_0; + break; + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + if ( ps->torsoAnimTimer < 800 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 350 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + return FORCE_LEVEL_5; + break; + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + return FORCE_LEVEL_5; + break; +//===SABERLOCK SUPERBREAKS START=========================================================================== + case BOTH_HANG_ATTACK: + //FIME: break up + if ( ps->torsoAnimTimer < 1000 ) + {//end of anim + return FORCE_LEVEL_0; + } + else if ( animTimeElapsed < 250 ) + {//beginning of anim + return FORCE_LEVEL_0; + } + else + {//sweet spot + return FORCE_LEVEL_5; + } + break; + case BOTH_ROLL_STAB: + if ( animTimeElapsed > 400 ) + {//end of anim + return FORCE_LEVEL_0; + } + else + { + return FORCE_LEVEL_3; + } + break; + } + return FORCE_LEVEL_0; +} + +qboolean PM_InAnimForSaberMove( int anim, int saberMove ) +{ + switch ( anim ) + {//special case anims + case BOTH_A2_STABBACK1: + case BOTH_ATTACK_BACK: + case BOTH_CROUCHATTACKBACK1: + case BOTH_ROLL_STAB: + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + case BOTH_LUNGE2_B__T_: + case BOTH_FORCELEAP2_T__B_: + case BOTH_JUMPFLIPSLASHDOWN1://# + case BOTH_JUMPFLIPSTABDOWN://# + case BOTH_JUMPATTACK6: + case BOTH_JUMPATTACK7: + case BOTH_SPINATTACK6: + case BOTH_SPINATTACK7: + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + case BOTH_FORCELONGLEAP_ATTACK: + case BOTH_A7_KICK_F: + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + case BOTH_A7_KICK_S: + case BOTH_A7_KICK_BF: + case BOTH_A7_KICK_RL: + case BOTH_A7_KICK_F_AIR: + case BOTH_A7_KICK_B_AIR: + case BOTH_A7_KICK_R_AIR: + case BOTH_A7_KICK_L_AIR: + case BOTH_STABDOWN: + case BOTH_STABDOWN_STAFF: + case BOTH_STABDOWN_DUAL: + case BOTH_A6_SABERPROTECT: + case BOTH_A7_SOULCAL: + case BOTH_A1_SPECIAL: + case BOTH_A2_SPECIAL: + case BOTH_A3_SPECIAL: + case BOTH_FLIP_ATTACK7: + case BOTH_PULL_IMPALE_STAB: + case BOTH_PULL_IMPALE_SWING: + case BOTH_ALORA_SPIN_SLASH: + case BOTH_A6_FB: + case BOTH_A6_LR: + case BOTH_A7_HILT: + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_DL_T_SB_1_W: + case BOTH_LK_S_ST_S_SB_1_W: + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_DL_T_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + case BOTH_LK_DL_ST_T_SB_1_W: + case BOTH_LK_DL_S_S_SB_1_W: + case BOTH_LK_DL_S_T_SB_1_W: + case BOTH_LK_ST_DL_S_SB_1_W: + case BOTH_LK_ST_DL_T_SB_1_W: + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + case BOTH_HANG_ATTACK: + return qtrue; + } + if ( PM_SaberDrawPutawayAnim( anim ) ) + { + if ( saberMove == LS_DRAW || saberMove == LS_PUTAWAY ) + { + return qtrue; + } + return qfalse; + } + else if ( PM_SaberStanceAnim( anim ) ) + { + if ( saberMove == LS_READY ) + { + return qtrue; + } + return qfalse; + } + int animLevel = PM_AnimLevelForSaberAnim( anim ); + if ( animLevel <= 0 ) + {//NOTE: this will always return false for the ready poses and putaway/draw... + return qfalse; + } + //drop the anim to the first level and start the checks there + anim -= (animLevel-FORCE_LEVEL_1)*SABER_ANIM_GROUP_SIZE; + //check level 1 + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + //check level 2 + anim += SABER_ANIM_GROUP_SIZE; + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + //check level 3 + anim += SABER_ANIM_GROUP_SIZE; + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + //check level 4 + anim += SABER_ANIM_GROUP_SIZE; + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + //check level 5 + anim += SABER_ANIM_GROUP_SIZE; + if ( anim == saberMoveData[saberMove].animToUse ) + { + return qtrue; + } + if ( anim >= BOTH_P1_S1_T_ && anim <= BOTH_H1_S1_BR ) + {//parries, knockaways and broken parries + return (anim==saberMoveData[saberMove].animToUse); + } + return qfalse; +} + +qboolean PM_SaberInIdle( int move ) +{ + switch ( move ) + { + case LS_NONE: + case LS_READY: + case LS_DRAW: + case LS_PUTAWAY: + return qtrue; + break; + } + return qfalse; +} +qboolean PM_SaberInSpecialAttack( int anim ) +{ + switch ( anim ) + { + case BOTH_A2_STABBACK1: + case BOTH_ATTACK_BACK: + case BOTH_CROUCHATTACKBACK1: + case BOTH_ROLL_STAB: + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + case BOTH_LUNGE2_B__T_: + case BOTH_FORCELEAP2_T__B_: + case BOTH_JUMPFLIPSLASHDOWN1://# + case BOTH_JUMPFLIPSTABDOWN://# + case BOTH_JUMPATTACK6: + case BOTH_JUMPATTACK7: + case BOTH_SPINATTACK6: + case BOTH_SPINATTACK7: + case BOTH_FORCELONGLEAP_ATTACK: + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + case BOTH_A7_KICK_F: + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + case BOTH_A7_KICK_S: + case BOTH_A7_KICK_BF: + case BOTH_A7_KICK_RL: + case BOTH_A7_KICK_F_AIR: + case BOTH_A7_KICK_B_AIR: + case BOTH_A7_KICK_R_AIR: + case BOTH_A7_KICK_L_AIR: + case BOTH_STABDOWN: + case BOTH_STABDOWN_STAFF: + case BOTH_STABDOWN_DUAL: + case BOTH_A6_SABERPROTECT: + case BOTH_A7_SOULCAL: + case BOTH_A1_SPECIAL: + case BOTH_A2_SPECIAL: + case BOTH_A3_SPECIAL: + case BOTH_FLIP_ATTACK7: + case BOTH_PULL_IMPALE_STAB: + case BOTH_PULL_IMPALE_SWING: + case BOTH_ALORA_SPIN_SLASH: + case BOTH_A6_FB: + case BOTH_A6_LR: + case BOTH_A7_HILT: + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_DL_T_SB_1_W: + case BOTH_LK_S_ST_S_SB_1_W: + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_DL_T_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + case BOTH_LK_DL_ST_T_SB_1_W: + case BOTH_LK_DL_S_S_SB_1_W: + case BOTH_LK_DL_S_T_SB_1_W: + case BOTH_LK_ST_DL_S_SB_1_W: + case BOTH_LK_ST_DL_T_SB_1_W: + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + case BOTH_HANG_ATTACK: + return qtrue; + } + return qfalse; +} + +qboolean PM_SaberInAttackPure( int move ) +{ + if ( move >= LS_A_TL2BR && move <= LS_A_T2B ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInAttack( int move ) +{ + if ( move >= LS_A_TL2BR && move <= LS_A_T2B ) + { + return qtrue; + } + switch ( move ) + { + case LS_A_BACK: + case LS_A_BACK_CR: + case LS_A_BACKSTAB: + case LS_ROLL_STAB: + case LS_A_LUNGE: + case LS_A_JUMP_T__B_: + case LS_A_FLIP_STAB: + case LS_A_FLIP_SLASH: + case LS_JUMPATTACK_DUAL: + case LS_JUMPATTACK_ARIAL_LEFT: + case LS_JUMPATTACK_ARIAL_RIGHT: + case LS_JUMPATTACK_CART_LEFT: + case LS_JUMPATTACK_CART_RIGHT: + case LS_JUMPATTACK_STAFF_LEFT: + case LS_JUMPATTACK_STAFF_RIGHT: + case LS_BUTTERFLY_LEFT: + case LS_BUTTERFLY_RIGHT: + case LS_A_BACKFLIP_ATK: + case LS_SPINATTACK_DUAL: + case LS_SPINATTACK: + case LS_LEAP_ATTACK: + case LS_SWOOP_ATTACK_RIGHT: + case LS_SWOOP_ATTACK_LEFT: + case LS_TAUNTAUN_ATTACK_RIGHT: + case LS_TAUNTAUN_ATTACK_LEFT: + case LS_KICK_F: + case LS_KICK_B: + case LS_KICK_R: + case LS_KICK_L: + case LS_KICK_S: + case LS_KICK_BF: + case LS_KICK_RL: + case LS_KICK_F_AIR: + case LS_KICK_B_AIR: + case LS_KICK_R_AIR: + case LS_KICK_L_AIR: + case LS_STABDOWN: + case LS_STABDOWN_STAFF: + case LS_STABDOWN_DUAL: + case LS_DUAL_SPIN_PROTECT: + case LS_STAFF_SOULCAL: + case LS_A1_SPECIAL: + case LS_A2_SPECIAL: + case LS_A3_SPECIAL: + case LS_UPSIDE_DOWN_ATTACK: + case LS_PULL_ATTACK_STAB: + case LS_PULL_ATTACK_SWING: + case LS_SPINATTACK_ALORA: + case LS_DUAL_FB: + case LS_DUAL_LR: + case LS_HILT_BASH: + return qtrue; + break; + } + return qfalse; +} +qboolean PM_SaberInTransition( int move ) +{ + if ( move >= LS_T1_BR__R && move <= LS_T1_BL__L ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInStart( int move ) +{ + if ( move >= LS_S_TL2BR && move <= LS_S_T2B ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInReturn( int move ) +{ + if ( move >= LS_R_TL2BR && move <= LS_R_T2B ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInTransitionAny( int move ) +{ + if ( PM_SaberInStart( move ) ) + { + return qtrue; + } + else if ( PM_SaberInTransition( move ) ) + { + return qtrue; + } + else if ( PM_SaberInReturn( move ) ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInBounce( int move ) +{ + if ( move >= LS_B1_BR && move <= LS_B1_BL ) + { + return qtrue; + } + if ( move >= LS_D1_BR && move <= LS_D1_BL ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInBrokenParry( int move ) +{ + if ( move >= LS_V1_BR && move <= LS_V1_B_ ) + { + return qtrue; + } + if ( move >= LS_H1_T_ && move <= LS_H1_BL ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInDeflect( int move ) +{ + if ( move >= LS_D1_BR && move <= LS_D1_B_ ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInParry( int move ) +{ + if ( move >= LS_PARRY_UP && move <= LS_PARRY_LL ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInKnockaway( int move ) +{ + if ( move >= LS_K1_T_ && move <= LS_K1_BL ) + { + return qtrue; + } + return qfalse; +} +qboolean PM_SaberInReflect( int move ) +{ + if ( move >= LS_REFLECT_UP && move <= LS_REFLECT_LL ) + { + return qtrue; + } + return qfalse; +} + +qboolean PM_SaberInSpecial( int move ) +{ + switch( move ) + { + case LS_A_BACK: + case LS_A_BACK_CR: + case LS_A_BACKSTAB: + case LS_ROLL_STAB: + case LS_A_LUNGE: + case LS_A_JUMP_T__B_: + case LS_A_FLIP_STAB: + case LS_A_FLIP_SLASH: + case LS_JUMPATTACK_DUAL: + case LS_JUMPATTACK_ARIAL_LEFT: + case LS_JUMPATTACK_ARIAL_RIGHT: + case LS_JUMPATTACK_CART_LEFT: + case LS_JUMPATTACK_CART_RIGHT: + case LS_JUMPATTACK_STAFF_LEFT: + case LS_JUMPATTACK_STAFF_RIGHT: + case LS_BUTTERFLY_LEFT: + case LS_BUTTERFLY_RIGHT: + case LS_A_BACKFLIP_ATK: + case LS_SPINATTACK_DUAL: + case LS_SPINATTACK: + case LS_LEAP_ATTACK: + case LS_SWOOP_ATTACK_RIGHT: + case LS_SWOOP_ATTACK_LEFT: + case LS_TAUNTAUN_ATTACK_RIGHT: + case LS_TAUNTAUN_ATTACK_LEFT: + case LS_KICK_F: + case LS_KICK_B: + case LS_KICK_R: + case LS_KICK_L: + case LS_KICK_S: + case LS_KICK_BF: + case LS_KICK_RL: + case LS_KICK_F_AIR: + case LS_KICK_B_AIR: + case LS_KICK_R_AIR: + case LS_KICK_L_AIR: + case LS_STABDOWN: + case LS_STABDOWN_STAFF: + case LS_STABDOWN_DUAL: + case LS_DUAL_SPIN_PROTECT: + case LS_STAFF_SOULCAL: + case LS_A1_SPECIAL: + case LS_A2_SPECIAL: + case LS_A3_SPECIAL: + case LS_UPSIDE_DOWN_ATTACK: + case LS_PULL_ATTACK_STAB: + case LS_PULL_ATTACK_SWING: + case LS_SPINATTACK_ALORA: + case LS_DUAL_FB: + case LS_DUAL_LR: + case LS_HILT_BASH: + return qtrue; + } + return qfalse; +} + +qboolean PM_KickMove( int move ) +{ + switch( move ) + { + case LS_KICK_F: + case LS_KICK_B: + case LS_KICK_R: + case LS_KICK_L: + case LS_KICK_S: + case LS_KICK_BF: + case LS_KICK_RL: + case LS_HILT_BASH: + case LS_KICK_F_AIR: + case LS_KICK_B_AIR: + case LS_KICK_R_AIR: + case LS_KICK_L_AIR: + return qtrue; + } + return qfalse; +} + +qboolean PM_SaberCanInterruptMove( int move, int anim ) +{ + if ( PM_InAnimForSaberMove( anim, move ) ) + { + switch( move ) + { + case LS_A_BACK: + case LS_A_BACK_CR: + case LS_A_BACKSTAB: + case LS_ROLL_STAB: + case LS_A_LUNGE: + case LS_A_JUMP_T__B_: + case LS_A_FLIP_STAB: + case LS_A_FLIP_SLASH: + case LS_JUMPATTACK_DUAL: + case LS_JUMPATTACK_CART_LEFT: + case LS_JUMPATTACK_CART_RIGHT: + case LS_JUMPATTACK_STAFF_LEFT: + case LS_JUMPATTACK_STAFF_RIGHT: + case LS_BUTTERFLY_LEFT: + case LS_BUTTERFLY_RIGHT: + case LS_A_BACKFLIP_ATK: + case LS_SPINATTACK_DUAL: + case LS_SPINATTACK: + case LS_LEAP_ATTACK: + case LS_SWOOP_ATTACK_RIGHT: + case LS_SWOOP_ATTACK_LEFT: + case LS_TAUNTAUN_ATTACK_RIGHT: + case LS_TAUNTAUN_ATTACK_LEFT: + case LS_KICK_S: + case LS_KICK_BF: + case LS_KICK_RL: + case LS_STABDOWN: + case LS_STABDOWN_STAFF: + case LS_STABDOWN_DUAL: + case LS_DUAL_SPIN_PROTECT: + case LS_STAFF_SOULCAL: + case LS_A1_SPECIAL: + case LS_A2_SPECIAL: + case LS_A3_SPECIAL: + case LS_UPSIDE_DOWN_ATTACK: + case LS_PULL_ATTACK_STAB: + case LS_PULL_ATTACK_SWING: + case LS_SPINATTACK_ALORA: + case LS_DUAL_FB: + case LS_DUAL_LR: + case LS_HILT_BASH: + return qfalse; + } + + if ( PM_SaberInAttackPure( move ) ) + { + return qfalse; + } + if ( PM_SaberInStart( move ) ) + { + return qfalse; + } + if ( PM_SaberInTransition( move ) ) + { + return qfalse; + } + if ( PM_SaberInBounce( move ) ) + { + return qfalse; + } + if ( PM_SaberInBrokenParry( move ) ) + { + return qfalse; + } + if ( PM_SaberInDeflect( move ) ) + { + return qfalse; + } + if ( PM_SaberInParry( move ) ) + { + return qfalse; + } + if ( PM_SaberInKnockaway( move ) ) + { + return qfalse; + } + if ( PM_SaberInReflect( move ) ) + { + return qfalse; + } + } + switch ( anim ) + { + case BOTH_A2_STABBACK1: + case BOTH_ATTACK_BACK: + case BOTH_CROUCHATTACKBACK1: + case BOTH_ROLL_STAB: + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + case BOTH_LUNGE2_B__T_: + case BOTH_FORCELEAP2_T__B_: + case BOTH_JUMPFLIPSLASHDOWN1://# + case BOTH_JUMPFLIPSTABDOWN://# + case BOTH_JUMPATTACK6: + case BOTH_JUMPATTACK7: + case BOTH_SPINATTACK6: + case BOTH_SPINATTACK7: + case BOTH_FORCELONGLEAP_ATTACK: + case BOTH_VS_ATR_S: + case BOTH_VS_ATL_S: + case BOTH_VT_ATR_S: + case BOTH_VT_ATL_S: + case BOTH_A7_KICK_S: + case BOTH_A7_KICK_BF: + case BOTH_A7_KICK_RL: + case BOTH_STABDOWN: + case BOTH_STABDOWN_STAFF: + case BOTH_STABDOWN_DUAL: + case BOTH_A6_SABERPROTECT: + case BOTH_A7_SOULCAL: + case BOTH_A1_SPECIAL: + case BOTH_A2_SPECIAL: + case BOTH_A3_SPECIAL: + case BOTH_FLIP_ATTACK7: + case BOTH_PULL_IMPALE_STAB: + case BOTH_PULL_IMPALE_SWING: + case BOTH_ALORA_SPIN_SLASH: + case BOTH_A6_FB: + case BOTH_A6_LR: + case BOTH_A7_HILT: + case BOTH_LK_S_DL_S_SB_1_W: + case BOTH_LK_S_DL_T_SB_1_W: + case BOTH_LK_S_ST_S_SB_1_W: + case BOTH_LK_S_ST_T_SB_1_W: + case BOTH_LK_S_S_S_SB_1_W: + case BOTH_LK_S_S_T_SB_1_W: + case BOTH_LK_DL_DL_S_SB_1_W: + case BOTH_LK_DL_DL_T_SB_1_W: + case BOTH_LK_DL_ST_S_SB_1_W: + case BOTH_LK_DL_ST_T_SB_1_W: + case BOTH_LK_DL_S_S_SB_1_W: + case BOTH_LK_DL_S_T_SB_1_W: + case BOTH_LK_ST_DL_S_SB_1_W: + case BOTH_LK_ST_DL_T_SB_1_W: + case BOTH_LK_ST_ST_S_SB_1_W: + case BOTH_LK_ST_ST_T_SB_1_W: + case BOTH_LK_ST_S_S_SB_1_W: + case BOTH_LK_ST_S_T_SB_1_W: + case BOTH_HANG_ATTACK: + return qfalse; + } + return qtrue; +} + +saberMoveName_t PM_BrokenParryForAttack( int move ) +{ + //Our attack was knocked away by a knockaway parry + //FIXME: need actual anims for this + //FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center + switch ( saberMoveData[move].startQuad ) + { + case Q_B: + return LS_V1_B_; + break; + case Q_BR: + return LS_V1_BR; + break; + case Q_R: + return LS_V1__R; + break; + case Q_TR: + return LS_V1_TR; + break; + case Q_T: + return LS_V1_T_; + break; + case Q_TL: + return LS_V1_TL; + break; + case Q_L: + return LS_V1__L; + break; + case Q_BL: + return LS_V1_BL; + break; + } + return LS_NONE; +} + +saberMoveName_t PM_BrokenParryForParry( int move ) +{ + //FIXME: need actual anims for this + //FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center + switch ( move ) + { + case LS_PARRY_UP: + //Hmm... since we don't know what dir the hit came from, randomly pick knock down or knock back + if ( Q_irand( 0, 1 ) ) + { + return LS_H1_B_; + } + else + { + return LS_H1_T_; + } + break; + case LS_PARRY_UR: + return LS_H1_TR; + break; + case LS_PARRY_UL: + return LS_H1_TL; + break; + case LS_PARRY_LR: + return LS_H1_BR; + break; + case LS_PARRY_LL: + return LS_H1_BL; + break; + case LS_READY: + return LS_H1_B_;//??? + break; + } + return LS_NONE; +} + +saberMoveName_t PM_KnockawayForParry( int move ) +{ + //FIXME: need actual anims for this + //FIXME: need to know which side of the saber was hit! For now, we presume the saber gets knocked away from the center + switch ( move ) + { + case BLOCKED_TOP://LS_PARRY_UP: + return LS_K1_T_;//push up + break; + case BLOCKED_UPPER_RIGHT://LS_PARRY_UR: + default://case LS_READY: + return LS_K1_TR;//push up, slightly to right + break; + case BLOCKED_UPPER_LEFT://LS_PARRY_UL: + return LS_K1_TL;//push up and to left + break; + case BLOCKED_LOWER_RIGHT://LS_PARRY_LR: + return LS_K1_BR;//push down and to left + break; + case BLOCKED_LOWER_LEFT://LS_PARRY_LL: + return LS_K1_BL;//push down and to right + break; + } + //return LS_NONE; +} + +saberMoveName_t PM_SaberBounceForAttack( int move ) +{ + switch ( saberMoveData[move].startQuad ) + { + case Q_B: + case Q_BR: + return LS_B1_BR; + break; + case Q_R: + return LS_B1__R; + break; + case Q_TR: + return LS_B1_TR; + break; + case Q_T: + return LS_B1_T_; + break; + case Q_TL: + return LS_B1_TL; + break; + case Q_L: + return LS_B1__L; + break; + case Q_BL: + return LS_B1_BL; + break; + } + return LS_NONE; +} + +saberMoveName_t PM_AttackMoveForQuad( int quad ) +{ + switch ( quad ) + { + case Q_B: + case Q_BR: + return LS_A_BR2TL; + break; + case Q_R: + return LS_A_R2L; + break; + case Q_TR: + return LS_A_TR2BL; + break; + case Q_T: + return LS_A_T2B; + break; + case Q_TL: + return LS_A_TL2BR; + break; + case Q_L: + return LS_A_L2R; + break; + case Q_BL: + return LS_A_BL2TR; + break; + } + return LS_NONE; +} + +int saberMoveTransitionAngle[Q_NUM_QUADS][Q_NUM_QUADS] = +{ + { + 0,//Q_BR,Q_BR, + 45,//Q_BR,Q_R, + 90,//Q_BR,Q_TR, + 135,//Q_BR,Q_T, + 180,//Q_BR,Q_TL, + 215,//Q_BR,Q_L, + 270,//Q_BR,Q_BL, + 45,//Q_BR,Q_B, + }, + { + 45,//Q_R,Q_BR, + 0,//Q_R,Q_R, + 45,//Q_R,Q_TR, + 90,//Q_R,Q_T, + 135,//Q_R,Q_TL, + 180,//Q_R,Q_L, + 215,//Q_R,Q_BL, + 90,//Q_R,Q_B, + }, + { + 90,//Q_TR,Q_BR, + 45,//Q_TR,Q_R, + 0,//Q_TR,Q_TR, + 45,//Q_TR,Q_T, + 90,//Q_TR,Q_TL, + 135,//Q_TR,Q_L, + 180,//Q_TR,Q_BL, + 135,//Q_TR,Q_B, + }, + { + 135,//Q_T,Q_BR, + 90,//Q_T,Q_R, + 45,//Q_T,Q_TR, + 0,//Q_T,Q_T, + 45,//Q_T,Q_TL, + 90,//Q_T,Q_L, + 135,//Q_T,Q_BL, + 180,//Q_T,Q_B, + }, + { + 180,//Q_TL,Q_BR, + 135,//Q_TL,Q_R, + 90,//Q_TL,Q_TR, + 45,//Q_TL,Q_T, + 0,//Q_TL,Q_TL, + 45,//Q_TL,Q_L, + 90,//Q_TL,Q_BL, + 135,//Q_TL,Q_B, + }, + { + 215,//Q_L,Q_BR, + 180,//Q_L,Q_R, + 135,//Q_L,Q_TR, + 90,//Q_L,Q_T, + 45,//Q_L,Q_TL, + 0,//Q_L,Q_L, + 45,//Q_L,Q_BL, + 90,//Q_L,Q_B, + }, + { + 270,//Q_BL,Q_BR, + 215,//Q_BL,Q_R, + 180,//Q_BL,Q_TR, + 135,//Q_BL,Q_T, + 90,//Q_BL,Q_TL, + 45,//Q_BL,Q_L, + 0,//Q_BL,Q_BL, + 45,//Q_BL,Q_B, + }, + { + 45,//Q_B,Q_BR, + 90,//Q_B,Q_R, + 135,//Q_B,Q_TR, + 180,//Q_B,Q_T, + 135,//Q_B,Q_TL, + 90,//Q_B,Q_L, + 45,//Q_B,Q_BL, + 0//Q_B,Q_B, + } +}; + +int PM_SaberAttackChainAngle( int move1, int move2 ) +{ + if ( move1 == -1 || move2 == -1 ) + { + return -1; + } + return saberMoveTransitionAngle[saberMoveData[move1].endQuad][saberMoveData[move2].startQuad]; +} + +qboolean PM_SaberKataDone( int curmove = LS_NONE, int newmove = LS_NONE ) +{ + if ( pm->ps->forceRageRecoveryTime > level.time ) + {//rage recovery, only 1 swing at a time (tired) + if ( pm->ps->saberAttackChainCount > 0 ) + {//swung once + return qtrue; + } + else + {//allow one attack + return qfalse; + } + } + else if ( (pm->ps->forcePowersActive&(1<ps->saber[0].maxChain == -1 ) + { + return qfalse; + } + else if ( pm->ps->saber[0].maxChain != 0 ) + { + if ( pm->ps->saberAttackChainCount >= pm->ps->saber[0].maxChain ) + { + return qtrue; + } + else + { + return qfalse; + } + } + + if ( pm->ps->saberAnimLevel == SS_DESANN || pm->ps->saberAnimLevel == SS_TAVION ) + {//desann and tavion can link up as many attacks as they want + return qfalse; + } + //FIXME: instead of random, apply some sort of logical conditions to whether or + // not you can chain? Like if you were completely missed, you can't chain as much, or...? + // And/Or based on FP_SABER_OFFENSE level? So number of attacks you can chain + // increases with your FP_SABER_OFFENSE skill? + if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + //TEMP: for now, let staff attacks infinitely chain + return qfalse; + /* + if ( pm->ps->saberAttackChainCount > Q_irand( 3, 4 ) ) + { + return qtrue; + } + else if ( pm->ps->saberAttackChainCount > 0 ) + { + int chainAngle = PM_SaberAttackChainAngle( curmove, newmove ); + if ( chainAngle < 135 || chainAngle > 215 ) + {//if trying to chain to a move that doesn't continue the momentum + if ( pm->ps->saberAttackChainCount > 1 ) + { + return qtrue; + } + } + else if ( chainAngle == 180 ) + {//continues the momentum perfectly, allow it to chain 66% of the time + if ( pm->ps->saberAttackChainCount > 2 ) + { + return qtrue; + } + } + else + {//would continue the movement somewhat, 50% chance of continuing + if ( pm->ps->saberAttackChainCount > 3 ) + { + return qtrue; + } + } + } + */ + } + else if ( pm->ps->saberAnimLevel == SS_DUAL ) + { + //TEMP: for now, let staff attacks infinitely chain + return qfalse; + } + else if ( pm->ps->saberAnimLevel == FORCE_LEVEL_3 ) + { + if ( curmove == LS_NONE || newmove == LS_NONE ) + { + if ( pm->ps->saberAnimLevel >= FORCE_LEVEL_3 && pm->ps->saberAttackChainCount > Q_irand( 0, 1 ) ) + { + return qtrue; + } + } + else if ( pm->ps->saberAttackChainCount > Q_irand( 2, 3 ) ) + { + return qtrue; + } + else if ( pm->ps->saberAttackChainCount > 0 ) + { + int chainAngle = PM_SaberAttackChainAngle( curmove, newmove ); + if ( chainAngle < 135 || chainAngle > 215 ) + {//if trying to chain to a move that doesn't continue the momentum + return qtrue; + } + else if ( chainAngle == 180 ) + {//continues the momentum perfectly, allow it to chain 66% of the time + if ( pm->ps->saberAttackChainCount > 1 ) + { + return qtrue; + } + } + else + {//would continue the movement somewhat, 50% chance of continuing + if ( pm->ps->saberAttackChainCount > 2 ) + { + return qtrue; + } + } + } + } + else + {//FIXME: have chainAngle influence fast and medium chains as well? + if ( (pm->ps->saberAnimLevel == FORCE_LEVEL_2 || pm->ps->saberAnimLevel == SS_DUAL) + && pm->ps->saberAttackChainCount > Q_irand( 2, 5 ) ) + { + return qtrue; + } + } + return qfalse; +} + +qboolean PM_CheckEnemyInBack( float backCheckDist ) +{ + if ( !pm->gent || !pm->gent->client ) + { + return qfalse; + } + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) + && !g_saberAutoAim->integer && pm->cmd.forwardmove >= 0 ) + {//don't auto-backstab + return qfalse; + } + if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) + {//only when on ground + return qfalse; + } + trace_t trace; + vec3_t end, fwd, fwdAngles = {0,pm->ps->viewangles[YAW],0}; + + AngleVectors( fwdAngles, fwd, NULL, NULL ); + VectorMA( pm->ps->origin, -backCheckDist, fwd, end ); + + pm->trace( &trace, pm->ps->origin, vec3_origin, vec3_origin, end, pm->ps->clientNum, CONTENTS_SOLID|CONTENTS_BODY, (EG2_Collision)0, 0 ); + if ( trace.fraction < 1.0f && trace.entityNum < ENTITYNUM_WORLD ) + { + gentity_t *traceEnt = &g_entities[trace.entityNum]; + if ( traceEnt + && traceEnt->health > 0 + && traceEnt->client + && traceEnt->client->playerTeam == pm->gent->client->enemyTeam + && traceEnt->client->ps.groundEntityNum != ENTITYNUM_NONE ) + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + {//player + if ( pm->gent ) + {//set player enemy to traceEnt so he auto-aims at him + pm->gent->enemy = traceEnt; + } + } + return qtrue; + } + } + return qfalse; +} + +saberMoveName_t PM_PickBackStab( void ) +{ + if ( !pm->gent || !pm->gent->client ) + { + return LS_READY; + } + if ( pm->ps->dualSabers + && pm->ps->saber[1].Active() ) + { + if ( pm->ps->pm_flags & PMF_DUCKED ) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } + if ( pm->gent->client->ps.saberAnimLevel == SS_TAVION ) + { + return LS_A_BACKSTAB; + } + else if ( pm->gent->client->ps.saberAnimLevel == SS_DESANN ) + { + if ( pm->ps->saberMove == LS_READY || !Q_irand( 0, 3 ) ) + { + return LS_A_BACKSTAB; + } + else if ( pm->ps->pm_flags & PMF_DUCKED ) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } + else if ( pm->ps->saberAnimLevel == FORCE_LEVEL_2 + || pm->ps->saberAnimLevel == SS_DUAL ) + {//using medium attacks or dual sabers + if ( pm->ps->pm_flags & PMF_DUCKED ) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } + else + { + return LS_A_BACKSTAB; + } +} + +saberMoveName_t PM_CheckStabDown( void ) +{ + if ( !pm->gent || !pm->gent->enemy || !pm->gent->enemy->client ) + { + return LS_NONE; + } + if ( (pm->ps->saber[0].saberFlags&SFL_NO_STABDOWN) ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers + && (pm->ps->saber[1].saberFlags&SFL_NO_STABDOWN) ) + { + return LS_NONE; + } + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingKataAttack( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//want to try a special + return LS_NONE; + } + } + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + {//player + if ( pm->ps->groundEntityNum == ENTITYNUM_NONE )//in air + {//sorry must be on ground (or have just jumped) + if ( level.time-pm->ps->lastOnGround <= 50 && (pm->ps->pm_flags&PMF_JUMPING) ) + {//just jumped, it's okay + } + else + { + return LS_NONE; + } + } + /* + if ( pm->cmd.upmove > 0 ) + {//trying to jump + } + else if ( pm->ps->groundEntityNum == ENTITYNUM_NONE //in air + && level.time-pm->ps->lastOnGround <= 250 //just left ground + && (pm->ps->pm_flags&PMF_JUMPING) )//jumped + {//just jumped + } + else + { + return LS_NONE; + } + */ + pm->ps->velocity[2] = 0; + pm->cmd.upmove = 0; + } + else if ( (pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) ) + {//NPC + if ( pm->ps->groundEntityNum == ENTITYNUM_NONE )//in air + {//sorry must be on ground (or have just jumped) + if ( level.time-pm->ps->lastOnGround <= 250 && (pm->ps->pm_flags&PMF_JUMPING) ) + {//just jumped, it's okay + } + else + { + return LS_NONE; + } + } + if ( !pm->gent->NPC ) + {//wtf??? + return LS_NONE; + } + if ( Q_irand( 0, RANK_CAPTAIN ) > pm->gent->NPC->rank ) + {//lower ranks do this less often + return LS_NONE; + } + } + vec3_t enemyDir, faceFwd, facingAngles = {0, pm->ps->viewangles[YAW], 0}; + AngleVectors( facingAngles, faceFwd, NULL, NULL ); + VectorSubtract( pm->gent->enemy->currentOrigin, pm->ps->origin, enemyDir ); + float enemyZDiff = enemyDir[2]; + enemyDir[2] = 0; + float enemyHDist = VectorNormalize( enemyDir )-(pm->gent->maxs[0]+pm->gent->enemy->maxs[0]); + float dot = DotProduct( enemyDir, faceFwd ); + + if ( //(pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + dot > 0.65f + //&& enemyHDist >= 32 //was 48 + && enemyHDist <= 164//was 112 + && PM_InKnockDownOnGround( &pm->gent->enemy->client->ps )//still on ground + && !PM_InGetUpNoRoll( &pm->gent->enemy->client->ps )//not getting up yet + && enemyZDiff <= 20 ) + {//guy is on the ground below me, do a top-down attack + if ( pm->gent->enemy->s.number >= MAX_CLIENTS + || !G_ControlledByPlayer( pm->gent->enemy ) ) + {//don't get up while I'm doing this + //stop them from trying to get up for at least another 3 seconds + TIMER_Set( pm->gent->enemy, "noGetUpStraight", 3000 ); + } + //pick the right anim + if ( pm->ps->saberAnimLevel == SS_DUAL + || (pm->ps->dualSabers&&pm->ps->saber[1].Active()) ) + { + return LS_STABDOWN_DUAL; + } + else if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + return LS_STABDOWN_STAFF; + } + else + { + return LS_STABDOWN; + } + } + return LS_NONE; +} + +extern saberMoveName_t PM_NPCSaberAttackFromQuad( int quad ); +saberMoveName_t PM_SaberFlipOverAttackMove( void ); +saberMoveName_t PM_AttackForEnemyPos( qboolean allowFB, qboolean allowStabDown ) +{ + saberMoveName_t autoMove = LS_INVALID; + + if( !pm->gent->enemy ) + { + return LS_NONE; + } + + vec3_t enemy_org, enemyDir, faceFwd, faceRight, faceUp, facingAngles = {0, pm->ps->viewangles[YAW], 0}; + AngleVectors( facingAngles, faceFwd, faceRight, faceUp ); + //FIXME: predict enemy position? + if ( pm->gent->enemy->client ) + { + //VectorCopy( pm->gent->enemy->currentOrigin, enemy_org ); + //HMM... using this will adjust for bbox size, so let's do that... + vec3_t size; + VectorSubtract( pm->gent->enemy->absmax, pm->gent->enemy->absmin, size ); + VectorMA( pm->gent->enemy->absmin, 0.5, size, enemy_org ); + + VectorSubtract( pm->gent->enemy->client->renderInfo.eyePoint, pm->ps->origin, enemyDir ); + } + else + { + if ( pm->gent->enemy->bmodel && VectorCompare( vec3_origin, pm->gent->enemy->currentOrigin ) ) + {//a brush model without an origin brush + vec3_t size; + VectorSubtract( pm->gent->enemy->absmax, pm->gent->enemy->absmin, size ); + VectorMA( pm->gent->enemy->absmin, 0.5, size, enemy_org ); + } + else + { + VectorCopy( pm->gent->enemy->currentOrigin, enemy_org ); + } + VectorSubtract( enemy_org, pm->ps->origin, enemyDir ); + } + float enemyZDiff = enemyDir[2]; + float enemyDist = VectorNormalize( enemyDir ); + float dot = DotProduct( enemyDir, faceFwd ); + if ( dot > 0 ) + {//enemy is in front + if ( allowStabDown ) + {//okay to try this + saberMoveName_t stabDownMove = PM_CheckStabDown(); + if ( stabDownMove != LS_NONE ) + { + return stabDownMove; + } + } + if ( (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + && dot > 0.65f + && enemyDist <= 64 && pm->gent->enemy->client + && (enemyZDiff <= 20 || PM_InKnockDownOnGround( &pm->gent->enemy->client->ps ) || PM_CrouchAnim( pm->gent->enemy->client->ps.legsAnim ) ) ) + {//swing down at them + return LS_A_T2B; + } + if ( allowFB ) + {//directly in front anim allowed + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK)) ) + {//okay to do backstabs with this saber + if ( enemyDist > 200 || pm->gent->enemy->health <= 0 ) + {//hmm, look in back for an enemy + if ( pm->ps->clientNum && !PM_ControlledByPlayer() ) + {//player should never do this automatically + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//only when on ground + if ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) + {//only fencers and higher can do this, higher rank does it more + if ( PM_CheckEnemyInBack( 100 ) ) + { + return PM_PickBackStab(); + } + } + } + } + } + } + //this is the default only if they're *right* in front... + if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) + || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) ) + {//NPC or player not in 1st person + if ( PM_CheckFlipOverAttackMove( qtrue ) ) + {//enemy must be close and in front + return PM_SaberFlipOverAttackMove(); + } + } + if ( PM_CheckLungeAttackMove() ) + {//NPC + autoMove = PM_SaberLungeAttackMove( qtrue ); + } + else + { + autoMove = LS_A_T2B; + } + } + else + {//pick a random one + if ( Q_irand( 0, 1 ) ) + { + autoMove = LS_A_TR2BL; + } + else + { + autoMove = LS_A_TL2BR; + } + } + float dotR = DotProduct( enemyDir, faceRight ); + if ( dotR > 0.35 ) + {//enemy is to far right + autoMove = LS_A_L2R; + } + else if ( dotR < -0.35 ) + {//far left + autoMove = LS_A_R2L; + } + else if ( dotR > 0.15 ) + {//enemy is to near right + autoMove = LS_A_TR2BL; + } + else if ( dotR < -0.15 ) + {//near left + autoMove = LS_A_TL2BR; + } + if ( DotProduct( enemyDir, faceUp ) > 0.5 ) + {//enemy is above me + if ( autoMove == LS_A_TR2BL ) + { + autoMove = LS_A_BL2TR; + } + else if ( autoMove == LS_A_TL2BR ) + { + autoMove = LS_A_BR2TL; + } + } + } + else if ( allowFB ) + {//back attack allowed + //if ( !PM_InKnockDown( pm->ps ) ) + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK)) ) + {//okay to do backstabs with this saber + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//only when on ground + if ( !pm->gent->enemy->client || pm->gent->enemy->client->ps.groundEntityNum != ENTITYNUM_NONE ) + {//enemy not a client or is a client and on ground + if ( dot < -0.75f + && enemyDist < 128 + && (pm->ps->saberAnimLevel == SS_FAST || pm->ps->saberAnimLevel == SS_STAFF || (pm->gent->client &&(pm->gent->client->NPC_class == CLASS_TAVION||pm->gent->client->NPC_class == CLASS_ALORA)&&Q_irand(0,2))) ) + {//fast back-stab + if ( !(pm->ps->pm_flags&PMF_DUCKED) && pm->cmd.upmove >= 0 ) + {//can't do it while ducked? + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || (pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG) ) + {//only fencers and above can do this + autoMove = LS_A_BACKSTAB; + } + } + } + else if ( pm->ps->saberAnimLevel != SS_FAST + && pm->ps->saberAnimLevel != SS_STAFF ) + {//higher level back spin-attacks + if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) ) + { + if ( (pm->ps->pm_flags&PMF_DUCKED) || pm->cmd.upmove < 0 ) + { + autoMove = LS_A_BACK_CR; + } + else + { + autoMove = LS_A_BACK; + } + } + } + } + } + } + } + return autoMove; +} + +qboolean PM_InSecondaryStyle( void ) +{ + if ( pm->ps->saber[0].numBlades > 1 + && pm->ps->saber[0].singleBladeStyle + && (pm->ps->saber[0].stylesForbidden&(1<ps->saber[0].singleBladeStyle)) + && pm->ps->saberAnimLevel == pm->ps->saber[0].singleBladeStyle ) + { + return qtrue; + } + + if ( pm->ps->dualSabers + && !pm->ps->saber[1].Active() )//pm->ps->saberAnimLevel != SS_DUAL ) + { + return qtrue; + } + return qfalse; +} + +saberMoveName_t PM_SaberLungeAttackMove( qboolean fallbackToNormalLunge ) +{ + G_DrainPowerForSpecialMove( pm->gent, FP_SABER_OFFENSE, SABER_ALT_ATTACK_POWER_FB ); + + //see if we have an overridden (or cancelled) lunge move + if ( pm->ps->saber[0].lungeAtkMove != LS_INVALID ) + { + if ( pm->ps->saber[0].lungeAtkMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].lungeAtkMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].lungeAtkMove != LS_INVALID ) + { + if ( pm->ps->saber[1].lungeAtkMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].lungeAtkMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].lungeAtkMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].lungeAtkMove == LS_NONE ) + { + return LS_NONE; + } + } + //do normal checks + if ( pm->gent->client->NPC_class == CLASS_ALORA && !Q_irand( 0, 3 ) ) + {//alora NPC + return LS_SPINATTACK_ALORA; + } + else + { + if ( pm->ps->dualSabers ) + { + return LS_SPINATTACK_DUAL; + } + switch ( pm->ps->saberAnimLevel ) + { + case SS_DUAL: + return LS_SPINATTACK_DUAL; + break; + case SS_STAFF: + return LS_SPINATTACK; + break; + default://normal lunge + if ( fallbackToNormalLunge ) + { + vec3_t fwdAngles, jumpFwd; + + VectorCopy( pm->ps->viewangles, fwdAngles ); + fwdAngles[PITCH] = fwdAngles[ROLL] = 0; + //do the lunge + AngleVectors( fwdAngles, jumpFwd, NULL, NULL ); + VectorScale( jumpFwd, 150, pm->ps->velocity ); + pm->ps->velocity[2] = 50; + PM_AddEvent( EV_JUMP ); + + return LS_A_LUNGE; + } + break; + } + } + return LS_NONE; +} + +qboolean PM_CheckLungeAttackMove( void ) +{ + //check to see if it's cancelled? + if ( pm->ps->saber[0].lungeAtkMove == LS_NONE ) + { + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].lungeAtkMove == LS_NONE + || pm->ps->saber[1].lungeAtkMove == LS_INVALID ) + { + return qfalse; + } + } + else + { + return qfalse; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].lungeAtkMove == LS_NONE ) + { + if ( pm->ps->saber[0].lungeAtkMove == LS_NONE + || pm->ps->saber[0].lungeAtkMove == LS_INVALID ) + { + return qfalse; + } + } + } + //do normal checks + if ( pm->ps->saberAnimLevel == SS_FAST//fast + || pm->ps->saberAnimLevel == SS_DUAL//dual + || pm->ps->saberAnimLevel == SS_STAFF //staff + || pm->ps->saberAnimLevel == SS_DESANN + || pm->ps->dualSabers ) + {//alt+back+attack using fast, dual or staff attacks + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->cmd.upmove < 0 || (pm->ps->pm_flags&PMF_DUCKED) ) + {//ducking + if ( pm->ps->legsAnim == BOTH_STAND2 + || pm->ps->legsAnim == BOTH_SABERFAST_STANCE + || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE + || pm->ps->legsAnim == BOTH_SABERSTAFF_STANCE + || pm->ps->legsAnim == BOTH_SABERDUAL_STANCE + || (level.time-pm->ps->lastStationary) <= 500 ) + {//standing or just stopped standing + if ( pm->gent + && pm->gent->NPC //NPC + && pm->gent->NPC->rank >= RANK_LT_JG //high rank + && ( pm->gent->NPC->rank == RANK_LT_JG || Q_irand( -3, pm->gent->NPC->rank ) >= RANK_LT_JG )//Q_irand( 0, pm->gent->NPC->rank ) >= RANK_LT_JG ) + && !Q_irand( 0, 3-g_spskill->integer ) ) + {//only fencer and higher can do this + if ( pm->ps->saberAnimLevel == SS_DESANN ) + { + if ( !Q_irand( 0, 4 ) ) + { + return qtrue; + } + } + else + { + return qtrue; + } + } + } + } + } + else + {//player + if ( G_TryingLungeAttack( pm->gent, &pm->cmd ) + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB )/*pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB*/ )//have enough force power to pull it off + { + return qtrue; + } + } + } + + return qfalse; +} + +saberMoveName_t PM_SaberJumpForwardAttackMove( void ) +{ + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_FB ); + + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].jumpAtkFwdMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkFwdMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].jumpAtkFwdMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove != LS_INVALID ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].jumpAtkFwdMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + { + return LS_NONE; + } + } + if ( pm->ps->saberAnimLevel == SS_DUAL + || pm->ps->saberAnimLevel == SS_STAFF ) + { + pm->cmd.upmove = 0;//no jump just yet + + if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + if ( Q_irand(0, 1) ) + { + return LS_JUMPATTACK_STAFF_LEFT; + } + else + { + return LS_JUMPATTACK_STAFF_RIGHT; + } + } + + return LS_JUMPATTACK_DUAL; + } + else + { + vec3_t fwdAngles, jumpFwd; + + VectorCopy( pm->ps->viewangles, fwdAngles ); + fwdAngles[PITCH] = fwdAngles[ROLL] = 0; + AngleVectors( fwdAngles, jumpFwd, NULL, NULL ); + VectorScale( jumpFwd, 200, pm->ps->velocity ); + pm->ps->velocity[2] = 180; + pm->ps->forceJumpZStart = pm->ps->origin[2];//so we don't take damage if we land at same height + pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; + + //FIXME: NPCs yell? + PM_AddEvent( EV_JUMP ); + G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); + pm->cmd.upmove = 0; + + return LS_A_JUMP_T__B_; + } +} + +qboolean PM_CheckJumpForwardAttackMove( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return qfalse; + } + + //check to see if it's cancelled? + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + { + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[1].jumpAtkFwdMove == LS_INVALID ) + { + return qfalse; + } + } + else + { + return qfalse; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + { + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[0].jumpAtkFwdMove == LS_INVALID ) + { + return qfalse; + } + } + } + //do normal checks + + if ( pm->cmd.forwardmove > 0 //going forward + && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //can force jump + && pm->gent && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped (if not player) + ) + { + if ( pm->ps->saberAnimLevel == SS_DUAL + || pm->ps->saberAnimLevel == SS_STAFF ) + {//dual and staff + if ( !PM_SaberInTransitionAny( pm->ps->saberMove ) //not going to/from/between an attack anim + && !PM_SaberInAttack( pm->ps->saberMove ) //not in attack anim + && pm->ps->weaponTime <= 0//not busy + && (pm->cmd.buttons&BUTTON_ATTACK) )//want to attack + { + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING) )//jumping NPC + { + if ( pm->gent + && pm->gent->NPC + && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) + { + return qtrue; + } + } + } + else + {//PLAYER + if ( G_TryingJumpForwardAttack( pm->gent, &pm->cmd ) + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB ) )//have enough power to attack + { + return qtrue; + } + } + } + } + //check strong + else if ( pm->ps->saberAnimLevel == SS_STRONG //strong style + || pm->ps->saberAnimLevel == SS_DESANN )//desann + { + if ( //&& !PM_InKnockDown( pm->ps ) + !pm->ps->dualSabers + //&& (pm->ps->legsAnim == BOTH_STAND2||pm->ps->legsAnim == BOTH_SABERFAST_STANCE||pm->ps->legsAnim == BOTH_SABERSLOW_STANCE||level.time-pm->ps->lastStationary<=500)//standing or just started moving + ) + {//strong attack: jump-hack + /* + if ( pm->ps->legsAnim == BOTH_STAND2 + || pm->ps->legsAnim == BOTH_SABERFAST_STANCE + || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE + || level.time-pm->ps->lastStationary <= 250 )//standing or just started moving + */ + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING) )//NPC jumping + { + if ( pm->gent + && pm->gent->NPC + && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) + {//only acrobat or boss and higher can do this + if ( pm->ps->legsAnim == BOTH_STAND2 + || pm->ps->legsAnim == BOTH_SABERFAST_STANCE + || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE + || level.time-pm->ps->lastStationary <= 250 ) + {//standing or just started moving + if ( pm->gent->client + && pm->gent->client->NPC_class == CLASS_DESANN ) + { + if ( !Q_irand( 0, 1 ) ) + { + return qtrue; + } + } + else + { + return qtrue; + } + } + } + } + } + else + {//player + if ( G_TryingJumpForwardAttack( pm->gent, &pm->cmd ) + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB ) ) + { + return qtrue; + } + } + } + } + } + return qfalse; +} + +saberMoveName_t PM_SaberFlipOverAttackMove( void ) +{ + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].jumpAtkFwdMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkFwdMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].jumpAtkFwdMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove != LS_INVALID ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].jumpAtkFwdMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + { + return LS_NONE; + } + } + //FIXME: check above for room enough to jump! + //FIXME: while in this jump, keep velocity[2] at a minimum until the end of the anim + vec3_t fwdAngles, jumpFwd; + + VectorCopy( pm->ps->viewangles, fwdAngles ); + fwdAngles[PITCH] = fwdAngles[ROLL] = 0; + AngleVectors( fwdAngles, jumpFwd, NULL, NULL ); + VectorScale( jumpFwd, 150, pm->ps->velocity ); + pm->ps->velocity[2] = 250; + //250 is normalized for a standing enemy at your z level, about 64 tall... adjust for actual maxs[2]-mins[2] of enemy and for zdiff in origins + if ( pm->gent && pm->gent->enemy ) + { //go higher for taller enemies + pm->ps->velocity[2] *= (pm->gent->enemy->maxs[2]-pm->gent->enemy->mins[2])/64.0f; + //go higher for enemies higher than you, lower for those lower than you + float zDiff = pm->gent->enemy->currentOrigin[2] - pm->ps->origin[2]; + pm->ps->velocity[2] += (zDiff)*1.5f; + //clamp to decent-looking values + //FIXME: still jump too low sometimes + if ( zDiff <= 0 && pm->ps->velocity[2] < 200 ) + {//if we're on same level, don't let me jump so low, I clip into the ground + pm->ps->velocity[2] = 200; + } + else if ( pm->ps->velocity[2] < 50 ) + { + pm->ps->velocity[2] = 50; + } + else if ( pm->ps->velocity[2] > 400 ) + { + pm->ps->velocity[2] = 400; + } + } + pm->ps->forceJumpZStart = pm->ps->origin[2];//so we don't take damage if we land at same height + pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; + + //FIXME: NPCs yell? + PM_AddEvent( EV_JUMP ); + G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); + pm->cmd.upmove = 0; + //FIXME: don't allow this to land on other people + + pm->gent->angle = pm->ps->viewangles[YAW];//so we know what yaw we started this at + + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_FB ); + + if ( Q_irand( 0, 1 ) ) + { + return LS_A_FLIP_STAB; + } + else + { + return LS_A_FLIP_SLASH; + } +} + +qboolean PM_CheckFlipOverAttackMove( qboolean checkEnemy ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return qfalse; + } + //check to see if it's cancelled? + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE ) + { + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[1].jumpAtkFwdMove == LS_INVALID ) + { + return qfalse; + } + } + else + { + return qfalse; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkFwdMove == LS_NONE ) + { + if ( pm->ps->saber[0].jumpAtkFwdMove == LS_NONE + || pm->ps->saber[0].jumpAtkFwdMove == LS_INVALID ) + { + return qfalse; + } + } + } + //do normal checks + + if ( (pm->ps->saberAnimLevel == SS_MEDIUM //medium + || pm->ps->saberAnimLevel == SS_TAVION )//tavion + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //can force jump + && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped + ) + { + qboolean tryMove = qfalse; + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->cmd.upmove > 0//want to jump + || (pm->ps->pm_flags&PMF_JUMPING) )//jumping + {//flip over-forward down-attack + if ( (pm->gent->NPC + && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) + && !Q_irand(0, 2) ) )//NPC who can do this, 33% chance + {//only player or acrobat or boss and higher can do this + tryMove = qtrue; + } + } + } + else + {//player + if ( G_TryingJumpForwardAttack( pm->gent, &pm->cmd ) + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB ) )//have enough power + { + if ( !pm->cmd.rightmove ) + { + if ( pm->ps->legsAnim == BOTH_JUMP1 + || pm->ps->legsAnim == BOTH_FORCEJUMP1 + || pm->ps->legsAnim == BOTH_INAIR1 + || pm->ps->legsAnim == BOTH_FORCEINAIR1 ) + {//in a non-flip forward jump + tryMove = qtrue; + } + } + } + } + + if ( tryMove ) + { + if ( !checkEnemy ) + {//based just on command input + return qtrue; + } + else + {//based on presence of enemy + if ( pm->gent->enemy )//have an enemy + { + vec3_t fwdAngles = {0,pm->ps->viewangles[YAW],0}; + if ( pm->gent->enemy->health > 0 + && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period + && pm->gent->enemy->maxs[2] > 12 + && (!pm->gent->enemy->client || !PM_InKnockDownOnGround( &pm->gent->enemy->client->ps ) ) + && DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ) < 10000 + && InFront( pm->gent->enemy->currentOrigin, pm->gent->currentOrigin, fwdAngles, 0.3f ) ) + {//enemy must be alive, not low to ground, close and in front + return qtrue; + } + } + return qfalse; + } + } + } + return qfalse; +} + +saberMoveName_t PM_SaberBackflipAttackMove( void ) +{ + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].jumpAtkBackMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkBackMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].jumpAtkBackMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkBackMove != LS_INVALID ) + { + if ( pm->ps->saber[1].jumpAtkBackMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].jumpAtkBackMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].jumpAtkBackMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkBackMove == LS_NONE ) + { + return LS_NONE; + } + } + pm->cmd.upmove = 0;//no jump just yet + return LS_A_BACKFLIP_ATK; +} + +qboolean PM_CheckBackflipAttackMove( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return qfalse; + } + + //check to see if it's cancelled? + if ( pm->ps->saber[0].jumpAtkBackMove == LS_NONE ) + { + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkBackMove == LS_NONE + || pm->ps->saber[1].jumpAtkBackMove == LS_INVALID ) + { + return qfalse; + } + } + else + { + return qfalse; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].jumpAtkBackMove == LS_NONE ) + { + if ( pm->ps->saber[0].jumpAtkBackMove == LS_NONE + || pm->ps->saber[0].jumpAtkBackMove == LS_INVALID ) + { + return qfalse; + } + } + } + //do normal checks + + if ( pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //can force jump + && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period + && pm->gent && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one + //&& (pm->ps->legsAnim == BOTH_SABERSTAFF_STANCE || level.time-pm->ps->lastStationary<=250)//standing or just started moving + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) )//on ground or just jumped (if not player) + { + if ( pm->cmd.forwardmove < 0 //moving backwards + && pm->ps->saberAnimLevel == SS_STAFF //using staff + && (pm->cmd.upmove > 0 || (pm->ps->pm_flags&PMF_JUMPING)) )//jumping + {//jumping backwards and using staff + if ( !PM_SaberInTransitionAny( pm->ps->saberMove ) //not going to/from/between an attack anim + && !PM_SaberInAttack( pm->ps->saberMove ) //not in attack anim + && pm->ps->weaponTime <= 0//not busy + && (pm->cmd.buttons&BUTTON_ATTACK) )//want to attack + {//not already attacking + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + {//NPC + if ( pm->gent + && pm->gent->NPC + && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) + {//acrobat or boss and higher can do this + return qtrue; + } + } + else + {//player + return qtrue; + } + } + } + } + return qfalse; +} + +saberMoveName_t PM_CheckDualSpinProtect( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return LS_NONE; + } + + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].kataMove != LS_INVALID ) + { + if ( pm->ps->saber[0].kataMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].kataMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].kataMove != LS_INVALID ) + { + if ( pm->ps->saber[1].kataMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].kataMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].kataMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].kataMove == LS_NONE ) + { + return LS_NONE; + } + } + //do normal checks + if ( pm->ps->saberMove == LS_READY//ready + //&& (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//PLAYER ONLY...? + //&& pm->ps->viewangles[0] > 30 //looking down + && pm->ps->saberAnimLevel == SS_DUAL//using dual saber style + && pm->ps->saber[0].Active() && pm->ps->saber[1].Active()//both sabers on + //&& pm->ps->forcePowerLevel[FP_PUSH]>=FORCE_LEVEL_3//force push 3 + //&& ((pm->ps->forcePowersActive&(1<ps->forcePowerDebounce[FP_PUSH]>level.time)//force-pushing + && G_TryingKataAttack( pm->gent, &pm->cmd )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER, qtrue )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER//DUAL_SPIN_PROTECT_POWER//force push 3 + && (pm->cmd.buttons&BUTTON_ATTACK)//pressing attack + ) + {//FIXME: some NPC logic to do this? + /* + if ( (pm->ps->pm_flags&PMF_DUCKED||pm->cmd.upmove<0)//crouching + && g_crosshairEntNum >= ENTITYNUM_WORLD ) + */ + { + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_PUSH, SABER_ALT_ATTACK_POWER, qtrue );//drain the required force power + } + return LS_DUAL_SPIN_PROTECT; + } + } + return LS_NONE; +} + +saberMoveName_t PM_CheckStaffKata( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return LS_NONE; + } + + //see if we have an overridden (or cancelled) kata move + if ( pm->ps->saber[0].kataMove != LS_INVALID ) + { + if ( pm->ps->saber[0].kataMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[0].kataMove; + } + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].kataMove != LS_INVALID ) + { + if ( pm->ps->saber[1].kataMove != LS_NONE ) + { + return (saberMoveName_t)pm->ps->saber[1].kataMove; + } + } + } + //no overrides, cancelled? + if ( pm->ps->saber[0].kataMove == LS_NONE ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers ) + { + if ( pm->ps->saber[1].kataMove == LS_NONE ) + { + return LS_NONE; + } + } + //do normal checks + if ( pm->ps->saberMove == LS_READY//ready + //&& (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//PLAYER ONLY...? + //&& pm->ps->viewangles[0] > 30 //looking down + && pm->ps->saberAnimLevel == SS_STAFF//using dual saber style + && pm->ps->saber[0].Active()//saber on + //&& pm->ps->forcePowerLevel[FP_PUSH]>=FORCE_LEVEL_3//force push 3 + //&& ((pm->ps->forcePowersActive&(1<ps->forcePowerDebounce[FP_PUSH]>level.time)//force-pushing + && G_TryingKataAttack( pm->gent, &pm->cmd )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER, qtrue )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER//DUAL_SPIN_PROTECT_POWER//force push 3 + && (pm->cmd.buttons&BUTTON_ATTACK)//pressing attack + ) + {//FIXME: some NPC logic to do this? + /* + if ( (pm->ps->pm_flags&PMF_DUCKED||pm->cmd.upmove<0)//crouching + && g_crosshairEntNum >= ENTITYNUM_WORLD ) + */ + { + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER, qtrue );//drain the required force power + } + return LS_STAFF_SOULCAL; + } + } + return LS_NONE; +} + +extern qboolean WP_ForceThrowable( gentity_t *ent, gentity_t *forwardEnt, gentity_t *self, qboolean pull, float cone, float radius, vec3_t forward ); +saberMoveName_t PM_CheckPullAttack( void ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + return LS_NONE; + } + + if ( (pm->ps->saber[0].saberFlags&SFL_NO_PULL_ATTACK) ) + { + return LS_NONE; + } + if ( pm->ps->dualSabers + && (pm->ps->saber[1].saberFlags&SFL_NO_PULL_ATTACK) ) + { + return LS_NONE; + } + + if ( (pm->ps->saberMove == LS_READY||PM_SaberInReturn(pm->ps->saberMove)||PM_SaberInReflect(pm->ps->saberMove))//ready + //&& (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//PLAYER ONLY + && pm->ps->saberAnimLevel >= SS_FAST//single saber styles - FIXME: Tavion? + && pm->ps->saberAnimLevel <= SS_STRONG//single saber styles - FIXME: Tavion? + && G_TryingPullAttack( pm->gent, &pm->cmd, qfalse )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS)//holding focus + //&& pm->cmd.forwardmove<0//pulling back + && (pm->cmd.buttons&BUTTON_ATTACK)//attacking + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB//have enough power + ) + {//FIXME: some NPC logic to do this? + qboolean doMove = g_saberNewControlScheme->integer?qtrue:qfalse;//in new control scheme, can always do this, even if there's no-one to do it to + if ( g_saberNewControlScheme->integer + || g_crosshairEntNum < ENTITYNUM_WORLD )//in old control scheme, there has to be someone there + { + saberMoveName_t pullAttackMove = LS_NONE; + if ( pm->ps->saberAnimLevel == SS_FAST ) + { + pullAttackMove = LS_PULL_ATTACK_STAB; + } + else + { + pullAttackMove = LS_PULL_ATTACK_SWING; + } + + if ( g_crosshairEntNum < ENTITYNUM_WORLD + && pm->gent && pm->gent->client ) + { + gentity_t *targEnt = &g_entities[g_crosshairEntNum]; + if ( targEnt->client + && targEnt->health > 0 + //FIXME: check other things like in knockdown, saberlock, uninterruptable anims, etc. + && !PM_InOnGroundAnim( &targEnt->client->ps ) + && !PM_LockedAnim( targEnt->client->ps.legsAnim ) + && !PM_SuperBreakLoseAnim( targEnt->client->ps.legsAnim ) + && !PM_SuperBreakWinAnim( targEnt->client->ps.legsAnim ) + && targEnt->client->ps.saberLockTime <= 0 + && WP_ForceThrowable( targEnt, targEnt, pm->gent, qtrue, 1.0f, 0.0f, NULL ) ) + { + if ( !g_saberNewControlScheme->integer ) + {//in old control scheme, make sure they're close or far enough away for the move we'll be doing + float targDist = Distance( targEnt->currentOrigin, pm->ps->origin ); + if ( pullAttackMove == LS_PULL_ATTACK_STAB ) + {//must be closer than 512 + if ( targDist > 384.0f ) + { + return LS_NONE; + } + } + else//if ( pullAttackMove == LS_PULL_ATTACK_SWING ) + {//must be farther than 256 + if ( targDist > 512.0f ) + { + return LS_NONE; + } + if ( targDist < 192.0f ) + { + return LS_NONE; + } + } + } + + vec3_t targAngles = {0,targEnt->client->ps.viewangles[YAW],0}; + if ( InFront( pm->ps->origin, targEnt->currentOrigin, targAngles ) ) + { + NPC_SetAnim( targEnt, SETANIM_BOTH, BOTH_PULLED_INAIR_F, SETANIM_FLAG_OVERRIDE, SETANIM_FLAG_HOLD ); + } + else + { + NPC_SetAnim( targEnt, SETANIM_BOTH, BOTH_PULLED_INAIR_B, SETANIM_FLAG_OVERRIDE, SETANIM_FLAG_HOLD ); + } + //hold the anim until I'm with done pull anim + targEnt->client->ps.legsAnimTimer = targEnt->client->ps.torsoAnimTimer = PM_AnimLength( pm->gent->client->clientInfo.animFileIndex, (animNumber_t)saberMoveData[pullAttackMove].animToUse ); + //set pullAttackTime + pm->gent->client->ps.pullAttackTime = targEnt->client->ps.pullAttackTime = level.time+targEnt->client->ps.legsAnimTimer; + //make us know about each other + pm->gent->client->ps.pullAttackEntNum = g_crosshairEntNum; + targEnt->client->ps.pullAttackEntNum = pm->ps->clientNum; + //do effect and sound on me + pm->ps->powerups[PW_FORCE_PUSH] = level.time + 1000; + if ( pm->gent ) + { + G_Sound( pm->gent, G_SoundIndex( "sound/weapons/force/pull.wav" ) ); + } + doMove = qtrue; + } + } + if ( doMove ) + { + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_PULL, SABER_ALT_ATTACK_POWER_FB ); + } + return pullAttackMove; + } + } + } + return LS_NONE; +} + +saberMoveName_t PM_CheckPlayerAttackFromParry( int curmove ) +{ + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) + { + if ( curmove >= LS_PARRY_UP + && curmove <= LS_REFLECT_LL ) + {//in a parry + switch ( saberMoveData[curmove].endQuad ) + { + case Q_T: + return LS_A_T2B; + break; + case Q_TR: + return LS_A_TR2BL; + break; + case Q_TL: + return LS_A_TL2BR; + break; + case Q_BR: + return LS_A_BR2TL; + break; + case Q_BL: + return LS_A_BL2TR; + break; + //shouldn't be a parry that ends at L, R or B + } + } + } + return LS_NONE; +} + + +saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int curmove ) +{ + qboolean noSpecials = qfalse; + + if ( pm->ps->clientNum < MAX_CLIENTS + && PM_InSecondaryStyle() ) + { + noSpecials = qtrue; + } + + saberMoveName_t overrideJumpRightAttackMove = LS_INVALID; + if ( pm->ps->saber[0].jumpAtkRightMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkRightMove != LS_NONE ) + {//actually overriding + overrideJumpRightAttackMove = (saberMoveName_t)pm->ps->saber[0].jumpAtkRightMove; + } + else if ( pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkRightMove > LS_NONE ) + {//would be cancelling it, but check the second saber, too + overrideJumpRightAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkRightMove; + } + else + {//nope, just cancel it + overrideJumpRightAttackMove = LS_NONE; + } + } + else if ( pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkRightMove != LS_INVALID ) + {//first saber not overridden, check second + overrideJumpRightAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkRightMove; + } + + saberMoveName_t overrideJumpLeftAttackMove = LS_INVALID; + if ( pm->ps->saber[0].jumpAtkLeftMove != LS_INVALID ) + { + if ( pm->ps->saber[0].jumpAtkLeftMove != LS_NONE ) + {//actually overriding + overrideJumpLeftAttackMove = (saberMoveName_t)pm->ps->saber[0].jumpAtkLeftMove; + } + else if ( pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkLeftMove > LS_NONE ) + {//would be cancelling it, but check the second saber, too + overrideJumpLeftAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkLeftMove; + } + else + {//nope, just cancel it + overrideJumpLeftAttackMove = LS_NONE; + } + } + else if ( pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkLeftMove != LS_INVALID ) + {//first saber not overridden, check second + overrideJumpLeftAttackMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkLeftMove; + } + if ( rightmove > 0 ) + {//moving right + if ( !noSpecials + && overrideJumpRightAttackMove != LS_NONE + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped + && (pm->cmd.buttons&BUTTON_ATTACK)//hitting attack + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0//have force jump 1 at least + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_LR )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_LR//have enough power + && (((pm->ps->clientNum>=MAX_CLIENTS&&!PM_ControlledByPlayer())&&pm->cmd.upmove > 0)//jumping NPC + ||((pm->ps->clientNumgent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/)) )//focus-holding player + {//cartwheel right + vec3_t right, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_LR ); + } + pm->cmd.upmove = 0; + if ( overrideJumpRightAttackMove != LS_INVALID ) + {//overridden with another move + return overrideJumpRightAttackMove; + } + else if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + AngleVectors( fwdAngles, NULL, right, NULL ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA( pm->ps->velocity, 190, right, pm->ps->velocity ); + return LS_BUTTERFLY_RIGHT; + } + else + { + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_CARTWHEELS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_CARTWHEELS)) ) + {//okay to do cartwheels with this saber + /* + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//still on ground + VectorClear( pm->ps->velocity ); + return LS_JUMPATTACK_CART_RIGHT; + } + else + */ + {//in air + AngleVectors( fwdAngles, NULL, right, NULL ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA( pm->ps->velocity, 190, right, pm->ps->velocity ); + PM_SetJumped( JUMP_VELOCITY, qtrue ); + return LS_JUMPATTACK_ARIAL_RIGHT; + } + } + } + } + else if ( pm->ps->legsAnim != BOTH_CARTWHEEL_RIGHT + && pm->ps->legsAnim != BOTH_ARIAL_RIGHT ) + {//not in a cartwheel/arial + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/ )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + if ( forwardmove > 0 ) + {//forward right = TL2BR slash + return LS_A_TL2BR; + } + else if ( forwardmove < 0 ) + {//backward right = BL2TR uppercut + return LS_A_BL2TR; + } + else + {//just right is a left slice + return LS_A_L2R; + } + } + } + else if ( rightmove < 0 ) + {//moving left + if ( !noSpecials + && overrideJumpLeftAttackMove != LS_NONE + && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=250) //on ground or just jumped + && (pm->cmd.buttons&BUTTON_ATTACK)//hitting attack + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0//have force jump 1 at least + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_LR )//pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_LR//have enough power + && (((pm->ps->clientNum>=MAX_CLIENTS&&!PM_ControlledByPlayer())&&pm->cmd.upmove > 0)//jumping NPC + ||((pm->ps->clientNumgent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/)) )//focus-holding player + {//cartwheel left + vec3_t right, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; + if ( pm->gent ) + { + G_DrainPowerForSpecialMove( pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_LR ); + } + pm->cmd.upmove = 0; + if ( overrideJumpRightAttackMove != LS_INVALID ) + {//overridden with another move + return overrideJumpRightAttackMove; + } + else if ( pm->ps->saberAnimLevel == SS_STAFF ) + { + AngleVectors( fwdAngles, NULL, right, NULL ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA( pm->ps->velocity, -190, right, pm->ps->velocity ); + return LS_BUTTERFLY_LEFT; + } + else + { + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_CARTWHEELS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_CARTWHEELS)) ) + {//okay to do cartwheels with this saber + /* + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//still on ground + VectorClear( pm->ps->velocity ); + return LS_JUMPATTACK_ARIAL_LEFT; + } + else + */ + { + AngleVectors( fwdAngles, NULL, right, NULL ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA( pm->ps->velocity, -190, right, pm->ps->velocity ); + PM_SetJumped( JUMP_VELOCITY, qtrue ); + return LS_JUMPATTACK_CART_LEFT; + } + } + } + } + else if ( pm->ps->legsAnim != BOTH_CARTWHEEL_LEFT + && pm->ps->legsAnim != BOTH_ARIAL_LEFT ) + {//not in a left cartwheel/arial + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/ )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + if ( forwardmove > 0 ) + {//forward left = TR2BL slash + return LS_A_TR2BL; + } + else if ( forwardmove < 0 ) + {//backward left = BR2TL uppercut + return LS_A_BR2TL; + } + else + {//just left is a right slice + return LS_A_R2L; + } + } + } + else + {//not moving left or right + if ( forwardmove > 0 ) + {//forward= T2B slash + saberMoveName_t stabDownMove = noSpecials?LS_NONE:PM_CheckStabDown(); + if ( stabDownMove != LS_NONE ) + { + return stabDownMove; + } + if ( ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) )//player in third person, not zoomed in + {//player in thirdperson, not zoomed in + //flip-over attack logic + if ( !noSpecials && PM_CheckFlipOverAttackMove( qfalse ) ) + {//flip over-forward down-attack + return PM_SaberFlipOverAttackMove(); + } + //lunge attack logic + else if ( PM_CheckLungeAttackMove() ) + { + return PM_SaberLungeAttackMove( qtrue ); + } + //jump forward attack logic + else if ( !noSpecials && PM_CheckJumpForwardAttackMove() ) + { + return PM_SaberJumpForwardAttackMove(); + } + } + + //player NPC with enemy: autoMove logic + if ( pm->gent + && pm->gent->enemy + && pm->gent->enemy->client ) + {//I have an active enemy + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) + {//a player who is running at an enemy + //if the enemy is not a jedi, don't use top-down, pick a diagonal or side attack + if ( pm->gent->enemy->s.weapon != WP_SABER + && pm->gent->enemy->client->NPC_class != CLASS_REMOTE//too small to do auto-aiming accurately + && pm->gent->enemy->client->NPC_class != CLASS_SEEKER//too small to do auto-aiming accurately + && pm->gent->enemy->client->NPC_class != CLASS_GONK//too short to do auto-aiming accurately + && pm->gent->enemy->client->NPC_class != CLASS_HOWLER//too short to do auto-aiming accurately + && g_saberAutoAim->integer ) + { + saberMoveName_t autoMove = PM_AttackForEnemyPos( qfalse, (qboolean)(pm->ps->clientNum>=MAX_CLIENTS&&!PM_ControlledByPlayer()) ); + if ( autoMove != LS_INVALID ) + { + return autoMove; + } + } + } + + if ( pm->ps->clientNum>=MAX_CLIENTS && !PM_ControlledByPlayer() ) //NPC ONLY + {//NPC + if ( PM_CheckFlipOverAttackMove( qtrue ) ) + { + return PM_SaberFlipOverAttackMove(); + } + } + } + + //Regular NPCs + if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) //NPC ONLY + {//NPC or player in third person, not zoomed in + //fwd jump attack logic + if ( PM_CheckJumpForwardAttackMove() ) + { + return PM_SaberJumpForwardAttackMove(); + } + //lunge attack logic + else if ( PM_CheckLungeAttackMove() ) + { + return PM_SaberLungeAttackMove( qtrue ); + } + } + + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent,&pm->cmd) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + return LS_A_T2B; + } + else if ( forwardmove < 0 ) + {//backward= T2B slash//B2T uppercut? + if ( g_saberNewControlScheme->integer ) + { + saberMoveName_t pullAtk = PM_CheckPullAttack(); + if ( pullAtk != LS_NONE ) + { + return pullAtk; + } + } + + if ( g_saberNewControlScheme->integer + && (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) //PLAYER ONLY + && (pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus, trying special backwards attacks + {//player lunge attack logic + if ( ( pm->ps->dualSabers //or dual + || pm->ps->saberAnimLevel == SS_STAFF )//pm->ps->SaberStaff() )//or staff + && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB )/*pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_FB*/ )//have enough force power to pull it off + {//alt+back+attack using fast, dual or staff attacks + PM_SaberLungeAttackMove( qfalse ); + } + } + else if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) //NPC + || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) )//player in third person, not zooomed + {//NPC or player in third person, not zoomed + if ( PM_CheckBackflipAttackMove() ) + { + return PM_SaberBackflipAttackMove();//backflip attack + } + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent,&pm->cmd) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + //if ( !PM_InKnockDown( pm->ps ) ) + //check backstabs + if ( !(pm->ps->saber[0].saberFlags&SFL_NO_BACK_ATTACK) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_BACK_ATTACK)) ) + {//okay to do backstabs with this saber + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + {//only when on ground + if ( pm->gent && pm->gent->enemy ) + {//FIXME: or just trace for a valid enemy standing behind me? And no enemy in front? + vec3_t enemyDir, faceFwd, facingAngles = {0, pm->ps->viewangles[YAW], 0}; + AngleVectors( facingAngles, faceFwd, NULL, NULL ); + VectorSubtract( pm->gent->enemy->currentOrigin, pm->ps->origin, enemyDir ); + float dot = DotProduct( enemyDir, faceFwd ); + if ( dot < 0 ) + {//enemy is behind me + if ( dot < -0.75f + && DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ) < 16384//128 squared + && (pm->ps->saberAnimLevel == SS_FAST || pm->ps->saberAnimLevel == SS_STAFF || (pm->gent->client &&(pm->gent->client->NPC_class == CLASS_TAVION||pm->gent->client->NPC_class == CLASS_ALORA)&&Q_irand(0,1))) ) + {//fast attacks and Tavion + if ( !(pm->ps->pm_flags&PMF_DUCKED) && pm->cmd.upmove >= 0 ) + {//can't do it while ducked? + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || (pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG) ) + {//only fencers and above can do this + return LS_A_BACKSTAB; + } + } + } + else if ( pm->ps->saberAnimLevel != SS_FAST + && pm->ps->saberAnimLevel != SS_STAFF ) + {//medium and higher attacks + if ( (pm->ps->pm_flags&PMF_DUCKED) || pm->cmd.upmove < 0 ) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; + } + } + } + else + {//enemy in front + float enemyDistSq = DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ); + if ( ((pm->ps->saberAnimLevel == FORCE_LEVEL_1 || + pm->ps->saberAnimLevel == SS_STAFF || + pm->gent->client->NPC_class == CLASS_TAVION || + pm->gent->client->NPC_class == CLASS_ALORA || + (pm->gent->client->NPC_class == CLASS_DESANN && !Q_irand(0,3))) && + enemyDistSq > 16384) || + pm->gent->enemy->health <= 0 )//128 squared + {//my enemy is pretty far in front of me and I'm using fast attacks + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || + ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) ) + {//only fencers and higher can do this, higher rank does it more + if ( PM_CheckEnemyInBack( 128 ) ) + { + return PM_PickBackStab(); + } + } + } + else if ( ((pm->ps->saberAnimLevel >= FORCE_LEVEL_2 || pm->gent->client->NPC_class == CLASS_DESANN) && enemyDistSq > 40000) || pm->gent->enemy->health <= 0 )//200 squared + {//enemy is very faw away and I'm using medium/strong attacks + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || + ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) ) + {//only fencers and higher can do this, higher rank does it more + if ( PM_CheckEnemyInBack( 164 ) ) + { + return PM_PickBackStab(); + } + } + } + } + } + else + {//no current enemy + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->gent && pm->gent->client ) + {//only player + if ( PM_CheckEnemyInBack( 128 ) ) + { + return PM_PickBackStab(); + } + } + } + } + } + } + + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + //else just swing down + return LS_A_T2B; + } + else + {//not moving in any direction + if ( PM_SaberInBounce( curmove ) ) + {//bounces should go to their default attack if you don't specify a direction but are attacking + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial(pm->gent,&pm->cmd) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + saberMoveName_t newmove; + if ( pm->ps->clientNum && !PM_ControlledByPlayer() && Q_irand( 0, 3 ) ) + {//use NPC random + newmove = PM_NPCSaberAttackFromQuad( saberMoveData[curmove].endQuad ); + } + else + {//player uses chain-attack + newmove = saberMoveData[curmove].chain_attack; + } + if ( PM_SaberKataDone( curmove, newmove ) ) + { + return saberMoveData[curmove].chain_idle; + } + else + { + return newmove; + } + } + else if ( PM_SaberInKnockaway( curmove ) ) + {//bounces should go to their default attack if you don't specify a direction but are attacking + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + saberMoveName_t newmove; + if ( pm->ps->clientNum && !PM_ControlledByPlayer() && Q_irand( 0, 3 ) ) + {//use NPC random + newmove = PM_NPCSaberAttackFromQuad( saberMoveData[curmove].endQuad ); + } + else + { + if ( pm->ps->saberAnimLevel == SS_FAST || + pm->ps->saberAnimLevel == SS_TAVION ) + {//player is in fast attacks, so come right back down from the same spot + newmove = PM_AttackMoveForQuad( saberMoveData[curmove].endQuad ); + } + else + {//use a transition to wrap to another attack from a different dir + newmove = saberMoveData[curmove].chain_attack; + } + } + if ( PM_SaberKataDone( curmove, newmove ) ) + { + return saberMoveData[curmove].chain_idle; + } + else + { + return newmove; + } + } + else if ( curmove == LS_READY + || curmove == LS_A_FLIP_STAB + || curmove == LS_A_FLIP_SLASH + || ( curmove >= LS_PARRY_UP + && curmove <= LS_REFLECT_LL ) ) + {//Not moving at all, not too busy to attack + //push + lookdown + attack + dual sabers = LS_DUAL_SPIN_PROTECT + if ( g_saberNewControlScheme->integer ) + { + if ( PM_CheckDualSpinProtect() ) + { + return LS_DUAL_SPIN_PROTECT; + } + if ( PM_CheckStaffKata() ) + { + return LS_STAFF_SOULCAL; + } + } + if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) //PLAYER ONLY + {//player + if ( G_TryingSpecial( pm->gent, &pm->cmd ) )//(pm->cmd.buttons&BUTTON_FORCE_FOCUS) )//Holding focus + {//if no special worked, do nothing + return LS_NONE; + } + } + //checked all special attacks, if we're in a parry, attack from that move + saberMoveName_t parryAttackMove = PM_CheckPlayerAttackFromParry( curmove ); + if ( parryAttackMove != LS_NONE ) + { + return parryAttackMove; + } + //check regular attacks + if ( pm->ps->clientNum || g_saberAutoAim->integer ) + {//auto-aim + if ( pm->gent && pm->gent->enemy ) + {//based on enemy position, pick a proper attack + saberMoveName_t autoMove = PM_AttackForEnemyPos( qtrue, (qboolean)(pm->ps->clientNum>=MAX_CLIENTS) ); + if ( autoMove != LS_INVALID ) + { + return autoMove; + } + } + else if ( fabs(pm->ps->viewangles[0]) > 30 ) + {//looking far up or far down uses the top to bottom attack, presuming you want a vertical attack + return LS_A_T2B; + } + } + else + {//for now, just pick a random attack + return ((saberMoveName_t)Q_irand( LS_A_TL2BR, LS_A_T2B )); + } + } + } + } + //FIXME: pick a return? + return LS_NONE; +} + +saberMoveName_t PM_SaberAnimTransitionMove( saberMoveName_t curmove, saberMoveName_t newmove ) +{ + //FIXME: take FP_SABER_OFFENSE into account here somehow? + int retmove = newmove; + if ( curmove == LS_READY ) + {//just standing there + switch ( newmove ) + { + case LS_A_TL2BR: + case LS_A_L2R: + case LS_A_BL2TR: + case LS_A_BR2TL: + case LS_A_R2L: + case LS_A_TR2BL: + case LS_A_T2B: + //transition is the start + retmove = LS_S_TL2BR + (newmove-LS_A_TL2BR); + break; + default: + break; + } + } + else + { + switch ( newmove ) + { + //transitioning to ready pose + case LS_READY: + switch ( curmove ) + { + //transitioning from an attack + case LS_A_TL2BR: + case LS_A_L2R: + case LS_A_BL2TR: + case LS_A_BR2TL: + case LS_A_R2L: + case LS_A_TR2BL: + case LS_A_T2B: + //transition is the return + retmove = LS_R_TL2BR + (newmove-LS_A_TL2BR); + break; + default: + break; + } + break; + //transitioning to an attack + case LS_A_TL2BR: + case LS_A_L2R: + case LS_A_BL2TR: + case LS_A_BR2TL: + case LS_A_R2L: + case LS_A_TR2BL: + case LS_A_T2B: + if ( newmove == curmove ) + {//FIXME: need a spin or something or go to next level, but for now, just play the return + //going into another attack... + //allow endless chaining in level 1 attacks, several in level 2 and only one or a few in level 3 + //FIXME: don't let strong attacks chain to an attack in the opposite direction ( > 45 degrees?) + if ( PM_SaberKataDone( curmove, newmove ) ) + {//done with this kata, must return to ready before attack again + retmove = LS_R_TL2BR + (newmove-LS_A_TL2BR); + } + else + {//okay to chain to another attack + retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad]; + } + } + else if ( saberMoveData[curmove].endQuad == saberMoveData[newmove].startQuad ) + {//new move starts from same quadrant + retmove = newmove; + } + else + { + switch ( curmove ) + { + //transitioning from an attack + case LS_A_TL2BR: + case LS_A_L2R: + case LS_A_BL2TR: + case LS_A_BR2TL: + case LS_A_R2L: + case LS_A_TR2BL: + case LS_A_T2B: + case LS_D1_BR: + case LS_D1__R: + case LS_D1_TR: + case LS_D1_T_: + case LS_D1_TL: + case LS_D1__L: + case LS_D1_BL: + case LS_D1_B_: + retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad]; + break; + //transitioning from a return + case LS_R_TL2BR: + case LS_R_L2R: + case LS_R_BL2TR: + case LS_R_BR2TL: + case LS_R_R2L: + case LS_R_TR2BL: + case LS_R_T2B: + //transitioning from a bounce + /* + case LS_BOUNCE_UL2LL: + case LS_BOUNCE_LL2UL: + case LS_BOUNCE_L2LL: + case LS_BOUNCE_L2UL: + case LS_BOUNCE_UR2LR: + case LS_BOUNCE_LR2UR: + case LS_BOUNCE_R2LR: + case LS_BOUNCE_R2UR: + case LS_BOUNCE_TOP: + case LS_OVER_UR2UL: + case LS_OVER_UL2UR: + case LS_BOUNCE_UR: + case LS_BOUNCE_UL: + case LS_BOUNCE_LR: + case LS_BOUNCE_LL: + */ + //transitioning from a parry/reflection/knockaway/broken parry + case LS_PARRY_UP: + case LS_PARRY_UR: + case LS_PARRY_UL: + case LS_PARRY_LR: + case LS_PARRY_LL: + case LS_REFLECT_UP: + case LS_REFLECT_UR: + case LS_REFLECT_UL: + case LS_REFLECT_LR: + case LS_REFLECT_LL: + case LS_K1_T_: + case LS_K1_TR: + case LS_K1_TL: + case LS_K1_BR: + case LS_K1_BL: + case LS_V1_BR: + case LS_V1__R: + case LS_V1_TR: + case LS_V1_T_: + case LS_V1_TL: + case LS_V1__L: + case LS_V1_BL: + case LS_V1_B_: + case LS_H1_T_: + case LS_H1_TR: + case LS_H1_TL: + case LS_H1_BR: + case LS_H1_BL: + retmove = transitionMove[saberMoveData[curmove].endQuad][saberMoveData[newmove].startQuad]; + break; + //NB: transitioning from transitions is fine + default: + break; + } + } + break; + //transitioning to any other anim is not supported + default: + break; + } + } + + if ( retmove == LS_NONE ) + { + return newmove; + } + + return ((saberMoveName_t)retmove); +} + +/* +------------------------- +PM_LegsAnimForFrame +Returns animNumber for current frame +------------------------- +*/ +int PM_LegsAnimForFrame( gentity_t *ent, int legsFrame ) +{ + //Must be a valid client + if ( ent->client == NULL ) + return -1; + + //Must have a file index entry + if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) + return -1; + + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + int glaIndex = gi.G2API_GetAnimIndex(&(ent->ghoul2[0])); + + for ( int animation = 0; animation < BOTH_CIN_1; animation++ ) //first anim after last legs + { + if ( animation >= TORSO_DROPWEAP1 && animation < LEGS_TURN1 ) //first legs only anim + {//not a possible legs anim + continue; + } + + if ( animations[animation].glaIndex != glaIndex ) + { + continue; + } + + if ( animations[animation].firstFrame > legsFrame ) + {//This anim starts after this frame + continue; + } + + if ( animations[animation].firstFrame + animations[animation].numFrames < legsFrame ) + {//This anim ends before this frame + continue; + } + //else, must be in this anim! + return animation; + } + + //Not in ANY torsoAnim? SHOULD NEVER HAPPEN +// assert(0); + return -1; +} + +int PM_ValidateAnimRange( const int startFrame, const int endFrame, const float animSpeed ) +{//given a startframe and endframe, see if that lines up with any known animation + animation_t *animations = level.knownAnimFileSets[0].animations; + + for ( int anim = 0; anim < MAX_ANIMATIONS; anim++ ) + { + if ( animSpeed < 0 ) + {//playing backwards + if ( animations[anim].firstFrame == endFrame ) + { + if ( animations[anim].numFrames + animations[anim].firstFrame == startFrame ) + { + //Com_Printf( "valid reverse anim: %s\n", animTable[anim].name ); + return anim; + } + } + } + else + {//playing forwards + if ( animations[anim].firstFrame == startFrame ) + {//This anim starts on this frame + if ( animations[anim].firstFrame + animations[anim].numFrames == endFrame ) + {//This anim ends on this frame + //Com_Printf( "valid forward anim: %s\n", animTable[anim].name ); + return anim; + } + } + } + //else, must not be this anim! + } + + //Not in ANY anim? SHOULD NEVER HAPPEN + Com_Printf( "invalid anim range %d to %d, speed %4.2f\n", startFrame, endFrame, animSpeed ); + return -1; +} +/* +------------------------- +PM_TorsoAnimForFrame +Returns animNumber for current frame +------------------------- +*/ +int PM_TorsoAnimForFrame( gentity_t *ent, int torsoFrame ) +{ + //Must be a valid client + if ( ent->client == NULL ) + return -1; + + //Must have a file index entry + if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) + return -1; + + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + int glaIndex = gi.G2API_GetAnimIndex(&(ent->ghoul2[0])); + + for ( int animation = 0; animation < LEGS_TURN1; animation++ ) //first legs only anim + { + if ( animations[animation].glaIndex != glaIndex ) + { + continue; + } + + if ( animations[animation].firstFrame > torsoFrame ) + {//This anim starts after this frame + continue; + } + + if ( animations[animation].firstFrame + animations[animation].numFrames < torsoFrame ) + {//This anim ends before this frame + continue; + } + //else, must be in this anim! + return animation; + } + + //Not in ANY torsoAnim? SHOULD NEVER HAPPEN +// assert(0); + return -1; +} + +qboolean PM_FinishedCurrentLegsAnim( gentity_t *self ) +{ + int junk, curFrame; + float currentFrame, animSpeed; + + if ( !self->client ) + { + return qtrue; + } + + gi.G2API_GetBoneAnimIndex( &self->ghoul2[self->playerModel], self->rootBone, (cg.time?cg.time:level.time), ¤tFrame, &junk, &junk, &junk, &animSpeed, NULL ); + curFrame = floor( currentFrame ); + + int legsAnim = self->client->ps.legsAnim; + animation_t *animations = level.knownAnimFileSets[self->client->clientInfo.animFileIndex].animations; + + if ( curFrame >= animations[legsAnim].firstFrame + (animations[legsAnim].numFrames - 2) ) + { + return qtrue; + } + + return qfalse; +} + +/* +------------------------- +PM_HasAnimation +------------------------- +*/ + +qboolean PM_HasAnimation( gentity_t *ent, int animation ) +{ + //Must be a valid client + if ( !ent || ent->client == NULL ) + return qfalse; + + //must be a valid anim number + if ( animation < 0 || animation >= MAX_ANIMATIONS ) + { + return qfalse; + } + //Must have a file index entry + if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) + return qfalse; + + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + + //No frames, no anim + if ( animations[animation].numFrames == 0 ) + return qfalse; + + //Has the sequence + return qtrue; +} + +int PM_PickAnim( gentity_t *self, int minAnim, int maxAnim ) +{ + int anim; + int count = 0; + + if ( !self ) + { + return Q_irand(minAnim, maxAnim); + } + + do + { + anim = Q_irand(minAnim, maxAnim); + count++; + } + while ( !PM_HasAnimation( self, anim ) && count < 1000 ); + + return anim; +} + +/* +------------------------- +PM_AnimLength +------------------------- +*/ + +int PM_AnimLength( int index, animNumber_t anim ) +{ + if ( ValidAnimFileIndex( index ) == false ) + return 0; + + return level.knownAnimFileSets[index].animations[anim].numFrames * abs(level.knownAnimFileSets[index].animations[anim].frameLerp); +} + +/* +------------------------- +PM_SetLegsAnimTimer +------------------------- +*/ + +void PM_SetLegsAnimTimer( gentity_t *ent, int *legsAnimTimer, int time ) +{ + *legsAnimTimer = time; + + if ( *legsAnimTimer < 0 && time != -1 ) + {//Cap timer to 0 if was counting down, but let it be -1 if that was intentional + *legsAnimTimer = 0; + } + + if ( !*legsAnimTimer && ent && Q3_TaskIDPending( ent, TID_ANIM_LOWER ) ) + {//Waiting for legsAnimTimer to complete, and it just got set to zero + if ( !Q3_TaskIDPending( ent, TID_ANIM_BOTH) ) + {//Not waiting for top + Q3_TaskIDComplete( ent, TID_ANIM_LOWER ); + } + else + {//Waiting for both to finish before complete + Q3_TaskIDClear( &ent->taskID[TID_ANIM_LOWER] );//Bottom is done, regardless + if ( !Q3_TaskIDPending( ent, TID_ANIM_UPPER) ) + {//top is done and we're done + Q3_TaskIDComplete( ent, TID_ANIM_BOTH ); + } + } + } +} + +/* +------------------------- +PM_SetTorsoAnimTimer +------------------------- +*/ + +void PM_SetTorsoAnimTimer( gentity_t *ent, int *torsoAnimTimer, int time ) +{ + *torsoAnimTimer = time; + + if ( *torsoAnimTimer < 0 && time != -1 ) + {//Cap timer to 0 if was counting down, but let it be -1 if that was intentional + *torsoAnimTimer = 0; + } + + if ( !*torsoAnimTimer && ent && Q3_TaskIDPending( ent, TID_ANIM_UPPER ) ) + {//Waiting for torsoAnimTimer to complete, and it just got set to zero + if ( !Q3_TaskIDPending( ent, TID_ANIM_BOTH) ) + {//Not waiting for bottom + Q3_TaskIDComplete( ent, TID_ANIM_UPPER ); + } + else + {//Waiting for both to finish before complete + Q3_TaskIDClear( &ent->taskID[TID_ANIM_UPPER] );//Top is done, regardless + if ( !Q3_TaskIDPending( ent, TID_ANIM_LOWER) ) + {//lower is done and we're done + Q3_TaskIDComplete( ent, TID_ANIM_BOTH ); + } + } + } +} + +extern qboolean PM_SpinningSaberAnim( int anim ); +extern float saberAnimSpeedMod[NUM_FORCE_POWER_LEVELS]; +void PM_SaberStartTransAnim( int saberAnimLevel, int anim, float *animSpeed, gentity_t *gent ) +{ + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_ROLL_STAB ) + { + if ( g_saberAnimSpeed->value != 1.0f ) + { + *animSpeed *= g_saberAnimSpeed->value; + } + else if ( gent && gent->client && gent->client->ps.weapon == WP_SABER ) + { + if ( gent->client->ps.saber[0].animSpeedScale != 1.0f ) + { + *animSpeed *= gent->client->ps.saber[0].animSpeedScale; + } + if ( gent->client->ps.dualSabers + && gent->client->ps.saber[1].animSpeedScale != 1.0f ) + { + *animSpeed *= gent->client->ps.saber[1].animSpeedScale; + } + } + } + if ( gent + && gent->client + && gent->client->ps.stats[STAT_WEAPONS]&(1<client->ps.dualSabers + && saberAnimLevel == SS_DUAL + && gent->weaponModel[1] ) + {//using a scepter and dual style, slow down anims + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_H7_S7_BR ) + { + *animSpeed *= 0.75; + } + } + if ( gent && gent->client && gent->client->ps.forceRageRecoveryTime > level.time ) + {//rage recovery + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_H1_S1_BR ) + {//animate slower + *animSpeed *= 0.75; + } + } + else if ( gent && gent->NPC && gent->NPC->rank == RANK_CIVILIAN ) + {//grunt reborn + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_R1_TR_S1 ) + {//his fast attacks are slower + if ( !PM_SpinningSaberAnim( anim ) ) + { + *animSpeed *= 0.75; + } + return; + } + } + else if ( gent && gent->client ) + { + if ( gent->client->ps.saber[0].type == SABER_LANCE || gent->client->ps.saber[0].type == SABER_TRIDENT ) + {//FIXME: hack for now - these use the fast anims, but slowed down. Should have own style + if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_R1_TR_S1 ) + {//his fast attacks are slower + if ( !PM_SpinningSaberAnim( anim ) ) + { + *animSpeed *= 0.75; + } + return; + } + } + } + + if ( ( anim >= BOTH_T1_BR__R && + anim <= BOTH_T1_BL_TL ) || + ( anim >= BOTH_T3_BR__R && + anim <= BOTH_T3_BL_TL ) || + ( anim >= BOTH_T5_BR__R && + anim <= BOTH_T5_BL_TL ) ) + { + if ( saberAnimLevel == FORCE_LEVEL_1 || saberAnimLevel == FORCE_LEVEL_5 ) + {//FIXME: should not be necc for FORCE_LEVEL_1's + *animSpeed *= 1.5; + } + else if ( saberAnimLevel == FORCE_LEVEL_3 ) + { + *animSpeed *= 0.75; + } + } +} +/* +void PM_SaberStartTransAnim( int anim, int entNum, int saberOffenseLevel, float *animSpeed ) +{ + //check starts + if ( ( anim >= BOTH_S1_S1_T_ && + anim <= BOTH_S1_S1_TR ) || + ( anim >= BOTH_S1_S1_T_ && + anim <= BOTH_S1_S1_TR ) || + ( anim >= BOTH_S3_S1_T_ && + anim <= BOTH_S3_S1_TR ) ) + { + if ( entNum == 0 ) + { + *animSpeed *= saberAnimSpeedMod[FORCE_LEVEL_3]; + } + else + { + *animSpeed *= saberAnimSpeedMod[saberOffenseLevel]; + } + } + //Check transitions + else if ( PM_SpinningSaberAnim( anim ) ) + {//spins stay normal speed + return; + } + else if ( ( anim >= BOTH_T1_BR__R && + anim <= BOTH_T1_BL_TL ) || + ( anim >= BOTH_T2_BR__R && + anim <= BOTH_T2_BL_TL ) || + ( anim >= BOTH_T3_BR__R && + anim <= BOTH_T3_BL_TL ) ) + {//slow down the transitions + if ( entNum == 0 && saberOffenseLevel <= FORCE_LEVEL_2 ) + { + *animSpeed *= saberAnimSpeedMod[saberOffenseLevel]; + } + else + { + *animSpeed *= saberAnimSpeedMod[saberOffenseLevel]/2.0f; + } + } + + return; +} +*/ +extern qboolean player_locked; +extern qboolean MatrixMode; +float PM_GetTimeScaleMod( gentity_t *gent ) +{ + if ( g_timescale->value ) + { + if ( !MatrixMode + && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_START + && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_ATTACK + && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_LAND ) + { + if ( gent && gent->s.clientNum == 0 && !player_locked && gent->client->ps.forcePowersActive&(1<value); + } + else if ( gent && gent->client && gent->client->ps.forcePowersActive&(1<value); + } + } + } + return 1.0f; +} + +static inline qboolean PM_IsHumanoid( CGhoul2Info *ghlInfo ) +{ + char *GLAName; + GLAName = gi.G2API_GetGLAName( ghlInfo ); + assert(GLAName); + + if ( !Q_stricmp( "models/players/_humanoid/_humanoid", GLAName ) ) + { + return qtrue; + } + + return qfalse; +} + +/* +------------------------- +PM_SetAnimFinal +------------------------- +*/ +#define G2_DEBUG_TIMING (0) +void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, + int setAnimParts,int anim,int setAnimFlags, + int *torsoAnimTimer,int *legsAnimTimer, + gentity_t *gent,int blendTime) // default blendTime=350 +{ + +// BASIC SETUP AND SAFETY CHECKING +//================================= + + // If It Is A Busted Entity, Don't Do Anything Here. + //--------------------------------------------------- + if (!gent || !gent->client) + { + return; + } + + // Make Sure This Character Has Such An Anim And A Model + //------------------------------------------------------- + if (anim<0 || anim>=MAX_ANIMATIONS || !ValidAnimFileIndex(gent->client->clientInfo.animFileIndex)) + { + #ifndef FINAL_BUILD + if (g_AnimWarning->integer) + { + if (anim<0 || anim>=MAX_ANIMATIONS) + { + gi.Printf(S_COLOR_RED"PM_SetAnimFinal: Invalid Anim Index (%d)!\n", anim); + } + else + { + gi.Printf(S_COLOR_RED"PM_SetAnimFinal: Invalid Anim File Index (%d)!\n", gent->client->clientInfo.animFileIndex); + } + } + #endif + return; + } + + + // Get Global Time Properties + //---------------------------- + float timeScaleMod = PM_GetTimeScaleMod( gent ); + const int actualTime = (cg.time?cg.time:level.time); + const animation_t* animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; + const animation_t& curAnim = animations[anim]; + + // Make Sure This Character Has Such An Anim And A Model + //------------------------------------------------------- + if (animations[anim].numFrames==0) + { + #ifndef FINAL_BUILD + static int LastAnimWarningNum=0; + if (LastAnimWarningNum!=anim) + { + if ((cg_debugAnim.integer==3) || // 3 = do everyone + (cg_debugAnim.integer==1 && gent->s.number==0) || // 1 = only the player + (cg_debugAnim.integer==2 && gent->s.number!=0) || // 2 = only everyone else + (cg_debugAnim.integer==4 && gent->s.number!=cg_debugAnimTarget.integer) // 4 = specific entnum + ) + { + gi.Printf(S_COLOR_RED"PM_SetAnimFinal: Anim %s does not exist in this model (%s)!\n", animTable[anim].name, gent->NPC_type ); + } + } + LastAnimWarningNum = anim; + #endif + return; + } + + // If It's Not A Ghoul 2 Model, Just Remember The Anims And Stop, Because Everything Beyond This Is Ghoul2 + //--------------------------------------------------------------------------------------------------------- + if (!gi.G2API_HaveWeGhoul2Models(gent->ghoul2)) + { + if (setAnimParts&SETANIM_TORSO) + { + (*torsoAnim) = anim; + } + if (setAnimParts&SETANIM_LEGS) + { + (*legsAnim) = anim; + } + return; + } + + + // Lower Offensive Skill Slows Down The Saber Start Attack Animations + //-------------------------------------------------------------------- + PM_SaberStartTransAnim( gent->client->ps.saberAnimLevel, anim, &timeScaleMod, gent ); + + + +// SETUP VALUES FOR INCOMMING ANIMATION +//====================================== + const bool animFootMove = (PM_WalkingAnim(anim) || PM_RunningAnim(anim) || anim==BOTH_CROUCH1WALK || anim==BOTH_CROUCH1WALKBACK); + const bool animHoldless = (setAnimFlags&SETANIM_FLAG_HOLDLESS)!=0; + const bool animHold = (setAnimFlags&SETANIM_FLAG_HOLD)!=0; + const bool animRestart = (setAnimFlags&SETANIM_FLAG_RESTART)!=0; + const bool animOverride = (setAnimFlags&SETANIM_FLAG_OVERRIDE)!=0; + const bool animSync = (g_synchSplitAnims->integer!=0 && !animRestart); + float animCurrent = (-1.0f); + float animSpeed = (50.0f / curAnim.frameLerp * timeScaleMod); // animSpeed is 1.0 if the frameLerp (ms/frame) is 50 (20 fps). + const float animFPS = (fabsf(curAnim.frameLerp)); + const int animDurMSec = (int)(((curAnim.numFrames - 1) * animFPS) / timeScaleMod); + const int animHoldMSec = ((animHoldless && timeScaleMod==1.0f)?((animDurMSec>1)?(animDurMSec-1):(animFPS)):(animDurMSec)); + int animFlags = (curAnim.loopFrames!=-1)?(BONE_ANIM_OVERRIDE_LOOP):(BONE_ANIM_OVERRIDE_FREEZE); + int animStart = (curAnim.firstFrame); + int animEnd = (curAnim.firstFrame)+(animations[anim].numFrames); + + // If We Have A Blend Timer, Add The Blend Flag + //---------------------------------------------- + if (blendTime > 0) + { + animFlags |= BONE_ANIM_BLEND; + } + + // If Animation Is Going Backwards, Swap Last And First Frames + //------------------------------------------------------------- + if (animSpeed<0.0f) + { +// #ifndef FINAL_BUILD + #if 0 + if (g_AnimWarning->integer==1) + { + if (animFlags&BONE_ANIM_OVERRIDE_LOOP) + { + gi.Printf(S_COLOR_YELLOW"PM_SetAnimFinal: WARNING: Anim (%s) looping backwards!\n", animTable[anim].name); + } + } + #endif + + int temp = animEnd; + animEnd = animStart; + animStart = temp; + blendTime = 0; + } + + // If The Animation Is Walking Or Running, Attempt To Scale The Playback Speed To Match + //-------------------------------------------------------------------------------------- + if (g_noFootSlide->integer + && animFootMove + && !(animSpeed<0.0f) + //FIXME: either read speed from animation.cfg or only do this for NPCs + // for whom we've specifically determined the proper numbers! + && gent->client->NPC_class != CLASS_HOWLER + && gent->client->NPC_class != CLASS_WAMPA + && gent->client->NPC_class != CLASS_GONK + && gent->client->NPC_class != CLASS_HOWLER + && gent->client->NPC_class != CLASS_MOUSE + && gent->client->NPC_class != CLASS_PROBE + && gent->client->NPC_class != CLASS_PROTOCOL + && gent->client->NPC_class != CLASS_R2D2 + && gent->client->NPC_class != CLASS_R5D2 + && gent->client->NPC_class != CLASS_SEEKER) + { + bool Walking = !!PM_WalkingAnim(anim); + bool HasDual = (gent->client->ps.saberAnimLevel==SS_DUAL); + bool HasStaff = (gent->client->ps.saberAnimLevel==SS_STAFF); + float moveSpeedOfAnim = 150.0f;//g_noFootSlideRunScale->value; + + if (anim==BOTH_CROUCH1WALK || anim==BOTH_CROUCH1WALKBACK) + { + moveSpeedOfAnim = 75.0f; + } + else + { + if (gent->client->NPC_class == CLASS_HAZARD_TROOPER) + { + moveSpeedOfAnim = 50.0f; + } + else if (gent->client->NPC_class == CLASS_RANCOR) + { + moveSpeedOfAnim = 173.0f; + } + else + { + if (Walking) + { + if (HasDual || HasStaff) + { + moveSpeedOfAnim = 100.0f; + } + else + { + moveSpeedOfAnim = 50.0f;// g_noFootSlideWalkScale->value; + } + } + else + { + if (HasStaff) + { + moveSpeedOfAnim = 250.0f; + } + else + { + moveSpeedOfAnim = 150.0f; + } + } + } + } + + + + + + + animSpeed *= (gent->resultspeed/moveSpeedOfAnim); + if (animSpeed<0.01f) + { + animSpeed = 0.01f; + } + + // Make Sure Not To Play Too Fast An Anim + //---------------------------------------- + float maxPlaybackSpeed = (1.5f * timeScaleMod); + if (animSpeed>maxPlaybackSpeed) + { + animSpeed = maxPlaybackSpeed; + } + } + + +// GET VALUES FOR EXISTING BODY ANIMATION +//========================================== + float bodySpeed = 0.0f; + float bodyCurrent = 0.0f; + int bodyStart = 0; + int bodyEnd = 0; + int bodyFlags = 0; + int bodyAnim = (*legsAnim); + int bodyBone = (gent->rootBone); + bool bodyTimerOn = ((*legsAnimTimer>0) || (*legsAnimTimer)==-1); + bool bodyPlay = ((setAnimParts&SETANIM_LEGS) && (bodyBone!=-1) && (animOverride || !bodyTimerOn)); + bool bodyAnimating = !!gi.G2API_GetBoneAnimIndex(&gent->ghoul2[gent->playerModel], bodyBone, actualTime, &bodyCurrent, &bodyStart, &bodyEnd, &bodyFlags, &bodySpeed, NULL); + bool bodyOnAnimNow = (bodyAnimating && bodyAnim==anim && bodyStart==animStart && bodyEnd==animEnd); + bool bodyMatchTorsFrame = false; + + +// GET VALUES FOR EXISTING TORSO ANIMATION +//=========================================== + float torsSpeed = 0.0f; + float torsCurrent = 0.0f; + int torsStart = 0; + int torsEnd = 0; + int torsFlags = 0; + int torsAnim = (*torsoAnim); + int torsBone = (gent->lowerLumbarBone); + bool torsTimerOn = ((*torsoAnimTimer)>0 || (*torsoAnimTimer)==-1); + bool torsPlay = (gent->client->NPC_class!=CLASS_RANCOR && (setAnimParts&SETANIM_TORSO) && (torsBone!=-1) && (animOverride || !torsTimerOn)); + bool torsAnimating = !!gi.G2API_GetBoneAnimIndex(&gent->ghoul2[gent->playerModel], torsBone, actualTime, &torsCurrent, &torsStart, &torsEnd, &torsFlags, &torsSpeed, NULL); + bool torsOnAnimNow = (torsAnimating && torsAnim==anim && torsStart==animStart && torsEnd==animEnd); + bool torsMatchBodyFrame = false; + + +// APPLY SYNC TO TORSO +//===================== + if (animSync && torsPlay && !bodyPlay && bodyOnAnimNow && (!torsOnAnimNow || torsCurrent!=bodyCurrent)) + { + torsMatchBodyFrame = true; + animCurrent = bodyCurrent; + } + if (animSync && bodyPlay && !torsPlay && torsOnAnimNow && (!bodyOnAnimNow || bodyCurrent!=torsCurrent)) + { + bodyMatchTorsFrame = true; + animCurrent = torsCurrent; + } + + // If Already Doing These Exact Parameters, Then Don't Play + //---------------------------------------------------------- + if (!animRestart) + { + torsPlay &= !(torsOnAnimNow && torsSpeed==animSpeed && !torsMatchBodyFrame); + bodyPlay &= !(bodyOnAnimNow && bodySpeed==animSpeed && !bodyMatchTorsFrame); + } + +#ifndef FINAL_BUILD + if ((cg_debugAnim.integer==3) || // 3 = do everyone + (cg_debugAnim.integer==1 && gent->s.number==0) || // 1 = only the player + (cg_debugAnim.integer==2 && gent->s.number!=0) || // 2 = only everyone else + (cg_debugAnim.integer==4 && gent->s.number!=cg_debugAnimTarget.integer) // 4 = specific entnum + ) + { + if (bodyPlay || torsPlay) + { + char* entName = gent->targetname; + char* location; + + // Select Entity Name + //-------------------- + if (!entName || !entName[0]) + { + entName = gent->NPC_targetname; + } + if (!entName || !entName[0]) + { + entName = gent->NPC_type; + } + if (!entName || !entName[0]) + { + entName = gent->classname; + } + if (!entName || !entName[0]) + { + entName = "UNKNOWN"; + } + + // Select Play Location + //---------------------- + if (bodyPlay && torsPlay) + { + location = "BOTH "; + } + else if (bodyPlay) + { + location = "LEGS "; + } + else + { + location = "TORSO"; + } + + // Print It! + //----------- + Com_Printf("[%10d] ent[%3d-%18s] %s anim[%3d] - %s\n", + actualTime, + gent->s.number, + entName, + location, + anim, + animTable[anim].name ); + } + } +#endif + + +// PLAY ON THE TORSO +//======================== + if (torsPlay) + { + *torsoAnim = anim; + float oldAnimCurrent = animCurrent; + if (animCurrent!=bodyCurrent && torsOnAnimNow && !animRestart && !torsMatchBodyFrame) + { + animCurrent = torsCurrent; + } + + gi.G2API_SetAnimIndex(&gent->ghoul2[gent->playerModel], curAnim.glaIndex); + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], torsBone, + animStart, + animEnd, + (torsOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), + animSpeed, + actualTime, + animCurrent, + blendTime); + + if (gent->motionBone!=-1) + { + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->motionBone, + animStart, + animEnd, + (torsOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), + animSpeed, + actualTime, + animCurrent, + blendTime); + } + + animCurrent = oldAnimCurrent; + + // If This Animation Is To Be Locked And Held, Calculate The Duration And Set The Timer + //-------------------------------------------------------------------------------------- + if (animHold || animHoldless) + { + PM_SetTorsoAnimTimer(gent, torsoAnimTimer, animHoldMSec); + } + } + +// PLAY ON THE WHOLE BODY +//======================== + if (bodyPlay) + { + *legsAnim = anim; + + if (bodyOnAnimNow && !animRestart && !bodyMatchTorsFrame) + { + animCurrent = bodyCurrent; + } + + gi.G2API_SetAnimIndex(&gent->ghoul2[gent->playerModel], curAnim.glaIndex); + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], bodyBone, + animStart, + animEnd, + (bodyOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), + animSpeed, + actualTime, + animCurrent, + blendTime); + + // If This Animation Is To Be Locked And Held, Calculate The Duration And Set The Timer + //-------------------------------------------------------------------------------------- + if (animHold || animHoldless) + { + PM_SetLegsAnimTimer(gent, legsAnimTimer, animHoldMSec); + } + } + + + + + +// PRINT SOME DEBUG TEXT OF EXISTING VALUES +//========================================== + if (false) + { + gi.Printf("PLAYANIM: (%3d) Speed(%4.2f) ", anim, animSpeed); + if (bodyAnimating) + { + gi.Printf("BODY: (%4.2f) (%4.2f) ", bodyCurrent, bodySpeed); + } + else + { + gi.Printf(" "); + } + if (torsAnimating) + { + gi.Printf("TORS: (%4.2f) (%4.2f)\n", torsCurrent, torsSpeed); + } + else + { + gi.Printf("\n"); + } + } +} + + + +void PM_SetAnim(pmove_t *pm,int setAnimParts,int anim,int setAnimFlags, int blendTime) +{ // FIXME : once torsoAnim and legsAnim are in the same structure for NPC and Players + // rename PM_SetAnimFinal to PM_SetAnim and have both NPC and Players call PM_SetAnim + + if ( pm->ps->pm_type >= PM_DEAD ) + {//FIXME: sometimes we'll want to set anims when your dead... twitches, impacts, etc. + return; + } + + if ( pm->gent == NULL ) + { + return; + } + + if ( !pm->gent || pm->gent->health > 0 ) + {//don't lock anims if the guy is dead + if ( pm->ps->torsoAnimTimer + && PM_LockedAnim( pm->ps->torsoAnim ) + && !PM_LockedAnim( anim ) ) + {//nothing can override these special anims + setAnimParts &= ~SETANIM_TORSO; + } + + if ( pm->ps->legsAnimTimer + && PM_LockedAnim( pm->ps->legsAnim ) + && !PM_LockedAnim( anim ) ) + {//nothing can override these special anims + setAnimParts &= ~SETANIM_LEGS; + } + } + + if ( !setAnimParts ) + { + return; + } + + if (setAnimFlags&SETANIM_FLAG_OVERRIDE) + { +// pm->ps->animationTimer = 0; + + if (setAnimParts & SETANIM_TORSO) + { + if( (setAnimFlags & SETANIM_FLAG_RESTART) || pm->ps->torsoAnim != anim ) + { + PM_SetTorsoAnimTimer( pm->gent, &pm->ps->torsoAnimTimer, 0 ); + } + } + if (setAnimParts & SETANIM_LEGS) + { + if( (setAnimFlags & SETANIM_FLAG_RESTART) || pm->ps->legsAnim != anim ) + { + PM_SetLegsAnimTimer( pm->gent, &pm->ps->legsAnimTimer, 0 ); + } + } + } + + PM_SetAnimFinal(&pm->ps->torsoAnim,&pm->ps->legsAnim,setAnimParts,anim,setAnimFlags,&pm->ps->torsoAnimTimer,&pm->ps->legsAnimTimer,&g_entities[pm->ps->clientNum],blendTime);//was pm->gent +} + +bool TorsoAgainstWindTest( gentity_t* ent ) +{ + if (ent&&//valid ent + ent->client&&//a client + (ent->client->ps.weapon!=WP_SABER||ent->client->ps.saberMove==LS_READY)&&//either not holding a saber or the saber is in the ready pose + (ent->s.numbercurrentOrigin) && + gi.WE_IsOutside(ent->currentOrigin) ) + { + if (Q_stricmp(level.mapname, "t2_wedge")!=0) + { + vec3_t fwd; + vec3_t windDir; + if (gi.WE_GetWindVector(windDir, ent->currentOrigin)) + { + VectorScale(windDir, -1.0f, windDir); + AngleVectors(pm->gent->currentAngles, fwd, 0, 0); + if (DotProduct(fwd, windDir)>0.65f) + { + if (ent->client && ent->client->ps.torsoAnim!=BOTH_WIND) + { + NPC_SetAnim(ent, SETANIM_TORSO, BOTH_WIND, SETANIM_FLAG_NORMAL, 400); + } + return true; + } + } + } + } + return false; +} + +/* +------------------------- +PM_TorsoAnimLightsaber +------------------------- +*/ + + +// Note that this function is intended to set the animation for the player, but +// only does idle-ish anims. Anything that has a timer associated, such as attacks and blocks, +// are set by PM_WeaponLightsaber() + +extern Vehicle_t *G_IsRidingVehicle( gentity_t *pEnt ); +extern qboolean PM_LandingAnim( int anim ); +extern qboolean PM_JumpingAnim( int anim ); +qboolean PM_InCartwheel( int anim ); +void PM_TorsoAnimLightsaber() +{ + // ********************************************************* + // WEAPON_READY + // ********************************************************* + if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + {//holding an enemy aloft with force-grip + return; + } + + if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_1 ) + {//lightning + return; + } + + if ( pm->ps->forcePowersActive&(1<ps->saber[0].blade[0].active + && pm->ps->saber[0].blade[0].length < 3 + && !(pm->ps->saberEventFlags&SEF_HITWALL) + && pm->ps->weaponstate == WEAPON_RAISING ) + { + if (!G_IsRidingVehicle(pm->gent)) + { + PM_SetSaberMove(LS_DRAW); + } + return; + } + else if ( !pm->ps->SaberActive() && pm->ps->SaberLength() ) + { + if (!G_IsRidingVehicle(pm->gent)) + { + PM_SetSaberMove(LS_PUTAWAY); + } + return; + } + + if (pm->ps->weaponTime > 0) + { // weapon is already busy. + if ( pm->ps->torsoAnim == BOTH_TOSS1 + || pm->ps->torsoAnim == BOTH_TOSS2 ) + {//in toss + if ( !pm->ps->torsoAnimTimer ) + {//weird, get out of it, I guess + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + } + return; + } + + if ( pm->ps->weaponstate == WEAPON_READY || + pm->ps->weaponstate == WEAPON_CHARGING || + pm->ps->weaponstate == WEAPON_CHARGING_ALT ) + {//ready + if ( pm->ps->weapon == WP_SABER && (pm->ps->SaberLength()) ) + {//saber is on + // Select the proper idle Lightsaber attack move from the chart. + if (pm->ps->saberMove > LS_READY && pm->ps->saberMove < LS_MOVE_MAX) + { + PM_SetSaberMove(saberMoveData[pm->ps->saberMove].chain_idle); + } + else + { + if ( PM_JumpingAnim( pm->ps->legsAnim ) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) + || PM_FlippingAnim( pm->ps->legsAnim )) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + if ( (PM_RunningAnim( pm->ps->legsAnim ) + || pm->ps->legsAnim == BOTH_WALK_STAFF + || pm->ps->legsAnim == BOTH_WALK_DUAL + || pm->ps->legsAnim == BOTH_WALKBACK_STAFF + || pm->ps->legsAnim == BOTH_WALKBACK_DUAL ) + && pm->ps->saberBlockingTime < cg.time ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetSaberMove(LS_READY); + } + } + } + } + /* + if ( PM_JumpingAnim( pm->ps->legsAnim ) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) + || PM_FlippingAnim( pm->ps->legsAnim )) + {//jumping, landing cartwheel, flipping + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetSaberMove( LS_READY ); + } + */ + } + else if (TorsoAgainstWindTest(pm->gent)) + { + } + else if( pm->ps->legsAnim == BOTH_RUN1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_RUN2 )//&& pm->ps->saberAnimLevel != SS_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN2,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_RUN_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_STAFF,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_RUN_DUAL ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_DUAL,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_WALK1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_WALK2 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK2,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_WALK_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_STAFF,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_WALK_DUAL ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_DUAL,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_CROUCH1IDLE && pm->ps->clientNum != 0 )//player falls through + { + //??? Why nothing? What if you were running??? + //PM_SetAnim(pm,SETANIM_TORSO,BOTH_CROUCH1IDLE,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_JUMP1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_JUMP1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else + {//Used to default to both_stand1 which is an arms-down anim +// PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 + // Select the next proper pose for the lightsaber assuming that there are no attacks. + if (pm->ps->saberMove > LS_READY && pm->ps->saberMove < LS_MOVE_MAX) + { + PM_SetSaberMove(saberMoveData[pm->ps->saberMove].chain_idle); + } + else + { + if ( PM_JumpingAnim( pm->ps->legsAnim ) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) + || PM_FlippingAnim( pm->ps->legsAnim )) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + PM_SetSaberMove(LS_READY); + } + } + } + } + } + + // ********************************************************* + // WEAPON_IDLE + // ********************************************************* + + else if ( pm->ps->weaponstate == WEAPON_IDLE ) + { + if (TorsoAgainstWindTest(pm->gent)) + { + } + else if( pm->ps->legsAnim == BOTH_GUARD_LOOKAROUND1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_LOOKAROUND1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_GUARD_IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_IDLE1,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND1IDLE1 + || pm->ps->legsAnim == BOTH_STAND2IDLE1 + || pm->ps->legsAnim == BOTH_STAND2IDLE2 + || pm->ps->legsAnim == BOTH_STAND3IDLE1 + || pm->ps->legsAnim == BOTH_STAND5IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND2TO4 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND2TO4,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND4TO2 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4TO2,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND4 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else + { +// This is now set in SetSaberMove. + // Idle for Lightsaber + if ( pm->gent && pm->gent->client ) + { +// pm->gent->client->saberTrail.inAction = qfalse; + } + + qboolean saberInAir = qtrue; + if ( pm->ps->saberInFlight ) + {//guiding saber + if ( PM_SaberInBrokenParry( pm->ps->saberMove ) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim( pm->ps->torsoAnim ) ) + {//we're stuck in a broken parry + saberInAir = qfalse; + } + if ( pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0 )//player is 0 + {// + if ( &g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY ) + {//fell to the ground and we're not trying to pull it back + saberInAir = qfalse; + } + } + } + if ( pm->ps->saberInFlight + && saberInAir + && (!pm->ps->dualSabers || !pm->ps->saber[1].Active())) + { + if ( !PM_ForceAnim( pm->ps->torsoAnim ) + || pm->ps->torsoAnimTimer < 300 ) + {//don't interrupt a force power anim + if ( pm->ps->torsoAnim != BOTH_LOSE_SABER + || !pm->ps->torsoAnimTimer ) + { + PM_SetAnim( pm, SETANIM_TORSO,BOTH_SABERPULL,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + } + } + else + {//saber is on + // Idle for Lightsaber + if ( pm->gent && pm->gent->client ) + { + if ( !G_InCinematicSaberAnim( pm->gent ) ) + { + pm->gent->client->ps.SaberDeactivateTrail( 0 ); + } + } + // Idle for idle/ready Lightsaber +// PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONIDLE1 + // Select the proper idle Lightsaber attack move from the chart. + if (pm->ps->saberMove > LS_READY && pm->ps->saberMove < LS_MOVE_MAX) + { + PM_SetSaberMove(saberMoveData[pm->ps->saberMove].chain_idle); + } + else + { + if ( PM_JumpingAnim( pm->ps->legsAnim ) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) + || PM_FlippingAnim( pm->ps->legsAnim )) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + if ( (PM_RunningAnim( pm->ps->legsAnim ) + || pm->ps->legsAnim == BOTH_WALK_STAFF + || pm->ps->legsAnim == BOTH_WALK_DUAL + || pm->ps->legsAnim == BOTH_WALKBACK_STAFF + || pm->ps->legsAnim == BOTH_WALKBACK_DUAL ) + && pm->ps->saberBlockingTime < cg.time ) + {//running w/1-handed weapon uses full-body anim + int setFlags = SETANIM_FLAG_NORMAL; + if ( PM_LandingAnim( pm->ps->torsoAnim ) ) + { + setFlags = SETANIM_FLAG_OVERRIDE; + } + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,setFlags); + } + else + { + PM_SetSaberMove(LS_READY); + } + } + } + } + } + } + } +} + + + + +/* +------------------------- +PM_TorsoAnimation +------------------------- +*/ + +void PM_TorsoAnimation( void ) +{//FIXME: Write a much smarter and more appropriate anim picking routine logic... +// int oldAnim; + if ( PM_InKnockDown( pm->ps ) || PM_InRoll( pm->ps )) + {//in knockdown + return; + } + + if ( (pm->ps->eFlags&EF_HELD_BY_WAMPA) ) + { + return; + } + + if ( (pm->ps->eFlags&EF_FORCE_DRAINED) ) + {//being drained + //PM_SetAnim( pm, SETANIM_TORSO, BOTH_HUGGEE1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + return; + } + if ( (pm->ps->forcePowersActive&(1<ps->forceDrainEntityNum < ENTITYNUM_WORLD ) + {//draining + //PM_SetAnim( pm, SETANIM_TORSO, BOTH_HUGGER1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + return; + } + + if( pm->gent && pm->gent->NPC && (pm->gent->NPC->scriptFlags & SCF_FORCED_MARCH) ) + { + return; + } + + if(pm->gent != NULL && pm->gent->client) + { + pm->gent->client->renderInfo.torsoFpsMod = 1.0f; + } + + if ( pm->gent && pm->ps && pm->ps->eFlags & EF_LOCKED_TO_WEAPON ) + { + if ( pm->gent->owner && pm->gent->owner->e_UseFunc == useF_emplaced_gun_use )//ugly way to tell, but... + {//full body + PM_SetAnim(pm,SETANIM_BOTH,BOTH_GUNSIT1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + else + {//torso + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUNSIT1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + return; + } +/* else if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE && pm->ps->clientNum < MAX_CLIENTS && (m_pVehicleInfo[((CVehicleNPC *)pm->gent->NPC)->m_iVehicleTypeID].numHands == 2 || g_speederControlScheme->value == 2) ) + {//can't look around + PM_SetAnim(pm,SETANIM_TORSO,m_pVehicleInfo[((CVehicleNPC *)pm->gent->NPC)->m_iVehicleTypeID].riderAnim,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); + return; + }*/ + + if ( pm->ps->taunting > level.time ) + { + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ALORA ) + { + PM_SetAnim(pm,SETANIM_BOTH,BOTH_ALORA_TAUNT,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + else if ( pm->ps->weapon == WP_SABER && pm->ps->saberAnimLevel == SS_DUAL && PM_HasAnimation( pm->gent, BOTH_DUAL_TAUNT ) ) + { + PM_SetAnim(pm,SETANIM_BOTH,BOTH_DUAL_TAUNT,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + else if ( pm->ps->weapon == WP_SABER + && pm->ps->saberAnimLevel == SS_STAFF )//pm->ps->saber[0].type == SABER_STAFF ) + {//turn on the blades + if ( PM_HasAnimation( pm->gent, BOTH_STAFF_TAUNT ) ) + { + PM_SetAnim(pm,SETANIM_BOTH,BOTH_STAFF_TAUNT,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + } + /* + else + { + if ( !pm->ps->saber[0].blade[0].active ) + {//first blade is off + //turn it on + pm->ps->SaberBladeActivate( 0, 0, qtrue ); + if ( !pm->ps->saber[0].blade[1].active ) + {//second blade is also off, extend time of this taunt so we have enough time to turn them both on + pm->ps->taunting = level.time + 3000; + } + } + else if ( (pm->ps->taunting - level.time) < 1500 ) + {//only 1500ms left in taunt + if ( !pm->ps->saber[0].blade[1].active ) + {//second blade is off + //turn it on + pm->ps->SaberBladeActivate( 0, 1, qtrue ); + } + } + //pose + PM_SetAnim(pm,SETANIM_BOTH,BOTH_SABERSTAFF_STANCE,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); + pm->ps->torsoAnimTimer = pm->ps->legsAnimTimer = (pm->ps->taunting - level.time); + } + */ + } + else if ( PM_HasAnimation( pm->gent, BOTH_GESTURE1 ) ) + { + PM_SetAnim(pm,SETANIM_BOTH,BOTH_GESTURE1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + pm->gent->client->ps.SaberActivateTrail( 100 ); + //FIXME: will this reset? + //FIXME: force-control (yellow glow) effect on hand and saber? + } + else + { + //PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE1,SETANIM_FLAG_NORMAL); + } + return; + } + + if (pm->ps->weapon == WP_SABER ) // WP_LIGHTSABER + { + qboolean saberInAir = qfalse; + if ( pm->ps->SaberLength() && !pm->ps->saberInFlight ) + { + PM_TorsoAnimLightsaber(); + } + else + { + if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 ) + {//holding an enemy aloft with force-grip + return; + } + if ( pm->ps->forcePowersActive&(1<ps->forcePowerLevel[FP_LIGHTNING] > FORCE_LEVEL_1 ) + {//lightning + return; + } + if ( pm->ps->forcePowersActive&(1<ps->saberMove ) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim( pm->ps->torsoAnim ) ) + {//we're stuck in a broken parry + PM_TorsoAnimLightsaber(); + } + else + { + if ( pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0 )//player is 0 + {// + if ( &g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY ) + {//fell to the ground and we're not trying to pull it back + saberInAir = qfalse; + } + } + + if ( pm->ps->saberInFlight + && saberInAir + && (!pm->ps->dualSabers //not using 2 sabers + || !pm->ps->saber[1].Active() //left one off + || pm->ps->torsoAnim == BOTH_SABERDUAL_STANCE//not attacking + || pm->ps->torsoAnim == BOTH_SABERPULL//not attacking + || pm->ps->torsoAnim == BOTH_STAND1//not attacking + || PM_RunningAnim( pm->ps->torsoAnim ) //not attacking + || PM_WalkingAnim( pm->ps->torsoAnim ) //not attacking + || PM_JumpingAnim( pm->ps->torsoAnim )//not attacking + || PM_SwimmingAnim( pm->ps->torsoAnim ) )//not attacking + ) + { + if ( !PM_ForceAnim( pm->ps->torsoAnim ) || pm->ps->torsoAnimTimer < 300 ) + {//don't interrupt a force power anim + if ( pm->ps->torsoAnim != BOTH_LOSE_SABER + || !pm->ps->torsoAnimTimer ) + { + PM_SetAnim( pm, SETANIM_TORSO,BOTH_SABERPULL,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + } + } + else + { + if ( PM_InSlopeAnim( pm->ps->legsAnim ) ) + {//HMM... this probably breaks the saber putaway and select anims + if ( pm->ps->SaberLength() > 0 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND2,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + } + } + } + } + + if (pm->ps->weaponTime<= 0 && (pm->ps->saberMove==LS_READY || pm->ps->SaberLength()==0) && !saberInAir) + { + TorsoAgainstWindTest(pm->gent); + } + return; + } + + if ( PM_ForceAnim( pm->ps->torsoAnim ) + && pm->ps->torsoAnimTimer > 0 ) + {//in a force anim, don't do a stand anim + return; + } + + + qboolean weaponBusy = qfalse; + + if ( pm->ps->weapon == WP_NONE ) + { + weaponBusy = qfalse; + } + else if ( pm->ps->weaponstate == WEAPON_FIRING || pm->ps->weaponstate == WEAPON_CHARGING || pm->ps->weaponstate == WEAPON_CHARGING_ALT ) + { + weaponBusy = qtrue; + } + else if ( pm->ps->lastShotTime > level.time - 3000 ) + { + weaponBusy = qtrue; + } + else if ( pm->ps->weaponTime > 0 ) + { + weaponBusy = qtrue; + } + else if ( pm->gent && pm->gent->client->fireDelay > 0 ) + { + weaponBusy = qtrue; + } + else if ( TorsoAgainstWindTest(pm->gent) ) + { + return; + } + else if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.zoomTime > cg.time - 5000 ) + {//if we used binoculars recently, aim weapon + weaponBusy = qtrue; + pm->ps->weaponstate = WEAPON_IDLE; + } + else if ( pm->ps->pm_flags & PMF_DUCKED ) + {//ducking is considered on alert... plus looks stupid to have arms hanging down when crouched + weaponBusy = qtrue; + } + + if ( pm->ps->weapon == WP_NONE || + pm->ps->weaponstate == WEAPON_READY || + pm->ps->weaponstate == WEAPON_CHARGING || + pm->ps->weaponstate == WEAPON_CHARGING_ALT ) + { + if ( pm->ps->weapon == WP_SABER && pm->ps->SaberLength() ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 + } + else if( pm->ps->legsAnim == BOTH_RUN1 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_RUN2 && !weaponBusy )//&& pm->ps->saberAnimLevel != SS_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN2,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_RUN4 && !weaponBusy )//&& pm->ps->saberAnimLevel != SS_STAFF ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN4,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_RUN_STAFF && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_STAFF,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_RUN_DUAL && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_RUN_DUAL,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_WALK1 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_WALK2 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK2,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_WALK_STAFF && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_STAFF,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_WALK_DUAL&& !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_WALK_DUAL,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_CROUCH1IDLE && pm->ps->clientNum != 0 )//player falls through + { + //??? Why nothing? What if you were running??? + //PM_SetAnim(pm,SETANIM_TORSO,BOTH_CROUCH1IDLE,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_JUMP1 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_JUMP1,SETANIM_FLAG_NORMAL, 100); // Only blend over 100ms + } + else if( pm->ps->legsAnim == BOTH_SWIM_IDLE1 && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIM_IDLE1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_SWIMFORWARD && !weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIMFORWARD,SETANIM_FLAG_NORMAL); + } + else if ( pm->ps->weapon == WP_NONE ) + { + int legsAnim = pm->ps->legsAnim; + /* + if ( PM_RollingAnim( legsAnim ) || + PM_FlippingAnim( legsAnim ) || + PM_JumpingAnim( legsAnim ) || + PM_PainAnim( legsAnim ) || + PM_SwimmingAnim( legsAnim ) ) + */ + { + PM_SetAnim(pm, SETANIM_TORSO, legsAnim, SETANIM_FLAG_NORMAL ); + } + } + else + {//Used to default to both_stand1 which is an arms-down anim + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else if ( pm->gent != NULL + && (pm->gent->s.numbergent)) + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT ) + {//PLayer- temp hack for weapon frame + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + {//ignore + } + else if ( pm->ps->weapon == WP_MELEE ) + {//hehe + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + else if ( PM_InSpecialJump( pm->ps->legsAnim ) ) + {//use legs anim + //FIXME: or just use whatever's currently playing? + //PM_SetAnim( pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL ); + } + else + { + switch(pm->ps->weapon) + { + // ******************************************************** + case WP_SABER: // WP_LIGHTSABER + // Ready pose for Lightsaber +// PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 + // Select the next proper pose for the lightsaber assuming that there are no attacks. + if (pm->ps->saberMove > LS_NONE && pm->ps->saberMove < LS_MOVE_MAX) + { + PM_SetSaberMove(saberMoveData[pm->ps->saberMove].chain_idle); + } + break; + // ******************************************************** + + case WP_BRYAR_PISTOL: + //FIXME: if recently fired, hold the ready! + if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + break; + case WP_BLASTER_PISTOL: + if ( pm->gent + && pm->gent->weaponModel[1] > 0 ) + {//dual pistols + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUNSIT1,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + } + } + else + {//single pistols + if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + } + break; + case WP_NONE: + //NOTE: should never get here + break; + case WP_MELEE: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + {//ignore + } + else if ( pm->gent && pm->gent->client && !PM_DroidMelee( pm->gent->client->NPC_class ) ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + break; + case WP_TUSKEN_STAFF: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND3, SETANIM_FLAG_NORMAL); + } + break; + + case WP_NOGHRI_STICK: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + //PM_SetAnim(pm,SETANIM_LEGS,BOTH_ATTACK2,SETANIM_FLAG_NORMAL); + break; + + case WP_BLASTER: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + //PM_SetAnim(pm,SETANIM_LEGS,BOTH_ATTACK2,SETANIM_FLAG_NORMAL); + break; + case WP_DISRUPTOR: + case WP_TUSKEN_RIFLE: + if ( (pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT) + || PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running sniper weapon uses normal ready + if ( pm->ps->clientNum ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + } + else + { + if ( pm->ps->clientNum ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD );//TORSO_WEAPONREADY4//SETANIM_FLAG_RESTART| + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL ); + } + } + break; + case WP_BOT_LASER: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + break; + case WP_THERMAL: + if ( pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT + && (PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim )) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && (pm->ps->weaponstate == WEAPON_CHARGING || pm->ps->weaponstate == WEAPON_CHARGING_ALT) ) + {//player pulling back to throw + if ( PM_StandingAnim( pm->ps->legsAnim ) ) + { + PM_SetAnim( pm, SETANIM_LEGS, BOTH_THERMAL_READY, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + else if ( pm->ps->legsAnim == BOTH_THERMAL_READY ) + {//sigh... hold it so pm_footsteps doesn't override + if ( pm->ps->legsAnimTimer < 100 ) + { + pm->ps->legsAnimTimer = 100; + } + } + PM_SetAnim( pm, SETANIM_TORSO, BOTH_THERMAL_READY, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + else + { + if ( weaponBusy ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY10, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + } + } + } + break; + case WP_REPEATER: + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_GALAKMECH ) + {// + if ( pm->gent->alt_fire ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY1,SETANIM_FLAG_NORMAL); + } + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + break; + case WP_TRIP_MINE: + case WP_DET_PACK: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( weaponBusy ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + } + } + break; + default: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + break; + } + } + } + } + else if ( pm->ps->weaponstate == WEAPON_IDLE ) + { + if( pm->ps->legsAnim == BOTH_GUARD_LOOKAROUND1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_LOOKAROUND1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_GUARD_IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_IDLE1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_STAND1IDLE1 + || pm->ps->legsAnim == BOTH_STAND2IDLE1 + || pm->ps->legsAnim == BOTH_STAND2IDLE2 + || pm->ps->legsAnim == BOTH_STAND3IDLE1 + || pm->ps->legsAnim == BOTH_STAND5IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + pm->ps->saberMove = LS_READY; + } + else if( pm->ps->legsAnim == BOTH_STAND2TO4 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND2TO4,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_STAND4TO2 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4TO2,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_STAND4 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND4,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_SWIM_IDLE1 ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIM_IDLE1,SETANIM_FLAG_NORMAL); + } + else if( pm->ps->legsAnim == BOTH_SWIMFORWARD ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_SWIMFORWARD,SETANIM_FLAG_NORMAL); + } + else if ( PM_InSpecialJump( pm->ps->legsAnim ) ) + {//use legs anim + //FIXME: or just use whatever's currently playing? + //PM_SetAnim( pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL ); + } + else if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && pm->ps->torsoAnim == BOTH_BUTTON_HOLD ) + {//using something + if ( !pm->ps->useTime ) + {//stopped holding it, release + PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + }//else still holding, leave it as it is + } + else + { + if ( !weaponBusy + && pm->ps->weapon != WP_BOWCASTER + && pm->ps->weapon != WP_REPEATER + && pm->ps->weapon != WP_FLECHETTE + && pm->ps->weapon != WP_ROCKET_LAUNCHER + && pm->ps->weapon != WP_CONCUSSION + && ( PM_RunningAnim( pm->ps->legsAnim ) + || (PM_WalkingAnim( pm->ps->legsAnim ) && (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) ) + {//running w/1-handed or light 2-handed weapon uses full-body anim if you're not using the weapon right now + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + switch ( pm->ps->weapon ) + { + // ******************************************************** + case WP_SABER: // WP_LIGHTSABER + // Shouldn't get here, should go to TorsoAnimLightsaber + break; + // ******************************************************** + + case WP_BRYAR_PISTOL: + if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_NORMAL); + } + break; + case WP_BLASTER_PISTOL: + if ( pm->gent + && pm->gent->weaponModel[1] > 0 ) + {//dual pistols + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUNSIT1,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + else + {//single pistols + if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT || weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); + } + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_NORMAL); + } + } + break; + + case WP_NONE: + //NOTE: should never get here + break; + + case WP_MELEE: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + {//ignore + } + else if ( pm->gent && pm->gent->client && !PM_DroidMelee( pm->gent->client->NPC_class ) ) + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND6,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + } + } + break; + + case WP_TUSKEN_STAFF: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND3, SETANIM_FLAG_NORMAL); + } + break; + + case WP_NOGHRI_STICK: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + + case WP_BLASTER: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + + case WP_DISRUPTOR: + case WP_TUSKEN_RIFLE: + if ( (pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING + && pm->ps->weaponstate != WEAPON_CHARGING_ALT) + || PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running sniper weapon uses normal ready + if ( pm->ps->clientNum ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY3, SETANIM_FLAG_NORMAL ); + } + } + else + { + if ( pm->ps->clientNum ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONREADY4, SETANIM_FLAG_NORMAL ); + } + } + break; + + case WP_BOT_LASER: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + break; + + case WP_THERMAL: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( weaponBusy ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONIDLE10, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + } + } + break; + + case WP_REPEATER: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + case WP_TRIP_MINE: + case WP_DET_PACK: + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_JumpingAnim( pm->ps->legsAnim ) + || PM_SwimmingAnim( pm->ps->legsAnim ) ) + {//running w/1-handed weapon uses full-body anim + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + } + else + { + if ( weaponBusy ) + { + PM_SetAnim( pm, SETANIM_TORSO, TORSO_WEAPONIDLE3, SETANIM_FLAG_NORMAL ); + } + else + { + PM_SetAnim( pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL ); + } + } + break; + + default: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + } + } + } + } +} + +//========================================================================= +// Anim checking utils +//========================================================================= + +int PM_GetTurnAnim( gentity_t *gent, int anim ) +{ + if ( !gent ) + { + return -1; + } + + switch( anim ) + { + case BOTH_STAND1: //# Standing idle: no weapon: hands down + case BOTH_STAND1IDLE1: //# Random standing idle + case BOTH_STAND2: //# Standing idle with a weapon + case BOTH_SABERFAST_STANCE: + case BOTH_SABERSLOW_STANCE: + case BOTH_STAND2IDLE1: //# Random standing idle + case BOTH_STAND2IDLE2: //# Random standing idle + case BOTH_STAND3: //# Standing hands behind back: at ease: etc. + case BOTH_STAND3IDLE1: //# Random standing idle + case BOTH_STAND4: //# two handed: gun down: relaxed stand + case BOTH_STAND5: //# standing idle, no weapon, hand down, back straight + case BOTH_STAND5IDLE1: //# Random standing idle + case BOTH_STAND6: //# one handed: gun at side: relaxed stand + case BOTH_STAND2TO4: //# Transition from stand2 to stand4 + case BOTH_STAND4TO2: //# Transition from stand4 to stand2 + case BOTH_GESTURE1: //# Generic gesture: non-specific + case BOTH_GESTURE2: //# Generic gesture: non-specific + case BOTH_TALK1: //# Generic talk anim + case BOTH_TALK2: //# Generic talk anim + if ( PM_HasAnimation( gent, LEGS_TURN1 ) ) + { + return LEGS_TURN1; + } + else + { + return -1; + } + break; + case BOTH_ATTACK1: //# Attack with generic 1-handed weapon + case BOTH_ATTACK2: //# Attack with generic 2-handed weapon + case BOTH_ATTACK3: //# Attack with heavy 2-handed weapon + case BOTH_ATTACK4: //# Attack with ??? + case BOTH_MELEE1: //# First melee attack + case BOTH_MELEE2: //# Second melee attack + case BOTH_GUARD_LOOKAROUND1: //# Cradling weapon and looking around + case BOTH_GUARD_IDLE1: //# Cradling weapon and standing + if ( PM_HasAnimation( gent, LEGS_TURN2 ) ) + { + return LEGS_TURN2; + } + else + { + return -1; + } + break; + default: + return -1; + break; + } +} + +int PM_TurnAnimForLegsAnim( gentity_t *gent, int anim ) +{ + if ( !gent ) + { + return -1; + } + + switch( anim ) + { + case BOTH_STAND1: //# Standing idle: no weapon: hands down + case BOTH_STAND1IDLE1: //# Random standing idle + if ( PM_HasAnimation( gent, BOTH_TURNSTAND1 ) ) + { + return BOTH_TURNSTAND1; + } + else + { + return -1; + } + break; + case BOTH_STAND2: //# Standing idle with a weapon + case BOTH_SABERFAST_STANCE: + case BOTH_SABERSLOW_STANCE: + case BOTH_STAND2IDLE1: //# Random standing idle + case BOTH_STAND2IDLE2: //# Random standing idle + if ( PM_HasAnimation( gent, BOTH_TURNSTAND2 ) ) + { + return BOTH_TURNSTAND2; + } + else + { + return -1; + } + break; + case BOTH_STAND3: //# Standing hands behind back: at ease: etc. + case BOTH_STAND3IDLE1: //# Random standing idle + if ( PM_HasAnimation( gent, BOTH_TURNSTAND3 ) ) + { + return BOTH_TURNSTAND3; + } + else + { + return -1; + } + break; + case BOTH_STAND4: //# two handed: gun down: relaxed stand + if ( PM_HasAnimation( gent, BOTH_TURNSTAND4 ) ) + { + return BOTH_TURNSTAND4; + } + else + { + return -1; + } + break; + case BOTH_STAND5: //# standing idle, no weapon, hand down, back straight + case BOTH_STAND5IDLE1: //# Random standing idle + if ( PM_HasAnimation( gent, BOTH_TURNSTAND5 ) ) + { + return BOTH_TURNSTAND5; + } + else + { + return -1; + } + break; + case BOTH_CROUCH1: //# Transition from standing to crouch + case BOTH_CROUCH1IDLE: //# Crouching idle + /* + case BOTH_UNCROUCH1: //# Transition from crouch to standing + case BOTH_CROUCH2TOSTAND1: //# going from crouch2 to stand1 + case BOTH_CROUCH3: //# Desann crouching down to Kyle (cin 9) + case BOTH_UNCROUCH3: //# Desann uncrouching down to Kyle (cin 9) + case BOTH_CROUCH4: //# Slower version of crouch1 for cinematics + case BOTH_UNCROUCH4: //# Slower version of uncrouch1 for cinematics + */ + if ( PM_HasAnimation( gent, BOTH_TURNCROUCH1 ) ) + { + return BOTH_TURNCROUCH1; + } + else + { + return -1; + } + break; + default: + return -1; + break; + } +} + +qboolean PM_InOnGroundAnim ( playerState_t *ps ) +{ + switch( ps->legsAnim ) + { + case BOTH_DEAD1: + case BOTH_DEAD2: + case BOTH_DEAD3: + case BOTH_DEAD4: + case BOTH_DEAD5: + case BOTH_DEADFORWARD1: + case BOTH_DEADBACKWARD1: + case BOTH_DEADFORWARD2: + case BOTH_DEADBACKWARD2: + case BOTH_LYINGDEATH1: + case BOTH_LYINGDEAD1: + case BOTH_SLEEP1: //# laying on back-rknee up-rhand on torso + return qtrue; + break; + case BOTH_KNOCKDOWN1: //# + case BOTH_KNOCKDOWN2: //# + case BOTH_KNOCKDOWN3: //# + case BOTH_KNOCKDOWN4: //# + case BOTH_KNOCKDOWN5: //# + case BOTH_LK_DL_ST_T_SB_1_L: + case BOTH_RELEASED: + if ( ps->legsAnimTimer < 500 ) + {//pretty much horizontal by this point + return qtrue; + } + break; + case BOTH_PLAYER_PA_3_FLY: + if ( ps->legsAnimTimer < 300 ) + {//pretty much horizontal by this point + return qtrue; + } + /* + else if ( ps->clientNum < MAX_CLIENTS + && ps->legsAnimTimer < 300 + PLAYER_KNOCKDOWN_HOLD_EXTRA_TIME ) + { + return qtrue; + } + */ + break; + case BOTH_GETUP1: + case BOTH_GETUP2: + case BOTH_GETUP3: + case BOTH_GETUP4: + case BOTH_GETUP5: + case BOTH_GETUP_CROUCH_F1: + case BOTH_GETUP_CROUCH_B1: + case BOTH_FORCE_GETUP_F1: + case BOTH_FORCE_GETUP_F2: + case BOTH_FORCE_GETUP_B1: + case BOTH_FORCE_GETUP_B2: + case BOTH_FORCE_GETUP_B3: + case BOTH_FORCE_GETUP_B4: + case BOTH_FORCE_GETUP_B5: + case BOTH_FORCE_GETUP_B6: + if ( ps->legsAnimTimer > PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)ps->legsAnim )-400 ) + {//still pretty much horizontal at this point + return qtrue; + } + break; + } + + return qfalse; +} + +qboolean PM_InSpecialDeathAnim( int anim ) +{ + switch( pm->ps->legsAnim ) + { + case BOTH_DEATH_ROLL: //# Death anim from a roll + case BOTH_DEATH_FLIP: //# Death anim from a flip + case BOTH_DEATH_SPIN_90_R: //# Death anim when facing 90 degrees right + case BOTH_DEATH_SPIN_90_L: //# Death anim when facing 90 degrees left + case BOTH_DEATH_SPIN_180: //# Death anim when facing backwards + case BOTH_DEATH_LYING_UP: //# Death anim when lying on back + case BOTH_DEATH_LYING_DN: //# Death anim when lying on front + case BOTH_DEATH_FALLING_DN: //# Death anim when falling on face + case BOTH_DEATH_FALLING_UP: //# Death anim when falling on back + case BOTH_DEATH_CROUCHED: //# Death anim when crouched + return qtrue; + break; + default: + return qfalse; + break; + } +} + +qboolean PM_InDeathAnim ( void ) +{//Purposely does not cover stumbledeath and falldeath... + switch( pm->ps->legsAnim ) + { + case BOTH_DEATH1: //# First Death anim + case BOTH_DEATH2: //# Second Death anim + case BOTH_DEATH3: //# Third Death anim + case BOTH_DEATH4: //# Fourth Death anim + case BOTH_DEATH5: //# Fifth Death anim + case BOTH_DEATH6: //# Sixth Death anim + case BOTH_DEATH7: //# Seventh Death anim + case BOTH_DEATH8: //# + case BOTH_DEATH9: //# + case BOTH_DEATH10: //# + case BOTH_DEATH11: //# + case BOTH_DEATH12: //# + case BOTH_DEATH13: //# + case BOTH_DEATH14: //# + case BOTH_DEATH14_UNGRIP: //# Desann's end death (cin #35) + case BOTH_DEATH14_SITUP: //# Tavion sitting up after having been thrown (cin #23) + case BOTH_DEATH15: //# + case BOTH_DEATH16: //# + case BOTH_DEATH17: //# + case BOTH_DEATH18: //# + case BOTH_DEATH19: //# + case BOTH_DEATH20: //# + case BOTH_DEATH21: //# + case BOTH_DEATH22: //# + case BOTH_DEATH23: //# + case BOTH_DEATH24: //# + case BOTH_DEATH25: //# + + case BOTH_DEATHFORWARD1: //# First Death in which they get thrown forward + case BOTH_DEATHFORWARD2: //# Second Death in which they get thrown forward + case BOTH_DEATHFORWARD3: //# Tavion's falling in cin# 23 + case BOTH_DEATHBACKWARD1: //# First Death in which they get thrown backward + case BOTH_DEATHBACKWARD2: //# Second Death in which they get thrown backward + + case BOTH_DEATH1IDLE: //# Idle while close to death + case BOTH_LYINGDEATH1: //# Death to play when killed lying down + case BOTH_STUMBLEDEATH1: //# Stumble forward and fall face first death + case BOTH_FALLDEATH1: //# Fall forward off a high cliff and splat death - start + case BOTH_FALLDEATH1INAIR: //# Fall forward off a high cliff and splat death - loop + case BOTH_FALLDEATH1LAND: //# Fall forward off a high cliff and splat death - hit bottom + //# #sep case BOTH_ DEAD POSES # Should be last frame of corresponding previous anims + case BOTH_DEAD1: //# First Death finished pose + case BOTH_DEAD2: //# Second Death finished pose + case BOTH_DEAD3: //# Third Death finished pose + case BOTH_DEAD4: //# Fourth Death finished pose + case BOTH_DEAD5: //# Fifth Death finished pose + case BOTH_DEAD6: //# Sixth Death finished pose + case BOTH_DEAD7: //# Seventh Death finished pose + case BOTH_DEAD8: //# + case BOTH_DEAD9: //# + case BOTH_DEAD10: //# + case BOTH_DEAD11: //# + case BOTH_DEAD12: //# + case BOTH_DEAD13: //# + case BOTH_DEAD14: //# + case BOTH_DEAD15: //# + case BOTH_DEAD16: //# + case BOTH_DEAD17: //# + case BOTH_DEAD18: //# + case BOTH_DEAD19: //# + case BOTH_DEAD20: //# + case BOTH_DEAD21: //# + case BOTH_DEAD22: //# + case BOTH_DEAD23: //# + case BOTH_DEAD24: //# + case BOTH_DEAD25: //# + case BOTH_DEADFORWARD1: //# First thrown forward death finished pose + case BOTH_DEADFORWARD2: //# Second thrown forward death finished pose + case BOTH_DEADBACKWARD1: //# First thrown backward death finished pose + case BOTH_DEADBACKWARD2: //# Second thrown backward death finished pose + case BOTH_LYINGDEAD1: //# Killed lying down death finished pose + case BOTH_STUMBLEDEAD1: //# Stumble forward death finished pose + case BOTH_FALLDEAD1LAND: //# Fall forward and splat death finished pose + //# #sep case BOTH_ DEAD TWITCH/FLOP # React to being shot from death poses + case BOTH_DEADFLOP1: //# React to being shot from First Death finished pose + case BOTH_DEADFLOP2: //# React to being shot from Second Death finished pose + case BOTH_DISMEMBER_HEAD1: //# + case BOTH_DISMEMBER_TORSO1: //# + case BOTH_DISMEMBER_LLEG: //# + case BOTH_DISMEMBER_RLEG: //# + case BOTH_DISMEMBER_RARM: //# + case BOTH_DISMEMBER_LARM: //# + return qtrue; + break; + default: + return PM_InSpecialDeathAnim( pm->ps->legsAnim ); + break; + } +} + +qboolean PM_InCartwheel( int anim ) +{ + switch ( anim ) + { + case BOTH_ARIAL_LEFT: + case BOTH_ARIAL_RIGHT: + case BOTH_ARIAL_F1: + case BOTH_CARTWHEEL_LEFT: + case BOTH_CARTWHEEL_RIGHT: + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_InButterfly( int anim ) +{ + switch ( anim ) + { + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_StandingAnim( int anim ) +{//NOTE: does not check idles or special (cinematic) stands + switch ( anim ) + { + case BOTH_STAND1: + case BOTH_STAND2: + case BOTH_STAND3: + case BOTH_STAND4: + case BOTH_ATTACK3: + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_InAirKickingAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_A7_KICK_F_AIR: + case BOTH_A7_KICK_B_AIR: + case BOTH_A7_KICK_R_AIR: + case BOTH_A7_KICK_L_AIR: + return qtrue; + } + return qfalse; +} + +qboolean PM_KickingAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_A7_KICK_F: + case BOTH_A7_KICK_B: + case BOTH_A7_KICK_R: + case BOTH_A7_KICK_L: + case BOTH_A7_KICK_S: + case BOTH_A7_KICK_BF: + case BOTH_A7_KICK_RL: + //NOT a kick, but acts like one: + case BOTH_A7_HILT: + //NOT kicks, but do kick traces anyway + case BOTH_GETUP_BROLL_B: + case BOTH_GETUP_BROLL_F: + case BOTH_GETUP_FROLL_B: + case BOTH_GETUP_FROLL_F: + return qtrue; + break; + default: + return PM_InAirKickingAnim( anim ); + break; + } + //return qfalse; +} + +qboolean PM_StabDownAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_STABDOWN: + case BOTH_STABDOWN_STAFF: + case BOTH_STABDOWN_DUAL: + return qtrue; + } + return qfalse; +} + +qboolean PM_GoingToAttackDown( playerState_t *ps ) +{ + if ( PM_StabDownAnim( ps->torsoAnim )//stabbing downward + || ps->saberMove == LS_A_LUNGE//lunge + || ps->saberMove == LS_A_JUMP_T__B_//death from above + || ps->saberMove == LS_A_T2B//attacking top to bottom + || ps->saberMove == LS_S_T2B//starting at attack downward + || (PM_SaberInTransition( ps->saberMove ) && saberMoveData[ps->saberMove].endQuad == Q_T) )//transitioning to a top to bottom attack + { + return qtrue; + } + return qfalse; +} + +qboolean PM_ForceUsingSaberAnim( int anim ) +{//saber/acrobatic anims that should prevent you from recharging force power while you're in them... + switch ( anim ) + { + case BOTH_JUMPFLIPSLASHDOWN1: + case BOTH_JUMPFLIPSTABDOWN: + case BOTH_FORCELEAP2_T__B_: + case BOTH_JUMPATTACK6: + case BOTH_JUMPATTACK7: + case BOTH_FORCELONGLEAP_START: + case BOTH_FORCELONGLEAP_ATTACK: + case BOTH_FORCEWALLRUNFLIP_START: + case BOTH_FORCEWALLRUNFLIP_END: + case BOTH_FORCEWALLRUNFLIP_ALT: + case BOTH_FORCEWALLREBOUND_FORWARD: + case BOTH_FORCEWALLREBOUND_LEFT: + case BOTH_FORCEWALLREBOUND_BACK: + case BOTH_FORCEWALLREBOUND_RIGHT: + case BOTH_FLIP_ATTACK7: + case BOTH_FLIP_HOLD7: + case BOTH_FLIP_LAND: + case BOTH_PULL_IMPALE_STAB: + case BOTH_PULL_IMPALE_SWING: + case BOTH_A6_SABERPROTECT: + case BOTH_A7_SOULCAL: + case BOTH_A1_SPECIAL: + case BOTH_A2_SPECIAL: + case BOTH_A3_SPECIAL: + case BOTH_ARIAL_LEFT: + case BOTH_ARIAL_RIGHT: + case BOTH_CARTWHEEL_LEFT: + case BOTH_CARTWHEEL_RIGHT: + case BOTH_FLIP_LEFT: + case BOTH_FLIP_BACK1: + case BOTH_FLIP_BACK2: + case BOTH_FLIP_BACK3: + case BOTH_ALORA_FLIP_B: + case BOTH_BUTTERFLY_LEFT: + case BOTH_BUTTERFLY_RIGHT: + case BOTH_BUTTERFLY_FL1: + case BOTH_BUTTERFLY_FR1: + case BOTH_WALL_RUN_RIGHT: + case BOTH_WALL_RUN_RIGHT_FLIP: + case BOTH_WALL_RUN_RIGHT_STOP: + case BOTH_WALL_RUN_LEFT: + case BOTH_WALL_RUN_LEFT_FLIP: + case BOTH_WALL_RUN_LEFT_STOP: + case BOTH_WALL_FLIP_RIGHT: + case BOTH_WALL_FLIP_LEFT: + case BOTH_FORCEJUMP1: + case BOTH_FORCEINAIR1: + case BOTH_FORCELAND1: + case BOTH_FORCEJUMPBACK1: + case BOTH_FORCEINAIRBACK1: + case BOTH_FORCELANDBACK1: + case BOTH_FORCEJUMPLEFT1: + case BOTH_FORCEINAIRLEFT1: + case BOTH_FORCELANDLEFT1: + case BOTH_FORCEJUMPRIGHT1: + case BOTH_FORCEINAIRRIGHT1: + case BOTH_FORCELANDRIGHT1: + case BOTH_FLIP_F: + case BOTH_FLIP_B: + case BOTH_FLIP_L: + case BOTH_FLIP_R: + case BOTH_ALORA_FLIP_1: + case BOTH_ALORA_FLIP_2: + case BOTH_ALORA_FLIP_3: + case BOTH_DODGE_FL: + case BOTH_DODGE_FR: + case BOTH_DODGE_BL: + case BOTH_DODGE_BR: + case BOTH_DODGE_L: + case BOTH_DODGE_R: + case BOTH_DODGE_HOLD_FL: + case BOTH_DODGE_HOLD_FR: + case BOTH_DODGE_HOLD_BL: + case BOTH_DODGE_HOLD_BR: + case BOTH_DODGE_HOLD_L: + case BOTH_DODGE_HOLD_R: + case BOTH_FORCE_GETUP_F1: + case BOTH_FORCE_GETUP_F2: + case BOTH_FORCE_GETUP_B1: + case BOTH_FORCE_GETUP_B2: + case BOTH_FORCE_GETUP_B3: + case BOTH_FORCE_GETUP_B4: + case BOTH_FORCE_GETUP_B5: + case BOTH_FORCE_GETUP_B6: + case BOTH_GETUP_BROLL_B: + case BOTH_GETUP_BROLL_F: + case BOTH_GETUP_BROLL_L: + case BOTH_GETUP_BROLL_R: + case BOTH_GETUP_FROLL_B: + case BOTH_GETUP_FROLL_F: + case BOTH_GETUP_FROLL_L: + case BOTH_GETUP_FROLL_R: + case BOTH_WALL_FLIP_BACK1: + case BOTH_WALL_FLIP_BACK2: + case BOTH_SPIN1: + case BOTH_FJSS_TR_BL: + case BOTH_FJSS_TL_BR: + case BOTH_DEFLECTSLASH__R__L_FIN: + case BOTH_ARIAL_F1: + return qtrue; + } + return qfalse; +} + +qboolean G_HasKnockdownAnims( gentity_t *ent ) +{ + if ( PM_HasAnimation( ent, BOTH_KNOCKDOWN1 ) + && PM_HasAnimation( ent, BOTH_KNOCKDOWN2 ) + && PM_HasAnimation( ent, BOTH_KNOCKDOWN3 ) + && PM_HasAnimation( ent, BOTH_KNOCKDOWN4 ) + && PM_HasAnimation( ent, BOTH_KNOCKDOWN5 ) ) + { + return qtrue; + } + return qfalse; +} + +qboolean PM_InAttackRoll( int anim ) +{ + switch ( anim ) + { + case BOTH_GETUP_BROLL_B: + case BOTH_GETUP_BROLL_F: + case BOTH_GETUP_FROLL_B: + case BOTH_GETUP_FROLL_F: + return qtrue; + } + return qfalse; +} + +qboolean PM_LockedAnim( int anim ) +{//anims that can *NEVER* be overridden, regardless + switch ( anim ) + { + case BOTH_KYLE_PA_1: + case BOTH_KYLE_PA_2: + case BOTH_KYLE_PA_3: + case BOTH_PLAYER_PA_1: + case BOTH_PLAYER_PA_2: + case BOTH_PLAYER_PA_3: + case BOTH_PLAYER_PA_3_FLY: + case BOTH_TAVION_SCEPTERGROUND: + case BOTH_TAVION_SWORDPOWER: + case BOTH_SCEPTER_START: + case BOTH_SCEPTER_HOLD: + case BOTH_SCEPTER_STOP: + //grabbed by wampa + case BOTH_GRABBED: //# + case BOTH_RELEASED: //# when Wampa drops player, transitions into fall on back + case BOTH_HANG_IDLE: //# + case BOTH_HANG_ATTACK: //# + case BOTH_HANG_PAIN: //# + return qtrue; + } + return qfalse; +} + +qboolean PM_SuperBreakLoseAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_LK_S_DL_S_SB_1_L: //super break I lost + case BOTH_LK_S_DL_T_SB_1_L: //super break I lost + case BOTH_LK_S_ST_S_SB_1_L: //super break I lost + case BOTH_LK_S_ST_T_SB_1_L: //super break I lost + case BOTH_LK_S_S_S_SB_1_L: //super break I lost + case BOTH_LK_S_S_T_SB_1_L: //super break I lost + case BOTH_LK_DL_DL_S_SB_1_L: //super break I lost + case BOTH_LK_DL_DL_T_SB_1_L: //super break I lost + case BOTH_LK_DL_ST_S_SB_1_L: //super break I lost + case BOTH_LK_DL_ST_T_SB_1_L: //super break I lost + case BOTH_LK_DL_S_S_SB_1_L: //super break I lost + case BOTH_LK_DL_S_T_SB_1_L: //super break I lost + case BOTH_LK_ST_DL_S_SB_1_L: //super break I lost + case BOTH_LK_ST_DL_T_SB_1_L: //super break I lost + case BOTH_LK_ST_ST_S_SB_1_L: //super break I lost + case BOTH_LK_ST_ST_T_SB_1_L: //super break I lost + case BOTH_LK_ST_S_S_SB_1_L: //super break I lost + case BOTH_LK_ST_S_T_SB_1_L: //super break I lost + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_SuperBreakWinAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_LK_S_DL_S_SB_1_W: //super break I won + case BOTH_LK_S_DL_T_SB_1_W: //super break I won + case BOTH_LK_S_ST_S_SB_1_W: //super break I won + case BOTH_LK_S_ST_T_SB_1_W: //super break I won + case BOTH_LK_S_S_S_SB_1_W: //super break I won + case BOTH_LK_S_S_T_SB_1_W: //super break I won + case BOTH_LK_DL_DL_S_SB_1_W: //super break I won + case BOTH_LK_DL_DL_T_SB_1_W: //super break I won + case BOTH_LK_DL_ST_S_SB_1_W: //super break I won + case BOTH_LK_DL_ST_T_SB_1_W: //super break I won + case BOTH_LK_DL_S_S_SB_1_W: //super break I won + case BOTH_LK_DL_S_T_SB_1_W: //super break I won + case BOTH_LK_ST_DL_S_SB_1_W: //super break I won + case BOTH_LK_ST_DL_T_SB_1_W: //super break I won + case BOTH_LK_ST_ST_S_SB_1_W: //super break I won + case BOTH_LK_ST_ST_T_SB_1_W: //super break I won + case BOTH_LK_ST_S_S_SB_1_W: //super break I won + case BOTH_LK_ST_S_T_SB_1_W: //super break I won + return qtrue; + break; + } + return qfalse; +} + +qboolean PM_SaberLockBreakAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_BF1BREAK: + case BOTH_BF2BREAK: + case BOTH_CWCIRCLEBREAK: + case BOTH_CCWCIRCLEBREAK: + case BOTH_LK_S_DL_S_B_1_L: //normal break I lost + case BOTH_LK_S_DL_S_B_1_W: //normal break I won + case BOTH_LK_S_DL_T_B_1_L: //normal break I lost + case BOTH_LK_S_DL_T_B_1_W: //normal break I won + case BOTH_LK_S_ST_S_B_1_L: //normal break I lost + case BOTH_LK_S_ST_S_B_1_W: //normal break I won + case BOTH_LK_S_ST_T_B_1_L: //normal break I lost + case BOTH_LK_S_ST_T_B_1_W: //normal break I won + case BOTH_LK_S_S_S_B_1_L: //normal break I lost + case BOTH_LK_S_S_S_B_1_W: //normal break I won + case BOTH_LK_S_S_T_B_1_L: //normal break I lost + case BOTH_LK_S_S_T_B_1_W: //normal break I won + case BOTH_LK_DL_DL_S_B_1_L: //normal break I lost + case BOTH_LK_DL_DL_S_B_1_W: //normal break I won + case BOTH_LK_DL_DL_T_B_1_L: //normal break I lost + case BOTH_LK_DL_DL_T_B_1_W: //normal break I won + case BOTH_LK_DL_ST_S_B_1_L: //normal break I lost + case BOTH_LK_DL_ST_S_B_1_W: //normal break I won + case BOTH_LK_DL_ST_T_B_1_L: //normal break I lost + case BOTH_LK_DL_ST_T_B_1_W: //normal break I won + case BOTH_LK_DL_S_S_B_1_L: //normal break I lost + case BOTH_LK_DL_S_S_B_1_W: //normal break I won + case BOTH_LK_DL_S_T_B_1_L: //normal break I lost + case BOTH_LK_DL_S_T_B_1_W: //normal break I won + case BOTH_LK_ST_DL_S_B_1_L: //normal break I lost + case BOTH_LK_ST_DL_S_B_1_W: //normal break I won + case BOTH_LK_ST_DL_T_B_1_L: //normal break I lost + case BOTH_LK_ST_DL_T_B_1_W: //normal break I won + case BOTH_LK_ST_ST_S_B_1_L: //normal break I lost + case BOTH_LK_ST_ST_S_B_1_W: //normal break I won + case BOTH_LK_ST_ST_T_B_1_L: //normal break I lost + case BOTH_LK_ST_ST_T_B_1_W: //normal break I won + case BOTH_LK_ST_S_S_B_1_L: //normal break I lost + case BOTH_LK_ST_S_S_B_1_W: //normal break I won + case BOTH_LK_ST_S_T_B_1_L: //normal break I lost + case BOTH_LK_ST_S_T_B_1_W: //normal break I won + return (PM_SuperBreakLoseAnim(anim)||PM_SuperBreakWinAnim(anim)); + break; + } + return qfalse; +} + +qboolean PM_GetupAnimNoMove( int legsAnim ) +{ + switch( legsAnim ) + { + case BOTH_GETUP1: + case BOTH_GETUP2: + case BOTH_GETUP3: + case BOTH_GETUP4: + case BOTH_GETUP5: + case BOTH_GETUP_CROUCH_F1: + case BOTH_GETUP_CROUCH_B1: + case BOTH_FORCE_GETUP_F1: + case BOTH_FORCE_GETUP_F2: + case BOTH_FORCE_GETUP_B1: + case BOTH_FORCE_GETUP_B2: + case BOTH_FORCE_GETUP_B3: + case BOTH_FORCE_GETUP_B4: + case BOTH_FORCE_GETUP_B5: + case BOTH_FORCE_GETUP_B6: + return qtrue; + } + return qfalse; +} + +qboolean PM_KnockDownAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_KNOCKDOWN1: + case BOTH_KNOCKDOWN2: + case BOTH_KNOCKDOWN3: + case BOTH_KNOCKDOWN4: + case BOTH_KNOCKDOWN5: + /* + //special anims: + case BOTH_RELEASED: + case BOTH_LK_DL_ST_T_SB_1_L: + case BOTH_PLAYER_PA_3_FLY: + */ + return qtrue; + break; + /* + default: + return PM_InGetUp( ps ); + break; + */ + } + return qfalse; +} + +qboolean PM_KnockDownAnimExtended( int anim ) +{ + switch ( anim ) + { + case BOTH_KNOCKDOWN1: + case BOTH_KNOCKDOWN2: + case BOTH_KNOCKDOWN3: + case BOTH_KNOCKDOWN4: + case BOTH_KNOCKDOWN5: + //special anims: + case BOTH_RELEASED: + case BOTH_LK_DL_ST_T_SB_1_L: + case BOTH_PLAYER_PA_3_FLY: + return qtrue; + break; + /* + default: + return PM_InGetUp( ps ); + break; + */ + } + return qfalse; +} + +qboolean PM_SaberInKata( saberMoveName_t saberMove ) +{ + switch ( saberMove ) + { + case LS_A1_SPECIAL: + case LS_A2_SPECIAL: + case LS_A3_SPECIAL: + case LS_DUAL_SPIN_PROTECT: + case LS_STAFF_SOULCAL: + return qtrue; + default: + break; + } + return qfalse; +} + +qboolean PM_CanRollFromSoulCal( playerState_t *ps ) +{ + if ( ps->legsAnim == BOTH_A7_SOULCAL + && ps->legsAnimTimer < 700 + && ps->legsAnimTimer > 250 ) + { + return qtrue; + } + return qfalse; +} + +qboolean BG_FullBodyTauntAnim( int anim ) +{ + switch ( anim ) + { + case BOTH_GESTURE1: + case BOTH_DUAL_TAUNT: + case BOTH_STAFF_TAUNT: + case BOTH_BOW: + case BOTH_MEDITATE: + case BOTH_SHOWOFF_FAST: + case BOTH_SHOWOFF_MEDIUM: + case BOTH_SHOWOFF_STRONG: + case BOTH_SHOWOFF_DUAL: + case BOTH_SHOWOFF_STAFF: + case BOTH_VICTORY_FAST: + case BOTH_VICTORY_MEDIUM: + case BOTH_VICTORY_STRONG: + case BOTH_VICTORY_DUAL: + case BOTH_VICTORY_STAFF: + return qtrue; + break; + } + return qfalse; +} diff --git a/code/game/bg_public.h b/code/game/bg_public.h index 91785e15ad..835f829d63 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __BG_PUBLIC_H__ #define __BG_PUBLIC_H__ diff --git a/code/game/bg_slidemove.cpp b/code/game/bg_slidemove.cpp index 3463d8f3e1..5beeac7179 100644 --- a/code/game/bg_slidemove.cpp +++ b/code/game/bg_slidemove.cpp @@ -1,22 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this include must remain at the top of every bg_xxxx CPP file #include "common_headers.h" #include "../qcommon/q_shared.h" @@ -88,13 +92,13 @@ qboolean PM_SlideMove( float gravMod ) { } } } - + numbumps = 4; VectorCopy (pm->ps->velocity, primal_velocity); VectorCopy (pm->ps->velocity, endVelocity); - if ( gravMod ) + if ( gravMod ) { if ( !(pm->ps->eFlags&EF_FORCE_GRIPPED) && !(pm->ps->eFlags&EF_FORCE_DRAINED) ) { @@ -102,11 +106,11 @@ qboolean PM_SlideMove( float gravMod ) { } pm->ps->velocity[2] = ( pm->ps->velocity[2] + endVelocity[2] ) * 0.5; primal_velocity[2] = endVelocity[2]; - if ( pml.groundPlane ) + if ( pml.groundPlane ) { if ( PM_GroundSlideOkay( pml.groundTrace.plane.normal[2] ) ) {// slide along the ground plane - PM_ClipVelocity( pm->ps->velocity, pml.groundTrace.plane.normal, + PM_ClipVelocity( pm->ps->velocity, pml.groundTrace.plane.normal, pm->ps->velocity, OVERCLIP ); } } @@ -115,7 +119,7 @@ qboolean PM_SlideMove( float gravMod ) { time_left = pml.frametime; // never turn against the ground plane - if ( pml.groundPlane ) + if ( pml.groundPlane ) { numplanes = 1; VectorCopy( pml.groundTrace.plane.normal, planes[0] ); @@ -124,8 +128,8 @@ qboolean PM_SlideMove( float gravMod ) { planes[0][2] = 0; VectorNormalize( planes[0] ); } - } - else + } + else { numplanes = 0; } @@ -155,18 +159,18 @@ qboolean PM_SlideMove( float gravMod ) { } } - if ( trace.allsolid ) + if ( trace.allsolid ) {// entity is completely trapped in another solid pm->ps->velocity[2] = 0; // don't build up falling damage, but allow sideways acceleration return qtrue; } - if ( trace.fraction > 0 ) + if ( trace.fraction > 0 ) {// actually covered some distance VectorCopy( trace.endpos, pm->ps->origin ); } - if ( trace.fraction == 1 ) + if ( trace.fraction == 1 ) { break; // moved the entire distance } @@ -195,7 +199,7 @@ qboolean PM_SlideMove( float gravMod ) { continue; } - if (pm->gent->client && + if (pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE && trace.plane.normal[2]gent->m_pVehicle->m_pVehicleInfo->maxSlope ) @@ -205,7 +209,7 @@ qboolean PM_SlideMove( float gravMod ) { time_left -= time_left * trace.fraction; - if ( numplanes >= MAX_CLIP_PLANES ) + if ( numplanes >= MAX_CLIP_PLANES ) {// this shouldn't really happen VectorClear( pm->ps->velocity ); return qtrue; @@ -331,14 +335,14 @@ PM_StepSlideMove ================== */ -void PM_StepSlideMove( float gravMod ) +void PM_StepSlideMove( float gravMod ) { vec3_t start_o, start_v; vec3_t down_o, down_v; vec3_t slideMove, stepUpMove; trace_t trace; vec3_t up, down; - qboolean cantStepUpFwd, isGiant = qfalse;; + qboolean /*cantStepUpFwd, */isGiant = qfalse;; int stepSize = STEPSIZE; VectorCopy (pm->ps->origin, start_o); @@ -350,7 +354,7 @@ void PM_StepSlideMove( float gravMod ) } if ( PM_SlideMove( gravMod ) == 0 ) { - return; // we got exactly where we wanted to go first try + return; // we got exactly where we wanted to go first try }//else Bumped into something, see if we can step over it if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE && pm->gent->m_pVehicle->m_pVehicleInfo->hoverHeight > 0 ) @@ -359,7 +363,7 @@ void PM_StepSlideMove( float gravMod ) return; } - if ( pm->gent + if ( pm->gent && pm->gent->client && (pm->gent->client->NPC_class == CLASS_ATST||pm->gent->client->NPC_class == CLASS_RANCOR) ) { @@ -396,7 +400,7 @@ void PM_StepSlideMove( float gravMod ) return; } - if ( !pm->ps->velocity[0] && !pm->ps->velocity[1] ) + if ( !pm->ps->velocity[0] && !pm->ps->velocity[1] ) {//All our velocity was cancelled sliding return; } @@ -419,14 +423,14 @@ void PM_StepSlideMove( float gravMod ) if ( pm->debugLevel ) { - G_DebugLine(start_o,trace.endpos,2000,0xffffff,qtrue); + G_DebugLine(start_o,trace.endpos,2000,0xffffff,qtrue); } //===Another slidemove forward================================================================================ // try slidemove from this position VectorCopy( trace.endpos, pm->ps->origin ); VectorCopy( start_v, pm->ps->velocity ); - cantStepUpFwd = PM_SlideMove( gravMod ); + /*cantStepUpFwd = */PM_SlideMove( gravMod ); //===Another slidemove forward================================================================================ if ( pm->debugLevel ) @@ -468,7 +472,7 @@ void PM_StepSlideMove( float gravMod ) //Then it might still be okay, so we figure out the slope of the entire move //from (A) to (B) and if that slope is walk-upabble, then it's okay VectorSubtract( trace.endpos, down_o, stepVec ); - VectorNormalize( stepVec ); + VectorNormalize( stepVec ); if ( stepVec[2] > (1.0f-MIN_WALK_NORMAL) ) { if ( pm->debugLevel ) @@ -483,8 +487,8 @@ void PM_StepSlideMove( float gravMod ) if ( !trace.allsolid && !skipStep ) //normal players cannot step up slopes that are too steep to walk on! { - if ( pm->ps->clientNum - && isGiant + if ( pm->ps->clientNum + && isGiant && g_entities[trace.entityNum].client && pm->gent && pm->gent->client @@ -501,8 +505,8 @@ void PM_StepSlideMove( float gravMod ) VectorCopy (start_v, pm->ps->velocity); } } - else if ( pm->ps->clientNum - && isGiant + else if ( pm->ps->clientNum + && isGiant && g_entities[trace.entityNum].client && g_entities[trace.entityNum].client->playerTeam == pm->gent->client->playerTeam ) {//AT-ST's don't step up on allies @@ -522,7 +526,7 @@ void PM_StepSlideMove( float gravMod ) VectorCopy( trace.endpos, pm->ps->origin ); if ( g_stepSlideFix->integer ) { - if ( trace.fraction < 1.0 ) + if ( trace.fraction < 1.0 ) { PM_ClipVelocity( pm->ps->velocity, trace.plane.normal, pm->ps->velocity, OVERCLIP ); } @@ -539,7 +543,7 @@ void PM_StepSlideMove( float gravMod ) } if ( !g_stepSlideFix->integer ) { - if ( trace.fraction < 1.0 ) + if ( trace.fraction < 1.0 ) { PM_ClipVelocity( pm->ps->velocity, trace.plane.normal, pm->ps->velocity, OVERCLIP ); } @@ -565,7 +569,7 @@ void PM_StepSlideMove( float gravMod ) if ( pm->debugLevel ) { Com_Printf("%i:bend\n", c_pmove); } - } else + } else #endif { // use the step move diff --git a/code/game/bg_vehicleLoad.cpp b/code/game/bg_vehicleLoad.cpp index 0ff5de3cd8..82658f01cb 100644 --- a/code/game/bg_vehicleLoad.cpp +++ b/code/game/bg_vehicleLoad.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //bg_vehicleLoad.c @@ -130,7 +134,7 @@ typedef enum { VF_IGNORE, VF_INT, VF_FLOAT, - VF_LSTRING, // string on disk, pointer in memory, TAG_LEVEL + VF_STRING, // string on disk, pointer in memory VF_VECTOR, VF_BOOL, VF_VEHTYPE, @@ -153,9 +157,9 @@ typedef struct vehFieldType_t type; } vehField_t; -vehField_t vehWeaponFields[NUM_VWEAP_PARMS] = +vehField_t vehWeaponFields[] = { - {"name", VWFOFS(name), VF_LSTRING}, //unique name of the vehicle + {"name", VWFOFS(name), VF_STRING}, //unique name of the vehicle {"projectile", VWFOFS(bIsProjectile), VF_BOOL}, //traceline or entity? {"hasGravity", VWFOFS(bHasGravity), VF_BOOL}, //if a projectile, drops {"ionWeapon", VWFOFS(bIonWeapon), VF_BOOL}, //disables ship shields and sends them out of control @@ -182,9 +186,22 @@ vehField_t vehWeaponFields[NUM_VWEAP_PARMS] = {"explodeOnExpire", VWFOFS(bExplodeOnExpire), VF_BOOL}, //when iLifeTime is up, explodes rather than simply removing itself }; -static qboolean BG_ParseVehWeaponParm( vehWeaponInfo_t *vehWeapon, char *parmName, char *pValue ) +static const size_t numVehWeaponFields = ARRAY_LEN( vehWeaponFields ); + +static vehField_t *FindVehWeaponParm( const char *parmName ) { - int i; + size_t i; + for ( i = 0; itype ) { - if ( vehWeaponFields[i].name && !Q_stricmp( vehWeaponFields[i].name, parmName ) ) - { - // found it - switch( vehWeaponFields[i].type ) - { - case VF_INT: - *(int *)(b+vehWeaponFields[i].ofs) = atoi(value); - break; - case VF_FLOAT: - *(float *)(b+vehWeaponFields[i].ofs) = atof(value); - break; - case VF_LSTRING: // string on disk, pointer in memory, TAG_LEVEL - if (!*(char **)(b+vehWeaponFields[i].ofs)) - { //just use 1024 bytes in case we want to write over the string + case VF_INT: + *(int *)(b+vehWeaponField->ofs) = atoi(value); + break; + case VF_FLOAT: + *(float *)(b+vehWeaponField->ofs) = atof(value); + break; + case VF_STRING: // string on disk, pointer in memory + if (!*(char **)(b+vehWeaponField->ofs)) + { //just use 1024 bytes in case we want to write over the string #ifdef _JK2MP - *(char **)(b+vehWeaponFields[i].ofs) = (char *)BG_Alloc(1024);//(char *)BG_Alloc(strlen(value)); - strcpy(*(char **)(b+vehWeaponFields[i].ofs), value); + *(char **)(b+vehWeaponField->ofs) = (char *)BG_Alloc(1024);//(char *)BG_Alloc(strlen(value)); + strcpy(*(char **)(b+vehWeaponField->ofs), value); #else - (*(char **)(b+vehWeaponFields[i].ofs)) = G_NewString( value ); -#endif - } - - break; - case VF_VECTOR: - _iFieldsRead = sscanf (value, "%f %f %f", &vec[0], &vec[1], &vec[2]); - assert(_iFieldsRead==3 ); - if (_iFieldsRead!=3) - { - Com_Printf (S_COLOR_YELLOW"BG_ParseVehWeaponParm: VEC3 sscanf() failed to read 3 floats ('angle' key bug?)\n"); - } - ((float *)(b+vehWeaponFields[i].ofs))[0] = vec[0]; - ((float *)(b+vehWeaponFields[i].ofs))[1] = vec[1]; - ((float *)(b+vehWeaponFields[i].ofs))[2] = vec[2]; - break; - case VF_BOOL: - *(qboolean *)(b+vehWeaponFields[i].ofs) = (qboolean)(atof(value)!=0); - break; - case VF_VEHTYPE: - vehType = (vehicleType_t)GetIDForString( VehicleTable, value ); - *(vehicleType_t *)(b+vehWeaponFields[i].ofs) = vehType; - break; - case VF_ANIM: - { - int anim = GetIDForString( animTable, value ); - *(int *)(b+vehWeaponFields[i].ofs) = anim; - } - break; - case VF_WEAPON: // take string, resolve into index into VehWeaponParms - //*(int *)(b+vehWeaponFields[i].ofs) = VEH_VehWeaponIndexForName( value ); - break; - case VF_MODEL:// take the string, get the G_ModelIndex + (*(char **)(b+vehWeaponField->ofs)) = G_NewString( value ); +#endif + } + + break; + case VF_VECTOR: + _iFieldsRead = sscanf (value, "%f %f %f", &vec[0], &vec[1], &vec[2]); + //assert(_iFieldsRead==3 ); + if (_iFieldsRead!=3) + { + Com_Printf (S_COLOR_YELLOW"BG_ParseVehWeaponParm: VEC3 sscanf() failed to read 3 floats ('angle' key bug?)\n"); + VectorClear( vec ); + } + ((float *)(b+vehWeaponField->ofs))[0] = vec[0]; + ((float *)(b+vehWeaponField->ofs))[1] = vec[1]; + ((float *)(b+vehWeaponField->ofs))[2] = vec[2]; + break; + case VF_BOOL: + *(qboolean *)(b+vehWeaponField->ofs) = (qboolean)(atof(value)!=0); + break; + case VF_VEHTYPE: + vehType = (vehicleType_t)GetIDForString( VehicleTable, value ); + *(vehicleType_t *)(b+vehWeaponField->ofs) = vehType; + break; + case VF_ANIM: + { + int anim = GetIDForString( animTable, value ); + *(int *)(b+vehWeaponField->ofs) = anim; + } + break; + case VF_WEAPON: // take string, resolve into index into VehWeaponParms + //*(int *)(b+vehWeaponField->ofs) = VEH_VehWeaponIndexForName( value ); + break; + case VF_MODEL:// take the string, get the G_ModelIndex #ifdef QAGAME - *(int *)(b+vehWeaponFields[i].ofs) = G_ModelIndex( value ); + *(int *)(b+vehWeaponField->ofs) = G_ModelIndex( value ); #else - *(int *)(b+vehWeaponFields[i].ofs) = trap_R_RegisterModel( value ); + *(int *)(b+vehWeaponField->ofs) = trap_R_RegisterModel( value ); #endif - break; - case VF_MODEL_CLIENT: // (MP cgame only) take the string, get the G_ModelIndex + break; + case VF_MODEL_CLIENT: // (MP cgame only) take the string, get the G_ModelIndex #ifndef _JK2MP - *(int *)(b+vehWeaponFields[i].ofs) = G_ModelIndex( value ); + *(int *)(b+vehWeaponField->ofs) = G_ModelIndex( value ); #elif defined QAGAME - //*(int *)(b+vehWeaponFields[i].ofs) = G_ModelIndex( value ); + //*(int *)(b+vehWeaponField->ofs) = G_ModelIndex( value ); #else - *(int *)(b+vehWeaponFields[i].ofs) = trap_R_RegisterModel( value ); + *(int *)(b+vehWeaponField->ofs) = trap_R_RegisterModel( value ); #endif - break; - case VF_EFFECT: // take the string, get the G_EffectIndex + break; + case VF_EFFECT: // take the string, get the G_EffectIndex #ifdef QAGAME - *(int *)(b+vehWeaponFields[i].ofs) = G_EffectIndex( value ); + *(int *)(b+vehWeaponField->ofs) = G_EffectIndex( value ); #elif defined CGAME - *(int *)(b+vehWeaponFields[i].ofs) = trap_FX_RegisterEffect( value ); + *(int *)(b+vehWeaponField->ofs) = trap_FX_RegisterEffect( value ); #endif - break; - case VF_EFFECT_CLIENT: // (MP cgame only) take the string, get the index + break; + case VF_EFFECT_CLIENT: // (MP cgame only) take the string, get the index #ifndef _JK2MP - *(int *)(b+vehWeaponFields[i].ofs) = G_EffectIndex( value ); + *(int *)(b+vehWeaponField->ofs) = G_EffectIndex( value ); #elif defined QAGAME - //*(int *)(b+vehWeaponFields[i].ofs) = G_EffectIndex( value ); + //*(int *)(b+vehWeaponField->ofs) = G_EffectIndex( value ); #elif defined CGAME - *(int *)(b+vehWeaponFields[i].ofs) = trap_FX_RegisterEffect( value ); + *(int *)(b+vehWeaponField->ofs) = trap_FX_RegisterEffect( value ); #endif - break; - case VF_SHADER: // (cgame only) take the string, call trap_R_RegisterShader + break; + case VF_SHADER: // (cgame only) take the string, call trap_R_RegisterShader #ifdef WE_ARE_IN_THE_UI - *(int *)(b+vehWeaponFields[i].ofs) = trap_R_RegisterShaderNoMip( value ); + *(int *)(b+vehWeaponField->ofs) = trap_R_RegisterShaderNoMip( value ); #elif defined CGAME - *(int *)(b+vehWeaponFields[i].ofs) = trap_R_RegisterShader( value ); + *(int *)(b+vehWeaponField->ofs) = trap_R_RegisterShader( value ); #endif - break; - case VF_SHADER_NOMIP:// (cgame only) take the string, call trap_R_RegisterShaderNoMip + break; + case VF_SHADER_NOMIP:// (cgame only) take the string, call trap_R_RegisterShaderNoMip #ifndef QAGAME - *(int *)(b+vehWeaponFields[i].ofs) = trap_R_RegisterShaderNoMip( value ); + *(int *)(b+vehWeaponField->ofs) = trap_R_RegisterShaderNoMip( value ); #endif - break; - case VF_SOUND: // take the string, get the G_SoundIndex + break; + case VF_SOUND: // take the string, get the G_SoundIndex #ifdef QAGAME - *(int *)(b+vehWeaponFields[i].ofs) = G_SoundIndex( value ); + *(int *)(b+vehWeaponField->ofs) = G_SoundIndex( value ); #else - *(int *)(b+vehWeaponFields[i].ofs) = trap_S_RegisterSound( value ); + *(int *)(b+vehWeaponField->ofs) = trap_S_RegisterSound( value ); #endif - break; - case VF_SOUND_CLIENT: // (MP cgame only) take the string, get the index + break; + case VF_SOUND_CLIENT: // (MP cgame only) take the string, get the index #ifndef _JK2MP - *(int *)(b+vehWeaponFields[i].ofs) = G_SoundIndex( value ); + *(int *)(b+vehWeaponField->ofs) = G_SoundIndex( value ); #elif defined QAGAME - //*(int *)(b+vehWeaponFields[i].ofs) = G_SoundIndex( value ); + //*(int *)(b+vehWeaponField->ofs) = G_SoundIndex( value ); #else - *(int *)(b+vehWeaponFields[i].ofs) = trap_S_RegisterSound( value ); + *(int *)(b+vehWeaponField->ofs) = trap_S_RegisterSound( value ); #endif - break; - default: - //Unknown type? - return qfalse; - break; - } - break; - } - } - if ( i == NUM_VWEAP_PARMS ) - { - return qfalse; - } - else - { - return qtrue; + break; + default: + //Unknown type? + return qfalse; } + + return qtrue; } int VEH_LoadVehWeapon( const char *vehWeaponName ) @@ -345,7 +354,7 @@ int VEH_LoadVehWeapon( const char *vehWeaponName ) vehWeapon = &g_vehWeaponInfo[numVehicleWeapons]; // look for the right vehicle weapon - while ( p ) + while ( p ) { token = COM_ParseExt( &p, qtrue ); if ( token[0] == 0 ) @@ -354,14 +363,14 @@ int VEH_LoadVehWeapon( const char *vehWeaponName ) return qfalse; } - if ( !Q_stricmp( token, vehWeaponName ) ) + if ( !Q_stricmp( token, vehWeaponName ) ) { break; } SkipBracedSection( &p ); } - if ( !p ) + if ( !p ) { COM_EndParseSession( ); return qfalse; @@ -374,25 +383,25 @@ int VEH_LoadVehWeapon( const char *vehWeaponName ) return VEH_WEAPON_NONE; } - if ( Q_stricmp( token, "{" ) != 0 ) + if ( Q_stricmp( token, "{" ) != 0 ) { COM_EndParseSession( ); return VEH_WEAPON_NONE; } - + // parse the vehWeapon info block - while ( 1 ) + while ( 1 ) { SkipRestOfLine( &p ); token = COM_ParseExt( &p, qtrue ); - if ( !token[0] ) + if ( !token[0] ) { Com_Printf( S_COLOR_RED"ERROR: unexpected EOF while parsing Vehicle Weapon '%s'\n", vehWeaponName ); COM_EndParseSession( ); return VEH_WEAPON_NONE; } - if ( !Q_stricmp( token, "}" ) ) + if ( !Q_stricmp( token, "}" ) ) { break; } @@ -466,9 +475,9 @@ int VEH_VehWeaponIndexForName( const char *vehWeaponName ) return vw; } -vehField_t vehicleFields[] = +vehField_t vehicleFields[] = { - {"name", VFOFS(name), VF_LSTRING}, //unique name of the vehicle + {"name", VFOFS(name), VF_STRING}, //unique name of the vehicle //general data {"type", VFOFS(type), VF_VEHTYPE}, //what kind of vehicle @@ -504,7 +513,7 @@ vehField_t vehicleFields[] = {"friction", VFOFS(friction), VF_FLOAT}, //how much velocity is cut on its own {"maxSlope", VFOFS(maxSlope), VF_FLOAT}, //the max slope that it can go up with control {"speedDependantTurning", VFOFS(speedDependantTurning), VF_BOOL},//vehicle turns faster the faster it's going - + //durability stats {"mass", VFOFS(mass), VF_INT}, //for momentum and impact force (player mass is 10) {"armor", VFOFS(armor), VF_INT}, //total points of damage it can take @@ -515,11 +524,11 @@ vehField_t vehicleFields[] = {"surfDestruction", VFOFS(surfDestruction), VF_INT}, //visuals & sounds - {"model", VFOFS(model), VF_LSTRING}, //what model to use - if make it an NPC's primary model, don't need this? - {"skin", VFOFS(skin), VF_LSTRING}, //what skin to use - if make it an NPC's primary model, don't need this? + {"model", VFOFS(model), VF_STRING}, //what model to use - if make it an NPC's primary model, don't need this? + {"skin", VFOFS(skin), VF_STRING}, //what skin to use - if make it an NPC's primary model, don't need this? {"g2radius", VFOFS(g2radius), VF_INT}, //render radius (really diameter, but...) for the ghoul2 model {"riderAnim", VFOFS(riderAnim), VF_ANIM}, //what animation the rider uses - {"droidNPC", VFOFS(droidNPC), VF_LSTRING}, //NPC to attach to *droidunit tag (if it exists in the model) + {"droidNPC", VFOFS(droidNPC), VF_STRING}, //NPC to attach to *droidunit tag (if it exists in the model) #ifdef _JK2MP {"radarIcon", VFOFS(radarIconHandle), VF_SHADER_NOMIP}, //what icon to show on radar in MP @@ -597,7 +606,7 @@ vehField_t vehicleFields[] = //sound to play when out of ammo (plays default "no ammo" sound if none specified) {"weap1SoundNoAmmo", VFOFS(weapon[0].soundNoAmmo), VF_SOUND_CLIENT},//sound to play when try to fire weapon 1 with no ammo {"weap2SoundNoAmmo", VFOFS(weapon[1].soundNoAmmo), VF_SOUND_CLIENT},//sound to play when try to fire weapon 2 with no ammo - + // Which weapon a muzzle fires (has to match one of the weapons this vehicle has). {"weapMuzzle1", VFOFS(weapMuzzle[0]), VF_WEAPON}, {"weapMuzzle2", VFOFS(weapMuzzle[1]), VF_WEAPON}, @@ -649,8 +658,8 @@ vehField_t vehicleFields[] = {"turret1Delay", VFOFS(turret[0].iDelay), VF_INT}, {"turret1AmmoMax", VFOFS(turret[0].iAmmoMax), VF_INT}, {"turret1AmmoRechargeMS", VFOFS(turret[0].iAmmoRechargeMS), VF_INT}, - {"turret1YawBone", VFOFS(turret[0].yawBone), VF_LSTRING}, - {"turret1PitchBone", VFOFS(turret[0].pitchBone), VF_LSTRING}, + {"turret1YawBone", VFOFS(turret[0].yawBone), VF_STRING}, + {"turret1PitchBone", VFOFS(turret[0].pitchBone), VF_STRING}, {"turret1YawAxis", VFOFS(turret[0].yawAxis), VF_INT}, {"turret1PitchAxis", VFOFS(turret[0].pitchAxis), VF_INT}, {"turret1ClampYawL", VFOFS(turret[0].yawClampLeft), VF_FLOAT}, //how far the turret is allowed to turn left @@ -664,15 +673,15 @@ vehField_t vehicleFields[] = {"turret1AILead", VFOFS(turret[0].bAILead), VF_BOOL}, {"turret1AIRange", VFOFS(turret[0].fAIRange), VF_FLOAT}, {"turret1PassengerNum", VFOFS(turret[0].passengerNum), VF_INT},//which number passenger can control this turret - {"turret1GunnerViewTag", VFOFS(turret[0].gunnerViewTag), VF_LSTRING}, - + {"turret1GunnerViewTag", VFOFS(turret[0].gunnerViewTag), VF_STRING}, + //Turret 2 {"turret2Weap", VFOFS(turret[1].iWeapon), VF_WEAPON}, {"turret2Delay", VFOFS(turret[1].iDelay), VF_INT}, {"turret2AmmoMax", VFOFS(turret[1].iAmmoMax), VF_INT}, {"turret2AmmoRechargeMS", VFOFS(turret[1].iAmmoRechargeMS), VF_INT}, - {"turret2YawBone", VFOFS(turret[1].yawBone), VF_LSTRING}, - {"turret2PitchBone", VFOFS(turret[1].pitchBone), VF_LSTRING}, + {"turret2YawBone", VFOFS(turret[1].yawBone), VF_STRING}, + {"turret2PitchBone", VFOFS(turret[1].pitchBone), VF_STRING}, {"turret2YawAxis", VFOFS(turret[1].yawAxis), VF_INT}, {"turret2PitchAxis", VFOFS(turret[1].pitchAxis), VF_INT}, {"turret2ClampYawL", VFOFS(turret[1].yawClampLeft), VF_FLOAT}, //how far the turret is allowed to turn left @@ -686,12 +695,12 @@ vehField_t vehicleFields[] = {"turret2AILead", VFOFS(turret[1].bAILead), VF_BOOL}, {"turret2AIRange", VFOFS(turret[1].fAIRange), VF_FLOAT}, {"turret2PassengerNum", VFOFS(turret[1].passengerNum), VF_INT},//which number passenger can control this turret - {"turret2GunnerViewTag", VFOFS(turret[1].gunnerViewTag), VF_LSTRING}, + {"turret2GunnerViewTag", VFOFS(turret[1].gunnerViewTag), VF_STRING}, //===END TURRETS=========================================================================== - //terminating entry - {0, -1, VF_INT} }; +static const size_t numVehicleFields = ARRAY_LEN( vehicleFields ); + stringID_table_t VehicleTable[VH_NUM_VEHICLES+1] = { ENUM2STRING(VH_NONE), @@ -773,7 +782,7 @@ void BG_VehicleSetDefaults( vehicleInfo_t *vehicle ) vehicle->pitchLimit = VEH_DEFAULT_PITCH_LIMIT; //how far it can pitch forward or backward vehicle->braking = VEH_DEFAULT_BRAKING; //when pressing on decelerator (backwards) vehicle->turningSpeed = VEH_DEFAULT_TURNING_SPEED; //how quickly you can turn - vehicle->turnWhenStopped = qfalse; //whether or not you can turn when not moving + vehicle->turnWhenStopped = qfalse; //whether or not you can turn when not moving vehicle->traction = VEH_DEFAULT_TRACTION; //how much your command input affects velocity vehicle->friction = VEH_DEFAULT_FRICTION; //how much velocity is cut on its own vehicle->maxSlope = VEH_DEFAULT_MAX_SLOPE; //the max slope that it can go up with control @@ -862,9 +871,20 @@ void BG_VehicleClampData( vehicleInfo_t *vehicle ) } } +static vehField_t *FindVehicleParm( const char *parmName ) +{ + size_t i; + for ( i = 0; itype ) { - if ( !Q_stricmp( vehicleFields[i].name, parmName ) ) - { - // found it - switch( vehicleFields[i].type ) - { - case VF_IGNORE: - break; - case VF_INT: - *(int *)(b+vehicleFields[i].ofs) = atoi(value); - break; - case VF_FLOAT: - *(float *)(b+vehicleFields[i].ofs) = atof(value); - break; - case VF_LSTRING: // string on disk, pointer in memory, TAG_LEVEL - if (!*(char **)(b+vehicleFields[i].ofs)) - { //just use 128 bytes in case we want to write over the string + case VF_IGNORE: + break; + case VF_INT: + *(int *)(b+vehField->ofs) = atoi(value); + break; + case VF_FLOAT: + *(float *)(b+vehField->ofs) = atof(value); + break; + case VF_STRING: // string on disk, pointer in memory + if (!*(char **)(b+vehField->ofs)) + { //just use 128 bytes in case we want to write over the string #ifdef _JK2MP - *(char **)(b+vehicleFields[i].ofs) = (char *)BG_Alloc(128);//(char *)BG_Alloc(strlen(value)); - strcpy(*(char **)(b+vehicleFields[i].ofs), value); + *(char **)(b+vehField->ofs) = (char *)BG_Alloc(128);//(char *)BG_Alloc(strlen(value)); + strcpy(*(char **)(b+vehField->ofs), value); #else - (*(char **)(b+vehicleFields[i].ofs)) = G_NewString( value ); -#endif - } - - break; - case VF_VECTOR: - _iFieldsRead = sscanf (value, "%f %f %f", &vec[0], &vec[1], &vec[2]); - assert(_iFieldsRead==3 ); - if (_iFieldsRead!=3) - { - Com_Printf (S_COLOR_YELLOW"BG_ParseVehicleParm: VEC3 sscanf() failed to read 3 floats ('angle' key bug?)\n"); - } - ((float *)(b+vehWeaponFields[i].ofs))[0] = vec[0]; - ((float *)(b+vehWeaponFields[i].ofs))[1] = vec[1]; - ((float *)(b+vehWeaponFields[i].ofs))[2] = vec[2]; - break; - case VF_BOOL: - *(qboolean *)(b+vehicleFields[i].ofs) = (qboolean)(atof(value)!=0); - break; - case VF_VEHTYPE: - vehType = (vehicleType_t)GetIDForString( VehicleTable, value ); - *(vehicleType_t *)(b+vehicleFields[i].ofs) = vehType; - break; - case VF_ANIM: - { - int anim = GetIDForString( animTable, value ); - *(int *)(b+vehicleFields[i].ofs) = anim; - } - break; - case VF_WEAPON: // take string, resolve into index into VehWeaponParms - *(int *)(b+vehicleFields[i].ofs) = VEH_VehWeaponIndexForName( value ); - break; - case VF_MODEL: // take the string, get the G_ModelIndex + (*(char **)(b+vehField->ofs)) = G_NewString( value ); +#endif + } + + break; + case VF_VECTOR: + _iFieldsRead = sscanf (value, "%f %f %f", &vec[0], &vec[1], &vec[2]); + //assert(_iFieldsRead==3 ); + if (_iFieldsRead!=3) + { + Com_Printf (S_COLOR_YELLOW"BG_ParseVehicleParm: VEC3 sscanf() failed to read 3 floats ('angle' key bug?)\n"); + VectorClear( vec ); + } + ((float *)(b+vehField->ofs))[0] = vec[0]; + ((float *)(b+vehField->ofs))[1] = vec[1]; + ((float *)(b+vehField->ofs))[2] = vec[2]; + break; + case VF_BOOL: + *(qboolean *)(b+vehField->ofs) = (qboolean)(atof(value)!=0); + break; + case VF_VEHTYPE: + vehType = (vehicleType_t)GetIDForString( VehicleTable, value ); + *(vehicleType_t *)(b+vehField->ofs) = vehType; + break; + case VF_ANIM: + { + int anim = GetIDForString( animTable, value ); + *(int *)(b+vehField->ofs) = anim; + } + break; + case VF_WEAPON: // take string, resolve into index into VehWeaponParms + *(int *)(b+vehField->ofs) = VEH_VehWeaponIndexForName( value ); + break; + case VF_MODEL: // take the string, get the G_ModelIndex #ifdef QAGAME - *(int *)(b+vehicleFields[i].ofs) = G_ModelIndex( value ); + *(int *)(b+vehField->ofs) = G_ModelIndex( value ); #else - *(int *)(b+vehicleFields[i].ofs) = trap_R_RegisterModel( value ); + *(int *)(b+vehField->ofs) = trap_R_RegisterModel( value ); #endif - break; - case VF_MODEL_CLIENT: // (MP cgame only) take the string, get the G_ModelIndex + break; + case VF_MODEL_CLIENT: // (MP cgame only) take the string, get the G_ModelIndex #ifndef _JK2MP - *(int *)(b+vehicleFields[i].ofs) = G_ModelIndex( value ); + *(int *)(b+vehField->ofs) = G_ModelIndex( value ); #elif defined QAGAME - //*(int *)(b+vehicleFields[i].ofs) = G_ModelIndex( value ); + //*(int *)(b+vehField->ofs) = G_ModelIndex( value ); #else - *(int *)(b+vehicleFields[i].ofs) = trap_R_RegisterModel( value ); + *(int *)(b+vehField->ofs) = trap_R_RegisterModel( value ); #endif - break; - case VF_EFFECT: // take the string, get the G_EffectIndex + break; + case VF_EFFECT: // take the string, get the G_EffectIndex #ifdef QAGAME - *(int *)(b+vehicleFields[i].ofs) = G_EffectIndex( value ); + *(int *)(b+vehField->ofs) = G_EffectIndex( value ); #elif defined CGAME - *(int *)(b+vehicleFields[i].ofs) = trap_FX_RegisterEffect( value ); + *(int *)(b+vehField->ofs) = trap_FX_RegisterEffect( value ); #endif - break; - case VF_EFFECT_CLIENT: // (MP cgame only) take the string, get the G_EffectIndex + break; + case VF_EFFECT_CLIENT: // (MP cgame only) take the string, get the G_EffectIndex #ifndef _JK2MP - *(int *)(b+vehicleFields[i].ofs) = G_EffectIndex( value ); + *(int *)(b+vehField->ofs) = G_EffectIndex( value ); #elif defined QAGAME - //*(int *)(b+vehicleFields[i].ofs) = G_EffectIndex( value ); + //*(int *)(b+vehField->ofs) = G_EffectIndex( value ); #elif defined CGAME - *(int *)(b+vehicleFields[i].ofs) = trap_FX_RegisterEffect( value ); + *(int *)(b+vehField->ofs) = trap_FX_RegisterEffect( value ); #endif - break; - case VF_SHADER: // (cgame only) take the string, call trap_R_RegisterShader + break; + case VF_SHADER: // (cgame only) take the string, call trap_R_RegisterShader #ifdef WE_ARE_IN_THE_UI - *(int *)(b+vehicleFields[i].ofs) = trap_R_RegisterShaderNoMip( value ); + *(int *)(b+vehField->ofs) = trap_R_RegisterShaderNoMip( value ); #elif defined CGAME - *(int *)(b+vehicleFields[i].ofs) = trap_R_RegisterShader( value ); + *(int *)(b+vehField->ofs) = trap_R_RegisterShader( value ); #endif - break; - case VF_SHADER_NOMIP:// (cgame only) take the string, call trap_R_RegisterShaderNoMip + break; + case VF_SHADER_NOMIP:// (cgame only) take the string, call trap_R_RegisterShaderNoMip #ifndef QAGAME - *(int *)(b+vehicleFields[i].ofs) = trap_R_RegisterShaderNoMip( value ); + *(int *)(b+vehField->ofs) = trap_R_RegisterShaderNoMip( value ); #endif - break; - case VF_SOUND: // take the string, get the G_SoundIndex + break; + case VF_SOUND: // take the string, get the G_SoundIndex #ifdef QAGAME - *(int *)(b+vehicleFields[i].ofs) = G_SoundIndex( value ); + *(int *)(b+vehField->ofs) = G_SoundIndex( value ); #else - *(int *)(b+vehicleFields[i].ofs) = trap_S_RegisterSound( value ); + *(int *)(b+vehField->ofs) = trap_S_RegisterSound( value ); #endif - break; - case VF_SOUND_CLIENT: // (MP cgame only) take the string, get the G_SoundIndex + break; + case VF_SOUND_CLIENT: // (MP cgame only) take the string, get the G_SoundIndex #ifndef _JK2MP - *(int *)(b+vehicleFields[i].ofs) = G_SoundIndex( value ); + *(int *)(b+vehField->ofs) = G_SoundIndex( value ); #elif defined QAGAME - //*(int *)(b+vehicleFields[i].ofs) = G_SoundIndex( value ); + //*(int *)(b+vehField->ofs) = G_SoundIndex( value ); #else - *(int *)(b+vehicleFields[i].ofs) = trap_S_RegisterSound( value ); + *(int *)(b+vehField->ofs) = trap_S_RegisterSound( value ); #endif - break; - default: - //Unknown type? - return qfalse; - break; - } - break; - } - } - if ( vehicleFields[i].ofs == -1 ) - { - return qfalse; - } - else - { - return qtrue; + break; + default: + //Unknown type? + return qfalse; } + + return qtrue; } int VEH_LoadVehicle( const char *vehicleName ) @@ -1027,7 +1039,7 @@ int VEH_LoadVehicle( const char *vehicleName ) vehicleInfo_t *vehicle = NULL; // Load the vehicle parms if no vehicles have been loaded yet. - if ( numVehicles == 0 ) + if ( numVehicles == 0 ) { BG_VehicleLoadParms(); } @@ -1043,7 +1055,7 @@ int VEH_LoadVehicle( const char *vehicleName ) vehicle = &g_vehicleInfo[numVehicles]; // look for the right vehicle - while ( p ) + while ( p ) { token = COM_ParseExt( &p, qtrue ); if ( token[0] == 0 ) @@ -1052,7 +1064,7 @@ int VEH_LoadVehicle( const char *vehicleName ) return VEHICLE_NONE; } - if ( !Q_stricmp( token, vehicleName ) ) + if ( !Q_stricmp( token, vehicleName ) ) { break; } @@ -1073,26 +1085,26 @@ int VEH_LoadVehicle( const char *vehicleName ) return VEHICLE_NONE; } - if ( Q_stricmp( token, "{" ) != 0 ) + if ( Q_stricmp( token, "{" ) != 0 ) { COM_EndParseSession( ); return VEHICLE_NONE; } - + BG_VehicleSetDefaults( vehicle ); // parse the vehicle info block - while ( 1 ) + while ( 1 ) { SkipRestOfLine( &p ); token = COM_ParseExt( &p, qtrue ); - if ( !token[0] ) + if ( !token[0] ) { Com_Printf( S_COLOR_RED"ERROR: unexpected EOF while parsing Vehicle '%s'\n", vehicleName ); COM_EndParseSession( ); return VEHICLE_NONE; } - if ( !Q_stricmp( token, "}" ) ) + if ( !Q_stricmp( token, "}" ) ) { break; } @@ -1418,7 +1430,7 @@ int VEH_VehicleIndexForName( const char *vehicleName ) } //we have room for another one, load it up and return the index //HMM... should we not even load the .veh file until we want to? - v = VEH_LoadVehicle( vehicleName ); + v = VEH_LoadVehicle( vehicleName ); if ( v == VEHICLE_NONE ) { Com_Printf( S_COLOR_RED"ERROR: Could not find Vehicle %s!\n", vehicleName ); @@ -1426,7 +1438,7 @@ int VEH_VehicleIndexForName( const char *vehicleName ) return v; } -void BG_VehWeaponLoadParms( void ) +void BG_VehWeaponLoadParms( void ) { int len, totallen, vehExtFNLen, mainBlockLen, fileCnt, i; char *holdChar, *marker; @@ -1455,12 +1467,12 @@ void BG_VehWeaponLoadParms( void ) #else tempReadBuffer = (char *)gi.Malloc( MAX_VEH_WEAPON_DATA_SIZE, TAG_G_ALLOC, qtrue ); #endif - + // NOTE: Not use TempAlloc anymore... //Make ABSOLUTELY CERTAIN that BG_Alloc/etc. is not used before - //the subsequent BG_TempFree or the pool will be screwed. + //the subsequent BG_TempFree or the pool will be screwed. - for ( i = 0; i < fileCnt; i++, holdChar += vehExtFNLen + 1 ) + for ( i = 0; i < fileCnt; i++, holdChar += vehExtFNLen + 1 ) { vehExtFNLen = strlen( holdChar ); @@ -1473,7 +1485,7 @@ void BG_VehWeaponLoadParms( void ) len = gi.FS_FOpenFile(va( "ext_data/vehicles/weapons/%s", holdChar), &f, FS_READ); #endif - if ( len == -1 ) + if ( len == -1 ) { Com_Printf( "error reading file\n" ); } @@ -1492,7 +1504,7 @@ void BG_VehWeaponLoadParms( void ) { strcat( marker, " " ); totallen++; - marker++; + marker++; } if ( totallen + len >= MAX_VEH_WEAPON_DATA_SIZE ) { @@ -1517,7 +1529,7 @@ void BG_VehWeaponLoadParms( void ) #endif } -void BG_VehicleLoadParms( void ) +void BG_VehicleLoadParms( void ) {//HMM... only do this if there's a vehicle on the level? int len, totallen, vehExtFNLen, mainBlockLen, fileCnt, i; // const char *filename = "ext_data/vehicles.dat"; @@ -1547,12 +1559,12 @@ void BG_VehicleLoadParms( void ) #else tempReadBuffer = (char *)gi.Malloc( MAX_VEHICLE_DATA_SIZE, TAG_G_ALLOC, qtrue ); #endif - + // NOTE: Not use TempAlloc anymore... //Make ABSOLUTELY CERTAIN that BG_Alloc/etc. is not used before - //the subsequent BG_TempFree or the pool will be screwed. + //the subsequent BG_TempFree or the pool will be screwed. - for ( i = 0; i < fileCnt; i++, holdChar += vehExtFNLen + 1 ) + for ( i = 0; i < fileCnt; i++, holdChar += vehExtFNLen + 1 ) { vehExtFNLen = strlen( holdChar ); @@ -1565,7 +1577,7 @@ void BG_VehicleLoadParms( void ) len = gi.FS_FOpenFile(va( "ext_data/vehicles/%s", holdChar), &f, FS_READ); #endif - if ( len == -1 ) + if ( len == -1 ) { Com_Printf( "error reading file\n" ); } @@ -1584,7 +1596,7 @@ void BG_VehicleLoadParms( void ) { strcat( marker, " " ); totallen++; - marker++; + marker++; } if ( totallen + len >= MAX_VEHICLE_DATA_SIZE ) { @@ -1607,7 +1619,7 @@ void BG_VehicleLoadParms( void ) #else gi.Free(tempReadBuffer); tempReadBuffer = NULL; #endif - + numVehicles = 1;//first one is null/default //set the first vehicle to default data BG_VehicleSetDefaults( &g_vehicleInfo[VEHICLE_BASE] ); @@ -1634,13 +1646,13 @@ void BG_GetVehicleModelName(char *modelname) char *vehName = &modelname[1]; int vIndex = BG_VehicleGetIndex(vehName); assert(modelname[0] == '$'); - + if (vIndex == VEHICLE_NONE) { Com_Error(ERR_DROP, "BG_GetVehicleModelName: couldn't find vehicle %s", vehName); } - strcpy(modelname, g_vehicleInfo[vIndex].model); + strcpy(modelname, g_vehicleInfo[vIndex].model); } void BG_GetVehicleSkinName(char *skinname) @@ -1648,20 +1660,20 @@ void BG_GetVehicleSkinName(char *skinname) char *vehName = &skinname[1]; int vIndex = BG_VehicleGetIndex(vehName); assert(skinname[0] == '$'); - + if (vIndex == VEHICLE_NONE) { Com_Error(ERR_DROP, "BG_GetVehicleSkinName: couldn't find vehicle %s", vehName); } - if ( !g_vehicleInfo[vIndex].skin + if ( !g_vehicleInfo[vIndex].skin || !g_vehicleInfo[vIndex].skin[0] ) { skinname[0] = 0; } else { - strcpy(skinname, g_vehicleInfo[vIndex].skin); + strcpy(skinname, g_vehicleInfo[vIndex].skin); } } diff --git a/code/game/bset.h b/code/game/bset.h index 9d8df9b4c1..de391dc0e4 100644 --- a/code/game/bset.h +++ b/code/game/bset.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software typedef enum //# bSet_e {//This should check to matching a behavior state name first, then look for a script diff --git a/code/game/bstate.h b/code/game/bstate.h index abc904e442..b1769d38c1 100644 --- a/code/game/bstate.h +++ b/code/game/bstate.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __BSTATE_H__ #define __BSTATE_H__ diff --git a/code/game/channels.h b/code/game/channels.h index e4f20630a1..64a4eee573 100644 --- a/code/game/channels.h +++ b/code/game/channels.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // These entries are now also duplicated in ModView, so tell me if you need any adding or removing. // Note that the order is ok to change, I only read/write text strings of them anyway, but tell me if there diff --git a/code/game/common_headers.h b/code/game/common_headers.h index fbceb057c5..cff7b9ecd2 100644 --- a/code/game/common_headers.h +++ b/code/game/common_headers.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #pragma once #if !defined(COMMON_HEADERS_H_INC) diff --git a/code/game/dmstates.h b/code/game/dmstates.h index e8a9ab5a14..8ddf0982e3 100644 --- a/code/game/dmstates.h +++ b/code/game/dmstates.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __DMSTATES_H__ #define __DMSTATES_H__ diff --git a/code/game/events.h b/code/game/events.h index 766b681d8e..5d7f7a8f32 100644 --- a/code/game/events.h +++ b/code/game/events.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __EVENTS__ #define __EVENTS__ diff --git a/code/game/fields.h b/code/game/fields.h index 978f5003d2..04e82cb976 100644 --- a/code/game/fields.h +++ b/code/game/fields.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- fields.h // @@ -73,7 +77,7 @@ typedef enum typedef struct { const char *psName; - int iOffset; + size_t iOffset; fieldtypeSAVE_t eFieldType; } save_field_t; diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index ba98da8ba7..aa46ae4985 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "g_local.h" #include "g_functions.h" @@ -4740,17 +4745,17 @@ extern void ForceHeal(gentity_t *ent); static void ProcessGenericCmd(gentity_t *ent, byte cmd) { switch(cmd) { - case 0: + default: break; - case GENCMD_FORCE_DRAIN: - ForceDrain2(ent); + case GENCMD_FORCE_HEAL: + ForceHeal( ent ); + break; + case GENCMD_FORCE_SPEED: + ForceSpeed( ent ); break; case GENCMD_FORCE_THROW: ForceThrow(ent, qfalse); break; - case GENCMD_FORCE_SPEED: - ForceSpeed(ent); - break; case GENCMD_FORCE_PULL: ForceThrow(ent, qtrue); break; @@ -4772,12 +4777,12 @@ static void ProcessGenericCmd(gentity_t *ent, byte cmd) case GENCMD_FORCE_ABSORB: ForceAbsorb(ent); break; + case GENCMD_FORCE_DRAIN: + ForceDrain2( ent ); + break; case GENCMD_FORCE_SEEING: ForceSeeing(ent); break; - case GENCMD_FORCE_HEAL: - ForceHeal(ent); - break; } } diff --git a/code/game/g_breakable.cpp b/code/game/g_breakable.cpp index ae766fe22d..87531ec19a 100644 --- a/code/game/g_breakable.cpp +++ b/code/game/g_breakable.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "g_local.h" #include "g_functions.h" diff --git a/code/game/g_camera.cpp b/code/game/g_camera.cpp index 515daff4f2..3f7727c76b 100644 --- a/code/game/g_camera.cpp +++ b/code/game/g_camera.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + //g_camera.cpp #include "g_local.h" #include "../cgame/cg_camera.h" diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index 386ca86cce..7ee56a938f 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "../icarus/IcarusInterface.h" #include "../cgame/cg_local.h" @@ -1217,6 +1222,11 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch { Com_sprintf( strTemp, 128, "*muzzle%d", i + 1 ); ent->m_pVehicle->m_iMuzzleTag[i] = gi.G2API_AddBolt( &ent->ghoul2[ent->playerModel], strTemp ); + if ( ent->m_pVehicle->m_iMuzzleTag[i] == -1 ) + {//ergh, try *flash? + Com_sprintf( strTemp, 128, "*flash%d", i + 1 ); + ent->m_pVehicle->m_iMuzzleTag[i] = gi.G2API_AddBolt( &ent->ghoul2[ent->playerModel], strTemp ); + } } } else if ( ent->client->NPC_class == CLASS_HOWLER ) diff --git a/code/game/g_cmds.cpp b/code/game/g_cmds.cpp index 8ee6ea69b8..9da7905624 100644 --- a/code/game/g_cmds.cpp +++ b/code/game/g_cmds.cpp @@ -1,20 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + #include "g_local.h" #include "objectives.h" #include "wp_saber.h" diff --git a/code/game/g_combat.cpp b/code/game/g_combat.cpp index 749060bc67..44fc974f7a 100644 --- a/code/game/g_combat.cpp +++ b/code/game/g_combat.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // g_combat.c diff --git a/code/game/g_emplaced.cpp b/code/game/g_emplaced.cpp index 2ccbf6b40c..b5ce8f1a2c 100644 --- a/code/game/g_emplaced.cpp +++ b/code/game/g_emplaced.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "g_local.h" #include "g_functions.h" diff --git a/code/game/g_functions.cpp b/code/game/g_functions.cpp index 845d239453..ba0b730797 100644 --- a/code/game/g_functions.cpp +++ b/code/game/g_functions.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- g_functions.cpp // diff --git a/code/game/g_functions.h b/code/game/g_functions.h index 4afca8bf5c..c2a40ecadb 100644 --- a/code/game/g_functions.h +++ b/code/game/g_functions.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- g_functions.h // diff --git a/code/game/g_fx.cpp b/code/game/g_fx.cpp index ec39321eb3..847179bb33 100644 --- a/code/game/g_fx.cpp +++ b/code/game/g_fx.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "g_local.h" #include "g_functions.h" @@ -248,14 +252,14 @@ void SP_fx_runner( gentity_t *ent ) return; } - // Try and associate an effect file, unfortunately we won't know if this worked or not + // Try and associate an effect file, unfortunately we won't know if this worked or not // until the CGAME trys to register it... ent->fxID = G_EffectIndex( ent->fxFile ); ent->s.eType = ET_MOVER; // Give us a bit of time to spawn in the other entities, since we may have to target one of 'em - ent->e_ThinkFunc = thinkF_fx_runner_link; + ent->e_ThinkFunc = thinkF_fx_runner_link; ent->nextthink = level.time + 400; // Save our position and link us up! @@ -272,7 +276,7 @@ void SP_fx_runner( gentity_t *ent ) This world effect will spawn snow globally into the level. */ void SP_CreateSnow( gentity_t *ent ) -{ +{ cvar_t *r_weatherScale = gi.cvar( "r_weatherScale", "1", CVAR_ARCHIVE ); if ( r_weatherScale->value == 0.0f ) { @@ -402,7 +406,7 @@ void SP_CreateWindZone( gentity_t *ent ) VectorScale(windDir, ent->speed, windDir); char temp[256]; - sprintf( temp, "windzone ( %f %f %f ) ( %f %f %f ) ( %f %f %f )", + sprintf( temp, "windzone ( %f %f %f ) ( %f %f %f ) ( %f %f %f )", ent->mins[0], ent->mins[1], ent->mins[2], ent->maxs[0], ent->maxs[1], ent->maxs[2], windDir[0], windDir[1], windDir[2] @@ -488,9 +492,9 @@ void fx_rain_think( gentity_t *ent ) // Play The Effect //----------------- if (PlayEffect) - { + { VectorMA(player->currentOrigin, 400.0f, effectDir, effectPos); - if (PlaySound) + if (PlaySound) { G_Sound(player, G_SoundIndex(va("sound/ambience/thunder_close%d", Q_irand(1,2)))); } @@ -531,7 +535,7 @@ void fx_rain_think( gentity_t *ent ) } void SP_CreateRain( gentity_t *ent ) -{ +{ // Different Types Of Rain //------------------------- if (ent->spawnflags & 1) @@ -588,7 +592,7 @@ void SP_CreateRain( gentity_t *ent ) G_EffectIndex( "env/huge_lightning" ); ent->e_ThinkFunc = thinkF_fx_rain_think; ent->nextthink = level.time + Q_irand(4000, 8000); - + if (!G_SpawnVector( "flashcolor", "200 200 200", ent->pos3)) { VectorSet(ent->pos3, 200, 200, 200); @@ -644,16 +648,16 @@ default 0 blendmode default 0 -// How much to rotate particles per second (in degree's). +// How much to rotate particles per second (in degree's). rotate ( , ) default ( 0, 0 ) // Set the area around the player the puffs cover: -spread ( minX minY minZ ) ( maxX maxY maxZ ) +spread ( minX minY minZ ) ( maxX maxY maxZ ) default: ( -600 -600 -500 ) ( 600 600 550 ) // Set the random range that sets the speed the puffs fall: -velocity ( minX minY minZ ) ( maxX maxY maxZ ) +velocity ( minX minY minZ ) ( maxX maxY maxZ ) default: ( -15 -15 -20 ) ( 15 15 -70 ) // Set an area of puff blowing: @@ -670,7 +674,7 @@ blowing size ( minX minY minZ ) */ //---------------------------------------------------------- void SP_CreatePuffSystem( gentity_t *ent ) -{ +{ char temp[128]; // Initialize the puff system to either 1000 particles or whatever they choose. @@ -739,7 +743,7 @@ void SP_CreatePuffSystem( gentity_t *ent ) */ //---------------------------------------------------------- /*void SP_Command( gentity_t *ent ) -{ +{ char *strCommand; // Go through all the commands. @@ -779,10 +783,10 @@ void fx_explosion_trail_think( gentity_t *ent ) EvaluateTrajectory( &ent->s.pos, level.time, origin ); - gi.trace( &tr, ent->currentOrigin, vec3_origin, vec3_origin, origin, + gi.trace( &tr, ent->currentOrigin, vec3_origin, vec3_origin, origin, ent->owner ? ent->owner->s.number : ENTITYNUM_NONE, ent->clipmask, G2_RETURNONHIT, 10 ); - if ( tr.fraction < 1.0f ) + if ( tr.fraction < 1.0f ) { // never explode or bounce on sky if ( !( tr.surfaceFlags & SURF_NOIMPACT )) @@ -902,7 +906,7 @@ void fx_explosion_trail_link( gentity_t *ent ) VectorSubtract( target->s.origin, ent->s.origin, dir ); VectorNormalize( dir ); } - else + else { // we are assuming that we have angles, but there are no checks to verify this AngleVectors( ent->s.angles, dir, NULL, NULL ); @@ -965,7 +969,7 @@ void SP_fx_explosion_trail( gentity_t *ent ) } // Give us a bit of time to spawn in the other entities, since we may have to target one of 'em - ent->e_ThinkFunc = thinkF_fx_explosion_trail_link; + ent->e_ThinkFunc = thinkF_fx_explosion_trail_link; ent->nextthink = level.time + 500; // Save our position and link us up! @@ -992,7 +996,7 @@ void fx_target_beam_set_debounce( gentity_t *self ) { self->e_UseFunc = useF_NULL; } - else + else { self->attackDebounceTime = level.time + FRAMETIME + Q_irand( -self->random, self->random ); } @@ -1003,18 +1007,17 @@ void fx_target_beam_fire( gentity_t *ent ) { trace_t trace; vec3_t dir, org, end; - int ignore; qboolean open; if ( !ent->enemy || !ent->enemy->inuse ) {//info_null most likely - ignore = ent->s.number; + //ignore = ent->s.number; ent->enemy = NULL; VectorCopy( ent->s.origin2, org ); } else { - ignore = ent->enemy->s.number; + //ignore = ent->enemy->s.number; VectorCopy( ent->enemy->currentOrigin, org ); } @@ -1117,7 +1120,6 @@ void fx_target_beam_link( gentity_t *ent ) { gentity_t *target = NULL; vec3_t dir; - float len; target = G_Find( target, FOFS(targetname), ent->target ); @@ -1135,9 +1137,9 @@ void fx_target_beam_link( gentity_t *ent ) G_SetEnemy( ent, target ); } VectorSubtract( target->s.origin, ent->s.origin, dir );//er, does it ever use dir? - len = VectorNormalize( dir );//er, does it use len or dir? + /*len = */VectorNormalize( dir );//er, does it use len or dir? vectoangles( dir, ent->s.angles );//er, does it use s.angles? - + VectorCopy( target->s.origin, ent->s.origin2 ); if ( ent->spawnflags & 1 ) diff --git a/code/game/g_inventory.cpp b/code/game/g_inventory.cpp index 1a659b3345..2ac285af1d 100644 --- a/code/game/g_inventory.cpp +++ b/code/game/g_inventory.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //g_inventory.cpp #include "g_local.h" diff --git a/code/game/g_itemLoad.cpp b/code/game/g_itemLoad.cpp index a1f43e3b4b..d8e10d7cff 100644 --- a/code/game/g_itemLoad.cpp +++ b/code/game/g_itemLoad.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //g_itemLoad.cpp //reads in ext_data\items.dat to bg_itemlist[] @@ -25,7 +29,7 @@ This file is part of Jedi Academy. #define PICKUPSOUND "sound/weapons/w_pkup.wav" //qboolean COM_ParseInt( char **data, int *i ); -//qboolean COM_ParseString( char **data, char **s ); +//qboolean COM_ParseString( char **data, char **s ); //qboolean COM_ParseFloat( char **data, float *f ); extern gitem_t bg_itemlist[]; @@ -48,7 +52,7 @@ static void IT_Type (const char **holdBuf); static void IT_WorldModel (const char **holdBuf); -typedef struct +typedef struct { const char *parmName; void (*func)(const char **holdBuf); @@ -57,7 +61,7 @@ typedef struct #define IT_PARM_MAX 10 -itemParms_t ItemParms[IT_PARM_MAX] = +itemParms_t ItemParms[IT_PARM_MAX] = { { "itemname", IT_Name }, { "classname", IT_ClassName }, @@ -93,65 +97,65 @@ static void IT_Name(const char **holdBuf) int itemNum; const char *tokenStr; - if (COM_ParseString(holdBuf,&tokenStr)) + if (COM_ParseString(holdBuf,&tokenStr)) { return; } - if (!Q_stricmp(tokenStr,"ITM_NONE")) + if (!Q_stricmp(tokenStr,"ITM_NONE")) itemNum = ITM_NONE; - else if (!Q_stricmp(tokenStr,"ITM_STUN_BATON_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_STUN_BATON_PICKUP")) itemNum = ITM_STUN_BATON_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_SABER_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_SABER_PICKUP")) itemNum = ITM_SABER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_BRYAR_PISTOL_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_BRYAR_PISTOL_PICKUP")) itemNum = ITM_BRYAR_PISTOL_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_BLASTER_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_BLASTER_PICKUP")) itemNum = ITM_BLASTER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_DISRUPTOR_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_DISRUPTOR_PICKUP")) itemNum = ITM_DISRUPTOR_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_BOWCASTER_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_BOWCASTER_PICKUP")) itemNum = ITM_BOWCASTER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_REPEATER_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_REPEATER_PICKUP")) itemNum = ITM_REPEATER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_DEMP2_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_DEMP2_PICKUP")) itemNum = ITM_DEMP2_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_FLECHETTE_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_FLECHETTE_PICKUP")) itemNum = ITM_FLECHETTE_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_ROCKET_LAUNCHER_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_ROCKET_LAUNCHER_PICKUP")) itemNum = ITM_ROCKET_LAUNCHER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_THERMAL_DET_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_THERMAL_DET_PICKUP")) itemNum = ITM_THERMAL_DET_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_TRIP_MINE_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_TRIP_MINE_PICKUP")) itemNum = ITM_TRIP_MINE_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_DET_PACK_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_DET_PACK_PICKUP")) itemNum = ITM_DET_PACK_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_BOT_LASER_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_BOT_LASER_PICKUP")) itemNum = ITM_BOT_LASER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_EMPLACED_GUN_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_EMPLACED_GUN_PICKUP")) itemNum = ITM_EMPLACED_GUN_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_TURRET_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_TURRET_PICKUP")) itemNum = ITM_TURRET_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_MELEE")) + else if (!Q_stricmp(tokenStr,"ITM_MELEE")) itemNum = ITM_MELEE; - else if (!Q_stricmp(tokenStr,"ITM_ATST_MAIN_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_ATST_MAIN_PICKUP")) itemNum = ITM_ATST_MAIN_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_ATST_SIDE_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_ATST_SIDE_PICKUP")) itemNum = ITM_ATST_SIDE_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_TIE_FIGHTER_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_TIE_FIGHTER_PICKUP")) itemNum = ITM_TIE_FIGHTER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_RAPID_FIRE_CONC_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_RAPID_FIRE_CONC_PICKUP")) itemNum = ITM_RAPID_FIRE_CONC_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_JAWA_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_JAWA_PICKUP")) itemNum = ITM_JAWA_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_TUSKEN_RIFLE_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_TUSKEN_RIFLE_PICKUP")) itemNum = ITM_TUSKEN_RIFLE_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_TUSKEN_STAFF_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_TUSKEN_STAFF_PICKUP")) itemNum = ITM_TUSKEN_STAFF_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_SCEPTER_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_SCEPTER_PICKUP")) itemNum = ITM_SCEPTER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_NOGHRI_STICK_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_NOGHRI_STICK_PICKUP")) itemNum = ITM_NOGHRI_STICK_PICKUP; //ammo else if (!Q_stricmp(tokenStr,"ITM_AMMO_FORCE_PICKUP")) @@ -208,37 +212,37 @@ static void IT_Name(const char **holdBuf) { itemNum = ITM_FORCE_SABERTHROW_PICKUP; } - else if (!Q_stricmp(tokenStr,"ITM_BATTERY_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_BATTERY_PICKUP")) { itemNum = ITM_BATTERY_PICKUP; } - else if (!Q_stricmp(tokenStr,"ITM_SEEKER_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_SEEKER_PICKUP")) itemNum = ITM_SEEKER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_SHIELD_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_SHIELD_PICKUP")) itemNum = ITM_SHIELD_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_BACTA_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_BACTA_PICKUP")) itemNum = ITM_BACTA_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_DATAPAD_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_DATAPAD_PICKUP")) itemNum = ITM_DATAPAD_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_BINOCULARS_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_BINOCULARS_PICKUP")) itemNum = ITM_BINOCULARS_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_SENTRY_GUN_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_SENTRY_GUN_PICKUP")) itemNum = ITM_SENTRY_GUN_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_LA_GOGGLES_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_LA_GOGGLES_PICKUP")) itemNum = ITM_LA_GOGGLES_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_BLASTER_PISTOL_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_BLASTER_PISTOL_PICKUP")) itemNum = ITM_BLASTER_PISTOL_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_CONCUSSION_RIFLE_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_CONCUSSION_RIFLE_PICKUP")) itemNum = ITM_CONCUSSION_RIFLE_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_MEDPAK_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_MEDPAK_PICKUP")) itemNum = ITM_MEDPAK_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_SHIELD_SM_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_SHIELD_SM_PICKUP")) itemNum = ITM_SHIELD_SM_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_SHIELD_LRG_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_SHIELD_LRG_PICKUP")) itemNum = ITM_SHIELD_LRG_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_GOODIE_KEY_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_GOODIE_KEY_PICKUP")) itemNum = ITM_GOODIE_KEY_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_SECURITY_KEY_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_SECURITY_KEY_PICKUP")) itemNum = ITM_SECURITY_KEY_PICKUP; else { @@ -246,7 +250,7 @@ static void IT_Name(const char **holdBuf) gi.Printf("WARNING: bad itemname in external item data '%s'\n", tokenStr); } - itemParms.itemNum = itemNum; + itemParms.itemNum = itemNum; // ++bg_numItems; IT_SetDefaults(); @@ -257,7 +261,7 @@ static void IT_ClassName(const char **holdBuf) int len; const char *tokenStr; - if (COM_ParseString(holdBuf,&tokenStr)) + if (COM_ParseString(holdBuf,&tokenStr)) { return; } @@ -281,7 +285,7 @@ static void IT_WorldModel(const char **holdBuf) int len; const char *tokenStr; - if (COM_ParseString(holdBuf,&tokenStr)) + if (COM_ParseString(holdBuf,&tokenStr)) { return; } @@ -305,50 +309,50 @@ static void IT_Tag(const char **holdBuf) int tag; const char *tokenStr; - if (COM_ParseString(holdBuf,&tokenStr)) + if (COM_ParseString(holdBuf,&tokenStr)) { return; } - if (!Q_stricmp(tokenStr,"WP_NONE")) + if (!Q_stricmp(tokenStr,"WP_NONE")) tag = WP_NONE; - else if (!Q_stricmp(tokenStr,"WP_STUN_BATON")) + else if (!Q_stricmp(tokenStr,"WP_STUN_BATON")) tag = WP_STUN_BATON; - else if (!Q_stricmp(tokenStr,"WP_SABER")) + else if (!Q_stricmp(tokenStr,"WP_SABER")) tag = WP_SABER; - else if (!Q_stricmp(tokenStr,"WP_BLASTER_PISTOL")) + else if (!Q_stricmp(tokenStr,"WP_BLASTER_PISTOL")) tag = WP_BLASTER_PISTOL; - else if (!Q_stricmp(tokenStr,"WP_BRYAR_PISTOL")) + else if (!Q_stricmp(tokenStr,"WP_BRYAR_PISTOL")) tag = WP_BRYAR_PISTOL; - else if (!Q_stricmp(tokenStr,"WP_BLASTER")) + else if (!Q_stricmp(tokenStr,"WP_BLASTER")) tag = WP_BLASTER; - else if (!Q_stricmp(tokenStr,"WP_DISRUPTOR")) + else if (!Q_stricmp(tokenStr,"WP_DISRUPTOR")) tag = WP_DISRUPTOR; - else if (!Q_stricmp(tokenStr,"WP_BOWCASTER")) + else if (!Q_stricmp(tokenStr,"WP_BOWCASTER")) tag = WP_BOWCASTER; - else if (!Q_stricmp(tokenStr,"WP_REPEATER")) + else if (!Q_stricmp(tokenStr,"WP_REPEATER")) tag = WP_REPEATER; - else if (!Q_stricmp(tokenStr,"WP_DEMP2")) + else if (!Q_stricmp(tokenStr,"WP_DEMP2")) tag = WP_DEMP2; - else if (!Q_stricmp(tokenStr,"WP_FLECHETTE")) + else if (!Q_stricmp(tokenStr,"WP_FLECHETTE")) tag = WP_FLECHETTE; - else if (!Q_stricmp(tokenStr,"WP_ROCKET_LAUNCHER")) + else if (!Q_stricmp(tokenStr,"WP_ROCKET_LAUNCHER")) tag = WP_ROCKET_LAUNCHER; - else if (!Q_stricmp(tokenStr,"WP_CONCUSSION")) + else if (!Q_stricmp(tokenStr,"WP_CONCUSSION")) tag = WP_CONCUSSION; - else if (!Q_stricmp(tokenStr,"WP_THERMAL")) + else if (!Q_stricmp(tokenStr,"WP_THERMAL")) tag = WP_THERMAL; - else if (!Q_stricmp(tokenStr,"WP_TRIP_MINE")) + else if (!Q_stricmp(tokenStr,"WP_TRIP_MINE")) tag = WP_TRIP_MINE; - else if (!Q_stricmp(tokenStr,"WP_DET_PACK")) + else if (!Q_stricmp(tokenStr,"WP_DET_PACK")) tag = WP_DET_PACK; -// else if (!Q_stricmp(tokenStr,"WP_TRICORDER")) +// else if (!Q_stricmp(tokenStr,"WP_TRICORDER")) // tag = WP_TRICORDER; - else if (!Q_stricmp(tokenStr,"WP_BOT_LASER")) + else if (!Q_stricmp(tokenStr,"WP_BOT_LASER")) tag = WP_BOT_LASER; - else if (!Q_stricmp(tokenStr,"WP_EMPLACED_GUN")) + else if (!Q_stricmp(tokenStr,"WP_EMPLACED_GUN")) tag = WP_EMPLACED_GUN; - else if (!Q_stricmp(tokenStr,"WP_MELEE")) + else if (!Q_stricmp(tokenStr,"WP_MELEE")) tag = WP_MELEE; else if (!Q_stricmp(tokenStr,"WP_TURRET")) tag = WP_TURRET; @@ -372,101 +376,101 @@ static void IT_Tag(const char **holdBuf) tag = WP_SCEPTER; else if (!Q_stricmp(tokenStr,"WP_NOGHRI_STICK")) tag = WP_NOGHRI_STICK; - else if (!Q_stricmp(tokenStr,"AMMO_FORCE")) + else if (!Q_stricmp(tokenStr,"AMMO_FORCE")) tag = AMMO_FORCE; - else if (!Q_stricmp(tokenStr,"AMMO_BLASTER")) + else if (!Q_stricmp(tokenStr,"AMMO_BLASTER")) tag = AMMO_BLASTER; - else if (!Q_stricmp(tokenStr,"AMMO_POWERCELL")) + else if (!Q_stricmp(tokenStr,"AMMO_POWERCELL")) tag = AMMO_POWERCELL; - else if (!Q_stricmp(tokenStr,"AMMO_METAL_BOLTS")) + else if (!Q_stricmp(tokenStr,"AMMO_METAL_BOLTS")) tag = AMMO_METAL_BOLTS; - else if (!Q_stricmp(tokenStr,"AMMO_ROCKETS")) + else if (!Q_stricmp(tokenStr,"AMMO_ROCKETS")) tag = AMMO_ROCKETS; - else if (!Q_stricmp(tokenStr,"AMMO_EMPLACED")) + else if (!Q_stricmp(tokenStr,"AMMO_EMPLACED")) tag = AMMO_EMPLACED; - else if (!Q_stricmp(tokenStr,"AMMO_THERMAL")) + else if (!Q_stricmp(tokenStr,"AMMO_THERMAL")) tag = AMMO_THERMAL; - else if (!Q_stricmp(tokenStr,"AMMO_TRIPMINE")) + else if (!Q_stricmp(tokenStr,"AMMO_TRIPMINE")) tag = AMMO_TRIPMINE; - else if (!Q_stricmp(tokenStr,"AMMO_DETPACK")) + else if (!Q_stricmp(tokenStr,"AMMO_DETPACK")) tag = AMMO_DETPACK; - else if (!Q_stricmp(tokenStr,"FP_HEAL")) + else if (!Q_stricmp(tokenStr,"FP_HEAL")) { tag = FP_HEAL; } - else if (!Q_stricmp(tokenStr,"FP_LEVITATION")) + else if (!Q_stricmp(tokenStr,"FP_LEVITATION")) { tag = FP_LEVITATION; } - else if (!Q_stricmp(tokenStr,"FP_SPEED")) + else if (!Q_stricmp(tokenStr,"FP_SPEED")) { tag = FP_SPEED; } - else if (!Q_stricmp(tokenStr,"FP_PUSH")) + else if (!Q_stricmp(tokenStr,"FP_PUSH")) { tag = FP_PUSH; } - else if (!Q_stricmp(tokenStr,"FP_PULL")) + else if (!Q_stricmp(tokenStr,"FP_PULL")) { tag = FP_PULL; } - else if (!Q_stricmp(tokenStr,"FP_TELEPATHY")) + else if (!Q_stricmp(tokenStr,"FP_TELEPATHY")) { tag = FP_TELEPATHY; } - else if (!Q_stricmp(tokenStr,"FP_GRIP")) + else if (!Q_stricmp(tokenStr,"FP_GRIP")) { tag = FP_GRIP; } - else if (!Q_stricmp(tokenStr,"FP_LIGHTNING")) + else if (!Q_stricmp(tokenStr,"FP_LIGHTNING")) { tag = FP_LIGHTNING; } - else if (!Q_stricmp(tokenStr,"FP_SABERTHROW")) + else if (!Q_stricmp(tokenStr,"FP_SABERTHROW")) { tag = FP_SABERTHROW; } - else if (!Q_stricmp(tokenStr,"ITM_BATTERY_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_BATTERY_PICKUP")) { tag = ITM_BATTERY_PICKUP; } - else if (!Q_stricmp(tokenStr,"INV_SEEKER")) + else if (!Q_stricmp(tokenStr,"INV_SEEKER")) { tag = INV_SEEKER; } - else if (!Q_stricmp(tokenStr,"ITM_SHIELD_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_SHIELD_PICKUP")) { tag = ITM_SHIELD_PICKUP; } - else if (!Q_stricmp(tokenStr,"INV_BACTA_CANISTER")) + else if (!Q_stricmp(tokenStr,"INV_BACTA_CANISTER")) { tag = INV_BACTA_CANISTER; } - else if (!Q_stricmp(tokenStr,"ITM_DATAPAD_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_DATAPAD_PICKUP")) { tag = ITM_DATAPAD_PICKUP; } - else if (!Q_stricmp(tokenStr,"INV_ELECTROBINOCULARS")) + else if (!Q_stricmp(tokenStr,"INV_ELECTROBINOCULARS")) { tag = INV_ELECTROBINOCULARS; } - else if (!Q_stricmp(tokenStr,"INV_SENTRY")) + else if (!Q_stricmp(tokenStr,"INV_SENTRY")) { tag = INV_SENTRY; } - else if (!Q_stricmp(tokenStr,"INV_LIGHTAMP_GOGGLES")) + else if (!Q_stricmp(tokenStr,"INV_LIGHTAMP_GOGGLES")) { tag = INV_LIGHTAMP_GOGGLES; } - else if (!Q_stricmp(tokenStr,"INV_GOODIE_KEY")) + else if (!Q_stricmp(tokenStr,"INV_GOODIE_KEY")) { tag = INV_GOODIE_KEY; } - else if (!Q_stricmp(tokenStr,"INV_SECURITY_KEY")) + else if (!Q_stricmp(tokenStr,"INV_SECURITY_KEY")) { tag = INV_SECURITY_KEY; } - else if (!Q_stricmp(tokenStr,"ITM_MEDPAK_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_MEDPAK_PICKUP")) { tag = ITM_MEDPAK_PICKUP; } @@ -474,7 +478,7 @@ static void IT_Tag(const char **holdBuf) { tag = ITM_SHIELD_SM_PICKUP; } - else if (!Q_stricmp(tokenStr,"ITM_SHIELD_LRG_PICKUP")) + else if (!Q_stricmp(tokenStr,"ITM_SHIELD_LRG_PICKUP")) { tag = ITM_SHIELD_LRG_PICKUP; } @@ -498,26 +502,26 @@ static void IT_Type(const char **holdBuf) int type; const char *tokenStr; - if (COM_ParseString(holdBuf,&tokenStr)) + if (COM_ParseString(holdBuf,&tokenStr)) { return; } - if (!Q_stricmp(tokenStr,"IT_BAD")) + if (!Q_stricmp(tokenStr,"IT_BAD")) type = IT_BAD; - else if (!Q_stricmp(tokenStr,"IT_WEAPON")) + else if (!Q_stricmp(tokenStr,"IT_WEAPON")) type = IT_WEAPON; - else if (!Q_stricmp(tokenStr,"IT_AMMO")) + else if (!Q_stricmp(tokenStr,"IT_AMMO")) type = IT_AMMO; else if (!Q_stricmp(tokenStr,"IT_ARMOR")) type = IT_ARMOR; else if (!Q_stricmp(tokenStr,"IT_HEALTH")) type = IT_HEALTH; - else if (!Q_stricmp(tokenStr,"IT_HOLDABLE")) + else if (!Q_stricmp(tokenStr,"IT_HOLDABLE")) type = IT_HOLDABLE; - else if (!Q_stricmp(tokenStr,"IT_BATTERY")) + else if (!Q_stricmp(tokenStr,"IT_BATTERY")) type = IT_BATTERY; - else if (!Q_stricmp(tokenStr,"IT_HOLOCRON")) + else if (!Q_stricmp(tokenStr,"IT_HOLOCRON")) type = IT_HOLOCRON; else { @@ -534,7 +538,7 @@ static void IT_Icon(const char **holdBuf) int len; const char *tokenStr; - if (COM_ParseString(holdBuf,&tokenStr)) + if (COM_ParseString(holdBuf,&tokenStr)) { return; } @@ -554,7 +558,7 @@ static void IT_Count(const char **holdBuf) { int tokenInt; - if ( COM_ParseInt(holdBuf,&tokenInt)) + if ( COM_ParseInt(holdBuf,&tokenInt)) { SkipRestOfLine(holdBuf); return; @@ -577,7 +581,7 @@ static void IT_Min(const char **holdBuf) for (i=0;i<3;++i) { - if ( COM_ParseInt(holdBuf,&tokenInt)) + if ( COM_ParseInt(holdBuf,&tokenInt)) { SkipRestOfLine(holdBuf); return; @@ -595,7 +599,7 @@ static void IT_Max(const char **holdBuf) for (i=0;i<3;++i) { - if ( COM_ParseInt(holdBuf,&tokenInt)) + if ( COM_ParseInt(holdBuf,&tokenInt)) { SkipRestOfLine(holdBuf); return; @@ -611,7 +615,7 @@ static void IT_PickupSound(const char **holdBuf) int len; const char *tokenStr; - if (COM_ParseString(holdBuf,&tokenStr)) + if (COM_ParseString(holdBuf,&tokenStr)) { return; } @@ -643,7 +647,7 @@ static void IT_ParseWeaponParms(const char **holdBuf) // Loop through possible parameters for (i=0;i. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + #include "g_local.h" #include "g_functions.h" #include "g_items.h" diff --git a/code/game/g_items.h b/code/game/g_items.h index 044f7c0b29..a5070f900b 100644 --- a/code/game/g_items.h +++ b/code/game/g_items.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //g_items.h diff --git a/code/game/g_local.h b/code/game/g_local.h index d6af0b0ef6..0b6ea6e3f8 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __G_LOCAL_H__ #define __G_LOCAL_H__ @@ -453,7 +458,7 @@ void G_SayTo( gentity_t *ent, gentity_t *other, int mode, int color, const char // g_main.c // void G_RunThink (gentity_t *ent); -void QDECL G_Error( const char *fmt, ... ); +void NORETURN QDECL G_Error( const char *fmt, ... ); void SetInUse(gentity_t *ent); void ClearInUse(gentity_t *ent); qboolean PInUse(unsigned int entNum); diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index a00e98a954..c1eedda887 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "g_local.h" #include "g_functions.h" @@ -252,8 +257,8 @@ static void G_DynamicMusicUpdate( void ) int danger = 0; int battle = 0; int entTeam; - qboolean dangerNear = qfalse; - qboolean suspicious = qfalse; + //qboolean dangerNear = qfalse; + //qboolean suspicious = qfalse; qboolean LOScalced = qfalse, clearLOS = qfalse; //FIXME: intro and/or other cues? (one-shot music sounds) @@ -312,14 +317,14 @@ static void G_DynamicMusicUpdate( void ) //enemy-based VectorCopy( player->currentOrigin, center ); - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { mins[i] = center[i] - radius; maxs[i] = center[i] + radius; } - + numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); - for ( e = 0 ; e < numListedEntities ; e++ ) + for ( e = 0 ; e < numListedEntities ; e++ ) { ent = entityList[ e ]; if ( !ent || !ent->inuse ) @@ -416,7 +421,7 @@ static void G_DynamicMusicUpdate( void ) { clearLOS = G_ClearLOS( player, player->client->renderInfo.eyePoint, ent ); } - if ( !clearLOS ) + if ( !clearLOS ) {//can't see them directly continue; } @@ -449,10 +454,10 @@ static void G_DynamicMusicUpdate( void ) switch ( level.alertEvents[alert].level ) { case AEL_DISCOVERED: - dangerNear = qtrue; + //dangerNear = qtrue; break; case AEL_SUSPICIOUS: - suspicious = qtrue; + //suspicious = qtrue; break; case AEL_MINOR: //distraction = qtrue; @@ -481,7 +486,7 @@ static void G_DynamicMusicUpdate( void ) //level.dmDebounceTime = level.time + 3000 + 1000*battle; } } - else + else { if ( level.dmDebounceTime > level.time ) {//not ready to switch yet @@ -550,7 +555,7 @@ void G_FindTeams( void ) { c = 0; c2 = 0; // for ( i=1, e=g_entities,i ; i < globals.num_entities ; i++,e++ ) - for ( i=1 ; i < globals.num_entities ; i++ ) + for ( i=MAX_CLIENTS ; i < globals.num_entities ; i++ ) { // if (!e->inuse) // continue; @@ -572,7 +577,7 @@ void G_FindTeams( void ) { // continue; if(!PInUse(j)) continue; - + e2=&g_entities[j]; if (!e2->team) continue; @@ -669,24 +674,24 @@ void G_InitCvars( void ) { g_saberPickuppableDroppedSabers = gi.cvar( "g_saberPickuppableDroppedSabers", "0", CVAR_CHEAT );//lets you pick up sabers that are dropped g_AIsurrender = gi.cvar( "g_AIsurrender", "0", CVAR_CHEAT ); g_numEntities = gi.cvar( "g_numEntities", "0", 0 ); - + gi.cvar( "newTotalSecrets", "0", CVAR_ROM ); gi.cvar_set("newTotalSecrets", "0");//used to carry over the count from SP_target_secret to ClientBegin //g_iscensored = gi.cvar( "ui_iscensored", "0", CVAR_ARCHIVE|CVAR_ROM|CVAR_INIT|CVAR_CHEAT|CVAR_NORESTART ); g_speederControlScheme = gi.cvar( "g_speederControlScheme", "2", CVAR_ARCHIVE );//2 is default, 1 is alternate - g_char_model = gi.cvar( "g_char_model", "jedi_tf", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); - g_char_skin_head = gi.cvar( "g_char_skin_head", "head_a1", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); - g_char_skin_torso = gi.cvar( "g_char_skin_torso", "torso_a1", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); - g_char_skin_legs = gi.cvar( "g_char_skin_legs", "lower_a1", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); - g_char_color_red = gi.cvar( "g_char_color_red", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); - g_char_color_green = gi.cvar( "g_char_color_green", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); - g_char_color_blue = gi.cvar( "g_char_color_blue", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); - g_saber = gi.cvar( "g_saber", "single_1", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); - g_saber2 = gi.cvar( "g_saber2", "", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); - g_saber_color = gi.cvar( "g_saber_color", "yellow", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); - g_saber2_color = gi.cvar( "g_saber2_color", "yellow", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_char_model = gi.cvar( "g_char_model", "jedi_tf", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_char_skin_head = gi.cvar( "g_char_skin_head", "head_a1", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_char_skin_torso = gi.cvar( "g_char_skin_torso", "torso_a1", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_char_skin_legs = gi.cvar( "g_char_skin_legs", "lower_a1", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_char_color_red = gi.cvar( "g_char_color_red", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_char_color_green = gi.cvar( "g_char_color_green", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_char_color_blue = gi.cvar( "g_char_color_blue", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_saber = gi.cvar( "g_saber", "single_1", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_saber2 = gi.cvar( "g_saber2", "", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_saber_color = gi.cvar( "g_saber_color", "yellow", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_saber2_color = gi.cvar( "g_saber2_color", "yellow", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); g_saberDarkSideSaberColor = gi.cvar( "g_saberDarkSideSaberColor", "0", CVAR_ARCHIVE ); //when you turn evil, it turns your saber red! g_broadsword = gi.cvar( "broadsword", "1", 0); @@ -716,7 +721,7 @@ InitGame // I'm just declaring a global here which I need to get at in NAV_GenerateSquadPaths for deciding if pre-calc'd // data is valid, and this saves changing the proto of G_SpawnEntitiesFromString() to include a checksum param which // may get changed anyway if a new nav system is ever used. This way saves messing with g_local.h each time -slc -int giMapChecksum; +int giMapChecksum; SavedGameJustLoaded_e g_eSavedGameJustLoaded; qboolean g_qbLoadTransition = qfalse; void InitGame( const char *mapname, const char *spawntarget, int checkSum, const char *entities, int levelTime, int randomSeed, int globalTime, SavedGameJustLoaded_e eSavedGameJustLoaded, qboolean qbLoadTransition ) @@ -778,7 +783,7 @@ void InitGame( const char *mapname, const char *spawntarget, int checkSum, cons WP_SaberLoadParms(); //Set up NPC init data NPC_InitGame(); - + TIMER_Clear(); Rail_Reset(); Troop_Reset(); @@ -824,7 +829,7 @@ ShutdownGame void ShutdownGame( void ) { // write all the client session data so we can get it back - G_WriteSessionData(); + G_WriteSessionData(); // Destroy the Game Interface. IGameInterface::Destroy(); @@ -985,7 +990,7 @@ FUNCTIONS CALLED EVERY FRAME ======================================================================== */ -static void G_CheckTasksCompleted (gentity_t *ent) +static void G_CheckTasksCompleted (gentity_t *ent) { if ( Q3_TaskIDPending( ent, TID_CHAN_VOICE ) ) { @@ -1056,13 +1061,13 @@ G_RunThink Runs thinking code for this frame if necessary ============= */ -void G_RunThink (gentity_t *ent) +void G_RunThink (gentity_t *ent) { - if ( (ent->nextthink <= 0) || (ent->nextthink > level.time) ) + if ( (ent->nextthink <= 0) || (ent->nextthink > level.time) ) { goto runicarus; } - + ent->nextthink = 0; if ( ent->e_ThinkFunc == thinkF_NULL ) // actually you don't need this since I check for it in the next function -slc { @@ -1107,7 +1112,7 @@ static void G_Animate ( gentity_t *self ) int junk; // I guess query ghoul2 to find out what the current frame is and see if we are done. - gi.G2API_GetBoneAnimIndex( &self->ghoul2[self->playerModel], self->rootBone, + gi.G2API_GetBoneAnimIndex( &self->ghoul2[self->playerModel], self->rootBone, (cg.time?cg.time:level.time), &frame, &junk, &junk, &junk, &junk2, NULL ); // It NEVER seems to get to what you'd think the last frame would be, so I'm doing this to try and catch when the animation has stopped @@ -1141,8 +1146,8 @@ static void G_Animate ( gentity_t *self ) if ( self->ghoul2.size()) { self->s.frame = self->endFrame; - - gi.G2API_SetBoneAnimIndex( &self->ghoul2[self->playerModel], self->rootBone, + + gi.G2API_SetBoneAnimIndex( &self->ghoul2[self->playerModel], self->rootBone, self->startFrame, self->endFrame, BONE_ANIM_OVERRIDE_FREEZE, 1.0f, cg.time, -1, -1 ); return; } @@ -1297,7 +1302,7 @@ static void G_CheckEndLevelTimers( gentity_t *ent ) //rww - RAGDOLL_BEGIN class CGameRagDollUpdateParams : public CRagDollUpdateParams { - void EffectorCollision(const SRagDollEffectorCollision &data) + void EffectorCollision(const SRagDollEffectorCollision &data) { //Com_Printf("Effector Collision at (%f %f %f)\n",data.effectorPosition[0],data.effectorPosition[1],data.effectorPosition[2]); vec3_t effectorPosDif; @@ -1326,11 +1331,11 @@ class CGameRagDollUpdateParams : public CRagDollUpdateParams hasEffectorData = qtrue; return; } - void RagDollBegin() + void RagDollBegin() { return; } - virtual void RagDollSettled() + virtual void RagDollSettled() { return; } @@ -1338,9 +1343,9 @@ class CGameRagDollUpdateParams : public CRagDollUpdateParams { return; } - + #ifdef _DEBUG - void DebugLine(vec3_t p1,vec3_t p2,int color,bool bbox) + void DebugLine(vec3_t p1,vec3_t p2,int color,bool bbox) { if (!bbox) { @@ -1533,7 +1538,7 @@ qboolean G_RagDoll(gentity_t *ent, vec3_t forcedAngles) vec3_t boltPoints[5]; vec3_t trStart, trEnd; vec3_t tAng; - qboolean deathDone = qfalse; + //qboolean deathDone = qfalse; trace_t tr; mdxaBone_t boltMatrix; @@ -1541,7 +1546,7 @@ qboolean G_RagDoll(gentity_t *ent, vec3_t forcedAngles) if (ent->client->ps.legsAnimTimer <= 0) { //Looks like the death anim is done playing - deathDone = qtrue; + //deathDone = qtrue; } //if (deathDone) @@ -1628,7 +1633,7 @@ qboolean G_RagDoll(gentity_t *ent, vec3_t forcedAngles) { //We're in a ragdoll state, so make the call to keep our positions updated and whatnot. CRagDollParams tParms; CGameRagDollUpdateParams tuParms; - + ragAnim = G_RagAnimForPositioning(ent); /* @@ -1660,10 +1665,10 @@ qboolean G_RagDoll(gentity_t *ent, vec3_t forcedAngles) } #endif - gi.G2API_SetBoneAngles( &ent->ghoul2[ent->playerModel], "upper_lumbar", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 100, (cg.time?cg.time:level.time) ); - gi.G2API_SetBoneAngles( &ent->ghoul2[ent->playerModel], "lower_lumbar", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 100, (cg.time?cg.time:level.time) ); - gi.G2API_SetBoneAngles( &ent->ghoul2[ent->playerModel], "thoracic", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 100, (cg.time?cg.time:level.time) ); - gi.G2API_SetBoneAngles( &ent->ghoul2[ent->playerModel], "cervical", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 100, (cg.time?cg.time:level.time) ); + gi.G2API_SetBoneAngles( &ent->ghoul2[ent->playerModel], "upper_lumbar", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 100, (cg.time?cg.time:level.time) ); + gi.G2API_SetBoneAngles( &ent->ghoul2[ent->playerModel], "lower_lumbar", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 100, (cg.time?cg.time:level.time) ); + gi.G2API_SetBoneAngles( &ent->ghoul2[ent->playerModel], "thoracic", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 100, (cg.time?cg.time:level.time) ); + gi.G2API_SetBoneAngles( &ent->ghoul2[ent->playerModel], "cervical", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 100, (cg.time?cg.time:level.time) ); VectorCopy(G2Angles, tParms.angles); VectorCopy(usedOrg, tParms.position); @@ -1897,31 +1902,29 @@ int navTime = 0; void G_RunFrame( int levelTime ) { int i; gentity_t *ent; - int msec; int ents_inuse=0; // someone's gonna be pissed I put this here... #if AI_TIMERS AITime = 0; navTime = 0; #endif// AI_TIMERS - + level.framenum++; level.previousTime = level.time; level.time = levelTime; - msec = level.time - level.previousTime; - + //ResetTeamCounters(); NAV::DecayDangerSenses(); Rail_Update(); Troop_Update(); Pilot_Update(); - + if (player && gi.WE_IsShaking(player->currentOrigin)) { CGCam_Shake(0.45f, 100); } - + AI_UpdateGroups(); @@ -1932,7 +1935,7 @@ void G_RunFrame( int levelTime ) { //Run the frame for all entities // for ( i = 0, ent = &g_entities[0]; i < globals.num_entities ; i++, ent++) - for ( i = 0; i < globals.num_entities ; i++) + for ( i = 0; i < globals.num_entities ; i++) { // if ( !ent->inuse ) // continue; @@ -1989,19 +1992,19 @@ void G_RunFrame( int levelTime ) { } G_CheckSpecialPersistentEvents( ent ); - if ( ent->s.eType == ET_MISSILE ) + if ( ent->s.eType == ET_MISSILE ) { G_RunMissile( ent ); continue; } - if ( ent->s.eType == ET_ITEM ) + if ( ent->s.eType == ET_ITEM ) { G_RunItem( ent ); continue; } - if ( ent->s.eType == ET_MOVER ) + if ( ent->s.eType == ET_MOVER ) { // FIXME string comparison in per-frame thinks wut??? if ( ent->model && Q_stricmp( "models/test/mikeg/tie_fighter.md3", ent->model ) == 0 ) @@ -2013,7 +2016,7 @@ void G_RunFrame( int levelTime ) { } //The player - if ( i == 0 ) + if ( i == 0 ) { // decay batteries if the goggles are active if ( cg.zoomMode == 1 && ent->client->ps.batteryCharge > 0 ) @@ -2058,7 +2061,7 @@ void G_RunFrame( int levelTime ) { // perform final fixups on the player ent = &g_entities[0]; - if ( ent->inuse ) + if ( ent->inuse ) { ClientEndFrame( ent ); } @@ -2120,7 +2123,7 @@ extern int delayedShutDown; extern qboolean player_locked; void G_LoadSave_WriteMiscData(void) -{ +{ gi.AppendToSaveGame(INT_ID('L','C','K','D'), &player_locked, sizeof(player_locked)); } diff --git a/code/game/g_mem.cpp b/code/game/g_mem.cpp index b7ddd92f5d..c96f839871 100644 --- a/code/game/g_mem.cpp +++ b/code/game/g_mem.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // // g_mem.c diff --git a/code/game/g_misc.cpp b/code/game/g_misc.cpp index 6dc5f161f2..4dfd3a3473 100644 --- a/code/game/g_misc.cpp +++ b/code/game/g_misc.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // g_misc.c diff --git a/code/game/g_misc_model.cpp b/code/game/g_misc_model.cpp index 96a9614b32..ca4de94e8a 100644 --- a/code/game/g_misc_model.cpp +++ b/code/game/g_misc_model.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "g_local.h" #include "g_functions.h" diff --git a/code/game/g_missile.cpp b/code/game/g_missile.cpp index f1f8e7468a..0a17727a77 100644 --- a/code/game/g_missile.cpp +++ b/code/game/g_missile.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "g_local.h" #include "g_functions.h" diff --git a/code/game/g_mover.cpp b/code/game/g_mover.cpp index c07f447b41..dd42060819 100644 --- a/code/game/g_mover.cpp +++ b/code/game/g_mover.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "bg_public.h" #include "../cgame/cg_local.h" diff --git a/code/game/g_nav.cpp b/code/game/g_nav.cpp index 8f64f109bf..fc098c71d3 100644 --- a/code/game/g_nav.cpp +++ b/code/game/g_nav.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "b_local.h" #include "g_nav.h" diff --git a/code/game/g_nav.h b/code/game/g_nav.h index fc53bd6e86..2cfcdc4b6d 100644 --- a/code/game/g_nav.h +++ b/code/game/g_nav.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __G_NAV_H__ #define __G_NAV_H__ diff --git a/code/game/g_navigator.cpp b/code/game/g_navigator.cpp index f804cd85ac..6da921793e 100644 --- a/code/game/g_navigator.cpp +++ b/code/game/g_navigator.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //////////////////////////////////////////////////////////////////////////////////////// // RAVEN SOFTWARE - STAR WARS: JK II @@ -83,7 +87,7 @@ extern vec3_t playerMaxs; //////////////////////////////////////////////////////////////////////////////////////// -// Defines +// Defines //////////////////////////////////////////////////////////////////////////////////////// #define NAV_VERSION 1.3f #define NEIGHBORING_DIST 200.0f @@ -133,7 +137,7 @@ namespace NAV MAX_NONWP_NEIGHBORS = 1, - // Human Sized + // Human Sized //------------- SC_MEDIUM_RADIUS = 20, SC_MEDIUM_HEIGHT = 60, @@ -553,7 +557,7 @@ class CGraphUser : public TGraph::user { return false; } - + // If The Actor Is Too Big, This Is Not A Valid Edge For Him //----------------------------------------------------------- @@ -571,10 +575,10 @@ class CGraphUser : public TGraph::user { // Can The Actor Navigate Through The Breakable Entity? //------------------------------------------------------ - if ((mActor) && - (mActor->NPC) && + if ((mActor) && + (mActor->NPC) && (mActor->NPC->aiFlags&NPCAI_NAV_THROUGH_BREAKABLES) && - (Edge.BlockingBreakable()) && + (Edge.BlockingBreakable()) && (G_EntIsBreakable(Edge.mEntityNum, mActor)) ) { @@ -641,7 +645,7 @@ class CGraphUser : public TGraph::user {//clear it Edge.mFlags.clear_bit(CWayEdge::WE_BLOCKING_BREAK); } - //NOTE: if this fails with the SC_LARGE size + //NOTE: if this fails with the SC_LARGE size } return (Edge.mFlags.get_bit(CWayEdge::WE_VALID)); @@ -773,7 +777,7 @@ char mLocStringB[256] = {0}; //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// TAlertList& GetAlerts(gentity_t* actor) { @@ -854,10 +858,10 @@ bool ViewNavTrace(const CVec3& a, const CVec3& b) //////////////////////////////////////////////////////////////////////////////////////// // Helper Function : Move Trace //////////////////////////////////////////////////////////////////////////////////////// -bool MoveTrace(const CVec3& Start, const CVec3& Stop, const CVec3& Mins, const CVec3& Maxs, - int IgnoreEnt=0, - bool CheckForDoNotEnter=false, - bool RetryIfStartInDoNotEnter=true, +bool MoveTrace(const CVec3& Start, const CVec3& Stop, const CVec3& Mins, const CVec3& Maxs, + int IgnoreEnt=0, + bool CheckForDoNotEnter=false, + bool RetryIfStartInDoNotEnter=true, bool IgnoreAllEnts=false, int OverrideContents=0) { @@ -983,7 +987,7 @@ bool NAV::GoTo(gentity_t* actor, TNodeHandle target, float MaxDangerLevel) } //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// bool NAV::GoTo(gentity_t* actor, gentity_t* target, float MaxDangerLevel) { @@ -1058,7 +1062,7 @@ bool NAV::GoTo(gentity_t* actor, gentity_t* target, float MaxDangerLevel) } } - // No Waypoint Near + // No Waypoint Near //------------------ else { @@ -1069,7 +1073,7 @@ bool NAV::GoTo(gentity_t* actor, gentity_t* target, float MaxDangerLevel) } //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// bool NAV::GoTo(gentity_t* actor, const vec3_t& position, float MaxDangerLevel) { @@ -1134,7 +1138,7 @@ bool NAV::GoTo(gentity_t* actor, const vec3_t& position, float MaxDangerLevel) } } - // No Waypoint Near + // No Waypoint Near //------------------ else { @@ -1154,7 +1158,7 @@ void stupid_print(const char* data) } //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// bool NAV::LoadFromFile(const char *filename, int checksum) { @@ -1202,7 +1206,7 @@ bool NAV::LoadFromFile(const char *filename, int checksum) } //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// bool NAV::TestEdge( TNodeHandle NodeA, TNodeHandle NodeB, qboolean IsDebugEdge ) { @@ -1264,10 +1268,10 @@ bool NAV::TestEdge( TNodeHandle NodeA, TNodeHandle NodeB, qboolean IsDebugEdge // Well, It' Can't Go, But Possibly If We Hit An Entity And Remove That Entity, We Can Go? //----------------------------------------------------------------------------------------- - if (!CanGo && - !mMoveTrace.startsolid && - EntHit!=ENTITYNUM_WORLD && - EntHit!=ENTITYNUM_NONE && + if (!CanGo && + !mMoveTrace.startsolid && + EntHit!=ENTITYNUM_WORLD && + EntHit!=ENTITYNUM_NONE && (&g_entities[EntHit])!=0) { gentity_t* ent = &g_entities[EntHit]; @@ -1292,7 +1296,7 @@ bool NAV::TestEdge( TNodeHandle NodeA, TNodeHandle NodeB, qboolean IsDebugEdge at.mFlags.set_bit(CWayEdge::WE_BLOCKING_WALL); } else if ( - !Q_stricmp("func_glass", ent->classname) || + !Q_stricmp("func_glass", ent->classname) || !Q_stricmp("func_breakable", ent->classname) || !Q_stricmp("misc_model_breakable", ent->classname)) { @@ -1409,7 +1413,7 @@ bool NAV::TestEdge( TNodeHandle NodeA, TNodeHandle NodeB, qboolean IsDebugEdge eemiter->push_back(atHandle); } else - { + { #ifndef FINAL_BUILD assert("Max Edges Perh Handle Reached, Unable To Add To Edge Map!"==0); gi.Printf("WARNING: Too many nav edges pass through entity %d (%s)\n", EntHit, g_entities[EntHit].targetname); @@ -1436,7 +1440,7 @@ bool NAV::TestEdge( TNodeHandle NodeA, TNodeHandle NodeB, qboolean IsDebugEdge // Try Target //------------ owner = G_Find(owner, FOFS(target), ent->targetname); - if (owner && + if (owner && (!Q_stricmp("trigger_multiple", owner->classname) || !Q_stricmp("trigger_once", owner->classname))) { at.mOwnerNum = owner->s.number; @@ -1446,7 +1450,7 @@ bool NAV::TestEdge( TNodeHandle NodeA, TNodeHandle NodeB, qboolean IsDebugEdge // Try Target2 //------------- owner = G_Find(owner, FOFS(target2), ent->targetname); - if (owner && + if (owner && (!Q_stricmp("trigger_multiple", owner->classname) || !Q_stricmp("trigger_once", owner->classname))) { at.mOwnerNum = owner->s.number; @@ -1503,7 +1507,7 @@ bool NAV::TestEdge( TNodeHandle NodeA, TNodeHandle NodeB, qboolean IsDebugEdge return CanGo; } //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// bool NAV::LoadFromEntitiesAndSaveToFile(const char *filename, int checksum) { @@ -1540,11 +1544,11 @@ bool NAV::LoadFromEntitiesAndSaveToFile(const char *filename, int checksum) { NPCs.set_bit(curEnt); ent->lastMoveTime = ent->contents; - ent->contents = 0; + ent->contents = 0; gi.linkentity(ent); } - + // Is This Ent "Start Off" or "Start Open"? //------------------------------------------ @@ -1568,7 +1572,7 @@ bool NAV::LoadFromEntitiesAndSaveToFile(const char *filename, int checksum) else if (!Q_stricmp("func_wall", ent->classname) || !Q_stricmp("func_usable", ent->classname)) { Walls.set_bit(curEnt); - ent->contents = ent->spawnContents; + ent->contents = ent->spawnContents; gi.linkentity(ent); } } @@ -1586,7 +1590,7 @@ bool NAV::LoadFromEntitiesAndSaveToFile(const char *filename, int checksum) Triang->finish(mUser); delete Triang; */ - mCells.fill_cells_nodes(NAV::CELL_RANGE); + mCells.fill_cells_nodes(NAV::CELL_RANGE); @@ -1597,11 +1601,15 @@ bool NAV::LoadFromEntitiesAndSaveToFile(const char *filename, int checksum) //==================================================================================== CWayNode* at; int atHandle; +#ifdef _DEBUG const char* atNameStr; +#endif // _DEBUG int tgtNum; int tgtHandle; hstring tgtName; +#ifdef _DEBUG const char* tgtNameStr; +#endif // _DEBUG CWayEdge atToTgt; CVec3 atFloor; @@ -1646,7 +1654,9 @@ bool NAV::LoadFromEntitiesAndSaveToFile(const char *filename, int checksum) at = &(*nodeIter); atHandle = (nodeIter.index()); +#ifdef _DEBUG atNameStr = (at->mName.empty())?(mLocStringA):(at->mName.c_str()); +#endif // _DEBUG // Connect To Hand Designed Targets //---------------------------------- @@ -1659,7 +1669,9 @@ bool NAV::LoadFromEntitiesAndSaveToFile(const char *filename, int checksum) { continue; } +#ifdef _DEBUG tgtNameStr = tgtName.c_str(); +#endif // _DEBUG // Clear The Name In The Array, So Save Is Not Corrupted //------------------------------------------------------- @@ -1671,9 +1683,10 @@ bool NAV::LoadFromEntitiesAndSaveToFile(const char *filename, int checksum) nameFinder = mNodeNames.find(tgtName); if (nameFinder==mNodeNames.end()) { -#ifndef FINAL_BUILD - gi.Printf(S_COLOR_YELLOW"WARNING: nav unable to locate target (%s) from node (%s)\n", tgtNameStr, atNameStr); -#endif +#ifdef _DEBUG + gi.Printf( S_COLOR_YELLOW "WARNING: nav unable to locate target (%s) from node (%s)\n", tgtNameStr, + atNameStr ); +#endif // _DEBUG continue; } @@ -1704,7 +1717,7 @@ bool NAV::LoadFromEntitiesAndSaveToFile(const char *filename, int checksum) mGraph.get_edge(edge).mFlags.set_bit(CWayEdge::WE_DESIGNERPLACED); continue; } - + // Setup The Edge //---------------- mUser.setup_edge(atToTgt, atHandle, tgtHandle, false, mGraph.get_node(atHandle), mGraph.get_node(tgtHandle), false); @@ -1727,7 +1740,7 @@ bool NAV::LoadFromEntitiesAndSaveToFile(const char *filename, int checksum) // If It Is A Combat Or Goal Nav, Try To "Auto Connect" To A Few Nearby Way Points //--------------------------------------------------------------------------------- - if (!at->mFlags.get_bit(CWayNode::WN_NOAUTOCONNECT) && + if (!at->mFlags.get_bit(CWayNode::WN_NOAUTOCONNECT) && (at->mType==NAV::PT_COMBATNODE || at->mType==NAV::PT_GOALNODE)) { // Get The List Of Nodes For This Cell Of The Map @@ -1874,9 +1887,9 @@ bool NAV::LoadFromEntitiesAndSaveToFile(const char *filename, int checksum) // Cycle through the different sizes, starting with the largest //-------------------------------------------------------------- bool CanGo = false; - bool IsDebugEdge = - (g_nav1->string[0] && g_nav2->string[0] && - (!Q_stricmp(*(a.mName), g_nav1->string) || !Q_stricmp(*(b.mName), g_nav1->string)) && + bool IsDebugEdge = + (g_nav1->string[0] && g_nav2->string[0] && + (!Q_stricmp(*(a.mName), g_nav1->string) || !Q_stricmp(*(b.mName), g_nav1->string)) && (!Q_stricmp(*(a.mName), g_nav2->string) || !Q_stricmp(*(b.mName), g_nav2->string))); // For debugging a connection between two known points: @@ -1975,15 +1988,18 @@ bool NAV::LoadFromEntitiesAndSaveToFile(const char *filename, int checksum) CWayEdge& at = mGraph.get_edge((*ToBeRemoved)[RemIndex]); if (at.mFlags.get_bit(CWayEdge::WE_DESIGNERPLACED)) { +#ifdef _DEBUG hstring aHstr = mGraph.get_node(at.mNodeA).mName; hstring bHstr = mGraph.get_node(at.mNodeB).mName; +#endif // _DEBUG mGraph.get_node(at.mNodeA).mPoint.ToStr(mLocStringA); mGraph.get_node(at.mNodeB).mPoint.ToStr(mLocStringB); -#ifndef FINAL_BUILD - gi.Printf( S_COLOR_RED"ERROR: Nav connect failed: %s@%s <-> %s@%s\n", aHstr.c_str(), mLocStringA, bHstr.c_str(), mLocStringB); -#endif +#ifdef _DEBUG + gi.Printf( S_COLOR_RED "ERROR: Nav connect failed: %s@%s <-> %s@%s\n", aHstr.c_str(), mLocStringA, + bHstr.c_str(), mLocStringB ); +#endif // _DEBUG delayedShutDown = level.time + 100; } mGraph.remove_edge(at.mNodeA, at.mNodeB); @@ -2066,7 +2082,7 @@ bool NAV::LoadFromEntitiesAndSaveToFile(const char *filename, int checksum) // PHASE V: SCAN NODES AND FILL CELLS //=================================== - mCells.fill_cells_edges(NAV::CELL_RANGE); + mCells.fill_cells_edges(NAV::CELL_RANGE); // PHASE VI: SCAN ALL ENTITIES AND RE OPEN / TURN THEM OFF @@ -2104,7 +2120,7 @@ bool NAV::LoadFromEntitiesAndSaveToFile(const char *filename, int checksum) //-------------------------------------- else if (NPCs.get_bit(curEnt)) { - ent->contents = ent->lastMoveTime; + ent->contents = ent->lastMoveTime; ent->lastMoveTime = 0; gi.linkentity(ent); } @@ -2136,7 +2152,7 @@ bool NAV::LoadFromEntitiesAndSaveToFile(const char *filename, int checksum) } //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// void NAV::DecayDangerSenses() { @@ -2163,7 +2179,7 @@ void NAV::DecayDangerSenses() } //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// void NAV::RegisterDangerSense(gentity_t* actor, int alertEventIndex) { @@ -2247,7 +2263,7 @@ void NAV::RegisterDangerSense(gentity_t* actor, int alertEventIndex) } //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// void NAV::WayEdgesNowClear(gentity_t* ent) { @@ -2278,7 +2294,7 @@ void NAV::WayEdgesNowClear(gentity_t* ent) } //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// void NAV::SpawnedPoint(gentity_t* ent, NAV::EPointType type) { @@ -2390,7 +2406,7 @@ void NAV::SpawnedPoint(gentity_t* ent, NAV::EPointType type) } //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// NAV::TNodeHandle NAV::GetNearestNode(gentity_t* ent, bool forceRecalcNow, NAV::TNodeHandle goal) { @@ -2405,12 +2421,12 @@ NAV::TNodeHandle NAV::GetNearestNode(gentity_t* ent, bool forceRecalcNow, NAV:: { ent->lastWaypoint = ent->waypoint; } - ent->waypoint = + ent->waypoint = GetNearestNode( - ent->currentOrigin, - ent->waypoint, - goal, - ent->s.number, + ent->currentOrigin, + ent->waypoint, + goal, + ent->s.number, (ent->client && ent->client->moveType==MT_FLYSWIM)); ent->noWaypointTime = level.time + 1000; // Don't Erase This Result For 5 Seconds } @@ -2419,7 +2435,7 @@ NAV::TNodeHandle NAV::GetNearestNode(gentity_t* ent, bool forceRecalcNow, NAV:: } //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// NAV::TNodeHandle NAV::GetNearestNode(const vec3_t& position, NAV::TNodeHandle previous, NAV::TNodeHandle goal, int ignoreEnt, bool allowZOffset) { @@ -2600,7 +2616,7 @@ NAV::TNodeHandle NAV::GetNearestNode(const vec3_t& position, NAV::TNodeHandle p } //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// NAV::TNodeHandle NAV::ChooseRandomNeighbor(NAV::TNodeHandle NodeHandle) { @@ -2616,7 +2632,7 @@ NAV::TNodeHandle NAV::ChooseRandomNeighbor(NAV::TNodeHandle NodeHandle) } //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// NAV::TNodeHandle NAV::ChooseRandomNeighbor(TNodeHandle NodeHandle, const vec3_t& position, float maxDistance) { @@ -2652,7 +2668,7 @@ NAV::TNodeHandle NAV::ChooseRandomNeighbor(TNodeHandle NodeHandle, const vec3_t } //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// NAV::TNodeHandle NAV::ChooseClosestNeighbor(NAV::TNodeHandle NodeHandle, const vec3_t& position) { @@ -2682,7 +2698,7 @@ NAV::TNodeHandle NAV::ChooseClosestNeighbor(NAV::TNodeHandle NodeHandle, const } //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// NAV::TNodeHandle NAV::ChooseFarthestNeighbor(NAV::TNodeHandle NodeHandle, const vec3_t& position) { @@ -2712,7 +2728,7 @@ NAV::TNodeHandle NAV::ChooseFarthestNeighbor(NAV::TNodeHandle NodeHandle, const } //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// NAV::TNodeHandle NAV::ChooseFarthestNeighbor(gentity_t* actor, const vec3_t& target, float maxSafeDot) { @@ -2780,7 +2796,7 @@ NAV::TNodeHandle NAV::ChooseFarthestNeighbor(gentity_t* actor, const vec3_t& ta //////////////////////////////////////////////////////////////////////////////////////// -// +// //////////////////////////////////////////////////////////////////////////////////////// bool NAV::FindPath(gentity_t* actor, NAV::TNodeHandle target, float MaxDangerLevel) { @@ -2890,10 +2906,10 @@ bool NAV::FindPath(gentity_t* actor, NAV::TNodeHandle target, float MaxDangerLev CVec3 At(actor->currentOrigin); float AtTime = level.time; float AtSpeed = actor->NPC->stats.runSpeed; - if (!(actor->NPC->scriptFlags&SCF_RUNNING) && + if (!(actor->NPC->scriptFlags&SCF_RUNNING) && ((actor->NPC->scriptFlags&SCF_WALKING) || - (actor->NPC->aiFlags&NPCAI_WALKING) || - (ucmd.buttons&BUTTON_WALKING) + (actor->NPC->aiFlags&NPCAI_WALKING) || + (ucmd.buttons&BUTTON_WALKING) )) { AtSpeed = actor->NPC->stats.walkSpeed; @@ -2919,7 +2935,7 @@ bool NAV::FindPath(gentity_t* actor, NAV::TNodeHandle target, float MaxDangerLev // Copy The Search Results Into The Path //--------------------------------------- { - SPathPoint PPoint; + SPathPoint PPoint = {}; puser.mPath.clear(); for (mSearch.path_begin(); !mSearch.path_end() && !puser.mPath.full(); mSearch.path_inc()) { @@ -2960,7 +2976,7 @@ bool NAV::FindPath(gentity_t* actor, NAV::TNodeHandle target, float MaxDangerLev int numEdges = (puser.mPath.size()-1); - // Trim Out Backtracking Edges + // Trim Out Backtracking Edges //----------------------------- for (int edge=0; edgemins, actor->maxs); suser.mMaxForce = 150.0f; //STEER_TODO: Get From actor Somehow suser.mMass = 1.0f; //STEER_TODO: Get From actor Somehow - if (!(actor->NPC->scriptFlags&SCF_RUNNING) && + if (!(actor->NPC->scriptFlags&SCF_RUNNING) && ((actor->NPC->scriptFlags&SCF_WALKING) || - (actor->NPC->aiFlags&NPCAI_WALKING) || - (ucmd.buttons&BUTTON_WALKING) + (actor->NPC->aiFlags&NPCAI_WALKING) || + (ucmd.buttons&BUTTON_WALKING) )) { suser.mMaxSpeed = actor->NPC->stats.walkSpeed; @@ -4135,7 +4151,7 @@ void STEER::Activate(gentity_t* actor) gentity_t* neighbor = 0; int numFound = gi.EntitiesInBox(Mins.v, Maxs.v, EntityList, MAX_GENTITIES); - for (int i=0; iclient->ps.moveDir); + VectorClear(actor->client->ps.moveDir); actor->client->ps.speed = 0; @@ -4255,11 +4271,11 @@ void STEER::DeActivate(gentity_t* actor, usercmd_t* ucmd) //====================================================== actor->NPC->aiFlags |= NPCAI_NO_SLOWDOWN; - VectorCopy(MoveDir.v, + VectorCopy(MoveDir.v, actor->client->ps.moveDir); actor->client->ps.speed = suser.mSpeed; - VectorCopy(Angles.v, + VectorCopy(Angles.v, actor->NPC->lastPathAngles); actor->NPC->desiredPitch = 0.0f; actor->NPC->desiredYaw = AngleNormalize360(Angles[YAW]); @@ -4323,7 +4339,7 @@ void STEER::DeActivate(gentity_t* actor, usercmd_t* ucmd) // PHASE IV - UPDATE BLOCKING INFORMATION //======================================== - if (suser.mBlocked) + if (suser.mBlocked) { // If Not Previously Blocked, Record The Start Time And Any Entites Involved //--------------------------------------------------------------------------- @@ -4342,7 +4358,7 @@ void STEER::DeActivate(gentity_t* actor, usercmd_t* ucmd) } VectorCopy(suser.mBlockedTgtPosition.v, actor->NPC->blockedTargetPosition); } - else + else { // Nothing Blocking, So Turn Off The Blocked Stuff If It Is There //---------------------------------------------------------------- @@ -4376,12 +4392,12 @@ void STEER::DeActivate(gentity_t* actor, usercmd_t* ucmd) { // Ok, Well, How About Jumping To The Last Waypoint We Had That Was Valid //------------------------------------------------------------------------ - if ((STEER::HasBeenBlockedFor(actor, 8000)) && - (!actor->waypoint || Distance(NAV::GetNodePosition(actor->waypoint), actor->currentOrigin)>150.0f) && + if ((STEER::HasBeenBlockedFor(actor, 8000)) && + (!actor->waypoint || Distance(NAV::GetNodePosition(actor->waypoint), actor->currentOrigin)>150.0f) && (actor->lastWaypoint)) { if (player && - (STEER::HasBeenBlockedFor(actor, 15000)) && + (STEER::HasBeenBlockedFor(actor, 15000)) && !gi.inPVS(player->currentOrigin, NAV::GetNodePosition(actor->lastWaypoint)) && !gi.inPVS(player->currentOrigin, actor->currentOrigin) && !G_CheckInSolidTeleport(NAV::GetNodePosition(actor->lastWaypoint), actor) @@ -4459,13 +4475,13 @@ bool STEER::SafeToGoTo(gentity_t* actor, const vec3_t& targetPosition, int tar { // Are Both Actor And Target In Safe Radius? //------------------------------------------- - if (NAV::OnNeighboringPoints(actorNode, targetNode) && - NAV::InSafeRadius(actor->currentOrigin, actorNode, targetNode) && + if (NAV::OnNeighboringPoints(actorNode, targetNode) && + NAV::InSafeRadius(actor->currentOrigin, actorNode, targetNode) && NAV::InSafeRadius(targetPosition, targetNode, actorNode)) { return true; } - + // If Close Enough, We May Be Able To Go Anyway, So Try A Trace //-------------------------------------------------------------- if (actorToTargetDistance<400.0f)//250.0f) @@ -4516,7 +4532,7 @@ bool STEER::GoTo(gentity_t* actor, gentity_t* target, float reachedRadius, bo return true; } - // If Within Reached Radius, Just Stop Right Here + // If Within Reached Radius, Just Stop Right Here //------------------------------------------------ if (STEER::Reached(actor, target->currentOrigin, reachedRadius, (actor->client && actor->client->moveType==MT_FLYSWIM))) { @@ -4546,7 +4562,7 @@ bool STEER::GoTo(gentity_t* actor, gentity_t* target, float reachedRadius, bo STEER::Blocked(actor, target); // Collision Detected } } - + if (NAVDEBUG_showEnemyPath) { CG_DrawEdge(actor->currentOrigin, target->currentOrigin, EDGE_FOLLOWPOS); @@ -4559,7 +4575,7 @@ bool STEER::GoTo(gentity_t* actor, gentity_t* target, float reachedRadius, bo //////////////////////////////////////////////////////////////////////////////////// bool STEER::GoTo(gentity_t* actor, const vec3_t& position, float reachedRadius, bool avoidCollisions) { - // If Within Reached Radius, Just Stop Right Here + // If Within Reached Radius, Just Stop Right Here //------------------------------------------------ if (STEER::Reached(actor, position, reachedRadius, (actor->client && actor->client->moveType==MT_FLYSWIM))) { @@ -4586,7 +4602,7 @@ bool STEER::GoTo(gentity_t* actor, const vec3_t& position, float reachedRadius STEER::Blocked(actor, position); // Collision Detected } } - + if (NAVDEBUG_showEnemyPath) { CVec3 Dumb(position); @@ -4628,7 +4644,7 @@ void STEER::Blocked(gentity_t* actor, const vec3_t& target) bool STEER::HasBeenBlockedFor(gentity_t* actor, int duration) { return ( - (actor->NPC->aiFlags&NPCAI_BLOCKED) && + (actor->NPC->aiFlags&NPCAI_BLOCKED) && (level.time - actor->NPC->blockedDebounceTime)>duration ); } @@ -4739,7 +4755,7 @@ float STEER::Seek(gentity_t* actor, const CVec3& pos, float slowingDistance, f //////////////////////////////////////////////////////////////////////////////////// // Flee // -// Similar to seek, except there is no concept of a slowing distance. Adds the +// Similar to seek, except there is no concept of a slowing distance. Adds the // position vectors instead of subtracting them to obtain a desired velocity away // from the target. // @@ -4945,7 +4961,7 @@ float STEER::Cohesion(gentity_t* actor, float Scale) if (!suser.mNeighbors.empty()) { - CVec3 AvePosition; + CVec3 AvePosition( 0.0f, 0.0f, 0.0f ); for (int i=0; icurrentOrigin); @@ -5107,7 +5123,7 @@ float STEER::FollowLeader(gentity_t* actor, gentity_t* leader, float dist) { FollowPosition = mMoveTrace.endpos; FollowPosition += (LeaderDirection * suser.mRadius); - + VectorCopy(FollowPosition.v, leader->followPos); leader->followPosWaypoint = NAV::GetNearestNode(leader->followPos, leader->waypoint, 0, leader->s.number); } @@ -5119,9 +5135,9 @@ float STEER::FollowLeader(gentity_t* actor, gentity_t* leader, float dist) } float SpeedScale = (1.0f - (LeaderSpeed / MaxSpeed)); - leader->followPosRecalcTime = - (level.time) + - (Q_irand(50, 500)) + + leader->followPosRecalcTime = + (level.time) + + (Q_irand(50, 500)) + (SpeedScale * Q_irand(3000, 8000)) + ((!actor->enemy && !leader->enemy)?(Q_irand(8000, 15000)):(0)); } @@ -5159,7 +5175,7 @@ bool TestCollision(gentity_t* actor, SSteerUser& suser, const CVec3& ProjectVel // Doors Are Always Safe //----------------------- - if (g_entities[mMoveTrace.entityNum].classname && + if (g_entities[mMoveTrace.entityNum].classname && Q_stricmp(g_entities[mMoveTrace.entityNum].classname, "func_door")==0) { Safe = true; @@ -5225,7 +5241,7 @@ bool TestCollision(gentity_t* actor, SSteerUser& suser, const CVec3& ProjectVel } } - // Ok, He's Just Standing There... + // Ok, He's Just Standing There... //--------------------------------- else { @@ -5324,7 +5340,7 @@ bool TestCollision(gentity_t* actor, SSteerUser& suser, const CVec3& ProjectVel if (NAVDEBUG_showCollision) { CVec3 Prj((Side==Side_None)?(suser.mProjectFwd):(suser.mProjectSide)); - + if (Safe) { CG_DrawEdge(suser.mPosition.v, Prj.v, EDGE_IMPACT_SAFE); // WHITE LINE diff --git a/code/game/g_navigator.h b/code/game/g_navigator.h index ddbcec2fc7..af673282b9 100644 --- a/code/game/g_navigator.h +++ b/code/game/g_navigator.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //////////////////////////////////////////////////////////////////////////////////////// // RAVEN SOFTWARE - STAR WARS: JK II diff --git a/code/game/g_navnew.cpp b/code/game/g_navnew.cpp index ab54457bea..0e72075358 100644 --- a/code/game/g_navnew.cpp +++ b/code/game/g_navnew.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "../qcommon/q_shared.h" #include "../cgame/cg_local.h" diff --git a/code/game/g_object.cpp b/code/game/g_object.cpp index b7772f1c97..9100e8b41b 100644 --- a/code/game/g_object.cpp +++ b/code/game/g_object.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + #include "g_local.h" #include "g_functions.h" #include "b_local.h" diff --git a/code/game/g_objectives.cpp b/code/game/g_objectives.cpp index 51065c1eaf..2dd82c7770 100644 --- a/code/game/g_objectives.cpp +++ b/code/game/g_objectives.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + //g_objectives.cpp //reads in ext_data\objectives.dat to objectives[] diff --git a/code/game/g_public.h b/code/game/g_public.h index 113ecbe467..f6d25ae392 100644 --- a/code/game/g_public.h +++ b/code/game/g_public.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __G_PUBLIC_H__ #define __G_PUBLIC_H__ @@ -147,7 +152,9 @@ typedef struct { void (*FlushCamFile)(); // abort the game - void (*Error)( int, const char *fmt, ... ); + // (this is not NORETURN because MSVC's version of NORETURN is not + // supported for function pointers) + __attribute__((noreturn)) void (*Error)( int, const char *fmt, ... ); // get current time for profiling reasons // this should NOT be used for any game related tasks, @@ -168,7 +175,7 @@ typedef struct { int (*FS_Read)( void *buffer, int len, fileHandle_t f ); int (*FS_Write)( const void *buffer, int len, fileHandle_t f ); void (*FS_FCloseFile)( fileHandle_t f ); - int (*FS_ReadFile)( const char *name, void **buf ); + long (*FS_ReadFile)( const char *name, void **buf ); void (*FS_FreeFile)( void *buf ); int (*FS_GetFileList)( const char *path, const char *extension, char *listbuf, int bufsize ); diff --git a/code/game/g_rail.cpp b/code/game/g_rail.cpp index 2637059a62..6d31938a92 100644 --- a/code/game/g_rail.cpp +++ b/code/game/g_rail.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //////////////////////////////////////////////////////////////////////////////////////// // RAVEN SOFTWARE - STAR WARS: JK II diff --git a/code/game/g_ref.cpp b/code/game/g_ref.cpp index ee8385f6dc..25c1b2b55f 100644 --- a/code/game/g_ref.cpp +++ b/code/game/g_ref.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Reference tag utility functions #include "g_local.h" @@ -25,8 +29,8 @@ extern int delayedShutDown; #define TAG_GENERIC_NAME "__WORLD__" //If a designer chooses this name, cut a finger off as an example to the others -typedef vector < reference_tag_t * > refTag_v; -typedef map < string, reference_tag_t * > refTag_m; +typedef std::vector < reference_tag_t * > refTag_v; +typedef std::map < std::string, reference_tag_t * > refTag_m; typedef struct tagOwner_s { @@ -34,7 +38,7 @@ typedef struct tagOwner_s refTag_m tagMap; } tagOwner_t; -typedef map < string, tagOwner_t * > refTagOwner_m; +typedef std::map < std::string, tagOwner_t * > refTagOwner_m; refTagOwner_m refTagOwnerMap; @@ -82,7 +86,7 @@ void TAG_Init( void ) } refTag_v::iterator rti; - + //Delete all tags within the owner's scope for ( rti = ((*rtoi).second)->tags.begin(); rti != ((*rtoi).second)->tags.end(); rti++ ) { @@ -165,7 +169,7 @@ reference_tag_t *TAG_Find( const char *owner, const char *name ) Q_strlwr( (char *) tempName ); //NOTENOTE: For case insensitive searches on a map rti = tagOwner->tagMap.find( tempName ); - + if ( rti == tagOwner->tagMap.end() ) return NULL; } @@ -183,7 +187,7 @@ reference_tag_t *TAG_Add( const char *name, const char *owner, vec3_t origin, ve { reference_tag_t *tag = new reference_tag_t; VALIDATEP( tag ); - + //Copy the information VectorCopy( origin, tag->origin ); VectorCopy( angles, tag->angles ); @@ -195,6 +199,7 @@ reference_tag_t *TAG_Add( const char *name, const char *owner, vec3_t origin, ve //gi.Error("Nameless ref_tag found at (%i %i %i)", (int)origin[0], (int)origin[1], (int)origin[2]); gi.Printf(S_COLOR_RED"ERROR: Nameless ref_tag found at (%i %i %i)\n", (int)origin[0], (int)origin[1], (int)origin[2]); delayedShutDown = level.time + 100; + delete tag; return NULL; } @@ -207,6 +212,7 @@ reference_tag_t *TAG_Add( const char *name, const char *owner, vec3_t origin, ve { delayedShutDown = level.time + 100; gi.Printf(S_COLOR_RED"ERROR: Duplicate tag name \"%s\"\n", name ); + delete tag; return NULL; } @@ -218,7 +224,7 @@ reference_tag_t *TAG_Add( const char *name, const char *owner, vec3_t origin, ve } tagOwner_t *tagOwner = TAG_FindOwner( owner ); - + //If the owner is valid, add this tag to it if VALID( tagOwner ) { @@ -299,7 +305,7 @@ int TAG_GetAngles( const char *owner, const char *name, vec3_t angles ) VALIDATEB( tag ); VectorCopy( tag->angles, angles ); - + return true; } @@ -353,12 +359,12 @@ If you target a ref_tag at an entity, that will set the ref_tag's angles toward that entity. If you set the ref_tag's ownername to the ownername of an entity, -it makes that entity is the owner of the ref_tag. This means +it makes that entity is the owner of the ref_tag. This means that the owner, and only the owner, may refer to that tag. Tags may not have the same name as another tag with the same owner. However, tags with different owners may have the same -name as one another. In this way, scripts can generically +name as one another. In this way, scripts can generically refer to tags by name, and their owners will automatically specifiy which tag is being referred to. @@ -369,8 +375,6 @@ target - use to point the tag at something for angles void ref_link ( gentity_t *ent ) { - reference_tag_t *tag; - if ( ent->target ) { //TODO: Find the target and set our angles to that direction @@ -383,7 +387,7 @@ void ref_link ( gentity_t *ent ) VectorSubtract( target->s.origin, ent->s.origin, dir ); VectorNormalize( dir ); vectoangles( dir, ent->s.angles ); - + //FIXME: Does pitch get flipped? } else @@ -391,9 +395,9 @@ void ref_link ( gentity_t *ent ) gi.Printf( S_COLOR_RED"ERROR: ref_tag (%s) has invalid target (%s)", ent->targetname, ent->target ); } } - + //Add the tag - tag = TAG_Add( ent->targetname, ent->ownername, ent->s.origin, ent->s.angles, 16, 0 ); + /*tag = */TAG_Add( ent->targetname, ent->ownername, ent->s.origin, ent->s.angles, 16, 0 ); //Delete immediately, cannot be refered to as an entity again //NOTE: this means if you wanted to link them in a chain for, say, a path, you can't diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp index 487211fb48..dd53d59ae4 100644 --- a/code/game/g_roff.cpp +++ b/code/game/g_roff.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "g_local.h" #include "g_roff.h" diff --git a/code/game/g_roff.h b/code/game/g_roff.h index 427da345df..6eca7fb260 100644 --- a/code/game/g_roff.h +++ b/code/game/g_roff.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __G_ROFF_H__ #define __G_ROFF_H__ diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index 342f99e859..9a0e603257 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- g_savegame.cpp @@ -73,11 +77,11 @@ static const save_field_t savefields_gEntity[] = {strFOFS(behaviorSet), F_BEHAVIORSET}, {strFOFS(script_targetname),F_STRING}, {strFOFS(m_iIcarusID), F_NULL}, - {strFOFS(NPC), F_BOOLPTR}, + {strFOFS(NPC), F_BOOLPTR}, {strFOFS(soundSet), F_STRING}, {strFOFS(cameraGroup), F_STRING}, - {strFOFS(parms), F_BOOLPTR}, - {strFOFS(m_pVehicle), F_BOOLPTR}, + {strFOFS(parms), F_BOOLPTR}, + {strFOFS(m_pVehicle), F_BOOLPTR}, {NULL, 0, F_IGNORE} }; @@ -106,10 +110,10 @@ static const save_field_t savefields_gNPC[] = static const save_field_t savefields_LevelLocals[] = { - {strLLOFS(locationHead), F_GENTITY}, + {strLLOFS(locationHead), F_GENTITY}, {strLLOFS(alertEvents), F_ALERTEVENT}, - {strLLOFS(groups), F_AIGROUPS}, - {strLLOFS(knownAnimFileSets),F_ANIMFILESETS}, + {strLLOFS(groups), F_AIGROUPS}, + {strLLOFS(knownAnimFileSets),F_ANIMFILESETS}, {NULL, 0, F_IGNORE} }; @@ -119,7 +123,7 @@ static const save_field_t savefields_gVHIC[] = {strVHICOFS(m_pOldPilot), F_GENTITY}, {strVHICOFS(m_pDroidUnit), F_GENTITY}, {strVHICOFS(m_pParentEntity), F_GENTITY}, - + //m_ppPassengers //!ptr array?! {strVHICOFS(m_pVehicleInfo), F_VEHINFO}, //!another ptr! store name field instead and re-hook on load? @@ -130,7 +134,7 @@ static const save_field_t savefields_gClient[] = { // sabers are stomped over by specific code elsewhere, it seems, but the first two fields MUST be saved // or it crashes on reload - {strCLOFS(ps.saber[0].name),F_STRING}, + {strCLOFS(ps.saber[0].name),F_STRING}, /* {strCLOFS(ps.saber[0].model),F_STRING}, {strCLOFS(ps.saber[0].skin),F_STRING}, {strCLOFS(ps.saber[0].brokenSaber1),F_STRING}, @@ -151,7 +155,7 @@ static const save_field_t savefields_gClient[] = {NULL, 0, F_IGNORE} }; -list *strList = NULL; +std::list *strList = NULL; /////////// char * ///////////// @@ -181,7 +185,7 @@ static char *GetStringPtr(int iStrlen, char *psOriginal/*may be NULL*/) sString[0]=0; assert(iStrlen+1<=(int)sizeof(sString)); - + gi.ReadFromSaveGame(INT_ID('S','T','R','G'), sString, iStrlen, NULL); // TAG_G_ALLOC is always blown away, we can never recycle @@ -224,7 +228,7 @@ static intptr_t GetGEntityNum(gentity_t* ent) ptrdiff_t iReturnIndex = ent - g_entities; if (iReturnIndex < 0 || iReturnIndex >= MAX_GENTITIES) - { + { iReturnIndex = -1; // will get a NULL ptr on reload } return iReturnIndex; @@ -257,7 +261,7 @@ static intptr_t GetGroupNumber(AIGroupInfo_t *pGroup) int iReturnIndex = pGroup - level.groups; if (iReturnIndex < 0 || iReturnIndex >= (int)(sizeof(level.groups) / sizeof(level.groups[0])) ) - { + { iReturnIndex = -1; // will get a NULL ptr on reload } return iReturnIndex; @@ -290,10 +294,10 @@ static intptr_t GetGClientNum(gclient_t *c, gentity_t *ent) { return -1; } - + if (ent->s.number < MAX_CLIENTS) { // regular client... - return (c - level.clients); + return (c - level.clients); } else { // this must be an NPC or weapon_shooter, so mark it as special... @@ -327,12 +331,12 @@ static gclient_t *GetGClientPtr(intptr_t c) static int GetGItemNum (gitem_t *pItem) { assert(pItem != (gitem_t*) 0xcdcdcdcd); - + if (pItem == NULL) { return -1; } - + return pItem - bg_itemlist; } @@ -358,12 +362,12 @@ static gitem_t *GetGItemPtr(int iItem) static int GetVehicleInfoNum(vehicleInfo_t *pVehicleInfo) { assert(pVehicleInfo != (vehicleInfo_t*) 0xcdcdcdcd); - + if (pVehicleInfo == NULL) { return -1; } - + return pVehicleInfo - g_vehicleInfo; } @@ -464,14 +468,14 @@ static void EnumerateField(const save_field_t *pField, const byte *pbBase) { animFileSet_t* p = (animFileSet_t *) pv; - for (int i=0; ii = GetStringNum( ptAnimEventStringData ); const char *plAnimEventStringData = p[i].legsAnimEvents[j].stringData; - *(int *)(&p[i].legsAnimEvents[j].stringData) = GetStringNum( plAnimEventStringData ); + baLegs->i = GetStringNum( plAnimEventStringData ); } } } @@ -495,9 +499,9 @@ static void EnumerateField(const save_field_t *pField, const byte *pbBase) } } -static void EnumerateFields(const save_field_t *pFields, const byte *pbData, unsigned int ulChid, int iLen) +static void EnumerateFields(const save_field_t *pFields, const byte *pbData, unsigned int ulChid, size_t iLen) { - strList = new list; + strList = new std::list; // enumerate all the fields... // @@ -509,19 +513,19 @@ static void EnumerateFields(const save_field_t *pFields, const byte *pbData, uns EnumerateField(pField, pbData); } } - + // save out raw data... // gi.AppendToSaveGame(ulChid, pbData, iLen); // save out any associated strings.. // - list::iterator it = strList->begin(); + std::list::iterator it = strList->begin(); for (size_t i=0; isize(); i++, ++it) { gi.AppendToSaveGame(INT_ID('S','T','R','G'), (void *)(*it).c_str(), (*it).length() + 1); } - + delete strList; strList = NULL; } @@ -582,7 +586,7 @@ static void EvaluateField(const save_field_t *pField, byte *pbBase, byte *pbOrig */ case F_ALERTEVENT: - { + { alertEvent_t* p = (alertEvent_t *) pv; for (int i=0; iui = BigLong( chid ); + chidtext[4] = '\0'; return chidtext; } @@ -717,28 +721,28 @@ static void SG_ConvertRetailSaberinfoToNewSaberinfo( void *sabData, saberInfo_t } saberNew[saberNum].type = saberRetail[saberNum].type; } -} +} static void EvaluateFields(const save_field_t *pFields, byte *pbData, byte *pbOriginalRefData, unsigned int ulChid, int iSize, qboolean bOkToSizeMisMatch) -{ +{ int iReadSize = gi.ReadFromSaveGame(ulChid, pbData, bOkToSizeMisMatch?0:iSize, NULL); if (iReadSize != iSize) { - // handle any chunks that are ok to change length (typically this is a last minute hack, + // handle any chunks that are ok to change length (typically this is a last minute hack, // so hopefully we won't need it any more... ;-) // switch (ulChid) { // example chunk handler... - // + // case INT_ID('G','C','L','I'): if ( iSize == (int)(iReadSize+((sizeof(saberInfo_t)-sizeof(saberInfoRetail_t))*2)) ) { gclient_t newClient; const int preSaberDataSize = ((intptr_t)&newClient.ps.saber[0]-(intptr_t)&newClient); memcpy( &newClient, pbData, preSaberDataSize ); - SG_ConvertRetailSaberinfoToNewSaberinfo( ((void *)(&((gclient_t *)(pbData))->ps.saber[0])), &newClient.ps.saber[0] ); + SG_ConvertRetailSaberinfoToNewSaberinfo( ((void *)(&((gclient_t *)(pbData))->ps.saber[0])), &newClient.ps.saber[0] ); memcpy( &newClient.ps.dualSabers, pbData+preSaberDataSize+(sizeof(saberInfoRetail_t)*2), sizeof(newClient)-(preSaberDataSize+(sizeof(saberInfo_t)*2)) ); memcpy( pbData, &newClient, sizeof(gclient_t) ); } @@ -755,7 +759,7 @@ static void EvaluateFields(const save_field_t *pFields, byte *pbData, byte *pbOr break; } } - + if (pFields) { for (const save_field_t *pField = pFields; pField->psName; pField++) @@ -812,7 +816,7 @@ static void WriteGEntities(qboolean qbAutosave) { gentity_t* ent = &g_entities[i]; - if ( ent->inuse ) + if ( ent->inuse ) { iCount++; } @@ -838,7 +842,7 @@ static void WriteGEntities(qboolean qbAutosave) gi.linkentity( ent ); } - EnumerateFields(savefields_gEntity, (byte *)&tempEnt, INT_ID('G','E','N','T'), sizeof(tempEnt)); + EnumerateFields(savefields_gEntity, (byte *)&tempEnt, INT_ID('G','E','N','T'), sizeof(tempEnt)); // now for any fiddly bits that would be rather awkward to build into the enumerator... // @@ -859,16 +863,16 @@ static void WriteGEntities(qboolean qbAutosave) { gi.AppendToSaveGame(INT_ID('P','A','R','M'), ent->parms, sizeof(*ent->parms)); } - + if (tempEnt.m_pVehicle) { Vehicle_t vehicle = *ent->m_pVehicle; // NOT *tempEnt.m_pVehicle!! EnumerateFields(savefields_gVHIC, (byte *)&vehicle, INT_ID('V','H','I','C'), sizeof(vehicle)); } - + // the scary ghoul2 saver stuff... (fingers crossed) // - gi.G2API_SaveGhoul2Models(tempEnt.ghoul2); + gi.G2API_SaveGhoul2Models(tempEnt.ghoul2); tempEnt.ghoul2.kill(); // this handle was shallow copied from an ent. We don't want it destroyed } } @@ -881,8 +885,8 @@ static void WriteGEntities(qboolean qbAutosave) //Save out ICARUS information IIcarusInterface::GetIcarus()->Save(); - // this marker needs to be here, it lets me know if Icarus doesn't load everything back later, - // which has happened, and doesn't always show up onscreen until certain game situations. + // this marker needs to be here, it lets me know if Icarus doesn't load everything back later, + // which has happened, and doesn't always show up onscreen until certain game situations. // This saves time debugging, and makes things easier to track. // static int iBlah = 1234; @@ -890,7 +894,7 @@ static void WriteGEntities(qboolean qbAutosave) } if (!qbAutosave )//really shouldn't need to write these bits at all, just restore them from the ents... { - WriteInUseBits(); + WriteInUseBits(); } } @@ -898,7 +902,7 @@ static void ReadGEntities(qboolean qbAutosave) { int iCount; int i; - + gi.ReadFromSaveGame(INT_ID('N','M','E','D'), (void *)&iCount, sizeof(iCount), NULL); int iPreviousEntRead = -1; @@ -927,14 +931,14 @@ static void ReadGEntities(qboolean qbAutosave) // slightly naff syntax here, but makes a few ops clearer later... // gentity_t entity; - gentity_t* pEntOriginal = &entity; + gentity_t* pEntOriginal = &entity; gentity_t* pEnt = &g_entities[iEntIndex]; *pEntOriginal = *pEnt; // struct copy, so we can refer to original - + pEntOriginal->ghoul2.kill(); gi.unlinkentity(pEnt); Quake3Game()->FreeEntity( pEnt ); - + // // sneaky: destroy the ghoul2 object within this struct before binary-loading over the top of it... // @@ -950,7 +954,7 @@ static void ReadGEntities(qboolean qbAutosave) gNPC_t tempNPC; EvaluateFields(savefields_gNPC, (byte *)&tempNPC,(byte *)pEntOriginal->NPC, INT_ID('G','N','P','C'), sizeof (*pEnt->NPC),qfalse); - + // so can we pinch the original's one or do we have to alloc a new one?... // if (pEntOriginal->NPC) @@ -983,7 +987,7 @@ static void ReadGEntities(qboolean qbAutosave) if (pEnt->client == (gclient_t*) -2) // one of Mike G's NPC clients? { - gclient_t tempGClient; + gclient_t tempGClient; EvaluateFields(savefields_gClient, (byte *)&tempGClient, (byte *)pEntOriginal->client, INT_ID('G','C','L','I'), sizeof(*pEnt->client),qtrue);//qfalse); @@ -998,7 +1002,7 @@ static void ReadGEntities(qboolean qbAutosave) else { // original didn't have one (hmmm...) so make a new one... - // + // pEnt->client = (gclient_t *) G_Alloc(sizeof(*pEnt->client)); } @@ -1017,7 +1021,7 @@ static void ReadGEntities(qboolean qbAutosave) if (pEnt->parms) // will be qtrue/qfalse { parms_t tempParms; - + gi.ReadFromSaveGame(INT_ID('P','A','R','M'), &tempParms, sizeof(tempParms), NULL); // so can we pinch the original's one or do we have to alloc a new one?... @@ -1031,7 +1035,7 @@ static void ReadGEntities(qboolean qbAutosave) else { // original didn't have one, so make a new one... - // + // pEnt->parms = (parms_t *) G_Alloc(sizeof(*pEnt->parms)); } @@ -1043,7 +1047,7 @@ static void ReadGEntities(qboolean qbAutosave) if (pEnt->m_pVehicle) // will be qtrue/qfalse { Vehicle_t tempVehicle; - + EvaluateFields(savefields_gVHIC, (byte *)&tempVehicle,(byte *)pEntOriginal->m_pVehicle, INT_ID('V','H','I','C'), sizeof (*pEnt->m_pVehicle),qfalse); // so can we pinch the original's one or do we have to alloc a new one?... @@ -1057,7 +1061,7 @@ static void ReadGEntities(qboolean qbAutosave) else { // original didn't have one, so make a new one... - // + // pEnt->m_pVehicle = (Vehicle_t *) gi.Malloc( sizeof(Vehicle_t), TAG_G_ALLOC, qfalse ); } @@ -1075,14 +1079,14 @@ static void ReadGEntities(qboolean qbAutosave) gi.Free(pGhoul2Data); } -// gi.unlinkentity (pEntOriginal); +// gi.unlinkentity (pEntOriginal); // ICARUS_FreeEnt( pEntOriginal ); -// *pEntOriginal = *pEnt; // struct copy +// *pEntOriginal = *pEnt; // struct copy // qboolean qbLinked = pEntOriginal->linked; // pEntOriginal->linked = qfalse; // if (qbLinked) // { -// gi.linkentity (pEntOriginal); +// gi.linkentity (pEntOriginal); // } // because the sytem stores sfx_t handles directly instead of the set, we have to reget the set's sfx_t... @@ -1107,8 +1111,8 @@ static void ReadGEntities(qboolean qbAutosave) pEnt->linked = qfalse; if (qbLinked) { - gi.linkentity (pEnt); - } + gi.linkentity (pEnt); + } } //Read in all the entity timers @@ -1125,7 +1129,7 @@ static void ReadGEntities(qboolean qbAutosave) { G_FreeEntity(&g_entities[i]); } - } + } //Load ICARUS information Quake3Game()->ClearEntityList(); @@ -1152,8 +1156,8 @@ void WriteLevel(qboolean qbAutosave) // assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way ReadGame works gclient_t client = level.clients[0]; - EnumerateFields(savefields_gClient, (byte *)&client, INT_ID('G','C','L','I'), sizeof(client)); - WriteLevelLocals(); // level_locals_t level + EnumerateFields(savefields_gClient, (byte *)&client, INT_ID('G','C','L','I'), sizeof(client)); + WriteLevelLocals(); // level_locals_t level } OBJ_SaveObjectiveData(); @@ -1189,18 +1193,18 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) //In a loadtransition, client data is carried over on the server and will be stomped later anyway. //The objective info (in client->sess data), however, is read in from G_ReadSessionData which is called before this func, //we do NOT want to stomp that session data when doing a load transition - + //However, we should still save this info out because these savegames may need to be //loaded normally later- perhaps if you die and need to respawn, perhaps as some kind //of emergency savegame for resuming, etc. //SO: We read it in, but throw it away. - + //Read & throw away gclient info gclient_t junkClient; EvaluateFields(savefields_gClient, (byte *)&junkClient, (byte *)&level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qtrue);//qfalse); - ReadLevelLocals(); // level_locals_t level + ReadLevelLocals(); // level_locals_t level //Read & throw away objective info objectives_t junkObj[MAX_MISSION_OBJ]; @@ -1211,13 +1215,13 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) if (!qbAutosave )//always load the client unless it's an autosave { assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way things work - + gclient_t GClient; EvaluateFields(savefields_gClient, (byte *)&GClient, (byte *)&level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qtrue);//qfalse); level.clients[0] = GClient; // struct copy - ReadLevelLocals(); // level_locals_t level + ReadLevelLocals(); // level_locals_t level } - + OBJ_LoadObjectiveData();//loads mission objectives AND tactical info } @@ -1312,7 +1316,7 @@ struct Vehicle_t vec3_t m_vOrientation; // How long you have strafed left or right (increments every frame that you strafe to right, decrements every frame you strafe left) - int m_fStrafeTime; + int m_fStrafeTime; // Previous angles of this vehicle. vec3_t m_vPrevOrientation; @@ -1327,7 +1331,7 @@ struct Vehicle_t int m_iShields; //energy shielding - STAT_ARMOR on NPC // Timer for all cgame-FX...? ex: exhaust? - int m_iLastFXTime; + int m_iLastFXTime; // When to die. int m_iDieTime; diff --git a/code/game/g_session.cpp b/code/game/g_session.cpp index f44eb83468..e2bbeed556 100644 --- a/code/game/g_session.cpp +++ b/code/game/g_session.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "g_local.h" #include "objectives.h" diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 9366386c0f..ac41f899d8 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __G_SHARED_H__ #define __G_SHARED_H__ diff --git a/code/game/g_spawn.cpp b/code/game/g_spawn.cpp index 8199e93f27..5de04b5948 100644 --- a/code/game/g_spawn.cpp +++ b/code/game/g_spawn.cpp @@ -1,20 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + #include "../cgame/cg_local.h" #include "Q3_Interface.h" #include "g_local.h" @@ -37,7 +43,7 @@ int delayedShutDown = 0; #include "../qcommon/sstring.h" //NOTENOTE: Be sure to change the mirrored code in cgmain.cpp -typedef map< sstring_t, unsigned char, less, allocator< unsigned char > > namePrecache_m; +typedef std::map< sstring_t, unsigned char > namePrecache_m; namePrecache_m *as_preCacheMap = NULL; char *G_AddSpawnVarToken( const char *string ); @@ -1225,25 +1231,26 @@ qboolean G_ParseSpawnVars( const char **data ) { while ( 1 ) { // parse key com_token = COM_Parse( data ); - if ( com_token[0] == '}' ) { - break; - } - if ( !data ) { + if ( !*data ) { COM_EndParseSession(); G_Error( "G_ParseSpawnVars: EOF without closing brace" ); } + if ( com_token[0] == '}' ) { + break; + } + Q_strncpyz( keyname, com_token, sizeof(keyname) ); // parse value com_token = COM_Parse( data ); - if ( com_token[0] == '}' ) { + if ( !*data ) { COM_EndParseSession(); - G_Error( "G_ParseSpawnVars: closing brace without data" ); + G_Error( "G_ParseSpawnVars: EOF without closing brace" ); } - if ( !data ) { + if ( com_token[0] == '}' ) { COM_EndParseSession(); - G_Error( "G_ParseSpawnVars: EOF without closing brace" ); + G_Error( "G_ParseSpawnVars: closing brace without data" ); } if ( numSpawnVars == MAX_SPAWN_VARS ) { COM_EndParseSession(); diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index 464fba8a3f..77739c3b77 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "../cgame/cg_local.h" #include "Q3_Interface.h" @@ -68,25 +73,49 @@ void Svcmd_EntityList_f (void) { gi.Printf("%3i:", e); switch ( check->s.eType ) { case ET_GENERAL: - gi.Printf("ET_GENERAL "); + gi.Printf( "ET_GENERAL " ); break; case ET_PLAYER: - gi.Printf("ET_PLAYER "); + gi.Printf( "ET_PLAYER " ); break; case ET_ITEM: - gi.Printf("ET_ITEM "); + gi.Printf( "ET_ITEM " ); break; case ET_MISSILE: - gi.Printf("ET_MISSILE "); + gi.Printf( "ET_MISSILE " ); break; case ET_MOVER: - gi.Printf("ET_MOVER "); + gi.Printf( "ET_MOVER " ); break; case ET_BEAM: - gi.Printf("ET_BEAM "); + gi.Printf( "ET_BEAM " ); + break; + case ET_PORTAL: + gi.Printf( "ET_PORTAL " ); + break; + case ET_SPEAKER: + gi.Printf( "ET_SPEAKER " ); + break; + case ET_PUSH_TRIGGER: + gi.Printf( "ET_PUSH_TRIGGER " ); + break; + case ET_TELEPORT_TRIGGER: + gi.Printf( "ET_TELEPORT_TRIGGER " ); + break; + case ET_INVISIBLE: + gi.Printf( "ET_INVISIBLE " ); + break; + case ET_THINKER: + gi.Printf( "ET_THINKER " ); + break; + case ET_CLOUD: + gi.Printf( "ET_CLOUD " ); + break; + case ET_TERRAIN: + gi.Printf( "ET_TERRAIN " ); break; default: - gi.Printf("#%i", check->s.eType); + gi.Printf( "%-3i ", check->s.eType ); break; } @@ -97,43 +126,6 @@ void Svcmd_EntityList_f (void) { } } -gclient_t *ClientForString( const char *s ) { - gclient_t *cl; - int i; - int idnum; - - // numeric values are just slot numbers - if ( s[0] >= '0' && s[0] <= '9' ) { - idnum = atoi( s ); - if ( idnum < 0 || idnum >= level.maxclients ) { - Com_Printf( "Bad client slot: %i\n", idnum ); - return NULL; - } - - cl = &level.clients[idnum]; - if ( cl->pers.connected == CON_DISCONNECTED ) { - gi.Printf( "Client %i is not connected\n", idnum ); - return NULL; - } - return cl; - } - - // check for a name match - for ( i=0 ; i < level.maxclients ; i++ ) { - cl = &level.clients[i]; - if ( cl->pers.connected == CON_DISCONNECTED ) { - continue; - } - if ( !Q_stricmp( cl->pers.netname, s ) ) { - return cl; - } - } - - gi.Printf( "User %s is not on the server\n", s ); - - return NULL; -} - //--------------------------- extern void G_StopCinematicSkip( void ); extern void G_StartCinematicSkip( void ); @@ -633,7 +625,6 @@ void G_GrabEntity( gentity_t *grabber, const char *target ) /* ================= ConsoleCommand -// these are added in cg_main, CG_Init so they tab-complete ================= */ qboolean ConsoleCommand( void ) { @@ -652,11 +643,6 @@ qboolean ConsoleCommand( void ) { return qtrue; } -// if (Q_stricmp (cmd, "addbot") == 0) { -// Svcmd_AddBot_f(); -// return qtrue; -// } - if (Q_stricmp (cmd, "nav") == 0) { if ( !g_cheats->integer ) @@ -736,7 +722,6 @@ qboolean ConsoleCommand( void ) { return qtrue; } - if ( Q_stricmp( cmd, "setForceJump" ) == 0 ) { Svcmd_ForceSetLevel_f( FP_LEVITATION ); diff --git a/code/game/g_target.cpp b/code/game/g_target.cpp index 7eee1ab68e..dacf81f206 100644 --- a/code/game/g_target.cpp +++ b/code/game/g_target.cpp @@ -1,20 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + #include "../cgame/cg_local.h" #include "Q3_Interface.h" #include "g_local.h" diff --git a/code/game/g_trigger.cpp b/code/game/g_trigger.cpp index 991683f030..756a032dcd 100644 --- a/code/game/g_trigger.cpp +++ b/code/game/g_trigger.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "g_local.h" #include "g_functions.h" diff --git a/code/game/g_turret.cpp b/code/game/g_turret.cpp index bea2acb021..5abc9591b4 100644 --- a/code/game/g_turret.cpp +++ b/code/game/g_turret.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "g_local.h" #include "g_functions.h" diff --git a/code/game/g_usable.cpp b/code/game/g_usable.cpp index a3f17c9161..8939452eb9 100644 --- a/code/game/g_usable.cpp +++ b/code/game/g_usable.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + #include "g_local.h" #include "g_functions.h" diff --git a/code/game/g_utils.cpp b/code/game/g_utils.cpp index c5aaf50b08..e59c3f20fc 100644 --- a/code/game/g_utils.cpp +++ b/code/game/g_utils.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // g_utils.c -- misc utility functions for game module @@ -898,15 +903,9 @@ void G_FreeEntity( gentity_t *ed ) { gi.Free(ed->client->clientInfo.customBasicSoundDir); } if(ed->client->clientInfo.customCombatSoundDir) { -#ifdef _MSC_VER - assert(*(unsigned int*)ed->client->clientInfo.customCombatSoundDir != 0xfeeefeee); -#endif gi.Free(ed->client->clientInfo.customCombatSoundDir); } if(ed->client->clientInfo.customExtraSoundDir) { -#ifdef _MSC_VER - assert(*(unsigned int*)ed->client->clientInfo.customExtraSoundDir != 0xfeeefeee); -#endif gi.Free(ed->client->clientInfo.customExtraSoundDir); } if(ed->client->clientInfo.customJediSoundDir) { diff --git a/code/game/g_vehicles.cpp b/code/game/g_vehicles.cpp index b5223966d0..a1fda3547c 100644 --- a/code/game/g_vehicles.cpp +++ b/code/game/g_vehicles.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + #include "../qcommon/q_shared.h" #include "g_local.h" @@ -150,9 +155,9 @@ float G_CanJumpToEnemyVeh(Vehicle_t *pVeh, const usercmd_t *pUcmd ) // If There Is An Enemy And We Are At The Same Z Height //------------------------------------------------------ - if (rider && - rider->enemy && - pUcmd->rightmove && + if (rider && + rider->enemy && + pUcmd->rightmove && fabsf(rider->enemy->currentOrigin[2] - rider->currentOrigin[2])<50.0f) { if (level.timem_safeJumpMountTime) @@ -177,7 +182,7 @@ float G_CanJumpToEnemyVeh(Vehicle_t *pVeh, const usercmd_t *pUcmd ) //------------------------------------------------ VectorSubtract(rider->enemy->currentOrigin, rider->currentOrigin, toEnemy); toEnemyDistance = VectorNormalize(toEnemy); - if (toEnemyDistance<70.0f && + if (toEnemyDistance<70.0f && pVeh->m_pParentEntity->resultspeed>100.0f && fabsf(pVeh->m_pParentEntity->resultspeed - enemyVeh->m_pParentEntity->resultspeed)<100.0f) { @@ -225,18 +230,18 @@ void G_VehicleSpawn( gentity_t *self ) //save this because self gets removed in next func yaw = self->s.angles[YAW]; - + #ifdef _JK2MP vehEnt = NPC_Spawn_Do( self ); #else vehEnt = NPC_Spawn_Do( self, qtrue ); #endif - + if ( !vehEnt ) { return;//return NULL; } - + vehEnt->s.angles[YAW] = yaw; if ( vehEnt->m_pVehicle->m_pVehicleInfo->type != VH_ANIMAL ) { @@ -321,7 +326,7 @@ void G_KnockOffVehicle( gentity_t *pRider, gentity_t *self, qboolean bPull ) { return; } - + pVeh = G_IsRidingVehicle( pRider ); if ( !pVeh || !pVeh->m_pVehicleInfo ) @@ -579,7 +584,7 @@ bool ValidateBoard( Vehicle_t *pVeh, bgEntity_t *pEnt ) VectorNormalize( vVehToEnt ); // Get the right vector. - AngleVectors( vVehAngles, NULL, vVehDir, NULL ); + AngleVectors( vVehAngles, NULL, vVehDir, NULL ); VectorNormalize( vVehDir ); // Find the angle between the vehicle right vector and the vehicle to entity vector. @@ -600,7 +605,7 @@ bool ValidateBoard( Vehicle_t *pVeh, bgEntity_t *pEnt ) else { // The forward vector of the vehicle. - // AngleVectors( vVehAngles, vVehDir, NULL, NULL ); + // AngleVectors( vVehAngles, vVehDir, NULL, NULL ); // VectorNormalize( vVehDir ); // Find the angle between the vehicle forward and the vehicle to entity vector. @@ -705,7 +710,7 @@ bool Board( Vehicle_t *pVeh, bgEntity_t *pEnt ) parent->owner = ent; #endif -#ifdef QAGAME +#ifdef QAGAME { gentity_t *gParent = (gentity_t *)parent; if ( (gParent->spawnflags&2) ) @@ -778,7 +783,7 @@ bool Board( Vehicle_t *pVeh, bgEntity_t *pEnt ) return false; } } - + // Make sure the entity knows it's in a vehicle. #ifdef _JK2MP ent->client->ps.m_iVehicleNum = parent->s.number; @@ -804,8 +809,8 @@ bool Board( Vehicle_t *pVeh, bgEntity_t *pEnt ) {// Riding means you get WP_NONE ent->client->ps.stats[ STAT_WEAPONS ] |= (1<client->ps.weapon != WP_SABER - && ent->client->ps.weapon != WP_BLASTER ) + if ( (ent->client->ps.weapon != WP_SABER + && ent->client->ps.weapon != WP_BLASTER) || !(pVeh->m_pVehicleInfo->type == VH_ANIMAL || pVeh->m_pVehicleInfo->type == VH_SPEEDER)) {//switch to weapon none? if (ent->s.numberm_EjectDir = VEH_EJECT_LEFT; - // Since (as of this time) the collidable geometry of the entity is just an axis + // Since (as of this time) the collidable geometry of the entity is just an axis // aligned box, we need to get the diagonal length of it in case we come out on that side. // Diagonal Length == squareroot( squared( Sidex / 2 ) + squared( Sidey / 2 ) ); @@ -1232,7 +1237,7 @@ bool Eject( Vehicle_t *pVeh, bgEntity_t *pEnt, qboolean forceEject ) ent->r.contents = CONTENTS_BODY; } #else - ent->owner = NULL; + ent->owner = NULL; #endif ent->s.m_iVehicleNum = 0; @@ -1260,7 +1265,7 @@ bool Eject( Vehicle_t *pVeh, bgEntity_t *pEnt, qboolean forceEject ) //ent->client->ps.stats[STAT_WEAPONS] &= ~( 1 << WP_EMPLACED_GUN ); //ent->client->ps.ammo[weaponData[WP_EMPLACED_GUN].ammoIndex] = 0;//maybe store this ammo on the vehicle before clearing it? //switch back to a normal weapon we're carrying - + //FIXME: store the weapon we were using when we got on and restore that when hop off /* if ( (ent->client->ps.stats[STAT_WEAPONS]&(1<s.number && ent->client->ps.weapon != WP_SABER +/* if ( !ent->s.number && ent->client->ps.weapon != WP_SABER && cg_gunAutoFirst.value ) { gi.cvar_set( "cg_thirdperson", "0" ); @@ -1348,7 +1353,7 @@ bool EjectAll( Vehicle_t *pVeh ) } #endif } - + if ( pVeh->m_pDroidUnit ) { G_EjectDroidUnit( pVeh, pVeh->m_pVehicleInfo->killRiderOnDeath ); @@ -1431,7 +1436,7 @@ static void DeathUpdate( Vehicle_t *pVeh ) NULL, pVeh->m_pParentEntity->playerState->origin, 999, DAMAGE_NO_PROTECTION, MOD_EXPLOSIVE); } } - } + } } #endif } @@ -1565,8 +1570,8 @@ bool Initialize( Vehicle_t *pVeh ) } } //begin stopped...? - parent->client->ps.speed = 0; - + parent->client->ps.speed = 0; + VectorClear( pVeh->m_vOrientation ); pVeh->m_vOrientation[YAW] = parent->s.angles[YAW]; @@ -1635,7 +1640,7 @@ bool Initialize( Vehicle_t *pVeh ) int iFlags = SETANIM_FLAG_NORMAL, iBlend = 300; #ifdef _JK2MP pVeh->m_ulFlags |= VEH_GEARSOPEN; - BG_SetAnim(pVeh->m_pParentEntity->playerState, + BG_SetAnim(pVeh->m_pParentEntity->playerState, bgAllAnims[pVeh->m_pParentEntity->localAnimIndex].anims, SETANIM_BOTH, BOTH_VS_IDLE, iFlags, iBlend); #else @@ -1751,7 +1756,7 @@ static bool Update( Vehicle_t *pVeh, const usercmd_t *pUmcd ) #endif // See whether this vehicle should be dieing or dead. - if ( pVeh->m_iDieTime != 0 + if ( pVeh->m_iDieTime != 0 #ifndef _JK2MP //sometimes this gets out of whack, probably init'ing || (parent->health <= 0) #endif @@ -1763,7 +1768,7 @@ static bool Update( Vehicle_t *pVeh, const usercmd_t *pUmcd ) // Process the orient commands. pVeh->m_pVehicleInfo->ProcessOrientCommands( pVeh ); // Need to copy orientation to our entity's viewangles so that it renders at the proper angle and currentAngles is correct. - SetClientViewAngle( parent, pVeh->m_vOrientation ); + SetClientViewAngle( parent, pVeh->m_vOrientation ); if ( pVeh->m_pPilot ) { SetClientViewAngle( (gentity_t *)pVeh->m_pPilot, pVeh->m_vOrientation ); @@ -1784,12 +1789,12 @@ static bool Update( Vehicle_t *pVeh, const usercmd_t *pUmcd ) // Setup the move direction. if ( pVeh->m_pVehicleInfo->type == VH_FIGHTER ) { - AngleVectors( pVeh->m_vOrientation, parent->client->ps.moveDir, NULL, NULL ); + AngleVectors( pVeh->m_vOrientation, parent->client->ps.moveDir, NULL, NULL ); } else { VectorSet(vVehAngles, 0, pVeh->m_vOrientation[YAW], 0); - AngleVectors( vVehAngles, parent->client->ps.moveDir, NULL, NULL ); + AngleVectors( vVehAngles, parent->client->ps.moveDir, NULL, NULL ); } pVeh->m_pVehicleInfo->DeathUpdate( pVeh ); return false; @@ -1813,7 +1818,7 @@ static bool Update( Vehicle_t *pVeh, const usercmd_t *pUmcd ) return false; } #endif - + #ifdef _JK2MP //special check in case someone disconnects/dies while boarding #ifdef QAGAME if (parent->spawnflags & 1) @@ -1875,7 +1880,7 @@ static bool Update( Vehicle_t *pVeh, const usercmd_t *pUmcd ) // if (level.timem_iTurboTime || pVeh->m_pVehicleInfo->type==VH_ANIMAL) // always knock guys around now... { - vec3_t dir; + vec3_t dir; vec3_t projectedPosition; VectorCopy(parent->client->ps.velocity, dir); VectorMA(parent->currentOrigin, 0.1f, dir, projectedPosition); @@ -1886,10 +1891,10 @@ static bool Update( Vehicle_t *pVeh, const usercmd_t *pUmcd ) { trace_t tr; G_VehicleTrace(&tr, parent->currentOrigin, parent->mins, parent->maxs, projectedPosition, parent->s.number, CONTENTS_BODY); - if (tr.fraction<1.0f && - !tr.allsolid && - !tr.startsolid && - tr.entityNum!=ENTITYNUM_NONE && + if (tr.fraction<1.0f && + !tr.allsolid && + !tr.startsolid && + tr.entityNum!=ENTITYNUM_NONE && tr.entityNum!=ENTITYNUM_WORLD && (level.timem_iTurboTime || Q_irand(0,3)==0)) { @@ -1956,7 +1961,7 @@ static bool Update( Vehicle_t *pVeh, const usercmd_t *pUmcd ) if ( pVeh->m_pPilot ) { pilotEnt = (gentity_t *)pVeh->m_pPilot; - + #ifdef _JK2MP if (!pilotEnt->inuse || !pilotEnt->client || pilotEnt->health <= 0 || pilotEnt->client->pers.connected != CON_CONNECTED) @@ -1982,18 +1987,18 @@ static bool Update( Vehicle_t *pVeh, const usercmd_t *pUmcd ) // Update time modifier. pVeh->m_fTimeModifier = pVeh->m_ucmd.serverTime - parent->client->ps.commandTime; //sanity check - if ( pVeh->m_fTimeModifier < 1 ) + if ( pVeh->m_fTimeModifier < 1 ) { pVeh->m_fTimeModifier = 1; - } - else if ( pVeh->m_fTimeModifier > 200 ) + } + else if ( pVeh->m_fTimeModifier > 200 ) { pVeh->m_fTimeModifier = 200; } //normalize to 1.0f at 20fps pVeh->m_fTimeModifier = pVeh->m_fTimeModifier / fMod; */ - + //check for weapon linking/unlinking command for ( i = 0; i < MAX_VEHICLE_WEAPONS; i++ ) {//HMM... can't get a seperate command for each weapon, so do them all...? @@ -2006,23 +2011,23 @@ static bool Update( Vehicle_t *pVeh, const usercmd_t *pUmcd ) } } #ifdef _JK2MP - else if ( (pVeh->m_ucmd.buttons&BUTTON_USE_HOLDABLE) ) + else if ( (pVeh->m_ucmd.buttons&BUTTON_USE_HOLDABLE) ) #else //FIXME: implement... just a console command bound to a key? else if ( 0 ) -#endif +#endif {//pilot pressed the "weapon link" toggle button - playerState_t *pilotPS; + //playerState_t *pilotPS; #ifdef _JK2MP bgEntity_t *rider = NULL; if (parent->s.owner != ENTITYNUM_NONE) { rider = PM_BGEntForNum(parent->s.owner); //&g_entities[parent->r.ownerNum]; } - pilotPS = rider->playerState; + //pilotPS = rider->playerState; #else - gentity_t *rider = parent->owner; - pilotPS = &rider->client->ps; + //gentity_t *rider = parent->owner; + //pilotPS = &rider->client->ps; #endif if ( !pVeh->linkWeaponToggleHeld )//so we don't hold it down and toggle it back and forth {//okay to toggle @@ -2083,7 +2088,7 @@ static bool Update( Vehicle_t *pVeh, const usercmd_t *pUmcd ) // Process the orient commands. pVeh->m_pVehicleInfo->ProcessOrientCommands( pVeh ); // Need to copy orientation to our entity's viewangles so that it renders at the proper angle and currentAngles is correct. - SetClientViewAngle( parent, pVeh->m_vOrientation ); + SetClientViewAngle( parent, pVeh->m_vOrientation ); if ( pVeh->m_pPilot ) { #ifdef _JK2MP @@ -2117,12 +2122,12 @@ static bool Update( Vehicle_t *pVeh, const usercmd_t *pUmcd ) pVeh->m_pVehicleInfo->ProcessMoveCommands( pVeh ); nextSpeed = parentPS->speed; halfMaxSpeed = pVeh->m_pVehicleInfo->speedMax*0.5f; - + // Shifting Sounds //===================================================================== - if (pVeh->m_iTurboTimem_iSoundDebounceTimerm_iTurboTimem_iSoundDebounceTimerprevSpeed && nextSpeed>halfMaxSpeed && prevSpeedhalfMaxSpeed && !Q_irand(0,1000))) ) { @@ -2151,12 +2156,12 @@ static bool Update( Vehicle_t *pVeh, const usercmd_t *pUmcd ) // Setup the move direction. if ( pVeh->m_pVehicleInfo->type == VH_FIGHTER ) { - AngleVectors( pVeh->m_vOrientation, parent->client->ps.moveDir, NULL, NULL ); + AngleVectors( pVeh->m_vOrientation, parent->client->ps.moveDir, NULL, NULL ); } else { VectorSet(vVehAngles, 0, pVeh->m_vOrientation[YAW], 0); - AngleVectors( vVehAngles, parent->client->ps.moveDir, NULL, NULL ); + AngleVectors( vVehAngles, parent->client->ps.moveDir, NULL, NULL ); } #ifdef _JK2MP @@ -2181,7 +2186,7 @@ static bool Update( Vehicle_t *pVeh, const usercmd_t *pUmcd ) //FIXME: aside from bypassing shields, maybe set m_iShields to 0, too... ? G_Damage(parent, killer, killer, NULL, parent->client->ps.origin, Q_irand(2, 5), DAMAGE_NO_PROTECTION|DAMAGE_NO_ARMOR, MOD_SUICIDE); } - + //make sure playerstate value stays in sync parent->client->ps.vehSurfaces = pVeh->m_iRemovedSurfaces; } @@ -2206,7 +2211,7 @@ static bool Update( Vehicle_t *pVeh, const usercmd_t *pUmcd ) parent->enemy = pVeh->m_pPilot->enemy; } #endif - + return true; } @@ -2225,7 +2230,7 @@ static bool UpdateRider( Vehicle_t *pVeh, bgEntity_t *pRider, usercmd_t *pUmcd ) rider = (gentity_t *)pRider; #ifdef _JK2MP //MG FIXME !! Single player needs update! - if ( rider && rider->client + if ( rider && rider->client && parent && parent->client ) {//so they know who we're locking onto with our rockets, if anyone rider->client->ps.rocketLockIndex = parent->client->ps.rocketLockIndex; @@ -2288,7 +2293,7 @@ static bool UpdateRider( Vehicle_t *pVeh, bgEntity_t *pRider, usercmd_t *pUmcd ) Anim = BOTH_VS_DISMOUNT_L; pVeh->m_EjectDir = VEH_EJECT_LEFT; } - + if ( pVeh->m_iBoarding <= 1 ) { int iAnimLen; @@ -2343,7 +2348,7 @@ static bool UpdateRider( Vehicle_t *pVeh, bgEntity_t *pRider, usercmd_t *pUmcd ) } } - if ( pVeh->m_pVehicleInfo->type != VH_FIGHTER + if ( pVeh->m_pVehicleInfo->type != VH_FIGHTER && pVeh->m_pVehicleInfo->type != VH_WALKER ) { // Jump off. @@ -2854,7 +2859,7 @@ void G_SetVehDamageFlags( gentity_t *veh, int shipSurf, int damageLevel ) && veh->m_pVehicle->m_pDroidUnit ) {//we have one gentity_t *droidEnt = (gentity_t *)veh->m_pVehicle->m_pDroidUnit; - if ( droidEnt + if ( droidEnt && ((droidEnt->flags&FL_UNDYING) || droidEnt->health > 0) ) {//boom //make it vulnerable @@ -2880,7 +2885,7 @@ void G_SetVehDamageFlags( gentity_t *veh, int shipSurf, int damageLevel ) && veh->m_pVehicle->m_pDroidUnit ) {//we have one gentity_t *droidEnt = (gentity_t *)veh->m_pVehicle->m_pDroidUnit; - if ( droidEnt + if ( droidEnt && (droidEnt->flags&FL_UNDYING) ) {//make it vulnerab;e droidEnt->flags &= ~FL_UNDYING; @@ -2941,7 +2946,7 @@ void G_VehicleSetDamageLocFlags( gentity_t *veh, int impactDir, int deathPoint ) } if ( veh->m_pVehicle && veh->m_pVehicle->m_pVehicleInfo - && veh->m_pVehicle->m_pVehicleInfo->malfunctionArmorLevel + && veh->m_pVehicle->m_pVehicleInfo->malfunctionArmorLevel && veh->m_pVehicle->m_pVehicleInfo->armor ) { float perc = ((float)veh->m_pVehicle->m_pVehicleInfo->malfunctionArmorLevel/(float)veh->m_pVehicle->m_pVehicleInfo->armor); @@ -3134,7 +3139,7 @@ void G_FlyVehicleSurfaceDestruction(gentity_t *veh, trace_t *trace, int magnitud void G_VehUpdateShields( gentity_t *targ ) { - if ( !targ || !targ->client + if ( !targ || !targ->client || !targ->m_pVehicle || !targ->m_pVehicle->m_pVehicleInfo ) { return; diff --git a/code/game/g_vehicles.h b/code/game/g_vehicles.h index c8f25cf5ac..cbb610df33 100644 --- a/code/game/g_vehicles.h +++ b/code/game/g_vehicles.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __G_VEHICLES_H #define __G_VEHICLES_H @@ -50,7 +54,6 @@ extern stringID_table_t VehicleTable[VH_NUM_VEHICLES+1]; //=========================================================================================================== typedef struct { -//*** IMPORTANT!!! *** the number of variables in the vehWeaponStats_t struct (including all elements of arrays) must be reflected by NUM_VWEAP_PARMS!!! //*** IMPORTANT!!! *** vWeapFields table correponds to this structure! char *name; qboolean bIsProjectile; //traceline or entity? @@ -78,8 +81,6 @@ typedef struct int iLifeTime; //removes itself after this amount of time qboolean bExplodeOnExpire; //when iLifeTime is up, explodes rather than simply removing itself } vehWeaponInfo_t; -//NOTE: this MUST stay up to date with the number of variables in the vehFields table!!! -#define NUM_VWEAP_PARMS 25 #define VWFOFS(x) offsetof(vehWeaponInfo_t, x) diff --git a/code/game/g_weapon.cpp b/code/game/g_weapon.cpp index b1d4e1b4a9..7d85a287c1 100644 --- a/code/game/g_weapon.cpp +++ b/code/game/g_weapon.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // g_weapon.c // perform the server side effects of a weapon firing @@ -673,9 +678,13 @@ void WP_FireVehicleWeapon( gentity_t *ent, vec3_t start, vec3_t dir, vehWeaponIn // HUGE HORRIBLE HACK if (ent->owner && ent->owner->s.number==0) { - missile->damage *= 20.0f; - missile->splashDamage *= 20.0f; - missile->splashRadius *= 20.0f; + //Should only be for speeders - mainly for t2_trip + if (ent->m_pVehicle->m_pVehicleInfo && ent->m_pVehicle->m_pVehicleInfo->type == VH_SPEEDER) + { + missile->damage *= 20.0f; + missile->splashDamage *= 20.0f; + missile->splashRadius *= 20.0f; + } } //FIXME: externalize some of these properties? @@ -743,6 +752,7 @@ void WP_FireVehicleWeapon( gentity_t *ent, vec3_t start, vec3_t dir, vehWeaponIn missile->owner = ent; } missile->s.otherEntityNum = ent->s.number; + missile->s.otherEntityNum2 = (vehWeapon-&g_vehWeaponInfo[0]); if ( vehWeapon->iLifeTime ) {//expire after a time @@ -823,6 +833,17 @@ void WP_FireVehicleWeapon( gentity_t *ent, vec3_t start, vec3_t dir, vehWeaponIn } } +void WP_VehLeadCrosshairVeh( gentity_t *camTraceEnt, vec3_t newEnd, const vec3_t dir, const vec3_t shotStart, vec3_t shotDir ) +{ + //FIXME: implement from MP? +} + +qboolean WP_VehCheckTraceFromCamPos( gentity_t *ent, const vec3_t shotStart, vec3_t shotDir ) +{ + //FIXME: implement from MP? + return qfalse; +} + //--------------------------------------------------------- void FireVehicleWeapon( gentity_t *ent, qboolean alt_fire ) //--------------------------------------------------------- @@ -850,13 +871,14 @@ void FireVehicleWeapon( gentity_t *ent, qboolean alt_fire ) // would actually have to press the 2 key or something like that (I doubt I'd get a graphic for it anyways though). -AReis // If this is not the alternate fire, fire a normal blaster shot... - if ( true )//(pVeh->m_ulFlags & VEH_FLYING) || (pVeh->m_ulFlags & VEH_WINGSOPEN) ) // NOTE: Wings open also denotes that it has already launched. - { + if ( pVeh->m_pVehicleInfo && + (pVeh->m_pVehicleInfo->type != VH_FIGHTER || (pVeh->m_ulFlags&VEH_WINGSOPEN)) ) // NOTE: Wings open also denotes that it has already launched. + {//fighters can only fire when wings are open int weaponNum = 0, vehWeaponIndex = VEH_WEAPON_NONE; int delay = 1000; qboolean aimCorrect = qfalse; qboolean linkedFiring = qfalse; - + if ( !alt_fire ) { weaponNum = 0; @@ -865,92 +887,166 @@ void FireVehicleWeapon( gentity_t *ent, qboolean alt_fire ) { weaponNum = 1; } + vehWeaponIndex = pVeh->m_pVehicleInfo->weapon[weaponNum].ID; + + if ( pVeh->weaponStatus[weaponNum].ammo <= 0 ) + {//no ammo for this weapon + if ( pVeh->m_pPilot && pVeh->m_pPilot->s.number < MAX_CLIENTS ) + {// let the client know he's out of ammo + int i; + //but only if one of the vehicle muzzles is actually ready to fire this weapon + for ( i = 0; i < MAX_VEHICLE_MUZZLES; i++ ) + { + if ( pVeh->m_pVehicleInfo->weapMuzzle[i] != vehWeaponIndex ) + {//this muzzle doesn't match the weapon we're trying to use + continue; + } + if ( pVeh->m_iMuzzleTag[i] != -1 + && pVeh->m_Muzzles[i].m_iMuzzleWait < level.time ) + {//this one would have fired, send the no ammo message + G_AddEvent( (gentity_t*)pVeh->m_pPilot, EV_NOAMMO, weaponNum ); + break; + } + } + } + return; + } + delay = pVeh->m_pVehicleInfo->weapon[weaponNum].delay; aimCorrect = pVeh->m_pVehicleInfo->weapon[weaponNum].aimCorrect; - if ( pVeh->m_pVehicleInfo->weapon[weaponNum].linkable == 1//optionally linkable - && pVeh->weaponStatus[weaponNum].linked )//linked + if ( pVeh->m_pVehicleInfo->weapon[weaponNum].linkable == 2//always linked + || ( pVeh->m_pVehicleInfo->weapon[weaponNum].linkable == 1//optionally linkable + && pVeh->weaponStatus[weaponNum].linked ) )//linked {//we're linking the primary or alternate weapons, so we'll do *all* the muzzles linkedFiring = qtrue; } - + if ( vehWeaponIndex <= VEH_WEAPON_BASE || vehWeaponIndex >= MAX_VEH_WEAPONS ) {//invalid vehicle weapon return; } else { + int i, numMuzzles = 0, numMuzzlesReady = 0, cumulativeDelay = 0, cumulativeAmmo = 0; + qboolean sentAmmoWarning = qfalse; + vehWeaponInfo_t *vehWeapon = &g_vehWeaponInfo[vehWeaponIndex]; - int i, cumulativeDelay = 0; - + + if ( pVeh->m_pVehicleInfo->weapon[weaponNum].linkable == 2 ) + {//always linked weapons don't accumulate delay, just use specified delay + cumulativeDelay = delay; + } + //find out how many we've got for this weapon for ( i = 0; i < MAX_VEHICLE_MUZZLES; i++ ) { if ( pVeh->m_pVehicleInfo->weapMuzzle[i] != vehWeaponIndex ) {//this muzzle doesn't match the weapon we're trying to use continue; } - - // Fire this muzzle. if ( pVeh->m_iMuzzleTag[i] != -1 && pVeh->m_Muzzles[i].m_iMuzzleWait < level.time ) { - vec3_t start, dir; - // Prepare weapon delay. - if ( linkedFiring ) - {//linked firing, add the delay up for each muzzle, then apply to all of them at the end + numMuzzlesReady++; + } + if ( pVeh->m_pVehicleInfo->weapMuzzle[pVeh->weaponStatus[weaponNum].nextMuzzle] != vehWeaponIndex ) + {//Our designated next muzzle for this weapon isn't valid for this weapon (happens when ships fire for the first time) + //set the next to this one + pVeh->weaponStatus[weaponNum].nextMuzzle = i; + } + if ( linkedFiring ) + { + cumulativeAmmo += vehWeapon->iAmmoPerShot; + if ( pVeh->m_pVehicleInfo->weapon[weaponNum].linkable != 2 ) + {//always linked weapons don't accumulate delay, just use specified delay cumulativeDelay += delay; } - else - {//normal delay - NOTE: always-linked muzzles use normal delay, not cumulative - pVeh->m_Muzzles[i].m_iMuzzleWait = level.time + delay; + } + numMuzzles++; + } + + if ( linkedFiring ) + {//firing all muzzles at once + if ( numMuzzlesReady != numMuzzles ) + {//can't fire all linked muzzles yet + return; + } + else + {//can fire all linked muzzles, check ammo + if ( pVeh->weaponStatus[weaponNum].ammo < cumulativeAmmo ) + {//can't fire, not enough ammo + if ( pVeh->m_pPilot && pVeh->m_pPilot->s.number < MAX_CLIENTS ) + {// let the client know he's out of ammo + G_AddEvent( (gentity_t*)pVeh->m_pPilot, EV_NOAMMO, weaponNum ); + } + return; } + } + } + + for ( i = 0; i < MAX_VEHICLE_MUZZLES; i++ ) + { + if ( pVeh->m_pVehicleInfo->weapMuzzle[i] != vehWeaponIndex ) + {//this muzzle doesn't match the weapon we're trying to use + continue; + } + if ( !linkedFiring + && i != pVeh->weaponStatus[weaponNum].nextMuzzle ) + {//we're only firing one muzzle and this isn't it + continue; + } + + // Fire this muzzle. + if ( pVeh->m_iMuzzleTag[i] != -1 && pVeh->m_Muzzles[i].m_iMuzzleWait < level.time ) + { + vec3_t start, dir; if ( pVeh->weaponStatus[weaponNum].ammo < vehWeapon->iAmmoPerShot ) {//out of ammo! + if ( !sentAmmoWarning ) + { + sentAmmoWarning = qtrue; + if ( pVeh->m_pPilot && pVeh->m_pPilot->s.number < MAX_CLIENTS ) + {// let the client know he's out of ammo + G_AddEvent( (gentity_t*)pVeh->m_pPilot, EV_NOAMMO, weaponNum ); + } + } } else {//have enough ammo to shoot - //take the ammo - pVeh->weaponStatus[weaponNum].ammo -= vehWeapon->iAmmoPerShot; //do the firing - //FIXME: do we still need to calc the muzzle here in SP? //WP_CalcVehMuzzle(ent, i); VectorCopy( pVeh->m_Muzzles[i].m_vMuzzlePos, start ); VectorCopy( pVeh->m_Muzzles[i].m_vMuzzleDir, dir ); - if ( aimCorrect ) - {//auto-aim the missile at the crosshair + if ( WP_VehCheckTraceFromCamPos( ent, start, dir ) ) + {//auto-aim at whatever crosshair would be over from camera's point of view (if closer) + } + else if ( aimCorrect ) + {//auto-aim the missile at the crosshair if there's anything there trace_t trace; vec3_t end; - AngleVectors( pVeh->m_vOrientation, dir, NULL, NULL ); + vec3_t ang; + vec3_t fixedDir; + + if (pVeh->m_pVehicleInfo->type == VH_SPEEDER) + { + VectorSet(ang, 0.0f, pVeh->m_vOrientation[1], 0.0f); + } + else + { + VectorCopy(pVeh->m_vOrientation, ang); + } + AngleVectors( ang, fixedDir, NULL, NULL ); //VectorMA( ent->currentOrigin, 32768, dir, end ); VectorMA( ent->currentOrigin, 8192, dir, end ); gi.trace( &trace, ent->currentOrigin, vec3_origin, vec3_origin, end, ent->s.number, MASK_SHOT, (EG2_Collision)0, 0 ); - //if ( trace.fraction < 1.0f && !trace.allsolid && !trace.startsolid ) - //bah, always point at end of trace + if ( trace.fraction < 1.0f && !trace.allsolid && !trace.startsolid ) { - VectorSubtract( trace.endpos, start, dir ); - VectorNormalize( dir ); - } - - // Mounted lazer cannon auto aiming at enemy - //------------------------------------------- - if (ent->enemy) - { - Vehicle_t* enemyVeh = G_IsRidingVehicle(ent->enemy); - - // Don't Auto Aim At A Person Who Is Slide Breaking - if (!enemyVeh || !(enemyVeh->m_ulFlags&VEH_SLIDEBREAKING)) - { - vec3_t dir2; - VectorSubtract( ent->enemy->currentOrigin, start, dir2 ); - VectorNormalize( dir2 ); - if (DotProduct(dir, dir2)>0.95f) - { - VectorCopy(dir2, dir); - } - } + vec3_t newEnd; + VectorCopy( trace.endpos, newEnd ); + WP_VehLeadCrosshairVeh( &g_entities[trace.entityNum], newEnd, fixedDir, start, dir ); } } - + //play the weapon's muzzle effect if we have one if ( vehWeapon->iMuzzleFX ) { @@ -958,13 +1054,58 @@ void FireVehicleWeapon( gentity_t *ent, qboolean alt_fire ) } WP_FireVehicleWeapon( ent, start, dir, vehWeapon ); } - - if ( pVeh->weaponStatus[weaponNum].linked )//NOTE: we don't check linkedFiring here because that does *not* get set if the cannons are *always* linked + + if ( linkedFiring ) {//we're linking the weapon, so continue on and fire all appropriate muzzles continue; } - //ok, just break, we'll get in here again next frame and try the next muzzle... - break; + //else just firing one + //take the ammo, set the next muzzle and set the delay on it + if ( numMuzzles > 1 ) + {//more than one, look for it + int nextMuzzle = pVeh->weaponStatus[weaponNum].nextMuzzle; + while ( 1 ) + { + nextMuzzle++; + if ( nextMuzzle >= MAX_VEHICLE_MUZZLES ) + { + nextMuzzle = 0; + } + if ( nextMuzzle == pVeh->weaponStatus[weaponNum].nextMuzzle ) + {//WTF? Wrapped without finding another valid one! + break; + } + if ( pVeh->m_pVehicleInfo->weapMuzzle[nextMuzzle] == vehWeaponIndex ) + {//this is the next muzzle for this weapon + pVeh->weaponStatus[weaponNum].nextMuzzle = nextMuzzle; + break; + } + } + }//else, just stay on the one we just fired + //set the delay on the next muzzle + pVeh->m_Muzzles[pVeh->weaponStatus[weaponNum].nextMuzzle].m_iMuzzleWait = level.time + delay; + //take away the ammo + pVeh->weaponStatus[weaponNum].ammo -= vehWeapon->iAmmoPerShot; + //NOTE: in order to send the vehicle's ammo info to the client, we copy the ammo into the first 2 ammo slots on the vehicle NPC's client->ps.ammo array + if ( pVeh->m_pParentEntity && ((gentity_t*)(pVeh->m_pParentEntity))->client ) + { + ((gentity_t*)(pVeh->m_pParentEntity))->client->ps.ammo[weaponNum] = pVeh->weaponStatus[weaponNum].ammo; + } + //done! + //we'll get in here again next frame and try the next muzzle... + //return; + return; + } + } + //we went through all the muzzles, so apply the cumulative delay and ammo cost + if ( cumulativeAmmo ) + {//taking ammo one shot at a time + //take the ammo + pVeh->weaponStatus[weaponNum].ammo -= cumulativeAmmo; + //NOTE: in order to send the vehicle's ammo info to the client, we copy the ammo into the first 2 ammo slots on the vehicle NPC's client->ps.ammo array + if ( pVeh->m_pParentEntity && ((gentity_t*)(pVeh->m_pParentEntity))->client ) + { + ((gentity_t*)(pVeh->m_pParentEntity))->client->ps.ammo[weaponNum] = pVeh->weaponStatus[weaponNum].ammo; } } if ( cumulativeDelay ) diff --git a/code/game/g_weaponLoad.cpp b/code/game/g_weaponLoad.cpp index 1c74784138..4e88f83e0e 100644 --- a/code/game/g_weaponLoad.cpp +++ b/code/game/g_weaponLoad.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // g_weaponLoad.cpp // fills in memory struct with ext_dat\weapons.dat diff --git a/code/game/genericparser2.cpp b/code/game/genericparser2.cpp index 1c644d6106..019ee3f4f8 100644 --- a/code/game/genericparser2.cpp +++ b/code/game/genericparser2.cpp @@ -1,39 +1,33 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- genericparser2.cpp -// leave this at the top for PCH reasons... - #include "common_headers.h" #ifdef _JK2EXE #include "../qcommon/qcommon.h" #endif - - - - - -//#define _EXE - - #define MAX_TOKEN_SIZE 1024 static char token[MAX_TOKEN_SIZE]; diff --git a/code/game/genericparser2.h b/code/game/genericparser2.h index 59146c604b..df5cd05b0d 100644 --- a/code/game/genericparser2.h +++ b/code/game/genericparser2.h @@ -1,35 +1,34 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- genericparser2.h - #ifndef GENERICPARSER2_H #define GENERICPARSER2_H - // conditional expression is constant // conversion from int to char, possible loss of data // unreferenced inline funciton has been removed #ifdef _MSC_VER -#pragma warning( disable : 4127 4244 4514 ) - - #ifdef DEBUG_LINKING #pragma message("...including GenericParser2.h") #endif @@ -76,6 +75,7 @@ class CGPObject public: CGPObject(const char *initName); + virtual ~CGPObject() {} const char *GetName(void) { return mName; } diff --git a/code/game/ghoul2_shared.h b/code/game/ghoul2_shared.h index e35d1a7b6b..f658716447 100644 --- a/code/game/ghoul2_shared.h +++ b/code/game/ghoul2_shared.h @@ -1,43 +1,31 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #pragma once #if !defined(GHOUL2_SHARED_H_INC) #define GHOUL2_SHARED_H_INC -/* -Ghoul2 Insert Start -*/ -#ifdef _MSC_VER -#pragma warning (push, 3) //go back down to 3 for the stl include -#pragma warning (disable:4503) // decorated name length xceeded, name was truncated -#pragma warning(disable:4702) //unreachable code -#endif #include #include -#ifdef _MSC_VER -#pragma warning (pop) -#pragma warning (disable:4503) // decorated name length xceeded, name was truncated -#endif -using namespace std; -/* -Ghoul2 Insert End -*/ #define G2T_SV_TIME (0) #define G2T_CG_TIME (1) @@ -220,10 +208,10 @@ struct boltInfo_t{ #define MAX_GHOUL_COUNT_BITS 8 // bits required to send across the MAX_G2_MODELS inside of the networking - this is the only restriction on ghoul models possible per entity -typedef vector surfaceInfo_v; -typedef vector boneInfo_v; -typedef vector boltInfo_v; -typedef vector mdxaBone_v; +typedef std::vector surfaceInfo_v; +typedef std::vector boneInfo_v; +typedef std::vector boltInfo_v; +typedef std::vector mdxaBone_v; // defines for stuff to go into the mflags #define GHOUL2_NOCOLLIDE 0x001 @@ -338,8 +326,8 @@ class IGhoul2InfoArray virtual int New()=0; virtual void Delete(int handle)=0; virtual bool IsValid(int handle) const=0; - virtual vector &Get(int handle)=0; - virtual const vector &Get(int handle) const=0; + virtual std::vector &Get(int handle)=0; + virtual const std::vector &Get(int handle) const=0; }; #ifdef RENDERER @@ -380,12 +368,12 @@ class CGhoul2Info_v mItem=0; } } - vector &Array() + std::vector &Array() { assert(InfoArray().IsValid(mItem)); return InfoArray().Get(mItem); } - const vector &Array() const + const std::vector &Array() const { assert(InfoArray().IsValid(mItem)); return InfoArray().Get(mItem); diff --git a/code/game/hitlocs.h b/code/game/hitlocs.h index 40da9ea981..d3ea953cfe 100644 --- a/code/game/hitlocs.h +++ b/code/game/hitlocs.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef HITLOCS_H #define HITLOCS_H diff --git a/code/game/npc_headers.h b/code/game/npc_headers.h index a6dfcb8722..47077906cd 100644 --- a/code/game/npc_headers.h +++ b/code/game/npc_headers.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // PCH header file organiser for NPC_xxxx cpp files' most commonly used headers diff --git a/code/game/objectives.h b/code/game/objectives.h index f517d44391..1d9c432d61 100644 --- a/code/game/objectives.h +++ b/code/game/objectives.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __OBJECTIVES_H__ #define __OBJECTIVES_H__ diff --git a/code/game/say.h b/code/game/say.h index cf1201f70c..c42b8150be 100644 --- a/code/game/say.h +++ b/code/game/say.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __SAY_H__ #define __SAY_H__ diff --git a/code/game/statindex.h b/code/game/statindex.h index e467ab8c9e..91f6a2918c 100644 --- a/code/game/statindex.h +++ b/code/game/statindex.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename: statindex.h // diff --git a/code/game/surfaceflags.h b/code/game/surfaceflags.h index 417d23b099..786093a99a 100644 --- a/code/game/surfaceflags.h +++ b/code/game/surfaceflags.h @@ -1,23 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// Copyright (C) 1999-2000 Id Software, Inc. -// + // This file must be identical in the quake and utils directories // contents flags are seperate bits diff --git a/code/game/teams.h b/code/game/teams.h index d1ae1e9329..55e90bf53d 100644 --- a/code/game/teams.h +++ b/code/game/teams.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef TEAMS_H #define TEAMS_H diff --git a/code/game/w_local.h b/code/game/w_local.h index ed959e94bb..b5b3ed09ee 100644 --- a/code/game/w_local.h +++ b/code/game/w_local.h @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK extern vec3_t forwardVec, vrightVec, up; extern vec3_t muzzle; diff --git a/code/game/weapons.h b/code/game/weapons.h index 8120cdac48..3db596d301 100644 --- a/code/game/weapons.h +++ b/code/game/weapons.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- weapons.h // diff --git a/code/game/wp_atst.cpp b/code/game/wp_atst.cpp index 147464263a..2ec17bbbe4 100644 --- a/code/game/wp_atst.cpp +++ b/code/game/wp_atst.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_local.h" #include "b_local.h" diff --git a/code/game/wp_blaster_pistol.cpp b/code/game/wp_blaster_pistol.cpp index c28cff444e..9c9db70e15 100644 --- a/code/game/wp_blaster_pistol.cpp +++ b/code/game/wp_blaster_pistol.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_local.h" #include "b_local.h" diff --git a/code/game/wp_blaster_rifle.cpp b/code/game/wp_blaster_rifle.cpp index 28fdec722a..b33bf091d1 100644 --- a/code/game/wp_blaster_rifle.cpp +++ b/code/game/wp_blaster_rifle.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_local.h" #include "b_local.h" @@ -32,7 +36,7 @@ void WP_FireBlasterMissile( gentity_t *ent, vec3_t start, vec3_t dir, qboolean a //--------------------------------------------------------- { int velocity = BLASTER_VELOCITY; - int damage = altFire ? weaponData[WP_BLASTER].damage : weaponData[WP_BLASTER].damage; + int damage = altFire ? weaponData[WP_BLASTER].altDamage : weaponData[WP_BLASTER].damage; if ( ent && ent->client && ent->client->NPC_class == CLASS_VEHICLE ) { diff --git a/code/game/wp_bot_laser.cpp b/code/game/wp_bot_laser.cpp index 3897e70aaa..d37df25cba 100644 --- a/code/game/wp_bot_laser.cpp +++ b/code/game/wp_bot_laser.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_local.h" #include "w_local.h" diff --git a/code/game/wp_bowcaster.cpp b/code/game/wp_bowcaster.cpp index 953d6119c2..29b3e8e8c6 100644 --- a/code/game/wp_bowcaster.cpp +++ b/code/game/wp_bowcaster.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_local.h" #include "b_local.h" diff --git a/code/game/wp_concussion.cpp b/code/game/wp_concussion.cpp index 0598a3a48d..44a67cdacc 100644 --- a/code/game/wp_concussion.cpp +++ b/code/game/wp_concussion.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_local.h" #include "b_local.h" diff --git a/code/game/wp_demp2.cpp b/code/game/wp_demp2.cpp index 9dfc7fd668..5f776b476a 100644 --- a/code/game/wp_demp2.cpp +++ b/code/game/wp_demp2.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_local.h" #include "b_local.h" diff --git a/code/game/wp_det_pack.cpp b/code/game/wp_det_pack.cpp index 3a567d0ab6..12d25c2362 100644 --- a/code/game/wp_det_pack.cpp +++ b/code/game/wp_det_pack.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_local.h" #include "b_local.h" diff --git a/code/game/wp_disruptor.cpp b/code/game/wp_disruptor.cpp index a841893eb0..50154b940d 100644 --- a/code/game/wp_disruptor.cpp +++ b/code/game/wp_disruptor.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_local.h" #include "b_local.h" diff --git a/code/game/wp_emplaced_gun.cpp b/code/game/wp_emplaced_gun.cpp index 11c04ca630..3dea091eeb 100644 --- a/code/game/wp_emplaced_gun.cpp +++ b/code/game/wp_emplaced_gun.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_local.h" #include "b_local.h" diff --git a/code/game/wp_flechette.cpp b/code/game/wp_flechette.cpp index 5c1d45916f..26b68312b1 100644 --- a/code/game/wp_flechette.cpp +++ b/code/game/wp_flechette.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_local.h" #include "b_local.h" diff --git a/code/game/wp_melee.cpp b/code/game/wp_melee.cpp index b4876483f7..cca1ebcc74 100644 --- a/code/game/wp_melee.cpp +++ b/code/game/wp_melee.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_local.h" #include "b_local.h" diff --git a/code/game/wp_noghri_stick.cpp b/code/game/wp_noghri_stick.cpp index 7ee96790a4..64c8c2136d 100644 --- a/code/game/wp_noghri_stick.cpp +++ b/code/game/wp_noghri_stick.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_local.h" #include "b_local.h" diff --git a/code/game/wp_repeater.cpp b/code/game/wp_repeater.cpp index bc4bbc122c..da737c1ecf 100644 --- a/code/game/wp_repeater.cpp +++ b/code/game/wp_repeater.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_local.h" #include "b_local.h" diff --git a/code/game/wp_rocket_launcher.cpp b/code/game/wp_rocket_launcher.cpp index 516fc7b8a0..5ae52984f0 100644 --- a/code/game/wp_rocket_launcher.cpp +++ b/code/game/wp_rocket_launcher.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_local.h" #include "b_local.h" diff --git a/code/game/wp_saber.h b/code/game/wp_saber.h index e893fb7fd2..7b263c2b9d 100644 --- a/code/game/wp_saber.h +++ b/code/game/wp_saber.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __WP_SABER_H #define __WP_SABER_H diff --git a/code/game/wp_saberLoad.cpp b/code/game/wp_saberLoad.cpp index e8fc9a1e7d..9cc7dd5e62 100644 --- a/code/game/wp_saberLoad.cpp +++ b/code/game/wp_saberLoad.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //wp_saberLoad.cpp @@ -31,7 +35,7 @@ extern qboolean PM_SaberInAttack( int move ); extern stringID_table_t FPTable[]; -#define MAX_SABER_DATA_SIZE 0x80000 +#define MAX_SABER_DATA_SIZE (1024*1024) // 1mb, was 512kb char SaberParms[MAX_SABER_DATA_SIZE]; void Saber_SithSwordPrecache( void ) @@ -141,94 +145,63 @@ stringID_table_t SaberMoveTable[] = }; -saber_styles_t TranslateSaberStyle( const char *name ) -{ - if ( !Q_stricmp( name, "fast" ) ) - { - return SS_FAST; - } - if ( !Q_stricmp( name, "medium" ) ) - { - return SS_MEDIUM; - } - if ( !Q_stricmp( name, "strong" ) ) - { - return SS_STRONG; - } - if ( !Q_stricmp( name, "desann" ) ) - { - return SS_DESANN; - } - if ( !Q_stricmp( name, "tavion" ) ) - { - return SS_TAVION; - } - if ( !Q_stricmp( name, "dual" ) ) - { - return SS_DUAL; - } - if ( !Q_stricmp( name, "staff" ) ) - { - return SS_STAFF; - } +saber_styles_t TranslateSaberStyle( const char *name ) { + if ( !Q_stricmp( name, "fast" ) ) return SS_FAST; + if ( !Q_stricmp( name, "medium" ) ) return SS_MEDIUM; + if ( !Q_stricmp( name, "strong" ) ) return SS_STRONG; + if ( !Q_stricmp( name, "desann" ) ) return SS_DESANN; + if ( !Q_stricmp( name, "tavion" ) ) return SS_TAVION; + if ( !Q_stricmp( name, "dual" ) ) return SS_DUAL; + if ( !Q_stricmp( name, "staff" ) ) return SS_STAFF; + return SS_NONE; } -void WP_SaberFreeStrings( saberInfo_t &saber ) -{ - if (saber.name && gi.bIsFromZone(saber.name , TAG_G_ALLOC)) { - gi.Free (saber.name); - saber.name=0; +void WP_SaberFreeStrings( saberInfo_t &saber ) { + if ( saber.name && gi.bIsFromZone( saber.name, TAG_G_ALLOC ) ) { + gi.Free( saber.name ); + saber.name = NULL; } - if (saber.fullName && gi.bIsFromZone(saber.fullName , TAG_G_ALLOC)) { - gi.Free (saber.fullName); - saber.fullName=0; + if ( saber.fullName && gi.bIsFromZone( saber.fullName, TAG_G_ALLOC ) ) { + gi.Free( saber.fullName ); + saber.fullName = NULL; } - if (saber.model && gi.bIsFromZone(saber.model , TAG_G_ALLOC)) { - gi.Free (saber.model); - saber.model=0; + if ( saber.model && gi.bIsFromZone( saber.model, TAG_G_ALLOC ) ) { + gi.Free( saber.model ); + saber.model = NULL; } - if (saber.skin && gi.bIsFromZone(saber.skin , TAG_G_ALLOC)) { - gi.Free (saber.skin); - saber.skin=0; + if ( saber.skin && gi.bIsFromZone( saber.skin, TAG_G_ALLOC ) ) { + gi.Free( saber.skin ); + saber.skin = NULL; } - if (saber.brokenSaber1 && gi.bIsFromZone(saber.brokenSaber1 , TAG_G_ALLOC)) { - gi.Free (saber.brokenSaber1); - saber.brokenSaber1=0; + if ( saber.brokenSaber1 && gi.bIsFromZone( saber.brokenSaber1, TAG_G_ALLOC ) ) { + gi.Free( saber.brokenSaber1 ); + saber.brokenSaber1 = NULL; } - if (saber.brokenSaber2 && gi.bIsFromZone(saber.brokenSaber2 , TAG_G_ALLOC)) { - gi.Free (saber.brokenSaber2); - saber.brokenSaber2=0; + if ( saber.brokenSaber2 && gi.bIsFromZone( saber.brokenSaber2, TAG_G_ALLOC ) ) { + gi.Free( saber.brokenSaber2 ); + saber.brokenSaber2 = NULL; } } -qboolean WP_SaberBladeUseSecondBladeStyle( saberInfo_t *saber, int bladeNum ) -{ - if ( saber ) - { - if ( saber->bladeStyle2Start > 0 ) - { - if ( bladeNum >= saber->bladeStyle2Start ) - { - return qtrue; - } - } - } +qboolean WP_SaberBladeUseSecondBladeStyle( saberInfo_t *saber, int bladeNum ) { + if ( saber + && saber->bladeStyle2Start > 0 + && bladeNum >= saber->bladeStyle2Start ) + return qtrue; + return qfalse; } -qboolean WP_SaberBladeDoTransitionDamage( saberInfo_t *saber, int bladeNum ) -{ - if ( !WP_SaberBladeUseSecondBladeStyle( saber, bladeNum ) - && (saber->saberFlags2&SFL2_TRANSITION_DAMAGE) ) - {//use first blade style for this blade +qboolean WP_SaberBladeDoTransitionDamage( saberInfo_t *saber, int bladeNum ) { + //use first blade style for this blade + if ( !WP_SaberBladeUseSecondBladeStyle( saber, bladeNum ) && (saber->saberFlags2 & SFL2_TRANSITION_DAMAGE) ) return qtrue; - } - else if ( WP_SaberBladeUseSecondBladeStyle( saber, bladeNum ) - && (saber->saberFlags2&SFL2_TRANSITION_DAMAGE2) ) - {//use second blade style for this blade + + //use second blade style for this blade + else if ( WP_SaberBladeUseSecondBladeStyle( saber, bladeNum ) && (saber->saberFlags2 & SFL2_TRANSITION_DAMAGE2) ) return qtrue; - } + return qfalse; } diff --git a/code/game/wp_stun_baton.cpp b/code/game/wp_stun_baton.cpp index 043a17d3d5..8c2273d8e3 100644 --- a/code/game/wp_stun_baton.cpp +++ b/code/game/wp_stun_baton.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_local.h" #include "b_local.h" diff --git a/code/game/wp_thermal.cpp b/code/game/wp_thermal.cpp index 476b6b305c..e4cf9ac331 100644 --- a/code/game/wp_thermal.cpp +++ b/code/game/wp_thermal.cpp @@ -1,20 +1,25 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK + #include "g_local.h" #include "b_local.h" #include "g_functions.h" @@ -71,20 +76,20 @@ void thermal_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, in } //--------------------------------------------------------- -qboolean WP_LobFire( gentity_t *self, vec3_t start, vec3_t target, vec3_t mins, vec3_t maxs, int clipmask, +qboolean WP_LobFire( gentity_t *self, vec3_t start, vec3_t target, vec3_t mins, vec3_t maxs, int clipmask, vec3_t velocity, qboolean tracePath, int ignoreEntNum, int enemyNum, float minSpeed, float maxSpeed, float idealSpeed, qboolean mustHit ) //--------------------------------------------------------- { - float targetDist, shotSpeed, speedInc = 100, travelTime, impactDist, bestImpactDist = Q3_INFINITE;//fireSpeed, - vec3_t targetDir, shotVel, failCase; + float targetDist, shotSpeed, speedInc = 100, travelTime, impactDist, bestImpactDist = Q3_INFINITE;//fireSpeed, + vec3_t targetDir, shotVel, failCase = { 0.0f }; trace_t trace; trajectory_t tr; qboolean blocked; int elapsedTime, skipNum, timeStep = 500, hitCount = 0, maxHits = 7; vec3_t lastPos, testPos; gentity_t *traceEnt; - + if ( !idealSpeed ) { idealSpeed = 300; @@ -112,7 +117,7 @@ qboolean WP_LobFire( gentity_t *self, vec3_t start, vec3_t target, vec3_t mins, travelTime = targetDist/shotSpeed; shotVel[2] += travelTime * 0.5 * g_gravity->value; - if ( !hitCount ) + if ( !hitCount ) {//save the first (ideal) one as the failCase (fallback value) if ( !mustHit ) {//default is fine as a return value @@ -130,7 +135,7 @@ qboolean WP_LobFire( gentity_t *self, vec3_t start, vec3_t target, vec3_t mins, tr.trTime = level.time; travelTime *= 1000.0f; VectorCopy( start, lastPos ); - + //This may be kind of wasteful, especially on long throws... use larger steps? Divide the travelTime into a certain hard number of slices? Trace just to apex and down? for ( elapsedTime = timeStep; elapsedTime < floor(travelTime)+timeStep; elapsedTime += timeStep ) { @@ -210,6 +215,7 @@ qboolean WP_LobFire( gentity_t *self, vec3_t start, vec3_t target, vec3_t mins, if ( hitCount >= maxHits ) {//NOTE: worst case scenario, use the one that impacted closest to the target (or just use the first try...?) + assert( (failCase[0] + failCase[1] + failCase[2]) > 0.0f ); VectorCopy( failCase, velocity ); return qfalse; } @@ -231,7 +237,7 @@ void WP_ThermalThink( gentity_t *ent ) {//blow once creature is underground (done with anim) //FIXME: chance of being spit out? Especially if lots of delay left... ent->e_TouchFunc = touchF_NULL;//don't impact on anything - if ( !ent->activator + if ( !ent->activator || !ent->activator->client || !ent->activator->client->ps.legsAnimTimer ) {//either something happened to the sand creature or it's done with it's attack anim @@ -261,7 +267,7 @@ void WP_ThermalThink( gentity_t *ent ) blow = qfalse; break; } - else if ( ent_list[i]->client + else if ( ent_list[i]->client && ent_list[i]->client->NPC_class != CLASS_SAND_CREATURE//ignore sand creatures && ent_list[i]->health > 0 ) { @@ -301,7 +307,7 @@ gentity_t *WP_FireThermalDetonator( gentity_t *ent, qboolean alt_fire ) VectorCopy( muzzle, start ); bolt = G_Spawn(); - + bolt->classname = "thermal_detonator"; if ( ent->s.number != 0 ) @@ -338,7 +344,7 @@ gentity_t *WP_FireThermalDetonator( gentity_t *ent, qboolean alt_fire ) WP_TraceSetStart( ent, start, bolt->mins, bolt->maxs );//make sure our start point isn't on the other side of a wall float chargeAmount = 1.0f; // default of full charge - + if ( ent->client ) { chargeAmount = level.time - ent->client->ps.weaponChargeTime; @@ -381,7 +387,7 @@ gentity_t *WP_FireThermalDetonator( gentity_t *ent, qboolean alt_fire ) {//NPC or misc_weapon_shooter //FIXME: we're assuming he's actually facing this direction... vec3_t target; - + VectorCopy( ent->enemy->currentOrigin, target ); if ( target[2] <= start[2] ) { @@ -436,7 +442,7 @@ gentity_t *WP_FireThermalDetonator( gentity_t *ent, qboolean alt_fire ) bolt->s.pos.trTime = level.time; // move a bit on the very first frame VectorCopy( start, bolt->s.pos.trBase ); - + SnapVector( bolt->s.pos.trDelta ); // save net bandwidth VectorCopy (start, bolt->currentOrigin); diff --git a/code/game/wp_trip_mine.cpp b/code/game/wp_trip_mine.cpp index a4596fe072..c8ee389f40 100644 --- a/code/game/wp_trip_mine.cpp +++ b/code/game/wp_trip_mine.cpp @@ -1,20 +1,25 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK + #include "g_local.h" #include "b_local.h" #include "g_functions.h" diff --git a/code/game/wp_tusken.cpp b/code/game/wp_tusken.cpp index 30c50dd0e8..f4e75674f1 100644 --- a/code/game/wp_tusken.cpp +++ b/code/game/wp_tusken.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_local.h" #include "b_local.h" diff --git a/code/ghoul2/G2.h b/code/ghoul2/G2.h index 115a065594..38640f62e3 100644 --- a/code/ghoul2/G2.h +++ b/code/ghoul2/G2.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #pragma once #if !defined(G2_H_INC) @@ -26,7 +30,7 @@ class CMiniHeap; #define ENTITY_WIDTH 12 #define MODEL_WIDTH 10 #define BOLT_WIDTH 10 - + #define MODEL_AND ((1<. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __GHOUL2_GORE_H #define __GHOUL2_GORE_H @@ -73,7 +77,7 @@ class CGoreSet public: int mMyGoreSetTag; unsigned char mRefCount; - multimap mGoreRecords; // a map from surface index + std::multimap mGoreRecords; // a map from surface index CGoreSet(int tag) : mMyGoreSetTag(tag), mRefCount(0) {} ~CGoreSet(); }; @@ -84,11 +88,6 @@ void DeleteGoreSet(int goreSetTag); #endif // _G2_GORE -//rww - RAGDOLL_BEGIN -#ifdef _MSC_VER -#pragma warning(disable: 4512) -#endif - struct SRagDollEffectorCollision { vec3_t effectorPosition; diff --git a/code/icarus/BlockStream.cpp b/code/icarus/BlockStream.cpp index 92b48a481d..01bfbd8109 100644 --- a/code/icarus/BlockStream.cpp +++ b/code/icarus/BlockStream.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Interpreted Block Stream Functions // diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index da6e5cc416..082552232d 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // IcarusImplementation.cpp diff --git a/code/icarus/IcarusImplementation.h b/code/icarus/IcarusImplementation.h index 3bfaef2009..da4d6f5d7a 100644 --- a/code/icarus/IcarusImplementation.h +++ b/code/icarus/IcarusImplementation.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // IcarusImplementation.h #ifndef ICARUSIMPLEMENTATION_DEFINED @@ -24,22 +28,11 @@ This file is part of Jedi Academy. #include "IcarusInterface.h" #endif -#ifdef _MSC_VER -#pragma warning( disable : 4786 ) // identifier was truncated -#pragma warning (push, 3) // go back down to 3 for the stl include -#pragma warning (disable:4503) // decorated name length xceeded, name was truncated -#endif #include #include #include #include #include -#ifdef _MSC_VER -#pragma warning (pop) -#pragma warning (disable:4503) // decorated name length xceeded, name was truncated -#endif -using namespace std; - class CSequence; class CSequencer; @@ -67,15 +60,15 @@ class CIcarus : public IIcarusInterface int m_GUID; - typedef list< CSequence * > sequence_l; - typedef list< CSequencer * > sequencer_l; - typedef map < int, CSequencer* > sequencer_m; + typedef std::list< CSequence * > sequence_l; + typedef std::list< CSequencer * > sequencer_l; + typedef std::map < int, CSequencer* > sequencer_m; sequence_l m_sequences; sequencer_l m_sequencers; sequencer_m m_sequencerMap; - typedef map < string, unsigned char > signal_m; + typedef std::map < std::string, unsigned char > signal_m; signal_m m_signals; static double ICARUS_VERSION; diff --git a/code/icarus/IcarusInterface.h b/code/icarus/IcarusInterface.h index 98bcf5b2bd..ec7531a4a3 100644 --- a/code/icarus/IcarusInterface.h +++ b/code/icarus/IcarusInterface.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #pragma once #ifndef ICARUSINTERFACE_DEFINED diff --git a/code/icarus/Sequence.cpp b/code/icarus/Sequence.cpp index bf7c3fb765..3c6df5a72b 100644 --- a/code/icarus/Sequence.cpp +++ b/code/icarus/Sequence.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Script Command Sequences // diff --git a/code/icarus/Sequencer.cpp b/code/icarus/Sequencer.cpp index 30a00cba90..f641a916a2 100644 --- a/code/icarus/Sequencer.cpp +++ b/code/icarus/Sequencer.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Script Command Sequencer // @@ -229,7 +233,7 @@ Deletes parsing stream */ void CSequencer::DeleteStream( bstream_t *bstream ) { - vector::iterator finder = find(m_streamsCreated.begin(), m_streamsCreated.end(), bstream); + std::vector::iterator finder = std::find(m_streamsCreated.begin(), m_streamsCreated.end(), bstream); if(finder != m_streamsCreated.end()) { m_streamsCreated.erase(finder); @@ -2375,13 +2379,7 @@ int CSequencer::DestroySequence( CSequence *sequence, CIcarus* icarus ) { if((*tsi).second == sequence) { -#ifdef _WIN32 - tsi = m_taskSequences.erase(tsi); -#else - taskSequence_m::iterator itTemp = tsi; - tsi++; - m_taskSequences.erase(itTemp); -#endif + m_taskSequences.erase(tsi++); } else { diff --git a/code/icarus/StdAfx.h b/code/icarus/StdAfx.h index c83b6cf333..fef621d377 100644 --- a/code/icarus/StdAfx.h +++ b/code/icarus/StdAfx.h @@ -1,39 +1,33 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __ICR_STDAFX__ #define __ICR_STDAFX__ -#ifdef _MSC_VER -#pragma warning( disable : 4786 ) // identifier was truncated - -#pragma warning (push, 3) -#endif #include #include #include #include #include -#ifdef _MSC_VER -#pragma warning (pop) -#endif - -using namespace std; #define STL_ITERATE( a, b ) for ( a = b.begin(); a != b.end(); ++a ) #define STL_INSERT( a, b ) a.insert( a.end(), b ); diff --git a/code/icarus/TaskManager.cpp b/code/icarus/TaskManager.cpp index a42a2fc451..17d6b9a1ce 100644 --- a/code/icarus/TaskManager.cpp +++ b/code/icarus/TaskManager.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Task Manager // diff --git a/code/icarus/blockstream.h b/code/icarus/blockstream.h index 81233fb188..ca5b00260b 100644 --- a/code/icarus/blockstream.h +++ b/code/icarus/blockstream.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // BlockStream.h @@ -110,7 +114,7 @@ class CBlockMember class CBlock { - typedef vector< CBlockMember * > blockMember_v; + typedef std::vector< CBlockMember * > blockMember_v; public: diff --git a/code/icarus/sequence.h b/code/icarus/sequence.h index 5e42597438..9b6c950d48 100644 --- a/code/icarus/sequence.h +++ b/code/icarus/sequence.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Sequence Header File @@ -24,9 +28,9 @@ This file is part of Jedi Academy. class CSequence { - typedef list < CSequence * > sequence_l; + typedef std::list < CSequence * > sequence_l; // typedef map < int, CSequence *> sequenceID_m; - typedef list < CBlock * > block_l; + typedef std::list < CBlock * > block_l; public: diff --git a/code/icarus/sequencer.h b/code/icarus/sequencer.h index 23c56e1c86..573678b2ca 100644 --- a/code/icarus/sequencer.h +++ b/code/icarus/sequencer.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Sequencer Header File @@ -47,8 +51,8 @@ typedef struct bstream_s class CSequencer { //typedef map < int, CSequence * > sequenceID_m; - typedef list < CSequence * > sequence_l; - typedef map < CTaskGroup *, CSequence * > taskSequence_m; + typedef std::list < CSequence * > sequence_l; + typedef std::map < CTaskGroup *, CSequence * > taskSequence_m; public: enum @@ -171,7 +175,7 @@ class CSequencer int m_elseValid; CBlock *m_elseOwner; - vector m_streamsCreated; + std::vector m_streamsCreated; int m_id; }; diff --git a/code/icarus/taskmanager.h b/code/icarus/taskmanager.h index 9521a37dea..25f357aac7 100644 --- a/code/icarus/taskmanager.h +++ b/code/icarus/taskmanager.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Task Manager header file @@ -88,7 +92,7 @@ class CTaskGroup { public: - typedef map < int, bool > taskCallback_m; + typedef std::map < int, bool > taskCallback_m; CTaskGroup( void ); ~CTaskGroup( void ); @@ -134,11 +138,11 @@ class CSequencer; class CTaskManager { - typedef map < int, CTask * > taskID_m; - typedef map < string, CTaskGroup * > taskGroupName_m; - typedef map < int, CTaskGroup * > taskGroupID_m; - typedef vector < CTaskGroup * > taskGroup_v; - typedef list < CTask *> tasks_l; + typedef std::map < int, CTask * > taskID_m; + typedef std::map < std::string, CTaskGroup * > taskGroupName_m; + typedef std::map < int, CTaskGroup * > taskGroupID_m; + typedef std::vector < CTaskGroup * > taskGroup_v; + typedef std::list < CTask *> tasks_l; public: diff --git a/code/macosx/macosx_glimp.h b/code/macosx/macosx_glimp.h deleted file mode 100755 index 92b1ab9eb5..0000000000 --- a/code/macosx/macosx_glimp.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code is free software; you can redistribute it -and/or modify it under the terms of the GNU General Public License as -published by the Free Software Foundation; either version 2 of the License, -or (at your option) any later version. - -Quake III Arena source code is distributed in the hope that it will be -useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Foobar; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ -#include -#include -#include -#ifndef GL_EXT_abgr -#include -#endif - -// This can be defined to use the CGLMacro.h support which avoids looking up -// the current context. -//#define USE_CGLMACROS - -#ifdef USE_CGLMACROS -#include "macosx_local.h" -#define cgl_ctx glw_state._cgl_ctx -#include -#endif diff --git a/code/mp3code/cdct.c b/code/mp3code/cdct.c index 648cdfedeb..3217832c1f 100644 --- a/code/mp3code/cdct.c +++ b/code/mp3code/cdct.c @@ -40,10 +40,6 @@ portable C #include #include -#ifdef _MSC_VER -#pragma warning ( disable : 4711 ) // function 'xxxx' selected for automatic inline expansion -#endif - float coef32[31]; /* 32 pt dct coefs */ // !!!!!!!!!!!!!!!!!! (only generated once (always to same value) /*------------------------------------------------------------*/ diff --git a/code/mp3code/config.h b/code/mp3code/config.h index 50f7fc8723..3d09c5a2ce 100644 --- a/code/mp3code/config.h +++ b/code/mp3code/config.h @@ -48,8 +48,6 @@ ____________________________________________________________________________*/ #define __PDP_ENDIAN 3412 #define __BYTE_ORDER __LITTLE_ENDIAN #define usleep(x) ::Sleep(x/1000) -#define strcasecmp(a,b) stricmp(a,b) -#define strncasecmp(a,b,c) strnicmp(a,b,c) typedef int socklen_t; #endif diff --git a/code/mp3code/csbtb.c b/code/mp3code/csbtb.c index fb2e549189..49bf927060 100644 --- a/code/mp3code/csbtb.c +++ b/code/mp3code/csbtb.c @@ -1,7 +1,4 @@ #ifdef COMPILE_ME -#ifdef _MSC_VER -#pragma warning(disable:4206) // nonstandard extension used : translation unit is empty -#endif /*____________________________________________________________________________ FreeAmp - The Free MP3 Player diff --git a/code/mp3code/csbtl3.c b/code/mp3code/csbtl3.c index d6bcf68ffe..e2ab834415 100644 --- a/code/mp3code/csbtl3.c +++ b/code/mp3code/csbtl3.c @@ -1,7 +1,4 @@ #ifdef COMPILE_ME -#ifdef _MSC_VER -#pragma warning(disable:4206) // nonstandard extension used : translation unit is empty -#endif /*____________________________________________________________________________ FreeAmp - The Free MP3 Player diff --git a/code/mp3code/cup.c b/code/mp3code/cup.c index f51de38fea..154817050a 100644 --- a/code/mp3code/cup.c +++ b/code/mp3code/cup.c @@ -99,14 +99,8 @@ IN_OUT structure returns: #include #include "mhead.h" /* mpeg header structure */ - -#ifdef _MSC_VER -#pragma warning(disable: 4709) -#endif - #include "mp3struct.h" - /*------------------------------------------------------- NOTE: Decoder may read up to three bytes beyond end of frame. Calling application must ensure that this does diff --git a/code/mp3code/cupini.c b/code/mp3code/cupini.c index 71b4b9fc67..f7a98f9920 100644 --- a/code/mp3code/cupini.c +++ b/code/mp3code/cupini.c @@ -1,7 +1,4 @@ #ifdef COMPILE_ME -#ifdef _MSC_VER -#pragma warning(disable:4206) // nonstandard extension used : translation unit is empty -#endif /*____________________________________________________________________________ FreeAmp - The Free MP3 Player @@ -43,13 +40,6 @@ mod 11/15/95 for Layer I =========================================================*/ -/*-- compiler bug, floating constant overflow w/ansi --*/ -#ifdef _MSC_VER -#pragma warning(disable:4056) -#endif - - - static const long steps[18] = { diff --git a/code/mp3code/cupl1.c b/code/mp3code/cupl1.c index 06226faa28..0b58838833 100644 --- a/code/mp3code/cupl1.c +++ b/code/mp3code/cupl1.c @@ -1,8 +1,4 @@ #ifdef COMPILE_ME -#ifdef _MSC_VER -#pragma warning(disable:4206) // nonstandard extension used : translation unit is empty -#pragma warning(disable:4711) // function 'xxxx' selected for automatic inline expansion -#endif /*____________________________________________________________________________ FreeAmp - The Free MP3 Player diff --git a/code/mp3code/cupl3.c b/code/mp3code/cupl3.c index 8651e25e81..d1f0ff23ac 100644 --- a/code/mp3code/cupl3.c +++ b/code/mp3code/cupl3.c @@ -59,6 +59,10 @@ TO DO: Test mixed blocks (mixed long/short) #include "mp3struct.h" +#if !defined(min) +# define min(a, b) ((a) < (b) ? (a) : (b)) +#endif + /*====================================================================*/ static const int mp_sr20_table[2][4] = {{441, 480, 320, -999}, {882, 960, 640, -999}}; diff --git a/code/mp3code/cwin.c b/code/mp3code/cwin.c index 5beaba78ad..f750507533 100644 --- a/code/mp3code/cwin.c +++ b/code/mp3code/cwin.c @@ -1,7 +1,4 @@ #ifdef COMPILE_ME -#ifdef _MSC_VER -#pragma warning(disable:4206) // nonstandard extension used : translation unit is empty -#endif /*____________________________________________________________________________ FreeAmp - The Free MP3 Player @@ -70,7 +67,7 @@ void window(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; } /*-- special case --*/ sum = 0.0F; @@ -84,7 +81,7 @@ void window(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; /*-- last 15 --*/ coef = wincoef + 255; /* back pass through coefs */ for (i = 0; i < 15; i++) @@ -104,7 +101,7 @@ void window(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; } } @@ -141,7 +138,7 @@ void window_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; } /*-- special case --*/ @@ -156,7 +153,7 @@ void window_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; /*-- last 15 --*/ coef = wincoef + 255; /* back pass through coefs */ @@ -177,7 +174,7 @@ void window_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; } } @@ -214,7 +211,7 @@ void window16(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; } /*-- special case --*/ sum = 0.0F; @@ -228,7 +225,7 @@ void window16(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; /*-- last 7 --*/ coef = wincoef + 255; /* back pass through coefs */ for (i = 0; i < 7; i++) @@ -249,7 +246,7 @@ void window16(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; } } /*--------------- 16 pt dual window (interleaved output) -----------------*/ @@ -284,7 +281,7 @@ void window16_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; } /*-- special case --*/ @@ -299,7 +296,7 @@ void window16_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; /*-- last 7 --*/ coef = wincoef + 255; /* back pass through coefs */ @@ -321,7 +318,7 @@ void window16_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; } } @@ -357,7 +354,7 @@ void window8(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; } /*-- special case --*/ sum = 0.0F; @@ -371,7 +368,7 @@ void window8(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; /*-- last 3 --*/ coef = wincoef + 255; /* back pass through coefs */ for (i = 0; i < 3; i++) @@ -392,7 +389,7 @@ void window8(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; } } /*--------------- 8 pt dual window (interleaved output) -----------------*/ @@ -427,7 +424,7 @@ void window8_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; } /*-- special case --*/ @@ -442,7 +439,7 @@ void window8_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; /*-- last 3 --*/ coef = wincoef + 255; /* back pass through coefs */ @@ -464,7 +461,7 @@ void window8_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; } } diff --git a/code/mp3code/cwinb.c b/code/mp3code/cwinb.c index 34392c121e..722e3a48e1 100644 --- a/code/mp3code/cwinb.c +++ b/code/mp3code/cwinb.c @@ -1,7 +1,4 @@ #ifdef COMPILE_ME -#ifdef _MSC_VER -#pragma warning(disable:4206) // nonstandard extension used : translation unit is empty -#endif /*____________________________________________________________________________ FreeAmp - The Free MP3 Player diff --git a/code/mp3code/cwinm.c b/code/mp3code/cwinm.c index 0446b4ec11..970cf4103d 100644 --- a/code/mp3code/cwinm.c +++ b/code/mp3code/cwinm.c @@ -37,12 +37,6 @@ portable C #include #include - -/* disable precision loss warning on type conversion */ -#ifdef _MSC_VER -#pragma warning(disable:4244 4056) -#endif - const float wincoef[264] = { /* window coefs */ #include "tableawd.h" diff --git a/code/mp3code/jdw.h b/code/mp3code/jdw.h index 16cab6c136..91edf04c75 100644 --- a/code/mp3code/jdw.h +++ b/code/mp3code/jdw.h @@ -20,9 +20,3 @@ $Id: jdw.h,v 1.2 1999/10/19 07:13:08 elrod Exp $ ____________________________________________________________________________*/ - -/* LOL */ - -#ifndef min -#define min(a,b) ((a>b)?b:a) -#endif diff --git a/code/mp3code/l3.h b/code/mp3code/l3.h index eb558ab419..992f2169b6 100644 --- a/code/mp3code/l3.h +++ b/code/mp3code/l3.h @@ -37,41 +37,15 @@ ____________________________________________________________________________*/ #include "config.h" +#include "qcommon/q_platform.h" + #define GLOBAL_GAIN_SCALE (4*15) /* #define GLOBAL_GAIN_SCALE 0 */ -#ifdef _WIN32 -#if (defined _M_IX86 || defined __i386__) -#define LITTLE_ENDIAN 1 -#endif - -#if (defined _M_X64 || defined _WIN64 || defined __WIN64__ || defined __x86_64__) -#define LITTLE_ENDIAN 1 -#endif - -#ifdef _M_ALPHA -#define LITTLE_ENDIAN 1 -#endif - -#ifdef sparc -#define LITTLE_ENDIAN 0 -#endif - -#if defined(__POWERPC__) -#define LITTLE_ENDIAN 0 -#elif defined(__INTEL__) -#define LITTLE_ENDIAN 1 -#endif -#endif - -#ifndef LITTLE_ENDIAN -#error Layer III LITTLE_ENDIAN must be defined 0 or 1 -#endif - /*-----------------------------------------------------------*/ /*---- huffman lookup tables ---*/ /* endian dependent !!! */ -#if LITTLE_ENDIAN +#ifdef Q3_LITTLE_ENDIAN typedef union { int ptr; diff --git a/code/mp3code/l3dq.c b/code/mp3code/l3dq.c index e9c558319e..3fc1035b63 100644 --- a/code/mp3code/l3dq.c +++ b/code/mp3code/l3dq.c @@ -111,10 +111,6 @@ float *quant_init_subblock_addr() } /*=============================================================*/ -#ifdef _MSC_VER -#pragma warning(disable: 4056) -#endif - void dequant(SAMPLE Sample[], int *nsamp, SCALEFACT * sf, GR * gr, @@ -255,8 +251,4 @@ block type = 2 short blocks return; } -#ifdef _MSC_VER -#pragma warning(default: 4056) -#endif - /*-------------------------------------------------------------*/ diff --git a/code/mp3code/l3init.c b/code/mp3code/l3init.c index 45fdc69b6b..beba463996 100644 --- a/code/mp3code/l3init.c +++ b/code/mp3code/l3init.c @@ -36,12 +36,6 @@ ____________________________________________________________________________*/ #include #include "l3.h" -/* get rid of precision loss warnings on conversion */ -#ifdef _MSC_VER -#pragma warning(disable:4244 4056) -#endif - - /*---------- quant ---------------------------------*/ /* 8 bit lookup x = pow(2.0, 0.25*(global_gain-210)) */ float *quant_init_global_addr(); @@ -257,7 +251,7 @@ void imdct_init() for (p = 0; p < n; p++) w[p] = (float) (2.0 * cos(t * (2 * p + 1))); for (p = 0; p < 9; p++) - w2[p] = (float) 2.0 *cos(2 * t * (2 * p + 1)); + w2[p] = (float) (2.0 *cos(2 * t * (2 * p + 1))); t = pi / (2 * n); for (k = 0; k < 9; k++) @@ -276,10 +270,10 @@ void imdct_init() pi = 4.0 * atan(1.0); t = pi / (4 * n); for (p = 0; p < n; p++) - v[p] = (float) 2.0 *cos(t * (2 * p + 1)); + v[p] = (float) (2.0 *cos(t * (2 * p + 1))); for (p = 0; p < 3; p++) - v2[p] = (float) 2.0 *cos(2 * t * (2 * p + 1)); + v2[p] = (float) (2.0 *cos(2 * t * (2 * p + 1))); t = pi / (2 * n); k = 1; @@ -288,7 +282,7 @@ void imdct_init() /* adjust scaling to save a few mults */ for (p = 0; p < 6; p++) v[p] = v[p] / 2.0f; - *coef87 = (float) 2.0 *(*coef87); + *coef87 = (float) (2.0 *(*coef87)); } } diff --git a/code/mp3code/mhead.h b/code/mp3code/mhead.h index b15b7cc852..c4e2adec92 100644 --- a/code/mp3code/mhead.h +++ b/code/mp3code/mhead.h @@ -96,9 +96,5 @@ extern "C" } #endif -#ifdef _MSC_VER -#pragma warning(disable:4711) // function 'xxxx' selected for automatic inline expansion -#endif - #endif // #ifndef MHEAD_H diff --git a/code/mp3code/mp3struct.h b/code/mp3code/mp3struct.h index 436b90a6e2..24ed6f2b8d 100644 --- a/code/mp3code/mp3struct.h +++ b/code/mp3code/mp3struct.h @@ -6,10 +6,6 @@ #ifndef MP3STRUCT_H #define MP3STRUCT_H -#ifdef _MSC_VER -#pragma warning (disable : 4201 ) // nonstandard extension used : nameless struct/union -#endif - #include "small_header.h" // for SAMPLE and IN_OUT typedef void (*SBT_FUNCTION) (float *sample, short *pcm, int n); @@ -135,11 +131,6 @@ typedef struct extern LP_MP3STREAM pMP3Stream; extern int bFastEstimateOnly; -#ifdef _MSC_VER -#pragma warning (default : 4201 ) // nonstandard extension used : nameless struct/union -#pragma warning (disable : 4711 ) // function 'xxxx' selected for automatic inline expansion -#endif - #endif // #ifndef MP3STRUCT_H ////////////////// eof ///////////////////// diff --git a/code/mp3code/uph.c b/code/mp3code/uph.c index 31c7558417..1dfbba3b27 100644 --- a/code/mp3code/uph.c +++ b/code/mp3code/uph.c @@ -38,13 +38,6 @@ Layer 3 audio #include "l3.h" -#ifdef _MSC_VER -#pragma warning ( disable : 4711 ) // function 'xxxx' selected for automatic inline expansion - - -#pragma warning(disable: 4505) -#endif - /*===============================================================*/ /* max bits required for any lookup - change if htable changes */ diff --git a/code/mp3code/wavep.c b/code/mp3code/wavep.c index adc98ad520..9184af6385 100644 --- a/code/mp3code/wavep.c +++ b/code/mp3code/wavep.c @@ -1,7 +1,4 @@ #if 0 -#ifdef _MSC_VER -#pragma warning(disable:4206) // nonstandard extension used : translation unit is empty -#endif /*____________________________________________________________________________ FreeAmp - The Free MP3 Player diff --git a/code/qcommon/MiniHeap.h b/code/qcommon/MiniHeap.h index ec586577d8..e2520196f1 100644 --- a/code/qcommon/MiniHeap.h +++ b/code/qcommon/MiniHeap.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #if !defined(MINIHEAP_H_INC) #define MINIHEAP_H_INC diff --git a/code/qcommon/chash.h b/code/qcommon/chash.h index c2102b4f58..5410c05672 100644 --- a/code/qcommon/chash.h +++ b/code/qcommon/chash.h @@ -2,9 +2,8 @@ This file is part of Jedi Academy. Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. Jedi Academy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/code/qcommon/cm_load.cpp b/code/qcommon/cm_load.cpp index 4bcfa26d22..c3aefd5496 100644 --- a/code/qcommon/cm_load.cpp +++ b/code/qcommon/cm_load.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cmodel.c -- model loading diff --git a/code/qcommon/cm_local.h b/code/qcommon/cm_local.h index 05237eb235..2d7ecfac96 100644 --- a/code/qcommon/cm_local.h +++ b/code/qcommon/cm_local.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "q_shared.h" #include "qcommon.h" diff --git a/code/qcommon/cm_patch.cpp b/code/qcommon/cm_patch.cpp index 8af2c38085..0c8e022f5e 100644 --- a/code/qcommon/cm_patch.cpp +++ b/code/qcommon/cm_patch.cpp @@ -1,21 +1,25 @@ - /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "cm_local.h" #include "cm_patch.h" @@ -197,7 +201,7 @@ static qboolean CM_NeedsSubdivision( vec3_t a, vec3_t b, vec3_t c ) { // see if the curve is far enough away from the linear mid VectorSubtract( cmid, lmid, delta ); dist = VectorLengthSquared( delta ); - + return dist >= SUBDIVIDE_DISTANCE * SUBDIVIDE_DISTANCE; } @@ -446,8 +450,8 @@ static patchPlane_t planes[MAX_PATCH_PLANES]; //static facet_t facets[MAX_FACETS]; // Switched to MAX_FACETS = VV_FIXME, allocate these only during use static facet_t *facets = NULL; -#define NORMAL_EPSILON 0.0001 -#define DIST_EPSILON 0.02 +#define NORMAL_EPSILON 0.00015 +#define DIST_EPSILON 0.0235 int CM_PlaneEqual(patchPlane_t *p, float plane[4], int *flipped) { float invplane[4]; @@ -811,7 +815,7 @@ static qboolean CM_ValidateFacet( facet_t *facet ) { // see if the facet is unreasonably large WindingBounds( w, bounds[0], bounds[1] ); FreeWinding( w ); - + for ( j = 0 ; j < 3 ; j++ ) { if ( bounds[1][j] - bounds[0][j] > MAX_MAP_BOUNDS ) { return qfalse; // we must be missing a plane @@ -1042,13 +1046,13 @@ static void CM_PatchCollideFromGrid( cGrid_t *grid, patchCollide_t *pf ) { // create the borders for each facet for ( i = 0 ; i < grid->width - 1 ; i++ ) { for ( j = 0 ; j < grid->height - 1 ; j++ ) { - + borders[EN_TOP] = -1; if ( j > 0 ) { borders[EN_TOP] = gridPlanes[i][j-1][1]; } else if ( grid->wrapHeight ) { borders[EN_TOP] = gridPlanes[i][grid->height-2][1]; - } + } noAdjust[EN_TOP] = ( borders[EN_TOP] == gridPlanes[i][j][0] ); if ( borders[EN_TOP] == -1 || noAdjust[EN_TOP] ) { borders[EN_TOP] = CM_EdgePlaneNum( grid, gridPlanes, i, j, 0 ); @@ -1169,7 +1173,7 @@ static void CM_PatchCollideFromGrid( cGrid_t *grid, patchCollide_t *pf ) { pf->facets = (facet_t *) Z_Malloc( numFacets * sizeof( *pf->facets ), TAG_BSP, qfalse); memcpy( pf->facets, facets, numFacets * sizeof( *pf->facets ) ); } - else + else { pf->facets = 0; } @@ -1546,7 +1550,7 @@ void CM_TraceThroughPatchCollide( traceWork_t *tw, const struct patchCollide_s * float offset, enterFrac, leaveFrac, t; patchPlane_t *planes; facet_t *facet; - float plane[4], bestplane[4]; + float plane[4] = { 0.0f }, bestplane[4] = { 0.0f }; vec3_t startp, endp; #ifndef BSPC static cvar_t *cv; diff --git a/code/qcommon/cm_patch.h b/code/qcommon/cm_patch.h index 2f87b80696..edef27597c 100644 --- a/code/qcommon/cm_patch.h +++ b/code/qcommon/cm_patch.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //#define CULL_BBOX diff --git a/code/qcommon/cm_polylib.cpp b/code/qcommon/cm_polylib.cpp index 40b5d224ba..d1f17ce117 100644 --- a/code/qcommon/cm_polylib.cpp +++ b/code/qcommon/cm_polylib.cpp @@ -1,27 +1,30 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // this is only used for visualization tools in cm_ debug functions - #include "cm_local.h" - // counters are only bumped when running single threaded, // because they are an awefull coherence problem int c_active_windings; diff --git a/code/qcommon/cm_polylib.h b/code/qcommon/cm_polylib.h index 86da153cdb..f489292f9e 100644 --- a/code/qcommon/cm_polylib.h +++ b/code/qcommon/cm_polylib.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // this is only used for visualization tools in cm_ debug functions diff --git a/code/qcommon/cm_public.h b/code/qcommon/cm_public.h index 738b56c1d7..efb97b53c1 100644 --- a/code/qcommon/cm_public.h +++ b/code/qcommon/cm_public.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __CM_PUBLIC_H__ #define __CM_PUBLIC_H__ diff --git a/code/qcommon/cm_test.cpp b/code/qcommon/cm_test.cpp index e2ad407f48..1da92a941b 100644 --- a/code/qcommon/cm_test.cpp +++ b/code/qcommon/cm_test.cpp @@ -1,23 +1,27 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "cm_local.h" -using namespace std; class CPoint { diff --git a/code/qcommon/cm_trace.cpp b/code/qcommon/cm_trace.cpp index a77b56fb03..d810d99b7f 100644 --- a/code/qcommon/cm_trace.cpp +++ b/code/qcommon/cm_trace.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "cm_local.h" diff --git a/code/qcommon/cmd.cpp b/code/qcommon/cmd.cpp index b8e4bb626a..6ebf4873b8 100644 --- a/code/qcommon/cmd.cpp +++ b/code/qcommon/cmd.cpp @@ -1,20 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + // cmd.c -- Quake script command processing module #include "q_shared.h" @@ -23,7 +30,7 @@ This file is part of Jedi Academy. #define MAX_CMD_BUFFER 128*1024 #define MAX_CMD_LINE 1024 -typedef struct { +typedef struct cmd_s { byte *data; int maxsize; int cursize; @@ -84,7 +91,7 @@ Adds command text at the end of the buffer, does NOT add a final \n */ void Cbuf_AddText( const char *text ) { int l; - + l = strlen (text); if (cmd_text.cursize + l >= cmd_text.maxsize) @@ -168,7 +175,7 @@ void Cbuf_Execute (void) { int i; char *text; - char line[MAX_CMD_BUFFER]; + char line[MAX_CMD_LINE]; int quotes; // This will keep // style comments all on one line by not breaking on @@ -179,7 +186,7 @@ void Cbuf_Execute (void) while (cmd_text.cursize) { - if ( cmd_wait > 0 ) { + if ( cmd_wait > 0 ) { // skip out while text still remains in buffer, leaving it // for next frame cmd_wait--; @@ -222,10 +229,10 @@ void Cbuf_Execute (void) if( i >= (MAX_CMD_LINE - 1)) { i = MAX_CMD_LINE - 1; } - + Com_Memcpy (line, text, i); line[i] = 0; - + // delete the text from the command buffer and move remaining commands down // this is necessary because commands (exec) can insert data at the // beginning of the text buffer @@ -285,7 +292,7 @@ void Cmd_Exec_f( void ) { } if (!quiet) Com_Printf ("execing %s\n", filename); - + Cbuf_InsertText (f.c); FS_FreeFile (f.v); @@ -573,7 +580,7 @@ static void Cmd_TokenizeString2( const char *text_in, qboolean ignoreQuotes ) { return; // all tokens parsed } } - + } /* @@ -601,7 +608,7 @@ Cmd_AddCommand */ void Cmd_AddCommand( const char *cmd_name, xcommand_t function ) { cmd_function_t *cmd; - + // fail if the command already exists if( Cmd_FindCommand( cmd_name ) ) { @@ -667,7 +674,7 @@ Cmd_CommandCompletion */ void Cmd_CommandCompletion( callbackFunc_t callback ) { cmd_function_t *cmd; - + for (cmd=cmd_functions ; cmd ; cmd=cmd->next) { callback( cmd->name ); } @@ -692,18 +699,17 @@ Cmd_ExecuteString A complete command line has been parsed, so try to execute it ============ */ -void Cmd_ExecuteString( const char *text ) { +void Cmd_ExecuteString( const char *text ) { cmd_function_t *cmd, **prev; // execute the command line - Cmd_TokenizeString( text ); + Cmd_TokenizeString( text ); if ( !Cmd_Argc() ) { return; // no tokens } - // check registered command functions - for ( prev = &cmd_functions ; *prev ; prev = &cmd->next ) - { + // check registered command functions + for ( prev = &cmd_functions ; *prev ; prev = &cmd->next ) { cmd = *prev; if ( !Q_stricmp( Cmd_Argv(0), cmd->name ) ) { // rearrange the links so that the command will be @@ -722,7 +728,7 @@ void Cmd_ExecuteString( const char *text ) { return; } } - + // check cvars if ( Cvar_Command() ) { return; @@ -755,25 +761,39 @@ Cmd_List_f */ void Cmd_List_f (void) { - cmd_function_t *cmd; - int i; - const char *match; + cmd_function_t *cmd = NULL; + int i, j; + char *match = NULL; if ( Cmd_Argc() > 1 ) { match = Cmd_Argv( 1 ); - } else { - match = NULL; } - i = 0; - for ( cmd=cmd_functions; cmd; cmd=cmd->next ) + for ( cmd=cmd_functions, i=0, j=0; + cmd; + cmd=cmd->next, i++ ) { - if (match && !Com_Filter(match, cmd->name, qfalse)) continue; + if ( !cmd->name || (match && !Com_Filter( match, cmd->name, qfalse )) ) + continue; + + Com_Printf (" %s\n", cmd->name); + j++; + } + + Com_Printf ("\n%i total commands\n", i); + if ( i != j ) + Com_Printf( "%i matching commands\n", j ); +} - Com_Printf ("%s\n", cmd->name); - i++; +/* +================== +Cmd_CompleteCfgName +================== +*/ +void Cmd_CompleteCfgName( char *args, int argNum ) { + if( argNum == 2 ) { + Field_CompleteFilename( "", "cfg", qfalse, qtrue ); } - Com_Printf ("%i commands\n", i); } /* @@ -781,16 +801,14 @@ void Cmd_List_f (void) Cmd_Init ============ */ -void Cmd_Init (void) -{ -// -// register our commands -// +void Cmd_Init (void) { Cmd_AddCommand ("cmdlist",Cmd_List_f); Cmd_AddCommand ("exec",Cmd_Exec_f); Cmd_AddCommand ("execq",Cmd_Exec_f); + Cmd_SetCommandCompletionFunc( "exec", Cmd_CompleteCfgName ); + Cmd_SetCommandCompletionFunc( "execq", Cmd_CompleteCfgName ); Cmd_AddCommand ("vstr",Cmd_Vstr_f); + Cmd_SetCommandCompletionFunc( "vstr", Cvar_CompleteCvarName ); Cmd_AddCommand ("echo",Cmd_Echo_f); Cmd_AddCommand ("wait", Cmd_Wait_f); } - diff --git a/code/qcommon/common.cpp b/code/qcommon/common.cpp index 86e570b35f..68aa2f36f9 100644 --- a/code/qcommon/common.cpp +++ b/code/qcommon/common.cpp @@ -1,41 +1,49 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // common.c -- misc functions used in client and server #include "q_shared.h" #include "qcommon.h" #include "sstring.h" // to get Gil's string class, because MS's doesn't compile properly in here +#include "stringed_ingame.h" #include "stv_version.h" +#if defined(_WIN32) +#define WIN32_LEAN_AND_MEAN +#include +#endif // Because renderer. #include "../rd-common/tr_public.h" extern refexport_t re; -#define MAXPRINTMSG 4096 - static fileHandle_t logfile; static fileHandle_t speedslog; static fileHandle_t camerafile; fileHandle_t com_journalFile; fileHandle_t com_journalDataFile; // config files are written here -cvar_t *com_viewlog; cvar_t *com_speeds; cvar_t *com_developer; cvar_t *com_timescale; @@ -53,12 +61,15 @@ cvar_t *sv_paused; cvar_t *com_skippingcin; cvar_t *com_speedslog; // 1 = buffer log, 2 = flush after each print cvar_t *com_homepath; +#ifndef _WIN32 +cvar_t *com_ansiColor = NULL; +#endif #ifdef G2_PERFORMANCE_ANALYSIS cvar_t *com_G2Report; #endif -static cvar_t *com_affinity; +cvar_t *com_affinity; // com_speeds times int time_game; @@ -141,9 +152,6 @@ void QDECL Com_Printf( const char *fmt, ... ) { CL_ConsolePrint( msg ); - // Strip out color codes because these aren't needed in the log/viewlog or in the output window --eez - Q_StripColor( msg ); - // echo to dedicated console and early console Sys_Print( msg ); @@ -239,7 +247,10 @@ do the apropriate things. ============= */ void SG_Shutdown(); -void QDECL Com_Error( int code, const char *fmt, ... ) { +#ifdef JK2_MODE +extern void SCR_UnprecacheScreenshot(); +#endif +void NORETURN QDECL Com_Error( int code, const char *fmt, ... ) { va_list argptr; static int lastErrorTime; static int errorCount; @@ -267,6 +278,10 @@ void QDECL Com_Error( int code, const char *fmt, ... ) { } lastErrorTime = currentTime; +#ifdef JK2_MODE + SCR_UnprecacheScreenshot(); +#endif + va_start (argptr,fmt); Q_vsnprintf (com_errorMessage, sizeof(com_errorMessage), fmt, argptr); va_end (argptr); @@ -298,7 +313,7 @@ Both client and server can use this, and it will do the apropriate things. ============= */ -void Com_Quit_f( void ) { +void NORETURN Com_Quit_f( void ) { // don't try to shutdown if we are in a recursive error if ( !com_errorEntered ) { SV_Shutdown ("Server quit\n"); @@ -846,7 +861,7 @@ int Com_EventLoop( void ) { switch ( ev.evType ) { default: - Com_Error( ERR_FATAL, "Com_EventLoop: bad event type %i", ev.evTime ); + Com_Error( ERR_FATAL, "Com_EventLoop: bad event type %i", ev.evType ); break; case SE_NONE: break; @@ -926,7 +941,7 @@ Just throw a fatal error to test error shutdown procedures ============= */ -static void Com_Error_f (void) { +static void NORETURN Com_Error_f (void) { if ( Cmd_Argc() > 1 ) { Com_Error( ERR_DROP, "Testing drop error" ); } else { @@ -970,8 +985,10 @@ Com_Crash_f A way to force a bus error for development reasons ================= */ -static void Com_Crash_f( void ) { +static void NORETURN Com_Crash_f( void ) { * ( volatile int * ) 0 = 0x12345678; + /* that should crash already, but to reassure the compiler: */ + abort(); } /* @@ -1044,37 +1061,6 @@ static void Com_CatchError ( int code ) } } -#ifdef _WIN32 -static const char *GetErrorString( DWORD error ) { - static char buf[MAX_STRING_CHARS]; - buf[0] = '\0'; - - if ( error ) { - LPVOID lpMsgBuf; - DWORD bufLen = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, error, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), (LPTSTR)&lpMsgBuf, 0, NULL ); - if ( bufLen ) { - LPCSTR lpMsgStr = (LPCSTR)lpMsgBuf; - Q_strncpyz( buf, lpMsgStr, min( (size_t)(lpMsgStr + bufLen), sizeof(buf) ) ); - LocalFree( lpMsgBuf ); - } - } - return buf; -} -#endif - -// based on Smod code -static void Com_SetProcessorAffinity( void ) { -#ifdef _WIN32 - DWORD processMask; - if ( sscanf( com_affinity->string, "%X", &processMask ) != 1 ) - processMask = 1; // set to first core only - - if ( !SetProcessAffinityMask( GetCurrentProcess(), processMask ) ) - Com_Printf( "Setting affinity mask failed (%s)\n", GetErrorString( GetLastError() ) ); -#endif -} - /* ================= Com_Init @@ -1138,7 +1124,6 @@ void Com_Init( char *commandLine ) { com_timescale = Cvar_Get ("timescale", "1", CVAR_CHEAT ); com_fixedtime = Cvar_Get ("fixedtime", "0", CVAR_CHEAT); com_showtrace = Cvar_Get ("com_showtrace", "0", CVAR_CHEAT); - com_viewlog = Cvar_Get( "viewlog", "0", CVAR_TEMP ); com_speeds = Cvar_Get ("com_speeds", "0", 0); #ifdef G2_PERFORMANCE_ANALYSIS @@ -1175,15 +1160,13 @@ void Com_Init( char *commandLine ) { Sys_Init(); // this also detects CPU type, so I can now do this CPU check below... - Com_SetProcessorAffinity(); + Sys_SetProcessorAffinity(); Netchan_Init( Com_Milliseconds() & 0xffff ); // pick a port value that should be nice and random // VM_Init(); SV_Init(); CL_Init(); - - Sys_ShowConsole( com_viewlog->integer, qfalse ); // set com_frameTime so that if a map is started on the // command line it will still be able to count on com_frameTime @@ -1360,9 +1343,6 @@ void G2Time_ResetTimers(void); void G2Time_ReportTimers(void); #endif -#ifdef _MSC_VER -#pragma warning (disable: 4701) //local may have been used without init (timing info vars) -#endif void Com_Frame( void ) { try { @@ -1373,12 +1353,6 @@ void Com_Frame( void ) { // write config file if anything changed Com_WriteConfiguration(); - // if "viewlog" has been modified, show or hide the log console - if ( com_viewlog->modified ) { - Sys_ShowConsole( com_viewlog->integer, qfalse ); - com_viewlog->modified = qfalse; - } - // // main event loop // @@ -1527,6 +1501,12 @@ void Com_Frame( void ) { c_pointcontents = 0; } + if ( com_affinity->modified ) + { + com_affinity->modified = qfalse; + Sys_SetProcessorAffinity(); + } + com_frameNumber++; } catch ( int code ) @@ -1546,10 +1526,6 @@ void Com_Frame( void ) { #endif } -#ifdef _MSC_VER -#pragma warning (default: 4701) //local may have been used without init -#endif - /* ================= Com_Shutdown @@ -1595,7 +1571,7 @@ Field_Clear ================== */ void Field_Clear( field_t *edit ) { - edit->buffer[0] = 0; + memset(edit->buffer, 0, MAX_EDIT_LINE); edit->cursor = 0; edit->scroll = 0; } @@ -1653,7 +1629,7 @@ PrintMatches */ static void PrintMatches( const char *s ) { if ( !Q_stricmpn( s, shortestMatch, strlen( shortestMatch ) ) ) { - Com_Printf( S_COLOR_GREY"Cmd "S_COLOR_WHITE"%s\n", s ); + Com_Printf( S_COLOR_GREY "Cmd " S_COLOR_WHITE "%s\n", s ); } } @@ -1667,7 +1643,7 @@ PrintArgMatches // This is here for if ever commands with other argument completion static void PrintArgMatches( const char *s ) { if ( !Q_stricmpn( s, shortestMatch, strlen( shortestMatch ) ) ) { - Com_Printf( S_COLOR_WHITE" %s\n", s ); + Com_Printf( S_COLOR_WHITE " %s\n", s ); } } #endif @@ -1680,7 +1656,7 @@ PrintKeyMatches */ static void PrintKeyMatches( const char *s ) { if ( !Q_stricmpn( s, shortestMatch, strlen( shortestMatch ) ) ) { - Com_Printf( S_COLOR_GREY"Key "S_COLOR_WHITE"%s\n", s ); + Com_Printf( S_COLOR_GREY "Key " S_COLOR_WHITE "%s\n", s ); } } @@ -1692,7 +1668,7 @@ PrintFileMatches */ static void PrintFileMatches( const char *s ) { if ( !Q_stricmpn( s, shortestMatch, strlen( shortestMatch ) ) ) { - Com_Printf( S_COLOR_GREY"File "S_COLOR_WHITE"%s\n", s ); + Com_Printf( S_COLOR_GREY "File " S_COLOR_WHITE "%s\n", s ); } } @@ -1707,7 +1683,7 @@ static void PrintCvarMatches( const char *s ) { if ( !Q_stricmpn( s, shortestMatch, (int)strlen( shortestMatch ) ) ) { Com_TruncateLongString( value, Cvar_VariableString( s ) ); - Com_Printf( S_COLOR_GREY"Cvar "S_COLOR_WHITE"%s = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\""S_COLOR_WHITE"\n", s, value ); + Com_Printf( S_COLOR_GREY "Cvar " S_COLOR_WHITE "%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", s, value ); } } @@ -1862,3 +1838,45 @@ void Field_AutoComplete( field_t *field ) { Field_CompleteCommand( completionField->buffer, qtrue, qtrue ); } + + +/* +=============== +Converts a UTF-8 character to UTF-32. +=============== +*/ +uint32_t ConvertUTF8ToUTF32( char *utf8CurrentChar, char **utf8NextChar ) +{ + uint32_t utf32 = 0; + char *c = utf8CurrentChar; + + if( ( *c & 0x80 ) == 0 ) + utf32 = *c++; + else if( ( *c & 0xE0 ) == 0xC0 ) // 110x xxxx + { + utf32 |= ( *c++ & 0x1F ) << 6; + utf32 |= ( *c++ & 0x3F ); + } + else if( ( *c & 0xF0 ) == 0xE0 ) // 1110 xxxx + { + utf32 |= ( *c++ & 0x0F ) << 12; + utf32 |= ( *c++ & 0x3F ) << 6; + utf32 |= ( *c++ & 0x3F ); + } + else if( ( *c & 0xF8 ) == 0xF0 ) // 1111 0xxx + { + utf32 |= ( *c++ & 0x07 ) << 18; + utf32 |= ( *c++ & 0x3F ) << 12; + utf32 |= ( *c++ & 0x3F ) << 6; + utf32 |= ( *c++ & 0x3F ); + } + else + { + Com_DPrintf( "Unrecognised UTF-8 lead byte: 0x%x\n", (unsigned int)*c ); + c++; + } + + *utf8NextChar = c; + + return utf32; +} diff --git a/code/qcommon/cvar.cpp b/code/qcommon/cvar.cpp index b468fb08b2..db52984a13 100644 --- a/code/qcommon/cvar.cpp +++ b/code/qcommon/cvar.cpp @@ -1,20 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cvar.c -- dynamic variable tracking @@ -483,19 +489,19 @@ Prints the value, default, and latched string of the given variable ============ */ void Cvar_Print( cvar_t *v ) { - Com_Printf( S_COLOR_GREY"Cvar "S_COLOR_WHITE"%s = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\""S_COLOR_WHITE, v->name, v->string ); + Com_Printf( S_COLOR_GREY "Cvar " S_COLOR_WHITE "%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE, v->name, v->string ); if ( !(v->flags & CVAR_ROM) ) { if ( !Q_stricmp( v->string, v->resetString ) ) - Com_Printf( ", "S_COLOR_WHITE"the default" ); + Com_Printf( ", " S_COLOR_WHITE "the default" ); else - Com_Printf( ", "S_COLOR_WHITE"default = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\""S_COLOR_WHITE, v->resetString ); + Com_Printf( ", " S_COLOR_WHITE "default = " S_COLOR_GREY"\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE, v->resetString ); } Com_Printf( "\n" ); if ( v->latchedString ) - Com_Printf( " latched = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\"\n", v->latchedString ); + Com_Printf( " latched = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"\n", v->latchedString ); } /* @@ -963,9 +969,9 @@ void Cvar_List_f( void ) { if (var->flags & CVAR_CHEAT) Com_Printf( "C" ); else Com_Printf( " " ); if (var->flags & CVAR_USER_CREATED) Com_Printf( "?" ); else Com_Printf( " " ); - Com_Printf( S_COLOR_WHITE" %s = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\""S_COLOR_WHITE, var->name, var->string ); + Com_Printf( S_COLOR_WHITE " %s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE, var->name, var->string ); if ( var->latchedString ) - Com_Printf( ", latched = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\""S_COLOR_WHITE, var->latchedString ); + Com_Printf( ", latched = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE, var->latchedString ); Com_Printf( "\n" ); } @@ -1002,9 +1008,9 @@ void Cvar_ListModified_f( void ) { { char *value = (*itr)->latchedString ? (*itr)->latchedString : (*itr)->string; - Com_Printf( S_COLOR_GREY"Cvar " - S_COLOR_WHITE"%s = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\""S_COLOR_WHITE", " - S_COLOR_WHITE"default = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\""S_COLOR_WHITE"\n", + Com_Printf( S_COLOR_GREY "Cvar " + S_COLOR_WHITE "%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE ", " + S_COLOR_WHITE "default = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", (*itr)->name, value, (*itr)->resetString ); } } diff --git a/code/qcommon/files_pc.cpp b/code/qcommon/files.cpp similarity index 52% rename from code/qcommon/files_pc.cpp rename to code/qcommon/files.cpp index 095338a293..97d4db3fcb 100644 --- a/code/qcommon/files_pc.cpp +++ b/code/qcommon/files.cpp @@ -1,31 +1,306 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +/***************************************************************************** + * name: files.cpp + * + * desc: file code + * + *****************************************************************************/ + +#include "q_shared.h" +#include "qcommon.h" + +#ifndef FINAL_BUILD +#include "../client/client.h" +#endif +#include "minizip/unzip.h" + +// for rmdir +#if defined (_MSC_VER) + #include +#else + #include +#endif + +#if defined(_WIN32) +#include +#endif + +/* +============================================================================= + +QUAKE3 FILESYSTEM + +All of Quake's data access is through a hierarchical file system, but the contents of +the file system can be transparently merged from several sources. + +A "qpath" is a reference to game file data. MAX_ZPATH is 256 characters, which must include +a terminating zero. "..", "\\", and ":" are explicitly illegal in qpaths to prevent any +references outside the quake directory system. + +The "base path" is the path to the directory holding all the game directories and usually +the executable. It defaults to ".", but can be overridden with a "+set fs_basepath c:\quake3" +command line to allow code debugging in a different directory. Basepath cannot +be modified at all after startup. Any files that are created (demos, screenshots, +etc) will be created relative to the base path, so base path should usually be writable. + +The "home path" is the path used for all write access. On win32 systems we have "base path" +== "home path", but on *nix systems the base installation is usually readonly, and +"home path" points to ~/.q3a or similar + +The user can also install custom mods and content in "home path", so it should be searched +along with "home path" and "cd path" for game content. + + +The "base game" is the directory under the paths where data comes from by default, and +can be either "baseq3" or "demoq3". + +The "current game" may be the same as the base game, or it may be the name of another +directory under the paths that should be searched for files before looking in the base game. +This is the basis for addons. + +Clients automatically set the game directory after receiving a gamestate from a server, +so only servers need to worry about +set fs_game. + +No other directories outside of the base game and current game will ever be referenced by +filesystem functions. + +To save disk space and speed loading, directory trees can be collapsed into zip files. +The files use a ".pk3" extension to prevent users from unzipping them accidentally, but +otherwise the are simply normal uncompressed zip files. A game directory can have multiple +zip files of the form "pak0.pk3", "pak1.pk3", etc. Zip files are searched in decending order +from the highest number to the lowest, and will always take precedence over the filesystem. +This allows a pk3 distributed as a patch to override all existing data. + +Because we will have updated executables freely available online, there is no point to +trying to restrict demo / oem versions of the game with code changes. Demo / oem versions +should be exactly the same executables as release versions, but with different data that +automatically restricts where game media can come from to prevent add-ons from working. + +File search order: when FS_FOpenFileRead gets called it will go through the fs_searchpaths +structure and stop on the first successful hit. fs_searchpaths is built with successive +calls to FS_AddGameDirectory + +Additionaly, we search in several subdirectories: +current game is the current mode +base game is a variable to allow mods based on other mods +(such as baseq3 + missionpack content combination in a mod for instance) +BASEGAME is the hardcoded base game ("baseq3") - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +e.g. the qpath "sound/newstuff/test.wav" would be searched for in the following places: - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +home path + current game's zip files +home path + current game's directory +base path + current game's zip files +base path + current game's directory +cd path + current game's zip files +cd path + current game's directory + +home path + base game's zip file +home path + base game's directory +base path + base game's zip file +base path + base game's directory +cd path + base game's zip file +cd path + base game's directory + +home path + BASEGAME's zip file +home path + BASEGAME's directory +base path + BASEGAME's zip file +base path + BASEGAME's directory +cd path + BASEGAME's zip file +cd path + BASEGAME's directory + +server download, to be written to home path + current game's directory + + +The filesystem can be safely shutdown and reinitialized with different +basedir / cddir / game combinations, but all other subsystems that rely on it +(sound, video) must also be forced to restart. + +Because the same files are loaded by both the clip model (CM_) and renderer (TR_) +subsystems, a simple single-file caching scheme is used. The CM_ subsystems will +load the file with a request to cache. Only one file will be kept cached at a time, +so any models that are going to be referenced by both subsystems should alternate +between the CM_ load function and the ref load function. + +TODO: A qpath that starts with a leading slash will always refer to the base game, even if another +game is currently active. This allows character models, skins, and sounds to be downloaded +to a common directory no matter which game is active. + +How to prevent downloading zip files? +Pass pk3 file names in systeminfo, and download before FS_Restart()? + +Aborting a download disconnects the client from the server. + +How to mark files as downloadable? Commercial add-ons won't be downloadable. + +Non-commercial downloads will want to download the entire zip file. +the game would have to be reset to actually read the zip in + +Auto-update information + +Path separators + +Casing + + separate server gamedir and client gamedir, so if the user starts + a local game after having connected to a network game, it won't stick + with the network game. + + allow menu options for game selection? + +Read / write config to floppy option. + +Different version coexistance? + +When building a pak file, make sure a q3config.cfg isn't present in it, +or configs will never get loaded from disk! + + todo: + + downloading (outside fs?) + game directory passing and restarting + +============================================================================= - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . */ -// Copyright 2001-2013 Raven Software -#include "q_shared.h" -#include "qcommon.h" -#include "files.h" +/*static const uint32_t pak_checksums[] = { + 0u, +}; + +static const uint32_t bonuspak_checksum = 0u;*/ + +#define MAX_ZPATH 256 +#define MAX_SEARCH_PATHS 4096 +#define MAX_FILEHASH_SIZE 1024 + +typedef struct fileInPack_s { + char *name; // name of the file + unsigned long pos; // file info position in zip + unsigned long len; // uncompress file size + struct fileInPack_s* next; // next file in the hash +} fileInPack_t; + +typedef struct pack_s { + char pakPathname[MAX_OSPATH]; // c:\jediacademy\gamedata\base + char pakFilename[MAX_OSPATH]; // c:\jediacademy\gamedata\base\assets0.pk3 + char pakBasename[MAX_OSPATH]; // assets0 + char pakGamename[MAX_OSPATH]; // base + unzFile handle; // handle to zip file + int checksum; // regular checksum + int numfiles; // number of files in pk3 + int hashSize; // hash table size (power of 2) + fileInPack_t* *hashTable; // hash table + fileInPack_t* buildBuffer; // buffer with the filenames etc. +} pack_t; + +typedef struct directory_s { + char path[MAX_OSPATH]; // c:\jediacademy\gamedata + char fullpath[MAX_OSPATH]; // c:\jediacademy\gamedata\base + char gamedir[MAX_OSPATH]; // base +} directory_t; + +typedef struct searchpath_s { + struct searchpath_s *next; + + pack_t *pack; // only one of pack / dir will be non NULL + directory_t *dir; +} searchpath_t; + +static char fs_gamedir[MAX_OSPATH]; // this will be a single file name with no separators +static cvar_t *fs_debug; +static cvar_t *fs_homepath; + +#ifdef MACOS_X +// Also search the .app bundle for .pk3 files +static cvar_t *fs_apppath; +#endif + +static cvar_t *fs_basepath; +static cvar_t *fs_basegame; +static cvar_t *fs_cdpath; +static cvar_t *fs_copyfiles; +static cvar_t *fs_gamedirvar; +static cvar_t *fs_dirbeforepak; //rww - when building search path, keep directories at top and insert pk3's under them +static searchpath_t *fs_searchpaths; +static int fs_readCount; // total bytes read +static int fs_loadCount; // total files read +static int fs_packFiles = 0; // total number of files in packs + +typedef union qfile_gus { + FILE* o; + unzFile z; +} qfile_gut; + +typedef struct qfile_us { + qfile_gut file; + qboolean unique; +} qfile_ut; + +typedef struct fileHandleData_s { + qfile_ut handleFiles; + qboolean handleSync; + int fileSize; + int zipFilePos; + int zipFileLen; + qboolean zipFile; + char name[MAX_ZPATH]; +} fileHandleData_t; + +static fileHandleData_t fsh[MAX_FILE_HANDLES]; + +// last valid game folder used +char lastValidBase[MAX_OSPATH]; +char lastValidGame[MAX_OSPATH]; + +/* C99 defines __func__ */ +#if __STDC_VERSION__ < 199901L +# if __GNUC__ >= 2 || _MSC_VER >= 1300 +# define __func__ __FUNCTION__ +# else +# define __func__ "(unknown)" +# endif +#endif + +/* +============== +FS_Initialized +============== +*/ + +qboolean FS_Initialized( void ) { + return (qboolean)(fs_searchpaths != NULL); +} /* ================ return a hash value for the filename ================ */ -long FS_HashFileName( const char *fname, int hashSize ) { +static long FS_HashFileName( const char *fname, int hashSize ) { int i; long hash; char letter; @@ -36,7 +311,7 @@ long FS_HashFileName( const char *fname, int hashSize ) { letter = tolower(fname[i]); if (letter =='.') break; // don't include extension if (letter =='\\') letter = '/'; // damn path names - if (letter == PATH_SEP) letter = '/'; // damn path names //mac and unix are different + if (letter == PATH_SEP) letter = '/'; // damn path names hash+=(long)(letter)*(i+119); i++; } @@ -45,18 +320,34 @@ long FS_HashFileName( const char *fname, int hashSize ) { return hash; } +static fileHandle_t FS_HandleForFile(void) { + int i; + + for ( i = 1 ; i < MAX_FILE_HANDLES ; i++ ) { + if ( fsh[i].handleFiles.file.o == NULL ) { + return i; + } + } + + Com_Printf( "FS_HandleForFile: all handles taken:\n" ); + for ( i = 1 ; i < MAX_FILE_HANDLES ; i++ ) { + Com_Printf( "%d. %s\n", i, fsh[i].name); + } + Com_Error( ERR_DROP, "FS_HandleForFile: none free" ); + return 0; +} static FILE *FS_FileForHandle( fileHandle_t f ) { if ( f < 1 || f >= MAX_FILE_HANDLES ) { Com_Error( ERR_DROP, "FS_FileForHandle: out of range" ); } - if (fsh[f].zipFile == (int)qtrue) { + if (fsh[f].zipFile == qtrue) { Com_Error( ERR_DROP, "FS_FileForHandle: can't get FILE on zip file" ); } if ( ! fsh[f].handleFiles.file.o ) { Com_Error( ERR_DROP, "FS_FileForHandle: NULL" ); } - + return fsh[f].handleFiles.file.o; } @@ -67,7 +358,6 @@ void FS_ForceFlush( fileHandle_t f ) { setvbuf( file, NULL, _IONBF, 0 ); } - /* ================ FS_fplength @@ -103,13 +393,142 @@ int FS_filelength( fileHandle_t f ) { FILE *h; h = FS_FileForHandle(f); - + if(h == NULL) return EOF; else return FS_fplength(h); } +/* +==================== +FS_ReplaceSeparators + +Fix things up differently for win/unix/mac +==================== +*/ +void FS_ReplaceSeparators( char *path ) { + char *s; + qboolean lastCharWasSep = qfalse; + + for ( s = path ; *s ; s++ ) { + if ( *s == '/' || *s == '\\' ) { + if ( !lastCharWasSep ) { + *s = PATH_SEP; + lastCharWasSep = qtrue; + } else { + memmove (s, s + 1, strlen (s)); + } + } else { + lastCharWasSep = qfalse; + } + } +} + +/* +=================== +FS_BuildOSPath + +Qpath may have either forward or backwards slashes +=================== +*/ +char *FS_BuildOSPath( const char *qpath ) { + char temp[MAX_OSPATH]; + static char ospath[4][MAX_OSPATH]; + static int toggle; + + int nextToggle = (toggle + 1)&3; // allows four returns without clash (increased from 2 during fs_copyfiles 2 enhancement) + toggle = nextToggle; + + // Fix for filenames that are given to FS with a leading "/" (/botfiles/Foo) + if (qpath[0] == '\\' || qpath[0] == '/') + qpath++; + + Com_sprintf( temp, sizeof(temp), "/base/%s", qpath ); // FIXME SP used fs_gamedir here as well (not sure if this func is even used) + FS_ReplaceSeparators( temp ); + Com_sprintf( ospath[toggle], sizeof( ospath[0] ), "%s%s", fs_basepath->string, temp ); + + return ospath[toggle]; +} + +char *FS_BuildOSPath( const char *base, const char *game, const char *qpath ) { + char temp[MAX_OSPATH]; + static char ospath[4][MAX_OSPATH]; + static int toggle; + + int nextToggle = (toggle + 1)&3; // allows four returns without clash (increased from 2 during fs_copyfiles 2 enhancement) + toggle = nextToggle; + + if( !game || !game[0] ) { + game = fs_gamedir; + } + + Com_sprintf( temp, sizeof(temp), "/%s/%s", game, qpath ); + FS_ReplaceSeparators( temp ); + Com_sprintf( ospath[toggle], sizeof( ospath[0] ), "%s%s", base, temp ); + + return ospath[toggle]; +} + +/* +============ +FS_CreatePath + +Creates any directories needed to store the given filename +============ +*/ +qboolean FS_CreatePath (char *OSPath) { + char *ofs; + char path[MAX_OSPATH]; + + // make absolutely sure that it can't back up the path + // FIXME: is c: allowed??? + if ( strstr( OSPath, ".." ) || strstr( OSPath, "::" ) ) { + Com_Printf( "WARNING: refusing to create relative path \"%s\"\n", OSPath ); + return qtrue; + } + + Q_strncpyz( path, OSPath, sizeof( path ) ); + FS_ReplaceSeparators( path ); + + // Skip creation of the root directory as it will always be there + ofs = strchr( path, PATH_SEP ); + if ( ofs ) { + ofs++; + } + + for (; ofs != NULL && *ofs ; ofs++) { + if (*ofs == PATH_SEP) { + // create the directory + *ofs = 0; + if (!Sys_Mkdir (path)) { + Com_Error( ERR_FATAL, "FS_CreatePath: failed to create path \"%s\"", + path ); + } + *ofs = PATH_SEP; + } + } + return qfalse; +} + +/* +================= +FS_CheckFilenameIsMutable + +ERR_FATAL if trying to maniuplate a file with the platform library, or pk3 extension +================= +*/ +static void FS_CheckFilenameIsMutable( const char *filename, const char *function ) +{ + // Check if the filename ends with the library, or pk3 extension + if( COM_CompareExtension( filename, DLL_EXT ) + || COM_CompareExtension( filename, ".pk3" ) ) + { + Com_Error( ERR_FATAL, "%s: Not allowed to manipulate '%s' due " + "to %s extension", function, filename, COM_GetExtension( filename ) ); + } +} + /* ================= FS_CopyFile @@ -118,19 +537,20 @@ Copy a fully specified file from one place to another ================= */ // added extra param so behind-the-scenes copying in savegames doesn't clutter up the screen -slc -qboolean FS_CopyFile( char *fromOSPath, char *toOSPath, qboolean qbSilent = qfalse ); -qboolean FS_CopyFile( char *fromOSPath, char *toOSPath, qboolean qbSilent ) { +void FS_CopyFile( char *fromOSPath, char *toOSPath, qboolean qbSilent = qfalse ); +void FS_CopyFile( char *fromOSPath, char *toOSPath, qboolean qbSilent ) { FILE *f; int len; byte *buf; - if (!qbSilent) - { + FS_CheckFilenameIsMutable( fromOSPath, __func__ ); + + if ( !qbSilent ) Com_Printf( "copy %s to %s\n", fromOSPath, toOSPath ); - } + f = fopen( fromOSPath, "rb" ); if ( !f ) { - return qfalse; + return; } fseek (f, 0, SEEK_END); len = ftell (f); @@ -138,44 +558,405 @@ qboolean FS_CopyFile( char *fromOSPath, char *toOSPath, qboolean qbSilent ) { if ( len == EOF ) { - fclose(f); - if (qbSilent){ - return qfalse; - } + fclose( f ); + if ( qbSilent ) + return; Com_Error( ERR_FATAL, "Bad file length in FS_CopyFile()" ); } - - buf = (unsigned char *) Z_Malloc( len, TAG_FILESYS, qfalse); - if (fread( buf, 1, len, f ) != (size_t) len) + + // we are using direct malloc instead of Z_Malloc here, so it + // probably won't work on a mac... Its only for developers anyway... + buf = (unsigned char *)malloc( len ); + if (fread( buf, 1, len, f ) != (size_t)len) { - Z_Free( buf ); - fclose(f); - if (qbSilent){ - return qfalse; - } + fclose( f ); + free ( buf ); + if ( qbSilent ) + return; Com_Error( ERR_FATAL, "Short read in FS_Copyfiles()\n" ); } fclose( f ); - FS_CreatePath( toOSPath ); + if( FS_CreatePath( toOSPath ) ) { + free ( buf ); + return; + } + f = fopen( toOSPath, "wb" ); if ( !f ) { - Z_Free( buf ); - return qfalse; + free ( buf ); + return; } if (fwrite( buf, 1, len, f ) != (size_t)len) { - Z_Free( buf ); - fclose(f); - if (qbSilent){ - return qfalse; - } + fclose( f ); + free ( buf ); + if ( qbSilent ) + return; Com_Error( ERR_FATAL, "Short write in FS_Copyfiles()\n" ); } fclose( f ); - Z_Free( buf ); + free( buf ); +} + +/* +=========== +FS_Remove + +=========== +*/ +void FS_Remove( const char *osPath ) { + FS_CheckFilenameIsMutable( osPath, __func__ ); + + remove( osPath ); +} + +/* +=========== +FS_HomeRemove + +=========== +*/ +void FS_HomeRemove( const char *homePath ) { + FS_CheckFilenameIsMutable( homePath, __func__ ); - return qtrue; + remove( FS_BuildOSPath( fs_homepath->string, + fs_gamedir, homePath ) ); +} + +// The following functions with "UserGen" in them were added for savegame handling, +// since outside functions aren't supposed to know about full paths/dirs + +// "filename" is local to the current gamedir (eg "saves/blah.sav") +// +void FS_DeleteUserGenFile( const char *filename ) { + FS_HomeRemove( filename ); +} + +// filenames are local (eg "saves/blah.sav") +// +// return: qtrue = OK +// +qboolean FS_MoveUserGenFile( const char *filename_src, const char *filename_dst ) { + char *from_ospath, *to_ospath; + + if ( !fs_searchpaths ) { + Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); + } + + // don't let sound stutter + S_ClearSoundBuffer(); + + from_ospath = FS_BuildOSPath( fs_homepath->string, fs_gamedir, filename_src ); + to_ospath = FS_BuildOSPath( fs_homepath->string, fs_gamedir, filename_dst ); + + if ( fs_debug->integer ) { + Com_Printf( "FS_MoveUserGenFile: %s --> %s\n", from_ospath, to_ospath ); + } + + FS_CheckFilenameIsMutable( to_ospath, __func__ ); + + remove( to_ospath ); + return !rename( from_ospath, to_ospath ); +} + +/* +=========== +FS_Rmdir + +Removes a directory, optionally deleting all files under it +=========== +*/ +void FS_Rmdir( const char *osPath, qboolean recursive ) { + FS_CheckFilenameIsMutable( osPath, __func__ ); + + if ( recursive ) { + int numfiles; + int i; + char **filesToRemove = Sys_ListFiles( osPath, "", NULL, &numfiles, qfalse ); + for ( i = 0; i < numfiles; i++ ) { + char fileOsPath[MAX_OSPATH]; + Com_sprintf( fileOsPath, sizeof( fileOsPath ), "%s/%s", osPath, filesToRemove[i] ); + FS_Remove( fileOsPath ); + } + FS_FreeFileList( filesToRemove ); + + char **directoriesToRemove = Sys_ListFiles( osPath, "/", NULL, &numfiles, qfalse ); + for ( i = 0; i < numfiles; i++ ) { + if ( !Q_stricmp( directoriesToRemove[i], "." ) || !Q_stricmp( directoriesToRemove[i], ".." ) ) { + continue; + } + char directoryOsPath[MAX_OSPATH]; + Com_sprintf( directoryOsPath, sizeof( directoryOsPath ), "%s/%s", osPath, directoriesToRemove[i] ); + FS_Rmdir( directoryOsPath, qtrue ); + } + FS_FreeFileList( directoriesToRemove ); + } + + rmdir( osPath ); +} + +/* +=========== +FS_HomeRmdir + +Removes a directory, optionally deleting all files under it +=========== +*/ +void FS_HomeRmdir( const char *homePath, qboolean recursive ) { + FS_CheckFilenameIsMutable( homePath, __func__ ); + + FS_Rmdir( FS_BuildOSPath( fs_homepath->string, + fs_gamedir, homePath ), recursive ); +} + +/* +================ +FS_FileInPathExists + +Tests if path and file exists +================ +*/ +qboolean FS_FileInPathExists(const char *testpath) +{ + FILE *filep; + + filep = fopen(testpath, "rb"); + + if(filep) + { + fclose(filep); + return qtrue; + } + + return qfalse; +} + +/* +================ +FS_FileExists + +Tests if the file exists in the current gamedir, this DOES NOT +search the paths. This is to determine if opening a file to write +(which always goes into the current gamedir) will cause any overwrites. +NOTE TTimo: this goes with FS_FOpenFileWrite for opening the file afterwards +================ +*/ +qboolean FS_FileExists( const char *file ) +{ + return FS_FileInPathExists(FS_BuildOSPath(fs_homepath->string, fs_gamedir, file)); +} + +/* +================ +FS_SV_FileExists + +Tests if the file exists +================ +*/ +qboolean FS_SV_FileExists( const char *file ) +{ + char *testpath; + + testpath = FS_BuildOSPath( fs_homepath->string, file, ""); + testpath[strlen(testpath)-1] = '\0'; + + return FS_FileInPathExists(testpath); +} + +/* +=========== +FS_SV_FOpenFileWrite + +=========== +*/ +fileHandle_t FS_SV_FOpenFileWrite( const char *filename ) { + char *ospath; + fileHandle_t f; + + if ( !fs_searchpaths ) { + Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); + } + + ospath = FS_BuildOSPath( fs_homepath->string, filename, "" ); + ospath[strlen(ospath)-1] = '\0'; + + f = FS_HandleForFile(); + fsh[f].zipFile = qfalse; + + if ( fs_debug->integer ) { + Com_Printf( "FS_SV_FOpenFileWrite: %s\n", ospath ); + } + + FS_CheckFilenameIsMutable( ospath, __func__ ); + + if( FS_CreatePath( ospath ) ) { + return 0; + } + + Com_DPrintf( "writing to: %s\n", ospath ); + fsh[f].handleFiles.file.o = fopen( ospath, "wb" ); + + Q_strncpyz( fsh[f].name, filename, sizeof( fsh[f].name ) ); + + fsh[f].handleSync = qfalse; + if (!fsh[f].handleFiles.file.o) { + f = 0; + } + return f; +} + +/* +=========== +FS_SV_FOpenFileRead +search for a file somewhere below the home path, base path or cd path +we search in that order, matching FS_SV_FOpenFileRead order +=========== +*/ +int FS_SV_FOpenFileRead( const char *filename, fileHandle_t *fp ) { + char *ospath; + fileHandle_t f = 0; + + if ( !fs_searchpaths ) { + Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); + } + + f = FS_HandleForFile(); + fsh[f].zipFile = qfalse; + + Q_strncpyz( fsh[f].name, filename, sizeof( fsh[f].name ) ); + + // don't let sound stutter + S_ClearSoundBuffer(); + + // search homepath + ospath = FS_BuildOSPath( fs_homepath->string, filename, "" ); + // remove trailing slash + ospath[strlen(ospath)-1] = '\0'; + + if ( fs_debug->integer ) { + Com_Printf( "FS_SV_FOpenFileRead (fs_homepath): %s\n", ospath ); + } + + fsh[f].handleFiles.file.o = fopen( ospath, "rb" ); + fsh[f].handleSync = qfalse; + if (!fsh[f].handleFiles.file.o) + { + // NOTE TTimo on non *nix systems, fs_homepath == fs_basepath, might want to avoid + if (Q_stricmp(fs_homepath->string,fs_basepath->string)) + { + // search basepath + ospath = FS_BuildOSPath( fs_basepath->string, filename, "" ); + ospath[strlen(ospath)-1] = '\0'; + + if ( fs_debug->integer ) + { + Com_Printf( "FS_SV_FOpenFileRead (fs_basepath): %s\n", ospath ); + } + + fsh[f].handleFiles.file.o = fopen( ospath, "rb" ); + fsh[f].handleSync = qfalse; + } + + if ( !fsh[f].handleFiles.file.o ) + { + f = 0; + } + } + + if (!fsh[f].handleFiles.file.o) + { + // search cd path + ospath = FS_BuildOSPath( fs_cdpath->string, filename, "" ); + ospath[strlen(ospath)-1] = '\0'; + + if (fs_debug->integer) + { + Com_Printf( "FS_SV_FOpenFileRead (fs_cdpath) : %s\n", ospath ); + } + + fsh[f].handleFiles.file.o = fopen( ospath, "rb" ); + fsh[f].handleSync = qfalse; + + if ( !fsh[f].handleFiles.file.o ) + { + f = 0; + } + } + + *fp = f; + if (f) { + return FS_filelength(f); + } + return 0; +} + +/* +=========== +FS_SV_Rename + +=========== +*/ +void FS_SV_Rename( const char *from, const char *to, qboolean safe ) { + char *from_ospath, *to_ospath; + + if ( !fs_searchpaths ) { + Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); + } + + // don't let sound stutter + S_ClearSoundBuffer(); + + from_ospath = FS_BuildOSPath( fs_homepath->string, from, "" ); + to_ospath = FS_BuildOSPath( fs_homepath->string, to, "" ); + from_ospath[strlen(from_ospath)-1] = '\0'; + to_ospath[strlen(to_ospath)-1] = '\0'; + + if ( fs_debug->integer ) { + Com_Printf( "FS_SV_Rename: %s --> %s\n", from_ospath, to_ospath ); + } + + if ( safe ) { + FS_CheckFilenameIsMutable( to_ospath, __func__ ); + } + + if (rename( from_ospath, to_ospath )) { + // Failed, try copying it and deleting the original + FS_CopyFile ( from_ospath, to_ospath ); + FS_Remove ( from_ospath ); + } +} + +/* +=========== +FS_Rename + +=========== +*/ +void FS_Rename( const char *from, const char *to ) { + char *from_ospath, *to_ospath; + + if ( !fs_searchpaths ) { + Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); + } + + // don't let sound stutter + S_ClearSoundBuffer(); + + from_ospath = FS_BuildOSPath( fs_homepath->string, fs_gamedir, from ); + to_ospath = FS_BuildOSPath( fs_homepath->string, fs_gamedir, to ); + + if ( fs_debug->integer ) { + Com_Printf( "FS_Rename: %s --> %s\n", from_ospath, to_ospath ); + } + + FS_CheckFilenameIsMutable( to_ospath, __func__ ); + + if (rename( from_ospath, to_ospath )) { + // Failed, try copying it and deleting the original + FS_CopyFile ( from_ospath, to_ospath ); + FS_Remove ( from_ospath ); + } } /* @@ -184,7 +965,7 @@ FS_FCloseFile If the FILE pointer is an open pak file, leave it open. -For some reason, other dll's can't just call fclose() +For some reason, other dll's can't just cal fclose() on files returned by FS_FOpenFile... ============== */ @@ -198,137 +979,264 @@ void FS_FCloseFile( fileHandle_t f ) { if ( fsh[f].handleFiles.unique ) { unzClose( fsh[f].handleFiles.file.z ); } - memset( &fsh[f], 0, sizeof( fsh[f] ) ); + Com_Memset( &fsh[f], 0, sizeof( fsh[f] ) ); return; } // we didn't find it as a pak, so close it as a unique file - fclose (fsh[f].handleFiles.file.o); - memset( &fsh[f], 0, sizeof( fsh[f] ) ); + if (fsh[f].handleFiles.file.o) { + fclose (fsh[f].handleFiles.file.o); + } + Com_Memset( &fsh[f], 0, sizeof( fsh[f] ) ); } +/* +=========== +FS_FOpenFileWrite +=========== +*/ +fileHandle_t FS_FOpenFileWrite( const char *filename, qboolean safe ) { + char *ospath; + fileHandle_t f; + if ( !fs_searchpaths ) { + Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); + } -// The following functions with "UserGen" in them were added for savegame handling, -// since outside functions aren't supposed to know about full paths/dirs + f = FS_HandleForFile(); + fsh[f].zipFile = qfalse; -// "filename" is local to the current gamedir (eg "saves/blah.sav") -// -void FS_DeleteUserGenFile( const char *filename ) -{ - char *ospath; + ospath = FS_BuildOSPath( fs_homepath->string, fs_gamedir, filename ); - if ( !fs_searchpaths ) - { + if ( fs_debug->integer ) { + Com_Printf( "FS_FOpenFileWrite: %s\n", ospath ); + } + + if ( safe ) { + FS_CheckFilenameIsMutable( ospath, __func__ ); + } + + if( FS_CreatePath( ospath ) ) { + return 0; + } + + // enabling the following line causes a recursive function call loop + // when running with +set logfile 1 +set developer 1 + //Com_DPrintf( "writing to: %s\n", ospath ); + fsh[f].handleFiles.file.o = fopen( ospath, "wb" ); + + Q_strncpyz( fsh[f].name, filename, sizeof( fsh[f].name ) ); + + fsh[f].handleSync = qfalse; + if (!fsh[f].handleFiles.file.o) { + f = 0; + } + return f; +} + +/* +=========== +FS_FOpenFileAppend + +=========== +*/ +fileHandle_t FS_FOpenFileAppend( const char *filename ) { + char *ospath; + fileHandle_t f; + + if ( !fs_searchpaths ) { Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); } + f = FS_HandleForFile(); + fsh[f].zipFile = qfalse; + + Q_strncpyz( fsh[f].name, filename, sizeof( fsh[f].name ) ); + + // don't let sound stutter + S_ClearSoundBuffer(); + ospath = FS_BuildOSPath( fs_homepath->string, fs_gamedir, filename ); - if ( fs_debug->integer ) - { - Com_Printf( "FS_DeleteUserGenFile: %s\n", ospath ); + if ( fs_debug->integer ) { + Com_Printf( "FS_FOpenFileAppend: %s\n", ospath ); + } + + FS_CheckFilenameIsMutable( ospath, __func__ ); + + if( FS_CreatePath( ospath ) ) { + return 0; } - remove ( ospath ); + fsh[f].handleFiles.file.o = fopen( ospath, "ab" ); + fsh[f].handleSync = qfalse; + if (!fsh[f].handleFiles.file.o) { + f = 0; + } + return f; } -// filenames are local (eg "saves/blah.sav") -// -// return: qtrue = OK -// -qboolean FS_MoveUserGenFile( const char *filename_src, const char *filename_dst ) -{ - char *ospath_src, - *ospath_dst; +/* +=========== +FS_FilenameCompare + +Ignore case and separator char distinctions +=========== +*/ +qboolean FS_FilenameCompare( const char *s1, const char *s2 ) { + int c1, c2; + + do { + c1 = *s1++; + c2 = *s2++; + + if (c1 >= 'a' && c1 <= 'z') { + c1 -= ('a' - 'A'); + } + if (c2 >= 'a' && c2 <= 'z') { + c2 -= ('a' - 'A'); + } + + if ( c1 == '\\' || c1 == ':' ) { + c1 = '/'; + } + if ( c2 == '\\' || c2 == ':' ) { + c2 = '/'; + } + + if (c1 != c2) { + return qtrue; // strings not equal + } + } while (c1); + + return qfalse; // strings are equal +} + +/* +=========== +FS_IsExt + +Return qtrue if ext matches file extension filename +=========== +*/ - if ( !fs_searchpaths ) - { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } +qboolean FS_IsExt(const char *filename, const char *ext, int namelen) +{ + int extlen; - ospath_src = FS_BuildOSPath( fs_homepath->string, fs_gamedir, filename_src ); - ospath_dst = FS_BuildOSPath( fs_homepath->string, fs_gamedir, filename_dst ); + extlen = strlen(ext); - if ( fs_debug->integer ) - { - Com_Printf( "FS_MoveUserGenFile: %s to %s\n", ospath_src, ospath_dst ); - } + if(extlen > namelen) + return qfalse; -/* int iSlashes1=0; - int iSlashes2=0; - char *p; - for (p = strchr(filename_src,'/'); p; iSlashes1++) - { - p = strchr(p+1,'/'); - } - for (p = strchr(filename_dst,'/'); p; iSlashes2++) - { - p = strchr(p+1,'/'); - } + filename += namelen - extlen; - if (iSlashes1 != iSlashes2) - { - int ret = FS_CopyFile( ospath_src, ospath_dst, qtrue ); - remove(ospath_src); - return ret; - } - else -*/ - { - remove(ospath_dst); - return (0 == rename (ospath_src, ospath_dst )); - } + return (qboolean)!Q_stricmp(filename, ext); } /* =========== -FS_FOpenFileWrite +FS_IsDemoExt +Return qtrue if filename has a demo extension =========== */ -fileHandle_t FS_FOpenFileWrite( const char *filename ) { - char *ospath; - fileHandle_t f; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); +#define DEMO_EXTENSION "dm_" +qboolean FS_IsDemoExt(const char *filename, int namelen) +{ + const char *ext_test; + + ext_test = strrchr(filename, '.'); + if(ext_test && !Q_stricmpn(ext_test + 1, DEMO_EXTENSION, ARRAY_LEN(DEMO_EXTENSION) - 1)) + { + int protocol = atoi(ext_test + ARRAY_LEN(DEMO_EXTENSION)); + + if(protocol == PROTOCOL_VERSION) + return qtrue; } - f = FS_HandleForFile(); - fsh[f].zipFile = qfalse; + return qfalse; +} - ospath = FS_BuildOSPath( fs_homepath->string, fs_gamedir, filename ); +#ifdef _WIN32 - if ( fs_debug->integer ) { - Com_Printf( "FS_FOpenFileWrite: %s\n", ospath ); +bool Sys_GetFileTime(LPCSTR psFileName, FILETIME &ft) +{ + bool bSuccess = false; + HANDLE hFile = INVALID_HANDLE_VALUE; + + hFile = CreateFile( psFileName, // LPCTSTR lpFileName, // pointer to name of the file + GENERIC_READ, // DWORD dwDesiredAccess, // access (read-write) mode + FILE_SHARE_READ, // DWORD dwShareMode, // share mode + NULL, // LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes + OPEN_EXISTING, // DWORD dwCreationDisposition, // how to create + FILE_FLAG_NO_BUFFERING,// DWORD dwFlagsAndAttributes, // file attributes + NULL // HANDLE hTemplateFile // handle to file with attributes to + ); + + if (hFile != INVALID_HANDLE_VALUE) + { + if (GetFileTime(hFile, // handle to file + NULL, // LPFILETIME lpCreationTime + NULL, // LPFILETIME lpLastAccessTime + &ft // LPFILETIME lpLastWriteTime + ) + ) + { + bSuccess = true; + } + + CloseHandle(hFile); } - //Com_DPrintf( "writing to: %s\n", ospath ); - FS_CreatePath( ospath ); - fsh[f].handleFiles.file.o = fopen( ospath, "wb" ); + return bSuccess; +} - Q_strncpyz( fsh[f].name, filename, sizeof( fsh[f].name ) ); +bool Sys_FileOutOfDate( LPCSTR psFinalFileName /* dest */, LPCSTR psDataFileName /* src */ ) +{ + FILETIME ftFinalFile, ftDataFile; - fsh[f].handleSync = qfalse; - if (!fsh[f].handleFiles.file.o) { - f = 0; + if (Sys_GetFileTime(psFinalFileName, ftFinalFile) && Sys_GetFileTime(psDataFileName, ftDataFile)) + { + // timer res only accurate to within 2 seconds on FAT, so can't do exact compare... + // + //LONG l = CompareFileTime( &ftFinalFile, &ftDataFile ); + if ( (abs((double)(ftFinalFile.dwLowDateTime - ftDataFile.dwLowDateTime)) <= 20000000 ) && + ftFinalFile.dwHighDateTime == ftDataFile.dwHighDateTime + ) + { + return false; // file not out of date, ie use it. + } + return true; // flag return code to copy over a replacement version of this file } - return f; + + + // extra error check, report as suspicious if you find a file locally but not out on the net.,. + // + if (com_developer->integer) + { + if (!Sys_GetFileTime(psDataFileName, ftDataFile)) + { + Com_Printf( "Sys_FileOutOfDate: reading %s but it's not on the net!\n", psFinalFileName); + } + } + + return false; } -#ifdef _WIN32 -static bool FS_FileCacheable(const char* const filename) +#endif // _WIN32 + +bool FS_FileCacheable(const char* const filename) { extern cvar_t *com_buildScript; if (com_buildScript && com_buildScript->integer) - { + { return true; } return( strchr(filename, '/') != 0 ); } -#endif /* =========== @@ -340,16 +1248,19 @@ Used for streaming data out of either a separate file or a ZIP file. =========== */ -int FS_FOpenFileRead( const char *filename, fileHandle_t *file, qboolean uniqueFILE ) { +extern qboolean com_fullyInitialized; + +long FS_FOpenFileRead( const char *filename, fileHandle_t *file, qboolean uniqueFILE ) { searchpath_t *search; char *netpath; pack_t *pak; fileInPack_t *pakFile; directory_t *dir; - long hash=0; - unz_s *zfi; - void *temp; -// int i; + long hash; + //unz_s *zfi; + //void *temp; + + hash = 0; if ( !fs_searchpaths ) { Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); @@ -370,12 +1281,19 @@ int FS_FOpenFileRead( const char *filename, fileHandle_t *file, qboolean uniqueF // make absolutely sure that it can't back up the path. // The searchpaths do guarantee that something will always - // be prepended, so we don't need to worry about "c:" or "//limbo" + // be prepended, so we don't need to worry about "c:" or "//limbo" if ( strstr( filename, ".." ) || strstr( filename, "::" ) ) { *file = 0; return -1; } + // make sure the q3key file is only readable by the quake3.exe at initialization + // any other time the key should only be accessed in memory using the provided functions + if( com_fullyInitialized && strstr( filename, "q3key" ) ) { + *file = 0; + return -1; + } + // // search through the path, one element at a time // @@ -401,11 +1319,6 @@ int FS_FOpenFileRead( const char *filename, fileHandle_t *file, qboolean uniqueF } // is the element a pak file? if ( search->pack && search->pack->hashTable[hash] ) { - // disregard if it doesn't match one of the allowed pure pak files - /* if ( !FS_PakIsPure(search->pack) ) { - continue; - } - */ // look through all the pak file elements pak = search->pack; pakFile = pak->hashTable[hash]; @@ -413,60 +1326,55 @@ int FS_FOpenFileRead( const char *filename, fileHandle_t *file, qboolean uniqueF // case and separator insensitive comparisons if ( !FS_FilenameCompare( pakFile->name, filename ) ) { // found it! + if ( uniqueFILE ) { // open a new file on the pakfile fsh[*file].handleFiles.file.z = unzOpen (pak->pakFilename); if (fsh[*file].handleFiles.file.z == NULL) { - Com_Error (ERR_FATAL, "Couldn't reopen %s", pak->pakFilename); + Com_Error (ERR_FATAL, "Couldn't open %s", pak->pakFilename); } } else { fsh[*file].handleFiles.file.z = pak->handle; } Q_strncpyz( fsh[*file].name, filename, sizeof( fsh[*file].name ) ); fsh[*file].zipFile = qtrue; + + // set the file position in the zip file (also sets the current file info) + unzSetOffset(fsh[*file].handleFiles.file.z, pakFile->pos); + + // open the file in the zip + unzOpenCurrentFile(fsh[*file].handleFiles.file.z); + +#if 0 zfi = (unz_s *)fsh[*file].handleFiles.file.z; // in case the file was new temp = zfi->filestream; // set the file position in the zip file (also sets the current file info) unzSetOffset(pak->handle, pakFile->pos); // copy the file info into the unzip structure - memcpy( zfi, pak->handle, sizeof(unz_s)); + Com_Memcpy( zfi, pak->handle, sizeof(unz_s) ); // we copy this back into the structure zfi->filestream = temp; // open the file in the zip unzOpenCurrentFile( fsh[*file].handleFiles.file.z ); +#endif fsh[*file].zipFilePos = pakFile->pos; fsh[*file].zipFileLen = pakFile->len; if ( fs_debug->integer ) { - Com_Printf( "FS_FOpenFileRead: %s (found in '%s')\n", + Com_Printf( "FS_FOpenFileRead: %s (found in '%s')\n", filename, pak->pakFilename ); } - return zfi->cur_file_info.uncompressed_size; + return pakFile->len; } pakFile = pakFile->next; } while(pakFile != NULL); } else if ( search->dir ) { // check a file in the directory tree - // if we are running restricted, the only files we - // will allow to come from the directory are .cfg files - if ( 0/*fs_restrict->integer*/ /*|| fs_numServerPaks*/ ) { - int l; - - l = strlen( filename ); - - if ( Q_stricmp( filename + l - 4, ".cfg" ) // for config files - && Q_stricmp( filename + l - 4, ".sav" ) // for save games - && Q_stricmp( filename + l - 4, ".dat" ) ) { // for journal files - continue; - } - } - dir = search->dir; - - netpath = FS_BuildOSPath( dir->path, dir->gamedir, filename ); + netpath = FS_BuildOSPath( dir->path, dir->gamedir, filename ); fsh[*file].handleFiles.file.o = fopen (netpath, "rb"); if ( !fsh[*file].handleFiles.file.o ) { continue; @@ -477,7 +1385,7 @@ int FS_FOpenFileRead( const char *filename, fileHandle_t *file, qboolean uniqueF // if the time/date stamp != the network version (so it'll loop round again and use the network path, // which comes later in the search order) // - if ( fs_copyfiles->integer == 2 && fs_cdpath->string[0] && !Q_stricmp( dir->path, fs_basepath->string ) + if ( fs_copyfiles->integer == 2 && fs_cdpath->string[0] && !Q_stricmp( dir->path, fs_basepath->string ) && FS_FileCacheable(filename) ) { if ( Sys_FileOutOfDate( netpath, FS_BuildOSPath( fs_cdpath->string, dir->gamedir, filename ) )) @@ -488,22 +1396,20 @@ int FS_FOpenFileRead( const char *filename, fileHandle_t *file, qboolean uniqueF } } #endif - Q_strncpyz( fsh[*file].name, filename, sizeof( fsh[*file].name ) ); fsh[*file].zipFile = qfalse; if ( fs_debug->integer ) { - Com_Printf( "FS_FOpenFileRead: %s (found in '%s/%s')\n", filename, - dir->path, dir->gamedir ); + Com_Printf( "FS_FOpenFileRead: %s (found in '%s%c%s')\n", filename, + dir->path, PATH_SEP, dir->gamedir ); } #ifdef _WIN32 // if we are getting it from the cdpath, optionally copy it // to the basepath - if ( fs_copyfiles->integer && !stricmp( dir->path, fs_cdpath->string ) ) { + if ( fs_copyfiles->integer && !Q_stricmp( dir->path, fs_cdpath->string ) ) { char *copypath; copypath = FS_BuildOSPath( fs_basepath->string, dir->gamedir, filename ); - switch ( fs_copyfiles->integer ) { default: @@ -515,16 +1421,24 @@ int FS_FOpenFileRead( const char *filename, fileHandle_t *file, qboolean uniqueF case 2: { - + if (FS_FileCacheable(filename) ) { // maybe change this to Com_DPrintf? On the other hand... // - Com_Printf( S_COLOR_CYAN"fs_copyfiles(2), Copying: %s to %s\n", netpath, copypath ); - + Com_Printf( "fs_copyfiles(2), Copying: %s to %s\n", netpath, copypath ); + FS_CreatePath( copypath ); - if (Sys_CopyFile( netpath, copypath, qtrue )) + bool bOk = true; + if (CopyFile( netpath, copypath, qtrue )) + { + DWORD dwAttrs = GetFileAttributes(copypath); + SetFileAttributes(copypath, dwAttrs & ~FILE_ATTRIBUTE_READONLY); + bOk = !!CopyFile( netpath, copypath, FALSE ); + } + + if (bOk) { // clear this handle and setup for re-opening of the new local copy... // @@ -538,7 +1452,6 @@ int FS_FOpenFileRead( const char *filename, fileHandle_t *file, qboolean uniqueF } } #endif - if (bFasterToReOpenUsingNewLocalFile) { break; // and re-read the local copy, not the net version @@ -549,15 +1462,12 @@ int FS_FOpenFileRead( const char *filename, fileHandle_t *file, qboolean uniqueF } } while ( bFasterToReOpenUsingNewLocalFile ); - + Com_DPrintf ("Can't find %s\n", filename); - *file = 0; return -1; } - - /* ================= FS_Read @@ -578,10 +1488,6 @@ int FS_Read( void *buffer, int len, fileHandle_t f ) { if ( !f ) { return 0; } - if ( f <= 0 || f >= MAX_FILE_HANDLES ) - { - Com_Error( ERR_FATAL, "FS_Read: Invalid handle %d\n", f ); - } buf = (byte *)buffer; fs_readCount += len; @@ -615,7 +1521,6 @@ int FS_Read( void *buffer, int len, fileHandle_t f ) { } } - /* ================= FS_Write @@ -669,6 +1574,18 @@ int FS_Write( const void *buffer, int len, fileHandle_t h ) { return len; } +#define MAXPRINTMSG 4096 +void QDECL FS_Printf( fileHandle_t h, const char *fmt, ... ) { + va_list argptr; + char msg[MAXPRINTMSG]; + + va_start (argptr,fmt); + Q_vsnprintf (msg, sizeof(msg), fmt, argptr); + va_end (argptr); + + FS_Write(msg, strlen(msg), h); +} + #define PK3_SEEK_BUFFER_SIZE 65536 /* ================= @@ -795,7 +1712,7 @@ int FS_FileIsInPAK(const char *filename ) { // make absolutely sure that it can't back up the path. // The searchpaths do guarantee that something will always - // be prepended, so we don't need to worry about "c:" or "//limbo" + // be prepended, so we don't need to worry about "c:" or "//limbo" if ( strstr( filename, ".." ) || strstr( filename, "::" ) ) { return -1; } @@ -811,11 +1728,6 @@ int FS_FileIsInPAK(const char *filename ) { } // is the element a pak file? if ( search->pack && search->pack->hashTable[hash] ) { - // disregard if it doesn't match one of the allowed pure pak files -/* if ( !FS_PakIsPure(search->pack) ) { - continue; - } -*/ // look through all the pak file elements pak = search->pack; pakFile = pak->hashTable[hash]; @@ -839,11 +1751,10 @@ Filename are relative to the quake search path a null buffer will just return the file length without loading ============ */ -#include "../client/client.h" -int FS_ReadFile( const char *qpath, void **buffer ) { +long FS_ReadFile( const char *qpath, void **buffer ) { fileHandle_t h; byte* buf; - int len; + long len; if ( !fs_searchpaths ) { Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); @@ -856,6 +1767,8 @@ int FS_ReadFile( const char *qpath, void **buffer ) { // stop sounds from repeating S_ClearSoundBuffer(); + buf = NULL; // quiet compiler warning + // look for it in the filesystem or pack files len = FS_FOpenFileRead( qpath, &h, qfalse ); if ( h == 0 ) { @@ -864,7 +1777,7 @@ int FS_ReadFile( const char *qpath, void **buffer ) { } return -1; } - + if ( !buffer ) { FS_FCloseFile( h); return len; @@ -873,10 +1786,11 @@ int FS_ReadFile( const char *qpath, void **buffer ) { fs_loadCount++; buf = (byte*)Z_Malloc( len+1, TAG_FILESYS, qfalse); - *buffer = buf; + buf[len]='\0'; // because we're not calling Z_Malloc with optional trailing 'bZeroIt' bool + *buffer = buf; Z_Label(buf, qpath); - + // PRECACE CHECKER! #ifndef FINAL_BUILD if (com_sv_running && com_sv_running->integer && cls.state >= CA_ACTIVE) { //com_cl_running @@ -894,14 +1808,12 @@ int FS_ReadFile( const char *qpath, void **buffer ) { return len; } - /* ============= FS_FreeFile ============= */ void FS_FreeFile( void *buffer ) { - if ( !fs_searchpaths ) { Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); } @@ -912,6 +1824,35 @@ void FS_FreeFile( void *buffer ) { Z_Free( buffer ); } +/* +============ +FS_WriteFile + +Filename are reletive to the quake search path +============ +*/ +void FS_WriteFile( const char *qpath, const void *buffer, int size ) { + fileHandle_t f; + + if ( !fs_searchpaths ) { + Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); + } + + if ( !qpath || !buffer ) { + Com_Error( ERR_FATAL, "FS_WriteFile: NULL parameter" ); + } + + f = FS_FOpenFileWrite( qpath ); + if ( !f ) { + Com_Printf( "Failed to open %s\n", qpath ); + return; + } + + FS_Write( buffer, size, f ); + + FS_FCloseFile( f ); +} + /* ========================================================================== @@ -928,7 +1869,7 @@ Creates a new pak_t in the search chain for the contents of a zip file. ================= */ -static pack_t *FS_LoadZipFile( char *zipfile ) +static pack_t *FS_LoadZipFile( const char *zipfile, const char *basename ) { fileInPack_t *buildBuffer; pack_t *pack; @@ -952,8 +1893,6 @@ static pack_t *FS_LoadZipFile( char *zipfile ) if (err != UNZ_OK) return NULL; - fs_packFiles += gi.number_entry; - len = 0; unzGoToFirstFile(uf); for (i = 0; i < gi.number_entry; i++) @@ -966,9 +1905,9 @@ static pack_t *FS_LoadZipFile( char *zipfile ) unzGoToNextFile(uf); } - buildBuffer = (fileInPack_t *)Z_Malloc( gi.number_entry * sizeof( fileInPack_t ) + len , TAG_FILESYS, qtrue ); + buildBuffer = (struct fileInPack_s *)Z_Malloc( (gi.number_entry * sizeof( fileInPack_t )) + len, TAG_FILESYS, qtrue ); namePtr = ((char *) buildBuffer) + gi.number_entry * sizeof( fileInPack_t ); - fs_headerLongs = (int*)Z_Malloc( gi.number_entry * sizeof(int), TAG_FILESYS, qtrue ); + fs_headerLongs = (int *)Z_Malloc( gi.number_entry * sizeof(int), TAG_FILESYS, qtrue ); // get the hash table size from the number of files in the zip // because lots of custom pk3 files have less than 32 or 64 files @@ -978,7 +1917,7 @@ static pack_t *FS_LoadZipFile( char *zipfile ) } } - pack = (pack_t*)Z_Malloc( sizeof( pack_t ) + i * sizeof(fileInPack_t *), TAG_FILESYS, qtrue ); + pack = (pack_t *)Z_Malloc( sizeof( pack_t ) + i * sizeof(fileInPack_t *), TAG_FILESYS, qtrue ); pack->hashSize = i; pack->hashTable = (fileInPack_t **) (((char *) pack) + sizeof( pack_t )); for(int j = 0; j < pack->hashSize; j++) { @@ -986,6 +1925,12 @@ static pack_t *FS_LoadZipFile( char *zipfile ) } Q_strncpyz( pack->pakFilename, zipfile, sizeof( pack->pakFilename ) ); + Q_strncpyz( pack->pakBasename, basename, sizeof( pack->pakBasename ) ); + + // strip .pk3 if needed + if ( strlen( pack->pakBasename ) > 4 && !Q_stricmp( pack->pakBasename + strlen( pack->pakBasename ) - 4, ".pk3" ) ) { + pack->pakBasename[strlen( pack->pakBasename ) - 4] = 0; + } pack->handle = uf; pack->numfiles = gi.number_entry; @@ -1007,7 +1952,7 @@ static pack_t *FS_LoadZipFile( char *zipfile ) namePtr += strlen(filename_inzip) + 1; // store the file position in the zip buildBuffer[i].pos = unzGetOffset(uf); - // + buildBuffer[i].len = file_info.uncompressed_size; buildBuffer[i].next = pack->hashTable[hash]; pack->hashTable[hash] = &buildBuffer[i]; unzGoToNextFile(uf); @@ -1022,6 +1967,21 @@ static pack_t *FS_LoadZipFile( char *zipfile ) return pack; } +/* +================= +FS_FreePak + +Frees a pak structure and releases all associated resources +================= +*/ + +void FS_FreePak(pack_t *thepak) +{ + unzClose(thepak->handle); + Z_Free(thepak->buildBuffer); + Z_Free(thepak); +} + /* ================================================================================= @@ -1181,7 +2141,7 @@ char **FS_ListFilteredFiles( const char *path, const char *extension, char *filt nfiles = FS_AddFileToList( name, list, nfiles ); } Sys_FreeFileList( sysFiles ); - } + } } // return a copy of the list @@ -1214,33 +2174,31 @@ char **FS_ListFiles( const char *path, const char *extension, int *numfiles ) { FS_FreeFileList ================= */ -void FS_FreeFileList( char **filelist ) { +void FS_FreeFileList( char **fileList ) { + //rwwRMG - changed to fileList to not conflict with list type int i; if ( !fs_searchpaths ) { Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); } - if ( !filelist ) { + if ( !fileList ) { return; } - for ( i = 0 ; filelist[i] ; i++ ) { - Z_Free( filelist[i] ); + for ( i = 0 ; fileList[i] ; i++ ) { + Z_Free( fileList[i] ); } - Z_Free( filelist ); + Z_Free( fileList ); } + /* ================ FS_GetFileList - -Returns a uniqued list of files that match the given criteria -from all search paths ================ */ -int FS_GetModList( char *listbuf, int bufsize ); int FS_GetFileList( const char *path, const char *extension, char *listbuf, int bufsize ) { int nFiles, i, nTotal, nLen; char **pFiles = NULL; @@ -1273,23 +2231,21 @@ int FS_GetFileList( const char *path, const char *extension, char *listbuf, int return nFiles; } -// NOTE: could prolly turn out useful for the win32 version too, but it's used only by linux and Mac OS X -//#if defined(__linux__) || defined(MACOS_X) /* - ======================= - Sys_ConcatenateFileLists - - mkv: Naive implementation. Concatenates three lists into a - new list, and frees the old lists from the heap. - bk001129 - from cvs1.17 (mkv) - - FIXME TTimo those two should move to common.c next to Sys_ListFiles - ======================= +======================= +Sys_ConcatenateFileLists + +mkv: Naive implementation. Concatenates three lists into a + new list, and frees the old lists from the heap. +bk001129 - from cvs1.17 (mkv) + +FIXME TTimo those two should move to common.c next to Sys_ListFiles +======================= */ static unsigned int Sys_CountFileList(char **fileList) { int i = 0; - + if (fileList) { while (*fileList) @@ -1305,14 +2261,14 @@ static char** Sys_ConcatenateFileLists( char **list0, char **list1, char **list2 { int totalLength = 0; char** cat = NULL, **dst, **src; - + totalLength += Sys_CountFileList(list0); totalLength += Sys_CountFileList(list1); totalLength += Sys_CountFileList(list2); - + /* Create new list. */ dst = cat = (char **)Z_Malloc( ( totalLength + 1 ) * sizeof( char* ), TAG_FILESYS, qtrue ); - + /* Copy over lists. */ if (list0) { for (src = list0; *src; src++, dst++) @@ -1326,27 +2282,30 @@ static char** Sys_ConcatenateFileLists( char **list0, char **list1, char **list2 for (src = list2; *src; src++, dst++) *dst = *src; } - + // Terminate the list *dst = NULL; - + // Free our old lists. // NOTE: not freeing their content, it's been merged in dst and still being used if (list0) Z_Free( list0 ); if (list1) Z_Free( list1 ); if (list2) Z_Free( list2 ); - + return cat; } //#endif +// For base game mod listing +const char *SE_GetString( const char *psPackageAndStringReference ); + /* ================ FS_GetModList Returns a list of mod directory names A mod directory is a peer to base with a pk3 in it - +The directories are searched in base path, cd path and home path ================ */ int FS_GetModList( char *listbuf, int bufsize ) { @@ -1369,7 +2328,6 @@ int FS_GetModList( char *listbuf, int bufsize ) { pFiles0 = Sys_ListFiles( fs_homepath->string, NULL, NULL, &dummy, qtrue ); pFiles1 = Sys_ListFiles( fs_basepath->string, NULL, NULL, &dummy, qtrue ); pFiles2 = Sys_ListFiles( fs_cdpath->string, NULL, NULL, &dummy, qtrue ); - // we searched for mods in the three paths // it is likely that we have duplicate names now, which we will cleanup below pFiles = Sys_ConcatenateFileLists( pFiles0, pFiles1, pFiles2 ); @@ -1393,13 +2351,17 @@ int FS_GetModList( char *listbuf, int bufsize ) { if (bDrop) { continue; } - // we drop "base" "." and ".." - if (Q_stricmp(name, BASEGAME) && Q_stricmpn(name, ".", 1)) { - // ignore base + // we drop "." and ".." + if (Q_stricmpn(name, ".", 1)) { + // now we need to find some .pk3 files to validate the mod + // NOTE TTimo: (actually I'm not sure why .. what if it's a mod under developement with no .pk3?) + // we didn't keep the information when we merged the directory names, as to what OS Path it was found under + // so it could be in base path, cd path or home path + // we will try each three of them here (yes, it's a bit messy) path = FS_BuildOSPath( fs_basepath->string, name, "" ); nPaks = 0; pPaks = Sys_ListFiles(path, ".pk3", NULL, &nPaks, qfalse); - Sys_FreeFileList( pPaks );// we only use Sys_ListFiles to check wether .pk3 files are present + Sys_FreeFileList( pPaks ); // we only use Sys_ListFiles to check wether .pk3 files are present /* Try on cd path */ if( nPaks <= 0 ) { @@ -1419,29 +2381,35 @@ int FS_GetModList( char *listbuf, int bufsize ) { } if (nPaks > 0) { - nLen = strlen(name) + 1; + bool isBase = !Q_stricmp( name, BASEGAME ); + nLen = isBase ? 1 : strlen(name) + 1; // nLen is the length of the mod path // we need to see if there is a description available descPath[0] = '\0'; strcpy(descPath, name); strcat(descPath, "/description.txt"); - nDescLen = FS_SV_FOpenFileRead( descPath, &descHandle); + nDescLen = FS_SV_FOpenFileRead( descPath, &descHandle ); if ( nDescLen > 0 && descHandle) { FILE *file; file = FS_FileForHandle(descHandle); - memset( descPath, 0, sizeof( descPath ) ); + Com_Memset( descPath, 0, sizeof( descPath ) ); nDescLen = fread(descPath, 1, 48, file); if (nDescLen >= 0) { descPath[nDescLen] = '\0'; } FS_FCloseFile(descHandle); + } else if ( isBase ) { + strcpy(descPath, SE_GetString("MENUS_JEDI_ACADEMY")); } else { strcpy(descPath, name); } nDescLen = strlen(descPath) + 1; if (nTotal + nLen + 1 + nDescLen + 1 < bufsize) { - strcpy(listbuf, name); + if ( isBase ) + strcpy(listbuf, ""); + else + strcpy(listbuf, name); listbuf += nLen; strcpy(listbuf, descPath); listbuf += nDescLen; @@ -1467,8 +2435,8 @@ FS_Dir_f ================ */ void FS_Dir_f( void ) { - const char *path; - const char *extension; + char *path; + char *extension; char **dirnames; int ndirs; int i; @@ -1515,12 +2483,12 @@ void FS_ConvertPath( char *s ) { =========== FS_PathCmp -Ignore case and seprator char distinctions +Ignore case and separator char distinctions =========== */ int FS_PathCmp( const char *s1, const char *s2 ) { int c1, c2; - + do { c1 = *s1++; c2 = *s2++; @@ -1538,7 +2506,7 @@ int FS_PathCmp( const char *s1, const char *s2 ) { if ( c2 == '\\' || c2 == ':' ) { c2 = '/'; } - + if (c1 < c2) { return -1; // strings not equal } @@ -1546,7 +2514,7 @@ int FS_PathCmp( const char *s1, const char *s2 ) { return 1; } } while (c1); - + return 0; // strings are equal } @@ -1622,10 +2590,10 @@ void FS_Path_f( void ) { int i; Com_Printf ("Current search path:\n"); - for (s=fs_searchpaths ; s ; s=s->next) { + for (s = fs_searchpaths; s; s = s->next) { if (s->pack) { Com_Printf ("%s (%i files)\n", s->pack->pakFilename, s->pack->numfiles); - } else { + } else { Com_Printf ("%s%c%s\n", s->dir->path, PATH_SEP, s->dir->gamedir ); } } @@ -1643,27 +2611,20 @@ void FS_Path_f( void ) { FS_TouchFile_f The only purpose of this function is to allow game script files to copy -arbitrary files during an "fs_copyfiles 1" run. +arbitrary files furing an "fs_copyfiles 1" run. ============ */ void FS_TouchFile_f( void ) { fileHandle_t f; - int count = Cmd_Argc(); - if ( (count == 2) || (count == 3) ) { - FS_FOpenFileRead( Cmd_Argv( 1 ), &f, qfalse ); - if ( f ) { - FS_FCloseFile( f ); - } - if ( count == 3 ) { - FS_FOpenFileRead( Cmd_Argv( 2 ), &f, qfalse ); - if ( f ) { - FS_FCloseFile( f ); - } - } + if ( Cmd_Argc() != 2 ) { + Com_Printf( "Usage: touchFile \n" ); + return; } - else { - Com_Printf( "Usage: touchFile [file2] -- You gave %d args!\n", Cmd_Argc() ); + + FS_FOpenFileRead( Cmd_Argv( 1 ), &f, qfalse ); + if ( f ) { + FS_FCloseFile( f ); } } @@ -1690,7 +2651,7 @@ void FS_Which_f( void ) { // make absolutely sure that it can't back up the path. // The searchpaths do guarantee that something will always - // be prepended, so we don't need to worry about "c:" or "//limbo" + // be prepended, so we don't need to worry about "c:" or "//limbo" if ( strstr( filename, ".." ) || strstr( filename, "::" ) ) { return; } @@ -1740,8 +2701,6 @@ void FS_Which_f( void ) { //=========================================================================== - - static int QDECL paksort( const void *a, const void *b ) { char *aa, *bb; @@ -1751,7 +2710,6 @@ static int QDECL paksort( const void *a, const void *b ) { return FS_PathCmp( aa, bb ); } - /* ================ FS_AddGameDirectory @@ -1767,7 +2725,7 @@ static void FS_AddGameDirectory( const char *path, const char *dir ) { searchpath_t *search; searchpath_t *thedir; pack_t *pak; - char *pakfile; + char curpath[MAX_OSPATH + 1], *pakfile; int numfiles; char **pakfiles; char *sorted[MAX_PAKFILES]; @@ -1775,6 +2733,8 @@ static void FS_AddGameDirectory( const char *path, const char *dir ) { // this fixes the case where fs_basepath is the same as fs_cdpath // which happens on full installs for ( sp = fs_searchpaths ; sp ; sp = sp->next ) { + // TODO Sys_PathCmp SDL-Port will contain this for SP as well + // Should be Sys_PathCmp(sp->dir->path, path) if ( sp->dir && !Q_stricmp(sp->dir->path, path) && !Q_stricmp(sp->dir->gamedir, dir)) { return; // we've already got this one } @@ -1782,30 +2742,28 @@ static void FS_AddGameDirectory( const char *path, const char *dir ) { Q_strncpyz( fs_gamedir, dir, sizeof( fs_gamedir ) ); + // find all pak files in this directory + Q_strncpyz(curpath, FS_BuildOSPath(path, dir, ""), sizeof(curpath)); + curpath[strlen(curpath) - 1] = '\0'; // strip the trailing slash + // // add the directory to the search path // - search = (searchpath_t *)Z_Malloc (sizeof(searchpath_t), TAG_FILESYS, qtrue ); - search->dir = (directory_t*)Z_Malloc( sizeof( *search->dir ), TAG_FILESYS, qtrue ); + search = (struct searchpath_s *)Z_Malloc (sizeof(searchpath_t), TAG_FILESYS, qtrue); + search->dir = (directory_t *)Z_Malloc( sizeof( *search->dir ), TAG_FILESYS, qtrue ); Q_strncpyz( search->dir->path, path, sizeof( search->dir->path ) ); + Q_strncpyz( search->dir->fullpath, curpath, sizeof( search->dir->fullpath ) ); Q_strncpyz( search->dir->gamedir, dir, sizeof( search->dir->gamedir ) ); search->next = fs_searchpaths; fs_searchpaths = search; - Z_Label(search, path); - Z_Label(search->dir, dir); - - // find all pak files in this directory - pakfile = FS_BuildOSPath( path, dir, "" ); - pakfile[ strlen(pakfile) - 1 ] = 0; // strip the trailing slash - thedir = search; - pakfiles = Sys_ListFiles( pakfile, ".pk3", NULL, &numfiles, qfalse ); + pakfiles = Sys_ListFiles( curpath, ".pk3", NULL, &numfiles, qfalse ); // sort them so that later alphabetic matches override - // earlier ones. This makes pak1.pk3 override asset0.pk3 + // earlier ones. This makes pak1.pk3 override pak0.pk3 if ( numfiles > MAX_PAKFILES ) { numfiles = MAX_PAKFILES; } @@ -1817,9 +2775,15 @@ static void FS_AddGameDirectory( const char *path, const char *dir ) { for ( i = 0 ; i < numfiles ; i++ ) { pakfile = FS_BuildOSPath( path, dir, sorted[i] ); - if ( ( pak = FS_LoadZipFile( pakfile ) ) == 0 ) + if ( ( pak = FS_LoadZipFile( pakfile, sorted[i] ) ) == 0 ) continue; - search = (searchpath_t*)Z_Malloc(sizeof(searchpath_t), TAG_FILESYS, qtrue ); + Q_strncpyz(pak->pakPathname, curpath, sizeof(pak->pakPathname)); + // store the game name for downloading + Q_strncpyz(pak->pakGamename, dir, sizeof(pak->pakGamename)); + + fs_packFiles += pak->numfiles; + + search = (searchpath_s *)Z_Malloc (sizeof(searchpath_t), TAG_FILESYS, qtrue); search->pack = pak; if (fs_dirbeforepak && fs_dirbeforepak->integer && thedir) @@ -1858,10 +2822,50 @@ qboolean FS_CheckDirTraversal(const char *checkdir) { if(strstr(checkdir, "../") || strstr(checkdir, "..\\")) return qtrue; - + return qfalse; } +/* +================ +FS_Shutdown + +Frees all resources and closes all files +================ +*/ +void FS_Shutdown( void ) { + searchpath_t *p, *next; + int i; + + for(i = 0; i < MAX_FILE_HANDLES; i++) { + if (fsh[i].fileSize) { + FS_FCloseFile(i); + } + } + + // free everything + for ( p = fs_searchpaths ; p ; p = next ) { + next = p->next; + + if ( p->pack ) { + FS_FreePak( p->pack ); + } + if ( p->dir ) { + Z_Free( p->dir ); + } + Z_Free( p ); + } + + // any FS_ calls will now be an error until reinitialized + fs_searchpaths = NULL; + + Cmd_RemoveCommand( "path" ); + Cmd_RemoveCommand( "dir" ); + Cmd_RemoveCommand( "fdir" ); + Cmd_RemoveCommand( "touchFile" ); + Cmd_RemoveCommand( "which" ); +} + /* ================ FS_Startup @@ -1872,19 +2876,21 @@ void FS_Startup( const char *gameName ) { Com_Printf( "----- FS_Startup -----\n" ); + fs_packFiles = 0; + fs_debug = Cvar_Get( "fs_debug", "0", 0 ); fs_copyfiles = Cvar_Get( "fs_copyfiles", "0", CVAR_INIT ); - fs_cdpath = Cvar_Get ("fs_cdpath", "", CVAR_INIT); - fs_basepath = Cvar_Get ("fs_basepath", Sys_DefaultInstallPath(), CVAR_INIT); + fs_cdpath = Cvar_Get ("fs_cdpath", "", CVAR_INIT|CVAR_PROTECTED ); + fs_basepath = Cvar_Get ("fs_basepath", Sys_DefaultInstallPath(), CVAR_INIT|CVAR_PROTECTED ); fs_basegame = Cvar_Get ("fs_basegame", "", CVAR_INIT ); homePath = Sys_DefaultHomePath(); if (!homePath || !homePath[0]) { homePath = fs_basepath->string; } - fs_homepath = Cvar_Get ("fs_homepath", homePath, CVAR_INIT ); + fs_homepath = Cvar_Get ("fs_homepath", homePath, CVAR_INIT|CVAR_PROTECTED ); fs_gamedirvar = Cvar_Get ("fs_game", "", CVAR_INIT|CVAR_SYSTEMINFO ); - fs_dirbeforepak = Cvar_Get("fs_dirbeforepak", "0", CVAR_INIT); + fs_dirbeforepak = Cvar_Get("fs_dirbeforepak", "0", CVAR_INIT|CVAR_PROTECTED); // add search path elements in reverse priority order if (fs_cdpath->string[0]) { @@ -1893,9 +2899,9 @@ void FS_Startup( const char *gameName ) { if (fs_basepath->string[0]) { FS_AddGameDirectory( fs_basepath->string, gameName ); } - + #ifdef MACOS_X - fs_apppath = Cvar_Get ("fs_apppath", Sys_DefaultAppPath(), CVAR_INIT ); + fs_apppath = Cvar_Get ("fs_apppath", Sys_DefaultAppPath(), CVAR_INIT|CVAR_PROTECTED ); // Make MacOSX also include the base path included with the .app bundle if (fs_apppath->string[0]) { FS_AddGameDirectory( fs_apppath->string, gameName ); @@ -1904,9 +2910,11 @@ void FS_Startup( const char *gameName ) { // fs_homepath is somewhat particular to *nix systems, only add if relevant // NOTE: same filtering below for mods and basegame - if (fs_homepath->string[0] && Q_stricmp(fs_homepath->string,fs_basepath->string)) { + // TODO Sys_PathCmp see previous comment for why + // !Sys_PathCmp(fs_homepath->string, fs_basepath->string) + if (fs_homepath->string[0] && Q_stricmp(fs_homepath->string, fs_basepath->string)) { FS_CreatePath ( fs_homepath->string ); - FS_AddGameDirectory( fs_homepath->string, gameName ); + FS_AddGameDirectory ( fs_homepath->string, gameName ); } // check for additional base game so mods can be based upon other mods @@ -1917,7 +2925,7 @@ void FS_Startup( const char *gameName ) { if (fs_basepath->string[0]) { FS_AddGameDirectory(fs_basepath->string, fs_basegame->string); } - if (fs_homepath->string[0] && Q_stricmp(fs_homepath->string,fs_basepath->string)) { + if (fs_homepath->string[0] && Q_stricmp(fs_homepath->string, fs_basepath->string)) { FS_AddGameDirectory(fs_homepath->string, fs_basegame->string); } } @@ -1930,7 +2938,7 @@ void FS_Startup( const char *gameName ) { if (fs_basepath->string[0]) { FS_AddGameDirectory(fs_basepath->string, fs_gamedirvar->string); } - if (fs_homepath->string[0] && Q_stricmp(fs_homepath->string,fs_basepath->string)) { + if (fs_homepath->string[0] && Q_stricmp(fs_homepath->string, fs_basepath->string)) { FS_AddGameDirectory(fs_homepath->string, fs_gamedirvar->string); } } @@ -1953,11 +2961,59 @@ void FS_Startup( const char *gameName ) { /* ================ -FS_Restart +FS_InitFilesystem + +Called only at inital startup, not when the filesystem +is resetting due to a game change ================ */ +void FS_InitFilesystem( void ) { + // allow command line parms to override our defaults + // we have to specially handle this, because normal command + // line variable sets don't happen until after the filesystem + // has already been initialized + Com_StartupVariable( "fs_cdpath" ); + Com_StartupVariable( "fs_basepath" ); + Com_StartupVariable( "fs_homepath" ); + Com_StartupVariable( "fs_game" ); + Com_StartupVariable( "fs_copyfiles" ); + Com_StartupVariable( "fs_dirbeforepak" ); +#ifdef MACOS_X + Com_StartupVariable( "fs_apppath" ); +#endif + const char *gamedir = Cvar_VariableString("fs_game"); + bool requestbase = false; + if ( !FS_FilenameCompare( gamedir, BASEGAME ) ) + requestbase = true; + + if ( requestbase ) + Cvar_Set2( "fs_game", "", qtrue ); + + // try to start up normally + FS_Startup( BASEGAME ); + + // if we can't find default.cfg, assume that the paths are + // busted and error out now, rather than getting an unreadable + // graphics screen when the font fails to load + if ( FS_ReadFile( "default.cfg", NULL ) <= 0 ) { + Com_Error( ERR_FATAL, "Couldn't load default.cfg" ); + // bk001208 - SafeMode see below, FIXME? + } + + Q_strncpyz(lastValidBase, fs_basepath->string, sizeof(lastValidBase)); + Q_strncpyz(lastValidGame, fs_gamedirvar->string, sizeof(lastValidGame)); + + // bk001208 - SafeMode see below, FIXME? +} + +/* +================ +FS_Restart +================ +*/ void FS_Restart( void ) { + // free anything we currently have loaded FS_Shutdown(); @@ -1976,14 +3032,14 @@ void FS_Restart( void ) { lastValidBase[0] = '\0'; lastValidGame[0] = '\0'; FS_Restart(); - Com_Error( ERR_DROP, "Invalid game folder\n" ); + Com_Error( ERR_DROP, "Invalid game folder" ); return; } Com_Error( ERR_FATAL, "Couldn't load default.cfg" ); } if ( Q_stricmp(fs_gamedirvar->string, lastValidGame) ) { - // skip the jampconfig.cfg if "safe" is on the command line + // skip the jaconfig.cfg if "safe" is on the command line if ( !Com_SafeMode() ) { Cbuf_AddText ("exec " Q3CONFIG_NAME "\n"); } @@ -1991,17 +3047,19 @@ void FS_Restart( void ) { Q_strncpyz(lastValidBase, fs_basepath->string, sizeof(lastValidBase)); Q_strncpyz(lastValidGame, fs_gamedirvar->string, sizeof(lastValidGame)); + } /* ================= FS_ConditionalRestart -restart if necessary + +Restart if necessary ================= */ qboolean FS_ConditionalRestart( void ) { - if( fs_gamedirvar->modified ) { - FS_Restart( ); + if(fs_gamedirvar->modified) { + FS_Restart(); return qtrue; } return qfalse; @@ -2028,18 +3086,28 @@ int FS_FOpenFileByMode( const char *qpath, fileHandle_t *f, fsMode_t mode ) { case FS_WRITE: *f = FS_FOpenFileWrite( qpath ); r = 0; + if (*f == 0) { + r = -1; + } break; case FS_APPEND_SYNC: sync = qtrue; case FS_APPEND: *f = FS_FOpenFileAppend( qpath ); r = 0; + if (*f == 0) { + r = -1; + } break; default: Com_Error( ERR_FATAL, "FSH_FOpenFile: bad mode" ); return -1; } + if (!f) { + return r; + } + if ( *f ) { fsh[*f].fileSize = r; } @@ -2050,7 +3118,7 @@ int FS_FOpenFileByMode( const char *qpath, fileHandle_t *f, fsMode_t mode ) { int FS_FTell( fileHandle_t f ) { int pos; - if (fsh[f].zipFile == (int)qtrue) { + if (fsh[f].zipFile == qtrue) { pos = unztell(fsh[f].handleFiles.file.z); } else { pos = ftell(fsh[f].handleFiles.file.o); @@ -2058,7 +3126,11 @@ int FS_FTell( fileHandle_t f ) { return pos; } -void FS_FilenameCompletion( const char *dir, const char *ext, qboolean stripExt, void(*callback)( const char *s ), qboolean allowNonPureFilesOnDisk ) { +void FS_Flush( fileHandle_t f ) { + fflush(fsh[f].handleFiles.file.o); +} + +void FS_FilenameCompletion( const char *dir, const char *ext, qboolean stripExt, callbackFunc_t callback, qboolean allowNonPureFilesOnDisk ) { int nfiles; char **filenames, filename[MAX_STRING_CHARS]; diff --git a/code/qcommon/files.h b/code/qcommon/files.h deleted file mode 100644 index f45fe98458..0000000000 --- a/code/qcommon/files.h +++ /dev/null @@ -1,127 +0,0 @@ -/* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . -*/ -// Copyright 2001-2013 Raven Software - -#ifndef __FILES_H -#define __FILES_H - - - -/* - Structures local to the files_* modules. -*/ - -#include "zlib/zlib.h" -#include "minizip/unzip.h" - -#define MAX_ZPATH 256 -#define MAX_SEARCH_PATHS 4096 -#define MAX_FILEHASH_SIZE 1024 - -typedef struct fileInPack_s { - char *name; // name of the file - unsigned long pos; // file info position in zip - unsigned long len; // uncompress file size - struct fileInPack_s* next; // next file in the hash -} fileInPack_t; - -typedef struct { - char pakFilename[MAX_OSPATH]; // c:\quake3\base\asset0.pk3 - unzFile handle; - int checksum; - int numfiles; - int hashSize; // hash table size (power of 2) - fileInPack_t* *hashTable; // hash table - fileInPack_t* buildBuffer; // buffer with the filenames etc. -} pack_t; - -typedef struct { - char path[MAX_OSPATH]; // c:\stvoy - char gamedir[MAX_OSPATH]; // base -} directory_t; - -typedef struct searchpath_s { - struct searchpath_s *next; - - pack_t *pack; // only one of pack / dir will be non NULL - directory_t *dir; -} searchpath_t; - - -#define MAX_FILE_HANDLES 64 - -typedef union qfile_gus { - FILE* o; - unzFile z; -} qfile_gut; - -typedef struct qfile_us { - qfile_gut file; - qboolean unique; -} qfile_ut; - -typedef struct { - qfile_ut handleFiles; - qboolean handleSync; - int fileSize; - int zipFilePos; - int zipFileLen; - qboolean zipFile; - char name[MAX_QPATH]; -} fileHandleData_t; - - -extern fileHandleData_t fsh[MAX_FILE_HANDLES]; - -extern searchpath_t *fs_searchpaths; -extern char fs_gamedir[MAX_OSPATH]; // this will be a single file name with no separators -extern cvar_t *fs_debug; -extern cvar_t *fs_homepath; - -#ifdef MACOS_X -// Also search the .app bundle for .pk3 files -extern cvar_t *fs_apppath; -#endif - -extern cvar_t *fs_basepath; -extern cvar_t *fs_basegame; -extern cvar_t *fs_cdpath; -extern cvar_t *fs_copyfiles; -extern cvar_t *fs_gamedirvar; -extern cvar_t *fs_dirbeforepak; //rww - when building search path, keep directories at top and insert pk3's under them -extern int fs_readCount; // total bytes read -extern int fs_loadCount; // total files read -extern int fs_packFiles; // total number of files in packs - - -// last valid game folder used -extern char lastValidBase[MAX_OSPATH]; -extern char lastValidGame[MAX_OSPATH]; - -void FS_Startup( const char *gameName ); -qboolean FS_CreatePath(char *OSPath); -char *FS_BuildOSPath( const char *base, const char *game, const char *qpath ); -char *FS_BuildOSPath( const char *qpath ); -fileHandle_t FS_HandleForFile(void); -qboolean FS_FilenameCompare( const char *s1, const char *s2 ); -int FS_SV_FOpenFileRead( const char *filename, fileHandle_t *fp ); -void FS_Shutdown( void ); -void FS_CheckInit(void); -void FS_ReplaceSeparators( char *path ); - - -#endif diff --git a/code/qcommon/files_common.cpp b/code/qcommon/files_common.cpp deleted file mode 100644 index 64c9d04dfd..0000000000 --- a/code/qcommon/files_common.cpp +++ /dev/null @@ -1,661 +0,0 @@ -/* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . -*/ -// Copyright 2001-2013 Raven Software - -/***************************************************************************** - * name: files.c - * - * desc: handle based filesystem for Quake III Arena - * - * - *****************************************************************************/ - - -#include "q_shared.h" -#include "qcommon.h" -#include "files.h" - -/* -============================================================================= - -QUAKE3 FILESYSTEM - -All of Quake's data access is through a hierarchical file system, but the contents of -the file system can be transparently merged from several sources. - -A "qpath" is a reference to game file data. MAX_QPATH is 64 characters, which must include -a terminating zero. "..", "\\", and ":" are explicitly illegal in qpaths to prevent any -references outside the quake directory system. - -The "base path" is the path to the directory holding all the game directories and usually -the executable. It defaults to ".", but can be overridden with a "+set fs_basepath c:\quake3" -command line to allow code debugging in a different directory. Basepath cannot -be modified at all after startup. Any files that are created (demos, screenshots, -etc) will be created relative to the base path, so base path should usually be writable. - -The "cd path" is the path to an alternate hierarchy that will be searched if a file -is not located in the base path. A user can do a partial install that copies some -data to a base path created on their hard drive and leave the rest on the cd. Files -are never writen to the cd path. It defaults to a value set by the installer, like -"e:\quake3", but it can be overridden with "+set ds_cdpath g:\quake3". - -If a user runs the game directly from a CD, the base path would be on the CD. This -should still function correctly, but all file writes will fail (harmlessly). - - -The "base game" is the directory under the paths where data comes from by default, and -can be either "base" or "demo". - -The "current game" may be the same as the base game, or it may be the name of another -directory under the paths that should be searched for files before looking in the base game. -This is the basis for addons. - -Clients automatically set the game directory after receiving a gamestate from a server, -so only servers need to worry about +set fs_game. - -No other directories outside of the base game and current game will ever be referenced by -filesystem functions. - -To save disk space and speed loading, directory trees can be collapsed into zip files. -The files use a ".pk3" extension to prevent users from unzipping them accidentally, but -otherwise the are simply normal uncompressed zip files. A game directory can have multiple -zip files of the form "asset0.pk3", "pak1.pk3", etc. Zip files are searched in decending order -from the highest number to the lowest, and will always take precedence over the filesystem. -This allows a pk3 distributed as a patch to override all existing data. - -Because we will have updated executables freely available online, there is no point to -trying to restrict demo / oem versions of the game with code changes. Demo / oem versions -should be exactly the same executables as release versions, but with different data that -automatically restricts where game media can come from to prevent add-ons from working. - -After the paths are initialized, quake will look for the product.txt file. If not -found and verified, the game will run in restricted mode. In restricted mode, only -files contained in demo/asset0.pk3 will be available for loading, and only if the zip header is -verified to not have been modified. A single exception is made for jaconfig.cfg. Files -can still be written out in restricted mode, so screenshots and demos are allowed. -Restricted mode can be tested by setting "+set fs_restrict 1" on the command line, even -if there is a valid product.txt under the basepath or cdpath. - -If not running in restricted mode, and a file is not found in any local filesystem, -an attempt will be made to download it and save it under the base path. - -If the "fs_copyfiles" cvar is set to 1, then every time a file is sourced from the cd -path, it will be copied over to the base path. This is a development aid to help build -test releases and to copy working sets over slow network links. -(If set to 2, copying will only take place if the two filetimes are NOT EQUAL) - - -The qpath "sound/newstuff/test.wav" would be searched for in the following places: - -base path + current game's zip files -base path + current game's directory -cd path + current game's zip files -cd path + current game's directory -base path + base game's zip files -base path + base game's directory -cd path + base game's zip files -cd path + base game's directory -server download, to be written to base path + current game's directory - - -The filesystem can be safely shutdown and reinitialized with different -basedir / cddir / game combinations, but all other subsystems that rely on it -(sound, video) must also be forced to restart. - -Because the same files are loaded by both the clip model (CM_) and renderer (TR_) -subsystems, a simple single-file caching scheme is used. The CM_ subsystems will -load the file with a request to cache. Only one file will be kept cached at a time, -so any models that are going to be referenced by both subsystems should alternate -between the CM_ load function and the ref load function. - - - - -TODO: A qpath that starts with a leading slash will always refer to the base game, even if another -game is currently active. This allows character models, skins, and sounds to be downloaded -to a common directory no matter which game is active. - - -How to prevent downloading zip files? -Pass pk3 file names in systeminfo, and download before FS_Restart()? - - - -Aborting a download disconnects the client from the server. - -How to mark files as downloadable? Commercial add-ons won't be downloadable. - -Non-commercial downloads will want to download the entire zip file. -the game would have to be reset to actually read the zip in - -Auto-update information - -Path separators - -Casing - - separate server gamedir and client gamedir, so if the user starts - a local game after having connected to a network game, it won't stick - with the network game. - - allow menu options for game selection? - -Read / write config to floppy option. - -Different version coexistance? - -When building a pak file, make sure a jaconfig.cfg isn't present in it, -or configs will never get loaded from disk! - - todo: - - downloading (outside fs?) - game directory passing and restarting - -============================================================================= - -*/ - -char fs_gamedir[MAX_OSPATH]; // this will be a single file name with no separators -cvar_t *fs_debug; -cvar_t *fs_homepath; - -#ifdef MACOS_X -// Also search the .app bundle for .pk3 files -cvar_t *fs_apppath; -#endif - -cvar_t *fs_basepath; -cvar_t *fs_basegame; -cvar_t *fs_cdpath; -cvar_t *fs_copyfiles; -cvar_t *fs_gamedirvar; -cvar_t *fs_dirbeforepak; //rww - when building search path, keep directories at top and insert pk3's under them -searchpath_t *fs_searchpaths; -int fs_readCount; // total bytes read -int fs_loadCount; // total files read -int fs_packFiles; // total number of files in packs - -qboolean initialized = qfalse; - -// last valid game folder used -char lastValidBase[MAX_OSPATH]; -char lastValidGame[MAX_OSPATH]; - - - -fileHandleData_t fsh[MAX_FILE_HANDLES]; - -void FS_CheckInit(void) -{ - if (!initialized) - { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } -} - - -/* -============== -FS_Initialized -============== -*/ - -qboolean FS_Initialized() { - return (qboolean)(fs_searchpaths != NULL); -} - - - -fileHandle_t FS_HandleForFile(void) { - int i; - - for ( i = 1 ; i < MAX_FILE_HANDLES ; i++ ) { - if ( fsh[i].handleFiles.file.o == NULL ) { - return i; - } - } - - Com_Printf( "FS_HandleForFile: all handles taken:\n" ); - for ( i = 1 ; i < MAX_FILE_HANDLES ; i++ ) { - Com_Printf( "%d. %s\n", i, fsh[i].name); - } - Com_Error( ERR_DROP, "FS_HandleForFile: none free" ); - return 0; -} - - -/* -==================== -FS_ReplaceSeparators - -Fix things up differently for win/unix/mac -==================== -*/ -void FS_ReplaceSeparators( char *path ) { - char *s; - qboolean lastCharWasSep = qfalse; - - for ( s = path ; *s ; s++ ) { - if ( *s == '/' || *s == '\\' ) { - if ( !lastCharWasSep ) { - *s = PATH_SEP; - lastCharWasSep = qtrue; - } else { - memmove (s, s + 1, strlen (s)); - } - } else { - lastCharWasSep = qfalse; - } - } -} - -/* -=================== -FS_BuildOSPath - -Qpath may have either forward or backwards slashes -=================== -*/ - -char *FS_BuildOSPath( const char *qpath ) -{ - char temp[MAX_OSPATH]; - static char ospath[2][MAX_OSPATH]; - static int toggle; - - toggle ^= 1; // flip-flop to allow two returns without clash - - // Fix for filenames that are given to FS with a leading "/" (/botfiles/Foo) - if (qpath[0] == '\\' || qpath[0] == '/') - qpath++; - - Com_sprintf( temp, sizeof(temp), "/%s/%s", fs_gamedirvar->string, qpath ); - - FS_ReplaceSeparators( temp ); - Com_sprintf( ospath[toggle], sizeof( ospath[0] ), "%s%s", - fs_basepath->string, temp ); - - return ospath[toggle]; -} - -char *FS_BuildOSPath( const char *base, const char *game, const char *qpath ) { - char temp[MAX_OSPATH]; - static char ospath[4][MAX_OSPATH]; - static int toggle; - - int nextToggle = (toggle + 1)&3; // allows four returns without clash (increased from 2 during fs_copyfiles 2 enhancement) - toggle = nextToggle; - - if( !game || !game[0] ) { - game = fs_gamedir; - } - - Com_sprintf( temp, sizeof(temp), "/%s/%s", game, qpath ); - FS_ReplaceSeparators( temp ); - Com_sprintf( ospath[toggle], sizeof( ospath[0] ), "%s%s", base, temp ); - - return ospath[toggle]; -} - - -/* -============ -FS_CreatePath - -Creates any directories needed to store the given filename -============ -*/ -qboolean FS_CreatePath (char *OSPath) { - char *ofs; - char path[MAX_OSPATH]; - - // make absolutely sure that it can't back up the path - // FIXME: is c: allowed??? - if ( strstr( OSPath, ".." ) || strstr( OSPath, "::" ) ) { - Com_Printf( "WARNING: refusing to create relative path \"%s\"\n", OSPath ); - return qtrue; - } - - Q_strncpyz( path, OSPath, sizeof( path ) ); - FS_ReplaceSeparators( path ); - - // Skip creation of the root directory as it will always be there - ofs = strchr( path, PATH_SEP ); - ofs++; - - for (; ofs != NULL && *ofs ; ofs++) { - if (*ofs == PATH_SEP) { - // create the directory - *ofs = 0; - if (!Sys_Mkdir (path)) { - Com_Error( ERR_FATAL, "FS_CreatePath: failed to create path \"%s\"", - path ); - } - *ofs = PATH_SEP; - } - } - return qfalse; -} - - - -/* -=========== -FS_SV_FOpenFileRead - -=========== -*/ -int FS_SV_FOpenFileRead( const char *filename, fileHandle_t *fp ) { - char *ospath; - fileHandle_t f = 0; - - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } - - f = FS_HandleForFile(); - fsh[f].zipFile = qfalse; - - Q_strncpyz( fsh[f].name, filename, sizeof( fsh[f].name ) ); - - // don't let sound stutter - S_ClearSoundBuffer(); - - ospath = FS_BuildOSPath( fs_homepath->string, filename, "" ); - // remove trailing slash - ospath[strlen(ospath)-1] = '\0'; - - if ( fs_debug->integer ) { - Com_Printf( "FS_SV_FOpenFileRead: %s\n", ospath ); - } - - fsh[f].handleFiles.file.o = fopen( ospath, "rb" ); - fsh[f].handleSync = qfalse; - if (!fsh[f].handleFiles.file.o) { - // NOTE TTimo on non *nix systems, fs_homepath == fs_basepath, might want to avoid - if (Q_stricmp(fs_homepath->string,fs_basepath->string)) - { - // search basepath - ospath = FS_BuildOSPath( fs_basepath->string, filename, "" ); - ospath[strlen(ospath)-1] = '\0'; - - if ( fs_debug->integer ) - { - Com_Printf( "FS_SV_FOpenFileRead (fs_basepath): %s\n", ospath ); - } - - fsh[f].handleFiles.file.o = fopen( ospath, "rb" ); - fsh[f].handleSync = qfalse; - - if ( !fsh[f].handleFiles.file.o ) - { - f = 0; - } - } - } - - if (!fsh[f].handleFiles.file.o) { - // search cd path - ospath = FS_BuildOSPath( fs_cdpath->string, filename, "" ); - ospath[strlen(ospath)-1] = '\0'; - - if (fs_debug->integer) - { - Com_Printf( "FS_SV_FOpenFileRead (fs_cdpath) : %s\n", ospath ); - } - - fsh[f].handleFiles.file.o = fopen( ospath, "rb" ); - fsh[f].handleSync = qfalse; - - if( !fsh[f].handleFiles.file.o ) { - f = 0; - } - } - - *fp = f; - if (f) { - return FS_filelength(f); - } - return 0; -} - - - - -/* -=========== -FS_FOpenFileAppend - -=========== -*/ -fileHandle_t FS_FOpenFileAppend( const char *filename ) { - char *ospath; - fileHandle_t f; - - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } - - f = FS_HandleForFile(); - fsh[f].zipFile = qfalse; - - Q_strncpyz( fsh[f].name, filename, sizeof( fsh[f].name ) ); - - // don't let sound stutter - S_ClearSoundBuffer(); - - ospath = FS_BuildOSPath( fs_homepath->string, fs_gamedir, filename ); - - if ( fs_debug->integer ) { - Com_Printf( "FS_FOpenFileAppend: %s\n", ospath ); - } - - FS_CreatePath( ospath ); - fsh[f].handleFiles.file.o = fopen( ospath, "ab" ); - fsh[f].handleSync = qfalse; - if (!fsh[f].handleFiles.file.o) { - f = 0; - } - return f; -} - - -/* -=========== -FS_FilenameCompare - -Ignore case and seprator char distinctions -=========== -*/ -qboolean FS_FilenameCompare( const char *s1, const char *s2 ) { - int c1, c2; - - do { - c1 = *s1++; - c2 = *s2++; - - if ( Q_islower(c1) ) { - c1 -= ('a' - 'A'); - } - if ( Q_islower(c2) ) { - c2 -= ('a' - 'A'); - } - - if ( c1 == '\\' || c1 == ':' ) { - c1 = '/'; - } - if ( c2 == '\\' || c2 == ':' ) { - c2 = '/'; - } - - if (c1 != c2) { - return -1; // strings not equal - } - } while (c1); - - return 0; // strings are equal -} - - -#define MAXPRINTMSG 4096 -void QDECL FS_Printf( fileHandle_t h, const char *fmt, ... ) { - va_list argptr; - char msg[MAXPRINTMSG]; - - va_start (argptr,fmt); - vsprintf (msg,fmt,argptr); - va_end (argptr); - - FS_Write(msg, strlen(msg), h); -} - - - - -/* -============ -FS_WriteFile - -Filename are relative to the quake search path -============ -*/ -void FS_WriteFile( const char *qpath, const void *buffer, int size ) { - fileHandle_t f; - - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } - - if ( !qpath || !buffer ) { - Com_Error( ERR_FATAL, "FS_WriteFile: NULL parameter" ); - } - - f = FS_FOpenFileWrite( qpath ); - if ( !f ) { - Com_Printf( "Failed to open %s\n", qpath ); - return; - } - - FS_Write( buffer, size, f ); - - FS_FCloseFile( f ); -} - - - - - - - - -/* -================ -FS_Shutdown - -Frees all resources and closes all files -================ -*/ -void FS_Shutdown( void ) { - searchpath_t *p, *next; - int i; - - for(i = 0; i < MAX_FILE_HANDLES; i++) { - if (fsh[i].fileSize) { - FS_FCloseFile(i); - } - } - - // free everything - for ( p = fs_searchpaths ; p ; p = next ) { - next = p->next; - - if ( p->pack ) { - unzClose(p->pack->handle); - Z_Free( p->pack->buildBuffer ); - Z_Free( p->pack ); - } - if ( p->dir ) { - Z_Free( p->dir ); - } - Z_Free( p ); - } - - // any FS_ calls will now be an error until reinitialized - fs_searchpaths = NULL; - - Cmd_RemoveCommand( "path" ); - Cmd_RemoveCommand( "dir" ); - Cmd_RemoveCommand( "fdir" ); - Cmd_RemoveCommand( "touchFile" ); - Cmd_RemoveCommand( "which" ); - - initialized = qfalse; -} - - - -/* -================ -FS_InitFilesystem - -Called only at inital startup, not when the filesystem -is resetting due to a game change -================ -*/ -void FS_InitFilesystem( void ) { - // allow command line parms to override our defaults - // we don't have to specially handle this, because normal command - // line variable sets happen before the filesystem - // has been initialized - // - // UPDATE: BTO (VV) - // we have to specially handle this, because normal command - // line variable sets don't happen until after the filesystem - // has already been initialized - Com_StartupVariable( "fs_cdpath" ); - Com_StartupVariable( "fs_basepath" ); - Com_StartupVariable( "fs_homepath" ); - Com_StartupVariable( "fs_game" ); - Com_StartupVariable( "fs_copyfiles" ); - Com_StartupVariable( "fs_dirbeforepak" ); -#ifdef MACOS_X - Com_StartupVariable( "fs_apppath" ); -#endif - - // try to start up normally - FS_Startup( BASEGAME ); - initialized = qtrue; - - // if we can't find default.cfg, assume that the paths are - // busted and error out now, rather than getting an unreadable - // graphics screen when the font fails to load - if ( FS_ReadFile( "default.cfg", NULL ) <= 0 ) { - Com_Error( ERR_FATAL, "Couldn't load default.cfg" ); - } - - Q_strncpyz(lastValidBase, fs_basepath->string, sizeof(lastValidBase)); - Q_strncpyz(lastValidGame, fs_gamedirvar->string, sizeof(lastValidGame)); -} - - - - -void FS_Flush( fileHandle_t f ) { - fflush(fsh[f].handleFiles.file.o); -} - diff --git a/code/qcommon/files_console.cpp b/code/qcommon/files_console.cpp deleted file mode 100644 index 304ffc58ff..0000000000 --- a/code/qcommon/files_console.cpp +++ /dev/null @@ -1,1029 +0,0 @@ - -#include "../game/q_shared.h" -#include "qcommon.h" -#include "files.h" -#include "../win32/win_file.h" -#include "../zlib/zlib.h" - - - -static cvar_t *fs_openorder; - - -// Zlib Tech Ref says decompression should use about 44kb. I'll -// go with 64kb as a safety factor... -#define ZI_STACKSIZE (64*1024) - -static char* zi_stackTop = NULL; -static char* zi_stackBase = NULL; - - - -//GOB stuff -//=========================================================================== - -struct gi_handleTable -{ - wfhandle_t file; - bool used; -}; - -static gi_handleTable *gi_handles = NULL; -static int gi_cacheHandle = 0; - -static GOBFSHandle gi_open(GOBChar* name, GOBAccessType type) -{ - if (type != GOBACCESS_READ) return (GOBFSHandle)0xFFFFFFFF; - - int f; - for (f = 0; f < MAX_FILE_HANDLES; ++f) - { - if (!gi_handles[f].used) break; - } - - if (f == MAX_FILE_HANDLES) return (GOBFSHandle)0xFFFFFFFF; - - gi_handles[f].file = WF_Open(name, true, strstr(name, "assets.gob") ? true : false); - if (gi_handles[f].file < 0) return (GOBFSHandle)0xFFFFFFFF; - gi_handles[f].used = true; - - return (GOBFSHandle)f; -} - -static GOBBool gi_close(GOBFSHandle* handle) -{ - WF_Close(gi_handles[(int)*handle].file); - gi_handles[(int)*handle].used = false; - return GOB_TRUE; -} - -static GOBInt32 gi_read(GOBFSHandle handle, GOBVoid* buffer, GOBInt32 size) -{ - return WF_Read(buffer, size, gi_handles[(int)handle].file); -} - -static GOBInt32 gi_seek(GOBFSHandle handle, GOBInt32 offset, GOBSeekType type) -{ - int _type; - switch (type) { - case GOBSEEK_START: _type = SEEK_SET; break; - case GOBSEEK_CURRENT: _type = SEEK_CUR; break; - case GOBSEEK_END: _type = SEEK_END; break; - default: assert(0); _type = SEEK_SET; break; - } - - return WF_Seek(offset, _type, gi_handles[(int)handle].file); -} - -static GOBVoid* gi_alloc(GOBUInt32 size) -{ - return Z_Malloc(size, TAG_FILESYS, qfalse, 32); -} - -static GOBVoid gi_free(GOBVoid* ptr) -{ - Z_Free(ptr); -} - -static GOBBool cache_open(GOBUInt32 size) -{ - for (gi_cacheHandle = 0; gi_cacheHandle < MAX_FILE_HANDLES; ++gi_cacheHandle) - { - if (!gi_handles[gi_cacheHandle].used) break; - } - - if (gi_cacheHandle == MAX_FILE_HANDLES) return GOB_FALSE; - - gi_handles[gi_cacheHandle].file = WF_Open("z:\\jedi.swap", false, true); - if (gi_handles[gi_cacheHandle].file < 0) return GOB_FALSE; - - if (!WF_Resize(size, gi_handles[gi_cacheHandle].file)) - { - WF_Close(gi_handles[gi_cacheHandle].file); - return GOB_FALSE; - } - - gi_handles[gi_cacheHandle].used = true; - - return GOB_TRUE; -} - -static GOBBool cache_close(GOBVoid) -{ - WF_Close(gi_handles[gi_cacheHandle].file); - gi_handles[gi_cacheHandle].used = false; - return GOB_TRUE; -} - -static GOBInt32 cache_read(GOBVoid* buffer, GOBInt32 size) -{ - return WF_Read(buffer, size, gi_handles[gi_cacheHandle].file); -} - -static GOBInt32 cache_write(GOBVoid* buffer, GOBInt32 size) -{ - return WF_Write(buffer, size, gi_handles[gi_cacheHandle].file); -} - -static GOBInt32 cache_seek(GOBInt32 offset) -{ - return WF_Seek(offset, SEEK_SET, gi_handles[gi_cacheHandle].file); -} - -static voidpf zi_alloc(voidpf opaque, uInt items, uInt size) -{ - voidpf ret = zi_stackTop; - - zi_stackTop += items * size; - assert(zi_stackTop < zi_stackBase + ZI_STACKSIZE); - - return ret; -} - -static void zi_free(voidpf opaque, voidpf address) -{ -} - -static GOBInt32 gi_decompress_zlib(GOBVoid* source, GOBUInt32 sourceLen, - GOBVoid* dest, GOBUInt32* destLen) -{ - // Copied and modified version of zlib's uncompress()... - - z_stream stream; - int err; - - stream.next_in = (Bytef*)source; - stream.avail_in = (uInt)sourceLen; - - stream.next_out = (Bytef*)dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; - - stream.zalloc = zi_alloc; - stream.zfree = zi_free; - zi_stackTop = zi_stackBase; - - err = inflateInit(&stream); - if (err != Z_OK) return err; - - err = inflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - inflateEnd(&stream); - return err == Z_OK ? Z_BUF_ERROR : err; - } - *destLen = stream.total_out; - - err = inflateEnd(&stream); - return err; -} - -GOBInt32 gi_decompress_null(GOBVoid* source, GOBUInt32 sourceLen, - GOBVoid* dest, GOBUInt32* destLen) -{ - if (sourceLen > *destLen) return -1; - *destLen = sourceLen; - - memcpy(dest, source, sourceLen); - return 0; -} - -#ifdef GOB_PROFILE -static GOBVoid gi_profileread(GOBUInt32 code) -{ - code = LittleLong(code); - Sys_Log("gob-prof.dat", &code, sizeof(code), true); -} -#endif - -//=========================================================================== - - - - -static void FS_CheckUsed(fileHandle_t f) -{ - if (!fsh[f].used) - { - Com_Error( ERR_FATAL, "Filesystem call attempting to use invalid handle\n" ); - } -} - - -int FS_filelength( fileHandle_t f ) -{ - FS_CheckInit(); - FS_CheckUsed(f); - - if (fsh[f].gob) - { - GOBUInt32 cur, end, crap; - GOBSeek(fsh[f].ghandle, 0, GOBSEEK_CURRENT, &cur); - GOBSeek(fsh[f].ghandle, 0, GOBSEEK_END, &end); - GOBSeek(fsh[f].ghandle, cur, GOBSEEK_START, &crap); - - return end; - } - else - { - int pos = WF_Tell(fsh[f].whandle); - WF_Seek(0, SEEK_END, fsh[f].whandle); - int end = WF_Tell(fsh[f].whandle); - WF_Seek(pos, SEEK_SET, fsh[f].whandle); - - return end; - } -} - - -void FS_FCloseFile( fileHandle_t f ) -{ - FS_CheckInit(); - FS_CheckUsed(f); - - if (fsh[f].gob) - GOBClose(fsh[f].ghandle); - else - WF_Close(fsh[f].whandle); - - fsh[f].used = qfalse; -} - - -fileHandle_t FS_FOpenFileWrite( const char *filename ) -{ - FS_CheckInit(); - - fileHandle_t f = FS_HandleForFile(); - - char* osname = FS_BuildOSPath( filename ); - fsh[f].whandle = WF_Open(osname, false, false); - if (fsh[f].whandle >= 0) - { - fsh[f].used = qtrue; - fsh[f].gob = qfalse; - return f; - } - - return 0; -} - - -/* -=========== -FS_FOpenFileRead - -Finds the file in the search path. -Returns filesize and an open FILE pointer. -Used for streaming data out of either a -separate file or a ZIP file. -=========== -*/ - -static int FS_FOpenFileReadOS( const char *filename, fileHandle_t f ) -{ - if (Sys_GetFileCode(filename) != -1) - { - char* osname = FS_BuildOSPath( filename ); - fsh[f].whandle = WF_Open(osname, true, false); - if (fsh[f].whandle >= 0) - { - fsh[f].used = qtrue; - fsh[f].gob = qfalse; - return FS_filelength(f); - } - } - return -1; -} - - -/* -=================== -FS_BuildGOBPath - -Qpath may have either forward or backwards slashes -=================== -*/ -static char *FS_BuildGOBPath(const char *qpath ) -{ - static char path[2][MAX_OSPATH]; - static int toggle; - - toggle ^= 1; // flip-flop to allow two returns without clash - - if (qpath[0] == '\\' || qpath[0] == '/') - { - Com_sprintf( path[toggle], sizeof( path[0] ), ".%s", qpath ); - } - else - { - Com_sprintf( path[toggle], sizeof( path[0] ), ".\\%s", qpath ); - } - -// FS_ReplaceSeparators( path[toggle], '\\' ); - FS_ReplaceSeparators( path[toggle] ); - - return path[toggle]; -} - - -static int FS_FOpenFileReadGOB( const char *filename, fileHandle_t f ) -{ - char* gobname = FS_BuildGOBPath( filename ); - if (GOBOpen(gobname, &fsh[f].ghandle) == GOBERR_OK) - { - fsh[f].used = qtrue; - fsh[f].gob = qtrue; - return FS_filelength(f); - } - return -1; -} - - -/* -=========== -FS_FOpenFileRead - -Finds the file in the search path. -Returns filesize and an open FILE pointer. -Used for streaming data out of either a -separate file or a ZIP file. -=========== -*/ -int FS_FOpenFileRead( const char *filename, fileHandle_t *file, qboolean uniqueFILE ) -{ - FS_CheckInit(); - - if ( file == NULL ) { - Com_Error( ERR_FATAL, "FS_FOpenFileRead: NULL 'file' parameter passed\n" ); - } - - if ( !filename ) { - Com_Error( ERR_FATAL, "FS_FOpenFileRead: NULL 'filename' parameter passed\n" ); - } - - *file = FS_HandleForFile(); - - int len; - - if (fs_openorder->integer == 0) - { - // Release mode -- read from GOB first - len = FS_FOpenFileReadGOB(filename, *file); - if (len < 0) len = FS_FOpenFileReadOS(filename, *file); - } - else - { - // Debug mode -- external files override GOB - len = FS_FOpenFileReadOS(filename, *file); - if (len < 0) len = FS_FOpenFileReadGOB(filename, *file); - } - - if (len >= 0) return len; - - Com_DPrintf ("Can't find %s\n", filename); - - *file = 0; - return -1; -} - - -/* -================= -FS_Read - -Properly handles partial reads -================= -*/ -int FS_Read( void *buffer, int len, fileHandle_t f ) -{ - FS_CheckInit(); - FS_CheckUsed(f); - - if ( !f ) - { - return 0; - } - - if ( f <= 0 || f >= MAX_FILE_HANDLES ) - { - Com_Error( ERR_FATAL, "FS_Read: Invalid handle %d\n", f ); - } - - if (fsh[f].gob) - { - GOBUInt32 size = GOBRead(buffer, len, fsh[f].ghandle); - if (size == GOB_INVALID_SIZE) - { -#if defined(FINAL_BUILD) - /* - extern void ERR_DiscFail(bool); - ERR_DiscFail(false); - */ -#else - Com_Error( ERR_FATAL, "Failed to read from GOB" ); -#endif - } - return size; - } - else - { - return WF_Read(buffer, len, fsh[f].whandle); - } -} - -/* - MP has FS_Read2 which is supposed to do some extra logic. - We don't care, and just call FS_Read() -*/ -int FS_Read2( void *buffer, int len, fileHandle_t f ) -{ - return FS_Read(buffer, len, f); -} - -/* -================= -FS_Write -================= -*/ -int FS_Write( const void *buffer, int len, fileHandle_t f ) -{ - FS_CheckInit(); - FS_CheckUsed(f); - - if ( !f ) - { - return 0; - } - - if ( f <= 0 || f >= MAX_FILE_HANDLES ) - { - Com_Error( ERR_FATAL, "FS_Read: Invalid handle %d\n", f ); - } - - if (fsh[f].gob) - { - Com_Error( ERR_FATAL, "FS_Write: Cannot write to GOB files %d\n", f ); - } - else - { - return WF_Write(buffer, len, fsh[f].whandle); - } - - return 0; -} - - -/* -================= -FS_Seek - -================= -*/ -int FS_Seek( fileHandle_t f, long offset, int origin ) -{ - FS_CheckInit(); - FS_CheckUsed(f); - - if (fsh[f].gob) - { - int _origin; - switch( origin ) { - case FS_SEEK_CUR: _origin = GOBSEEK_CURRENT; break; - case FS_SEEK_END: _origin = GOBSEEK_END; break; - case FS_SEEK_SET: _origin = GOBSEEK_START; break; - default: - _origin = GOBSEEK_CURRENT; - Com_Error( ERR_FATAL, "Bad origin in FS_Seek\n" ); - break; - } - - GOBUInt32 pos; - GOBSeek(fsh[f].ghandle, offset, _origin, &pos); - return pos; - } - else - { - int _origin; - switch( origin ) { - case FS_SEEK_CUR: _origin = SEEK_CUR; break; - case FS_SEEK_END: _origin = SEEK_END; break; - case FS_SEEK_SET: _origin = SEEK_SET; break; - default: - _origin = SEEK_CUR; - Com_Error( ERR_FATAL, "Bad origin in FS_Seek\n" ); - break; - } - - return WF_Seek(offset, _origin, fsh[f].whandle); - } -} - - -/* -================= -FS_Access -================= -*/ -qboolean FS_Access( const char *filename ) -{ - GOBBool status; - - FS_CheckInit(); - - char* gobname = FS_BuildGOBPath( filename ); - if (GOBAccess(gobname, &status) != GOBERR_OK || status != GOB_TRUE) - { - return Sys_GetFileCode( filename ) != -1; - } - - return qtrue; -} - - -/* -====================================================================================== - -CONVENIENCE FUNCTIONS FOR ENTIRE FILES - -====================================================================================== -*/ - -#ifdef _JK2MP -int FS_FileIsInPAK(const char *filename, int *pChecksum) -#else -int FS_FileIsInPAK(const char *filename) -#endif -{ - FS_CheckInit(); - - if ( !filename ) { - Com_Error( ERR_FATAL, "FS_FOpenFileRead: NULL 'filename' parameter passed\n" ); - } - - GOBBool exists; - GOBAccess(const_cast(filename), &exists); - -#ifdef _JK2MP - *pChecksum = 0; -#endif - - return exists ? 1 : -1; -} - -/* -============ -FS_ReadFile - -Filename are relative to the quake search path -a null buffer will just return the file length without loading -============ -*/ -int FS_ReadFile( const char *qpath, void **buffer ) -{ - FS_CheckInit(); - - if ( !qpath || !qpath[0] ) { - Com_Error( ERR_FATAL, "FS_ReadFile with empty name\n" ); - } - - // stop sounds from repeating - S_ClearSoundBuffer(); - - fileHandle_t h; - int len = FS_FOpenFileRead( qpath, &h, qfalse ); - if ( h == 0 ) - { - if ( buffer ) *buffer = NULL; - return -1; - } - - if ( !buffer ) - { - FS_FCloseFile(h); - return len; - } - - // assume temporary.... - byte* buf = (byte*)Z_Malloc( len+1, TAG_TEMP_WORKSPACE, qfalse, 32); - buf[len]='\0'; - -// Z_Label(buf, qpath); - - FS_Read(buf, len, h); - - // guarantee that it will have a trailing 0 for string operations - buf[len] = 0; - FS_FCloseFile( h ); - - *buffer = buf; - return len; -} - - -/* -============= -FS_FreeFile -============= -*/ -void FS_FreeFile( void *buffer ) -{ - FS_CheckInit(); - - if ( !buffer ) { - Com_Error( ERR_FATAL, "FS_FreeFile( NULL )" ); - } - - Z_Free( buffer ); -} - - -int FS_FOpenFileByMode( const char *qpath, fileHandle_t *f, fsMode_t mode ) -{ - FS_CheckInit(); - - if (mode != FS_READ) - { - Com_Error( ERR_FATAL, "FSH_FOpenFile: bad mode" ); - return -1; - } - - return FS_FOpenFileRead( qpath, f, qtrue ); -} - - -int FS_FTell( fileHandle_t f ) -{ - FS_CheckInit(); - FS_CheckUsed(f); - - if (fsh[f].gob) - { - GOBUInt32 pos; - GOBSeek(fsh[f].ghandle, 0, GOBSEEK_CURRENT, &pos); - return pos; - } - else - { - return WF_Tell(fsh[f].whandle); - } -} - -/* -================ -FS_Startup -================ -*/ -void FS_Startup( const char *gameName ) -{ - Com_Printf( "----- FS_Startup -----\n" ); - - fs_openorder = Cvar_Get( "fs_openorder", "0", 0 ); - fs_debug = Cvar_Get( "fs_debug", "0", 0 ); - fs_copyfiles = Cvar_Get( "fs_copyfiles", "0", CVAR_INIT ); - fs_cdpath = Cvar_Get ("fs_cdpath", Sys_DefaultCDPath(), CVAR_INIT ); - fs_basepath = Cvar_Get ("fs_basepath", Sys_DefaultBasePath(), CVAR_INIT ); - fs_gamedirvar = Cvar_Get ("fs_game", "base", CVAR_INIT|CVAR_SERVERINFO ); - fs_restrict = Cvar_Get ("fs_restrict", "", CVAR_INIT ); - - gi_handles = new gi_handleTable[MAX_FILE_HANDLES]; - for (int f = 0; f < MAX_FILE_HANDLES; ++f) - { - fsh[f].used = false; - gi_handles[f].used = false; - } - - zi_stackBase = (char*)Z_Malloc(ZI_STACKSIZE, TAG_FILESYS, qfalse); - - GOBMemoryFuncSet mem; - mem.alloc = gi_alloc; - mem.free = gi_free; - - GOBFileSysFuncSet file; - file.close = gi_close; - file.open = gi_open; - file.read = gi_read; - file.seek = gi_seek; - file.write = NULL; - - GOBCacheFileFuncSet cache; - cache.close = cache_close; - cache.open = cache_open; - cache.read = cache_read; - cache.seek = cache_seek; - cache.write = cache_write; - - GOBCodecFuncSet codec = { - 2, // codecs - { - { // Codec 0 - zlib - 'z', GOB_INFINITE_RATIO, // tag, ratio (ratio is meaningless for decomp) - NULL, - gi_decompress_zlib, - }, - { // Codec 1 - null - '0', GOB_INFINITE_RATIO, // tag, ratio (ratio is meaningless for decomp) - NULL, - gi_decompress_null, - }, - } - }; - - if ( - GOBInit(&mem, &file, &codec, NULL) - != GOBERR_OK) - { - Com_Error( ERR_FATAL, "Could not initialize GOB" ); - } - - char* archive = FS_BuildOSPath( "assets" ); - if (GOBArchiveOpen(archive, GOBACCESS_READ, GOB_FALSE, GOB_TRUE) != GOBERR_OK) - { -#if defined(FINAL_BUILD) - /* - extern void ERR_DiscFail(bool); - ERR_DiscFail(false); - */ -#else - //Com_Error( ERR_FATAL, "Could not initialize GOB" ); - Cvar_Set("fs_openorder", "1"); -#endif - } - - GOBSetCacheSize(1); - GOBSetReadBufferSize(32 * 1024); - -#ifdef GOB_PROFILE - GOBProfileFuncSet profile = { - gi_profileread - }; - GOBSetProfileFuncs(&profile); - GOBStartProfile(); -#endif - - Com_Printf( "----------------------\n" ); -} - -/* -============================ - -DIRECTORY SCANNING FUCNTIONS - -============================ -*/ - -#define MAX_FOUND_FILES 0x1000 - -/* -================== -FS_AddFileToList -================== -*/ -static int FS_AddFileToList( char *name, char *list[MAX_FOUND_FILES], int nfiles ) { - int i; - - if ( nfiles == MAX_FOUND_FILES - 1 ) { - return nfiles; - } - for ( i = 0 ; i < nfiles ; i++ ) { - if ( !stricmp( name, list[i] ) ) { - return nfiles; // allready in list - } - } -// list[nfiles] = CopyString( name ); - list[nfiles] = (char *) Z_Malloc( strlen(name) + 1, TAG_LISTFILES, qfalse ); - strcpy(list[nfiles], name); - nfiles++; - - return nfiles; -} - -/* -=============== -FS_ListFiles - -Returns a uniqued list of files that match the given criteria -from all search paths -=============== -*/ -char **FS_ListFiles( const char *path, const char *extension, int *numfiles ) -{ - char *netpath; - int numSysFiles; - char **sysFiles; - char *name; - int nfiles = 0; - char **listCopy; - char *list[MAX_FOUND_FILES]; - int i; - - FS_CheckInit(); - - if ( !path ) { - *numfiles = 0; - return NULL; - } - - // We don't do any fancy searchpath magic here, it's all in the meta-file - // that Sys_ListFiles will return - netpath = FS_BuildOSPath( path ); -#ifdef _JK2MP - sysFiles = Sys_ListFiles( netpath, extension, NULL, &numSysFiles, qfalse ); -#else - sysFiles = Sys_ListFiles( netpath, extension, &numSysFiles, qfalse ); -#endif - for ( i = 0 ; i < numSysFiles ; i++ ) { - // unique the match - name = sysFiles[i]; - nfiles = FS_AddFileToList( name, list, nfiles ); - } - Sys_FreeFileList( sysFiles ); - - // return a copy of the list - *numfiles = nfiles; - - if ( !nfiles ) { - return NULL; - } - - listCopy = (char**)Z_Malloc( ( nfiles + 1 ) * sizeof( *listCopy ), TAG_LISTFILES, qfalse); - for ( i = 0 ; i < nfiles ; i++ ) { - listCopy[i] = list[i]; - } - listCopy[i] = NULL; - - return listCopy; -} - - -/* -================= -FS_FreeFileList -================= -*/ -void FS_FreeFileList( char **filelist ) -{ - int i; - - FS_CheckInit(); - - if ( !filelist ) { - return; - } - - for ( i = 0 ; filelist[i] ; i++ ) { - Z_Free( filelist[i] ); - } - - Z_Free( filelist ); -} - -/* -=============== -FS_AddFileToListBuf -=============== -*/ -static int FS_AddFileToListBuf( char *name, char *listbuf, int bufsize, int nfiles ) -{ - char *p; - - if ( nfiles == MAX_FOUND_FILES - 1 ) { - return nfiles; - } - - if (name[0] == '/' || name[0] == '\\') { - name++; - } - - p = listbuf; - while ( *p ) { - if ( !stricmp( name, p ) ) { - return nfiles; // already in list - } - p += strlen( p ) + 1; - } - - if ( ( p + strlen( name ) + 2 - listbuf ) > bufsize ) { - return nfiles; // list is full - } - - strcpy( p, name ); - p += strlen( p ) + 1; - *p = 0; - - return nfiles + 1; -} - -/* -================ -FS_GetFileList - -Returns a uniqued list of files that match the given criteria -from all search paths -================ -*/ -int FS_GetFileList( const char *path, const char *extension, char *listbuf, int bufsize ) -{ - int nfiles = 0; - int i; - char *netpath; - int numSysFiles; - char **sysFiles; - char *name; - - FS_CheckInit(); - - if ( !path ) { - return 0; - } - if ( !extension ) { - extension = ""; - } - - // Prime the file list buffer - listbuf[0] = '\0'; - netpath = FS_BuildOSPath( path ); -#ifdef _JK2MP - sysFiles = Sys_ListFiles( netpath, extension, NULL, &numSysFiles, qfalse ); -#else - sysFiles = Sys_ListFiles( netpath, extension, &numSysFiles, qfalse ); -#endif - for ( i = 0 ; i < numSysFiles ; i++ ) { - // unique the match - name = sysFiles[i]; - nfiles = FS_AddFileToListBuf( name, listbuf, bufsize, nfiles ); - } - Sys_FreeFileList( sysFiles ); - - return nfiles; -} - -/* -================= - Filesytem STUBS -================= -*/ - -qboolean FS_ConditionalRestart(int checksumFeed) -{ - return qfalse; -} - -void FS_ClearPakReferences(int flags) -{ - return; -} - -const char *FS_LoadedPakNames(void) -{ - return ""; -} - -const char *FS_ReferencedPakNames(void) -{ - return ""; -} - -void FS_SetRestrictions(void) -{ - return; -} - -#ifdef _JK2MP -void FS_Restart(int checksumFeed) -#else -void FS_Restart(void) -#endif -{ - return; -} - -qboolean FS_FileExists(const char *file) -{ - assert(!"FS_FileExists not implemented on Xbox"); - return qfalse; -} - -void FS_UpdateGamedir(void) -{ - return; -} - -void FS_PureServerSetReferencedPaks(const char *pakSums, const char *pakNames) -{ - return; -} - -void FS_PureServerSetLoadedPaks(const char *pakSums, const char *pakNames) -{ - return; -} - -const char *FS_ReferencedPakChecksums(void) -{ - return ""; -} - -const char *FS_LoadedPakChecksums(void) -{ - return ""; -} diff --git a/code/qcommon/matcomp.cpp b/code/qcommon/matcomp.cpp index 499f9d6de7..0be0fdb478 100644 --- a/code/qcommon/matcomp.cpp +++ b/code/qcommon/matcomp.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#include "q_shared.h" #include "matcomp.h" #include #include @@ -61,7 +84,9 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_X; val=(int)(mat[1][3]/MC_SCALE_Y); val+=1<<(MC_BITS_Y-1); @@ -69,7 +94,9 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_Y; val=(int)(mat[2][3]/MC_SCALE_Z); val+=1<<(MC_BITS_Z-1); @@ -77,8 +104,9 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_Z; val=(int)(mat[0][0]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -86,7 +114,9 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V11; val=(int)(mat[0][1]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -94,7 +124,9 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V12; val=(int)(mat[0][2]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -102,8 +134,9 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V13; val=(int)(mat[1][0]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -111,7 +144,9 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V21; val=(int)(mat[1][1]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -119,7 +154,9 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V22; val=(int)(mat[1][2]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -127,7 +164,9 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V23; val=(int)(mat[2][0]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -135,7 +174,9 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V31; val=(int)(mat[2][1]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -143,7 +184,9 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V32; val=(int)(mat[2][2]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -151,12 +194,14 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V33; + + // I added this because the line above actually ORs data into an int at the 22 byte (from 0), and therefore + // technically is writing beyond the 24th byte of the output array. This *should* be harmless if the OR'd-in value + // doesn't change those bytes, but BoundsChecker says that it's accessing undefined memory (which it does, + // sometimes). This is probably bad, so... memcpy(_comp,comp,MC_COMP_BYTES); } @@ -231,7 +276,7 @@ void MC_UnCompressQuat(float mat[3][4],const unsigned char * comp) float fTyy; float fTyz; float fTzz; - + const unsigned short *pwIn = (unsigned short *) comp; w = *pwIn++; diff --git a/code/qcommon/md4.cpp b/code/qcommon/md4.cpp index ac0414252e..9cc543934e 100644 --- a/code/qcommon/md4.cpp +++ b/code/qcommon/md4.cpp @@ -1,291 +1,212 @@ /* -This file is part of Jedi Academy. +mdfour.c - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +An implementation of MD4 designed for use in the samba SMB +authentication protocol - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +Copyright (C) 1997-1998 Andrew Tridgell - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to: + +Free Software Foundation, Inc. +59 Temple Place - Suite 330 +Boston, MA 02111-1307, USA + +$Id: mdfour.c,v 1.1 2002/08/23 22:03:27 abster Exp $ */ -// Copyright 2001-2013 Raven Software - -/* GLOBAL.H - RSAREF types and constants */ - -#include - -/* POINTER defines a generic pointer type */ -typedef unsigned char *POINTER; - -/* UINT2 defines a two byte word */ -typedef unsigned short int UINT2; - -/* UINT4 defines a four byte word */ -typedef unsigned long int UINT4; - - -/* MD4.H - header file for MD4C.C */ - -/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. - -All rights reserved. - -License to copy and use this software is granted provided that it is identified as the “RSA Data Security, Inc. MD4 Message-Digest Algorithm” in all material mentioning or referencing this software or this function. -License is also granted to make and use derivative works provided that such works are identified as “derived from the RSA Data Security, Inc. MD4 Message-Digest Algorithm” in all material mentioning or referencing the derived work. -RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided “as is” without express or implied warranty of any kind. - -These notices must be retained in any copies of any part of this documentation and/or software. */ - -/* MD4 context. */ -typedef struct { - UINT4 state[4]; /* state (ABCD) */ - UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ - unsigned char buffer[64]; /* input buffer */ -} MD4_CTX; - -void MD4Init (MD4_CTX *); -void MD4Update (MD4_CTX *, const unsigned char *, unsigned int); -void MD4Final (unsigned char [16], MD4_CTX *); - - - -/* MD4C.C - RSA Data Security, Inc., MD4 message-digest algorithm */ -/* Copyright (C) 1990-2, RSA Data Security, Inc. All rights reserved. - -License to copy and use this software is granted provided that it is identified as the -RSA Data Security, Inc. MD4 Message-Digest Algorithm - in all material mentioning or referencing this software or this function. -License is also granted to make and use derivative works provided that such works are identified as -derived from the RSA Data Security, Inc. MD4 Message-Digest Algorithm -in all material mentioning or referencing the derived work. -RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided -as is without express or implied warranty of any kind. - -These notices must be retained in any copies of any part of this documentation and/or software. */ - -/* Constants for MD4Transform routine. */ -#define S11 3 -#define S12 7 -#define S13 11 -#define S14 19 -#define S21 3 -#define S22 5 -#define S23 9 -#define S24 13 -#define S31 3 -#define S32 9 -#define S33 11 -#define S34 15 - -static void MD4Transform (UINT4 [4], const unsigned char [64]); -static void Encode (unsigned char *, UINT4 *, unsigned int); -static void Decode (UINT4 *, const unsigned char *, unsigned int); - -static unsigned char PADDING[64] = { -0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -/* F, G and H are basic MD4 functions. */ -#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) -#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) -#define H(x, y, z) ((x) ^ (y) ^ (z)) - -/* ROTATE_LEFT rotates x left n bits. */ -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) - -/* FF, GG and HH are transformations for rounds 1, 2 and 3 */ -/* Rotation is separate from addition to prevent recomputation */ -#define FF(a, b, c, d, x, s) {(a) += F ((b), (c), (d)) + (x); (a) = ROTATE_LEFT ((a), (s));} - -#define GG(a, b, c, d, x, s) {(a) += G ((b), (c), (d)) + (x) + (UINT4)0x5a827999; (a) = ROTATE_LEFT ((a), (s));} - -#define HH(a, b, c, d, x, s) {(a) += H ((b), (c), (d)) + (x) + (UINT4)0x6ed9eba1; (a) = ROTATE_LEFT ((a), (s));} - - -/* MD4 initialization. Begins an MD4 operation, writing a new context. */ -void MD4Init (MD4_CTX *context) -{ - context->count[0] = context->count[1] = 0; -/* Load magic initialization constants.*/ -context->state[0] = 0x67452301; -context->state[1] = 0xefcdab89; -context->state[2] = 0x98badcfe; -context->state[3] = 0x10325476; -} +#include "q_shared.h" +#include "qcommon.h" -/* MD4 block update operation. Continues an MD4 message-digest operation, processing another message block, and updating the context. */ -void MD4Update (MD4_CTX *context, const unsigned char *input, unsigned int inputLen) +typedef struct mdfour_s { - unsigned int i, index, partLen; + uint32_t A, B, C, D; + uint32_t totalN; +} mdfour_ctx; - /* Compute number of bytes mod 64 */ - index = (unsigned int)((context->count[0] >> 3) & 0x3F); - /* Update number of bits */ - if ((context->count[0] += ((UINT4)inputLen << 3))< ((UINT4)inputLen << 3)) - context->count[1]++; +/* NOTE: This code makes no attempt to be fast! - context->count[1] += ((UINT4)inputLen >> 29); +It assumes that an int is at least 32 bits long +*/ - partLen = 64 - index; +static mdfour_ctx *m; - /* Transform as many times as possible.*/ - if (inputLen >= partLen) - { - memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen); - MD4Transform (context->state, context->buffer); +#define F(X,Y,Z) (((X)&(Y)) | ((~(X))&(Z))) +#define G(X,Y,Z) (((X)&(Y)) | ((X)&(Z)) | ((Y)&(Z))) +#define H(X,Y,Z) ((X)^(Y)^(Z)) +#define lshift(x,s) (((x)<<(s)) | ((x)>>(32-(s)))) - for (i = partLen; i + 63 < inputLen; i += 64) - MD4Transform (context->state, &input[i]); +#define ROUND1(a,b,c,d,k,s) a = lshift(a + F(b,c,d) + X[k], s) +#define ROUND2(a,b,c,d,k,s) a = lshift(a + G(b,c,d) + X[k] + 0x5A827999,s) +#define ROUND3(a,b,c,d,k,s) a = lshift(a + H(b,c,d) + X[k] + 0x6ED9EBA1,s) - index = 0; - } - else - i = 0; +/* this applies md4 to 64 byte chunks */ +static void mdfour64( uint32_t *M ) +{ + int j; + uint32_t AA, BB, CC, DD; + uint32_t X[16]; + uint32_t A, B, C, D; + + for ( j = 0; j<16; j++ ) + X[j] = M[j]; + + A = m->A; B = m->B; C = m->C; D = m->D; + AA = A; BB = B; CC = C; DD = D; + + ROUND1( A, B, C, D, 0, 3 ); ROUND1( D, A, B, C, 1, 7 ); + ROUND1( C, D, A, B, 2, 11 ); ROUND1( B, C, D, A, 3, 19 ); + ROUND1( A, B, C, D, 4, 3 ); ROUND1( D, A, B, C, 5, 7 ); + ROUND1( C, D, A, B, 6, 11 ); ROUND1( B, C, D, A, 7, 19 ); + ROUND1( A, B, C, D, 8, 3 ); ROUND1( D, A, B, C, 9, 7 ); + ROUND1( C, D, A, B, 10, 11 ); ROUND1( B, C, D, A, 11, 19 ); + ROUND1( A, B, C, D, 12, 3 ); ROUND1( D, A, B, C, 13, 7 ); + ROUND1( C, D, A, B, 14, 11 ); ROUND1( B, C, D, A, 15, 19 ); + + ROUND2( A, B, C, D, 0, 3 ); ROUND2( D, A, B, C, 4, 5 ); + ROUND2( C, D, A, B, 8, 9 ); ROUND2( B, C, D, A, 12, 13 ); + ROUND2( A, B, C, D, 1, 3 ); ROUND2( D, A, B, C, 5, 5 ); + ROUND2( C, D, A, B, 9, 9 ); ROUND2( B, C, D, A, 13, 13 ); + ROUND2( A, B, C, D, 2, 3 ); ROUND2( D, A, B, C, 6, 5 ); + ROUND2( C, D, A, B, 10, 9 ); ROUND2( B, C, D, A, 14, 13 ); + ROUND2( A, B, C, D, 3, 3 ); ROUND2( D, A, B, C, 7, 5 ); + ROUND2( C, D, A, B, 11, 9 ); ROUND2( B, C, D, A, 15, 13 ); + + ROUND3( A, B, C, D, 0, 3 ); ROUND3( D, A, B, C, 8, 9 ); + ROUND3( C, D, A, B, 4, 11 ); ROUND3( B, C, D, A, 12, 15 ); + ROUND3( A, B, C, D, 2, 3 ); ROUND3( D, A, B, C, 10, 9 ); + ROUND3( C, D, A, B, 6, 11 ); ROUND3( B, C, D, A, 14, 15 ); + ROUND3( A, B, C, D, 1, 3 ); ROUND3( D, A, B, C, 9, 9 ); + ROUND3( C, D, A, B, 5, 11 ); ROUND3( B, C, D, A, 13, 15 ); + ROUND3( A, B, C, D, 3, 3 ); ROUND3( D, A, B, C, 11, 9 ); + ROUND3( C, D, A, B, 7, 11 ); ROUND3( B, C, D, A, 15, 15 ); + + A += AA; B += BB; C += CC; D += DD; + + for ( j = 0; j<16; j++ ) + X[j] = 0; + + m->A = A; m->B = B; m->C = C; m->D = D; +} - /* Buffer remaining input */ - memcpy ((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen-i); +static void copy64( uint32_t *M, byte *in ) +{ + int i; + + for ( i = 0; i<16; i++ ) + M[i] = (in[i * 4 + 3] << 24) | (in[i * 4 + 2] << 16) | + (in[i * 4 + 1] << 8) | (in[i * 4 + 0] << 0); } +static void copy4( byte *out, uint32_t x ) +{ + out[0] = x & 0xFF; + out[1] = (x >> 8) & 0xFF; + out[2] = (x >> 16) & 0xFF; + out[3] = (x >> 24) & 0xFF; +} -/* MD4 finalization. Ends an MD4 message-digest operation, writing the the message digest and zeroizing the context. */ -void MD4Final (unsigned char digest[16], MD4_CTX *context) +void mdfour_begin( mdfour_ctx *md ) { - unsigned char bits[8]; - unsigned int index, padLen; + md->A = 0x67452301; + md->B = 0xefcdab89; + md->C = 0x98badcfe; + md->D = 0x10325476; + md->totalN = 0; +} - /* Save number of bits */ - Encode (bits, context->count, 8); - /* Pad out to 56 mod 64.*/ - index = (unsigned int)((context->count[0] >> 3) & 0x3f); - padLen = (index < 56) ? (56 - index) : (120 - index); - MD4Update (context, PADDING, padLen); +static void mdfour_tail( byte *in, int n ) +{ + byte buf[128]; + uint32_t M[16]; + uint32_t b; - /* Append length (before padding) */ - MD4Update (context, bits, 8); - - /* Store state in digest */ - Encode (digest, context->state, 16); + m->totalN += n; - /* Zeroize sensitive information.*/ - memset ((POINTER)context, 0, sizeof (*context)); -} + b = m->totalN * 8; + Com_Memset( buf, 0, 128 ); + if ( n ) Com_Memcpy( buf, in, n ); + buf[n] = 0x80; -/* MD4 basic transformation. Transforms state based on block. */ -static void MD4Transform (UINT4 state[4], const unsigned char block[64]) -{ - UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; - - Decode (x, block, 64); - -/* Round 1 */ -FF (a, b, c, d, x[ 0], S11); /* 1 */ -FF (d, a, b, c, x[ 1], S12); /* 2 */ -FF (c, d, a, b, x[ 2], S13); /* 3 */ -FF (b, c, d, a, x[ 3], S14); /* 4 */ -FF (a, b, c, d, x[ 4], S11); /* 5 */ -FF (d, a, b, c, x[ 5], S12); /* 6 */ -FF (c, d, a, b, x[ 6], S13); /* 7 */ -FF (b, c, d, a, x[ 7], S14); /* 8 */ -FF (a, b, c, d, x[ 8], S11); /* 9 */ -FF (d, a, b, c, x[ 9], S12); /* 10 */ -FF (c, d, a, b, x[10], S13); /* 11 */ -FF (b, c, d, a, x[11], S14); /* 12 */ -FF (a, b, c, d, x[12], S11); /* 13 */ -FF (d, a, b, c, x[13], S12); /* 14 */ -FF (c, d, a, b, x[14], S13); /* 15 */ -FF (b, c, d, a, x[15], S14); /* 16 */ - -/* Round 2 */ -GG (a, b, c, d, x[ 0], S21); /* 17 */ -GG (d, a, b, c, x[ 4], S22); /* 18 */ -GG (c, d, a, b, x[ 8], S23); /* 19 */ -GG (b, c, d, a, x[12], S24); /* 20 */ -GG (a, b, c, d, x[ 1], S21); /* 21 */ -GG (d, a, b, c, x[ 5], S22); /* 22 */ -GG (c, d, a, b, x[ 9], S23); /* 23 */ -GG (b, c, d, a, x[13], S24); /* 24 */ -GG (a, b, c, d, x[ 2], S21); /* 25 */ -GG (d, a, b, c, x[ 6], S22); /* 26 */ -GG (c, d, a, b, x[10], S23); /* 27 */ -GG (b, c, d, a, x[14], S24); /* 28 */ -GG (a, b, c, d, x[ 3], S21); /* 29 */ -GG (d, a, b, c, x[ 7], S22); /* 30 */ -GG (c, d, a, b, x[11], S23); /* 31 */ -GG (b, c, d, a, x[15], S24); /* 32 */ - -/* Round 3 */ -HH (a, b, c, d, x[ 0], S31); /* 33 */ -HH (d, a, b, c, x[ 8], S32); /* 34 */ -HH (c, d, a, b, x[ 4], S33); /* 35 */ -HH (b, c, d, a, x[12], S34); /* 36 */ -HH (a, b, c, d, x[ 2], S31); /* 37 */ -HH (d, a, b, c, x[10], S32); /* 38 */ -HH (c, d, a, b, x[ 6], S33); /* 39 */ -HH (b, c, d, a, x[14], S34); /* 40 */ -HH (a, b, c, d, x[ 1], S31); /* 41 */ -HH (d, a, b, c, x[ 9], S32); /* 42 */ -HH (c, d, a, b, x[ 5], S33); /* 43 */ -HH (b, c, d, a, x[13], S34); /* 44 */ -HH (a, b, c, d, x[ 3], S31); /* 45 */ -HH (d, a, b, c, x[11], S32); /* 46 */ -HH (c, d, a, b, x[ 7], S33); /* 47 */ -HH (b, c, d, a, x[15], S34); /* 48 */ - -state[0] += a; -state[1] += b; -state[2] += c; -state[3] += d; - - /* Zeroize sensitive information.*/ - memset ((POINTER)x, 0, sizeof (x)); + if ( n <= 55 ) + { + copy4( buf + 56, b ); + copy64( M, buf ); + mdfour64( M ); + } + else + { + copy4( buf + 120, b ); + copy64( M, buf ); + mdfour64( M ); + copy64( M, buf + 64 ); + mdfour64( M ); + } } - -/* Encodes input (UINT4) into output (unsigned char). Assumes len is a multiple of 4. */ -static void Encode (unsigned char *output, UINT4 *input, unsigned int len) +static void mdfour_update( mdfour_ctx *md, byte *in, int n ) { - unsigned int i, j; + uint32_t M[16]; - for (i = 0, j = 0; j < len; i++, j += 4) { - output[j] = (unsigned char)(input[i] & 0xff); - output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); - output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); - output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); + m = md; + + if ( n == 0 ) mdfour_tail( in, n ); + + while ( n >= 64 ) + { + copy64( M, in ); + mdfour64( M ); + in += 64; + n -= 64; + m->totalN += 64; } + + mdfour_tail( in, n ); } -/* Decodes input (unsigned char) into output (UINT4). Assumes len is a multiple of 4. */ -static void Decode (UINT4 *output, const unsigned char *input, unsigned int len) +static void mdfour_result( mdfour_ctx *md, byte *out ) { -unsigned int i, j; + m = md; -for (i = 0, j = 0; j < len; i++, j += 4) - output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24); + copy4( out, m->A ); + copy4( out + 4, m->B ); + copy4( out + 8, m->C ); + copy4( out + 12, m->D ); +} + +static void mdfour( byte *out, byte *in, int n ) +{ + mdfour_ctx md; + mdfour_begin( &md ); + mdfour_update( &md, in, n ); + mdfour_result( &md, out ); } //=================================================================== -unsigned Com_BlockChecksum (void const *buffer, int length) +unsigned Com_BlockChecksum( const void *buffer, int length ) { - int digest[4]; + int digest[4]; unsigned val; - MD4_CTX ctx; - MD4Init (&ctx); - MD4Update (&ctx, (unsigned char *)buffer, length); - MD4Final ( (unsigned char *)digest, &ctx); - + mdfour( (byte *)digest, (byte *)buffer, length ); + val = digest[0] ^ digest[1] ^ digest[2] ^ digest[3]; return val; diff --git a/code/qcommon/msg.cpp b/code/qcommon/msg.cpp index 31fa14a1f7..ea8df4f2b0 100644 --- a/code/qcommon/msg.cpp +++ b/code/qcommon/msg.cpp @@ -1,27 +1,30 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "q_shared.h" #include "qcommon.h" #include "../server/server.h" - - /* ============================================================================== diff --git a/code/qcommon/net_chan.cpp b/code/qcommon/net_chan.cpp index 0cce6e98b1..337427b2e4 100644 --- a/code/qcommon/net_chan.cpp +++ b/code/qcommon/net_chan.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "q_shared.h" #include "qcommon.h" @@ -87,7 +92,7 @@ void Netchan_Init( int port ) { { loopbacks = (loopback_t*) Z_Malloc(sizeof(loopback_t) * 2, TAG_NEWDEL, qtrue); } - + port &= 0xffff; showpackets = Cvar_Get ("showpackets", "0", CVAR_TEMP ); showdrop = Cvar_Get ("showdrop", "0", CVAR_TEMP ); @@ -112,7 +117,7 @@ called to open a channel to a remote system */ void Netchan_Setup( netsrc_t sock, netchan_t *chan, netadr_t adr, int qport ) { memset (chan, 0, sizeof(*chan)); - + chan->sock = sock; chan->remoteAddress = adr; chan->qport = qport; @@ -228,7 +233,7 @@ qboolean Netchan_Process( netchan_t *chan, msg_t *msg ) { int fragmentStart, fragmentLength; qboolean fragmented; - // get sequence numbers + // get sequence numbers MSG_BeginReading( msg ); sequence = MSG_ReadLong( msg ); sequence_ack = MSG_ReadLong( msg ); @@ -297,14 +302,14 @@ qboolean Netchan_Process( netchan_t *chan, msg_t *msg ) { , sequence ); } } - + // // if this is the final framgent of a reliable message, - // bump incoming_reliable_sequence + // bump incoming_reliable_sequence // if ( fragmented ) { - // make sure we + // make sure we if ( sequence != chan->fragmentSequence ) { chan->fragmentSequence = sequence; chan->fragmentLength = 0; @@ -332,7 +337,7 @@ qboolean Netchan_Process( netchan_t *chan, msg_t *msg ) { return qfalse; } - memcpy( chan->fragmentBuffer + chan->fragmentLength, + memcpy( chan->fragmentBuffer + chan->fragmentLength, msg->data + msg->readcount, fragmentLength ); chan->fragmentLength += fragmentLength; @@ -450,7 +455,8 @@ qboolean NET_GetLoopPacket (netsrc_t sock, netadr_t *net_from, msg_t *net_messag } //Get length of packet. - int length = *(int*)(loop->loopData + i); + byteAlias_t *ba = (byteAlias_t *)&loop->loopData[i]; + const int length = ba->i; i += 4; //See if entire packet is at end of buffer or part is at the beginning. @@ -464,7 +470,7 @@ qboolean NET_GetLoopPacket (netsrc_t sock, netadr_t *net_from, msg_t *net_messag //Doesn't all fit, partial copy const int copyToEnd = MAX_LOOPDATA - i; memcpy (net_message->data, loop->loopData + i, copyToEnd); - memcpy ((char*)net_message->data + copyToEnd, + memcpy ((char*)net_message->data + copyToEnd, loop->loopData, length - copyToEnd); net_message->cursize = length; loop->get = length - copyToEnd; @@ -485,6 +491,7 @@ void NET_SendLoopPacket (netsrc_t sock, int length, const void *data, netadr_t t loop = &loopbacks[sock^1]; //Make sure there is enough free space in the buffer. +#ifdef _DEBUG int freeSpace; if(loop->send >= loop->get) { freeSpace = MAX_LOOPDATA - (loop->send - loop->get); @@ -493,6 +500,7 @@ void NET_SendLoopPacket (netsrc_t sock, int length, const void *data, netadr_t t } assert(freeSpace > length); +#endif // _DEBUG //Get write position. Wrap around if too close to end. i = loop->send; @@ -501,7 +509,8 @@ void NET_SendLoopPacket (netsrc_t sock, int length, const void *data, netadr_t t } //Write length of packet. - *(int*)(loop->loopData + i) = length; + byteAlias_t *ba = (byteAlias_t *)&loop->loopData[i]; + ba->i = length; i += 4; //See if the whole packet will fit on the end of the buffer or if we @@ -515,7 +524,7 @@ void NET_SendLoopPacket (netsrc_t sock, int length, const void *data, netadr_t t //Doesn't all fit, partial copy int copyToEnd = MAX_LOOPDATA - i; memcpy(loop->loopData + i, data, copyToEnd); - memcpy(loop->loopData, (char*)data + copyToEnd, length - copyToEnd); + memcpy(loop->loopData, (char*)data + copyToEnd, length - copyToEnd); loop->send = length - copyToEnd; } } diff --git a/code/qcommon/persistence.cpp b/code/qcommon/persistence.cpp index 9466584c0f..8a559b09fb 100644 --- a/code/qcommon/persistence.cpp +++ b/code/qcommon/persistence.cpp @@ -1,3 +1,23 @@ +/* +=========================================================================== +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "q_shared.h" #include "qcommon.h" diff --git a/code/qcommon/q_math.cpp b/code/qcommon/q_math.cpp index 3fca7e6ca2..c37dd8fcfe 100644 --- a/code/qcommon/q_math.cpp +++ b/code/qcommon/q_math.cpp @@ -1,24 +1,29 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // q_math.c -- stateless support routines that are included in each code module -// leave this at the top for PCH reasons... #include "../game/common_headers.h" const vec3_t vec3_origin = {0,0,0}; @@ -110,109 +115,102 @@ vec4_t colorTable[CT_MAX] = }; vec4_t g_color_table[Q_COLOR_BITS+1] = { - { 0.0, 0.0, 0.0, 1.0 }, // black - { 1.0, 0.0, 0.0, 1.0 }, // red - { 0.0, 1.0, 0.0, 1.0 }, // green - { 1.0, 1.0, 0.0, 1.0 }, // yellow - { 0.0, 0.0, 1.0, 1.0 }, // blue - { 0.0, 1.0, 1.0, 1.0 }, // cyan - { 1.0, 0.0, 1.0, 1.0 }, // magenta - { 1.0, 1.0, 1.0, 1.0 }, // white - { 1.0, 0.5, 0.0, 1.0 }, // orange - { 0.5, 0.5, 0.5, 1.0 }, // md.grey + { 0.0f, 0.0f, 0.0f, 1.0f }, // black + { 1.0f, 0.0f, 0.0f, 1.0f }, // red + { 0.0f, 1.0f, 0.0f, 1.0f }, // green + { 1.0f, 1.0f, 0.0f, 1.0f }, // yellow + { 0.0f, 0.0f, 1.0f, 1.0f }, // blue + { 0.0f, 1.0f, 1.0f, 1.0f }, // cyan + { 1.0f, 0.0f, 1.0f, 1.0f }, // magenta + { 1.0f, 1.0f, 1.0f, 1.0f }, // white + { 1.0f, 0.5f, 0.0f, 1.0f }, // orange + { 0.5f, 0.5f, 0.5f, 1.0f }, // md.grey }; -#ifdef _MSC_VER -#pragma warning(disable : 4305) // truncation from const double to float -#endif - vec3_t bytedirs[NUMVERTEXNORMALS] = { -{-0.525731, 0.000000, 0.850651}, {-0.442863, 0.238856, 0.864188}, -{-0.295242, 0.000000, 0.955423}, {-0.309017, 0.500000, 0.809017}, -{-0.162460, 0.262866, 0.951056}, {0.000000, 0.000000, 1.000000}, -{0.000000, 0.850651, 0.525731}, {-0.147621, 0.716567, 0.681718}, -{0.147621, 0.716567, 0.681718}, {0.000000, 0.525731, 0.850651}, -{0.309017, 0.500000, 0.809017}, {0.525731, 0.000000, 0.850651}, -{0.295242, 0.000000, 0.955423}, {0.442863, 0.238856, 0.864188}, -{0.162460, 0.262866, 0.951056}, {-0.681718, 0.147621, 0.716567}, -{-0.809017, 0.309017, 0.500000},{-0.587785, 0.425325, 0.688191}, -{-0.850651, 0.525731, 0.000000},{-0.864188, 0.442863, 0.238856}, -{-0.716567, 0.681718, 0.147621},{-0.688191, 0.587785, 0.425325}, -{-0.500000, 0.809017, 0.309017}, {-0.238856, 0.864188, 0.442863}, -{-0.425325, 0.688191, 0.587785}, {-0.716567, 0.681718, -0.147621}, -{-0.500000, 0.809017, -0.309017}, {-0.525731, 0.850651, 0.000000}, -{0.000000, 0.850651, -0.525731}, {-0.238856, 0.864188, -0.442863}, -{0.000000, 0.955423, -0.295242}, {-0.262866, 0.951056, -0.162460}, -{0.000000, 1.000000, 0.000000}, {0.000000, 0.955423, 0.295242}, -{-0.262866, 0.951056, 0.162460}, {0.238856, 0.864188, 0.442863}, -{0.262866, 0.951056, 0.162460}, {0.500000, 0.809017, 0.309017}, -{0.238856, 0.864188, -0.442863},{0.262866, 0.951056, -0.162460}, -{0.500000, 0.809017, -0.309017},{0.850651, 0.525731, 0.000000}, -{0.716567, 0.681718, 0.147621}, {0.716567, 0.681718, -0.147621}, -{0.525731, 0.850651, 0.000000}, {0.425325, 0.688191, 0.587785}, -{0.864188, 0.442863, 0.238856}, {0.688191, 0.587785, 0.425325}, -{0.809017, 0.309017, 0.500000}, {0.681718, 0.147621, 0.716567}, -{0.587785, 0.425325, 0.688191}, {0.955423, 0.295242, 0.000000}, -{1.000000, 0.000000, 0.000000}, {0.951056, 0.162460, 0.262866}, -{0.850651, -0.525731, 0.000000},{0.955423, -0.295242, 0.000000}, -{0.864188, -0.442863, 0.238856}, {0.951056, -0.162460, 0.262866}, -{0.809017, -0.309017, 0.500000}, {0.681718, -0.147621, 0.716567}, -{0.850651, 0.000000, 0.525731}, {0.864188, 0.442863, -0.238856}, -{0.809017, 0.309017, -0.500000}, {0.951056, 0.162460, -0.262866}, -{0.525731, 0.000000, -0.850651}, {0.681718, 0.147621, -0.716567}, -{0.681718, -0.147621, -0.716567},{0.850651, 0.000000, -0.525731}, -{0.809017, -0.309017, -0.500000}, {0.864188, -0.442863, -0.238856}, -{0.951056, -0.162460, -0.262866}, {0.147621, 0.716567, -0.681718}, -{0.309017, 0.500000, -0.809017}, {0.425325, 0.688191, -0.587785}, -{0.442863, 0.238856, -0.864188}, {0.587785, 0.425325, -0.688191}, -{0.688191, 0.587785, -0.425325}, {-0.147621, 0.716567, -0.681718}, -{-0.309017, 0.500000, -0.809017}, {0.000000, 0.525731, -0.850651}, -{-0.525731, 0.000000, -0.850651}, {-0.442863, 0.238856, -0.864188}, -{-0.295242, 0.000000, -0.955423}, {-0.162460, 0.262866, -0.951056}, -{0.000000, 0.000000, -1.000000}, {0.295242, 0.000000, -0.955423}, -{0.162460, 0.262866, -0.951056}, {-0.442863, -0.238856, -0.864188}, -{-0.309017, -0.500000, -0.809017}, {-0.162460, -0.262866, -0.951056}, -{0.000000, -0.850651, -0.525731}, {-0.147621, -0.716567, -0.681718}, -{0.147621, -0.716567, -0.681718}, {0.000000, -0.525731, -0.850651}, -{0.309017, -0.500000, -0.809017}, {0.442863, -0.238856, -0.864188}, -{0.162460, -0.262866, -0.951056}, {0.238856, -0.864188, -0.442863}, -{0.500000, -0.809017, -0.309017}, {0.425325, -0.688191, -0.587785}, -{0.716567, -0.681718, -0.147621}, {0.688191, -0.587785, -0.425325}, -{0.587785, -0.425325, -0.688191}, {0.000000, -0.955423, -0.295242}, -{0.000000, -1.000000, 0.000000}, {0.262866, -0.951056, -0.162460}, -{0.000000, -0.850651, 0.525731}, {0.000000, -0.955423, 0.295242}, -{0.238856, -0.864188, 0.442863}, {0.262866, -0.951056, 0.162460}, -{0.500000, -0.809017, 0.309017}, {0.716567, -0.681718, 0.147621}, -{0.525731, -0.850651, 0.000000}, {-0.238856, -0.864188, -0.442863}, -{-0.500000, -0.809017, -0.309017}, {-0.262866, -0.951056, -0.162460}, -{-0.850651, -0.525731, 0.000000}, {-0.716567, -0.681718, -0.147621}, -{-0.716567, -0.681718, 0.147621}, {-0.525731, -0.850651, 0.000000}, -{-0.500000, -0.809017, 0.309017}, {-0.238856, -0.864188, 0.442863}, -{-0.262866, -0.951056, 0.162460}, {-0.864188, -0.442863, 0.238856}, -{-0.809017, -0.309017, 0.500000}, {-0.688191, -0.587785, 0.425325}, -{-0.681718, -0.147621, 0.716567}, {-0.442863, -0.238856, 0.864188}, -{-0.587785, -0.425325, 0.688191}, {-0.309017, -0.500000, 0.809017}, -{-0.147621, -0.716567, 0.681718}, {-0.425325, -0.688191, 0.587785}, -{-0.162460, -0.262866, 0.951056}, {0.442863, -0.238856, 0.864188}, -{0.162460, -0.262866, 0.951056}, {0.309017, -0.500000, 0.809017}, -{0.147621, -0.716567, 0.681718}, {0.000000, -0.525731, 0.850651}, -{0.425325, -0.688191, 0.587785}, {0.587785, -0.425325, 0.688191}, -{0.688191, -0.587785, 0.425325}, {-0.955423, 0.295242, 0.000000}, -{-0.951056, 0.162460, 0.262866}, {-1.000000, 0.000000, 0.000000}, -{-0.850651, 0.000000, 0.525731}, {-0.955423, -0.295242, 0.000000}, -{-0.951056, -0.162460, 0.262866}, {-0.864188, 0.442863, -0.238856}, -{-0.951056, 0.162460, -0.262866}, {-0.809017, 0.309017, -0.500000}, -{-0.864188, -0.442863, -0.238856}, {-0.951056, -0.162460, -0.262866}, -{-0.809017, -0.309017, -0.500000}, {-0.681718, 0.147621, -0.716567}, -{-0.681718, -0.147621, -0.716567}, {-0.850651, 0.000000, -0.525731}, -{-0.688191, 0.587785, -0.425325}, {-0.587785, 0.425325, -0.688191}, -{-0.425325, 0.688191, -0.587785}, {-0.425325, -0.688191, -0.587785}, -{-0.587785, -0.425325, -0.688191}, {-0.688191, -0.587785, -0.425325} +{-0.525731f, 0.000000f, 0.850651f}, {-0.442863f, 0.238856f, 0.864188f}, +{-0.295242f, 0.000000f, 0.955423f}, {-0.309017f, 0.500000f, 0.809017f}, +{-0.162460f, 0.262866f, 0.951056f}, {0.000000f, 0.000000f, 1.000000f}, +{0.000000f, 0.850651f, 0.525731f}, {-0.147621f, 0.716567f, 0.681718f}, +{0.147621f, 0.716567f, 0.681718f}, {0.000000f, 0.525731f, 0.850651f}, +{0.309017f, 0.500000f, 0.809017f}, {0.525731f, 0.000000f, 0.850651f}, +{0.295242f, 0.000000f, 0.955423f}, {0.442863f, 0.238856f, 0.864188f}, +{0.162460f, 0.262866f, 0.951056f}, {-0.681718f, 0.147621f, 0.716567f}, +{-0.809017f, 0.309017f, 0.500000f},{-0.587785f, 0.425325f, 0.688191f}, +{-0.850651f, 0.525731f, 0.000000f},{-0.864188f, 0.442863f, 0.238856f}, +{-0.716567f, 0.681718f, 0.147621f},{-0.688191f, 0.587785f, 0.425325f}, +{-0.500000f, 0.809017f, 0.309017f}, {-0.238856f, 0.864188f, 0.442863f}, +{-0.425325f, 0.688191f, 0.587785f}, {-0.716567f, 0.681718f, -0.147621f}, +{-0.500000f, 0.809017f, -0.309017f}, {-0.525731f, 0.850651f, 0.000000f}, +{0.000000f, 0.850651f, -0.525731f}, {-0.238856f, 0.864188f, -0.442863f}, +{0.000000f, 0.955423f, -0.295242f}, {-0.262866f, 0.951056f, -0.162460f}, +{0.000000f, 1.000000f, 0.000000f}, {0.000000f, 0.955423f, 0.295242f}, +{-0.262866f, 0.951056f, 0.162460f}, {0.238856f, 0.864188f, 0.442863f}, +{0.262866f, 0.951056f, 0.162460f}, {0.500000f, 0.809017f, 0.309017f}, +{0.238856f, 0.864188f, -0.442863f},{0.262866f, 0.951056f, -0.162460f}, +{0.500000f, 0.809017f, -0.309017f},{0.850651f, 0.525731f, 0.000000f}, +{0.716567f, 0.681718f, 0.147621f}, {0.716567f, 0.681718f, -0.147621f}, +{0.525731f, 0.850651f, 0.000000f}, {0.425325f, 0.688191f, 0.587785f}, +{0.864188f, 0.442863f, 0.238856f}, {0.688191f, 0.587785f, 0.425325f}, +{0.809017f, 0.309017f, 0.500000f}, {0.681718f, 0.147621f, 0.716567f}, +{0.587785f, 0.425325f, 0.688191f}, {0.955423f, 0.295242f, 0.000000f}, +{1.000000f, 0.000000f, 0.000000f}, {0.951056f, 0.162460f, 0.262866f}, +{0.850651f, -0.525731f, 0.000000f},{0.955423f, -0.295242f, 0.000000f}, +{0.864188f, -0.442863f, 0.238856f}, {0.951056f, -0.162460f, 0.262866f}, +{0.809017f, -0.309017f, 0.500000f}, {0.681718f, -0.147621f, 0.716567f}, +{0.850651f, 0.000000f, 0.525731f}, {0.864188f, 0.442863f, -0.238856f}, +{0.809017f, 0.309017f, -0.500000f}, {0.951056f, 0.162460f, -0.262866f}, +{0.525731f, 0.000000f, -0.850651f}, {0.681718f, 0.147621f, -0.716567f}, +{0.681718f, -0.147621f, -0.716567f},{0.850651f, 0.000000f, -0.525731f}, +{0.809017f, -0.309017f, -0.500000f}, {0.864188f, -0.442863f, -0.238856f}, +{0.951056f, -0.162460f, -0.262866f}, {0.147621f, 0.716567f, -0.681718f}, +{0.309017f, 0.500000f, -0.809017f}, {0.425325f, 0.688191f, -0.587785f}, +{0.442863f, 0.238856f, -0.864188f}, {0.587785f, 0.425325f, -0.688191f}, +{0.688191f, 0.587785f, -0.425325f}, {-0.147621f, 0.716567f, -0.681718f}, +{-0.309017f, 0.500000f, -0.809017f}, {0.000000f, 0.525731f, -0.850651f}, +{-0.525731f, 0.000000f, -0.850651f}, {-0.442863f, 0.238856f, -0.864188f}, +{-0.295242f, 0.000000f, -0.955423f}, {-0.162460f, 0.262866f, -0.951056f}, +{0.000000f, 0.000000f, -1.000000f}, {0.295242f, 0.000000f, -0.955423f}, +{0.162460f, 0.262866f, -0.951056f}, {-0.442863f, -0.238856f, -0.864188f}, +{-0.309017f, -0.500000f, -0.809017f}, {-0.162460f, -0.262866f, -0.951056f}, +{0.000000f, -0.850651f, -0.525731f}, {-0.147621f, -0.716567f, -0.681718f}, +{0.147621f, -0.716567f, -0.681718f}, {0.000000f, -0.525731f, -0.850651f}, +{0.309017f, -0.500000f, -0.809017f}, {0.442863f, -0.238856f, -0.864188f}, +{0.162460f, -0.262866f, -0.951056f}, {0.238856f, -0.864188f, -0.442863f}, +{0.500000f, -0.809017f, -0.309017f}, {0.425325f, -0.688191f, -0.587785f}, +{0.716567f, -0.681718f, -0.147621f}, {0.688191f, -0.587785f, -0.425325f}, +{0.587785f, -0.425325f, -0.688191f}, {0.000000f, -0.955423f, -0.295242f}, +{0.000000f, -1.000000f, 0.000000f}, {0.262866f, -0.951056f, -0.162460f}, +{0.000000f, -0.850651f, 0.525731f}, {0.000000f, -0.955423f, 0.295242f}, +{0.238856f, -0.864188f, 0.442863f}, {0.262866f, -0.951056f, 0.162460f}, +{0.500000f, -0.809017f, 0.309017f}, {0.716567f, -0.681718f, 0.147621f}, +{0.525731f, -0.850651f, 0.000000f}, {-0.238856f, -0.864188f, -0.442863f}, +{-0.500000f, -0.809017f, -0.309017f}, {-0.262866f, -0.951056f, -0.162460f}, +{-0.850651f, -0.525731f, 0.000000f}, {-0.716567f, -0.681718f, -0.147621f}, +{-0.716567f, -0.681718f, 0.147621f}, {-0.525731f, -0.850651f, 0.000000f}, +{-0.500000f, -0.809017f, 0.309017f}, {-0.238856f, -0.864188f, 0.442863f}, +{-0.262866f, -0.951056f, 0.162460f}, {-0.864188f, -0.442863f, 0.238856f}, +{-0.809017f, -0.309017f, 0.500000f}, {-0.688191f, -0.587785f, 0.425325f}, +{-0.681718f, -0.147621f, 0.716567f}, {-0.442863f, -0.238856f, 0.864188f}, +{-0.587785f, -0.425325f, 0.688191f}, {-0.309017f, -0.500000f, 0.809017f}, +{-0.147621f, -0.716567f, 0.681718f}, {-0.425325f, -0.688191f, 0.587785f}, +{-0.162460f, -0.262866f, 0.951056f}, {0.442863f, -0.238856f, 0.864188f}, +{0.162460f, -0.262866f, 0.951056f}, {0.309017f, -0.500000f, 0.809017f}, +{0.147621f, -0.716567f, 0.681718f}, {0.000000f, -0.525731f, 0.850651f}, +{0.425325f, -0.688191f, 0.587785f}, {0.587785f, -0.425325f, 0.688191f}, +{0.688191f, -0.587785f, 0.425325f}, {-0.955423f, 0.295242f, 0.000000f}, +{-0.951056f, 0.162460f, 0.262866f}, {-1.000000f, 0.000000f, 0.000000f}, +{-0.850651f, 0.000000f, 0.525731f}, {-0.955423f, -0.295242f, 0.000000f}, +{-0.951056f, -0.162460f, 0.262866f}, {-0.864188f, 0.442863f, -0.238856f}, +{-0.951056f, 0.162460f, -0.262866f}, {-0.809017f, 0.309017f, -0.500000f}, +{-0.864188f, -0.442863f, -0.238856f}, {-0.951056f, -0.162460f, -0.262866f}, +{-0.809017f, -0.309017f, -0.500000f}, {-0.681718f, 0.147621f, -0.716567f}, +{-0.681718f, -0.147621f, -0.716567f}, {-0.850651f, 0.000000f, -0.525731f}, +{-0.688191f, 0.587785f, -0.425325f}, {-0.587785f, 0.425325f, -0.688191f}, +{-0.425325f, 0.688191f, -0.587785f}, {-0.425325f, -0.688191f, -0.587785f}, +{-0.587785f, -0.425325f, -0.688191f}, {-0.688191f, -0.587785f, -0.425325f} }; -#ifdef _MSC_VER -#pragma warning(default : 4305) // truncation from const double to float -#endif //============================================================== diff --git a/code/qcommon/q_platform.h b/code/qcommon/q_platform.h index 657873923b..b44790ab4d 100644 --- a/code/qcommon/q_platform.h +++ b/code/qcommon/q_platform.h @@ -1,3 +1,29 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#pragma once + // for windows fastcall option #define QDECL #define QCALL @@ -100,7 +126,7 @@ #ifdef __clang__ #define QINLINE static inline #else - #define QINLINE /*inline*/ + #define QINLINE inline #endif #define PATH_SEP '/' diff --git a/code/qcommon/q_shared.cpp b/code/qcommon/q_shared.cpp index 1f7374033c..627a015c2a 100644 --- a/code/qcommon/q_shared.cpp +++ b/code/qcommon/q_shared.cpp @@ -1,23 +1,29 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + // q_shared.c -- stateless support routines that are included in each code dll -// leave this at the top for PCH reasons... #include "../game/common_headers.h" int Com_Clampi( int min, int max, int value ) @@ -312,6 +318,7 @@ void COM_BeginParseSession( void ) #endif parseData[parseDataCount].com_lines = 1; + parseData[parseDataCount].com_tokenline = 0; } void COM_EndParseSession( void ) @@ -327,6 +334,9 @@ int COM_GetCurrentParseLine( int index ) if(parseDataCount < 0) Com_Error(ERR_FATAL, "COM_GetCurrentParseLine: parseDataCount < 0 (be sure to call COM_BeginParseSession!)"); + if ( parseData[parseDataCount].com_tokenline ) + return parseData[parseDataCount].com_tokenline; + return parseData[parseDataCount].com_lines; } @@ -347,20 +357,20 @@ string will be returned if the next token is a newline. ============== */ -const char *SkipWhitespace( const char *data, qboolean *hasNewLines ) +const char *SkipWhitespace( const char *data, qboolean *hasNewLines ) { int c; if(parseDataCount < 0) Com_Error(ERR_FATAL, "SkipWhitespace: parseDataCount < 0"); - while( (c = *(const unsigned char* /*eurofix*/)data) <= ' ') + while( (c = *(const unsigned char* /*eurofix*/)data) <= ' ') { - if( !c ) + if( !c ) { return NULL; } - if( c == '\n' ) + if( c == '\n' ) { parseData[parseDataCount].com_lines++; *hasNewLines = qtrue; @@ -386,9 +396,9 @@ int COM_Compress( char *data_p ) { } // skip /* */ comments } else if ( c == '/' && in[1] == '*' ) { - while ( *in && ( *in != '*' || in[1] != '/' ) ) + while ( *in && ( *in != '*' || in[1] != '/' ) ) in++; - if ( *in ) + if ( *in ) in += 2; // record when we hit a newline } else if ( c == '\n' || c == '\r' ) { @@ -449,6 +459,8 @@ char *COM_ParseExt( const char **data_p, qboolean allowLineBreaks ) data = *data_p; len = 0; com_token[0] = 0; + if(parseDataCount >= 0) + parseData[parseDataCount].com_tokenline = 0; // make sure incoming data is valid if ( !data ) @@ -481,20 +493,23 @@ char *COM_ParseExt( const char **data_p, qboolean allowLineBreaks ) if ( c == '/' && data[1] == '/' ) { data += 2; - while (*data && *data != '\n') - { + while (*data && *data != '\n') { data++; } } // skip /* */ comments - else if ( c=='/' && data[1] == '*' ) + else if ( c=='/' && data[1] == '*' ) { data += 2; - while ( *data && ( *data != '*' || data[1] != '/' ) ) + while ( *data && ( *data != '*' || data[1] != '/' ) ) { + if ( *data == '\n' ) + { + parseData[parseDataCount].com_lines++; + } data++; } - if ( *data ) + if ( *data ) { data += 2; } @@ -505,6 +520,9 @@ char *COM_ParseExt( const char **data_p, qboolean allowLineBreaks ) } } + // token starts on this line + parseData[parseDataCount].com_tokenline = parseData[parseDataCount].com_lines; + // handle quoted strings if (c == '\"') { @@ -518,6 +536,10 @@ char *COM_ParseExt( const char **data_p, qboolean allowLineBreaks ) *data_p = ( char * ) data; return com_token; } + if ( c == '\n' ) + { + parseData[parseDataCount].com_lines++; + } if (len < MAX_TOKEN_CHARS - 1) { com_token[len] = c; @@ -536,8 +558,6 @@ char *COM_ParseExt( const char **data_p, qboolean allowLineBreaks ) } data++; c = *data; - if ( c == '\n' ) - parseData[parseDataCount].com_lines++; } while (c>32); com_token[len] = 0; @@ -546,6 +566,83 @@ char *COM_ParseExt( const char **data_p, qboolean allowLineBreaks ) return com_token; } +/* +=============== +COM_ParseString +=============== +*/ +qboolean COM_ParseString( const char **data, const char **s ) +{ + *s = COM_ParseExt( data, qfalse ); + if ( s[0] == 0 ) + { + Com_Printf("unexpected EOF in COM_ParseString\n"); + return qtrue; + } + return qfalse; +} + +/* +=============== +COM_ParseInt +=============== +*/ +qboolean COM_ParseInt( const char **data, int *i ) +{ + const char *token; + + token = COM_ParseExt( data, qfalse ); + if ( token[0] == 0 ) + { + Com_Printf( "unexpected EOF in COM_ParseInt\n" ); + return qtrue; + } + + *i = atoi( token ); + return qfalse; +} + +/* +=============== +COM_ParseFloat +=============== +*/ +qboolean COM_ParseFloat( const char **data, float *f ) +{ + const char *token; + + token = COM_ParseExt( data, qfalse ); + if ( token[0] == 0 ) + { + Com_Printf( "unexpected EOF in COM_ParseFloat\n" ); + return qtrue; + } + + *f = atof( token ); + return qfalse; +} + +/* +=============== +COM_ParseVec4 +=============== +*/ +qboolean COM_ParseVec4( const char **buffer, vec4_t *c) +{ + int i; + float f; + + for (i = 0; i < 4; i++) + { + if (COM_ParseFloat(buffer, &f)) + { + return qtrue; + } + (*c)[i] = f; + } + return qfalse; +} + /* ================== COM_MatchToken @@ -555,7 +652,7 @@ void COM_MatchToken( const char **buf_p, const char *match ) { const char *token; token = COM_Parse( buf_p ); - if ( strcmp( token, match ) ) + if ( strcmp( token, match ) ) { Com_Error( ERR_DROP, "MatchToken: %s != %s", token, match ); } @@ -606,6 +703,10 @@ void SkipRestOfLine ( const char **data ) { Com_Error(ERR_FATAL, "SkipRestOfLine: parseDataCount < 0"); p = *data; + + if ( !*p ) + return; + while ( (c = *p++) != 0 ) { if ( c == '\n' ) { parseData[parseDataCount].com_lines++; @@ -664,7 +765,7 @@ int Com_HexStrToInt( const char *str ) { if ( !str || !str[ 0 ] ) return -1; - + // check for hex code if( str[ 0 ] == '0' && str[ 1 ] == 'x' ) { @@ -740,7 +841,7 @@ qboolean Q_isanumber( const char *s ) return qfalse; ret = strtod( s, &p ); - + if ( ret == HUGE_VAL || errno == ERANGE ) return qfalse; @@ -805,7 +906,16 @@ void Q_strncpyz( char *dest, const char *src, int destsize, qboolean bBarfIfTooL #if 1 int Q_stricmpn (const char *s1, const char *s2, int n) { int c1, c2; - + + if ( s1 == NULL ) { + if ( s2 == NULL ) + return 0; + else + return -1; + } + else if ( s2==NULL ) + return 1; + do { c1 = *s1++; c2 = *s2++; @@ -966,9 +1076,11 @@ char *Q_CleanStr( char *string ) { /* ================== Q_StripColor - + Strips coloured strings in-place using multiple passes: "fgs^^56fds" -> "fgs^6fds" -> "fgsfds" +This function modifies INPUT (is mutable) + (Also strips ^8 and ^9) ================== */ @@ -1025,22 +1137,25 @@ void Q_strstrip( char *string, const char *strip, const char *repl ) char *out=string, *p=string, c; const char *s=strip; int replaceLen = repl?strlen( repl ):0, offset=0; + qboolean recordChar = qtrue; while ( (c = *p++) != '\0' ) { + recordChar = qtrue; for ( s=strip; *s; s++ ) { offset = s-strip; if ( c == *s ) { if ( !repl || offset >= replaceLen ) - c = *p++; + recordChar = qfalse; else c = repl[offset]; break; } } - *out++ = c; + if ( recordChar ) + *out++ = c; } *out = '\0'; } @@ -1075,7 +1190,7 @@ const char *Q_strchrs( const char *string, const char *search ) /* ============= Q_vsnprintf - + Special wrapper function for Microsoft's broken _vsnprintf() function. MinGW comes with its own snprintf() which is not broken. ============= @@ -1104,8 +1219,6 @@ int Q_vsnprintf(char *str, size_t size, const char *format, va_list ap) } #endif -//Raz: Patched version of Com_sprintf -//Ensiform: But this is better int QDECL Com_sprintf( char *dest, int size, const char *fmt, ...) { int len; va_list argptr; @@ -1116,7 +1229,7 @@ int QDECL Com_sprintf( char *dest, int size, const char *fmt, ...) { if(len >= size) Com_Printf("Com_sprintf: Output length %d too short, require %d bytes.\n", size, len + 1); - + return len; } @@ -1316,16 +1429,16 @@ void Info_RemoveKey( char *s, const char *key ) { } *o = 0; + //OJKNOTE: static analysis pointed out pkey may not be null-terminated if (!strcmp (key, pkey) ) { - strcpy (start, s); // remove this part + memmove(start, s, strlen(s) + 1); // remove this part return; } if (!*s) return; } - } @@ -1356,27 +1469,19 @@ Changes or adds a key/value pair */ void Info_SetValueForKey( char *s, const char *key, const char *value ) { char newi[MAX_INFO_STRING]; + const char* blacklist = "\\;\""; if ( strlen( s ) >= MAX_INFO_STRING ) { Com_Error( ERR_DROP, "Info_SetValueForKey: oversize infostring" ); } - if (strchr (key, '\\') || strchr (value, '\\')) - { - Com_Printf ("Can't use keys or values with a \\(%s, %s)\n",key,value); - return; - } - - if (strchr (key, ';') || strchr (value, ';')) - { - Com_Printf ("Can't use keys or values with a semicolon(%s, %s)\n",key,value); - return; - } - - if (strchr (key, '\"') || strchr (value, '\"')) + for(; *blacklist; ++blacklist) { - Com_Printf ("Can't use keys or values with a \"(%s, %s)\n",key,value); - return; + if (strchr (key, *blacklist) || strchr (value, *blacklist)) + { + Com_Printf (S_COLOR_YELLOW "Can't use keys or values with a '%c': %s = %s\n", *blacklist, key, value); + return; + } } Info_RemoveKey (s, key); @@ -1385,13 +1490,14 @@ void Info_SetValueForKey( char *s, const char *key, const char *value ) { Com_sprintf (newi, sizeof(newi), "\\%s\\%s", key, value); - if (strlen(newi) + strlen(s) > MAX_INFO_STRING) + if (strlen(newi) + strlen(s) >= MAX_INFO_STRING) { Com_Printf ("Info string length exceeded\n"); return; } - strcat (s, newi); + strcat (newi, s); + strcpy (s, newi); } /* @@ -1505,85 +1611,5 @@ const char *GetStringForID( const stringID_table_t *table, int id ) return NULL; } -/* -=============== -COM_ParseString -=============== -*/ -qboolean COM_ParseString( const char **data, const char **s ) -{ -// *s = COM_ParseExt( data, qtrue ); - *s = COM_ParseExt( data, qfalse ); - if ( s[0] == 0 ) - { - Com_Printf("unexpected EOF in COM_ParseString\n"); - return qtrue; - } - return qfalse; -} - -/* -=============== -COM_ParseInt -=============== -*/ -qboolean COM_ParseInt( const char **data, int *i ) -{ - const char *token; - - token = COM_ParseExt( data, qfalse ); - if ( token[0] == 0 ) - { - Com_Printf( "unexpected EOF in COM_ParseInt\n" ); - return qtrue; - } - - *i = atoi( token ); - return qfalse; -} - -/* -=============== -COM_ParseFloat -=============== -*/ -qboolean COM_ParseFloat( const char **data, float *f ) -{ - const char *token; - - token = COM_ParseExt( data, qfalse ); - if ( token[0] == 0 ) - { - Com_Printf( "unexpected EOF in COM_ParseFloat\n" ); - return qtrue; - } - - *f = atof( token ); - return qfalse; -} - -/* -=============== -COM_ParseVec4 -=============== -*/ -qboolean COM_ParseVec4( const char **buffer, vec4_t *c) -{ - int i; - float f; - - for (i = 0; i < 4; i++) - { - if (COM_ParseFloat(buffer, &f)) - { - return qtrue; - } - (*c)[i] = f; - } - return qfalse; -} - - - // end diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 329d4c8831..455f9e6980 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -1,20 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __Q_SHARED_H #define __Q_SHARED_H @@ -75,6 +81,8 @@ This file is part of Jedi Academy. #define Q3CONFIG_NAME PRODUCT_NAME ".cfg" +#define BASE_SAVE_COMPAT // this is defined to disable/fix some changes that break save compatibility + #define VALIDSTRING( a ) ( ( a != NULL ) && ( a[0] != '\0' ) ) //JAC: Added @@ -122,6 +130,12 @@ This file is part of Jedi Academy. #define Q_EXPORT #endif +#if defined(__GNUC__) +#define NORETURN __attribute__((noreturn)) +#elif defined(_MSC_VER) +#define NORETURN __declspec(noreturn) +#endif + // this is the define for determining if we have an asm version of a C function #if (defined(_M_IX86) || defined(__i386__)) && !defined(__sun__) #define id386 1 @@ -153,6 +167,8 @@ typedef unsigned long ulong; typedef enum { qfalse=0, qtrue } qboolean; #define qboolean int //don't want strict type checking on the qboolean +#define Q_min(x,y) ((x)<(y)?(x):(y)) +#define Q_max(x,y) ((x)>(y)?(x):(y)) #if defined (_MSC_VER) && (_MSC_VER >= 1600) @@ -180,6 +196,9 @@ typedef enum { qfalse=0, qtrue } qboolean; int Q_vsnprintf( char *str, size_t size, const char *format, va_list args ); #else // not using MSVC + #if !defined(__STDC_LIMIT_MACROS) + #define __STDC_LIMIT_MACROS + #endif #include #define Q_vsnprintf vsnprintf @@ -319,13 +338,11 @@ typedef enum { #define UI_FORMATMASK 0x00000007 #define UI_SMALLFONT 0x00000010 #define UI_BIGFONT 0x00000020 // default -#define UI_GIANTFONT 0x00000040 + #define UI_DROPSHADOW 0x00000800 #define UI_BLINK 0x00001000 #define UI_INVERSE 0x00002000 #define UI_PULSE 0x00004000 -#define UI_UNDERLINE 0x00008000 -#define UI_TINYFONT 0x00010000 #define Com_Memset memset @@ -348,23 +365,12 @@ MATHLIB ============================================================== */ +typedef float vec_t; +typedef float vec2_t[2], vec3_t[3], vec4_t[4], vec5_t[5]; +typedef int ivec2_t[2], ivec3_t[3], ivec4_t[4], ivec5_t[5]; +typedef vec3_t vec3pair_t[2], matrix3_t[3]; -typedef float vec_t; -typedef vec_t vec2_t[2]; -typedef vec_t vec3_t[3]; -typedef vec_t vec4_t[4]; -typedef vec_t vec5_t[5]; - -typedef vec3_t vec3pair_t[2]; - -typedef int ivec2_t[2]; -typedef int ivec3_t[3]; -typedef int ivec4_t[4]; -typedef int ivec5_t[5]; - -typedef int fixed4_t; -typedef int fixed8_t; -typedef int fixed16_t; +typedef int fixed4_t, fixed8_t, fixed16_t; #ifndef M_PI #define M_PI 3.14159265358979323846 // matches value in gcc v2 math.h @@ -791,34 +797,21 @@ inline float Q_crandom( int *seed ) { return 2.0F * ( Q_random( seed ) - 0.5f ); } -// Returns a float min <= x < max (exclusive; will get max - 0.00001; but never max -inline float Q_flrand(float min, float max) { - return ((rand() * (max - min)) / ((float)RAND_MAX)) + min; -} - // Returns an integer min <= x <= max (ie inclusive) inline int Q_irand(int min, int max) { - max++; //so it can round down -#ifdef _WIN32 - return ((rand() * (max - min)) >> 15) + min; -#else - //rand() returns much larger values on OSX/Linux, so make the result smaller - return (((rand() % 0x7fff) * (max - min)) >> 15) + min; -#endif + return (rand() % (max - min + 1)) + min; } -#ifdef _WIN32 -//returns a float between 0 and 1.0 -inline float random() { - return (rand() / ((float)0x7fff)); +#define random() (rand() / (float)RAND_MAX) + +// Returns a float min <= x < max (exclusive; will get max - 0.00001; but never max +inline float Q_flrand(float min, float max) { + return (random() * (max - min)) + min; } -#else -#define random() (rand() / ((float)RAND_MAX)) -#endif //returns a float between -1 and 1.0 inline float crandom() { - return (2.0F * (random() - 0.5F)); + return Q_flrand(-1.0f, 1.0f); } float erandom( float mean ); @@ -990,6 +983,12 @@ void COM_DefaultExtension( char *path, int maxSize, const char *extension ); void COM_BeginParseSession( void ); void COM_EndParseSession( void ); +// For compatibility with shared code +static inline void COM_BeginParseSession( const char *sessionName ) +{ + COM_BeginParseSession(); +} + class COM_ParseSession { public: COM_ParseSession() { COM_BeginParseSession(); }; @@ -1115,7 +1114,7 @@ qboolean Info_Validate( const char *s ); void Info_NextPair( const char **s, char key[MAX_INFO_KEY], char value[MAX_INFO_VALUE] ); // this is only here so the functions in q_shared.c and bg_*.c can link -void QDECL Com_Error( int level, const char *error, ... ); +void NORETURN QDECL Com_Error( int level, const char *error, ... ); void QDECL Com_Printf( const char *msg, ... ); @@ -1358,7 +1357,12 @@ Ghoul2 Insert End #define CS_SKYBOXORG (CS_MODELS+MAX_MODELS) //rww - skybox info #define CS_SOUNDS (CS_SKYBOXORG+1) +#ifdef BASE_SAVE_COMPAT +#define CS_RESERVED1 (CS_SOUNDS+MAX_SOUNDS) // reserved field for base compat from immersion removal +#define CS_PLAYERS (CS_RESERVED1 + 96) +#else #define CS_PLAYERS (CS_SOUNDS+MAX_SOUNDS) +#endif #define CS_LIGHT_STYLES (CS_PLAYERS+MAX_CLIENTS) #define CS_TERRAINS (CS_LIGHT_STYLES + (MAX_LIGHT_STYLES*3)) #define CS_BSP_MODELS (CS_TERRAINS + MAX_TERRAINS) @@ -2530,6 +2534,7 @@ typedef struct parseData_s { char fileName[MAX_QPATH]; // Name of current file being read in int com_lines; // Number of lines read in + int com_tokenline; const char *bufferStart; // Start address of buffer holding data that was read in const char *bufferCurrent; // Where data is currently being parsed from buffer } parseData_t; diff --git a/code/qcommon/qcommon.h b/code/qcommon/qcommon.h index d3ad1b9709..cd81d017ee 100644 --- a/code/qcommon/qcommon.h +++ b/code/qcommon/qcommon.h @@ -1,29 +1,36 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // qcommon.h -- definitions common between client and server, but not game.or ref modules #ifndef __QCOMMON_H__ #define __QCOMMON_H__ -#include "stringed_ingame.h" #include "q_shared.h" +#include "stringed_ingame.h" #include "strippublic.h" #include "cm_public.h" +#include "sys/sys_public.h" // some zone mem debugging stuff @@ -114,21 +121,14 @@ NET #define MAX_RELIABLE_COMMANDS 64 // max string commands buffered for restransmit -typedef enum { - NA_BAD, // an address lookup failed - NA_LOOPBACK, -} netadrtype_t; - typedef enum { NS_CLIENT, NS_SERVER } netsrc_t; -typedef struct { - netadrtype_t type; - - unsigned short port; -} netadr_t; +// For compatibility with shared code +static inline void NET_Init( void ) {} +static inline void NET_Shutdown( void ) {} void NET_SendPacket (netsrc_t sock, int length, const void *data, netadr_t to); void NET_OutOfBandPrint( netsrc_t net_socket, netadr_t adr, const char *format, ...); @@ -141,6 +141,12 @@ const char *NET_AdrToString (netadr_t a); qboolean NET_StringToAdr ( const char *s, netadr_t *a); qboolean NET_GetLoopPacket (netsrc_t sock, netadr_t *net_from, msg_t *net_message); +void Sys_SendPacket( int length, const void *data, netadr_t to ); +//Does NOT parse port numbers, only base addresses. +qboolean Sys_StringToAdr( const char *s, netadr_t *a ); +qboolean Sys_IsLANAddress (netadr_t adr); +void Sys_ShowIP(void); + #define MAX_MSGLEN (1*17408) // max length of a message, which may //#define MAX_MSGLEN (3*16384) // max length of a message, which may @@ -430,6 +436,8 @@ issues. ============================================================== */ +#define MAX_FILE_HANDLES 64 + qboolean FS_Initialized(); void FS_InitFilesystem (void); @@ -443,28 +451,43 @@ char **FS_ListFiles( const char *directory, const char *extension, int *numfiles // the returned files will not include any directories or / void FS_FreeFileList( char **filelist ); +//rwwRMG - changed to fileList to not conflict with list type + +void FS_Remove( const char *osPath ); +void FS_HomeRemove( const char *homePath ); + +void FS_Rmdir( const char *osPath, qboolean recursive ); +void FS_HomeRmdir( const char *homePath, qboolean recursive ); + +qboolean FS_FileExists( const char *file ); char *FS_BuildOSPath( const char *base, const char *game, const char *qpath ); int FS_GetFileList( const char *path, const char *extension, char *listbuf, int bufsize ); +int FS_GetModList( char *listbuf, int bufsize ); -fileHandle_t FS_FOpenFileWrite( const char *qpath ); // will properly create any needed paths and deal with seperater character issues +fileHandle_t FS_FOpenFileWrite( const char *qpath, qboolean safe = qtrue ); fileHandle_t FS_FOpenFileAppend( const char *filename ); // this was present already, but no public proto -qboolean FS_GetExtendedInfo_FOpenFileRead(const char *filename, char **ppsFilename, int *piOffset); -//return value is success of opening file, then ppsFilename and piOffset are valid - -int FS_FOpenFileRead( const char *qpath, fileHandle_t *file, qboolean uniqueFILE ); +int FS_filelength( fileHandle_t f ); +fileHandle_t FS_SV_FOpenFileWrite( const char *filename ); +int FS_SV_FOpenFileRead( const char *filename, fileHandle_t *fp ); +void FS_SV_Rename( const char *from, const char *to, qboolean safe ); +long FS_FOpenFileRead( const char *qpath, fileHandle_t *file, qboolean uniqueFILE ); // if uniqueFILE is true, then a new FILE will be fopened even if the file // is found in an already open pak file. If uniqueFILE is false, you must call // FS_FCloseFile instead of fclose, otherwise the pak FILE would be improperly closed // It is generally safe to always set uniqueFILE to true, because the majority of // file IO goes through FS_ReadFile, which Does The Right Thing already. -int FS_FileIsInPAK(const char *filename ); // returns 1 if a file is in the PAK file, otherwise -1 +int FS_FileIsInPAK(const char *filename ); +static inline int FS_FileIsInPAK( const char *filename, int *checksum ) +{ + return FS_FileIsInPAK( filename ); +} int FS_Write( const void *buffer, int len, fileHandle_t f ); @@ -474,7 +497,7 @@ int FS_Read( void *buffer, int len, fileHandle_t f ); void FS_FCloseFile( fileHandle_t f ); // note: you can't just fclose from another DLL, due to MS libc issues -int FS_ReadFile( const char *qpath, void **buffer ); +long FS_ReadFile( const char *qpath, void **buffer ); // returns the length of the file // a null buffer will just return the file length without loading // as a quick check for existance. -1 length == not present @@ -488,6 +511,15 @@ void FS_ForceFlush( fileHandle_t f ); void FS_FreeFile( void *buffer ); // frees the memory returned by FS_ReadFile +class FS_AutoFreeFile { +private: + FS_AutoFreeFile(); + void *buffer; +public: + FS_AutoFreeFile(void *inbuf) : buffer(inbuf) { }; + ~FS_AutoFreeFile() { if (buffer) FS_FreeFile(buffer); }; +}; + void FS_WriteFile( const char *qpath, const void *buffer, int size ); // writes a complete file, creating any subdirectories needed @@ -520,6 +552,7 @@ void FS_DeleteUserGenFile( const char *filename ); qboolean FS_MoveUserGenFile ( const char *filename_src, const char *filename_dst ); qboolean FS_CheckDirTraversal(const char *checkdir); +void FS_Rename( const char *from, const char *to ); /* ============================================================== @@ -564,8 +597,8 @@ void Com_BeginRedirect (char *buffer, int buffersize, void (*flush)(char *)); void Com_EndRedirect( void ); void QDECL Com_Printf( const char *fmt, ... ); void QDECL Com_DPrintf( const char *fmt, ... ); -void QDECL Com_Error( int code, const char *fmt, ... ) __attribute__((noreturn)); -void Com_Quit_f( void ); +void NORETURN QDECL Com_Error( int code, const char *fmt, ... ); +void NORETURN Com_Quit_f( void ); int Com_EventLoop( void ); int Com_Milliseconds( void ); // will be journaled properly unsigned Com_BlockChecksum( const void *buffer, int length ); @@ -584,9 +617,13 @@ extern cvar_t *com_speeds; extern cvar_t *com_timescale; extern cvar_t *com_sv_running; extern cvar_t *com_cl_running; -extern cvar_t *com_viewlog; // 0 = hidden, 1 = visible, 2 = minimized extern cvar_t *com_version; extern cvar_t *com_homepath; +#ifndef _WIN32 +extern cvar_t *com_ansiColor; +#endif + +extern cvar_t *com_affinity; // both client and server must agree to pause extern cvar_t *cl_paused; @@ -648,7 +685,7 @@ qboolean Z_IsFromZone(const void *pvAddress, memtag_t eTag); //returns size if t #else - void *Z_Malloc ( int iSize, memtag_t eTag, qboolean bZeroit, int iAlign = 4); // return memory NOT zero-filled by default + void *Z_Malloc ( int iSize, memtag_t eTag, qboolean bZeroit = qfalse, int iAlign = 4); // return memory NOT zero-filled by default void *S_Malloc ( int iSize ); // NOT 0 filled memory only for small allocations #define Z_Label(_ptr, _label) /* */ @@ -754,102 +791,12 @@ qboolean SV_GameCommand( void ); qboolean UI_GameCommand( void ); -/* -============================================================== - -NON-PORTABLE SYSTEM SERVICES - -============================================================== -*/ - -typedef enum { - AXIS_SIDE, - AXIS_FORWARD, - AXIS_UP, - AXIS_ROLL, - AXIS_YAW, - AXIS_PITCH, - MAX_JOYSTICK_AXIS -} joystickAxis_t; - -typedef enum { - SE_NONE, // evTime is still valid - SE_KEY, // evValue is a key code, evValue2 is the down flag - SE_CHAR, // evValue is an ascii char - SE_MOUSE, // evValue and evValue2 are reletive signed x / y moves - SE_JOYSTICK_AXIS, // evValue is an axis number and evValue2 is the current state (-127 to 127) - SE_CONSOLE, // evPtr is a char* - SE_PACKET // evPtr is a netadr_t followed by data bytes to evPtrLength -} sysEventType_t; - -typedef struct { - int evTime; - sysEventType_t evType; - int evValue, evValue2; - int evPtrLength; // bytes of data pointed to by evPtr, for journaling - void *evPtr; // this must be manually freed if not NULL -} sysEvent_t; - -sysEvent_t Sys_GetEvent( void ); - -void Sys_Init (void); - -#ifdef _WIN32 - #include - #define Sys_LoadLibrary(f) (void*)LoadLibrary(f) - #define Sys_UnloadLibrary(h) FreeLibrary((HMODULE)h) - #define Sys_LoadFunction(h,fn) (void*)GetProcAddress((HMODULE)h,fn) - #define Sys_LibraryError() "unknown" -#endif // linux and mac use SDL in SDL_loadlibrary.h - -void * QDECL Sys_LoadDll(const char *name, qboolean useSystemLib); -void Sys_UnloadDll( void *dllHandle ); - -char *Sys_GetCurrentUser( void ); - -void QDECL Sys_Error( const char *error, ...) __attribute__((noreturn)); -void Sys_Quit (void); -char *Sys_GetClipboardData( void ); // note that this isn't journaled... - -void Sys_Print( const char *msg ); - -// Sys_Milliseconds should only be used for profiling purposes, -// any game related timing information should come from event timestamps -int Sys_Milliseconds (void); -#ifndef _WIN32 -void Sys_SetEnv(const char *name, const char *value); -#endif - - -// the system console is shown when a dedicated server is running -void Sys_DisplaySystemConsole( qboolean show ); - -void Sys_ShowConsole( int level, qboolean quitOnClose ); -void Sys_SetErrorText( const char *text ); - -qboolean Sys_Mkdir( const char *path ); -char *Sys_Cwd( void ); -char *Sys_DefaultCDPath(void); -void Sys_SetDefaultInstallPath(const char *path); -char *Sys_DefaultInstallPath(void); - -#ifdef MACOS_X -char *Sys_DefaultAppPath(void); -#endif - -char *Sys_DefaultHomePath(void); -const char *Sys_Dirname( char *path ); -const char *Sys_Basename( char *path ); - -char **Sys_ListFiles( const char *directory, const char *extension, char *filter, int *numfiles, qboolean wantsubs ); -void Sys_FreeFileList( char **filelist ); - -qboolean Sys_LowPhysicalMemory(); -qboolean Sys_FileOutOfDate( const char *psFinalFileName /* dest */, const char *psDataFileName /* src */ ); -qboolean Sys_CopyFile(const char *lpExistingFileName, const char *lpNewFileName, qboolean bOverwrite); - - byte* SCR_GetScreenshot(qboolean *qValid); +#ifdef JK2_MODE +void SCR_SetScreenshot(const byte *pbData, int w, int h); +byte* SCR_TempRawImage_ReadFromFile(const char *psLocalFilename, int *piWidth, int *piHeight, byte *pbReSampleBuffer, qboolean qbVertFlip); +void SCR_TempRawImage_CleanUp(); +#endif inline int Round(float value) { @@ -860,4 +807,8 @@ inline int Round(float value) bool PD_Store ( const char *name, const void *data, size_t size ); const void *PD_Load ( const char *name, size_t *size ); +uint32_t ConvertUTF8ToUTF32( char *utf8CurrentChar, char **utf8NextChar ); + +#include "sys/sys_public.h" + #endif //__QCOMMON_H__ diff --git a/code/qcommon/qfiles.h b/code/qcommon/qfiles.h index b177dc23d8..0977e8e42b 100644 --- a/code/qcommon/qfiles.h +++ b/code/qcommon/qfiles.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __QFILES_H__ #define __QFILES_H__ diff --git a/code/qcommon/sstring.h b/code/qcommon/sstring.h index 79e2b3da35..859e50ceba 100644 --- a/code/qcommon/sstring.h +++ b/code/qcommon/sstring.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- sstring.h // diff --git a/code/qcommon/stringed_ingame.cpp b/code/qcommon/stringed_ingame.cpp index 85cbe6b1a9..3ac660438c 100644 --- a/code/qcommon/stringed_ingame.cpp +++ b/code/qcommon/stringed_ingame.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- stringed_ingame.cpp // @@ -33,12 +37,6 @@ This file is part of Jedi Academy. // ////////////////////////////////////////////////// - -#ifdef _MSC_VER -#pragma warning ( disable : 4511 ) // copy constructor could not be generated -#pragma warning ( disable : 4512 ) // assignment operator could not be generated -#pragma warning ( disable : 4663 ) // C++ language change: blah blah template crap blah blah -#endif #include "stringed_ingame.h" #include "stringed_interface.h" @@ -48,15 +46,12 @@ This file is part of Jedi Academy. #ifdef _MSC_VER #pragma warning ( disable : 4786 ) // disable the usual stupid and pointless STL warning #endif -#include -#include #include #include #include -using namespace std; -typedef vector vStrings_t; -typedef vector vInts_t; +typedef std::vector vStrings_t; +typedef std::vector vInts_t; // /////////////////////////////////////////////// @@ -69,8 +64,8 @@ cvar_t *sp_leet = NULL; // kept as 'sp_' for JK2 compat. typedef struct SE_Entry_s { - string m_strString; - string m_strDebug; // english and/or "#same", used for debugging only. Also prefixed by "SE:" to show which strings go through StringEd (ie aren't hardwired) + std::string m_strString; + std::string m_strDebug; // english and/or "#same", used for debugging only. Also prefixed by "SE:" to show which strings go through StringEd (ie aren't hardwired) int m_iFlags; SE_Entry_s() @@ -81,17 +76,17 @@ typedef struct SE_Entry_s } SE_Entry_t; -typedef map mapStringEntries_t; +typedef std::map mapStringEntries_t; class CStringEdPackage { private: SE_BOOL m_bEndMarkerFound_ParseOnly; - string m_strCurrentEntryRef_ParseOnly; - string m_strCurrentEntryEnglish_ParseOnly; - string m_strCurrentFileRef_ParseOnly; - string m_strLoadingLanguage_ParseOnly; // eg "german" + std::string m_strCurrentEntryRef_ParseOnly; + std::string m_strCurrentEntryEnglish_ParseOnly; + std::string m_strCurrentFileRef_ParseOnly; + std::string m_strLoadingLanguage_ParseOnly; // eg "german" SE_BOOL m_bLoadingEnglish_ParseOnly; public: @@ -111,8 +106,8 @@ class CStringEdPackage // // flag stuff... // - vector m_vstrFlagNames; - map m_mapFlagMasks; + std::vector m_vstrFlagNames; + std::map m_mapFlagMasks; void Clear( SE_BOOL bChangingLanguages ); void SetupNewFileParse( const char *psFileName, SE_BOOL bLoadDebug ); @@ -296,7 +291,7 @@ SE_BOOL CStringEdPackage::CheckLineForKeyword( const char *psKeyword, const char // const char *CStringEdPackage::ConvertCRLiterals_Read( const char *psString ) { - static string str; + static std::string str; str = psString; int iLoc; while ( (iLoc = str.find("\\n")) != -1 ) @@ -412,7 +407,7 @@ const char *CStringEdPackage::InsideQuotes( const char *psLine ) // I *could* replace this string object with a declared array, but wasn't sure how big to leave it, and it'd have to // be static as well, hence permanent. (problem on consoles?) // - static string str; + static std::string str; str = ""; // do NOT join to above line // skip any leading whitespace... @@ -462,7 +457,7 @@ const char *CStringEdPackage::InsideQuotes( const char *psLine ) // int CStringEdPackage::GetFlagMask( const char *psFlagName ) { - map ::iterator itFlag = m_mapFlagMasks.find( psFlagName ); + std::map ::iterator itFlag = m_mapFlagMasks.find( psFlagName ); if ( itFlag != m_mapFlagMasks.end() ) { int &iMask = (*itFlag).second; @@ -773,7 +768,7 @@ void CStringEdPackage::AddEntry( const char *psLocalReference ) const char *Leetify( const char *psString ) { - static string str; + static std::string str; str = psString; if (sp_leet->integer == 42) // very specific test, so you won't hit it accidentally { @@ -894,7 +889,7 @@ static const char *SE_Load_Actual( const char *psFileName, SE_BOOL bLoadDebug, S return psErrorMessage; } -static const char *SE_GetFoundFile( string &strResult ) +static const char *SE_GetFoundFile( std::string &strResult ) { static char sTemp[1024/*MAX_PATH*/]; @@ -1096,12 +1091,12 @@ int SE_GetFlagMask( const char *psFlagName ) // Groan, except for Bob. I mentioned that this was slow and only call it once, but he's calling it from // every level-load... Ok, cacheing it is... // -vector gvLanguagesAvailable; +std::vector gvLanguagesAvailable; int SE_GetNumLanguages(void) { if ( gvLanguagesAvailable.empty() ) { - string strResults; + std::string strResults; /*int iFilesFound = */SE_BuildFileList( #ifdef _STRINGED va("C:\\Source\\Tools\\StringEd\\test_data\\%s",sSE_STRINGS_DIR) @@ -1111,7 +1106,7 @@ int SE_GetNumLanguages(void) , strResults ); - set strUniqueStrings; // laziness + std::set strUniqueStrings; // laziness const char *p; while ((p=SE_GetFoundFile (strResults)) != NULL) { @@ -1232,7 +1227,7 @@ const char *SE_LoadLanguage( const char *psLanguage, SE_BOOL bLoadDebug /* = SE_ { SE_NewLanguage(); - string strResults; + std::string strResults; /*int iFilesFound = */SE_BuildFileList( #ifdef _STRINGED va("C:\\Source\\Tools\\StringEd\\test_data\\%s",sSE_STRINGS_DIR) diff --git a/code/qcommon/stringed_ingame.h b/code/qcommon/stringed_ingame.h index 900a8bb410..b42c3961b6 100644 --- a/code/qcommon/stringed_ingame.h +++ b/code/qcommon/stringed_ingame.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- stringed_ingame.h // diff --git a/code/qcommon/stringed_interface.cpp b/code/qcommon/stringed_interface.cpp index a6a5c29f06..44d059ab10 100644 --- a/code/qcommon/stringed_interface.cpp +++ b/code/qcommon/stringed_interface.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- stringed_interface.cpp // @@ -35,17 +39,10 @@ This file is part of Jedi Academy. // ////////////////////////////////////////////////// - -#ifdef _MSC_VER -#pragma warning ( disable : 4511 ) // copy constructor could not be generated -#pragma warning ( disable : 4512 ) // assignment operator could not be generated -#pragma warning ( disable : 4663 ) // C++ language change: blah blah template crap blah blah -#endif #include "stringed_interface.h" #include "stringed_ingame.h" #include -using namespace std; #ifdef _STRINGED #include @@ -149,7 +146,7 @@ void SE_FreeFileDataAfterLoad( unsigned char *psLoadedFile ) // quake-style method of doing things since their file-list code doesn't have a 'recursive' flag... // int giFilesFound; -static void SE_R_ListFiles( const char *psExtension, const char *psDir, string &strResults ) +static void SE_R_ListFiles( const char *psExtension, const char *psDir, std::string &strResults ) { // Com_Printf(va("Scanning Dir: %s\n",psDir)); @@ -209,7 +206,7 @@ static void SE_R_ListFiles( const char *psExtension, const char *psDir, string & // // expected result is a ';'-delineated string (including last one) containing file-list search results // -int SE_BuildFileList( const char *psStartDir, string &strResults ) +int SE_BuildFileList( const char *psStartDir, std::string &strResults ) { #ifndef _STRINGED giFilesFound = 0; diff --git a/code/qcommon/stringed_interface.h b/code/qcommon/stringed_interface.h index 78af7eee23..4bc0417349 100644 --- a/code/qcommon/stringed_interface.h +++ b/code/qcommon/stringed_interface.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- stringed_interface.h // @@ -24,15 +28,11 @@ This file is part of Jedi Academy. #ifndef STRINGED_INTERFACE_H #define STRINGED_INTERFACE_H -#ifdef _MSC_VER -#pragma warning ( disable : 4786 ) // disable the usual stupid and pointless STL warning -#endif #include -using namespace std; unsigned char * SE_LoadFileData ( const char *psFileName, int *piLoadedLength = 0); void SE_FreeFileDataAfterLoad( unsigned char *psLoadedFile ); -int SE_BuildFileList ( const char *psStartDir, string &strResults ); +int SE_BuildFileList ( const char *psStartDir, std::string &strResults ); #endif // #ifndef STRINGED_INTERFACE_H diff --git a/code/qcommon/strip.cpp b/code/qcommon/strip.cpp index d74bf6ab9a..cc95de22a4 100644 --- a/code/qcommon/strip.cpp +++ b/code/qcommon/strip.cpp @@ -1,46 +1,34 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifdef JK2_MODE // this include must remain at the top of every CPP file #include "../server/server.h" #include "q_shared.h" #include "qcommon.h" - - #include "stringed_ingame.h" -#ifdef _MSC_VER -#pragma warning(disable:4510) //default ctor could not be generated -#pragma warning(disable:4511) -#pragma warning(disable:4512) -#pragma warning(disable:4610) //user def ctor required -#pragma warning(disable:4663) - -#pragma warning (push, 3) //go back down to 3 for the stl include -#pragma warning (disable:4503) // decorated name length xceeded, name was truncated -#endif #include #include -#ifdef _MSC_VER -#pragma warning (pop) -#pragma warning(disable:4503) // decorated name length xceeded, name was truncated -#endif cvar_t *sp_language; static cvar_t *sp_show_strip; @@ -98,7 +86,7 @@ static cvar_t *sp_leet; class cStringPackageID { private: - string name; + std::string name; byte reg; public: cStringPackageID(const char *in_name, byte in_reg) { name = in_name; reg = in_reg; } @@ -112,7 +100,7 @@ class cStringPackage protected: unsigned char ID; unsigned char Registration; - string name; + std::string name; char *Reference; public: @@ -143,7 +131,7 @@ class cStringPackageSingle : public cStringPackage { private: cStringsSingle Strings[MAX_STRINGS]; - map ReferenceTable; + std::map ReferenceTable; public: cStringPackageSingle(const char *in, unsigned char initID = 0, char *initReference = NULL); @@ -918,7 +906,7 @@ cStringsSingle *cStringPackageSingle::FindString(char *ReferenceLookup) int cStringPackageSingle::FindStringID(const char *ReferenceLookup) { - map::iterator i; + std::map::iterator i; int size; if (!Reference) @@ -937,7 +925,7 @@ int cStringPackageSingle::FindStringID(const char *ReferenceLookup) return -1; } - i = ReferenceTable.find(string(ReferenceLookup + size + 1)); + i = ReferenceTable.find(std::string(ReferenceLookup + size + 1)); if (i != ReferenceTable.end()) { return (*i).second; @@ -971,7 +959,7 @@ bool cStringPackageSingle::UnderstandToken(char *&Data, int &Size, int token, ch ReferenceLookup = Strings[pos].GetReference(); if (ReferenceLookup) { - ReferenceTable[string(ReferenceLookup)] = pos; + ReferenceTable[std::string(ReferenceLookup)] = pos; } } return true; @@ -983,8 +971,8 @@ bool cStringPackageSingle::UnderstandToken(char *&Data, int &Size, int token, ch // A map of loaded string packages -map JK2SP_ListByName; -map JK2SP_ListByID; +std::map JK2SP_ListByName; +std::map JK2SP_ListByID; // Registration @@ -1005,7 +993,7 @@ qboolean JK2SP_Register(const char *inPackage, unsigned char Registration) char Package[MAX_QPATH]; int size; cStringPackageSingle *new_sp; - map::iterator i; + std::map::iterator i; assert(JK2SP_ListByName.size() == JK2SP_ListByID.size()); @@ -1061,8 +1049,8 @@ qboolean JK2SP_Register(const char *inPackage, unsigned char Registration) // Unload all packages with the relevant registration bits void JK2SP_Unload(unsigned char Registration) { - map::iterator i, next; - map::iterator id; + std::map::iterator i, next; + std::map::iterator id; assert(JK2SP_ListByName.size() == JK2SP_ListByID.size()); @@ -1088,7 +1076,7 @@ void JK2SP_Unload(unsigned char Registration) int JK2SP_GetStringID(const char *inReference) { - map::iterator i; + std::map::iterator i; int ID; char Reference[MAX_QPATH]; Q_strncpyz(Reference, inReference, MAX_QPATH); @@ -1120,7 +1108,7 @@ cStringsSingle *JK2SP_GetString(unsigned short ID) { cStringPackageSingle *sp; cStringsSingle *string; - map::iterator i; + std::map::iterator i; i = JK2SP_ListByID.find(SP_GET_PACKAGE(ID)); if (i == JK2SP_ListByID.end()) @@ -1158,7 +1146,7 @@ cStringsSingle *JK2SP_GetString(const char *Reference) const char *JK2SP_GetReferenceText(unsigned short ID, const char *&psPackageName, const char *&psPackageReference, const char *&psText) { cStringPackageSingle *sp; - map::iterator i; + std::map::iterator i; i = JK2SP_ListByID.find(SP_GET_PACKAGE(ID)); if (i == JK2SP_ListByID.end()) @@ -1219,9 +1207,9 @@ const char *JK2SP_GetStringTextString(const char *Reference) static void JK2SP_UpdateLanguage(void) { - map::iterator it; - list sps; - list::iterator spit; + std::map::iterator it; + std::list sps; + std::list::iterator spit; // Grab all SP ids for(it = JK2SP_ListByID.begin(); it != JK2SP_ListByID.end(); it++) diff --git a/code/qcommon/strippublic.h b/code/qcommon/strippublic.h index 5826a83825..c25c03e044 100644 --- a/code/qcommon/strippublic.h +++ b/code/qcommon/strippublic.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __STRIPPUB_H #define __STRIPPUB_H diff --git a/code/qcommon/stv_version.h b/code/qcommon/stv_version.h index fdcf08d75b..be9f98c098 100644 --- a/code/qcommon/stv_version.h +++ b/code/qcommon/stv_version.h @@ -1,30 +1,34 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Current version of the single player game #include "../win32/AutoVersion.h" #ifdef _DEBUG - #define Q3_VERSION "(debug)OpenJK: v"VERSION_STRING_DOTTED + #define Q3_VERSION "(debug)OpenJK: v" VERSION_STRING_DOTTED #elif defined FINAL_BUILD - #define Q3_VERSION "OpenJK: v"VERSION_STRING_DOTTED + #define Q3_VERSION "OpenJK: v" VERSION_STRING_DOTTED #else - #define Q3_VERSION "(internal)OpenJK: v"VERSION_STRING_DOTTED + #define Q3_VERSION "(internal)OpenJK: v" VERSION_STRING_DOTTED #endif // end diff --git a/code/qcommon/tags.h b/code/qcommon/tags.h index 1441f2ceaf..82aeea06dc 100644 --- a/code/qcommon/tags.h +++ b/code/qcommon/tags.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- tags.h diff --git a/code/qcommon/timing.h b/code/qcommon/timing.h index 2d564c3525..a5e2115782 100644 --- a/code/qcommon/timing.h +++ b/code/qcommon/timing.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software class timing_c { diff --git a/code/qcommon/tri_coll_test.cpp b/code/qcommon/tri_coll_test.cpp index 52c9a176b5..760c85b877 100644 --- a/code/qcommon/tri_coll_test.cpp +++ b/code/qcommon/tri_coll_test.cpp @@ -1,26 +1,26 @@ -/* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . -*/ -// Copyright 2001-2013 Raven Software - /* Triangle/triangle intersection test routine, * by Tomas Moller, 1997. * See article "A Fast Triangle-Triangle Intersection Test", * Journal of Graphics Tools, 2(2), 1997 * + * + * Copyright (C) 1997 Tomas Möller + * Copyright (C) 2000-2013 Raven Software, Inc. + * Copyright (C) 2001-2013 Activision, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * * int tri_tri_intersect(float V0[3],float V1[3],float V2[3], * float U0[3],float U1[3],float U2[3]) * diff --git a/code/qcommon/tri_coll_test.h b/code/qcommon/tri_coll_test.h index 3bf89b5093..c505782ee7 100644 --- a/code/qcommon/tri_coll_test.h +++ b/code/qcommon/tri_coll_test.h @@ -2,9 +2,8 @@ This file is part of Jedi Academy. Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. Jedi Academy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/code/qcommon/z_memman_pc.cpp b/code/qcommon/z_memman_pc.cpp index fee6ddc51f..6b7219d0c1 100644 --- a/code/qcommon/z_memman_pc.cpp +++ b/code/qcommon/z_memman_pc.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Created 2/3/03 by Brian Osman - split Zone code from common.cpp @@ -240,12 +244,10 @@ void *Z_Malloc(int iSize, memtag_t eTag, qboolean bZeroit, int unusedAlign) zoneHeader_t *pMemory = NULL; while (pMemory == NULL) { - #ifdef _WIN32 if (gbMemFreeupOccured) { - Sleep(1000); // sleep for a second, so Windows has a chance to shuffle mem to de-swiss-cheese it + Sys_Sleep(1000); // sleep for a second, so Windows has a chance to shuffle mem to de-swiss-cheese it } - #endif if (bZeroit) { pMemory = (zoneHeader_t *) calloc ( iRealSize, 1 ); diff --git a/code/rd-common/mdx_format.h b/code/rd-common/mdx_format.h index 1c6c805c49..a862436461 100644 --- a/code/rd-common/mdx_format.h +++ b/code/rd-common/mdx_format.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- mdx_format.h // diff --git a/code/rd-common/tr_common.h b/code/rd-common/tr_common.h index 311567e6bf..fee82cc244 100644 --- a/code/rd-common/tr_common.h +++ b/code/rd-common/tr_common.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "../rd-common/tr_public.h" @@ -45,6 +68,10 @@ void LoadJPG( const char *filename, byte **pic, int *width, int *height ); // Load raw image data from PNG image. void LoadPNG( const char *filename, byte **data, int *width, int *height ); +#ifdef JK2_MODE +//Load raw image data from JPEG input. +void LoadJPGFromBuffer( byte *inputBuffer, size_t len, byte **pic, int *width, int *height ); +#endif /* ================================================================================ diff --git a/code/rd-common/tr_font.cpp b/code/rd-common/tr_font.cpp index 4ee1c8db74..75e9384c6c 100644 --- a/code/rd-common/tr_font.cpp +++ b/code/rd-common/tr_font.cpp @@ -1,29 +1,29 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" -#ifndef _WIN32 #include #include -#endif #include "../qcommon/sstring.h" // stl string class won't compile in here (MS shite), so use Gil's. #include "tr_local.h" #include "tr_font.h" @@ -63,7 +63,7 @@ Language_e GetLanguageEnum() if (iSE_Language_ModificationCount != se_language->modificationCount ) { iSE_Language_ModificationCount = se_language->modificationCount; - + if ( Language_IsRussian() ) eLanguage = eRussian; else if ( Language_IsPolish() ) eLanguage = ePolish; else if ( Language_IsKorean() ) eLanguage = eKorean; @@ -103,14 +103,14 @@ SBCSOverrideLanguages_t g_SBCSOverrideLanguages[]= struct ThaiCodes_t { - map m_mapValidCodes; - vector m_viGlyphWidths; - string m_strInitFailureReason; // so we don't have to keep retrying to work this out + std::map m_mapValidCodes; + std::vector m_viGlyphWidths; + std::string m_strInitFailureReason; // so we don't have to keep retrying to work this out void Clear( void ) { m_mapValidCodes.clear(); - m_viGlyphWidths.clear(); + m_viGlyphWidths.clear(); m_strInitFailureReason = ""; // if blank, never failed, else says don't bother re-trying } @@ -123,7 +123,7 @@ struct ThaiCodes_t // int GetValidIndex( int iCode ) { - map ::iterator it = m_mapValidCodes.find( iCode ); + std::map ::iterator it = m_mapValidCodes.find( iCode ); if (it != m_mapValidCodes.end()) { return (*it).second; @@ -158,7 +158,7 @@ struct ThaiCodes_t if (iBytesRead > 0 && !(iBytesRead&3)) // valid length and multiple of 4 bytes long { int iTableEntries = iBytesRead / sizeof(int); - + for (int i=0; i < iTableEntries; i++) { m_mapValidCodes[ piData[i] ] = i; // convert MBCS code to sequential index... @@ -166,7 +166,7 @@ struct ThaiCodes_t ri.FS_FreeFile( piData ); // dispose of original // now read in the widths... (I'll keep these in a simple STL vector, so they'all disappear when the entries do... - // + // iBytesRead = ri.FS_ReadFile( sFILENAME_THAI_WIDTHS, (void **) &piData ); if (iBytesRead > 0 && !(iBytesRead&3) && iBytesRead>>2/*sizeof(int)*/ == iTableEntries) { @@ -210,8 +210,8 @@ class CFontInfo // end of fontdat data int mShader; // handle to the shader with the glyph - - int m_hAsianShaders[GLYPH_MAX_ASIAN_SHADERS]; // shaders for Korean glyphs where applicable + + int m_hAsianShaders[GLYPH_MAX_ASIAN_SHADERS]; // shaders for Korean glyphs where applicable glyphInfo_t m_AsianGlyph; // special glyph containing asian->western scaling info for all glyphs int m_iAsianGlyphsAcross; // needed to dynamically calculate S,T coords int m_iAsianPagesLoaded; @@ -236,7 +236,7 @@ class CFontInfo CFontInfo(const char *fontName); // CFontInfo(int fill) { memset(this, fill, sizeof(*this)); } // wtf? - ~CFontInfo(void) {} + ~CFontInfo(void) {} const int GetPointSize(void) const { return(mPointSize); } const int GetHeight(void) const { return(mHeight); } @@ -253,7 +253,7 @@ class CFontInfo void FlagNoAsianGlyphs(void) { m_hAsianShaders[0] = 0; m_iLanguageModificationCount = -1; } // used during constructor bool AsianGlyphsAvailable(void) const { return !!(m_hAsianShaders[0]); } - void UpdateAsianIfNeeded( bool bForceReEval = false); + void UpdateAsianIfNeeded( bool bForceReEval = false); }; //================================================ @@ -270,9 +270,9 @@ float RoundTenth( float fValue ) int g_iCurrentFontIndex; // entry 0 is reserved index for missing/invalid, else ++ with each new font registered -vector g_vFontArray; -typedef map FontIndexMap_t; - FontIndexMap_t g_mapFontIndexes; +std::vector g_vFontArray; +typedef std::map FontIndexMap_t; +FontIndexMap_t g_mapFontIndexes; int g_iNonScaledCharRange; // this is used with auto-scaling of asian fonts, anything below this number is preserved in scale, anything above is scaled down by 0.75f //paletteRGBA_c lastcolour; @@ -331,13 +331,13 @@ static int Korean_InitFields(int &iGlyphTPs, const char *&psLang) // (all ranges inclusive for Big5)... // #define BIG5_HIBYTE_START0 0xA1 // (misc chars + level 1 hanzi) -#define BIG5_HIBYTE_STOP0 0xC6 // +#define BIG5_HIBYTE_STOP0 0xC6 // #define BIG5_HIBYTE_START1 0xC9 // (level 2 hanzi) -#define BIG5_HIBYTE_STOP1 0xF9 // -#define BIG5_LOBYTE_LOBOUND0 0x40 // -#define BIG5_LOBYTE_HIBOUND0 0x7E // -#define BIG5_LOBYTE_LOBOUND1 0xA1 // -#define BIG5_LOBYTE_HIBOUND1 0xFE // +#define BIG5_HIBYTE_STOP1 0xF9 // +#define BIG5_LOBYTE_LOBOUND0 0x40 // +#define BIG5_LOBYTE_HIBOUND0 0x7E // +#define BIG5_LOBYTE_LOBOUND1 0xA1 // +#define BIG5_LOBYTE_HIBOUND1 0xFE // #define BIG5_CODES_PER_ROW 160 // 3 more than the number of glyphs extern qboolean Language_IsTaiwanese( void ); @@ -369,7 +369,7 @@ static bool Taiwanese_IsTrailingPunctuation( unsigned int uiCode ) { // so far I'm just counting the first 21 chars, those seem to be all the basic punctuation... // - if ( uiCode >= ((BIG5_HIBYTE_START0<<8)|BIG5_LOBYTE_LOBOUND0) && + if ( uiCode >= ((BIG5_HIBYTE_START0<<8)|BIG5_LOBYTE_LOBOUND0) && uiCode < (((BIG5_HIBYTE_START0<<8)|BIG5_LOBYTE_LOBOUND0)+20) ) { @@ -388,7 +388,7 @@ static bool Taiwanese_IsTrailingPunctuation( unsigned int uiCode ) static int Taiwanese_CollapseBig5Code( unsigned int uiCode ) { if (Taiwanese_ValidBig5Code( uiCode )) - { + { uiCode -= (BIG5_HIBYTE_START0 * 256) + BIG5_LOBYTE_LOBOUND0; // sneaky maths on both bytes, reduce to 0x0000 onwards if ( (uiCode & 0xFF) >= (BIG5_LOBYTE_LOBOUND1-1)-BIG5_LOBYTE_LOBOUND0) { @@ -440,7 +440,7 @@ static bool Japanese_ValidShiftJISCode( byte _iHi, byte _iLo ) return true; } } - + return false; } @@ -456,7 +456,7 @@ static bool Japanese_IsTrailingPunctuation( unsigned int uiCode ) { // so far I'm just counting the first 18 chars, those seem to be all the basic punctuation... // - if ( uiCode >= ((SHIFTJIS_HIBYTE_START0<<8)|SHIFTJIS_LOBYTE_START0) && + if ( uiCode >= ((SHIFTJIS_HIBYTE_START0<<8)|SHIFTJIS_LOBYTE_START0) && uiCode < (((SHIFTJIS_HIBYTE_START0<<8)|SHIFTJIS_LOBYTE_START0)+18) ) { @@ -474,9 +474,9 @@ static bool Japanese_IsTrailingPunctuation( unsigned int uiCode ) static int Japanese_CollapseShiftJISCode( unsigned int uiCode ) { if (Japanese_ValidShiftJISCode( uiCode )) - { + { uiCode -= ((SHIFTJIS_HIBYTE_START0<<8)|SHIFTJIS_LOBYTE_START0); // sneaky maths on both bytes, reduce to 0x0000 onwards - + if ( (uiCode & 0xFF) >= (SHIFTJIS_LOBYTE_START1)-SHIFTJIS_LOBYTE_START0) { uiCode -= ((SHIFTJIS_LOBYTE_START1)-SHIFTJIS_LOBYTE_STOP0)-1; @@ -505,10 +505,10 @@ static int Japanese_InitFields(int &iGlyphTPs, const char *&psLang) // ======================== some Chinese stuff ============================== -#define GB_HIBYTE_START 0xA1 // range is... -#define GB_HIBYTE_STOP 0xF7 // ... inclusive -#define GB_LOBYTE_LOBOUND 0xA0 // range is... -#define GB_LOBYTE_HIBOUND 0xFF // ...bounding (ie only valid in between these points, but NULLs in charsets for these codes) +#define GB_HIBYTE_START 0xA1 // range is... +#define GB_HIBYTE_STOP 0xF7 // ... inclusive +#define GB_LOBYTE_LOBOUND 0xA0 // range is... +#define GB_LOBYTE_HIBOUND 0xFF // ...bounding (ie only valid in between these points, but NULLs in charsets for these codes) #define GB_CODES_PER_ROW 95 // 1 more than the number of glyphs extern qboolean Language_IsChinese( void ); @@ -527,14 +527,14 @@ static inline bool Chinese_ValidGBCode( unsigned int uiCode) return Chinese_ValidGBCode( uiCode >> 8, uiCode & 0xFF ); } - +#ifndef JK2_MODE // only call this when Chinese_ValidGBCode() has already returned true... // static bool Chinese_IsTrailingPunctuation( unsigned int uiCode ) { // so far I'm just counting the first 13 chars, those seem to be all the basic punctuation... // - if ( uiCode > ((GB_HIBYTE_START<<8)|GB_LOBYTE_LOBOUND) && + if ( uiCode > ((GB_HIBYTE_START<<8)|GB_LOBYTE_LOBOUND) && uiCode < (((GB_HIBYTE_START<<8)|GB_LOBYTE_LOBOUND)+14) ) { @@ -543,7 +543,7 @@ static bool Chinese_IsTrailingPunctuation( unsigned int uiCode ) return false; } - +#endif // takes a GB double-byte code and collapses down to a 0..n glyph index... // Assumes rows are 96 wide (glyph slots), not 94 wide (actual glyphs), so I can ignore boundary markers @@ -553,9 +553,9 @@ static bool Chinese_IsTrailingPunctuation( unsigned int uiCode ) static int Chinese_CollapseGBCode( unsigned int uiCode ) { if (Chinese_ValidGBCode( uiCode )) - { + { uiCode -= (GB_HIBYTE_START * 256) + GB_LOBYTE_LOBOUND; // sneaky maths on both bytes, reduce to 0x0000 onwards - uiCode = ((uiCode >> 8) * GB_CODES_PER_ROW) + (uiCode & 0xFF); + uiCode = ((uiCode >> 8) * GB_CODES_PER_ROW) + (uiCode & 0xFF); return uiCode; } @@ -585,32 +585,33 @@ static int Thai_IsAccentChar( unsigned int uiCode ) { switch (uiCode) { - case 209: + case 209: case 212: case 213: case 214: case 215: case 216: case 217: case 218: case 231: case 232: case 233: case 234: case 235: case 236: case 237: case 238: return true; } - + return false; } */ +#ifndef JK2_MODE // returns a valid Thai code (or 0), based on taking 1,2 or 3 bytes from the supplied byte stream // Fills in with 1,2 or 3 static int Thai_ValidTISCode( const byte *psString, int &iThaiBytes ) -{ +{ // try a 1-byte code first... // if (psString[0] >= 160) // so western letters drop through and use normal font { // this code is heavily little-endian, so someone else will need to port for Mac etc... (not my problem ;-) - // + // union CodeToTry_t { char sChars[4]; unsigned int uiCode; }; - + CodeToTry_t CodeToTry; CodeToTry.uiCode = 0; // important that we clear all 4 bytes in sChars here @@ -618,7 +619,7 @@ static int Thai_ValidTISCode( const byte *psString, int &iThaiBytes ) // int i = 0; for (i = 0; i<3; i++) - { + { CodeToTry.sChars[i] = psString[i]; int iIndex = g_ThaiCodes.GetValidIndex( CodeToTry.uiCode ); @@ -637,6 +638,7 @@ static int Thai_ValidTISCode( const byte *psString, int &iThaiBytes ) return 0; } +#endif // special case, thai can only break on certain letters, and since the rules are complicated then // we tell the translators to put an underscore ('_') between each word even though in Thai they're @@ -659,7 +661,7 @@ static int Thai_CollapseTISCode( unsigned int uiCode ) if (iCollapsedIndex != -1) { return iCollapsedIndex; - } + } } return 0; @@ -684,7 +686,7 @@ static int Thai_InitFields(int &iGlyphTPs, const char *&psLang) // Note that I have to have this 3-param form instead of advancing a passed-in "const char **psText" because of VM-crap where you can only change ptr-contents, not ptrs themselves. Bleurgh. Ditto the qtrue:qfalse crap instead of just returning stuff straight through. // unsigned int AnyLanguage_ReadCharFromString( char *psText, int *piAdvanceCount, qboolean *pbIsTrailingPunctuation /* = NULL */) -{ +{ #ifdef JK2_MODE // JK2 does this func a little differently --eez const byte *psString = (const byte *) psText; // avoid sign-promote bug @@ -698,7 +700,7 @@ unsigned int AnyLanguage_ReadCharFromString( char *psText, int *piAdvanceCount, psText += 2; *piAdvanceCount = 2; - // not going to bother testing for korean punctuation here, since korean already + // not going to bother testing for korean punctuation here, since korean already // uses spaces, and I don't have the punctuation glyphs defined, only the basic 2350 hanguls // if ( pbIsTrailingPunctuation) @@ -756,11 +758,11 @@ unsigned int AnyLanguage_ReadCharFromString( char *psText, int *piAdvanceCount, if (pbIsTrailingPunctuation) { - *pbIsTrailingPunctuation = (uiLetter == '!' || - uiLetter == '?' || - uiLetter == ',' || - uiLetter == '.' || - uiLetter == ';' || + *pbIsTrailingPunctuation = (uiLetter == '!' || + uiLetter == '?' || + uiLetter == ',' || + uiLetter == '.' || + uiLetter == ';' || uiLetter == ':' ); } @@ -779,7 +781,7 @@ unsigned int AnyLanguage_ReadCharFromString( char *psText, int *piAdvanceCount, uiLetter = (psString[0] * 256) + psString[1]; *piAdvanceCount = 2; - // not going to bother testing for korean punctuation here, since korean already + // not going to bother testing for korean punctuation here, since korean already // uses spaces, and I don't have the punctuation glyphs defined, only the basic 2350 hanguls // if ( pbIsTrailingPunctuation) @@ -805,7 +807,7 @@ unsigned int AnyLanguage_ReadCharFromString( char *psText, int *piAdvanceCount, { *pbIsTrailingPunctuation = Taiwanese_IsTrailingPunctuation( uiLetter ) ? qtrue : qfalse; } - + return uiLetter; } } @@ -817,7 +819,7 @@ unsigned int AnyLanguage_ReadCharFromString( char *psText, int *piAdvanceCount, { uiLetter = (psString[0] * 256) + psString[1]; *piAdvanceCount = 2; - + // need to ask if this is a trailing (ie like a comma or full-stop) punctuation?... // if ( pbIsTrailingPunctuation) @@ -878,11 +880,11 @@ unsigned int AnyLanguage_ReadCharFromString( char *psText, int *piAdvanceCount, if (pbIsTrailingPunctuation) { - *pbIsTrailingPunctuation = (uiLetter == '!' || - uiLetter == '?' || - uiLetter == ',' || - uiLetter == '.' || - uiLetter == ';' || + *pbIsTrailingPunctuation = (uiLetter == '!' || + uiLetter == '?' || + uiLetter == ',' || + uiLetter == '.' || + uiLetter == ';' || uiLetter == ':' ) ? qtrue : qfalse; } @@ -893,7 +895,7 @@ unsigned int AnyLanguage_ReadCharFromString( char *psText, int *piAdvanceCount, #ifdef JK2_MODE unsigned int AnyLanguage_ReadCharFromString( char **psText, qboolean *pbIsTrailingPunctuation /* = NULL */) -{ +{ int advance = 0; unsigned int advance2 = AnyLanguage_ReadCharFromString (*psText, &advance, pbIsTrailingPunctuation); *psText += advance; @@ -927,10 +929,10 @@ qboolean Language_UsesSpaces(void) // ( korean uses spaces ) switch ( GetLanguageEnum() ) { - case eTaiwanese: - case eJapanese: - case eChinese: - case eThai: + case eTaiwanese: + case eJapanese: + case eChinese: + case eThai: return qfalse; default: break; @@ -955,7 +957,7 @@ CFontInfo::CFontInfo(const char *_fontName) // char fontName[MAX_QPATH]; sprintf(fontName,"fonts/%s.fontdat",COM_SkipPath(const_cast(_fontName))); // COM_SkipPath should take a const char *, but it's just possible people use it as a char * I guess, so I have to hack around like this - + // clear some general things... // m_pThaiData = NULL; @@ -1038,7 +1040,7 @@ CFontInfo::CFontInfo(const char *_fontName) // SBCS override languages... // - fileHandle_t f; + fileHandle_t f; for (int i=0; g_SBCSOverrideLanguages[i].m_psName ;i++) { char sTemp[MAX_QPATH]; @@ -1062,10 +1064,10 @@ CFontInfo::CFontInfo(const char *_fontName) case 1: m_iAsianGlyphsAcross = Taiwanese_InitFields (iGlyphTPs, psLang); break; case 2: m_iAsianGlyphsAcross = Japanese_InitFields (iGlyphTPs, psLang); break; case 3: m_iAsianGlyphsAcross = Chinese_InitFields (iGlyphTPs, psLang); break; - case 4: m_iAsianGlyphsAcross = Thai_InitFields (iGlyphTPs, psLang); + case 4: m_iAsianGlyphsAcross = Thai_InitFields (iGlyphTPs, psLang); { // additional files needed for Thai language... - // + // ri.FS_FOpenFileRead( sFILENAME_THAI_WIDTHS , &f, qfalse ); if (f) { ri.FS_FCloseFile( f ); @@ -1074,7 +1076,7 @@ CFontInfo::CFontInfo(const char *_fontName) ri.FS_FOpenFileRead( sFILENAME_THAI_CODES, &f, qfalse ); if (f) { ri.FS_FCloseFile( f ); - } + } } break; } @@ -1083,7 +1085,7 @@ CFontInfo::CFontInfo(const char *_fontName) { Com_sprintf(sTemp,sizeof(sTemp), "fonts/%s_%d_1024_%d.tga", psLang, 1024/m_iAsianGlyphsAcross, i); - // RE_RegisterShaderNoMip( sTemp ); // don't actually need to load it, so... + // RE_RegisterShaderNoMip( sTemp ); // don't actually need to load it, so... ri.FS_FOpenFileRead( sTemp, &f, qfalse ); if (f) { ri.FS_FCloseFile( f ); @@ -1152,7 +1154,7 @@ void CFontInfo::UpdateAsianIfNeeded( bool bForceReEval /* = false */ ) // (but for now, we just use the one glyph set) // } - + for (int i = 0; i < iGlyphTPs; i++) { // (Note!! assumption for S,T calculations: all Asian glyph textures pages are square except for last one) @@ -1164,7 +1166,7 @@ void CFontInfo::UpdateAsianIfNeeded( bool bForceReEval /* = false */ ) // m_hAsianShaders[i] = RE_RegisterShaderNoMip( sTemp ); } - + // for now I'm hardwiring these, but if we ever have more than one glyph set per language then they'll be changed... // m_iAsianPagesLoaded = iGlyphTPs; // not necessarily true, but will be safe, and show up obvious if something missing @@ -1174,7 +1176,7 @@ void CFontInfo::UpdateAsianIfNeeded( bool bForceReEval /* = false */ ) } if (bForceReEval) - { + { // now init the Asian member glyph fields to make them come out the same size as the western ones // that they serve as an alternative for... // @@ -1202,7 +1204,7 @@ void CFontInfo::UpdateAsianIfNeeded( bool bForceReEval /* = false */ ) } } else - { + { // no western glyphs available, so don't attempt to match asian... // FlagNoAsianGlyphs(); @@ -1227,11 +1229,11 @@ static CFontInfo *GetFont_Actual(int index) } -// needed to add *piShader param because of multiple TPs, +// needed to add *piShader param because of multiple TPs, // if not passed in, then I also skip S,T calculations for re-usable static asian glyphinfo struct... // const glyphInfo_t *CFontInfo::GetLetter(const unsigned int uiLetter, int *piShader /* = NULL */) -{ +{ if ( AsianGlyphsAvailable() ) { int iCollapsedAsianCode = GetCollapsedAsianCode( uiLetter ); @@ -1241,7 +1243,7 @@ const glyphInfo_t *CFontInfo::GetLetter(const unsigned int uiLetter, int *piShad { // (Note!! assumption for S,T calculations: all asian glyph textures pages are square except for last one // which may or may not be half height) - but not for Thai - // + // int iTexturePageIndex = iCollapsedAsianCode / (m_iAsianGlyphsAcross * m_iAsianGlyphsAcross); if (iTexturePageIndex > m_iAsianPagesLoaded) @@ -1254,18 +1256,18 @@ const glyphInfo_t *CFontInfo::GetLetter(const unsigned int uiLetter, int *piShad iCollapsedAsianCode -= iTexturePageIndex * (m_iAsianGlyphsAcross * m_iAsianGlyphsAcross); const int iColumn = iCollapsedAsianCode % m_iAsianGlyphsAcross; - const int iRow = iCollapsedAsianCode / m_iAsianGlyphsAcross; + const int iRow = iCollapsedAsianCode / m_iAsianGlyphsAcross; const bool bHalfT = (iTexturePageIndex == (m_iAsianPagesLoaded - 1) && m_bAsianLastPageHalfHeight); const int iAsianGlyphsDown = (bHalfT) ? m_iAsianGlyphsAcross / 2 : m_iAsianGlyphsAcross; switch ( GetLanguageEnum() ) { case eKorean: - default: + default: { m_AsianGlyph.s = (float)( iColumn ) / (float)m_iAsianGlyphsAcross; m_AsianGlyph.t = (float)( iRow ) / (float) iAsianGlyphsDown; - m_AsianGlyph.s2 = (float)( iColumn + 1) / (float)m_iAsianGlyphsAcross; + m_AsianGlyph.s2 = (float)( iColumn + 1) / (float)m_iAsianGlyphsAcross; m_AsianGlyph.t2 = (float)( iRow + 1 ) / (float) iAsianGlyphsDown; } break; @@ -1302,11 +1304,11 @@ const glyphInfo_t *CFontInfo::GetLetter(const unsigned int uiLetter, int *piShad iGlyphWidth= 20; // } m_AsianGlyph.s = (float)(iGlyphXpos) / 1024.0f; - m_AsianGlyph.t = (float)(((1024 / iAsianGlyphsDown ) * ( iRow )) ) / 1024.0f; + m_AsianGlyph.t = (float)(((1024 / iAsianGlyphsDown ) * ( iRow )) ) / 1024.0f; // technically this .s2 line should be modified to blit only the correct width, but since // all Thai glyphs are up against the left edge of their cells and have blank to the cell // boundary then it's better to keep these calculations simpler... - + m_AsianGlyph.s2 = (float)(iGlyphXpos+iGlyphWidth) / 1024.0f; m_AsianGlyph.t2 = (float)(((1024 / iAsianGlyphsDown ) * ( iRow+1 ))-1) / 1024.0f; @@ -1339,7 +1341,7 @@ const glyphInfo_t *CFontInfo::GetLetter(const unsigned int uiLetter, int *piShad memcpy(&m_AsianGlyph,pGlyph,sizeof(m_AsianGlyph)); // *before* changin pGlyph! // CFontInfo *pOriginalFont = GetFont_Actual( this->m_iOriginalFontWhenSBCSOverriden ); -// pGlyph = &pOriginalFont->mGlyphs[ uiLetter & 0xff ]; +// pGlyph = &pOriginalFont->mGlyphs[ uiLetter & 0xff ]; #define ASSIGN_WITH_ROUNDING(_dst,_src) _dst = mbRoundCalcs ? Round( m_fAltSBCSFontScaleFactor * _src ) : m_fAltSBCSFontScaleFactor * (float)_src; @@ -1382,7 +1384,7 @@ const int CFontInfo::GetLetterWidth(unsigned int uiLetter) } const int CFontInfo::GetLetterHorizAdvance(unsigned int uiLetter) -{ +{ const glyphInfo_t *pGlyph = GetLetter( uiLetter ); return pGlyph->horizAdvance ? pGlyph->horizAdvance : mGlyphs[(unsigned)'.'].horizAdvance; } @@ -1448,7 +1450,7 @@ CFontInfo *GetFont(int index) for (int i=0; g_SBCSOverrideLanguages[i].m_psName; i++) { CFontInfo *pAltFont = GetFont_SBCSOverride( pFont, g_SBCSOverrideLanguages[i].m_eLanguage, g_SBCSOverrideLanguages[i].m_psName ); - if (pAltFont) + if (pAltFont) { return pAltFont; } @@ -1460,7 +1462,7 @@ CFontInfo *GetFont(int index) int RE_Font_StrLenPixels(const char *psText, const int iFontHandle, const float fScale) -{ +{ #ifdef JK2_MODE // Yes..even this func is a little different, to the point where it doesn't work. --eez float fMaxWidth = 0.0f; @@ -1489,7 +1491,7 @@ int RE_Font_StrLenPixels(const char *psText, const int iFontHandle, const float else { int iPixelAdvance = curfont->GetLetterHorizAdvance( uiLetter ); - + float fValue = iPixelAdvance * ((uiLetter > 255) ? fScaleAsian : fScale); fThisWidth += curfont->mbRoundCalcs ? Round( fValue ) : fValue; if (fThisWidth > fMaxWidth) @@ -1542,7 +1544,7 @@ int RE_Font_StrLenPixels(const char *psText, const int iFontHandle, const float else { int iPixelAdvance = curfont->GetLetterHorizAdvance( uiLetter ); - + float fValue = iPixelAdvance * ((uiLetter > (unsigned)g_iNonScaledCharRange) ? fScaleAsian : fScale); fThisWidth += curfont->mbRoundCalcs ? Round( fValue ) : fValue; if (fThisWidth > fMaxWidth) @@ -1560,7 +1562,7 @@ int RE_Font_StrLenPixels(const char *psText, const int iFontHandle, const float // not really a font function, but keeps naming consistant... // int RE_Font_StrLenChars(const char *psText) -{ +{ // logic for this function's letter counting must be kept same in this function and RE_Font_DrawString() // int iCharCount = 0; @@ -1587,17 +1589,17 @@ int RE_Font_StrLenChars(const char *psText) } break; // colour code (note next-char skip) case 10: break; // linefeed - case 13: break; // return + case 13: break; // return case '_': iCharCount += (GetLanguageEnum() == eThai && (((unsigned char *)psText)[0] >= TIS_GLYPHS_START))?0:1; break; // special word-break hack default: iCharCount++; break; } } - + return iCharCount; } int RE_Font_HeightPixels(const int iFontHandle, const float fScale) -{ +{ CFontInfo *curfont; curfont = GetFont(iFontHandle); @@ -1675,7 +1677,7 @@ void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, c RE_Font_DrawString(ox + offset, oy + offset, psText, v4DKGREY2, iFontHandle & SET_MASK, iMaxPixelWidth, fScale); gbInShadow = qfalse; } - + RE_SetColor( rgba ); // Now we take off the training wheels and become a big font renderer @@ -1701,7 +1703,7 @@ void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, c { vec4_t color; Com_Memcpy( color, g_color_table[colour], sizeof( color ) ); - color[3] = rgba[3]; + color[3] = rgba ? rgba[3] : 1.0f; RE_SetColor( color ); } } @@ -1717,7 +1719,7 @@ void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, c case 13: // Return break; case 32: // Space - pLetter = curfont->GetLetter(' '); + pLetter = curfont->GetLetter(' '); fx += curfont->mbRoundCalcs ? Round(pLetter->horizAdvance * fScale) : pLetter->horizAdvance * fScale; bNextTextWouldOverflow = ( iMaxPixelWidth != -1 && ((fx-fox) > (float)iMaxPixelWidth) ); break; @@ -1735,7 +1737,7 @@ void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, c if (!bNextTextWouldOverflow) { // this 'mbRoundCalcs' stuff is crap, but the only way to make the font code work. Sigh... - // + // fy = foy - (curfont->mbRoundCalcs ? Round(pLetter->baseline * fThisScale) : pLetter->baseline * fThisScale); RE_StretchPic(curfont->mbRoundCalcs ? fx + Round(pLetter->horizOffset * fThisScale) : fx + pLetter->horizOffset * fThisScale, // float x @@ -1746,16 +1748,16 @@ void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, c pLetter->t, // float t1 pLetter->s2, // float s2 pLetter->t2, // float t2 - //lastcolour.c, + //lastcolour.c, hShader // qhandle_t hShader ); fx += fAdvancePixels; } break; - } + } } - //let it remember the old color //RE_SetColor(NULL);; + //let it remember the old color //RE_SetColor(NULL); #else static qboolean gbInShadow = qfalse; // MUST default to this float fox, foy, fx, fy; @@ -1778,13 +1780,13 @@ void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, c // { // psText = "Wp:\B6}\B7F\A7a \BFp\B7G\B4\B5\A1A\A7Ʊ\E6\A7A\B9\B3\A5L\ADÌ»\A1\AA\BA\A4@\BC˦\E6\A1C"; // } -// else +// else // if (GetLanguageEnum() == eChinese) // { // //psText = "Ó¶\B1\F8Õ½\B3\A1II Ô¼\BA\B2?Ī\C1\D6˹ \C8\CE\CE\F1ʧ\B0\DC \C4\E3Òª\CC\D7\D3û\AD\C3\E6\C9趨\B5ı\E4\B8\FC\C2\F0\A3\BF Ô¤\C9\E8,S3 ѹ\CB\F5,DXT1 ѹ\CB\F5,DXT5 ѹ\CB\F5,16 Bit,32 Bit"; // psText = "Ó¶\B1\F8Õ½\B3\A1II"; // } -// else +// else // if (GetLanguageEnum() == eThai) // { // //psText = "\C1ҵðҹ\BC\C5Ôµ\C0ѳ\B1\EC\CDص\CA\D2Ë¡\C3\C3\C1\C3\CB\D1\CA\CA\D3\CB\C3Ѻ\CDÑ¡\A2\C3\D0\E4\B7·\D5\E8\E3\AA\E9\A1Ѻ\A4\CD\C1\BE\D4\C7\E0\B5\CD\C3\EC"; @@ -1843,7 +1845,7 @@ void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, c RE_Font_DrawString(ox + offset, oy + offset, psText, v4DKGREY2, iFontHandle & SET_MASK, iMaxPixelWidth, fScale); gbInShadow = qfalse; } - + RE_SetColor( rgba ); // Now we take off the training wheels and become a big font renderer @@ -1874,7 +1876,7 @@ void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, c case 13: // Return break; case 32: // Space - pLetter = curfont->GetLetter(' '); + pLetter = curfont->GetLetter(' '); fx += curfont->mbRoundCalcs ? Round(pLetter->horizAdvance * fScale) : pLetter->horizAdvance * fScale; bNextTextWouldOverflow = ( iMaxPixelWidth != -1 && ((fx-fox) > (float)iMaxPixelWidth) ) ? qtrue : qfalse; // yeuch break; @@ -1895,7 +1897,7 @@ void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, c { vec4_t color; Com_Memcpy( color, g_color_table[colour], sizeof( color ) ); - color[3] = rgba[3]; + color[3] = rgba ? rgba[3] : 1.0f; RE_SetColor( color ); } break; @@ -1923,7 +1925,7 @@ void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, c if (!bNextTextWouldOverflow) { // this 'mbRoundCalcs' stuff is crap, but the only way to make the font code work. Sigh... - // + // fy = foy - (curfont->mbRoundCalcs ? Round(pLetter->baseline * fThisScale) : pLetter->baseline * fThisScale); if (curfont->m_fAltSBCSFontScaleFactor != -1) { @@ -1938,20 +1940,20 @@ void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, c pLetter->t, // float t1 pLetter->s2, // float s2 pLetter->t2, // float t2 - //lastcolour.c, + //lastcolour.c, hShader // qhandle_t hShader ); fx += fAdvancePixels; } break; - } + } } - //let it remember the old color //RE_SetColor(NULL);; + //let it remember the old color //RE_SetColor(NULL); #endif } -int RE_RegisterFont(const char *psName) +int RE_RegisterFont(const char *psName) { FontIndexMap_t::iterator it = g_mapFontIndexes.find(psName); if (it != g_mapFontIndexes.end() ) @@ -2028,11 +2030,11 @@ void R_ReloadFonts_f(void) { // first, grab all the currently-registered fonts IN THE ORDER THEY WERE REGISTERED... // - vector vstrFonts; + std::vector vstrFonts; int iFontToFind = 1; for (; iFontToFind < g_iCurrentFontIndex; iFontToFind++) - { + { FontIndexMap_t::iterator it = g_mapFontIndexes.begin(); for (; it != g_mapFontIndexes.end(); ++it) { diff --git a/code/rd-common/tr_font.h b/code/rd-common/tr_font.h index aa5383a5e4..b51deeae68 100644 --- a/code/rd-common/tr_font.h +++ b/code/rd-common/tr_font.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- tr_font.h // diff --git a/code/rd-common/tr_image_jpg.cpp b/code/rd-common/tr_image_jpg.cpp index 2f4d82768a..cd10e01bc1 100644 --- a/code/rd-common/tr_image_jpg.cpp +++ b/code/rd-common/tr_image_jpg.cpp @@ -1,5 +1,27 @@ -// leave this as first line for PCH reasons... -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "../server/exe_headers.h" #include "tr_common.h" @@ -11,8 +33,12 @@ * (stdio.h is sufficient on ANSI-conforming systems.) * You may also wish to include "jerror.h". */ +#ifdef USE_INTERNAL_JPEG #define JPEG_INTERNALS #include "jpeg-8c/jpeglib.h" +#else +#include +#endif static void R_JPGErrorExit(j_common_ptr cinfo) { @@ -204,6 +230,157 @@ void LoadJPG( const char *filename, unsigned char **pic, int *width, int *height /* And we're done! */ } +#ifdef JK2_MODE +void LoadJPGFromBuffer( byte *inputBuffer, size_t len, unsigned char **pic, int *width, int *height ) { + /* This struct contains the JPEG decompression parameters and pointers to + * working space (which is allocated as needed by the JPEG library). + */ + struct jpeg_decompress_struct cinfo = { NULL }; + /* We use our private extension JPEG error handler. + * Note that this struct must live as long as the main JPEG parameter + * struct, to avoid dangling-pointer problems. + */ + /* This struct represents a JPEG error handler. It is declared separately + * because applications often want to supply a specialized error handler + * (see the second half of this file for an example). But here we just + * take the easy way out and use the standard error handler, which will + * print a message on stderr and call exit() if compression fails. + * Note that this struct must live as long as the main JPEG parameter + * struct, to avoid dangling-pointer problems. + */ + struct jpeg_error_mgr jerr; + /* More stuff */ + JSAMPARRAY buffer; /* Output row buffer */ + unsigned int row_stride; /* physical row width in output buffer */ + unsigned int pixelcount, memcount; + unsigned int sindex, dindex; + byte *out; + byte *buf; + + if (!inputBuffer) { + return; + } + + /* Step 1: allocate and initialize JPEG decompression object */ + + /* We have to set up the error handler first, in case the initialization + * step fails. (Unlikely, but it could happen if you are out of memory.) + * This routine fills in the contents of struct jerr, and returns jerr's + * address which we place into the link field in cinfo. + */ + cinfo.err = jpeg_std_error(&jerr); + cinfo.err->error_exit = R_JPGErrorExit; + cinfo.err->output_message = R_JPGOutputMessage; + + /* Now we can initialize the JPEG decompression object. */ + jpeg_create_decompress(&cinfo); + + /* Step 2: specify data source (eg, a file) */ + + jpeg_mem_src(&cinfo, inputBuffer, len); + + /* Step 3: read file parameters with jpeg_read_header() */ + + (void) jpeg_read_header(&cinfo, TRUE); + /* We can ignore the return value from jpeg_read_header since + * (a) suspension is not possible with the stdio data source, and + * (b) we passed TRUE to reject a tables-only JPEG file as an error. + * See libjpeg.doc for more info. + */ + + /* Step 4: set parameters for decompression */ + + + /* Make sure it always converts images to RGB color space. This will + * automatically convert 8-bit greyscale images to RGB as well. */ + cinfo.out_color_space = JCS_RGB; + + /* Step 5: Start decompressor */ + + (void) jpeg_start_decompress(&cinfo); + /* We can ignore the return value since suspension is not possible + * with the stdio data source. + */ + + /* We may need to do some setup of our own at this point before reading + * the data. After jpeg_start_decompress() we have the correct scaled + * output image dimensions available, as well as the output colormap + * if we asked for color quantization. + * In this example, we need to make an output work buffer of the right size. + */ + /* JSAMPLEs per row in output buffer */ + pixelcount = cinfo.output_width * cinfo.output_height; + + if(!cinfo.output_width || !cinfo.output_height + || ((pixelcount * 4) / cinfo.output_width) / 4 != cinfo.output_height + || pixelcount > 0x1FFFFFFF || cinfo.output_components != 3 + ) + { + // Free the memory to make sure we don't leak memory + jpeg_destroy_decompress(&cinfo); + + ri.Printf( PRINT_ALL, "LoadJPG: invalid image format: %dx%d*4=%d, components: %d", + cinfo.output_width, cinfo.output_height, pixelcount * 4, cinfo.output_components); + return; + } + + memcount = pixelcount * 4; + row_stride = cinfo.output_width * cinfo.output_components; + + out = (byte *)Z_Malloc(memcount, TAG_TEMP_WORKSPACE, qfalse); + + *width = cinfo.output_width; + *height = cinfo.output_height; + + /* Step 6: while (scan lines remain to be read) */ + /* jpeg_read_scanlines(...); */ + + /* Here we use the library's state variable cinfo.output_scanline as the + * loop counter, so that we don't have to keep track ourselves. + */ + while (cinfo.output_scanline < cinfo.output_height) { + /* jpeg_read_scanlines expects an array of pointers to scanlines. + * Here the array is only one element long, but you could ask for + * more than one scanline at a time if that's more convenient. + */ + buf = ((out+(row_stride*cinfo.output_scanline))); + buffer = &buf; + (void) jpeg_read_scanlines(&cinfo, buffer, 1); + } + + buf = out; + // Expand from RGB to RGBA + sindex = pixelcount * cinfo.output_components; + dindex = memcount; + + do { + buf[--dindex] = 255; + buf[--dindex] = buf[--sindex]; + buf[--dindex] = buf[--sindex]; + buf[--dindex] = buf[--sindex]; + } while(sindex); + + *pic = out; + + /* Step 7: Finish decompression */ + + (void) jpeg_finish_decompress(&cinfo); + /* We can ignore the return value since suspension is not possible + * with the stdio data source. + */ + + /* Step 8: Release JPEG decompression object */ + + /* This is an important step since it will release a good deal of memory. */ + jpeg_destroy_decompress(&cinfo); + + /* At this point you may want to check to see whether any corrupt-data + * warnings occurred (test whether jerr.pub.num_warnings is nonzero). + */ + + /* And we're done! */ +} +#endif /* Expanded data destination object for stdio output */ diff --git a/code/rd-common/tr_image_load.cpp b/code/rd-common/tr_image_load.cpp index f930fed5c0..12f009fa4d 100644 --- a/code/rd-common/tr_image_load.cpp +++ b/code/rd-common/tr_image_load.cpp @@ -1,5 +1,27 @@ -// leave this as first line for PCH reasons... -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "../server/exe_headers.h" #include "../rd-common/tr_common.h" diff --git a/code/rd-common/tr_image_png.cpp b/code/rd-common/tr_image_png.cpp index b645a1fc20..8e51eaaa90 100644 --- a/code/rd-common/tr_image_png.cpp +++ b/code/rd-common/tr_image_png.cpp @@ -1,5 +1,27 @@ -// leave this as first line for PCH reasons... -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "../server/exe_headers.h" #include "tr_common.h" @@ -29,7 +51,7 @@ int RE_SavePNG( const char *filename, byte *buf, size_t width, size_t height, in */ int depth = 8; - fp = ri.FS_FOpenFileWrite( filename ); + fp = ri.FS_FOpenFileWrite( filename, qtrue ); if ( !fp ) { goto fopen_failed; } diff --git a/code/rd-common/tr_image_tga.cpp b/code/rd-common/tr_image_tga.cpp index 57e9607fde..417ffa3130 100644 --- a/code/rd-common/tr_image_tga.cpp +++ b/code/rd-common/tr_image_tga.cpp @@ -1,5 +1,27 @@ -// leave this as first line for PCH reasons... -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "../server/exe_headers.h" #include "tr_common.h" diff --git a/code/rd-common/tr_noise.cpp b/code/rd-common/tr_noise.cpp index a69f569776..f771ffebe0 100644 --- a/code/rd-common/tr_noise.cpp +++ b/code/rd-common/tr_noise.cpp @@ -1,29 +1,31 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // tr_noise.c -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - - #include "tr_common.h" #define NOISE_SIZE 256 diff --git a/code/rd-common/tr_public.h b/code/rd-common/tr_public.h index b2cb74bc3f..592f15706f 100644 --- a/code/rd-common/tr_public.h +++ b/code/rd-common/tr_public.h @@ -1,20 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #pragma once @@ -24,12 +30,7 @@ This file is part of Jedi Academy. #include "../ghoul2/G2.h" #include "../ghoul2/ghoul2_gore.h" -#ifdef _WIN32 -// down -#include "../win32/win_local.h" -#endif - -#define REF_API_VERSION 13 +#define REF_API_VERSION 15 typedef struct { void (QDECL *Printf) ( int printLevel, const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); @@ -68,10 +69,10 @@ typedef struct { void (*FS_FreeFile) ( void *buffer ); void (*FS_FreeFileList) ( char **fileList ); int (*FS_Read) ( void *buffer, int len, fileHandle_t f ); - int (*FS_ReadFile) ( const char *qpath, void **buffer ); + long (*FS_ReadFile) ( const char *qpath, void **buffer ); void (*FS_FCloseFile) ( fileHandle_t f ); - int (*FS_FOpenFileRead) ( const char *qpath, fileHandle_t *file, qboolean uniqueFILE ); - fileHandle_t (*FS_FOpenFileWrite) ( const char *qpath ); + long (*FS_FOpenFileRead) ( const char *qpath, fileHandle_t *file, qboolean uniqueFILE ); + fileHandle_t (*FS_FOpenFileWrite) ( const char *qpath, qboolean safe ); int (*FS_FOpenFileByMode) ( const char *qpath, fileHandle_t *f, fsMode_t mode ); qboolean (*FS_FileExists) ( const char *file ); int (*FS_FileIsInPAK) ( const char *filename ); @@ -91,14 +92,14 @@ typedef struct { int bits, const char *psAudioFile /* = NULL */ ); void (*CIN_UploadCinematic) ( int handle ); -#ifdef _WIN32 - WinVars_t * (*GetWinVars) ( void ); //g_wv -#endif + // window handling + window_t (*WIN_Init) ( const windowDesc_t *desc, glconfig_t *glConfig ); + void (*WIN_SetGamma) ( glconfig_t *glConfig, byte red[256], byte green[256], byte blue[256] ); + void (*WIN_Present) ( window_t *window ); + void (*WIN_Shutdown) ( void ); - // input event handling - void (*IN_Init) ( void *windowData ); - void (*IN_Shutdown) ( void ); - void (*IN_Restart) ( void ); + // OpenGL-specific + void * (*GL_GetProcAddress) ( const char *name ); CMiniHeap * (*GetG2VertSpaceServer) ( void ); @@ -206,6 +207,11 @@ typedef struct { // for use with save-games mainly... void (*GetScreenShot)(byte *data, int w, int h); + +#ifdef JK2_MODE + size_t (*SaveJPGToBuffer)(byte *buffer, size_t bufSize, int quality, int image_width, int image_height, byte *image_buffer, int padding ); + void (*LoadJPGFromBuffer)( byte *inputBuffer, size_t len, byte **pic, int *width, int *height ); +#endif // this is so you can get access to raw pixels from a graphics format (TGA/JPG/BMP etc), // currently only the save game uses it (to make raw shots for the autosaves) diff --git a/code/rd-common/tr_types.h b/code/rd-common/tr_types.h index 7e6fea9a9a..164d4b6019 100644 --- a/code/rd-common/tr_types.h +++ b/code/rd-common/tr_types.h @@ -1,20 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __TR_TYPES_H #define __TR_TYPES_H @@ -214,7 +220,7 @@ typedef enum { TC_S3TC_DXT } textureCompression_t; -typedef struct { +typedef struct glconfig_s { const char *renderer_string; const char *vendor_string; const char *version_string; diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index 11e991a0f9..12dacd3d7a 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -1,4 +1,20 @@ -cmake_minimum_required(VERSION 2.8) +#============================================================================ +# Copyright (C) 2013 - 2015, OpenJK contributors +# +# This file is part of the OpenJK source code. +# +# OpenJK is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +#============================================================================ # Make sure the user is not executing this script directly if(NOT InOpenJK) @@ -8,7 +24,11 @@ endif(NOT InOpenJK) if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) set(SPRDVanillaRendererIncludeDirectories ${SPDir}) - set(SPRDVanillaRendererIncludeDirectories ${SPRDVanillaRendererIncludeDirectories} "${SPDir}/rd-vanilla") + set(SPRDVanillaRendererIncludeDirectories + ${SharedDir} + ${SPRDVanillaRendererIncludeDirectories} + "${SPDir}/rd-vanilla" + ) # Modular Renderer crap (let's hope this works..) @@ -18,9 +38,15 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) # Files # JPEG - file(GLOB_RECURSE J_SRC "${OpenJKLibDir}/jpeg-8c/*.c" "${OpenJKLibDir}/jpeg-8c/*.h") - source_group("jpeg-8c" FILES ${J_SRC}) - set(SPRDVanillaFiles ${SPRDVanillaFiles} ${J_SRC}) + if(UseInternalJPEG) + file(GLOB_RECURSE J_SRC "${OpenJKLibDir}/jpeg-8c/*.c" "${OpenJKLibDir}/jpeg-8c/*.h") + source_group("jpeg-8c" FILES ${J_SRC}) + set(SPRDVanillaFiles ${SPRDVanillaFiles} ${J_SRC}) + else() + find_package(JPEG REQUIRED) + set(SPRDVanillaRendererIncludeDirectories ${SPRDVanillaRendererIncludeDirectories} ${JPEG_INCLUDE_DIR}) + set(SPRDVanillaRendererLibraries ${SPRDVanillaRendererLibraries} ${JPEG_LIBRARIES}) + endif() # GHOUL 2 set(SPRDVanillaG2Files @@ -114,12 +140,12 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) set(SPRDVanillaMainFiles "${SPDir}/rd-vanilla/glext.h" "${SPDir}/rd-vanilla/qgl.h" + "${SPDir}/rd-vanilla/tr_arb.cpp" "${SPDir}/rd-vanilla/tr_backend.cpp" "${SPDir}/rd-vanilla/tr_bsp.cpp" "${SPDir}/rd-vanilla/tr_cmds.cpp" "${SPDir}/rd-vanilla/tr_curve.cpp" "${SPDir}/rd-vanilla/tr_draw.cpp" - "${SPDir}/rd-vanilla/tr_flares.cpp" "${SPDir}/rd-vanilla/tr_ghoul2.cpp" "${SPDir}/rd-vanilla/tr_image.cpp" "${SPDir}/rd-vanilla/tr_init.cpp" @@ -136,6 +162,7 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) "${SPDir}/rd-vanilla/tr_shade_calc.cpp" "${SPDir}/rd-vanilla/tr_shader.cpp" "${SPDir}/rd-vanilla/tr_shadows.cpp" + "${SPDir}/rd-vanilla/tr_skin.cpp" "${SPDir}/rd-vanilla/tr_sky.cpp" "${SPDir}/rd-vanilla/tr_stl.cpp" "${SPDir}/rd-vanilla/tr_stl.h" @@ -164,50 +191,37 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) source_group("rd-common" FILES ${SPRDVanillaRdCommonFiles}) set(SPRDVanillaFiles ${SPRDVanillaFiles} ${SPRDVanillaRdCommonFiles}) - if(WIN32) - set(SPRDVanillaWin32Files - "${SPDir}/win32/win_gamma.cpp" - "${SPDir}/win32/win_glimp.cpp" - "${SPDir}/win32/win_qgl.cpp" - ) - source_group("win32" FILES ${SPRDVanillaWin32Files}) - set(SPRDVanillaFiles ${SPRDVanillaFiles} ${SPRDVanillaWin32Files}) - else(WIN32) - set(SPRDVanillaSdlFiles - "${SPDir}/sdl/sdl_glimp.cpp") - source_group("sdl" FILES ${SPRDVanillaSdlFiles}) - set(SPRDVanillaFiles ${SPRDVanillaFiles} ${SPRDVanillaSdlFiles}) - endif(WIN32) - - if(NOT WIN32) - find_package(OpenGL REQUIRED) - set(SPRDVanillaRendererIncludeDirectories ${SPRDVanillaRendererIncludeDirectories} ${OPENGL_INCLUDE_DIR}) - set(SPRDVanillaRendererLibraries ${SPRDVanillaRendererLibraries} ${OPENGL_LIBRARIES}) - - set(SDL2_BUILDING_LIBRARY ON) # don't want main() in Renderer - find_package(SDL2 REQUIRED) - set(SPRDVanillaRendererIncludeDirectories ${SPRDVanillaRendererIncludeDirectories} ${SDL2_INCLUDE_DIR}) - set(SPRDVanillaRendererLibraries ${SPRDVanillaRendererLibraries} ${SDL2_LIBRARY}) - endif(NOT WIN32) + find_package(OpenGL REQUIRED) + set(SPRDVanillaRendererIncludeDirectories ${SPRDVanillaRendererIncludeDirectories} ${OPENGL_INCLUDE_DIR}) + set(SPRDVanillaRendererLibraries ${SPRDVanillaRendererLibraries} ${OPENGL_LIBRARIES}) set(SPRDVanillaRendererIncludeDirectories ${SPRDVanillaRendererIncludeDirectories} ${OpenJKLibDir}) - function(add_sp_renderer_project ProjectName Label EngineName) + function(add_sp_renderer_project ProjectName Label EngineName InstallDir Component) add_library(${ProjectName} SHARED ${SPRDVanillaFiles}) - if(NOT WIN32) + if(NOT MSVC) # remove "lib" prefix for .so/.dylib files set_target_properties(${ProjectName} PROPERTIES PREFIX "") - endif(NOT WIN32) + endif() if(WIN32) - install(TARGETS ${ProjectName} RUNTIME DESTINATION ".") + install(TARGETS ${ProjectName} + RUNTIME + DESTINATION ${InstallDir} + COMPONENT ${Component}) else(WIN32) if(MakeApplicationBundles AND (BuildSPEngine OR BuildJK2SPEngine)) - install(TARGETS ${ProjectName} LIBRARY DESTINATION "${EngineName}.app/Contents/MacOS/") - else(MakeApplicationBundles AND (BuildSPEngine OR BuildJK2SPEngine)) - install(TARGETS ${ProjectName} LIBRARY DESTINATION ".") - endif(MakeApplicationBundles AND (BuildSPEngine OR BuildJK2SPEngine)) - endif(WIN32) + install(TARGETS ${ProjectName} + LIBRARY + DESTINATION "${InstallDir}/${EngineName}.app/Contents/MacOS/" + COMPONENT ${Component}) + else() + install(TARGETS ${ProjectName} + LIBRARY + DESTINATION ${InstallDir} + COMPONENT ${Component}) + endif() + endif() set_target_properties(${ProjectName} PROPERTIES COMPILE_DEFINITIONS_RELWITHDEBINFO "${SPRDVanillaDefines};${ReleaseDefines}") set_target_properties(${ProjectName} PROPERTIES COMPILE_DEFINITIONS_MINSIZEREL "${SPRDVanillaDefines};${ReleaseDefines}") @@ -220,11 +234,11 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) endfunction(add_sp_renderer_project) if(BuildSPRdVanilla) - add_sp_renderer_project(${SPRDVanillaRenderer} "SP Vanilla Renderer" ${SPEngine}) + add_sp_renderer_project(${SPRDVanillaRenderer} "SP Vanilla Renderer" ${SPEngine} ${JKAInstallDir} ${JKASPClientComponent}) endif(BuildSPRdVanilla) if(BuildJK2SPRdVanilla) set(SPRDVanillaDefines ${SPRDVanillaDefines} "JK2_MODE") - add_sp_renderer_project(${JK2SPVanillaRenderer} "JK2 SP Vanilla Renderer" ${JK2SPEngine}) + add_sp_renderer_project(${JK2SPVanillaRenderer} "JK2 SP Vanilla Renderer" ${JK2SPEngine} ${JK2InstallDir} ${JK2SPClientComponent}) endif(BuildJK2SPRdVanilla) endif(BuildSPRdVanilla OR BuildJK2SPRdVanilla) diff --git a/code/rd-vanilla/G2_API.cpp b/code/rd-vanilla/G2_API.cpp index 6c7cbce6fa..9b927317c8 100644 --- a/code/rd-vanilla/G2_API.cpp +++ b/code/rd-vanilla/G2_API.cpp @@ -1,54 +1,34 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" -#ifdef _MSC_VER -#pragma warning( disable : 4786) -#pragma warning( disable : 4100) -#pragma warning( disable : 4511) - -#pragma warning (push, 3) //go back down to 3 for the stl include -#endif #include #include -#ifdef _MSC_VER -#pragma warning (pop) -#endif - -#ifndef __Q_SHARED_H - #include "../qcommon/q_shared.h" -#endif - -#if !defined(TR_LOCAL_H) - #include "tr_local.h" -#endif - -#if !defined(G2_H_INC) - #include "../ghoul2/G2.h" -#endif - -#if !defined(MINIHEAP_H_INC) - #include "../qcommon/MiniHeap.h" -#endif +#include "../qcommon/q_shared.h" +#include "tr_local.h" +#include "../ghoul2/G2.h" +#include "../qcommon/MiniHeap.h" #ifdef FINAL_BUILD #define G2API_DEBUG (0) // please don't change this @@ -64,8 +44,6 @@ This file is part of Jedi Academy. #include "../ghoul2/ghoul2_gore.h" //rww - RAGDOLL_END -using namespace std; - extern mdxaBone_t worldMatrix; extern mdxaBone_t worldMatrixInv; @@ -89,10 +67,10 @@ bool G2_TestModelPointers(CGhoul2Info *ghlInfo); #define MAX_ERROR_PRINTS (3) class ErrorReporter { - string mName; - map mErrors; + std::string mName; + std::map mErrors; public: - ErrorReporter(const string &name) : + ErrorReporter(const std::string &name) : mName(name) { } @@ -103,14 +81,14 @@ class ErrorReporter sprintf(mess,"****** %s Error Report Begin******\n",mName.c_str()); Com_DPrintf(mess); - map::iterator i; + std::map::iterator i; for (i=mErrors.begin();i!=mErrors.end();i++) { total+=(*i).second; sprintf(mess,"%s (hits %d)\n",(*i).first.c_str(),(*i).second); Com_DPrintf(mess); } - + sprintf(mess,"****** %s Error Report End %d errors of %ld kinds******\n",mName.c_str(),total,mErrors.size()); Com_DPrintf(mess); } @@ -173,8 +151,8 @@ class ErrorReporter } bool no_lerp=!!(ghlInfo->mBlist[i].flags&BONE_ANIM_NO_LERP); bool blend=!!(ghlInfo->mBlist[i].flags&BONE_ANIM_BLEND); - - + + //comments according to jake int startFrame=ghlInfo->mBlist[i].startFrame; // start frame for animation int endFrame=ghlInfo->mBlist[i].endFrame; // end frame for animation NOTE anim actually ends on endFrame+1 @@ -182,7 +160,7 @@ class ErrorReporter int pauseTime=ghlInfo->mBlist[i].pauseTime; // time we paused this animation - 0 if not paused float animSpeed=ghlInfo->mBlist[i].animSpeed; // speed at which this anim runs. 1.0f means full speed of animation incoming - ie if anim is 20hrtz, we run at 20hrts. If 5hrts, we run at 5 hrts - float blendFrame=0.0f; // frame PLUS LERP value to blend + float blendFrame=0.0f; // frame PLUS LERP value to blend int blendLerpFrame=0; // frame to lerp the blend frame with. if (blend) @@ -237,7 +215,7 @@ class ErrorReporter { char mess[1000]; assert(m); - string full=mName; + std::string full=mName; if (kind==2) { full+=":NOTE: "; @@ -258,11 +236,11 @@ class ErrorReporter // assert(0); int ret=0; //place a breakpoint here - map::iterator f=mErrors.find(full); + std::map::iterator f=mErrors.find(full); if (f==mErrors.end()) { ret++; // or a breakpoint here for the first occurance - mErrors.insert(pair(full,0)); + mErrors.insert(std::make_pair(full,0)); f=mErrors.find(full); } assert(f!=mErrors.end()); @@ -364,7 +342,7 @@ void RemoveBoneCache(CBoneCache *boneCache); static size_t GetSizeOfGhoul2Info ( const CGhoul2Info& g2Info ) { size_t size = 0; - + // This is pretty ugly, but we don't want to save everything in the CGhoul2Info object. size += offsetof (CGhoul2Info, mTransformedVertsArray) - offsetof (CGhoul2Info, mModelindex); @@ -387,7 +365,7 @@ static size_t SerializeGhoul2Info ( char *buffer, const CGhoul2Info& g2Info ) { char *base = buffer; size_t blockSize; - + // Oh the ugliness... blockSize = offsetof (CGhoul2Info, mTransformedVertsArray) - offsetof (CGhoul2Info, mModelindex); memcpy (buffer, &g2Info.mModelindex, blockSize); @@ -404,7 +382,7 @@ static size_t SerializeGhoul2Info ( char *buffer, const CGhoul2Info& g2Info ) // Bones vector + size *(int *)buffer = g2Info.mBlist.size(); buffer += sizeof (int); - + blockSize = g2Info.mBlist.size() * sizeof (boneInfo_t); memcpy (buffer, g2Info.mBlist.data(), g2Info.mBlist.size() * sizeof (boneInfo_t)); buffer += blockSize; @@ -412,7 +390,7 @@ static size_t SerializeGhoul2Info ( char *buffer, const CGhoul2Info& g2Info ) // Bolts vector + size *(int *)buffer = g2Info.mBltlist.size(); buffer += sizeof (int); - + blockSize = g2Info.mBltlist.size() * sizeof (boltInfo_t); memcpy (buffer, g2Info.mBltlist.data(), g2Info.mBltlist.size() * sizeof (boltInfo_t)); buffer += blockSize; @@ -455,9 +433,9 @@ static size_t DeserializeGhoul2Info ( const char *buffer, CGhoul2Info& g2Info ) class Ghoul2InfoArray : public IGhoul2InfoArray { - vector mInfos[MAX_G2_MODELS]; + std::vector mInfos[MAX_G2_MODELS]; int mIds[MAX_G2_MODELS]; - list mFreeIndecies; + std::list mFreeIndecies; void DeleteLow(int idx) { { @@ -494,7 +472,7 @@ class Ghoul2InfoArray : public IGhoul2InfoArray size_t GetSerializedSize() const { - size_t size = 0; + size_t size = 0; size += sizeof (int); // size of mFreeIndecies linked list size += mFreeIndecies.size() * sizeof (int); @@ -569,7 +547,7 @@ class Ghoul2InfoArray : public IGhoul2InfoArray buffer += sizeof (int); mInfos[i].resize (count); - + for ( size_t j = 0; j < count; j++ ) { buffer += DeserializeGhoul2Info (buffer, mInfos[i][j]); @@ -591,7 +569,7 @@ class Ghoul2InfoArray : public IGhoul2InfoArray int i; for (i=0;i::iterator j; + std::list::iterator j; for (j=mFreeIndecies.begin();j!=mFreeIndecies.end();j++) { if (*j==i) @@ -628,7 +606,7 @@ class Ghoul2InfoArray : public IGhoul2InfoArray Com_Error(ERR_FATAL, "Out of ghoul2 info slots"); } - // gonna pull from the front, doing a + // gonna pull from the front, doing a int idx=*mFreeIndecies.begin(); mFreeIndecies.erase(mFreeIndecies.begin()); return mIds[idx]; @@ -661,16 +639,16 @@ class Ghoul2InfoArray : public IGhoul2InfoArray DeleteLow(handle&G2_INDEX_MASK); } } - vector &Get(int handle) + std::vector &Get(int handle) { assert(handle>0); //null handle assert((handle&G2_INDEX_MASK)>=0&&(handle&G2_INDEX_MASK)=MAX_G2_MODELS||mIds[handle&G2_INDEX_MASK]!=handle)); - + return mInfos[handle&G2_INDEX_MASK]; } - const vector &Get(int handle) const + const std::vector &Get(int handle) const { assert(handle>0); assert(mIds[handle&G2_INDEX_MASK]==handle); // not a valid handle, could be old or garbage @@ -678,17 +656,17 @@ class Ghoul2InfoArray : public IGhoul2InfoArray } #if G2API_DEBUG - vector &GetDebug(int handle) + std::vector &GetDebug(int handle) { assert (!(handle<=0||(handle&G2_INDEX_MASK)<0||(handle&G2_INDEX_MASK)>=MAX_G2_MODELS||mIds[handle&G2_INDEX_MASK]!=handle)); - + return mInfos[handle&G2_INDEX_MASK]; } void TestAllAnims() { for (size_t j=0;j &ghoul2=mInfos[j]; + std::vector &ghoul2=mInfos[j]; for (size_t i=0; i &DebugG2Info(int handle) +std::vector &DebugG2Info(int handle) { return ((Ghoul2InfoArray *)(&TheGhoul2InfoArray()))->GetDebug(handle); } @@ -746,7 +724,10 @@ void RestoreGhoul2InfoArray() return; } - size_t read = singleton->Deserialize ((const char *)data, size); +#ifdef _DEBUG + size_t read = +#endif // _DEBUG + singleton->Deserialize ((const char *)data, size); Z_Free ((void *)data); assert (read == size); @@ -757,7 +738,10 @@ void SaveGhoul2InfoArray() { size_t size = singleton->GetSerializedSize(); void *data = Z_Malloc (size, TAG_GHOUL2, qfalse); - size_t written = singleton->Serialize ((char *)data); +#ifdef _DEBUG + size_t written = +#endif // _DEBUG + singleton->Serialize ((char *)data); assert (written == size); @@ -773,7 +757,7 @@ void G2API_CleanGhoul2Models(CGhoul2Info_v &ghoul2) #ifdef _G2_GORE G2API_ClearSkinGore ( ghoul2 ); #endif - ghoul2.~CGhoul2Info_v(); + ghoul2.~CGhoul2Info_v(); } qhandle_t G2API_PrecacheGhoul2Model(const char *fileName) @@ -826,7 +810,7 @@ int G2API_InitGhoul2Model(CGhoul2Info_v &ghoul2, const char *fileName, int, qhan } else { - G2_Init_Bone_List(ghoul2[model].mBlist); + G2_Init_Bone_List(ghoul2[model].mBlist, ghoul2[model].aHeader->numBones); G2_Init_Bolt_List(ghoul2[model].mBltlist); ghoul2[model].mCustomShader = customShader; ghoul2[model].mCustomSkin = customSkin; @@ -1016,7 +1000,7 @@ qboolean G2API_SetAnimIndex(CGhoul2Info *ghlInfo, const int index) // RemoveBoneCache(ghlInfo[0].mBoneCache); // ghlInfo[0].mBoneCache=0; - + // Kill All Existing Animation, Blending, Etc. //--------------------------------------------- for (size_t index=0; indexmBlist.size(); index++) @@ -1025,7 +1009,7 @@ qboolean G2API_SetAnimIndex(CGhoul2Info *ghlInfo, const int index) ghlInfo->mBlist[index].flags &= ~(BONE_ANGLES_TOTAL); // G2_Remove_Bone_Index(ghlInfo->mBlist, index); } - } + } return qtrue; } return qfalse; @@ -1152,13 +1136,13 @@ qboolean G2API_GetBoneAnimIndex(CGhoul2Info *ghlInfo, const int iBoneIndex, cons if ((ghlInfo->mBlist[iBoneIndex].flags & (BONE_ANIM_OVERRIDE_LOOP | BONE_ANIM_OVERRIDE))) { int sf,ef; - ret=G2_Get_Bone_Anim_Index( ghlInfo->mBlist,// boneInfo_v &blist, - iBoneIndex, // const int index, - currentTime, // const int currentTime, + ret=G2_Get_Bone_Anim_Index( ghlInfo->mBlist,// boneInfo_v &blist, + iBoneIndex, // const int index, + currentTime, // const int currentTime, currentFrame, // float *currentFrame, - &sf, // int *startFrame, - &ef, // int *endFrame, - flags, // int *flags, + &sf, // int *startFrame, + &ef, // int *endFrame, + flags, // int *flags, animSpeed, // float *retAnimSpeed, ghlInfo->aHeader->numFrames ); @@ -1466,7 +1450,7 @@ void G2API_AnimateG2Models(CGhoul2Info_v &ghoul2, int AcurrentTime,CRagDollUpdat { if (ghoul2[model].mModel) { - G2_Animate_Bone_List(ghoul2,currentTime,model,params); + G2_Animate_Bone_List(ghoul2,currentTime,model,params); } } #ifdef _DEBUG @@ -1706,7 +1690,7 @@ qboolean G2API_DetachG2Model(CGhoul2Info *ghlInfo) } qboolean G2API_AttachEnt(int *boltInfo, CGhoul2Info *ghlInfoTo, int toBoltIndex, int entNum, int toModelNum) -{ +{ qboolean ret=qfalse; G2ERROR(boltInfo,"NULL boltInfo"); if (boltInfo&&G2_SetupModelPointers(ghlInfoTo)) @@ -1715,7 +1699,7 @@ qboolean G2API_AttachEnt(int *boltInfo, CGhoul2Info *ghlInfoTo, int toBoltIndex, if ( ghlInfoTo->mBltlist.size() && ((ghlInfoTo->mBltlist[toBoltIndex].boneNumber != -1) || (ghlInfoTo->mBltlist[toBoltIndex].surfaceNumber != -1))) { // encode the bolt address into the model bolt link - toModelNum &= MODEL_AND; + toModelNum &= MODEL_AND; toBoltIndex &= BOLT_AND; entNum &= ENTITY_AND; *boltInfo = (toBoltIndex << BOLT_SHIFT) | (toModelNum << MODEL_SHIFT) | (entNum << ENTITY_SHIFT); @@ -1738,14 +1722,14 @@ void G2API_DetachEnt(int *boltInfo) bool G2_NeedsRecalc(CGhoul2Info *ghlInfo,int frameNum); -qboolean G2API_GetBoltMatrix(CGhoul2Info_v &ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix, const vec3_t angles, +qboolean G2API_GetBoltMatrix(CGhoul2Info_v &ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix, const vec3_t angles, const vec3_t position, const int AframeNum, qhandle_t *modelList, const vec3_t scale ) { G2ERROR(ghoul2.IsValid(),"Invalid ghlInfo"); G2ERROR(matrix,"NULL matrix"); G2ERROR(modelIndex>=0&&modelIndexResetHeap(); // now sort the resulting array of collision records so they are distance ordered - qsort( collRecMap, MAX_G2_COLLISIONS, + qsort( collRecMap, MAX_G2_COLLISIONS, sizeof( CCollisionRecord ), QsortDistance ); G2ANIM(ghoul2,"G2API_CollisionDetect"); } @@ -2028,7 +2012,7 @@ void G2API_CopyGhoul2Instance(CGhoul2Info_v &ghoul2From, CGhoul2Info_v &ghoul2To //Ensiform: I'm commenting this out because modelIndex appears unused and legitimately set in gamecode //assert(modelIndex==-1); // copy individual bolted parts is not used in jk2 and I didn't want to deal with it // if ya want it, we will add it back correctly - + G2ERROR(ghoul2From.IsValid(),"Invalid ghlInfo"); if (ghoul2From.IsValid()) { @@ -2066,7 +2050,7 @@ char *G2API_GetSurfaceName(CGhoul2Info *ghlInfo, int surfNumber) { mdxmSurface_t *surf = 0; mdxmSurfHierarchy_t *surfInfo = 0; - + surf = (mdxmSurface_t *)G2_FindSurface(ghlInfo->currentModel, surfNumber, 0); if (surf) @@ -2126,7 +2110,7 @@ int G2API_GetBoneIndex(CGhoul2Info *ghlInfo, const char *boneName, qboolean bAdd int ret=-1; G2ERROR(boneName,"NULL boneName"); if (boneName&&G2_SetupModelPointers(ghlInfo)) - { + { ret=G2_Get_Bone_Index(ghlInfo, boneName, bAddIfNotFound); G2ANIM(ghlInfo,"G2API_GetBoneIndex"); } diff --git a/code/rd-vanilla/G2_bolts.cpp b/code/rd-vanilla/G2_bolts.cpp index 3380c102a4..24852190d9 100644 --- a/code/rd-vanilla/G2_bolts.cpp +++ b/code/rd-vanilla/G2_bolts.cpp @@ -1,27 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - - #ifndef __Q_SHARED_H #include "../qcommon/q_shared.h" #endif @@ -70,7 +70,7 @@ int G2_Find_Bolt_Surface_Num(boltInfo_v &bltlist, const int surfaceNum, const in // didn't find it return -1; } - + //========================================================================================= //// Public Bolt Routines int G2_Add_Bolt_Surf_Num(CGhoul2Info *ghlInfo, boltInfo_v &bltlist, surfaceInfo_v &slist, const int surfNum) @@ -97,7 +97,7 @@ int G2_Add_Bolt_Surf_Num(CGhoul2Info *ghlInfo, boltInfo_v &bltlist, surfaceInfo_ } } - // we have a surface + // we have a surface // look through entire list - see if it's already there first for(size_t i=0; i. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - - #ifndef __Q_SHARED_H #include "../qcommon/q_shared.h" #endif @@ -1142,7 +1142,7 @@ enum ERagState }; static int ragState; -static vector *rag = NULL; // once we get the dependents precomputed this can be local +static std::vector *rag = NULL; // once we get the dependents precomputed this can be local static void G2_Generate_MatrixRag( @@ -1504,7 +1504,7 @@ void G2_ResetRagDoll(CGhoul2Info_v &ghoul2V) //Eh, screw it. Ragdoll does a lot of terrible things to the bones that probably aren't directly reversible, so just reset it all. //rwwFIXMEFIXME: I think SP might store bone indecies gameside.. which would make this cause terrible terrible things to happen. //If so this needs to be done a better way somehow. Providing SP ever even needs to reset ragdoll, it's only used in MP on respawn. - G2_Init_Bone_List(blist); + G2_Init_Bone_List(blist, ghoul2.aHeader->numBones); #else //The anims on every bone are messed up too, as are the angles. There's not really any way to get back to a normal state, so just clear the list //and let them re-set their anims/angles gameside. int i = 0; @@ -2250,7 +2250,7 @@ static bool G2_RagDollSetup(CGhoul2Info &ghoul2,int frameNum,bool resetOrigin,co assert(ghoul2.mFileName[0]); boneInfo_v &blist = ghoul2.mBlist; if(!rag) { - rag = new vector; + rag = new std::vector; } rag->clear(); int numRendered=0; @@ -4757,9 +4757,10 @@ qboolean G2_IKMove(CGhoul2Info_v &ghoul2, int time, sharedIKMoveParams_t *params } // set the bone list to all unused so the bone transformation routine ignores it. -void G2_Init_Bone_List(boneInfo_v &blist) +void G2_Init_Bone_List(boneInfo_v &blist, int numBones) { blist.clear(); + blist.reserve(numBones); } int G2_Get_Bone_Index(CGhoul2Info *ghoul2, const char *boneName, qboolean bAddIfNotFound) diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index 66bbebe812..dfc8089375 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -1,27 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - - #ifndef __Q_SHARED_H #include "../qcommon/q_shared.h" #endif @@ -55,8 +55,8 @@ This file is part of Jedi Academy. static int CurrentTag=GORE_TAG_UPPER+1; static int CurrentTagUpper=GORE_TAG_UPPER; -static map GoreRecords; -static map,int> GoreTagsTemp; // this is a surface index to gore tag map used only +static std::map GoreRecords; +static std::map,int> GoreTagsTemp; // this is a surface index to gore tag map used only // temporarily during the generation phase so we reuse gore tags per LOD int goreModelIndex; @@ -83,7 +83,7 @@ int AllocGoreRecord() while (GoreRecords.size()>MAX_GORE_RECORDS) { int tagHigh=(*GoreRecords.begin()).first&GORE_TAG_MASK; - map::iterator it; + std::map::iterator it; GoreTextureCoordinates *gTC; it = GoreRecords.begin(); @@ -125,7 +125,7 @@ void ResetGoreTag() GoreTextureCoordinates *FindGoreRecord(int tag) { - map::iterator i=GoreRecords.find(tag); + std::map::iterator i=GoreRecords.find(tag); if (i!=GoreRecords.end()) { return &(*i).second; @@ -145,11 +145,11 @@ void DeleteGoreRecord(int tag) } static int CurrentGoreSet=1; // this is a UUID for gore sets -static map GoreSets; // map from uuid to goreset +static std::map GoreSets; // map from uuid to goreset CGoreSet *FindGoreSet(int goreSetTag) { - map::iterator f=GoreSets.find(goreSetTag); + std::map::iterator f=GoreSets.find(goreSetTag); if (f!=GoreSets.end()) { return (*f).second; @@ -167,7 +167,7 @@ CGoreSet *NewGoreSet() void DeleteGoreSet(int goreSetTag) { - map::iterator f=GoreSets.find(goreSetTag); + std::map::iterator f=GoreSets.find(goreSetTag); if (f!=GoreSets.end()) { if ( (*f).second->mRefCount == 0 || (*f).second->mRefCount - 1 == 0 ) @@ -185,7 +185,7 @@ void DeleteGoreSet(int goreSetTag) CGoreSet::~CGoreSet() { - multimap::iterator i; + std::multimap::iterator i; for (i=mGoreRecords.begin();i!=mGoreRecords.end();i++) { DeleteGoreRecord((*i).second.mGoreTag); @@ -197,10 +197,6 @@ extern mdxaBone_t worldMatrix; extern mdxaBone_t worldMatrixInv; const mdxaBone_t &EvalBoneCache(int index,CBoneCache *boneCache); - -#ifdef _MSC_VER -#pragma warning(disable : 4512) //assignment op could not be genereated -#endif class CTraceSurface { public: @@ -991,7 +987,7 @@ static void G2_GorePolys( const mdxmSurface_t *surface, CTraceSurface &TS, const } int newTag; - map,int>::iterator f=GoreTagsTemp.find(pair(goreModelIndex,TS.surfaceNum)); + std::map,int>::iterator f=GoreTagsTemp.find(std::make_pair(goreModelIndex,TS.surfaceNum)); if (f==GoreTagsTemp.end()) // need to generate a record { newTag=AllocGoreRecord(); @@ -1031,8 +1027,8 @@ static void G2_GorePolys( const mdxmSurface_t *surface, CTraceSurface &TS, const add.mGoreGrowFactor = ( 1.0f - TS.gore->goreScaleStartFraction) / (float)(TS.gore->growDuration); //curscale = (curtime-mGoreGrowStartTime)*mGoreGrowFactor; add.mGoreGrowOffset = TS.gore->goreScaleStartFraction; - goreSet->mGoreRecords.insert(pair(TS.surfaceNum,add)); - GoreTagsTemp[pair(goreModelIndex,TS.surfaceNum)]=newTag; + goreSet->mGoreRecords.insert(std::make_pair(TS.surfaceNum,add)); + GoreTagsTemp[std::make_pair(goreModelIndex,TS.surfaceNum)]=newTag; } else { diff --git a/code/rd-vanilla/G2_surfaces.cpp b/code/rd-vanilla/G2_surfaces.cpp index 96072d3629..e387baaedc 100644 --- a/code/rd-vanilla/G2_surfaces.cpp +++ b/code/rd-vanilla/G2_surfaces.cpp @@ -1,27 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - - #ifndef __Q_SHARED_H #include "../qcommon/q_shared.h" #endif @@ -36,10 +36,6 @@ This file is part of Jedi Academy. #define G2_MODEL_OK(g) ((g)&&(g)->mValid&&(g)->aHeader&&(g)->currentModel&&(g)->animModel) -#ifdef _MSC_VER -#pragma warning(disable : 4512) //assignment op could not be genereated -#endif - class CQuickOverride { int mOverride[512]; @@ -89,7 +85,7 @@ static CQuickOverride QuickOverride; // find a particular surface in the surface override list const surfaceInfo_t *G2_FindOverrideSurface(int surfaceNum,const surfaceInfo_v &surfaceList) { - + if (surfaceNum<0) { // starting a new lookup @@ -138,7 +134,7 @@ const surfaceInfo_t *G2_FindOverrideSurface(int surfaceNum,const surfaceInfo_v & // given a surface name, lets see if it's legal in the model -int G2_IsSurfaceLegal(const model_s *mod_m, const char *surfaceName, int *flags) +int G2_IsSurfaceLegal(const model_s *mod_m, const char *surfaceName, uint32_t *flags) { assert(mod_m); assert(mod_m->mdxm); @@ -146,7 +142,7 @@ int G2_IsSurfaceLegal(const model_s *mod_m, const char *surfaceName, int *flags) mdxmSurfHierarchy_t *surf; surf = (mdxmSurfHierarchy_t *) ( (byte *)mod_m->mdxm + mod_m->mdxm->ofsSurfHierarchy ); - for ( int i = 0 ; i < mod_m->mdxm->numSurfaces ; i++) + for ( int i = 0 ; i < mod_m->mdxm->numSurfaces ; i++) { if (!Q_stricmp(surfaceName, surf->name)) { @@ -180,7 +176,7 @@ const mdxmSurface_t *G2_FindSurface(CGhoul2Info *ghlInfo, surfaceInfo_v &slist, assert(G2_MODEL_OK(ghlInfo)); const mdxmHierarchyOffsets_t *surfIndexes = (mdxmHierarchyOffsets_t *)((byte *)ghlInfo->currentModel->mdxm + sizeof(mdxmHeader_t)); - + // first find if we already have this surface in the list for (i = slist.size() - 1; i >= 0; i--) { @@ -233,11 +229,11 @@ qboolean G2_SetSurfaceOnOff (CGhoul2Info *ghlInfo, const char *surfaceName, cons else { // ok, not in the list already - in that case, lets verify this surface exists in the model mesh - int flags; + uint32_t flags; int surfaceNum = G2_IsSurfaceLegal(ghlInfo->currentModel, surfaceName, &flags); if (surfaceNum != -1) { - int newflags = flags; + uint32_t newflags = flags; // the only bit we really care about in the incoming flags is the off bit newflags &= ~(G2SURFACEFLAG_OFF | G2SURFACEFLAG_NODESCENDANTS); newflags |= offFlags & (G2SURFACEFLAG_OFF | G2SURFACEFLAG_NODESCENDANTS); @@ -246,7 +242,7 @@ qboolean G2_SetSurfaceOnOff (CGhoul2Info *ghlInfo, const char *surfaceName, cons { // insert here then because it changed, no need to add an override otherwise temp_slist_entry.offFlags = newflags; temp_slist_entry.surface = surfaceNum; - + ghlInfo->mSlist.push_back(temp_slist_entry); } return qtrue; @@ -300,7 +296,7 @@ void G2_FindRecursiveSurface(const model_t *currentModel, int surfaceNum, surfac qboolean G2_SetRootSurface( CGhoul2Info_v &ghoul2, const int modelIndex, const char *surfaceName) { int surf; - int flags; + uint32_t flags; assert(modelIndex>=0&&modelIndexmdxm); @@ -372,14 +368,14 @@ int G2_GetParentSurface(CGhoul2Info *ghlInfo, const int index) int G2_GetSurfaceIndex(CGhoul2Info *ghlInfo, const char *surfaceName) { - int flags; + uint32_t flags; assert(ghlInfo->currentModel); return G2_IsSurfaceLegal(ghlInfo->currentModel, surfaceName, &flags); } int G2_IsSurfaceRendered(CGhoul2Info *ghlInfo, const char *surfaceName, surfaceInfo_v &slist) { - int flags = 0;//, surfFlags = 0; + uint32_t flags = 0u;//, surfFlags = 0; int surfIndex = 0; assert(ghlInfo->currentModel); assert(ghlInfo->currentModel->mdxm); @@ -400,9 +396,9 @@ int G2_IsSurfaceRendered(CGhoul2Info *ghlInfo, const char *surfaceName, surfaceI // walk the surface hierarchy up until we hit the root while (surfNum != -1) { - const mdxmSurface_t *parentSurf; - int parentFlags; - const mdxmSurfHierarchy_t *parentSurfInfo; + const mdxmSurface_t *parentSurf; + uint32_t parentFlags = 0u; + const mdxmSurfHierarchy_t *parentSurfInfo; parentSurfInfo = (mdxmSurfHierarchy_t *)((byte *)surfIndexes + surfIndexes->offsets[surfNum]); @@ -410,7 +406,7 @@ int G2_IsSurfaceRendered(CGhoul2Info *ghlInfo, const char *surfaceName, surfaceI //G2 was bug, above comment was accurate, but we don't want the original flags, we want the parent flags G2_IsSurfaceLegal(ghlInfo->currentModel, parentSurfInfo->name, &parentFlags); - // now see if we already have overriden this surface in the slist + // now see if we already have overriden this surface in the slist parentSurf = G2_FindSurface(ghlInfo, slist, parentSurfInfo->name, &surfIndex); if (parentSurf) { @@ -421,7 +417,7 @@ int G2_IsSurfaceRendered(CGhoul2Info *ghlInfo, const char *surfaceName, surfaceI if (parentFlags & G2SURFACEFLAG_NODESCENDANTS) { flags |= G2SURFACEFLAG_OFF; - break; + break; } // set up scan of next parent surfNum = parentSurfInfo->parentIndex; @@ -433,7 +429,7 @@ int G2_IsSurfaceRendered(CGhoul2Info *ghlInfo, const char *surfaceName, surfaceI } if ( flags == 0 ) {//it's not being overridden by a parent - // now see if we already have overriden this surface in the slist + // now see if we already have overriden this surface in the slist const mdxmSurface_t *surf = G2_FindSurface(ghlInfo, slist, surfaceName, &surfIndex); if (surf) { diff --git a/code/rd-vanilla/glext.h b/code/rd-vanilla/glext.h index fb01726510..63ea7f2465 100644 --- a/code/rd-vanilla/glext.h +++ b/code/rd-vanilla/glext.h @@ -1,65 +1,3352 @@ #ifndef __glext_h_ -#define __glext_h_ +#define __glext_h_ 1 #ifdef __cplusplus extern "C" { #endif /* -** License Applicability. Except to the extent portions of this file are -** made subject to an alternative license as permitted in the SGI Free -** Software License B, Version 1.1 (the "License"), the contents of this -** file are subject only to the provisions of the License. You may not use -** this file except in compliance with the License. You may obtain a copy -** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 -** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: -** -** http://oss.sgi.com/projects/FreeB -** -** Note that, as provided in the License, the Software is distributed on an -** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS -** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND -** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A -** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. -** -** Original Code. The Original Code is: OpenGL Sample Implementation, -** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, -** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. -** Copyright in any portions created by third parties is as indicated -** elsewhere herein. All Rights Reserved. -** -** Additional Notice Provisions: This software was created using the -** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has -** not been independently verified as being compliant with the OpenGL(R) -** version 1.2.1 Specification. +** Copyright (c) 2013-2014 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ +/* +** This header is generated from the Khronos OpenGL / OpenGL ES XML +** API Registry. The current version of the Registry, generator scripts +** used to make the header, and the header can be found at +** http://www.opengl.org/registry/ +** +** Khronos $Revision: 28986 $ on $Date: 2014-11-18 18:43:15 -0800 (Tue, 18 Nov 2014) $ */ -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN 1 +#endif #include #endif #ifndef APIENTRY #define APIENTRY #endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +#ifndef GLAPI +#define GLAPI extern +#endif -/*************************************************************/ +#define GL_GLEXT_VERSION 20141118 -/* Header file version number, required by OpenGL ABI for Linux */ -#define GL_GLEXT_VERSION 6 +/* Generated C header for: + * API: gl + * Profile: compatibility + * Versions considered: .* + * Versions emitted: 1\.[2-9]|[234]\.[0-9] + * Default extensions included: gl + * Additional extensions included: _nomatch_^ + * Extensions removed: _nomatch_^ + */ #ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_RESCALE_NORMAL 0x803A +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif +#endif /* GL_VERSION_1_2 */ + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTexture (GLenum texture); +GLAPI void APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); +GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, void *img); +GLAPI void APIENTRY glClientActiveTexture (GLenum texture); +GLAPI void APIENTRY glMultiTexCoord1d (GLenum target, GLdouble s); +GLAPI void APIENTRY glMultiTexCoord1dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord1f (GLenum target, GLfloat s); +GLAPI void APIENTRY glMultiTexCoord1fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord1i (GLenum target, GLint s); +GLAPI void APIENTRY glMultiTexCoord1iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord1s (GLenum target, GLshort s); +GLAPI void APIENTRY glMultiTexCoord1sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t); +GLAPI void APIENTRY glMultiTexCoord2dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t); +GLAPI void APIENTRY glMultiTexCoord2fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord2i (GLenum target, GLint s, GLint t); +GLAPI void APIENTRY glMultiTexCoord2iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord2s (GLenum target, GLshort s, GLshort t); +GLAPI void APIENTRY glMultiTexCoord2sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void APIENTRY glMultiTexCoord3dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void APIENTRY glMultiTexCoord3fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r); +GLAPI void APIENTRY glMultiTexCoord3iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void APIENTRY glMultiTexCoord3sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void APIENTRY glMultiTexCoord4dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void APIENTRY glMultiTexCoord4fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void APIENTRY glMultiTexCoord4iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void APIENTRY glMultiTexCoord4sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *m); +GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *m); +GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *m); +GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *m); +#endif +#endif /* GL_VERSION_1_3 */ + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 #define GL_CONSTANT_COLOR 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 #define GL_CONSTANT_ALPHA 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); +GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param); +GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params); +GLAPI void APIENTRY glFogCoordf (GLfloat coord); +GLAPI void APIENTRY glFogCoordfv (const GLfloat *coord); +GLAPI void APIENTRY glFogCoordd (GLdouble coord); +GLAPI void APIENTRY glFogCoorddv (const GLdouble *coord); +GLAPI void APIENTRY glFogCoordPointer (GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *v); +GLAPI void APIENTRY glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *v); +GLAPI void APIENTRY glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *v); +GLAPI void APIENTRY glSecondaryColor3i (GLint red, GLint green, GLint blue); +GLAPI void APIENTRY glSecondaryColor3iv (const GLint *v); +GLAPI void APIENTRY glSecondaryColor3s (GLshort red, GLshort green, GLshort blue); +GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *v); +GLAPI void APIENTRY glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *v); +GLAPI void APIENTRY glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue); +GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *v); +GLAPI void APIENTRY glSecondaryColor3us (GLushort red, GLushort green, GLushort blue); +GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *v); +GLAPI void APIENTRY glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glWindowPos2d (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dv (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2f (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fv (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2i (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2iv (const GLint *v); +GLAPI void APIENTRY glWindowPos2s (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2sv (const GLshort *v); +GLAPI void APIENTRY glWindowPos3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dv (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fv (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3i (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3iv (const GLint *v); +GLAPI void APIENTRY glWindowPos3s (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3sv (const GLshort *v); +GLAPI void APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void APIENTRY glBlendEquation (GLenum mode); +#endif +#endif /* GL_VERSION_1_4 */ + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 +#include +typedef ptrdiff_t GLsizeiptr; +typedef ptrdiff_t GLintptr; +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 +#define GL_SRC1_ALPHA 0x8589 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_FOG_COORD_SRC 0x8450 +#define GL_FOG_COORD 0x8451 +#define GL_CURRENT_FOG_COORD 0x8453 +#define GL_FOG_COORD_ARRAY_TYPE 0x8454 +#define GL_FOG_COORD_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORD_ARRAY_POINTER 0x8456 +#define GL_FOG_COORD_ARRAY 0x8457 +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D +#define GL_SRC0_RGB 0x8580 +#define GL_SRC1_RGB 0x8581 +#define GL_SRC2_RGB 0x8582 +#define GL_SRC0_ALPHA 0x8588 +#define GL_SRC2_ALPHA 0x858A +typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void *data); +typedef void *(APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsQuery (GLuint id); +GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id); +GLAPI void APIENTRY glEndQuery (GLenum target); +GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); +GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); +GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); +GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer); +GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, void *data); +GLAPI void *APIENTRY glMapBuffer (GLenum target, GLenum access); +GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target); +GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params); +#endif +#endif /* GL_VERSION_1_5 */ + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 +typedef char GLchar; +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_TEXTURE_COORDS 0x8871 +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); +GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); +GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); +GLAPI void APIENTRY glCompileShader (GLuint shader); +GLAPI GLuint APIENTRY glCreateProgram (void); +GLAPI GLuint APIENTRY glCreateShader (GLenum type); +GLAPI void APIENTRY glDeleteProgram (GLuint program); +GLAPI void APIENTRY glDeleteShader (GLuint shader); +GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); +GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); +GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); +GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); +GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); +GLAPI GLboolean APIENTRY glIsProgram (GLuint program); +GLAPI GLboolean APIENTRY glIsShader (GLuint shader); +GLAPI void APIENTRY glLinkProgram (GLuint program); +GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +GLAPI void APIENTRY glUseProgram (GLuint program); +GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0); +GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); +GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glValidateProgram (GLuint program); +GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +#endif +#endif /* GL_VERSION_2_0 */ + +#ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#endif +#endif /* GL_VERSION_2_1 */ + +#ifndef GL_VERSION_3_0 +#define GL_VERSION_3_0 1 +typedef unsigned short GLhalf; +#define GL_COMPARE_REF_TO_TEXTURE 0x884E +#define GL_CLIP_DISTANCE0 0x3000 +#define GL_CLIP_DISTANCE1 0x3001 +#define GL_CLIP_DISTANCE2 0x3002 +#define GL_CLIP_DISTANCE3 0x3003 +#define GL_CLIP_DISTANCE4 0x3004 +#define GL_CLIP_DISTANCE5 0x3005 +#define GL_CLIP_DISTANCE6 0x3006 +#define GL_CLIP_DISTANCE7 0x3007 +#define GL_MAX_CLIP_DISTANCES 0x0D32 +#define GL_MAJOR_VERSION 0x821B +#define GL_MINOR_VERSION 0x821C +#define GL_NUM_EXTENSIONS 0x821D +#define GL_CONTEXT_FLAGS 0x821E +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RG 0x8226 +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 +#define GL_RGBA32F 0x8814 +#define GL_RGB32F 0x8815 +#define GL_RGBA16F 0x881A +#define GL_RGB16F 0x881B +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_FIXED_ONLY 0x891D +#define GL_MAX_VARYING_COMPONENTS 0x8B4B +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_RGB9_E5 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_RGBA32UI 0x8D70 +#define GL_RGB32UI 0x8D71 +#define GL_RGBA16UI 0x8D76 +#define GL_RGB16UI 0x8D77 +#define GL_RGBA8UI 0x8D7C +#define GL_RGB8UI 0x8D7D +#define GL_RGBA32I 0x8D82 +#define GL_RGB32I 0x8D83 +#define GL_RGBA16I 0x8D88 +#define GL_RGB16I 0x8D89 +#define GL_RGBA8I 0x8D8E +#define GL_RGB8I 0x8D8F +#define GL_RED_INTEGER 0x8D94 +#define GL_GREEN_INTEGER 0x8D95 +#define GL_BLUE_INTEGER 0x8D96 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_BGR_INTEGER 0x8D9A +#define GL_BGRA_INTEGER 0x8D9B +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_QUERY_WAIT 0x8E13 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT9 0x8CE9 +#define GL_COLOR_ATTACHMENT10 0x8CEA +#define GL_COLOR_ATTACHMENT11 0x8CEB +#define GL_COLOR_ATTACHMENT12 0x8CEC +#define GL_COLOR_ATTACHMENT13 0x8CED +#define GL_COLOR_ATTACHMENT14 0x8CEE +#define GL_COLOR_ATTACHMENT15 0x8CEF +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_STENCIL_INDEX1 0x8D46 +#define GL_STENCIL_INDEX4 0x8D47 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_INDEX16 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_MAX_SAMPLES 0x8D57 +#define GL_INDEX 0x8222 +#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 +#define GL_FRAMEBUFFER_SRGB 0x8DB9 +#define GL_HALF_FLOAT 0x140B +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE +#define GL_RG 0x8227 +#define GL_RG_INTEGER 0x8228 +#define GL_R8 0x8229 +#define GL_R16 0x822A +#define GL_RG8 0x822B +#define GL_RG16 0x822C +#define GL_R16F 0x822D +#define GL_R32F 0x822E +#define GL_RG16F 0x822F +#define GL_RG32F 0x8230 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C +#define GL_VERTEX_ARRAY_BINDING 0x85B5 +#define GL_CLAMP_VERTEX_COLOR 0x891A +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_ALPHA_INTEGER 0x8D97 +typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); +typedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); +typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void *(APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data); +GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); +GLAPI void APIENTRY glEnablei (GLenum target, GLuint index); +GLAPI void APIENTRY glDisablei (GLenum target, GLuint index); +GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index); +GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedback (void); +GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp); +GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode); +GLAPI void APIENTRY glEndConditionalRender (void); +GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); +GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x); +GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y); +GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x); +GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y); +GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); +GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0); +GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); +GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); +GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); +GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +GLAPI const GLubyte *APIENTRY glGetStringi (GLenum name, GLuint index); +GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer); +GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); +GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer); +GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); +GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); +GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); +GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target); +GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateMipmap (GLenum target); +GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void *APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glBindVertexArray (GLuint array); +GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); +GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); +GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array); +#endif +#endif /* GL_VERSION_3_0 */ + +#ifndef GL_VERSION_3_1 +#define GL_VERSION_3_1 1 +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_INVALID_INDEX 0xFFFFFFFFu +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); +typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index); +typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); +GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index); +GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); +GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +#endif +#endif /* GL_VERSION_3_1 */ + +#ifndef GL_VERSION_3_2 +#define GL_VERSION_3_2 1 +typedef struct __GLsync *GLsync; +#ifndef GLEXT_64_TYPES_DEFINED +/* This code block is duplicated in glxext.h, so must be protected */ +#define GLEXT_64_TYPES_DEFINED +/* Define int32_t, int64_t, and uint64_t types for UST/MSC */ +/* (as used in the GL_EXT_timer_query extension). */ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +#elif defined(__sun__) || defined(__digital__) +#include +#if defined(__STDC__) +#if defined(__arch64__) || defined(_LP64) +typedef long int int64_t; +typedef unsigned long int uint64_t; +#else +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +#endif /* __arch64__ */ +#endif /* __STDC__ */ +#elif defined( __VMS ) || defined(__sgi) +#include +#elif defined(__SCO__) || defined(__USLC__) +#include +#elif defined(__UNIXOS2__) || defined(__SOL64__) +typedef long int int32_t; +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +#elif defined(_WIN32) && defined(__GNUC__) +#include +#elif defined(_WIN32) +typedef __int32 int32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else +/* Fallback if nothing above works */ +#include +#endif +#endif +typedef uint64_t GLuint64; +typedef int64_t GLint64; +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_CONTEXT_PROFILE_MASK 0x9126 +#define GL_DEPTH_CLAMP 0x864F +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_PROVOKING_VERTEX 0x8E4F +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_OBJECT_TYPE 0x9112 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_STATUS 0x9114 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_UNSIGNALED 0x9118 +#define GL_SIGNALED 0x9119 +#define GL_ALREADY_SIGNALED 0x911A +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_CONDITION_SATISFIED 0x911C +#define GL_WAIT_FAILED 0x911D +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_INTEGER_SAMPLES 0x9110 +typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode); +typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); +typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync); +typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); +typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data); +typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +GLAPI void APIENTRY glProvokingVertex (GLenum mode); +GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags); +GLAPI GLboolean APIENTRY glIsSync (GLsync sync); +GLAPI void APIENTRY glDeleteSync (GLsync sync); +GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *data); +GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); +GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); +GLAPI void APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask); +#endif +#endif /* GL_VERSION_3_2 */ + +#ifndef GL_VERSION_3_3 +#define GL_VERSION_3_3 1 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +#define GL_SRC1_COLOR 0x88F9 +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC +#define GL_ANY_SAMPLES_PASSED 0x8C2F +#define GL_SAMPLER_BINDING 0x8919 +#define GL_RGB10_A2UI 0x906F +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 +#define GL_TIME_ELAPSED 0x88BF +#define GL_TIMESTAMP 0x8E28 +#define GL_INT_2_10_10_10_REV 0x8D9F +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); +typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); +typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); +typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); +GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); +GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler); +GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); +GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); +GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); +GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); +GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param); +GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param); +GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params); +GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target); +GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params); +GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); +GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color); +GLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color); +GLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color); +GLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color); +#endif +#endif /* GL_VERSION_3_3 */ + +#ifndef GL_VERSION_4_0 +#define GL_VERSION_4_0 1 +#define GL_SAMPLE_SHADING 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D +#define GL_MAX_VERTEX_STREAMS 0x8E71 +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_MAT2x3 0x8F49 +#define GL_DOUBLE_MAT2x4 0x8F4A +#define GL_DOUBLE_MAT3x2 0x8F4B +#define GL_DOUBLE_MAT3x4 0x8F4C +#define GL_DOUBLE_MAT4x2 0x8F4D +#define GL_DOUBLE_MAT4x3 0x8F4E +#define GL_ACTIVE_SUBROUTINES 0x8DE5 +#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 +#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 +#define GL_MAX_SUBROUTINES 0x8DE7 +#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 +#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A +#define GL_COMPATIBLE_SUBROUTINES 0x8E4B +#define GL_PATCHES 0x000E +#define GL_PATCH_VERTICES 0x8E72 +#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 +#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 +#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 +#define GL_TESS_GEN_MODE 0x8E76 +#define GL_TESS_GEN_SPACING 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 +#define GL_TESS_GEN_POINT_MODE 0x8E79 +#define GL_ISOLINES 0x8E7A +#define GL_FRACTIONAL_ODD 0x8E7B +#define GL_FRACTIONAL_EVEN 0x8E7C +#define GL_MAX_PATCH_VERTICES 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 +#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 +typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value); +typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); +typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); +typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params); +typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices); +typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); +typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values); +typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); +typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); +typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); +typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMinSampleShading (GLfloat value); +GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect); +GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect); +GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x); +GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y); +GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params); +GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name); +GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name); +GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices); +GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params); +GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values); +GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value); +GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values); +GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); +GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); +GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id); +GLAPI void APIENTRY glPauseTransformFeedback (void); +GLAPI void APIENTRY glResumeTransformFeedback (void); +GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id); +GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream); +GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id); +GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index); +GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params); +#endif +#endif /* GL_VERSION_4_0 */ + +#ifndef GL_VERSION_4_1 +#define GL_VERSION_4_1 1 +#define GL_FIXED 0x140C +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_RGB565 0x8D62 +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_PROGRAM_BINARY_FORMATS 0x87FF +#define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT 0x00000002 +#define GL_GEOMETRY_SHADER_BIT 0x00000004 +#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 +#define GL_ALL_SHADER_BITS 0xFFFFFFFF +#define GL_PROGRAM_SEPARABLE 0x8258 +#define GL_ACTIVE_PROGRAM 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING 0x825A +#define GL_MAX_VIEWPORTS 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE 0x825D +#define GL_LAYER_PROVOKING_VERTEX 0x825E +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F +#define GL_UNDEFINED_VERTEX 0x8260 +typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); +typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); +typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); +typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d); +typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings); +typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); +typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v); +typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLdouble n, GLdouble f); +typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReleaseShaderCompiler (void); +GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); +GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +GLAPI void APIENTRY glDepthRangef (GLfloat n, GLfloat f); +GLAPI void APIENTRY glClearDepthf (GLfloat d); +GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); +GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program); +GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program); +GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings); +GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines); +GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines); +GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params); +GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0); +GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0); +GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0); +GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0); +GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1); +GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v); +GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v); +GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f); +GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data); +GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data); +#endif +#endif /* GL_VERSION_4_1 */ + +#ifndef GL_VERSION_4_2 +#define GL_VERSION_4_2 1 +#define GL_COPY_READ_BUFFER_BINDING 0x8F36 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 +#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 +#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 +#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 +#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A +#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B +#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C +#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D +#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E +#define GL_NUM_SAMPLE_COUNTS 0x9380 +#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC +#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 +#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 +#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 +#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 +#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB +#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF +#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 +#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 +#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 +#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 +#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC +#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 +#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA +#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 +#define GL_COMMAND_BARRIER_BIT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 +#define GL_ALL_BARRIER_BITS 0xFFFFFFFF +#define GL_MAX_IMAGE_UNITS 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 +#define GL_IMAGE_BINDING_NAME 0x8F3A +#define GL_IMAGE_BINDING_LEVEL 0x8F3B +#define GL_IMAGE_BINDING_LAYERED 0x8F3C +#define GL_IMAGE_BINDING_LAYER 0x8F3D +#define GL_IMAGE_BINDING_ACCESS 0x8F3E +#define GL_IMAGE_1D 0x904C +#define GL_IMAGE_2D 0x904D +#define GL_IMAGE_3D 0x904E +#define GL_IMAGE_2D_RECT 0x904F +#define GL_IMAGE_CUBE 0x9050 +#define GL_IMAGE_BUFFER 0x9051 +#define GL_IMAGE_1D_ARRAY 0x9052 +#define GL_IMAGE_2D_ARRAY 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 +#define GL_INT_IMAGE_1D 0x9057 +#define GL_INT_IMAGE_2D 0x9058 +#define GL_INT_IMAGE_3D 0x9059 +#define GL_INT_IMAGE_2D_RECT 0x905A +#define GL_INT_IMAGE_CUBE 0x905B +#define GL_INT_IMAGE_BUFFER 0x905C +#define GL_INT_IMAGE_1D_ARRAY 0x905D +#define GL_INT_IMAGE_2D_ARRAY 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C +#define GL_MAX_IMAGE_SAMPLES 0x906D +#define GL_IMAGE_BINDING_FORMAT 0x906E +#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 +#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD +#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE +#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF +#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F +#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); +typedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei instancecount); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +GLAPI void APIENTRY glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +GLAPI void APIENTRY glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +GLAPI void APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); +GLAPI void APIENTRY glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); +GLAPI void APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +GLAPI void APIENTRY glMemoryBarrier (GLbitfield barriers); +GLAPI void APIENTRY glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount); +GLAPI void APIENTRY glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); +#endif +#endif /* GL_VERSION_4_2 */ + +#ifndef GL_VERSION_4_3 +#define GL_VERSION_4_3 1 +typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 +#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E +#define GL_COMPRESSED_RGB8_ETC2 0x9274 +#define GL_COMPRESSED_SRGB8_ETC2 0x9275 +#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 +#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 +#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 +#define GL_COMPRESSED_R11_EAC 0x9270 +#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 +#define GL_COMPRESSED_RG11_EAC 0x9272 +#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A +#define GL_MAX_ELEMENT_INDEX 0x8D6B +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB +#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC +#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD +#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 +#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 +#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 +#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 +#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF +#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED +#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE +#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF +#define GL_COMPUTE_SHADER_BIT 0x00000020 +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 +#define GL_DEBUG_SOURCE_API 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION 0x824A +#define GL_DEBUG_SOURCE_OTHER 0x824B +#define GL_DEBUG_TYPE_ERROR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_LOW 0x9148 +#define GL_DEBUG_TYPE_MARKER 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D +#define GL_BUFFER 0x82E0 +#define GL_SHADER 0x82E1 +#define GL_PROGRAM 0x82E2 +#define GL_QUERY 0x82E3 +#define GL_PROGRAM_PIPELINE 0x82E4 +#define GL_SAMPLER 0x82E6 +#define GL_MAX_LABEL_LENGTH 0x82E8 +#define GL_DEBUG_OUTPUT 0x92E0 +#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 +#define GL_MAX_UNIFORM_LOCATIONS 0x826E +#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 +#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 +#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 +#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 +#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 +#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 +#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 +#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 +#define GL_INTERNALFORMAT_SUPPORTED 0x826F +#define GL_INTERNALFORMAT_PREFERRED 0x8270 +#define GL_INTERNALFORMAT_RED_SIZE 0x8271 +#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 +#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 +#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 +#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 +#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 +#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 +#define GL_INTERNALFORMAT_RED_TYPE 0x8278 +#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 +#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A +#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B +#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C +#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D +#define GL_MAX_WIDTH 0x827E +#define GL_MAX_HEIGHT 0x827F +#define GL_MAX_DEPTH 0x8280 +#define GL_MAX_LAYERS 0x8281 +#define GL_MAX_COMBINED_DIMENSIONS 0x8282 +#define GL_COLOR_COMPONENTS 0x8283 +#define GL_DEPTH_COMPONENTS 0x8284 +#define GL_STENCIL_COMPONENTS 0x8285 +#define GL_COLOR_RENDERABLE 0x8286 +#define GL_DEPTH_RENDERABLE 0x8287 +#define GL_STENCIL_RENDERABLE 0x8288 +#define GL_FRAMEBUFFER_RENDERABLE 0x8289 +#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A +#define GL_FRAMEBUFFER_BLEND 0x828B +#define GL_READ_PIXELS 0x828C +#define GL_READ_PIXELS_FORMAT 0x828D +#define GL_READ_PIXELS_TYPE 0x828E +#define GL_TEXTURE_IMAGE_FORMAT 0x828F +#define GL_TEXTURE_IMAGE_TYPE 0x8290 +#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 +#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 +#define GL_MIPMAP 0x8293 +#define GL_MANUAL_GENERATE_MIPMAP 0x8294 +#define GL_AUTO_GENERATE_MIPMAP 0x8295 +#define GL_COLOR_ENCODING 0x8296 +#define GL_SRGB_READ 0x8297 +#define GL_SRGB_WRITE 0x8298 +#define GL_FILTER 0x829A +#define GL_VERTEX_TEXTURE 0x829B +#define GL_TESS_CONTROL_TEXTURE 0x829C +#define GL_TESS_EVALUATION_TEXTURE 0x829D +#define GL_GEOMETRY_TEXTURE 0x829E +#define GL_FRAGMENT_TEXTURE 0x829F +#define GL_COMPUTE_TEXTURE 0x82A0 +#define GL_TEXTURE_SHADOW 0x82A1 +#define GL_TEXTURE_GATHER 0x82A2 +#define GL_TEXTURE_GATHER_SHADOW 0x82A3 +#define GL_SHADER_IMAGE_LOAD 0x82A4 +#define GL_SHADER_IMAGE_STORE 0x82A5 +#define GL_SHADER_IMAGE_ATOMIC 0x82A6 +#define GL_IMAGE_TEXEL_SIZE 0x82A7 +#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 +#define GL_IMAGE_PIXEL_FORMAT 0x82A9 +#define GL_IMAGE_PIXEL_TYPE 0x82AA +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF +#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 +#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 +#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 +#define GL_CLEAR_BUFFER 0x82B4 +#define GL_TEXTURE_VIEW 0x82B5 +#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 +#define GL_FULL_SUPPORT 0x82B7 +#define GL_CAVEAT_SUPPORT 0x82B8 +#define GL_IMAGE_CLASS_4_X_32 0x82B9 +#define GL_IMAGE_CLASS_2_X_32 0x82BA +#define GL_IMAGE_CLASS_1_X_32 0x82BB +#define GL_IMAGE_CLASS_4_X_16 0x82BC +#define GL_IMAGE_CLASS_2_X_16 0x82BD +#define GL_IMAGE_CLASS_1_X_16 0x82BE +#define GL_IMAGE_CLASS_4_X_8 0x82BF +#define GL_IMAGE_CLASS_2_X_8 0x82C0 +#define GL_IMAGE_CLASS_1_X_8 0x82C1 +#define GL_IMAGE_CLASS_11_11_10 0x82C2 +#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 +#define GL_VIEW_CLASS_128_BITS 0x82C4 +#define GL_VIEW_CLASS_96_BITS 0x82C5 +#define GL_VIEW_CLASS_64_BITS 0x82C6 +#define GL_VIEW_CLASS_48_BITS 0x82C7 +#define GL_VIEW_CLASS_32_BITS 0x82C8 +#define GL_VIEW_CLASS_24_BITS 0x82C9 +#define GL_VIEW_CLASS_16_BITS 0x82CA +#define GL_VIEW_CLASS_8_BITS 0x82CB +#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC +#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD +#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE +#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF +#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 +#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 +#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 +#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 +#define GL_UNIFORM 0x92E1 +#define GL_UNIFORM_BLOCK 0x92E2 +#define GL_PROGRAM_INPUT 0x92E3 +#define GL_PROGRAM_OUTPUT 0x92E4 +#define GL_BUFFER_VARIABLE 0x92E5 +#define GL_SHADER_STORAGE_BLOCK 0x92E6 +#define GL_VERTEX_SUBROUTINE 0x92E8 +#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 +#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA +#define GL_GEOMETRY_SUBROUTINE 0x92EB +#define GL_FRAGMENT_SUBROUTINE 0x92EC +#define GL_COMPUTE_SUBROUTINE 0x92ED +#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE +#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF +#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 +#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 +#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 +#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 +#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 +#define GL_ACTIVE_RESOURCES 0x92F5 +#define GL_MAX_NAME_LENGTH 0x92F6 +#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 +#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 +#define GL_NAME_LENGTH 0x92F9 +#define GL_TYPE 0x92FA +#define GL_ARRAY_SIZE 0x92FB +#define GL_OFFSET 0x92FC +#define GL_BLOCK_INDEX 0x92FD +#define GL_ARRAY_STRIDE 0x92FE +#define GL_MATRIX_STRIDE 0x92FF +#define GL_IS_ROW_MAJOR 0x9300 +#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 +#define GL_BUFFER_BINDING 0x9302 +#define GL_BUFFER_DATA_SIZE 0x9303 +#define GL_NUM_ACTIVE_VARIABLES 0x9304 +#define GL_ACTIVE_VARIABLES 0x9305 +#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 +#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 +#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A +#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B +#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C +#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D +#define GL_LOCATION 0x930E +#define GL_LOCATION_INDEX 0x930F +#define GL_IS_PER_PATCH 0x92E7 +#define GL_SHADER_STORAGE_BUFFER 0x90D2 +#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 +#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 +#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 +#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 +#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA +#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB +#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC +#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD +#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE +#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF +#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 +#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 +#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA +#define GL_TEXTURE_BUFFER_OFFSET 0x919D +#define GL_TEXTURE_BUFFER_SIZE 0x919E +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F +#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF +#define GL_VERTEX_ATTRIB_BINDING 0x82D4 +#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 +#define GL_VERTEX_BINDING_DIVISOR 0x82D6 +#define GL_VERTEX_BINDING_OFFSET 0x82D7 +#define GL_VERTEX_BINDING_STRIDE 0x82D8 +#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 +#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_VERTEX_BINDING_BUFFER 0x8F4F +#define GL_DISPLAY_LIST 0x82E7 +typedef void (APIENTRYP PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); +typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); +typedef void (APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); +typedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); +typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); +typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +typedef void (APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +typedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); +typedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void); +typedef void (APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +GLAPI void APIENTRY glDispatchComputeIndirect (GLintptr indirect); +GLAPI void APIENTRY glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +GLAPI void APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); +GLAPI void APIENTRY glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glInvalidateTexImage (GLuint texture, GLint level); +GLAPI void APIENTRY glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glInvalidateBufferData (GLuint buffer); +GLAPI void APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments); +GLAPI void APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +GLAPI void APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params); +GLAPI GLuint APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI void APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); +GLAPI GLint APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI GLint APIENTRY glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI void APIENTRY glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +GLAPI void APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +GLAPI void APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI void APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex); +GLAPI void APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor); +GLAPI void APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +GLAPI void APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message); +GLAPI void APIENTRY glPopDebugGroup (void); +GLAPI void APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +GLAPI void APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +#endif +#endif /* GL_VERSION_4_3 */ + +#ifndef GL_VERSION_4_4 +#define GL_VERSION_4_4 1 +#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 +#define GL_TEXTURE_BUFFER_BINDING 0x8C2A +#define GL_MAP_PERSISTENT_BIT 0x0040 +#define GL_MAP_COHERENT_BIT 0x0080 +#define GL_DYNAMIC_STORAGE_BIT 0x0100 +#define GL_CLIENT_STORAGE_BIT 0x0200 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 +#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F +#define GL_BUFFER_STORAGE_FLAGS 0x8220 +#define GL_CLEAR_TEXTURE 0x9365 +#define GL_LOCATION_COMPONENT 0x934A +#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B +#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C +#define GL_QUERY_BUFFER 0x9192 +#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 +#define GL_QUERY_BUFFER_BINDING 0x9193 +#define GL_QUERY_RESULT_NO_WAIT 0x9194 +#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 +typedef void (APIENTRYP PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); +typedef void (APIENTRYP PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +typedef void (APIENTRYP PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); +typedef void (APIENTRYP PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint *samplers); +typedef void (APIENTRYP PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); +typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferStorage (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +GLAPI void APIENTRY glClearTexImage (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glBindBuffersBase (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); +GLAPI void APIENTRY glBindBuffersRange (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +GLAPI void APIENTRY glBindTextures (GLuint first, GLsizei count, const GLuint *textures); +GLAPI void APIENTRY glBindSamplers (GLuint first, GLsizei count, const GLuint *samplers); +GLAPI void APIENTRY glBindImageTextures (GLuint first, GLsizei count, const GLuint *textures); +GLAPI void APIENTRY glBindVertexBuffers (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +#endif +#endif /* GL_VERSION_4_4 */ + +#ifndef GL_VERSION_4_5 +#define GL_VERSION_4_5 1 +#define GL_CONTEXT_LOST 0x0507 +#define GL_NEGATIVE_ONE_TO_ONE 0x935E +#define GL_ZERO_TO_ONE 0x935F +#define GL_CLIP_ORIGIN 0x935C +#define GL_CLIP_DEPTH_MODE 0x935D +#define GL_QUERY_WAIT_INVERTED 0x8E17 +#define GL_QUERY_NO_WAIT_INVERTED 0x8E18 +#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 +#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A +#define GL_MAX_CULL_DISTANCES 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA +#define GL_TEXTURE_TARGET 0x1006 +#define GL_QUERY_TARGET 0x82EA +#define GL_TEXTURE_BINDING 0x82EB +#define GL_GUILTY_CONTEXT_RESET 0x8253 +#define GL_INNOCENT_CONTEXT_RESET 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 +#define GL_LOSE_CONTEXT_ON_RESET 0x8252 +#define GL_NO_RESET_NOTIFICATION 0x8261 +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 +#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC +typedef void (APIENTRYP PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); +typedef void (APIENTRYP PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint *param); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); +typedef void (APIENTRYP PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizei size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizei size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizei size, const void *data); +typedef void (APIENTRYP PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access); +typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizei length); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void **params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizei size, void *data); +typedef void (APIENTRYP PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum buf); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum src); +typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); +typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, const GLfloat depth, GLint stencil); +typedef void (APIENTRYP PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint *textures); +typedef void (APIENTRYP PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); +typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); +typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); +typedef void (APIENTRYP PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint *samplers); +typedef void (APIENTRYP PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); +typedef void (APIENTRYP PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); +typedef void (APIENTRYP PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); +typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSPROC) (void); +typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETNTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (APIENTRYP PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (APIENTRYP PFNGLGETNMAPDVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +typedef void (APIENTRYP PFNGLGETNMAPFVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +typedef void (APIENTRYP PFNGLGETNMAPIVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +typedef void (APIENTRYP PFNGLGETNPIXELMAPFVPROC) (GLenum map, GLsizei bufSize, GLfloat *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVPROC) (GLenum map, GLsizei bufSize, GLuint *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVPROC) (GLenum map, GLsizei bufSize, GLushort *values); +typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEPROC) (GLsizei bufSize, GLubyte *pattern); +typedef void (APIENTRYP PFNGLGETNCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +typedef void (APIENTRYP PFNGLGETNHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP PFNGLGETNMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP PFNGLTEXTUREBARRIERPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClipControl (GLenum origin, GLenum depth); +GLAPI void APIENTRY glCreateTransformFeedbacks (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glTransformFeedbackBufferBase (GLuint xfb, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackBufferRange (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size); +GLAPI void APIENTRY glGetTransformFeedbackiv (GLuint xfb, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetTransformFeedbacki_v (GLuint xfb, GLenum pname, GLuint index, GLint *param); +GLAPI void APIENTRY glGetTransformFeedbacki64_v (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); +GLAPI void APIENTRY glCreateBuffers (GLsizei n, GLuint *buffers); +GLAPI void APIENTRY glNamedBufferStorage (GLuint buffer, GLsizei size, const void *data, GLbitfield flags); +GLAPI void APIENTRY glNamedBufferData (GLuint buffer, GLsizei size, const void *data, GLenum usage); +GLAPI void APIENTRY glNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizei size, const void *data); +GLAPI void APIENTRY glCopyNamedBufferSubData (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size); +GLAPI void APIENTRY glClearNamedBufferData (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearNamedBufferSubData (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data); +GLAPI void *APIENTRY glMapNamedBuffer (GLuint buffer, GLenum access); +GLAPI void *APIENTRY glMapNamedBufferRange (GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access); +GLAPI GLboolean APIENTRY glUnmapNamedBuffer (GLuint buffer); +GLAPI void APIENTRY glFlushMappedNamedBufferRange (GLuint buffer, GLintptr offset, GLsizei length); +GLAPI void APIENTRY glGetNamedBufferParameteriv (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedBufferParameteri64v (GLuint buffer, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetNamedBufferPointerv (GLuint buffer, GLenum pname, void **params); +GLAPI void APIENTRY glGetNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizei size, void *data); +GLAPI void APIENTRY glCreateFramebuffers (GLsizei n, GLuint *framebuffers); +GLAPI void APIENTRY glNamedFramebufferRenderbuffer (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glNamedFramebufferParameteri (GLuint framebuffer, GLenum pname, GLint param); +GLAPI void APIENTRY glNamedFramebufferTexture (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTextureLayer (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glNamedFramebufferDrawBuffer (GLuint framebuffer, GLenum buf); +GLAPI void APIENTRY glNamedFramebufferDrawBuffers (GLuint framebuffer, GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glNamedFramebufferReadBuffer (GLuint framebuffer, GLenum src); +GLAPI void APIENTRY glInvalidateNamedFramebufferData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); +GLAPI void APIENTRY glInvalidateNamedFramebufferSubData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glClearNamedFramebufferiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); +GLAPI void APIENTRY glClearNamedFramebufferuiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); +GLAPI void APIENTRY glClearNamedFramebufferfv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); +GLAPI void APIENTRY glClearNamedFramebufferfi (GLuint framebuffer, GLenum buffer, const GLfloat depth, GLint stencil); +GLAPI void APIENTRY glBlitNamedFramebuffer (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +GLAPI GLenum APIENTRY glCheckNamedFramebufferStatus (GLuint framebuffer, GLenum target); +GLAPI void APIENTRY glGetNamedFramebufferParameteriv (GLuint framebuffer, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameteriv (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glCreateRenderbuffers (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glNamedRenderbufferStorage (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisample (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetNamedRenderbufferParameteriv (GLuint renderbuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glCreateTextures (GLenum target, GLsizei n, GLuint *textures); +GLAPI void APIENTRY glTextureBuffer (GLuint texture, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glTextureBufferRange (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size); +GLAPI void APIENTRY glTextureStorage1D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTextureStorage2D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTextureStorage3D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glTextureStorage2DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureStorage3DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCompressedTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCopyTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glCopyTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTextureParameterf (GLuint texture, GLenum pname, GLfloat param); +GLAPI void APIENTRY glTextureParameterfv (GLuint texture, GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glTextureParameteri (GLuint texture, GLenum pname, GLint param); +GLAPI void APIENTRY glTextureParameterIiv (GLuint texture, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureParameterIuiv (GLuint texture, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glTextureParameteriv (GLuint texture, GLenum pname, const GLint *param); +GLAPI void APIENTRY glGenerateTextureMipmap (GLuint texture); +GLAPI void APIENTRY glBindTextureUnit (GLuint unit, GLuint texture); +GLAPI void APIENTRY glGetTextureImage (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetCompressedTextureImage (GLuint texture, GLint level, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetTextureLevelParameterfv (GLuint texture, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureLevelParameteriv (GLuint texture, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterfv (GLuint texture, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureParameterIiv (GLuint texture, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterIuiv (GLuint texture, GLenum pname, GLuint *params); +GLAPI void APIENTRY glGetTextureParameteriv (GLuint texture, GLenum pname, GLint *params); +GLAPI void APIENTRY glCreateVertexArrays (GLsizei n, GLuint *arrays); +GLAPI void APIENTRY glDisableVertexArrayAttrib (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glEnableVertexArrayAttrib (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glVertexArrayElementBuffer (GLuint vaobj, GLuint buffer); +GLAPI void APIENTRY glVertexArrayVertexBuffer (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI void APIENTRY glVertexArrayVertexBuffers (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +GLAPI void APIENTRY glVertexArrayAttribBinding (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +GLAPI void APIENTRY glVertexArrayAttribFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayAttribIFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayAttribLFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayBindingDivisor (GLuint vaobj, GLuint bindingindex, GLuint divisor); +GLAPI void APIENTRY glGetVertexArrayiv (GLuint vaobj, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayIndexediv (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayIndexed64iv (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); +GLAPI void APIENTRY glCreateSamplers (GLsizei n, GLuint *samplers); +GLAPI void APIENTRY glCreateProgramPipelines (GLsizei n, GLuint *pipelines); +GLAPI void APIENTRY glCreateQueries (GLenum target, GLsizei n, GLuint *ids); +GLAPI void APIENTRY glGetQueryBufferObjecti64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glGetQueryBufferObjectiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glGetQueryBufferObjectui64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glGetQueryBufferObjectuiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glMemoryBarrierByRegion (GLbitfield barriers); +GLAPI void APIENTRY glGetTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetCompressedTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); +GLAPI GLenum APIENTRY glGetGraphicsResetStatus (void); +GLAPI void APIENTRY glGetnCompressedTexImage (GLenum target, GLint lod, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetnTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetnUniformdv (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +GLAPI void APIENTRY glGetnUniformfv (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GLAPI void APIENTRY glGetnUniformiv (GLuint program, GLint location, GLsizei bufSize, GLint *params); +GLAPI void APIENTRY glGetnUniformuiv (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +GLAPI void APIENTRY glReadnPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +GLAPI void APIENTRY glGetnMapdv (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +GLAPI void APIENTRY glGetnMapfv (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +GLAPI void APIENTRY glGetnMapiv (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +GLAPI void APIENTRY glGetnPixelMapfv (GLenum map, GLsizei bufSize, GLfloat *values); +GLAPI void APIENTRY glGetnPixelMapuiv (GLenum map, GLsizei bufSize, GLuint *values); +GLAPI void APIENTRY glGetnPixelMapusv (GLenum map, GLsizei bufSize, GLushort *values); +GLAPI void APIENTRY glGetnPolygonStipple (GLsizei bufSize, GLubyte *pattern); +GLAPI void APIENTRY glGetnColorTable (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +GLAPI void APIENTRY glGetnConvolutionFilter (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +GLAPI void APIENTRY glGetnSeparableFilter (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +GLAPI void APIENTRY glGetnHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +GLAPI void APIENTRY glGetnMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +GLAPI void APIENTRY glTextureBarrier (void); +#endif +#endif /* GL_VERSION_4_5 */ + +#ifndef GL_ARB_ES2_compatibility +#define GL_ARB_ES2_compatibility 1 +#endif /* GL_ARB_ES2_compatibility */ + +#ifndef GL_ARB_ES3_1_compatibility +#define GL_ARB_ES3_1_compatibility 1 +#endif /* GL_ARB_ES3_1_compatibility */ + +#ifndef GL_ARB_ES3_compatibility +#define GL_ARB_ES3_compatibility 1 +#endif /* GL_ARB_ES3_compatibility */ + +#ifndef GL_ARB_arrays_of_arrays +#define GL_ARB_arrays_of_arrays 1 +#endif /* GL_ARB_arrays_of_arrays */ + +#ifndef GL_ARB_base_instance +#define GL_ARB_base_instance 1 +#endif /* GL_ARB_base_instance */ + +#ifndef GL_ARB_bindless_texture +#define GL_ARB_bindless_texture 1 +typedef uint64_t GLuint64EXT; +#define GL_UNSIGNED_INT64_ARB 0x140F +typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); +typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint64 APIENTRY glGetTextureHandleARB (GLuint texture); +GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleARB (GLuint texture, GLuint sampler); +GLAPI void APIENTRY glMakeTextureHandleResidentARB (GLuint64 handle); +GLAPI void APIENTRY glMakeTextureHandleNonResidentARB (GLuint64 handle); +GLAPI GLuint64 APIENTRY glGetImageHandleARB (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +GLAPI void APIENTRY glMakeImageHandleResidentARB (GLuint64 handle, GLenum access); +GLAPI void APIENTRY glMakeImageHandleNonResidentARB (GLuint64 handle); +GLAPI void APIENTRY glUniformHandleui64ARB (GLint location, GLuint64 value); +GLAPI void APIENTRY glUniformHandleui64vARB (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniformHandleui64ARB (GLuint program, GLint location, GLuint64 value); +GLAPI void APIENTRY glProgramUniformHandleui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +GLAPI GLboolean APIENTRY glIsTextureHandleResidentARB (GLuint64 handle); +GLAPI GLboolean APIENTRY glIsImageHandleResidentARB (GLuint64 handle); +GLAPI void APIENTRY glVertexAttribL1ui64ARB (GLuint index, GLuint64EXT x); +GLAPI void APIENTRY glVertexAttribL1ui64vARB (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glGetVertexAttribLui64vARB (GLuint index, GLenum pname, GLuint64EXT *params); +#endif +#endif /* GL_ARB_bindless_texture */ + +#ifndef GL_ARB_blend_func_extended +#define GL_ARB_blend_func_extended 1 +#endif /* GL_ARB_blend_func_extended */ + +#ifndef GL_ARB_buffer_storage +#define GL_ARB_buffer_storage 1 +#endif /* GL_ARB_buffer_storage */ + +#ifndef GL_ARB_cl_event +#define GL_ARB_cl_event 1 +struct _cl_context; +struct _cl_event; +#define GL_SYNC_CL_EVENT_ARB 0x8240 +#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 +typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); +#endif +#endif /* GL_ARB_cl_event */ + +#ifndef GL_ARB_clear_buffer_object +#define GL_ARB_clear_buffer_object 1 +#endif /* GL_ARB_clear_buffer_object */ + +#ifndef GL_ARB_clear_texture +#define GL_ARB_clear_texture 1 +#endif /* GL_ARB_clear_texture */ + +#ifndef GL_ARB_clip_control +#define GL_ARB_clip_control 1 +#endif /* GL_ARB_clip_control */ + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D +typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClampColorARB (GLenum target, GLenum clamp); +#endif +#endif /* GL_ARB_color_buffer_float */ + +#ifndef GL_ARB_compatibility +#define GL_ARB_compatibility 1 +#endif /* GL_ARB_compatibility */ + +#ifndef GL_ARB_compressed_texture_pixel_storage +#define GL_ARB_compressed_texture_pixel_storage 1 +#endif /* GL_ARB_compressed_texture_pixel_storage */ + +#ifndef GL_ARB_compute_shader +#define GL_ARB_compute_shader 1 +#endif /* GL_ARB_compute_shader */ + +#ifndef GL_ARB_compute_variable_group_size +#define GL_ARB_compute_variable_group_size 1 +#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 +#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB +#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 +#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDispatchComputeGroupSizeARB (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); +#endif +#endif /* GL_ARB_compute_variable_group_size */ + +#ifndef GL_ARB_conditional_render_inverted +#define GL_ARB_conditional_render_inverted 1 +#endif /* GL_ARB_conditional_render_inverted */ + +#ifndef GL_ARB_conservative_depth +#define GL_ARB_conservative_depth 1 +#endif /* GL_ARB_conservative_depth */ + +#ifndef GL_ARB_copy_buffer +#define GL_ARB_copy_buffer 1 +#endif /* GL_ARB_copy_buffer */ + +#ifndef GL_ARB_copy_image +#define GL_ARB_copy_image 1 +#endif /* GL_ARB_copy_image */ + +#ifndef GL_ARB_cull_distance +#define GL_ARB_cull_distance 1 +#endif /* GL_ARB_cull_distance */ + +#ifndef GL_ARB_debug_output +#define GL_ARB_debug_output 1 +typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 +#define GL_DEBUG_SOURCE_API_ARB 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A +#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B +#define GL_DEBUG_TYPE_ERROR_ARB 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 +#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 +#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 +typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +#endif +#endif /* GL_ARB_debug_output */ + +#ifndef GL_ARB_depth_buffer_float +#define GL_ARB_depth_buffer_float 1 +#endif /* GL_ARB_depth_buffer_float */ + +#ifndef GL_ARB_depth_clamp +#define GL_ARB_depth_clamp 1 +#endif /* GL_ARB_depth_clamp */ + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B +#endif /* GL_ARB_depth_texture */ + +#ifndef GL_ARB_derivative_control +#define GL_ARB_derivative_control 1 +#endif /* GL_ARB_derivative_control */ + +#ifndef GL_ARB_direct_state_access +#define GL_ARB_direct_state_access 1 +#endif /* GL_ARB_direct_state_access */ + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 +typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersARB (GLsizei n, const GLenum *bufs); +#endif +#endif /* GL_ARB_draw_buffers */ + +#ifndef GL_ARB_draw_buffers_blend +#define GL_ARB_draw_buffers_blend 1 +typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#endif +#endif /* GL_ARB_draw_buffers_blend */ + +#ifndef GL_ARB_draw_elements_base_vertex +#define GL_ARB_draw_elements_base_vertex 1 +#endif /* GL_ARB_draw_elements_base_vertex */ + +#ifndef GL_ARB_draw_indirect +#define GL_ARB_draw_indirect 1 +#endif /* GL_ARB_draw_indirect */ + +#ifndef GL_ARB_draw_instanced +#define GL_ARB_draw_instanced 1 +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#endif +#endif /* GL_ARB_draw_instanced */ + +#ifndef GL_ARB_enhanced_layouts +#define GL_ARB_enhanced_layouts 1 +#endif /* GL_ARB_enhanced_layouts */ + +#ifndef GL_ARB_explicit_attrib_location +#define GL_ARB_explicit_attrib_location 1 +#endif /* GL_ARB_explicit_attrib_location */ + +#ifndef GL_ARB_explicit_uniform_location +#define GL_ARB_explicit_uniform_location 1 +#endif /* GL_ARB_explicit_uniform_location */ + +#ifndef GL_ARB_fragment_coord_conventions +#define GL_ARB_fragment_coord_conventions 1 +#endif /* GL_ARB_fragment_coord_conventions */ + +#ifndef GL_ARB_fragment_layer_viewport +#define GL_ARB_fragment_layer_viewport 1 +#endif /* GL_ARB_fragment_layer_viewport */ + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramStringARB (GLenum target, GLenum format, GLsizei len, const void *string); +GLAPI void APIENTRY glBindProgramARB (GLenum target, GLuint program); +GLAPI void APIENTRY glDeleteProgramsARB (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glGenProgramsARB (GLsizei n, GLuint *programs); +GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetProgramivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramStringARB (GLenum target, GLenum pname, void *string); +GLAPI GLboolean APIENTRY glIsProgramARB (GLuint program); +#endif +#endif /* GL_ARB_fragment_program */ + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 +#endif /* GL_ARB_fragment_program_shadow */ + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B +#endif /* GL_ARB_fragment_shader */ + +#ifndef GL_ARB_framebuffer_no_attachments +#define GL_ARB_framebuffer_no_attachments 1 +#endif /* GL_ARB_framebuffer_no_attachments */ + +#ifndef GL_ARB_framebuffer_object +#define GL_ARB_framebuffer_object 1 +#endif /* GL_ARB_framebuffer_object */ + +#ifndef GL_ARB_framebuffer_sRGB +#define GL_ARB_framebuffer_sRGB 1 +#endif /* GL_ARB_framebuffer_sRGB */ + +#ifndef GL_ARB_geometry_shader4 +#define GL_ARB_geometry_shader4 1 +#define GL_LINES_ADJACENCY_ARB 0x000A +#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B +#define GL_TRIANGLES_ADJACENCY_ARB 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D +#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 +#define GL_GEOMETRY_SHADER_ARB 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramParameteriARB (GLuint program, GLenum pname, GLint value); +GLAPI void APIENTRY glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#endif +#endif /* GL_ARB_geometry_shader4 */ + +#ifndef GL_ARB_get_program_binary +#define GL_ARB_get_program_binary 1 +#endif /* GL_ARB_get_program_binary */ + +#ifndef GL_ARB_get_texture_sub_image +#define GL_ARB_get_texture_sub_image 1 +#endif /* GL_ARB_get_texture_sub_image */ + +#ifndef GL_ARB_gpu_shader5 +#define GL_ARB_gpu_shader5 1 +#endif /* GL_ARB_gpu_shader5 */ + +#ifndef GL_ARB_gpu_shader_fp64 +#define GL_ARB_gpu_shader_fp64 1 +#endif /* GL_ARB_gpu_shader_fp64 */ + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 +typedef unsigned short GLhalfARB; +#define GL_HALF_FLOAT_ARB 0x140B +#endif /* GL_ARB_half_float_pixel */ + +#ifndef GL_ARB_half_float_vertex +#define GL_ARB_half_float_vertex 1 +#endif /* GL_ARB_half_float_vertex */ + +#ifndef GL_ARB_imaging +#define GL_ARB_imaging 1 #define GL_BLEND_COLOR 0x8005 -#define GL_FUNC_ADD 0x8006 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 #define GL_BLEND_EQUATION 0x8009 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B #define GL_CONVOLUTION_1D 0x8010 #define GL_CONVOLUTION_2D 0x8011 #define GL_SEPARABLE_2D 0x8012 @@ -94,19 +3381,6 @@ extern "C" { #define GL_MINMAX_FORMAT 0x802F #define GL_MINMAX_SINK 0x8030 #define GL_TABLE_TOO_LARGE 0x8031 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_RESCALE_NORMAL 0x803A -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 #define GL_COLOR_MATRIX 0x80B1 #define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 #define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 @@ -117,6 +3391,7 @@ extern "C" { #define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 #define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 #define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB #define GL_COLOR_TABLE 0x80D0 #define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 #define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 @@ -133,14 +3408,172 @@ extern "C" { #define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD #define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE #define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glGetColorTable (GLenum target, GLenum format, GLenum type, void *table); +GLAPI void APIENTRY glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params); +GLAPI void APIENTRY glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glConvolutionParameteri (GLenum target, GLenum pname, GLint params); +GLAPI void APIENTRY glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, void *image); +GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSeparableFilter (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +GLAPI void APIENTRY glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +GLAPI void APIENTRY glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glMinmax (GLenum target, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glResetHistogram (GLenum target); +GLAPI void APIENTRY glResetMinmax (GLenum target); +#endif +#endif /* GL_ARB_imaging */ + +#ifndef GL_ARB_indirect_parameters +#define GL_ARB_indirect_parameters 1 +#define GL_PARAMETER_BUFFER_ARB 0x80EE +#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectCountARB (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirectCountARB (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#endif +#endif /* GL_ARB_indirect_parameters */ + +#ifndef GL_ARB_instanced_arrays +#define GL_ARB_instanced_arrays 1 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribDivisorARB (GLuint index, GLuint divisor); +#endif +#endif /* GL_ARB_instanced_arrays */ + +#ifndef GL_ARB_internalformat_query +#define GL_ARB_internalformat_query 1 +#endif /* GL_ARB_internalformat_query */ + +#ifndef GL_ARB_internalformat_query2 +#define GL_ARB_internalformat_query2 1 +#define GL_SRGB_DECODE_ARB 0x8299 +#endif /* GL_ARB_internalformat_query2 */ + +#ifndef GL_ARB_invalidate_subdata +#define GL_ARB_invalidate_subdata 1 +#endif /* GL_ARB_invalidate_subdata */ + +#ifndef GL_ARB_map_buffer_alignment +#define GL_ARB_map_buffer_alignment 1 +#endif /* GL_ARB_map_buffer_alignment */ + +#ifndef GL_ARB_map_buffer_range +#define GL_ARB_map_buffer_range 1 +#endif /* GL_ARB_map_buffer_range */ + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 +typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint index); +GLAPI void APIENTRY glMatrixIndexubvARB (GLint size, const GLubyte *indices); +GLAPI void APIENTRY glMatrixIndexusvARB (GLint size, const GLushort *indices); +GLAPI void APIENTRY glMatrixIndexuivARB (GLint size, const GLuint *indices); +GLAPI void APIENTRY glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_ARB_matrix_palette */ + +#ifndef GL_ARB_multi_bind +#define GL_ARB_multi_bind 1 +#endif /* GL_ARB_multi_bind */ + +#ifndef GL_ARB_multi_draw_indirect +#define GL_ARB_multi_draw_indirect 1 +#endif /* GL_ARB_multi_draw_indirect */ + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLfloat value, GLboolean invert); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleCoverageARB (GLfloat value, GLboolean invert); #endif +#endif /* GL_ARB_multisample */ #ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 #define GL_TEXTURE0_ARB 0x84C0 #define GL_TEXTURE1_ARB 0x84C1 #define GL_TEXTURE2_ARB 0x84C2 @@ -176,28 +3609,588 @@ extern "C" { #define GL_ACTIVE_TEXTURE_ARB 0x84E0 #define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 #define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTextureARB (GLenum texture); +GLAPI void APIENTRY glClientActiveTextureARB (GLenum texture); +GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum target, GLdouble s); +GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum target, GLfloat s); +GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum target, GLint s); +GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum target, GLshort s); +GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t); +GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t); +GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum target, GLint s, GLint t); +GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t); +GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r); +GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum target, const GLshort *v); +#endif +#endif /* GL_ARB_multitexture */ + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 +typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueriesARB (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteQueriesARB (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsQueryARB (GLuint id); +GLAPI void APIENTRY glBeginQueryARB (GLenum target, GLuint id); +GLAPI void APIENTRY glEndQueryARB (GLenum target); +GLAPI void APIENTRY glGetQueryivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectivARB (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint *params); +#endif +#endif /* GL_ARB_occlusion_query */ + +#ifndef GL_ARB_occlusion_query2 +#define GL_ARB_occlusion_query2 1 +#endif /* GL_ARB_occlusion_query2 */ + +#ifndef GL_ARB_pipeline_statistics_query +#define GL_ARB_pipeline_statistics_query 1 +#define GL_VERTICES_SUBMITTED_ARB 0x82EE +#define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF +#define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 +#define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 +#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 +#define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 +#define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 +#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 +#endif /* GL_ARB_pipeline_statistics_query */ + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF +#endif /* GL_ARB_pixel_buffer_object */ + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfARB (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvARB (GLenum pname, const GLfloat *params); +#endif +#endif /* GL_ARB_point_parameters */ + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 +#endif /* GL_ARB_point_sprite */ + +#ifndef GL_ARB_program_interface_query +#define GL_ARB_program_interface_query 1 +#endif /* GL_ARB_program_interface_query */ + +#ifndef GL_ARB_provoking_vertex +#define GL_ARB_provoking_vertex 1 +#endif /* GL_ARB_provoking_vertex */ + +#ifndef GL_ARB_query_buffer_object +#define GL_ARB_query_buffer_object 1 +#endif /* GL_ARB_query_buffer_object */ + +#ifndef GL_ARB_robust_buffer_access_behavior +#define GL_ARB_robust_buffer_access_behavior 1 +#endif /* GL_ARB_robust_buffer_access_behavior */ + +#ifndef GL_ARB_robustness +#define GL_ARB_robustness 1 +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 +typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); +typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); +typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void *img); +typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +typedef void (APIENTRYP PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +typedef void (APIENTRYP PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +typedef void (APIENTRYP PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort *values); +typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte *pattern); +typedef void (APIENTRYP PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +typedef void (APIENTRYP PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void); +GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); +GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, void *img); +GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params); +GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +GLAPI void APIENTRY glGetnMapdvARB (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +GLAPI void APIENTRY glGetnMapfvARB (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +GLAPI void APIENTRY glGetnMapivARB (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +GLAPI void APIENTRY glGetnPixelMapfvARB (GLenum map, GLsizei bufSize, GLfloat *values); +GLAPI void APIENTRY glGetnPixelMapuivARB (GLenum map, GLsizei bufSize, GLuint *values); +GLAPI void APIENTRY glGetnPixelMapusvARB (GLenum map, GLsizei bufSize, GLushort *values); +GLAPI void APIENTRY glGetnPolygonStippleARB (GLsizei bufSize, GLubyte *pattern); +GLAPI void APIENTRY glGetnColorTableARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +GLAPI void APIENTRY glGetnConvolutionFilterARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +GLAPI void APIENTRY glGetnSeparableFilterARB (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +GLAPI void APIENTRY glGetnHistogramARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +GLAPI void APIENTRY glGetnMinmaxARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +#endif +#endif /* GL_ARB_robustness */ + +#ifndef GL_ARB_robustness_isolation +#define GL_ARB_robustness_isolation 1 +#endif /* GL_ARB_robustness_isolation */ + +#ifndef GL_ARB_sample_shading +#define GL_ARB_sample_shading 1 +#define GL_SAMPLE_SHADING_ARB 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 +typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLfloat value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMinSampleShadingARB (GLfloat value); +#endif +#endif /* GL_ARB_sample_shading */ + +#ifndef GL_ARB_sampler_objects +#define GL_ARB_sampler_objects 1 +#endif /* GL_ARB_sampler_objects */ + +#ifndef GL_ARB_seamless_cube_map +#define GL_ARB_seamless_cube_map 1 +#endif /* GL_ARB_seamless_cube_map */ + +#ifndef GL_ARB_seamless_cubemap_per_texture +#define GL_ARB_seamless_cubemap_per_texture 1 +#endif /* GL_ARB_seamless_cubemap_per_texture */ + +#ifndef GL_ARB_separate_shader_objects +#define GL_ARB_separate_shader_objects 1 +#endif /* GL_ARB_separate_shader_objects */ + +#ifndef GL_ARB_shader_atomic_counters +#define GL_ARB_shader_atomic_counters 1 +#endif /* GL_ARB_shader_atomic_counters */ + +#ifndef GL_ARB_shader_bit_encoding +#define GL_ARB_shader_bit_encoding 1 +#endif /* GL_ARB_shader_bit_encoding */ + +#ifndef GL_ARB_shader_draw_parameters +#define GL_ARB_shader_draw_parameters 1 +#endif /* GL_ARB_shader_draw_parameters */ + +#ifndef GL_ARB_shader_group_vote +#define GL_ARB_shader_group_vote 1 +#endif /* GL_ARB_shader_group_vote */ + +#ifndef GL_ARB_shader_image_load_store +#define GL_ARB_shader_image_load_store 1 +#endif /* GL_ARB_shader_image_load_store */ + +#ifndef GL_ARB_shader_image_size +#define GL_ARB_shader_image_size 1 +#endif /* GL_ARB_shader_image_size */ + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 +#ifdef __APPLE__ +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif +typedef char GLcharARB; +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); +typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB obj); +GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum pname); +GLAPI void APIENTRY glDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj); +GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum shaderType); +GLAPI void APIENTRY glShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); +GLAPI void APIENTRY glCompileShaderARB (GLhandleARB shaderObj); +GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); +GLAPI void APIENTRY glAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj); +GLAPI void APIENTRY glLinkProgramARB (GLhandleARB programObj); +GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB programObj); +GLAPI void APIENTRY glValidateProgramARB (GLhandleARB programObj); +GLAPI void APIENTRY glUniform1fARB (GLint location, GLfloat v0); +GLAPI void APIENTRY glUniform2fARB (GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glUniform1iARB (GLint location, GLint v0); +GLAPI void APIENTRY glUniform2iARB (GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glUniform1fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform2fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform3fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform4fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform1ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform2ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform3ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform4ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name); +GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params); +GLAPI void APIENTRY glGetUniformivARB (GLhandleARB programObj, GLint location, GLint *params); +GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#endif +#endif /* GL_ARB_shader_objects */ + +#ifndef GL_ARB_shader_precision +#define GL_ARB_shader_precision 1 +#endif /* GL_ARB_shader_precision */ + +#ifndef GL_ARB_shader_stencil_export +#define GL_ARB_shader_stencil_export 1 +#endif /* GL_ARB_shader_stencil_export */ + +#ifndef GL_ARB_shader_storage_buffer_object +#define GL_ARB_shader_storage_buffer_object 1 +#endif /* GL_ARB_shader_storage_buffer_object */ + +#ifndef GL_ARB_shader_subroutine +#define GL_ARB_shader_subroutine 1 +#endif /* GL_ARB_shader_subroutine */ + +#ifndef GL_ARB_shader_texture_image_samples +#define GL_ARB_shader_texture_image_samples 1 +#endif /* GL_ARB_shader_texture_image_samples */ + +#ifndef GL_ARB_shader_texture_lod +#define GL_ARB_shader_texture_lod 1 +#endif /* GL_ARB_shader_texture_lod */ + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C +#endif /* GL_ARB_shading_language_100 */ + +#ifndef GL_ARB_shading_language_420pack +#define GL_ARB_shading_language_420pack 1 +#endif /* GL_ARB_shading_language_420pack */ + +#ifndef GL_ARB_shading_language_include +#define GL_ARB_shading_language_include 1 +#define GL_SHADER_INCLUDE_ARB 0x8DAE +#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 +#define GL_NAMED_STRING_TYPE_ARB 0x8DEA +typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); +typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); +typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); +typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); +GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name); +GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); +GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name); +GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); +GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params); +#endif +#endif /* GL_ARB_shading_language_include */ + +#ifndef GL_ARB_shading_language_packing +#define GL_ARB_shading_language_packing 1 +#endif /* GL_ARB_shading_language_packing */ + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E +#endif /* GL_ARB_shadow */ + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF +#endif /* GL_ARB_shadow_ambient */ + +#ifndef GL_ARB_sparse_buffer +#define GL_ARB_sparse_buffer 1 +#define GL_SPARSE_STORAGE_BIT_ARB 0x0400 +#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 +typedef void (APIENTRYP PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); +typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTARBPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferPageCommitmentARB (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); +GLAPI void APIENTRY glNamedBufferPageCommitmentEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +GLAPI void APIENTRY glNamedBufferPageCommitmentARB (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +#endif +#endif /* GL_ARB_sparse_buffer */ + +#ifndef GL_ARB_sparse_texture +#define GL_ARB_sparse_texture 1 +#define GL_TEXTURE_SPARSE_ARB 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 +#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA +#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 +#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 +typedef void (APIENTRYP PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexPageCommitmentARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +#endif +#endif /* GL_ARB_sparse_texture */ + +#ifndef GL_ARB_stencil_texturing +#define GL_ARB_stencil_texturing 1 +#endif /* GL_ARB_stencil_texturing */ + +#ifndef GL_ARB_sync +#define GL_ARB_sync 1 +#endif /* GL_ARB_sync */ + +#ifndef GL_ARB_tessellation_shader +#define GL_ARB_tessellation_shader 1 +#endif /* GL_ARB_tessellation_shader */ + +#ifndef GL_ARB_texture_barrier +#define GL_ARB_texture_barrier 1 +#endif /* GL_ARB_texture_barrier */ + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 +#define GL_CLAMP_TO_BORDER_ARB 0x812D +#endif /* GL_ARB_texture_border_clamp */ + +#ifndef GL_ARB_texture_buffer_object +#define GL_ARB_texture_buffer_object 1 +#define GL_TEXTURE_BUFFER_ARB 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E +typedef void (APIENTRYP PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer); #endif +#endif /* GL_ARB_texture_buffer_object */ -#ifndef GL_ARB_transpose_matrix -#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 -#endif +#ifndef GL_ARB_texture_buffer_object_rgb32 +#define GL_ARB_texture_buffer_object_rgb32 1 +#endif /* GL_ARB_texture_buffer_object_rgb32 */ -#ifndef GL_ARB_multisample -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 -#endif +#ifndef GL_ARB_texture_buffer_range +#define GL_ARB_texture_buffer_range 1 +#endif /* GL_ARB_texture_buffer_range */ + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *img); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum target, GLint level, void *img); +#endif +#endif /* GL_ARB_texture_compression */ + +#ifndef GL_ARB_texture_compression_bptc +#define GL_ARB_texture_compression_bptc 1 +#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F +#endif /* GL_ARB_texture_compression_bptc */ + +#ifndef GL_ARB_texture_compression_rgtc +#define GL_ARB_texture_compression_rgtc 1 +#endif /* GL_ARB_texture_compression_rgtc */ #ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 #define GL_NORMAL_MAP_ARB 0x8511 #define GL_REFLECTION_MAP_ARB 0x8512 #define GL_TEXTURE_CUBE_MAP_ARB 0x8513 @@ -210,136 +4203,2078 @@ extern "C" { #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C -#endif +#endif /* GL_ARB_texture_cube_map */ + +#ifndef GL_ARB_texture_cube_map_array +#define GL_ARB_texture_cube_map_array 1 +#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F +#endif /* GL_ARB_texture_cube_map_array */ -#ifndef GL_ARB_texture_compression -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 +#endif /* GL_ARB_texture_env_add */ + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#endif /* GL_ARB_texture_env_combine */ + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 +#endif /* GL_ARB_texture_env_crossbar */ + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF +#endif /* GL_ARB_texture_env_dot3 */ + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#endif /* GL_ARB_texture_float */ + +#ifndef GL_ARB_texture_gather +#define GL_ARB_texture_gather 1 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F +#endif /* GL_ARB_texture_gather */ + +#ifndef GL_ARB_texture_mirror_clamp_to_edge +#define GL_ARB_texture_mirror_clamp_to_edge 1 +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#endif /* GL_ARB_texture_mirrored_repeat */ + +#ifndef GL_ARB_texture_multisample +#define GL_ARB_texture_multisample 1 +#endif /* GL_ARB_texture_multisample */ + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 +#endif /* GL_ARB_texture_non_power_of_two */ + +#ifndef GL_ARB_texture_query_levels +#define GL_ARB_texture_query_levels 1 +#endif /* GL_ARB_texture_query_levels */ + +#ifndef GL_ARB_texture_query_lod +#define GL_ARB_texture_query_lod 1 +#endif /* GL_ARB_texture_query_lod */ + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#endif /* GL_ARB_texture_rectangle */ + +#ifndef GL_ARB_texture_rg +#define GL_ARB_texture_rg 1 +#endif /* GL_ARB_texture_rg */ + +#ifndef GL_ARB_texture_rgb10_a2ui +#define GL_ARB_texture_rgb10_a2ui 1 +#endif /* GL_ARB_texture_rgb10_a2ui */ + +#ifndef GL_ARB_texture_stencil8 +#define GL_ARB_texture_stencil8 1 +#endif /* GL_ARB_texture_stencil8 */ + +#ifndef GL_ARB_texture_storage +#define GL_ARB_texture_storage 1 +#endif /* GL_ARB_texture_storage */ + +#ifndef GL_ARB_texture_storage_multisample +#define GL_ARB_texture_storage_multisample 1 +#endif /* GL_ARB_texture_storage_multisample */ + +#ifndef GL_ARB_texture_swizzle +#define GL_ARB_texture_swizzle 1 +#endif /* GL_ARB_texture_swizzle */ + +#ifndef GL_ARB_texture_view +#define GL_ARB_texture_view 1 +#endif /* GL_ARB_texture_view */ + +#ifndef GL_ARB_timer_query +#define GL_ARB_timer_query 1 +#endif /* GL_ARB_timer_query */ + +#ifndef GL_ARB_transform_feedback2 +#define GL_ARB_transform_feedback2 1 +#endif /* GL_ARB_transform_feedback2 */ + +#ifndef GL_ARB_transform_feedback3 +#define GL_ARB_transform_feedback3 1 +#endif /* GL_ARB_transform_feedback3 */ + +#ifndef GL_ARB_transform_feedback_instanced +#define GL_ARB_transform_feedback_instanced 1 +#endif /* GL_ARB_transform_feedback_instanced */ + +#ifndef GL_ARB_transform_feedback_overflow_query +#define GL_ARB_transform_feedback_overflow_query 1 +#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED +#endif /* GL_ARB_transform_feedback_overflow_query */ + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *m); +GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *m); +GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *m); +GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *m); +#endif +#endif /* GL_ARB_transpose_matrix */ + +#ifndef GL_ARB_uniform_buffer_object +#define GL_ARB_uniform_buffer_object 1 +#endif /* GL_ARB_uniform_buffer_object */ + +#ifndef GL_ARB_vertex_array_bgra +#define GL_ARB_vertex_array_bgra 1 +#endif /* GL_ARB_vertex_array_bgra */ + +#ifndef GL_ARB_vertex_array_object +#define GL_ARB_vertex_array_object 1 +#endif /* GL_ARB_vertex_array_object */ + +#ifndef GL_ARB_vertex_attrib_64bit +#define GL_ARB_vertex_attrib_64bit 1 +#endif /* GL_ARB_vertex_attrib_64bit */ + +#ifndef GL_ARB_vertex_attrib_binding +#define GL_ARB_vertex_attrib_binding 1 +#endif /* GL_ARB_vertex_attrib_binding */ + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F +typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); +typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); +typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); +typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); +typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); +typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); +typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWeightbvARB (GLint size, const GLbyte *weights); +GLAPI void APIENTRY glWeightsvARB (GLint size, const GLshort *weights); +GLAPI void APIENTRY glWeightivARB (GLint size, const GLint *weights); +GLAPI void APIENTRY glWeightfvARB (GLint size, const GLfloat *weights); +GLAPI void APIENTRY glWeightdvARB (GLint size, const GLdouble *weights); +GLAPI void APIENTRY glWeightubvARB (GLint size, const GLubyte *weights); +GLAPI void APIENTRY glWeightusvARB (GLint size, const GLushort *weights); +GLAPI void APIENTRY glWeightuivARB (GLint size, const GLuint *weights); +GLAPI void APIENTRY glWeightPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glVertexBlendARB (GLint count); +#endif +#endif /* GL_ARB_vertex_blend */ + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 +// Unfortunate problem with the OS X SDK which defines these types incorrectly +#if !defined(MACOS_X) +typedef ptrdiff_t GLsizeiptrARB; +typedef ptrdiff_t GLintptrARB; +#endif +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA +typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); +typedef void *(APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindBufferARB (GLenum target, GLuint buffer); +GLAPI void APIENTRY glDeleteBuffersARB (GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glGenBuffersARB (GLsizei n, GLuint *buffers); +GLAPI GLboolean APIENTRY glIsBufferARB (GLuint buffer); +GLAPI void APIENTRY glBufferDataARB (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); +GLAPI void APIENTRY glBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); +GLAPI void APIENTRY glGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); +GLAPI void *APIENTRY glMapBufferARB (GLenum target, GLenum access); +GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum target); +GLAPI void APIENTRY glGetBufferParameterivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetBufferPointervARB (GLenum target, GLenum pname, void **params); +#endif +#endif /* GL_ARB_vertex_buffer_object */ + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void **pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttrib1dARB (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1fARB (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1sARB (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2sARB (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint index); +GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint index); +GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint index, GLenum pname, void **pointer); +#endif +#endif /* GL_ARB_vertex_program */ + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name); +GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name); +#endif +#endif /* GL_ARB_vertex_shader */ + +#ifndef GL_ARB_vertex_type_10f_11f_11f_rev +#define GL_ARB_vertex_type_10f_11f_11f_rev 1 +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ + +#ifndef GL_ARB_vertex_type_2_10_10_10_rev +#define GL_ARB_vertex_type_2_10_10_10_rev 1 +#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ + +#ifndef GL_ARB_viewport_array +#define GL_ARB_viewport_array 1 +#endif /* GL_ARB_viewport_array */ + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 +typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dARB (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2fARB (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2iARB (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2ivARB (const GLint *v); +GLAPI void APIENTRY glWindowPos2sARB (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2svARB (const GLshort *v); +GLAPI void APIENTRY glWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3iARB (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3ivARB (const GLint *v); +GLAPI void APIENTRY glWindowPos3sARB (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3svARB (const GLshort *v); +#endif +#endif /* GL_ARB_window_pos */ + +#ifndef GL_KHR_blend_equation_advanced +#define GL_KHR_blend_equation_advanced 1 +#define GL_MULTIPLY_KHR 0x9294 +#define GL_SCREEN_KHR 0x9295 +#define GL_OVERLAY_KHR 0x9296 +#define GL_DARKEN_KHR 0x9297 +#define GL_LIGHTEN_KHR 0x9298 +#define GL_COLORDODGE_KHR 0x9299 +#define GL_COLORBURN_KHR 0x929A +#define GL_HARDLIGHT_KHR 0x929B +#define GL_SOFTLIGHT_KHR 0x929C +#define GL_DIFFERENCE_KHR 0x929E +#define GL_EXCLUSION_KHR 0x92A0 +#define GL_HSL_HUE_KHR 0x92AD +#define GL_HSL_SATURATION_KHR 0x92AE +#define GL_HSL_COLOR_KHR 0x92AF +#define GL_HSL_LUMINOSITY_KHR 0x92B0 +typedef void (APIENTRYP PFNGLBLENDBARRIERKHRPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendBarrierKHR (void); +#endif +#endif /* GL_KHR_blend_equation_advanced */ + +#ifndef GL_KHR_blend_equation_advanced_coherent +#define GL_KHR_blend_equation_advanced_coherent 1 +#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 +#endif /* GL_KHR_blend_equation_advanced_coherent */ + +#ifndef GL_KHR_context_flush_control +#define GL_KHR_context_flush_control 1 +#endif /* GL_KHR_context_flush_control */ + +#ifndef GL_KHR_debug +#define GL_KHR_debug 1 +#endif /* GL_KHR_debug */ + +#ifndef GL_KHR_robust_buffer_access_behavior +#define GL_KHR_robust_buffer_access_behavior 1 +#endif /* GL_KHR_robust_buffer_access_behavior */ + +#ifndef GL_KHR_robustness +#define GL_KHR_robustness 1 +#define GL_CONTEXT_ROBUST_ACCESS 0x90F3 +#endif /* GL_KHR_robustness */ + +#ifndef GL_KHR_texture_compression_astc_hdr +#define GL_KHR_texture_compression_astc_hdr 1 +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD +#endif /* GL_KHR_texture_compression_astc_hdr */ + +#ifndef GL_KHR_texture_compression_astc_ldr +#define GL_KHR_texture_compression_astc_ldr 1 +#endif /* GL_KHR_texture_compression_astc_ldr */ + +#ifndef GL_OES_byte_coordinates +#define GL_OES_byte_coordinates 1 +typedef void (APIENTRYP PFNGLMULTITEXCOORD1BOESPROC) (GLenum texture, GLbyte s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2BOESPROC) (GLenum texture, GLbyte s, GLbyte t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD1BOESPROC) (GLbyte s); +typedef void (APIENTRYP PFNGLTEXCOORD1BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD2BOESPROC) (GLbyte s, GLbyte t); +typedef void (APIENTRYP PFNGLTEXCOORD2BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD3BOESPROC) (GLbyte s, GLbyte t, GLbyte r); +typedef void (APIENTRYP PFNGLTEXCOORD3BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD4BOESPROC) (GLbyte s, GLbyte t, GLbyte r, GLbyte q); +typedef void (APIENTRYP PFNGLTEXCOORD4BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX2BOESPROC) (GLbyte x, GLbyte y); +typedef void (APIENTRYP PFNGLVERTEX2BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX3BOESPROC) (GLbyte x, GLbyte y, GLbyte z); +typedef void (APIENTRYP PFNGLVERTEX3BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX4BOESPROC) (GLbyte x, GLbyte y, GLbyte z, GLbyte w); +typedef void (APIENTRYP PFNGLVERTEX4BVOESPROC) (const GLbyte *coords); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiTexCoord1bOES (GLenum texture, GLbyte s); +GLAPI void APIENTRY glMultiTexCoord1bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord2bOES (GLenum texture, GLbyte s, GLbyte t); +GLAPI void APIENTRY glMultiTexCoord2bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord3bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r); +GLAPI void APIENTRY glMultiTexCoord3bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord4bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); +GLAPI void APIENTRY glMultiTexCoord4bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glTexCoord1bOES (GLbyte s); +GLAPI void APIENTRY glTexCoord1bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord2bOES (GLbyte s, GLbyte t); +GLAPI void APIENTRY glTexCoord2bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord3bOES (GLbyte s, GLbyte t, GLbyte r); +GLAPI void APIENTRY glTexCoord3bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord4bOES (GLbyte s, GLbyte t, GLbyte r, GLbyte q); +GLAPI void APIENTRY glTexCoord4bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex2bOES (GLbyte x, GLbyte y); +GLAPI void APIENTRY glVertex2bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex3bOES (GLbyte x, GLbyte y, GLbyte z); +GLAPI void APIENTRY glVertex3bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex4bOES (GLbyte x, GLbyte y, GLbyte z, GLbyte w); +GLAPI void APIENTRY glVertex4bvOES (const GLbyte *coords); +#endif +#endif /* GL_OES_byte_coordinates */ + +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 +#endif /* GL_OES_compressed_paletted_texture */ + +#ifndef GL_OES_fixed_point +#define GL_OES_fixed_point 1 +typedef GLint GLfixed; +#define GL_FIXED_OES 0x140C +typedef void (APIENTRYP PFNGLALPHAFUNCXOESPROC) (GLenum func, GLfixed ref); +typedef void (APIENTRYP PFNGLCLEARCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCLEARDEPTHXOESPROC) (GLfixed depth); +typedef void (APIENTRYP PFNGLCLIPPLANEXOESPROC) (GLenum plane, const GLfixed *equation); +typedef void (APIENTRYP PFNGLCOLOR4XOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLDEPTHRANGEXOESPROC) (GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLFOGXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLFOGXVOESPROC) (GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLFRUSTUMXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLGETCLIPPLANEXOESPROC) (GLenum plane, GLfixed *equation); +typedef void (APIENTRYP PFNGLGETFIXEDVOESPROC) (GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXENVXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLLIGHTMODELXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLLIGHTMODELXVOESPROC) (GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLLIGHTXVOESPROC) (GLenum light, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLLINEWIDTHXOESPROC) (GLfixed width); +typedef void (APIENTRYP PFNGLLOADMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLMATERIALXVOESPROC) (GLenum face, GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLMULTMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (APIENTRYP PFNGLNORMAL3XOESPROC) (GLfixed nx, GLfixed ny, GLfixed nz); +typedef void (APIENTRYP PFNGLORTHOXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLPOINTPARAMETERXVOESPROC) (GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLPOINTSIZEXOESPROC) (GLfixed size); +typedef void (APIENTRYP PFNGLPOLYGONOFFSETXOESPROC) (GLfixed factor, GLfixed units); +typedef void (APIENTRYP PFNGLROTATEXOESPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEOESPROC) (GLfixed value, GLboolean invert); +typedef void (APIENTRYP PFNGLSCALEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLTEXENVXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXENVXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLTRANSLATEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLACCUMXOESPROC) (GLenum op, GLfixed value); +typedef void (APIENTRYP PFNGLBITMAPXOESPROC) (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); +typedef void (APIENTRYP PFNGLBLENDCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCLEARACCUMXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCOLOR3XOESPROC) (GLfixed red, GLfixed green, GLfixed blue); +typedef void (APIENTRYP PFNGLCOLOR3XVOESPROC) (const GLfixed *components); +typedef void (APIENTRYP PFNGLCOLOR4XVOESPROC) (const GLfixed *components); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLEVALCOORD1XOESPROC) (GLfixed u); +typedef void (APIENTRYP PFNGLEVALCOORD1XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLEVALCOORD2XOESPROC) (GLfixed u, GLfixed v); +typedef void (APIENTRYP PFNGLEVALCOORD2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLFEEDBACKBUFFERXOESPROC) (GLsizei n, GLenum type, const GLfixed *buffer); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETMAPXVOESPROC) (GLenum target, GLenum query, GLfixed *v); +typedef void (APIENTRYP PFNGLGETMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLGETPIXELMAPXVPROC) (GLenum map, GLint size, GLfixed *values); +typedef void (APIENTRYP PFNGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERXVOESPROC) (GLenum target, GLint level, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLINDEXXOESPROC) (GLfixed component); +typedef void (APIENTRYP PFNGLINDEXXVOESPROC) (const GLfixed *component); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMAP1XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); +typedef void (APIENTRYP PFNGLMAP2XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); +typedef void (APIENTRYP PFNGLMAPGRID1XOESPROC) (GLint n, GLfixed u1, GLfixed u2); +typedef void (APIENTRYP PFNGLMAPGRID2XOESPROC) (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1XOESPROC) (GLenum texture, GLfixed s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2XOESPROC) (GLenum texture, GLfixed s, GLfixed t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLNORMAL3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLPASSTHROUGHXOESPROC) (GLfixed token); +typedef void (APIENTRYP PFNGLPIXELMAPXPROC) (GLenum map, GLint size, const GLfixed *values); +typedef void (APIENTRYP PFNGLPIXELSTOREXPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLPIXELTRANSFERXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLPIXELZOOMXOESPROC) (GLfixed xfactor, GLfixed yfactor); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESXOESPROC) (GLsizei n, const GLuint *textures, const GLfixed *priorities); +typedef void (APIENTRYP PFNGLRASTERPOS2XOESPROC) (GLfixed x, GLfixed y); +typedef void (APIENTRYP PFNGLRASTERPOS2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRASTERPOS3XOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLRASTERPOS3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRASTERPOS4XOESPROC) (GLfixed x, GLfixed y, GLfixed z, GLfixed w); +typedef void (APIENTRYP PFNGLRASTERPOS4XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRECTXOESPROC) (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); +typedef void (APIENTRYP PFNGLRECTXVOESPROC) (const GLfixed *v1, const GLfixed *v2); +typedef void (APIENTRYP PFNGLTEXCOORD1XOESPROC) (GLfixed s); +typedef void (APIENTRYP PFNGLTEXCOORD1XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD2XOESPROC) (GLfixed s, GLfixed t); +typedef void (APIENTRYP PFNGLTEXCOORD2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD3XOESPROC) (GLfixed s, GLfixed t, GLfixed r); +typedef void (APIENTRYP PFNGLTEXCOORD3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD4XOESPROC) (GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (APIENTRYP PFNGLTEXCOORD4XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLVERTEX2XOESPROC) (GLfixed x); +typedef void (APIENTRYP PFNGLVERTEX2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLVERTEX3XOESPROC) (GLfixed x, GLfixed y); +typedef void (APIENTRYP PFNGLVERTEX3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLVERTEX4XOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLVERTEX4XVOESPROC) (const GLfixed *coords); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAlphaFuncxOES (GLenum func, GLfixed ref); +GLAPI void APIENTRY glClearColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glClearDepthxOES (GLfixed depth); +GLAPI void APIENTRY glClipPlanexOES (GLenum plane, const GLfixed *equation); +GLAPI void APIENTRY glColor4xOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glDepthRangexOES (GLfixed n, GLfixed f); +GLAPI void APIENTRY glFogxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glFogxvOES (GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glFrustumxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +GLAPI void APIENTRY glGetClipPlanexOES (GLenum plane, GLfixed *equation); +GLAPI void APIENTRY glGetFixedvOES (GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexEnvxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glLightModelxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glLightModelxvOES (GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glLightxOES (GLenum light, GLenum pname, GLfixed param); +GLAPI void APIENTRY glLightxvOES (GLenum light, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glLineWidthxOES (GLfixed width); +GLAPI void APIENTRY glLoadMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMaterialxOES (GLenum face, GLenum pname, GLfixed param); +GLAPI void APIENTRY glMaterialxvOES (GLenum face, GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glMultMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMultiTexCoord4xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +GLAPI void APIENTRY glNormal3xOES (GLfixed nx, GLfixed ny, GLfixed nz); +GLAPI void APIENTRY glOrthoxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +GLAPI void APIENTRY glPointParameterxvOES (GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glPointSizexOES (GLfixed size); +GLAPI void APIENTRY glPolygonOffsetxOES (GLfixed factor, GLfixed units); +GLAPI void APIENTRY glRotatexOES (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glSampleCoverageOES (GLfixed value, GLboolean invert); +GLAPI void APIENTRY glScalexOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glTexEnvxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexEnvxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glTexParameterxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glTranslatexOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glAccumxOES (GLenum op, GLfixed value); +GLAPI void APIENTRY glBitmapxOES (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); +GLAPI void APIENTRY glBlendColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glClearAccumxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glColor3xOES (GLfixed red, GLfixed green, GLfixed blue); +GLAPI void APIENTRY glColor3xvOES (const GLfixed *components); +GLAPI void APIENTRY glColor4xvOES (const GLfixed *components); +GLAPI void APIENTRY glConvolutionParameterxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glConvolutionParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glEvalCoord1xOES (GLfixed u); +GLAPI void APIENTRY glEvalCoord1xvOES (const GLfixed *coords); +GLAPI void APIENTRY glEvalCoord2xOES (GLfixed u, GLfixed v); +GLAPI void APIENTRY glEvalCoord2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glFeedbackBufferxOES (GLsizei n, GLenum type, const GLfixed *buffer); +GLAPI void APIENTRY glGetConvolutionParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetHistogramParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetLightxOES (GLenum light, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetMapxvOES (GLenum target, GLenum query, GLfixed *v); +GLAPI void APIENTRY glGetMaterialxOES (GLenum face, GLenum pname, GLfixed param); +GLAPI void APIENTRY glGetPixelMapxv (GLenum map, GLint size, GLfixed *values); +GLAPI void APIENTRY glGetTexGenxvOES (GLenum coord, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexLevelParameterxvOES (GLenum target, GLint level, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glIndexxOES (GLfixed component); +GLAPI void APIENTRY glIndexxvOES (const GLfixed *component); +GLAPI void APIENTRY glLoadTransposeMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMap1xOES (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); +GLAPI void APIENTRY glMap2xOES (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); +GLAPI void APIENTRY glMapGrid1xOES (GLint n, GLfixed u1, GLfixed u2); +GLAPI void APIENTRY glMapGrid2xOES (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); +GLAPI void APIENTRY glMultTransposeMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMultiTexCoord1xOES (GLenum texture, GLfixed s); +GLAPI void APIENTRY glMultiTexCoord1xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord2xOES (GLenum texture, GLfixed s, GLfixed t); +GLAPI void APIENTRY glMultiTexCoord2xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord3xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r); +GLAPI void APIENTRY glMultiTexCoord3xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord4xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glNormal3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glPassThroughxOES (GLfixed token); +GLAPI void APIENTRY glPixelMapx (GLenum map, GLint size, const GLfixed *values); +GLAPI void APIENTRY glPixelStorex (GLenum pname, GLfixed param); +GLAPI void APIENTRY glPixelTransferxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glPixelZoomxOES (GLfixed xfactor, GLfixed yfactor); +GLAPI void APIENTRY glPrioritizeTexturesxOES (GLsizei n, const GLuint *textures, const GLfixed *priorities); +GLAPI void APIENTRY glRasterPos2xOES (GLfixed x, GLfixed y); +GLAPI void APIENTRY glRasterPos2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRasterPos3xOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glRasterPos3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRasterPos4xOES (GLfixed x, GLfixed y, GLfixed z, GLfixed w); +GLAPI void APIENTRY glRasterPos4xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRectxOES (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); +GLAPI void APIENTRY glRectxvOES (const GLfixed *v1, const GLfixed *v2); +GLAPI void APIENTRY glTexCoord1xOES (GLfixed s); +GLAPI void APIENTRY glTexCoord1xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord2xOES (GLfixed s, GLfixed t); +GLAPI void APIENTRY glTexCoord2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord3xOES (GLfixed s, GLfixed t, GLfixed r); +GLAPI void APIENTRY glTexCoord3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord4xOES (GLfixed s, GLfixed t, GLfixed r, GLfixed q); +GLAPI void APIENTRY glTexCoord4xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexGenxOES (GLenum coord, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexGenxvOES (GLenum coord, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glVertex2xOES (GLfixed x); +GLAPI void APIENTRY glVertex2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glVertex3xOES (GLfixed x, GLfixed y); +GLAPI void APIENTRY glVertex3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glVertex4xOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glVertex4xvOES (const GLfixed *coords); +#endif +#endif /* GL_OES_fixed_point */ + +#ifndef GL_OES_query_matrix +#define GL_OES_query_matrix 1 +typedef GLbitfield (APIENTRYP PFNGLQUERYMATRIXXOESPROC) (GLfixed *mantissa, GLint *exponent); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLbitfield APIENTRY glQueryMatrixxOES (GLfixed *mantissa, GLint *exponent); +#endif +#endif /* GL_OES_query_matrix */ + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B +#endif /* GL_OES_read_format */ + +#ifndef GL_OES_single_precision +#define GL_OES_single_precision 1 +typedef void (APIENTRYP PFNGLCLEARDEPTHFOESPROC) (GLclampf depth); +typedef void (APIENTRYP PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat *equation); +typedef void (APIENTRYP PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); +typedef void (APIENTRYP PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +typedef void (APIENTRYP PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat *equation); +typedef void (APIENTRYP PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClearDepthfOES (GLclampf depth); +GLAPI void APIENTRY glClipPlanefOES (GLenum plane, const GLfloat *equation); +GLAPI void APIENTRY glDepthRangefOES (GLclampf n, GLclampf f); +GLAPI void APIENTRY glFrustumfOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +GLAPI void APIENTRY glGetClipPlanefOES (GLenum plane, GLfloat *equation); +GLAPI void APIENTRY glOrthofOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); #endif +#endif /* GL_OES_single_precision */ -#ifndef GL_EXT_abgr -#define GL_ABGR_EXT 0x8000 +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 +#endif /* GL_3DFX_multisample */ + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 +typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTbufferMask3DFX (GLuint mask); #endif +#endif /* GL_3DFX_tbuffer */ -#ifndef GL_EXT_blend_color -#define GL_CONSTANT_COLOR_EXT 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 -#define GL_CONSTANT_ALPHA_EXT 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 -#define GL_BLEND_COLOR_EXT 0x8005 +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 +#endif /* GL_3DFX_texture_compression_FXT1 */ + +#ifndef GL_AMD_blend_minmax_factor +#define GL_AMD_blend_minmax_factor 1 +#define GL_FACTOR_MIN_AMD 0x901C +#define GL_FACTOR_MAX_AMD 0x901D +#endif /* GL_AMD_blend_minmax_factor */ + +#ifndef GL_AMD_conservative_depth +#define GL_AMD_conservative_depth 1 +#endif /* GL_AMD_conservative_depth */ + +#ifndef GL_AMD_debug_output +#define GL_AMD_debug_output 1 +typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); +#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 +#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 +#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 +#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A +#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B +#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C +#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D +#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E +#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F +#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 +typedef void (APIENTRYP PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDebugMessageEnableAMD (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsertAMD (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallbackAMD (GLDEBUGPROCAMD callback, void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLogAMD (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); +#endif +#endif /* GL_AMD_debug_output */ + +#ifndef GL_AMD_depth_clamp_separate +#define GL_AMD_depth_clamp_separate 1 +#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E +#define GL_DEPTH_CLAMP_FAR_AMD 0x901F +#endif /* GL_AMD_depth_clamp_separate */ + +#ifndef GL_AMD_draw_buffers_blend +#define GL_AMD_draw_buffers_blend 1 +typedef void (APIENTRYP PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncIndexedAMD (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparateIndexedAMD (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GLAPI void APIENTRY glBlendEquationIndexedAMD (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparateIndexedAMD (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +#endif +#endif /* GL_AMD_draw_buffers_blend */ + +#ifndef GL_AMD_gcn_shader +#define GL_AMD_gcn_shader 1 +#endif /* GL_AMD_gcn_shader */ + +#ifndef GL_AMD_gpu_shader_int64 +#define GL_AMD_gpu_shader_int64 1 +typedef int64_t GLint64EXT; +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F +#define GL_INT8_NV 0x8FE0 +#define GL_INT8_VEC2_NV 0x8FE1 +#define GL_INT8_VEC3_NV 0x8FE2 +#define GL_INT8_VEC4_NV 0x8FE3 +#define GL_INT16_NV 0x8FE4 +#define GL_INT16_VEC2_NV 0x8FE5 +#define GL_INT16_VEC3_NV 0x8FE6 +#define GL_INT16_VEC4_NV 0x8FE7 +#define GL_INT64_VEC2_NV 0x8FE9 +#define GL_INT64_VEC3_NV 0x8FEA +#define GL_INT64_VEC4_NV 0x8FEB +#define GL_UNSIGNED_INT8_NV 0x8FEC +#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED +#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE +#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF +#define GL_UNSIGNED_INT16_NV 0x8FF0 +#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 +#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 +#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 +#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB +typedef void (APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); +typedef void (APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); +typedef void (APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniform1i64NV (GLint location, GLint64EXT x); +GLAPI void APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x); +GLAPI void APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params); +GLAPI void APIENTRY glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT *params); +GLAPI void APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x); +GLAPI void APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x); +GLAPI void APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif +#endif /* GL_AMD_gpu_shader_int64 */ + +#ifndef GL_AMD_interleaved_elements +#define GL_AMD_interleaved_elements 1 +#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 +#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 +typedef void (APIENTRYP PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribParameteriAMD (GLuint index, GLenum pname, GLint param); #endif +#endif /* GL_AMD_interleaved_elements */ -#ifndef GL_EXT_polygon_offset -#define GL_POLYGON_OFFSET_EXT 0x8037 -#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 -#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +#ifndef GL_AMD_multi_draw_indirect +#define GL_AMD_multi_draw_indirect 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectAMD (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirectAMD (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); +#endif +#endif /* GL_AMD_multi_draw_indirect */ + +#ifndef GL_AMD_name_gen_delete +#define GL_AMD_name_gen_delete 1 +#define GL_DATA_BUFFER_AMD 0x9151 +#define GL_PERFORMANCE_MONITOR_AMD 0x9152 +#define GL_QUERY_OBJECT_AMD 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 +#define GL_SAMPLER_OBJECT_AMD 0x9155 +typedef void (APIENTRYP PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint *names); +typedef void (APIENTRYP PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint *names); +typedef GLboolean (APIENTRYP PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenNamesAMD (GLenum identifier, GLuint num, GLuint *names); +GLAPI void APIENTRY glDeleteNamesAMD (GLenum identifier, GLuint num, const GLuint *names); +GLAPI GLboolean APIENTRY glIsNameAMD (GLenum identifier, GLuint name); +#endif +#endif /* GL_AMD_name_gen_delete */ + +#ifndef GL_AMD_occlusion_query_event +#define GL_AMD_occlusion_query_event 1 +#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F +#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 +#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 +#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 +#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 +#define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF +typedef void (APIENTRYP PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glQueryObjectParameteruiAMD (GLenum target, GLuint id, GLenum pname, GLuint param); +#endif +#endif /* GL_AMD_occlusion_query_event */ + +#ifndef GL_AMD_performance_monitor +#define GL_AMD_performance_monitor 1 +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFMON_RESULT_AMD 0x8BC6 +typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); +typedef void (APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +typedef void (APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); +typedef void (APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +GLAPI void APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +GLAPI void APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +GLAPI void APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +GLAPI void APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data); +GLAPI void APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); +GLAPI void APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); +GLAPI void APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +GLAPI void APIENTRY glBeginPerfMonitorAMD (GLuint monitor); +GLAPI void APIENTRY glEndPerfMonitorAMD (GLuint monitor); +GLAPI void APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#endif +#endif /* GL_AMD_performance_monitor */ + +#ifndef GL_AMD_pinned_memory +#define GL_AMD_pinned_memory 1 +#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 +#endif /* GL_AMD_pinned_memory */ + +#ifndef GL_AMD_query_buffer_object +#define GL_AMD_query_buffer_object 1 +#define GL_QUERY_BUFFER_AMD 0x9192 +#define GL_QUERY_BUFFER_BINDING_AMD 0x9193 +#define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 +#endif /* GL_AMD_query_buffer_object */ + +#ifndef GL_AMD_sample_positions +#define GL_AMD_sample_positions 1 +#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F +typedef void (APIENTRYP PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat *val); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSetMultisamplefvAMD (GLenum pname, GLuint index, const GLfloat *val); +#endif +#endif /* GL_AMD_sample_positions */ + +#ifndef GL_AMD_seamless_cubemap_per_texture +#define GL_AMD_seamless_cubemap_per_texture 1 +#endif /* GL_AMD_seamless_cubemap_per_texture */ + +#ifndef GL_AMD_shader_atomic_counter_ops +#define GL_AMD_shader_atomic_counter_ops 1 +#endif /* GL_AMD_shader_atomic_counter_ops */ + +#ifndef GL_AMD_shader_stencil_export +#define GL_AMD_shader_stencil_export 1 +#endif /* GL_AMD_shader_stencil_export */ + +#ifndef GL_AMD_shader_trinary_minmax +#define GL_AMD_shader_trinary_minmax 1 +#endif /* GL_AMD_shader_trinary_minmax */ + +#ifndef GL_AMD_sparse_texture +#define GL_AMD_sparse_texture 1 +#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A +#define GL_MIN_SPARSE_LEVEL_AMD 0x919B +#define GL_MIN_LOD_WARNING_AMD 0x919C +#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 +typedef void (APIENTRYP PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +typedef void (APIENTRYP PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexStorageSparseAMD (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +GLAPI void APIENTRY glTextureStorageSparseAMD (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +#endif +#endif /* GL_AMD_sparse_texture */ + +#ifndef GL_AMD_stencil_operation_extended +#define GL_AMD_stencil_operation_extended 1 +#define GL_SET_AMD 0x874A +#define GL_REPLACE_VALUE_AMD 0x874B +#define GL_STENCIL_OP_VALUE_AMD 0x874C +#define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D +typedef void (APIENTRYP PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpValueAMD (GLenum face, GLuint value); +#endif +#endif /* GL_AMD_stencil_operation_extended */ + +#ifndef GL_AMD_texture_texture4 +#define GL_AMD_texture_texture4 1 +#endif /* GL_AMD_texture_texture4 */ + +#ifndef GL_AMD_transform_feedback3_lines_triangles +#define GL_AMD_transform_feedback3_lines_triangles 1 +#endif /* GL_AMD_transform_feedback3_lines_triangles */ + +#ifndef GL_AMD_transform_feedback4 +#define GL_AMD_transform_feedback4 1 +#define GL_STREAM_RASTERIZATION_AMD 0x91A0 +#endif /* GL_AMD_transform_feedback4 */ + +#ifndef GL_AMD_vertex_shader_layer +#define GL_AMD_vertex_shader_layer 1 +#endif /* GL_AMD_vertex_shader_layer */ + +#ifndef GL_AMD_vertex_shader_tessellator +#define GL_AMD_vertex_shader_tessellator 1 +#define GL_SAMPLER_BUFFER_AMD 0x9001 +#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 +#define GL_TESSELLATION_MODE_AMD 0x9004 +#define GL_TESSELLATION_FACTOR_AMD 0x9005 +#define GL_DISCRETE_AMD 0x9006 +#define GL_CONTINUOUS_AMD 0x9007 +typedef void (APIENTRYP PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTessellationFactorAMD (GLfloat factor); +GLAPI void APIENTRY glTessellationModeAMD (GLenum mode); +#endif +#endif /* GL_AMD_vertex_shader_tessellator */ + +#ifndef GL_AMD_vertex_shader_viewport_index +#define GL_AMD_vertex_shader_viewport_index 1 +#endif /* GL_AMD_vertex_shader_viewport_index */ + +#ifndef GL_APPLE_aux_depth_stencil +#define GL_APPLE_aux_depth_stencil 1 +#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 +#endif /* GL_APPLE_aux_depth_stencil */ + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 +#endif /* GL_APPLE_client_storage */ + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 +#define GL_ELEMENT_ARRAY_APPLE 0x8A0C +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E +typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerAPPLE (GLenum type, const void *pointer); +GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count); +GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#endif +#endif /* GL_APPLE_element_array */ + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B +typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); +typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); +typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenFencesAPPLE (GLsizei n, GLuint *fences); +GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei n, const GLuint *fences); +GLAPI void APIENTRY glSetFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint fence); +GLAPI void APIENTRY glFinishFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum object, GLuint name); +GLAPI void APIENTRY glFinishObjectAPPLE (GLenum object, GLint name); +#endif +#endif /* GL_APPLE_fence */ + +#ifndef GL_APPLE_float_pixels +#define GL_APPLE_float_pixels 1 +#define GL_HALF_APPLE 0x140B +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_RGBA_FLOAT16_APPLE 0x881A +#define GL_RGB_FLOAT16_APPLE 0x881B +#define GL_ALPHA_FLOAT16_APPLE 0x881C +#define GL_INTENSITY_FLOAT16_APPLE 0x881D +#define GL_LUMINANCE_FLOAT16_APPLE 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F +#define GL_COLOR_FLOAT_APPLE 0x8A0F +#endif /* GL_APPLE_float_pixels */ + +#ifndef GL_APPLE_flush_buffer_range +#define GL_APPLE_flush_buffer_range 1 +#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 +#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 +typedef void (APIENTRYP PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferParameteriAPPLE (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glFlushMappedBufferRangeAPPLE (GLenum target, GLintptr offset, GLsizeiptr size); +#endif +#endif /* GL_APPLE_flush_buffer_range */ + +#ifndef GL_APPLE_object_purgeable +#define GL_APPLE_object_purgeable 1 +#define GL_BUFFER_OBJECT_APPLE 0x85B3 +#define GL_RELEASED_APPLE 0x8A19 +#define GL_VOLATILE_APPLE 0x8A1A +#define GL_RETAINED_APPLE 0x8A1B +#define GL_UNDEFINED_APPLE 0x8A1C +#define GL_PURGEABLE_APPLE 0x8A1D +typedef GLenum (APIENTRYP PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef GLenum (APIENTRYP PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLenum APIENTRY glObjectPurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); +GLAPI GLenum APIENTRY glObjectUnpurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); +GLAPI void APIENTRY glGetObjectParameterivAPPLE (GLenum objectType, GLuint name, GLenum pname, GLint *params); +#endif +#endif /* GL_APPLE_object_purgeable */ + +#ifndef GL_APPLE_rgb_422 +#define GL_APPLE_rgb_422 1 +#define GL_RGB_422_APPLE 0x8A1F +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#define GL_RGB_RAW_422_APPLE 0x8A51 +#endif /* GL_APPLE_rgb_422 */ + +#ifndef GL_APPLE_row_bytes +#define GL_APPLE_row_bytes 1 +#define GL_PACK_ROW_BYTES_APPLE 0x8A15 +#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 +#endif /* GL_APPLE_row_bytes */ + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 +#endif /* GL_APPLE_specular_vector */ + +#ifndef GL_APPLE_texture_range +#define GL_APPLE_texture_range 1 +#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 +#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#define GL_STORAGE_PRIVATE_APPLE 0x85BD +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF +typedef void (APIENTRYP PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, const void *pointer); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureRangeAPPLE (GLenum target, GLsizei length, const void *pointer); +GLAPI void APIENTRY glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, void **params); #endif +#endif /* GL_APPLE_texture_range */ -#ifndef GL_EXT_texture -#define GL_ALPHA4_EXT 0x803B -#define GL_ALPHA8_EXT 0x803C -#define GL_ALPHA12_EXT 0x803D -#define GL_ALPHA16_EXT 0x803E -#define GL_LUMINANCE4_EXT 0x803F -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE12_EXT 0x8041 -#define GL_LUMINANCE16_EXT 0x8042 -#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 -#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 -#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 -#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 -#define GL_INTENSITY_EXT 0x8049 -#define GL_INTENSITY4_EXT 0x804A -#define GL_INTENSITY8_EXT 0x804B -#define GL_INTENSITY12_EXT 0x804C -#define GL_INTENSITY16_EXT 0x804D -#define GL_RGB2_EXT 0x804E -#define GL_RGB4_EXT 0x804F -#define GL_RGB5_EXT 0x8050 -#define GL_RGB8_EXT 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB12_EXT 0x8053 -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA2_EXT 0x8055 -#define GL_RGBA4_EXT 0x8056 -#define GL_RGB5_A1_EXT 0x8057 -#define GL_RGBA8_EXT 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGBA12_EXT 0x805A -#define GL_RGBA16_EXT 0x805B -#define GL_TEXTURE_RED_SIZE_EXT 0x805C -#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D -#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E -#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 -#define GL_REPLACE_EXT 0x8062 -#define GL_PROXY_TEXTURE_1D_EXT 0x8063 -#define GL_PROXY_TEXTURE_2D_EXT 0x8064 -#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 +#define GL_TRANSFORM_HINT_APPLE 0x85B1 +#endif /* GL_APPLE_transform_hint */ + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint array); +GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei n, const GLuint *arrays); +GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei n, GLuint *arrays); +GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint array); +#endif +#endif /* GL_APPLE_vertex_array_object */ + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CLIENT_APPLE 0x85B4 +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); +typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei length, void *pointer); +GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei length, void *pointer); +GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum pname, GLint param); +#endif +#endif /* GL_APPLE_vertex_array_range */ + +#ifndef GL_APPLE_vertex_program_evaluators +#define GL_APPLE_vertex_program_evaluators 1 +#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 +#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 +#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 +#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 +#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 +#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 +#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 +#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 +#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 +#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef GLboolean (APIENTRYP PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glEnableVertexAttribAPPLE (GLuint index, GLenum pname); +GLAPI void APIENTRY glDisableVertexAttribAPPLE (GLuint index, GLenum pname); +GLAPI GLboolean APIENTRY glIsVertexAttribEnabledAPPLE (GLuint index, GLenum pname); +GLAPI void APIENTRY glMapVertexAttrib1dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +GLAPI void APIENTRY glMapVertexAttrib1fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +GLAPI void APIENTRY glMapVertexAttrib2dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +GLAPI void APIENTRY glMapVertexAttrib2fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +#endif +#endif /* GL_APPLE_vertex_program_evaluators */ + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 +#define GL_YCBCR_422_APPLE 0x85B9 +#endif /* GL_APPLE_ycbcr_422 */ + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 +typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersATI (GLsizei n, const GLenum *bufs); +#endif +#endif /* GL_ATI_draw_buffers */ + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerATI (GLenum type, const void *pointer); +GLAPI void APIENTRY glDrawElementArrayATI (GLenum mode, GLsizei count); +GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count); +#endif +#endif /* GL_ATI_element_array */ + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBumpParameterivATI (GLenum pname, const GLint *param); +GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum pname, GLint *param); +GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param); +#endif +#endif /* GL_ATI_envmap_bumpmap */ + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_REG_6_ATI 0x8927 +#define GL_REG_7_ATI 0x8928 +#define GL_REG_8_ATI 0x8929 +#define GL_REG_9_ATI 0x892A +#define GL_REG_10_ATI 0x892B +#define GL_REG_11_ATI 0x892C +#define GL_REG_12_ATI 0x892D +#define GL_REG_13_ATI 0x892E +#define GL_REG_14_ATI 0x892F +#define GL_REG_15_ATI 0x8930 +#define GL_REG_16_ATI 0x8931 +#define GL_REG_17_ATI 0x8932 +#define GL_REG_18_ATI 0x8933 +#define GL_REG_19_ATI 0x8934 +#define GL_REG_20_ATI 0x8935 +#define GL_REG_21_ATI 0x8936 +#define GL_REG_22_ATI 0x8937 +#define GL_REG_23_ATI 0x8938 +#define GL_REG_24_ATI 0x8939 +#define GL_REG_25_ATI 0x893A +#define GL_REG_26_ATI 0x893B +#define GL_REG_27_ATI 0x893C +#define GL_REG_28_ATI 0x893D +#define GL_REG_29_ATI 0x893E +#define GL_REG_30_ATI 0x893F +#define GL_REG_31_ATI 0x8940 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_CON_8_ATI 0x8949 +#define GL_CON_9_ATI 0x894A +#define GL_CON_10_ATI 0x894B +#define GL_CON_11_ATI 0x894C +#define GL_CON_12_ATI 0x894D +#define GL_CON_13_ATI 0x894E +#define GL_CON_14_ATI 0x894F +#define GL_CON_15_ATI 0x8950 +#define GL_CON_16_ATI 0x8951 +#define GL_CON_17_ATI 0x8952 +#define GL_CON_18_ATI 0x8953 +#define GL_CON_19_ATI 0x8954 +#define GL_CON_20_ATI 0x8955 +#define GL_CON_21_ATI 0x8956 +#define GL_CON_22_ATI 0x8957 +#define GL_CON_23_ATI 0x8958 +#define GL_CON_24_ATI 0x8959 +#define GL_CON_25_ATI 0x895A +#define GL_CON_26_ATI 0x895B +#define GL_CON_27_ATI 0x895C +#define GL_CON_28_ATI 0x895D +#define GL_CON_29_ATI 0x895E +#define GL_CON_30_ATI 0x895F +#define GL_CON_31_ATI 0x8960 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B +#define GL_RED_BIT_ATI 0x00000001 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint range); +GLAPI void APIENTRY glBindFragmentShaderATI (GLuint id); +GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint id); +GLAPI void APIENTRY glBeginFragmentShaderATI (void); +GLAPI void APIENTRY glEndFragmentShaderATI (void); +GLAPI void APIENTRY glPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle); +GLAPI void APIENTRY glSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle); +GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint dst, const GLfloat *value); +#endif +#endif /* GL_ATI_fragment_shader */ + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 +typedef void *(APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void *APIENTRY glMapObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint buffer); +#endif +#endif /* GL_ATI_map_object_buffer */ + +#ifndef GL_ATI_meminfo +#define GL_ATI_meminfo 1 +#define GL_VBO_FREE_MEMORY_ATI 0x87FB +#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC +#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD +#endif /* GL_ATI_meminfo */ + +#ifndef GL_ATI_pixel_format_float +#define GL_ATI_pixel_format_float 1 +#define GL_RGBA_FLOAT_MODE_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 +#endif /* GL_ATI_pixel_format_float */ + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 +typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPNTrianglesiATI (GLenum pname, GLint param); +GLAPI void APIENTRY glPNTrianglesfATI (GLenum pname, GLfloat param); +#endif +#endif /* GL_ATI_pn_triangles */ + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#endif +#endif /* GL_ATI_separate_stencil */ + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 +#endif /* GL_ATI_text_fragment_shader */ + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +#endif /* GL_ATI_texture_env_combine3 */ + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F +#endif /* GL_ATI_texture_float */ + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#endif /* GL_ATI_texture_mirror_once */ + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 +typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage); +typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei size, const void *pointer, GLenum usage); +GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); +GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glFreeObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetArrayObjectivATI (GLenum array, GLenum pname, GLint *params); +GLAPI void APIENTRY glVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint *params); +#endif +#endif /* GL_ATI_vertex_array_object */ + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 +typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint *params); +#endif +#endif /* GL_ATI_vertex_attrib_array_object */ + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_STREAM0_ATI 0x876C +#define GL_VERTEX_STREAM1_ATI 0x876D +#define GL_VERTEX_STREAM2_ATI 0x876E +#define GL_VERTEX_STREAM3_ATI 0x876F +#define GL_VERTEX_STREAM4_ATI 0x8770 +#define GL_VERTEX_STREAM5_ATI 0x8771 +#define GL_VERTEX_STREAM6_ATI 0x8772 +#define GL_VERTEX_STREAM7_ATI 0x8773 +#define GL_VERTEX_SOURCE_ATI 0x8774 +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexStream1sATI (GLenum stream, GLshort x); +GLAPI void APIENTRY glVertexStream1svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream1iATI (GLenum stream, GLint x); +GLAPI void APIENTRY glVertexStream1ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream1fATI (GLenum stream, GLfloat x); +GLAPI void APIENTRY glVertexStream1fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream1dATI (GLenum stream, GLdouble x); +GLAPI void APIENTRY glVertexStream1dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream2sATI (GLenum stream, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexStream2svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream2iATI (GLenum stream, GLint x, GLint y); +GLAPI void APIENTRY glVertexStream2ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexStream2fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexStream2dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexStream3svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexStream3ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexStream3fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexStream3dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexStream4svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexStream4ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexStream4fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexStream4dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glNormalStream3bATI (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +GLAPI void APIENTRY glNormalStream3bvATI (GLenum stream, const GLbyte *coords); +GLAPI void APIENTRY glNormalStream3sATI (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +GLAPI void APIENTRY glNormalStream3svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glNormalStream3iATI (GLenum stream, GLint nx, GLint ny, GLint nz); +GLAPI void APIENTRY glNormalStream3ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glNormalStream3fATI (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI void APIENTRY glNormalStream3fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glNormalStream3dATI (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +GLAPI void APIENTRY glNormalStream3dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum stream); +GLAPI void APIENTRY glVertexBlendEnviATI (GLenum pname, GLint param); +GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum pname, GLfloat param); +#endif +#endif /* GL_ATI_vertex_streams */ + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF +#endif /* GL_EXT_422_pixels */ + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 +#define GL_ABGR_EXT 0x8000 +#endif /* GL_EXT_abgr */ + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 +#endif /* GL_EXT_bgra */ + +#ifndef GL_EXT_bindable_uniform +#define GL_EXT_bindable_uniform 1 +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF +typedef void (APIENTRYP PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); +typedef GLint (APIENTRYP PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); +typedef GLintptr (APIENTRYP PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniformBufferEXT (GLuint program, GLint location, GLuint buffer); +GLAPI GLint APIENTRY glGetUniformBufferSizeEXT (GLuint program, GLint location); +GLAPI GLintptr APIENTRY glGetUniformOffsetEXT (GLuint program, GLint location); #endif +#endif /* GL_EXT_bindable_uniform */ -#ifndef GL_EXT_texture3D -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_SKIP_IMAGES_EXT 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_DEPTH_EXT 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_TEXTURE_WRAP_R_EXT 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 +typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColorEXT (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); #endif +#endif /* GL_EXT_blend_color */ -#ifndef GL_SGIS_texture_filter4 -#define GL_FILTER4_SGIS 0x8146 -#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha); #endif +#endif /* GL_EXT_blend_equation_separate */ -#ifndef GL_EXT_subtexture +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #endif +#endif /* GL_EXT_blend_func_separate */ -#ifndef GL_EXT_copy_texture +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 +#endif /* GL_EXT_blend_logic_op */ + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_BLEND_EQUATION_EXT 0x8009 +typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationEXT (GLenum mode); #endif +#endif /* GL_EXT_blend_minmax */ -#ifndef GL_EXT_histogram -#define GL_HISTOGRAM_EXT 0x8024 -#define GL_PROXY_HISTOGRAM_EXT 0x8025 -#define GL_HISTOGRAM_WIDTH_EXT 0x8026 -#define GL_HISTOGRAM_FORMAT_EXT 0x8027 -#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C -#define GL_HISTOGRAM_SINK_EXT 0x802D -#define GL_MINMAX_EXT 0x802E -#define GL_MINMAX_FORMAT_EXT 0x802F -#define GL_MINMAX_SINK_EXT 0x8030 -#define GL_TABLE_TOO_LARGE_EXT 0x8031 +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B +#endif /* GL_EXT_blend_subtract */ + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 +#endif /* GL_EXT_clip_volume_hint */ + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F +#endif /* GL_EXT_cmyka */ + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 +typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#endif +#endif /* GL_EXT_color_subtable */ + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 +typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLockArraysEXT (GLint first, GLsizei count); +GLAPI void APIENTRY glUnlockArraysEXT (void); #endif +#endif /* GL_EXT_compiled_vertex_array */ #ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 #define GL_CONVOLUTION_1D_EXT 0x8010 #define GL_CONVOLUTION_2D_EXT 0x8011 #define GL_SEPARABLE_2D_EXT 0x8012 @@ -360,2561 +6295,5476 @@ extern "C" { #define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 #define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 #define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 -#endif +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat params); +GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum target, GLenum pname, GLint params); +GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, void *image); +GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +#endif +#endif /* GL_EXT_convolution */ -#ifndef GL_SGI_color_matrix -#define GL_COLOR_MATRIX_SGI 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 +typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); +typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); +typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); +typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); +typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); +typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); +typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); +typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); +typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); +typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); +typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTangent3bEXT (GLbyte tx, GLbyte ty, GLbyte tz); +GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glTangent3dEXT (GLdouble tx, GLdouble ty, GLdouble tz); +GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glTangent3fEXT (GLfloat tx, GLfloat ty, GLfloat tz); +GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glTangent3iEXT (GLint tx, GLint ty, GLint tz); +GLAPI void APIENTRY glTangent3ivEXT (const GLint *v); +GLAPI void APIENTRY glTangent3sEXT (GLshort tx, GLshort ty, GLshort tz); +GLAPI void APIENTRY glTangent3svEXT (const GLshort *v); +GLAPI void APIENTRY glBinormal3bEXT (GLbyte bx, GLbyte by, GLbyte bz); +GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glBinormal3dEXT (GLdouble bx, GLdouble by, GLdouble bz); +GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glBinormal3fEXT (GLfloat bx, GLfloat by, GLfloat bz); +GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glBinormal3iEXT (GLint bx, GLint by, GLint bz); +GLAPI void APIENTRY glBinormal3ivEXT (const GLint *v); +GLAPI void APIENTRY glBinormal3sEXT (GLshort bx, GLshort by, GLshort bz); +GLAPI void APIENTRY glBinormal3svEXT (const GLshort *v); +GLAPI void APIENTRY glTangentPointerEXT (GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glBinormalPointerEXT (GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_coordinate_frame */ + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); #endif +#endif /* GL_EXT_copy_texture */ -#ifndef GL_SGI_color_table -#define GL_COLOR_TABLE_SGI 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 -#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 -#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 -#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 -#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 -#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC +typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCullParameterdvEXT (GLenum pname, GLdouble *params); +GLAPI void APIENTRY glCullParameterfvEXT (GLenum pname, GLfloat *params); +#endif +#endif /* GL_EXT_cull_vertex */ + +#ifndef GL_EXT_debug_label +#define GL_EXT_debug_label 1 +#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F +#define GL_PROGRAM_OBJECT_EXT 0x8B40 +#define GL_SHADER_OBJECT_EXT 0x8B48 +#define GL_BUFFER_OBJECT_EXT 0x9151 +#define GL_QUERY_OBJECT_EXT 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 +typedef void (APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); #endif +#endif /* GL_EXT_debug_label */ -#ifndef GL_SGIS_pixel_texture -#define GL_PIXEL_TEXTURE_SGIS 0x8353 -#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 -#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 -#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +#ifndef GL_EXT_debug_marker +#define GL_EXT_debug_marker 1 +typedef void (APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); +GLAPI void APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); +GLAPI void APIENTRY glPopGroupMarkerEXT (void); #endif +#endif /* GL_EXT_debug_marker */ -#ifndef GL_SGIX_pixel_texture -#define GL_PIXEL_TEX_GEN_SGIX 0x8139 -#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthBoundsEXT (GLclampd zmin, GLclampd zmax); +#endif +#endif /* GL_EXT_depth_bounds_test */ + +#ifndef GL_EXT_direct_state_access +#define GL_EXT_direct_state_access 1 +#define GL_PROGRAM_MATRIX_EXT 0x8E2D +#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E +#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F +typedef void (APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +typedef void (APIENTRYP PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); +typedef void (APIENTRYP PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble *data); +typedef void (APIENTRYP PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void **data); +typedef void (APIENTRYP PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); +typedef void (APIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, void *img); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, void *img); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void **params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint *params); +typedef void (APIENTRYP PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void **params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); +typedef void (APIENTRYP PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (APIENTRYP PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void **param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void **param); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixLoadIdentityEXT (GLenum mode); +GLAPI void APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glMatrixPopEXT (GLenum mode); +GLAPI void APIENTRY glMatrixPushEXT (GLenum mode); +GLAPI void APIENTRY glClientAttribDefaultEXT (GLbitfield mask); +GLAPI void APIENTRY glPushClientAttribDefaultEXT (GLbitfield mask); +GLAPI void APIENTRY glTextureParameterfEXT (GLuint texture, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glTextureParameteriEXT (GLuint texture, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetTextureImageEXT (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +GLAPI void APIENTRY glGetTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureLevelParameterfvEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureLevelParameterivEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture); +GLAPI void APIENTRY glMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +GLAPI void APIENTRY glMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); +GLAPI void APIENTRY glMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint *params); +GLAPI void APIENTRY glMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +GLAPI void APIENTRY glGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glEnableClientStateIndexedEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glDisableClientStateIndexedEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat *data); +GLAPI void APIENTRY glGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble *data); +GLAPI void APIENTRY glGetPointerIndexedvEXT (GLenum target, GLuint index, void **data); +GLAPI void APIENTRY glEnableIndexedEXT (GLenum target, GLuint index); +GLAPI void APIENTRY glDisableIndexedEXT (GLenum target, GLuint index); +GLAPI GLboolean APIENTRY glIsEnabledIndexedEXT (GLenum target, GLuint index); +GLAPI void APIENTRY glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data); +GLAPI void APIENTRY glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data); +GLAPI void APIENTRY glCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glGetCompressedTextureImageEXT (GLuint texture, GLenum target, GLint lod, void *img); +GLAPI void APIENTRY glCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint lod, void *img); +GLAPI void APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glNamedBufferDataEXT (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +GLAPI void APIENTRY glNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void *APIENTRY glMapNamedBufferEXT (GLuint buffer, GLenum access); +GLAPI GLboolean APIENTRY glUnmapNamedBufferEXT (GLuint buffer); +GLAPI void APIENTRY glGetNamedBufferParameterivEXT (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedBufferPointervEXT (GLuint buffer, GLenum pname, void **params); +GLAPI void APIENTRY glGetNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +GLAPI void APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); +GLAPI void APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); +GLAPI void APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glTextureBufferEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); +GLAPI void APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint *params); +GLAPI void APIENTRY glEnableClientStateiEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glDisableClientStateiEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glGetFloati_vEXT (GLenum pname, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetDoublei_vEXT (GLenum pname, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetPointeri_vEXT (GLenum pname, GLuint index, void **params); +GLAPI void APIENTRY glNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); +GLAPI void APIENTRY glNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, void *string); +GLAPI void APIENTRY glNamedRenderbufferStorageEXT (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetNamedRenderbufferParameterivEXT (GLuint renderbuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleEXT (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI GLenum APIENTRY glCheckNamedFramebufferStatusEXT (GLuint framebuffer, GLenum target); +GLAPI void APIENTRY glNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glNamedFramebufferRenderbufferEXT (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameterivEXT (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateTextureMipmapEXT (GLuint texture, GLenum target); +GLAPI void APIENTRY glGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target); +GLAPI void APIENTRY glFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode); +GLAPI void APIENTRY glFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode); +GLAPI void APIENTRY glGetFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glNamedFramebufferTextureEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTextureLayerEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +GLAPI void APIENTRY glTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glVertexArrayVertexOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayEdgeFlagOffsetEXT (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayIndexOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayNormalOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayMultiTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayFogCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArraySecondaryColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayVertexAttribOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayVertexAttribIOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glEnableVertexArrayEXT (GLuint vaobj, GLenum array); +GLAPI void APIENTRY glDisableVertexArrayEXT (GLuint vaobj, GLenum array); +GLAPI void APIENTRY glEnableVertexArrayAttribEXT (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glDisableVertexArrayAttribEXT (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glGetVertexArrayIntegervEXT (GLuint vaobj, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayPointervEXT (GLuint vaobj, GLenum pname, void **param); +GLAPI void APIENTRY glGetVertexArrayIntegeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayPointeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, void **param); +GLAPI void *APIENTRY glMapNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI void APIENTRY glFlushMappedNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glNamedBufferStorageEXT (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +GLAPI void APIENTRY glClearNamedBufferDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearNamedBufferSubDataEXT (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glNamedFramebufferParameteriEXT (GLuint framebuffer, GLenum pname, GLint param); +GLAPI void APIENTRY glGetNamedFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glProgramUniform1dEXT (GLuint program, GLint location, GLdouble x); +GLAPI void APIENTRY glProgramUniform2dEXT (GLuint program, GLint location, GLdouble x, GLdouble y); +GLAPI void APIENTRY glProgramUniform3dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glProgramUniform4dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramUniform1dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform2dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform3dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform4dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glTextureBufferRangeEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glTextureStorage2DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureStorage3DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glVertexArrayBindVertexBufferEXT (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI void APIENTRY glVertexArrayVertexAttribFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribIFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribLFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribBindingEXT (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +GLAPI void APIENTRY glVertexArrayVertexBindingDivisorEXT (GLuint vaobj, GLuint bindingindex, GLuint divisor); +GLAPI void APIENTRY glVertexArrayVertexAttribLOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glTexturePageCommitmentEXT (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +GLAPI void APIENTRY glVertexArrayVertexAttribDivisorEXT (GLuint vaobj, GLuint index, GLuint divisor); +#endif +#endif /* GL_EXT_direct_state_access */ + +#ifndef GL_EXT_draw_buffers2 +#define GL_EXT_draw_buffers2 1 +typedef void (APIENTRYP PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); #endif +#endif /* GL_EXT_draw_buffers2 */ -#ifndef GL_SGIS_texture4D -#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 -#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 -#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 -#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 -#define GL_TEXTURE_4D_SGIS 0x8134 -#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 -#define GL_TEXTURE_4DSIZE_SGIS 0x8136 -#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 -#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 -#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); #endif +#endif /* GL_EXT_draw_instanced */ -#ifndef GL_SGI_texture_color_table -#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC -#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); #endif +#endif /* GL_EXT_draw_range_elements */ -#ifndef GL_EXT_cmyka -#define GL_CMYK_EXT 0x800C -#define GL_CMYKA_EXT 0x800D -#define GL_PACK_CMYK_HINT_EXT 0x800E -#define GL_UNPACK_CMYK_HINT_EXT 0x800F -#endif - -#ifndef GL_EXT_texture_object -#define GL_TEXTURE_PRIORITY_EXT 0x8066 -#define GL_TEXTURE_RESIDENT_EXT 0x8067 -#define GL_TEXTURE_1D_BINDING_EXT 0x8068 -#define GL_TEXTURE_2D_BINDING_EXT 0x8069 -#define GL_TEXTURE_3D_BINDING_EXT 0x806A -#endif - -#ifndef GL_SGIS_detail_texture -#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 -#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 -#define GL_LINEAR_DETAIL_SGIS 0x8097 -#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 -#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 -#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A -#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B -#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C -#endif - -#ifndef GL_SGIS_sharpen_texture -#define GL_LINEAR_SHARPEN_SGIS 0x80AD -#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE -#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF -#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 -#endif - -#ifndef GL_EXT_packed_pixels -#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 -#endif - -#ifndef GL_SGIS_texture_lod -#define GL_TEXTURE_MIN_LOD_SGIS 0x813A -#define GL_TEXTURE_MAX_LOD_SGIS 0x813B -#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C -#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D -#endif - -#ifndef GL_SGIS_multisample -#define GL_MULTISAMPLE_SGIS 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F -#define GL_SAMPLE_MASK_SGIS 0x80A0 -#define GL_1PASS_SGIS 0x80A1 -#define GL_2PASS_0_SGIS 0x80A2 -#define GL_2PASS_1_SGIS 0x80A3 -#define GL_4PASS_0_SGIS 0x80A4 -#define GL_4PASS_1_SGIS 0x80A5 -#define GL_4PASS_2_SGIS 0x80A6 -#define GL_4PASS_3_SGIS 0x80A7 -#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 -#define GL_SAMPLES_SGIS 0x80A9 -#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA -#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB -#define GL_SAMPLE_PATTERN_SGIS 0x80AC -#endif - -#ifndef GL_EXT_rescale_normal -#define GL_RESCALE_NORMAL_EXT 0x803A -#endif - -#ifndef GL_EXT_vertex_array -#define GL_VERTEX_ARRAY_EXT 0x8074 -#define GL_NORMAL_ARRAY_EXT 0x8075 -#define GL_COLOR_ARRAY_EXT 0x8076 -#define GL_INDEX_ARRAY_EXT 0x8077 -#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 -#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 -#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A -#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B -#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C -#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D -#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E -#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F -#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 -#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 -#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 -#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 -#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 -#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 -#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 -#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 -#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A -#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B -#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C -#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D -#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E -#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F -#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 -#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 -#endif - -#ifndef GL_EXT_misc_attribute -#endif - -#ifndef GL_SGIS_generate_mipmap -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 -#endif - -#ifndef GL_SGIX_clipmap -#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 -#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 -#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 -#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 -#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 -#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 -#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 -#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 -#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 -#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D -#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E -#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F -#endif - -#ifndef GL_SGIX_shadow -#define GL_TEXTURE_COMPARE_SGIX 0x819A -#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B -#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C -#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D -#endif - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_CLAMP_TO_EDGE_SGIS 0x812F -#endif - -#ifndef GL_SGIS_texture_border_clamp -#define GL_CLAMP_TO_BORDER_SGIS 0x812D -#endif - -#ifndef GL_EXT_blend_minmax -#define GL_FUNC_ADD_EXT 0x8006 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#define GL_BLEND_EQUATION_EXT 0x8009 -#endif - -#ifndef GL_EXT_blend_subtract -#define GL_FUNC_SUBTRACT_EXT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B -#endif - -#ifndef GL_EXT_blend_logic_op -#endif - -#ifndef GL_SGIX_interlace -#define GL_INTERLACE_SGIX 0x8094 -#endif - -#ifndef GL_SGIX_pixel_tiles -#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E -#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F -#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 -#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 -#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 -#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 -#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 -#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 -#endif - -#ifndef GL_SGIS_texture_select -#define GL_DUAL_ALPHA4_SGIS 0x8110 -#define GL_DUAL_ALPHA8_SGIS 0x8111 -#define GL_DUAL_ALPHA12_SGIS 0x8112 -#define GL_DUAL_ALPHA16_SGIS 0x8113 -#define GL_DUAL_LUMINANCE4_SGIS 0x8114 -#define GL_DUAL_LUMINANCE8_SGIS 0x8115 -#define GL_DUAL_LUMINANCE12_SGIS 0x8116 -#define GL_DUAL_LUMINANCE16_SGIS 0x8117 -#define GL_DUAL_INTENSITY4_SGIS 0x8118 -#define GL_DUAL_INTENSITY8_SGIS 0x8119 -#define GL_DUAL_INTENSITY12_SGIS 0x811A -#define GL_DUAL_INTENSITY16_SGIS 0x811B -#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C -#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D -#define GL_QUAD_ALPHA4_SGIS 0x811E -#define GL_QUAD_ALPHA8_SGIS 0x811F -#define GL_QUAD_LUMINANCE4_SGIS 0x8120 -#define GL_QUAD_LUMINANCE8_SGIS 0x8121 -#define GL_QUAD_INTENSITY4_SGIS 0x8122 -#define GL_QUAD_INTENSITY8_SGIS 0x8123 -#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 -#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 -#endif - -#ifndef GL_SGIX_sprite -#define GL_SPRITE_SGIX 0x8148 -#define GL_SPRITE_MODE_SGIX 0x8149 -#define GL_SPRITE_AXIS_SGIX 0x814A -#define GL_SPRITE_TRANSLATION_SGIX 0x814B -#define GL_SPRITE_AXIAL_SGIX 0x814C -#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D -#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E -#endif - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E -#endif - -#ifndef GL_SGIS_point_parameters -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MIN_SGIS 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_SIZE_MAX_SGIS 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 -#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 -#endif - -#ifndef GL_SGIX_instruments -#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 -#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 -#endif - -#ifndef GL_SGIX_texture_scale_bias -#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 -#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A -#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B -#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C -#endif - -#ifndef GL_SGIX_framezoom -#define GL_FRAMEZOOM_SGIX 0x818B -#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C -#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D -#endif - -#ifndef GL_SGIX_tag_sample_buffer -#endif - -#ifndef GL_SGIX_reference_plane -#define GL_REFERENCE_PLANE_SGIX 0x817D -#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E -#endif - -#ifndef GL_SGIX_flush_raster -#endif - -#ifndef GL_SGIX_depth_texture -#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 -#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 -#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 -#endif - -#ifndef GL_SGIS_fog_function -#define GL_FOG_FUNC_SGIS 0x812A -#define GL_FOG_FUNC_POINTS_SGIS 0x812B -#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C -#endif - -#ifndef GL_SGIX_fog_offset -#define GL_FOG_OFFSET_SGIX 0x8198 -#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 -#endif - -#ifndef GL_HP_image_transform -#define GL_IMAGE_SCALE_X_HP 0x8155 -#define GL_IMAGE_SCALE_Y_HP 0x8156 -#define GL_IMAGE_TRANSLATE_X_HP 0x8157 -#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 -#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 -#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A -#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B -#define GL_IMAGE_MAG_FILTER_HP 0x815C -#define GL_IMAGE_MIN_FILTER_HP 0x815D -#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E -#define GL_CUBIC_HP 0x815F -#define GL_AVERAGE_HP 0x8160 -#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 -#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 -#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 -#endif - -#ifndef GL_HP_convolution_border_modes -#define GL_IGNORE_BORDER_HP 0x8150 -#define GL_CONSTANT_BORDER_HP 0x8151 -#define GL_REPLICATE_BORDER_HP 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 -#endif - -#ifndef GL_INGR_palette_buffer -#endif - -#ifndef GL_SGIX_texture_add_env -#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE -#endif - -#ifndef GL_EXT_color_subtable -#endif - -#ifndef GL_PGI_vertex_hints -#define GL_VERTEX_DATA_HINT_PGI 0x1A22A -#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B -#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C -#define GL_MAX_VERTEX_HINT_PGI 0x1A22D -#define GL_COLOR3_BIT_PGI 0x00010000 -#define GL_COLOR4_BIT_PGI 0x00020000 -#define GL_EDGEFLAG_BIT_PGI 0x00040000 -#define GL_INDEX_BIT_PGI 0x00080000 -#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 -#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 -#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 -#define GL_MAT_EMISSION_BIT_PGI 0x00800000 -#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 -#define GL_MAT_SHININESS_BIT_PGI 0x02000000 -#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 -#define GL_NORMAL_BIT_PGI 0x08000000 -#define GL_TEXCOORD1_BIT_PGI 0x10000000 -#define GL_TEXCOORD2_BIT_PGI 0x20000000 -#define GL_TEXCOORD3_BIT_PGI 0x40000000 -#define GL_TEXCOORD4_BIT_PGI 0x80000000 -#define GL_VERTEX23_BIT_PGI 0x00000004 -#define GL_VERTEX4_BIT_PGI 0x00000008 -#endif - -#ifndef GL_PGI_misc_hints -#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 -#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD -#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE -#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 -#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 -#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 -#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C -#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D -#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E -#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F -#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 -#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 -#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 -#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 -#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 -#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 -#define GL_CLIP_NEAR_HINT_PGI 0x1A220 -#define GL_CLIP_FAR_HINT_PGI 0x1A221 -#define GL_WIDE_LINE_HINT_PGI 0x1A222 -#define GL_BACK_NORMALS_HINT_PGI 0x1A223 -#endif - -#ifndef GL_EXT_paletted_texture -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -#endif - -#ifndef GL_EXT_clip_volume_hint -#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 -#endif - -#ifndef GL_SGIX_list_priority -#define GL_LIST_PRIORITY_SGIX 0x8182 -#endif - -#ifndef GL_SGIX_ir_instrument1 -#define GL_IR_INSTRUMENT1_SGIX 0x817F -#endif - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 -#endif - -#ifndef GL_SGIX_texture_lod_bias -#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E -#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F -#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 -#endif - -#ifndef GL_SGIX_shadow_ambient -#define GL_SHADOW_AMBIENT_SGIX 0x80BF -#endif - -#ifndef GL_EXT_index_texture -#endif - -#ifndef GL_EXT_index_material -#define GL_INDEX_MATERIAL_EXT 0x81B8 -#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 -#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA -#endif - -#ifndef GL_EXT_index_func -#define GL_INDEX_TEST_EXT 0x81B5 -#define GL_INDEX_TEST_FUNC_EXT 0x81B6 -#define GL_INDEX_TEST_REF_EXT 0x81B7 -#endif - -#ifndef GL_EXT_index_array_formats -#define GL_IUI_V2F_EXT 0x81AD -#define GL_IUI_V3F_EXT 0x81AE -#define GL_IUI_N3F_V2F_EXT 0x81AF -#define GL_IUI_N3F_V3F_EXT 0x81B0 -#define GL_T2F_IUI_V2F_EXT 0x81B1 -#define GL_T2F_IUI_V3F_EXT 0x81B2 -#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 -#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 -#endif - -#ifndef GL_EXT_compiled_vertex_array -#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 -#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 -#endif - -#ifndef GL_EXT_cull_vertex -#define GL_CULL_VERTEX_EXT 0x81AA -#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB -#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC -#endif - -#ifndef GL_SGIX_ycrcb -#define GL_YCRCB_422_SGIX 0x81BB -#define GL_YCRCB_444_SGIX 0x81BC -#endif - -#ifndef GL_SGIX_fragment_lighting -#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 -#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 -#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 -#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 -#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 -#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 -#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 -#define GL_LIGHT_ENV_MODE_SGIX 0x8407 -#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 -#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 -#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A -#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B -#define GL_FRAGMENT_LIGHT0_SGIX 0x840C -#define GL_FRAGMENT_LIGHT1_SGIX 0x840D -#define GL_FRAGMENT_LIGHT2_SGIX 0x840E -#define GL_FRAGMENT_LIGHT3_SGIX 0x840F -#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 -#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 -#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 -#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 -#endif - -#ifndef GL_IBM_rasterpos_clip -#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 -#endif - -#ifndef GL_HP_texture_lighting -#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 -#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 -#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 -#endif - -#ifndef GL_EXT_draw_range_elements -#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 -#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 -#endif - -#ifndef GL_WIN_phong_shading -#define GL_PHONG_WIN 0x80EA -#define GL_PHONG_HINT_WIN 0x80EB -#endif - -#ifndef GL_WIN_specular_fog -#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC -#endif - -#ifndef GL_EXT_light_texture -#define GL_FRAGMENT_MATERIAL_EXT 0x8349 -#define GL_FRAGMENT_NORMAL_EXT 0x834A -#define GL_FRAGMENT_COLOR_EXT 0x834C -#define GL_ATTENUATION_EXT 0x834D -#define GL_SHADOW_ATTENUATION_EXT 0x834E -#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F -#define GL_TEXTURE_LIGHT_EXT 0x8350 -#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 -#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 -/* reuse GL_FRAGMENT_DEPTH_EXT */ -#endif - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_ALPHA_MIN_SGIX 0x8320 -#define GL_ALPHA_MAX_SGIX 0x8321 -#endif - -#ifndef GL_EXT_bgra -#define GL_BGR_EXT 0x80E0 -#define GL_BGRA_EXT 0x80E1 -#endif - -#ifndef GL_INTEL_texture_scissor -#endif - -#ifndef GL_INTEL_parallel_arrays -#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 -#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 -#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 -#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 -#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 -#endif - -#ifndef GL_HP_occlusion_test -#define GL_OCCLUSION_TEST_HP 0x8165 -#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 -#endif - -#ifndef GL_EXT_pixel_transform -#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 -#define GL_PIXEL_MAG_FILTER_EXT 0x8331 -#define GL_PIXEL_MIN_FILTER_EXT 0x8332 -#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 -#define GL_CUBIC_EXT 0x8334 -#define GL_AVERAGE_EXT 0x8335 -#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 -#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 -#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 -#endif - -#ifndef GL_EXT_pixel_transform_color_table -#endif - -#ifndef GL_EXT_shared_texture_palette -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB -#endif - -#ifndef GL_EXT_separate_specular_color -#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 -#define GL_SINGLE_COLOR_EXT 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA -#endif - -#ifndef GL_EXT_secondary_color -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E -#endif - -#ifndef GL_EXT_texture_perturb_normal -#define GL_PERTURB_EXT 0x85AE -#define GL_TEXTURE_NORMAL_EXT 0x85AF -#endif - -#ifndef GL_EXT_multi_draw_arrays -#endif - -#ifndef GL_EXT_fog_coord -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 -#endif - -#ifndef GL_REND_screen_coordinates -#define GL_SCREEN_COORDINATES_REND 0x8490 -#define GL_INVERTED_SCREEN_W_REND 0x8491 -#endif - -#ifndef GL_EXT_coordinate_frame -#define GL_TANGENT_ARRAY_EXT 0x8439 -#define GL_BINORMAL_ARRAY_EXT 0x843A -#define GL_CURRENT_TANGENT_EXT 0x843B -#define GL_CURRENT_BINORMAL_EXT 0x843C -#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E -#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F -#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 -#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 -#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 -#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 -#define GL_MAP1_TANGENT_EXT 0x8444 -#define GL_MAP2_TANGENT_EXT 0x8445 -#define GL_MAP1_BINORMAL_EXT 0x8446 -#define GL_MAP2_BINORMAL_EXT 0x8447 -#endif - -#ifndef GL_EXT_texture_env_combine -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE3_RGB_EXT 0x8583 -#define GL_SOURCE4_RGB_EXT 0x8584 -#define GL_SOURCE5_RGB_EXT 0x8585 -#define GL_SOURCE6_RGB_EXT 0x8586 -#define GL_SOURCE7_RGB_EXT 0x8587 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_SOURCE3_ALPHA_EXT 0x858B -#define GL_SOURCE4_ALPHA_EXT 0x858C -#define GL_SOURCE5_ALPHA_EXT 0x858D -#define GL_SOURCE6_ALPHA_EXT 0x858E -#define GL_SOURCE7_ALPHA_EXT 0x858F -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND3_RGB_EXT 0x8593 -#define GL_OPERAND4_RGB_EXT 0x8594 -#define GL_OPERAND5_RGB_EXT 0x8595 -#define GL_OPERAND6_RGB_EXT 0x8596 -#define GL_OPERAND7_RGB_EXT 0x8597 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A -#define GL_OPERAND3_ALPHA_EXT 0x859B -#define GL_OPERAND4_ALPHA_EXT 0x859C -#define GL_OPERAND5_ALPHA_EXT 0x859D -#define GL_OPERAND6_ALPHA_EXT 0x859E -#define GL_OPERAND7_ALPHA_EXT 0x859F -#endif - -#ifndef GL_APPLE_specular_vector -#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 -#endif - -#ifndef GL_APPLE_transform_hint -#define GL_TRANSFORM_HINT_APPLE 0x85B1 -#endif - -#ifndef GL_SGIX_fog_scale -#define GL_FOG_SCALE_SGIX 0x81FC -#define GL_FOG_SCALE_VALUE_SGIX 0x81FD -#endif - -#ifndef GL_SUNX_constant_data -#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 -#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 -#endif - -#ifndef GL_SUN_global_alpha -#define GL_GLOBAL_ALPHA_SUN 0x81D9 -#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA -#endif - -#ifndef GL_SUN_triangle_list -#define GL_RESTART_SUN 0x01 -#define GL_REPLACE_MIDDLE_SUN 0x02 -#define GL_REPLACE_OLDEST_SUN 0x03 -#define GL_TRIANGLE_LIST_SUN 0x81D7 -#define GL_REPLACEMENT_CODE_SUN 0x81D8 -#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 -#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 -#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 -#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 -#define GL_R1UI_V3F_SUN 0x85C4 -#define GL_R1UI_C4UB_V3F_SUN 0x85C5 -#define GL_R1UI_C3F_V3F_SUN 0x85C6 -#define GL_R1UI_N3F_V3F_SUN 0x85C7 -#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 -#define GL_R1UI_T2F_V3F_SUN 0x85C9 -#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA -#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB -#endif - -#ifndef GL_SUN_vertex -#endif - -#ifndef GL_EXT_blend_func_separate -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB -#endif - -#ifndef GL_INGR_color_clamp -#define GL_RED_MIN_CLAMP_INGR 0x8560 -#define GL_GREEN_MIN_CLAMP_INGR 0x8561 -#define GL_BLUE_MIN_CLAMP_INGR 0x8562 -#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 -#define GL_RED_MAX_CLAMP_INGR 0x8564 -#define GL_GREEN_MAX_CLAMP_INGR 0x8565 -#define GL_BLUE_MAX_CLAMP_INGR 0x8566 -#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 -#endif - -#ifndef GL_INGR_interlace_read -#define GL_INTERLACE_READ_INGR 0x8568 -#endif - -#ifndef GL_EXT_stencil_wrap -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 -#endif - -#ifndef GL_EXT_422_pixels -#define GL_422_EXT 0x80CC -#define GL_422_REV_EXT 0x80CD -#define GL_422_AVERAGE_EXT 0x80CE -#define GL_422_REV_AVERAGE_EXT 0x80CF -#endif - -#ifndef GL_NV_texgen_reflection -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 -#endif - -#ifndef GL_EXT_texture_cube_map -#define GL_NORMAL_MAP_EXT 0x8511 -#define GL_REFLECTION_MAP_EXT 0x8512 -#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C -#endif - -#ifndef GL_SUN_convolution_border_modes -#define GL_WRAP_BORDER_SUN 0x81D4 -#endif - -#ifndef GL_EXT_texture_env_add -#endif - -#ifndef GL_EXT_texture_lod_bias -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 -#endif - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#endif - -#ifndef GL_EXT_vertex_weighting -#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH -#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 -#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX -#define GL_MODELVIEW_MATRIX1_EXT 0x8506 -#define GL_VERTEX_WEIGHTING_EXT 0x8509 -#define GL_MODELVIEW0_EXT GL_MODELVIEW -#define GL_MODELVIEW1_EXT 0x850A -#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B -#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C -#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D -#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E -#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F -#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 -#endif - -#ifndef GL_NV_light_max_exponent -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 -#endif - -#ifndef GL_NV_vertex_array_range -#define GL_VERTEX_ARRAY_RANGE_NV 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E -#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 -#endif - -#ifndef GL_NV_register_combiners -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 -/* reuse GL_TEXTURE0_ARB */ -/* reuse GL_TEXTURE1_ARB */ -/* reuse GL_ZERO */ -/* reuse GL_NONE */ -/* reuse GL_FOG */ -#endif - -#ifndef GL_NV_fog_distance -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C -/* reuse GL_EYE_PLANE */ -#endif - -#ifndef GL_NV_texgen_emboss -#define GL_EMBOSS_LIGHT_NV 0x855D -#define GL_EMBOSS_CONSTANT_NV 0x855E -#define GL_EMBOSS_MAP_NV 0x855F -#endif - -#ifndef GL_NV_blend_square -#endif - -#ifndef GL_NV_texture_env_combine4 -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B -#endif - -#ifndef GL_MESA_resize_buffers -#endif - -#ifndef GL_MESA_window_pos -#endif - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#endif - -#ifndef GL_IBM_cull_vertex -#define GL_CULL_VERTEX_IBM 103050 -#endif - -#ifndef GL_IBM_multimode_draw_arrays -#endif - -#ifndef GL_IBM_vertex_array_lists -#define GL_VERTEX_ARRAY_LIST_IBM 103070 -#define GL_NORMAL_ARRAY_LIST_IBM 103071 -#define GL_COLOR_ARRAY_LIST_IBM 103072 -#define GL_INDEX_ARRAY_LIST_IBM 103073 -#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 -#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 -#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 -#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 -#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 -#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 -#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 -#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 -#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 -#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 -#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 -#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 -#endif - -#ifndef GL_SGIX_subsample -#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 -#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 -#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 -#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 -#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 -#endif - -#ifndef GL_SGIX_ycrcb_subsample -#endif - -#ifndef GL_SGIX_ycrcba -#define GL_YCRCB_SGIX 0x8318 -#define GL_YCRCBA_SGIX 0x8319 -#endif - -#ifndef GL_SGI_depth_pass_instrument -#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 -#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 -#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 -#endif - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 -#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 -#endif - -#ifndef GL_3DFX_multisample -#define GL_MULTISAMPLE_3DFX 0x86B2 -#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 -#define GL_SAMPLES_3DFX 0x86B4 -#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 -#endif - -#ifndef GL_3DFX_tbuffer +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogCoordfEXT (GLfloat coord); +GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *coord); +GLAPI void APIENTRY glFogCoorddEXT (GLdouble coord); +GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *coord); +GLAPI void APIENTRY glFogCoordPointerEXT (GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_fog_coord */ + +#ifndef GL_EXT_framebuffer_blit +#define GL_EXT_framebuffer_blit 1 +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA +typedef void (APIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); #endif +#endif /* GL_EXT_framebuffer_blit */ -#ifndef GL_EXT_multisample -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F -#define GL_SAMPLE_MASK_EXT 0x80A0 -#define GL_1PASS_EXT 0x80A1 -#define GL_2PASS_0_EXT 0x80A2 -#define GL_2PASS_1_EXT 0x80A3 -#define GL_4PASS_0_EXT 0x80A4 -#define GL_4PASS_1_EXT 0x80A5 -#define GL_4PASS_2_EXT 0x80A6 -#define GL_4PASS_3_EXT 0x80A7 -#define GL_SAMPLE_BUFFERS_EXT 0x80A8 -#define GL_SAMPLES_EXT 0x80A9 -#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA -#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB -#define GL_SAMPLE_PATTERN_EXT 0x80AC +#ifndef GL_EXT_framebuffer_multisample +#define GL_EXT_framebuffer_multisample 1 +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_EXT_framebuffer_multisample */ + +#ifndef GL_EXT_framebuffer_multisample_blit_scaled +#define GL_EXT_framebuffer_multisample_blit_scaled 1 +#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA +#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB +#endif /* GL_EXT_framebuffer_multisample_blit_scaled */ + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint renderbuffer); +GLAPI void APIENTRY glBindRenderbufferEXT (GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers); +GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint framebuffer); +GLAPI void APIENTRY glBindFramebufferEXT (GLenum target, GLuint framebuffer); +GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers); +GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei n, GLuint *framebuffers); +GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum target); +GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateMipmapEXT (GLenum target); +#endif +#endif /* GL_EXT_framebuffer_object */ + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_EXT_framebuffer_sRGB 1 +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA +#endif /* GL_EXT_framebuffer_sRGB */ + +#ifndef GL_EXT_geometry_shader4 +#define GL_EXT_geometry_shader4 1 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_LINES_ADJACENCY_EXT 0x000A +#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B +#define GL_TRIANGLES_ADJACENCY_EXT 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); #endif +#endif /* GL_EXT_geometry_shader4 */ -#ifndef GL_SGIX_vertex_preclip -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF -#endif +#ifndef GL_EXT_gpu_program_parameters +#define GL_EXT_gpu_program_parameters 1 +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +#endif +#endif /* GL_EXT_gpu_program_parameters */ + +#ifndef GL_EXT_gpu_shader4 +#define GL_EXT_gpu_shader4 1 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT 0x8905 +typedef void (APIENTRYP PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetUniformuivEXT (GLuint program, GLint location, GLuint *params); +GLAPI void APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataLocationEXT (GLuint program, const GLchar *name); +GLAPI void APIENTRY glUniform1uiEXT (GLint location, GLuint v0); +GLAPI void APIENTRY glUniform2uiEXT (GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value); +#endif +#endif /* GL_EXT_gpu_shader4 */ -#ifndef GL_SGIX_convolution_accuracy -#define GL_CONVOLUTION_HINT_SGIX 0x8316 -#endif +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 +#define GL_TABLE_TOO_LARGE_EXT 0x8031 +typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glResetHistogramEXT (GLenum target); +GLAPI void APIENTRY glResetMinmaxEXT (GLenum target); +#endif +#endif /* GL_EXT_histogram */ -#ifndef GL_SGIX_resample -#define GL_PACK_RESAMPLE_SGIX 0x842C -#define GL_UNPACK_RESAMPLE_SGIX 0x842D -#define GL_RESAMPLE_REPLICATE_SGIX 0x842E -#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F -#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 -#endif +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 +#define GL_IUI_V2F_EXT 0x81AD +#define GL_IUI_V3F_EXT 0x81AE +#define GL_IUI_N3F_V2F_EXT 0x81AF +#define GL_IUI_N3F_V3F_EXT 0x81B0 +#define GL_T2F_IUI_V2F_EXT 0x81B1 +#define GL_T2F_IUI_V3F_EXT 0x81B2 +#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 +#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 +#endif /* GL_EXT_index_array_formats */ -#ifndef GL_SGIS_point_line_texgen -#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 -#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 -#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 -#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 -#define GL_EYE_POINT_SGIS 0x81F4 -#define GL_OBJECT_POINT_SGIS 0x81F5 -#define GL_EYE_LINE_SGIS 0x81F6 -#define GL_OBJECT_LINE_SGIS 0x81F7 +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 +#define GL_INDEX_TEST_EXT 0x81B5 +#define GL_INDEX_TEST_FUNC_EXT 0x81B6 +#define GL_INDEX_TEST_REF_EXT 0x81B7 +typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexFuncEXT (GLenum func, GLclampf ref); #endif +#endif /* GL_EXT_index_func */ -#ifndef GL_SGIS_texture_color_mask -#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 +#define GL_INDEX_MATERIAL_EXT 0x81B8 +#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 +#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA +typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexMaterialEXT (GLenum face, GLenum mode); #endif +#endif /* GL_EXT_index_material */ -/* NV_point_sprite */ -#define GL_POINT_SPRITE_NV 0x8861 -#define GL_COORD_REPLACE_NV 0x8862 -#define GL_POINT_SPRITE_R_MODE_NV 0x8863 -#define GL_NV_point_sprite 1 - -/*************************************************************/ +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 +#endif /* GL_EXT_index_texture */ -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glBlendColor (GLclampf, GLclampf, GLclampf, GLclampf); -extern void APIENTRY glBlendEquation (GLenum); -extern void APIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); -extern void APIENTRY glColorTable (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glColorTableParameterfv (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glColorTableParameteriv (GLenum, GLenum, const GLint *); -extern void APIENTRY glCopyColorTable (GLenum, GLenum, GLint, GLint, GLsizei); -extern void APIENTRY glGetColorTable (GLenum, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetColorTableParameterfv (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetColorTableParameteriv (GLenum, GLenum, GLint *); -extern void APIENTRY glColorSubTable (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glCopyColorSubTable (GLenum, GLsizei, GLint, GLint, GLsizei); -extern void APIENTRY glConvolutionFilter1D (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glConvolutionFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glConvolutionParameterf (GLenum, GLenum, GLfloat); -extern void APIENTRY glConvolutionParameterfv (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glConvolutionParameteri (GLenum, GLenum, GLint); -extern void APIENTRY glConvolutionParameteriv (GLenum, GLenum, const GLint *); -extern void APIENTRY glCopyConvolutionFilter1D (GLenum, GLenum, GLint, GLint, GLsizei); -extern void APIENTRY glCopyConvolutionFilter2D (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); -extern void APIENTRY glGetConvolutionFilter (GLenum, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetConvolutionParameterfv (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetConvolutionParameteriv (GLenum, GLenum, GLint *); -extern void APIENTRY glGetSeparableFilter (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); -extern void APIENTRY glSeparableFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); -extern void APIENTRY glGetHistogram (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetHistogramParameterfv (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetHistogramParameteriv (GLenum, GLenum, GLint *); -extern void APIENTRY glGetMinmax (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetMinmaxParameterfv (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetMinmaxParameteriv (GLenum, GLenum, GLint *); -extern void APIENTRY glHistogram (GLenum, GLsizei, GLenum, GLboolean); -extern void APIENTRY glMinmax (GLenum, GLenum, GLboolean); -extern void APIENTRY glResetHistogram (GLenum); -extern void APIENTRY glResetMinmax (GLenum); -extern void APIENTRY glTexImage3D (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glCopyTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -typedef void (APIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); -typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -typedef void (APIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (APIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); -typedef void (APIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); -typedef void (APIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glApplyTextureEXT (GLenum mode); +GLAPI void APIENTRY glTextureLightEXT (GLenum pname); +GLAPI void APIENTRY glTextureMaterialEXT (GLenum face, GLenum mode); #endif +#endif /* GL_EXT_light_texture */ -#ifndef GL_ARB_multitexture -#define GL_ARB_multitexture 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glActiveTextureARB (GLenum); -extern void APIENTRY glClientActiveTextureARB (GLenum); -extern void APIENTRY glMultiTexCoord1dARB (GLenum, GLdouble); -extern void APIENTRY glMultiTexCoord1dvARB (GLenum, const GLdouble *); -extern void APIENTRY glMultiTexCoord1fARB (GLenum, GLfloat); -extern void APIENTRY glMultiTexCoord1fvARB (GLenum, const GLfloat *); -extern void APIENTRY glMultiTexCoord1iARB (GLenum, GLint); -extern void APIENTRY glMultiTexCoord1ivARB (GLenum, const GLint *); -extern void APIENTRY glMultiTexCoord1sARB (GLenum, GLshort); -extern void APIENTRY glMultiTexCoord1svARB (GLenum, const GLshort *); -extern void APIENTRY glMultiTexCoord2dARB (GLenum, GLdouble, GLdouble); -extern void APIENTRY glMultiTexCoord2dvARB (GLenum, const GLdouble *); -extern void APIENTRY glMultiTexCoord2fARB (GLenum, GLfloat, GLfloat); -extern void APIENTRY glMultiTexCoord2fvARB (GLenum, const GLfloat *); -extern void APIENTRY glMultiTexCoord2iARB (GLenum, GLint, GLint); -extern void APIENTRY glMultiTexCoord2ivARB (GLenum, const GLint *); -extern void APIENTRY glMultiTexCoord2sARB (GLenum, GLshort, GLshort); -extern void APIENTRY glMultiTexCoord2svARB (GLenum, const GLshort *); -extern void APIENTRY glMultiTexCoord3dARB (GLenum, GLdouble, GLdouble, GLdouble); -extern void APIENTRY glMultiTexCoord3dvARB (GLenum, const GLdouble *); -extern void APIENTRY glMultiTexCoord3fARB (GLenum, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glMultiTexCoord3fvARB (GLenum, const GLfloat *); -extern void APIENTRY glMultiTexCoord3iARB (GLenum, GLint, GLint, GLint); -extern void APIENTRY glMultiTexCoord3ivARB (GLenum, const GLint *); -extern void APIENTRY glMultiTexCoord3sARB (GLenum, GLshort, GLshort, GLshort); -extern void APIENTRY glMultiTexCoord3svARB (GLenum, const GLshort *); -extern void APIENTRY glMultiTexCoord4dARB (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -extern void APIENTRY glMultiTexCoord4dvARB (GLenum, const GLdouble *); -extern void APIENTRY glMultiTexCoord4fARB (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glMultiTexCoord4fvARB (GLenum, const GLfloat *); -extern void APIENTRY glMultiTexCoord4iARB (GLenum, GLint, GLint, GLint, GLint); -extern void APIENTRY glMultiTexCoord4ivARB (GLenum, const GLint *); -extern void APIENTRY glMultiTexCoord4sARB (GLenum, GLshort, GLshort, GLshort, GLshort); -extern void APIENTRY glMultiTexCoord4svARB (GLenum, const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); -#endif +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 +#endif /* GL_EXT_misc_attribute */ -#ifndef GL_ARB_transpose_matrix -#define GL_ARB_transpose_matrix 1 +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *); -extern void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *); -extern void APIENTRY glMultTransposeMatrixfARB (const GLfloat *); -extern void APIENTRY glMultTransposeMatrixdARB (const GLdouble *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -typedef void (APIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); #endif +#endif /* GL_EXT_multi_draw_arrays */ -#ifndef GL_ARB_multisample -#define GL_ARB_multisample 1 +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 +typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSampleCoverageARB (GLclampf, GLboolean); -extern void APIENTRY glSamplePassARB (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRY * PFNGLSAMPLEPASSARBPROC) (GLenum pass); -#endif +GLAPI void APIENTRY glSampleMaskEXT (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glSamplePatternEXT (GLenum pattern); +#endif +#endif /* GL_EXT_multisample */ + +#ifndef GL_EXT_packed_depth_stencil +#define GL_EXT_packed_depth_stencil 1 +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 +#endif /* GL_EXT_packed_depth_stencil */ + +#ifndef GL_EXT_packed_float +#define GL_EXT_packed_float 1 +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C +#endif /* GL_EXT_packed_float */ -#ifndef GL_ARB_texture_env_add -#define GL_ARB_texture_env_add 1 -#endif +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 +#endif /* GL_EXT_packed_pixels */ -#ifndef GL_ARB_texture_cube_map -#define GL_ARB_texture_cube_map 1 +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glGetColorTableEXT (GLenum target, GLenum format, GLenum type, void *data); +GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); #endif +#endif /* GL_EXT_paletted_texture */ -#ifndef GL_ARB_texture_compression -#define GL_ARB_texture_compression 1 +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF +#endif /* GL_EXT_pixel_buffer_object */ + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -extern void APIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -extern void APIENTRY glCompressedTexImage1DARB (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); -extern void APIENTRY glCompressedTexSubImage3DARB (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -extern void APIENTRY glCompressedTexSubImage2DARB (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -extern void APIENTRY glCompressedTexSubImage1DARB (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); -extern void APIENTRY glGetCompressedTexImageARB (GLenum, GLint, void *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *img); +GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetPixelTransformParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetPixelTransformParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); #endif +#endif /* GL_EXT_pixel_transform */ -#ifndef GL_EXT_abgr -#define GL_EXT_abgr 1 -#endif +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 +#endif /* GL_EXT_pixel_transform_color_table */ -#ifndef GL_EXT_blend_color -#define GL_EXT_blend_color 1 +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glBlendColorEXT (GLclampf, GLclampf, GLclampf, GLclampf); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GLAPI void APIENTRY glPointParameterfEXT (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvEXT (GLenum pname, const GLfloat *params); #endif +#endif /* GL_EXT_point_parameters */ #ifndef GL_EXT_polygon_offset #define GL_EXT_polygon_offset 1 +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glPolygonOffsetEXT (GLfloat, GLfloat); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); -#endif - -#ifndef GL_EXT_texture -#define GL_EXT_texture 1 +GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat factor, GLfloat bias); #endif +#endif /* GL_EXT_polygon_offset */ -#ifndef GL_EXT_texture3D -#define GL_EXT_texture3D 1 +#ifndef GL_EXT_polygon_offset_clamp +#define GL_EXT_polygon_offset_clamp 1 +#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B +typedef void (APIENTRYP PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTexImage3DEXT (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glPolygonOffsetClampEXT (GLfloat factor, GLfloat units, GLfloat clamp); #endif +#endif /* GL_EXT_polygon_offset_clamp */ -#ifndef GL_SGIS_texture_filter4 -#define GL_SGIS_texture_filter4 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glGetTexFilterFuncSGIS (GLenum, GLenum, GLfloat *); -extern void APIENTRY glTexFilterFuncSGIS (GLenum, GLenum, GLsizei, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); -typedef void (APIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); -#endif +#ifndef GL_EXT_post_depth_coverage +#define GL_EXT_post_depth_coverage 1 +#endif /* GL_EXT_post_depth_coverage */ -#ifndef GL_EXT_subtexture -#define GL_EXT_subtexture 1 +#ifndef GL_EXT_provoking_vertex +#define GL_EXT_provoking_vertex 1 +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_PROVOKING_VERTEX_EXT 0x8E4F +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProvokingVertexEXT (GLenum mode); +#endif +#endif /* GL_EXT_provoking_vertex */ + +#ifndef GL_EXT_raster_multisample +#define GL_EXT_raster_multisample 1 +#define GL_RASTER_MULTISAMPLE_EXT 0x9327 +#define GL_RASTER_SAMPLES_EXT 0x9328 +#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 +#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A +#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B +#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C +typedef void (APIENTRYP PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTexSubImage1DEXT (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glRasterSamplesEXT (GLuint samples, GLboolean fixedsamplelocations); #endif +#endif /* GL_EXT_raster_multisample */ -#ifndef GL_EXT_copy_texture -#define GL_EXT_copy_texture 1 +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 +#define GL_RESCALE_NORMAL_EXT 0x803A +#endif /* GL_EXT_rescale_normal */ + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glSecondaryColor3iEXT (GLint red, GLint green, GLint blue); +GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *v); +GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue); +GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *v); +GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *v); +GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue); +GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *v); +GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue); +GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *v); +GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_secondary_color */ + +#ifndef GL_EXT_separate_shader_objects +#define GL_EXT_separate_shader_objects 1 +#define GL_ACTIVE_PROGRAM_EXT 0x8B8D +typedef void (APIENTRYP PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); +typedef void (APIENTRYP PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar *string); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glCopyTexImage1DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); -extern void APIENTRY glCopyTexImage2DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); -extern void APIENTRY glCopyTexSubImage1DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei); -extern void APIENTRY glCopyTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -extern void APIENTRY glCopyTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glUseShaderProgramEXT (GLenum type, GLuint program); +GLAPI void APIENTRY glActiveProgramEXT (GLuint program); +GLAPI GLuint APIENTRY glCreateShaderProgramEXT (GLenum type, const GLchar *string); #endif +#endif /* GL_EXT_separate_shader_objects */ -#ifndef GL_EXT_histogram -#define GL_EXT_histogram 1 +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA +#endif /* GL_EXT_separate_specular_color */ + +#ifndef GL_EXT_shader_image_load_formatted +#define GL_EXT_shader_image_load_formatted 1 +#endif /* GL_EXT_shader_image_load_formatted */ + +#ifndef GL_EXT_shader_image_load_store +#define GL_EXT_shader_image_load_store 1 +#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 +#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A +#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B +#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C +#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D +#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E +#define GL_IMAGE_1D_EXT 0x904C +#define GL_IMAGE_2D_EXT 0x904D +#define GL_IMAGE_3D_EXT 0x904E +#define GL_IMAGE_2D_RECT_EXT 0x904F +#define GL_IMAGE_CUBE_EXT 0x9050 +#define GL_IMAGE_BUFFER_EXT 0x9051 +#define GL_IMAGE_1D_ARRAY_EXT 0x9052 +#define GL_IMAGE_2D_ARRAY_EXT 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 +#define GL_INT_IMAGE_1D_EXT 0x9057 +#define GL_INT_IMAGE_2D_EXT 0x9058 +#define GL_INT_IMAGE_3D_EXT 0x9059 +#define GL_INT_IMAGE_2D_RECT_EXT 0x905A +#define GL_INT_IMAGE_CUBE_EXT 0x905B +#define GL_INT_IMAGE_BUFFER_EXT 0x905C +#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D +#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C +#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D +#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 +#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 +#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF +typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +typedef void (APIENTRYP PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glGetHistogramEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetHistogramParameterfvEXT (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetHistogramParameterivEXT (GLenum, GLenum, GLint *); -extern void APIENTRY glGetMinmaxEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetMinmaxParameterfvEXT (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetMinmaxParameterivEXT (GLenum, GLenum, GLint *); -extern void APIENTRY glHistogramEXT (GLenum, GLsizei, GLenum, GLboolean); -extern void APIENTRY glMinmaxEXT (GLenum, GLenum, GLboolean); -extern void APIENTRY glResetHistogramEXT (GLenum); -extern void APIENTRY glResetMinmaxEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); -typedef void (APIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); +GLAPI void APIENTRY glBindImageTextureEXT (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +GLAPI void APIENTRY glMemoryBarrierEXT (GLbitfield barriers); #endif +#endif /* GL_EXT_shader_image_load_store */ -#ifndef GL_EXT_convolution -#define GL_EXT_convolution 1 +#ifndef GL_EXT_shader_integer_mix +#define GL_EXT_shader_integer_mix 1 +#endif /* GL_EXT_shader_integer_mix */ + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 +#endif /* GL_EXT_shadow_funcs */ + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB +#endif /* GL_EXT_shared_texture_palette */ + +#ifndef GL_EXT_sparse_texture2 +#define GL_EXT_sparse_texture2 1 +#endif /* GL_EXT_sparse_texture2 */ + +#ifndef GL_EXT_stencil_clear_tag +#define GL_EXT_stencil_clear_tag 1 +#define GL_STENCIL_TAG_BITS_EXT 0x88F2 +#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 +typedef void (APIENTRYP PFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glConvolutionFilter1DEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glConvolutionFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glConvolutionParameterfEXT (GLenum, GLenum, GLfloat); -extern void APIENTRY glConvolutionParameterfvEXT (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glConvolutionParameteriEXT (GLenum, GLenum, GLint); -extern void APIENTRY glConvolutionParameterivEXT (GLenum, GLenum, const GLint *); -extern void APIENTRY glCopyConvolutionFilter1DEXT (GLenum, GLenum, GLint, GLint, GLsizei); -extern void APIENTRY glCopyConvolutionFilter2DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); -extern void APIENTRY glGetConvolutionFilterEXT (GLenum, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetConvolutionParameterfvEXT (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetConvolutionParameterivEXT (GLenum, GLenum, GLint *); -extern void APIENTRY glGetSeparableFilterEXT (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); -extern void APIENTRY glSeparableFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (APIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -#endif - -#ifndef GL_EXT_color_matrix -#define GL_EXT_color_matrix 1 +GLAPI void APIENTRY glStencilClearTagEXT (GLsizei stencilTagBits, GLuint stencilClearTag); #endif +#endif /* GL_EXT_stencil_clear_tag */ -#ifndef GL_SGI_color_table -#define GL_SGI_color_table 1 +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glColorTableSGI (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glColorTableParameterfvSGI (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glColorTableParameterivSGI (GLenum, GLenum, const GLint *); -extern void APIENTRY glCopyColorTableSGI (GLenum, GLenum, GLint, GLint, GLsizei); -extern void APIENTRY glGetColorTableSGI (GLenum, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetColorTableParameterfvSGI (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetColorTableParameterivSGI (GLenum, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum face); #endif +#endif /* GL_EXT_stencil_two_side */ -#ifndef GL_SGIX_pixel_texture -#define GL_SGIX_pixel_texture 1 +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 +#endif /* GL_EXT_stencil_wrap */ + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 +typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glPixelTexGenSGIX (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); +GLAPI void APIENTRY glTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); #endif +#endif /* GL_EXT_subtexture */ -#ifndef GL_SGIS_pixel_texture -#define GL_SGIS_pixel_texture 1 +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 +#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#endif /* GL_EXT_texture */ + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glPixelTexGenParameteriSGIS (GLenum, GLint); -extern void APIENTRY glPixelTexGenParameterivSGIS (GLenum, const GLint *); -extern void APIENTRY glPixelTexGenParameterfSGIS (GLenum, GLfloat); -extern void APIENTRY glPixelTexGenParameterfvSGIS (GLenum, const GLfloat *); -extern void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum, GLint *); -extern void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); -#endif +GLAPI void APIENTRY glTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +#endif +#endif /* GL_EXT_texture3D */ + +#ifndef GL_EXT_texture_array +#define GL_EXT_texture_array 1 +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +#endif +#endif /* GL_EXT_texture_array */ + +#ifndef GL_EXT_texture_buffer_object +#define GL_EXT_texture_buffer_object 1 +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E +typedef void (APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); +#endif +#endif /* GL_EXT_texture_buffer_object */ + +#ifndef GL_EXT_texture_compression_latc +#define GL_EXT_texture_compression_latc 1 +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 +#endif /* GL_EXT_texture_compression_latc */ + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE +#endif /* GL_EXT_texture_compression_rgtc */ -#ifndef GL_SGIS_texture4D -#define GL_SGIS_texture4D 1 +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif /* GL_EXT_texture_compression_s3tc */ + +#ifndef GL_EXT_texture_cube_map +#define GL_EXT_texture_cube_map 1 +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C +#endif /* GL_EXT_texture_cube_map */ + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 +#endif /* GL_EXT_texture_env_add */ + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A +#endif /* GL_EXT_texture_env_combine */ + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 +#endif /* GL_EXT_texture_env_dot3 */ + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif /* GL_EXT_texture_filter_anisotropic */ + +#ifndef GL_EXT_texture_filter_minmax +#define GL_EXT_texture_filter_minmax 1 +#endif /* GL_EXT_texture_filter_minmax */ + +#ifndef GL_EXT_texture_integer +#define GL_EXT_texture_integer 1 +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGB8UI_EXT 0x8D7D +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGB32I_EXT 0x8D83 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGB16I_EXT 0x8D89 +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGB8I_EXT 0x8D8F +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E +typedef void (APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); +typedef void (APIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTexImage4DSGIS (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glTexSubImage4DSGIS (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha); +GLAPI void APIENTRY glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha); #endif +#endif /* GL_EXT_texture_integer */ -#ifndef GL_SGI_texture_color_table -#define GL_SGI_texture_color_table 1 -#endif +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif /* GL_EXT_texture_lod_bias */ -#ifndef GL_EXT_cmyka -#define GL_EXT_cmyka 1 -#endif +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 +#endif /* GL_EXT_texture_mirror_clamp */ #ifndef GL_EXT_texture_object #define GL_EXT_texture_object 1 +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A +typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); +typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); #ifdef GL_GLEXT_PROTOTYPES -extern GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei, const GLuint *, GLboolean *); -extern void APIENTRY glBindTextureEXT (GLenum, GLuint); -extern void APIENTRY glDeleteTexturesEXT (GLsizei, const GLuint *); -extern void APIENTRY glGenTexturesEXT (GLsizei, GLuint *); -extern GLboolean APIENTRY glIsTextureEXT (GLuint); -extern void APIENTRY glPrioritizeTexturesEXT (GLsizei, const GLuint *, const GLclampf *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); -typedef void (APIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); -typedef void (APIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); -typedef void (APIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); -typedef GLboolean (APIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); -typedef void (APIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); +GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei n, const GLuint *textures, GLboolean *residences); +GLAPI void APIENTRY glBindTextureEXT (GLenum target, GLuint texture); +GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei n, const GLuint *textures); +GLAPI void APIENTRY glGenTexturesEXT (GLsizei n, GLuint *textures); +GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint texture); +GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei n, const GLuint *textures, const GLclampf *priorities); #endif +#endif /* GL_EXT_texture_object */ -#ifndef GL_SGIS_detail_texture -#define GL_SGIS_detail_texture 1 +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF +typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glDetailTexFuncSGIS (GLenum, GLsizei, const GLfloat *); -extern void APIENTRY glGetDetailTexFuncSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#endif - -#ifndef GL_SGIS_sharpen_texture -#define GL_SGIS_sharpen_texture 1 +GLAPI void APIENTRY glTextureNormalEXT (GLenum mode); +#endif +#endif /* GL_EXT_texture_perturb_normal */ + +#ifndef GL_EXT_texture_sRGB +#define GL_EXT_texture_sRGB 1 +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB8_EXT 0x8C41 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 +#define GL_SLUMINANCE_EXT 0x8C46 +#define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_COMPRESSED_SRGB_EXT 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F +#endif /* GL_EXT_texture_sRGB */ + +#ifndef GL_EXT_texture_sRGB_decode +#define GL_EXT_texture_sRGB_decode 1 +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#define GL_DECODE_EXT 0x8A49 +#define GL_SKIP_DECODE_EXT 0x8A4A +#endif /* GL_EXT_texture_sRGB_decode */ + +#ifndef GL_EXT_texture_shared_exponent +#define GL_EXT_texture_shared_exponent 1 +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F +#endif /* GL_EXT_texture_shared_exponent */ + +#ifndef GL_EXT_texture_snorm +#define GL_EXT_texture_snorm 1 +#define GL_ALPHA_SNORM 0x9010 +#define GL_LUMINANCE_SNORM 0x9011 +#define GL_LUMINANCE_ALPHA_SNORM 0x9012 +#define GL_INTENSITY_SNORM 0x9013 +#define GL_ALPHA8_SNORM 0x9014 +#define GL_LUMINANCE8_SNORM 0x9015 +#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 +#define GL_INTENSITY8_SNORM 0x9017 +#define GL_ALPHA16_SNORM 0x9018 +#define GL_LUMINANCE16_SNORM 0x9019 +#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A +#define GL_INTENSITY16_SNORM 0x901B +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 +#endif /* GL_EXT_texture_snorm */ + +#ifndef GL_EXT_texture_swizzle +#define GL_EXT_texture_swizzle 1 +#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 +#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 +#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 +#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 +#endif /* GL_EXT_texture_swizzle */ + +#ifndef GL_EXT_timer_query +#define GL_EXT_timer_query 1 +#define GL_TIME_ELAPSED_EXT 0x88BF +typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSharpenTexFuncSGIS (GLenum, GLsizei, const GLfloat *); -extern void APIENTRY glGetSharpenTexFuncSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#endif - -#ifndef GL_EXT_packed_pixels -#define GL_EXT_packed_pixels 1 -#endif - -#ifndef GL_SGIS_texture_lod -#define GL_SGIS_texture_lod 1 -#endif - -#ifndef GL_SGIS_multisample -#define GL_SGIS_multisample 1 +GLAPI void APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params); +#endif +#endif /* GL_EXT_timer_query */ + +#ifndef GL_EXT_transform_feedback +#define GL_EXT_transform_feedback 1 +#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F +#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C +#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 +#define GL_RASTERIZER_DISCARD_EXT 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (APIENTRYP PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSampleMaskSGIS (GLclampf, GLboolean); -extern void APIENTRY glSamplePatternSGIS (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); -#endif - -#ifndef GL_EXT_rescale_normal -#define GL_EXT_rescale_normal 1 +GLAPI void APIENTRY glBeginTransformFeedbackEXT (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedbackEXT (void); +GLAPI void APIENTRY glBindBufferRangeEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferOffsetEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +GLAPI void APIENTRY glBindBufferBaseEXT (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryingsEXT (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +GLAPI void APIENTRY glGetTransformFeedbackVaryingEXT (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); #endif +#endif /* GL_EXT_transform_feedback */ #ifndef GL_EXT_vertex_array #define GL_EXT_vertex_array 1 +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 +typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); +typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, void **params); +typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glArrayElementEXT (GLint); -extern void APIENTRY glColorPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -extern void APIENTRY glDrawArraysEXT (GLenum, GLint, GLsizei); -extern void APIENTRY glEdgeFlagPointerEXT (GLsizei, GLsizei, const GLboolean *); -extern void APIENTRY glGetPointervEXT (GLenum, GLvoid* *); -extern void APIENTRY glIndexPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); -extern void APIENTRY glNormalPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); -extern void APIENTRY glTexCoordPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -extern void APIENTRY glVertexPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); -typedef void (APIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); -typedef void (APIENTRY * PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); -typedef void (APIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_misc_attribute -#define GL_EXT_misc_attribute 1 -#endif - -#ifndef GL_SGIS_generate_mipmap -#define GL_SGIS_generate_mipmap 1 -#endif - -#ifndef GL_SGIX_clipmap -#define GL_SGIX_clipmap 1 -#endif - -#ifndef GL_SGIX_shadow -#define GL_SGIX_shadow 1 -#endif - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_SGIS_texture_edge_clamp 1 -#endif - -#ifndef GL_SGIS_texture_border_clamp -#define GL_SGIS_texture_border_clamp 1 -#endif - -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 +GLAPI void APIENTRY glArrayElementEXT (GLint i); +GLAPI void APIENTRY glColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glDrawArraysEXT (GLenum mode, GLint first, GLsizei count); +GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean *pointer); +GLAPI void APIENTRY glGetPointervEXT (GLenum pname, void **params); +GLAPI void APIENTRY glIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +#endif +#endif /* GL_EXT_vertex_array */ + +#ifndef GL_EXT_vertex_array_bgra +#define GL_EXT_vertex_array_bgra 1 +#endif /* GL_EXT_vertex_array_bgra */ + +#ifndef GL_EXT_vertex_attrib_64bit +#define GL_EXT_vertex_attrib_64bit 1 +#define GL_DOUBLE_VEC2_EXT 0x8FFC +#define GL_DOUBLE_VEC3_EXT 0x8FFD +#define GL_DOUBLE_VEC4_EXT 0x8FFE +#define GL_DOUBLE_MAT2_EXT 0x8F46 +#define GL_DOUBLE_MAT3_EXT 0x8F47 +#define GL_DOUBLE_MAT4_EXT 0x8F48 +#define GL_DOUBLE_MAT2x3_EXT 0x8F49 +#define GL_DOUBLE_MAT2x4_EXT 0x8F4A +#define GL_DOUBLE_MAT3x2_EXT 0x8F4B +#define GL_DOUBLE_MAT3x4_EXT 0x8F4C +#define GL_DOUBLE_MAT4x2_EXT 0x8F4D +#define GL_DOUBLE_MAT4x3_EXT 0x8F4E +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glBlendEquationEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_blend_subtract -#define GL_EXT_blend_subtract 1 -#endif - -#ifndef GL_EXT_blend_logic_op -#define GL_EXT_blend_logic_op 1 -#endif - -#ifndef GL_SGIX_interlace -#define GL_SGIX_interlace 1 -#endif - -#ifndef GL_SGIX_pixel_tiles -#define GL_SGIX_pixel_tiles 1 -#endif - -#ifndef GL_SGIX_texture_select -#define GL_SGIX_texture_select 1 -#endif +GLAPI void APIENTRY glVertexAttribL1dEXT (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttribL2dEXT (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttribL3dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttribL4dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttribL1dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL2dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL3dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL4dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribLPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribLdvEXT (GLuint index, GLenum pname, GLdouble *params); +#endif +#endif /* GL_EXT_vertex_attrib_64bit */ + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED +typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const void *addr); +typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const void *addr); +typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); +typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); +typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); +typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); +typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); +typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); +typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); +typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); +typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const void *addr); +typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data); +typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVertexShaderEXT (void); +GLAPI void APIENTRY glEndVertexShaderEXT (void); +GLAPI void APIENTRY glBindVertexShaderEXT (GLuint id); +GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint range); +GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint id); +GLAPI void APIENTRY glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1); +GLAPI void APIENTRY glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +GLAPI void APIENTRY glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +GLAPI void APIENTRY glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +GLAPI void APIENTRY glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +GLAPI void APIENTRY glInsertComponentEXT (GLuint res, GLuint src, GLuint num); +GLAPI void APIENTRY glExtractComponentEXT (GLuint res, GLuint src, GLuint num); +GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +GLAPI void APIENTRY glSetInvariantEXT (GLuint id, GLenum type, const void *addr); +GLAPI void APIENTRY glSetLocalConstantEXT (GLuint id, GLenum type, const void *addr); +GLAPI void APIENTRY glVariantbvEXT (GLuint id, const GLbyte *addr); +GLAPI void APIENTRY glVariantsvEXT (GLuint id, const GLshort *addr); +GLAPI void APIENTRY glVariantivEXT (GLuint id, const GLint *addr); +GLAPI void APIENTRY glVariantfvEXT (GLuint id, const GLfloat *addr); +GLAPI void APIENTRY glVariantdvEXT (GLuint id, const GLdouble *addr); +GLAPI void APIENTRY glVariantubvEXT (GLuint id, const GLubyte *addr); +GLAPI void APIENTRY glVariantusvEXT (GLuint id, const GLushort *addr); +GLAPI void APIENTRY glVariantuivEXT (GLuint id, const GLuint *addr); +GLAPI void APIENTRY glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, const void *addr); +GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint id); +GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint id); +GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum light, GLenum value); +GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum face, GLenum value); +GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value); +GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum unit, GLenum value); +GLAPI GLuint APIENTRY glBindParameterEXT (GLenum value); +GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint id, GLenum cap); +GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +GLAPI void APIENTRY glGetVariantPointervEXT (GLuint id, GLenum value, void **data); +GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +#endif +#endif /* GL_EXT_vertex_shader */ -#ifndef GL_SGIX_sprite -#define GL_SGIX_sprite 1 +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 +#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW0_EXT 0x1700 +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSpriteParameterfSGIX (GLenum, GLfloat); -extern void APIENTRY glSpriteParameterfvSGIX (GLenum, const GLfloat *); -extern void APIENTRY glSpriteParameteriSGIX (GLenum, GLint); -extern void APIENTRY glSpriteParameterivSGIX (GLenum, const GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); +GLAPI void APIENTRY glVertexWeightfEXT (GLfloat weight); +GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *weight); +GLAPI void APIENTRY glVertexWeightPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer); #endif +#endif /* GL_EXT_vertex_weighting */ -#ifndef GL_SGIX_texture_multi_buffer -#define GL_SGIX_texture_multi_buffer 1 +#ifndef GL_EXT_x11_sync_object +#define GL_EXT_x11_sync_object 1 +#define GL_SYNC_X11_FENCE_EXT 0x90E1 +typedef GLsync (APIENTRYP PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLsync APIENTRY glImportSyncEXT (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); #endif +#endif /* GL_EXT_x11_sync_object */ -#ifndef GL_EXT_point_parameters -#define GL_EXT_point_parameters 1 +#ifndef GL_GREMEDY_frame_terminator +#define GL_GREMEDY_frame_terminator 1 +typedef void (APIENTRYP PFNGLFRAMETERMINATORGREMEDYPROC) (void); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glPointParameterfEXT (GLenum, GLfloat); -extern void APIENTRY glPointParameterfvEXT (GLenum, const GLfloat *); -extern void APIENTRY glPointParameterfSGIS (GLenum, GLfloat); -extern void APIENTRY glPointParameterfvSGIS (GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFrameTerminatorGREMEDY (void); #endif +#endif /* GL_GREMEDY_frame_terminator */ -#ifndef GL_SGIX_instruments -#define GL_SGIX_instruments 1 +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 +typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string); #ifdef GL_GLEXT_PROTOTYPES -extern GLint APIENTRY glGetInstrumentsSGIX (void); -extern void APIENTRY glInstrumentsBufferSGIX (GLsizei, GLint *); -extern GLint APIENTRY glPollInstrumentsSGIX (GLint *); -extern void APIENTRY glReadInstrumentsSGIX (GLint); -extern void APIENTRY glStartInstrumentsSGIX (void); -extern void APIENTRY glStopInstrumentsSGIX (GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLint (APIENTRY * PFNGLGETINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRY * PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); -typedef GLint (APIENTRY * PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); -typedef void (APIENTRY * PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); -typedef void (APIENTRY * PFNGLSTARTINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRY * PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); +GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei len, const void *string); #endif +#endif /* GL_GREMEDY_string_marker */ -#ifndef GL_SGIX_texture_scale_bias -#define GL_SGIX_texture_scale_bias 1 -#endif +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 +#define GL_IGNORE_BORDER_HP 0x8150 +#define GL_CONSTANT_BORDER_HP 0x8151 +#define GL_REPLICATE_BORDER_HP 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 +#endif /* GL_HP_convolution_border_modes */ -#ifndef GL_SGIX_framezoom -#define GL_SGIX_framezoom 1 +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 +#define GL_IMAGE_SCALE_X_HP 0x8155 +#define GL_IMAGE_SCALE_Y_HP 0x8156 +#define GL_IMAGE_TRANSLATE_X_HP 0x8157 +#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 +#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 +#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A +#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B +#define GL_IMAGE_MAG_FILTER_HP 0x815C +#define GL_IMAGE_MIN_FILTER_HP 0x815D +#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E +#define GL_CUBIC_HP 0x815F +#define GL_AVERAGE_HP 0x8160 +#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 +#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 +#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFrameZoomSGIX (GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); +GLAPI void APIENTRY glImageTransformParameteriHP (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glImageTransformParameterfHP (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glImageTransformParameterivHP (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum target, GLenum pname, GLfloat *params); #endif +#endif /* GL_HP_image_transform */ -#ifndef GL_SGIX_tag_sample_buffer -#define GL_SGIX_tag_sample_buffer 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTagSampleBufferSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); -#endif +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 +#endif /* GL_HP_occlusion_test */ -#ifndef GL_SGIX_reference_plane -#define GL_SGIX_reference_plane 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glReferencePlaneSGIX (const GLdouble *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); -#endif +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 +#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 +#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 +#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 +#endif /* GL_HP_texture_lighting */ -#ifndef GL_SGIX_flush_raster -#define GL_SGIX_flush_raster 1 +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 +#define GL_CULL_VERTEX_IBM 103050 +#endif /* GL_IBM_cull_vertex */ + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 +typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFlushRasterSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); +GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride); #endif +#endif /* GL_IBM_multimode_draw_arrays */ -#ifndef GL_SGIX_depth_texture -#define GL_SGIX_depth_texture 1 -#endif +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 +#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 +#endif /* GL_IBM_rasterpos_clip */ -#ifndef GL_SGIS_fog_function -#define GL_SGIS_fog_function 1 +#ifndef GL_IBM_static_data +#define GL_IBM_static_data 1 +#define GL_ALL_STATIC_DATA_IBM 103060 +#define GL_STATIC_VERTEX_ARRAY_IBM 103061 +typedef void (APIENTRYP PFNGLFLUSHSTATICDATAIBMPROC) (GLenum target); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFogFuncSGIS (GLsizei, const GLfloat *); -extern void APIENTRY glGetFogFuncSGIS (const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); -typedef void (APIENTRY * PFNGLGETFOGFUNCSGISPROC) (const GLfloat *points); +GLAPI void APIENTRY glFlushStaticDataIBM (GLenum target); #endif +#endif /* GL_IBM_static_data */ -#ifndef GL_SGIX_fog_offset -#define GL_SGIX_fog_offset 1 -#endif +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_IBM_texture_mirrored_repeat 1 +#define GL_MIRRORED_REPEAT_IBM 0x8370 +#endif /* GL_IBM_texture_mirrored_repeat */ -#ifndef GL_HP_image_transform -#define GL_HP_image_transform 1 +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 +typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint stride, const GLboolean **pointer, GLint ptrstride); +GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glIndexPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glNormalPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glVertexPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +#endif +#endif /* GL_IBM_vertex_array_lists */ + +#ifndef GL_INGR_blend_func_separate +#define GL_INGR_blend_func_separate 1 +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glImageTransformParameteriHP (GLenum, GLenum, GLint); -extern void APIENTRY glImageTransformParameterfHP (GLenum, GLenum, GLfloat); -extern void APIENTRY glImageTransformParameterivHP (GLenum, GLenum, const GLint *); -extern void APIENTRY glImageTransformParameterfvHP (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glGetImageTransformParameterivHP (GLenum, GLenum, GLint *); -extern void APIENTRY glGetImageTransformParameterfvHP (GLenum, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #endif +#endif /* GL_INGR_blend_func_separate */ -#ifndef GL_HP_convolution_border_modes -#define GL_HP_convolution_border_modes 1 -#endif +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 +#endif /* GL_INGR_color_clamp */ -#ifndef GL_SGIX_texture_add_env -#define GL_SGIX_texture_add_env 1 +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 +#define GL_INTERLACE_READ_INGR 0x8568 +#endif /* GL_INGR_interlace_read */ + +#ifndef GL_INTEL_fragment_shader_ordering +#define GL_INTEL_fragment_shader_ordering 1 +#endif /* GL_INTEL_fragment_shader_ordering */ + +#ifndef GL_INTEL_map_texture +#define GL_INTEL_map_texture 1 +#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF +#define GL_LAYOUT_DEFAULT_INTEL 0 +#define GL_LAYOUT_LINEAR_INTEL 1 +#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 +typedef void (APIENTRYP PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); +typedef void *(APIENTRYP PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSyncTextureINTEL (GLuint texture); +GLAPI void APIENTRY glUnmapTexture2DINTEL (GLuint texture, GLint level); +GLAPI void *APIENTRY glMapTexture2DINTEL (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout); #endif +#endif /* GL_INTEL_map_texture */ -#ifndef GL_EXT_color_subtable -#define GL_EXT_color_subtable 1 +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 +typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glColorSubTableEXT (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glCopyColorSubTableEXT (GLenum, GLsizei, GLint, GLint, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -#endif +GLAPI void APIENTRY glVertexPointervINTEL (GLint size, GLenum type, const void **pointer); +GLAPI void APIENTRY glNormalPointervINTEL (GLenum type, const void **pointer); +GLAPI void APIENTRY glColorPointervINTEL (GLint size, GLenum type, const void **pointer); +GLAPI void APIENTRY glTexCoordPointervINTEL (GLint size, GLenum type, const void **pointer); +#endif +#endif /* GL_INTEL_parallel_arrays */ + +#ifndef GL_INTEL_performance_query +#define GL_INTEL_performance_query 1 +#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000 +#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001 +#define GL_PERFQUERY_WAIT_INTEL 0x83FB +#define GL_PERFQUERY_FLUSH_INTEL 0x83FA +#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 +#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 +#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 +#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 +#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 +#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 +#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 +#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 +#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 +#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA +#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB +#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC +#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD +#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE +#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF +#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 +typedef void (APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle); +typedef void (APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId); +typedef void (APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId); +typedef void (APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +typedef void (APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); +typedef void (APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId); +typedef void (APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle); +GLAPI void APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glEndPerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId); +GLAPI void APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId); +GLAPI void APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +GLAPI void APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); +GLAPI void APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId); +GLAPI void APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); +#endif +#endif /* GL_INTEL_performance_query */ + +#ifndef GL_MESAX_texture_stack +#define GL_MESAX_texture_stack 1 +#define GL_TEXTURE_1D_STACK_MESAX 0x8759 +#define GL_TEXTURE_2D_STACK_MESAX 0x875A +#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B +#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C +#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D +#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E +#endif /* GL_MESAX_texture_stack */ + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 +#define GL_PACK_INVERT_MESA 0x8758 +#endif /* GL_MESA_pack_invert */ -#ifndef GL_PGI_vertex_hints -#define GL_PGI_vertex_hints 1 +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 +typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glResizeBuffersMESA (void); #endif +#endif /* GL_MESA_resize_buffers */ -#ifndef GL_PGI_misc_hints -#define GL_PGI_misc_hints 1 +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 +typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dMESA (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2fMESA (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2iMESA (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos2sMESA (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *v); +GLAPI void APIENTRY glWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3iMESA (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos3sMESA (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *v); +GLAPI void APIENTRY glWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *v); +#endif +#endif /* GL_MESA_window_pos */ + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 +#endif /* GL_MESA_ycbcr_texture */ + +#ifndef GL_NVX_conditional_render +#define GL_NVX_conditional_render 1 +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVXPROC) (void); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glHintPGI (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLHINTPGIPROC) (GLenum target, GLint mode); +GLAPI void APIENTRY glBeginConditionalRenderNVX (GLuint id); +GLAPI void APIENTRY glEndConditionalRenderNVX (void); +#endif +#endif /* GL_NVX_conditional_render */ + +#ifndef GL_NVX_gpu_memory_info +#define GL_NVX_gpu_memory_info 1 +#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 +#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 +#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 +#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A +#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B +#endif /* GL_NVX_gpu_memory_info */ + +#ifndef GL_NV_bindless_multi_draw_indirect +#define GL_NV_bindless_multi_draw_indirect 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); #endif +#endif /* GL_NV_bindless_multi_draw_indirect */ -#ifndef GL_EXT_paletted_texture -#define GL_EXT_paletted_texture 1 +#ifndef GL_NV_bindless_multi_draw_indirect_count +#define GL_NV_bindless_multi_draw_indirect_count 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessCountNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessCountNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +#endif +#endif /* GL_NV_bindless_multi_draw_indirect_count */ + +#ifndef GL_NV_bindless_texture +#define GL_NV_bindless_texture 1 +typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); +typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glColorTableEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glGetColorTableEXT (GLenum, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetColorTableParameterivEXT (GLenum, GLenum, GLint *); -extern void APIENTRY glGetColorTableParameterfvEXT (GLenum, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +GLAPI GLuint64 APIENTRY glGetTextureHandleNV (GLuint texture); +GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler); +GLAPI void APIENTRY glMakeTextureHandleResidentNV (GLuint64 handle); +GLAPI void APIENTRY glMakeTextureHandleNonResidentNV (GLuint64 handle); +GLAPI GLuint64 APIENTRY glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +GLAPI void APIENTRY glMakeImageHandleResidentNV (GLuint64 handle, GLenum access); +GLAPI void APIENTRY glMakeImageHandleNonResidentNV (GLuint64 handle); +GLAPI void APIENTRY glUniformHandleui64NV (GLint location, GLuint64 value); +GLAPI void APIENTRY glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value); +GLAPI void APIENTRY glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +GLAPI GLboolean APIENTRY glIsTextureHandleResidentNV (GLuint64 handle); +GLAPI GLboolean APIENTRY glIsImageHandleResidentNV (GLuint64 handle); +#endif +#endif /* GL_NV_bindless_texture */ + +#ifndef GL_NV_blend_equation_advanced +#define GL_NV_blend_equation_advanced 1 +#define GL_BLEND_OVERLAP_NV 0x9281 +#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 +#define GL_BLUE_NV 0x1905 +#define GL_COLORBURN_NV 0x929A +#define GL_COLORDODGE_NV 0x9299 +#define GL_CONJOINT_NV 0x9284 +#define GL_CONTRAST_NV 0x92A1 +#define GL_DARKEN_NV 0x9297 +#define GL_DIFFERENCE_NV 0x929E +#define GL_DISJOINT_NV 0x9283 +#define GL_DST_ATOP_NV 0x928F +#define GL_DST_IN_NV 0x928B +#define GL_DST_NV 0x9287 +#define GL_DST_OUT_NV 0x928D +#define GL_DST_OVER_NV 0x9289 +#define GL_EXCLUSION_NV 0x92A0 +#define GL_GREEN_NV 0x1904 +#define GL_HARDLIGHT_NV 0x929B +#define GL_HARDMIX_NV 0x92A9 +#define GL_HSL_COLOR_NV 0x92AF +#define GL_HSL_HUE_NV 0x92AD +#define GL_HSL_LUMINOSITY_NV 0x92B0 +#define GL_HSL_SATURATION_NV 0x92AE +#define GL_INVERT_OVG_NV 0x92B4 +#define GL_INVERT_RGB_NV 0x92A3 +#define GL_LIGHTEN_NV 0x9298 +#define GL_LINEARBURN_NV 0x92A5 +#define GL_LINEARDODGE_NV 0x92A4 +#define GL_LINEARLIGHT_NV 0x92A7 +#define GL_MINUS_CLAMPED_NV 0x92B3 +#define GL_MINUS_NV 0x929F +#define GL_MULTIPLY_NV 0x9294 +#define GL_OVERLAY_NV 0x9296 +#define GL_PINLIGHT_NV 0x92A8 +#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 +#define GL_PLUS_CLAMPED_NV 0x92B1 +#define GL_PLUS_DARKER_NV 0x9292 +#define GL_PLUS_NV 0x9291 +#define GL_RED_NV 0x1903 +#define GL_SCREEN_NV 0x9295 +#define GL_SOFTLIGHT_NV 0x929C +#define GL_SRC_ATOP_NV 0x928E +#define GL_SRC_IN_NV 0x928A +#define GL_SRC_NV 0x9286 +#define GL_SRC_OUT_NV 0x928C +#define GL_SRC_OVER_NV 0x9288 +#define GL_UNCORRELATED_NV 0x9282 +#define GL_VIVIDLIGHT_NV 0x92A6 +#define GL_XOR_NV 0x1506 +typedef void (APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLBLENDBARRIERNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendParameteriNV (GLenum pname, GLint value); +GLAPI void APIENTRY glBlendBarrierNV (void); #endif +#endif /* GL_NV_blend_equation_advanced */ -#ifndef GL_EXT_clip_volume_hint -#define GL_EXT_clip_volume_hint 1 -#endif +#ifndef GL_NV_blend_equation_advanced_coherent +#define GL_NV_blend_equation_advanced_coherent 1 +#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 +#endif /* GL_NV_blend_equation_advanced_coherent */ -#ifndef GL_SGIX_list_priority -#define GL_SGIX_list_priority 1 +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 +#endif /* GL_NV_blend_square */ + +#ifndef GL_NV_compute_program5 +#define GL_NV_compute_program5 1 +#define GL_COMPUTE_PROGRAM_NV 0x90FB +#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC +#endif /* GL_NV_compute_program5 */ + +#ifndef GL_NV_conditional_render +#define GL_NV_conditional_render 1 +#define GL_QUERY_WAIT_NV 0x8E13 +#define GL_QUERY_NO_WAIT_NV 0x8E14 +#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glGetListParameterfvSGIX (GLuint, GLenum, GLfloat *); -extern void APIENTRY glGetListParameterivSGIX (GLuint, GLenum, GLint *); -extern void APIENTRY glListParameterfSGIX (GLuint, GLenum, GLfloat); -extern void APIENTRY glListParameterfvSGIX (GLuint, GLenum, const GLfloat *); -extern void APIENTRY glListParameteriSGIX (GLuint, GLenum, GLint); -extern void APIENTRY glListParameterivSGIX (GLuint, GLenum, const GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); +GLAPI void APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode); +GLAPI void APIENTRY glEndConditionalRenderNV (void); +#endif +#endif /* GL_NV_conditional_render */ + +#ifndef GL_NV_conservative_raster +#define GL_NV_conservative_raster 1 +#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 +#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 +#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 +#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 +typedef void (APIENTRYP PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSubpixelPrecisionBiasNV (GLuint xbits, GLuint ybits); #endif +#endif /* GL_NV_conservative_raster */ -#ifndef GL_SGIX_ir_instrument1 -#define GL_SGIX_ir_instrument1 1 -#endif +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F +#endif /* GL_NV_copy_depth_to_color */ -#ifndef GL_SGIX_calligraphic_fragment -#define GL_SGIX_calligraphic_fragment 1 +#ifndef GL_NV_copy_image +#define GL_NV_copy_image 1 +typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyImageSubDataNV (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +#endif +#endif /* GL_NV_copy_image */ + +#ifndef GL_NV_deep_texture3D +#define GL_NV_deep_texture3D 1 +#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 +#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 +#endif /* GL_NV_deep_texture3D */ + +#ifndef GL_NV_depth_buffer_float +#define GL_NV_depth_buffer_float 1 +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF +typedef void (APIENTRYP PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); +typedef void (APIENTRYP PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthRangedNV (GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glClearDepthdNV (GLdouble depth); +GLAPI void APIENTRY glDepthBoundsdNV (GLdouble zmin, GLdouble zmax); #endif +#endif /* GL_NV_depth_buffer_float */ -#ifndef GL_SGIX_texture_lod_bias -#define GL_SGIX_texture_lod_bias 1 -#endif +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 +#define GL_DEPTH_CLAMP_NV 0x864F +#endif /* GL_NV_depth_clamp */ -#ifndef GL_SGIX_shadow_ambient -#define GL_SGIX_shadow_ambient 1 -#endif +#ifndef GL_NV_draw_texture +#define GL_NV_draw_texture 1 +typedef void (APIENTRYP PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawTextureNV (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +#endif +#endif /* GL_NV_draw_texture */ + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); +typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); +GLAPI void APIENTRY glMapParameterivNV (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMapParameterfvNV (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); +GLAPI void APIENTRY glGetMapParameterivNV (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glEvalMapsNV (GLenum target, GLenum mode); +#endif +#endif /* GL_NV_evaluators */ + +#ifndef GL_NV_explicit_multisample +#define GL_NV_explicit_multisample 1 +#define GL_SAMPLE_POSITION_NV 0x8E50 +#define GL_SAMPLE_MASK_NV 0x8E51 +#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 +#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 +#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 +#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 +#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 +#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 +#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 +#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 +typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (APIENTRYP PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); +typedef void (APIENTRYP PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetMultisamplefvNV (GLenum pname, GLuint index, GLfloat *val); +GLAPI void APIENTRY glSampleMaskIndexedNV (GLuint index, GLbitfield mask); +GLAPI void APIENTRY glTexRenderbufferNV (GLenum target, GLuint renderbuffer); +#endif +#endif /* GL_NV_explicit_multisample */ + +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); +GLAPI void APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); +GLAPI GLboolean APIENTRY glIsFenceNV (GLuint fence); +GLAPI GLboolean APIENTRY glTestFenceNV (GLuint fence); +GLAPI void APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); +GLAPI void APIENTRY glFinishFenceNV (GLuint fence); +GLAPI void APIENTRY glSetFenceNV (GLuint fence, GLenum condition); +#endif +#endif /* GL_NV_fence */ + +#ifndef GL_NV_fill_rectangle +#define GL_NV_fill_rectangle 1 +#define GL_FILL_RECTANGLE_NV 0x933C +#endif /* GL_NV_fill_rectangle */ + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E +#endif /* GL_NV_float_buffer */ -#ifndef GL_EXT_index_texture -#define GL_EXT_index_texture 1 -#endif +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +#endif /* GL_NV_fog_distance */ -#ifndef GL_EXT_index_material -#define GL_EXT_index_material 1 +#ifndef GL_NV_fragment_coverage_to_color +#define GL_NV_fragment_coverage_to_color 1 +#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD +#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE +typedef void (APIENTRYP PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glIndexMaterialEXT (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); -#endif - -#ifndef GL_EXT_index_func -#define GL_EXT_index_func 1 +GLAPI void APIENTRY glFragmentCoverageColorNV (GLuint color); +#endif +#endif /* GL_NV_fragment_coverage_to_color */ + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#endif +#endif /* GL_NV_fragment_program */ + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 +#endif /* GL_NV_fragment_program2 */ + +#ifndef GL_NV_fragment_program4 +#define GL_NV_fragment_program4 1 +#endif /* GL_NV_fragment_program4 */ + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 +#endif /* GL_NV_fragment_program_option */ + +#ifndef GL_NV_fragment_shader_interlock +#define GL_NV_fragment_shader_interlock 1 +#endif /* GL_NV_fragment_shader_interlock */ + +#ifndef GL_NV_framebuffer_mixed_samples +#define GL_NV_framebuffer_mixed_samples 1 +#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 +#define GL_COLOR_SAMPLES_NV 0x8E20 +#define GL_DEPTH_SAMPLES_NV 0x932D +#define GL_STENCIL_SAMPLES_NV 0x932E +#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F +#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 +#define GL_COVERAGE_MODULATION_NV 0x9332 +#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 +typedef void (APIENTRYP PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat *v); +typedef void (APIENTRYP PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat *v); +typedef void (APIENTRYP PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCoverageModulationTableNV (GLsizei n, const GLfloat *v); +GLAPI void APIENTRY glGetCoverageModulationTableNV (GLsizei bufsize, GLfloat *v); +GLAPI void APIENTRY glCoverageModulationNV (GLenum components); +#endif +#endif /* GL_NV_framebuffer_mixed_samples */ + +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_NV_framebuffer_multisample_coverage 1 +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_NV_framebuffer_multisample_coverage */ + +#ifndef GL_NV_geometry_program4 +#define GL_NV_geometry_program4 1 +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 +typedef void (APIENTRYP PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramVertexLimitNV (GLenum target, GLint limit); +GLAPI void APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#endif +#endif /* GL_NV_geometry_program4 */ + +#ifndef GL_NV_geometry_shader4 +#define GL_NV_geometry_shader4 1 +#endif /* GL_NV_geometry_shader4 */ + +#ifndef GL_NV_geometry_shader_passthrough +#define GL_NV_geometry_shader_passthrough 1 +#endif /* GL_NV_geometry_shader_passthrough */ + +#ifndef GL_NV_gpu_program4 +#define GL_NV_gpu_program4 1 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 +#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 +#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 +#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 +#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 +#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 +#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params); +GLAPI void APIENTRY glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params); +#endif +#endif /* GL_NV_gpu_program4 */ + +#ifndef GL_NV_gpu_program5 +#define GL_NV_gpu_program5 1 +#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C +#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F +#define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44 +#define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV 0x8F45 +typedef void (APIENTRYP PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC) (GLenum target, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC) (GLenum target, GLuint index, GLuint *param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramSubroutineParametersuivNV (GLenum target, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetProgramSubroutineParameteruivNV (GLenum target, GLuint index, GLuint *param); +#endif +#endif /* GL_NV_gpu_program5 */ + +#ifndef GL_NV_gpu_program5_mem_extended +#define GL_NV_gpu_program5_mem_extended 1 +#endif /* GL_NV_gpu_program5_mem_extended */ + +#ifndef GL_NV_gpu_shader5 +#define GL_NV_gpu_shader5 1 +#endif /* GL_NV_gpu_shader5 */ + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 +typedef unsigned short GLhalfNV; +#define GL_HALF_FLOAT_NV 0x140B +typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); +typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); +typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glIndexFuncEXT (GLenum, GLclampf); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); +GLAPI void APIENTRY glVertex2hNV (GLhalfNV x, GLhalfNV y); +GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertex3hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z); +GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertex4hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glNormal3hNV (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glColor4hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV s); +GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV s, GLhalfNV t); +GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r); +GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum target, GLhalfNV s); +GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum target, GLhalfNV s, GLhalfNV t); +GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glFogCoordhNV (GLhalfNV fog); +GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *fog); +GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV weight); +GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *weight); +GLAPI void APIENTRY glVertexAttrib1hNV (GLuint index, GLhalfNV x); +GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib2hNV (GLuint index, GLhalfNV x, GLhalfNV y); +GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib3hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib4hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +#endif +#endif /* GL_NV_half_float */ + +#ifndef GL_NV_internalformat_sample_query +#define GL_NV_internalformat_sample_query 1 +#define GL_MULTISAMPLES_NV 0x9371 +#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 +#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 +#define GL_CONFORMANT_NV 0x9374 +typedef void (APIENTRYP PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetInternalformatSampleivNV (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params); #endif +#endif /* GL_NV_internalformat_sample_query */ -#ifndef GL_EXT_index_array_formats -#define GL_EXT_index_array_formats 1 +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 +#endif /* GL_NV_light_max_exponent */ + +#ifndef GL_NV_multisample_coverage +#define GL_NV_multisample_coverage 1 +#endif /* GL_NV_multisample_coverage */ + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#endif /* GL_NV_multisample_filter_hint */ + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint id); +GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint id); +GLAPI void APIENTRY glEndOcclusionQueryNV (void); +GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint *params); +#endif +#endif /* GL_NV_occlusion_query */ + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA +#endif /* GL_NV_packed_depth_stencil */ + +#ifndef GL_NV_parameter_buffer_object +#define GL_NV_parameter_buffer_object 1 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 +#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 +#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 +#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramBufferParametersfvNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glProgramBufferParametersIivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramBufferParametersIuivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); +#endif +#endif /* GL_NV_parameter_buffer_object */ + +#ifndef GL_NV_parameter_buffer_object2 +#define GL_NV_parameter_buffer_object2 1 +#endif /* GL_NV_parameter_buffer_object2 */ + +#ifndef GL_NV_path_rendering +#define GL_NV_path_rendering 1 +#define GL_PATH_FORMAT_SVG_NV 0x9070 +#define GL_PATH_FORMAT_PS_NV 0x9071 +#define GL_STANDARD_FONT_NAME_NV 0x9072 +#define GL_SYSTEM_FONT_NAME_NV 0x9073 +#define GL_FILE_NAME_NV 0x9074 +#define GL_PATH_STROKE_WIDTH_NV 0x9075 +#define GL_PATH_END_CAPS_NV 0x9076 +#define GL_PATH_INITIAL_END_CAP_NV 0x9077 +#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 +#define GL_PATH_JOIN_STYLE_NV 0x9079 +#define GL_PATH_MITER_LIMIT_NV 0x907A +#define GL_PATH_DASH_CAPS_NV 0x907B +#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C +#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D +#define GL_PATH_DASH_OFFSET_NV 0x907E +#define GL_PATH_CLIENT_LENGTH_NV 0x907F +#define GL_PATH_FILL_MODE_NV 0x9080 +#define GL_PATH_FILL_MASK_NV 0x9081 +#define GL_PATH_FILL_COVER_MODE_NV 0x9082 +#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 +#define GL_PATH_STROKE_MASK_NV 0x9084 +#define GL_COUNT_UP_NV 0x9088 +#define GL_COUNT_DOWN_NV 0x9089 +#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A +#define GL_CONVEX_HULL_NV 0x908B +#define GL_BOUNDING_BOX_NV 0x908D +#define GL_TRANSLATE_X_NV 0x908E +#define GL_TRANSLATE_Y_NV 0x908F +#define GL_TRANSLATE_2D_NV 0x9090 +#define GL_TRANSLATE_3D_NV 0x9091 +#define GL_AFFINE_2D_NV 0x9092 +#define GL_AFFINE_3D_NV 0x9094 +#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 +#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 +#define GL_UTF8_NV 0x909A +#define GL_UTF16_NV 0x909B +#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C +#define GL_PATH_COMMAND_COUNT_NV 0x909D +#define GL_PATH_COORD_COUNT_NV 0x909E +#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F +#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 +#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 +#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 +#define GL_SQUARE_NV 0x90A3 +#define GL_ROUND_NV 0x90A4 +#define GL_TRIANGULAR_NV 0x90A5 +#define GL_BEVEL_NV 0x90A6 +#define GL_MITER_REVERT_NV 0x90A7 +#define GL_MITER_TRUNCATE_NV 0x90A8 +#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 +#define GL_USE_MISSING_GLYPH_NV 0x90AA +#define GL_PATH_ERROR_POSITION_NV 0x90AB +#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD +#define GL_ADJACENT_PAIRS_NV 0x90AE +#define GL_FIRST_TO_REST_NV 0x90AF +#define GL_PATH_GEN_MODE_NV 0x90B0 +#define GL_PATH_GEN_COEFF_NV 0x90B1 +#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 +#define GL_PATH_STENCIL_FUNC_NV 0x90B7 +#define GL_PATH_STENCIL_REF_NV 0x90B8 +#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 +#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD +#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE +#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF +#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 +#define GL_MOVE_TO_RESETS_NV 0x90B5 +#define GL_MOVE_TO_CONTINUES_NV 0x90B6 +#define GL_CLOSE_PATH_NV 0x00 +#define GL_MOVE_TO_NV 0x02 +#define GL_RELATIVE_MOVE_TO_NV 0x03 +#define GL_LINE_TO_NV 0x04 +#define GL_RELATIVE_LINE_TO_NV 0x05 +#define GL_HORIZONTAL_LINE_TO_NV 0x06 +#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 +#define GL_VERTICAL_LINE_TO_NV 0x08 +#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 +#define GL_QUADRATIC_CURVE_TO_NV 0x0A +#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B +#define GL_CUBIC_CURVE_TO_NV 0x0C +#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D +#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E +#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F +#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 +#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 +#define GL_SMALL_CCW_ARC_TO_NV 0x12 +#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 +#define GL_SMALL_CW_ARC_TO_NV 0x14 +#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 +#define GL_LARGE_CCW_ARC_TO_NV 0x16 +#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 +#define GL_LARGE_CW_ARC_TO_NV 0x18 +#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 +#define GL_RESTART_PATH_NV 0xF0 +#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 +#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 +#define GL_RECT_NV 0xF6 +#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 +#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA +#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC +#define GL_ARC_TO_NV 0xFE +#define GL_RELATIVE_ARC_TO_NV 0xFF +#define GL_BOLD_BIT_NV 0x01 +#define GL_ITALIC_BIT_NV 0x02 +#define GL_GLYPH_WIDTH_BIT_NV 0x01 +#define GL_GLYPH_HEIGHT_BIT_NV 0x02 +#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 +#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 +#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 +#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 +#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 +#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 +#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 +#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 +#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 +#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 +#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 +#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 +#define GL_FONT_ASCENDER_BIT_NV 0x00200000 +#define GL_FONT_DESCENDER_BIT_NV 0x00400000 +#define GL_FONT_HEIGHT_BIT_NV 0x00800000 +#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 +#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 +#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 +#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 +#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 +#define GL_ROUNDED_RECT_NV 0xE8 +#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 +#define GL_ROUNDED_RECT2_NV 0xEA +#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB +#define GL_ROUNDED_RECT4_NV 0xEC +#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED +#define GL_ROUNDED_RECT8_NV 0xEE +#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF +#define GL_RELATIVE_RECT_NV 0xF7 +#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 +#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 +#define GL_FONT_UNAVAILABLE_NV 0x936A +#define GL_FONT_UNINTELLIGIBLE_NV 0x936B +#define GL_CONIC_CURVE_TO_NV 0x1A +#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B +#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 +#define GL_STANDARD_FONT_FORMAT_NV 0x936C +#define GL_2_BYTES_NV 0x1407 +#define GL_3_BYTES_NV 0x1408 +#define GL_4_BYTES_NV 0x1409 +#define GL_EYE_LINEAR_NV 0x2400 +#define GL_OBJECT_LINEAR_NV 0x2401 +#define GL_CONSTANT_NV 0x8576 +#define GL_PATH_FOG_GEN_MODE_NV 0x90AC +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 +#define GL_PATH_PROJECTION_NV 0x1701 +#define GL_PATH_MODELVIEW_NV 0x1700 +#define GL_PATH_MODELVIEW_STACK_DEPTH_NV 0x0BA3 +#define GL_PATH_MODELVIEW_MATRIX_NV 0x0BA6 +#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36 +#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3 +#define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4 +#define GL_PATH_PROJECTION_MATRIX_NV 0x0BA7 +#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38 +#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4 +#define GL_FRAGMENT_INPUT_NV 0x936D +typedef GLuint (APIENTRYP PFNGLGENPATHSNVPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISPATHNVPROC) (GLuint path); +typedef void (APIENTRYP PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); +typedef void (APIENTRYP PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); +typedef void (APIENTRYP PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); +typedef void (APIENTRYP PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +typedef void (APIENTRYP PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value); +typedef void (APIENTRYP PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value); +typedef void (APIENTRYP PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); +typedef void (APIENTRYP PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray); +typedef void (APIENTRYP PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); +typedef void (APIENTRYP PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func); +typedef void (APIENTRYP PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (APIENTRYP PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value); +typedef void (APIENTRYP PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands); +typedef void (APIENTRYP PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords); +typedef void (APIENTRYP PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray); +typedef void (APIENTRYP PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +typedef void (APIENTRYP PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); +typedef void (APIENTRYP PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +typedef GLboolean (APIENTRYP PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); +typedef GLboolean (APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); +typedef GLfloat (APIENTRYP PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); +typedef GLboolean (APIENTRYP PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +typedef void (APIENTRYP PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); +typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (APIENTRYP PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); +typedef void (APIENTRYP PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); +typedef void (APIENTRYP PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); +typedef void (APIENTRYP PFNGLPATHFOGGENNVPROC) (GLenum genMode); +typedef void (APIENTRYP PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat *value); +typedef void (APIENTRYP PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenPathsNV (GLsizei range); +GLAPI void APIENTRY glDeletePathsNV (GLuint path, GLsizei range); +GLAPI GLboolean APIENTRY glIsPathNV (GLuint path); +GLAPI void APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString); +GLAPI void APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI void APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI void APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); +GLAPI void APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath); +GLAPI void APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +GLAPI void APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value); +GLAPI void APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value); +GLAPI void APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value); +GLAPI void APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value); +GLAPI void APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray); +GLAPI void APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask); +GLAPI void APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units); +GLAPI void APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask); +GLAPI void APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask); +GLAPI void APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glPathCoverDepthFuncNV (GLenum func); +GLAPI void APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode); +GLAPI void APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode); +GLAPI void APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value); +GLAPI void APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands); +GLAPI void APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords); +GLAPI void APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray); +GLAPI void APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +GLAPI void APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); +GLAPI void APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +GLAPI GLboolean APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y); +GLAPI GLboolean APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y); +GLAPI GLfloat APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments); +GLAPI GLboolean APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +GLAPI void APIENTRY glMatrixLoad3x2fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoad3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoadTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMult3x2fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMult3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glStencilThenCoverFillPathNV (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +GLAPI void APIENTRY glStencilThenCoverStrokePathNV (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +GLAPI void APIENTRY glStencilThenCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glStencilThenCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI GLenum APIENTRY glPathGlyphIndexRangeNV (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); +GLAPI GLenum APIENTRY glPathGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI GLenum APIENTRY glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI void APIENTRY glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); +GLAPI void APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); +GLAPI void APIENTRY glPathColorGenNV (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); +GLAPI void APIENTRY glPathTexGenNV (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); +GLAPI void APIENTRY glPathFogGenNV (GLenum genMode); +GLAPI void APIENTRY glGetPathColorGenivNV (GLenum color, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathColorGenfvNV (GLenum color, GLenum pname, GLfloat *value); +GLAPI void APIENTRY glGetPathTexGenivNV (GLenum texCoordSet, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathTexGenfvNV (GLenum texCoordSet, GLenum pname, GLfloat *value); +#endif +#endif /* GL_NV_path_rendering */ + +#ifndef GL_NV_path_rendering_shared_edge +#define GL_NV_path_rendering_shared_edge 1 +#define GL_SHARED_EDGE_NV 0xC0 +#endif /* GL_NV_path_rendering_shared_edge */ + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D +typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, const void *pointer); +typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelDataRangeNV (GLenum target, GLsizei length, const void *pointer); +GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum target); #endif +#endif /* GL_NV_pixel_data_range */ -#ifndef GL_EXT_compiled_vertex_array -#define GL_EXT_compiled_vertex_array 1 +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameteriNV (GLenum pname, GLint param); +GLAPI void APIENTRY glPointParameterivNV (GLenum pname, const GLint *params); +#endif +#endif /* GL_NV_point_sprite */ + +#ifndef GL_NV_present_video +#define GL_NV_present_video 1 +#define GL_FRAME_NV 0x8E26 +#define GL_FIELDS_NV 0x8E27 +#define GL_CURRENT_TIME_NV 0x8E28 +#define GL_NUM_FILL_STREAMS_NV 0x8E29 +#define GL_PRESENT_TIME_NV 0x8E2A +#define GL_PRESENT_DURATION_NV 0x8E2B +typedef void (APIENTRYP PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +typedef void (APIENTRYP PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +typedef void (APIENTRYP PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPresentFrameKeyedNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +GLAPI void APIENTRY glPresentFrameDualFillNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +GLAPI void APIENTRY glGetVideoivNV (GLuint video_slot, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideouivNV (GLuint video_slot, GLenum pname, GLuint *params); +GLAPI void APIENTRY glGetVideoi64vNV (GLuint video_slot, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetVideoui64vNV (GLuint video_slot, GLenum pname, GLuint64EXT *params); +#endif +#endif /* GL_NV_present_video */ + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glLockArraysEXT (GLint, GLsizei); -extern void APIENTRY glUnlockArraysEXT (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); -typedef void (APIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); +GLAPI void APIENTRY glPrimitiveRestartNV (void); +GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint index); #endif +#endif /* GL_NV_primitive_restart */ -#ifndef GL_EXT_cull_vertex -#define GL_EXT_cull_vertex 1 +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glCullParameterdvEXT (GLenum, GLdouble *); -extern void APIENTRY glCullParameterfvEXT (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); -typedef void (APIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); -#endif +GLAPI void APIENTRY glCombinerParameterfvNV (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glCombinerParameterfNV (GLenum pname, GLfloat param); +GLAPI void APIENTRY glCombinerParameterivNV (GLenum pname, const GLint *params); +GLAPI void APIENTRY glCombinerParameteriNV (GLenum pname, GLint param); +GLAPI void APIENTRY glCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +GLAPI void APIENTRY glCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +GLAPI void APIENTRY glFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint *params); +#endif +#endif /* GL_NV_register_combiners */ + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat *params); +#endif +#endif /* GL_NV_register_combiners2 */ + +#ifndef GL_NV_sample_locations +#define GL_NV_sample_locations 1 +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 +#define GL_SAMPLE_LOCATION_NV 0x8E50 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 +typedef void (APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLRESOLVEDEPTHVALUESNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferSampleLocationsfvNV (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glNamedFramebufferSampleLocationsfvNV (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glResolveDepthValuesNV (void); +#endif +#endif /* GL_NV_sample_locations */ + +#ifndef GL_NV_sample_mask_override_coverage +#define GL_NV_sample_mask_override_coverage 1 +#endif /* GL_NV_sample_mask_override_coverage */ + +#ifndef GL_NV_shader_atomic_counters +#define GL_NV_shader_atomic_counters 1 +#endif /* GL_NV_shader_atomic_counters */ + +#ifndef GL_NV_shader_atomic_float +#define GL_NV_shader_atomic_float 1 +#endif /* GL_NV_shader_atomic_float */ + +#ifndef GL_NV_shader_atomic_fp16_vector +#define GL_NV_shader_atomic_fp16_vector 1 +#endif /* GL_NV_shader_atomic_fp16_vector */ + +#ifndef GL_NV_shader_atomic_int64 +#define GL_NV_shader_atomic_int64 1 +#endif /* GL_NV_shader_atomic_int64 */ + +#ifndef GL_NV_shader_buffer_load +#define GL_NV_shader_buffer_load 1 +#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D +#define GL_GPU_ADDRESS_NV 0x8F34 +#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 +typedef void (APIENTRYP PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); +typedef void (APIENTRYP PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); +typedef GLboolean (APIENTRYP PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); +typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); +typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); +typedef GLboolean (APIENTRYP PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT *result); +typedef void (APIENTRYP PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); +typedef void (APIENTRYP PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMakeBufferResidentNV (GLenum target, GLenum access); +GLAPI void APIENTRY glMakeBufferNonResidentNV (GLenum target); +GLAPI GLboolean APIENTRY glIsBufferResidentNV (GLenum target); +GLAPI void APIENTRY glMakeNamedBufferResidentNV (GLuint buffer, GLenum access); +GLAPI void APIENTRY glMakeNamedBufferNonResidentNV (GLuint buffer); +GLAPI GLboolean APIENTRY glIsNamedBufferResidentNV (GLuint buffer); +GLAPI void APIENTRY glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glGetIntegerui64vNV (GLenum value, GLuint64EXT *result); +GLAPI void APIENTRY glUniformui64NV (GLint location, GLuint64EXT value); +GLAPI void APIENTRY glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value); +GLAPI void APIENTRY glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif +#endif /* GL_NV_shader_buffer_load */ + +#ifndef GL_NV_shader_buffer_store +#define GL_NV_shader_buffer_store 1 +#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010 +#endif /* GL_NV_shader_buffer_store */ + +#ifndef GL_NV_shader_storage_buffer_object +#define GL_NV_shader_storage_buffer_object 1 +#endif /* GL_NV_shader_storage_buffer_object */ + +#ifndef GL_NV_shader_thread_group +#define GL_NV_shader_thread_group 1 +#define GL_WARP_SIZE_NV 0x9339 +#define GL_WARPS_PER_SM_NV 0x933A +#define GL_SM_COUNT_NV 0x933B +#endif /* GL_NV_shader_thread_group */ + +#ifndef GL_NV_shader_thread_shuffle +#define GL_NV_shader_thread_shuffle 1 +#endif /* GL_NV_shader_thread_shuffle */ + +#ifndef GL_NV_tessellation_program5 +#define GL_NV_tessellation_program5 1 +#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 +#define GL_TESS_CONTROL_PROGRAM_NV 0x891E +#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F +#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 +#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 +#endif /* GL_NV_tessellation_program5 */ -#ifndef GL_SGIX_ycrcb -#define GL_SGIX_ycrcb 1 -#endif +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F +#endif /* GL_NV_texgen_emboss */ -#ifndef GL_SGIX_fragment_lighting -#define GL_SGIX_fragment_lighting 1 +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 +#endif /* GL_NV_texgen_reflection */ + +#ifndef GL_NV_texture_barrier +#define GL_NV_texture_barrier 1 +typedef void (APIENTRYP PFNGLTEXTUREBARRIERNVPROC) (void); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFragmentColorMaterialSGIX (GLenum, GLenum); -extern void APIENTRY glFragmentLightfSGIX (GLenum, GLenum, GLfloat); -extern void APIENTRY glFragmentLightfvSGIX (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glFragmentLightiSGIX (GLenum, GLenum, GLint); -extern void APIENTRY glFragmentLightivSGIX (GLenum, GLenum, const GLint *); -extern void APIENTRY glFragmentLightModelfSGIX (GLenum, GLfloat); -extern void APIENTRY glFragmentLightModelfvSGIX (GLenum, const GLfloat *); -extern void APIENTRY glFragmentLightModeliSGIX (GLenum, GLint); -extern void APIENTRY glFragmentLightModelivSGIX (GLenum, const GLint *); -extern void APIENTRY glFragmentMaterialfSGIX (GLenum, GLenum, GLfloat); -extern void APIENTRY glFragmentMaterialfvSGIX (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glFragmentMaterialiSGIX (GLenum, GLenum, GLint); -extern void APIENTRY glFragmentMaterialivSGIX (GLenum, GLenum, const GLint *); -extern void APIENTRY glGetFragmentLightfvSGIX (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetFragmentLightivSGIX (GLenum, GLenum, GLint *); -extern void APIENTRY glGetFragmentMaterialfvSGIX (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetFragmentMaterialivSGIX (GLenum, GLenum, GLint *); -extern void APIENTRY glLightEnviSGIX (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); +GLAPI void APIENTRY glTextureBarrierNV (void); #endif +#endif /* GL_NV_texture_barrier */ -#ifndef GL_IBM_rasterpos_clip -#define GL_IBM_rasterpos_clip 1 -#endif +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 +#endif /* GL_NV_texture_compression_vtc */ -#ifndef GL_HP_texture_lighting -#define GL_HP_texture_lighting 1 -#endif +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B +#endif /* GL_NV_texture_env_combine4 */ + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F +#endif /* GL_NV_texture_expand_normal */ + +#ifndef GL_NV_texture_multisample +#define GL_NV_texture_multisample 1 +#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 +#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 +typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage2DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTexImage3DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage2DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage3DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage2DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage3DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +#endif +#endif /* GL_NV_texture_multisample */ + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 +#endif /* GL_NV_texture_rectangle */ + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#endif /* GL_NV_texture_shader */ + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#endif /* GL_NV_texture_shader2 */ + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#endif /* GL_NV_texture_shader3 */ + +#ifndef GL_NV_transform_feedback +#define GL_NV_transform_feedback 1 +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F +#define GL_LAYER_NV 0x8DAA +#define GL_NEXT_BUFFER_NV -2 +#define GL_SKIP_COMPONENTS4_NV -3 +#define GL_SKIP_COMPONENTS3_NV -4 +#define GL_SKIP_COMPONENTS2_NV -5 +#define GL_SKIP_COMPONENTS1_NV -6 +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLenum bufferMode); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (APIENTRYP PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); +typedef void (APIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginTransformFeedbackNV (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedbackNV (void); +GLAPI void APIENTRY glTransformFeedbackAttribsNV (GLsizei count, const GLint *attribs, GLenum bufferMode); +GLAPI void APIENTRY glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +GLAPI void APIENTRY glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); +GLAPI void APIENTRY glActiveVaryingNV (GLuint program, const GLchar *name); +GLAPI GLint APIENTRY glGetVaryingLocationNV (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location); +GLAPI void APIENTRY glTransformFeedbackStreamAttribsNV (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); +#endif +#endif /* GL_NV_transform_feedback */ + +#ifndef GL_NV_transform_feedback2 +#define GL_NV_transform_feedback2 1 +#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 +typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint *ids); +typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindTransformFeedbackNV (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteTransformFeedbacksNV (GLsizei n, const GLuint *ids); +GLAPI void APIENTRY glGenTransformFeedbacksNV (GLsizei n, GLuint *ids); +GLAPI GLboolean APIENTRY glIsTransformFeedbackNV (GLuint id); +GLAPI void APIENTRY glPauseTransformFeedbackNV (void); +GLAPI void APIENTRY glResumeTransformFeedbackNV (void); +GLAPI void APIENTRY glDrawTransformFeedbackNV (GLenum mode, GLuint id); +#endif +#endif /* GL_NV_transform_feedback2 */ + +#ifndef GL_NV_uniform_buffer_unified_memory +#define GL_NV_uniform_buffer_unified_memory 1 +#define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E +#define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F +#define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 +#endif /* GL_NV_uniform_buffer_unified_memory */ + +#ifndef GL_NV_vdpau_interop +#define GL_NV_vdpau_interop 1 +typedef GLintptr GLvdpauSurfaceNV; +#define GL_SURFACE_STATE_NV 0x86EB +#define GL_SURFACE_REGISTERED_NV 0x86FD +#define GL_SURFACE_MAPPED_NV 0x8700 +#define GL_WRITE_DISCARD_NV 0x88BE +typedef void (APIENTRYP PFNGLVDPAUINITNVPROC) (const void *vdpDevice, const void *getProcAddress); +typedef void (APIENTRYP PFNGLVDPAUFININVPROC) (void); +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLboolean (APIENTRYP PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (APIENTRYP PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (APIENTRYP PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +typedef void (APIENTRYP PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); +typedef void (APIENTRYP PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); +typedef void (APIENTRYP PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVDPAUInitNV (const void *vdpDevice, const void *getProcAddress); +GLAPI void APIENTRY glVDPAUFiniNV (void); +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterOutputSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +GLAPI GLboolean APIENTRY glVDPAUIsSurfaceNV (GLvdpauSurfaceNV surface); +GLAPI void APIENTRY glVDPAUUnregisterSurfaceNV (GLvdpauSurfaceNV surface); +GLAPI void APIENTRY glVDPAUGetSurfaceivNV (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +GLAPI void APIENTRY glVDPAUSurfaceAccessNV (GLvdpauSurfaceNV surface, GLenum access); +GLAPI void APIENTRY glVDPAUMapSurfacesNV (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); +GLAPI void APIENTRY glVDPAUUnmapSurfacesNV (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); +#endif +#endif /* GL_NV_vdpau_interop */ -#ifndef GL_EXT_draw_range_elements -#define GL_EXT_draw_range_elements 1 +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const void *pointer); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glDrawRangeElementsEXT (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -#endif +GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); +GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei length, const void *pointer); +#endif +#endif /* GL_NV_vertex_array_range */ + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 +#endif /* GL_NV_vertex_array_range2 */ + +#ifndef GL_NV_vertex_attrib_integer_64bit +#define GL_NV_vertex_attrib_integer_64bit 1 +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribL1i64NV (GLuint index, GLint64EXT x); +GLAPI void APIENTRY glVertexAttribL2i64NV (GLuint index, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glVertexAttribL3i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glVertexAttribL4i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glVertexAttribL1i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL2i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL3i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL4i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL1ui64NV (GLuint index, GLuint64EXT x); +GLAPI void APIENTRY glVertexAttribL2ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glVertexAttribL3ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glVertexAttribL4ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glVertexAttribL1ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL2ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL3ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL4ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glGetVertexAttribLi64vNV (GLuint index, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetVertexAttribLui64vNV (GLuint index, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glVertexAttribLFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); +#endif +#endif /* GL_NV_vertex_attrib_integer_64bit */ + +#ifndef GL_NV_vertex_buffer_unified_memory +#define GL_NV_vertex_buffer_unified_memory 1 +#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E +#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F +#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 +#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 +#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 +#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 +#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 +#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 +#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 +#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 +#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 +#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 +#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A +#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B +#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C +#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D +#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E +#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F +#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 +#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 +#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 +#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 +#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 +#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 +#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 +typedef void (APIENTRYP PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +typedef void (APIENTRYP PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +GLAPI void APIENTRY glVertexFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glNormalFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glColorFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glIndexFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glEdgeFlagFormatNV (GLsizei stride); +GLAPI void APIENTRY glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glFogCoordFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +GLAPI void APIENTRY glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT *result); +#endif +#endif /* GL_NV_vertex_buffer_unified_memory */ + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); +typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); +typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void **pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei n, const GLuint *programs, GLboolean *residences); +GLAPI void APIENTRY glBindProgramNV (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteProgramsNV (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glExecuteProgramNV (GLenum target, GLuint id, const GLfloat *params); +GLAPI void APIENTRY glGenProgramsNV (GLsizei n, GLuint *programs); +GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetProgramivNV (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramStringNV (GLuint id, GLenum pname, GLubyte *program); +GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribivNV (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint index, GLenum pname, void **pointer); +GLAPI GLboolean APIENTRY glIsProgramNV (GLuint id); +GLAPI void APIENTRY glLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +GLAPI void APIENTRY glProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v); +GLAPI void APIENTRY glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v); +GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform); +GLAPI void APIENTRY glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glVertexAttrib1dNV (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1fNV (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1sNV (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2sNV (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs1svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs2svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs3svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs4svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint index, GLsizei count, const GLubyte *v); +#endif +#endif /* GL_NV_vertex_program */ + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 +#endif /* GL_NV_vertex_program1_1 */ + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 +#endif /* GL_NV_vertex_program2 */ + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 +#endif /* GL_NV_vertex_program2_option */ + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 +#endif /* GL_NV_vertex_program3 */ + +#ifndef GL_NV_vertex_program4 +#define GL_NV_vertex_program4 1 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribI1iEXT (GLuint index, GLint x); +GLAPI void APIENTRY glVertexAttribI2iEXT (GLuint index, GLint x, GLint y); +GLAPI void APIENTRY glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexAttribI1uiEXT (GLuint index, GLuint x); +GLAPI void APIENTRY glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y); +GLAPI void APIENTRY glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI void APIENTRY glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glVertexAttribI1ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI2ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI3ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI4ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI1uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI2uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI3uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4bvEXT (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttribI4svEXT (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribI4usvEXT (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params); +#endif +#endif /* GL_NV_vertex_program4 */ + +#ifndef GL_NV_video_capture +#define GL_NV_video_capture 1 +#define GL_VIDEO_BUFFER_NV 0x9020 +#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 +#define GL_FIELD_UPPER_NV 0x9022 +#define GL_FIELD_LOWER_NV 0x9023 +#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 +#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 +#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 +#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 +#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 +#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 +#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A +#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B +#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C +#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D +#define GL_PARTIAL_SUCCESS_NV 0x902E +#define GL_SUCCESS_NV 0x902F +#define GL_FAILURE_NV 0x9030 +#define GL_YCBYCR8_422_NV 0x9031 +#define GL_YCBAYCR8A_4224_NV 0x9032 +#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 +#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 +#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 +#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 +#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 +#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 +#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 +#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A +#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B +#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C +typedef void (APIENTRYP PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); +typedef GLenum (APIENTRYP PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVideoCaptureNV (GLuint video_capture_slot); +GLAPI void APIENTRY glBindVideoCaptureStreamBufferNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +GLAPI void APIENTRY glBindVideoCaptureStreamTextureNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +GLAPI void APIENTRY glEndVideoCaptureNV (GLuint video_capture_slot); +GLAPI void APIENTRY glGetVideoCaptureivNV (GLuint video_capture_slot, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideoCaptureStreamivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideoCaptureStreamfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVideoCaptureStreamdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); +GLAPI GLenum APIENTRY glVideoCaptureNV (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); +GLAPI void APIENTRY glVideoCaptureStreamParameterivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); +GLAPI void APIENTRY glVideoCaptureStreamParameterfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glVideoCaptureStreamParameterdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); +#endif +#endif /* GL_NV_video_capture */ + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 +#endif /* GL_OML_interlace */ + +#ifndef GL_OML_resample +#define GL_OML_resample 1 +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 +#endif /* GL_OML_resample */ + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 +#endif /* GL_OML_subsample */ -#ifndef GL_WIN_phong_shading -#define GL_WIN_phong_shading 1 +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 +#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD +#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 +#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C +#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E +#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F +#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 +#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 +#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 +#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 +#define GL_CLIP_NEAR_HINT_PGI 0x1A220 +#define GL_CLIP_FAR_HINT_PGI 0x1A221 +#define GL_WIDE_LINE_HINT_PGI 0x1A222 +#define GL_BACK_NORMALS_HINT_PGI 0x1A223 +typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glHintPGI (GLenum target, GLint mode); #endif +#endif /* GL_PGI_misc_hints */ -#ifndef GL_WIN_specular_fog -#define GL_WIN_specular_fog 1 -#endif +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 +#define GL_VERTEX_DATA_HINT_PGI 0x1A22A +#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B +#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C +#define GL_MAX_VERTEX_HINT_PGI 0x1A22D +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#endif /* GL_PGI_vertex_hints */ -#ifndef GL_EXT_light_texture -#define GL_EXT_light_texture 1 +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 +#endif /* GL_REND_screen_coordinates */ + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#define GL_RGBA_DXT5_S3TC 0x83A4 +#define GL_RGBA4_DXT5_S3TC 0x83A5 +#endif /* GL_S3_s3tc */ + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 +#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 +#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 +#define GL_LINEAR_DETAIL_SGIS 0x8097 +#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 +#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 +#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A +#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B +#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C +typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glApplyTextureEXT (GLenum); -extern void APIENTRY glTextureLightEXT (GLenum); -extern void APIENTRY glTextureMaterialEXT (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); -typedef void (APIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); -typedef void (APIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); -#endif - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_SGIX_blend_alpha_minmax 1 -#endif - -#ifndef GL_EXT_bgra -#define GL_EXT_bgra 1 +GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum target, GLfloat *points); #endif +#endif /* GL_SGIS_detail_texture */ -#ifndef GL_INTEL_parallel_arrays -#define GL_INTEL_parallel_arrays 1 +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 +#define GL_FOG_FUNC_SGIS 0x812A +#define GL_FOG_FUNC_POINTS_SGIS 0x812B +#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C +typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glVertexPointervINTEL (GLint, GLenum, const GLvoid* *); -extern void APIENTRY glNormalPointervINTEL (GLenum, const GLvoid* *); -extern void APIENTRY glColorPointervINTEL (GLint, GLenum, const GLvoid* *); -extern void APIENTRY glTexCoordPointervINTEL (GLint, GLenum, const GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (APIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); -typedef void (APIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (APIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +GLAPI void APIENTRY glFogFuncSGIS (GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *points); #endif +#endif /* GL_SGIS_fog_function */ -#ifndef GL_HP_occlusion_test -#define GL_HP_occlusion_test 1 -#endif +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 +#endif /* GL_SGIS_generate_mipmap */ -#ifndef GL_EXT_pixel_transform -#define GL_EXT_pixel_transform 1 +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glPixelTransformParameteriEXT (GLenum, GLenum, GLint); -extern void APIENTRY glPixelTransformParameterfEXT (GLenum, GLenum, GLfloat); -extern void APIENTRY glPixelTransformParameterivEXT (GLenum, GLenum, const GLint *); -extern void APIENTRY glPixelTransformParameterfvEXT (GLenum, GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_EXT_pixel_transform_color_table -#define GL_EXT_pixel_transform_color_table 1 +GLAPI void APIENTRY glSampleMaskSGIS (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glSamplePatternSGIS (GLenum pattern); #endif +#endif /* GL_SGIS_multisample */ -#ifndef GL_EXT_shared_texture_palette -#define GL_EXT_shared_texture_palette 1 +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 +#define GL_PIXEL_TEXTURE_SGIS 0x8353 +#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 +#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 +#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum pname, GLint param); +GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum pname, const GLint *params); +GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum pname, GLint *params); +GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum pname, GLfloat *params); #endif +#endif /* GL_SGIS_pixel_texture */ -#ifndef GL_EXT_separate_specular_color -#define GL_EXT_separate_specular_color 1 -#endif +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 +#endif /* GL_SGIS_point_line_texgen */ -#ifndef GL_EXT_secondary_color -#define GL_EXT_secondary_color 1 +#ifndef GL_SGIS_point_parameters +#define GL_SGIS_point_parameters 1 +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSecondaryColor3bEXT (GLbyte, GLbyte, GLbyte); -extern void APIENTRY glSecondaryColor3bvEXT (const GLbyte *); -extern void APIENTRY glSecondaryColor3dEXT (GLdouble, GLdouble, GLdouble); -extern void APIENTRY glSecondaryColor3dvEXT (const GLdouble *); -extern void APIENTRY glSecondaryColor3fEXT (GLfloat, GLfloat, GLfloat); -extern void APIENTRY glSecondaryColor3fvEXT (const GLfloat *); -extern void APIENTRY glSecondaryColor3iEXT (GLint, GLint, GLint); -extern void APIENTRY glSecondaryColor3ivEXT (const GLint *); -extern void APIENTRY glSecondaryColor3sEXT (GLshort, GLshort, GLshort); -extern void APIENTRY glSecondaryColor3svEXT (const GLshort *); -extern void APIENTRY glSecondaryColor3ubEXT (GLubyte, GLubyte, GLubyte); -extern void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *); -extern void APIENTRY glSecondaryColor3uiEXT (GLuint, GLuint, GLuint); -extern void APIENTRY glSecondaryColor3uivEXT (const GLuint *); -extern void APIENTRY glSecondaryColor3usEXT (GLushort, GLushort, GLushort); -extern void APIENTRY glSecondaryColor3usvEXT (const GLushort *); -extern void APIENTRY glSecondaryColorPointerEXT (GLint, GLenum, GLsizei, GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); +GLAPI void APIENTRY glPointParameterfSGIS (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvSGIS (GLenum pname, const GLfloat *params); #endif +#endif /* GL_SGIS_point_parameters */ -#ifndef GL_EXT_texture_perturb_normal -#define GL_EXT_texture_perturb_normal 1 +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 +#define GL_LINEAR_SHARPEN_SGIS 0x80AD +#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE +#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF +#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 +typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTextureNormalEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); +GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum target, GLfloat *points); #endif +#endif /* GL_SGIS_sharpen_texture */ -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 +#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 +#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 +#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 +#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 +#define GL_TEXTURE_4D_SGIS 0x8134 +#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 +#define GL_TEXTURE_4DSIZE_SGIS 0x8136 +#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 +#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 +#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); -extern void APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); -typedef void (APIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +GLAPI void APIENTRY glTexImage4DSGIS (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels); #endif +#endif /* GL_SGIS_texture4D */ -#ifndef GL_EXT_fog_coord -#define GL_EXT_fog_coord 1 +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 +#define GL_CLAMP_TO_BORDER_SGIS 0x812D +#endif /* GL_SGIS_texture_border_clamp */ + +#ifndef GL_SGIS_texture_color_mask +#define GL_SGIS_texture_color_mask 1 +#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFogCoordfEXT (GLfloat); -extern void APIENTRY glFogCoordfvEXT (const GLfloat *); -extern void APIENTRY glFogCoorddEXT (GLdouble); -extern void APIENTRY glFogCoorddvEXT (const GLdouble *); -extern void APIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); -typedef void (APIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); -typedef void (APIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); -typedef void (APIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); -typedef void (APIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); #endif +#endif /* GL_SGIS_texture_color_mask */ -#ifndef GL_REND_screen_coordinates -#define GL_REND_screen_coordinates 1 -#endif +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 +#define GL_CLAMP_TO_EDGE_SGIS 0x812F +#endif /* GL_SGIS_texture_edge_clamp */ -#ifndef GL_EXT_coordinate_frame -#define GL_EXT_coordinate_frame 1 +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 +#define GL_FILTER4_SGIS 0x8146 +#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); +typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTangent3bEXT (GLbyte, GLbyte, GLbyte); -extern void APIENTRY glTangent3bvEXT (const GLbyte *); -extern void APIENTRY glTangent3dEXT (GLdouble, GLdouble, GLdouble); -extern void APIENTRY glTangent3dvEXT (const GLdouble *); -extern void APIENTRY glTangent3fEXT (GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTangent3fvEXT (const GLfloat *); -extern void APIENTRY glTangent3iEXT (GLint, GLint, GLint); -extern void APIENTRY glTangent3ivEXT (const GLint *); -extern void APIENTRY glTangent3sEXT (GLshort, GLshort, GLshort); -extern void APIENTRY glTangent3svEXT (const GLshort *); -extern void APIENTRY glBinormal3bEXT (GLbyte, GLbyte, GLbyte); -extern void APIENTRY glBinormal3bvEXT (const GLbyte *); -extern void APIENTRY glBinormal3dEXT (GLdouble, GLdouble, GLdouble); -extern void APIENTRY glBinormal3dvEXT (const GLdouble *); -extern void APIENTRY glBinormal3fEXT (GLfloat, GLfloat, GLfloat); -extern void APIENTRY glBinormal3fvEXT (const GLfloat *); -extern void APIENTRY glBinormal3iEXT (GLint, GLint, GLint); -extern void APIENTRY glBinormal3ivEXT (const GLint *); -extern void APIENTRY glBinormal3sEXT (GLshort, GLshort, GLshort); -extern void APIENTRY glBinormal3svEXT (const GLshort *); -extern void APIENTRY glTangentPointerEXT (GLenum, GLsizei, const GLvoid *); -extern void APIENTRY glBinormalPointerEXT (GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); -typedef void (APIENTRY * PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRY * PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); -typedef void (APIENTRY * PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); -typedef void (APIENTRY * PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); -typedef void (APIENTRY * PFNGLTANGENT3IVEXTPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); -typedef void (APIENTRY * PFNGLTANGENT3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRY * PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); -typedef void (APIENTRY * PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRY * PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); -typedef void (APIENTRY * PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); -typedef void (APIENTRY * PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); -typedef void (APIENTRY * PFNGLBINORMAL3IVEXTPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); -typedef void (APIENTRY * PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat *weights); +GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); #endif +#endif /* GL_SGIS_texture_filter4 */ -#ifndef GL_EXT_texture_env_combine -#define GL_EXT_texture_env_combine 1 -#endif +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D +#endif /* GL_SGIS_texture_lod */ -#ifndef GL_APPLE_specular_vector -#define GL_APPLE_specular_vector 1 -#endif +#ifndef GL_SGIS_texture_select +#define GL_SGIS_texture_select 1 +#define GL_DUAL_ALPHA4_SGIS 0x8110 +#define GL_DUAL_ALPHA8_SGIS 0x8111 +#define GL_DUAL_ALPHA12_SGIS 0x8112 +#define GL_DUAL_ALPHA16_SGIS 0x8113 +#define GL_DUAL_LUMINANCE4_SGIS 0x8114 +#define GL_DUAL_LUMINANCE8_SGIS 0x8115 +#define GL_DUAL_LUMINANCE12_SGIS 0x8116 +#define GL_DUAL_LUMINANCE16_SGIS 0x8117 +#define GL_DUAL_INTENSITY4_SGIS 0x8118 +#define GL_DUAL_INTENSITY8_SGIS 0x8119 +#define GL_DUAL_INTENSITY12_SGIS 0x811A +#define GL_DUAL_INTENSITY16_SGIS 0x811B +#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C +#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D +#define GL_QUAD_ALPHA4_SGIS 0x811E +#define GL_QUAD_ALPHA8_SGIS 0x811F +#define GL_QUAD_LUMINANCE4_SGIS 0x8120 +#define GL_QUAD_LUMINANCE8_SGIS 0x8121 +#define GL_QUAD_INTENSITY4_SGIS 0x8122 +#define GL_QUAD_INTENSITY8_SGIS 0x8123 +#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 +#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 +#endif /* GL_SGIS_texture_select */ + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 +#define GL_ASYNC_MARKER_SGIX 0x8329 +typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); +typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); +typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint marker); +GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *markerp); +GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *markerp); +GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei range); +GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range); +GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint marker); +#endif +#endif /* GL_SGIX_async */ + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D +#endif /* GL_SGIX_async_histogram */ + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 +#endif /* GL_SGIX_async_pixel */ -#ifndef GL_APPLE_transform_hint -#define GL_APPLE_transform_hint 1 -#endif +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 +#endif /* GL_SGIX_blend_alpha_minmax */ -#ifndef GL_SGIX_fog_scale -#define GL_SGIX_fog_scale 1 -#endif +#ifndef GL_SGIX_calligraphic_fragment +#define GL_SGIX_calligraphic_fragment 1 +#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 +#endif /* GL_SGIX_calligraphic_fragment */ -#ifndef GL_SUNX_constant_data -#define GL_SUNX_constant_data 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFinishTextureSUNX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); -#endif +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 +#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 +#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 +#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 +#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 +#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 +#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 +#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 +#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 +#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 +#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D +#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E +#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F +#endif /* GL_SGIX_clipmap */ -#ifndef GL_SUN_global_alpha -#define GL_SUN_global_alpha 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glGlobalAlphaFactorbSUN (GLbyte); -extern void APIENTRY glGlobalAlphaFactorsSUN (GLshort); -extern void APIENTRY glGlobalAlphaFactoriSUN (GLint); -extern void APIENTRY glGlobalAlphaFactorfSUN (GLfloat); -extern void APIENTRY glGlobalAlphaFactordSUN (GLdouble); -extern void APIENTRY glGlobalAlphaFactorubSUN (GLubyte); -extern void APIENTRY glGlobalAlphaFactorusSUN (GLushort); -extern void APIENTRY glGlobalAlphaFactoruiSUN (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); -#endif +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 +#define GL_CONVOLUTION_HINT_SGIX 0x8316 +#endif /* GL_SGIX_convolution_accuracy */ -#ifndef GL_SUN_triangle_list -#define GL_SUN_triangle_list 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glReplacementCodeuiSUN (GLuint); -extern void APIENTRY glReplacementCodeusSUN (GLushort); -extern void APIENTRY glReplacementCodeubSUN (GLubyte); -extern void APIENTRY glReplacementCodeuivSUN (const GLuint *); -extern void APIENTRY glReplacementCodeusvSUN (const GLushort *); -extern void APIENTRY glReplacementCodeubvSUN (const GLubyte *); -extern void APIENTRY glReplacementCodePointerSUN (GLenum, GLsizei, const GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); -#endif +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 +#endif /* GL_SGIX_depth_pass_instrument */ -#ifndef GL_SUN_vertex -#define GL_SUN_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glColor4ubVertex2fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat); -extern void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *, const GLfloat *); -extern void APIENTRY glColor4ubVertex3fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *, const GLfloat *); -extern void APIENTRY glColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glColor3fVertex3fvSUN (const GLfloat *, const GLfloat *); -extern void APIENTRY glNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *); -extern void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord2fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord4fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat, GLfloat, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *, const GLubyte *, const GLfloat *); -extern void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLenum *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLenum, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLenum *, const GLubyte *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLenum rc, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLenum rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLenum *rc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLenum rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLenum rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -#endif +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 +#endif /* GL_SGIX_depth_texture */ -#ifndef GL_EXT_blend_func_separate -#define GL_EXT_blend_func_separate 1 +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 +typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glBlendFuncSeparateEXT (GLenum, GLenum, GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif - -#ifndef GL_INGR_color_clamp -#define GL_INGR_color_clamp 1 -#endif - -#ifndef GL_INGR_interlace_read -#define GL_INGR_interlace_read 1 +GLAPI void APIENTRY glFlushRasterSGIX (void); #endif +#endif /* GL_SGIX_flush_raster */ -#ifndef GL_EXT_stencil_wrap -#define GL_EXT_stencil_wrap 1 -#endif +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 +#endif /* GL_SGIX_fog_offset */ -#ifndef GL_EXT_422_pixels -#define GL_EXT_422_pixels 1 -#endif +#ifndef GL_SGIX_fragment_lighting +#define GL_SGIX_fragment_lighting 1 +#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 +#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 +#define GL_LIGHT_ENV_MODE_SGIX 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B +#define GL_FRAGMENT_LIGHT0_SGIX 0x840C +#define GL_FRAGMENT_LIGHT1_SGIX 0x840D +#define GL_FRAGMENT_LIGHT2_SGIX 0x840E +#define GL_FRAGMENT_LIGHT3_SGIX 0x840F +#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 +#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 +#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 +#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 +typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum face, GLenum mode); +GLAPI void APIENTRY glFragmentLightfSGIX (GLenum light, GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum light, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentLightiSGIX (GLenum light, GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentLightivSGIX (GLenum light, GLenum pname, const GLint *params); +GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum pname, const GLint *params); +GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum face, GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum face, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum face, GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum face, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum light, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum light, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum face, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum face, GLenum pname, GLint *params); +GLAPI void APIENTRY glLightEnviSGIX (GLenum pname, GLint param); +#endif +#endif /* GL_SGIX_fragment_lighting */ -#ifndef GL_NV_texgen_reflection -#define GL_NV_texgen_reflection 1 +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 +#define GL_FRAMEZOOM_SGIX 0x818B +#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C +#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D +typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFrameZoomSGIX (GLint factor); #endif +#endif /* GL_SGIX_framezoom */ -#ifndef GL_SUN_convolution_border_modes -#define GL_SUN_convolution_border_modes 1 +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 +typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const void *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum pname, const void *params); #endif +#endif /* GL_SGIX_igloo_interface */ -#ifndef GL_EXT_texture_env_add -#define GL_EXT_texture_env_add 1 +#ifndef GL_SGIX_instruments +#define GL_SGIX_instruments 1 +#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 +#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 +typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); +typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); +typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); +typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); +GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei size, GLint *buffer); +GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *marker_p); +GLAPI void APIENTRY glReadInstrumentsSGIX (GLint marker); +GLAPI void APIENTRY glStartInstrumentsSGIX (void); +GLAPI void APIENTRY glStopInstrumentsSGIX (GLint marker); #endif +#endif /* GL_SGIX_instruments */ -#ifndef GL_EXT_texture_lod_bias -#define GL_EXT_texture_lod_bias 1 -#endif +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 +#define GL_INTERLACE_SGIX 0x8094 +#endif /* GL_SGIX_interlace */ -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 -#endif +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 +#define GL_IR_INSTRUMENT1_SGIX 0x817F +#endif /* GL_SGIX_ir_instrument1 */ -#ifndef GL_EXT_vertex_weighting -#define GL_EXT_vertex_weighting 1 +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 +#define GL_LIST_PRIORITY_SGIX 0x8182 +typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glVertexWeightfEXT (GLfloat); -extern void APIENTRY glVertexWeightfvEXT (const GLfloat *); -extern void APIENTRY glVertexWeightPointerEXT (GLsizei, GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); -typedef void (APIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); -typedef void (APIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint list, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetListParameterivSGIX (GLuint list, GLenum pname, GLint *params); +GLAPI void APIENTRY glListParameterfSGIX (GLuint list, GLenum pname, GLfloat param); +GLAPI void APIENTRY glListParameterfvSGIX (GLuint list, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glListParameteriSGIX (GLuint list, GLenum pname, GLint param); +GLAPI void APIENTRY glListParameterivSGIX (GLuint list, GLenum pname, const GLint *params); #endif +#endif /* GL_SGIX_list_priority */ -#ifndef GL_NV_light_max_exponent -#define GL_NV_light_max_exponent 1 +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 +#define GL_PIXEL_TEX_GEN_SGIX 0x8139 +#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenSGIX (GLenum mode); #endif +#endif /* GL_SGIX_pixel_texture */ -#ifndef GL_NV_vertex_array_range -#define GL_NV_vertex_array_range 1 +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 +#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E +#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F +#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 +#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 +#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 +#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 +#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 +#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 +#endif /* GL_SGIX_pixel_tiles */ + +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 +#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 +#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 +#define GL_DEFORMATIONS_MASK_SGIX 0x8196 +#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFlushVertexArrayRangeNV (void); -extern void APIENTRY glVertexArrayRangeNV (GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); -typedef void (APIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei size, const GLvoid *pointer); +GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +GLAPI void APIENTRY glDeformSGIX (GLbitfield mask); +GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield mask); #endif +#endif /* GL_SGIX_polynomial_ffd */ -#ifndef GL_NV_register_combiners -#define GL_NV_register_combiners 1 +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 +#define GL_REFERENCE_PLANE_SGIX 0x817D +#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E +typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glCombinerParameterfvNV (GLenum, const GLfloat *); -extern void APIENTRY glCombinerParameterfNV (GLenum, GLfloat); -extern void APIENTRY glCombinerParameterivNV (GLenum, const GLint *); -extern void APIENTRY glCombinerParameteriNV (GLenum, GLint); -extern void APIENTRY glCombinerInputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); -extern void APIENTRY glCombinerOutputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); -extern void APIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum); -extern void APIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *); -extern void APIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *); -extern void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -typedef void (APIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); +GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *equation); #endif +#endif /* GL_SGIX_reference_plane */ -#ifndef GL_NV_fog_distance -#define GL_NV_fog_distance 1 -#endif +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 +#define GL_PACK_RESAMPLE_SGIX 0x842C +#define GL_UNPACK_RESAMPLE_SGIX 0x842D +#define GL_RESAMPLE_REPLICATE_SGIX 0x842E +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#endif /* GL_SGIX_resample */ -#ifndef GL_NV_texgen_emboss -#define GL_NV_texgen_emboss 1 -#endif +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 +#define GL_SCALEBIAS_HINT_SGIX 0x8322 +#endif /* GL_SGIX_scalebias_hint */ -#ifndef GL_NV_blend_square -#define GL_NV_blend_square 1 -#endif +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D +#endif /* GL_SGIX_shadow */ -#ifndef GL_NV_texture_env_combine4 -#define GL_NV_texture_env_combine4 1 -#endif +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 +#define GL_SHADOW_AMBIENT_SGIX 0x80BF +#endif /* GL_SGIX_shadow_ambient */ -#ifndef GL_MESA_resize_buffers -#define GL_MESA_resize_buffers 1 +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 +#define GL_SPRITE_SGIX 0x8148 +#define GL_SPRITE_MODE_SGIX 0x8149 +#define GL_SPRITE_AXIS_SGIX 0x814A +#define GL_SPRITE_TRANSLATION_SGIX 0x814B +#define GL_SPRITE_AXIAL_SGIX 0x814C +#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D +#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glResizeBuffersMESA (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); +GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum pname, GLfloat param); +GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum pname, GLint param); +GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum pname, const GLint *params); #endif +#endif /* GL_SGIX_sprite */ -#ifndef GL_MESA_window_pos -#define GL_MESA_window_pos 1 +#ifndef GL_SGIX_subsample +#define GL_SGIX_subsample 1 +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 +#endif /* GL_SGIX_subsample */ + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 +typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glWindowPos2dMESA (GLdouble, GLdouble); -extern void APIENTRY glWindowPos2dvMESA (const GLdouble *); -extern void APIENTRY glWindowPos2fMESA (GLfloat, GLfloat); -extern void APIENTRY glWindowPos2fvMESA (const GLfloat *); -extern void APIENTRY glWindowPos2iMESA (GLint, GLint); -extern void APIENTRY glWindowPos2ivMESA (const GLint *); -extern void APIENTRY glWindowPos2sMESA (GLshort, GLshort); -extern void APIENTRY glWindowPos2svMESA (const GLshort *); -extern void APIENTRY glWindowPos3dMESA (GLdouble, GLdouble, GLdouble); -extern void APIENTRY glWindowPos3dvMESA (const GLdouble *); -extern void APIENTRY glWindowPos3fMESA (GLfloat, GLfloat, GLfloat); -extern void APIENTRY glWindowPos3fvMESA (const GLfloat *); -extern void APIENTRY glWindowPos3iMESA (GLint, GLint, GLint); -extern void APIENTRY glWindowPos3ivMESA (const GLint *); -extern void APIENTRY glWindowPos3sMESA (GLshort, GLshort, GLshort); -extern void APIENTRY glWindowPos3svMESA (const GLshort *); -extern void APIENTRY glWindowPos4dMESA (GLdouble, GLdouble, GLdouble, GLdouble); -extern void APIENTRY glWindowPos4dvMESA (const GLdouble *); -extern void APIENTRY glWindowPos4fMESA (GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glWindowPos4fvMESA (const GLfloat *); -extern void APIENTRY glWindowPos4iMESA (GLint, GLint, GLint, GLint); -extern void APIENTRY glWindowPos4ivMESA (const GLint *); -extern void APIENTRY glWindowPos4sMESA (GLshort, GLshort, GLshort, GLshort); -extern void APIENTRY glWindowPos4svMESA (const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); -typedef void (APIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); -typedef void (APIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); -typedef void (APIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); -typedef void (APIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); +GLAPI void APIENTRY glTagSampleBufferSGIX (void); #endif +#endif /* GL_SGIX_tag_sample_buffer */ -#ifndef GL_IBM_cull_vertex -#define GL_IBM_cull_vertex 1 -#endif +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 +#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE +#endif /* GL_SGIX_texture_add_env */ -#ifndef GL_IBM_multimode_draw_arrays -#define GL_IBM_multimode_draw_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glMultiModeDrawArraysIBM (GLenum, const GLint *, const GLsizei *, GLsizei, GLint); -extern void APIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* *, GLsizei, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -typedef void (APIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount, GLint modestride); -#endif +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B +#endif /* GL_SGIX_texture_coordinate_clamp */ -#ifndef GL_IBM_vertex_array_lists -#define GL_IBM_vertex_array_lists 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glSecondaryColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glEdgeFlagPointerListIBM (GLint, const GLboolean* *, GLint); -extern void APIENTRY glFogCoordPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glIndexPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glNormalPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glTexCoordPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glVertexPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -#endif +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 +#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E +#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F +#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 +#endif /* GL_SGIX_texture_lod_bias */ -#ifndef GL_SGIX_subsample -#define GL_SGIX_subsample 1 -#endif +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E +#endif /* GL_SGIX_texture_multi_buffer */ -#ifndef GL_SGIX_ycrcba -#define GL_SGIX_ycrcba 1 -#endif +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C +#endif /* GL_SGIX_texture_scale_bias */ + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF +#endif /* GL_SGIX_vertex_preclip */ + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 +#define GL_YCRCB_422_SGIX 0x81BB +#define GL_YCRCB_444_SGIX 0x81BC +#endif /* GL_SGIX_ycrcb */ #ifndef GL_SGIX_ycrcb_subsample #define GL_SGIX_ycrcb_subsample 1 -#endif - -#ifndef GL_SGIX_depth_pass_instrument -#define GL_SGIX_depth_pass_instrument 1 -#endif +#endif /* GL_SGIX_ycrcb_subsample */ -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_3DFX_texture_compression_FXT1 1 -#endif +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 +#endif /* GL_SGIX_ycrcba */ -#ifndef GL_3DFX_multisample -#define GL_3DFX_multisample 1 -#endif +#ifndef GL_SGI_color_matrix +#define GL_SGI_color_matrix 1 +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB +#endif /* GL_SGI_color_matrix */ -#ifndef GL_3DFX_tbuffer -#define GL_3DFX_tbuffer 1 +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTbufferMask3DFX (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); +GLAPI void APIENTRY glColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glColorTableParameterivSGI (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glGetColorTableSGI (GLenum target, GLenum format, GLenum type, void *table); +GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint *params); #endif +#endif /* GL_SGI_color_table */ -#ifndef GL_EXT_multisample -#define GL_EXT_multisample 1 +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#endif /* GL_SGI_texture_color_table */ + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 +typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSampleMaskEXT (GLclampf, GLboolean); -extern void APIENTRY glSamplePatternEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); +GLAPI void APIENTRY glFinishTextureSUNX (void); #endif +#endif /* GL_SUNX_constant_data */ -#ifndef GL_SGI_vertex_preclip -#define GL_SGI_vertex_preclip 1 -#endif +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 +#define GL_WRAP_BORDER_SUN 0x81D4 +#endif /* GL_SUN_convolution_border_modes */ -#ifndef GL_SGIX_convolution_accuracy -#define GL_SGIX_convolution_accuracy 1 +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte factor); +GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort factor); +GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint factor); +GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat factor); +GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble factor); +GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte factor); +GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort factor); +GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint factor); +#endif +#endif /* GL_SUN_global_alpha */ + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 +typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width); #endif +#endif /* GL_SUN_mesh_array */ -#ifndef GL_SGIX_resample -#define GL_SGIX_resample 1 -#endif +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 +#define GL_SLICE_ACCUM_SUN 0x85CC +#endif /* GL_SUN_slice_accum */ -#ifndef GL_SGIS_point_line_texgen -#define GL_SGIS_point_line_texgen 1 +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 +#define GL_RESTART_SUN 0x0001 +#define GL_REPLACE_MIDDLE_SUN 0x0002 +#define GL_REPLACE_OLDEST_SUN 0x0003 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void **pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint code); +GLAPI void APIENTRY glReplacementCodeusSUN (GLushort code); +GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte code); +GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *code); +GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *code); +GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *code); +GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum type, GLsizei stride, const void **pointer); #endif +#endif /* GL_SUN_triangle_list */ -#ifndef GL_SGIS_texture_color_mask -#define GL_SGIS_texture_color_mask 1 +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTextureColorMaskSGIS (GLboolean, GLboolean, GLboolean, GLboolean); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -#endif +GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *rc, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *rc, const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +#endif +#endif /* GL_SUN_vertex */ + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB +#endif /* GL_WIN_phong_shading */ +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC +#endif /* GL_WIN_specular_fog */ #ifdef __cplusplus } #endif -#endif - +#endif \ No newline at end of file diff --git a/code/rd-vanilla/qgl.h b/code/rd-vanilla/qgl.h index 4dccb8e4bf..891bed18f9 100644 --- a/code/rd-vanilla/qgl.h +++ b/code/rd-vanilla/qgl.h @@ -1,288 +1,410 @@ /* -** QGL.H +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -#ifndef __QGL_H__ -#define __QGL_H__ +#pragma once #if defined( __LINT__ ) - -#include - +# include #elif defined( _WIN32 ) - -#pragma warning (disable: 4201) -#pragma warning (disable: 4214) -#pragma warning (disable: 4514) -#pragma warning (disable: 4032) -#pragma warning (disable: 4201) -#pragma warning (disable: 4214) -#include -#include - +# include +# include #elif defined(MACOS_X) - -#include "../macosx/macosx_glimp.h" - +// Prevent OS X headers from including its own glext header +# define GL_GLEXT_LEGACY +# include #elif defined( __linux__ ) - -#include - +# include +# include +// bk001129 - from cvs1.17 (mkv) +# if defined(__FX__) +# include +# endif +#elif defined( __FreeBSD__ ) // rb010123 +# include +# include +# if defined(__FX__) +# include +# endif #else - -#include - -#endif - -#ifndef APIENTRY -#define APIENTRY -#endif -#ifndef WINAPI -#define WINAPI -#endif - - -//=========================================================================== - -/* -** multitexture extension definitions -*/ -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_ACTIVE_TEXTURES_ARB 0x84E2 - -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 - -#define GL_TEXTURE_RECTANGLE_EXT 0x84F5 - -typedef void (APIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum target); -typedef void (APIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum target); - - -// Steps to adding a new extension: -// - Add the typedef and function pointer externs here. -// - Define the function pointer in tr_init.cpp and possibly add a cvar to track your ext status. -// - Load the extension in win_glimp.cpp. - - -///////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Register Combiner extension definitions. - AReis -/***********************************************************************************************************/ -// NOTE: These are obviously not all the regcom flags. I'm only including the ones I use (to reduce code clutter), so -// if you need any of the other flags, just add them. -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_DISCARD_NV 0x8530 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 - -typedef void (APIENTRY *PFNGLCOMBINERPARAMETERFVNV) (GLenum pname,const GLfloat *params); -typedef void (APIENTRY *PFNGLCOMBINERPARAMETERIVNV) (GLenum pname,const GLint *params); -typedef void (APIENTRY *PFNGLCOMBINERPARAMETERFNV) (GLenum pname,GLfloat param); -typedef void (APIENTRY *PFNGLCOMBINERPARAMETERINV) (GLenum pname,GLint param); -typedef void (APIENTRY *PFNGLCOMBINERINPUTNV) (GLenum stage,GLenum portion,GLenum variable,GLenum input,GLenum mapping, - GLenum componentUsage); -typedef void (APIENTRY *PFNGLCOMBINEROUTPUTNV) (GLenum stage,GLenum portion,GLenum abOutput,GLenum cdOutput,GLenum sumOutput, - GLenum scale, GLenum bias,GLboolean abDotProduct,GLboolean cdDotProduct, - GLboolean muxSum); -typedef void (APIENTRY *PFNGLFINALCOMBINERINPUTNV) (GLenum variable,GLenum input,GLenum mapping,GLenum componentUsage); - -typedef void (APIENTRY *PFNGLGETCOMBINERINPUTPARAMETERFVNV) (GLenum stage,GLenum portion,GLenum variable,GLenum pname,GLfloat *params); -typedef void (APIENTRY *PFNGLGETCOMBINERINPUTPARAMETERIVNV) (GLenum stage,GLenum portion,GLenum variable,GLenum pname,GLint *params); -typedef void (APIENTRY *PFNGLGETCOMBINEROUTPUTPARAMETERFVNV) (GLenum stage,GLenum portion,GLenum pname,GLfloat *params); -typedef void (APIENTRY *PFNGLGETCOMBINEROUTPUTPARAMETERIVNV) (GLenum stage,GLenum portion,GLenum pname,GLint *params); -typedef void (APIENTRY *PFNGLGETFINALCOMBINERINPUTPARAMETERFVNV) (GLenum variable,GLenum pname,GLfloat *params); -typedef void (APIENTRY *PFNGLGETFINALCOMBINERINPUTPARAMETERIVNV) (GLenum variable,GLenum pname,GLint *params); -/***********************************************************************************************************/ - -// Declare Register Combiners function pointers. -extern PFNGLCOMBINERPARAMETERFVNV qglCombinerParameterfvNV; -extern PFNGLCOMBINERPARAMETERIVNV qglCombinerParameterivNV; -extern PFNGLCOMBINERPARAMETERFNV qglCombinerParameterfNV; -extern PFNGLCOMBINERPARAMETERINV qglCombinerParameteriNV; -extern PFNGLCOMBINERINPUTNV qglCombinerInputNV; -extern PFNGLCOMBINEROUTPUTNV qglCombinerOutputNV; -extern PFNGLFINALCOMBINERINPUTNV qglFinalCombinerInputNV; -extern PFNGLGETCOMBINERINPUTPARAMETERFVNV qglGetCombinerInputParameterfvNV; -extern PFNGLGETCOMBINERINPUTPARAMETERIVNV qglGetCombinerInputParameterivNV; -extern PFNGLGETCOMBINEROUTPUTPARAMETERFVNV qglGetCombinerOutputParameterfvNV; -extern PFNGLGETCOMBINEROUTPUTPARAMETERIVNV qglGetCombinerOutputParameterivNV; -extern PFNGLGETFINALCOMBINERINPUTPARAMETERFVNV qglGetFinalCombinerInputParameterfvNV; -extern PFNGLGETFINALCOMBINERINPUTPARAMETERIVNV qglGetFinalCombinerInputParameterivNV; - -#ifdef _WIN32 -///////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Pixel Format extension definitions. - AReis -/***********************************************************************************************************/ -#define WGL_COLOR_BITS_ARB 0x2014 -#define WGL_ALPHA_BITS_ARB 0x201B -#define WGL_DEPTH_BITS_ARB 0x2022 -#define WGL_STENCIL_BITS_ARB 0x2023 - -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); -typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); -/***********************************************************************************************************/ - -// Declare Pixel Format function pointers. -extern PFNWGLGETPIXELFORMATATTRIBIVARBPROC qwglGetPixelFormatAttribivARB; -extern PFNWGLGETPIXELFORMATATTRIBFVARBPROC qwglGetPixelFormatAttribfvARB; -extern PFNWGLCHOOSEPIXELFORMATARBPROC qwglChoosePixelFormatARB; - - -///////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Pixel Buffer extension definitions. - AReis -/***********************************************************************************************************/ -DECLARE_HANDLE(HPBUFFERARB); - -#define WGL_SUPPORT_OPENGL_ARB 0x2010 -#define WGL_DOUBLE_BUFFER_ARB 0x2011 -#define WGL_DRAW_TO_PBUFFER_ARB 0x202D -#define WGL_PBUFFER_WIDTH_ARB 0x2034 -#define WGL_PBUFFER_HEIGHT_ARB 0x2035 -#define WGL_RED_BITS_ARB 0x2015 -#define WGL_GREEN_BITS_ARB 0x2017 -#define WGL_BLUE_BITS_ARB 0x2019 - -typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); -typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); -typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); -typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); -typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue); -/***********************************************************************************************************/ - -// Declare Pixel Buffer function pointers. -extern PFNWGLCREATEPBUFFERARBPROC qwglCreatePbufferARB; -extern PFNWGLGETPBUFFERDCARBPROC qwglGetPbufferDCARB; -extern PFNWGLRELEASEPBUFFERDCARBPROC qwglReleasePbufferDCARB; -extern PFNWGLDESTROYPBUFFERARBPROC qwglDestroyPbufferARB; -extern PFNWGLQUERYPBUFFERARBPROC qwglQueryPbufferARB; - - -///////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Render-Texture extension definitions. - AReis -/***********************************************************************************************************/ -#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 -#define WGL_TEXTURE_FORMAT_ARB 0x2072 -#define WGL_TEXTURE_TARGET_ARB 0x2073 -#define WGL_TEXTURE_RGB_ARB 0x2075 -#define WGL_TEXTURE_RGBA_ARB 0x2076 -#define WGL_TEXTURE_2D_ARB 0x207A -#define WGL_FRONT_LEFT_ARB 0x2083 - -typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); -typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); -typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int * piAttribList); -/***********************************************************************************************************/ - -// Declare Render-Texture function pointers. -extern PFNWGLBINDTEXIMAGEARBPROC qwglBindTexImageARB; -extern PFNWGLRELEASETEXIMAGEARBPROC qwglReleaseTexImageARB; -extern PFNWGLSETPBUFFERATTRIBARBPROC qwglSetPbufferAttribARB; +# include #endif -///////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Vertex and Fragment Program extension definitions. - AReis -/***********************************************************************************************************/ -#ifndef GL_ARB_fragment_program -#define GL_FRAGMENT_PROGRAM_ARB 0x8804 -#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 -#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 -#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 -#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 -#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 -#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A -#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B -#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C -#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D -#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E -#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F -#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 -#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 -#endif +#include "glext.h" + +#define qglAccum glAccum +#define qglAlphaFunc glAlphaFunc +#define qglAreTexturesResident glAreTexturesResident +#define qglArrayElement glArrayElement +#define qglBegin glBegin +#define qglBindTexture glBindTexture +#define qglBitmap glBitmap +#define qglBlendFunc glBlendFunc +#define qglCallList glCallList +#define qglCallLists glCallLists +#define qglClear glClear +#define qglClearAccum glClearAccum +#define qglClearColor glClearColor +#define qglClearDepth glClearDepth +#define qglClearIndex glClearIndex +#define qglClearStencil glClearStencil +#define qglClipPlane glClipPlane +#define qglColor3b glColor3b +#define qglColor3bv glColor3bv +#define qglColor3d glColor3d +#define qglColor3dv glColor3dv +#define qglColor3f glColor3f +#define qglColor3fv glColor3fv +#define qglColor3i glColor3i +#define qglColor3iv glColor3iv +#define qglColor3s glColor3s +#define qglColor3sv glColor3sv +#define qglColor3ub glColor3ub +#define qglColor3ubv glColor3ubv +#define qglColor3ui glColor3ui +#define qglColor3uiv glColor3uiv +#define qglColor3us glColor3us +#define qglColor3usv glColor3usv +#define qglColor4b glColor4b +#define qglColor4bv glColor4bv +#define qglColor4d glColor4d +#define qglColor4dv glColor4dv +#define qglColor4f glColor4f +#define qglColor4fv glColor4fv +#define qglColor4i glColor4i +#define qglColor4iv glColor4iv +#define qglColor4s glColor4s +#define qglColor4sv glColor4sv +#define qglColor4ub glColor4ub +#define qglColor4ubv glColor4ubv +#define qglColor4ui glColor4ui +#define qglColor4uiv glColor4uiv +#define qglColor4us glColor4us +#define qglColor4usv glColor4usv +#define qglColorMask glColorMask +#define qglColorMaterial glColorMaterial +#define qglColorPointer glColorPointer +#define qglCopyPixels glCopyPixels +#define qglCopyTexImage1D glCopyTexImage1D +#define qglCopyTexImage2D glCopyTexImage2D +#define qglCopyTexSubImage1D glCopyTexSubImage1D +#define qglCopyTexSubImage2D glCopyTexSubImage2D +#define qglCullFace glCullFace +#define qglDeleteLists glDeleteLists +#define qglDeleteTextures glDeleteTextures +#define qglDepthFunc glDepthFunc +#define qglDepthMask glDepthMask +#define qglDepthRange glDepthRange +#define qglDisable glDisable +#define qglDisableClientState glDisableClientState +#define qglDrawArrays glDrawArrays +#define qglDrawBuffer glDrawBuffer +#define qglDrawElements glDrawElements +#define qglDrawPixels glDrawPixels +#define qglEdgeFlag glEdgeFlag +#define qglEdgeFlagPointer glEdgeFlagPointer +#define qglEdgeFlagv glEdgeFlagv +#define qglEnable glEnable +#define qglEnableClientState glEnableClientState +#define qglEnd glEnd +#define qglEndList glEndList +#define qglEvalCoord1d glEvalCoord1d +#define qglEvalCoord1dv glEvalCoord1dv +#define qglEvalCoord1f glEvalCoord1f +#define qglEvalCoord1fv glEvalCoord1fv +#define qglEvalCoord2d glEvalCoord2d +#define qglEvalCoord2dv glEvalCoord2dv +#define qglEvalCoord2f glEvalCoord2f +#define qglEvalCoord2fv glEvalCoord2fv +#define qglEvalMesh1 glEvalMesh1 +#define qglEvalMesh2 glEvalMesh2 +#define qglEvalPoint1 glEvalPoint1 +#define qglEvalPoint2 glEvalPoint2 +#define qglFeedbackBuffer glFeedbackBuffer +#define qglFinish glFinish +#define qglFlush glFlush +#define qglFogf glFogf +#define qglFogfv glFogfv +#define qglFogi glFogi +#define qglFogiv glFogiv +#define qglFrontFace glFrontFace +#define qglFrustum glFrustum +#define qglGenLists glGenLists +#define qglGenTextures glGenTextures +#define qglGetBooleanv glGetBooleanv +#define qglGetClipPlane glGetClipPlane +#define qglGetDoublev glGetDoublev +#define qglGetError glGetError +#define qglGetFloatv glGetFloatv +#define qglGetIntegerv glGetIntegerv +#define qglGetLightfv glGetLightfv +#define qglGetLightiv glGetLightiv +#define qglGetMapdv glGetMapdv +#define qglGetMapfv glGetMapfv +#define qglGetMapiv glGetMapiv +#define qglGetMaterialfv glGetMaterialfv +#define qglGetMaterialiv glGetMaterialiv +#define qglGetPixelMapfv glGetPixelMapfv +#define qglGetPixelMapuiv glGetPixelMapuiv +#define qglGetPixelMapusv glGetPixelMapusv +#define qglGetPointerv glGetPointerv +#define qglGetPolygonStipple glGetPolygonStipple +#define qglGetString glGetString +#define qglGetTexGendv glGetTexGendv +#define qglGetTexGenfv glGetTexGenfv +#define qglGetTexGeniv glGetTexGeniv +#define qglGetTexImage glGetTexImage +#define qglGetTexLevelParameterfv glGetTexLevelParameterfv +#define qglGetTexLevelParameteriv glGetTexLevelParameteriv +#define qglGetTexParameterfv glGetTexParameterfv +#define qglGetTexParameteriv glGetTexParameteriv +#define qglHint glHint +#define qglIndexMask glIndexMask +#define qglIndexPointer glIndexPointer +#define qglIndexd glIndexd +#define qglIndexdv glIndexdv +#define qglIndexf glIndexf +#define qglIndexfv glIndexfv +#define qglIndexi glIndexi +#define qglIndexiv glIndexiv +#define qglIndexs glIndexs +#define qglIndexsv glIndexsv +#define qglIndexub glIndexub +#define qglIndexubv glIndexubv +#define qglInitNames glInitNames +#define qglInterleavedArrays glInterleavedArrays +#define qglIsEnabled glIsEnabled +#define qglIsList glIsList +#define qglIsTexture glIsTexture +#define qglLightModelf glLightModelf +#define qglLightModelfv glLightModelfv +#define qglLightModeli glLightModeli +#define qglLightModeliv glLightModeliv +#define qglLightf glLightf +#define qglLightfv glLightfv +#define qglLighti glLighti +#define qglLightiv glLightiv +#define qglLineStipple glLineStipple +#define qglLineWidth glLineWidth +#define qglListBase glListBase +#define qglLoadIdentity glLoadIdentity +#define qglLoadMatrixd glLoadMatrixd +#define qglLoadMatrixf glLoadMatrixf +#define qglLoadName glLoadName +#define qglLogicOp glLogicOp +#define qglMap1d glMap1d +#define qglMap1f glMap1f +#define qglMap2d glMap2d +#define qglMap2f glMap2f +#define qglMapGrid1d glMapGrid1d +#define qglMapGrid1f glMapGrid1f +#define qglMapGrid2d glMapGrid2d +#define qglMapGrid2f glMapGrid2f +#define qglMaterialf glMaterialf +#define qglMaterialfv glMaterialfv +#define qglMateriali glMateriali +#define qglMaterialiv glMaterialiv +#define qglMatrixMode glMatrixMode +#define qglMultMatrixd glMultMatrixd +#define qglMultMatrixf glMultMatrixf +#define qglNewList glNewList +#define qglNormal3b glNormal3b +#define qglNormal3bv glNormal3bv +#define qglNormal3d glNormal3d +#define qglNormal3dv glNormal3dv +#define qglNormal3f glNormal3f +#define qglNormal3fv glNormal3fv +#define qglNormal3i glNormal3i +#define qglNormal3iv glNormal3iv +#define qglNormal3s glNormal3s +#define qglNormal3sv glNormal3sv +#define qglNormalPointer glNormalPointer +#define qglOrtho glOrtho +#define qglPassThrough glPassThrough +#define qglPixelMapfv glPixelMapfv +#define qglPixelMapuiv glPixelMapuiv +#define qglPixelMapusv glPixelMapusv +#define qglPixelStoref glPixelStoref +#define qglPixelStorei glPixelStorei +#define qglPixelTransferf glPixelTransferf +#define qglPixelTransferi glPixelTransferi +#define qglPixelZoom glPixelZoom +#define qglPointSize glPointSize +#define qglPolygonMode glPolygonMode +#define qglPolygonOffset glPolygonOffset +#define qglPolygonStipple glPolygonStipple +#define qglPopAttrib glPopAttrib +#define qglPopClientAttrib glPopClientAttrib +#define qglPopMatrix glPopMatrix +#define qglPopName glPopName +#define qglPrioritizeTextures glPrioritizeTextures +#define qglPushAttrib glPushAttrib +#define qglPushClientAttrib glPushClientAttrib +#define qglPushMatrix glPushMatrix +#define qglPushName glPushName +#define qglRasterPos2d glRasterPos2d +#define qglRasterPos2dv glRasterPos2dv +#define qglRasterPos2f glRasterPos2f +#define qglRasterPos2fv glRasterPos2fv +#define qglRasterPos2i glRasterPos2i +#define qglRasterPos2iv glRasterPos2iv +#define qglRasterPos2s glRasterPos2s +#define qglRasterPos2sv glRasterPos2sv +#define qglRasterPos3d glRasterPos3d +#define qglRasterPos3dv glRasterPos3dv +#define qglRasterPos3f glRasterPos3f +#define qglRasterPos3fv glRasterPos3fv +#define qglRasterPos3i glRasterPos3i +#define qglRasterPos3iv glRasterPos3iv +#define qglRasterPos3s glRasterPos3s +#define qglRasterPos3sv glRasterPos3sv +#define qglRasterPos4d glRasterPos4d +#define qglRasterPos4dv glRasterPos4dv +#define qglRasterPos4f glRasterPos4f +#define qglRasterPos4fv glRasterPos4fv +#define qglRasterPos4i glRasterPos4i +#define qglRasterPos4iv glRasterPos4iv +#define qglRasterPos4s glRasterPos4s +#define qglRasterPos4sv glRasterPos4sv +#define qglReadBuffer glReadBuffer +#define qglReadPixels glReadPixels +#define qglRectd glRectd +#define qglRectdv glRectdv +#define qglRectf glRectf +#define qglRectfv glRectfv +#define qglRecti glRecti +#define qglRectiv glRectiv +#define qglRects glRects +#define qglRectsv glRectsv +#define qglRenderMode glRenderMode +#define qglRotated glRotated +#define qglRotatef glRotatef +#define qglScaled glScaled +#define qglScalef glScalef +#define qglScissor glScissor +#define qglSelectBuffer glSelectBuffer +#define qglShadeModel glShadeModel +#define qglStencilFunc glStencilFunc +#define qglStencilMask glStencilMask +#define qglStencilOp glStencilOp +#define qglTexCoord1d glTexCoord1d +#define qglTexCoord1dv glTexCoord1dv +#define qglTexCoord1f glTexCoord1f +#define qglTexCoord1fv glTexCoord1fv +#define qglTexCoord1i glTexCoord1i +#define qglTexCoord1iv glTexCoord1iv +#define qglTexCoord1s glTexCoord1s +#define qglTexCoord1sv glTexCoord1sv +#define qglTexCoord2d glTexCoord2d +#define qglTexCoord2dv glTexCoord2dv +#define qglTexCoord2f glTexCoord2f +#define qglTexCoord2fv glTexCoord2fv +#define qglTexCoord2i glTexCoord2i +#define qglTexCoord2iv glTexCoord2iv +#define qglTexCoord2s glTexCoord2s +#define qglTexCoord2sv glTexCoord2sv +#define qglTexCoord3d glTexCoord3d +#define qglTexCoord3dv glTexCoord3dv +#define qglTexCoord3f glTexCoord3f +#define qglTexCoord3fv glTexCoord3fv +#define qglTexCoord3i glTexCoord3i +#define qglTexCoord3iv glTexCoord3iv +#define qglTexCoord3s glTexCoord3s +#define qglTexCoord3sv glTexCoord3sv +#define qglTexCoord4d glTexCoord4d +#define qglTexCoord4dv glTexCoord4dv +#define qglTexCoord4f glTexCoord4f +#define qglTexCoord4fv glTexCoord4fv +#define qglTexCoord4i glTexCoord4i +#define qglTexCoord4iv glTexCoord4iv +#define qglTexCoord4s glTexCoord4s +#define qglTexCoord4sv glTexCoord4sv +#define qglTexCoordPointer glTexCoordPointer +#define qglTexEnvf glTexEnvf +#define qglTexEnvfv glTexEnvfv +#define qglTexEnvi glTexEnvi +#define qglTexEnviv glTexEnviv +#define qglTexGend glTexGend +#define qglTexGendv glTexGendv +#define qglTexGenf glTexGenf +#define qglTexGenfv glTexGenfv +#define qglTexGeni glTexGeni +#define qglTexGeniv glTexGeniv +#define qglTexImage1D glTexImage1D +#define qglTexImage2D glTexImage2D +#define qglTexParameterf glTexParameterf +#define qglTexParameterfv glTexParameterfv +#define qglTexParameteri glTexParameteri +#define qglTexParameteriv glTexParameteriv +#define qglTexSubImage1D glTexSubImage1D +#define qglTexSubImage2D glTexSubImage2D +#define qglTranslated glTranslated +#define qglTranslatef glTranslatef +#define qglVertex2d glVertex2d +#define qglVertex2dv glVertex2dv +#define qglVertex2f glVertex2f +#define qglVertex2fv glVertex2fv +#define qglVertex2i glVertex2i +#define qglVertex2iv glVertex2iv +#define qglVertex2s glVertex2s +#define qglVertex2sv glVertex2sv +#define qglVertex3d glVertex3d +#define qglVertex3dv glVertex3dv +#define qglVertex3f glVertex3f +#define qglVertex3fv glVertex3fv +#define qglVertex3i glVertex3i +#define qglVertex3iv glVertex3iv +#define qglVertex3s glVertex3s +#define qglVertex3sv glVertex3sv +#define qglVertex4d glVertex4d +#define qglVertex4dv glVertex4dv +#define qglVertex4f glVertex4f +#define qglVertex4fv glVertex4fv +#define qglVertex4i glVertex4i +#define qglVertex4iv glVertex4iv +#define qglVertex4s glVertex4s +#define qglVertex4sv glVertex4sv +#define qglVertexPointer glVertexPointer +#define qglViewport glViewport + +extern PFNGLACTIVETEXTUREARBPROC qglActiveTextureARB; +extern PFNGLCLIENTACTIVETEXTUREARBPROC qglClientActiveTextureARB; +extern PFNGLMULTITEXCOORD2FARBPROC qglMultiTexCoord2fARB; + +extern PFNGLCOMBINERPARAMETERFVNVPROC qglCombinerParameterfvNV; +extern PFNGLCOMBINERPARAMETERIVNVPROC qglCombinerParameterivNV; +extern PFNGLCOMBINERPARAMETERFNVPROC qglCombinerParameterfNV; +extern PFNGLCOMBINERPARAMETERINVPROC qglCombinerParameteriNV; +extern PFNGLCOMBINERINPUTNVPROC qglCombinerInputNV; +extern PFNGLCOMBINEROUTPUTNVPROC qglCombinerOutputNV; + +extern PFNGLFINALCOMBINERINPUTNVPROC qglFinalCombinerInputNV; +extern PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC qglGetCombinerInputParameterfvNV; +extern PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC qglGetCombinerInputParameterivNV; +extern PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC qglGetCombinerOutputParameterfvNV; +extern PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC qglGetCombinerOutputParameterivNV; +extern PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC qglGetFinalCombinerInputParameterfvNV; +extern PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC qglGetFinalCombinerInputParameterivNV; -// NOTE: These are obviously not all the vertex program flags (have you seen how many there actually are!). I'm -// only including the ones I use (to reduce code clutter), so if you need any of the other flags, just add them. -#define GL_VERTEX_PROGRAM_ARB 0x8620 -#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 - -typedef void (APIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); -typedef void (APIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); -typedef void (APIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); -typedef void (APIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); -typedef GLboolean (APIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program); -/***********************************************************************************************************/ - -// Declare Vertex and Fragment Program function pointers. extern PFNGLPROGRAMSTRINGARBPROC qglProgramStringARB; extern PFNGLBINDPROGRAMARBPROC qglBindProgramARB; extern PFNGLDELETEPROGRAMSARBPROC qglDeleteProgramsARB; @@ -303,423 +425,5 @@ extern PFNGLGETPROGRAMIVARBPROC qglGetProgramivARB; extern PFNGLGETPROGRAMSTRINGARBPROC qglGetProgramStringARB; extern PFNGLISPROGRAMARBPROC qglIsProgramARB; - -/* -** extension constants -*/ - - -// S3TC compression constants -#define GL_RGB_S3TC 0x83A0 -#define GL_RGB4_S3TC 0x83A1 - - -// extensions will be function pointers on all platforms - -extern void ( APIENTRY * qglMultiTexCoord2fARB )( GLenum texture, GLfloat s, GLfloat t ); -extern void ( APIENTRY * qglActiveTextureARB )( GLenum texture ); -extern void ( APIENTRY * qglClientActiveTextureARB )( GLenum texture ); - -extern void ( APIENTRY * qglLockArraysEXT) (GLint, GLint); -extern void ( APIENTRY * qglUnlockArraysEXT) (void); - -//=========================================================================== - -// non-windows systems will just redefine qgl* to gl* -#if !defined( _WIN32 ) && !defined( __linux__ ) && !defined(MACOS_X) - -#include "qgl_linked.h" - -#else - -// windows systems use a function pointer for each call so we can load minidrivers - -extern void ( APIENTRY * qglAccum )(GLenum op, GLfloat value); -extern void ( APIENTRY * qglAlphaFunc )(GLenum func, GLclampf ref); -extern GLboolean ( APIENTRY * qglAreTexturesResident )(GLsizei n, const GLuint *textures, GLboolean *residences); -extern void ( APIENTRY * qglArrayElement )(GLint i); -extern void ( APIENTRY * qglBegin )(GLenum mode); -extern void ( APIENTRY * qglBindTexture )(GLenum target, GLuint texture); -extern void ( APIENTRY * qglBitmap )(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); -extern void ( APIENTRY * qglBlendFunc )(GLenum sfactor, GLenum dfactor); -extern void ( APIENTRY * qglCallList )(GLuint list); -extern void ( APIENTRY * qglCallLists )(GLsizei n, GLenum type, const GLvoid *lists); -extern void ( APIENTRY * qglClear )(GLbitfield mask); -extern void ( APIENTRY * qglClearAccum )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -extern void ( APIENTRY * qglClearColor )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -extern void ( APIENTRY * qglClearDepth )(GLclampd depth); -extern void ( APIENTRY * qglClearIndex )(GLfloat c); -extern void ( APIENTRY * qglClearStencil )(GLint s); -extern void ( APIENTRY * qglClipPlane )(GLenum plane, const GLdouble *equation); -extern void ( APIENTRY * qglColor3b )(GLbyte red, GLbyte green, GLbyte blue); -extern void ( APIENTRY * qglColor3bv )(const GLbyte *v); -extern void ( APIENTRY * qglColor3d )(GLdouble red, GLdouble green, GLdouble blue); -extern void ( APIENTRY * qglColor3dv )(const GLdouble *v); -extern void ( APIENTRY * qglColor3f )(GLfloat red, GLfloat green, GLfloat blue); -extern void ( APIENTRY * qglColor3fv )(const GLfloat *v); -extern void ( APIENTRY * qglColor3i )(GLint red, GLint green, GLint blue); -extern void ( APIENTRY * qglColor3iv )(const GLint *v); -extern void ( APIENTRY * qglColor3s )(GLshort red, GLshort green, GLshort blue); -extern void ( APIENTRY * qglColor3sv )(const GLshort *v); -extern void ( APIENTRY * qglColor3ub )(GLubyte red, GLubyte green, GLubyte blue); -extern void ( APIENTRY * qglColor3ubv )(const GLubyte *v); -extern void ( APIENTRY * qglColor3ui )(GLuint red, GLuint green, GLuint blue); -extern void ( APIENTRY * qglColor3uiv )(const GLuint *v); -extern void ( APIENTRY * qglColor3us )(GLushort red, GLushort green, GLushort blue); -extern void ( APIENTRY * qglColor3usv )(const GLushort *v); -extern void ( APIENTRY * qglColor4b )(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -extern void ( APIENTRY * qglColor4bv )(const GLbyte *v); -extern void ( APIENTRY * qglColor4d )(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -extern void ( APIENTRY * qglColor4dv )(const GLdouble *v); -extern void ( APIENTRY * qglColor4f )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -extern void ( APIENTRY * qglColor4fv )(const GLfloat *v); -extern void ( APIENTRY * qglColor4i )(GLint red, GLint green, GLint blue, GLint alpha); -extern void ( APIENTRY * qglColor4iv )(const GLint *v); -extern void ( APIENTRY * qglColor4s )(GLshort red, GLshort green, GLshort blue, GLshort alpha); -extern void ( APIENTRY * qglColor4sv )(const GLshort *v); -extern void ( APIENTRY * qglColor4ub )(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -extern void ( APIENTRY * qglColor4ubv )(const GLubyte *v); -extern void ( APIENTRY * qglColor4ui )(GLuint red, GLuint green, GLuint blue, GLuint alpha); -extern void ( APIENTRY * qglColor4uiv )(const GLuint *v); -extern void ( APIENTRY * qglColor4us )(GLushort red, GLushort green, GLushort blue, GLushort alpha); -extern void ( APIENTRY * qglColor4usv )(const GLushort *v); -extern void ( APIENTRY * qglColorMask )(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -extern void ( APIENTRY * qglColorMaterial )(GLenum face, GLenum mode); -extern void ( APIENTRY * qglColorPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -extern void ( APIENTRY * qglCopyPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -extern void ( APIENTRY * qglCopyTexImage1D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -extern void ( APIENTRY * qglCopyTexImage2D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -extern void ( APIENTRY * qglCopyTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -extern void ( APIENTRY * qglCopyTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -extern void ( APIENTRY * qglCullFace )(GLenum mode); -extern void ( APIENTRY * qglDeleteLists )(GLuint list, GLsizei range); -extern void ( APIENTRY * qglDeleteTextures )(GLsizei n, const GLuint *textures); -extern void ( APIENTRY * qglDepthFunc )(GLenum func); -extern void ( APIENTRY * qglDepthMask )(GLboolean flag); -extern void ( APIENTRY * qglDepthRange )(GLclampd zNear, GLclampd zFar); -extern void ( APIENTRY * qglDisable )(GLenum cap); -extern void ( APIENTRY * qglDisableClientState )(GLenum array); -extern void ( APIENTRY * qglDrawArrays )(GLenum mode, GLint first, GLsizei count); -extern void ( APIENTRY * qglDrawBuffer )(GLenum mode); -extern void ( APIENTRY * qglDrawElements )(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -extern void ( APIENTRY * qglDrawPixels )(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -extern void ( APIENTRY * qglEdgeFlag )(GLboolean flag); -extern void ( APIENTRY * qglEdgeFlagPointer )(GLsizei stride, const GLvoid *pointer); -extern void ( APIENTRY * qglEdgeFlagv )(const GLboolean *flag); -extern void ( APIENTRY * qglEnable )(GLenum cap); -extern void ( APIENTRY * qglEnableClientState )(GLenum array); -extern void ( APIENTRY * qglEnd )(void); -extern void ( APIENTRY * qglEndList )(void); -extern void ( APIENTRY * qglEvalCoord1d )(GLdouble u); -extern void ( APIENTRY * qglEvalCoord1dv )(const GLdouble *u); -extern void ( APIENTRY * qglEvalCoord1f )(GLfloat u); -extern void ( APIENTRY * qglEvalCoord1fv )(const GLfloat *u); -extern void ( APIENTRY * qglEvalCoord2d )(GLdouble u, GLdouble v); -extern void ( APIENTRY * qglEvalCoord2dv )(const GLdouble *u); -extern void ( APIENTRY * qglEvalCoord2f )(GLfloat u, GLfloat v); -extern void ( APIENTRY * qglEvalCoord2fv )(const GLfloat *u); -extern void ( APIENTRY * qglEvalMesh1 )(GLenum mode, GLint i1, GLint i2); -extern void ( APIENTRY * qglEvalMesh2 )(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -extern void ( APIENTRY * qglEvalPoint1 )(GLint i); -extern void ( APIENTRY * qglEvalPoint2 )(GLint i, GLint j); -extern void ( APIENTRY * qglFeedbackBuffer )(GLsizei size, GLenum type, GLfloat *buffer); -extern void ( APIENTRY * qglFinish )(void); -extern void ( APIENTRY * qglFlush )(void); -extern void ( APIENTRY * qglFogf )(GLenum pname, GLfloat param); -extern void ( APIENTRY * qglFogfv )(GLenum pname, const GLfloat *params); -extern void ( APIENTRY * qglFogi )(GLenum pname, GLint param); -extern void ( APIENTRY * qglFogiv )(GLenum pname, const GLint *params); -extern void ( APIENTRY * qglFrontFace )(GLenum mode); -extern void ( APIENTRY * qglFrustum )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -extern GLuint ( APIENTRY * qglGenLists )(GLsizei range); -extern void ( APIENTRY * qglGenTextures )(GLsizei n, GLuint *textures); -extern void ( APIENTRY * qglGetBooleanv )(GLenum pname, GLboolean *params); -extern void ( APIENTRY * qglGetClipPlane )(GLenum plane, GLdouble *equation); -extern void ( APIENTRY * qglGetDoublev )(GLenum pname, GLdouble *params); -extern GLenum ( APIENTRY * qglGetError )(void); -extern void ( APIENTRY * qglGetFloatv )(GLenum pname, GLfloat *params); -extern void ( APIENTRY * qglGetIntegerv )(GLenum pname, GLint *params); -extern void ( APIENTRY * qglGetLightfv )(GLenum light, GLenum pname, GLfloat *params); -extern void ( APIENTRY * qglGetLightiv )(GLenum light, GLenum pname, GLint *params); -extern void ( APIENTRY * qglGetMapdv )(GLenum target, GLenum query, GLdouble *v); -extern void ( APIENTRY * qglGetMapfv )(GLenum target, GLenum query, GLfloat *v); -extern void ( APIENTRY * qglGetMapiv )(GLenum target, GLenum query, GLint *v); -extern void ( APIENTRY * qglGetMaterialfv )(GLenum face, GLenum pname, GLfloat *params); -extern void ( APIENTRY * qglGetMaterialiv )(GLenum face, GLenum pname, GLint *params); -extern void ( APIENTRY * qglGetPixelMapfv )(GLenum map, GLfloat *values); -extern void ( APIENTRY * qglGetPixelMapuiv )(GLenum map, GLuint *values); -extern void ( APIENTRY * qglGetPixelMapusv )(GLenum map, GLushort *values); -extern void ( APIENTRY * qglGetPointerv )(GLenum pname, GLvoid* *params); -extern void ( APIENTRY * qglGetPolygonStipple )(GLubyte *mask); -extern const GLubyte * ( APIENTRY * qglGetString )(GLenum name); -extern void ( APIENTRY * qglGetTexEnvfv )(GLenum target, GLenum pname, GLfloat *params); -extern void ( APIENTRY * qglGetTexEnviv )(GLenum target, GLenum pname, GLint *params); -extern void ( APIENTRY * qglGetTexGendv )(GLenum coord, GLenum pname, GLdouble *params); -extern void ( APIENTRY * qglGetTexGenfv )(GLenum coord, GLenum pname, GLfloat *params); -extern void ( APIENTRY * qglGetTexGeniv )(GLenum coord, GLenum pname, GLint *params); -extern void ( APIENTRY * qglGetTexImage )(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -extern void ( APIENTRY * qglGetTexLevelParameterfv )(GLenum target, GLint level, GLenum pname, GLfloat *params); -extern void ( APIENTRY * qglGetTexLevelParameteriv )(GLenum target, GLint level, GLenum pname, GLint *params); -extern void ( APIENTRY * qglGetTexParameterfv )(GLenum target, GLenum pname, GLfloat *params); -extern void ( APIENTRY * qglGetTexParameteriv )(GLenum target, GLenum pname, GLint *params); -extern void ( APIENTRY * qglHint )(GLenum target, GLenum mode); -extern void ( APIENTRY * qglIndexMask )(GLuint mask); -extern void ( APIENTRY * qglIndexPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -extern void ( APIENTRY * qglIndexd )(GLdouble c); -extern void ( APIENTRY * qglIndexdv )(const GLdouble *c); -extern void ( APIENTRY * qglIndexf )(GLfloat c); -extern void ( APIENTRY * qglIndexfv )(const GLfloat *c); -extern void ( APIENTRY * qglIndexi )(GLint c); -extern void ( APIENTRY * qglIndexiv )(const GLint *c); -extern void ( APIENTRY * qglIndexs )(GLshort c); -extern void ( APIENTRY * qglIndexsv )(const GLshort *c); -extern void ( APIENTRY * qglIndexub )(GLubyte c); -extern void ( APIENTRY * qglIndexubv )(const GLubyte *c); -extern void ( APIENTRY * qglInitNames )(void); -extern void ( APIENTRY * qglInterleavedArrays )(GLenum format, GLsizei stride, const GLvoid *pointer); -extern GLboolean ( APIENTRY * qglIsEnabled )(GLenum cap); -extern GLboolean ( APIENTRY * qglIsList )(GLuint l); -extern GLboolean ( APIENTRY * qglIsTexture )(GLuint texture); -extern void ( APIENTRY * qglLightModelf )(GLenum pname, GLfloat param); -extern void ( APIENTRY * qglLightModelfv )(GLenum pname, const GLfloat *params); -extern void ( APIENTRY * qglLightModeli )(GLenum pname, GLint param); -extern void ( APIENTRY * qglLightModeliv )(GLenum pname, const GLint *params); -extern void ( APIENTRY * qglLightf )(GLenum light, GLenum pname, GLfloat param); -extern void ( APIENTRY * qglLightfv )(GLenum light, GLenum pname, const GLfloat *params); -extern void ( APIENTRY * qglLighti )(GLenum light, GLenum pname, GLint param); -extern void ( APIENTRY * qglLightiv )(GLenum light, GLenum pname, const GLint *params); -extern void ( APIENTRY * qglLineStipple )(GLint factor, GLushort pattern); -extern void ( APIENTRY * qglLineWidth )(GLfloat width); -extern void ( APIENTRY * qglListBase )(GLuint base); -extern void ( APIENTRY * qglLoadIdentity )(void); -extern void ( APIENTRY * qglLoadMatrixd )(const GLdouble *m); -extern void ( APIENTRY * qglLoadMatrixf )(const GLfloat *m); -extern void ( APIENTRY * qglLoadName )(GLuint name); -extern void ( APIENTRY * qglLogicOp )(GLenum opcode); -extern void ( APIENTRY * qglMap1d )(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -extern void ( APIENTRY * qglMap1f )(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -extern void ( APIENTRY * qglMap2d )(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -extern void ( APIENTRY * qglMap2f )(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -extern void ( APIENTRY * qglMapGrid1d )(GLint un, GLdouble u1, GLdouble u2); -extern void ( APIENTRY * qglMapGrid1f )(GLint un, GLfloat u1, GLfloat u2); -extern void ( APIENTRY * qglMapGrid2d )(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -extern void ( APIENTRY * qglMapGrid2f )(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -extern void ( APIENTRY * qglMaterialf )(GLenum face, GLenum pname, GLfloat param); -extern void ( APIENTRY * qglMaterialfv )(GLenum face, GLenum pname, const GLfloat *params); -extern void ( APIENTRY * qglMateriali )(GLenum face, GLenum pname, GLint param); -extern void ( APIENTRY * qglMaterialiv )(GLenum face, GLenum pname, const GLint *params); -extern void ( APIENTRY * qglMatrixMode )(GLenum mode); -extern void ( APIENTRY * qglMultMatrixd )(const GLdouble *m); -extern void ( APIENTRY * qglMultMatrixf )(const GLfloat *m); -extern void ( APIENTRY * qglNewList )(GLuint list, GLenum mode); -extern void ( APIENTRY * qglNormal3b )(GLbyte nx, GLbyte ny, GLbyte nz); -extern void ( APIENTRY * qglNormal3bv )(const GLbyte *v); -extern void ( APIENTRY * qglNormal3d )(GLdouble nx, GLdouble ny, GLdouble nz); -extern void ( APIENTRY * qglNormal3dv )(const GLdouble *v); -extern void ( APIENTRY * qglNormal3f )(GLfloat nx, GLfloat ny, GLfloat nz); -extern void ( APIENTRY * qglNormal3fv )(const GLfloat *v); -extern void ( APIENTRY * qglNormal3i )(GLint nx, GLint ny, GLint nz); -extern void ( APIENTRY * qglNormal3iv )(const GLint *v); -extern void ( APIENTRY * qglNormal3s )(GLshort nx, GLshort ny, GLshort nz); -extern void ( APIENTRY * qglNormal3sv )(const GLshort *v); -extern void ( APIENTRY * qglNormalPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -extern void ( APIENTRY * qglOrtho )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -extern void ( APIENTRY * qglPassThrough )(GLfloat token); -extern void ( APIENTRY * qglPixelMapfv )(GLenum map, GLsizei mapsize, const GLfloat *values); -extern void ( APIENTRY * qglPixelMapuiv )(GLenum map, GLsizei mapsize, const GLuint *values); -extern void ( APIENTRY * qglPixelMapusv )(GLenum map, GLsizei mapsize, const GLushort *values); -extern void ( APIENTRY * qglPixelStoref )(GLenum pname, GLfloat param); -extern void ( APIENTRY * qglPixelStorei )(GLenum pname, GLint param); -extern void ( APIENTRY * qglPixelTransferf )(GLenum pname, GLfloat param); -extern void ( APIENTRY * qglPixelTransferi )(GLenum pname, GLint param); -extern void ( APIENTRY * qglPixelZoom )(GLfloat xfactor, GLfloat yfactor); -extern void ( APIENTRY * qglPointSize )(GLfloat size); -extern void ( APIENTRY * qglPolygonMode )(GLenum face, GLenum mode); -extern void ( APIENTRY * qglPolygonOffset )(GLfloat factor, GLfloat units); -extern void ( APIENTRY * qglPolygonStipple )(const GLubyte *mask); -extern void ( APIENTRY * qglPopAttrib )(void); -extern void ( APIENTRY * qglPopClientAttrib )(void); -extern void ( APIENTRY * qglPopMatrix )(void); -extern void ( APIENTRY * qglPopName )(void); -extern void ( APIENTRY * qglPrioritizeTextures )(GLsizei n, const GLuint *textures, const GLclampf *priorities); -extern void ( APIENTRY * qglPushAttrib )(GLbitfield mask); -extern void ( APIENTRY * qglPushClientAttrib )(GLbitfield mask); -extern void ( APIENTRY * qglPushMatrix )(void); -extern void ( APIENTRY * qglPushName )(GLuint name); -extern void ( APIENTRY * qglRasterPos2d )(GLdouble x, GLdouble y); -extern void ( APIENTRY * qglRasterPos2dv )(const GLdouble *v); -extern void ( APIENTRY * qglRasterPos2f )(GLfloat x, GLfloat y); -extern void ( APIENTRY * qglRasterPos2fv )(const GLfloat *v); -extern void ( APIENTRY * qglRasterPos2i )(GLint x, GLint y); -extern void ( APIENTRY * qglRasterPos2iv )(const GLint *v); -extern void ( APIENTRY * qglRasterPos2s )(GLshort x, GLshort y); -extern void ( APIENTRY * qglRasterPos2sv )(const GLshort *v); -extern void ( APIENTRY * qglRasterPos3d )(GLdouble x, GLdouble y, GLdouble z); -extern void ( APIENTRY * qglRasterPos3dv )(const GLdouble *v); -extern void ( APIENTRY * qglRasterPos3f )(GLfloat x, GLfloat y, GLfloat z); -extern void ( APIENTRY * qglRasterPos3fv )(const GLfloat *v); -extern void ( APIENTRY * qglRasterPos3i )(GLint x, GLint y, GLint z); -extern void ( APIENTRY * qglRasterPos3iv )(const GLint *v); -extern void ( APIENTRY * qglRasterPos3s )(GLshort x, GLshort y, GLshort z); -extern void ( APIENTRY * qglRasterPos3sv )(const GLshort *v); -extern void ( APIENTRY * qglRasterPos4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -extern void ( APIENTRY * qglRasterPos4dv )(const GLdouble *v); -extern void ( APIENTRY * qglRasterPos4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -extern void ( APIENTRY * qglRasterPos4fv )(const GLfloat *v); -extern void ( APIENTRY * qglRasterPos4i )(GLint x, GLint y, GLint z, GLint w); -extern void ( APIENTRY * qglRasterPos4iv )(const GLint *v); -extern void ( APIENTRY * qglRasterPos4s )(GLshort x, GLshort y, GLshort z, GLshort w); -extern void ( APIENTRY * qglRasterPos4sv )(const GLshort *v); -extern void ( APIENTRY * qglReadBuffer )(GLenum mode); -extern void ( APIENTRY * qglReadPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); -extern void ( APIENTRY * qglRectd )(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -extern void ( APIENTRY * qglRectdv )(const GLdouble *v1, const GLdouble *v2); -extern void ( APIENTRY * qglRectf )(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -extern void ( APIENTRY * qglRectfv )(const GLfloat *v1, const GLfloat *v2); -extern void ( APIENTRY * qglRecti )(GLint x1, GLint y1, GLint x2, GLint y2); -extern void ( APIENTRY * qglRectiv )(const GLint *v1, const GLint *v2); -extern void ( APIENTRY * qglRects )(GLshort x1, GLshort y1, GLshort x2, GLshort y2); -extern void ( APIENTRY * qglRectsv )(const GLshort *v1, const GLshort *v2); -extern GLint ( APIENTRY * qglRenderMode )(GLenum mode); -extern void ( APIENTRY * qglRotated )(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -extern void ( APIENTRY * qglRotatef )(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -extern void ( APIENTRY * qglScaled )(GLdouble x, GLdouble y, GLdouble z); -extern void ( APIENTRY * qglScalef )(GLfloat x, GLfloat y, GLfloat z); -extern void ( APIENTRY * qglScissor )(GLint x, GLint y, GLsizei width, GLsizei height); -extern void ( APIENTRY * qglSelectBuffer )(GLsizei size, GLuint *buffer); -extern void ( APIENTRY * qglShadeModel )(GLenum mode); -extern void ( APIENTRY * qglStencilFunc )(GLenum func, GLint ref, GLuint mask); -extern void ( APIENTRY * qglStencilMask )(GLuint mask); -extern void ( APIENTRY * qglStencilOp )(GLenum fail, GLenum zfail, GLenum zpass); -extern void ( APIENTRY * qglTexCoord1d )(GLdouble s); -extern void ( APIENTRY * qglTexCoord1dv )(const GLdouble *v); -extern void ( APIENTRY * qglTexCoord1f )(GLfloat s); -extern void ( APIENTRY * qglTexCoord1fv )(const GLfloat *v); -extern void ( APIENTRY * qglTexCoord1i )(GLint s); -extern void ( APIENTRY * qglTexCoord1iv )(const GLint *v); -extern void ( APIENTRY * qglTexCoord1s )(GLshort s); -extern void ( APIENTRY * qglTexCoord1sv )(const GLshort *v); -extern void ( APIENTRY * qglTexCoord2d )(GLdouble s, GLdouble t); -extern void ( APIENTRY * qglTexCoord2dv )(const GLdouble *v); -extern void ( APIENTRY * qglTexCoord2f )(GLfloat s, GLfloat t); -extern void ( APIENTRY * qglTexCoord2fv )(const GLfloat *v); -extern void ( APIENTRY * qglTexCoord2i )(GLint s, GLint t); -extern void ( APIENTRY * qglTexCoord2iv )(const GLint *v); -extern void ( APIENTRY * qglTexCoord2s )(GLshort s, GLshort t); -extern void ( APIENTRY * qglTexCoord2sv )(const GLshort *v); -extern void ( APIENTRY * qglTexCoord3d )(GLdouble s, GLdouble t, GLdouble r); -extern void ( APIENTRY * qglTexCoord3dv )(const GLdouble *v); -extern void ( APIENTRY * qglTexCoord3f )(GLfloat s, GLfloat t, GLfloat r); -extern void ( APIENTRY * qglTexCoord3fv )(const GLfloat *v); -extern void ( APIENTRY * qglTexCoord3i )(GLint s, GLint t, GLint r); -extern void ( APIENTRY * qglTexCoord3iv )(const GLint *v); -extern void ( APIENTRY * qglTexCoord3s )(GLshort s, GLshort t, GLshort r); -extern void ( APIENTRY * qglTexCoord3sv )(const GLshort *v); -extern void ( APIENTRY * qglTexCoord4d )(GLdouble s, GLdouble t, GLdouble r, GLdouble q); -extern void ( APIENTRY * qglTexCoord4dv )(const GLdouble *v); -extern void ( APIENTRY * qglTexCoord4f )(GLfloat s, GLfloat t, GLfloat r, GLfloat q); -extern void ( APIENTRY * qglTexCoord4fv )(const GLfloat *v); -extern void ( APIENTRY * qglTexCoord4i )(GLint s, GLint t, GLint r, GLint q); -extern void ( APIENTRY * qglTexCoord4iv )(const GLint *v); -extern void ( APIENTRY * qglTexCoord4s )(GLshort s, GLshort t, GLshort r, GLshort q); -extern void ( APIENTRY * qglTexCoord4sv )(const GLshort *v); -extern void ( APIENTRY * qglTexCoordPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -extern void ( APIENTRY * qglTexEnvf )(GLenum target, GLenum pname, GLfloat param); -extern void ( APIENTRY * qglTexEnvfv )(GLenum target, GLenum pname, const GLfloat *params); -extern void ( APIENTRY * qglTexEnvi )(GLenum target, GLenum pname, GLint param); -extern void ( APIENTRY * qglTexEnviv )(GLenum target, GLenum pname, const GLint *params); -extern void ( APIENTRY * qglTexGend )(GLenum coord, GLenum pname, GLdouble param); -extern void ( APIENTRY * qglTexGendv )(GLenum coord, GLenum pname, const GLdouble *params); -extern void ( APIENTRY * qglTexGenf )(GLenum coord, GLenum pname, GLfloat param); -extern void ( APIENTRY * qglTexGenfv )(GLenum coord, GLenum pname, const GLfloat *params); -extern void ( APIENTRY * qglTexGeni )(GLenum coord, GLenum pname, GLint param); -extern void ( APIENTRY * qglTexGeniv )(GLenum coord, GLenum pname, const GLint *params); -extern void ( APIENTRY * qglTexImage1D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -extern void ( APIENTRY * qglTexImage2D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -extern void ( APIENTRY * qglTexParameterf )(GLenum target, GLenum pname, GLfloat param); -extern void ( APIENTRY * qglTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params); -extern void ( APIENTRY * qglTexParameteri )(GLenum target, GLenum pname, GLint param); -extern void ( APIENTRY * qglTexParameteriv )(GLenum target, GLenum pname, const GLint *params); -extern void ( APIENTRY * qglTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -extern void ( APIENTRY * qglTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -extern void ( APIENTRY * qglTranslated )(GLdouble x, GLdouble y, GLdouble z); -extern void ( APIENTRY * qglTranslatef )(GLfloat x, GLfloat y, GLfloat z); -extern void ( APIENTRY * qglVertex2d )(GLdouble x, GLdouble y); -extern void ( APIENTRY * qglVertex2dv )(const GLdouble *v); -extern void ( APIENTRY * qglVertex2f )(GLfloat x, GLfloat y); -extern void ( APIENTRY * qglVertex2fv )(const GLfloat *v); -extern void ( APIENTRY * qglVertex2i )(GLint x, GLint y); -extern void ( APIENTRY * qglVertex2iv )(const GLint *v); -extern void ( APIENTRY * qglVertex2s )(GLshort x, GLshort y); -extern void ( APIENTRY * qglVertex2sv )(const GLshort *v); -extern void ( APIENTRY * qglVertex3d )(GLdouble x, GLdouble y, GLdouble z); -extern void ( APIENTRY * qglVertex3dv )(const GLdouble *v); -extern void ( APIENTRY * qglVertex3f )(GLfloat x, GLfloat y, GLfloat z); -extern void ( APIENTRY * qglVertex3fv )(const GLfloat *v); -extern void ( APIENTRY * qglVertex3i )(GLint x, GLint y, GLint z); -extern void ( APIENTRY * qglVertex3iv )(const GLint *v); -extern void ( APIENTRY * qglVertex3s )(GLshort x, GLshort y, GLshort z); -extern void ( APIENTRY * qglVertex3sv )(const GLshort *v); -extern void ( APIENTRY * qglVertex4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -extern void ( APIENTRY * qglVertex4dv )(const GLdouble *v); -extern void ( APIENTRY * qglVertex4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -extern void ( APIENTRY * qglVertex4fv )(const GLfloat *v); -extern void ( APIENTRY * qglVertex4i )(GLint x, GLint y, GLint z, GLint w); -extern void ( APIENTRY * qglVertex4iv )(const GLint *v); -extern void ( APIENTRY * qglVertex4s )(GLshort x, GLshort y, GLshort z, GLshort w); -extern void ( APIENTRY * qglVertex4sv )(const GLshort *v); -extern void ( APIENTRY * qglVertexPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -extern void ( APIENTRY * qglViewport )(GLint x, GLint y, GLsizei width, GLsizei height); - -#if defined( _WIN32 ) - -extern BOOL ( WINAPI * qwglCopyContext)(HGLRC, HGLRC, UINT); -extern HGLRC ( WINAPI * qwglCreateContext)(HDC); -extern HGLRC ( WINAPI * qwglCreateLayerContext)(HDC, int); -extern BOOL ( WINAPI * qwglDeleteContext)(HGLRC); -extern HGLRC ( WINAPI * qwglGetCurrentContext)(VOID); -extern HDC ( WINAPI * qwglGetCurrentDC)(VOID); -extern PROC ( WINAPI * qwglGetProcAddress)(LPCSTR); -extern BOOL ( WINAPI * qwglMakeCurrent)(HDC, HGLRC); -extern BOOL ( WINAPI * qwglShareLists)(HGLRC, HGLRC); -extern BOOL ( WINAPI * qwglUseFontBitmaps)(HDC, DWORD, DWORD, DWORD); - -extern BOOL ( WINAPI * qwglUseFontOutlines)(HDC, DWORD, DWORD, DWORD, FLOAT, - FLOAT, int, LPGLYPHMETRICSFLOAT); - -extern BOOL ( WINAPI * qwglDescribeLayerPlane)(HDC, int, int, UINT, - LPLAYERPLANEDESCRIPTOR); -extern int ( WINAPI * qwglSetLayerPaletteEntries)(HDC, int, int, int, - CONST COLORREF *); -extern int ( WINAPI * qwglGetLayerPaletteEntries)(HDC, int, int, int, - COLORREF *); -extern BOOL ( WINAPI * qwglRealizeLayerPalette)(HDC, int, BOOL); -extern BOOL ( WINAPI * qwglSwapLayerBuffers)(HDC, UINT); - -extern BOOL ( WINAPI * qwglSwapIntervalEXT)( int interval ); - -#endif // _WIN32 - -#if 0 //defined( __linux__ ) - -//FX Mesa Functions -extern fxMesaContext (*qfxMesaCreateContext)(GLuint win, GrScreenResolution_t, GrScreenRefresh_t, const GLint attribList[]); -extern fxMesaContext (*qfxMesaCreateBestContext)(GLuint win, GLint width, GLint height, const GLint attribList[]); -extern void (*qfxMesaDestroyContext)(fxMesaContext ctx); -extern void (*qfxMesaMakeCurrent)(fxMesaContext ctx); -extern fxMesaContext (*qfxMesaGetCurrentContext)(void); -extern void (*qfxMesaSwapBuffers)(void); - -//GLX Functions -extern XVisualInfo * (*qglXChooseVisual)( Display *dpy, int screen, int *attribList ); -extern GLXContext (*qglXCreateContext)( Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct ); -extern void (*qglXDestroyContext)( Display *dpy, GLXContext ctx ); -extern Bool (*qglXMakeCurrent)( Display *dpy, GLXDrawable drawable, GLXContext ctx); -extern void (*qglXCopyContext)( Display *dpy, GLXContext src, GLXContext dst, GLuint mask ); -extern void (*qglXSwapBuffers)( Display *dpy, GLXDrawable drawable ); - -#endif // __linux__ - -#endif // _WIN32 && __linux__ - -#endif +extern PFNGLLOCKARRAYSEXTPROC qglLockArraysEXT; +extern PFNGLUNLOCKARRAYSEXTPROC qglUnlockArraysEXT; diff --git a/code/rd-vanilla/tr_WorldEffects.cpp b/code/rd-vanilla/tr_WorldEffects.cpp index 99ad6afe24..b2d348ec26 100644 --- a/code/rd-vanilla/tr_WorldEffects.cpp +++ b/code/rd-vanilla/tr_WorldEffects.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //////////////////////////////////////////////////////////////////////////////////////// // RAVEN SOFTWARE - STAR WARS: JK II @@ -25,19 +29,12 @@ This file is part of Jedi Academy. // //////////////////////////////////////////////////////////////////////////////////////// #include "../server/exe_headers.h" -#ifdef _MSC_VER -#pragma warning( disable : 4512 ) -#endif - - //////////////////////////////////////////////////////////////////////////////////////// // Externs & Fwd Decl. //////////////////////////////////////////////////////////////////////////////////////// extern void SetViewportAndScissor( void ); - - //////////////////////////////////////////////////////////////////////////////////////// // Includes //////////////////////////////////////////////////////////////////////////////////////// @@ -641,7 +638,7 @@ class COutside fileHandle_t WriteCachedWeatherFile( void ) { - fileHandle_t f = ri.FS_FOpenFileWrite( GenCachedWeatherFilename() ); + fileHandle_t f = ri.FS_FOpenFileWrite( GenCachedWeatherFilename(), qtrue ); if (f) { WeatherFileHeader_t WeatherFileHeader; diff --git a/code/rd-vanilla/tr_WorldEffects.h b/code/rd-vanilla/tr_WorldEffects.h index 6b658cab60..48e313257c 100644 --- a/code/rd-vanilla/tr_WorldEffects.h +++ b/code/rd-vanilla/tr_WorldEffects.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //////////////////////////////////////////////////////////////////////////////////////// // RAVEN SOFTWARE - STAR WARS: JK II diff --git a/code/rd-vanilla/tr_arb.cpp b/code/rd-vanilla/tr_arb.cpp new file mode 100644 index 0000000000..0aa70a211a --- /dev/null +++ b/code/rd-vanilla/tr_arb.cpp @@ -0,0 +1,192 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +// tr_glow.c -- this file deals with the arb shaders for dynamic glow + +#include "tr_local.h" + +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Vertex and Pixel Shader definitions. - AReis +/***********************************************************************************************************/ +// This vertex shader basically passes through most values and calculates no lighting. The only +// unusual thing it does is add the inputed texel offsets to all four texture units (this allows +// nearest neighbor pixel peeking). +const unsigned char g_strGlowVShaderARB[] = +{ + "!!ARBvp1.0\ + \ + # Input.\n\ + ATTRIB iPos = vertex.position;\ + ATTRIB iColor = vertex.color;\ + ATTRIB iTex0 = vertex.texcoord[0];\ + ATTRIB iTex1 = vertex.texcoord[1];\ + ATTRIB iTex2 = vertex.texcoord[2];\ + ATTRIB iTex3 = vertex.texcoord[3];\ + \ + # Output.\n\ + OUTPUT oPos = result.position;\ + OUTPUT oColor = result.color;\ + OUTPUT oTex0 = result.texcoord[0];\ + OUTPUT oTex1 = result.texcoord[1];\ + OUTPUT oTex2 = result.texcoord[2];\ + OUTPUT oTex3 = result.texcoord[3];\ + \ + # Constants.\n\ + PARAM ModelViewProj[4]= { state.matrix.mvp };\ + PARAM TexelOffset0 = program.env[0];\ + PARAM TexelOffset1 = program.env[1];\ + PARAM TexelOffset2 = program.env[2];\ + PARAM TexelOffset3 = program.env[3];\ + \ + # Main.\n\ + DP4 oPos.x, ModelViewProj[0], iPos;\ + DP4 oPos.y, ModelViewProj[1], iPos;\ + DP4 oPos.z, ModelViewProj[2], iPos;\ + DP4 oPos.w, ModelViewProj[3], iPos;\ + MOV oColor, iColor;\ + # Notice the optimization of using one texture coord instead of all four.\n\ + ADD oTex0, iTex0, TexelOffset0;\ + ADD oTex1, iTex0, TexelOffset1;\ + ADD oTex2, iTex0, TexelOffset2;\ + ADD oTex3, iTex0, TexelOffset3;\ + \ + END" +}; + +// This Pixel Shader loads four texture units and adds them all together (with a modifier +// multiplied to each in the process). The final output is r0 = t0 + t1 + t2 + t3. +const unsigned char g_strGlowPShaderARB[] = +{ + "!!ARBfp1.0\ + \ + # Input.\n\ + ATTRIB iColor = fragment.color.primary;\ + \ + # Output.\n\ + OUTPUT oColor = result.color;\ + \ + # Constants.\n\ + PARAM Weight = program.env[0];\ + TEMP t0;\ + TEMP t1;\ + TEMP t2;\ + TEMP t3;\ + TEMP r0;\ + \ + # Main.\n\ + TEX t0, fragment.texcoord[0], texture[0], RECT;\ + TEX t1, fragment.texcoord[1], texture[1], RECT;\ + TEX t2, fragment.texcoord[2], texture[2], RECT;\ + TEX t3, fragment.texcoord[3], texture[3], RECT;\ + \ + MUL r0, t0, Weight;\ + MAD r0, t1, Weight, r0;\ + MAD r0, t2, Weight, r0;\ + MAD r0, t3, Weight, r0;\ + \ + MOV oColor, r0;\ + \ + END" +}; +/***********************************************************************************************************/ + +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B + +void ARB_InitGlowShaders(void) { + // Allocate and Load the global 'Glow' Vertex Program. - AReis + if ( qglGenProgramsARB ) + { + qglGenProgramsARB( 1, &tr.glowVShader ); + qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, tr.glowVShader ); + qglProgramStringARB( GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, ( GLsizei ) strlen( ( char * ) g_strGlowVShaderARB ), g_strGlowVShaderARB ); + +// const GLubyte *strErr = qglGetString( GL_PROGRAM_ERROR_STRING_ARB ); + int iErrPos = 0; + qglGetIntegerv( GL_PROGRAM_ERROR_POSITION_ARB, &iErrPos ); + assert( iErrPos == -1 ); + } + + // NOTE: I make an assumption here. If you have (current) nvidia hardware, you obviously support register combiners instead of fragment + // programs, so use those. The problem with this is that nv30 WILL support fragment shaders, breaking this logic. The good thing is that + // if you always ask for regcoms before fragment shaders, you'll always just use regcoms (problem solved... for now). - AReis + + // Load Pixel Shaders (either regcoms or fragprogs). + if ( qglCombinerParameteriNV ) + { + // The purpose of this regcom is to blend all the pixels together from the 4 texture units, but with their + // texture coordinates offset by 1 (or more) texels, effectively letting us blend adjoining pixels. The weight is + // used to either strengthen or weaken the pixel intensity. The more it diffuses (the higher the radius of the glow), + // the higher the intensity should be for a noticable effect. + // Regcom result is: ( tex1 * fBlurWeight ) + ( tex2 * fBlurWeight ) + ( tex2 * fBlurWeight ) + ( tex2 * fBlurWeight ) + + // VV guys, this is the pixel shader you would use instead :-) + /* + // c0 is the blur weight. + ps 1.1 + tex t0 + tex t1 + tex t2 + tex t3 + + mul r0, c0, t0; + madd r0, c0, t1, r0; + madd r0, c0, t2, r0; + madd r0, c0, t3, r0; + */ + tr.glowPShader = qglGenLists( 1 ); + qglNewList( tr.glowPShader, GL_COMPILE ); + qglCombinerParameteriNV( GL_NUM_GENERAL_COMBINERS_NV, 2 ); + + // spare0 = fBlend * tex0 + fBlend * tex1. + qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); + qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, GL_CONSTANT_COLOR0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); + qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV, GL_TEXTURE1_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); + qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV, GL_CONSTANT_COLOR0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); + qglCombinerOutputNV( GL_COMBINER0_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV, GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE ); + + // spare1 = fBlend * tex2 + fBlend * tex3. + qglCombinerInputNV( GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_A_NV, GL_TEXTURE2_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); + qglCombinerInputNV( GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_B_NV, GL_CONSTANT_COLOR0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); + qglCombinerInputNV( GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_C_NV, GL_TEXTURE3_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); + qglCombinerInputNV( GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_D_NV, GL_CONSTANT_COLOR0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); + qglCombinerOutputNV( GL_COMBINER1_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV, GL_SPARE1_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE ); + + // ( A * B ) + ( ( 1 - A ) * C ) + D = ( spare0 * 1 ) + ( ( 1 - spare0 ) * 0 ) + spare1 == spare0 + spare1. + qglFinalCombinerInputNV( GL_VARIABLE_A_NV, GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); + qglFinalCombinerInputNV( GL_VARIABLE_B_NV, GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_RGB ); + qglFinalCombinerInputNV( GL_VARIABLE_C_NV, GL_ZERO, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); + qglFinalCombinerInputNV( GL_VARIABLE_D_NV, GL_SPARE1_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); + qglEndList(); + } + else if ( qglGenProgramsARB ) + { + qglGenProgramsARB( 1, &tr.glowPShader ); + qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, tr.glowPShader ); + qglProgramStringARB( GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, ( GLsizei ) strlen( ( char * ) g_strGlowPShaderARB ), g_strGlowPShaderARB ); + +// const GLubyte *strErr = qglGetString( GL_PROGRAM_ERROR_STRING_ARB ); + int iErrPos = 0; + qglGetIntegerv( GL_PROGRAM_ERROR_POSITION_ARB, &iErrPos ); + assert( iErrPos == -1 ); + } +} diff --git a/code/rd-vanilla/tr_backend.cpp b/code/rd-vanilla/tr_backend.cpp index 1ed18b0fed..680b29b2ce 100644 --- a/code/rd-vanilla/tr_backend.cpp +++ b/code/rd-vanilla/tr_backend.cpp @@ -1,26 +1,28 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - #include "tr_local.h" backEndData_t *backEndData; @@ -129,14 +131,14 @@ void GL_Cull( int cullType ) { } glState.faceCulling = cullType; if (backEnd.projection2D){ //don't care, we're in 2d when it's always disabled - return; + return; } - if ( cullType == CT_TWO_SIDED ) + if ( cullType == CT_TWO_SIDED ) { qglDisable( GL_CULL_FACE ); - } - else + } + else { qglEnable( GL_CULL_FACE ); @@ -423,9 +425,9 @@ void SetViewportAndScissor( void ) { qglMatrixMode(GL_MODELVIEW); // set the window clipping - qglViewport( backEnd.viewParms.viewportX, backEnd.viewParms.viewportY, + qglViewport( backEnd.viewParms.viewportX, backEnd.viewParms.viewportY, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); - qglScissor( backEnd.viewParms.viewportX, backEnd.viewParms.viewportY, + qglScissor( backEnd.viewParms.viewportX, backEnd.viewParms.viewportY, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); } @@ -485,7 +487,7 @@ static void RB_BeginDrawingView (void) { { qglClearColor ( 0.3f, 0.3f, 0.3f, 1.0 ); } - } + } } } else @@ -590,7 +592,7 @@ static inline bool R_WorldCoordToScreenCoordFloat(vec3_t worldCoord, float *x, f transformed[0] = DotProduct(local,vright); transformed[1] = DotProduct(local,vup); - transformed[2] = DotProduct(local,vfwd); + transformed[2] = DotProduct(local,vfwd); // Make sure Z is not negative. if(transformed[2] < 0.01) @@ -751,7 +753,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { } } - if (shader != oldShader || fogNum != oldFogNum || dlighted != oldDlighted + if (shader != oldShader || fogNum != oldFogNum || dlighted != oldDlighted || ( entityNum != oldEntityNum && !shader->entityMergable ) ) { if (oldShader != NULL) { @@ -811,11 +813,11 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { switch ( depthRange ) { default: case 0: - qglDepthRange (0, 1); + qglDepthRange (0, 1); break; case 1: - qglDepthRange (0, .3); + qglDepthRange (0, .3); break; case 2: @@ -876,11 +878,11 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { { default: case 0: - qglDepthRange (0, 1); + qglDepthRange (0, 1); break; case 1: - qglDepthRange (0, .3); + qglDepthRange (0, .3); break; case 2: @@ -961,7 +963,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { /* ============================================================================ -RENDER BACK END THREAD FUNCTIONS +RENDER BACK END FUNCTIONS ============================================================================ */ @@ -993,7 +995,7 @@ void RB_SetGL2D (void) { // set time for 2D shaders backEnd.refdef.time = ri.Milliseconds(); - backEnd.refdef.floatTime = backEnd.refdef.time * 0.001; + backEnd.refdef.floatTime = backEnd.refdef.time * 0.001f; } @@ -1028,19 +1030,19 @@ const void *RB_StretchPic ( const void *data ) { cmd = (const stretchPicCommand_t *)data; + if ( !backEnd.projection2D ) { + RB_SetGL2D(); + } + shader = cmd->shader; if ( shader != tess.shader ) { if ( tess.numIndexes ) { - RB_EndSurface(); //this might change culling and other states + RB_EndSurface(); } backEnd.currentEntity = &backEnd.entity2D; RB_BeginSurface( shader, 0 ); } - if ( !backEnd.projection2D ) { - RB_SetGL2D(); //set culling and other states - } - RB_CHECKOVERFLOW( 4, 6 ); numVerts = tess.numVertexes; numIndexes = tess.numIndexes; @@ -1055,10 +1057,11 @@ const void *RB_StretchPic ( const void *data ) { tess.indexes[ numIndexes + 4 ] = numVerts + 0; tess.indexes[ numIndexes + 5 ] = numVerts + 1; - *(int *)tess.vertexColors[ numVerts ] = - *(int *)tess.vertexColors[ numVerts + 1 ] = - *(int *)tess.vertexColors[ numVerts + 2 ] = - *(int *)tess.vertexColors[ numVerts + 3 ] = *(int *)backEnd.color2D; + byteAlias_t *baDest = NULL, *baSource = (byteAlias_t *)&backEnd.color2D; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 0]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 1]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 2]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 3]; baDest->ui = baSource->ui; tess.xyz[ numVerts ][0] = cmd->x; tess.xyz[ numVerts ][1] = cmd->y; @@ -1094,20 +1097,18 @@ const void *RB_StretchPic ( const void *data ) { /* ============= -RB_DrawRotatePic +RB_RotatePic ============= */ -const void *RB_RotatePic ( const void *data ) +const void *RB_RotatePic ( const void *data ) { const rotatePicCommand_t *cmd; shader_t *shader; - int numVerts, numIndexes; - vec3_t point, rotatedPoint; - vec3_t axis = { 0.0f, 0.0f, 1.0f }; - vec3_t xlat; cmd = (const rotatePicCommand_t *)data; + shader = cmd->shader; + if ( !backEnd.projection2D ) { RB_SetGL2D(); } @@ -1122,8 +1123,18 @@ const void *RB_RotatePic ( const void *data ) } RB_CHECKOVERFLOW( 4, 6 ); - numVerts = tess.numVertexes; - numIndexes = tess.numIndexes; + int numVerts = tess.numVertexes; + int numIndexes = tess.numIndexes; + + float angle = DEG2RAD( cmd-> a ); + float s = sinf( angle ); + float c = cosf( angle ); + + matrix3_t m = { + { c, s, 0.0f }, + { -s, c, 0.0f }, + { cmd->x + cmd->w, cmd->y, 1.0f } + }; tess.numVertexes += 4; tess.numIndexes += 6; @@ -1135,37 +1146,36 @@ const void *RB_RotatePic ( const void *data ) tess.indexes[ numIndexes + 4 ] = numVerts + 0; tess.indexes[ numIndexes + 5 ] = numVerts + 1; - *(int *)tess.vertexColors[ numVerts ] = - *(int *)tess.vertexColors[ numVerts + 1 ] = - *(int *)tess.vertexColors[ numVerts + 2 ] = - *(int *)tess.vertexColors[ numVerts + 3 ] = *(int *)backEnd.color2D; - - VectorSet (xlat, cmd->x + cmd->w, cmd->y, 0.0f); + byteAlias_t *baDest = NULL, *baSource = (byteAlias_t *)&backEnd.color2D; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 0]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 1]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 2]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 3]; baDest->ui = baSource->ui; - VectorSet (point, -cmd->w, 0.0f, 0.0f); - RotatePointAroundVector (rotatedPoint, axis, point, cmd->a); - VectorAdd (rotatedPoint, xlat, tess.xyz[numVerts]); + tess.xyz[ numVerts ][0] = m[0][0] * (-cmd->w) + m[2][0]; + tess.xyz[ numVerts ][1] = m[0][1] * (-cmd->w) + m[2][1]; + tess.xyz[ numVerts ][2] = 0; tess.texCoords[ numVerts ][0][0] = cmd->s1; tess.texCoords[ numVerts ][0][1] = cmd->t1; - VectorSet (point, 0.0f, 0.0f, 0.0f); - RotatePointAroundVector (rotatedPoint, axis, point, cmd->a); - VectorAdd (rotatedPoint, xlat, tess.xyz[numVerts + 1]); + tess.xyz[ numVerts + 1 ][0] = m[2][0]; + tess.xyz[ numVerts + 1 ][1] = m[2][1]; + tess.xyz[ numVerts + 1 ][2] = 0; tess.texCoords[ numVerts + 1 ][0][0] = cmd->s2; tess.texCoords[ numVerts + 1 ][0][1] = cmd->t1; - VectorSet (point, 0.0f, cmd->h, 0.0f); - RotatePointAroundVector (rotatedPoint, axis, point, cmd->a); - VectorAdd (rotatedPoint, xlat, tess.xyz[numVerts + 2]); + tess.xyz[ numVerts + 2 ][0] = m[1][0] * (cmd->h) + m[2][0]; + tess.xyz[ numVerts + 2 ][1] = m[1][1] * (cmd->h) + m[2][1]; + tess.xyz[ numVerts + 2 ][2] = 0; tess.texCoords[ numVerts + 2 ][0][0] = cmd->s2; tess.texCoords[ numVerts + 2 ][0][1] = cmd->t2; - VectorSet (point, -cmd->w, cmd->h, 0.0f); - RotatePointAroundVector (rotatedPoint, axis, point, cmd->a); - VectorAdd (rotatedPoint, xlat, tess.xyz[numVerts + 3]); + tess.xyz[ numVerts + 3 ][0] = m[0][0] * (-cmd->w) + m[1][0] * (cmd->h) + m[2][0]; + tess.xyz[ numVerts + 3 ][1] = m[0][1] * (-cmd->w) + m[1][1] * (cmd->h) + m[2][1]; + tess.xyz[ numVerts + 3 ][2] = 0; tess.texCoords[ numVerts + 3 ][0][0] = cmd->s1; tess.texCoords[ numVerts + 3 ][0][1] = cmd->t2; @@ -1175,83 +1185,92 @@ const void *RB_RotatePic ( const void *data ) /* ============= -RB_DrawRotatePic2 +RB_RotatePic2 ============= */ -const void *RB_RotatePic2 ( const void *data ) +const void *RB_RotatePic2 ( const void *data ) { const rotatePicCommand_t *cmd; shader_t *shader; - int numVerts, numIndexes; - vec3_t point, rotatedPoint; - vec3_t axis = { 0.0f, 0.0f, 1.0f }; - vec3_t xlat; cmd = (const rotatePicCommand_t *)data; shader = cmd->shader; - if ( !backEnd.projection2D ) { - RB_SetGL2D(); - } + // FIXME is this needed + if ( shader->numUnfoggedPasses ) + { + if ( !backEnd.projection2D ) { + RB_SetGL2D(); + } - shader = cmd->shader; - if ( shader != tess.shader ) { - if ( tess.numIndexes ) { - RB_EndSurface(); + shader = cmd->shader; + if ( shader != tess.shader ) { + if ( tess.numIndexes ) { + RB_EndSurface(); + } + backEnd.currentEntity = &backEnd.entity2D; + RB_BeginSurface( shader, 0 ); } - backEnd.currentEntity = &backEnd.entity2D; - RB_BeginSurface( shader, 0 ); - } - RB_CHECKOVERFLOW( 4, 6 ); - numVerts = tess.numVertexes; - numIndexes = tess.numIndexes; + RB_CHECKOVERFLOW( 4, 6 ); + int numVerts = tess.numVertexes; + int numIndexes = tess.numIndexes; - tess.numVertexes += 4; - tess.numIndexes += 6; + float angle = DEG2RAD( cmd-> a ); + float s = sinf( angle ); + float c = cosf( angle ); - tess.indexes[numIndexes] = numVerts + 3; - tess.indexes[numIndexes + 1] = numVerts + 0; - tess.indexes[numIndexes + 2] = numVerts + 2; - tess.indexes[numIndexes + 3] = numVerts + 2; - tess.indexes[numIndexes + 4] = numVerts + 0; - tess.indexes[numIndexes + 5] = numVerts + 1; + matrix3_t m = { + { c, s, 0.0f }, + { -s, c, 0.0f }, + { cmd->x, cmd->y, 1.0f } + }; - *(int *)tess.vertexColors[numVerts] = - *(int *)tess.vertexColors[numVerts + 1] = - *(int *)tess.vertexColors[numVerts + 2] = - *(int *)tess.vertexColors[numVerts + 3] = *(int *)backEnd.color2D; + tess.numVertexes += 4; + tess.numIndexes += 6; - VectorSet( xlat, cmd->x, cmd->y, 0.0f ); + tess.indexes[ numIndexes ] = numVerts + 3; + tess.indexes[ numIndexes + 1 ] = numVerts + 0; + tess.indexes[ numIndexes + 2 ] = numVerts + 2; + tess.indexes[ numIndexes + 3 ] = numVerts + 2; + tess.indexes[ numIndexes + 4 ] = numVerts + 0; + tess.indexes[ numIndexes + 5 ] = numVerts + 1; - VectorSet( point, -cmd->w * 0.5f, -cmd->h * 0.5f, 0.0f ); - RotatePointAroundVector( rotatedPoint, axis, point, -cmd->a ); - VectorAdd( rotatedPoint, xlat, tess.xyz[numVerts] ); + byteAlias_t *baDest = NULL, *baSource = (byteAlias_t *)&backEnd.color2D; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 0]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 1]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 2]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 3]; baDest->ui = baSource->ui; - tess.texCoords[numVerts][0][0] = cmd->s1; - tess.texCoords[numVerts][0][1] = cmd->t1; + tess.xyz[ numVerts ][0] = m[0][0] * (-cmd->w * 0.5f) + m[1][0] * (-cmd->h * 0.5f) + m[2][0]; + tess.xyz[ numVerts ][1] = m[0][1] * (-cmd->w * 0.5f) + m[1][1] * (-cmd->h * 0.5f) + m[2][1]; + tess.xyz[ numVerts ][2] = 0; - VectorSet( point, cmd->w * 0.5f, -cmd->h * 0.5f, 0.0f ); - RotatePointAroundVector( rotatedPoint, axis, point, -cmd->a ); - VectorAdd( rotatedPoint, xlat, tess.xyz[numVerts + 1] ); + tess.texCoords[ numVerts ][0][0] = cmd->s1; + tess.texCoords[ numVerts ][0][1] = cmd->t1; - tess.texCoords[numVerts + 1][0][0] = cmd->s2; - tess.texCoords[numVerts + 1][0][1] = cmd->t1; + tess.xyz[ numVerts + 1 ][0] = m[0][0] * (cmd->w * 0.5f) + m[1][0] * (-cmd->h * 0.5f) + m[2][0]; + tess.xyz[ numVerts + 1 ][1] = m[0][1] * (cmd->w * 0.5f) + m[1][1] * (-cmd->h * 0.5f) + m[2][1]; + tess.xyz[ numVerts + 1 ][2] = 0; - VectorSet( point, cmd->w * 0.5f, cmd->h * 0.5f, 0.0f ); - RotatePointAroundVector( rotatedPoint, axis, point, -cmd->a ); - VectorAdd( rotatedPoint, xlat, tess.xyz[numVerts + 2] ); + tess.texCoords[ numVerts + 1 ][0][0] = cmd->s2; + tess.texCoords[ numVerts + 1 ][0][1] = cmd->t1; - tess.texCoords[numVerts + 2][0][0] = cmd->s2; - tess.texCoords[numVerts + 2][0][1] = cmd->t2; + tess.xyz[ numVerts + 2 ][0] = m[0][0] * (cmd->w * 0.5f) + m[1][0] * (cmd->h * 0.5f) + m[2][0]; + tess.xyz[ numVerts + 2 ][1] = m[0][1] * (cmd->w * 0.5f) + m[1][1] * (cmd->h * 0.5f) + m[2][1]; + tess.xyz[ numVerts + 2 ][2] = 0; - VectorSet( point, -cmd->w * 0.5f, cmd->h * 0.5f, 0.0f ); - RotatePointAroundVector( rotatedPoint, axis, point, -cmd->a ); - VectorAdd( rotatedPoint, xlat, tess.xyz[numVerts + 3] ); + tess.texCoords[ numVerts + 2 ][0][0] = cmd->s2; + tess.texCoords[ numVerts + 2 ][0][1] = cmd->t2; - tess.texCoords[numVerts + 3][0][0] = cmd->s1; - tess.texCoords[numVerts + 3][0][1] = cmd->t2; + tess.xyz[ numVerts + 3 ][0] = m[0][0] * (-cmd->w * 0.5f) + m[1][0] * (cmd->h * 0.5f) + m[2][0]; + tess.xyz[ numVerts + 3 ][1] = m[0][1] * (-cmd->w * 0.5f) + m[1][1] * (cmd->h * 0.5f) + m[2][1]; + tess.xyz[ numVerts + 3 ][2] = 0; + + tess.texCoords[ numVerts + 3 ][0][0] = cmd->s1; + tess.texCoords[ numVerts + 3 ][0][1] = cmd->t2; + } return (const void *)(cmd + 1); } @@ -1261,13 +1280,13 @@ const void *RB_RotatePic2 ( const void *data ) RB_ScissorPic ============= */ -const void *RB_Scissor ( const void *data ) +const void *RB_Scissor ( const void *data ) { const scissorCommand_t *cmd; cmd = (const scissorCommand_t *)data; - if ( !backEnd.projection2D ) + if ( !backEnd.projection2D ) { RB_SetGL2D(); } @@ -1279,7 +1298,7 @@ const void *RB_Scissor ( const void *data ) else { qglScissor( 0, 0, glConfig.vidWidth, glConfig.vidHeight); - } + } return (const void *)(cmd + 1); } @@ -1319,30 +1338,30 @@ const void *RB_DrawSurfs( const void *data ) { { // Copy the normal scene to texture. qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.sceneImage ); - qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, backEnd.viewParms.viewportX, backEnd.viewParms.viewportY, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); - qglEnable( GL_TEXTURE_2D ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.sceneImage ); + qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, backEnd.viewParms.viewportX, backEnd.viewParms.viewportY, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); + qglEnable( GL_TEXTURE_2D ); // Just clear colors, but leave the depth buffer intact so we can 'share' it. qglClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); - qglClear( GL_COLOR_BUFFER_BIT ); + qglClear( GL_COLOR_BUFFER_BIT ); // Render the glowing objects. g_bRenderGlowingObjects = true; - RB_RenderDrawSurfList( cmd->drawSurfs, cmd->numDrawSurfs ); + RB_RenderDrawSurfList( cmd->drawSurfs, cmd->numDrawSurfs ); g_bRenderGlowingObjects = false; qglFinish(); // Copy the glow scene to texture. qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.screenGlow ); - qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, backEnd.viewParms.viewportX, backEnd.viewParms.viewportY, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.screenGlow ); + qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, backEnd.viewParms.viewportX, backEnd.viewParms.viewportY, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglEnable( GL_TEXTURE_2D ); - + // Resize the viewport to the blur texture size. const int oldViewWidth = backEnd.viewParms.viewportWidth; const int oldViewHeight = backEnd.viewParms.viewportHeight; @@ -1355,20 +1374,20 @@ const void *RB_DrawSurfs( const void *data ) { // Copy the finished glow scene back to texture. qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.blurImage ); - qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, 0, 0, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.blurImage ); + qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, 0, 0, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglEnable( GL_TEXTURE_2D ); - + // Set the viewport back to normal. backEnd.viewParms.viewportWidth = oldViewWidth; backEnd.viewParms.viewportHeight = oldViewHeight; SetViewportAndScissor(); - qglClear( GL_COLOR_BUFFER_BIT ); + qglClear( GL_COLOR_BUFFER_BIT ); // Draw the glow additively over the screen. - RB_DrawGlowOverlay(); + RB_DrawGlowOverlay(); } return (const void *)(cmd + 1); @@ -1403,7 +1422,7 @@ const void *RB_DrawBuffer( const void *data ) { qglClearColor(fog->parms.color[0], fog->parms.color[1], fog->parms.color[2], 1.0f ); qglClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); } - else if ( r_clear->integer ) + else if ( r_clear->integer ) { // clear screen for debugging int i = r_clear->integer; if (i == 42) { @@ -1438,7 +1457,7 @@ const void *RB_DrawBuffer( const void *data ) { case 8: qglClearColor( 0.0, 0.0, 0.0, 1.0); //black break; - } + } qglClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); } @@ -1455,7 +1474,7 @@ was there. This is used to test for texture thrashing. Also called by RE_EndRegistration =============== */ -void RB_ShowImages( void ) { +void RB_ShowImages( void ) { image_t *image; float x, y, w, h; //int start, end; @@ -1469,7 +1488,7 @@ void RB_ShowImages( void ) { //start = ri.Milliseconds(); int i=0; -// int iNumImages = +// int iNumImages = R_Images_StartIteration(); while ( (image = R_Images_GetNextIteration()) != NULL) { @@ -1551,21 +1570,21 @@ const void *RB_SwapBuffers( const void *data ) { GLimp_LogComment( "***************** RB_SwapBuffers *****************\n\n\n" ); - GLimp_EndFrame(); + ri.WIN_Present(&window); backEnd.projection2D = qfalse; return (const void *)(cmd + 1); } -const void *RB_WorldEffects( const void *data ) +const void *RB_WorldEffects( const void *data ) { const setModeCommand_t *cmd; cmd = (const setModeCommand_t *)data; // Always flush the tess buffer - if ( tess.shader && tess.numIndexes ) + if ( tess.shader && tess.numIndexes ) { RB_EndSurface(); } @@ -1582,9 +1601,6 @@ const void *RB_WorldEffects( const void *data ) /* ==================== RB_ExecuteRenderCommands - -This function will be called syncronously if running without -smp extensions, or asyncronously by another thread. ==================== */ void RB_ExecuteRenderCommands( const void *data ) { @@ -1593,6 +1609,8 @@ void RB_ExecuteRenderCommands( const void *data ) { t1 = ri.Milliseconds (); while ( 1 ) { + data = PADP(data, sizeof(void *)); + switch ( *(const int *)data ) { case RC_SET_COLOR: data = RB_SetColor( data ); @@ -1623,7 +1641,7 @@ void RB_ExecuteRenderCommands( const void *data ) { break; case RC_END_OF_LIST: default: - // stop rendering on this thread + // stop rendering t2 = ri.Milliseconds (); backEnd.pc.msec = t2 - t1; return; @@ -1644,7 +1662,7 @@ void BeginPixelShader( GLuint uiType, GLuint uiID ) case GL_REGISTER_COMBINERS_NV: { // Just in case... - if ( !qglCombinerParameterfvNV) + if ( !qglCombinerParameterfvNV ) return; // Call the list with the regcom in it. @@ -1736,33 +1754,33 @@ static inline void RB_BlurGlowTexture() // How much to offset each texel by. float fTexelWidthOffset = 0.1f, fTexelHeightOffset = 0.1f; - GLuint uiTex = tr.screenGlow; + GLuint uiTex = tr.screenGlow; + + qglActiveTextureARB( GL_TEXTURE3_ARB ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); - qglActiveTextureARB( GL_TEXTURE3_ARB ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); - - qglActiveTextureARB( GL_TEXTURE2_ARB ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); + qglActiveTextureARB( GL_TEXTURE2_ARB ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); qglActiveTextureARB( GL_TEXTURE1_ARB ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); qglActiveTextureARB(GL_TEXTURE0_ARB ); - qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); - + qglDisable( GL_TEXTURE_2D ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); + ///////////////////////////////////////////////////////// // Draw the blur passes (each pass blurs it more, increasing the blur radius ). ///////////////////////////////////////////////////////// - + //int iTexWidth = backEnd.viewParms.viewportWidth, iTexHeight = backEnd.viewParms.viewportHeight; - int iTexWidth = glConfig.vidWidth, iTexHeight = glConfig.vidHeight; - - for ( int iNumBlurPasses = 0; iNumBlurPasses < r_DynamicGlowPasses->integer; iNumBlurPasses++ ) + int iTexWidth = glConfig.vidWidth, iTexHeight = glConfig.vidHeight; + + for ( int iNumBlurPasses = 0; iNumBlurPasses < r_DynamicGlowPasses->integer; iNumBlurPasses++ ) { // Load the Texel Offsets into the Vertex Program. qglProgramEnvParameter4fARB( GL_VERTEX_PROGRAM_ARB, 0, -fTexelWidthOffset, -fTexelWidthOffset, 0.0f, 0.0f ); @@ -1773,56 +1791,56 @@ static inline void RB_BlurGlowTexture() // After first pass put the tex coords to the viewport size. if ( iNumBlurPasses == 1 ) { - if ( !g_bTextureRectangleHack ) + if ( !g_bTextureRectangleHack ) { iTexWidth = backEnd.viewParms.viewportWidth; iTexHeight = backEnd.viewParms.viewportHeight; } uiTex = tr.blurImage; - qglActiveTextureARB( GL_TEXTURE3_ARB ); + qglActiveTextureARB( GL_TEXTURE3_ARB ); qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); - qglActiveTextureARB( GL_TEXTURE2_ARB ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); + qglActiveTextureARB( GL_TEXTURE2_ARB ); qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); qglActiveTextureARB( GL_TEXTURE1_ARB ); qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); qglActiveTextureARB(GL_TEXTURE0_ARB ); qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); // Copy the current image over. - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); - qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, 0, 0, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); + qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, 0, 0, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); } // Draw the fullscreen quad. - qglBegin( GL_QUADS ); - qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, 0, iTexHeight ); + qglBegin( GL_QUADS ); + qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, 0, iTexHeight ); qglVertex2f( 0, 0 ); qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, 0, 0 ); qglVertex2f( 0, backEnd.viewParms.viewportHeight ); - qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, iTexWidth, 0 ); + qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, iTexWidth, 0 ); qglVertex2f( backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, iTexWidth, iTexHeight ); - qglVertex2f( backEnd.viewParms.viewportWidth, 0 ); + qglVertex2f( backEnd.viewParms.viewportWidth, 0 ); qglEnd(); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.blurImage ); - qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, 0, 0, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.blurImage ); + qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, 0, 0, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); // Increase the texel offsets. // NOTE: This is possibly the most important input to the effect. Even by using an exponential function I've been able to - // make it look better (at a much higher cost of course). This is cheap though and still looks pretty great. In the future + // make it look better (at a much higher cost of course). This is cheap though and still looks pretty great. In the future // I might want to use an actual gaussian equation to correctly calculate the pixel coefficients and attenuates, texel // offsets, gaussian amplitude and radius... fTexelWidthOffset += r_DynamicGlowDelta->value; @@ -1830,22 +1848,22 @@ static inline void RB_BlurGlowTexture() } // Disable multi-texturing. - qglActiveTextureARB( GL_TEXTURE3_ARB ); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglActiveTextureARB( GL_TEXTURE3_ARB ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglActiveTextureARB( GL_TEXTURE2_ARB ); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglActiveTextureARB( GL_TEXTURE1_ARB ); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglActiveTextureARB(GL_TEXTURE0_ARB ); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglEnable( GL_TEXTURE_2D ); qglDisable( GL_VERTEX_PROGRAM_ARB ); EndPixelShader(); - + qglMatrixMode(GL_PROJECTION); qglPopMatrix(); qglMatrixMode(GL_MODELVIEW); @@ -1873,16 +1891,16 @@ static inline void RB_DrawGlowOverlay() GL_State(GLS_DEPTHTEST_DISABLE); qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); // For debug purposes. if ( r_DynamicGlow->integer != 2 ) { // Render the normal scene texture. - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.sceneImage ); - qglBegin(GL_QUADS); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.sceneImage ); + qglBegin(GL_QUADS); qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); - qglTexCoord2f( 0, glConfig.vidHeight ); + qglTexCoord2f( 0, glConfig.vidHeight ); qglVertex2f( 0, 0 ); qglTexCoord2f( 0, 0 ); @@ -1906,13 +1924,13 @@ static inline void RB_DrawGlowOverlay() { qglBlendFunc( GL_ONE, GL_ONE ); } - qglEnable( GL_BLEND ); + qglEnable( GL_BLEND ); // Now additively render the glow texture. - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.blurImage ); - qglBegin(GL_QUADS); - qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); - qglTexCoord2f( 0, r_DynamicGlowHeight->integer ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.blurImage ); + qglBegin(GL_QUADS); + qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); + qglTexCoord2f( 0, r_DynamicGlowHeight->integer ); qglVertex2f( 0, 0 ); qglTexCoord2f( 0, 0 ); @@ -1925,7 +1943,7 @@ static inline void RB_DrawGlowOverlay() qglVertex2f( glConfig.vidWidth, 0 ); qglEnd(); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglEnable( GL_TEXTURE_2D ); qglBlendFunc( GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR ); qglDisable( GL_BLEND ); diff --git a/code/rd-vanilla/tr_bsp.cpp b/code/rd-vanilla/tr_bsp.cpp index 0913c6a72c..10babac9ec 100644 --- a/code/rd-vanilla/tr_bsp.cpp +++ b/code/rd-vanilla/tr_bsp.cpp @@ -1,28 +1,31 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // tr_map.c -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - #include "tr_local.h" /* @@ -103,7 +106,7 @@ void R_ColorShiftLightingBytes( byte in[4], byte out[4] ) { int shift, r, g, b; // shift the color data based on overbright range - shift = r_mapOverBrightBits->integer - tr.overbrightBits; + shift = Q_max( 0, r_mapOverBrightBits->integer - tr.overbrightBits ); // shift the data based on overbright range r = in[0] << shift; @@ -137,7 +140,7 @@ void R_ColorShiftLightingBytes( byte in[3] ) { int shift, r, g, b; // shift the color data based on overbright range - shift = r_mapOverBrightBits->integer - tr.overbrightBits; + shift = Q_max( 0, r_mapOverBrightBits->integer - tr.overbrightBits ); // shift the data based on overbright range r = in[0] << shift; @@ -189,7 +192,7 @@ static void R_LoadLightmaps( lump_t *l, const char *psMapName, world_t &worldDat buf = fileBase + l->fileofs; // we are about to upload textures - //R_SyncRenderThread(); + R_IssuePendingRenderCommands(); // // create all the lightmaps worldData.startLightMapIndex = tr.numLightmaps; @@ -745,6 +748,9 @@ static void R_LoadSubmodels( lump_t *l, world_t &worldData, int index ) { model = R_AllocModel(); assert( model != NULL ); // this should never happen + if ( model == NULL ) { + ri.Error(ERR_DROP, "R_LoadSubmodels: R_AllocModel() failed"); + } model->type = MOD_BRUSH; model->bmodel = out; @@ -828,7 +834,7 @@ static void R_LoadNodesAndLeafs (lump_t *nodeLump, lump_t *leafLump, world_t &wo out->mins[j] = LittleLong (in->mins[j]); out->maxs[j] = LittleLong (in->maxs[j]); } - + p = LittleLong(in->planeNum); out->plane = worldData.planes + p; @@ -843,7 +849,7 @@ static void R_LoadNodesAndLeafs (lump_t *nodeLump, lump_t *leafLump, world_t &wo out->children[j] = worldData.nodes + numNodes + (-1 - p); } } - + // load leafs inLeaf = (dleaf_t *)(fileBase + leafLump->fileofs); for ( i=0 ; ifirstmarksurface = worldData.marksurfaces + LittleLong(inLeaf->firstLeafSurface); out->nummarksurfaces = LittleLong(inLeaf->numLeafSurfaces); - } + } // chain decendants R_SetParent (worldData.nodes, NULL); @@ -880,7 +886,7 @@ R_LoadShaders static void R_LoadShaders( lump_t *l, world_t &worldData ) { int i, count; dshader_t *in, *out; - + in = (dshader_t *)(fileBase + l->fileofs); if (l->filelen % sizeof(*in)) Com_Error (ERR_DROP, "LoadMap: funny lump size in %s",worldData.name); @@ -905,11 +911,11 @@ R_LoadMarksurfaces ================= */ static void R_LoadMarksurfaces (lump_t *l, world_t &worldData) -{ +{ int i, j, count; int *in; msurface_t **out; - + in = (int *)(fileBase + l->fileofs); if (l->filelen % sizeof(*in)) Com_Error (ERR_DROP, "LoadMap: funny lump size in %s",worldData.name); @@ -938,13 +944,13 @@ static void R_LoadPlanes( lump_t *l, world_t &worldData ) { dplane_t *in; int count; int bits; - + in = (dplane_t *)(fileBase + l->fileofs); if (l->filelen % sizeof(*in)) Com_Error (ERR_DROP, "LoadMap: funny lump size in %s",worldData.name); count = l->filelen / sizeof(*in); out = (struct cplane_s *) Hunk_Alloc ( count*2*sizeof(*out), qtrue ); - + worldData.planes = out; worldData.numplanes = count; @@ -1087,7 +1093,7 @@ static void R_LoadFogs( lump_t *l, lump_t *brushesLump, lump_t *sidesLump, world } else { - out->parms = *shader->fogParms; + out->parms = *shader->fogParms; } out->colorInt = ColorBytes4 ( out->parms.color[0], out->parms.color[1], @@ -1158,7 +1164,7 @@ void R_LoadLightGrid( lump_t *l, world_t &worldData ) { } int numGridDataElements = l->filelen / sizeof(*w->lightGridData); - + w->lightGridData = (mgrid_t *)Hunk_Alloc( l->filelen, qfalse ); memcpy( w->lightGridData, (void *)(fileBase + l->fileofs), l->filelen ); diff --git a/code/rd-vanilla/tr_cmds.cpp b/code/rd-vanilla/tr_cmds.cpp index df8b04c751..acb4f1a562 100644 --- a/code/rd-vanilla/tr_cmds.cpp +++ b/code/rd-vanilla/tr_cmds.cpp @@ -1,26 +1,29 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - #include "tr_local.h" @@ -40,32 +43,32 @@ void R_PerformanceCounters( void ) { if (r_speeds->integer == 1) { const float texSize = R_SumOfUsedImages( qfalse )/(8*1048576.0f)*(r_texturebits->integer?r_texturebits->integer:glConfig.colorBits); ri.Printf (PRINT_ALL, "%i/%i shdrs/srfs %i leafs %i vrts %i/%i tris %.2fMB tex %.2f dc\n", - backEnd.pc.c_shaders, backEnd.pc.c_surfaces, tr.pc.c_leafs, backEnd.pc.c_vertexes, - backEnd.pc.c_indexes/3, backEnd.pc.c_totalIndexes/3, - texSize, backEnd.pc.c_overDraw / (float)(glConfig.vidWidth * glConfig.vidHeight) ); + backEnd.pc.c_shaders, backEnd.pc.c_surfaces, tr.pc.c_leafs, backEnd.pc.c_vertexes, + backEnd.pc.c_indexes/3, backEnd.pc.c_totalIndexes/3, + texSize, backEnd.pc.c_overDraw / (float)(glConfig.vidWidth * glConfig.vidHeight) ); } else if (r_speeds->integer == 2) { ri.Printf (PRINT_ALL, "(patch) %i sin %i sclip %i sout %i bin %i bclip %i bout\n", - tr.pc.c_sphere_cull_patch_in, tr.pc.c_sphere_cull_patch_clip, tr.pc.c_sphere_cull_patch_out, + tr.pc.c_sphere_cull_patch_in, tr.pc.c_sphere_cull_patch_clip, tr.pc.c_sphere_cull_patch_out, tr.pc.c_box_cull_patch_in, tr.pc.c_box_cull_patch_clip, tr.pc.c_box_cull_patch_out ); ri.Printf (PRINT_ALL, "(md3) %i sin %i sclip %i sout %i bin %i bclip %i bout\n", - tr.pc.c_sphere_cull_md3_in, tr.pc.c_sphere_cull_md3_clip, tr.pc.c_sphere_cull_md3_out, + tr.pc.c_sphere_cull_md3_in, tr.pc.c_sphere_cull_md3_clip, tr.pc.c_sphere_cull_md3_out, tr.pc.c_box_cull_md3_in, tr.pc.c_box_cull_md3_clip, tr.pc.c_box_cull_md3_out ); } else if (r_speeds->integer == 3) { ri.Printf (PRINT_ALL, "viewcluster: %i\n", tr.viewCluster ); } else if (r_speeds->integer == 4) { if ( backEnd.pc.c_dlightVertexes ) { - ri.Printf (PRINT_ALL, "dlight srf:%i culled:%i verts:%i tris:%i\n", + ri.Printf (PRINT_ALL, "dlight srf:%i culled:%i verts:%i tris:%i\n", tr.pc.c_dlightSurfaces, tr.pc.c_dlightSurfacesCulled, backEnd.pc.c_dlightVertexes, backEnd.pc.c_dlightIndexes / 3 ); } - } + } else if (r_speeds->integer == 5 ) { ri.Printf( PRINT_ALL, "zFar: %.0f\n", tr.viewParms.zFar ); } else if (r_speeds->integer == 6 ) { - ri.Printf( PRINT_ALL, "flare adds:%i tests:%i renders:%i\n", + ri.Printf( PRINT_ALL, "flare adds:%i tests:%i renders:%i\n", backEnd.pc.c_flareAdds, backEnd.pc.c_flareTests, backEnd.pc.c_flareRenders ); } else if (r_speeds->integer == 7) { @@ -74,30 +77,13 @@ void R_PerformanceCounters( void ) { const float depthBuff= glConfig.vidWidth * glConfig.vidHeight * glConfig.depthBits / (8.0f * 1024*1024); const float stencilBuff= glConfig.vidWidth * glConfig.vidHeight * glConfig.stencilBits / (8.0f * 1024*1024); ri.Printf (PRINT_ALL, "Tex MB %.2f + buffers %.2f MB = Total %.2fMB\n", - texSize, backBuff*2+depthBuff+stencilBuff, texSize+backBuff*2+depthBuff+stencilBuff); + texSize, backBuff*2+depthBuff+stencilBuff, texSize+backBuff*2+depthBuff+stencilBuff); } memset( &tr.pc, 0, sizeof( tr.pc ) ); memset( &backEnd.pc, 0, sizeof( backEnd.pc ) ); } - -/* -==================== -R_InitCommandBuffers -==================== -*/ -void R_InitCommandBuffers( void ) { -} - -/* -==================== -R_ShutdownCommandBuffers -==================== -*/ -void R_ShutdownCommandBuffers( void ) { -} - /* ==================== R_IssueRenderCommands @@ -112,7 +98,8 @@ void R_IssueRenderCommands( qboolean runPerformanceCounters ) { cmdList = &backEndData->commands; // add an end-of-list command - *(int *)(cmdList->cmds + cmdList->used) = RC_END_OF_LIST; + byteAlias_t *ba = (byteAlias_t *)&cmdList->cmds[cmdList->used]; + ba->ui = RC_END_OF_LIST; // clear it out, in case this is a sync and not a buffer flip cmdList->used = 0; @@ -133,15 +120,12 @@ void R_IssueRenderCommands( qboolean runPerformanceCounters ) { /* ==================== -R_SyncRenderThread +R_IssuePendingRenderCommands Issue any pending commands and wait for them to complete. -After exiting, the render thread will have completed its work -and will remain idle and the main thread is free to issue -OpenGL calls until R_IssueRenderCommands is called. ==================== */ -void R_SyncRenderThread( void ) { +void R_IssuePendingRenderCommands( void ) { if ( !tr.registered ) { return; } @@ -152,14 +136,16 @@ void R_SyncRenderThread( void ) { ============ R_GetCommandBuffer -make sure there is enough command space, waiting on the -render thread if needed. +make sure there is enough command space ============ */ void *R_GetCommandBuffer( int bytes ) { renderCommandList_t *cmdList; cmdList = &backEndData->commands; + bytes = PAD(bytes, sizeof (void *)); + + assert(cmdList); // always leave room for the end of list command if ( cmdList->used + bytes + 4 > MAX_RENDER_COMMANDS ) { @@ -237,7 +223,7 @@ void RE_SetColor( const float *rgba ) { RE_StretchPic ============= */ -void RE_StretchPic ( float x, float y, float w, float h, +void RE_StretchPic ( float x, float y, float w, float h, float s1, float t1, float s2, float t2, qhandle_t hShader ) { stretchPicCommand_t *cmd; @@ -262,7 +248,7 @@ void RE_StretchPic ( float x, float y, float w, float h, RE_RotatePic ============= */ -void RE_RotatePic ( float x, float y, float w, float h, +void RE_RotatePic ( float x, float y, float w, float h, float s1, float t1, float s2, float t2,float a, qhandle_t hShader ) { rotatePicCommand_t *cmd; @@ -288,7 +274,7 @@ void RE_RotatePic ( float x, float y, float w, float h, RE_RotatePic2 ============= */ -void RE_RotatePic2 ( float x, float y, float w, float h, +void RE_RotatePic2 ( float x, float y, float w, float h, float s1, float t1, float s2, float t2,float a, qhandle_t hShader ) { rotatePicCommand_t *cmd; @@ -335,12 +321,12 @@ void RE_RenderWorldEffects(void) cmd->commandId = RC_WORLD_EFFECTS; } -/* +/* ============= RE_Scissor ============= */ -void RE_Scissor ( float x, float y, float w, float h) +void RE_Scissor ( float x, float y, float w, float h) { scissorCommand_t *cmd; @@ -393,7 +379,7 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) { } else { - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); qglEnable( GL_STENCIL_TEST ); qglStencilMask( ~0U ); qglClearStencil( 0U ); @@ -406,7 +392,7 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) { { // this is only reached if it was on and is now off if ( r_measureOverdraw->modified ) { - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); qglDisable( GL_STENCIL_TEST ); r_measureOverdraw->modified = qfalse; } @@ -416,7 +402,7 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) { // texturemode stuff // if ( r_textureMode->modified || r_ext_texture_filter_anisotropic->modified) { - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); GL_TextureMode( r_textureMode->string ); r_textureMode->modified = qfalse; r_ext_texture_filter_anisotropic->modified = qfalse; @@ -428,7 +414,7 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) { if ( r_gamma->modified ) { r_gamma->modified = qfalse; - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); R_SetColorMappings(); } @@ -436,7 +422,7 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) { if ( !r_ignoreGLErrors->integer ) { int err; - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); if ( ( err = qglGetError() ) != GL_NO_ERROR ) { Com_Error( ERR_FATAL, "RE_BeginFrame() - glGetError() failed (0x%x)!\n", err ); } @@ -465,7 +451,7 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) { } // if ( !Q_stricmp( r_drawBuffer->string, "GL_FRONT" ) ) { // cmd->buffer = (int)GL_FRONT; -// } else +// } else { cmd->buffer = (int)GL_BACK; } @@ -494,8 +480,6 @@ void RE_EndFrame( int *frontEndMsec, int *backEndMsec ) { R_IssueRenderCommands( qtrue ); - // use the other buffers next frame, because another CPU - // may still be rendering into the current ones R_InitNextFrame(); if ( frontEndMsec ) { @@ -506,10 +490,9 @@ void RE_EndFrame( int *frontEndMsec, int *backEndMsec ) { *backEndMsec = backEnd.pc.msec; } backEnd.pc.msec = 0; - + for(int i=0;i. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - - #include "tr_local.h" /* diff --git a/code/rd-vanilla/tr_draw.cpp b/code/rd-vanilla/tr_draw.cpp index 2a705c93f7..85efefe4bc 100644 --- a/code/rd-vanilla/tr_draw.cpp +++ b/code/rd-vanilla/tr_draw.cpp @@ -1,20 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // tr_draw.c // leave this as first line for PCH reasons... @@ -38,7 +44,7 @@ void RE_StretchRaw (int x, int y, int w, int h, int cols, int rows, const byte * return; } - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); if ( tess.numIndexes ) { RB_EndSurface(); @@ -158,47 +164,6 @@ void RE_UploadCinematic (int cols, int rows, const byte *data, int client, qbool } } - - -#if 0 -void RE_GetScreenShot(byte *data, int w, int h) -{ - byte *buffer; - int offset; - int x, y; - int xc, yc; - int xstep, ystep; - int count = 0; - - buffer = (byte *)R_Malloc(glConfig.vidWidth * glConfig.vidHeight * 3); - if(!buffer) - { - return; - } - qglReadPixels (0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_RGB, GL_UNSIGNED_BYTE, buffer ); - - xstep = (glConfig.vidWidth << 16) / w; - ystep = (glConfig.vidHeight << 16) / h; - yc = 0; - for(y = 0; y < h; y++, yc += ystep) - { - xc = 0; - for(x = 0; x < w; x++, xc += xstep) - { - offset = ((glConfig.vidWidth * (yc >> 16)) + (xc >> 16)) * 3; - *data++ = buffer[offset++]; - *data++ = buffer[offset++]; - *data++ = buffer[offset++]; - *data++ = 0xff; - count++; - } - } - assert(count == w * h); - R_Free(buffer); -} - -#else - extern byte *RB_ReadPixels(int x, int y, int width, int height, size_t *offset, int *padlen); void RE_GetScreenShot(byte *buffer, int w, int h) { @@ -211,8 +176,8 @@ void RE_GetScreenShot(byte *buffer, int w, int h) int r, g, b; float xScale, yScale; int xx, yy; - - + + source = RB_ReadPixels(0, 0, glConfig.vidWidth, glConfig.vidHeight, &offset, &padlen); memcount = (glConfig.vidWidth * 3 + padlen) * glConfig.vidHeight; @@ -240,15 +205,10 @@ void RE_GetScreenShot(byte *buffer, int w, int h) dst[2] = b / 12; } } - + ri.Z_Free(source); } -#endif - - - - // this is just a chunk of code from RE_TempRawImage_ReadFromFile() below, subroutinised so I can call it // from the screen dissolve code as well... // @@ -363,15 +323,15 @@ byte* RE_TempRawImage_ReadFromFile(const char *psLocalFilename, int *piWidth, in if (pbReturn && qbVertFlip) { - unsigned long *pSrcLine = (unsigned long *) pbReturn; - unsigned long *pDstLine = (unsigned long *) pbReturn + (*piHeight * *piWidth ); // *4 done by compiler (longs) + unsigned int *pSrcLine = (unsigned int *) pbReturn; + unsigned int *pDstLine = (unsigned int *) pbReturn + (*piHeight * *piWidth ); // *4 done by compiler (longs) pDstLine-= *piWidth; // point at start of last line, not first after buffer for (int iLineCount=0; iLineCount<*piHeight/2; iLineCount++) { for (int x=0; x<*piWidth; x++) { - unsigned long l = pSrcLine[x]; + unsigned int l = pSrcLine[x]; pSrcLine[x] = pDstLine[x]; pDstLine[x] = l; } @@ -458,7 +418,7 @@ static void RE_Blit(float fX0, float fY0, float fX1, float fY1, float fX2, float // // some junk they had at the top of other StretchRaw code... // - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); // qglFinish(); GL_Bind( pImage ); @@ -799,7 +759,7 @@ qboolean RE_ProcessDissolve(void) // qboolean RE_InitDissolve(qboolean bForceCircularExtroWipe) { - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); // ri.Printf( PRINT_ALL, "RE_InitDissolve()\n"); qboolean bReturn = qfalse; diff --git a/code/rd-vanilla/tr_flares.cpp b/code/rd-vanilla/tr_flares.cpp deleted file mode 100644 index 07307d12d0..0000000000 --- a/code/rd-vanilla/tr_flares.cpp +++ /dev/null @@ -1,430 +0,0 @@ -// tr_flares.c - -#if 0 // no longer functional according toe Ensiform --eez - -#include "tr_local.h" - -/* -============================================================================= - -LIGHT FLARES - -A light flare is an effect that takes place inside the eye when bright light -sources are visible. The size of the flare reletive to the screen is nearly -constant, irrespective of distance, but the intensity should be proportional to the -projected area of the light source. - -A surface that has been flagged as having a light flare will calculate the depth -buffer value that it's midpoint should have when the surface is added. - -After all opaque surfaces have been rendered, the depth buffer is read back for -each flare in view. If the point has not been obscured by a closer surface, the -flare should be drawn. - -Surfaces that have a repeated texture should never be flagged as flaring, because -there will only be a single flare added at the midpoint of the polygon. - -To prevent abrupt popping, the intensity of the flare is interpolated up and -down as it changes visibility. This involves scene to scene state, unlike almost -all other aspects of the renderer, and is complicated by the fact that a single -frame may have multiple scenes. - -RB_RenderFlares() will be called once per view (twice in a mirrored scene, potentially -up to five or more times in a frame with 3D status bar icons). - -============================================================================= -*/ - - -// flare states maintain visibility over multiple frames for fading -// layers: view, mirror, menu -typedef struct flare_s { - struct flare_s *next; // for active chain - - int addedFrame; - - qboolean inPortal; // true if in a portal view of the scene - int frameSceneNum; - void *surface; - int fogNum; - - int fadeTime; - - qboolean visible; // state of last test - float drawIntensity; // may be non 0 even if !visible due to fading - float lightScale; - int windowX, windowY; - float eyeZ; - - vec3_t color; -} flare_t; - -#define MAX_FLARES 128 - -flare_t r_flareStructs[MAX_FLARES]; -flare_t *r_activeFlares, *r_inactiveFlares; - -/* -================== -R_ClearFlares -================== -*/ -void R_ClearFlares( void ) { - int i; - - memset( r_flareStructs, 0, sizeof( r_flareStructs ) ); - r_activeFlares = NULL; - r_inactiveFlares = NULL; - - for ( i = 0 ; i < MAX_FLARES ; i++ ) { - r_flareStructs[i].next = r_inactiveFlares; - r_inactiveFlares = &r_flareStructs[i]; - } -} - - -/* -================== -RB_AddFlare - -This is called at surface tesselation time -================== -*/ -void RB_AddFlare( void *surface, int fogNum, vec3_t point, vec3_t color, vec3_t normal, float lightScale) { - int i; - flare_t *f, *oldest; - vec3_t local; - float d; - vec4_t eye, clip, normalized, window; - - backEnd.pc.c_flareAdds++; - - // if the point is off the screen, don't bother adding it - // calculate screen coordinates and depth - R_TransformModelToClip( point, backEnd.ori.modelMatrix, - backEnd.viewParms.projectionMatrix, eye, clip ); - - // check to see if the point is completely off screen - for ( i = 0 ; i < 3 ; i++ ) { - if ( clip[i] >= clip[3] || clip[i] <= -clip[3] ) { - return; - } - } - - R_TransformClipToWindow( clip, &backEnd.viewParms, normalized, window ); - - if ( window[0] < 0 || window[0] >= backEnd.viewParms.viewportWidth - || window[1] < 0 || window[1] >= backEnd.viewParms.viewportHeight ) { - return; // shouldn't happen, since we check the clip[] above, except for FP rounding - } - - // see if a flare with a matching surface, scene, and view exists - oldest = r_flareStructs; - for ( f = r_activeFlares ; f ; f = f->next ) { - if ( f->surface == surface && f->frameSceneNum == backEnd.viewParms.frameSceneNum - && f->inPortal == backEnd.viewParms.isPortal ) { - break; - } - } - - // allocate a new one - if (!f ) { - if ( !r_inactiveFlares ) { - // the list is completely full - return; - } - f = r_inactiveFlares; - r_inactiveFlares = r_inactiveFlares->next; - f->next = r_activeFlares; - r_activeFlares = f; - - f->surface = surface; - f->frameSceneNum = backEnd.viewParms.frameSceneNum; - f->inPortal = backEnd.viewParms.isPortal; - f->addedFrame = -1; - } - - if ( f->addedFrame != backEnd.viewParms.frameCount - 1 ) { - f->visible = qfalse; - f->fadeTime = backEnd.refdef.time - 2000; - } - - f->addedFrame = backEnd.viewParms.frameCount; - f->fogNum = fogNum; - f->lightScale = lightScale; - - VectorCopy( color, f->color ); - - // fade the intensity of the flare down as the - // light surface turns away from the viewer - if ( normal ) { - VectorSubtract( backEnd.viewParms.or.origin, point, local ); - VectorNormalizeFast( local ); - d = DotProduct( local, normal ); - VectorScale( f->color, d, f->color ); - } - - // save info needed to test - f->windowX = backEnd.viewParms.viewportX + window[0]; - f->windowY = backEnd.viewParms.viewportY + window[1]; - - f->eyeZ = eye[2]; -} - -/* -================== -RB_AddDlightFlares -================== -*/ -void RB_AddDlightFlares( void ) { - dlight_t *l; - int i, j, k; - fog_t *fog; - - if ( !r_flares->integer ) { - return; - } - - l = backEnd.refdef.dlights; - fog = tr.world->fogs; - for (i=0 ; inumfogs ; j++ ) { - fog = &tr.world->fogs[j]; - for ( k = 0 ; k < 3 ; k++ ) { - if ( l->origin[k] < fog->bounds[0][k] || l->origin[k] > fog->bounds[1][k] ) { - break; - } - } - if ( k == 3 ) { - break; - } - } - if ( j == tr.world->numfogs ) { - j = 0; - } - - RB_AddFlare( (void *)l, j, l->origin, l->color, NULL, 1.0f ); - } -} - -/* -=============================================================================== - -FLARE BACK END - -=============================================================================== -*/ - -/* -================== -RB_TestFlare -================== -*/ -void RB_TestFlare( flare_t *f ) { - float depth; - qboolean visible; - float fade; - float screenZ; - - backEnd.pc.c_flareTests++; - - // doing a readpixels is as good as doing a glFinish(), so - // don't bother with another sync - glState.finishCalled = qfalse; - - // read back the z buffer contents - qglReadPixels( f->windowX, f->windowY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth ); - - screenZ = backEnd.viewParms.projectionMatrix[14] / - ( ( 2*depth - 1 ) * backEnd.viewParms.projectionMatrix[11] - backEnd.viewParms.projectionMatrix[10] ); - - visible = ( -f->eyeZ - -screenZ ) < 24; - - if ( visible ) { - if ( !f->visible ) { - f->visible = qtrue; - f->fadeTime = backEnd.refdef.time - 1; - } - fade = ( ( backEnd.refdef.time - f->fadeTime ) /1000.0f ) * r_flareFade->value; - } else { - if ( f->visible ) { - f->visible = qfalse; - f->fadeTime = backEnd.refdef.time - 1; - } - fade = 1.0 - ( ( backEnd.refdef.time - f->fadeTime ) / 1000.0f ) * r_flareFade->value; - } - - if ( fade < 0 ) { - fade = 0; - } - if ( fade > 1 ) { - fade = 1; - } - - f->drawIntensity = fade; -} - - -/* -================== -RB_RenderFlare -================== -*/ -void RB_RenderFlare( flare_t *f ) { - float size; - vec3_t color; - int iColor[3]; - - backEnd.pc.c_flareRenders++; - - VectorScale( f->color, f->drawIntensity*tr.identityLight, color ); - iColor[0] = color[0] * 255; - iColor[1] = color[1] * 255; - iColor[2] = color[2] * 255; - - size = f->lightScale * backEnd.viewParms.viewportWidth * ( r_flareSize->value/640.0 + 8 / -f->eyeZ ); - - RB_BeginSurface( tr.flareShader, f->fogNum ); - - // FIXME: use quadstamp? - tess.xyz[tess.numVertexes][0] = f->windowX - size; - tess.xyz[tess.numVertexes][1] = f->windowY - size; - tess.texCoords[tess.numVertexes][0][0] = 0; - tess.texCoords[tess.numVertexes][0][1] = 0; - tess.vertexColors[tess.numVertexes][0] = iColor[0]; - tess.vertexColors[tess.numVertexes][1] = iColor[1]; - tess.vertexColors[tess.numVertexes][2] = iColor[2]; - tess.vertexColors[tess.numVertexes][3] = 255; - tess.numVertexes++; - - tess.xyz[tess.numVertexes][0] = f->windowX - size; - tess.xyz[tess.numVertexes][1] = f->windowY + size; - tess.texCoords[tess.numVertexes][0][0] = 0; - tess.texCoords[tess.numVertexes][0][1] = 1; - tess.vertexColors[tess.numVertexes][0] = iColor[0]; - tess.vertexColors[tess.numVertexes][1] = iColor[1]; - tess.vertexColors[tess.numVertexes][2] = iColor[2]; - tess.vertexColors[tess.numVertexes][3] = 255; - tess.numVertexes++; - - tess.xyz[tess.numVertexes][0] = f->windowX + size; - tess.xyz[tess.numVertexes][1] = f->windowY + size; - tess.texCoords[tess.numVertexes][0][0] = 1; - tess.texCoords[tess.numVertexes][0][1] = 1; - tess.vertexColors[tess.numVertexes][0] = iColor[0]; - tess.vertexColors[tess.numVertexes][1] = iColor[1]; - tess.vertexColors[tess.numVertexes][2] = iColor[2]; - tess.vertexColors[tess.numVertexes][3] = 255; - tess.numVertexes++; - - tess.xyz[tess.numVertexes][0] = f->windowX + size; - tess.xyz[tess.numVertexes][1] = f->windowY - size; - tess.texCoords[tess.numVertexes][0][0] = 1; - tess.texCoords[tess.numVertexes][0][1] = 0; - tess.vertexColors[tess.numVertexes][0] = iColor[0]; - tess.vertexColors[tess.numVertexes][1] = iColor[1]; - tess.vertexColors[tess.numVertexes][2] = iColor[2]; - tess.vertexColors[tess.numVertexes][3] = 255; - tess.numVertexes++; - - tess.indexes[tess.numIndexes++] = 0; - tess.indexes[tess.numIndexes++] = 1; - tess.indexes[tess.numIndexes++] = 2; - tess.indexes[tess.numIndexes++] = 0; - tess.indexes[tess.numIndexes++] = 2; - tess.indexes[tess.numIndexes++] = 3; - - RB_EndSurface(); -} - -/* -================== -RB_RenderFlares - -Because flares are simulating an occular effect, they should be drawn after -everything (all views) in the entire frame has been drawn. - -Because of the way portals use the depth buffer to mark off areas, the -needed information would be lost after each view, so we are forced to draw -flares after each view. - -The resulting artifact is that flares in mirrors or portals don't dim properly -when occluded by something in the main view, and portal flares that should -extend past the portal edge will be overwritten. -================== -*/ -void RB_RenderFlares (void) { - flare_t *f; - flare_t **prev; - qboolean draw; - - if ( !r_flares->integer ) { - return; - } - -// RB_AddDlightFlares(); - - // perform z buffer readback on each flare in this view - draw = qfalse; - prev = &r_activeFlares; - while ( ( f = *prev ) != NULL ) { - // throw out any flares that weren't added last frame - if ( f->addedFrame < backEnd.viewParms.frameCount - 1 ) { - *prev = f->next; - f->next = r_inactiveFlares; - r_inactiveFlares = f; - continue; - } - - // don't draw any here that aren't from this scene / portal - f->drawIntensity = 0; - if ( f->frameSceneNum == backEnd.viewParms.frameSceneNum - && f->inPortal == backEnd.viewParms.isPortal ) { - RB_TestFlare( f ); - if ( f->drawIntensity ) { - draw = qtrue; - } else { - // this flare has completely faded out, so remove it from the chain - *prev = f->next; - f->next = r_inactiveFlares; - r_inactiveFlares = f; - continue; - } - } - - prev = &f->next; - } - - if ( !draw ) { - return; // none visible - } - - if ( backEnd.viewParms.isPortal ) { - qglDisable (GL_CLIP_PLANE0); - } - - qglPushMatrix(); - qglLoadIdentity(); - qglMatrixMode( GL_PROJECTION ); - qglPushMatrix(); - qglLoadIdentity(); - qglOrtho( backEnd.viewParms.viewportX, backEnd.viewParms.viewportX + backEnd.viewParms.viewportWidth, - backEnd.viewParms.viewportY, backEnd.viewParms.viewportY + backEnd.viewParms.viewportHeight, - -99999, 99999 ); - - for ( f = r_activeFlares ; f ; f = f->next ) { - if ( f->frameSceneNum == backEnd.viewParms.frameSceneNum - && f->inPortal == backEnd.viewParms.isPortal - && f->drawIntensity ) { - RB_RenderFlare( f ); - } - } - - qglPopMatrix(); - qglMatrixMode( GL_MODELVIEW ); - qglPopMatrix(); -} - -#endif \ No newline at end of file diff --git a/code/rd-vanilla/tr_ghoul2.cpp b/code/rd-vanilla/tr_ghoul2.cpp index 4d7bd7ca39..5537da15a1 100644 --- a/code/rd-vanilla/tr_ghoul2.cpp +++ b/code/rd-vanilla/tr_ghoul2.cpp @@ -1,30 +1,30 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - - -#include "../client/client.h" //FIXME!! EVIL - just include the definitions needed +#include "../client/client.h" //FIXME!! EVIL - just include the definitions needed #include "../client/vmachine.h" - + #if !defined(TR_LOCAL_H) #include "tr_local.h" #endif @@ -87,8 +87,8 @@ mdxaBone_t worldMatrixInv; qhandle_t goreShader=-1; #endif -const static mdxaBone_t identityMatrix = -{ +const static mdxaBone_t identityMatrix = +{ { { 0.0f, -1.0f, 0.0f, 0.0f }, { 1.0f, 0.0f, 0.0f, 0.0f }, @@ -199,9 +199,9 @@ class CBoneCache } //rww - RAGDOLL_END public: - int frameSize; - const mdxaHeader_t *header; - const model_t *mod; + int frameSize; + const mdxaHeader_t *header; + const model_t *mod; // these are split for better cpu cache behavior SBoneCalc *mBones; @@ -219,7 +219,7 @@ class CBoneCache int mCurrentTouch; //rww - RAGDOLL_BEGIN int mCurrentTouchRender; - int mLastTouch; + int mLastTouch; int mLastLastTouch; //rww - RAGDOLL_END @@ -587,8 +587,8 @@ void G2_GetBoneMatrixLow(CGhoul2Info &ghoul2,int boneNum,const vec3_t scale,mdxa VectorNormalize((float*)&bolt.matrix[1]); VectorNormalize((float*)&bolt.matrix[2]); - Multiply_3x4Matrix(&retMatrix,&worldMatrix, &bolt); - + Multiply_3x4Matrix(&retMatrix,&worldMatrix, &bolt); + #ifdef _DEBUG for ( int i = 0; i < 3; i++ ) { @@ -713,7 +713,7 @@ CRenderableSurface *AllocRS() All bones should be an identity orientation to display the mesh exactly as it is specified. -For all other frames, the bones represent the transformation from the +For all other frames, the bones represent the transformation from the orientation of the bone in the base frame to the orientation in this frame. @@ -743,7 +743,7 @@ static int R_GCullModel( trRefEntity_t *ent ) { largestScale = 1; } - // cull bounding sphere + // cull bounding sphere switch ( R_CullLocalPointAndRadius( vec3_origin, ent->e.radius * largestScale) ) { case CULL_OUT: @@ -785,12 +785,12 @@ static int R_GComputeFogNum( trRefEntity_t *ent ) { int partialFog = 0; for ( i = 1 ; i < tr.world->numfogs ; i++ ) { fog = &tr.world->fogs[i]; - if ( ent->e.origin[0] - ent->e.radius >= fog->bounds[0][0] - && ent->e.origin[0] + ent->e.radius <= fog->bounds[1][0] + if ( ent->e.origin[0] - ent->e.radius >= fog->bounds[0][0] + && ent->e.origin[0] + ent->e.radius <= fog->bounds[1][0] && ent->e.origin[1] - ent->e.radius >= fog->bounds[0][1] - && ent->e.origin[1] + ent->e.radius <= fog->bounds[1][1] + && ent->e.origin[1] + ent->e.radius <= fog->bounds[1][1] && ent->e.origin[2] - ent->e.radius >= fog->bounds[0][2] - && ent->e.origin[2] + ent->e.radius <= fog->bounds[1][2] ) + && ent->e.origin[2] + ent->e.radius <= fog->bounds[1][2] ) {//totally inside it return i; break; @@ -816,7 +816,7 @@ static int R_GComputeFogNum( trRefEntity_t *ent ) { } // work out lod for this entity. -static int G2_ComputeLOD( trRefEntity_t *ent, const model_t *currentModel, int lodBias ) +static int G2_ComputeLOD( trRefEntity_t *ent, const model_t *currentModel, int lodBias ) { float flod, lodscale; float projectedRadius; @@ -827,11 +827,11 @@ static int G2_ComputeLOD( trRefEntity_t *ent, const model_t *currentModel, int l return(0); } - if (r_lodbias->integer > lodBias) + if (r_lodbias->integer > lodBias) { lodBias = r_lodbias->integer; } - + //**early out, it's going to be max lod if (lodBias >= currentModel->numLods ) { @@ -858,7 +858,7 @@ static int G2_ComputeLOD( trRefEntity_t *ent, const model_t *currentModel, int l if ( ( projectedRadius = ProjectRadius( 0.75*largestScale*ent->e.radius, ent->e.origin ) ) != 0 ) //we reduce the radius to make the LOD match other model types which use the actual bound box size { lodscale = r_lodscale->value; - if (lodscale > 20) lodscale = 20; + if (lodscale > 20) lodscale = 20; flod = 1.0f - projectedRadius * lodscale; } else @@ -881,7 +881,7 @@ static int G2_ComputeLOD( trRefEntity_t *ent, const model_t *currentModel, int l lod += lodBias; - + if ( lod >= currentModel->numLods ) lod = currentModel->numLods - 1; if ( lod < 0 ) @@ -891,23 +891,23 @@ static int G2_ComputeLOD( trRefEntity_t *ent, const model_t *currentModel, int l } -void Multiply_3x4Matrix(mdxaBone_t *out,const mdxaBone_t *in2,const mdxaBone_t *in) +void Multiply_3x4Matrix(mdxaBone_t *out,const mdxaBone_t *in2,const mdxaBone_t *in) { - // first row of out + // first row of out out->matrix[0][0] = (in2->matrix[0][0] * in->matrix[0][0]) + (in2->matrix[0][1] * in->matrix[1][0]) + (in2->matrix[0][2] * in->matrix[2][0]); out->matrix[0][1] = (in2->matrix[0][0] * in->matrix[0][1]) + (in2->matrix[0][1] * in->matrix[1][1]) + (in2->matrix[0][2] * in->matrix[2][1]); out->matrix[0][2] = (in2->matrix[0][0] * in->matrix[0][2]) + (in2->matrix[0][1] * in->matrix[1][2]) + (in2->matrix[0][2] * in->matrix[2][2]); out->matrix[0][3] = (in2->matrix[0][0] * in->matrix[0][3]) + (in2->matrix[0][1] * in->matrix[1][3]) + (in2->matrix[0][2] * in->matrix[2][3]) + in2->matrix[0][3]; - // second row of outf out + // second row of outf out out->matrix[1][0] = (in2->matrix[1][0] * in->matrix[0][0]) + (in2->matrix[1][1] * in->matrix[1][0]) + (in2->matrix[1][2] * in->matrix[2][0]); out->matrix[1][1] = (in2->matrix[1][0] * in->matrix[0][1]) + (in2->matrix[1][1] * in->matrix[1][1]) + (in2->matrix[1][2] * in->matrix[2][1]); out->matrix[1][2] = (in2->matrix[1][0] * in->matrix[0][2]) + (in2->matrix[1][1] * in->matrix[1][2]) + (in2->matrix[1][2] * in->matrix[2][2]); out->matrix[1][3] = (in2->matrix[1][0] * in->matrix[0][3]) + (in2->matrix[1][1] * in->matrix[1][3]) + (in2->matrix[1][2] * in->matrix[2][3]) + in2->matrix[1][3]; - // third row of out out + // third row of out out out->matrix[2][0] = (in2->matrix[2][0] * in->matrix[0][0]) + (in2->matrix[2][1] * in->matrix[1][0]) + (in2->matrix[2][2] * in->matrix[2][0]); out->matrix[2][1] = (in2->matrix[2][0] * in->matrix[0][1]) + (in2->matrix[2][1] * in->matrix[1][1]) + (in2->matrix[2][2] * in->matrix[2][1]); out->matrix[2][2] = (in2->matrix[2][0] * in->matrix[0][2]) + (in2->matrix[2][1] * in->matrix[1][2]) + (in2->matrix[2][2] * in->matrix[2][2]); - out->matrix[2][3] = (in2->matrix[2][0] * in->matrix[0][3]) + (in2->matrix[2][1] * in->matrix[1][3]) + (in2->matrix[2][2] * in->matrix[2][3]) + in2->matrix[2][3]; + out->matrix[2][3] = (in2->matrix[2][0] * in->matrix[0][3]) + (in2->matrix[2][1] * in->matrix[1][3]) + (in2->matrix[2][2] * in->matrix[2][3]) + in2->matrix[2][3]; } static int G2_GetBonePoolIndex( const mdxaHeader_t *pMDXAHeader, int iFrame, int iBone) @@ -954,7 +954,7 @@ void G2_TimingModel(boneInfo_t &bone,int currentTime,int numFramesInFile,int &cu time = (bone.pauseTime - bone.startTime) / 50.0f; } else - { + { time = (currentTime - bone.startTime) / 50.0f; } if (time<0.0f) @@ -969,7 +969,7 @@ void G2_TimingModel(boneInfo_t &bone,int currentTime,int numFramesInFile,int &cu if (animSize) { // did we run off the end? - if (((animSpeed > 0.0f) && (newFrame_g > endFrame - 1)) || + if (((animSpeed > 0.0f) && (newFrame_g > endFrame - 1)) || ((animSpeed < 0.0f) && (newFrame_g < endFrame+1))) { // yep - decide what to do @@ -1058,7 +1058,7 @@ void G2_TimingModel(boneInfo_t &bone,int currentTime,int numFramesInFile,int &cu } } // sanity check - assert (((newFrame < endFrame) && (newFrame >= bone.startFrame)) || (animSize < 10)); + assert (((newFrame < endFrame) && (newFrame >= bone.startFrame)) || (animSize < 10)); } else { @@ -1105,7 +1105,7 @@ void G2_TimingModel(boneInfo_t &bone,int currentTime,int numFramesInFile,int &cu assert((int)endFrame<=numFramesInFile); if (newFrame >= (int)endFrame) { - // we only want to lerp with the first frame of the anim if we are looping + // we only want to lerp with the first frame of the anim if we are looping if (bone.flags & BONE_ANIM_OVERRIDE_LOOP) { newFrame = bone.startFrame; @@ -1137,7 +1137,7 @@ void G2_TimingModel(boneInfo_t &bone,int currentTime,int numFramesInFile,int &cu // are we now on the end frame? if (newFrame < endFrame+1) { - // we only want to lerp with the first frame of the anim if we are looping + // we only want to lerp with the first frame of the anim if we are looping if (bone.flags & BONE_ANIM_OVERRIDE_LOOP) { newFrame = bone.startFrame; @@ -1312,7 +1312,7 @@ void G2_RagGetAnimMatrix(CGhoul2Info &ghoul2, const int boneNum, mdxaBone_t &mat } // transform each individual bone's information - making sure to use any override information provided, both for angles and for animations, as -// well as multiplying each bone's matrix by it's parents matrix +// well as multiplying each bone's matrix by it's parents matrix void G2_TransformBone (int child,CBoneCache &BC) { SBoneCalc &TB=BC.mBones[child]; @@ -1335,7 +1335,7 @@ void G2_TransformBone (int child,CBoneCache &BC) if (boneListIndex != -1) { // we found a bone in the list - we need to override something here. - + // do we override the rotational angles? if ((boneList[boneListIndex].flags) & (BONE_ANGLES_TOTAL)) { @@ -1473,19 +1473,19 @@ void G2_TransformBone (int child,CBoneCache &BC) { float backlerp = TB.blendFrame - (int)TB.blendFrame; float frontlerp = 1.0 - backlerp; - + // MC_UnCompress(tbone[3].matrix,compBonePointer[bFrame->boneIndexes[child]].Comp); // MC_UnCompress(tbone[4].matrix,compBonePointer[boldFrame->boneIndexes[child]].Comp); UnCompressBone(tbone[3].matrix, child, BC.header, TB.blendFrame); UnCompressBone(tbone[4].matrix, child, BC.header, TB.blendOldFrame); - for ( j = 0 ; j < 12 ; j++ ) + for ( j = 0 ; j < 12 ; j++ ) { ((float *)&tbone[5])[j] = (backlerp * ((float *)&tbone[3])[j]) + (frontlerp * ((float *)&tbone[4])[j]); } } - + // // lerp this bone - use the temp space on the ref entity to put the bone transforms into // @@ -1498,7 +1498,7 @@ void G2_TransformBone (int child,CBoneCache &BC) if (TB.blendMode) { float blendFrontlerp = 1.0 - TB.blendLerp; - for ( j = 0 ; j < 12 ; j++ ) + for ( j = 0 ; j < 12 ; j++ ) { ((float *)&tbone[2])[j] = (TB.blendLerp * ((float *)&tbone[2])[j]) + (blendFrontlerp * ((float *)&tbone[5])[j]); @@ -1517,9 +1517,9 @@ void G2_TransformBone (int child,CBoneCache &BC) // MC_UnCompress(tbone[0].matrix,compBonePointer[aFrame->boneIndexes[child]].Comp); // MC_UnCompress(tbone[1].matrix,compBonePointer[aoldFrame->boneIndexes[child]].Comp); UnCompressBone(tbone[0].matrix, child, BC.header, TB.newFrame); - UnCompressBone(tbone[1].matrix, child, BC.header, TB.currentFrame); + UnCompressBone(tbone[1].matrix, child, BC.header, TB.currentFrame); - for ( j = 0 ; j < 12 ; j++ ) + for ( j = 0 ; j < 12 ; j++ ) { ((float *)&tbone[2])[j] = (TB.backlerp * ((float *)&tbone[0])[j]) + (frontlerp * ((float *)&tbone[1])[j]); @@ -1529,7 +1529,7 @@ void G2_TransformBone (int child,CBoneCache &BC) if (TB.blendMode) { float blendFrontlerp = 1.0 - TB.blendLerp; - for ( j = 0 ; j < 12 ; j++ ) + for ( j = 0 ; j < 12 ; j++ ) { ((float *)&tbone[2])[j] = (TB.blendLerp * ((float *)&tbone[2])[j]) + (blendFrontlerp * ((float *)&tbone[5])[j]); @@ -1567,8 +1567,8 @@ void G2_TransformBone (int child,CBoneCache &BC) // this is crazy, we are gonna drive the animation to ID while we are doing post mults to compensate. Multiply_3x4Matrix(&temp,&firstPass, &skel->BasePoseMat); float matrixScale = VectorLength((float*)&temp); - static mdxaBone_t toMatrix = - { + static mdxaBone_t toMatrix = + { { { 1.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f, 0.0f }, @@ -1600,7 +1600,7 @@ void G2_TransformBone (int child,CBoneCache &BC) // mdxaBone_t lerp; // now do the blend into the destination float blendFrontlerp = 1.0 - blendLerp; - for ( j = 0 ; j < 12 ; j++ ) + for ( j = 0 ; j < 12 ; j++ ) { ((float *)&bone)[j] = (blendLerp * ((float *)&temp)[j]) + (blendFrontlerp * ((float *)&tbone[2])[j]); @@ -1636,7 +1636,7 @@ void G2_TransformBone (int child,CBoneCache &BC) float matrixScale = VectorLength((float*)&temp); mdxaBone_t newMatrixTemp; - + if (HackadelicOnClient) { for (int i=0; i<3;i++) @@ -1648,7 +1648,7 @@ void G2_TransformBone (int child,CBoneCache &BC) } newMatrixTemp.matrix[0][3] = temp.matrix[0][3]; - newMatrixTemp.matrix[1][3] = temp.matrix[1][3]; + newMatrixTemp.matrix[1][3] = temp.matrix[1][3]; newMatrixTemp.matrix[2][3] = temp.matrix[2][3]; } else @@ -1662,15 +1662,15 @@ void G2_TransformBone (int child,CBoneCache &BC) } newMatrixTemp.matrix[0][3] = temp.matrix[0][3]; - newMatrixTemp.matrix[1][3] = temp.matrix[1][3]; + newMatrixTemp.matrix[1][3] = temp.matrix[1][3]; newMatrixTemp.matrix[2][3] = temp.matrix[2][3]; } - + Multiply_3x4Matrix(&temp, &newMatrixTemp,&skel->BasePoseMatInv); // now do the blend into the destination float blendFrontlerp = 1.0 - blendLerp; - for ( j = 0 ; j < 12 ; j++ ) + for ( j = 0 ; j < 12 ; j++ ) { ((float *)&bone)[j] = (blendLerp * ((float *)&temp)[j]) + (blendFrontlerp * ((float *)&firstPass)[j]); @@ -1689,7 +1689,7 @@ void G2_TransformBone (int child,CBoneCache &BC) float matrixScale = VectorLength((float*)&temp); mdxaBone_t newMatrixTemp; - + if (HackadelicOnClient) { for (int i=0; i<3;i++) @@ -1699,9 +1699,9 @@ void G2_TransformBone (int child,CBoneCache &BC) newMatrixTemp.matrix[i][x] = boneOverride.newMatrix.matrix[i][x]*matrixScale; } } - + newMatrixTemp.matrix[0][3] = temp.matrix[0][3]; - newMatrixTemp.matrix[1][3] = temp.matrix[1][3]; + newMatrixTemp.matrix[1][3] = temp.matrix[1][3]; newMatrixTemp.matrix[2][3] = temp.matrix[2][3]; } else @@ -1713,12 +1713,12 @@ void G2_TransformBone (int child,CBoneCache &BC) newMatrixTemp.matrix[i][x] = boneOverride.matrix.matrix[i][x]*matrixScale; } } - + newMatrixTemp.matrix[0][3] = temp.matrix[0][3]; - newMatrixTemp.matrix[1][3] = temp.matrix[1][3]; + newMatrixTemp.matrix[1][3] = temp.matrix[1][3]; newMatrixTemp.matrix[2][3] = temp.matrix[2][3]; } - + Multiply_3x4Matrix(&bone, &newMatrixTemp,&skel->BasePoseMatInv); } } @@ -1841,7 +1841,7 @@ void G2_TransformGhoulBones(boneInfo_v &rootBoneList,mdxaBone_t &rootMatrix, CGh ghoul2.mBoneCache=new CBoneCache(ghoul2.currentModel,ghoul2.aHeader); } ghoul2.mBoneCache->mod=ghoul2.currentModel; - ghoul2.mBoneCache->header=ghoul2.aHeader; + ghoul2.mBoneCache->header=ghoul2.aHeader; assert((int)ghoul2.mBoneCache->mNumBones==ghoul2.aHeader->numBones); ghoul2.mBoneCache->mSmoothingActive=false; @@ -1905,7 +1905,7 @@ void G2_TransformGhoulBones(boneInfo_v &rootBoneList,mdxaBone_t &rootMatrix, CGh //rww - RAGDOLL_END // ghoul2.mBoneCache->mWraithID=0; - ghoul2.mBoneCache->frameSize = 0;// can be deleted in new G2 format //(int)( &((mdxaFrame_t *)0)->boneIndexes[ ghoul2.aHeader->numBones ] ); + ghoul2.mBoneCache->frameSize = 0;// can be deleted in new G2 format //(int)( &((mdxaFrame_t *)0)->boneIndexes[ ghoul2.aHeader->numBones ] ); ghoul2.mBoneCache->rootBoneList=&rootBoneList; ghoul2.mBoneCache->rootMatrix=rootMatrix; @@ -1927,7 +1927,7 @@ void G2_TransformGhoulBones(boneInfo_v &rootBoneList,mdxaBone_t &rootMatrix, CGh //====================================================================== // -// Surface Manipulation code +// Surface Manipulation code // We've come across a surface that's designated as a bolt surface, process it and put it in the appropriate bolt place @@ -1948,7 +1948,7 @@ void G2_ProcessSurfaceBolt2(CBoneCache &boneCache, const mdxmSurface_t *surface, mdxmSurface_t *originalSurf = (mdxmSurface_t *)G2_FindSurface(mod, surfNumber, surfInfo->genLod); mdxmTriangle_t *originalTriangleIndexes = (mdxmTriangle_t *)((byte*)originalSurf + originalSurf->ofsTriangles); - // get the original polys indexes + // get the original polys indexes int index0 = originalTriangleIndexes[polyNumber].indexes[0]; int index1 = originalTriangleIndexes[polyNumber].indexes[1]; int index2 = originalTriangleIndexes[polyNumber].indexes[2]; @@ -1970,12 +1970,12 @@ void G2_ProcessSurfaceBolt2(CBoneCache &boneCache, const mdxmSurface_t *surface, int *piBoneReferences = (int*) ((byte*)originalSurf + originalSurf->ofsBoneReferences); // mdxmWeight_t *w; - + // now go and transform just the points we need from the surface that was hit originally // w = vert0->weights; float fTotalWeight = 0.0f; int iNumWeights = G2_GetVertWeights( vert0 ); - for ( k = 0 ; k < iNumWeights ; k++ ) + for ( k = 0 ; k < iNumWeights ; k++ ) { int iBoneIndex = G2_GetVertBoneIndex( vert0, k ); float fBoneWeight = G2_GetVertBoneWeight( vert0, k, fTotalWeight, iNumWeights ); @@ -1990,7 +1990,7 @@ void G2_ProcessSurfaceBolt2(CBoneCache &boneCache, const mdxmSurface_t *surface, // w = vert1->weights; fTotalWeight = 0.0f; iNumWeights = G2_GetVertWeights( vert1 ); - for ( k = 0 ; k < iNumWeights ; k++) + for ( k = 0 ; k < iNumWeights ; k++) { int iBoneIndex = G2_GetVertBoneIndex( vert1, k ); float fBoneWeight = G2_GetVertBoneWeight( vert1, k, fTotalWeight, iNumWeights ); @@ -2005,7 +2005,7 @@ void G2_ProcessSurfaceBolt2(CBoneCache &boneCache, const mdxmSurface_t *surface, // w = vert2->weights; fTotalWeight = 0.0f; iNumWeights = G2_GetVertWeights( vert2 ); - for ( k = 0 ; k < iNumWeights ; k++) + for ( k = 0 ; k < iNumWeights ; k++) { int iBoneIndex = G2_GetVertBoneIndex( vert2, k ); float fBoneWeight = G2_GetVertBoneWeight( vert2, k, fTotalWeight, iNumWeights ); @@ -2016,7 +2016,7 @@ void G2_ProcessSurfaceBolt2(CBoneCache &boneCache, const mdxmSurface_t *surface, pTri[2][1] += fBoneWeight * ( DotProduct( bone.matrix[1], vert2->vertCoords ) + bone.matrix[1][3] ); pTri[2][2] += fBoneWeight * ( DotProduct( bone.matrix[2], vert2->vertCoords ) + bone.matrix[2][3] ); } - + vec3_t normal; vec3_t up; vec3_t right; @@ -2071,7 +2071,7 @@ void G2_ProcessSurfaceBolt2(CBoneCache &boneCache, const mdxmSurface_t *surface, // whip through and actually transform each vertex v = (mdxmVertex_t *) ((byte *)surface + surface->ofsVerts); int *piBoneReferences = (int*) ((byte*)surface + surface->ofsBoneReferences); - for ( j = 0; j < 3; j++ ) + for ( j = 0; j < 3; j++ ) { // mdxmWeight_t *w; @@ -2081,7 +2081,7 @@ void G2_ProcessSurfaceBolt2(CBoneCache &boneCache, const mdxmSurface_t *surface, const int iNumWeights = G2_GetVertWeights( v ); float fTotalWeight = 0.0f; - for ( k = 0 ; k < iNumWeights ; k++) + for ( k = 0 ; k < iNumWeights ; k++) { int iBoneIndex = G2_GetVertBoneIndex( v, k ); float fBoneWeight = G2_GetVertBoneWeight( v, k, fTotalWeight, iNumWeights ); @@ -2092,7 +2092,7 @@ void G2_ProcessSurfaceBolt2(CBoneCache &boneCache, const mdxmSurface_t *surface, pTri[j][1] += fBoneWeight * ( DotProduct( bone.matrix[1], v->vertCoords ) + bone.matrix[1][3] ); pTri[j][2] += fBoneWeight * ( DotProduct( bone.matrix[2], v->vertCoords ) + bone.matrix[2][3] ); } - + v++;// = (mdxmVertex_t *)&v->weights[/*v->numWeights*/surface->maxVertBoneWeights]; } @@ -2198,7 +2198,7 @@ void G2_GetBoltMatrixLow(CGhoul2Info &ghoul2,int boltNum,const vec3_t scale,mdxa void G2API_SetSurfaceOnOffFromSkin (CGhoul2Info *ghlInfo, qhandle_t renderSkin) { int j; - const skin_t *skin = R_GetSkinByHandle( renderSkin ); + const skin_t *skin = R_GetSkinByHandle( renderSkin ); //FIXME: using skin handles means we have to increase the numsurfs in a skin, but reading directly would cause file hits, we need another way to cache or just deal with the larger skin_t if (skin) @@ -2207,14 +2207,14 @@ void G2API_SetSurfaceOnOffFromSkin (CGhoul2Info *ghlInfo, qhandle_t renderSkin) ghlInfo->mMeshFrameNum = 0; for ( j = 0 ; j < skin->numSurfaces ; j++ ) { - int flags; + uint32_t flags; int surfaceNum = G2_IsSurfaceLegal(ghlInfo->currentModel, skin->surfaces[j]->name, &flags); // the names have both been lowercased - if ( !(flags&G2SURFACEFLAG_OFF) && !strcmp( skin->surfaces[j]->shader->name , "*off") ) + if ( !(flags&G2SURFACEFLAG_OFF) && !strcmp( skin->surfaces[j]->shader->name , "*off") ) { G2_SetSurfaceOnOff(ghlInfo, skin->surfaces[j]->name, G2SURFACEFLAG_OFF); } - else + else { //if ( strcmp( &skin->surfaces[j]->name[strlen(skin->surfaces[j]->name)-4],"_off") ) if ( (surfaceNum != -1) && (!(flags&G2SURFACEFLAG_OFF)) ) //only turn on if it's not an "_off" surface @@ -2235,7 +2235,7 @@ void RenderSurfaces(CRenderSurface &RS) #ifdef _G2_GORE bool drawGore = true; #endif - + assert(RS.currentModel); assert(RS.currentModel->mdxm); @@ -2243,7 +2243,7 @@ void RenderSurfaces(CRenderSurface &RS) mdxmSurface_t *surface = (mdxmSurface_t *)G2_FindSurface(RS.currentModel, RS.surfaceNum, RS.lod); mdxmHierarchyOffsets_t *surfIndexes = (mdxmHierarchyOffsets_t *)((byte *)RS.currentModel->mdxm + sizeof(mdxmHeader_t)); mdxmSurfHierarchy_t *surfInfo = (mdxmSurfHierarchy_t *)((byte *)surfIndexes + surfIndexes->offsets[surface->thisSurfaceIndex]); - + // see if we have an override surface in the surface list const surfaceInfo_t *surfOverride = G2_FindOverrideSurface(RS.surfaceNum, RS.rootSList); @@ -2258,28 +2258,28 @@ void RenderSurfaces(CRenderSurface &RS) // if this surface is not off, add it to the shader render list if (!offFlags) - { - if ( RS.cust_shader ) + { + if ( RS.cust_shader ) { shader = RS.cust_shader; - } - else if ( RS.skin ) + } + else if ( RS.skin ) { int j; - + // match the surface name to something in the skin file shader = R_GetShaderByHandle( surfInfo->shaderIndex ); //tr.defaultShader; for ( j = 0 ; j < RS.skin->numSurfaces ; j++ ) { // the names have both been lowercased - if ( !strcmp( RS.skin->surfaces[j]->name, surfInfo->name ) ) + if ( !strcmp( RS.skin->surfaces[j]->name, surfInfo->name ) ) { shader = RS.skin->surfaces[j]->shader; break; } } - } - else + } + else { shader = R_GetShaderByHandle( surfInfo->shaderIndex ); } @@ -2288,11 +2288,11 @@ void RenderSurfaces(CRenderSurface &RS) // stencil shadows can't do personal models unless I polyhedron clip //using z-fail now so can do personal models -rww if ( /*!RS.personalModel - && */r_shadows->integer == 2 + && */r_shadows->integer == 2 // && RS.fogNum == 0 && (RS.renderfx & RF_SHADOW_PLANE ) - && !(RS.renderfx & ( RF_NOSHADOW | RF_DEPTHHACK ) ) - && shader->sort == SS_OPAQUE ) + && !(RS.renderfx & ( RF_NOSHADOW | RF_DEPTHHACK ) ) + && shader->sort == SS_OPAQUE ) { // set the surface info to point at the where the transformed bone list is going to be for when the surface gets rendered out CRenderableSurface *newSurf = AllocRS(); if (surface->numVerts >= SHADER_MAX_VERTEXES/2) @@ -2312,8 +2312,8 @@ void RenderSurfaces(CRenderSurface &RS) if ( r_shadows->integer == 3 // && RS.fogNum == 0 && (RS.renderfx & RF_SHADOW_PLANE ) - && !(RS.renderfx & ( RF_NOSHADOW ) ) - && shader->sort == SS_OPAQUE ) + && !(RS.renderfx & ( RF_NOSHADOW ) ) + && shader->sort == SS_OPAQUE ) { // set the surface info to point at the where the transformed bone list is going to be for when the surface gets rendered out CRenderableSurface *newSurf = AllocRS(); newSurf->surfaceData = surface; @@ -2322,7 +2322,7 @@ void RenderSurfaces(CRenderSurface &RS) } // don't add third_person objects if not viewing through a portal - if ( !RS.personalModel ) + if ( !RS.personalModel ) { // set the surface info to point at the where the transformed bone list is going to be for when the surface gets rendered out CRenderableSurface *newSurf = AllocRS(); newSurf->surfaceData = surface; @@ -2333,9 +2333,9 @@ void RenderSurfaces(CRenderSurface &RS) if (RS.gore_set && drawGore) { int curTime = G2API_GetTime(tr.refdef.time); - pair::iterator,multimap::iterator> range= + std::pair::iterator,std::multimap::iterator> range= RS.gore_set->mGoreRecords.equal_range(RS.surfaceNum); - multimap::iterator k,kcur; + std::multimap::iterator k,kcur; CRenderableSurface *last=newSurf; for (k=range.first;k!=range.second;) { @@ -2414,7 +2414,7 @@ void RenderSurfaces(CRenderSurface &RS) #endif } } - + // if we are turning off all descendants, then stop this recursion now if (offFlags & G2SURFACEFLAG_NODESCENDANTS) { @@ -2508,7 +2508,7 @@ static void RootMatrix(CGhoul2Info_v &ghoul2,int time,const vec3_t scale,mdxaBon mdxaBone_t bolt; mdxaBone_t tempMatrix; - G2_ConstructGhoulSkeleton(ghoul2,time,false,scale); + G2_ConstructGhoulSkeleton(ghoul2,time,false,scale); G2_GetBoltMatrixLow(ghoul2[i],ghoul2[i].mNewOrigin,scale,bolt); tempMatrix.matrix[0][0]=1.0f; tempMatrix.matrix[0][1]=0.0f; @@ -2558,7 +2558,7 @@ void R_AddGhoulSurfaces( trRefEntity_t *ent ) { skin_t *skin; int modelCount; mdxaBone_t rootMatrix; - + // if we don't want ghoul2 models, then return if (r_noGhoul2->integer) { @@ -2579,7 +2579,7 @@ void R_AddGhoulSurfaces( trRefEntity_t *ent ) { // cull the entire model if merged bounding box of both frames // is outside the view frustum. cull = R_GCullModel (ent ); - if ( cull == CULL_OUT ) + if ( cull == CULL_OUT ) { return; } @@ -2638,7 +2638,7 @@ void R_AddGhoulSurfaces( trRefEntity_t *ent ) { { skin = R_GetSkinByHandle(ent->e.customSkin ); } - else if ( ghoul2[i].mSkin > 0 && ghoul2[i].mSkin < tr.numSkins ) + else if ( ghoul2[i].mSkin > 0 && ghoul2[i].mSkin < tr.numSkins ) { skin = R_GetSkinByHandle( ghoul2[i].mSkin ); } @@ -2687,7 +2687,7 @@ void R_AddGhoulSurfaces( trRefEntity_t *ent ) { } } HackadelicOnClient=false; -} +} bool G2_NeedsRecalc(CGhoul2Info *ghlInfo,int frameNum) { @@ -2752,14 +2752,14 @@ void G2_ConstructGhoulSkeleton( CGhoul2Info_v &ghoul2,const int frameNum,bool ch } } } -} +} /* ============== RB_SurfaceGhoul ============== */ -void RB_SurfaceGhoul( CRenderableSurface *surf ) +void RB_SurfaceGhoul( CRenderableSurface *surf ) { #ifdef G2_PERFORMANCE_ANALYSIS G2PerformanceTimer_RB_SurfaceGhoul.Start(); @@ -2819,7 +2819,7 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) //Or can you += array[.][x]+2? if (surf->scale>1.0f) { - for ( j = 0; j < numVerts; j++) + for ( j = 0; j < numVerts; j++) { texCoords[0]=((*(float *)data)-0.5f)*surf->scale+0.5f; data++; @@ -2875,15 +2875,15 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) } } } - + glIndex_t *indexPtr = &tess.indexes[baseIndex]; triangles = data; - for (j = indexes ; j ; j--) + for (j = indexes ; j ; j--) { *indexPtr++ = baseVertex + (*triangles++); } tess.numIndexes += indexes; - tess.numVertexes += numVerts; + tess.numVertexes += numVerts; return; } #endif @@ -2899,7 +2899,7 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) // // deform the vertexes by the lerped bones // - + // first up, sanity check our numbers baseVertex = tess.numVertexes; triangles = (int *) ((byte *)surface + surface->ofsTriangles); @@ -2932,7 +2932,7 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) #if 0 if (0) { - for ( j = 0; j < numVerts; j++, baseVertex++,v++ ) + for ( j = 0; j < numVerts; j++, baseVertex++,v++ ) { const int iNumWeights = G2_GetVertWeights( v ); @@ -2951,7 +2951,7 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) tess.normal[baseVertex][1] = fBoneWeight * DotProduct( bone->matrix[1], v->normal ); tess.normal[baseVertex][2] = fBoneWeight * DotProduct( bone->matrix[2], v->normal ); - for ( k++ ; k < iNumWeights ; k++) + for ( k++ ; k < iNumWeights ; k++) { iBoneIndex = G2_GetVertBoneIndex( v, k ); fBoneWeight = G2_GetVertBoneWeight( v, k, fTotalWeight, iNumWeights ); @@ -2980,7 +2980,7 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) float t2; const mdxaBone_t *bone; const mdxaBone_t *bone2; - for ( j = 0; j < numVerts; j++, baseVertex++,v++ ) + for ( j = 0; j < numVerts; j++, baseVertex++,v++ ) { bone = &bones->EvalRender(piBoneReferences[G2_GetVertBoneIndex( v, 0 )]); @@ -3027,7 +3027,7 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) tess.xyz[baseVertex][2] = fBoneWeight * ( DotProduct( bone->matrix[2], v->vertCoords ) + bone->matrix[2][3] ); fTotalWeight=fBoneWeight; - for (k=1; k < iNumWeights-1 ; k++) + for (k=1; k < iNumWeights-1 ; k++) { bone = &bones->EvalRender(piBoneReferences[G2_GetVertBoneIndex( v, k )]); fBoneWeight = G2_GetVertBoneWeightNotSlow( v, k); @@ -3061,7 +3061,7 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) { // get a gore surface ready to go. - /* + /* sizeof(int)+ // num verts sizeof(int)+ // num tris sizeof(int)*newNumVerts+ // which verts to copy from original surface @@ -3092,7 +3092,7 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) } else { - assert(0); + assert(0); } } @@ -3107,7 +3107,7 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) G2Time_RB_SurfaceGhoul += G2PerformanceTimer_RB_SurfaceGhoul.End(); #endif } - + /* ================= R_LoadMDXM - load a Ghoul 2 Mesh file @@ -3491,7 +3491,7 @@ qboolean R_LoadMDXM( model_t *mod, void *buffer, const char *mod_name, qboolean pinmodel= (mdxmHeader_t *)buffer; // // read some fields from the binary, but only LittleLong() them when we know this wasn't an already-cached model... - // + // version = (pinmodel->version); size = (pinmodel->ofsEnd); @@ -3511,8 +3511,8 @@ qboolean R_LoadMDXM( model_t *mod, void *buffer, const char *mod_name, qboolean } mod->type = MOD_MDXM; - mod->dataSize += size; - + mod->dataSize += size; + qboolean bAlreadyFound = qfalse; mdxm = mod->mdxm = (mdxmHeader_t*) //Hunk_Alloc( size ); RE_RegisterModels_Malloc(size, buffer, mod_name, &bAlreadyFound, TAG_MODEL_GLM); @@ -3521,7 +3521,7 @@ qboolean R_LoadMDXM( model_t *mod, void *buffer, const char *mod_name, qboolean if (!bAlreadyFound) { - // horrible new hackery, if !bAlreadyFound then we've just done a tag-morph, so we need to set the + // horrible new hackery, if !bAlreadyFound then we've just done a tag-morph, so we need to set the // bool reference passed into this function to true, to tell the caller NOT to do an FS_Freefile since // we've hijacked that memory block... // @@ -3540,7 +3540,7 @@ qboolean R_LoadMDXM( model_t *mod, void *buffer, const char *mod_name, qboolean LL(mdxm->ofsSurfHierarchy); LL(mdxm->ofsEnd); } - + // first up, go load in the animation file we need that has the skeletal animation info for this model mdxm->animIndex = RE_RegisterModel(va ("%s.gla",mdxm->animName)); if (!strcmp(mdxm->animName,"models/players/_humanoid/_humanoid")) @@ -3555,7 +3555,7 @@ qboolean R_LoadMDXM( model_t *mod, void *buffer, const char *mod_name, qboolean RE_RegisterModel(va ("models/players/_humanoid_%s/_humanoid_%s.gla",mapname,mapname)); } } - + #ifndef JK2_MODE bool isAnOldModelFile = false; if (mdxm->numBones == 72 && strstr(mdxm->animName,"_humanoid") ) @@ -3564,7 +3564,7 @@ qboolean R_LoadMDXM( model_t *mod, void *buffer, const char *mod_name, qboolean } #endif - if (!mdxm->animIndex) + if (!mdxm->animIndex) { ri.Printf( PRINT_WARNING, "R_LoadMDXM: missing animation file %s for mesh %s\n", mdxm->animName, mdxm->name); return qfalse; @@ -3606,7 +3606,7 @@ qboolean R_LoadMDXM( model_t *mod, void *buffer, const char *mod_name, qboolean #ifdef Q3_BIG_ENDIAN surfIndexes = (mdxmHierarchyOffsets_t *)((byte *)mdxm + sizeof(mdxmHeader_t)); #endif - for ( i = 0 ; i < mdxm->numSurfaces ; i++) + for ( i = 0 ; i < mdxm->numSurfaces ; i++) { LL(surfInfo->flags); LL(surfInfo->numChildren); @@ -3640,15 +3640,15 @@ qboolean R_LoadMDXM( model_t *mod, void *buffer, const char *mod_name, qboolean surfInfo = (mdxmSurfHierarchy_t *)( (byte *)surfInfo + (intptr_t)( &((mdxmSurfHierarchy_t *)0)->childIndexes[ surfInfo->numChildren ] )); continue; } - - if ( !sh->defaultShader ) + + if ( !sh->defaultShader ) { surfInfo->shaderIndex = sh->index; } if (surfInfo->shaderIndex) { - RE_RegisterModels_StoreShaderRequest(mod_name, &surfInfo->shader[0], &surfInfo->shaderIndex); + RE_RegisterModels_StoreShaderRequest(mod_name, &surfInfo->shader[0], &surfInfo->shaderIndex); } #ifdef Q3_BIG_ENDIAN @@ -3660,7 +3660,7 @@ qboolean R_LoadMDXM( model_t *mod, void *buffer, const char *mod_name, qboolean // find the next surface surfInfo = (mdxmSurfHierarchy_t *)( (byte *)surfInfo + (intptr_t)( &((mdxmSurfHierarchy_t *)0)->childIndexes[ surfInfo->numChildren ] )); } - + // swap all the LOD's (we need to do the middle part of this even for intel, because of shader reg and err-check) lod = (mdxmLOD_t *) ( (byte *)mdxm + mdxm->ofsLODs ); for ( l = 0 ; l < mdxm->numLODs ; l++) @@ -3670,7 +3670,7 @@ qboolean R_LoadMDXM( model_t *mod, void *buffer, const char *mod_name, qboolean LL(lod->ofsEnd); // swap all the surfaces surf = (mdxmSurface_t *) ( (byte *)lod + sizeof (mdxmLOD_t) + (mdxm->numSurfaces * sizeof(mdxmLODSurfOffset_t)) ); - for ( i = 0 ; i < mdxm->numSurfaces ; i++) + for ( i = 0 ; i < mdxm->numSurfaces ; i++) { LL(surf->thisSurfaceIndex); LL(surf->ofsHeader); @@ -3683,7 +3683,7 @@ qboolean R_LoadMDXM( model_t *mod, void *buffer, const char *mod_name, qboolean LL(surf->ofsEnd); triCount += surf->numTriangles; - + if ( surf->numVerts > SHADER_MAX_VERTEXES ) { Com_Error (ERR_DROP, "R_LoadMDXM: %s has more than %i verts on a surface (%i)", mod_name, SHADER_MAX_VERTEXES, surf->numVerts ); @@ -3692,7 +3692,7 @@ qboolean R_LoadMDXM( model_t *mod, void *buffer, const char *mod_name, qboolean Com_Error (ERR_DROP, "R_LoadMDXM: %s has more than %i triangles on a surface (%i)", mod_name, SHADER_MAX_INDEXES / 3, surf->numTriangles ); } - + // change to surface identifier surf->ident = SF_MDX; @@ -3704,15 +3704,15 @@ qboolean R_LoadMDXM( model_t *mod, void *buffer, const char *mod_name, qboolean // do all the bone reference data boneRef = (int *) ( (byte *)surf + surf->ofsBoneReferences ); - for ( j = 0 ; j < surf->numBoneReferences ; j++ ) + for ( j = 0 ; j < surf->numBoneReferences ; j++ ) { LL(boneRef[j]); } - + // swap all the triangles tri = (mdxmTriangle_t *) ( (byte *)surf + surf->ofsTriangles ); - for ( j = 0 ; j < surf->numTriangles ; j++, tri++ ) + for ( j = 0 ; j < surf->numTriangles ; j++, tri++ ) { LL(tri->indexes[0]); LL(tri->indexes[1]); @@ -3723,7 +3723,7 @@ qboolean R_LoadMDXM( model_t *mod, void *buffer, const char *mod_name, qboolean v = (mdxmVertex_t *) ( (byte *)surf + surf->ofsVerts ); pTexCoords = (mdxmVertexTexCoord_t *) &v[surf->numVerts]; - for ( j = 0 ; j < surf->numVerts ; j++ ) + for ( j = 0 ; j < surf->numVerts ; j++ ) { LF(v->normal[0]); LF(v->normal[1]); @@ -3746,7 +3746,7 @@ qboolean R_LoadMDXM( model_t *mod, void *buffer, const char *mod_name, qboolean if (isAnOldModelFile) { int *boneRef = (int *) ( (byte *)surf + surf->ofsBoneReferences ); - for ( j = 0 ; j < surf->numBoneReferences ; j++ ) + for ( j = 0 ; j < surf->numBoneReferences ; j++ ) { assert(boneRef[j] >= 0 && boneRef[j] < 72); if (boneRef[j] >= 0 && boneRef[j] < 72) @@ -3794,7 +3794,7 @@ qboolean R_LoadMDXA( model_t *mod, void *buffer, const char *mod_name, qboolean pinmodel = (mdxaHeader_t *)buffer; // // read some fields from the binary, but only LittleLong() them when we know this wasn't an already-cached model... - // + // version = (pinmodel->version); size = (pinmodel->ofsEnd); @@ -3803,7 +3803,7 @@ qboolean R_LoadMDXA( model_t *mod, void *buffer, const char *mod_name, qboolean LL(version); LL(size); } - + if (version != MDXA_VERSION) { ri.Printf( PRINT_WARNING, "R_LoadMDXA: %s has wrong version (%i should be %i)\n", mod_name, version, MDXA_VERSION); @@ -3821,7 +3821,7 @@ qboolean R_LoadMDXA( model_t *mod, void *buffer, const char *mod_name, qboolean if (!bAlreadyFound) { - // horrible new hackery, if !bAlreadyFound then we've just done a tag-morph, so we need to set the + // horrible new hackery, if !bAlreadyFound then we've just done a tag-morph, so we need to set the // bool reference passed into this function to true, to tell the caller NOT to do an FS_Freefile since // we've hijacked that memory block... // @@ -3878,9 +3878,9 @@ qboolean R_LoadMDXA( model_t *mod, void *buffer, const char *mod_name, qboolean } // find the largest index, since the actual number of compressed bone pools is not stored anywhere - for ( i = 0 ; i < mdxa->numFrames ; i++ ) + for ( i = 0 ; i < mdxa->numFrames ; i++ ) { - for ( j = 0 ; j < mdxa->numBones ; j++ ) + for ( j = 0 ; j < mdxa->numBones ; j++ ) { k = (i * mdxa->numBones * 3) + (j * 3); // iOffsetToIndex pIndex = (mdxaIndex_t *) ((byte*) mdxa + mdxa->ofsFrames + k); diff --git a/code/rd-vanilla/tr_image.cpp b/code/rd-vanilla/tr_image.cpp index 656a47747d..cbdba1040f 100644 --- a/code/rd-vanilla/tr_image.cpp +++ b/code/rd-vanilla/tr_image.cpp @@ -1,34 +1,35 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // tr_image.c -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - - #include "tr_local.h" #include "../rd-common/tr_common.h" -#include "../qcommon/sstring.h" #include - +#include static byte s_intensitytable[256]; static unsigned char s_gammatable[256]; @@ -64,6 +65,8 @@ textureMode_t modes[] = { {"GL_LINEAR_MIPMAP_LINEAR", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR} }; +static const size_t numTextureModes = ARRAY_LEN(modes); + /* ================ return a hash value for the filename @@ -113,20 +116,20 @@ GL_TextureMode =============== */ void GL_TextureMode( const char *string ) { - int i; + size_t i; image_t *glt; - for ( i=0 ; i< 6 ; i++ ) { + for ( i = 0; i < numTextureModes ; i++ ) { if ( !Q_stricmp( modes[i].name, string ) ) { break; } } - if ( i == 6 ) { + if ( i == numTextureModes ) { ri.Printf (PRINT_ALL, "bad filter name\n"); - for ( i=0 ; i< 6 ; i++ ) { - ri.Printf( PRINT_ALL, "%s\n",modes[i].name); - } + for ( i = 0; i < numTextureModes ; i++ ) { + ri.Printf( PRINT_ALL, "%s\n", modes[i].name); + } return; } @@ -136,7 +139,7 @@ void GL_TextureMode( const char *string ) { // If the level they requested is less than possible, set the max possible... if ( r_ext_texture_filter_anisotropic->value > glConfig.maxTextureFilterAnisotropy ) { - ri.Cvar_Set( "r_ext_texture_filter_anisotropic", va("%f",glConfig.maxTextureFilterAnisotropy) ); + ri.Cvar_SetValue( "r_ext_texture_filter_anisotropic", glConfig.maxTextureFilterAnisotropy ); } // change all the existing mipmap texture objects @@ -756,9 +759,9 @@ class CStringComparator bool operator()(const char *s1, const char *s2) const { return(Q_stricmp(s1, s2) < 0); } }; -typedef map AllocatedImages_t; - AllocatedImages_t AllocatedImages; - AllocatedImages_t::iterator itAllocatedImages; +typedef std::map AllocatedImages_t; +AllocatedImages_t AllocatedImages; +AllocatedImages_t::iterator itAllocatedImages; int giTextureBindNum = 1024; // will be set to this anyway at runtime, but wtf? @@ -807,26 +810,19 @@ static void GL_ResetBinds(void) // void R_Images_DeleteLightMaps(void) { - qboolean bEraseOccured = qfalse; - - for (AllocatedImages_t::iterator itImage = AllocatedImages.begin(); itImage != AllocatedImages.end(); bEraseOccured?itImage:++itImage) - { - bEraseOccured = qfalse; - + for (AllocatedImages_t::iterator itImage = AllocatedImages.begin(); itImage != AllocatedImages.end(); /* empty */) + { image_t *pImage = (*itImage).second; - + if (pImage->imgName[0] == '$' /*&& strstr(pImage->imgName,"lightmap")*/) // loose check, but should be ok { R_Images_DeleteImageContents(pImage); -#ifdef _WIN32 - itImage = AllocatedImages.erase(itImage); -#else - AllocatedImages_t::iterator itTemp = itImage; - itImage++; - AllocatedImages.erase(itTemp); -#endif - bEraseOccured = qtrue; + AllocatedImages.erase(itImage++); + } + else + { + ++itImage; } } @@ -836,12 +832,12 @@ void R_Images_DeleteLightMaps(void) // special function currently only called by Dissolve code... // void R_Images_DeleteImage(image_t *pImage) -{ +{ // Even though we supply the image handle, we need to get the corresponding iterator entry... // AllocatedImages_t::iterator itImage = AllocatedImages.find(pImage->imgName); if (itImage != AllocatedImages.end()) - { + { R_Images_DeleteImageContents(pImage); AllocatedImages.erase(itImage); } @@ -854,9 +850,9 @@ void R_Images_DeleteImage(image_t *pImage) // called only at app startup, vid_restart, app-exit // void R_Images_Clear(void) -{ +{ image_t *pImage; - // int iNumImages = + // int iNumImages = R_Images_StartIteration(); while ( (pImage = R_Images_GetNextIteration()) != NULL) { @@ -894,10 +890,10 @@ qboolean RE_RegisterImages_LevelLoadEnd(void) { //ri.Printf( PRINT_DEVELOPER, "RE_RegisterImages_LevelLoadEnd():\n"); - qboolean bEraseOccured = qfalse; - for (AllocatedImages_t::iterator itImage = AllocatedImages.begin(); itImage != AllocatedImages.end(); bEraseOccured?itImage:++itImage) - { - bEraseOccured = qfalse; + qboolean imageDeleted = qtrue; + for (AllocatedImages_t::iterator itImage = AllocatedImages.begin(); itImage != AllocatedImages.end(); /* blank */) + { + qboolean bEraseOccured = qfalse; image_t *pImage = (*itImage).second; @@ -910,34 +906,35 @@ qboolean RE_RegisterImages_LevelLoadEnd(void) { // nope, so dump it... //ri.Printf( PRINT_DEVELOPER, "Dumping image \"%s\"\n",pImage->imgName); R_Images_DeleteImageContents(pImage); -#ifdef _WIN32 - itImage = AllocatedImages.erase(itImage); -#else - AllocatedImages_t::iterator itTemp = itImage; - itImage++; - AllocatedImages.erase(itTemp); -#endif - bEraseOccured = qtrue; + + AllocatedImages.erase(itImage++); + bEraseOccured = qtrue; + imageDeleted = qtrue; } } + + if ( !bEraseOccured ) + { + ++itImage; + } } //ri.Printf( PRINT_DEVELOPER, "RE_RegisterImages_LevelLoadEnd(): Ok\n"); GL_ResetBinds(); - return bEraseOccured; + return imageDeleted; } -// returns image_t struct if we already have this, else NULL. No disk-open performed +// returns image_t struct if we already have this, else NULL. No disk-open performed // (important for creating default images). // // This is called by both R_FindImageFile and anything that creates default images... // static image_t *R_FindImageFile_NoLoad(const char *name, qboolean mipmap, qboolean allowPicmip, qboolean allowTC, int glWrapClampMode ) -{ +{ if (!name) { return NULL; } @@ -949,7 +946,7 @@ static image_t *R_FindImageFile_NoLoad(const char *name, qboolean mipmap, qboole // AllocatedImages_t::iterator itAllocatedImage = AllocatedImages.find(pName); if (itAllocatedImage != AllocatedImages.end()) - { + { image_t *pImage = (*itAllocatedImage).second; // the white image can be used with any set of parms, but other mismatches are errors... @@ -1101,43 +1098,6 @@ image_t *R_FindImageFile( const char *name, qboolean mipmap, qboolean allowPicmi } - -// EF dlight image creation code -/* -================ -R_CreateDlightImage -================ -*/ -/* -#define DLIGHT_SIZE 16 -static void R_CreateDlightImage( void ) { - int x,y; - byte data[DLIGHT_SIZE][DLIGHT_SIZE][4]; - int b; - - // make a centered inverse-square falloff blob for dynamic lighting - for (x=0 ; x 255) { - b = 255; - } else if ( b < 75 ) { - b = 0; - } - data[y][x][0] = - data[y][x][1] = - data[y][x][2] = 255; - data[y][x][3] = b/8; - } - } - tr.dlightImage = R_CreateImage("*dlight", (byte *)data, DLIGHT_SIZE, DLIGHT_SIZE, qfalse, qfalse, GL_CLAMP ); -} -*/ -// Holomatch dlight image creation code /* ================ R_CreateDlightImage @@ -1228,7 +1188,7 @@ void R_InitFogTable( void ) { int i; float d; float exp; - + exp = 0.5; for ( i = 0 ; i < FOG_TABLE_SIZE ; i++ ) { @@ -1258,7 +1218,7 @@ float R_FogFactor( float s, float t ) { return 0; } if ( t < 31.0/32 ) { - s *= (t - 1.0/32) / (30.0/32); + s *= (t - 1.0f/32.0f) / (30.0f/32.0f); } // we need to leave a lot of clamp range @@ -1291,10 +1251,10 @@ static void R_CreateFogImage( void ) { // S is distance, T is depth for (x=0 ; xinteger > glConfig.vidWidth ) @@ -1400,13 +1360,13 @@ void R_CreateBuiltinImages( void ) { r_DynamicGlowHeight->integer = glConfig.vidHeight; } tr.blurImage = 1024 + giTextureBindNum++; - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.blurImage ); - qglTexImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA16, r_DynamicGlowWidth->integer, r_DynamicGlowHeight->integer, 0, GL_RGB, GL_FLOAT, 0 ); - qglTexParameteri( GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - qglTexParameteri( GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - qglTexParameteri( GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - qglTexParameteri( GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.blurImage ); + qglTexImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA16, r_DynamicGlowWidth->integer, r_DynamicGlowHeight->integer, 0, GL_RGB, GL_FLOAT, 0 ); + qglTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + qglTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + qglTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); + qglTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglEnable( GL_TEXTURE_2D ); @@ -1509,7 +1469,7 @@ void R_SetColorMappings( void ) { if ( glConfig.deviceSupportsGamma ) { - GLimp_SetGamma( s_gammatable, s_gammatable, s_gammatable ); + ri.WIN_SetGamma( &glConfig, s_gammatable, s_gammatable, s_gammatable ); } } @@ -1537,462 +1497,7 @@ R_DeleteTextures // void R_DeleteTextures( void ) { - R_Images_Clear(); + R_Images_Clear(); GL_ResetBinds(); } -/* -============================================================================ - -SKINS - -============================================================================ -*/ - -/* -================== -CommaParse - -This is unfortunate, but the skin files aren't -compatable with our normal parsing rules. -================== -*/ -static char *CommaParse( char **data_p ) { - int c = 0, len; - char *data; - static char com_token[MAX_TOKEN_CHARS]; - - data = *data_p; - len = 0; - com_token[0] = 0; - - // make sure incoming data is valid - if ( !data ) { - *data_p = NULL; - return com_token; - } - - while ( 1 ) { - // skip whitespace - while( (c = *data) <= ' ') { - if( !c ) { - break; - } - data++; - } - - - c = *data; - - // skip double slash comments - if ( c == '/' && data[1] == '/' ) - { - while (*data && *data != '\n') - data++; - } - // skip /* */ comments - else if ( c=='/' && data[1] == '*' ) - { - while ( *data && ( *data != '*' || data[1] != '/' ) ) - { - data++; - } - if ( *data ) - { - data += 2; - } - } - else - { - break; - } - } - - if ( c == 0 ) { - return ""; - } - - // handle quoted strings - if (c == '\"') - { - data++; - while (1) - { - c = *data++; - if (c=='\"' || !c) - { - com_token[len] = 0; - *data_p = ( char * ) data; - return com_token; - } - if (len < MAX_TOKEN_CHARS - 1) - { - com_token[len] = c; - len++; - } - } - } - - // parse a regular word - do - { - if (len < MAX_TOKEN_CHARS - 1) - { - com_token[len] = c; - len++; - } - data++; - c = *data; - } while (c>32 && c != ',' ); - - com_token[len] = 0; - - *data_p = ( char * ) data; - return com_token; -} - -/* -class CStringComparator -{ -public: - bool operator()(const char *s1, const char *s2) const { return(stricmp(s1, s2) < 0); } -}; -*/ -typedef map AnimationCFGs_t; - AnimationCFGs_t AnimationCFGs; - -// I added this function for development purposes (and it's VM-safe) so we don't have problems -// with our use of cached models but uncached animation.cfg files (so frame sequences are out of sync -// if someone rebuild the model while you're ingame and you change levels)... -// -// Usage: call with psDest == NULL for a size enquire (for malloc), -// then with NZ ptr for it to copy to your supplied buffer... -// -int RE_GetAnimationCFG(const char *psCFGFilename, char *psDest, int iDestSize) -{ - char *psText = NULL; - - AnimationCFGs_t::iterator it = AnimationCFGs.find(psCFGFilename); - if (it != AnimationCFGs.end()) - { - psText = (*it).second; - } - else - { - // not found, so load it... - // - fileHandle_t f; - int iLen = ri.FS_FOpenFileRead( psCFGFilename, &f, FS_READ ); - if (iLen <= 0) - { - return 0; - } - - psText = (char *) ri.Z_Malloc( iLen+1, TAG_ANIMATION_CFG, qfalse, 4 ); - - ri.FS_Read( psText, iLen, f ); - psText[iLen] = '\0'; - ri.FS_FCloseFile( f ); - - AnimationCFGs[psCFGFilename] = psText; - } - - if (psText) // sanity, but should always be NZ - { - if (psDest) - { - Q_strncpyz(psDest,psText,iDestSize); - } - - return strlen(psText); - } - - return 0; -} - -// only called from devmapbsp, devmapall, or ... -// -void RE_AnimationCFGs_DeleteAll(void) -{ - for (AnimationCFGs_t::iterator it = AnimationCFGs.begin(); it != AnimationCFGs.end(); ++it) - { - char *psText = (*it).second; - Z_Free(psText); - } - - AnimationCFGs.clear(); -} - -/* -=============== -RE_SplitSkins -input = skinname, possibly being a macro for three skins -return= true if three part skins found -output= qualified names to three skins if return is true, undefined if false -=============== -*/ -bool RE_SplitSkins(const char *INname, char *skinhead, char *skintorso, char *skinlower) -{ //INname= "models/players/jedi_tf/|head01_skin1|torso01|lower01"; - if (strchr(INname, '|')) - { - char name[MAX_QPATH]; - strcpy(name, INname); - char *p = strchr(name, '|'); - *p=0; - p++; - //fill in the base path - strcpy (skinhead, name); - strcpy (skintorso, name); - strcpy (skinlower, name); - - //now get the the individual files - - //advance to second - char *p2 = strchr(p, '|'); - assert(p2); - *p2=0; - p2++; - strcat (skinhead, p); - strcat (skinhead, ".skin"); - - - //advance to third - p = strchr(p2, '|'); - assert(p); - if (!p) - { - return false; - } - *p=0; - p++; - strcat (skintorso,p2); - strcat (skintorso, ".skin"); - - strcat (skinlower,p); - strcat (skinlower, ".skin"); - - return true; - } - return false; -} - - -qhandle_t RE_RegisterIndividualSkin( const char *name , qhandle_t hSkin); -/* -=============== -RE_RegisterSkin - -=============== -*/ -qhandle_t RE_RegisterSkin( const char *name) { - qhandle_t hSkin; - skin_t *skin; - -// if (!cls.cgameStarted && !cls.uiStarted) -// { - //rww - added uiStarted exception because we want ghoul2 models in the menus. - // gwg well we need our skins to set surfaces on and off, so we gotta get em - //return 1; // cope with Ghoul2's calling-the-renderer-before-its-even-started hackery, must be any NZ amount here to trigger configstring setting -// } - - if (!tr.numSkins) - { - R_InitSkins(); //make sure we have numSkins set to at least one. - } - - if ( !name || !name[0] ) { - Com_Printf( "Empty name passed to RE_RegisterSkin\n" ); - return 0; - } - - if ( strlen( name ) >= MAX_QPATH ) { - Com_Printf( "Skin name exceeds MAX_QPATH\n" ); - return 0; - } - - // see if the skin is already loaded - for ( hSkin = 1; hSkin < tr.numSkins ; hSkin++ ) { - skin = tr.skins[hSkin]; - if ( !Q_stricmp( skin->name, name ) ) { - if( skin->numSurfaces == 0 ) { - return 0; // default skin - } - return(hSkin); - } - } - - if ( tr.numSkins == MAX_SKINS ) { - ri.Printf( PRINT_WARNING, "WARNING: RE_RegisterSkin( '%s' ) MAX_SKINS hit\n", name ); - return 0; - } - // allocate a new skin - tr.numSkins++; - skin = (skin_t*) Hunk_Alloc( sizeof( skin_t ), qtrue ); - tr.skins[hSkin] = skin; - Q_strncpyz( skin->name, name, sizeof( skin->name ) ); //always make one so it won't search for it again - - // If not a .skin file, load as a single shader - then return - if ( strcmp( name + strlen( name ) - 5, ".skin" ) ) { -#ifdef JK2_MODE - skin->numSurfaces = 1; - skin->surfaces[0] = (skinSurface_t *) Hunk_Alloc( sizeof(skin->surfaces[0]), qtrue ); - skin->surfaces[0]->shader = R_FindShader( name, lightmapsNone, stylesDefault, qtrue ); - return hSkin; -#endif -/* skin->numSurfaces = 1; - skin->surfaces[0] = (skinSurface_t *) Hunk_Alloc( sizeof(skin->surfaces[0]), qtrue ); - skin->surfaces[0]->shader = R_FindShader( name, lightmapsNone, stylesDefault, qtrue ); - return hSkin; -*/ - } - - char skinhead[MAX_QPATH]={0}; - char skintorso[MAX_QPATH]={0}; - char skinlower[MAX_QPATH]={0}; - if ( RE_SplitSkins(name, (char*)&skinhead, (char*)&skintorso, (char*)&skinlower ) ) - {//three part - hSkin = RE_RegisterIndividualSkin(skinhead, hSkin); - if (hSkin) - { - hSkin = RE_RegisterIndividualSkin(skintorso, hSkin); - if (hSkin) - { - hSkin = RE_RegisterIndividualSkin(skinlower, hSkin); - } - } - } - else - {//single skin - hSkin = RE_RegisterIndividualSkin(name, hSkin); - } - return(hSkin); -} - -// given a name, go get the skin we want and return -qhandle_t RE_RegisterIndividualSkin( const char *name , qhandle_t hSkin) -{ - skin_t *skin; - skinSurface_t *surf; - char *text, *text_p; - char *token; - char surfName[MAX_QPATH]; - - // load and parse the skin file - ri.FS_ReadFile( name, (void **)&text ); - if ( !text ) { - ri.Printf( PRINT_ERROR, "WARNING: RE_RegisterSkin( '%s' ) failed to load!\n", name ); - return 0; - } - - assert (tr.skins[hSkin]); //should already be setup, but might be an 3part append - - skin = tr.skins[hSkin]; - - text_p = text; - while ( text_p && *text_p ) { - // get surface name - token = CommaParse( &text_p ); - Q_strncpyz( surfName, token, sizeof( surfName ) ); - - if ( !token[0] ) { - break; - } - // lowercase the surface name so skin compares are faster - Q_strlwr( surfName ); - - if ( *text_p == ',' ) { - text_p++; - } - - if ( !strncmp( token, "tag_", 4 ) ) { //these aren't in there, but just in case you load an id style one... - continue; - } - - // parse the shader name - token = CommaParse( &text_p ); - -#ifndef JK2_MODE - if ( !strcmp( &surfName[strlen(surfName)-4], "_off") ) - { - if ( !strcmp( token ,"*off" ) ) - { - continue; //don't need these double offs - } - surfName[strlen(surfName)-4] = 0; //remove the "_off" - } -#endif - if ((int)(sizeof( skin->surfaces) / sizeof( skin->surfaces[0] )) <= skin->numSurfaces) - { - assert( (int)(sizeof( skin->surfaces) / sizeof( skin->surfaces[0] )) > skin->numSurfaces ); - ri.Printf( PRINT_ERROR, "WARNING: RE_RegisterSkin( '%s' ) more than %u surfaces!\n", name, (unsigned int)ARRAY_LEN(skin->surfaces) ); - break; - } - surf = skin->surfaces[ skin->numSurfaces ] = (skinSurface_t *) Hunk_Alloc( sizeof( *skin->surfaces[0] ), qtrue ); - Q_strncpyz( surf->name, surfName, sizeof( surf->name ) ); - surf->shader = R_FindShader( token, lightmapsNone, stylesDefault, qtrue ); - skin->numSurfaces++; - } - - ri.FS_FreeFile( text ); - - - // never let a skin have 0 shaders - if ( skin->numSurfaces == 0 ) { - return 0; // use default skin - } - - return hSkin; -} - - -/* -=============== -R_InitSkins -=============== -*/ -void R_InitSkins( void ) { - skin_t *skin; - - tr.numSkins = 1; - - // make the default skin have all default shaders - skin = tr.skins[0] = (skin_t*) Hunk_Alloc( sizeof( skin_t ), qtrue ); - Q_strncpyz( skin->name, "", sizeof( skin->name ) ); - skin->numSurfaces = 1; - skin->surfaces[0] = (skinSurface_t *) Hunk_Alloc( sizeof( *skin->surfaces[0] ), qtrue ); - skin->surfaces[0]->shader = tr.defaultShader; -} - -/* -=============== -R_GetSkinByHandle -=============== -*/ -skin_t *R_GetSkinByHandle( qhandle_t hSkin ) { - if ( hSkin < 1 || hSkin >= tr.numSkins ) { - return tr.skins[0]; - } - return tr.skins[ hSkin ]; -} - -/* -=============== -R_SkinList_f -=============== -*/ -void R_SkinList_f (void) { - int i, j; - skin_t *skin; - - ri.Printf (PRINT_ALL, "------------------\n"); - - for ( i = 0 ; i < tr.numSkins ; i++ ) { - skin = tr.skins[i]; - ri.Printf( PRINT_ALL, "%3i:%s\n", i, skin->name ); - for ( j = 0 ; j < skin->numSurfaces ; j++ ) { - ri.Printf( PRINT_ALL, " %s = %s\n", - skin->surfaces[j]->name, skin->surfaces[j]->shader->name ); - } - } - ri.Printf (PRINT_ALL, "------------------\n"); -} diff --git a/code/rd-vanilla/tr_init.cpp b/code/rd-vanilla/tr_init.cpp index ac93f016a3..c7449bb6af 100644 --- a/code/rd-vanilla/tr_init.cpp +++ b/code/rd-vanilla/tr_init.cpp @@ -1,29 +1,31 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // tr_init.c -- functions that are not called every frame -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - - #include "tr_local.h" #include "../rd-common/tr_common.h" #include "tr_stl.h" @@ -32,27 +34,25 @@ This file is part of Jedi Academy. glconfig_t glConfig; glstate_t glState; +window_t window; static void GfxInfo_f( void ); cvar_t *r_verbose; cvar_t *r_ignore; -cvar_t *r_displayRefresh; - cvar_t *r_detailTextures; cvar_t *r_znear; cvar_t *r_skipBackEnd; -cvar_t *r_ignorehwgamma; cvar_t *r_measureOverdraw; cvar_t *r_fastsky; cvar_t *r_drawSun; cvar_t *r_dynamiclight; -cvar_t *r_dlightBacks; +// rjr - removed for hacking cvar_t *r_dlightBacks; cvar_t *r_lodbias; cvar_t *r_lodscale; @@ -103,10 +103,6 @@ cvar_t *r_DynamicGlowHeight; cvar_t *r_ignoreGLErrors; cvar_t *r_logFile; -cvar_t *r_stencilbits; -cvar_t *r_depthbits; -cvar_t *r_colorbits; -cvar_t *r_stereo; cvar_t *r_primitives; cvar_t *r_texturebits; cvar_t *r_texturebitslm; @@ -116,7 +112,6 @@ cvar_t *r_vertexLight; cvar_t *r_shadows; cvar_t *r_shadowRange; cvar_t *r_flares; -cvar_t *r_mode; cvar_t *r_nobind; cvar_t *r_singleShader; cvar_t *r_colorMipLevels; @@ -127,7 +122,6 @@ cvar_t *r_showsky; cvar_t *r_shownormals; cvar_t *r_finish; cvar_t *r_clear; -cvar_t *r_swapInterval; cvar_t *r_textureMode; cvar_t *r_offsetFactor; cvar_t *r_offsetUnits; @@ -140,13 +134,6 @@ cvar_t *r_portalOnly; cvar_t *r_subdivisions; cvar_t *r_lodCurveError; -cvar_t *r_fullscreen; -cvar_t *r_noborder; -cvar_t *r_centerWindow; - -cvar_t *r_customwidth; -cvar_t *r_customheight; - cvar_t *r_overBrightBits; cvar_t *r_mapOverBrightBits; @@ -163,10 +150,6 @@ cvar_t *r_debugStyle; cvar_t *r_modelpoolmegs; -/* -Ghoul2 Insert Start -*/ - cvar_t *r_noGhoul2; cvar_t *r_Ghoul2AnimSmooth; cvar_t *r_Ghoul2UnSqash; @@ -176,19 +159,19 @@ cvar_t *r_Ghoul2NoBlend; cvar_t *r_Ghoul2BlendMultiplier=0; cvar_t *r_Ghoul2UnSqashAfterSmooth; -cvar_t *broadsword=0; -cvar_t *broadsword_kickbones=0; -cvar_t *broadsword_kickorigin=0; -cvar_t *broadsword_playflop=0; -cvar_t *broadsword_dontstopanim=0; -cvar_t *broadsword_waitforshot=0; -cvar_t *broadsword_smallbbox=0; -cvar_t *broadsword_extra1=0; -cvar_t *broadsword_extra2=0; +cvar_t *broadsword; +cvar_t *broadsword_kickbones; +cvar_t *broadsword_kickorigin; +cvar_t *broadsword_playflop; +cvar_t *broadsword_dontstopanim; +cvar_t *broadsword_waitforshot; +cvar_t *broadsword_smallbbox; +cvar_t *broadsword_extra1; +cvar_t *broadsword_extra2; -cvar_t *broadsword_effcorr=0; -cvar_t *broadsword_ragtobase=0; -cvar_t *broadsword_dircap=0; +cvar_t *broadsword_effcorr; +cvar_t *broadsword_ragtobase; +cvar_t *broadsword_dircap; // More bullshit needed for the proper modular renderer --eez cvar_t *sv_mapname; @@ -203,110 +186,499 @@ cvar_t *r_environmentMapping; cvar_t *r_screenshotJpegQuality; +PFNGLACTIVETEXTUREARBPROC qglActiveTextureARB; +PFNGLCLIENTACTIVETEXTUREARBPROC qglClientActiveTextureARB; +PFNGLMULTITEXCOORD2FARBPROC qglMultiTexCoord2fARB; + +PFNGLCOMBINERPARAMETERFVNVPROC qglCombinerParameterfvNV; +PFNGLCOMBINERPARAMETERIVNVPROC qglCombinerParameterivNV; +PFNGLCOMBINERPARAMETERFNVPROC qglCombinerParameterfNV; +PFNGLCOMBINERPARAMETERINVPROC qglCombinerParameteriNV; +PFNGLCOMBINERINPUTNVPROC qglCombinerInputNV; +PFNGLCOMBINEROUTPUTNVPROC qglCombinerOutputNV; + +PFNGLFINALCOMBINERINPUTNVPROC qglFinalCombinerInputNV; +PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC qglGetCombinerInputParameterfvNV; +PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC qglGetCombinerInputParameterivNV; +PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC qglGetCombinerOutputParameterfvNV; +PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC qglGetCombinerOutputParameterivNV; +PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC qglGetFinalCombinerInputParameterfvNV; +PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC qglGetFinalCombinerInputParameterivNV; + +PFNGLPROGRAMSTRINGARBPROC qglProgramStringARB; +PFNGLBINDPROGRAMARBPROC qglBindProgramARB; +PFNGLDELETEPROGRAMSARBPROC qglDeleteProgramsARB; +PFNGLGENPROGRAMSARBPROC qglGenProgramsARB; +PFNGLPROGRAMENVPARAMETER4DARBPROC qglProgramEnvParameter4dARB; +PFNGLPROGRAMENVPARAMETER4DVARBPROC qglProgramEnvParameter4dvARB; +PFNGLPROGRAMENVPARAMETER4FARBPROC qglProgramEnvParameter4fARB; +PFNGLPROGRAMENVPARAMETER4FVARBPROC qglProgramEnvParameter4fvARB; +PFNGLPROGRAMLOCALPARAMETER4DARBPROC qglProgramLocalParameter4dARB; +PFNGLPROGRAMLOCALPARAMETER4DVARBPROC qglProgramLocalParameter4dvARB; +PFNGLPROGRAMLOCALPARAMETER4FARBPROC qglProgramLocalParameter4fARB; +PFNGLPROGRAMLOCALPARAMETER4FVARBPROC qglProgramLocalParameter4fvARB; +PFNGLGETPROGRAMENVPARAMETERDVARBPROC qglGetProgramEnvParameterdvARB; +PFNGLGETPROGRAMENVPARAMETERFVARBPROC qglGetProgramEnvParameterfvARB; +PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC qglGetProgramLocalParameterdvARB; +PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC qglGetProgramLocalParameterfvARB; +PFNGLGETPROGRAMIVARBPROC qglGetProgramivARB; +PFNGLGETPROGRAMSTRINGARBPROC qglGetProgramStringARB; +PFNGLISPROGRAMARBPROC qglIsProgramARB; + +PFNGLLOCKARRAYSEXTPROC qglLockArraysEXT; +PFNGLUNLOCKARRAYSEXTPROC qglUnlockArraysEXT; + +bool g_bTextureRectangleHack = false; + +void RE_SetLightStyle(int style, int color); + +void R_Splash() +{ + image_t *pImage = R_FindImageFile( "menu/splash", qfalse, qfalse, qfalse, GL_CLAMP); + + if ( !pImage ) + { + // Can't find the splash image so just clear to black + qglClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); + qglClear( GL_COLOR_BUFFER_BIT ); + } + else + { + extern void RB_SetGL2D (void); + RB_SetGL2D(); + + GL_Bind( pImage ); + GL_State(GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO); + + const int width = 640; + const int height = 480; + const float x1 = 320 - width / 2; + const float x2 = 320 + width / 2; + const float y1 = 240 - height / 2; + const float y2 = 240 + height / 2; + + qglBegin (GL_TRIANGLE_STRIP); + qglTexCoord2f( 0, 0 ); + qglVertex2f(x1, y1); + qglTexCoord2f( 1 , 0 ); + qglVertex2f(x2, y1); + qglTexCoord2f( 0, 1 ); + qglVertex2f(x1, y2); + qglTexCoord2f( 1, 1 ); + qglVertex2f(x2, y2); + qglEnd(); + } + + ri.WIN_Present( &window ); +} + /* -Ghoul2 Insert End +** GLW_CheckForExtension + + Cannot use strstr directly to differentiate between (for eg) reg_combiners and reg_combiners2 */ +bool GL_CheckForExtension(const char *ext) +{ + const char *ptr = Q_stristr( glConfig.extensions_string, ext ); + if (ptr == NULL) + return false; + ptr += strlen(ext); + return ((*ptr == ' ') || (*ptr == '\0')); // verify it's complete string. +} -#ifdef _WIN32 -void ( APIENTRY * qglMultiTexCoord2fARB )( GLenum texture, GLfloat s, GLfloat t ); -void ( APIENTRY * qglActiveTextureARB )( GLenum texture ); -void ( APIENTRY * qglClientActiveTextureARB )( GLenum texture ); -void ( APIENTRY * qglLockArraysEXT)( GLint, GLint); -void ( APIENTRY * qglUnlockArraysEXT) ( void ); -#endif +static void GLW_InitTextureCompression( void ) +{ + bool newer_tc, old_tc; -#ifdef _WIN32 // GLOWXXX -// Declare Register Combiners function pointers. -PFNGLCOMBINERPARAMETERFVNV qglCombinerParameterfvNV = NULL; -PFNGLCOMBINERPARAMETERIVNV qglCombinerParameterivNV = NULL; -PFNGLCOMBINERPARAMETERFNV qglCombinerParameterfNV = NULL; -PFNGLCOMBINERPARAMETERINV qglCombinerParameteriNV = NULL; -PFNGLCOMBINERINPUTNV qglCombinerInputNV = NULL; -PFNGLCOMBINEROUTPUTNV qglCombinerOutputNV = NULL; -PFNGLFINALCOMBINERINPUTNV qglFinalCombinerInputNV = NULL; -PFNGLGETCOMBINERINPUTPARAMETERFVNV qglGetCombinerInputParameterfvNV = NULL; -PFNGLGETCOMBINERINPUTPARAMETERIVNV qglGetCombinerInputParameterivNV = NULL; -PFNGLGETCOMBINEROUTPUTPARAMETERFVNV qglGetCombinerOutputParameterfvNV = NULL; -PFNGLGETCOMBINEROUTPUTPARAMETERIVNV qglGetCombinerOutputParameterivNV = NULL; -PFNGLGETFINALCOMBINERINPUTPARAMETERFVNV qglGetFinalCombinerInputParameterfvNV = NULL; -PFNGLGETFINALCOMBINERINPUTPARAMETERIVNV qglGetFinalCombinerInputParameterivNV = NULL; - -// Declare Pixel Format function pointers. -PFNWGLGETPIXELFORMATATTRIBIVARBPROC qwglGetPixelFormatAttribivARB = NULL; -PFNWGLGETPIXELFORMATATTRIBFVARBPROC qwglGetPixelFormatAttribfvARB = NULL; -PFNWGLCHOOSEPIXELFORMATARBPROC qwglChoosePixelFormatARB = NULL; - -// Declare Pixel Buffer function pointers. -PFNWGLCREATEPBUFFERARBPROC qwglCreatePbufferARB = NULL; -PFNWGLGETPBUFFERDCARBPROC qwglGetPbufferDCARB = NULL; -PFNWGLRELEASEPBUFFERDCARBPROC qwglReleasePbufferDCARB = NULL; -PFNWGLDESTROYPBUFFERARBPROC qwglDestroyPbufferARB = NULL; -PFNWGLQUERYPBUFFERARBPROC qwglQueryPbufferARB = NULL; - -// Declare Render-Texture function pointers. -PFNWGLBINDTEXIMAGEARBPROC qwglBindTexImageARB = NULL; -PFNWGLRELEASETEXIMAGEARBPROC qwglReleaseTexImageARB = NULL; -PFNWGLSETPBUFFERATTRIBARBPROC qwglSetPbufferAttribARB = NULL; - -// Declare Vertex and Fragment Program function pointers. -PFNGLPROGRAMSTRINGARBPROC qglProgramStringARB = NULL; -PFNGLBINDPROGRAMARBPROC qglBindProgramARB = NULL; -PFNGLDELETEPROGRAMSARBPROC qglDeleteProgramsARB = NULL; -PFNGLGENPROGRAMSARBPROC qglGenProgramsARB = NULL; -PFNGLPROGRAMENVPARAMETER4DARBPROC qglProgramEnvParameter4dARB = NULL; -PFNGLPROGRAMENVPARAMETER4DVARBPROC qglProgramEnvParameter4dvARB = NULL; -PFNGLPROGRAMENVPARAMETER4FARBPROC qglProgramEnvParameter4fARB = NULL; -PFNGLPROGRAMENVPARAMETER4FVARBPROC qglProgramEnvParameter4fvARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4DARBPROC qglProgramLocalParameter4dARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4DVARBPROC qglProgramLocalParameter4dvARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4FARBPROC qglProgramLocalParameter4fARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4FVARBPROC qglProgramLocalParameter4fvARB = NULL; -PFNGLGETPROGRAMENVPARAMETERDVARBPROC qglGetProgramEnvParameterdvARB = NULL; -PFNGLGETPROGRAMENVPARAMETERFVARBPROC qglGetProgramEnvParameterfvARB = NULL; -PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC qglGetProgramLocalParameterdvARB = NULL; -PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC qglGetProgramLocalParameterfvARB = NULL; -PFNGLGETPROGRAMIVARBPROC qglGetProgramivARB = NULL; -PFNGLGETPROGRAMSTRINGARBPROC qglGetProgramStringARB = NULL; -PFNGLISPROGRAMARBPROC qglIsProgramARB = NULL; -#endif + // Check for available tc methods. + newer_tc = GL_CheckForExtension("ARB_texture_compression") && GL_CheckForExtension("EXT_texture_compression_s3tc"); + old_tc = GL_CheckForExtension("GL_S3_s3tc"); -void RE_SetLightStyle(int style, int color); + if ( old_tc ) + { + Com_Printf ("...GL_S3_s3tc available\n" ); + } -void R_Splash() + if ( newer_tc ) + { + Com_Printf ("...GL_EXT_texture_compression_s3tc available\n" ); + } + + if ( !r_ext_compressed_textures->value ) + { + // Compressed textures are off + glConfig.textureCompression = TC_NONE; + Com_Printf ("...ignoring texture compression\n" ); + } + else if ( !old_tc && !newer_tc ) + { + // Requesting texture compression, but no method found + glConfig.textureCompression = TC_NONE; + Com_Printf ("...no supported texture compression method found\n" ); + Com_Printf (".....ignoring texture compression\n" ); + } + else + { + // some form of supported texture compression is avaiable, so see if the user has a preference + if ( r_ext_preferred_tc_method->integer == TC_NONE ) + { + // No preference, so pick the best + if ( newer_tc ) + { + Com_Printf ("...no tc preference specified\n" ); + Com_Printf (".....using GL_EXT_texture_compression_s3tc\n" ); + glConfig.textureCompression = TC_S3TC_DXT; + } + else + { + Com_Printf ("...no tc preference specified\n" ); + Com_Printf (".....using GL_S3_s3tc\n" ); + glConfig.textureCompression = TC_S3TC; + } + } + else + { + // User has specified a preference, now see if this request can be honored + if ( old_tc && newer_tc ) + { + // both are avaiable, so we can use the desired tc method + if ( r_ext_preferred_tc_method->integer == TC_S3TC ) + { + Com_Printf ("...using preferred tc method, GL_S3_s3tc\n" ); + glConfig.textureCompression = TC_S3TC; + } + else + { + Com_Printf ("...using preferred tc method, GL_EXT_texture_compression_s3tc\n" ); + glConfig.textureCompression = TC_S3TC_DXT; + } + } + else + { + // Both methods are not available, so this gets trickier + if ( r_ext_preferred_tc_method->integer == TC_S3TC ) + { + // Preferring to user older compression + if ( old_tc ) + { + Com_Printf ("...using GL_S3_s3tc\n" ); + glConfig.textureCompression = TC_S3TC; + } + else + { + // Drat, preference can't be honored + Com_Printf ("...preferred tc method, GL_S3_s3tc not available\n" ); + Com_Printf (".....falling back to GL_EXT_texture_compression_s3tc\n" ); + glConfig.textureCompression = TC_S3TC_DXT; + } + } + else + { + // Preferring to user newer compression + if ( newer_tc ) + { + Com_Printf ("...using GL_EXT_texture_compression_s3tc\n" ); + glConfig.textureCompression = TC_S3TC_DXT; + } + else + { + // Drat, preference can't be honored + Com_Printf ("...preferred tc method, GL_EXT_texture_compression_s3tc not available\n" ); + Com_Printf (".....falling back to GL_S3_s3tc\n" ); + glConfig.textureCompression = TC_S3TC; + } + } + } + } + } +} + +/* +=============== +GLimp_InitExtensions +=============== +*/ +extern bool g_bDynamicGlowSupported; +static void GLimp_InitExtensions( void ) { - image_t *pImage; + if ( !r_allowExtensions->integer ) + { + Com_Printf ("*** IGNORING OPENGL EXTENSIONS ***\n" ); + g_bDynamicGlowSupported = false; + ri.Cvar_Set( "r_DynamicGlow","0" ); + return; + } - pImage = R_FindImageFile( "menu/splash", qfalse, qfalse, qfalse, GL_CLAMP); + Com_Printf ("Initializing OpenGL extensions\n" ); - extern void RB_SetGL2D (void); - RB_SetGL2D(); - if (pImage ) - {//invalid paths? - GL_Bind( pImage ); + // Select our tc scheme + GLW_InitTextureCompression(); + + // GL_EXT_texture_env_add + glConfig.textureEnvAddAvailable = qfalse; + if ( GL_CheckForExtension( "EXT_texture_env_add" ) ) + { + if ( r_ext_texture_env_add->integer ) + { + glConfig.textureEnvAddAvailable = qtrue; + Com_Printf ("...using GL_EXT_texture_env_add\n" ); + } + else + { + glConfig.textureEnvAddAvailable = qfalse; + Com_Printf ("...ignoring GL_EXT_texture_env_add\n" ); + } + } + else + { + Com_Printf ("...GL_EXT_texture_env_add not found\n" ); + } + + // GL_EXT_texture_filter_anisotropic + glConfig.maxTextureFilterAnisotropy = 0; + if ( GL_CheckForExtension( "EXT_texture_filter_anisotropic" ) ) + { + qglGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &glConfig.maxTextureFilterAnisotropy ); + Com_Printf ("...GL_EXT_texture_filter_anisotropic available\n" ); + + if ( r_ext_texture_filter_anisotropic->integer > 1 ) + { + Com_Printf ("...using GL_EXT_texture_filter_anisotropic\n" ); + } + else + { + Com_Printf ("...ignoring GL_EXT_texture_filter_anisotropic\n" ); + } + ri.Cvar_SetValue( "r_ext_texture_filter_anisotropic_avail", glConfig.maxTextureFilterAnisotropy ); + if ( r_ext_texture_filter_anisotropic->value > glConfig.maxTextureFilterAnisotropy ) + { + ri.Cvar_SetValue( "r_ext_texture_filter_anisotropic_avail", glConfig.maxTextureFilterAnisotropy ); + } + } + else + { + Com_Printf ("...GL_EXT_texture_filter_anisotropic not found\n" ); + ri.Cvar_Set( "r_ext_texture_filter_anisotropic_avail", "0" ); + } + + // GL_EXT_clamp_to_edge + glConfig.clampToEdgeAvailable = qtrue; + Com_Printf ("...using GL_EXT_texture_edge_clamp\n" ); + + // GL_ARB_multitexture + qglMultiTexCoord2fARB = NULL; + qglActiveTextureARB = NULL; + qglClientActiveTextureARB = NULL; + if ( GL_CheckForExtension( "GL_ARB_multitexture" ) ) + { + if ( r_ext_multitexture->integer ) + { + qglMultiTexCoord2fARB = ( PFNGLMULTITEXCOORD2FARBPROC ) ri.GL_GetProcAddress( "glMultiTexCoord2fARB" ); + qglActiveTextureARB = ( PFNGLACTIVETEXTUREARBPROC ) ri.GL_GetProcAddress( "glActiveTextureARB" ); + qglClientActiveTextureARB = ( PFNGLCLIENTACTIVETEXTUREARBPROC ) ri.GL_GetProcAddress( "glClientActiveTextureARB" ); + + if ( qglActiveTextureARB ) + { + qglGetIntegerv( GL_MAX_TEXTURE_UNITS_ARB, &glConfig.maxActiveTextures ); + + if ( glConfig.maxActiveTextures > 1 ) + { + Com_Printf ("...using GL_ARB_multitexture\n" ); + } + else + { + qglMultiTexCoord2fARB = NULL; + qglActiveTextureARB = NULL; + qglClientActiveTextureARB = NULL; + Com_Printf ("...not using GL_ARB_multitexture, < 2 texture units\n" ); + } + } + } + else + { + Com_Printf ("...ignoring GL_ARB_multitexture\n" ); + } + } + else + { + Com_Printf ("...GL_ARB_multitexture not found\n" ); + } + + // GL_EXT_compiled_vertex_array + qglLockArraysEXT = NULL; + qglUnlockArraysEXT = NULL; + if ( GL_CheckForExtension( "GL_EXT_compiled_vertex_array" ) ) + { + if ( r_ext_compiled_vertex_array->integer ) + { + Com_Printf ("...using GL_EXT_compiled_vertex_array\n" ); + qglLockArraysEXT = ( PFNGLLOCKARRAYSEXTPROC ) ri.GL_GetProcAddress( "glLockArraysEXT" ); + qglUnlockArraysEXT = ( PFNGLUNLOCKARRAYSEXTPROC ) ri.GL_GetProcAddress( "glUnlockArraysEXT" ); + if (!qglLockArraysEXT || !qglUnlockArraysEXT) { + Com_Error (ERR_FATAL, "bad getprocaddress"); + } + } + else + { + Com_Printf ("...ignoring GL_EXT_compiled_vertex_array\n" ); + } + } + else + { + Com_Printf ("...GL_EXT_compiled_vertex_array not found\n" ); + } + + bool bNVRegisterCombiners = false; + // Register Combiners. + if ( GL_CheckForExtension( "GL_NV_register_combiners" ) ) + { + // NOTE: This extension requires multitexture support (over 2 units). + if ( glConfig.maxActiveTextures >= 2 ) + { + bNVRegisterCombiners = true; + // Register Combiners function pointer address load. - AReis + // NOTE: VV guys will _definetly_ not be able to use regcoms. Pixel Shaders are just as good though :-) + // NOTE: Also, this is an nVidia specific extension (of course), so fragment shaders would serve the same purpose + // if we needed some kind of fragment/pixel manipulation support. + qglCombinerParameterfvNV = (PFNGLCOMBINERPARAMETERFVNVPROC)ri.GL_GetProcAddress( "glCombinerParameterfvNV" ); + qglCombinerParameterivNV = (PFNGLCOMBINERPARAMETERIVNVPROC)ri.GL_GetProcAddress( "glCombinerParameterivNV" ); + qglCombinerParameterfNV = (PFNGLCOMBINERPARAMETERFNVPROC)ri.GL_GetProcAddress( "glCombinerParameterfNV" ); + qglCombinerParameteriNV = (PFNGLCOMBINERPARAMETERINVPROC)ri.GL_GetProcAddress( "glCombinerParameteriNV" ); + qglCombinerInputNV = (PFNGLCOMBINERINPUTNVPROC)ri.GL_GetProcAddress( "glCombinerInputNV" ); + qglCombinerOutputNV = (PFNGLCOMBINEROUTPUTNVPROC)ri.GL_GetProcAddress( "glCombinerOutputNV" ); + qglFinalCombinerInputNV = (PFNGLFINALCOMBINERINPUTNVPROC)ri.GL_GetProcAddress( "glFinalCombinerInputNV" ); + qglGetCombinerInputParameterfvNV = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)ri.GL_GetProcAddress( "glGetCombinerInputParameterfvNV" ); + qglGetCombinerInputParameterivNV = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)ri.GL_GetProcAddress( "glGetCombinerInputParameterivNV" ); + qglGetCombinerOutputParameterfvNV = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)ri.GL_GetProcAddress( "glGetCombinerOutputParameterfvNV" ); + qglGetCombinerOutputParameterivNV = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)ri.GL_GetProcAddress( "glGetCombinerOutputParameterivNV" ); + qglGetFinalCombinerInputParameterfvNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)ri.GL_GetProcAddress( "glGetFinalCombinerInputParameterfvNV" ); + qglGetFinalCombinerInputParameterivNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)ri.GL_GetProcAddress( "glGetFinalCombinerInputParameterivNV" ); + + // Validate the functions we need. + if ( !qglCombinerParameterfvNV || !qglCombinerParameterivNV || !qglCombinerParameterfNV || !qglCombinerParameteriNV || !qglCombinerInputNV || + !qglCombinerOutputNV || !qglFinalCombinerInputNV || !qglGetCombinerInputParameterfvNV || !qglGetCombinerInputParameterivNV || + !qglGetCombinerOutputParameterfvNV || !qglGetCombinerOutputParameterivNV || !qglGetFinalCombinerInputParameterfvNV || !qglGetFinalCombinerInputParameterivNV ) + { + bNVRegisterCombiners = false; + qglCombinerParameterfvNV = NULL; + qglCombinerParameteriNV = NULL; + Com_Printf ("...GL_NV_register_combiners failed\n" ); + } + } + else + { + bNVRegisterCombiners = false; + Com_Printf ("...ignoring GL_NV_register_combiners\n" ); + } + } + else + { + bNVRegisterCombiners = false; + Com_Printf ("...GL_NV_register_combiners not found\n" ); + } + + // NOTE: Vertex and Fragment Programs are very dependant on each other - this is actually a + // good thing! So, just check to see which we support (one or the other) and load the shared + // function pointers. ARB rocks! + + // Vertex Programs. + bool bARBVertexProgram = false; + if ( GL_CheckForExtension( "GL_ARB_vertex_program" ) ) + { + bARBVertexProgram = true; + } + else + { + bARBVertexProgram = false; + Com_Printf ("...GL_ARB_vertex_program not found\n" ); } - GL_State(GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO); - const int width = 640; - const int height = 480; - const float x1 = 320 - width / 2; - const float x2 = 320 + width / 2; - const float y1 = 240 - height / 2; - const float y2 = 240 + height / 2; + // Fragment Programs. + bool bARBFragmentProgram = false; + if ( GL_CheckForExtension( "GL_ARB_fragment_program" ) ) + { + bARBFragmentProgram = true; + } + else + { + bARBFragmentProgram = false; + Com_Printf ("...GL_ARB_fragment_program not found\n" ); + } + + // If we support one or the other, load the shared function pointers. + if ( bARBVertexProgram || bARBFragmentProgram ) + { + qglProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) ri.GL_GetProcAddress("glProgramStringARB"); + qglBindProgramARB = (PFNGLBINDPROGRAMARBPROC) ri.GL_GetProcAddress("glBindProgramARB"); + qglDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) ri.GL_GetProcAddress("glDeleteProgramsARB"); + qglGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) ri.GL_GetProcAddress("glGenProgramsARB"); + qglProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC) ri.GL_GetProcAddress("glProgramEnvParameter4dARB"); + qglProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC) ri.GL_GetProcAddress("glProgramEnvParameter4dvARB"); + qglProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC) ri.GL_GetProcAddress("glProgramEnvParameter4fARB"); + qglProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC) ri.GL_GetProcAddress("glProgramEnvParameter4fvARB"); + qglProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) ri.GL_GetProcAddress("glProgramLocalParameter4dARB"); + qglProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) ri.GL_GetProcAddress("glProgramLocalParameter4dvARB"); + qglProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC) ri.GL_GetProcAddress("glProgramLocalParameter4fARB"); + qglProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) ri.GL_GetProcAddress("glProgramLocalParameter4fvARB"); + qglGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC) ri.GL_GetProcAddress("glGetProgramEnvParameterdvARB"); + qglGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC) ri.GL_GetProcAddress("glGetProgramEnvParameterfvARB"); + qglGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) ri.GL_GetProcAddress("glGetProgramLocalParameterdvARB"); + qglGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) ri.GL_GetProcAddress("glGetProgramLocalParameterfvARB"); + qglGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) ri.GL_GetProcAddress("glGetProgramivARB"); + qglGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC) ri.GL_GetProcAddress("glGetProgramStringARB"); + qglIsProgramARB = (PFNGLISPROGRAMARBPROC) ri.GL_GetProcAddress("glIsProgramARB"); + + // Validate the functions we need. + if ( !qglProgramStringARB || !qglBindProgramARB || !qglDeleteProgramsARB || !qglGenProgramsARB || + !qglProgramEnvParameter4dARB || !qglProgramEnvParameter4dvARB || !qglProgramEnvParameter4fARB || + !qglProgramEnvParameter4fvARB || !qglProgramLocalParameter4dARB || !qglProgramLocalParameter4dvARB || + !qglProgramLocalParameter4fARB || !qglProgramLocalParameter4fvARB || !qglGetProgramEnvParameterdvARB || + !qglGetProgramEnvParameterfvARB || !qglGetProgramLocalParameterdvARB || !qglGetProgramLocalParameterfvARB || + !qglGetProgramivARB || !qglGetProgramStringARB || !qglIsProgramARB ) + { + bARBVertexProgram = false; + bARBFragmentProgram = false; + qglGenProgramsARB = NULL; //clear ptrs that get checked + qglProgramEnvParameter4fARB = NULL; + Com_Printf ("...ignoring GL_ARB_vertex_program\n" ); + Com_Printf ("...ignoring GL_ARB_fragment_program\n" ); + } + } + + // Figure out which texture rectangle extension to use. + bool bTexRectSupported = false; + if ( Q_stricmpn( glConfig.vendor_string, "ATI Technologies",16 )==0 + && Q_stricmpn( glConfig.version_string, "1.3.3",5 )==0 + && glConfig.version_string[5] < '9' ) //1.3.34 and 1.3.37 and 1.3.38 are broken for sure, 1.3.39 is not + { + g_bTextureRectangleHack = true; + } + if ( GL_CheckForExtension( "GL_NV_texture_rectangle" ) || GL_CheckForExtension( "GL_EXT_texture_rectangle" ) ) + { + bTexRectSupported = true; + } - qglBegin (GL_TRIANGLE_STRIP); - qglTexCoord2f( 0, 0 ); - qglVertex2f(x1, y1); - qglTexCoord2f( 1 , 0 ); - qglVertex2f(x2, y1); - qglTexCoord2f( 0, 1 ); - qglVertex2f(x1, y2); - qglTexCoord2f( 1, 1 ); - qglVertex2f(x2, y2); - qglEnd(); + // Find out how many general combiners they have. + #define GL_MAX_GENERAL_COMBINERS_NV 0x854D + GLint iNumGeneralCombiners = 0; + if(bNVRegisterCombiners) + qglGetIntegerv( GL_MAX_GENERAL_COMBINERS_NV, &iNumGeneralCombiners ); - GLimp_EndFrame(); + // Only allow dynamic glows/flares if they have the hardware + if ( bTexRectSupported && bARBVertexProgram && qglActiveTextureARB && glConfig.maxActiveTextures >= 4 && + ( ( bNVRegisterCombiners && iNumGeneralCombiners >= 2 ) || bARBFragmentProgram ) ) + { + g_bDynamicGlowSupported = true; + // this would overwrite any achived setting gwg + // ri.Cvar_Set( "r_DynamicGlow", "1" ); + } + else + { + g_bDynamicGlowSupported = false; + ri.Cvar_Set( "r_DynamicGlow","0" ); + } } /* @@ -331,15 +703,30 @@ static void InitOpenGL( void ) // if ( glConfig.vidWidth == 0 ) - { - GLimp_Init(); - // print info the first time only + { + windowDesc_t windowDesc = { GRAPHICS_API_OPENGL }; + memset(&glConfig, 0, sizeof(glConfig)); + + window = ri.WIN_Init(&windowDesc, &glConfig); + + // get our config strings + glConfig.vendor_string = (const char *)qglGetString (GL_VENDOR); + glConfig.renderer_string = (const char *)qglGetString (GL_RENDERER); + glConfig.version_string = (const char *)qglGetString (GL_VERSION); + glConfig.extensions_string = (const char *)qglGetString (GL_EXTENSIONS); + + // OpenGL driver constants + qglGetIntegerv( GL_MAX_TEXTURE_SIZE, &glConfig.maxTextureSize ); + + // stubbed or broken drivers may have reported 0... + glConfig.maxTextureSize = Q_max(0, glConfig.maxTextureSize); + + // initialize extensions + GLimp_InitExtensions( ); + // set default state GL_SetDefaultState(); -#ifndef JK2_MODE R_Splash(); //get something on screen asap -#endif - GfxInfo_f(); } else { @@ -391,72 +778,6 @@ void GL_CheckErrors( void ) { Com_Error( ERR_FATAL, "GL_CheckErrors: %s", s ); } -/* -** R_GetModeInfo -*/ -typedef struct vidmode_s -{ - const char *description; - int width, height; -} vidmode_t; - -const vidmode_t r_vidModes[] = -{ - { "Mode 0: 320x240", 320, 240 }, - { "Mode 1: 400x300", 400, 300 }, - { "Mode 2: 512x384", 512, 384 }, - { "Mode 3: 640x480", 640, 480 }, - { "Mode 4: 800x600", 800, 600 }, - { "Mode 5: 960x720", 960, 720 }, - { "Mode 6: 1024x768", 1024, 768 }, - { "Mode 7: 1152x864", 1152, 864 }, - { "Mode 8: 1280x1024", 1280, 1024 }, - { "Mode 9: 1600x1200", 1600, 1200 }, - { "Mode 10: 2048x1536", 2048, 1536 }, - { "Mode 11: 856x480 (wide)", 856, 480 }, - { "Mode 12: 2400x600(surround)",2400,600 } -}; -static const int s_numVidModes = ( sizeof( r_vidModes ) / sizeof( r_vidModes[0] ) ); - -qboolean R_GetModeInfo( int *width, int *height, int mode ) { - const vidmode_t *vm; - - if ( mode < -1 ) { - return qfalse; - } - if ( mode >= s_numVidModes ) { - return qfalse; - } - - if ( mode == -1 ) { - *width = r_customwidth->integer; - *height = r_customheight->integer; - return qtrue; - } - - vm = &r_vidModes[mode]; - - *width = vm->width; - *height = vm->height; - - return qtrue; -} - -/* -** R_ModeList_f -*/ -static void R_ModeList_f( void ) -{ - int i; - - ri.Printf( PRINT_ALL, "\n" ); - for ( i = 0; i < s_numVidModes; i++ ) - { - ri.Printf( PRINT_ALL, "%s\n", r_vidModes[i].description ); - } - ri.Printf( PRINT_ALL, "\n" ); -} - /* ============================================================================== @@ -507,9 +828,9 @@ byte *RB_ReadPixels(int x, int y, int width, int height, size_t *offset, int *pa } /* -================== +================== R_TakeScreenshot -================== +================== */ void R_TakeScreenshot( int x, int y, int width, int height, char *fileName ) { byte *allbuf, *buffer; @@ -566,11 +887,11 @@ void R_TakeScreenshot( int x, int y, int width, int height, char *fileName ) { ri.Z_Free(allbuf); } -/* -================== +/* +================== R_TakeScreenshotPNG -================== -*/ +================== +*/ void R_TakeScreenshotPNG( int x, int y, int width, int height, char *fileName ) { byte *buffer=NULL; size_t offset=0; @@ -581,11 +902,11 @@ void R_TakeScreenshotPNG( int x, int y, int width, int height, char *fileName ) ri.Z_Free( buffer ); } -/* -================== +/* +================== R_TakeScreenshotJPEG -================== -*/ +================== +*/ void R_TakeScreenshotJPEG( int x, int y, int width, int height, char *fileName ) { byte *buffer; size_t offset = 0, memcount; @@ -602,11 +923,11 @@ void R_TakeScreenshotJPEG( int x, int y, int width, int height, char *fileName ) ri.Z_Free(buffer); } -/* -================== +/* +================== R_ScreenshotFilename -================== -*/ +================== +*/ void R_ScreenshotFilename( char *buf, int bufSize, const char *ext ) { time_t rawtime; char timeStr[32] = {0}; // should really only reach ~19 chars @@ -686,8 +1007,8 @@ static void R_LevelShot( void ) { Com_Printf ("Wrote %s\n", checkname ); } -/* -================== +/* +================== R_ScreenShotTGA_f screenshot @@ -696,7 +1017,7 @@ screenshot [levelshot] screenshot [filename] Doesn't print the pacifier message if there is a second arg -================== +================== */ void R_ScreenShotTGA_f (void) { char checkname[MAX_OSPATH] = {0}; @@ -719,7 +1040,7 @@ void R_ScreenShotTGA_f (void) { R_ScreenshotFilename( checkname, sizeof( checkname ), ".tga" ); if ( ri.FS_FileExists( checkname ) ) { - Com_Printf( "ScreenShot: Couldn't create a file\n"); + Com_Printf( "ScreenShot: Couldn't create a file\n"); return; } } @@ -730,8 +1051,8 @@ void R_ScreenShotTGA_f (void) { Com_Printf( "Wrote %s\n", checkname ); } -/* -================== +/* +================== R_ScreenShotPNG_f screenshot @@ -740,7 +1061,7 @@ screenshot [levelshot] screenshot [filename] Doesn't print the pacifier message if there is a second arg -================== +================== */ void R_ScreenShotPNG_f (void) { char checkname[MAX_OSPATH] = {0}; @@ -763,7 +1084,7 @@ void R_ScreenShotPNG_f (void) { R_ScreenshotFilename( checkname, sizeof( checkname ), ".png" ); if ( ri.FS_FileExists( checkname ) ) { - Com_Printf( "ScreenShot: Couldn't create a file\n"); + Com_Printf( "ScreenShot: Couldn't create a file\n"); return; } } @@ -772,7 +1093,7 @@ void R_ScreenShotPNG_f (void) { if ( !silent ) Com_Printf( "Wrote %s\n", checkname ); -} +} void R_ScreenShot_f (void) { char checkname[MAX_OSPATH] = {0}; @@ -857,7 +1178,7 @@ void GL_SetDefaultState( void ) /* ================ -R_LongString +R_PrintLongString Workaround for ri.Printf's 1024 characters buffer limit. ================ @@ -885,7 +1206,7 @@ GfxInfo_f */ extern bool g_bTextureRectangleHack; -void GfxInfo_f( void ) +void GfxInfo_f( void ) { const char *enablestrings[] = { @@ -903,13 +1224,16 @@ void GfxInfo_f( void ) "noborder " }; - const char *tc_table[] = + const char *tc_table[] = { "None", "GL_S3_s3tc", "GL_EXT_texture_compression_s3tc", }; + int fullscreen = ri.Cvar_VariableIntegerValue("r_fullscreen"); + int noborder = ri.Cvar_VariableIntegerValue("r_noborder"); + ri.Printf( PRINT_ALL, "\nGL_VENDOR: %s\n", glConfig.vendor_string ); ri.Printf( PRINT_ALL, "GL_RENDERER: %s\n", glConfig.renderer_string ); ri.Printf( PRINT_ALL, "GL_VERSION: %s\n", glConfig.version_string ); @@ -918,7 +1242,11 @@ void GfxInfo_f( void ) ri.Printf( PRINT_ALL, "GL_MAX_TEXTURE_SIZE: %d\n", glConfig.maxTextureSize ); ri.Printf( PRINT_ALL, "GL_MAX_ACTIVE_TEXTURES_ARB: %d\n", glConfig.maxActiveTextures ); ri.Printf( PRINT_ALL, "\nPIXELFORMAT: color(%d-bits) Z(%d-bit) stencil(%d-bits)\n", glConfig.colorBits, glConfig.depthBits, glConfig.stencilBits ); - ri.Printf( PRINT_ALL, "MODE: %d, %d x %d %s%s hz:", r_mode->integer, glConfig.vidWidth, glConfig.vidHeight, r_fullscreen->integer == 0 ? noborderstrings[r_noborder->integer == 1] : noborderstrings[0] ,fsstrings[r_fullscreen->integer == 1] ); + ri.Printf( PRINT_ALL, "MODE: %d, %d x %d %s%s hz:", + ri.Cvar_VariableIntegerValue("r_mode"), + glConfig.vidWidth, glConfig.vidHeight, + fullscreen == 0 ? noborderstrings[noborder == 1] : noborderstrings[0], + fsstrings[fullscreen == 1] ); if ( glConfig.displayFrequency ) { ri.Printf( PRINT_ALL, "%d\n", glConfig.displayFrequency ); @@ -990,8 +1318,10 @@ void GfxInfo_f( void ) if ( r_finish->integer ) { ri.Printf( PRINT_ALL, "Forcing glFinish\n" ); } - if ( r_displayRefresh ->integer ) { - ri.Printf( PRINT_ALL, "Display refresh set to %d\n", r_displayRefresh->integer ); + + int displayRefresh = ri.Cvar_VariableIntegerValue("r_displayRefresh"); + if ( displayRefresh ) { + ri.Printf( PRINT_ALL, "Display refresh set to %d\n", displayRefresh); } if (tr.world) { @@ -1057,7 +1387,7 @@ void R_FogDistance_f(void) } distance = atof(ri.Cmd_Argv(1)); - if (distance < 1.0) + if (distance < 1.0) { distance = 1.0; } @@ -1112,11 +1442,39 @@ void R_FogColor_f(void) tr.world->fogs[tr.world->globalFog].parms.color[0] = atof(ri.Cmd_Argv(1)); tr.world->fogs[tr.world->globalFog].parms.color[1] = atof(ri.Cmd_Argv(2)); tr.world->fogs[tr.world->globalFog].parms.color[2] = atof(ri.Cmd_Argv(3)); - tr.world->fogs[tr.world->globalFog].colorInt = ColorBytes4 ( atof(ri.Cmd_Argv(1)) * tr.identityLight, - atof(ri.Cmd_Argv(2)) * tr.identityLight, + tr.world->fogs[tr.world->globalFog].colorInt = ColorBytes4 ( atof(ri.Cmd_Argv(1)) * tr.identityLight, + atof(ri.Cmd_Argv(2)) * tr.identityLight, atof(ri.Cmd_Argv(3)) * tr.identityLight, 1.0 ); } +typedef struct consoleCommand_s { + const char *cmd; + xcommand_t func; +} consoleCommand_t; + +void R_ReloadFonts_f( void ); + +static consoleCommand_t commands[] = { + { "imagelist", R_ImageList_f }, + { "shaderlist", R_ShaderList_f }, + { "skinlist", R_SkinList_f }, + { "fontlist", R_FontList_f }, + { "screenshot", R_ScreenShot_f }, + { "screenshot_png", R_ScreenShotPNG_f }, + { "screenshot_tga", R_ScreenShotTGA_f }, + { "gfxinfo", GfxInfo_f }, + { "r_atihack", R_AtiHackToggle_f }, + { "r_we", R_WorldEffect_f }, + { "imagecacheinfo", RE_RegisterImages_Info_f }, + { "modellist", R_Modellist_f }, + { "modelcacheinfo", RE_RegisterModels_Info_f }, + { "r_fogDistance", R_FogDistance_f }, + { "r_fogColor", R_FogColor_f }, + { "r_reloadfonts", R_ReloadFonts_f }, +}; + +static const size_t numCommands = ARRAY_LEN( commands ); + #ifdef _DEBUG #define MIN_PRIMITIVES -1 #else @@ -1124,18 +1482,12 @@ void R_FogColor_f(void) #endif #define MAX_PRIMITIVES 3 -#ifdef _WIN32 -#define SWAPINTERVAL_FLAGS CVAR_ARCHIVE -#else -#define SWAPINTERVAL_FLAGS CVAR_ARCHIVE | CVAR_LATCH -#endif - /* =============== R_Register =============== */ -void R_Register( void ) +void R_Register( void ) { // // latched and archived variables @@ -1150,7 +1502,7 @@ void R_Register( void ) r_ext_compiled_vertex_array = ri.Cvar_Get( "r_ext_compiled_vertex_array", "1", CVAR_ARCHIVE | CVAR_LATCH); r_ext_texture_env_add = ri.Cvar_Get( "r_ext_texture_env_add", "1", CVAR_ARCHIVE | CVAR_LATCH); r_ext_texture_filter_anisotropic = ri.Cvar_Get( "r_ext_texture_filter_anisotropic", "16", CVAR_ARCHIVE ); - + r_DynamicGlow = ri.Cvar_Get( "r_DynamicGlow", "0", CVAR_ARCHIVE ); r_DynamicGlowPasses = ri.Cvar_Get( "r_DynamicGlowPasses", "5", CVAR_ARCHIVE ); r_DynamicGlowDelta = ri.Cvar_Get( "r_DynamicGlowDelta", "0.8f", CVAR_ARCHIVE ); @@ -1165,30 +1517,17 @@ void R_Register( void ) r_detailTextures = ri.Cvar_Get( "r_detailtextures", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_texturebits = ri.Cvar_Get( "r_texturebits", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_texturebitslm = ri.Cvar_Get( "r_texturebitslm", "0", CVAR_ARCHIVE | CVAR_LATCH ); - r_colorbits = ri.Cvar_Get( "r_colorbits", "0", CVAR_ARCHIVE | CVAR_LATCH ); - r_stereo = ri.Cvar_Get( "r_stereo", "0", CVAR_ARCHIVE | CVAR_LATCH ); - r_stencilbits = ri.Cvar_Get( "r_stencilbits", "8", CVAR_ARCHIVE | CVAR_LATCH ); - r_depthbits = ri.Cvar_Get( "r_depthbits", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_overBrightBits = ri.Cvar_Get ("r_overBrightBits", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_mapOverBrightBits = ri.Cvar_Get( "r_mapOverBrightBits", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_ignorehwgamma = ri.Cvar_Get( "r_ignorehwgamma", "0", CVAR_ARCHIVE | CVAR_LATCH); - r_mode = ri.Cvar_Get( "r_mode", "4", CVAR_ARCHIVE | CVAR_LATCH ); - r_fullscreen = ri.Cvar_Get( "r_fullscreen", "0", CVAR_ARCHIVE | CVAR_LATCH ); - r_customwidth = ri.Cvar_Get( "r_customwidth", "1600", CVAR_ARCHIVE | CVAR_LATCH ); - r_customheight = ri.Cvar_Get( "r_customheight", "1024", CVAR_ARCHIVE | CVAR_LATCH ); - r_noborder = ri.Cvar_Get( "r_noborder", "0", CVAR_ARCHIVE | CVAR_LATCH ); - r_centerWindow = ri.Cvar_Get( "r_centerWindow", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_simpleMipMaps = ri.Cvar_Get( "r_simpleMipMaps", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_vertexLight = ri.Cvar_Get( "r_vertexLight", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_subdivisions = ri.Cvar_Get ("r_subdivisions", "4", CVAR_ARCHIVE | CVAR_LATCH); ri.Cvar_CheckRange( r_subdivisions, 4, 80, qfalse ); r_intensity = ri.Cvar_Get ("r_intensity", "1", CVAR_LATCH|CVAR_ARCHIVE ); - + // // temporary latched variables that can only change over a restart // - r_displayRefresh = ri.Cvar_Get( "r_displayRefresh", "0", CVAR_LATCH ); - ri.Cvar_CheckRange( r_displayRefresh, 0, 240, qtrue ); r_fullbright = ri.Cvar_Get ("r_fullbright", "0", CVAR_LATCH ); r_singleShader = ri.Cvar_Get ("r_singleShader", "0", CVAR_CHEAT | CVAR_LATCH ); @@ -1197,7 +1536,7 @@ void R_Register( void ) // r_lodCurveError = ri.Cvar_Get( "r_lodCurveError", "250", CVAR_ARCHIVE ); r_lodbias = ri.Cvar_Get( "r_lodbias", "0", CVAR_ARCHIVE ); - r_flares = ri.Cvar_Get ("r_flares", "0", CVAR_ARCHIVE ); + r_flares = ri.Cvar_Get ("r_flares", "1", CVAR_ARCHIVE ); r_lodscale = ri.Cvar_Get( "r_lodscale", "10", CVAR_ARCHIVE ); r_znear = ri.Cvar_Get( "r_znear", "4", CVAR_ARCHIVE ); //if set any lower, you lose a lot of precision in the distance @@ -1206,10 +1545,10 @@ void R_Register( void ) r_fastsky = ri.Cvar_Get( "r_fastsky", "0", CVAR_ARCHIVE ); r_drawSun = ri.Cvar_Get( "r_drawSun", "0", CVAR_ARCHIVE ); r_dynamiclight = ri.Cvar_Get( "r_dynamiclight", "1", CVAR_ARCHIVE ); - r_dlightBacks = ri.Cvar_Get( "r_dlightBacks", "0", CVAR_ARCHIVE ); + // rjr - removed for hacking +// r_dlightBacks = ri.Cvar_Get( "r_dlightBacks", "0", CVAR_ARCHIVE ); r_finish = ri.Cvar_Get ("r_finish", "0", CVAR_ARCHIVE); r_textureMode = ri.Cvar_Get( "r_textureMode", "GL_LINEAR_MIPMAP_LINEAR", CVAR_ARCHIVE ); - r_swapInterval = ri.Cvar_Get( "r_swapInterval", "0", SWAPINTERVAL_FLAGS ); r_gamma = ri.Cvar_Get( "r_gamma", "1", CVAR_ARCHIVE ); r_facePlaneCull = ri.Cvar_Get ("r_facePlaneCull", "1", CVAR_ARCHIVE ); @@ -1325,30 +1664,8 @@ Ghoul2 Insert End ri.Cvar_CheckRange( r_screenshotJpegQuality, 10, 100, qtrue ); - // make sure all the commands added here are also - // removed in R_Shutdown - ri.Cmd_AddCommand( "imagelist", R_ImageList_f ); - ri.Cmd_AddCommand( "shaderlist", R_ShaderList_f ); - ri.Cmd_AddCommand( "skinlist", R_SkinList_f ); - ri.Cmd_AddCommand( "fontlist", R_FontList_f ); - ri.Cmd_AddCommand( "modellist", R_Modellist_f ); - ri.Cmd_AddCommand( "modelist", R_ModeList_f ); - ri.Cmd_AddCommand( "r_atihack", R_AtiHackToggle_f ); - ri.Cmd_AddCommand( "screenshot", R_ScreenShot_f ); - ri.Cmd_AddCommand( "screenshot_png", R_ScreenShotPNG_f ); - ri.Cmd_AddCommand( "screenshot_tga", R_ScreenShotTGA_f ); - ri.Cmd_AddCommand( "gfxinfo", GfxInfo_f ); - ri.Cmd_AddCommand( "r_fogDistance", R_FogDistance_f); - ri.Cmd_AddCommand( "r_fogColor", R_FogColor_f); - ri.Cmd_AddCommand( "modelcacheinfo", RE_RegisterModels_Info_f); - ri.Cmd_AddCommand( "imagecacheinfo", RE_RegisterImages_Info_f); -extern void R_WorldEffect_f(void); //TR_WORLDEFFECTS.CPP - ri.Cmd_AddCommand( "r_we", R_WorldEffect_f ); -extern void R_ReloadFonts_f(void); - ri.Cmd_AddCommand( "r_reloadfonts", R_ReloadFonts_f ); - ri.Cmd_AddCommand( "minimize", GLimp_Minimize ); - // make sure all the commands added above are also - // removed in R_Shutdown + for ( size_t i = 0; i < numCommands; i++ ) + ri.Cmd_AddCommand( commands[i].cmd, commands[i].func ); } // need to do this hackery so ghoul2 doesn't crash the game because of ITS hackery... @@ -1364,7 +1681,7 @@ R_Init =============== */ extern void R_InitWorldEffects(); -void R_Init( void ) { +void R_Init( void ) { int err; int i; @@ -1377,12 +1694,6 @@ void R_Init( void ) { memset( &backEnd, 0, sizeof( backEnd ) ); memset( &tess, 0, sizeof( tess ) ); -#ifdef _WIN32 - tr.wv = ri.GetWinVars(); -#endif - -// Swap_Init(); - #ifndef FINAL_BUILD if ( (intptr_t)tess.xyz & 15 ) { Com_Printf( "WARNING: tess.xyz not 16 byte aligned\n" ); @@ -1397,7 +1708,7 @@ void R_Init( void ) { tr.sinTable[i] = sin( DEG2RAD( i * 360.0f / ( ( float ) ( FUNCTABLE_SIZE - 1 ) ) ) ); tr.squareTable[i] = ( i < FUNCTABLE_SIZE/2 ) ? 1.0f : -1.0f; tr.sawToothTable[i] = (float)i / FUNCTABLE_SIZE; - tr.inverseSawToothTable[i] = 1.0 - tr.sawToothTable[i]; + tr.inverseSawToothTable[i] = 1.0f - tr.sawToothTable[i]; if ( i < FUNCTABLE_SIZE / 2 ) { @@ -1415,7 +1726,6 @@ void R_Init( void ) { tr.triangleTable[i] = -tr.triangleTable[i-FUNCTABLE_SIZE/2]; } } - R_InitFogTable(); R_ImageLoader_Init(); @@ -1425,12 +1735,11 @@ void R_Init( void ) { backEndData = (backEndData_t *) Hunk_Alloc( sizeof( backEndData_t ), qtrue ); R_InitNextFrame(); - const color4ub_t color = {0xff, 0xff, 0xff, 0xff}; - for(i=0;ii ); } - InitOpenGL(); R_InitImages(); @@ -1445,6 +1754,8 @@ void R_Init( void ) { ri.Printf (PRINT_ALL, "glGetError() = 0x%x\n", err); RestoreGhoul2InfoArray(); + // print info + GfxInfo_f(); //ri.Printf( PRINT_ALL, "----- finished R_Init -----\n" ); } @@ -1455,71 +1766,49 @@ RE_Shutdown =============== */ extern void R_ShutdownWorldEffects(void); -void RE_Shutdown( qboolean destroyWindow, qboolean restarting ) { - - // Need this temporarily. -#ifdef _WIN32 - tr.wv = ri.GetWinVars(); -#endif +void RE_Shutdown( qboolean destroyWindow, qboolean restarting ) { + for ( size_t i = 0; i < numCommands; i++ ) + ri.Cmd_RemoveCommand( commands[i].cmd ); - ri.Cmd_RemoveCommand ("imagelist"); - ri.Cmd_RemoveCommand ("shaderlist"); - ri.Cmd_RemoveCommand ("skinlist"); - ri.Cmd_RemoveCommand ("fontlist"); - ri.Cmd_RemoveCommand ("modellist"); - ri.Cmd_RemoveCommand ("modelist" ); - ri.Cmd_RemoveCommand ("r_atihack"); - ri.Cmd_RemoveCommand ("screenshot"); - ri.Cmd_RemoveCommand ("screenshot_png"); - ri.Cmd_RemoveCommand ("screenshot_tga"); - ri.Cmd_RemoveCommand ("gfxinfo"); - ri.Cmd_RemoveCommand ("r_fogDistance"); - ri.Cmd_RemoveCommand ("r_fogColor"); - ri.Cmd_RemoveCommand ("modelcacheinfo"); - ri.Cmd_RemoveCommand ("imagecacheinfo"); - ri.Cmd_RemoveCommand ("r_we"); - ri.Cmd_RemoveCommand ("r_reloadfonts"); - ri.Cmd_RemoveCommand ("minimize"); - - R_ShutdownWorldEffects(); - R_ShutdownFonts(); + if ( r_DynamicGlow && r_DynamicGlow->integer ) + { + // Release the Glow Vertex Shader. + if ( tr.glowVShader ) + { + qglDeleteProgramsARB( 1, &tr.glowVShader ); + } - if ( tr.registered ) { - if ( r_DynamicGlow && r_DynamicGlow->integer ) + // Release Pixel Shader. + if ( tr.glowPShader ) { - // Release the Glow Vertex Shader. - if ( tr.glowVShader ) + if ( qglCombinerParameteriNV ) { - qglDeleteProgramsARB( 1, &tr.glowVShader ); + // Release the Glow Regcom call list. + qglDeleteLists( tr.glowPShader, 1 ); } - - // Release Pixel Shader. - if ( tr.glowPShader ) + else if ( qglGenProgramsARB ) { - if ( qglCombinerParameteriNV ) - { - // Release the Glow Regcom call list. - qglDeleteLists( tr.glowPShader, 1 ); - } - else if ( qglGenProgramsARB ) - { - // Release the Glow Fragment Shader. - qglDeleteProgramsARB( 1, &tr.glowPShader ); - } + // Release the Glow Fragment Shader. + qglDeleteProgramsARB( 1, &tr.glowPShader ); } + } - // Release the scene glow texture. - qglDeleteTextures( 1, &tr.screenGlow ); + // Release the scene glow texture. + qglDeleteTextures( 1, &tr.screenGlow ); - // Release the scene texture. - qglDeleteTextures( 1, &tr.sceneImage ); + // Release the scene texture. + qglDeleteTextures( 1, &tr.sceneImage ); - // Release the blur texture. - qglDeleteTextures( 1, &tr.blurImage ); - } -// R_SyncRenderThread(); - R_ShutdownCommandBuffers(); - if (destroyWindow) + // Release the blur texture. + qglDeleteTextures( 1, &tr.blurImage ); + } + + R_ShutdownWorldEffects(); + R_ShutdownFonts(); + if ( tr.registered ) + { + R_IssuePendingRenderCommands(); + if ( destroyWindow ) { R_DeleteTextures(); // only do this for vid_restart now, not during things like map load @@ -1532,7 +1821,7 @@ void RE_Shutdown( qboolean destroyWindow, qboolean restarting ) { // shut down platform specific OpenGL stuff if ( destroyWindow ) { - GLimp_Shutdown(); + ri.WIN_Shutdown(); } tr.registered = qfalse; } @@ -1545,7 +1834,7 @@ Touch all images to make sure they are resident ============= */ void RE_EndRegistration( void ) { - R_SyncRenderThread(); + R_IssuePendingRenderCommands(); } @@ -1557,7 +1846,8 @@ void RE_GetLightStyle(int style, color4ub_t color) return; } - *(int *)color = *(int *)styleColors[style]; + byteAlias_t *baDest = (byteAlias_t *)&color, *baSource = (byteAlias_t *)&styleColors[style]; + baDest->i = baSource->i; } void RE_SetLightStyle(int style, int color) @@ -1568,9 +1858,9 @@ void RE_SetLightStyle(int style, int color) return; } - if (*(int*)styleColors[style] != color) - { - *(int *)styleColors[style] = color; + byteAlias_t *ba = (byteAlias_t *)&styleColors[style]; + if ( ba->i != color) { + ba->i = color; styleUpdated[style] = true; } } @@ -1675,7 +1965,7 @@ extern "C" Q_EXPORT refexport_t* QDECL GetRefAPI ( int apiVersion, refimport_t * memset( &re, 0, sizeof( re ) ); if ( apiVersion != REF_API_VERSION ) { - ri.Printf(PRINT_ALL, "Mismatched REF_API_VERSION: expected %i, got %i\n", + ri.Printf(PRINT_ALL, "Mismatched REF_API_VERSION: expected %i, got %i\n", REF_API_VERSION, apiVersion ); return NULL; } @@ -1730,6 +2020,10 @@ extern "C" Q_EXPORT refexport_t* QDECL GetRefAPI ( int apiVersion, refimport_t * REX(InitDissolve); REX(GetScreenShot); +#ifdef JK2_MODE + REX(SaveJPGToBuffer); + re.LoadJPGFromBuffer = LoadJPGFromBuffer; +#endif REX(TempRawImage_ReadFromFile); REX(TempRawImage_CleanUp); diff --git a/code/rd-vanilla/tr_light.cpp b/code/rd-vanilla/tr_light.cpp index 9405027bb6..1b0b2774ff 100644 --- a/code/rd-vanilla/tr_light.cpp +++ b/code/rd-vanilla/tr_light.cpp @@ -1,28 +1,31 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // tr_light.c -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - #include "tr_local.h" #define DLIGHT_AT_RADIUS 16 diff --git a/code/rd-vanilla/tr_local.h b/code/rd-vanilla/tr_local.h index 42cb4e3882..59da96b91e 100644 --- a/code/rd-vanilla/tr_local.h +++ b/code/rd-vanilla/tr_local.h @@ -1,35 +1,34 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #pragma once - #include "../qcommon/q_shared.h" #include "../qcommon/qfiles.h" #include "../rd-common/tr_public.h" #include "../rd-common/mdx_format.h" -#ifdef _WIN32 #include "qgl.h" -#include "glext.h" -#else -#include "qgl.h" -#include "../sdl/sdl_qgl.h" -#endif #define GL_INDEX_TYPE GL_UNSIGNED_INT typedef unsigned int glIndex_t; @@ -1025,6 +1024,7 @@ typedef struct { vec3_t sunLight; // from the sky shader for this level vec3_t sunDirection; + int sunSurfaceLight; // from the sky shader for this level vec3_t sunAmbient; // from the sky shader (only used for John's terrain system) @@ -1063,10 +1063,6 @@ typedef struct { float rangedFog; float distanceCull; - -#ifdef _WIN32 - WinVars_t *wv; -#endif } trGlobals_t; int R_Images_StartIteration(void); @@ -1080,6 +1076,7 @@ extern backEndState_t backEnd; extern trGlobals_t tr; extern glconfig_t glConfig; // outside of TR since it shouldn't be cleared during ref re-init extern glstate_t glState; // outside of TR since it shouldn't be cleared during ref re-init +extern window_t window; // @@ -1114,7 +1111,7 @@ extern cvar_t *r_primitives; // "0" = based on compiled vertex array existance extern cvar_t *r_fastsky; // controls whether sky should be cleared or drawn extern cvar_t *r_drawSun; // controls drawing of sun quad extern cvar_t *r_dynamiclight; // dynamic lights enabled/disabled -extern cvar_t *r_dlightBacks; // dlight non-facing surfaces for continuity +// rjr - removed for hacking extern cvar_t *r_dlightBacks; // dlight non-facing surfaces for continuity extern cvar_t *r_norefresh; // bypasses the ref rendering extern cvar_t *r_drawentities; // disable/enable entity rendering @@ -1374,6 +1371,11 @@ shader_t *R_GetShaderByHandle( qhandle_t hShader ); void R_InitShaders( void ); void R_ShaderList_f( void ); +// +// tr_arb.c +// +void ARB_InitGlowShaders( void ); + /* ==================================================================== @@ -1382,17 +1384,7 @@ IMPLEMENTATION SPECIFIC FUNCTIONS ==================================================================== */ - -void GLimp_Init( void ); -void GLimp_Shutdown( void ); -void GLimp_EndFrame( void ); - -void GLimp_LogComment( const char *comment ); -void GLimp_Minimize( void ); - -void GLimp_SetGamma( unsigned char red[256], - unsigned char green[256], - unsigned char blue[256] ); +static inline void GLimp_LogComment( char *comment ) {} /* @@ -1445,7 +1437,7 @@ struct shaderCommands_s bool fading; }; -#ifdef _WIN32 +#ifdef _MSC_VER typedef __declspec(align(16)) shaderCommands_s shaderCommands_t; #else typedef shaderCommands_s shaderCommands_t; @@ -1481,20 +1473,6 @@ void R_AddBrushModelSurfaces( trRefEntity_t *e ); void R_AddWorldSurfaces( void ); -/* -============================================================ - -FLARES - -============================================================ -*/ - -void R_ClearFlares( void ); - -void RB_AddFlare( void *surface, int fogNum, vec3_t point, vec3_t color, vec3_t normal, float lightScale ); -void RB_AddDlightFlares( void ); -void RB_RenderFlares (void); - /* ============================================================ @@ -1596,9 +1574,6 @@ ANIMATED MODELS /* Ghoul2 Insert Start */ -#ifdef _MSC_VER -#pragma warning (disable: 4512) //default assignment operator could not be gened -#endif class CBoneCache; class CRenderableSurface @@ -1827,10 +1802,7 @@ extern backEndData_t *backEndData; void *R_GetCommandBuffer( int bytes ); void RB_ExecuteRenderCommands( const void *data ); -void R_InitCommandBuffers( void ); -void R_ShutdownCommandBuffers( void ); - -void R_SyncRenderThread( void ); +void R_IssuePendingRenderCommands( void ); void R_AddDrawSurfCmd( drawSurf_t *drawSurfs, int numDrawSurfs ); diff --git a/code/rd-vanilla/tr_main.cpp b/code/rd-vanilla/tr_main.cpp index de1c6220bc..da619736ae 100644 --- a/code/rd-vanilla/tr_main.cpp +++ b/code/rd-vanilla/tr_main.cpp @@ -1,28 +1,31 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // tr_main.c -- main control flow for each frame -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - #include "tr_local.h" #if !defined(G2_H_INC) @@ -138,7 +141,7 @@ int R_CullPointAndRadius( const vec3_t pt, float radius ) // check against frustum planes #ifdef JK2_MODE // They used 4 frustrum planes in JK2, and 5 in JKA --eez - for (i = 0 ; i < 4 ; i++) + for (i = 0 ; i < 4 ; i++) { frust = &tr.viewParms.frustum[i]; @@ -147,13 +150,13 @@ int R_CullPointAndRadius( const vec3_t pt, float radius ) { return CULL_OUT; } - else if ( dist <= radius ) + else if ( dist <= radius ) { mightBeClipped = qtrue; } } #else - for (i = 0 ; i < 5 ; i++) + for (i = 0 ; i < 5 ; i++) { frust = &tr.viewParms.frustum[i]; @@ -162,7 +165,7 @@ int R_CullPointAndRadius( const vec3_t pt, float radius ) { return CULL_OUT; } - else if ( dist <= radius ) + else if ( dist <= radius ) { mightBeClipped = qtrue; } @@ -228,11 +231,11 @@ void R_InvertMatrix(float *sourcemat, float *destmat) /* ================= -R_WorldNormalToEntity +R_WorldNormalToEntity ================= */ -void R_WorldNormalToEntity (const vec3_t worldvec, vec3_t entvec) +void R_WorldNormalToEntity (const vec3_t worldvec, vec3_t entvec) { entvec[0] = -worldvec[0] * preTransEntMatrix[0] - worldvec[1] * preTransEntMatrix[4] + worldvec[2] * preTransEntMatrix[8]; entvec[1] = -worldvec[0] * preTransEntMatrix[1] - worldvec[1] * preTransEntMatrix[5] + worldvec[2] * preTransEntMatrix[9]; @@ -241,7 +244,7 @@ void R_WorldNormalToEntity (const vec3_t worldvec, vec3_t entvec) /* ================= -R_WorldPointToEntity +R_WorldPointToEntity ================= */ @@ -276,7 +279,7 @@ void R_TransformModelToClip( const vec3_t src, const float *modelMatrix, const f int i; for ( i = 0 ; i < 4 ; i++ ) { - eye[i] = + eye[i] = src[0] * modelMatrix[ i + 0 * 4 ] + src[1] * modelMatrix[ i + 1 * 4 ] + src[2] * modelMatrix[ i + 2 * 4 ] + @@ -284,7 +287,7 @@ void R_TransformModelToClip( const vec3_t src, const float *modelMatrix, const f } for ( i = 0 ; i < 4 ; i++ ) { - dst[i] = + dst[i] = eye[0] * projectionMatrix[ i + 0 * 4 ] + eye[1] * projectionMatrix[ i + 1 * 4 ] + eye[2] * projectionMatrix[ i + 2 * 4 ] + @@ -408,7 +411,7 @@ R_RotateForViewer Sets up the modelview matrix for a given viewParm ================= */ -void R_RotateForViewer (void) +void R_RotateForViewer (void) { float viewerMatrix[16]; vec3_t origin; @@ -606,7 +609,7 @@ void R_SetupFrustum (void) { if (i==4) { // far plane does not go through the view point, it goes alot farther.. - tr.viewParms.frustum[i].dist -= tr.distanceCull*1.02f; // a little slack so we don't cull stuff + tr.viewParms.frustum[i].dist -= tr.distanceCull*1.02f; // a little slack so we don't cull stuff } SetPlaneSignbits( &tr.viewParms.frustum[i] ); } @@ -674,27 +677,27 @@ void R_PlaneForSurface (surfaceType_t *surfType, cplane_t *plane) { v2 = tri->verts + tri->indexes[1]; v3 = tri->verts + tri->indexes[2]; PlaneFromPoints( plane4, v1->xyz, v2->xyz, v3->xyz ); - VectorCopy( plane4, plane->normal ); + VectorCopy( plane4, plane->normal ); plane->dist = plane4[3]; return; case SF_POLY: poly = (srfPoly_t *)surfType; PlaneFromPoints( plane4, poly->verts[0].xyz, poly->verts[1].xyz, poly->verts[2].xyz ); - VectorCopy( plane4, plane->normal ); + VectorCopy( plane4, plane->normal ); plane->dist = plane4[3]; return; - case SF_GRID: + case SF_GRID: grid = (srfGridMesh_t *)surfType; v1 = &grid->verts[0]; v2 = &grid->verts[1]; v3 = &grid->verts[2]; PlaneFromPoints( plane4, v3->xyz, v2->xyz, v1->xyz ); - VectorCopy( plane4, plane->normal ); + VectorCopy( plane4, plane->normal ); plane->dist = plane4[3]; return; default: memset (plane, 0, sizeof(*plane)); - plane->normal[0] = 1; + plane->normal[0] = 1; return; } } @@ -709,7 +712,7 @@ be moving and rotating. Returns qtrue if it should be mirrored ================= */ -qboolean R_GetPortalOrientations( drawSurf_t *drawSurf, int entityNum, +qboolean R_GetPortalOrientations( drawSurf_t *drawSurf, int entityNum, orientation_t *surface, orientation_t *camera, vec3_t pvsOrigin, qboolean *mirror ) { int i; @@ -762,8 +765,8 @@ qboolean R_GetPortalOrientations( drawSurf_t *drawSurf, int entityNum, VectorCopy( e->e.oldorigin, pvsOrigin ); // if the entity is just a mirror, don't use as a camera point - if ( e->e.oldorigin[0] == e->e.origin[0] && - e->e.oldorigin[1] == e->e.origin[1] && + if ( e->e.oldorigin[0] == e->e.origin[0] && + e->e.oldorigin[1] == e->e.origin[1] && e->e.oldorigin[2] == e->e.origin[2] ) { VectorScale( plane.normal, plane.dist, surface->origin ); VectorCopy( surface->origin, camera->origin ); @@ -779,7 +782,7 @@ qboolean R_GetPortalOrientations( drawSurf_t *drawSurf, int entityNum, // an origin point we can rotate around d = DotProduct( e->e.origin, plane.normal ) - plane.dist; VectorMA( e->e.origin, -d, surface->axis[0], surface->origin ); - + // now get the camera origin and orientation VectorCopy( e->e.oldorigin, camera->origin ); AxisCopy( e->e.axis, camera->axis ); @@ -830,7 +833,7 @@ static qboolean IsMirror( const drawSurf_t *drawSurf, int entityNum ) R_PlaneForSurface( drawSurf->surface, &originalPlane ); // rotate the plane if necessary - if ( entityNum != REFENTITYNUM_WORLD ) + if ( entityNum != REFENTITYNUM_WORLD ) { tr.currentEntityNum = entityNum; tr.currentEntity = &tr.refdef.entities[entityNum]; @@ -845,8 +848,8 @@ static qboolean IsMirror( const drawSurf_t *drawSurf, int entityNum ) // translate the original plane originalPlane.dist = originalPlane.dist + DotProduct( originalPlane.normal, tr.ori.origin ); - } - else + } + else { plane = originalPlane; } @@ -854,7 +857,7 @@ static qboolean IsMirror( const drawSurf_t *drawSurf, int entityNum ) // locate the portal entity closest to this plane. // origin will be the origin of the portal, origin2 will be // the origin of the camera - for ( i = 0 ; i < tr.refdef.num_entities ; i++ ) + for ( i = 0 ; i < tr.refdef.num_entities ; i++ ) { e = &tr.refdef.entities[i]; if ( e->e.reType != RT_PORTALSURFACE ) { @@ -867,9 +870,9 @@ static qboolean IsMirror( const drawSurf_t *drawSurf, int entityNum ) } // if the entity is just a mirror, don't use as a camera point - if ( e->e.oldorigin[0] == e->e.origin[0] && - e->e.oldorigin[1] == e->e.origin[1] && - e->e.oldorigin[2] == e->e.origin[2] ) + if ( e->e.oldorigin[0] == e->e.origin[0] && + e->e.oldorigin[1] == e->e.origin[1] && + e->e.oldorigin[2] == e->e.origin[2] ) { return qtrue; } @@ -993,7 +996,7 @@ qboolean R_MirrorViewBySurface (drawSurf_t *drawSurf, int entityNum) { orientation_t surface, camera; // don't recursively mirror - if (tr.viewParms.isPortal) + if (tr.viewParms.isPortal) { ri.Printf( PRINT_DEVELOPER, "WARNING: recursive mirror/portal found\n" ); return qfalse; @@ -1013,7 +1016,7 @@ qboolean R_MirrorViewBySurface (drawSurf_t *drawSurf, int entityNum) { newParms = tr.viewParms; newParms.isPortal = qtrue; - if ( !R_GetPortalOrientations( drawSurf, entityNum, &surface, &camera, + if ( !R_GetPortalOrientations( drawSurf, entityNum, &surface, &camera, newParms.pvsOrigin, &newParms.isMirror ) ) { return qfalse; // bad portal, no portalentity } @@ -1022,7 +1025,7 @@ qboolean R_MirrorViewBySurface (drawSurf_t *drawSurf, int entityNum) { VectorSubtract( vec3_origin, camera.axis[0], newParms.portalPlane.normal ); newParms.portalPlane.dist = DotProduct( camera.origin, newParms.portalPlane.normal ); - + R_MirrorVector (oldParms.ori.axis[0], &surface, &camera, newParms.ori.axis[0]); R_MirrorVector (oldParms.ori.axis[1], &surface, &camera, newParms.ori.axis[1]); R_MirrorVector (oldParms.ori.axis[2], &surface, &camera, newParms.ori.axis[2]); @@ -1033,7 +1036,7 @@ qboolean R_MirrorViewBySurface (drawSurf_t *drawSurf, int entityNum) { R_RenderView (&newParms); tr.viewParms = oldParms; - + return qtrue; } @@ -1060,12 +1063,12 @@ int R_SpriteFogNum( trRefEntity_t *ent ) { int partialFog = 0; for ( i = 1 ; i < tr.world->numfogs ; i++ ) { fog = &tr.world->fogs[i]; - if ( ent->e.origin[0] - ent->e.radius >= fog->bounds[0][0] - && ent->e.origin[0] + ent->e.radius <= fog->bounds[1][0] + if ( ent->e.origin[0] - ent->e.radius >= fog->bounds[0][0] + && ent->e.origin[0] + ent->e.radius <= fog->bounds[1][0] && ent->e.origin[1] - ent->e.radius >= fog->bounds[0][1] - && ent->e.origin[1] + ent->e.radius <= fog->bounds[1][1] + && ent->e.origin[1] + ent->e.radius <= fog->bounds[1][1] && ent->e.origin[2] - ent->e.radius >= fog->bounds[0][2] - && ent->e.origin[2] + ent->e.radius <= fog->bounds[1][2] ) + && ent->e.origin[2] + ent->e.radius <= fog->bounds[1][2] ) {//totally inside it return i; break; @@ -1156,7 +1159,7 @@ static void R_RadixSort( drawSurf_t *source, int size ) R_AddDrawSurf ================= */ -void R_AddDrawSurf( const surfaceType_t *surface, const shader_t *shader, int fogIndex, int dlightMap ) +void R_AddDrawSurf( const surfaceType_t *surface, const shader_t *shader, int fogIndex, int dlightMap ) { int index; @@ -1176,7 +1179,7 @@ void R_AddDrawSurf( const surfaceType_t *surface, const shader_t *shader, int fo // the sort data is packed into a single 32 bit value so it can be // compared quickly during the qsorting process - tr.refdef.drawSurfs[index].sort = (shader->sortedIndex << QSORT_SHADERNUM_SHIFT) + tr.refdef.drawSurfs[index].sort = (shader->sortedIndex << QSORT_SHADERNUM_SHIFT) | tr.shiftedEntityNum | ( fogIndex << QSORT_FOGNUM_SHIFT ) | (int)dlightMap; tr.refdef.drawSurfs[index].surface = (surfaceType_t *)surface; tr.refdef.numDrawSurfs++; @@ -1187,7 +1190,7 @@ void R_AddDrawSurf( const surfaceType_t *surface, const shader_t *shader, int fo R_DecomposeSort ================= */ -void R_DecomposeSort( unsigned sort, int *entityNum, shader_t **shader, +void R_DecomposeSort( unsigned sort, int *entityNum, shader_t **shader, int *fogNum, int *dlightMap ) { *fogNum = ( sort >> QSORT_FOGNUM_SHIFT ) & 31; *shader = tr.sortedShaders[ ( sort >> QSORT_SHADERNUM_SHIFT ) & (MAX_SHADERS-1) ]; @@ -1263,8 +1266,8 @@ void R_AddEntitySurfaces (void) { return; } - for ( tr.currentEntityNum = 0; - tr.currentEntityNum < tr.refdef.num_entities; + for ( tr.currentEntityNum = 0; + tr.currentEntityNum < tr.refdef.num_entities; tr.currentEntityNum++ ) { ent = tr.currentEntity = &tr.refdef.entities[tr.currentEntityNum]; @@ -1275,7 +1278,7 @@ void R_AddEntitySurfaces (void) { if ((ent->e.renderfx & RF_ALPHA_FADE)) { - // we need to make sure this is not sorted before the world..in fact we + // we need to make sure this is not sorted before the world..in fact we // want this to be sorted quite late...like how about last. // I don't want to use the highest bit, since no doubt someone fumbled // handling that as an unsigned quantity somewhere @@ -1283,7 +1286,7 @@ void R_AddEntitySurfaces (void) { } // // the weapon model must be handled special -- - // we don't want the hacked weapon position showing in + // we don't want the hacked weapon position showing in // mirrors, because the true body position will already be drawn // if ( (ent->e.renderfx & RF_FIRST_PERSON) && tr.viewParms.isPortal) { @@ -1356,7 +1359,7 @@ Ghoul2 Insert Start /* Ghoul2 Insert End */ - + default: Com_Error( ERR_DROP, "R_AddEntitySurfaces: Bad modeltype" ); break; @@ -1435,7 +1438,7 @@ void R_DebugGraphics( void ) { } // the render thread can't make callbacks to the main thread - //R_SyncRenderThread(); + R_IssuePendingRenderCommands(); // GL_Bind( tr.whiteImage); GL_Cull( CT_FRONT_SIDED ); @@ -1462,20 +1465,20 @@ void R_SetViewFogIndex (void) int contents = ri.SV_PointContents( tr.refdef.vieworg, 0 ); if ( (contents&CONTENTS_FOG) ) {//only take a tr.refdef.fogIndex if the tr.refdef.vieworg is actually *in* that fog brush (assumption: checks pointcontents for any CONTENTS_FOG, not that particular brush...) - for ( tr.refdef.fogIndex = 1 ; tr.refdef.fogIndex < tr.world->numfogs ; tr.refdef.fogIndex++ ) + for ( tr.refdef.fogIndex = 1 ; tr.refdef.fogIndex < tr.world->numfogs ; tr.refdef.fogIndex++ ) { - fog = &tr.world->fogs[tr.refdef.fogIndex]; + fog = &tr.world->fogs[tr.refdef.fogIndex]; if ( tr.refdef.vieworg[0] >= fog->bounds[0][0] && tr.refdef.vieworg[1] >= fog->bounds[0][1] && tr.refdef.vieworg[2] >= fog->bounds[0][2] && tr.refdef.vieworg[0] <= fog->bounds[1][0] && tr.refdef.vieworg[1] <= fog->bounds[1][1] - && tr.refdef.vieworg[2] <= fog->bounds[1][2] ) + && tr.refdef.vieworg[2] <= fog->bounds[1][2] ) { break; } } - if ( tr.refdef.fogIndex == tr.world->numfogs ) + if ( tr.refdef.fogIndex == tr.world->numfogs ) { tr.refdef.fogIndex = 0; } @@ -1513,11 +1516,12 @@ void R_RenderView (viewParms_t *parms) { color4ub_t whitecolor = {0xff, 0xff, 0xff, 0xff}; color4ub_t blackcolor = {0x00, 0x00, 0x00, 0xff}; - for(i=0;ii ); } - RE_SetLightStyle(r_debugStyle->integer, *(int*)whitecolor); + ba = (byteAlias_t *)&whitecolor; + RE_SetLightStyle( r_debugStyle->integer, ba->i ); } tr.viewCount++; @@ -1535,7 +1539,7 @@ void R_RenderView (viewParms_t *parms) { R_SetupFrustum (); - if (!(tr.refdef.rdflags & RDF_NOWORLDMODEL)) + if (!(tr.refdef.rdflags & RDF_NOWORLDMODEL)) { // Trying to do this with no world is not good. R_SetViewFogIndex (); } diff --git a/code/rd-vanilla/tr_marks.cpp b/code/rd-vanilla/tr_marks.cpp index ee58afb626..b632a8ea31 100644 --- a/code/rd-vanilla/tr_marks.cpp +++ b/code/rd-vanilla/tr_marks.cpp @@ -1,29 +1,31 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // tr_marks.c -- polygon projection on the world polygons -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - - #include "tr_local.h" #define MAX_VERTS_ON_POLY 64 diff --git a/code/rd-vanilla/tr_mesh.cpp b/code/rd-vanilla/tr_mesh.cpp index 50d363e395..994f3e322b 100644 --- a/code/rd-vanilla/tr_mesh.cpp +++ b/code/rd-vanilla/tr_mesh.cpp @@ -1,25 +1,29 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // tr_mesh.c: triangle model functions -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" #include "tr_local.h" diff --git a/code/rd-vanilla/tr_model.cpp b/code/rd-vanilla/tr_model.cpp index c94c51763c..0cd195efeb 100644 --- a/code/rd-vanilla/tr_model.cpp +++ b/code/rd-vanilla/tr_model.cpp @@ -1,25 +1,29 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // tr_models.c -- model loading and caching -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" #include "tr_local.h" @@ -59,8 +63,8 @@ Ghoul2 Insert End // This stuff looks a bit messy, but it's kept here as black box, and nothing appears in any .H files for other // modules to worry about. I may make another module for this sometime. // -typedef pair StringOffsetAndShaderIndexDest_t; -typedef vector ShaderRegisterData_t; +typedef std::pair StringOffsetAndShaderIndexDest_t; +typedef std::vector ShaderRegisterData_t; struct CachedEndianedModelBinary_s { void *pModelDiskImage; @@ -78,7 +82,7 @@ struct CachedEndianedModelBinary_s } }; typedef struct CachedEndianedModelBinary_s CachedEndianedModelBinary_t; -typedef map CachedModels_t; +typedef std::map CachedModels_t; CachedModels_t *CachedModels = NULL; // the important cache item. void RE_RegisterModels_StoreShaderRequest(const char *psModelFileName, const char *psShaderName, const int *piShaderIndexPoke) @@ -264,11 +268,8 @@ qboolean RE_RegisterModels_LevelLoadEnd(qboolean bDeleteEverythingNotUsedThisLev int iLoadedModelBytes = GetModelDataAllocSize(); const int iMaxModelBytes= r_modelpoolmegs->integer * 1024 * 1024; - qboolean bEraseOccured = qfalse; - for (CachedModels_t::iterator itModel = CachedModels->begin(); itModel != CachedModels->end() && ( bDeleteEverythingNotUsedThisLevel || iLoadedModelBytes > iMaxModelBytes ); bEraseOccured?itModel:++itModel) - { - bEraseOccured = qfalse; - + for (CachedModels_t::iterator itModel = CachedModels->begin(); itModel != CachedModels->end() && ( bDeleteEverythingNotUsedThisLevel || iLoadedModelBytes > iMaxModelBytes ); ) + { CachedEndianedModelBinary_t &CachedModel = (*itModel).second; qboolean bDeleteThis = qfalse; @@ -297,17 +298,13 @@ qboolean RE_RegisterModels_LevelLoadEnd(qboolean bDeleteEverythingNotUsedThisLev //CachedModel.pModelDiskImage = NULL; // REM for reference, erase() call below negates the need for it. bAtLeastoneModelFreed = qtrue; } + CachedModels->erase(itModel++); -#ifdef _WIN32 - itModel = CachedModels->erase(itModel); -#else - CachedModels_t::iterator itTemp = itModel; - itModel++; - CachedModels->erase(itTemp); -#endif - bEraseOccured = qtrue; - - iLoadedModelBytes = GetModelDataAllocSize(); + iLoadedModelBytes = GetModelDataAllocSize(); + } + else + { + ++itModel; } } } @@ -346,20 +343,19 @@ void RE_RegisterModels_Info_f( void ) static void RE_RegisterModels_DeleteAll(void) { + if(!CachedModels) { + return; //argh! + } + for (CachedModels_t::iterator itModel = CachedModels->begin(); itModel != CachedModels->end(); ) { CachedEndianedModelBinary_t &CachedModel = (*itModel).second; if (CachedModel.pModelDiskImage) { - Z_Free(CachedModel.pModelDiskImage); + Z_Free(CachedModel.pModelDiskImage); } -#ifdef _WIN32 - itModel = CachedModels->erase(itModel); -#else - CachedModels_t::iterator itTemp = itModel; - itModel++; - CachedModels->erase(itTemp); -#endif + + CachedModels->erase(itModel++); } extern void RE_AnimationCFGs_DeleteAll(void); @@ -633,7 +629,7 @@ Ghoul2 Insert End Q_strncpyz( mod->name, name, sizeof( mod->name ) ); // make sure the render thread is stopped - //R_SyncRenderThread(); + R_IssuePendingRenderCommands(); // int iLODStart = 0; if (strstr (name, ".md3")) { @@ -989,9 +985,10 @@ void RE_BeginRegistration( glconfig_t *glconfigOut ) { *glconfigOut = glConfig; + R_IssuePendingRenderCommands(); + tr.viewCluster = -1; // force markleafs to regenerate - R_SyncRenderThread(); RE_ClearScene(); diff --git a/code/rd-vanilla/tr_quicksprite.cpp b/code/rd-vanilla/tr_quicksprite.cpp index 1682e77b4c..d805bacd82 100644 --- a/code/rd-vanilla/tr_quicksprite.cpp +++ b/code/rd-vanilla/tr_quicksprite.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // tr_QuickSprite.cpp: implementation of the CQuickSpriteSystem class. // @@ -35,10 +40,19 @@ CQuickSpriteSystem SQuickSprite; // Construction/Destruction ////////////////////////////////////////////////////////////////////// -CQuickSpriteSystem::CQuickSpriteSystem(void) +CQuickSpriteSystem::CQuickSpriteSystem() : + mTexBundle(NULL), + mGLStateBits(0), + mFogIndex(-1), + mUseFog(qfalse), + mNextVert(0) { int i; + memset( mVerts, 0, sizeof( mVerts ) ); + memset( mFogTextureCoords, 0, sizeof( mFogTextureCoords ) ); + memset( mColors, 0, sizeof( mColors ) ); + for (i = 0; i < SHADER_MAX_VERTEXES; i += 4) { // Bottom right diff --git a/code/rd-vanilla/tr_quicksprite.h b/code/rd-vanilla/tr_quicksprite.h index 0318505137..29778a6ee8 100644 --- a/code/rd-vanilla/tr_quicksprite.h +++ b/code/rd-vanilla/tr_quicksprite.h @@ -1,34 +1,33 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this include must remain at the top of every CPP file #include "tr_local.h" // tr_QuickSprite.h: interface for the CQuickSprite class. // ////////////////////////////////////////////////////////////////////// -#if !defined(AFX_TR_QUICKSPRITE_H__6F05EB85_A1ED_4537_9EC0_9F5D82A5D99A__INCLUDED_) -#define AFX_TR_QUICKSPRITE_H__6F05EB85_A1ED_4537_9EC0_9F5D82A5D99A__INCLUDED_ - -#if _MSC_VER > 1000 #pragma once -#endif // _MSC_VER > 1000 class CQuickSpriteSystem { @@ -57,8 +56,3 @@ class CQuickSpriteSystem }; extern CQuickSpriteSystem SQuickSprite; - - -#endif - - diff --git a/code/rd-vanilla/tr_scene.cpp b/code/rd-vanilla/tr_scene.cpp index 47fa14cf6f..0b00b61d73 100644 --- a/code/rd-vanilla/tr_scene.cpp +++ b/code/rd-vanilla/tr_scene.cpp @@ -1,27 +1,29 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - - #include "tr_local.h" int r_firstSceneDrawSurf; diff --git a/code/rd-vanilla/tr_shade.cpp b/code/rd-vanilla/tr_shade.cpp index 440568fcf3..d425ce36c2 100644 --- a/code/rd-vanilla/tr_shade.cpp +++ b/code/rd-vanilla/tr_shade.cpp @@ -1,25 +1,29 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // tr_shade.c -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" #include "tr_local.h" @@ -182,7 +186,7 @@ static void R_DrawElements( int numIndexes, const glIndex_t *indexes ) { if ( primitives == 2 ) { - qglDrawElements( GL_TRIANGLES, + qglDrawElements( GL_TRIANGLES, numIndexes, GL_INDEX_TYPE, indexes ); @@ -240,7 +244,7 @@ void R_BindAnimatedImage( const textureBundle_t *bundle) { GL_Bind( bundle->image ); return; } - + if (backEnd.currentEntity->e.renderfx & RF_SETANIMINDEX ) { index = backEnd.currentEntity->e.skinNum; @@ -251,7 +255,7 @@ void R_BindAnimatedImage( const textureBundle_t *bundle) { // exactly with waveforms of the same frequency index = Q_ftol( backEnd.refdef.floatTime * bundle->imageAnimationSpeed * FUNCTABLE_SIZE ); index >>= FUNCTABLE_SIZE2; - + if ( index < 0 ) { index = 0; // may happen with shader time offsets } @@ -282,7 +286,7 @@ DrawTris Draws triangle outlines for debugging ================ */ -static void DrawTris (shaderCommands_t *input) +static void DrawTris (shaderCommands_t *input) { GL_Bind( tr.whiteImage ); @@ -318,7 +322,7 @@ static void DrawTris (shaderCommands_t *input) case 8: qglColor3f( 0.0, 0.0, 0.0); //black break; - } + } } else { @@ -338,7 +342,7 @@ static void DrawTris (shaderCommands_t *input) qglVertexPointer( 3, GL_FLOAT, 16, input->xyz ); // padded for SIMD - if ( qglLockArraysEXT ) + if ( qglLockArraysEXT ) { qglLockArraysEXT( 0, input->numVertexes ); GLimp_LogComment( "glLockArraysEXT\n" ); @@ -346,7 +350,7 @@ static void DrawTris (shaderCommands_t *input) R_DrawElements( input->numIndexes, input->indexes ); - if ( qglUnlockArraysEXT ) + if ( qglUnlockArraysEXT ) { qglUnlockArraysEXT( ); GLimp_LogComment( "glUnlockArraysEXT\n" ); @@ -432,7 +436,7 @@ void RB_BeginSurface( shader_t *shader, int fogNum ) { tess.xstages = state->stages; tess.numPasses = state->numUnfoggedPasses; - + tess.currentStageIteratorFunc = shader->sky ? RB_StageIteratorSky : RB_StageIteratorGeneric; tess.fading = false; @@ -474,7 +478,7 @@ static void DrawMultitextured( shaderCommands_t *input, int stage ) { if ( r_lightmap->integer ) { GL_TexEnv( GL_REPLACE ); } else { - GL_TexEnv( tess.shader->multitextureEnv ); + GL_TexEnv( tess.shader->multitextureEnv ); } qglTexCoordPointer( 2, GL_FLOAT, 0, input->svars.texcoords[1] ); @@ -580,7 +584,7 @@ static void ProjectDlightTexture( void ) { } tempColor = floatColor[0] + modulate; colors[0] = tempColor > 255 ? 255: Q_ftol(tempColor); - + tempColor = floatColor[1] + modulate; colors[1] = tempColor > 255 ? 255: Q_ftol(tempColor); @@ -681,7 +685,7 @@ static void ProjectDlightTexture2( void ) { int needResetVerts=0; - if ( !backEnd.refdef.num_dlights ) + if ( !backEnd.refdef.num_dlights ) { return; } @@ -699,33 +703,33 @@ static void ProjectDlightTexture2( void ) { radius = dl->radius; int clipall = 63; - for ( i = 0 ; i < tess.numVertexes ; i++) + for ( i = 0 ; i < tess.numVertexes ; i++) { int clip; VectorSubtract( origin, tess.xyz[i], dist ); clip = 0; - if ( dist[0] < -radius ) + if ( dist[0] < -radius ) { clip |= 1; } - else if ( dist[0] > radius ) + else if ( dist[0] > radius ) { clip |= 2; } - if ( dist[1] < -radius ) + if ( dist[1] < -radius ) { clip |= 4; } - else if ( dist[1] > radius ) + else if ( dist[1] > radius ) { clip |= 8; } - if ( dist[2] < -radius ) + if ( dist[2] < -radius ) { clip |= 16; } - else if ( dist[2] > radius ) + else if ( dist[2] > radius ) { clip |= 32; } @@ -733,7 +737,7 @@ static void ProjectDlightTexture2( void ) { clipBits[i] = clip; clipall &= clip; } - if ( clipall ) + if ( clipall ) { continue; // this surface doesn't have any of this light } @@ -742,14 +746,14 @@ static void ProjectDlightTexture2( void ) { floatColor[2] = dl->color[2] * 255.0f; // build a list of triangles that need light numIndexes = 0; - for ( i = 0 ; i < tess.numIndexes ; i += 3 ) + for ( i = 0 ; i < tess.numIndexes ; i += 3 ) { int a, b, c; a = tess.indexes[i]; b = tess.indexes[i+1]; c = tess.indexes[i+2]; - if ( clipBits[a] & clipBits[b] & clipBits[c] ) + if ( clipBits[a] & clipBits[b] & clipBits[c] ) { continue; // not lighted } @@ -764,7 +768,8 @@ static void ProjectDlightTexture2( void ) { CrossProduct(e1,e2,normal); // fac=DotProduct(normal,origin)-DotProduct(normal,posa); // if (fac <= 0.0f || // backface - if ( (!r_dlightBacks->integer && DotProduct(normal,origin)-DotProduct(normal,posa) <= 0.0f) || // backface +// rjr - removed for hacking if ( (!r_dlightBacks->integer && DotProduct(normal,origin)-DotProduct(normal,posa) <= 0.0f) || // backface + if ( DotProduct(normal,origin)-DotProduct(normal,posa) <= 0.0f || // backface DotProduct(normal,normal) < 1E-8f) // junk triangle { continue; @@ -838,9 +843,11 @@ static void ProjectDlightTexture2( void ) { colorTemp[1] = Q_ftol(floatColor[1] * modulate); colorTemp[2] = Q_ftol(floatColor[2] * modulate); colorTemp[3] = 255; - colorArray[numIndexes]=*(unsigned int *)colorTemp; - colorArray[numIndexes+1]=*(unsigned int *)colorTemp; - colorArray[numIndexes+2]=*(unsigned int *)colorTemp; + + byteAlias_t *ba = (byteAlias_t *)&colorTemp; + colorArray[numIndexes + 0] = ba->ui; + colorArray[numIndexes + 1] = ba->ui; + colorArray[numIndexes + 2] = ba->ui; hitIndexes[numIndexes] = numIndexes; hitIndexes[numIndexes+1] = numIndexes+1; @@ -859,7 +866,7 @@ static void ProjectDlightTexture2( void ) { #ifndef JK2_MODE //don't have fog enabled when we redraw with alpha test, or it will double over //and screw the tri up -rww - if (r_drawfog->value == 2 && + if (r_drawfog->value == 2 && tr.world && (tess.fogNum == tr.world->globalFog || tess.fogNum == tr.world->numfogs)) { @@ -879,7 +886,7 @@ static void ProjectDlightTexture2( void ) { if (!needResetVerts) { needResetVerts=1; - if (qglUnlockArraysEXT) + if (qglUnlockArraysEXT) { qglUnlockArraysEXT(); GLimp_LogComment( "glUnlockArraysEXT\n" ); @@ -950,7 +957,7 @@ static void ProjectDlightTexture2( void ) { //if ( dl->additive ) { // GL_State( GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE | GLS_DEPTHFUNC_EQUAL ); //} - //else + //else { GL_State( GLS_SRCBLEND_DST_COLOR | GLS_DSTBLEND_ONE | GLS_DEPTHFUNC_EQUAL ); } @@ -1027,7 +1034,7 @@ static void ProjectDlightTexture( void ) { backEnd.pc.c_dlightVertexes++; VectorSubtract( origin, tess.xyz[i], dist ); - + int l = 1; int bestIndex = 0; float greatest = tess.normal[i][0]; @@ -1158,7 +1165,7 @@ static void ProjectDlightTexture( void ) { texCoords[0] = 0.5f + dist[1] * scale; texCoords[1] = 0.5f + dist[2] * scale; } - + clip = 0; if ( texCoords[0] < 0.0f ) { clip |= 1; @@ -1216,7 +1223,7 @@ static void ProjectDlightTexture( void ) { #ifndef JK2_MODE //don't have fog enabled when we redraw with alpha test, or it will double over //and screw the tri up -rww - if (r_drawfog->value == 2 && + if (r_drawfog->value == 2 && tr.world && (tess.fogNum == tr.world->globalFog || tess.fogNum == tr.world->numfogs)) { @@ -1336,7 +1343,8 @@ static void RB_FogPass( void ) { fog = tr.world->fogs + tess.fogNum; for ( i = 0; i < tess.numVertexes; i++ ) { - * ( int * )&tess.svars.colors[i] = fog->colorInt; + byteAlias_t *ba = (byteAlias_t *)&tess.svars.colors[i]; + ba->i = fog->colorInt; } RB_CalcFogTexCoords( ( float * ) tess.svars.texcoords[0] ); @@ -1362,7 +1370,7 @@ static void ComputeColors( shaderStage_t *pStage, alphaGen_t forceAlphaGen, colo { int i; - if ( tess.shader != tr.projectionShadowShader && tess.shader != tr.shadowShader && + if ( tess.shader != tr.projectionShadowShader && tess.shader != tr.shadowShader && ( backEnd.currentEntity->e.renderfx & (RF_DISINTEGRATE1|RF_DISINTEGRATE2))) { RB_CalcDisintegrateColors( (unsigned char *)tess.svars.colors, pStage->rgbGen ); @@ -1393,7 +1401,7 @@ static void ComputeColors( shaderStage_t *pStage, alphaGen_t forceAlphaGen, colo numVertexes = tess.numVertexes; - for ( i = 0 ; i < numVertexes ; i++, normal += 4, color += 4) + for ( i = 0 ; i < numVertexes ; i++, normal += 4, color += 4) { dot = DotProduct( normal, backEnd.refdef.viewaxis[0] ); @@ -1433,8 +1441,8 @@ static void ComputeColors( shaderStage_t *pStage, alphaGen_t forceAlphaGen, colo case CGEN_LIGHTING_DIFFUSE_ENTITY: RB_CalcDiffuseEntityColor( ( unsigned char * ) tess.svars.colors ); - if ( forceAlphaGen == AGEN_IDENTITY && - backEnd.currentEntity->e.shaderRGBA[3] == 0xff + if ( forceAlphaGen == AGEN_IDENTITY && + backEnd.currentEntity->e.shaderRGBA[3] == 0xff ) { forceAlphaGen = AGEN_SKIP; //already got it in this set since it does all 4 components @@ -1445,7 +1453,9 @@ static void ComputeColors( shaderStage_t *pStage, alphaGen_t forceAlphaGen, colo break; case CGEN_CONST: for ( i = 0; i < tess.numVertexes; i++ ) { - *(int *)tess.svars.colors[i] = *(int *)pStage->constantColor; + byteAlias_t *baDest = (byteAlias_t *)&tess.svars.colors[i], + *baSource = (byteAlias_t *)&pStage->constantColor; + baDest->i = baSource->i; } break; case CGEN_VERTEX: @@ -1486,12 +1496,11 @@ static void ComputeColors( shaderStage_t *pStage, alphaGen_t forceAlphaGen, colo break; case CGEN_FOG: { - fog_t *fog; - - fog = tr.world->fogs + tess.fogNum; + const fog_t *fog = tr.world->fogs + tess.fogNum; for ( i = 0; i < tess.numVertexes; i++ ) { - * ( int * )&tess.svars.colors[i] = fog->colorInt; + byteAlias_t *ba = (byteAlias_t *)&tess.svars.colors[i]; + ba->i = fog->colorInt; } } break; @@ -1500,8 +1509,8 @@ static void ComputeColors( shaderStage_t *pStage, alphaGen_t forceAlphaGen, colo break; case CGEN_ENTITY: RB_CalcColorFromEntity( ( unsigned char * ) tess.svars.colors ); - if ( forceAlphaGen == AGEN_IDENTITY && - backEnd.currentEntity->e.shaderRGBA[3] == 0xff + if ( forceAlphaGen == AGEN_IDENTITY && + backEnd.currentEntity->e.shaderRGBA[3] == 0xff ) { forceAlphaGen = AGEN_SKIP; //already got it in this set since it does all 4 components @@ -1512,9 +1521,11 @@ static void ComputeColors( shaderStage_t *pStage, alphaGen_t forceAlphaGen, colo RB_CalcColorFromOneMinusEntity( ( unsigned char * ) tess.svars.colors ); break; case CGEN_LIGHTMAPSTYLE: - for ( i = 0; i < tess.numVertexes; i++ ) + for ( i = 0; i < tess.numVertexes; i++ ) { - * ( int * )&tess.svars.colors[i] = *(int *)styleColors[pStage->lightmapStyle]; + byteAlias_t *baDest = (byteAlias_t *)&tess.svars.colors[i], + *baSource = (byteAlias_t *)&styleColors[pStage->lightmapStyle]; + baDest->ui = baSource->ui; } break; } @@ -1603,9 +1614,9 @@ static void ComputeColors( shaderStage_t *pStage, alphaGen_t forceAlphaGen, colo } break; case AGEN_BLEND: - if ( forceRGBGen != CGEN_VERTEX ) + if ( forceRGBGen != CGEN_VERTEX ) { - for ( i = 0; i < tess.numVertexes; i++ ) + for ( i = 0; i < tess.numVertexes; i++ ) { tess.svars.colors[i][3] = tess.vertexAlphas[i][pStage->index]; } @@ -1719,7 +1730,7 @@ static void ComputeTexCoords( shaderStage_t *pStage ) { break; case TMOD_TURBULENT: - RB_CalcTurbulentTexCoords( &pStage->bundle[b].texMods[tm].wave, + RB_CalcTurbulentTexCoords( &pStage->bundle[b].texMods[tm].wave, ( float * ) tess.svars.texcoords[b] ); break; @@ -1737,9 +1748,9 @@ static void ComputeTexCoords( shaderStage_t *pStage ) { RB_CalcScaleTexCoords( pStage->bundle[b].texMods[tm].translate, //union scroll into translate ( float * ) tess.svars.texcoords[b] ); break; - + case TMOD_STRETCH: - RB_CalcStretchTexCoords( &pStage->bundle[b].texMods[tm].wave, + RB_CalcStretchTexCoords( &pStage->bundle[b].texMods[tm].wave, ( float * ) tess.svars.texcoords[b] ); break; @@ -1783,8 +1794,8 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input ) bool FogColorChange = false; fog_t *fog = NULL; - if (tess.fogNum && tess.shader->fogPass && (tess.fogNum == tr.world->globalFog || tess.fogNum == tr.world->numfogs) - && r_drawfog->value == 2) + if (tess.fogNum && tess.shader->fogPass && (tess.fogNum == tr.world->globalFog || tess.fogNum == tr.world->numfogs) + && r_drawfog->value == 2) { // only gl fog global fog and the "special fog" fog = tr.world->fogs + tess.fogNum; @@ -1836,7 +1847,7 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input ) { qglFogfv(GL_FOG_COLOR, fog->parms.color); } - + qglEnable(GL_FOG); UseGLFog = true; } @@ -1866,7 +1877,7 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input ) if ( !( pStage->bundle[0].isLightmap || pStage->bundle[1].isLightmap || pStage->bundle[0].vertexLightmap ) ) { continue; // need to keep going in case the LM is in a later stage - } + } else { stateBits = (GLS_DSTBLEND_ZERO | GLS_SRCBLEND_ONE); //we want to replace the prior stages with this LM, not blend @@ -1963,7 +1974,7 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input ) // // set state // - if ( (tess.shader == tr.distortionShader) || + if ( (tess.shader == tr.distortionShader) || (backEnd.currentEntity && (backEnd.currentEntity->e.renderfx & RF_DISTORTION)) ) { //special distortion effect -rww //tr.screenImage should have been set for this specific entity before we got in here. @@ -1974,7 +1985,7 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input ) { GL_Bind( tr.whiteImage ); } - else + else R_BindAnimatedImage( &pStage->bundle[0] ); if (tess.shader == tr.distortionShader && @@ -2031,7 +2042,7 @@ void RB_StageIteratorGeneric( void ) // // log this call // - if ( r_logFile->integer ) + if ( r_logFile->integer ) { // don't just call LogComment, or we will get // a call to va() every frame! @@ -2098,7 +2109,7 @@ void RB_StageIteratorGeneric( void ) // RB_IterateStagesGeneric( input ); - // + // // now do any dynamic lighting needed // if ( tess.dlightBits && tess.shader->sort <= SS_OPAQUE @@ -2125,10 +2136,10 @@ void RB_StageIteratorGeneric( void ) RB_FogPass(); } - // + // // unlock arrays // - if (qglUnlockArraysEXT) + if (qglUnlockArraysEXT) { qglUnlockArraysEXT(); GLimp_LogComment( "glUnlockArraysEXT\n" ); @@ -2156,7 +2167,7 @@ void RB_StageIteratorGeneric( void ) #ifndef JK2_MODE //don't disable the hardware fog til after we do surface sprites - if (r_drawfog->value == 2 && + if (r_drawfog->value == 2 && tess.fogNum && tess.shader->fogPass && (tess.fogNum == tr.world->globalFog || tess.fogNum == tr.world->numfogs)) { @@ -2180,7 +2191,7 @@ void RB_EndSurface( void ) { if (input->indexes[SHADER_MAX_INDEXES-1] != 0) { Com_Error (ERR_DROP, "RB_EndSurface() - SHADER_MAX_INDEXES hit"); - } + } if (input->xyz[SHADER_MAX_VERTEXES-1][0] != 0) { Com_Error (ERR_DROP, "RB_EndSurface() - SHADER_MAX_VERTEXES hit"); } @@ -2198,7 +2209,7 @@ void RB_EndSurface( void ) { if ( skyboxportal ) { // world - if(!(backEnd.refdef.rdflags & RDF_SKYBOXPORTAL)) + if(!(backEnd.refdef.rdflags & RDF_SKYBOXPORTAL)) { if(tess.currentStageIteratorFunc == RB_StageIteratorSky) { // don't process these tris at all @@ -2245,7 +2256,7 @@ void RB_EndSurface( void ) { // // draw debugging stuff // - if ( r_showtris->integer ) + if ( r_showtris->integer ) { DrawTris (input); } diff --git a/code/rd-vanilla/tr_shade_calc.cpp b/code/rd-vanilla/tr_shade_calc.cpp index 32605f86d1..5df2dbef44 100644 --- a/code/rd-vanilla/tr_shade_calc.cpp +++ b/code/rd-vanilla/tr_shade_calc.cpp @@ -1,34 +1,35 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // tr_shade_calc.c -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - - #include "tr_local.h" #include "../rd-common/tr_common.h" #define WAVEVALUE( table, base, amplitude, phase, freq ) ((base) + table[ Q_ftol( ( ( (phase) + backEnd.refdef.floatTime * (freq) ) * FUNCTABLE_SIZE ) ) & FUNCTABLE_MASK ] * (amplitude)) -static float *TableForFunc( genFunc_t func ) +static float *TableForFunc( genFunc_t func ) { switch ( func ) { @@ -56,7 +57,7 @@ static float *TableForFunc( genFunc_t func ) ** ** Evaluates a given waveForm_t, referencing backEnd.refdef.time directly */ -static float EvalWaveForm( const waveForm_t *wf ) +static float EvalWaveForm( const waveForm_t *wf ) { float *table; @@ -141,7 +142,7 @@ void RB_CalcDeformVertexes( deformStage_t *ds ) for ( i = 0; i < tess.numVertexes; i++, xyz += 4, normal += 4 ) { VectorScale( normal, scale, offset ); - + xyz[0] += offset[0]; xyz[1] += offset[1]; xyz[2] += offset[2]; @@ -155,13 +156,13 @@ void RB_CalcDeformVertexes( deformStage_t *ds ) { float off = ( xyz[0] + xyz[1] + xyz[2] ) * ds->deformationSpread; - scale = WAVEVALUE( table, ds->deformationWave.base, + scale = WAVEVALUE( table, ds->deformationWave.base, ds->deformationWave.amplitude, ds->deformationWave.phase + off, ds->deformationWave.frequency ); VectorScale( normal, scale, offset ); - + xyz[0] += offset[0]; xyz[1] += offset[1]; xyz[2] += offset[2]; @@ -208,7 +209,7 @@ RB_CalcBulgeVertexes ======================== */ -void RB_CalcBulgeVertexes( deformStage_t *ds ) +void RB_CalcBulgeVertexes( deformStage_t *ds ) { int i; float *xyz = ( float * ) tess.xyz; @@ -218,7 +219,7 @@ void RB_CalcBulgeVertexes( deformStage_t *ds ) if ( ds->bulgeSpeed == 0.0f && ds->bulgeWidth == 0.0f ) { // We don't have a speed and width, so just use height to expand uniformly - for ( i = 0; i < tess.numVertexes; i++, xyz += 4, normal += 4 ) + for ( i = 0; i < tess.numVertexes; i++, xyz += 4, normal += 4 ) { xyz[0] += normal[0] * ds->bulgeHeight; xyz[1] += normal[1] * ds->bulgeHeight; @@ -235,12 +236,12 @@ void RB_CalcBulgeVertexes( deformStage_t *ds ) now = backEnd.refdef.time * ds->bulgeSpeed * 0.001f; - for ( i = 0; i < tess.numVertexes; i++, xyz += 4, st += 2 * NUM_TEX_COORDS, normal += 4 ) + for ( i = 0; i < tess.numVertexes; i++, xyz += 4, st += 2 * NUM_TEX_COORDS, normal += 4 ) { off = (float)( FUNCTABLE_SIZE / (M_PI*2) ) * ( st[0] * ds->bulgeWidth + now ); scale = tr.sinTable[ off & FUNCTABLE_MASK ] * ds->bulgeHeight; - + xyz[0] += normal[0] * scale; xyz[1] += normal[1] * scale; xyz[2] += normal[2] * scale; @@ -265,7 +266,7 @@ void RB_CalcMoveVertexes( deformStage_t *ds ) { table = TableForFunc( ds->deformationWave.func ); - scale = WAVEVALUE( table, ds->deformationWave.base, + scale = WAVEVALUE( table, ds->deformationWave.base, ds->deformationWave.amplitude, ds->deformationWave.phase, ds->deformationWave.frequency ); @@ -484,7 +485,7 @@ static void Autosprite2Deform( void ) { v2 = xyz + 4 * edgeVerts[j][1]; VectorSubtract( v1, v2, temp ); - + l = DotProduct( temp, temp ); if ( l < lengths[0] ) { nums[1] = nums[0]; @@ -512,7 +513,7 @@ static void Autosprite2Deform( void ) { // cross this with the view direction to get minor axis CrossProduct( major, forward, minor ); VectorNormalize( minor ); - + // re-project the points for ( j = 0 ; j < 2 ; j++ ) { float l; @@ -521,7 +522,7 @@ static void Autosprite2Deform( void ) { v2 = xyz + 4 * edgeVerts[nums[j]][1]; l = 0.5 * sqrt( lengths[j] ); - + // we need to see which direction this edge // is used to determine direction of projection for ( k = 0 ; k < 5 ; k++ ) { @@ -549,9 +550,6 @@ RB_DeformTessGeometry ===================== */ -#ifdef _MSC_VER -#pragma warning( disable : 4710 ) //vectorLength not inlined in AutospriteDeform which is auto-inlined in here -#endif void RB_DeformTessGeometry( void ) { int i; deformStage_t *ds; @@ -597,10 +595,6 @@ void RB_DeformTessGeometry( void ) { } } } -#ifdef _MSC_VER -#pragma warning( default: 4710 ) -#endif - /* ==================================================================== @@ -618,16 +612,14 @@ void RB_CalcColorFromEntity( unsigned char *dstColors ) { int i; int *pColors = ( int * ) dstColors; - int c; if ( !backEnd.currentEntity ) return; - c = * ( int * ) backEnd.currentEntity->e.shaderRGBA; + const byteAlias_t *ba = (byteAlias_t *)&backEnd.currentEntity->e.shaderRGBA; - for ( i = 0; i < tess.numVertexes; i++, pColors++ ) - { - *pColors = c; + for ( i = 0; i < tess.numVertexes; i++ ) { + *pColors++ = ba->i; } } @@ -639,7 +631,6 @@ void RB_CalcColorFromOneMinusEntity( unsigned char *dstColors ) int i; int *pColors = ( int * ) dstColors; unsigned char invModulate[4]; - int c; if ( !backEnd.currentEntity ) return; @@ -649,11 +640,10 @@ void RB_CalcColorFromOneMinusEntity( unsigned char *dstColors ) invModulate[2] = 255 - backEnd.currentEntity->e.shaderRGBA[2]; invModulate[3] = 255 - backEnd.currentEntity->e.shaderRGBA[3]; // this trashes alpha, but the AGEN block fixes it - c = * ( int * ) invModulate; + byteAlias_t *ba = (byteAlias_t *)&invModulate; - for ( i = 0; i < tess.numVertexes; i++, pColors++ ) - { - *pColors = c; + for ( i = 0; i < tess.numVertexes; i++ ) { + *pColors++ = ba->i; } } @@ -703,13 +693,13 @@ void RB_CalcWaveColor( const waveForm_t *wf, unsigned char *dstColors ) float glow; int *colors = ( int * ) dstColors; byte color[4]; - + if ( wf->func == GF_NOISE ) { glow = wf->base + R_NoiseGet4f( 0, 0, 0, ( backEnd.refdef.floatTime + wf->phase ) * wf->frequency ) * wf->amplitude; } else { glow = EvalWaveForm( wf ) * tr.identityLight; } - + if ( glow < 0 ) { glow = 0; } @@ -720,10 +710,11 @@ void RB_CalcWaveColor( const waveForm_t *wf, unsigned char *dstColors ) v = Q_ftol( 255 * glow ); color[0] = color[1] = color[2] = v; color[3] = 255; - v = *(int *)color; - - for ( i = 0; i < tess.numVertexes; i++, colors++ ) { - *colors = v; + + byteAlias_t *ba = (byteAlias_t *)&color; + + for ( i = 0; i < tess.numVertexes; i++ ) { + *colors++ = ba->i; } } @@ -735,7 +726,7 @@ void RB_CalcWaveAlpha( const waveForm_t *wf, unsigned char *dstColors ) int i; int v; float glow; - + glow = EvalWaveFormClamped( wf ); v = 255 * glow; @@ -851,11 +842,11 @@ void RB_CalcFogTexCoords( float *st ) { // rotate the gradient vector for this orientation if ( fog->hasSurface ) { - fogDepthVector[0] = fog->surface[0] * backEnd.ori.axis[0][0] + + fogDepthVector[0] = fog->surface[0] * backEnd.ori.axis[0][0] + fog->surface[1] * backEnd.ori.axis[0][1] + fog->surface[2] * backEnd.ori.axis[0][2]; - fogDepthVector[1] = fog->surface[0] * backEnd.ori.axis[1][0] + + fogDepthVector[1] = fog->surface[0] * backEnd.ori.axis[1][0] + fog->surface[1] * backEnd.ori.axis[1][1] + fog->surface[2] * backEnd.ori.axis[1][2]; - fogDepthVector[2] = fog->surface[0] * backEnd.ori.axis[2][0] + + fogDepthVector[2] = fog->surface[0] * backEnd.ori.axis[2][0] + fog->surface[1] * backEnd.ori.axis[2][1] + fog->surface[2] * backEnd.ori.axis[2][2]; fogDepthVector[3] = -fog->surface[3] + DotProduct( backEnd.ori.origin, fog->surface ); @@ -883,7 +874,7 @@ void RB_CalcFogTexCoords( float *st ) { s = DotProduct( v, fogDistanceVector ) + fogDistanceVector[3]; t = DotProduct( v, fogDepthVector ) + fogDepthVector[3]; - // partially clipped fogs use the T axis + // partially clipped fogs use the T axis if ( eyeOutside ) { if ( t < 1.0 ) { t = 1.0/32; // point is outside, so no fogging @@ -908,7 +899,7 @@ void RB_CalcFogTexCoords( float *st ) { /* ** RB_CalcEnvironmentTexCoords */ -void RB_CalcEnvironmentTexCoords( float *st ) +void RB_CalcEnvironmentTexCoords( float *st ) { int i; float *v, *normal; @@ -920,14 +911,14 @@ void RB_CalcEnvironmentTexCoords( float *st ) if (backEnd.currentEntity && backEnd.currentEntity->e.renderfx&RF_FIRST_PERSON) //this is a view model so we must use world lights instead of vieworg { - for (i = 0 ; i < tess.numVertexes ; i++, v += 4, normal += 4, st += 2 ) + for (i = 0 ; i < tess.numVertexes ; i++, v += 4, normal += 4, st += 2 ) { d = DotProduct (normal, backEnd.currentEntity->lightDir); st[0] = normal[0]*d - backEnd.currentEntity->lightDir[0]; st[1] = normal[1]*d - backEnd.currentEntity->lightDir[1]; } } else { //the normal way - for (i = 0 ; i < tess.numVertexes ; i++, v += 4, normal += 4, st += 2 ) + for (i = 0 ; i < tess.numVertexes ; i++, v += 4, normal += 4, st += 2 ) { VectorSubtract (backEnd.ori.viewOrigin, v, viewer); VectorNormalizeFast (viewer); @@ -1022,7 +1013,7 @@ void RB_CalcRotateTexCoords( float degsPerSecond, float *st ) int index; float sinValue, cosValue; texModInfo_t tmi; - + degs = -degsPerSecond * timeScale; index = degs * ( FUNCTABLE_SIZE / 360.0f ); @@ -1070,7 +1061,7 @@ void RB_CalcSpecularAlpha( unsigned char *alphas ) { for (i = 0 ; i < numVertexes ; i++, v += 4, normal += 4, alphas += 4) { float ilength; - if (backEnd.currentEntity && + if (backEnd.currentEntity && (backEnd.currentEntity->e.hModel||backEnd.currentEntity->e.ghoul2) ) //this is a model so we can use world lights instead fake light { VectorCopy (backEnd.currentEntity->lightDir, lightDir); @@ -1141,7 +1132,7 @@ void RB_CalcDiffuseColor( unsigned char *colors ) if ( incoming <= 0 ) { *(int *)&colors[i*4] = ambientLightInt; continue; - } + } j = Q_ftol( ambientLight[0] + incoming * directedLight[0] ); if ( j > 255 ) { j = 255; @@ -1212,7 +1203,7 @@ void RB_CalcDiffuseEntityColor( unsigned char *colors ) if ( incoming <= 0 ) { *(int *)&colors[i*4] = ambientLightInt; continue; - } + } j = ( ambientLight[0] + incoming * directedLight[0] ); if ( j > 255 ) { j = 255; @@ -1368,7 +1359,7 @@ void RB_CalcDisintegrateVertDeform( void ) { float threshold = (backEnd.refdef.time - backEnd.currentEntity->e.endTime) * 0.045f; - for ( int i = 0; i < tess.numVertexes; i++, xyz += 4, normal += 4 ) + for ( int i = 0; i < tess.numVertexes; i++, xyz += 4, normal += 4 ) { VectorSubtract( backEnd.currentEntity->e.oldorigin, xyz, temp ); diff --git a/code/rd-vanilla/tr_shader.cpp b/code/rd-vanilla/tr_shader.cpp index d268e029b5..d86af1cc87 100644 --- a/code/rd-vanilla/tr_shader.cpp +++ b/code/rd-vanilla/tr_shader.cpp @@ -1,54 +1,75 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - #include "tr_local.h" #include "tr_stl.h" -const int lightmapsNone[MAXLIGHTMAPS] = -{ +// tr_shader.c -- this file deals with the parsing and definition of shaders + +static char *s_shaderText; + +// the shader is parsed into these global variables, then copied into +// dynamically allocated memory if it is valid. +static shaderStage_t stages[MAX_SHADER_STAGES]; +static shader_t shader; +static texModInfo_t texMods[MAX_SHADER_STAGES][TR_MAX_TEXMODS]; + +// Hash value (generated using the generateHashValueForText function) for the original +// retail JKA shader for gfx/2d/wedge. +#define RETAIL_ROCKET_WEDGE_SHADER_HASH (1217042) + + +#define FILE_HASH_SIZE 1024 +static shader_t* sh_hashTable[FILE_HASH_SIZE]; + +const int lightmapsNone[MAXLIGHTMAPS] = +{ LIGHTMAP_NONE, LIGHTMAP_NONE, LIGHTMAP_NONE, - LIGHTMAP_NONE + LIGHTMAP_NONE }; -const int lightmaps2d[MAXLIGHTMAPS] = -{ +const int lightmaps2d[MAXLIGHTMAPS] = +{ LIGHTMAP_2D, LIGHTMAP_2D, LIGHTMAP_2D, - LIGHTMAP_2D + LIGHTMAP_2D }; -const int lightmapsVertex[MAXLIGHTMAPS] = -{ +const int lightmapsVertex[MAXLIGHTMAPS] = +{ LIGHTMAP_BY_VERTEX, LIGHTMAP_BY_VERTEX, LIGHTMAP_BY_VERTEX, - LIGHTMAP_BY_VERTEX + LIGHTMAP_BY_VERTEX }; -const int lightmapsFullBright[MAXLIGHTMAPS] = +const int lightmapsFullBright[MAXLIGHTMAPS] = { LIGHTMAP_WHITEIMAGE, LIGHTMAP_WHITEIMAGE, @@ -56,7 +77,7 @@ const int lightmapsFullBright[MAXLIGHTMAPS] = LIGHTMAP_WHITEIMAGE }; -const byte stylesDefault[MAXLIGHTMAPS] = +const byte stylesDefault[MAXLIGHTMAPS] = { LS_NORMAL, LS_NONE, @@ -64,105 +85,6 @@ const byte stylesDefault[MAXLIGHTMAPS] = LS_NONE }; - -///////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Vertex and Pixel Shader definitions. - AReis -/***********************************************************************************************************/ -// This vertex shader basically passes through most values and calculates no lighting. The only -// unusual thing it does is add the inputed texel offsets to all four texture units (this allows -// nearest neighbor pixel peeking). -const unsigned char g_strGlowVShaderARB[] = -{ - "!!ARBvp1.0\ - \ - # Input.\n\ - ATTRIB iPos = vertex.position;\ - ATTRIB iColor = vertex.color;\ - ATTRIB iTex0 = vertex.texcoord[0];\ - ATTRIB iTex1 = vertex.texcoord[1];\ - ATTRIB iTex2 = vertex.texcoord[2];\ - ATTRIB iTex3 = vertex.texcoord[3];\ - \ - # Output.\n\ - OUTPUT oPos = result.position;\ - OUTPUT oColor = result.color;\ - OUTPUT oTex0 = result.texcoord[0];\ - OUTPUT oTex1 = result.texcoord[1];\ - OUTPUT oTex2 = result.texcoord[2];\ - OUTPUT oTex3 = result.texcoord[3];\ - \ - # Constants.\n\ - PARAM ModelViewProj[4]= { state.matrix.mvp };\ - PARAM TexelOffset0 = program.env[0];\ - PARAM TexelOffset1 = program.env[1];\ - PARAM TexelOffset2 = program.env[2];\ - PARAM TexelOffset3 = program.env[3];\ - \ - # Main.\n\ - DP4 oPos.x, ModelViewProj[0], iPos;\ - DP4 oPos.y, ModelViewProj[1], iPos;\ - DP4 oPos.z, ModelViewProj[2], iPos;\ - DP4 oPos.w, ModelViewProj[3], iPos;\ - MOV oColor, iColor;\ - # Notice the optimization of using one texture coord instead of all four.\n\ - ADD oTex0, iTex0, TexelOffset0;\ - ADD oTex1, iTex0, TexelOffset1;\ - ADD oTex2, iTex0, TexelOffset2;\ - ADD oTex3, iTex0, TexelOffset3;\ - \ - END" -}; - -// This Pixel Shader loads four texture units and adds them all together (with a modifier -// multiplied to each in the process). The final output is r0 = t0 + t1 + t2 + t3. -const unsigned char g_strGlowPShaderARB[] = -{ - "!!ARBfp1.0\ - \ - # Input.\n\ - ATTRIB iColor = fragment.color.primary;\ - \ - # Output.\n\ - OUTPUT oColor = result.color;\ - \ - # Constants.\n\ - PARAM Weight = program.env[0];\ - TEMP t0;\ - TEMP t1;\ - TEMP t2;\ - TEMP t3;\ - TEMP r0;\ - \ - # Main.\n\ - TEX t0, fragment.texcoord[0], texture[0], RECT;\ - TEX t1, fragment.texcoord[1], texture[1], RECT;\ - TEX t2, fragment.texcoord[2], texture[2], RECT;\ - TEX t3, fragment.texcoord[3], texture[3], RECT;\ - \ - MUL r0, t0, Weight;\ - MAD r0, t1, Weight, r0;\ - MAD r0, t2, Weight, r0;\ - MAD r0, t3, Weight, r0;\ - \ - MOV oColor, r0;\ - \ - END" -}; -/***********************************************************************************************************/ - -// tr_shader.c -- this file deals with the parsing and definition of shaders - -static char *s_shaderText; - -// the shader is parsed into these global variables, then copied into -// dynamically allocated memory if it is valid. -static shaderStage_t stages[MAX_SHADER_STAGES]; -static shader_t shader; -static texModInfo_t texMods[MAX_SHADER_STAGES][TR_MAX_TEXMODS]; - -#define FILE_HASH_SIZE 1024 -static shader_t* sh_hashTable[FILE_HASH_SIZE]; - static void ClearGlobalShader(void) { int i; @@ -176,6 +98,19 @@ static void ClearGlobalShader(void) shader.contentFlags = CONTENTS_SOLID | CONTENTS_OPAQUE; } +static uint32_t generateHashValueForText( const char *string, size_t length ) +{ + int i = 0; + uint32_t hash = 0; + + while ( length-- ) + { + hash += string[i] * (i + 119); + i++; + } + + return (hash ^ (hash >> 10) ^ (hash >> 20)); +} /* ==================== @@ -337,7 +272,7 @@ NameToAFunc =============== */ static unsigned NameToAFunc( const char *funcname ) -{ +{ if ( !Q_stricmp( funcname, "GT0" ) ) { return GLS_ATEST_GT_0; @@ -918,7 +853,7 @@ static void ParseSurfaceSprites(const char *_text, shaderStage_t *stage ) stage->ss->fxDuration = 1000; // 1 second stage->ss->fxGrow[0] = 0.0; stage->ss->fxGrow[1] = 0.0; - stage->ss->fxAlphaStart = 1.0; + stage->ss->fxAlphaStart = 1.0; stage->ss->fxAlphaEnd = 0.0; } @@ -1507,6 +1442,8 @@ static qboolean ParseStage( shaderStage_t *stage, const char **text ) { vec3_t color; + VectorClear( color ); + ParseVector( text, 3, color ); stage->constantColor[0] = 255 * color[0]; stage->constantColor[1] = 255 * color[1]; @@ -1785,7 +1722,7 @@ static qboolean ParseStage( shaderStage_t *stage, const char **text ) // if ( stage->rgbGen == CGEN_BAD ) { if ( //blendSrcBits == 0 || - blendSrcBits == GLS_SRCBLEND_ONE || + blendSrcBits == GLS_SRCBLEND_ONE || blendSrcBits == GLS_SRCBLEND_SRC_ALPHA ) { stage->rgbGen = CGEN_IDENTITY_LIGHTING; } else { @@ -1797,7 +1734,7 @@ static qboolean ParseStage( shaderStage_t *stage, const char **text ) // // implicitly assume that a GL_ONE GL_ZERO blend mask disables blending // - if ( ( blendSrcBits == GLS_SRCBLEND_ONE ) && + if ( ( blendSrcBits == GLS_SRCBLEND_ONE ) && ( blendDstBits == GLS_DSTBLEND_ZERO ) ) { blendDstBits = blendSrcBits = 0; @@ -1815,9 +1752,9 @@ static qboolean ParseStage( shaderStage_t *stage, const char **text ) // // compute state bits // - stage->stateBits = depthMaskBits | - blendSrcBits | blendDstBits | - atestBits | + stage->stateBits = depthMaskBits | + blendSrcBits | blendDstBits | + atestBits | depthFuncBits; return qtrue; @@ -1875,7 +1812,7 @@ static void ParseDeform( const char **text ) { if ( !Q_stricmpn( token, "text", 4 ) ) { int n; - + n = token[4] - '0'; if ( n < 0 || n > 7 ) { n = 0; @@ -2027,7 +1964,6 @@ static void ParseSkyParms( const char **text ) { } R_InitSkyTexCoords( shader.sky->cloudHeight ); - // innerbox token = COM_ParseExt( text, qfalse ); if ( strcmp( token, "-" ) ) { @@ -2041,7 +1977,7 @@ static void ParseSkyParms( const char **text ) { ParseSort ================= */ -void ParseSort( const char **text ) +void ParseSort( const char **text ) { char *token; @@ -2057,7 +1993,7 @@ void ParseSort( const char **text ) shader.sort = SS_ENVIRONMENT; } else if ( !Q_stricmp( token, "opaque" ) ) { shader.sort = SS_OPAQUE; - }else if ( !Q_stricmp( token, "decal" ) ) { + } else if ( !Q_stricmp( token, "decal" ) ) { shader.sort = SS_DECAL; } else if ( !Q_stricmp( token, "seeThrough" ) ) { shader.sort = SS_SEE_THROUGH; @@ -2202,6 +2138,7 @@ will optimize it. static qboolean ParseShader( const char **text ) { char *token; + const char *begin = *text; int s = 0; COM_BeginParseSession(); @@ -2233,6 +2170,12 @@ static qboolean ParseShader( const char **text ) // stage definition else if ( token[0] == '{' ) { + if ( s >= MAX_SHADER_STAGES ) { + ri.Printf( PRINT_WARNING, "WARNING: too many stages in shader %s (max is %i)\n", shader.name, MAX_SHADER_STAGES ); + COM_EndParseSession(); + return qfalse; + } + if ( !ParseStage( &stages[s], text ) ) { COM_EndParseSession(); @@ -2244,25 +2187,34 @@ static qboolean ParseShader( const char **text ) { shader.hasGlow = true; } - s++; continue; } + // skip stuff that only the QuakeEdRadient needs + else if ( !Q_stricmpn( token, "qer", 3 ) ) { + SkipRestOfLine( text ); + continue; + } + // material deprecated as of 11 Jan 01 + // material undeprecated as of 7 May 01 - q3map_material deprecated + else if ( !Q_stricmp( token, "material" ) || !Q_stricmp( token, "q3map_material" ) ) + { + ParseMaterial( text ); + } // sun parms - else if ( !Q_stricmp( token, "sun" ) || !Q_stricmp( token, "q3map_sun" ) || !Q_stricmp( token, "q3map_sunExt" ) ) { - float a, b; - + else if ( !Q_stricmp( token, "sun" ) || !Q_stricmp( token, "q3map_sun" ) || !Q_stricmp( token, "q3map_sunExt" ) ) + { token = COM_ParseExt( text, qfalse ); tr.sunLight[0] = atof( token ); token = COM_ParseExt( text, qfalse ); tr.sunLight[1] = atof( token ); token = COM_ParseExt( text, qfalse ); tr.sunLight[2] = atof( token ); - + VectorNormalize( tr.sunLight ); token = COM_ParseExt( text, qfalse ); - a = atof( token ); + float a = atof( token ); VectorScale( tr.sunLight, a, tr.sunLight); token = COM_ParseExt( text, qfalse ); @@ -2270,7 +2222,7 @@ static qboolean ParseShader( const char **text ) a = a / 180 * M_PI; token = COM_ParseExt( text, qfalse ); - b = atof( token ); + float b = atof( token ); b = b / 180 * M_PI; tr.sunDirection[0] = cos( a ) * cos( b ); @@ -2280,7 +2232,25 @@ static qboolean ParseShader( const char **text ) SkipRestOfLine( text ); continue; } - else if ( !Q_stricmp( token, "deformVertexes" ) ) { + // q3map_surfacelight deprecated as of 16 Jul 01 + else if ( !Q_stricmp( token, "surfacelight" ) || !Q_stricmp( token, "q3map_surfacelight" ) ) + { + token = COM_ParseExt( text, qfalse ); + tr.sunSurfaceLight = atoi( token ); + } + else if ( !Q_stricmp( token, "lightColor" ) ) + { + /* + if ( !ParseVector( text, 3, tr.sunAmbient ) ) + { + return qfalse; + } + */ + //SP skips this so I'm skipping it here too. + SkipRestOfLine( text ); + continue; + } + else if ( !Q_stricmp( token, "deformvertexes" ) || !Q_stricmp( token, "deform" )) { ParseDeform( text ); continue; } @@ -2288,28 +2258,15 @@ static qboolean ParseShader( const char **text ) SkipRestOfLine( text ); continue; } - // skip stuff that only the QuakeEdRadient needs - else if ( !Q_stricmpn( token, "qer", 3 ) ) { + else if ( !Q_stricmp( token, "clampTime" ) ) { SkipRestOfLine( text ); - continue; } // skip stuff that only the q3map needs else if ( !Q_stricmpn( token, "q3map", 5 ) ) { SkipRestOfLine( text ); continue; } - // material deprecated as of 11 Jan 01 - // material undeprecated as of 7 May 01 - q3map_material deprecated - else if ( !Q_stricmp( token, "material" ) || !Q_stricmp( token, "q3map_material" ) ) - { - ParseMaterial( text ); - } - // skip stuff that JK2 doesn't use - else if ( !Q_stricmp( token, "lightColor") ) { - SkipRestOfLine( text ); - continue; - } - // surface parms + // skip stuff that only q3map or the server needs else if ( !Q_stricmp( token, "surfaceParm" ) ) { ParseSurfaceParm( text ); continue; @@ -2327,13 +2284,17 @@ static qboolean ParseShader( const char **text ) shader.noPicMip = true; continue; } + else if ( !Q_stricmp( token, "noglfog" ) ) + { + shader.fogPass = FP_NONE; + continue; + } // polygonOffset else if ( !Q_stricmp( token, "polygonOffset" ) ) { shader.polygonOffset = true; continue; } - // polygonOffset else if ( !Q_stricmp( token, "noTC" ) ) { shader.noTC = true; @@ -2349,7 +2310,7 @@ static qboolean ParseShader( const char **text ) continue; } // fogParms - else if ( !Q_stricmp( token, "fogParms" ) ) + else if ( !Q_stricmp( token, "fogParms" ) ) { shader.fogParms = (fogParms_t *)Hunk_Alloc( sizeof( fogParms_t ), qtrue ); if ( !ParseVector( text, 3, shader.fogParms->color ) ) { @@ -2358,7 +2319,7 @@ static qboolean ParseShader( const char **text ) } token = COM_ParseExt( text, qfalse ); - if ( !token[0] ) + if ( !token[0] ) { ri.Printf( PRINT_WARNING, "WARNING: missing parm for 'fogParms' keyword in shader '%s'\n", shader.name ); continue; @@ -2382,13 +2343,13 @@ static qboolean ParseShader( const char **text ) continue; } // light determines flaring in q3map, not needed here - else if ( !Q_stricmp(token, "light") ) + else if ( !Q_stricmp(token, "light") ) { token = COM_ParseExt( text, qfalse ); continue; } // cull - else if ( !Q_stricmp( token, "cull") ) + else if ( !Q_stricmp( token, "cull") ) { token = COM_ParseExt( text, qfalse ); if ( token[0] == 0 ) @@ -2468,6 +2429,22 @@ Ghoul2 Insert End shader.explicitlyDefined = true; + // The basejka rocket lock wedge shader uses the incorrect blending mode. + // It only worked because the shader state was not being set, and relied + // on previous state to be multiplied by alpha. Since fixing RB_RotatePic, + // the shader needs to be fixed here to render correctly. + // + // We match against the retail version of gfx/2d/wedge by calculating the + // hash value of the shader text, and comparing it against a precalculated + // value. + uint32_t shaderHash = generateHashValueForText( begin, *text - begin ); + if ( shaderHash == RETAIL_ROCKET_WEDGE_SHADER_HASH && + Q_stricmp( shader.name, "gfx/2d/wedge" ) == 0 ) + { + stages[0].stateBits &= ~(GLS_SRCBLEND_BITS | GLS_DSTBLEND_BITS); + stages[0].stateBits |= GLS_SRCBLEND_SRC_ALPHA | GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA; + } + COM_EndParseSession(); return qtrue; } @@ -3366,7 +3343,7 @@ static inline const int *R_FindLightmap( const int *lightmapIndex ) } // sync up render thread, because we're going to have to load an image - //R_SyncRenderThread(); + R_IssuePendingRenderCommands(); // // attempt to load an external lightmap Com_sprintf( fileName, sizeof(fileName), "%s/" EXTERNAL_LIGHTMAP, tr.worldDir, *lightmapIndex ); @@ -3453,7 +3430,7 @@ shader_t *R_FindShader( const char *name, const int *lightmapIndex, const byte * // make sure the render thread is stopped, because we are probably // going to have to upload an image - //R_SyncRenderThread(); + R_IssuePendingRenderCommands(); // // clear the global shader ClearGlobalShader(); @@ -3741,53 +3718,62 @@ static void ScanAndLoadShaderFiles( void ) { char **shaderFiles; char *buffers[MAX_SHADER_FILES]; - int bufferSizes[MAX_SHADER_FILES]; - int numShaders; + char *textEnd; + int numShaderFiles; int i; - long sum = 0; + long sum = 0, summand; // scan for shader files - shaderFiles = ri.FS_ListFiles( "shaders", ".shader", &numShaders ); + shaderFiles = ri.FS_ListFiles( "shaders", ".shader", &numShaderFiles ); - if ( !shaderFiles || !numShaders ) + if ( !shaderFiles || !numShaderFiles ) { - ri.Printf( PRINT_WARNING, "WARNING: no shader files found\n" ); + ri.Error( ERR_FATAL, "WARNING: no shader files found\n" ); return; } - if ( numShaders > MAX_SHADER_FILES ) { - numShaders = MAX_SHADER_FILES; + if ( numShaderFiles > MAX_SHADER_FILES ) { + numShaderFiles = MAX_SHADER_FILES; } // load and store shader files - for ( i = 0; i < numShaders; i++ ) + for ( i = 0; i < numShaderFiles; i++ ) { char filename[MAX_QPATH]; Com_sprintf( filename, sizeof( filename ), "shaders/%s", shaderFiles[i] ); //ri.Printf( PRINT_DEVELOPER, "...loading '%s'\n", filename ); // Looks like stripping out crap in the shaders will save about 200k - ri.FS_ReadFile( filename, (void **)&buffers[i] ); - if ( !buffers[i] ) { - Com_Error( ERR_DROP, "Couldn't load %s", filename ); - } - sum += (bufferSizes[i] = COM_Compress( buffers[i] )); - } + summand = ri.FS_ReadFile( filename, (void **)&buffers[i] ); + if ( !buffers[i] ) + ri.Error( ERR_DROP, "Couldn't load %s", filename ); - // free up memory - ri.FS_FreeFileList( shaderFiles ); + if ( buffers[i] ) + sum += summand; + } // build single large buffer - s_shaderText = (char *) Hunk_Alloc( sum + numShaders*2, qtrue ); + s_shaderText = (char *) Hunk_Alloc( sum + numShaderFiles*2, qtrue ); + s_shaderText[0] = '\0'; + textEnd = s_shaderText; // free in reverse order, so the temp files are all dumped - for ( i = numShaders - 1, sum = 0; i >= 0 ; i-- ) { - strcat( s_shaderText + sum, "\n" ); - strcat( s_shaderText + sum, buffers[i] ); - sum += bufferSizes[i]; + for ( i = numShaderFiles - 1; i >= 0 ; i-- ) + { + if ( !buffers[i] ) + continue; + + strcat( textEnd, buffers[i] ); + strcat( textEnd, "\n" ); + textEnd += strlen( textEnd ); ri.FS_FreeFile( buffers[i] ); } + COM_Compress( s_shaderText ); + + // free up memory + ri.FS_FreeFileList( shaderFiles ); + #ifdef USE_STL_FOR_SHADER_LOOKUPS SetupShaderEntryPtrs(); #endif @@ -3830,86 +3816,7 @@ static void CreateInternalShaders( void ) { tr.distortionShader = FinishShader(); shader.defaultShader = true; - - #define GL_PROGRAM_ERROR_STRING_ARB 0x8874 - #define GL_PROGRAM_ERROR_POSITION_ARB 0x864B - - // Allocate and Load the global 'Glow' Vertex Program. - AReis - if ( qglGenProgramsARB ) - { - qglGenProgramsARB( 1, &tr.glowVShader ); - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, tr.glowVShader ); - qglProgramStringARB( GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, ( GLsizei ) strlen( ( char * ) g_strGlowVShaderARB ), g_strGlowVShaderARB ); - -// const GLubyte *strErr = qglGetString( GL_PROGRAM_ERROR_STRING_ARB ); - int iErrPos = 0; - qglGetIntegerv( GL_PROGRAM_ERROR_POSITION_ARB, &iErrPos ); - assert( iErrPos == -1 ); - } - - // NOTE: I make an assumption here. If you have (current) nvidia hardware, you obviously support register combiners instead of fragment - // programs, so use those. The problem with this is that nv30 WILL support fragment shaders, breaking this logic. The good thing is that - // if you always ask for regcoms before fragment shaders, you'll always just use regcoms (problem solved... for now). - AReis - - // Load Pixel Shaders (either regcoms or fragprogs). - if ( qglCombinerParameteriNV ) - { - // The purpose of this regcom is to blend all the pixels together from the 4 texture units, but with their - // texture coordinates offset by 1 (or more) texels, effectively letting us blend adjoining pixels. The weight is - // used to either strengthen or weaken the pixel intensity. The more it diffuses (the higher the radius of the glow), - // the higher the intensity should be for a noticable effect. - // Regcom result is: ( tex1 * fBlurWeight ) + ( tex2 * fBlurWeight ) + ( tex2 * fBlurWeight ) + ( tex2 * fBlurWeight ) - - // VV guys, this is the pixel shader you would use instead :-) - /* - // c0 is the blur weight. - ps 1.1 - tex t0 - tex t1 - tex t2 - tex t3 - - mul r0, c0, t0; - madd r0, c0, t1, r0; - madd r0, c0, t2, r0; - madd r0, c0, t3, r0; - */ - tr.glowPShader = qglGenLists( 1 ); - qglNewList( tr.glowPShader, GL_COMPILE ); - qglCombinerParameteriNV( GL_NUM_GENERAL_COMBINERS_NV, 2 ); - - // spare0 = fBlend * tex0 + fBlend * tex1. - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, GL_CONSTANT_COLOR0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV, GL_TEXTURE1_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV, GL_CONSTANT_COLOR0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerOutputNV( GL_COMBINER0_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV, GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE ); - - // spare1 = fBlend * tex2 + fBlend * tex3. - qglCombinerInputNV( GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_A_NV, GL_TEXTURE2_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_B_NV, GL_CONSTANT_COLOR0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_C_NV, GL_TEXTURE3_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_D_NV, GL_CONSTANT_COLOR0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerOutputNV( GL_COMBINER1_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV, GL_SPARE1_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE ); - - // ( A * B ) + ( ( 1 - A ) * C ) + D = ( spare0 * 1 ) + ( ( 1 - spare0 ) * 0 ) + spare1 == spare0 + spare1. - qglFinalCombinerInputNV( GL_VARIABLE_A_NV, GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_B_NV, GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_C_NV, GL_ZERO, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_D_NV, GL_SPARE1_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglEndList(); - } - else if ( qglGenProgramsARB ) - { - qglGenProgramsARB( 1, &tr.glowPShader ); - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, tr.glowPShader ); - qglProgramStringARB( GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, ( GLsizei ) strlen( ( char * ) g_strGlowPShaderARB ), g_strGlowPShaderARB ); - -// const GLubyte *strErr = qglGetString( GL_PROGRAM_ERROR_STRING_ARB ); - int iErrPos = 0; - qglGetIntegerv( GL_PROGRAM_ERROR_POSITION_ARB, &iErrPos ); - assert( iErrPos == -1 ); - } + ARB_InitGlowShaders(); } static void CreateExternalShaders( void ) { diff --git a/code/rd-vanilla/tr_shadows.cpp b/code/rd-vanilla/tr_shadows.cpp index 01243b0286..0455d0881c 100644 --- a/code/rd-vanilla/tr_shadows.cpp +++ b/code/rd-vanilla/tr_shadows.cpp @@ -1,23 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software - -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" #include "tr_local.h" @@ -46,6 +48,7 @@ typedef struct { static edgeDef_t edgeDefs[SHADER_MAX_VERTEXES][MAX_EDGE_DEFS]; static int numEdgeDefs[SHADER_MAX_VERTEXES]; static int facing[SHADER_MAX_INDEXES/3]; +static vec3_t shadowXyz[SHADER_MAX_VERTEXES]; void R_AddEdgeDef( int i1, int i2, int facing ) { @@ -99,9 +102,9 @@ void R_RenderShadowEdges( void ) { i2 = edgeDefs[ i ][ j ].i2; qglBegin( GL_TRIANGLE_STRIP ); qglVertex3fv( tess.xyz[ i ] ); - qglVertex3fv( tess.xyz[ i + tess.numVertexes ] ); + qglVertex3fv( shadowXyz[ i ] ); qglVertex3fv( tess.xyz[ i2 ] ); - qglVertex3fv( tess.xyz[ i2 + tess.numVertexes ] ); + qglVertex3fv( shadowXyz[ i2 ] ); qglEnd(); #else hit[0] = 0; @@ -120,9 +123,9 @@ void R_RenderShadowEdges( void ) { if ( hit[ 1 ] == 0 ) { qglBegin( GL_TRIANGLE_STRIP ); qglVertex3fv( tess.xyz[ i ] ); - qglVertex3fv( tess.xyz[ i + tess.numVertexes ] ); + qglVertex3fv( shadowXyz[ i ] ); qglVertex3fv( tess.xyz[ i2 ] ); - qglVertex3fv( tess.xyz[ i2 + tess.numVertexes ] ); + qglVertex3fv( shadowXyz[ i2 ] ); qglEnd(); c_edges++; } else { @@ -154,9 +157,9 @@ void R_RenderShadowEdges( void ) { qglVertex3fv(tess.xyz[o3]); qglEnd(); qglBegin(GL_TRIANGLES); - qglVertex3fv(tess.xyz[o3 + tess.numVertexes]); - qglVertex3fv(tess.xyz[o2 + tess.numVertexes]); - qglVertex3fv(tess.xyz[o1 + tess.numVertexes]); + qglVertex3fv(shadowXyz[o3]); + qglVertex3fv(shadowXyz[o2]); + qglVertex3fv(shadowXyz[o1]); qglEnd(); } #endif @@ -225,11 +228,6 @@ void RB_DoShadowTessEnd( vec3_t lightPos ) int numTris; vec3_t lightDir; - // we can only do this if we have enough space in the vertex buffers - if ( tess.numVertexes >= SHADER_MAX_VERTEXES / 2 ) { - return; - } - if ( glConfig.stencilBits < 4 ) { return; } @@ -254,16 +252,16 @@ void RB_DoShadowTessEnd( vec3_t lightPos ) VectorAdd(tess.xyz[i], backEnd.ori.origin, worldxyz); groundDist = worldxyz[2] - backEnd.currentEntity->e.shadowPlane; groundDist += 16.0f; //fudge factor - VectorMA( tess.xyz[i], -groundDist, lightDir, tess.xyz[i+tess.numVertexes] ); + VectorMA( tess.xyz[i], -groundDist, lightDir, shadowXyz[i] ); } #else if (lightPos) { for ( i = 0 ; i < tess.numVertexes ; i++ ) { - tess.xyz[i+tess.numVertexes][0] = tess.xyz[i][0]+(( tess.xyz[i][0]-lightPos[0] )*128.0f); - tess.xyz[i+tess.numVertexes][1] = tess.xyz[i][1]+(( tess.xyz[i][1]-lightPos[1] )*128.0f); - tess.xyz[i+tess.numVertexes][2] = tess.xyz[i][2]+(( tess.xyz[i][2]-lightPos[2] )*128.0f); + shadowXyz[i][0] = tess.xyz[i][0]+(( tess.xyz[i][0]-lightPos[0] )*128.0f); + shadowXyz[i][1] = tess.xyz[i][1]+(( tess.xyz[i][1]-lightPos[1] )*128.0f); + shadowXyz[i][2] = tess.xyz[i][2]+(( tess.xyz[i][2]-lightPos[2] )*128.0f); } } else @@ -272,7 +270,7 @@ void RB_DoShadowTessEnd( vec3_t lightPos ) // project vertexes away from light direction for ( i = 0 ; i < tess.numVertexes ; i++ ) { - VectorMA( tess.xyz[i], -512, lightDir, tess.xyz[i+tess.numVertexes] ); + VectorMA( tess.xyz[i], -512, lightDir, shadowXyz[i] ); } } #endif @@ -726,4 +724,4 @@ void RB_DistortionFill(void) qglPopMatrix(); qglDisable( GL_STENCIL_TEST ); -} \ No newline at end of file +} diff --git a/code/rd-vanilla/tr_skin.cpp b/code/rd-vanilla/tr_skin.cpp new file mode 100644 index 0000000000..c950a3fe8f --- /dev/null +++ b/code/rd-vanilla/tr_skin.cpp @@ -0,0 +1,484 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#include "tr_local.h" + +#include + +#include "../qcommon/sstring.h" + +/* +============================================================================ + +SKINS + +============================================================================ +*/ + +/* +================== +CommaParse + +This is unfortunate, but the skin files aren't +compatible with our normal parsing rules. +================== +*/ +static char *CommaParse( char **data_p ) { + int c = 0, len; + char *data; + static char com_token[MAX_TOKEN_CHARS]; + + data = *data_p; + len = 0; + com_token[0] = 0; + + // make sure incoming data is valid + if ( !data ) { + *data_p = NULL; + return com_token; + } + + while ( 1 ) { + // skip whitespace + while( (c = *(const unsigned char* /*eurofix*/)data) <= ' ') { + if( !c ) { + break; + } + data++; + } + + + c = *data; + + // skip double slash comments + if ( c == '/' && data[1] == '/' ) + { + while (*data && *data != '\n') + data++; + } + // skip /* */ comments + else if ( c=='/' && data[1] == '*' ) + { + while ( *data && ( *data != '*' || data[1] != '/' ) ) + { + data++; + } + if ( *data ) + { + data += 2; + } + } + else + { + break; + } + } + + if ( c == 0 ) { + return ""; + } + + // handle quoted strings + if (c == '\"') + { + data++; + while (1) + { + c = *data++; + if (c=='\"' || !c) + { + com_token[len] = 0; + *data_p = ( char * ) data; + return com_token; + } + if (len < MAX_TOKEN_CHARS - 1) + { + com_token[len] = c; + len++; + } + } + } + + // parse a regular word + do + { + if (len < MAX_TOKEN_CHARS - 1) + { + com_token[len] = c; + len++; + } + data++; + c = *data; + } while (c>32 && c != ',' ); + + com_token[len] = 0; + + *data_p = ( char * ) data; + return com_token; +} + +/* +class CStringComparator +{ +public: + bool operator()(const char *s1, const char *s2) const { return(stricmp(s1, s2) < 0); } +}; +*/ +typedef std::map AnimationCFGs_t; + AnimationCFGs_t AnimationCFGs; + +// I added this function for development purposes (and it's VM-safe) so we don't have problems +// with our use of cached models but uncached animation.cfg files (so frame sequences are out of sync +// if someone rebuild the model while you're ingame and you change levels)... +// +// Usage: call with psDest == NULL for a size enquire (for malloc), +// then with NZ ptr for it to copy to your supplied buffer... +// +int RE_GetAnimationCFG(const char *psCFGFilename, char *psDest, int iDestSize) +{ + char *psText = NULL; + + AnimationCFGs_t::iterator it = AnimationCFGs.find(psCFGFilename); + if (it != AnimationCFGs.end()) + { + psText = (*it).second; + } + else + { + // not found, so load it... + // + fileHandle_t f; + int iLen = ri.FS_FOpenFileRead( psCFGFilename, &f, FS_READ ); + if (iLen <= 0) + { + return 0; + } + + psText = (char *) ri.Z_Malloc( iLen+1, TAG_ANIMATION_CFG, qfalse, 4 ); + + ri.FS_Read( psText, iLen, f ); + psText[iLen] = '\0'; + ri.FS_FCloseFile( f ); + + AnimationCFGs[psCFGFilename] = psText; + } + + if (psText) // sanity, but should always be NZ + { + if (psDest) + { + Q_strncpyz(psDest,psText,iDestSize); + } + + return strlen(psText); + } + + return 0; +} + +// only called from devmapbsp, devmapall, or ... +// +void RE_AnimationCFGs_DeleteAll(void) +{ + for (AnimationCFGs_t::iterator it = AnimationCFGs.begin(); it != AnimationCFGs.end(); ++it) + { + char *psText = (*it).second; + Z_Free(psText); + } + + AnimationCFGs.clear(); +} + +/* +=============== +RE_SplitSkins +input = skinname, possibly being a macro for three skins +return= true if three part skins found +output= qualified names to three skins if return is true, undefined if false +=============== +*/ +bool RE_SplitSkins(const char *INname, char *skinhead, char *skintorso, char *skinlower) +{ //INname= "models/players/jedi_tf/|head01_skin1|torso01|lower01"; + if (strchr(INname, '|')) + { + char name[MAX_QPATH]; + strcpy(name, INname); + char *p = strchr(name, '|'); + *p=0; + p++; + //fill in the base path + strcpy (skinhead, name); + strcpy (skintorso, name); + strcpy (skinlower, name); + + //now get the the individual files + + //advance to second + char *p2 = strchr(p, '|'); + if (!p2) + { + return false; + } + *p2=0; + p2++; + strcat (skinhead, p); + strcat (skinhead, ".skin"); + + + //advance to third + p = strchr(p2, '|'); + if (!p) + { + return false; + } + *p=0; + p++; + strcat (skintorso,p2); + strcat (skintorso, ".skin"); + + strcat (skinlower,p); + strcat (skinlower, ".skin"); + + return true; + } + return false; +} + +// given a name, go get the skin we want and return +qhandle_t RE_RegisterIndividualSkin( const char *name , qhandle_t hSkin) +{ + skin_t *skin; + skinSurface_t *surf; + char *text, *text_p; + char *token; + char surfName[MAX_QPATH]; + + // load and parse the skin file + ri.FS_ReadFile( name, (void **)&text ); + if ( !text ) { + ri.Printf( PRINT_WARNING, "WARNING: RE_RegisterSkin( '%s' ) failed to load!\n", name ); + return 0; + } + + assert (tr.skins[hSkin]); //should already be setup, but might be an 3part append + + skin = tr.skins[hSkin]; + + text_p = text; + while ( text_p && *text_p ) { + // get surface name + token = CommaParse( &text_p ); + Q_strncpyz( surfName, token, sizeof( surfName ) ); + + if ( !token[0] ) { + break; + } + // lowercase the surface name so skin compares are faster + Q_strlwr( surfName ); + + if ( *text_p == ',' ) { + text_p++; + } + + if ( !strncmp( token, "tag_", 4 ) ) { //these aren't in there, but just in case you load an id style one... + continue; + } + + // parse the shader name + token = CommaParse( &text_p ); + +#ifndef JK2_MODE + if ( !strcmp( &surfName[strlen(surfName)-4], "_off") ) + { + if ( !strcmp( token ,"*off" ) ) + { + continue; //don't need these double offs + } + surfName[strlen(surfName)-4] = 0; //remove the "_off" + } +#endif + if ( (unsigned)skin->numSurfaces >= ARRAY_LEN( skin->surfaces ) ) + { + assert( ARRAY_LEN( skin->surfaces ) > (unsigned)skin->numSurfaces ); + ri.Printf( PRINT_WARNING, "WARNING: RE_RegisterSkin( '%s' ) more than %u surfaces!\n", name, (unsigned int)ARRAY_LEN(skin->surfaces) ); + break; + } + surf = skin->surfaces[ skin->numSurfaces ] = (skinSurface_t *) Hunk_Alloc( sizeof( *skin->surfaces[0] ), qtrue ); + Q_strncpyz( surf->name, surfName, sizeof( surf->name ) ); + surf->shader = R_FindShader( token, lightmapsNone, stylesDefault, qtrue ); + skin->numSurfaces++; + } + + ri.FS_FreeFile( text ); + + + // never let a skin have 0 shaders + if ( skin->numSurfaces == 0 ) { + return 0; // use default skin + } + + return hSkin; +} + +/* +=============== +RE_RegisterSkin + +=============== +*/ +qhandle_t RE_RegisterSkin( const char *name) { + qhandle_t hSkin; + skin_t *skin; + +// if (!cls.cgameStarted && !cls.uiStarted) +// { + //rww - added uiStarted exception because we want ghoul2 models in the menus. + // gwg well we need our skins to set surfaces on and off, so we gotta get em + //return 1; // cope with Ghoul2's calling-the-renderer-before-its-even-started hackery, must be any NZ amount here to trigger configstring setting +// } + + if (!tr.numSkins) + { + R_InitSkins(); //make sure we have numSkins set to at least one. + } + + if ( !name || !name[0] ) { + Com_Printf( "Empty name passed to RE_RegisterSkin\n" ); + return 0; + } + + if ( strlen( name ) >= MAX_QPATH ) { + Com_Printf( "Skin name exceeds MAX_QPATH\n" ); + return 0; + } + + // see if the skin is already loaded + for ( hSkin = 1; hSkin < tr.numSkins ; hSkin++ ) { + skin = tr.skins[hSkin]; + if ( !Q_stricmp( skin->name, name ) ) { + if( skin->numSurfaces == 0 ) { + return 0; // default skin + } + return hSkin; + } + } + + if ( tr.numSkins == MAX_SKINS ) { + ri.Printf( PRINT_WARNING, "WARNING: RE_RegisterSkin( '%s' ) MAX_SKINS hit\n", name ); + return 0; + } + // allocate a new skin + tr.numSkins++; + skin = (skin_t*) Hunk_Alloc( sizeof( skin_t ), qtrue ); + tr.skins[hSkin] = skin; + Q_strncpyz( skin->name, name, sizeof( skin->name ) ); //always make one so it won't search for it again + + // If not a .skin file, load as a single shader - then return + if ( strcmp( name + strlen( name ) - 5, ".skin" ) ) { +#ifdef JK2_MODE + skin->numSurfaces = 1; + skin->surfaces[0] = (skinSurface_t *) Hunk_Alloc( sizeof(skin->surfaces[0]), qtrue ); + skin->surfaces[0]->shader = R_FindShader( name, lightmapsNone, stylesDefault, qtrue ); + return hSkin; +#endif +/* skin->numSurfaces = 1; + skin->surfaces[0] = (skinSurface_t *) Hunk_Alloc( sizeof(skin->surfaces[0]), qtrue ); + skin->surfaces[0]->shader = R_FindShader( name, lightmapsNone, stylesDefault, qtrue ); + return hSkin; +*/ + } + + char skinhead[MAX_QPATH]={0}; + char skintorso[MAX_QPATH]={0}; + char skinlower[MAX_QPATH]={0}; + if ( RE_SplitSkins(name, (char*)&skinhead, (char*)&skintorso, (char*)&skinlower ) ) + {//three part + hSkin = RE_RegisterIndividualSkin(skinhead, hSkin); + if (hSkin) + { + hSkin = RE_RegisterIndividualSkin(skintorso, hSkin); + if (hSkin) + { + hSkin = RE_RegisterIndividualSkin(skinlower, hSkin); + } + } + } + else + {//single skin + hSkin = RE_RegisterIndividualSkin(name, hSkin); + } + return(hSkin); +} + + + +/* +=============== +R_InitSkins +=============== +*/ +void R_InitSkins( void ) { + skin_t *skin; + + tr.numSkins = 1; + + // make the default skin have all default shaders + skin = tr.skins[0] = (skin_t*) Hunk_Alloc( sizeof( skin_t ), qtrue ); + Q_strncpyz( skin->name, "", sizeof( skin->name ) ); + skin->numSurfaces = 1; + skin->surfaces[0] = (skinSurface_t *) Hunk_Alloc( sizeof( *skin->surfaces[0] ), qtrue ); + skin->surfaces[0]->shader = tr.defaultShader; +} + +/* +=============== +R_GetSkinByHandle +=============== +*/ +skin_t *R_GetSkinByHandle( qhandle_t hSkin ) { + if ( hSkin < 1 || hSkin >= tr.numSkins ) { + return tr.skins[0]; + } + return tr.skins[ hSkin ]; +} + +/* +=============== +R_SkinList_f +=============== +*/ +void R_SkinList_f (void) { + int i, j; + skin_t *skin; + + ri.Printf (PRINT_ALL, "------------------\n"); + + for ( i = 0 ; i < tr.numSkins ; i++ ) { + skin = tr.skins[i]; + ri.Printf( PRINT_ALL, "%3i:%s\n", i, skin->name ); + for ( j = 0 ; j < skin->numSurfaces ; j++ ) { + ri.Printf( PRINT_ALL, " %s = %s\n", + skin->surfaces[j]->name, skin->surfaces[j]->shader->name ); + } + } + ri.Printf (PRINT_ALL, "------------------\n"); +} diff --git a/code/rd-vanilla/tr_sky.cpp b/code/rd-vanilla/tr_sky.cpp index a23645fc83..6703805689 100644 --- a/code/rd-vanilla/tr_sky.cpp +++ b/code/rd-vanilla/tr_sky.cpp @@ -1,28 +1,31 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // tr_sky.c -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - #include "tr_local.h" #define SKY_SUBDIVISIONS 8 @@ -39,14 +42,14 @@ POLYGON TO BOX SIDE PROJECTION =================================================================================== */ -static vec3_t sky_clip[6] = +static vec3_t sky_clip[6] = { {1,1,0}, {1,-1,0}, {0,-1,1}, {0,1,1}, {1,0,1}, - {-1,0,1} + {-1,0,1} }; static float sky_mins[2][6], sky_maxs[2][6]; @@ -143,14 +146,14 @@ static void AddSkyPolygon (int nump, vec3_t vecs) } } -#define ON_EPSILON 0.1 // point on plane side epsilon +#define ON_EPSILON 0.1f // point on plane side epsilon #define MAX_CLIP_VERTS 64 /* ================ ClipSkyPolygon ================ */ -static void ClipSkyPolygon (int nump, vec3_t vecs, int stage) +static void ClipSkyPolygon (int nump, vec3_t vecs, int stage) { float *norm; float *v; @@ -269,10 +272,10 @@ void RB_ClipSkyPolygons( shaderCommands_t *input ) for ( i = 0; i < input->numIndexes; i += 3 ) { - for (j = 0 ; j < 3 ; j++) + for (j = 0 ; j < 3 ; j++) { VectorSubtract( input->xyz[input->indexes[i+j]], - backEnd.viewParms.ori.origin, + backEnd.viewParms.ori.origin, p[j] ); } ClipSkyPolygon( 3, p[0], 0 ); @@ -292,7 +295,6 @@ CLOUD VERTEX GENERATION ** ** Parms: s, t range from -1 to 1 */ - static void MakeSkyVec( float s, float t, int axis, float outSt[2], vec3_t outXYZ ) { // 1 = s, 2 = t, 3 = 2048 @@ -417,22 +419,22 @@ static void DrawSkyBox( shader_t *shader ) sky_maxs_subd[0] = sky_maxs[0][i] * HALF_SKY_SUBDIVISIONS; sky_maxs_subd[1] = sky_maxs[1][i] * HALF_SKY_SUBDIVISIONS; - if ( sky_mins_subd[0] < -HALF_SKY_SUBDIVISIONS ) + if ( sky_mins_subd[0] < -HALF_SKY_SUBDIVISIONS ) sky_mins_subd[0] = -HALF_SKY_SUBDIVISIONS; - else if ( sky_mins_subd[0] > HALF_SKY_SUBDIVISIONS ) + else if ( sky_mins_subd[0] > HALF_SKY_SUBDIVISIONS ) sky_mins_subd[0] = HALF_SKY_SUBDIVISIONS; if ( sky_mins_subd[1] < -HALF_SKY_SUBDIVISIONS ) sky_mins_subd[1] = -HALF_SKY_SUBDIVISIONS; - else if ( sky_mins_subd[1] > HALF_SKY_SUBDIVISIONS ) + else if ( sky_mins_subd[1] > HALF_SKY_SUBDIVISIONS ) sky_mins_subd[1] = HALF_SKY_SUBDIVISIONS; - if ( sky_maxs_subd[0] < -HALF_SKY_SUBDIVISIONS ) + if ( sky_maxs_subd[0] < -HALF_SKY_SUBDIVISIONS ) sky_maxs_subd[0] = -HALF_SKY_SUBDIVISIONS; - else if ( sky_maxs_subd[0] > HALF_SKY_SUBDIVISIONS ) + else if ( sky_maxs_subd[0] > HALF_SKY_SUBDIVISIONS ) sky_maxs_subd[0] = HALF_SKY_SUBDIVISIONS; - if ( sky_maxs_subd[1] < -HALF_SKY_SUBDIVISIONS ) + if ( sky_maxs_subd[1] < -HALF_SKY_SUBDIVISIONS ) sky_maxs_subd[1] = -HALF_SKY_SUBDIVISIONS; - else if ( sky_maxs_subd[1] > HALF_SKY_SUBDIVISIONS ) + else if ( sky_maxs_subd[1] > HALF_SKY_SUBDIVISIONS ) sky_maxs_subd[1] = HALF_SKY_SUBDIVISIONS; // @@ -442,10 +444,10 @@ static void DrawSkyBox( shader_t *shader ) { for ( s = sky_mins_subd[0]+HALF_SKY_SUBDIVISIONS; s <= sky_maxs_subd[0]+HALF_SKY_SUBDIVISIONS; s++ ) { - MakeSkyVec( ( s - HALF_SKY_SUBDIVISIONS ) / ( float ) HALF_SKY_SUBDIVISIONS, - ( t - HALF_SKY_SUBDIVISIONS ) / ( float ) HALF_SKY_SUBDIVISIONS, - i, - s_skyTexCoords[t][s], + MakeSkyVec( ( s - HALF_SKY_SUBDIVISIONS ) / ( float ) HALF_SKY_SUBDIVISIONS, + ( t - HALF_SKY_SUBDIVISIONS ) / ( float ) HALF_SKY_SUBDIVISIONS, + i, + s_skyTexCoords[t][s], s_skyPoints[t][s] ); } } @@ -486,7 +488,7 @@ static void FillCloudySkySide( const int mins[2], const int maxs[2], qboolean ad // only add indexes for one pass, otherwise it would draw multiple times for each pass if ( addIndexes ) { for ( t = 0; t < tHeight-1; t++ ) - { + { for ( s = 0; s < sWidth-1; s++ ) { tess.indexes[tess.numIndexes] = vertexStart + s + t * ( sWidth ); @@ -561,22 +563,22 @@ static void FillCloudBox( const shader_t *shader, int stage ) sky_maxs_subd[0] = Q_ftol( sky_maxs[0][i] * HALF_SKY_SUBDIVISIONS ); sky_maxs_subd[1] = Q_ftol( sky_maxs[1][i] * HALF_SKY_SUBDIVISIONS ); - if ( sky_mins_subd[0] < -HALF_SKY_SUBDIVISIONS ) + if ( sky_mins_subd[0] < -HALF_SKY_SUBDIVISIONS ) sky_mins_subd[0] = -HALF_SKY_SUBDIVISIONS; - else if ( sky_mins_subd[0] > HALF_SKY_SUBDIVISIONS ) + else if ( sky_mins_subd[0] > HALF_SKY_SUBDIVISIONS ) sky_mins_subd[0] = HALF_SKY_SUBDIVISIONS; if ( sky_mins_subd[1] < MIN_T ) sky_mins_subd[1] = MIN_T; - else if ( sky_mins_subd[1] > HALF_SKY_SUBDIVISIONS ) + else if ( sky_mins_subd[1] > HALF_SKY_SUBDIVISIONS ) sky_mins_subd[1] = HALF_SKY_SUBDIVISIONS; - if ( sky_maxs_subd[0] < -HALF_SKY_SUBDIVISIONS ) + if ( sky_maxs_subd[0] < -HALF_SKY_SUBDIVISIONS ) sky_maxs_subd[0] = -HALF_SKY_SUBDIVISIONS; - else if ( sky_maxs_subd[0] > HALF_SKY_SUBDIVISIONS ) + else if ( sky_maxs_subd[0] > HALF_SKY_SUBDIVISIONS ) sky_maxs_subd[0] = HALF_SKY_SUBDIVISIONS; if ( sky_maxs_subd[1] < MIN_T ) sky_maxs_subd[1] = MIN_T; - else if ( sky_maxs_subd[1] > HALF_SKY_SUBDIVISIONS ) + else if ( sky_maxs_subd[1] > HALF_SKY_SUBDIVISIONS ) sky_maxs_subd[1] = HALF_SKY_SUBDIVISIONS; // @@ -586,9 +588,9 @@ static void FillCloudBox( const shader_t *shader, int stage ) { for ( s = sky_mins_subd[0]+HALF_SKY_SUBDIVISIONS; s <= sky_maxs_subd[0]+HALF_SKY_SUBDIVISIONS; s++ ) { - MakeSkyVec( ( s - HALF_SKY_SUBDIVISIONS ) / ( float ) HALF_SKY_SUBDIVISIONS, - ( t - HALF_SKY_SUBDIVISIONS ) / ( float ) HALF_SKY_SUBDIVISIONS, - i, + MakeSkyVec( ( s - HALF_SKY_SUBDIVISIONS ) / ( float ) HALF_SKY_SUBDIVISIONS, + ( t - HALF_SKY_SUBDIVISIONS ) / ( float ) HALF_SKY_SUBDIVISIONS, + i, NULL, s_skyPoints[t][s] ); @@ -653,20 +655,20 @@ void R_InitSkyTexCoords( float heightCloud ) for ( s = 0; s <= SKY_SUBDIVISIONS; s++ ) { // compute vector from view origin to sky side integral point - MakeSkyVec( ( s - HALF_SKY_SUBDIVISIONS ) / ( float ) HALF_SKY_SUBDIVISIONS, - ( t - HALF_SKY_SUBDIVISIONS ) / ( float ) HALF_SKY_SUBDIVISIONS, - i, + MakeSkyVec( ( s - HALF_SKY_SUBDIVISIONS ) / ( float ) HALF_SKY_SUBDIVISIONS, + ( t - HALF_SKY_SUBDIVISIONS ) / ( float ) HALF_SKY_SUBDIVISIONS, + i, NULL, skyVec ); // compute parametric value 'p' that intersects with cloud layer p = ( 1.0f / ( 2 * DotProduct( skyVec, skyVec ) ) ) * - ( -2 * skyVec[2] * radiusWorld + - 2 * sqrt( SQR( skyVec[2] ) * SQR( radiusWorld ) + + ( -2 * skyVec[2] * radiusWorld + + 2 * sqrt( SQR( skyVec[2] ) * SQR( radiusWorld ) + 2 * SQR( skyVec[0] ) * radiusWorld * heightCloud + - SQR( skyVec[0] ) * SQR( heightCloud ) + + SQR( skyVec[0] ) * SQR( heightCloud ) + 2 * SQR( skyVec[1] ) * radiusWorld * heightCloud + - SQR( skyVec[1] ) * SQR( heightCloud ) + + SQR( skyVec[1] ) * SQR( heightCloud ) + 2 * SQR( skyVec[2] ) * radiusWorld * heightCloud + SQR( skyVec[2] ) * SQR( heightCloud ) ) ); diff --git a/code/rd-vanilla/tr_stl.cpp b/code/rd-vanilla/tr_stl.cpp index 8724682712..f3648d1b37 100644 --- a/code/rd-vanilla/tr_stl.cpp +++ b/code/rd-vanilla/tr_stl.cpp @@ -1,30 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - -#ifdef _MSC_VER -#pragma warning(disable : 4786) // identifier was truncated -#endif - // Filename:- tr_stl.cpp // // I mainly made this file because I was getting sick of all the stupid error messages in MS's STL implementation, @@ -34,22 +31,13 @@ This file is part of Jedi Academy. #include "tr_local.h" // this isn't actually needed other than getting rid of warnings via pragmas #include "tr_stl.h" -#ifdef _MSC_VER -#pragma warning( push,3 ) - -#pragma warning(disable : 4514) // unreferenced inline function has been removed (within STL, not this code) -#pragma warning(disable : 4710) // -#pragma warning(disable : 4503) // decorated name length xceeded, name was truncated -#endif - #include #include "../qcommon/sstring.h" // #include -using namespace std; -typedef map ShaderEntryPtrs_t; +typedef std::map ShaderEntryPtrs_t; +typedef ShaderEntryPtrs_t::size_type ShaderEntryPtr_size; ShaderEntryPtrs_t ShaderEntryPtrs; - void ShaderEntryPtrs_Clear(void) { ShaderEntryPtrs.clear(); @@ -61,8 +49,7 @@ int ShaderEntryPtrs_Size(void) return ShaderEntryPtrs.size(); } - -void ShaderEntryPtrs_Insert(const char *token, const char *p) +void ShaderEntryPtrs_Insert(const char *token, const char *p) { ShaderEntryPtrs_t::iterator it = ShaderEntryPtrs.find(token); @@ -76,8 +63,6 @@ void ShaderEntryPtrs_Insert(const char *token, const char *p) } } - - // returns NULL if not found... // const char *ShaderEntryPtrs_Lookup(const char *psShaderName) @@ -91,8 +76,3 @@ const char *ShaderEntryPtrs_Lookup(const char *psShaderName) return NULL; } - -#ifdef _MSC_VER -#pragma warning ( pop ) -#endif - diff --git a/code/rd-vanilla/tr_stl.h b/code/rd-vanilla/tr_stl.h index 556eb62404..e974722fea 100644 --- a/code/rd-vanilla/tr_stl.h +++ b/code/rd-vanilla/tr_stl.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename: tr_stl.h // diff --git a/code/rd-vanilla/tr_subs.cpp b/code/rd-vanilla/tr_subs.cpp index 58cf70cb38..5e511b10db 100644 --- a/code/rd-vanilla/tr_subs.cpp +++ b/code/rd-vanilla/tr_subs.cpp @@ -1,4 +1,27 @@ -//Anything above this #include will be ignored by the compiler +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "../server/exe_headers.h" // tr_subs.cpp - common function replacements for modular renderer @@ -69,13 +92,3 @@ int Z_MemSize( memtag_t eTag ) { void Z_MorphMallocTag( void *pvBuffer, memtag_t eDesiredTag ) { ri.Z_MorphMallocTag( pvBuffer, eDesiredTag ); } - -#ifndef _WIN32 -void Sys_SetEnv(const char *name, const char *value) -{ - if(value && *value) - setenv(name, value, 1); - else - unsetenv(name); -} -#endif diff --git a/code/rd-vanilla/tr_surface.cpp b/code/rd-vanilla/tr_surface.cpp index a5d37bed23..3b1b34d9cb 100644 --- a/code/rd-vanilla/tr_surface.cpp +++ b/code/rd-vanilla/tr_surface.cpp @@ -1,28 +1,30 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // tr_surf.c -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - #include "tr_local.h" /* @@ -49,16 +51,10 @@ RB_CheckOverflow ============== */ void RB_CheckOverflow( int verts, int indexes ) { - if ( tess.shader == tr.shadowShader ) { - if (tess.numVertexes + verts < SHADER_MAX_VERTEXES/2 - && tess.numIndexes + indexes < SHADER_MAX_INDEXES) { - return; - } - } else - if (tess.numVertexes + verts < SHADER_MAX_VERTEXES - && tess.numIndexes + indexes < SHADER_MAX_INDEXES) { - return; - } + if (tess.numVertexes + verts < SHADER_MAX_VERTEXES + && tess.numIndexes + indexes < SHADER_MAX_INDEXES) { + return; + } RB_EndSurface(); @@ -118,7 +114,7 @@ void RB_AddQuadStampExt( vec3_t origin, vec3_t left, vec3_t up, byte *color, flo tess.normal[ndx][0] = tess.normal[ndx+1][0] = tess.normal[ndx+2][0] = tess.normal[ndx+3][0] = normal[0]; tess.normal[ndx][1] = tess.normal[ndx+1][1] = tess.normal[ndx+2][1] = tess.normal[ndx+3][1] = normal[1]; tess.normal[ndx][2] = tess.normal[ndx+1][2] = tess.normal[ndx+2][2] = tess.normal[ndx+3][2] = normal[2]; - + // standard square texture coordinates tess.texCoords[ndx][0][0] = tess.texCoords[ndx][1][0] = s1; tess.texCoords[ndx][0][1] = tess.texCoords[ndx][1][1] = t1; @@ -134,11 +130,15 @@ void RB_AddQuadStampExt( vec3_t origin, vec3_t left, vec3_t up, byte *color, flo // constant color all the way around // should this be identity and let the shader specify from entity? - * ( unsigned int * ) &tess.vertexColors[ndx] = - * ( unsigned int * ) &tess.vertexColors[ndx+1] = - * ( unsigned int * ) &tess.vertexColors[ndx+2] = - * ( unsigned int * ) &tess.vertexColors[ndx+3] = - * ( unsigned int * )color; + byteAlias_t *baSource = (byteAlias_t *)color, *baDest; + baDest = (byteAlias_t *)&tess.vertexColors[ndx + 0]; + baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[ndx + 1]; + baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[ndx + 2]; + baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[ndx + 3]; + baDest->ui = baSource->ui; tess.numVertexes += 4; tess.numIndexes += 6; @@ -170,7 +170,7 @@ static void RB_SurfaceSprite( void ) { } else { float s, c; float ang; - + ang = M_PI * backEnd.currentEntity->e.rotation / 180; s = sin( ang ); c = cos( ang ); @@ -202,17 +202,17 @@ static void RB_SurfaceOrientedQuad( void ) radius = backEnd.currentEntity->e.radius; MakeNormalVectors( backEnd.currentEntity->e.axis[0], left, up ); - if ( backEnd.currentEntity->e.rotation == 0 ) + if ( backEnd.currentEntity->e.rotation == 0 ) { VectorScale( left, radius, left ); VectorScale( up, radius, up ); - } - else + } + else { vec3_t tempLeft, tempUp; float s, c; float ang; - + ang = M_PI * backEnd.currentEntity->e.rotation / 180; s = sin( ang ); c = cos( ang ); @@ -228,7 +228,7 @@ static void RB_SurfaceOrientedQuad( void ) VectorCopy( tempLeft, left ); } - if ( backEnd.viewParms.isMirror ) + if ( backEnd.viewParms.isMirror ) { VectorSubtract( vec3_origin, left, left ); } @@ -247,13 +247,13 @@ RB_SurfaceLine // STScale (how many times to loop a texture) // alpha // RGB -// +// // Values for proper line object... // lifetime // dscale // startalpha, endalpha // startRGB, endRGB -// +// static void DoLine( const vec3_t start, const vec3_t end, const vec3_t up, float spanWidth ) { @@ -369,7 +369,7 @@ static void DoLine2( const vec3_t start, const vec3_t end, const vec3_t up, floa //----------------- // RB_SurfaceLine //----------------- -static void RB_SurfaceLine( void ) +static void RB_SurfaceLine( void ) { refEntity_t *e; vec3_t right; @@ -441,7 +441,7 @@ static void RB_SurfaceCone( void ) { segments = NUM_CYLINDER_SEGMENTS; } - + // Get the direction vector MakeNormalVectors( e->axis[0], vr, vu ); @@ -469,7 +469,7 @@ static void RB_SurfaceCone( void ) RotatePointAroundVector( points[i], e->axis[0], vu, detail * i ); VectorAdd( points[i], base, points[i] ); } - + // Calculate the texture coords so the texture can wrap around the whole cylinder detail = 1.0f / (float)segments; @@ -573,7 +573,7 @@ static void RB_SurfaceCylinder( void ) { segments = NUM_CYLINDER_SEGMENTS; } - + //Get the direction vector MakeNormalVectors( e->axis[0], vr, vu ); @@ -588,12 +588,12 @@ static void RB_SurfaceCylinder( void ) //Upper ring RotatePointAroundVector( upper_points[i], e->axis[0], vu, detail * i ); VectorAdd( upper_points[i], e->origin, upper_points[i] ); - + //Lower ring RotatePointAroundVector( lower_points[i], e->axis[0], v1, detail * i ); VectorAdd( lower_points[i], e->oldorigin, lower_points[i] ); } - + // Calculate the texture coords so the texture can wrap around the whole cylinder detail = 1.0f / (float)segments; @@ -650,7 +650,7 @@ static void RB_SurfaceCylinder( void ) tess.indexes[tess.numIndexes++] = vbase + 2; tess.indexes[tess.numIndexes++] = vbase + 1; - tess.indexes[tess.numIndexes++] = vbase + 3; + tess.indexes[tess.numIndexes++] = vbase + 3; vbase += 2; } @@ -717,7 +717,7 @@ static void ApplyShape( vec3_t start, vec3_t end, vec3_t right, float sradius, f VectorMA( point2, 1.0f - perc, end, point2 ); VectorMA( point2, dis * sh2[1], rt, point2 ); VectorMA( point2, dis * sh2[2], up, point2 ); - + // recursion ApplyShape( point2, point1, right, rads1, rads2, count - 1, startPerc * 0.333f + endPerc * 0.666f, startPerc * 0.666f + endPerc * 0.333f ); ApplyShape( point2, end, right, rads2, eradius, count - 1, startPerc * 0.333f + endPerc * 0.666f, endPerc ); @@ -748,7 +748,7 @@ static void DoBoltSeg( vec3_t start, vec3_t end, vec3_t right, float radius ) MakeNormalVectors( fwd, rt, up ); VectorCopy( start, old ); - + newRadius = oldRadius = radius; for ( i = 16; i <= dis; i+= 16 ) @@ -788,7 +788,7 @@ static void DoBoltSeg( vec3_t start, vec3_t end, vec3_t right, float radius ) // Apply the random shape to our line seg to give it some micro-detail-jaggy-coolness. ApplyShape( cur, old, right, newRadius, oldRadius, 2 - r_lodbias->integer, 0, 1 ); - + // randomly split off to create little tendrils, but don't do it too close to the end and especially if we are not even of the forked variety if (( e->renderfx & RF_FORKED ) && f_count > 0 && Q_random(&e->frame) > 0.93f && (1.0f - perc) > 0.8f ) { @@ -805,7 +805,7 @@ static void DoBoltSeg( vec3_t start, vec3_t end, vec3_t right, float radius ) { newDest[t] += Q_crandom(&e->frame) * 80; } - + // we could branch off using OLD and NEWDEST, but that would allow multiple forks...whereas, we just want simpler brancing DoBoltSeg( cur, newDest, right, newRadius ); } @@ -862,7 +862,7 @@ static void RB_SurfaceElectricity() f_count = 3; DoBoltSeg( start, end, right, radius ); } - + /* ============= RB_SurfacePolychain @@ -920,9 +920,9 @@ void RB_SurfacePolychain( srfPoly_t *p ) { VectorCopy( p->verts[i].xyz, tess.xyz[numv] ); tess.texCoords[numv][0][0] = p->verts[i].st[0]; tess.texCoords[numv][0][1] = p->verts[i].st[1]; - *(int *)&tess.vertexColors[numv] = *(int *)p->verts[ i ].modulate; - - numv++; + byteAlias_t *baDest = (byteAlias_t *)&tess.vertexColors[numv++], + *baSource = (byteAlias_t *)&p->verts[ i ].modulate; + baDest->i = baSource->i; } // generate fan indexes into the tess array @@ -1004,14 +1004,14 @@ void RB_SurfaceTriangles( srfTriangles_t *srf ) { texCoords = tess.texCoords[ tess.numVertexes ][0]; color = tess.vertexColors[ tess.numVertexes ]; - for ( i = 0 ; i < srf->numVerts ; i++, dv++) + for ( i = 0 ; i < srf->numVerts ; i++, dv++) { xyz[0] = dv->xyz[0]; xyz[1] = dv->xyz[1]; xyz[2] = dv->xyz[2]; xyz += 4; - //if ( needsNormal ) + //if ( needsNormal ) { normal[0] = dv->normal[0]; normal[1] = dv->normal[1]; @@ -1054,7 +1054,7 @@ void RB_SurfaceTriangles( srfTriangles_t *srf ) { RB_SurfaceBeam ============== */ -static void RB_SurfaceBeam( void ) +static void RB_SurfaceBeam( void ) { #define NUM_BEAM_SEGS 6 refEntity_t *e; @@ -1122,12 +1122,12 @@ static void RB_SurfaceBeam( void ) //------------------ // DoSprite //------------------ -static void DoSprite( vec3_t origin, float radius, float rotation ) +static void DoSprite( vec3_t origin, float radius, float rotation ) { float s, c; float ang; vec3_t left, up; - + ang = M_PI * rotation / 180.0f; s = sin( ang ); c = cos( ang ); @@ -1138,7 +1138,7 @@ static void DoSprite( vec3_t origin, float radius, float rotation ) VectorScale( backEnd.viewParms.ori.axis[2], c * radius, up ); VectorMA( up, s * radius, backEnd.viewParms.ori.axis[1], up ); - if ( backEnd.viewParms.isMirror ) + if ( backEnd.viewParms.isMirror ) { VectorSubtract( vec3_origin, left, left ); } @@ -1150,7 +1150,7 @@ static void DoSprite( vec3_t origin, float radius, float rotation ) // RB_SurfaceSaber //------------------ static void RB_SurfaceSaberGlow() -{ +{ vec3_t end; refEntity_t *e; @@ -1174,7 +1174,7 @@ static void RB_SurfaceSaberGlow() /* ** LerpMeshVertexes */ -static void LerpMeshVertexes (md3Surface_t *surf, float backlerp) +static void LerpMeshVertexes (md3Surface_t *surf, float backlerp) { short *oldXyz, *newXyz, *oldNormals, *newNormals; float *outXyz, *outNormal; @@ -1202,7 +1202,7 @@ static void LerpMeshVertexes (md3Surface_t *surf, float backlerp) // for (vertNum=0 ; vertNum < numVerts ; vertNum++, newXyz += 4, newNormals += 4, - outXyz += 4, outNormal += 4) + outXyz += 4, outNormal += 4) { outXyz[0] = newXyz[0] * newXyzScale; @@ -1234,7 +1234,7 @@ static void LerpMeshVertexes (md3Surface_t *surf, float backlerp) for (vertNum=0 ; vertNum < numVerts ; vertNum++, oldXyz += 4, newXyz += 4, oldNormals += 4, newNormals += 4, - outXyz += 4, outNormal += 4) + outXyz += 4, outNormal += 4) { vec3_t uncompressedOldNormal, uncompressedNewNormal; @@ -1353,7 +1353,7 @@ void RB_SurfaceFace( srfSurfaceFace_t *surf ) { ndx = tess.numVertexes; numPoints = surf->numPoints; - + //if ( tess.shader->needsNormal ) { normal = surf->plane.normal; @@ -1392,11 +1392,16 @@ static float LodErrorForVolume( vec3_t local, float radius ) { vec3_t world; float d; - world[0] = local[0] * backEnd.ori.axis[0][0] + local[1] * backEnd.ori.axis[1][0] + + // never let it go negative + if ( r_lodCurveError->value < 0 ) { + return 0; + } + + world[0] = local[0] * backEnd.ori.axis[0][0] + local[1] * backEnd.ori.axis[1][0] + local[2] * backEnd.ori.axis[2][0] + backEnd.ori.origin[0]; - world[1] = local[0] * backEnd.ori.axis[0][1] + local[1] * backEnd.ori.axis[1][1] + + world[1] = local[0] * backEnd.ori.axis[0][1] + local[1] * backEnd.ori.axis[1][1] + local[2] * backEnd.ori.axis[2][1] + backEnd.ori.origin[1]; - world[2] = local[0] * backEnd.ori.axis[0][2] + local[1] * backEnd.ori.axis[1][2] + + world[2] = local[0] * backEnd.ori.axis[0][2] + local[1] * backEnd.ori.axis[1][2] + local[2] * backEnd.ori.axis[2][2] + backEnd.ori.origin[2]; VectorSubtract( world, backEnd.viewParms.ori.origin, world ); @@ -1487,7 +1492,7 @@ void RB_SurfaceGrid( srfGridMesh_t *cv ) { break; } } while ( 1 ); - + rows = irows; if ( vrows < irows + 1 ) { rows = vrows - 1; @@ -1524,7 +1529,7 @@ void RB_SurfaceGrid( srfGridMesh_t *cv ) { } texCoords += NUM_TEX_COORDS*2; -// if ( needsNormal ) +// if ( needsNormal ) { normal[0] = dv->normal[0]; normal[1] = dv->normal[1]; @@ -1548,7 +1553,7 @@ void RB_SurfaceGrid( srfGridMesh_t *cv ) { for (i = 0 ; i < h ; i++) { for (j = 0 ; j < w ; j++) { int v1, v2, v3, v4; - + // vertex order to be reckognized as tristrips v1 = numVertexes + i*lodWidth + j + 1; v2 = v1 - 1; @@ -1558,7 +1563,7 @@ void RB_SurfaceGrid( srfGridMesh_t *cv ) { tess.indexes[numIndexes] = v2; tess.indexes[numIndexes+1] = v3; tess.indexes[numIndexes+2] = v1; - + tess.indexes[numIndexes+3] = v1; tess.indexes[numIndexes+4] = v3; tess.indexes[numIndexes+5] = v4; @@ -1595,7 +1600,7 @@ static void RB_SurfaceLathe() { refEntity_t *e; vec2_t pt, oldpt, l_oldpt; - vec2_t pt2, oldpt2, l_oldpt2; + vec2_t pt2, oldpt2, l_oldpt2; float bezierStep, latheStep; float temp, mu, mum1; float mum13, mu3, group1, group2; @@ -1666,7 +1671,7 @@ static void RB_SurfaceLathe() pt2[1] = s * pt2[0] + c * pt2[1]; pt2[0] = temp; - RB_CHECKOVERFLOW( 4, 6 ); + RB_CHECKOVERFLOW( 4, 6 ); vbase = tess.numVertexes; @@ -1743,13 +1748,13 @@ static void RB_SurfaceLathe() static void RB_SurfaceClouds() { // Disk definition - float diskStripDef[DISK_DEF] = { + float diskStripDef[DISK_DEF] = { 0.0f, 0.4f, 0.7f, 1.0f }; - float diskAlphaDef[DISK_DEF] = { + float diskAlphaDef[DISK_DEF] = { 1.0f, 1.0f, 0.4f, @@ -1762,7 +1767,7 @@ static void RB_SurfaceClouds() 0.02f }; // tube definition - float tubeStripDef[TUBE_DEF] = { + float tubeStripDef[TUBE_DEF] = { 0.0f, 0.05f, 0.1f, @@ -1770,7 +1775,7 @@ static void RB_SurfaceClouds() 0.7f, 1.0f }; - float tubeAlphaDef[TUBE_DEF] = { + float tubeAlphaDef[TUBE_DEF] = { 0.0f, 0.45f, 1.0f, @@ -1778,7 +1783,7 @@ static void RB_SurfaceClouds() 0.45f, 0.0f }; - float tubeCurveDef[TUBE_DEF] = { + float tubeCurveDef[TUBE_DEF] = { 0.0f, 0.004f, 0.006f, @@ -1847,7 +1852,7 @@ static void RB_SurfaceClouds() VectorSet( pt2, (stripDef[i+1] * (e->radius - e->rotation)) + e->rotation, 0, curveDef[i+1] * e->radius * e->backlerp ); } - RB_CHECKOVERFLOW( 4, 6 ); + RB_CHECKOVERFLOW( 4, 6 ); vbase = tess.numVertexes; @@ -1855,8 +1860,8 @@ static void RB_SurfaceClouds() VectorAdd( e->origin, oldpt, tess.xyz[tess.numVertexes] ); tess.texCoords[tess.numVertexes][0][0] = tess.xyz[tess.numVertexes][0] * 0.1f; tess.texCoords[tess.numVertexes][0][1] = tess.xyz[tess.numVertexes][1] * 0.1f; - tess.vertexColors[tess.numVertexes][0] = - tess.vertexColors[tess.numVertexes][1] = + tess.vertexColors[tess.numVertexes][0] = + tess.vertexColors[tess.numVertexes][1] = tess.vertexColors[tess.numVertexes][2] = e->shaderRGBA[0] * alphaDef[i]; tess.vertexColors[tess.numVertexes][3] = e->shaderRGBA[3]; tess.numVertexes++; @@ -1864,8 +1869,8 @@ static void RB_SurfaceClouds() VectorAdd( e->origin, oldpt2, tess.xyz[tess.numVertexes] ); tess.texCoords[tess.numVertexes][0][0] = tess.xyz[tess.numVertexes][0] * 0.1f; tess.texCoords[tess.numVertexes][0][1] = tess.xyz[tess.numVertexes][1] * 0.1f; - tess.vertexColors[tess.numVertexes][0] = - tess.vertexColors[tess.numVertexes][1] = + tess.vertexColors[tess.numVertexes][0] = + tess.vertexColors[tess.numVertexes][1] = tess.vertexColors[tess.numVertexes][2] = e->shaderRGBA[0] * alphaDef[i+1]; tess.vertexColors[tess.numVertexes][3] = e->shaderRGBA[3]; tess.numVertexes++; @@ -1873,8 +1878,8 @@ static void RB_SurfaceClouds() VectorAdd( e->origin, pt, tess.xyz[tess.numVertexes] ); tess.texCoords[tess.numVertexes][0][0] = tess.xyz[tess.numVertexes][0] * 0.1f; tess.texCoords[tess.numVertexes][0][1] = tess.xyz[tess.numVertexes][1] * 0.1f; - tess.vertexColors[tess.numVertexes][0] = - tess.vertexColors[tess.numVertexes][1] = + tess.vertexColors[tess.numVertexes][0] = + tess.vertexColors[tess.numVertexes][1] = tess.vertexColors[tess.numVertexes][2] = e->shaderRGBA[0] * alphaDef[i]; tess.vertexColors[tess.numVertexes][3] = e->shaderRGBA[3]; tess.numVertexes++; @@ -1882,8 +1887,8 @@ static void RB_SurfaceClouds() VectorAdd( e->origin, pt2, tess.xyz[tess.numVertexes] ); tess.texCoords[tess.numVertexes][0][0] = tess.xyz[tess.numVertexes][0] * 0.1f; tess.texCoords[tess.numVertexes][0][1] = tess.xyz[tess.numVertexes][1] * 0.1f; - tess.vertexColors[tess.numVertexes][0] = - tess.vertexColors[tess.numVertexes][1] = + tess.vertexColors[tess.numVertexes][0] = + tess.vertexColors[tess.numVertexes][1] = tess.vertexColors[tess.numVertexes][2] = e->shaderRGBA[0] * alphaDef[i+1]; tess.vertexColors[tess.numVertexes][3] = e->shaderRGBA[3]; tess.numVertexes++; @@ -1968,7 +1973,7 @@ void RB_SurfaceEntity( surfaceType_t *surfType ) { break; case RT_CYLINDER: RB_SurfaceCylinder(); - break; + break; case RT_LATHE: RB_SurfaceLathe(); break; @@ -2000,7 +2005,7 @@ static bool RB_TestZFlare( vec3_t point) { // if the point is off the screen, don't bother adding it // calculate screen coordinates and depth - R_TransformModelToClip( point, backEnd.ori.modelMatrix, + R_TransformModelToClip( point, backEnd.ori.modelMatrix, backEnd.viewParms.projectionMatrix, eye, clip ); // check to see if the point is completely off screen @@ -2031,7 +2036,7 @@ static bool RB_TestZFlare( vec3_t point) { glState.finishCalled = qfalse; qglReadPixels( backEnd.viewParms.viewportX + window[0],backEnd.viewParms.viewportY + window[1], 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth ); - screenZ = backEnd.viewParms.projectionMatrix[14] / + screenZ = backEnd.viewParms.projectionMatrix[14] / ( ( 2*depth - 1 ) * backEnd.viewParms.projectionMatrix[11] - backEnd.viewParms.projectionMatrix[10] ); visible = ( -eye[2] - -screenZ ) < 24; @@ -2102,8 +2107,8 @@ void RB_SurfaceSkip( void *surf ) { } void (*rb_surfaceTable[SF_NUM_SURFACE_TYPES])( void *) = { - (void(*)(void*))RB_SurfaceBad, // SF_BAD, - (void(*)(void*))RB_SurfaceSkip, // SF_SKIP, + (void(*)(void*))RB_SurfaceBad, // SF_BAD, + (void(*)(void*))RB_SurfaceSkip, // SF_SKIP, (void(*)(void*))RB_SurfaceFace, // SF_FACE, (void(*)(void*))RB_SurfaceGrid, // SF_GRID, (void(*)(void*))RB_SurfaceTriangles, // SF_TRIANGLES, diff --git a/code/rd-vanilla/tr_surfacesprites.cpp b/code/rd-vanilla/tr_surfacesprites.cpp index 1649fc41da..8dcf9d84e3 100644 --- a/code/rd-vanilla/tr_surfacesprites.cpp +++ b/code/rd-vanilla/tr_surfacesprites.cpp @@ -1,28 +1,29 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // tr_surfacesprites.c -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - #include "tr_quicksprite.h" #include "tr_WorldEffects.h" #include //for isnan diff --git a/code/rd-vanilla/tr_world.cpp b/code/rd-vanilla/tr_world.cpp index 17d8c05f24..479fce17c3 100644 --- a/code/rd-vanilla/tr_world.cpp +++ b/code/rd-vanilla/tr_world.cpp @@ -1,23 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" #include "tr_local.h" diff --git a/code/sdl/sdl_glimp.cpp b/code/sdl/sdl_glimp.cpp deleted file mode 100644 index d9e56410c9..0000000000 --- a/code/sdl/sdl_glimp.cpp +++ /dev/null @@ -1,1090 +0,0 @@ -#include -#include "../qcommon/q_shared.h" -#include "../qcommon/qcommon.h" -#include "../rd-vanilla/tr_local.h" -#include "sdl_qgl.h" -#include "../sys/sys_local.h" - -//static SDL_Window *window = NULL; - -static float displayAspect; -cvar_t *r_allowSoftwareGL; // Don't abort out if a hardware visual can't be obtained -cvar_t *r_allowResize; // make window resizable -cvar_t *r_sdlDriver; - -typedef enum -{ - RSERR_OK, - - RSERR_INVALID_FULLSCREEN, - RSERR_INVALID_MODE, - - RSERR_UNKNOWN -} rserr_t; - -static SDL_Window *screen = NULL; -static SDL_GLContext opengl_context; - -bool g_bTextureRectangleHack = false; - -void (APIENTRYP qglActiveTextureARB) (GLenum texture); -void (APIENTRYP qglClientActiveTextureARB) (GLenum texture); -void (APIENTRYP qglMultiTexCoord2fARB) (GLenum target, GLfloat s, GLfloat t); - -void (APIENTRYP qglCombinerParameterfvNV) (GLenum pname,const GLfloat *params); -void (APIENTRYP qglCombinerParameterivNV) (GLenum pname,const GLint *params); -void (APIENTRYP qglCombinerParameterfNV) (GLenum pname,GLfloat param); -void (APIENTRYP qglCombinerParameteriNV) (GLenum pname,GLint param); -void (APIENTRYP qglCombinerInputNV) (GLenum stage,GLenum portion,GLenum variable,GLenum input,GLenum mapping, - GLenum componentUsage); -void (APIENTRYP qglCombinerOutputNV) (GLenum stage,GLenum portion,GLenum abOutput,GLenum cdOutput,GLenum sumOutput, - GLenum scale, GLenum bias,GLboolean abDotProduct,GLboolean cdDotProduct, - GLboolean muxSum); - -void (APIENTRYP qglFinalCombinerInputNV) (GLenum variable,GLenum input,GLenum mapping,GLenum componentUsage); -void (APIENTRYP qglGetCombinerInputParameterfvNV) (GLenum stage,GLenum portion,GLenum variable,GLenum pname,GLfloat *params); -void (APIENTRYP qglGetCombinerInputParameterivNV) (GLenum stage,GLenum portion,GLenum variable,GLenum pname,GLint *params); -void (APIENTRYP qglGetCombinerOutputParameterfvNV) (GLenum stage,GLenum portion,GLenum pname,GLfloat *params); -void (APIENTRYP qglGetCombinerOutputParameterivNV) (GLenum stage,GLenum portion,GLenum pname,GLint *params); -void (APIENTRYP qglGetFinalCombinerInputParameterfvNV) (GLenum variable,GLenum pname,GLfloat *params); -void (APIENTRYP qglGetFinalCombinerInputParameterivNV) (GLenum variable,GLenum pname,GLint *params); - -PFNGLPROGRAMSTRINGARBPROC qglProgramStringARB = NULL; -PFNGLBINDPROGRAMARBPROC qglBindProgramARB = NULL; -PFNGLDELETEPROGRAMSARBPROC qglDeleteProgramsARB = NULL; -PFNGLGENPROGRAMSARBPROC qglGenProgramsARB = NULL; -PFNGLPROGRAMENVPARAMETER4DARBPROC qglProgramEnvParameter4dARB = NULL; -PFNGLPROGRAMENVPARAMETER4DVARBPROC qglProgramEnvParameter4dvARB = NULL; -PFNGLPROGRAMENVPARAMETER4FARBPROC qglProgramEnvParameter4fARB = NULL; -PFNGLPROGRAMENVPARAMETER4FVARBPROC qglProgramEnvParameter4fvARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4DARBPROC qglProgramLocalParameter4dARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4DVARBPROC qglProgramLocalParameter4dvARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4FARBPROC qglProgramLocalParameter4fARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4FVARBPROC qglProgramLocalParameter4fvARB = NULL; -PFNGLGETPROGRAMENVPARAMETERDVARBPROC qglGetProgramEnvParameterdvARB = NULL; -PFNGLGETPROGRAMENVPARAMETERFVARBPROC qglGetProgramEnvParameterfvARB = NULL; -PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC qglGetProgramLocalParameterdvARB = NULL; -PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC qglGetProgramLocalParameterfvARB = NULL; -PFNGLGETPROGRAMIVARBPROC qglGetProgramivARB = NULL; -PFNGLGETPROGRAMSTRINGARBPROC qglGetProgramStringARB = NULL; -PFNGLISPROGRAMARBPROC qglIsProgramARB = NULL; - -void ( * qglLockArraysEXT)( int, int); -void ( * qglUnlockArraysEXT) ( void ); - -/* -=============== -GLimp_Minimize - -Minimize the game so that user is back at the desktop -=============== -*/ -void GLimp_Minimize(void) -{ - SDL_MinimizeWindow( screen ); -} - -void GLimp_EndFrame( void ) -{ - SDL_GL_SwapWindow(screen); -} - -/* -=============== -GLimp_CompareModes -=============== -*/ -static int GLimp_CompareModes( const void *a, const void *b ) -{ - const float ASPECT_EPSILON = 0.001f; - SDL_Rect *modeA = (SDL_Rect *)a; - SDL_Rect *modeB = (SDL_Rect *)b; - float aspectA = (float)modeA->w / (float)modeA->h; - float aspectB = (float)modeB->w / (float)modeB->h; - int areaA = modeA->w * modeA->h; - int areaB = modeB->w * modeB->h; - float aspectDiffA = fabs( aspectA - displayAspect ); - float aspectDiffB = fabs( aspectB - displayAspect ); - float aspectDiffsDiff = aspectDiffA - aspectDiffB; - - if( aspectDiffsDiff > ASPECT_EPSILON ) - return 1; - else if( aspectDiffsDiff < -ASPECT_EPSILON ) - return -1; - else - return areaA - areaB; -} - -/* -=============== -GLimp_DetectAvailableModes -=============== -*/ -static bool GLimp_DetectAvailableModes(void) -{ - int i; - char buf[ MAX_STRING_CHARS ] = { 0 }; - SDL_Rect modes[ 128 ]; - int numModes = 0; - - int display = SDL_GetWindowDisplayIndex( screen ); - SDL_DisplayMode windowMode; - - if( SDL_GetWindowDisplayMode( screen, &windowMode ) < 0 ) - { - Com_Printf( "Couldn't get window display mode, no resolutions detected (%s).\n", SDL_GetError() ); - return false; - } - - int numDisplayModes = SDL_GetNumDisplayModes( display ); - for( i = 0; i < numDisplayModes; i++ ) - { - SDL_DisplayMode mode; - - if( SDL_GetDisplayMode( display, i, &mode ) < 0 ) - continue; - - if( !mode.w || !mode.h ) - { - Com_Printf( "Display supports any resolution\n" ); - return true; - } - - if( windowMode.format != mode.format ) - continue; - - modes[ numModes ].w = mode.w; - modes[ numModes ].h = mode.h; - numModes++; - } - - if( numModes > 1 ) - qsort( modes, numModes, sizeof( SDL_Rect ), GLimp_CompareModes ); - - for( i = 0; i < numModes; i++ ) - { - const char *newModeString = va( "%ux%u ", modes[ i ].w, modes[ i ].h ); - - if( strlen( newModeString ) < (int)sizeof( buf ) - strlen( buf ) ) - Q_strcat( buf, sizeof( buf ), newModeString ); - else - Com_Printf( "Skipping mode %ux%x, buffer too small\n", modes[ i ].w, modes[ i ].h ); - } - - if( *buf ) - { - buf[ strlen( buf ) - 1 ] = 0; - Com_Printf( "Available modes: '%s'\n", buf ); - ri.Cvar_Set( "r_availableModes", buf ); - } - - return true; -} - -/* -=============== -GLimp_SetMode -=============== -*/ -static rserr_t GLimp_SetMode(int mode, qboolean fullscreen, qboolean noborder) -{ - const char *glstring; - int perChannelColorBits; - int colorBits, depthBits, stencilBits; - //int samples; - int i = 0; - //SDL_Surface *icon = NULL; - Uint32 flags = SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL; - SDL_DisplayMode desktopMode; - int display = 0; - int x = SDL_WINDOWPOS_UNDEFINED, y = SDL_WINDOWPOS_UNDEFINED; - - Com_Printf( "Initializing OpenGL display\n"); - - if ( r_allowResize->integer && !fullscreen ) - flags |= SDL_WINDOW_RESIZABLE; - - /*icon = SDL_CreateRGBSurfaceFrom( - (void *)CLIENT_WINDOW_ICON.pixel_data, - CLIENT_WINDOW_ICON.width, - CLIENT_WINDOW_ICON.height, - CLIENT_WINDOW_ICON.bytes_per_pixel * 8, - CLIENT_WINDOW_ICON.bytes_per_pixel * CLIENT_WINDOW_ICON.width, -#ifdef Q3_LITTLE_ENDIAN - 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 -#else - 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF -#endif - );*/ - - // If a window exists, note its display index - if( screen != NULL ) - display = SDL_GetWindowDisplayIndex( screen ); - - if( SDL_GetDesktopDisplayMode( display, &desktopMode ) == 0 ) - { - displayAspect = (float)desktopMode.w / (float)desktopMode.h; - - Com_Printf( "Display aspect: %.3f\n", displayAspect ); - } - else - { - memset( &desktopMode, 0, sizeof( SDL_DisplayMode ) ); - - Com_Printf( "Cannot determine display aspect, assuming 1.333\n" ); - } - - Com_Printf( "...setting mode %d:", mode ); - - if (mode == -2) - { - // use desktop video resolution - if( desktopMode.h > 0 ) - { - glConfig.vidWidth = desktopMode.w; - glConfig.vidHeight = desktopMode.h; - } - else - { - glConfig.vidWidth = 640; - glConfig.vidHeight = 480; - Com_Printf( "Cannot determine display resolution, assuming 640x480\n" ); - } - - //glConfig.windowAspect = (float)glConfig.vidWidth / (float)glConfig.vidHeight; - } - else if ( !R_GetModeInfo( &glConfig.vidWidth, &glConfig.vidHeight, /*&glConfig.windowAspect,*/ mode ) ) - { - Com_Printf( " invalid mode\n" ); - return RSERR_INVALID_MODE; - } - Com_Printf( " %d %d\n", glConfig.vidWidth, glConfig.vidHeight); - - // Center window - if( r_centerWindow->integer && !fullscreen ) - { - x = ( desktopMode.w / 2 ) - ( glConfig.vidWidth / 2 ); - y = ( desktopMode.h / 2 ) - ( glConfig.vidHeight / 2 ); - } - - // Destroy existing state if it exists - if( opengl_context != NULL ) - { - SDL_GL_DeleteContext( opengl_context ); - opengl_context = NULL; - } - - if( screen != NULL ) - { - SDL_GetWindowPosition( screen, &x, &y ); - Com_DPrintf( "Existing window at %dx%d before being destroyed\n", x, y ); - SDL_DestroyWindow( screen ); - screen = NULL; - } - - if( fullscreen ) - { - flags |= SDL_WINDOW_FULLSCREEN; - glConfig.isFullscreen = qtrue; - } - else - { - if( noborder ) - flags |= SDL_WINDOW_BORDERLESS; - - glConfig.isFullscreen = qfalse; - } - - colorBits = r_colorbits->value; - if ((!colorBits) || (colorBits >= 32)) - colorBits = 24; - - if (!r_depthbits->value) - depthBits = 24; - else - depthBits = r_depthbits->value; - - stencilBits = r_stencilbits->value; - //samples = r_ext_multisample->value; - - for (i = 0; i < 16; i++) - { - int testColorBits, testDepthBits, testStencilBits; - - // 0 - default - // 1 - minus colorBits - // 2 - minus depthBits - // 3 - minus stencil - if ((i % 4) == 0 && i) - { - // one pass, reduce - switch (i / 4) - { - case 2 : - if (colorBits == 24) - colorBits = 16; - break; - case 1 : - if (depthBits == 24) - depthBits = 16; - else if (depthBits == 16) - depthBits = 8; - case 3 : - if (stencilBits == 24) - stencilBits = 16; - else if (stencilBits == 16) - stencilBits = 8; - } - } - - testColorBits = colorBits; - testDepthBits = depthBits; - testStencilBits = stencilBits; - - if ((i % 4) == 3) - { // reduce colorBits - if (testColorBits == 24) - testColorBits = 16; - } - - if ((i % 4) == 2) - { // reduce depthBits - if (testDepthBits == 24) - testDepthBits = 16; - else if (testDepthBits == 16) - testDepthBits = 8; - } - - if ((i % 4) == 1) - { // reduce stencilBits - if (testStencilBits == 24) - testStencilBits = 16; - else if (testStencilBits == 16) - testStencilBits = 8; - else - testStencilBits = 0; - } - - if (testColorBits == 24) - perChannelColorBits = 8; - else - perChannelColorBits = 4; - -#ifdef __sgi /* Fix for SGIs grabbing too many bits of color */ - if (perChannelColorBits == 4) - perChannelColorBits = 0; /* Use minimum size for 16-bit color */ - - /* Need alpha or else SGIs choose 36+ bit RGB mode */ - SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 1); -#endif - - SDL_GL_SetAttribute( SDL_GL_RED_SIZE, perChannelColorBits ); - SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, perChannelColorBits ); - SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, perChannelColorBits ); - SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, testDepthBits ); - SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, testStencilBits ); - - /*SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, samples ? 1 : 0 ); - SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, samples );*/ - - if(r_stereo->integer) - { - glConfig.stereoEnabled = qtrue; - SDL_GL_SetAttribute(SDL_GL_STEREO, 1); - } - else - { - glConfig.stereoEnabled = qfalse; - SDL_GL_SetAttribute(SDL_GL_STEREO, 0); - } - - SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); - - // If not allowing software GL, demand accelerated - if( !r_allowSoftwareGL->integer ) - SDL_GL_SetAttribute( SDL_GL_ACCELERATED_VISUAL, 1 ); - - if( ( screen = SDL_CreateWindow( CLIENT_WINDOW_TITLE, x, y, - glConfig.vidWidth, glConfig.vidHeight, flags ) ) == NULL ) - { - Com_DPrintf( "SDL_CreateWindow failed: %s\n", SDL_GetError( ) ); - continue; - } - - if( fullscreen ) - { - SDL_DisplayMode mode; - - switch( testColorBits ) - { - case 16: mode.format = SDL_PIXELFORMAT_RGB565; break; - case 24: mode.format = SDL_PIXELFORMAT_RGB24; break; - default: Com_DPrintf( "testColorBits is %d, can't fullscreen\n", testColorBits ); continue; - } - - mode.w = glConfig.vidWidth; - mode.h = glConfig.vidHeight; - mode.refresh_rate = glConfig.displayFrequency = ri.Cvar_VariableIntegerValue( "r_displayRefresh" ); - mode.driverdata = NULL; - - if( SDL_SetWindowDisplayMode( screen, &mode ) < 0 ) - { - Com_DPrintf( "SDL_SetWindowDisplayMode failed: %s\n", SDL_GetError( ) ); - continue; - } - } - - SDL_SetWindowTitle( screen, CLIENT_WINDOW_TITLE ); - //SDL_SetWindowIcon( screen, icon ); - - if( ( opengl_context = SDL_GL_CreateContext( screen ) ) == NULL ) - { - Com_Printf( "SDL_GL_CreateContext failed: %s\n", SDL_GetError( ) ); - continue; - } - - SDL_GL_SetSwapInterval( r_swapInterval->integer ); - - glConfig.colorBits = testColorBits; - glConfig.depthBits = testDepthBits; - glConfig.stencilBits = testStencilBits; - - Com_Printf( "Using %d color bits, %d depth, %d stencil display.\n", - glConfig.colorBits, glConfig.depthBits, glConfig.stencilBits ); - break; - } - - /*SDL_FreeSurface( icon );*/ - - if (!GLimp_DetectAvailableModes()) - { - return RSERR_UNKNOWN; - } - - glstring = (char *) qglGetString (GL_RENDERER); - Com_Printf( "GL_RENDERER: %s\n", glstring ); - - return RSERR_OK; -} - -/* -=============== -GLimp_StartDriverAndSetMode -=============== -*/ -static qboolean GLimp_StartDriverAndSetMode(int mode, qboolean fullscreen, qboolean noborder) -{ - rserr_t err; - - if (!SDL_WasInit(SDL_INIT_VIDEO)) - { - const char *driverName; - - if (SDL_Init(SDL_INIT_VIDEO) == -1) - { - Com_Printf( "SDL_Init( SDL_INIT_VIDEO ) FAILED (%s)\n", - SDL_GetError()); - return qfalse; - } - - if (!SDL_GetNumVideoDrivers()) - { - Com_Printf( "SDL_GetNumVideoDrivers( ) FAILED (%s)\n", - SDL_GetError()); - return qfalse; - } - - // - // TODO: Prompt the user to choose a specific video driver. - driverName = SDL_GetVideoDriver( 0 ); - Com_Printf( "SDL using driver \"%s\"\n", driverName ); - ri.Cvar_Set( "r_sdlDriver", driverName ); - } - - if (fullscreen && ri.Cvar_VariableIntegerValue( "in_nograb" ) ) - { - Com_Printf( "Fullscreen not allowed with in_nograb 1\n"); - ri.Cvar_Set( "r_fullscreen", "0" ); - r_fullscreen->modified = qfalse; - fullscreen = qfalse; - } - - err = GLimp_SetMode(mode, fullscreen, noborder); - - switch ( err ) - { - case RSERR_INVALID_FULLSCREEN: - Com_Printf( "...WARNING: fullscreen unavailable in this mode\n" ); - return qfalse; - case RSERR_INVALID_MODE: - Com_Printf( "...WARNING: could not set the given mode (%d)\n", mode ); - return qfalse; - case RSERR_UNKNOWN: - Com_Printf( "...ERROR: no display modes could be found.\n" ); - return qfalse; - default: - break; - } - - return qtrue; -} - -/* -** GLW_CheckForExtension - - Cannot use strstr directly to differentiate between (for eg) reg_combiners and reg_combiners2 -*/ - -bool GL_CheckForExtension(const char *ext) -{ - const char *ptr = Q_stristr( glConfig.extensions_string, ext ); - if (ptr == NULL) - return false; - ptr += strlen(ext); - return ((*ptr == ' ') || (*ptr == '\0')); // verify it's complete string. -} - -static void GLW_InitTextureCompression( void ) -{ - bool newer_tc, old_tc; - - // Check for available tc methods. - newer_tc = GL_CheckForExtension("ARB_texture_compression") && GL_CheckForExtension("EXT_texture_compression_s3tc"); - old_tc = GL_CheckForExtension("GL_S3_s3tc"); - - if ( old_tc ) - { - Com_Printf ("...GL_S3_s3tc available\n" ); - } - - if ( newer_tc ) - { - Com_Printf ("...GL_EXT_texture_compression_s3tc available\n" ); - } - - if ( !r_ext_compressed_textures->value ) - { - // Compressed textures are off - glConfig.textureCompression = TC_NONE; - Com_Printf ("...ignoring texture compression\n" ); - } - else if ( !old_tc && !newer_tc ) - { - // Requesting texture compression, but no method found - glConfig.textureCompression = TC_NONE; - Com_Printf ("...no supported texture compression method found\n" ); - Com_Printf (".....ignoring texture compression\n" ); - } - else - { - // some form of supported texture compression is avaiable, so see if the user has a preference - if ( r_ext_preferred_tc_method->integer == TC_NONE ) - { - // No preference, so pick the best - if ( newer_tc ) - { - Com_Printf ("...no tc preference specified\n" ); - Com_Printf (".....using GL_EXT_texture_compression_s3tc\n" ); - glConfig.textureCompression = TC_S3TC_DXT; - } - else - { - Com_Printf ("...no tc preference specified\n" ); - Com_Printf (".....using GL_S3_s3tc\n" ); - glConfig.textureCompression = TC_S3TC; - } - } - else - { - // User has specified a preference, now see if this request can be honored - if ( old_tc && newer_tc ) - { - // both are avaiable, so we can use the desired tc method - if ( r_ext_preferred_tc_method->integer == TC_S3TC ) - { - Com_Printf ("...using preferred tc method, GL_S3_s3tc\n" ); - glConfig.textureCompression = TC_S3TC; - } - else - { - Com_Printf ("...using preferred tc method, GL_EXT_texture_compression_s3tc\n" ); - glConfig.textureCompression = TC_S3TC_DXT; - } - } - else - { - // Both methods are not available, so this gets trickier - if ( r_ext_preferred_tc_method->integer == TC_S3TC ) - { - // Preferring to user older compression - if ( old_tc ) - { - Com_Printf ("...using GL_S3_s3tc\n" ); - glConfig.textureCompression = TC_S3TC; - } - else - { - // Drat, preference can't be honored - Com_Printf ("...preferred tc method, GL_S3_s3tc not available\n" ); - Com_Printf (".....falling back to GL_EXT_texture_compression_s3tc\n" ); - glConfig.textureCompression = TC_S3TC_DXT; - } - } - else - { - // Preferring to user newer compression - if ( newer_tc ) - { - Com_Printf ("...using GL_EXT_texture_compression_s3tc\n" ); - glConfig.textureCompression = TC_S3TC_DXT; - } - else - { - // Drat, preference can't be honored - Com_Printf ("...preferred tc method, GL_EXT_texture_compression_s3tc not available\n" ); - Com_Printf (".....falling back to GL_S3_s3tc\n" ); - glConfig.textureCompression = TC_S3TC; - } - } - } - } - } -} - -/* -=============== -GLimp_InitExtensions -=============== -*/ -extern bool g_bDynamicGlowSupported; -static void GLimp_InitExtensions( void ) -{ - if ( !r_allowExtensions->integer ) - { - Com_Printf ("*** IGNORING OPENGL EXTENSIONS ***\n" ); - g_bDynamicGlowSupported = false; - ri.Cvar_Set( "r_DynamicGlow","0" ); - return; - } - - Com_Printf ("Initializing OpenGL extensions\n" ); - - // Select our tc scheme - GLW_InitTextureCompression(); - - // GL_EXT_texture_env_add - glConfig.textureEnvAddAvailable = qfalse; - if ( GL_CheckForExtension( "EXT_texture_env_add" ) ) - { - if ( r_ext_texture_env_add->integer ) - { - glConfig.textureEnvAddAvailable = qtrue; - Com_Printf ("...using GL_EXT_texture_env_add\n" ); - } - else - { - glConfig.textureEnvAddAvailable = qfalse; - Com_Printf ("...ignoring GL_EXT_texture_env_add\n" ); - } - } - else - { - Com_Printf ("...GL_EXT_texture_env_add not found\n" ); - } - - // GL_EXT_texture_filter_anisotropic - glConfig.maxTextureFilterAnisotropy = 0; - if ( GL_CheckForExtension( "EXT_texture_filter_anisotropic" ) ) - { -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF //can't include glext.h here ... sigh - qglGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &glConfig.maxTextureFilterAnisotropy ); - Com_Printf ("...GL_EXT_texture_filter_anisotropic available\n" ); - - if ( r_ext_texture_filter_anisotropic->integer > 1 ) - { - Com_Printf ("...using GL_EXT_texture_filter_anisotropic\n" ); - } - else - { - Com_Printf ("...ignoring GL_EXT_texture_filter_anisotropic\n" ); - } - ri.Cvar_SetValue( "r_ext_texture_filter_anisotropic_avail", glConfig.maxTextureFilterAnisotropy ); - if ( r_ext_texture_filter_anisotropic->value > glConfig.maxTextureFilterAnisotropy ) - { - ri.Cvar_SetValue( "r_ext_texture_filter_anisotropic_avail", glConfig.maxTextureFilterAnisotropy ); - } - } - else - { - Com_Printf ("...GL_EXT_texture_filter_anisotropic not found\n" ); - ri.Cvar_Set( "r_ext_texture_filter_anisotropic_avail", "0" ); - } - - // GL_EXT_clamp_to_edge - glConfig.clampToEdgeAvailable = qtrue; - Com_Printf ("...using GL_EXT_texture_edge_clamp\n" ); - - // GL_ARB_multitexture - qglMultiTexCoord2fARB = NULL; - qglActiveTextureARB = NULL; - qglClientActiveTextureARB = NULL; - if ( GL_CheckForExtension( "GL_ARB_multitexture" ) ) - { - if ( r_ext_multitexture->integer ) - { - qglMultiTexCoord2fARB = ( PFNGLMULTITEXCOORD2FARBPROC ) SDL_GL_GetProcAddress( "glMultiTexCoord2fARB" ); - qglActiveTextureARB = ( PFNGLACTIVETEXTUREARBPROC ) SDL_GL_GetProcAddress( "glActiveTextureARB" ); - qglClientActiveTextureARB = ( PFNGLCLIENTACTIVETEXTUREARBPROC ) SDL_GL_GetProcAddress( "glClientActiveTextureARB" ); - - if ( qglActiveTextureARB ) - { - qglGetIntegerv( GL_MAX_ACTIVE_TEXTURES_ARB, &glConfig.maxActiveTextures ); - - if ( glConfig.maxActiveTextures > 1 ) - { - Com_Printf ("...using GL_ARB_multitexture\n" ); - } - else - { - qglMultiTexCoord2fARB = NULL; - qglActiveTextureARB = NULL; - qglClientActiveTextureARB = NULL; - Com_Printf ("...not using GL_ARB_multitexture, < 2 texture units\n" ); - } - } - } - else - { - Com_Printf ("...ignoring GL_ARB_multitexture\n" ); - } - } - else - { - Com_Printf ("...GL_ARB_multitexture not found\n" ); - } - - // GL_EXT_compiled_vertex_array - qglLockArraysEXT = NULL; - qglUnlockArraysEXT = NULL; - if ( GL_CheckForExtension( "GL_EXT_compiled_vertex_array" ) ) - { - if ( r_ext_compiled_vertex_array->integer ) - { - Com_Printf ("...using GL_EXT_compiled_vertex_array\n" ); - qglLockArraysEXT = ( void ( APIENTRY * )( int, int ) ) SDL_GL_GetProcAddress( "glLockArraysEXT" ); - qglUnlockArraysEXT = ( void ( APIENTRY * )( void ) ) SDL_GL_GetProcAddress( "glUnlockArraysEXT" ); - if (!qglLockArraysEXT || !qglUnlockArraysEXT) { - Com_Error (ERR_FATAL, "bad getprocaddress"); - } - } - else - { - Com_Printf ("...ignoring GL_EXT_compiled_vertex_array\n" ); - } - } - else - { - Com_Printf ("...GL_EXT_compiled_vertex_array not found\n" ); - } - - bool bNVRegisterCombiners = false; - // Register Combiners. - if ( GL_CheckForExtension( "GL_NV_register_combiners" ) ) - { - // NOTE: This extension requires multitexture support (over 2 units). - if ( glConfig.maxActiveTextures >= 2 ) - { - bNVRegisterCombiners = true; - // Register Combiners function pointer address load. - AReis - // NOTE: VV guys will _definetly_ not be able to use regcoms. Pixel Shaders are just as good though :-) - // NOTE: Also, this is an nVidia specific extension (of course), so fragment shaders would serve the same purpose - // if we needed some kind of fragment/pixel manipulation support. - qglCombinerParameterfvNV = (PFNGLCOMBINERPARAMETERFVNV)SDL_GL_GetProcAddress( "glCombinerParameterfvNV" ); - qglCombinerParameterivNV = (PFNGLCOMBINERPARAMETERIVNV)SDL_GL_GetProcAddress( "glCombinerParameterivNV" ); - qglCombinerParameterfNV = (PFNGLCOMBINERPARAMETERFNV)SDL_GL_GetProcAddress( "glCombinerParameterfNV" ); - qglCombinerParameteriNV = (PFNGLCOMBINERPARAMETERINV)SDL_GL_GetProcAddress( "glCombinerParameteriNV" ); - qglCombinerInputNV = (PFNGLCOMBINERINPUTNV)SDL_GL_GetProcAddress( "glCombinerInputNV" ); - qglCombinerOutputNV = (PFNGLCOMBINEROUTPUTNV)SDL_GL_GetProcAddress( "glCombinerOutputNV" ); - qglFinalCombinerInputNV = (PFNGLFINALCOMBINERINPUTNV)SDL_GL_GetProcAddress( "glFinalCombinerInputNV" ); - qglGetCombinerInputParameterfvNV = (PFNGLGETCOMBINERINPUTPARAMETERFVNV)SDL_GL_GetProcAddress( "glGetCombinerInputParameterfvNV" ); - qglGetCombinerInputParameterivNV = (PFNGLGETCOMBINERINPUTPARAMETERIVNV)SDL_GL_GetProcAddress( "glGetCombinerInputParameterivNV" ); - qglGetCombinerOutputParameterfvNV = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNV)SDL_GL_GetProcAddress( "glGetCombinerOutputParameterfvNV" ); - qglGetCombinerOutputParameterivNV = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNV)SDL_GL_GetProcAddress( "glGetCombinerOutputParameterivNV" ); - qglGetFinalCombinerInputParameterfvNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNV)SDL_GL_GetProcAddress( "glGetFinalCombinerInputParameterfvNV" ); - qglGetFinalCombinerInputParameterivNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNV)SDL_GL_GetProcAddress( "glGetFinalCombinerInputParameterivNV" ); - - // Validate the functions we need. - if ( !qglCombinerParameterfvNV || !qglCombinerParameterivNV || !qglCombinerParameterfNV || !qglCombinerParameteriNV || !qglCombinerInputNV || - !qglCombinerOutputNV || !qglFinalCombinerInputNV || !qglGetCombinerInputParameterfvNV || !qglGetCombinerInputParameterivNV || - !qglGetCombinerOutputParameterfvNV || !qglGetCombinerOutputParameterivNV || !qglGetFinalCombinerInputParameterfvNV || !qglGetFinalCombinerInputParameterivNV ) - { - bNVRegisterCombiners = false; - qglCombinerParameterfvNV = NULL; - qglCombinerParameteriNV = NULL; - Com_Printf ("...GL_NV_register_combiners failed\n" ); - } - } - else - { - bNVRegisterCombiners = false; - Com_Printf ("...ignoring GL_NV_register_combiners\n" ); - } - } - else - { - bNVRegisterCombiners = false; - Com_Printf ("...GL_NV_register_combiners not found\n" ); - } - - // NOTE: Vertex and Fragment Programs are very dependant on each other - this is actually a - // good thing! So, just check to see which we support (one or the other) and load the shared - // function pointers. ARB rocks! - - // Vertex Programs. - bool bARBVertexProgram = false; - if ( GL_CheckForExtension( "GL_ARB_vertex_program" ) ) - { - bARBVertexProgram = true; - } - else - { - bARBVertexProgram = false; - Com_Printf ("...GL_ARB_vertex_program not found\n" ); - } - - // Fragment Programs. - bool bARBFragmentProgram = false; - if ( GL_CheckForExtension( "GL_ARB_fragment_program" ) ) - { - bARBFragmentProgram = true; - } - else - { - bARBFragmentProgram = false; - Com_Printf ("...GL_ARB_fragment_program not found\n" ); - } - - // If we support one or the other, load the shared function pointers. - if ( bARBVertexProgram || bARBFragmentProgram ) - { - qglProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) SDL_GL_GetProcAddress("glProgramStringARB"); - qglBindProgramARB = (PFNGLBINDPROGRAMARBPROC) SDL_GL_GetProcAddress("glBindProgramARB"); - qglDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) SDL_GL_GetProcAddress("glDeleteProgramsARB"); - qglGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) SDL_GL_GetProcAddress("glGenProgramsARB"); - qglProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC) SDL_GL_GetProcAddress("glProgramEnvParameter4dARB"); - qglProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC) SDL_GL_GetProcAddress("glProgramEnvParameter4dvARB"); - qglProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC) SDL_GL_GetProcAddress("glProgramEnvParameter4fARB"); - qglProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC) SDL_GL_GetProcAddress("glProgramEnvParameter4fvARB"); - qglProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) SDL_GL_GetProcAddress("glProgramLocalParameter4dARB"); - qglProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) SDL_GL_GetProcAddress("glProgramLocalParameter4dvARB"); - qglProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC) SDL_GL_GetProcAddress("glProgramLocalParameter4fARB"); - qglProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) SDL_GL_GetProcAddress("glProgramLocalParameter4fvARB"); - qglGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC) SDL_GL_GetProcAddress("glGetProgramEnvParameterdvARB"); - qglGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC) SDL_GL_GetProcAddress("glGetProgramEnvParameterfvARB"); - qglGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) SDL_GL_GetProcAddress("glGetProgramLocalParameterdvARB"); - qglGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) SDL_GL_GetProcAddress("glGetProgramLocalParameterfvARB"); - qglGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) SDL_GL_GetProcAddress("glGetProgramivARB"); - qglGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC) SDL_GL_GetProcAddress("glGetProgramStringARB"); - qglIsProgramARB = (PFNGLISPROGRAMARBPROC) SDL_GL_GetProcAddress("glIsProgramARB"); - - // Validate the functions we need. - if ( !qglProgramStringARB || !qglBindProgramARB || !qglDeleteProgramsARB || !qglGenProgramsARB || - !qglProgramEnvParameter4dARB || !qglProgramEnvParameter4dvARB || !qglProgramEnvParameter4fARB || - !qglProgramEnvParameter4fvARB || !qglProgramLocalParameter4dARB || !qglProgramLocalParameter4dvARB || - !qglProgramLocalParameter4fARB || !qglProgramLocalParameter4fvARB || !qglGetProgramEnvParameterdvARB || - !qglGetProgramEnvParameterfvARB || !qglGetProgramLocalParameterdvARB || !qglGetProgramLocalParameterfvARB || - !qglGetProgramivARB || !qglGetProgramStringARB || !qglIsProgramARB ) - { - bARBVertexProgram = false; - bARBFragmentProgram = false; - qglGenProgramsARB = NULL; //clear ptrs that get checked - qglProgramEnvParameter4fARB = NULL; - Com_Printf ("...ignoring GL_ARB_vertex_program\n" ); - Com_Printf ("...ignoring GL_ARB_fragment_program\n" ); - } - } - - // Figure out which texture rectangle extension to use. - bool bTexRectSupported = false; - if ( Q_stricmpn( glConfig.vendor_string, "ATI Technologies",16 )==0 - && Q_stricmpn( glConfig.version_string, "1.3.3",5 )==0 - && glConfig.version_string[5] < '9' ) //1.3.34 and 1.3.37 and 1.3.38 are broken for sure, 1.3.39 is not - { - g_bTextureRectangleHack = true; - } - - if ( GL_CheckForExtension( "GL_NV_texture_rectangle" ) || GL_CheckForExtension( "GL_EXT_texture_rectangle" ) ) - { - bTexRectSupported = true; - } - - // Find out how many general combiners they have. - #define GL_MAX_GENERAL_COMBINERS_NV 0x854D - GLint iNumGeneralCombiners = 0; - if(bNVRegisterCombiners) - qglGetIntegerv( GL_MAX_GENERAL_COMBINERS_NV, &iNumGeneralCombiners ); - - // Only allow dynamic glows/flares if they have the hardware - if ( bTexRectSupported && bARBVertexProgram && qglActiveTextureARB && glConfig.maxActiveTextures >= 4 && - ( ( bNVRegisterCombiners && iNumGeneralCombiners >= 2 ) || bARBFragmentProgram ) ) - { - g_bDynamicGlowSupported = true; - // this would overwrite any achived setting gwg - // ri.Cvar_Set( "r_DynamicGlow", "1" ); - } - else - { - g_bDynamicGlowSupported = false; - ri.Cvar_Set( "r_DynamicGlow","0" ); - } -} - -void GLimp_Init( void ) -{ - ri.Cvar_Get( "r_restartOnResize", "1", CVAR_ARCHIVE ); - ri.Cvar_Get( "r_resizeDelay", "1000", CVAR_ARCHIVE ); - r_allowSoftwareGL = ri.Cvar_Get( "r_allowSoftwareGL", "0", CVAR_LATCH ); - r_sdlDriver = ri.Cvar_Get( "r_sdlDriver", "", CVAR_ROM ); - r_allowResize = ri.Cvar_Get( "r_allowResize", "0", CVAR_ARCHIVE ); - - /* if( ri.Cvar_VariableIntegerValue( "com_abnormalExit" ) ) - { - ri.Cvar_Set( "r_mode", va( "%d", R_MODE_FALLBACK ) ); - ri.Cvar_Set( "r_picmap", "1" ); - ri.Cvar_Set( "r_texturebits", "0" ); - ri.Cvar_Set( "r_textureMode", "GL_LINEAR_MIPMAP_NEAREST" ); - ri.Cvar_Set( "r_fullscreen", "0" ); - ri.Cvar_Set( "r_centerWindow", "0" ); - ri.Cvar_Set( "com_abnormalExit", "0" ); - }*/ - - // Create the window and set up the context - if(GLimp_StartDriverAndSetMode(r_mode->integer, r_fullscreen->integer, r_noborder->integer)) - goto success; - - // Try again, this time in a platform specific "safe mode" - /* Sys_GLimpSafeInit( ); - - if(GLimp_StartDriverAndSetMode(r_mode->integer, r_fullscreen->integer, qfalse)) - goto success; */ - - /* // Finally, try the default screen resolution - if( r_mode->integer != R_MODE_FALLBACK ) - { - Com_Printf( "Setting r_mode %d failed, falling back on r_mode %d\n", - r_mode->integer, R_MODE_FALLBACK ); - - if(GLimp_StartDriverAndSetMode(R_MODE_FALLBACK, qfalse, qfalse)) - goto success; - }*/ - - // Nothing worked, give up - Com_Error( ERR_FATAL, "GLimp_Init() - could not load OpenGL subsystem" ); - -success: - // This values force the UI to disable driver selection - // glConfig.driverType = GLDRV_ICD; - // glConfig.hardwareType = GLHW_GENERIC; - glConfig.deviceSupportsGamma = (qboolean)(!r_ignorehwgamma->integer && - SDL_SetWindowBrightness( screen, 1.0f ) >= 0); - - // get our config strings - glConfig.vendor_string = (const char *) qglGetString (GL_VENDOR); - glConfig.renderer_string = (const char *) qglGetString (GL_RENDERER); - glConfig.version_string = (const char *) qglGetString (GL_VERSION); - glConfig.extensions_string = (const char *) qglGetString (GL_EXTENSIONS); - - // OpenGL driver constants - qglGetIntegerv( GL_MAX_TEXTURE_SIZE, &glConfig.maxTextureSize ); - // stubbed or broken drivers may have reported 0... - if ( glConfig.maxTextureSize <= 0 ) - { - glConfig.maxTextureSize = 0; - } - - // initialize extensions - GLimp_InitExtensions( ); - - ri.Cvar_Get( "r_availableModes", "", CVAR_ROM ); - - // This depends on SDL_INIT_VIDEO, hence having it here - ri.IN_Init( screen ); -} - -/* -=============== -GLimp_Shutdown -=============== -*/ -void GLimp_Shutdown( void ) -{ - ri.IN_Shutdown(); - - SDL_QuitSubSystem( SDL_INIT_VIDEO ); - - memset( &glConfig, 0, sizeof( glConfig ) ); - memset( &glState, 0, sizeof( glState ) ); -} - -void GLimp_EnableLogging( qboolean enable ) -{ -} - -void GLimp_LogComment( const char *comment ) -{ -} - -void GLimp_SetGamma( unsigned char red[256], unsigned char green[256], unsigned char blue[256] ) -{ - Uint16 table[3][256]; - int i, j; - - if( !glConfig.deviceSupportsGamma || r_ignorehwgamma->integer > 0 ) - return; - - for (i = 0; i < 256; i++) - { - table[0][i] = ( ( ( Uint16 ) red[i] ) << 8 ) | red[i]; - table[1][i] = ( ( ( Uint16 ) green[i] ) << 8 ) | green[i]; - table[2][i] = ( ( ( Uint16 ) blue[i] ) << 8 ) | blue[i]; - } - -#ifdef _WIN32 -#include - - // Win2K and newer put this odd restriction on gamma ramps... - { - OSVERSIONINFO vinfo; - - vinfo.dwOSVersionInfoSize = sizeof( vinfo ); - GetVersionEx( &vinfo ); - if( vinfo.dwMajorVersion >= 5 && vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) - { - ri.Printf( PRINT_DEVELOPER, "performing gamma clamp.\n" ); - for( j = 0 ; j < 3 ; j++ ) - { - for( i = 0 ; i < 128 ; i++ ) - { - if( table[ j ] [ i] > ( ( 128 + i ) << 8 ) ) - table[ j ][ i ] = ( 128 + i ) << 8; - } - - if( table[ j ] [127 ] > 254 << 8 ) - table[ j ][ 127 ] = 254 << 8; - } - } - } -#endif - - // enforce constantly increasing - for (j = 0; j < 3; j++) - { - for (i = 1; i < 256; i++) - { - if (table[j][i] < table[j][i-1]) - table[j][i] = table[j][i-1]; - } - } - - SDL_SetWindowGammaRamp(screen, table[0], table[1], table[2]); -} diff --git a/code/sdl/sdl_input.cpp b/code/sdl/sdl_input.cpp deleted file mode 100644 index b792a951b9..0000000000 --- a/code/sdl/sdl_input.cpp +++ /dev/null @@ -1,938 +0,0 @@ -#include -#include "../qcommon/q_shared.h" -#include "../qcommon/qcommon.h" -#include "../client/client.h" -#include "../sys/sys_local.h" - -static cvar_t *in_keyboardDebug = NULL; - -static SDL_Joystick *stick = NULL; - -static qboolean mouseAvailable = qfalse; -static qboolean mouseActive = qfalse; - -static cvar_t *in_mouse = NULL; -static cvar_t *in_nograb; - -cvar_t *in_joystick = NULL; -static cvar_t *in_joystickThreshold = NULL; -static cvar_t *in_joystickNo = NULL; -static cvar_t *in_joystickUseAnalog = NULL; - -static int vidRestartTime = 0; - -static SDL_Window *SDL_window = NULL; - -#define CTRL(a) ((a)-'a'+1) - -/* -=============== -IN_PrintKey -=============== -*/ -static void IN_PrintKey( const SDL_Keysym *keysym, fakeAscii_t key, qboolean down ) -{ - if( down ) - Com_Printf( "+ " ); - else - Com_Printf( " " ); - - Com_Printf( "Scancode: 0x%02x(%s) Sym: 0x%02x(%s)", - keysym->scancode, SDL_GetScancodeName( keysym->scancode ), - keysym->sym, SDL_GetKeyName( keysym->sym ) ); - - if( keysym->mod & KMOD_LSHIFT ) Com_Printf( " KMOD_LSHIFT" ); - if( keysym->mod & KMOD_RSHIFT ) Com_Printf( " KMOD_RSHIFT" ); - if( keysym->mod & KMOD_LCTRL ) Com_Printf( " KMOD_LCTRL" ); - if( keysym->mod & KMOD_RCTRL ) Com_Printf( " KMOD_RCTRL" ); - if( keysym->mod & KMOD_LALT ) Com_Printf( " KMOD_LALT" ); - if( keysym->mod & KMOD_RALT ) Com_Printf( " KMOD_RALT" ); - if( keysym->mod & KMOD_LGUI ) Com_Printf( " KMOD_LGUI" ); - if( keysym->mod & KMOD_RGUI ) Com_Printf( " KMOD_RGUI" ); - if( keysym->mod & KMOD_NUM ) Com_Printf( " KMOD_NUM" ); - if( keysym->mod & KMOD_CAPS ) Com_Printf( " KMOD_CAPS" ); - if( keysym->mod & KMOD_MODE ) Com_Printf( " KMOD_MODE" ); - if( keysym->mod & KMOD_RESERVED ) Com_Printf( " KMOD_RESERVED" ); - - Com_Printf( " Q:0x%02x(%s)\n", key, Key_KeynumToString( key ) ); -} - -#define MAX_CONSOLE_KEYS 16 - -/* -=============== -IN_IsConsoleKey - -TODO: If the SDL_Scancode situation improves, use it instead of - both of these methods -=============== -*/ -static qboolean IN_IsConsoleKey( fakeAscii_t key, int character ) -{ - typedef struct consoleKey_s - { - enum - { - QUAKE_KEY, - CHARACTER - } type; - - union - { - fakeAscii_t key; - int character; - } u; - } consoleKey_t; - - static consoleKey_t consoleKeys[ MAX_CONSOLE_KEYS ]; - static int numConsoleKeys = 0; - int i; - - // Only parse the variable when it changes - if( cl_consoleKeys->modified ) - { - const char *text_p; - char *token; - - cl_consoleKeys->modified = qfalse; - text_p = cl_consoleKeys->string; - numConsoleKeys = 0; - - COM_BeginParseSession(); - while( numConsoleKeys < MAX_CONSOLE_KEYS ) - { - consoleKey_t *c = &consoleKeys[ numConsoleKeys ]; - int charCode = 0; - - token = COM_Parse( &text_p ); - if( !token[ 0 ] ) - break; - - if( strlen( token ) == 4 ) - charCode = Com_HexStrToInt( token ); - - if( charCode > 0 ) - { - c->type = consoleKey_t::CHARACTER; - c->u.character = charCode; - } - else - { - c->type = consoleKey_t::QUAKE_KEY; - c->u.key = (fakeAscii_t)Key_StringToKeynum( token ); - - // 0 isn't a key - if( c->u.key <= 0 ) - continue; - } - - numConsoleKeys++; - } - COM_EndParseSession(); - } - - // If the character is the same as the key, prefer the character - if( key == character ) - key = A_NULL; - - for( i = 0; i < numConsoleKeys; i++ ) - { - consoleKey_t *c = &consoleKeys[ i ]; - - switch( c->type ) - { - case consoleKey_t::QUAKE_KEY: - if( key && c->u.key == key ) - return qtrue; - break; - - case consoleKey_t::CHARACTER: - if( c->u.character == character ) - return qtrue; - break; - } - } - - return qfalse; -} - -/* -=============== -IN_TranslateSDLToJKKey -=============== -*/ -static fakeAscii_t IN_TranslateSDLToJKKey( SDL_Keysym *keysym, qboolean down ) -{ - fakeAscii_t key = A_NULL; - - if( keysym->sym >= SDLK_SPACE && keysym->sym < SDLK_DELETE ) - { - // These happen to match the ASCII chars - key = (fakeAscii_t)keysym->sym; - } - else - { - switch( keysym->sym ) - { - case SDLK_PAGEUP: key = A_PAGE_UP; break; - case SDLK_KP_9: key = A_KP_9; break; - case SDLK_PAGEDOWN: key = A_PAGE_DOWN; break; - case SDLK_KP_3: key = A_KP_3; break; - case SDLK_KP_7: key = A_KP_7; break; - case SDLK_HOME: key = A_HOME; break; - case SDLK_KP_1: key = A_KP_1; break; - case SDLK_END: key = A_END; break; - case SDLK_KP_4: key = A_KP_4; break; - case SDLK_LEFT: key = A_CURSOR_LEFT; break; - case SDLK_KP_6: key = A_KP_6; break; - case SDLK_RIGHT: key = A_CURSOR_RIGHT; break; - case SDLK_KP_2: key = A_KP_2; break; - case SDLK_DOWN: key = A_CURSOR_DOWN; break; - case SDLK_KP_8: key = A_KP_8; break; - case SDLK_UP: key = A_CURSOR_UP; break; - case SDLK_ESCAPE: key = A_ESCAPE; break; - case SDLK_KP_ENTER: key = A_KP_ENTER; break; - case SDLK_RETURN: key = A_ENTER; break; - case SDLK_TAB: key = A_TAB; break; - case SDLK_F1: key = A_F1; break; - case SDLK_F2: key = A_F2; break; - case SDLK_F3: key = A_F3; break; - case SDLK_F4: key = A_F4; break; - case SDLK_F5: key = A_F5; break; - case SDLK_F6: key = A_F6; break; - case SDLK_F7: key = A_F7; break; - case SDLK_F8: key = A_F8; break; - case SDLK_F9: key = A_F9; break; - case SDLK_F10: key = A_F10; break; - case SDLK_F11: key = A_F11; break; - case SDLK_F12: key = A_F12; break; - - case SDLK_BACKSPACE: key = A_BACKSPACE; break; - case SDLK_KP_PERIOD: key = A_KP_PERIOD; break; - case SDLK_DELETE: key = A_DELETE; break; - case SDLK_PAUSE: key = A_PAUSE; break; - - case SDLK_LSHIFT: - case SDLK_RSHIFT: key = A_SHIFT; break; - - case SDLK_LCTRL: - case SDLK_RCTRL: key = A_CTRL; break; - - case SDLK_RALT: - case SDLK_LALT: key = A_ALT; break; - - case SDLK_KP_5: key = A_KP_5; break; - case SDLK_INSERT: key = A_INSERT; break; - case SDLK_KP_0: key = A_KP_0; break; - case SDLK_KP_MULTIPLY: key = A_STAR; break; - case SDLK_KP_PLUS: key = A_KP_PLUS; break; - case SDLK_KP_MINUS: key = A_KP_MINUS; break; - case SDLK_KP_DIVIDE: key = A_FORWARD_SLASH; break; - - case SDLK_SCROLLLOCK: key = A_SCROLLLOCK; break; - case SDLK_NUMLOCKCLEAR: key = A_NUMLOCK; break; - case SDLK_CAPSLOCK: key = A_CAPSLOCK; break; - - default: - break; - } - } - - if( in_keyboardDebug->integer ) - IN_PrintKey( keysym, key, down ); - - if( IN_IsConsoleKey( key, 0 ) ) - { - // Console keys can't be bound or generate characters - key = A_CONSOLE; - } - - return key; -} - -/* -=============== -IN_GobbleMotionEvents -=============== -*/ -static void IN_GobbleMotionEvents( void ) -{ - SDL_Event dummy[ 1 ]; - int val = 0; - - // Gobble any mouse motion events - SDL_PumpEvents( ); - while( ( val = SDL_PeepEvents( dummy, 1, SDL_GETEVENT, - SDL_MOUSEMOTION, SDL_MOUSEMOTION ) ) > 0 ) { } - - if ( val < 0 ) - Com_Printf( "IN_GobbleMotionEvents failed: %s\n", SDL_GetError( ) ); -} - -/* -=============== -IN_ActivateMouse -=============== -*/ -static void IN_ActivateMouse( void ) -{ - if (!mouseAvailable || !SDL_WasInit( SDL_INIT_VIDEO ) ) - return; - - if( !mouseActive ) - { - SDL_SetRelativeMouseMode( SDL_TRUE ); - SDL_SetWindowGrab( SDL_window, SDL_TRUE ); - - IN_GobbleMotionEvents( ); - } - - // in_nograb makes no sense in fullscreen mode - if( !Cvar_VariableIntegerValue("r_fullscreen") ) - { - if( in_nograb->modified || !mouseActive ) - { - if( in_nograb->integer ) - SDL_SetWindowGrab( SDL_window, SDL_FALSE ); - else - SDL_SetWindowGrab( SDL_window, SDL_TRUE ); - - in_nograb->modified = qfalse; - } - } - - mouseActive = qtrue; -} - -/* -=============== -IN_DeactivateMouse -=============== -*/ -static void IN_DeactivateMouse( void ) -{ - if( !SDL_WasInit( SDL_INIT_VIDEO ) ) - return; - - // Always show the cursor when the mouse is disabled, - // but not when fullscreen - if( !Cvar_VariableIntegerValue("r_fullscreen") ) - SDL_ShowCursor( 1 ); - - if( !mouseAvailable ) - return; - - if( mouseActive ) - { - IN_GobbleMotionEvents( ); - - SDL_SetWindowGrab( SDL_window, SDL_FALSE ); - SDL_SetRelativeMouseMode( SDL_FALSE ); - - // Don't warp the mouse unless the cursor is within the window - if( SDL_GetWindowFlags( SDL_window ) & SDL_WINDOW_MOUSE_FOCUS ) - SDL_WarpMouseInWindow( SDL_window, cls.glconfig.vidWidth / 2, cls.glconfig.vidHeight / 2 ); - - mouseActive = qfalse; - } -} - -/* -=============== -IN_InitKeyLockStates -=============== -*/ -void IN_InitKeyLockStates( void ) -{ - const unsigned char *keystate = SDL_GetKeyboardState(NULL); - - kg.keys[A_SCROLLLOCK].down = (qboolean)!!(keystate[SDL_SCANCODE_SCROLLLOCK]); - kg.keys[A_NUMLOCK].down = (qboolean)!!(keystate[SDL_SCANCODE_NUMLOCKCLEAR]); - kg.keys[A_CAPSLOCK].down = (qboolean)!!(keystate[SDL_SCANCODE_CAPSLOCK]); -} - -// We translate axes movement into keypresses -static int joy_keys[16] = { - A_CURSOR_LEFT, A_CURSOR_RIGHT, - A_CURSOR_UP, A_CURSOR_DOWN, - A_JOY16, A_JOY17, - A_JOY18, A_JOY19, - A_JOY20, A_JOY21, - A_JOY22, A_JOY23, - A_JOY24, A_JOY25, - A_JOY26, A_JOY27 -}; - -// translate hat events into keypresses -// the 4 highest buttons are used for the first hat ... -static int hat_keys[16] = { - A_JOY28, A_JOY29, - A_JOY30, A_JOY31, - A_JOY24, A_JOY25, - A_JOY26, A_JOY27, - A_JOY20, A_JOY21, - A_JOY22, A_JOY23, - A_JOY16, A_JOY17, - A_JOY18, A_JOY19 -}; - - -struct stick_state_s -{ - qboolean buttons[16]; // !!! FIXME: these might be too many. - unsigned int oldaxes; - int oldaaxes[MAX_JOYSTICK_AXIS]; - unsigned int oldhats; -} stick_state; - -/* -=============== -IN_InitJoystick -=============== -*/ -static void IN_InitJoystick( void ) -{ - int i = 0; - int total = 0; - char buf[16384] = ""; - - if (stick != NULL) - SDL_JoystickClose(stick); - - stick = NULL; - memset(&stick_state, '\0', sizeof (stick_state)); - - if (!SDL_WasInit(SDL_INIT_JOYSTICK)) - { - Com_DPrintf("Calling SDL_Init(SDL_INIT_JOYSTICK)...\n"); - if (SDL_Init(SDL_INIT_JOYSTICK) == -1) - { - Com_DPrintf("SDL_Init(SDL_INIT_JOYSTICK) failed: %s\n", SDL_GetError()); - return; - } - Com_DPrintf("SDL_Init(SDL_INIT_JOYSTICK) passed.\n"); - } - - total = SDL_NumJoysticks(); - Com_DPrintf("%d possible joysticks\n", total); - - // Print list and build cvar to allow ui to select joystick. - for (i = 0; i < total; i++) - { - Q_strcat(buf, sizeof(buf), SDL_JoystickNameForIndex(i)); - Q_strcat(buf, sizeof(buf), "\n"); - } - - Cvar_Get( "in_availableJoysticks", buf, CVAR_ROM ); - - if( !in_joystick->integer ) { - Com_DPrintf( "Joystick is not active.\n" ); - SDL_QuitSubSystem(SDL_INIT_JOYSTICK); - return; - } - - in_joystickNo = Cvar_Get( "in_joystickNo", "0", CVAR_ARCHIVE ); - if( in_joystickNo->integer < 0 || in_joystickNo->integer >= total ) - Cvar_Set( "in_joystickNo", "0" ); - - in_joystickUseAnalog = Cvar_Get( "in_joystickUseAnalog", "0", CVAR_ARCHIVE ); - - stick = SDL_JoystickOpen( in_joystickNo->integer ); - - if (stick == NULL) { - Com_DPrintf( "No joystick opened.\n" ); - return; - } - - Com_DPrintf( "Joystick %d opened\n", in_joystickNo->integer ); - Com_DPrintf( "Name: %s\n", SDL_JoystickNameForIndex(in_joystickNo->integer) ); - Com_DPrintf( "Axes: %d\n", SDL_JoystickNumAxes(stick) ); - Com_DPrintf( "Hats: %d\n", SDL_JoystickNumHats(stick) ); - Com_DPrintf( "Buttons: %d\n", SDL_JoystickNumButtons(stick) ); - Com_DPrintf( "Balls: %d\n", SDL_JoystickNumBalls(stick) ); - Com_DPrintf( "Use Analog: %s\n", in_joystickUseAnalog->integer ? "Yes" : "No" ); - - SDL_JoystickEventState(SDL_QUERY); -} - -void IN_Init( void *windowData ) -{ - int appState; - - if( !SDL_WasInit( SDL_INIT_VIDEO ) ) - { - Com_Error( ERR_FATAL, "IN_Init called before SDL_Init( SDL_INIT_VIDEO )" ); - return; - } - - SDL_window = (SDL_Window *)windowData; - - Com_DPrintf( "\n------- Input Initialization -------\n" ); - - // joystick variables - in_keyboardDebug = Cvar_Get( "in_keyboardDebug", "0", CVAR_ARCHIVE ); - - in_joystick = Cvar_Get( "in_joystick", "0", CVAR_ARCHIVE|CVAR_LATCH ); - in_joystickThreshold = Cvar_Get( "joy_threshold", "0.15", CVAR_ARCHIVE ); - - // mouse variables - in_mouse = Cvar_Get( "in_mouse", "1", CVAR_ARCHIVE ); - in_nograb = Cvar_Get( "in_nograb", "0", CVAR_ARCHIVE ); - - SDL_StartTextInput( ); - - mouseAvailable = (qboolean)( in_mouse->value != 0 ); - IN_DeactivateMouse( ); - - appState = SDL_GetWindowFlags( SDL_window ); - Cvar_SetValue( "com_unfocused", !( appState & SDL_WINDOW_INPUT_FOCUS ) ); - Cvar_SetValue( "com_minimized", appState & SDL_WINDOW_MINIMIZED ); - - IN_InitKeyLockStates( ); - - IN_InitJoystick( ); - Com_DPrintf( "------------------------------------\n" ); -} - -/* -=============== -IN_ProcessEvents -=============== -*/ -static void IN_ProcessEvents( void ) -{ - SDL_Event e; - fakeAscii_t key = A_NULL; - static fakeAscii_t lastKeyDown = A_NULL; - - if( !SDL_WasInit( SDL_INIT_VIDEO ) ) - return; - - while( SDL_PollEvent( &e ) ) - { - switch( e.type ) - { - case SDL_KEYDOWN: - if ( ( key = IN_TranslateSDLToJKKey( &e.key.keysym, qtrue ) ) != A_NULL ) - Sys_QueEvent( 0, SE_KEY, key, qtrue, 0, NULL ); - - if (key == A_BACKSPACE) - Sys_QueEvent( 0, SE_CHAR, CTRL('h'), qfalse, 0, NULL); - else if (kg.keys[A_CTRL].down && key >= 'a' && key <= 'z' ) - Sys_QueEvent( 0, SE_CHAR, CTRL(key), qfalse, 0, NULL ); - - lastKeyDown = key; - break; - - case SDL_KEYUP: - if ( ( key = IN_TranslateSDLToJKKey( &e.key.keysym, qfalse ) ) != A_NULL ) - Sys_QueEvent( 0, SE_KEY, key, qfalse, 0, NULL ); - - lastKeyDown = A_NULL; - break; - - case SDL_TEXTINPUT: - if( lastKeyDown != A_CONSOLE ) - { - char *c = e.text.text; - - // Quick and dirty UTF-8 to UTF-32 conversion - while( *c ) - { - int utf32 = 0; - - if( ( *c & 0x80 ) == 0 ) - utf32 = *c++; - else if( ( *c & 0xE0 ) == 0xC0 ) // 110x xxxx - { - utf32 |= ( *c++ & 0x1F ) << 6; - utf32 |= ( *c++ & 0x3F ); - } - else if( ( *c & 0xF0 ) == 0xE0 ) // 1110 xxxx - { - utf32 |= ( *c++ & 0x0F ) << 12; - utf32 |= ( *c++ & 0x3F ) << 6; - utf32 |= ( *c++ & 0x3F ); - } - else if( ( *c & 0xF8 ) == 0xF0 ) // 1111 0xxx - { - utf32 |= ( *c++ & 0x07 ) << 18; - utf32 |= ( *c++ & 0x3F ) << 6; - utf32 |= ( *c++ & 0x3F ) << 6; - utf32 |= ( *c++ & 0x3F ); - } - else - { - Com_DPrintf( "Unrecognised UTF-8 lead byte: 0x%x\n", (unsigned int)*c ); - c++; - } - - if( utf32 != 0 ) - { - if( IN_IsConsoleKey( A_NULL, utf32 ) ) - { - Sys_QueEvent( 0, SE_KEY, A_CONSOLE, qtrue, 0, NULL ); - Sys_QueEvent( 0, SE_KEY, A_CONSOLE, qfalse, 0, NULL ); - } - else - Sys_QueEvent( 0, SE_CHAR, utf32, 0, 0, NULL ); - } - } - } - break; - - case SDL_MOUSEMOTION: - if( mouseActive ) - Sys_QueEvent( 0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL ); - break; - - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - { - unsigned short b; - switch( e.button.button ) - { - case SDL_BUTTON_LEFT: b = A_MOUSE1; break; - case SDL_BUTTON_MIDDLE: b = A_MOUSE3; break; - case SDL_BUTTON_RIGHT: b = A_MOUSE2; break; - case SDL_BUTTON_X1: b = A_MOUSE4; break; - case SDL_BUTTON_X2: b = A_MOUSE5; break; - default: b = A_AUX0 + ( e.button.button - 6 ) % 32; break; - } - Sys_QueEvent( 0, SE_KEY, b, - ( e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse ), 0, NULL ); - } - break; - - case SDL_MOUSEWHEEL: - if( e.wheel.y > 0 ) - { - Sys_QueEvent( 0, SE_KEY, A_MWHEELUP, qtrue, 0, NULL ); - Sys_QueEvent( 0, SE_KEY, A_MWHEELUP, qfalse, 0, NULL ); - } - else - { - Sys_QueEvent( 0, SE_KEY, A_MWHEELDOWN, qtrue, 0, NULL ); - Sys_QueEvent( 0, SE_KEY, A_MWHEELDOWN, qfalse, 0, NULL ); - } - break; - - case SDL_QUIT: - Cbuf_ExecuteText(EXEC_NOW, "quit Closed window\n"); - break; - - case SDL_WINDOWEVENT: - switch( e.window.event ) - { - case SDL_WINDOWEVENT_RESIZED: - { - char width[32], height[32]; - if (!Cvar_VariableIntegerValue("r_restartOnResize")) - break; - Com_sprintf( width, sizeof( width ), "%d", e.window.data1 ); - Com_sprintf( height, sizeof( height ), "%d", e.window.data2 ); - Cvar_Set( "r_customwidth", width ); - Cvar_Set( "r_customheight", height ); - Cvar_Set( "r_mode", "-1" ); - - // Wait until user stops dragging for 1 second, so - // we aren't constantly recreating the GL context while - // he tries to drag... - vidRestartTime = Sys_Milliseconds( ) + Cvar_VariableIntegerValue("r_resizeDelay"); - } - break; - - case SDL_WINDOWEVENT_MINIMIZED: Cvar_SetValue( "com_minimized", 1 ); break; - case SDL_WINDOWEVENT_RESTORED: - case SDL_WINDOWEVENT_MAXIMIZED: Cvar_SetValue( "com_minimized", 0 ); break; - case SDL_WINDOWEVENT_FOCUS_LOST: Cvar_SetValue( "com_unfocused", 1 ); break; - case SDL_WINDOWEVENT_FOCUS_GAINED: Cvar_SetValue( "com_unfocused", 0 ); break; - } - break; - - default: - break; - } - } -} - -/* -=============== -IN_JoyMove -=============== -*/ -static void IN_JoyMove( void ) -{ - unsigned int axes = 0; - unsigned int hats = 0; - int total = 0; - int i = 0; - - if (!stick) - return; - - SDL_JoystickUpdate(); - - // update the ball state. - total = SDL_JoystickNumBalls(stick); - if (total > 0) - { - int balldx = 0; - int balldy = 0; - for (i = 0; i < total; i++) - { - int dx = 0; - int dy = 0; - SDL_JoystickGetBall(stick, i, &dx, &dy); - balldx += dx; - balldy += dy; - } - if (balldx || balldy) - { - // !!! FIXME: is this good for stick balls, or just mice? - // Scale like the mouse input... - if (abs(balldx) > 1) - balldx *= 2; - if (abs(balldy) > 1) - balldy *= 2; - Sys_QueEvent( 0, SE_MOUSE, balldx, balldy, 0, NULL ); - } - } - - // now query the stick buttons... - total = SDL_JoystickNumButtons(stick); - if (total > 0) - { - if (total > (int)ARRAY_LEN(stick_state.buttons)) - total = ARRAY_LEN(stick_state.buttons); - for (i = 0; i < total; i++) - { - qboolean pressed = (qboolean)(SDL_JoystickGetButton(stick, i) != 0); - if (pressed != stick_state.buttons[i]) - { - Sys_QueEvent( 0, SE_KEY, A_JOY1 + i, pressed, 0, NULL ); - stick_state.buttons[i] = pressed; - } - } - } - - // look at the hats... - total = SDL_JoystickNumHats(stick); - if (total > 0) - { - if (total > 4) total = 4; - for (i = 0; i < total; i++) - { - ((Uint8 *)&hats)[i] = SDL_JoystickGetHat(stick, i); - } - } - - // update hat state - if (hats != stick_state.oldhats) - { - for( i = 0; i < 4; i++ ) { - if( ((Uint8 *)&hats)[i] != ((Uint8 *)&stick_state.oldhats)[i] ) { - // release event - switch( ((Uint8 *)&stick_state.oldhats)[i] ) { - case SDL_HAT_UP: - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 0], qfalse, 0, NULL ); - break; - case SDL_HAT_RIGHT: - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 1], qfalse, 0, NULL ); - break; - case SDL_HAT_DOWN: - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 2], qfalse, 0, NULL ); - break; - case SDL_HAT_LEFT: - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 3], qfalse, 0, NULL ); - break; - case SDL_HAT_RIGHTUP: - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 0], qfalse, 0, NULL ); - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 1], qfalse, 0, NULL ); - break; - case SDL_HAT_RIGHTDOWN: - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 2], qfalse, 0, NULL ); - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 1], qfalse, 0, NULL ); - break; - case SDL_HAT_LEFTUP: - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 0], qfalse, 0, NULL ); - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 3], qfalse, 0, NULL ); - break; - case SDL_HAT_LEFTDOWN: - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 2], qfalse, 0, NULL ); - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 3], qfalse, 0, NULL ); - break; - default: - break; - } - // press event - switch( ((Uint8 *)&hats)[i] ) { - case SDL_HAT_UP: - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 0], qtrue, 0, NULL ); - break; - case SDL_HAT_RIGHT: - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 1], qtrue, 0, NULL ); - break; - case SDL_HAT_DOWN: - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 2], qtrue, 0, NULL ); - break; - case SDL_HAT_LEFT: - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 3], qtrue, 0, NULL ); - break; - case SDL_HAT_RIGHTUP: - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 0], qtrue, 0, NULL ); - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 1], qtrue, 0, NULL ); - break; - case SDL_HAT_RIGHTDOWN: - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 2], qtrue, 0, NULL ); - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 1], qtrue, 0, NULL ); - break; - case SDL_HAT_LEFTUP: - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 0], qtrue, 0, NULL ); - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 3], qtrue, 0, NULL ); - break; - case SDL_HAT_LEFTDOWN: - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 2], qtrue, 0, NULL ); - Sys_QueEvent( 0, SE_KEY, hat_keys[4*i + 3], qtrue, 0, NULL ); - break; - default: - break; - } - } - } - } - - // save hat state - stick_state.oldhats = hats; - - // finally, look at the axes... - total = SDL_JoystickNumAxes(stick); - if (total > 0) - { - if (in_joystickUseAnalog->integer) - { - if (total > MAX_JOYSTICK_AXIS) total = MAX_JOYSTICK_AXIS; - for (i = 0; i < total; i++) - { - Sint16 axis = SDL_JoystickGetAxis(stick, i); - float f = ( (float) abs(axis) ) / 32767.0f; - - if( f < in_joystickThreshold->value ) axis = 0; - - if ( axis != stick_state.oldaaxes[i] ) - { - Sys_QueEvent( 0, SE_JOYSTICK_AXIS, i, axis, 0, NULL ); - stick_state.oldaaxes[i] = axis; - } - } - } - else - { - if (total > 16) total = 16; - for (i = 0; i < total; i++) - { - Sint16 axis = SDL_JoystickGetAxis(stick, i); - float f = ( (float) axis ) / 32767.0f; - if( f < -in_joystickThreshold->value ) { - axes |= ( 1 << ( i * 2 ) ); - } else if( f > in_joystickThreshold->value ) { - axes |= ( 1 << ( ( i * 2 ) + 1 ) ); - } - } - } - } - - /* Time to update axes state based on old vs. new. */ - if (axes != stick_state.oldaxes) - { - for( i = 0; i < 16; i++ ) { - if( ( axes & ( 1 << i ) ) && !( stick_state.oldaxes & ( 1 << i ) ) ) { - Sys_QueEvent( 0, SE_KEY, joy_keys[i], qtrue, 0, NULL ); - } - - if( !( axes & ( 1 << i ) ) && ( stick_state.oldaxes & ( 1 << i ) ) ) { - Sys_QueEvent( 0, SE_KEY, joy_keys[i], qfalse, 0, NULL ); - } - } - } - - /* Save for future generations. */ - stick_state.oldaxes = axes; -} - - -void IN_Frame (void) { - qboolean loading; - - IN_JoyMove( ); - IN_ProcessEvents( ); - - // If not DISCONNECTED (main menu) or ACTIVE (in game), we're loading - loading = (qboolean)( cls.state != CA_DISCONNECTED && cls.state != CA_ACTIVE ); - - if( !cls.glconfig.isFullscreen && ( Key_GetCatcher( ) & KEYCATCH_CONSOLE ) ) - { - // Console is down in windowed mode - IN_DeactivateMouse( ); - } - else if( !cls.glconfig.isFullscreen && loading ) - { - // Loading in windowed mode - IN_DeactivateMouse( ); - } - else if( !( SDL_GetWindowFlags( SDL_window ) & SDL_WINDOW_INPUT_FOCUS ) ) - { - // Window not got focus - IN_DeactivateMouse( ); - } - else - IN_ActivateMouse( ); - - // In case we had to delay actual restart of video system - if( ( vidRestartTime != 0 ) && ( vidRestartTime < Sys_Milliseconds( ) ) ) - { - vidRestartTime = 0; - Cbuf_AddText( "vid_restart\n" ); - } -} - -/* -=============== -IN_ShutdownJoystick -=============== -*/ -static void IN_ShutdownJoystick( void ) -{ - if ( !SDL_WasInit( SDL_INIT_JOYSTICK ) ) - return; - - if (stick) - { - SDL_JoystickClose(stick); - stick = NULL; - } - - SDL_QuitSubSystem(SDL_INIT_JOYSTICK); -} - -void IN_Shutdown( void ) { - SDL_StopTextInput( ); - - IN_DeactivateMouse( ); - mouseAvailable = qfalse; - - IN_ShutdownJoystick( ); - - SDL_window = NULL; -} - -/* -=============== -IN_Restart -=============== -*/ -void IN_Restart( void ) -{ - IN_ShutdownJoystick( ); - IN_Init( SDL_window ); -} diff --git a/code/sdl/sdl_qgl.h b/code/sdl/sdl_qgl.h deleted file mode 100644 index 929f76ccfc..0000000000 --- a/code/sdl/sdl_qgl.h +++ /dev/null @@ -1,393 +0,0 @@ -#include - -#ifndef APIENTRY -#define APIENTRY -#endif - -#ifndef APIENTRYP -#define APIENTRYP APIENTRY * -#endif - -#define qglAccum glAccum -#define qglAlphaFunc glAlphaFunc -#define qglAreTexturesResident glAreTexturesResident -#define qglArrayElement glArrayElement -#define qglBegin glBegin -#define qglBindTexture glBindTexture -#define qglBitmap glBitmap -#define qglBlendFunc glBlendFunc -#define qglCallList glCallList -#define qglCallLists glCallLists -#define qglClear glClear -#define qglClearAccum glClearAccum -#define qglClearColor glClearColor -#define qglClearDepth glClearDepth -#define qglClearIndex glClearIndex -#define qglClearStencil glClearStencil -#define qglClipPlane glClipPlane -#define qglColor3b glColor3b -#define qglColor3bv glColor3bv -#define qglColor3d glColor3d -#define qglColor3dv glColor3dv -#define qglColor3f glColor3f -#define qglColor3fv glColor3fv -#define qglColor3i glColor3i -#define qglColor3iv glColor3iv -#define qglColor3s glColor3s -#define qglColor3sv glColor3sv -#define qglColor3ub glColor3ub -#define qglColor3ubv glColor3ubv -#define qglColor3ui glColor3ui -#define qglColor3uiv glColor3uiv -#define qglColor3us glColor3us -#define qglColor3usv glColor3usv -#define qglColor4b glColor4b -#define qglColor4bv glColor4bv -#define qglColor4d glColor4d -#define qglColor4dv glColor4dv -#define qglColor4f glColor4f -#define qglColor4fv glColor4fv -#define qglColor4i glColor4i -#define qglColor4iv glColor4iv -#define qglColor4s glColor4s -#define qglColor4sv glColor4sv -#define qglColor4ub glColor4ub -#define qglColor4ubv glColor4ubv -#define qglColor4ui glColor4ui -#define qglColor4uiv glColor4uiv -#define qglColor4us glColor4us -#define qglColor4usv glColor4usv -#define qglColorMask glColorMask -#define qglColorMaterial glColorMaterial -#define qglColorPointer glColorPointer -#define qglCopyPixels glCopyPixels -#define qglCopyTexImage1D glCopyTexImage1D -#define qglCopyTexImage2D glCopyTexImage2D -#define qglCopyTexSubImage1D glCopyTexSubImage1D -#define qglCopyTexSubImage2D glCopyTexSubImage2D -#define qglCullFace glCullFace -#define qglDeleteLists glDeleteLists -#define qglDeleteTextures glDeleteTextures -#define qglDepthFunc glDepthFunc -#define qglDepthMask glDepthMask -#define qglDepthRange glDepthRange -#define qglDisable glDisable -#define qglDisableClientState glDisableClientState -#define qglDrawArrays glDrawArrays -#define qglDrawBuffer glDrawBuffer -#define qglDrawElements glDrawElements -#define qglDrawPixels glDrawPixels -#define qglEdgeFlag glEdgeFlag -#define qglEdgeFlagPointer glEdgeFlagPointer -#define qglEdgeFlagv glEdgeFlagv -#define qglEnable glEnable -#define qglEnableClientState glEnableClientState -#define qglEnd glEnd -#define qglEndList glEndList -#define qglEvalCoord1d glEvalCoord1d -#define qglEvalCoord1dv glEvalCoord1dv -#define qglEvalCoord1f glEvalCoord1f -#define qglEvalCoord1fv glEvalCoord1fv -#define qglEvalCoord2d glEvalCoord2d -#define qglEvalCoord2dv glEvalCoord2dv -#define qglEvalCoord2f glEvalCoord2f -#define qglEvalCoord2fv glEvalCoord2fv -#define qglEvalMesh1 glEvalMesh1 -#define qglEvalMesh2 glEvalMesh2 -#define qglEvalPoint1 glEvalPoint1 -#define qglEvalPoint2 glEvalPoint2 -#define qglFeedbackBuffer glFeedbackBuffer -#define qglFinish glFinish -#define qglFlush glFlush -#define qglFogf glFogf -#define qglFogfv glFogfv -#define qglFogi glFogi -#define qglFogiv glFogiv -#define qglFrontFace glFrontFace -#define qglFrustum glFrustum -#define qglGenLists glGenLists -#define qglGenTextures glGenTextures -#define qglGetBooleanv glGetBooleanv -#define qglGetClipPlane glGetClipPlane -#define qglGetDoublev glGetDoublev -#define qglGetError glGetError -#define qglGetFloatv glGetFloatv -#define qglGetIntegerv glGetIntegerv -#define qglGetLightfv glGetLightfv -#define qglGetLightiv glGetLightiv -#define qglGetMapdv glGetMapdv -#define qglGetMapfv glGetMapfv -#define qglGetMapiv glGetMapiv -#define qglGetMaterialfv glGetMaterialfv -#define qglGetMaterialiv glGetMaterialiv -#define qglGetPixelMapfv glGetPixelMapfv -#define qglGetPixelMapuiv glGetPixelMapuiv -#define qglGetPixelMapusv glGetPixelMapusv -#define qglGetPointerv glGetPointerv -#define qglGetPolygonStipple glGetPolygonStipple -#define qglGetString glGetString -#define qglGetTexGendv glGetTexGendv -#define qglGetTexGenfv glGetTexGenfv -#define qglGetTexGeniv glGetTexGeniv -#define qglGetTexImage glGetTexImage -#define qglGetTexLevelParameterfv glGetTexLevelParameterfv -#define qglGetTexLevelParameteriv glGetTexLevelParameteriv -#define qglGetTexParameterfv glGetTexParameterfv -#define qglGetTexParameteriv glGetTexParameteriv -#define qglHint glHint -#define qglIndexMask glIndexMask -#define qglIndexPointer glIndexPointer -#define qglIndexd glIndexd -#define qglIndexdv glIndexdv -#define qglIndexf glIndexf -#define qglIndexfv glIndexfv -#define qglIndexi glIndexi -#define qglIndexiv glIndexiv -#define qglIndexs glIndexs -#define qglIndexsv glIndexsv -#define qglIndexub glIndexub -#define qglIndexubv glIndexubv -#define qglInitNames glInitNames -#define qglInterleavedArrays glInterleavedArrays -#define qglIsEnabled glIsEnabled -#define qglIsList glIsList -#define qglIsTexture glIsTexture -#define qglLightModelf glLightModelf -#define qglLightModelfv glLightModelfv -#define qglLightModeli glLightModeli -#define qglLightModeliv glLightModeliv -#define qglLightf glLightf -#define qglLightfv glLightfv -#define qglLighti glLighti -#define qglLightiv glLightiv -#define qglLineStipple glLineStipple -#define qglLineWidth glLineWidth -#define qglListBase glListBase -#define qglLoadIdentity glLoadIdentity -#define qglLoadMatrixd glLoadMatrixd -#define qglLoadMatrixf glLoadMatrixf -#define qglLoadName glLoadName -#define qglLogicOp glLogicOp -#define qglMap1d glMap1d -#define qglMap1f glMap1f -#define qglMap2d glMap2d -#define qglMap2f glMap2f -#define qglMapGrid1d glMapGrid1d -#define qglMapGrid1f glMapGrid1f -#define qglMapGrid2d glMapGrid2d -#define qglMapGrid2f glMapGrid2f -#define qglMaterialf glMaterialf -#define qglMaterialfv glMaterialfv -#define qglMateriali glMateriali -#define qglMaterialiv glMaterialiv -#define qglMatrixMode glMatrixMode -#define qglMultMatrixd glMultMatrixd -#define qglMultMatrixf glMultMatrixf -#define qglNewList glNewList -#define qglNormal3b glNormal3b -#define qglNormal3bv glNormal3bv -#define qglNormal3d glNormal3d -#define qglNormal3dv glNormal3dv -#define qglNormal3f glNormal3f -#define qglNormal3fv glNormal3fv -#define qglNormal3i glNormal3i -#define qglNormal3iv glNormal3iv -#define qglNormal3s glNormal3s -#define qglNormal3sv glNormal3sv -#define qglNormalPointer glNormalPointer -#define qglOrtho glOrtho -#define qglPassThrough glPassThrough -#define qglPixelMapfv glPixelMapfv -#define qglPixelMapuiv glPixelMapuiv -#define qglPixelMapusv glPixelMapusv -#define qglPixelStoref glPixelStoref -#define qglPixelStorei glPixelStorei -#define qglPixelTransferf glPixelTransferf -#define qglPixelTransferi glPixelTransferi -#define qglPixelZoom glPixelZoom -#define qglPointSize glPointSize -#define qglPolygonMode glPolygonMode -#define qglPolygonOffset glPolygonOffset -#define qglPolygonStipple glPolygonStipple -#define qglPopAttrib glPopAttrib -#define qglPopClientAttrib glPopClientAttrib -#define qglPopMatrix glPopMatrix -#define qglPopName glPopName -#define qglPrioritizeTextures glPrioritizeTextures -#define qglPushAttrib glPushAttrib -#define qglPushClientAttrib glPushClientAttrib -#define qglPushMatrix glPushMatrix -#define qglPushName glPushName -#define qglRasterPos2d glRasterPos2d -#define qglRasterPos2dv glRasterPos2dv -#define qglRasterPos2f glRasterPos2f -#define qglRasterPos2fv glRasterPos2fv -#define qglRasterPos2i glRasterPos2i -#define qglRasterPos2iv glRasterPos2iv -#define qglRasterPos2s glRasterPos2s -#define qglRasterPos2sv glRasterPos2sv -#define qglRasterPos3d glRasterPos3d -#define qglRasterPos3dv glRasterPos3dv -#define qglRasterPos3f glRasterPos3f -#define qglRasterPos3fv glRasterPos3fv -#define qglRasterPos3i glRasterPos3i -#define qglRasterPos3iv glRasterPos3iv -#define qglRasterPos3s glRasterPos3s -#define qglRasterPos3sv glRasterPos3sv -#define qglRasterPos4d glRasterPos4d -#define qglRasterPos4dv glRasterPos4dv -#define qglRasterPos4f glRasterPos4f -#define qglRasterPos4fv glRasterPos4fv -#define qglRasterPos4i glRasterPos4i -#define qglRasterPos4iv glRasterPos4iv -#define qglRasterPos4s glRasterPos4s -#define qglRasterPos4sv glRasterPos4sv -#define qglReadBuffer glReadBuffer -#define qglReadPixels glReadPixels -#define qglRectd glRectd -#define qglRectdv glRectdv -#define qglRectf glRectf -#define qglRectfv glRectfv -#define qglRecti glRecti -#define qglRectiv glRectiv -#define qglRects glRects -#define qglRectsv glRectsv -#define qglRenderMode glRenderMode -#define qglRotated glRotated -#define qglRotatef glRotatef -#define qglScaled glScaled -#define qglScalef glScalef -#define qglScissor glScissor -#define qglSelectBuffer glSelectBuffer -#define qglShadeModel glShadeModel -#define qglStencilFunc glStencilFunc -#define qglStencilMask glStencilMask -#define qglStencilOp glStencilOp -#define qglTexCoord1d glTexCoord1d -#define qglTexCoord1dv glTexCoord1dv -#define qglTexCoord1f glTexCoord1f -#define qglTexCoord1fv glTexCoord1fv -#define qglTexCoord1i glTexCoord1i -#define qglTexCoord1iv glTexCoord1iv -#define qglTexCoord1s glTexCoord1s -#define qglTexCoord1sv glTexCoord1sv -#define qglTexCoord2d glTexCoord2d -#define qglTexCoord2dv glTexCoord2dv -#define qglTexCoord2f glTexCoord2f -#define qglTexCoord2fv glTexCoord2fv -#define qglTexCoord2i glTexCoord2i -#define qglTexCoord2iv glTexCoord2iv -#define qglTexCoord2s glTexCoord2s -#define qglTexCoord2sv glTexCoord2sv -#define qglTexCoord3d glTexCoord3d -#define qglTexCoord3dv glTexCoord3dv -#define qglTexCoord3f glTexCoord3f -#define qglTexCoord3fv glTexCoord3fv -#define qglTexCoord3i glTexCoord3i -#define qglTexCoord3iv glTexCoord3iv -#define qglTexCoord3s glTexCoord3s -#define qglTexCoord3sv glTexCoord3sv -#define qglTexCoord4d glTexCoord4d -#define qglTexCoord4dv glTexCoord4dv -#define qglTexCoord4f glTexCoord4f -#define qglTexCoord4fv glTexCoord4fv -#define qglTexCoord4i glTexCoord4i -#define qglTexCoord4iv glTexCoord4iv -#define qglTexCoord4s glTexCoord4s -#define qglTexCoord4sv glTexCoord4sv -#define qglTexCoordPointer glTexCoordPointer -#define qglTexEnvf glTexEnvf -#define qglTexEnvfv glTexEnvfv -#define qglTexEnvi glTexEnvi -#define qglTexEnviv glTexEnviv -#define qglTexGend glTexGend -#define qglTexGendv glTexGendv -#define qglTexGenf glTexGenf -#define qglTexGenfv glTexGenfv -#define qglTexGeni glTexGeni -#define qglTexGeniv glTexGeniv -#define qglTexImage1D glTexImage1D -#define qglTexImage2D glTexImage2D -#define qglTexParameterf glTexParameterf -#define qglTexParameterfv glTexParameterfv -#define qglTexParameteri glTexParameteri -#define qglTexParameteriv glTexParameteriv -#define qglTexSubImage1D glTexSubImage1D -#define qglTexSubImage2D glTexSubImage2D -#define qglTranslated glTranslated -#define qglTranslatef glTranslatef -#define qglVertex2d glVertex2d -#define qglVertex2dv glVertex2dv -#define qglVertex2f glVertex2f -#define qglVertex2fv glVertex2fv -#define qglVertex2i glVertex2i -#define qglVertex2iv glVertex2iv -#define qglVertex2s glVertex2s -#define qglVertex2sv glVertex2sv -#define qglVertex3d glVertex3d -#define qglVertex3dv glVertex3dv -#define qglVertex3f glVertex3f -#define qglVertex3fv glVertex3fv -#define qglVertex3i glVertex3i -#define qglVertex3iv glVertex3iv -#define qglVertex3s glVertex3s -#define qglVertex3sv glVertex3sv -#define qglVertex4d glVertex4d -#define qglVertex4dv glVertex4dv -#define qglVertex4f glVertex4f -#define qglVertex4fv glVertex4fv -#define qglVertex4i glVertex4i -#define qglVertex4iv glVertex4iv -#define qglVertex4s glVertex4s -#define qglVertex4sv glVertex4sv -#define qglVertexPointer glVertexPointer -#define qglViewport glViewport - -extern void (APIENTRYP qglActiveTextureARB) (GLenum texture); -extern void (APIENTRYP qglClientActiveTextureARB) (GLenum texture); -extern void (APIENTRYP qglMultiTexCoord2fARB) (GLenum target, GLfloat s, GLfloat t); - -extern void (APIENTRYP qglCombinerParameterfvNV) (GLenum pname,const GLfloat *params); -extern void (APIENTRYP qglCombinerParameterivNV) (GLenum pname,const GLint *params); -extern void (APIENTRYP qglCombinerParameterfNV) (GLenum pname,GLfloat param); -extern void (APIENTRYP qglCombinerParameteriNV) (GLenum pname,GLint param); -extern void (APIENTRYP qglCombinerInputNV) (GLenum stage,GLenum portion,GLenum variable,GLenum input,GLenum mapping, - GLenum componentUsage); -extern void (APIENTRYP qglCombinerOutputNV) (GLenum stage,GLenum portion,GLenum abOutput,GLenum cdOutput,GLenum sumOutput, - GLenum scale, GLenum bias,GLboolean abDotProduct,GLboolean cdDotProduct, - GLboolean muxSum); - -extern void (APIENTRYP qglFinalCombinerInputNV) (GLenum variable,GLenum input,GLenum mapping,GLenum componentUsage); -extern void (APIENTRYP qglGetCombinerInputParameterfvNV) (GLenum stage,GLenum portion,GLenum variable,GLenum pname,GLfloat *params); -extern void (APIENTRYP qglGetCombinerInputParameterivNV) (GLenum stage,GLenum portion,GLenum variable,GLenum pname,GLint *params); -extern void (APIENTRYP qglGetCombinerOutputParameterfvNV) (GLenum stage,GLenum portion,GLenum pname,GLfloat *params); -extern void (APIENTRYP qglGetCombinerOutputParameterivNV) (GLenum stage,GLenum portion,GLenum pname,GLint *params); -extern void (APIENTRYP qglGetFinalCombinerInputParameterfvNV) (GLenum variable,GLenum pname,GLfloat *params); -extern void (APIENTRYP qglGetFinalCombinerInputParameterivNV) (GLenum variable,GLenum pname,GLint *params); - -extern PFNGLPROGRAMSTRINGARBPROC qglProgramStringARB; -extern PFNGLBINDPROGRAMARBPROC qglBindProgramARB; -extern PFNGLDELETEPROGRAMSARBPROC qglDeleteProgramsARB; -extern PFNGLGENPROGRAMSARBPROC qglGenProgramsARB; -extern PFNGLPROGRAMENVPARAMETER4DARBPROC qglProgramEnvParameter4dARB; -extern PFNGLPROGRAMENVPARAMETER4DVARBPROC qglProgramEnvParameter4dvARB; -extern PFNGLPROGRAMENVPARAMETER4FARBPROC qglProgramEnvParameter4fARB; -extern PFNGLPROGRAMENVPARAMETER4FVARBPROC qglProgramEnvParameter4fvARB; -extern PFNGLPROGRAMLOCALPARAMETER4DARBPROC qglProgramLocalParameter4dARB; -extern PFNGLPROGRAMLOCALPARAMETER4DVARBPROC qglProgramLocalParameter4dvARB; -extern PFNGLPROGRAMLOCALPARAMETER4FARBPROC qglProgramLocalParameter4fARB; -extern PFNGLPROGRAMLOCALPARAMETER4FVARBPROC qglProgramLocalParameter4fvARB; -extern PFNGLGETPROGRAMENVPARAMETERDVARBPROC qglGetProgramEnvParameterdvARB; -extern PFNGLGETPROGRAMENVPARAMETERFVARBPROC qglGetProgramEnvParameterfvARB; -extern PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC qglGetProgramLocalParameterdvARB; -extern PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC qglGetProgramLocalParameterfvARB; -extern PFNGLGETPROGRAMIVARBPROC qglGetProgramivARB; -extern PFNGLGETPROGRAMSTRINGARBPROC qglGetProgramStringARB; -extern PFNGLISPROGRAMARBPROC qglIsProgramARB; - -extern void ( * qglLockArraysEXT)( int, int); -extern void ( * qglUnlockArraysEXT) ( void ); - -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_ACTIVE_TEXTURES_ARB 0x84E2 diff --git a/code/sdl/sdl_snd.cpp b/code/sdl/sdl_snd.cpp deleted file mode 100644 index 08d1e018e5..0000000000 --- a/code/sdl/sdl_snd.cpp +++ /dev/null @@ -1,293 +0,0 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code is free software; you can redistribute it -and/or modify it under the terms of the GNU General Public License as -published by the Free Software Foundation; either version 2 of the License, -or (at your option) any later version. - -Quake III Arena source code is distributed in the hope that it will be -useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Quake III Arena source code; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ - -#include -#include - -#include - -#include "../qcommon/q_shared.h" -#include "../client/client.h" -#include "../client/snd_local.h" - -extern dma_t dma; -qboolean snd_inited = qfalse; - -cvar_t *s_sdlBits; -cvar_t *s_sdlSpeed; -cvar_t *s_sdlChannels; -cvar_t *s_sdlDevSamps; -cvar_t *s_sdlMixSamps; - -/* The audio callback. All the magic happens here. */ -static int dmapos = 0; -static int dmasize = 0; - -/* -=============== -SNDDMA_AudioCallback -=============== -*/ -static void SNDDMA_AudioCallback(void *userdata, Uint8 *stream, int len) -{ - int pos = (dmapos * (dma.samplebits/8)); - if (pos >= dmasize) - dmapos = pos = 0; - - if (!snd_inited) /* shouldn't happen, but just in case... */ - { - memset(stream, '\0', len); - return; - } - else - { - int tobufend = dmasize - pos; /* bytes to buffer's end. */ - int len1 = len; - int len2 = 0; - - if (len1 > tobufend) - { - len1 = tobufend; - len2 = len - len1; - } - memcpy(stream, dma.buffer + pos, len1); - if (len2 <= 0) - dmapos += (len1 / (dma.samplebits/8)); - else /* wraparound? */ - { - memcpy(stream+len1, dma.buffer, len2); - dmapos = (len2 / (dma.samplebits/8)); - } - } - - if (dmapos >= dmasize) - dmapos = 0; -} - -static struct -{ - Uint16 enumFormat; - char *stringFormat; -} formatToStringTable[ ] = -{ - { AUDIO_U8, "AUDIO_U8" }, - { AUDIO_S8, "AUDIO_S8" }, - { AUDIO_U16LSB, "AUDIO_U16LSB" }, - { AUDIO_S16LSB, "AUDIO_S16LSB" }, - { AUDIO_U16MSB, "AUDIO_U16MSB" }, - { AUDIO_S16MSB, "AUDIO_S16MSB" } -}; - -static int formatToStringTableSize = ARRAY_LEN( formatToStringTable ); - -/* -=============== -SNDDMA_PrintAudiospec -=============== -*/ -static void SNDDMA_PrintAudiospec(const char *str, const SDL_AudioSpec *spec) -{ - int i; - char *fmt = NULL; - - Com_Printf("%s:\n", str); - - for( i = 0; i < formatToStringTableSize; i++ ) { - if( spec->format == formatToStringTable[ i ].enumFormat ) { - fmt = formatToStringTable[ i ].stringFormat; - } - } - - if( fmt ) { - Com_Printf( " Format: %s\n", fmt ); - } else { - Com_Printf( " Format: " S_COLOR_RED "UNKNOWN\n"); - } - - Com_Printf( " Freq: %d\n", (int) spec->freq ); - Com_Printf( " Samples: %d\n", (int) spec->samples ); - Com_Printf( " Channels: %d\n", (int) spec->channels ); -} - -/* -=============== -SNDDMA_Init -=============== -*/ -qboolean SNDDMA_Init(void) -{ - SDL_AudioSpec desired; - SDL_AudioSpec obtained; - int tmp; - - if (snd_inited) - return qtrue; - - if (!s_sdlBits) { - s_sdlBits = Cvar_Get("s_sdlBits", "16", CVAR_ARCHIVE); - s_sdlSpeed = Cvar_Get("s_sdlSpeed", "44100", CVAR_ARCHIVE); - s_sdlChannels = Cvar_Get("s_sdlChannels", "2", CVAR_ARCHIVE); - s_sdlDevSamps = Cvar_Get("s_sdlDevSamps", "0", CVAR_ARCHIVE); - s_sdlMixSamps = Cvar_Get("s_sdlMixSamps", "0", CVAR_ARCHIVE); - } - - Com_Printf( "SDL_Init( SDL_INIT_AUDIO )... " ); - - if (!SDL_WasInit(SDL_INIT_AUDIO)) - { - if (SDL_Init(SDL_INIT_AUDIO) == -1) - { - Com_Printf( "FAILED (%s)\n", SDL_GetError( ) ); - return qfalse; - } - } - - Com_Printf( "OK\n" ); - - Com_Printf( "SDL audio driver is \"%s\".\n", SDL_GetCurrentAudioDriver( ) ); - - memset(&desired, '\0', sizeof (desired)); - memset(&obtained, '\0', sizeof (obtained)); - - tmp = ((int) s_sdlBits->value); - if ((tmp != 16) && (tmp != 8)) - tmp = 16; - - desired.freq = (int) s_sdlSpeed->value; - if(!desired.freq) desired.freq = 44100; - desired.format = ((tmp == 16) ? AUDIO_S16SYS : AUDIO_U8); - - // I dunno if this is the best idea, but I'll give it a try... - // should probably check a cvar for this... - if (s_sdlDevSamps->value) - desired.samples = s_sdlDevSamps->value; - else - { - // just pick a sane default. - if (desired.freq <= 11025) - desired.samples = 256; - else if (desired.freq <= 22050) - desired.samples = 512; - else if (desired.freq <= 44100) - desired.samples = 1024; - else - desired.samples = 2048; // (*shrug*) - } - - desired.channels = (int) s_sdlChannels->value; - desired.callback = SNDDMA_AudioCallback; - - if (SDL_OpenAudio(&desired, &obtained) == -1) - { - Com_Printf("SDL_OpenAudio() failed: %s\n", SDL_GetError()); - SDL_QuitSubSystem(SDL_INIT_AUDIO); - return qfalse; - } - - SNDDMA_PrintAudiospec("SDL_AudioSpec", &obtained); - - // dma.samples needs to be big, or id's mixer will just refuse to - // work at all; we need to keep it significantly bigger than the - // amount of SDL callback samples, and just copy a little each time - // the callback runs. - // 32768 is what the OSS driver filled in here on my system. I don't - // know if it's a good value overall, but at least we know it's - // reasonable...this is why I let the user override. - tmp = s_sdlMixSamps->value; - if (!tmp) - tmp = (obtained.samples * obtained.channels) * 10; - - if (tmp & (tmp - 1)) // not a power of two? Seems to confuse something. - { - int val = 1; - while (val < tmp) - val <<= 1; - - tmp = val; - } - - dmapos = 0; - dma.samplebits = obtained.format & 0xFF; // first byte of format is bits. - dma.channels = obtained.channels; - dma.samples = tmp; - dma.submission_chunk = 1; - dma.speed = obtained.freq; - dmasize = (dma.samples * (dma.samplebits/8)); - dma.buffer = (byte *)calloc(1, dmasize); - - Com_Printf("Starting SDL audio callback...\n"); - SDL_PauseAudio(0); // start callback. - - Com_Printf("SDL audio initialized.\n"); - snd_inited = qtrue; - return qtrue; -} - -/* -=============== -SNDDMA_GetDMAPos -=============== -*/ -int SNDDMA_GetDMAPos(void) -{ - return dmapos; -} - -/* -=============== -SNDDMA_Shutdown -=============== -*/ -void SNDDMA_Shutdown(void) -{ - Com_Printf("Closing SDL audio device...\n"); - SDL_PauseAudio(1); - SDL_CloseAudio(); - SDL_QuitSubSystem(SDL_INIT_AUDIO); - free(dma.buffer); - dma.buffer = NULL; - dmapos = dmasize = 0; - snd_inited = qfalse; - Com_Printf("SDL audio device shut down.\n"); -} - -/* -=============== -SNDDMA_Submit - -Send sound to device if buffer isn't really the dma buffer -=============== -*/ -void SNDDMA_Submit(void) -{ - SDL_UnlockAudio(); -} - -/* -=============== -SNDDMA_BeginPainting -=============== -*/ -void SNDDMA_BeginPainting (void) -{ - SDL_LockAudio(); -} diff --git a/code/server/exe_headers.cpp b/code/server/exe_headers.cpp index 92623add3f..e402d309ab 100644 --- a/code/server/exe_headers.cpp +++ b/code/server/exe_headers.cpp @@ -1,23 +1,23 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// The file that generates the PCH for the whole executable... -// +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "../server/exe_headers.h" - diff --git a/code/server/exe_headers.h b/code/server/exe_headers.h index 4a54fb7409..42fdfc93ba 100644 --- a/code/server/exe_headers.h +++ b/code/server/exe_headers.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // stuff added for PCH files. I want to have a lot of stuff included here so the PCH is pretty rich, // but without exposing too many extra protos, so for now (while I experiment)... diff --git a/code/server/server.h b/code/server/server.h index 06ae712750..9f30f68b82 100644 --- a/code/server/server.h +++ b/code/server/server.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // server.h diff --git a/code/server/sv_ccmds.cpp b/code/server/sv_ccmds.cpp index 8befd4152c..9cc80ed1c8 100644 --- a/code/server/sv_ccmds.cpp +++ b/code/server/sv_ccmds.cpp @@ -1,27 +1,28 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - - #include "server.h" #include "../game/weapons.h" #include "../game/g_items.h" @@ -226,7 +227,9 @@ static void SV_MapTransition_f(void) { const char *spawntarget; -// SCR_PrecacheScreenshot(); +#ifdef JK2_MODE + SCR_PrecacheScreenshot(); +#endif SV_Player_EndOfLevelSave(); spawntarget = Cmd_Argv(2); @@ -250,13 +253,18 @@ Restart the server on a different map, but clears a cvar so that typing "map bla player weapons/ammo/etc from the previous level that you haven't really exited (ie ignores KEEP_PREV on spawn points) ================== */ +#ifdef JK2_MODE +extern void SCR_UnprecacheScreenshot(); +#endif static void SV_Map_f( void ) { Cvar_Set( sCVARNAME_PLAYERSAVE, ""); Cvar_Set( "spawntarget", "" ); Cvar_Set("tier_storyinfo", "0"); Cvar_Set("tiers_complete", ""); -// SCR_UnprecacheScreenshot(); +#ifdef JK2_MODE + SCR_UnprecacheScreenshot(); +#endif ForceReload_e eForceReload = eForceReload_NOTHING; // default for normal load @@ -304,7 +312,9 @@ void SV_LoadTransition_f(void) qbLoadTransition = qtrue; -// SCR_PrecacheScreenshot(); +#ifdef JK2_MODE + SCR_PrecacheScreenshot(); +#endif SV_Player_EndOfLevelSave(); //Save the full current state of the current map so we can return to it later diff --git a/code/server/sv_client.cpp b/code/server/sv_client.cpp index b2cc7230dd..26644af6da 100644 --- a/code/server/sv_client.cpp +++ b/code/server/sv_client.cpp @@ -1,30 +1,30 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // sv_client.c -- server code for dealing with clients -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - - - #include "server.h" /* diff --git a/code/server/sv_game.cpp b/code/server/sv_game.cpp index 1e1ad17726..d0fef83715 100644 --- a/code/server/sv_game.cpp +++ b/code/server/sv_game.cpp @@ -1,25 +1,28 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // sv_game.c -- interface to the game dll -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" #include "../qcommon/cm_local.h" @@ -40,9 +43,9 @@ Ghoul2 Insert Start Ghoul2 Insert End */ +static void *gameLibrary; + //prototypes -extern void Sys_UnloadGame( void ); -extern void *Sys_GetGameAPI( void *parms); extern void Com_WriteCam ( const char *text ); extern void Com_FlushCamFile(); @@ -404,7 +407,7 @@ void SV_ShutdownGameProgs (qboolean shutdownCin) { SCR_StopCinematic(); CL_ShutdownCGame(); //we have cgame burried in here. - Sys_UnloadGame (); //this kills cgame as well. + Sys_UnloadDll( gameLibrary ); ge = NULL; cgvm.entryPoint = 0; @@ -417,22 +420,448 @@ static void *G_ZMalloc_Helper( int iSize, memtag_t eTag, qboolean bZeroit) return Z_Malloc( iSize, eTag, bZeroit ); } -//rww - RAGDOLL_BEGIN -/* -void G2API_SetRagDoll(CGhoul2Info_v &ghoul2,CRagDollParams *parms); -void G2API_AnimateG2Models(CGhoul2Info_v &ghoul2, int AcurrentTime,CRagDollUpdateParams *params); - -qboolean G2API_RagPCJConstraint(CGhoul2Info_v &ghoul2, const char *boneName, vec3_t min, vec3_t max); -qboolean G2API_RagPCJGradientSpeed(CGhoul2Info_v &ghoul2, const char *boneName, const float speed); -qboolean G2API_RagEffectorGoal(CGhoul2Info_v &ghoul2, const char *boneName, vec3_t pos); -qboolean G2API_GetRagBonePos(CGhoul2Info_v &ghoul2, const char *boneName, vec3_t pos, vec3_t entAngles, vec3_t entPos, vec3_t entScale); -qboolean G2API_RagEffectorKick(CGhoul2Info_v &ghoul2, const char *boneName, vec3_t velocity); -qboolean G2API_RagForceSolve(CGhoul2Info_v &ghoul2, qboolean force); - -qboolean G2API_SetBoneIKState(CGhoul2Info_v &ghoul2, int time, const char *boneName, int ikState, sharedSetBoneIKStateParams_t *params); -qboolean G2API_IKMove(CGhoul2Info_v &ghoul2, int time, sharedIKMoveParams_t *params); -*/ -//rww - RAGDOLL_END +static int SV_G2API_AddBolt( CGhoul2Info *ghlInfo, const char *boneName ) +{ + return re.G2API_AddBolt( ghlInfo, boneName ); +} + +static int SV_G2API_AddBoltSurfNum( CGhoul2Info *ghlInfo, const int surfIndex ) +{ + return re.G2API_AddBoltSurfNum( ghlInfo, surfIndex ); +} + +static int SV_G2API_AddSurface( CGhoul2Info *ghlInfo, int surfaceNumber, int polyNumber, float BarycentricI, float BarycentricJ, int lod ) +{ + return re.G2API_AddSurface( ghlInfo, surfaceNumber, polyNumber, BarycentricI, BarycentricJ, lod ); +} + +static void SV_G2API_AnimateG2Models( CGhoul2Info_v &ghoul2, int AcurrentTime, CRagDollUpdateParams *params ) +{ + re.G2API_AnimateG2Models( ghoul2, AcurrentTime, params ); +} + +static int SV_G2API_AttachEnt( int *boltInfo, CGhoul2Info *ghlInfoTo, int toBoltIndex, int entNum, int toModelNum ) +{ + return re.G2API_AttachEnt( boltInfo, ghlInfoTo, toBoltIndex, entNum, toModelNum ); +} + +static int SV_G2API_AttachG2Model( CGhoul2Info *ghlInfo, CGhoul2Info *ghlInfoTo, int toBoltIndex, int toModel ) +{ + return re.G2API_AttachG2Model( ghlInfo, ghlInfoTo, toBoltIndex, toModel ); +} + +static void SV_G2API_CleanGhoul2Models( CGhoul2Info_v &ghoul2 ) +{ + return re.G2API_CleanGhoul2Models( ghoul2 ); +} + +static void SV_G2API_CollisionDetect( + CCollisionRecord *collRecMap, CGhoul2Info_v &ghoul2, const vec3_t angles, const vec3_t position, + int AframeNumber, int entNum, vec3_t rayStart, vec3_t rayEnd, vec3_t scale, CMiniHeap *miniHeap, + EG2_Collision eG2TraceType, int useLod, float fRadius ) +{ + re.G2API_CollisionDetect( collRecMap, ghoul2, angles, position, AframeNumber, + entNum, rayStart, rayEnd, scale, miniHeap, eG2TraceType, useLod, fRadius ); +} + +static void SV_G2API_CopyGhoul2Instance( CGhoul2Info_v &ghoul2From, CGhoul2Info_v &ghoul2To, int modelIndex ) +{ + re.G2API_CopyGhoul2Instance( ghoul2From, ghoul2To, modelIndex ); +} + +static void SV_G2API_DetachEnt( int *boltInfo ) +{ + re.G2API_DetachEnt( boltInfo ); +} + +static qboolean SV_G2API_DetachG2Model( CGhoul2Info *ghlInfo ) +{ + return re.G2API_DetachG2Model( ghlInfo ); +} +static qboolean SV_G2API_GetAnimFileName( CGhoul2Info *ghlInfo, char **filename ) +{ + return re.G2API_GetAnimFileName( ghlInfo, filename ); +} + +static char* SV_G2API_GetAnimFileNameIndex( qhandle_t modelIndex ) +{ + return re.G2API_GetAnimFileNameIndex( modelIndex ); +} + +static char* SV_G2API_GetAnimFileInternalNameIndex( qhandle_t modelIndex ) +{ + return re.G2API_GetAnimFileInternalNameIndex( modelIndex ); +} + +static int SV_G2API_GetAnimIndex( CGhoul2Info *ghlInfo ) +{ + return re.G2API_GetAnimIndex( ghlInfo ); +} + +static qboolean SV_G2API_GetAnimRange( CGhoul2Info *ghlInfo, const char *boneName, int *startFrame, int *endFrame ) +{ + return re.G2API_GetAnimRange( ghlInfo, boneName, startFrame, endFrame ); +} + +static qboolean SV_G2API_GetAnimRangeIndex( CGhoul2Info *ghlInfo, const int boneIndex, int *startFrame, int *endFrame ) +{ + return re.G2API_GetAnimRangeIndex( ghlInfo, boneIndex, startFrame, endFrame ); +} + +static qboolean SV_G2API_GetBoneAnim( + CGhoul2Info *ghlInfo, const char *boneName, const int AcurrentTime, + float *currentFrame, int *startFrame, int *endFrame, int *flags, float *animSpeed, int *modelList ) +{ + return re.G2API_GetBoneAnim( ghlInfo, boneName, AcurrentTime, currentFrame, + startFrame, endFrame, flags, animSpeed, modelList ); +} + +static qboolean SV_G2API_GetBoneAnimIndex(CGhoul2Info *ghlInfo, const int iBoneIndex, const int AcurrentTime, + float *currentFrame, int *startFrame, int *endFrame, int *flags, float *animSpeed, int *modelList) +{ + return re.G2API_GetBoneAnimIndex( ghlInfo, iBoneIndex, AcurrentTime, currentFrame, + startFrame, endFrame, flags, animSpeed, modelList ); +} + +static int SV_G2API_GetBoneIndex( CGhoul2Info *ghlInfo, const char *boneName, qboolean bAddIfNotFound ) +{ + return re.G2API_GetBoneIndex( ghlInfo, boneName, bAddIfNotFound ); +} + +static qboolean SV_G2API_GetBoltMatrix( + CGhoul2Info_v &ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix, const vec3_t angles, + const vec3_t position, const int AframeNum, qhandle_t *modelList, const vec3_t scale ) +{ + return re.G2API_GetBoltMatrix(ghoul2, modelIndex, boltIndex, matrix, angles, + position, AframeNum, modelList, scale ); +} + +static int SV_G2API_GetGhoul2ModelFlags( CGhoul2Info *ghlInfo ) +{ + return re.G2API_GetGhoul2ModelFlags( ghlInfo ); +} + +static char* SV_G2API_GetGLAName( CGhoul2Info *ghlInfo ) +{ + return re.G2API_GetGLAName( ghlInfo ); +} + +static int SV_G2API_GetParentSurface( CGhoul2Info *ghlInfo, const int index ) +{ + return re.G2API_GetParentSurface( ghlInfo, index ); +} + +static qboolean SV_G2API_GetRagBonePos( + CGhoul2Info_v &ghoul2, const char *boneName, vec3_t pos, vec3_t entAngles, vec3_t entPos, vec3_t entScale) +{ + return re.G2API_GetRagBonePos( ghoul2, boneName, pos, entAngles, entPos, entScale ); +} + +static int SV_G2API_GetSurfaceIndex( CGhoul2Info *ghlInfo, const char *surfaceName ) +{ + return re.G2API_GetSurfaceIndex( ghlInfo, surfaceName ); +} + +static char* SV_G2API_GetSurfaceName( CGhoul2Info *ghlInfo, int surfNumber ) +{ + return re.G2API_GetSurfaceName( ghlInfo, surfNumber ); +} + +static int SV_G2API_GetSurfaceRenderStatus( CGhoul2Info *ghlInfo, const char *surfaceName ) +{ + return re.G2API_GetSurfaceRenderStatus( ghlInfo, surfaceName ); +} + +static void SV_G2API_GiveMeVectorFromMatrix( mdxaBone_t &boltMatrix, Eorientations flags, vec3_t &vec ) +{ + re.G2API_GiveMeVectorFromMatrix( boltMatrix, flags, vec ); +} + +static int SV_G2API_HaveWeGhoul2Models( CGhoul2Info_v &ghoul2 ) +{ + return re.G2API_HaveWeGhoul2Models( ghoul2 ); +} + +static qboolean SV_G2API_IKMove( CGhoul2Info_v &ghoul2, int time, sharedIKMoveParams_t *params ) +{ + return re.G2API_IKMove( ghoul2, time, params ); +} + +static int SV_G2API_InitGhoul2Model(CGhoul2Info_v &ghoul2, const char *fileName, int modelIndex, + qhandle_t customSkin, qhandle_t customShader, int modelFlags, int lodBias) +{ + return re.G2API_InitGhoul2Model( ghoul2, fileName, modelIndex, customSkin, customShader, modelFlags, lodBias ); +} + +static qboolean SV_G2API_IsPaused( CGhoul2Info *ghlInfo, const char *boneName ) +{ + return re.G2API_IsPaused( ghlInfo, boneName ); +} + +static void SV_G2API_ListBones( CGhoul2Info *ghlInfo, int frame ) +{ + return re.G2API_ListBones( ghlInfo, frame ); +} + +static void SV_G2API_ListSurfaces( CGhoul2Info *ghlInfo ) +{ + return re.G2API_ListSurfaces( ghlInfo ); +} + +static void SV_G2API_LoadGhoul2Models( CGhoul2Info_v &ghoul2, char *buffer ) +{ + return re.G2API_LoadGhoul2Models( ghoul2, buffer ); +} + +static void SV_G2API_LoadSaveCodeDestructGhoul2Info( CGhoul2Info_v &ghoul2 ) +{ + return re.G2API_LoadSaveCodeDestructGhoul2Info( ghoul2 ); +} + +static qboolean SV_G2API_PauseBoneAnim( CGhoul2Info *ghlInfo, const char *boneName, const int AcurrentTime ) +{ + return re.G2API_PauseBoneAnim( ghlInfo, boneName, AcurrentTime ); +} + +static qboolean SV_G2API_PauseBoneAnimIndex( CGhoul2Info *ghlInfo, const int boneIndex, const int AcurrentTime ) +{ + return re.G2API_PauseBoneAnimIndex( ghlInfo, boneIndex, AcurrentTime ); +} + +static qhandle_t SV_G2API_PrecacheGhoul2Model( const char *fileName ) +{ + return re.G2API_PrecacheGhoul2Model( fileName ); +} + +static qboolean SV_G2API_RagEffectorGoal( CGhoul2Info_v &ghoul2, const char *boneName, vec3_t pos ) +{ + return re.G2API_RagEffectorGoal( ghoul2, boneName, pos ); +} + +static qboolean SV_G2API_RagEffectorKick( CGhoul2Info_v &ghoul2, const char *boneName, vec3_t velocity ) +{ + return re.G2API_RagEffectorKick( ghoul2, boneName, velocity ); +} + +static qboolean SV_G2API_RagForceSolve( CGhoul2Info_v &ghoul2, qboolean force ) +{ + return re.G2API_RagForceSolve( ghoul2, force ); +} + +static qboolean SV_G2API_RagPCJConstraint( CGhoul2Info_v &ghoul2, const char *boneName, vec3_t min, vec3_t max ) +{ + return re.G2API_RagPCJConstraint( ghoul2, boneName, min, max ); +} + +static qboolean SV_G2API_RagPCJGradientSpeed( CGhoul2Info_v &ghoul2, const char *boneName, const float speed ) +{ + return re.G2API_RagPCJGradientSpeed( ghoul2, boneName, speed ); +} + +static qboolean SV_G2API_RemoveBolt( CGhoul2Info *ghlInfo, const int index ) +{ + return re.G2API_RemoveBolt( ghlInfo, index ); +} + +static qboolean SV_G2API_RemoveBone( CGhoul2Info *ghlInfo, const char *boneName ) +{ + return re.G2API_RemoveBone( ghlInfo, boneName ); +} + +static qboolean SV_G2API_RemoveGhoul2Model( CGhoul2Info_v &ghlInfo, const int modelIndex ) +{ + return re.G2API_RemoveGhoul2Model( ghlInfo, modelIndex ); +} + +static qboolean SV_G2API_RemoveSurface( CGhoul2Info *ghlInfo, const int index ) +{ + return re.G2API_RemoveSurface( ghlInfo, index ); +} + +static void SV_G2API_SaveGhoul2Models( CGhoul2Info_v &ghoul2 ) +{ + return re.G2API_SaveGhoul2Models( ghoul2 ); +} + +static qboolean SV_G2API_SetAnimIndex( CGhoul2Info *ghlInfo, const int index ) +{ + return re.G2API_SetAnimIndex( ghlInfo, index ); +} + +static qboolean SV_G2API_SetBoneAnim(CGhoul2Info *ghlInfo, const char *boneName, const int startFrame, const int endFrame, + const int flags, const float animSpeed, const int AcurrentTime, const float setFrame, const int blendTime) +{ + return re.G2API_SetBoneAnim( ghlInfo, boneName, startFrame, endFrame, flags, + animSpeed, AcurrentTime, setFrame, blendTime ); +} + +static qboolean SV_G2API_SetBoneAnimIndex(CGhoul2Info *ghlInfo, const int index, const int startFrame, const int endFrame, + const int flags, const float animSpeed, const int AcurrentTime, const float setFrame, const int blendTime) +{ + return re.G2API_SetBoneAnimIndex( ghlInfo, index, startFrame, endFrame, flags, + animSpeed, AcurrentTime, setFrame, blendTime ); +} + +static qboolean SV_G2API_SetBoneAngles(CGhoul2Info *ghlInfo, const char *boneName, const vec3_t angles, const int flags, + const Eorientations up, const Eorientations left, const Eorientations forward, qhandle_t *modelList, + int blendTime, int AcurrentTime) +{ + return re.G2API_SetBoneAngles( ghlInfo, boneName, angles, flags, up, left, forward, + modelList, blendTime, AcurrentTime ); +} + +static qboolean SV_G2API_SetBoneAnglesIndex(CGhoul2Info *ghlInfo, const int index, const vec3_t angles, const int flags, + const Eorientations yaw, const Eorientations pitch, const Eorientations roll, qhandle_t *modelList, + int blendTime, int AcurrentTime) +{ + return re.G2API_SetBoneAnglesIndex( ghlInfo, index, angles, flags, yaw, pitch, roll, + modelList, blendTime, AcurrentTime ); +} + +static qboolean SV_G2API_SetBoneAnglesMatrix(CGhoul2Info *ghlInfo, const char *boneName, const mdxaBone_t &matrix, + const int flags, qhandle_t *modelList, int blendTime, int AcurrentTime) +{ + return re.G2API_SetBoneAnglesMatrix( ghlInfo, boneName, matrix, flags, modelList, blendTime, AcurrentTime ); +} + +static qboolean SV_G2API_SetBoneAnglesMatrixIndex(CGhoul2Info *ghlInfo, const int index, const mdxaBone_t &matrix, + const int flags, qhandle_t *modelList, int blandeTime, int AcurrentTime) +{ + return re.G2API_SetBoneAnglesMatrixIndex( ghlInfo, index, matrix, flags, modelList, blandeTime, AcurrentTime ); +} + +static qboolean SV_G2API_SetBoneIKState(CGhoul2Info_v &ghoul2, int time, const char *boneName, int ikState, + sharedSetBoneIKStateParams_t *params) +{ + return re.G2API_SetBoneIKState( ghoul2, time, boneName, ikState, params ); +} + +static qboolean SV_G2API_SetGhoul2ModelFlags( CGhoul2Info *ghlInfo, const int flags ) +{ + return re.G2API_SetGhoul2ModelFlags( ghlInfo, flags ); +} + +static qboolean SV_G2API_SetLodBias( CGhoul2Info *ghlInfo, int lodBias ) +{ + return re.G2API_SetLodBias( ghlInfo, lodBias ); +} + +static qboolean SV_G2API_SetNewOrigin( CGhoul2Info *ghlInfo, const int boltIndex ) +{ + return re.G2API_SetNewOrigin( ghlInfo, boltIndex ); +} + +static void SV_G2API_SetRagDoll( CGhoul2Info_v &ghoul2, CRagDollParams *parms ) +{ + return re.G2API_SetRagDoll( ghoul2, parms ); +} + +static qboolean SV_G2API_SetRootSurface( CGhoul2Info_v &ghlInfo, const int modelIndex, const char *surfaceName ) +{ + return re.G2API_SetRootSurface( ghlInfo, modelIndex, surfaceName ); +} + +static qboolean SV_G2API_SetShader( CGhoul2Info *ghlInfo, qhandle_t customShader ) +{ + return re.G2API_SetShader( ghlInfo, customShader ); +} + +static qboolean SV_G2API_SetSkin( CGhoul2Info *ghlInfo, qhandle_t customSkin, qhandle_t renderSkin ) +{ + return re.G2API_SetSkin( ghlInfo, customSkin, renderSkin ); +} + +static qboolean SV_G2API_SetSurfaceOnOff( CGhoul2Info *ghlInfo, const char *surfaceName, const int flags ) +{ + return re.G2API_SetSurfaceOnOff( ghlInfo, surfaceName, flags ); +} + +static qboolean SV_G2API_StopBoneAnim( CGhoul2Info *ghlInfo, const char *boneName ) +{ + return re.G2API_StopBoneAnim( ghlInfo, boneName ); +} + +static qboolean SV_G2API_StopBoneAnimIndex( CGhoul2Info *ghlInfo, const int index ) +{ + return re.G2API_StopBoneAnimIndex( ghlInfo, index ); +} + +static qboolean SV_G2API_StopBoneAngles( CGhoul2Info *ghlInfo, const char *boneName ) +{ + return re.G2API_StopBoneAngles( ghlInfo, boneName ); +} + +static qboolean SV_G2API_StopBoneAnglesIndex( CGhoul2Info *ghlInfo, const int index ) +{ + return re.G2API_StopBoneAnglesIndex( ghlInfo, index ); +} + +#ifdef _G2_GORE +static void SV_G2API_AddSkinGore( CGhoul2Info_v &ghoul2, SSkinGoreData &gore ) +{ + return re.G2API_AddSkinGore( ghoul2, gore ); +} + +static void SV_G2API_ClearSkinGore( CGhoul2Info_v &ghoul2 ) +{ + return re.G2API_ClearSkinGore( ghoul2 ); +} +#endif + +static IGhoul2InfoArray& SV_TheGhoul2InfoArray( void ) +{ + return re.TheGhoul2InfoArray(); +} + +static qhandle_t SV_RE_RegisterSkin( const char *name ) +{ + return re.RegisterSkin( name ); +} + +static int SV_RE_GetAnimationCFG( const char *psCFGFilename, char *psDest, int iDestSize ) +{ + return re.GetAnimationCFG( psCFGFilename, psDest, iDestSize ); +} + +static bool SV_WE_GetWindVector( vec3_t windVector, vec3_t atPoint ) +{ + return re.GetWindVector( windVector, atPoint ); +} + +static bool SV_WE_GetWindGusting( vec3_t atpoint ) +{ + return re.GetWindGusting( atpoint ); +} + +static bool SV_WE_IsOutside( vec3_t pos ) +{ + return re.IsOutside( pos ); +} + +static float SV_WE_IsOutsideCausingPain( vec3_t pos ) +{ + return re.IsOutsideCausingPain( pos ); +} + +static float SV_WE_GetChanceOfSaberFizz( void ) +{ + return re.GetChanceOfSaberFizz(); +} + +static bool SV_WE_IsShaking( vec3_t pos ) +{ + return re.IsShaking( pos ); +} + +static void SV_WE_AddWeatherZone( vec3_t mins, vec3_t maxs ) +{ + return re.AddWeatherZone( mins, maxs ); +} + +static bool SV_WE_SetTempGlobalFogColor( vec3_t color ) +{ + return re.SetTempGlobalFogColor( color ); +} /* =============== @@ -456,7 +885,7 @@ void SV_InitGameProgs (void) { import.FlushCamFile = Com_FlushCamFile; import.Error = Com_Error; - import.Milliseconds = Sys_Milliseconds; + import.Milliseconds = Sys_Milliseconds2; import.DropClient = SV_GameDropClient; @@ -512,123 +941,130 @@ void SV_InitGameProgs (void) { import.Malloc = G_ZMalloc_Helper; import.Free = Z_Free; import.bIsFromZone = Z_IsFromZone; -/* -Ghoul2 Insert Start -*/ - import.G2API_AddBolt = re.G2API_AddBolt; - import.G2API_AttachEnt = re.G2API_AttachEnt; - import.G2API_AttachG2Model = re.G2API_AttachG2Model; - import.G2API_CollisionDetect = re.G2API_CollisionDetect; - import.G2API_DetachEnt = re.G2API_DetachEnt; - import.G2API_DetachG2Model = re.G2API_DetachG2Model; - import.G2API_GetAnimFileName = re.G2API_GetAnimFileName; - import.G2API_GetBoltMatrix = re.G2API_GetBoltMatrix; - import.G2API_GetBoneAnim = re.G2API_GetBoneAnim; - import.G2API_GetBoneAnimIndex = re.G2API_GetBoneAnimIndex; - import.G2API_AddSurface = re.G2API_AddSurface; - import.G2API_HaveWeGhoul2Models = re.G2API_HaveWeGhoul2Models; - import.G2API_InitGhoul2Model = re.G2API_InitGhoul2Model; - import.G2API_SetBoneAngles = re.G2API_SetBoneAngles; - import.G2API_SetBoneAnglesMatrix = re.G2API_SetBoneAnglesMatrix; - import.G2API_SetBoneAnim = re.G2API_SetBoneAnim; - import.G2API_SetSkin = re.G2API_SetSkin; - import.G2API_CopyGhoul2Instance = re.G2API_CopyGhoul2Instance; - import.G2API_SetBoneAnglesIndex = re.G2API_SetBoneAnglesIndex; - import.G2API_SetBoneAnimIndex = re.G2API_SetBoneAnimIndex; - import.G2API_IsPaused = re.G2API_IsPaused; - import.G2API_ListBones = re.G2API_ListBones; - import.G2API_ListSurfaces = re.G2API_ListSurfaces; - import.G2API_PauseBoneAnim = re.G2API_PauseBoneAnim; - import.G2API_PauseBoneAnimIndex = re.G2API_PauseBoneAnimIndex; - import.G2API_PrecacheGhoul2Model = re.G2API_PrecacheGhoul2Model; - import.G2API_RemoveBolt = re.G2API_RemoveBolt; - import.G2API_RemoveBone = re.G2API_RemoveBone; - import.G2API_RemoveGhoul2Model = re.G2API_RemoveGhoul2Model; - import.G2API_SetLodBias = re.G2API_SetLodBias; - import.G2API_SetRootSurface = re.G2API_SetRootSurface; - import.G2API_SetShader = re.G2API_SetShader; - import.G2API_SetSurfaceOnOff = re.G2API_SetSurfaceOnOff; - import.G2API_StopBoneAngles = re.G2API_StopBoneAngles; - import.G2API_StopBoneAnim = re.G2API_StopBoneAnim; - import.G2API_SetGhoul2ModelFlags = re.G2API_SetGhoul2ModelFlags; - import.G2API_AddBoltSurfNum = re.G2API_AddBoltSurfNum; - import.G2API_RemoveSurface = re.G2API_RemoveSurface; - import.G2API_GetAnimRange = re.G2API_GetAnimRange; - import.G2API_GetAnimRangeIndex = re.G2API_GetAnimRangeIndex; - import.G2API_GiveMeVectorFromMatrix = re.G2API_GiveMeVectorFromMatrix; - import.G2API_GetGhoul2ModelFlags = re.G2API_GetGhoul2ModelFlags; - import.G2API_CleanGhoul2Models = re.G2API_CleanGhoul2Models; - import.TheGhoul2InfoArray = re.TheGhoul2InfoArray; - import.G2API_GetParentSurface = re.G2API_GetParentSurface; - import.G2API_GetSurfaceIndex = re.G2API_GetSurfaceIndex; - import.G2API_GetSurfaceName = re.G2API_GetSurfaceName; - import.G2API_GetGLAName = re.G2API_GetGLAName; - import.G2API_SetNewOrigin = re.G2API_SetNewOrigin; - import.G2API_GetBoneIndex = re.G2API_GetBoneIndex; - import.G2API_StopBoneAnglesIndex = re.G2API_StopBoneAnglesIndex; - import.G2API_StopBoneAnimIndex = re.G2API_StopBoneAnimIndex; - import.G2API_SetBoneAnglesMatrixIndex = re.G2API_SetBoneAnglesMatrixIndex; - import.G2API_SetAnimIndex = re.G2API_SetAnimIndex; - import.G2API_GetAnimIndex = re.G2API_GetAnimIndex; - - import.G2API_SaveGhoul2Models = re.G2API_SaveGhoul2Models; - import.G2API_LoadGhoul2Models = re.G2API_LoadGhoul2Models; - import.G2API_LoadSaveCodeDestructGhoul2Info = re.G2API_LoadSaveCodeDestructGhoul2Info; - import.G2API_GetAnimFileNameIndex = re.G2API_GetAnimFileNameIndex; - import.G2API_GetAnimFileInternalNameIndex = re.G2API_GetAnimFileInternalNameIndex; - import.G2API_GetSurfaceRenderStatus = re.G2API_GetSurfaceRenderStatus; - - //rww - RAGDOLL_BEGIN - import.G2API_SetRagDoll = re.G2API_SetRagDoll; - import.G2API_AnimateG2Models = re.G2API_AnimateG2Models; - - import.G2API_RagPCJConstraint = re.G2API_RagPCJConstraint; - import.G2API_RagPCJGradientSpeed = re.G2API_RagPCJGradientSpeed; - import.G2API_RagEffectorGoal = re.G2API_RagEffectorGoal; - import.G2API_GetRagBonePos = re.G2API_GetRagBonePos; - import.G2API_RagEffectorKick = re.G2API_RagEffectorKick; - import.G2API_RagForceSolve = re.G2API_RagForceSolve; - - import.G2API_SetBoneIKState = re.G2API_SetBoneIKState; - import.G2API_IKMove = re.G2API_IKMove; - //rww - RAGDOLL_END - - import.G2API_AddSkinGore = re.G2API_AddSkinGore; - import.G2API_ClearSkinGore = re.G2API_ClearSkinGore; + import.G2API_AddBolt = SV_G2API_AddBolt; + import.G2API_AttachEnt = SV_G2API_AttachEnt; + import.G2API_AttachG2Model = SV_G2API_AttachG2Model; + import.G2API_CollisionDetect = SV_G2API_CollisionDetect; + import.G2API_DetachEnt = SV_G2API_DetachEnt; + import.G2API_DetachG2Model = SV_G2API_DetachG2Model; + import.G2API_GetAnimFileName = SV_G2API_GetAnimFileName; + import.G2API_GetBoltMatrix = SV_G2API_GetBoltMatrix; + import.G2API_GetBoneAnim = SV_G2API_GetBoneAnim; + import.G2API_GetBoneAnimIndex = SV_G2API_GetBoneAnimIndex; + import.G2API_AddSurface = SV_G2API_AddSurface; + import.G2API_HaveWeGhoul2Models = SV_G2API_HaveWeGhoul2Models; + import.G2API_InitGhoul2Model = SV_G2API_InitGhoul2Model; + import.G2API_SetBoneAngles = SV_G2API_SetBoneAngles; + import.G2API_SetBoneAnglesMatrix = SV_G2API_SetBoneAnglesMatrix; + import.G2API_SetBoneAnim = SV_G2API_SetBoneAnim; + import.G2API_SetSkin = SV_G2API_SetSkin; + import.G2API_CopyGhoul2Instance = SV_G2API_CopyGhoul2Instance; + import.G2API_SetBoneAnglesIndex = SV_G2API_SetBoneAnglesIndex; + import.G2API_SetBoneAnimIndex = SV_G2API_SetBoneAnimIndex; + import.G2API_IsPaused = SV_G2API_IsPaused; + import.G2API_ListBones = SV_G2API_ListBones; + import.G2API_ListSurfaces = SV_G2API_ListSurfaces; + import.G2API_PauseBoneAnim = SV_G2API_PauseBoneAnim; + import.G2API_PauseBoneAnimIndex = SV_G2API_PauseBoneAnimIndex; + import.G2API_PrecacheGhoul2Model = SV_G2API_PrecacheGhoul2Model; + import.G2API_RemoveBolt = SV_G2API_RemoveBolt; + import.G2API_RemoveBone = SV_G2API_RemoveBone; + import.G2API_RemoveGhoul2Model = SV_G2API_RemoveGhoul2Model; + import.G2API_SetLodBias = SV_G2API_SetLodBias; + import.G2API_SetRootSurface = SV_G2API_SetRootSurface; + import.G2API_SetShader = SV_G2API_SetShader; + import.G2API_SetSurfaceOnOff = SV_G2API_SetSurfaceOnOff; + import.G2API_StopBoneAngles = SV_G2API_StopBoneAngles; + import.G2API_StopBoneAnim = SV_G2API_StopBoneAnim; + import.G2API_SetGhoul2ModelFlags = SV_G2API_SetGhoul2ModelFlags; + import.G2API_AddBoltSurfNum = SV_G2API_AddBoltSurfNum; + import.G2API_RemoveSurface = SV_G2API_RemoveSurface; + import.G2API_GetAnimRange = SV_G2API_GetAnimRange; + import.G2API_GetAnimRangeIndex = SV_G2API_GetAnimRangeIndex; + import.G2API_GiveMeVectorFromMatrix = SV_G2API_GiveMeVectorFromMatrix; + import.G2API_GetGhoul2ModelFlags = SV_G2API_GetGhoul2ModelFlags; + import.G2API_CleanGhoul2Models = SV_G2API_CleanGhoul2Models; + import.TheGhoul2InfoArray = SV_TheGhoul2InfoArray; + import.G2API_GetParentSurface = SV_G2API_GetParentSurface; + import.G2API_GetSurfaceIndex = SV_G2API_GetSurfaceIndex; + import.G2API_GetSurfaceName = SV_G2API_GetSurfaceName; + import.G2API_GetGLAName = SV_G2API_GetGLAName; + import.G2API_SetNewOrigin = SV_G2API_SetNewOrigin; + import.G2API_GetBoneIndex = SV_G2API_GetBoneIndex; + import.G2API_StopBoneAnglesIndex = SV_G2API_StopBoneAnglesIndex; + import.G2API_StopBoneAnimIndex = SV_G2API_StopBoneAnimIndex; + import.G2API_SetBoneAnglesMatrixIndex = SV_G2API_SetBoneAnglesMatrixIndex; + import.G2API_SetAnimIndex = SV_G2API_SetAnimIndex; + import.G2API_GetAnimIndex = SV_G2API_GetAnimIndex; + + import.G2API_SaveGhoul2Models = SV_G2API_SaveGhoul2Models; + import.G2API_LoadGhoul2Models = SV_G2API_LoadGhoul2Models; + import.G2API_LoadSaveCodeDestructGhoul2Info = SV_G2API_LoadSaveCodeDestructGhoul2Info; + import.G2API_GetAnimFileNameIndex = SV_G2API_GetAnimFileNameIndex; + import.G2API_GetAnimFileInternalNameIndex = SV_G2API_GetAnimFileInternalNameIndex; + import.G2API_GetSurfaceRenderStatus = SV_G2API_GetSurfaceRenderStatus; + + import.G2API_SetRagDoll = SV_G2API_SetRagDoll; + import.G2API_AnimateG2Models = SV_G2API_AnimateG2Models; + + import.G2API_RagPCJConstraint = SV_G2API_RagPCJConstraint; + import.G2API_RagPCJGradientSpeed = SV_G2API_RagPCJGradientSpeed; + import.G2API_RagEffectorGoal = SV_G2API_RagEffectorGoal; + import.G2API_GetRagBonePos = SV_G2API_GetRagBonePos; + import.G2API_RagEffectorKick = SV_G2API_RagEffectorKick; + import.G2API_RagForceSolve = SV_G2API_RagForceSolve; + + import.G2API_SetBoneIKState = SV_G2API_SetBoneIKState; + import.G2API_IKMove = SV_G2API_IKMove; + + import.G2API_AddSkinGore = SV_G2API_AddSkinGore; + import.G2API_ClearSkinGore = SV_G2API_ClearSkinGore; import.SetActiveSubBSP = SV_SetActiveSubBSP; - import.RE_RegisterSkin = re.RegisterSkin; - import.RE_GetAnimationCFG = re.GetAnimationCFG; - - - import.WE_GetWindVector = re.GetWindVector; - import.WE_GetWindGusting = re.GetWindGusting; - import.WE_IsOutside = re.IsOutside; - import.WE_IsOutsideCausingPain = re.IsOutsideCausingPain; - import.WE_GetChanceOfSaberFizz = re.GetChanceOfSaberFizz; - import.WE_IsShaking = re.IsShaking; - import.WE_AddWeatherZone = re.AddWeatherZone; - import.WE_SetTempGlobalFogColor = re.SetTempGlobalFogColor; - - -/* -Ghoul2 Insert End -*/ + import.RE_RegisterSkin = SV_RE_RegisterSkin; + import.RE_GetAnimationCFG = SV_RE_GetAnimationCFG; + + import.WE_GetWindVector = SV_WE_GetWindVector; + import.WE_GetWindGusting = SV_WE_GetWindGusting; + import.WE_IsOutside = SV_WE_IsOutside; + import.WE_IsOutsideCausingPain = SV_WE_IsOutsideCausingPain; + import.WE_GetChanceOfSaberFizz = SV_WE_GetChanceOfSaberFizz; + import.WE_IsShaking = SV_WE_IsShaking; + import.WE_AddWeatherZone = SV_WE_AddWeatherZone; + import.WE_SetTempGlobalFogColor = SV_WE_SetTempGlobalFogColor; + +#ifdef JK2_MODE + const char *gamename = "jospgame"; +#else + const char *gamename = "jagame"; +#endif - ge = (game_export_t *)Sys_GetGameAPI (&import); + GetGameAPIProc *GetGameAPI; + gameLibrary = Sys_LoadSPGameDll( gamename, &GetGameAPI ); + if ( !gameLibrary ) + Com_Error( ERR_DROP, "Failed to load %s library", gamename ); + ge = (game_export_t *)GetGameAPI( &import ); if (!ge) - Com_Error (ERR_DROP, "failed to load game DLL"); - - //hook up the client while we're here - if (!VM_Create("cl")) - Com_Error (ERR_DROP, "failed to attach to the client DLL"); + { + Sys_UnloadDll( gameLibrary ); + Com_Error( ERR_DROP, "Failed to load %s library", gamename ); + } if (ge->apiversion != GAME_API_VERSION) - Com_Error (ERR_DROP, "game is version %i, not %i", ge->apiversion, - GAME_API_VERSION); + { + Sys_UnloadDll( gameLibrary ); + Com_Error (ERR_DROP, "game is version %i, not %i", ge->apiversion, GAME_API_VERSION); + } + + //hook up the client while we're here + if ( !CL_InitCGameVM( gameLibrary ) ) + { + Sys_UnloadDll( gameLibrary ); + Com_Error ( ERR_DROP, "Failed to load client game functions" ); + } sv.entityParsePoint = CM_EntityString(); diff --git a/code/server/sv_init.cpp b/code/server/sv_init.cpp index b14b94c08a..81473ea8a4 100644 --- a/code/server/sv_init.cpp +++ b/code/server/sv_init.cpp @@ -1,23 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" #include "../client/snd_music.h" // didn't want to put this in snd_local because of rebuild times etc. diff --git a/code/server/sv_main.cpp b/code/server/sv_main.cpp index 4191b239f9..c527fa87f2 100644 --- a/code/server/sv_main.cpp +++ b/code/server/sv_main.cpp @@ -1,27 +1,28 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - - #include "server.h" /* Ghoul2 Insert Start diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index c39dc005b9..c28f34b11a 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -1,49 +1,42 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- sv_savegame.cpp -// -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" #define JPEG_IMAGE_QUALITY 95 - //#define USE_LAST_SAVE_FROM_THIS_MAP // enable this if you want to use the last explicity-loaded savegame from this map // when respawning after dying, else it'll just load "auto" regardless // (EF1 behaviour). I should maybe time/date check them though? #include "server.h" +#include "../qcommon/stringed_ingame.h" #include "../game/statindex.h" #include "../game/weapons.h" #include "../game/g_items.h" -#ifdef _MSC_VER -#pragma warning(disable : 4786) // identifier was truncated (STL crap) -#pragma warning(disable : 4710) // function was not inlined (STL crap) -#pragma warning(disable : 4512) // yet more STL drivel... -#endif - #include -using namespace std; - static char saveGameComment[iSG_COMMENT_SIZE]; //#define SG_PROFILE // enable for debug save stats if you want @@ -803,6 +796,9 @@ int SG_GetSaveGameComment(const char *psPathlessBaseName, char *sComment, char * { int ret = 0; time_t tFileTime; +#ifdef JK2_MODE + size_t iScreenShotLength; +#endif qbSGReadIsTestOnly = qtrue; // do NOT leave this in this state @@ -818,10 +814,20 @@ int SG_GetSaveGameComment(const char *psPathlessBaseName, char *sComment, char * if (SG_Read( INT_ID('C','M','T','M'), &fileTime, sizeof(fileTime))) //read { tFileTime = SG_GetTime (fileTime); +#ifdef JK2_MODE + if (SG_Read(INT_ID('S','H','L','N'), &iScreenShotLength, sizeof(iScreenShotLength))) + { + if (SG_Read(INT_ID('S','H','O','T'), NULL, iScreenShotLength, NULL)) + { +#endif if (SG_Read(INT_ID('M','P','C','M'), sMapName, iSG_MAPCMD_SIZE )) // read { ret = tFileTime; } +#ifdef JK2_MODE + } + } +#endif } } qbSGReadIsTestOnly = qfalse; @@ -853,7 +859,7 @@ static char *SG_GetSaveGameMapName(const char *psPathlessBaseName) // pass in qtrue to set as loading screen, else pass in pvDest to read it into there... // -/* +#ifdef JK2_MODE static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest = NULL); static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest) { @@ -861,12 +867,12 @@ static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest) // get JPG screenshot data length... // - int iScreenShotLength = 0; + size_t iScreenShotLength = 0; SG_Read(INT_ID('S','H','L','N'), &iScreenShotLength, sizeof(iScreenShotLength)); // // alloc enough space plus extra 4K for sloppy JPG-decode reader to not do memory access violation... // - byte *pJPGData = (byte *) Z_Malloc(iScreenShotLength + 4096,TAG_TEMP_SAVEGAME_WORKSPACE, qfalse); + byte *pJPGData = (byte *) Z_Malloc(iScreenShotLength + 4096,TAG_TEMP_WORKSPACE, qfalse); // // now read the JPG data... // @@ -876,7 +882,7 @@ static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest) // byte *pDecompressedPic = NULL; int iWidth, iHeight; - Decompress_JPG( "[savegame]", pJPGData, &pDecompressedPic, &iWidth, &iHeight ); + re.LoadJPGFromBuffer(pJPGData, iScreenShotLength, &pDecompressedPic, &iWidth, &iHeight); // // if the loaded image is the same size as the game is expecting, then copy it to supplied arg (if present)... // @@ -899,7 +905,6 @@ static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest) Z_Free( pDecompressedPic ); return bReturn; -#endif } // Gets the savegame screenshot // @@ -909,31 +914,6 @@ qboolean SG_GetSaveImage( const char *psPathlessBaseName, void *pvAddress ) { return qfalse; } -//JLFSAVEGAME -#if 0 - unsigned short saveGameName[filepathlength]; - char directoryInfo[filepathlength]; - char psLocalFilename[filepathlength]; - DWORD bytesRead; - - mbstowcs(saveGameName, psPathlessBaseName,filepathlength); - - XCreateSaveGame("U:\\", saveGameName, OPEN_ALWAYS, 0,directoryInfo, filepathlength); - - strcpy (psLocalFilename , directoryInfo); - strcat (psLocalFilename , "saveimage.xbx"); - - - sg_Handle = NULL; - sg_Handle = CreateFile(psLocalFilename, GENERIC_READ, FILE_SHARE_READ, 0, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - - if (!sg_Handle) - return qfalse; - - - -#else if (!SG_Open(psPathlessBaseName)) { @@ -941,12 +921,11 @@ qboolean SG_GetSaveImage( const char *psPathlessBaseName, void *pvAddress ) } SG_Read(INT_ID('C','O','M','M'), NULL, 0, NULL); // skip - SG_Read(INT_ID('C','M','T','M'), NULL, sizeof( time_t )); + SG_Read(INT_ID('C','M','T','M'), NULL, sizeof( unsigned int )); qboolean bGotSaveImage = SG_ReadScreenshot(qfalse, pvAddress); SG_Close(); -#endif return bGotSaveImage; } @@ -954,6 +933,7 @@ qboolean SG_GetSaveImage( const char *psPathlessBaseName, void *pvAddress ) static void SG_WriteScreenshot(qboolean qbAutosave, const char *psMapName) { byte *pbRawScreenShot = NULL; + byte *byBlank = NULL; if( qbAutosave ) { @@ -961,9 +941,26 @@ static void SG_WriteScreenshot(qboolean qbAutosave, const char *psMapName) // int iWidth = SG_SCR_WIDTH; int iHeight= SG_SCR_HEIGHT; - byte byBlank[SG_SCR_WIDTH * SG_SCR_HEIGHT * 4] = {0}; + const size_t bySize = SG_SCR_WIDTH * SG_SCR_HEIGHT * 4; + byte *src, *dst; + byBlank = new byte[bySize]; pbRawScreenShot = SCR_TempRawImage_ReadFromFile(va("levelshots/%s.tga",psMapName), &iWidth, &iHeight, byBlank, qtrue); // qtrue = vert flip + + if (pbRawScreenShot) + { + for (int y = 0; y < iHeight; y++) + { + for (int x = 0; x < iWidth; x++) + { + src = pbRawScreenShot + 4 * (y * iWidth + x); + dst = pbRawScreenShot + 3 * (y * iWidth + x); + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + } + } + } } if (!pbRawScreenShot) @@ -972,14 +969,19 @@ static void SG_WriteScreenshot(qboolean qbAutosave, const char *psMapName) } - int iJPGDataSize = 0; - byte *pJPGData = Compress_JPG(&iJPGDataSize, JPEG_IMAGE_QUALITY, SG_SCR_WIDTH, SG_SCR_HEIGHT, pbRawScreenShot, qfalse); + size_t iJPGDataSize = 0; + size_t bufSize = SG_SCR_WIDTH * SG_SCR_HEIGHT * 3; + byte *pJPGData = (byte *)Z_Malloc( bufSize, TAG_TEMP_WORKSPACE, qfalse, 4 ); + iJPGDataSize = re.SaveJPGToBuffer(pJPGData, bufSize, JPEG_IMAGE_QUALITY, SG_SCR_WIDTH, SG_SCR_HEIGHT, pbRawScreenShot, 0 ); + if ( qbAutosave ) + delete[] byBlank; SG_Append(INT_ID('S','H','L','N'), &iJPGDataSize, sizeof(iJPGDataSize)); SG_Append(INT_ID('S','H','O','T'), pJPGData, iJPGDataSize); Z_Free(pJPGData); SCR_TempRawImage_CleanUp(); } -*/ +#endif + qboolean SG_GameAllowedToSaveHere(qboolean inCamera) { @@ -1066,7 +1068,9 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) Q_strncpyz( sMapCmd,psMapName, sizeof(sMapCmd)); // need as array rather than ptr because const strlen needed for MPCM chunk SG_WriteComment(qbAutosave, sMapCmd); -// SG_WriteScreenshot(qbAutosave, sMapCmd); +#ifdef JK2_MODE + SG_WriteScreenshot(qbAutosave, sMapCmd); +#endif SG_Append(INT_ID('M','P','C','M'), sMapCmd, sizeof(sMapCmd)); SG_WriteCvars(); @@ -1136,7 +1140,9 @@ qboolean SG_ReadSavegame(const char *psPathlessBaseName) Com_DPrintf("Reading: %s\n", sComment); SG_Read( INT_ID('C','M','T','M'), NULL, sizeof( unsigned int )); -// SG_ReadScreenshot(qtrue); // qboolean qbSetAsLoadingScreen +#ifdef JK2_MODE + SG_ReadScreenshot(qtrue); // qboolean qbSetAsLoadingScreen +#endif SG_Read(INT_ID('M','P','C','M'), sMapCmd, sizeof(sMapCmd)); SG_ReadCvars(); diff --git a/code/server/sv_snapshot.cpp b/code/server/sv_snapshot.cpp index 546ddd9283..aabc0a94a4 100644 --- a/code/server/sv_snapshot.cpp +++ b/code/server/sv_snapshot.cpp @@ -1,31 +1,31 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - - #include "../client/vmachine.h" #include "server.h" - /* ============================================================================= diff --git a/code/server/sv_world.cpp b/code/server/sv_world.cpp index e30aa61cb9..563dd92b87 100644 --- a/code/server/sv_world.cpp +++ b/code/server/sv_world.cpp @@ -1,27 +1,29 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // world.c -- world query functions -// leave this as first line for PCH reasons... -// #include "../server/exe_headers.h" - #include "../qcommon/cm_local.h" /* @@ -475,7 +477,6 @@ void SV_SectorList_f( void ) { #include #include #pragma warning (pop) -using namespace std; class CBBox { diff --git a/code/sys/sys_loadlib.h b/code/sys/sys_loadlib.h deleted file mode 100644 index 3c4c463537..0000000000 --- a/code/sys/sys_loadlib.h +++ /dev/null @@ -1,59 +0,0 @@ -/* -=========================================================================== -Copyright (C) 1999-2010 id Software LLC, a ZeniMax Media company. - -This file is part of Spearmint Source Code. - -Spearmint Source Code is free software; you can redistribute it -and/or modify it under the terms of the GNU General Public License as -published by the Free Software Foundation; either version 3 of the License, -or (at your option) any later version. - -Spearmint Source Code is distributed in the hope that it will be -useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Spearmint Source Code. If not, see . - -In addition, Spearmint Source Code is also subject to certain additional terms. -You should have received a copy of these additional terms immediately following -the terms and conditions of the GNU General Public License. If not, please -request a copy in writing from id Software at the address below. - -If you have questions concerning this license or the applicable additional -terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., -Suite 120, Rockville, Maryland 20850 USA. -=========================================================================== -*/ - -#ifndef SYS_LOADLIB_H_ -#define SYS_LOADLIB_H_ - -#ifdef DEDICATED -# ifdef _WIN32 -# include -# define Sys_LoadLibrary(f) (void*)LoadLibrary(f) -# define Sys_UnloadLibrary(h) FreeLibrary((HMODULE)h) -# define Sys_LoadFunction(h,fn) (void*)GetProcAddress((HMODULE)h,fn) -# define Sys_LibraryError() "unknown" -# else -# include -# define Sys_LoadLibrary(f) dlopen(f,RTLD_NOW) -# define Sys_UnloadLibrary(h) dlclose(h) -# define Sys_LoadFunction(h,fn) dlsym(h,fn) -# define Sys_LibraryError() dlerror() -# endif -#else -# include -# include -# define Sys_LoadLibrary(f) SDL_LoadObject(f) -# define Sys_UnloadLibrary(h) SDL_UnloadObject(h) -# define Sys_LoadFunction(h,fn) SDL_LoadFunction(h,fn) -# define Sys_LibraryError() SDL_GetError() -#endif - -void * QDECL Sys_LoadDll(const char *name, qboolean useSystemLib); - -#endif /* SYS_LOADLIB_H_ */ diff --git a/code/sys/sys_local.h b/code/sys/sys_local.h deleted file mode 100644 index 695149cd1f..0000000000 --- a/code/sys/sys_local.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef SYS_LOCAL_H_ -#define SYS_LOCAL_H_ - -void IN_Init( void *windowData ); -void IN_Frame (void); -void IN_Shutdown( void ); -void IN_Restart( void ); - -qboolean Sys_GetPacket ( netadr_t *net_from, msg_t *net_message ); -char *Sys_ConsoleInput (void); -void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptrLength, void *ptr ); - -void Sys_Exit( int ex ) __attribute__((noreturn)); - -#endif /* SYS_LOCAL_H_ */ diff --git a/code/sys/sys_main.cpp b/code/sys/sys_main.cpp deleted file mode 100644 index 666d086cb1..0000000000 --- a/code/sys/sys_main.cpp +++ /dev/null @@ -1,385 +0,0 @@ -#include -#include "../qcommon/q_shared.h" -#include "../qcommon/qcommon.h" - -#include "sys_loadlib.h" -#include "sys_local.h" - -static char binaryPath[ MAX_OSPATH ] = { 0 }; -static char installPath[ MAX_OSPATH ] = { 0 }; - -/* -================= -Sys_SetBinaryPath -================= -*/ -void Sys_SetBinaryPath(const char *path) -{ - Q_strncpyz(binaryPath, path, sizeof(binaryPath)); -} - -/* -================= -Sys_BinaryPath -================= -*/ -char *Sys_BinaryPath(void) -{ - return binaryPath; -} - -/* -================= -Sys_SetDefaultInstallPath -================= -*/ -void Sys_SetDefaultInstallPath(const char *path) -{ - Q_strncpyz(installPath, path, sizeof(installPath)); -} - -/* -================= -Sys_DefaultInstallPath -================= -*/ -char *Sys_DefaultInstallPath(void) -{ - if (*installPath) - return installPath; - else - return Sys_Cwd(); -} - -/* -================= -Sys_DefaultAppPath -================= -*/ -char *Sys_DefaultAppPath(void) -{ - return Sys_BinaryPath(); -} - -/* -================= -Sys_UnloadDll -================= -*/ -void Sys_UnloadDll( void *dllHandle ) -{ - if( !dllHandle ) - { - Com_Printf("Sys_UnloadDll(NULL)\n"); - return; - } - - Sys_UnloadLibrary(dllHandle); -} - -/* -================= -Sys_LoadDll - -First try to load library name from system library path, -from executable path, then fs_basepath. -================= -*/ - -void *Sys_LoadDll(const char *name, qboolean useSystemLib) -{ - void *dllhandle = NULL; - - if(useSystemLib) - Com_Printf("Trying to load \"%s\"...\n", name); - - if(!useSystemLib || !(dllhandle = Sys_LoadLibrary(name))) - { - const char *topDir; - char libPath[MAX_OSPATH]; - - topDir = Sys_BinaryPath(); - - if(!*topDir) - topDir = "."; - - Com_Printf("Trying to load \"%s\" from \"%s\"...\n", name, topDir); - Com_sprintf(libPath, sizeof(libPath), "%s%c%s", topDir, PATH_SEP, name); - - if(!(dllhandle = Sys_LoadLibrary(libPath))) - { - const char *basePath = Cvar_VariableString("fs_basepath"); - - if(!basePath || !*basePath) - basePath = "."; - - if(FS_FilenameCompare(topDir, basePath)) - { - Com_Printf("Trying to load \"%s\" from \"%s\"...\n", name, basePath); - Com_sprintf(libPath, sizeof(libPath), "%s%c%s", basePath, PATH_SEP, name); - dllhandle = Sys_LoadLibrary(libPath); - } - - if(!dllhandle) - { - Com_Printf("Loading \"%s\" failed\n", name); - } - } - } - - return dllhandle; -} - -static void *game_library; - -/* - ================= - Sys_UnloadGame - ================= - */ -void Sys_UnloadGame (void) -{ - Com_Printf("------ Unloading Game ------\n"); - if (game_library) - Sys_UnloadLibrary (game_library); - game_library = NULL; -} - -/* - ================= - Sys_GetGameAPI - - Loads the game dll - ================= - */ -extern char *FS_BuildOSPath( const char *base, const char *game, const char *qpath ); - -void *Sys_GetGameAPI (void *parms) -{ - void *(*GetGameAPI) (void *); - - const char *basepath; - const char *cdpath; - const char *gamedir; - const char *homepath; -#ifdef MACOS_X - const char *apppath; -#endif - const char *fn; - -#ifdef JK2_MODE - const char *gamename = "jospgame" ARCH_STRING DLL_EXT; -#else - const char *gamename = "jagame" ARCH_STRING DLL_EXT; -#endif - - if (game_library) - Com_Error (ERR_FATAL, "Sys_GetGameAPI without calling Sys_UnloadGame"); - - // check the current debug directory first for development purposes - homepath = Cvar_VariableString( "fs_homepath" ); - basepath = Cvar_VariableString( "fs_basepath" ); - cdpath = Cvar_VariableString( "fs_cdpath" ); - gamedir = Cvar_VariableString( "fs_game" ); -#ifdef MACOS_X - apppath = Cvar_VariableString( "fs_apppath" ); -#endif - - fn = FS_BuildOSPath( basepath, gamedir, gamename ); - - game_library = Sys_LoadLibrary( fn ); - -//First try in mod directories. basepath -> homepath -> cdpath - if (!game_library) { - if (homepath[0]) { - Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - - fn = FS_BuildOSPath( homepath, gamedir, gamename); - game_library = Sys_LoadLibrary( fn ); - } - } - -#ifdef MACOS_X - if (!game_library) { - if( apppath[0] ) { - Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - - fn = FS_BuildOSPath( apppath, gamedir, gamename ); - game_library = Sys_LoadLibrary( fn ); - } - } -#endif - - if (!game_library) { - if( cdpath[0] ) { - Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - - fn = FS_BuildOSPath( cdpath, gamedir, gamename ); - game_library = Sys_LoadLibrary( fn ); - } - } - -//Now try in base. basepath -> homepath -> cdpath - if (!game_library) { - Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - - fn = FS_BuildOSPath( basepath, OPENJKGAME, gamename ); - game_library = Sys_LoadLibrary( fn ); - } - - if (!game_library) { - if ( homepath[0] ) { - Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - - fn = FS_BuildOSPath( homepath, OPENJKGAME, gamename ); - game_library = Sys_LoadLibrary( fn ); - } - } - -#ifdef MACOS_X - if (!game_library) { - if( apppath[0] ) { - Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - - fn = FS_BuildOSPath( apppath, OPENJKGAME, gamename ); - game_library = Sys_LoadLibrary( fn ); - } - } -#endif - - if (!game_library) { - if( cdpath[0] ) { - Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - - fn = FS_BuildOSPath( cdpath, OPENJKGAME, gamename ); - game_library = Sys_LoadLibrary( fn ); - } - } -//Still couldn't find it. - if (!game_library) { - Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - Com_Error( ERR_FATAL, "Couldn't load game" ); - } - - - Com_Printf ( "Sys_GetGameAPI(%s): succeeded ...\n", fn ); - - GetGameAPI = (void *(*)(void *))Sys_LoadFunction (game_library, "GetGameAPI"); - if (!GetGameAPI) - { - Sys_UnloadGame (); - return NULL; - } - - return GetGameAPI (parms); -} - -/* - ================= - Sys_LoadCgame - - Used to hook up a development dll - ================= - */ -void * Sys_LoadCgame( intptr_t (**entryPoint)(int, ...), intptr_t (*systemcalls)(intptr_t, ...) ) -{ - void (*dllEntry)( intptr_t (*syscallptr)(intptr_t, ...) ); - - dllEntry = ( void (*)( intptr_t (*)( intptr_t, ... ) ) )Sys_LoadFunction( game_library, "dllEntry" ); - *entryPoint = (intptr_t (*)(int,...))Sys_LoadFunction( game_library, "vmMain" ); - if ( !*entryPoint || !dllEntry ) { - Sys_UnloadLibrary( game_library ); - return NULL; - } - - dllEntry( systemcalls ); - return game_library; -} - -#ifdef MACOS_X -/* - ================= - Sys_StripAppBundle - - Discovers if passed dir is suffixed with the directory structure of a Mac OS X - .app bundle. If it is, the .app directory structure is stripped off the end and - the result is returned. If not, dir is returned untouched. - ================= - */ -char *Sys_StripAppBundle( char *dir ) -{ - static char cwd[MAX_OSPATH]; - - Q_strncpyz(cwd, dir, sizeof(cwd)); - if(strcmp(Sys_Basename(cwd), "MacOS")) - return dir; - Q_strncpyz(cwd, Sys_Dirname(cwd), sizeof(cwd)); - if(strcmp(Sys_Basename(cwd), "Contents")) - return dir; - Q_strncpyz(cwd, Sys_Dirname(cwd), sizeof(cwd)); - if(!strstr(Sys_Basename(cwd), ".app")) - return dir; - Q_strncpyz(cwd, Sys_Dirname(cwd), sizeof(cwd)); - return cwd; -} -#endif - -#ifndef DEFAULT_BASEDIR -# ifdef MACOS_X -# define DEFAULT_BASEDIR Sys_StripAppBundle(Sys_BinaryPath()) -# else -# define DEFAULT_BASEDIR Sys_BinaryPath() -# endif -#endif - -int main (int argc, char **argv) -{ - int i; - char commandLine[ MAX_STRING_CHARS ] = { 0 }; - - // get the initial time base - Sys_Milliseconds(); - -#ifdef MACOS_X - // This is passed if we are launched by double-clicking - if ( argc >= 2 && Q_strncmp ( argv[1], "-psn", 4 ) == 0 ) - argc = 1; -#endif - - Sys_SetBinaryPath( Sys_Dirname( argv[ 0 ] ) ); - Sys_SetDefaultInstallPath( DEFAULT_BASEDIR ); - - // Concatenate the command line for passing to Com_Init - for( i = 1; i < argc; i++ ) - { - const bool containsSpaces = (strchr(argv[i], ' ') != NULL); - if (containsSpaces) - Q_strcat( commandLine, sizeof( commandLine ), "\"" ); - - Q_strcat( commandLine, sizeof( commandLine ), argv[ i ] ); - - if (containsSpaces) - Q_strcat( commandLine, sizeof( commandLine ), "\"" ); - - Q_strcat( commandLine, sizeof( commandLine ), " " ); - } - - Com_Init(commandLine); - - while (1) - { - // set low precision every frame, because some system calls - // reset it arbitrarily -#ifdef _DEBUG -// if (!g_wv.activeApp) -// { -// Sleep(50); -// } -#endif // _DEBUG - - // make sure mouse and joystick are only called once a frame - IN_Frame(); - - Com_Frame (); - } -} diff --git a/code/sys/sys_unix.cpp b/code/sys/sys_unix.cpp deleted file mode 100644 index 158c1dbff2..0000000000 --- a/code/sys/sys_unix.cpp +++ /dev/null @@ -1,636 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../qcommon/q_shared.h" -#include "../qcommon/qcommon.h" -#include "sys_local.h" - -#include - -#define MAX_QUED_EVENTS 256 -#define MASK_QUED_EVENTS ( MAX_QUED_EVENTS - 1 ) - -qboolean stdin_active = qtrue; -qboolean stdinIsATTY = qfalse; - -// Used to determine where to store user-specific files -static char homePath[ MAX_OSPATH ] = { 0 }; - -/* -================ -Sys_Milliseconds -================ -*/ -/* base time in seconds, that's our origin - timeval:tv_sec is an int: - assuming this wraps every 0x7fffffff - ~68 years since the Epoch (1970) - we're safe till 2038 */ -unsigned long sys_timeBase = 0; -/* current time in ms, using sys_timeBase as origin - NOTE: sys_timeBase*1000 + curtime -> ms since the Epoch - 0x7fffffff ms - ~24 days - although timeval:tv_usec is an int, I'm not sure wether it is actually used as an unsigned int - (which would affect the wrap period) */ -int curtime; -int Sys_Milliseconds () -{ - struct timeval tp; - - gettimeofday(&tp, NULL); - - if (!sys_timeBase) - { - sys_timeBase = tp.tv_sec; - return tp.tv_usec/1000; - } - - curtime = (tp.tv_sec - sys_timeBase)*1000 + tp.tv_usec/1000; - - return curtime; -} - -void Sys_SetEnv(const char *name, const char *value) -{ - if(value && *value) - setenv(name, value, 1); - else - unsetenv(name); -} - -/* -================== -Sys_GetClipboardData -================== -*/ -char *Sys_GetClipboardData(void) { - if ( !SDL_HasClipboardText() ) - return NULL; - - char *cbText = SDL_GetClipboardText(); - size_t len = strlen( cbText ) + 1; - - char *buf = (char *)Z_Malloc( len, TAG_CLIPBOARD, qfalse ); - Q_strncpyz( buf, cbText, len ); - - SDL_free( cbText ); - return buf; -} - -/* -================== -Sys_LowPhysicalMemory - -TODO -================== -*/ -qboolean Sys_LowPhysicalMemory( void ) -{ - return qfalse; -} - -void Conbuf_AppendText( const char *pMsg ) -{ - char msg[4096] = {0}; - Q_strncpyz(msg, pMsg, sizeof(msg)); - Q_StripColor(msg); - printf("%s", msg); -} - -void Sys_Print( const char *msg ) { - // TTimo - prefix for text that shows up in console but not in notify - // backported from RTCW - if ( !Q_strncmp( msg, "[skipnotify]", 12 ) ) { - msg += 12; - } - if ( msg[0] == '*' ) { - msg += 1; - } - Conbuf_AppendText( msg ); -} - -/* - ================== - Sys_Basename - ================== - */ -const char *Sys_Basename( char *path ) -{ - return basename( path ); -} - -/* - ================== - Sys_Dirname - ================== - */ -const char *Sys_Dirname( char *path ) -{ - return dirname( path ); -} - - -/* -======================================================================== - -EVENT LOOP - -======================================================================== -*/ - -#define MAX_QUED_EVENTS 256 -#define MASK_QUED_EVENTS ( MAX_QUED_EVENTS - 1 ) - -sysEvent_t eventQue[MAX_QUED_EVENTS]; -int eventHead, eventTail; -byte sys_packetReceived[MAX_MSGLEN]; - -sysEvent_t Sys_GetEvent( void ) { - sysEvent_t ev; - char *s; - msg_t netmsg; - - // return if we have data - if ( eventHead > eventTail ) { - eventTail++; - return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ]; - } - - // check for console commands - s = Sys_ConsoleInput(); - if ( s ) { - char *b; - int len; - - len = strlen( s ) + 1; - b = (char *)Z_Malloc( len,TAG_EVENT,qfalse ); - strcpy( b, s ); - Sys_QueEvent( 0, SE_CONSOLE, 0, 0, len, b ); - } - - // check for network packets - MSG_Init( &netmsg, sys_packetReceived, sizeof( sys_packetReceived ) ); - - // return if we have data - if ( eventHead > eventTail ) { - eventTail++; - return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ]; - } - - // create an empty event to return - - memset( &ev, 0, sizeof( ev ) ); - ev.evTime = Sys_Milliseconds(); - - return ev; -} - -/* -============================================================== - -DIRECTORY SCANNING - -============================================================== -*/ - -#define MAX_FOUND_FILES 0x1000 - -/* -================== -Sys_ListFiles -================== -*/ -void Sys_ListFilteredFiles( const char *basedir, char *subdirs, char *filter, char **list, int *numfiles ) { - char search[MAX_OSPATH], newsubdirs[MAX_OSPATH]; - char filename[MAX_OSPATH]; - DIR *fdir; - struct dirent *d; - struct stat st; - - if ( *numfiles >= MAX_FOUND_FILES - 1 ) { - return; - } - - if (strlen(subdirs)) { - Com_sprintf( search, sizeof(search), "%s/%s", basedir, subdirs ); - } - else { - Com_sprintf( search, sizeof(search), "%s", basedir ); - } - - if ((fdir = opendir(search)) == NULL) { - return; - } - - while ((d = readdir(fdir)) != NULL) { - Com_sprintf(filename, sizeof(filename), "%s/%s", search, d->d_name); - if (stat(filename, &st) == -1) - continue; - - if (st.st_mode & S_IFDIR) { - if (Q_stricmp(d->d_name, ".") && Q_stricmp(d->d_name, "..")) { - if (strlen(subdirs)) { - Com_sprintf( newsubdirs, sizeof(newsubdirs), "%s/%s", subdirs, d->d_name); - } - else { - Com_sprintf( newsubdirs, sizeof(newsubdirs), "%s", d->d_name); - } - Sys_ListFilteredFiles( basedir, newsubdirs, filter, list, numfiles ); - } - } - if ( *numfiles >= MAX_FOUND_FILES - 1 ) { - break; - } - Com_sprintf( filename, sizeof(filename), "%s/%s", subdirs, d->d_name ); - if (!Com_FilterPath( filter, filename, qfalse )) - continue; - list[ *numfiles ] = CopyString( filename ); - (*numfiles)++; - } - - closedir(fdir); -} - -char **Sys_ListFiles( const char *directory, const char *extension, char *filter, int *numfiles, qboolean wantsubs ) -{ - struct dirent *d; - DIR *fdir; - qboolean dironly = wantsubs; - char search[MAX_OSPATH]; - int nfiles; - char **listCopy; - char *list[MAX_FOUND_FILES]; - int i; - struct stat st; - - if (filter) { - - nfiles = 0; - Sys_ListFilteredFiles( directory, "", filter, list, &nfiles ); - - list[ nfiles ] = 0; - *numfiles = nfiles; - - if (!nfiles) - return NULL; - - listCopy = (char **)Z_Malloc( ( nfiles + 1 ) * sizeof( *listCopy ), TAG_LISTFILES, qfalse ); - for ( i = 0 ; i < nfiles ; i++ ) { - listCopy[i] = list[i]; - } - listCopy[i] = NULL; - - return listCopy; - } - - if ( !extension) - extension = ""; - - if ( extension[0] == '/' && extension[1] == 0 ) { - extension = ""; - dironly = qtrue; - } - - size_t extLen = strlen( extension ); - - // search - nfiles = 0; - - if ((fdir = opendir(directory)) == NULL) { - *numfiles = 0; - return NULL; - } - - while ((d = readdir(fdir)) != NULL) { - Com_sprintf(search, sizeof(search), "%s/%s", directory, d->d_name); - if (stat(search, &st) == -1) - continue; - if ((dironly && !(st.st_mode & S_IFDIR)) || - (!dironly && (st.st_mode & S_IFDIR))) - continue; - - if (*extension) { - if ( strlen( d->d_name ) < extLen || - Q_stricmp( - d->d_name + strlen( d->d_name ) - extLen, - extension ) ) { - continue; // didn't match - } - } - - if ( nfiles == MAX_FOUND_FILES - 1 ) - break; - list[ nfiles ] = CopyString( d->d_name ); - nfiles++; - } - - list[ nfiles ] = 0; - - closedir(fdir); - - // return a copy of the list - *numfiles = nfiles; - - if ( !nfiles ) { - return NULL; - } - - listCopy = (char **)Z_Malloc( ( nfiles + 1 ) * sizeof( *listCopy ), TAG_LISTFILES, qfalse ); - for ( i = 0 ; i < nfiles ; i++ ) { - listCopy[i] = list[i]; - } - listCopy[i] = NULL; - - return listCopy; -} - -void Sys_FreeFileList( char **fileList ) { - int i; - - if ( !fileList ) { - return; - } - - for ( i = 0 ; fileList[i] ; i++ ) { - Z_Free( fileList[i] ); - } - - Z_Free( fileList ); -} - -/* -================== -Sys_Sleep - -Block execution for msec or until input is recieved. -================== -*/ -void Sys_Sleep( int msec ) -{ - if( msec == 0 ) - return; - - if( stdinIsATTY ) - { - fd_set fdset; - - FD_ZERO(&fdset); - FD_SET(STDIN_FILENO, &fdset); - if( msec < 0 ) - { - select(STDIN_FILENO + 1, &fdset, NULL, NULL, NULL); - } - else - { - struct timeval timeout; - - timeout.tv_sec = msec/1000; - timeout.tv_usec = (msec%1000)*1000; - select(STDIN_FILENO + 1, &fdset, NULL, NULL, &timeout); - } - } - else - { - // With nothing to select() on, we can't wait indefinitely - if( msec < 0 ) - msec = 10; - - usleep( msec * 1000 ); - } -} - -/* -================== -Sys_Mkdir -================== -*/ -qboolean Sys_Mkdir( const char *path ) -{ - int result = mkdir( path, 0750 ); - - if( result != 0 ) - return (qboolean)(errno == EEXIST); - - return qtrue; -} - -char *Sys_Cwd( void ) -{ - static char cwd[MAX_OSPATH]; - - getcwd( cwd, sizeof( cwd ) - 1 ); - cwd[MAX_OSPATH-1] = 0; - - return cwd; -} - -/* Resolves path names and determines if they are the same */ -/* For use with full OS paths not quake paths */ -/* Returns true if resulting paths are valid and the same, otherwise false */ -bool Sys_PathCmp( const char *path1, const char *path2 ) -{ - char *r1, *r2; - - r1 = realpath(path1, NULL); - r2 = realpath(path2, NULL); - - if(r1 && r2 && !Q_stricmp(r1, r2)) - { - free(r1); - free(r2); - return true; - } - - free(r1); - free(r2); - return false; -} - -/* -============== -Sys_DefaultBasePath -============== -*/ -char *Sys_DefaultBasePath( void ) { - return Sys_Cwd(); -} - -void Sys_ShowConsole( int visLevel, qboolean quitOnClose ) -{ -} - -void Sys_Exit( int ex ) { -#ifdef NDEBUG // regular behavior - // We can't do this - // as long as GL DLL's keep installing with atexit... - exit(ex); - //_exit(ex); -#else - // Give me a backtrace on error exits. - assert( ex == 0 ); - exit(ex); -#endif -} - -void Sys_Error( const char *error, ... ) -{ - va_list argptr; - char string[1024]; - - va_start (argptr,error); - vsnprintf (string, sizeof(string), error, argptr); - va_end (argptr); - - //Sys_ErrorDialog( string ); - Sys_Print( string ); - - Sys_Exit( 3 ); -} - -void Sys_Quit (void) { - IN_Shutdown(); - - Com_ShutdownZoneMemory(); - Com_ShutdownHunkMemory(); - - Sys_Exit(0); -} - -void Sys_Init (void) { -} - -/* -================== -Sys_DefaultHomePath -================== -*/ -#ifdef MACOS_X -char *Sys_DefaultHomePath(void) -{ - char *p; - - if( !*homePath && com_homepath != NULL ) - { - if( ( p = getenv( "HOME" ) ) != NULL ) - { - Com_sprintf(homePath, sizeof(homePath), "%s%c", p, PATH_SEP); - Q_strcat(homePath, sizeof(homePath), - "Library/Application Support/"); - - if(com_homepath->string[0]) - Q_strcat(homePath, sizeof(homePath), com_homepath->string); - else - Q_strcat(homePath, sizeof(homePath), HOMEPATH_NAME_MACOSX); - } - } - - return homePath; -} -#else -char *Sys_DefaultHomePath(void) -{ - char *p; - - if( !*homePath && com_homepath != NULL ) - { - if( ( p = getenv( "XDG_DATA_HOME" ) ) != NULL ) - { - Com_sprintf(homePath, sizeof(homePath), "%s%c", p, PATH_SEP); - if(com_homepath->string[0]) - Q_strcat(homePath, sizeof(homePath), com_homepath->string); - else - Q_strcat(homePath, sizeof(homePath), HOMEPATH_NAME_UNIX); - - return homePath; - } - - if( ( p = getenv( "HOME" ) ) != NULL ) - { - Com_sprintf(homePath, sizeof(homePath), "%s%c.local%cshare%c", p, PATH_SEP, PATH_SEP, PATH_SEP); - if(com_homepath->string[0]) - Q_strcat(homePath, sizeof(homePath), com_homepath->string); - else - Q_strcat(homePath, sizeof(homePath), HOMEPATH_NAME_UNIX); - - return homePath; - } - } - - return homePath; -} -#endif - -char *Sys_ConsoleInput(void) -{ - static char text[256]; - int len; - fd_set fdset; - struct timeval timeout; - - return NULL; - - if (!stdin_active) - return NULL; - - FD_ZERO(&fdset); - FD_SET(0, &fdset); // stdin - timeout.tv_sec = 0; - timeout.tv_usec = 0; - if (select (1, &fdset, NULL, NULL, &timeout) == -1 || !FD_ISSET(0, &fdset)) - return NULL; - - len = read (0, text, sizeof(text)); - if (len == 0) { // eof! - stdin_active = qfalse; - return NULL; - } - - if (len < 1) - return NULL; - text[len-1] = 0; // rip off the /n and terminate - - return text; -} - -/* -================ -Sys_QueEvent - -A time of 0 will get the current time -Ptr should either be null, or point to a block of data that can -be freed by the game later. -================ -*/ -void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptrLength, void *ptr ) { - sysEvent_t *ev; - - ev = &eventQue[ eventHead & MASK_QUED_EVENTS ]; - - // bk000305 - was missing - if ( eventHead - eventTail >= MAX_QUED_EVENTS ) { - Com_Printf("Sys_QueEvent: overflow\n"); - // we are discarding an event, but don't leak memory - if ( ev->evPtr ) { - Z_Free( ev->evPtr ); - } - eventTail++; - } - - eventHead++; - - if ( time == 0 ) { - time = Sys_Milliseconds(); - } - - ev->evTime = time; - ev->evType = type; - ev->evValue = value; - ev->evValue2 = value2; - ev->evPtrLength = ptrLength; - ev->evPtr = ptr; -} diff --git a/code/ui/gameinfo.cpp b/code/ui/gameinfo.cpp index a9439ac1a3..e7d59b1f73 100644 --- a/code/ui/gameinfo.cpp +++ b/code/ui/gameinfo.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // // gameinfo.c @@ -22,10 +26,6 @@ This file is part of Jedi Academy. // *** This file is used by both the game and the user interface *** - -// ... and for that reason is excluded from PCH usage for the moment =Ste. - - #include "gameinfo.h" #include "../game/weapons.h" diff --git a/code/ui/gameinfo.h b/code/ui/gameinfo.h index 746a579ae9..d339f266f8 100644 --- a/code/ui/gameinfo.h +++ b/code/ui/gameinfo.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __GAMEINFO_H__ #define __GAMEINFO_H__ diff --git a/code/ui/menudef.h b/code/ui/menudef.h index 0cc406e9dc..d2504cf459 100644 --- a/code/ui/menudef.h +++ b/code/ui/menudef.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #define ITEM_TYPE_TEXT 0 // simple text #define ITEM_TYPE_BUTTON 1 // button, basically text with a border diff --git a/code/ui/ui_atoms.cpp b/code/ui/ui_atoms.cpp index 1aa759d584..f6146572eb 100644 --- a/code/ui/ui_atoms.cpp +++ b/code/ui/ui_atoms.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software /********************************************************************** UI_ATOMS.C diff --git a/code/ui/ui_connect.cpp b/code/ui/ui_connect.cpp index 0dcb59900b..fe2a8c0fd2 100644 --- a/code/ui/ui_connect.cpp +++ b/code/ui/ui_connect.cpp @@ -1,23 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this at the top of all UI_xxxx files for PCH reasons... -// #include "../server/exe_headers.h" #include "ui_local.h" @@ -33,6 +36,17 @@ CONNECTION SCREEN char connectionDialogString[1024]; char connectionMessageString[1024]; +#ifdef JK2_MODE +/* + ================= + UI_DrawThumbNail + ================= + */ +void UI_DrawThumbNail( float x, float y, float w, float h, byte *pic ) +{ + ui.DrawStretchRaw( x, y, w, h, SG_SCR_WIDTH, SG_SCR_HEIGHT, pic, 0, qtrue ); +} +#endif /* ======================== @@ -52,17 +66,20 @@ void UI_DrawConnect( const char *servername, const char *updateInfoString ) { return; } #endif - -// qboolean qValid; -// byte *levelPic = ui.SCR_GetScreenshot(&qValid); +#ifdef JK2_MODE + qboolean qValid; + byte *levelPic = SCR_GetScreenshot(&qValid); // draw the dialog background -// if (!qValid) + if (!qValid) { UI_DrawHandlePic(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, uis.menuBackShader ); } -// else { -// UI_DrawThumbNail(0,SCREEN_HEIGHT, SCREEN_WIDTH, -SCREEN_HEIGHT, levelPic ); -// } + else { + UI_DrawThumbNail(0,0, SCREEN_WIDTH, SCREEN_HEIGHT, levelPic ); + } +#else + UI_DrawHandlePic( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, uis.menuBackShader ); +#endif } diff --git a/code/ui/ui_debug.cpp b/code/ui/ui_debug.cpp deleted file mode 100644 index 4c86b7c5b0..0000000000 --- a/code/ui/ui_debug.cpp +++ /dev/null @@ -1,747 +0,0 @@ -// Filename:- ui_debug.cpp -// -// an entire temp module just for doing some evil menu hackery during development... -// - - -#include "../server/exe_headers.h" - - -#if 0 // this entire module was special code to StripEd-ify *menu, it isn't needed now, but I'll keep the source around for a while -ste - - -#ifdef _DEBUG -#include -#include "../qcommon/sstring.h" -typedef sstring<4096> sstringBIG_t; -typedef set StringSet_t; - StringSet_t MenusUsed; -typedef map ReferencesAndPackages_t; - ReferencesAndPackages_t ReferencesAndPackage; - - -struct Reference_t -{ - sstringBIG_t sString; - sstring_t sReference; - sstring_t sMenu; - - Reference_t() - { - sString = ""; - sReference = ""; - sMenu = ""; - } - - // sort by menu entry, then by reference within menu... - // - bool operator < (const Reference_t& _X) const - { - int i = stricmp(sMenu.c_str(),_X.sMenu.c_str()); - if (i) - return i<0; - - return !!(stricmp(sReference.c_str(),_X.sReference.c_str()) < 0); - } -}; -#include -typedef list References_t; - References_t BadReferences; - -sstring_t sCurrentMenu; -void UI_Debug_AddMenuFilePath(LPCSTR psMenuFile) // eg "ui/blah.menu" -{ - sCurrentMenu = psMenuFile; - - OutputDebugString(va("Current menu: \"%s\"\n",psMenuFile)); -} - - -typedef struct -{ - // to correct... - // - sstring_t sMenuFile; - sstringBIG_t sTextToFind; // will be either @REFERENCE or "text" - sstringBIG_t sTextToReplaceWith; // will be @NEWREF - // - // to generate new data... - // - sstring_t sStripEdReference; // when NZ, this will create a new StripEd entry... - sstringBIG_t sStripEdText; - sstring_t sStripEdFileRef; // ... in this file reference (eg "SPMENUS%d"), where 0.255 of each all have this in them (for ease of coding) - -} CorrectionDataItem_t; -typedef list CorrectionData_t; - CorrectionData_t CorrectionData; - - -static LPCSTR CreateUniqueReference(LPCSTR psText) -{ - static set ReferencesSoFar; - - static sstringBIG_t NewReference; - - LPCSTR psTextScanPos = psText; - - while(*psTextScanPos) - { - while (isspace(*psTextScanPos)) psTextScanPos++; - - NewReference = psTextScanPos; - - // cap off text at an approx length... - // - const int iApproxReferenceLength = 20; - char *p; - if (iApproxReferenceLength TextConsolidationTable_t; // string and ref - static TextConsolidationTable_t TextConsolidationTable, RefrConsolidationTable; - static int iIndex = 0; // INC'd every time a new StripEd entry is synthesised - - TextConsolidationTable_t::iterator it = TextConsolidationTable.find(psText); - if (it == TextConsolidationTable.end()) - { - // new entry... - // - LPCSTR psNewReference = CreateUniqueReference( (strlen(psReference) > strlen(psText))?psReference:psText ); - - CorrectionDataItem_t CorrectionDataItem; - CorrectionDataItem.sMenuFile = psMenuFile; - CorrectionDataItem.sTextToFind = strlen(psReference) ? ( /* !stricmp(psReference,psNewReference) ? "" :*/ va("@%s",psReference) ) - : va("\"%s\"",psText); - CorrectionDataItem.sTextToReplaceWith = /* !stricmp(psReference,psNewReference) ? "" : */va("@%s",psNewReference); - // - CorrectionDataItem.sStripEdReference = psNewReference; - CorrectionDataItem.sStripEdText = psText; - -// qboolean bIsMulti = !!strstr(psMenuFile,"jk2mp"); -// CorrectionDataItem.sStripEdFileRef = va("%sMENUS%d",bIsMulti?"MP":"SP",iIndex/256); - CorrectionDataItem.sStripEdFileRef = va( "MENUS%d",iIndex/256); - iIndex++; - - CorrectionData.push_back( CorrectionDataItem ); - - TextConsolidationTable[ psText ] = psNewReference; - RefrConsolidationTable[ psText ] = CorrectionDataItem.sStripEdFileRef.c_str(); - } - else - { - // text already entered, so do a little duplicate-resolving... - // - // need to find the reference for the existing version... - // - LPCSTR psNewReference = (*it).second.c_str(); - LPCSTR psPackageRef = (*RefrConsolidationTable.find(psText)).second.c_str(); // yeuch, hack-city - - // only enter correction data if references are different... - // -// if (stricmp(psReference,psNewReference)) - { - CorrectionDataItem_t CorrectionDataItem; - CorrectionDataItem.sMenuFile = psMenuFile; - CorrectionDataItem.sTextToFind = strlen(psReference) ? va("@%s",psReference) : va("\"%s\"",psText); - CorrectionDataItem.sTextToReplaceWith = va("@%s",psNewReference); - // - CorrectionDataItem.sStripEdReference = ""; - CorrectionDataItem.sStripEdText = ""; - CorrectionDataItem.sStripEdFileRef = psPackageRef; - - - CorrectionData.push_back( CorrectionDataItem ); - } - } -} - -static void EnterGoodRef(LPCSTR ps4LetterType, LPCSTR psReference, LPCSTR psPackageReference, LPCSTR psText) -{ - EnterRef(psReference, psText, sCurrentMenu.c_str()); - - ReferencesAndPackage[psReference].insert(psPackageReference); - MenusUsed.insert(psPackageReference); -} - -static bool SendFileToNotepad(LPCSTR psFilename) -{ - bool bReturn = false; - - char sExecString[MAX_PATH]; - - sprintf(sExecString,"notepad %s",psFilename); - - if (WinExec(sExecString, // LPCSTR lpCmdLine, // address of command line - SW_SHOWNORMAL // UINT uCmdShow // window style for new application - ) - >31 // don't ask me, Windoze just uses >31 as OK in this call. - ) - { - // ok... - // - bReturn = true; - } - else - { - assert(0);//ErrorBox("Unable to locate/run NOTEPAD on this machine!\n\n(let me know about this -Ste)"); - } - - return bReturn; -} - -// creates as temp file, then spawns notepad with it... -// -static bool SendStringToNotepad(LPCSTR psWhatever, LPCSTR psLocalFileName) -{ - bool bReturn = false; - - LPCSTR psOutputFileName = va("c:\\%s",psLocalFileName); - - FILE *handle = fopen(psOutputFileName,"wt"); - if (handle) - { - fprintf(handle,"%s",psWhatever); // NOT fprintf(handle,psWhatever), which will try and process built-in %s stuff - fclose(handle); - - bReturn = SendFileToNotepad(psOutputFileName); - } - else - { - assert(0);//ErrorBox(va("Unable to create file \"%s\" for notepad to use!",psOutputFileName)); - } - - return bReturn; -} - - -static qboolean DoFileFindReplace( LPCSTR psMenuFile, LPCSTR psFind, LPCSTR psReplace ) -{ - char *buffer; - - OutputDebugString(va("Loading: \"%s\"\n",psMenuFile)); - - int iLen = FS_ReadFile( psMenuFile,(void **) &buffer); - if (iLen<1) - { - OutputDebugString("Failed!\n"); - assert(0); - return qfalse; - } - - - // find/rep... - // - string str(buffer); - str += "\r\n"; // safety for *(char+1) stuff - - - FS_FreeFile( buffer ); // let go of the buffer - - // originally this kept looping for replacements, but now it only does one (since the find/replace args are repeated - // and this is called again if there are >1 replacements of the same strings to be made... - // -// int iReplacedCount = 0; - char *pFound; - int iSearchPos = 0; - while ( (pFound = strstr(str.c_str()+iSearchPos,psFind)) != NULL) - { - // special check, the next char must be whitespace or carriage return etc, or we're not on a whole-word position... - // - int iFoundLoc = pFound - str.c_str(); - char cAfterFind = pFound[strlen(psFind)]; - if (cAfterFind > 32) - { - // ... then this string was part of a larger one, so ignore it... - // - iSearchPos = iFoundLoc+1; - continue; - } - - str.replace(iFoundLoc, strlen(psFind), psReplace); -// iSearchPos = iFoundLoc+1; -// iReplacedCount++; - break; - } - -// assert(iReplacedCount); -// if (iReplacedCount>1) -// { -// int z=1; -// } - FS_WriteFile( psMenuFile, str.c_str(), strlen(str.c_str())); - - OutputDebugString("Ok\n"); - - return qtrue; -} - -void UI_Dump_f(void) -{ - string sFinalOutput; - vector vStripEdFiles; - -#define OUTPUT sFinalOutput+= -#define OUTPUTSTRIP vStripEdFiles[vStripEdFiles.size()-1] += - - OUTPUT("### UI_Dump(): Top\n"); - - for (ReferencesAndPackages_t::iterator it = ReferencesAndPackage.begin(); it!=ReferencesAndPackage.end(); ++it) - { - if ( (*it).second.size()>1) - { - OUTPUT(va("!!!DUP: Ref \"%s\" exists in:\n",(*it).first.c_str())); - StringSet_t &Set = (*it).second; - for (StringSet_t::iterator itS = Set.begin(); itS!=Set.end(); ++itS) - { - OUTPUT(va("%s\n",(*itS).c_str())); - } - } - } - - OUTPUT("\nSP Package Reference list:\n"); - - for (StringSet_t::iterator itS = MenusUsed.begin(); itS!=MenusUsed.end(); ++itS) - { - OUTPUT(va("%s\n",(*itS).c_str())); - } - - OUTPUT("\nBad Text list:\n"); - - for (References_t::iterator itBad=BadReferences.begin(); itBad!=BadReferences.end();++itBad) - { - Reference_t &BadReference = (*itBad); - - OUTPUT(va("File: %30s \"%s\"\n",BadReference.sMenu.c_str(), BadReference.sString.c_str())); - } - - OUTPUT("\nAdding bad references to final correction list...\n"); - - for (itBad=BadReferences.begin(); itBad!=BadReferences.end();++itBad) - { - Reference_t &BadReference = (*itBad); - - EnterRef("", BadReference.sString.c_str(), BadReference.sMenu.c_str() ); - } - - - OUTPUT("\nFinal correction list:\n"); - -// qboolean bIsMulti = !!strstr((*CorrectionData.begin()).sMenuFile.c_str(),"jk2mp"); - - // actually do the find/replace... - // - for (CorrectionData_t::iterator itCorrectionData = CorrectionData.begin(); itCorrectionData != CorrectionData.end(); ++itCorrectionData) - { - CorrectionDataItem_t &CorrectionDataItem = (*itCorrectionData); - - if (CorrectionDataItem.sTextToFind.c_str()[0] && CorrectionDataItem.sTextToReplaceWith.c_str()[0]) - { - OUTPUT( va("Load File: \"%s\", find \"%s\", replace with \"%s\"\n", - CorrectionDataItem.sMenuFile.c_str(), - CorrectionDataItem.sTextToFind.c_str(), - CorrectionDataItem.sTextToReplaceWith.c_str() - ) - ); - - -// if (strstr(CorrectionDataItem.sTextToReplaceWith.c_str(),"START_A_NEW_GAME")) -// { -// int z=1; -// } - assert( CorrectionDataItem.sTextToReplaceWith.c_str()[0] ); - string sReplace( CorrectionDataItem.sTextToReplaceWith.c_str() ); - sReplace.insert(1,"_"); - sReplace.insert(1,CorrectionDataItem.sStripEdFileRef.c_str()); - - DoFileFindReplace( CorrectionDataItem.sMenuFile.c_str(), - CorrectionDataItem.sTextToFind.c_str(), - sReplace.c_str()//CorrectionDataItem.sTextToReplaceWith.c_str() - ); - } - } - - - // scan in all SP files into one huge string, so I can pick out any foreign translations to add in when generating - // new StripEd files... - // - char **ppsFiles; - char *buffers[1000]; // max # SP files, well-OTT. - int iNumFiles; - int i; - string sStripFiles; - - // scan for shader files - ppsFiles = FS_ListFiles( "strip", ".sp", &iNumFiles ); - if ( !ppsFiles || !iNumFiles ) - { - assert(0); - } - else - { - // load files... - // - for (i=0; i=0; i-- ) - { - sStripFiles += buffers[i]; - sStripFiles += "\r\n"; - - FS_FreeFile( buffers[i] ); - } - } - - int iIndex=0; - for (itCorrectionData = CorrectionData.begin(); itCorrectionData != CorrectionData.end(); ++itCorrectionData) - { - CorrectionDataItem_t &CorrectionDataItem = (*itCorrectionData); - - if (CorrectionDataItem.sStripEdReference.c_str()[0] // skip over duplicate-resolving entries -// && CorrectionDataItem.sStripEdText.c_str()[0] // - ) - { - string strAnyForeignStringsFound; // will be entire line plus CR - string strNotes; // will be just the bit within quotes - - LPCSTR psFoundExisting; - int iInitialSearchPos = 0; - while (iInitialSearchPos < sStripFiles.size() && - (strAnyForeignStringsFound.empty() || strNotes.empty()) - ) - { - if ( (psFoundExisting = strstr( sStripFiles.c_str()+iInitialSearchPos, va("\"%s\"",CorrectionDataItem.sStripEdText.c_str()))) != NULL ) - { - // see if we can find any NOTES entry above this... - // - LPCSTR p; - - if (strNotes.empty()) - { - p = psFoundExisting; - while (p > sStripFiles.c_str() && *p!='{') - { - if (!strnicmp(p,"NOTES",5) && isspace(p[-1]) && isspace(p[5])) - { - p = strchr(p,'"'); - if (!p++) - break; - while (*p != '"') - strNotes += *p++; - break; - } - p--; - } - } - - // now search for any foreign versions we already have translated... - // - if (strAnyForeignStringsFound.empty()) - { - p = psFoundExisting; - LPCSTR psNextBrace = strchr(p,'}'); - assert(psNextBrace); - if (psNextBrace) - { - for (int i=2; i<10; i++) - { - LPCSTR psForeign = strstr(p,va("TEXT_LANGUAGE%d",i)); - if (psForeign && psForeign < psNextBrace) - { - strAnyForeignStringsFound += " "; - while (*psForeign != '\n' && *psForeign != '\0') - { - strAnyForeignStringsFound += *psForeign++; - } - strAnyForeignStringsFound += "\n"; - } - } - } - } - - iInitialSearchPos = psFoundExisting - sStripFiles.c_str(); - iInitialSearchPos++; // one past, so we don't re-find ourselves - } - else - { - break; - } - } - - if (!strNotes.empty()) - { - strNotes = va(" NOTES \"%s\"\n",strNotes.c_str()); - } - - // now do output... - // - if (!(iIndex%256)) - { - string s; - vStripEdFiles.push_back(s); - - OUTPUTSTRIP( va( "VERSION 1\n" - "CONFIG W:\\bin\\striped.cfg\n" - "ID %d\n" - "REFERENCE MENUS%d\n" - "DESCRIPTION \"menu text\"\n" - "COUNT 256\n", // count will need correcting for last one - 250 + (iIndex/256), // 250 range seems to be unused - iIndex/256 - ) - ); - -// OUTPUTSTRIP( va("REFERENCE %s\n", va("%sMENUS%d",bIsMulti?"MP":"SP",iIndex/256)) ); -// OUTPUTSTRIP( va("REFERENCE %s\n", va( "MENUS%d",iIndex/256)) ); - } - - OUTPUTSTRIP( va( "INDEX %d\n" - "{\n" - " REFERENCE %s\n" - "%s" - " TEXT_LANGUAGE1 \"%s\"\n" - "%s" - "}\n", - iIndex%256, - CorrectionDataItem.sStripEdReference.c_str(), - (strNotes.empty()?"":strNotes.c_str()), - CorrectionDataItem.sStripEdText.c_str(), - strAnyForeignStringsFound.c_str() - ) - ); - - iIndex++; - } - } - - OUTPUT("### UI_Dump(): Bottom\n"); - - SendStringToNotepad(sFinalOutput.c_str(), "temp.txt"); - - // output the SP files... - // - for (i=0; i. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __UI_LOCAL_H__ #define __UI_LOCAL_H__ @@ -28,7 +33,6 @@ This file is part of Jedi Academy. #include "ui_public.h" #include "ui_shared.h" -#define MAX_PLAYERMODELS 32 #define MAX_DEFERRED_SCRIPT 1024 // @@ -118,20 +122,32 @@ typedef struct { const char *modDescr; } modInfo_t; +#define SKIN_LENGTH 16 +#define ACTION_BUFFER_SIZE 128 + +typedef struct { + char name[SKIN_LENGTH]; +} skinName_t; + +typedef struct { + char shader[MAX_QPATH]; + char actionText[ACTION_BUFFER_SIZE]; +} playerColor_t; + typedef struct { char Name[64]; int SkinHeadCount; -// qhandle_t SkinHeadIcons[MAX_PLAYERMODELS]; - char SkinHeadNames[MAX_PLAYERMODELS][16]; + int SkinHeadMax; + skinName_t *SkinHead; int SkinTorsoCount; -// qhandle_t SkinTorsoIcons[MAX_PLAYERMODELS]; - char SkinTorsoNames[MAX_PLAYERMODELS][16]; + int SkinTorsoMax; + skinName_t *SkinTorso; int SkinLegCount; -// qhandle_t SkinLegIcons[MAX_PLAYERMODELS]; - char SkinLegNames[MAX_PLAYERMODELS][16]; - char ColorShader[MAX_PLAYERMODELS][64]; + int SkinLegMax; + skinName_t *SkinLeg; + int ColorMax; int ColorCount; - char ColorActionText[MAX_PLAYERMODELS][128]; + playerColor_t *Color; } playerSpeciesInfo_t; typedef struct { @@ -144,8 +160,9 @@ typedef struct { int modIndex; int modCount; + int playerSpeciesMax; int playerSpeciesCount; - playerSpeciesInfo_t playerSpecies[MAX_PLAYERMODELS]; + playerSpeciesInfo_t *playerSpecies; int playerSpeciesIndex; diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 82ccc5eb6e..f2d2cf27dd 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -1,22 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// Copyright (C) 1999-2000 Id Software, Inc. -// + /* ======================================================================= @@ -41,8 +45,8 @@ USER INTERFACE MAIN #include "../game/anims.h" extern stringID_table_t animTable [MAX_ANIMATIONS+1]; +#include "../qcommon/stringed_ingame.h" #include "../qcommon/stv_version.h" - #include "../qcommon/q_shared.h" extern qboolean ItemParse_model_g2anim_go( itemDef_t *item, const char *animName ); @@ -56,11 +60,11 @@ extern qboolean PC_Script_Parse(const char **out); #define LISTBUFSIZE 10240 -static struct +static struct { char listBuf[LISTBUFSIZE]; // The list of file names read in - // For scrolling through file names + // For scrolling through file names int currentLine; // Index to currentSaveFileComments[] currently highlighted int saveFileCnt; // Number of save files read in @@ -73,9 +77,11 @@ static struct #define MAX_SAVELOADFILES 100 #define MAX_SAVELOADNAME 32 -//byte screenShotBuf[SG_SCR_WIDTH * SG_SCR_HEIGHT * 4]; +#ifdef JK2_MODE +byte screenShotBuf[SG_SCR_WIDTH * SG_SCR_HEIGHT * 4]; +#endif -typedef struct +typedef struct { char *currentSaveFileName; // file name of savegame char currentSaveFileComments[iSG_COMMENT_SIZE]; // file comment @@ -205,15 +211,15 @@ const char *datapadMoveTitleBaseAnims[MD_MOVE_TITLE_MAX] = #define MAX_MOVES 16 -typedef struct +typedef struct { - const char *title; - const char *desc; + const char *title; + const char *desc; const char *anim; short sound; } datpadmovedata_t; -static datpadmovedata_t datapadMoveData[MD_MOVE_TITLE_MAX][MAX_MOVES] = +static datpadmovedata_t datapadMoveData[MD_MOVE_TITLE_MAX][MAX_MOVES] = { { // Acrobatics @@ -371,33 +377,33 @@ vmCvar_t ui_char_color_green; vmCvar_t ui_char_color_blue; vmCvar_t ui_PrecacheModels; -static cvarTable_t cvarTable[] = +static cvarTable_t cvarTable[] = { { &ui_menuFiles, "ui_menuFiles", "ui/menus.txt", CVAR_ARCHIVE }, #ifdef JK2_MODE - { &ui_hudFiles, "cg_hudFiles", "ui/jk2hud.txt",CVAR_ARCHIVE}, + { &ui_hudFiles, "cg_hudFiles", "ui/jk2hud.txt",CVAR_ARCHIVE}, #else - { &ui_hudFiles, "cg_hudFiles", "ui/jahud.txt",CVAR_ARCHIVE}, + { &ui_hudFiles, "cg_hudFiles", "ui/jahud.txt",CVAR_ARCHIVE}, #endif - { &ui_char_anim, "ui_char_anim", "BOTH_WALK1",0}, + { &ui_char_anim, "ui_char_anim", "BOTH_WALK1",0}, { &ui_char_model, "ui_char_model", "",0}, //these are filled in by the "g_*" versions on load { &ui_char_skin_head, "ui_char_skin_head", "",0}, //the "g_*" versions are initialized in UI_Init, ui_atoms.cpp - { &ui_char_skin_torso, "ui_char_skin_torso", "",0}, - { &ui_char_skin_legs, "ui_char_skin_legs", "",0}, + { &ui_char_skin_torso, "ui_char_skin_torso", "",0}, + { &ui_char_skin_legs, "ui_char_skin_legs", "",0}, { &ui_saber_type, "ui_saber_type", "",0}, - { &ui_saber, "ui_saber", "",0}, - { &ui_saber2, "ui_saber2", "",0}, - { &ui_saber_color, "ui_saber_color", "",0}, - { &ui_saber2_color, "ui_saber2_color", "",0}, + { &ui_saber, "ui_saber", "",0}, + { &ui_saber2, "ui_saber2", "",0}, + { &ui_saber_color, "ui_saber_color", "",0}, + { &ui_saber2_color, "ui_saber2_color", "",0}, - { &ui_char_color_red, "ui_char_color_red", "", 0}, - { &ui_char_color_green, "ui_char_color_green", "", 0}, - { &ui_char_color_blue, "ui_char_color_blue", "", 0}, + { &ui_char_color_red, "ui_char_color_red", "", 0}, + { &ui_char_color_green, "ui_char_color_green", "", 0}, + { &ui_char_color_blue, "ui_char_color_blue", "", 0}, - { &ui_PrecacheModels, "ui_PrecacheModels", "1", CVAR_ARCHIVE}, + { &ui_PrecacheModels, "ui_PrecacheModels", "1", CVAR_ARCHIVE}, }; #define FP_UPDATED_NONE -1 @@ -414,7 +420,7 @@ void _UI_Refresh( int realtime ) static int index; static int previousTimes[UI_FPS_FRAMES]; - if ( !( Key_GetCatcher() & KEYCATCH_UI ) ) + if ( !( Key_GetCatcher() & KEYCATCH_UI ) ) { return; } @@ -435,16 +441,16 @@ void _UI_Refresh( int realtime ) previousTimes[index % UI_FPS_FRAMES] = uiInfo.uiDC.frameTime; index++; - if ( index > UI_FPS_FRAMES ) + if ( index > UI_FPS_FRAMES ) { int i, total; // average multiple frames together to smooth changes out a bit total = 0; - for ( i = 0 ; i < UI_FPS_FRAMES ; i++ ) + for ( i = 0 ; i < UI_FPS_FRAMES ; i++ ) { total += previousTimes[i]; } - if ( !total ) + if ( !total ) { total = 1; } @@ -455,7 +461,7 @@ void _UI_Refresh( int realtime ) UI_UpdateCvars(); - if (Menu_Count() > 0) + if (Menu_Count() > 0) { // paint all the menus Menu_PaintAll(); @@ -465,7 +471,7 @@ void _UI_Refresh( int realtime ) // UI_BuildServerStatus(qfalse); // refresh find player list // UI_BuildFindPlayerList(qfalse); - } + } // draw cursor UI_SetColor( NULL ); @@ -529,7 +535,7 @@ Text_PaintChar ================ */ /* -static void Text_PaintChar(float x, float y, float width, float height, float scale, float s, float t, float s2, float t2, qhandle_t hShader) +static void Text_PaintChar(float x, float y, float width, float height, float scale, float s, float t, float s2, float t2, qhandle_t hShader) { float w, h; @@ -583,32 +589,33 @@ Text_PaintWithCursor ================ */ // iMaxPixelWidth is 0 here for no-limit -void Text_PaintWithCursor(float x, float y, float scale, vec4_t color, const char *text, int cursorPos, char cursor, int iMaxPixelWidth, int style, int iFontIndex) +void Text_PaintWithCursor(float x, float y, float scale, vec4_t color, const char *text, int cursorPos, char cursor, int iMaxPixelWidth, int style, int iFontIndex) { Text_Paint(x, y, scale, color, text, iMaxPixelWidth, style, iFontIndex); // now print the cursor as well... // char sTemp[1024]; - int iCopyCount = min((int)strlen(text), cursorPos); - iCopyCount = min(iCopyCount,(int)sizeof(sTemp)); + int iCopyCount = iMaxPixelWidth > 0 ? Q_min( (int)strlen( text ), iMaxPixelWidth ) : (int)strlen( text ); + iCopyCount = Q_min(iCopyCount, cursorPos); + iCopyCount = Q_min(iCopyCount,(int)sizeof(sTemp)); // copy text into temp buffer for pixel measure... // strncpy(sTemp,text,iCopyCount); sTemp[iCopyCount] = '\0'; - + int iNextXpos = ui.R_Font_StrLenPixels(sTemp, iFontIndex, scale ); Text_Paint(x+iNextXpos, y, scale, color, va("%c",cursor), iMaxPixelWidth, style|ITEM_TEXTSTYLE_BLINK, iFontIndex); } -const char *UI_FeederItemText(float feederID, int index, int column, qhandle_t *handle) +const char *UI_FeederItemText(float feederID, int index, int column, qhandle_t *handle) { *handle = -1; - if (feederID == FEEDER_SAVEGAMES) + if (feederID == FEEDER_SAVEGAMES) { if (column==0) { @@ -619,19 +626,22 @@ const char *UI_FeederItemText(float feederID, int index, int column, qhandle_t * return s_savedata[index].currentSaveFileDateTimeString; } } - else if (feederID == FEEDER_MOVES) + else if (feederID == FEEDER_MOVES) { return datapadMoveData[uiInfo.movesTitleIndex][index].title; } - else if (feederID == FEEDER_MOVES_TITLES) + else if (feederID == FEEDER_MOVES_TITLES) { return datapadMoveTitleData[index]; } - else if (feederID == FEEDER_PLAYER_SPECIES) + else if (feederID == FEEDER_PLAYER_SPECIES) { - return uiInfo.playerSpecies[index].Name; - } - else if (feederID == FEEDER_LANGUAGES) + if (index >= 0 && index < uiInfo.playerSpeciesCount) + { + return uiInfo.playerSpecies[index].Name; + } + } + else if (feederID == FEEDER_LANGUAGES) { #ifdef JK2_MODE // FIXME @@ -639,98 +649,98 @@ const char *UI_FeederItemText(float feederID, int index, int column, qhandle_t * #else return SE_GetLanguageName( index ); #endif - } + } else if (feederID == FEEDER_PLAYER_SKIN_HEAD) { - if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadCount) + if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadCount) { - *handle = ui.R_RegisterShaderNoMip(va("models/players/%s/icon_%s.jpg", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadNames[index])); - return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadNames[index]; + *handle = ui.R_RegisterShaderNoMip(va("models/players/%s/icon_%s.jpg", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHead[index].name)); + return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHead[index].name; } } else if (feederID == FEEDER_PLAYER_SKIN_TORSO) { - if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoCount) + if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoCount) { - *handle = ui.R_RegisterShaderNoMip(va("models/players/%s/icon_%s.jpg", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoNames[index])); - return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoNames[index]; + *handle = ui.R_RegisterShaderNoMip(va("models/players/%s/icon_%s.jpg", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorso[index].name)); + return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorso[index].name; } } else if (feederID == FEEDER_PLAYER_SKIN_LEGS) { - if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegCount) + if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegCount) { - *handle = ui.R_RegisterShaderNoMip(va("models/players/%s/icon_%s.jpg", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegNames[index])); - return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegNames[index]; + *handle = ui.R_RegisterShaderNoMip(va("models/players/%s/icon_%s.jpg", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLeg[index].name)); + return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLeg[index].name; } } else if (feederID == FEEDER_COLORCHOICES) { - if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorCount) + if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorCount) { - *handle = ui.R_RegisterShaderNoMip( uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorShader[index]); - return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorShader[index]; + *handle = ui.R_RegisterShaderNoMip( uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color[index].shader); + return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color[index].shader; } } - else if (feederID == FEEDER_MODS) + else if (feederID == FEEDER_MODS) { - if (index >= 0 && index < uiInfo.modCount) + if (index >= 0 && index < uiInfo.modCount) { - if (uiInfo.modList[index].modDescr && *uiInfo.modList[index].modDescr) + if (uiInfo.modList[index].modDescr && *uiInfo.modList[index].modDescr) { return uiInfo.modList[index].modDescr; - } - else + } + else { return uiInfo.modList[index].modName; } } - } + } return ""; } -qhandle_t UI_FeederItemImage(float feederID, int index) +qhandle_t UI_FeederItemImage(float feederID, int index) { - if (feederID == FEEDER_PLAYER_SKIN_HEAD) + if (feederID == FEEDER_PLAYER_SKIN_HEAD) { - if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadCount) + if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadCount) { //return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadIcons[index]; - return ui.R_RegisterShaderNoMip(va("models/players/%s/icon_%s.jpg", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadNames[index])); + return ui.R_RegisterShaderNoMip(va("models/players/%s/icon_%s.jpg", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHead[index].name)); } - } - else if (feederID == FEEDER_PLAYER_SKIN_TORSO) + } + else if (feederID == FEEDER_PLAYER_SKIN_TORSO) { - if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoCount) + if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoCount) { //return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoIcons[index]; - return ui.R_RegisterShaderNoMip(va("models/players/%s/icon_%s.jpg", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoNames[index])); + return ui.R_RegisterShaderNoMip(va("models/players/%s/icon_%s.jpg", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorso[index].name)); } - } - else if (feederID == FEEDER_PLAYER_SKIN_LEGS) + } + else if (feederID == FEEDER_PLAYER_SKIN_LEGS) { - if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegCount) + if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegCount) { //return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegIcons[index]; - return ui.R_RegisterShaderNoMip(va("models/players/%s/icon_%s.jpg", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegNames[index])); + return ui.R_RegisterShaderNoMip(va("models/players/%s/icon_%s.jpg", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLeg[index].name)); } - } + } else if (feederID == FEEDER_COLORCHOICES) { - if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorCount) + if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorCount) { - return ui.R_RegisterShaderNoMip( uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorShader[index]); + return ui.R_RegisterShaderNoMip( uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color[index].shader); } } -/* else if (feederID == FEEDER_ALLMAPS || feederID == FEEDER_MAPS) +/* else if (feederID == FEEDER_ALLMAPS || feederID == FEEDER_MAPS) { int actual; UI_SelectedMap(index, &actual); index = actual; - if (index >= 0 && index < uiInfo.mapCount) + if (index >= 0 && index < uiInfo.mapCount) { - if (uiInfo.mapList[index].levelShot == -1) + if (uiInfo.mapList[index].levelShot == -1) { uiInfo.mapList[index].levelShot = trap_R_RegisterShaderNoMip(uiInfo.mapList[index].imageName); } @@ -781,7 +791,7 @@ static qboolean UI_DeferMenuScript ( const char **args ) const char* name; // Whats the reason for being deferred? - if (!String_Parse(args, &name)) + if (!String_Parse(args, &name)) { return qfalse; } @@ -818,39 +828,39 @@ static qboolean UI_DeferMenuScript ( const char **args ) UI_RunMenuScript =============== */ -static qboolean UI_RunMenuScript ( const char **args ) +static qboolean UI_RunMenuScript ( const char **args ) { const char *name, *name2,*mapName,*menuName,*warningMenuName; - if (String_Parse(args, &name)) + if (String_Parse(args, &name)) { - if (Q_stricmp(name, "resetdefaults") == 0) + if (Q_stricmp(name, "resetdefaults") == 0) { UI_ResetDefaults(); } - else if (Q_stricmp(name, "saveControls") == 0) + else if (Q_stricmp(name, "saveControls") == 0) { Controls_SetConfig(); - } - else if (Q_stricmp(name, "loadControls") == 0) + } + else if (Q_stricmp(name, "loadControls") == 0) { Controls_GetConfig(); - } - else if (Q_stricmp(name, "clearError") == 0) + } + else if (Q_stricmp(name, "clearError") == 0) { Cvar_Set("com_errorMessage", ""); - } - else if (Q_stricmp(name, "ReadSaveDirectory") == 0) + } + else if (Q_stricmp(name, "ReadSaveDirectory") == 0) { s_savegame.saveFileCnt = -1; //force a refresh at drawtime // ReadSaveDirectory(); - } - else if (Q_stricmp(name, "loadAuto") == 0) + } + else if (Q_stricmp(name, "loadAuto") == 0) { Menus_CloseAll(); ui.Cmd_ExecuteText( EXEC_APPEND, "load auto\n"); //load game menu } - else if (Q_stricmp(name, "loadgame") == 0) + else if (Q_stricmp(name, "loadgame") == 0) { if (s_savedata[s_savegame.currentLine].currentSaveFileName)// && (*s_file_desc_field.field.buffer)) { @@ -861,7 +871,7 @@ static qboolean UI_RunMenuScript ( const char **args ) s_savegame.currentLine = 0; } - else if (Q_stricmp(name, "deletegame") == 0) + else if (Q_stricmp(name, "deletegame") == 0) { if (s_savedata[s_savegame.currentLine].currentSaveFileName) // A line was chosen { @@ -870,21 +880,21 @@ static qboolean UI_RunMenuScript ( const char **args ) #endif ui.Cmd_ExecuteText( EXEC_NOW, va("wipe %s\n", s_savedata[s_savegame.currentLine].currentSaveFileName)); - + if( (s_savegame.currentLine>0) && ((s_savegame.currentLine+1) == s_savegame.saveFileCnt) ) { s_savegame.currentLine--; // yeah this is a pretty bad hack // adjust cursor position of listbox so correct item is highlighted - UI_AdjustSaveGameListBox( s_savegame.currentLine ); + UI_AdjustSaveGameListBox( s_savegame.currentLine ); } - + // ReadSaveDirectory(); //refresh s_savegame.saveFileCnt = -1; //force a refresh at drawtime } } - else if (Q_stricmp(name, "savegame") == 0) + else if (Q_stricmp(name, "savegame") == 0) { char fileName[MAX_SAVELOADNAME]; char description[64]; @@ -911,11 +921,11 @@ static qboolean UI_RunMenuScript ( const char **args ) ui.Cmd_ExecuteText( EXEC_APPEND, va("save %s\n", fileName)); s_savegame.saveFileCnt = -1; //force a refresh the next time around } - else if (Q_stricmp(name, "LoadMods") == 0) + else if (Q_stricmp(name, "LoadMods") == 0) { UI_LoadMods(); - } - else if (Q_stricmp(name, "RunMod") == 0) + } + else if (Q_stricmp(name, "RunMod") == 0) { if (uiInfo.modList[uiInfo.modIndex].modName) { @@ -924,26 +934,26 @@ static qboolean UI_RunMenuScript ( const char **args ) FS_Restart(); Cbuf_ExecuteText( EXEC_APPEND, "vid_restart;" ); } - } - else if (Q_stricmp(name, "Quit") == 0) + } + else if (Q_stricmp(name, "Quit") == 0) { Cbuf_ExecuteText( EXEC_NOW, "quit"); - } - else if (Q_stricmp(name, "Controls") == 0) + } + else if (Q_stricmp(name, "Controls") == 0) { Cvar_Set( "cl_paused", "1" ); trap_Key_SetCatcher( KEYCATCH_UI ); Menus_CloseAll(); Menus_ActivateByName("setup_menu2"); - } - else if (Q_stricmp(name, "Leave") == 0) + } + else if (Q_stricmp(name, "Leave") == 0) { Cbuf_ExecuteText( EXEC_APPEND, "disconnect\n" ); trap_Key_SetCatcher( KEYCATCH_UI ); Menus_CloseAll(); //Menus_ActivateByName("mainMenu"); - } - else if (Q_stricmp(name, "getvideosetup") == 0) + } + else if (Q_stricmp(name, "getvideosetup") == 0) { UI_GetVideoSetup ( ); } @@ -951,27 +961,27 @@ static qboolean UI_RunMenuScript ( const char **args ) { UI_UpdateVideoSetup ( ); } - else if (Q_stricmp(name, "nextDataPadForcePower") == 0) + else if (Q_stricmp(name, "nextDataPadForcePower") == 0) { ui.Cmd_ExecuteText( EXEC_APPEND, "dpforcenext\n"); } - else if (Q_stricmp(name, "prevDataPadForcePower") == 0) + else if (Q_stricmp(name, "prevDataPadForcePower") == 0) { ui.Cmd_ExecuteText( EXEC_APPEND, "dpforceprev\n"); } - else if (Q_stricmp(name, "nextDataPadWeapon") == 0) + else if (Q_stricmp(name, "nextDataPadWeapon") == 0) { ui.Cmd_ExecuteText( EXEC_APPEND, "dpweapnext\n"); } - else if (Q_stricmp(name, "prevDataPadWeapon") == 0) + else if (Q_stricmp(name, "prevDataPadWeapon") == 0) { ui.Cmd_ExecuteText( EXEC_APPEND, "dpweapprev\n"); } - else if (Q_stricmp(name, "nextDataPadInventory") == 0) + else if (Q_stricmp(name, "nextDataPadInventory") == 0) { ui.Cmd_ExecuteText( EXEC_APPEND, "dpinvnext\n"); } - else if (Q_stricmp(name, "prevDataPadInventory") == 0) + else if (Q_stricmp(name, "prevDataPadInventory") == 0) { ui.Cmd_ExecuteText( EXEC_APPEND, "dpinvprev\n"); } @@ -983,7 +993,7 @@ static qboolean UI_RunMenuScript ( const char **args ) UI_CheckVid1Data(menuName,warningMenuName); } - else if (Q_stricmp(name, "startgame") == 0) + else if (Q_stricmp(name, "startgame") == 0) { Menus_CloseAll(); #ifdef JK2_MODE @@ -991,16 +1001,16 @@ static qboolean UI_RunMenuScript ( const char **args ) #else ui.Cmd_ExecuteText( EXEC_APPEND, "map yavin1\n"); #endif - } - else if (Q_stricmp(name, "startmap") == 0) + } + else if (Q_stricmp(name, "startmap") == 0) { Menus_CloseAll(); String_Parse(args, &mapName); ui.Cmd_ExecuteText( EXEC_APPEND, va("maptransition %s\n",mapName)); - } - else if (Q_stricmp(name, "closeingame") == 0) + } + else if (Q_stricmp(name, "closeingame") == 0) { trap_Key_SetCatcher( trap_Key_GetCatcher() & ~KEYCATCH_UI ); trap_Key_ClearStates(); @@ -1016,8 +1026,8 @@ static qboolean UI_RunMenuScript ( const char **args ) { Menus_ActivateByName("mainhud"); } - } - else if (Q_stricmp(name, "closedatapad") == 0) + } + else if (Q_stricmp(name, "closedatapad") == 0) { trap_Key_SetCatcher( trap_Key_GetCatcher() & ~KEYCATCH_UI ); trap_Key_ClearStates(); @@ -1029,8 +1039,8 @@ static qboolean UI_RunMenuScript ( const char **args ) Cvar_Set( "cg_updatedDataPadForcePower2", "0" ); Cvar_Set( "cg_updatedDataPadForcePower3", "0" ); Cvar_Set( "cg_updatedDataPadObjective", "0" ); - } - else if (Q_stricmp(name, "closesabermenu") == 0) + } + else if (Q_stricmp(name, "closesabermenu") == 0) { // if we're in the saber menu when creating a character, close this down if( !Cvar_VariableIntegerValue( "saber_menu" ) ) @@ -1039,12 +1049,12 @@ static qboolean UI_RunMenuScript ( const char **args ) Menus_OpenByName( "characterMenu" ); } } - else if (Q_stricmp(name, "clearmouseover") == 0) + else if (Q_stricmp(name, "clearmouseover") == 0) { itemDef_t *item; menuDef_t *menu = Menu_GetFocused(); - if (menu) + if (menu) { const char *itemName; String_Parse(args, &itemName); @@ -1055,16 +1065,16 @@ static qboolean UI_RunMenuScript ( const char **args ) } } } - else if (Q_stricmp(name, "setMovesListDefault") == 0) + else if (Q_stricmp(name, "setMovesListDefault") == 0) { uiInfo.movesTitleIndex = 2; } - else if (Q_stricmp(name, "resetMovesDesc") == 0) + else if (Q_stricmp(name, "resetMovesDesc") == 0) { menuDef_t *menu = Menu_GetFocused(); itemDef_t *item; - if (menu) + if (menu) { item = (itemDef_s *) Menu_FindItemByName(menu, "item_desc"); if (item) @@ -1075,12 +1085,12 @@ static qboolean UI_RunMenuScript ( const char **args ) listPtr->cursorPos = 0; listPtr->startPos = 0; } - item->cursorPos = 0; + item->cursorPos = 0; } } } - else if (Q_stricmp(name, "resetMovesList") == 0) + else if (Q_stricmp(name, "resetMovesList") == 0) { menuDef_t *menu; menu = Menus_FindByName("datapadMovesMenu"); @@ -1097,11 +1107,11 @@ static qboolean UI_RunMenuScript ( const char **args ) Cvar_Set( "ui_move_desc", " " ); } -// else if (Q_stricmp(name, "setanisotropicmax") == 0) +// else if (Q_stricmp(name, "setanisotropicmax") == 0) // { // r_ext_texture_filter_anisotropic->value; // } - else if (Q_stricmp(name, "setMoveCharacter") == 0) + else if (Q_stricmp(name, "setMoveCharacter") == 0) { itemDef_t *item; menuDef_t *menu; @@ -1128,11 +1138,11 @@ static qboolean UI_RunMenuScript ( const char **args ) uiInfo.moveAnimTime = 0 ; DC->g2hilev_SetAnim(&item->ghoul2[0], "model_root", modelPtr->g2anim, qtrue); - Com_sprintf( skin, sizeof( skin ), "models/players/%s/|%s|%s|%s", - Cvar_VariableString ( "g_char_model"), - Cvar_VariableString ( "g_char_skin_head"), - Cvar_VariableString ( "g_char_skin_torso"), - Cvar_VariableString ( "g_char_skin_legs") + Com_sprintf( skin, sizeof( skin ), "models/players/%s/|%s|%s|%s", + Cvar_VariableString ( "g_char_model"), + Cvar_VariableString ( "g_char_skin_head"), + Cvar_VariableString ( "g_char_skin_torso"), + Cvar_VariableString ( "g_char_skin_legs") ); ItemParse_model_g2skin_go( item, skin ); @@ -1141,59 +1151,59 @@ static qboolean UI_RunMenuScript ( const char **args ) } } } - else if (Q_stricmp(name, "glCustom") == 0) + else if (Q_stricmp(name, "glCustom") == 0) { Cvar_Set("ui_r_glCustom", "4"); - } - else if (Q_stricmp(name, "character") == 0) + } + else if (Q_stricmp(name, "character") == 0) { UI_UpdateCharacter( qfalse ); } - else if (Q_stricmp(name, "characterchanged") == 0) + else if (Q_stricmp(name, "characterchanged") == 0) { UI_UpdateCharacter( qtrue ); } - else if (Q_stricmp(name, "char_skin") == 0) + else if (Q_stricmp(name, "char_skin") == 0) { UI_UpdateCharacterSkin(); } - else if (Q_stricmp(name, "saber_type") == 0) + else if (Q_stricmp(name, "saber_type") == 0) { UI_UpdateSaberType(); } - else if (Q_stricmp(name, "saber_hilt") == 0) + else if (Q_stricmp(name, "saber_hilt") == 0) { UI_UpdateSaberHilt( qfalse ); } - else if (Q_stricmp(name, "saber_color") == 0) + else if (Q_stricmp(name, "saber_color") == 0) { // UI_UpdateSaberColor( qfalse ); } - else if (Q_stricmp(name, "saber2_hilt") == 0) + else if (Q_stricmp(name, "saber2_hilt") == 0) { UI_UpdateSaberHilt( qtrue ); } - else if (Q_stricmp(name, "saber2_color") == 0) + else if (Q_stricmp(name, "saber2_color") == 0) { // UI_UpdateSaberColor( qtrue ); } - else if (Q_stricmp(name, "updatecharcvars") == 0) + else if (Q_stricmp(name, "updatecharcvars") == 0) { UI_UpdateCharacterCvars(); } - else if (Q_stricmp(name, "getcharcvars") == 0) + else if (Q_stricmp(name, "getcharcvars") == 0) { UI_GetCharacterCvars(); } - else if (Q_stricmp(name, "updatesabercvars") == 0) + else if (Q_stricmp(name, "updatesabercvars") == 0) { UI_UpdateSaberCvars(); } - else if (Q_stricmp(name, "getsabercvars") == 0) + else if (Q_stricmp(name, "getsabercvars") == 0) { UI_GetSaberCvars(); } - else if (Q_stricmp(name, "resetsabercvardefaults") == 0) + else if (Q_stricmp(name, "resetsabercvardefaults") == 0) { // NOTE : ONLY do this if saber menu is set properly (ie. first time we enter this menu) if( !Cvar_VariableIntegerValue( "saber_menu" ) ) @@ -1201,77 +1211,77 @@ static qboolean UI_RunMenuScript ( const char **args ) UI_ResetSaberCvars(); } } - else if (Q_stricmp(name, "updatefightingstylechoices") == 0) + else if (Q_stricmp(name, "updatefightingstylechoices") == 0) { UI_UpdateFightingStyleChoices(); } - else if (Q_stricmp(name, "initallocforcepower") == 0) + else if (Q_stricmp(name, "initallocforcepower") == 0) { const char *forceName; String_Parse(args, &forceName); UI_InitAllocForcePowers(forceName); } - else if (Q_stricmp(name, "affectforcepowerlevel") == 0) + else if (Q_stricmp(name, "affectforcepowerlevel") == 0) { const char *forceName; String_Parse(args, &forceName); UI_AffectForcePowerLevel(forceName); } - else if (Q_stricmp(name, "decrementcurrentforcepower") == 0) + else if (Q_stricmp(name, "decrementcurrentforcepower") == 0) { UI_DecrementCurrentForcePower(); } - else if (Q_stricmp(name, "shutdownforcehelp") == 0) + else if (Q_stricmp(name, "shutdownforcehelp") == 0) { UI_ShutdownForceHelp(); } - else if (Q_stricmp(name, "forcehelpactive") == 0) + else if (Q_stricmp(name, "forcehelpactive") == 0) { UI_ForceHelpActive(); } - else if (Q_stricmp(name, "demosetforcelevels") == 0) + else if (Q_stricmp(name, "demosetforcelevels") == 0) { UI_DemoSetForceLevels(); } - else if (Q_stricmp(name, "recordforcelevels") == 0) + else if (Q_stricmp(name, "recordforcelevels") == 0) { UI_RecordForceLevels(); } - else if (Q_stricmp(name, "recordweapons") == 0) + else if (Q_stricmp(name, "recordweapons") == 0) { UI_RecordWeapons(); } - else if (Q_stricmp(name, "showforceleveldesc") == 0) + else if (Q_stricmp(name, "showforceleveldesc") == 0) { const char *forceName; String_Parse(args, &forceName); UI_ShowForceLevelDesc(forceName); } - else if (Q_stricmp(name, "resetforcelevels") == 0) + else if (Q_stricmp(name, "resetforcelevels") == 0) { UI_ResetForceLevels(); } - else if (Q_stricmp(name, "weaponhelpactive") == 0) + else if (Q_stricmp(name, "weaponhelpactive") == 0) { UI_WeaponHelpActive(); } // initialize weapon selection screen - else if (Q_stricmp(name, "initweaponselect") == 0) + else if (Q_stricmp(name, "initweaponselect") == 0) { UI_InitWeaponSelect(); } - else if (Q_stricmp(name, "clearweapons") == 0) + else if (Q_stricmp(name, "clearweapons") == 0) { UI_ClearWeapons(); } - else if (Q_stricmp(name, "stopgamesounds") == 0) + else if (Q_stricmp(name, "stopgamesounds") == 0) { trap_S_StopSounds(); } - else if (Q_stricmp(name, "loadmissionselectmenu") == 0) + else if (Q_stricmp(name, "loadmissionselectmenu") == 0) { const char *cvarName; String_Parse(args, &cvarName); @@ -1281,112 +1291,112 @@ static qboolean UI_RunMenuScript ( const char **args ) UI_LoadMissionSelectMenu(cvarName); } } - else if (Q_stricmp(name, "calcforcestatus") == 0) + else if (Q_stricmp(name, "calcforcestatus") == 0) { UI_CalcForceStatus(); } - else if (Q_stricmp(name, "giveweapon") == 0) + else if (Q_stricmp(name, "giveweapon") == 0) { const char *weaponIndex; String_Parse(args, &weaponIndex); UI_GiveWeapon(atoi(weaponIndex)); } - else if (Q_stricmp(name, "equipweapon") == 0) + else if (Q_stricmp(name, "equipweapon") == 0) { const char *weaponIndex; String_Parse(args, &weaponIndex); UI_EquipWeapon(atoi(weaponIndex)); } - else if (Q_stricmp(name, "addweaponselection") == 0) + else if (Q_stricmp(name, "addweaponselection") == 0) { const char *weaponIndex; String_Parse(args, &weaponIndex); if (!weaponIndex) - { + { return qfalse; } const char *ammoIndex; String_Parse(args, &ammoIndex); if (!ammoIndex) - { + { return qfalse; } const char *ammoAmount; String_Parse(args, &ammoAmount); if (!ammoAmount) - { + { return qfalse; } const char *itemName; String_Parse(args, &itemName); if (!itemName) - { + { return qfalse; } const char *litItemName; String_Parse(args, &litItemName); if (!litItemName) - { + { return qfalse; } const char *backgroundName; String_Parse(args, &backgroundName); if (!backgroundName) - { + { return qfalse; } const char *soundfile = NULL; String_Parse(args, &soundfile); - + UI_AddWeaponSelection(atoi(weaponIndex),atoi(ammoIndex),atoi(ammoAmount),itemName,litItemName, backgroundName, soundfile); } - else if (Q_stricmp(name, "addthrowweaponselection") == 0) + else if (Q_stricmp(name, "addthrowweaponselection") == 0) { const char *weaponIndex; String_Parse(args, &weaponIndex); if (!weaponIndex) - { + { return qfalse; } const char *ammoIndex; String_Parse(args, &ammoIndex); if (!ammoIndex) - { + { return qfalse; } const char *ammoAmount; String_Parse(args, &ammoAmount); if (!ammoAmount) - { + { return qfalse; } const char *itemName; String_Parse(args, &itemName); if (!itemName) - { + { return qfalse; } const char *litItemName; String_Parse(args, &litItemName); if (!litItemName) - { + { return qfalse; } const char *backgroundName; String_Parse(args, &backgroundName); if (!backgroundName) - { + { return qfalse; } @@ -1395,7 +1405,7 @@ static qboolean UI_RunMenuScript ( const char **args ) UI_AddThrowWeaponSelection(atoi(weaponIndex),atoi(ammoIndex),atoi(ammoAmount),itemName,litItemName,backgroundName, soundfile); } - else if (Q_stricmp(name, "removeweaponselection") == 0) + else if (Q_stricmp(name, "removeweaponselection") == 0) { const char *weaponIndex; String_Parse(args, &weaponIndex); @@ -1404,45 +1414,45 @@ static qboolean UI_RunMenuScript ( const char **args ) UI_RemoveWeaponSelection(atoi(weaponIndex)); } } - else if (Q_stricmp(name, "removethrowweaponselection") == 0) + else if (Q_stricmp(name, "removethrowweaponselection") == 0) { UI_RemoveThrowWeaponSelection(); } - else if (Q_stricmp(name, "normalthrowselection") == 0) + else if (Q_stricmp(name, "normalthrowselection") == 0) { UI_NormalThrowSelection(); } - else if (Q_stricmp(name, "highlightthrowselection") == 0) + else if (Q_stricmp(name, "highlightthrowselection") == 0) { UI_HighLightThrowSelection(); } - else if (Q_stricmp(name, "normalweaponselection") == 0) + else if (Q_stricmp(name, "normalweaponselection") == 0) { const char *slotIndex; String_Parse(args, &slotIndex); if (!slotIndex) - { + { return qfalse; } UI_NormalWeaponSelection(atoi(slotIndex)); } - else if (Q_stricmp(name, "highlightweaponselection") == 0) + else if (Q_stricmp(name, "highlightweaponselection") == 0) { const char *slotIndex; String_Parse(args, &slotIndex); if (!slotIndex) - { + { return qfalse; } UI_HighLightWeaponSelection(atoi(slotIndex)); } - else if (Q_stricmp(name, "clearinventory") == 0) + else if (Q_stricmp(name, "clearinventory") == 0) { UI_ClearInventory(); } - else if (Q_stricmp(name, "giveinventory") == 0) + else if (Q_stricmp(name, "giveinventory") == 0) { const char *inventoryIndex,*amount; String_Parse(args, &inventoryIndex); @@ -1530,18 +1540,18 @@ static qboolean UI_RunMenuScript ( const char **args ) { UI_UpdateFightingStyle(); } - else if (Q_stricmp(name, "update") == 0) + else if (Q_stricmp(name, "update") == 0) { - if (String_Parse(args, &name2)) + if (String_Parse(args, &name2)) { UI_Update(name2); } - else + else { Com_Printf("update missing cmd\n"); } } - else if (Q_stricmp(name, "load_quick") == 0) + else if (Q_stricmp(name, "load_quick") == 0) { #ifdef JK2_MODE ui.Cmd_ExecuteText(EXEC_APPEND,"load quik\n"); @@ -1549,11 +1559,11 @@ static qboolean UI_RunMenuScript ( const char **args ) ui.Cmd_ExecuteText(EXEC_APPEND,"load quick\n"); #endif } - else if (Q_stricmp(name, "load_auto") == 0) + else if (Q_stricmp(name, "load_auto") == 0) { ui.Cmd_ExecuteText(EXEC_APPEND,"load *respawn\n"); //death menu, might load a saved game instead if they just loaded on this map } - else if (Q_stricmp(name, "decrementforcepowerlevel") == 0) + else if (Q_stricmp(name, "decrementforcepowerlevel") == 0) { UI_DecrementForcePowerLevel(); } @@ -1565,7 +1575,11 @@ static qboolean UI_RunMenuScript ( const char **args ) { UI_ResetCharacterListBoxes(); } - else + else if ( Q_stricmp( name, "LaunchMP" ) == 0 ) + { + // TODO for MAC_PORT, will only be valid for non-JK2 mode + } + else { Com_Printf("unknown UI script %s\n", name); } @@ -1579,7 +1593,7 @@ static qboolean UI_RunMenuScript ( const char **args ) UI_GetValue ================= */ -static float UI_GetValue(int ownerDraw) +static float UI_GetValue(int ownerDraw) { return 0; } @@ -1619,7 +1633,7 @@ static void UI_CalcForceStatus(void) short who, index=FW_VERY_LIGHT; qboolean lukeFlag=qtrue; float percent; - client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player char value[256]; if (!cl) @@ -1635,16 +1649,16 @@ static void UI_CalcForceStatus(void) memset(value, 0, sizeof(value)); - lightSide = pState->forcePowerLevel[FP_HEAL] + + lightSide = pState->forcePowerLevel[FP_HEAL] + pState->forcePowerLevel[FP_TELEPATHY] + pState->forcePowerLevel[FP_PROTECT] + pState->forcePowerLevel[FP_ABSORB]; - - darkSide = pState->forcePowerLevel[FP_GRIP] + + + darkSide = pState->forcePowerLevel[FP_GRIP] + pState->forcePowerLevel[FP_LIGHTNING] + pState->forcePowerLevel[FP_RAGE] + pState->forcePowerLevel[FP_DRAIN]; - + total = lightSide + darkSide; percent = lightSide / total; @@ -1703,7 +1717,7 @@ static void UI_CalcForceStatus(void) strcpy(value,"sdl"); // Semi-Dark Luke } } - else + else { index = FW_VERY_DARK; if ( who<50 ) @@ -1734,40 +1748,40 @@ static void UI_CalcForceStatus(void) UI_StopCinematic ================= */ -static void UI_StopCinematic(int handle) +static void UI_StopCinematic(int handle) { - if (handle >= 0) + if (handle >= 0) { trap_CIN_StopCinematic(handle); - } - else + } + else { handle = abs(handle); - if (handle == UI_MAPCINEMATIC) + if (handle == UI_MAPCINEMATIC) { // FIXME - BOB do we need this? -// if (uiInfo.mapList[ui_currentMap.integer].cinematic >= 0) +// if (uiInfo.mapList[ui_currentMap.integer].cinematic >= 0) // { // trap_CIN_StopCinematic(uiInfo.mapList[ui_currentMap.integer].cinematic); // uiInfo.mapList[ui_currentMap.integer].cinematic = -1; // } - } - else if (handle == UI_NETMAPCINEMATIC) + } + else if (handle == UI_NETMAPCINEMATIC) { // FIXME - BOB do we need this? -// if (uiInfo.serverStatus.currentServerCinematic >= 0) +// if (uiInfo.serverStatus.currentServerCinematic >= 0) // { // trap_CIN_StopCinematic(uiInfo.serverStatus.currentServerCinematic); // uiInfo.serverStatus.currentServerCinematic = -1; // } - } - else if (handle == UI_CLANCINEMATIC) + } + else if (handle == UI_CLANCINEMATIC) { // FIXME - BOB do we need this? // int i = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_teamName")); -// if (i >= 0 && i < uiInfo.teamCount) +// if (i >= 0 && i < uiInfo.teamCount) // { -// if (uiInfo.teamList[i].cinematic >= 0) +// if (uiInfo.teamList[i].cinematic >= 0) // { // trap_CIN_StopCinematic(uiInfo.teamList[i].cinematic); // uiInfo.teamList[i].cinematic = -1; @@ -1781,14 +1795,14 @@ static void UI_HandleLoadSelection() Cvar_Set("ui_SelectionOK", va("%d",(s_savegame.currentLine < s_savegame.saveFileCnt)) ); if (s_savegame.currentLine >= s_savegame.saveFileCnt) return; -// Cvar_Set("ui_gameDesc", s_savedata[s_savegame.currentLine].currentSaveFileComments ); // set comment +#ifdef JK2_MODE + Cvar_Set("ui_gameDesc", s_savedata[s_savegame.currentLine].currentSaveFileComments ); // set comment -/* if (!ui.SG_GetSaveImage(s_savedata[s_savegame.currentLine].currentSaveFileName, &screenShotBuf)) ->>>>>>> 1.30 + if (!ui.SG_GetSaveImage(s_savedata[s_savegame.currentLine].currentSaveFileName, &screenShotBuf)) { - memset( screenShotBuf,0,(SG_SCR_WIDTH * SG_SCR_HEIGHT * 4)); + memset( screenShotBuf,0,(SG_SCR_WIDTH * SG_SCR_HEIGHT * 4)); } -*/ +#endif } /* @@ -1796,20 +1810,22 @@ static void UI_HandleLoadSelection() UI_FeederCount ================= */ -static int UI_FeederCount(float feederID) +static int UI_FeederCount(float feederID) { - if (feederID == FEEDER_SAVEGAMES ) + if (feederID == FEEDER_SAVEGAMES ) { if (s_savegame.saveFileCnt == -1) { ReadSaveDirectory(); //refresh UI_HandleLoadSelection(); +#ifndef JK2_MODE UI_AdjustSaveGameListBox(s_savegame.currentLine); +#endif } return s_savegame.saveFileCnt; - } + } // count number of moves for the current title - else if (feederID == FEEDER_MOVES) + else if (feederID == FEEDER_MOVES) { int count=0,i; @@ -1823,34 +1839,34 @@ static int UI_FeederCount(float feederID) return count; } - else if (feederID == FEEDER_MOVES_TITLES) + else if (feederID == FEEDER_MOVES_TITLES) { return (MD_MOVE_TITLE_MAX); } - else if (feederID == FEEDER_MODS) + else if (feederID == FEEDER_MODS) { return uiInfo.modCount; - } - else if (feederID == FEEDER_LANGUAGES) + } + else if (feederID == FEEDER_LANGUAGES) { return uiInfo.languageCount; - } - else if (feederID == FEEDER_PLAYER_SPECIES) + } + else if (feederID == FEEDER_PLAYER_SPECIES) { return uiInfo.playerSpeciesCount; - } - else if (feederID == FEEDER_PLAYER_SKIN_HEAD) + } + else if (feederID == FEEDER_PLAYER_SKIN_HEAD) { return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadCount; - } - else if (feederID == FEEDER_PLAYER_SKIN_TORSO) + } + else if (feederID == FEEDER_PLAYER_SKIN_TORSO) { return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoCount; - } - else if (feederID == FEEDER_PLAYER_SKIN_LEGS) + } + else if (feederID == FEEDER_PLAYER_SKIN_LEGS) { return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegCount; - } + } else if (feederID == FEEDER_COLORCHOICES) { return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorCount; @@ -1864,14 +1880,14 @@ static int UI_FeederCount(float feederID) UI_FeederSelection ================= */ -static void UI_FeederSelection(float feederID, int index, itemDef_t *item) +static void UI_FeederSelection(float feederID, int index, itemDef_t *item) { - if (feederID == FEEDER_SAVEGAMES) + if (feederID == FEEDER_SAVEGAMES) { s_savegame.currentLine = index; UI_HandleLoadSelection(); - } - else if (feederID == FEEDER_MOVES) + } + else if (feederID == FEEDER_MOVES) { itemDef_t *item; menuDef_t *menu; @@ -1939,11 +1955,11 @@ static void UI_FeederSelection(float feederID, int index, itemDef_t *item) Cvar_Set( "ui_move_desc", datapadMoveData[uiInfo.movesTitleIndex][index].desc); } - Com_sprintf( skin, sizeof( skin ), "models/players/%s/|%s|%s|%s", - Cvar_VariableString ( "g_char_model"), - Cvar_VariableString ( "g_char_skin_head"), - Cvar_VariableString ( "g_char_skin_torso"), - Cvar_VariableString ( "g_char_skin_legs") + Com_sprintf( skin, sizeof( skin ), "models/players/%s/|%s|%s|%s", + Cvar_VariableString ( "g_char_model"), + Cvar_VariableString ( "g_char_skin_head"), + Cvar_VariableString ( "g_char_skin_torso"), + Cvar_VariableString ( "g_char_skin_legs") ); ItemParse_model_g2skin_go( item, skin ); @@ -1952,8 +1968,8 @@ static void UI_FeederSelection(float feederID, int index, itemDef_t *item) } } } - } - else if (feederID == FEEDER_MOVES_TITLES) + } + else if (feederID == FEEDER_MOVES_TITLES) { itemDef_t *item; menuDef_t *menu; @@ -1977,57 +1993,60 @@ static void UI_FeederSelection(float feederID, int index, itemDef_t *item) } } } - else if (feederID == FEEDER_MODS) + else if (feederID == FEEDER_MODS) { uiInfo.modIndex = index; - } - else if (feederID == FEEDER_PLAYER_SPECIES) + } + else if (feederID == FEEDER_PLAYER_SPECIES) { - uiInfo.playerSpeciesIndex = index; - } - else if (feederID == FEEDER_LANGUAGES) + if (index >= 0 && index < uiInfo.playerSpeciesCount) + { + uiInfo.playerSpeciesIndex = index; + } + } + else if (feederID == FEEDER_LANGUAGES) { uiInfo.languageCountIndex = index; - } - else if (feederID == FEEDER_PLAYER_SKIN_HEAD) + } + else if (feederID == FEEDER_PLAYER_SKIN_HEAD) { if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadCount) { - Cvar_Set("ui_char_skin_head", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadNames[index]); + Cvar_Set("ui_char_skin_head", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHead[index].name); } - } - else if (feederID == FEEDER_PLAYER_SKIN_TORSO) + } + else if (feederID == FEEDER_PLAYER_SKIN_TORSO) { if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoCount) { - Cvar_Set("ui_char_skin_torso", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoNames[index]); + Cvar_Set("ui_char_skin_torso", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorso[index].name); } - } - else if (feederID == FEEDER_PLAYER_SKIN_LEGS) + } + else if (feederID == FEEDER_PLAYER_SKIN_LEGS) { if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegCount) { - Cvar_Set("ui_char_skin_legs", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegNames[index]); + Cvar_Set("ui_char_skin_legs", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLeg[index].name); } - } + } else if (feederID == FEEDER_COLORCHOICES) { extern void Item_RunScript(itemDef_t *item, const char *s); //from ui_shared; if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorCount) { - Item_RunScript(item, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorActionText[index]); + Item_RunScript(item, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color[index].actionText); } } -/* else if (feederID == FEEDER_CINEMATICS) +/* else if (feederID == FEEDER_CINEMATICS) { uiInfo.movieIndex = index; - if (uiInfo.previewMovie >= 0) + if (uiInfo.previewMovie >= 0) { trap_CIN_StopCinematic(uiInfo.previewMovie); } uiInfo.previewMovie = -1; - } - else if (feederID == FEEDER_DEMOS) + } + else if (feederID == FEEDER_DEMOS) { uiInfo.demoIndex = index; } @@ -2037,11 +2056,11 @@ extern void Item_RunScript(itemDef_t *item, const char *s); //from ui_shared; void Key_KeynumToStringBuf( int keynum, char *buf, int buflen ); void Key_GetBindingBuf( int keynum, char *buf, int buflen ); -static qboolean UI_Crosshair_HandleKey(int flags, float *special, int key) +static qboolean UI_Crosshair_HandleKey(int flags, float *special, int key) { - if (key == A_MOUSE1 || key == A_MOUSE2 || key == A_ENTER || key == A_KP_ENTER) + if (key == A_MOUSE1 || key == A_MOUSE2 || key == A_ENTER || key == A_KP_ENTER) { - if (key == A_MOUSE2) + if (key == A_MOUSE2) { uiInfo.currentCrosshair--; } else { @@ -2053,17 +2072,17 @@ static qboolean UI_Crosshair_HandleKey(int flags, float *special, int key) } else if (uiInfo.currentCrosshair < 0) { uiInfo.currentCrosshair = NUM_CROSSHAIRS - 1; } - Cvar_Set("cg_drawCrosshair", va("%d", uiInfo.currentCrosshair)); + Cvar_Set("cg_drawCrosshair", va("%d", uiInfo.currentCrosshair)); return qtrue; } return qfalse; } -static qboolean UI_OwnerDrawHandleKey(int ownerDraw, int flags, float *special, int key) +static qboolean UI_OwnerDrawHandleKey(int ownerDraw, int flags, float *special, int key) { - switch (ownerDraw) + switch (ownerDraw) { case UI_CROSSHAIR: UI_Crosshair_HandleKey(flags, special, key); @@ -2088,7 +2107,7 @@ static animFileSet_t ui_knownAnimFileSets[MAX_ANIM_FILES]; int ui_numKnownAnimFileSets; -qboolean UI_ParseAnimationFile( const char *af_filename ) +qboolean UI_ParseAnimationFile( const char *af_filename ) { const char *text_p; int len; @@ -2100,11 +2119,11 @@ qboolean UI_ParseAnimationFile( const char *af_filename ) animation_t *animations = ui_knownAnimFileSets[ui_numKnownAnimFileSets].animations; len = re.GetAnimationCFG(af_filename, text, sizeof(text)); - if ( len <= 0 ) + if ( len <= 0 ) { return qfalse; } - if ( len >= (int)(sizeof( text ) - 1) ) + if ( len >= (int)(sizeof( text ) - 1) ) { Com_Error( ERR_FATAL, "UI_ParseAnimationFile: File %s too long\n (%d > %d)", af_filename, len, sizeof( text ) - 1); return qfalse; @@ -2127,11 +2146,11 @@ qboolean UI_ParseAnimationFile( const char *af_filename ) // read information for each frame COM_BeginParseSession(); - while(1) + while(1) { token = COM_Parse( &text_p ); - if ( !token || !token[0]) + if ( !token || !token[0]) { break; } @@ -2154,33 +2173,33 @@ qboolean UI_ParseAnimationFile( const char *af_filename ) } token = COM_Parse( &text_p ); - if ( !token ) + if ( !token ) { break; } animations[animNum].firstFrame = atoi( token ); token = COM_Parse( &text_p ); - if ( !token ) + if ( !token ) { break; } animations[animNum].numFrames = atoi( token ); token = COM_Parse( &text_p ); - if ( !token ) + if ( !token ) { break; } animations[animNum].loopFrames = atoi( token ); token = COM_Parse( &text_p ); - if ( !token ) + if ( !token ) { break; } fps = atof( token ); - if ( fps == 0 ) + if ( fps == 0 ) { fps = 1;//Don't allow divide by zero error } @@ -2209,7 +2228,7 @@ qboolean UI_ParseAnimFileSet( const char *animCFG, int *animFileIndex ) Q_strncpyz( strippedName, animCFG, sizeof(strippedName), qtrue); slash = strrchr( strippedName, '/' ); - if ( slash ) + if ( slash ) { // truncate modelName to find just the dir not the extension *slash = 0; @@ -2285,7 +2304,7 @@ int UI_G2SetAnim(CGhoul2Info *ghlInfo, const char *boneName, int animNum, const { if (anim->loopFrames == -1) { - flags = BONE_ANIM_OVERRIDE_FREEZE; + flags = BONE_ANIM_OVERRIDE_FREEZE; } else { @@ -2316,7 +2335,9 @@ static qboolean UI_ParseColorData(char* buf, playerSpeciesInfo_t &species) p = buf; COM_BeginParseSession(); species.ColorCount = 0; - + species.ColorMax = 16; + species.Color = (playerColor_t *)malloc(species.ColorMax * sizeof(playerColor_t)); + while ( p ) { token = COM_ParseExt( &p, qtrue ); //looking for the shader @@ -2325,7 +2346,16 @@ static qboolean UI_ParseColorData(char* buf, playerSpeciesInfo_t &species) COM_EndParseSession( ); return species.ColorCount; } - Q_strncpyz( species.ColorShader[species.ColorCount], token, sizeof(species.ColorShader[0]), qtrue ); + + if (species.ColorCount >= species.ColorMax) + { + species.ColorMax *= 2; + species.Color = (playerColor_t *)realloc(species.Color, species.ColorMax * sizeof(playerColor_t)); + } + + memset(&species.Color[species.ColorCount], 0, sizeof(playerColor_t)); + + Q_strncpyz( species.Color[species.ColorCount].shader, token, MAX_QPATH, qtrue ); token = COM_ParseExt( &p, qtrue ); //looking for action block { if ( token[0] != '{' ) @@ -2334,7 +2364,6 @@ static qboolean UI_ParseColorData(char* buf, playerSpeciesInfo_t &species) return qfalse; } - assert(!species.ColorActionText[species.ColorCount][0]); token = COM_ParseExt( &p, qtrue ); //looking for action commands while (token[0] != '}') { @@ -2343,9 +2372,8 @@ static qboolean UI_ParseColorData(char* buf, playerSpeciesInfo_t &species) COM_EndParseSession( ); return qfalse; } - assert((size_t)species.ColorCount < sizeof(species.ColorActionText)/sizeof(species.ColorActionText[0]) ); - Q_strcat(species.ColorActionText[species.ColorCount], sizeof(species.ColorActionText[0]), token); - Q_strcat(species.ColorActionText[species.ColorCount], sizeof(species.ColorActionText[0]), " "); + Q_strcat(species.Color[species.ColorCount].actionText, ACTION_BUFFER_SIZE, token); + Q_strcat(species.Color[species.ColorCount].actionText, ACTION_BUFFER_SIZE, " "); token = COM_ParseExt( &p, qtrue ); //looking for action commands or final } } species.ColorCount++; //next color please @@ -2378,7 +2406,7 @@ static bool bIsImageFile(const char* dirptr, const char* skinname, qboolean buil Com_sprintf(fpath, MAX_QPATH, "models/players/%s/icon_%s.tga", dirptr, skinname); ui.FS_FOpenFile(fpath, &f, FS_READ); } - if (f) + if (f) { ui.FS_FCloseFile(f); if ( building ) ui.R_RegisterShaderNoMip(fpath); @@ -2388,6 +2416,26 @@ static bool bIsImageFile(const char* dirptr, const char* skinname, qboolean buil return false; } +static void UI_FreeSpecies( playerSpeciesInfo_t *species ) +{ + free(species->SkinHead); + free(species->SkinTorso); + free(species->SkinLeg); + free(species->Color); + memset(species, 0, sizeof(playerSpeciesInfo_t)); +} + +void UI_FreeAllSpecies( void ) +{ + int i; + + for (i = 0; i < uiInfo.playerSpeciesCount; i++) + { + UI_FreeSpecies(&uiInfo.playerSpecies[i]); + } + free(uiInfo.playerSpecies); +} + /* ================= PlayerModel_BuildList @@ -2401,11 +2449,12 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) int dirlen; int i; const int building = Cvar_VariableIntegerValue("com_buildscript"); - + uiInfo.playerSpeciesCount = 0; uiInfo.playerSpeciesIndex = 0; - memset(uiInfo.playerSpecies, 0, sizeof (uiInfo.playerSpecies) ); - + uiInfo.playerSpeciesMax = 8; + uiInfo.playerSpecies = (playerSpeciesInfo_t *)malloc(uiInfo.playerSpeciesMax * sizeof(playerSpeciesInfo_t)); + // iterate directory of all player models numdirs = ui.FS_GetFileList("models/players", "/", dirlist, 2048 ); dirptr = dirlist; @@ -2418,29 +2467,45 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) char fpath[2048]; dirlen = strlen(dirptr); - + if (dirlen && dirptr[dirlen-1]=='/') dirptr[dirlen-1]='\0'; if (!strcmp(dirptr,".") || !strcmp(dirptr,"..")) continue; - + Com_sprintf(fpath, 2048, "models/players/%s/PlayerChoice.txt", dirptr); filelen = ui.FS_FOpenFile(fpath, &f, FS_READ); if (f) - { + { char buffer[2048]; + playerSpeciesInfo_t *species; ui.FS_Read(&buffer, filelen, f); ui.FS_FCloseFile(f); buffer[filelen] = 0; //ensure trailing NULL - + //record this species - Q_strncpyz( uiInfo.playerSpecies[uiInfo.playerSpeciesCount].Name, dirptr, sizeof(uiInfo.playerSpecies[0].Name), qtrue ); + if (uiInfo.playerSpeciesCount >= uiInfo.playerSpeciesMax) + { + uiInfo.playerSpeciesMax *= 2; + uiInfo.playerSpecies = (playerSpeciesInfo_t *)realloc(uiInfo.playerSpecies, uiInfo.playerSpeciesMax*sizeof(playerSpeciesInfo_t)); + } + species = &uiInfo.playerSpecies[uiInfo.playerSpeciesCount]; + memset(species, 0, sizeof(playerSpeciesInfo_t)); + Q_strncpyz( species->Name, dirptr, MAX_QPATH, qtrue ); - if (!UI_ParseColorData(buffer,uiInfo.playerSpecies[uiInfo.playerSpeciesCount])) + if (!UI_ParseColorData(buffer,*species)) { ui.Printf( "UI_BuildPlayerModel_List: Errors parsing '%s'\n", fpath ); } + + species->SkinHeadMax = 8; + species->SkinTorsoMax = 8; + species->SkinLegMax = 8; + + species->SkinHead = (skinName_t *)malloc(species->SkinHeadMax * sizeof(skinName_t)); + species->SkinTorso = (skinName_t *)malloc(species->SkinTorsoMax * sizeof(skinName_t)); + species->SkinLeg = (skinName_t *)malloc(species->SkinLegMax * sizeof(skinName_t)); int j; char skinname[64]; @@ -2468,34 +2533,40 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) { //if it exists if (Q_stricmpn(skinname,"head_",5) == 0) { - if (uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinHeadCount < MAX_PLAYERMODELS) + if (species->SkinHeadCount >= species->SkinHeadMax) { - Q_strncpyz(uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinHeadNames[uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinHeadCount++], skinname, sizeof(uiInfo.playerSpecies[0].SkinHeadNames[0]), qtrue); - iSkinParts |= 1<<0; + species->SkinHeadMax *= 2; + species->SkinHead = (skinName_t *)realloc(species->SkinHead, species->SkinHeadMax*sizeof(skinName_t)); } + Q_strncpyz(species->SkinHead[species->SkinHeadCount++].name, skinname, SKIN_LENGTH, qtrue); + iSkinParts |= 1<<0; } else if (Q_stricmpn(skinname,"torso_",6) == 0) { - if (uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinTorsoCount < MAX_PLAYERMODELS) + if (species->SkinTorsoCount >= species->SkinTorsoMax) { - Q_strncpyz(uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinTorsoNames[uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinTorsoCount++], skinname, sizeof(uiInfo.playerSpecies[0].SkinTorsoNames[0]), qtrue); - iSkinParts |= 1<<1; + species->SkinTorsoMax *= 2; + species->SkinTorso = (skinName_t *)realloc(species->SkinTorso, species->SkinTorsoMax*sizeof(skinName_t)); } + Q_strncpyz(species->SkinTorso[species->SkinTorsoCount++].name, skinname, SKIN_LENGTH, qtrue); + iSkinParts |= 1<<1; } else if (Q_stricmpn(skinname,"lower_",6) == 0) { - if (uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinLegCount < MAX_PLAYERMODELS) + if (species->SkinLegCount >= species->SkinLegMax) { - Q_strncpyz(uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinLegNames[uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinLegCount++], skinname, sizeof(uiInfo.playerSpecies[0].SkinLegNames[0]), qtrue); - iSkinParts |= 1<<2; + species->SkinLegMax *= 2; + species->SkinLeg = (skinName_t *)realloc(species->SkinLeg, species->SkinLegMax*sizeof(skinName_t)); } + Q_strncpyz(species->SkinLeg[species->SkinLegCount++].name, skinname, SKIN_LENGTH, qtrue); + iSkinParts |= 1<<2; } - + } } if (iSkinParts != 7) { //didn't get a skin for each, then skip this model. - memset(&uiInfo.playerSpecies[uiInfo.playerSpeciesCount], 0, sizeof(uiInfo.playerSpecies[uiInfo.playerSpeciesCount]));//undo the colors + UI_FreeSpecies(species); continue; } uiInfo.playerSpeciesCount++; @@ -2509,21 +2580,27 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) DC->g2_RemoveGhoul2Model( ghoul2, 0 ); } } - if (uiInfo.playerSpeciesCount >= MAX_PLAYERMODELS) - { - return; - } } - } + } } +/* +================ +UI_Shutdown +================= +*/ +void UI_Shutdown( void ) +{ + UI_FreeAllSpecies(); +} + /* ================= UI_Init ================= */ -void _UI_Init( qboolean inGameLoad ) +void _UI_Init( qboolean inGameLoad ) { // Get the list of possible languages #ifndef JK2_MODE @@ -2550,12 +2627,12 @@ void _UI_Init( qboolean inGameLoad ) // for 640x480 virtualized screen uiInfo.uiDC.yscale = uiInfo.uiDC.glconfig.vidHeight * (1.0/480.0); uiInfo.uiDC.xscale = uiInfo.uiDC.glconfig.vidWidth * (1.0/640.0); - if ( uiInfo.uiDC.glconfig.vidWidth * 480 > uiInfo.uiDC.glconfig.vidHeight * 640 ) + if ( uiInfo.uiDC.glconfig.vidWidth * 480 > uiInfo.uiDC.glconfig.vidHeight * 640 ) { // wide screen uiInfo.uiDC.bias = 0.5 * ( uiInfo.uiDC.glconfig.vidWidth - ( uiInfo.uiDC.glconfig.vidHeight * (640.0/480.0) ) ); } - else + else { // no wide screen uiInfo.uiDC.bias = 0; @@ -2583,7 +2660,7 @@ void _UI_Init( qboolean inGameLoad ) uiInfo.uiDC.ownerDrawVisible = &UI_OwnerDrawVisible; uiInfo.uiDC.ownerDrawWidth = &UI_OwnerDrawWidth; uiInfo.uiDC.ownerDrawItem = &UI_OwnerDraw; - uiInfo.uiDC.Print = &Com_Printf; + uiInfo.uiDC.Print = &Com_Printf; uiInfo.uiDC.registerSound = &trap_S_RegisterSound; uiInfo.uiDC.registerModel = ui.R_RegisterModel; uiInfo.uiDC.clearScene = &trap_R_ClearScene; @@ -2622,7 +2699,7 @@ void _UI_Init( qboolean inGameLoad ) const char *menuSet = UI_Cvar_VariableString("ui_menuFiles"); - if (menuSet == NULL || menuSet[0] == '\0') + if (menuSet == NULL || menuSet[0] == '\0') { menuSet = "ui/menus.txt"; } @@ -2645,7 +2722,7 @@ void _UI_Init( qboolean inGameLoad ) AssetCache(); uis.debugMode = qfalse; - + // sets defaults for ui temp cvars uiInfo.effectsColor = (int)trap_Cvar_VariableValue("color")-1; if (uiInfo.effectsColor < 0) @@ -2679,12 +2756,12 @@ void _UI_Init( qboolean inGameLoad ) UI_RegisterCvars ================= */ -static void UI_RegisterCvars( void ) +static void UI_RegisterCvars( void ) { int i; cvarTable_t *cv; - for ( i = 0, cv = cvarTable ; i < cvarTableSize ; i++, cv++ ) + for ( i = 0, cv = cvarTable ; i < cvarTableSize ; i++, cv++ ) { Cvar_Register( cv->vmCvar, cv->cvarName, cv->defaultString, cv->cvarFlags ); } @@ -2695,7 +2772,7 @@ static void UI_RegisterCvars( void ) UI_ParseMenu ================= */ -void UI_ParseMenu(const char *menuFile) +void UI_ParseMenu(const char *menuFile) { char *buffer,*holdBuffer,*token2; int len; @@ -2706,13 +2783,13 @@ void UI_ParseMenu(const char *menuFile) holdBuffer = buffer; - if (len<=0) + if (len<=0) { Com_Printf("UI_ParseMenu: Unable to load menu %s\n", menuFile); return; } - while ( 1 ) + while ( 1 ) { token2 = PC_ParseExt(); @@ -2722,43 +2799,43 @@ void UI_ParseMenu(const char *menuFile) break; } /* - if ( menuCount == MAX_MENUS ) + if ( menuCount == MAX_MENUS ) { - PC_ParseWarning("Too many menus!"); + PC_ParseWarning("Too many menus!"); break; } */ - if ( *token2 == '{') + if ( *token2 == '{') { continue; } - else if ( *token2 == '}' ) + else if ( *token2 == '}' ) { break; } - else if (Q_stricmp(token2, "assetGlobalDef") == 0) + else if (Q_stricmp(token2, "assetGlobalDef") == 0) { - if (Asset_Parse(&holdBuffer)) + if (Asset_Parse(&holdBuffer)) { continue; - } - else + } + else { break; } } - else if (Q_stricmp(token2, "menudef") == 0) + else if (Q_stricmp(token2, "menudef") == 0) { // start a new menu Menu_New(holdBuffer); continue; } - PC_ParseWarning(va("Invalid keyword '%s'",token2)); + PC_ParseWarning(va("Invalid keyword '%s'",token2)); } PC_EndParseSession(buffer); - + } /* @@ -2767,10 +2844,10 @@ Load_Menu Load current menu file ================= */ -qboolean Load_Menu(const char **holdBuffer) +qboolean Load_Menu(const char **holdBuffer) { const char *token2; - + token2 = COM_ParseExt( holdBuffer, qtrue ); if (!token2[0]) @@ -2778,12 +2855,12 @@ qboolean Load_Menu(const char **holdBuffer) return qfalse; } - if (*token2 != '{') + if (*token2 != '{') { return qfalse; } - while ( 1 ) + while ( 1 ) { token2 = COM_ParseExt( holdBuffer, qtrue ); @@ -2791,8 +2868,8 @@ qboolean Load_Menu(const char **holdBuffer) { return qfalse; } - - if ( *token2 == '}' ) + + if ( *token2 == '}' ) { return qtrue; } @@ -2801,7 +2878,7 @@ qboolean Load_Menu(const char **holdBuffer) // extern void UI_Debug_AddMenuFilePath(const char *); // UI_Debug_AddMenuFilePath(token2); //#endif - UI_ParseMenu(token2); + UI_ParseMenu(token2); } return qfalse; @@ -2813,7 +2890,7 @@ UI_LoadMenus Load all menus based on the files listed in the data file in menuFile (default "ui/menus.txt") ================= */ -void UI_LoadMenus(const char *menuFile, qboolean reset) +void UI_LoadMenus(const char *menuFile, qboolean reset) { // pc_token_t token; // int handle; @@ -2827,19 +2904,19 @@ void UI_LoadMenus(const char *menuFile, qboolean reset) len = ui.FS_ReadFile(menuFile,(void **) &buffer); - if (len<1) + if (len<1) { Com_Printf( va( S_COLOR_YELLOW "menu file not found: %s, using default\n", menuFile ) ); len = ui.FS_ReadFile("ui/menus.txt",(void **) &buffer); - if (len<1) + if (len<1) { Com_Error( ERR_FATAL, "%s", va("default menu file not found: ui/menus.txt, unable to continue!\n", menuFile )); return; } } - if (reset) + if (reset) { Menu_Reset(); } @@ -2847,7 +2924,7 @@ void UI_LoadMenus(const char *menuFile, qboolean reset) const char *token2; holdBuffer = buffer; COM_BeginParseSession(); - while ( 1 ) + while ( 1 ) { token2 = COM_ParseExt( &holdBuffer, qtrue ); if (!*token2) @@ -2855,30 +2932,30 @@ void UI_LoadMenus(const char *menuFile, qboolean reset) break; } - if( *token2 == 0 || *token2 == '}') // End of the menus file + if( *token2 == 0 || *token2 == '}') // End of the menus file { break; } - if (*token2 == '{') + if (*token2 == '{') { continue; } - else if (Q_stricmp(token2, "loadmenu") == 0) + else if (Q_stricmp(token2, "loadmenu") == 0) { - if (Load_Menu(&holdBuffer)) + if (Load_Menu(&holdBuffer)) { continue; - } - else + } + else { break; } - } + } else { Com_Printf("Unknown keyword '%s' in menus file %s\n", token2, menuFile); - } + } } COM_EndParseSession(); @@ -2892,13 +2969,13 @@ void UI_LoadMenus(const char *menuFile, qboolean reset) UI_Load ================= */ -void UI_Load(void) +void UI_Load(void) { const char *menuSet; char lastName[1024]; menuDef_t *menu = Menu_GetFocused(); - if (menu && menu->window.name) + if (menu && menu->window.name) { strcpy(lastName, menu->window.name); } @@ -2917,7 +2994,7 @@ void UI_Load(void) { menuSet= UI_Cvar_VariableString("ui_menuFiles"); } - if (menuSet == NULL || menuSet[0] == '\0') + if (menuSet == NULL || menuSet[0] == '\0') { menuSet = "ui/menus.txt"; } @@ -2934,7 +3011,7 @@ void UI_Load(void) Asset_Parse ================= */ -qboolean Asset_Parse(char **buffer) +qboolean Asset_Parse(char **buffer) { char *token; const char *tempStr; @@ -2947,12 +3024,12 @@ qboolean Asset_Parse(char **buffer) return qfalse; } - if (*token != '{') + if (*token != '{') { return qfalse; } - - while ( 1 ) + + while ( 1 ) { token = PC_ParseExt(); @@ -2961,7 +3038,7 @@ qboolean Asset_Parse(char **buffer) return qfalse; } - if (*token == '}') + if (*token == '}') { return qtrue; } @@ -2986,7 +3063,7 @@ qboolean Asset_Parse(char **buffer) continue; } - if (Q_stricmp(token, "mediumFont") == 0) + if (Q_stricmp(token, "mediumFont") == 0) { if (PC_ParseString(&tempStr)) { @@ -3024,7 +3101,7 @@ qboolean Asset_Parse(char **buffer) } #ifdef JK2_MODE - if (Q_stricmp(token, "stripedFile") == 0) + if (Q_stricmp(token, "stripedFile") == 0) { if (!PC_ParseStringMem((const char **) &tempStr)) { @@ -3050,7 +3127,7 @@ qboolean Asset_Parse(char **buffer) #endif // gradientbar - if (Q_stricmp(token, "gradientbar") == 0) + if (Q_stricmp(token, "gradientbar") == 0) { if (PC_ParseString(&tempStr)) { @@ -3062,7 +3139,7 @@ qboolean Asset_Parse(char **buffer) } // enterMenuSound - if (Q_stricmp(token, "menuEnterSound") == 0) + if (Q_stricmp(token, "menuEnterSound") == 0) { if (PC_ParseString(&tempStr)) { @@ -3075,7 +3152,7 @@ qboolean Asset_Parse(char **buffer) } // exitMenuSound - if (Q_stricmp(token, "menuExitSound") == 0) + if (Q_stricmp(token, "menuExitSound") == 0) { if (PC_ParseString(&tempStr)) { @@ -3087,7 +3164,7 @@ qboolean Asset_Parse(char **buffer) } // itemFocusSound - if (Q_stricmp(token, "itemFocusSound") == 0) + if (Q_stricmp(token, "itemFocusSound") == 0) { if (PC_ParseString(&tempStr)) { @@ -3099,7 +3176,7 @@ qboolean Asset_Parse(char **buffer) } // menuBuzzSound - if (Q_stricmp(token, "menuBuzzSound") == 0) + if (Q_stricmp(token, "menuBuzzSound") == 0) { if (PC_ParseString(&tempStr)) { @@ -3111,7 +3188,7 @@ qboolean Asset_Parse(char **buffer) } // Chose a force power from the ingame force allocation screen (the one where you get to allocate a force power point) - if (Q_stricmp(token, "forceChosenSound") == 0) + if (Q_stricmp(token, "forceChosenSound") == 0) { if (PC_ParseString(&tempStr)) { @@ -3125,7 +3202,7 @@ qboolean Asset_Parse(char **buffer) // Unchose a force power from the ingame force allocation screen (the one where you get to allocate a force power point) - if (Q_stricmp(token, "forceUnchosenSound") == 0) + if (Q_stricmp(token, "forceUnchosenSound") == 0) { if (PC_ParseString(&tempStr)) { @@ -3137,7 +3214,7 @@ qboolean Asset_Parse(char **buffer) continue; } - if (Q_stricmp(token, "datapadmoveRollSound") == 0) + if (Q_stricmp(token, "datapadmoveRollSound") == 0) { if (PC_ParseString(&tempStr)) { @@ -3149,7 +3226,7 @@ qboolean Asset_Parse(char **buffer) continue; } - if (Q_stricmp(token, "datapadmoveJumpSound") == 0) + if (Q_stricmp(token, "datapadmoveJumpSound") == 0) { if (PC_ParseString(&tempStr)) { @@ -3161,7 +3238,7 @@ qboolean Asset_Parse(char **buffer) continue; } - if (Q_stricmp(token, "datapadmoveSaberSound1") == 0) + if (Q_stricmp(token, "datapadmoveSaberSound1") == 0) { if (PC_ParseString(&tempStr)) { @@ -3173,7 +3250,7 @@ qboolean Asset_Parse(char **buffer) continue; } - if (Q_stricmp(token, "datapadmoveSaberSound2") == 0) + if (Q_stricmp(token, "datapadmoveSaberSound2") == 0) { if (PC_ParseString(&tempStr)) { @@ -3185,7 +3262,7 @@ qboolean Asset_Parse(char **buffer) continue; } - if (Q_stricmp(token, "datapadmoveSaberSound3") == 0) + if (Q_stricmp(token, "datapadmoveSaberSound3") == 0) { if (PC_ParseString(&tempStr)) { @@ -3197,7 +3274,7 @@ qboolean Asset_Parse(char **buffer) continue; } - if (Q_stricmp(token, "datapadmoveSaberSound4") == 0) + if (Q_stricmp(token, "datapadmoveSaberSound4") == 0) { if (PC_ParseString(&tempStr)) { @@ -3209,7 +3286,7 @@ qboolean Asset_Parse(char **buffer) continue; } - if (Q_stricmp(token, "datapadmoveSaberSound5") == 0) + if (Q_stricmp(token, "datapadmoveSaberSound5") == 0) { if (PC_ParseString(&tempStr)) { @@ -3221,7 +3298,7 @@ qboolean Asset_Parse(char **buffer) continue; } - if (Q_stricmp(token, "datapadmoveSaberSound6") == 0) + if (Q_stricmp(token, "datapadmoveSaberSound6") == 0) { if (PC_ParseString(&tempStr)) { @@ -3233,7 +3310,7 @@ qboolean Asset_Parse(char **buffer) continue; } - if (Q_stricmp(token, "cursor") == 0) + if (Q_stricmp(token, "cursor") == 0) { if (PC_ParseString(&tempStr)) { @@ -3244,7 +3321,7 @@ qboolean Asset_Parse(char **buffer) continue; } - if (Q_stricmp(token, "fadeClamp") == 0) + if (Q_stricmp(token, "fadeClamp") == 0) { if (PC_ParseFloat(&uiInfo.uiDC.Assets.fadeClamp)) { @@ -3254,9 +3331,9 @@ qboolean Asset_Parse(char **buffer) continue; } - if (Q_stricmp(token, "fadeCycle") == 0) + if (Q_stricmp(token, "fadeCycle") == 0) { - if (PC_ParseInt(&uiInfo.uiDC.Assets.fadeCycle)) + if (PC_ParseInt(&uiInfo.uiDC.Assets.fadeCycle)) { PC_ParseWarning("Bad 1st parameter for keyword 'fadeCycle'"); return qfalse; @@ -3264,9 +3341,9 @@ qboolean Asset_Parse(char **buffer) continue; } - if (Q_stricmp(token, "fadeAmount") == 0) + if (Q_stricmp(token, "fadeAmount") == 0) { - if (PC_ParseFloat(&uiInfo.uiDC.Assets.fadeAmount)) + if (PC_ParseFloat(&uiInfo.uiDC.Assets.fadeAmount)) { PC_ParseWarning("Bad 1st parameter for keyword 'fadeAmount'"); return qfalse; @@ -3274,9 +3351,9 @@ qboolean Asset_Parse(char **buffer) continue; } - if (Q_stricmp(token, "shadowX") == 0) + if (Q_stricmp(token, "shadowX") == 0) { - if (PC_ParseFloat(&uiInfo.uiDC.Assets.shadowX)) + if (PC_ParseFloat(&uiInfo.uiDC.Assets.shadowX)) { PC_ParseWarning("Bad 1st parameter for keyword 'shadowX'"); return qfalse; @@ -3284,9 +3361,9 @@ qboolean Asset_Parse(char **buffer) continue; } - if (Q_stricmp(token, "shadowY") == 0) + if (Q_stricmp(token, "shadowY") == 0) { - if (PC_ParseFloat(&uiInfo.uiDC.Assets.shadowY)) + if (PC_ParseFloat(&uiInfo.uiDC.Assets.shadowY)) { PC_ParseWarning("Bad 1st parameter for keyword 'shadowY'"); return qfalse; @@ -3294,9 +3371,9 @@ qboolean Asset_Parse(char **buffer) continue; } - if (Q_stricmp(token, "shadowColor") == 0) + if (Q_stricmp(token, "shadowColor") == 0) { - if (PC_ParseColor(&uiInfo.uiDC.Assets.shadowColor)) + if (PC_ParseColor(&uiInfo.uiDC.Assets.shadowColor)) { PC_ParseWarning("Bad 1st parameter for keyword 'shadowColor'"); return qfalse; @@ -3308,12 +3385,12 @@ qboolean Asset_Parse(char **buffer) // precaching various sound files used in the menus if (Q_stricmp(token, "precacheSound") == 0) { - if (PC_Script_Parse(&tempStr)) + if (PC_Script_Parse(&tempStr)) { char *soundFile; do { - soundFile = COM_ParseExt(&tempStr, qfalse); + soundFile = COM_ParseExt(&tempStr, qfalse); if (soundFile[0] != 0 && soundFile[0] != ';') { if (!trap_S_RegisterSound( soundFile, qfalse )) { @@ -3335,28 +3412,28 @@ qboolean Asset_Parse(char **buffer) UI_Update ================= */ -static void UI_Update(const char *name) +static void UI_Update(const char *name) { int val = trap_Cvar_VariableValue(name); - if (Q_stricmp(name, "s_khz") == 0) + if (Q_stricmp(name, "s_khz") == 0) { ui.Cmd_ExecuteText( EXEC_APPEND, "snd_restart\n" ); return; } - if (Q_stricmp(name, "ui_SetName") == 0) + if (Q_stricmp(name, "ui_SetName") == 0) { Cvar_Set( "name", UI_Cvar_VariableString("ui_Name")); - } - else if (Q_stricmp(name, "ui_GetName") == 0) + } + else if (Q_stricmp(name, "ui_GetName") == 0) { Cvar_Set( "ui_Name", UI_Cvar_VariableString("name")); - } - else if (Q_stricmp(name, "ui_r_colorbits") == 0) + } + else if (Q_stricmp(name, "ui_r_colorbits") == 0) { - switch (val) + switch (val) { case 0: Cvar_SetValue( "ui_r_depthbits", 0 ); @@ -3370,10 +3447,10 @@ static void UI_Update(const char *name) Cvar_SetValue( "ui_r_depthbits", 24 ); break; } - } - else if (Q_stricmp(name, "ui_r_lodbias") == 0) + } + else if (Q_stricmp(name, "ui_r_lodbias") == 0) { - switch (val) + switch (val) { case 0: Cvar_SetValue( "ui_r_subdivisions", 4 ); @@ -3386,10 +3463,10 @@ static void UI_Update(const char *name) Cvar_SetValue( "ui_r_subdivisions", 20 ); break; } - } - else if (Q_stricmp(name, "ui_r_glCustom") == 0) + } + else if (Q_stricmp(name, "ui_r_glCustom") == 0) { - switch (val) + switch (val) { case 0: // high quality @@ -3407,7 +3484,7 @@ static void UI_Update(const char *name) Cvar_Set( "ui_r_texturemode", "GL_LINEAR_MIPMAP_LINEAR" ); break; - case 1: // normal + case 1: // normal Cvar_SetValue( "ui_r_fullScreen", 1 ); Cvar_SetValue( "ui_r_subdivisions", 4 ); Cvar_SetValue( "ui_r_lodbias", 0 ); @@ -3454,14 +3531,14 @@ static void UI_Update(const char *name) Cvar_Set( "ui_r_texturemode", "GL_LINEAR_MIPMAP_NEAREST" ); break; } - } - else if (Q_stricmp(name, "ui_mousePitch") == 0) + } + else if (Q_stricmp(name, "ui_mousePitch") == 0) { - if (val == 0) + if (val == 0) { Cvar_SetValue( "m_pitch", 0.022f ); - } - else + } + else { Cvar_SetValue( "m_pitch", -0.022f ); } @@ -3485,7 +3562,7 @@ static void UI_Update(const char *name) AssetCache ================= */ -void AssetCache(void) +void AssetCache(void) { // int n; uiInfo.uiDC.Assets.scrollBar = ui.R_RegisterShaderNoMip( ASSET_SCROLLBAR ); @@ -3498,9 +3575,9 @@ void AssetCache(void) uiInfo.uiDC.Assets.sliderBar = ui.R_RegisterShaderNoMip( "menu/new/slider" ); uiInfo.uiDC.Assets.sliderThumb = ui.R_RegisterShaderNoMip( "menu/new/sliderthumb"); - + /* - for( n = 0; n < NUM_CROSSHAIRS; n++ ) + for( n = 0; n < NUM_CROSSHAIRS; n++ ) { uiInfo.uiDC.Assets.crosshairShader[n] = ui.R_RegisterShaderNoMip( va("gfx/2d/crosshair%c", 'a' + n ) ); } @@ -3512,7 +3589,7 @@ void AssetCache(void) _UI_DrawSides ================= */ -void _UI_DrawSides(float x, float y, float w, float h, float size) +void _UI_DrawSides(float x, float y, float w, float h, float size) { size *= uiInfo.uiDC.xscale; trap_R_DrawStretchPic( x, y, size, h, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); @@ -3524,7 +3601,7 @@ void _UI_DrawSides(float x, float y, float w, float h, float size) _UI_DrawTopBottom ================= */ -void _UI_DrawTopBottom(float x, float y, float w, float h, float size) +void _UI_DrawTopBottom(float x, float y, float w, float h, float size) { size *= uiInfo.uiDC.yscale; trap_R_DrawStretchPic( x, y, w, size, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); @@ -3537,7 +3614,7 @@ UI_DrawRect Coordinates are 640*480 virtual values ================= */ -void _UI_DrawRect( float x, float y, float width, float height, float size, const float *color ) +void _UI_DrawRect( float x, float y, float width, float height, float size, const float *color ) { trap_R_SetColor( color ); @@ -3552,12 +3629,12 @@ void _UI_DrawRect( float x, float y, float width, float height, float size, cons UI_UpdateCvars ================= */ -void UI_UpdateCvars( void ) +void UI_UpdateCvars( void ) { int i; cvarTable_t *cv; - for ( i = 0, cv = cvarTable ; i < cvarTableSize ; i++, cv++ ) + for ( i = 0, cv = cvarTable ; i < cvarTableSize ; i++, cv++ ) { Cvar_Update( cv->vmCvar ); } @@ -3568,7 +3645,7 @@ void UI_UpdateCvars( void ) UI_DrawEffects ================= */ -static void UI_DrawEffects(rectDef_t *rect, float scale, vec4_t color) +static void UI_DrawEffects(rectDef_t *rect, float scale, vec4_t color) { UI_DrawHandlePic( rect->x, rect->y - 14, 128, 8, 0/*uiInfo.uiDC.Assets.fxBasePic*/ ); UI_DrawHandlePic( rect->x + uiInfo.effectsColor * 16 + 8, rect->y - 16, 16, 12, 0/*uiInfo.uiDC.Assets.fxPic[uiInfo.effectsColor]*/ ); @@ -3579,10 +3656,10 @@ static void UI_DrawEffects(rectDef_t *rect, float scale, vec4_t color) UI_Version ================= */ -static void UI_Version(rectDef_t *rect, float scale, vec4_t color, int iFontIndex) +static void UI_Version(rectDef_t *rect, float scale, vec4_t color, int iFontIndex) { int width; - + width = DC->textWidth(Q3_VERSION, scale, 0); DC->drawText(rect->x - width, rect->y, scale, color, Q3_VERSION, 0, ITEM_TEXTSTYLE_SHADOWED, iFontIndex); @@ -3593,17 +3670,17 @@ static void UI_Version(rectDef_t *rect, float scale, vec4_t color, int iFontInde UI_DrawKeyBindStatus ================= */ -static void UI_DrawKeyBindStatus(rectDef_t *rect, float scale, vec4_t color, int textStyle, int iFontIndex) +static void UI_DrawKeyBindStatus(rectDef_t *rect, float scale, vec4_t color, int textStyle, int iFontIndex) { - if (Display_KeyBindPending()) + if (Display_KeyBindPending()) { #ifdef JK2_MODE Text_Paint(rect->x, rect->y, scale, color, ui.SP_GetStringTextString("MENUS_WAITINGFORKEY"), 0, textStyle, iFontIndex); #else Text_Paint(rect->x, rect->y, scale, color, SE_GetString("MENUS_WAITINGFORKEY"), 0, textStyle, iFontIndex); #endif - } - else + } + else { // Text_Paint(rect->x, rect->y, scale, color, ui.SP_GetStringTextString("MENUS_ENTERTOCHANGE"), 0, textStyle, iFontIndex); } @@ -3614,7 +3691,7 @@ static void UI_DrawKeyBindStatus(rectDef_t *rect, float scale, vec4_t color, int UI_DrawKeyBindStatus ================= */ -static void UI_DrawGLInfo(rectDef_t *rect, float scale, vec4_t color, int textStyle, int iFontIndex) +static void UI_DrawGLInfo(rectDef_t *rect, float scale, vec4_t color, int textStyle, int iFontIndex) { #define MAX_LINES 64 char buff[4096]; @@ -3622,7 +3699,7 @@ static void UI_DrawGLInfo(rectDef_t *rect, float scale, vec4_t color, int textSt const char *lines[MAX_LINES]; int y, numLines=0, i=0; - y = rect->y; + y = rect->y; Text_Paint(rect->x, y, scale, color, va("GL_VENDOR: %s",uiInfo.uiDC.glconfig.vendor_string), rect->w, textStyle, iFontIndex); y += 15; Text_Paint(rect->x, y, scale, color, va("GL_VERSION: %s: %s", uiInfo.uiDC.glconfig.version_string,uiInfo.uiDC.glconfig.renderer_string), rect->w, textStyle, iFontIndex); @@ -3640,7 +3717,7 @@ static void UI_DrawGLInfo(rectDef_t *rect, float scale, vec4_t color, int textSt *eptr++ = '\0'; // track start of valid string - if (*eptr && *eptr != ' ') + if (*eptr && *eptr != ' ') { lines[numLines++] = eptr; testy+=16; @@ -3651,7 +3728,7 @@ static void UI_DrawGLInfo(rectDef_t *rect, float scale, vec4_t color, int textSt } numLines--; - while (i < numLines) + while (i < numLines) { Text_Paint(rect->x, y, scale, color, lines[i++], rect->w, textStyle, iFontIndex); y += 16; @@ -3664,7 +3741,7 @@ UI_DataPad_Inventory ================= */ /* -static void UI_DataPad_Inventory(rectDef_t *rect, float scale, vec4_t color, int iFontIndex) +static void UI_DataPad_Inventory(rectDef_t *rect, float scale, vec4_t color, int iFontIndex) { Text_Paint(rect->x, rect->y, scale, color, "INVENTORY", 0, 1, iFontIndex); } @@ -3675,7 +3752,7 @@ UI_DataPad_ForcePowers ================= */ /* -static void UI_DataPad_ForcePowers(rectDef_t *rect, float scale, vec4_t color, int iFontIndex) +static void UI_DataPad_ForcePowers(rectDef_t *rect, float scale, vec4_t color, int iFontIndex) { Text_Paint(rect->x, rect->y, scale, color, "FORCE POWERS", 0, 1, iFontIndex); } @@ -3696,7 +3773,7 @@ static void UI_DrawCrosshair(rectDef_t *rect, float scale, vec4_t color) { UI_OwnerDraw ================= */ -static void UI_OwnerDraw(float x, float y, float w, float h, float text_x, float text_y, int ownerDraw, int ownerDrawFlags, int align, float special, float scale, vec4_t color, qhandle_t shader, int textStyle, int iFontIndex) +static void UI_OwnerDraw(float x, float y, float w, float h, float text_x, float text_y, int ownerDraw, int ownerDrawFlags, int align, float special, float scale, vec4_t color, qhandle_t shader, int textStyle, int iFontIndex) { rectDef_t rect; @@ -3705,7 +3782,7 @@ static void UI_OwnerDraw(float x, float y, float w, float h, float text_x, float rect.w = w; rect.h = h; - switch (ownerDraw) + switch (ownerDraw) { case UI_EFFECTS: UI_DrawEffects(&rect, scale, color); @@ -3737,22 +3814,14 @@ static void UI_OwnerDraw(float x, float y, float w, float h, float text_x, float case UI_ALLMAPS_SELECTION://saved game thumbnail int levelshot; - levelshot = 0; - if (s_savedata[s_savegame.currentLine].currentSaveFileName) - { - //To avoid error messages when these screenshots are missing - fileHandle_t fp; - ui.FS_FOpenFile(va( "saves/screenshots/%s.jpg", s_savedata[s_savegame.currentLine].currentSaveFileName ), &fp, FS_READ); - if (fp) - { - ui.FS_FCloseFile(fp); - levelshot = ui.R_RegisterShaderNoMip( va( "saves/screenshots/%s", s_savedata[s_savegame.currentLine].currentSaveFileName ) ); - } - } - if (!levelshot) + levelshot = ui.R_RegisterShaderNoMip( va( "levelshots/%s", s_savedata[s_savegame.currentLine].currentSaveFileMap ) ); +#ifdef JK2_MODE + if (screenShotBuf[0]) { - levelshot = ui.R_RegisterShaderNoMip( va( "levelshots/%s", s_savedata[s_savegame.currentLine].currentSaveFileMap ) ); + ui.DrawStretchRaw( x, y, w, h, SG_SCR_WIDTH, SG_SCR_HEIGHT, screenShotBuf, 0, qtrue ); } + else +#endif if (levelshot) { ui.R_DrawStretchPic( x, y, w, h, 0, 0, 1, 1, levelshot ); @@ -3795,21 +3864,21 @@ static void UI_OwnerDraw(float x, float y, float w, float h, float text_x, float UI_OwnerDrawVisible ================= */ -static qboolean UI_OwnerDrawVisible(int flags) +static qboolean UI_OwnerDrawVisible(int flags) { qboolean vis = qtrue; - while (flags) + while (flags) { -/* if (flags & UI_SHOW_DEMOAVAILABLE) +/* if (flags & UI_SHOW_DEMOAVAILABLE) { - if (!uiInfo.demoAvailable) + if (!uiInfo.demoAvailable) { vis = qfalse; } flags &= ~UI_SHOW_DEMOAVAILABLE; - } - else + } + else */ { flags = 0; } @@ -3822,7 +3891,7 @@ static qboolean UI_OwnerDrawVisible(int flags) Text_Width ================= */ -int Text_Width(const char *text, float scale, int iFontIndex) +int Text_Width(const char *text, float scale, int iFontIndex) { // temp code until Bob retro-fits all menus to have font specifiers... // @@ -3838,30 +3907,30 @@ int Text_Width(const char *text, float scale, int iFontIndex) UI_OwnerDrawWidth ================= */ -int UI_OwnerDrawWidth(int ownerDraw, float scale) +int UI_OwnerDrawWidth(int ownerDraw, float scale) { // int i, h, value; // const char *text; const char *s = NULL; - switch (ownerDraw) + switch (ownerDraw) { case UI_KEYBINDSTATUS: - if (Display_KeyBindPending()) + if (Display_KeyBindPending()) { #ifdef JK2_MODE s = ui.SP_GetStringTextString("MENUS_WAITINGFORKEY"); #else s = SE_GetString("MENUS_WAITINGFORKEY"); #endif - } - else + } + else { // s = ui.SP_GetStringTextString("MENUS_ENTERTOCHANGE"); } break; - + // FIXME BOB // case UI_SERVERREFRESHDATE: // s = UI_Cvar_VariableString(va("ui_lastServerRefresh_%i", ui_netSource.integer)); @@ -3870,7 +3939,7 @@ int UI_OwnerDrawWidth(int ownerDraw, float scale) break; } - if (s) + if (s) { return Text_Width(s, scale, 0); } @@ -3882,7 +3951,7 @@ int UI_OwnerDrawWidth(int ownerDraw, float scale) Text_Height ================= */ -int Text_Height(const char *text, float scale, int iFontIndex) +int Text_Height(const char *text, float scale, int iFontIndex) { // temp until Bob retro-fits all menu files with font specifiers... // @@ -3923,7 +3992,7 @@ void _UI_MouseEvent( int dx, int dy ) uiInfo.uiDC.cursory = SCREEN_HEIGHT; } - if (Menu_Count() > 0) + if (Menu_Count() > 0) { //menuDef_t *menu = Menu_GetFocused(); //Menu_HandleMouseMove(menu, uiInfo.uiDC.cursorx, uiInfo.uiDC.cursory); @@ -3937,7 +4006,7 @@ void _UI_MouseEvent( int dx, int dy ) UI_KeyEvent ================= */ -void _UI_KeyEvent( int key, qboolean down ) +void _UI_KeyEvent( int key, qboolean down ) { /* extern qboolean SwallowBadNumLockedKPKey( int iKey ); if (SwallowBadNumLockedKPKey(key)){ @@ -3945,22 +4014,22 @@ void _UI_KeyEvent( int key, qboolean down ) } */ - if (Menu_Count() > 0) + if (Menu_Count() > 0) { menuDef_t *menu = Menu_GetFocused(); - if (menu) + if (menu) { //DemoEnd(); - if (key == A_ESCAPE && down && !Menus_AnyFullScreenVisible() && !(menu->window.flags & WINDOW_IGNORE_ESCAPE)) + if (key == A_ESCAPE && down && !Menus_AnyFullScreenVisible() && !(menu->window.flags & WINDOW_IGNORE_ESCAPE)) { Menus_CloseAll(); - } - else + } + else { Menu_HandleKey(menu, key, down ); } - } - else + } + else { trap_Key_SetCatcher( trap_Key_GetCatcher() & ~KEYCATCH_UI ); trap_Key_ClearStates(); @@ -3974,7 +4043,7 @@ void _UI_KeyEvent( int key, qboolean down ) UI_Report ================= */ -void UI_Report(void) +void UI_Report(void) { String_Report(); } @@ -4033,7 +4102,7 @@ void UI_InGameMenu(const char*menuID) ui.Key_SetCatcher( KEYCATCH_UI ); } -qboolean _UI_IsFullscreen( void ) +qboolean _UI_IsFullscreen( void ) { return Menus_AnyFullScreenVisible(); } @@ -4093,7 +4162,7 @@ void Menu_Cache( void ) UI_UpdateVideoSetup Copies the temporary user interface version of the video cvars into -their real counterparts. This is to create a interface which allows +their real counterparts. This is to create a interface which allows you to discard your changes if you did something you didnt want ================= */ @@ -4148,7 +4217,7 @@ void UI_GetVideoSetup ( void ) Cvar_Register ( NULL, "ui_r_allowExtensions", "0", CVAR_ROM ); // Cvar_Register ( NULL, "ui_cg_shadows", "0", CVAR_ROM ); Cvar_Register ( NULL, "ui_r_modified", "0", CVAR_ROM ); - + // Copy over the real video cvars into their temporary counterparts Cvar_Set ( "ui_r_mode", Cvar_VariableString ( "r_mode" ) ); Cvar_Set ( "ui_r_colorbits", Cvar_VariableString ( "r_colorbits" ) ); @@ -4175,7 +4244,7 @@ static void UI_SetSexandSoundForModel(const char* char_model) qboolean isFemale = qfalse; i = ui.FS_FOpenFile(va("models/players/%s/sounds.cfg", char_model), &f, FS_READ); - if ( !f ) + if ( !f ) {//no? oh bother. Cvar_Reset("snd"); Cvar_Reset("sex"); @@ -4262,7 +4331,7 @@ static void UI_UpdateSaberCvars ( void ) static void UI_UpdateFightingStyleChoices ( void ) { - // + // if (!Q_stricmp("staff",Cvar_VariableString ( "ui_saber_type" ))) { Cvar_Set ( "ui_fightingstylesallowed", "0" ); @@ -4276,7 +4345,7 @@ static void UI_UpdateFightingStyleChoices ( void ) else { // Get player state - client_t *cl = &svs.clients[0]; // 0 because only ever us as a player + client_t *cl = &svs.clients[0]; // 0 because only ever us as a player playerState_t *pState; if (cl && cl->gentity && cl->gentity->client) @@ -4285,15 +4354,15 @@ static void UI_UpdateFightingStyleChoices ( void ) // Knows Fast style? - if (pState->saberStylesKnown & (1<saberStylesKnown & (1<saberStylesKnown & (1<saberStylesKnown & (1<saberStylesKnown & (1<saberStylesKnown & (1<saberStylesKnown & (1<saberStylesKnown & (1<saberStylesKnown & (1<saberStylesKnown & (1<forcePowerLevel[FP_HEAL], uiInfo.forcePowerLevel[FP_HEAL]); - uiInfo.forcePowerLevel[FP_TELEPATHY]=max(pState->forcePowerLevel[FP_TELEPATHY], uiInfo.forcePowerLevel[FP_TELEPATHY]); - uiInfo.forcePowerLevel[FP_GRIP]=max(pState->forcePowerLevel[FP_GRIP], uiInfo.forcePowerLevel[FP_GRIP]); - uiInfo.forcePowerLevel[FP_LIGHTNING]=max(pState->forcePowerLevel[FP_LIGHTNING], uiInfo.forcePowerLevel[FP_LIGHTNING]); - uiInfo.forcePowerLevel[FP_PROTECT]=max(pState->forcePowerLevel[FP_PROTECT], uiInfo.forcePowerLevel[FP_PROTECT]); - - uiInfo.forcePowerLevel[FP_ABSORB]=max(pState->forcePowerLevel[FP_ABSORB], uiInfo.forcePowerLevel[FP_ABSORB]); - uiInfo.forcePowerLevel[FP_DRAIN]=max(pState->forcePowerLevel[FP_DRAIN], uiInfo.forcePowerLevel[FP_DRAIN]); - uiInfo.forcePowerLevel[FP_RAGE]=max(pState->forcePowerLevel[FP_RAGE], uiInfo.forcePowerLevel[FP_RAGE]); + uiInfo.forcePowerLevel[FP_HEAL] = Q_max(pState->forcePowerLevel[FP_HEAL], uiInfo.forcePowerLevel[FP_HEAL]); + uiInfo.forcePowerLevel[FP_TELEPATHY]=Q_max(pState->forcePowerLevel[FP_TELEPATHY], uiInfo.forcePowerLevel[FP_TELEPATHY]); + uiInfo.forcePowerLevel[FP_GRIP]=Q_max(pState->forcePowerLevel[FP_GRIP], uiInfo.forcePowerLevel[FP_GRIP]); + uiInfo.forcePowerLevel[FP_LIGHTNING]=Q_max(pState->forcePowerLevel[FP_LIGHTNING], uiInfo.forcePowerLevel[FP_LIGHTNING]); + uiInfo.forcePowerLevel[FP_PROTECT]=Q_max(pState->forcePowerLevel[FP_PROTECT], uiInfo.forcePowerLevel[FP_PROTECT]); + + uiInfo.forcePowerLevel[FP_ABSORB]=Q_max(pState->forcePowerLevel[FP_ABSORB], uiInfo.forcePowerLevel[FP_ABSORB]); + uiInfo.forcePowerLevel[FP_DRAIN]=Q_max(pState->forcePowerLevel[FP_DRAIN], uiInfo.forcePowerLevel[FP_DRAIN]); + uiInfo.forcePowerLevel[FP_RAGE]=Q_max(pState->forcePowerLevel[FP_RAGE], uiInfo.forcePowerLevel[FP_RAGE]); } } @@ -4732,7 +4801,7 @@ static void UI_RecordWeapons( void ) } const char *s2 = ""; - + int wpns = 0; // always add blaster and saber wpns |= (1<window.flags |= WINDOW_HASFOCUS; - if (item->onFocus) + if (item->onFocus) { Item_RunScript(item, item->onFocus); } @@ -4802,7 +4871,7 @@ static void UI_ShutdownForceHelp( void ) } // Get player state - client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player if (!cl) // No client, get out { @@ -4819,15 +4888,15 @@ static void UI_ShutdownForceHelp( void ) // Update level description Com_sprintf ( - itemName, - sizeof(itemName), - "%s_level%ddesc", + itemName, + sizeof(itemName), + "%s_level%ddesc", powerEnums[uiInfo.forcePowerUpdated].title, pState->forcePowerLevel[powerEnums[uiInfo.forcePowerUpdated].powerEnum] ); item = (itemDef_s *) Menu_FindItemByName(menu, itemName); - if (item) + if (item) { item->window.flags |= WINDOW_VISIBLE; } @@ -4842,7 +4911,7 @@ static void UI_ShutdownForceHelp( void ) Com_sprintf (itemhexName, sizeof(itemhexName), "%s_hexpic", powerEnums[uiInfo.forcePowerUpdated].title); Com_sprintf (itemiconName, sizeof(itemiconName), "%s_iconpic", powerEnums[uiInfo.forcePowerUpdated].title); - + UI_SetItemColor(item,itemhexName,"forecolor",color2); UI_SetItemColor(item,itemiconName,"forecolor",color2); } @@ -4854,7 +4923,7 @@ static void UI_ShutdownForceHelp( void ) } } -// Decrement force power level (Used by Force Power Allocation screen) +// Decrement force power level (Used by Force Power Allocation screen) static void UI_DecrementCurrentForcePower ( void ) { menuDef_t *menu; @@ -4871,7 +4940,7 @@ static void UI_DecrementCurrentForcePower ( void ) } // Get player state - client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player playerState_t* pState = NULL; int forcelevel; @@ -4912,7 +4981,7 @@ static void UI_DecrementCurrentForcePower ( void ) } UI_SetHexPicLevel( menu,uiInfo.forcePowerUpdated,forcelevel,qfalse ); - + UI_ShowForceLevelDesc ( powerEnums[uiInfo.forcePowerUpdated].title ); // We just decremented a field so turn all buttons back on @@ -4937,7 +5006,7 @@ static void UI_DecrementCurrentForcePower ( void ) item = (itemDef_s *) Menu_FindItemByName(menu, "deallocate_fbutton"); if (item) { - item->window.flags &= ~WINDOW_VISIBLE; // + item->window.flags &= ~WINDOW_VISIBLE; // // Un-grey-out all icons UI_SetItemColor(item,"hexpic","forecolor",color); @@ -4956,7 +5025,7 @@ static void UI_DecrementCurrentForcePower ( void ) void Item_MouseEnter(itemDef_t *item, float x, float y); -// Try to increment force power level (Used by Force Power Allocation screen) +// Try to increment force power level (Used by Force Power Allocation screen) static void UI_AffectForcePowerLevel ( const char *forceName ) { short forcePowerI=0,i; @@ -4976,7 +5045,7 @@ static void UI_AffectForcePowerLevel ( const char *forceName ) } // Get player state - client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player playerState_t* pState = NULL; int forcelevel; if( cl ) @@ -4988,7 +5057,7 @@ static void UI_AffectForcePowerLevel ( const char *forceName ) { forcelevel = uiInfo.forcePowerLevel[powerEnums[forcePowerI].powerEnum]; } - + if (forcelevel>2) { // Too big, can't be incremented @@ -5044,8 +5113,8 @@ static void UI_AffectForcePowerLevel ( const char *forceName ) // Make weapons button active UI_ForcePowerWeaponsButton(qtrue); - // Make user_info - Cvar_Set ( "ui_forcepower_inc", va("%d",uiInfo.forcePowerUpdated) ); + // Make user_info + Cvar_Set ( "ui_forcepower_inc", va("%d",uiInfo.forcePowerUpdated) ); // Just grab an item to hand it to the function. item = (itemDef_s *) Menu_FindItemByName(menu, "deallocate_fbutton"); @@ -5065,7 +5134,7 @@ static void UI_DecrementForcePowerLevel( void ) { int forcePowerI = Cvar_VariableIntegerValue( "ui_forcepower_inc" ); // Get player state - client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player if (!cl) // No client, get out { @@ -5078,7 +5147,7 @@ static void UI_DecrementForcePowerLevel( void ) } -// Show force level description that matches current player level (Used by Force Power Allocation screen) +// Show force level description that matches current player level (Used by Force Power Allocation screen) static void UI_ShowForceLevelDesc ( const char *forceName ) { short forcePowerI=0; @@ -5091,14 +5160,14 @@ static void UI_ShowForceLevelDesc ( const char *forceName ) return; } - + if (!UI_GetForcePowerIndex ( forceName, &forcePowerI )) { return; } // Get player state - client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player if (!cl) // No client, get out { @@ -5110,22 +5179,22 @@ static void UI_ShowForceLevelDesc ( const char *forceName ) // Update level description Com_sprintf ( - itemName, - sizeof(itemName), - "%s_level%ddesc", + itemName, + sizeof(itemName), + "%s_level%ddesc", powerEnums[forcePowerI].title, pState->forcePowerLevel[powerEnums[forcePowerI].powerEnum] ); item = (itemDef_s *) Menu_FindItemByName(menu, itemName); - if (item) + if (item) { item->window.flags |= WINDOW_VISIBLE; } } -// Reset force level powers screen to what it was before player upgraded them (Used by Force Power Allocation screen) +// Reset force level powers screen to what it was before player upgraded them (Used by Force Power Allocation screen) static void UI_ResetForceLevels ( void ) { @@ -5133,7 +5202,7 @@ static void UI_ResetForceLevels ( void ) if (uiInfo.forcePowerUpdated!=FP_UPDATED_NONE) { // Get player state - client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player if (!cl) // No client, get out { @@ -5216,7 +5285,7 @@ static void UI_UpdateFightingStyle ( void ) } // Get player state - client_t *cl = &svs.clients[0]; // 0 because only ever us as a player + client_t *cl = &svs.clients[0]; // 0 because only ever us as a player // No client, get out if (cl && cl->gentity && cl->gentity->client) @@ -5226,7 +5295,7 @@ static void UI_UpdateFightingStyle ( void ) } else // Must be at the beginning of the game so the client hasn't been created, shove data in a cvar { - Cvar_Set ( "g_fighting_style", va("%d",saberStyle) ); + Cvar_Set ( "g_fighting_style", va("%d",saberStyle) ); } } @@ -5238,7 +5307,7 @@ static void UI_ResetCharacterListBoxes( void ) listBoxDef_t *listPtr; menu = Menus_FindByName("characterMenu"); - + if (menu) { @@ -5291,7 +5360,7 @@ static void UI_ResetCharacterListBoxes( void ) static void UI_ClearInventory ( void ) { // Get player state - client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player if (!cl) // No client, get out { @@ -5314,7 +5383,7 @@ static void UI_ClearInventory ( void ) static void UI_GiveInventory ( const int itemIndex, const int amount ) { // Get player state - client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player if (!cl) // No client, get out { @@ -5333,7 +5402,7 @@ static void UI_GiveInventory ( const int itemIndex, const int amount ) } -//. Find weapons allocation screen BEGIN button and make active/inactive +//. Find weapons allocation screen BEGIN button and make active/inactive static void UI_WeaponAllocBeginButton(qboolean activeFlag) { menuDef_t *menu; @@ -5345,7 +5414,7 @@ static void UI_WeaponAllocBeginButton(qboolean activeFlag) } int weap = Cvar_VariableIntegerValue( "weapon_menu" ); - + // Find begin button itemDef_t *item; item = Menu_GetMatchingItemByNumber(menu, weap, "beginmission"); @@ -5364,7 +5433,7 @@ static void UI_WeaponAllocBeginButton(qboolean activeFlag) } } -// If we have both weapons and the throwable weapon, turn on the begin mission button, +// If we have both weapons and the throwable weapon, turn on the begin mission button, // otherwise, turn it off static void UI_WeaponsSelectionsComplete( void ) { @@ -5381,7 +5450,7 @@ static void UI_WeaponsSelectionsComplete( void ) } } -// if this is the first time into the weapon allocation screen, show the INSTRUCTION screen +// if this is the first time into the weapon allocation screen, show the INSTRUCTION screen static void UI_WeaponHelpActive( void ) { int tier_storyinfo = Cvar_VariableIntegerValue( "tier_storyinfo" ); @@ -5422,7 +5491,7 @@ static void UI_InitWeaponSelect( void ) static void UI_ClearWeapons ( void ) { // Get player state - client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player if (!cl) // No client, get out { @@ -5437,7 +5506,7 @@ static void UI_ClearWeapons ( void ) pState->stats[ STAT_WEAPONS ] = 0; pState->weapon = WP_NONE; - + } } @@ -5445,7 +5514,7 @@ static void UI_ClearWeapons ( void ) static void UI_GiveWeapon ( const int weaponIndex ) { // Get player state - client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player if (!cl) // No client, get out { @@ -5466,7 +5535,7 @@ static void UI_GiveWeapon ( const int weaponIndex ) static void UI_EquipWeapon ( const int weaponIndex ) { // Get player state - client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player if (!cl) // No client, get out { @@ -5490,7 +5559,7 @@ static void UI_LoadMissionSelectMenu( const char *cvarName ) { int holdLevel = (int)trap_Cvar_VariableValue(cvarName); - // Figure out which tier menu to load + // Figure out which tier menu to load if ((holdLevel > 0) && (holdLevel < 5)) { UI_LoadMenus("ui/tier1.txt",qfalse); @@ -5607,11 +5676,11 @@ static void UI_AddWeaponSelection ( const int weaponIndex, const int ammoIndex, } // Get player state - client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player // NOTE : this UIScript can now be run from outside the game, so don't // return out here, just skip this part - if (cl) + if (cl) { // Add weapon if (cl->gentity && cl->gentity->client) @@ -5633,7 +5702,7 @@ static void UI_AddWeaponSelection ( const int weaponIndex, const int ammoIndex, if( soundfile ) { - DC->startLocalSound(DC->registerSound(soundfile, qfalse), CHAN_LOCAL ); + DC->startLocalSound(DC->registerSound(soundfile, qfalse), CHAN_LOCAL ); } UI_WeaponsSelectionsComplete(); // Test to see if the mission begin button should turn on or off @@ -5711,7 +5780,7 @@ static void UI_RemoveWeaponSelection ( const int weaponSelectionIndex ) } // Get player state - client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player // NOTE : this UIScript can now be run from outside the game, so don't // return out here, just skip this part @@ -5898,7 +5967,7 @@ static void UI_AddThrowWeaponSelection ( const int weaponIndex, const int ammoIn // Get player state - client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player // NOTE : this UIScript can now be run from outside the game, so don't // return out here, just skip this part @@ -5924,7 +5993,7 @@ static void UI_AddThrowWeaponSelection ( const int weaponIndex, const int ammoIn if( soundfile ) { - DC->startLocalSound(DC->registerSound(soundfile, qfalse), CHAN_LOCAL ); + DC->startLocalSound(DC->registerSound(soundfile, qfalse), CHAN_LOCAL ); } UI_WeaponsSelectionsComplete(); // Test to see if the mission begin button should turn on or off @@ -5977,7 +6046,7 @@ static void UI_RemoveThrowWeaponSelection ( void ) // Get player state - client_t* cl = &svs.clients[0]; // 0 because only ever us as a player + client_t* cl = &svs.clients[0]; // 0 because only ever us as a player // NOTE : this UIScript can now be run from outside the game, so don't // return out here, just skip this part @@ -6436,11 +6505,11 @@ static void UI_UpdateCharacterSkin( void ) Com_Error( ERR_FATAL, "UI_UpdateCharacterSkin: Could not find item (character) in menu (%s)", menu->window.name); } - Com_sprintf( skin, sizeof( skin ), "models/players/%s/|%s|%s|%s", - Cvar_VariableString ( "ui_char_model"), - Cvar_VariableString ( "ui_char_skin_head"), - Cvar_VariableString ( "ui_char_skin_torso"), - Cvar_VariableString ( "ui_char_skin_legs") + Com_sprintf( skin, sizeof( skin ), "models/players/%s/|%s|%s|%s", + Cvar_VariableString ( "ui_char_model"), + Cvar_VariableString ( "ui_char_skin_head"), + Cvar_VariableString ( "ui_char_skin_torso"), + Cvar_VariableString ( "ui_char_skin_legs") ); ItemParse_model_g2skin_go( item, skin ); @@ -6627,7 +6696,7 @@ void UI_ResetDefaults( void ) UI_SortSaveGames ======================= */ -static int UI_SortSaveGames( const void *A, const void *B ) +static int UI_SortSaveGames( const void *A, const void *B ) { const int &a = ((savedata_t*)A)->currentSaveFileDateTime; @@ -6650,7 +6719,7 @@ UI_AdjustSaveGameListBox */ // Yeah I could get fired for this... in a world of good and bad, this is bad // I wish we passed in the menu item to RunScript(), oh well... -void UI_AdjustSaveGameListBox( int currentLine ) +void UI_AdjustSaveGameListBox( int currentLine ) { menuDef_t *menu; itemDef_t *item; @@ -6672,11 +6741,11 @@ void UI_AdjustSaveGameListBox( int currentLine ) { listPtr->cursorPos = currentLine; } - + item->cursorPos = currentLine; } } - + } /* @@ -6694,9 +6763,11 @@ void ReadSaveDirectory (void) // Clear out save data memset(s_savedata,0,sizeof(s_savedata)); s_savegame.saveFileCnt = 0; - Cvar_Set("ui_gameDesc", "" ); // Blank out comment + Cvar_Set("ui_gameDesc", "" ); // Blank out comment Cvar_Set("ui_SelectionOK", "0" ); - //memset( screenShotBuf,0,(SG_SCR_WIDTH * SG_SCR_HEIGHT * 4)); //blank out sshot +#ifdef JK2_MODE + memset( screenShotBuf,0,(SG_SCR_WIDTH * SG_SCR_HEIGHT * 4)); //blank out sshot +#endif // Get everything in saves directory @@ -6704,7 +6775,7 @@ void ReadSaveDirectory (void) Cvar_Set("ui_ResumeOK", "0" ); holdChar = s_savegame.listBuf; - for ( i = 0; i < fileCnt; i++ ) + for ( i = 0; i < fileCnt; i++ ) { // strip extension len = strlen( holdChar ); @@ -6720,11 +6791,11 @@ void ReadSaveDirectory (void) else { // Is this a valid file??? & Get comment of file result = ui.SG_GetSaveGameComment(holdChar, s_savedata[s_savegame.saveFileCnt].currentSaveFileComments, s_savedata[s_savegame.saveFileCnt].currentSaveFileMap); - if (result != 0) // ignore Bad save game + if (result != 0) // ignore Bad save game { s_savedata[s_savegame.saveFileCnt].currentSaveFileName = holdChar; s_savedata[s_savegame.saveFileCnt].currentSaveFileDateTime = result; - + struct tm *localTime; localTime = localtime( &result ); strcpy(s_savedata[s_savegame.saveFileCnt].currentSaveFileDateTimeString,asctime( localTime ) ); @@ -6736,7 +6807,7 @@ void ReadSaveDirectory (void) } } } - + holdChar += len + 1; //move to next item } diff --git a/code/ui/ui_public.h b/code/ui/ui_public.h index 4473c7300d..b05f44d7b6 100644 --- a/code/ui/ui_public.h +++ b/code/ui/ui_public.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __UI_PUBLIC_H__ #define __UI_PUBLIC_H__ @@ -56,7 +61,7 @@ typedef struct { int (*FS_Write)( const void *buffer, int len, fileHandle_t f ); void (*FS_FCloseFile)( fileHandle_t f ); int (*FS_GetFileList)( const char *path, const char *extension, char *listbuf, int bufsize ); - int (*FS_ReadFile)( const char *name, void **buf ); + long (*FS_ReadFile)( const char *name, void **buf ); void (*FS_FreeFile)( void *buf ); // =========== renderer function calls ================ diff --git a/code/ui/ui_saber.cpp b/code/ui/ui_saber.cpp index 1a7efc741d..9706cabc9b 100644 --- a/code/ui/ui_saber.cpp +++ b/code/ui/ui_saber.cpp @@ -1,21 +1,25 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// + /* ======================================================================= diff --git a/code/ui/ui_shared.cpp b/code/ui/ui_shared.cpp index 98cd4df82b..12c97a60c2 100644 --- a/code/ui/ui_shared.cpp +++ b/code/ui/ui_shared.cpp @@ -1,22 +1,27 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// +// // string allocation/managment // leave this at the top of all UI_xxxx files for PCH reasons... @@ -34,9 +39,7 @@ This file is part of Jedi Academy. #include "ui_shared.h" #include "menudef.h" -#ifndef _WIN32 -#include -#endif +#include "qcommon/stringed_ingame.h" void UI_LoadMenus(const char *menuFile, qboolean reset); @@ -70,7 +73,7 @@ int Item_ListBox_ThumbDrawPosition(itemDef_t *item); int Item_ListBox_ThumbPosition(itemDef_t *item); int Item_ListBox_MaxScroll(itemDef_t *item); static qboolean Rect_ContainsPoint(rectDef_t *rect, float x, float y) ; -static qboolean Item_Paint(itemDef_t *item, qboolean bDraw); +static qboolean Item_Paint(itemDef_t *item, qboolean bDraw); int Item_TextScroll_ThumbDrawPosition ( itemDef_t *item ); static void Item_TextScroll_BuildLines ( itemDef_t* item ); @@ -92,7 +95,8 @@ static void *captureData = NULL; #ifdef CGAME #define MEM_POOL_SIZE 128 * 1024 #else -#define MEM_POOL_SIZE 1024 * 1024 +//#define MEM_POOL_SIZE 1024 * 1024 +#define MEM_POOL_SIZE 2048 * 1024 #endif #define SCROLL_TIME_START 500 @@ -190,7 +194,7 @@ Init_Display Initializes the display with a structure to all the drawing routines ================== */ -void Init_Display(displayContextDef_t *dc) +void Init_Display(displayContextDef_t *dc) { DC = dc; } @@ -200,10 +204,10 @@ void Init_Display(displayContextDef_t *dc) Window_Init Initializes a window structure ( windowDef_t ) with defaults - + ================== */ -void Window_Init(Window *w) +void Window_Init(Window *w) { memset(w, 0, sizeof(windowDef_t)); w->borderSize = 1; @@ -216,7 +220,7 @@ void Window_Init(Window *w) PC_SourceError ================= */ -void PC_SourceError(int handle, char *format, ...) +void PC_SourceError(int handle, char *format, ...) { int line; char filename[128]; @@ -239,7 +243,7 @@ void PC_SourceError(int handle, char *format, ...) PC_ParseStringMem ================= */ -qboolean PC_ParseStringMem(const char **out) +qboolean PC_ParseStringMem(const char **out) { const char *temp; @@ -258,15 +262,15 @@ qboolean PC_ParseStringMem(const char **out) PC_ParseRect ================= */ -qboolean PC_ParseRect(rectDef_t *r) +qboolean PC_ParseRect(rectDef_t *r) { - if (!PC_ParseFloat(&r->x)) + if (!PC_ParseFloat(&r->x)) { - if (!PC_ParseFloat(&r->y)) + if (!PC_ParseFloat(&r->y)) { - if (!PC_ParseFloat(&r->w)) + if (!PC_ParseFloat(&r->w)) { - if (!PC_ParseFloat(&r->h)) + if (!PC_ParseFloat(&r->h)) { return qtrue; } @@ -282,28 +286,28 @@ qboolean PC_ParseRect(rectDef_t *r) PC_Script_Parse ================= */ -qboolean PC_Script_Parse(const char **out) +qboolean PC_Script_Parse(const char **out) { char script[4096]; // pc_token_t token; char *token2; script[0]=0; - // scripts start with { and have ; separated command lists.. commands are command, arg.. + // scripts start with { and have ; separated command lists.. commands are command, arg.. // basically we want everything between the { } as it will be interpreted at run time - + token2 = PC_ParseExt(); if (!token2) { return qfalse; } - if (*token2 !='{') + if (*token2 !='{') { return qfalse; } - while ( 1 ) + while ( 1 ) { token2 = PC_ParseExt(); if (!token2) @@ -317,11 +321,11 @@ qboolean PC_Script_Parse(const char **out) return qtrue; } - if (*(token2 +1) != '\0') + if (*(token2 +1) != '\0') { Q_strcat(script, sizeof(script), va("\"%s\"", token2)); - } - else + } + else { Q_strcat(script, sizeof(script), token2); } @@ -338,7 +342,7 @@ qboolean PC_Script_Parse(const char **out) MenuParse_font ================= */ -qboolean MenuParse_font( itemDef_t *item) +qboolean MenuParse_font( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; @@ -347,7 +351,7 @@ qboolean MenuParse_font( itemDef_t *item) return qfalse; } - if (!DC->Assets.fontRegistered) + if (!DC->Assets.fontRegistered) { DC->Assets.qhMediumFont = DC->registerFont(menu->font); DC->Assets.fontRegistered = qtrue; @@ -361,7 +365,7 @@ qboolean MenuParse_font( itemDef_t *item) MenuParse_name ================= */ -qboolean MenuParse_name(itemDef_t *item) +qboolean MenuParse_name(itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; @@ -370,7 +374,7 @@ qboolean MenuParse_name(itemDef_t *item) return qfalse; } -// if (Q_stricmp(menu->window.name, "main") == 0) +// if (Q_stricmp(menu->window.name, "main") == 0) // { // default main as having focus // menu->window.flags |= WINDOW_HASFOCUS; @@ -384,7 +388,7 @@ MenuParse_fullscreen ================= */ -qboolean MenuParse_fullscreen( itemDef_t *item ) +qboolean MenuParse_fullscreen( itemDef_t *item ) { menuDef_t *menu = (menuDef_t*)item; @@ -401,11 +405,11 @@ MenuParse_rect ================= */ -qboolean MenuParse_rect( itemDef_t *item) +qboolean MenuParse_rect( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; - if (!PC_ParseRect(&menu->window.rect)) + if (!PC_ParseRect(&menu->window.rect)) { return qfalse; } @@ -417,13 +421,13 @@ qboolean MenuParse_rect( itemDef_t *item) MenuParse_style ================= */ -qboolean MenuParse_style( itemDef_t *item) +qboolean MenuParse_style( itemDef_t *item) { int i; const char *tempStr; menuDef_t *menu = (menuDef_t*)item; - if (PC_ParseString(&tempStr)) + if (PC_ParseString(&tempStr)) { return qfalse; } @@ -441,7 +445,7 @@ qboolean MenuParse_style( itemDef_t *item) if (styles[i] == NULL) { - PC_ParseWarning(va("Unknown menu style value '%s'",tempStr)); + PC_ParseWarning(va("Unknown menu style value '%s'",tempStr)); } return qtrue; } @@ -452,17 +456,17 @@ qboolean MenuParse_style( itemDef_t *item) MenuParse_visible ================= */ -qboolean MenuParse_visible( itemDef_t *item ) +qboolean MenuParse_visible( itemDef_t *item ) { int i; menuDef_t *menu = (menuDef_t*)item; - if (PC_ParseInt(&i)) + if (PC_ParseInt(&i)) { return qfalse; } - if (i) + if (i) { menu->window.flags |= WINDOW_VISIBLE; } @@ -474,17 +478,17 @@ qboolean MenuParse_visible( itemDef_t *item ) MenuParse_ignoreescape ================= */ -qboolean MenuParse_ignoreescape( itemDef_t *item ) +qboolean MenuParse_ignoreescape( itemDef_t *item ) { int i; menuDef_t *menu = (menuDef_t*)item; - if (PC_ParseInt(&i)) + if (PC_ParseInt(&i)) { return qfalse; } - if (i) + if (i) { menu->window.flags |= WINDOW_IGNORE_ESCAPE; } @@ -496,11 +500,11 @@ qboolean MenuParse_ignoreescape( itemDef_t *item ) MenuParse_onOpen ================= */ -qboolean MenuParse_onOpen( itemDef_t *item) +qboolean MenuParse_onOpen( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; - if (!PC_Script_Parse(&menu->onOpen)) + if (!PC_Script_Parse(&menu->onOpen)) { return qfalse; } @@ -512,11 +516,11 @@ qboolean MenuParse_onOpen( itemDef_t *item) MenuParse_onClose ================= */ -qboolean MenuParse_onClose( itemDef_t *item ) +qboolean MenuParse_onClose( itemDef_t *item ) { menuDef_t *menu = (menuDef_t*)item; - if (!PC_Script_Parse(&menu->onClose)) + if (!PC_Script_Parse(&menu->onClose)) { return qfalse; } @@ -529,11 +533,11 @@ qboolean MenuParse_onClose( itemDef_t *item ) MenuParse_onAccept ================= */ -qboolean MenuParse_onAccept( itemDef_t *item ) +qboolean MenuParse_onAccept( itemDef_t *item ) { menuDef_t *menu = (menuDef_t*)item; - if (!PC_Script_Parse(&menu->onAccept)) + if (!PC_Script_Parse(&menu->onAccept)) { return qfalse; } @@ -546,11 +550,11 @@ qboolean MenuParse_onAccept( itemDef_t *item ) MenuParse_onESC ================= */ -qboolean MenuParse_onESC( itemDef_t *item ) +qboolean MenuParse_onESC( itemDef_t *item ) { menuDef_t *menu = (menuDef_t*)item; - if (!PC_Script_Parse(&menu->onESC)) + if (!PC_Script_Parse(&menu->onESC)) { return qfalse; } @@ -563,11 +567,11 @@ qboolean MenuParse_onESC( itemDef_t *item ) MenuParse_border ================= */ -qboolean MenuParse_border( itemDef_t *item) +qboolean MenuParse_border( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; - if (PC_ParseInt(&menu->window.border)) + if (PC_ParseInt(&menu->window.border)) { return qfalse; } @@ -579,11 +583,11 @@ qboolean MenuParse_border( itemDef_t *item) MenuParse_borderSize ================= */ -qboolean MenuParse_borderSize( itemDef_t *item) +qboolean MenuParse_borderSize( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; - if (PC_ParseFloat(&menu->window.borderSize)) + if (PC_ParseFloat(&menu->window.borderSize)) { return qfalse; } @@ -595,15 +599,15 @@ qboolean MenuParse_borderSize( itemDef_t *item) MenuParse_backcolor ================= */ -qboolean MenuParse_backcolor( itemDef_t *item ) +qboolean MenuParse_backcolor( itemDef_t *item ) { int i; float f; menuDef_t *menu = (menuDef_t*)item; - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { - if (PC_ParseFloat(&f)) + if (PC_ParseFloat(&f)) { return qfalse; } @@ -617,15 +621,15 @@ qboolean MenuParse_backcolor( itemDef_t *item ) MenuParse_forecolor ================= */ -qboolean MenuParse_forecolor( itemDef_t *item) +qboolean MenuParse_forecolor( itemDef_t *item) { int i; float f; menuDef_t *menu = (menuDef_t*)item; - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { - if (PC_ParseFloat(&f)) + if (PC_ParseFloat(&f)) { return qfalse; } @@ -645,15 +649,15 @@ qboolean MenuParse_forecolor( itemDef_t *item) MenuParse_bordercolor ================= */ -qboolean MenuParse_bordercolor( itemDef_t *item ) +qboolean MenuParse_bordercolor( itemDef_t *item ) { int i; float f; menuDef_t *menu = (menuDef_t*)item; - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { - if (PC_ParseFloat(&f)) + if (PC_ParseFloat(&f)) { return qfalse; } @@ -667,15 +671,15 @@ qboolean MenuParse_bordercolor( itemDef_t *item ) MenuParse_focuscolor ================= */ -qboolean MenuParse_focuscolor( itemDef_t *item) +qboolean MenuParse_focuscolor( itemDef_t *item) { int i; float f; menuDef_t *menu = (menuDef_t*)item; - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { - if (PC_ParseFloat(&f)) + if (PC_ParseFloat(&f)) { return qfalse; } @@ -690,11 +694,11 @@ qboolean MenuParse_focuscolor( itemDef_t *item) MenuParse_focuscolor ================= */ -qboolean MenuParse_appearanceIncrement( itemDef_t *item) +qboolean MenuParse_appearanceIncrement( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; - if (PC_ParseFloat(&menu->appearanceIncrement)) + if (PC_ParseFloat(&menu->appearanceIncrement)) { return qfalse; } @@ -708,13 +712,13 @@ qboolean MenuParse_appearanceIncrement( itemDef_t *item) MenuParse_descAlignment ================= */ -qboolean MenuParse_descAlignment( itemDef_t *item) +qboolean MenuParse_descAlignment( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; const char *tempStr; int i; - if (PC_ParseString(&tempStr)) + if (PC_ParseString(&tempStr)) { return qfalse; } @@ -732,7 +736,7 @@ qboolean MenuParse_descAlignment( itemDef_t *item) if (alignment[i] == NULL) { - PC_ParseWarning(va("Unknown desc alignment value '%s'",tempStr)); + PC_ParseWarning(va("Unknown desc alignment value '%s'",tempStr)); } return qtrue; @@ -743,11 +747,11 @@ qboolean MenuParse_descAlignment( itemDef_t *item) MenuParse_descTextStyle ================= */ -qboolean MenuParse_descTextStyle( itemDef_t *item) +qboolean MenuParse_descTextStyle( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; - if (PC_ParseInt(&menu->descTextStyle)) + if (PC_ParseInt(&menu->descTextStyle)) { return qfalse; } @@ -758,11 +762,11 @@ qboolean MenuParse_descTextStyle( itemDef_t *item) MenuParse_descX ================= */ -qboolean MenuParse_descX( itemDef_t *item) +qboolean MenuParse_descX( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; - if (PC_ParseInt(&menu->descX)) + if (PC_ParseInt(&menu->descX)) { return qfalse; } @@ -774,11 +778,11 @@ qboolean MenuParse_descX( itemDef_t *item) MenuParse_descY ================= */ -qboolean MenuParse_descY( itemDef_t *item) +qboolean MenuParse_descY( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; - if (PC_ParseInt(&menu->descY)) + if (PC_ParseInt(&menu->descY)) { return qfalse; } @@ -791,11 +795,11 @@ qboolean MenuParse_descY( itemDef_t *item) MenuParse_descScale ================= */ -qboolean MenuParse_descScale( itemDef_t *item) +qboolean MenuParse_descScale( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; - if (PC_ParseFloat(&menu->descScale)) + if (PC_ParseFloat(&menu->descScale)) { return qfalse; } @@ -807,15 +811,15 @@ qboolean MenuParse_descScale( itemDef_t *item) MenuParse_descColor ================= */ -qboolean MenuParse_descColor( itemDef_t *item) +qboolean MenuParse_descColor( itemDef_t *item) { int i; float f; menuDef_t *menu = (menuDef_t*)item; - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { - if (PC_ParseFloat(&f)) + if (PC_ParseFloat(&f)) { return qfalse; } @@ -829,15 +833,15 @@ qboolean MenuParse_descColor( itemDef_t *item) MenuParse_disablecolor ================= */ -qboolean MenuParse_disablecolor( itemDef_t *item) +qboolean MenuParse_disablecolor( itemDef_t *item) { int i; float f; menuDef_t *menu = (menuDef_t*)item; - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { - if (PC_ParseFloat(&f)) + if (PC_ParseFloat(&f)) { return qfalse; } @@ -852,7 +856,7 @@ qboolean MenuParse_disablecolor( itemDef_t *item) MenuParse_outlinecolor ================= */ -qboolean MenuParse_outlinecolor( itemDef_t *item) +qboolean MenuParse_outlinecolor( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; @@ -868,12 +872,12 @@ qboolean MenuParse_outlinecolor( itemDef_t *item) MenuParse_background ================= */ -qboolean MenuParse_background( itemDef_t *item) +qboolean MenuParse_background( itemDef_t *item) { const char *buff; menuDef_t *menu = (menuDef_t*)item; - if (PC_ParseString(&buff)) + if (PC_ParseString(&buff)) { return qfalse; } @@ -887,11 +891,11 @@ qboolean MenuParse_background( itemDef_t *item) MenuParse_cinematic ================= */ -qboolean MenuParse_cinematic( itemDef_t *item) +qboolean MenuParse_cinematic( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; - if (!PC_ParseStringMem((const char **) &menu->window.cinematicName)) + if (!PC_ParseStringMem((const char **) &menu->window.cinematicName)) { return qfalse; } @@ -903,12 +907,12 @@ qboolean MenuParse_cinematic( itemDef_t *item) MenuParse_ownerdrawFlag ================= */ -qboolean MenuParse_ownerdrawFlag( itemDef_t *item) +qboolean MenuParse_ownerdrawFlag( itemDef_t *item) { int i; menuDef_t *menu = (menuDef_t*)item; - if (PC_ParseInt(&i)) + if (PC_ParseInt(&i)) { return qfalse; } @@ -921,11 +925,11 @@ qboolean MenuParse_ownerdrawFlag( itemDef_t *item) MenuParse_ownerdraw ================= */ -qboolean MenuParse_ownerdraw( itemDef_t *item) +qboolean MenuParse_ownerdraw( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; - if (PC_ParseInt(&menu->window.ownerDraw)) + if (PC_ParseInt(&menu->window.ownerDraw)) { return qfalse; } @@ -938,7 +942,7 @@ qboolean MenuParse_ownerdraw( itemDef_t *item) MenuParse_popup ================= */ -qboolean MenuParse_popup( itemDef_t *item) +qboolean MenuParse_popup( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; menu->window.flags |= WINDOW_POPUP; @@ -951,7 +955,7 @@ qboolean MenuParse_popup( itemDef_t *item) MenuParse_outOfBounds ================= */ -qboolean MenuParse_outOfBounds( itemDef_t *item) +qboolean MenuParse_outOfBounds( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; @@ -964,11 +968,11 @@ qboolean MenuParse_outOfBounds( itemDef_t *item) MenuParse_soundLoop ================= */ -qboolean MenuParse_soundLoop( itemDef_t *item) +qboolean MenuParse_soundLoop( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; - if (!PC_ParseStringMem((const char **) &menu->soundName)) + if (!PC_ParseStringMem((const char **) &menu->soundName)) { return qfalse; } @@ -980,11 +984,11 @@ qboolean MenuParse_soundLoop( itemDef_t *item) MenuParse_fadeClamp ================ */ -qboolean MenuParse_fadeClamp( itemDef_t *item) +qboolean MenuParse_fadeClamp( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; - if (PC_ParseFloat(&menu->fadeClamp)) + if (PC_ParseFloat(&menu->fadeClamp)) { return qfalse; } @@ -996,11 +1000,11 @@ qboolean MenuParse_fadeClamp( itemDef_t *item) MenuParse_fadeAmount ================ */ -qboolean MenuParse_fadeAmount( itemDef_t *item) +qboolean MenuParse_fadeAmount( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; - if (PC_ParseFloat(&menu->fadeAmount)) + if (PC_ParseFloat(&menu->fadeAmount)) { return qfalse; } @@ -1013,11 +1017,11 @@ qboolean MenuParse_fadeAmount( itemDef_t *item) MenuParse_fadeCycle ================ */ -qboolean MenuParse_fadeCycle( itemDef_t *item) +qboolean MenuParse_fadeCycle( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; - if (PC_ParseInt(&menu->fadeCycle)) + if (PC_ParseInt(&menu->fadeCycle)) { return qfalse; } @@ -1030,14 +1034,14 @@ qboolean MenuParse_fadeCycle( itemDef_t *item) MenuParse_itemDef ================ */ -qboolean MenuParse_itemDef( itemDef_t *item) +qboolean MenuParse_itemDef( itemDef_t *item) { menuDef_t *menu = (menuDef_t*)item; - if (menu->itemCount < MAX_MENUITEMS) + if (menu->itemCount < MAX_MENUITEMS) { menu->items[menu->itemCount] = (struct itemDef_s *) UI_Alloc(sizeof(itemDef_t)); Item_Init(menu->items[menu->itemCount]); - if (!Item_Parse(menu->items[menu->itemCount])) + if (!Item_Parse(menu->items[menu->itemCount])) { return qfalse; } @@ -1109,7 +1113,7 @@ keywordHash_t *menuParseKeywordHash[KEYWORDHASH_SIZE]; KeywordHash_Key ================ */ -int KeywordHash_Key(const char *keyword) +int KeywordHash_Key(const char *keyword) { int register hash, i; @@ -1129,7 +1133,7 @@ int KeywordHash_Key(const char *keyword) KeywordHash_Add ================ */ -void KeywordHash_Add(keywordHash_t *table[], keywordHash_t *key) +void KeywordHash_Add(keywordHash_t *table[], keywordHash_t *key) { int hash; @@ -1149,7 +1153,7 @@ keywordHash_t *KeywordHash_Find(keywordHash_t *table[], const char *keyword) int hash; hash = KeywordHash_Key(keyword); - for (key = table[hash]; key; key = key->next) + for (key = table[hash]; key; key = key->next) { if (!Q_stricmp(key->keyword, keyword)) return key; @@ -1164,18 +1168,18 @@ hashForString return a hash value for the string ================ */ -static long hashForString(const char *str) +static unsigned hashForString(const char *str) { int i; - long hash; + unsigned hash; char letter; hash = 0; i = 0; - while (str[i] != '\0') + while (str[i] != '\0') { letter = tolower((unsigned char)str[i]); - hash+=(long)(letter)*(i+119); + hash += (unsigned)(letter)*(i + 119); i++; } hash &= (HASH_TABLE_SIZE-1); @@ -1187,19 +1191,19 @@ static long hashForString(const char *str) String_Alloc ================= */ -const char *String_Alloc(const char *p) +const char *String_Alloc(const char *p) { int len; - long hash; + unsigned hash; stringDef_t *str, *last; static const char *staticNULL = ""; - if (p == NULL) + if (p == NULL) { return NULL; } - if (*p == 0) + if (*p == 0) { return staticNULL; } @@ -1207,9 +1211,9 @@ const char *String_Alloc(const char *p) hash = hashForString(p); str = strHandle[hash]; - while (str) + while (str) { - if (strcmp(p, str->str) == 0) + if (strcmp(p, str->str) == 0) { return str->str; } @@ -1217,7 +1221,7 @@ const char *String_Alloc(const char *p) } len = strlen(p); - if (len + strPoolIndex + 1 < STRING_POOL_SIZE) + if (len + strPoolIndex + 1 < STRING_POOL_SIZE) { int ph = strPoolIndex; strcpy(&strPool[strPoolIndex], p); @@ -1225,7 +1229,7 @@ const char *String_Alloc(const char *p) str = strHandle[hash]; last = str; - while (last && last->next) + while (last && last->next) { last = last->next; } @@ -1233,11 +1237,11 @@ const char *String_Alloc(const char *p) str = (stringDef_s *) UI_Alloc( sizeof(stringDef_t)); str->next = NULL; str->str = &strPool[ph]; - if (last) + if (last) { last->next = str; - } - else + } + else { strHandle[hash] = str; } @@ -1248,7 +1252,7 @@ const char *String_Alloc(const char *p) { Com_Printf("WARNING: Ran out of strPool space\n"); } - + return NULL; } @@ -1257,7 +1261,7 @@ const char *String_Alloc(const char *p) String_Report ================= */ -void String_Report(void) +void String_Report(void) { float f; Com_Printf("Memory/String Pool Info\n"); @@ -1277,11 +1281,11 @@ void String_Report(void) String_Init ================= */ -void String_Init(void) +void String_Init(void) { int i; - for (i = 0; i < HASH_TABLE_SIZE; i++) + for (i = 0; i < HASH_TABLE_SIZE; i++) { strHandle[i] = 0; } @@ -1292,7 +1296,7 @@ void String_Init(void) Item_SetupKeywordHash(); Menu_SetupKeywordHash(); - if (DC && DC->getBindingBuf) + if (DC && DC->getBindingBuf) { Controls_GetConfig(); } @@ -1308,15 +1312,15 @@ void String_Init(void) =============== UI_Alloc =============== -*/ +*/ void *UI_Alloc( int size ) { - char *p; + char *p; - if ( allocPoint + size > MEM_POOL_SIZE ) + if ( allocPoint + size > MEM_POOL_SIZE ) { outOfMemory = qtrue; - if (DC->Print) + if (DC->Print) { DC->Print("UI_Alloc: Failure. Out of memory!\n"); } @@ -1335,7 +1339,7 @@ void *UI_Alloc( int size ) UI_InitMemory =============== */ -void UI_InitMemory( void ) +void UI_InitMemory( void ) { allocPoint = 0; outOfMemory = qfalse; @@ -1347,12 +1351,12 @@ void UI_InitMemory( void ) Menu_ItemsMatchingGroup =============== */ -int Menu_ItemsMatchingGroup(menuDef_t *menu, const char *name) +int Menu_ItemsMatchingGroup(menuDef_t *menu, const char *name) { int i; int count = 0; - for (i = 0; i < menu->itemCount; i++) + for (i = 0; i < menu->itemCount; i++) { if ((!menu->items[i]->window.name) && (!menu->items[i]->window.group)) { @@ -1360,10 +1364,10 @@ int Menu_ItemsMatchingGroup(menuDef_t *menu, const char *name) continue; } - if (Q_stricmp(menu->items[i]->window.name, name) == 0 || (menu->items[i]->window.group && Q_stricmp(menu->items[i]->window.group, name) == 0)) + if (Q_stricmp(menu->items[i]->window.name, name) == 0 || (menu->items[i]->window.group && Q_stricmp(menu->items[i]->window.group, name) == 0)) { count++; - } + } } return count; @@ -1374,20 +1378,20 @@ int Menu_ItemsMatchingGroup(menuDef_t *menu, const char *name) Menu_GetMatchingItemByNumber =============== */ -itemDef_t *Menu_GetMatchingItemByNumber(menuDef_t *menu, int index, const char *name) +itemDef_t *Menu_GetMatchingItemByNumber(menuDef_t *menu, int index, const char *name) { int i; int count = 0; - for (i = 0; i < menu->itemCount; i++) + for (i = 0; i < menu->itemCount; i++) { - if (Q_stricmp(menu->items[i]->window.name, name) == 0 || (menu->items[i]->window.group && Q_stricmp(menu->items[i]->window.group, name) == 0)) + if (Q_stricmp(menu->items[i]->window.name, name) == 0 || (menu->items[i]->window.group && Q_stricmp(menu->items[i]->window.group, name) == 0)) { - if (count == index) + if (count == index) { return menu->items[i]; } count++; - } + } } return NULL; } @@ -1397,22 +1401,22 @@ itemDef_t *Menu_GetMatchingItemByNumber(menuDef_t *menu, int index, const char * Menu_FadeItemByName =============== */ -void Menu_FadeItemByName(menuDef_t *menu, const char *p, qboolean fadeOut) +void Menu_FadeItemByName(menuDef_t *menu, const char *p, qboolean fadeOut) { itemDef_t *item; int i; int count = Menu_ItemsMatchingGroup(menu, p); - for (i = 0; i < count; i++) + for (i = 0; i < count; i++) { item = Menu_GetMatchingItemByNumber(menu, i, p); - if (item != NULL) + if (item != NULL) { - if (fadeOut) + if (fadeOut) { item->window.flags |= (WINDOW_FADINGOUT | WINDOW_VISIBLE); item->window.flags &= ~WINDOW_FADINGIN; - } - else + } + else { item->window.flags |= (WINDOW_VISIBLE | WINDOW_FADINGIN); item->window.flags &= ~WINDOW_FADINGOUT; @@ -1426,7 +1430,7 @@ void Menu_FadeItemByName(menuDef_t *menu, const char *p, qboolean fadeOut) Menu_ShowItemByName =============== */ -void Menu_ShowItemByName(menuDef_t *menu, const char *p, qboolean bShow) +void Menu_ShowItemByName(menuDef_t *menu, const char *p, qboolean bShow) { itemDef_t *item; int i; @@ -1439,20 +1443,20 @@ void Menu_ShowItemByName(menuDef_t *menu, const char *p, qboolean bShow) Com_Printf(S_COLOR_YELLOW"WARNING: Menu_ShowItemByName - unable to locate any items named: \"%s\"\n",p); } - for (i = 0; i < count; i++) + for (i = 0; i < count; i++) { item = Menu_GetMatchingItemByNumber(menu, i, p); - if (item != NULL) + if (item != NULL) { - if (bShow) + if (bShow) { item->window.flags |= WINDOW_VISIBLE; - } - else + } + else { item->window.flags &= ~(WINDOW_VISIBLE | WINDOW_HASFOCUS); // stop cinematics playing in the window - if (item->window.cinematic >= 0) + if (item->window.cinematic >= 0) { DC->stopCinematic(item->window.cinematic); item->window.cinematic = -1; @@ -1467,13 +1471,13 @@ void Menu_ShowItemByName(menuDef_t *menu, const char *p, qboolean bShow) Menu_GetFocused =============== */ -menuDef_t *Menu_GetFocused(void) +menuDef_t *Menu_GetFocused(void) { int i; - for (i = 0; i < menuCount; i++) + for (i = 0; i < menuCount; i++) { - if ((Menus[i].window.flags & WINDOW_HASFOCUS) && (Menus[i].window.flags & WINDOW_VISIBLE)) + if ((Menus[i].window.flags & WINDOW_HASFOCUS) && (Menus[i].window.flags & WINDOW_VISIBLE)) { return &Menus[i]; } @@ -1487,7 +1491,7 @@ menuDef_t *Menu_GetFocused(void) Menus_OpenByName =============== */ -void Menus_OpenByName(const char *p) +void Menus_OpenByName(const char *p) { Menus_ActivateByName(p); } @@ -1497,15 +1501,15 @@ void Menus_OpenByName(const char *p) Menus_FindByName =============== */ -menuDef_t *Menus_FindByName(const char *p) +menuDef_t *Menus_FindByName(const char *p) { int i; - for (i = 0; i < menuCount; i++) + for (i = 0; i < menuCount; i++) { - if (Q_stricmp(Menus[i].window.name, p) == 0) + if (Q_stricmp(Menus[i].window.name, p) == 0) { return &Menus[i]; - } + } } return NULL; } @@ -1515,9 +1519,9 @@ menuDef_t *Menus_FindByName(const char *p) Menu_RunCloseScript =============== */ -static void Menu_RunCloseScript(menuDef_t *menu) +static void Menu_RunCloseScript(menuDef_t *menu) { - if (menu && menu->window.flags & WINDOW_VISIBLE && menu->onClose) + if (menu && menu->window.flags & WINDOW_VISIBLE && menu->onClose) { itemDef_t item; item.parent = menu; @@ -1530,16 +1534,16 @@ static void Menu_RunCloseScript(menuDef_t *menu) Item_ActivateByName =============== */ -void Item_ActivateByName(const char *menuName,const char *itemName) +void Item_ActivateByName(const char *menuName,const char *itemName) { itemDef_t *item; menuDef_t *menu; - + menu = Menus_FindByName(menuName); item = (itemDef_s *) Menu_FindItemByName((menuDef_t *) menu, itemName); - if (item != NULL) + if (item != NULL) { item->window.flags &= ~WINDOW_INACTIVE; } @@ -1550,12 +1554,12 @@ void Item_ActivateByName(const char *menuName,const char *itemName) Menus_CloseByName =============== */ -void Menus_CloseByName(const char *p) +void Menus_CloseByName(const char *p) { menuDef_t *menu = Menus_FindByName(p); - + // If the menu wasnt found just exit - if (menu == NULL) + if (menu == NULL) { return; } @@ -1565,7 +1569,7 @@ void Menus_CloseByName(const char *p) // If this window had the focus then take it away if ( menu->window.flags & WINDOW_HASFOCUS ) - { + { // If there is something still in the open menu list then // set it to have focus now if ( openMenuCount ) @@ -1591,17 +1595,17 @@ void Menus_CloseByName(const char *p) Menu_FindItemByName =============== */ -itemDef_t *Menu_FindItemByName(menuDef_t *menu, const char *p) +itemDef_t *Menu_FindItemByName(menuDef_t *menu, const char *p) { int i; - if (menu == NULL || p == NULL) + if (menu == NULL || p == NULL) { return NULL; } - for (i = 0; i < menu->itemCount; i++) + for (i = 0; i < menu->itemCount; i++) { - if (Q_stricmp(p, menu->items[i]->window.name) == 0) + if (Q_stricmp(p, menu->items[i]->window.name) == 0) { return menu->items[i]; } @@ -1615,32 +1619,32 @@ itemDef_t *Menu_FindItemByName(menuDef_t *menu, const char *p) Menu_ClearFocus ================= */ -itemDef_t *Menu_ClearFocus(menuDef_t *menu) +itemDef_t *Menu_ClearFocus(menuDef_t *menu) { int i; itemDef_t *ret = NULL; - if (menu == NULL) + if (menu == NULL) { return NULL; } - for (i = 0; i < menu->itemCount; i++) + for (i = 0; i < menu->itemCount; i++) { - if (menu->items[i]->window.flags & WINDOW_HASFOCUS) + if (menu->items[i]->window.flags & WINDOW_HASFOCUS) { ret = menu->items[i]; menu->items[i]->window.flags &= ~WINDOW_HASFOCUS; - if (menu->items[i]->leaveFocus) + if (menu->items[i]->leaveFocus) { Item_RunScript(menu->items[i], menu->items[i]->leaveFocus); } - } + } } return ret; } // Set all the items within a given menu, with the given itemName, to the given shader -void Menu_SetItemBackground(const menuDef_t *menu,const char *itemName, const char *background) +void Menu_SetItemBackground(const menuDef_t *menu,const char *itemName, const char *background) { itemDef_t *item; int j, count; @@ -1652,10 +1656,10 @@ void Menu_SetItemBackground(const menuDef_t *menu,const char *itemName, const ch count = Menu_ItemsMatchingGroup( (menuDef_t *) menu, itemName); - for (j = 0; j < count; j++) + for (j = 0; j < count; j++) { item = Menu_GetMatchingItemByNumber( (menuDef_t *) menu, j, itemName); - if (item != NULL) + if (item != NULL) { // item->window.background = DC->registerShaderNoMip(background); item->window.background = ui.R_RegisterShaderNoMip(background); @@ -1664,7 +1668,7 @@ void Menu_SetItemBackground(const menuDef_t *menu,const char *itemName, const ch } // Set all the items within a given menu, with the given itemName, to the given text -void Menu_SetItemText(const menuDef_t *menu,const char *itemName, const char *text) +void Menu_SetItemText(const menuDef_t *menu,const char *itemName, const char *text) { itemDef_t *item; int j, count; @@ -1676,10 +1680,10 @@ void Menu_SetItemText(const menuDef_t *menu,const char *itemName, const char *te count = Menu_ItemsMatchingGroup( (menuDef_t *) menu, itemName); - for (j = 0; j < count; j++) + for (j = 0; j < count; j++) { item = Menu_GetMatchingItemByNumber( (menuDef_t *) menu, j, itemName); - if (item != NULL) + if (item != NULL) { if (text[0] == '*') { @@ -1706,7 +1710,7 @@ void Menu_SetItemText(const menuDef_t *menu,const char *itemName, const char *te scrollPtr->endPos = 0; } - if (item->cvar) + if (item->cvar) { DC->getCVarString(item->cvar, cvartext, sizeof(cvartext)); item->text = cvartext; @@ -1732,15 +1736,15 @@ void Menu_SetItemText(const menuDef_t *menu,const char *itemName, const char *te Menu_TransitionItemByName ================= */ -void Menu_TransitionItemByName(menuDef_t *menu, const char *p, const rectDef_t *rectFrom, const rectDef_t *rectTo, int time, float amt) +void Menu_TransitionItemByName(menuDef_t *menu, const char *p, const rectDef_t *rectFrom, const rectDef_t *rectTo, int time, float amt) { itemDef_t *item; int i; int count = Menu_ItemsMatchingGroup(menu, p); - for (i = 0; i < count; i++) + for (i = 0; i < count; i++) { item = Menu_GetMatchingItemByNumber(menu, i, p); - if (item != NULL) + if (item != NULL) { if (!rectFrom) { @@ -1775,10 +1779,10 @@ void Menu_Transition3ItemByName(menuDef_t *menu, const char *p, const float minx int i; int count = Menu_ItemsMatchingGroup(menu, p); modelDef_t * modelptr; - for (i = 0; i < count; i++) + for (i = 0; i < count; i++) { item = Menu_GetMatchingItemByNumber(menu, i, p); - if (item != NULL) + if (item != NULL) { if ( item->type == ITEM_TYPE_MODEL) { @@ -1807,12 +1811,12 @@ void Menu_Transition3ItemByName(menuDef_t *menu, const char *p, const float minx modelptr->g2minsEffect[0] = abs(modelptr->g2mins2[0] - modelptr->g2mins[0]) / amt; modelptr->g2minsEffect[1] = abs(modelptr->g2mins2[1] - modelptr->g2mins[1]) / amt; modelptr->g2minsEffect[2] = abs(modelptr->g2mins2[2] - modelptr->g2mins[2]) / amt; - + modelptr->fov_Effectx = abs(modelptr->fov_x2 - modelptr->fov_x) / amt; modelptr->fov_Effecty = abs(modelptr->fov_y2 - modelptr->fov_y) / amt; } - + } } } @@ -1827,15 +1831,15 @@ void Menu_Transition3ItemByName(menuDef_t *menu, const char *p, const float minx Menu_OrbitItemByName ================= */ -void Menu_OrbitItemByName(menuDef_t *menu, const char *p, float x, float y, float cx, float cy, int time) +void Menu_OrbitItemByName(menuDef_t *menu, const char *p, float x, float y, float cx, float cy, int time) { itemDef_t *item; int i; int count = Menu_ItemsMatchingGroup(menu, p); - for (i = 0; i < count; i++) + for (i = 0; i < count; i++) { item = Menu_GetMatchingItemByNumber(menu, i, p); - if (item != NULL) + if (item != NULL) { item->window.flags |= (WINDOW_ORBITING | WINDOW_VISIBLE); item->window.offsetTime = time; @@ -1853,15 +1857,15 @@ void Menu_OrbitItemByName(menuDef_t *menu, const char *p, float x, float y, floa Rect_Parse ================= */ -qboolean Rect_Parse(const char **p, rectDef_t *r) +qboolean Rect_Parse(const char **p, rectDef_t *r) { - if (!COM_ParseFloat(p, &r->x)) + if (!COM_ParseFloat(p, &r->x)) { - if (!COM_ParseFloat(p, &r->y)) + if (!COM_ParseFloat(p, &r->y)) { - if (!COM_ParseFloat(p, &r->w)) + if (!COM_ParseFloat(p, &r->w)) { - if (!COM_ParseFloat(p, &r->h)) + if (!COM_ParseFloat(p, &r->h)) { return qtrue; } @@ -1871,37 +1875,37 @@ qboolean Rect_Parse(const char **p, rectDef_t *r) return qfalse; } -qboolean Script_SetItemRect(itemDef_t *item, const char **args) +qboolean Script_SetItemRect(itemDef_t *item, const char **args) { const char *itemname; rectDef_t *out; rectDef_t rect; // expecting type of color to set and 4 args for the color - if (String_Parse(args, &itemname)) + if (String_Parse(args, &itemname)) { itemDef_t *item2; int j; int count = Menu_ItemsMatchingGroup((menuDef_t *) item->parent, itemname); - if (!Rect_Parse(args, &rect)) + if (!Rect_Parse(args, &rect)) { return qtrue; } - for (j = 0; j < count; j++) + for (j = 0; j < count; j++) { item2 = Menu_GetMatchingItemByNumber((menuDef_t *) item->parent, j, itemname); - if (item2 != NULL) + if (item2 != NULL) { out = &item2->window.rect; - if (out) + if (out) { item2->window.rect.x = rect.x; item2->window.rect.y = rect.y; item2->window.rect.w = rect.w; - item2->window.rect.h = rect.h; + item2->window.rect.h = rect.h; } } } @@ -1914,13 +1918,13 @@ qboolean Script_SetItemRect(itemDef_t *item, const char **args) Script_SetItemBackground ================= */ -qboolean Script_SetItemBackground(itemDef_t *item, const char **args) +qboolean Script_SetItemBackground(itemDef_t *item, const char **args) { const char *itemName; const char *name; // expecting name of shader - if (String_Parse(args, &itemName) && String_Parse(args, &name)) + if (String_Parse(args, &itemName) && String_Parse(args, &name)) { Menu_SetItemBackground((menuDef_t *) item->parent, itemName, name); } @@ -1932,13 +1936,13 @@ qboolean Script_SetItemBackground(itemDef_t *item, const char **args) Script_SetItemText ================= */ -qboolean Script_SetItemText(itemDef_t *item, const char **args) +qboolean Script_SetItemText(itemDef_t *item, const char **args) { const char *itemName; const char *text; // expecting text - if (String_Parse(args, &itemName) && String_Parse(args, &text)) + if (String_Parse(args, &itemName) && String_Parse(args, &text)) { Menu_SetItemText((menuDef_t *) item->parent, itemName, text); } @@ -1950,10 +1954,10 @@ qboolean Script_SetItemText(itemDef_t *item, const char **args) Script_FadeIn ================= */ -qboolean Script_FadeIn(itemDef_t *item, const char **args) +qboolean Script_FadeIn(itemDef_t *item, const char **args) { const char *name; - if (String_Parse(args, &name)) + if (String_Parse(args, &name)) { Menu_FadeItemByName((menuDef_t *) item->parent, name, qfalse); } @@ -1966,10 +1970,10 @@ qboolean Script_FadeIn(itemDef_t *item, const char **args) Script_FadeOut ================= */ -qboolean Script_FadeOut(itemDef_t *item, const char **args) +qboolean Script_FadeOut(itemDef_t *item, const char **args) { const char *name; - if (String_Parse(args, &name)) + if (String_Parse(args, &name)) { Menu_FadeItemByName((menuDef_t *) item->parent, name, qtrue); } @@ -1982,10 +1986,10 @@ qboolean Script_FadeOut(itemDef_t *item, const char **args) Script_Show ================= */ -qboolean Script_Show(itemDef_t *item, const char **args) +qboolean Script_Show(itemDef_t *item, const char **args) { const char *name; - if (String_Parse(args, &name)) + if (String_Parse(args, &name)) { Menu_ShowItemByName((menuDef_t *) item->parent, name, qtrue); } @@ -2000,10 +2004,10 @@ qboolean Script_Show(itemDef_t *item, const char **args) Script_ShowMenu ================= */ -qboolean Script_ShowMenu(itemDef_t *item, const char **args) +qboolean Script_ShowMenu(itemDef_t *item, const char **args) { const char *name; - if (String_Parse(args, &name)) + if (String_Parse(args, &name)) { Menus_ShowItems(name); } @@ -2017,10 +2021,10 @@ qboolean Script_ShowMenu(itemDef_t *item, const char **args) Script_Hide ================= */ -qboolean Script_Hide(itemDef_t *item, const char **args) +qboolean Script_Hide(itemDef_t *item, const char **args) { const char *name; - if (String_Parse(args, &name)) + if (String_Parse(args, &name)) { Menu_ShowItemByName((menuDef_t *) item->parent, name, qfalse); } @@ -2033,7 +2037,7 @@ qboolean Script_Hide(itemDef_t *item, const char **args) Script_SetColor ================= */ -qboolean Script_SetColor(itemDef_t *item, const char **args) +qboolean Script_SetColor(itemDef_t *item, const char **args) { const char *name; int i; @@ -2041,29 +2045,29 @@ qboolean Script_SetColor(itemDef_t *item, const char **args) vec4_t *out; // expecting type of color to set and 4 args for the color - if (String_Parse(args, &name)) + if (String_Parse(args, &name)) { out = NULL; - if (Q_stricmp(name, "backcolor") == 0) + if (Q_stricmp(name, "backcolor") == 0) { out = &item->window.backColor; item->window.flags |= WINDOW_BACKCOLORSET; - } - else if (Q_stricmp(name, "forecolor") == 0) + } + else if (Q_stricmp(name, "forecolor") == 0) { out = &item->window.foreColor; item->window.flags |= WINDOW_FORECOLORSET; - } - else if (Q_stricmp(name, "bordercolor") == 0) + } + else if (Q_stricmp(name, "bordercolor") == 0) { out = &item->window.borderColor; } - if (out) + if (out) { - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { -// if (!Float_Parse(args, &f)) +// if (!Float_Parse(args, &f)) if (COM_ParseFloat( args, &f)) { return qtrue; @@ -2081,10 +2085,10 @@ qboolean Script_SetColor(itemDef_t *item, const char **args) Script_Open ================= */ -qboolean Script_Open(itemDef_t *item, const char **args) +qboolean Script_Open(itemDef_t *item, const char **args) { const char *name; - if (String_Parse(args, &name)) + if (String_Parse(args, &name)) { Menus_OpenByName(name); } @@ -2092,7 +2096,7 @@ qboolean Script_Open(itemDef_t *item, const char **args) return qtrue; } -qboolean Script_OpenGoToMenu(itemDef_t *item, const char **args) +qboolean Script_OpenGoToMenu(itemDef_t *item, const char **args) { Menus_OpenByName(GoToMenu); // Give warning return qtrue; @@ -2104,10 +2108,10 @@ qboolean Script_OpenGoToMenu(itemDef_t *item, const char **args) Script_Close ================= */ -qboolean Script_Close(itemDef_t *item, const char **args) +qboolean Script_Close(itemDef_t *item, const char **args) { const char *name; - if (String_Parse(args, &name)) + if (String_Parse(args, &name)) { if (Q_stricmp(name, "all") == 0) { @@ -2127,13 +2131,13 @@ qboolean Script_Close(itemDef_t *item, const char **args) Script_Activate ================= */ -qboolean Script_Activate(itemDef_t *item, const char **args) +qboolean Script_Activate(itemDef_t *item, const char **args) { const char *name, *menu; - if (String_Parse(args, &menu)) + if (String_Parse(args, &menu)) { - if (String_Parse(args, &name)) + if (String_Parse(args, &name)) { Item_ActivateByName(menu,name); } @@ -2147,11 +2151,11 @@ qboolean Script_Activate(itemDef_t *item, const char **args) Script_SetBackground ================= */ -qboolean Script_SetBackground(itemDef_t *item, const char **args) +qboolean Script_SetBackground(itemDef_t *item, const char **args) { const char *name; // expecting name to set asset to - if (String_Parse(args, &name)) + if (String_Parse(args, &name)) { item->window.background = DC->registerShaderNoMip(name); } @@ -2164,14 +2168,14 @@ qboolean Script_SetBackground(itemDef_t *item, const char **args) Script_SetAsset ================= */ -qboolean Script_SetAsset(itemDef_t *item, const char **args) +qboolean Script_SetAsset(itemDef_t *item, const char **args) { const char *name; // expecting name to set asset to - if (String_Parse(args, &name)) + if (String_Parse(args, &name)) { - // check for a model - if (item->type == ITEM_TYPE_MODEL) + // check for a model + if (item->type == ITEM_TYPE_MODEL) { } } @@ -2184,26 +2188,26 @@ qboolean Script_SetAsset(itemDef_t *item, const char **args) Script_SetFocus ================= */ -qboolean Script_SetFocus(itemDef_t *item, const char **args) +qboolean Script_SetFocus(itemDef_t *item, const char **args) { const char *name; itemDef_t *focusItem; - if (String_Parse(args, &name)) + if (String_Parse(args, &name)) { focusItem = (itemDef_s *) Menu_FindItemByName((menuDef_t *) item->parent, name); - if (focusItem && !(focusItem->window.flags & WINDOW_DECORATION) && !(focusItem->window.flags & WINDOW_HASFOCUS)) + if (focusItem && !(focusItem->window.flags & WINDOW_DECORATION) && !(focusItem->window.flags & WINDOW_HASFOCUS)) { Menu_ClearFocus((menuDef_t *) item->parent); //JLF focusItem->window.flags |= WINDOW_HASFOCUS; //END JLF - if (focusItem->onFocus) + if (focusItem->onFocus) { Item_RunScript(focusItem, focusItem->onFocus); } - if (DC->Assets.itemFocusSound) + if (DC->Assets.itemFocusSound) { DC->startLocalSound( DC->Assets.itemFocusSound, CHAN_LOCAL_SOUND ); } @@ -2219,15 +2223,15 @@ qboolean Script_SetFocus(itemDef_t *item, const char **args) Script_SetItemFlag ================= */ -qboolean Script_SetItemFlag(itemDef_t *item, const char **args) +qboolean Script_SetItemFlag(itemDef_t *item, const char **args) { const char *itemName,*number; - - if (String_Parse(args, &itemName)) + + if (String_Parse(args, &itemName)) { item = (itemDef_s *) Menu_FindItemByName((menuDef_t *) item->parent, itemName); - if (String_Parse(args, &number)) + if (String_Parse(args, &number)) { int amount = atoi(number); item->window.flags |= amount; @@ -2243,10 +2247,10 @@ void UI_SetItemVisible(menuDef_t *menu,const char *itemname,qboolean visible) int j; int count = Menu_ItemsMatchingGroup(menu, itemname); - for (j = 0; j < count; j++) + for (j = 0; j < count; j++) { item = Menu_GetMatchingItemByNumber(menu, j, itemname); - if (item != NULL) + if (item != NULL) { if (visible==qtrue) { @@ -2267,29 +2271,29 @@ void UI_SetItemColor(itemDef_t *item,const char *itemname,const char *name,vec4_ vec4_t *out; int count = Menu_ItemsMatchingGroup((menuDef_t *) item->parent, itemname); - for (j = 0; j < count; j++) + for (j = 0; j < count; j++) { item2 = Menu_GetMatchingItemByNumber((menuDef_t *) item->parent, j, itemname); - if (item2 != NULL) + if (item2 != NULL) { out = NULL; - if (Q_stricmp(name, "backcolor") == 0) + if (Q_stricmp(name, "backcolor") == 0) { out = &item2->window.backColor; - } - else if (Q_stricmp(name, "forecolor") == 0) + } + else if (Q_stricmp(name, "forecolor") == 0) { out = &item2->window.foreColor; item2->window.flags |= WINDOW_FORECOLORSET; - } - else if (Q_stricmp(name, "bordercolor") == 0) + } + else if (Q_stricmp(name, "bordercolor") == 0) { out = &item2->window.borderColor; } - if (out) + if (out) { - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { (*out)[i] = color[i]; } @@ -2303,14 +2307,14 @@ void UI_SetItemColor(itemDef_t *item,const char *itemname,const char *name,vec4_ Script_SetItemColor ================= */ -qboolean Script_SetItemColor(itemDef_t *item, const char **args) +qboolean Script_SetItemColor(itemDef_t *item, const char **args) { const char *itemname; const char *name; vec4_t color; // expecting type of color to set and 4 args for the color - if (String_Parse(args, &itemname) && String_Parse(args, &name)) + if (String_Parse(args, &itemname) && String_Parse(args, &name)) { if (COM_ParseVec4(args, &color)) { @@ -2355,7 +2359,7 @@ qboolean Script_Defer ( itemDef_t* item, const char **args ) ================= Script_RunDeferred -Runs the last deferred script, there can only be one script deferred at a +Runs the last deferred script, there can only be one script deferred at a time so be careful of recursion ================= */ @@ -2406,16 +2410,16 @@ Script_Transition transition rtvscr 321 0 202 264 415 0 202 264 20 25 ================= */ -qboolean Script_Transition(itemDef_t *item, const char **args) +qboolean Script_Transition(itemDef_t *item, const char **args) { const char *name; rectDef_t rectFrom, rectTo; int time; float amt; - if (String_Parse(args, &name)) + if (String_Parse(args, &name)) { - if ( ParseRect(args, &rectFrom) && ParseRect(args, &rectTo) && Int_Parse(args, &time) && !COM_ParseFloat(args, &amt)) + if ( ParseRect(args, &rectFrom) && ParseRect(args, &rectTo) && Int_Parse(args, &time) && !COM_ParseFloat(args, &amt)) { Menu_TransitionItemByName((menuDef_t *) item->parent, name, &rectFrom, &rectTo, time, amt); } @@ -2437,16 +2441,16 @@ uses current origin instead of specifing a starting origin transition2 lfvscr 25 0 202 264 20 25 ================= */ -qboolean Script_Transition2(itemDef_t *item, const char **args) +qboolean Script_Transition2(itemDef_t *item, const char **args) { const char *name; rectDef_t rectTo; int time; float amt; - if (String_Parse(args, &name)) + if (String_Parse(args, &name)) { - if ( ParseRect(args, &rectTo) && Int_Parse(args, &time) && !COM_ParseFloat(args, &amt)) + if ( ParseRect(args, &rectTo) && Int_Parse(args, &time) && !COM_ParseFloat(args, &amt)) { Menu_TransitionItemByName((menuDef_t *) item->parent, name, 0, &rectTo, time, amt); } @@ -2472,27 +2476,27 @@ uses current origin instead of specifing a starting origin transition3 lfvscr (min extent) (max extent) (fovx,y) 20 25 ================= */ -qboolean Script_Transition3(itemDef_t *item, const char **args) +qboolean Script_Transition3(itemDef_t *item, const char **args) { - const char *name; - const char *value; + const char *name = NULL; + const char *value = NULL; float minx, miny, minz, maxx, maxy, maxz, fovtx, fovty; int time; float amt; - if (String_Parse(args, &name)) - { + if (String_Parse(args, &name)) + { if (String_Parse( args, &value)) { minx = atof(value); if (String_Parse( args, &value)) - { + { miny = atof(value); if (String_Parse( args, &value)) { minz = atof(value); if (String_Parse( args, &value)) - { + { maxx = atof(value); if (String_Parse( args, &value)) { @@ -2504,23 +2508,23 @@ qboolean Script_Transition3(itemDef_t *item, const char **args) { fovtx = atof(value); if (String_Parse( args, &value)) - { + { fovty = atof(value); - + if (String_Parse( args, &value)) - { + { time = atoi(value); if (String_Parse( args, &value)) - { + { amt = atof(value); //set up the variables - Menu_Transition3ItemByName((menuDef_t *) item->parent, + Menu_Transition3ItemByName((menuDef_t *) item->parent, name, minx, miny, minz, - maxx, maxy, maxz, + maxx, maxy, maxz, fovtx, fovty, time, amt); - + return qtrue; } } @@ -2533,7 +2537,9 @@ qboolean Script_Transition3(itemDef_t *item, const char **args) } } } - Com_Printf(S_COLOR_YELLOW"WARNING: Script_Transition2: error parsing '%s'\n", name ); + if ( name ) { + Com_Printf( S_COLOR_YELLOW "WARNING: Script_Transition2: error parsing '%s'\n", name ); + } return qtrue; } #endif @@ -2545,18 +2551,18 @@ int GetCurrentFeederIndex(itemDef_t * item) float feederID = item->special; const char * name; int i, max; - - if (feederID == FEEDER_PLAYER_SPECIES) + + if (feederID == FEEDER_PLAYER_SPECIES) { return uiInfo.playerSpeciesIndex; - } - if (feederID == FEEDER_PLAYER_SKIN_HEAD) + } + if (feederID == FEEDER_PLAYER_SKIN_HEAD) { name = Cvar_VariableString("ui_char_skin_head"); max = uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadCount; for ( i = 0; i < max ; i++) { - if (!Q_stricmp(name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadNames[i])) + if (!Q_stricmp(name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHead[i].name)) { return i; } @@ -2564,29 +2570,29 @@ int GetCurrentFeederIndex(itemDef_t * item) // Cvar_Set("ui_char_skin_head", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadNames[index]); } return -1; - } - else if (feederID == FEEDER_PLAYER_SKIN_TORSO) + } + else if (feederID == FEEDER_PLAYER_SKIN_TORSO) { name = Cvar_VariableString("ui_char_skin_torso"); max = uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoCount; for ( i = 0; i < max ; i++) { - if (!Q_stricmp(name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoNames[i])) + if (!Q_stricmp(name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorso[i].name)) { return i; } // Cvar_Set("ui_char_skin_head", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadNames[index]); } return -1; - - } - else if (feederID == FEEDER_PLAYER_SKIN_LEGS) + + } + else if (feederID == FEEDER_PLAYER_SKIN_LEGS) { name = Cvar_VariableString("ui_char_skin_legs"); max = uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegCount; for ( i = 0; i < max ; i++) { - if (!Q_stricmp(name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegNames[i])) + if (!Q_stricmp(name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLeg[i].name)) { return i; } @@ -2599,9 +2605,9 @@ int GetCurrentFeederIndex(itemDef_t * item) // { // Cvar_Set("ui_char_skin_legs", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegNames[index]); // } - } + } + - else if (feederID == FEEDER_COLORCHOICES) { extern void Item_RunScript(itemDef_t *item, const char *s); //from ui_shared; @@ -2609,11 +2615,11 @@ int GetCurrentFeederIndex(itemDef_t * item) currR = Cvar_VariableIntegerValue( "ui_char_color_red"); currG = Cvar_VariableIntegerValue( "ui_char_color_green"); currB = Cvar_VariableIntegerValue( "ui_char_color_blue"); - + max = uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorCount; for ( i = 0; i < max ; i++) { - Item_RunScript(item, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorActionText[i]); + Item_RunScript(item, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color[i].actionText); newR = Cvar_VariableIntegerValue( "ui_char_color_red"); newG = Cvar_VariableIntegerValue( "ui_char_color_green"); newB = Cvar_VariableIntegerValue( "ui_char_color_blue"); @@ -2622,7 +2628,7 @@ int GetCurrentFeederIndex(itemDef_t * item) } return -1; - + //JLF junk copied code /* @@ -2659,7 +2665,7 @@ extern void Item_RunScript(itemDef_t *item, const char *s); //from ui_shared; qboolean Script_IncrementFeeder(itemDef_t * item, const char ** args) { - + int feedercount = uiInfo.uiDC.feederCount(item->special); int value = GetCurrentFeederIndex(item); value++; @@ -2671,7 +2677,7 @@ qboolean Script_IncrementFeeder(itemDef_t * item, const char ** args) qboolean Script_DecrementFeeder(itemDef_t * item, const char ** args) { - + int feedercount = uiInfo.uiDC.feederCount(item->special); int value = GetCurrentFeederIndex(item); value--; @@ -2679,7 +2685,7 @@ qboolean Script_DecrementFeeder(itemDef_t * item, const char ** args) value = feedercount-1; DC->feederSelection(item->special, value, item); return qtrue; -} +} /* @@ -2687,10 +2693,10 @@ qboolean Script_DecrementFeeder(itemDef_t * item, const char ** args) Script_SetCvar ================= */ -qboolean Script_SetCvar(itemDef_t *item, const char **args) +qboolean Script_SetCvar(itemDef_t *item, const char **args) { const char *cvar, *val; - if (String_Parse(args, &cvar) && String_Parse(args, &val)) + if (String_Parse(args, &cvar) && String_Parse(args, &val)) { if(!Q_stricmp(val,"(NULL)")) { @@ -2709,10 +2715,10 @@ qboolean Script_SetCvar(itemDef_t *item, const char **args) Script_Exec ================= */ -qboolean Script_Exec ( itemDef_t *item, const char **args) +qboolean Script_Exec ( itemDef_t *item, const char **args) { const char *val; - if (String_Parse(args, &val)) + if (String_Parse(args, &val)) { DC->executeText(EXEC_APPEND, va("%s ; ", val)); } @@ -2725,10 +2731,10 @@ qboolean Script_Exec ( itemDef_t *item, const char **args) Script_Play ================= */ -static qboolean Script_Play(itemDef_t *item, const char **args) +static qboolean Script_Play(itemDef_t *item, const char **args) { const char *val; - if (String_Parse(args, &val)) + if (String_Parse(args, &val)) { DC->startLocalSound(DC->registerSound(val, qfalse), CHAN_AUTO ); } @@ -2741,10 +2747,10 @@ static qboolean Script_Play(itemDef_t *item, const char **args) Script_PlayVoice ================= */ -static qboolean Script_PlayVoice(itemDef_t *item, const char **args) +static qboolean Script_PlayVoice(itemDef_t *item, const char **args) { const char *val; - if (String_Parse(args, &val)) + if (String_Parse(args, &val)) { DC->startLocalSound(DC->registerSound(val, qfalse), CHAN_VOICE ); } @@ -2757,7 +2763,7 @@ static qboolean Script_PlayVoice(itemDef_t *item, const char **args) Script_StopVoice ================= */ -static qboolean Script_StopVoice(itemDef_t *item, const char **args) +static qboolean Script_StopVoice(itemDef_t *item, const char **args) { DC->startLocalSound(uiInfo.uiDC.Assets.nullSound, CHAN_VOICE ); @@ -2770,10 +2776,10 @@ Script_playLooped ================= */ /* -qboolean Script_playLooped(itemDef_t *item, const char **args) +qboolean Script_playLooped(itemDef_t *item, const char **args) { const char *val; - if (String_Parse(args, &val)) + if (String_Parse(args, &val)) { // FIXME BOB - is this needed? DC->stopBackgroundTrack(); @@ -2789,16 +2795,16 @@ qboolean Script_playLooped(itemDef_t *item, const char **args) Script_Orbit ================= */ -qboolean Script_Orbit(itemDef_t *item, const char **args) +qboolean Script_Orbit(itemDef_t *item, const char **args) { const char *name; float cx, cy, x, y; int time; - if (String_Parse(args, &name)) + if (String_Parse(args, &name)) { -// if ( Float_Parse(args, &x) && Float_Parse(args, &y) && Float_Parse(args, &cx) && Float_Parse(args, &cy) && Int_Parse(args, &time) ) - if ( !COM_ParseFloat(args, &x) && !COM_ParseFloat(args, &y) && !COM_ParseFloat(args, &cx) && !COM_ParseFloat(args, &cy) && Int_Parse(args, &time) ) +// if ( Float_Parse(args, &x) && Float_Parse(args, &y) && Float_Parse(args, &cx) && Float_Parse(args, &cy) && Int_Parse(args, &time) ) + if ( !COM_ParseFloat(args, &x) && !COM_ParseFloat(args, &y) && !COM_ParseFloat(args, &cx) && !COM_ParseFloat(args, &cy) && Int_Parse(args, &time) ) { Menu_OrbitItemByName((menuDef_t *) item->parent, name, x, y, cx, cy, time); } @@ -2809,7 +2815,7 @@ qboolean Script_Orbit(itemDef_t *item, const char **args) commandDef_t commandList[] = -{ +{ {"activate", &Script_Activate}, // menu {"close", &Script_Close}, // menu {"exec", &Script_Exec}, // group/name @@ -2817,7 +2823,7 @@ commandDef_t commandList[] = {"fadeout", &Script_FadeOut}, // group/name {"hide", &Script_Hide}, // group/name {"open", &Script_Open}, // menu - {"openGoToMenu", &Script_OpenGoToMenu}, // + {"openGoToMenu", &Script_OpenGoToMenu}, // {"orbit", &Script_Orbit}, // group/name {"play", &Script_Play}, // group/name {"playVoice", &Script_PlayVoice}, // group/name @@ -2837,7 +2843,7 @@ commandDef_t commandList[] = {"setitembackground", &Script_SetItemBackground}, // group/name {"setitemtext", &Script_SetItemText}, // group/name {"setitemrect", &Script_SetItemRect}, // group/name - {"defer", &Script_Defer}, // + {"defer", &Script_Defer}, // {"rundeferred", &Script_RunDeferred}, // {"delay", &Script_Delay}, // works on this (script) {"transition3", &Script_Transition3}, // model exclusive transition @@ -2850,10 +2856,10 @@ int scriptCommandCount = sizeof(commandList) / sizeof(commandDef_t); /* =============== -Item_Init +Item_Init =============== */ -void Item_Init(itemDef_t *item) +void Item_Init(itemDef_t *item) { memset(item, 0, sizeof(itemDef_t)); item->textscale = 0.55f; @@ -2862,18 +2868,18 @@ void Item_Init(itemDef_t *item) /* =============== -Item_Multi_Setting +Item_Multi_Setting =============== */ -const char *Item_Multi_Setting(itemDef_t *item) +const char *Item_Multi_Setting(itemDef_t *item) { char buff[1024]; float value = 0; int i; multiDef_t *multiPtr = (multiDef_t*)item->typeData; - if (multiPtr) + if (multiPtr) { - if (multiPtr->strDef) + if (multiPtr->strDef) { if (item->cvar) { @@ -2883,8 +2889,8 @@ const char *Item_Multi_Setting(itemDef_t *item) { } - } - else + } + else { if (item->cvar) // Was a cvar given? { @@ -2896,18 +2902,18 @@ const char *Item_Multi_Setting(itemDef_t *item) } } - for (i = 0; i < multiPtr->count; i++) + for (i = 0; i < multiPtr->count; i++) { - if (multiPtr->strDef) + if (multiPtr->strDef) { - if (Q_stricmp(buff, multiPtr->cvarStr[i]) == 0) + if (Q_stricmp(buff, multiPtr->cvarStr[i]) == 0) { return multiPtr->cvarList[i]; } - } - else + } + else { - if (multiPtr->cvarValue[i] == value) + if (multiPtr->cvarValue[i] == value) { return multiPtr->cvarList[i]; } @@ -2924,13 +2930,13 @@ const char *Item_Multi_Setting(itemDef_t *item) /* =============== -ItemParse_name +ItemParse_name name =============== */ -qboolean ItemParse_name( itemDef_t *item) +qboolean ItemParse_name( itemDef_t *item) { - if (!PC_ParseStringMem((const char **)&item->window.name)) + if (!PC_ParseStringMem((const char **)&item->window.name)) { return qfalse; } @@ -2940,9 +2946,9 @@ qboolean ItemParse_name( itemDef_t *item) -qboolean ItemParse_font( itemDef_t *item ) +qboolean ItemParse_font( itemDef_t *item ) { - if (PC_ParseInt(&item->font)) + if (PC_ParseInt(&item->font)) { return qfalse; } @@ -2952,15 +2958,15 @@ qboolean ItemParse_font( itemDef_t *item ) /* =============== -ItemParse_focusSound +ItemParse_focusSound name =============== */ -qboolean ItemParse_focusSound( itemDef_t *item) +qboolean ItemParse_focusSound( itemDef_t *item) { const char *temp; - if (PC_ParseString(&temp)) + if (PC_ParseString(&temp)) { return qfalse; } @@ -2970,12 +2976,12 @@ qboolean ItemParse_focusSound( itemDef_t *item) /* =============== -ItemParse_text +ItemParse_text text =============== */ -qboolean ItemParse_text( itemDef_t *item) -{ +qboolean ItemParse_text( itemDef_t *item) +{ if (!PC_ParseStringMem((const char **) &item->text)) { return qfalse; @@ -2990,11 +2996,11 @@ qboolean ItemParse_text( itemDef_t *item) /* =============== -ItemParse_descText +ItemParse_descText text =============== */ -qboolean ItemParse_descText( itemDef_t *item) +qboolean ItemParse_descText( itemDef_t *item) { if (!PC_ParseStringMem((const char **) &item->descText)) { @@ -3010,11 +3016,11 @@ qboolean ItemParse_descText( itemDef_t *item) /* =============== -ItemParse_text +ItemParse_text text =============== */ -qboolean ItemParse_text2( itemDef_t *item) +qboolean ItemParse_text2( itemDef_t *item) { if (!PC_ParseStringMem((const char **) &item->text2)) { @@ -3030,11 +3036,11 @@ qboolean ItemParse_text2( itemDef_t *item) /* =============== -ItemParse_group +ItemParse_group group =============== */ -qboolean ItemParse_group( itemDef_t *item) +qboolean ItemParse_group( itemDef_t *item) { if (!PC_ParseStringMem((const char **)&item->window.group)) { @@ -3046,11 +3052,11 @@ qboolean ItemParse_group( itemDef_t *item) /* =============== -ItemParse_asset_model +ItemParse_asset_model asset_model =============== */ -qboolean ItemParse_asset_model_go( itemDef_t *item, const char *name ) +qboolean ItemParse_asset_model_go( itemDef_t *item, const char *name ) { modelDef_t *modelPtr; Item_ValidateTypeData(item); @@ -3078,7 +3084,7 @@ qboolean ItemParse_asset_model_go( itemDef_t *item, const char *name ) } } } - else if(!(item->asset)) + else if(!(item->asset)) { //guess it's just an md3 item->asset = DC->registerModel(name); item->flags &= ~ITF_G2VALID; @@ -3086,39 +3092,39 @@ qboolean ItemParse_asset_model_go( itemDef_t *item, const char *name ) return qtrue; } -qboolean ItemParse_asset_model( itemDef_t *item ) +qboolean ItemParse_asset_model( itemDef_t *item ) { const char *temp; Item_ValidateTypeData(item); - if (PC_ParseString(&temp)) + if (PC_ParseString(&temp)) { return qfalse; } char modelPath[MAX_QPATH]; - + if (!Q_stricmp(temp,"ui_char_model") ) { Com_sprintf( modelPath, sizeof( modelPath ), "models/players/%s/model.glm", Cvar_VariableString ( "g_char_model" ) ); } else { - Com_sprintf( modelPath, sizeof( modelPath ), temp); + Com_sprintf( modelPath, sizeof( modelPath ), temp); } return (ItemParse_asset_model_go( item, modelPath )); } /* =============== -ItemParse_asset_model +ItemParse_asset_model asset_shader =============== */ -qboolean ItemParse_asset_shader( itemDef_t *item) +qboolean ItemParse_asset_shader( itemDef_t *item) { const char *temp; - if (PC_ParseString(&temp)) + if (PC_ParseString(&temp)) { return qfalse; } @@ -3128,21 +3134,21 @@ qboolean ItemParse_asset_shader( itemDef_t *item) /* =============== -ItemParse_asset_model +ItemParse_asset_model model_origin =============== */ -qboolean ItemParse_model_origin( itemDef_t *item) +qboolean ItemParse_model_origin( itemDef_t *item) { modelDef_t *modelPtr; Item_ValidateTypeData(item); modelPtr = (modelDef_t*)item->typeData; - if (PC_ParseFloat(&modelPtr->origin[0])) + if (PC_ParseFloat(&modelPtr->origin[0])) { - if (PC_ParseFloat(&modelPtr->origin[1])) + if (PC_ParseFloat(&modelPtr->origin[1])) { - if (PC_ParseFloat(&modelPtr->origin[2])) + if (PC_ParseFloat(&modelPtr->origin[2])) { return qtrue; } @@ -3153,17 +3159,17 @@ qboolean ItemParse_model_origin( itemDef_t *item) /* =============== -ItemParse_model_fovx +ItemParse_model_fovx model_fovx =============== */ -qboolean ItemParse_model_fovx( itemDef_t *item) +qboolean ItemParse_model_fovx( itemDef_t *item) { modelDef_t *modelPtr; Item_ValidateTypeData(item); modelPtr = (modelDef_t*)item->typeData; - if (PC_ParseFloat(&modelPtr->fov_x)) + if (PC_ParseFloat(&modelPtr->fov_x)) { return qfalse; } @@ -3172,17 +3178,17 @@ qboolean ItemParse_model_fovx( itemDef_t *item) /* =============== -ItemParse_model_fovy +ItemParse_model_fovy model_fovy =============== */ -qboolean ItemParse_model_fovy( itemDef_t *item) +qboolean ItemParse_model_fovy( itemDef_t *item) { modelDef_t *modelPtr; Item_ValidateTypeData(item); modelPtr = (modelDef_t*)item->typeData; - if (PC_ParseFloat(&modelPtr->fov_y)) + if (PC_ParseFloat(&modelPtr->fov_y)) { return qfalse; } @@ -3191,17 +3197,17 @@ qboolean ItemParse_model_fovy( itemDef_t *item) /* =============== -ItemParse_model_rotation +ItemParse_model_rotation model_rotation =============== */ -qboolean ItemParse_model_rotation( itemDef_t *item) +qboolean ItemParse_model_rotation( itemDef_t *item) { modelDef_t *modelPtr; Item_ValidateTypeData(item); modelPtr = (modelDef_t*)item->typeData; - if (PC_ParseInt(&modelPtr->rotationSpeed)) + if (PC_ParseInt(&modelPtr->rotationSpeed)) { return qfalse; } @@ -3210,17 +3216,17 @@ qboolean ItemParse_model_rotation( itemDef_t *item) /* =============== -ItemParse_model_angle +ItemParse_model_angle model_angle =============== */ -qboolean ItemParse_model_angle( itemDef_t *item) +qboolean ItemParse_model_angle( itemDef_t *item) { modelDef_t *modelPtr; Item_ValidateTypeData(item); modelPtr = (modelDef_t*)item->typeData; - if (PC_ParseInt(&modelPtr->angle)) + if (PC_ParseInt(&modelPtr->angle)) { return qfalse; } @@ -3260,7 +3266,7 @@ qboolean ItemParse_model_g2maxs( itemDef_t *item ) { } // model_g2skin -qboolean ItemParse_model_g2skin_go( itemDef_t *item, const char *skinName ) +qboolean ItemParse_model_g2skin_go( itemDef_t *item, const char *skinName ) { modelDef_t *modelPtr; @@ -3283,7 +3289,7 @@ qboolean ItemParse_model_g2skin_go( itemDef_t *item, const char *skinName ) return qtrue; } -qboolean ItemParse_model_g2skin( itemDef_t *item ) +qboolean ItemParse_model_g2skin( itemDef_t *item ) { const char *skinName; @@ -3295,7 +3301,7 @@ qboolean ItemParse_model_g2skin( itemDef_t *item ) } // model_g2anim -qboolean ItemParse_model_g2anim_go( itemDef_t *item, const char *animName ) +qboolean ItemParse_model_g2anim_go( itemDef_t *item, const char *animName ) { modelDef_t *modelPtr; int i = 0; @@ -3334,13 +3340,13 @@ qboolean ItemParse_model_g2anim( itemDef_t *item ) { /* =============== -ItemParse_rect +ItemParse_rect rect =============== */ -qboolean ItemParse_rect( itemDef_t *item) +qboolean ItemParse_rect( itemDef_t *item) { - if (!PC_ParseRect(&item->window.rectClient)) + if (!PC_ParseRect(&item->window.rectClient)) { return qfalse; } @@ -3354,12 +3360,12 @@ ItemParse_flag flag =============== */ -qboolean ItemParse_flag( itemDef_t *item) +qboolean ItemParse_flag( itemDef_t *item) { int i; const char *tempStr; - if (PC_ParseString(&tempStr)) + if (PC_ParseString(&tempStr)) { return qfalse; } @@ -3377,7 +3383,7 @@ qboolean ItemParse_flag( itemDef_t *item) if (itemFlags[i].string == NULL) { - PC_ParseWarning(va("Unknown item flag value '%s'",tempStr)); + PC_ParseWarning(va("Unknown item flag value '%s'",tempStr)); } return qtrue; @@ -3386,16 +3392,16 @@ qboolean ItemParse_flag( itemDef_t *item) /* =============== -ItemParse_style +ItemParse_style style =============== */ -qboolean ItemParse_style( itemDef_t *item) +qboolean ItemParse_style( itemDef_t *item) { int i; const char *tempStr; - if (PC_ParseString(&tempStr)) + if (PC_ParseString(&tempStr)) { return qfalse; } @@ -3413,7 +3419,7 @@ qboolean ItemParse_style( itemDef_t *item) if (styles[i] == NULL) { - PC_ParseWarning(va("Unknown item style value '%s'",tempStr)); + PC_ParseWarning(va("Unknown item style value '%s'",tempStr)); } return qtrue; @@ -3421,11 +3427,11 @@ qboolean ItemParse_style( itemDef_t *item) /* =============== -ItemParse_decoration +ItemParse_decoration decoration =============== */ -qboolean ItemParse_decoration( itemDef_t *item ) +qboolean ItemParse_decoration( itemDef_t *item ) { item->window.flags |= WINDOW_DECORATION; return qtrue; @@ -3433,17 +3439,17 @@ qboolean ItemParse_decoration( itemDef_t *item ) /* =============== -ItemParse_notselectable +ItemParse_notselectable notselectable =============== */ -qboolean ItemParse_notselectable( itemDef_t *item ) +qboolean ItemParse_notselectable( itemDef_t *item ) { listBoxDef_t *listPtr; Item_ValidateTypeData(item); listPtr = (listBoxDef_t*)item->typeData; - if (item->type == ITEM_TYPE_LISTBOX && listPtr) + if (item->type == ITEM_TYPE_LISTBOX && listPtr) { listPtr->notselectable = qtrue; } @@ -3456,13 +3462,13 @@ ItemParse_scrollhidden scrollhidden =============== */ -qboolean ItemParse_scrollhidden( itemDef_t *item ) +qboolean ItemParse_scrollhidden( itemDef_t *item ) { listBoxDef_t *listPtr; Item_ValidateTypeData(item); listPtr = (listBoxDef_t*)item->typeData; - if (item->type == ITEM_TYPE_LISTBOX && listPtr) + if (item->type == ITEM_TYPE_LISTBOX && listPtr) { listPtr->scrollhidden = qtrue; } @@ -3472,11 +3478,11 @@ qboolean ItemParse_scrollhidden( itemDef_t *item ) /* =============== -ItemParse_wrapped +ItemParse_wrapped manually wrapped =============== */ -qboolean ItemParse_wrapped( itemDef_t *item ) +qboolean ItemParse_wrapped( itemDef_t *item ) { item->window.flags |= WINDOW_WRAPPED; return qtrue; @@ -3485,11 +3491,11 @@ qboolean ItemParse_wrapped( itemDef_t *item ) /* =============== -ItemParse_autowrapped +ItemParse_autowrapped auto wrapped =============== */ -qboolean ItemParse_autowrapped( itemDef_t *item) +qboolean ItemParse_autowrapped( itemDef_t *item) { item->window.flags |= WINDOW_AUTOWRAPPED; return qtrue; @@ -3498,29 +3504,29 @@ qboolean ItemParse_autowrapped( itemDef_t *item) /* =============== -ItemParse_horizontalscroll +ItemParse_horizontalscroll horizontalscroll =============== */ -qboolean ItemParse_horizontalscroll( itemDef_t *item ) +qboolean ItemParse_horizontalscroll( itemDef_t *item ) { item->window.flags |= WINDOW_HORIZONTAL; return qtrue; } - + /* =============== -ItemParse_type +ItemParse_type type =============== */ -qboolean ItemParse_type( itemDef_t *item ) +qboolean ItemParse_type( itemDef_t *item ) { int i; const char *tempStr; - if (PC_ParseString(&tempStr)) + if (PC_ParseString(&tempStr)) { return qfalse; } @@ -3538,7 +3544,7 @@ qboolean ItemParse_type( itemDef_t *item ) if (types[i] == NULL) { - PC_ParseWarning(va("Unknown item type value '%s'",tempStr)); + PC_ParseWarning(va("Unknown item type value '%s'",tempStr)); } else { @@ -3554,13 +3560,13 @@ ItemParse_elementwidth uses textalignx for storage =============== */ -qboolean ItemParse_elementwidth( itemDef_t *item ) +qboolean ItemParse_elementwidth( itemDef_t *item ) { listBoxDef_t *listPtr; Item_ValidateTypeData(item); listPtr = (listBoxDef_t*)item->typeData; - if (PC_ParseFloat(&listPtr->elementWidth)) + if (PC_ParseFloat(&listPtr->elementWidth)) { return qfalse; } @@ -3570,18 +3576,18 @@ qboolean ItemParse_elementwidth( itemDef_t *item ) /* =============== -ItemParse_elementheight +ItemParse_elementheight elementheight, used for listbox image elements uses textaligny for storage =============== */ -qboolean ItemParse_elementheight( itemDef_t *item ) +qboolean ItemParse_elementheight( itemDef_t *item ) { listBoxDef_t *listPtr; Item_ValidateTypeData(item); listPtr = (listBoxDef_t*)item->typeData; - if (PC_ParseFloat(&listPtr->elementHeight)) + if (PC_ParseFloat(&listPtr->elementHeight)) { return qfalse; } @@ -3590,13 +3596,13 @@ qboolean ItemParse_elementheight( itemDef_t *item ) /* =============== -ItemParse_feeder +ItemParse_feeder feeder =============== */ -qboolean ItemParse_feeder( itemDef_t *item ) +qboolean ItemParse_feeder( itemDef_t *item ) { - if (PC_ParseFloat( &item->special)) + if (PC_ParseFloat( &item->special)) { return qfalse; } @@ -3605,12 +3611,12 @@ qboolean ItemParse_feeder( itemDef_t *item ) /* =============== -ItemParse_elementtype +ItemParse_elementtype elementtype, used to specify what type of elements a listbox contains uses textstyle for storage =============== */ -qboolean ItemParse_elementtype( itemDef_t *item ) +qboolean ItemParse_elementtype( itemDef_t *item ) { listBoxDef_t *listPtr; @@ -3621,7 +3627,7 @@ qboolean ItemParse_elementtype( itemDef_t *item ) } listPtr = (listBoxDef_t*)item->typeData; - if (PC_ParseInt(&listPtr->elementStyle)) + if (PC_ParseInt(&listPtr->elementStyle)) { return qfalse; } @@ -3630,11 +3636,11 @@ qboolean ItemParse_elementtype( itemDef_t *item ) /* =============== -ItemParse_columns - columns sets a number of columns and an x pos and width per.. +ItemParse_columns + columns sets a number of columns and an x pos and width per.. =============== */ -qboolean ItemParse_columns( itemDef_t *item) +qboolean ItemParse_columns( itemDef_t *item) { int num, i; listBoxDef_t *listPtr; @@ -3646,30 +3652,30 @@ qboolean ItemParse_columns( itemDef_t *item) } listPtr = (listBoxDef_t*)item->typeData; - if (!PC_ParseInt(&num)) + if (!PC_ParseInt(&num)) { - if (num > MAX_LB_COLUMNS) + if (num > MAX_LB_COLUMNS) { num = MAX_LB_COLUMNS; } listPtr->numColumns = num; - for (i = 0; i < num; i++) + for (i = 0; i < num; i++) { int pos, width, maxChars; - if (!PC_ParseInt(&pos) && !PC_ParseInt(&width) && !PC_ParseInt(&maxChars)) + if (!PC_ParseInt(&pos) && !PC_ParseInt(&width) && !PC_ParseInt(&maxChars)) { listPtr->columnInfo[i].pos = pos; listPtr->columnInfo[i].width = width; listPtr->columnInfo[i].maxChars = maxChars; - } - else + } + else { return qfalse; } } - } - else + } + else { return qfalse; } @@ -3679,12 +3685,12 @@ qboolean ItemParse_columns( itemDef_t *item) /* =============== -ItemParse_border +ItemParse_border =============== */ -qboolean ItemParse_border( itemDef_t *item) +qboolean ItemParse_border( itemDef_t *item) { - if (PC_ParseInt(&item->window.border)) + if (PC_ParseInt(&item->window.border)) { return qfalse; } @@ -3694,12 +3700,12 @@ qboolean ItemParse_border( itemDef_t *item) /* =============== -ItemParse_bordersize +ItemParse_bordersize =============== */ -qboolean ItemParse_bordersize( itemDef_t *item ) +qboolean ItemParse_bordersize( itemDef_t *item ) { - if (PC_ParseFloat(&item->window.borderSize)) + if (PC_ParseFloat(&item->window.borderSize)) { return qfalse; } @@ -3708,18 +3714,18 @@ qboolean ItemParse_bordersize( itemDef_t *item ) /* =============== -ItemParse_visible +ItemParse_visible =============== */ -qboolean ItemParse_visible( itemDef_t *item) +qboolean ItemParse_visible( itemDef_t *item) { int i; - if (PC_ParseInt(&i)) + if (PC_ParseInt(&i)) { return qfalse; } - if (i) + if (i) { item->window.flags |= WINDOW_VISIBLE; } @@ -3728,12 +3734,12 @@ qboolean ItemParse_visible( itemDef_t *item) /* =============== -ItemParse_ownerdraw +ItemParse_ownerdraw =============== */ -qboolean ItemParse_ownerdraw( itemDef_t *item) +qboolean ItemParse_ownerdraw( itemDef_t *item) { - if (PC_ParseInt(&item->window.ownerDraw)) + if (PC_ParseInt(&item->window.ownerDraw)) { return qfalse; } @@ -3743,12 +3749,12 @@ qboolean ItemParse_ownerdraw( itemDef_t *item) /* =============== -ItemParse_align +ItemParse_align =============== */ -qboolean ItemParse_align( itemDef_t *item) +qboolean ItemParse_align( itemDef_t *item) { - if (PC_ParseInt(&item->alignment)) + if (PC_ParseInt(&item->alignment)) { return qfalse; } @@ -3757,12 +3763,12 @@ qboolean ItemParse_align( itemDef_t *item) /* =============== -ItemParse_align +ItemParse_align =============== */ -qboolean ItemParse_Appearance_slot( itemDef_t *item) +qboolean ItemParse_Appearance_slot( itemDef_t *item) { - if (PC_ParseInt(&item->appearanceSlot)) + if (PC_ParseInt(&item->appearanceSlot)) { return qfalse; } @@ -3772,15 +3778,15 @@ qboolean ItemParse_Appearance_slot( itemDef_t *item) /* =============== -ItemParse_textalign +ItemParse_textalign =============== */ -qboolean ItemParse_textalign( itemDef_t *item ) +qboolean ItemParse_textalign( itemDef_t *item ) { const char *tempStr; int i; - if (PC_ParseString(&tempStr)) + if (PC_ParseString(&tempStr)) { return qfalse; } @@ -3798,7 +3804,7 @@ qboolean ItemParse_textalign( itemDef_t *item ) if (alignment[i] == NULL) { - PC_ParseWarning(va("Unknown text alignment value '%s'",tempStr)); + PC_ParseWarning(va("Unknown text alignment value '%s'",tempStr)); } return qtrue; @@ -3807,12 +3813,12 @@ qboolean ItemParse_textalign( itemDef_t *item ) /* =============== -ItemParse_text2alignx +ItemParse_text2alignx =============== */ -qboolean ItemParse_text2alignx( itemDef_t *item) +qboolean ItemParse_text2alignx( itemDef_t *item) { - if (PC_ParseFloat(&item->text2alignx)) + if (PC_ParseFloat(&item->text2alignx)) { return qfalse; } @@ -3821,12 +3827,12 @@ qboolean ItemParse_text2alignx( itemDef_t *item) /* =============== -ItemParse_text2aligny +ItemParse_text2aligny =============== */ -qboolean ItemParse_text2aligny( itemDef_t *item) +qboolean ItemParse_text2aligny( itemDef_t *item) { - if (PC_ParseFloat(&item->text2aligny)) + if (PC_ParseFloat(&item->text2aligny)) { return qfalse; } @@ -3835,12 +3841,12 @@ qboolean ItemParse_text2aligny( itemDef_t *item) /* =============== -ItemParse_textalignx +ItemParse_textalignx =============== */ -qboolean ItemParse_textalignx( itemDef_t *item) +qboolean ItemParse_textalignx( itemDef_t *item) { - if (PC_ParseFloat(&item->textalignx)) + if (PC_ParseFloat(&item->textalignx)) { return qfalse; } @@ -3849,12 +3855,12 @@ qboolean ItemParse_textalignx( itemDef_t *item) /* =============== -ItemParse_textaligny +ItemParse_textaligny =============== */ -qboolean ItemParse_textaligny( itemDef_t *item) +qboolean ItemParse_textaligny( itemDef_t *item) { - if (PC_ParseFloat(&item->textaligny)) + if (PC_ParseFloat(&item->textaligny)) { return qfalse; } @@ -3863,12 +3869,12 @@ qboolean ItemParse_textaligny( itemDef_t *item) /* =============== -ItemParse_textscale +ItemParse_textscale =============== */ -qboolean ItemParse_textscale( itemDef_t *item ) +qboolean ItemParse_textscale( itemDef_t *item ) { - if (PC_ParseFloat(&item->textscale)) + if (PC_ParseFloat(&item->textscale)) { return qfalse; } @@ -3877,12 +3883,12 @@ qboolean ItemParse_textscale( itemDef_t *item ) /* =============== -ItemParse_textstyle +ItemParse_textstyle =============== */ -qboolean ItemParse_textstyle( itemDef_t *item) +qboolean ItemParse_textstyle( itemDef_t *item) { - if (PC_ParseInt(&item->textStyle)) + if (PC_ParseInt(&item->textStyle)) { return qfalse; } @@ -3895,9 +3901,9 @@ qboolean ItemParse_textstyle( itemDef_t *item) ItemParse_invertyesno =============== */ -qboolean ItemParse_invertyesno( itemDef_t *item) +qboolean ItemParse_invertyesno( itemDef_t *item) { - if (PC_ParseInt(&item->invertYesNo)) + if (PC_ParseInt(&item->invertYesNo)) { return qfalse; } @@ -3909,9 +3915,9 @@ qboolean ItemParse_invertyesno( itemDef_t *item) ItemParse_xoffset (used for yes/no and multi) =============== */ -qboolean ItemParse_xoffset( itemDef_t *item) +qboolean ItemParse_xoffset( itemDef_t *item) { - if (PC_ParseInt(&item->xoffset)) + if (PC_ParseInt(&item->xoffset)) { return qfalse; } @@ -3921,17 +3927,17 @@ qboolean ItemParse_xoffset( itemDef_t *item) /* =============== -ItemParse_backcolor +ItemParse_backcolor =============== */ -qboolean ItemParse_backcolor( itemDef_t *item) +qboolean ItemParse_backcolor( itemDef_t *item) { int i; float f; - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { - if (PC_ParseFloat(&f)) + if (PC_ParseFloat(&f)) { return qfalse; } @@ -3942,17 +3948,17 @@ qboolean ItemParse_backcolor( itemDef_t *item) /* =============== -ItemParse_forecolor +ItemParse_forecolor =============== */ -qboolean ItemParse_forecolor( itemDef_t *item) +qboolean ItemParse_forecolor( itemDef_t *item) { int i; float f; - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { - if (PC_ParseFloat(&f)) + if (PC_ParseFloat(&f)) { return qfalse; } @@ -3969,17 +3975,17 @@ qboolean ItemParse_forecolor( itemDef_t *item) /* =============== -ItemParse_bordercolor +ItemParse_bordercolor =============== */ -qboolean ItemParse_bordercolor( itemDef_t *item) +qboolean ItemParse_bordercolor( itemDef_t *item) { int i; float f; - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { - if (PC_ParseFloat(&f)) + if (PC_ParseFloat(&f)) { return qfalse; } @@ -3990,10 +3996,10 @@ qboolean ItemParse_bordercolor( itemDef_t *item) /* =============== -ItemParse_outlinecolor +ItemParse_outlinecolor =============== */ -qboolean ItemParse_outlinecolor( itemDef_t *item) +qboolean ItemParse_outlinecolor( itemDef_t *item) { if (PC_ParseColor(&item->window.outlineColor)) { @@ -4004,14 +4010,14 @@ qboolean ItemParse_outlinecolor( itemDef_t *item) /* =============== -ItemParse_background +ItemParse_background =============== */ -qboolean ItemParse_background( itemDef_t *item) +qboolean ItemParse_background( itemDef_t *item) { const char *temp; - if (PC_ParseString(&temp)) + if (PC_ParseString(&temp)) { return qfalse; } @@ -4021,12 +4027,12 @@ qboolean ItemParse_background( itemDef_t *item) /* =============== -ItemParse_cinematic +ItemParse_cinematic =============== */ -qboolean ItemParse_cinematic( itemDef_t *item) +qboolean ItemParse_cinematic( itemDef_t *item) { - if (!PC_ParseStringMem((const char **) &item->window.cinematicName)) + if (!PC_ParseStringMem((const char **) &item->window.cinematicName)) { return qfalse; } @@ -4035,22 +4041,22 @@ qboolean ItemParse_cinematic( itemDef_t *item) /* =============== -ItemParse_doubleClick +ItemParse_doubleClick =============== */ -qboolean ItemParse_doubleClick( itemDef_t *item) +qboolean ItemParse_doubleClick( itemDef_t *item) { listBoxDef_t *listPtr; Item_ValidateTypeData(item); - if (!item->typeData) + if (!item->typeData) { return qfalse; } listPtr = (listBoxDef_t*)item->typeData; - if (!PC_Script_Parse(&listPtr->doubleClick)) + if (!PC_Script_Parse(&listPtr->doubleClick)) { return qfalse; } @@ -4059,12 +4065,12 @@ qboolean ItemParse_doubleClick( itemDef_t *item) /* =============== -ItemParse_onFocus +ItemParse_onFocus =============== */ -qboolean ItemParse_onFocus( itemDef_t *item) +qboolean ItemParse_onFocus( itemDef_t *item) { - if (!PC_Script_Parse(&item->onFocus)) + if (!PC_Script_Parse(&item->onFocus)) { return qfalse; } @@ -4073,12 +4079,12 @@ qboolean ItemParse_onFocus( itemDef_t *item) /* =============== -ItemParse_leaveFocus +ItemParse_leaveFocus =============== */ -qboolean ItemParse_leaveFocus( itemDef_t *item ) +qboolean ItemParse_leaveFocus( itemDef_t *item ) { - if (!PC_Script_Parse(&item->leaveFocus)) + if (!PC_Script_Parse(&item->leaveFocus)) { return qfalse; } @@ -4087,12 +4093,12 @@ qboolean ItemParse_leaveFocus( itemDef_t *item ) /* =============== -ItemParse_mouseEnter +ItemParse_mouseEnter =============== */ -qboolean ItemParse_mouseEnter( itemDef_t *item) +qboolean ItemParse_mouseEnter( itemDef_t *item) { - if (!PC_Script_Parse(&item->mouseEnter)) + if (!PC_Script_Parse(&item->mouseEnter)) { return qfalse; } @@ -4101,12 +4107,12 @@ qboolean ItemParse_mouseEnter( itemDef_t *item) /* =============== -ItemParse_mouseExit +ItemParse_mouseExit =============== */ -qboolean ItemParse_mouseExit( itemDef_t *item) +qboolean ItemParse_mouseExit( itemDef_t *item) { - if (!PC_Script_Parse(&item->mouseExit)) + if (!PC_Script_Parse(&item->mouseExit)) { return qfalse; } @@ -4115,12 +4121,12 @@ qboolean ItemParse_mouseExit( itemDef_t *item) /* =============== -ItemParse_mouseEnterText +ItemParse_mouseEnterText =============== */ -qboolean ItemParse_mouseEnterText( itemDef_t *item) +qboolean ItemParse_mouseEnterText( itemDef_t *item) { - if (!PC_Script_Parse(&item->mouseEnterText)) + if (!PC_Script_Parse(&item->mouseEnterText)) { return qfalse; } @@ -4129,12 +4135,12 @@ qboolean ItemParse_mouseEnterText( itemDef_t *item) /* =============== -ItemParse_mouseExitText +ItemParse_mouseExitText =============== */ -qboolean ItemParse_mouseExitText( itemDef_t *item) +qboolean ItemParse_mouseExitText( itemDef_t *item) { - if (!PC_Script_Parse(&item->mouseExitText)) + if (!PC_Script_Parse(&item->mouseExitText)) { return qfalse; } @@ -4144,12 +4150,12 @@ qboolean ItemParse_mouseExitText( itemDef_t *item) /* =============== -ItemParse_accept +ItemParse_accept =============== */ -qboolean ItemParse_accept( itemDef_t *item) +qboolean ItemParse_accept( itemDef_t *item) { - if (!PC_Script_Parse(&item->accept)) + if (!PC_Script_Parse(&item->accept)) { return qfalse; } @@ -4163,9 +4169,9 @@ qboolean ItemParse_accept( itemDef_t *item) ItemParse_selectionNext =============== */ -qboolean ItemParse_selectionNext( itemDef_t *item) +qboolean ItemParse_selectionNext( itemDef_t *item) { - if (!PC_Script_Parse(&item->selectionNext)) + if (!PC_Script_Parse(&item->selectionNext)) { return qfalse; } @@ -4177,9 +4183,9 @@ qboolean ItemParse_selectionNext( itemDef_t *item) ItemParse_selectionPrev =============== */ -qboolean ItemParse_selectionPrev( itemDef_t *item) +qboolean ItemParse_selectionPrev( itemDef_t *item) { - if (!PC_Script_Parse(&item->selectionPrev)) + if (!PC_Script_Parse(&item->selectionPrev)) { return qfalse; } @@ -4194,12 +4200,12 @@ qboolean ItemParse_selectionPrev( itemDef_t *item) /* =============== -ItemParse_action +ItemParse_action =============== */ -qboolean ItemParse_action( itemDef_t *item) +qboolean ItemParse_action( itemDef_t *item) { - if (!PC_Script_Parse(&item->action)) + if (!PC_Script_Parse(&item->action)) { return qfalse; } @@ -4209,12 +4215,12 @@ qboolean ItemParse_action( itemDef_t *item) /* =============== -ItemParse_special +ItemParse_special =============== */ -qboolean ItemParse_special( itemDef_t *item) +qboolean ItemParse_special( itemDef_t *item) { - if (PC_ParseFloat(&item->special)) + if (PC_ParseFloat(&item->special)) { return qfalse; } @@ -4223,12 +4229,12 @@ qboolean ItemParse_special( itemDef_t *item) /* =============== -ItemParse_cvarTest +ItemParse_cvarTest =============== */ -qboolean ItemParse_cvarTest( itemDef_t *item) +qboolean ItemParse_cvarTest( itemDef_t *item) { - if (!PC_ParseStringMem((const char **) &item->cvarTest)) + if (!PC_ParseStringMem((const char **) &item->cvarTest)) { return qfalse; } @@ -4237,15 +4243,15 @@ qboolean ItemParse_cvarTest( itemDef_t *item) /* =============== -ItemParse_cvar +ItemParse_cvar =============== */ -qboolean ItemParse_cvar( itemDef_t *item) +qboolean ItemParse_cvar( itemDef_t *item) { editFieldDef_t *editPtr; Item_ValidateTypeData(item); - if (!PC_ParseStringMem(&item->cvar)) + if (!PC_ParseStringMem(&item->cvar)) { return qfalse; } @@ -4273,10 +4279,10 @@ qboolean ItemParse_cvar( itemDef_t *item) /* =============== -ItemParse_maxChars +ItemParse_maxChars =============== */ -qboolean ItemParse_maxChars( itemDef_t *item) +qboolean ItemParse_maxChars( itemDef_t *item) { editFieldDef_t *editPtr; int maxChars; @@ -4287,7 +4293,7 @@ qboolean ItemParse_maxChars( itemDef_t *item) return qfalse; } - if (PC_ParseInt(&maxChars)) + if (PC_ParseInt(&maxChars)) { return qfalse; } @@ -4298,10 +4304,10 @@ qboolean ItemParse_maxChars( itemDef_t *item) /* =============== -ItemParse_maxPaintChars +ItemParse_maxPaintChars =============== */ -qboolean ItemParse_maxPaintChars( itemDef_t *item) +qboolean ItemParse_maxPaintChars( itemDef_t *item) { editFieldDef_t *editPtr; int maxChars; @@ -4312,7 +4318,7 @@ qboolean ItemParse_maxPaintChars( itemDef_t *item) return qfalse; } - if (PC_ParseInt(&maxChars)) + if (PC_ParseInt(&maxChars)) { return qfalse; } @@ -4322,7 +4328,7 @@ qboolean ItemParse_maxPaintChars( itemDef_t *item) } -qboolean ItemParse_lineHeight( itemDef_t *item) +qboolean ItemParse_lineHeight( itemDef_t *item) { textScrollDef_t *scrollPtr; int height; @@ -4333,7 +4339,7 @@ qboolean ItemParse_lineHeight( itemDef_t *item) return qfalse; } - if (PC_ParseInt(&height)) + if (PC_ParseInt(&height)) { return qfalse; } @@ -4346,10 +4352,10 @@ qboolean ItemParse_lineHeight( itemDef_t *item) /* =============== -ItemParse_cvarFloat +ItemParse_cvarFloat =============== */ -qboolean ItemParse_cvarFloat( itemDef_t *item) +qboolean ItemParse_cvarFloat( itemDef_t *item) { editFieldDef_t *editPtr; @@ -4362,7 +4368,7 @@ qboolean ItemParse_cvarFloat( itemDef_t *item) if (PC_ParseStringMem((const char **) &item->cvar) && !PC_ParseFloat(&editPtr->defVal) && !PC_ParseFloat(&editPtr->minVal) && - !PC_ParseFloat(&editPtr->maxVal)) + !PC_ParseFloat(&editPtr->maxVal)) { if (!Q_stricmp(item->cvar,"r_ext_texture_filter_anisotropic")) {//hehe, hook up the correct max value here. @@ -4376,15 +4382,15 @@ qboolean ItemParse_cvarFloat( itemDef_t *item) /* =============== -ItemParse_cvarStrList +ItemParse_cvarStrList =============== */ -qboolean ItemParse_cvarStrList( itemDef_t *item) +qboolean ItemParse_cvarStrList( itemDef_t *item) { const char *token; multiDef_t *multiPtr; int pass; - + Item_ValidateTypeData(item); if (!item->typeData) { @@ -4399,7 +4405,7 @@ qboolean ItemParse_cvarStrList( itemDef_t *item) return qfalse; } - if (!Q_stricmp(token,"feeder") && item->special == FEEDER_PLAYER_SPECIES) + if (!Q_stricmp(token,"feeder") && item->special == FEEDER_PLAYER_SPECIES) { for (; multiPtr->count < uiInfo.playerSpeciesCount; multiPtr->count++) { @@ -4409,7 +4415,7 @@ qboolean ItemParse_cvarStrList( itemDef_t *item) return qtrue; } // languages - if (!Q_stricmp(token,"feeder") && item->special == FEEDER_LANGUAGES) + if (!Q_stricmp(token,"feeder") && item->special == FEEDER_LANGUAGES) { for (; multiPtr->count < uiInfo.languageCount; multiPtr->count++) { @@ -4423,40 +4429,40 @@ qboolean ItemParse_cvarStrList( itemDef_t *item) } return qtrue; } - if (*token != '{') + if (*token != '{') { return qfalse; } pass = 0; - while ( 1 ) + while ( 1 ) { if (!PC_ParseStringMem(&token)) { PC_ParseWarning("end of file inside menu item\n"); return qfalse; } - if (*token == '}') + if (*token == '}') { return qtrue; } - - if (*token == ',' || *token == ';') + + if (*token == ',' || *token == ';') { continue; } - if (pass == 0) + if (pass == 0) { multiPtr->cvarList[multiPtr->count] = token; pass = 1; - } - else + } + else { multiPtr->cvarStr[multiPtr->count] = token; pass = 0; multiPtr->count++; - if (multiPtr->count >= MAX_MULTI_CVARS) + if (multiPtr->count >= MAX_MULTI_CVARS) { return qfalse; } @@ -4468,14 +4474,14 @@ qboolean ItemParse_cvarStrList( itemDef_t *item) /* =============== -ItemParse_cvarFloatList +ItemParse_cvarFloatList =============== */ -qboolean ItemParse_cvarFloatList( itemDef_t *item) +qboolean ItemParse_cvarFloatList( itemDef_t *item) { const char *token; multiDef_t *multiPtr; - + Item_ValidateTypeData(item); if (!item->typeData) { @@ -4490,36 +4496,36 @@ qboolean ItemParse_cvarFloatList( itemDef_t *item) return qfalse; } - if (*token != '{') + if (*token != '{') { return qfalse; } - while ( 1 ) + while ( 1 ) { if (!PC_ParseStringMem(&token)) { PC_ParseWarning("end of file inside menu item\n"); return qfalse; } - if (*token == '}') + if (*token == '}') { return qtrue; } - if (*token == ',' || *token == ';') + if (*token == ',' || *token == ';') { continue; } multiPtr->cvarList[multiPtr->count] = token; //a StringAlloc ptr - if (PC_ParseFloat(&multiPtr->cvarValue[multiPtr->count])) + if (PC_ParseFloat(&multiPtr->cvarValue[multiPtr->count])) { return qfalse; } multiPtr->count++; - if (multiPtr->count >= MAX_MULTI_CVARS) + if (multiPtr->count >= MAX_MULTI_CVARS) { return qfalse; } @@ -4532,19 +4538,19 @@ qboolean ItemParse_cvarFloatList( itemDef_t *item) /* =============== -ItemParse_addColorRange +ItemParse_addColorRange =============== */ -qboolean ItemParse_addColorRange( itemDef_t *item) +qboolean ItemParse_addColorRange( itemDef_t *item) { colorRangeDef_t color; if (PC_ParseFloat(&color.low) && PC_ParseFloat(&color.high) && - PC_ParseColor(&color.color) ) + PC_ParseColor(&color.color) ) { - if (item->numColors < MAX_COLOR_RANGES) + if (item->numColors < MAX_COLOR_RANGES) { memcpy(&item->colorRanges[item->numColors], &color, sizeof(color)); item->numColors++; @@ -4556,13 +4562,13 @@ qboolean ItemParse_addColorRange( itemDef_t *item) /* =============== -ItemParse_ownerdrawFlag +ItemParse_ownerdrawFlag =============== */ -qboolean ItemParse_ownerdrawFlag( itemDef_t *item ) +qboolean ItemParse_ownerdrawFlag( itemDef_t *item ) { int i; - if (PC_ParseInt(&i)) + if (PC_ParseInt(&i)) { return qfalse; } @@ -4572,12 +4578,12 @@ qboolean ItemParse_ownerdrawFlag( itemDef_t *item ) /* =============== -ItemParse_enableCvar +ItemParse_enableCvar =============== */ -qboolean ItemParse_enableCvar( itemDef_t *item) +qboolean ItemParse_enableCvar( itemDef_t *item) { - if (PC_Script_Parse(&item->enableCvar)) + if (PC_Script_Parse(&item->enableCvar)) { item->cvarFlags = CVAR_ENABLE; return qtrue; @@ -4587,7 +4593,7 @@ qboolean ItemParse_enableCvar( itemDef_t *item) /* =============== -ItemParse_disableCvar +ItemParse_disableCvar =============== */ qboolean ItemParse_disableCvar( itemDef_t *item ) @@ -4602,12 +4608,12 @@ qboolean ItemParse_disableCvar( itemDef_t *item ) /* =============== -ItemParse_showCvar +ItemParse_showCvar =============== */ qboolean ItemParse_showCvar( itemDef_t *item ) { - if (PC_Script_Parse(&item->enableCvar)) + if (PC_Script_Parse(&item->enableCvar)) { item->cvarFlags = CVAR_SHOW; return qtrue; @@ -4617,7 +4623,7 @@ qboolean ItemParse_showCvar( itemDef_t *item ) /* =============== -ItemParse_hideCvar +ItemParse_hideCvar =============== */ qboolean ItemParse_hideCvar( itemDef_t *item ) @@ -4647,35 +4653,35 @@ qboolean ItemParse_cvarsubstring( itemDef_t *item ) Item_ValidateTypeData =============== */ -void Item_ValidateTypeData(itemDef_t *item) +void Item_ValidateTypeData(itemDef_t *item) { - if (item->typeData) + if (item->typeData) { return; } - if (item->type == ITEM_TYPE_LISTBOX) + if (item->type == ITEM_TYPE_LISTBOX) { item->typeData = UI_Alloc(sizeof(listBoxDef_t)); memset(item->typeData, 0, sizeof(listBoxDef_t)); - } - else if (item->type == ITEM_TYPE_EDITFIELD || item->type == ITEM_TYPE_NUMERICFIELD || item->type == ITEM_TYPE_YESNO || item->type == ITEM_TYPE_BIND || item->type == ITEM_TYPE_SLIDER || item->type == ITEM_TYPE_TEXT) + } + else if (item->type == ITEM_TYPE_EDITFIELD || item->type == ITEM_TYPE_NUMERICFIELD || item->type == ITEM_TYPE_YESNO || item->type == ITEM_TYPE_BIND || item->type == ITEM_TYPE_SLIDER || item->type == ITEM_TYPE_TEXT) { item->typeData = UI_Alloc(sizeof(editFieldDef_t)); memset(item->typeData, 0, sizeof(editFieldDef_t)); - if (item->type == ITEM_TYPE_EDITFIELD) + if (item->type == ITEM_TYPE_EDITFIELD) { - if (!((editFieldDef_t *) item->typeData)->maxPaintChars) + if (!((editFieldDef_t *) item->typeData)->maxPaintChars) { ((editFieldDef_t *) item->typeData)->maxPaintChars = MAX_EDITFIELD; } } - } - else if (item->type == ITEM_TYPE_MULTI) + } + else if (item->type == ITEM_TYPE_MULTI) { item->typeData = UI_Alloc(sizeof(multiDef_t)); - } - else if (item->type == ITEM_TYPE_MODEL) + } + else if (item->type == ITEM_TYPE_MODEL) { item->typeData = UI_Alloc(sizeof(modelDef_t)); memset(item->typeData, 0, sizeof(modelDef_t)); @@ -4860,12 +4866,12 @@ keywordHash_t *itemParseKeywordHash[KEYWORDHASH_SIZE]; Item_SetupKeywordHash =============== */ -void Item_SetupKeywordHash(void) +void Item_SetupKeywordHash(void) { int i; memset(itemParseKeywordHash, 0, sizeof(itemParseKeywordHash)); - for (i = 0; itemParseKeywords[i].keyword; i++) + for (i = 0; itemParseKeywords[i].keyword; i++) { KeywordHash_Add(itemParseKeywordHash, &itemParseKeywords[i]); } @@ -4877,7 +4883,7 @@ void Item_SetupKeywordHash(void) Item_Parse =============== */ -qboolean Item_Parse(itemDef_t *item) +qboolean Item_Parse(itemDef_t *item) { keywordHash_t *key; const char *token; @@ -4888,12 +4894,12 @@ qboolean Item_Parse(itemDef_t *item) return qfalse; } - if (*token != '{') + if (*token != '{') { return qfalse; } - while ( 1 ) + while ( 1 ) { if (PC_ParseString(&token)) { @@ -4901,9 +4907,9 @@ qboolean Item_Parse(itemDef_t *item) return qfalse; } - if (*token == '}') + if (*token == '}') { -/* if (!item->window.name) +/* if (!item->window.name) { item->window.name = defaultString; Com_Printf(S_COLOR_YELLOW"WARNING: Menu item has no name\n"); @@ -4919,13 +4925,13 @@ qboolean Item_Parse(itemDef_t *item) } key = (keywordHash_s *) KeywordHash_Find(itemParseKeywordHash, token); - if (!key) + if (!key) { PC_ParseWarning(va("Unknown item keyword '%s'", token)); continue; } - if ( !key->func(item) ) + if ( !key->func(item) ) { PC_ParseWarning(va("Couldn't parse item keyword '%s'", token)); return qfalse; @@ -4941,11 +4947,11 @@ static void Item_TextScroll_BuildLines ( itemDef_t* item ) const char *psText = item->text; // for copy/paste ease int iBoxWidth = item->window.rect.w - SCROLLBAR_SIZE - 10; - // this could probably be simplified now, but it was converted from something else I didn't originally write, + // this could probably be simplified now, but it was converted from something else I didn't originally write, // and it works anyway so wtf... // const char *psCurrentTextReadPos; - const char *psReadPosAtLineStart; + const char *psReadPosAtLineStart; const char *psBestLineBreakSrcPos; const char *psLastGood_s; // needed if we get a full screen of chars with no punctuation or space (see usage notes) qboolean bIsTrailingPunctuation; @@ -5017,9 +5023,9 @@ static void Item_TextScroll_BuildLines ( itemDef_t* item ) scrollPtr->pLines[ scrollPtr->iLineCount ] = String_Alloc ( sLineForDisplay ); break; // print this line } - else + else if ( DC->textWidth( sLineForDisplay, item->textscale, item->font ) >= iBoxWidth ) - { + { // reached screen edge, so cap off string at bytepos after last good position... // if (uiLetter > 255 && bIsTrailingPunctuation && !ui.Language_UsesSpaces()) @@ -5034,9 +5040,9 @@ static void Item_TextScroll_BuildLines ( itemDef_t* item ) { // aarrrggh!!!!! we'll only get here is someone has fed in a (probably) garbage string, // since it doesn't have a single space or punctuation mark right the way across one line - // of the screen. So far, this has only happened in testing when I hardwired a taiwanese - // string into this function while the game was running in english (which should NEVER happen - // normally). On the other hand I suppose it's entirely possible that some taiwanese string + // of the screen. So far, this has only happened in testing when I hardwired a taiwanese + // string into this function while the game was running in english (which should NEVER happen + // normally). On the other hand I suppose it's entirely possible that some taiwanese string // might have no punctuation at all, so... // psBestLineBreakSrcPos = psLastGood_s; // force a break after last good letter @@ -5068,7 +5074,7 @@ static void Item_TextScroll_BuildLines ( itemDef_t* item ) // scrollPtr->pLines[ scrollPtr->iLineCount ] = String_Alloc( sLineForDisplay ); } - + scrollPtr->iLineCount++; } } @@ -5079,17 +5085,17 @@ Item_InitControls init's special control types =============== */ -void Item_InitControls(itemDef_t *item) +void Item_InitControls(itemDef_t *item) { - if (item == NULL) + if (item == NULL) { return; } - if (item->type == ITEM_TYPE_LISTBOX) + if (item->type == ITEM_TYPE_LISTBOX) { listBoxDef_t *listPtr = (listBoxDef_t*)item->typeData; item->cursorPos = 0; - if (listPtr) + if (listPtr) { listPtr->cursorPos = 0; listPtr->startPos = 0; @@ -5104,17 +5110,17 @@ void Item_InitControls(itemDef_t *item) Int_Parse ================= */ -qboolean Int_Parse(const char **p, int *i) +qboolean Int_Parse(const char **p, int *i) { char *token; token = COM_ParseExt(p, qfalse); - if (token && token[0] != 0) + if (token && token[0] != 0) { *i = atoi(token); return qtrue; - } - else + } + else { return qfalse; } @@ -5125,12 +5131,12 @@ qboolean Int_Parse(const char **p, int *i) String_Parse ================= */ -qboolean String_Parse(const char **p, const char **out) +qboolean String_Parse(const char **p, const char **out) { char *token; token = COM_ParseExt(p, qfalse); - if (token && token[0] != 0) + if (token && token[0] != 0) { *(out) = String_Alloc(token); return *(out)!=NULL; @@ -5143,7 +5149,7 @@ qboolean String_Parse(const char **p, const char **out) Item_RunScript =============== */ -void Item_RunScript(itemDef_t *item, const char *s) +void Item_RunScript(itemDef_t *item, const char *s) { const char *p; int i; @@ -5151,28 +5157,28 @@ void Item_RunScript(itemDef_t *item, const char *s) uiInfo.runScriptItem = item; - if (item && s && s[0]) + if (item && s && s[0]) { p = s; COM_BeginParseSession(); - while (1) + while (1) { const char *command; // expect command then arguments, ; ends command, NULL ends script - if (!String_Parse(&p, &command)) + if (!String_Parse(&p, &command)) { break; } - if (command[0] == ';' && command[1] == '\0') + if (command[0] == ';' && command[1] == '\0') { continue; } bRan = qfalse; - for (i = 0; i < scriptCommandCount; i++) + for (i = 0; i < scriptCommandCount; i++) { - if (Q_stricmp(command, commandList[i].name) == 0) + if (Q_stricmp(command, commandList[i].name) == 0) { if ( !(commandList[i].handler(item, &p)) ) { @@ -5185,7 +5191,7 @@ void Item_RunScript(itemDef_t *item, const char *s) } } // not in our auto list, pass to handler - if (!bRan) + if (!bRan) { // Allow any script command to fail if ( !DC->runScript(&p) ) @@ -5204,12 +5210,12 @@ void Item_RunScript(itemDef_t *item, const char *s) Menu_SetupKeywordHash =============== */ -void Menu_SetupKeywordHash(void) +void Menu_SetupKeywordHash(void) { int i; memset(menuParseKeywordHash, 0, sizeof(menuParseKeywordHash)); - for (i = 0; menuParseKeywords[i].keyword; i++) + for (i = 0; menuParseKeywords[i].keyword; i++) { KeywordHash_Add(menuParseKeywordHash, &menuParseKeywords[i]); } @@ -5222,25 +5228,25 @@ Menus_ActivateByName =============== */ void Menu_HandleMouseMove(menuDef_t *menu, float x, float y); -menuDef_t *Menus_ActivateByName(const char *p) +menuDef_t *Menus_ActivateByName(const char *p) { int i; menuDef_t *m = NULL; menuDef_t *focus = Menu_GetFocused(); - for (i = 0; i < menuCount; i++) + for (i = 0; i < menuCount; i++) { // Look for the name in the current list of windows - if (Q_stricmp(Menus[i].window.name, p) == 0) + if (Q_stricmp(Menus[i].window.name, p) == 0) { m = &Menus[i]; Menus_Activate(m); - if (openMenuCount < MAX_OPEN_MENUS && focus != NULL) + if (openMenuCount < MAX_OPEN_MENUS && focus != NULL) { menuStack[openMenuCount++] = focus; } - } - else + } + else { Menus[i].window.flags &= ~WINDOW_HASFOCUS; } @@ -5305,11 +5311,11 @@ menuDef_t *Menus_ActivateByName(const char *p) Menus_Activate =============== */ -void Menus_Activate(menuDef_t *menu) +void Menus_Activate(menuDef_t *menu) { menu->window.flags |= (WINDOW_HASFOCUS | WINDOW_VISIBLE); - if (menu->onOpen) + if (menu->onOpen) { itemDef_t item; item.parent = menu; @@ -5467,15 +5473,15 @@ void Controls_GetConfig( void ) Item_SetScreenCoords =============== */ -void Item_SetScreenCoords(itemDef_t *item, float x, float y) +void Item_SetScreenCoords(itemDef_t *item, float x, float y) { - - if (item == NULL) + + if (item == NULL) { return; } - if (item->window.border != 0) + if (item->window.border != 0) { x += item->window.borderSize; y += item->window.borderSize; @@ -5509,10 +5515,10 @@ void Item_SetScreenCoords(itemDef_t *item, float x, float y) } -static void Menu_FreeGhoulItems(menuDef_t *menu) +static void Menu_FreeGhoulItems(menuDef_t *menu) { int i,j; - for (i = 0; i < menu->itemCount; i++) + for (i = 0; i < menu->itemCount; i++) { for (j=0; j < menu->items[i]->ghoul2.size(); j++) { @@ -5529,12 +5535,12 @@ static void Menu_FreeGhoulItems(menuDef_t *menu) Menu_Reset =============== */ -void Menu_Reset(void) +void Menu_Reset(void) { //FIXME iterate menus to destoy G2 assets. int i; - for (i = 0; i < menuCount; i++) + for (i = 0; i < menuCount; i++) { Menu_FreeGhoulItems( &Menus[i] ); } @@ -5547,25 +5553,25 @@ void Menu_Reset(void) Menu_UpdatePosition =============== */ -void Menu_UpdatePosition(menuDef_t *menu) +void Menu_UpdatePosition(menuDef_t *menu) { int i; float x, y; - if (menu == NULL) + if (menu == NULL) { return; } - + x = menu->window.rect.x; y = menu->window.rect.y; - if (menu->window.border != 0) + if (menu->window.border != 0) { x += menu->window.borderSize; y += menu->window.borderSize; } - for (i = 0; i < menu->itemCount; i++) + for (i = 0; i < menu->itemCount; i++) { Item_SetScreenCoords(menu->items[i], x, y); } @@ -5576,14 +5582,14 @@ void Menu_UpdatePosition(menuDef_t *menu) Menu_PostParse =============== */ -void Menu_PostParse(menuDef_t *menu) +void Menu_PostParse(menuDef_t *menu) { - if (menu == NULL) + if (menu == NULL) { return; } - if (menu->fullScreen) + if (menu->fullScreen) { menu->window.rect.x = 0; menu->window.rect.y = 0; @@ -5598,7 +5604,7 @@ void Menu_PostParse(menuDef_t *menu) Menu_Init =============== */ -void Menu_Init(menuDef_t *menu) +void Menu_Init(menuDef_t *menu) { memset(menu, 0, sizeof(menuDef_t)); menu->cursorItem = -1; @@ -5620,7 +5626,7 @@ void Menu_Init(menuDef_t *menu) Menu_Parse =============== */ -qboolean Menu_Parse(char *inbuffer, menuDef_t *menu) +qboolean Menu_Parse(char *inbuffer, menuDef_t *menu) { // pc_token_t token; keywordHash_t *key; @@ -5636,12 +5642,12 @@ qboolean Menu_Parse(char *inbuffer, menuDef_t *menu) return qfalse; } - if (*token2 != '{') + if (*token2 != '{') { PC_ParseWarning("Misplaced {"); return qfalse; } - while ( 1 ) + while ( 1 ) { token2 = PC_ParseExt(); @@ -5651,7 +5657,7 @@ qboolean Menu_Parse(char *inbuffer, menuDef_t *menu) return qfalse; } - if (*token2 == '}') + if (*token2 == '}') { return qtrue; } @@ -5664,18 +5670,18 @@ qboolean Menu_Parse(char *inbuffer, menuDef_t *menu) continue; } key = KeywordHash_Find(menuParseKeywordHash, token2); - - if (!key) + + if (!key) { PC_ParseWarning(va("Unknown menu keyword %s",token2)); continue; } - if ( !key->func((itemDef_t*)menu) ) + if ( !key->func((itemDef_t*)menu) ) { PC_ParseWarning(va("Couldn't parse menu keyword %s as %s",token2, key->keyword)); return qfalse; - } + } } } @@ -5684,14 +5690,14 @@ qboolean Menu_Parse(char *inbuffer, menuDef_t *menu) Menu_New =============== */ -void Menu_New(char *buffer) +void Menu_New(char *buffer) { menuDef_t *menu = &Menus[menuCount]; - if (menuCount < MAX_MENUS) + if (menuCount < MAX_MENUS) { Menu_Init(menu); - if (Menu_Parse(buffer, menu)) + if (Menu_Parse(buffer, menu)) { Menu_PostParse(menu); menuCount++; @@ -5704,11 +5710,11 @@ void Menu_New(char *buffer) Menus_CloseAll =============== */ -void Menus_CloseAll(void) +void Menus_CloseAll(void) { int i; - for (i = 0; i < menuCount; i++) + for (i = 0; i < menuCount; i++) { Menu_RunCloseScript ( &Menus[i] ); Menus[i].window.flags &= ~(WINDOW_HASFOCUS | WINDOW_VISIBLE); @@ -5732,7 +5738,7 @@ int PC_StartParseSession(const char *fileName,char **buffer) len = ui.FS_ReadFile( fileName,(void **) buffer ); // Not there? - if ( len>0 ) + if ( len>0 ) { COM_BeginParseSession(); @@ -5781,7 +5787,7 @@ qboolean PC_ParseString(const char **string) hold = COM_ParseString(&parseData[parseDataCount].bufferCurrent,string); - while (hold==0 && **string == 0) + while (hold==0 && **string == 0) { hold = COM_ParseString(&parseData[parseDataCount].bufferCurrent,string); } @@ -5819,7 +5825,7 @@ qboolean PC_ParseColor(vec4_t *color) Menu_Count ================= */ -int Menu_Count(void) +int Menu_Count(void) { return menuCount; } @@ -5829,20 +5835,20 @@ int Menu_Count(void) Menu_PaintAll ================= */ -void Menu_PaintAll(void) +void Menu_PaintAll(void) { int i; - if (captureFunc) + if (captureFunc) { captureFunc(captureData); } - for (i = 0; i < menuCount; i++) + for (i = 0; i < menuCount; i++) { Menu_Paint(&Menus[i], qfalse); } - if (uis.debugMode) + if (uis.debugMode) { vec4_t v = {1, 1, 1, 1}; DC->drawText(5, 25, .75, v, va("(%d,%d)",DC->cursorx,DC->cursory), 0, 0, DC->Assets.qhMediumFont); @@ -5855,11 +5861,11 @@ void Menu_PaintAll(void) Menu_Paint ================= */ -void Menu_Paint(menuDef_t *menu, qboolean forcePaint) +void Menu_Paint(menuDef_t *menu, qboolean forcePaint) { int i; - if (menu == NULL) + if (menu == NULL) { return; } @@ -5884,23 +5890,23 @@ void Menu_Paint(menuDef_t *menu, qboolean forcePaint) } } - if (!(menu->window.flags & WINDOW_VISIBLE) && !forcePaint) + if (!(menu->window.flags & WINDOW_VISIBLE) && !forcePaint) { return; } -// if (menu->window.ownerDrawFlags && DC->ownerDrawVisible && !DC->ownerDrawVisible(menu->window.ownerDrawFlags)) +// if (menu->window.ownerDrawFlags && DC->ownerDrawVisible && !DC->ownerDrawVisible(menu->window.ownerDrawFlags)) // { // return; // } - - if (forcePaint) + + if (forcePaint) { menu->window.flags |= WINDOW_FORCED; } // draw the background if necessary - if (menu->fullScreen) + if (menu->fullScreen) { vec4_t color; @@ -5917,8 +5923,8 @@ void Menu_Paint(menuDef_t *menu, qboolean forcePaint) } DC->drawHandlePic( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, menu->window.background ); - } - else if (menu->window.background) + } + else if (menu->window.background) { // this allows a background shader without being full screen //UI_DrawHandlePic(menu->window.rect.x, menu->window.rect.y, menu->window.rect.w, menu->window.rect.h, menu->backgroundShader); @@ -5929,7 +5935,7 @@ void Menu_Paint(menuDef_t *menu, qboolean forcePaint) // Loop through all items for the menu and paint them int iSlotsVisible = 0; - for (i = 0; i < menu->itemCount; i++) + for (i = 0; i < menu->itemCount; i++) { if (!menu->items[i]->appearanceSlot) { @@ -5954,7 +5960,7 @@ void Menu_Paint(menuDef_t *menu, qboolean forcePaint) } - if (uis.debugMode) + if (uis.debugMode) { vec4_t color; color[0] = color[2] = color[3] = 1; @@ -5968,9 +5974,9 @@ void Menu_Paint(menuDef_t *menu, qboolean forcePaint) Item_EnableShowViaCvar ================= */ -qboolean Item_EnableShowViaCvar(itemDef_t *item, int flag) +qboolean Item_EnableShowViaCvar(itemDef_t *item, int flag) { - if (item && item->enableCvar && *item->enableCvar && item->cvarTest && *item->cvarTest) + if (item && item->enableCvar && *item->enableCvar && item->cvarTest && *item->cvarTest) { char script[1024]; const char *p; @@ -5980,8 +5986,8 @@ qboolean Item_EnableShowViaCvar(itemDef_t *item, int flag) const char *val; p = item->enableCvar; COM_BeginParseSession(); - if (!String_Parse(&p, &val)) - {//strip the quotes off + if (!String_Parse(&p, &val)) + {//strip the quotes off COM_EndParseSession(); return (item->cvarFlags & flag) ? qfalse : qtrue; } @@ -5998,34 +6004,34 @@ qboolean Item_EnableShowViaCvar(itemDef_t *item, int flag) p = script; } COM_BeginParseSession(); - while (1) + while (1) { const char *val; // expect value then ; or NULL, NULL ends list - if (!String_Parse(&p, &val)) + if (!String_Parse(&p, &val)) { COM_EndParseSession(); return (item->cvarFlags & flag) ? qfalse : qtrue; } - if (val[0] == ';' && val[1] == '\0') + if (val[0] == ';' && val[1] == '\0') { continue; } // enable it if any of the values are true - if (item->cvarFlags & flag) + if (item->cvarFlags & flag) { - if (Q_stricmp(buff, val) == 0) + if (Q_stricmp(buff, val) == 0) { COM_EndParseSession(); return qtrue; } - } - else + } + else { // disable it if any of the values are true - if (Q_stricmp(buff, val) == 0) + if (Q_stricmp(buff, val) == 0) { COM_EndParseSession(); return qfalse; @@ -6060,11 +6066,11 @@ bool HasStringLanguageChanged ( const itemDef_t *item ) Item_SetTextExtents ================= */ -void Item_SetTextExtents(itemDef_t *item, int *width, int *height, const char *text) +void Item_SetTextExtents(itemDef_t *item, int *width, int *height, const char *text) { const char *textPtr = (text) ? text : item->text; - if (textPtr == NULL ) + if (textPtr == NULL ) { return; } @@ -6081,11 +6087,11 @@ void Item_SetTextExtents(itemDef_t *item, int *width, int *height, const char *t originalWidth = DC->textWidth(textPtr, item->textscale, item->font); - if (item->type == ITEM_TYPE_OWNERDRAW && (item->textalignment == ITEM_ALIGN_CENTER || item->textalignment == ITEM_ALIGN_RIGHT)) + if (item->type == ITEM_TYPE_OWNERDRAW && (item->textalignment == ITEM_ALIGN_CENTER || item->textalignment == ITEM_ALIGN_RIGHT)) { originalWidth += DC->ownerDrawWidth(item->window.ownerDraw, item->textscale); - } - else if (item->type == ITEM_TYPE_EDITFIELD && item->textalignment == ITEM_ALIGN_CENTER && item->cvar) + } + else if (item->type == ITEM_TYPE_EDITFIELD && item->textalignment == ITEM_ALIGN_CENTER && item->cvar) { char buff[256]; DC->getCVarString(item->cvar, buff, 256); @@ -6099,11 +6105,11 @@ void Item_SetTextExtents(itemDef_t *item, int *width, int *height, const char *t item->textRect.h = *height; item->textRect.x = item->textalignx; item->textRect.y = item->textaligny; - if (item->textalignment == ITEM_ALIGN_RIGHT) + if (item->textalignment == ITEM_ALIGN_RIGHT) { item->textRect.x = item->textalignx - originalWidth; - } - else if (item->textalignment == ITEM_ALIGN_CENTER) + } + else if (item->textalignment == ITEM_ALIGN_CENTER) { item->textRect.x = item->textalignx - originalWidth / 2; } @@ -6124,7 +6130,7 @@ void Item_SetTextExtents(itemDef_t *item, int *width, int *height, const char *t Item_TextColor ================= */ -void Item_TextColor(itemDef_t *item, vec4_t *newColor) +void Item_TextColor(itemDef_t *item, vec4_t *newColor) { vec4_t lowLight; const vec4_t greyColor = { .5, .5, .5, 1}; @@ -6132,31 +6138,31 @@ void Item_TextColor(itemDef_t *item, vec4_t *newColor) Fade(&item->window.flags, &item->window.foreColor[3], parent->fadeClamp, &item->window.nextTime, parent->fadeCycle, qtrue, parent->fadeAmount); - if ( !(item->type == ITEM_TYPE_TEXT && item->window.flags & WINDOW_AUTOWRAPPED) && item->window.flags & WINDOW_HASFOCUS) + if ( !(item->type == ITEM_TYPE_TEXT && item->window.flags & WINDOW_AUTOWRAPPED) && item->window.flags & WINDOW_HASFOCUS) { - lowLight[0] = 0.8 * parent->focusColor[0]; - lowLight[1] = 0.8 * parent->focusColor[1]; - lowLight[2] = 0.8 * parent->focusColor[2]; - lowLight[3] = 0.8 * parent->focusColor[3]; + lowLight[0] = 0.8 * parent->focusColor[0]; + lowLight[1] = 0.8 * parent->focusColor[1]; + lowLight[2] = 0.8 * parent->focusColor[2]; + lowLight[3] = 0.8 * parent->focusColor[3]; LerpColor(parent->focusColor,lowLight,*newColor,0.5+0.5*sin((float)(DC->realTime / PULSE_DIVISOR))); - } -/* else if (item->textStyle == ITEM_TEXTSTYLE_BLINK && !((DC->realTime/BLINK_DIVISOR) & 1)) + } +/* else if (item->textStyle == ITEM_TEXTSTYLE_BLINK && !((DC->realTime/BLINK_DIVISOR) & 1)) { - lowLight[0] = 0.8 * item->window.foreColor[0]; - lowLight[1] = 0.8 * item->window.foreColor[1]; - lowLight[2] = 0.8 * item->window.foreColor[2]; - lowLight[3] = 0.8 * item->window.foreColor[3]; + lowLight[0] = 0.8 * item->window.foreColor[0]; + lowLight[1] = 0.8 * item->window.foreColor[1]; + lowLight[2] = 0.8 * item->window.foreColor[2]; + lowLight[3] = 0.8 * item->window.foreColor[3]; LerpColor(item->window.foreColor,lowLight,*newColor,0.5+0.5*sin(DC->realTime / PULSE_DIVISOR)); - } -*/ else + } +*/ else { memcpy(newColor, &item->window.foreColor, sizeof(vec4_t)); } // items can be enabled and disabled based on cvars - if (item->enableCvar && *item->enableCvar && item->cvarTest && *item->cvarTest) + if (item->enableCvar && *item->enableCvar && item->cvarTest && *item->cvarTest) { - if (item->cvarFlags & (CVAR_ENABLE | CVAR_DISABLE) && !Item_EnableShowViaCvar(item, CVAR_ENABLE)) + if (item->cvarFlags & (CVAR_ENABLE | CVAR_DISABLE) && !Item_EnableShowViaCvar(item, CVAR_ENABLE)) { memcpy(newColor, &parent->disableColor, sizeof(vec4_t)); } @@ -6173,7 +6179,7 @@ void Item_TextColor(itemDef_t *item, vec4_t *newColor) Item_Text_Wrapped_Paint ================= */ -void Item_Text_Wrapped_Paint(itemDef_t *item) +void Item_Text_Wrapped_Paint(itemDef_t *item) { char text[1024]; const char *p, *start, *textPtr; @@ -6185,19 +6191,19 @@ void Item_Text_Wrapped_Paint(itemDef_t *item) // now paint the text and/or any optional images // default to left - if (item->text == NULL) + if (item->text == NULL) { - if (item->cvar == NULL) + if (item->cvar == NULL) { return; } - else + else { DC->getCVarString(item->cvar, text, sizeof(text)); textPtr = text; } } - else + else { textPtr = item->text; } @@ -6206,7 +6212,7 @@ void Item_Text_Wrapped_Paint(itemDef_t *item) textPtr = SE_GetString( &textPtr[1] ); } - if (*textPtr == '\0') + if (*textPtr == '\0') { return; } @@ -6218,7 +6224,7 @@ void Item_Text_Wrapped_Paint(itemDef_t *item) y = item->textRect.y; start = textPtr; p = strchr(textPtr, '\r'); - while (p && *p) + while (p && *p) { strncpy(buff, start, p-start+1); buff[p-start] = '\0'; @@ -6236,38 +6242,38 @@ void Item_Text_Wrapped_Paint(itemDef_t *item) Menu_Paint ================= */ -void Item_Text_Paint(itemDef_t *item) +void Item_Text_Paint(itemDef_t *item) { char text[1024]; const char *textPtr; int height, width; vec4_t color; - if (item->window.flags & WINDOW_WRAPPED) + if (item->window.flags & WINDOW_WRAPPED) { Item_Text_Wrapped_Paint(item); return; } - if (item->window.flags & WINDOW_AUTOWRAPPED) + if (item->window.flags & WINDOW_AUTOWRAPPED) { Item_Text_AutoWrapped_Paint(item); return; } - if (item->text == NULL) + if (item->text == NULL) { - if (item->cvar == NULL) + if (item->cvar == NULL) { return; } - else + else { DC->getCVarString(item->cvar, text, sizeof(text)); textPtr = text; } } - else + else { textPtr = item->text; } @@ -6286,7 +6292,7 @@ void Item_Text_Paint(itemDef_t *item) // this needs to go here as it sets extents for cvar types as well Item_SetTextExtents(item, &width, &height, textPtr); - if (*textPtr == '\0') + if (*textPtr == '\0') { return; } @@ -6313,12 +6319,12 @@ Item_UpdatePosition ================= */ // FIXME: consolidate this with nearby stuff -void Item_UpdatePosition(itemDef_t *item) +void Item_UpdatePosition(itemDef_t *item) { float x, y; menuDef_t *menu; - if (item == NULL || item->parent == NULL) + if (item == NULL || item->parent == NULL) { return; } @@ -6328,7 +6334,7 @@ void Item_UpdatePosition(itemDef_t *item) x = menu->window.rect.x; y = menu->window.rect.y; - if (menu->window.border != 0) + if (menu->window.border != 0) { x += menu->window.borderSize; y += menu->window.borderSize; @@ -6343,7 +6349,7 @@ void Item_UpdatePosition(itemDef_t *item) Item_TextField_Paint ================= */ -void Item_TextField_Paint(itemDef_t *item) +void Item_TextField_Paint(itemDef_t *item) { char buff[1024]; vec4_t newColor, lowLight; @@ -6355,37 +6361,37 @@ void Item_TextField_Paint(itemDef_t *item) buff[0] = '\0'; - if (item->cvar) + if (item->cvar) { DC->getCVarString(item->cvar, buff, sizeof(buff)); - } + } - if (item->window.flags & WINDOW_HASFOCUS) + if (item->window.flags & WINDOW_HASFOCUS) { - lowLight[0] = 0.8 * parent->focusColor[0]; - lowLight[1] = 0.8 * parent->focusColor[1]; - lowLight[2] = 0.8 * parent->focusColor[2]; - lowLight[3] = 0.8 * parent->focusColor[3]; + lowLight[0] = 0.8 * parent->focusColor[0]; + lowLight[1] = 0.8 * parent->focusColor[1]; + lowLight[2] = 0.8 * parent->focusColor[2]; + lowLight[3] = 0.8 * parent->focusColor[3]; LerpColor(parent->focusColor,lowLight,newColor,0.5+0.5*sin((float)(DC->realTime / PULSE_DIVISOR))); - } - else + } + else { memcpy(&newColor, &item->window.foreColor, sizeof(vec4_t)); } offset = 8;//(item->text && *item->text) ? 8 : 0; - if (item->window.flags & WINDOW_HASFOCUS && g_editingField) + if (item->window.flags & WINDOW_HASFOCUS && g_editingField) { char cursor = DC->getOverstrikeMode() ? '_' : '|'; DC->drawTextWithCursor(item->textRect.x + item->textRect.w + offset, item->textRect.y, item->textscale, newColor, buff + editPtr->paintOffset, item->cursorPos - editPtr->paintOffset , cursor, /*editPtr->maxPaintChars*/ item->window.rect.w, item->textStyle, item->font); - } - else + } + else { DC->drawText(item->textRect.x + item->textRect.w + offset, item->textRect.y, item->textscale, newColor, buff + editPtr->paintOffset, /*editPtr->maxPaintChars*/ item->window.rect.w, item->textStyle, item->font); } } -void Item_TextScroll_Paint(itemDef_t *item) +void Item_TextScroll_Paint(itemDef_t *item) { char cvartext[1024]; float x, y, size, count, thumb; @@ -6396,7 +6402,7 @@ void Item_TextScroll_Paint(itemDef_t *item) // Re-arranged this function. Previous version had a plethora of bugs. // Still a little iffy - BTO (VV) - if (item->cvar) + if (item->cvar) { DC->getCVarString(item->cvar, cvartext, sizeof(cvartext)); item->text = cvartext; @@ -6405,7 +6411,7 @@ void Item_TextScroll_Paint(itemDef_t *item) Item_TextScroll_BuildLines ( item ); count = scrollPtr->iLineCount; - // Draw scroll bar if text goes beyond bottom + // Draw scroll bar if text goes beyond bottom if (( scrollPtr->iLineCount * scrollPtr->lineHeight ) > size) { // draw scrollbar to right side of the window @@ -6419,10 +6425,10 @@ void Item_TextScroll_Paint(itemDef_t *item) DC->drawHandlePic(x, y, SCROLLBAR_SIZE, size+1, DC->Assets.scrollBar); y += size - 1; DC->drawHandlePic(x, y, SCROLLBAR_SIZE, SCROLLBAR_SIZE, DC->Assets.scrollBarArrowDown); - + // thumb thumb = Item_TextScroll_ThumbDrawPosition(item); - if (thumb > y - SCROLLBAR_SIZE - 1) + if (thumb > y - SCROLLBAR_SIZE - 1) { thumb = y - SCROLLBAR_SIZE - 1; } @@ -6435,12 +6441,12 @@ void Item_TextScroll_Paint(itemDef_t *item) y = item->window.rect.y + item->textaligny + 1; - for (i = scrollPtr->startPos; i < count; i++) + for (i = scrollPtr->startPos; i < count; i++) { const char *text; text = scrollPtr->pLines[i]; - if (!text) + if (!text) { continue; } @@ -6448,7 +6454,7 @@ void Item_TextScroll_Paint(itemDef_t *item) DC->drawText(x + 4, y, item->textscale, item->window.foreColor, text, 0, item->textStyle, item->font); size -= scrollPtr->lineHeight; - if (size < scrollPtr->lineHeight) + if (size < scrollPtr->lineHeight) { scrollPtr->drawPadding = scrollPtr->lineHeight - size; break; @@ -6465,7 +6471,7 @@ Item_ListBox_Paint ================= */ -void Item_ListBox_Paint(itemDef_t *item) +void Item_ListBox_Paint(itemDef_t *item) { float x, y, size; int count, i, thumb; @@ -6489,14 +6495,14 @@ void Item_ListBox_Paint(itemDef_t *item) item->cursorPos = 0; } // default is vertical if horizontal flag is not here - if (item->window.flags & WINDOW_HORIZONTAL) + if (item->window.flags & WINDOW_HORIZONTAL) { //JLF new variable (code just indented) if (!listPtr->scrollhidden) { // draw scrollbar in bottom of the window // bar - if (Item_ListBox_MaxScroll(item) > 0) + if (Item_ListBox_MaxScroll(item) > 0) { x = item->window.rect.x + 1; y = item->window.rect.y + item->window.rect.h - SCROLLBAR_SIZE - 1; @@ -6508,7 +6514,7 @@ void Item_ListBox_Paint(itemDef_t *item) DC->drawHandlePic(x, y, SCROLLBAR_SIZE, SCROLLBAR_SIZE, DC->Assets.scrollBarArrowRight); // thumb thumb = Item_ListBox_ThumbDrawPosition(item);//Item_ListBox_ThumbPosition(item); - if (thumb > x - SCROLLBAR_SIZE - 1) + if (thumb > x - SCROLLBAR_SIZE - 1) { thumb = x - SCROLLBAR_SIZE - 1; } @@ -6525,19 +6531,19 @@ void Item_ListBox_Paint(itemDef_t *item) size = item->window.rect.w - 2; // items // size contains max available space - if (listPtr->elementStyle == LISTBOX_IMAGE) + if (listPtr->elementStyle == LISTBOX_IMAGE) { // fit = 0; x = item->window.rect.x + 1; y = item->window.rect.y + 1; - for (i = listPtr->startPos; i < count; i++) + for (i = listPtr->startPos; i < count; i++) { // always draw at least one // which may overdraw the box if it is too small for the element image = DC->feederItemImage(item->special, i); - if (image) + if (image) { - if (item->window.flags & WINDOW_PLAYERCOLOR) + if (item->window.flags & WINDOW_PLAYERCOLOR) { vec4_t color; color[0] = ui_char_color_red.integer/255.0f; @@ -6549,13 +6555,13 @@ void Item_ListBox_Paint(itemDef_t *item) DC->drawHandlePic(x+1, y+1, listPtr->elementWidth - 2, listPtr->elementHeight - 2, image); } - if (i == item->cursorPos) + if (i == item->cursorPos) { DC->drawRect(x, y, listPtr->elementWidth-1, listPtr->elementHeight-1, item->window.borderSize, item->window.borderColor); } size -= listPtr->elementWidth; - if (size < listPtr->elementWidth) + if (size < listPtr->elementWidth) { listPtr->drawPadding = size; //listPtr->elementWidth - size; break; @@ -6564,13 +6570,13 @@ void Item_ListBox_Paint(itemDef_t *item) listPtr->endPos++; // fit++; } - } - else + } + else { // } } - else + else { //JLF new variable (code idented with if) if (!listPtr->scrollhidden) @@ -6588,7 +6594,7 @@ void Item_ListBox_Paint(itemDef_t *item) DC->drawHandlePic(x, y, SCROLLBAR_SIZE, SCROLLBAR_SIZE, DC->Assets.scrollBarArrowDown); // thumb thumb = Item_ListBox_ThumbDrawPosition(item);//Item_ListBox_ThumbPosition(item); - if (thumb > y - SCROLLBAR_SIZE - 1) + if (thumb > y - SCROLLBAR_SIZE - 1) { thumb = y - SCROLLBAR_SIZE - 1; } @@ -6597,30 +6603,30 @@ void Item_ListBox_Paint(itemDef_t *item) //JLF end // adjust size for item painting size = item->window.rect.h - 2; - if (listPtr->elementStyle == LISTBOX_IMAGE) + if (listPtr->elementStyle == LISTBOX_IMAGE) { // fit = 0; x = item->window.rect.x + 1; y = item->window.rect.y + 1; - for (i = listPtr->startPos; i < count; i++) + for (i = listPtr->startPos; i < count; i++) { // always draw at least one // which may overdraw the box if it is too small for the element image = DC->feederItemImage(item->special, i); - if (image) + if (image) { DC->drawHandlePic(x+1, y+1, listPtr->elementWidth - 2, listPtr->elementHeight - 2, image); } - if (i == item->cursorPos) + if (i == item->cursorPos) { DC->drawRect(x, y, listPtr->elementWidth - 1, listPtr->elementHeight - 1, item->window.borderSize, item->window.borderColor); } listPtr->endPos++; size -= listPtr->elementHeight; - if (size < listPtr->elementHeight) + if (size < listPtr->elementHeight) { listPtr->drawPadding = listPtr->elementHeight - size; break; @@ -6628,23 +6634,23 @@ void Item_ListBox_Paint(itemDef_t *item) y += listPtr->elementHeight; // fit++; } - } - else + } + else { x = item->window.rect.x + 1; y = item->window.rect.y + 1 - listPtr->elementHeight; i = listPtr->startPos; - for (; i < count; i++) + for (; i < count; i++) { const char *text; // always draw at least one // which may overdraw the box if it is too small for the element - if (listPtr->numColumns > 0) + if (listPtr->numColumns > 0) { int j; - for (j = 0; j < listPtr->numColumns; j++) + for (j = 0; j < listPtr->numColumns; j++) { text = DC->feederItemText(item->special, i, j, &optionalImage); if (text[0]=='@') @@ -6652,17 +6658,17 @@ void Item_ListBox_Paint(itemDef_t *item) text = SE_GetString( &text[1] ); } - if (optionalImage >= 0) + if (optionalImage >= 0) { DC->drawHandlePic(x + 4 + listPtr->columnInfo[j].pos, y - 1 + listPtr->elementHeight / 2, listPtr->columnInfo[j].width, listPtr->columnInfo[j].width, optionalImage); - } - else if (text) + } + else if (text) { vec4_t *color; menuDef_t *parent = (menuDef_t*)item->parent; // Use focus color is it has focus. - if (i == item->cursorPos) + if (i == item->cursorPos) { color = &parent->focusColor; } @@ -6678,16 +6684,16 @@ void Item_ListBox_Paint(itemDef_t *item) DC->drawText(x + 4 + listPtr->columnInfo[j].pos, y + listPtr->elementHeight+ textyOffset, item->textscale, *color, text, listPtr->columnInfo[j].maxChars, item->textStyle, item->font); } } - } - else + } + else { text = DC->feederItemText(item->special, i, 0, &optionalImage); - if (optionalImage >= 0) + if (optionalImage >= 0) { //DC->drawHandlePic(x + 4 + listPtr->elementHeight, y, listPtr->columnInfo[j].width, listPtr->columnInfo[j].width, optionalImage); - } - else if (text) + } + else if (text) { DC->drawText(x + 4, y + listPtr->elementHeight, item->textscale, item->window.foreColor, text, 0, item->textStyle, item->font); } @@ -6695,13 +6701,13 @@ void Item_ListBox_Paint(itemDef_t *item) } // The chosen text - if (i == item->cursorPos) + if (i == item->cursorPos) { DC->fillRect(x + 2, y + listPtr->elementHeight + 2, item->window.rect.w - SCROLLBAR_SIZE - 4, listPtr->elementHeight+2, item->window.outlineColor); } size -= listPtr->elementHeight; - if (size < listPtr->elementHeight) + if (size < listPtr->elementHeight) { listPtr->drawPadding = listPtr->elementHeight - size; break; @@ -6781,7 +6787,7 @@ void BindingFromName( const char *cvar ) { Item_Bind_Paint ================= */ -void Item_Bind_Paint(itemDef_t *item) +void Item_Bind_Paint(itemDef_t *item) { vec4_t newColor, lowLight; float value,textScale,textWidth; @@ -6790,37 +6796,37 @@ void Item_Bind_Paint(itemDef_t *item) menuDef_t *parent = (menuDef_t*)item->parent; editFieldDef_t *editPtr = (editFieldDef_t*)item->typeData; - if (editPtr) + if (editPtr) { maxChars = editPtr->maxPaintChars; } value = (item->cvar) ? DC->getCVarValue(item->cvar) : 0; - if (item->window.flags & WINDOW_HASFOCUS) + if (item->window.flags & WINDOW_HASFOCUS) { - if (g_bindItem == item) + if (g_bindItem == item) { lowLight[0] = 0.8f * 1.0f; lowLight[1] = 0.8f * 0.0f; lowLight[2] = 0.8f * 0.0f; lowLight[3] = 0.8f * 1.0f; - } - else + } + else { - lowLight[0] = 0.8f * parent->focusColor[0]; - lowLight[1] = 0.8f * parent->focusColor[1]; - lowLight[2] = 0.8f * parent->focusColor[2]; - lowLight[3] = 0.8f * parent->focusColor[3]; + lowLight[0] = 0.8f * parent->focusColor[0]; + lowLight[1] = 0.8f * parent->focusColor[1]; + lowLight[2] = 0.8f * parent->focusColor[2]; + lowLight[3] = 0.8f * parent->focusColor[3]; } LerpColor(parent->focusColor,lowLight,newColor,0.5+0.5*sin((float)(DC->realTime / PULSE_DIVISOR))); - } - else + } + else { Item_TextColor( item,&newColor); } - if (item->text) + if (item->text) { Item_Text_Paint(item); BindingFromName(item->cvar); @@ -6846,8 +6852,8 @@ void Item_Bind_Paint(itemDef_t *item) } DC->drawText(startingXPos, item->textRect.y + yAdj, textScale, newColor, g_nameBind, maxChars/*item->textRect.w*/, item->textStyle, item->font); - } - else + } + else { DC->drawText(item->textRect.x, item->textRect.y, item->textscale, newColor, (value != 0) ? "FIXME 1" : "FIXME 0", maxChars/*item->textRect.w*/, item->textStyle, item->font); } @@ -6880,7 +6886,7 @@ Item_Model_Paint */ extern int s_entityWavVol[MAX_GENTITIES]; //from snd_dma.cpp -void UI_TalkingHead(itemDef_t *item) +void UI_TalkingHead(itemDef_t *item) { // static int facial_blink = DC->realTime + Q_flrand(4000.0, 8000.0); static int facial_timer = DC->realTime + Q_flrand(10000.0, 30000.0); @@ -6896,8 +6902,8 @@ void UI_TalkingHead(itemDef_t *item) CG_G2SetHeadBlink( cent, qfalse ); //stop the blink } } - else // no we aren't blinking - { + else // no we aren't blinking + { if (facial_blink < DC->realTime)// but should we start ? { CG_G2SetHeadBlink( cent, qtrue ); @@ -6909,9 +6915,9 @@ void UI_TalkingHead(itemDef_t *item) { facial_blink = -(DC->realTime + 300.0f);// set blink timer } - } + } } -*/ +*/ if (s_entityWavVol[0] > 0) // if we aren't talking, then it will be 0, -1 for talking but paused { @@ -6942,7 +6948,7 @@ void UI_TalkingHead(itemDef_t *item) anim = facial_anim; } } - else // no we aren't animating + else // no we aren't animating { // but should we start ? if (facial_timer < DC->realTime) {//yes @@ -6950,8 +6956,8 @@ void UI_TalkingHead(itemDef_t *item) // set aux timer facial_timer = -(DC->realTime + 2000.0); anim = facial_anim; - } - } + } + } }//talking */ if (facial_timer < DC->realTime) @@ -6973,7 +6979,7 @@ Item_Model_Paint */ extern void UI_SaberDrawBlades( itemDef_t *item, vec3_t origin, float curYaw ); -void Item_Model_Paint(itemDef_t *item) +void Item_Model_Paint(itemDef_t *item) { float x, y, w, h; refdef_t refdef; @@ -6982,7 +6988,7 @@ void Item_Model_Paint(itemDef_t *item) vec3_t angles; const modelDef_t *modelPtr = (modelDef_t*)item->typeData; - if (modelPtr == NULL) + if (modelPtr == NULL) { return; } @@ -7009,13 +7015,13 @@ void Item_Model_Paint(itemDef_t *item) origin[1] = 0.5 * ( mins[1] + maxs[1] ); // calculate distance so the model nearly fills the box - if (qtrue) + if (qtrue) { - float len = 0.5 * ( maxs[2] - mins[2] ); + float len = 0.5 * ( maxs[2] - mins[2] ); origin[0] = len / 0.268; // len / tan( fov/2 ) //origin[0] = len / tan(w/2); - } - else + } + else { origin[0] = item->textscale; } @@ -7025,7 +7031,7 @@ void Item_Model_Paint(itemDef_t *item) refdef.fov_x = 45; refdef.fov_y = 45; - + //refdef.fov_x = (int)((float)refdef.width / 640.0f * 90.0f); //xx = refdef.width / tan( refdef.fov_x / 360 * M_PI ); //refdef.fov_y = atan2( refdef.height, xx ); @@ -7045,9 +7051,9 @@ void Item_Model_Paint(itemDef_t *item) // use item storage to track /* - if (modelPtr->rotationSpeed) + if (modelPtr->rotationSpeed) { - if (DC->realTime > item->window.nextTime) + if (DC->realTime > item->window.nextTime) { item->window.nextTime = DC->realTime + modelPtr->rotationSpeed; modelPtr->angle = (int)(modelPtr->angle + 1) % 360; @@ -7056,7 +7062,7 @@ void Item_Model_Paint(itemDef_t *item) VectorSet( angles, 0, modelPtr->angle, 0 ); */ VectorSet( angles, 0, (float)(refdef.time/20.0f), 0); - + AnglesToAxis( angles, ent.axis ); ent.hModel = item->asset; @@ -7072,7 +7078,7 @@ void Item_Model_Paint(itemDef_t *item) #else // a moves datapad anim is playing if (uiInfo.moveAnimTime && (uiInfo.moveAnimTime < uiInfo.uiDC.realTime)) - { + { modelDef_t *modelPtr; modelPtr = (modelDef_t*)item->typeData; if (modelPtr) @@ -7081,7 +7087,7 @@ void Item_Model_Paint(itemDef_t *item) switch( modelPtr->g2anim ) { case BOTH_FORCEWALLREBOUND_FORWARD: - case BOTH_FORCEJUMP1: + case BOTH_FORCEJUMP1: ItemParse_model_g2anim_go( item, animTable[BOTH_FORCEINAIR1].name ); uiInfo.moveAnimTime = DC->g2hilev_SetAnim(&item->ghoul2[0], "model_root", modelPtr->g2anim, qtrue); if ( !uiInfo.moveAnimTime ) @@ -7173,7 +7179,7 @@ void Item_Model_Paint(itemDef_t *item) // refdef.fov_y = (modelPtr->fov_y) ? modelPtr->fov_y : refdef.height; // calculate distance so the model nearly fills the box - float len = 0.5 * ( maxs[2] - mins[2] ); + float len = 0.5 * ( maxs[2] - mins[2] ); origin[0] = len / 0.268; DC->clearScene(); @@ -7186,7 +7192,7 @@ void Item_Model_Paint(itemDef_t *item) // use item storage to track float curYaw = modelPtr->angle; - if (modelPtr->rotationSpeed) + if (modelPtr->rotationSpeed) { curYaw += (float)refdef.time/modelPtr->rotationSpeed; } @@ -7199,7 +7205,7 @@ void Item_Model_Paint(itemDef_t *item) VectorSet( angles, 0, curYaw, 0 ); } - + AnglesToAxis( angles, ent.axis ); if (item->flags&ITF_G2VALID) @@ -7230,7 +7236,7 @@ void Item_Model_Paint(itemDef_t *item) // Set up lighting //VectorCopy( refdef.vieworg, ent.lightingOrigin ); - ent.renderfx = RF_LIGHTING_ORIGIN | RF_NOSHADOW; + ent.renderfx = RF_NOSHADOW; ui.R_AddLightToScene(refdef.vieworg, 500, 1, 1, 1); //fixme: specify in menu file! @@ -7244,30 +7250,30 @@ void Item_Model_Paint(itemDef_t *item) Item_OwnerDraw_Paint ================= */ -void Item_OwnerDraw_Paint(itemDef_t *item) +void Item_OwnerDraw_Paint(itemDef_t *item) { menuDef_t *parent; - if (item == NULL) + if (item == NULL) { return; } parent = (menuDef_t*)item->parent; - if (DC->ownerDrawItem) + if (DC->ownerDrawItem) { vec4_t color, lowLight; Fade(&item->window.flags, &item->window.foreColor[3], parent->fadeClamp, &item->window.nextTime, parent->fadeCycle, qtrue, parent->fadeAmount); memcpy(&color, &item->window.foreColor, sizeof(color)); - if (item->numColors > 0 && DC->getValue) + if (item->numColors > 0 && DC->getValue) { // if the value is within one of the ranges then set color to that, otherwise leave at default int i; float f = DC->getValue(item->window.ownerDraw); - for (i = 0; i < item->numColors; i++) + for (i = 0; i < item->numColors; i++) { - if (f >= item->colorRanges[i].low && f <= item->colorRanges[i].high) + if (f >= item->colorRanges[i].low && f <= item->colorRanges[i].high) { memcpy(&color, &item->colorRanges[i].color, sizeof(color)); break; @@ -7275,43 +7281,43 @@ void Item_OwnerDraw_Paint(itemDef_t *item) } } - if (item->window.flags & WINDOW_HASFOCUS) + if (item->window.flags & WINDOW_HASFOCUS) { - lowLight[0] = 0.8 * parent->focusColor[0]; - lowLight[1] = 0.8 * parent->focusColor[1]; - lowLight[2] = 0.8 * parent->focusColor[2]; - lowLight[3] = 0.8 * parent->focusColor[3]; + lowLight[0] = 0.8 * parent->focusColor[0]; + lowLight[1] = 0.8 * parent->focusColor[1]; + lowLight[2] = 0.8 * parent->focusColor[2]; + lowLight[3] = 0.8 * parent->focusColor[3]; LerpColor(parent->focusColor,lowLight,color,0.5+0.5*sin((float)(DC->realTime / PULSE_DIVISOR))); - } - else if (item->textStyle == ITEM_TEXTSTYLE_BLINK && !((DC->realTime/BLINK_DIVISOR) & 1)) + } + else if (item->textStyle == ITEM_TEXTSTYLE_BLINK && !((DC->realTime/BLINK_DIVISOR) & 1)) { - lowLight[0] = 0.8 * item->window.foreColor[0]; - lowLight[1] = 0.8 * item->window.foreColor[1]; - lowLight[2] = 0.8 * item->window.foreColor[2]; - lowLight[3] = 0.8 * item->window.foreColor[3]; + lowLight[0] = 0.8 * item->window.foreColor[0]; + lowLight[1] = 0.8 * item->window.foreColor[1]; + lowLight[2] = 0.8 * item->window.foreColor[2]; + lowLight[3] = 0.8 * item->window.foreColor[3]; LerpColor(item->window.foreColor,lowLight,color,0.5+0.5*sin((float)(DC->realTime / PULSE_DIVISOR))); } - if (item->cvarFlags & (CVAR_ENABLE | CVAR_DISABLE) && !Item_EnableShowViaCvar(item, CVAR_ENABLE)) + if (item->cvarFlags & (CVAR_ENABLE | CVAR_DISABLE) && !Item_EnableShowViaCvar(item, CVAR_ENABLE)) { memcpy(color, parent->disableColor, sizeof(vec4_t)); } - - if (item->text) + + if (item->text) { Item_Text_Paint(item); // +8 is an offset kludge to properly align owner draw items that have text combined with them DC->ownerDrawItem(item->textRect.x + item->textRect.w + 8, item->window.rect.y, item->window.rect.w, item->window.rect.h, 0, item->textaligny, item->window.ownerDraw, item->window.ownerDrawFlags, item->alignment, item->special, item->textscale, color, item->window.background, item->textStyle, item->font ); - } - else + } + else { DC->ownerDrawItem(item->window.rect.x, item->window.rect.y, item->window.rect.w, item->window.rect.h, item->textalignx, item->textaligny, item->window.ownerDraw, item->window.ownerDrawFlags, item->alignment, item->special, item->textscale, color, item->window.background, item->textStyle, item->font ); } } } -void Item_YesNo_Paint(itemDef_t *item) +void Item_YesNo_Paint(itemDef_t *item) { vec4_t newColor, lowLight; float value; @@ -7319,15 +7325,15 @@ void Item_YesNo_Paint(itemDef_t *item) value = (item->cvar) ? DC->getCVarValue(item->cvar) : 0; - if (item->window.flags & WINDOW_HASFOCUS) + if (item->window.flags & WINDOW_HASFOCUS) { - lowLight[0] = 0.8 * parent->focusColor[0]; - lowLight[1] = 0.8 * parent->focusColor[1]; - lowLight[2] = 0.8 * parent->focusColor[2]; - lowLight[3] = 0.8 * parent->focusColor[3]; + lowLight[0] = 0.8 * parent->focusColor[0]; + lowLight[1] = 0.8 * parent->focusColor[1]; + lowLight[2] = 0.8 * parent->focusColor[2]; + lowLight[3] = 0.8 * parent->focusColor[3]; LerpColor(parent->focusColor,lowLight,newColor,0.5+0.5*sin((float)(DC->realTime / PULSE_DIVISOR))); - } - else + } + else { memcpy(&newColor, &item->window.foreColor, sizeof(vec4_t)); } @@ -7340,23 +7346,23 @@ void Item_YesNo_Paint(itemDef_t *item) const char *psNo = SE_GetString( "MENUS_NO" ); #endif const char *yesnovalue; - + if (item->invertYesNo) yesnovalue = (value == 0) ? psYes : psNo; else yesnovalue = (value != 0) ? psYes : psNo; - if (item->text) + if (item->text) { Item_Text_Paint(item); DC->drawText(item->textRect.x + item->textRect.w + 8, item->textRect.y, item->textscale, newColor, yesnovalue, 0, item->textStyle, item->font); - } - else + } + else { DC->drawText(item->textRect.x, item->textRect.y, item->textscale, newColor, yesnovalue , 0, item->textStyle, item->font); - } - + } + } /* @@ -7364,21 +7370,21 @@ void Item_YesNo_Paint(itemDef_t *item) Item_Multi_Paint ================= */ -void Item_Multi_Paint(itemDef_t *item) +void Item_Multi_Paint(itemDef_t *item) { vec4_t newColor, lowLight; const char *text = ""; menuDef_t *parent = (menuDef_t*)item->parent; - if (item->window.flags & WINDOW_HASFOCUS) + if (item->window.flags & WINDOW_HASFOCUS) { - lowLight[0] = 0.8 * parent->focusColor[0]; - lowLight[1] = 0.8 * parent->focusColor[1]; - lowLight[2] = 0.8 * parent->focusColor[2]; - lowLight[3] = 0.8 * parent->focusColor[3]; + lowLight[0] = 0.8 * parent->focusColor[0]; + lowLight[1] = 0.8 * parent->focusColor[1]; + lowLight[2] = 0.8 * parent->focusColor[2]; + lowLight[3] = 0.8 * parent->focusColor[3]; LerpColor(parent->focusColor,lowLight,newColor,0.5+0.5*sin((float)(DC->realTime / PULSE_DIVISOR))); - } - else + } + else { memcpy(&newColor, &item->window.foreColor, sizeof(vec4_t)); } @@ -7390,26 +7396,26 @@ void Item_Multi_Paint(itemDef_t *item) } - if (item->text) + if (item->text) { Item_Text_Paint(item); DC->drawText(item->textRect.x + item->textRect.w + 8, item->textRect.y, item->textscale, newColor, text, 0, item->textStyle, item->font); - } - else + } + else { //JLF added xoffset DC->drawText(item->textRect.x +item->xoffset, item->textRect.y, item->textscale, newColor, text, 0, item->textStyle, item->font); } } -int Item_TextScroll_MaxScroll ( itemDef_t *item ) +int Item_TextScroll_MaxScroll ( itemDef_t *item ) { textScrollDef_t *scrollPtr = (textScrollDef_t*)item->typeData; - + int count = scrollPtr->iLineCount; int max = count - (int)(item->window.rect.h / scrollPtr->lineHeight) + 1; - if (max < 0) + if (max < 0) { return 0; } @@ -7417,7 +7423,7 @@ int Item_TextScroll_MaxScroll ( itemDef_t *item ) return max; } -int Item_TextScroll_ThumbPosition ( itemDef_t *item ) +int Item_TextScroll_ThumbPosition ( itemDef_t *item ) { float max, pos, size; textScrollDef_t *scrollPtr = (textScrollDef_t*)item->typeData; @@ -7425,30 +7431,30 @@ int Item_TextScroll_ThumbPosition ( itemDef_t *item ) max = Item_TextScroll_MaxScroll ( item ); size = item->window.rect.h - (SCROLLBAR_SIZE * 2) - 2; - if (max > 0) + if (max > 0) { pos = (size-SCROLLBAR_SIZE) / (float) max; - } - else + } + else { pos = 0; } - + pos *= scrollPtr->startPos; - + return item->window.rect.y + 1 + SCROLLBAR_SIZE + pos; } -int Item_TextScroll_ThumbDrawPosition ( itemDef_t *item ) +int Item_TextScroll_ThumbDrawPosition ( itemDef_t *item ) { int min, max; - if (itemCapture == item) + if (itemCapture == item) { min = item->window.rect.y + SCROLLBAR_SIZE + 1; max = item->window.rect.y + item->window.rect.h - 2*SCROLLBAR_SIZE - 1; - if (DC->cursory >= min + SCROLLBAR_SIZE/2 && DC->cursory <= max + SCROLLBAR_SIZE/2) + if (DC->cursory >= min + SCROLLBAR_SIZE/2 && DC->cursory <= max + SCROLLBAR_SIZE/2) { return DC->cursory - SCROLLBAR_SIZE/2; } @@ -7459,7 +7465,7 @@ int Item_TextScroll_ThumbDrawPosition ( itemDef_t *item ) return Item_TextScroll_ThumbPosition(item); } -int Item_TextScroll_OverLB ( itemDef_t *item, float x, float y ) +int Item_TextScroll_OverLB ( itemDef_t *item, float x, float y ) { rectDef_t r; textScrollDef_t *scrollPtr; @@ -7467,7 +7473,7 @@ int Item_TextScroll_OverLB ( itemDef_t *item, float x, float y ) scrollPtr = (textScrollDef_t*)item->typeData; - // Scroll bar isn't drawing so ignore this input + // Scroll bar isn't drawing so ignore this input if ((( scrollPtr->iLineCount * scrollPtr->lineHeight ) <= (item->window.rect.h - 2)) && (item->type == ITEM_TYPE_TEXTSCROLL)) { return 0; @@ -7476,34 +7482,34 @@ int Item_TextScroll_OverLB ( itemDef_t *item, float x, float y ) r.x = item->window.rect.x + item->window.rect.w - SCROLLBAR_SIZE; r.y = item->window.rect.y; r.h = r.w = SCROLLBAR_SIZE; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { return WINDOW_LB_LEFTARROW; } r.y = item->window.rect.y + item->window.rect.h - SCROLLBAR_SIZE; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { return WINDOW_LB_RIGHTARROW; } thumbstart = Item_TextScroll_ThumbPosition(item); r.y = thumbstart; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { return WINDOW_LB_THUMB; } r.y = item->window.rect.y + SCROLLBAR_SIZE; r.h = thumbstart - r.y; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { return WINDOW_LB_PGUP; } r.y = thumbstart + SCROLLBAR_SIZE; r.h = item->window.rect.y + item->window.rect.h - SCROLLBAR_SIZE; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { return WINDOW_LB_PGDN; } @@ -7511,7 +7517,7 @@ int Item_TextScroll_OverLB ( itemDef_t *item, float x, float y ) return 0; } -void Item_TextScroll_MouseEnter (itemDef_t *item, float x, float y) +void Item_TextScroll_MouseEnter (itemDef_t *item, float x, float y) { item->window.flags &= ~(WINDOW_LB_LEFTARROW | WINDOW_LB_RIGHTARROW | WINDOW_LB_THUMB | WINDOW_LB_PGUP | WINDOW_LB_PGDN); item->window.flags |= Item_TextScroll_OverLB(item, x, y); @@ -7522,40 +7528,40 @@ void Item_TextScroll_MouseEnter (itemDef_t *item, float x, float y) Item_Slider_ThumbPosition ================= */ -int Item_ListBox_ThumbDrawPosition(itemDef_t *item) +int Item_ListBox_ThumbDrawPosition(itemDef_t *item) { int min, max; - if (itemCapture == item) + if (itemCapture == item) { - if (item->window.flags & WINDOW_HORIZONTAL) + if (item->window.flags & WINDOW_HORIZONTAL) { min = item->window.rect.x + SCROLLBAR_SIZE + 1; max = item->window.rect.x + item->window.rect.w - 2*SCROLLBAR_SIZE - 1; - if (DC->cursorx >= min + SCROLLBAR_SIZE/2 && DC->cursorx <= max + SCROLLBAR_SIZE/2) + if (DC->cursorx >= min + SCROLLBAR_SIZE/2 && DC->cursorx <= max + SCROLLBAR_SIZE/2) { return DC->cursorx - SCROLLBAR_SIZE/2; } - else + else { return Item_ListBox_ThumbPosition(item); } } - else + else { min = item->window.rect.y + SCROLLBAR_SIZE + 1; max = item->window.rect.y + item->window.rect.h - 2*SCROLLBAR_SIZE - 1; - if (DC->cursory >= min + SCROLLBAR_SIZE/2 && DC->cursory <= max + SCROLLBAR_SIZE/2) + if (DC->cursory >= min + SCROLLBAR_SIZE/2 && DC->cursory <= max + SCROLLBAR_SIZE/2) { return DC->cursory - SCROLLBAR_SIZE/2; } - else + else { return Item_ListBox_ThumbPosition(item); } } } - else + else { return Item_ListBox_ThumbPosition(item); } @@ -7566,32 +7572,32 @@ int Item_ListBox_ThumbDrawPosition(itemDef_t *item) Item_Slider_ThumbPosition ================= */ -float Item_Slider_ThumbPosition(itemDef_t *item) +float Item_Slider_ThumbPosition(itemDef_t *item) { float value, range, x; editFieldDef_t *editDef = (editFieldDef_t *) item->typeData; - if (item->text) + if (item->text) { x = item->textRect.x + item->textRect.w + 8; - } - else + } + else { x = item->window.rect.x; } - if (!editDef || !item->cvar) + if (!editDef || !item->cvar) { return x; } value = DC->getCVarValue(item->cvar); - if (value < editDef->minVal) + if (value < editDef->minVal) { value = editDef->minVal; - } - else if (value > editDef->maxVal) + } + else if (value > editDef->maxVal) { value = editDef->maxVal; } @@ -7612,32 +7618,32 @@ float Item_Slider_ThumbPosition(itemDef_t *item) Item_Slider_Paint ================= */ -void Item_Slider_Paint(itemDef_t *item) +void Item_Slider_Paint(itemDef_t *item) { vec4_t newColor, lowLight; float x, y; menuDef_t *parent = (menuDef_t*)item->parent; - if (item->window.flags & WINDOW_HASFOCUS) + if (item->window.flags & WINDOW_HASFOCUS) { - lowLight[0] = 0.8 * parent->focusColor[0]; - lowLight[1] = 0.8 * parent->focusColor[1]; - lowLight[2] = 0.8 * parent->focusColor[2]; - lowLight[3] = 0.8 * parent->focusColor[3]; + lowLight[0] = 0.8 * parent->focusColor[0]; + lowLight[1] = 0.8 * parent->focusColor[1]; + lowLight[2] = 0.8 * parent->focusColor[2]; + lowLight[3] = 0.8 * parent->focusColor[3]; LerpColor(parent->focusColor,lowLight,newColor,0.5+0.5*sin((float)(DC->realTime / PULSE_DIVISOR))); - } - else + } + else { memcpy(&newColor, &item->window.foreColor, sizeof(vec4_t)); } y = item->window.rect.y; - if (item->text) + if (item->text) { Item_Text_Paint(item); x = item->textRect.x + item->textRect.w + 8; - } - else + } + else { x = item->window.rect.x; } @@ -7655,7 +7661,7 @@ void Item_Slider_Paint(itemDef_t *item) Item_Paint ================= */ -static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) +static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) { int xPos,textWidth; vec4_t red; @@ -7663,7 +7669,7 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) red[0] = red[3] = 1; red[1] = red[2] = 0; - if (item == NULL) + if (item == NULL) { return qfalse; } @@ -7679,9 +7685,9 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) } } - if (item->window.flags & WINDOW_ORBITING) + if (item->window.flags & WINDOW_ORBITING) { - if (DC->realTime > item->window.nextTime) + if (DC->realTime > item->window.nextTime) { float rx, ry, a, c, s, w, h; item->window.nextTime = DC->realTime + item->window.offsetTime; @@ -7701,33 +7707,33 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) } - if (item->window.flags & WINDOW_INTRANSITION) + if (item->window.flags & WINDOW_INTRANSITION) { - if (DC->realTime > item->window.nextTime) + if (DC->realTime > item->window.nextTime) { int done = 0; item->window.nextTime = DC->realTime + item->window.offsetTime; // transition the x,y - if (item->window.rectClient.x == item->window.rectEffects.x) + if (item->window.rectClient.x == item->window.rectEffects.x) { done++; - } - else + } + else { - if (item->window.rectClient.x < item->window.rectEffects.x) + if (item->window.rectClient.x < item->window.rectEffects.x) { item->window.rectClient.x += item->window.rectEffects2.x; - if (item->window.rectClient.x > item->window.rectEffects.x) + if (item->window.rectClient.x > item->window.rectEffects.x) { item->window.rectClient.x = item->window.rectEffects.x; done++; } - } - else + } + else { item->window.rectClient.x -= item->window.rectEffects2.x; - if (item->window.rectClient.x < item->window.rectEffects.x) + if (item->window.rectClient.x < item->window.rectEffects.x) { item->window.rectClient.x = item->window.rectEffects.x; done++; @@ -7735,25 +7741,25 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) } } - if (item->window.rectClient.y == item->window.rectEffects.y) + if (item->window.rectClient.y == item->window.rectEffects.y) { done++; - } - else + } + else { - if (item->window.rectClient.y < item->window.rectEffects.y) + if (item->window.rectClient.y < item->window.rectEffects.y) { item->window.rectClient.y += item->window.rectEffects2.y; - if (item->window.rectClient.y > item->window.rectEffects.y) + if (item->window.rectClient.y > item->window.rectEffects.y) { item->window.rectClient.y = item->window.rectEffects.y; done++; } - } - else + } + else { item->window.rectClient.y -= item->window.rectEffects2.y; - if (item->window.rectClient.y < item->window.rectEffects.y) + if (item->window.rectClient.y < item->window.rectEffects.y) { item->window.rectClient.y = item->window.rectEffects.y; done++; @@ -7761,25 +7767,25 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) } } - if (item->window.rectClient.w == item->window.rectEffects.w) + if (item->window.rectClient.w == item->window.rectEffects.w) { done++; - } - else + } + else { - if (item->window.rectClient.w < item->window.rectEffects.w) + if (item->window.rectClient.w < item->window.rectEffects.w) { item->window.rectClient.w += item->window.rectEffects2.w; - if (item->window.rectClient.w > item->window.rectEffects.w) + if (item->window.rectClient.w > item->window.rectEffects.w) { item->window.rectClient.w = item->window.rectEffects.w; done++; } - } - else + } + else { item->window.rectClient.w -= item->window.rectEffects2.w; - if (item->window.rectClient.w < item->window.rectEffects.w) + if (item->window.rectClient.w < item->window.rectEffects.w) { item->window.rectClient.w = item->window.rectEffects.w; done++; @@ -7787,25 +7793,25 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) } } - if (item->window.rectClient.h == item->window.rectEffects.h) + if (item->window.rectClient.h == item->window.rectEffects.h) { done++; - } - else + } + else { - if (item->window.rectClient.h < item->window.rectEffects.h) + if (item->window.rectClient.h < item->window.rectEffects.h) { item->window.rectClient.h += item->window.rectEffects2.h; - if (item->window.rectClient.h > item->window.rectEffects.h) + if (item->window.rectClient.h > item->window.rectEffects.h) { item->window.rectClient.h = item->window.rectEffects.h; done++; } - } - else + } + else { item->window.rectClient.h -= item->window.rectEffects2.h; - if (item->window.rectClient.h < item->window.rectEffects.h) + if (item->window.rectClient.h < item->window.rectEffects.h) { item->window.rectClient.h = item->window.rectEffects.h; done++; @@ -7815,7 +7821,7 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) Item_UpdatePosition(item); - if (done == 4) + if (done == 4) { item->window.flags &= ~WINDOW_INTRANSITION; } @@ -7824,9 +7830,9 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) } #ifdef _TRANS3 - + //JLF begin model transition stuff - if (item->window.flags & WINDOW_INTRANSITIONMODEL) + if (item->window.flags & WINDOW_INTRANSITIONMODEL) { if ( item->type == ITEM_TYPE_MODEL) { @@ -7836,32 +7842,32 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) modelDef_t * modelptr = (modelDef_t *)item->typeData; - if (DC->realTime > item->window.nextTime) + if (DC->realTime > item->window.nextTime) { int done = 0; item->window.nextTime = DC->realTime + item->window.offsetTime; // transition the x,y,z max - if (modelptr->g2maxs[0] == modelptr->g2maxs2[0]) + if (modelptr->g2maxs[0] == modelptr->g2maxs2[0]) { done++; - } - else + } + else { - if (modelptr->g2maxs[0] < modelptr->g2maxs2[0]) + if (modelptr->g2maxs[0] < modelptr->g2maxs2[0]) { modelptr->g2maxs[0] += modelptr->g2maxsEffect[0]; - if (modelptr->g2maxs[0] > modelptr->g2maxs2[0]) + if (modelptr->g2maxs[0] > modelptr->g2maxs2[0]) { modelptr->g2maxs[0] = modelptr->g2maxs2[0]; done++; } - } - else + } + else { modelptr->g2maxs[0] -= modelptr->g2maxsEffect[0]; - if (modelptr->g2maxs[0] < modelptr->g2maxs2[0]) + if (modelptr->g2maxs[0] < modelptr->g2maxs2[0]) { modelptr->g2maxs[0] = modelptr->g2maxs2[0]; done++; @@ -7869,25 +7875,25 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) } } //y - if (modelptr->g2maxs[1] == modelptr->g2maxs2[1]) + if (modelptr->g2maxs[1] == modelptr->g2maxs2[1]) { done++; - } - else + } + else { - if (modelptr->g2maxs[1] < modelptr->g2maxs2[1]) + if (modelptr->g2maxs[1] < modelptr->g2maxs2[1]) { modelptr->g2maxs[1] += modelptr->g2maxsEffect[1]; - if (modelptr->g2maxs[1] > modelptr->g2maxs2[1]) + if (modelptr->g2maxs[1] > modelptr->g2maxs2[1]) { modelptr->g2maxs[1] = modelptr->g2maxs2[1]; done++; } - } - else + } + else { modelptr->g2maxs[1] -= modelptr->g2maxsEffect[1]; - if (modelptr->g2maxs[1] < modelptr->g2maxs2[1]) + if (modelptr->g2maxs[1] < modelptr->g2maxs2[1]) { modelptr->g2maxs[1] = modelptr->g2maxs2[1]; done++; @@ -7898,25 +7904,25 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) //z - if (modelptr->g2maxs[2] == modelptr->g2maxs2[2]) + if (modelptr->g2maxs[2] == modelptr->g2maxs2[2]) { done++; - } - else + } + else { - if (modelptr->g2maxs[2] < modelptr->g2maxs2[2]) + if (modelptr->g2maxs[2] < modelptr->g2maxs2[2]) { modelptr->g2maxs[2] += modelptr->g2maxsEffect[2]; - if (modelptr->g2maxs[2] > modelptr->g2maxs2[2]) + if (modelptr->g2maxs[2] > modelptr->g2maxs2[2]) { modelptr->g2maxs[2] = modelptr->g2maxs2[2]; done++; } - } - else + } + else { modelptr->g2maxs[2] -= modelptr->g2maxsEffect[2]; - if (modelptr->g2maxs[2] < modelptr->g2maxs2[2]) + if (modelptr->g2maxs[2] < modelptr->g2maxs2[2]) { modelptr->g2maxs[2] = modelptr->g2maxs2[2]; done++; @@ -7925,25 +7931,25 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) } // transition the x,y,z min - if (modelptr->g2mins[0] == modelptr->g2mins2[0]) + if (modelptr->g2mins[0] == modelptr->g2mins2[0]) { done++; - } - else + } + else { - if (modelptr->g2mins[0] < modelptr->g2mins2[0]) + if (modelptr->g2mins[0] < modelptr->g2mins2[0]) { modelptr->g2mins[0] += modelptr->g2minsEffect[0]; - if (modelptr->g2mins[0] > modelptr->g2mins2[0]) + if (modelptr->g2mins[0] > modelptr->g2mins2[0]) { modelptr->g2mins[0] = modelptr->g2mins2[0]; done++; } - } - else + } + else { modelptr->g2mins[0] -= modelptr->g2minsEffect[0]; - if (modelptr->g2mins[0] < modelptr->g2mins2[0]) + if (modelptr->g2mins[0] < modelptr->g2mins2[0]) { modelptr->g2mins[0] = modelptr->g2mins2[0]; done++; @@ -7951,25 +7957,25 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) } } //y - if (modelptr->g2mins[1] == modelptr->g2mins2[1]) + if (modelptr->g2mins[1] == modelptr->g2mins2[1]) { done++; - } - else + } + else { - if (modelptr->g2mins[1] < modelptr->g2mins2[1]) + if (modelptr->g2mins[1] < modelptr->g2mins2[1]) { modelptr->g2mins[1] += modelptr->g2minsEffect[1]; - if (modelptr->g2mins[1] > modelptr->g2mins2[1]) + if (modelptr->g2mins[1] > modelptr->g2mins2[1]) { modelptr->g2mins[1] = modelptr->g2mins2[1]; done++; } - } - else + } + else { modelptr->g2mins[1] -= modelptr->g2minsEffect[1]; - if (modelptr->g2mins[1] < modelptr->g2mins2[1]) + if (modelptr->g2mins[1] < modelptr->g2mins2[1]) { modelptr->g2mins[1] = modelptr->g2mins2[1]; done++; @@ -7980,25 +7986,25 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) //z - if (modelptr->g2mins[2] == modelptr->g2mins2[2]) + if (modelptr->g2mins[2] == modelptr->g2mins2[2]) { done++; - } - else + } + else { - if (modelptr->g2mins[2] < modelptr->g2mins2[2]) + if (modelptr->g2mins[2] < modelptr->g2mins2[2]) { modelptr->g2mins[2] += modelptr->g2minsEffect[2]; - if (modelptr->g2mins[2] > modelptr->g2mins2[2]) + if (modelptr->g2mins[2] > modelptr->g2mins2[2]) { modelptr->g2mins[2] = modelptr->g2mins2[2]; done++; } - } - else + } + else { modelptr->g2mins[2] -= modelptr->g2minsEffect[2]; - if (modelptr->g2mins[2] < modelptr->g2mins2[2]) + if (modelptr->g2mins[2] < modelptr->g2mins2[2]) { modelptr->g2mins[2] = modelptr->g2mins2[2]; done++; @@ -8009,25 +8015,25 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) //fovx - if (modelptr->fov_x == modelptr->fov_x2) + if (modelptr->fov_x == modelptr->fov_x2) { done++; - } - else + } + else { - if (modelptr->fov_x < modelptr->fov_x2) + if (modelptr->fov_x < modelptr->fov_x2) { modelptr->fov_x += modelptr->fov_Effectx; - if (modelptr->fov_x > modelptr->fov_x2) + if (modelptr->fov_x > modelptr->fov_x2) { modelptr->fov_x = modelptr->fov_x2; done++; } - } - else + } + else { modelptr->fov_x -= modelptr->fov_Effectx; - if (modelptr->fov_x < modelptr->fov_x2) + if (modelptr->fov_x < modelptr->fov_x2) { modelptr->fov_x = modelptr->fov_x2; done++; @@ -8036,25 +8042,25 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) } //fovy - if (modelptr->fov_y == modelptr->fov_y2) + if (modelptr->fov_y == modelptr->fov_y2) { done++; - } - else + } + else { - if (modelptr->fov_y < modelptr->fov_y2) + if (modelptr->fov_y < modelptr->fov_y2) { modelptr->fov_y += modelptr->fov_Effecty; - if (modelptr->fov_y > modelptr->fov_y2) + if (modelptr->fov_y > modelptr->fov_y2) { modelptr->fov_y = modelptr->fov_y2; done++; } - } - else + } + else { modelptr->fov_y -= modelptr->fov_Effecty; - if (modelptr->fov_y < modelptr->fov_y2) + if (modelptr->fov_y < modelptr->fov_y2) { modelptr->fov_y = modelptr->fov_y2; done++; @@ -8062,7 +8068,7 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) } } - if (done == 5) + if (done == 5) { item->window.flags &= ~WINDOW_INTRANSITIONMODEL; } @@ -8073,33 +8079,33 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) #endif //JLF end transition stuff for models - if (item->window.ownerDrawFlags && DC->ownerDrawVisible) + if (item->window.ownerDrawFlags && DC->ownerDrawVisible) { - if (!DC->ownerDrawVisible(item->window.ownerDrawFlags)) + if (!DC->ownerDrawVisible(item->window.ownerDrawFlags)) { item->window.flags &= ~WINDOW_VISIBLE; - } - else + } + else { item->window.flags |= WINDOW_VISIBLE; } } - if (item->cvarFlags & (CVAR_SHOW | CVAR_HIDE)) + if (item->cvarFlags & (CVAR_SHOW | CVAR_HIDE)) { - if (!Item_EnableShowViaCvar(item, CVAR_SHOW)) + if (!Item_EnableShowViaCvar(item, CVAR_SHOW)) { return qfalse; } } - - if (item->window.flags & WINDOW_TIMEDVISIBLE) + + if (item->window.flags & WINDOW_TIMEDVISIBLE) { } - if (!(item->window.flags & WINDOW_VISIBLE)) + if (!(item->window.flags & WINDOW_VISIBLE)) { return qfalse; } @@ -8119,7 +8125,7 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) // NOTE : we can't just check the mouse position on this, what if we TABBED // to the current menu item -- in that case our mouse isn't over the item. // Removing the WINDOW_MOUSEOVER flag just prevents the item's OnExit script from running - // if (!Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory)) + // if (!Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory)) // { // It isn't something that should, because it isn't live anymore. // item->window.flags &= ~WINDOW_MOUSEOVER; // } @@ -8154,7 +8160,7 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) { xPos = parent->descX - (textWidth/2); // Center justify } - else // Left justify + else // Left justify { xPos = parent->descX; } @@ -8187,27 +8193,27 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) } } - // paint the rect first.. + // paint the rect first.. Window_Paint(&item->window, parent->fadeAmount , parent->fadeClamp, parent->fadeCycle); // Print a box showing the extents of the rectangle, when in debug mode - if (uis.debugMode) + if (uis.debugMode) { vec4_t color; color[1] = color[3] = 1; color[0] = color[2] = 0; DC->drawRect( - item->window.rect.x, - item->window.rect.y, - item->window.rect.w, - item->window.rect.h, - 1, + item->window.rect.x, + item->window.rect.y, + item->window.rect.w, + item->window.rect.h, + 1, color); } //DC->drawRect(item->window.rect.x, item->window.rect.y, item->window.rect.w, item->window.rect.h, 1, red); - switch (item->type) + switch (item->type) { case ITEM_TYPE_OWNERDRAW: Item_OwnerDraw_Paint(item); @@ -8283,28 +8289,28 @@ void LerpColor(vec4_t a, vec4_t b, vec4_t c, float t) Fade ================= */ -void Fade(int *flags, float *f, float clamp, int *nextTime, int offsetTime, qboolean bFlags, float fadeAmount) +void Fade(int *flags, float *f, float clamp, int *nextTime, int offsetTime, qboolean bFlags, float fadeAmount) { - if (*flags & (WINDOW_FADINGOUT | WINDOW_FADINGIN)) + if (*flags & (WINDOW_FADINGOUT | WINDOW_FADINGIN)) { - if (DC->realTime > *nextTime) + if (DC->realTime > *nextTime) { *nextTime = DC->realTime + offsetTime; - if (*flags & WINDOW_FADINGOUT) + if (*flags & WINDOW_FADINGOUT) { *f -= fadeAmount; - if (bFlags && *f <= 0.0) + if (bFlags && *f <= 0.0) { *flags &= ~(WINDOW_FADINGOUT | WINDOW_VISIBLE); } - } - else + } + else { *f += fadeAmount; - if (*f >= clamp) + if (*f >= clamp) { *f = clamp; - if (bFlags) + if (bFlags) { *flags &= ~WINDOW_FADINGIN; } @@ -8319,7 +8325,7 @@ void Fade(int *flags, float *f, float clamp, int *nextTime, int offsetTime, qboo GradientBar_Paint ================= */ -void GradientBar_Paint(rectDef_t *rect, vec4_t color) +void GradientBar_Paint(rectDef_t *rect, vec4_t color) { // gradient bar takes two paints DC->setColor( color ); @@ -8332,25 +8338,25 @@ void GradientBar_Paint(rectDef_t *rect, vec4_t color) Window_Paint ================= */ -void Window_Paint(Window *w, float fadeAmount, float fadeClamp, float fadeCycle) +void Window_Paint(Window *w, float fadeAmount, float fadeClamp, float fadeCycle) { //float bordersize = 0; vec4_t color; rectDef_t fillRect = w->rect; - if (uis.debugMode) + if (uis.debugMode) { color[0] = color[1] = color[2] = color[3] = 1; DC->drawRect(w->rect.x, w->rect.y, w->rect.w, w->rect.h, 1, color); } - if (w == NULL || (w->style == 0 && w->border == 0)) + if (w == NULL || (w->style == 0 && w->border == 0)) { return; } - if (w->border != 0) + if (w->border != 0) { fillRect.x += w->borderSize; fillRect.y += w->borderSize; @@ -8358,29 +8364,29 @@ void Window_Paint(Window *w, float fadeAmount, float fadeClamp, float fadeCycle) fillRect.h -= w->borderSize + 1; } - if (w->style == WINDOW_STYLE_FILLED) + if (w->style == WINDOW_STYLE_FILLED) { // box, but possible a shader that needs filled - if (w->background) + if (w->background) { Fade(&w->flags, &w->backColor[3], fadeClamp, &w->nextTime, fadeCycle, qtrue, fadeAmount); DC->setColor(w->backColor); DC->drawHandlePic(fillRect.x, fillRect.y, fillRect.w, fillRect.h, w->background); DC->setColor(NULL); - } - else + } + else { DC->fillRect(fillRect.x, fillRect.y, fillRect.w, fillRect.h, w->backColor); } - } - else if (w->style == WINDOW_STYLE_GRADIENT) + } + else if (w->style == WINDOW_STYLE_GRADIENT) { GradientBar_Paint(&fillRect, w->backColor); // gradient bar - } - else if (w->style == WINDOW_STYLE_SHADER) + } + else if (w->style == WINDOW_STYLE_SHADER) { - if (w->flags & WINDOW_PLAYERCOLOR) + if (w->flags & WINDOW_PLAYERCOLOR) { vec4_t color; color[0] = ui_char_color_red.integer/255.0f; @@ -8389,54 +8395,54 @@ void Window_Paint(Window *w, float fadeAmount, float fadeClamp, float fadeCycle) color[3] = 1; ui.R_SetColor(color); } - else if (w->flags & WINDOW_FORECOLORSET) + else if (w->flags & WINDOW_FORECOLORSET) { DC->setColor(w->foreColor); } DC->drawHandlePic(fillRect.x, fillRect.y, fillRect.w, fillRect.h, w->background); DC->setColor(NULL); - } + } - if (w->border == WINDOW_BORDER_FULL) + if (w->border == WINDOW_BORDER_FULL) { // full // HACK HACK HACK - if (w->style == WINDOW_STYLE_TEAMCOLOR) + if (w->style == WINDOW_STYLE_TEAMCOLOR) { - if (color[0] > 0) - { + if (color[0] > 0) + { // red color[0] = 1; color[1] = color[2] = .5; - } - else + } + else { color[2] = 1; color[0] = color[1] = .5; } color[3] = 1; DC->drawRect(w->rect.x, w->rect.y, w->rect.w, w->rect.h, w->borderSize, color); - } - else + } + else { DC->drawRect(w->rect.x, w->rect.y, w->rect.w, w->rect.h, w->borderSize, w->borderColor); } - } - else if (w->border == WINDOW_BORDER_HORZ) + } + else if (w->border == WINDOW_BORDER_HORZ) { // top/bottom DC->setColor(w->borderColor); DC->drawTopBottom(w->rect.x, w->rect.y, w->rect.w, w->rect.h, w->borderSize); DC->setColor( NULL ); - } - else if (w->border == WINDOW_BORDER_VERT) + } + else if (w->border == WINDOW_BORDER_VERT) { // left right DC->setColor(w->borderColor); DC->drawSides(w->rect.x, w->rect.y, w->rect.w, w->rect.h, w->borderSize); DC->setColor( NULL ); - } - else if (w->border == WINDOW_BORDER_KCGRADIENT) + } + else if (w->border == WINDOW_BORDER_KCGRADIENT) { // this is just two gradient bars along each horz edge rectDef_t r = w->rect; @@ -8452,7 +8458,7 @@ void Window_Paint(Window *w, float fadeAmount, float fadeClamp, float fadeCycle) Display_KeyBindPending ================= */ -qboolean Display_KeyBindPending(void) +qboolean Display_KeyBindPending(void) { return g_waitingForKey; } @@ -8462,13 +8468,13 @@ qboolean Display_KeyBindPending(void) ToWindowCoords ================= */ -void ToWindowCoords(float *x, float *y, windowDef_t *window) +void ToWindowCoords(float *x, float *y, windowDef_t *window) { - if (window->border != 0) + if (window->border != 0) { *x += window->borderSize; *y += window->borderSize; - } + } *x += window->rect.x; *y += window->rect.y; } @@ -8478,7 +8484,7 @@ void ToWindowCoords(float *x, float *y, windowDef_t *window) Item_Text_AutoWrapped_Paint ================= */ -void Item_Text_AutoWrapped_Paint(itemDef_t *item) +void Item_Text_AutoWrapped_Paint(itemDef_t *item) { char text[1024]; const char *p, *textPtr, *newLinePtr; @@ -8490,19 +8496,19 @@ void Item_Text_AutoWrapped_Paint(itemDef_t *item) textWidth = 0; newLinePtr = NULL; - if (item->text == NULL) + if (item->text == NULL) { - if (item->cvar == NULL) + if (item->cvar == NULL) { return; } - else + else { DC->getCVarString(item->cvar, text, sizeof(text)); textPtr = text; } } - else + else { textPtr = item->text; } @@ -8511,7 +8517,7 @@ void Item_Text_AutoWrapped_Paint(itemDef_t *item) textPtr = SE_GetString( &textPtr[1] ); } - if (*textPtr == '\0') + if (*textPtr == '\0') { return; } @@ -8533,28 +8539,28 @@ void Item_Text_AutoWrapped_Paint(itemDef_t *item) int line = 1; while (1) //findmeste (this will break widechar languages)! { - if (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\0') + if (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\0') { newLine = len; newLinePtr = p+1; newLineWidth = textWidth; } textWidth = DC->textWidth(buff, item->textscale, 0); - if ( (newLine && textWidth >= item->window.rect.w - item->textalignx) || *p == '\n' || *p == '\0') + if ( (newLine && textWidth >= item->window.rect.w - item->textalignx) || *p == '\n' || *p == '\0') { - if (line > item->cursorPos) //scroll + if (line > item->cursorPos) //scroll { - if (len) + if (len) { - if (item->textalignment == ITEM_ALIGN_LEFT) + if (item->textalignment == ITEM_ALIGN_LEFT) { item->textRect.x = item->textalignx; - } - else if (item->textalignment == ITEM_ALIGN_RIGHT) + } + else if (item->textalignment == ITEM_ALIGN_RIGHT) { item->textRect.x = item->textalignx - newLineWidth; - } - else if (item->textalignment == ITEM_ALIGN_CENTER) + } + else if (item->textalignment == ITEM_ALIGN_CENTER) { item->textRect.x = item->textalignx - newLineWidth / 2; } @@ -8582,7 +8588,7 @@ void Item_Text_AutoWrapped_Paint(itemDef_t *item) strcpy(buff,"..."); len = 3; } - if (*p == '\0') + if (*p == '\0') { //end of string break; } @@ -8602,14 +8608,14 @@ void Item_Text_AutoWrapped_Paint(itemDef_t *item) Rect_ContainsPoint ================= */ -static qboolean Rect_ContainsPoint(rectDef_t *rect, float x, float y) +static qboolean Rect_ContainsPoint(rectDef_t *rect, float x, float y) { //JLF ignore mouse pointer location // return true; // END JLF - if (rect) + if (rect) { -// if ((x > rect->x) && (x < (rect->x + rect->w)) && (y > rect->y) && (y < (rect->y + rect->h))) +// if ((x > rect->x) && (x < (rect->x + rect->w)) && (y > rect->y) && (y < (rect->y + rect->h))) if ((x > rect->x) && (x < (rect->x + rect->w))) { if ((y > rect->y) && (y < (rect->y + rect->h))) @@ -8621,18 +8627,18 @@ static qboolean Rect_ContainsPoint(rectDef_t *rect, float x, float y) return qfalse; } -qboolean Item_TextScroll_HandleKey ( itemDef_t *item, int key, qboolean down, qboolean force) +qboolean Item_TextScroll_HandleKey ( itemDef_t *item, int key, qboolean down, qboolean force) { textScrollDef_t *scrollPtr = (textScrollDef_t*)item->typeData; int max; int viewmax; - if (force || (Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory) && item->window.flags & WINDOW_HASFOCUS)) + if (force || (Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory) && item->window.flags & WINDOW_HASFOCUS)) { max = Item_TextScroll_MaxScroll(item); viewmax = (item->window.rect.h / scrollPtr->lineHeight); - if ( key == A_CURSOR_UP || key == A_KP_8 ) + if ( key == A_CURSOR_UP || key == A_KP_8 ) { scrollPtr->startPos--; if (scrollPtr->startPos < 0) @@ -8642,7 +8648,7 @@ qboolean Item_TextScroll_HandleKey ( itemDef_t *item, int key, qboolean down, qb return qtrue; } - if ( key == A_CURSOR_DOWN || key == A_KP_2 ) + if ( key == A_CURSOR_DOWN || key == A_KP_2 ) { scrollPtr->startPos++; if (scrollPtr->startPos > max) @@ -8654,7 +8660,7 @@ qboolean Item_TextScroll_HandleKey ( itemDef_t *item, int key, qboolean down, qb } //Raz: Added - if ( key == A_MWHEELUP ) + if ( key == A_MWHEELUP ) { scrollPtr->startPos--; if (scrollPtr->startPos < 0) @@ -8666,7 +8672,7 @@ qboolean Item_TextScroll_HandleKey ( itemDef_t *item, int key, qboolean down, qb Display_MouseMove(NULL, DC->cursorx, DC->cursory); return qtrue; } - if ( key == A_MWHEELDOWN ) + if ( key == A_MWHEELDOWN ) { scrollPtr->startPos++; if (scrollPtr->startPos > max) @@ -8680,77 +8686,77 @@ qboolean Item_TextScroll_HandleKey ( itemDef_t *item, int key, qboolean down, qb } // mouse hit - if (key == A_MOUSE1 || key == A_MOUSE2) + if (key == A_MOUSE1 || key == A_MOUSE2) { - if (item->window.flags & WINDOW_LB_LEFTARROW) + if (item->window.flags & WINDOW_LB_LEFTARROW) { scrollPtr->startPos--; - if (scrollPtr->startPos < 0) + if (scrollPtr->startPos < 0) { scrollPtr->startPos = 0; } - } - else if (item->window.flags & WINDOW_LB_RIGHTARROW) + } + else if (item->window.flags & WINDOW_LB_RIGHTARROW) { // one down scrollPtr->startPos++; - if (scrollPtr->startPos > max) + if (scrollPtr->startPos > max) { scrollPtr->startPos = max; } - } - else if (item->window.flags & WINDOW_LB_PGUP) + } + else if (item->window.flags & WINDOW_LB_PGUP) { // page up scrollPtr->startPos -= viewmax; - if (scrollPtr->startPos < 0) + if (scrollPtr->startPos < 0) { scrollPtr->startPos = 0; } - } - else if (item->window.flags & WINDOW_LB_PGDN) + } + else if (item->window.flags & WINDOW_LB_PGDN) { // page down scrollPtr->startPos += viewmax; - if (scrollPtr->startPos > max) + if (scrollPtr->startPos > max) { scrollPtr->startPos = max; } - } - else if (item->window.flags & WINDOW_LB_THUMB) + } + else if (item->window.flags & WINDOW_LB_THUMB) { // Display_SetCaptureItem(item); - } + } return qtrue; } - if ( key == A_HOME || key == A_KP_7) + if ( key == A_HOME || key == A_KP_7) { // home scrollPtr->startPos = 0; return qtrue; } - if ( key == A_END || key == A_KP_1) + if ( key == A_END || key == A_KP_1) { // end scrollPtr->startPos = max; return qtrue; } - if (key == A_PAGE_UP || key == A_KP_9 ) + if (key == A_PAGE_UP || key == A_KP_9 ) { scrollPtr->startPos -= viewmax; - if (scrollPtr->startPos < 0) + if (scrollPtr->startPos < 0) { scrollPtr->startPos = 0; } return qtrue; } - if ( key == A_PAGE_DOWN || key == A_KP_3 ) + if ( key == A_PAGE_DOWN || key == A_KP_3 ) { scrollPtr->startPos += viewmax; - if (scrollPtr->startPos > max) + if (scrollPtr->startPos > max) { scrollPtr->startPos = max; } @@ -8766,7 +8772,7 @@ qboolean Item_TextScroll_HandleKey ( itemDef_t *item, int key, qboolean down, qb Item_ListBox_MaxScroll ================= */ -int Item_ListBox_MaxScroll(itemDef_t *item) +int Item_ListBox_MaxScroll(itemDef_t *item) { listBoxDef_t *listPtr = (listBoxDef_t*)item->typeData; int count = DC->feederCount(item->special); @@ -8776,12 +8782,12 @@ int Item_ListBox_MaxScroll(itemDef_t *item) { max = count - (item->window.rect.w / listPtr->elementWidth) + 1; } - else + else { max = count - (item->window.rect.h / listPtr->elementHeight) + 1; } - if (max < 0) + if (max < 0) { return 0; } @@ -8793,7 +8799,7 @@ int Item_ListBox_MaxScroll(itemDef_t *item) Item_ListBox_ThumbPosition ================= */ -int Item_ListBox_ThumbPosition(itemDef_t *item) +int Item_ListBox_ThumbPosition(itemDef_t *item) { float max, pos, size; listBoxDef_t *listPtr = (listBoxDef_t*)item->typeData; @@ -8802,25 +8808,25 @@ int Item_ListBox_ThumbPosition(itemDef_t *item) if (item->window.flags & WINDOW_HORIZONTAL) { size = item->window.rect.w - (SCROLLBAR_SIZE * 2) - 2; - if (max > 0) + if (max > 0) { pos = (size-SCROLLBAR_SIZE) / (float) max; - } - else + } + else { pos = 0; } pos *= listPtr->startPos; return item->window.rect.x + 1 + SCROLLBAR_SIZE + pos; } - else + else { size = item->window.rect.h - (SCROLLBAR_SIZE * 2) - 2; - if (max > 0) + if (max > 0) { pos = (size-SCROLLBAR_SIZE) / (float) max; - } - else + } + else { pos = 0; } @@ -8834,76 +8840,76 @@ int Item_ListBox_ThumbPosition(itemDef_t *item) Item_ListBox_OverLB ================= */ -int Item_ListBox_OverLB(itemDef_t *item, float x, float y) +int Item_ListBox_OverLB(itemDef_t *item, float x, float y) { rectDef_t r; int thumbstart; - if (item->window.flags & WINDOW_HORIZONTAL) + if (item->window.flags & WINDOW_HORIZONTAL) { // check if on left arrow r.x = item->window.rect.x; r.y = item->window.rect.y + item->window.rect.h - SCROLLBAR_SIZE; r.h = r.w = SCROLLBAR_SIZE; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { return WINDOW_LB_LEFTARROW; } // check if on right arrow r.x = item->window.rect.x + item->window.rect.w - SCROLLBAR_SIZE; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { return WINDOW_LB_RIGHTARROW; } // check if on thumb thumbstart = Item_ListBox_ThumbPosition(item); r.x = thumbstart; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { return WINDOW_LB_THUMB; } r.x = item->window.rect.x + SCROLLBAR_SIZE; r.w = thumbstart - r.x; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { return WINDOW_LB_PGUP; } r.x = thumbstart + SCROLLBAR_SIZE; r.w = item->window.rect.x + item->window.rect.w - SCROLLBAR_SIZE; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { return WINDOW_LB_PGDN; } - } - else + } + else { r.x = item->window.rect.x + item->window.rect.w - SCROLLBAR_SIZE; r.y = item->window.rect.y; r.h = r.w = SCROLLBAR_SIZE; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { return WINDOW_LB_LEFTARROW; } r.y = item->window.rect.y + item->window.rect.h - SCROLLBAR_SIZE; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { return WINDOW_LB_RIGHTARROW; } thumbstart = Item_ListBox_ThumbPosition(item); r.y = thumbstart; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { return WINDOW_LB_THUMB; } r.y = item->window.rect.y + SCROLLBAR_SIZE; r.h = thumbstart - r.y; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { return WINDOW_LB_PGUP; } r.y = thumbstart + SCROLLBAR_SIZE; r.h = item->window.rect.y + item->window.rect.h - SCROLLBAR_SIZE; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { return WINDOW_LB_PGDN; } @@ -8916,50 +8922,50 @@ int Item_ListBox_OverLB(itemDef_t *item, float x, float y) Item_ListBox_MouseEnter ================= */ -void Item_ListBox_MouseEnter(itemDef_t *item, float x, float y) +void Item_ListBox_MouseEnter(itemDef_t *item, float x, float y) { rectDef_t r; listBoxDef_t *listPtr = (listBoxDef_t*)item->typeData; - + item->window.flags &= ~(WINDOW_LB_LEFTARROW | WINDOW_LB_RIGHTARROW | WINDOW_LB_THUMB | WINDOW_LB_PGUP | WINDOW_LB_PGDN); item->window.flags |= Item_ListBox_OverLB(item, x, y); - if (item->window.flags & WINDOW_HORIZONTAL) + if (item->window.flags & WINDOW_HORIZONTAL) { - if (!(item->window.flags & (WINDOW_LB_LEFTARROW | WINDOW_LB_RIGHTARROW | WINDOW_LB_THUMB | WINDOW_LB_PGUP | WINDOW_LB_PGDN))) + if (!(item->window.flags & (WINDOW_LB_LEFTARROW | WINDOW_LB_RIGHTARROW | WINDOW_LB_THUMB | WINDOW_LB_PGUP | WINDOW_LB_PGDN))) { // check for selection hit as we have exausted buttons and thumb - if (listPtr->elementStyle == LISTBOX_IMAGE) + if (listPtr->elementStyle == LISTBOX_IMAGE) { r.x = item->window.rect.x; r.y = item->window.rect.y; r.h = item->window.rect.h - SCROLLBAR_SIZE; r.w = item->window.rect.w - listPtr->drawPadding; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { listPtr->cursorPos = (int)((x - r.x) / listPtr->elementWidth) + listPtr->startPos; - if (listPtr->cursorPos > listPtr->endPos) + if (listPtr->cursorPos > listPtr->endPos) { listPtr->cursorPos = listPtr->endPos; } } - } - else + } + else { - // text hit.. + // text hit.. } } - } - else if (!(item->window.flags & (WINDOW_LB_LEFTARROW | WINDOW_LB_RIGHTARROW | WINDOW_LB_THUMB | WINDOW_LB_PGUP | WINDOW_LB_PGDN))) + } + else if (!(item->window.flags & (WINDOW_LB_LEFTARROW | WINDOW_LB_RIGHTARROW | WINDOW_LB_THUMB | WINDOW_LB_PGUP | WINDOW_LB_PGDN))) { r.x = item->window.rect.x; r.y = item->window.rect.y; r.w = item->window.rect.w - SCROLLBAR_SIZE; r.h = item->window.rect.h - listPtr->drawPadding; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { listPtr->cursorPos = (int)((y - 2 - r.y) / listPtr->elementHeight) + listPtr->startPos; - if (listPtr->cursorPos > listPtr->endPos) + if (listPtr->cursorPos > listPtr->endPos) { listPtr->cursorPos = listPtr->endPos; } @@ -8972,60 +8978,60 @@ void Item_ListBox_MouseEnter(itemDef_t *item, float x, float y) Item_MouseEnter ================= */ -void Item_MouseEnter(itemDef_t *item, float x, float y) +void Item_MouseEnter(itemDef_t *item, float x, float y) { rectDef_t r; //JLFMOUSE - if (item) + if (item) { r = item->textRect; // r.y -= r.h; // NOt sure why this is here, but I commented it out. // in the text rect? // items can be enabled and disabled based on cvars - if (item->cvarFlags & (CVAR_ENABLE | CVAR_DISABLE) && !Item_EnableShowViaCvar(item, CVAR_ENABLE)) + if (item->cvarFlags & (CVAR_ENABLE | CVAR_DISABLE) && !Item_EnableShowViaCvar(item, CVAR_ENABLE)) { return; } - if (item->cvarFlags & (CVAR_SHOW | CVAR_HIDE) && !Item_EnableShowViaCvar(item, CVAR_SHOW)) + if (item->cvarFlags & (CVAR_SHOW | CVAR_HIDE) && !Item_EnableShowViaCvar(item, CVAR_SHOW)) { return; } -//JLFMOUSE - if (Rect_ContainsPoint(&r, x, y)) +//JLFMOUSE + if (Rect_ContainsPoint(&r, x, y)) { - if (!(item->window.flags & WINDOW_MOUSEOVERTEXT)) + if (!(item->window.flags & WINDOW_MOUSEOVERTEXT)) { Item_RunScript(item, item->mouseEnterText); item->window.flags |= WINDOW_MOUSEOVERTEXT; } - if (!(item->window.flags & WINDOW_MOUSEOVER)) + if (!(item->window.flags & WINDOW_MOUSEOVER)) { Item_RunScript(item, item->mouseEnter); item->window.flags |= WINDOW_MOUSEOVER; } - } - else + } + else { // not in the text rect - if (item->window.flags & WINDOW_MOUSEOVERTEXT) + if (item->window.flags & WINDOW_MOUSEOVERTEXT) { // if we were Item_RunScript(item, item->mouseExitText); item->window.flags &= ~WINDOW_MOUSEOVERTEXT; } - if (!(item->window.flags & WINDOW_MOUSEOVER)) + if (!(item->window.flags & WINDOW_MOUSEOVER)) { Item_RunScript(item, item->mouseEnter); item->window.flags |= WINDOW_MOUSEOVER; } - if (item->type == ITEM_TYPE_LISTBOX) + if (item->type == ITEM_TYPE_LISTBOX) { Item_ListBox_MouseEnter(item, x, y); } @@ -9044,83 +9050,83 @@ void Item_MouseEnter(itemDef_t *item, float x, float y) Item_SetFocus ================= */ -// will optionaly set focus to this item -qboolean Item_SetFocus(itemDef_t *item, float x, float y) +// will optionaly set focus to this item +qboolean Item_SetFocus(itemDef_t *item, float x, float y) { int i; itemDef_t *oldFocus; sfxHandle_t *sfx = &DC->Assets.itemFocusSound; qboolean playSound = qfalse; // sanity check, non-null, not a decoration and does not already have the focus - if (item == NULL || item->window.flags & WINDOW_DECORATION || item->window.flags & WINDOW_HASFOCUS || !(item->window.flags & WINDOW_VISIBLE) || (item->window.flags & WINDOW_INACTIVE)) + if (item == NULL || item->window.flags & WINDOW_DECORATION || item->window.flags & WINDOW_HASFOCUS || !(item->window.flags & WINDOW_VISIBLE) || (item->window.flags & WINDOW_INACTIVE)) { return qfalse; } menuDef_t *parent = (menuDef_t*)item->parent; // items can be enabled and disabled based on cvars - if (item->cvarFlags & (CVAR_ENABLE | CVAR_DISABLE) && !Item_EnableShowViaCvar(item, CVAR_ENABLE)) + if (item->cvarFlags & (CVAR_ENABLE | CVAR_DISABLE) && !Item_EnableShowViaCvar(item, CVAR_ENABLE)) { return qfalse; } - if (item->cvarFlags & (CVAR_SHOW | CVAR_HIDE) && !Item_EnableShowViaCvar(item, CVAR_SHOW)) + if (item->cvarFlags & (CVAR_SHOW | CVAR_HIDE) && !Item_EnableShowViaCvar(item, CVAR_SHOW)) { return qfalse; } oldFocus = Menu_ClearFocus((menuDef_t *) item->parent); - if (item->type == ITEM_TYPE_TEXT) + if (item->type == ITEM_TYPE_TEXT) { rectDef_t r; r = item->textRect; //r.y -= r.h; //JLFMOUSE - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { item->window.flags |= WINDOW_HASFOCUS; - if (item->focusSound) + if (item->focusSound) { sfx = &item->focusSound; } playSound = qtrue; } - else + else { - if (oldFocus) + if (oldFocus) { oldFocus->window.flags |= WINDOW_HASFOCUS; - if (oldFocus->onFocus) + if (oldFocus->onFocus) { Item_RunScript(oldFocus, oldFocus->onFocus); } } } - } - else + } + else { item->window.flags |= WINDOW_HASFOCUS; - if (item->onFocus) + if (item->onFocus) { Item_RunScript(item, item->onFocus); } - if (item->focusSound) + if (item->focusSound) { sfx = &item->focusSound; } playSound = qtrue; } - if (playSound && sfx) + if (playSound && sfx) { DC->startLocalSound( *sfx, CHAN_LOCAL_SOUND ); } - for (i = 0; i < parent->itemCount; i++) + for (i = 0; i < parent->itemCount; i++) { - if (parent->items[i] == item) + if (parent->items[i] == item) { parent->cursorItem = i; break; @@ -9136,7 +9142,7 @@ qboolean Item_SetFocus(itemDef_t *item, float x, float y) IsVisible ================= */ -qboolean IsVisible(int flags) +qboolean IsVisible(int flags) { return (flags & WINDOW_VISIBLE && !(flags & WINDOW_FADINGOUT)); } @@ -9146,11 +9152,11 @@ qboolean IsVisible(int flags) Item_MouseLeave ================= */ -void Item_MouseLeave(itemDef_t *item) +void Item_MouseLeave(itemDef_t *item) { - if (item) + if (item) { - if (item->window.flags & WINDOW_MOUSEOVERTEXT) + if (item->window.flags & WINDOW_MOUSEOVERTEXT) { Item_RunScript(item, item->mouseExitText); item->window.flags &= ~WINDOW_MOUSEOVERTEXT; @@ -9165,15 +9171,15 @@ void Item_MouseLeave(itemDef_t *item) Item_SetMouseOver ================= */ -void Item_SetMouseOver(itemDef_t *item, qboolean focus) +void Item_SetMouseOver(itemDef_t *item, qboolean focus) { - if (item) + if (item) { - if (focus) + if (focus) { item->window.flags |= WINDOW_MOUSEOVER; - } - else + } + else { item->window.flags &= ~WINDOW_MOUSEOVER; } @@ -9185,92 +9191,92 @@ void Item_SetMouseOver(itemDef_t *item, qboolean focus) Menu_HandleMouseMove ================= */ -void Menu_HandleMouseMove(menuDef_t *menu, float x, float y) +void Menu_HandleMouseMove(menuDef_t *menu, float x, float y) { int i, pass; qboolean focusSet = qfalse; itemDef_t *overItem; - if (menu == NULL) + if (menu == NULL) { return; } - if (!(menu->window.flags & (WINDOW_VISIBLE | WINDOW_FORCED))) + if (!(menu->window.flags & (WINDOW_VISIBLE | WINDOW_FORCED))) { return; } - if (itemCapture) + if (itemCapture) { //Item_MouseMove(itemCapture, x, y); return; } - if (g_waitingForKey || g_editingField) + if (g_waitingForKey || g_editingField) { return; } - // FIXME: this is the whole issue of focus vs. mouse over.. + // FIXME: this is the whole issue of focus vs. mouse over.. // need a better overall solution as i don't like going through everything twice - for (pass = 0; pass < 2; pass++) + for (pass = 0; pass < 2; pass++) { - for (i = 0; i < menu->itemCount; i++) + for (i = 0; i < menu->itemCount; i++) { // turn off focus each item // menu->items[i].window.flags &= ~WINDOW_HASFOCUS; - if (!(menu->items[i]->window.flags & (WINDOW_VISIBLE | WINDOW_FORCED))) + if (!(menu->items[i]->window.flags & (WINDOW_VISIBLE | WINDOW_FORCED))) { continue; } - if (menu->items[i]->window.flags & WINDOW_INACTIVE) + if (menu->items[i]->window.flags & WINDOW_INACTIVE) { continue; } // items can be enabled and disabled based on cvars - if (menu->items[i]->cvarFlags & (CVAR_ENABLE | CVAR_DISABLE) && !Item_EnableShowViaCvar(menu->items[i], CVAR_ENABLE)) + if (menu->items[i]->cvarFlags & (CVAR_ENABLE | CVAR_DISABLE) && !Item_EnableShowViaCvar(menu->items[i], CVAR_ENABLE)) { continue; } - if (menu->items[i]->cvarFlags & (CVAR_SHOW | CVAR_HIDE) && !Item_EnableShowViaCvar(menu->items[i], CVAR_SHOW)) + if (menu->items[i]->cvarFlags & (CVAR_SHOW | CVAR_HIDE) && !Item_EnableShowViaCvar(menu->items[i], CVAR_SHOW)) { continue; } - if (Rect_ContainsPoint(&menu->items[i]->window.rect, x, y)) + if (Rect_ContainsPoint(&menu->items[i]->window.rect, x, y)) { - if (pass == 1) + if (pass == 1) { overItem = menu->items[i]; - if (overItem->type == ITEM_TYPE_TEXT && overItem->text) + if (overItem->type == ITEM_TYPE_TEXT && overItem->text) { - if (!Rect_ContainsPoint(&overItem->window.rect, x, y)) + if (!Rect_ContainsPoint(&overItem->window.rect, x, y)) { continue; } } // if we are over an item - if (IsVisible(overItem->window.flags)) + if (IsVisible(overItem->window.flags)) { // different one Item_MouseEnter(overItem, x, y); // Item_SetMouseOver(overItem, qtrue); // if item is not a decoration see if it can take focus - if (!focusSet) + if (!focusSet) { focusSet = Item_SetFocus(overItem, x, y); } } } - } else if (menu->items[i]->window.flags & WINDOW_MOUSEOVER) + } else if (menu->items[i]->window.flags & WINDOW_MOUSEOVER) { Item_MouseLeave(menu->items[i]); Item_SetMouseOver(menu->items[i], qfalse); @@ -9284,29 +9290,29 @@ void Menu_HandleMouseMove(menuDef_t *menu, float x, float y) Display_MouseMove ================= */ -qboolean Display_MouseMove(void *p, int x, int y) +qboolean Display_MouseMove(void *p, int x, int y) { int i; menuDef_t *menu = (menuDef_t *) p; - if (menu == NULL) + if (menu == NULL) { menu = Menu_GetFocused(); - if (menu) + if (menu) { - if (menu->window.flags & WINDOW_POPUP) + if (menu->window.flags & WINDOW_POPUP) { Menu_HandleMouseMove(menu, x, y); return qtrue; } } - for (i = 0; i < menuCount; i++) + for (i = 0; i < menuCount; i++) { Menu_HandleMouseMove(&Menus[i], x, y); } - } - else + } + else { menu->window.rect.x += x; menu->window.rect.y += y; @@ -9320,13 +9326,13 @@ qboolean Display_MouseMove(void *p, int x, int y) Menus_AnyFullScreenVisible ================= */ -qboolean Menus_AnyFullScreenVisible(void) +qboolean Menus_AnyFullScreenVisible(void) { int i; - for (i = 0; i < menuCount; i++) + for (i = 0; i < menuCount; i++) { - if (Menus[i].window.flags & WINDOW_VISIBLE && Menus[i].fullScreen) + if (Menus[i].window.flags & WINDOW_VISIBLE && Menus[i].fullScreen) { return qtrue; } @@ -9387,7 +9393,7 @@ void Item_Bind_Ungrey(itemDef_t *item) Item_Bind_HandleKey ================= */ -qboolean Item_Bind_HandleKey(itemDef_t *item, int key, qboolean down) +qboolean Item_Bind_HandleKey(itemDef_t *item, int key, qboolean down) { int id; int i; @@ -9395,7 +9401,7 @@ qboolean Item_Bind_HandleKey(itemDef_t *item, int key, qboolean down) if (key == A_MOUSE1 && Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory) && !g_waitingForKey) { - if (down) + if (down) { g_waitingForKey = qtrue; g_bindItem = item; @@ -9416,7 +9422,7 @@ qboolean Item_Bind_HandleKey(itemDef_t *item, int key, qboolean down) } else if (key == A_ENTER && !g_waitingForKey) { - if (down) + if (down) { g_waitingForKey = qtrue; g_bindItem = item; @@ -9437,12 +9443,12 @@ qboolean Item_Bind_HandleKey(itemDef_t *item, int key, qboolean down) } else { - if (!g_waitingForKey || g_bindItem == NULL) + if (!g_waitingForKey || g_bindItem == NULL) { return qfalse; } - if (key & K_CHAR_FLAG) + if (key & K_CHAR_FLAG) { return qtrue; } @@ -9453,7 +9459,7 @@ qboolean Item_Bind_HandleKey(itemDef_t *item, int key, qboolean down) g_waitingForKey = qfalse; Item_Bind_Ungrey(item); return qtrue; - + case A_BACKSPACE: id = BindingIDFromName(item->cvar); if (id != -1) @@ -9525,30 +9531,30 @@ qboolean Item_Bind_HandleKey(itemDef_t *item, int key, qboolean down) Menu_SetNextCursorItem ================= */ -itemDef_t *Menu_SetNextCursorItem(menuDef_t *menu) +itemDef_t *Menu_SetNextCursorItem(menuDef_t *menu) { qboolean wrapped = qfalse; int oldCursor = menu->cursorItem; - if (menu->cursorItem == -1) + if (menu->cursorItem == -1) { menu->cursorItem = 0; wrapped = qtrue; } - while (menu->cursorItem < menu->itemCount) + while (menu->cursorItem < menu->itemCount) { menu->cursorItem++; - if (menu->cursorItem >= menu->itemCount && !wrapped) + if (menu->cursorItem >= menu->itemCount && !wrapped) { wrapped = qtrue; menu->cursorItem = 0; } - if (Item_SetFocus(menu->items[menu->cursorItem], DC->cursorx, DC->cursory)) + if (Item_SetFocus(menu->items[menu->cursorItem], DC->cursorx, DC->cursory)) { Menu_HandleMouseMove(menu, menu->items[menu->cursorItem]->window.rect.x + 1, menu->items[menu->cursorItem]->window.rect.y + 1); return menu->items[menu->cursorItem]; @@ -9564,21 +9570,21 @@ itemDef_t *Menu_SetNextCursorItem(menuDef_t *menu) Menu_SetPrevCursorItem ================= */ -itemDef_t *Menu_SetPrevCursorItem(menuDef_t *menu) +itemDef_t *Menu_SetPrevCursorItem(menuDef_t *menu) { qboolean wrapped = qfalse; int oldCursor = menu->cursorItem; - if (menu->cursorItem < 0) + if (menu->cursorItem < 0) { menu->cursorItem = menu->itemCount-1; wrapped = qtrue; - } + } - while (menu->cursorItem > -1) + while (menu->cursorItem > -1) { menu->cursorItem--; - if (menu->cursorItem < 0 ) + if (menu->cursorItem < 0 ) { if (wrapped) { @@ -9588,7 +9594,7 @@ itemDef_t *Menu_SetPrevCursorItem(menuDef_t *menu) menu->cursorItem = menu->itemCount -1; } - if (Item_SetFocus(menu->items[menu->cursorItem], DC->cursorx, DC->cursory)) + if (Item_SetFocus(menu->items[menu->cursorItem], DC->cursorx, DC->cursory)) { Menu_HandleMouseMove(menu, menu->items[menu->cursorItem]->window.rect.x + 1, menu->items[menu->cursorItem]->window.rect.y + 1); return menu->items[menu->cursorItem]; @@ -9603,36 +9609,36 @@ itemDef_t *Menu_SetPrevCursorItem(menuDef_t *menu) Item_TextField_HandleKey ================= */ -qboolean Item_TextField_HandleKey(itemDef_t *item, int key) +qboolean Item_TextField_HandleKey(itemDef_t *item, int key) { char buff[1024]; int len; itemDef_t *newItem = NULL; editFieldDef_t *editPtr = (editFieldDef_t*)item->typeData; - if (item->cvar) + if (item->cvar) { memset(buff, 0, sizeof(buff)); DC->getCVarString(item->cvar, buff, sizeof(buff)); len = strlen(buff); - if (editPtr->maxChars && len > editPtr->maxChars) + if (editPtr->maxChars && len > editPtr->maxChars) { len = editPtr->maxChars; } - if ( key & K_CHAR_FLAG ) + if ( key & K_CHAR_FLAG ) { key &= ~K_CHAR_FLAG; - if (key == 'h' - 'a' + 1 ) + if (key == 'h' - 'a' + 1 ) { // ctrl-h is backspace - if ( item->cursorPos > 0 ) + if ( item->cursorPos > 0 ) { memmove( &buff[item->cursorPos - 1], &buff[item->cursorPos], len + 1 - item->cursorPos); item->cursorPos--; - if (item->cursorPos < editPtr->paintOffset) + if (item->cursorPos < editPtr->paintOffset) { editPtr->paintOffset--; } @@ -9644,30 +9650,30 @@ qboolean Item_TextField_HandleKey(itemDef_t *item, int key) // // ignore any non printable chars // - if ( key < 32 || !item->cvar) + if ( key < 32 || !item->cvar) { return qtrue; } - if (item->type == ITEM_TYPE_NUMERICFIELD) + if (item->type == ITEM_TYPE_NUMERICFIELD) { - if (key < '0' || key > '9') + if (key < '0' || key > '9') { return qfalse; } } - if (!DC->getOverstrikeMode()) + if (!DC->getOverstrikeMode()) { - if (( len == MAX_EDITFIELD - 1 ) || (editPtr->maxChars && len >= editPtr->maxChars)) + if (( len == MAX_EDITFIELD - 1 ) || (editPtr->maxChars && len >= editPtr->maxChars)) { return qtrue; } memmove( &buff[item->cursorPos + 1], &buff[item->cursorPos], len + 1 - item->cursorPos ); - } - else + } + else { - if (editPtr->maxChars && item->cursorPos >= editPtr->maxChars) + if (editPtr->maxChars && item->cursorPos >= editPtr->maxChars) { return qtrue; } @@ -9677,22 +9683,22 @@ qboolean Item_TextField_HandleKey(itemDef_t *item, int key) DC->setCVar(item->cvar, buff); - if (item->cursorPos < len + 1) + if (item->cursorPos < len + 1) { item->cursorPos++; - if (editPtr->maxPaintChars && item->cursorPos > editPtr->maxPaintChars) + if (editPtr->maxPaintChars && item->cursorPos > editPtr->maxPaintChars) { editPtr->paintOffset++; } } - } - else + } + else { - if ( key == A_DELETE || key == A_KP_PERIOD ) + if ( key == A_DELETE || key == A_KP_PERIOD ) { - if ( item->cursorPos < len ) + if ( item->cursorPos < len ) { memmove( buff + item->cursorPos, buff + item->cursorPos + 1, len - item->cursorPos); DC->setCVar(item->cvar, buff); @@ -9700,78 +9706,78 @@ qboolean Item_TextField_HandleKey(itemDef_t *item, int key) return qtrue; } - if ( key == A_CURSOR_RIGHT || key == A_KP_6 ) + if ( key == A_CURSOR_RIGHT || key == A_KP_6 ) { - if (editPtr->maxPaintChars && item->cursorPos >= editPtr->maxPaintChars && item->cursorPos < len) + if (editPtr->maxPaintChars && item->cursorPos >= editPtr->maxPaintChars && item->cursorPos < len) { item->cursorPos++; editPtr->paintOffset++; return qtrue; } - if (item->cursorPos < len) + if (item->cursorPos < len) { item->cursorPos++; - } + } return qtrue; } - if ( key == A_CURSOR_LEFT|| key == A_KP_4 ) + if ( key == A_CURSOR_LEFT|| key == A_KP_4 ) { - if ( item->cursorPos > 0 ) + if ( item->cursorPos > 0 ) { item->cursorPos--; } - if (item->cursorPos < editPtr->paintOffset) + if (item->cursorPos < editPtr->paintOffset) { editPtr->paintOffset--; } return qtrue; } - if ( key == A_HOME || key == A_KP_7) + if ( key == A_HOME || key == A_KP_7) { item->cursorPos = 0; editPtr->paintOffset = 0; return qtrue; } - if ( key == A_END || key == A_KP_1) + if ( key == A_END || key == A_KP_1) { item->cursorPos = len; - if(item->cursorPos > editPtr->maxPaintChars) + if(item->cursorPos > editPtr->maxPaintChars) { editPtr->paintOffset = len - editPtr->maxPaintChars; } return qtrue; } - if ( key == A_INSERT || key == A_KP_0 ) + if ( key == A_INSERT || key == A_KP_0 ) { DC->setOverstrikeMode(!DC->getOverstrikeMode()); return qtrue; } } - if (key == A_TAB || key == A_CURSOR_DOWN || key == A_KP_2) + if (key == A_TAB || key == A_CURSOR_DOWN || key == A_KP_2) { newItem = Menu_SetNextCursorItem((menuDef_t *) item->parent); - if (newItem && (newItem->type == ITEM_TYPE_EDITFIELD || newItem->type == ITEM_TYPE_NUMERICFIELD)) + if (newItem && (newItem->type == ITEM_TYPE_EDITFIELD || newItem->type == ITEM_TYPE_NUMERICFIELD)) { g_editItem = newItem; } } - if (key == A_CURSOR_UP || key == A_KP_8) + if (key == A_CURSOR_UP || key == A_KP_8) { newItem = Menu_SetPrevCursorItem((menuDef_t *) item->parent); - if (newItem && (newItem->type == ITEM_TYPE_EDITFIELD || newItem->type == ITEM_TYPE_NUMERICFIELD)) + if (newItem && (newItem->type == ITEM_TYPE_EDITFIELD || newItem->type == ITEM_TYPE_NUMERICFIELD)) { g_editItem = newItem; } } - if ( key == A_ENTER || key == A_KP_ENTER || key == A_ESCAPE) + if ( key == A_ENTER || key == A_KP_ENTER || key == A_ESCAPE) { return qfalse; } @@ -9782,30 +9788,30 @@ qboolean Item_TextField_HandleKey(itemDef_t *item, int key) } -static void Scroll_TextScroll_AutoFunc (void *p) +static void Scroll_TextScroll_AutoFunc (void *p) { scrollInfo_t *si = (scrollInfo_t*)p; - if (DC->realTime > si->nextScrollTime) - { + if (DC->realTime > si->nextScrollTime) + { // need to scroll which is done by simulating a click to the item // this is done a bit sideways as the autoscroll "knows" that the item is a listbox // so it calls it directly Item_TextScroll_HandleKey(si->item, si->scrollKey, qtrue, qfalse); - si->nextScrollTime = DC->realTime + si->adjustValue; + si->nextScrollTime = DC->realTime + si->adjustValue; } - if (DC->realTime > si->nextAdjustTime) + if (DC->realTime > si->nextAdjustTime) { si->nextAdjustTime = DC->realTime + SCROLL_TIME_ADJUST; - if (si->adjustValue > SCROLL_TIME_FLOOR) + if (si->adjustValue > SCROLL_TIME_FLOOR) { si->adjustValue -= SCROLL_TIME_ADJUSTOFFSET; } } } -static void Scroll_TextScroll_ThumbFunc(void *p) +static void Scroll_TextScroll_ThumbFunc(void *p) { scrollInfo_t *si = (scrollInfo_t*)p; rectDef_t r; @@ -9814,7 +9820,7 @@ static void Scroll_TextScroll_ThumbFunc(void *p) textScrollDef_t *scrollPtr = (textScrollDef_t*)si->item->typeData; - if (DC->cursory != si->yStart) + if (DC->cursory != si->yStart) { r.x = si->item->window.rect.x + si->item->window.rect.w - SCROLLBAR_SIZE - 1; r.y = si->item->window.rect.y + SCROLLBAR_SIZE + 1; @@ -9823,11 +9829,11 @@ static void Scroll_TextScroll_ThumbFunc(void *p) max = Item_TextScroll_MaxScroll(si->item); // pos = (DC->cursory - r.y - SCROLLBAR_SIZE/2) * max / (r.h - SCROLLBAR_SIZE); - if (pos < 0) + if (pos < 0) { pos = 0; } - else if (pos > max) + else if (pos > max) { pos = max; } @@ -9836,19 +9842,19 @@ static void Scroll_TextScroll_ThumbFunc(void *p) si->yStart = DC->cursory; } - if (DC->realTime > si->nextScrollTime) - { + if (DC->realTime > si->nextScrollTime) + { // need to scroll which is done by simulating a click to the item // this is done a bit sideways as the autoscroll "knows" that the item is a listbox // so it calls it directly Item_TextScroll_HandleKey(si->item, si->scrollKey, qtrue, qfalse); - si->nextScrollTime = DC->realTime + si->adjustValue; + si->nextScrollTime = DC->realTime + si->adjustValue; } - if (DC->realTime > si->nextAdjustTime) + if (DC->realTime > si->nextAdjustTime) { si->nextAdjustTime = DC->realTime + SCROLL_TIME_ADJUST; - if (si->adjustValue > SCROLL_TIME_FLOOR) + if (si->adjustValue > SCROLL_TIME_FLOOR) { si->adjustValue -= SCROLL_TIME_ADJUSTOFFSET; } @@ -9860,43 +9866,43 @@ static void Scroll_TextScroll_ThumbFunc(void *p) Menu_OverActiveItem ================= */ -static qboolean Menu_OverActiveItem(menuDef_t *menu, float x, float y) +static qboolean Menu_OverActiveItem(menuDef_t *menu, float x, float y) { - if (menu && menu->window.flags & (WINDOW_VISIBLE | WINDOW_FORCED)) + if (menu && menu->window.flags & (WINDOW_VISIBLE | WINDOW_FORCED)) { - if (Rect_ContainsPoint(&menu->window.rect, x, y)) + if (Rect_ContainsPoint(&menu->window.rect, x, y)) { int i; - for (i = 0; i < menu->itemCount; i++) + for (i = 0; i < menu->itemCount; i++) { // turn off focus each item // menu->items[i].window.flags &= ~WINDOW_HASFOCUS; - if (!(menu->items[i]->window.flags & (WINDOW_VISIBLE | WINDOW_FORCED))) + if (!(menu->items[i]->window.flags & (WINDOW_VISIBLE | WINDOW_FORCED))) { continue; } - if (menu->items[i]->window.flags & WINDOW_DECORATION) + if (menu->items[i]->window.flags & WINDOW_DECORATION) { continue; } - if (Rect_ContainsPoint(&menu->items[i]->window.rect, x, y)) + if (Rect_ContainsPoint(&menu->items[i]->window.rect, x, y)) { itemDef_t *overItem = menu->items[i]; - if (overItem->type == ITEM_TYPE_TEXT && overItem->text) + if (overItem->type == ITEM_TYPE_TEXT && overItem->text) { - if (Rect_ContainsPoint(&overItem->window.rect, x, y)) + if (Rect_ContainsPoint(&overItem->window.rect, x, y)) { return qtrue; - } - else + } + else { continue; } - } - else + } + else { return qtrue; } @@ -9912,13 +9918,13 @@ static qboolean Menu_OverActiveItem(menuDef_t *menu, float x, float y) Display_VisibleMenuCount ================= */ -int Display_VisibleMenuCount(void) +int Display_VisibleMenuCount(void) { int i, count; count = 0; - for (i = 0; i < menuCount; i++) + for (i = 0; i < menuCount; i++) { - if (Menus[i].window.flags & (WINDOW_FORCED | WINDOW_VISIBLE)) + if (Menus[i].window.flags & (WINDOW_FORCED | WINDOW_VISIBLE)) { count++; } @@ -9931,9 +9937,9 @@ int Display_VisibleMenuCount(void) Window_CloseCinematic ================= */ -static void Window_CloseCinematic(windowDef_t *window) +static void Window_CloseCinematic(windowDef_t *window) { - if (window->style == WINDOW_STYLE_CINEMATIC && window->cinematic >= 0) + if (window->style == WINDOW_STYLE_CINEMATIC && window->cinematic >= 0) { DC->stopCinematic(window->cinematic); window->cinematic = -1; @@ -9944,16 +9950,16 @@ static void Window_CloseCinematic(windowDef_t *window) Menu_CloseCinematics ================= */ -static void Menu_CloseCinematics(menuDef_t *menu) +static void Menu_CloseCinematics(menuDef_t *menu) { - if (menu) + if (menu) { int i; Window_CloseCinematic(&menu->window); - for (i = 0; i < menu->itemCount; i++) + for (i = 0; i < menu->itemCount; i++) { Window_CloseCinematic(&menu->items[i]->window); - if (menu->items[i]->type == ITEM_TYPE_OWNERDRAW) + if (menu->items[i]->type == ITEM_TYPE_OWNERDRAW) { DC->stopCinematic(0-menu->items[i]->window.ownerDraw); } @@ -9966,10 +9972,10 @@ static void Menu_CloseCinematics(menuDef_t *menu) Display_CloseCinematics ================= */ -static void Display_CloseCinematics() +static void Display_CloseCinematics() { int i; - for (i = 0; i < menuCount; i++) + for (i = 0; i < menuCount; i++) { Menu_CloseCinematics(&Menus[i]); } @@ -9980,23 +9986,23 @@ static void Display_CloseCinematics() Menus_HandleOOBClick ================= */ -void Menus_HandleOOBClick(menuDef_t *menu, int key, qboolean down) +void Menus_HandleOOBClick(menuDef_t *menu, int key, qboolean down) { - if (menu) + if (menu) { int i; - // basically the behaviour we are looking for is if there are windows in the stack.. see if - // the cursor is within any of them.. if not close them otherwise activate them and pass the - // key on.. force a mouse move to activate focus and script stuff - if (down && menu->window.flags & WINDOW_OOB_CLICK) + // basically the behaviour we are looking for is if there are windows in the stack.. see if + // the cursor is within any of them.. if not close them otherwise activate them and pass the + // key on.. force a mouse move to activate focus and script stuff + if (down && menu->window.flags & WINDOW_OOB_CLICK) { Menu_RunCloseScript(menu); menu->window.flags &= ~(WINDOW_HASFOCUS | WINDOW_VISIBLE); } - for (i = 0; i < menuCount; i++) + for (i = 0; i < menuCount; i++) { - if (Menu_OverActiveItem(&Menus[i], DC->cursorx, DC->cursory)) + if (Menu_OverActiveItem(&Menus[i], DC->cursorx, DC->cursory)) { Menu_RunCloseScript(menu); menu->window.flags &= ~(WINDOW_HASFOCUS | WINDOW_VISIBLE); @@ -10006,9 +10012,9 @@ void Menus_HandleOOBClick(menuDef_t *menu, int key, qboolean down) } } - if (Display_VisibleMenuCount() == 0) + if (Display_VisibleMenuCount() == 0) { - if (DC->Pause) + if (DC->Pause) { DC->Pause(qfalse); } @@ -10022,7 +10028,7 @@ void Menus_HandleOOBClick(menuDef_t *menu, int key, qboolean down) Item_StopCapture ================= */ -void Item_StopCapture(itemDef_t *item) +void Item_StopCapture(itemDef_t *item) { } @@ -10032,7 +10038,7 @@ void Item_StopCapture(itemDef_t *item) Item_ListBox_HandleKey ================= */ -qboolean Item_ListBox_HandleKey(itemDef_t *item, int key, qboolean down, qboolean force) +qboolean Item_ListBox_HandleKey(itemDef_t *item, int key, qboolean down, qboolean force) { listBoxDef_t *listPtr = (listBoxDef_t*)item->typeData; int count = DC->feederCount(item->special); @@ -10043,20 +10049,20 @@ qboolean Item_ListBox_HandleKey(itemDef_t *item, int key, qboolean down, qboolea if (item->window.flags & WINDOW_HORIZONTAL) { viewmax = (item->window.rect.w / listPtr->elementWidth); - if ( key == A_CURSOR_LEFT || key == A_KP_4 ) + if ( key == A_CURSOR_LEFT || key == A_KP_4 ) { - if (!listPtr->notselectable) + if (!listPtr->notselectable) { listPtr->cursorPos--; - if (listPtr->cursorPos < 0) + if (listPtr->cursorPos < 0) { listPtr->cursorPos = 0; } - if (listPtr->cursorPos < listPtr->startPos) + if (listPtr->cursorPos < listPtr->startPos) { listPtr->startPos = listPtr->cursorPos; } - if (listPtr->cursorPos >= listPtr->startPos + viewmax) + if (listPtr->cursorPos >= listPtr->startPos + viewmax) { listPtr->startPos = listPtr->cursorPos - viewmax + 1; } @@ -10065,7 +10071,7 @@ qboolean Item_ListBox_HandleKey(itemDef_t *item, int key, qboolean down, qboolea DC->feederSelection(item->special, item->cursorPos, item); } - else + else { listPtr->startPos--; if (listPtr->startPos < 0) @@ -10075,21 +10081,21 @@ qboolean Item_ListBox_HandleKey(itemDef_t *item, int key, qboolean down, qboolea } return qtrue; } - if ( key == A_CURSOR_RIGHT || key == A_KP_6 ) + if ( key == A_CURSOR_RIGHT || key == A_KP_6 ) { - if (!listPtr->notselectable) + if (!listPtr->notselectable) { listPtr->cursorPos++; - if (listPtr->cursorPos < listPtr->startPos) + if (listPtr->cursorPos < listPtr->startPos) { listPtr->startPos = listPtr->cursorPos; } - if (listPtr->cursorPos >= count) + if (listPtr->cursorPos >= count) { listPtr->cursorPos = count-1; } - if (listPtr->cursorPos >= listPtr->startPos + viewmax) + if (listPtr->cursorPos >= listPtr->startPos + viewmax) { listPtr->startPos = listPtr->cursorPos - viewmax + 1; } @@ -10097,7 +10103,7 @@ qboolean Item_ListBox_HandleKey(itemDef_t *item, int key, qboolean down, qboolea DC->feederSelection(item->special, item->cursorPos, item); } - else + else { listPtr->startPos++; @@ -10109,24 +10115,24 @@ qboolean Item_ListBox_HandleKey(itemDef_t *item, int key, qboolean down, qboolea return qtrue; } } - else + else { viewmax = (item->window.rect.h / listPtr->elementHeight); - if ( key == A_CURSOR_UP || key == A_KP_8 ) + if ( key == A_CURSOR_UP || key == A_KP_8 ) { - if (!listPtr->notselectable) + if (!listPtr->notselectable) { listPtr->cursorPos--; - if (listPtr->cursorPos < 0) + if (listPtr->cursorPos < 0) { listPtr->cursorPos = 0; } - if (listPtr->cursorPos < listPtr->startPos) + if (listPtr->cursorPos < listPtr->startPos) { listPtr->startPos = listPtr->cursorPos; } - if (listPtr->cursorPos >= listPtr->startPos + viewmax) + if (listPtr->cursorPos >= listPtr->startPos + viewmax) { listPtr->startPos = listPtr->cursorPos - viewmax + 1; } @@ -10134,7 +10140,7 @@ qboolean Item_ListBox_HandleKey(itemDef_t *item, int key, qboolean down, qboolea DC->feederSelection(item->special, item->cursorPos, item); } - else + else { listPtr->startPos--; @@ -10145,20 +10151,20 @@ qboolean Item_ListBox_HandleKey(itemDef_t *item, int key, qboolean down, qboolea } return qtrue; } - if ( key == A_CURSOR_DOWN || key == A_KP_2 ) + if ( key == A_CURSOR_DOWN || key == A_KP_2 ) { - if (!listPtr->notselectable) + if (!listPtr->notselectable) { listPtr->cursorPos++; - if (listPtr->cursorPos < listPtr->startPos) + if (listPtr->cursorPos < listPtr->startPos) { listPtr->startPos = listPtr->cursorPos; } - if (listPtr->cursorPos >= count) + if (listPtr->cursorPos >= count) { listPtr->cursorPos = count-1; } - if (listPtr->cursorPos >= listPtr->startPos + viewmax) + if (listPtr->cursorPos >= listPtr->startPos + viewmax) { listPtr->startPos = listPtr->cursorPos - viewmax + 1; } @@ -10167,10 +10173,10 @@ qboolean Item_ListBox_HandleKey(itemDef_t *item, int key, qboolean down, qboolea DC->feederSelection(item->special, item->cursorPos, item); } - else + else { listPtr->startPos++; - + if (listPtr->startPos > max) { listPtr->startPos = max; @@ -10180,7 +10186,7 @@ qboolean Item_ListBox_HandleKey(itemDef_t *item, int key, qboolean down, qboolea } //Raz: Added - if ( key == A_MWHEELUP ) + if ( key == A_MWHEELUP ) { listPtr->startPos -= ((int)item->special == FEEDER_Q3HEADS) ? viewmax : 1; if (listPtr->startPos < 0) @@ -10192,7 +10198,7 @@ qboolean Item_ListBox_HandleKey(itemDef_t *item, int key, qboolean down, qboolea Display_MouseMove(NULL, DC->cursorx, DC->cursory); return qtrue; } - if ( key == A_MWHEELDOWN ) + if ( key == A_MWHEELDOWN ) { listPtr->startPos += ((int)item->special == FEEDER_Q3HEADS) ? viewmax : 1; if (listPtr->startPos > max) @@ -10206,51 +10212,51 @@ qboolean Item_ListBox_HandleKey(itemDef_t *item, int key, qboolean down, qboolea } } // mouse hit - if (key == A_MOUSE1 || key == A_MOUSE2) + if (key == A_MOUSE1 || key == A_MOUSE2) { - if (item->window.flags & WINDOW_LB_LEFTARROW) + if (item->window.flags & WINDOW_LB_LEFTARROW) { listPtr->startPos--; - if (listPtr->startPos < 0) + if (listPtr->startPos < 0) { listPtr->startPos = 0; } - } - else if (item->window.flags & WINDOW_LB_RIGHTARROW) + } + else if (item->window.flags & WINDOW_LB_RIGHTARROW) { // one down listPtr->startPos++; - if (listPtr->startPos > max) + if (listPtr->startPos > max) { listPtr->startPos = max; } - } - else if (item->window.flags & WINDOW_LB_PGUP) + } + else if (item->window.flags & WINDOW_LB_PGUP) { // page up listPtr->startPos -= viewmax; - if (listPtr->startPos < 0) + if (listPtr->startPos < 0) { listPtr->startPos = 0; } - } - else if (item->window.flags & WINDOW_LB_PGDN) + } + else if (item->window.flags & WINDOW_LB_PGDN) { // page down listPtr->startPos += viewmax; - if (listPtr->startPos > max) + if (listPtr->startPos > max) { listPtr->startPos = max; } - } - else if (item->window.flags & WINDOW_LB_THUMB) + } + else if (item->window.flags & WINDOW_LB_THUMB) { // Display_SetCaptureItem(item); - } - else + } + else { // select an item - if (DC->realTime < lastListBoxClickTime && listPtr->doubleClick) + if (DC->realTime < lastListBoxClickTime && listPtr->doubleClick) { Item_RunScript(item, listPtr->doubleClick); } @@ -10260,74 +10266,74 @@ qboolean Item_ListBox_HandleKey(itemDef_t *item, int key, qboolean down, qboolea } return qtrue; } - if ( key == A_HOME || key == A_KP_7) + if ( key == A_HOME || key == A_KP_7) { // home listPtr->startPos = 0; return qtrue; } - if ( key == A_END || key == A_KP_1) + if ( key == A_END || key == A_KP_1) { // end listPtr->startPos = max; return qtrue; } - if (key == A_PAGE_UP || key == A_KP_9 ) + if (key == A_PAGE_UP || key == A_KP_9 ) { // page up - if (!listPtr->notselectable) + if (!listPtr->notselectable) { listPtr->cursorPos -= viewmax; - if (listPtr->cursorPos < 0) + if (listPtr->cursorPos < 0) { listPtr->cursorPos = 0; } - if (listPtr->cursorPos < listPtr->startPos) + if (listPtr->cursorPos < listPtr->startPos) { listPtr->startPos = listPtr->cursorPos; } - if (listPtr->cursorPos >= listPtr->startPos + viewmax) + if (listPtr->cursorPos >= listPtr->startPos + viewmax) { listPtr->startPos = listPtr->cursorPos - viewmax + 1; } item->cursorPos = listPtr->cursorPos; DC->feederSelection(item->special, item->cursorPos, item); } - else + else { listPtr->startPos -= viewmax; - if (listPtr->startPos < 0) + if (listPtr->startPos < 0) { listPtr->startPos = 0; } } return qtrue; } - if ( key == A_PAGE_DOWN || key == A_KP_3 ) + if ( key == A_PAGE_DOWN || key == A_KP_3 ) { // page down - if (!listPtr->notselectable) + if (!listPtr->notselectable) { listPtr->cursorPos += viewmax; - if (listPtr->cursorPos < listPtr->startPos) + if (listPtr->cursorPos < listPtr->startPos) { listPtr->startPos = listPtr->cursorPos; } - if (listPtr->cursorPos >= count) + if (listPtr->cursorPos >= count) { listPtr->cursorPos = count-1; } - if (listPtr->cursorPos >= listPtr->startPos + viewmax) + if (listPtr->cursorPos >= listPtr->startPos + viewmax) { listPtr->startPos = listPtr->cursorPos - viewmax + 1; } item->cursorPos = listPtr->cursorPos; DC->feederSelection(item->special, item->cursorPos, item); } - else + else { listPtr->startPos += viewmax; - if (listPtr->startPos > max) + if (listPtr->startPos > max) { listPtr->startPos = max; } @@ -10343,22 +10349,22 @@ qboolean Item_ListBox_HandleKey(itemDef_t *item, int key, qboolean down, qboolea Scroll_ListBox_AutoFunc ================= */ -static void Scroll_ListBox_AutoFunc(void *p) +static void Scroll_ListBox_AutoFunc(void *p) { scrollInfo_t *si = (scrollInfo_t*)p; - if (DC->realTime > si->nextScrollTime) - { + if (DC->realTime > si->nextScrollTime) + { // need to scroll which is done by simulating a click to the item // this is done a bit sideways as the autoscroll "knows" that the item is a listbox // so it calls it directly Item_ListBox_HandleKey(si->item, si->scrollKey, qtrue, qfalse); - si->nextScrollTime = DC->realTime + si->adjustValue; + si->nextScrollTime = DC->realTime + si->adjustValue; } - if (DC->realTime > si->nextAdjustTime) + if (DC->realTime > si->nextAdjustTime) { si->nextAdjustTime = DC->realTime + SCROLL_TIME_ADJUST; - if (si->adjustValue > SCROLL_TIME_FLOOR) + if (si->adjustValue > SCROLL_TIME_FLOOR) { si->adjustValue -= SCROLL_TIME_ADJUSTOFFSET; } @@ -10370,16 +10376,16 @@ static void Scroll_ListBox_AutoFunc(void *p) Scroll_ListBox_ThumbFunc ================= */ -static void Scroll_ListBox_ThumbFunc(void *p) +static void Scroll_ListBox_ThumbFunc(void *p) { scrollInfo_t *si = (scrollInfo_t*)p; rectDef_t r; int pos, max; listBoxDef_t *listPtr = (listBoxDef_t*)si->item->typeData; - if (si->item->window.flags & WINDOW_HORIZONTAL) + if (si->item->window.flags & WINDOW_HORIZONTAL) { - if (DC->cursorx == si->xStart) + if (DC->cursorx == si->xStart) { return; } @@ -10390,18 +10396,18 @@ static void Scroll_ListBox_ThumbFunc(void *p) max = Item_ListBox_MaxScroll(si->item); // pos = (DC->cursorx - r.x - SCROLLBAR_SIZE/2) * max / (r.w - SCROLLBAR_SIZE); - if (pos < 0) + if (pos < 0) { pos = 0; } - else if (pos > max) + else if (pos > max) { pos = max; } listPtr->startPos = pos; si->xStart = DC->cursorx; } - else if (DC->cursory != si->yStart) + else if (DC->cursory != si->yStart) { r.x = si->item->window.rect.x + si->item->window.rect.w - SCROLLBAR_SIZE - 1; @@ -10411,11 +10417,11 @@ static void Scroll_ListBox_ThumbFunc(void *p) max = Item_ListBox_MaxScroll(si->item); // pos = (DC->cursory - r.y - SCROLLBAR_SIZE/2) * max / (r.h - SCROLLBAR_SIZE); - if (pos < 0) + if (pos < 0) { pos = 0; } - else if (pos > max) + else if (pos > max) { pos = max; } @@ -10423,19 +10429,19 @@ static void Scroll_ListBox_ThumbFunc(void *p) si->yStart = DC->cursory; } - if (DC->realTime > si->nextScrollTime) - { + if (DC->realTime > si->nextScrollTime) + { // need to scroll which is done by simulating a click to the item // this is done a bit sideways as the autoscroll "knows" that the item is a listbox // so it calls it directly Item_ListBox_HandleKey(si->item, si->scrollKey, qtrue, qfalse); - si->nextScrollTime = DC->realTime + si->adjustValue; + si->nextScrollTime = DC->realTime + si->adjustValue; } - if (DC->realTime > si->nextAdjustTime) + if (DC->realTime > si->nextAdjustTime) { si->nextAdjustTime = DC->realTime + SCROLL_TIME_ADJUST; - if (si->adjustValue > SCROLL_TIME_FLOOR) + if (si->adjustValue > SCROLL_TIME_FLOOR) { si->adjustValue -= SCROLL_TIME_ADJUSTOFFSET; } @@ -10447,7 +10453,7 @@ static void Scroll_ListBox_ThumbFunc(void *p) Item_Slider_OverSlider ================= */ -int Item_Slider_OverSlider(itemDef_t *item, float x, float y) +int Item_Slider_OverSlider(itemDef_t *item, float x, float y) { rectDef_t r; @@ -10456,7 +10462,7 @@ int Item_Slider_OverSlider(itemDef_t *item, float x, float y) r.w = SLIDER_THUMB_WIDTH; r.h = SLIDER_THUMB_HEIGHT; - if (Rect_ContainsPoint(&r, x, y)) + if (Rect_ContainsPoint(&r, x, y)) { return WINDOW_LB_THUMB; } @@ -10468,28 +10474,28 @@ int Item_Slider_OverSlider(itemDef_t *item, float x, float y) Scroll_Slider_ThumbFunc ================= */ -static void Scroll_Slider_ThumbFunc(void *p) +static void Scroll_Slider_ThumbFunc(void *p) { float x, value, cursorx; scrollInfo_t *si = (scrollInfo_t*)p; editFieldDef_t *editDef = (struct editFieldDef_s *) si->item->typeData; - if (si->item->text) + if (si->item->text) { x = si->item->textRect.x + si->item->textRect.w + 8; - } - else + } + else { x = si->item->window.rect.x; } cursorx = DC->cursorx; - if (cursorx < x) + if (cursorx < x) { cursorx = x; - } - else if (cursorx > x + SLIDER_WIDTH) + } + else if (cursorx > x + SLIDER_WIDTH) { cursorx = x + SLIDER_WIDTH; } @@ -10504,10 +10510,10 @@ static void Scroll_Slider_ThumbFunc(void *p) Item_StartCapture ================= */ -void Item_StartCapture(itemDef_t *item, int key) +void Item_StartCapture(itemDef_t *item, int key) { int flags; - switch (item->type) + switch (item->type) { case ITEM_TYPE_EDITFIELD: case ITEM_TYPE_NUMERICFIELD: @@ -10515,7 +10521,7 @@ void Item_StartCapture(itemDef_t *item, int key) case ITEM_TYPE_LISTBOX: { flags = Item_ListBox_OverLB(item, DC->cursorx, DC->cursory); - if (flags & (WINDOW_LB_LEFTARROW | WINDOW_LB_RIGHTARROW)) + if (flags & (WINDOW_LB_LEFTARROW | WINDOW_LB_RIGHTARROW)) { scrollInfo.nextScrollTime = DC->realTime + SCROLL_TIME_START; scrollInfo.nextAdjustTime = DC->realTime + SCROLL_TIME_ADJUST; @@ -10526,8 +10532,8 @@ void Item_StartCapture(itemDef_t *item, int key) captureData = &scrollInfo; captureFunc = &Scroll_ListBox_AutoFunc; itemCapture = item; - } - else if (flags & WINDOW_LB_THUMB) + } + else if (flags & WINDOW_LB_THUMB) { scrollInfo.scrollKey = key; scrollInfo.item = item; @@ -10542,7 +10548,7 @@ void Item_StartCapture(itemDef_t *item, int key) case ITEM_TYPE_TEXTSCROLL: flags = Item_TextScroll_OverLB (item, DC->cursorx, DC->cursory); - if (flags & (WINDOW_LB_LEFTARROW | WINDOW_LB_RIGHTARROW)) + if (flags & (WINDOW_LB_LEFTARROW | WINDOW_LB_RIGHTARROW)) { scrollInfo.nextScrollTime = DC->realTime + SCROLL_TIME_START; scrollInfo.nextAdjustTime = DC->realTime + SCROLL_TIME_ADJUST; @@ -10553,8 +10559,8 @@ void Item_StartCapture(itemDef_t *item, int key) captureData = &scrollInfo; captureFunc = &Scroll_TextScroll_AutoFunc; itemCapture = item; - } - else if (flags & WINDOW_LB_THUMB) + } + else if (flags & WINDOW_LB_THUMB) { scrollInfo.scrollKey = key; scrollInfo.item = item; @@ -10569,7 +10575,7 @@ void Item_StartCapture(itemDef_t *item, int key) case ITEM_TYPE_SLIDER: { flags = Item_Slider_OverSlider(item, DC->cursorx, DC->cursory); - if (flags & WINDOW_LB_THUMB) + if (flags & WINDOW_LB_THUMB) { scrollInfo.scrollKey = key; scrollInfo.item = item; @@ -10589,11 +10595,11 @@ void Item_StartCapture(itemDef_t *item, int key) Item_YesNo_HandleKey ================= */ -qboolean Item_YesNo_HandleKey(itemDef_t *item, int key) +qboolean Item_YesNo_HandleKey(itemDef_t *item, int key) { - if (Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory) && item->window.flags & WINDOW_HASFOCUS && item->cvar) + if (Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory) && item->window.flags & WINDOW_HASFOCUS && item->cvar) { - if (key == A_MOUSE1 || key == A_ENTER || key == A_MOUSE2 || key == A_MOUSE3) + if (key == A_MOUSE1 || key == A_ENTER || key == A_MOUSE2 || key == A_MOUSE3) { DC->setCVar(item->cvar, va("%i", !DC->getCVarValue(item->cvar))); return qtrue; @@ -10609,34 +10615,34 @@ qboolean Item_YesNo_HandleKey(itemDef_t *item, int key) Item_Multi_FindCvarByValue ================= */ -int Item_Multi_FindCvarByValue(itemDef_t *item) +int Item_Multi_FindCvarByValue(itemDef_t *item) { char buff[1024]; float value = 0; int i; multiDef_t *multiPtr = (multiDef_t*)item->typeData; - if (multiPtr) + if (multiPtr) { - if (multiPtr->strDef) + if (multiPtr->strDef) { DC->getCVarString(item->cvar, buff, sizeof(buff)); - } - else + } + else { value = DC->getCVarValue(item->cvar); } - for (i = 0; i < multiPtr->count; i++) + for (i = 0; i < multiPtr->count; i++) { - if (multiPtr->strDef) + if (multiPtr->strDef) { - if (Q_stricmp(buff, multiPtr->cvarStr[i]) == 0) + if (Q_stricmp(buff, multiPtr->cvarStr[i]) == 0) { return i; } - } - else + } + else { - if (multiPtr->cvarValue[i] == value) + if (multiPtr->cvarValue[i] == value) { return i; } @@ -10651,10 +10657,10 @@ int Item_Multi_FindCvarByValue(itemDef_t *item) Item_Multi_CountSettings ================= */ -int Item_Multi_CountSettings(itemDef_t *item) +int Item_Multi_CountSettings(itemDef_t *item) { multiDef_t *multiPtr = (multiDef_t*)item->typeData; - if (multiPtr == NULL) + if (multiPtr == NULL) { return 0; } @@ -10668,9 +10674,9 @@ int Item_Multi_CountSettings(itemDef_t *item) Item_OwnerDraw_HandleKey ================= */ -qboolean Item_OwnerDraw_HandleKey(itemDef_t *item, int key) +qboolean Item_OwnerDraw_HandleKey(itemDef_t *item, int key) { - if (item && DC->ownerDrawHandleKey) + if (item && DC->ownerDrawHandleKey) { return DC->ownerDrawHandleKey(item->window.ownerDraw, item->window.ownerDrawFlags, &item->special, key); } @@ -10682,18 +10688,18 @@ qboolean Item_OwnerDraw_HandleKey(itemDef_t *item, int key) Item_Text_HandleKey ================= */ -qboolean Item_Text_HandleKey(itemDef_t *item, int key) +qboolean Item_Text_HandleKey(itemDef_t *item, int key) { if (Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory) && item->window.flags & WINDOW_AUTOWRAPPED) { - if (key == A_MOUSE1 || key == A_ENTER || key == A_MOUSE2 || key == A_MOUSE3) + if (key == A_MOUSE1 || key == A_ENTER || key == A_MOUSE2 || key == A_MOUSE3) { if (key == A_MOUSE2) { item->cursorPos--; - if ( item->cursorPos < 0 ) + if ( item->cursorPos < 0 ) { item->cursorPos = 0; } @@ -10701,7 +10707,7 @@ qboolean Item_Text_HandleKey(itemDef_t *item, int key) else if (item->special) { item->cursorPos++; - if ( item->cursorPos >= item->value ) + if ( item->cursorPos >= item->value ) { item->cursorPos = 0; } @@ -10719,16 +10725,16 @@ qboolean Item_Text_HandleKey(itemDef_t *item, int key) Item_Multi_HandleKey ================= */ -qboolean Item_Multi_HandleKey(itemDef_t *item, int key) +qboolean Item_Multi_HandleKey(itemDef_t *item, int key) { multiDef_t *multiPtr = (multiDef_t*)item->typeData; - if (multiPtr) + if (multiPtr) { - if (Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory) && item->window.flags & WINDOW_HASFOCUS) + if (Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory) && item->window.flags & WINDOW_HASFOCUS) { //Raz: Scroll on multi buttons! - if (key == A_MOUSE1 || key == A_ENTER || key == A_MOUSE2 || key == A_MOUSE3 || key == A_MWHEELDOWN || key == A_MWHEELUP) - //if (key == A_MOUSE1 || key == A_ENTER || key == A_MOUSE2 || key == A_MOUSE3) + if (key == A_MOUSE1 || key == A_ENTER || key == A_MOUSE2 || key == A_MOUSE3 || key == A_MWHEELDOWN || key == A_MWHEELUP) + //if (key == A_MOUSE1 || key == A_ENTER || key == A_MOUSE2 || key == A_MOUSE3) { if (item->cvar) { @@ -10738,7 +10744,7 @@ qboolean Item_Multi_HandleKey(itemDef_t *item, int key) if (key == A_MOUSE2 || key == A_MWHEELDOWN) { current--; - if ( current < 0 ) + if ( current < 0 ) { current = max-1; } @@ -10746,24 +10752,24 @@ qboolean Item_Multi_HandleKey(itemDef_t *item, int key) else { current++; - if ( current >= max ) + if ( current >= max ) { current = 0; } } - if (multiPtr->strDef) + if (multiPtr->strDef) { DC->setCVar(item->cvar, multiPtr->cvarStr[current]); - } - else + } + else { float value = multiPtr->cvarValue[current]; - if (((float)((int) value)) == value) + if (((float)((int) value)) == value) { DC->setCVar(item->cvar, va("%i", (int) value )); } - else + else { DC->setCVar(item->cvar, va("%f", value )); } @@ -10780,7 +10786,7 @@ qboolean Item_Multi_HandleKey(itemDef_t *item, int key) if (key == A_MOUSE2 || key == A_MWHEELDOWN) { item->value--; - if ( item->value < 0 ) + if ( item->value < 0 ) { item->value = max; } @@ -10788,7 +10794,7 @@ qboolean Item_Multi_HandleKey(itemDef_t *item, int key) else { item->value++; - if ( item->value >= max ) + if ( item->value >= max ) { item->value = 0; } @@ -10811,28 +10817,28 @@ qboolean Item_Multi_HandleKey(itemDef_t *item, int key) Item_Slider_HandleKey ================= */ -qboolean Item_Slider_HandleKey(itemDef_t *item, int key, qboolean down) +qboolean Item_Slider_HandleKey(itemDef_t *item, int key, qboolean down) { //DC->Print("slider handle key\n"); //JLF MPMOVED float x, value, width, work; - if (item->window.flags & WINDOW_HASFOCUS && item->cvar && Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory)) + if (item->window.flags & WINDOW_HASFOCUS && item->cvar && Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory)) { - if (key == A_MOUSE1 || key == A_ENTER || key == A_MOUSE2 || key == A_MOUSE3) + if (key == A_MOUSE1 || key == A_ENTER || key == A_MOUSE2 || key == A_MOUSE3) { editFieldDef_t *editDef = (editFieldDef_s *) item->typeData; - if (editDef) + if (editDef) { rectDef_t testRect; width = SLIDER_WIDTH; - if (item->text) + if (item->text) { x = item->textRect.x + item->textRect.w + 8; - } - else + } + else { x = item->window.rect.x; } @@ -10844,7 +10850,7 @@ qboolean Item_Slider_HandleKey(itemDef_t *item, int key, qboolean down) //DC->Print("slider x: %f\n", testRect.x); testRect.w = (SLIDER_WIDTH + (float)SLIDER_THUMB_WIDTH / 2); //DC->Print("slider w: %f\n", testRect.w); - if (Rect_ContainsPoint(&testRect, DC->cursorx, DC->cursory)) + if (Rect_ContainsPoint(&testRect, DC->cursorx, DC->cursory)) { work = DC->cursorx - x; value = work / width; @@ -10868,30 +10874,30 @@ qboolean Item_Slider_HandleKey(itemDef_t *item, int key, qboolean down) Item_HandleKey ================= */ -qboolean Item_HandleKey(itemDef_t *item, int key, qboolean down) +qboolean Item_HandleKey(itemDef_t *item, int key, qboolean down) { - if (itemCapture) + if (itemCapture) { Item_StopCapture(itemCapture); itemCapture = NULL; captureFunc = NULL; captureData = NULL; - } - else + } + else { - if (down && (key == A_MOUSE1 || key == A_MOUSE2 || key == A_MOUSE3)) + if (down && (key == A_MOUSE1 || key == A_MOUSE2 || key == A_MOUSE3)) { Item_StartCapture(item, key); } } - if (!down) + if (!down) { return qfalse; } - switch (item->type) + switch (item->type) { case ITEM_TYPE_BUTTON: return qfalse; @@ -11003,9 +11009,9 @@ qboolean Item_HandleSelectionPrev(itemDef_t * item) Item_Action ================= */ -void Item_Action(itemDef_t *item) +void Item_Action(itemDef_t *item) { - if (item) + if (item) { Item_RunScript(item, item->action); } @@ -11016,47 +11022,47 @@ void Item_Action(itemDef_t *item) Menu_HandleKey ================= */ -void Menu_HandleKey(menuDef_t *menu, int key, qboolean down) +void Menu_HandleKey(menuDef_t *menu, int key, qboolean down) { int i; itemDef_t *item = NULL; qboolean inHandler = qfalse; - if (inHandler) + if (inHandler) { return; } inHandler = qtrue; - if (g_waitingForKey && down) + if (g_waitingForKey && down) { Item_Bind_HandleKey(g_bindItem, key, down); inHandler = qfalse; return; } - if (g_editingField && down) + if (g_editingField && down) { - if (!Item_TextField_HandleKey(g_editItem, key)) + if (!Item_TextField_HandleKey(g_editItem, key)) { g_editingField = qfalse; g_editItem = NULL; inHandler = qfalse; return; - } - else if (key == A_MOUSE1 || key == A_MOUSE2 || key == A_MOUSE3) + } + else if (key == A_MOUSE1 || key == A_MOUSE2 || key == A_MOUSE3) { g_editingField = qfalse; g_editItem = NULL; Display_MouseMove(NULL, DC->cursorx, DC->cursory); - } - else if (key == A_TAB || key == A_CURSOR_UP || key == A_CURSOR_DOWN) + } + else if (key == A_TAB || key == A_CURSOR_UP || key == A_CURSOR_DOWN) { return; } } - if (menu == NULL) + if (menu == NULL) { inHandler = qfalse; return; @@ -11064,10 +11070,10 @@ void Menu_HandleKey(menuDef_t *menu, int key, qboolean down) //JLFMOUSE MPMOVED // see if the mouse is within the window bounds and if so is this a mouse click - if (down && !(menu->window.flags & WINDOW_POPUP) && !Rect_ContainsPoint(&menu->window.rect, DC->cursorx, DC->cursory)) + if (down && !(menu->window.flags & WINDOW_POPUP) && !Rect_ContainsPoint(&menu->window.rect, DC->cursorx, DC->cursory)) { static qboolean inHandleKey = qfalse; - if (!inHandleKey && (key == A_MOUSE1 || key == A_MOUSE2 || key == A_MOUSE3)) + if (!inHandleKey && (key == A_MOUSE1 || key == A_MOUSE2 || key == A_MOUSE3)) { inHandleKey = qtrue; Menus_HandleOOBClick(menu, key, down); @@ -11078,18 +11084,18 @@ void Menu_HandleKey(menuDef_t *menu, int key, qboolean down) } // get the item with focus - for (i = 0; i < menu->itemCount; i++) + for (i = 0; i < menu->itemCount; i++) { - if (menu->items[i]->window.flags & WINDOW_HASFOCUS) + if (menu->items[i]->window.flags & WINDOW_HASFOCUS) { item = menu->items[i]; break; } } - if (item != NULL) + if (item != NULL) { - if (Item_HandleKey(item, key, down)) + if (Item_HandleKey(item, key, down)) //JLFLISTBOX { Item_Action(item); @@ -11099,14 +11105,14 @@ void Menu_HandleKey(menuDef_t *menu, int key, qboolean down) } - if (!down) + if (!down) { inHandler = qfalse; return; } // Special Data Pad key handling (gotta love the datapad) - if (!(key & K_CHAR_FLAG) ) + if (!(key & K_CHAR_FLAG) ) { //only check keys not chars char b[256]; DC->getBindingBuf( key, b, 256 ); @@ -11122,17 +11128,17 @@ void Menu_HandleKey(menuDef_t *menu, int key, qboolean down) } } // default handling - switch ( key ) + switch ( key ) { case A_F11: - if (DC->getCVarValue("developer")) + if (DC->getCVarValue("developer")) { uis.debugMode ^= 1; } break; case A_F12: - if (DC->getCVarValue("developer")) + if (DC->getCVarValue("developer")) { DC->executeText(EXEC_APPEND, "screenshot\n"); } @@ -11142,9 +11148,9 @@ void Menu_HandleKey(menuDef_t *menu, int key, qboolean down) Menu_SetPrevCursorItem(menu); break; - + case A_ESCAPE: - if (!g_waitingForKey && menu->onESC) + if (!g_waitingForKey && menu->onESC) { itemDef_t it; it.parent = menu; @@ -11159,17 +11165,17 @@ void Menu_HandleKey(menuDef_t *menu, int key, qboolean down) case A_MOUSE1: case A_MOUSE2: - if (item) + if (item) { - if (item->type == ITEM_TYPE_TEXT) + if (item->type == ITEM_TYPE_TEXT) { - if (Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory)) + if (Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory)) { if ( item->action ) Item_Action(item); else { - if (menu->onAccept) + if (menu->onAccept) { itemDef_t it; it.parent = menu; @@ -11178,17 +11184,17 @@ void Menu_HandleKey(menuDef_t *menu, int key, qboolean down) } } - } - else if (item->type == ITEM_TYPE_EDITFIELD || item->type == ITEM_TYPE_NUMERICFIELD) + } + else if (item->type == ITEM_TYPE_EDITFIELD || item->type == ITEM_TYPE_NUMERICFIELD) { - if (Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory)) + if (Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory)) { item->cursorPos = 0; g_editingField = qtrue; g_editItem = item; //DC->setOverstrikeMode(qtrue); } - } + } //JLFACCEPT // add new types here as needed /* Notes: @@ -11206,26 +11212,26 @@ void Menu_HandleKey(menuDef_t *menu, int key, qboolean down) //Item processed it overriding the menu processing return; } - else if (menu->onAccept) + else if (menu->onAccept) { itemDef_t it; it.parent = menu; Item_RunScript(&it, menu->onAccept); } - + } //END JLFACCEPT - else + else { - if (Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory)) + if (Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory)) { Item_Action(item); } } } - else if (menu->onAccept) + else if (menu->onAccept) { itemDef_t it; it.parent = menu; @@ -11258,16 +11264,16 @@ void Menu_HandleKey(menuDef_t *menu, int key, qboolean down) break; case A_KP_ENTER: case A_ENTER: - if (item) + if (item) { - if (item->type == ITEM_TYPE_EDITFIELD || item->type == ITEM_TYPE_NUMERICFIELD) + if (item->type == ITEM_TYPE_EDITFIELD || item->type == ITEM_TYPE_NUMERICFIELD) { item->cursorPos = 0; g_editingField = qtrue; g_editItem = item; //DC->setOverstrikeMode(qtrue); - } - else + } + else { Item_Action(item); } @@ -11282,15 +11288,15 @@ void Menu_HandleKey(menuDef_t *menu, int key, qboolean down) ParseRect ================= */ -qboolean ParseRect(const char **p, rectDef_t *r) +qboolean ParseRect(const char **p, rectDef_t *r) { - if (!COM_ParseFloat(p, &r->x)) + if (!COM_ParseFloat(p, &r->x)) { - if (!COM_ParseFloat(p, &r->y)) + if (!COM_ParseFloat(p, &r->y)) { - if (!COM_ParseFloat(p, &r->w)) + if (!COM_ParseFloat(p, &r->w)) { - if (!COM_ParseFloat(p, &r->h)) + if (!COM_ParseFloat(p, &r->h)) { return qtrue; } @@ -11321,7 +11327,7 @@ void Menus_HideItems(const char *menuName) menu->window.flags &= ~(WINDOW_HASFOCUS | WINDOW_VISIBLE); - for (i = 0; i < menu->itemCount; i++) + for (i = 0; i < menu->itemCount; i++) { menu->items[i]->cvarFlags = CVAR_HIDE; } @@ -11347,7 +11353,7 @@ void Menus_ShowItems(const char *menuName) menu->window.flags |= (WINDOW_HASFOCUS | WINDOW_VISIBLE); - for (i = 0; i < menu->itemCount; i++) + for (i = 0; i < menu->itemCount; i++) { menu->items[i]->cvarFlags = CVAR_SHOW; } diff --git a/code/ui/ui_shared.h b/code/ui/ui_shared.h index 6323d52678..2ec6e5b660 100644 --- a/code/ui/ui_shared.h +++ b/code/ui/ui_shared.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __UI_SHARED_H #define __UI_SHARED_H @@ -40,17 +45,6 @@ This file is part of Jedi Academy. #define SLIDER_THUMB_HEIGHT 16.0 #define SCROLLBAR_SIZE 16.0 -typedef struct pc_token_s -{ - int type; - int subtype; - int intvalue; - float floatvalue; - char string[MAX_TOKENLENGTH]; -} pc_token_t; - - - // FIXME: combine flags into bitfields to save space // FIXME: consolidate all of the common stuff in one structure for menus and items // THINKABOUTME: is there any compelling reason not to have items contain items diff --git a/code/ui/ui_splash.cpp b/code/ui/ui_splash.cpp deleted file mode 100644 index 3029e4e8de..0000000000 --- a/code/ui/ui_splash.cpp +++ /dev/null @@ -1,292 +0,0 @@ - -#include "../client/client.h" -#include "../renderer/tr_local.h" -#ifdef _WIN32 -#include "../win32/glw_win_dx8.h" -#include "../win32/win_local.h" -#include "../win32/win_file.h" -#endif -#include "../ui/ui_splash.h" - -#define SP_TextureExt "dds" - -extern bool Sys_QuickStart( void ); - -/********* -Globals -*********/ -static bool SP_LicenseDone = false; - -/********* -SP_DisplayIntros -Draws intro movies to the screen -*********/ -void SP_DisplayLogos(void) -{ - if( !Sys_QuickStart() ) - CIN_PlayAllFrames( "logos", 0, 0, 640, 480, 0, true ); -} - -/********* -SP_DrawTexture -*********/ -void SP_DrawTexture(void* pixels, float width, float height, float vShift) -{ - if (!pixels) - { - // Ug. We were not even able to load the error message texture. - return; - } - - // Create a texture from the buffered file - GLuint texid; - qglGenTextures(1, &texid); - qglBindTexture(GL_TEXTURE_2D, texid); - qglTexImage2D(GL_TEXTURE_2D, 0, GL_DDS1_EXT, width, height, 0, GL_DDS1_EXT, GL_UNSIGNED_BYTE, pixels); - - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP ); - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP ); - - // Reset every GL state we've got. Who knows what state - // the renderer could be in when this function gets called. - qglColor3f(1.f, 1.f, 1.f); - qglViewport(0, 0, 640, 480); - - GLboolean alpha = qglIsEnabled(GL_ALPHA_TEST); - qglDisable(GL_ALPHA_TEST); - - GLboolean blend = qglIsEnabled(GL_BLEND); - qglDisable(GL_BLEND); - - GLboolean cull = qglIsEnabled(GL_CULL_FACE); - qglDisable(GL_CULL_FACE); - - GLboolean depth = qglIsEnabled(GL_DEPTH_TEST); - qglDisable(GL_DEPTH_TEST); - - GLboolean fog = qglIsEnabled(GL_FOG); - qglDisable(GL_FOG); - - GLboolean lighting = qglIsEnabled(GL_LIGHTING); - qglDisable(GL_LIGHTING); - - GLboolean offset = qglIsEnabled(GL_POLYGON_OFFSET_FILL); - qglDisable(GL_POLYGON_OFFSET_FILL); - - GLboolean scissor = qglIsEnabled(GL_SCISSOR_TEST); - qglDisable(GL_SCISSOR_TEST); - - GLboolean stencil = qglIsEnabled(GL_STENCIL_TEST); - qglDisable(GL_STENCIL_TEST); - - GLboolean texture = qglIsEnabled(GL_TEXTURE_2D); - qglEnable(GL_TEXTURE_2D); - - qglMatrixMode(GL_MODELVIEW); - qglLoadIdentity(); - qglMatrixMode(GL_PROJECTION); - qglLoadIdentity(); - qglOrtho(0, 640, 0, 480, 0, 1); - - qglMatrixMode(GL_TEXTURE0); - qglLoadIdentity(); - qglMatrixMode(GL_TEXTURE1); - qglLoadIdentity(); - - qglActiveTextureARB(GL_TEXTURE0_ARB); - qglClientActiveTextureARB(GL_TEXTURE0_ARB); - - memset(&tess, 0, sizeof(tess)); - - // Draw the error message - qglBeginFrame(); - - if (!SP_LicenseDone) - { - // clear the screen if we haven't done the - // license yet... - qglClearColor(0, 0, 0, 1); - qglClear(GL_COLOR_BUFFER_BIT); - } - - float x1 = 320 - width / 2; - float x2 = 320 + width / 2; - float y1 = 240 - height / 2; - float y2 = 240 + height / 2; - - y1 += vShift; - y2 += vShift; - - qglBeginEXT (GL_TRIANGLE_STRIP, 4, 0, 0, 4, 0); - qglTexCoord2f( 0, 0 ); - qglVertex2f(x1, y1); - qglTexCoord2f( 1 , 0 ); - qglVertex2f(x2, y1); - qglTexCoord2f( 0, 1 ); - qglVertex2f(x1, y2); - qglTexCoord2f( 1, 1 ); - qglVertex2f(x2, y2); - qglEnd(); - - qglEndFrame(); - qglFlush(); - - // Restore (most) of the render states we reset - if (alpha) qglEnable(GL_ALPHA_TEST); - else qglDisable(GL_ALPHA_TEST); - - if (blend) qglEnable(GL_BLEND); - else qglDisable(GL_BLEND); - - if (cull) qglEnable(GL_CULL_FACE); - else qglDisable(GL_CULL_FACE); - - if (depth) qglEnable(GL_DEPTH_TEST); - else qglDisable(GL_DEPTH_TEST); - - if (fog) qglEnable(GL_FOG); - else qglDisable(GL_FOG); - - if (lighting) qglEnable(GL_LIGHTING); - else qglDisable(GL_LIGHTING); - - if (offset) qglEnable(GL_POLYGON_OFFSET_FILL); - else qglDisable(GL_POLYGON_OFFSET_FILL); - - if (scissor) qglEnable(GL_SCISSOR_TEST); - else qglDisable(GL_SCISSOR_TEST); - - if (stencil) qglEnable(GL_STENCIL_TEST); - else qglDisable(GL_STENCIL_TEST); - - if (texture) qglEnable(GL_TEXTURE_2D); - else qglDisable(GL_TEXTURE_2D); - - // Kill the texture - qglDeleteTextures(1, &texid); -} - - -/********* -SP_GetLanguageExt - -Retuns the extension for the current language, or -english if the language is unknown. -*********/ -char* SP_GetLanguageExt() -{ - switch(XGetLanguage()) - { - case XC_LANGUAGE_ENGLISH: - return "EN"; - case XC_LANGUAGE_JAPANESE: - return "JA"; - case XC_LANGUAGE_GERMAN: - return "GE"; - case XC_LANGUAGE_SPANISH: - return "SP"; - case XC_LANGUAGE_ITALIAN: - return "IT"; - case XC_LANGUAGE_KOREAN: - return "KO"; - case XC_LANGUAGE_TCHINESE: - return "CH"; - case XC_LANGUAGE_PORTUGUESE: - return "PO"; - default: - return "EN"; - } -} - -/********* -SP_LoadFileWithLanguage - -Loads a screen with the appropriate language -*********/ -void *SP_LoadFileWithLanguage(const char *name) -{ - char fullname[MAX_QPATH]; - void *buffer = NULL; - char *ext; - - // get the language extension - ext = SP_GetLanguageExt(); - - // creat the fullpath name and try to load the texture - sprintf(fullname,"%s_%s." SP_TextureExt,name,ext); - buffer = SP_LoadFile(fullname); - - if (!buffer) - { - sprintf(fullname, "%s." SP_TextureExt, name); - buffer = SP_LoadFile(fullname); - } - - return buffer; -} - -/********* -SP_LoadFile -*********/ -void* SP_LoadFile(const char* name) -{ - wfhandle_t h = WF_Open(name, true, false); - if (h < 0) return NULL; - - if (WF_Seek(0, SEEK_END, h)) - { - WF_Close(h); - return NULL; - } - - int len = WF_Tell(h); - - if (WF_Seek(0, SEEK_SET, h)) - { - WF_Close(h); - return NULL; - } - - void *buf = Z_Malloc(len, TAG_TEMP_WORKSPACE, false, 32); - - if (WF_Read(buf, len, h) != len) - { - Z_Free(buf); - WF_Close(h); - return NULL; - } - - WF_Close(h); - - return buf; -} - -/******** -SP_DoLicense - -Draws the license splash to the screen -*********/ -void SP_DoLicense(void) -{ - if( Sys_QuickStart() ) - return; - - // Load the license screen - void *license; - license = SP_LoadFileWithLanguage("d:\\base\\media\\LicenseScreen"); - - if (license) - { - - for (int c = 0; c < 3; ++c) - { - SP_DrawTexture(license, 1024, 1024, -20.0); - } - Z_Free(license); - } - - SP_LicenseDone = true; -} - diff --git a/code/ui/ui_splash.h b/code/ui/ui_splash.h deleted file mode 100644 index 5b98d6baa4..0000000000 --- a/code/ui/ui_splash.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef __UI_SPLASH_H -#define __UI_SPLASH_H - -void SP_DisplayLogos(void); -void SP_DoLicense(void); -void* SP_LoadFile(const char* name); -void* SP_LoadFileWithLanguage(const char *name); -char* SP_GetLanguageExt(); -void SP_DrawTexture(void* pixels, float width, float height, float vShift); - -#endif diff --git a/code/ui/ui_syscalls.cpp b/code/ui/ui_syscalls.cpp index 804e2194ef..d652b63303 100644 --- a/code/ui/ui_syscalls.cpp +++ b/code/ui/ui_syscalls.cpp @@ -1,24 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// Copyright (C) 1999-2000 Id Software, Inc. -// -// leave this at the top of all UI_xxxx files for PCH reasons... -// + #include "../server/exe_headers.h" #include "ui_local.h" diff --git a/code/win32/AutoVersion.h b/code/win32/AutoVersion.h index 7f972de160..841c109e4b 100644 --- a/code/win32/AutoVersion.h +++ b/code/win32/AutoVersion.h @@ -2,9 +2,8 @@ This file is part of Jedi Academy. Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. Jedi Academy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/code/win32/afxres.h b/code/win32/afxres.h index bc4d941f1d..cb2bee755f 100644 --- a/code/win32/afxres.h +++ b/code/win32/afxres.h @@ -2,9 +2,8 @@ This file is part of Jedi Academy. Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. Jedi Academy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/code/win32/win_gamma.cpp b/code/win32/win_gamma.cpp index a4e3d8e540..f2ef597e10 100644 --- a/code/win32/win_gamma.cpp +++ b/code/win32/win_gamma.cpp @@ -2,9 +2,8 @@ This file is part of Jedi Academy. Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. Jedi Academy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/code/win32/win_glimp.cpp b/code/win32/win_glimp.cpp index f91b5a83d5..af23da6b33 100644 --- a/code/win32/win_glimp.cpp +++ b/code/win32/win_glimp.cpp @@ -2,9 +2,8 @@ This file is part of Jedi Academy. Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. Jedi Academy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/code/win32/win_input.cpp b/code/win32/win_input.cpp index fb17d6341a..f749342423 100644 --- a/code/win32/win_input.cpp +++ b/code/win32/win_input.cpp @@ -2,9 +2,8 @@ This file is part of Jedi Academy. Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. Jedi Academy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/code/win32/win_local.h b/code/win32/win_local.h index 18693af7fa..6ecb8c6dc7 100644 --- a/code/win32/win_local.h +++ b/code/win32/win_local.h @@ -2,9 +2,8 @@ This file is part of Jedi Academy. Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. Jedi Academy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/code/win32/win_main.cpp b/code/win32/win_main.cpp index d29bc549ab..30c7f1d5f2 100644 --- a/code/win32/win_main.cpp +++ b/code/win32/win_main.cpp @@ -2,9 +2,8 @@ This file is part of Jedi Academy. Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. Jedi Academy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -54,98 +53,6 @@ This file is part of Jedi Academy. void Sys_SetBinaryPath(const char *path); char *Sys_BinaryPath(void); -/* -================== -Sys_GetFileTime() -================== -*/ -bool Sys_GetFileTime(LPCSTR psFileName, FILETIME &ft) -{ - bool bSuccess = false; - HANDLE hFile = INVALID_HANDLE_VALUE; - - hFile = CreateFile( psFileName, // LPCTSTR lpFileName, // pointer to name of the file - GENERIC_READ, // DWORD dwDesiredAccess, // access (read-write) mode - FILE_SHARE_READ, // DWORD dwShareMode, // share mode - NULL, // LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes - OPEN_EXISTING, // DWORD dwCreationDisposition, // how to create - FILE_FLAG_NO_BUFFERING,// DWORD dwFlagsAndAttributes, // file attributes - NULL // HANDLE hTemplateFile // handle to file with attributes to - ); - - if (hFile != INVALID_HANDLE_VALUE) - { - if (GetFileTime(hFile, // handle to file - NULL, // LPFILETIME lpCreationTime - NULL, // LPFILETIME lpLastAccessTime - &ft // LPFILETIME lpLastWriteTime - ) - ) - { - bSuccess = true; - } - - CloseHandle(hFile); - } - - return bSuccess; -} - - -/* -================== -Sys_FileOutOfDate -================== -*/ -qboolean Sys_FileOutOfDate( LPCSTR psFinalFileName /* dest */, LPCSTR psDataFileName /* src */ ) -{ - FILETIME ftFinalFile, ftDataFile; - - if (Sys_GetFileTime(psFinalFileName, ftFinalFile) && Sys_GetFileTime(psDataFileName, ftDataFile)) - { - // timer res only accurate to within 2 seconds on FAT, so can't do exact compare... - // - //LONG l = CompareFileTime( &ftFinalFile, &ftDataFile ); - if ( ( abs( long( ftFinalFile.dwLowDateTime - ftDataFile.dwLowDateTime) ) <= 20000000 ) && - ftFinalFile.dwHighDateTime == ftDataFile.dwHighDateTime - ) - { - return false; // file not out of date, ie use it. - } - return true; // flag return code to copy over a replacement version of this file - } - - - // extra error check, report as suspicious if you find a file locally but not out on the net.,. - // - if (com_developer->integer) - { - if (!Sys_GetFileTime(psDataFileName, ftDataFile)) - { - Com_Printf( "Sys_FileOutOfDate: reading %s but it's not on the net!\n", psFinalFileName); - } - } - - return false; -} - -/* -================== -Sys_CopyFile -================== -*/ -qboolean Sys_CopyFile(LPCSTR lpExistingFileName, LPCSTR lpNewFileName, qboolean bOverWrite) -{ - qboolean bOk = qtrue; - if (!CopyFile( lpExistingFileName, lpNewFileName, !bOverWrite ) && bOverWrite) - { - DWORD dwAttrs = GetFileAttributes(lpNewFileName); - SetFileAttributes(lpNewFileName, dwAttrs & ~FILE_ATTRIBUTE_READONLY); - bOk = CopyFile( lpExistingFileName, lpNewFileName, FALSE ); - } - return bOk; -} - /* ================== Sys_LowPhysicalMemory @@ -681,6 +588,23 @@ static HINSTANCE Sys_RetrieveDLL( const char *gamename ) return retVal; } +static const char *GetErrorString( DWORD error ) { + static char buf[MAX_STRING_CHARS]; + buf[0] = '\0'; + + if ( error ) { + LPVOID lpMsgBuf; + DWORD bufLen = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, error, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), (LPTSTR)&lpMsgBuf, 0, NULL ); + if ( bufLen ) { + LPCSTR lpMsgStr = (LPCSTR)lpMsgBuf; + Q_strncpyz( buf, lpMsgStr, min( (size_t)(lpMsgStr + bufLen), sizeof( buf ) ) ); + LocalFree( lpMsgBuf ); + } + } + return buf; +} + /* ================= Sys_GetGameAPI @@ -705,18 +629,15 @@ void *Sys_GetGameAPI (void *parms) game_library = Sys_RetrieveDLL(gamename); if(!game_library) { - char *buf; - - FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &buf, 0, NULL ); - Com_Printf( "LoadLibrary(\"%s\") failed\n", gamename); - Com_Printf( "...reason: '%s'\n", buf ); + Com_Printf( "...reason: '%s'\n", GetErrorString( GetLastError() ) ); Com_Error( ERR_FATAL, "Couldn't load game" ); } GetGameAPI = (void *(*)(void *))GetProcAddress (game_library, "GetGameAPI"); if (!GetGameAPI) { + Com_Printf( "Sys_GetGameAPI: Entry point not found in %s. Failed with system error code 0x%X.\n", gamename, GetLastError() ); Sys_UnloadGame (); return NULL; } @@ -738,6 +659,11 @@ void * Sys_LoadCgame( intptr_t (**entryPoint)(int, ...), intptr_t (*systemcalls) dllEntry = ( void (*)( intptr_t (*)( intptr_t, ... ) ) )GetProcAddress( game_library, "dllEntry" ); *entryPoint = (intptr_t (*)(int,...))GetProcAddress( game_library, "vmMain" ); if ( !*entryPoint || !dllEntry ) { +#ifdef JK2_MODE + Com_Printf( "Sys_LoadCgame: CGame Entry point not found in jk2game" ARCH_STRING DLL_EXT ". Failed with system error code 0x%X.\n", GetLastError() ); +#else + Com_Printf( "Sys_LoadCgame: CGame Entry point not found in jagame" ARCH_STRING DLL_EXT ". Failed with system error code 0x%X.\n", GetLastError() ); +#endif FreeLibrary( game_library ); return NULL; } diff --git a/code/win32/win_qgl.cpp b/code/win32/win_qgl.cpp index d5a3ab4c86..9db88ea0f9 100644 --- a/code/win32/win_qgl.cpp +++ b/code/win32/win_qgl.cpp @@ -2,9 +2,8 @@ This file is part of Jedi Academy. Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. Jedi Academy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/code/win32/win_shared.cpp b/code/win32/win_shared.cpp index db4e9f4268..ca15c6c1c7 100644 --- a/code/win32/win_shared.cpp +++ b/code/win32/win_shared.cpp @@ -2,9 +2,8 @@ This file is part of Jedi Academy. Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. Jedi Academy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/code/win32/win_snd.cpp b/code/win32/win_snd.cpp index 523e52ad74..b7280300cd 100644 --- a/code/win32/win_snd.cpp +++ b/code/win32/win_snd.cpp @@ -2,9 +2,8 @@ This file is part of Jedi Academy. Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. Jedi Academy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/code/win32/win_syscon.cpp b/code/win32/win_syscon.cpp index ad83a83e9f..8e0680dedb 100644 --- a/code/win32/win_syscon.cpp +++ b/code/win32/win_syscon.cpp @@ -2,9 +2,8 @@ This file is part of Jedi Academy. Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. Jedi Academy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/code/win32/win_wndproc.cpp b/code/win32/win_wndproc.cpp index 6184a03117..bbf2f9c149 100644 --- a/code/win32/win_wndproc.cpp +++ b/code/win32/win_wndproc.cpp @@ -2,9 +2,8 @@ This file is part of Jedi Academy. Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. Jedi Academy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -249,6 +248,16 @@ static int MapKey (ulong key, word wParam) extended = (key >> 24) & 1; if(wParam > 0 && wParam <= VK_SCROLL) { + // yeuch, but oh well... + // + if ( wParam >= VK_NUMPAD0 && wParam <= VK_NUMPAD9 ) + { + bool bNumlockOn = !!(GetKeyState( VK_NUMLOCK ) & 1); + if ( bNumlockOn ) + { + wParam = 0x30 + (wParam - VK_NUMPAD0); // convert to standard 0..9 + } + } result = virtualKeyConvert[wParam][extended]; } // Get the unshifted ascii code (if any) diff --git a/codeJK2/cgame/FX_ATSTMain.cpp b/codeJK2/cgame/FX_ATSTMain.cpp index 8664e2f11e..ffeda539dc 100644 --- a/codeJK2/cgame/FX_ATSTMain.cpp +++ b/codeJK2/cgame/FX_ATSTMain.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Bowcaster Weapon diff --git a/codeJK2/cgame/FX_Blaster.cpp b/codeJK2/cgame/FX_Blaster.cpp index 43272bc793..1e2b81419f 100644 --- a/codeJK2/cgame/FX_Blaster.cpp +++ b/codeJK2/cgame/FX_Blaster.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Blaster Weapon #include "cg_local.h" diff --git a/codeJK2/cgame/FX_Bowcaster.cpp b/codeJK2/cgame/FX_Bowcaster.cpp index a68079b6c9..56b65da764 100644 --- a/codeJK2/cgame/FX_Bowcaster.cpp +++ b/codeJK2/cgame/FX_Bowcaster.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Bowcaster Weapon diff --git a/codeJK2/cgame/FX_BryarPistol.cpp b/codeJK2/cgame/FX_BryarPistol.cpp index 1d6ad1b2ad..f1956377bd 100644 --- a/codeJK2/cgame/FX_BryarPistol.cpp +++ b/codeJK2/cgame/FX_BryarPistol.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Bryar Pistol Weapon Effects #include "cg_local.h" diff --git a/codeJK2/cgame/FX_DEMP2.cpp b/codeJK2/cgame/FX_DEMP2.cpp index bc576c2d2e..d0c44789f5 100644 --- a/codeJK2/cgame/FX_DEMP2.cpp +++ b/codeJK2/cgame/FX_DEMP2.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // DEMP2 Weapon diff --git a/codeJK2/cgame/FX_Disruptor.cpp b/codeJK2/cgame/FX_Disruptor.cpp index 6157bdec71..a141bcf025 100644 --- a/codeJK2/cgame/FX_Disruptor.cpp +++ b/codeJK2/cgame/FX_Disruptor.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Disruptor Weapon diff --git a/codeJK2/cgame/FX_Emplaced.cpp b/codeJK2/cgame/FX_Emplaced.cpp index ca26c86c3c..1015036184 100644 --- a/codeJK2/cgame/FX_Emplaced.cpp +++ b/codeJK2/cgame/FX_Emplaced.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Emplaced Weapon diff --git a/codeJK2/cgame/FX_Flechette.cpp b/codeJK2/cgame/FX_Flechette.cpp index 7b7eafa053..7e6e65ed22 100644 --- a/codeJK2/cgame/FX_Flechette.cpp +++ b/codeJK2/cgame/FX_Flechette.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Golan Arms Flechette Weapon diff --git a/codeJK2/cgame/FX_HeavyRepeater.cpp b/codeJK2/cgame/FX_HeavyRepeater.cpp index b8bbeec100..46683d3a1a 100644 --- a/codeJK2/cgame/FX_HeavyRepeater.cpp +++ b/codeJK2/cgame/FX_HeavyRepeater.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Heavy Repeater Weapon #include "cg_local.h" diff --git a/codeJK2/cgame/FX_RocketLauncher.cpp b/codeJK2/cgame/FX_RocketLauncher.cpp index 09c9be4291..a938857376 100644 --- a/codeJK2/cgame/FX_RocketLauncher.cpp +++ b/codeJK2/cgame/FX_RocketLauncher.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Rocket Launcher Weapon diff --git a/codeJK2/cgame/FxPrimitives.cpp b/codeJK2/cgame/FxPrimitives.cpp index fd48c3ac43..4b275ce636 100644 --- a/codeJK2/cgame/FxPrimitives.cpp +++ b/codeJK2/cgame/FxPrimitives.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #if !defined(FX_SCHEDULER_H_INC) #include "FxScheduler.h" @@ -49,7 +53,7 @@ void ClampVec( vec3_t dat, byte *res ) } res[i] = (unsigned char)r; - } + } } void GetOrigin( int clientID, vec3_t org ) @@ -166,14 +170,14 @@ bool CParticle::Update() return false; } - vec3_t dir, org; + vec3_t dir, org = { 0.0f }; vec3_t realVel, realAccel; float time = (theFxHelper.mTime - mTimeStart) * 0.001f; // Get our current position and direction GetOrigin( mClientID, org ); GetDir( mClientID, dir ); - + vec3_t ang, ax[3]; vectoangles( dir, ang ); @@ -203,7 +207,7 @@ bool CParticle::Update() // Now move us to where we should be at the given time VectorMA( org, time, realVel, mOrigin1 ); - + } else if (( mTimeStart < theFxHelper.mTime ) && UpdateOrigin() == false ) { @@ -324,12 +328,12 @@ bool CParticle::UpdateOrigin() void CParticle::UpdateSize() { // completely biased towards start if it doesn't get overridden - float perc1 = 1.0f, perc2 = 1.0f; + float perc1 = 1.0f, perc2 = 1.0f; if ( (mFlags & FX_SIZE_LINEAR) ) - { + { // calculate element biasing - perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) + perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) / (float)(mTimeEnd - mTimeStart); } @@ -337,9 +341,9 @@ void CParticle::UpdateSize() if (( mFlags & FX_SIZE_PARM_MASK ) == FX_SIZE_NONLINEAR ) { if ( theFxHelper.mTime > mSizeParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = 1.0f - (float)(theFxHelper.mTime - mSizeParm) + perc2 = 1.0f - (float)(theFxHelper.mTime - mSizeParm) / (float)(mTimeEnd - mSizeParm); } @@ -349,22 +353,22 @@ void CParticle::UpdateSize() perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } } else if (( mFlags & FX_SIZE_PARM_MASK ) == FX_SIZE_WAVE ) - { + { // wave gen, with parm being the frequency multiplier perc1 = perc1 * (float)cos( (theFxHelper.mTime - mTimeStart) * mSizeParm ); } else if (( mFlags & FX_SIZE_PARM_MASK ) == FX_SIZE_CLAMP ) { if ( theFxHelper.mTime < mSizeParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = (float)(mSizeParm - theFxHelper.mTime) + perc2 = (float)(mSizeParm - theFxHelper.mTime) / (float)(mSizeParm - mTimeStart); } else @@ -373,12 +377,12 @@ void CParticle::UpdateSize() } if ( (mFlags & FX_SIZE_LINEAR) ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } @@ -386,7 +390,7 @@ void CParticle::UpdateSize() // If needed, RAND can coexist with linear and either non-linear or wave. if (( mFlags & FX_SIZE_RAND )) - { + { // Random simply modulates the existing value perc1 = random() * perc1; } @@ -400,13 +404,13 @@ void CParticle::UpdateSize() void CParticle::UpdateRGB() { // completely biased towards start if it doesn't get overridden - float perc1 = 1.0f, perc2 = 1.0f; + float perc1 = 1.0f, perc2 = 1.0f; vec3_t res; if ( (mFlags & FX_RGB_LINEAR) ) - { + { // calculate element biasing - perc1 = 1.0f - (float)( theFxHelper.mTime - mTimeStart ) + perc1 = 1.0f - (float)( theFxHelper.mTime - mTimeStart ) / (float)( mTimeEnd - mTimeStart ); } @@ -414,34 +418,34 @@ void CParticle::UpdateRGB() if (( mFlags & FX_RGB_PARM_MASK ) == FX_RGB_NONLINEAR ) { if ( theFxHelper.mTime > mRGBParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = 1.0f - (float)( theFxHelper.mTime - mRGBParm ) + perc2 = 1.0f - (float)( theFxHelper.mTime - mRGBParm ) / (float)( mTimeEnd - mRGBParm ); } if ( (mFlags & FX_RGB_LINEAR) ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } } else if (( mFlags & FX_RGB_PARM_MASK ) == FX_RGB_WAVE ) - { + { // wave gen, with parm being the frequency multiplier perc1 = perc1 * (float)cos(( theFxHelper.mTime - mTimeStart ) * mRGBParm ); } else if (( mFlags & FX_RGB_PARM_MASK ) == FX_RGB_CLAMP ) { if ( theFxHelper.mTime < mRGBParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = (float)(mRGBParm - theFxHelper.mTime) + perc2 = (float)(mRGBParm - theFxHelper.mTime) / (float)(mRGBParm - mTimeStart); } else @@ -450,12 +454,12 @@ void CParticle::UpdateRGB() } if (( mFlags & FX_RGB_LINEAR )) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } @@ -463,12 +467,12 @@ void CParticle::UpdateRGB() // If needed, RAND can coexist with linear and either non-linear or wave. if (( mFlags & FX_RGB_RAND )) - { + { // Random simply modulates the existing value perc1 = random() * perc1; } - // Now get the correct color + // Now get the correct color VectorScale( mRGBStart, perc1, res ); VectorMA( res, (1.0f - perc1), mRGBEnd, mRefEnt.angles ); // angles is a temp storage, will get clamped to a byte in the UpdateAlpha section } @@ -483,9 +487,9 @@ void CParticle::UpdateAlpha() float perc1 = 1.0f, perc2 = 1.0f; if ( mFlags & FX_ALPHA_LINEAR ) - { + { // calculate element biasing - perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) + perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) / (float)(mTimeEnd - mTimeStart); } @@ -493,34 +497,34 @@ void CParticle::UpdateAlpha() if (( mFlags & FX_ALPHA_PARM_MASK ) == FX_ALPHA_NONLINEAR ) { if ( theFxHelper.mTime > mAlphaParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = 1.0f - (float)(theFxHelper.mTime - mAlphaParm) + perc2 = 1.0f - (float)(theFxHelper.mTime - mAlphaParm) / (float)(mTimeEnd - mAlphaParm); } if ( mFlags & FX_ALPHA_LINEAR ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } } else if (( mFlags & FX_ALPHA_PARM_MASK ) == FX_ALPHA_WAVE ) - { + { // wave gen, with parm being the frequency multiplier perc1 = perc1 * (float)cos( (theFxHelper.mTime - mTimeStart) * mAlphaParm ); } else if (( mFlags & FX_ALPHA_PARM_MASK ) == FX_ALPHA_CLAMP ) { if ( theFxHelper.mTime < mAlphaParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = (float)(mAlphaParm - theFxHelper.mTime) + perc2 = (float)(mAlphaParm - theFxHelper.mTime) / (float)(mAlphaParm - mTimeStart); } else @@ -529,12 +533,12 @@ void CParticle::UpdateAlpha() } if ( mFlags & FX_ALPHA_LINEAR ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } @@ -554,7 +558,7 @@ void CParticle::UpdateAlpha() // If needed, RAND can coexist with linear and either non-linear or wave. if ( (mFlags & FX_ALPHA_RAND) ) - { + { // Random simply modulates the existing value perc1 = random() * perc1; } @@ -633,7 +637,7 @@ bool COrientedParticle::Update() { return false; } - + if (( mTimeStart < theFxHelper.mTime ) && UpdateOrigin() == false ) { // we are marked for death @@ -686,7 +690,7 @@ bool CLine::Update() { return false; } - + if ( mFlags & FX_RELATIVE ) { if ( mClientID < 0 || mClientID >= ENTITYNUM_WORLD ) @@ -695,7 +699,7 @@ bool CLine::Update() return false; } - vec3_t dir, end; + vec3_t dir = { 0.0f }, end; trace_t trace; // Get our current position and direction @@ -748,7 +752,7 @@ void CElectricity::Initialize() if ( mFlags & FX_BRANCH ) { - mRefEnt.renderfx |= RF_FORKED; + mRefEnt.renderfx |= RF_FORKED; } if ( mFlags & FX_TAPER ) @@ -784,7 +788,7 @@ bool CElectricity::Update() { return false; } - + UpdateSize(); UpdateRGB(); UpdateAlpha(); @@ -841,7 +845,7 @@ bool CTail::Update() { return false; } - + if ( !fx_freeze.integer ) { VectorCopy( mOrigin1, mOldOrigin ); @@ -855,7 +859,7 @@ bool CTail::Update() return false; } - vec3_t dir, org; + vec3_t dir, org = { 0.0f }; // vec3_t right, up; vec3_t realVel, realAccel; @@ -916,12 +920,12 @@ bool CTail::Update() void CTail::UpdateLength() { // completely biased towards start if it doesn't get overridden - float perc1 = 1.0f, perc2 = 1.0f; + float perc1 = 1.0f, perc2 = 1.0f; if ( mFlags & FX_LENGTH_LINEAR ) - { + { // calculate element biasing - perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) + perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) / (float)(mTimeEnd - mTimeStart); } @@ -929,34 +933,34 @@ void CTail::UpdateLength() if (( mFlags & FX_LENGTH_PARM_MASK ) == FX_LENGTH_NONLINEAR ) { if ( theFxHelper.mTime > mLengthParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = 1.0f - (float)(theFxHelper.mTime - mLengthParm) + perc2 = 1.0f - (float)(theFxHelper.mTime - mLengthParm) / (float)(mTimeEnd - mLengthParm); } if ( mFlags & FX_LENGTH_LINEAR ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } } else if (( mFlags & FX_LENGTH_PARM_MASK ) == FX_LENGTH_WAVE ) - { + { // wave gen, with parm being the frequency multiplier perc1 = perc1 * (float)cos( (theFxHelper.mTime - mTimeStart) * mLengthParm ); } else if (( mFlags & FX_LENGTH_PARM_MASK ) == FX_LENGTH_CLAMP ) { if ( theFxHelper.mTime < mLengthParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = (float)(mLengthParm - theFxHelper.mTime) + perc2 = (float)(mLengthParm - theFxHelper.mTime) / (float)(mLengthParm - mTimeStart); } else @@ -965,12 +969,12 @@ void CTail::UpdateLength() } if ( mFlags & FX_LENGTH_LINEAR ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } @@ -978,7 +982,7 @@ void CTail::UpdateLength() // If needed, RAND can coexist with linear and either non-linear or wave. if ( mFlags & FX_LENGTH_RAND ) - { + { // Random simply modulates the existing value perc1 = random() * perc1; } @@ -1028,12 +1032,12 @@ void CCylinder::Draw() void CCylinder::UpdateSize2() { // completely biased towards start if it doesn't get overridden - float perc1 = 1.0f, perc2 = 1.0f; + float perc1 = 1.0f, perc2 = 1.0f; if ( mFlags & FX_SIZE2_LINEAR ) - { + { // calculate element biasing - perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) + perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) / (float)(mTimeEnd - mTimeStart); } @@ -1041,34 +1045,34 @@ void CCylinder::UpdateSize2() if (( mFlags & FX_SIZE2_PARM_MASK ) == FX_SIZE2_NONLINEAR ) { if ( theFxHelper.mTime > mSize2Parm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = 1.0f - (float)(theFxHelper.mTime - mSize2Parm) + perc2 = 1.0f - (float)(theFxHelper.mTime - mSize2Parm) / (float)(mTimeEnd - mSize2Parm); } if ( (mFlags & FX_SIZE2_LINEAR) ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } } else if (( mFlags & FX_SIZE2_PARM_MASK ) == FX_SIZE2_WAVE ) - { + { // wave gen, with parm being the frequency multiplier perc1 = perc1 * (float)cos( (theFxHelper.mTime - mTimeStart) * mSize2Parm ); } else if (( mFlags & FX_SIZE2_PARM_MASK ) == FX_SIZE2_CLAMP ) { if ( theFxHelper.mTime < mSize2Parm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = (float)(mSize2Parm - theFxHelper.mTime) + perc2 = (float)(mSize2Parm - theFxHelper.mTime) / (float)(mSize2Parm - mTimeStart); } else @@ -1077,12 +1081,12 @@ void CCylinder::UpdateSize2() } if ( mFlags & FX_SIZE2_LINEAR ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } @@ -1090,7 +1094,7 @@ void CCylinder::UpdateSize2() // If needed, RAND can coexist with linear and either non-linear or wave. if ( mFlags & FX_SIZE2_RAND ) - { + { // Random simply modulates the existing value perc1 = random() * perc1; } @@ -1106,7 +1110,7 @@ bool CCylinder::Update() { return false; } - + UpdateSize(); UpdateSize2(); UpdateLength(); @@ -1151,7 +1155,7 @@ void CEmitter::Draw() if ( mFlags & FX_EMIT_FX ) { vec3_t org, v; - float ftime, time2, + float ftime, time2, step; int i, t, dif; @@ -1163,7 +1167,7 @@ void CEmitter::Draw() dif = 0; - for ( t = mOldTime; t <= theFxHelper.mTime; t += TRAIL_RATE ) + for ( t = mOldTime; t <= theFxHelper.mTime; t += TRAIL_RATE ) { dif += TRAIL_RATE; @@ -1175,11 +1179,11 @@ void CEmitter::Draw() time2 = ftime * ftime * 0.5f; // Predict the new position - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { org[i] = mOldOrigin[i] + ftime * v[i] + time2 * v[i]; } - + // Only perform physics if this object is tagged to do so if ( (mFlags & FX_APPLY_PHYSICS) ) { @@ -1218,7 +1222,7 @@ void CEmitter::Draw() // Is it time to draw an effect? if ( DistanceSquared( org, mOldOrigin ) >= step ) - { + { // Pick a new target step distance and square it step = mDensity + crandom() * mVariance; step *= step; @@ -1245,7 +1249,7 @@ bool CEmitter::Update() { return false; } - + // Use this to track if we've stopped moving VectorCopy( mOrigin1, mOldOrigin ); VectorCopy( mVel, mOldVelocity ); @@ -1296,7 +1300,7 @@ bool CLight::Update() { return false; } - + UpdateSize(); UpdateRGB(); @@ -1311,12 +1315,12 @@ bool CLight::Update() void CLight::UpdateSize() { // completely biased towards start if it doesn't get overridden - float perc1 = 1.0f, perc2 = 1.0f; + float perc1 = 1.0f, perc2 = 1.0f; if ( mFlags & FX_SIZE_LINEAR ) - { + { // calculate element biasing - perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) + perc1 = 1.0f - (float)(theFxHelper.mTime - mTimeStart) / (float)(mTimeEnd - mTimeStart); } @@ -1324,34 +1328,34 @@ void CLight::UpdateSize() if (( mFlags & FX_SIZE_PARM_MASK ) == FX_SIZE_NONLINEAR ) { if ( theFxHelper.mTime > mSizeParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = 1.0f - (float)(theFxHelper.mTime - mSizeParm) + perc2 = 1.0f - (float)(theFxHelper.mTime - mSizeParm) / (float)(mTimeEnd - mSizeParm); } if ( (mFlags & FX_SIZE_LINEAR) ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } } else if (( mFlags & FX_SIZE_PARM_MASK ) == FX_SIZE_WAVE ) - { + { // wave gen, with parm being the frequency multiplier perc1 = perc1 * (float)cos( (theFxHelper.mTime - mTimeStart) * mSizeParm ); } else if (( mFlags & FX_SIZE_PARM_MASK ) == FX_SIZE_CLAMP ) { if ( theFxHelper.mTime < mSizeParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = (float)(mSizeParm - theFxHelper.mTime) + perc2 = (float)(mSizeParm - theFxHelper.mTime) / (float)(mSizeParm - mTimeStart); } else @@ -1360,12 +1364,12 @@ void CLight::UpdateSize() } if ( mFlags & FX_SIZE_LINEAR ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } @@ -1373,7 +1377,7 @@ void CLight::UpdateSize() // If needed, RAND can coexist with linear and either non-linear or wave. if ( mFlags & FX_SIZE_RAND ) - { + { // Random simply modulates the existing value perc1 = random() * perc1; } @@ -1387,13 +1391,13 @@ void CLight::UpdateSize() void CLight::UpdateRGB() { // completely biased towards start if it doesn't get overridden - float perc1 = 1.0f, perc2 = 1.0f; + float perc1 = 1.0f, perc2 = 1.0f; vec3_t res; if ( mFlags & FX_RGB_LINEAR ) - { + { // calculate element biasing - perc1 = 1.0f - (float)( theFxHelper.mTime - mTimeStart ) + perc1 = 1.0f - (float)( theFxHelper.mTime - mTimeStart ) / (float)( mTimeEnd - mTimeStart ); } @@ -1401,34 +1405,34 @@ void CLight::UpdateRGB() if (( mFlags & FX_RGB_PARM_MASK ) == FX_RGB_NONLINEAR ) { if ( theFxHelper.mTime > mRGBParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = 1.0f - (float)( theFxHelper.mTime - mRGBParm ) + perc2 = 1.0f - (float)( theFxHelper.mTime - mRGBParm ) / (float)( mTimeEnd - mRGBParm ); } if ( mFlags & FX_RGB_LINEAR ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } } else if (( mFlags & FX_RGB_PARM_MASK ) == FX_RGB_WAVE ) - { + { // wave gen, with parm being the frequency multiplier perc1 = perc1 * (float)cos(( theFxHelper.mTime - mTimeStart ) * mRGBParm ); } else if (( mFlags & FX_RGB_PARM_MASK ) == FX_RGB_CLAMP ) { if ( theFxHelper.mTime < mRGBParm ) - { + { // get percent done, using parm as the start of the non-linear fade - perc2 = (float)(mRGBParm - theFxHelper.mTime) + perc2 = (float)(mRGBParm - theFxHelper.mTime) / (float)(mRGBParm - mTimeStart); } else @@ -1437,12 +1441,12 @@ void CLight::UpdateRGB() } if ( mFlags & FX_RGB_LINEAR ) - { + { // do an even blend perc1 = perc1 * 0.5f + perc2 * 0.5f; } else - { + { // just copy it over...sigh perc1 = perc2; } @@ -1450,12 +1454,12 @@ void CLight::UpdateRGB() // If needed, RAND can coexist with linear and either non-linear or wave. if ( mFlags & FX_RGB_RAND ) - { + { // Random simply modulates the existing value perc1 = random() * perc1; } - // Now get the correct color + // Now get the correct color VectorScale( mRGBStart, perc1, res ); mRefEnt.lightingOrigin[0] = res[0] + ( 1.0f - perc1 ) * mRGBEnd[0]; @@ -1559,7 +1563,7 @@ bool CTrail::Update() { return false; } - + float perc = (float)(mTimeEnd - theFxHelper.mTime) / (float)(mTimeEnd - mTimeStart); for ( int t = 0; t < 4; t++ ) @@ -1659,7 +1663,7 @@ void CPoly::CalcRotateMatrix() /*Pitch - aroundx Yaw - around z 1 0 0 c -s 0 -0 c -s s c 0 +0 c -s s c 0 0 s c 0 0 1 */ mRot[0][0] = cosZ; @@ -1676,7 +1680,7 @@ void CPoly::CalcRotateMatrix() Roll c 0 s - 0 1 0 + 0 1 0 -s 0 c */ mLastFrameTime = theFxHelper.mFrameTime; @@ -1707,8 +1711,8 @@ void CPoly::Rotate() //---------------------------- bool CPoly::Update() { - vec3_t mOldOrigin; - + vec3_t mOldOrigin = { 0.0f }; + // Game pausing can cause dumb time things to happen, so kill the effect in this instance if ( mTimeStart > theFxHelper.mTime ) { @@ -1795,7 +1799,7 @@ bool CBezier::Update( void ) ftime = cg.frametime * 0.001f; time2 = ftime * ftime * 0.5f; - for ( int i = 0; i < 3; i++ ) + for ( int i = 0; i < 3; i++ ) { mControl1[i] = mControl1[i] + ftime * mControl1Vel[i] + time2 * mControl1Vel[i]; mControl2[i] = mControl2[i] + ftime * mControl2Vel[i] + time2 * mControl2Vel[i]; @@ -1891,7 +1895,7 @@ inline void CBezier::DrawSegment( vec3_t start, vec3_t end, float texcoord1, flo const float BEZIER_RESOLUTION = 16.0f; //---------------------------- -void CBezier::Draw( void ) +void CBezier::Draw( void ) { vec3_t pos, old_pos; float mu, mum1; @@ -1926,7 +1930,7 @@ void CBezier::Draw( void ) pos[i] = mum13 * mOrigin1[i] + group1 * mControl1[i] + group2 * mControl2[i] + mu3 * mOrigin2[i]; } -// if ( m_flags & FXF_WRAP ) +// if ( m_flags & FXF_WRAP ) // { tc2 = mu * tex; // } @@ -1992,7 +1996,7 @@ void CFlash::Init( void ) } //---------------------------- -void CFlash::Draw( void ) +void CFlash::Draw( void ) { // Interestingly, if znear is set > than this, then the flash // doesn't appear at all. @@ -2011,14 +2015,14 @@ void CFlash::Draw( void ) mRefEnt.lightingOrigin[i] = 0.0f; } } - mRefEnt.shaderRGBA[0] = mRefEnt.lightingOrigin[0] * 255; - mRefEnt.shaderRGBA[1] = mRefEnt.lightingOrigin[1] * 255; - mRefEnt.shaderRGBA[2] = mRefEnt.lightingOrigin[2] * 255; + mRefEnt.shaderRGBA[0] = mRefEnt.lightingOrigin[0] * 255; + mRefEnt.shaderRGBA[1] = mRefEnt.lightingOrigin[1] * 255; + mRefEnt.shaderRGBA[2] = mRefEnt.lightingOrigin[2] * 255; mRefEnt.shaderRGBA[3] = 255; VectorCopy( cg.refdef.vieworg, mRefEnt.origin ); VectorMA( mRefEnt.origin, FLASH_DISTANCE_FROM_VIEWER, cg.refdef.viewaxis[0], mRefEnt.origin ); - + // This is assuming that the screen is wider than it is tall. mRefEnt.radius = FLASH_DISTANCE_FROM_VIEWER * tan (DEG2RAD (cg.refdef.fov_x * 0.5f)); diff --git a/codeJK2/cgame/FxPrimitives.h b/codeJK2/cgame/FxPrimitives.h index 03aeb17127..b81fe3e9fb 100644 --- a/codeJK2/cgame/FxPrimitives.h +++ b/codeJK2/cgame/FxPrimitives.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #if !defined(FX_SYSTEM_H_INC) #include "FxSystem.h" diff --git a/codeJK2/cgame/FxScheduler.cpp b/codeJK2/cgame/FxScheduler.cpp index b87e79d3f1..73fb075161 100644 --- a/codeJK2/cgame/FxScheduler.cpp +++ b/codeJK2/cgame/FxScheduler.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #if !defined(FX_SCHEDULER_H_INC) #include "FxScheduler.h" @@ -46,7 +50,7 @@ void CMediaHandles::operator=(const CMediaHandles &that ) { mMediaList.clear(); - for ( int i = 0; i < that.mMediaList.size(); i++ ) + for ( size_t i = 0; i < that.mMediaList.size(); i++ ) { mMediaList.push_back( that.mMediaList[i] ); } @@ -54,7 +58,7 @@ void CMediaHandles::operator=(const CMediaHandles &that ) //------------------------------------------------------ CFxScheduler::CFxScheduler() -{ +{ memset( &mEffectTemplates, 0, sizeof( mEffectTemplates )); } @@ -123,7 +127,7 @@ void CFxScheduler::Clean(bool bRemoveTemplates /*= true*/, int idToPreserve /*= { delete mEffectTemplates[i].mPrimitives[j]; } - } + } mEffectTemplates[i].mInUse = false; } @@ -157,7 +161,7 @@ void CFxScheduler::Clean(bool bRemoveTemplates /*= true*/, int idToPreserve /*= //------------------------------------------------------ // RegisterEffect -// Attempt to open the specified effect file, if +// Attempt to open the specified effect file, if // file read succeeds, parse the file. // // Input: @@ -200,7 +204,7 @@ int CFxScheduler::RegisterEffect( const char *file, bool bHasCorrectPath /*= fal // see if the specified file is already registered. If it is, just return the id of that file TEffectID::iterator itr; - + itr = mEffectIDs.find( sfile ); if ( itr != mEffectIDs.end() ) @@ -243,7 +247,7 @@ int CFxScheduler::RegisterEffect( const char *file, bool bHasCorrectPath /*= fal } // If we'll overflow our buffer, bail out--not a particularly elegant solution - if (len >= sizeof(data) - 1 ) + if (len >= (int)sizeof(data) - 1 ) { theFxHelper.CloseFile( fh ); return 0; @@ -266,7 +270,7 @@ int CFxScheduler::RegisterEffect( const char *file, bool bHasCorrectPath /*= fal //------------------------------------------------------ // ParseEffect -// Starts at ground zero, using each group header to +// Starts at ground zero, using each group header to // determine which kind of effect we are working with. // Then we call the appropriate function to parse the // specified effect group. @@ -347,7 +351,7 @@ int CFxScheduler::ParseEffect( const char *file, CGPGroup *base ) //------------------------------------------------------ // AddPrimitiveToEffect // Takes a primitive and attaches it to the effect. -// +// // Input: // Effect template that we tack the primitive on to // Primitive to add to the effect template @@ -374,9 +378,9 @@ void CFxScheduler::AddPrimitiveToEffect( SEffectTemplate *fx, CPrimitiveTemplate // GetNewEffectTemplate // Finds an unused effect template and returns it to the // caller. -// +// // Input: -// pointer to an id that will be filled in, +// pointer to an id that will be filled in, // file name-- should be NULL when requesting a copy // // Return: @@ -417,7 +421,7 @@ SEffectTemplate *CFxScheduler::GetNewEffectTemplate( int *id, const char *file ) // GetEffectCopy // Returns a copy of the desired effect so that it can // easily be modified run-time. -// +// // Input: // file-- the name of the effect file that you want a copy of // newHandle-- will actually be the returned handle to the new effect @@ -435,7 +439,7 @@ SEffectTemplate *CFxScheduler::GetEffectCopy( const char *file, int *newHandle ) // GetEffectCopy // Returns a copy of the desired effect so that it can // easily be modified run-time. -// +// // Input: // fxHandle-- the handle to the effect that you want a copy of // newHandle-- will actually be the returned handle to the new effect @@ -482,7 +486,7 @@ SEffectTemplate *CFxScheduler::GetEffectCopy( int fxHandle, int *newHandle ) //------------------------------------------------------ // GetPrimitiveCopy // Helper function that returns a copy of the desired primitive -// +// // Input: // fxHandle - the pointer to the effect copy you want to override // componentName - name of the component to find @@ -499,7 +503,7 @@ CPrimitiveTemplate *CFxScheduler::GetPrimitiveCopy( SEffectTemplate *effectCopy, for ( int i = 0; i < effectCopy->mPrimitiveCount; i++ ) { - if ( !stricmp( effectCopy->mPrimitives[i]->mName, componentName )) + if ( !Q_stricmp( effectCopy->mPrimitives[i]->mName, componentName )) { // we found a match, so return it return effectCopy->mPrimitives[i]; @@ -524,7 +528,7 @@ static void ReportPlayEffectError(int id) // Handles scheduling an effect so all the components // happen at the specified time. Applies a default up // axis. -// +// // Input: // Effect file id and the origin // @@ -547,7 +551,7 @@ void CFxScheduler::PlayEffect( int id, vec3_t origin ) // Handles scheduling an effect so all the components // happen at the specified time. Takes a fwd vector // and builds a right and up vector -// +// // Input: // Effect file id, the origin, and a fwd vector // @@ -569,7 +573,7 @@ void CFxScheduler::PlayEffect( int id, vec3_t origin, vec3_t forward ) // PlayEffect // Handles scheduling an effect so all the components // happen at the specified time. Uses the specified axis -// +// // Input: // Effect file name, the origin, and axis. // Optional boltInfo (defaults to -1) @@ -596,7 +600,7 @@ void CFxScheduler::PlayEffect( const char *file, vec3_t origin, vec3_t axis[3], #ifndef FINAL_BUILD if ( mEffectIDs[sfile] == 0 ) { - theFxHelper.Print( "CFxScheduler::PlayEffect unregistered/non-existent effect: %s\n", sfile ); + theFxHelper.Print( "CFxScheduler::PlayEffect unregistered/non-existent effect: %s\n", sfile ); } #endif @@ -607,7 +611,7 @@ void CFxScheduler::PlayEffect( const char *file, vec3_t origin, vec3_t axis[3], // PlayEffect // Handles scheduling an effect so all the components // happen at the specified time. Uses the specified axis -// +// // Input: // Effect file name, the origin, and axis. // Optional boltInfo (defaults to -1) @@ -628,7 +632,7 @@ void CFxScheduler::PlayEffect( const char *file, int clientID ) #ifndef FINAL_BUILD if ( id == 0 ) { - theFxHelper.Print( "CFxScheduler::PlayEffect unregistered/non-existent effect: %s\n", file ); + theFxHelper.Print( "CFxScheduler::PlayEffect unregistered/non-existent effect: %s\n", file ); } #endif @@ -647,7 +651,7 @@ void CFxScheduler::PlayEffect( const char *file, int clientID ) } // Don't bother scheduling the effect if the system is currently frozen - + // Get the effect. fx = &mEffectTemplates[id]; @@ -713,9 +717,9 @@ void CFxScheduler::PlayEffect( const char *file, int clientID ) // CreateEffect // Creates the specified fx taking into account the // multitude of different ways it could be spawned. -// +// // Input: -// template used to build the effect, desired effect origin, +// template used to build the effect, desired effect origin, // desired orientation and how late the effect is so that // it can be moved to the correct spot // @@ -782,7 +786,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, int clientID, int delay case Line: //--------- - FX_AddLine( clientID, org, + FX_AddLine( clientID, org, fx->mSizeStart.GetVal(), fx->mSizeEnd.GetVal(), fx->mSizeParm.GetVal(), fx->mAlphaStart.GetVal(), fx->mAlphaEnd.GetVal(), fx->mAlphaParm.GetVal(), sRGB, eRGB, fx->mRGBParm.GetVal(), @@ -798,7 +802,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, int clientID, int delay fx->mLengthStart.GetVal(), fx->mLengthEnd.GetVal(), fx->mLengthParm.GetVal(), fx->mAlphaStart.GetVal(), fx->mAlphaEnd.GetVal(), fx->mAlphaParm.GetVal(), sRGB, eRGB, fx->mRGBParm.GetVal(), - fx->mMin, fx->mMax, fx->mElasticity.GetVal(), + fx->mMin, fx->mMax, fx->mElasticity.GetVal(), fx->mDeathFxHandles.GetHandle(), fx->mImpactFxHandles.GetHandle(), fx->mLife.GetVal(), fx->mMediaHandles.GetHandle(), flags ); break; @@ -816,7 +820,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, int clientID, int delay case Light: //--------- - // don't much care if the light stays bolted...so just add it. + // don't much care if the light stays bolted...so just add it. if ( clientID >= 0 && clientID < ENTITYNUM_WORLD ) { // ..um, ok..... @@ -867,7 +871,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, int clientID, int delay // PlayEffect // Handles scheduling an effect so all the components // happen at the specified time. Uses the specified axis -// +// // Input: // Effect id, the origin, and axis. // Optional boltInfo (defaults to -1) @@ -1037,7 +1041,7 @@ void CFxScheduler::PlayEffect( int id, vec3_t origin, vec3_t axis[3], const int // Handles scheduling an effect so all the components // happen at the specified time. Applies a default up // axis. -// +// // Input: // Effect file name and the origin // @@ -1056,7 +1060,7 @@ void CFxScheduler::PlayEffect( const char *file, vec3_t origin ) #ifndef FINAL_BUILD if ( mEffectIDs[sfile] == 0 ) { - theFxHelper.Print( "CFxScheduler::PlayEffect unregistered/non-existent effect: %s\n", file ); + theFxHelper.Print( "CFxScheduler::PlayEffect unregistered/non-existent effect: %s\n", file ); } #endif } @@ -1066,7 +1070,7 @@ void CFxScheduler::PlayEffect( const char *file, vec3_t origin ) // Handles scheduling an effect so all the components // happen at the specified time. Takes a forward vector // and uses this to complete the axis field. -// +// // Input: // Effect file name, the origin, and a forward vector // @@ -1085,7 +1089,7 @@ void CFxScheduler::PlayEffect( const char *file, vec3_t origin, vec3_t forward ) #ifndef FINAL_BUILD if ( mEffectIDs[sfile] == 0 ) { - theFxHelper.Print( "CFxScheduler::PlayEffect unregistered/non-existent effect: %s\n", file ); + theFxHelper.Print( "CFxScheduler::PlayEffect unregistered/non-existent effect: %s\n", file ); } #endif } @@ -1095,7 +1099,7 @@ void CFxScheduler::PlayEffect( const char *file, vec3_t origin, vec3_t forward ) // Handles determining if a scheduled effect should // be created or not. If it should it handles converting // the template effect into a real one. -// +// // Input: // none // @@ -1121,7 +1125,7 @@ void CFxScheduler::AddScheduledEffects( void ) { if ( (*itr)->mClientID >= 0 ) { - CreateEffect( (*itr)->mpTemplate, (*itr)->mClientID, + CreateEffect( (*itr)->mpTemplate, (*itr)->mClientID, theFxHelper.mTime - (*itr)->mStartTime ); } else if ((*itr)->mBoltNum == -1) @@ -1129,20 +1133,20 @@ void CFxScheduler::AddScheduledEffects( void ) if ( (*itr)->mEntNum != -1 ) { // Find out where the entity currently is - CreateEffect( (*itr)->mpTemplate, - cg_entities[(*itr)->mEntNum].lerpOrigin, (*itr)->mAxis, + CreateEffect( (*itr)->mpTemplate, + cg_entities[(*itr)->mEntNum].lerpOrigin, (*itr)->mAxis, theFxHelper.mTime - (*itr)->mStartTime ); } else { - CreateEffect( (*itr)->mpTemplate, - (*itr)->mOrigin, (*itr)->mAxis, + CreateEffect( (*itr)->mpTemplate, + (*itr)->mOrigin, (*itr)->mAxis, theFxHelper.mTime - (*itr)->mStartTime ); } } else { - + mdxaBone_t boltMatrix; doesBoltExist=qfalse; @@ -1177,7 +1181,7 @@ void CFxScheduler::AddScheduledEffects( void ) } } } - + oldModelNum = (*itr)->mModelNum; oldEntNum = (*itr)->mEntNum; oldBoltIndex = (*itr)->mBoltNum; @@ -1186,8 +1190,8 @@ void CFxScheduler::AddScheduledEffects( void ) // only do this if we found the bolt if (doesBoltExist) { - CreateEffect( (*itr)->mpTemplate, - origin, axis, + CreateEffect( (*itr)->mpTemplate, + origin, axis, theFxHelper.mTime - (*itr)->mStartTime ); } } @@ -1208,9 +1212,9 @@ void CFxScheduler::AddScheduledEffects( void ) // CreateEffect // Creates the specified fx taking into account the // multitude of different ways it could be spawned. -// +// // Input: -// template used to build the effect, desired effect origin, +// template used to build the effect, desired effect origin, // desired orientation and how late the effect is so that // it can be moved to the correct spot // @@ -1258,7 +1262,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t a { float x, y; float width, height; - + x = DEG2RAD( random() * 360.0f ); y = DEG2RAD( random() * 180.0f ); @@ -1270,7 +1274,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t a VectorAdd( org, temp, org ); if ( fx->mSpawnFlags & FX_AXIS_FROM_SPHERE ) - { + { // well, we will now override the axis at the users request VectorNormalize2( temp, ax[0] ); MakeNormalVectors( ax[0], ax[1], ax[2] ); @@ -1288,7 +1292,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t a VectorAdd( org, temp, org ); if ( fx->mSpawnFlags & FX_AXIS_FROM_SPHERE ) - { + { vec3_t up={0,0,1}; // well, we will now override the axis at the users request @@ -1312,7 +1316,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t a // Velocity calculations //------------------------------------- if ( fx->mSpawnFlags & FX_VEL_IS_ABSOLUTE ) - { + { VectorSet( vel, fx->mVelX.GetVal(), fx->mVelY.GetVal(), fx->mVelZ.GetVal() ); } else @@ -1325,7 +1329,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t a // Acceleration calculations //------------------------------------- if ( fx->mSpawnFlags & FX_ACCEL_IS_ABSOLUTE ) - { + { VectorSet( accel, fx->mAccelX.GetVal(), fx->mAccelY.GetVal(), fx->mAccelZ.GetVal() ); } else @@ -1338,8 +1342,8 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t a // Gravity is completely decoupled from acceleration since it is __always__ absolute // NOTE: I only effect Z ( up/down in the Quake world ) accel[2] += fx->mGravity.GetVal(); - - // There may be a lag between when the effect should be created and when it actually gets created. + + // There may be a lag between when the effect should be created and when it actually gets created. // Since we know what the discrepancy is, we can attempt to compensate... if ( lateTime > 0 ) { @@ -1350,7 +1354,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t a VectorMA( vel, ftime, accel, vel ); // Predict the new position - for ( int i = 0 ; i < 3 ; i++ ) + for ( int i = 0 ; i < 3 ; i++ ) { org[i] = org[i] + ftime * vel[i] + time2 * vel[i]; } @@ -1371,7 +1375,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t a // we also do this pre-trace as opposed to post trace since we may have to render an impact effect // and we will want the normal at the exact endpos... if ( fx->mSpawnFlags & FX_CHEAP_ORG2_CALC ) - { + { VectorSet( org2, fx->mOrigin2X.GetVal(), fx->mOrigin2Y.GetVal(), fx->mOrigin2Z.GetVal() ); VectorAdd( org2, temp, temp ); } @@ -1443,12 +1447,12 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t a case Particle: //--------- - FX_AddParticle( org, vel, accel, + FX_AddParticle( org, vel, accel, fx->mSizeStart.GetVal(), fx->mSizeEnd.GetVal(), fx->mSizeParm.GetVal(), fx->mAlphaStart.GetVal(), fx->mAlphaEnd.GetVal(), fx->mAlphaParm.GetVal(), sRGB, eRGB, fx->mRGBParm.GetVal(), fx->mRotation.GetVal(), fx->mRotationDelta.GetVal(), - fx->mMin, fx->mMax, fx->mElasticity.GetVal(), + fx->mMin, fx->mMax, fx->mElasticity.GetVal(), fx->mDeathFxHandles.GetHandle(), fx->mImpactFxHandles.GetHandle(), fx->mLife.GetVal(), fx->mMediaHandles.GetHandle(), fx->mFlags ); break; @@ -1457,7 +1461,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t a case Line: //--------- - FX_AddLine( org, org2, + FX_AddLine( org, org2, fx->mSizeStart.GetVal(), fx->mSizeEnd.GetVal(), fx->mSizeParm.GetVal(), fx->mAlphaStart.GetVal(), fx->mAlphaEnd.GetVal(), fx->mAlphaParm.GetVal(), sRGB, eRGB, fx->mRGBParm.GetVal(), @@ -1473,7 +1477,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t a fx->mLengthStart.GetVal(), fx->mLengthEnd.GetVal(), fx->mLengthParm.GetVal(), fx->mAlphaStart.GetVal(), fx->mAlphaEnd.GetVal(), fx->mAlphaParm.GetVal(), sRGB, eRGB, fx->mRGBParm.GetVal(), - fx->mMin, fx->mMax, fx->mElasticity.GetVal(), + fx->mMin, fx->mMax, fx->mElasticity.GetVal(), fx->mDeathFxHandles.GetHandle(), fx->mImpactFxHandles.GetHandle(), fx->mLife.GetVal(), fx->mMediaHandles.GetHandle(), fx->mFlags ); break; @@ -1482,7 +1486,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t a case Electricity: //---------------- - FX_AddElectricity( org, org2, + FX_AddElectricity( org, org2, fx->mSizeStart.GetVal(), fx->mSizeEnd.GetVal(), fx->mSizeParm.GetVal(), fx->mAlphaStart.GetVal(), fx->mAlphaEnd.GetVal(), fx->mAlphaParm.GetVal(), sRGB, eRGB, fx->mRGBParm.GetVal(), @@ -1507,17 +1511,17 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t a //--------- // for chunk angles, you don't really need much control over the end result...you just want variation.. - VectorSet( ang, - fx->mAngle1.GetVal(), - fx->mAngle2.GetVal(), + VectorSet( ang, + fx->mAngle1.GetVal(), + fx->mAngle2.GetVal(), fx->mAngle3.GetVal() ); vectoangles( ax[0], temp ); VectorAdd( ang, temp, ang ); - VectorSet( angDelta, - fx->mAngle1Delta.GetVal(), - fx->mAngle2Delta.GetVal(), + VectorSet( angDelta, + fx->mAngle1Delta.GetVal(), + fx->mAngle2Delta.GetVal(), fx->mAngle3Delta.GetVal() ); emitterModel = fx->mMediaHandles.GetHandle(); @@ -1541,8 +1545,8 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t a // I'm calling this function ( at least for now ) because it handles projecting // the decal mark onto the surfaces properly. This is especially important for large marks. // The downside is that it's much less flexible.... - CG_ImpactMark( fx->mMediaHandles.GetHandle(), org, ax[0], fx->mRotation.GetVal(), - sRGB[0], sRGB[1], sRGB[2], fx->mAlphaStart.GetVal(), + CG_ImpactMark( fx->mMediaHandles.GetHandle(), org, ax[0], fx->mRotation.GetVal(), + sRGB[0], sRGB[1], sRGB[2], fx->mAlphaStart.GetVal(), qtrue, fx->mSizeStart.GetVal(), qfalse ); break; @@ -1577,7 +1581,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t a //--------- case FxRunner: //--------- - + PlayEffect( fx->mPlayFxHandles.GetHandle(), org, ax ); break; @@ -1603,7 +1607,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t a case ScreenFlash: //-------------- - FX_AddFlash( org, + FX_AddFlash( org, sRGB, eRGB, fx->mRGBParm.GetVal(), fx->mLife.GetVal(), fx->mMediaHandles.GetHandle(), fx->mFlags ); break; @@ -1622,4 +1626,4 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t a delete fx; } } -} \ No newline at end of file +} diff --git a/codeJK2/cgame/FxScheduler.h b/codeJK2/cgame/FxScheduler.h index 0ce8efd3b8..26bed86d9b 100644 --- a/codeJK2/cgame/FxScheduler.h +++ b/codeJK2/cgame/FxScheduler.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #if !defined(FX_UTIL_H_INC) #include "FxUtil.h" @@ -27,9 +31,6 @@ typedef sstring_t fxString_t; #ifndef FX_SCHEDULER_H_INC #define FX_SCHEDULER_H_INC -using namespace std; - - #define FX_FILE_PATH "effects" #define FX_MAX_TRACE_DIST WORLD_SIZE @@ -366,7 +367,7 @@ struct SEffectTemplate bool operator == (const char * name) const { - return !stricmp( mEffectName, name ); + return !Q_stricmp( mEffectName, name ); } void operator=(const SEffectTemplate &that); }; diff --git a/codeJK2/cgame/FxSystem.cpp b/codeJK2/cgame/FxSystem.cpp index ed12bfbbe4..e9443b33ee 100644 --- a/codeJK2/cgame/FxSystem.cpp +++ b/codeJK2/cgame/FxSystem.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #if !defined(FX_SCHEDULER_H_INC) #include "FxScheduler.h" diff --git a/codeJK2/cgame/FxSystem.h b/codeJK2/cgame/FxSystem.h index d30358f575..e5f35e6598 100644 --- a/codeJK2/cgame/FxSystem.h +++ b/codeJK2/cgame/FxSystem.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #if !defined(CG_LOCAL_H_INC) #include "cg_local.h" diff --git a/codeJK2/cgame/FxTemplate.cpp b/codeJK2/cgame/FxTemplate.cpp index e23153fb9f..4c7ad59622 100644 --- a/codeJK2/cgame/FxTemplate.cpp +++ b/codeJK2/cgame/FxTemplate.cpp @@ -1,21 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #if !defined(FX_SCHEDULER_H_INC) #include "FxScheduler.h" @@ -279,23 +282,23 @@ bool CPrimitiveTemplate::ParseGroupFlags( const char *val, int *flags ) return true; } - if ( !stricmp( flag[i], "linear" )) + if ( !Q_stricmp( flag[i], "linear" )) { *flags |= FX_LINEAR; } - else if ( !stricmp( flag[i], "nonlinear" )) + else if ( !Q_stricmp( flag[i], "nonlinear" )) { *flags |= FX_NONLINEAR; } - else if ( !stricmp( flag[i], "wave" )) + else if ( !Q_stricmp( flag[i], "wave" )) { *flags |= FX_WAVE; } - else if ( !stricmp( flag[i], "random" )) + else if ( !Q_stricmp( flag[i], "random" )) { *flags |= FX_RAND; } - else if ( !stricmp( flag[i], "clamp" )) + else if ( !Q_stricmp( flag[i], "clamp" )) { *flags |= FX_CLAMP; } @@ -699,47 +702,47 @@ bool CPrimitiveTemplate::ParseFlags( const char *val ) return true; } - if ( !stricmp( flag[i], "useModel" )) + if ( !Q_stricmp( flag[i], "useModel" )) { mFlags |= FX_ATTACHED_MODEL; } - else if ( !stricmp( flag[i], "useBBox" )) + else if ( !Q_stricmp( flag[i], "useBBox" )) { mFlags |= FX_USE_BBOX; } - else if ( !stricmp( flag[i], "usePhysics" )) + else if ( !Q_stricmp( flag[i], "usePhysics" )) { mFlags |= FX_APPLY_PHYSICS; } - else if ( !stricmp( flag[i], "expensivePhysics" )) + else if ( !Q_stricmp( flag[i], "expensivePhysics" )) { mFlags |= FX_EXPENSIVE_PHYSICS; } - else if ( !stricmp( flag[i], "impactKills" )) + else if ( !Q_stricmp( flag[i], "impactKills" )) { mFlags |= FX_KILL_ON_IMPACT; } - else if ( !stricmp( flag[i], "impactFx" )) + else if ( !Q_stricmp( flag[i], "impactFx" )) { mFlags |= FX_IMPACT_RUNS_FX; } - else if ( !stricmp( flag[i], "deathFx" )) + else if ( !Q_stricmp( flag[i], "deathFx" )) { mFlags |= FX_DEATH_RUNS_FX; } - else if ( !stricmp( flag[i], "useAlpha" )) + else if ( !Q_stricmp( flag[i], "useAlpha" )) { mFlags |= FX_USE_ALPHA; } - else if ( !stricmp( flag[i], "emitFx" )) + else if ( !Q_stricmp( flag[i], "emitFx" )) { mFlags |= FX_EMIT_FX; } - else if ( !stricmp( flag[i], "depthHack" )) + else if ( !Q_stricmp( flag[i], "depthHack" )) { mFlags |= FX_DEPTH_HACK; } - else if ( !stricmp( flag[i], "setShaderTime" )) + else if ( !Q_stricmp( flag[i], "setShaderTime" )) { mFlags |= FX_SET_SHADER_TIME; } @@ -778,59 +781,59 @@ bool CPrimitiveTemplate::ParseSpawnFlags( const char *val ) return true; } - if ( !stricmp( flag[i], "org2fromTrace" )) + if ( !Q_stricmp( flag[i], "org2fromTrace" )) { mSpawnFlags |= FX_ORG2_FROM_TRACE; } - else if ( !stricmp( flag[i], "traceImpactFx" )) + else if ( !Q_stricmp( flag[i], "traceImpactFx" )) { mSpawnFlags |= FX_TRACE_IMPACT_FX; } - else if ( !stricmp( flag[i], "org2isOffset" )) + else if ( !Q_stricmp( flag[i], "org2isOffset" )) { mSpawnFlags |= FX_ORG2_IS_OFFSET; } - else if ( !stricmp( flag[i], "cheapOrgCalc" )) + else if ( !Q_stricmp( flag[i], "cheapOrgCalc" )) { mSpawnFlags |= FX_CHEAP_ORG_CALC; } - else if ( !stricmp( flag[i], "cheapOrg2Calc" )) + else if ( !Q_stricmp( flag[i], "cheapOrg2Calc" )) { mSpawnFlags |= FX_CHEAP_ORG2_CALC; } - else if ( !stricmp( flag[i], "absoluteVel" )) + else if ( !Q_stricmp( flag[i], "absoluteVel" )) { mSpawnFlags |= FX_VEL_IS_ABSOLUTE; } - else if ( !stricmp( flag[i], "absoluteAccel" )) + else if ( !Q_stricmp( flag[i], "absoluteAccel" )) { mSpawnFlags |= FX_ACCEL_IS_ABSOLUTE; } - else if ( !stricmp( flag[i], "orgOnSphere" )) // sphere/ellipsoid + else if ( !Q_stricmp( flag[i], "orgOnSphere" )) // sphere/ellipsoid { mSpawnFlags |= FX_ORG_ON_SPHERE; } - else if ( !stricmp( flag[i], "orgOnCylinder" )) // cylinder/disk + else if ( !Q_stricmp( flag[i], "orgOnCylinder" )) // cylinder/disk { mSpawnFlags |= FX_ORG_ON_CYLINDER; } - else if ( !stricmp( flag[i], "axisFromSphere" )) + else if ( !Q_stricmp( flag[i], "axisFromSphere" )) { mSpawnFlags |= FX_AXIS_FROM_SPHERE; } - else if ( !stricmp( flag[i], "randrotaroundfwd" )) + else if ( !Q_stricmp( flag[i], "randrotaroundfwd" )) { mSpawnFlags |= FX_RAND_ROT_AROUND_FWD; } - else if ( !stricmp( flag[i], "evenDistribution" )) + else if ( !Q_stricmp( flag[i], "evenDistribution" )) { mSpawnFlags |= FX_EVEN_DISTRIBUTION; } - else if ( !stricmp( flag[i], "rgbComponentInterpolation" )) + else if ( !Q_stricmp( flag[i], "rgbComponentInterpolation" )) { mSpawnFlags |= FX_RGB_COMPONENT_INTERP; } - else if ( !stricmp( flag[i], "lessAttenuation" )) + else if ( !Q_stricmp( flag[i], "lessAttenuation" )) { mSpawnFlags |= FX_SND_LESS_ATTENUATION; } @@ -1878,19 +1881,19 @@ bool CPrimitiveTemplate::ParseRGB( CGPGroup *grp ) val = pairs->GetTopValue(); // Huge stricmp lists suxor - if ( !stricmp( key, "start" )) + if ( !Q_stricmp( key, "start" )) { ParseRGBStart( val ); } - else if ( !stricmp( key, "end" )) + else if ( !Q_stricmp( key, "end" )) { ParseRGBEnd( val ); } - else if ( !stricmp( key, "parm" ) || !stricmp( key, "parms" )) + else if ( !Q_stricmp( key, "parm" ) || !Q_stricmp( key, "parms" )) { ParseRGBParm( val ); } - else if ( !stricmp( key, "flags" ) || !stricmp( key, "flag" )) + else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) { ParseRGBFlags( val ); } @@ -1932,19 +1935,19 @@ bool CPrimitiveTemplate::ParseAlpha( CGPGroup *grp ) val = pairs->GetTopValue(); // Huge stricmp lists suxor - if ( !stricmp( key, "start" )) + if ( !Q_stricmp( key, "start" )) { ParseAlphaStart( val ); } - else if ( !stricmp( key, "end" )) + else if ( !Q_stricmp( key, "end" )) { ParseAlphaEnd( val ); } - else if ( !stricmp( key, "parm" ) || !stricmp( key, "parms" )) + else if ( !Q_stricmp( key, "parm" ) || !Q_stricmp( key, "parms" )) { ParseAlphaParm( val ); } - else if ( !stricmp( key, "flags" ) || !stricmp( key, "flag" )) + else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) { ParseAlphaFlags( val ); } @@ -1985,20 +1988,20 @@ bool CPrimitiveTemplate::ParseSize( CGPGroup *grp ) key = pairs->GetName(); val = pairs->GetTopValue(); - // Huge stricmp lists suxor - if ( !stricmp( key, "start" )) + // Huge Q_stricmp lists suxor + if ( !Q_stricmp( key, "start" )) { ParseSizeStart( val ); } - else if ( !stricmp( key, "end" )) + else if ( !Q_stricmp( key, "end" )) { ParseSizeEnd( val ); } - else if ( !stricmp( key, "parm" ) || !stricmp( key, "parms" )) + else if ( !Q_stricmp( key, "parm" ) || !Q_stricmp( key, "parms" )) { ParseSizeParm( val ); } - else if ( !stricmp( key, "flags" ) || !stricmp( key, "flag" )) + else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) { ParseSizeFlags( val ); } @@ -2039,20 +2042,20 @@ bool CPrimitiveTemplate::ParseSize2( CGPGroup *grp ) key = pairs->GetName(); val = pairs->GetTopValue(); - // Huge stricmp lists suxor - if ( !stricmp( key, "start" )) + // Huge Q_stricmp lists suxor + if ( !Q_stricmp( key, "start" )) { ParseSize2Start( val ); } - else if ( !stricmp( key, "end" )) + else if ( !Q_stricmp( key, "end" )) { ParseSize2End( val ); } - else if ( !stricmp( key, "parm" ) || !stricmp( key, "parms" )) + else if ( !Q_stricmp( key, "parm" ) || !Q_stricmp( key, "parms" )) { ParseSize2Parm( val ); } - else if ( !stricmp( key, "flags" ) || !stricmp( key, "flag" )) + else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) { ParseSize2Flags( val ); } @@ -2093,20 +2096,20 @@ bool CPrimitiveTemplate::ParseLength( CGPGroup *grp ) key = pairs->GetName(); val = pairs->GetTopValue(); - // Huge stricmp lists suxor - if ( !stricmp( key, "start" )) + // Huge Q_stricmp lists suxor + if ( !Q_stricmp( key, "start" )) { ParseLengthStart( val ); } - else if ( !stricmp( key, "end" )) + else if ( !Q_stricmp( key, "end" )) { ParseLengthEnd( val ); } - else if ( !stricmp( key, "parm" ) || !stricmp( key, "parms" )) + else if ( !Q_stricmp( key, "parm" ) || !Q_stricmp( key, "parms" )) { ParseLengthParm( val ); } - else if ( !stricmp( key, "flags" ) || !stricmp( key, "flag" )) + else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) { ParseLengthFlags( val ); } @@ -2141,109 +2144,109 @@ bool CPrimitiveTemplate::ParsePrimitive( CGPGroup *grp ) key = pairs->GetName(); val = pairs->GetTopValue(); - // Huge stricmp lists suxor - if ( !stricmp( key, "count" )) + // Huge Q_stricmp lists suxor + if ( !Q_stricmp( key, "count" )) { ParseCount( val ); } - else if ( !stricmp( key, "shaders" ) || !stricmp( key, "shader" )) + else if ( !Q_stricmp( key, "shaders" ) || !Q_stricmp( key, "shader" )) { ParseShaders( pairs ); } - else if ( !stricmp( key, "models" ) || !stricmp( key, "model" )) + else if ( !Q_stricmp( key, "models" ) || !Q_stricmp( key, "model" )) { ParseModels( pairs ); } - else if ( !stricmp( key, "sounds" ) || !stricmp( key, "sound" )) + else if ( !Q_stricmp( key, "sounds" ) || !Q_stricmp( key, "sound" )) { ParseSounds( pairs ); } - else if ( !stricmp( key, "impactfx" )) + else if ( !Q_stricmp( key, "impactfx" )) { ParseImpactFxStrings( pairs ); } - else if ( !stricmp( key, "deathfx" )) + else if ( !Q_stricmp( key, "deathfx" )) { ParseDeathFxStrings( pairs ); } - else if ( !stricmp( key, "emitfx" )) + else if ( !Q_stricmp( key, "emitfx" )) { ParseEmitterFxStrings( pairs ); } - else if ( !stricmp( key, "playfx" )) + else if ( !Q_stricmp( key, "playfx" )) { ParsePlayFxStrings( pairs ); } - else if ( !stricmp( key, "life" )) + else if ( !Q_stricmp( key, "life" )) { ParseLife( val ); } - else if ( !stricmp( key, "cullrange" )) + else if ( !Q_stricmp( key, "cullrange" )) { mCullRange = atoi( val ); mCullRange *= mCullRange; // Square } - else if ( !stricmp( key, "delay" )) + else if ( !Q_stricmp( key, "delay" )) { ParseDelay( val ); } - else if ( !stricmp( key, "bounce" ) || !stricmp( key, "intensity" )) // me==bad for reusing this...but it shouldn't hurt anything) + else if ( !Q_stricmp( key, "bounce" ) || !Q_stricmp( key, "intensity" )) // me==bad for reusing this...but it shouldn't hurt anything) { ParseElasticity( val ); } - else if ( !stricmp( key, "min" )) + else if ( !Q_stricmp( key, "min" )) { ParseMin( val ); } - else if ( !stricmp( key, "max" )) + else if ( !Q_stricmp( key, "max" )) { ParseMax( val ); } - else if ( !stricmp( key, "angle" ) || !stricmp( key, "angles" )) + else if ( !Q_stricmp( key, "angle" ) || !Q_stricmp( key, "angles" )) { ParseAngle( val ); } - else if ( !stricmp( key, "angleDelta" )) + else if ( !Q_stricmp( key, "angleDelta" )) { ParseAngleDelta( val ); } - else if ( !stricmp( key, "velocity" ) || !stricmp( key, "vel" )) + else if ( !Q_stricmp( key, "velocity" ) || !Q_stricmp( key, "vel" )) { ParseVelocity( val ); } - else if ( !stricmp( key, "acceleration" ) || !stricmp( key, "accel" )) + else if ( !Q_stricmp( key, "acceleration" ) || !Q_stricmp( key, "accel" )) { ParseAcceleration( val ); } - else if ( !stricmp( key, "gravity" )) + else if ( !Q_stricmp( key, "gravity" )) { ParseGravity( val ); } - else if ( !stricmp( key, "density" )) + else if ( !Q_stricmp( key, "density" )) { ParseDensity( val ); } - else if ( !stricmp( key, "variance" )) + else if ( !Q_stricmp( key, "variance" )) { ParseVariance( val ); } - else if ( !stricmp( key, "origin" )) + else if ( !Q_stricmp( key, "origin" )) { ParseOrigin1( val ); } - else if ( !stricmp( key, "origin2" )) + else if ( !Q_stricmp( key, "origin2" )) { ParseOrigin2( val ); } - else if ( !stricmp( key, "radius" )) // part of ellipse/cylinder calcs. + else if ( !Q_stricmp( key, "radius" )) // part of ellipse/cylinder calcs. { ParseRadius( val ); } - else if ( !stricmp( key, "height" )) // part of ellipse/cylinder calcs. + else if ( !Q_stricmp( key, "height" )) // part of ellipse/cylinder calcs. { ParseHeight( val ); } - else if ( !stricmp( key, "rotation" )) + else if ( !Q_stricmp( key, "rotation" )) { ParseRotation( val ); } @@ -2251,15 +2254,15 @@ bool CPrimitiveTemplate::ParsePrimitive( CGPGroup *grp ) { ParseRotationDelta( val ); } - else if ( !stricmp( key, "flags" ) || !stricmp( key, "flag" )) + else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) { // these need to get passed on to the primitive ParseFlags( val ); } - else if ( !stricmp( key, "spawnFlags" ) || !stricmp( key, "spawnFlag" )) + else if ( !Q_stricmp( key, "spawnFlags" ) || !Q_stricmp( key, "spawnFlag" )) { // these are used to spawn things in cool ways, but don't ever get passed on to prims. ParseSpawnFlags( val ); } - else if ( !stricmp( key, "name" )) + else if ( !Q_stricmp( key, "name" )) { if ( val ) { @@ -2282,23 +2285,23 @@ bool CPrimitiveTemplate::ParsePrimitive( CGPGroup *grp ) { key = subGrp->GetName(); - if ( !stricmp( key, "rgb" )) + if ( !Q_stricmp( key, "rgb" )) { ParseRGB( subGrp ); } - else if ( !stricmp( key, "alpha" )) + else if ( !Q_stricmp( key, "alpha" )) { ParseAlpha( subGrp ); } - else if ( !stricmp( key, "size" ) || !stricmp( key, "width" )) + else if ( !Q_stricmp( key, "size" ) || !Q_stricmp( key, "width" )) { ParseSize( subGrp ); } - else if ( !stricmp( key, "size2" ) || !stricmp( key, "width2" )) + else if ( !Q_stricmp( key, "size2" ) || !Q_stricmp( key, "width2" )) { ParseSize2( subGrp ); } - else if ( !stricmp( key, "length" ) || !stricmp( key, "height" )) + else if ( !Q_stricmp( key, "length" ) || !Q_stricmp( key, "height" )) { ParseLength( subGrp ); } @@ -2311,4 +2314,4 @@ bool CPrimitiveTemplate::ParsePrimitive( CGPGroup *grp ) } return true; -} \ No newline at end of file +} diff --git a/codeJK2/cgame/FxUtil.cpp b/codeJK2/cgame/FxUtil.cpp index 0beb375f7a..436e115167 100644 --- a/codeJK2/cgame/FxUtil.cpp +++ b/codeJK2/cgame/FxUtil.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #if !defined(FX_SCHEDULER_H_INC) #include "FxScheduler.h" diff --git a/codeJK2/cgame/FxUtil.h b/codeJK2/cgame/FxUtil.h index d8d67f25fb..7aed5d510e 100644 --- a/codeJK2/cgame/FxUtil.h +++ b/codeJK2/cgame/FxUtil.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #if !defined(FX_PRIMITIVES_H_INC) #include "FxPrimitives.h" diff --git a/codeJK2/cgame/animtable.h b/codeJK2/cgame/animtable.h index d4f5728906..db67b1c9ed 100644 --- a/codeJK2/cgame/animtable.h +++ b/codeJK2/cgame/animtable.h @@ -1,25 +1,26 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // special file included only by cg_players.cpp & ui_players.cpp -// -// moved it from the original header file for PCH reasons... -// stringID_table_t animTable [MAX_ANIMATIONS+1] = { diff --git a/codeJK2/cgame/cg_camera.cpp b/codeJK2/cgame/cg_camera.cpp index 97fa82fa4b..a66f7ce20f 100644 --- a/codeJK2/cgame/cg_camera.cpp +++ b/codeJK2/cgame/cg_camera.cpp @@ -1,24 +1,27 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //Client camera controls for cinematics -// this line must stay at top so the whole PCH thing works... #include "cg_local.h" #include "cg_media.h" diff --git a/codeJK2/cgame/cg_camera.h b/codeJK2/cgame/cg_camera.h index 50fa23a785..7f068458bb 100644 --- a/codeJK2/cgame/cg_camera.h +++ b/codeJK2/cgame/cg_camera.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #pragma once diff --git a/codeJK2/cgame/cg_consolecmds.cpp b/codeJK2/cgame/cg_consolecmds.cpp index 0576e146f6..9fbe14cdf4 100644 --- a/codeJK2/cgame/cg_consolecmds.cpp +++ b/codeJK2/cgame/cg_consolecmds.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_consolecmds.c -- text commands typed in at the local console, or // executed by a key binding @@ -279,6 +284,7 @@ static const char *gcmds[] = { "saberAttackCycle", "saberColor", "setForceAll", + "setSaberAll", "setobjective", "setviewpos", "taunt", diff --git a/codeJK2/cgame/cg_credits.cpp b/codeJK2/cgame/cg_credits.cpp index ebac0cd58d..03c3c67096 100644 --- a/codeJK2/cgame/cg_credits.cpp +++ b/codeJK2/cgame/cg_credits.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- cg_credits.cpp // @@ -31,8 +35,6 @@ This file is part of Jedi Knight 2. #define MAX_LINE_BYTES 2048 -#define max(a,b) (((a) > (b)) ? (a) : (b)) - qhandle_t ghFontHandle = 0; float gfFontScale = 1.0f; vec4_t gv4Color = {0}; @@ -603,7 +605,7 @@ qboolean CG_Credits_Draw( void ) int iYpos = SCREEN_HEIGHT + (CreditLine.iLine * iFontHeight); iYpos-= (int) (fPixelsPerSecond * fSecondsElapsed); - int iTextLinesThisItem = max(CreditLine.vstrText.size(),1); + int iTextLinesThisItem = Q_max( (int)CreditLine.vstrText.size(), 1); if (iYpos + (iTextLinesThisItem * iFontHeight) < 0) { // scrolled off top of screen, so erase it... diff --git a/codeJK2/cgame/cg_draw.cpp b/codeJK2/cgame/cg_draw.cpp index fb9551f83b..eeb1c13ca6 100644 --- a/codeJK2/cgame/cg_draw.cpp +++ b/codeJK2/cgame/cg_draw.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_draw.c -- draw all of the graphical elements during // active (after loading) gameplay diff --git a/codeJK2/cgame/cg_drawtools.cpp b/codeJK2/cgame/cg_drawtools.cpp index 434ea0ecc4..badda5920b 100644 --- a/codeJK2/cgame/cg_drawtools.cpp +++ b/codeJK2/cgame/cg_drawtools.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "cg_local.h" #include "cg_media.h" diff --git a/codeJK2/cgame/cg_effects.cpp b/codeJK2/cgame/cg_effects.cpp index 5876546155..cce8bf1364 100644 --- a/codeJK2/cgame/cg_effects.cpp +++ b/codeJK2/cgame/cg_effects.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_effects.c -- these functions generate localentities diff --git a/codeJK2/cgame/cg_ents.cpp b/codeJK2/cgame/cg_ents.cpp index 62c15b385d..279ab0a047 100644 --- a/codeJK2/cgame/cg_ents.cpp +++ b/codeJK2/cgame/cg_ents.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_ents.c -- present snapshot entities, happens every single frame #include "../game/g_local.h" diff --git a/codeJK2/cgame/cg_event.cpp b/codeJK2/cgame/cg_event.cpp index ab7e09b3a4..a10f11cee5 100644 --- a/codeJK2/cgame/cg_event.cpp +++ b/codeJK2/cgame/cg_event.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_event.c -- handle entity events at snapshot or playerstate transitions @@ -88,19 +93,19 @@ void CG_ItemPickup( int itemNum, qboolean bHadItem ) { cg.itemPickupBlendTime = cg.time; if (bg_itemlist[itemNum].classname && bg_itemlist[itemNum].classname[0]) - { + { char text[1024], data[1024]; if (cgi_SP_GetStringTextString("INGAME_PICKUPLINE",text, sizeof(text)) ) - { + { if ( cgi_SP_GetStringTextString( va("INGAME_%s",bg_itemlist[itemNum].classname ), data, sizeof( data ))) { Com_Printf("%s %s\n", text, data ); } } } - + // see if it should be the grabbed weapon - if ( bg_itemlist[itemNum].giType == IT_WEAPON ) + if ( bg_itemlist[itemNum].giType == IT_WEAPON ) { const int nCurWpn = cg.predicted_player_state.weapon; const int nNewWpn = bg_itemlist[itemNum].giTag; @@ -172,7 +177,7 @@ void UseItem(int itemNum) cent = &cg_entities[cg.snap->ps.clientNum]; - switch ( itemNum ) + switch ( itemNum ) { case INV_ELECTROBINOCULARS: CG_ToggleBinoculars(); @@ -200,7 +205,7 @@ void UseItem(int itemNum) CG_UseForce =============== */ -static void CG_UseForce( centity_t *cent ) +static void CG_UseForce( centity_t *cent ) { //FIXME: sound or graphic change or something? //actual force power action is on game/pm side @@ -211,27 +216,27 @@ static void CG_UseForce( centity_t *cent ) CG_UseItem =============== */ -static void CG_UseItem( centity_t *cent ) +static void CG_UseItem( centity_t *cent ) { int itemNum; entityState_t *es; es = ¢->currentState; - + itemNum = cg.inventorySelect; - if ( itemNum < 0 || itemNum > INV_MAX ) + if ( itemNum < 0 || itemNum > INV_MAX ) { itemNum = 0; } // print a message if the local player - if ( es->number == cg.snap->ps.clientNum ) + if ( es->number == cg.snap->ps.clientNum ) { - if ( !itemNum ) + if ( !itemNum ) { // CG_CenterPrint( "No item to use", SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); - } - else + } + else { // item = BG_FindItemForHoldable( itemNum ); // CG_CenterPrint( va("Use %s", item->pickup_name), SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); @@ -287,14 +292,14 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { if (cg_footsteps.integer) { if ( cent->gent && cent->gent->s.number == 0 && !cg.renderingThirdPerson )//!cg_thirdPerson.integer ) {//Everyone else has keyframed footsteps in animsounds.cfg - cgi_S_StartSound (NULL, es->number, CHAN_BODY, + cgi_S_StartSound (NULL, es->number, CHAN_BODY, cgs.media.footsteps[ FOOTSTEP_NORMAL ][rand()&3] ); } } break; case EV_FOOTSTEP_METAL: DEBUGNAME("EV_FOOTSTEP_METAL"); - if (cg_footsteps.integer) + if (cg_footsteps.integer) { if ( cent->gent && cent->gent->s.number == 0 && !cg.renderingThirdPerson )//!cg_thirdPerson.integer ) {//Everyone else has keyframed footsteps in animsounds.cfg @@ -305,21 +310,21 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { case EV_FOOTSPLASH: DEBUGNAME("EV_FOOTSPLASH"); if (cg_footsteps.integer) { - cgi_S_StartSound (NULL, es->number, CHAN_BODY, + cgi_S_StartSound (NULL, es->number, CHAN_BODY, cgs.media.footsteps[ FOOTSTEP_SPLASH ][rand()&3] ); } break; case EV_FOOTWADE: DEBUGNAME("EV_FOOTWADE"); if (cg_footsteps.integer) { - cgi_S_StartSound (NULL, es->number, CHAN_BODY, + cgi_S_StartSound (NULL, es->number, CHAN_BODY, cgs.media.footsteps[ FOOTSTEP_WADE ][rand()&3] ); } break; case EV_SWIM: DEBUGNAME("EV_SWIM"); if (cg_footsteps.integer) { - cgi_S_StartSound (NULL, es->number, CHAN_BODY, + cgi_S_StartSound (NULL, es->number, CHAN_BODY, cgs.media.footsteps[ FOOTSTEP_SWIM ][rand()&3] ); } break; @@ -337,7 +342,7 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { break; case EV_FALL_MEDIUM: DEBUGNAME("EV_FALL_MEDIUM"); - // use normal pain sound - + // use normal pain sound - if ( g_entities[es->number].health <= 0 ) {//dead cgi_S_StartSound( NULL, es->number, CHAN_AUTO, cgs.media.landSound ); @@ -422,17 +427,17 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { DEBUGNAME("EV_WATER_TOUCH"); cgi_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.watrInSound ); break; - + case EV_WATER_LEAVE: DEBUGNAME("EV_WATER_LEAVE"); cgi_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.watrOutSound ); break; - + case EV_WATER_UNDER: DEBUGNAME("EV_WATER_UNDER"); cgi_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.watrUnSound ); break; - + case EV_WATER_CLEAR: DEBUGNAME("EV_WATER_CLEAR"); CG_TryPlayCustomSound(NULL, es->number, CHAN_AUTO, "*gasp.wav", CS_BASIC ); @@ -455,10 +460,10 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { gitem_t *item; int index; qboolean bHadItem = qfalse; - + index = es->eventParm; // player predicted - if ( (char)index < 0 ) + if ( (char)index < 0 ) { index = -(char)index; bHadItem = qtrue; @@ -531,7 +536,7 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { case EV_DISRUPTOR_MAIN_SHOT: DEBUGNAME("EV_DISRUPTOR_MAIN_SHOT"); - FX_DisruptorMainShot( cent->currentState.origin2, cent->lerpOrigin ); + FX_DisruptorMainShot( cent->currentState.origin2, cent->lerpOrigin ); break; case EV_DISRUPTOR_SNIPER_SHOT: @@ -550,7 +555,7 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { // case EV_POWERUP_SEEKER_FIRE: // DEBUGNAME("EV_POWERUP_SEEKER_FIRE"); -// CG_FireSeeker( cent ); +// CG_FireSeeker( cent ); // break; case EV_POWERUP_BATTLESUIT: @@ -586,7 +591,6 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { int disintLength = 0; qhandle_t disintSound1 = NULL_HANDLE; qhandle_t disintSound2 = NULL_HANDLE; - qhandle_t disintSound3 = NULL_HANDLE; switch( disintPW ) { @@ -594,7 +598,6 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { disintEffect = EF_DISINTEGRATION;//ef_ disintSound1 = cgs.media.disintegrateSound;//with scream disintSound2 = cgs.media.disintegrate2Sound;//no scream - disintSound3 = cgs.media.disintegrate3Sound;//with inhuman scream disintLength = 2000; makeNotSolid = qtrue; break; @@ -699,11 +702,11 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { case EV_GENERAL_SOUND: DEBUGNAME("EV_GENERAL_SOUND"); - if ( cgs.sound_precache[ es->eventParm ] ) + if ( cgs.sound_precache[ es->eventParm ] ) { cgi_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.sound_precache[ es->eventParm ] ); - } - else + } + else { s = CG_ConfigString( CS_SOUNDS + es->eventParm ); CG_TryPlayCustomSound(NULL, es->number, CHAN_AUTO, s, CS_BASIC ); @@ -1030,12 +1033,12 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { DEBUGNAME("EV_USE_INV_LIGHTAMP_GOGGLES"); UseItem(INV_LIGHTAMP_GOGGLES ); break; - + case EV_USE_INV_SENTRY: DEBUGNAME("EV_USE_INV_SENTRY"); UseItem(INV_SENTRY ); break; - + case EV_DEBUG_LINE: DEBUGNAME("EV_DEBUG_LINE"); CG_TestLine(position, es->origin2, es->time, (unsigned int)(es->time2), es->weapon); diff --git a/codeJK2/cgame/cg_info.cpp b/codeJK2/cgame/cg_info.cpp index 31d43b1b0a..e8a6b5be5d 100644 --- a/codeJK2/cgame/cg_info.cpp +++ b/codeJK2/cgame/cg_info.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "cg_local.h" #include "cg_media.h" @@ -396,13 +401,16 @@ void CG_DrawInformation( void ) { } extern SavedGameJustLoaded_e g_eSavedGameJustLoaded; // hack! (hey, it's the last week of coding, ok? - /*if ( !levelshot || g_eSavedGameJustLoaded == eFULL ) +#ifdef JK2_MODE + if ( !levelshot || g_eSavedGameJustLoaded == eFULL ) { // keep whatever's in the screen buffer so far (either the last ingame rendered-image (eg for maptransition) // or the screenshot built-in to a loaded save game... // - cgi_R_DrawScreenShot( 0, 480, 640, -480 ); - } else*/ { + cgi_R_DrawScreenShot( 0, 0, 640, 480 ); + } else +#endif + { // put up the pre-defined levelshot for this map... // cgi_R_SetColor( NULL ); diff --git a/codeJK2/cgame/cg_lights.cpp b/codeJK2/cgame/cg_lights.cpp index 0380c765a0..7def0f4009 100644 --- a/codeJK2/cgame/cg_lights.cpp +++ b/codeJK2/cgame/cg_lights.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + #include "cg_local.h" typedef struct clightstyle_s { @@ -62,6 +67,8 @@ void CG_RunLightStyles (void) for (i=0,ls=cl_lightstyle ; ivalue; + if (!ls->length) { ls->value[0] = ls->value[1] = ls->value[2] = ls->value[3] = 255; @@ -80,7 +87,7 @@ void CG_RunLightStyles (void) ls->value[2] = ls->map[ofs%ls->length][2]; ls->value[3] = 255; //ls->map[ofs%ls->length][3]; } - trap_R_SetLightStyle(i, *(int*)ls->value); + trap_R_SetLightStyle( i, ba->i ); } } diff --git a/codeJK2/cgame/cg_local.h b/codeJK2/cgame/cg_local.h index 364aee7106..30eb45f99f 100644 --- a/codeJK2/cgame/cg_local.h +++ b/codeJK2/cgame/cg_local.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __CG_LOCAL_H__ #define __CG_LOCAL_H__ diff --git a/codeJK2/cgame/cg_localents.cpp b/codeJK2/cgame/cg_localents.cpp index 4863c304bd..d25a8e1eca 100644 --- a/codeJK2/cgame/cg_localents.cpp +++ b/codeJK2/cgame/cg_localents.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_localents.c -- every frame, generate renderer commands for locally // processed entities, like smoke puffs, gibs, shells, etc. diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index 7e59ec15ae..929c4439a9 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -1,20 +1,26 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + #include "cg_local.h" #include "cg_media.h" #include "FxScheduler.h" @@ -37,7 +43,7 @@ qboolean CG_ConsoleCommand( void ); void CG_Shutdown( void ); int CG_GetCameraPos( vec3_t camerapos ); void UseItem(int itemNum); -const char *CG_DisplayBoxedText(int iBoxX, int iBoxY, int iBoxWidth, int iBoxHeight, +const char *CG_DisplayBoxedText(int iBoxX, int iBoxY, int iBoxWidth, int iBoxHeight, const char *psText, int iFontHandle, float fScale, const vec4_t v4Color); @@ -394,7 +400,7 @@ static cvarTable_t cvarTable[] = { { &cg_thirdPersonVertOffset, "cg_thirdPersonVertOffset", "16", 0}, { &cg_thirdPersonCameraDamp, "cg_thirdPersonCameraDamp", "0.3", 0}, { &cg_thirdPersonTargetDamp, "cg_thirdPersonTargetDamp", "0.5", 0}, - + { &cg_thirdPersonHorzOffset, "cg_thirdPersonHorzOffset", "0", 0}, { &cg_thirdPersonAlpha, "cg_thirdPersonAlpha", "1.0", CVAR_CHEAT }, { &cg_thirdPersonAutoAlpha, "cg_thirdPersonAutoAlpha", "0", 0 }, @@ -411,8 +417,8 @@ static cvarTable_t cvarTable[] = { // but we also reference them here { &cg_paused, "cl_paused", "0", CVAR_ROM }, - { &cg_developer, "developer", "", 0 }, - { &cg_timescale, "timescale", "1", 0 }, + { &cg_developer, "developer", "", 0 }, + { &cg_timescale, "timescale", "1", 0 }, { &cg_skippingcin, "skippingCinematic", "0", CVAR_ROM}, { &cg_missionInfoCentered, "cg_missionInfoCentered", "1", CVAR_ARCHIVE }, { &cg_missionInfoFlashTime, "cg_missionInfoFlashTime", "10000", 0 }, @@ -465,9 +471,9 @@ void CG_UpdateCvars( void ) { } } -int CG_CrosshairPlayer( void ) +int CG_CrosshairPlayer( void ) { - if ( cg.time > ( cg.crosshairClientTime + 1000 ) ) + if ( cg.time > ( cg.crosshairClientTime + 1000 ) ) { return -1; } @@ -510,7 +516,7 @@ int CG_GetCameraPos( vec3_t camerapos ) { VectorCopy( cg.refdef.vieworg, camerapos ); return 1; } - else if (cg.snap && (cg.snap->ps.weapon == WP_SABER||cg.snap->ps.weapon == WP_MELEE) )//implied: !cg.renderingThirdPerson + else if (cg.snap && (cg.snap->ps.weapon == WP_SABER||cg.snap->ps.weapon == WP_MELEE) )//implied: !cg.renderingThirdPerson {//first person saber hack VectorCopy( cg.refdef.vieworg, camerapos ); return 1; @@ -590,7 +596,7 @@ void CG_RegisterItemSounds( int itemNum ) { len = s-start; if (len >= MAX_QPATH || len < 5) { - CG_Error( "PrecacheItem: %s has bad precache string", + CG_Error( "PrecacheItem: %s has bad precache string", item->classname); return; } @@ -767,12 +773,12 @@ qhandle_t CG_RegisterHeadSkin( const char *headModelName, const char *headSkinNa Com_sprintf( hfilename, sizeof( hfilename ), "models/players/%s/head_%s.skin", headModelName, headSkinName ); headSkin = cgi_R_RegisterSkin( hfilename ); - if ( headSkin < 0 ) + if ( headSkin < 0 ) { //have extensions *extensions = qtrue; headSkin = -headSkin; - } - else + } + else { *extensions = qfalse; //just to be sure. } @@ -792,7 +798,7 @@ CG_RegisterClientSkin qboolean CG_RegisterClientSkin( clientInfo_t *ci, const char *headModelName, const char *headSkinName, const char *torsoModelName, const char *torsoSkinName, - const char *legsModelName, const char *legsSkinName) + const char *legsModelName, const char *legsSkinName) { char hfilename[MAX_QPATH]; char tfilename[MAX_QPATH]; @@ -848,7 +854,7 @@ CG_RegisterClientModelname qboolean CG_RegisterClientModelname( clientInfo_t *ci, const char *headModelName, const char *headSkinName, const char *torsoModelName, const char *torsoSkinName, - const char *legsModelName, const char *legsSkinName ) + const char *legsModelName, const char *legsSkinName ) { /* Ghoul2 Insert Start @@ -863,7 +869,7 @@ Ghoul2 Insert Start } Com_sprintf( filename, sizeof( filename ), "models/players/%s/lower.mdr", legsModelName ); ci->legsModel = cgi_R_RegisterModel( filename ); - if ( !ci->legsModel ) + if ( !ci->legsModel ) {//he's not skeletal, try the old way Com_sprintf( filename, sizeof( filename ), "models/players/%s/lower.md3", legsModelName ); ci->legsModel = cgi_R_RegisterModel( filename ); @@ -878,11 +884,11 @@ Ghoul2 Insert Start {//You are trying to set one Com_sprintf( filename, sizeof( filename ), "models/players/%s/upper.mdr", torsoModelName ); ci->torsoModel = cgi_R_RegisterModel( filename ); - if ( !ci->torsoModel ) + if ( !ci->torsoModel ) {//he's not skeletal, try the old way Com_sprintf( filename, sizeof( filename ), "models/players/%s/upper.md3", torsoModelName ); ci->torsoModel = cgi_R_RegisterModel( filename ); - if ( !ci->torsoModel ) + if ( !ci->torsoModel ) { Com_Printf( S_COLOR_RED"Failed to load model file %s\n", filename ); return qfalse; @@ -898,7 +904,7 @@ Ghoul2 Insert Start {//You are trying to set one Com_sprintf( filename, sizeof( filename ), "models/players/%s/head.md3", headModelName ); ci->headModel = cgi_R_RegisterModel( filename ); - if ( !ci->headModel ) + if ( !ci->headModel ) { Com_Printf( S_COLOR_RED"Failed to load model file %s\n", filename ); return qfalse; @@ -911,7 +917,7 @@ Ghoul2 Insert Start // if any skins failed to load, return failure - if ( !CG_RegisterClientSkin( ci, headModelName, headSkinName, torsoModelName, torsoSkinName, legsModelName, legsSkinName ) ) + if ( !CG_RegisterClientSkin( ci, headModelName, headSkinName, torsoModelName, torsoSkinName, legsModelName, legsSkinName ) ) { //Com_Printf( "Failed to load skin file: %s : %s/%s : %s/%s : %s\n", headModelName, headSkinName, torsoModelName, torsoSkinName, legsModelName, legsSkinName ); return qfalse; @@ -919,7 +925,7 @@ Ghoul2 Insert Start //FIXME: for now, uses the legs model dir for anim cfg, but should we set this in some sort of NPCs.cfg? // load the animation file set - if ( !G_ParseAnimFileSet( legsModelName, legsModelName, &ci->animFileIndex ) ) + if ( !G_ParseAnimFileSet( legsModelName, legsModelName, &ci->animFileIndex ) ) { Com_Printf( S_COLOR_RED"Failed to load animation file set models/players/%s\n", legsModelName ); return qfalse; @@ -950,12 +956,12 @@ void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri) Q_strncpyz( legsModelName, ri->legsModelName, sizeof( legsModelName ) ); //Legs skin slash = strchr( legsModelName, '/' ); - if ( !slash ) + if ( !slash ) { // modelName didn not include a skin name Q_strncpyz( legsSkinName, "default", sizeof( legsSkinName ) ); - } - else + } + else { Q_strncpyz( legsSkinName, slash + 1, sizeof( legsSkinName ) ); // truncate modelName @@ -967,12 +973,12 @@ void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri) Q_strncpyz( torsoModelName, ri->torsoModelName, sizeof( torsoModelName ) ); //Torso skin slash = strchr( torsoModelName, '/' ); - if ( !slash ) + if ( !slash ) { // modelName didn't include a skin name Q_strncpyz( torsoSkinName, "default", sizeof( torsoSkinName ) ); - } - else + } + else { Q_strncpyz( torsoSkinName, slash + 1, sizeof( torsoSkinName ) ); // truncate modelName @@ -990,12 +996,12 @@ void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri) Q_strncpyz( headModelName, ri->headModelName, sizeof( headModelName ) ); //Head skin slash = strchr( headModelName, '/' ); - if ( !slash ) + if ( !slash ) { // modelName didn not include a skin name Q_strncpyz( headSkinName, "default", sizeof( headSkinName ) ); - } - else + } + else { Q_strncpyz( headSkinName, slash + 1, sizeof( headSkinName ) ); // truncate modelName @@ -1007,9 +1013,9 @@ void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri) headModelName[0] = 0; } - if ( !CG_RegisterClientModelname( ci, headModelName, headSkinName, torsoModelName, torsoSkinName, legsModelName, legsSkinName) ) + if ( !CG_RegisterClientModelname( ci, headModelName, headSkinName, torsoModelName, torsoSkinName, legsModelName, legsSkinName) ) { - if ( !CG_RegisterClientModelname( ci, DEFAULT_HEADMODEL, "default", DEFAULT_TORSOMODEL, "default", DEFAULT_LEGSMODEL, "default" ) ) + if ( !CG_RegisterClientModelname( ci, DEFAULT_HEADMODEL, "default", DEFAULT_TORSOMODEL, "default", DEFAULT_LEGSMODEL, "default" ) ) { CG_Error( "DEFAULT_MODELS failed to register"); } @@ -1018,7 +1024,7 @@ void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri) //------------------------------------- // CG_RegisterEffects -// +// // Handles precaching all effect files // and any shader, model, or sound // files an effect may use. @@ -1032,11 +1038,11 @@ static void CG_RegisterEffects( void ) int i; // Register external effects - for ( i = 1 ; i < MAX_FX ; i++ ) + for ( i = 1 ; i < MAX_FX ; i++ ) { effectName = ( char *)CG_ConfigString( CS_EFFECTS + i ); - if ( !effectName[0] ) + if ( !effectName[0] ) { break; } @@ -1045,11 +1051,11 @@ static void CG_RegisterEffects( void ) } // Start world effects - for ( i = 1 ; i < MAX_WORLD_FX ; i++ ) + for ( i = 1 ; i < MAX_WORLD_FX ; i++ ) { effectName = ( char *)CG_ConfigString( CS_WORLD_FX + i ); - if ( !effectName[0] ) + if ( !effectName[0] ) { break; } @@ -1103,7 +1109,7 @@ void CG_RegisterClientModels (int entityNum) //=================================================================================== -forceTicPos_t forceTicPos[] = +forceTicPos_t forceTicPos[] = { { 11, 41, 20, 10, "gfx/hud/force_tick1", NULL_HANDLE }, // Left Top { 12, 45, 20, 10, "gfx/hud/force_tick2", NULL_HANDLE }, @@ -1122,7 +1128,7 @@ forceTicPos_t forceTicPos[] = { 69, 41, -20, 10, "gfx/hud/force_tick1", NULL_HANDLE }, // Right top }; -forceTicPos_t ammoTicPos[] = +forceTicPos_t ammoTicPos[] = { { 12, 34, 10, 10, "gfx/hud/ammo_tick7-l", NULL_HANDLE }, // Bottom { 13, 28, 10, 10, "gfx/hud/ammo_tick6-l", NULL_HANDLE }, @@ -1258,7 +1264,7 @@ static void CG_RegisterGraphics( void ) { cg.loadLCARSStage = 5; CG_LoadingString( "game media models" ); - + // Chunk models //FIXME: jfm:? bother to conditionally load these if an ent has this material type? for ( i = 0; i < NUM_CHUNK_MODELS; i++ ) @@ -1311,7 +1317,7 @@ static void CG_RegisterGraphics( void ) { // battery charge shader when using a gonk cgs.media.batteryChargeShader = cgi_R_RegisterShader( "gfx/2d/battery" ); - cgi_R_RegisterShader( "gfx/2d/droid_view" ); + cgi_R_RegisterShader( "gfx/2d/droid_view" ); // Load force tics for (i=0;istartTime = cg.time; ex->endTime = ex->startTime + 51; VectorCopy( origin, ex->refEntity.origin ); - + ex->refEntity.customShader = cgi_R_RegisterShader( "gfx/misc/nav_node" ); float scale = 16.0f; @@ -1820,7 +1826,7 @@ void CG_DrawNode( vec3_t origin, int type ) ex->color[2] = 0; break; } - + ex->radius = scale; } @@ -1841,7 +1847,7 @@ void CG_DrawRadius( vec3_t origin, unsigned int radius, int type ) ex->startTime = cg.time; ex->endTime = ex->startTime + 51; VectorCopy( origin, ex->refEntity.origin ); - + ex->refEntity.customShader = cgi_R_RegisterShader( "gfx/misc/nav_radius" ); switch ( type ) @@ -1889,7 +1895,7 @@ void CG_DrawEdge( vec3_t start, vec3_t end, int type ) case EDGE_NORMAL: FX_AddLine( start, end, 8.0f, 4.0f, 0.0f, 0.5f, 0.5f, 51, cgi_R_RegisterShader( "gfx/misc/nav_line" ), 0 ); break; - + case EDGE_BLOCKED: { vec3_t color = { 255, 255, 0 }; @@ -1933,7 +1939,7 @@ void CG_DrawCombatPoint( vec3_t origin, int type ) ex->radius = 8; ex->endTime = ex->startTime + 51; VectorCopy( origin, ex->refEntity.origin ); - + ex->refEntity.customShader = cgi_R_RegisterShader( "gfx/misc/nav_cpoint" ); ex->color[0] = 0; @@ -1982,7 +1988,7 @@ void CG_DrawAlert( vec3_t origin, float rating ) // new hud stuff ( mission pack ) // ============================== // -qboolean CG_Asset_Parse(const char **p) +qboolean CG_Asset_Parse(const char **p) { const char *token; const char *tempStr; @@ -1995,12 +2001,12 @@ qboolean CG_Asset_Parse(const char **p) return qfalse; } - if (Q_stricmp(token, "{") != 0) + if (Q_stricmp(token, "{") != 0) { return qfalse; } - - while ( 1 ) + + while ( 1 ) { token = COM_ParseExt(p, qtrue); if (!token) @@ -2008,13 +2014,13 @@ qboolean CG_Asset_Parse(const char **p) return qfalse; } - if (Q_stricmp(token, "}") == 0) + if (Q_stricmp(token, "}") == 0) { return qtrue; } // font - if (Q_stricmp(token, "font") == 0) + if (Q_stricmp(token, "font") == 0) { /* int pointSize; @@ -2022,7 +2028,7 @@ qboolean CG_Asset_Parse(const char **p) cgi_UI_Parse_String(tempStr); cgi_UI_Parse_Int(&pointSize); - if (!tempStr || !pointSize) + if (!tempStr || !pointSize) { return qfalse; } @@ -2032,9 +2038,9 @@ qboolean CG_Asset_Parse(const char **p) } // smallFont - if (Q_stricmp(token, "smallFont") == 0) + if (Q_stricmp(token, "smallFont") == 0) { - if (!COM_ParseString(p, &tempStr) || !COM_ParseInt(p, &pointSize)) + if (!COM_ParseString(p, &tempStr) || !COM_ParseInt(p, &pointSize)) { return qfalse; } @@ -2043,10 +2049,10 @@ qboolean CG_Asset_Parse(const char **p) } // font - if (Q_stricmp(token, "bigfont") == 0) + if (Q_stricmp(token, "bigfont") == 0) { int pointSize; - if (!COM_ParseString(p, &tempStr) || !COM_ParseInt(p, &pointSize)) + if (!COM_ParseString(p, &tempStr) || !COM_ParseInt(p, &pointSize)) { return qfalse; } @@ -2055,9 +2061,9 @@ qboolean CG_Asset_Parse(const char **p) } // gradientbar - if (Q_stricmp(token, "gradientbar") == 0) + if (Q_stricmp(token, "gradientbar") == 0) { - if (!COM_ParseString(p, &tempStr)) + if (!COM_ParseString(p, &tempStr)) { return qfalse; } @@ -2066,9 +2072,9 @@ qboolean CG_Asset_Parse(const char **p) } // enterMenuSound - if (Q_stricmp(token, "menuEnterSound") == 0) + if (Q_stricmp(token, "menuEnterSound") == 0) { - if (!COM_ParseString(p, &tempStr)) + if (!COM_ParseString(p, &tempStr)) { return qfalse; } @@ -2077,9 +2083,9 @@ qboolean CG_Asset_Parse(const char **p) } // exitMenuSound - if (Q_stricmp(token, "menuExitSound") == 0) + if (Q_stricmp(token, "menuExitSound") == 0) { - if (!COM_ParseString(p, &tempStr)) + if (!COM_ParseString(p, &tempStr)) { return qfalse; } @@ -2088,9 +2094,9 @@ qboolean CG_Asset_Parse(const char **p) } // itemFocusSound - if (Q_stricmp(token, "itemFocusSound") == 0) + if (Q_stricmp(token, "itemFocusSound") == 0) { - if (!COM_ParseString(p, &tempStr)) + if (!COM_ParseString(p, &tempStr)) { return qfalse; } @@ -2099,9 +2105,9 @@ qboolean CG_Asset_Parse(const char **p) } // menuBuzzSound - if (Q_stricmp(token, "menuBuzzSound") == 0) + if (Q_stricmp(token, "menuBuzzSound") == 0) { - if (!COM_ParseString(p, &tempStr)) + if (!COM_ParseString(p, &tempStr)) { return qfalse; } @@ -2109,9 +2115,9 @@ qboolean CG_Asset_Parse(const char **p) continue; } - if (Q_stricmp(token, "cursor") == 0) + if (Q_stricmp(token, "cursor") == 0) { -// if (!COM_ParseString(p, &cgDC.Assets.cursorStr)) +// if (!COM_ParseString(p, &cgDC.Assets.cursorStr)) // { // return qfalse; // } @@ -2119,55 +2125,55 @@ qboolean CG_Asset_Parse(const char **p) continue; } - if (Q_stricmp(token, "fadeClamp") == 0) + if (Q_stricmp(token, "fadeClamp") == 0) { -// if (!COM_ParseFloat(p, &cgDC.Assets.fadeClamp)) +// if (!COM_ParseFloat(p, &cgDC.Assets.fadeClamp)) // { // return qfalse; // } continue; } - if (Q_stricmp(token, "fadeCycle") == 0) + if (Q_stricmp(token, "fadeCycle") == 0) { -// if (!COM_ParseInt(p, &cgDC.Assets.fadeCycle)) +// if (!COM_ParseInt(p, &cgDC.Assets.fadeCycle)) // { // return qfalse; // } continue; } - if (Q_stricmp(token, "fadeAmount") == 0) + if (Q_stricmp(token, "fadeAmount") == 0) { -// if (!COM_ParseFloat(p, &cgDC.Assets.fadeAmount)) +// if (!COM_ParseFloat(p, &cgDC.Assets.fadeAmount)) // { // return qfalse; // } continue; } - if (Q_stricmp(token, "shadowX") == 0) + if (Q_stricmp(token, "shadowX") == 0) { -// if (!COM_ParseFloat(p, &cgDC.Assets.shadowX)) +// if (!COM_ParseFloat(p, &cgDC.Assets.shadowX)) // { // return qfalse; // } continue; } - if (Q_stricmp(token, "shadowY") == 0) + if (Q_stricmp(token, "shadowY") == 0) { -// if (!COM_ParseFloat(p, &cgDC.Assets.shadowY)) +// if (!COM_ParseFloat(p, &cgDC.Assets.shadowY)) // { // return qfalse; // } continue; } - if (Q_stricmp(token, "shadowColor") == 0) + if (Q_stricmp(token, "shadowColor") == 0) { /* - if (!PC_Color_Parse(handle, &cgDC.Assets.shadowColor)) + if (!PC_Color_Parse(handle, &cgDC.Assets.shadowColor)) { return qfalse; } @@ -2186,7 +2192,7 @@ void cgi_UI_EndParseSession(char *buf); CG_ParseMenu(); ================= */ -void CG_ParseMenu(const char *menuFile) +void CG_ParseMenu(const char *menuFile) { char *token; int result; @@ -2208,7 +2214,7 @@ void CG_ParseMenu(const char *menuFile) } p = buf; - while ( 1 ) + while ( 1 ) { cgi_UI_ParseExt(&token); @@ -2233,19 +2239,19 @@ void CG_ParseMenu(const char *menuFile) // break; //} -// if ( *token == '}' ) +// if ( *token == '}' ) // { // break; // } - if (Q_stricmp(token, "assetGlobalDef") == 0) + if (Q_stricmp(token, "assetGlobalDef") == 0) { /* - if (CG_Asset_Parse(handle)) + if (CG_Asset_Parse(handle)) { continue; - } - else + } + else { break; } @@ -2253,7 +2259,7 @@ void CG_ParseMenu(const char *menuFile) } - if (Q_stricmp(token, "menudef") == 0) + if (Q_stricmp(token, "menudef") == 0) { // start a new menu cgi_UI_Menu_New(p); @@ -2270,33 +2276,33 @@ CG_Load_Menu(); ================= */ -qboolean CG_Load_Menu( const char **p) +qboolean CG_Load_Menu( const char **p) { const char *token; token = COM_ParseExt(p, qtrue); - if (token[0] != '{') + if (token[0] != '{') { return qfalse; } - while ( 1 ) + while ( 1 ) { token = COM_ParseExt(p, qtrue); - - if (Q_stricmp(token, "}") == 0) + + if (Q_stricmp(token, "}") == 0) { return qtrue; } - if ( !token || token[0] == 0 ) + if ( !token || token[0] == 0 ) { return qfalse; } - CG_ParseMenu(token); + CG_ParseMenu(token); } return qfalse; } @@ -2307,7 +2313,7 @@ CG_LoadMenus(); ================= */ -void CG_LoadMenus(const char *menuFile) +void CG_LoadMenus(const char *menuFile) { const char *token; const char *p; @@ -2318,18 +2324,18 @@ void CG_LoadMenus(const char *menuFile) start = cgi_Milliseconds(); len = cgi_FS_FOpenFile( menuFile, &f, FS_READ ); - if ( !f ) + if ( !f ) { //cgi_Error( va( S_COLOR_YELLOW "menu file not found: %s, using default\n", menuFile ) ); // what. this would not run cgi_Printf( va( S_COLOR_YELLOW "menu file not found: %s, using default\n", menuFile ) ); // the rest at all.. --eez len = cgi_FS_FOpenFile( "ui/jk2hud.txt", &f, FS_READ ); - if (!f) + if (!f) { cgi_Error( va( S_COLOR_RED "default menu file not found: ui/hud.txt, unable to continue!\n", menuFile ) ); } } - if ( len >= MAX_MENUDEFFILE ) + if ( len >= MAX_MENUDEFFILE ) { cgi_FS_FCloseFile( f ); cgi_Error( va( S_COLOR_RED "menu file too large: %s is %i, max allowed is %i", menuFile, len, MAX_MENUDEFFILE ) ); @@ -2339,7 +2345,7 @@ void CG_LoadMenus(const char *menuFile) cgi_FS_Read( buf, len, f ); buf[len] = 0; cgi_FS_FCloseFile( f ); - + // COM_Compress(buf); // cgi_UI_Menu_Reset(); @@ -2347,26 +2353,26 @@ void CG_LoadMenus(const char *menuFile) p = buf; COM_BeginParseSession(); - while ( 1 ) + while ( 1 ) { token = COM_ParseExt( &p, qtrue ); - if( !token || token[0] == 0 || token[0] == '}') + if( !token || token[0] == 0 || token[0] == '}') { break; } - if ( Q_stricmp( token, "}" ) == 0 ) + if ( Q_stricmp( token, "}" ) == 0 ) { break; } - if (Q_stricmp(token, "loadmenu") == 0) + if (Q_stricmp(token, "loadmenu") == 0) { - if (CG_Load_Menu(&p)) + if (CG_Load_Menu(&p)) { continue; - } - else + } + else { break; } @@ -2383,7 +2389,7 @@ CG_LoadHudMenu(); ================= */ -void CG_LoadHudMenu(void) +void CG_LoadHudMenu(void) { const char *hudSet; /* @@ -2397,7 +2403,7 @@ void CG_LoadHudMenu(void) cgDC.registerModel = &trap_R_RegisterModel; cgDC.modelBounds = &trap_R_ModelBounds; cgDC.fillRect = &CG_FillRect; - cgDC.drawRect = &CG_DrawRect; + cgDC.drawRect = &CG_DrawRect; cgDC.drawSides = &CG_DrawSides; cgDC.drawTopBottom = &CG_DrawTopBottom; cgDC.clearScene = &trap_R_ClearScene; @@ -2419,8 +2425,8 @@ void CG_LoadHudMenu(void) cgDC.feederItemImage = &CG_FeederItemImage; cgDC.feederItemText = &CG_FeederItemText; cgDC.feederSelection = &CG_FeederSelection; - cgDC.Error = &Com_Error; - cgDC.Print = &Com_Printf; + cgDC.Error = &Com_Error; + cgDC.Print = &Com_Printf; cgDC.ownerDrawWidth = &CG_OwnerDrawWidth; cgDC.registerSound = &trap_S_RegisterSound; cgDC.startBackgroundTrack = &trap_S_StartBackgroundTrack; @@ -2429,15 +2435,15 @@ void CG_LoadHudMenu(void) cgDC.stopCinematic = &CG_StopCinematic; cgDC.drawCinematic = &CG_DrawCinematic; cgDC.runCinematicFrame = &CG_RunCinematicFrame; -*/ +*/ // Init_Display(&cgDC); // cgi_UI_String_Init(); // cgi_UI_Menu_Reset(); - + hudSet = cg_hudFiles.string; - if (hudSet[0] == '\0') + if (hudSet[0] == '\0') { hudSet = "ui/jk2hud.txt"; } @@ -2459,7 +2465,7 @@ INVENTORY SELECTION CG_InventorySelectable =============== */ -static qboolean CG_InventorySelectable( int index) +static qboolean CG_InventorySelectable( int index) { if (cg.snap->ps.inventory[index]) // Is there any in the inventory? { @@ -2495,28 +2501,28 @@ static void SetInventoryTime(void) CG_DPPrevInventory_f =============== */ -void CG_DPPrevInventory_f( void ) +void CG_DPPrevInventory_f( void ) { int i; - if ( !cg.snap ) + if ( !cg.snap ) { return; } const int original = cg.DataPadInventorySelect; - for ( i = 0 ; i < INV_MAX ; i++ ) + for ( i = 0 ; i < INV_MAX ; i++ ) { cg.DataPadInventorySelect--; if ((cg.DataPadInventorySelect < INV_ELECTROBINOCULARS) || (cg.DataPadInventorySelect >= INV_MAX)) - { - cg.DataPadInventorySelect = (INV_MAX - 1); + { + cg.DataPadInventorySelect = (INV_MAX - 1); } - + if ( CG_InventorySelectable( cg.DataPadInventorySelect ) ) - { + { return; } } @@ -2528,28 +2534,28 @@ void CG_DPPrevInventory_f( void ) CG_DPNextInventory_f =============== */ -void CG_DPNextInventory_f( void ) +void CG_DPNextInventory_f( void ) { int i; - if ( !cg.snap ) + if ( !cg.snap ) { return; } const int original = cg.DataPadInventorySelect; - for ( i = 0 ; i < INV_MAX ; i++ ) + for ( i = 0 ; i < INV_MAX ; i++ ) { cg.DataPadInventorySelect++; if ((cg.DataPadInventorySelect < INV_ELECTROBINOCULARS) || (cg.DataPadInventorySelect >= INV_MAX)) - { - cg.DataPadInventorySelect = INV_ELECTROBINOCULARS; + { + cg.DataPadInventorySelect = INV_ELECTROBINOCULARS; } - if ( CG_InventorySelectable( cg.DataPadInventorySelect ) && (inv_icons[cg.DataPadInventorySelect])) - { + if ( CG_InventorySelectable( cg.DataPadInventorySelect ) && (inv_icons[cg.DataPadInventorySelect])) + { return; } } @@ -2562,19 +2568,19 @@ void CG_DPNextInventory_f( void ) CG_NextInventory_f =============== */ -void CG_NextInventory_f( void ) +void CG_NextInventory_f( void ) { int i; float *color; - if ( !cg.snap ) + if ( !cg.snap ) { return; } // The first time it's been hit so just show inventory but don't advance in inventory. - color = CG_FadeColor( cg.inventorySelectTime, WEAPON_SELECT_TIME ); - if ( !color ) + color = CG_FadeColor( cg.inventorySelectTime, WEAPON_SELECT_TIME ); + if ( !color ) { SetInventoryTime(); return; @@ -2582,17 +2588,17 @@ void CG_NextInventory_f( void ) const int original = cg.inventorySelect; - for ( i = 0 ; i < INV_MAX ; i++ ) + for ( i = 0 ; i < INV_MAX ; i++ ) { cg.inventorySelect++; if ((cg.inventorySelect < INV_ELECTROBINOCULARS) || (cg.inventorySelect >= INV_MAX)) - { - cg.inventorySelect = INV_ELECTROBINOCULARS; + { + cg.inventorySelect = INV_ELECTROBINOCULARS; } - if ( CG_InventorySelectable( cg.inventorySelect ) && (inv_icons[cg.inventorySelect])) - { + if ( CG_InventorySelectable( cg.inventorySelect ) && (inv_icons[cg.inventorySelect])) + { cgi_S_StartSound (NULL, 0, CHAN_AUTO, cgs.media.selectSound2 ); SetInventoryTime(); return; @@ -2616,19 +2622,19 @@ this func was moved to Cmd_UseInventory_f in g_cmds.cpp CG_PrevInventory_f =============== */ -void CG_PrevInventory_f( void ) +void CG_PrevInventory_f( void ) { int i; float *color; - if ( !cg.snap ) + if ( !cg.snap ) { return; } // The first time it's been hit so just show inventory but don't advance in inventory. - color = CG_FadeColor( cg.inventorySelectTime, WEAPON_SELECT_TIME ); - if ( !color ) + color = CG_FadeColor( cg.inventorySelectTime, WEAPON_SELECT_TIME ); + if ( !color ) { SetInventoryTime(); return; @@ -2636,17 +2642,17 @@ void CG_PrevInventory_f( void ) const int original = cg.inventorySelect; - for ( i = 0 ; i < INV_MAX ; i++ ) + for ( i = 0 ; i < INV_MAX ; i++ ) { cg.inventorySelect--; if ((cg.inventorySelect < INV_ELECTROBINOCULARS) || (cg.inventorySelect >= INV_MAX)) - { - cg.inventorySelect = (INV_MAX - 1); + { + cg.inventorySelect = (INV_MAX - 1); } - - if ( CG_InventorySelectable( cg.inventorySelect ) && (inv_icons[cg.inventorySelect])) - { + + if ( CG_InventorySelectable( cg.inventorySelect ) && (inv_icons[cg.inventorySelect])) + { cgi_S_StartSound (NULL, 0, CHAN_AUTO, cgs.media.selectSound2 ); SetInventoryTime(); return; @@ -2696,7 +2702,7 @@ gitem_t *FindInventoryItemTag(int tag) } */ - for ( i = 1 ; i < bg_numItems ; i++ ) + for ( i = 1 ; i < bg_numItems ; i++ ) { if ( bg_itemlist[i].giTag == tag && bg_itemlist[i].giType == IT_HOLDABLE ) // I guess giTag's aren't unique amongst items..must also make sure it's a holdable { @@ -2715,7 +2721,7 @@ gitem_t *FindInventoryItemTag(int tag) CG_DrawInventorySelect =================== */ -void CG_DrawInventorySelect( void ) +void CG_DrawInventorySelect( void ) { int i; int sideMax,holdCount,iconCnt; @@ -2730,7 +2736,7 @@ void CG_DrawInventorySelect( void ) char text[1024]={0}; // don't display if dead - if ( cg.predicted_player_state.stats[STAT_HEALTH] <= 0 || ( cg.snap->ps.viewEntity > 0 && cg.snap->ps.viewEntity < ENTITYNUM_WORLD )) + if ( cg.predicted_player_state.stats[STAT_HEALTH] <= 0 || ( cg.snap->ps.viewEntity > 0 && cg.snap->ps.viewEntity < ENTITYNUM_WORLD )) { return; } @@ -2755,9 +2761,9 @@ void CG_DrawInventorySelect( void ) // count the number of items owned count = 0; - for ( i = 0 ; i < INV_MAX ; i++ ) + for ( i = 0 ; i < INV_MAX ; i++ ) { - if (CG_InventorySelectable(i) && inv_icons[i]) + if (CG_InventorySelectable(i) && inv_icons[i]) { count++; } @@ -2766,7 +2772,7 @@ void CG_DrawInventorySelect( void ) if (!count) { cgi_SP_GetStringTextString("INGAME_EMPTY_INV",text, sizeof(text) ); - int w = cgi_R_Font_StrLenPixels( text, cgs.media.qhFontSmall, 1.0f ); + int w = cgi_R_Font_StrLenPixels( text, cgs.media.qhFontSmall, 1.0f ); x = ( SCREEN_WIDTH - w ) / 2; CG_DrawProportionalString(x, y2 + 22, text, CG_CENTER | CG_SMALLFONT, colorTable[CT_ICON_BLUE]); return; @@ -2831,7 +2837,7 @@ void CG_DrawInventorySelect( void ) CG_DrawPic( holdX, y+10, smallIconSize, smallIconSize, inv_icons[i] ); cgi_R_SetColor(colorTable[CT_ICON_BLUE]); - CG_DrawNumField (holdX + addX, y + smallIconSize, 2, cg.snap->ps.inventory[i], 6, 12, + CG_DrawNumField (holdX + addX, y + smallIconSize, 2, cg.snap->ps.inventory[i], 6, 12, NUM_FONT_SMALL,qfalse); holdX -= (smallIconSize+pad); @@ -2846,7 +2852,7 @@ void CG_DrawInventorySelect( void ) CG_DrawPic( x-(bigIconSize/2), (y-((bigIconSize-smallIconSize)/2))+10, bigIconSize, bigIconSize, inv_icons[cg.inventorySelect] ); addX = (float) bigIconSize * .75; cgi_R_SetColor(colorTable[CT_ICON_BLUE]); - CG_DrawNumField ((x-(bigIconSize/2)) + addX, y, 2, cg.snap->ps.inventory[cg.inventorySelect], 6, 12, + CG_DrawNumField ((x-(bigIconSize/2)) + addX, y, 2, cg.snap->ps.inventory[cg.inventorySelect], 6, 12, NUM_FONT_SMALL,qfalse); if (inv_names[cg.inventorySelect]) @@ -2859,10 +2865,10 @@ void CG_DrawInventorySelect( void ) char itemName[256], data[1024]; // FIXME: do these really need to be this large?? does it matter? sprintf( itemName, "INGAME_%s", item->classname ); - + if ( cgi_SP_GetStringTextString( itemName, data, sizeof( data ))) { - int w = cgi_R_Font_StrLenPixels( data, cgs.media.qhFontSmall, 1.0f ); + int w = cgi_R_Font_StrLenPixels( data, cgs.media.qhFontSmall, 1.0f ); int x = ( SCREEN_WIDTH - w ) / 2; cgi_R_Font_DrawString( x, (SCREEN_HEIGHT - 24), data, textColor, cgs.media.qhFontSmall, -1, 1.0f); @@ -2870,8 +2876,8 @@ void CG_DrawInventorySelect( void ) } // if (tag) // { -// CG_DrawProportionalString(320, y + 53, inv_names[cg.inventorySelect], CG_CENTER | CG_SMALLFONT, colorTable[CT_ICON_BLUE]); -// CG_DrawProportionalString(320, y + 53, bg_itemlist[i].pickup_name, CG_CENTER | CG_SMALLFONT, colorTable[CT_ICON_BLUE]); +// CG_DrawProportionalString(320, y + 53, inv_names[cg.inventorySelect], CG_CENTER | CG_SMALLFONT, colorTable[CT_ICON_BLUE]); +// CG_DrawProportionalString(320, y + 53, bg_itemlist[i].pickup_name, CG_CENTER | CG_SMALLFONT, colorTable[CT_ICON_BLUE]); // } } } @@ -2907,7 +2913,7 @@ void CG_DrawInventorySelect( void ) CG_DrawPic( holdX, y+10, smallIconSize, smallIconSize, inv_icons[i] ); cgi_R_SetColor(colorTable[CT_ICON_BLUE]); - CG_DrawNumField (holdX + addX, y + smallIconSize, 2, cg.snap->ps.inventory[i], 6, 12, + CG_DrawNumField (holdX + addX, y + smallIconSize, 2, cg.snap->ps.inventory[i], 6, 12, NUM_FONT_SMALL,qfalse); holdX += (smallIconSize+pad); @@ -2917,7 +2923,7 @@ void CG_DrawInventorySelect( void ) int cgi_UI_GetItemText(char *menuFile,char *itemName, char *text); -char *inventoryDesc[15] = +char *inventoryDesc[15] = { "NEURO_SAAV_DESC", "BACTA_DESC", @@ -2934,7 +2940,7 @@ char *inventoryDesc[15] = CG_DrawDataPadInventorySelect =================== */ -void CG_DrawDataPadInventorySelect( void ) +void CG_DrawDataPadInventorySelect( void ) { int i; int sideMax,holdCount,iconCnt; @@ -2950,9 +2956,9 @@ void CG_DrawDataPadInventorySelect( void ) // count the number of items owned count = 0; - for ( i = 0 ; i < INV_MAX ; i++ ) + for ( i = 0 ; i < INV_MAX ; i++ ) { - if (CG_InventorySelectable(i) && inv_icons[i]) + if (CG_InventorySelectable(i) && inv_icons[i]) { count++; } @@ -2962,7 +2968,7 @@ void CG_DrawDataPadInventorySelect( void ) if (!count) { cgi_SP_GetStringTextString("INGAME_EMPTY_INV",text, sizeof(text) ); - int w = cgi_R_Font_StrLenPixels( text, cgs.media.qhFontSmall, 1.0f ); + int w = cgi_R_Font_StrLenPixels( text, cgs.media.qhFontSmall, 1.0f ); x = ( SCREEN_WIDTH - w ) / 2; CG_DrawProportionalString(x, 300 + 22, text, CG_CENTER | CG_SMALLFONT, colorTable[CT_ICON_BLUE]); return; @@ -3030,7 +3036,7 @@ void CG_DrawDataPadInventorySelect( void ) CG_DrawPic( holdX, y+10, smallIconSize, smallIconSize, inv_icons[i] ); cgi_R_SetColor(colorTable[CT_ICON_BLUE]); - CG_DrawNumField (holdX + addX, y + smallIconSize, 2, cg.snap->ps.inventory[i], 6, 12, + CG_DrawNumField (holdX + addX, y + smallIconSize, 2, cg.snap->ps.inventory[i], 6, 12, NUM_FONT_SMALL,qfalse); holdX -= (smallIconSize+pad); @@ -3045,7 +3051,7 @@ void CG_DrawDataPadInventorySelect( void ) CG_DrawPic( x-(bigIconSize/2), (y-((bigIconSize-smallIconSize)/2))+10, bigIconSize, bigIconSize, inv_icons[cg.DataPadInventorySelect] ); addX = (float) bigIconSize * .75; cgi_R_SetColor(colorTable[CT_ICON_BLUE]); - CG_DrawNumField ((x-(bigIconSize/2)) + addX, y, 2, cg.snap->ps.inventory[cg.DataPadInventorySelect], 6, 12, + CG_DrawNumField ((x-(bigIconSize/2)) + addX, y, 2, cg.snap->ps.inventory[cg.DataPadInventorySelect], 6, 12, NUM_FONT_SMALL,qfalse); if (inv_names[cg.DataPadInventorySelect]) @@ -3055,8 +3061,8 @@ void CG_DrawDataPadInventorySelect( void ) // if (tag) // { -// CG_DrawProportionalString(320, y + 53, inv_names[cg.inventorySelect], CG_CENTER | CG_SMALLFONT, colorTable[CT_ICON_BLUE]); -// CG_DrawProportionalString(320, y + 53, bg_itemlist[i].pickup_name, CG_CENTER | CG_SMALLFONT, colorTable[CT_ICON_BLUE]); +// CG_DrawProportionalString(320, y + 53, inv_names[cg.inventorySelect], CG_CENTER | CG_SMALLFONT, colorTable[CT_ICON_BLUE]); +// CG_DrawProportionalString(320, y + 53, bg_itemlist[i].pickup_name, CG_CENTER | CG_SMALLFONT, colorTable[CT_ICON_BLUE]); // } } } @@ -3092,7 +3098,7 @@ void CG_DrawDataPadInventorySelect( void ) CG_DrawPic( holdX, y+10, smallIconSize, smallIconSize, inv_icons[i] ); cgi_R_SetColor(colorTable[CT_ICON_BLUE]); - CG_DrawNumField (holdX + addX, y + smallIconSize, 2, cg.snap->ps.inventory[i], 6, 12, + CG_DrawNumField (holdX + addX, y + smallIconSize, 2, cg.snap->ps.inventory[i], 6, 12, NUM_FONT_SMALL,qfalse); holdX += (smallIconSize+pad); @@ -3112,7 +3118,7 @@ void CG_DrawDataPadInventorySelect( void ) CG_DisplayBoxedText(70,50,500,300,text, cgs.media.qhFontSmall, 0.7f, - textColor + textColor ); } } @@ -3138,7 +3144,7 @@ void SetForcePowerTime(void) } } -int showPowers[MAX_SHOWPOWERS] = +int showPowers[MAX_SHOWPOWERS] = { FP_HEAL, FP_SPEED, @@ -3148,7 +3154,7 @@ int showPowers[MAX_SHOWPOWERS] = FP_GRIP, FP_LIGHTNING }; -char *showPowersName[MAX_SHOWPOWERS] = +char *showPowersName[MAX_SHOWPOWERS] = { "HEAL2", "SPEED2", @@ -3159,7 +3165,7 @@ char *showPowersName[MAX_SHOWPOWERS] = "LIGHTNING2", }; -int showDataPadPowers[MAX_DPSHOWPOWERS] = +int showDataPadPowers[MAX_DPSHOWPOWERS] = { FP_HEAL, FP_LEVITATION, @@ -3174,7 +3180,7 @@ int showDataPadPowers[MAX_DPSHOWPOWERS] = FP_SABER_OFFENSE, }; -/*char *showDataPadPowersName[MAX_DPSHOWPOWERS] = +/*char *showDataPadPowersName[MAX_DPSHOWPOWERS] = { "HEAL2", "JUMP2", @@ -3201,7 +3207,7 @@ qboolean ForcePower_Valid(int index) assert (MAX_SHOWPOWERS == ( sizeof(showPowers)/sizeof(showPowers[0]) )); assert (index < MAX_SHOWPOWERS ); //is this a valid index? - if (player->client->ps.forcePowersKnown & (1 << showPowers[index]) && + if (player->client->ps.forcePowersKnown & (1 << showPowers[index]) && player->client->ps.forcePowerLevel[showPowers[index]]) // Does he have the force power? { return qtrue; @@ -3215,11 +3221,11 @@ qboolean ForcePower_Valid(int index) CG_NextForcePower_f =============== */ -void CG_NextForcePower_f( void ) +void CG_NextForcePower_f( void ) { int i; - if ( !cg.snap ) + if ( !cg.snap ) { return; } @@ -3233,13 +3239,13 @@ void CG_NextForcePower_f( void ) const int original = cg.forcepowerSelect; - for ( i = 0; i < MAX_SHOWPOWERS; i++ ) + for ( i = 0; i < MAX_SHOWPOWERS; i++ ) { cg.forcepowerSelect++; if (cg.forcepowerSelect >= MAX_SHOWPOWERS) - { - cg.forcepowerSelect = 0; + { + cg.forcepowerSelect = 0; } if (ForcePower_Valid(cg.forcepowerSelect)) // Does he have the force power? @@ -3257,11 +3263,11 @@ void CG_NextForcePower_f( void ) CG_PrevForcePower_f =============== */ -void CG_PrevForcePower_f( void ) +void CG_PrevForcePower_f( void ) { int i; - if ( !cg.snap ) + if ( !cg.snap ) { return; } @@ -3275,13 +3281,13 @@ void CG_PrevForcePower_f( void ) const int original = cg.forcepowerSelect; - for ( i = 0; i < MAX_SHOWPOWERS; i++ ) + for ( i = 0; i < MAX_SHOWPOWERS; i++ ) { cg.forcepowerSelect--; if (cg.forcepowerSelect < 0) - { - cg.forcepowerSelect = MAX_SHOWPOWERS - 1; + { + cg.forcepowerSelect = MAX_SHOWPOWERS - 1; } if (ForcePower_Valid(cg.forcepowerSelect)) // Does he have the force power? @@ -3300,7 +3306,7 @@ void CG_PrevForcePower_f( void ) CG_DrawForceSelect =================== */ -void CG_DrawForceSelect( void ) +void CG_DrawForceSelect( void ) { int i; int count; @@ -3312,7 +3318,7 @@ void CG_DrawForceSelect( void ) // don't display if dead - if ( cg.predicted_player_state.stats[STAT_HEALTH] <= 0 || ( cg.snap->ps.viewEntity > 0 && cg.snap->ps.viewEntity < ENTITYNUM_WORLD )) + if ( cg.predicted_player_state.stats[STAT_HEALTH] <= 0 || ( cg.snap->ps.viewEntity > 0 && cg.snap->ps.viewEntity < ENTITYNUM_WORLD )) { return; } @@ -3402,7 +3408,7 @@ void CG_DrawForceSelect( void ) if (force_icons[showPowers[i]]) { - CG_DrawPic( holdX, y, smallIconSize, smallIconSize, force_icons[showPowers[i]] ); + CG_DrawPic( holdX, y, smallIconSize, smallIconSize, force_icons[showPowers[i]] ); holdX -= (smallIconSize+pad); } } @@ -3446,7 +3452,7 @@ void CG_DrawForceSelect( void ) // This only a temp solution. if (cgi_SP_GetStringTextString( va("INGAME_%s",showPowersName[cg.forcepowerSelect]), text, sizeof(text) )) { - int w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 1.0f); + int w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 1.0f); int x = ( SCREEN_WIDTH - w ) / 2; cgi_R_Font_DrawString(x, (SCREEN_HEIGHT - 24), text, colorTable[CT_ICON_BLUE], cgs.media.qhFontSmall, -1, 1.0f); } @@ -3462,7 +3468,7 @@ qboolean ForcePowerDataPad_Valid(int index) gentity_t *player = &g_entities[0]; assert (index < MAX_DPSHOWPOWERS); - if (player->client->ps.forcePowersKnown & (1 << showDataPadPowers[index]) && + if (player->client->ps.forcePowersKnown & (1 << showDataPadPowers[index]) && player->client->ps.forcePowerLevel[showDataPadPowers[index]]) // Does he have the force power? { return qtrue; @@ -3476,25 +3482,25 @@ qboolean ForcePowerDataPad_Valid(int index) CG_DPNextForcePower_f =============== */ -void CG_DPNextForcePower_f( void ) +void CG_DPNextForcePower_f( void ) { int i; int original; - if ( !cg.snap ) + if ( !cg.snap ) { return; } original = cg.DataPadforcepowerSelect; - for ( i = 0; i= MAX_DPSHOWPOWERS) - { - cg.DataPadforcepowerSelect = 0; + { + cg.DataPadforcepowerSelect = 0; } if (ForcePowerDataPad_Valid(cg.DataPadforcepowerSelect)) // Does he have the force power? @@ -3511,25 +3517,25 @@ void CG_DPNextForcePower_f( void ) CG_DPPrevForcePower_f =============== */ -void CG_DPPrevForcePower_f( void ) +void CG_DPPrevForcePower_f( void ) { int i; int original; - if ( !cg.snap ) + if ( !cg.snap ) { return; } original = cg.DataPadforcepowerSelect; - for ( i = 0; i. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_marks.c -- wall marks @@ -123,7 +128,7 @@ passed to the renderer. #define MAX_MARK_FRAGMENTS 128 #define MAX_MARK_POINTS 384 -void CG_ImpactMark( qhandle_t markShader, const vec3_t origin, const vec3_t dir, +void CG_ImpactMark( qhandle_t markShader, const vec3_t origin, const vec3_t dir, float orientation, float red, float green, float blue, float alpha, qboolean alphaFade, float radius, qboolean temporary ) { vec3_t axis[3]; @@ -189,7 +194,9 @@ void CG_ImpactMark( qhandle_t markShader, const vec3_t origin, const vec3_t dir, VectorSubtract( v->xyz, origin, delta ); v->st[0] = 0.5 + DotProduct( delta, axis[1] ) * texCoordScale; v->st[1] = 0.5 + DotProduct( delta, axis[2] ) * texCoordScale; - *(int *)v->modulate = *(int *)colors; + for ( int k = 0; k < 4; k++ ) { + v->modulate[k] = colors[k]; + } } // if it is a temporary (shadow) mark, add it immediately and forget about it @@ -244,7 +251,7 @@ void CG_AddMarks( void ) { } // fade out the energy bursts - if ( mp->markShader == cgs.media.phaserMarkShader ) + if ( mp->markShader == cgs.media.phaserMarkShader ) { fade = 450 - 450 * ( (cg.time - mp->time ) / 3000.0 ); @@ -271,7 +278,7 @@ void CG_AddMarks( void ) { mp->verts[j].modulate[3] = fade; } } - else + else { float f = (float)t / MARK_FADE_TIME; for ( j = 0 ; j < mp->poly.numVerts ; j++ ) { diff --git a/codeJK2/cgame/cg_media.h b/codeJK2/cgame/cg_media.h index 982b472105..5c24c4e15a 100644 --- a/codeJK2/cgame/cg_media.h +++ b/codeJK2/cgame/cg_media.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __CG_MEDIA_H_ #define __CG_MEDIA_H_ @@ -51,7 +56,7 @@ extern forceTicPos_t ammoTicPos[]; #define NUM_CHUNK_MODELS 4 -enum +enum { CHUNK_METAL1 = 0, CHUNK_METAL2, @@ -228,7 +233,6 @@ typedef struct { // sounds sfxHandle_t disintegrateSound; sfxHandle_t disintegrate2Sound; - sfxHandle_t disintegrate3Sound; sfxHandle_t grenadeBounce1; sfxHandle_t grenadeBounce2; @@ -236,7 +240,7 @@ typedef struct { sfxHandle_t flechetteStickSound; sfxHandle_t detPackStickSound; sfxHandle_t tripMineStickSound; - + sfxHandle_t selectSound; sfxHandle_t selectSound2; sfxHandle_t overchargeSlowSound; @@ -249,7 +253,7 @@ typedef struct { sfxHandle_t talkSound; sfxHandle_t noAmmoSound; - + sfxHandle_t landSound; sfxHandle_t rollSound; sfxHandle_t messageLitSound; @@ -257,7 +261,7 @@ typedef struct { sfxHandle_t interfaceSnd1; sfxHandle_t interfaceSnd2; sfxHandle_t interfaceSnd3; - + sfxHandle_t batteryChargeSound; sfxHandle_t watrInSound; @@ -269,7 +273,7 @@ typedef struct { sfxHandle_t zoomLoop; sfxHandle_t zoomEnd; sfxHandle_t disruptorZoomLoop; - + //blaster reflection sounds sfxHandle_t blasterReflectSound[3]; @@ -326,7 +330,7 @@ typedef struct { glconfig_t glconfig; // rendering configuration int serverCommandSequence; // reliable command stream counter - + // parsed from serverinfo int dmflags; int teamflags; diff --git a/codeJK2/cgame/cg_players.cpp b/codeJK2/cgame/cg_players.cpp index b573178342..4988fb4e66 100644 --- a/codeJK2/cgame/cg_players.cpp +++ b/codeJK2/cgame/cg_players.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "cg_local.h" #include "../game/g_local.h" @@ -38,8 +43,8 @@ taken from the entityState_t */ -qboolean CG_RegisterClientModelname( clientInfo_t *ci, const char *headModelName, const char *headSkinName, - const char *torsoModelName, const char *torsoSkinName, +qboolean CG_RegisterClientModelname( clientInfo_t *ci, const char *headModelName, const char *headSkinName, + const char *torsoModelName, const char *torsoSkinName, const char *legsModelName, const char *legsSkinName ); void CG_PlayerAnimSounds( int animFileIndex, qboolean torso, int oldFrame, int frame, int entNum ); @@ -52,7 +57,7 @@ extern qboolean PM_InRoll( playerState_t *ps ); //Basic set of custom sounds that everyone needs // (keep numbers in ascending order in order for variant-capping to work) -const char *cg_customBasicSoundNames[MAX_CUSTOM_BASIC_SOUNDS] = +const char *cg_customBasicSoundNames[MAX_CUSTOM_BASIC_SOUNDS] = { "*death1.wav", "*death2.wav", @@ -72,7 +77,7 @@ const char *cg_customBasicSoundNames[MAX_CUSTOM_BASIC_SOUNDS] = //Used as a supplement to the basic set for enemies and hazard team // (keep numbers in ascending order in order for variant-capping to work) -const char *cg_customCombatSoundNames[MAX_CUSTOM_COMBAT_SOUNDS] = +const char *cg_customCombatSoundNames[MAX_CUSTOM_COMBAT_SOUNDS] = { "*anger1.wav", //Say when acquire an enemy when didn't have one before "*anger2.wav", @@ -95,7 +100,7 @@ const char *cg_customCombatSoundNames[MAX_CUSTOM_COMBAT_SOUNDS] = //Used as a supplement to the basic set for stormtroopers // (keep numbers in ascending order in order for variant-capping to work) -const char *cg_customExtraSoundNames[MAX_CUSTOM_EXTRA_SOUNDS] = +const char *cg_customExtraSoundNames[MAX_CUSTOM_EXTRA_SOUNDS] = { "*chase1.wav", "*chase2.wav", @@ -137,7 +142,7 @@ const char *cg_customExtraSoundNames[MAX_CUSTOM_EXTRA_SOUNDS] = //Used as a supplement to the basic set for jedi // (keep numbers in ascending order in order for variant-capping to work) -const char *cg_customJediSoundNames[MAX_CUSTOM_JEDI_SOUNDS] = +const char *cg_customJediSoundNames[MAX_CUSTOM_JEDI_SOUNDS] = { "*combat1.wav", "*combat2.wav", @@ -166,13 +171,13 @@ const char *cg_customJediSoundNames[MAX_CUSTOM_JEDI_SOUNDS] = // done at registration time only... // -// cuts down on sound-variant registration for low end machines, +// cuts down on sound-variant registration for low end machines, // eg *gloat1.wav (plus...2,...3) can be capped to all be just *gloat1.wav // static const char *GetCustomSound_VariantCapped(const char *ppsTable[], int iEntryNum, qboolean bForceVariant1) { extern vmCvar_t cg_VariantSoundCap; - + // const int iVariantCap = 2; // test const int &iVariantCap = cg_VariantSoundCap.integer; @@ -206,7 +211,7 @@ static const char *GetCustomSound_VariantCapped(const char *ppsTable[], int iEnt // for (int iScanNum=0; iScanNumsounds[i + iSoundEntryBase] = hSFX; } } @@ -261,17 +266,17 @@ static void CG_RegisterCustomSounds(clientInfo_t *ci, int iSoundEntryBase, CG_CustomSound NOTE: when you call this, check the value. If zero, do not try to play the sound. - Either that or when a sound that doesn't exist is played, don't play the null + Either that or when a sound that doesn't exist is played, don't play the null sound honk and don't display the error message ================ */ -static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int customSoundSet ) +static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int customSoundSet ) { clientInfo_t *ci; int i; - if ( soundName[0] != '*' ) + if ( soundName[0] != '*' ) { return cgi_S_RegisterSound( soundName ); } @@ -295,9 +300,9 @@ static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int cus // There should always be a clientInfo structure if there is a client, but just make sure... if ( ci ) { - for ( i = 0 ; i < MAX_CUSTOM_BASIC_SOUNDS && cg_customBasicSoundNames[i] ; i++ ) + for ( i = 0 ; i < MAX_CUSTOM_BASIC_SOUNDS && cg_customBasicSoundNames[i] ; i++ ) { - if ( !Q_stricmp( soundName, cg_customBasicSoundNames[i] ) ) + if ( !Q_stricmp( soundName, cg_customBasicSoundNames[i] ) ) { return ci->sounds[i]; } @@ -308,9 +313,9 @@ static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int cus // There should always be a clientInfo structure if there is a client, but just make sure... if ( ci ) { - for ( i = 0 ; i < MAX_CUSTOM_COMBAT_SOUNDS && cg_customCombatSoundNames[i] ; i++ ) + for ( i = 0 ; i < MAX_CUSTOM_COMBAT_SOUNDS && cg_customCombatSoundNames[i] ; i++ ) { - if ( !Q_stricmp( soundName, cg_customCombatSoundNames[i] ) ) + if ( !Q_stricmp( soundName, cg_customCombatSoundNames[i] ) ) { return ci->sounds[i+MAX_CUSTOM_BASIC_SOUNDS]; } @@ -321,9 +326,9 @@ static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int cus // There should always be a clientInfo structure if there is a client, but just make sure... if ( ci ) { - for ( i = 0 ; i < MAX_CUSTOM_EXTRA_SOUNDS && cg_customExtraSoundNames[i] ; i++ ) + for ( i = 0 ; i < MAX_CUSTOM_EXTRA_SOUNDS && cg_customExtraSoundNames[i] ; i++ ) { - if ( !Q_stricmp( soundName, cg_customExtraSoundNames[i] ) ) + if ( !Q_stricmp( soundName, cg_customExtraSoundNames[i] ) ) { return ci->sounds[i+MAX_CUSTOM_BASIC_SOUNDS+MAX_CUSTOM_COMBAT_SOUNDS]; } @@ -334,9 +339,9 @@ static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int cus // There should always be a clientInfo structure if there is a client, but just make sure... if ( ci ) { - for ( i = 0 ; i < MAX_CUSTOM_JEDI_SOUNDS && cg_customJediSoundNames[i] ; i++ ) + for ( i = 0 ; i < MAX_CUSTOM_JEDI_SOUNDS && cg_customJediSoundNames[i] ; i++ ) { - if ( !Q_stricmp( soundName, cg_customJediSoundNames[i] ) ) + if ( !Q_stricmp( soundName, cg_customJediSoundNames[i] ) ) { return ci->sounds[i+MAX_CUSTOM_BASIC_SOUNDS+MAX_CUSTOM_COMBAT_SOUNDS+MAX_CUSTOM_EXTRA_SOUNDS]; } @@ -347,30 +352,30 @@ static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int cus //no set specified, search all if ( ci ) { - for ( i = 0 ; i < MAX_CUSTOM_BASIC_SOUNDS && cg_customBasicSoundNames[i] ; i++ ) + for ( i = 0 ; i < MAX_CUSTOM_BASIC_SOUNDS && cg_customBasicSoundNames[i] ; i++ ) { - if ( !Q_stricmp( soundName, cg_customBasicSoundNames[i] ) ) + if ( !Q_stricmp( soundName, cg_customBasicSoundNames[i] ) ) { return ci->sounds[i]; } } - for ( i = 0 ; i < MAX_CUSTOM_COMBAT_SOUNDS && cg_customCombatSoundNames[i] ; i++ ) + for ( i = 0 ; i < MAX_CUSTOM_COMBAT_SOUNDS && cg_customCombatSoundNames[i] ; i++ ) { - if ( !Q_stricmp( soundName, cg_customCombatSoundNames[i] ) ) + if ( !Q_stricmp( soundName, cg_customCombatSoundNames[i] ) ) { return ci->sounds[i+MAX_CUSTOM_BASIC_SOUNDS]; } } - for ( i = 0 ; i < MAX_CUSTOM_EXTRA_SOUNDS && cg_customExtraSoundNames[i] ; i++ ) + for ( i = 0 ; i < MAX_CUSTOM_EXTRA_SOUNDS && cg_customExtraSoundNames[i] ; i++ ) { - if ( !Q_stricmp( soundName, cg_customExtraSoundNames[i] ) ) + if ( !Q_stricmp( soundName, cg_customExtraSoundNames[i] ) ) { return ci->sounds[i+MAX_CUSTOM_BASIC_SOUNDS+MAX_CUSTOM_COMBAT_SOUNDS]; } } - for ( i = 0 ; i < MAX_CUSTOM_JEDI_SOUNDS && cg_customJediSoundNames[i] ; i++ ) + for ( i = 0 ; i < MAX_CUSTOM_JEDI_SOUNDS && cg_customJediSoundNames[i] ; i++ ) { - if ( !Q_stricmp( soundName, cg_customJediSoundNames[i] ) ) + if ( !Q_stricmp( soundName, cg_customJediSoundNames[i] ) ) { return ci->sounds[i+MAX_CUSTOM_BASIC_SOUNDS+MAX_CUSTOM_COMBAT_SOUNDS+MAX_CUSTOM_EXTRA_SOUNDS]; } @@ -400,7 +405,7 @@ CG_NewClientinfo For player only, NPCs get them through NPC_stats and G_ModelIndex ====================== */ -void CG_NewClientinfo( int clientNum ) +void CG_NewClientinfo( int clientNum ) { clientInfo_t *ci; const char *configstring; @@ -410,7 +415,7 @@ void CG_NewClientinfo( int clientNum ) configstring = CG_ConfigString( clientNum + CS_PLAYERS ); - if ( !configstring[0] ) + if ( !configstring[0] ) { return; // player just left } @@ -435,19 +440,19 @@ void CG_NewClientinfo( int clientNum ) // legsModel v = Info_ValueForKey( configstring, "legsModel" ); - + Q_strncpyz( g_entities[clientNum].client->renderInfo.legsModelName, v, sizeof( g_entities[clientNum].client->renderInfo.legsModelName), qtrue); // torsoModel v = Info_ValueForKey( configstring, "torsoModel" ); - + Q_strncpyz( g_entities[clientNum].client->renderInfo.torsoModelName, v, - sizeof( g_entities[clientNum].client->renderInfo.torsoModelName), qtrue); - + sizeof( g_entities[clientNum].client->renderInfo.torsoModelName), qtrue); + // headModel v = Info_ValueForKey( configstring, "headModel" ); - + Q_strncpyz( g_entities[clientNum].client->renderInfo.headModelName, v, sizeof( g_entities[clientNum].client->renderInfo.headModelName), qtrue); @@ -463,10 +468,10 @@ void CG_NewClientinfo( int clientNum ) } //player uses only the basic custom sound set, not the combat or extra - CG_RegisterCustomSounds(ci, + CG_RegisterCustomSounds(ci, 0, // int iSoundEntryBase, MAX_CUSTOM_BASIC_SOUNDS, // int iTableEntries, - cg_customBasicSoundNames, // const char *ppsTable[], + cg_customBasicSoundNames, // const char *ppsTable[], ci->customBasicSoundDir // const char *psDir ); @@ -485,40 +490,40 @@ void CG_RegisterNPCCustomSounds( clientInfo_t *ci ) if ( ci->customBasicSoundDir && ci->customBasicSoundDir[0] ) { - CG_RegisterCustomSounds(ci, + CG_RegisterCustomSounds(ci, 0, // int iSoundEntryBase, MAX_CUSTOM_BASIC_SOUNDS, // int iTableEntries, - cg_customBasicSoundNames, // const char *ppsTable[], + cg_customBasicSoundNames, // const char *ppsTable[], ci->customBasicSoundDir // const char *psDir ); } if ( ci->customCombatSoundDir && ci->customCombatSoundDir[0] ) { - CG_RegisterCustomSounds(ci, + CG_RegisterCustomSounds(ci, MAX_CUSTOM_BASIC_SOUNDS, // int iSoundEntryBase, MAX_CUSTOM_COMBAT_SOUNDS, // int iTableEntries, - cg_customCombatSoundNames, // const char *ppsTable[], + cg_customCombatSoundNames, // const char *ppsTable[], ci->customCombatSoundDir // const char *psDir ); } if ( ci->customExtraSoundDir && ci->customExtraSoundDir[0] ) { - CG_RegisterCustomSounds(ci, + CG_RegisterCustomSounds(ci, MAX_CUSTOM_BASIC_SOUNDS+MAX_CUSTOM_COMBAT_SOUNDS, // int iSoundEntryBase, MAX_CUSTOM_EXTRA_SOUNDS, // int iTableEntries, - cg_customExtraSoundNames, // const char *ppsTable[], + cg_customExtraSoundNames, // const char *ppsTable[], ci->customExtraSoundDir // const char *psDir ); } if ( ci->customJediSoundDir && ci->customJediSoundDir[0] ) { - CG_RegisterCustomSounds(ci, + CG_RegisterCustomSounds(ci, MAX_CUSTOM_BASIC_SOUNDS+MAX_CUSTOM_COMBAT_SOUNDS+MAX_CUSTOM_EXTRA_SOUNDS, // int iSoundEntryBase, MAX_CUSTOM_JEDI_SOUNDS, // int iTableEntries, - cg_customJediSoundNames, // const char *ppsTable[], + cg_customJediSoundNames, // const char *ppsTable[], ci->customJediSoundDir // const char *psDir ); } @@ -573,7 +578,7 @@ qboolean ValidAnimFileIndex ( int index ) -void ParseAnimationSndBlock(const char *asb_filename, animsounds_t *animSounds, animation_t *animations, int *i,const char **text_p) +void ParseAnimationSndBlock(const char *asb_filename, animsounds_t *animSounds, animation_t *animations, int *i,const char **text_p) { const char *token; char soundString[MAX_QPATH]; @@ -581,10 +586,10 @@ void ParseAnimationSndBlock(const char *asb_filename, animsounds_t *animSounds, int animNum, num, n; // get past starting bracket - while(1) + while(1) { token = COM_Parse( text_p ); - if ( !Q_stricmp( token, "{" ) ) + if ( !Q_stricmp( token, "{" ) ) { break; } @@ -593,7 +598,7 @@ void ParseAnimationSndBlock(const char *asb_filename, animsounds_t *animSounds, animSounds += *i; // read information for each frame - while ( 1 ) + while ( 1 ) { if (*i >= MAX_ANIM_SOUNDS) { @@ -601,17 +606,17 @@ void ParseAnimationSndBlock(const char *asb_filename, animsounds_t *animSounds, } // Get base frame of sequence token = COM_Parse( text_p ); - if ( !token || !token[0]) + if ( !token || !token[0]) { break; } - if ( !Q_stricmp( token, "}" ) ) // At end of block + if ( !Q_stricmp( token, "}" ) ) // At end of block { break; } - //Compare to same table as animations used + //Compare to same table as animations used // so we don't have to use actual numbers for animation first frames, // just need offsets. //This way when animation numbers change, this table won't have to be updated, @@ -626,7 +631,7 @@ void ParseAnimationSndBlock(const char *asb_filename, animsounds_t *animSounds, if ( animations[animNum].numFrames == 0 ) {//we don't use this anim //Com_Printf(S_COLOR_YELLOW"WARNING: %s animsounds.cfg: anim %s not used by this model\n", filename, token); - + // Get offset to frame within sequence token = COM_Parse( text_p ); //get soundstring @@ -645,7 +650,7 @@ void ParseAnimationSndBlock(const char *asb_filename, animsounds_t *animSounds, // Get offset to frame within sequence token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) { break; } @@ -653,15 +658,15 @@ void ParseAnimationSndBlock(const char *asb_filename, animsounds_t *animSounds, //get soundstring token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) { break; - } + } Q_strncpyz(soundString, token, sizeof(soundString)); //get lowest value token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) {//WARNING! BAD TABLE! break; } @@ -669,7 +674,7 @@ void ParseAnimationSndBlock(const char *asb_filename, animsounds_t *animSounds, //get highest value token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) {//WARNING! BAD TABLE! break; } @@ -702,7 +707,7 @@ void ParseAnimationSndBlock(const char *asb_filename, animsounds_t *animSounds, //get probability token = COM_Parse( text_p ); - if ( !token ) + if ( !token ) {//WARNING! BAD TABLE! break; } @@ -710,7 +715,7 @@ void ParseAnimationSndBlock(const char *asb_filename, animsounds_t *animSounds, animSounds->probability = atoi( token ); ++animSounds; ++*i; - } + } } /* @@ -732,14 +737,14 @@ void CG_ClearAnimSndCache( void ) ====================== CG_ParseAnimationSndFile -Read a configuration file containing animation sounds +Read a configuration file containing animation sounds models/players/kyle/animsounds.cfg, etc This file's presence is not required ====================== */ -void CG_ParseAnimationSndFile( const char *as_filename, int animFileIndex ) +void CG_ParseAnimationSndFile( const char *as_filename, int animFileIndex ) { const char *text_p; int len; @@ -748,7 +753,7 @@ void CG_ParseAnimationSndFile( const char *as_filename, int animFileIndex ) char sfilename[MAX_QPATH]; fileHandle_t f; int i, j, upper_i, lower_i; - + assert(animFileIndex < MAX_ANIM_FILES); animsounds_t *legsAnimSnds = level.knownAnimFileSets[animFileIndex].legsAnimSnds; animsounds_t *torsoAnimSnds = level.knownAnimFileSets[animFileIndex].torsoAnimSnds; @@ -779,11 +784,11 @@ void CG_ParseAnimationSndFile( const char *as_filename, int animFileIndex ) // load the file len = cgi_FS_FOpenFile( sfilename, &f, FS_READ ); - if ( len <= 0 ) + if ( len <= 0 ) {//no file return; } - if ( len >= sizeof( text ) - 1 ) + if ( len >= (int)sizeof( text ) - 1 ) { cgi_FS_FCloseFile( f ); CG_Printf( "File %s too long\n", sfilename ); @@ -801,23 +806,23 @@ void CG_ParseAnimationSndFile( const char *as_filename, int animFileIndex ) // read information for batches of sounds (UPPER or LOWER) COM_BeginParseSession(); - while ( 1 ) + while ( 1 ) { // Get base frame of sequence token = COM_Parse( &text_p ); - if ( !token || !token[0] ) + if ( !token || !token[0] ) { break; } if ( !Q_stricmp(token,"UPPERSOUNDS") ) // A batch of upper sounds { - ParseAnimationSndBlock( as_filename, torsoAnimSnds, animations, &upper_i, &text_p ); + ParseAnimationSndBlock( as_filename, torsoAnimSnds, animations, &upper_i, &text_p ); } else if ( !Q_stricmp(token,"LOWERSOUNDS") ) // A batch of lower sounds { - ParseAnimationSndBlock( as_filename, legsAnimSnds, animations, &lower_i, &text_p ); + ParseAnimationSndBlock( as_filename, legsAnimSnds, animations, &lower_i, &text_p ); } } COM_EndParseSession( ); @@ -827,11 +832,11 @@ void CG_ParseAnimationSndFile( const char *as_filename, int animFileIndex ) CG_SetLerpFrameAnimation =============== */ -void CG_SetLerpFrameAnimation( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation ) +void CG_SetLerpFrameAnimation( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation ) { animation_t *anim; - if ( newAnimation < 0 || newAnimation >= MAX_ANIMATIONS ) + if ( newAnimation < 0 || newAnimation >= MAX_ANIMATIONS ) { #ifdef FINAL_BUILD newAnimation = 0; @@ -876,7 +881,7 @@ qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, f } // debugging tool to get no animations - if ( cg_animSpeed.integer == 0 ) + if ( cg_animSpeed.integer == 0 ) { lf->oldFrame = lf->frame = lf->backlerp = 0; return qfalse; @@ -884,14 +889,14 @@ qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, f // see if the animation sequence is switching //FIXME: allow multiple-frame overlapped lerping between sequences? - Possibly last 3 of last seq and first 3 of next seq? - if ( newAnimation != lf->animationNumber || !lf->animation ) + if ( newAnimation != lf->animationNumber || !lf->animation ) { CG_SetLerpFrameAnimation( ci, lf, newAnimation ); } // if we have passed the current frame, move it to // oldFrame and calculate a new frame - if ( cg.time >= lf->frameTime ) + if ( cg.time >= lf->frameTime ) { lf->oldFrame = lf->frame; lf->oldFrameTime = lf->frameTime; @@ -906,7 +911,7 @@ qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, f else*/ { animFrameTime = fabs((double)anim->frameLerp); - + //special hack for player to ensure quick weapon change if ( entNum == 0 ) { @@ -917,17 +922,17 @@ qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, f } } - if ( cg.time < lf->animationTime ) + if ( cg.time < lf->animationTime ) { lf->frameTime = lf->animationTime; // initial lerp - } - else + } + else { lf->frameTime = lf->oldFrameTime + animFrameTime; } f = ( lf->frameTime - lf->animationTime ) / animFrameTime; - if ( f >= anim->numFrames ) + if ( f >= anim->numFrames ) {//Reached the end of the anim //FIXME: Need to set a flag here to TASK_COMPLETE f -= anim->numFrames; @@ -942,8 +947,8 @@ qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, f f %= (anim->numFrames - anim->loopFrames); } f += anim->loopFrames; - } - else + } + else { f = anim->numFrames - 1; // the animation is stuck at the end, so it @@ -961,7 +966,7 @@ qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, f lf->frame = anim->firstFrame + f; } - if ( cg.time > lf->frameTime ) + if ( cg.time > lf->frameTime ) { lf->frameTime = cg.time; } @@ -969,21 +974,21 @@ qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, f newFrame = qtrue; } - if ( lf->frameTime > cg.time + 200 ) + if ( lf->frameTime > cg.time + 200 ) { lf->frameTime = cg.time; } - if ( lf->oldFrameTime > cg.time ) + if ( lf->oldFrameTime > cg.time ) { lf->oldFrameTime = cg.time; } // calculate current lerp value - if ( lf->frameTime == lf->oldFrameTime ) + if ( lf->frameTime == lf->oldFrameTime ) { lf->backlerp = 0; - } - else + } + else { lf->backlerp = 1.0 - (float)( cg.time - lf->oldFrameTime ) / ( lf->frameTime - lf->oldFrameTime ); } @@ -997,7 +1002,7 @@ qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, f CG_ClearLerpFrame =============== */ -void CG_ClearLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int animationNumber ) +void CG_ClearLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int animationNumber ) { lf->frameTime = lf->oldFrameTime = cg.time; CG_SetLerpFrameAnimation( ci, lf, animationNumber ); @@ -1034,7 +1039,7 @@ void CG_PlayerAnimation( centity_t *cent, int *legsOld, int *legs, float *legsBa legsAnim = cent->gent->client->ps.legsAnim; // do the shuffle turn frames locally (MAN this is an Fugly-ass hack!) - + if ( cent->pe.legs.yawing ) { legsTurnAnim = PM_GetTurnAnim( cent->gent, legsAnim ); @@ -1047,8 +1052,8 @@ void CG_PlayerAnimation( centity_t *cent, int *legsOld, int *legs, float *legsBa //breaks things since any task waiting for a lower anim to complete //never will finish if this happens!!! //cent->gent->client->ps.legsAnimTimer = 0; - } - else + } + else { newLegsFrame = CG_RunLerpFrame( ci, ¢->pe.legs, legsAnim, cent->gent->client->renderInfo.legsFpsMod, cent->gent->s.number); } @@ -1117,7 +1122,7 @@ void CG_PlayerAnimSounds( int animFileIndex, qboolean torso, int oldFrame, int f int firstFrame = 0, lastFrame = 0; qboolean playSound = qfalse, inSameAnim = qfalse, loopAnim = qfalse, match = qfalse, animBackward = qfalse; animsounds_t *animSounds = NULL; - + if ( torso ) { animSounds = level.knownAnimFileSets[animFileIndex].torsoAnimSnds; @@ -1209,7 +1214,7 @@ void CG_PlayerAnimSounds( int animFileIndex, qboolean torso, int oldFrame, int f {//hmm, didn't pass through it linearally, see if we looped if ( animSounds[i].keyFrame >= firstFrame && animSounds[i].keyFrame < lastFrame ) {//keyframe is in this anim - if ( oldFrame > animSounds[i].keyFrame + if ( oldFrame > animSounds[i].keyFrame && frame > oldFrame ) {//old to new passed through keyframe match = qtrue; @@ -1227,7 +1232,7 @@ void CG_PlayerAnimSounds( int animFileIndex, qboolean torso, int oldFrame, int f {//hmm, didn't pass through it linearally, see if we looped if ( animSounds[i].keyFrame >= firstFrame && animSounds[i].keyFrame < lastFrame ) {//keyframe is in this anim - if ( oldFrame < animSounds[i].keyFrame + if ( oldFrame < animSounds[i].keyFrame && frame < oldFrame ) {//old to new passed through keyframe match = qtrue; @@ -1244,7 +1249,7 @@ void CG_PlayerAnimSounds( int animFileIndex, qboolean torso, int oldFrame, int f holdSnd = animSounds[i].soundIndex[ Q_irand( 0, animSounds[i].numRandomAnimSounds ) ]; // Determine probability of playing sound - if (!animSounds[i].probability) // 100% + if (!animSounds[i].probability) // 100% { playSound = qtrue; } @@ -1262,7 +1267,7 @@ void CG_PlayerAnimSounds( int animFileIndex, qboolean torso, int oldFrame, int f if (holdSnd != 0) // 0 = default sound, ie file was missing { //FIXME: allow customSounds in here *... - if ( cgs.sound_precache[ holdSnd ] ) + if ( cgs.sound_precache[ holdSnd ] ) { cgi_S_StartSound( NULL, entNum, CHAN_AUTO, cgs.sound_precache[holdSnd ] ); } @@ -1325,7 +1330,7 @@ CG_UpdateAngleClamp Turn curAngle toward destAngle at angleSpeed, but stay within clampMin and Max ================== */ -void CG_UpdateAngleClamp( float destAngle, float clampMin, float clampMax, float angleSpeed, float *curAngle, float normalAngle) +void CG_UpdateAngleClamp( float destAngle, float clampMin, float clampMax, float angleSpeed, float *curAngle, float normalAngle) { float swing; float move; @@ -1344,10 +1349,10 @@ void CG_UpdateAngleClamp( float destAngle, float clampMin, float clampMax, float scale = fabs( swing ); if (swing > 0) { - if ( swing < clampMax * 0.25 ) + if ( swing < clampMax * 0.25 ) {//Pretty small way to go scale = 0.25; - } + } else if ( swing > clampMax * 2.0 ) {//Way out of our range scale = 2.0; @@ -1355,14 +1360,14 @@ void CG_UpdateAngleClamp( float destAngle, float clampMin, float clampMax, float else {//Scale it smoothly scale = swing/clampMax; - } + } } else// if (swing < 0) { - if ( swing > clampMin * 0.25 ) + if ( swing > clampMin * 0.25 ) {//Pretty small way to go scale = 0.5; - } + } else if ( swing < clampMin * 2.0 ) {//Way out of our range scale = 2.0; @@ -1370,15 +1375,15 @@ void CG_UpdateAngleClamp( float destAngle, float clampMin, float clampMax, float else {//Scale it smoothly scale = swing/clampMin; - } + } } actualSpeed = scale * angleSpeed; // swing towards the destination angle - if ( swing >= 0 ) + if ( swing >= 0 ) { move = cg.frametime * actualSpeed; - if ( move >= swing ) + if ( move >= swing ) {//our turnspeed is so fast, no need to swing, just match *curAngle = destAngle; } @@ -1386,11 +1391,11 @@ void CG_UpdateAngleClamp( float destAngle, float clampMin, float clampMax, float { *curAngle = AngleNormalize360( *curAngle + move ); } - } - else if ( swing < 0 ) + } + else if ( swing < 0 ) { move = cg.frametime * -actualSpeed; - if ( move <= swing ) + if ( move <= swing ) {//our turnspeed is so fast, no need to swing, just match *curAngle = destAngle; } @@ -1399,15 +1404,15 @@ void CG_UpdateAngleClamp( float destAngle, float clampMin, float clampMax, float *curAngle = AngleNormalize180( *curAngle + move ); } } - + swing = AngleSubtract( *curAngle, normalAngle ); // clamp to no more than normalAngle + tolerance - if ( swing > clampMax ) + if ( swing > clampMax ) { *curAngle = AngleNormalize180( normalAngle + clampMax ); - } - else if ( swing < clampMin ) + } + else if ( swing < clampMin ) { *curAngle = AngleNormalize180( normalAngle + clampMin ); } @@ -1429,11 +1434,11 @@ CG_SwingAngles locked mode (Don't turn unless you exceed the swing/clamp tolerance) ================== */ -void CG_SwingAngles( float destAngle, - float swingTolMin, float swingTolMax, +void CG_SwingAngles( float destAngle, + float swingTolMin, float swingTolMax, float clampMin, float clampMax, - float angleSpeed, float *curAngle, - qboolean *turning ) + float angleSpeed, float *curAngle, + qboolean *turning ) { float swing; float move; @@ -1451,7 +1456,7 @@ void CG_SwingAngles( float destAngle, } //If we're not turning, then we're done - if ( *turning == qfalse) + if ( *turning == qfalse) return; // modify the angleSpeed depending on the delta @@ -1466,15 +1471,15 @@ void CG_SwingAngles( float destAngle, return; } - if ( swing < swingTolMax * 0.5 ) + if ( swing < swingTolMax * 0.5 ) {//Pretty small way to go scale = 0.5; - } - else if ( scale < swingTolMax ) + } + else if ( scale < swingTolMax ) {//More than halfway to go scale = 1.0; - } - else + } + else {//Way out of our range scale = 2.0; } @@ -1487,47 +1492,47 @@ void CG_SwingAngles( float destAngle, return; } - if ( swing > swingTolMin * 0.5 ) + if ( swing > swingTolMin * 0.5 ) {//Pretty small way to go scale = 0.5; - } - else if ( scale > swingTolMin ) + } + else if ( scale > swingTolMin ) {//More than halfway to go scale = 1.0; - } - else + } + else {//Way out of our range scale = 2.0; } } // swing towards the destination angle - if ( swing >= 0 ) + if ( swing >= 0 ) { move = cg.frametime * scale * angleSpeed; - if ( move >= swing ) + if ( move >= swing ) {//our turnspeed is so fast, no need to swing, just match move = swing; } *curAngle = AngleNormalize360( *curAngle + move ); - } - else if ( swing < 0 ) + } + else if ( swing < 0 ) { move = cg.frametime * scale * -angleSpeed; - if ( move <= swing ) + if ( move <= swing ) {//our turnspeed is so fast, no need to swing, just match move = swing; } *curAngle = AngleNormalize360( *curAngle + move ); } - + // clamp to no more than tolerance - if ( swing > clampMax ) + if ( swing > clampMax ) { *curAngle = AngleNormalize360( destAngle - (clampMax - 1) ); - } - else if ( swing < clampMin ) + } + else if ( swing < clampMin ) { *curAngle = AngleNormalize360( destAngle + (-clampMin - 1) ); } @@ -1584,7 +1589,7 @@ float CG_EyePointOfsForRace[RACE_HOLOGRAM+1][2] = }; */ #define LOOK_DEFAULT_SPEED 0.15f -#define LOOK_TALKING_SPEED 0.15f +#define LOOK_TALKING_SPEED 0.15f static qboolean CG_CheckLookTarget( centity_t *cent, vec3_t lookAngles, float *lookingSpeed ) { @@ -1603,7 +1608,7 @@ static qboolean CG_CheckLookTarget( centity_t *cent, vec3_t lookAngles, float *l //Now calc head angle to lookTarget, if any if ( cent->gent->client->renderInfo.lookTarget >= 0 && cent->gent->client->renderInfo.lookTarget < ENTITYNUM_WORLD ) { - vec3_t lookDir, lookOrg, eyeOrg; + vec3_t lookDir, lookOrg = { 0.0f }, eyeOrg; if ( cent->gent->client->renderInfo.lookMode == LM_ENT ) { centity_t *lookCent = &cg_entities[cent->gent->client->renderInfo.lookTarget]; @@ -1680,7 +1685,7 @@ static qboolean CG_CheckLookTarget( centity_t *cent, vec3_t lookAngles, float *l CG_AddHeadBob ================= */ -static qboolean CG_AddHeadBob( centity_t *cent, vec3_t addTo ) +static qboolean CG_AddHeadBob( centity_t *cent, vec3_t addTo ) { renderInfo_t *renderInfo = ¢->gent->client->renderInfo; const int volume = gi.VoiceVolume[cent->gent->s.clientNum]; @@ -1891,9 +1896,9 @@ void CG_G2ClientSpineAngles( centity_t *cent, vec3_t viewAngles, const vec3_t an viewAngles[YAW] = AngleDelta( cent->lerpAngles[YAW], angles[YAW] ); cent->pe.torso.yawAngle = viewAngles[YAW]; - if ( cg_motionBoneComp.integer - && !PM_FlippingAnim( cent->currentState.legsAnim ) - && !PM_SpinningSaberAnim( cent->currentState.legsAnim ) + if ( cg_motionBoneComp.integer + && !PM_FlippingAnim( cent->currentState.legsAnim ) + && !PM_SpinningSaberAnim( cent->currentState.legsAnim ) && !PM_SpinningSaberAnim( cent->currentState.torsoAnim ) && cent->currentState.legsAnim != cent->currentState.torsoAnim )//NOTE: presumes your legs & torso are on the same frame, though they *should* be because PM_SetAnimFinal tries to keep them in synch {//FIXME: no need to do this if legs and torso on are same frame @@ -1930,10 +1935,10 @@ void CG_G2ClientSpineAngles( centity_t *cent, vec3_t viewAngles, const vec3_t an thoracicAngles[ROLL] = viewAngles[ROLL]*0.20f; ulAngles[ROLL] = viewAngles[ROLL]*0.35f; llAngles[ROLL] = viewAngles[ROLL]*0.45f; - + //thoracic is added modified again by neckAngle calculations, so don't set it until then - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, ulAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->lowerLumbarBone, llAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, ulAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->lowerLumbarBone, llAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); } void CG_G2ClientNeckAngles( centity_t *cent, const vec3_t lookAngles, vec3_t headAngles, vec3_t neckAngles, vec3_t thoracicAngles, vec3_t headClampMinAngles, vec3_t headClampMaxAngles ) @@ -2003,8 +2008,8 @@ void CG_G2ClientNeckAngles( centity_t *cent, const vec3_t lookAngles, vec3_t hea headAngles[ROLL] = lA[ROLL] * 0.6; BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, headAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, neckAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, thoracicAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, neckAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, thoracicAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); } void CG_UpdateLookAngles( centity_t *cent, vec3_t lookAngles, float lookSpeed, float minPitch, float maxPitch, float minYaw, float maxYaw, float minRoll, float maxRoll ) @@ -2081,9 +2086,9 @@ Handles seperate torso motion */ extern int PM_TurnAnimForLegsAnim( gentity_t *gent, int anim ); extern float PM_GetTimeScaleMod( gentity_t *gent ); -void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) +void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) { - vec3_t headAngles, neckAngles, chestAngles, thoracicAngles = {0,0,0};//legsAngles, torsoAngles, + vec3_t headAngles, neckAngles, chestAngles, thoracicAngles = {0,0,0};//legsAngles, torsoAngles, vec3_t ulAngles, llAngles; //float speed; //vec3_t velocity; @@ -2113,14 +2118,14 @@ void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) VectorCopy( cent->lerpAngles, angles ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); cent->pe.torso.pitchAngle = 0; cent->pe.torso.yawAngle = 0; - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->lowerLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->lowerLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); cent->pe.legs.pitchAngle = angles[0]; cent->pe.legs.yawAngle = angles[1]; @@ -2132,13 +2137,13 @@ void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) return; } - if ( cent->gent && cent->gent->client - && (cent->gent->client->NPC_class != CLASS_GONK ) - && (cent->gent->client->NPC_class != CLASS_INTERROGATOR) - && (cent->gent->client->NPC_class != CLASS_SENTRY) - && (cent->gent->client->NPC_class != CLASS_PROBE ) - && (cent->gent->client->NPC_class != CLASS_R2D2 ) - && (cent->gent->client->NPC_class != CLASS_R5D2) + if ( cent->gent && cent->gent->client + && (cent->gent->client->NPC_class != CLASS_GONK ) + && (cent->gent->client->NPC_class != CLASS_INTERROGATOR) + && (cent->gent->client->NPC_class != CLASS_SENTRY) + && (cent->gent->client->NPC_class != CLASS_PROBE ) + && (cent->gent->client->NPC_class != CLASS_R2D2 ) + && (cent->gent->client->NPC_class != CLASS_R5D2) && (cent->gent->client->NPC_class != CLASS_ATST||!cent->gent->s.number) ) {// If we are rendering third person, we should just force the player body to always fully face // whatever way they are looking, otherwise, you can end up with gun shots coming off of the @@ -2175,7 +2180,7 @@ void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) if ( cent->gent && cent->gent->client && cent->gent->client->NPC_class == CLASS_ATST ) { lookAngles[YAW] = 0; - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, lookAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, lookAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); VectorCopy( viewAngles, lookAngles ); } else @@ -2198,13 +2203,13 @@ void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) if ( turnAnim != -1 && cent->gent->health > 0 ) { animation_t *animations = level.knownAnimFileSets[cent->gent->client->clientInfo.animFileIndex].animations; - + if ( !animatingHips || ( animations[turnAnim].firstFrame != startFrame ) )// only set the anim if we aren't going to do the same animation again { float animSpeed = 50.0f / animations[turnAnim].frameLerp * PM_GetTimeScaleMod( cent->gent ); gi.G2API_SetBoneAnimIndex( ¢->gent->ghoul2[cent->gent->playerModel], cent->gent->hipsBone, - animations[turnAnim].firstFrame, animations[turnAnim].firstFrame+animations[turnAnim].numFrames, + animations[turnAnim].firstFrame, animations[turnAnim].firstFrame+animations[turnAnim].numFrames, BONE_ANIM_OVERRIDE_LOOP/*|BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND*/, animSpeed, cg.time, -1, 100 ); } } @@ -2331,7 +2336,7 @@ void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) VectorCopy( cent->lerpAngles, lookAngles ); lookAngles[0] = lookAngles[2] = 0; lookAngles[YAW] -= trailingLegsAngles[YAW]; - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, lookAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, lookAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); } else { @@ -2343,9 +2348,9 @@ void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) // All other entities else if ( cent->gent && cent->gent->client ) { - if ( (cent->gent->client->NPC_class == CLASS_PROBE ) - || (cent->gent->client->NPC_class == CLASS_R2D2 ) - || (cent->gent->client->NPC_class == CLASS_R5D2) + if ( (cent->gent->client->NPC_class == CLASS_PROBE ) + || (cent->gent->client->NPC_class == CLASS_R2D2 ) + || (cent->gent->client->NPC_class == CLASS_R5D2) || (cent->gent->client->NPC_class == CLASS_ATST) ) { VectorCopy( cent->lerpAngles, angles ); @@ -2452,7 +2457,7 @@ void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) lookAngles[PITCH] = lookAngles[ROLL] = 0; lookAngles[YAW] -= cent->pe.legs.yawAngle; } - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, lookAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, lookAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); //return; } else//if ( (cent->gent->client->NPC_class == CLASS_GONK ) || (cent->gent->client->NPC_class == CLASS_INTERROGATOR) || (cent->gent->client->NPC_class == CLASS_SENTRY) ) @@ -2468,7 +2473,7 @@ void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) } } -void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], vec3_t head[3] ) +void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], vec3_t head[3] ) { vec3_t legsAngles, torsoAngles, headAngles; vec3_t lookAngles, viewAngles; @@ -2496,11 +2501,11 @@ void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], vec3_t h //VectorClear( viewAngles ); VectorCopy( cent->lerpAngles, viewAngles ); - + viewAngles[YAW] = viewAngles[ROLL] = 0; viewAngles[PITCH] *= 0.5; AnglesToAxis( viewAngles, head ); - + viewAngles[PITCH] *= 0.75; cent->pe.torso.pitchAngle = viewAngles[PITCH]; cent->pe.torso.yawAngle = viewAngles[YAW]; @@ -2558,13 +2563,13 @@ void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], vec3_t h if ( cent->gent && cent->gent->next_roff_time && cent->gent->next_roff_time >= cg.time ) {//Following a roff, body must keep up with head, yaw-wise - headYawClampMin = - headYawClampMax = - torsoYawSwingTolMin = - torsoYawSwingTolMax = - torsoYawClampMin = - torsoYawClampMax = - legsYawSwingTolMin = + headYawClampMin = + headYawClampMax = + torsoYawSwingTolMin = + torsoYawSwingTolMax = + torsoYawClampMin = + torsoYawClampMax = + legsYawSwingTolMin = legsYawSwingTolMax = 0; } @@ -2574,7 +2579,7 @@ void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], vec3_t h { headYawClampMin = -70; headYawClampMax = 70; - + //These next two are only used for a calc below- this clamp is done in PM_UpdateViewAngles headPitchClampMin = -90; headPitchClampMax = 90; @@ -2593,7 +2598,7 @@ void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], vec3_t h yawSpeed = maxYawSpeed = cg_swingSpeed.value; } - + if(yawSpeed <= 0) {//Just in case yawSpeed = 0.5f; //was 0.33 @@ -2610,7 +2615,7 @@ void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], vec3_t h //Clamp and swing the legs legsAngles[YAW] = headAngles[YAW]; - + if(cent->gent->client->renderInfo.renderFlags & RF_LOCKEDANGLE) { cent->gent->client->renderInfo.legsYaw = cent->pe.legs.yawAngle = cent->gent->client->renderInfo.lockYaw; @@ -2670,7 +2675,7 @@ void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], vec3_t h cent->gent->client->renderInfo.legsYaw = legsAngles[YAW]; } */ - + // torso // If applicable, swing the lower parts to catch up with the head CG_SwingAngles( headAngles[YAW], torsoYawSwingTolMin, torsoYawSwingTolMax, headYawClampMin, headYawClampMax, yawSpeed, ¢->pe.torso.yawAngle, ¢->pe.torso.yawing); @@ -2679,15 +2684,15 @@ void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], vec3_t h // ---------- pitch ----------- //As the body twists to its extents, the back tends to arch backwards - + float dest; // only show a fraction of the pitch angle in the torso - if ( headAngles[PITCH] > 180 ) + if ( headAngles[PITCH] > 180 ) { dest = (-360 + headAngles[PITCH]) * 0.75; - } - else + } + else { dest = headAngles[PITCH] * 0.75; } @@ -2744,7 +2749,7 @@ void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], vec3_t h {//Keep this type of looking for a second after stopped looking cent->gent->client->renderInfo.lookingDebounceTime = cg.time + 1000; } - + if ( cent->gent->client->renderInfo.lookingDebounceTime > cg.time ) { //Calc our actual desired head angles @@ -2764,8 +2769,8 @@ void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], vec3_t h if ( !cent->gent->enemy || cent->gent->enemy->s.number != cent->gent->client->renderInfo.lookTarget ) { - //NOTE: Hacky, yes, I know, but necc. - //We want to turn the body to follow the lookTarget + //NOTE: Hacky, yes, I know, but necc. + //We want to turn the body to follow the lookTarget //ONLY IF WE DON'T HAVE AN ENEMY OR OUR ENEMY IS NOT OUR LOOKTARGET //This is the piece of code that was making the enemies not face where //they were actually aiming. @@ -2782,7 +2787,7 @@ void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], vec3_t h scale = fabs( swing ) / ( torsoPitchClampMax + 0.01 ); //NOTENOTE: Some ents have a clamp of 0, which is bad for division scale *= LOOK_SWING_SCALE; - torsoAngles[PITCH] = legsAngles[PITCH] - ( swing * scale ); + torsoAngles[PITCH] = legsAngles[PITCH] - ( swing * scale ); } } else @@ -2839,7 +2844,7 @@ CG_PlayerPowerups =============== */ extern void CG_Seeker( centity_t *cent ); -void CG_PlayerPowerups( centity_t *cent ) +void CG_PlayerPowerups( centity_t *cent ) { if ( !cent->currentState.powerups ) { return; @@ -2864,7 +2869,7 @@ void CG_PlayerPowerups( centity_t *cent ) } */ // invul gives a dlight -// if ( cent->currentState.powerups & ( 1 << PW_BATTLESUIT ) ) +// if ( cent->currentState.powerups & ( 1 << PW_BATTLESUIT ) ) // { // cgi_R_AddLightToScene( cent->lerpOrigin, 200 + (rand()&31), 0.8f, 0.8f, 0.2f ); // } @@ -2904,7 +2909,7 @@ static qboolean _PlayerShadow( const vec3_t origin, const float orientation, flo // add the mark as a temporary, so it goes directly to the renderer // without taking a spot in the cg_marks array - CG_ImpactMark( cgs.media.shadowMarkShader, trace.endpos, trace.plane.normal, + CG_ImpactMark( cgs.media.shadowMarkShader, trace.endpos, trace.plane.normal, orientation, 1,1,1,alpha, qfalse, radius, qtrue ); return qtrue; @@ -2927,7 +2932,7 @@ static qboolean CG_PlayerShadow( centity_t *const cent, float *const shadowPlane } // no shadows when cloaked - if ( cent->currentState.powerups & ( 1 << PW_CLOAKED )) + if ( cent->currentState.powerups & ( 1 << PW_CLOAKED )) { return qfalse; } @@ -2940,16 +2945,16 @@ static qboolean CG_PlayerShadow( centity_t *const cent, float *const shadowPlane tempAngles[PITCH] = 0; tempAngles[YAW] = cent->pe.legs.yawAngle; tempAngles[ROLL] = 0; - - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footLBolt, - &boltMatrix, tempAngles, cent->lerpOrigin, + + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footLBolt, + &boltMatrix, tempAngles, cent->lerpOrigin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, sideOrigin ); sideOrigin[2] += 30; //fudge up a bit for coplaner bShadowed = _PlayerShadow(sideOrigin, 0, shadowPlane, 28); - - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footRBolt, - &boltMatrix, tempAngles, cent->lerpOrigin, cg.time, + + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footRBolt, + &boltMatrix, tempAngles, cent->lerpOrigin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, sideOrigin ); sideOrigin[2] += 30; //fudge up a bit for coplaner @@ -2971,14 +2976,14 @@ void _PlayerSplash( const vec3_t origin, const vec3_t velocity, const float radi vec3_t start, end; trace_t trace; int contents; - + VectorCopy( origin, end ); end[2] -= 24; // if the feet aren't in liquid, don't make a mark // this won't handle moving water brushes, but they wouldn't draw right anyway... contents = cgi_CM_PointContents( end, 0 ); - if ( !( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) ) + if ( !( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) ) { return; } @@ -2995,7 +3000,7 @@ void _PlayerSplash( const vec3_t origin, const vec3_t velocity, const float radi // if the head isn't out of liquid, don't make a mark contents = cgi_CM_PointContents( start, 0 ); - if ( contents & ( CONTENTS_SOLID | CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) + if ( contents & ( CONTENTS_SOLID | CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) { return; } @@ -3003,7 +3008,7 @@ void _PlayerSplash( const vec3_t origin, const vec3_t velocity, const float radi // trace down to find the surface cgi_CM_BoxTrace( &trace, start, end, NULL, NULL, 0, ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ); - if ( trace.fraction == 1.0 ) + if ( trace.fraction == 1.0 ) { return; } @@ -3013,9 +3018,9 @@ void _PlayerSplash( const vec3_t origin, const vec3_t velocity, const float radi end[0] += crandom() * 3.0f; end[1] += crandom() * 3.0f; end[2] += 1.0f; //fudge up - + int t = VectorLengthSquared( velocity ); - + if ( t > 8192 ) // oh, magic number { t = 8192; @@ -3023,11 +3028,11 @@ void _PlayerSplash( const vec3_t origin, const vec3_t velocity, const float radi float alpha = ( t / 8192.0f ) * 0.6f + 0.2f; - FX_AddOrientedParticle( end, trace.plane.normal, NULL, NULL, - 6.0f, radius + random() * 48.0f, 0, + FX_AddOrientedParticle( end, trace.plane.normal, NULL, NULL, + 6.0f, radius + random() * 48.0f, 0, alpha, 0.0f, 0.0f, - WHITE, WHITE, 0.0f, - random() * 360, crandom() * 6.0f, NULL, NULL, 0.0f, 0 ,0, 1200, + WHITE, WHITE, 0.0f, + random() * 360, crandom() * 6.0f, NULL, NULL, 0.0f, 0 ,0, 1200, cgs.media.wakeMarkShader, FX_ALPHA_LINEAR | FX_SIZE_LINEAR ); } @@ -3038,9 +3043,9 @@ CG_PlayerSplash Draw a mark at the water surface =============== */ -void CG_PlayerSplash( centity_t *cent ) +void CG_PlayerSplash( centity_t *cent ) { - if ( !cg_shadows.integer ) + if ( !cg_shadows.integer ) { return; } @@ -3059,26 +3064,26 @@ void CG_PlayerSplash( centity_t *cent ) tempAngles[PITCH] = 0; tempAngles[YAW] = cent->pe.legs.yawAngle; tempAngles[ROLL] = 0; - - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footLBolt, - &boltMatrix, tempAngles, cent->lerpOrigin, + + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footLBolt, + &boltMatrix, tempAngles, cent->lerpOrigin, cg.time, cgs.model_draw, cent->currentState.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, sideOrigin ); sideOrigin[2] += 22; //fudge up a bit for coplaner _PlayerSplash( sideOrigin, cl->ps.velocity, 42, cent->gent->maxs[2] ); - - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footRBolt, - &boltMatrix, tempAngles, cent->lerpOrigin, cg.time, + + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footRBolt, + &boltMatrix, tempAngles, cent->lerpOrigin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, sideOrigin ); sideOrigin[2] += 22; //fudge up a bit for coplaner - _PlayerSplash( sideOrigin, cl->ps.velocity, 42, cent->gent->maxs[2] ); + _PlayerSplash( sideOrigin, cl->ps.velocity, 42, cent->gent->maxs[2] ); } else { // player splash mark - _PlayerSplash( cent->lerpOrigin, cl->ps.velocity, 36, cl->renderInfo.eyePoint[2] - cent->lerpOrigin[2] + 5 ); + _PlayerSplash( cent->lerpOrigin, cl->ps.velocity, 36, cl->renderInfo.eyePoint[2] - cent->lerpOrigin[2] + 5 ); } cent->gent->disconnectDebounceTime = cg.time + 125 + random() * 50.0f; @@ -3093,7 +3098,7 @@ CG_LightningBolt =============== */ -void CG_LightningBolt( centity_t *cent, vec3_t origin ) +void CG_LightningBolt( centity_t *cent, vec3_t origin ) { // FIXME: This sound also plays when the weapon first fires which causes little sputtering sounds..not exactly cool // Must be currently firing @@ -3101,7 +3106,7 @@ void CG_LightningBolt( centity_t *cent, vec3_t origin ) return; //Must be a durational weapon -// if ( cent->currentState.weapon == WP_DEMP2 && cent->currentState.eFlags & EF_ALT_FIRING ) +// if ( cent->currentState.weapon == WP_DEMP2 && cent->currentState.eFlags & EF_ALT_FIRING ) // { /*nothing*/ } // else { @@ -3129,7 +3134,7 @@ void CG_LightningBolt( centity_t *cent, vec3_t origin ) AngleVectors( angs, forward, NULL, NULL ); VectorMA( org, weaponData[cent->currentState.weapon].range, forward, end ); - + CG_Trace( &trace, org, vec3_origin, vec3_origin, end, cent->currentState.number, MASK_SHOT ); traceEnt = &g_entities[ trace.entityNum ]; @@ -3145,14 +3150,14 @@ void CG_LightningBolt( centity_t *cent, vec3_t origin ) { impact = qfalse; } - + // Add in the effect switch ( cent->currentState.weapon ) { case WP_DEMP2: // vec3_t org; -extern void FX_DEMP2_AltBeam( vec3_t start, vec3_t end, vec3_t normal, //qboolean spark, +extern void FX_DEMP2_AltBeam( vec3_t start, vec3_t end, vec3_t normal, //qboolean spark, vec3_t targ1, vec3_t targ2 ); // Move the beam back a bit to help cover up the poly edges on the fire beam @@ -3180,7 +3185,7 @@ void CG_ForcePushBlur( const vec3_t org ) ex->pos.trTime = cg.time; ex->pos.trType = TR_LINEAR; VectorScale( cg.refdef.viewaxis[1], 55, ex->pos.trDelta ); - + ex->color[0] = 24; ex->color[1] = 32; ex->color[2] = 40; @@ -3197,7 +3202,7 @@ void CG_ForcePushBlur( const vec3_t org ) ex->pos.trTime = cg.time; ex->pos.trType = TR_LINEAR; VectorScale( cg.refdef.viewaxis[1], -55, ex->pos.trDelta ); - + ex->color[0] = 24; ex->color[1] = 32; ex->color[2] = 40; @@ -3215,8 +3220,8 @@ static void CG_ForcePushBodyBlur( centity_t *cent, const vec3_t origin, vec3_t t // Do a torso based blur if (cent->gent->torsoBolt>=0) { - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->torsoBolt, - &boltMatrix, tempAngles, origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->torsoBolt, + &boltMatrix, tempAngles, origin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); CG_ForcePushBlur( fxOrg ); @@ -3225,8 +3230,8 @@ static void CG_ForcePushBodyBlur( centity_t *cent, const vec3_t origin, vec3_t t if (cent->gent->handRBolt>=0) { // Do a right-hand based blur - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->handRBolt, - &boltMatrix, tempAngles, origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->handRBolt, + &boltMatrix, tempAngles, origin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); CG_ForcePushBlur( fxOrg ); @@ -3235,8 +3240,8 @@ static void CG_ForcePushBodyBlur( centity_t *cent, const vec3_t origin, vec3_t t if (cent->gent->handLBolt>=0) { // Do a left-hand based blur - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->handLBolt, - &boltMatrix, tempAngles, origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->handLBolt, + &boltMatrix, tempAngles, origin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); CG_ForcePushBlur( fxOrg ); @@ -3245,8 +3250,8 @@ static void CG_ForcePushBodyBlur( centity_t *cent, const vec3_t origin, vec3_t t // Do the knees if (cent->gent->kneeLBolt>=0) { - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->kneeLBolt, - &boltMatrix, tempAngles, origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->kneeLBolt, + &boltMatrix, tempAngles, origin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); CG_ForcePushBlur( fxOrg ); @@ -3254,8 +3259,8 @@ static void CG_ForcePushBodyBlur( centity_t *cent, const vec3_t origin, vec3_t t if (cent->gent->kneeRBolt>=0) { - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->kneeRBolt, - &boltMatrix, tempAngles, origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->kneeRBolt, + &boltMatrix, tempAngles, origin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); CG_ForcePushBlur( fxOrg ); @@ -3264,16 +3269,16 @@ static void CG_ForcePushBodyBlur( centity_t *cent, const vec3_t origin, vec3_t t if (cent->gent->elbowLBolt>=0) { // Do the elbows - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->elbowLBolt, - &boltMatrix, tempAngles, origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->elbowLBolt, + &boltMatrix, tempAngles, origin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); CG_ForcePushBlur( fxOrg ); } if (cent->gent->elbowRBolt>=0) { - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->elbowRBolt, - &boltMatrix, tempAngles, origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->elbowRBolt, + &boltMatrix, tempAngles, origin, cg.time, cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); CG_ForcePushBlur( fxOrg ); @@ -3339,8 +3344,8 @@ static void CG_ForceElectrocution( centity_t *cent, const vec3_t origin, vec3_t } if (bolt>=0) { - found = gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, bolt, - &boltMatrix, tempAngles, origin, cg.time, + found = gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, bolt, + &boltMatrix, tempAngles, origin, cg.time, cgs.model_draw, cent->currentState.modelScale); } // Make sure that it's safe to even try and get these values out of the Matrix, otherwise the values could be garbage @@ -3394,7 +3399,7 @@ static void CG_ForceElectrocution( centity_t *cent, const vec3_t origin, vec3_t if ( tr.fraction < 1.0f || random() > 0.94f ) { FX_AddElectricity( fxOrg, tr.endpos, - 1.5f, 4.0f, 0.0f, + 1.5f, 4.0f, 0.0f, 1.0f, 0.5f, 0.0f, rgb, rgb, 0.0f, 5.5f, random() * 50 + 100, cgs.media.boltShader, FX_ALPHA_LINEAR | FX_SIZE_LINEAR | FX_BRANCH | FX_GROW | FX_TAPER ); @@ -3437,15 +3442,15 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen // } // If certain states are active, we don't want to add in the regular body - if ( !gent->client->ps.powerups[PW_CLOAKED] && - !gent->client->ps.powerups[PW_UNCLOAKING] && + if ( !gent->client->ps.powerups[PW_CLOAKED] && + !gent->client->ps.powerups[PW_UNCLOAKING] && !gent->client->ps.powerups[PW_DISRUPTION] ) { cgi_R_AddRefEntityToScene( ent ); } - + // Disruptor Gun Alt-fire - if ( gent->client->ps.powerups[PW_DISRUPTION] ) + if ( gent->client->ps.powerups[PW_DISRUPTION] ) { // I guess when something dies, it looks like pos1 gets set to the impact point on death, we can do fun stuff with this vec3_t tempAng; @@ -3473,8 +3478,8 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen vec3_t fxOrg; mdxaBone_t boltMatrix; - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, gent->playerModel, gent->torsoBolt, - &boltMatrix, gent->currentAngles, ent->origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, gent->playerModel, gent->torsoBolt, + &boltMatrix, gent->currentAngles, ent->origin, cg.time, cgs.model_draw, gent->s.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); @@ -3487,7 +3492,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen theFxScheduler.PlayEffect( "disruptor/death_smoke", fxOrg ); } } - } + } // Cloaking & Uncloaking Technology //---------------------------------------- @@ -3495,7 +3500,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen if (( powerups & ( 1 << PW_UNCLOAKING ))) {//in the middle of cloaking float perc = (float)(gent->client->ps.powerups[PW_UNCLOAKING] - cg.time) / 2000.0f; - if (( powerups & ( 1 << PW_CLOAKED ))) + if (( powerups & ( 1 << PW_CLOAKED ))) {//actually cloaking, so reverse it perc = 1.0f - perc; } @@ -3517,7 +3522,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen cgi_R_AddRefEntityToScene( ent ); } } - else if (( powerups & ( 1 << PW_CLOAKED ))) + else if (( powerups & ( 1 << PW_CLOAKED ))) {//fully cloaked ent->renderfx = 0;//&= ~(RF_RGB_TINT|RF_ALPHA_FADE); ent->shaderRGBA[0] = ent->shaderRGBA[1] = ent->shaderRGBA[2] = ent->shaderRGBA[3] = 255; @@ -3527,7 +3532,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen // Electricity //------------------------------------------------ - if ( (powerups & ( 1 << PW_SHOCKED )) ) + if ( (powerups & ( 1 << PW_SHOCKED )) ) { int dif = gent->client->ps.powerups[PW_SHOCKED] - cg.time; @@ -3535,7 +3540,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen { // fade out over the last 500 ms int brightness = 255; - + if ( dif < 500 ) { brightness = floor((dif - 500.0f) / 500.0f * 255.0f ); @@ -3547,7 +3552,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen if ( rand() & 1 ) { - ent->customShader = cgs.media.electricBodyShader; + ent->customShader = cgs.media.electricBodyShader; } else { @@ -3559,11 +3564,11 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen if ( random() > 0.9f ) cgi_S_StartSound ( ent->origin, gent->s.number, CHAN_AUTO, cgi_S_RegisterSound( "sound/effects/energy_crackle.wav" ) ); } - } + } // FORCE speed does blur trails //------------------------------------------------------ - if ( gent->client->ps.forcePowersActive & (1 << FP_SPEED) + if ( gent->client->ps.forcePowersActive & (1 << FP_SPEED) && (gent->s.number || cg.renderingThirdPerson) ) // looks dumb doing this with first peron mode on { localEntity_t *ex; @@ -3571,20 +3576,20 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen ex = CG_AllocLocalEntity(); ex->leType = LE_FADE_MODEL; memcpy( &ex->refEntity, ent, sizeof( refEntity_t )); - + ex->refEntity.renderfx |= RF_ALPHA_FADE; ex->startTime = cg.time; ex->endTime = ex->startTime + 75; VectorCopy( ex->refEntity.origin, ex->pos.trBase ); VectorClear( ex->pos.trDelta ); - + ex->color[0] = ex->color[1] = ex->color[2] = 255.0f; ex->color[3] = 50.0f; } // Personal Shields //------------------------ - if ( powerups & ( 1 << PW_BATTLESUIT )) + if ( powerups & ( 1 << PW_BATTLESUIT )) { float diff = gent->client->ps.powerups[PW_BATTLESUIT] - cg.time; float t; @@ -3593,7 +3598,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen { t = 1.0f - ( diff / (ARMOR_EFFECT_TIME * 2.0f)); // Only display when we have damage - if ( t < 0.0f || t > 1.0f ) + if ( t < 0.0f || t > 1.0f ) { } else @@ -3603,7 +3608,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen ent->renderfx &= ~RF_ALPHA_FADE; ent->renderfx |= RF_RGB_TINT; ent->customShader = cgs.media.personalShieldShader; - + cgi_R_AddRefEntityToScene( ent ); } } @@ -3703,16 +3708,16 @@ static void CG_G2SetHeadBlink( centity_t *cent, qboolean bStart ) } } gi.G2API_SetBoneAnglesIndex( &gent->ghoul2[gent->playerModel], hLeye, desiredAngles, - BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, blendTime, cg.time ); + BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, blendTime, cg.time ); const int hReye = gi.G2API_GetBoneIndex( &gent->ghoul2[0], "reye", qtrue ); if (hReye == -1) { return; } - + if (!bWink) gi.G2API_SetBoneAnglesIndex( &gent->ghoul2[gent->playerModel], hReye, desiredAngles, - BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, blendTime, cg.time ); + BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, blendTime, cg.time ); } /* @@ -3744,7 +3749,7 @@ static void CG_G2SetHeadAnim( centity_t *cent, int anim ) int lastFrame; if ( animSpeed < 0 ) {//play anim backwards - + lastFrame = animations[anim].firstFrame -1; firstFrame = (animations[anim].numFrames -1) + animations[anim].firstFrame ; } @@ -3757,7 +3762,7 @@ static void CG_G2SetHeadAnim( centity_t *cent, int anim ) // first decide if we are doing an animation on the head already // int startFrame, endFrame; // const qboolean animatingHead = gi.G2API_GetAnimRangeIndex(&gent->ghoul2[gent->playerModel], cent->gent->faceBone, &startFrame, &endFrame); - + // if (!animatingHead || ( animations[anim].firstFrame != startFrame ) )// only set the anim if we aren't going to do the same animation again { gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], cent->gent->faceBone, @@ -3771,19 +3776,19 @@ qboolean CG_G2PlayerHeadAnims( centity_t *cent ) { return qfalse; } - + if (cent->gent->faceBone == BONE_INDEX_INVALID) { // i don't have a face return qfalse; } int anim = -1; - + if ( cent->gent->health <= 0 ) {//Dead people close their eyes and don't make faces! anim = FACE_DEAD; } - else + else { if (!cent->gent->client->facial_blink) { // set the timers @@ -3791,7 +3796,7 @@ qboolean CG_G2PlayerHeadAnims( centity_t *cent ) cent->gent->client->facial_frown = cg.time + Q_flrand(6000.0, 10000.0); cent->gent->client->facial_aux = cg.time + Q_flrand(6000.0, 10000.0); } - + //are we blinking? if (cent->gent->client->facial_blink < 0) { // yes, check if we are we done blinking ? @@ -3801,8 +3806,8 @@ qboolean CG_G2PlayerHeadAnims( centity_t *cent ) CG_G2SetHeadBlink( cent, qfalse ); //stop the blink } } - else // no we aren't blinking - { + else // no we aren't blinking + { if (cent->gent->client->facial_blink < cg.time)// but should we start ? { CG_G2SetHeadBlink( cent, qtrue ); @@ -3814,9 +3819,9 @@ qboolean CG_G2PlayerHeadAnims( centity_t *cent ) { cent->gent->client->facial_blink = -(cg.time + 300.0f);// set blink timer } - } + } } - + if (gi.VoiceVolume[cent->gent->s.clientNum] > 0) // if we aren't talking, then it will be 0, -1 for talking but paused { @@ -3835,30 +3840,30 @@ qboolean CG_G2PlayerHeadAnims( centity_t *cent ) anim = FACE_ALERT; } } - else // no we aren't auxing + else // no we aren't auxing { // but should we start ? if (cent->gent->client->facial_aux < cg.time) {//yes anim = FACE_ALERT; // set aux timer cent->gent->client->facial_aux = -(cg.time + 2000.0); - } - } - + } + } + if (anim != -1) //we we are auxing, see if we should override with a frown - { + { if (cent->gent->client->facial_frown < 0)// are we frowning ? - { // yes, + { // yes, if (-(cent->gent->client->facial_frown) < cg.time)//are we done frowning ? { // yes, reset frown timer cent->gent->client->facial_frown = cg.time + Q_flrand(7000.0, 10000.0); } - else + else { // not yet, so choose frown anim = FACE_FROWN; } } - else// no we aren't frowning + else// no we aren't frowning { // but should we start ? if (cent->gent->client->facial_frown < cg.time) { @@ -3893,7 +3898,7 @@ int CG_PlayerHeadExtension( centity_t *cent, refEntity_t *head ) if (ci->extensions && (gi.VoiceVolume[cent->gent->s.clientNum] > 0)) {//FIXME: When talking, look at talkTarget, if any //ALSO: When talking, add a head bob/movement on syllables - when gi.VoiceVolume[] changes drastically - + if ( cent->gent->health <= 0 ) {//Dead people close their eyes and don't make faces! They also tell no tales... BUM BUM BAHHHHHHH! //Make them always blink and frown @@ -3911,7 +3916,7 @@ int CG_PlayerHeadExtension( centity_t *cent, refEntity_t *head ) int add_in = 0; // deal with blink first - + //Dead people close their eyes and don't make faces! They also tell no tales... BUM BUM BAHHHHHHH! if ( cent->gent->health <= 0 ) { @@ -3944,7 +3949,7 @@ int CG_PlayerHeadExtension( centity_t *cent, refEntity_t *head ) add_in = 4; } } - // no we aren't frowning + // no we aren't frowning else { // but should we start ? @@ -3980,7 +3985,7 @@ int CG_PlayerHeadExtension( centity_t *cent, refEntity_t *head ) cent->gent->client->facial_blink = cg.time + Q_flrand(3000.0, 5000.0); } } - // no we aren't blinking + // no we aren't blinking else { // but should we start ? @@ -4008,7 +4013,7 @@ int CG_PlayerHeadExtension( centity_t *cent, refEntity_t *head ) cent->gent->client->facial_frown = cg.time + Q_flrand(6000.0, 10000.0); } } - // no we aren't frowning + // no we aren't frowning else { // but should we start ? @@ -4047,7 +4052,7 @@ void CG_GetTagWorldPosition( refEntity_t *model, char *tag, vec3_t pos, vec3_t a 1.0f - model->backlerp, tag ); VectorCopy( model->origin, pos ); - for ( int i = 0 ; i < 3 ; i++ ) + for ( int i = 0 ; i < 3 ; i++ ) { VectorMA( pos, orientation.origin[i], model->axis[i], pos ); } @@ -4141,18 +4146,18 @@ void CG_StopWeaponSounds( centity_t *cent ) return; } - cgi_S_AddLoopingSound( cent->currentState.number, - cent->lerpOrigin, - vec3_origin, + cgi_S_AddLoopingSound( cent->currentState.number, + cent->lerpOrigin, + vec3_origin, CG_SaberHumSoundForEnt( &g_entities[cent->currentState.clientNum] ) ); return; } if ( cent->currentState.weapon == WP_STUN_BATON ) { - cgi_S_AddLoopingSound( cent->currentState.number, - cent->lerpOrigin, - vec3_origin, + cgi_S_AddLoopingSound( cent->currentState.number, + cent->lerpOrigin, + vec3_origin, weapon->firingSound ); return; } @@ -4262,7 +4267,7 @@ void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, saber // 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. + // 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 ) { @@ -4324,7 +4329,7 @@ void CG_CreateSaberMarks( vec3_t start, vec3_t end, vec3_t normal ) CrossProduct( axis[1], axis[0], axis[2] ); // create the full polygon that we'll project - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { originalPoints[0][i] = start[i] - radius * axis[1][i] - radius * axis[2][i]; originalPoints[1][i] = end[i] + radius * axis[1][i] - radius * axis[2][i]; @@ -4339,19 +4344,19 @@ void CG_CreateSaberMarks( vec3_t start, vec3_t end, vec3_t normal ) projection, MAX_MARK_POINTS, markPoints[0], MAX_MARK_FRAGMENTS, markFragments ); - for ( i = 0, mf = markFragments ; i < numFragments ; i++, mf++ ) + for ( i = 0, mf = markFragments ; i < numFragments ; i++, mf++ ) { // we have an upper limit on the complexity of polygons that we store persistantly - if ( mf->numPoints > MAX_VERTS_ON_POLY ) + if ( mf->numPoints > MAX_VERTS_ON_POLY ) { mf->numPoints = MAX_VERTS_ON_POLY; } - for ( j = 0, v = verts ; j < mf->numPoints ; j++, v++ ) + for ( j = 0, v = verts ; j < mf->numPoints ; j++, v++ ) { vec3_t delta; - // Set up our texture coords, this may need some work + // Set up our texture coords, this may need some work VectorCopy( markPoints[mf->firstPoint + j], v->xyz ); VectorAdd( end, start, mid ); VectorScale( mid, 0.5f, mid ); @@ -4394,7 +4399,7 @@ void CG_CheckSaberInWater( centity_t *cent, centity_t *scent, int modelIndex, ve { return; } - if ( !scent || + if ( !scent || modelIndex == -1 || scent->gent->ghoul2.size() <= modelIndex || scent->gent->ghoul2[modelIndex].mModelindex == -1 ) @@ -4420,7 +4425,7 @@ void CG_CheckSaberInWater( centity_t *cent, centity_t *scent, int modelIndex, ve void CG_AddSaberBlade( centity_t *cent, centity_t *scent, refEntity_t *saber, int renderfx, int modelIndex, vec3_t origin, vec3_t angles) { - vec3_t org_, end,//org_future, + vec3_t org_, end,//org_future, axis_[3] = {{0,0,0}, {0,0,0}, {0,0,0}};//, axis_future[3]={{0,0,0}, {0,0,0}, {0,0,0}}; // shut the compiler up trace_t trace; float length; @@ -4439,7 +4444,7 @@ Ghoul2 Insert Start // if (scent->gent->ghoul2.size()) if(1) { - if ( !scent || + if ( !scent || modelIndex == -1 || scent->gent->ghoul2.size() <= modelIndex || scent->gent->ghoul2[modelIndex].mModelindex == -1 ) @@ -4553,7 +4558,7 @@ Ghoul2 Insert End //cgi_CM_BoxTrace( &trace, end, org_, NULL, NULL, 0, MASK_SHOT ); gi.trace( &trace, org_, NULL, NULL, end, ENTITYNUM_NONE, MASK_SOLID|CONTENTS_WATER|CONTENTS_SLIME, G2_NOCOLLIDE, 0 ); } - + if ( trace.fraction < 1.0f ) { if ( (trace.contents&CONTENTS_WATER) || (trace.contents&CONTENTS_SLIME) ) @@ -4586,7 +4591,7 @@ Ghoul2 Insert End {//only put marks on architecture // Let's do some cool burn/glowing mark bits!!! CG_CreateSaberMarks( client->saberTrail.oldPos[i], trace.endpos, trace.plane.normal ); - + //make a sound if ( cg.time - cent->gent->client->ps.saberHitWallSoundDebounceTime >= 100 ) {//ugh, need to have a real sound debouncer... or do this game-side @@ -4623,7 +4628,7 @@ Ghoul2 Insert End if ( client->saberTrail.haveOldPos[i] ) { // Hmmm, no impact this frame, but we have an old point - // Let's put the mark there, we should use an endcap mark to close the line, but we + // Let's put the mark there, we should use an endcap mark to close the line, but we // can probably just get away with a round mark //CG_ImpactMark( cgs.media.rivetMarkShader, client->saberTrail.oldPos[i], client->saberTrail.oldNormal[i], // 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, qfalse, 1.1f, qfalse ); @@ -4642,9 +4647,9 @@ Ghoul2 Insert End // if we happen to be timescaled or running in a high framerate situation, we don't want to flood // the system with very small trail slices...but perhaps doing it by distance would yield better results? if ( saberTrail->lastTime > cg.time ) - {//after a pause, cg.time jumps ahead in time for one frame + {//after a pause, cg.time jumps ahead in time for one frame //and lastTime gets set to that and will freak out, so, since - //it's never valid for saberTrail->lastTime to be > cg.time, + //it's never valid for saberTrail->lastTime to be > cg.time, //cap it to cg.time here saberTrail->lastTime = cg.time; } @@ -4706,7 +4711,7 @@ Ghoul2 Insert End // new tip VectorCopy( rgb1, fx->mVerts[1].rgb ); fx->mVerts[1].alpha = 255.0f; - + fx->mVerts[1].ST[0] = 0.0f; fx->mVerts[1].ST[1] = 0.0f; fx->mVerts[1].destST[0] = 0.99f; @@ -4729,7 +4734,7 @@ Ghoul2 Insert End fx->mVerts[3].ST[1] = 0.99f; fx->mVerts[3].destST[0] = 0.99f + fx->mVerts[2].ST[0]; fx->mVerts[3].destST[1] = 0.99f; - + fx->mShader = cgs.media.saberBlurShader; // fx->SetFlags( FX_USE_ALPHA ); FX_AddPrimitive( (CEffect**)&fx, SABER_TRAIL_TIME ); @@ -4758,7 +4763,7 @@ CG_Player You can have and stack multiple animated pieces (not just legs and torso) You can attach "bolt-ons" that either animate or don't (weapons, heads, borg pieces) You can attach any object to any tag on any object (weapon on the head, etc.) - + Basically, keep a list of objects: Root object (in this case, the legs) with this info: model @@ -4785,7 +4790,7 @@ CG_Player tag to attach it's tag_parent to angle offset to attach it with - ALSO: + ALSO: Move the auto angle setting back up to the game Implement 3-axis scaling Implement alpha @@ -4803,7 +4808,7 @@ void CG_Player( centity_t *cent ) { calcedMp = qfalse; - if ( cent->currentState.eFlags & EF_NODRAW ) + if ( cent->currentState.eFlags & EF_NODRAW ) { return; } @@ -4834,7 +4839,7 @@ void CG_Player( centity_t *cent ) { ci = ¢->gent->client->clientInfo; - if ( !ci->infoValid ) + if ( !ci->infoValid ) { return; } @@ -4855,7 +4860,7 @@ void CG_Player( centity_t *cent ) { ent.renderfx = 0; if ( cent->currentState.number == cg.snap->ps.clientNum ) {//player - if ( !cg.renderingThirdPerson ) + if ( !cg.renderingThirdPerson ) { ent.renderfx = RF_THIRD_PERSON; // only draw in mirrors } @@ -4864,7 +4869,7 @@ void CG_Player( centity_t *cent ) { // add the shadow shadow = CG_PlayerShadow( cent, &shadowPlane ); - if ( (cg_shadows.integer == 2) || (cg_shadows.integer == 3 && shadow) ) + if ( (cg_shadows.integer == 2) || (cg_shadows.integer == 3 && shadow) ) { ent.renderfx |= RF_SHADOW_PLANE; } @@ -4894,7 +4899,7 @@ void CG_Player( centity_t *cent ) { VectorCopy( cent->gent->client->ps.velocity, velocity ); speed = VectorNormalize( velocity ); - if ( speed ) + if ( speed ) { vec3_t rt; float side; @@ -4987,7 +4992,7 @@ Ghoul2 Insert Start // get the player model information ent.renderfx = 0; - if ( !cg.renderingThirdPerson || cg.zoomMode ) + if ( !cg.renderingThirdPerson || cg.zoomMode ) {//in first person or zoomed in if ( cg.snap->ps.viewEntity <= 0 || cg.snap->ps.viewEntity >= ENTITYNUM_WORLD) {//no viewentity @@ -5013,7 +5018,7 @@ Ghoul2 Insert Start ent.renderfx = RF_THIRD_PERSON; // only draw in mirrors } - if ( (cg_shadows.integer == 2) || (cg_shadows.integer == 3 && shadow) ) + if ( (cg_shadows.integer == 2) || (cg_shadows.integer == 3 && shadow) ) { ent.renderfx |= RF_SHADOW_PLANE; } @@ -5044,14 +5049,14 @@ Ghoul2 Insert Start cent->lerpAngles[ROLL] = 0; //NOTE: call this so it updates on the server and client - BG_G2SetBoneAngles( chair, chair->gent, chair->gent->lowerLumbarBone, temp, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, cgs.model_draw ); - //gi.G2API_SetBoneAngles( &chair->gent->ghoul2[0], "swivel_bone", temp, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, cgs.model_draw ); + BG_G2SetBoneAngles( chair, chair->gent, chair->gent->lowerLumbarBone, temp, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, cgs.model_draw ); + //gi.G2API_SetBoneAngles( &chair->gent->ghoul2[0], "swivel_bone", temp, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, cgs.model_draw ); VectorCopy( temp, chair->gent->lastAngles ); gi.G2API_StopBoneAnimIndex( ¢->gent->ghoul2[cent->gent->playerModel], cent->gent->hipsBone ); // Getting the seat bolt here - gi.G2API_GetBoltMatrix( chair->gent->ghoul2, chair->gent->playerModel, chair->gent->headBolt, + gi.G2API_GetBoltMatrix( chair->gent->ghoul2, chair->gent->playerModel, chair->gent->headBolt, &boltMatrix, chair->gent->s.apos.trBase, chair->gent->currentOrigin, cg.time, cgs.model_draw, chair->currentState.modelScale ); // Storing ent position, bolt position, and bolt axis @@ -5074,11 +5079,11 @@ Ghoul2 Insert Start } else { -//--------------- +//--------------- CG_G2PlayerAngles( cent, ent.axis, tempAngles); //Deal with facial expressions CG_G2PlayerHeadAnims( cent ); - + VectorCopy( cent->lerpOrigin, ent.origin); if (ent.modelScale[2] && ent.modelScale[2] != 1.0f) { @@ -5086,8 +5091,8 @@ Ghoul2 Insert Start } VectorCopy( ent.origin, ent.oldorigin); VectorCopy( ent.origin, ent.lightingOrigin ); - } - + } + if ( cent->gent && cent->gent->client ) { cent->gent->client->ps.legsYaw = tempAngles[YAW]; @@ -5098,7 +5103,7 @@ extern vmCvar_t cg_thirdPersonAlpha; if ( (cent->gent->s.number == 0 || G_ControlledByPlayer( cent->gent )) ) { - float alpha = 1.0f; + float alpha = 1.0f; if ( (cg.overrides.active&CG_OVERRIDE_3RD_PERSON_APH) ) { alpha = cg.overrides.thirdPersonAlpha; @@ -5115,7 +5120,7 @@ extern vmCvar_t cg_thirdPersonAlpha; } } - if ( !cg.renderingThirdPerson + if ( !cg.renderingThirdPerson && ( cg.snap->ps.weapon == WP_SABER || cg.snap->ps.weapon == WP_MELEE ) && !cent->gent->s.number ) {// Yeah um, this needs to not do this quite this way @@ -5149,9 +5154,9 @@ extern vmCvar_t cg_thirdPersonAlpha; VectorCopy( ent.origin, cent->gent->client->renderInfo.torsoPoint ); VectorCopy( cent->lerpAngles, cent->gent->client->renderInfo.torsoAngles ); VectorCopy( ent.origin, cent->gent->client->renderInfo.crotchPoint ); - if ( cent->currentState.number != 0 - || cg.renderingThirdPerson - || cg.snap->ps.stats[STAT_HEALTH] <= 0 + if ( cent->currentState.number != 0 + || cg.renderingThirdPerson + || cg.snap->ps.stats[STAT_HEALTH] <= 0 || ( !cg.renderingThirdPerson && (cg.snap->ps.weapon == WP_SABER||cg.snap->ps.weapon == WP_MELEE) )//First person saber ) {//in some third person mode or NPC @@ -5171,33 +5176,33 @@ extern vmCvar_t cg_thirdPersonAlpha; if ( cent->gent->handRBolt != -1 ) { - //Get handRPoint - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->handRBolt, - &boltMatrix, G2Angles, ent.origin, cg.time, + //Get handRPoint + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->handRBolt, + &boltMatrix, G2Angles, ent.origin, cg.time, cgs.model_draw, cent->currentState.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, cent->gent->client->renderInfo.handRPoint ); } if ( cent->gent->handLBolt != -1 ) { //always get handLPoint too...? - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->handLBolt, - &boltMatrix, G2Angles, ent.origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->handLBolt, + &boltMatrix, G2Angles, ent.origin, cg.time, cgs.model_draw, cent->currentState.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, cent->gent->client->renderInfo.handLPoint ); } if ( cent->gent->footLBolt != -1 ) { //get the feet - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footLBolt, - &boltMatrix, G2Angles, ent.origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footLBolt, + &boltMatrix, G2Angles, ent.origin, cg.time, cgs.model_draw, cent->currentState.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, cent->gent->client->renderInfo.footLPoint ); } - + if ( cent->gent->footRBolt != -1 ) { - gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footRBolt, - &boltMatrix, G2Angles, ent.origin, cg.time, + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->playerModel, cent->gent->footRBolt, + &boltMatrix, G2Angles, ent.origin, cg.time, cgs.model_draw, cent->currentState.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, cent->gent->client->renderInfo.footRPoint ); } @@ -5266,8 +5271,8 @@ extern vmCvar_t cg_thirdPersonAlpha; { if ( !cent->currentState.saberInFlight )//&& cent->currentState.saberActive) {//holding the saber in-hand -// CGhoul2Info *currentModel = ¢->gent->ghoul2[1]; -// CGhoul2Info *nextModel = ¢->gent->ghoul2[1]; +// CGhoul2Info *currentModel = ¢->gent->ghoul2[1]; +// CGhoul2Info *nextModel = ¢->gent->ghoul2[1]; //FIXME: need a version of this that *doesn't* need the mFileName in the ghoul2 //FIXME: use an actual surfaceIndex? if ( !gi.G2API_GetSurfaceRenderStatus( ¢->gent->ghoul2[cent->gent->playerModel], "r_hand" ) )//surf is still on @@ -5290,26 +5295,26 @@ extern vmCvar_t cg_thirdPersonAlpha; if ( cent->currentState.weapon == WP_SABER && (cent->gent->client->ps.saberLength > 0 || cent->currentState.saberInFlight) ) { calcedMp = qtrue; - } + } } - if ( cent->currentState.number != 0 - || cg.renderingThirdPerson - || cg.snap->ps.stats[STAT_HEALTH] <= 0 + if ( cent->currentState.number != 0 + || cg.renderingThirdPerson + || cg.snap->ps.stats[STAT_HEALTH] <= 0 || ( !cg.renderingThirdPerson && (cg.snap->ps.weapon == WP_SABER||cg.snap->ps.weapon == WP_MELEE) )//First person saber ) {//if NPC, third person, or dead, unless using saber //Get eyePoint & eyeAngles /* - if ( cg.snap->ps.viewEntity > 0 - && cg.snap->ps.viewEntity < ENTITYNUM_WORLD + if ( cg.snap->ps.viewEntity > 0 + && cg.snap->ps.viewEntity < ENTITYNUM_WORLD && cg.snap->ps.viewEntity == cent->currentState.clientNum ) {//player is in an entity camera view, ME VectorCopy( ent.origin, cent->gent->client->renderInfo.eyePoint ); VectorCopy( tempAngles, cent->gent->client->renderInfo.eyeAngles ); VectorCopy( ent.origin, cent->gent->client->renderInfo.headPoint ); } - else + else */if ( cent->gent->headBolt == -1 ) {//no headBolt VectorCopy( ent.origin, cent->gent->client->renderInfo.eyePoint ); @@ -5482,7 +5487,7 @@ extern vmCvar_t cg_thirdPersonAlpha; { if ( cent->gent && cent->gent->NPC ) { - theFxScheduler.PlayEffect( effect, cent->gent->client->renderInfo.muzzlePoint, + theFxScheduler.PlayEffect( effect, cent->gent->client->renderInfo.muzzlePoint, cent->gent->client->renderInfo.muzzleDir ); } else @@ -5503,7 +5508,7 @@ extern vmCvar_t cg_thirdPersonAlpha; {//being pushed CG_ForcePushBodyBlur( cent, ent.origin, tempAngles ); } - + if ( cent->gent->client->ps.powerups[PW_FORCE_PUSH] > cg.time || (cent->gent->client->ps.forcePowersActive & (1<gent->client->renderInfo.handLPoint ); @@ -5624,7 +5629,7 @@ Ghoul2 Insert End // get the player model information renderfx = 0; - if ( !cg.renderingThirdPerson || cg.zoomMode ) + if ( !cg.renderingThirdPerson || cg.zoomMode ) { if ( cg.snap->ps.viewEntity <= 0 || cg.snap->ps.viewEntity >= ENTITYNUM_WORLD) {//no viewentity @@ -5644,8 +5649,8 @@ Ghoul2 Insert End } } } - - if ( (cg_shadows.integer == 2) || (cg_shadows.integer == 3 && shadow) ) + + if ( (cg_shadows.integer == 2) || (cg_shadows.integer == 3 && shadow) ) { renderfx |= RF_SHADOW_PLANE; } @@ -5680,7 +5685,7 @@ Ghoul2 Insert End VectorCopy( cent->lerpOrigin, legs.origin ); - //Scale applied to a refEnt will apply to any models attached to it... + //Scale applied to a refEnt will apply to any models attached to it... //This seems to copy the scale to every piece attached, kinda cool, but doesn't //allow the body to be scaled up without scaling a bolt on or whatnot... //Only apply scale if it's not 100% scale... @@ -5715,7 +5720,7 @@ Ghoul2 Insert End CG_AddRefEntityWithPowerups( &legs, cent->currentState.powerups, cent ); // if the model failed, allow the default nullmodel to be displayed - if (!legs.hModel) + if (!legs.hModel) { return; } @@ -5724,7 +5729,7 @@ Ghoul2 Insert End // add the torso // torso.hModel = ci->torsoModel; - if (torso.hModel) + if (torso.hModel) { orientation_t tag_torso; @@ -5745,7 +5750,7 @@ Ghoul2 Insert End // add the head // head.hModel = ci->headModel; - if (head.hModel) + if (head.hModel) { orientation_t tag_head; @@ -5794,7 +5799,7 @@ Ghoul2 Insert End weapon = &cg_weapons[cent->currentState.weapon]; gun.hModel = weapon->weaponWorldModel; - if (gun.hModel) + if (gun.hModel) { qboolean drawGun = qtrue; //FIXME: allow scale, animation and angle offsets @@ -5802,7 +5807,7 @@ Ghoul2 Insert End //FIXME: allow it to be put anywhere and move this out of if(torso.hModel) //Will have to call CG_PositionRotatedEntityOnTag - + CG_PositionEntityOnTag( &gun, &torso, torso.hModel, "tag_weapon"); //--------------------- start saber hacks @@ -5876,7 +5881,7 @@ Ghoul2 Insert End if ( drawGun ) { - CG_AddRefEntityWithPowerups( &gun, + CG_AddRefEntityWithPowerups( &gun, (cent->currentState.powerups & ((1<muzzleFlashTime > 0 && wData && !(cent->currentState.eFlags & EF_LOCKED_TO_WEAPON )) { @@ -5929,7 +5934,7 @@ Ghoul2 Insert End } } } - + if ( !calcedMp && !(cent->currentState.eFlags & EF_LOCKED_TO_WEAPON )) {// Set the muzzle point orientation_t orientation; @@ -5939,7 +5944,7 @@ Ghoul2 Insert End // FIXME: allow origin offsets along tag? VectorCopy( gun.origin, cent->gent->client->renderInfo.muzzlePoint ); - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { VectorMA( cent->gent->client->renderInfo.muzzlePoint, orientation.origin[i], gun.axis[i], cent->gent->client->renderInfo.muzzlePoint ); } @@ -5968,7 +5973,7 @@ Ghoul2 Insert End { playerState_t *ps = &cg.predicted_player_state; - if (( ps->weaponstate == WEAPON_CHARGING_ALT && ps->weapon == WP_BRYAR_PISTOL ) + if (( ps->weaponstate == WEAPON_CHARGING_ALT && ps->weapon == WP_BRYAR_PISTOL ) || ( ps->weapon == WP_BOWCASTER && ps->weaponstate == WEAPON_CHARGING ) || ( ps->weapon == WP_DEMP2 && ps->weaponstate == WEAPON_CHARGING_ALT )) { @@ -6031,7 +6036,7 @@ on and coontinue from there. */ void CG_ResetPlayerEntity( centity_t *cent ) { cent->errorTime = -99999; // guarantee no error decay added - cent->extrapolated = qfalse; + cent->extrapolated = qfalse; if ( cent->gent && cent->gent->ghoul2.size() ) { diff --git a/codeJK2/cgame/cg_playerstate.cpp b/codeJK2/cgame/cg_playerstate.cpp index 53a8ec9db4..3491570df2 100644 --- a/codeJK2/cgame/cg_playerstate.cpp +++ b/codeJK2/cgame/cg_playerstate.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_playerstate.c -- this file acts on changes in a new playerState_t // With normal play, this will be done after local prediction, but when diff --git a/codeJK2/cgame/cg_predict.cpp b/codeJK2/cgame/cg_predict.cpp index c2e003756f..acedda0bac 100644 --- a/codeJK2/cgame/cg_predict.cpp +++ b/codeJK2/cgame/cg_predict.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_predict.c -- this file generates cg.predicted_player_state by either // interpolating between snapshots from the server or locally predicting diff --git a/codeJK2/cgame/cg_public.h b/codeJK2/cgame/cg_public.h index 317643736e..7a8d78f810 100644 --- a/codeJK2/cgame/cg_public.h +++ b/codeJK2/cgame/cg_public.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #define NUM_EXPLOSION_SHADERS 8 #define NUM_EXPLOSION_FRAMES 3 diff --git a/codeJK2/cgame/cg_scoreboard.cpp b/codeJK2/cgame/cg_scoreboard.cpp index 54e89c39c3..27fb1acb30 100644 --- a/codeJK2/cgame/cg_scoreboard.cpp +++ b/codeJK2/cgame/cg_scoreboard.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "cg_local.h" #include "cg_media.h" diff --git a/codeJK2/cgame/cg_servercmds.cpp b/codeJK2/cgame/cg_servercmds.cpp index 7cc5abee33..9a8598289b 100644 --- a/codeJK2/cgame/cg_servercmds.cpp +++ b/codeJK2/cgame/cg_servercmds.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_servercmds.c -- text commands sent by the server diff --git a/codeJK2/cgame/cg_snapshot.cpp b/codeJK2/cgame/cg_snapshot.cpp index 569dde690d..586c25548f 100644 --- a/codeJK2/cgame/cg_snapshot.cpp +++ b/codeJK2/cgame/cg_snapshot.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_snapshot.c -- things that happen on snapshot transition, // not necessarily every single frame diff --git a/codeJK2/cgame/cg_syscalls.cpp b/codeJK2/cgame/cg_syscalls.cpp index 27bbea328d..ec2d3502a7 100644 --- a/codeJK2/cgame/cg_syscalls.cpp +++ b/codeJK2/cgame/cg_syscalls.cpp @@ -1,20 +1,26 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software + #include "cg_local.h" // this file is only included when building a dll diff --git a/codeJK2/cgame/cg_text.cpp b/codeJK2/cgame/cg_text.cpp index 9972313d4c..d9c68f30fe 100644 --- a/codeJK2/cgame/cg_text.cpp +++ b/codeJK2/cgame/cg_text.cpp @@ -1,22 +1,26 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// cg_text.c -- +// cg_text.c -- #include "cg_local.h" #include "cg_media.h" @@ -40,14 +44,14 @@ extern vec4_t textcolor_scroll; #define MAX_NUM_GAMELINES 4 -// display text in a supplied box, start at top left and going down by however many pixels I feel like internally, +// display text in a supplied box, start at top left and going down by however many pixels I feel like internally, // return value is NULL if all fitted, else char * of next char to continue from that didn't fit. // // (coords are in the usual 640x480 virtual space)... // // ( if you get the same char * returned as what you passed in, then none of it fitted at all (box too small) ) // -const char *CG_DisplayBoxedText(int iBoxX, int iBoxY, int iBoxWidth, int iBoxHeight, +const char *CG_DisplayBoxedText(int iBoxX, int iBoxY, int iBoxWidth, int iBoxHeight, const char *psText, int iFontHandle, float fScale, const vec4_t v4Color) { @@ -60,13 +64,13 @@ const char *CG_DisplayBoxedText(int iBoxX, int iBoxY, int iBoxWidth, int iBoxHei int iYpos = iBoxY; // start print pos // findmeste // test stuff, remove later -// psText = "Áɨô­ôº¸³Õ¤h¤w¸g¦w¥þ¤F¡A§Ú¤]§â©Ò¦³µo²{³ø§iµ¹¡u°Ó©±¡v¡C«Ü¤£©¯¦a¡A·ç¤hĵ§½¦³¨Ç¥Õèµo²{¤F¤@¨Çª¬ªp¡A·Ç³Æ¦b¾÷³õ¶e®·¨È¾ú¦è¡E¯Ç§J·ç±o¡C¥L°°¸Ë¦¨¥~¥æ¨Ï¸`¡A¬ï¹L¤F¼h¼h¨¾³Æ¡C²{¦b¥L´¤¦³¤H½è¡A¨Ã¥B«Â¯Ù­n´²¼½¯f¬r¡C®Ú¾Ú³Ì·psCurrentTextReadPosªº³ø§i¡A¯Ç§J·ç±o¥H¤Î¥LªºÄҦФw¸g§¹¥þ¦û¾Ú¤F¾÷³õ¡C§Ú¨ü©R¨Ó°l®·¯Ç§J·ç±o¥H¤Î±Ï¥X©Ò¦³¤H½è¡C³o¨Ã¤£®e©ö¡C"; +// psText = "Ãɨô­ôº¸³Õ¤h¤w¸g¦w¥þ¤F¡A§Ú¤]§â©Ò¦³µo²{³ø§iµ¹¡u°Ó©±¡v¡C«Ü¤£©¯¦a¡A·ç¤hĵ§½¦³¨Ç¥Õèµo²{¤F¤@¨Çª¬ªp¡A·Ç³Æ¦b¾÷³õ¶e®·¨È¾ú¦è¡E¯Ç§J·ç±o¡CÂ¥L°°¸Ë¦¨¥~¥æ¨Ã¸`¡A¬ï¹L¤F¼h¼h¨¾³Æ¡C²{¦bÂ¥L´¤¦³¤H½è¡A¨Ã¥B«Â¯Ù­n´²¼½¯f¬r¡C®Ú¾Ú³Ì·psCurrentTextReadPosªº³ø§i¡A¯Ç§J·ç±oÂ¥H¤Î¥LªºÄҦäw¸g§¹¥þ¦û¾Ú¤F¾÷³õ¡C§Ú¨ü©R¨Ó°l®·¯Ç§J·ç±oÂ¥H¤Î±ÃÂ¥X©Ò¦³¤H½è¡C³o¨Ã¤£®e©ö¡C"; - // this could probably be simplified now, but it was converted from something else I didn't originally write, + // this could probably be simplified now, but it was converted from something else I didn't originally write, // and it works anyway so wtf... // - const char *psCurrentTextReadPos = psText; - const char *psReadPosAtLineStart = psCurrentTextReadPos; + const char *psCurrentTextReadPos = psText; + const char *psReadPosAtLineStart = psCurrentTextReadPos; const char *psBestLineBreakSrcPos = psCurrentTextReadPos; const char *psLastGood_s; // needed if we get a full screen of chars with no punctuation or space (see usage notes) while( *psCurrentTextReadPos && (iYpos + iFontHeight < (iBoxY + iBoxHeight)) ) @@ -112,9 +116,9 @@ const char *CG_DisplayBoxedText(int iBoxX, int iBoxY, int iBoxWidth, int iBoxHei psBestLineBreakSrcPos = psCurrentTextReadPos; break; // print this line } - else + else if ( cgi_R_Font_StrLenPixels(sLineForDisplay, iFontHandle, fScale) >= iBoxWidth ) - { + { // reached screen edge, so cap off string at bytepos after last good position... // if (uiLetter > 255 && bIsTrailingPunctuation && !cgi_Language_UsesSpaces()) @@ -129,9 +133,9 @@ const char *CG_DisplayBoxedText(int iBoxX, int iBoxY, int iBoxWidth, int iBoxHei { // aarrrggh!!!!! we'll only get here is someone has fed in a (probably) garbage string, // since it doesn't have a single space or punctuation mark right the way across one line - // of the screen. So far, this has only happened in testing when I hardwired a taiwanese - // string into this function while the game was running in english (which should NEVER happen - // normally). On the other hand I suppose it'psCurrentTextReadPos entirely possible that some taiwanese string + // of the screen. So far, this has only happened in testing when I hardwired a taiwanese + // string into this function while the game was running in english (which should NEVER happen + // normally). On the other hand I suppose it'psCurrentTextReadPos entirely possible that some taiwanese string // might have no punctuation at all, so... // psBestLineBreakSrcPos = psLastGood_s; // force a break after last good letter @@ -175,7 +179,7 @@ CAPTION TEXT =============================================================================== */ -void CG_CaptionTextStop(void) +void CG_CaptionTextStop(void) { cg.captionTextTime = 0; } @@ -211,10 +215,10 @@ static int cg_SP_GetStringTextStringWithRetry( const char *psReference, char *ps } // slightly confusingly, the char arg for this function is an audio filename of the form "path/path/filename", -// the "filename" part of which should be the same as the StripEd reference we're looking for in the current +// the "filename" part of which should be the same as the StripEd reference we're looking for in the current // level's string package... // -void CG_CaptionText( const char *str, int sound ) +void CG_CaptionText( const char *str, int sound ) { const char *s, *holds; int i; @@ -229,12 +233,12 @@ void CG_CaptionText( const char *str, int sound ) #ifndef FINAL_BUILD Com_Printf("WARNING: CG_CaptionText given audio filename with no '/':'%s'\n",str); #endif - return; + return; } i = cg_SP_GetStringTextStringWithRetry( holds+1, text, sizeof(text) ); //ensure we found a match - if (!i) - { + if (!i) + { #ifndef FINAL_BUILD // we only care about some sound dirs... if (!Q_strncmp(str,"sound/chars/",12)) // whichever language it is, it'll be pathed as english at this point @@ -246,7 +250,7 @@ void CG_CaptionText( const char *str, int sound ) // anything else is probably stuff we don't care about. It certainly shouldn't be speech, anyway } #endif - return; + return; } const int fontHeight = (int) ((cgi_Language_IsAsian() ? 1.4f : 1.0f) * (float) cgi_R_Font_HeightPixels(cgs.media.qhFontMedium, fFontScale)); // taiwanese & japanese need 1.5 fontheight spacing @@ -270,9 +274,9 @@ void CG_CaptionText( const char *str, int sound ) // findmeste // test stuff, remove later s=(const char*)&text; // tai... -// s="Áɨô­ôº¸³Õ¤h¤w¸g¦w¥þ¤F¡A§Ú¤]§â©Ò¦³µo²{³ø§iµ¹¡u°Ó©±¡v¡C«Ü¤£©¯¦a¡A·ç¤hĵ§½¦³¨Ç¥Õèµo²{¤F¤@¨Çª¬ªp¡A·Ç³Æ¦b¾÷³õ¶e®·¨È¾ú¦è¡E¯Ç§J·ç±o¡C¥L°°¸Ë¦¨¥~¥æ¨Ï¸`¡A¬ï¹L¤F¼h¼h¨¾³Æ¡C²{¦b¥L´¤¦³¤H½è¡A¨Ã¥B«Â¯Ù­n´²¼½¯f¬r¡C®Ú¾Ú³Ì·sªº³ø§i¡A¯Ç§J·ç±o¥H¤Î¥LªºÄҦФw¸g§¹¥þ¦û¾Ú¤F¾÷³õ¡C§Ú¨ü©R¨Ó°l®·¯Ç§J·ç±o¥H¤Î±Ï¥X©Ò¦³¤H½è¡C³o¨Ã¤£®e©ö¡C"; +// s="Ãɨô­ôº¸³Õ¤h¤w¸g¦w¥þ¤F¡A§Ú¤]§â©Ò¦³µo²{³ø§iµ¹¡u°Ó©±¡v¡C«Ü¤£©¯¦a¡A·ç¤hĵ§½¦³¨Ç¥Õèµo²{¤F¤@¨Çª¬ªp¡A·Ç³Æ¦b¾÷³õ¶e®·¨È¾ú¦è¡E¯Ç§J·ç±o¡CÂ¥L°°¸Ë¦¨¥~¥æ¨Ã¸`¡A¬ï¹L¤F¼h¼h¨¾³Æ¡C²{¦bÂ¥L´¤¦³¤H½è¡A¨Ã¥B«Â¯Ù­n´²¼½¯f¬r¡C®Ú¾Ú³Ì·sªº³ø§i¡A¯Ç§J·ç±oÂ¥H¤Î¥LªºÄҦäw¸g§¹¥þ¦û¾Ú¤F¾÷³õ¡C§Ú¨ü©R¨Ó°l®·¯Ç§J·ç±oÂ¥H¤Î±ÃÂ¥X©Ò¦³¤H½è¡C³o¨Ã¤£®e©ö¡C"; // kor... -// s="Wp:¼îŸÀÓÀÌ´Ù ¸Ö¸°. ±×µéÀÌ ¸»ÇÑ´ë·Î ³×°¡ ÀßÇÒÁö ±â´ëÇϰڴÙ.¼îŸÀÓÀÌ´Ù ¸Ö¸°. ±×µéÀÌ ¸»ÇÑ´ë·Î ³×°¡ ÀßÇÒÁö ±â´ëÇϰڴÙ."; +// s="Wp:¼îŸÀÓÀÌ´Ù ¸Ö¸°. ±×µéÀÌ ¸»ÇÑ´ë·Î ³×°¡ ÀßÇÒÃö ±â´ëÇðڴÙ.¼îŸÀÓÀÌ´Ù ¸Ö¸°. ±×µéÀÌ ¸»ÇÑ´ë·Î ³×°¡ ÀßÇÒÃö ±â´ëÇðڴÙ."; holds = s; int iPlayingTimeMS = cgi_S_GetSampleLength(sound); @@ -321,7 +325,7 @@ void CG_CaptionText( const char *str, int sound ) psBestLineBreakSrcPos = s; cg.scrollTextLines++; } - else + else if ( cgi_R_Font_StrLenPixels(cg.captionText[i], cgs.media.qhFontMedium, fFontScale) >= SCREEN_WIDTH) { // reached screen edge, so cap off string at bytepos after last good position... @@ -338,9 +342,9 @@ void CG_CaptionText( const char *str, int sound ) { // aarrrggh!!!!! we'll only get here is someone has fed in a (probably) garbage string, // since it doesn't have a single space or punctuation mark right the way across one line - // of the screen. So far, this has only happened in testing when I hardwired a taiwanese - // string into this function while the game was running in english (which should NEVER happen - // normally). On the other hand I suppose it's entirely possible that some taiwanese string + // of the screen. So far, this has only happened in testing when I hardwired a taiwanese + // string into this function while the game was running in english (which should NEVER happen + // normally). On the other hand I suppose it's entirely possible that some taiwanese string // might have no punctuation at all, so... // psBestLineBreakSrcPos = psLastGood_s; // force a break after last good letter @@ -369,7 +373,7 @@ void CG_CaptionText( const char *str, int sound ) { holdTime += strlen(cg.captionText[1]); // strlen is also good for MBCS in this instance, since it's for timing } - cg.captionNextTextTime = cg.time + (holdTime * cg.captionLetterTime); + cg.captionNextTextTime = cg.time + (holdTime * cg.captionLetterTime); cg.scrollTextTime = 0; // No scrolling during captions @@ -387,7 +391,7 @@ void CG_DrawCaptionText(void) int x, y, w; int holdTime; - if ( !cg.captionTextTime ) + if ( !cg.captionTextTime ) { return; } @@ -400,7 +404,7 @@ void CG_DrawCaptionText(void) return; } - if ( cg.captionNextTextTime < cg.time ) + if ( cg.captionNextTextTime < cg.time ) { cg.captionTextCurrentLine += 2; @@ -424,7 +428,7 @@ void CG_DrawCaptionText(void) } // Give a color if one wasn't given - if((textcolor_caption[0] == 0) && (textcolor_caption[1] == 0) && + if((textcolor_caption[0] == 0) && (textcolor_caption[1] == 0) && (textcolor_caption[2] == 0) && (textcolor_caption[3] == 0)) { Vector4Copy( colorTable[CT_WHITE], textcolor_caption ); @@ -441,7 +445,7 @@ void CG_DrawCaptionText(void) for (i= cg.captionTextCurrentLine;i< cg.captionTextCurrentLine + 2;++i) { - w = cgi_R_Font_StrLenPixels(cg.captionText[i], cgs.media.qhFontMedium, fFontScale); + w = cgi_R_Font_StrLenPixels(cg.captionText[i], cgs.media.qhFontMedium, fFontScale); if (w) { x = (SCREEN_WIDTH-w) / 2; @@ -474,7 +478,7 @@ void CG_ScrollText( const char *str, int iPixelWidth ) giScrollTextPixelWidth = iPixelWidth; // first, ask the strlen of the final string... - // + // i = cgi_SP_GetStringTextString( str, NULL, 0 ); //ensure we found a match @@ -483,7 +487,7 @@ void CG_ScrollText( const char *str, int iPixelWidth ) #ifndef FINAL_BUILD Com_Printf("WARNING: CG_ScrollText given invalid text key :'%s'\n",str); #endif - return; + return; } // // malloc space to hold it... @@ -491,7 +495,7 @@ void CG_ScrollText( const char *str, int iPixelWidth ) char *psText = (char *) cgi_Z_Malloc( i+1, TAG_TEMP_WORKSPACE ); // // now get the string... - // + // i = cgi_SP_GetStringTextString( str, psText, i+1 ); //ensure we found a match if (!i) @@ -501,13 +505,13 @@ void CG_ScrollText( const char *str, int iPixelWidth ) #ifndef FINAL_BUILD Com_Printf("WARNING: CG_ScrollText given invalid text key :'%s'\n",str); #endif - return; + return; } cg.scrollTextTime = cg.time; cg.printTextY = SCREEN_HEIGHT; cg.scrollTextLines = 1; - + s = psText; i = 0; holds = s; @@ -553,15 +557,15 @@ void CG_ScrollText( const char *str, int iPixelWidth ) // cg.printText[i][ strlen(cg.printText[i])-1 ] = '\0'; // kill the CR i++; - assert (i < (sizeof(cg.printText)/sizeof(cg.printText[0])) ); - if (i >= (sizeof(cg.printText)/sizeof(cg.printText[0])) ) + assert (i < (int)ARRAY_LEN( cg.printText ) ); + if (i >= (int)ARRAY_LEN( cg.printText ) ) { break; } holds = s; cg.scrollTextLines++; } - else + else if ( cgi_R_Font_StrLenPixels(cg.printText[i], cgs.media.qhFontMedium, 1.0f) >= iPixelWidth) { // reached screen edge, so cap off string at bytepos after last good position... @@ -570,9 +574,9 @@ void CG_ScrollText( const char *str, int iPixelWidth ) { // aarrrggh!!!!! we'll only get here is someone has fed in a (probably) garbage string, // since it doesn't have a single space or punctuation mark right the way across one line - // of the screen. So far, this has only happened in testing when I hardwired a taiwanese - // string into this function while the game was running in english (which should NEVER happen - // normally). On the other hand I suppose it's entirely possible that some taiwanese string + // of the screen. So far, this has only happened in testing when I hardwired a taiwanese + // string into this function while the game was running in english (which should NEVER happen + // normally). On the other hand I suppose it's entirely possible that some taiwanese string // might have no punctuation at all, so... // psBestLineBreakSrcPos = psLastGood_s; // force a break after last good letter @@ -581,7 +585,7 @@ void CG_ScrollText( const char *str, int iPixelWidth ) cg.printText[i][ psBestLineBreakSrcPos - holds ] = '\0'; holds = s = psBestLineBreakSrcPos; i++; - assert (i < (sizeof(cg.printText)/sizeof(cg.printText[0])) ); + assert( i < (int)ARRAY_LEN( cg.printText ) ); cg.scrollTextLines++; } } @@ -595,12 +599,12 @@ void CG_ScrollText( const char *str, int iPixelWidth ) // #define SCROLL_LPM (1/50.0) // 1 line per 50 ms void CG_DrawScrollText(void) -{ +{ int i; - int x,y; + int x,y; const int fontHeight = (int) (1.5f * (float) cgi_R_Font_HeightPixels(cgs.media.qhFontMedium, 1.0f)); // taiwanese & japanese need 1.5 fontheight spacing - if ( !cg.scrollTextTime ) + if ( !cg.scrollTextTime ) { return; } @@ -633,13 +637,13 @@ void CG_DrawScrollText(void) break; } -// w = cgi_R_Font_StrLenPixels(cg.printText[i], cgs.media.qhFontMedium, 1.0f); +// w = cgi_R_Font_StrLenPixels(cg.printText[i], cgs.media.qhFontMedium, 1.0f); // if (w) { x = (SCREEN_WIDTH - giScrollTextPixelWidth) / 2; cgi_R_Font_DrawString(x,y, cg.printText[i], textcolor_scroll, cgs.media.qhFontMedium, -1, 1.0f); y += fontHeight; - } + } } cgi_R_SetColor( NULL ); @@ -665,7 +669,7 @@ for a few moments */ void CG_CenterPrint( const char *str, int y) { char *s; - + // Find text to match the str given if (*str == '@') { @@ -675,7 +679,7 @@ void CG_CenterPrint( const char *str, int y) { if (!i) { - Com_Printf (S_COLOR_RED"CG_CenterPrint: cannot find reference '%s' in StringPackage!\n",str); + Com_Printf (S_COLOR_RED"CG_CenterPrint: cannot find reference '%s' in StringPackage!\n",str); Q_strncpyz( cg.centerPrint, str, sizeof(cg.centerPrint) ); } } @@ -704,7 +708,7 @@ void CG_CenterPrint( const char *str, int y) { CG_DrawCenterString =================== */ -void CG_DrawCenterString( void ) +void CG_DrawCenterString( void ) { char *start; int l; @@ -720,7 +724,7 @@ void CG_DrawCenterString( void ) return; } - if((textcolor_center[0] == 0) && (textcolor_center[1] == 0) && + if((textcolor_center[0] == 0) && (textcolor_center[1] == 0) && (textcolor_center[2] == 0) && (textcolor_center[3] == 0)) { Vector4Copy( colorTable[CT_WHITE], textcolor_center ); @@ -735,10 +739,10 @@ void CG_DrawCenterString( void ) char linebuffer[1024]; // this is kind of unpleasant when dealing with MBCS, but... - // + // const char *psString = start; int iOutIndex = 0; - for ( l = 0; l < sizeof(linebuffer)-1; l++ ) { + for ( l = 0; l < (int)sizeof(linebuffer)-1; l++ ) { unsigned int uiLetter = cgi_AnyLanguage_ReadCharFromString(&psString, 0); if (!uiLetter || uiLetter == '\n'){ break; @@ -755,7 +759,7 @@ void CG_DrawCenterString( void ) } linebuffer[iOutIndex++] = '\0'; - w = cgi_R_Font_StrLenPixels(linebuffer, cgs.media.qhFontMedium, 1.0f); + w = cgi_R_Font_StrLenPixels(linebuffer, cgs.media.qhFontMedium, 1.0f); x = ( SCREEN_WIDTH - w ) / 2; diff --git a/codeJK2/cgame/cg_view.cpp b/codeJK2/cgame/cg_view.cpp index 119adff482..3831bcd4f7 100644 --- a/codeJK2/cgame/cg_view.cpp +++ b/codeJK2/cgame/cg_view.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // cg_view.c -- setup all the parameters (position, angle, etc) // for a 3D rendering diff --git a/codeJK2/cgame/cg_weapons.cpp b/codeJK2/cgame/cg_weapons.cpp index 2391e98c84..a03fe0268d 100644 --- a/codeJK2/cgame/cg_weapons.cpp +++ b/codeJK2/cgame/cg_weapons.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "cg_local.h" #include "cg_media.h" @@ -28,7 +33,7 @@ extern void CG_LightningBolt( centity_t *cent, vec3_t origin ); #define PHASER_HOLDFRAME 2 int cgi_UI_GetMenuInfo(char *menuFile,int *x,int *y); extern void G_SoundOnEnt( gentity_t *ent, soundChannel_t channel, const char *soundPath ); -const char *CG_DisplayBoxedText(int iBoxX, int iBoxY, int iBoxWidth, int iBoxHeight, +const char *CG_DisplayBoxedText(int iBoxX, int iBoxY, int iBoxWidth, int iBoxHeight, const char *psText, int iFontHandle, float fScale, const vec4_t v4Color); @@ -82,13 +87,13 @@ void CG_RegisterWeapon( int weaponNum ) { weaponInfo->weaponModel = cgi_R_RegisterModel( weaponData[weaponNum].weaponMdl ); {//in case the weaponmodel isn't _w, precache the _w.glm char weaponModel[64]; - - Q_strncpyz (weaponModel, weaponData[weaponNum].weaponMdl, sizeof(weaponModel)); - if (char *spot = strstr(weaponModel, ".md3") ) + + Q_strncpyz (weaponModel, weaponData[weaponNum].weaponMdl, sizeof(weaponModel)); + if (char *spot = strstr(weaponModel, ".md3") ) { *spot = 0; spot = strstr(weaponModel, "_w");//i'm using the in view weapon array instead of scanning the item list, so put the _w back on - if (!spot) + if (!spot) { Q_strcat (weaponModel, sizeof(weaponModel), "_w"); } @@ -116,7 +121,7 @@ void CG_RegisterWeapon( int weaponNum ) { weaponInfo->weaponIconNoAmmo = cgi_R_RegisterShaderNoMip( va("%s_na",weaponData[weaponNum].weaponIcon)); } - for ( ammo = bg_itemlist + 1 ; ammo->classname ; ammo++ ) { + for ( ammo = bg_itemlist + 1 ; ammo->classname ; ammo++ ) { if ( ammo->giType == IT_AMMO && ammo->giTag == weaponData[weaponNum].ammoIndex) { break; } @@ -197,11 +202,11 @@ void CG_RegisterWeapon( int weaponNum ) { if (weaponData[weaponNum].altmissileHitSound[0]) { weaponInfo->altmissileHitSound = cgi_S_RegisterSound( weaponData[weaponNum].altmissileHitSound ); } - if ( weaponData[weaponNum].mMuzzleEffect[0] ) + if ( weaponData[weaponNum].mMuzzleEffect[0] ) { weaponData[weaponNum].mMuzzleEffectID = theFxScheduler.RegisterEffect( weaponData[weaponNum].mMuzzleEffect ); } - if ( weaponData[weaponNum].mAltMuzzleEffect[0] ) + if ( weaponData[weaponNum].mAltMuzzleEffect[0] ) { weaponData[weaponNum].mAltMuzzleEffectID = theFxScheduler.RegisterEffect( weaponData[weaponNum].mAltMuzzleEffect ); } @@ -210,11 +215,11 @@ void CG_RegisterWeapon( int weaponNum ) { // give ourselves the functions if we can if (weaponData[weaponNum].func) { - weaponInfo->missileTrailFunc = (void (__cdecl *)(struct centity_s *,const struct weaponInfo_s *))weaponData[weaponNum].func; + weaponInfo->missileTrailFunc = (void (QDECL *)(struct centity_s *,const struct weaponInfo_s *))weaponData[weaponNum].func; } if (weaponData[weaponNum].altfunc) { - weaponInfo->alt_missileTrailFunc = (void (__cdecl *)(struct centity_s *,const struct weaponInfo_s *))weaponData[weaponNum].altfunc; + weaponInfo->alt_missileTrailFunc = (void (QDECL *)(struct centity_s *,const struct weaponInfo_s *))weaponData[weaponNum].altfunc; } switch ( weaponNum ) //extra client only stuff @@ -419,7 +424,7 @@ void CG_RegisterWeapon( int weaponNum ) { // For the ALT fire theFxScheduler.RegisterEffect( "atst/side_alt_shot" ); theFxScheduler.RegisterEffect( "atst/side_alt_explosion" ); - + // For the regular fire theFxScheduler.RegisterEffect( "atst/side_main_shot" ); theFxScheduler.RegisterEffect( "atst/side_main_impact" ); @@ -439,7 +444,7 @@ void CG_RegisterWeapon( int weaponNum ) { case WP_ROCKET_LAUNCHER: theFxScheduler.RegisterEffect( "rocket/shot" ); theFxScheduler.RegisterEffect( "rocket/explosion" ); - + cgi_R_RegisterShaderNoMip( "gfx/2d/wedge" ); cgi_R_RegisterShaderNoMip( "gfx/2d/lock" ); @@ -470,7 +475,7 @@ void CG_RegisterWeapon( int weaponNum ) { case WP_DET_PACK: theFxScheduler.RegisterEffect( "detpack/explosion.efx" ); - + cgs.media.detPackStickSound = cgi_S_RegisterSound( "sound/weapons/detpack/stick.wav" ); cgi_R_RegisterModel( "models/weapons2/detpack/detpack.md3" ); cgi_S_RegisterSound( "sound/weapons/detpack/warning.wav" ); @@ -559,13 +564,13 @@ void CG_RegisterItemVisuals( int itemNum ) { itemInfo->icon = -1; } - if ( item->giType == IT_WEAPON ) + if ( item->giType == IT_WEAPON ) { CG_RegisterWeapon( item->giTag ); } // some ammo types are actually the weapon, like in the case of explosives - if ( item->giType == IT_AMMO ) + if ( item->giType == IT_AMMO ) { switch( item->giTag ) { @@ -643,7 +648,7 @@ VIEW WEAPON CG_MapTorsoToWeaponFrame animations MUST match the defined pattern! -the weapon hand animation has 3 anims, +the weapon hand animation has 3 anims, 6 frames of attack 4 frames of drop 5 frames of raise @@ -652,7 +657,7 @@ the weapon hand animation has 3 anims, ================= */ extern qboolean ValidAnimFileIndex ( int index ); -int CG_MapTorsoToWeaponFrame( const clientInfo_t *ci, int frame, int animNum, int weaponNum, int firing ) +int CG_MapTorsoToWeaponFrame( const clientInfo_t *ci, int frame, int animNum, int weaponNum, int firing ) { // we should use the animNum to map a weapon frame instead of relying on the torso frame if ( !ValidAnimFileIndex( ci->animFileIndex ) ) @@ -680,7 +685,7 @@ int CG_MapTorsoToWeaponFrame( const clientInfo_t *ci, int frame, int animNum, in break; case TORSO_DROPWEAP1: - if ( frame >= animations[animNum].firstFrame && frame < animations[animNum].firstFrame + 5 ) + if ( frame >= animations[animNum].firstFrame && frame < animations[animNum].firstFrame + 5 ) { ret = frame - animations[animNum].firstFrame + 6; } @@ -691,7 +696,7 @@ int CG_MapTorsoToWeaponFrame( const clientInfo_t *ci, int frame, int animNum, in break; case TORSO_RAISEWEAP1: - if ( frame >= animations[animNum].firstFrame && frame < animations[animNum].firstFrame + 4 ) + if ( frame >= animations[animNum].firstFrame && frame < animations[animNum].firstFrame + 4 ) { ret = frame - animations[animNum].firstFrame + 6 + 5; } @@ -705,7 +710,7 @@ int CG_MapTorsoToWeaponFrame( const clientInfo_t *ci, int frame, int animNum, in case BOTH_ATTACK2: case BOTH_ATTACK3: case BOTH_ATTACK4: - if ( frame >= animations[animNum].firstFrame && frame < animations[animNum].firstFrame + 6 ) + if ( frame >= animations[animNum].firstFrame && frame < animations[animNum].firstFrame + 6 ) { ret = 1 + ( frame - animations[animNum].firstFrame ); } @@ -716,7 +721,7 @@ int CG_MapTorsoToWeaponFrame( const clientInfo_t *ci, int frame, int animNum, in break; default: break; - } + } return ret; } @@ -726,7 +731,7 @@ int CG_MapTorsoToWeaponFrame( const clientInfo_t *ci, int frame, int animNum, in CG_CalculateWeaponPosition ============== */ -void CG_CalculateWeaponPosition( vec3_t origin, vec3_t angles ) +void CG_CalculateWeaponPosition( vec3_t origin, vec3_t angles ) { float scale; int delta; @@ -752,7 +757,7 @@ void CG_CalculateWeaponPosition( vec3_t origin, vec3_t angles ) if ( delta < LAND_DEFLECT_TIME ) { origin[2] += cg.landChange*0.25 * delta / LAND_DEFLECT_TIME; } else if ( delta < LAND_DEFLECT_TIME + LAND_RETURN_TIME ) { - origin[2] += cg.landChange*0.25 * + origin[2] += cg.landChange*0.25 * (LAND_DEFLECT_TIME + LAND_RETURN_TIME - delta) / LAND_RETURN_TIME; } @@ -837,7 +842,7 @@ static void CG_DoMuzzleFlash( centity_t *cent, vec3_t org, vec3_t dir, weaponDat { effect = &wData->mMuzzleEffect[0]; } - + if ( cent->altFire ) { // We're alt-firing, so see if we need to override with a custom alt-fire effect @@ -887,7 +892,7 @@ Add the weapon, and flash for the player's view extern int PM_TorsoAnimForFrame( gentity_t *ent, int torsoFrame ); extern float CG_ForceSpeedFOV( void ); -void CG_AddViewWeapon( playerState_t *ps ) +void CG_AddViewWeapon( playerState_t *ps ) { refEntity_t hand; refEntity_t gun; @@ -939,7 +944,7 @@ void CG_AddViewWeapon( playerState_t *ps ) } } // allow the gun to be completely removed - if ( !cg_drawGun.integer || cg.zoomMode ) + if ( !cg_drawGun.integer || cg.zoomMode ) { vec3_t origin; @@ -948,7 +953,7 @@ void CG_AddViewWeapon( playerState_t *ps ) VectorMA( origin, -10, cg.refdef.viewaxis[2], origin ); VectorMA( origin, 16, cg.refdef.viewaxis[0], origin ); // Doesn't look like we'll have lightning style guns. Clean this crap up when we are sure about this. -// CG_LightningBolt( cent, origin ); +// CG_LightningBolt( cent, origin ); // We should still do muzzle flashes though... CG_RegisterWeapon( ps->weapon ); @@ -974,7 +979,7 @@ void CG_AddViewWeapon( playerState_t *ps ) // drop gun lower at higher fov float actualFOV; gentity_t *player = &g_entities[0]; - if ( (cg.snap->ps.forcePowersActive&(1<client->ps.forcePowerDuration[FP_SPEED] )//cg.renderingThirdPerson && + if ( (cg.snap->ps.forcePowersActive&(1<client->ps.forcePowerDuration[FP_SPEED] )//cg.renderingThirdPerson && { actualFOV = CG_ForceSpeedFOV(); actualFOV = (cg_fovViewmodel.integer) ? actualFOV + (cg_fovViewmodel.integer - cg_fov.integer) : actualFOV; @@ -984,11 +989,11 @@ void CG_AddViewWeapon( playerState_t *ps ) actualFOV = (cg.overrides.active&CG_OVERRIDE_FOV) ? cg.overrides.fov : cg_fov.value; } - if ( cg_fovViewmodelAdjust.integer && actualFOV > 80 ) + if ( cg_fovViewmodelAdjust.integer && actualFOV > 80 ) { fovOffset = -0.1 * ( actualFOV - 80 ); - } - else + } + else { fovOffset = 0; } @@ -1012,9 +1017,9 @@ void CG_AddViewWeapon( playerState_t *ps ) if ( ps->weapon == WP_STUN_BATON ) { - cgi_S_AddLoopingSound( cent->currentState.number, - cent->lerpOrigin, - vec3_origin, + cgi_S_AddLoopingSound( cent->currentState.number, + cent->lerpOrigin, + vec3_origin, weapon->firingSound ); } @@ -1040,13 +1045,13 @@ void CG_AddViewWeapon( playerState_t *ps ) } // map torso animations to weapon animations - if ( cg_gun_frame.integer ) + if ( cg_gun_frame.integer ) { // development tool hand.frame = hand.oldframe = cg_gun_frame.integer; hand.backlerp = 0; - } - else + } + else { // get clientinfo for animation map const clientInfo_t *ci = ¢->gent->client->clientInfo; @@ -1077,7 +1082,7 @@ void CG_AddViewWeapon( playerState_t *ps ) memset (&gun, 0, sizeof(gun)); gun.hModel = weapon->weaponModel; - if (!gun.hModel) + if (!gun.hModel) { return; } @@ -1121,7 +1126,7 @@ void CG_AddViewWeapon( playerState_t *ps ) } */ // add the spinning barrel[s] - for (i = 0; (i < wData->numBarrels); i++) + for (i = 0; (i < wData->numBarrels); i++) { refEntity_t barrel; memset( &barrel, 0, sizeof( barrel ) ); @@ -1139,10 +1144,10 @@ void CG_AddViewWeapon( playerState_t *ps ) // } AnglesToAxis( angles, barrel.axis ); - if (!i) + if (!i) { CG_PositionRotatedEntityOnTag( &barrel, &hand, weapon->handsModel, "tag_barrel", NULL ); - } else + } else { CG_PositionRotatedEntityOnTag( &barrel, &hand, weapon->handsModel, va("tag_barrel%d",i+1), NULL ); } @@ -1164,12 +1169,12 @@ void CG_AddViewWeapon( playerState_t *ps ) // VectorNormalize( cent->gent->client->renderInfo.muzzleDir ); cent->gent->client->renderInfo.mPCalcTime = cg.time; - CG_LightningBolt( cent, flash.origin ); + CG_LightningBolt( cent, flash.origin ); } // Do special charge bits //----------------------- - if (( ps->weaponstate == WEAPON_CHARGING_ALT && ps->weapon == WP_BRYAR_PISTOL ) + if (( ps->weaponstate == WEAPON_CHARGING_ALT && ps->weapon == WP_BRYAR_PISTOL ) || ( ps->weapon == WP_BOWCASTER && ps->weaponstate == WEAPON_CHARGING ) || ( ps->weapon == WP_DEMP2 && ps->weaponstate == WEAPON_CHARGING_ALT )) { @@ -1258,7 +1263,7 @@ WEAPON SELECTION CG_WeaponCheck =================== */ -int CG_WeaponCheck( int weaponIndex ) +int CG_WeaponCheck( int weaponIndex ) { int value; @@ -1267,8 +1272,8 @@ int CG_WeaponCheck( int weaponIndex ) return qtrue; } - value = weaponData[weaponIndex].energyPerShot < weaponData[weaponIndex].altEnergyPerShot - ? weaponData[weaponIndex].energyPerShot + value = weaponData[weaponIndex].energyPerShot < weaponData[weaponIndex].altEnergyPerShot + ? weaponData[weaponIndex].energyPerShot : weaponData[weaponIndex].altEnergyPerShot; if (value > 0) @@ -1310,8 +1315,8 @@ void CG_DrawIconBackground(void) return; } - prongLeftX =x2+37; - prongRightX =x2+544; + prongLeftX =x2+37; + prongRightX =x2+544; if (((cg.inventorySelectTime+WEAPON_SELECT_TIME)>cg.time) || (cgs.media.currentBackground == ICON_INVENTORY)) // Display inventory background? { @@ -1352,15 +1357,15 @@ void CG_DrawIconBackground(void) xAdd = 0; } - cgi_R_SetColor( colorTable[CT_WHITE] ); + cgi_R_SetColor( colorTable[CT_WHITE] ); CG_DrawPic( prongLeftX+xAdd, y2-10, 40, 80, cgs.media.weaponProngsOff); CG_DrawPic( prongRightX-xAdd, y2-10, -40, 80, cgs.media.weaponProngsOff); return; } - prongLeftX =x2+37; - prongRightX =x2+544; + prongLeftX =x2+37; + prongRightX =x2+544; if (!cg.iconHUDActive) { @@ -1383,24 +1388,24 @@ void CG_DrawIconBackground(void) cg.iconHUDPercent=1; } - cgi_R_SetColor( colorTable[CT_WHITE] ); + cgi_R_SetColor( colorTable[CT_WHITE] ); height = (int) (60.0f*cg.iconHUDPercent); CG_DrawPic( x2+60, y2+30, 460, -height, background); // Top half CG_DrawPic( x2+60, y2+30-2,460, height, background); // Bottom half // And now for the prongs - if ((cg.inventorySelectTime+WEAPON_SELECT_TIME)>cg.time) + if ((cg.inventorySelectTime+WEAPON_SELECT_TIME)>cg.time) { cgs.media.currentBackground = ICON_INVENTORY; background = cgs.media.inventoryProngsOn; } - else if ((cg.weaponSelectTime+WEAPON_SELECT_TIME)>cg.time) + else if ((cg.weaponSelectTime+WEAPON_SELECT_TIME)>cg.time) { cgs.media.currentBackground = ICON_WEAPONS; background = cgs.media.weaponProngsOn; } - else + else { cgs.media.currentBackground = ICON_FORCE; background = cgs.media.forceProngsOn; @@ -1408,7 +1413,7 @@ void CG_DrawIconBackground(void) // Side Prongs - cgi_R_SetColor( colorTable[CT_WHITE]); + cgi_R_SetColor( colorTable[CT_WHITE]); xAdd = (int) 8*cg.iconHUDPercent; CG_DrawPic( prongLeftX+xAdd, y2-10, 40, 80, background); CG_DrawPic( prongRightX-xAdd, y2-10, -40, 80, background); @@ -1416,7 +1421,7 @@ void CG_DrawIconBackground(void) int cgi_UI_GetItemText(char *menuFile,char *itemName, char *text); -char *weaponDesc[13] = +char *weaponDesc[13] = { "SABER_DESC", "BLASTER_PISTOL_DESC", @@ -1439,7 +1444,7 @@ char *weaponDesc[13] = CG_DrawDataPadWeaponSelect =================== */ -void CG_DrawDataPadWeaponSelect( void ) +void CG_DrawDataPadWeaponSelect( void ) { int i; int bits; @@ -1448,7 +1453,6 @@ void CG_DrawDataPadWeaponSelect( void ) int holdX,x,y,pad; int sideLeftIconCnt,sideRightIconCnt; int sideMax,holdCount,iconCnt; - int height; vec4_t calcColor; char text[1024]={0}; vec4_t textColor = { .875f, .718f, .121f, 1.0f }; @@ -1460,9 +1464,9 @@ void CG_DrawDataPadWeaponSelect( void ) // count the number of weapons owned count = 0; - for ( i = 1 ; i < 16 ; i++ ) + for ( i = 1 ; i < 16 ; i++ ) { - if ( bits & ( 1 << i ) ) + if ( bits & ( 1 << i ) ) { count++; } @@ -1502,12 +1506,12 @@ void CG_DrawDataPadWeaponSelect( void ) { cg.DataPadWeaponSelect = MAX_PLAYER_WEAPONS; } - + i = cg.DataPadWeaponSelect - 1; if (i<1) { i = 13; - } + } smallIconSize = 40; bigIconSize = 80; @@ -1519,13 +1523,13 @@ void CG_DrawDataPadWeaponSelect( void ) // Background memcpy(calcColor, colorTable[CT_WHITE], sizeof(vec4_t)); calcColor[3] = .60f; - cgi_R_SetColor( calcColor); + cgi_R_SetColor( calcColor); // Left side ICONS - cgi_R_SetColor( calcColor); + cgi_R_SetColor( calcColor); // Work backwards from current icon holdX = x - ((bigIconSize/2) + pad + smallIconSize); - height = smallIconSize * cg.iconHUDPercent; + //height = smallIconSize * cg.iconHUDPercent; for (iconCnt=1;iconCnt<(sideLeftIconCnt+1);i--) { @@ -1544,7 +1548,7 @@ void CG_DrawDataPadWeaponSelect( void ) if (weaponData[i].weaponIcon[0]) { weaponInfo_t *weaponInfo; - CG_RegisterWeapon( i ); + CG_RegisterWeapon( i ); weaponInfo = &cg_weapons[i]; if (!CG_WeaponCheck(i)) @@ -1561,7 +1565,7 @@ void CG_DrawDataPadWeaponSelect( void ) } // Current Center Icon - height = bigIconSize * cg.iconHUDPercent; + //height = bigIconSize * cg.iconHUDPercent; cgi_R_SetColor(NULL); // char buffer[256]; @@ -1570,7 +1574,7 @@ void CG_DrawDataPadWeaponSelect( void ) if (weaponData[cg.DataPadWeaponSelect].weaponIcon[0]) { weaponInfo_t *weaponInfo; - CG_RegisterWeapon( cg.DataPadWeaponSelect ); + CG_RegisterWeapon( cg.DataPadWeaponSelect ); weaponInfo = &cg_weapons[cg.DataPadWeaponSelect]; if (!CG_WeaponCheck(cg.DataPadWeaponSelect)) @@ -1591,9 +1595,9 @@ void CG_DrawDataPadWeaponSelect( void ) // Right side ICONS // Work forwards from current icon - cgi_R_SetColor( calcColor); + cgi_R_SetColor( calcColor); holdX = x + (bigIconSize/2) + pad; - height = smallIconSize * cg.iconHUDPercent; + //height = smallIconSize * cg.iconHUDPercent; for (iconCnt=1;iconCnt<(sideRightIconCnt+1);i++) { if (i>13) @@ -1611,7 +1615,7 @@ void CG_DrawDataPadWeaponSelect( void ) if (weaponData[i].weaponIcon[0]) { weaponInfo_t *weaponInfo; - CG_RegisterWeapon( i ); + CG_RegisterWeapon( i ); weaponInfo = &cg_weapons[i]; // No ammo for this weapon? if (!CG_WeaponCheck(i)) @@ -1639,14 +1643,14 @@ void CG_DrawDataPadWeaponSelect( void ) CG_DisplayBoxedText(70,50,500,300,text, cgs.media.qhFontSmall, 0.7f, - textColor + textColor ); } /* CG_DisplayBoxedText(70,50,500,300,weaponDesc[cg.DataPadWeaponSelect-1], cgs.media.qhFontSmall, 0.7f, - colorTable[CT_WHITE] + colorTable[CT_WHITE] ); */ @@ -1667,8 +1671,8 @@ void CG_DrawDataPadIconBackground(int backgroundType) x2 = 0; y2 = 295; - prongLeftX =x2+97; - prongRightX =x2+544; + prongLeftX =x2+97; + prongRightX =x2+544; if (backgroundType == ICON_INVENTORY) // Display inventory background? { @@ -1709,7 +1713,7 @@ void CG_DrawDataPadIconBackground(int backgroundType) xAdd = 0; } - cgi_R_SetColor( colorTable[CT_WHITE] ); + cgi_R_SetColor( colorTable[CT_WHITE] ); CG_DrawPic( prongLeftX+xAdd, y2-10, 40, 80, cgs.media.weaponProngsOff); CG_DrawPic( prongRightX-xAdd, y2-10, -40, 80, cgs.media.weaponProngsOff); @@ -1717,8 +1721,8 @@ void CG_DrawDataPadIconBackground(int backgroundType) } */ - prongLeftX =x2+97; - prongRightX =x2+544; + prongLeftX =x2+97; + prongRightX =x2+544; /* if (!cg.iconDataPadHUDActive) { @@ -1741,31 +1745,31 @@ void CG_DrawDataPadIconBackground(int backgroundType) cg.iconDataPadHUDPercent=1; } */ - cgi_R_SetColor( colorTable[CT_WHITE] ); + cgi_R_SetColor( colorTable[CT_WHITE] ); // height = (int) (60.0f*cg.iconDataPadHUDPercent); height = (int) 60.0f; CG_DrawPic( x2+110, y2+30, 410, -height, background); // Top half CG_DrawPic( x2+110, y2+30-2,410, height, background); // Bottom half // And now for the prongs - if (backgroundType==ICON_INVENTORY) + if (backgroundType==ICON_INVENTORY) { cgs.media.currentDataPadIconBackground = ICON_INVENTORY; background = cgs.media.inventoryProngsOn; } - else if (backgroundType==ICON_WEAPONS) + else if (backgroundType==ICON_WEAPONS) { cgs.media.currentDataPadIconBackground = ICON_WEAPONS; background = cgs.media.weaponProngsOn; } - else + else { cgs.media.currentDataPadIconBackground = ICON_FORCE; background = cgs.media.forceProngsOn; } // Side Prongs - cgi_R_SetColor( colorTable[CT_WHITE]); + cgi_R_SetColor( colorTable[CT_WHITE]); // xAdd = (int) 8*cg.iconDataPadHUDPercent; xAdd = (int) 8; CG_DrawPic( prongLeftX+xAdd, y2-10, 40, 80, background); @@ -1798,7 +1802,7 @@ void SetWeaponSelectTime(void) CG_DrawWeaponSelect =================== */ -void CG_DrawWeaponSelect( void ) +void CG_DrawWeaponSelect( void ) { int i; int bits; @@ -1822,7 +1826,7 @@ void CG_DrawWeaponSelect( void ) } // don't display if dead - if ( cg.predicted_player_state.stats[STAT_HEALTH] <= 0 ) + if ( cg.predicted_player_state.stats[STAT_HEALTH] <= 0 ) { return; } @@ -1836,9 +1840,9 @@ void CG_DrawWeaponSelect( void ) // count the number of weapons owned count = 0; - for ( i = 1 ; i < 16 ; i++ ) + for ( i = 1 ; i < 16 ; i++ ) { - if ( bits & ( 1 << i ) ) + if ( bits & ( 1 << i ) ) { count++; } @@ -1885,10 +1889,10 @@ void CG_DrawWeaponSelect( void ) // Background memcpy(calcColor, colorTable[CT_WHITE], sizeof(vec4_t)); calcColor[3] = .60f; - cgi_R_SetColor( calcColor); + cgi_R_SetColor( calcColor); // Left side ICONS - cgi_R_SetColor( calcColor); + cgi_R_SetColor( calcColor); // Work backwards from current icon holdX = x - ((bigIconSize/2) + pad + smallIconSize); //height = smallIconSize * cg.iconHUDPercent; @@ -1910,7 +1914,7 @@ void CG_DrawWeaponSelect( void ) if (weaponData[i].weaponIcon[0]) { weaponInfo_t *weaponInfo; - CG_RegisterWeapon( i ); + CG_RegisterWeapon( i ); weaponInfo = &cg_weapons[i]; if (!CG_WeaponCheck(i)) @@ -1932,7 +1936,7 @@ void CG_DrawWeaponSelect( void ) if (weaponData[cg.weaponSelect].weaponIcon[0]) { weaponInfo_t *weaponInfo; - CG_RegisterWeapon( cg.weaponSelect ); + CG_RegisterWeapon( cg.weaponSelect ); weaponInfo = &cg_weapons[cg.weaponSelect]; if (!CG_WeaponCheck(cg.weaponSelect)) @@ -1953,7 +1957,7 @@ void CG_DrawWeaponSelect( void ) // Right side ICONS // Work forwards from current icon - cgi_R_SetColor( calcColor); + cgi_R_SetColor( calcColor); holdX = x + (bigIconSize/2) + pad; //height = smallIconSize * cg.iconHUDPercent; for (iconCnt=1;iconCnt<(sideRightIconCnt+1);i++) @@ -1973,7 +1977,7 @@ void CG_DrawWeaponSelect( void ) if (weaponData[i].weaponIcon[0]) { weaponInfo_t *weaponInfo; - CG_RegisterWeapon( i ); + CG_RegisterWeapon( i ); weaponInfo = &cg_weapons[i]; // No ammo for this weapon? if (!CG_WeaponCheck(i)) @@ -1993,13 +1997,13 @@ void CG_DrawWeaponSelect( void ) gitem_t *item = cg_weapons[ cg.weaponSelect ].item; // draw the selected name - if ( item && item->classname && item->classname[0] ) + if ( item && item->classname && item->classname[0] ) { char text[1024]; - + if ( cgi_SP_GetStringTextString( va("INGAME_%s",item->classname), text, sizeof( text ))) { - int w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 1.0f); + int w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 1.0f); int x = ( SCREEN_WIDTH - w ) / 2; cgi_R_Font_DrawString(x, (SCREEN_HEIGHT - 24), text, textColor, cgs.media.qhFontSmall, -1, 1.0f); } @@ -2014,12 +2018,12 @@ void CG_DrawWeaponSelect( void ) CG_WeaponSelectable =============== */ -qboolean CG_WeaponSelectable( int i, int original, qboolean dpMode ) +qboolean CG_WeaponSelectable( int i, int original, qboolean dpMode ) { int usage_for_weap; if (i > MAX_PLAYER_WEAPONS) - { + { #ifndef FINAL_BUILD Com_Printf("CG_WeaponSelectable() passed illegal index of %d!\n",i); #endif @@ -2039,11 +2043,11 @@ qboolean CG_WeaponSelectable( int i, int original, qboolean dpMode ) if (( weaponData[i].ammoIndex != AMMO_NONE ) && !dpMode ) {//weapon uses ammo, see if we have any - usage_for_weap = weaponData[i].energyPerShot < weaponData[i].altEnergyPerShot - ? weaponData[i].energyPerShot + usage_for_weap = weaponData[i].energyPerShot < weaponData[i].altEnergyPerShot + ? weaponData[i].energyPerShot : weaponData[i].altEnergyPerShot; - if ( cg.snap->ps.ammo[weaponData[i].ammoIndex] - usage_for_weap < 0 ) + if ( cg.snap->ps.ammo[weaponData[i].ammoIndex] - usage_for_weap < 0 ) { if ( i != WP_DET_PACK ) // detpack can be switched to...should possibly check if there are any stuck to a wall somewhere? { @@ -2053,7 +2057,7 @@ qboolean CG_WeaponSelectable( int i, int original, qboolean dpMode ) } } - if (!(cg.snap->ps.stats[ STAT_WEAPONS ] & ( 1 << i ))) + if (!(cg.snap->ps.stats[ STAT_WEAPONS ] & ( 1 << i ))) { // Don't have this weapon to start with. return qfalse; @@ -2145,8 +2149,8 @@ void CG_NextWeapon_f( void ) { if ( cg.snap->ps.viewEntity ) { // yeah, probably need a better check here - if ( g_entities[cg.snap->ps.viewEntity].client && ( g_entities[cg.snap->ps.viewEntity].client->NPC_class == CLASS_R5D2 - || g_entities[cg.snap->ps.viewEntity].client->NPC_class == CLASS_R2D2 + if ( g_entities[cg.snap->ps.viewEntity].client && ( g_entities[cg.snap->ps.viewEntity].client->NPC_class == CLASS_R5D2 + || g_entities[cg.snap->ps.viewEntity].client->NPC_class == CLASS_R2D2 || g_entities[cg.snap->ps.viewEntity].client->NPC_class == CLASS_MOUSE )) { return; @@ -2155,16 +2159,16 @@ void CG_NextWeapon_f( void ) { original = cg.weaponSelect; - for ( i = 0 ; i <= MAX_PLAYER_WEAPONS ; i++ ) + for ( i = 0 ; i <= MAX_PLAYER_WEAPONS ; i++ ) { cg.weaponSelect++; - if ( cg.weaponSelect < FIRST_WEAPON || cg.weaponSelect > MAX_PLAYER_WEAPONS) { - cg.weaponSelect = FIRST_WEAPON; + if ( cg.weaponSelect < FIRST_WEAPON || cg.weaponSelect > MAX_PLAYER_WEAPONS) { + cg.weaponSelect = FIRST_WEAPON; } - - if ( CG_WeaponSelectable( cg.weaponSelect, original, qfalse ) ) - { + + if ( CG_WeaponSelectable( cg.weaponSelect, original, qfalse ) ) + { // cg.weaponSelectTime = cg.time; SetWeaponSelectTime(); return; @@ -2194,16 +2198,16 @@ void CG_DPNextWeapon_f( void ) { original = cg.DataPadWeaponSelect; - for ( i = 0 ; i <= MAX_PLAYER_WEAPONS ; i++ ) + for ( i = 0 ; i <= MAX_PLAYER_WEAPONS ; i++ ) { cg.DataPadWeaponSelect++; - if ( cg.DataPadWeaponSelect < FIRST_WEAPON || cg.DataPadWeaponSelect > MAX_PLAYER_WEAPONS) { - cg.DataPadWeaponSelect = FIRST_WEAPON; + if ( cg.DataPadWeaponSelect < FIRST_WEAPON || cg.DataPadWeaponSelect > MAX_PLAYER_WEAPONS) { + cg.DataPadWeaponSelect = FIRST_WEAPON; } - - if ( CG_WeaponSelectable( cg.DataPadWeaponSelect, original, qtrue ) ) - { + + if ( CG_WeaponSelectable( cg.DataPadWeaponSelect, original, qtrue ) ) + { return; } } @@ -2216,18 +2220,18 @@ void CG_DPNextWeapon_f( void ) { CG_DPPrevWeapon_f =============== */ -void CG_DPPrevWeapon_f( void ) +void CG_DPPrevWeapon_f( void ) { int i; int original; - if ( !cg.snap ) + if ( !cg.snap ) { return; } /* - if ( cg.snap->ps.pm_flags & PMF_FOLLOW ) + if ( cg.snap->ps.pm_flags & PMF_FOLLOW ) { return; } @@ -2235,15 +2239,15 @@ void CG_DPPrevWeapon_f( void ) original = cg.DataPadWeaponSelect; - for ( i = 0 ; i <= MAX_PLAYER_WEAPONS ; i++ ) + for ( i = 0 ; i <= MAX_PLAYER_WEAPONS ; i++ ) { cg.DataPadWeaponSelect--; - if ( cg.DataPadWeaponSelect < FIRST_WEAPON || cg.DataPadWeaponSelect > MAX_PLAYER_WEAPONS) - { + if ( cg.DataPadWeaponSelect < FIRST_WEAPON || cg.DataPadWeaponSelect > MAX_PLAYER_WEAPONS) + { cg.DataPadWeaponSelect = MAX_PLAYER_WEAPONS; } - - if ( CG_WeaponSelectable( cg.DataPadWeaponSelect, original, qtrue ) ) + + if ( CG_WeaponSelectable( cg.DataPadWeaponSelect, original, qtrue ) ) { return; } @@ -2291,8 +2295,8 @@ void CG_PrevWeapon_f( void ) { if ( cg.snap->ps.viewEntity ) { // yeah, probably need a better check here - if ( g_entities[cg.snap->ps.viewEntity].client && ( g_entities[cg.snap->ps.viewEntity].client->NPC_class == CLASS_R5D2 - || g_entities[cg.snap->ps.viewEntity].client->NPC_class == CLASS_R2D2 + if ( g_entities[cg.snap->ps.viewEntity].client && ( g_entities[cg.snap->ps.viewEntity].client->NPC_class == CLASS_R5D2 + || g_entities[cg.snap->ps.viewEntity].client->NPC_class == CLASS_R2D2 || g_entities[cg.snap->ps.viewEntity].client->NPC_class == CLASS_MOUSE )) { return; @@ -2303,11 +2307,11 @@ void CG_PrevWeapon_f( void ) { for ( i = 0 ; i <= MAX_PLAYER_WEAPONS ; i++ ) { cg.weaponSelect--; - if ( cg.weaponSelect < FIRST_WEAPON || cg.weaponSelect > MAX_PLAYER_WEAPONS) { + if ( cg.weaponSelect < FIRST_WEAPON || cg.weaponSelect > MAX_PLAYER_WEAPONS) { cg.weaponSelect = MAX_PLAYER_WEAPONS; } - - if ( CG_WeaponSelectable( cg.weaponSelect, original, qfalse ) ) + + if ( CG_WeaponSelectable( cg.weaponSelect, original, qfalse ) ) { SetWeaponSelectTime(); // cg.weaponSelectTime = cg.time; @@ -2327,7 +2331,7 @@ void CG_ChangeWeapon( int num ) { gentity_t *player = &g_entities[0]; - if ( num < WP_NONE || num >= WP_NUM_WEAPONS ) + if ( num < WP_NONE || num >= WP_NUM_WEAPONS ) { return; } @@ -2338,7 +2342,7 @@ void CG_ChangeWeapon( int num ) return; } - if ( player->client != NULL && !(player->client->ps.stats[STAT_WEAPONS] & ( 1 << num )) ) + if ( player->client != NULL && !(player->client->ps.stats[STAT_WEAPONS] & ( 1 << num )) ) { return; // don't have the weapon } @@ -2346,16 +2350,16 @@ void CG_ChangeWeapon( int num ) // because we don't have an empty hand model for the thermal, don't allow selecting that weapon if it has no ammo if ( num == WP_THERMAL ) { - if ( cg.snap->ps.ammo[AMMO_THERMAL] <= 0 ) + if ( cg.snap->ps.ammo[AMMO_THERMAL] <= 0 ) { return; } } - + // because we don't have an empty hand model for the thermal, don't allow selecting that weapon if it has no ammo if ( num == WP_TRIP_MINE ) { - if ( cg.snap->ps.ammo[AMMO_TRIPMINE] <= 0 ) + if ( cg.snap->ps.ammo[AMMO_TRIPMINE] <= 0 ) { return; } @@ -2371,7 +2375,7 @@ void CG_ChangeWeapon( int num ) CG_Weapon_f =============== */ -void CG_Weapon_f( void ) +void CG_Weapon_f( void ) { int num; @@ -2410,8 +2414,8 @@ void CG_Weapon_f( void ) if ( cg.snap->ps.viewEntity ) { // yeah, probably need a better check here - if ( g_entities[cg.snap->ps.viewEntity].client && ( g_entities[cg.snap->ps.viewEntity].client->NPC_class == CLASS_R5D2 - || g_entities[cg.snap->ps.viewEntity].client->NPC_class == CLASS_R2D2 + if ( g_entities[cg.snap->ps.viewEntity].client && ( g_entities[cg.snap->ps.viewEntity].client->NPC_class == CLASS_R5D2 + || g_entities[cg.snap->ps.viewEntity].client->NPC_class == CLASS_R2D2 || g_entities[cg.snap->ps.viewEntity].client->NPC_class == CLASS_MOUSE )) { return; @@ -2483,8 +2487,8 @@ void CG_Weapon_f( void ) if ( cg.snap->ps.ammo[weaponData[weap].ammoIndex] > 0 || weap == WP_DET_PACK ) { - if ( CG_WeaponSelectable( weap, cg.snap->ps.weapon, qfalse ) ) - { + if ( CG_WeaponSelectable( weap, cg.snap->ps.weapon, qfalse ) ) + { num = weap; break; } @@ -2526,8 +2530,8 @@ void CG_OutOfAmmoChange( void ) { original = cg.weaponSelect; - for ( i = WP_ROCKET_LAUNCHER; i > 0 ; i-- ) - { + for ( i = WP_ROCKET_LAUNCHER; i > 0 ; i-- ) + { // We don't want the emplaced, melee, or explosive devices here if ( original != i && CG_WeaponSelectable( i, original, qfalse ) ) { @@ -2540,8 +2544,8 @@ void CG_OutOfAmmoChange( void ) { if ( cg_autoswitch.integer != 1 ) { // didn't have that, so try these. Start with thermal... - for ( i = WP_THERMAL; i <= WP_DET_PACK; i++ ) - { + for ( i = WP_THERMAL; i <= WP_DET_PACK; i++ ) + { // We don't want the emplaced, or melee here if ( original != i && CG_WeaponSelectable( i, original, qfalse ) ) { @@ -2584,7 +2588,7 @@ CG_FireWeapon Caused by an EV_FIRE_WEAPON event ================ */ -void CG_FireWeapon( centity_t *cent, qboolean alt_fire ) +void CG_FireWeapon( centity_t *cent, qboolean alt_fire ) { entityState_t *ent; //weaponInfo_t *weap; @@ -2607,7 +2611,7 @@ void CG_FireWeapon( centity_t *cent, qboolean alt_fire ) // lightning type guns only does this this on initial press if ( ent->weapon == WP_SABER ) { - if ( cent->pe.lightningFiring ) + if ( cent->pe.lightningFiring ) { /* if ( ent->weapon == WP_DREADNOUGHT ) { @@ -2736,7 +2740,7 @@ CG_MissileHitWall Caused by an EV_MISSILE_MISS event, or directly by local bullet tracing ================= */ -void CG_MissileHitWall( centity_t *cent, int weapon, vec3_t origin, vec3_t dir, qboolean altFire ) +void CG_MissileHitWall( centity_t *cent, int weapon, vec3_t origin, vec3_t dir, qboolean altFire ) { int parm; @@ -2848,18 +2852,18 @@ CG_MissileHitPlayer ------------------------- */ -void CG_MissileHitPlayer( centity_t *cent, int weapon, vec3_t origin, vec3_t dir, qboolean altFire ) +void CG_MissileHitPlayer( centity_t *cent, int weapon, vec3_t origin, vec3_t dir, qboolean altFire ) { gentity_t *other = NULL; qboolean humanoid = qtrue; - + if ( cent->gent ) { other = &g_entities[cent->gent->s.otherEntityNum]; if( other->client ) { class_t npc_class = other->client->NPC_class; - // check for all droids, maybe check for certain monsters if they're considered non-humanoid..? + // check for all droids, maybe check for certain monsters if they're considered non-humanoid..? if ( npc_class == CLASS_SEEKER || npc_class == CLASS_PROBE || npc_class == CLASS_MOUSE || npc_class == CLASS_GONK || npc_class == CLASS_R2D2 || npc_class == CLASS_R5D2 || npc_class == CLASS_PROTOCOL || npc_class == CLASS_MARK1 || npc_class == CLASS_MARK2 || @@ -2924,7 +2928,7 @@ void CG_MissileHitPlayer( centity_t *cent, int weapon, vec3_t origin, vec3_t dir else { FX_FlechetteWeaponHitPlayer( origin, dir, humanoid ); - } + } break; case WP_ROCKET_LAUNCHER: diff --git a/codeJK2/cgame/strip_objectives.h b/codeJK2/cgame/strip_objectives.h index e782f8707c..af2ae5905b 100644 --- a/codeJK2/cgame/strip_objectives.h +++ b/codeJK2/cgame/strip_objectives.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __strip_objectives_h #define __strip_objectives_h diff --git a/codeJK2/game/AI_Atst.cpp b/codeJK2/game/AI_Atst.cpp index b523bd2edc..952e8b4aa5 100644 --- a/codeJK2/game/AI_Atst.cpp +++ b/codeJK2/game/AI_Atst.cpp @@ -1,25 +1,27 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top of all AI_xxxx.cpp files for PCH reasons... #include "g_headers.h" - - + #include "b_local.h" diff --git a/codeJK2/game/AI_Default.cpp b/codeJK2/game/AI_Default.cpp index fc2e8f7e09..2c0caca5a6 100644 --- a/codeJK2/game/AI_Default.cpp +++ b/codeJK2/game/AI_Default.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "g_headers.h" diff --git a/codeJK2/game/AI_Droid.cpp b/codeJK2/game/AI_Droid.cpp index 1ece70ce51..367e25206e 100644 --- a/codeJK2/game/AI_Droid.cpp +++ b/codeJK2/game/AI_Droid.cpp @@ -1,24 +1,25 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top of all AI_xxxx.cpp files for PCH reasons... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" - #include "b_local.h" diff --git a/codeJK2/game/AI_GalakMech.cpp b/codeJK2/game/AI_GalakMech.cpp index 0470251334..3234e9e655 100644 --- a/codeJK2/game/AI_GalakMech.cpp +++ b/codeJK2/game/AI_GalakMech.cpp @@ -1,25 +1,26 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top of all AI_xxxx.cpp files for PCH reasons... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" - #include "b_local.h" #include "g_nav.h" #include "anims.h" diff --git a/codeJK2/game/AI_Grenadier.cpp b/codeJK2/game/AI_Grenadier.cpp index 3bb496f3c1..125eaf8ebd 100644 --- a/codeJK2/game/AI_Grenadier.cpp +++ b/codeJK2/game/AI_Grenadier.cpp @@ -1,25 +1,26 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top of all AI_xxxx.cpp files for PCH reasons... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" - #include "b_local.h" #include "g_nav.h" #include "anims.h" diff --git a/codeJK2/game/AI_Howler.cpp b/codeJK2/game/AI_Howler.cpp index b90328a406..22c88ee5d2 100644 --- a/codeJK2/game/AI_Howler.cpp +++ b/codeJK2/game/AI_Howler.cpp @@ -1,24 +1,25 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top of all AI_xxxx.cpp files for PCH reasons... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" - #include "b_local.h" diff --git a/codeJK2/game/AI_ImperialProbe.cpp b/codeJK2/game/AI_ImperialProbe.cpp index 07cf0c015a..2a28cf7b92 100644 --- a/codeJK2/game/AI_ImperialProbe.cpp +++ b/codeJK2/game/AI_ImperialProbe.cpp @@ -1,25 +1,26 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top of all AI_xxxx.cpp files for PCH reasons... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" - #include "b_local.h" #include "g_nav.h" diff --git a/codeJK2/game/AI_Interrogator.cpp b/codeJK2/game/AI_Interrogator.cpp index e1426897fa..a3e311533b 100644 --- a/codeJK2/game/AI_Interrogator.cpp +++ b/codeJK2/game/AI_Interrogator.cpp @@ -1,25 +1,26 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top of all AI_xxxx.cpp files for PCH reasons... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" - #include "b_local.h" #include "g_nav.h" diff --git a/codeJK2/game/AI_Jedi.cpp b/codeJK2/game/AI_Jedi.cpp index 4ead4085f7..f942e67c5a 100644 --- a/codeJK2/game/AI_Jedi.cpp +++ b/codeJK2/game/AI_Jedi.cpp @@ -1,25 +1,26 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top of all AI_xxxx.cpp files for PCH reasons... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" - #include "b_local.h" #include "g_nav.h" #include "anims.h" @@ -206,7 +207,7 @@ void Jedi_CheckCloak( void ) if ( NPC && NPC->client && NPC->client->NPC_class == CLASS_SHADOWTROOPER ) { if ( NPC->client->ps.saberActive || - NPC->health <= 0 || + NPC->health <= 0 || NPC->client->ps.saberInFlight || (NPC->client->ps.eFlags&EF_FORCE_GRIPPED) || NPC->painDebounceTime > level.time ) @@ -229,7 +230,7 @@ static void Jedi_Aggression( gentity_t *self, int change ) int upper_threshold, lower_threshold; self->NPC->stats.aggression += change; - + //FIXME: base this on initial NPC stats if ( self->client->playerTeam == TEAM_PLAYER ) {//good guys are less aggressive @@ -268,7 +269,7 @@ static void Jedi_AggressionErosion( int amt ) TIMER_Set( NPC, "roamTime", Q_irand( 2000, 5000 ) ); Jedi_Aggression( NPC, amt ); } - + if ( NPCInfo->stats.aggression < 4 || (NPCInfo->stats.aggression < 6&&NPC->client->NPC_class == CLASS_DESANN)) {//turn off the saber if ( NPC->client->ps.saberActive ) @@ -331,13 +332,13 @@ SPEAKING static qboolean Jedi_BattleTaunt( void ) { - if ( TIMER_Done( NPC, "chatter" ) - && !Q_irand( 0, 3 ) - && NPCInfo->blockedSpeechDebounceTime < level.time + if ( TIMER_Done( NPC, "chatter" ) + && !Q_irand( 0, 3 ) + && NPCInfo->blockedSpeechDebounceTime < level.time && jediSpeechDebounceTime[NPC->client->playerTeam] < level.time ) { int event = -1; - if ( NPC->client->playerTeam == TEAM_PLAYER + if ( NPC->client->playerTeam == TEAM_PLAYER && NPC->enemy && NPC->enemy->client && NPC->enemy->client->NPC_class == CLASS_JEDI ) {//a jedi fighting a jedi - training if ( NPC->client->NPC_class == CLASS_JEDI && NPCInfo->rank == RANK_COMMANDER ) @@ -377,7 +378,7 @@ static qboolean Jedi_ClearPathToSpot( vec3_t dest, int impactEntNum ) //Offset the step height VectorSet( mins, NPC->mins[0], NPC->mins[1], NPC->mins[2] + STEPSIZE ); - + gi.trace( &trace, NPC->currentOrigin, mins, NPC->maxs, dest, NPC->s.number, NPC->clipmask, G2_NOCOLLIDE, 0 ); //Do a simple check @@ -398,7 +399,7 @@ static qboolean Jedi_ClearPathToSpot( vec3_t dest, int impactEntNum ) } } - //otherwise, clear path in a straight line. + //otherwise, clear path in a straight line. //Now at intervals of my size, go along the trace and trace down STEPSIZE to make sure there is a solid floor. VectorSubtract( dest, NPC->currentOrigin, dir ); dist = VectorNormalize( dir ); @@ -527,7 +528,7 @@ qboolean NPC_MoveDirClear( int forwardmove, int rightmove, qboolean reset ) if ( trace.fraction < 1.0 ) {//Not going off a cliff - //FIXME: what if plane.normal is sloped? We'll slide off, not land... plus this doesn't account for slide-movement... + //FIXME: what if plane.normal is sloped? We'll slide off, not land... plus this doesn't account for slide-movement... //gi.Printf( "%d walk off cliff okay will hit entnum %d at dropdist of %4.2f\n", level.time, trace.entityNum, (trace.fraction*bottom_max) ); return qtrue; } @@ -552,7 +553,7 @@ static void Jedi_HoldPosition( void ) { //NPCInfo->squadState = SQUAD_STAND_AND_SHOOT; NPCInfo->goalEntity = NULL; - + /* if ( TIMER_Done( NPC, "stand" ) ) { @@ -582,7 +583,7 @@ static void Jedi_Move( gentity_t *goal, qboolean retreat ) ucmd.rightmove *= -1; VectorScale( NPC->client->ps.moveDir, -1, NPC->client->ps.moveDir ); } - + //Get the move info NAV_GetLastMove( info ); @@ -652,7 +653,7 @@ static void Jedi_Retreat( void ) {//don't actually move return; } - //FIXME: when retreating, we should probably see if we can retreat + //FIXME: when retreating, we should probably see if we can retreat //in the direction we want. If not...? Evade? //gi.Printf( "Retreating\n" ); Jedi_Move( NPC->enemy, qtrue ); @@ -666,14 +667,14 @@ static void Jedi_Advance( void ) } //gi.Printf( "Advancing\n" ); Jedi_Move( NPC->enemy, qfalse ); - + //TIMER_Set( NPC, "roamTime", Q_irand( 2000, 4000 ) ); //TIMER_Set( NPC, "attackDelay", Q_irand( 250, 500 ) ); //TIMER_Set( NPC, "duck", 0 ); } static void Jedi_AdjustSaberAnimLevel( gentity_t *self, int newLevel ) -{ +{ if ( !self || !self->client ) { return; @@ -696,14 +697,14 @@ static void Jedi_AdjustSaberAnimLevel( gentity_t *self, int newLevel ) self->client->ps.saberAnimLevel = FORCE_LEVEL_1; return; } - if ( self->NPC->rank == RANK_CREWMAN + if ( self->NPC->rank == RANK_CREWMAN || self->NPC->rank == RANK_ENSIGN ) {//acrobat & force-users always use medium attacks self->client->ps.saberAnimLevel = FORCE_LEVEL_2; return; } /* - if ( self->NPC->rank == RANK_LT ) + if ( self->NPC->rank == RANK_LT ) {//boss always uses strong attacks self->client->ps.saberAnimLevel = FORCE_LEVEL_3; return; @@ -770,7 +771,7 @@ static void Jedi_CombatDistance( int enemy_dist ) TIMER_Set( NPC, "gripping", -level.time ); TIMER_Set( NPC, "attackDelay", Q_irand( 0, 1000 ) ); } - + if ( NPC->client->ps.saberInFlight && !PM_SaberInBrokenParry( NPC->client->ps.saberMove ) && NPC->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN ) @@ -831,9 +832,9 @@ static void Jedi_CombatDistance( int enemy_dist ) TIMER_Set( NPC, "strafeLeft", -1 ); TIMER_Set( NPC, "strafeRight", -1 ); } - else if ( NPC->enemy->client - && NPC->enemy->s.weapon == WP_SABER - && NPC->enemy->client->ps.saberLockTime > level.time + else if ( NPC->enemy->client + && NPC->enemy->s.weapon == WP_SABER + && NPC->enemy->client->ps.saberLockTime > level.time && NPC->client->ps.saberLockTime < level.time ) {//enemy is in a saberLock and we are not if ( enemy_dist < 64 ) @@ -841,8 +842,8 @@ static void Jedi_CombatDistance( int enemy_dist ) Jedi_Retreat(); } } - else if ( NPC->enemy->s.weapon == WP_TURRET - && !Q_stricmp( "PAS", NPC->enemy->classname ) + else if ( NPC->enemy->s.weapon == WP_TURRET + && !Q_stricmp( "PAS", NPC->enemy->classname ) && NPC->enemy->s.apos.trType == TR_STATIONARY ) { if ( enemy_dist > forcePushPullRadius[FORCE_LEVEL_1] - 16 ) @@ -928,8 +929,8 @@ static void Jedi_CombatDistance( int enemy_dist ) } } } - if ( NPCInfo->rank >= RANK_LT_JG - && !Q_irand( 0, 5 ) + if ( NPCInfo->rank >= RANK_LT_JG + && !Q_irand( 0, 5 ) && !(NPC->client->ps.forcePowersActive&(1 << FP_SPEED)) && !(NPC->client->ps.saberEventFlags&SEF_INWATER) )//saber not in water {//throw saber @@ -984,9 +985,9 @@ static void Jedi_CombatDistance( int enemy_dist ) { chanceScale = 5; } - if ( chanceScale + if ( chanceScale && (enemy_dist > Q_irand( 100, 200 ) || (NPCInfo->scriptFlags&SCF_DONT_FIRE)) - && enemy_dist < 500 + && enemy_dist < 500 && (Q_irand( 0, chanceScale*10 )<5 || (NPC->enemy->client && NPC->enemy->client->ps.weapon != WP_SABER && !Q_irand( 0, chanceScale ) ) ) ) {//else, randomly try some kind of attack every now and then if ( (NPCInfo->rank == RANK_ENSIGN || NPCInfo->rank > RANK_LT_JG) && !Q_irand( 0, 1 ) ) @@ -1027,14 +1028,14 @@ static void Jedi_CombatDistance( int enemy_dist ) TIMER_Set( NPC, "gripping", 3000 ); TIMER_Set( NPC, "attackDelay", 3000 ); } - else if ( WP_ForcePowerAvailable( NPC, FP_SABERTHROW, 0 ) + else if ( WP_ForcePowerAvailable( NPC, FP_SABERTHROW, 0 ) && !(NPC->client->ps.forcePowersActive&(1 << FP_SPEED)) && !(NPC->client->ps.saberEventFlags&SEF_INWATER) )//saber not in water {//throw saber ucmd.buttons |= BUTTON_ALT_ATTACK; } } - else if ( NPCInfo->rank >= RANK_LT_JG + else if ( NPCInfo->rank >= RANK_LT_JG && !(NPC->client->ps.forcePowersActive&(1 << FP_SPEED)) && !(NPC->client->ps.saberEventFlags&SEF_INWATER) )//saber not in water {//throw saber @@ -1098,7 +1099,7 @@ static qboolean Jedi_Strafe( int strafeTimeMin, int strafeTimeMax, int nextStraf { qboolean strafed = qfalse; //TODO: make left/right choice a tactical decision rather than random: - // try to keep own back away from walls and ledges, + // try to keep own back away from walls and ledges, // try to keep enemy's back to a ledge or wall // Maybe try to strafe toward designer-placed "safe spots" or "goals"? int strafeTime = Q_irand( strafeTimeMin, strafeTimeMax ); @@ -1273,7 +1274,7 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in { G_SetEnemy( self, shooter ); } - if ( self->NPC + if ( self->NPC && ((self->NPC->scriptFlags&SCF_NO_ACROBATICS) || PM_InKnockDown( &self->client->ps ) ) ) { return qfalse; @@ -1423,8 +1424,8 @@ evasionType_t Jedi_CheckFlipEvasions( gentity_t *self, float rightdot, float zdi } } else if ( self->client->NPC_class != CLASS_DESANN //desann doesn't do these kind of frilly acrobatics - && (self->NPC->rank == RANK_CREWMAN || self->NPC->rank >= RANK_LT) - && Q_irand( 0, 1 ) + && (self->NPC->rank == RANK_CREWMAN || self->NPC->rank >= RANK_LT) + && Q_irand( 0, 1 ) && !PM_InRoll( &self->client->ps ) && !PM_InKnockDown( &self->client->ps ) && !PM_SaberInSpecialAttack( self->client->ps.torsoAnim ) ) @@ -1541,7 +1542,7 @@ evasionType_t Jedi_CheckFlipEvasions( gentity_t *self, float rightdot, float zdi G_SoundOnEnt( self, CHAN_BODY, "sound/weapons/force/jump.wav" ); return EVASION_OTHER; } - else + else {//boxed in on both sides if ( DotProduct( self->client->ps.velocity, fwd ) < 0 ) {//moving backwards @@ -1608,12 +1609,12 @@ int Jedi_ReCalcParryTime( gentity_t *self, evasionType_t evasionType ) return 0; } if ( !self->s.number ) - {//player + {//player return parryDebounce[self->client->ps.forcePowerLevel[FP_SABER_DEFENSE]]; } else if ( self->NPC ) { - if ( !g_saberRealisticCombat->integer + if ( !g_saberRealisticCombat->integer && ( g_spskill->integer == 2 || (g_spskill->integer == 1 && self->client->NPC_class == CLASS_TAVION) ) ) { if ( self->client->NPC_class == CLASS_TAVION ) @@ -1732,7 +1733,7 @@ int Jedi_ReCalcParryTime( gentity_t *self, evasionType_t evasionType ) baseTime += 100; } } - + return baseTime; } } @@ -1753,14 +1754,14 @@ qboolean Jedi_QuickReactions( gentity_t *self ) qboolean Jedi_SaberBusy( gentity_t *self ) { - if ( self->client->ps.torsoAnimTimer > 300 - && ( (PM_SaberInAttack( self->client->ps.saberMove )&&self->client->ps.saberAnimLevel==FORCE_LEVEL_3) - || PM_SpinningSaberAnim( self->client->ps.torsoAnim ) - || PM_SaberInSpecialAttack( self->client->ps.torsoAnim ) - //|| PM_SaberInBounce( self->client->ps.saberMove ) - || PM_SaberInBrokenParry( self->client->ps.saberMove ) - //|| PM_SaberInDeflect( self->client->ps.saberMove ) - || PM_FlippingAnim( self->client->ps.torsoAnim ) + if ( self->client->ps.torsoAnimTimer > 300 + && ( (PM_SaberInAttack( self->client->ps.saberMove )&&self->client->ps.saberAnimLevel==FORCE_LEVEL_3) + || PM_SpinningSaberAnim( self->client->ps.torsoAnim ) + || PM_SaberInSpecialAttack( self->client->ps.torsoAnim ) + //|| PM_SaberInBounce( self->client->ps.saberMove ) + || PM_SaberInBrokenParry( self->client->ps.saberMove ) + //|| PM_SaberInDeflect( self->client->ps.saberMove ) + || PM_FlippingAnim( self->client->ps.torsoAnim ) || PM_RollingAnim( self->client->ps.torsoAnim ) ) ) {//my saber is not in a parrying position return qtrue; @@ -1788,7 +1789,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc float zdiff; int duckChance = 0; int dodgeAnim = -1; - qboolean saberBusy = qfalse, evaded = qfalse, doDodge = qfalse; + qboolean saberBusy = qfalse, /*evaded = qfalse, */doDodge = qfalse; evasionType_t evasionType = EVASION_NONE; //FIXME: if we don't have our saber in hand, pick the force throw option or a jump or strafe! @@ -1812,7 +1813,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc } } else - { + { if ( incoming->s.weapon == WP_SABER ) {//flying lightsaber, face it! //FIXME: for this to actually work, we'd need to call update angles too? @@ -1831,7 +1832,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc rightdot = DotProduct(right, diff);// + Q_flrand(-0.10f,0.10f); //totalHeight = self->client->renderInfo.eyePoint[2] - self->absmin[2]; zdiff = hitloc[2] - self->client->renderInfo.eyePoint[2];// + Q_irand(-6,6); - + //see if we can dodge if need-be if ( (dist>16&&(Q_irand( 0, 2 )||saberBusy)) || self->client->ps.saberInFlight || !self->client->ps.saberActive ) {//either it will miss by a bit (and 25% chance) OR our saber is not in-hand OR saber is off @@ -1867,8 +1868,8 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc { if ( incoming || !saberBusy ) { - if ( rightdot > 12 - || (rightdot > 3 && zdiff < 5) + if ( rightdot > 12 + || (rightdot > 3 && zdiff < 5) || (!incoming&&fabs(hitdir[2])<0.25f) )//was normalized, 0.3 { if ( doDodge ) @@ -1892,7 +1893,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc { TIMER_Start( self, "duck", Q_irand( 500, 1500 ) ); evasionType = EVASION_DUCK_PARRY; - evaded = qtrue; + //evaded = qtrue; if ( d_JediAI->integer ) { gi.Printf( "duck " ); @@ -1909,8 +1910,8 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc gi.Printf( "UR block\n" ); } } - else if ( rightdot < -12 - || (rightdot < -3 && zdiff < 5) + else if ( rightdot < -12 + || (rightdot < -3 && zdiff < 5) || (!incoming&&fabs(hitdir[2])<0.25f) )//was normalized, -0.3 { if ( doDodge ) @@ -1934,7 +1935,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc { TIMER_Start( self, "duck", Q_irand( 500, 1500 ) ); evasionType = EVASION_DUCK_PARRY; - evaded = qtrue; + ///evaded = qtrue; if ( d_JediAI->integer ) { gi.Printf( "duck " ); @@ -1964,7 +1965,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc gi.Printf( "TOP block\n" ); } } - evaded = qtrue; + //evaded = qtrue; } else { @@ -1973,7 +1974,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc //duckChance = 2; TIMER_Start( self, "duck", Q_irand( 500, 1500 ) ); evasionType = EVASION_DUCK; - evaded = qtrue; + //evaded = qtrue; if ( d_JediAI->integer ) { gi.Printf( "duck " ); @@ -1992,7 +1993,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc //duckChance = 2; TIMER_Start( self, "duck", Q_irand( 500, 1500 ) ); evasionType = EVASION_DUCK; - evaded = qtrue; + //evaded = qtrue; if ( d_JediAI->integer ) { gi.Printf( "duck " ); @@ -2066,7 +2067,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc gi.Printf( "mid-TOP block\n" ); } } - evaded = qtrue; + //evaded = qtrue; } } else if ( saberBusy || (zdiff < -36 && ( zdiff < -44 || !Q_irand( 0, 2 ) ) ) )//was -30 and -40//2nd one was -46 @@ -2075,7 +2076,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc {//already in air, duck to pull up legs TIMER_Start( self, "duck", Q_irand( 500, 1500 ) ); evasionType = EVASION_DUCK; - evaded = qtrue; + //evaded = qtrue; if ( d_JediAI->integer ) { gi.Printf( "legs up\n" ); @@ -2101,22 +2102,22 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc gi.Printf( "LL block\n" ); } } - evaded = qtrue; + //evaded = qtrue; } } - else + else {//gotta jump! if ( self->NPC && (self->NPC->rank == RANK_CREWMAN || self->NPC->rank > RANK_LT_JG ) && (!Q_irand( 0, 10 ) || (!Q_irand( 0, 2 ) && (cmd->forwardmove || cmd->rightmove))) ) {//superjump //FIXME: check the jump, if can't, then block - if ( self->NPC - && !(self->NPC->scriptFlags&SCF_NO_ACROBATICS) + if ( self->NPC + && !(self->NPC->scriptFlags&SCF_NO_ACROBATICS) && !PM_InKnockDown( &self->client->ps ) ) { self->client->ps.forceJumpCharge = 320;//FIXME: calc this intelligently evasionType = EVASION_FJUMP; - evaded = qtrue; + //evaded = qtrue; if ( d_JediAI->integer ) { gi.Printf( "force jump + " ); @@ -2137,7 +2138,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc self->client->ps.velocity[2] = JUMP_VELOCITY; } evasionType = EVASION_JUMP; - evaded = qtrue; + //evaded = qtrue; if ( d_JediAI->integer ) { gi.Printf( "jump + " ); @@ -2146,7 +2147,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc if ( self->client->NPC_class == CLASS_TAVION && !incoming && self->client->ps.groundEntityNum < ENTITYNUM_NONE && !Q_irand( 0, 2 ) ) { if ( !PM_SaberInAttack( self->client->ps.saberMove ) - && !PM_SaberInStart( self->client->ps.saberMove ) + && !PM_SaberInStart( self->client->ps.saberMove ) && !PM_InRoll( &self->client->ps ) && !PM_InKnockDown( &self->client->ps ) && !PM_SaberInSpecialAttack( self->client->ps.torsoAnim ) ) @@ -2170,7 +2171,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc G_SoundOnEnt( self, CHAN_BODY, "sound/weapons/force/jump.wav" ); cmd->upmove = 0; saberBusy = qtrue; - evaded = qtrue; + //evaded = qtrue; } } } @@ -2181,7 +2182,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc G_StartMatrixEffect( self ); } saberBusy = qtrue; - evaded = qtrue; + //evaded = qtrue; } else if ( incoming || !saberBusy ) { @@ -2218,7 +2219,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc gi.Printf( "LL block\n" ); } } - evaded = qtrue; + //evaded = qtrue; } } } @@ -2250,8 +2251,8 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc (!Q_irand( 0, 10 ) || (!Q_irand( 0, 2 ) && (cmd->forwardmove || cmd->rightmove))) ) {//superjump //FIXME: check the jump, if can't, then block - if ( self->NPC - && !(self->NPC->scriptFlags&SCF_NO_ACROBATICS) + if ( self->NPC + && !(self->NPC->scriptFlags&SCF_NO_ACROBATICS) && !PM_InKnockDown( &self->client->ps ) ) { self->client->ps.forceJumpCharge = 320;//FIXME: calc this intelligently @@ -2283,7 +2284,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc } } } - evaded = qtrue; + //evaded = qtrue; } } @@ -2356,7 +2357,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc extern int WPDEBUG_SaberColor( saber_colors_t saberColor ); static qboolean Jedi_SaberBlock( void ) { - vec3_t hitloc, saberTipOld, saberTip, top, bottom, axisPoint, saberPoint, dir;//saberBase, + vec3_t hitloc, saberTipOld, saberTip, top, bottom, axisPoint, saberPoint, dir;//saberBase, //FIXME: reborn don't block enough anymore /* @@ -2376,7 +2377,7 @@ static qboolean Jedi_SaberBlock( void ) {//can't move the saber to another position yet return qfalse; } - + /* if ( NPCInfo->rank < RANK_LT_JG && Q_irand( 0, (2 - g_spskill->integer) ) ) {//lower rank reborn have a random chance of not doing it at all @@ -2465,10 +2466,10 @@ static qboolean Jedi_SaberBlock( void ) { gi.Printf( S_COLOR_GREEN"enemy saber dist: %4.2f\n", dist ); } - + VectorSubtract( saberPoint, NPC->enemy->client->renderInfo.muzzlePoint, pointDir ); pointDist = VectorLength( pointDir ); - + if ( NPC->enemy->client->ps.saberLength <= 0 ) { baseDirPerc = 0.5f; @@ -2518,13 +2519,13 @@ static qboolean Jedi_SaberBlock( void ) { VectorCopy( tr.endpos, hitloc ); } - + if ( d_JediAI->integer ) { G_DebugLine( saberPoint, hitloc, FRAMETIME, WPDEBUG_SaberColor( NPC->enemy->client->ps.saberColor ), qtrue ); } - //FIXME: if saber is off and/or we have force speed and want to be really cocky, + //FIXME: if saber is off and/or we have force speed and want to be really cocky, // and the swing misses by some amount, we can use the dodges here... :) evasionType_t evasionType; if ( (evasionType=Jedi_SaberBlockGo( NPC, &ucmd, hitloc, dir, NULL, dist )) != EVASION_DODGE ) @@ -2590,8 +2591,8 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en { return; } - else if ( NPC->enemy->client - && NPC->enemy->s.weapon == WP_SABER + else if ( NPC->enemy->client + && NPC->enemy->s.weapon == WP_SABER && NPC->enemy->client->ps.saberLockTime > level.time ) {//don't try to block/evade an enemy who is in a saberLock return; @@ -2663,9 +2664,9 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en {//he's moving facingAmt = DotProduct( enemy_movedir, dirEnemy2Me ); } - + if ( Q_flrand( 0.25, 1 ) < facingAmt ) - {//coming at/facing me! + {//coming at/facing me! int whichDefense = 0; if ( NPC->client->ps.weaponTime || NPC->client->ps.saberInFlight ) {//I'm attacking or recovering from a parry, can only try to strafe/jump right now @@ -2793,8 +2794,8 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en {//FIXME: check forcePushRadius[NPC->client->ps.forcePowerLevel[FP_PUSH]] ForceThrow( NPC, qfalse ); } - else if ( (NPCInfo->rank==RANK_CREWMAN||NPCInfo->rank>RANK_LT_JG) - && !(NPCInfo->scriptFlags&SCF_NO_ACROBATICS) + else if ( (NPCInfo->rank==RANK_CREWMAN||NPCInfo->rank>RANK_LT_JG) + && !(NPCInfo->scriptFlags&SCF_NO_ACROBATICS) && !PM_InKnockDown( &NPC->client->ps ) ) {//FIXME: make this a function call? //FIXME: check for clearance, safety of landing spot? @@ -2834,8 +2835,8 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en { gi.Printf( "def strafe\n" ); } - if ( !(NPCInfo->scriptFlags&SCF_NO_ACROBATICS) - && (NPCInfo->rank == RANK_CREWMAN || NPCInfo->rank > RANK_LT_JG ) + if ( !(NPCInfo->scriptFlags&SCF_NO_ACROBATICS) + && (NPCInfo->rank == RANK_CREWMAN || NPCInfo->rank > RANK_LT_JG ) && !PM_InKnockDown( &NPC->client->ps ) && !Q_irand( 0, 5 ) ) {//FIXME: make this a function call? @@ -2847,7 +2848,7 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en } break; } - + //turn off slow walking no matter what TIMER_Set( NPC, "walking", -level.time ); TIMER_Set( NPC, "taunting", -level.time ); @@ -2890,14 +2891,14 @@ gentity_t *Jedi_FindEnemyInCone( gentity_t *self, gentity_t *fallback, float min AngleVectors( self->client->ps.viewangles, forward, NULL, NULL ); - for ( e = 0 ; e < 3 ; e++ ) + for ( e = 0 ; e < 3 ; e++ ) { mins[e] = self->currentOrigin[e] - 1024; maxs[e] = self->currentOrigin[e] + 1024; } numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); - for ( e = 0 ; e < numListedEntities ; e++ ) + for ( e = 0 ; e < numListedEntities ; e++ ) { check = entityList[e]; if ( check == self ) @@ -3005,10 +3006,10 @@ static void Jedi_FaceEnemy( qboolean doPitch ) CalcEntitySpot( NPC->enemy, SPOT_HEAD, enemy_eyes ); //Find the desired angles - if ( !NPC->client->ps.saberInFlight - && (NPC->client->ps.legsAnim == BOTH_A2_STABBACK1 + if ( !NPC->client->ps.saberInFlight + && (NPC->client->ps.legsAnim == BOTH_A2_STABBACK1 || NPC->client->ps.legsAnim == BOTH_CROUCHATTACKBACK1 - || NPC->client->ps.legsAnim == BOTH_ATTACK_BACK) + || NPC->client->ps.legsAnim == BOTH_ATTACK_BACK) ) {//point *away* GetAnglesForDirection( enemy_eyes, eyes, angles ); @@ -3157,7 +3158,7 @@ static void Jedi_DebounceDirectionChanges( void ) } } else if ( !TIMER_Done( NPC, "moveright" ) ) - {//NOTE: edge checking should stop me if this is bad... + {//NOTE: edge checking should stop me if this is bad... ucmd.rightmove = 127; VectorClear( NPC->client->ps.moveDir ); } @@ -3341,9 +3342,9 @@ static void Jedi_CombatTimersUpdate( int enemy_dist ) { gi.Printf( "(%d) HIT: agg %d\n", level.time, NPCInfo->stats.aggression ); } - if ( !Q_irand( 0, 3 ) - && NPCInfo->blockedSpeechDebounceTime < level.time - && jediSpeechDebounceTime[NPC->client->playerTeam] < level.time + if ( !Q_irand( 0, 3 ) + && NPCInfo->blockedSpeechDebounceTime < level.time + && jediSpeechDebounceTime[NPC->client->playerTeam] < level.time && NPC->painDebounceTime < level.time - 1000 ) { G_AddVoiceEvent( NPC, Q_irand( EV_GLOAT1, EV_GLOAT3 ), 3000 ); @@ -3487,9 +3488,9 @@ static void Jedi_CombatIdle( int enemy_dist ) extern qboolean PM_SaberInParry( int move ); static qboolean Jedi_AttackDecide( int enemy_dist ) { - if ( NPC->enemy->client - && NPC->enemy->s.weapon == WP_SABER - && NPC->enemy->client->ps.saberLockTime > level.time + if ( NPC->enemy->client + && NPC->enemy->s.weapon == WP_SABER + && NPC->enemy->client->ps.saberLockTime > level.time && NPC->client->ps.saberLockTime < level.time ) {//enemy is in a saberLock and we are not return qfalse; @@ -3506,7 +3507,7 @@ static qboolean Jedi_AttackDecide( int enemy_dist ) {//tavion chance = 10; } - else if ( NPC->client->NPC_class == CLASS_REBORN && NPCInfo->rank == RANK_LT_JG ) + else if ( NPC->client->NPC_class == CLASS_REBORN && NPCInfo->rank == RANK_LT_JG ) {//fencer chance = 5; } @@ -3564,7 +3565,7 @@ static qboolean Jedi_AttackDecide( int enemy_dist ) //Try to attack WeaponThink( qtrue ); } - + //FIXME: Maybe try to push enemy off a ledge? //close enough to step forward @@ -3645,8 +3646,8 @@ static qboolean Jedi_Jump( vec3_t dest, int goalEntNum ) */ if ( 1 ) { - float targetDist, shotSpeed = 300, travelTime, impactDist, bestImpactDist = Q3_INFINITE;//fireSpeed, - vec3_t targetDir, shotVel, failCase; + float targetDist, shotSpeed = 300, travelTime, impactDist, bestImpactDist = Q3_INFINITE;//fireSpeed, + vec3_t targetDir, shotVel, failCase; trace_t trace; trajectory_t tr; qboolean blocked; @@ -3662,7 +3663,7 @@ static qboolean Jedi_Jump( vec3_t dest, int goalEntNum ) travelTime = targetDist/shotSpeed; shotVel[2] += travelTime * 0.5 * NPC->client->ps.gravity; - if ( !hitCount ) + if ( !hitCount ) {//save the first one as the worst case scenario VectorCopy( shotVel, failCase ); } @@ -3677,7 +3678,7 @@ static qboolean Jedi_Jump( vec3_t dest, int goalEntNum ) tr.trTime = level.time; travelTime *= 1000.0f; VectorCopy( NPC->currentOrigin, lastPos ); - + //This may be kind of wasteful, especially on long throws... use larger steps? Divide the travelTime into a certain hard number of slices? Trace just to apex and down? for ( elapsedTime = timeStep; elapsedTime < floor(travelTime)+timeStep; elapsedTime += timeStep ) { @@ -3707,7 +3708,7 @@ static qboolean Jedi_Jump( vec3_t dest, int goalEntNum ) //Hmm, don't want to land on him, though... break; } - else + else { if ( trace.contents & CONTENTS_BOTCLIP ) {//hit a do-not-enter brush @@ -3833,18 +3834,18 @@ static qboolean Jedi_Jump( vec3_t dest, int goalEntNum ) xy -= z; xy *= 0.5; - + assert(xy > 0); VectorMA( p1, xy, dir, apex ); apex[2] += apexHeight; VectorCopy(apex, NPC->pos1); - + //Now we have the apex, aim for it height = apex[2] - NPC->currentOrigin[2]; time = sqrt( height / ( .5 * NPC->client->ps.gravity ) );//was 0.5, but didn't work well for very long jumps - if ( !time ) + if ( !time ) { //gi.Printf( S_COLOR_RED"ERROR: no time in jump\n" ); return qfalse; @@ -4019,7 +4020,7 @@ static qboolean Jedi_Jumping( gentity_t *goal ) /* vec3_t viewangles_xy={0,0,0}, goal_dir, goal_xy_dir, forward, right; float goal_dist; - + //gert horz dir to goal VectorSubtract( goal->currentOrigin, NPC->currentOrigin, goal_dir ); VectorCopy( goal_dir, goal_xy_dir ); @@ -4034,7 +4035,7 @@ static qboolean Jedi_Jumping( gentity_t *goal ) //get movement commands to push me toward enemy float fDot = DotProduct( forward, goal_dir ) * 127; float rDot = DotProduct( right, goal_dir ) * 127; - + ucmd.forwardmove = floor(fDot); ucmd.rightmove = floor(rDot); ucmd.upmove = 0;//don't duck @@ -4058,7 +4059,7 @@ static void Jedi_CheckEnemyMovement( float enemy_dist ) return; } - if ( NPC->client->NPC_class != CLASS_TAVION + if ( NPC->client->NPC_class != CLASS_TAVION && NPC->client->NPC_class != CLASS_DESANN && NPC->client->NPC_class != CLASS_LUKE ) { @@ -4079,10 +4080,10 @@ static void Jedi_CheckEnemyMovement( float enemy_dist ) TIMER_Set( NPC, "movecenter", Q_irand( 500, 1000 ) ); } } - else if ( NPC->enemy->client->ps.legsAnim == BOTH_WALL_FLIP_BACK1 - || NPC->enemy->client->ps.legsAnim == BOTH_WALL_FLIP_RIGHT - || NPC->enemy->client->ps.legsAnim == BOTH_WALL_FLIP_LEFT - || NPC->enemy->client->ps.legsAnim == BOTH_WALL_RUN_LEFT_FLIP + else if ( NPC->enemy->client->ps.legsAnim == BOTH_WALL_FLIP_BACK1 + || NPC->enemy->client->ps.legsAnim == BOTH_WALL_FLIP_RIGHT + || NPC->enemy->client->ps.legsAnim == BOTH_WALL_FLIP_LEFT + || NPC->enemy->client->ps.legsAnim == BOTH_WALL_RUN_LEFT_FLIP || NPC->enemy->client->ps.legsAnim == BOTH_WALL_RUN_RIGHT_FLIP ) {//he's flipping off a wall if ( NPC->enemy->client->ps.groundEntityNum == ENTITYNUM_NONE ) @@ -4198,7 +4199,7 @@ static void Jedi_CheckJumps( void ) { return; } - + //NOTE: for now, we clear ucmd.forwardmove & ucmd.rightmove while in air to avoid jumps going awry... if ( !jumpVel[0] && !jumpVel[1] )//FIXME: && !ucmd.forwardmove && !ucmd.rightmove? {//we assume a jump straight up is safe @@ -4217,7 +4218,7 @@ static void Jedi_CheckJumps( void ) tr.trType = TR_GRAVITY; tr.trTime = level.time; VectorCopy( NPC->currentOrigin, lastPos ); - + //This may be kind of wasteful, especially on long throws... use larger steps? Divide the travelTime into a certain hard number of slices? Trace just to apex and down? for ( elapsedTime = 500; elapsedTime <= 4000; elapsedTime += 500 ) { @@ -4288,7 +4289,6 @@ static void Jedi_Combat( void ) { vec3_t enemy_dir, enemy_movedir, enemy_dest; float enemy_dist, enemy_movespeed; - qboolean enemy_lost = qfalse; trace_t trace; //See where enemy will be 300 ms from now @@ -4306,7 +4306,7 @@ static void Jedi_Combat( void ) if ( !Jedi_ClearPathToSpot( enemy_dest, NPC->enemy->s.number ) ) {//hunt him down //gi.Printf( "No Clear Path\n" ); - if ( (NPC_ClearLOS( NPC->enemy )||NPCInfo->enemyLastSeenTime>level.time-500) && NPC_FaceEnemy( qtrue ) )//( NPCInfo->rank == RANK_CREWMAN || NPCInfo->rank > RANK_LT_JG ) && + if ( (NPC_ClearLOS( NPC->enemy )||NPCInfo->enemyLastSeenTime>level.time-500) && NPC_FaceEnemy( qtrue ) )//( NPCInfo->rank == RANK_CREWMAN || NPCInfo->rank > RANK_LT_JG ) && { //try to jump to him? /* @@ -4333,8 +4333,8 @@ static void Jedi_Combat( void ) } } */ - //FIXME: about every 1 second calc a velocity, - //run a loop of traces with evaluate trajectory + //FIXME: about every 1 second calc a velocity, + //run a loop of traces with evaluate trajectory //for gravity with my size, see if it makes it... //this will also catch misacalculations that send you off ledges! //gi.Printf( "Considering Jump\n" ); @@ -4384,7 +4384,7 @@ static void Jedi_Combat( void ) G_FreeEntity( tempGoal ); } - enemy_lost = qtrue; + //enemy_lost = qtrue; } } } @@ -4413,7 +4413,7 @@ static void Jedi_Combat( void ) Jedi_FaceEnemy( qtrue ); } NPC_UpdateAngles( qtrue, qtrue ); - + //Check for evasion if ( TIMER_Done( NPC, "parryTime" ) ) {//finished parrying @@ -4484,7 +4484,7 @@ NPC_Jedi_Pain ------------------------- */ -void NPC_Jedi_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, vec3_t point, int damage, int mod,int hitLoc ) +void NPC_Jedi_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, vec3_t point, int damage, int mod,int hitLoc ) { //FIXME: base the actual aggression add/subtract on health? //FIXME: don't do this more than once per frame? @@ -4508,7 +4508,7 @@ void NPC_Jedi_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, vec {//ouch... maybe switch up which saber power level we're using Jedi_AdjustSaberAnimLevel( self, Q_irand( FORCE_LEVEL_1, FORCE_LEVEL_3 ) ); } - if ( !Q_irand( 0, 1 ) )//damage > 20 || self->health < 40 || + if ( !Q_irand( 0, 1 ) )//damage > 20 || self->health < 40 || { //Com_Printf( "(%d) drop agg - hit by saber\n", level.time ); Jedi_Aggression( self, -1 ); @@ -4529,7 +4529,7 @@ void NPC_Jedi_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, vec AngleVectors( fwdangles, NULL, right, NULL ); float rightdot = DotProduct(right, diff); float zdiff = point[2] - self->client->renderInfo.eyePoint[2]; - + gi.Printf( "(%d) saber hit at height %4.2f, zdiff: %4.2f, rightdot: %4.2f\n", level.time, point[2]-self->absmin[2],zdiff,rightdot); } } @@ -4570,8 +4570,8 @@ qboolean Jedi_CheckDanger( void ) int alertEvent = NPC_CheckAlertEvents( qtrue, qtrue ); if ( level.alertEvents[alertEvent].level >= AEL_DANGER ) {//run away! - if ( !level.alertEvents[alertEvent].owner - || !level.alertEvents[alertEvent].owner->client + if ( !level.alertEvents[alertEvent].owner + || !level.alertEvents[alertEvent].owner->client || (level.alertEvents[alertEvent].owner!=NPC&&level.alertEvents[alertEvent].owner->client->playerTeam!=NPC->client->playerTeam) ) {//no owner return qfalse; @@ -4866,14 +4866,14 @@ void NPC_BSJedi_FollowLeader( void ) //Com_Printf( "(%d) drop agg - no enemy (follow)\n", level.time ); Jedi_AggressionErosion(-1); } - + //did we drop our saber? If so, go after it! if ( NPC->client->ps.saberInFlight ) {//saber is not in hand if ( NPC->client->ps.saberEntityNum < ENTITYNUM_NONE && NPC->client->ps.saberEntityNum > 0 )//player is 0 {// if ( g_entities[NPC->client->ps.saberEntityNum].s.pos.trType == TR_STATIONARY ) - {//fell to the ground, try to pick it up... + {//fell to the ground, try to pick it up... if ( Jedi_CanPullBackSaber( NPC ) ) { //FIXME: if it's on the ground and we just pulled it back to us, should we @@ -4961,8 +4961,8 @@ static void Jedi_Attack( void ) if ( NPC->client->ps.saberLockTime > level.time ) { //FIXME: maybe if I'm losing I should try to force-push out of it? Very rarely, though... - if ( NPC->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2 - && NPC->client->ps.saberLockTime < level.time + 5000 + if ( NPC->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2 + && NPC->client->ps.saberLockTime < level.time + 5000 && !Q_irand( 0, 10 )) { ForceThrow( NPC, qfalse ); @@ -4971,7 +4971,7 @@ static void Jedi_Attack( void ) else { float chance; - + if ( NPC->client->NPC_class == CLASS_DESANN ) { if ( g_spskill->integer ) @@ -5171,21 +5171,21 @@ static void Jedi_Attack( void ) if ( ucmd.buttons & BUTTON_ATTACK && NPC->client->playerTeam == TEAM_ENEMY ) { - if ( Q_irand( 0, NPC->client->ps.saberAnimLevel ) > 0 - && Q_irand( 0, NPC->max_health+10 ) > NPC->health + if ( Q_irand( 0, NPC->client->ps.saberAnimLevel ) > 0 + && Q_irand( 0, NPC->max_health+10 ) > NPC->health && !Q_irand( 0, 3 )) {//the more we're hurt and the stronger the attack we're using, the more likely we are to make a anger noise when we swing G_AddVoiceEvent( NPC, Q_irand( EV_COMBAT1, EV_COMBAT3 ), 1000 ); } } - if ( NPC->client->NPC_class == CLASS_TAVION + if ( NPC->client->NPC_class == CLASS_TAVION || (g_spskill->integer && ( NPC->client->NPC_class == CLASS_DESANN || NPCInfo->rank >= Q_irand( RANK_CREWMAN, RANK_CAPTAIN )))) {//Tavion will kick in force speed if the player does... - if ( NPC->enemy - && !NPC->enemy->s.number - && NPC->enemy->client - && (NPC->enemy->client->ps.forcePowersActive & (1<enemy + && !NPC->enemy->s.number + && NPC->enemy->client + && (NPC->enemy->client->ps.forcePowersActive & (1<client->ps.forcePowersActive & (1<. -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top of all AI_xxxx.cpp files for PCH reasons... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" #include "b_local.h" #include "g_nav.h" diff --git a/codeJK2/game/AI_Mark2.cpp b/codeJK2/game/AI_Mark2.cpp index 97d79e6f2a..8d37ddcccc 100644 --- a/codeJK2/game/AI_Mark2.cpp +++ b/codeJK2/game/AI_Mark2.cpp @@ -1,25 +1,26 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top of all AI_xxxx.cpp files for PCH reasons... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" - #include "b_local.h" #include "g_nav.h" diff --git a/codeJK2/game/AI_MineMonster.cpp b/codeJK2/game/AI_MineMonster.cpp index 1d030e4a47..3e780e041b 100644 --- a/codeJK2/game/AI_MineMonster.cpp +++ b/codeJK2/game/AI_MineMonster.cpp @@ -1,24 +1,25 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top of all AI_xxxx.cpp files for PCH reasons... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" - #include "b_local.h" diff --git a/codeJK2/game/AI_Remote.cpp b/codeJK2/game/AI_Remote.cpp index db37054bdd..12d1d49c6f 100644 --- a/codeJK2/game/AI_Remote.cpp +++ b/codeJK2/game/AI_Remote.cpp @@ -1,25 +1,26 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top of all AI_xxxx.cpp files for PCH reasons... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" - #include "b_local.h" #include "g_nav.h" diff --git a/codeJK2/game/AI_Seeker.cpp b/codeJK2/game/AI_Seeker.cpp index 78a32857d8..4ad5dcfb90 100644 --- a/codeJK2/game/AI_Seeker.cpp +++ b/codeJK2/game/AI_Seeker.cpp @@ -1,25 +1,26 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top of all AI_xxxx.cpp files for PCH reasons... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" - #include "b_local.h" #include "g_nav.h" diff --git a/codeJK2/game/AI_Sentry.cpp b/codeJK2/game/AI_Sentry.cpp index fd8cf703c2..993d9adfaf 100644 --- a/codeJK2/game/AI_Sentry.cpp +++ b/codeJK2/game/AI_Sentry.cpp @@ -1,25 +1,26 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top of all AI_xxxx.cpp files for PCH reasons... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" - #include "b_local.h" #include "g_nav.h" diff --git a/codeJK2/game/AI_Sniper.cpp b/codeJK2/game/AI_Sniper.cpp index db8c815504..c76231e067 100644 --- a/codeJK2/game/AI_Sniper.cpp +++ b/codeJK2/game/AI_Sniper.cpp @@ -1,25 +1,26 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top of all AI_xxxx.cpp files for PCH reasons... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" - #include "b_local.h" #include "g_nav.h" #include "anims.h" diff --git a/codeJK2/game/AI_Stormtrooper.cpp b/codeJK2/game/AI_Stormtrooper.cpp index 0306466278..d79cd1d118 100644 --- a/codeJK2/game/AI_Stormtrooper.cpp +++ b/codeJK2/game/AI_Stormtrooper.cpp @@ -1,25 +1,26 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top of all AI_xxxx.cpp files for PCH reasons... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" - #include "b_local.h" #include "g_nav.h" #include "anims.h" @@ -90,7 +91,7 @@ void ST_AggressionAdjust( gentity_t *self, int change ) int upper_threshold, lower_threshold; self->NPC->stats.aggression += change; - + //FIXME: base this on initial NPC stats if ( self->client->playerTeam == TEAM_PLAYER ) {//good guys are less aggressive @@ -285,7 +286,7 @@ NPC_ST_Pain ------------------------- */ -void NPC_ST_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, vec3_t point, int damage, int mod,int hitLoc ) +void NPC_ST_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, vec3_t point, int damage, int mod,int hitLoc ) { self->NPC->localState = LSTATE_UNDERFIRE; @@ -321,7 +322,7 @@ static void ST_HoldPosition( void ) AI_GroupUpdateSquadstates( NPCInfo->group, NPC, SQUAD_STAND_AND_SHOOT ); NPCInfo->goalEntity = NULL; } - + /*if ( TIMER_Done( NPC, "stand" ) ) {//FIXME: what if can't shoot from this pos? TIMER_Set( NPC, "duck", Q_irand( 2000, 4000 ) ); @@ -335,10 +336,10 @@ void NPC_ST_SayMovementSpeech( void ) { return; } - if ( NPCInfo->group && - NPCInfo->group->commander && - NPCInfo->group->commander->client && - NPCInfo->group->commander->client->NPC_class == CLASS_IMPERIAL && + if ( NPCInfo->group && + NPCInfo->group->commander && + NPCInfo->group->commander->client && + NPCInfo->group->commander->client->NPC_class == CLASS_IMPERIAL && !Q_irand( 0, 3 ) ) {//imperial (commander) gives the order ST_Speech( NPCInfo->group->commander, NPCInfo->movementSpeech, NPCInfo->movementSpeechChance ); @@ -369,13 +370,13 @@ static qboolean ST_Move( void ) qboolean moved = NPC_MoveToGoal( qtrue ); navInfo_t info; - + //Get the move info NAV_GetLastMove( info ); //FIXME: if we bump into another one of our guys and can't get around him, just stop! //If we hit our target, then stop and fire! - if ( info.flags & NIF_COLLISION ) + if ( info.flags & NIF_COLLISION ) { if ( info.blocker == NPC->enemy ) { @@ -400,7 +401,7 @@ static qboolean ST_Move( void ) } } } - + ST_HoldPosition(); } } @@ -431,7 +432,7 @@ static void NPC_ST_SleepShuffle( void ) //Automate some movement and noise if ( TIMER_Done( NPC, "shuffleTime" ) ) { - + //TODO: Play sleeping shuffle animation //int soundIndex = Q_irand( 0, 1 ); @@ -577,7 +578,7 @@ qboolean NPC_CheckEnemyStealth( gentity_t *target ) float light_level = ( target->lightLevel / MAX_LIGHT_INTENSITY ); float FOV_perc = 1.0f - ( hAngle_perc + vAngle_perc ) * 0.5f; //FIXME: Dunno about the average... float vis_rating = 0.0f; - + //Too dark if ( light_level < MIN_LIGHT_THRESHOLD ) return qfalse; @@ -593,11 +594,11 @@ qboolean NPC_CheckEnemyStealth( gentity_t *target ) //Out of range if ( dist_rating > 1.0f ) return qfalse; - + //Cap our speed checks if ( speed_rating > 1.0f ) speed_rating = 1.0f; - + //Calculate the distance, fov and light influences //...Visibilty linearly wanes over distance @@ -606,10 +607,10 @@ qboolean NPC_CheckEnemyStealth( gentity_t *target ) float fov_influence = FOV_SCALE * ( 1.0f - FOV_perc ); //...Lack of light hides, abundance of light exposes float light_influence = ( light_level - 0.5f ) * LIGHT_SCALE; - + //Calculate our base rating float target_rating = dist_influence + fov_influence + light_influence; - + //Now award any final bonuses to this number int contents = gi.pointcontents( targ_org, target->s.number ); if ( contents&CONTENTS_WATER ) @@ -637,7 +638,7 @@ qboolean NPC_CheckEnemyStealth( gentity_t *target ) } } } - else + else {//not in water if ( contents&CONTENTS_FOG ) { @@ -656,8 +657,8 @@ qboolean NPC_CheckEnemyStealth( gentity_t *target ) if ( target_crouching ) { target_rating *= 0.9f; //10% bonus - } - + } + //If he's violated the threshold, then realize him //float difficulty_scale = 1.0f + (2.0f-g_spskill->value);//if playing on easy, 20% harder to be seen...? float realize, cautious; @@ -764,8 +765,8 @@ static qboolean NPC_ST_InvestigateEvent( int eventID, bool extraSuspicious ) if ( level.alertEvents[eventID].level == AEL_DISCOVERED && (NPCInfo->scriptFlags&SCF_LOOK_FOR_ENEMIES) ) { NPCInfo->lastAlertID = level.alertEvents[eventID].ID; - if ( !level.alertEvents[eventID].owner || - !level.alertEvents[eventID].owner->client || + if ( !level.alertEvents[eventID].owner || + !level.alertEvents[eventID].owner->client || level.alertEvents[eventID].owner->health <= 0 || level.alertEvents[eventID].owner->client->playerTeam != NPC->client->enemyTeam ) {//not an enemy @@ -854,10 +855,10 @@ static qboolean NPC_ST_InvestigateEvent( int eventID, bool extraSuspicious ) //FIXME: only if have others in group... these should be responses? if ( NPCInfo->investigateDebounceTime+NPCInfo->pauseTime > level.time ) {//was already investigating - if ( NPCInfo->group && - NPCInfo->group->commander && - NPCInfo->group->commander->client && - NPCInfo->group->commander->client->NPC_class == CLASS_IMPERIAL && + if ( NPCInfo->group && + NPCInfo->group->commander && + NPCInfo->group->commander->client && + NPCInfo->group->commander->client->NPC_class == CLASS_IMPERIAL && !Q_irand( 0, 3 ) ) { ST_Speech( NPCInfo->group->commander, SPEECH_LOOK, 0 );//FIXME: "I'll go check it out" type sounds @@ -925,7 +926,7 @@ static void ST_OffsetLook( float offset, vec3_t out ) angles[YAW] += offset; AngleVectors( angles, forward, NULL, NULL ); VectorMA( NPC->currentOrigin, 64, forward, out ); - + CalcEntitySpot( NPC, SPOT_HEAD, temp ); out[2] = temp[2]; } @@ -1022,7 +1023,7 @@ void NPC_BSST_Investigate( void ) { NPCInfo->tempBehavior = BS_DEFAULT; NPCInfo->goalEntity = UpdateGoal(); - + NPC_UpdateAngles( qtrue, qtrue ); //Say something ST_Speech( NPC, SPEECH_GIVEUP, 0 ); @@ -1069,7 +1070,7 @@ NPC_BSST_Patrol void NPC_BSST_Patrol( void ) {//FIXME: pick up on bodies of dead buddies? - + //get group- mainly for group speech debouncing, but may use for group scouting/investigating AI, too AI_GetGroup( NPC ); @@ -1134,8 +1135,8 @@ void NPC_BSST_Patrol( void ) {//hack if ( ucmd.forwardmove || ucmd.rightmove || ucmd.upmove ) {//moving - - if( (!NPC->client->ps.torsoAnimTimer) || (NPC->client->ps.torsoAnim == BOTH_STAND4) ) + + if( (!NPC->client->ps.torsoAnimTimer) || (NPC->client->ps.torsoAnim == BOTH_STAND4) ) { if ( (ucmd.buttons&BUTTON_WALKING) && !(NPCInfo->scriptFlags&SCF_RUNNING) ) {//not running, only set upper anim @@ -1311,7 +1312,7 @@ static void ST_CheckMoveState( void ) if ( ( NPCInfo->goalEntity != NPC->enemy ) && ( NPCInfo->goalEntity != NULL ) ) { //Did we make it? - if ( NAV_HitNavGoal( NPC->currentOrigin, NPC->mins, NPC->maxs, NPCInfo->goalEntity->currentOrigin, 16, FlyingCreature( NPC ) ) || + if ( NAV_HitNavGoal( NPC->currentOrigin, NPC->mins, NPC->maxs, NPCInfo->goalEntity->currentOrigin, 16, FlyingCreature( NPC ) ) || ( !Q3_TaskIDPending( NPC, TID_MOVE_NAV ) && NPCInfo->squadState == SQUAD_SCOUT && enemyLOS && enemyDist <= 10000 ) ) {//either hit our navgoal or our navgoal was not a crucial (scripted) one (maybe a combat point) and we're scouting and found our enemy int newSquadState = SQUAD_STAND_AND_SHOOT; @@ -1416,7 +1417,7 @@ static void ST_CheckFireState( void ) } //See if we should continue to fire on their last position - //!TIMER_Done( NPC, "stick" ) || + //!TIMER_Done( NPC, "stick" ) || if ( !hitAlly //we're not going to hit an ally && enemyInFOV //enemy is in our FOV //FIXME: or we don't have a clear LOS? && NPCInfo->enemyLastSeenTime > 0 //we've seen the enemy @@ -1718,7 +1719,7 @@ void ST_Commander( void ) qboolean runner = qfalse; qboolean enemyLost = qfalse; qboolean enemyProtected = qfalse; - qboolean scouting = qfalse; + //qboolean scouting = qfalse; int squadState; float avoidDist; @@ -1729,7 +1730,7 @@ void ST_Commander( void ) return; } - //FIXME: have this group commander check the enemy group (if any) and see if they have + //FIXME: have this group commander check the enemy group (if any) and see if they have // superior numbers. If they do, fall back rather than advance. If you have // superior numbers, advance on them. //FIXME: find the group commander and have him occasionally give orders when there is speech @@ -1800,8 +1801,8 @@ void ST_Commander( void ) //Okay, everyone is mad //see if anyone is running - if ( group->numState[SQUAD_SCOUT] > 0 || - group->numState[SQUAD_TRANSITION] > 0 || + if ( group->numState[SQUAD_SCOUT] > 0 || + group->numState[SQUAD_TRANSITION] > 0 || group->numState[SQUAD_RETREAT] > 0 ) {//someone is running runner = qtrue; @@ -1857,7 +1858,7 @@ void ST_Commander( void ) cpFlags = 0; squadState = SQUAD_IDLE; avoidDist = 0; - scouting = qfalse; + //scouting = qfalse; //get the next guy member = &g_entities[group->member[i].number]; @@ -1877,8 +1878,8 @@ void ST_Commander( void ) continue; } - if ( NPC->s.weapon == WP_NONE - && NPCInfo->goalEntity + if ( NPC->s.weapon == WP_NONE + && NPCInfo->goalEntity && NPCInfo->goalEntity == NPCInfo->tempGoal && NPCInfo->goalEntity->enemy && NPCInfo->goalEntity->enemy->s.eType == ET_ITEM ) @@ -1895,7 +1896,7 @@ void ST_Commander( void ) continue; } } - + if ( !(NPCInfo->scriptFlags&SCF_CHASE_ENEMIES) ) {//not allowed to do combat-movement continue; @@ -2055,7 +2056,7 @@ void ST_Commander( void ) //ask where he went if ( group->numState[SQUAD_SCOUT] <= 0 ) { - scouting = qtrue; + //scouting = qtrue; NPC_ST_StoreMovementSpeech( SPEECH_CHASE, 0.0f ); } //Since no-one else has done this, I should be the closest one, so go after him... @@ -2080,7 +2081,7 @@ void ST_Commander( void ) else {//group can see and has been shooting at the enemy //see if we should do something fancy? - + {//we're ready to move if ( NPCInfo->combatPoint == -1 ) {//we're not on a combat point @@ -2281,7 +2282,7 @@ void ST_Commander( void ) } //now try again cp = NPC_FindCombatPoint( NPC->currentOrigin, NPC->currentOrigin, group->enemy->currentOrigin, cpFlags|CP_HAS_ROUTE, avoidDist ); - } + } //see if we got a valid one if ( cp != -1 ) {//found a combat point @@ -2312,7 +2313,7 @@ void ST_Commander( void ) {//any other kind of transition between combat points AI_GroupUpdateSquadstates( group, NPC, SQUAD_TRANSITION ); } - + //unless we're trying to flee, walk slowly if ( !(cpFlags_org&CP_FLEE) ) { @@ -2334,7 +2335,7 @@ void ST_Commander( void ) NPC_ST_StoreMovementSpeech( SPEECH_OUTFLANK, -1 ); } } - else + else {//okay, let's cheat if ( group->numGroup > 1 ) { @@ -2342,7 +2343,7 @@ void ST_Commander( void ) if ( !Q_irand( 0, 3 ) ) {//25% of the time, see if we're flanking the enemy vec3_t eDir2Me, eDir2CP; - + VectorSubtract( NPC->currentOrigin, group->enemy->currentOrigin, eDir2Me ); VectorNormalize( eDir2Me ); @@ -2351,7 +2352,7 @@ void ST_Commander( void ) dot = DotProduct( eDir2Me, eDir2CP ); } - + if ( dot < 0.4 ) {//flanking! NPC_ST_StoreMovementSpeech( SPEECH_OUTFLANK, -1 ); @@ -2488,7 +2489,7 @@ void NPC_BSST_Attack( void ) if ( enemyDist < MIN_ROCKET_DIST_SQUARED )//128 {//enemy within 128 - if ( (NPC->client->ps.weapon == WP_FLECHETTE || NPC->client->ps.weapon == WP_REPEATER) && + if ( (NPC->client->ps.weapon == WP_FLECHETTE || NPC->client->ps.weapon == WP_REPEATER) && (NPCInfo->scriptFlags & SCF_ALT_FIRE) ) {//shooting an explosive, but enemy too close, switch to primary fire NPCInfo->scriptFlags &= ~SCF_ALT_FIRE; @@ -2535,7 +2536,7 @@ void NPC_BSST_Attack( void ) int hit = NPC_ShotEntity( NPC->enemy, impactPos ); gentity_t *hitEnt = &g_entities[hit]; - if ( hit == NPC->enemy->s.number + if ( hit == NPC->enemy->s.number || ( hitEnt && hitEnt->client && hitEnt->client->playerTeam == NPC->client->enemyTeam ) || ( hitEnt && hitEnt->takedamage && ((hitEnt->svFlags&SVF_GLASS_BRUSH)||hitEnt->health < 40||NPC->s.weapon == WP_EMPLACED_GUN) ) ) {//can hit enemy or enemy ally or will hit glass or other minor breakable (or in emplaced gun), so shoot anyway @@ -2694,10 +2695,10 @@ void NPC_BSST_Attack( void ) WeaponThink( qtrue ); } //NASTY - if ( NPC->s.weapon == WP_ROCKET_LAUNCHER - && (ucmd.buttons&BUTTON_ATTACK) + if ( NPC->s.weapon == WP_ROCKET_LAUNCHER + && (ucmd.buttons&BUTTON_ATTACK) && !AImove - && g_spskill->integer > 1 + && g_spskill->integer > 1 && !Q_irand( 0, 3 ) ) {//every now and then, shoot a homing rocket ucmd.buttons &= ~BUTTON_ATTACK; @@ -2714,7 +2715,7 @@ void NPC_BSST_Default( void ) { WeaponThink( qtrue ); } - + if( !NPC->enemy ) {//don't have an enemy, look for one NPC_BSST_Patrol(); diff --git a/codeJK2/game/AI_Utils.cpp b/codeJK2/game/AI_Utils.cpp index 5c5b367770..bdd670f394 100644 --- a/codeJK2/game/AI_Utils.cpp +++ b/codeJK2/game/AI_Utils.cpp @@ -1,31 +1,32 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // These utilities are meant for strictly non-player, non-team NPCs. // These functions are in their own file because they are only intended // for use with NPCs who's logic has been overriden from the original // AI code, and who's code resides in files with the AI_ prefix. -// leave this line at the top of all AI_xxxx.cpp files for PCH reasons... #include "g_headers.h" - - #include "b_local.h" #include "g_nav.h" #include "g_navigator.h" diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index bbb0a31889..33f01f98e2 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -1,4 +1,20 @@ -cmake_minimum_required(VERSION 2.8.8) +#============================================================================ +# Copyright (C) 2013 - 2015, OpenJK contributors +# +# This file is part of the OpenJK source code. +# +# OpenJK is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +#============================================================================ # Make sure the user is not executing this script directly if(NOT InOpenJK) @@ -139,6 +155,7 @@ set(JK2SPGameGameFiles "${JK2SPDir}/game/surfaceflags.h" "${JK2SPDir}/game/teams.h" "${JK2SPDir}/game/weapons.h" + "${JK2SPDir}/game/w_local.h" "${JK2SPDir}/game/wp_saber.h" ) source_group("game" FILES ${JK2SPGameGameFiles}) @@ -211,6 +228,7 @@ set(JK2SPGameCommonFiles "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SPDir}/qcommon/q_platform.h" + "${SPDir}/qcommon/strippublic.h" ) source_group("common" FILES ${JK2SPGameCommonFiles}) set(JK2SPGameFiles ${JK2SPGameFiles} ${JK2SPGameCommonFiles}) @@ -222,10 +240,14 @@ set(JK2SPGameIcarusFiles "${JK2SPDir}/icarus/TaskManager.cpp" "${JK2SPDir}/icarus/Instance.cpp" "${JK2SPDir}/icarus/blockstream.h" + "${JK2SPDir}/icarus/icarus.h" + "${JK2SPDir}/icarus/interface.h" + "${JK2SPDir}/icarus/interpreter.h" "${JK2SPDir}/icarus/sequence.h" "${JK2SPDir}/icarus/sequencer.h" "${JK2SPDir}/icarus/taskmanager.h" "${JK2SPDir}/icarus/instance.h" + "${JK2SPDir}/icarus/tokenizer.h" ) source_group("icarus" FILES ${JK2SPGameIcarusFiles}) set(JK2SPGameFiles ${JK2SPGameFiles} ${JK2SPGameIcarusFiles}) @@ -246,19 +268,19 @@ endif(WIN32) add_library(${JK2SPGame} SHARED ${JK2SPGameFiles}) -if(NOT WIN32) +if(NOT MSVC) # remove "lib" prefix for .so/.dylib files set_target_properties(${JK2SPGame} PROPERTIES PREFIX "") -endif(NOT WIN32) +endif() if(WIN32) - install(TARGETS ${JK2SPGame} RUNTIME DESTINATION "OpenJK") + install(TARGETS ${JK2SPGame} RUNTIME DESTINATION "${JK2InstallDir}/OpenJK") else(WIN32) if(MakeApplicationBundles AND BuildJK2SPEngine) - install(TARGETS ${JK2SPGame} LIBRARY DESTINATION "${JK2SPEngine}.app/Contents/MacOS/OpenJK") + install(TARGETS ${JK2SPGame} LIBRARY DESTINATION "${JK2InstallDir}/${JK2SPEngine}.app/Contents/MacOS/OpenJK") else(MakeApplicationBundles AND BuildJK2SPEngine) - install(TARGETS ${JK2SPGame} LIBRARY DESTINATION "OpenJK") - endif(MakeApplicationBundles AND BuildJK2SPEngine) + install(TARGETS ${JK2SPGame} LIBRARY DESTINATION "${JK2InstallDir}/OpenJK") + endif(MakeApplicationBundles AND BuildJK2SPEngine) endif(WIN32) set_target_properties(${JK2SPGame} PROPERTIES COMPILE_DEFINITIONS_RELWITHDEBINFO "${JK2SPGameDefines};${ReleaseDefines}") set_target_properties(${JK2SPGame} PROPERTIES COMPILE_DEFINITIONS_MINSIZEREL "${JK2SPGameDefines};${ReleaseDefines}") diff --git a/codeJK2/game/G_Timer.cpp b/codeJK2/game/G_Timer.cpp index 1b70ad16c5..9550b00a9d 100644 --- a/codeJK2/game/G_Timer.cpp +++ b/codeJK2/game/G_Timer.cpp @@ -1,25 +1,26 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top for all g_xxxx.cpp files... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" - #include "g_local.h" #include "../../code/Rufl/hstring.h" diff --git a/codeJK2/game/NPC.cpp b/codeJK2/game/NPC.cpp index bf16da0509..65288a3656 100644 --- a/codeJK2/game/NPC.cpp +++ b/codeJK2/game/NPC.cpp @@ -1,30 +1,31 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // // NPC.cpp - generic functions // -// leave this line at the top for all NPC_xxxx.cpp files... #include "g_headers.h" - - #include "b_local.h" #include "anims.h" #include "g_functions.h" @@ -91,7 +92,7 @@ void CorpsePhysics( gentity_t *self ) memset( &ucmd, 0, sizeof( ucmd ) ); ClientThink( self->s.number, &ucmd ); VectorCopy( self->s.origin, self->s.origin2 ); - + if ( self->client->NPC_class == CLASS_GALAKMECH ) { GM_Dying( self ); @@ -167,7 +168,7 @@ void NPC_RemoveBody( gentity_t *self ) return; } - // I don't consider this a hack, it's creative coding . . . + // I don't consider this a hack, it's creative coding . . . // I agree, very creative... need something like this for ATST and GALAKMECH too! if (self->client->NPC_class == CLASS_MARK1) { @@ -175,7 +176,7 @@ void NPC_RemoveBody( gentity_t *self ) } // Since these blow up, remove the bounding box. - if ( self->client->NPC_class == CLASS_REMOTE + if ( self->client->NPC_class == CLASS_REMOTE || self->client->NPC_class == CLASS_SENTRY || self->client->NPC_class == CLASS_PROBE || self->client->NPC_class == CLASS_INTERROGATOR @@ -204,7 +205,7 @@ void NPC_RemoveBody( gentity_t *self ) { self->NPC->timeOfDeath = level.time + 1000; // Only do all of this nonsense for Scav boys ( and girls ) - /// if ( self->client->playerTeam == TEAM_SCAVENGERS || self->client->playerTeam == TEAM_KLINGON + /// if ( self->client->playerTeam == TEAM_SCAVENGERS || self->client->playerTeam == TEAM_KLINGON // || self->client->playerTeam == TEAM_HIROGEN || self->client->playerTeam == TEAM_MALON ) // should I check NPC_class here instead of TEAM ? - dmv if( self->client->playerTeam == TEAM_ENEMY || self->client->NPC_class == CLASS_PROTOCOL ) @@ -229,7 +230,7 @@ void NPC_RemoveBody( gentity_t *self ) // to remove the bodies... but in other cases it's just weird, like // when they're right behind you in a closed room and when they've been // placed as dead NPCs by a designer... - // For now we just assume that a corpse with no enemy was + // For now we just assume that a corpse with no enemy was // placed in the map as a corpse if ( self->enemy ) { @@ -333,7 +334,7 @@ int BodyRemovalPadTime( gentity_t *ent ) break; } - + return time; } @@ -376,7 +377,7 @@ static void NPC_RemoveBodyEffect(void) // team no longer indicates species/race, so in this case we'd use NPC_class, but - + // stub code switch(NPC->client->NPC_class) { @@ -578,7 +579,7 @@ void NPC_PostDeathThink( void ) whichtrace = 4; } } - + //OK! Now if two opposite sides are hanging, use a third if any, else, do nothing if ( cornerdist[FRONT] > MIN_DROP_DIST && cornerdist[BACK] > MIN_DROP_DIST ) frontbackbothclear = true; @@ -608,7 +609,7 @@ void NPC_PostDeathThink( void ) else return; } - + switch ( whichtrace ) {//check for stuck case 1: @@ -648,7 +649,7 @@ void NPC_PostDeathThink( void ) whichtrace = 0; break; } - + switch ( whichtrace ) { case 1: @@ -666,7 +667,7 @@ void NPC_PostDeathThink( void ) } return; break; - + case 2: VectorMA( NPC->client->ps.velocity, -200, forward, NPC->client->ps.velocity ); if(trace2.fraction >= 0.9) @@ -682,7 +683,7 @@ void NPC_PostDeathThink( void ) } return; break; - + case 3: VectorMA( NPC->client->ps.velocity, 200, right, NPC->client->ps.velocity ); if ( trace3.fraction >= 0.9 ) @@ -698,7 +699,7 @@ void NPC_PostDeathThink( void ) } return; break; - + case 4: VectorMA( NPC->client->ps.velocity, -200, right, NPC->client->ps.velocity ); if ( trace4.fraction >= 0.9 ) @@ -735,7 +736,7 @@ void NPC_PostDeathThink( void ) DeadThink ---------------------------------------- */ -static void DeadThink ( void ) +static void DeadThink ( void ) { trace_t trace; @@ -792,7 +793,7 @@ static void DeadThink ( void ) //NPC_PostDeathThink(); /* - if ( !NPCInfo->timeOfDeath && NPC->client != NULL && NPCInfo != NULL ) + if ( !NPCInfo->timeOfDeath && NPC->client != NULL && NPCInfo != NULL ) { //haven't finished death anim yet and were NOT given a specific amount of time to wait before removal int legsAnim = NPC->client->ps.legsAnim; @@ -854,7 +855,7 @@ static void DeadThink ( void ) // if client is in a nodrop area, make him/her nodraw int contents = NPC->bounceCount = gi.pointcontents( NPC->currentOrigin, -1 ); - if ( ( contents & CONTENTS_NODROP ) ) + if ( ( contents & CONTENTS_NODROP ) ) { NPC->client->ps.eFlags |= EF_NODRAW; } @@ -871,7 +872,7 @@ SetNPCGlobals local function to set globals used throughout the AI code =============== */ -void SetNPCGlobals( gentity_t *ent ) +void SetNPCGlobals( gentity_t *ent ) { NPC = ent; NPCInfo = ent->NPC; @@ -884,7 +885,7 @@ gNPC_t *_saved_NPCInfo; gclient_t *_saved_client; usercmd_t _saved_ucmd; -void SaveNPCGlobals() +void SaveNPCGlobals() { _saved_NPC = NPC; _saved_NPCInfo = NPCInfo; @@ -892,7 +893,7 @@ void SaveNPCGlobals() memcpy( &_saved_ucmd, &ucmd, sizeof( usercmd_t ) ); } -void RestoreNPCGlobals() +void RestoreNPCGlobals() { NPC = _saved_NPC; NPCInfo = _saved_NPCInfo; @@ -901,7 +902,7 @@ void RestoreNPCGlobals() } //We MUST do this, other funcs were using NPC illegally when "self" wasn't the global NPC -void ClearNPCGlobals( void ) +void ClearNPCGlobals( void ) { NPC = NULL; NPCInfo = NULL; @@ -998,7 +999,7 @@ void NPC_HandleAIFlags (void) {//Print that you need help! //FIXME: shouldn't remove this just yet if cg_draw needs it NPCInfo->aiFlags &= ~NPCAI_LOST; - + /* if ( showWaypoints ) { @@ -1394,7 +1395,7 @@ void NPC_BehaviorSet_Seeker( int bState ) case BS_HUNT_AND_KILL: case BS_DEFAULT: NPC_BSSeeker_Default(); - break; + break; default: NPC_BehaviorSet_Default( bState ); break; @@ -1418,7 +1419,7 @@ void NPC_BehaviorSet_Remote( int bState ) case BS_HUNT_AND_KILL: case BS_DEFAULT: NPC_BSRemote_Default(); - break; + break; default: NPC_BehaviorSet_Default( bState ); break; @@ -1442,7 +1443,7 @@ void NPC_BehaviorSet_Sentry( int bState ) case BS_HUNT_AND_KILL: case BS_DEFAULT: NPC_BSSentry_Default(); - break; + break; default: NPC_BehaviorSet_Default( bState ); break; @@ -1688,7 +1689,7 @@ extern void NPC_BSEmplaced( void ); extern qboolean NPC_CheckSurrender( void ); void NPC_RunBehavior( int team, int bState ) { - qboolean dontSetAim = qfalse; + //qboolean dontSetAim = qfalse; if ( bState == BS_CINEMATIC ) { @@ -1703,7 +1704,7 @@ void NPC_RunBehavior( int team, int bState ) else if ( NPC->client->ps.weapon == WP_SABER ) {//jedi NPC_BehaviorSet_Jedi( bState ); - dontSetAim = qtrue; + //dontSetAim = qtrue; } else if ( NPCInfo->scriptFlags & SCF_FORCED_MARCH ) {//being forced to march @@ -1713,7 +1714,7 @@ void NPC_RunBehavior( int team, int bState ) { switch( team ) { - + // case TEAM_SCAVENGERS: // case TEAM_IMPERIAL: // case TEAM_KLINGON: @@ -1792,7 +1793,7 @@ void NPC_RunBehavior( int team, int bState ) NPC_BehaviorSet_Stormtrooper( bState ); break; - case TEAM_NEUTRAL: + case TEAM_NEUTRAL: // special cases for enemy droids if ( NPC->client->NPC_class == CLASS_PROTOCOL || NPC->client->NPC_class == CLASS_UGNAUGHT) @@ -1822,7 +1823,7 @@ void NPC_RunBehavior( int team, int bState ) NPC_BehaviorSet_Default( bState ); } NPC_CheckCharmed(); - dontSetAim = qtrue; + //dontSetAim = qtrue; } break; } @@ -1839,7 +1840,7 @@ NPC Behavior state thinking =============== */ -void NPC_ExecuteBState ( gentity_t *self)//, int msec ) +void NPC_ExecuteBState ( gentity_t *self)//, int msec ) { bState_t bState; @@ -1871,7 +1872,7 @@ void NPC_ExecuteBState ( gentity_t *self)//, int msec ) //Pick the proper bstate for us and run it NPC_RunBehavior( self->client->playerTeam, bState ); - + // if(bState != BS_POINT_COMBAT && NPCInfo->combatPoint != -1) // { @@ -1887,7 +1888,7 @@ void NPC_ExecuteBState ( gentity_t *self)//, int msec ) // CheckSelf(); //Back to normal? All decisions made? - + //FIXME: don't walk off ledges unless we can get to our goal faster that way, or that's our goal's surface //NPCPredict(); @@ -1929,7 +1930,7 @@ void NPC_ExecuteBState ( gentity_t *self)//, int msec ) client->ps.weaponstate = WEAPON_READY; } } - else + else { if(client->ps.weaponstate == WEAPON_READY) { @@ -1967,7 +1968,7 @@ void NPC_ExecuteBState ( gentity_t *self)//, int msec ) NPC_CheckAttackHold(); NPC_ApplyScriptFlags(); - + //cliff and wall avoidance NPC_AvoidWallsAndCliffs(); @@ -1997,7 +1998,7 @@ void NPC_ExecuteBState ( gentity_t *self)//, int msec ) NPC_CheckPlayerAim(); NPC_CheckAllClear(); - + /*if( ucmd.forwardmove || ucmd.rightmove ) { int i, la = -1, ta = -1; @@ -2013,7 +2014,7 @@ void NPC_ExecuteBState ( gentity_t *self)//, int msec ) { ta = i; } - + if(la != -1 && ta != -1) { break; @@ -2060,7 +2061,7 @@ Main NPC AI - called once per frame #if AI_TIMERS extern int AITime; #endif// AI_TIMERS -void NPC_Think ( gentity_t *self)//, int msec ) +void NPC_Think ( gentity_t *self)//, int msec ) { vec3_t oldMoveDir; @@ -2073,7 +2074,7 @@ void NPC_Think ( gentity_t *self)//, int msec ) VectorCopy( self->client->ps.moveDir, oldMoveDir ); VectorClear( self->client->ps.moveDir ); // see if NPC ai is frozen - if ( debugNPCFreeze->value || (NPC->svFlags&SVF_ICARUS_FREEZE) ) + if ( debugNPCFreeze->value || (NPC->svFlags&SVF_ICARUS_FREEZE) ) { NPC_UpdateAngles( qtrue, qtrue ); ClientThink(self->s.number, &ucmd); @@ -2088,7 +2089,7 @@ void NPC_Think ( gentity_t *self)//, int msec ) // dead NPCs have a special think, don't run scripts (for now) //FIXME: this breaks deathscripts - if ( self->health <= 0 ) + if ( self->health <= 0 ) { DeadThink(); if ( NPCInfo->nextBStateThink <= level.time ) @@ -2197,7 +2198,7 @@ void NPC_Think ( gentity_t *self)//, int msec ) } } -void NPC_InitAI ( void ) +void NPC_InitAI ( void ) { debugNoRoam = gi.cvar ( "d_noroam", "0", CVAR_CHEAT ); debugNPCAimingBeam = gi.cvar ( "d_npcaiming", "0", CVAR_CHEAT ); @@ -2249,7 +2250,7 @@ void NPC_InitAnimTable( void ) } } -void NPC_InitGame( void ) +void NPC_InitGame( void ) { // globals.NPCs = (gNPC_t *) gi.TagMalloc(game.maxclients * sizeof(game.bots[0]), TAG_GAME); debugNPCName = gi.cvar ( "d_npc", "", 0 ); @@ -2272,7 +2273,7 @@ void NPC_SetAnim(gentity_t *ent,int setAnimParts,int anim,int setAnimFlags) if(ent->client) {//Players, NPCs if (setAnimFlags&SETANIM_FLAG_OVERRIDE) - { + { if (setAnimParts & SETANIM_TORSO) { if( (setAnimFlags & SETANIM_FLAG_RESTART) || ent->client->ps.torsoAnim != anim ) @@ -2295,7 +2296,7 @@ void NPC_SetAnim(gentity_t *ent,int setAnimParts,int anim,int setAnimFlags) else {//bodies, etc. if (setAnimFlags&SETANIM_FLAG_OVERRIDE) - { + { if (setAnimParts & SETANIM_TORSO) { if( (setAnimFlags & SETANIM_FLAG_RESTART) || ent->s.torsoAnim != anim ) diff --git a/codeJK2/game/NPC_behavior.cpp b/codeJK2/game/NPC_behavior.cpp index c8ea5ae73c..a9832318c6 100644 --- a/codeJK2/game/NPC_behavior.cpp +++ b/codeJK2/game/NPC_behavior.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //NPC_behavior.cpp /* @@ -24,7 +28,6 @@ things in a snapshot or just go through the snapshot every frame and save the in we need it... */ -// leave this line at the top for all NPC_xxxx.cpp files... #include "g_headers.h" #include "g_navigator.h" #include "Q3_Interface.h" @@ -78,7 +81,7 @@ void NPC_BSAdvanceFight (void) //Yaw to enemy VectorMA(NPC->enemy->absmin, 0.5, NPC->enemy->maxs, enemy_org); CalcEntitySpot( NPC, SPOT_WEAPON, muzzle ); - + VectorSubtract (enemy_org, muzzle, delta); vectoangles ( delta, angleToEnemy ); distanceToEnemy = VectorNormalize(delta); @@ -97,7 +100,7 @@ void NPC_BSAdvanceFight (void) if(enemyVisibility == VIS_FOV) {//He's in our FOV - + attack_ok = qtrue; CalcEntitySpot( NPC->enemy, SPOT_HEAD, enemy_head); @@ -185,7 +188,7 @@ void NPC_BSAdvanceFight (void) // NPC->cantHitEnemyCounter++; } else - {//FIXME: + {//FIXME: NPC_UpdateShootAngles(NPC->client->ps.viewangles, qtrue, qtrue); } @@ -210,7 +213,7 @@ void MakeOwnerInvis (gentity_t *self); void BeamOut (gentity_t *self) { // gentity_t *tent = G_Spawn(); - + /* tent->owner = self; tent->think = MakeOwnerInvis; @@ -226,7 +229,7 @@ void BeamOut (gentity_t *self) self->svFlags |= SVF_BEAMING; } -void NPC_BSCinematic( void ) +void NPC_BSCinematic( void ) { if( NPCInfo->scriptFlags & SCF_FIRE_WEAPON ) @@ -249,7 +252,7 @@ void NPC_BSCinematic( void ) CalcEntitySpot( NPCInfo->watchTarget, SPOT_HEAD_LEAN, viewSpot ); VectorSubtract( viewSpot, eyes, viewvec ); - + vectoangles( viewvec, viewangles ); NPCInfo->lockedDesiredYaw = NPCInfo->desiredYaw = viewangles[YAW]; @@ -259,7 +262,7 @@ void NPC_BSCinematic( void ) NPC_UpdateAngles( qtrue, qtrue ); } -void NPC_BSWait( void ) +void NPC_BSWait( void ) { NPC_UpdateAngles( qtrue, qtrue ); } @@ -318,7 +321,7 @@ void NPC_BSInvestigate (void) if( level.time < NPCInfo->walkDebounceTime ) {//walk toward investigateGoal - + /* NPCInfo->goalEntity = NPCInfo->tempGoal; // NAV_ClearLastRoute(NPC); @@ -341,14 +344,14 @@ void NPC_BSInvestigate (void) if(NPCInfo->hlookCount > 30) { - if(Q_irand(0, 10) > 7) + if(Q_irand(0, 10) > 7) { NPCInfo->hlookCount = 0; } } else if(NPCInfo->hlookCount < -30) { - if(Q_irand(0, 10) > 7) + if(Q_irand(0, 10) > 7) { NPCInfo->hlookCount = 0; } @@ -357,7 +360,7 @@ void NPC_BSInvestigate (void) { NPCInfo->hlookCount = Q_irand(-1, 1); } - else if(Q_irand(0, 10) > 7) + else if(Q_irand(0, 10) > 7) { if(NPCInfo->hlookCount > 0) { @@ -371,14 +374,14 @@ void NPC_BSInvestigate (void) if(NPCInfo->vlookCount >= 15) { - if(Q_irand(0, 10) > 7) + if(Q_irand(0, 10) > 7) { NPCInfo->vlookCount = 0; } } else if(NPCInfo->vlookCount <= -15) { - if(Q_irand(0, 10) > 7) + if(Q_irand(0, 10) > 7) { NPCInfo->vlookCount = 0; } @@ -387,7 +390,7 @@ void NPC_BSInvestigate (void) { NPCInfo->vlookCount = Q_irand(-1, 1); } - else if(Q_irand(0, 10) > 8) + else if(Q_irand(0, 10) > 8) { if(NPCInfo->vlookCount > 0) { @@ -438,17 +441,17 @@ qboolean NPC_CheckInvestigate( int alertEventNum ) return qfalse; } - if ( owner->s.eType != ET_PLAYER && owner == NPCInfo->goalEntity ) + if ( owner->s.eType != ET_PLAYER && owner == NPCInfo->goalEntity ) { return qfalse; } - if ( owner->s.eFlags & EF_NODRAW ) + if ( owner->s.eFlags & EF_NODRAW ) { return qfalse; } - if ( owner->flags & FL_NOTARGET ) + if ( owner->flags & FL_NOTARGET ) { return qfalse; } @@ -511,9 +514,9 @@ qboolean NPC_CheckInvestigate( int alertEventNum ) /* -void NPC_BSSleep( void ) +void NPC_BSSleep( void ) */ -void NPC_BSSleep( void ) +void NPC_BSSleep( void ) { int alertEvent = NPC_CheckAlertEvents( qtrue, qfalse ); @@ -573,8 +576,8 @@ void NPC_BSFollowLeader (void) if ( level.alertEvents[eventID].level >= AEL_SUSPICIOUS && (NPCInfo->scriptFlags&SCF_LOOK_FOR_ENEMIES) ) { NPCInfo->lastAlertID = level.alertEvents[eventID].ID; - if ( !level.alertEvents[eventID].owner || - !level.alertEvents[eventID].owner->client || + if ( !level.alertEvents[eventID].owner || + !level.alertEvents[eventID].owner->client || level.alertEvents[eventID].owner->health <= 0 || level.alertEvents[eventID].owner->client->playerTeam != NPC->client->enemyTeam ) {//not an enemy @@ -593,8 +596,8 @@ void NPC_BSFollowLeader (void) } if ( !NPC->enemy ) { - if ( NPC->client->leader - && NPC->client->leader->enemy + if ( NPC->client->leader + && NPC->client->leader->enemy && NPC->client->leader->enemy != NPC && ( (NPC->client->leader->enemy->client&&NPC->client->leader->enemy->client->playerTeam==NPC->client->enemyTeam) ||(NPC->client->leader->enemy->svFlags&SVF_NONNPC_ENEMY&&NPC->client->leader->enemy->noDamageTeam==NPC->client->enemyTeam) ) @@ -606,7 +609,7 @@ void NPC_BSFollowLeader (void) } } } - else + else { if ( NPC->enemy->health <= 0 || (NPC->enemy->flags&FL_NOTARGET) ) { @@ -621,7 +624,7 @@ void NPC_BSFollowLeader (void) NPC_CheckEnemy( (NPCInfo->confusionTimetempBehavior!=BS_FOLLOW_LEADER), qfalse );//don't find new enemy if this is tempbehav } } - + if ( NPC->enemy && NPC->client->ps.weapon ) {//If have an enemy, face him and fire if ( NPC->client->ps.weapon == WP_SABER )//|| NPCInfo->confusionTime>level.time ) @@ -639,16 +642,16 @@ void NPC_BSFollowLeader (void) if ( enemyVisibility > VIS_PVS ) {//face vec3_t enemy_org, muzzle, delta, angleToEnemy; - float distanceToEnemy; + //float distanceToEnemy; CalcEntitySpot( NPC->enemy, SPOT_HEAD, enemy_org ); NPC_AimWiggle( enemy_org ); CalcEntitySpot( NPC, SPOT_WEAPON, muzzle ); - + VectorSubtract( enemy_org, muzzle, delta); vectoangles( delta, angleToEnemy ); - distanceToEnemy = VectorNormalize( delta ); + //distanceToEnemy = VectorNormalize( delta ); NPCInfo->desiredYaw = angleToEnemy[YAW]; NPCInfo->desiredPitch = angleToEnemy[PITCH]; @@ -657,7 +660,7 @@ void NPC_BSFollowLeader (void) if ( enemyVisibility >= VIS_SHOOT ) {//shoot NPC_AimAdjust( 2 ); - if ( NPC_GetHFOVPercentage( NPC->enemy->currentOrigin, NPC->currentOrigin, NPC->client->ps.viewangles, NPCInfo->stats.hfov ) > 0.6f + if ( NPC_GetHFOVPercentage( NPC->enemy->currentOrigin, NPC->currentOrigin, NPC->client->ps.viewangles, NPCInfo->stats.hfov ) > 0.6f && NPC_GetHFOVPercentage( NPC->enemy->currentOrigin, NPC->currentOrigin, NPC->client->ps.viewangles, NPCInfo->stats.vfov ) > 0.5f ) {//actually withing our front cone WeaponThink( qtrue ); @@ -667,7 +670,7 @@ void NPC_BSFollowLeader (void) { NPC_AimAdjust( 1 ); } - + //NPC_CheckCanAttack(1.0, qfalse); } else @@ -686,7 +689,7 @@ void NPC_BSFollowLeader (void) VectorNormalize(delta); NPC->NPC->desiredYaw = angleToLeader[YAW]; NPC->NPC->desiredPitch = angleToLeader[PITCH]; - + NPC_UpdateAngles(qtrue, qtrue); } @@ -825,7 +828,7 @@ void NPC_BSJump (void) //FIXME: length of xy will change curve of parabola, need to account for this //somewhere... PARA_WIDTH - + z = (sqrt(apexHeight + z) - sqrt(apexHeight)); assert(z >= 0); @@ -834,18 +837,18 @@ void NPC_BSJump (void) xy -= z; xy *= 0.5; - + assert(xy > 0); VectorMA( p1, xy, dir, apex ); apex[2] += apexHeight; - + VectorCopy(apex, NPC->pos1); - + //Now we have the apex, aim for it height = apex[2] - NPC->currentOrigin[2]; time = sqrt( height / ( .5 * NPC->client->ps.gravity ) ); - if ( !time ) + if ( !time ) { // gi.Printf("ERROR no time in jump\n"); return; @@ -878,7 +881,7 @@ void NPC_BSJump (void) if ( NPC->s.groundEntityNum != ENTITYNUM_NONE) {//Landed, start landing anim - //FIXME: if the + //FIXME: if the VectorClear(NPC->client->ps.velocity); NPC_SetAnim(NPC, SETANIM_BOTH, BOTH_LAND1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); NPCInfo->jumpState = JS_LANDING; @@ -903,8 +906,8 @@ void NPC_BSJump (void) { NPCInfo->jumpState = JS_WAITING; - - //task complete no matter what... + + //task complete no matter what... NPC_ClearGoal(); NPCInfo->goalTime = level.time; NPCInfo->aiFlags &= ~NPCAI_MOVING; @@ -912,9 +915,9 @@ void NPC_BSJump (void) NPC->flags &= ~FL_NO_KNOCKBACK; //Return that the goal was reached Q3_TaskIDComplete( NPC, TID_MOVE_NAV ); - + //Or should we keep jumping until reached goal? - + /* NPCInfo->goalEntity = UpdateGoal(); if ( !NPCInfo->goalEntity ) @@ -923,7 +926,7 @@ void NPC_BSJump (void) Q3_TaskIDComplete( NPC, TID_MOVE_NAV ); } */ - + } break; case JS_WAITING: @@ -1095,7 +1098,7 @@ void NPC_BSSearch (void) else {//Just finished waiting NPC->waypoint = NAV_FindClosestWaypointForEnt( NPC, WAYPOINT_NONE ); - + if ( NPC->waypoint == NPCInfo->homeWp ) { int numEdges = navigator.GetNodeNumEdges( NPCInfo->tempGoal->waypoint ); @@ -1174,7 +1177,7 @@ void NPC_BSNoClip ( void ) float fDot, rDot, uDot; VectorSubtract( NPCInfo->goalEntity->currentOrigin, NPC->currentOrigin, dir ); - + vectoangles( dir, angles ); NPCInfo->desiredYaw = angles[YAW]; @@ -1269,7 +1272,7 @@ void NPC_BSWander (void) else {//Just finished waiting NPC->waypoint = NAV_FindClosestWaypointForEnt( NPC, WAYPOINT_NONE ); - + if ( NPC->waypoint != WAYPOINT_NONE ) { int numEdges = navigator.GetNodeNumEdges( NPC->waypoint ); @@ -1311,7 +1314,7 @@ void NPC_BSFaceLeader (void) VectorNormalize( delta ); NPC->NPC->desiredYaw = angleToLeader[YAW]; NPC->NPC->desiredPitch = angleToLeader[PITCH]; - + NPC_UpdateAngles(qtrue, qtrue); } */ @@ -1330,7 +1333,7 @@ void NPC_Surrender( void ) { return; } - if ( NPC->s.weapon != WP_NONE && + if ( NPC->s.weapon != WP_NONE && NPC->s.weapon != WP_MELEE && NPC->s.weapon != WP_SABER ) { @@ -1354,14 +1357,14 @@ qboolean NPC_CheckSurrender( void ) {//not enabled return qfalse; } - if ( !Q3_TaskIDPending( NPC, TID_MOVE_NAV ) - && NPC->client->ps.groundEntityNum != ENTITYNUM_NONE + if ( !Q3_TaskIDPending( NPC, TID_MOVE_NAV ) + && NPC->client->ps.groundEntityNum != ENTITYNUM_NONE && !NPC->client->ps.weaponTime && !PM_InKnockDown( &NPC->client->ps ) - && NPC->enemy && NPC->enemy->client && NPC->enemy->enemy == NPC && NPC->enemy->s.weapon != WP_NONE && NPC->enemy->s.weapon != WP_MELEE + && NPC->enemy && NPC->enemy->client && NPC->enemy->enemy == NPC && NPC->enemy->s.weapon != WP_NONE && NPC->enemy->s.weapon != WP_MELEE && NPC->enemy->health > 20 && NPC->enemy->painDebounceTime < level.time - 3000 && NPC->enemy->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] < level.time - 1000 ) {//don't surrender if scripted to run somewhere or if we're in the air or if we're busy or if we don't have an enemy or if the enemy is not mad at me or is hurt or not a threat or busy being attacked //FIXME: even if not in a group, don't surrender if there are other enemies in the PVS and within a certain range? - if ( NPC->s.weapon != WP_ROCKET_LAUNCHER + if ( NPC->s.weapon != WP_ROCKET_LAUNCHER && NPC->s.weapon != WP_REPEATER && NPC->s.weapon != WP_FLECHETTE && NPC->s.weapon != WP_SABER ) @@ -1396,7 +1399,7 @@ qboolean NPC_CheckSurrender( void ) } if ( NPCInfo->group && NPCInfo->group->numGroup <= 1 ) {//I'm alone but I was in a group//FIXME: surrender anyway if just melee or no weap? - if ( NPC->s.weapon == WP_NONE + if ( NPC->s.weapon == WP_NONE //NPC has a weapon || NPC->enemy == player || (NPC->enemy->s.weapon == WP_SABER&&NPC->enemy->client&&NPC->enemy->client->ps.saberActive) @@ -1456,7 +1459,7 @@ void NPC_BSFlee( void ) { NPCInfo->tempBehavior = BS_DEFAULT; NPCInfo->squadState = SQUAD_IDLE; - //FIXME: should we set some timer to make him stay in this spot for a bit, + //FIXME: should we set some timer to make him stay in this spot for a bit, //so he doesn't just suddenly turn around and come back at the enemy? //OR, just stop running toward goal for last second or so of flee? } @@ -1579,7 +1582,7 @@ void NPC_StartFlee( gentity_t *enemy, vec3_t dangerPoint, int dangerLevel, int f { G_SetEnemy( NPC, enemy ); } - + //FIXME: if don't have a weapon, find nearest one we have a route to and run for it? int cp = -1; if ( dangerLevel > AEL_DANGER || NPC->s.weapon == WP_NONE || ((!NPCInfo->group || NPCInfo->group->numGroup <= 1) && NPC->health <= 10 ) ) diff --git a/codeJK2/game/NPC_combat.cpp b/codeJK2/game/NPC_combat.cpp index c480d89894..003a755e08 100644 --- a/codeJK2/game/NPC_combat.cpp +++ b/codeJK2/game/NPC_combat.cpp @@ -1,24 +1,27 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //NPC_combat.cpp -// leave this line at the top for all NPC_xxxx.cpp files... #include "g_headers.h" diff --git a/codeJK2/game/NPC_goal.cpp b/codeJK2/game/NPC_goal.cpp index 2d812a1a2f..6b79122e91 100644 --- a/codeJK2/game/NPC_goal.cpp +++ b/codeJK2/game/NPC_goal.cpp @@ -1,28 +1,27 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -//b_goal.cpp -// leave this line at the top for all NPC_xxxx.cpp files... #include "g_headers.h" - - - #include "b_local.h" #include "Q3_Interface.h" diff --git a/codeJK2/game/NPC_misc.cpp b/codeJK2/game/NPC_misc.cpp index 64c01ed022..8ee9116a10 100644 --- a/codeJK2/game/NPC_misc.cpp +++ b/codeJK2/game/NPC_misc.cpp @@ -1,31 +1,31 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // // NPC_misc.cpp // -// leave this line at the top for all NPC_xxxx.cpp files... #include "g_headers.h" - - - #include "b_local.h" #include "../../code/qcommon/q_shared.h" /* @@ -52,7 +52,7 @@ void Debug_Printf (cvar_t *cv, int debugLevel, char *fmt, ...) color = S_COLOR_RED; va_start (argptr,fmt); - vsprintf (msg, fmt, argptr); + Q_vsnprintf (msg, sizeof(msg), fmt, argptr); va_end (argptr); gi.Printf("%s%5i:%s", color, level.time, msg); @@ -90,7 +90,7 @@ void Debug_NPCPrintf (gentity_t *printNPC, cvar_t *cv, int debugLevel, char *fmt color = COLOR_RED; va_start (argptr,fmt); - vsprintf (msg, fmt, argptr); + Q_vsnprintf (msg, sizeof(msg), fmt, argptr); va_end (argptr); gi.Printf ("%c%c%5i (%s) %s", Q_COLOR_ESCAPE, color, level.time, printNPC->targetname, msg); diff --git a/codeJK2/game/NPC_move.cpp b/codeJK2/game/NPC_move.cpp index 8e4afd0e01..0ed5725780 100644 --- a/codeJK2/game/NPC_move.cpp +++ b/codeJK2/game/NPC_move.cpp @@ -1,31 +1,31 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // // NPC_move.cpp // -// leave this line at the top for all NPC_xxxx.cpp files... #include "g_headers.h" - - - #include "b_local.h" #include "g_nav.h" #include "anims.h" diff --git a/codeJK2/game/NPC_reactions.cpp b/codeJK2/game/NPC_reactions.cpp index b7ea7c29bd..f6dd0fa29c 100644 --- a/codeJK2/game/NPC_reactions.cpp +++ b/codeJK2/game/NPC_reactions.cpp @@ -1,29 +1,30 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //NPC_reactions.cpp -// leave this line at the top for all NPC_xxxx.cpp files... #include "g_headers.h" - - #include "b_local.h" #include "anims.h" #include "g_functions.h" diff --git a/codeJK2/game/NPC_senses.cpp b/codeJK2/game/NPC_senses.cpp index 43a3c07d6a..57e6abc8e5 100644 --- a/codeJK2/game/NPC_senses.cpp +++ b/codeJK2/game/NPC_senses.cpp @@ -1,29 +1,29 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //NPC_senses.cpp -// leave this line at the top for all NPC_xxxx.cpp files... #include "g_headers.h" - - - #include "b_local.h" #ifdef _DEBUG #include diff --git a/codeJK2/game/NPC_sounds.cpp b/codeJK2/game/NPC_sounds.cpp index 5dd8758d23..21917661c5 100644 --- a/codeJK2/game/NPC_sounds.cpp +++ b/codeJK2/game/NPC_sounds.cpp @@ -1,29 +1,29 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //NPC_sounds.cpp -// leave this line at the top for all NPC_xxxx.cpp files... #include "g_headers.h" - - - #include "b_local.h" #include "Q3_Interface.h" diff --git a/codeJK2/game/NPC_spawn.cpp b/codeJK2/game/NPC_spawn.cpp index 397f73bd10..e020294efc 100644 --- a/codeJK2/game/NPC_spawn.cpp +++ b/codeJK2/game/NPC_spawn.cpp @@ -1,31 +1,30 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //b_spawn.cpp //added by MCG -// leave this line at the top for all NPC_xxxx.cpp files... #include "g_headers.h" - - - - #include "b_local.h" #include "anims.h" #include "g_functions.h" diff --git a/codeJK2/game/NPC_stats.cpp b/codeJK2/game/NPC_stats.cpp index 9bdff54ae5..2cac6ae189 100644 --- a/codeJK2/game/NPC_stats.cpp +++ b/codeJK2/game/NPC_stats.cpp @@ -1,27 +1,28 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //NPC_stats.cpp -// leave this line at the top for all NPC_xxxx.cpp files... -#include "g_headers.h" - - +#include "g_headers.h" #include "b_local.h" #include "b_public.h" @@ -31,7 +32,7 @@ extern qboolean NPCsPrecached; extern vec3_t playerMins; extern vec3_t playerMaxs; -char *TeamNames[TEAM_NUM_TEAMS] = +char *TeamNames[TEAM_NUM_TEAMS] = { "", // "starfleet", @@ -54,7 +55,7 @@ char *TeamNames[TEAM_NUM_TEAMS] = }; // this list was made using the model directories, this MUST be in the same order as the CLASS_ enum in teams.h -char *ClassNames[CLASS_NUM_CLASSES] = +char *ClassNames[CLASS_NUM_CLASSES] = { "", // class none "atst", @@ -67,7 +68,7 @@ char *ClassNames[CLASS_NUM_CLASSES] = "flier2", "galak", "glider", - "gonk", + "gonk", "gran", "howler", "imperial", @@ -114,7 +115,7 @@ char *ClassNames[CLASS_NUM_CLASSES] = NPC_ReactionTime */ //FIXME use grandom in here -int NPC_ReactionTime ( void ) +int NPC_ReactionTime ( void ) { return 200 * ( 6 - NPCInfo->stats.reactions ); } @@ -123,18 +124,18 @@ int NPC_ReactionTime ( void ) // parse support routines // -qboolean G_ParseLiteral( const char **data, const char *string ) +qboolean G_ParseLiteral( const char **data, const char *string ) { const char *token; token = COM_ParseExt( data, qtrue ); - if ( token[0] == 0 ) + if ( token[0] == 0 ) { gi.Printf( "unexpected EOF\n" ); return qtrue; } - if ( Q_stricmp( token, string ) ) + if ( Q_stricmp( token, string ) ) { gi.Printf( "required string '%s' missing\n", string ); return qtrue; @@ -149,7 +150,7 @@ qboolean G_ParseLiteral( const char **data, const char *string ) #define MAX_NPC_DATA_SIZE 0x40000 char NPCParms[MAX_NPC_DATA_SIZE]; -team_t TranslateTeamName( const char *name ) +team_t TranslateTeamName( const char *name ) { for ( int n = (TEAM_FREE + 1); n < TEAM_NUM_TEAMS; n++ ) { @@ -158,12 +159,12 @@ team_t TranslateTeamName( const char *name ) return ((team_t) n); } } - + return TEAM_FREE; } -class_t TranslateClassName( const char *name ) +class_t TranslateClassName( const char *name ) { for ( int n = (CLASS_NONE + 1); n < CLASS_NUM_CLASSES; n++ ) { @@ -172,14 +173,14 @@ class_t TranslateClassName( const char *name ) return ((class_t) n); } } - + return CLASS_NONE; // I hope this never happens, maybe print a warning } /* -static race_t TranslateRaceName( const char *name ) +static race_t TranslateRaceName( const char *name ) { - if ( !Q_stricmp( name, "human" ) ) + if ( !Q_stricmp( name, "human" ) ) { return RACE_HUMAN; } @@ -187,81 +188,81 @@ static race_t TranslateRaceName( const char *name ) } */ /* -static rank_t TranslateRankName( const char *name ) +static rank_t TranslateRankName( const char *name ) Should be used to determine pip bolt-ons */ -static rank_t TranslateRankName( const char *name ) +static rank_t TranslateRankName( const char *name ) { - if ( !Q_stricmp( name, "civilian" ) ) + if ( !Q_stricmp( name, "civilian" ) ) { return RANK_CIVILIAN; } - if ( !Q_stricmp( name, "crewman" ) ) + if ( !Q_stricmp( name, "crewman" ) ) { return RANK_CREWMAN; } - - if ( !Q_stricmp( name, "ensign" ) ) + + if ( !Q_stricmp( name, "ensign" ) ) { return RANK_ENSIGN; } - - if ( !Q_stricmp( name, "ltjg" ) ) + + if ( !Q_stricmp( name, "ltjg" ) ) { return RANK_LT_JG; } - - if ( !Q_stricmp( name, "lt" ) ) + + if ( !Q_stricmp( name, "lt" ) ) { return RANK_LT; } - - if ( !Q_stricmp( name, "ltcomm" ) ) + + if ( !Q_stricmp( name, "ltcomm" ) ) { return RANK_LT_COMM; } - - if ( !Q_stricmp( name, "commander" ) ) + + if ( !Q_stricmp( name, "commander" ) ) { return RANK_COMMANDER; } - - if ( !Q_stricmp( name, "captain" ) ) + + if ( !Q_stricmp( name, "captain" ) ) { return RANK_CAPTAIN; } return RANK_CIVILIAN; } -static saber_colors_t TranslateSaberColor( const char *name ) +static saber_colors_t TranslateSaberColor( const char *name ) { - if ( !Q_stricmp( name, "red" ) ) + if ( !Q_stricmp( name, "red" ) ) { return SABER_RED; } - if ( !Q_stricmp( name, "orange" ) ) + if ( !Q_stricmp( name, "orange" ) ) { return SABER_ORANGE; } - if ( !Q_stricmp( name, "yellow" ) ) + if ( !Q_stricmp( name, "yellow" ) ) { return SABER_YELLOW; } - if ( !Q_stricmp( name, "green" ) ) + if ( !Q_stricmp( name, "green" ) ) { return SABER_GREEN; } - if ( !Q_stricmp( name, "blue" ) ) + if ( !Q_stricmp( name, "blue" ) ) { return SABER_BLUE; } - if ( !Q_stricmp( name, "purple" ) ) + if ( !Q_stricmp( name, "purple" ) ) { return SABER_PURPLE; } - if ( !Q_stricmp( name, "random" ) ) + if ( !Q_stricmp( name, "random" ) ) { return ((saber_colors_t)(Q_irand( SABER_ORANGE, SABER_PURPLE ))); } @@ -302,7 +303,7 @@ static int ItemNameToNumber( const char *name, int itemType ) { } */ -static int MoveTypeNameToEnum( const char *name ) +static int MoveTypeNameToEnum( const char *name ) { if(!Q_stricmp("runjump", name)) { @@ -368,14 +369,14 @@ models/players/visor/animation.cfg, etc ====================== */ -qboolean G_ParseAnimationFile( const char *af_filename ) +qboolean G_ParseAnimationFile( const char *af_filename ) { const char *text_p; int len; int i; const char *token; float fps; - int skip; + //int skip; char text[40000]; int animNum; animation_t *animations = level.knownAnimFileSets[level.numKnownAnimFileSets].animations; @@ -385,11 +386,11 @@ qboolean G_ParseAnimationFile( const char *af_filename ) { return qfalse; } - if ( len <= 0 ) + if ( len <= 0 ) { return qfalse; } - if ( len >= sizeof( text ) - 1 ) + if ( len >= (int)sizeof(text) - 1 ) { G_Error( "G_ParseAnimationFile: File %s too long\n (%d > %d)", af_filename, len, sizeof( text ) - 1); return qfalse; @@ -398,7 +399,7 @@ qboolean G_ParseAnimationFile( const char *af_filename ) // parse the text text_p = text; - skip = 0; // quiet the compiler warning + //skip = 0; // quiet the compiler warning //FIXME: have some way of playing anims backwards... negative numFrames? @@ -414,11 +415,11 @@ qboolean G_ParseAnimationFile( const char *af_filename ) // read information for each frame COM_BeginParseSession(); - while(1) + while(1) { token = COM_Parse( &text_p ); - if ( !token || !token[0]) + if ( !token || !token[0]) { break; } @@ -434,33 +435,33 @@ qboolean G_ParseAnimationFile( const char *af_filename ) } token = COM_Parse( &text_p ); - if ( !token ) + if ( !token ) { break; } animations[animNum].firstFrame = atoi( token ); token = COM_Parse( &text_p ); - if ( !token ) + if ( !token ) { break; } animations[animNum].numFrames = atoi( token ); token = COM_Parse( &text_p ); - if ( !token ) + if ( !token ) { break; } animations[animNum].loopFrames = atoi( token ); token = COM_Parse( &text_p ); - if ( !token ) + if ( !token ) { break; } fps = atof( token ); - if ( fps == 0 ) + if ( fps == 0 ) { fps = 1;//Don't allow divide by zero error } @@ -496,7 +497,7 @@ qboolean G_ParseAnimFileSet( const char *filename, const char *animCFG, int *ani Q_strncpyz( strippedName, filename, sizeof(strippedName), qtrue); slash = strchr( strippedName, '/' ); - if ( slash ) + if ( slash ) { // truncate modelName to find just the dir not the extension *slash = 0; @@ -544,7 +545,7 @@ void G_LoadAnimFileSet( gentity_t *ent, const char *modelName ) char *GLAName; char *slash = NULL; char *strippedName; - + if ( ent->playerModel == -1 ) { return; @@ -552,7 +553,7 @@ void G_LoadAnimFileSet( gentity_t *ent, const char *modelName ) //get the location of the animation.cfg GLAName = gi.G2API_GetGLAName( &ent->ghoul2[ent->playerModel] ); //now load and parse the animation.cfg, animsounds.cfg and set the animFileIndex - if ( !GLAName) + if ( !GLAName) { Com_Printf( S_COLOR_RED"Failed find animation file name models/players/%s/animation.cfg\n", modelName ); strippedName="broken"; @@ -569,7 +570,7 @@ void G_LoadAnimFileSet( gentity_t *ent, const char *modelName ) } //now load and parse the animation.cfg, animsounds.cfg and set the animFileIndex - if ( !G_ParseAnimFileSet( modelName, strippedName, &ent->client->clientInfo.animFileIndex ) ) + if ( !G_ParseAnimFileSet( modelName, strippedName, &ent->client->clientInfo.animFileIndex ) ) { Com_Printf( S_COLOR_RED"Failed to load animation file set models/players/%s/animation.cfg\n", modelName ); } @@ -593,7 +594,7 @@ void NPC_PrecacheAnimationCFG( const char *NPC_type ) COM_BeginParseSession(); // look for the right NPC - while ( p ) + while ( p ) { token = COM_ParseExt( &p, qtrue ); if ( token[0] == 0 ) @@ -602,7 +603,7 @@ void NPC_PrecacheAnimationCFG( const char *NPC_type ) return; } - if ( !Q_stricmp( token, NPC_type ) ) + if ( !Q_stricmp( token, NPC_type ) ) { break; } @@ -610,38 +611,38 @@ void NPC_PrecacheAnimationCFG( const char *NPC_type ) SkipBracedSection( &p ); } - if ( !p ) + if ( !p ) { COM_EndParseSession( ); return; } - if ( G_ParseLiteral( &p, "{" ) ) + if ( G_ParseLiteral( &p, "{" ) ) { COM_EndParseSession( ); return; } // parse the NPC info block - while ( 1 ) + while ( 1 ) { token = COM_ParseExt( &p, qtrue ); - if ( !token[0] ) + if ( !token[0] ) { gi.Printf( S_COLOR_RED"ERROR: unexpected EOF while parsing '%s'\n", NPC_type ); - COM_EndParseSession( ); + COM_EndParseSession( ); return; } - if ( !Q_stricmp( token, "}" ) ) + if ( !Q_stricmp( token, "}" ) ) { break; } // legsmodel - if ( !Q_stricmp( token, "legsmodel" ) ) + if ( !Q_stricmp( token, "legsmodel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -653,9 +654,9 @@ void NPC_PrecacheAnimationCFG( const char *NPC_type ) } // playerModel - if ( !Q_stricmp( token, "playerModel" ) ) + if ( !Q_stricmp( token, "playerModel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -663,7 +664,7 @@ void NPC_PrecacheAnimationCFG( const char *NPC_type ) char *GLAName; char *slash = NULL; char *strippedName; - + int handle = gi.G2API_PrecacheGhoul2Model( va( "models/players/%s/model.glm", value ) ); if ( handle > 0 )//FIXME: isn't 0 a valid handle? { @@ -750,7 +751,7 @@ void NPC_Precache ( gentity_t *spawner ) COM_BeginParseSession(); // look for the right NPC - while ( p ) + while ( p ) { token = COM_ParseExt( &p, qtrue ); if ( token[0] == 0 ) @@ -759,7 +760,7 @@ void NPC_Precache ( gentity_t *spawner ) return; } - if ( !Q_stricmp( token, spawner->NPC_type ) ) + if ( !Q_stricmp( token, spawner->NPC_type ) ) { break; } @@ -767,40 +768,40 @@ void NPC_Precache ( gentity_t *spawner ) SkipBracedSection( &p ); } - if ( !p ) + if ( !p ) { COM_EndParseSession( ); return; } - if ( G_ParseLiteral( &p, "{" ) ) + if ( G_ParseLiteral( &p, "{" ) ) { COM_EndParseSession( ); return; } // parse the NPC info block - while ( 1 ) + while ( 1 ) { COM_EndParseSession(); // if still in session (or using continue;) COM_BeginParseSession(); token = COM_ParseExt( &p, qtrue ); - if ( !token[0] ) + if ( !token[0] ) { gi.Printf( S_COLOR_RED"ERROR: unexpected EOF while parsing '%s'\n", spawner->NPC_type ); COM_EndParseSession( ); return; } - if ( !Q_stricmp( token, "}" ) ) + if ( !Q_stricmp( token, "}" ) ) { break; } // headmodel - if ( !Q_stricmp( token, "headmodel" ) ) + if ( !Q_stricmp( token, "headmodel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -815,11 +816,11 @@ void NPC_Precache ( gentity_t *spawner ) md3Model = qtrue; continue; } - + // torsomodel - if ( !Q_stricmp( token, "torsomodel" ) ) + if ( !Q_stricmp( token, "torsomodel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -836,44 +837,44 @@ void NPC_Precache ( gentity_t *spawner ) } // legsmodel - if ( !Q_stricmp( token, "legsmodel" ) ) + if ( !Q_stricmp( token, "legsmodel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } - Q_strncpyz( ri.legsModelName, value, sizeof(ri.legsModelName), qtrue); + Q_strncpyz( ri.legsModelName, value, sizeof(ri.legsModelName), qtrue); md3Model = qtrue; continue; } // playerModel - if ( !Q_stricmp( token, "playerModel" ) ) + if ( !Q_stricmp( token, "playerModel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } - Q_strncpyz( playerModel, value, sizeof(playerModel), qtrue); + Q_strncpyz( playerModel, value, sizeof(playerModel), qtrue); md3Model = qfalse; continue; } // customSkin - if ( !Q_stricmp( token, "customSkin" ) ) + if ( !Q_stricmp( token, "customSkin" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } - Q_strncpyz( customSkin, value, sizeof(customSkin), qtrue); + Q_strncpyz( customSkin, value, sizeof(customSkin), qtrue); continue; } // playerTeam - if ( !Q_stricmp( token, "playerTeam" ) ) + if ( !Q_stricmp( token, "playerTeam" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -881,7 +882,7 @@ void NPC_Precache ( gentity_t *spawner ) continue; } - + // snd if ( !Q_stricmp( token, "snd" ) ) { if ( COM_ParseString( &p, &value ) ) { @@ -892,7 +893,7 @@ void NPC_Precache ( gentity_t *spawner ) //FIXME: store this in some sound field or parse in the soundTable like the animTable... Q_strncpyz( sound, value, sizeof( sound ) ); patch = strstr( sound, "/" ); - if ( patch ) + if ( patch ) { *patch = 0; } @@ -911,7 +912,7 @@ void NPC_Precache ( gentity_t *spawner ) //FIXME: store this in some sound field or parse in the soundTable like the animTable... Q_strncpyz( sound, value, sizeof( sound ) ); patch = strstr( sound, "/" ); - if ( patch ) + if ( patch ) { *patch = 0; } @@ -919,7 +920,7 @@ void NPC_Precache ( gentity_t *spawner ) } continue; } - + // sndextra if ( !Q_stricmp( token, "sndextra" ) ) { if ( COM_ParseString( &p, &value ) ) { @@ -930,7 +931,7 @@ void NPC_Precache ( gentity_t *spawner ) //FIXME: store this in some sound field or parse in the soundTable like the animTable... Q_strncpyz( sound, value, sizeof( sound ) ); patch = strstr( sound, "/" ); - if ( patch ) + if ( patch ) { *patch = 0; } @@ -949,7 +950,7 @@ void NPC_Precache ( gentity_t *spawner ) //FIXME: store this in some sound field or parse in the soundTable like the animTable... Q_strncpyz( sound, value, sizeof( sound ) ); patch = strstr( sound, "/" ); - if ( patch ) + if ( patch ) { *patch = 0; } @@ -958,7 +959,7 @@ void NPC_Precache ( gentity_t *spawner ) continue; } } - + COM_EndParseSession( ); if ( md3Model ) @@ -1082,7 +1083,7 @@ void NPC_BuildRandom( gentity_t *NPC ) } extern void G_SetG2PlayerModel( gentity_t * const ent, const char *modelName, const char *customSkin, const char *surfOff, const char *surfOn ); -qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) +qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { const char *token; const char *value; @@ -1101,7 +1102,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) char surfOn[1024]; Q_strncpyz(customSkin, "default", sizeof(customSkin)); - if ( !NPCName || !NPCName[0]) + if ( !NPCName || !NPCName[0]) { NPCName = "Player"; } @@ -1146,9 +1147,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } Q_strncpyz( ci->name, NPCName, sizeof( ci->name ) ); - + NPC->playerModel = -1; - + //Set defaults //FIXME: should probably put default torso and head models, but what about enemies //that don't have any- like Stasis? @@ -1161,7 +1162,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) //FIXME: should we have one for weapon too? memset( (char *)surfOff, 0, sizeof(surfOff) ); memset( (char *)surfOn, 0, sizeof(surfOn) ); - + /* ri->headYawRangeLeft = 50; ri->headYawRangeRight = 50; @@ -1192,7 +1193,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) NPC->client->dismemberProbHands = 100; NPC->client->dismemberProbWaist = 100; NPC->client->dismemberProbLegs = 100; - + if ( !Q_stricmp( "random", NPCName ) ) {//Randomly assemble a starfleet guy @@ -1204,7 +1205,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) COM_BeginParseSession(); // look for the right NPC - while ( p ) + while ( p ) { token = COM_ParseExt( &p, qtrue ); if ( token[0] == 0 ) @@ -1213,45 +1214,45 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) return qfalse; } - if ( !Q_stricmp( token, NPCName ) ) + if ( !Q_stricmp( token, NPCName ) ) { break; } SkipBracedSection( &p ); } - if ( !p ) + if ( !p ) { COM_EndParseSession( ); return qfalse; } - if ( G_ParseLiteral( &p, "{" ) ) + if ( G_ParseLiteral( &p, "{" ) ) { COM_EndParseSession( ); return qfalse; } - + // parse the NPC info block - while ( 1 ) + while ( 1 ) { token = COM_ParseExt( &p, qtrue ); - if ( !token[0] ) + if ( !token[0] ) { gi.Printf( S_COLOR_RED"ERROR: unexpected EOF while parsing '%s'\n", NPCName ); COM_EndParseSession( ); return qfalse; } - if ( !Q_stricmp( token, "}" ) ) + if ( !Q_stricmp( token, "}" ) ) { break; } //===MODEL PROPERTIES=========================================================== // headmodel - if ( !Q_stricmp( token, "headmodel" ) ) + if ( !Q_stricmp( token, "headmodel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1260,9 +1261,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { ri->headModelName[0] = '\0'; //Zero the head clamp range so the torso & legs don't lag behind - ri->headYawRangeLeft = - ri->headYawRangeRight = - ri->headPitchRangeUp = + ri->headYawRangeLeft = + ri->headYawRangeRight = + ri->headPitchRangeUp = ri->headPitchRangeDown = 0; } else @@ -1271,11 +1272,11 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } continue; } - + // torsomodel - if ( !Q_stricmp( token, "torsomodel" ) ) + if ( !Q_stricmp( token, "torsomodel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1284,9 +1285,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { ri->torsoModelName[0] = '\0'; //Zero the torso clamp range so the legs don't lag behind - ri->torsoYawRangeLeft = - ri->torsoYawRangeRight = - ri->torsoPitchRangeUp = + ri->torsoYawRangeLeft = + ri->torsoYawRangeRight = + ri->torsoPitchRangeUp = ri->torsoPitchRangeDown = 0; } else @@ -1297,45 +1298,45 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // legsmodel - if ( !Q_stricmp( token, "legsmodel" ) ) + if ( !Q_stricmp( token, "legsmodel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } - Q_strncpyz( ri->legsModelName, value, sizeof(ri->legsModelName), qtrue); + Q_strncpyz( ri->legsModelName, value, sizeof(ri->legsModelName), qtrue); //Need to do this here to get the right index G_ParseAnimFileSet( ri->legsModelName, ri->legsModelName, &ci->animFileIndex ); continue; } // playerModel - if ( !Q_stricmp( token, "playerModel" ) ) + if ( !Q_stricmp( token, "playerModel" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } - Q_strncpyz( playerModel, value, sizeof(playerModel), qtrue); + Q_strncpyz( playerModel, value, sizeof(playerModel), qtrue); md3Model = qfalse; continue; } - + // customSkin - if ( !Q_stricmp( token, "customSkin" ) ) + if ( !Q_stricmp( token, "customSkin" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } - Q_strncpyz( customSkin, value, sizeof(customSkin), qtrue); + Q_strncpyz( customSkin, value, sizeof(customSkin), qtrue); continue; } // surfOff - if ( !Q_stricmp( token, "surfOff" ) ) + if ( !Q_stricmp( token, "surfOff" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1350,11 +1351,11 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } continue; } - + // surfOn - if ( !Q_stricmp( token, "surfOn" ) ) + if ( !Q_stricmp( token, "surfOn" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1369,16 +1370,16 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } continue; } - + //headYawRangeLeft - if ( !Q_stricmp( token, "headYawRangeLeft" ) ) + if ( !Q_stricmp( token, "headYawRangeLeft" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1388,14 +1389,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //headYawRangeRight - if ( !Q_stricmp( token, "headYawRangeRight" ) ) + if ( !Q_stricmp( token, "headYawRangeRight" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1405,14 +1406,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //headPitchRangeUp - if ( !Q_stricmp( token, "headPitchRangeUp" ) ) + if ( !Q_stricmp( token, "headPitchRangeUp" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1420,16 +1421,16 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) ri->headPitchRangeUp = n; continue; } - + //headPitchRangeDown - if ( !Q_stricmp( token, "headPitchRangeDown" ) ) + if ( !Q_stricmp( token, "headPitchRangeDown" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1439,14 +1440,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //torsoYawRangeLeft - if ( !Q_stricmp( token, "torsoYawRangeLeft" ) ) + if ( !Q_stricmp( token, "torsoYawRangeLeft" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1456,14 +1457,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //torsoYawRangeRight - if ( !Q_stricmp( token, "torsoYawRangeRight" ) ) + if ( !Q_stricmp( token, "torsoYawRangeRight" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1473,14 +1474,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //torsoPitchRangeUp - if ( !Q_stricmp( token, "torsoPitchRangeUp" ) ) + if ( !Q_stricmp( token, "torsoPitchRangeUp" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1490,14 +1491,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //torsoPitchRangeDown - if ( !Q_stricmp( token, "torsoPitchRangeDown" ) ) + if ( !Q_stricmp( token, "torsoPitchRangeDown" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1507,14 +1508,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // Uniform XYZ scale - if ( !Q_stricmp( token, "scale" ) ) + if ( !Q_stricmp( token, "scale" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1527,14 +1528,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //X scale - if ( !Q_stricmp( token, "scaleX" ) ) + if ( !Q_stricmp( token, "scaleX" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1547,14 +1548,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //Y scale - if ( !Q_stricmp( token, "scaleY" ) ) + if ( !Q_stricmp( token, "scaleY" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1567,14 +1568,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //Z scale - if ( !Q_stricmp( token, "scaleZ" ) ) + if ( !Q_stricmp( token, "scaleZ" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1627,7 +1628,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( f < 0.0f ) + if ( f < 0.0f ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1640,14 +1641,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // evasion - if ( !Q_stricmp( token, "evasion" ) ) + if ( !Q_stricmp( token, "evasion" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 1 || n > 5 ) + if ( n < 1 || n > 5 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1692,7 +1693,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } continue; } - + // move if ( !Q_stricmp( token, "move" ) ) { if ( COM_ParseInt( &p, &n ) ) { @@ -1729,7 +1730,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) // shootDistance if ( !Q_stricmp( token, "saberColor" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1746,7 +1747,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( f < 0.0f ) + if ( f < 0.0f ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1759,14 +1760,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // shootDistance - if ( !Q_stricmp( token, "health" ) ) + if ( !Q_stricmp( token, "health" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1801,7 +1802,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( f < 0.0f ) + if ( f < 0.0f ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1819,7 +1820,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( f < 0.0f ) + if ( f < 0.0f ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1832,9 +1833,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // race - // if ( !Q_stricmp( token, "race" ) ) + // if ( !Q_stricmp( token, "race" ) ) // { - // if ( COM_ParseString( &p, &value ) ) + // if ( COM_ParseString( &p, &value ) ) // { // continue; // } @@ -1843,9 +1844,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) // } // rank - if ( !Q_stricmp( token, "rank" ) ) + if ( !Q_stricmp( token, "rank" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1857,9 +1858,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // fullName - if ( !Q_stricmp( token, "fullName" ) ) + if ( !Q_stricmp( token, "fullName" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1868,9 +1869,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // playerTeam - if ( !Q_stricmp( token, "playerTeam" ) ) + if ( !Q_stricmp( token, "playerTeam" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1879,9 +1880,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // enemyTeam - if ( !Q_stricmp( token, "enemyTeam" ) ) + if ( !Q_stricmp( token, "enemyTeam" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1890,9 +1891,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // class - if ( !Q_stricmp( token, "class" ) ) + if ( !Q_stricmp( token, "class" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -1906,7 +1907,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1924,7 +1925,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1942,7 +1943,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1960,7 +1961,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1978,7 +1979,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( "bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -1991,10 +1992,10 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //===MOVEMENT STATS============================================================ - - if ( !Q_stricmp( token, "width" ) ) + + if ( !Q_stricmp( token, "width" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { continue; } @@ -2004,9 +2005,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) continue; } - if ( !Q_stricmp( token, "height" ) ) + if ( !Q_stricmp( token, "height" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { continue; } @@ -2017,9 +2018,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) continue; } - if ( !Q_stricmp( token, "crouchheight" ) ) + if ( !Q_stricmp( token, "crouchheight" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { continue; } @@ -2028,9 +2029,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) continue; } - if ( !Q_stricmp( token, "movetype" ) ) + if ( !Q_stricmp( token, "movetype" ) ) { - if ( COM_ParseString( &p, &value ) ) + if ( COM_ParseString( &p, &value ) ) { continue; } @@ -2041,7 +2042,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } continue; } - + // yawSpeed if ( !Q_stricmp( token, "yawSpeed" ) ) { if ( COM_ParseInt( &p, &n ) ) { @@ -2060,14 +2061,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } // walkSpeed - if ( !Q_stricmp( token, "walkSpeed" ) ) + if ( !Q_stricmp( token, "walkSpeed" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2078,16 +2079,16 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } continue; } - + //runSpeed - if ( !Q_stricmp( token, "runSpeed" ) ) + if ( !Q_stricmp( token, "runSpeed" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2100,14 +2101,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //acceleration - if ( !Q_stricmp( token, "acceleration" ) ) + if ( !Q_stricmp( token, "acceleration" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < 0 ) + if ( n < 0 ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2120,14 +2121,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } //===MISC=============================================================================== // default behavior - if ( !Q_stricmp( token, "behavior" ) ) + if ( !Q_stricmp( token, "behavior" ) ) { - if ( COM_ParseInt( &p, &n ) ) + if ( COM_ParseInt( &p, &n ) ) { SkipRestOfLine( &p ); continue; } - if ( n < BS_DEFAULT || n >= NUM_BSTATES ) + if ( n < BS_DEFAULT || n >= NUM_BSTATES ) { gi.Printf( S_COLOR_YELLOW"WARNING: bad %s in NPC '%s'\n", token, NPCName ); continue; @@ -2149,7 +2150,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) //FIXME: store this in some sound field or parse in the soundTable like the animTable... Q_strncpyz( sound, value, sizeof( sound ) ); patch = strstr( sound, "/" ); - if ( patch ) + if ( patch ) { *patch = 0; } @@ -2168,7 +2169,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) //FIXME: store this in some sound field or parse in the soundTable like the animTable... Q_strncpyz( sound, value, sizeof( sound ) ); patch = strstr( sound, "/" ); - if ( patch ) + if ( patch ) { *patch = 0; } @@ -2176,7 +2177,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } continue; } - + // sndextra if ( !Q_stricmp( token, "sndextra" ) ) { if ( COM_ParseString( &p, &value ) ) { @@ -2187,7 +2188,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) //FIXME: store this in some sound field or parse in the soundTable like the animTable... Q_strncpyz( sound, value, sizeof( sound ) ); patch = strstr( sound, "/" ); - if ( patch ) + if ( patch ) { *patch = 0; } @@ -2206,7 +2207,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) //FIXME: store this in some sound field or parse in the soundTable like the animTable... Q_strncpyz( sound, value, sizeof( sound ) ); patch = strstr( sound, "/" ); - if ( patch ) + if ( patch ) { *patch = 0; } @@ -2244,7 +2245,7 @@ Ghoul2 Insert End return qtrue; } -void NPC_LoadParms( void ) +void NPC_LoadParms( void ) { int len, totallen, npcExtFNLen, mainBlockLen, fileCnt, i; const char filename[] = "ext_data/NPCs.cfg"; @@ -2252,7 +2253,6 @@ void NPC_LoadParms( void ) char npcExtensionListBuf[2048]; // The list of file names read in //First, load in the npcs.cfg - gi.Printf( "Parsing %s\n", filename ); len = gi.FS_ReadFile( filename, (void **) &buffer ); if ( len == -1 ) { gi.Printf( "file not found\n" ); @@ -2274,15 +2274,13 @@ void NPC_LoadParms( void ) fileCnt = gi.FS_GetFileList("ext_data", ".npc", npcExtensionListBuf, sizeof(npcExtensionListBuf) ); holdChar = npcExtensionListBuf; - for ( i = 0; i < fileCnt; i++, holdChar += npcExtFNLen + 1 ) + for ( i = 0; i < fileCnt; i++, holdChar += npcExtFNLen + 1 ) { npcExtFNLen = strlen( holdChar ); - gi.Printf( "Parsing %s\n", holdChar ); - len = gi.FS_ReadFile( va( "ext_data/%s", holdChar), (void **) &buffer ); - if ( len == -1 ) + if ( len == -1 ) { gi.Printf( "error reading file\n" ); } diff --git a/codeJK2/game/NPC_utils.cpp b/codeJK2/game/NPC_utils.cpp index e6099bf4e7..633518ec45 100644 --- a/codeJK2/game/NPC_utils.cpp +++ b/codeJK2/game/NPC_utils.cpp @@ -1,29 +1,29 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //NPC_utils.cpp -// leave this line at the top for all NPC_xxxx.cpp files... #include "g_headers.h" - - - #include "b_local.h" #include "g_icarus.h" #include "Q3_Interface.h" diff --git a/codeJK2/game/Q3_Interface.cpp b/codeJK2/game/Q3_Interface.cpp index 70d6358b26..0c7eaf5ab2 100644 --- a/codeJK2/game/Q3_Interface.cpp +++ b/codeJK2/game/Q3_Interface.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // ICARUS Engine Interface File // @@ -23,13 +27,8 @@ This file is part of Jedi Knight 2. // // -- jweier -// leave this line at the top for PCH reasons... #include "g_headers.h" - - - - #include "g_local.h" #include "g_functions.h" #include "Q3_Interface.h" @@ -451,7 +450,7 @@ static void Q3_CenterPrint ( const char *format, ... ) char text[1024]; va_start (argptr, format); - vsprintf (text, format, argptr); + Q_vsnprintf (text, sizeof(text), format, argptr); va_end (argptr); // FIXME: added '!' so you can print something that's hasn't been precached, '@' searches only for precache text @@ -705,7 +704,7 @@ static char *Q3_GetAnimBoth( gentity_t *ent ) return NULL; } - if ( stricmp( lowerName, upperName ) ) + if ( Q_stricmp( lowerName, upperName ) ) { #ifdef _DEBUG // sigh, cut down on tester reports that aren't important Q3_DebugPrint( WL_WARNING, "Q3_GetAnimBoth: legs and torso animations did not match : returning legs\n" ); @@ -1020,24 +1019,24 @@ static int Q3_PlaySound( int taskID, int entID, const char *name, const char *ch int soundHandle = G_SoundIndex( (char *) finalName ); bool bBroadcast = false; - if ( ( stricmp( channel, "CHAN_ANNOUNCER" ) == 0 ) || (ent->classname && Q_stricmp("target_scriptrunner", ent->classname ) == 0) ) { + if ( ( Q_stricmp( channel, "CHAN_ANNOUNCER" ) == 0 ) || (ent->classname && Q_stricmp("target_scriptrunner", ent->classname ) == 0) ) { bBroadcast = true; } // moved here from further down so I can easily check channel-type without code dup... // - if ( stricmp( channel, "CHAN_VOICE" ) == 0 ) + if ( Q_stricmp( channel, "CHAN_VOICE" ) == 0 ) { voice_chan = CHAN_VOICE; type_voice = qtrue; } - else if ( stricmp( channel, "CHAN_VOICE_ATTEN" ) == 0 ) + else if ( Q_stricmp( channel, "CHAN_VOICE_ATTEN" ) == 0 ) { voice_chan = CHAN_VOICE_ATTEN; type_voice = qtrue; } - else if ( stricmp( channel, "CHAN_VOICE_GLOBAL" ) == 0 ) // this should broadcast to everyone, put only casue animation on G_SoundOnEnt... + else if ( Q_stricmp( channel, "CHAN_VOICE_GLOBAL" ) == 0 ) // this should broadcast to everyone, put only casue animation on G_SoundOnEnt... { voice_chan = CHAN_VOICE_GLOBAL; type_voice = qtrue; @@ -6858,58 +6857,58 @@ static void Q3_Set( int taskID, int entID, const char *type_name, const char *da break; case SET_IGNOREPAIN: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetIgnorePain( entID, qtrue); - else if(!stricmp("false", ((char *)data))) + else if(!Q_stricmp("false", ((char *)data))) Q3_SetIgnorePain( entID, qfalse); break; case SET_IGNOREENEMIES: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetIgnoreEnemies( entID, qtrue); - else if(!stricmp("false", ((char *)data))) + else if(!Q_stricmp("false", ((char *)data))) Q3_SetIgnoreEnemies( entID, qfalse); break; case SET_IGNOREALERTS: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetIgnoreAlerts( entID, qtrue); - else if(!stricmp("false", ((char *)data))) + else if(!Q_stricmp("false", ((char *)data))) Q3_SetIgnoreAlerts( entID, qfalse); break; case SET_DONTSHOOT: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetDontShoot( entID, qtrue); - else if(!stricmp("false", ((char *)data))) + else if(!Q_stricmp("false", ((char *)data))) Q3_SetDontShoot( entID, qfalse); break; case SET_DONTFIRE: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetDontFire( entID, qtrue); - else if(!stricmp("false", ((char *)data))) + else if(!Q_stricmp("false", ((char *)data))) Q3_SetDontFire( entID, qfalse); break; case SET_LOCKED_ENEMY: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetLockedEnemy( entID, qtrue); - else if(!stricmp("false", ((char *)data))) + else if(!Q_stricmp("false", ((char *)data))) Q3_SetLockedEnemy( entID, qfalse); break; case SET_NOTARGET: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetNoTarget( entID, qtrue); - else if(!stricmp("false", ((char *)data))) + else if(!Q_stricmp("false", ((char *)data))) Q3_SetNoTarget( entID, qfalse); break; case SET_LEAN: - if(!stricmp("right", ((char *)data))) + if(!Q_stricmp("right", ((char *)data))) Q3_SetLean( entID, LEAN_RIGHT); - else if(!stricmp("left", ((char *)data))) + else if(!Q_stricmp("left", ((char *)data))) Q3_SetLean( entID, LEAN_LEFT); else Q3_SetLean( entID, LEAN_NONE); @@ -7016,7 +7015,7 @@ static void Q3_Set( int taskID, int entID, const char *type_name, const char *da break; case SET_NO_MINDTRICK: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetNoMindTrick( entID, qtrue); else Q3_SetNoMindTrick( entID, qfalse); @@ -7033,133 +7032,133 @@ static void Q3_Set( int taskID, int entID, const char *type_name, const char *da break; case SET_CROUCHED: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetCrouched( entID, qtrue); else Q3_SetCrouched( entID, qfalse); break; case SET_WALKING: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetWalking( entID, qtrue); else Q3_SetWalking( entID, qfalse); break; case SET_RUNNING: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetRunning( entID, qtrue); else Q3_SetRunning( entID, qfalse); break; case SET_CHASE_ENEMIES: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetChaseEnemies( entID, qtrue); else Q3_SetChaseEnemies( entID, qfalse); break; case SET_LOOK_FOR_ENEMIES: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetLookForEnemies( entID, qtrue); else Q3_SetLookForEnemies( entID, qfalse); break; case SET_FACE_MOVE_DIR: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetFaceMoveDir( entID, qtrue); else Q3_SetFaceMoveDir( entID, qfalse); break; case SET_ALT_FIRE: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetAltFire( entID, qtrue); else Q3_SetAltFire( entID, qfalse); break; case SET_DONT_FLEE: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetDontFlee( entID, qtrue); else Q3_SetDontFlee( entID, qfalse); break; case SET_FORCED_MARCH: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetForcedMarch( entID, qtrue); else Q3_SetForcedMarch( entID, qfalse); break; case SET_NO_RESPONSE: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetNoResponse( entID, qtrue); else Q3_SetNoResponse( entID, qfalse); break; case SET_NO_COMBAT_TALK: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetCombatTalk( entID, qtrue); else Q3_SetCombatTalk( entID, qfalse); break; case SET_NO_ALERT_TALK: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetAlertTalk( entID, qtrue); else Q3_SetAlertTalk( entID, qfalse); break; case SET_USE_CP_NEAREST: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetUseCpNearest( entID, qtrue); else Q3_SetUseCpNearest( entID, qfalse); break; case SET_NO_FORCE: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetNoForce( entID, qtrue); else Q3_SetNoForce( entID, qfalse); break; case SET_NO_ACROBATICS: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetNoAcrobatics( entID, qtrue); else Q3_SetNoAcrobatics( entID, qfalse); break; case SET_USE_SUBTITLES: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetUseSubtitles( entID, qtrue); else Q3_SetUseSubtitles( entID, qfalse); break; case SET_NO_FALLTODEATH: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetNoFallToDeath( entID, qtrue); else Q3_SetNoFallToDeath( entID, qfalse); break; case SET_DISMEMBERABLE: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetDismemberable( entID, qtrue); else Q3_SetDismemberable( entID, qfalse); break; case SET_MORELIGHT: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetMoreLight( entID, qtrue); else Q3_SetMoreLight( entID, qfalse); @@ -7175,28 +7174,28 @@ static void Q3_Set( int taskID, int entID, const char *type_name, const char *da break; case SET_UNDYING: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetUndying( entID, qtrue); else Q3_SetUndying( entID, qfalse); break; case SET_INVINCIBLE: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetInvincible( entID, qtrue); else Q3_SetInvincible( entID, qfalse); break; case SET_NOAVOID: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) Q3_SetNoAvoid( entID, qtrue); else Q3_SetNoAvoid( entID, qfalse); break; case SET_SOLID: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { if ( !Q3_SetSolid( entID, qtrue) ) { @@ -7211,49 +7210,49 @@ static void Q3_Set( int taskID, int entID, const char *type_name, const char *da break; case SET_INVISIBLE: - if( !stricmp("true", ((char *)data)) ) + if( !Q_stricmp("true", ((char *)data)) ) Q3_SetInvisible( entID, qtrue ); else Q3_SetInvisible( entID, qfalse ); break; case SET_VAMPIRE: - if( !stricmp("true", ((char *)data)) ) + if( !Q_stricmp("true", ((char *)data)) ) Q3_SetVampire( entID, qtrue ); else Q3_SetVampire( entID, qfalse ); break; case SET_FORCE_INVINCIBLE: - if( !stricmp("true", ((char *)data)) ) + if( !Q_stricmp("true", ((char *)data)) ) Q3_SetForceInvincible( entID, qtrue ); else Q3_SetForceInvincible( entID, qfalse ); break; case SET_GREET_ALLIES: - if( !stricmp("true", ((char *)data)) ) + if( !Q_stricmp("true", ((char *)data)) ) Q3_SetGreetAllies( entID, qtrue ); else Q3_SetGreetAllies( entID, qfalse ); break; case SET_PLAYER_LOCKED: - if( !stricmp("true", ((char *)data)) ) + if( !Q_stricmp("true", ((char *)data)) ) Q3_SetPlayerLocked( entID, qtrue ); else Q3_SetPlayerLocked( entID, qfalse ); break; case SET_LOCK_PLAYER_WEAPONS: - if( !stricmp("true", ((char *)data)) ) + if( !Q_stricmp("true", ((char *)data)) ) Q3_SetLockPlayerWeapons( entID, qtrue ); else Q3_SetLockPlayerWeapons( entID, qfalse ); break; case SET_NO_IMPACT_DAMAGE: - if( !stricmp("true", ((char *)data)) ) + if( !Q_stricmp("true", ((char *)data)) ) Q3_SetNoImpactDamage( entID, qtrue ); else Q3_SetNoImpactDamage( entID, qfalse ); @@ -7335,7 +7334,7 @@ static void Q3_Set( int taskID, int entID, const char *type_name, const char *da break; case SET_PLAYER_USABLE: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { Q3_SetPlayerUsable(entID, qtrue); } @@ -7365,7 +7364,7 @@ static void Q3_Set( int taskID, int entID, const char *type_name, const char *da break; case SET_LOOP_ANIM: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { Q3_SetLoopAnim(entID, qtrue); } @@ -7376,7 +7375,7 @@ static void Q3_Set( int taskID, int entID, const char *type_name, const char *da break; case SET_INTERFACE: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { Q3_SetInterface(entID, "1"); } @@ -7388,7 +7387,7 @@ static void Q3_Set( int taskID, int entID, const char *type_name, const char *da break; case SET_SHIELDS: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { Q3_SetShields(entID, qtrue); } @@ -7399,7 +7398,7 @@ static void Q3_Set( int taskID, int entID, const char *type_name, const char *da break; case SET_SABERACTIVE: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { Q3_SetSaberActive( entID, qtrue ); } @@ -7410,7 +7409,7 @@ static void Q3_Set( int taskID, int entID, const char *type_name, const char *da break; case SET_ADJUST_AREA_PORTALS: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { Q3_SetAdjustAreaPortals( entID, qtrue ); } @@ -7421,7 +7420,7 @@ static void Q3_Set( int taskID, int entID, const char *type_name, const char *da break; case SET_DMG_BY_HEAVY_WEAP_ONLY: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { Q3_SetDmgByHeavyWeapOnly( entID, qtrue ); } @@ -7432,7 +7431,7 @@ static void Q3_Set( int taskID, int entID, const char *type_name, const char *da break; case SET_SHIELDED: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { Q3_SetShielded( entID, qtrue ); } @@ -7443,7 +7442,7 @@ static void Q3_Set( int taskID, int entID, const char *type_name, const char *da break; case SET_NO_GROUPS: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { Q3_SetNoGroups( entID, qtrue ); } @@ -7454,31 +7453,31 @@ static void Q3_Set( int taskID, int entID, const char *type_name, const char *da break; case SET_FIRE_WEAPON: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { Q3_SetFireWeapon( entID, qtrue); } - else if(!stricmp("false", ((char *)data))) + else if(!Q_stricmp("false", ((char *)data))) { Q3_SetFireWeapon( entID, qfalse); } break; case SET_INACTIVE: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { Q3_SetInactive( entID, qtrue); } - else if(!stricmp("false", ((char *)data))) + else if(!Q_stricmp("false", ((char *)data))) { Q3_SetInactive( entID, qfalse); } - else if(!stricmp("unlocked", ((char *)data))) + else if(!Q_stricmp("unlocked", ((char *)data))) { extern void UnLockDoors(gentity_t *const ent); UnLockDoors(&g_entities[entID]); } - else if(!stricmp("locked", ((char *)data))) + else if(!Q_stricmp("locked", ((char *)data))) { extern void LockDoors(gentity_t *const ent); LockDoors(&g_entities[entID]); @@ -7494,18 +7493,18 @@ extern void LockDoors(gentity_t *const ent); break; case SET_FUNC_USABLE_VISIBLE: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { Q3_SetFuncUsableVisible( entID, qtrue); } - else if(!stricmp("false", ((char *)data))) + else if(!Q_stricmp("false", ((char *)data))) { Q3_SetFuncUsableVisible( entID, qfalse); } break; case SET_NO_KNOCKBACK: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { Q3_SetNoKnockback(entID, qtrue); } @@ -7527,7 +7526,7 @@ extern void LockDoors(gentity_t *const ent); break; case SET_VIDEO_FADE_IN: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { gi.cvar_set("cl_VidFadeUp", "1"); } @@ -7538,7 +7537,7 @@ extern void LockDoors(gentity_t *const ent); break; case SET_VIDEO_FADE_OUT: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { gi.cvar_set("cl_VidFadeDown", "1"); } @@ -7608,7 +7607,7 @@ extern void LockDoors(gentity_t *const ent); break; case SET_DISABLE_SHADER_ANIM: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { Q3_SetDisableShaderAnims( entID, qtrue); } @@ -7619,7 +7618,7 @@ extern void LockDoors(gentity_t *const ent); break; case SET_SHADER_ANIM: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { Q3_SetShaderAnim( entID, qtrue); } @@ -7638,7 +7637,7 @@ extern void LockDoors(gentity_t *const ent); break; case SET_HUD: - if(!stricmp("true", ((char *)data))) + if(!Q_stricmp("true", ((char *)data))) { gi.cvar_set("cg_drawHUD", "1"); } @@ -7689,11 +7688,11 @@ static void Q3_Kill( int entID, const char *name ) gentity_t *victim = NULL; int o_health; - if( !stricmp( name, "self") ) + if( !Q_stricmp( name, "self") ) { victim = ent; } - else if( !stricmp( name, "enemy" ) ) + else if( !Q_stricmp( name, "enemy" ) ) { victim = ent->enemy; } @@ -8979,7 +8978,7 @@ static int Q3_Evaluate( int p1Type, const char *p1, int p2Type, const char *p2, case TK_STRING: case TK_IDENTIFIER: - return (int) !stricmp( c1, c2 ); //NOTENOTE: The script uses proper string comparison logic (ex. ( a == a ) == true ) + return (int) !Q_stricmp( c1, c2 ); //NOTENOTE: The script uses proper string comparison logic (ex. ( a == a ) == true ) break; default: @@ -9079,7 +9078,7 @@ static int Q3_Evaluate( int p1Type, const char *p1, int p2Type, const char *p2, case TK_STRING: case TK_IDENTIFIER: - return (int) stricmp( c1, c2 ); + return (int) Q_stricmp( c1, c2 ); break; default: @@ -9144,7 +9143,7 @@ void Q3_DebugPrint( int level, const char *format, ... ) char text[1024]; va_start (argptr, format); - vsprintf (text, format, argptr); + Q_vsnprintf (text, sizeof(text), format, argptr); va_end (argptr); //Add the color formatting @@ -9193,7 +9192,7 @@ static void Q3_Play( int taskID, int entID, const char *type, const char *name ) { gentity_t *ent = &g_entities[entID]; - if ( !stricmp( type, "PLAY_ROFF" ) ) + if ( !Q_stricmp( type, "PLAY_ROFF" ) ) { // Try to load the requested ROFF if ( G_LoadRoff( name ) ) diff --git a/codeJK2/game/Q3_Interface.h b/codeJK2/game/Q3_Interface.h index 9381222b17..64a0343713 100644 --- a/codeJK2/game/Q3_Interface.h +++ b/codeJK2/game/Q3_Interface.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __Q3_INTERFACE__ #define __Q3_INTERFACE__ diff --git a/codeJK2/game/Q3_Registers.cpp b/codeJK2/game/Q3_Registers.cpp index bce91438fb..16c209931f 100644 --- a/codeJK2/game/Q3_Registers.cpp +++ b/codeJK2/game/Q3_Registers.cpp @@ -1,27 +1,27 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for PCH reasons... #include "g_headers.h" - - - #include "g_local.h" #include "Q3_Registers.h" diff --git a/codeJK2/game/Q3_Registers.h b/codeJK2/game/Q3_Registers.h index 7dbdfc8404..dc264fc9cd 100644 --- a/codeJK2/game/Q3_Registers.h +++ b/codeJK2/game/Q3_Registers.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __Q3_REGISTERS__ #define __Q3_REGISTERS__ diff --git a/codeJK2/game/ai.h b/codeJK2/game/ai.h index 5acc51a6aa..de733501d8 100644 --- a/codeJK2/game/ai.h +++ b/codeJK2/game/ai.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __AI__ #define __AI__ diff --git a/codeJK2/game/anims.h b/codeJK2/game/anims.h index d366edebe6..5867ac25c0 100644 --- a/codeJK2/game/anims.h +++ b/codeJK2/game/anims.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __ANIMS_H__ #define __ANIMS_H__ diff --git a/codeJK2/game/b_local.h b/codeJK2/game/b_local.h index a3f5991690..381a288f9b 100644 --- a/codeJK2/game/b_local.h +++ b/codeJK2/game/b_local.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //B_local.h //re-added by MCG diff --git a/codeJK2/game/b_public.h b/codeJK2/game/b_public.h index d138f67efa..add489e5c0 100644 --- a/codeJK2/game/b_public.h +++ b/codeJK2/game/b_public.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __B_PUBLIC_H__ #define __B_PUBLIC_H__ diff --git a/codeJK2/game/bg_local.h b/codeJK2/game/bg_local.h index 2e18f6cb52..59f6064ab5 100644 --- a/codeJK2/game/bg_local.h +++ b/codeJK2/game/bg_local.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // bg_local.h -- local definitions for the bg (both games) files diff --git a/codeJK2/game/bg_misc.cpp b/codeJK2/game/bg_misc.cpp index 841f358c95..8fd1193bb1 100644 --- a/codeJK2/game/bg_misc.cpp +++ b/codeJK2/game/bg_misc.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // included in both game dll and client @@ -210,19 +215,19 @@ gitem_t *FindItemForWeapon( weapon_t weapon ) { } //---------------------------------------------- -gitem_t *FindItemForInventory( int inv ) +gitem_t *FindItemForInventory( int inv ) { int i; gitem_t *it; // Now just check for any other kind of item. - for ( i = 1 ; i < bg_numItems ; i++ ) + for ( i = 1 ; i < bg_numItems ; i++ ) { it = &bg_itemlist[i]; if ( it->giType == IT_HOLDABLE ) { - if ( it->giTag == inv ) + if ( it->giTag == inv ) { return it; } @@ -239,13 +244,13 @@ FindItemForWeapon =============== */ -gitem_t *FindItemForAmmo( ammo_t ammo ) +gitem_t *FindItemForAmmo( ammo_t ammo ) { int i; - for ( i = 1 ; i < bg_numItems ; i++ ) + for ( i = 1 ; i < bg_numItems ; i++ ) { - if ( bg_itemlist[i].giType == IT_AMMO && bg_itemlist[i].giTag == ammo ) + if ( bg_itemlist[i].giType == IT_AMMO && bg_itemlist[i].giTag == ammo ) { return &bg_itemlist[i]; } @@ -294,8 +299,8 @@ qboolean BG_CanItemBeGrabbed( const entityState_t *ent, const playerState_t *ps case IT_WEAPON: // See if we already have this weapon. - if ( !(ps->stats[ STAT_WEAPONS ] & ( 1 << item->giTag ))) - { + if ( !(ps->stats[ STAT_WEAPONS ] & ( 1 << item->giTag ))) + { // Don't have this weapon yet, so pick it up. return qtrue; } @@ -304,7 +309,7 @@ qboolean BG_CanItemBeGrabbed( const entityState_t *ent, const playerState_t *ps if ( ps->ammo[weaponData[item->giTag].ammoIndex] >= ammoData[weaponData[item->giTag].ammoIndex].max ) { // full, so don't grab the item - return qfalse; + return qfalse; } return qtrue; // could use more of this type of ammo, so grab the item @@ -336,7 +341,7 @@ qboolean BG_CanItemBeGrabbed( const entityState_t *ent, const playerState_t *ps break; } - if ( ps->ammo[ item->giTag ] >= ammoData[item->giTag].max ) // checkme + if ( ps->ammo[ item->giTag ] >= ammoData[item->giTag].max ) // checkme { return qfalse; // can't hold any more } @@ -368,7 +373,7 @@ qboolean BG_CanItemBeGrabbed( const entityState_t *ent, const playerState_t *ps case IT_BATTERY: // don't pick up if already at max - if ( ps->batteryCharge >= MAX_BATTERIES ) + if ( ps->batteryCharge >= MAX_BATTERIES ) { return qfalse; } @@ -377,7 +382,7 @@ qboolean BG_CanItemBeGrabbed( const entityState_t *ent, const playerState_t *ps case IT_HOLOCRON: // pretty lame but for now you can always pick these up return qtrue; - + case IT_HOLDABLE: if ( item->giTag >= INV_ELECTROBINOCULARS && item->giTag <= INV_SENTRY ) @@ -389,6 +394,10 @@ qboolean BG_CanItemBeGrabbed( const entityState_t *ent, const playerState_t *ps } } return qtrue; + + default: + assert( !"BG_CanItemBeGrabbed: invalid item" ); + break; } return qfalse; @@ -421,20 +430,20 @@ void EvaluateTrajectory( const trajectory_t *tr, int atTime, vec3_t result ) { VectorMA( tr->trBase, phase, tr->trDelta, result ); break; case TR_LINEAR_STOP: - if ( atTime > tr->trTime + tr->trDuration ) + if ( atTime > tr->trTime + tr->trDuration ) { atTime = tr->trTime + tr->trDuration; } //old totally linear deltaTime = ( atTime - tr->trTime ) * 0.001F; // milliseconds to seconds - if ( deltaTime < 0 ) + if ( deltaTime < 0 ) {//going past the total duration deltaTime = 0; } VectorMA( tr->trBase, deltaTime, tr->trDelta, result ); break; case TR_NONLINEAR_STOP: - if ( atTime > tr->trTime + tr->trDuration ) + if ( atTime > tr->trTime + tr->trDuration ) { atTime = tr->trTime + tr->trDuration; } @@ -486,7 +495,7 @@ void EvaluateTrajectoryDelta( const trajectory_t *tr, int atTime, vec3_t result VectorScale( tr->trDelta, phase, result ); break; case TR_LINEAR_STOP: - if ( atTime > tr->trTime + tr->trDuration ) + if ( atTime > tr->trTime + tr->trDuration ) { VectorClear( result ); return; @@ -548,11 +557,11 @@ and after local prediction on the client void PlayerStateToEntityState( playerState_t *ps, entityState_t *s ) { int i; - if ( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPECTATOR ) + if ( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPECTATOR ) { s->eType = ET_INVISIBLE; - } - /*else if ( ps->stats[STAT_HEALTH] <= GIB_HEALTH ) + } + /*else if ( ps->stats[STAT_HEALTH] <= GIB_HEALTH ) { s->eType = ET_INVISIBLE; } */ @@ -586,7 +595,7 @@ void PlayerStateToEntityState( playerState_t *ps, entityState_t *s ) { // new sabre stuff s->saberActive = ps->saberActive; s->saberInFlight = ps->saberInFlight; - + s->vehicleModel = ps->vehicleModel; s->weapon = ps->weapon; @@ -622,14 +631,14 @@ void PlayerStateToEntityState( playerState_t *ps, entityState_t *s ) { side = DotProduct (ps->velocity, right); sign = side < 0 ? -1 : 1; side = fabs(side); - + value = 2; // g_rollangle->value; if (side < 200 /* g_rollspeed->value */ ) side = side * value / 200; // g_rollspeed->value; else side = value; - + s->angles[ROLL] = (int)(side*sign * 4); } #endif @@ -644,7 +653,7 @@ Items can be picked up without actually touching their physical bounds ============ */ qboolean BG_PlayerTouchesItem( playerState_t *ps, entityState_t *item, int atTime ) { - vec3_t origin; + vec3_t origin = { 0.0f }; EvaluateTrajectory( &item->pos, atTime, origin ); diff --git a/codeJK2/game/bg_pangles.cpp b/codeJK2/game/bg_pangles.cpp index 27a8c4f69e..7fe3aa55fd 100644 --- a/codeJK2/game/bg_pangles.cpp +++ b/codeJK2/game/bg_pangles.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // define GAME_INCLUDE so that g_public.h does not define the // short, server-visible gclient_t and gentity_t structures, diff --git a/codeJK2/game/bg_panimate.cpp b/codeJK2/game/bg_panimate.cpp index 33693d64d2..788cc41120 100644 --- a/codeJK2/game/bg_panimate.cpp +++ b/codeJK2/game/bg_panimate.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // define GAME_INCLUDE so that g_public.h does not define the // short, server-visible gclient_t and gentity_t structures, @@ -114,7 +119,7 @@ saberMoveData_t saberMoveData[LS_MOVE_MAX] = {// NB:randomized {"R2L St", BOTH_S1_S1__R, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_R2L, LS_A_R2L, 200 }, // LS_S_R2L {"TR2BL St", BOTH_S1_S1_TR, Q_R, Q_TR, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_TR2BL, LS_A_TR2BL, 200 }, // LS_S_TR2BL {"T2B St", BOTH_S1_S1_T_, Q_R, Q_T, AFLAG_ACTIVE, 100, BLK_TIGHT, LS_A_T2B, LS_A_T2B, 200 }, // LS_S_T2B - + //returns {"TL2BR Ret", BOTH_R1_BR_S1, Q_BR, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_TL2BR {"L2R Ret", BOTH_R1__R_S1, Q_R, Q_R, AFLAG_FINISH, 100, BLK_TIGHT, LS_READY, LS_READY, 200 }, // LS_R_L2R @@ -169,23 +174,23 @@ saberMoveData_t saberMoveData[LS_MOVE_MAX] = {// NB:randomized {"BL2L Trans", BOTH_T1_BL__L, Q_BL, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_A_L2R, 150 }, //# Fast arc bottom left to left //Bounces - {"Bounce BR", BOTH_B1_BR___, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_T1_BR_TR, 150 }, - {"Bounce R", BOTH_B1__R___, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_T1__R__L, 150 }, - {"Bounce TR", BOTH_B1_TR___, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_TR_TL, 150 }, - {"Bounce T", BOTH_B1_T____, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, - {"Bounce TL", BOTH_B1_TL___, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_T1_TL_TR, 150 }, - {"Bounce L", BOTH_B1__L___, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_T1__L__R, 150 }, - {"Bounce BL", BOTH_B1_BL___, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_T1_BL_TR, 150 }, + {"Bounce BR", BOTH_B1_BR___, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_T1_BR_TR, 150 }, + {"Bounce R", BOTH_B1__R___, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_T1__R__L, 150 }, + {"Bounce TR", BOTH_B1_TR___, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_TR_TL, 150 }, + {"Bounce T", BOTH_B1_T____, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + {"Bounce TL", BOTH_B1_TL___, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_T1_TL_TR, 150 }, + {"Bounce L", BOTH_B1__L___, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_T1__L__R, 150 }, + {"Bounce BL", BOTH_B1_BL___, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_T1_BL_TR, 150 }, //Deflected attacks (like bounces, but slide off enemy saber, not straight back) - {"Deflect BR", BOTH_D1_BR___, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_T1_BR_TR, 150 }, - {"Deflect R", BOTH_D1__R___, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_T1__R__L, 150 }, - {"Deflect TR", BOTH_D1_TR___, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_TR_TL, 150 }, - {"Deflect T", BOTH_B1_T____, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, - {"Deflect TL", BOTH_D1_TL___, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_T1_TL_TR, 150 }, - {"Deflect L", BOTH_D1__L___, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_T1__L__R, 150 }, - {"Deflect BL", BOTH_D1_BL___, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_T1_BL_TR, 150 }, - {"Deflect B", BOTH_D1_B____, Q_B, Q_B, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + {"Deflect BR", BOTH_D1_BR___, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TL2BR, LS_T1_BR_TR, 150 }, + {"Deflect R", BOTH_D1__R___, Q_R, Q_R, AFLAG_ACTIVE, 100, BLK_NO, LS_R_L2R, LS_T1__R__L, 150 }, + {"Deflect TR", BOTH_D1_TR___, Q_TR, Q_TR, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_TR_TL, 150 }, + {"Deflect T", BOTH_B1_T____, Q_T, Q_T, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, + {"Deflect TL", BOTH_D1_TL___, Q_TL, Q_TL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BR2TL, LS_T1_TL_TR, 150 }, + {"Deflect L", BOTH_D1__L___, Q_L, Q_L, AFLAG_ACTIVE, 100, BLK_NO, LS_R_R2L, LS_T1__L__R, 150 }, + {"Deflect BL", BOTH_D1_BL___, Q_BL, Q_BL, AFLAG_ACTIVE, 100, BLK_NO, LS_R_TR2BL, LS_T1_BL_TR, 150 }, + {"Deflect B", BOTH_D1_B____, Q_B, Q_B, AFLAG_ACTIVE, 100, BLK_NO, LS_R_BL2TR, LS_T1_T__BL, 150 }, //Reflected attacks {"Reflected BR",BOTH_V1_BR_S1, Q_BR, Q_BR, AFLAG_ACTIVE, 100, BLK_NO, LS_READY, LS_READY, 150 },// LS_V1_BR @@ -314,7 +319,7 @@ saberMoveName_t transitionMove[Q_NUM_QUADS][Q_NUM_QUADS] = void PM_VelocityForSaberMove( playerState_t *ps, vec3_t throwDir ) { - vec3_t vForward, vRight, vUp, startQ, endQ; + vec3_t vForward = { 0.0f }, vRight = { 0.0f }, vUp = { 0.0f }, startQ = { 0.0f }, endQ = { 0.0f }; AngleVectors( ps->viewangles, vForward, vRight, vUp ); @@ -888,7 +893,7 @@ saberMoveName_t PM_AttackMoveForQuad( int quad ) return LS_NONE; } -int saberMoveTransitionAngle[Q_NUM_QUADS][Q_NUM_QUADS] = +int saberMoveTransitionAngle[Q_NUM_QUADS][Q_NUM_QUADS] = { { 0,//Q_BR,Q_BR, @@ -997,7 +1002,7 @@ qboolean PM_SaberKataDone( int curmove = LS_NONE, int newmove = LS_NONE ) {//desann and tavion can link up as many attacks as they want return qfalse; } - //FIXME: instead of random, apply some sort of logical conditions to whether or + //FIXME: instead of random, apply some sort of logical conditions to whether or // not you can chain? Like if you were completely missed, you can't chain as much, or...? // And/Or based on FP_SABER_OFFENSE level? So number of attacks you can chain // increases with your FP_SABER_OFFENSE skill? @@ -1037,7 +1042,7 @@ qboolean PM_SaberKataDone( int curmove = LS_NONE, int newmove = LS_NONE ) } } } - else + else {//FIXME: have chainAngle influence fast and medium chains as well? if ( pm->ps->saberAnimLevel == FORCE_LEVEL_2 && pm->ps->saberAttackChainCount > Q_irand( 2, 5 ) ) { @@ -1067,10 +1072,10 @@ qboolean PM_CheckEnemyInBack( float backCheckDist ) if ( trace.fraction < 1.0f && trace.entityNum < ENTITYNUM_WORLD ) { gentity_t *traceEnt = &g_entities[trace.entityNum]; - if ( traceEnt - && traceEnt->health > 0 - && traceEnt->client - && traceEnt->client->playerTeam == pm->gent->client->enemyTeam + if ( traceEnt + && traceEnt->health > 0 + && traceEnt->client + && traceEnt->client->playerTeam == pm->gent->client->enemyTeam && traceEnt->client->ps.groundEntityNum != ENTITYNUM_NONE ) { if ( !pm->ps->clientNum ) @@ -1160,8 +1165,8 @@ int PM_AttackForEnemyPos( qboolean allowFB ) if ( dot > 0 ) {//enemy is in front if ( (!pm->ps->clientNum || PM_ControlledByPlayer()) - && dot > 0.65f - && pm->gent->enemy->client && PM_InKnockDownOnGround( &pm->gent->enemy->client->ps ) + && dot > 0.65f + && pm->gent->enemy->client && PM_InKnockDownOnGround( &pm->gent->enemy->client->ps ) && enemyDir[2] <= 20 ) {//guy is on the ground below me, do a top-down attack return LS_A_T2B; @@ -1181,7 +1186,7 @@ int PM_AttackForEnemyPos( qboolean allowFB ) } } } - //this is the default only if they're *right* in front... + //this is the default only if they're *right* in front... if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) || ((!pm->ps->clientNum||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) ) { if ( (pm->ps->saberAnimLevel == FORCE_LEVEL_2 || pm->ps->saberAnimLevel == FORCE_LEVEL_5)//using medium attacks or Tavion @@ -1192,10 +1197,10 @@ int PM_AttackForEnemyPos( qboolean allowFB ) && ( pm->ps->clientNum || pm->ps->legsAnim == BOTH_JUMP1 || pm->ps->legsAnim == BOTH_FORCEJUMP1 || pm->ps->legsAnim == BOTH_INAIR1 || pm->ps->legsAnim == BOTH_FORCEINAIR1 )//either an NPC or in a non-flip forward jump && ( (pm->ps->clientNum&&!PM_ControlledByPlayer()&&!Q_irand(0,2)) || pm->cmd.upmove || (pm->ps->pm_flags&PMF_JUMPING) ) )//jumping {//flip over-forward down-attack - if ( (!pm->ps->clientNum||PM_ControlledByPlayer()) || + if ( (!pm->ps->clientNum||PM_ControlledByPlayer()) || (pm->gent->NPC && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) && !Q_irand(0, 2) ) ) {//only player or acrobat or boss and higher can do this - if ( pm->gent->enemy->health > 0 + if ( pm->gent->enemy->health > 0 && pm->gent->enemy->maxs[2] > 12 && (!pm->gent->enemy->client || !PM_InKnockDownOnGround( &pm->gent->enemy->client->ps ) ) && DistanceSquared( pm->gent->currentOrigin, enemy_org ) < 10000 @@ -1208,7 +1213,7 @@ int PM_AttackForEnemyPos( qboolean allowFB ) } if ( pm->ps->clientNum && !PM_ControlledByPlayer()) {//NPC - if ( pm->gent->NPC + if ( pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && ( pm->gent->NPC->rank == RANK_LT_JG || Q_irand( 0, pm->gent->NPC->rank ) >= RANK_ENSIGN ) //&& !PM_InKnockDown( pm->ps ) @@ -1224,7 +1229,7 @@ int PM_AttackForEnemyPos( qboolean allowFB ) } else {//player - if ( pm->ps->saberAnimLevel == FORCE_LEVEL_1 + if ( pm->ps->saberAnimLevel == FORCE_LEVEL_1 //&& !PM_InKnockDown( pm->ps ) && (pm->ps->pm_flags&PMF_DUCKED||pm->cmd.upmove<0) ) {//ducking player @@ -1281,7 +1286,7 @@ int PM_AttackForEnemyPos( qboolean allowFB ) //if ( !PM_InKnockDown( pm->ps ) ) if ( !pm->gent->enemy->client || pm->gent->enemy->client->ps.groundEntityNum != ENTITYNUM_NONE ) { - if ( dot < -0.75f + if ( dot < -0.75f && enemyDist < 128 && (pm->ps->saberAnimLevel == FORCE_LEVEL_1 || (pm->gent->client &&pm->gent->client->NPC_class == CLASS_TAVION&&Q_irand(0,2))) ) {//fast back-stab @@ -1350,7 +1355,7 @@ int PM_SaberJumpAttackMove( void ) int PM_SaberFlipOverAttackMove( void ) { //FIXME: check above for room enough to jump! - //FIXME: while in this jump, keep velocity[2] at a minimum until the end of the anim + //FIXME: while in this jump, keep velocity[2] at a minimum until the end of the anim vec3_t fwdAngles, jumpFwd; VectorCopy( pm->ps->viewangles, fwdAngles ); @@ -1460,11 +1465,11 @@ int PM_SaberAttackForMovement( int forwardmove, int rightmove, int move ) && ( pm->ps->clientNum || pm->ps->legsAnim == BOTH_JUMP1 || pm->ps->legsAnim == BOTH_FORCEJUMP1 || pm->ps->legsAnim == BOTH_INAIR1 || pm->ps->legsAnim == BOTH_FORCEINAIR1 )//either an NPC or in a non-flip forward jump && ((pm->ps->clientNum&&!PM_ControlledByPlayer()&&!Q_irand(0,2))||pm->cmd.upmove>0||pm->ps->pm_flags&PMF_JUMPING))//jumping {//flip over-forward down-attack - if ( (!pm->ps->clientNum||PM_ControlledByPlayer()) || + if ( (!pm->ps->clientNum||PM_ControlledByPlayer()) || (pm->gent->NPC && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) && !Q_irand(0, 2) ) ) {//only player or acrobat or boss and higher can do this vec3_t fwdAngles = {0,pm->ps->viewangles[YAW],0}; - if ( pm->gent->enemy->health > 0 + if ( pm->gent->enemy->health > 0 && pm->gent->enemy->maxs[2] > 12 && (!pm->gent->enemy->client || !PM_InKnockDownOnGround( &pm->gent->enemy->client->ps ) ) && DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ) < 10000 @@ -1483,10 +1488,10 @@ int PM_SaberAttackForMovement( int forwardmove, int rightmove, int move ) && (pm->cmd.upmove < 0 || pm->ps->pm_flags&PMF_DUCKED) && (pm->ps->legsAnim == BOTH_STAND2||pm->ps->legsAnim == BOTH_SABERFAST_STANCE||pm->ps->legsAnim == BOTH_SABERSLOW_STANCE||level.time-pm->ps->lastStationary<=500) ) {//not moving (or just started), ducked and using fast attacks - if ( (!pm->ps->clientNum||PM_ControlledByPlayer()) || - ( pm->gent - && pm->gent->NPC - && pm->gent->NPC->rank >= RANK_LT_JG + if ( (!pm->ps->clientNum||PM_ControlledByPlayer()) || + ( pm->gent + && pm->gent->NPC + && pm->gent->NPC->rank >= RANK_LT_JG && ( pm->gent->NPC->rank == RANK_LT_JG || Q_irand( 0, pm->gent->NPC->rank ) >= RANK_ENSIGN ) && !Q_irand( 0, 3-g_spskill->integer ) ) ) {//only player or fencer and higher can do this @@ -1504,89 +1509,91 @@ int PM_SaberAttackForMovement( int forwardmove, int rightmove, int move ) //&& (pm->ps->legsAnim == BOTH_STAND2||pm->ps->legsAnim == BOTH_SABERFAST_STANCE||pm->ps->legsAnim == BOTH_SABERSLOW_STANCE||level.time-pm->ps->lastStationary<=500)//standing or just started moving && (pm->cmd.upmove||pm->ps->pm_flags&PMF_JUMPING))//jumping {//strong attack: jump-hack - if ( //!pm->ps->clientNum || + if ( //!pm->ps->clientNum || (pm->gent && pm->gent->NPC && !PM_ControlledByPlayer() && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) ) {//only player or acrobat or boss and higher can do this return PM_SaberJumpAttackMove(); } } } - + return LS_A_T2B; } else if ( forwardmove < 0 ) {//backward= T2B slash//B2T uppercut? if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) || ((!pm->ps->clientNum||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) ) { - //if ( !PM_InKnockDown( pm->ps ) ) - { - if ( pm->gent && pm->gent->enemy ) - {//FIXME: or just trace for a valid enemy standing behind me? And no enemy in front? - vec3_t enemyDir, faceFwd, facingAngles = {0, pm->ps->viewangles[YAW], 0}; - AngleVectors( facingAngles, faceFwd, NULL, NULL ); - VectorSubtract( pm->gent->enemy->currentOrigin, pm->ps->origin, enemyDir ); - float dot = DotProduct( enemyDir, faceFwd ); - if ( dot < 0 ) - {//enemy is behind me - if ( dot < -0.75f - && DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ) < 16384//128 squared - && (pm->ps->saberAnimLevel == FORCE_LEVEL_1 || (pm->gent->client &&pm->gent->client->NPC_class == CLASS_TAVION&&Q_irand(0,1))) ) - {//fast attacks and Tavion - if ( !(pm->ps->pm_flags&PMF_DUCKED) && pm->cmd.upmove >= 0 ) - {//can't do it while ducked? - if ( (!pm->ps->clientNum||PM_ControlledByPlayer()) || (pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG) ) - {//only fencers and above can do this - return LS_A_BACKSTAB; - } + if ( pm->gent && pm->gent->enemy ) + {//FIXME: or just trace for a valid enemy standing behind me? And no enemy in front? + vec3_t enemyDir, faceFwd, facingAngles = {0, pm->ps->viewangles[YAW], 0}; + AngleVectors( facingAngles, faceFwd, NULL, NULL ); + VectorSubtract( pm->gent->enemy->currentOrigin, pm->ps->origin, enemyDir ); + float dot = DotProduct( enemyDir, faceFwd ); + if ( dot < 0 ) + {//enemy is behind me + if ( dot < -0.75f + && DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ) < 16384//128 squared + && (pm->ps->saberAnimLevel == FORCE_LEVEL_1 || (pm->gent->client &&pm->gent->client->NPC_class == CLASS_TAVION&&Q_irand(0,1))) ) + {//fast attacks and Tavion + if ( !(pm->ps->pm_flags&PMF_DUCKED) && pm->cmd.upmove >= 0 ) + {//can't do it while ducked? + if ( (!pm->ps->clientNum||PM_ControlledByPlayer()) || (pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG) ) + {//only fencers and above can do this + return LS_A_BACKSTAB; } } - else if ( pm->ps->saberAnimLevel > FORCE_LEVEL_1 ) - {//medium and higher attacks - if ( (pm->ps->pm_flags&PMF_DUCKED) || pm->cmd.upmove < 0 ) - { - return LS_A_BACK_CR; - } - else - { - return LS_A_BACK; - } + } + else if ( pm->ps->saberAnimLevel > FORCE_LEVEL_1 ) + {//medium and higher attacks + if ( (pm->ps->pm_flags&PMF_DUCKED) || pm->cmd.upmove < 0 ) + { + return LS_A_BACK_CR; + } + else + { + return LS_A_BACK; } } - else - {//enemy in front - float enemyDistSq = DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ); - if ( (pm->ps->saberAnimLevel == FORCE_LEVEL_1||pm->gent->client->NPC_class==CLASS_TAVION||(pm->gent->client->NPC_class==CLASS_DESANN&&!Q_irand(0,3))) && enemyDistSq > 16384 || pm->gent->enemy->health <= 0 )//128 squared - {//my enemy is pretty far in front of me and I'm using fast attacks - if ( (!pm->ps->clientNum||PM_ControlledByPlayer()) || - ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) ) - {//only fencers and higher can do this, higher rank does it more - if ( PM_CheckEnemyInBack( 128 ) ) - { - return PM_PickBackStab(); - } + } + else + {//enemy in front + float enemyDistSq = DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ); + if ( (pm->ps->saberAnimLevel == FORCE_LEVEL_1 + || pm->gent->client->NPC_class == CLASS_TAVION + || (pm->gent->client->NPC_class == CLASS_DESANN && !Q_irand( 0, 3 ))) + && (enemyDistSq > 16384 || pm->gent->enemy->health <= 0) )//128 squared + {//my enemy is pretty far in front of me and I'm using fast attacks + if ( (!pm->ps->clientNum||PM_ControlledByPlayer()) || + ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) ) + {//only fencers and higher can do this, higher rank does it more + if ( PM_CheckEnemyInBack( 128 ) ) + { + return PM_PickBackStab(); } } - else if ( (pm->ps->saberAnimLevel >= FORCE_LEVEL_2 || pm->gent->client->NPC_class == CLASS_DESANN) && enemyDistSq > 40000 || pm->gent->enemy->health <= 0 )//200 squared - {//enemy is very faw away and I'm using medium/strong attacks - if ( (!pm->ps->clientNum||PM_ControlledByPlayer()) || - ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) ) - {//only fencers and higher can do this, higher rank does it more - if ( PM_CheckEnemyInBack( 164 ) ) - { - return PM_PickBackStab(); - } + } + else if ( (pm->ps->saberAnimLevel >= FORCE_LEVEL_2 + || pm->gent->client->NPC_class == CLASS_DESANN) + && (enemyDistSq > 40000 || pm->gent->enemy->health <= 0) )//200 squared + {//enemy is very faw away and I'm using medium/strong attacks + if ( (!pm->ps->clientNum||PM_ControlledByPlayer()) || + ( pm->gent && pm->gent->client && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, pm->gent->NPC->rank ) > RANK_ENSIGN ) ) + {//only fencers and higher can do this, higher rank does it more + if ( PM_CheckEnemyInBack( 164 ) ) + { + return PM_PickBackStab(); } } } } - else - {//no current enemy - if ( (!pm->ps->clientNum||PM_ControlledByPlayer()) && pm->gent && pm->gent->client ) - {//only player - if ( PM_CheckEnemyInBack( 128 ) ) - { - return PM_PickBackStab(); - } + } + else + {//no current enemy + if ( (!pm->ps->clientNum||PM_ControlledByPlayer()) && pm->gent && pm->gent->client ) + {//only player + if ( PM_CheckEnemyInBack( 128 ) ) + { + return PM_PickBackStab(); } } } @@ -2057,8 +2064,8 @@ void PM_SetLegsAnimTimer( gentity_t *ent, int *legsAnimTimer, int time ) {//Not waiting for top Q3_TaskIDComplete( ent, TID_ANIM_LOWER ); } - else - {//Waiting for both to finish before complete + else + {//Waiting for both to finish before complete Q3_TaskIDClear( &ent->taskID[TID_ANIM_LOWER] );//Bottom is done, regardless if ( !Q3_TaskIDPending( ent, TID_ANIM_UPPER) ) {//top is done and we're done @@ -2089,8 +2096,8 @@ void PM_SetTorsoAnimTimer( gentity_t *ent, int *torsoAnimTimer, int time ) {//Not waiting for bottom Q3_TaskIDComplete( ent, TID_ANIM_UPPER ); } - else - {//Waiting for both to finish before complete + else + {//Waiting for both to finish before complete Q3_TaskIDClear( &ent->taskID[TID_ANIM_UPPER] );//Top is done, regardless if ( !Q3_TaskIDPending( ent, TID_ANIM_LOWER) ) {//lower is done and we're done @@ -2122,11 +2129,11 @@ void PM_SaberStartTransAnim( int saberAnimLevel, int anim, float *animSpeed, gen return; } } - if ( ( anim >= BOTH_T1_BR__R && + if ( ( anim >= BOTH_T1_BR__R && anim <= BOTH_T1_BL_TL ) || - ( anim >= BOTH_T3_BR__R && + ( anim >= BOTH_T3_BR__R && anim <= BOTH_T3_BL_TL ) || - ( anim >= BOTH_T5_BR__R && + ( anim >= BOTH_T5_BR__R && anim <= BOTH_T5_BL_TL ) ) { if ( saberAnimLevel == FORCE_LEVEL_1 || saberAnimLevel == FORCE_LEVEL_5 ) @@ -2143,11 +2150,11 @@ void PM_SaberStartTransAnim( int saberAnimLevel, int anim, float *animSpeed, gen void PM_SaberStartTransAnim( int anim, int entNum, int saberOffenseLevel, float *animSpeed ) { //check starts - if ( ( anim >= BOTH_S1_S1_T_ && + if ( ( anim >= BOTH_S1_S1_T_ && anim <= BOTH_S1_S1_TR ) || - ( anim >= BOTH_S1_S1_T_ && + ( anim >= BOTH_S1_S1_T_ && anim <= BOTH_S1_S1_TR ) || - ( anim >= BOTH_S3_S1_T_ && + ( anim >= BOTH_S3_S1_T_ && anim <= BOTH_S3_S1_TR ) ) { if ( entNum == 0 ) @@ -2164,11 +2171,11 @@ void PM_SaberStartTransAnim( int anim, int entNum, int saberOffenseLevel, float {//spins stay normal speed return; } - else if ( ( anim >= BOTH_T1_BR__R && + else if ( ( anim >= BOTH_T1_BR__R && anim <= BOTH_T1_BL_TL ) || - ( anim >= BOTH_T2_BR__R && + ( anim >= BOTH_T2_BR__R && anim <= BOTH_T2_BL_TL ) || - ( anim >= BOTH_T3_BR__R && + ( anim >= BOTH_T3_BR__R && anim <= BOTH_T3_BL_TL ) ) {//slow down the transitions if ( entNum == 0 && saberOffenseLevel <= FORCE_LEVEL_2 ) @@ -2244,7 +2251,7 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, { // or if a more important anim is running if( !(setAnimFlags & SETANIM_FLAG_OVERRIDE) && ((*torsoAnimTimer > 0)||(*torsoAnimTimer == -1)) ) - { + { goto setAnimLegs; } @@ -2287,8 +2294,8 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, if ( gent->lowerLumbarBone != -1 )//gent->upperLumbarBone { int startFrame, endFrame; - - if ( cg_debugAnim.integer == 3 || (!gent->s.number && cg_debugAnim.integer == 1) || (gent->s.number && cg_debugAnim.integer == 2) ) + + if ( cg_debugAnim.integer == 3 || (!gent->s.number && cg_debugAnim.integer == 1) || (gent->s.number && cg_debugAnim.integer == 2) ) { Com_Printf("Time=%d: %s TORSO anim %d %s\n", actualTime, gent->targetname, anim, animTable[anim].name ); } @@ -2298,7 +2305,7 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, // don't bother if the animation is missing if (!animations[anim].numFrames) { - // remove it if we already have an animation on this bone + // remove it if we already have an animation on this bone if (gi.G2API_GetAnimRange(&gent->ghoul2[gent->playerModel], "lower_lumbar", &startFrame, &endFrame))//"upper_lumbar" { #if G2_DEBUG_TIMING @@ -2331,13 +2338,13 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, //qboolean animatingLegs = gi.G2API_GetAnimRange(&gent->ghoul2[gent->playerModel], "model_root", &startFrame, &endFrame); float currentFrame, legAnimSpeed, firstFrame, lastFrame; int flags; - qboolean animatingLegs = gi.G2API_GetBoneAnimIndex(&gent->ghoul2[gent->playerModel], - gent->rootBone, actualTime, ¤tFrame, + qboolean animatingLegs = gi.G2API_GetBoneAnimIndex(&gent->ghoul2[gent->playerModel], + gent->rootBone, actualTime, ¤tFrame, &startFrame, &endFrame, &flags, &legAnimSpeed, NULL ); - if ( g_synchSplitAnims->integer - && !(setAnimFlags & SETANIM_FLAG_RESTART) - && animatingLegs - && (animations[anim].firstFrame == startFrame) + if ( g_synchSplitAnims->integer + && !(setAnimFlags & SETANIM_FLAG_RESTART) + && animatingLegs + && (animations[anim].firstFrame == startFrame) && (legAnimSpeed == animSpeed )//|| oldAnimSpeed != animSpeed) && (((animations[anim].numFrames ) + animations[anim].firstFrame) == endFrame)) {//if we're playing this *exact* anim (speed check should fix problems with anims that play other anims backwards) on the legs already andwe're not restarting the anim, then match the legs' frame @@ -2359,7 +2366,7 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, currentFrame, blendTime); #endif - if ( oldAnimSpeed != animSpeed + if ( oldAnimSpeed != animSpeed && ((oldAnimSpeed>0&&animSpeed>0) || (oldAnimSpeed<0&&animSpeed<0)) ) {//match the new speed, actually legAnimSpeed = animSpeed; @@ -2375,12 +2382,12 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, lastFrame = (animations[anim].numFrames ) + animations[anim].firstFrame; } gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->lowerLumbarBone, //gent->upperLumbarBone - firstFrame, lastFrame, animFlags, legAnimSpeed, + firstFrame, lastFrame, animFlags, legAnimSpeed, actualTime, currentFrame, blendTime); if ( gent->motionBone != -1 ) { - gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->motionBone, - firstFrame, lastFrame, animFlags, legAnimSpeed, + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->motionBone, + firstFrame, lastFrame, animFlags, legAnimSpeed, actualTime, currentFrame, blendTime); } } @@ -2416,13 +2423,13 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, blendTime); #endif gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->lowerLumbarBone, //gent->upperLumbarBone - firstFrame, lastFrame, animFlags, + firstFrame, lastFrame, animFlags, animSpeed, actualTime, -1, blendTime); if ( gent->motionBone != -1 ) { gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->motionBone, - firstFrame, lastFrame, animFlags, + firstFrame, lastFrame, animFlags, animSpeed, actualTime, -1, blendTime); } } @@ -2439,12 +2446,12 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, -1); #endif gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->lowerLumbarBone, //gent->upperLumbarBone - firstFrame, lastFrame, animFlags&~BONE_ANIM_BLEND, + firstFrame, lastFrame, animFlags&~BONE_ANIM_BLEND, animSpeed, cg.time, -1, -1); if ( gent->motionBone != -1 ) { gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->motionBone, - firstFrame, lastFrame, animFlags&~BONE_ANIM_BLEND, + firstFrame, lastFrame, animFlags&~BONE_ANIM_BLEND, animSpeed, cg.time, -1, -1); } } @@ -2466,7 +2473,7 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, else if ( setAnimFlags & SETANIM_FLAG_HOLDLESS ) { // Make sure to only wait in full 1/20 sec server frame intervals. int dur; - + dur = (animations[anim].numFrames -1) * fabs((double)animations[anim].frameLerp); //dur = ((int)(dur/50.0)) * 50; //dur -= blendTime; @@ -2492,7 +2499,7 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, { // or if a more important anim is running if( !(setAnimFlags & SETANIM_FLAG_OVERRIDE) && ((*legsAnimTimer > 0)||(*legsAnimTimer == -1)) ) - { + { goto setAnimDone; } @@ -2534,7 +2541,7 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, { int startFrame, endFrame; - if ( cg_debugAnim.integer == 3 || (!gent->s.number && cg_debugAnim.integer == 1) || (gent->s.number && cg_debugAnim.integer == 2) ) + if ( cg_debugAnim.integer == 3 || (!gent->s.number && cg_debugAnim.integer == 1) || (gent->s.number && cg_debugAnim.integer == 2) ) { Com_Printf("Time=%d: %s LEGS anim %d %s\n", actualTime, gent->targetname, anim, animTable[anim].name ); } @@ -2551,11 +2558,11 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, animFlags |= BONE_ANIM_BLEND; } //HACKHACKHACK - + // don't bother if the animation is missing if (!animations[anim].numFrames) { - // remove it if we already have an animation on this bone + // remove it if we already have an animation on this bone if (gi.G2API_GetAnimRange(&gent->ghoul2[gent->playerModel], "model_root", &startFrame, &endFrame)) { #if G2_DEBUG_TIMING @@ -2583,11 +2590,11 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, float currentFrame, torsoAnimSpeed; int flags; qboolean animatingTorso = gi.G2API_GetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->lowerLumbarBone,actualTime, ¤tFrame, &startFrame, &endFrame, &flags, &torsoAnimSpeed, NULL); - if ( g_synchSplitAnims->integer - && !(setAnimFlags & SETANIM_FLAG_RESTART) + if ( g_synchSplitAnims->integer + && !(setAnimFlags & SETANIM_FLAG_RESTART) && animatingTorso && (torsoAnimSpeed == animSpeed)//|| oldAnimSpeed != animSpeed) - && (animations[anim].firstFrame == startFrame) + && (animations[anim].firstFrame == startFrame) && (((animations[anim].numFrames ) + animations[anim].firstFrame) == endFrame)) {//if we're playing this *exact* anim on the torso already and we're not restarting the anim, then match the torso's frame //try to synch it @@ -2602,7 +2609,7 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, currentFrame, blendTime); #endif - if ( oldAnimSpeed != animSpeed + if ( oldAnimSpeed != animSpeed && ((oldAnimSpeed>0&&animSpeed>0) || (oldAnimSpeed<0&&animSpeed<0)) ) {//match the new speed, actually torsoAnimSpeed = animSpeed; @@ -2618,8 +2625,8 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, lastFrame = (animations[anim].numFrames ) + animations[anim].firstFrame; } - gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->rootBone, - firstFrame, lastFrame, animFlags, torsoAnimSpeed, + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->rootBone, + firstFrame, lastFrame, animFlags, torsoAnimSpeed, actualTime, currentFrame, blendTime ); } else @@ -2628,11 +2635,11 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, //qboolean animatingLegs = gi.G2API_GetAnimRange(&gent->ghoul2[gent->playerModel], "model_root", &startFrame, &endFrame); float currentFrame, legAnimSpeed; int flags; - qboolean animatingLegs = gi.G2API_GetBoneAnimIndex(&gent->ghoul2[gent->playerModel], - gent->rootBone, actualTime, ¤tFrame, + qboolean animatingLegs = gi.G2API_GetBoneAnimIndex(&gent->ghoul2[gent->playerModel], + gent->rootBone, actualTime, ¤tFrame, &startFrame, &endFrame, &flags, &legAnimSpeed, NULL ); // lets see if a) we are already animating and b) we aren't going to do the same animation again - if (animatingLegs + if (animatingLegs && ( (legAnimSpeed!=animSpeed) || (firstFrame != startFrame) || (lastFrame != endFrame) ) ) { #if G2_DEBUG_TIMING @@ -2644,8 +2651,8 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, -1, blendTime); #endif - gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->rootBone, - firstFrame, lastFrame, animFlags, + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->rootBone, + firstFrame, lastFrame, animFlags, animSpeed, actualTime, -1, blendTime); } else @@ -2660,8 +2667,8 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, -1, -1); #endif - gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->rootBone, - firstFrame, lastFrame, animFlags&~BONE_ANIM_BLEND, + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->rootBone, + firstFrame, lastFrame, animFlags&~BONE_ANIM_BLEND, animSpeed, cg.time, -1, -1); } } @@ -2669,7 +2676,7 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, } /* -#ifdef _DEBUG +#ifdef _DEBUG gi.Printf(S_COLOR_GREEN"SET_ANIM_LOWER: %s (%s)\n", animTable[anim].name, gent->targetname ); #endif */ @@ -2682,7 +2689,7 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, else if ( setAnimFlags & SETANIM_FLAG_HOLDLESS ) { // Make sure to only wait in full 1/20 sec server frame intervals. int dur; - + dur = (animations[anim].numFrames -1) * fabs((double)animations[anim].frameLerp); //dur = ((int)(dur/50.0)) * 50; //dur -= blendTime; @@ -2710,12 +2717,12 @@ void PM_SetAnim(pmove_t *pm,int setAnimParts,int anim,int setAnimFlags, int blen { // FIXME : once torsoAnim and legsAnim are in the same structure for NPC and Players // rename PM_SetAnimFinal to PM_SetAnim and have both NPC and Players call PM_SetAnim - if ( pm->ps->pm_type >= PM_DEAD ) + if ( pm->ps->pm_type >= PM_DEAD ) {//FIXME: sometimes we'll want to set anims when your dead... twitches, impacts, etc. return; } - if ( pm->gent == NULL ) + if ( pm->gent == NULL ) { return; } @@ -2723,7 +2730,7 @@ void PM_SetAnim(pmove_t *pm,int setAnimParts,int anim,int setAnimFlags, int blen if (setAnimFlags&SETANIM_FLAG_OVERRIDE) { // pm->ps->animationTimer = 0; - + if (setAnimParts & SETANIM_TORSO) { if( (setAnimFlags & SETANIM_FLAG_RESTART) || pm->ps->torsoAnim != anim ) @@ -2750,7 +2757,7 @@ PM_TorsoAnimLightsaber */ -// Note that this function is intended to set the animation for the player, but +// Note that this function is intended to set the animation for the player, but // only does idle-ish anims. Anything that has a timer associated, such as attacks and blocks, // are set by PM_WeaponLightsaber() @@ -2773,9 +2780,9 @@ void PM_TorsoAnimLightsaber() return; } - if ( pm->ps->saberActive - && pm->ps->saberLength < 3 - && !(pm->ps->saberEventFlags&SEF_HITWALL) + if ( pm->ps->saberActive + && pm->ps->saberLength < 3 + && !(pm->ps->saberEventFlags&SEF_HITWALL) && pm->ps->weaponstate == WEAPON_RAISING ) { PM_SetSaberMove(LS_DRAW); @@ -2792,7 +2799,7 @@ void PM_TorsoAnimLightsaber() return; } - if ( pm->ps->weaponstate == WEAPON_READY || + if ( pm->ps->weaponstate == WEAPON_READY || pm->ps->weaponstate == WEAPON_CHARGING || pm->ps->weaponstate == WEAPON_CHARGING_ALT ) { @@ -2800,7 +2807,7 @@ void PM_TorsoAnimLightsaber() { if ( PM_JumpingAnim( pm->ps->legsAnim ) || PM_LandingAnim( pm->ps->legsAnim ) - || PM_InCartwheel( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) || PM_FlippingAnim( pm->ps->legsAnim )) { PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); @@ -2853,7 +2860,7 @@ void PM_TorsoAnimLightsaber() { if ( PM_JumpingAnim( pm->ps->legsAnim ) || PM_LandingAnim( pm->ps->legsAnim ) - || PM_InCartwheel( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) || PM_FlippingAnim( pm->ps->legsAnim )) { PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); @@ -2892,7 +2899,7 @@ void PM_TorsoAnimLightsaber() PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_IDLE1,SETANIM_FLAG_NORMAL); pm->ps->saberMove = LS_READY; } - else if( pm->ps->legsAnim == BOTH_STAND1IDLE1 + else if( pm->ps->legsAnim == BOTH_STAND1IDLE1 || pm->ps->legsAnim == BOTH_STAND2IDLE1 || pm->ps->legsAnim == BOTH_STAND2IDLE2 || pm->ps->legsAnim == BOTH_STAND3IDLE1 @@ -2920,7 +2927,7 @@ void PM_TorsoAnimLightsaber() else { // This is now set in SetSaberMove. - // Idle for Lightsaber + // Idle for Lightsaber if ( pm->gent && pm->gent->client ) { // pm->gent->client->saberTrail.inAction = qfalse; @@ -2950,7 +2957,7 @@ void PM_TorsoAnimLightsaber() } else {//saber is on - // Idle for Lightsaber + // Idle for Lightsaber if ( pm->gent && pm->gent->client ) { pm->gent->client->saberTrail.inAction = qfalse; @@ -2966,7 +2973,7 @@ void PM_TorsoAnimLightsaber() { if ( PM_JumpingAnim( pm->ps->legsAnim ) || PM_LandingAnim( pm->ps->legsAnim ) - || PM_InCartwheel( pm->ps->legsAnim ) + || PM_InCartwheel( pm->ps->legsAnim ) || PM_FlippingAnim( pm->ps->legsAnim )) { PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); @@ -3005,7 +3012,7 @@ PM_TorsoAnimation ------------------------- */ -void PM_TorsoAnimation( void ) +void PM_TorsoAnimation( void ) {//FIXME: Write a much smarter and more appropriate anim picking routine logic... // int oldAnim; if ( PM_InKnockDown( pm->ps ) || PM_InRoll( pm->ps )) @@ -3065,7 +3072,7 @@ void PM_TorsoAnimation( void ) return; } qboolean saberInAir = qtrue; - + if ( PM_SaberInBrokenParry( pm->ps->saberMove ) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim( pm->ps->torsoAnim ) ) {//we're stuck in a broken parry PM_TorsoAnimLightsaber(); @@ -3151,8 +3158,8 @@ void PM_TorsoAnimation( void ) weaponBusy = qtrue; } - if ( pm->ps->weapon == WP_NONE || - pm->ps->weaponstate == WEAPON_READY || + if ( pm->ps->weapon == WP_NONE || + pm->ps->weaponstate == WEAPON_READY || pm->ps->weaponstate == WEAPON_CHARGING || pm->ps->weaponstate == WEAPON_CHARGING_ALT ) { @@ -3197,7 +3204,7 @@ void PM_TorsoAnimation( void ) { int legsAnim = pm->ps->legsAnim; /* - if ( PM_RollingAnim( legsAnim ) || + if ( PM_RollingAnim( legsAnim ) || PM_FlippingAnim( legsAnim ) || PM_JumpingAnim( legsAnim ) || PM_PainAnim( legsAnim ) || @@ -3216,9 +3223,9 @@ void PM_TorsoAnimation( void ) PM_SetAnim( pm, SETANIM_TORSO, BOTH_BUTTON_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); }//else still holding, leave it as it is } - else if ( pm->gent != NULL - && pm->gent->s.number == 0 - && pm->ps->weaponstate != WEAPON_CHARGING + else if ( pm->gent != NULL + && pm->gent->s.number == 0 + && pm->ps->weaponstate != WEAPON_CHARGING && pm->ps->weaponstate != WEAPON_CHARGING_ALT ) {//PLayer- temp hack for weapon frame if ( pm->ps->weapon == WP_MELEE ) @@ -3257,8 +3264,8 @@ void PM_TorsoAnimation( void ) { PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); } - else if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) || PM_JumpingAnim( pm->ps->legsAnim ) || PM_SwimmingAnim( pm->ps->legsAnim ) ) {//running w/1-handed weapon uses full-body anim @@ -3274,8 +3281,8 @@ void PM_TorsoAnimation( void ) { PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); } - else if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) || PM_JumpingAnim( pm->ps->legsAnim ) || PM_SwimmingAnim( pm->ps->legsAnim ) ) {//running w/1-handed weapon uses full-body anim @@ -3290,8 +3297,8 @@ void PM_TorsoAnimation( void ) //NOTE: should never get here break; case WP_MELEE: - if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) || PM_JumpingAnim( pm->ps->legsAnim ) || PM_SwimmingAnim( pm->ps->legsAnim ) ) {//running w/1-handed weapon uses full-body anim @@ -3314,11 +3321,11 @@ void PM_TorsoAnimation( void ) //PM_SetAnim(pm,SETANIM_LEGS,BOTH_ATTACK2,SETANIM_FLAG_NORMAL); break; case WP_DISRUPTOR: - if ( (pm->ps->weaponstate != WEAPON_FIRING - && pm->ps->weaponstate != WEAPON_CHARGING + if ( (pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING && pm->ps->weaponstate != WEAPON_CHARGING_ALT) - || PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) || PM_JumpingAnim( pm->ps->legsAnim ) || PM_SwimmingAnim( pm->ps->legsAnim ) ) {//running sniper weapon uses normal ready @@ -3347,11 +3354,11 @@ void PM_TorsoAnimation( void ) PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); break; case WP_THERMAL: - if ( pm->ps->weaponstate != WEAPON_FIRING - && pm->ps->weaponstate != WEAPON_CHARGING + if ( pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING && pm->ps->weaponstate != WEAPON_CHARGING_ALT - && (PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) + && (PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) || PM_JumpingAnim( pm->ps->legsAnim ) || PM_SwimmingAnim( pm->ps->legsAnim )) ) {//running w/1-handed weapon uses full-body anim @@ -3395,8 +3402,8 @@ void PM_TorsoAnimation( void ) break; case WP_TRIP_MINE: case WP_DET_PACK: - if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) || PM_JumpingAnim( pm->ps->legsAnim ) || PM_SwimmingAnim( pm->ps->legsAnim ) ) {//running w/1-handed weapon uses full-body anim @@ -3431,7 +3438,7 @@ void PM_TorsoAnimation( void ) { PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUARD_IDLE1,SETANIM_FLAG_NORMAL); } - else if( pm->ps->legsAnim == BOTH_STAND1IDLE1 + else if( pm->ps->legsAnim == BOTH_STAND1IDLE1 || pm->ps->legsAnim == BOTH_STAND2IDLE1 || pm->ps->legsAnim == BOTH_STAND2IDLE2 || pm->ps->legsAnim == BOTH_STAND3IDLE1 @@ -3475,12 +3482,12 @@ void PM_TorsoAnimation( void ) } else { - if ( !weaponBusy + if ( !weaponBusy && pm->ps->weapon != WP_BOWCASTER && pm->ps->weapon != WP_REPEATER && pm->ps->weapon != WP_FLECHETTE && pm->ps->weapon != WP_ROCKET_LAUNCHER - && ( PM_RunningAnim( pm->ps->legsAnim ) + && ( PM_RunningAnim( pm->ps->legsAnim ) || (PM_WalkingAnim( pm->ps->legsAnim ) && !pm->ps->clientNum) || PM_JumpingAnim( pm->ps->legsAnim ) || PM_SwimmingAnim( pm->ps->legsAnim ) ) ) @@ -3502,8 +3509,8 @@ void PM_TorsoAnimation( void ) { PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); } - else if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) || PM_JumpingAnim( pm->ps->legsAnim ) || PM_SwimmingAnim( pm->ps->legsAnim ) ) {//running w/1-handed weapon uses full-body anim @@ -3519,8 +3526,8 @@ void PM_TorsoAnimation( void ) { PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL); } - else if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) + else if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) || PM_JumpingAnim( pm->ps->legsAnim ) || PM_SwimmingAnim( pm->ps->legsAnim ) ) {//running w/1-handed weapon uses full-body anim @@ -3537,8 +3544,8 @@ void PM_TorsoAnimation( void ) break; case WP_MELEE: - if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) || PM_JumpingAnim( pm->ps->legsAnim ) || PM_SwimmingAnim( pm->ps->legsAnim ) ) {//running w/1-handed weapon uses full-body anim @@ -3569,11 +3576,11 @@ void PM_TorsoAnimation( void ) break; case WP_DISRUPTOR: - if ( (pm->ps->weaponstate != WEAPON_FIRING - && pm->ps->weaponstate != WEAPON_CHARGING + if ( (pm->ps->weaponstate != WEAPON_FIRING + && pm->ps->weaponstate != WEAPON_CHARGING && pm->ps->weaponstate != WEAPON_CHARGING_ALT) - || PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) + || PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) || PM_JumpingAnim( pm->ps->legsAnim ) || PM_SwimmingAnim( pm->ps->legsAnim ) ) {//running sniper weapon uses normal ready @@ -3604,8 +3611,8 @@ void PM_TorsoAnimation( void ) break; case WP_THERMAL: - if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) || PM_JumpingAnim( pm->ps->legsAnim ) || PM_SwimmingAnim( pm->ps->legsAnim ) ) {//running w/1-handed weapon uses full-body anim @@ -3650,8 +3657,8 @@ void PM_TorsoAnimation( void ) break; case WP_TRIP_MINE: case WP_DET_PACK: - if ( PM_RunningAnim( pm->ps->legsAnim ) - || PM_WalkingAnim( pm->ps->legsAnim ) + if ( PM_RunningAnim( pm->ps->legsAnim ) + || PM_WalkingAnim( pm->ps->legsAnim ) || PM_JumpingAnim( pm->ps->legsAnim ) || PM_SwimmingAnim( pm->ps->legsAnim ) ) {//running w/1-handed weapon uses full-body anim @@ -3880,7 +3887,7 @@ qboolean PM_InOnGroundAnim ( playerState_t *ps ) case BOTH_INJURED2: //# Injured pose 2 case BOTH_INJURED3: //# Injured pose 3 case BOTH_INJURED6: //# Injured pose 6 - case BOTH_INJURED6ATTACKSTART: //# Start attack while in injured 6 pose + case BOTH_INJURED6ATTACKSTART: //# Start attack while in injured 6 pose case BOTH_INJURED6ATTACKSTOP: //# End attack while in injured 6 pose case BOTH_INJURED6COMBADGE: //# Hit combadge while in injured 6 pose case BOTH_INJURED6POINT: //# Chang points to door while in injured state @@ -3893,11 +3900,11 @@ qboolean PM_InOnGroundAnim ( playerState_t *ps ) case BOTH_SLEEP2_SHIFT: //# Shift in sleep from SLEEP2 pose return qtrue; break; - case BOTH_KNOCKDOWN1: //# - case BOTH_KNOCKDOWN2: //# - case BOTH_KNOCKDOWN3: //# - case BOTH_KNOCKDOWN4: //# - case BOTH_KNOCKDOWN5: //# + case BOTH_KNOCKDOWN1: //# + case BOTH_KNOCKDOWN2: //# + case BOTH_KNOCKDOWN3: //# + case BOTH_KNOCKDOWN4: //# + case BOTH_KNOCKDOWN5: //# if ( ps->legsAnimTimer < 500 ) {//pretty much horizontal by this point return qtrue; @@ -3961,26 +3968,26 @@ qboolean PM_InDeathAnim ( void ) case BOTH_DEATH5: //# Fifth Death anim case BOTH_DEATH6: //# Sixth Death anim case BOTH_DEATH7: //# Seventh Death anim - case BOTH_DEATH8: //# - case BOTH_DEATH9: //# - case BOTH_DEATH10: //# + case BOTH_DEATH8: //# + case BOTH_DEATH9: //# + case BOTH_DEATH10: //# case BOTH_DEATH11: //# - case BOTH_DEATH12: //# - case BOTH_DEATH13: //# - case BOTH_DEATH14: //# + case BOTH_DEATH12: //# + case BOTH_DEATH13: //# + case BOTH_DEATH14: //# case BOTH_DEATH14_UNGRIP: //# Desann's end death (cin #35) case BOTH_DEATH14_SITUP: //# Tavion sitting up after having been thrown (cin #23) - case BOTH_DEATH15: //# - case BOTH_DEATH16: //# - case BOTH_DEATH17: //# - case BOTH_DEATH18: //# - case BOTH_DEATH19: //# - case BOTH_DEATH20: //# - case BOTH_DEATH21: //# - case BOTH_DEATH22: //# - case BOTH_DEATH23: //# - case BOTH_DEATH24: //# - case BOTH_DEATH25: //# + case BOTH_DEATH15: //# + case BOTH_DEATH16: //# + case BOTH_DEATH17: //# + case BOTH_DEATH18: //# + case BOTH_DEATH19: //# + case BOTH_DEATH20: //# + case BOTH_DEATH21: //# + case BOTH_DEATH22: //# + case BOTH_DEATH23: //# + case BOTH_DEATH24: //# + case BOTH_DEATH25: //# case BOTH_DEATHFORWARD1: //# First Death in which they get thrown forward case BOTH_DEATHFORWARD2: //# Second Death in which they get thrown forward @@ -4002,24 +4009,24 @@ qboolean PM_InDeathAnim ( void ) case BOTH_DEAD5: //# Fifth Death finished pose case BOTH_DEAD6: //# Sixth Death finished pose case BOTH_DEAD7: //# Seventh Death finished pose - case BOTH_DEAD8: //# - case BOTH_DEAD9: //# - case BOTH_DEAD10: //# + case BOTH_DEAD8: //# + case BOTH_DEAD9: //# + case BOTH_DEAD10: //# case BOTH_DEAD11: //# - case BOTH_DEAD12: //# - case BOTH_DEAD13: //# - case BOTH_DEAD14: //# - case BOTH_DEAD15: //# - case BOTH_DEAD16: //# - case BOTH_DEAD17: //# - case BOTH_DEAD18: //# - case BOTH_DEAD19: //# - case BOTH_DEAD20: //# - case BOTH_DEAD21: //# - case BOTH_DEAD22: //# - case BOTH_DEAD23: //# - case BOTH_DEAD24: //# - case BOTH_DEAD25: //# + case BOTH_DEAD12: //# + case BOTH_DEAD13: //# + case BOTH_DEAD14: //# + case BOTH_DEAD15: //# + case BOTH_DEAD16: //# + case BOTH_DEAD17: //# + case BOTH_DEAD18: //# + case BOTH_DEAD19: //# + case BOTH_DEAD20: //# + case BOTH_DEAD21: //# + case BOTH_DEAD22: //# + case BOTH_DEAD23: //# + case BOTH_DEAD24: //# + case BOTH_DEAD25: //# case BOTH_DEADFORWARD1: //# First thrown forward death finished pose case BOTH_DEADFORWARD2: //# Second thrown forward death finished pose case BOTH_DEADBACKWARD1: //# First thrown backward death finished pose @@ -4032,7 +4039,7 @@ qboolean PM_InDeathAnim ( void ) case BOTH_DEADFLOP2: //# React to being shot from Second Death finished pose case BOTH_DEADFLOP3: //# React to being shot from Third Death finished pose case BOTH_DEADFLOP4: //# React to being shot from Fourth Death finished pose - case BOTH_DEADFLOP5: //# React to being shot from Fifth Death finished pose + case BOTH_DEADFLOP5: //# React to being shot from Fifth Death finished pose case BOTH_DEADFORWARD1_FLOP: //# React to being shot First thrown forward death finished pose case BOTH_DEADFORWARD2_FLOP: //# React to being shot Second thrown forward death finished pose case BOTH_DEADBACKWARD1_FLOP: //# React to being shot First thrown backward death finished pose diff --git a/codeJK2/game/bg_pmove.cpp b/codeJK2/game/bg_pmove.cpp index f54aa19b05..63a7548e29 100644 --- a/codeJK2/game/bg_pmove.cpp +++ b/codeJK2/game/bg_pmove.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // bg_pmove.c -- both games player movement code // takes a playerstate and a usercmd as input and returns a modifed playerstate @@ -26,8 +31,8 @@ This file is part of Jedi Knight 2. #include "../../code/qcommon/q_shared.h" #include "b_local.h" #include "g_shared.h" -#include "bg_local.h" -#include "g_local.h" +#include "bg_local.h" +#include "g_local.h" #include "g_functions.h" #include "anims.h" #include "../cgame/cg_local.h" // yeah I know this is naughty, but we're shipping soon... @@ -146,7 +151,7 @@ PM_AddEvent =============== */ -void PM_AddEvent( int newEvent ) +void PM_AddEvent( int newEvent ) { AddEventToPlayerstate( newEvent, 0, pm->ps ); } @@ -230,16 +235,16 @@ void PM_ClipVelocity( vec3_t in, vec3_t normal, vec3_t out, float overbounce ) { float backoff; float change; int i; - + backoff = DotProduct (in, normal); - + if ( backoff < 0 ) { backoff *= overbounce; } else { backoff /= overbounce; } - for ( i=0 ; i<3 ; i++ ) + for ( i=0 ; i<3 ; i++ ) { change = normal[i]*backoff; out[i] = in[i] - change; @@ -259,9 +264,9 @@ static void PM_Friction( void ) { float *vel; float speed, newspeed, control; float drop, friction = pm->ps->friction; - + vel = pm->ps->velocity; - + VectorCopy( vel, vec ); if ( pml.walking ) { vec[2] = 0; // ignore slope movement @@ -280,17 +285,17 @@ static void PM_Friction( void ) { // apply ground friction, even if on ladder if ( Flying != FLY_NORMAL ) { - if ( (pm->watertype & CONTENTS_LADDER) || pm->waterlevel <= 1 ) + if ( (pm->watertype & CONTENTS_LADDER) || pm->waterlevel <= 1 ) { - if ( (pm->watertype & CONTENTS_LADDER) || (pml.walking && !(pml.groundTrace.surfaceFlags & SURF_SLICK)) ) + if ( (pm->watertype & CONTENTS_LADDER) || (pml.walking && !(pml.groundTrace.surfaceFlags & SURF_SLICK)) ) { - // if getting knocked back, no friction - if ( !(pm->ps->pm_flags & PMF_TIME_KNOCKBACK) && !(pm->ps->pm_flags & PMF_TIME_NOFRICTION) ) + // if getting knocked back, no friction + if ( !(pm->ps->pm_flags & PMF_TIME_KNOCKBACK) && !(pm->ps->pm_flags & PMF_TIME_NOFRICTION) ) { //If the use key is pressed. slow the player more quickly if ( pm->cmd.buttons & BUTTON_USE ) friction *= pm_frictionModifier; - + control = speed < pm_stopspeed ? pm_stopspeed : speed; drop += control*friction*pml.frametime; } @@ -300,7 +305,7 @@ static void PM_Friction( void ) { if ( Flying == FLY_VEHICLE ) { - if ( !(pm->ps->pm_flags & PMF_TIME_KNOCKBACK) && !(pm->ps->pm_flags & PMF_TIME_NOFRICTION) ) + if ( !(pm->ps->pm_flags & PMF_TIME_KNOCKBACK) && !(pm->ps->pm_flags & PMF_TIME_NOFRICTION) ) { control = speed < pm_stopspeed ? pm_stopspeed : speed; drop += control*friction*pml.frametime; @@ -315,9 +320,9 @@ static void PM_Friction( void ) { drop += speed*pm_waterfriction*pm->waterlevel*pml.frametime; } } - + // apply flying friction - if ( pm->ps->pm_type == PM_SPECTATOR ) + if ( pm->ps->pm_type == PM_SPECTATOR ) { drop += speed*pm_flightfriction*pml.frametime; } @@ -343,7 +348,7 @@ Handles user intended acceleration ============== */ -static void PM_Accelerate( vec3_t wishdir, float wishspeed, float accel ) +static void PM_Accelerate( vec3_t wishdir, float wishspeed, float accel ) { int i; float addspeed, accelspeed, currentspeed; @@ -351,7 +356,7 @@ static void PM_Accelerate( vec3_t wishdir, float wishspeed, float accel ) currentspeed = DotProduct (pm->ps->velocity, wishdir); addspeed = wishspeed - currentspeed; - + if (addspeed <= 0) { return; } @@ -361,7 +366,7 @@ static void PM_Accelerate( vec3_t wishdir, float wishspeed, float accel ) accelspeed = addspeed; } for (i=0 ; i<3 ; i++) { - pm->ps->velocity[i] += accelspeed * wishdir[i]; + pm->ps->velocity[i] += accelspeed * wishdir[i]; } } @@ -374,14 +379,14 @@ This allows the clients to use axial -127 to 127 values for all directions without getting a sqrt(2) distortion in speed. ============ */ -static float PM_CmdScale( usercmd_t *cmd ) +static float PM_CmdScale( usercmd_t *cmd ) { int max; float total; float scale; max = abs( cmd->forwardmove ); - + if ( abs( cmd->rightmove ) > max ) { max = abs( cmd->rightmove ); } @@ -391,10 +396,10 @@ static float PM_CmdScale( usercmd_t *cmd ) if ( !max ) { return 0; } - total = sqrt((double)( ( cmd->forwardmove * cmd->forwardmove ) - + ( cmd->rightmove * cmd->rightmove ) + total = sqrt((double)( ( cmd->forwardmove * cmd->forwardmove ) + + ( cmd->rightmove * cmd->rightmove ) + ( cmd->upmove * cmd->upmove ) )); - + scale = (float) pm->ps->speed * max / ( 127.0f * total ); return scale; @@ -436,7 +441,7 @@ static void PM_SetMovementDir( void ) { pm->ps->movementDir = 1; } else if ( pm->ps->movementDir == 6 ) { pm->ps->movementDir = 7; - } + } } } @@ -490,8 +495,8 @@ qboolean PM_ForceJumpingUp( gentity_t *gent ) if ( gent->NPC ) {//this is ONLY for the player - if ( player - && player->client + if ( player + && player->client && player->client->ps.viewEntity == gent->s.number ) {//okay to jump if an NPC controlled by the player } @@ -515,7 +520,7 @@ qboolean PM_ForceJumpingUp( gentity_t *gent ) { return qfalse; } - + if ( !gent->s.number && in_camera ) {//player can't use force powers in cinematic return qfalse; @@ -538,22 +543,22 @@ qboolean PM_ForceJumpingUp( gentity_t *gent ) static void PM_JumpForDir( void ) { int anim = BOTH_JUMP1; - if ( pm->cmd.forwardmove > 0 ) + if ( pm->cmd.forwardmove > 0 ) { anim = BOTH_JUMP1; pm->ps->pm_flags &= ~PMF_BACKWARDS_JUMP; - } + } else if ( pm->cmd.forwardmove < 0 ) { anim = BOTH_JUMPBACK1; pm->ps->pm_flags |= PMF_BACKWARDS_JUMP; } - else if ( pm->cmd.rightmove > 0 ) + else if ( pm->cmd.rightmove > 0 ) { anim = BOTH_JUMPRIGHT1; pm->ps->pm_flags &= ~PMF_BACKWARDS_JUMP; } - else if ( pm->cmd.rightmove < 0 ) + else if ( pm->cmd.rightmove < 0 ) { anim = BOTH_JUMPLEFT1; pm->ps->pm_flags &= ~PMF_BACKWARDS_JUMP; @@ -573,18 +578,18 @@ extern void WP_ForcePowerDrain( gentity_t *self, forcePowers_t forcePower, int o qboolean PM_GentCantJump( gentity_t *gent ) {//FIXME: ugh, hacky, set a flag on NPC or something, please... - if ( gent && gent->client && - ( gent->client->NPC_class == CLASS_ATST || - gent->client->NPC_class == CLASS_GONK || - gent->client->NPC_class == CLASS_MARK1 || - gent->client->NPC_class == CLASS_MARK2 || - gent->client->NPC_class == CLASS_MOUSE || - gent->client->NPC_class == CLASS_PROBE || - gent->client->NPC_class == CLASS_PROTOCOL || - gent->client->NPC_class == CLASS_R2D2 || - gent->client->NPC_class == CLASS_R5D2 || - gent->client->NPC_class == CLASS_SEEKER || - gent->client->NPC_class == CLASS_REMOTE || + if ( gent && gent->client && + ( gent->client->NPC_class == CLASS_ATST || + gent->client->NPC_class == CLASS_GONK || + gent->client->NPC_class == CLASS_MARK1 || + gent->client->NPC_class == CLASS_MARK2 || + gent->client->NPC_class == CLASS_MOUSE || + gent->client->NPC_class == CLASS_PROBE || + gent->client->NPC_class == CLASS_PROTOCOL || + gent->client->NPC_class == CLASS_R2D2 || + gent->client->NPC_class == CLASS_R5D2 || + gent->client->NPC_class == CLASS_SEEKER || + gent->client->NPC_class == CLASS_REMOTE || gent->client->NPC_class == CLASS_SENTRY ) ) { return qtrue; @@ -592,21 +597,21 @@ qboolean PM_GentCantJump( gentity_t *gent ) return qfalse; } -static qboolean PM_CheckJump( void ) +static qboolean PM_CheckJump( void ) { //Don't allow jump until all buttons are up if ( pm->ps->pm_flags & PMF_RESPAWNED ) { - return qfalse; + return qfalse; } - if ( PM_InKnockDown( pm->ps ) || PM_InRoll( pm->ps ) ) + if ( PM_InKnockDown( pm->ps ) || PM_InRoll( pm->ps ) ) {//in knockdown - return qfalse; + return qfalse; } if ( PM_GentCantJump( pm->gent ) ) { - return qfalse; + return qfalse; } /* if ( pm->cmd.buttons & BUTTON_FORCEJUMP ) @@ -616,7 +621,7 @@ static qboolean PM_CheckJump( void ) */ #if METROID_JUMP - if ( pm->waterlevel < 3 )//|| (pm->ps->waterHeightLevel==WHL_SHOULDERS&&pm->cmd.upmove>0) ) + if ( pm->waterlevel < 3 )//|| (pm->ps->waterHeightLevel==WHL_SHOULDERS&&pm->cmd.upmove>0) ) { if ( pm->ps->gravity > 0 ) {//can't do this in zero-G @@ -632,7 +637,7 @@ static qboolean PM_CheckJump( void ) float curHeight = pm->ps->origin[2] - pm->ps->forceJumpZStart; //check for max force jump level and cap off & cut z vel if ( ( curHeight<=forceJumpHeight[0] ||//still below minimum jump height - (pm->ps->forcePower&&pm->cmd.upmove>=10) ) &&////still have force power available and still trying to jump up + (pm->ps->forcePower&&pm->cmd.upmove>=10) ) &&////still have force power available and still trying to jump up curHeight < forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]] )//still below maximum jump height {//can still go up //FIXME: after a certain amount of time of held jump, play force jump sound and flip if a dir is being held @@ -655,7 +660,7 @@ static qboolean PM_CheckJump( void ) pm->ps->legsAnim != BOTH_FLIP_F && pm->ps->legsAnim != BOTH_FLIP_B && pm->ps->legsAnim != BOTH_FLIP_R && - pm->ps->legsAnim != BOTH_FLIP_L + pm->ps->legsAnim != BOTH_FLIP_L && cg.renderingThirdPerson//third person only && !cg.zoomMode )//not zoomed in {//FIXME: this could end up playing twice if the jump is very long... @@ -801,7 +806,7 @@ static qboolean PM_CheckJump( void ) } // must wait for jump to be released - if ( pm->ps->pm_flags & PMF_JUMP_HELD ) + if ( pm->ps->pm_flags & PMF_JUMP_HELD ) { // clear upmove so cmdscale doesn't lower running speed pm->cmd.upmove = 0; @@ -851,15 +856,15 @@ static qboolean PM_CheckJump( void ) { PM_AddEvent( EV_JUMP ); } - + return qtrue; }//else no surf close enough to push off of } - else if ( pm->cmd.upmove > 0 && pm->waterlevel < 2 - && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0 + else if ( pm->cmd.upmove > 0 && pm->waterlevel < 2 + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0 && !(pm->ps->pm_flags&PMF_JUMP_HELD) //&& !PM_InKnockDown( pm->ps ) - && pm->gent && WP_ForcePowerAvailable( pm->gent, FP_LEVITATION, 0 ) + && pm->gent && WP_ForcePowerAvailable( pm->gent, FP_LEVITATION, 0 ) && ((pm->ps->clientNum&&!PM_ControlledByPlayer())||((!pm->ps->clientNum||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) )) )// yes this locked weapons check also includes force powers, if we need a separate check later I'll make one { if ( pm->gent->NPC && pm->gent->NPC->rank != RANK_CREWMAN && pm->gent->NPC->rank <= RANK_LT_JG ) @@ -904,7 +909,7 @@ static qboolean PM_CheckJump( void ) anim = BOTH_WALL_FLIP_BACK1; } } - else if ( pm->cmd.forwardmove < 0 && !(pm->cmd.buttons&BUTTON_ATTACK) )//pm->ps->clientNum && + else if ( pm->cmd.forwardmove < 0 && !(pm->cmd.buttons&BUTTON_ATTACK) )//pm->ps->clientNum && {//double-tap back-jump does backflip if ( pm->ps->velocity[2] >= 0 ) {//must be going up already @@ -930,7 +935,7 @@ static qboolean PM_CheckJump( void ) anim = BOTH_BUTTERFLY_RIGHT; } } - else + else */if ( pm->ps->clientNum && !PM_ControlledByPlayer() )//NOTE: pretty much useless, so player never does these {//jump-spin FIXME: does direction matter? vertPush = forceJumpStrength[FORCE_LEVEL_2]/1.5f; @@ -1037,7 +1042,7 @@ static qboolean PM_CheckJump( void ) } } gentity_t *traceEnt = &g_entities[trace.entityNum]; - + if ( !doTrace || (trace.fraction < 1.0f&&((trace.entityNums.solid!=SOLID_BMODEL)||DotProduct(trace.plane.normal,idealNormal)>0.7)) ) {//there is a wall there if ( (anim != BOTH_WALL_RUN_LEFT && anim != BOTH_WALL_RUN_RIGHT) || trace.plane.normal[2] == 0.0f ) @@ -1053,9 +1058,9 @@ static qboolean PM_CheckJump( void ) pm->ps->velocity[0] = pm->ps->velocity[1] = 0; VectorMA( pm->ps->velocity, -150, right, pm->ps->velocity ); } - else if ( anim == BOTH_FLIP_BACK1 - || anim == BOTH_FLIP_BACK2 - || anim == BOTH_FLIP_BACK3 + else if ( anim == BOTH_FLIP_BACK1 + || anim == BOTH_FLIP_BACK2 + || anim == BOTH_FLIP_BACK3 || anim == BOTH_WALL_FLIP_BACK1 ) { pm->ps->velocity[0] = pm->ps->velocity[1] = 0; @@ -1124,7 +1129,7 @@ static qboolean PM_CheckJump( void ) } } } - else + else {//in the air int legsAnim = pm->ps->legsAnim; if ( legsAnim == BOTH_WALL_RUN_LEFT || legsAnim == BOTH_WALL_RUN_RIGHT ) @@ -1193,8 +1198,8 @@ static qboolean PM_CheckJump( void ) } } /* - else if ( pm->cmd.forwardmove < 0 - && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 + else if ( pm->cmd.forwardmove < 0 + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 && !(pm->ps->pm_flags&PMF_JUMP_HELD) //not holding jump && (level.time - pm->ps->lastOnGround) <= 500 //just jumped )//&& !(pm->cmd.buttons&BUTTON_ATTACK) ) @@ -1219,7 +1224,7 @@ static qboolean PM_CheckJump( void ) } */ else if ( pm->cmd.forwardmove > 0 //pushing forward - && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 && (level.time - pm->ps->lastOnGround) <= 500 //just jumped && (pm->ps->legsAnim == BOTH_JUMP1 || pm->ps->legsAnim == BOTH_INAIR1 ) )//not in a flip or spin or anything {//run up wall, flip backwards @@ -1237,7 +1242,7 @@ static qboolean PM_CheckJump( void ) VectorSubtract( pm->ps->origin, traceto, idealNormal ); VectorNormalize( idealNormal ); gentity_t *traceEnt = &g_entities[trace.entityNum]; - + if ( trace.fraction < 1.0f&&((trace.entityNums.solid!=SOLID_BMODEL)||DotProduct(trace.plane.normal,idealNormal)>0.7) ) {//there is a wall there pm->ps->velocity[0] = pm->ps->velocity[1] = 0; @@ -1266,7 +1271,7 @@ static qboolean PM_CheckJump( void ) } if ( pm->gent - && pm->cmd.upmove > 0 + && pm->cmd.upmove > 0 && pm->ps->weapon == WP_SABER && (pm->ps->weaponTime > 0||pm->cmd.buttons&BUTTON_ATTACK) && ((pm->ps->clientNum&&!PM_ControlledByPlayer())||((!pm->ps->clientNum||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode)) ) @@ -1292,11 +1297,11 @@ static qboolean PM_CheckJump( void ) && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one && (pm->ps->groundEntityNum != ENTITYNUM_NONE||level.time-pm->ps->lastOnGround<=500) )//on ground or just jumped {//flip over-forward down-attack - if ( ((!pm->ps->clientNum||PM_ControlledByPlayer())&&pm->cmd.forwardmove >= 0&&!pm->cmd.rightmove) || + if ( ((!pm->ps->clientNum||PM_ControlledByPlayer())&&pm->cmd.forwardmove >= 0&&!pm->cmd.rightmove) || (pm->gent->NPC && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) ) {//only player or acrobat or boss and higher can do this vec3_t fwdAngles = {0,pm->ps->viewangles[YAW],0}; - if ( pm->gent->enemy->health > 0 + if ( pm->gent->enemy->health > 0 && pm->gent->enemy->maxs[2] > 12 && (!pm->gent->enemy->client || !PM_InKnockDownOnGround( &pm->gent->enemy->client->ps ) ) && DistanceSquared( pm->gent->currentOrigin, pm->gent->enemy->currentOrigin ) < 10000 @@ -1313,12 +1318,12 @@ static qboolean PM_CheckJump( void ) && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //can force jump && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one && ( pm->ps->legsAnim == BOTH_STAND2 - || pm->ps->legsAnim == BOTH_SABERFAST_STANCE + || pm->ps->legsAnim == BOTH_SABERFAST_STANCE || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE || level.time-pm->ps->lastStationary <= 500 )//standing or just started moving && (pm->ps->groundEntityNum != ENTITYNUM_NONE||(pm->ps->clientNum&&!PM_ControlledByPlayer()&&level.time-pm->ps->lastOnGround<=500)))//on ground or just jumped if non-player {//strong attack: jump-hack - if ( (!pm->ps->clientNum||PM_ControlledByPlayer()) || + if ( (!pm->ps->clientNum||PM_ControlledByPlayer()) || (pm->gent && pm->gent->NPC && (pm->gent->NPC->rank==RANK_CREWMAN||pm->gent->NPC->rank>=RANK_LT) ) ) {//only player or acrobat or boss and higher can do this PM_SetSaberMove( PM_SaberJumpAttackMove() ); @@ -1421,7 +1426,7 @@ static qboolean PM_CheckWaterJump( void ) { if ( !(cont & CONTENTS_SOLID) ) { return qfalse; } - + spot[2] += 16; cont = pm->pointcontents( spot, pm->ps->clientNum ); if ( cont&(CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_WATER|CONTENTS_SLIME|CONTENTS_LAVA|CONTENTS_BODY) ) { @@ -1448,14 +1453,14 @@ PM_WaterJumpMove Flying out of the water =================== */ -static void PM_WaterJumpMove( void ) +static void PM_WaterJumpMove( void ) { // waterjump has no control, but falls PM_StepSlideMove( 1 ); pm->ps->velocity[2] -= pm->ps->gravity * pml.frametime; - if (pm->ps->velocity[2] < 0) + if (pm->ps->velocity[2] < 0) { // cancel as soon as we are falling down again pm->ps->pm_flags &= ~PMF_ALL_TIMES; @@ -1570,7 +1575,7 @@ static void PM_WaterMove( void ) { if ( pml.groundPlane && DotProduct( pm->ps->velocity, pml.groundTrace.plane.normal ) < 0 ) { vel = VectorLength(pm->ps->velocity); // slide along the ground plane - PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal, + PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal, pm->ps->velocity, OVERCLIP ); VectorNormalize(pm->ps->velocity); @@ -1587,7 +1592,7 @@ PM_FlyVehicleMove =================== */ -static void PM_FlyVehicleMove( void ) +static void PM_FlyVehicleMove( void ) { int i; vec3_t wishvel; @@ -1616,15 +1621,15 @@ static void PM_FlyVehicleMove( void ) // // user intentions // - if ( !scale ) + if ( !scale ) { wishvel[0] = 0; wishvel[1] = 0; wishvel[2] = 0; - } + } else { - for (i=0 ; i<3 ; i++) + for (i=0 ; i<3 ; i++) { wishvel[i] = scale * pml.forward[i]*pm->cmd.forwardmove + scale * pml.right[i]*pm->cmd.rightmove; } @@ -1647,7 +1652,7 @@ PM_FlyMove Only with the flight powerup =================== */ -static void PM_FlyMove( void ) +static void PM_FlyMove( void ) { int i; vec3_t wishvel; @@ -1677,15 +1682,15 @@ static void PM_FlyMove( void ) // // user intentions // - if ( !scale ) + if ( !scale ) { wishvel[0] = 0; wishvel[1] = 0; wishvel[2] = 0; - } + } else { - for (i=0 ; i<3 ; i++) + for (i=0 ; i<3 ; i++) { wishvel[i] = scale * pml.forward[i]*pm->cmd.forwardmove + scale * pml.right[i]*pm->cmd.rightmove; } @@ -1711,7 +1716,7 @@ qboolean PM_GroundSlideOkay( float zNormal ) if ( pm->ps->velocity[2] > 0 ) { if ( pm->ps->legsAnim == BOTH_WALL_RUN_RIGHT - || pm->ps->legsAnim == BOTH_WALL_RUN_LEFT + || pm->ps->legsAnim == BOTH_WALL_RUN_LEFT || pm->ps->legsAnim == BOTH_WALL_RUN_RIGHT_STOP || pm->ps->legsAnim == BOTH_WALL_RUN_LEFT_STOP ) { @@ -1733,7 +1738,7 @@ static void PM_AirMove( void ) { float fmove, smove; vec3_t wishdir; float wishspeed; - float scale; + //float scale; usercmd_t cmd; float gravMod = 1.0f; @@ -1747,7 +1752,7 @@ static void PM_AirMove( void ) { smove = pm->cmd.rightmove; cmd = pm->cmd; - scale = PM_CmdScale( &cmd ); + PM_CmdScale( &cmd ); // set the movementDir so clients can rotate the legs for strafing PM_SetMovementDir(); @@ -1794,18 +1799,18 @@ static void PM_AirMove( void ) { // we may have a ground plane that is very steep, even // though we don't have a groundentity // slide along the steep plane - if ( pml.groundPlane ) + if ( pml.groundPlane ) { if ( PM_GroundSlideOkay( pml.groundTrace.plane.normal[2] ) ) { - PM_ClipVelocity( pm->ps->velocity, pml.groundTrace.plane.normal, + PM_ClipVelocity( pm->ps->velocity, pml.groundTrace.plane.normal, pm->ps->velocity, OVERCLIP ); } } if ( !pm->ps->clientNum - && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0 - && pm->ps->forceJumpZStart + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0 + && pm->ps->forceJumpZStart && pm->ps->velocity[2] > 0 ) {//I am force jumping and I'm not holding the button anymore float curHeight = pm->ps->origin[2] - pm->ps->forceJumpZStart + (pm->ps->velocity[2]*pml.frametime); @@ -1816,7 +1821,7 @@ static void PM_AirMove( void ) { /* //put on a cvar? float stepCrouchAdd = STEPSIZE+(DEFAULT_MAXS_2-CROUCH_MAXS_2); - Com_Printf( S_COLOR_RED"capping force jump height %4.2f > %4.2f (%4.2f/%4.2f)\n", + Com_Printf( S_COLOR_RED"capping force jump height %4.2f > %4.2f (%4.2f/%4.2f)\n", curHeight, maxJumpHeight, forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]], forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]]+stepCrouchAdd ); @@ -1835,7 +1840,7 @@ static void PM_AirMove( void ) { } } */ - + PM_StepSlideMove( gravMod ); } @@ -1953,9 +1958,9 @@ static void PM_WalkMove( void ) { } // clamp the speed lower if ducking - if ( pm->ps->pm_flags & PMF_DUCKED && !PM_InKnockDown( pm->ps ) ) + if ( pm->ps->pm_flags & PMF_DUCKED && !PM_InKnockDown( pm->ps ) ) { - if ( wishspeed > pm->ps->speed * pm_duckScale ) + if ( wishspeed > pm->ps->speed * pm_duckScale ) { wishspeed = pm->ps->speed * pm_duckScale; } @@ -2004,7 +2009,7 @@ static void PM_WalkMove( void ) { vel = VectorLength(pm->ps->velocity); // slide along the ground plane - PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal, + PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal, pm->ps->velocity, OVERCLIP ); // don't decrease velocity when going up or down a slope @@ -2133,7 +2138,7 @@ static void PM_NoclipMove( void ) { fmove = pm->cmd.forwardmove; smove = pm->cmd.rightmove; - + for (i=0 ; i<3 ; i++) wishvel[i] = pml.forward[i]*fmove + pml.right[i]*smove; wishvel[2] += pm->cmd.upmove; @@ -2194,7 +2199,7 @@ static float PM_DamageForDelta( int delta ) return damage/2; } -static void PM_CrashLandDamage( int damage ) +static void PM_CrashLandDamage( int damage ) { if ( pm->gent ) { @@ -2234,7 +2239,7 @@ static float PM_CrashLandDelta( vec3_t org, vec3_t prevOrg, vec3_t prev_vel, flo c = -dist; den = b * b - 4 * a * c; - if ( den < 0 ) + if ( den < 0 ) { return 0; } @@ -2244,16 +2249,16 @@ static float PM_CrashLandDelta( vec3_t org, vec3_t prevOrg, vec3_t prev_vel, flo delta = delta*delta * 0.0001; // never take falling damage if completely underwater - if ( waterlevel == 3 ) + if ( waterlevel == 3 ) { return 0; } // reduce falling damage if there is standing water - if ( waterlevel == 2 ) + if ( waterlevel == 2 ) { delta *= 0.25; } - if ( waterlevel == 1 ) + if ( waterlevel == 1 ) { delta *= 0.5; } @@ -2266,18 +2271,18 @@ static float PM_CrashLandDelta( vec3_t prev_vel, int waterlevel ) { float delta; - if ( pm->waterlevel == 3 ) + if ( pm->waterlevel == 3 ) { return 0; } delta = fabs(prev_vel[2])/10;//VectorLength( prev_vel ) // reduce falling damage if there is standing water - if ( pm->waterlevel == 2 ) + if ( pm->waterlevel == 2 ) { delta *= 0.25; } - if ( pm->waterlevel == 1 ) + if ( pm->waterlevel == 1 ) { delta *= 0.5; } @@ -2349,7 +2354,7 @@ int PM_GetLandingAnim( void ) } //NOTE: falls through on purpose! default: - if ( pm->ps->pm_flags & PMF_BACKWARDS_JUMP ) + if ( pm->ps->pm_flags & PMF_BACKWARDS_JUMP ) { anim = BOTH_LANDBACK1; } @@ -2365,8 +2370,8 @@ int PM_GetLandingAnim( void ) static qboolean PM_TryRoll( void ) { float rollDist = 192;//was 64; - if ( PM_SaberInAttack( pm->ps->saberMove ) || PM_SaberInSpecialAttack( pm->ps->torsoAnim ) - || PM_SpinningSaberAnim( pm->ps->legsAnim ) + if ( PM_SaberInAttack( pm->ps->saberMove ) || PM_SaberInSpecialAttack( pm->ps->torsoAnim ) + || PM_SpinningSaberAnim( pm->ps->legsAnim ) || (!pm->ps->clientNum&&PM_SaberInStart( pm->ps->saberMove )) ) {//attacking or spinning (or, if player, starting an attack) return qfalse; @@ -2394,14 +2399,17 @@ static qboolean PM_TryRoll( void ) return qfalse; } } - vec3_t fwd, right, traceto, mins = {pm->mins[0],pm->mins[1],pm->mins[2]+STEPSIZE}, maxs = {pm->maxs[0],pm->maxs[1],pm->gent->client->crouchheight}, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; + vec3_t fwd, right, traceto, + mins = { pm->mins[0], pm->mins[1], pm->mins[2] + STEPSIZE }, + maxs = { pm->maxs[0], pm->maxs[1], (float)pm->gent->client->crouchheight }, + fwdAngles = { 0, pm->ps->viewangles[YAW], 0 }; trace_t trace; int anim = -1; AngleVectors( fwdAngles, fwd, right, NULL ); //FIXME: trace ahead for clearance to roll if ( pm->cmd.forwardmove ) { - if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) + if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) { anim = BOTH_ROLL_B; VectorMA( pm->ps->origin, -rollDist, fwd, traceto ); @@ -2474,7 +2482,7 @@ static qboolean PM_TryRoll( void ) roll = qtrue; } } - else + else {//check other conditions gentity_t *traceEnt = &g_entities[trace.entityNum]; if ( traceEnt && (traceEnt->svFlags&SVF_GLASS_BRUSH) ) @@ -2503,7 +2511,7 @@ PM_CrashLand Check for hard landings that generate sound events ================= */ -static void PM_CrashLand( void ) +static void PM_CrashLand( void ) { float delta = 0; qboolean forceLanding = qfalse; @@ -2558,7 +2566,7 @@ static void PM_CrashLand( void ) // FIXME: if duck just as you land, roll and take half damage - if ( (pm->ps->pm_flags&PMF_DUCKED) && (level.time-pm->ps->lastOnGround)>500 ) + if ( (pm->ps->pm_flags&PMF_DUCKED) && (level.time-pm->ps->lastOnGround)>500 ) {//must be crouched and have been inthe air for half a second minimum if( !PM_InOnGroundAnim( pm->ps ) && !PM_InKnockDown( pm->ps ) ) {//roll! @@ -2570,7 +2578,7 @@ static void PM_CrashLand( void ) } - if ( delta < 1 ) + if ( delta < 1 ) { return; } @@ -2580,8 +2588,8 @@ static void PM_CrashLand( void ) { if ( pm->cmd.upmove >= 0 && !PM_InKnockDown( pm->ps ) && !PM_InRoll( pm->ps )) {//not crouching - if ( delta > 10 - || pm->ps->pm_flags & PMF_BACKWARDS_JUMP + if ( delta > 10 + || pm->ps->pm_flags & PMF_BACKWARDS_JUMP || (pm->ps->forcePowersActive&(1<ps->gravity = 1.0; //PM_CrashLandDamage( delta ); if ( pm->gent ) - { + { if ((!(pml.groundTrace.surfaceFlags & SURF_NODAMAGE)) && -// (!(pml.groundTrace.contents & CONTENTS_NODROP)) && +// (!(pml.groundTrace.contents & CONTENTS_NODROP)) && (!(pm->pointcontents(pm->ps->origin,pm->ps->clientNum) & CONTENTS_NODROP))) { if ( pm->waterlevel < 2 ) @@ -2639,19 +2647,19 @@ static void PM_CrashLand( void ) return; } - if ( delta >= 75 ) + if ( delta >= 75 ) { if ( !deadFallSound ) { PM_AddEvent( EV_FALL_FAR ); } - if ( !(pml.groundTrace.surfaceFlags & SURF_NODAMAGE) ) + if ( !(pml.groundTrace.surfaceFlags & SURF_NODAMAGE) ) { PM_CrashLandDamage( delta ); } if ( pm->gent ) { - if ( pm->gent->s.number == 0 ) + if ( pm->gent->s.number == 0 ) { vec3_t bottom; @@ -2667,11 +2675,11 @@ static void PM_CrashLand( void ) AddSoundEvent( pm->gent->enemy, pm->ps->origin, 256, AEL_DISCOVERED ); } } - } - else if ( delta >= 50 ) + } + else if ( delta >= 50 ) { // this is a pain grunt, so don't play it if dead - if ( pm->ps->stats[STAT_HEALTH] > 0 ) + if ( pm->ps->stats[STAT_HEALTH] > 0 ) { if ( !deadFallSound ) { @@ -2679,11 +2687,11 @@ static void PM_CrashLand( void ) } if ( pm->gent ) { - if ( !(pml.groundTrace.surfaceFlags & SURF_NODAMAGE) ) + if ( !(pml.groundTrace.surfaceFlags & SURF_NODAMAGE) ) { PM_CrashLandDamage( delta ); } - if ( pm->gent->s.number == 0 ) + if ( pm->gent->s.number == 0 ) { vec3_t bottom; @@ -2696,8 +2704,8 @@ static void PM_CrashLand( void ) } } } - } - else if ( delta >= 30 ) + } + else if ( delta >= 30 ) { if ( !deadFallSound ) { @@ -2705,7 +2713,7 @@ static void PM_CrashLand( void ) } if ( pm->gent ) { - if ( pm->gent->s.number == 0 ) + if ( pm->gent->s.number == 0 ) { vec3_t bottom; @@ -2718,14 +2726,14 @@ static void PM_CrashLand( void ) } else { - if ( !(pml.groundTrace.surfaceFlags & SURF_NODAMAGE) ) + if ( !(pml.groundTrace.surfaceFlags & SURF_NODAMAGE) ) { PM_CrashLandDamage( delta ); } } } - } - else + } + else { if ( !deadFallSound ) { @@ -2860,27 +2868,27 @@ static void PM_GroundTraceMissed( void ) { { if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) { - if ( pm->ps->stats[STAT_HEALTH] > 0 - && !(pm->gent->NPC->aiFlags&NPCAI_DIE_ON_IMPACT) + if ( pm->ps->stats[STAT_HEALTH] > 0 + && !(pm->gent->NPC->aiFlags&NPCAI_DIE_ON_IMPACT) && !(pm->gent->NPC->scriptFlags&SCF_NO_FALLTODEATH) ) { if ( (level.time - pm->gent->client->respawnTime > 2000)//been in the world for at least 2 seconds && (!pm->gent->NPC->timeOfDeath || level.time - pm->gent->NPC->timeOfDeath < 1000) && pm->gent->e_ThinkFunc != thinkF_NPC_RemoveBody //Have to do this now because timeOfDeath is used by thinkF_NPC_RemoveBody to debounce removal checks && !(pm->gent->client->ps.forcePowersActive&(1<gent ) + if ( !FlyingCreature( pm->gent ) && g_gravity->value > 0 ) { - if ( !(pm->gent->flags&FL_UNDYING) + if ( !(pm->gent->flags&FL_UNDYING) && !(pm->gent->flags&FL_GODMODE) ) { - if ( !(pm->ps->eFlags&EF_FORCE_GRIPPED) + if ( !(pm->ps->eFlags&EF_FORCE_GRIPPED) && !(pm->ps->pm_flags&PMF_TRIGGER_PUSHED) ) { if ( !pm->ps->forceJumpZStart || pm->ps->forceJumpZStart > pm->ps->origin[2] )// && fabs(pm->ps->velocity[0])<10 && fabs(pm->ps->velocity[1])<10 && pm->ps->velocity[2]<0)//either not force-jumping or force-jumped and now fell below original jump start height { - /*if ( pm->ps->legsAnim = BOTH_FALLDEATH1 - && pm->ps->legsAnim != BOTH_DEATH1 + /*if ( pm->ps->legsAnim = BOTH_FALLDEATH1 + && pm->ps->legsAnim != BOTH_DEATH1 && PM_HasAnimation( pm->gent, BOTH_FALLDEATH1 )*/ //New method: predict impact, 400 ahead vec3_t vel; @@ -2969,7 +2977,7 @@ static void PM_GroundTraceMissed( void ) { } } } - + /* vec3_t start; //okay, kind of expensive temp hack here, but let's check to see if we should scream @@ -3006,21 +3014,21 @@ static void PM_GroundTraceMissed( void ) { || pm->ps->legsAnim == BOTH_WALL_RUN_RIGHT_FLIP || pm->ps->legsAnim == BOTH_WALL_RUN_LEFT_FLIP || pm->ps->legsAnim == BOTH_WALL_FLIP_RIGHT - || pm->ps->legsAnim == BOTH_WALL_FLIP_LEFT + || pm->ps->legsAnim == BOTH_WALL_FLIP_LEFT || pm->ps->legsAnim == BOTH_CEILING_DROP ) && !pm->ps->legsAnimTimer ) {//if flip anim is done, okay to use inair PM_SetAnim( pm, SETANIM_LEGS, BOTH_FORCEINAIR1, SETANIM_FLAG_OVERRIDE, 350 ); // Only blend over 100ms } - else if ( !PM_InRoll( pm->ps ) + else if ( !PM_InRoll( pm->ps ) && !PM_SpinningAnim( pm->ps->legsAnim ) && !PM_FlippingAnim( pm->ps->legsAnim ) && !PM_InSpecialJump( pm->ps->legsAnim ) ) { - if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) { // we just transitioned into freefall - if ( pm->debugLevel ) + if ( pm->debugLevel ) { Com_Printf("%i:lift\n", c_pmove); } @@ -3031,7 +3039,7 @@ static void PM_GroundTraceMissed( void ) { point[2] -= 64; pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask, G2_NOCOLLIDE, 0); - if ( trace.fraction == 1.0 ) + if ( trace.fraction == 1.0 ) {//FIXME: if velocity[2] < 0 and didn't jump, use some falling anim if ( pm->ps->velocity[2] <= 0 && !(pm->ps->pm_flags&PMF_JUMP_HELD)) { @@ -3083,15 +3091,15 @@ static void PM_GroundTraceMissed( void ) { } else if ( !(pm->ps->forcePowersActive&(1<cmd.forwardmove >= 0 ) + if ( pm->cmd.forwardmove >= 0 ) { if(!PM_InDeathAnim()) { PM_SetAnim(pm,SETANIM_LEGS,BOTH_JUMP1,SETANIM_FLAG_OVERRIDE, 100); // Only blend over 100ms } pm->ps->pm_flags &= ~PMF_BACKWARDS_JUMP; - } - else if ( pm->cmd.forwardmove < 0 ) + } + else if ( pm->cmd.forwardmove < 0 ) { if(!PM_InDeathAnim()) { @@ -3170,7 +3178,7 @@ static void PM_GroundTrace( void ) { } // if the trace didn't hit anything, we are in free fall - if ( trace.fraction == 1.0 || g_gravity->value <= 0 ) + if ( trace.fraction == 1.0 || g_gravity->value <= 0 ) { PM_GroundTraceMissed(); pml.groundPlane = qfalse; @@ -3207,7 +3215,7 @@ static void PM_GroundTrace( void ) { pml.walking = qfalse; return; } - + // slopes that are too steep will not be considered onground if ( trace.plane.normal[2] < MIN_WALK_NORMAL ) { if ( pm->debugLevel ) { @@ -3237,7 +3245,7 @@ static void PM_GroundTrace( void ) { if ( pm->debugLevel ) { Com_Printf("%i:Land\n", c_pmove); } - + //if ( !PM_ClientImpact( trace.entityNum, qtrue ) ) { PM_CrashLand(); @@ -3273,7 +3281,7 @@ static void PM_GroundTrace( void ) { PM_SetWaterLevelAtPoint FIXME: avoid this twice? certainly if not moving ============= */ -static void PM_SetWaterLevelAtPoint( vec3_t org, int *waterlevel, int *watertype ) +static void PM_SetWaterLevelAtPoint( vec3_t org, int *waterlevel, int *watertype ) { vec3_t point; int cont; @@ -3288,10 +3296,10 @@ static void PM_SetWaterLevelAtPoint( vec3_t org, int *waterlevel, int *watertype point[0] = org[0]; point[1] = org[1]; - point[2] = org[2] + DEFAULT_MINS_2 + 1; + point[2] = org[2] + DEFAULT_MINS_2 + 1; cont = pm->pointcontents( point, pm->ps->clientNum ); - if ( cont & (MASK_WATER|CONTENTS_LADDER) ) + if ( cont & (MASK_WATER|CONTENTS_LADDER) ) { sample2 = pm->ps->viewheight - DEFAULT_MINS_2; sample1 = sample2 / 2; @@ -3300,7 +3308,7 @@ static void PM_SetWaterLevelAtPoint( vec3_t org, int *waterlevel, int *watertype *waterlevel = 1; point[2] = org[2] + DEFAULT_MINS_2 + sample1; cont = pm->pointcontents( point, pm->ps->clientNum ); - if ( cont & (MASK_WATER|CONTENTS_LADDER) ) + if ( cont & (MASK_WATER|CONTENTS_LADDER) ) { *waterlevel = 2; point[2] = org[2] + DEFAULT_MINS_2 + sample2; @@ -3365,7 +3373,7 @@ void PM_SetWaterHeight( void ) {//at least 8 above origin pm->ps->waterHeightLevel = WHL_TORSO; } - else + else { float distFromOrg = pm->ps->origin[2]-pm->ps->waterheight; if ( distFromOrg < 6 ) @@ -3380,7 +3388,7 @@ void PM_SetWaterHeight( void ) { pm->ps->waterHeightLevel = WHL_NONE; } - else + else { pm->ps->waterHeightLevel = WHL_ANKLES; } @@ -3779,7 +3787,7 @@ qboolean PM_GettingUpFromKnockDown( float standheight, float crouchheight ) int legsAnim = pm->ps->legsAnim; if ( legsAnim == BOTH_KNOCKDOWN1 ||legsAnim == BOTH_KNOCKDOWN2 - ||legsAnim == BOTH_KNOCKDOWN3 + ||legsAnim == BOTH_KNOCKDOWN3 ||legsAnim == BOTH_KNOCKDOWN4 ||legsAnim == BOTH_KNOCKDOWN5 ) {//in a knockdown @@ -3864,7 +3872,7 @@ qboolean PM_GettingUpFromKnockDown( float standheight, float crouchheight ) //Com_Printf( "getupanim = %s\n", animTable[anim].name ); if ( forceGetUp ) { - if ( pm->gent && pm->gent->client && pm->gent->client->playerTeam == TEAM_ENEMY + if ( pm->gent && pm->gent->client && pm->gent->client->playerTeam == TEAM_ENEMY && pm->gent->NPC && pm->gent->NPC->blockedSpeechDebounceTime < level.time && !Q_irand( 0, 1 ) ) { @@ -3977,17 +3985,17 @@ qboolean PM_PainAnim( int anim ) case BOTH_PAIN6: //# Sixth take pain anim - from behind case BOTH_PAIN7: //# Seventh take pain anim - from behind case BOTH_PAIN8: //# Eigth take pain anim - from behind - case BOTH_PAIN9: //# - case BOTH_PAIN10: //# - case BOTH_PAIN11: //# - case BOTH_PAIN12: //# - case BOTH_PAIN13: //# - case BOTH_PAIN14: //# - case BOTH_PAIN15: //# - case BOTH_PAIN16: //# - case BOTH_PAIN17: //# - case BOTH_PAIN18: //# - case BOTH_PAIN19: //# + case BOTH_PAIN9: //# + case BOTH_PAIN10: //# + case BOTH_PAIN11: //# + case BOTH_PAIN12: //# + case BOTH_PAIN13: //# + case BOTH_PAIN14: //# + case BOTH_PAIN15: //# + case BOTH_PAIN16: //# + case BOTH_PAIN17: //# + case BOTH_PAIN18: //# + case BOTH_PAIN19: //# return qtrue; break; } @@ -4125,10 +4133,10 @@ qboolean PM_RunningAnim( int anim ) { switch ( anim ) { - case BOTH_RUN1: - case BOTH_RUN2: - case BOTH_RUNBACK1: - case BOTH_RUNBACK2: + case BOTH_RUN1: + case BOTH_RUN2: + case BOTH_RUNBACK1: + case BOTH_RUNBACK2: case BOTH_WALKTORUN1: //# transition from walk to run case BOTH_RUN1START: //# Start into full run1 case BOTH_RUN1STOP: //# Stop from full run1 @@ -4261,11 +4269,11 @@ void PM_ResetAnkleAngles( void ) } if ( pm->gent->footLBone != -1 ) { - gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footLBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footLBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0 ); } if ( pm->gent->footRBone != -1 ) { - gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footRBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footRBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0 ); } } @@ -4346,17 +4354,17 @@ void PM_FootSlopeTrace( float *pDiff, float *pInterval ) mdxaBone_t boltMatrix; vec3_t G2Angles = {0, pm->gent->client->ps.legsYaw, 0}; //get the feet - gi.G2API_GetBoltMatrix( pm->gent->ghoul2, pm->gent->playerModel, pm->gent->footLBolt, - &boltMatrix, G2Angles, pm->ps->origin, (cg.time?cg.time:level.time), + gi.G2API_GetBoltMatrix( pm->gent->ghoul2, pm->gent->playerModel, pm->gent->footLBolt, + &boltMatrix, G2Angles, pm->ps->origin, (cg.time?cg.time:level.time), NULL, pm->gent->s.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, pm->gent->client->renderInfo.footLPoint ); - - gi.G2API_GetBoltMatrix( pm->gent->ghoul2, pm->gent->playerModel, pm->gent->footRBolt, - &boltMatrix, G2Angles, pm->ps->origin, (cg.time?cg.time:level.time), + + gi.G2API_GetBoltMatrix( pm->gent->ghoul2, pm->gent->playerModel, pm->gent->footRBolt, + &boltMatrix, G2Angles, pm->ps->origin, (cg.time?cg.time:level.time), NULL, pm->gent->s.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, pm->gent->client->renderInfo.footRPoint ); #endif - //NOTE: on AT-STs, rotating the foot moves this point, so it will wiggle... + //NOTE: on AT-STs, rotating the foot moves this point, so it will wiggle... // we have to do this extra work (more G2 transforms) to stop the wiggle... is it worth it? /* if ( pm->gent->client->NPC_class == CLASS_ATST ) @@ -4364,15 +4372,15 @@ void PM_FootSlopeTrace( float *pDiff, float *pInterval ) mdxaBone_t boltMatrix; vec3_t G2Angles = {0, pm->gent->client->ps.legsYaw, 0}; //get the feet - gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footLBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL ); - gi.G2API_GetBoltMatrix( pm->gent->ghoul2, pm->gent->playerModel, pm->gent->footLBolt, - &boltMatrix, G2Angles, pm->ps->origin, (cg.time?cg.time:level.time), + gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footLBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL ); + gi.G2API_GetBoltMatrix( pm->gent->ghoul2, pm->gent->playerModel, pm->gent->footLBolt, + &boltMatrix, G2Angles, pm->ps->origin, (cg.time?cg.time:level.time), NULL, pm->gent->s.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, pm->gent->client->renderInfo.footLPoint ); - - gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footRBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL ); - gi.G2API_GetBoltMatrix( pm->gent->ghoul2, pm->gent->playerModel, pm->gent->footRBolt, - &boltMatrix, G2Angles, pm->ps->origin, (cg.time?cg.time:level.time), + + gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footRBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL ); + gi.G2API_GetBoltMatrix( pm->gent->ghoul2, pm->gent->playerModel, pm->gent->footRBolt, + &boltMatrix, G2Angles, pm->ps->origin, (cg.time?cg.time:level.time), NULL, pm->gent->s.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, pm->gent->client->renderInfo.footRPoint ); } @@ -4419,13 +4427,13 @@ void PM_FootSlopeTrace( float *pDiff, float *pInterval ) {//rotate the ATST's left foot pad to match the slope PM_AnglesForSlope( pm->gent->client->renderInfo.legsYaw, footLSlope, footAngles ); //Hmm... lerp this? - gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footLBone, footAngles, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footLBone, footAngles, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0 ); } if ( !VectorCompare( footRSlope, vec3_origin ) ) {//rotate the ATST's right foot pad to match the slope PM_AnglesForSlope( pm->gent->client->renderInfo.legsYaw, footRSlope, footAngles ); //Hmm... lerp this? - gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footRBone, footAngles, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footRBone, footAngles, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0 ); } } @@ -4507,7 +4515,7 @@ qboolean PM_AdjustStandAnimForSlope( void ) { return qfalse; } - if ( pm->gent->client->NPC_class != CLASS_ATST + if ( pm->gent->client->NPC_class != CLASS_ATST && (!pm->gent||!G_StandardHumanoid( pm->gent->NPC_type )) ) {//only ATST and player does this return qfalse; @@ -4676,7 +4684,7 @@ qboolean PM_AdjustStandAnimForSlope( void ) destAnim = legsAnim; } } - else if ( (legsAnim >= LEGS_RIGHTUP1 && legsAnim <= LEGS_RIGHTUP5) + else if ( (legsAnim >= LEGS_RIGHTUP1 && legsAnim <= LEGS_RIGHTUP5) || (legsAnim >= LEGS_S1_RUP1 && legsAnim <= LEGS_S1_RUP5) || (legsAnim >= LEGS_S3_RUP1 && legsAnim <= LEGS_S3_RUP5) || (legsAnim >= LEGS_S4_RUP1 && legsAnim <= LEGS_S4_RUP5) @@ -4830,7 +4838,7 @@ void PM_SwimFloatAnim( void ) else {//stopping if ( legsAnim == BOTH_SWIMFORWARD ) - {//I was swimming + {//I was swimming if ( !pm->ps->legsAnimTimer ) { PM_SetAnim(pm,SETANIM_LEGS,BOTH_SWIM_IDLE1,SETANIM_FLAG_NORMAL); @@ -4851,7 +4859,7 @@ void PM_SwimFloatAnim( void ) PM_Footsteps =============== */ -static void PM_Footsteps( void ) +static void PM_Footsteps( void ) { float bobmove; int old, oldAnim; @@ -4895,17 +4903,17 @@ static void PM_Footsteps( void ) flipping = qtrue; } - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE - || ( pm->watertype & CONTENTS_LADDER ) - || pm->ps->waterHeightLevel >= WHL_TORSO ) + if ( pm->ps->groundEntityNum == ENTITYNUM_NONE + || ( pm->watertype & CONTENTS_LADDER ) + || pm->ps->waterHeightLevel >= WHL_TORSO ) {//in air or submerged in water or in ladder // airborne leaves position in cycle intact, but doesn't advance - if ( pm->waterlevel > 0 ) + if ( pm->waterlevel > 0 ) { - if ( pm->watertype & CONTENTS_LADDER ) + if ( pm->watertype & CONTENTS_LADDER ) {//FIXME: check for watertype, save waterlevel for whether to play //the get off ladder transition anim! - if ( pm->ps->velocity[2] ) + if ( pm->ps->velocity[2] ) {//going up or down it int anim; if ( pm->ps->velocity[2] > 0 ) @@ -4940,18 +4948,18 @@ static void PM_Footsteps( void ) } return; } - else if ( pm->ps->waterHeightLevel >= WHL_TORSO + else if ( pm->ps->waterHeightLevel >= WHL_TORSO && (!pm->ps->clientNum||pm->ps->weapon==WP_SABER||pm->ps->weapon==WP_NONE||pm->ps->weapon==WP_MELEE) )//pm->waterlevel > 1 ) //in deep water { if ( !PM_ForceJumpingUp( pm->gent ) ) { - if ( pm->ps->groundEntityNum != ENTITYNUM_NONE && (pm->ps->pm_flags&PMF_DUCKED) ) + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE && (pm->ps->pm_flags&PMF_DUCKED) ) { if ( !flipping ) {//you can crouch under water if feet are on ground if ( pm->cmd.forwardmove || pm->cmd.rightmove ) { - if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) + if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) { PM_SetAnim(pm,SETANIM_LEGS,BOTH_CROUCH1WALKBACK,setAnimFlags); } @@ -4975,7 +4983,7 @@ static void PM_Footsteps( void ) pm->ps->bobCycle = (int)( old + bobmove * pml.msec ) & 255; // if we just crossed a cycle boundary, play an apropriate footstep event - if ( ( ( old + 64 ) ^ ( pm->ps->bobCycle + 64 ) ) & 128 ) + if ( ( ( old + 64 ) ^ ( pm->ps->bobCycle + 64 ) ) & 128 ) { PM_AddEvent( EV_SWIM ); } @@ -4983,13 +4991,13 @@ static void PM_Footsteps( void ) } return; } - else + else {//hmm, in water, but not high enough to swim //fall through to walk/run/stand if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) {//unless in the air //NOTE: this is a dupe of the code just below... for when you are not in the water at all - if ( pm->ps->pm_flags & PMF_DUCKED ) + if ( pm->ps->pm_flags & PMF_DUCKED ) { if ( !flipping ) { @@ -5004,9 +5012,9 @@ static void PM_Footsteps( void ) } } } - else + else { - if ( pm->ps->pm_flags & PMF_DUCKED ) + if ( pm->ps->pm_flags & PMF_DUCKED ) { if ( !flipping ) { @@ -5027,7 +5035,7 @@ static void PM_Footsteps( void ) } // if not trying to move - if ( !pm->cmd.forwardmove && !pm->cmd.rightmove ) + if ( !pm->cmd.forwardmove && !pm->cmd.rightmove ) { if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ATST ) { @@ -5036,7 +5044,7 @@ static void PM_Footsteps( void ) PM_SetAnim(pm,SETANIM_LEGS,BOTH_STAND1,SETANIM_FLAG_NORMAL); } } - else if ( pm->ps->pm_flags & PMF_DUCKED ) + else if ( pm->ps->pm_flags & PMF_DUCKED ) { if( !PM_InOnGroundAnim( pm->ps ) ) { @@ -5045,7 +5053,7 @@ static void PM_Footsteps( void ) PM_SetAnim(pm,SETANIM_LEGS,BOTH_CROUCH1,SETANIM_FLAG_NORMAL); } } - } + } else { if ( pm->ps->legsAnimTimer && PM_LandingAnim( pm->ps->legsAnim ) ) @@ -5105,8 +5113,8 @@ static void PM_Footsteps( void ) else if( (validNPC && pm->ps->weapon > WP_SABER && pm->ps->weapon < WP_DET_PACK ))// && pm->gent->client->race != RACE_BORG))//Being careful or carrying a 2-handed weapon {//Squadmates use BOTH_STAND3 oldAnim = pm->ps->legsAnim; - if(oldAnim != BOTH_GUARD_LOOKAROUND1 && oldAnim != BOTH_GUARD_IDLE1 && - oldAnim != BOTH_STAND3IDLE1 && oldAnim != BOTH_STAND2TO4 + if(oldAnim != BOTH_GUARD_LOOKAROUND1 && oldAnim != BOTH_GUARD_IDLE1 && + oldAnim != BOTH_STAND3IDLE1 && oldAnim != BOTH_STAND2TO4 && oldAnim != BOTH_STAND4TO2 && oldAnim != BOTH_STAND4 ) {//Don't auto-override the guard idles if ( !PM_AdjustStandAnimForSlope() ) @@ -5137,7 +5145,7 @@ static void PM_Footsteps( void ) } return; } - + //maybe call this every frame, even when moving? if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ATST ) { @@ -5145,17 +5153,17 @@ static void PM_Footsteps( void ) } //trying to move laterally - if ( (PM_InSaberAnim( pm->ps->legsAnim ) && !PM_SpinningSaberAnim( pm->ps->legsAnim )) - || pm->ps->legsAnim == BOTH_STAND1 - || pm->ps->legsAnim == BOTH_STAND1TO2 - || pm->ps->legsAnim == BOTH_STAND2TO1 - || pm->ps->legsAnim == BOTH_STAND2 + if ( (PM_InSaberAnim( pm->ps->legsAnim ) && !PM_SpinningSaberAnim( pm->ps->legsAnim )) + || pm->ps->legsAnim == BOTH_STAND1 + || pm->ps->legsAnim == BOTH_STAND1TO2 + || pm->ps->legsAnim == BOTH_STAND2TO1 + || pm->ps->legsAnim == BOTH_STAND2 || pm->ps->legsAnim == BOTH_SABERFAST_STANCE || pm->ps->legsAnim == BOTH_SABERSLOW_STANCE || pm->ps->legsAnim == BOTH_BUTTON_HOLD || pm->ps->legsAnim == BOTH_BUTTON_RELEASE - || PM_LandingAnim( pm->ps->legsAnim ) - || PM_PainAnim( pm->ps->legsAnim ) + || PM_LandingAnim( pm->ps->legsAnim ) + || PM_PainAnim( pm->ps->legsAnim ) || PM_ForceAnim( pm->ps->legsAnim )) {//legs are in a saber anim, and not spinning, be sure to override it setAnimFlags |= SETANIM_FLAG_OVERRIDE; @@ -5170,7 +5178,7 @@ static void PM_Footsteps( void ) } } - if ( pm->ps->pm_flags & PMF_DUCKED ) + if ( pm->ps->pm_flags & PMF_DUCKED ) { bobmove = 0.5; // ducked characters bob much faster if( !PM_InOnGroundAnim( pm->ps ) ) @@ -5182,7 +5190,7 @@ static void PM_Footsteps( void ) } if ( !rolled ) { - if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) + if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) { PM_SetAnim(pm,SETANIM_LEGS,BOTH_CROUCH1WALKBACK,setAnimFlags); } @@ -5194,21 +5202,21 @@ static void PM_Footsteps( void ) } // ducked characters never play footsteps } - else if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) + else if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) {//Moving backwards - if ( !( pm->cmd.buttons & BUTTON_WALKING ) ) + if ( !( pm->cmd.buttons & BUTTON_WALKING ) ) {//running backwards bobmove = 0.4F; // faster speeds bob faster PM_SetAnim(pm,SETANIM_LEGS,BOTH_RUNBACK1,setAnimFlags); footstep = qtrue; - } - else + } + else {//walking backwards bobmove = 0.3F; // faster speeds bob faster PM_SetAnim(pm,SETANIM_LEGS,BOTH_WALKBACK1,setAnimFlags); } } - else + else { if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_GALAKMECH ) { @@ -5222,7 +5230,7 @@ static void PM_Footsteps( void ) PM_SetAnim( pm, SETANIM_BOTH, BOTH_WALK2, SETANIM_FLAG_NORMAL ); } } - else if ( !( pm->cmd.buttons & BUTTON_WALKING ) ) + else if ( !( pm->cmd.buttons & BUTTON_WALKING ) ) { bobmove = 0.4F; // faster speeds bob faster if ( pm->ps->weapon == WP_SABER && pm->ps->saberActive ) @@ -5255,8 +5263,8 @@ static void PM_Footsteps( void ) } } footstep = qtrue; - } - else + } + else { bobmove = 0.3F; // walking bobs slow if ( pm->ps->clientNum && pm->ps->weapon == WP_SABER && pm->ps->saberActive ) @@ -5267,7 +5275,7 @@ static void PM_Footsteps( void ) { PM_SetAnim(pm,SETANIM_LEGS,BOTH_WALK1,setAnimFlags); } - + //Enemy NPCs always make footsteps for the benefit of the player if ( pm->gent && pm->gent->NPC && pm->gent->client && pm->gent->client->playerTeam != TEAM_PLAYER ) { @@ -5295,18 +5303,18 @@ static void PM_Footsteps( void ) pm->ps->bobCycle = (int)( old + bobmove * pml.msec ) & 255; // if we just crossed a cycle boundary, play an apropriate footstep event - if ( ( ( old + 64 ) ^ ( pm->ps->bobCycle + 64 ) ) & 128 ) + if ( ( ( old + 64 ) ^ ( pm->ps->bobCycle + 64 ) ) & 128 ) { - if ( pm->watertype & CONTENTS_LADDER ) + if ( pm->watertype & CONTENTS_LADDER ) { - if ( !pm->noFootsteps ) + if ( !pm->noFootsteps ) { if (pm->ps->groundEntityNum == ENTITYNUM_NONE) {// on ladder PM_AddEvent( EV_FOOTSTEP_METAL ); } else { PM_AddEvent( PM_FootstepForSurface() ); //still on ground } - if ( pm->gent && pm->gent->s.number == 0 ) + if ( pm->gent && pm->gent->s.number == 0 ) { // if ( pm->gent->client && pm->gent->client->playerTeam != TEAM_DISGUISE ) { @@ -5315,13 +5323,13 @@ static void PM_Footsteps( void ) } } } - else if ( pm->waterlevel == 0 ) + else if ( pm->waterlevel == 0 ) { // on ground will only play sounds if running - if ( footstep && !pm->noFootsteps ) + if ( footstep && !pm->noFootsteps ) { PM_AddEvent( PM_FootstepForSurface() ); - if ( pm->gent && pm->gent->s.number == 0 ) + if ( pm->gent && pm->gent->s.number == 0 ) { vec3_t bottom; @@ -5333,8 +5341,8 @@ static void PM_Footsteps( void ) } } } - } - else if ( pm->waterlevel == 1 ) + } + else if ( pm->waterlevel == 1 ) { // splashing if ( pm->ps->waterHeightLevel >= WHL_KNEES ) @@ -5345,7 +5353,7 @@ static void PM_Footsteps( void ) { PM_AddEvent( EV_FOOTSPLASH ); } - if ( pm->gent && pm->gent->s.number == 0 ) + if ( pm->gent && pm->gent->s.number == 0 ) { vec3_t bottom; @@ -5357,8 +5365,8 @@ static void PM_Footsteps( void ) AddSightEvent( pm->gent, pm->ps->origin, 512, AEL_MINOR ); } } - } - else if ( pm->waterlevel == 2 ) + } + else if ( pm->waterlevel == 2 ) { // wading / swimming at surface /* @@ -5371,7 +5379,7 @@ static void PM_Footsteps( void ) { PM_AddEvent( EV_FOOTWADE ); } - if ( pm->gent && pm->gent->s.number == 0 ) + if ( pm->gent && pm->gent->s.number == 0 ) { // if ( pm->gent->client && pm->gent->client->playerTeam != TEAM_DISGUISE ) { @@ -5395,7 +5403,7 @@ Generate sound events for entering and leaving water ============== */ static void PM_WaterEvents( void ) { // FIXME? - + qboolean impact_splash = qfalse; if ( pm->watertype & CONTENTS_LADDER ) //fake water for ladder @@ -5514,7 +5522,7 @@ static void PM_BeginWeaponChange( int weapon ) { if ( !( pm->ps->stats[STAT_WEAPONS] & ( 1 << weapon ) ) ) { return; } - + if ( pm->ps->weaponstate == WEAPON_DROPPING ) { return; } @@ -5565,7 +5573,7 @@ static void PM_BeginWeaponChange( int weapon ) { } else { - if ( pm->ps->weapon == WP_SABER ) + if ( pm->ps->weapon == WP_SABER ) {//going to switch away from saber if ( pm->gent ) { @@ -5713,11 +5721,11 @@ void PM_SetSaberMove(short newMove) if ( cg_debugSaber.integer&0x01 && (newMove != LS_READY) ) { - Com_Printf("SetSaberMove: From '%s' to '%s'\n", + Com_Printf("SetSaberMove: From '%s' to '%s'\n", saberMoveData[pm->ps->saberMove].name, saberMoveData[newMove].name); - } - + } + if ( newMove == LS_READY || newMove == LS_A_FLIP_STAB || newMove == LS_A_FLIP_SLASH ) {//finished with a kata (or in a special move) reset attack counter pm->ps->saberAttackChainCount = 0; @@ -5748,7 +5756,7 @@ void PM_SetSaberMove(short newMove) } else if ( pm->ps->saberAnimLevel > FORCE_LEVEL_1 && !PM_SaberInIdle( newMove ) && !PM_SaberInParry( newMove ) && !PM_SaberInKnockaway( newMove ) && !PM_SaberInBrokenParry( newMove ) && !PM_SaberInReflect( newMove ) && !PM_SaberInSpecial( newMove )) - {//readies, parries and reflections have only 1 level + {//readies, parries and reflections have only 1 level //increment the anim to the next level of saber anims anim += (pm->ps->saberAnimLevel-FORCE_LEVEL_1) * SABER_ANIM_GROUP_SIZE; } @@ -5759,7 +5767,7 @@ void PM_SetSaberMove(short newMove) setflags |= SETANIM_FLAG_RESTART; } - if ( anim == BOTH_STAND2 + if ( anim == BOTH_STAND2 || anim == BOTH_SABERFAST_STANCE || anim == BOTH_SABERSLOW_STANCE ) { @@ -5778,8 +5786,8 @@ void PM_SetSaberMove(short newMove) } } - if ( newMove == LS_A_LUNGE - || newMove == LS_A_JUMP_T__B_ + if ( newMove == LS_A_LUNGE + || newMove == LS_A_JUMP_T__B_ || newMove == LS_A_BACKSTAB || newMove == LS_A_BACK || newMove == LS_A_BACK_CR @@ -5794,9 +5802,9 @@ void PM_SetSaberMove(short newMove) } else if ( (!pm->cmd.forwardmove&&!pm->cmd.rightmove&&!pm->cmd.upmove)) {//not trying to run, duck or jump - if ( !PM_FlippingAnim( pm->ps->legsAnim ) && - !PM_InRoll( pm->ps ) && - !PM_InKnockDown( pm->ps ) && + if ( !PM_FlippingAnim( pm->ps->legsAnim ) && + !PM_InRoll( pm->ps ) && + !PM_InKnockDown( pm->ps ) && !PM_JumpingAnim( pm->ps->legsAnim ) && !PM_PainAnim( pm->ps->legsAnim ) && !PM_InSpecialJump( pm->ps->legsAnim ) && @@ -5853,7 +5861,7 @@ void PM_SetSaberMove(short newMove) if ( pm->ps->clientNum == 0 || PM_ControlledByPlayer() ) { - if ( pm->ps->saberBlocked >= BLOCKED_UPPER_RIGHT_PROJ && pm->ps->saberBlocked <= BLOCKED_TOP_PROJ + if ( pm->ps->saberBlocked >= BLOCKED_UPPER_RIGHT_PROJ && pm->ps->saberBlocked <= BLOCKED_TOP_PROJ && newMove >= LS_REFLECT_UP && newMove <= LS_REFLECT_LL ) {//don't clear it when blocking projectiles } @@ -5892,7 +5900,7 @@ Generates a use event */ #define USE_DELAY 250 -void PM_Use( void ) +void PM_Use( void ) { if ( pm->ps->useTime > 0 ) { @@ -5920,8 +5928,8 @@ void PM_Use( void ) extern int PM_AttackForEnemyPos( qboolean allowFB ); int PM_NPCSaberAttackFromQuad( int quad ) -{ - //FIXME: this should be an AI decision +{ + //FIXME: this should be an AI decision // It should be based on the enemy's current LS_ move, saberAnimLevel, // the jedi's difficulty level, rank and FP_OFFENSE skill... int autoMove = LS_NONE; @@ -6117,7 +6125,7 @@ void PM_SetAnimFrame( gentity_t *gent, int frame, qboolean torso, qboolean legs } if ( legs && gent->rootBone != -1 ) { - gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->rootBone, + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->rootBone, frame, frame+1, BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND, 1, actualTime, frame, 150 ); } } @@ -6189,7 +6197,7 @@ int PM_SaberLockWinAnim( saberLockResult_t result ) } int PM_SaberLockLoseAnim( gentity_t *genemy, saberLockResult_t result ) -{ +{ int loseAnim = -1; switch ( genemy->client->ps.torsoAnim ) { @@ -6448,7 +6456,7 @@ qboolean PM_SaberLocked( void ) genemy->client->ps.torsoAnim == BOTH_CCWCIRCLELOCK ) ) { - if ( pm->ps->saberLockTime <= level.time + 500 + if ( pm->ps->saberLockTime <= level.time + 500 && pm->ps->saberLockEnemy != ENTITYNUM_NONE ) {//lock just ended int strength = G_SaberLockStrength( gent ); @@ -6487,11 +6495,13 @@ qboolean PM_SaberLocked( void ) int curFrame, junk; int strength = 1; anim = &level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations[pm->ps->torsoAnim]; - qboolean ret; - ret=gi.G2API_GetBoneAnimIndex( &gent->ghoul2[gent->playerModel], gent->lowerLumbarBone, (cg.time?cg.time:level.time), ¤tFrame, &junk, &junk, &junk, &junk2, NULL ); +#ifdef _DEBUG + qboolean ret = +#endif // _DEBUG + gi.G2API_GetBoneAnimIndex( &gent->ghoul2[gent->playerModel], gent->lowerLumbarBone, (cg.time?cg.time:level.time), ¤tFrame, &junk, &junk, &junk, &junk2, NULL ); assert(ret); // this would be pretty bad, the below code seems to assume the call succeeds. -gil - + strength = G_SaberLockStrength( gent ); if ( pm->ps->torsoAnim == BOTH_CCWCIRCLELOCK || pm->ps->torsoAnim == BOTH_BF2LOCK ) @@ -6610,7 +6620,7 @@ qboolean PM_SaberLocked( void ) PM_SetAnimFrame( genemy, anim->firstFrame+remaining, qtrue, qtrue ); /* curFrame = floor( currentFrame ); - + //drop his frame one if ( curFrame <= anim->firstFrame ) {//He lost! Break out @@ -6693,17 +6703,16 @@ While this is a little different than the Quake 3 code, there is no clean way of // Note that if the resultant animation is NONE, then the animation is essentially "idle", and is set in WP_TorsoAnim void PM_WeaponLightsaber(void) { - int addTime,amount; + int addTime; qboolean delayed_fire = qfalse; - weaponInfo_t *weapon; int anim=-1, curmove, newmove=LS_NONE; - if ( !pm->ps->clientNum + if ( !pm->ps->clientNum && cg.saberAnimLevelPending > FORCE_LEVEL_0 && cg.saberAnimLevelPending != pm->ps->saberAnimLevel ) { - if ( !PM_SaberInStart( pm->ps->saberMove ) - && !PM_SaberInTransition( pm->ps->saberMove ) + if ( !PM_SaberInStart( pm->ps->saberMove ) + && !PM_SaberInTransition( pm->ps->saberMove ) && !PM_SaberInAttack( pm->ps->saberMove ) ) {//don't allow changes when in the middle of an attack set...(or delay the change until it's done) pm->ps->saberAnimLevel = cg.saberAnimLevelPending; @@ -6724,7 +6733,7 @@ void PM_WeaponLightsaber(void) } return; } - else + else { if ( pm->cmd.buttons & BUTTON_ATTACK ) {//let an attack interrupt the torso part of this force getup @@ -6732,7 +6741,7 @@ void PM_WeaponLightsaber(void) } } } - else + else */ if ( PM_InKnockDown( pm->ps ) || PM_InRoll( pm->ps )) {//in knockdown @@ -6770,9 +6779,9 @@ void PM_WeaponLightsaber(void) saberInAir = qfalse; } } - if ( pm->ps->weaponTime <= 0 || pm->ps->weaponstate != WEAPON_FIRING ) + if ( pm->ps->weaponTime <= 0 || pm->ps->weaponstate != WEAPON_FIRING ) { - if ( pm->ps->weapon != pm->cmd.weapon ) + if ( pm->ps->weapon != pm->cmd.weapon ) { PM_BeginWeaponChange( pm->cmd.weapon ); } @@ -6851,9 +6860,9 @@ void PM_WeaponLightsaber(void) pm->ps->saberBlocked = BLOCKED_ATK_BOUNCE; } /* - else if ( (pm->cmd.buttons&BUTTON_ATTACK) + else if ( (pm->cmd.buttons&BUTTON_ATTACK) && pm->ps->saberBlocked >= BLOCKED_UPPER_RIGHT - && pm->ps->saberBlocked <= BLOCKED_TOP + && pm->ps->saberBlocked <= BLOCKED_TOP && !PM_SaberInKnockaway( pm->ps->saberBounceMove ) ) {//if hitting attack during a parry (not already a knockaway) if ( pm->ps->forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2 ) @@ -6932,7 +6941,7 @@ void PM_WeaponLightsaber(void) {//player int newQuad = PM_SaberMoveQuadrantForMovement( &pm->cmd ); while ( newQuad == saberMoveData[pm->ps->saberMove].startQuad ) - {//player is still in same attack quad, don't repeat that attack because it looks bad, + {//player is still in same attack quad, don't repeat that attack because it looks bad, //FIXME: try to pick one that might look cool? newQuad = Q_irand( Q_BR, Q_BL ); //FIXME: sanity check, just in case? @@ -7120,7 +7129,7 @@ void PM_WeaponLightsaber(void) // Charging is like a lead-up before attacking again. This is an appropriate use, or we can create a new weaponstate for blocking pm->ps->saberBounceMove = LS_NONE; pm->ps->weaponstate = WEAPON_READY; - + // Done with block, so stop these active weapon branches. return; } @@ -7133,10 +7142,10 @@ void PM_WeaponLightsaber(void) } } - if ( pm->ps->weaponTime > 0 ) + if ( pm->ps->weaponTime > 0 ) { - //FIXME: allow some window of opportunity to change your attack - // if it just started and your directional input is different + //FIXME: allow some window of opportunity to change your attack + // if it just started and your directional input is different // than it was before... but only 100 milliseconds at most? //OR: Make it so that attacks don't start until 100ms after you // press the attack button...??? @@ -7157,7 +7166,7 @@ void PM_WeaponLightsaber(void) // WEAPON_RAISING // ********************************************************* - if ( pm->ps->weaponstate == WEAPON_RAISING ) + if ( pm->ps->weaponstate == WEAPON_RAISING ) {//Just selected the weapon pm->ps->weaponstate = WEAPON_IDLE; if(pm->gent && pm->gent->s.number == 0) @@ -7221,8 +7230,6 @@ void PM_WeaponLightsaber(void) // Check for WEAPON ATTACK // ********************************************************* - weapon = &cg_weapons[pm->ps->weapon]; - if(!delayed_fire) { // Start with the current move, and cross index it with the current control states. @@ -7242,7 +7249,7 @@ void PM_WeaponLightsaber(void) else if ( !(pm->cmd.buttons & (BUTTON_ATTACK|BUTTON_ALT_ATTACK)) ) {//not attacking pm->ps->weaponTime = 0; - + if ( pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0 ) {//Still firing pm->ps->weaponstate = WEAPON_FIRING; @@ -7388,8 +7395,8 @@ void PM_WeaponLightsaber(void) newmove = saberMoveData[curmove].chain_idle; } else */ - if ( pm->ps->clientNum - && !PM_ControlledByPlayer() + if ( pm->ps->clientNum + && !PM_ControlledByPlayer() && (Q_irand( 0, pm->ps->saberAnimLevel-1 ) || ( pm->ps->saberAnimLevel == FORCE_LEVEL_1 && pm->gent && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, 1 ) ) ) )//minor change to make fast-attack users use the special attacks more {//NPCs use more randomized attacks the more skilled they are newmove = PM_NPCSaberAttackFromQuad( saberMoveData[curmove].endQuad ); @@ -7439,7 +7446,7 @@ void PM_WeaponLightsaber(void) {//not moving at all, so set the anim on entire body both = qtrue; } - + } if ( anim == -1) @@ -7498,11 +7505,6 @@ void PM_WeaponLightsaber(void) pm->ps->weaponstate = WEAPON_FIRING; - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) - amount = weaponData[pm->ps->weapon].altEnergyPerShot; - else - amount = weaponData[pm->ps->weapon].energyPerShot; - if ( pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0 ) {//FIXME: this is going to fire off one frame before you expect, actually // Clear these out since we're not actually firing yet @@ -7551,7 +7553,7 @@ void PM_WeaponLightsaber(void) {//player always fires at normal speed addTime *= g_timescale->value; } - else if ( g_entities[pm->ps->clientNum].client + else if ( g_entities[pm->ps->clientNum].client && pm->ps->forcePowersActive&(1<value; @@ -7621,7 +7623,7 @@ static bool PM_DoChargedWeapons( void ) } } break; - + //------------------ case WP_BOWCASTER: @@ -7631,7 +7633,7 @@ static bool PM_DoChargedWeapons( void ) charging = qtrue; } break; - + //------------------ case WP_DEMP2: @@ -7657,7 +7659,7 @@ static bool PM_DoChargedWeapons( void ) //------------------ case WP_THERMAL: - // FIXME: Really should have a wind-up anim for player + // FIXME: Really should have a wind-up anim for player // as he holds down the fire button to throw, then play // the actual throw when he lets go... if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) @@ -7673,7 +7675,7 @@ static bool PM_DoChargedWeapons( void ) } // end switch - // set up the appropriate weapon state based on the button that's down. + // set up the appropriate weapon state based on the button that's down. // Note that we ALWAYS return if charging is set ( meaning the buttons are still down ) if ( charging ) { @@ -7783,7 +7785,7 @@ static int PM_DoChargingAmmoUsage( int *amount ) int dif = pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] - *amount * count; // If we have enough ammo to do the full charged shot, we are ok - if ( dif < 0 ) + if ( dif < 0 ) { // we are not ok, so hack our chargetime and ammo usage, note that DIF is going to be negative count += floor(dif / (float)*amount); @@ -7796,7 +7798,7 @@ static int PM_DoChargingAmmoUsage( int *amount ) // now get a real chargeTime so the duplicated code in g_weapon doesn't get freaked pm->ps->weaponChargeTime = level.time - ( count * BOWCASTER_CHARGE_UNIT ); } - } + } // now that count is cool, get the real ammo usage *amount *= count; @@ -7821,7 +7823,7 @@ static int PM_DoChargingAmmoUsage( int *amount ) int dif = pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] - *amount * count; // If we have enough ammo to do the full charged shot, we are ok - if ( dif < 0 ) + if ( dif < 0 ) { // we are not ok, so hack our chargetime and ammo usage, note that DIF is going to be negative count += floor(dif / (float)*amount); @@ -7834,7 +7836,7 @@ static int PM_DoChargingAmmoUsage( int *amount ) // now get a real chargeTime so the duplicated code in g_weapon doesn't get freaked pm->ps->weaponChargeTime = level.time - ( count * BRYAR_CHARGE_UNIT ); } - } + } // now that count is cool, get the real ammo usage *amount *= count; @@ -7859,7 +7861,7 @@ static int PM_DoChargingAmmoUsage( int *amount ) int dif = pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] - *amount * count; // If we have enough ammo to do the full charged shot, we are ok - if ( dif < 0 ) + if ( dif < 0 ) { // we are not ok, so hack our chargetime and ammo usage, note that DIF is going to be negative count += floor(dif / (float)*amount); @@ -7872,7 +7874,7 @@ static int PM_DoChargingAmmoUsage( int *amount ) // now get a real chargeTime so the duplicated code in g_weapon doesn't get freaked pm->ps->weaponChargeTime = level.time - ( count * DEMP2_CHARGE_UNIT ); } - } + } // now that count is cool, get the real ammo usage *amount *= count; @@ -7903,7 +7905,7 @@ static int PM_DoChargingAmmoUsage( int *amount ) int dif = pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] - *amount * count; // If we have enough ammo to do the full charged shot, we are ok - if ( dif < 0 ) + if ( dif < 0 ) { // we are not ok, so hack our chargetime and ammo usage, note that DIF is going to be negative count += floor(dif / (float)*amount); @@ -7916,7 +7918,7 @@ static int PM_DoChargingAmmoUsage( int *amount ) // now get a real chargeTime so the duplicated code in g_weapon doesn't get freaked pm->ps->weaponChargeTime = level.time - ( count * DISRUPTOR_CHARGE_UNIT ); } - } + } // now that count is cool, get the real ammo usage *amount *= count; @@ -7933,10 +7935,10 @@ static int PM_DoChargingAmmoUsage( int *amount ) qboolean PM_DroidMelee( int npc_class ) { - if ( npc_class == CLASS_PROBE - || npc_class == CLASS_SEEKER - || npc_class == CLASS_INTERROGATOR - || npc_class == CLASS_SENTRY + if ( npc_class == CLASS_PROBE + || npc_class == CLASS_SEEKER + || npc_class == CLASS_INTERROGATOR + || npc_class == CLASS_SENTRY || npc_class == CLASS_REMOTE ) { return qtrue; @@ -7951,7 +7953,7 @@ PM_Weapon Generates weapon events and modifes the weapon counter ============== */ -static void PM_Weapon( void ) +static void PM_Weapon( void ) { int addTime, amount, trueCount = 1; qboolean delayed_fire = qfalse; @@ -8048,7 +8050,7 @@ static void PM_Weapon( void ) } } - if ( pm->ps->weaponTime > 0 ) + if ( pm->ps->weaponTime > 0 ) { return; } @@ -8069,7 +8071,7 @@ static void PM_Weapon( void ) return; } - if ( pm->ps->weaponstate == WEAPON_RAISING ) + if ( pm->ps->weaponstate == WEAPON_RAISING ) { //Just selected the weapon pm->ps->weaponstate = WEAPON_IDLE; @@ -8100,7 +8102,7 @@ static void PM_Weapon( void ) if ( !(pm->cmd.buttons & (BUTTON_ATTACK|BUTTON_ALT_ATTACK)) ) { pm->ps->weaponTime = 0; - + if ( pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0 ) {//Still firing pm->ps->weaponstate = WEAPON_FIRING; @@ -8112,10 +8114,10 @@ static void PM_Weapon( void ) pm->ps->weaponstate = WEAPON_IDLE; } } - + return; } - + // start the animation even if out of ammo switch(pm->ps->weapon) { @@ -8123,12 +8125,12 @@ static void PM_Weapon( void ) case WP_SABER://1 - handed PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); break; -*/ +*/ case WP_BRYAR_PISTOL://1-handed case WP_BLASTER_PISTOL://1-handed PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); break; - + case WP_MELEE: // since there's no RACE_BOTS, I listed all the droids that have might have melee attacks - dmv @@ -8262,7 +8264,7 @@ static void PM_Weapon( void ) if ( pm->ps->ammo[ weaponData[pm->ps->weapon].ammoIndex ] != -1 ) { // enough energy to fire this weapon? - if ((pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] - amount) >= 0) + if ((pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] - amount) >= 0) { pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] -= amount; } @@ -8291,12 +8293,12 @@ static void PM_Weapon( void ) PM_AddEvent( EV_FIRE_WEAPON ); addTime = pm->ps->torsoAnimTimer; } - else if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) + else if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) { PM_AddEvent( EV_ALT_FIRE ); addTime = weaponData[pm->ps->weapon].altFireTime; } - else + else { if ( pm->ps->clientNum //NPC && !PM_ControlledByPlayer() //not under player control @@ -8338,7 +8340,7 @@ static void PM_Weapon( void ) {//player always fires at normal speed addTime *= g_timescale->value; } - else if ( g_entities[pm->ps->clientNum].client + else if ( g_entities[pm->ps->clientNum].client && pm->ps->forcePowersActive&(1<value; @@ -8349,7 +8351,7 @@ static void PM_Weapon( void ) pm->ps->weaponTime += addTime; pm->ps->lastShotTime = level.time;//so we know when the last time we fired our gun is - + // HACK!!!!! if ( pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] <= 0 ) { @@ -8374,16 +8376,16 @@ static void PM_Inventory(void) { // check for item using /* - if ( pm->cmd.buttons & BUTTON_USE_FORCEPOWER ) + if ( pm->cmd.buttons & BUTTON_USE_FORCEPOWER ) { - if ( ! ( pm->ps->pm_flags & BUTTON_USE_FORCEPOWER ) ) + if ( ! ( pm->ps->pm_flags & BUTTON_USE_FORCEPOWER ) ) { pm->ps->pm_flags |= BUTTON_USE_FORCEPOWER; PM_AddEvent( EV_USE_FORCEPOWER); - return; + return; } - } - else + } + else { pm->ps->pm_flags &= ~PMF_USE_ITEM_HELD; } @@ -8399,7 +8401,7 @@ void PM_CheckForceUseButton( gentity_t *ent, usercmd_t *ucmd ) { return; } - if ( ucmd->buttons & BUTTON_USE_FORCE ) + if ( ucmd->buttons & BUTTON_USE_FORCE ) { switch ( showPowers[cg.forcepowerSelect] ) { @@ -8439,16 +8441,16 @@ PM_ForcePower static void PM_ForcePower(void) { // check for item using - if ( pm->cmd.buttons & BUTTON_USE_FORCE ) + if ( pm->cmd.buttons & BUTTON_USE_FORCE ) { - if ( ! ( pm->ps->pm_flags & PMF_USE_FORCE ) ) + if ( ! ( pm->ps->pm_flags & PMF_USE_FORCE ) ) { pm->ps->pm_flags |= PMF_USE_FORCE; PM_AddEvent( EV_USE_FORCE); - return; + return; } - } - else + } + else { pm->ps->pm_flags &= ~PMF_USE_FORCE; } @@ -8459,17 +8461,17 @@ static void PM_ForcePower(void) PM_DropTimers ================ */ -static void PM_DropTimers( void ) +static void PM_DropTimers( void ) { // drop misc timing counter - if ( pm->ps->pm_time ) + if ( pm->ps->pm_time ) { - if ( pml.msec >= pm->ps->pm_time ) + if ( pml.msec >= pm->ps->pm_time ) { pm->ps->pm_flags &= ~PMF_ALL_TIMES; pm->ps->pm_time = 0; - } - else + } + else { pm->ps->pm_time -= pml.msec; } @@ -8530,7 +8532,7 @@ void PM_SetSpecialMoveValues (void ) { pml.frametime *= (1.0f/g_timescale->value); } - else if ( g_entities[pm->ps->clientNum].client + else if ( g_entities[pm->ps->clientNum].client && pm->ps->forcePowersActive&(1<value); @@ -8610,7 +8612,7 @@ void PM_AdjustAttackStates( pmove_t *pm ) // just use whatever ammo was selected from above if ( cg.zoomMode == 2 ) { - amount = pm->ps->ammo[weaponData[ pm->ps->weapon ].ammoIndex] - + amount = pm->ps->ammo[weaponData[ pm->ps->weapon ].ammoIndex] - weaponData[pm->ps->weapon].altEnergyPerShot; } } @@ -8623,7 +8625,7 @@ void PM_AdjustAttackStates( pmove_t *pm ) } // Check for binocular specific mode - if ( cg.zoomMode == 1 && pm->gent && pm->gent->s.number == 0 ) // + if ( cg.zoomMode == 1 && pm->gent && pm->gent->s.number == 0 ) // { if ( pm->cmd.buttons & BUTTON_ALT_ATTACK && pm->ps->batteryCharge ) { @@ -8650,7 +8652,7 @@ void PM_AdjustAttackStates( pmove_t *pm ) } // set the firing flag for continuous beam weapons, phaser will fire even if out of ammo - if ( (( pm->cmd.buttons & BUTTON_ATTACK || pm->cmd.buttons & BUTTON_ALT_ATTACK ) && ( amount >= 0 || pm->ps->weapon == WP_SABER )) ) + if ( (( pm->cmd.buttons & BUTTON_ATTACK || pm->cmd.buttons & BUTTON_ALT_ATTACK ) && ( amount >= 0 || pm->ps->weapon == WP_SABER )) ) { if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) { @@ -8671,8 +8673,8 @@ void PM_AdjustAttackStates( pmove_t *pm ) // This flag should always get set, even when alt-firing pm->ps->eFlags |= EF_FIRING; - } - else + } + else { // int iFlags = pm->ps->eFlags; @@ -8681,7 +8683,7 @@ void PM_AdjustAttackStates( pmove_t *pm ) pm->ps->eFlags &= ~EF_ALT_FIRING; // if I don't check the flags before stopping FX then it switches them off too often, which tones down - // the stronger FFFX so you can hardly feel them. However, if you only do iton these flags then the + // the stronger FFFX so you can hardly feel them. However, if you only do iton these flags then the // repeat-fire weapons like tetrion and dreadnought don't switch off quick enough. So... // /* // Might need this for beam type weapons @@ -8737,8 +8739,8 @@ void Pmove( pmove_t *pmove ) PM_AdjustAttackStates( pm ); // clear the respawned flag if attack and use are cleared - if ( pm->ps->stats[STAT_HEALTH] > 0 && - !( pm->cmd.buttons & BUTTON_ATTACK ) ) + if ( pm->ps->stats[STAT_HEALTH] > 0 && + !( pm->cmd.buttons & BUTTON_ATTACK ) ) { pm->ps->pm_flags &= ~PMF_RESPAWNED; } @@ -8753,7 +8755,7 @@ void Pmove( pmove_t *pmove ) } else if ( pml.msec > 200 ) { pml.msec = 200; } - + pm->ps->commandTime = pmove->cmd.serverTime; // save old org in case we get stuck @@ -8857,26 +8859,26 @@ void Pmove( pmove_t *pmove ) {//in an emplaced gun PM_NoclipMove(); } - else if ( Flying == FLY_NORMAL )//|| pm->ps->gravity <= 0 ) + else if ( Flying == FLY_NORMAL )//|| pm->ps->gravity <= 0 ) { // flight powerup doesn't allow jump and has different friction PM_FlyMove(); - } - else if ( Flying == FLY_VEHICLE ) + } + else if ( Flying == FLY_VEHICLE ) { PM_FlyVehicleMove(); - } - else if ( pm->ps->pm_flags & PMF_TIME_WATERJUMP ) + } + else if ( pm->ps->pm_flags & PMF_TIME_WATERJUMP ) { PM_WaterJumpMove(); - } + } else if ( pm->waterlevel > 1 //in water &&(!pm->ps->clientNum || !waterForceJump) )//player or NPC not force jumping {//force-jumping NPCs should // swimming or in ladder PM_WaterMove(); - } - else if ( pml.walking ) + } + else if ( pml.walking ) {// walking on ground vec3_t oldOrg; @@ -8895,8 +8897,8 @@ void Pmove( pmove_t *pmove ) {//didn't move, play no legs anim pm->cmd.forwardmove = pm->cmd.rightmove = 0; } - } - else + } + else { if ( pm->ps->gravity <= 0 ) { @@ -8925,7 +8927,7 @@ void Pmove( pmove_t *pmove ) pm->ps->pm_flags &= ~PMF_TRIGGER_PUSHED; pm->ps->pm_flags &= ~PMF_SLOW_MO_FALL; } - + // If we didn't move at all, then why bother doing this again -MW. // Note: ok, so long as we don't have water levels that change. if(!(VectorCompare(pm->ps->origin,pml.previous_origin))) @@ -8962,7 +8964,7 @@ void Pmove( pmove_t *pmove ) // Use PM_Use(); } - + // TEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMP if ( pm->gent && pm->ps && pm->ps->eFlags & EF_LOCKED_TO_WEAPON ) { diff --git a/codeJK2/game/bg_public.h b/codeJK2/game/bg_public.h index 3dcf925726..2d9e3f3dac 100644 --- a/codeJK2/game/bg_public.h +++ b/codeJK2/game/bg_public.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __BG_PUBLIC_H__ #define __BG_PUBLIC_H__ diff --git a/codeJK2/game/bg_slidemove.cpp b/codeJK2/game/bg_slidemove.cpp index 5ec12777af..861a9de2e8 100644 --- a/codeJK2/game/bg_slidemove.cpp +++ b/codeJK2/game/bg_slidemove.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "../../code/qcommon/q_shared.h" #include "../cgame/cg_local.h" @@ -55,13 +60,13 @@ qboolean PM_SlideMove( float gravMod ) { vec3_t endVelocity; vec3_t endClipVelocity; qboolean damageSelf = qtrue; - + numbumps = 4; VectorCopy (pm->ps->velocity, primal_velocity); VectorCopy( pm->ps->velocity, endVelocity ); - if ( gravMod ) + if ( gravMod ) { if ( !(pm->ps->eFlags&EF_FORCE_GRIPPED) ) { @@ -69,11 +74,11 @@ qboolean PM_SlideMove( float gravMod ) { } pm->ps->velocity[2] = ( pm->ps->velocity[2] + endVelocity[2] ) * 0.5; primal_velocity[2] = endVelocity[2]; - if ( pml.groundPlane ) + if ( pml.groundPlane ) { if ( PM_GroundSlideOkay( pml.groundTrace.plane.normal[2] ) ) {// slide along the ground plane - PM_ClipVelocity( pm->ps->velocity, pml.groundTrace.plane.normal, + PM_ClipVelocity( pm->ps->velocity, pml.groundTrace.plane.normal, pm->ps->velocity, OVERCLIP ); } } @@ -82,7 +87,7 @@ qboolean PM_SlideMove( float gravMod ) { time_left = pml.frametime; // never turn against the ground plane - if ( pml.groundPlane ) + if ( pml.groundPlane ) { numplanes = 1; VectorCopy( pml.groundTrace.plane.normal, planes[0] ); @@ -91,8 +96,8 @@ qboolean PM_SlideMove( float gravMod ) { planes[0][2] = 0; VectorNormalize( planes[0] ); } - } - else + } + else { numplanes = 0; } @@ -109,18 +114,18 @@ qboolean PM_SlideMove( float gravMod ) { // see if we can make it there pm->trace ( &trace, pm->ps->origin, pm->mins, pm->maxs, end, pm->ps->clientNum, pm->tracemask, G2_NOCOLLIDE, 0); - if ( trace.allsolid ) + if ( trace.allsolid ) {// entity is completely trapped in another solid pm->ps->velocity[2] = 0; // don't build up falling damage, but allow sideways acceleration return qtrue; } - if ( trace.fraction > 0 ) + if ( trace.fraction > 0 ) {// actually covered some distance VectorCopy( trace.endpos, pm->ps->origin ); } - if ( trace.fraction == 1 ) + if ( trace.fraction == 1 ) { break; // moved the entire distance } @@ -151,7 +156,7 @@ qboolean PM_SlideMove( float gravMod ) { time_left -= time_left * trace.fraction; - if ( numplanes >= MAX_CLIP_PLANES ) + if ( numplanes >= MAX_CLIP_PLANES ) {// this shouldn't really happen VectorClear( pm->ps->velocity ); return qtrue; @@ -272,21 +277,21 @@ PM_StepSlideMove ================== */ -void PM_StepSlideMove( float gravMod ) +void PM_StepSlideMove( float gravMod ) { vec3_t start_o, start_v; vec3_t down_o, down_v; vec3_t slideMove, stepUpMove; trace_t trace; vec3_t up, down; - qboolean cantStepUpFwd, isATST = qfalse;; + qboolean /*cantStepUpFwd, */isATST = qfalse;; int stepSize = STEPSIZE; VectorCopy (pm->ps->origin, start_o); VectorCopy (pm->ps->velocity, start_v); if ( PM_SlideMove( gravMod ) == 0 ) { - return; // we got exactly where we wanted to go first try + return; // we got exactly where we wanted to go first try }//else Bumped into something, see if we can step over it if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ATST) @@ -310,7 +315,7 @@ void PM_StepSlideMove( float gravMod ) return; } - if ( !pm->ps->velocity[0] && !pm->ps->velocity[1] ) + if ( !pm->ps->velocity[0] && !pm->ps->velocity[1] ) {//All our velocity was cancelled sliding return; } @@ -335,7 +340,7 @@ void PM_StepSlideMove( float gravMod ) VectorCopy (trace.endpos, pm->ps->origin); VectorCopy (start_v, pm->ps->velocity); - cantStepUpFwd = PM_SlideMove( gravMod ); + /*cantStepUpFwd = */PM_SlideMove( gravMod ); //compare the initial slidemove and this slidemove from a step up position VectorSubtract( down_o, start_o, slideMove ); @@ -353,11 +358,11 @@ void PM_StepSlideMove( float gravMod ) VectorCopy (pm->ps->origin, down); down[2] -= stepSize; pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask, G2_NOCOLLIDE, 0); - if ( !trace.allsolid ) + if ( !trace.allsolid ) { - if ( pm->ps->clientNum - && isATST - && g_entities[trace.entityNum].client + if ( pm->ps->clientNum + && isATST + && g_entities[trace.entityNum].client && g_entities[trace.entityNum].client->playerTeam == pm->gent->client->playerTeam ) {//AT-ST's don't step up on allies } @@ -366,12 +371,12 @@ void PM_StepSlideMove( float gravMod ) VectorCopy( trace.endpos, pm->ps->origin ); } } - if ( trace.fraction < 1.0 ) + if ( trace.fraction < 1.0 ) { PM_ClipVelocity( pm->ps->velocity, trace.plane.normal, pm->ps->velocity, OVERCLIP ); } } - + /* if(cantStepUpFwd && pm->ps->origin[2] < start_o[2] + stepSize && pm->ps->origin[2] >= start_o[2]) {//We bumped into something we could not step up @@ -392,7 +397,7 @@ void PM_StepSlideMove( float gravMod ) if ( pm->debugLevel ) { Com_Printf("%i:bend\n", c_pmove); } - } else + } else #endif { // use the step move diff --git a/codeJK2/game/bset.h b/codeJK2/game/bset.h index 841b3e6045..de391dc0e4 100644 --- a/codeJK2/game/bset.h +++ b/codeJK2/game/bset.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software typedef enum //# bSet_e {//This should check to matching a behavior state name first, then look for a script diff --git a/codeJK2/game/bstate.h b/codeJK2/game/bstate.h index a58296b062..42190332fe 100644 --- a/codeJK2/game/bstate.h +++ b/codeJK2/game/bstate.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __BSTATE_H__ #define __BSTATE_H__ diff --git a/codeJK2/game/channels.h b/codeJK2/game/channels.h index 250cc8fe3c..c8aa2c7f67 100644 --- a/codeJK2/game/channels.h +++ b/codeJK2/game/channels.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software typedef enum //# soundChannel_e { diff --git a/codeJK2/game/characters.h b/codeJK2/game/characters.h index 18b85b2244..cae5961b26 100644 --- a/codeJK2/game/characters.h +++ b/codeJK2/game/characters.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software typedef enum //# characters_e { diff --git a/codeJK2/game/dmstates.h b/codeJK2/game/dmstates.h index 28ef5830b0..8ddf0982e3 100644 --- a/codeJK2/game/dmstates.h +++ b/codeJK2/game/dmstates.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __DMSTATES_H__ #define __DMSTATES_H__ diff --git a/codeJK2/game/events.h b/codeJK2/game/events.h index ad3802066c..5d7f7a8f32 100644 --- a/codeJK2/game/events.h +++ b/codeJK2/game/events.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __EVENTS__ #define __EVENTS__ diff --git a/codeJK2/game/fields.h b/codeJK2/game/fields.h index 1358aeb991..c801467629 100644 --- a/codeJK2/game/fields.h +++ b/codeJK2/game/fields.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- fields.h // @@ -83,8 +87,8 @@ typedef enum typedef struct { - char *psName; - int iOffset; + const char *psName; + size_t iOffset; fieldtypeSAVE_t eFieldType; int iFlags; } field_t; diff --git a/codeJK2/game/g_ICARUS.cpp b/codeJK2/game/g_ICARUS.cpp index 8e54a79035..4344d2896c 100644 --- a/codeJK2/game/g_ICARUS.cpp +++ b/codeJK2/game/g_ICARUS.cpp @@ -1,27 +1,29 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // ICARUS Utility functions -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - #include "../icarus/instance.h" #include "g_local.h" #include "Q3_Interface.h" diff --git a/codeJK2/game/g_active.cpp b/codeJK2/game/g_active.cpp index 799201d5d0..b37357a011 100644 --- a/codeJK2/game/g_active.cpp +++ b/codeJK2/game/g_active.cpp @@ -1,25 +1,28 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - #include "g_local.h" #include "g_functions.h" #include "../cgame/cg_local.h" diff --git a/codeJK2/game/g_breakable.cpp b/codeJK2/game/g_breakable.cpp index b63397bb60..86e4dc0afa 100644 --- a/codeJK2/game/g_breakable.cpp +++ b/codeJK2/game/g_breakable.cpp @@ -1,25 +1,27 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - #include "g_local.h" #include "g_functions.h" #include "../cgame/cg_media.h" diff --git a/codeJK2/game/g_camera.cpp b/codeJK2/game/g_camera.cpp index be2e02a795..e52c6f93b8 100644 --- a/codeJK2/game/g_camera.cpp +++ b/codeJK2/game/g_camera.cpp @@ -1,25 +1,27 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - //g_camera.cpp #include "g_local.h" //#include "Q3_Interface.h" diff --git a/codeJK2/game/g_client.cpp b/codeJK2/game/g_client.cpp index 3a0758f861..6f34d83f93 100644 --- a/codeJK2/game/g_client.cpp +++ b/codeJK2/game/g_client.cpp @@ -1,25 +1,28 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - #include "g_local.h" #include "g_functions.h" #include "anims.h" @@ -50,7 +53,7 @@ Targets will be fired when someone spawns in on them. */ void SP_info_player_deathmatch(gentity_t *ent) { SP_misc_teleporter_dest (ent); - + if ( ent->spawnflags & 32 ) // STUN_BATON { RegisterItem( FindItemForWeapon( WP_STUN_BATON )); @@ -94,7 +97,7 @@ SpotWouldTelefrag ================ */ -qboolean SpotWouldTelefrag( gentity_t *spot, team_t checkteam ) +qboolean SpotWouldTelefrag( gentity_t *spot, team_t checkteam ) { int i, num; gentity_t *touch[MAX_GENTITIES], *hit; @@ -114,10 +117,10 @@ qboolean SpotWouldTelefrag( gentity_t *spot, team_t checkteam ) num = gi.EntitiesInBox( mins, maxs, touch, MAX_GENTITIES ); - for (i=0 ; iclient && hit->client->ps.stats[STAT_HEALTH] > 0 ) + if ( hit != spot && hit->client && hit->client->ps.stats[STAT_HEALTH] > 0 ) { if ( hit->contents & CONTENTS_BODY ) { @@ -132,7 +135,7 @@ qboolean SpotWouldTelefrag( gentity_t *spot, team_t checkteam ) return qfalse; } -qboolean SpotWouldTelefrag2( gentity_t *mover, vec3_t dest ) +qboolean SpotWouldTelefrag2( gentity_t *mover, vec3_t dest ) { int i, num; gentity_t *touch[MAX_GENTITIES], *hit; @@ -142,7 +145,7 @@ qboolean SpotWouldTelefrag2( gentity_t *mover, vec3_t dest ) VectorAdd( dest, mover->maxs, maxs ); num = gi.EntitiesInBox( mins, maxs, touch, MAX_GENTITIES ); - for (i=0 ; itargetname != NULL ) + if ( spot->targetname != NULL ) { //this search routine should never find a spot that is targetted return NULL; @@ -275,7 +278,7 @@ gentity_t *SelectSpawnPoint ( vec3_t avoidPoint, team_t team, vec3_t origin, vec return NULL; } } - else + else {//not looking for a special startspot nearestSpot = SelectNearestDeathmatchSpawnPoint( avoidPoint, team ); @@ -329,7 +332,7 @@ void SetClientViewAngle( gentity_t *ent, vec3_t angle ) { int i; // set the delta angle - for (i=0 ; i<3 ; i++) + for (i=0 ; i<3 ; i++) { ent->client->ps.delta_angles[i] = (ANGLE2SHORT(angle[i]) - ent->client->pers.cmd_angles[i])&0xffff; } @@ -405,7 +408,7 @@ static void ClientCleanName( const char *in, char *out, int outSize ) // discard leading asterisk's (fail raven for using * as a skipnotify) // apparently .* causes the issue too so... derp //for(; *in == '*'; in++); - + for(; *in && outpos < outSize - 1; in++) { out[outpos] = *in; @@ -422,7 +425,7 @@ static void ClientCleanName( const char *in, char *out, int outSize ) if ( Q_IsColorStringExt( &out[outpos-1] ) ) { colorlessLen--; - + #if 0 if ( ColorIndex( *in ) == 0 ) {// Disallow color black in names to prevent players from getting advantage playing in front of black backgrounds @@ -442,7 +445,7 @@ static void ClientCleanName( const char *in, char *out, int outSize ) spaces = 0; colorlessLen++; } - + outpos++; } @@ -528,7 +531,7 @@ to the server machine, but qfalse on map changes and tournement restarts. ============ */ -char *ClientConnect( int clientNum, qboolean firstTime, SavedGameJustLoaded_e eSavedGameJustLoaded ) +char *ClientConnect( int clientNum, qboolean firstTime, SavedGameJustLoaded_e eSavedGameJustLoaded ) { gentity_t *ent = &g_entities[ clientNum ]; char userinfo[MAX_INFO_STRING] = {0}; @@ -542,9 +545,9 @@ char *ClientConnect( int clientNum, qboolean firstTime, SavedGameJustLoaded_e eS // if (!qbFromSavedGame) if (eSavedGameJustLoaded != eFULL) { - clientSession_t savedSess = client->sess; // + clientSession_t savedSess = client->sess; // memset( client, 0, sizeof(*client) ); - client->sess = savedSess; + client->sess = savedSess; } client->pers.connected = CON_CONNECTING; @@ -584,8 +587,8 @@ to be placed into the level. This will happen every level load, and on transition between teams, but doesn't happen on respawns ============ */ -void ClientBegin( int clientNum, usercmd_t *cmd, SavedGameJustLoaded_e eSavedGameJustLoaded) -// qboolean qbFromSavedGame +void ClientBegin( int clientNum, usercmd_t *cmd, SavedGameJustLoaded_e eSavedGameJustLoaded) +// qboolean qbFromSavedGame { gentity_t *ent; gclient_t *client; @@ -616,7 +619,7 @@ void ClientBegin( int clientNum, usercmd_t *cmd, SavedGameJustLoaded_e eSavedGam memset( &client->ps, 0, sizeof( client->ps ) ); memset( &client->sess.missionStats, 0, sizeof( client->sess.missionStats ) ); client->sess.missionStats.totalSecrets = gi.Cvar_VariableIntegerValue("newTotalSecrets"); - + // locate ent at a spawn point if ( ClientSpawn( ent, eSavedGameJustLoaded) ) // SavedGameJustLoaded_e { @@ -633,7 +636,7 @@ void ClientBegin( int clientNum, usercmd_t *cmd, SavedGameJustLoaded_e eSavedGam ============ Player_CacheFromPrevLevel Description : just need to grab the weapon items we're going to have when we spawn so they'll be cached - Return type : void + Return type : void Argument : void ============ */ @@ -641,23 +644,23 @@ void Player_CacheFromPrevLevel(void) { char s[MAX_STRING_CHARS]; int i; - + gi.Cvar_VariableStringBuffer( sCVARNAME_PLAYERSAVE, s, sizeof(s) ); - + if (strlen(s)) // actually this would be safe anyway because of the way sscanf() works, but this is clearer { int iDummy, bits, ibits; - sscanf( s, "%i %i %i %i", + sscanf( s, "%i %i %i %i", &iDummy,//client->ps.stats[STAT_HEALTH], &iDummy,//client->ps.stats[STAT_ARMOR], &bits, //client->ps.stats[STAT_WEAPONS] &ibits //client->ps.stats[STAT_ITEMS] ); - for ( i = 1 ; i < 16 ; i++ ) + for ( i = 1 ; i < 16 ; i++ ) { - if ( bits & ( 1 << i ) ) + if ( bits & ( 1 << i ) ) { RegisterItem( FindItemForWeapon( (weapon_t)i ) ); } @@ -665,9 +668,9 @@ void Player_CacheFromPrevLevel(void) extern gitem_t *FindItemForInventory( int inv ); - for ( i = 1 ; i < 16 ; i++ ) + for ( i = 1 ; i < 16 ; i++ ) { - if ( ibits & ( 1 << i ) ) + if ( ibits & ( 1 << i ) ) { RegisterItem( FindItemForInventory( i-1 )); } @@ -679,7 +682,7 @@ extern gitem_t *FindItemForInventory( int inv ); ============ Player_RestoreFromPrevLevel Description : retrieve maptransition data recorded by server when exiting previous level (to carry over weapons/ammo/health/etc) - Return type : void + Return type : void Argument : gentity_t *ent ============ */ @@ -693,12 +696,12 @@ void Player_RestoreFromPrevLevel(gentity_t *ent) { char s[MAX_STRING_CHARS]; const char *var; - + gi.Cvar_VariableStringBuffer( sCVARNAME_PLAYERSAVE, s, sizeof(s) ); if (strlen(s)) // actually this would be safe anyway because of the way sscanf() works, but this is clearer { - sscanf( s, "%i %i %i %i %i %i %i %f %f %f %i %i %i %i %i %i", + sscanf( s, "%i %i %i %i %i %i %i %f %f %f %i %i %i %i %i %i", &client->ps.stats[STAT_HEALTH], &client->ps.stats[STAT_ARMOR], &client->ps.stats[STAT_WEAPONS], @@ -852,10 +855,10 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch { p = surfOff; COM_BeginParseSession(); - while ( 1 ) + while ( 1 ) { token = COM_ParseExt( &p, qtrue ); - if ( !token[0] ) + if ( !token[0] ) {//reached end of list break; } @@ -871,7 +874,7 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch while ( 1 ) { token = COM_ParseExt( &p, qtrue ); - if ( !token[0] ) + if ( !token[0] ) {//reached end of list break; } @@ -888,10 +891,10 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch G_LoadAnimFileSet( ent, modelName ); //we shouldn't actually have to do this anymore //G_SetSkin( ent, modelName, customSkin ); - - ent->headBolt = ent->cervicalBolt = ent->torsoBolt = ent->gutBolt = ent->chestBolt = - ent->crotchBolt = ent->elbowLBolt = ent->elbowRBolt = ent->handLBolt = - ent->handRBolt = ent->kneeLBolt = ent->kneeRBolt = ent->footLBolt = + + ent->headBolt = ent->cervicalBolt = ent->torsoBolt = ent->gutBolt = ent->chestBolt = + ent->crotchBolt = ent->elbowLBolt = ent->elbowRBolt = ent->handLBolt = + ent->handRBolt = ent->kneeLBolt = ent->kneeRBolt = ent->footLBolt = ent->footRBolt = -1; // now turn on the bolt in the hand - this one would be best always turned on. if ( G_StandardHumanoid( modelName ) ) @@ -919,16 +922,16 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch ent->footLBolt = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*l_leg_foot"); ent->footRBolt = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*r_leg_foot"); } - else + else { - if ( !Q_stricmp( "gonk", modelName ) || !Q_stricmp( "seeker", modelName ) || !Q_stricmp( "remote", modelName ) + if ( !Q_stricmp( "gonk", modelName ) || !Q_stricmp( "seeker", modelName ) || !Q_stricmp( "remote", modelName ) || !Q_strncmp( "r2d2", modelName, 4 ) || !Q_strncmp( "r5d2", modelName, 4 ) ) {//TEMP HACK: not a non-humanoid droid ent->headBolt = -1; } else if (!Q_stricmp( "interrogator",modelName)) { - ent->headBolt = -1; + ent->headBolt = -1; } else if (!Q_strncmp( "probe",modelName, 5)) { @@ -938,19 +941,19 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch /* else if (!Q_strncmp( "protocol",modelName, 8)) { - ent->headBolt = -1; + ent->headBolt = -1; } */ else if (!Q_stricmp( "sentry",modelName)) { - ent->headBolt = -1; + ent->headBolt = -1; ent->genericBolt1 = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*flash1"); // Gun 1 ent->genericBolt2 = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*flash2"); // Gun 2 ent->genericBolt3 = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*flash03"); // Gun 3 } else if (!Q_stricmp( "mark1",modelName)) { - ent->headBolt = -1; + ent->headBolt = -1; ent->handRBolt = ent->genericBolt1 = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*flash1"); // Blaster Gun 1 ent->genericBolt2 = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*flash2"); // Blaster Gun 2 ent->genericBolt3 = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*flash3"); // Blaster Gun 3 @@ -959,7 +962,7 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch } else if (!Q_stricmp( "mark2",modelName)) { - ent->headBolt = -1; + ent->headBolt = -1; ent->handRBolt = ent->genericBolt1 = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*flash"); // Blaster Gun 1 } else if (!Q_stricmp( "atst",modelName) )//&& (ent->client->playerTeam != TEAM_PLAYER)) @@ -1029,7 +1032,7 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch // now add overrides on specific joints so the client can set angle overrides on the legs, torso and head if ( !Q_stricmp( "gonk", modelName ) || !Q_stricmp( "seeker", modelName ) || !Q_stricmp( "remote", modelName ) ) {// - } + } else if (!Q_stricmp( "sentry",modelName)) { } @@ -1038,12 +1041,12 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch ent->craniumBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "cranium", qtrue ); if (ent->craniumBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } ent->thoracicBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "pelvis", qtrue ); if (ent->thoracicBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->thoracicBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->thoracicBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } } /* @@ -1056,17 +1059,17 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch ent->genericBone1 = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "left_arm", qtrue ); if (ent->genericBone1>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->genericBone1, angles, BONE_ANGLES_POSTMULT, NEGATIVE_Y, NEGATIVE_X, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->genericBone1, angles, BONE_ANGLES_POSTMULT, NEGATIVE_Y, NEGATIVE_X, NEGATIVE_Z, NULL, 0, 0 ); } ent->genericBone2 = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "right_arm", qtrue ); if (ent->genericBone2>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->genericBone2, angles, BONE_ANGLES_POSTMULT, NEGATIVE_Y, NEGATIVE_X, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->genericBone2, angles, BONE_ANGLES_POSTMULT, NEGATIVE_Y, NEGATIVE_X, NEGATIVE_Z, NULL, 0, 0 ); } ent->genericBone3 = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "claw", qtrue ); if (ent->genericBone3>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->genericBone3, angles, BONE_ANGLES_POSTMULT, NEGATIVE_Y, NEGATIVE_X, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->genericBone3, angles, BONE_ANGLES_POSTMULT, NEGATIVE_Y, NEGATIVE_X, NEGATIVE_Z, NULL, 0, 0 ); } } else if (!Q_strncmp( "r2d2", modelName, 4 )) @@ -1074,17 +1077,17 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch ent->craniumBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "cranium", qtrue ); if (ent->craniumBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } ent->thoracicBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "body", qtrue ); if (ent->thoracicBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->thoracicBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->thoracicBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } ent->genericBone1 = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "f_eye", qtrue ); if (ent->genericBone1>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->genericBone1, angles, BONE_ANGLES_POSTMULT, NEGATIVE_Y, NEGATIVE_X, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->genericBone1, angles, BONE_ANGLES_POSTMULT, NEGATIVE_Y, NEGATIVE_X, NEGATIVE_Z, NULL, 0, 0 ); } } else if (!Q_strncmp( "r5d2", modelName, 4 )) @@ -1092,12 +1095,12 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch ent->craniumBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "cranium", qtrue ); if (ent->craniumBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } ent->thoracicBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "body", qtrue ); if (ent->thoracicBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->thoracicBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->thoracicBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } } else if ( !Q_stricmp( "atst", modelName )) @@ -1105,22 +1108,22 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch ent->craniumBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "cranium", qtrue ); if (ent->craniumBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } ent->thoracicBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "thoracic", qtrue ); if (ent->thoracicBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->thoracicBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->thoracicBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } ent->footLBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "l_tarsal", qtrue ); if (ent->footLBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->footLBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->footLBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0 ); } ent->footRBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "r_tarsal", qtrue ); if (ent->footRBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->footRBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->footRBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0 ); } } else if ( !Q_stricmp( "mark1", modelName )) @@ -1128,12 +1131,12 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch ent->craniumBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "cranium", qtrue ); if (ent->craniumBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } ent->upperLumbarBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "cranium", qtrue ); if (ent->upperLumbarBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->upperLumbarBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->upperLumbarBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } } else if ( !Q_stricmp( "mark2", modelName )) @@ -1141,12 +1144,12 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch ent->craniumBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "cranium", qtrue ); if (ent->craniumBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } ent->thoracicBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "thoracic", qtrue ); if (ent->thoracicBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->thoracicBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->thoracicBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } } else if ( !Q_stricmp( "minemonster", modelName )) @@ -1154,12 +1157,12 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch ent->thoracicBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "thoracic1", qtrue ); if (ent->thoracicBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->thoracicBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->thoracicBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } ent->craniumBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "cranium", qtrue ); if (ent->craniumBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } } else if ( !Q_stricmp( "howler", modelName )) @@ -1167,12 +1170,12 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch ent->thoracicBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "thoracic", qtrue ); if (ent->thoracicBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->thoracicBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->thoracicBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } ent->craniumBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "cranium", qtrue ); if (ent->craniumBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } } else @@ -1181,46 +1184,46 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch ent->motionBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "Motion", qtrue ); if (ent->motionBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->motionBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_X, NEGATIVE_Y, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->motionBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_X, NEGATIVE_Y, NULL, 0, 0 ); } ent->motionBolt = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "Motion"); //bone needed for turning anims ent->hipsBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "pelvis", qtrue ); if (ent->hipsBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->hipsBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->hipsBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } //regular bones we need ent->upperLumbarBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "upper_lumbar", qtrue ); if (ent->upperLumbarBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->upperLumbarBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->upperLumbarBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } ent->lowerLumbarBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "lower_lumbar", qtrue ); if (ent->lowerLumbarBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->lowerLumbarBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->lowerLumbarBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } ent->faceBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "face", qtrue ); if (ent->faceBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->faceBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->faceBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } ent->craniumBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "cranium", qtrue ); if (ent->craniumBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->craniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } ent->cervicalBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "cervical", qtrue ); if (ent->cervicalBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->cervicalBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->cervicalBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } ent->thoracicBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "thoracic", qtrue ); if (ent->thoracicBone>=0) { - gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->thoracicBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->playerModel], ent->thoracicBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); } } ent->client->clientInfo.infoValid = qtrue; @@ -1291,16 +1294,18 @@ void G_SetG2PlayerModel( gentity_t * const ent, const char *modelName, const cha gi.RE_RegisterSkin( skinName ); //now generate the ghoul2 model this client should be. //NOTE: for some reason, it still loads the default skin's tga's? Because they're referenced in the .glm? - ent->playerModel = gi.G2API_InitGhoul2Model( ent->ghoul2, va("models/players/%s/model.glm", modelName), G_ModelIndex( va("models/players/%s/model.glm", modelName) ), G_SkinIndex( skinName ), NULL, 0, 0 ); + ent->playerModel = gi.G2API_InitGhoul2Model( ent->ghoul2, va("models/players/%s/model.glm", modelName), + G_ModelIndex( va("models/players/%s/model.glm", modelName) ), G_SkinIndex( skinName ), NULL_HANDLE, 0, 0 ); if (ent->playerModel == -1) {//try the stormtrooper as a default modelName = "stormtrooper"; - ent->playerModel = gi.G2API_InitGhoul2Model( ent->ghoul2, va("models/players/%s/model.glm", modelName), G_ModelIndex( va("models/players/%s/model.glm", modelName) ), NULL, NULL, 0, 0 ); + ent->playerModel = gi.G2API_InitGhoul2Model( ent->ghoul2, va("models/players/%s/model.glm", modelName), + G_ModelIndex( va("models/players/%s/model.glm", modelName) ), NULL_HANDLE, NULL_HANDLE, 0, 0 ); } if ( !Q_stricmp( "kyle", modelName )) { - // Try to get the skin we'll use when we switch to the first person light saber. + // Try to get the skin we'll use when we switch to the first person light saber. // We use a new skin to disable certain surfaces so they are not drawn but we can still collide against them int skin = gi.RE_RegisterSkin( "models/players/kyle/model_fpls.skin" ); if ( skin ) @@ -1509,7 +1514,7 @@ Initializes all non-persistant parts of playerState ============ */ -qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded ) +qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded ) { int index; vec3_t spawn_origin, spawn_angles; @@ -1569,7 +1574,7 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded // do it before setting health back up, so farthest // ranging doesn't count this client // don't spawn near existing origin if possible - spawnPoint = SelectSpawnPoint ( ent->client->ps.origin, + spawnPoint = SelectSpawnPoint ( ent->client->ps.origin, (team_t) ent->client->ps.persistant[PERS_TEAM], spawn_origin, spawn_angles); ent->client->pers.teamState.state = TEAM_ACTIVE; @@ -1577,20 +1582,20 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded // clear everything but the persistant data saved = client->pers; savedSess = client->sess; - for ( i = 0 ; i < MAX_PERSISTANT ; i++ ) + for ( i = 0 ; i < MAX_PERSISTANT ; i++ ) { persistant[i] = client->ps.persistant[i]; } //Preserve clientInfo memcpy (&savedCi, &client->clientInfo, sizeof(clientInfo_t)); - + memset (client, 0, sizeof(*client)); memcpy (&client->clientInfo, &savedCi, sizeof(clientInfo_t)); client->pers = saved; client->sess = savedSess; - for ( i = 0 ; i < MAX_PERSISTANT ; i++ ) + for ( i = 0 ; i < MAX_PERSISTANT ; i++ ) { client->ps.persistant[i] = persistant[i]; } @@ -1648,7 +1653,7 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded } else { // give the saber AND the blaster because most test maps will not have the STUN BATON flag set - client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_SABER ); //this is precached in SP_info_player_deathmatch + client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_SABER ); //this is precached in SP_info_player_deathmatch } for ( i = 0; i < AMMO_THERMAL; i++ ) // don't give ammo for explosives @@ -1662,7 +1667,7 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded //Initialize force powers WP_InitForcePowers( ent ); // - + ent->health = client->ps.stats[STAT_HEALTH] = client->ps.stats[STAT_MAX_HEALTH]; ent->client->dismemberProbHead = 0; ent->client->dismemberProbArms = 5; @@ -1700,7 +1705,7 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded client->ps.torsoAnim = BOTH_STAND2; client->ps.legsAnim = BOTH_STAND2; - // restore some player data if this is a spawn point with KEEP_REV (spawnflags&1) set... + // restore some player data if this is a spawn point with KEEP_REV (spawnflags&1) set... // if ( eSavedGameJustLoaded == eAUTO || (spawnPoint->spawnflags&1) || // KEEP_PREV @@ -1708,12 +1713,12 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded { Player_RestoreFromPrevLevel(ent); } - - + + /* Ghoul2 Insert Start */ - + if (eSavedGameJustLoaded == eNO) { ent->weaponModel = -1; @@ -1759,7 +1764,7 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded if ( spawnPoint->spawnflags & 64 ) {//player starts with absolutely no weapons ent->client->ps.stats[STAT_WEAPONS] = ( 1 << WP_NONE ); - ent->client->ps.ammo[weaponData[WP_NONE].ammoIndex] = 32000; // checkme + ent->client->ps.ammo[weaponData[WP_NONE].ammoIndex] = 32000; // checkme ent->client->ps.weapon = WP_NONE; ent->client->ps.weaponstate = WEAPON_READY; } @@ -1844,4 +1849,3 @@ void ClientDisconnect( int clientNum ) { } - \ No newline at end of file diff --git a/codeJK2/game/g_cmds.cpp b/codeJK2/game/g_cmds.cpp index 61da7f605f..668e0218c8 100644 --- a/codeJK2/game/g_cmds.cpp +++ b/codeJK2/game/g_cmds.cpp @@ -1,25 +1,28 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - #include "g_local.h" #include "objectives.h" #include "wp_saber.h" diff --git a/codeJK2/game/g_combat.cpp b/codeJK2/game/g_combat.cpp index 0bba6ff585..19066a013d 100644 --- a/codeJK2/game/g_combat.cpp +++ b/codeJK2/game/g_combat.cpp @@ -1,29 +1,30 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // g_combat.c -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - - - #include "g_local.h" #include "b_local.h" #include "g_functions.h" @@ -110,7 +111,7 @@ Toss the weapon and powerups for the killed player */ extern gentity_t *WP_DropThermal( gentity_t *ent ); extern qboolean WP_SaberLose( gentity_t *self, vec3_t throwDir ); -gentity_t *TossClientItems( gentity_t *self ) +gentity_t *TossClientItems( gentity_t *self ) { gentity_t *dropped = NULL; gitem_t *item = NULL; @@ -139,7 +140,7 @@ gentity_t *TossClientItems( gentity_t *self ) self->s.weapon = WP_NONE; if ( weapon == WP_THERMAL && self->client->ps.torsoAnim == BOTH_ATTACK10 ) - {//we were getting ready to throw the thermal, drop it! + {//we were getting ready to throw the thermal, drop it! self->client->ps.weaponChargeTime = level.time - FRAMETIME;//so it just kind of drops it dropped = WP_DropThermal( self ); } @@ -162,7 +163,7 @@ gentity_t *TossClientItems( gentity_t *self ) dropped->count = 0;//no ammo } else - {//FIXME: base this on the NPC's actual amount of ammo he's used up... + {//FIXME: base this on the NPC's actual amount of ammo he's used up... switch ( weapon ) { case WP_BRYAR_PISTOL: @@ -211,17 +212,17 @@ gentity_t *TossClientItems( gentity_t *self ) && weapon != WP_TRIP_MINE && weapon != WP_DET_PACK ) { - gi.G2API_InitGhoul2Model( dropped->ghoul2, item->world_model, G_ModelIndex( item->world_model ), NULL, NULL, 0, 0); + gi.G2API_InitGhoul2Model( dropped->ghoul2, item->world_model, G_ModelIndex( item->world_model ), NULL_HANDLE, NULL_HANDLE, 0, 0); dropped->s.radius = 10; } } } // else if (( self->client->NPC_class == CLASS_SENTRY ) || ( self->client->NPC_class == CLASS_PROBE )) // Looks dumb, Steve told us to take it out. // { -// item = FindItemForAmmo( AMMO_BLASTER ); +// item = FindItemForAmmo( AMMO_BLASTER ); // Drop_Item( self, item, 0, qtrue ); // } - else if ( self->client->NPC_class == CLASS_MARK1 ) + else if ( self->client->NPC_class == CLASS_MARK1 ) { if (Q_irand( 1, 2 )>1) @@ -234,7 +235,7 @@ gentity_t *TossClientItems( gentity_t *self ) } Drop_Item( self, item, 0, qtrue ); } - else if ( self->client->NPC_class == CLASS_MARK2 ) + else if ( self->client->NPC_class == CLASS_MARK2 ) { if (Q_irand( 1, 2 )>1) @@ -286,7 +287,7 @@ ExplodeDeath //FIXME: all hacked up... //void CG_SurfaceExplosion( vec3_t origin, vec3_t normal, float radius, float shake_speed, qboolean smoke ); -void ExplodeDeath( gentity_t *self ) +void ExplodeDeath( gentity_t *self ) { // gentity_t *tent; vec3_t forward; @@ -309,7 +310,7 @@ void ExplodeDeath( gentity_t *self ) // CG_SurfaceExplosion( self->currentOrigin, forward, 20.0f, 12.0f, ((self->spawnflags&4)==qfalse) ); //FIXME: This needs to be consistent to all exploders! // G_Sound(self, self->sounds ); // } - + if(self->splashDamage > 0 && self->splashRadius > 0) { gentity_t *attacker = self; @@ -317,27 +318,27 @@ void ExplodeDeath( gentity_t *self ) { attacker = self->owner; } - G_RadiusDamage( self->currentOrigin, attacker, self->splashDamage, self->splashRadius, + G_RadiusDamage( self->currentOrigin, attacker, self->splashDamage, self->splashRadius, attacker, MOD_UNKNOWN ); } ObjectDie( self, self, self, 20, 0 ); } -void ExplodeDeath_Wait( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath,int dFlags,int hitLoc ) +void ExplodeDeath_Wait( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath,int dFlags,int hitLoc ) { self->e_DieFunc = dieF_NULL; self->nextthink = level.time + Q_irand(100, 500); self->e_ThinkFunc = thinkF_ExplodeDeath; } -void ExplodeDeath( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath,int dFlags,int hitLoc ) +void ExplodeDeath( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath,int dFlags,int hitLoc ) { self->currentOrigin[2] += 16; // me bad for hacking this. should either do it in the effect file or make a custom explode death?? ExplodeDeath( self ); } -void GoExplodeDeath( gentity_t *self, gentity_t *other, gentity_t *activator) +void GoExplodeDeath( gentity_t *self, gentity_t *other, gentity_t *activator) { G_ActivateBehavior(self,BSET_USE); @@ -493,7 +494,7 @@ void G_AlertTeam( gentity_t *victim, gentity_t *attacker, float radius, float so //NOTE: this allows sound alerts to still go through doors/PVS if the teammate is within 128 of the victim... if ( soundDist <= 0 || distSq > sndDistSq ) {//out of sound range - if ( !InFOV( victim, radiusEnts[i], radiusEnts[i]->NPC->stats.hfov, radiusEnts[i]->NPC->stats.vfov ) + if ( !InFOV( victim, radiusEnts[i], radiusEnts[i]->NPC->stats.hfov, radiusEnts[i]->NPC->stats.vfov ) || !NPC_ClearLOS( radiusEnts[i], victim->currentOrigin ) ) {//out of FOV or no LOS continue; @@ -587,8 +588,8 @@ void DeathFX( gentity_t *ent ) effectPos[2] += 50; G_PlayEffect( "probeexplosion1", effectPos ); break; - - case CLASS_ATST: + + case CLASS_ATST: AngleVectors( ent->currentAngles, NULL, right, NULL ); VectorMA( ent->currentOrigin, 20, right, effectPos ); effectPos[2] += 180; @@ -749,8 +750,8 @@ void G_MakeTeamVulnerable( void ) return; } -// for ( i = 0; i < globals.num_entities ; i++, ent++) - for ( i = 0; i < globals.num_entities ; i++) +// for ( i = 0; i < globals.num_entities ; i++, ent++) + for ( i = 0; i < globals.num_entities ; i++) { if(!PInUse(i)) continue; @@ -827,7 +828,7 @@ qboolean G_JediInRoom( vec3_t from ) // if ( !ent ) // { // continue; -// } +// } ent = &g_entities[i]; if ( !ent->NPC ) { @@ -870,16 +871,16 @@ qboolean G_GetHitLocFromSurfName( gentity_t *ent, const char *surfName, int *hit return qfalse; } - if ( ent->client - && ( ent->client->NPC_class == CLASS_R2D2 - || ent->client->NPC_class == CLASS_R5D2 + if ( ent->client + && ( ent->client->NPC_class == CLASS_R2D2 + || ent->client->NPC_class == CLASS_R5D2 || ent->client->NPC_class == CLASS_GONK || ent->client->NPC_class == CLASS_MOUSE || ent->client->NPC_class == CLASS_SEEKER || ent->client->NPC_class == CLASS_INTERROGATOR || ent->client->NPC_class == CLASS_SENTRY || ent->client->NPC_class == CLASS_PROBE ) ) - {//we don't care about per-surface hit-locations or dismemberment for these guys + {//we don't care about per-surface hit-locations or dismemberment for these guys return qfalse; } @@ -971,8 +972,8 @@ qboolean G_GetHitLocFromSurfName( gentity_t *ent, const char *surfName, int *hit return(qfalse); } - //FIXME: check the hitLoc and hitDir against the cap tag for the place - //where the split will be- if the hit dir is roughly perpendicular to + //FIXME: check the hitLoc and hitDir against the cap tag for the place + //where the split will be- if the hit dir is roughly perpendicular to //the direction of the cap, then the split is allowed, otherwise we //hit it at the wrong angle and should not dismember... int actualTime = (cg.time?cg.time:level.time); @@ -987,7 +988,7 @@ qboolean G_GetHitLocFromSurfName( gentity_t *ent, const char *surfName, int *hit VectorSet( angles, 0, ent->currentAngles[YAW], 0 ); if (ent->kneeLBolt>=0) { - gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, ent->kneeLBolt, + gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, ent->kneeLBolt, &boltMatrix, angles, ent->currentOrigin, actualTime, NULL, ent->s.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, tagOrg ); @@ -1000,7 +1001,7 @@ qboolean G_GetHitLocFromSurfName( gentity_t *ent, const char *surfName, int *hit { if (ent->kneeRBolt>=0) { - gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, ent->kneeRBolt, + gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, ent->kneeRBolt, &boltMatrix, angles, ent->currentOrigin, actualTime, NULL, ent->s.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, tagOrg ); @@ -1093,7 +1094,7 @@ qboolean G_GetHitLocFromSurfName( gentity_t *ent, const char *surfName, int *hit VectorSet( angles, 0, ent->currentAngles[YAW], 0 ); if (ent->handRBolt>=0) { - gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, ent->handRBolt, + gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, ent->handRBolt, &boltMatrix, angles, ent->currentOrigin, actualTime, NULL, ent->s.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, tagOrg ); @@ -1115,7 +1116,7 @@ qboolean G_GetHitLocFromSurfName( gentity_t *ent, const char *surfName, int *hit VectorSet( angles, 0, ent->currentAngles[YAW], 0 ); if (ent->handLBolt>=0) { - gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, ent->handLBolt, + gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, ent->handLBolt, &boltMatrix, angles, ent->currentOrigin, actualTime, NULL, ent->s.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, tagOrg ); @@ -1137,7 +1138,7 @@ qboolean G_GetHitLocFromSurfName( gentity_t *ent, const char *surfName, int *hit VectorSet( angles, 0, ent->currentAngles[YAW], 0 ); if (ent->footRBolt>=0) { - gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, ent->footRBolt, + gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, ent->footRBolt, &boltMatrix, angles, ent->currentOrigin, actualTime, NULL, ent->s.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, tagOrg ); @@ -1159,7 +1160,7 @@ qboolean G_GetHitLocFromSurfName( gentity_t *ent, const char *surfName, int *hit VectorSet( angles, 0, ent->currentAngles[YAW], 0 ); if (ent->footLBolt>=0) { - gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, ent->footLBolt, + gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, ent->footLBolt, &boltMatrix, angles, ent->currentOrigin, actualTime, NULL, ent->s.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, tagOrg ); @@ -1251,7 +1252,7 @@ qboolean G_GetHitLocFromSurfName( gentity_t *ent, const char *surfName, int *hit mdxaBone_t boltMatrix; vec3_t tagOrg, tagDir, angles; VectorSet( angles, 0, ent->currentAngles[YAW], 0 ); - gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, tagBolt, + gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, tagBolt, &boltMatrix, angles, ent->currentOrigin, actualTime, NULL, ent->s.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, tagOrg ); @@ -1325,7 +1326,7 @@ int G_GetHitLocation ( gentity_t *target, vec3_t ppoint ) VectorMA(point, hdist - tradius, dir, point); //now a point on the surface of a cylinder with a radius of tradius -*/ +*/ VectorSubtract(point, tcenter, point_dir); VectorNormalize(point_dir); @@ -1598,11 +1599,11 @@ void LimbThink( gentity_t *ent ) // trace a line from the previous position to the current position, // ignoring interactions with the missile owner - gi.trace( &tr, ent->currentOrigin, ent->mins, ent->maxs, origin, + gi.trace( &tr, ent->currentOrigin, ent->mins, ent->maxs, origin, ent->owner ? ent->owner->s.number : ENTITYNUM_NONE, ent->clipmask, G2_NOCOLLIDE, 0 ); VectorCopy( tr.endpos, ent->currentOrigin ); - if ( tr.startsolid ) + if ( tr.startsolid ) { tr.fraction = 0; } @@ -1610,7 +1611,7 @@ void LimbThink( gentity_t *ent ) gi.linkentity( ent ); - if ( tr.fraction != 1 ) + if ( tr.fraction != 1 ) { G_BounceMissile( ent, &tr ); if ( ent->s.pos.trType == TR_STATIONARY ) @@ -1625,9 +1626,9 @@ void LimbThink( gentity_t *ent ) } else {//lay flat - if ( ent->owner - && ent->owner->client - && ent->owner->client->NPC_class == CLASS_PROTOCOL + if ( ent->owner + && ent->owner->client + && ent->owner->client->NPC_class == CLASS_PROTOCOL && ent->count == BOTH_DISMEMBER_TORSO1 ) { if ( ent->currentAngles[0] > 0 || ent->currentAngles[0] < -180 ) @@ -1682,7 +1683,7 @@ void LimbThink( gentity_t *ent ) } } -float hitLocHealthPercentage[HL_MAX] = +float hitLocHealthPercentage[HL_MAX] = { 0.0f, //HL_NONE = 0, 0.05f, //HL_FOOT_RT, @@ -1709,7 +1710,7 @@ float hitLocHealthPercentage[HL_MAX] = 0.0f //HL_GENERIC6 }; -char *hitLocName[HL_MAX] = +char *hitLocName[HL_MAX] = { "none", //HL_NONE = 0, "right foot", //HL_FOOT_RT, @@ -1780,9 +1781,9 @@ qboolean G_LimbLost( gentity_t *ent, int hitLoc ) case HL_CHEST_LT: case HL_BACK_RT: //NOTE: hand falls through - if ( ent->locationDamage[HL_ARM_LT] >= Q3_INFINITE - || ent->locationDamage[HL_CHEST_LT] >= Q3_INFINITE - || ent->locationDamage[HL_BACK_RT] >= Q3_INFINITE + if ( ent->locationDamage[HL_ARM_LT] >= Q3_INFINITE + || ent->locationDamage[HL_CHEST_LT] >= Q3_INFINITE + || ent->locationDamage[HL_BACK_RT] >= Q3_INFINITE || ent->locationDamage[HL_WAIST] >= Q3_INFINITE ) { return qtrue; @@ -1800,9 +1801,9 @@ qboolean G_LimbLost( gentity_t *ent, int hitLoc ) case HL_CHEST_RT: case HL_BACK_LT: //NOTE: hand falls through - if ( ent->locationDamage[HL_ARM_RT] >= Q3_INFINITE - || ent->locationDamage[HL_CHEST_RT] >= Q3_INFINITE - || ent->locationDamage[HL_BACK_LT] >= Q3_INFINITE + if ( ent->locationDamage[HL_ARM_RT] >= Q3_INFINITE + || ent->locationDamage[HL_CHEST_RT] >= Q3_INFINITE + || ent->locationDamage[HL_BACK_LT] >= Q3_INFINITE || ent->locationDamage[HL_WAIST] >= Q3_INFINITE ) { return qtrue; @@ -1830,9 +1831,9 @@ qboolean G_LimbLost( gentity_t *ent, int hitLoc ) } } -static qboolean G_Dismember( gentity_t *ent, vec3_t point, - const char *limbBone, const char *rotateBone, char *limbName, - char *limbCapName, char *stubCapName, char *limbTagName, char *stubTagName, +static qboolean G_Dismember( gentity_t *ent, vec3_t point, + const char *limbBone, const char *rotateBone, char *limbName, + char *limbCapName, char *stubCapName, char *limbTagName, char *stubTagName, int limbAnim, float limbRollBase, float limbPitchBase, int damage, int hitLoc ) { @@ -1898,7 +1899,7 @@ static qboolean G_Dismember( gentity_t *ent, vec3_t point, //FIXME: screws up origin animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; //play the proper dismember anim on the limb - gi.G2API_SetBoneAnim(&limb->ghoul2[limb->playerModel], 0, animations[limbAnim].firstFrame - 1, + gi.G2API_SetBoneAnim(&limb->ghoul2[limb->playerModel], 0, animations[limbAnim].firstFrame - 1, animations[limbAnim].numFrames + animations[limbAnim].firstFrame - 1, BONE_ANIM_OVERRIDE_FREEZE, 1, cg.time); } @@ -1912,7 +1913,7 @@ static qboolean G_Dismember( gentity_t *ent, vec3_t point, //FIXME: screws up origin animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; //play the proper dismember anim on the limb - gi.G2API_SetBoneAnim(&limb->ghoul2[limb->playerModel], 0, animations[limbAnim].firstFrame, + gi.G2API_SetBoneAnim(&limb->ghoul2[limb->playerModel], 0, animations[limbAnim].firstFrame, animations[limbAnim].numFrames + animations[limbAnim].firstFrame, BONE_ANIM_OVERRIDE_FREEZE, 1, cg.time, -1, -1 ); } @@ -1929,7 +1930,7 @@ static qboolean G_Dismember( gentity_t *ent, vec3_t point, vec3_t angles; VectorSet( angles, 0, ent->currentAngles[YAW], 0 ); - gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, newBolt, + gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, newBolt, &boltMatrix, angles, ent->currentOrigin, actualTime, NULL, ent->s.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, limb->s.origin ); @@ -1941,7 +1942,7 @@ static qboolean G_Dismember( gentity_t *ent, vec3_t point, newBolt = gi.G2API_AddBolt( &ent->ghoul2[0], limbBone ); if ( newBolt != -1 ) { - gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, newBolt, + gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, newBolt, &boltMatrix, angles, ent->currentOrigin, actualTime, NULL, ent->s.modelScale ); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, POSITIVE_X, limbF ); @@ -2080,7 +2081,7 @@ static qboolean G_Dismember( gentity_t *ent, vec3_t point, VectorSet( limb->s.angles2, limbPitchBase, 0, limbRollBase ); VectorCopy( limbAngles, limb->s.apos.trBase ); /* - //old way- just set an angle... + //old way- just set an angle... limb->s.apos.trBase[0] += limbPitchBase; limb->s.apos.trBase[1] = ent->client->ps.viewangles[1]; limb->s.apos.trBase[2] += limbRollBase; @@ -2120,7 +2121,7 @@ static qboolean G_Dismember( gentity_t *ent, vec3_t point, //preserve scale so giants don't have tiny limbs VectorCopy( ent->s.modelScale, limb->s.modelScale ); - //mark ent as dismembered + //mark ent as dismembered ent->locationDamage[hitLoc] = Q3_INFINITE;//mark this limb as gone ent->client->dismembered = qtrue; @@ -2171,7 +2172,7 @@ static qboolean G_Dismemberable( gentity_t *self, int hitLoc ) //check probability of this happening on this npc if ( floor((Q_flrand( 1, 100 )*g_dismemberProbabilities->value)) > dismemberProb*2.0f )//probabilities seemed really really low, had to crank them up - { + { return qfalse; } } @@ -2211,11 +2212,11 @@ extern cvar_t *g_iscensored; if ( !g_iscensored->integer && ( g_dismemberment->integer || g_saberRealisticCombat->integer > 1 ) && mod == MOD_SABER )//only lightsaber #endif {//FIXME: don't do strcmps here - if ( G_StandardHumanoid( self->NPC_type ) + if ( G_StandardHumanoid( self->NPC_type ) && (force||g_dismemberProbabilities->value>0.0f||G_Dismemberable2( self, hitLoc )) ) {//either it's a forced dismemberment or we're using probabilities (which are checked before this) or we've done enough damage to this location - //FIXME: check the hitLoc and hitDir against the cap tag for the place - //where the split will be- if the hit dir is roughly perpendicular to + //FIXME: check the hitLoc and hitDir against the cap tag for the place + //where the split will be- if the hit dir is roughly perpendicular to //the direction of the cap, then the split is allowed, otherwise we //hit it at the wrong angle and should not dismember... char *limbBone = NULL, *rotateBone = NULL, *limbName = NULL, *limbCapName = NULL, *stubCapName = NULL, *limbTagName = NULL, *stubTagName = NULL; @@ -2368,7 +2369,7 @@ extern cvar_t *g_iscensored; } if ( doDismemberment ) { - return G_Dismember( self, point, limbBone, rotateBone, limbName, + return G_Dismember( self, point, limbBone, rotateBone, limbName, limbCapName, stubCapName, limbTagName, stubTagName, anim, limbRollBase, limbPitchBase, damage, hitLoc ); } @@ -2900,13 +2901,13 @@ static int G_PickDeathAnim( gentity_t *self, vec3_t point, int damage, int mod, case BOTH_DEAD1: case BOTH_DEATH2: //# Second Death anim case BOTH_DEAD2: - case BOTH_DEATH8: //# + case BOTH_DEATH8: //# case BOTH_DEAD8: - case BOTH_DEATH13: //# + case BOTH_DEATH13: //# case BOTH_DEAD13: - case BOTH_DEATH14: //# + case BOTH_DEATH14: //# case BOTH_DEAD14: - case BOTH_DEATH16: //# + case BOTH_DEATH16: //# case BOTH_DEAD16: case BOTH_DEADBACKWARD1: //# First thrown backward death finished pose case BOTH_DEADBACKWARD2: //# Second thrown backward death finished pose @@ -2926,9 +2927,9 @@ static int G_PickDeathAnim( gentity_t *self, vec3_t point, int damage, int mod, deathAnim = BOTH_DEADFLOP2; break; */ - case BOTH_DEATH10: //# + case BOTH_DEATH10: //# case BOTH_DEAD10: - case BOTH_DEATH15: //# + case BOTH_DEATH15: //# case BOTH_DEAD15: case BOTH_DEADFORWARD1: //# First thrown forward death finished pose case BOTH_DEADFORWARD2: //# Second thrown forward death finished pose @@ -2954,18 +2955,18 @@ static int G_PickDeathAnim( gentity_t *self, vec3_t point, int damage, int mod, case BOTH_DEAD5: //# Fifth Death finished pose case BOTH_DEAD6: //# Sixth Death finished pose case BOTH_DEAD7: //# Seventh Death finished pose - case BOTH_DEAD9: //# + case BOTH_DEAD9: //# case BOTH_DEAD11: //# - case BOTH_DEAD12: //# - case BOTH_DEAD17: //# - case BOTH_DEAD18: //# - case BOTH_DEAD19: //# - case BOTH_DEAD20: //# - case BOTH_DEAD21: //# - case BOTH_DEAD22: //# - case BOTH_DEAD23: //# - case BOTH_DEAD24: //# - case BOTH_DEAD25: //# + case BOTH_DEAD12: //# + case BOTH_DEAD17: //# + case BOTH_DEAD18: //# + case BOTH_DEAD19: //# + case BOTH_DEAD20: //# + case BOTH_DEAD21: //# + case BOTH_DEAD22: //# + case BOTH_DEAD23: //# + case BOTH_DEAD24: //# + case BOTH_DEAD25: //# case BOTH_LYINGDEAD1: //# Killed lying down death finished pose case BOTH_STUMBLEDEAD1: //# Stumble forward death finished pose case BOTH_FALLDEAD1LAND: //# Fall forward and splat death finished pose @@ -2974,18 +2975,18 @@ static int G_PickDeathAnim( gentity_t *self, vec3_t point, int damage, int mod, case BOTH_DEATH5: //# Fifth Death anim case BOTH_DEATH6: //# Sixth Death anim case BOTH_DEATH7: //# Seventh Death anim - case BOTH_DEATH9: //# + case BOTH_DEATH9: //# case BOTH_DEATH11: //# - case BOTH_DEATH12: //# - case BOTH_DEATH17: //# - case BOTH_DEATH18: //# - case BOTH_DEATH19: //# - case BOTH_DEATH20: //# - case BOTH_DEATH21: //# - case BOTH_DEATH22: //# - case BOTH_DEATH23: //# - case BOTH_DEATH24: //# - case BOTH_DEATH25: //# + case BOTH_DEATH12: //# + case BOTH_DEATH17: //# + case BOTH_DEATH18: //# + case BOTH_DEATH19: //# + case BOTH_DEATH20: //# + case BOTH_DEATH21: //# + case BOTH_DEATH22: //# + case BOTH_DEATH23: //# + case BOTH_DEATH24: //# + case BOTH_DEATH25: //# case BOTH_DEATHFORWARD1: //# First Death in which they get thrown forward case BOTH_DEATHFORWARD2: //# Second Death in which they get thrown forward case BOTH_DEATHFORWARD3: //# Second Death in which they get thrown forward @@ -3129,7 +3130,7 @@ static int G_PickDeathAnim( gentity_t *self, vec3_t point, int damage, int mod, { deathAnim = BOTH_DEATH6;//chest right: spin } - else + else { //TEMP HACK: play spinny deaths less often if ( Q_irand( 0, 1 ) ) @@ -3251,7 +3252,7 @@ static int G_PickDeathAnim( gentity_t *self, vec3_t point, int damage, int mod, { deathAnim = BOTH_DEATH15;//chest: roll backward } - else + else { if ( !Q_irand( 0, 1 ) ) { @@ -3353,7 +3354,7 @@ int G_CheckLedgeDive( gentity_t *self, float checkDist, vec3_t checkVel, qboolea G_Throw( self, fallRightDir, 85 ); self->client->ps.velocity[2] = 100; } - else + else { VectorScale( fallRightDir, -1, fallRightDir ); fallDist = G_CheckForLedge( self, fallRightDir, checkDist ); @@ -3385,7 +3386,7 @@ extern void AI_DeleteSelfFromGroup( gentity_t *self ); extern void AI_GroupMemberKilled( gentity_t *self ); extern qboolean FlyingCreature( gentity_t *ent ); extern void G_DrivableATSTDie( gentity_t *self ); -void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath, int dflags, int hitLoc ) +void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath, int dflags, int hitLoc ) { int anim; int contents; @@ -3488,12 +3489,12 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); } else { - if ( (hitLoc != HL_HAND_RT + if ( (hitLoc != HL_HAND_RT || self->client->dismembered || meansOfDeath != MOD_SABER )//if might get hand cut off, leave saber in hand && holdingSaber - && ( Q_irand( 0, 1 ) - || meansOfDeath == MOD_EXPLOSIVE + && ( Q_irand( 0, 1 ) + || meansOfDeath == MOD_EXPLOSIVE || meansOfDeath == MOD_REPEATER_ALT || meansOfDeath == MOD_FLECHETTE_ALT || meansOfDeath == MOD_ROCKET @@ -3580,12 +3581,12 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); lastInGroup = qfalse; } } - if ( !attacker->s.number + if ( !attacker->s.number && holdingSaber - && meansOfDeath == MOD_SABER - && attacker->client - && attacker->client->ps.weapon == WP_SABER - && !attacker->client->ps.saberInFlight + && meansOfDeath == MOD_SABER + && attacker->client + && attacker->client->ps.weapon == WP_SABER + && !attacker->client->ps.saberInFlight && (d_slowmodeath->integer > 2||lastInGroup) )//either slow mo death level 3 (any jedi) or 2 and I was the last jedi in the room {//Matrix! G_StartMatrixEffect( self ); @@ -3593,11 +3594,11 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); } else {//all player-saber kills - if ( !attacker->s.number - && meansOfDeath == MOD_SABER - && attacker->client - && attacker->client->ps.weapon == WP_SABER - && !attacker->client->ps.saberInFlight + if ( !attacker->s.number + && meansOfDeath == MOD_SABER + && attacker->client + && attacker->client->ps.weapon == WP_SABER + && !attacker->client->ps.saberInFlight && (d_slowmodeath->integer > 4||lastInGroup||holdingSaber))//either slow mo death level 5 (any enemy) or 4 and I was the last in my group or I'm a saber user {//Matrix! G_StartMatrixEffect( self ); @@ -3633,18 +3634,18 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); G_MakeTeamVulnerable(); } - if ( attacker && attacker->client) + if ( attacker && attacker->client) { - if ( attacker == self || OnSameTeam (self, attacker ) ) + if ( attacker == self || OnSameTeam (self, attacker ) ) { AddScore( attacker, -1 ); - } - else + } + else { AddScore( attacker, 1 ); } - } - else + } + else { AddScore( self, -1 ); } @@ -3652,9 +3653,9 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); // if client is in a nodrop area, don't drop anything contents = gi.pointcontents( self->currentOrigin, -1 ); if ( !holdingSaber - //&& self->s.number != 0 - && !( contents & CONTENTS_NODROP ) - && meansOfDeath != MOD_SNIPER + //&& self->s.number != 0 + && !( contents & CONTENTS_NODROP ) + && meansOfDeath != MOD_SNIPER && (!self->client||self->client->NPC_class!=CLASS_GALAKMECH)) { TossClientItems( self ); @@ -3717,17 +3718,17 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); self->maxs[2] = -8; } self->clipmask&=~(CONTENTS_MONSTERCLIP|CONTENTS_BOTCLIP);//so dead NPC can fly off ledges - + //FACING========================================================== if ( attacker && self->s.number == 0 ) { self->client->ps.stats[STAT_DEAD_YAW] = AngleNormalize180( self->client->ps.viewangles[YAW] ); } - self->currentAngles[PITCH] = 0; + self->currentAngles[PITCH] = 0; self->currentAngles[ROLL] = 0; if ( self->NPC ) { - self->NPC->desiredYaw = 0; + self->NPC->desiredYaw = 0; self->NPC->desiredPitch = 0; self->NPC->confusionTime = 0; self->NPC->charmedTime = 0; @@ -3908,11 +3909,11 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); { float thrown, dot; vec3_t throwdir, forward; - + AngleVectors(self->currentAngles, forward, NULL, NULL); thrown = VectorNormalize2(self->client->ps.velocity, throwdir); dot = DotProduct(forward, throwdir); - if ( thrown > 100 ) + if ( thrown > 100 ) { if ( dot > 0.3 ) {//falling forward @@ -3956,7 +3957,7 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); } } } - else if ( dot < -0.3 ) + else if ( dot < -0.3 ) { if ( thrown >= 250 && !Q_irand( 0, 3 ) ) { @@ -3991,7 +3992,7 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); break; } } - if ( PM_HasAnimation( self, anim ) ) + if ( PM_HasAnimation( self, anim ) ) { self->client->ps.gravity *= 0.8; self->client->ps.friction = 0; @@ -4003,7 +4004,7 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); else { anim = -1; - } + } } else {//falling to one of the sides @@ -4027,7 +4028,7 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); if ( anim == -1 ) { - if ( meansOfDeath == MOD_ELECTROCUTE + if ( meansOfDeath == MOD_ELECTROCUTE || (meansOfDeath == MOD_CRUSH && self->s.eFlags&EF_FORCE_GRIPPED) ) {//electrocuted or choked to death anim = BOTH_DEATH17; @@ -4059,14 +4060,14 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); self->NPC->timeOfDeath = level.time + 10000; } } - + else if ( meansOfDeath == MOD_SNIPER ) { gentity_t *tent; vec3_t spot; VectorCopy( self->currentOrigin, spot ); - + self->flags |= FL_DISINTEGRATED; self->svFlags |= SVF_BROADCAST; tent = G_TempEntity( spot, EV_DISINTEGRATION ); @@ -4095,9 +4096,9 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); self->NPC->timeOfDeath = level.time + 2000; } } - else + else { - if ( hitLoc == HL_HEAD + if ( hitLoc == HL_HEAD && !(dflags&DAMAGE_RADIUS) && meansOfDeath!=MOD_REPEATER_ALT && meansOfDeath!=MOD_FLECHETTE_ALT @@ -4117,7 +4118,7 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); G_SoundOnEnt( self, CHAN_VOICE, "*jump1.wav" ); } } - else + else { if ( (self->client->ps.eFlags&EF_FORCE_GRIPPED) ) {//killed while gripped - no loud scream @@ -4191,16 +4192,16 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); { deathScript = qtrue; } - + if ( self->NPC && (self->NPC->scriptFlags&SCF_FFDEATH) ) { - if ( G_ActivateBehavior( self, BSET_FFDEATH ) ) + if ( G_ActivateBehavior( self, BSET_FFDEATH ) ) {//FIXME: should running this preclude running the normal deathscript? deathScript = qtrue; } G_UseTargets2( self, self, self->target4 ); } - + if ( !deathScript && !(self->svFlags&SVF_KILLED_SELF) ) { //Should no longer run scripts @@ -4214,7 +4215,7 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); // Set pending objectives to failed OBJ_SetPendingObjectives(self); - + gi.linkentity (self); self->bounceCount = -1; // This is a cheap hack for optimizing the pointcontents check in deadthink @@ -4279,7 +4280,7 @@ void PlayerPain( gentity_t *self, gentity_t *inflictor, gentity_t *other, vec3_t else { // play an apropriate pain sound - if ( level.time > self->painDebounceTime && !(self->flags & FL_GODMODE) ) + if ( level.time > self->painDebounceTime && !(self->flags & FL_GODMODE) ) {//first time hit this frame and not in godmode self->client->ps.damageEvent++; if ( !Q3_TaskIDPending( self, TID_CHAN_VOICE ) ) @@ -4324,10 +4325,11 @@ void PlayerPain( gentity_t *self, gentity_t *inflictor, gentity_t *other, vec3_t G_StartMatrixEffect( self ); } } - if ( parts == SETANIM_BOTH && damage > 30 || (self->painDebounceTime>level.time&&damage>10)) + if ( parts == SETANIM_BOTH && (damage > 30 || (self->painDebounceTime > level.time + && damage > 10)) ) {//took a lot of damage in 1 hit //or took 2 hits in quick succession self->aimDebounceTime = level.time + self->client->ps.torsoAnimTimer; - self->client->ps.pm_time = self->client->ps.torsoAnimTimer; + self->client->ps.pm_time = self->client->ps.torsoAnimTimer; self->client->ps.pm_flags |= PMF_TIME_KNOCKBACK; } self->client->ps.weaponTime = self->client->ps.torsoAnimTimer; @@ -4407,7 +4409,7 @@ int CheckArmor (gentity_t *ent, int damage, int dflags) //Always round up if (damage == 1) { - if ( client->ps.stats[STAT_ARMOR] > 0 ) + if ( client->ps.stats[STAT_ARMOR] > 0 ) client->ps.stats[STAT_ARMOR] -= save; return 0; @@ -4452,9 +4454,9 @@ void G_Knockdown( gentity_t *self, gentity_t *attacker, vec3_t pushDir, float st } G_CheckLedgeDive( self, 72, pushDir, qfalse, qfalse ); - if ( !PM_SpinningSaberAnim( self->client->ps.legsAnim ) - && !PM_FlippingAnim( self->client->ps.legsAnim ) - && !PM_RollingAnim( self->client->ps.legsAnim ) + if ( !PM_SpinningSaberAnim( self->client->ps.legsAnim ) + && !PM_FlippingAnim( self->client->ps.legsAnim ) + && !PM_RollingAnim( self->client->ps.legsAnim ) && !PM_InKnockDown( &self->client->ps ) ) { int knockAnim = BOTH_KNOCKDOWN1;//default knockdown @@ -4609,7 +4611,7 @@ void G_ApplyKnockback( gentity_t *targ, vec3_t newDir, float knockback ) // set the timer so that the other client can't cancel // out the movement immediately - if ( targ->client && !targ->client->ps.pm_time ) + if ( targ->client && !targ->client->ps.pm_time ) { int t; @@ -4655,7 +4657,7 @@ static int G_CheckForLedge( gentity_t *self, vec3_t fallCheckDir, float checkDis static void G_FriendlyFireReaction( gentity_t *self, gentity_t *other, int dflags ) { - if ( (!player->client->ps.viewEntity || other->s.number != player->client->ps.viewEntity)) + if ( (!player->client->ps.viewEntity || other->s.number != player->client->ps.viewEntity)) {//hit by a teammate if ( other != self->enemy && self != other->enemy ) {//we weren't already enemies @@ -4681,7 +4683,7 @@ static void G_FriendlyFireReaction( gentity_t *self, gentity_t *other, int dflag } } -float damageModifier[HL_MAX] = +float damageModifier[HL_MAX] = { 1.0f, //HL_NONE, 0.25f, //HL_FOOT_RT, @@ -4793,7 +4795,7 @@ void G_TrackWeaponUsage( gentity_t *self, gentity_t *inflictor, int add, int mod qboolean G_NonLocationSpecificDamage( int meansOfDeath ) { - if ( meansOfDeath == MOD_EXPLOSIVE + if ( meansOfDeath == MOD_EXPLOSIVE || meansOfDeath == MOD_REPEATER_ALT || meansOfDeath == MOD_FLECHETTE_ALT || meansOfDeath == MOD_ROCKET @@ -4838,7 +4840,7 @@ dflags these flags are used to control how T_Damage works ============ */ -void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_t dir, vec3_t point, int damage, int dflags, int mod, int hitLoc ) +void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_t dir, vec3_t point, int damage, int dflags, int mod, int hitLoc ) { gclient_t *client; int take; @@ -4927,11 +4929,11 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_ damage = 0; } - if ( dir == NULL ) + if ( dir == NULL ) { dflags |= DAMAGE_NO_KNOCKBACK; - } - else + } + else { VectorNormalize2( dir, newDir ); } @@ -4958,7 +4960,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_ if ( client->ps.stats[STAT_ARMOR] > 0 ) {//shields are up dflags &= ~DAMAGE_NO_ARMOR;//always affect armor - if ( mod == MOD_ELECTROCUTE + if ( mod == MOD_ELECTROCUTE || mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT ) {//shield protects us from this @@ -4967,12 +4969,12 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_ } else {//shields down - if ( mod == MOD_MELEE + if ( mod == MOD_MELEE || (mod == MOD_CRUSH && attacker && attacker->client) ) {//Galak takes no impact damage return; } - if ( (dflags & DAMAGE_RADIUS) + if ( (dflags & DAMAGE_RADIUS) || mod == MOD_REPEATER_ALT || mod == MOD_FLECHETTE_ALT || mod == MOD_ROCKET @@ -5022,7 +5024,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_ { knockback *= 2; } - + if ( knockback > 200 ) { knockback = 200; } @@ -5031,7 +5033,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_ { knockback = 0; } - else if ( targ->flags & FL_NO_KNOCKBACK ) + else if ( targ->flags & FL_NO_KNOCKBACK ) { knockback = 0; } @@ -5044,18 +5046,18 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_ knockback = 0; } // figure momentum add, even if the damage won't be taken - if ( knockback && !(dflags&DAMAGE_DEATH_KNOCKBACK) ) //&& targ->client + if ( knockback && !(dflags&DAMAGE_DEATH_KNOCKBACK) ) //&& targ->client { G_ApplyKnockback( targ, newDir, knockback ); G_CheckKnockdown( targ, attacker, newDir, dflags, mod ); } // check for godmode, completely getting out of the damage - if ( targ->flags & FL_GODMODE && !(dflags&DAMAGE_NO_PROTECTION) ) + if ( targ->flags & FL_GODMODE && !(dflags&DAMAGE_NO_PROTECTION) ) { - if ( targ->client - && attacker->client - && targ->client->playerTeam == attacker->client->playerTeam + if ( targ->client + && attacker->client + && targ->client->playerTeam == attacker->client->playerTeam && (!targ->NPC || !targ->NPC->charmedTime) ) {//complain, but don't turn on them G_FriendlyFireReaction( targ, attacker, dflags ); @@ -5065,14 +5067,14 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_ // Check for team damage /* - if ( targ != attacker && !(dflags&DAMAGE_IGNORE_TEAM) && OnSameTeam (targ, attacker) ) + if ( targ != attacker && !(dflags&DAMAGE_IGNORE_TEAM) && OnSameTeam (targ, attacker) ) {//on same team - if ( !targ->client ) + if ( !targ->client ) {//a non-player object should never take damage from an ent on the same team return; } - if ( attacker->client && attacker->client->playerTeam == targ->noDamageTeam ) + if ( attacker->client && attacker->client->playerTeam == targ->noDamageTeam ) {//NPC or player shot an object on his own team return; } @@ -5190,7 +5192,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_ } } } - if ( take || (dflags&DAMAGE_NO_DAMAGE) ) + if ( take || (dflags&DAMAGE_NO_DAMAGE) ) { if ( !targ->client || !attacker->client ) { @@ -5208,7 +5210,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_ } } } - else + else {//two clients team_t targTeam = TEAM_FREE; team_t attackerTeam = TEAM_FREE; @@ -5281,7 +5283,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_ } } //2) NPCs don't take any damage from player during combat - else + else {//an NPC if ( ((dflags & DAMAGE_RADIUS)) && !(dflags&DAMAGE_IGNORE_TEAM) ) {//An NPC got hit by player and this is during combat or it was slash damage @@ -5305,7 +5307,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_ if ( targ->health < 1 ) { G_ActivateBehavior( targ, BSET_DEATH ); - + targ->health = 1; } } @@ -5314,7 +5316,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_ if ( targ->health < 1 ) { G_ActivateBehavior( targ, BSET_DEATH ); - + targ->health = 1; } } @@ -5327,7 +5329,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_ } } } - + if ( yellAtAttacker ) { if ( !targ->NPC || !targ->NPC->charmedTime ) @@ -5342,7 +5344,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_ targ->client->ps.stats[STAT_HEALTH] = targ->health; g_lastClientDamaged = targ; } - + //TEMP HACK FOR PLAYER LOOK AT ENEMY CODE //FIXME: move this to a player pain func? if ( targ->s.number == 0 ) @@ -5381,9 +5383,9 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_ {//he was surrendering, goes down with one hit targ->health = 0; } - if ( targ->health <= 0 ) + if ( targ->health <= 0 ) { - if ( knockback && (dflags&DAMAGE_DEATH_KNOCKBACK) )//&& targ->client + if ( knockback && (dflags&DAMAGE_DEATH_KNOCKBACK) )//&& targ->client {//only do knockback on death if ( mod == MOD_FLECHETTE ) {//special case because this is shotgun-ish damage, we need to multiply the knockback @@ -5421,7 +5423,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_ } GEntity_DieFunc( targ, inflictor, attacker, take, mod, dflags, hitLoc ); } - else + else { GEntity_PainFunc( targ, inflictor, attacker, point, take, mod, hitLoc ); if ( targ->s.number == 0 ) @@ -5460,7 +5462,7 @@ qboolean CanDamage (gentity_t *targ, vec3_t origin) { if (( tr.fraction == 1.0 && !(targ->contents & MASK_SOLID)) || tr.entityNum == targ->s.number ) // if we also test the entitynum's we can bust up bbrushes better! return qtrue; - // this should probably check in the plane of projection, + // this should probably check in the plane of projection, // rather than in world coordinate, and also include Z VectorCopy (midpoint, dest); dest[0] += 15.0; @@ -5550,7 +5552,7 @@ void G_RadiusDamage ( vec3_t origin, gentity_t *attacker, float damage, float ra points = damage * ( 1.0 - dist / radius ); - if (CanDamage (ent, origin)) + if (CanDamage (ent, origin)) {//FIXME: still do a little damage in in PVS and close? if ( ent->svFlags & (SVF_GLASS_BRUSH|SVF_BBRUSH) ) { diff --git a/codeJK2/game/g_functions.cpp b/codeJK2/game/g_functions.cpp index 39e6ee9f19..5a95f8a263 100644 --- a/codeJK2/game/g_functions.cpp +++ b/codeJK2/game/g_functions.cpp @@ -1,31 +1,30 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- g_functions.cpp // -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - - - - // This file contains the 8 (so far) function calls that replace the 8 function ptrs in the gentity_t structure #include "g_local.h" diff --git a/codeJK2/game/g_functions.h b/codeJK2/game/g_functions.h index f5a2c3ac9a..23e94d89df 100644 --- a/codeJK2/game/g_functions.h +++ b/codeJK2/game/g_functions.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- g_functions.h // diff --git a/codeJK2/game/g_fx.cpp b/codeJK2/game/g_fx.cpp index 15c1b52403..791a1e3504 100644 --- a/codeJK2/game/g_fx.cpp +++ b/codeJK2/game/g_fx.cpp @@ -1,25 +1,27 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - #include "g_local.h" #include "g_functions.h" @@ -246,14 +248,14 @@ void SP_fx_runner( gentity_t *ent ) return; } - // Try and associate an effect file, unfortunately we won't know if this worked or not + // Try and associate an effect file, unfortunately we won't know if this worked or not // until the CGAME trys to register it... ent->fxID = G_EffectIndex( ent->fxFile ); ent->s.eType = ET_MOVER; // Give us a bit of time to spawn in the other entities, since we may have to target one of 'em - ent->e_ThinkFunc = thinkF_fx_runner_link; + ent->e_ThinkFunc = thinkF_fx_runner_link; ent->nextthink = level.time + 400; // Save our position and link us up! @@ -273,7 +275,7 @@ This world effect will spawn snow globally into the level. */ //---------------------------------------------------------- void SP_CreateSnow( gentity_t *ent ) -{ +{ char temp[256]; G_SpawnInt( "count", "1000", &ent->count ); @@ -297,7 +299,7 @@ This world effect will spawn rain globally into the level. */ //---------------------------------------------------------- void SP_CreateRain( gentity_t *ent ) -{ +{ char temp[256]; G_SpawnInt( "count", "500", &ent->count ); @@ -336,10 +338,10 @@ void fx_explosion_trail_think( gentity_t *ent ) EvaluateTrajectory( &ent->s.pos, level.time, origin ); - gi.trace( &tr, ent->currentOrigin, vec3_origin, vec3_origin, origin, + gi.trace( &tr, ent->currentOrigin, vec3_origin, vec3_origin, origin, ent->owner ? ent->owner->s.number : ENTITYNUM_NONE, ent->clipmask, G2_RETURNONHIT, 10 ); - if ( tr.fraction < 1.0f ) + if ( tr.fraction < 1.0f ) { // never explode or bounce on sky if ( !( tr.surfaceFlags & SURF_NOIMPACT )) @@ -459,7 +461,7 @@ void fx_explosion_trail_link( gentity_t *ent ) VectorSubtract( target->s.origin, ent->s.origin, dir ); VectorNormalize( dir ); } - else + else { // we are assuming that we have angles, but there are no checks to verify this AngleVectors( ent->s.angles, dir, NULL, NULL ); @@ -522,7 +524,7 @@ void SP_fx_explosion_trail( gentity_t *ent ) } // Give us a bit of time to spawn in the other entities, since we may have to target one of 'em - ent->e_ThinkFunc = thinkF_fx_explosion_trail_link; + ent->e_ThinkFunc = thinkF_fx_explosion_trail_link; ent->nextthink = level.time + 500; // Save our position and link us up! @@ -549,7 +551,7 @@ void fx_target_beam_set_debounce( gentity_t *self ) { self->e_UseFunc = useF_NULL; } - else + else { self->attackDebounceTime = level.time + FRAMETIME + Q_irand( -self->random, self->random ); } @@ -560,18 +562,15 @@ void fx_target_beam_fire( gentity_t *ent ) { trace_t trace; vec3_t dir, org, end; - int ignore; qboolean open; if ( !ent->enemy || !ent->enemy->inuse ) {//info_null most likely - ignore = ent->s.number; ent->enemy = NULL; VectorCopy( ent->s.origin2, org ); } else { - ignore = ent->enemy->s.number; VectorCopy( ent->enemy->currentOrigin, org ); } @@ -674,7 +673,6 @@ void fx_target_beam_link( gentity_t *ent ) { gentity_t *target = NULL; vec3_t dir; - float len; target = G_Find( target, FOFS(targetname), ent->target ); @@ -692,9 +690,9 @@ void fx_target_beam_link( gentity_t *ent ) G_SetEnemy( ent, target ); } VectorSubtract( target->s.origin, ent->s.origin, dir );//er, does it ever use dir? - len = VectorNormalize( dir );//er, does it use len or dir? + VectorNormalize( dir );//er, does it use len or dir? vectoangles( dir, ent->s.angles );//er, does it use s.angles? - + VectorCopy( target->s.origin, ent->s.origin2 ); if ( ent->spawnflags & 1 ) diff --git a/codeJK2/game/g_headers.h b/codeJK2/game/g_headers.h index f81eeaa748..5c3ff0c965 100644 --- a/codeJK2/game/g_headers.h +++ b/codeJK2/game/g_headers.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #pragma once #if !defined(G_HEADERS_H_INC) diff --git a/codeJK2/game/g_icarus.h b/codeJK2/game/g_icarus.h index 6636c0fe5c..89c6a53d9d 100644 --- a/codeJK2/game/g_icarus.h +++ b/codeJK2/game/g_icarus.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __G_ICARUS_H__ #define __G_ICARUS_H__ diff --git a/codeJK2/game/g_inventory.cpp b/codeJK2/game/g_inventory.cpp index 188040d4a7..1adff4898d 100644 --- a/codeJK2/game/g_inventory.cpp +++ b/codeJK2/game/g_inventory.cpp @@ -1,24 +1,27 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -//g_inventory.cpp +// g_inventory.cpp -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" #include "g_local.h" diff --git a/codeJK2/game/g_itemLoad.cpp b/codeJK2/game/g_itemLoad.cpp index f50291f6f1..d5329989b2 100644 --- a/codeJK2/game/g_itemLoad.cpp +++ b/codeJK2/game/g_itemLoad.cpp @@ -1,46 +1,42 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //g_itemLoad.cpp //reads in ext_data\items.dat to bg_itemlist[] -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - - - #include "g_local.h" #include "g_items.h" #define PICKUPSOUND "sound/weapons/w_pkup.wav" //qboolean COM_ParseInt( char **data, int *i ); -//qboolean COM_ParseString( char **data, char **s ); +//qboolean COM_ParseString( char **data, char **s ); //qboolean COM_ParseFloat( char **data, float *f ); extern gitem_t bg_itemlist[]; -struct -{ - int itemNum; -} itemParms; - +static int itemNum; static void IT_ClassName (const char **holdBuf); static void IT_Count (const char **holdBuf); @@ -53,624 +49,596 @@ static void IT_Tag (const char **holdBuf); static void IT_Type (const char **holdBuf); static void IT_WorldModel (const char **holdBuf); - -typedef struct -{ - const char *parmName; - void (*func)(const char **holdBuf); +typedef struct itemParms_s { + const char *parmName; + void (*func)(const char **holdBuf); } itemParms_t; - #define IT_PARM_MAX 10 -itemParms_t ItemParms[IT_PARM_MAX] = -{ - { "itemname", IT_Name }, - { "classname", IT_ClassName }, - { "count", IT_Count }, - { "icon", IT_Icon }, - { "min", IT_Min }, - { "max", IT_Max }, - { "pickupsound", IT_PickupSound }, - { "tag", IT_Tag }, - { "type", IT_Type }, - { "worldmodel", IT_WorldModel }, +itemParms_t ItemParms[IT_PARM_MAX] = { + { "itemname", IT_Name }, + { "classname", IT_ClassName }, + { "count", IT_Count }, + { "icon", IT_Icon }, + { "min", IT_Min }, + { "max", IT_Max }, + { "pickupsound", IT_PickupSound }, + { "tag", IT_Tag }, + { "type", IT_Type }, + { "worldmodel", IT_WorldModel }, }; -static void IT_SetDefaults() -{ - - bg_itemlist[itemParms.itemNum].mins[0] = -16; - bg_itemlist[itemParms.itemNum].mins[1] = -16; - bg_itemlist[itemParms.itemNum].mins[2] = -2; +static void IT_SetDefaults( void ) { + bg_itemlist[itemNum].mins[0] = -16; + bg_itemlist[itemNum].mins[1] = -16; + bg_itemlist[itemNum].mins[2] = -2; - bg_itemlist[itemParms.itemNum].maxs[0] = 16; - bg_itemlist[itemParms.itemNum].maxs[1] = 16; - bg_itemlist[itemParms.itemNum].maxs[2] = 16; + bg_itemlist[itemNum].maxs[0] = 16; + bg_itemlist[itemNum].maxs[1] = 16; + bg_itemlist[itemNum].maxs[2] = 16; - - bg_itemlist[itemParms.itemNum].pickup_sound = PICKUPSOUND; //give it a default sound - bg_itemlist[itemParms.itemNum].precaches = NULL; - bg_itemlist[itemParms.itemNum].sounds = NULL; + bg_itemlist[itemNum].pickup_sound = PICKUPSOUND; //give it a default sound + bg_itemlist[itemNum].precaches = NULL; + bg_itemlist[itemNum].sounds = NULL; } -static void IT_Name(const char **holdBuf) -{ - int itemNum; - const char *tokenStr; +static void IT_Name( const char **holdBuf ) { + const char *tokenStr; - if (COM_ParseString(holdBuf,&tokenStr)) - { + if ( COM_ParseString( holdBuf, &tokenStr ) ) { return; } - - if (!Q_stricmp(tokenStr,"ITM_NONE")) + if ( !Q_stricmp( tokenStr, "ITM_NONE" ) ) { itemNum = ITM_NONE; - else if (!Q_stricmp(tokenStr,"ITM_STUN_BATON_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_STUN_BATON_PICKUP" ) ) { itemNum = ITM_STUN_BATON_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_SABER_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_SABER_PICKUP" ) ) { itemNum = ITM_SABER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_BRYAR_PISTOL_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_BRYAR_PISTOL_PICKUP" ) ) { itemNum = ITM_BRYAR_PISTOL_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_BLASTER_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_BLASTER_PICKUP" ) ) { itemNum = ITM_BLASTER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_DISRUPTOR_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_DISRUPTOR_PICKUP" ) ) { itemNum = ITM_DISRUPTOR_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_BOWCASTER_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_BOWCASTER_PICKUP" ) ) { itemNum = ITM_BOWCASTER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_REPEATER_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_REPEATER_PICKUP" ) ) { itemNum = ITM_REPEATER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_DEMP2_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_DEMP2_PICKUP" ) ) { itemNum = ITM_DEMP2_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_FLECHETTE_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_FLECHETTE_PICKUP" ) ) { itemNum = ITM_FLECHETTE_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_ROCKET_LAUNCHER_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_ROCKET_LAUNCHER_PICKUP" ) ) { itemNum = ITM_ROCKET_LAUNCHER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_THERMAL_DET_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_THERMAL_DET_PICKUP" ) ) { itemNum = ITM_THERMAL_DET_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_TRIP_MINE_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_TRIP_MINE_PICKUP" ) ) { itemNum = ITM_TRIP_MINE_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_DET_PACK_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_DET_PACK_PICKUP" ) ) { itemNum = ITM_DET_PACK_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_BOT_LASER_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_BOT_LASER_PICKUP" ) ) { itemNum = ITM_BOT_LASER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_EMPLACED_GUN_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_EMPLACED_GUN_PICKUP" ) ) { itemNum = ITM_EMPLACED_GUN_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_TURRET_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_TURRET_PICKUP" ) ) { itemNum = ITM_TURRET_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_MELEE")) + } + else if ( !Q_stricmp( tokenStr, "ITM_MELEE" ) ) { itemNum = ITM_MELEE; - else if (!Q_stricmp(tokenStr,"ITM_ATST_MAIN_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_ATST_MAIN_PICKUP" ) ) { itemNum = ITM_ATST_MAIN_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_ATST_SIDE_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_ATST_SIDE_PICKUP" ) ) { itemNum = ITM_ATST_SIDE_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_TIE_FIGHTER_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_TIE_FIGHTER_PICKUP" ) ) { itemNum = ITM_TIE_FIGHTER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_RAPID_FIRE_CONC_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_RAPID_FIRE_CONC_PICKUP" ) ) { itemNum = ITM_RAPID_FIRE_CONC_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_AMMO_FORCE_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_AMMO_FORCE_PICKUP" ) ) { itemNum = ITM_AMMO_FORCE_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_AMMO_BLASTER_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_AMMO_BLASTER_PICKUP" ) ) { itemNum = ITM_AMMO_BLASTER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_AMMO_POWERCELL_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_AMMO_POWERCELL_PICKUP" ) ) { itemNum = ITM_AMMO_POWERCELL_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_AMMO_METAL_BOLTS_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_AMMO_METAL_BOLTS_PICKUP" ) ) { itemNum = ITM_AMMO_METAL_BOLTS_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_AMMO_ROCKETS_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_AMMO_ROCKETS_PICKUP" ) ) { itemNum = ITM_AMMO_ROCKETS_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_AMMO_EMPLACED_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_AMMO_EMPLACED_PICKUP" ) ) { itemNum = ITM_AMMO_EMPLACED_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_AMMO_THERMAL_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_AMMO_THERMAL_PICKUP" ) ) { itemNum = ITM_AMMO_THERMAL_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_AMMO_TRIPMINE_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_AMMO_TRIPMINE_PICKUP" ) ) { itemNum = ITM_AMMO_TRIPMINE_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_AMMO_DETPACK_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_AMMO_DETPACK_PICKUP" ) ) { itemNum = ITM_AMMO_DETPACK_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_FORCE_HEAL_PICKUP")) - { + } + else if ( !Q_stricmp( tokenStr, "ITM_FORCE_HEAL_PICKUP" ) ) { itemNum = ITM_FORCE_HEAL_PICKUP; } - else if (!Q_stricmp(tokenStr,"ITM_FORCE_LEVITATION_PICKUP")) - { + else if ( !Q_stricmp( tokenStr, "ITM_FORCE_LEVITATION_PICKUP" ) ) { itemNum = ITM_FORCE_LEVITATION_PICKUP; } - else if (!Q_stricmp(tokenStr,"ITM_FORCE_SPEED_PICKUP")) - { + else if ( !Q_stricmp( tokenStr, "ITM_FORCE_SPEED_PICKUP" ) ) { itemNum = ITM_FORCE_SPEED_PICKUP; } - else if (!Q_stricmp(tokenStr,"ITM_FORCE_PUSH_PICKUP")) - { + else if ( !Q_stricmp( tokenStr, "ITM_FORCE_PUSH_PICKUP" ) ) { itemNum = ITM_FORCE_PUSH_PICKUP; } - else if (!Q_stricmp(tokenStr,"ITM_FORCE_PULL_PICKUP")) - { + else if ( !Q_stricmp( tokenStr, "ITM_FORCE_PULL_PICKUP" ) ) { itemNum = ITM_FORCE_PULL_PICKUP; } - else if (!Q_stricmp(tokenStr,"ITM_FORCE_TELEPATHY_PICKUP")) - { + else if ( !Q_stricmp( tokenStr, "ITM_FORCE_TELEPATHY_PICKUP" ) ) { itemNum = ITM_FORCE_TELEPATHY_PICKUP; } - else if (!Q_stricmp(tokenStr,"ITM_FORCE_GRIP_PICKUP")) - { + else if ( !Q_stricmp( tokenStr, "ITM_FORCE_GRIP_PICKUP" ) ) { itemNum = ITM_FORCE_GRIP_PICKUP; } - else if (!Q_stricmp(tokenStr,"ITM_FORCE_LIGHTNING_PICKUP")) - { + else if ( !Q_stricmp( tokenStr, "ITM_FORCE_LIGHTNING_PICKUP" ) ) { itemNum = ITM_FORCE_LIGHTNING_PICKUP; } - else if (!Q_stricmp(tokenStr,"ITM_FORCE_SABERTHROW_PICKUP")) - { + else if ( !Q_stricmp( tokenStr, "ITM_FORCE_SABERTHROW_PICKUP" ) ) { itemNum = ITM_FORCE_SABERTHROW_PICKUP; } - else if (!Q_stricmp(tokenStr,"ITM_BATTERY_PICKUP")) - { + else if ( !Q_stricmp( tokenStr, "ITM_BATTERY_PICKUP" ) ) { itemNum = ITM_BATTERY_PICKUP; } - else if (!Q_stricmp(tokenStr,"ITM_SEEKER_PICKUP")) + else if ( !Q_stricmp( tokenStr, "ITM_SEEKER_PICKUP" ) ) { itemNum = ITM_SEEKER_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_SHIELD_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_SHIELD_PICKUP" ) ) { itemNum = ITM_SHIELD_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_BACTA_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_BACTA_PICKUP" ) ) { itemNum = ITM_BACTA_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_DATAPAD_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_DATAPAD_PICKUP" ) ) { itemNum = ITM_DATAPAD_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_BINOCULARS_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_BINOCULARS_PICKUP" ) ) { itemNum = ITM_BINOCULARS_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_SENTRY_GUN_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_SENTRY_GUN_PICKUP" ) ) { itemNum = ITM_SENTRY_GUN_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_LA_GOGGLES_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_LA_GOGGLES_PICKUP" ) ) { itemNum = ITM_LA_GOGGLES_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_BLASTER_PISTOL_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_BLASTER_PISTOL_PICKUP" ) ) { itemNum = ITM_BLASTER_PISTOL_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_MEDPAK_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_MEDPAK_PICKUP" ) ) { itemNum = ITM_MEDPAK_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_SHIELD_SM_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_SHIELD_SM_PICKUP" ) ) { itemNum = ITM_SHIELD_SM_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_SHIELD_LRG_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_SHIELD_LRG_PICKUP" ) ) { itemNum = ITM_SHIELD_LRG_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_GOODIE_KEY_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_GOODIE_KEY_PICKUP" ) ) { itemNum = ITM_GOODIE_KEY_PICKUP; - else if (!Q_stricmp(tokenStr,"ITM_SECURITY_KEY_PICKUP")) + } + else if ( !Q_stricmp( tokenStr, "ITM_SECURITY_KEY_PICKUP" ) ) { itemNum = ITM_SECURITY_KEY_PICKUP; - else - { + } + else { itemNum = 0; - gi.Printf("WARNING: bad itemname in external item data '%s'\n", tokenStr); + gi.Printf( "WARNING: bad itemname in external item data '%s'\n", tokenStr ); } - itemParms.itemNum = itemNum; -// ++bg_numItems; - IT_SetDefaults(); } -static void IT_ClassName(const char **holdBuf) -{ +static void IT_ClassName( const char **holdBuf ) { int len; - const char *tokenStr; + const char *tokenStr; - if (COM_ParseString(holdBuf,&tokenStr)) - { + if ( COM_ParseString( holdBuf, &tokenStr ) ) { return; } - len = strlen(tokenStr); - len++; - if (len > 32) - { + len = strlen( tokenStr ) + 1; + if ( len > 32 ) { len = 32; - gi.Printf("WARNING: weaponclass too long in external ITEMS.DAT '%s'\n", tokenStr); + gi.Printf( "WARNING: weaponclass too long in external ITEMS.DAT '%s'\n", tokenStr ); } - bg_itemlist[itemParms.itemNum].classname = G_NewString(tokenStr); - -// Q_strncpyz(bg_itemlist[itemParms.itemNum].classname,tokenStr,len); - + bg_itemlist[itemNum].classname = G_NewString( tokenStr ); } -static void IT_WorldModel(const char **holdBuf) -{ +static void IT_WorldModel( const char **holdBuf ) { int len; - const char *tokenStr; + const char *tokenStr; - if (COM_ParseString(holdBuf,&tokenStr)) - { + if ( COM_ParseString( holdBuf, &tokenStr ) ) { return; } - len = strlen(tokenStr); - len++; - if (len > 64) - { + len = strlen( tokenStr ) + 1; + if ( len > 64 ) { len = 64; - gi.Printf("WARNING: world model too long in external ITEMS.DAT '%s'\n", tokenStr); + gi.Printf( "WARNING: world model too long in external ITEMS.DAT '%s'\n", tokenStr ); } - bg_itemlist[itemParms.itemNum].world_model = G_NewString(tokenStr); - -// Q_strncpyz(bg_itemlist[itemParms.itemNum].world_model[0],tokenStr,len); - + bg_itemlist[itemNum].world_model = G_NewString( tokenStr ); } -static void IT_Tag(const char **holdBuf) -{ +static void IT_Tag( const char **holdBuf ) { int tag; - const char *tokenStr; + const char *tokenStr; - if (COM_ParseString(holdBuf,&tokenStr)) - { + if ( COM_ParseString( holdBuf, &tokenStr ) ) { return; } - if (!Q_stricmp(tokenStr,"WP_NONE")) + if ( !Q_stricmp( tokenStr, "WP_NONE" ) ) { tag = WP_NONE; - else if (!Q_stricmp(tokenStr,"WP_STUN_BATON")) + } + else if ( !Q_stricmp( tokenStr,"WP_STUN_BATON" ) ) { tag = WP_STUN_BATON; - else if (!Q_stricmp(tokenStr,"WP_SABER")) + } + else if ( !Q_stricmp( tokenStr,"WP_SABER" ) ) { tag = WP_SABER; - else if (!Q_stricmp(tokenStr,"WP_BRYAR_PISTOL")) + } + else if ( !Q_stricmp( tokenStr,"WP_BRYAR_PISTOL" ) ) { tag = WP_BRYAR_PISTOL; - else if (!Q_stricmp(tokenStr,"WP_BLASTER")) + } + else if ( !Q_stricmp( tokenStr,"WP_BLASTER" ) ) { tag = WP_BLASTER; - else if (!Q_stricmp(tokenStr,"WP_DISRUPTOR")) + } + else if ( !Q_stricmp( tokenStr,"WP_DISRUPTOR" ) ) { tag = WP_DISRUPTOR; - else if (!Q_stricmp(tokenStr,"WP_BOWCASTER")) + } + else if ( !Q_stricmp( tokenStr,"WP_BOWCASTER" ) ) { tag = WP_BOWCASTER; - else if (!Q_stricmp(tokenStr,"WP_REPEATER")) + } + else if ( !Q_stricmp( tokenStr,"WP_REPEATER" ) ) { tag = WP_REPEATER; - else if (!Q_stricmp(tokenStr,"WP_DEMP2")) + } + else if ( !Q_stricmp( tokenStr,"WP_DEMP2" ) ) { tag = WP_DEMP2; - else if (!Q_stricmp(tokenStr,"WP_FLECHETTE")) + } + else if ( !Q_stricmp( tokenStr,"WP_FLECHETTE" ) ) { tag = WP_FLECHETTE; - else if (!Q_stricmp(tokenStr,"WP_ROCKET_LAUNCHER")) + } + else if ( !Q_stricmp( tokenStr,"WP_ROCKET_LAUNCHER" ) ) { tag = WP_ROCKET_LAUNCHER; - else if (!Q_stricmp(tokenStr,"WP_THERMAL")) + } + else if ( !Q_stricmp( tokenStr,"WP_THERMAL" ) ) { tag = WP_THERMAL; - else if (!Q_stricmp(tokenStr,"WP_TRIP_MINE")) + } + else if ( !Q_stricmp( tokenStr,"WP_TRIP_MINE" ) ) { tag = WP_TRIP_MINE; - else if (!Q_stricmp(tokenStr,"WP_DET_PACK")) + } + else if ( !Q_stricmp( tokenStr,"WP_DET_PACK" ) ) { tag = WP_DET_PACK; -// else if (!Q_stricmp(tokenStr,"WP_TRICORDER")) -// tag = WP_TRICORDER; - else if (!Q_stricmp(tokenStr,"WP_BOT_LASER")) + } + else if ( !Q_stricmp( tokenStr,"WP_BOT_LASER" ) ) { tag = WP_BOT_LASER; - else if (!Q_stricmp(tokenStr,"WP_EMPLACED_GUN")) + } + else if ( !Q_stricmp( tokenStr,"WP_EMPLACED_GUN" ) ) { tag = WP_EMPLACED_GUN; - else if (!Q_stricmp(tokenStr,"WP_MELEE")) + } + else if ( !Q_stricmp( tokenStr,"WP_MELEE" ) ) { tag = WP_MELEE; - else if (!Q_stricmp(tokenStr,"WP_TURRET")) + } + else if ( !Q_stricmp( tokenStr,"WP_TURRET" ) ) { tag = WP_TURRET; - else if (!Q_stricmp(tokenStr,"WP_ATST_MAIN")) + } + else if ( !Q_stricmp( tokenStr,"WP_ATST_MAIN" ) ) { tag = WP_ATST_MAIN; - else if (!Q_stricmp(tokenStr,"WP_ATST_SIDE")) + } + else if ( !Q_stricmp( tokenStr,"WP_ATST_SIDE" ) ) { tag = WP_ATST_SIDE; - else if (!Q_stricmp(tokenStr,"WP_TIE_FIGHTER")) + } + else if ( !Q_stricmp( tokenStr,"WP_TIE_FIGHTER" ) ) { tag = WP_TIE_FIGHTER; - else if (!Q_stricmp(tokenStr,"WP_RAPID_FIRE_CONC")) + } + else if ( !Q_stricmp( tokenStr,"WP_RAPID_FIRE_CONC" ) ) { tag = WP_RAPID_FIRE_CONC; - else if (!Q_stricmp(tokenStr,"WP_BLASTER_PISTOL")) + } + else if ( !Q_stricmp( tokenStr,"WP_BLASTER_PISTOL" ) ) { tag = WP_BLASTER_PISTOL; - else if (!Q_stricmp(tokenStr,"AMMO_FORCE")) + } + else if ( !Q_stricmp( tokenStr,"AMMO_FORCE" ) ) { tag = AMMO_FORCE; - else if (!Q_stricmp(tokenStr,"AMMO_BLASTER")) + } + else if ( !Q_stricmp( tokenStr,"AMMO_BLASTER" ) ) { tag = AMMO_BLASTER; - else if (!Q_stricmp(tokenStr,"AMMO_POWERCELL")) + } + else if ( !Q_stricmp( tokenStr,"AMMO_POWERCELL" ) ) { tag = AMMO_POWERCELL; - else if (!Q_stricmp(tokenStr,"AMMO_METAL_BOLTS")) + } + else if ( !Q_stricmp( tokenStr,"AMMO_METAL_BOLTS" ) ) { tag = AMMO_METAL_BOLTS; - else if (!Q_stricmp(tokenStr,"AMMO_ROCKETS")) + } + else if ( !Q_stricmp( tokenStr,"AMMO_ROCKETS" ) ) { tag = AMMO_ROCKETS; - else if (!Q_stricmp(tokenStr,"AMMO_EMPLACED")) + } + else if ( !Q_stricmp( tokenStr,"AMMO_EMPLACED" ) ) { tag = AMMO_EMPLACED; - else if (!Q_stricmp(tokenStr,"AMMO_THERMAL")) + } + else if ( !Q_stricmp( tokenStr,"AMMO_THERMAL" ) ) { tag = AMMO_THERMAL; - else if (!Q_stricmp(tokenStr,"AMMO_TRIPMINE")) + } + else if ( !Q_stricmp( tokenStr,"AMMO_TRIPMINE" ) ) { tag = AMMO_TRIPMINE; - else if (!Q_stricmp(tokenStr,"AMMO_DETPACK")) + } + else if ( !Q_stricmp( tokenStr,"AMMO_DETPACK" ) ) { tag = AMMO_DETPACK; - else if (!Q_stricmp(tokenStr,"FP_HEAL")) - { + } + else if ( !Q_stricmp( tokenStr,"FP_HEAL" ) ) { tag = FP_HEAL; } - else if (!Q_stricmp(tokenStr,"FP_LEVITATION")) - { + else if ( !Q_stricmp( tokenStr,"FP_LEVITATION" ) ) { tag = FP_LEVITATION; } - else if (!Q_stricmp(tokenStr,"FP_SPEED")) - { + else if ( !Q_stricmp( tokenStr,"FP_SPEED" ) ) { tag = FP_SPEED; } - else if (!Q_stricmp(tokenStr,"FP_PUSH")) - { + else if ( !Q_stricmp( tokenStr,"FP_PUSH" ) ) { tag = FP_PUSH; } - else if (!Q_stricmp(tokenStr,"FP_PULL")) - { + else if ( !Q_stricmp( tokenStr,"FP_PULL" ) ) { tag = FP_PULL; } - else if (!Q_stricmp(tokenStr,"FP_TELEPATHY")) - { + else if ( !Q_stricmp( tokenStr,"FP_TELEPATHY" ) ) { tag = FP_TELEPATHY; } - else if (!Q_stricmp(tokenStr,"FP_GRIP")) - { + else if ( !Q_stricmp( tokenStr,"FP_GRIP" ) ) { tag = FP_GRIP; } - else if (!Q_stricmp(tokenStr,"FP_LIGHTNING")) - { + else if ( !Q_stricmp( tokenStr,"FP_LIGHTNING" ) ) { tag = FP_LIGHTNING; } - else if (!Q_stricmp(tokenStr,"FP_SABERTHROW")) - { + else if ( !Q_stricmp( tokenStr,"FP_SABERTHROW" ) ) { tag = FP_SABERTHROW; } - else if (!Q_stricmp(tokenStr,"ITM_BATTERY_PICKUP")) - { + else if ( !Q_stricmp( tokenStr,"ITM_BATTERY_PICKUP" ) ) { tag = ITM_BATTERY_PICKUP; } - else if (!Q_stricmp(tokenStr,"INV_SEEKER")) - { + else if ( !Q_stricmp( tokenStr,"INV_SEEKER" ) ) { tag = INV_SEEKER; } - else if (!Q_stricmp(tokenStr,"ITM_SHIELD_PICKUP")) - { + else if ( !Q_stricmp( tokenStr,"ITM_SHIELD_PICKUP" ) ) { tag = ITM_SHIELD_PICKUP; } - else if (!Q_stricmp(tokenStr,"INV_BACTA_CANISTER")) - { + else if ( !Q_stricmp( tokenStr,"INV_BACTA_CANISTER" ) ) { tag = INV_BACTA_CANISTER; } - else if (!Q_stricmp(tokenStr,"ITM_DATAPAD_PICKUP")) - { + else if ( !Q_stricmp( tokenStr,"ITM_DATAPAD_PICKUP" ) ) { tag = ITM_DATAPAD_PICKUP; } - else if (!Q_stricmp(tokenStr,"INV_ELECTROBINOCULARS")) - { + else if ( !Q_stricmp( tokenStr,"INV_ELECTROBINOCULARS" ) ) { tag = INV_ELECTROBINOCULARS; } - else if (!Q_stricmp(tokenStr,"INV_SENTRY")) - { + else if ( !Q_stricmp( tokenStr,"INV_SENTRY" ) ) { tag = INV_SENTRY; } - else if (!Q_stricmp(tokenStr,"INV_LIGHTAMP_GOGGLES")) - { + else if ( !Q_stricmp( tokenStr,"INV_LIGHTAMP_GOGGLES" ) ) { tag = INV_LIGHTAMP_GOGGLES; } - else if (!Q_stricmp(tokenStr,"INV_GOODIE_KEY")) - { + else if ( !Q_stricmp( tokenStr,"INV_GOODIE_KEY" ) ) { tag = INV_GOODIE_KEY; } - else if (!Q_stricmp(tokenStr,"INV_SECURITY_KEY")) - { + else if ( !Q_stricmp( tokenStr,"INV_SECURITY_KEY" ) ) { tag = INV_SECURITY_KEY; } - else if (!Q_stricmp(tokenStr,"ITM_MEDPAK_PICKUP")) - { + else if ( !Q_stricmp( tokenStr,"ITM_MEDPAK_PICKUP" ) ) { tag = ITM_MEDPAK_PICKUP; } - else if (!Q_stricmp(tokenStr,"ITM_SHIELD_SM_PICKUP")) - { + else if ( !Q_stricmp( tokenStr,"ITM_SHIELD_SM_PICKUP" ) ) { tag = ITM_SHIELD_SM_PICKUP; } - else if (!Q_stricmp(tokenStr,"ITM_SHIELD_LRG_PICKUP")) - { + else if ( !Q_stricmp( tokenStr,"ITM_SHIELD_LRG_PICKUP" ) ) { tag = ITM_SHIELD_LRG_PICKUP; } - else - { + else { tag = WP_BRYAR_PISTOL; - gi.Printf("WARNING: bad tagname in external item data '%s'\n", tokenStr); + gi.Printf( "WARNING: bad tagname in external item data '%s'\n", tokenStr ); } - bg_itemlist[itemParms.itemNum].giTag = tag; + bg_itemlist[itemNum].giTag = tag; } -static void IT_Type(const char **holdBuf) -{ +static void IT_Type( const char **holdBuf ) { int type; - const char *tokenStr; + const char *tokenStr; - if (COM_ParseString(holdBuf,&tokenStr)) - { + if ( COM_ParseString( holdBuf, &tokenStr ) ) { return; } - if (!Q_stricmp(tokenStr,"IT_BAD")) + if ( !Q_stricmp( tokenStr, "IT_BAD" ) ) { type = IT_BAD; - else if (!Q_stricmp(tokenStr,"IT_WEAPON")) + } + else if ( !Q_stricmp( tokenStr, "IT_WEAPON" ) ) { type = IT_WEAPON; - else if (!Q_stricmp(tokenStr,"IT_AMMO")) + } + else if ( !Q_stricmp( tokenStr, "IT_AMMO" ) ) { type = IT_AMMO; - else if (!Q_stricmp(tokenStr,"IT_ARMOR")) + } + else if ( !Q_stricmp( tokenStr, "IT_ARMOR" ) ) { type = IT_ARMOR; - else if (!Q_stricmp(tokenStr,"IT_HEALTH")) + } + else if ( !Q_stricmp( tokenStr, "IT_HEALTH" ) ) { type = IT_HEALTH; - else if (!Q_stricmp(tokenStr,"IT_HOLDABLE")) + } + else if ( !Q_stricmp( tokenStr, "IT_HOLDABLE" ) ) { type = IT_HOLDABLE; - else if (!Q_stricmp(tokenStr,"IT_BATTERY")) + } + else if ( !Q_stricmp( tokenStr, "IT_BATTERY" ) ) { type = IT_BATTERY; - else if (!Q_stricmp(tokenStr,"IT_HOLOCRON")) + } + else if ( !Q_stricmp( tokenStr, "IT_HOLOCRON" ) ) { type = IT_HOLOCRON; - else - { + } + else { type = IT_BAD; - gi.Printf("WARNING: bad itemname in external item data '%s'\n", tokenStr); + gi.Printf( "WARNING: bad itemname in external item data '%s'\n", tokenStr ); } - bg_itemlist[itemParms.itemNum].giType = (itemType_t) type; - + bg_itemlist[itemNum].giType = (itemType_t)type; } -static void IT_Icon(const char **holdBuf) -{ +static void IT_Icon( const char **holdBuf ) { int len; - const char *tokenStr; + const char *tokenStr; - if (COM_ParseString(holdBuf,&tokenStr)) - { + if ( COM_ParseString( holdBuf, &tokenStr ) ) { return; } - len = strlen(tokenStr); - len++; - if (len > 32) - { + len = strlen( tokenStr ) + 1; + if ( len > 32 ) { len = 32; - gi.Printf("WARNING: icon too long in external ITEMS.DAT '%s'\n", tokenStr); + gi.Printf( "WARNING: icon too long in external ITEMS.DAT '%s'\n", tokenStr ); } - bg_itemlist[itemParms.itemNum].icon = G_NewString(tokenStr); + bg_itemlist[itemNum].icon = G_NewString( tokenStr ); } -static void IT_Count(const char **holdBuf) -{ - int tokenInt; +static void IT_Count( const char **holdBuf ) { + int tokenInt; - if ( COM_ParseInt(holdBuf,&tokenInt)) - { - SkipRestOfLine(holdBuf); + if ( COM_ParseInt( holdBuf, &tokenInt ) ) { + SkipRestOfLine( holdBuf ); return; } - if ((tokenInt < 0) || (tokenInt > 1000 )) // FIXME :What are the right values? - { - gi.Printf("WARNING: bad Count in external item data '%d'\n", tokenInt); + if ( tokenInt < 0 || tokenInt > 1000 ) { + gi.Printf( "WARNING: bad Count in external item data '%d'\n", tokenInt ); return; } - bg_itemlist[itemParms.itemNum].quantity = tokenInt; - + bg_itemlist[itemNum].quantity = tokenInt; } +static void IT_Min( const char **holdBuf ) { + int tokenInt; -static void IT_Min(const char **holdBuf) -{ - int tokenInt; - int i; - - for (i=0;i<3;++i) - { - if ( COM_ParseInt(holdBuf,&tokenInt)) - { - SkipRestOfLine(holdBuf); + for ( int i = 0; i < 3; i++ ) { + if ( COM_ParseInt( holdBuf, &tokenInt ) ) { + SkipRestOfLine( holdBuf ); return; } - - bg_itemlist[itemParms.itemNum].mins[i] = tokenInt; + bg_itemlist[itemNum].mins[i] = tokenInt; } - } -static void IT_Max(const char **holdBuf) -{ - int tokenInt; - int i; +static void IT_Max( const char **holdBuf ) { + int tokenInt; - for (i=0;i<3;++i) - { - if ( COM_ParseInt(holdBuf,&tokenInt)) - { - SkipRestOfLine(holdBuf); + for ( int i = 0; i < 3; i++ ) { + if ( COM_ParseInt( holdBuf, &tokenInt ) ) { + SkipRestOfLine( holdBuf ); return; } - - bg_itemlist[itemParms.itemNum].maxs[i] = tokenInt; + bg_itemlist[itemNum].maxs[i] = tokenInt; } - } -static void IT_PickupSound(const char **holdBuf) -{ +static void IT_PickupSound( const char **holdBuf ) { int len; - const char *tokenStr; + const char *tokenStr; - if (COM_ParseString(holdBuf,&tokenStr)) - { + if ( COM_ParseString( holdBuf, &tokenStr ) ) { return; } - len = strlen(tokenStr); - len++; - if (len > 32) - { + len = strlen( tokenStr ) + 1; + if ( len > 32 ) { len = 32; gi.Printf("WARNING: Pickup Sound too long in external ITEMS.DAT '%s'\n", tokenStr); } - bg_itemlist[itemParms.itemNum].pickup_sound = G_NewString(tokenStr); + bg_itemlist[itemNum].pickup_sound = G_NewString(tokenStr); } -static void IT_ParseWeaponParms(const char **holdBuf) -{ - const char *token; - int i; - +static void IT_ParseWeaponParms( const char **holdBuf ) { + int i; - while (holdBuf) - { - token = COM_ParseExt( holdBuf, qtrue ); + while ( holdBuf ) { + const char *token = COM_ParseExt( holdBuf, qtrue ); - if (!Q_stricmp( token, "}" )) // End of data for this weapon + if ( !Q_stricmp( token, "}" ) ) { + // end of data for this weapon break; + } - // Loop through possible parameters - for (i=0;i. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - - #include "g_local.h" #include "g_functions.h" #include "g_items.h" @@ -67,7 +70,7 @@ extern cvar_t *g_spskill; G_InventorySelectable =============== */ -qboolean G_InventorySelectable( int index,gentity_t *other) +qboolean G_InventorySelectable( int index,gentity_t *other) { if (other->client->ps.inventory[index]) { @@ -79,7 +82,7 @@ qboolean G_InventorySelectable( int index,gentity_t *other) extern qboolean INV_GoodieKeyGive( gentity_t *target ); extern qboolean INV_SecurityKeyGive( gentity_t *target, const char *keyname ); -int Pickup_Holdable( gentity_t *ent, gentity_t *other ) +int Pickup_Holdable( gentity_t *ent, gentity_t *other ) { int i,original; @@ -105,15 +108,15 @@ int Pickup_Holdable( gentity_t *ent, gentity_t *other ) // Set the inventory select, just in case it hasn't original = cg.inventorySelect; - for ( i = 0 ; i < INV_MAX ; i++ ) + for ( i = 0 ; i < INV_MAX ; i++ ) { if ((cg.inventorySelect < INV_ELECTROBINOCULARS) || (cg.inventorySelect >= INV_MAX)) - { - cg.inventorySelect = (INV_MAX - 1); + { + cg.inventorySelect = (INV_MAX - 1); } - - if ( G_InventorySelectable( cg.inventorySelect,other ) ) - { + + if ( G_InventorySelectable( cg.inventorySelect,other ) ) + { return 60; } cg.inventorySelect++; @@ -147,7 +150,7 @@ int Add_Ammo2 (gentity_t *ent, int ammoType, int count) break; } - if ( ent->client->ps.ammo[ammoType] > ammoData[ammoType].max ) + if ( ent->client->ps.ammo[ammoType] > ammoData[ammoType].max ) { ent->client->ps.ammo[ammoType] = ammoData[ammoType].max; return qfalse; @@ -213,7 +216,7 @@ void Add_Batteries( gentity_t *ent, int *count ) else { // just drain all of the batteries - ent->client->ps.batteryCharge += *count; + ent->client->ps.batteryCharge += *count; *count = 0; } @@ -226,11 +229,11 @@ int Pickup_Battery( gentity_t *ent, gentity_t *other ) { int quantity; - if ( ent->count ) + if ( ent->count ) { quantity = ent->count; - } - else + } + else { quantity = ent->item->quantity; } @@ -246,24 +249,24 @@ int Pickup_Battery( gentity_t *ent, gentity_t *other ) extern void WP_SaberInitBladeData( gentity_t *ent ); extern void CG_ChangeWeapon( int num ); -int Pickup_Weapon (gentity_t *ent, gentity_t *other) +int Pickup_Weapon (gentity_t *ent, gentity_t *other) { int quantity; qboolean hadWeapon = qfalse; /* - if ( ent->count || (ent->activator && !ent->activator->s.number) ) + if ( ent->count || (ent->activator && !ent->activator->s.number) ) { quantity = ent->count; - } - else + } + else { quantity = ent->item->quantity; } */ // dropped items are always picked up - if ( ent->flags & FL_DROPPED_ITEM ) + if ( ent->flags & FL_DROPPED_ITEM ) { quantity = ent->count; } @@ -315,9 +318,9 @@ int Pickup_Weapon (gentity_t *ent, gentity_t *other) //====================================================================== -int ITM_AddHealth (gentity_t *ent, int count) +int ITM_AddHealth (gentity_t *ent, int count) { - + ent->health += count; if (ent->health > ent->client->ps.stats[STAT_MAX_HEALTH]) // Past max health @@ -358,12 +361,12 @@ int Pickup_Health (gentity_t *ent, gentity_t *other) { //====================================================================== -int ITM_AddArmor (gentity_t *ent, int count) +int ITM_AddArmor (gentity_t *ent, int count) { - + ent->client->ps.stats[STAT_ARMOR] += count; - if (ent->client->ps.stats[STAT_ARMOR] > ent->client->ps.stats[STAT_MAX_HEALTH]) + if (ent->client->ps.stats[STAT_ARMOR] > ent->client->ps.stats[STAT_MAX_HEALTH]) { ent->client->ps.stats[STAT_ARMOR] = ent->client->ps.stats[STAT_MAX_HEALTH]; return qfalse; @@ -400,7 +403,7 @@ int Pickup_Holocron( gentity_t *ent, gentity_t *other ) gi.Printf(" Pickup_Holocron : count %d not in valid range\n", forceLevel ); return 1; } - + // don't pick up if already known AND your level is higher than pickup level if ( ( other->client->ps.forcePowersKnown & ( 1 << forcePower )) ) { @@ -413,15 +416,15 @@ int Pickup_Holocron( gentity_t *ent, gentity_t *other ) other->client->ps.forcePowerLevel[forcePower] = forceLevel; other->client->ps.forcePowersKnown |= ( 1 << forcePower ); - + missionInfo_Updated = qtrue; // Activate flashing text - gi.cvar_set("cg_updatedDataPadForcePower1", va("%d",forcePower+1)); // The +1 is offset in the print routine. + gi.cvar_set("cg_updatedDataPadForcePower1", va("%d",forcePower+1)); // The +1 is offset in the print routine. cg_updatedDataPadForcePower1.integer = forcePower+1; - gi.cvar_set("cg_updatedDataPadForcePower2", "0"); // The +1 is offset in the print routine. + gi.cvar_set("cg_updatedDataPadForcePower2", "0"); // The +1 is offset in the print routine. cg_updatedDataPadForcePower2.integer = 0; - gi.cvar_set("cg_updatedDataPadForcePower3", "0"); // The +1 is offset in the print routine. + gi.cvar_set("cg_updatedDataPadForcePower3", "0"); // The +1 is offset in the print routine. cg_updatedDataPadForcePower3.integer = 0; - + return 1; } @@ -446,11 +449,11 @@ qboolean CheckItemCanBePickedUpByNPC( gentity_t *item, gentity_t *pickerupper ) item->item->giTag == INV_SECURITY_KEY ) { return qfalse; } - if ( (item->flags&FL_DROPPED_ITEM) - && item->activator != &g_entities[0] - && pickerupper->s.number - && pickerupper->s.weapon == WP_NONE - && pickerupper->enemy + if ( (item->flags&FL_DROPPED_ITEM) + && item->activator != &g_entities[0] + && pickerupper->s.number + && pickerupper->s.weapon == WP_NONE + && pickerupper->enemy && pickerupper->painDebounceTime < level.time && pickerupper->NPC && pickerupper->NPC->surrenderTime < level.time //not surrendering && !(pickerupper->NPC->scriptFlags&SCF_FORCED_MARCH) ) // not being forced to march @@ -494,18 +497,18 @@ void Touch_Item (gentity_t *ent, gentity_t *other, trace_t *trace) { return; } - - if ( other->client->NPC_class == CLASS_ATST || - other->client->NPC_class == CLASS_GONK || - other->client->NPC_class == CLASS_MARK1 || - other->client->NPC_class == CLASS_MARK2 || - other->client->NPC_class == CLASS_MOUSE || - other->client->NPC_class == CLASS_PROBE || - other->client->NPC_class == CLASS_PROTOCOL || - other->client->NPC_class == CLASS_R2D2 || - other->client->NPC_class == CLASS_R5D2 || - other->client->NPC_class == CLASS_SEEKER || - other->client->NPC_class == CLASS_REMOTE || + + if ( other->client->NPC_class == CLASS_ATST || + other->client->NPC_class == CLASS_GONK || + other->client->NPC_class == CLASS_MARK1 || + other->client->NPC_class == CLASS_MARK2 || + other->client->NPC_class == CLASS_MOUSE || + other->client->NPC_class == CLASS_PROBE || + other->client->NPC_class == CLASS_PROTOCOL || + other->client->NPC_class == CLASS_R2D2 || + other->client->NPC_class == CLASS_R5D2 || + other->client->NPC_class == CLASS_SEEKER || + other->client->NPC_class == CLASS_REMOTE || other->client->NPC_class == CLASS_SENTRY ) {//FIXME: some flag would be better //droids can't pick up items/weapons! @@ -552,7 +555,7 @@ void Touch_Item (gentity_t *ent, gentity_t *other, trace_t *trace) { } qboolean bHadWeapon = qfalse; // call the item-specific pickup function - switch( ent->item->giType ) + switch( ent->item->giType ) { case IT_WEAPON: if ( other->NPC && other->s.weapon == WP_NONE ) @@ -593,7 +596,7 @@ void Touch_Item (gentity_t *ent, gentity_t *other, trace_t *trace) { return; } - if ( !respawn ) + if ( !respawn ) { return; } @@ -612,7 +615,7 @@ extern void CG_ItemPickup( int itemNum, qboolean bHadItem ); if ( bHadWeapon ) { G_AddEvent( other, EV_ITEM_PICKUP, -ent->s.modelindex ); - } + } else { G_AddEvent( other, EV_ITEM_PICKUP, ent->s.modelindex ); @@ -623,7 +626,7 @@ extern void CG_ItemPickup( int itemNum, qboolean bHadItem ); G_UseTargets (ent, other); // wait of -1 will not respawn -// if ( ent->wait == -1 ) +// if ( ent->wait == -1 ) { //why not just remove me? G_FreeEntity( ent ); @@ -664,7 +667,7 @@ gentity_t *LaunchItem( gitem_t *item, vec3_t origin, vec3_t velocity, char *targ VectorSet( dropped->mins, item->mins[0], item->mins[1], item->mins[2] ); VectorSet( dropped->maxs, item->maxs[0], item->maxs[1], item->maxs[2] ); - if ((!dropped->mins[0] && !dropped->mins[1] && !dropped->mins[2]) && + if ((!dropped->mins[0] && !dropped->mins[1] && !dropped->mins[2]) && (!dropped->maxs[0] && !dropped->maxs[1] && !dropped->maxs[2])) { VectorSet( dropped->maxs, ITEM_RADIUS, ITEM_RADIUS, ITEM_RADIUS ); @@ -742,7 +745,7 @@ gentity_t *Drop_Item( gentity_t *ent, gitem_t *item, float angle, qboolean copyt AngleVectors( angles, velocity, NULL, NULL ); VectorScale( velocity, 150, velocity ); velocity[2] += 200 + crandom() * 50; - + if ( copytarget ) { dropped = LaunchItem( item, ent->s.pos.trBase, velocity, ent->opentarget ); @@ -765,7 +768,7 @@ Use_Item Respawn the item ================ */ -void Use_Item( gentity_t *ent, gentity_t *other, gentity_t *activator ) +void Use_Item( gentity_t *ent, gentity_t *other, gentity_t *activator ) { if ( (ent->svFlags&SVF_PLAYER_USABLE) && other && !other->s.number ) {//used directly by the player, pick me up @@ -808,7 +811,7 @@ void FinishSpawningItem( gentity_t *ent ) { int itemNum; itemNum=1; - for ( item = bg_itemlist + 1 ; item->classname ; item++,itemNum++) + for ( item = bg_itemlist + 1 ; item->classname ; item++,itemNum++) { if (!strcmp(item->classname,ent->classname)) { @@ -820,7 +823,7 @@ void FinishSpawningItem( gentity_t *ent ) { VectorSet( ent->mins, item->mins[0],item->mins[1] ,item->mins[2]); VectorSet( ent->maxs, item->maxs[0],item->maxs[1] ,item->maxs[2]); - if ((!ent->mins[0] && !ent->mins[1] && !ent->mins[2]) && + if ((!ent->mins[0] && !ent->mins[1] && !ent->mins[2]) && (!ent->maxs[0] && !ent->maxs[1] && !ent->maxs[2])) { VectorSet (ent->mins, -ITEM_RADIUS, -ITEM_RADIUS, -2);//to match the comments in the items.dat file! @@ -834,7 +837,7 @@ void FinishSpawningItem( gentity_t *ent ) { if ((item->quantity) && (item->giType == IT_BATTERY)) { - ent->count = item->quantity; + ent->count = item->quantity; } @@ -842,7 +845,7 @@ void FinishSpawningItem( gentity_t *ent ) { { ent->s.radius = 20; VectorSet( ent->s.modelScale, 1.0f, 1.0f, 1.0f ); - gi.G2API_InitGhoul2Model( ent->ghoul2, ent->item->world_model, G_ModelIndex( ent->item->world_model ), NULL, NULL, 0, 0); + gi.G2API_InitGhoul2Model( ent->ghoul2, ent->item->world_model, G_ModelIndex( ent->item->world_model ), NULL_HANDLE, NULL_HANDLE, 0, 0); } // Set crystal ammo amount based on skill level @@ -867,17 +870,17 @@ void FinishSpawningItem( gentity_t *ent ) { // Hang in air? ent->s.origin[2] += 1;//just to get it off the damn ground because coplanar = insolid - if ( ent->spawnflags & ITMSF_SUSPEND) + if ( ent->spawnflags & ITMSF_SUSPEND) { // suspended G_SetOrigin( ent, ent->s.origin ); - } - else + } + else { // drop to floor VectorSet( dest, ent->s.origin[0], ent->s.origin[1], MIN_WORLD_COORD ); gi.trace( &tr, ent->s.origin, ent->mins, ent->maxs, dest, ent->s.number, MASK_SOLID|CONTENTS_PLAYERCLIP, G2_NOCOLLIDE, 0 ); - if ( tr.startsolid ) + if ( tr.startsolid ) { if ( &g_entities[tr.entityNum] != NULL ) { @@ -1009,7 +1012,7 @@ void item_spawn_use( gentity_t *self, gentity_t *other, gentity_t *activator ) self->nextthink = level.time + 50; self->e_ThinkFunc = thinkF_FinishSpawningItem; // I could be fancy and add a count or something like that to be able to spawn the item numerous times... - self->e_UseFunc = NULL; + self->e_UseFunc = useF_NULL; } /* @@ -1095,16 +1098,16 @@ void G_RunItem( gentity_t *ent ) { int mask; // if groundentity has been set to -1, it may have been pushed off an edge - if ( ent->s.groundEntityNum == ENTITYNUM_NONE ) + if ( ent->s.groundEntityNum == ENTITYNUM_NONE ) { - if ( ent->s.pos.trType != TR_GRAVITY ) + if ( ent->s.pos.trType != TR_GRAVITY ) { ent->s.pos.trType = TR_GRAVITY; ent->s.pos.trTime = level.time; } } - if ( ent->s.pos.trType == TR_STATIONARY ) + if ( ent->s.pos.trType == TR_STATIONARY ) { // check think function G_RunThink( ent ); @@ -1123,11 +1126,11 @@ void G_RunItem( gentity_t *ent ) { EvaluateTrajectory( &ent->s.pos, level.time, origin ); // trace a line from the previous position to the current position - if ( ent->clipmask ) + if ( ent->clipmask ) { mask = ent->clipmask; - } - else + } + else { mask = MASK_SOLID|CONTENTS_PLAYERCLIP;//shouldn't be able to get anywhere player can't } @@ -1145,7 +1148,7 @@ void G_RunItem( gentity_t *ent ) { VectorCopy( tr.endpos, ent->currentOrigin ); - if ( tr.startsolid ) + if ( tr.startsolid ) { tr.fraction = 0; } @@ -1155,7 +1158,7 @@ void G_RunItem( gentity_t *ent ) { // check think function G_RunThink( ent ); - if ( tr.fraction == 1 ) + if ( tr.fraction == 1 ) { if ( g_gravity->value <= 0 ) { @@ -1188,7 +1191,7 @@ void G_RunItem( gentity_t *ent ) { // if it is in a nodrop volume, remove it contents = gi.pointcontents( ent->currentOrigin, -1 ); - if ( contents & CONTENTS_NODROP ) + if ( contents & CONTENTS_NODROP ) { G_FreeEntity( ent ); return; diff --git a/codeJK2/game/g_items.h b/codeJK2/game/g_items.h index e2b9c10c62..742369afd3 100644 --- a/codeJK2/game/g_items.h +++ b/codeJK2/game/g_items.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software //g_items.h diff --git a/codeJK2/game/g_local.h b/codeJK2/game/g_local.h index 39a27148ef..4a2dedb3c0 100644 --- a/codeJK2/game/g_local.h +++ b/codeJK2/game/g_local.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __G_LOCAL_H__ #define __G_LOCAL_H__ diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp index c021f1002b..2fc693c00c 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -1,26 +1,28 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - - #include "g_local.h" #include "g_functions.h" #include "Q3_Interface.h" @@ -190,8 +192,6 @@ static void G_DynamicMusicUpdate( void ) int danger = 0; int battle = 0; int entTeam; - qboolean dangerNear = qfalse; - qboolean suspicious = qfalse; qboolean LOScalced = qfalse, clearLOS = qfalse; //FIXME: intro and/or other cues? (one-shot music sounds) @@ -205,8 +205,8 @@ static void G_DynamicMusicUpdate( void ) return; } - if ( !player->client - || player->client->pers.teamState.state != TEAM_ACTIVE + if ( !player->client + || player->client->pers.teamState.state != TEAM_ACTIVE || level.time - player->client->pers.enterTime < 100 ) {//player hasn't spawned yet return; @@ -252,14 +252,14 @@ static void G_DynamicMusicUpdate( void ) //enemy-based VectorCopy( player->currentOrigin, center ); - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { mins[i] = center[i] - radius; maxs[i] = center[i] + radius; } - + numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); - for ( e = 0 ; e < numListedEntities ; e++ ) + for ( e = 0 ; e < numListedEntities ; e++ ) { ent = entityList[ e ]; if ( !ent || !ent->inuse ) @@ -356,7 +356,7 @@ static void G_DynamicMusicUpdate( void ) { clearLOS = G_ClearLOS( player, player->client->renderInfo.eyePoint, ent ); } - if ( !clearLOS ) + if ( !clearLOS ) {//can't see them directly continue; } @@ -389,10 +389,10 @@ static void G_DynamicMusicUpdate( void ) switch ( level.alertEvents[alert].level ) { case AEL_DISCOVERED: - dangerNear = qtrue; + //dangerNear = qtrue; break; case AEL_SUSPICIOUS: - suspicious = qtrue; + //suspicious = qtrue; break; case AEL_MINOR: //distraction = qtrue; @@ -421,7 +421,7 @@ static void G_DynamicMusicUpdate( void ) //level.dmDebounceTime = level.time + 3000 + 1000*battle; } } - else + else { if ( level.dmDebounceTime > level.time ) {//not ready to switch yet @@ -506,7 +506,7 @@ void G_FindTeams( void ) { // continue; if(!PInUse(j)) continue; - + e2=&g_entities[j]; if (!e2->team) continue; @@ -578,7 +578,7 @@ void G_InitCvars( void ) { g_AIsurrender = gi.cvar( "g_AIsurrender", "0", CVAR_CHEAT ); g_numEntities = gi.cvar( "g_numEntities", "0", CVAR_CHEAT ); - + gi.cvar( "newTotalSecrets", "0", CVAR_ROM ); gi.cvar_set("newTotalSecrets", "0");//used to carry over the count from SP_target_secret to ClientBegin g_iscensored = gi.cvar( "ui_iscensored", "0", CVAR_ARCHIVE|CVAR_ROM|CVAR_INIT|CVAR_CHEAT|CVAR_NORESTART ); @@ -594,7 +594,7 @@ InitGame // I'm just declaring a global here which I need to get at in NAV_GenerateSquadPaths for deciding if pre-calc'd // data is valid, and this saves changing the proto of G_SpawnEntitiesFromString() to include a checksum param which // may get changed anyway if a new nav system is ever used. This way saves messing with g_local.h each time -slc -int giMapChecksum; +int giMapChecksum; SavedGameJustLoaded_e g_eSavedGameJustLoaded; qboolean g_qbLoadTransition = qfalse; #ifndef FINAL_BUILD @@ -652,7 +652,7 @@ void InitGame( const char *mapname, const char *spawntarget, int checkSum, cons //Set up NPC init data NPC_InitGame(); - + TIMER_Clear(); // @@ -692,7 +692,7 @@ void InitGame( const char *mapname, const char *spawntarget, int checkSum, cons } else {//loaded - //FIXME: if this is from a loadgame, it needs to be sure to write this + //FIXME: if this is from a loadgame, it needs to be sure to write this //out whenever you do a savegame since the edges and routes are dynamic... //OR: always do a navigator.CheckBlockedEdges() on map startup after nav-load/calc-paths navigator.pathsCalculated = qtrue;//just to be safe? Does this get saved out? No... assumed @@ -871,7 +871,7 @@ FUNCTIONS CALLED EVERY FRAME ======================================================================== */ -static void G_CheckTasksCompleted (gentity_t *ent) +static void G_CheckTasksCompleted (gentity_t *ent) { if ( Q3_TaskIDPending( ent, TID_CHAN_VOICE ) ) { @@ -942,7 +942,7 @@ G_RunThink Runs thinking code for this frame if necessary ============= */ -void G_RunThink (gentity_t *ent) +void G_RunThink (gentity_t *ent) { float thinktime; @@ -957,16 +957,16 @@ void G_RunThink (gentity_t *ent) */ thinktime = ent->nextthink; - if ( thinktime <= 0 ) + if ( thinktime <= 0 ) { goto runicarus; } - - if ( thinktime > level.time ) + + if ( thinktime > level.time ) { goto runicarus; } - + ent->nextthink = 0; if ( ent->e_ThinkFunc == thinkF_NULL ) // actually you don't need this if I check for it in the next function -slc { @@ -1012,7 +1012,7 @@ void G_Animate ( gentity_t *self ) int junk; // I guess query ghoul2 to find out what the current frame is and see if we are done. - gi.G2API_GetBoneAnimIndex( &self->ghoul2[self->playerModel], self->rootBone, + gi.G2API_GetBoneAnimIndex( &self->ghoul2[self->playerModel], self->rootBone, (cg.time?cg.time:level.time), &frame, &junk, &junk, &junk, &junk2, NULL ); // It NEVER seems to get to what you'd think the last frame would be, so I'm doing this to try and catch when the animation has stopped @@ -1046,8 +1046,8 @@ void G_Animate ( gentity_t *self ) if ( self->ghoul2.size()) { self->s.frame = self->endFrame; - - gi.G2API_SetBoneAnimIndex( &self->ghoul2[self->playerModel], self->rootBone, + + gi.G2API_SetBoneAnimIndex( &self->ghoul2[self->playerModel], self->rootBone, self->startFrame, self->endFrame, BONE_ANIM_OVERRIDE_FREEZE, 1.0f, cg.time, -1, -1 ); return; } @@ -1199,7 +1199,7 @@ void G_CheckEndLevelTimers( gentity_t *ent ) } void NAV_CheckCalcPaths( void ) -{ +{ if ( navCalcPathTime && navCalcPathTime < level.time ) {//first time we've ever loaded this map... //clear all the failed edges @@ -1207,7 +1207,7 @@ void NAV_CheckCalcPaths( void ) //Calculate all paths NAV_CalculatePaths( level.mapname, giMapChecksum ); - + navigator.CalculatePaths(); #ifndef FINAL_BUILD @@ -1215,7 +1215,7 @@ void NAV_CheckCalcPaths( void ) { gi.Printf( S_COLOR_RED"Not saving .nav file due to fatal nav errors\n" ); } - else + else #endif if ( navigator.Save( level.mapname, giMapChecksum ) == qfalse ) { @@ -1242,21 +1242,20 @@ extern int delayedShutDown; void G_RunFrame( int levelTime ) { int i; gentity_t *ent; - int msec; int ents_inuse=0; // someone's gonna be pissed I put this here... #if AI_TIMERS AITime = 0; navTime = 0; #endif// AI_TIMERS - + level.framenum++; level.previousTime = level.time; level.time = levelTime; - msec = level.time - level.previousTime; - + //msec = level.time - level.previousTime; + NAV_CheckCalcPaths(); //ResetTeamCounters(); - + AI_UpdateGroups(); if ( d_altRoutes->integer ) @@ -1266,18 +1265,18 @@ void G_RunFrame( int levelTime ) { navigator.ClearCheckedNodes(); //remember last waypoint, clear current one -// for ( i = 0, ent = &g_entities[0]; i < globals.num_entities ; i++, ent++) - for ( i = 0; i < globals.num_entities ; i++) +// for ( i = 0, ent = &g_entities[0]; i < globals.num_entities ; i++, ent++) + for ( i = 0; i < globals.num_entities ; i++) { // if ( !ent->inuse ) // continue; if(!PInUse(i)) continue; - + ent = &g_entities[i]; - - if ( ent->waypoint != WAYPOINT_NONE + + if ( ent->waypoint != WAYPOINT_NONE && ent->noWaypointTime < level.time ) { ent->lastWaypoint = ent->waypoint; @@ -1294,7 +1293,7 @@ void G_RunFrame( int levelTime ) { //Run the frame for all entities // for ( i = 0, ent = &g_entities[0]; i < globals.num_entities ; i++, ent++) - for ( i = 0; i < globals.num_entities ; i++) + for ( i = 0; i < globals.num_entities ; i++) { // if ( !ent->inuse ) // continue; @@ -1348,19 +1347,19 @@ void G_RunFrame( int levelTime ) { } G_CheckSpecialPersistentEvents( ent ); - if ( ent->s.eType == ET_MISSILE ) + if ( ent->s.eType == ET_MISSILE ) { G_RunMissile( ent ); continue; } - if ( ent->s.eType == ET_ITEM ) + if ( ent->s.eType == ET_ITEM ) { G_RunItem( ent ); continue; } - if ( ent->s.eType == ET_MOVER ) + if ( ent->s.eType == ET_MOVER ) { if ( ent->model && Q_stricmp( "models/test/mikeg/tie_fighter.md3", ent->model ) == 0 ) { @@ -1371,7 +1370,7 @@ void G_RunFrame( int levelTime ) { } //The player - if ( i == 0 ) + if ( i == 0 ) { // decay batteries if the goggles are active if ( cg.zoomMode == 1 && ent->client->ps.batteryCharge > 0 ) @@ -1415,7 +1414,7 @@ void G_RunFrame( int levelTime ) { // perform final fixups on the player ent = &g_entities[0]; - if ( ent->inuse ) + if ( ent->inuse ) { ClientEndFrame( ent ); } @@ -1477,7 +1476,7 @@ void G_RunFrame( int levelTime ) { extern qboolean player_locked; void G_LoadSave_WriteMiscData(void) -{ +{ gi.AppendToSaveGame(INT_ID('L','C','K','D'), &player_locked, sizeof(player_locked)); } diff --git a/codeJK2/game/g_mem.cpp b/codeJK2/game/g_mem.cpp index df10466e28..4e46abd212 100644 --- a/codeJK2/game/g_mem.cpp +++ b/codeJK2/game/g_mem.cpp @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // // g_mem.c @@ -22,12 +27,8 @@ This file is part of Jedi Knight 2. // leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - - - #include "g_local.h" - /*#define POOLSIZE (2 * 1024 * 1024) static char memoryPool[POOLSIZE]; diff --git a/codeJK2/game/g_misc.cpp b/codeJK2/game/g_misc.cpp index 239ae68ff7..7a6ec732ca 100644 --- a/codeJK2/game/g_misc.cpp +++ b/codeJK2/game/g_misc.cpp @@ -1,27 +1,30 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // g_misc.c -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - #include "g_local.h" #include "g_functions.h" #include "g_nav.h" @@ -29,7 +32,7 @@ This file is part of Jedi Knight 2. extern gentity_t *G_FindDoorTrigger( gentity_t *door ); extern void G_SetEnemy( gentity_t *self, gentity_t *enemy ); -extern void SetMiscModelDefaults( gentity_t *ent, useFunc_t use_func, char *material, int solid_mask,int animFlag, +extern void SetMiscModelDefaults( gentity_t *ent, useFunc_t use_func, char *material, int solid_mask,int animFlag, qboolean take_damage, qboolean damage_model); #define MAX_AMMO_GIVE 4 @@ -118,7 +121,7 @@ static void misc_lightstyle_set ( gentity_t *ent) gi.SetConfigstring(CS_LIGHT_STYLES + (mLightStyle*3)+1, "a"); gi.SetConfigstring(CS_LIGHT_STYLES + (mLightStyle*3)+2, "a"); } - } + } else { //Turn myself on now if (mLightSwitchStyle) //i have a light style i'd like to use when on @@ -185,13 +188,13 @@ TELEPORTERS ================================================================================= */ -void TeleportPlayer( gentity_t *player, vec3_t origin, vec3_t angles ) +void TeleportPlayer( gentity_t *player, vec3_t origin, vec3_t angles ) { if ( player->NPC && ( player->NPC->aiFlags&NPCAI_FORM_TELE_NAV ) ) { //My leader teleported, I was trying to catch up, take this off player->NPC->aiFlags &= ~NPCAI_FORM_TELE_NAV; - + } // unlink to make sure it can't possibly interfere with G_KillBox @@ -222,7 +225,7 @@ void TeleportPlayer( gentity_t *player, vec3_t origin, vec3_t angles ) gi.linkentity (player); } -void TeleportMover( gentity_t *mover, vec3_t origin, vec3_t diffAngles, qboolean snapAngle ) +void TeleportMover( gentity_t *mover, vec3_t origin, vec3_t diffAngles, qboolean snapAngle ) {//FIXME: need an effect vec3_t oldAngle, newAngle; float speed; @@ -273,7 +276,7 @@ void TeleportMover( gentity_t *mover, vec3_t origin, vec3_t diffAngles, qboolean VectorScale( mover->s.apos.trDelta, speed, mover->s.apos.trDelta ); mover->s.apos.trTime = level.time; - + //Tell them it was teleported this move mover->s.eFlags |= EF_TELEPORT_BIT; @@ -333,7 +336,7 @@ void SP_misc_teleporter (gentity_t *ent) VectorSet (trig->mins, -8, -8, 8); VectorSet (trig->maxs, 8, 8, 24); gi.linkentity (trig); - + } /*QUAK-D misc_teleporter_dest (1 0 0) (-32 -32 -24) (32 32 -16) - - NODRAW @@ -368,11 +371,11 @@ void setCamera ( gentity_t *ent ) gentity_t *target = 0; // frame holds the rotate speed - if ( ent->owner->spawnflags & 1 ) + if ( ent->owner->spawnflags & 1 ) { ent->s.frame = 25; - } - else if ( ent->owner->spawnflags & 2 ) + } + else if ( ent->owner->spawnflags & 2 ) { ent->s.frame = 75; } @@ -386,12 +389,12 @@ void setCamera ( gentity_t *ent ) if (ent->owner->target) { target = G_PickTarget( ent->owner->target ); } - if ( target ) + if ( target ) { VectorSubtract( target->s.origin, ent->owner->s.origin, dir ); VectorNormalize( dir ); - } - else + } + else { G_SetMovedir( ent->owner->s.angles, dir ); } @@ -434,11 +437,11 @@ void misc_portal_use( gentity_t *self, gentity_t *other, gentity_t *activator ) cycleCamera( self ); } -void locateCamera( gentity_t *ent ) +void locateCamera( gentity_t *ent ) {//FIXME: make this fadeout with distance from misc_camera_portal ent->owner = G_Find(NULL, FOFS(targetname), ent->target); - if ( !ent->owner ) + if ( !ent->owner ) { gi.Printf( "Couldn't find target for misc_portal_surface\n" ); G_FreeEntity( ent ); @@ -473,7 +476,7 @@ wait - makes it auto-cycle between all cameras it's pointed at at intevervals of cameras will be cycled through in the order they were created on the map. */ -void SP_misc_portal_surface(gentity_t *ent) +void SP_misc_portal_surface(gentity_t *ent) { VectorClear( ent->mins ); VectorClear( ent->maxs ); @@ -483,11 +486,11 @@ void SP_misc_portal_surface(gentity_t *ent) ent->s.eType = ET_PORTAL; ent->wait *= 1000; - if ( !ent->target ) + if ( !ent->target ) {//mirror? VectorCopy( ent->s.origin, ent->s.origin2 ); - } - else + } + else { ent->e_ThinkFunc = thinkF_locateCamera; ent->nextthink = level.time + 100; @@ -673,7 +676,7 @@ VULNERABLE - allow camera to be destroyed "closetarget" - (sigh...) yet another target, fired this when it's destroyed "wait" - how long to wait between being used (default 0.5) */ -void SP_misc_camera( gentity_t *self ) +void SP_misc_camera( gentity_t *self ) { G_SpawnFloat( "wait", "0.5", &self->wait ); @@ -711,7 +714,7 @@ void SP_misc_camera( gentity_t *self ) self->health = 10; self->e_DieFunc = dieF_camera_die; - + self->e_UseFunc = useF_camera_use; self->e_ThinkFunc = thinkF_camera_aim; @@ -725,7 +728,7 @@ void SP_misc_camera( gentity_t *self ) ====================================================================== */ -void Use_Shooter( gentity_t *ent, gentity_t *other, gentity_t *activator ) +void Use_Shooter( gentity_t *ent, gentity_t *other, gentity_t *activator ) { /* vec3_t dir; float deg; @@ -753,7 +756,7 @@ void Use_Shooter( gentity_t *ent, gentity_t *other, gentity_t *activator ) VectorNormalize( dir ); - switch ( ent->s.weapon ) + switch ( ent->s.weapon ) { case WP_GRENADE_LAUNCHER: fire_grenade( ent, ent->s.origin, dir ); @@ -793,7 +796,7 @@ void InitShooter( gentity_t *ent, int weapon ) { Fires at either the target or the current direction. "random" the number of degrees of deviance from the taget. (1.0 default) */ -void SP_shooter_rocket( gentity_t *ent ) +void SP_shooter_rocket( gentity_t *ent ) { // InitShooter( ent, WP_TETRION_DISRUPTOR ); } @@ -802,7 +805,7 @@ void SP_shooter_rocket( gentity_t *ent ) Fires at either the target or the current direction. "random" is the number of degrees of deviance from the taget. (1.0 default) */ -void SP_shooter_plasma( gentity_t *ent ) +void SP_shooter_plasma( gentity_t *ent ) { InitShooter( ent, WP_BRYAR_PISTOL); } @@ -811,7 +814,7 @@ void SP_shooter_plasma( gentity_t *ent ) Fires at either the target or the current direction. "random" is the number of degrees of deviance from the taget. (1.0 default) */ -void SP_shooter_grenade( gentity_t *ent ) +void SP_shooter_grenade( gentity_t *ent ) { // InitShooter( ent, WP_GRENADE_LAUNCHER); } @@ -826,7 +829,7 @@ KLINGON - klingon style barrel NO_SMOKE - will not leave lingering smoke cloud when killed POWDERKEG - wooden explosive barrel -health default = 20 +health default = 20 splashDamage default = 100 splashRadius default = 200 */ @@ -855,7 +858,7 @@ void SP_object_cargo_barrel1(gentity_t *ent) } ent->contents = CONTENTS_SOLID|CONTENTS_OPAQUE; - + if ( ent->spawnflags & 1 ) { VectorSet (ent->mins, -8, -8, -16); @@ -872,7 +875,7 @@ void SP_object_cargo_barrel1(gentity_t *ent) if(!ent->health) ent->health = 20; - + if(!ent->splashDamage) ent->splashDamage = 100; @@ -882,7 +885,7 @@ void SP_object_cargo_barrel1(gentity_t *ent) ent->takedamage = qtrue; ent->e_DieFunc = dieF_ExplodeDeath_Wait; - + if(ent->targetname) ent->e_UseFunc = useF_GoExplodeDeath; @@ -892,7 +895,7 @@ void SP_object_cargo_barrel1(gentity_t *ent) /*QUAKED misc_dlight (0.2 0.8 0.2) (-4 -4 -4) (4 4 4) STARTOFF FADEON FADEOFF PULSE Dynamic light, toggles on and off when used - + STARTOFF - Starts off FADEON - Fades from 0 Radius to start Radius FADEOFF - Fades from current Radius to 0 Radius before turning off @@ -921,7 +924,7 @@ void SP_misc_dlight(gentity_t *ent) //FIXME: attach self to a train or something? ent->e_UseFunc = useF_misc_dlight_use; - + ent->misc_dlight_active = qfalse; ent->e_clThinkFunc = clThinkF_NULL; @@ -1000,7 +1003,7 @@ void misc_dlight_think ( gentity_t *ent ) } -void station_pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, vec3_t point, int damage, int mod,int hitLoc ) +void station_pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, vec3_t point, int damage, int mod,int hitLoc ) { // self->s.modelindex = G_ModelIndex("/models/mapobjects/stasis/plugin2_in.md3"); // self->s.eFlags &= ~ EF_ANIM_ALLFAST; @@ -1028,15 +1031,15 @@ void health_shutdown( gentity_t *self ) self->s.eFlags |= EF_ANIM_ONCE; // Switch to and animate its used up model. - if (!Q_stricmp(self->model,"models/mapobjects/stasis/plugin2.md3")) + if (!Q_stricmp(self->model,"models/mapobjects/stasis/plugin2.md3")) { self->s.modelindex = self->s.modelindex2; } - else if (!Q_stricmp(self->model,"models/mapobjects/borg/plugin2.md3")) + else if (!Q_stricmp(self->model,"models/mapobjects/borg/plugin2.md3")) { self->s.modelindex = self->s.modelindex2; - } - else if (!Q_stricmp(self->model,"models/mapobjects/stasis/plugin2_floor.md3")) + } + else if (!Q_stricmp(self->model,"models/mapobjects/stasis/plugin2_floor.md3")) { self->s.modelindex = self->s.modelindex2; // G_Sound(self, G_SoundIndex("sound/ambience/stasis/shrinkage1.wav") ); @@ -1073,9 +1076,9 @@ void health_think( gentity_t *ent ) { dif= 3; } - else if (dif < 0) + else if (dif < 0) { - dif= 0; + dif= 0; } if (dif > ent->count) // Can't give more than count @@ -1083,7 +1086,7 @@ void health_think( gentity_t *ent ) dif = ent->count; } - if ((ITM_AddHealth (ent->enemy,dif)) && (dif>0)) + if ((ITM_AddHealth (ent->enemy,dif)) && (dif>0)) { ITM_AddArmor (ent->enemy,1); // 1 armor for every 3 health @@ -1092,16 +1095,16 @@ void health_think( gentity_t *ent ) } else // User has taken all health he can hold, see about giving it all to armor { - dif = ent->enemy->client->ps.stats[STAT_MAX_HEALTH] - + dif = ent->enemy->client->ps.stats[STAT_MAX_HEALTH] - ent->enemy->client->ps.stats[STAT_ARMOR]; if (dif > 3) { dif = 3; } - else if (dif < 0) + else if (dif < 0) { - dif= 0; + dif= 0; } if (ent->count < dif) // Can't give more than count @@ -1111,7 +1114,7 @@ void health_think( gentity_t *ent ) if ((!ITM_AddArmor(ent->enemy,dif)) || (dif<=0)) { - ent->e_UseFunc = useF_health_use; + ent->e_UseFunc = useF_health_use; ent->e_ThinkFunc = thinkF_NULL; } else @@ -1143,10 +1146,10 @@ void misc_model_useup( gentity_t *self, gentity_t *other, gentity_t *activator) // Use target when used if (self->spawnflags & 8) { - G_UseTargets( self, activator ); + G_UseTargets( self, activator ); } - self->e_UseFunc = useF_NULL; + self->e_UseFunc = useF_NULL; self->e_ThinkFunc = thinkF_NULL; self->nextthink = -1; } @@ -1174,7 +1177,7 @@ void health_use( gentity_t *self, gentity_t *other, gentity_t *activator) dif = 1; self->count = 0; } - else + else { // Health dif = other->client->ps.stats[STAT_MAX_HEALTH] - other->client->ps.stats[STAT_HEALTH]; // Armor @@ -1185,11 +1188,11 @@ void health_use( gentity_t *self, gentity_t *other, gentity_t *activator) if (hold>0) // Need more armor than health { // Calculate total amount of station energy needed. - + hold = dif / 3; // For every 3 points of health, you get 1 point of armor dif2 -= hold; - dif2 += dif; - + dif2 += dif; + dif = dif2; } } @@ -1199,7 +1202,7 @@ void health_use( gentity_t *self, gentity_t *other, gentity_t *activator) dif = 1; self->count = 0; } - + // Does player already have full health and full armor? if (dif > 0) { @@ -1212,10 +1215,10 @@ void health_use( gentity_t *self, gentity_t *other, gentity_t *activator) // Use target when used if (self->spawnflags & 8) { - G_UseTargets( self, activator ); + G_UseTargets( self, activator ); } - self->e_UseFunc = useF_NULL; + self->e_UseFunc = useF_NULL; self->enemy = other; self->e_ThinkFunc = thinkF_health_think; self->nextthink = level.time + 50; @@ -1224,7 +1227,7 @@ void health_use( gentity_t *self, gentity_t *other, gentity_t *activator) { // G_Sound(self, G_SoundIndex("sound/weapons/noammo.wav") ); } - } + } } // -------------------------------------------------------------------- @@ -1258,9 +1261,9 @@ void ammo_think( gentity_t *ent ) { dif= 2; } - else if (dif < 0) + else if (dif < 0) { - dif= 0; + dif= 0; } if (ent->count < dif) // Can't give more than count @@ -1268,15 +1271,15 @@ void ammo_think( gentity_t *ent ) dif = ent->count; } - // Give player ammo - if (Add_Ammo2(ent->enemy,AMMO_BLASTER,dif) && (dif!=0)) + // Give player ammo + if (Add_Ammo2(ent->enemy,AMMO_BLASTER,dif) && (dif!=0)) { ent->count-=dif; ent->nextthink = level.time + 10; } else // User has taken all ammo he can hold { - ent->e_UseFunc = useF_ammo_use; + ent->e_UseFunc = useF_ammo_use; ent->e_ThinkFunc = thinkF_NULL; } } @@ -1322,7 +1325,7 @@ void ammo_use( gentity_t *self, gentity_t *other, gentity_t *activator) { ammo_shutdown(self); } - } + } else { // G_Sound(self, G_SoundIndex("sound/weapons/noammo.wav") ); @@ -1330,14 +1333,14 @@ void ammo_use( gentity_t *self, gentity_t *other, gentity_t *activator) // Use target when used if (self->spawnflags & 8) { - G_UseTargets( self, activator ); + G_UseTargets( self, activator ); } - self->e_UseFunc = useF_NULL; + self->e_UseFunc = useF_NULL; G_SetEnemy( self, other ); self->e_ThinkFunc = thinkF_ammo_think; self->nextthink = level.time + 50; - } + } } //------------------------------------------------------------ @@ -1361,7 +1364,7 @@ void mega_ammo_use( gentity_t *self, gentity_t *other, gentity_t *activator ) // G_Sound( self, G_SoundIndex("sound/player/superenergy.wav") ); // Clear our usefunc, then think until our ammo is full - self->e_UseFunc = useF_NULL; + self->e_UseFunc = useF_NULL; G_SetEnemy( self, other ); self->e_ThinkFunc = thinkF_mega_ammo_think; self->nextthink = level.time + 50; @@ -1383,7 +1386,7 @@ void mega_ammo_think( gentity_t *self ) if ( self->s.frame > 16 && self->s.modelindex != self->s.modelindex2 ) self->s.modelindex = self->s.modelindex2; } - + if ( self->enemy && self->count > 0 ) { // Add an equal ammount of ammo to each type @@ -1445,7 +1448,7 @@ void touch_ammo_crystal_tigger( gentity_t *self, gentity_t *other, trace_t *trac // Add the ammo other->client->ps.ammo[AMMO_POWERCELL] += self->owner->count; - if ( other->client->ps.ammo[AMMO_POWERCELL] > ammoData[AMMO_POWERCELL].max ) + if ( other->client->ps.ammo[AMMO_POWERCELL] > ammoData[AMMO_POWERCELL].max ) { other->client->ps.ammo[AMMO_POWERCELL] = ammoData[AMMO_POWERCELL].max; } @@ -1550,7 +1553,7 @@ void misc_replicator_item_spawn ( gentity_t *self, gentity_t *other, gentity_t * tent->owner = self; } -/*QUAK-ED misc_replicator_item (0.2 0.8 0.2) (-4 -4 0) (4 4 8) +/*QUAK-ED misc_replicator_item (0.2 0.8 0.2) (-4 -4 0) (4 4 8) When used. this will "spawn" an entity with a random model from the ones provided below... Using it again removes the item as if it were picked up. @@ -1717,7 +1720,7 @@ void maglock_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, in self->activator->svFlags &= ~SVF_INACTIVE; } } - + //use targets G_UseTargets( self, attacker ); //die @@ -1725,8 +1728,8 @@ void maglock_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, in } void SP_misc_maglock ( gentity_t *self ) { - //NOTE: May have to make these only work on doors that are either untargeted - // or are targeted by a trigger, not doors fired off by scripts, counters + //NOTE: May have to make these only work on doors that are either untargeted + // or are targeted by a trigger, not doors fired off by scripts, counters // or other such things? self->s.modelindex = G_ModelIndex( "models/map_objects/imp_detention/door_lock.md3" ); self->fxID = G_EffectIndex( "maglock/explosion" ); @@ -1821,14 +1824,14 @@ void EnergyShieldStationSettings(gentity_t *ent) switch (g_spskill->integer) { case 0: // EASY - ent->count = 100; + ent->count = 100; break; case 1: // MEDIUM - ent->count = 75; + ent->count = 75; break; default : case 2: // HARD - ent->count = 50; + ent->count = 50; break; } } @@ -1879,7 +1882,7 @@ void shield_power_converter_use( gentity_t *self, gentity_t *other, gentity_t *a self->s.loopSound = G_SoundIndex( "sound/interface/shieldcon_run.wav" ); } - + if ( self->count <= 0 ) { // play empty sound @@ -1914,7 +1917,7 @@ void shield_power_converter_use( gentity_t *self, gentity_t *other, gentity_t *a self->e_ThinkFunc = thinkF_NULL; self->nextthink = 0; } - + if ( activator->client->ps.stats[STAT_ARMOR] > 0 ) { activator->client->ps.powerups[PW_BATTLESUIT] = Q3_INFINITE; @@ -1937,7 +1940,7 @@ USETARGET - when used it fires off target //------------------------------------------------------------ void SP_misc_model_shield_power_converter( gentity_t *ent ) { - SetMiscModelDefaults( ent, useF_shield_power_converter_use, "4", CONTENTS_SOLID, NULL, qfalse, NULL ); + SetMiscModelDefaults( ent, useF_shield_power_converter_use, "4", CONTENTS_SOLID, 0, qfalse, qfalse ); ent->takedamage = qfalse; @@ -1968,7 +1971,7 @@ void SP_misc_shield_floor_unit( gentity_t *ent ) VectorSet( ent->mins, -16, -16, 0 ); VectorSet( ent->maxs, 16, 16, 32 ); - SetMiscModelDefaults( ent, useF_shield_power_converter_use, "4", CONTENTS_SOLID, NULL, qfalse, NULL ); + SetMiscModelDefaults( ent, useF_shield_power_converter_use, "4", CONTENTS_SOLID, 0, qfalse, qfalse ); ent->takedamage = qfalse; @@ -1997,14 +2000,14 @@ void EnergyAmmoStationSettings(gentity_t *ent) switch (g_spskill->integer) { case 0: // EASY - ent->count = 100; + ent->count = 100; break; case 1: // MEDIUM - ent->count = 75; + ent->count = 75; break; default : case 2: // HARD - ent->count = 50; + ent->count = 50; break; } } @@ -2047,7 +2050,7 @@ void ammo_power_converter_use( gentity_t *self, gentity_t *other, gentity_t *act difMetalBolts = ammoData[AMMO_METAL_BOLTS].max - ps->ammo[AMMO_METAL_BOLTS]; // Has it got any power left...and can we even use any of it? - if ( self->count && ( difBlaster > 0 || difPowerCell > 0 || difMetalBolts > 0 )) + if ( self->count && ( difBlaster > 0 || difPowerCell > 0 || difMetalBolts > 0 )) { // at least one of the ammo types could stand to take on a bit more ammo self->setTime = level.time + 100; @@ -2103,8 +2106,8 @@ void ammo_power_converter_use( gentity_t *self, gentity_t *other, gentity_t *act self->s.frame = 1; } } - else if ( ps->ammo[AMMO_BLASTER] >= ammoData[AMMO_BLASTER].max - && ps->ammo[AMMO_POWERCELL] >= ammoData[AMMO_POWERCELL].max + else if ( ps->ammo[AMMO_BLASTER] >= ammoData[AMMO_BLASTER].max + && ps->ammo[AMMO_POWERCELL] >= ammoData[AMMO_POWERCELL].max && ps->ammo[AMMO_METAL_BOLTS] >= ammoData[AMMO_METAL_BOLTS].max ) { // play full sound @@ -2114,7 +2117,7 @@ void ammo_power_converter_use( gentity_t *self, gentity_t *other, gentity_t *act } } - + if ( self->s.loopSound ) { // we will have to shut of the loop sound, so I guess try and do it intelligently...NOTE: this could get completely stomped every time through the loop @@ -2145,7 +2148,7 @@ USETARGET - when used it fires off target //------------------------------------------------------------ void SP_misc_model_ammo_power_converter( gentity_t *ent ) { - SetMiscModelDefaults( ent, useF_ammo_power_converter_use, "4", CONTENTS_SOLID, NULL, qfalse, NULL ); + SetMiscModelDefaults( ent, useF_ammo_power_converter_use, "4", CONTENTS_SOLID, 0, qfalse, qfalse ); ent->takedamage = qfalse; @@ -2176,7 +2179,7 @@ void SP_misc_ammo_floor_unit( gentity_t *ent ) VectorSet( ent->mins, -16, -16, 0 ); VectorSet( ent->maxs, 16, 16, 32 ); - SetMiscModelDefaults( ent, useF_ammo_power_converter_use, "4", CONTENTS_SOLID, NULL, qfalse, NULL ); + SetMiscModelDefaults( ent, useF_ammo_power_converter_use, "4", CONTENTS_SOLID, 0, qfalse, qfalse ); ent->takedamage = qfalse; @@ -2204,12 +2207,12 @@ void welder_think( gentity_t *self ) mdxaBone_t boltMatrix; if( self->svFlags & SVF_INACTIVE ) - { + { return; } int newBolt; - + // could alternate between the two... or make it random... ? newBolt = gi.G2API_AddBolt( &self->ghoul2[self->playerModel], "*flash" ); // newBolt = gi.G2API_AddBolt( &self->ghoul2[self->playerModel], "*flash01" ); @@ -2231,7 +2234,7 @@ void welder_think( gentity_t *self ) G_RadiusDamage( org, self, 10, 45, self, MOD_UNKNOWN ); } -} +} /* ================ @@ -2243,17 +2246,17 @@ void welder_use( gentity_t *self, gentity_t *other, gentity_t *activator ) // Toggle on and off if( self->spawnflags & 1 ) { - self->nextthink = level.time + FRAMETIME; + self->nextthink = level.time + FRAMETIME; } else { - self->nextthink = -1; + self->nextthink = -1; } self->spawnflags = (self->spawnflags ^ 1); - + } -/*QUAKED misc_model_welder (1 0 0) (-16 -16 -16) (16 16 16) START_OFF +/*QUAKED misc_model_welder (1 0 0) (-16 -16 -16) (16 16 16) START_OFF #MODELNAME="models/map_objects/cairn/welder.md3" When 'on' emits sparks from it's welding points @@ -2266,7 +2269,7 @@ void SP_misc_model_welder( gentity_t *ent ) VectorSet( ent->mins, 336, -16, 0 ); VectorSet( ent->maxs, 368, 16, 32 ); - SetMiscModelDefaults( ent, useF_welder_use, "4", CONTENTS_SOLID, NULL, qfalse, NULL ); + SetMiscModelDefaults( ent, useF_welder_use, "4", CONTENTS_SOLID, 0, qfalse, qfalse ); ent->takedamage = qfalse; ent->contents = 0; @@ -2275,7 +2278,7 @@ void SP_misc_model_welder( gentity_t *ent ) ent->s.modelindex = G_ModelIndex( "models/map_objects/cairn/welder.glm" ); // ent->s.modelindex2 = G_ModelIndex( "models/map_objects/cairn/welder.md3" ); - ent->playerModel = gi.G2API_InitGhoul2Model( ent->ghoul2, "models/map_objects/cairn/welder.glm", ent->s.modelindex, NULL, NULL, 0, 0 ); + ent->playerModel = gi.G2API_InitGhoul2Model( ent->ghoul2, "models/map_objects/cairn/welder.glm", ent->s.modelindex, NULL_HANDLE, NULL_HANDLE, 0, 0 ); ent->s.radius = 400.0f;// the origin of the welder is offset by approximately 352, so we need the big radius ent->e_ThinkFunc = thinkF_welder_think; @@ -2316,7 +2319,7 @@ The eye camera that popped out of Jabba's front door EXTENDED - Starts in the extended position targetname - Toggles it on/off - + */ //----------------------------------------------------- void SP_misc_model_jabba_cam( gentity_t *ent ) @@ -2325,17 +2328,17 @@ void SP_misc_model_jabba_cam( gentity_t *ent ) VectorSet( ent->mins, -60.0f, -8.0f, 0.0f ); VectorSet( ent->maxs, 60.0f, 8.0f, 16.0f ); - - SetMiscModelDefaults( ent, useF_jabba_cam_use, "4", 0, NULL, qfalse, NULL ); + + SetMiscModelDefaults( ent, useF_jabba_cam_use, "4", 0, 0, qfalse, qfalse ); G_SetAngles( ent, ent->s.angles ); ent->s.modelindex = G_ModelIndex( "models/map_objects/nar_shaddar/jabacam/jabacam.glm" ); - ent->playerModel = gi.G2API_InitGhoul2Model( ent->ghoul2, "models/map_objects/nar_shaddar/jabacam/jabacam.glm", ent->s.modelindex, NULL, NULL, 0, 0 ); + ent->playerModel = gi.G2API_InitGhoul2Model( ent->ghoul2, "models/map_objects/nar_shaddar/jabacam/jabacam.glm", ent->s.modelindex, NULL_HANDLE, NULL_HANDLE, 0, 0 ); ent->s.radius = 150.0f; //...... VectorSet( ent->s.modelScale, 1.0f, 1.0f, 1.0f ); ent->rootBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "model_root", qtrue ); - + ent->e_UseFunc = useF_jabba_cam_use; ent->takedamage = qfalse; @@ -2378,7 +2381,7 @@ void SP_misc_exploding_crate( gentity_t *ent ) ent->s.modelindex = G_ModelIndex( "models/map_objects/nar_shaddar/crate_xplode.md3" ); G_SoundIndex("sound/weapons/explosions/cargoexplode.wav"); G_EffectIndex( "chunks/metalexplode" ); - + VectorSet( ent->mins, -24, -24, 0 ); VectorSet( ent->maxs, 24, 24, 64 ); @@ -2484,9 +2487,9 @@ void SP_misc_gas_tank( gentity_t *ent ) #MODELNAME="models/map_objects/imp_mine/crate_open.md3" Open crate of crystals that explode when shot -NON_SOLID - can only be shot +NON_SOLID - can only be shot -"health" - how much health the crate has, default 80 +"health" - how much health the crate has, default 80 "splashRadius" - radius to do damage in, default 80 "splashDamage" - amount of damage to do when it explodes, default 40 @@ -2526,7 +2529,7 @@ void SP_misc_crystal_crate( gentity_t *ent ) VectorSet( ent->mins, -34, -34, 0 ); VectorSet( ent->maxs, 34, 34, 44 ); - + //Blocks movement ent->contents = CONTENTS_SOLID|CONTENTS_OPAQUE|CONTENTS_BODY|CONTENTS_MONSTERCLIP|CONTENTS_BOTCLIP;//Was CONTENTS_SOLID, but only architecture should be this @@ -2535,7 +2538,7 @@ void SP_misc_crystal_crate( gentity_t *ent ) //Can only be shot ent->contents = CONTENTS_SHOTCLIP; } - + ent->takedamage = qtrue; @@ -2577,7 +2580,7 @@ void misc_atst_setanim( gentity_t *self, int bone, int anim ) for ( int i = 0; i < level.numKnownAnimFileSets; i++ ) { if ( !Q_stricmp( "atst", level.knownAnimFileSets[i].filename ) ) - { + { firstFrame = level.knownAnimFileSets[i].animations[anim].firstFrame; lastFrame = firstFrame+level.knownAnimFileSets[i].animations[anim].numFrames; animSpeed = 50.0f / level.knownAnimFileSets[i].animations[anim].frameLerp; @@ -2587,11 +2590,11 @@ void misc_atst_setanim( gentity_t *self, int bone, int anim ) if ( firstFrame != -1 && lastFrame != -1 && animSpeed != 0 ) { if (!gi.G2API_SetBoneAnimIndex( &self->ghoul2[self->playerModel], bone, firstFrame, - lastFrame, BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND, animSpeed, + lastFrame, BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND, animSpeed, (cg.time?cg.time:level.time), -1, 150 )) { gi.G2API_SetBoneAnimIndex( &self->ghoul2[self->playerModel], bone, firstFrame, - lastFrame, BONE_ANIM_OVERRIDE_FREEZE, animSpeed, + lastFrame, BONE_ANIM_OVERRIDE_FREEZE, animSpeed, (cg.time?cg.time:level.time), -1, 150 ); } } @@ -2671,8 +2674,8 @@ void misc_atst_use( gentity_t *self, gentity_t *other, gentity_t *activator ) else {//get out of ATST int legsAnim = activator->client->ps.legsAnim; - if ( legsAnim != BOTH_STAND1 - && !PM_InSlopeAnim( legsAnim ) + if ( legsAnim != BOTH_STAND1 + && !PM_InSlopeAnim( legsAnim ) && legsAnim != BOTH_TURN_RIGHT1 && legsAnim != BOTH_TURN_LEFT1 ) {//can't get out of it while it's still moving return; @@ -2728,7 +2731,7 @@ void SP_misc_atst_drivable( gentity_t *ent ) extern void NPC_PrecacheAnimationCFG( const char *NPC_type ); ent->s.modelindex = G_ModelIndex( "models/players/atst/model.glm" ); - ent->playerModel = gi.G2API_InitGhoul2Model( ent->ghoul2, "models/players/atst/model.glm", ent->s.modelindex, NULL, NULL, 0, 0 ); + ent->playerModel = gi.G2API_InitGhoul2Model( ent->ghoul2, "models/players/atst/model.glm", ent->s.modelindex, NULL_HANDLE, NULL_HANDLE, 0, 0 ); ent->rootBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "model_root", qtrue ); ent->craniumBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "cranium", qtrue ); //FIXME: need to somehow set the anim/frame to the equivalent of BOTH_STAND1... use to be that BOTH_STAND1 was the first frame of the glm, but not anymore ent->s.radius = 320; diff --git a/codeJK2/game/g_misc_model.cpp b/codeJK2/game/g_misc_model.cpp index 1b7b6a8b2e..3587e13903 100644 --- a/codeJK2/game/g_misc_model.cpp +++ b/codeJK2/game/g_misc_model.cpp @@ -1,25 +1,28 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - #include "g_local.h" #include "g_functions.h" #include "bg_public.h" @@ -59,7 +62,7 @@ void SetMiscModelModels( char *modelNameString, gentity_t *ent, qboolean damage_ } //------------------------------------------------------------ -void SetMiscModelDefaults( gentity_t *ent, useFunc_t use_func, char *material, int solid_mask,int animFlag, +void SetMiscModelDefaults( gentity_t *ent, useFunc_t use_func, char *material, int solid_mask,int animFlag, qboolean take_damage, qboolean damage_model = qfalse ) { // Apply damage and chunk models if they exist @@ -74,20 +77,20 @@ void SetMiscModelDefaults( gentity_t *ent, useFunc_t use_func, char *material, i gi.linkentity (ent); // Set a generic use function - - ent->e_UseFunc = use_func; -/* if (use_func == useF_health_use) + + ent->e_UseFunc = use_func; +/* if (use_func == useF_health_use) { G_SoundIndex("sound/player/suithealth.wav"); - } - else if (use_func == useF_ammo_use ) + } + else if (use_func == useF_ammo_use ) { G_SoundIndex("sound/player/suitenergy.wav"); } */ G_SpawnInt( "material", material, (int *)&ent->material ); - - if (ent->health) + + if (ent->health) { ent->max_health = ent->health; ent->takedamage = take_damage; @@ -105,14 +108,14 @@ void HealthStationSettings(gentity_t *ent) switch (g_spskill->integer) { case 0: // EASY - ent->count = 100; + ent->count = 100; break; case 1: // MEDIUM - ent->count = 75; + ent->count = 75; break; default : case 2: // HARD - ent->count = 50; + ent->count = 50; break; } } @@ -128,14 +131,14 @@ void CrystalAmmoSettings(gentity_t *ent) switch (g_spskill->integer) { case 0: // EASY - ent->count = 75; + ent->count = 75; break; case 1: // MEDIUM - ent->count = 75; + ent->count = 75; break; default : case 2: // HARD - ent->count = 75; + ent->count = 75; break; } } @@ -162,7 +165,7 @@ void set_MiscAnim( gentity_t *ent) float animSpeed = 50.0f / animations[anim].frameLerp; // yes, its the same animation, so work out where we are in the leg anim, and blend us - gi.G2API_SetBoneAnim(&ent->ghoul2[0], "model_root", animations[anim].firstFrame, + gi.G2API_SetBoneAnim(&ent->ghoul2[0], "model_root", animations[anim].firstFrame, (animations[anim].numFrames -1 )+ animations[anim].firstFrame, BONE_ANIM_OVERRIDE_FREEZE | BONE_ANIM_BLEND , animSpeed, (cg.time?cg.time:level.time), -1, 350); } @@ -170,7 +173,7 @@ void set_MiscAnim( gentity_t *ent) { int anim = BOTH_PAIN3; float animSpeed = 50.0f / animations[anim].frameLerp; - gi.G2API_SetBoneAnim(&ent->ghoul2[0], "model_root", animations[anim].firstFrame, + gi.G2API_SetBoneAnim(&ent->ghoul2[0], "model_root", animations[anim].firstFrame, (animations[anim].numFrames -1 )+ animations[anim].firstFrame, BONE_ANIM_OVERRIDE_FREEZE | BONE_ANIM_BLEND, animSpeed, (cg.time?cg.time:level.time), -1, 350); } @@ -183,7 +186,7 @@ void SP_misc_model_ghoul( gentity_t *ent ) { #if 1 ent->s.modelindex = G_ModelIndex( ent->model ); - gi.G2API_InitGhoul2Model(ent->ghoul2, ent->model, ent->s.modelindex, NULL, NULL, 0, 0); + gi.G2API_InitGhoul2Model(ent->ghoul2, ent->model, ent->s.modelindex, NULL_HANDLE, NULL_HANDLE, 0, 0); ent->s.radius = 50; G_SetOrigin( ent, ent->s.origin ); @@ -223,11 +226,11 @@ void SP_misc_model_ghoul( gentity_t *ent ) ent->s.radius = 150; // we found the model ok - load it's animation config - if ( !G_ParseAnimFileSet( "kyle", "_humanoid", &temp_animFileIndex ) ) + if ( !G_ParseAnimFileSet( "kyle", "_humanoid", &temp_animFileIndex ) ) { Com_Printf( S_COLOR_RED"Failed to load animation file set models/players/jedi/animation.cfg\n"); } - + ent->s.angles[0] = 0; ent->s.angles[1] = 90; @@ -261,7 +264,7 @@ void SP_misc_model_ghoul( gentity_t *ent ) animation_t *animations = level.knownAnimFileSets[temp_animFileIndex].animations; int anim = BOTH_STAND3; float animSpeed = 50.0f / animations[anim].frameLerp; - gi.G2API_SetBoneAnim(&ent->ghoul2[0], "model_root", animations[anim].firstFrame, + gi.G2API_SetBoneAnim(&ent->ghoul2[0], "model_root", animations[anim].firstFrame, (animations[anim].numFrames -1 )+ animations[anim].firstFrame, BONE_ANIM_OVERRIDE_FREEZE , animSpeed, cg.time); diff --git a/codeJK2/game/g_missile.cpp b/codeJK2/game/g_missile.cpp index 90ead6f039..8973f7539e 100644 --- a/codeJK2/game/g_missile.cpp +++ b/codeJK2/game/g_missile.cpp @@ -1,25 +1,28 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - #include "g_local.h" #include "g_functions.h" #include "wp_saber.h" diff --git a/codeJK2/game/g_mover.cpp b/codeJK2/game/g_mover.cpp index 01f8dde53e..2f88da1abc 100644 --- a/codeJK2/game/g_mover.cpp +++ b/codeJK2/game/g_mover.cpp @@ -1,26 +1,28 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - - #include "g_local.h" #include "g_functions.h" #include "objectives.h" @@ -121,16 +123,16 @@ gentity_t *G_TestEntityPosition( gentity_t *ent ) { if ( (ent->client && ent->health <= 0) || !ent->clipmask ) {//corpse or something with no clipmask mask = MASK_SOLID; - } - else + } + else { mask = ent->clipmask; } - if ( ent->client ) + if ( ent->client ) { gi.trace( &tr, ent->client->ps.origin, ent->mins, ent->maxs, ent->client->ps.origin, ent->s.number, mask, G2_NOCOLLIDE, 0 ); - } - else + } + else { if ( ent->s.eFlags & EF_MISSILE_STICK )//Arggh, this is dumb...but when it used the bbox, it was pretty much always in solid when it is riding something..which is wrong..so I changed it to basically be a point contents check { @@ -141,10 +143,10 @@ gentity_t *G_TestEntityPosition( gentity_t *ent ) { gi.trace( &tr, ent->s.pos.trBase, ent->mins, ent->maxs, ent->s.pos.trBase, ent->s.number, mask, G2_NOCOLLIDE, 0 ); } } - + if (tr.startsolid) return &g_entities[ tr.entityNum ]; - + return NULL; } @@ -164,7 +166,7 @@ qboolean G_TryPushingEntity( gentity_t *check, gentity_t *pusher, vec3_t move, v /* // EF_MOVER_STOP will just stop when contacting another entity // instead of pushing it, but entities can still ride on top of it - if ( ( pusher->s.eFlags & EF_MOVER_STOP ) && + if ( ( pusher->s.eFlags & EF_MOVER_STOP ) && check->s.groundEntityNum != pusher->s.number ) { return qfalse; } @@ -187,7 +189,7 @@ qboolean G_TryPushingEntity( gentity_t *check, gentity_t *pusher, vec3_t move, v VectorSubtract (vec3_origin, amove, org); AngleVectors (org, forward, right, up); - // try moving the contacted entity + // try moving the contacted entity VectorAdd (check->s.pos.trBase, move, check->s.pos.trBase); if (check->client) { // make sure the client's view rotates when on a rotating mover @@ -285,22 +287,22 @@ qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t ** // mins/maxs are the bounds at the destination // totalMins / totalMaxs are the bounds for the entire move if ( pusher->currentAngles[0] || pusher->currentAngles[1] || pusher->currentAngles[2] - || amove[0] || amove[1] || amove[2] ) + || amove[0] || amove[1] || amove[2] ) { float radius; radius = RadiusFromBounds( pusher->mins, pusher->maxs ); - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { mins[i] = pusher->currentOrigin[i] + move[i] - radius; maxs[i] = pusher->currentOrigin[i] + move[i] + radius; totalMins[i] = mins[i] - move[i]; totalMaxs[i] = maxs[i] - move[i]; } - } - else + } + else { - for (i=0 ; i<3 ; i++) + for (i=0 ; i<3 ; i++) { mins[i] = pusher->absmin[i] + move[i]; maxs[i] = pusher->absmax[i] + move[i]; @@ -308,13 +310,13 @@ qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t ** VectorCopy( pusher->absmin, totalMins ); VectorCopy( pusher->absmax, totalMaxs ); - for (i=0 ; i<3 ; i++) + for (i=0 ; i<3 ; i++) { - if ( move[i] > 0 ) + if ( move[i] > 0 ) { totalMaxs[i] += move[i]; - } - else + } + else { totalMins[i] += move[i]; } @@ -345,10 +347,10 @@ qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t ** } // only push items and players - if ( check->s.eType != ET_ITEM ) + if ( check->s.eType != ET_ITEM ) { //FIXME: however it allows items to be pushed through stuff, do same for corpses? - if ( check->s.eType != ET_PLAYER ) + if ( check->s.eType != ET_PLAYER ) { if ( !( check->s.eFlags & EF_MISSILE_STICK )) { @@ -397,7 +399,7 @@ qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t ** } // see if the ent's bbox is inside the pusher's final position // this does allow a fast moving object to pass through a thin entity... - if ( G_TestEntityPosition( check ) != pusher ) + if ( G_TestEntityPosition( check ) != pusher ) { continue; } @@ -428,7 +430,7 @@ qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t ** VectorCopy( check->s.pos.trBase, oldOrg ); // the entity needs to be pushed - if ( G_TryPushingEntity( check, pusher, move, amove ) ) + if ( G_TryPushingEntity( check, pusher, move, amove ) ) { // the mover wasn't blocked if ( check->s.eFlags & EF_MISSILE_STICK ) @@ -455,7 +457,7 @@ qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t ** G_Damage( check, pusher, pusher, NULL, NULL, 99999, 0, MOD_CRUSH ); continue; } - + // save off the obstacle so we can call the block function (crush, etc) *obstacle = check; @@ -494,7 +496,7 @@ void G_MoverTeam( gentity_t *ent ) { // any moves or calling any think functions // if the move is blocked, all moved objects will be backed out pushed_p = pushed; - for (part = ent ; part ; part=part->teamchain) + for (part = ent ; part ; part=part->teamchain) { // get current position part->s.eFlags &= ~EF_BLOCKED_MOVER; @@ -502,17 +504,17 @@ void G_MoverTeam( gentity_t *ent ) { EvaluateTrajectory( &part->s.apos, level.time, angles ); VectorSubtract( origin, part->currentOrigin, move ); VectorSubtract( angles, part->currentAngles, amove ); - if ( !G_MoverPush( part, move, amove, &obstacle ) ) + if ( !G_MoverPush( part, move, amove, &obstacle ) ) { break; // move was blocked } } - if (part) + if (part) { // if the pusher has a "blocked" function, call it // go back to the previous position - for ( part = ent ; part ; part = part->teamchain ) + for ( part = ent ; part ; part = part->teamchain ) { //Push up time so it doesn't wiggle when blocked part->s.pos.trTime += level.time - level.previousTime; @@ -523,7 +525,7 @@ void G_MoverTeam( gentity_t *ent ) { part->s.eFlags |= EF_BLOCKED_MOVER; } - if ( ent->e_BlockedFunc != blockedF_NULL ) + if ( ent->e_BlockedFunc != blockedF_NULL ) {// this check no longer necessary, done internally below, but it's here for reference GEntity_BlockedFunc( ent, obstacle ); } @@ -531,14 +533,14 @@ void G_MoverTeam( gentity_t *ent ) { } // the move succeeded - for ( part = ent ; part ; part = part->teamchain ) + for ( part = ent ; part ; part = part->teamchain ) { // call the reached function if time is at or past end point if ( part->s.pos.trType == TR_LINEAR_STOP || - part->s.pos.trType == TR_NONLINEAR_STOP ) + part->s.pos.trType == TR_NONLINEAR_STOP ) { - if ( level.time >= part->s.pos.trTime + part->s.pos.trDuration ) - { + if ( level.time >= part->s.pos.trTime + part->s.pos.trDuration ) + { GEntity_ReachedFunc( part ); } } @@ -589,7 +591,7 @@ CalcTeamDoorCenter Finds all the doors of a team and returns their center position */ -void CalcTeamDoorCenter ( gentity_t *ent, vec3_t center ) +void CalcTeamDoorCenter ( gentity_t *ent, vec3_t center ) { vec3_t slavecenter; gentity_t *slave; @@ -597,7 +599,7 @@ void CalcTeamDoorCenter ( gentity_t *ent, vec3_t center ) //Start with our center VectorAdd(ent->mins, ent->maxs, center); VectorScale(center, 0.5, center); - for ( slave = ent->teamchain ; slave ; slave = slave->teamchain ) + for ( slave = ent->teamchain ; slave ; slave = slave->teamchain ) { //Find slave's center VectorAdd(slave->mins, slave->maxs, slavecenter); @@ -666,7 +668,7 @@ void SetMoverState( gentity_t *ent, moverState_t moverState, int time ) { ent->s.eFlags &= ~EF_BLOCKED_MOVER; break; } - EvaluateTrajectory( &ent->s.pos, level.time, ent->currentOrigin ); + EvaluateTrajectory( &ent->s.pos, level.time, ent->currentOrigin ); gi.linkentity( ent ); } @@ -712,12 +714,12 @@ Reached_BinaryMover ================ */ -void Reached_BinaryMover( gentity_t *ent ) +void Reached_BinaryMover( gentity_t *ent ) { // stop the looping sound ent->s.loopSound = 0; - if ( ent->moverState == MOVER_1TO2 ) + if ( ent->moverState == MOVER_1TO2 ) {//reached open // reached pos2 SetMoverState( ent, MOVER_POS2, level.time ); @@ -753,13 +755,13 @@ void Reached_BinaryMover( gentity_t *ent ) } // fire targets - if ( !ent->activator ) + if ( !ent->activator ) { ent->activator = ent; } G_UseTargets2( ent, ent->activator, ent->opentarget ); - } - else if ( ent->moverState == MOVER_2TO1 ) + } + else if ( ent->moverState == MOVER_2TO1 ) {//closed // reached pos1 SetMoverState( ent, MOVER_POS1, level.time ); @@ -774,13 +776,13 @@ void Reached_BinaryMover( gentity_t *ent ) G_PlayDoorSound( ent, BMS_END ); // close areaportals - if ( ent->teammaster == ent || !ent->teammaster ) + if ( ent->teammaster == ent || !ent->teammaster ) { gi.AdjustAreaPortalState( ent, qfalse ); } G_UseTargets2( ent, ent->activator, ent->closetarget ); - } - else + } + else { G_Error( "Reached_BinaryMover: bad moverState" ); } @@ -792,7 +794,7 @@ void Reached_BinaryMover( gentity_t *ent ) Use_BinaryMover_Go ================ */ -void Use_BinaryMover_Go( gentity_t *ent ) +void Use_BinaryMover_Go( gentity_t *ent ) { int total; int partial; @@ -801,7 +803,7 @@ void Use_BinaryMover_Go( gentity_t *ent ) ent->activator = activator; - if ( ent->moverState == MOVER_POS1 ) + if ( ent->moverState == MOVER_POS1 ) { // start moving 50 msec later, becase if this was player // triggered, level.time hasn't been advanced yet @@ -844,7 +846,7 @@ void Use_BinaryMover_Go( gentity_t *ent ) } // only partway down before reversing - if ( ent->moverState == MOVER_2TO1 ) + if ( ent->moverState == MOVER_2TO1 ) { total = ent->s.pos.trDuration-50; if ( ent->s.pos.trType == TR_NONLINEAR_STOP ) @@ -878,7 +880,7 @@ void Use_BinaryMover_Go( gentity_t *ent ) } // only partway up before reversing - if ( ent->moverState == MOVER_1TO2 ) + if ( ent->moverState == MOVER_1TO2 ) { total = ent->s.pos.trDuration-50; if ( ent->s.pos.trType == TR_NONLINEAR_STOP ) @@ -916,7 +918,7 @@ void UnLockDoors(gentity_t *const ent) //noise? //go through and unlock the door and all the slaves gentity_t *slave = ent; - do + do { // want to allow locked toggle doors, so keep the targetname if( !(slave->spawnflags & MOVER_TOGGLE) ) { @@ -932,7 +934,7 @@ void LockDoors(gentity_t *const ent) //noise? //go through and lock the door and all the slaves gentity_t *slave = ent; - do + do { slave->spawnflags |= MOVER_LOCKED; slave->s.frame = 0;//first stage of anim @@ -944,7 +946,7 @@ void LockDoors(gentity_t *const ent) Use_BinaryMover ================ */ -void Use_BinaryMover( gentity_t *ent, gentity_t *other, gentity_t *activator ) +void Use_BinaryMover( gentity_t *ent, gentity_t *other, gentity_t *activator ) { int key; char *text; @@ -955,7 +957,7 @@ void Use_BinaryMover( gentity_t *ent, gentity_t *other, gentity_t *activator ) } // only the master should be used - if ( ent->flags & FL_TEAMSLAVE ) + if ( ent->flags & FL_TEAMSLAVE ) { Use_BinaryMover( ent->teammaster, other, activator ); return; @@ -978,12 +980,12 @@ void Use_BinaryMover( gentity_t *ent, gentity_t *other, gentity_t *activator ) { return; } - else + else { key = INV_GoodieKeyCheck( activator ); if (key) {//activator has a goodie key, remove it - activator->client->ps.inventory[key]--; + activator->client->ps.inventory[key]--; G_Sound( activator, G_SoundIndex( "sound/movers/goodie_pass.wav" ) ); // once the goodie mover has been used, it no longer requires a goodie key ent->spawnflags &= ~MOVER_GOODIE; @@ -1036,19 +1038,19 @@ void InitMoverTrData( gentity_t *ent ) // calculate time to reach second position from speed VectorSubtract( ent->pos2, ent->pos1, move ); distance = VectorLength( move ); - if ( ! ent->speed ) + if ( ! ent->speed ) { ent->speed = 100; } VectorScale( move, ent->speed, ent->s.pos.trDelta ); ent->s.pos.trDuration = distance * 1000 / ent->speed; - if ( ent->s.pos.trDuration <= 0 ) + if ( ent->s.pos.trDuration <= 0 ) { ent->s.pos.trDuration = 1; } } -void InitMover( gentity_t *ent ) +void InitMover( gentity_t *ent ) { float light; vec3_t color; @@ -1056,12 +1058,12 @@ void InitMover( gentity_t *ent ) // if the "model2" key is set, use a seperate model // for drawing, but clip against the brushes - if ( ent->model2 ) + if ( ent->model2 ) { if ( strstr( ent->model2, ".glm" )) { ent->s.modelindex2 = G_ModelIndex( ent->model2 ); - ent->playerModel = gi.G2API_InitGhoul2Model( ent->ghoul2, ent->model2, ent->s.modelindex2, NULL, NULL, 0, 0 ); + ent->playerModel = gi.G2API_InitGhoul2Model( ent->ghoul2, ent->model2, ent->s.modelindex2, NULL_HANDLE, NULL_HANDLE, 0, 0 ); if ( ent->playerModel >= 0 ) { ent->rootBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "model_root", qtrue ); @@ -1107,7 +1109,7 @@ void InitMover( gentity_t *ent ) ent->svFlags = SVF_USE_CURRENT_ORIGIN; if ( ent->spawnflags & MOVER_INACTIVE ) {// Make it inactive - ent->svFlags |= SVF_INACTIVE; + ent->svFlags |= SVF_INACTIVE; } if(ent->spawnflags & MOVER_PLAYER_USE) {//Can be used by the player's BUTTON_USE @@ -1138,7 +1140,7 @@ Blocked_Door ================ */ void Blocked_Door( gentity_t *ent, gentity_t *other ) { - + // remove anything other than a client -- no longer the case // don't remove security keys or goodie keys @@ -1175,7 +1177,7 @@ Touch_DoorTrigger ================ */ -void Touch_DoorTrigger( gentity_t *ent, gentity_t *other, trace_t *trace ) +void Touch_DoorTrigger( gentity_t *ent, gentity_t *other, trace_t *trace ) { if ( ent->svFlags & SVF_INACTIVE ) { @@ -1183,11 +1185,11 @@ void Touch_DoorTrigger( gentity_t *ent, gentity_t *other, trace_t *trace ) } if ( ent->owner->spawnflags & MOVER_LOCKED ) - {//don't even try to use the door if it's locked + {//don't even try to use the door if it's locked return; } - if ( ent->owner->moverState != MOVER_1TO2 ) + if ( ent->owner->moverState != MOVER_1TO2 ) {//Door is not already opening //if ( ent->owner->moverState == MOVER_POS1 || ent->owner->moverState == MOVER_2TO1 ) //{//only check these if closed or closing @@ -1212,16 +1214,16 @@ All of the parts of a door have been spawned, so create a trigger that encloses all of them ====================== */ -void Think_SpawnNewDoorTrigger( gentity_t *ent ) +void Think_SpawnNewDoorTrigger( gentity_t *ent ) { gentity_t *other; vec3_t mins, maxs; int i, best; // set all of the slaves as shootable - if ( ent->takedamage ) + if ( ent->takedamage ) { - for ( other = ent ; other ; other = other->teamchain ) + for ( other = ent ; other ; other = other->teamchain ) { other->takedamage = qtrue; } @@ -1259,7 +1261,7 @@ void Think_SpawnNewDoorTrigger( gentity_t *ent ) MatchTeam( ent, ent->moverState, level.time ); } -void Think_MatchTeam( gentity_t *ent ) +void Think_MatchTeam( gentity_t *ent ) { MatchTeam( ent, ent->moverState, level.time ); } @@ -1419,7 +1421,7 @@ INACTIVE must be used by a target_activate before it can be used "linear" set to 1 and it will move linearly rather than with acceleration (default is 0) 0 - no sound (default) */ -void SP_func_door (gentity_t *ent) +void SP_func_door (gentity_t *ent) { vec3_t abs_movedir; float distance; @@ -1469,7 +1471,7 @@ void SP_func_door (gentity_t *ent) VectorMA( ent->pos1, distance, ent->movedir, ent->pos2 ); // if "start_open", reverse position 1 and 2 - if ( ent->spawnflags & 1 ) + if ( ent->spawnflags & 1 ) { vec3_t temp; @@ -1487,23 +1489,23 @@ void SP_func_door (gentity_t *ent) ent->nextthink = level.time + FRAMETIME; - if ( !(ent->flags&FL_TEAMSLAVE) ) + if ( !(ent->flags&FL_TEAMSLAVE) ) { int health; G_SpawnInt( "health", "0", &health ); - - if ( health ) + + if ( health ) { ent->takedamage = qtrue; } - + if ( !(ent->spawnflags&MOVER_LOCKED) && (ent->targetname || health || ent->spawnflags & MOVER_PLAYER_USE || ent->spawnflags & MOVER_FORCE_ACTIVATE) ) { // non touch/shoot doors ent->e_ThinkFunc = thinkF_Think_MatchTeam; - } - else + } + else {//locked doors still spawn a trigger ent->e_ThinkFunc = thinkF_Think_SpawnNewDoorTrigger; } @@ -1573,7 +1575,7 @@ void SpawnPlatTrigger( gentity_t *ent ) { trigger->e_TouchFunc = touchF_Touch_PlatCenterTrigger; trigger->contents = CONTENTS_TRIGGER; trigger->owner = ent; - + tmin[0] = ent->pos1[0] + ent->mins[0] + 33; tmin[1] = ent->pos1[1] + ent->mins[1] + 33; tmin[2] = ent->pos1[2] + ent->mins[2]; @@ -1590,7 +1592,7 @@ void SpawnPlatTrigger( gentity_t *ent ) { tmin[1] = ent->pos1[1] + (ent->mins[1] + ent->maxs[1]) *0.5; tmax[1] = tmin[1] + 1; } - + VectorCopy (tmin, trigger->mins); VectorCopy (tmax, trigger->maxs); @@ -1704,7 +1706,7 @@ void SP_func_button( gentity_t *ent ) { float lip; // ent->sound1to2 = G_SoundIndex("sound/movers/switches/butn2.wav"); - + if ( !ent->speed ) { ent->speed = 40; } @@ -1765,7 +1767,7 @@ The wait time at a corner has completed, so start moving again */ void Think_BeginMoving( gentity_t *ent ) { - if ( ent->spawnflags & 2048 ) + if ( ent->spawnflags & 2048 ) { // this tie fighter hack is done for doom_detention, where the shooting gallery takes place. let them draw again when they start moving ent->s.eFlags &= ~EF_NODRAW; @@ -1861,7 +1863,7 @@ void Reached_Train( gentity_t *ent ) { ent->s.apos.trType = TR_NONLINEAR_STOP; } } - else + else { if (( next->spawnflags & 4 )) {//yaw @@ -1900,7 +1902,7 @@ void Reached_Train( gentity_t *ent ) { } // if there is a "wait" value on the target, don't start moving yet - if ( next->wait ) + if ( next->wait ) { ent->nextthink = level.time + next->wait * 1000; ent->e_ThinkFunc = thinkF_Think_BeginMoving; @@ -1994,7 +1996,7 @@ void Think_SetupTrainTargets( gentity_t *ent ) { /*QUAKED path_corner (.5 .3 0) (-8 -8 -8) (8 8 8) TURN_TRAIN INVISIBLE YAW_TRAIN ROLL_TRAIN TURN_TRAIN func_train moving on this path will turn to face the next path_corner within 2 seconds -INVISIBLE - train will become invisible ( but still solid ) when it reaches this path_corner. +INVISIBLE - train will become invisible ( but still solid ) when it reaches this path_corner. It will become visible again at the next path_corner that does not have this option checked Train path corners. @@ -2149,7 +2151,7 @@ A bmodel that just sits there, doing nothing. Can be used for conditional walls "dmg" how much damage to do when it crushes (use with CRUSHER spawnflag) "linear" set to 1 and it will move linearly rather than with acceleration (default is 0) */ -void SP_func_static( gentity_t *ent ) +void SP_func_static( gentity_t *ent ) { gi.SetBrushModel( ent, ent->model ); @@ -2195,7 +2197,7 @@ ROTATING =============================================================================== */ -void func_rotating_touch( gentity_t *self, gentity_t *other, trace_t *trace ) +void func_rotating_touch( gentity_t *self, gentity_t *other, trace_t *trace ) { // vec3_t spot; // gentity_t *tent; @@ -2212,7 +2214,7 @@ void func_rotating_touch( gentity_t *self, gentity_t *other, trace_t *trace ) // tent->owner = self; // let G_Damage call the fx instead, beside, this way you can disintegrate a corpse this way G_Sound( other, G_SoundIndex( "sound/effects/energy_crackle.wav" ) ); - G_Damage( other, self, self, NULL, NULL, 10000, DAMAGE_NO_KNOCKBACK, MOD_SNIPER ); + G_Damage( other, self, self, NULL, NULL, 10000, DAMAGE_NO_KNOCKBACK, MOD_SNIPER ); } } @@ -2288,12 +2290,12 @@ void SP_func_rotating (gentity_t *ent) { gi.SetBrushModel( ent, ent->model ); InitMover( ent ); - + if ( ent->targetname ) { ent->e_UseFunc = useF_func_rotating_use; } - + VectorCopy( ent->s.origin, ent->s.pos.trBase ); VectorCopy( ent->s.pos.trBase, ent->currentOrigin ); VectorCopy( ent->s.apos.trBase, ent->currentAngles ); @@ -2509,9 +2511,9 @@ A bmodel that just sits there, doing nothing. Can be used for conditional walls "light" constantLight radius START_OFF - the wall will not be there -AUTOANIMATE - if a model is used it will animate +AUTOANIMATE - if a model is used it will animate */ -void SP_func_wall( gentity_t *ent ) +void SP_func_wall( gentity_t *ent ) { gi.SetBrushModel( ent, ent->model ); diff --git a/codeJK2/game/g_nav.cpp b/codeJK2/game/g_nav.cpp index 5040b249d6..a85d479776 100644 --- a/codeJK2/game/g_nav.cpp +++ b/codeJK2/game/g_nav.cpp @@ -1,25 +1,27 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - #include "b_local.h" #include "g_nav.h" #include "g_navigator.h" @@ -75,11 +77,11 @@ void NPC_Blocked( gentity_t *self, gentity_t *blocker ) } Debug_Printf( debugNPCAI, DEBUG_LEVEL_WARNING, "%s: Excuse me, %s %s!\n", self->targetname, blocker->classname, blocker->targetname ); - + //If we're being blocked by the player, say something to them if ( ( blocker->s.number == 0 ) && ( ( blocker->client->playerTeam == self->client->playerTeam ) ) ) { - //guys in formation are not trying to get to a critical point, + //guys in formation are not trying to get to a critical point, //don't make them yell at the player (unless they have an enemy and //are in combat because BP thinks it sounds cool during battle) //NOTE: only imperials, misc crewmen and hazard team have these wav files now @@ -112,7 +114,7 @@ void NPC_SetMoveGoal( gentity_t *ent, vec3_t point, int radius, qboolean isNavGo //Copy the origin //VectorCopy( point, ent->NPC->goalPoint ); //FIXME: Make it use this, and this alone! VectorCopy( point, ent->NPC->tempGoal->currentOrigin ); - + //Copy the mins and maxs to the tempGoal VectorCopy( ent->mins, ent->NPC->tempGoal->mins ); VectorCopy( ent->mins, ent->NPC->tempGoal->maxs ); @@ -177,7 +179,7 @@ qboolean NAV_HitNavGoal( vec3_t point, vec3_t mins, vec3_t maxs, vec3_t dest, in return ( DistanceSquared(dest, point) <= (radius*radius) ); } //There is probably a better way to do this, either by preserving the original - // mins and maxs of the navgoal and doing this check ONLY if the radius + // mins and maxs of the navgoal and doing this check ONLY if the radius // is non-zero (like the original implementation) or some boolean to // tell us to do this check rather than the fake bbox overlap check... } @@ -234,7 +236,7 @@ qboolean NAV_ClearPathToPoint( gentity_t *self, vec3_t pmins, vec3_t pmaxs, vec3 VectorCopy( pmins, mins ); VectorCopy( pmaxs, maxs ); } - + if ( self->client || ( self->svFlags & SVF_NAVGOAL ) ) { //Clients can step up things, or if this is a navgoal check, a client will be using this info @@ -242,7 +244,7 @@ qboolean NAV_ClearPathToPoint( gentity_t *self, vec3_t pmins, vec3_t pmaxs, vec3 //don't let box get inverted if ( mins[2] > maxs[2] ) - { + { mins[2] = maxs[2]; } } @@ -256,18 +258,18 @@ qboolean NAV_ClearPathToPoint( gentity_t *self, vec3_t pmins, vec3_t pmaxs, vec3 clipmask &= ~CONTENTS_BOTCLIP; gi.trace( &trace, point, mins, maxs, self->currentOrigin, self->owner->s.number, (clipmask|CONTENTS_MONSTERCLIP)&~CONTENTS_BODY, G2_NOCOLLIDE, 0 ); } - + if ( trace.startsolid || trace.allsolid ) { return qfalse; } - + //Made it if ( trace.fraction == 1.0 ) { return qtrue; } - + if ( okToHitEntNum != ENTITYNUM_NONE && trace.entityNum == okToHitEntNum ) { return qtrue; @@ -347,7 +349,7 @@ int NAV_FindClosestWaypointForPoint( gentity_t *ent, vec3_t point ) int bestWP; //FIXME: can we make this a static ent? static gentity_t *marker = G_Spawn(); - + if ( !marker ) { return WAYPOINT_NONE; @@ -373,7 +375,7 @@ int NAV_FindClosestWaypointForPoint( vec3_t point ) int bestWP; //FIXME: can we make this a static ent? gentity_t *marker = G_Spawn(); - + if ( !marker ) { return WAYPOINT_NONE; @@ -483,7 +485,7 @@ qboolean NAV_CheckAhead( gentity_t *self, vec3_t end, trace_t &trace, int clipma //Offset the step height VectorSet( mins, self->mins[0], self->mins[1], self->mins[2] + STEPSIZE ); - + gi.trace( &trace, self->currentOrigin, mins, self->maxs, end, self->s.number, clipmask, G2_NOCOLLIDE, 0 ); if ( trace.startsolid&&(trace.contents&CONTENTS_BOTCLIP) ) @@ -511,7 +513,7 @@ qboolean NAV_CheckAhead( gentity_t *self, vec3_t end, trace_t &trace, int clipma if ( trace.entityNum < ENTITYNUM_WORLD ) { gentity_t *blocker = &g_entities[trace.entityNum]; - + if VALIDSTRING( blocker->classname ) { if ( G_EntIsUnlockedDoor( blocker->s.number ) ) @@ -546,7 +548,7 @@ static qboolean NAV_TestBypass( gentity_t *self, float yaw, float blocked_dist, AngleVectors( avoidAngles, block_test, NULL, NULL ); VectorMA( self->currentOrigin, blocked_dist, block_test, block_pos ); - + if ( NAVDEBUG_showCollision ) { CG_DrawEdge( self->currentOrigin, block_pos, EDGE_BLOCKED ); @@ -556,7 +558,7 @@ static qboolean NAV_TestBypass( gentity_t *self, float yaw, float blocked_dist, if ( NAV_CheckAhead( self, block_pos, tr, ( self->clipmask & ~CONTENTS_BODY )|CONTENTS_BOTCLIP ) ) { VectorCopy( block_test, movedir ); - + return qtrue; } @@ -569,7 +571,7 @@ NAV_Bypass ------------------------- */ -qboolean NAV_Bypass( gentity_t *self, gentity_t *blocker, vec3_t blocked_dir, float blocked_dist, vec3_t movedir ) +qboolean NAV_Bypass( gentity_t *self, gentity_t *blocker, vec3_t blocked_dir, float blocked_dist, vec3_t movedir ) { float dot; vec3_t right; @@ -586,7 +588,7 @@ qboolean NAV_Bypass( gentity_t *self, gentity_t *blocker, vec3_t blocked_dir, fl float yaw = vectoyaw( blocked_dir ); //Get the avoid radius - float avoidRadius = sqrt( ( blocker->maxs[0] * blocker->maxs[0] ) + ( blocker->maxs[1] * blocker->maxs[1] ) ) + + float avoidRadius = sqrt( ( blocker->maxs[0] * blocker->maxs[0] ) + ( blocker->maxs[1] * blocker->maxs[1] ) ) + sqrt( ( self->maxs[0] * self->maxs[0] ) + ( self->maxs[1] * self->maxs[1] ) ); //See if we're inside our avoidance radius @@ -652,7 +654,7 @@ NAV_MoveBlocker qboolean NAV_MoveBlocker( gentity_t *self, vec3_t shove_dir ) { //FIXME: This is a temporary method for making blockers move - + //FIXME: This will, of course, push blockers off of cliffs, into walls and all over the place vec3_t temp_dir, forward; @@ -747,7 +749,7 @@ qboolean NAV_StackedCanyon( gentity_t *self, gentity_t *blocker, vec3_t pathDir PerpendicularVector( perp, pathDir ); CrossProduct( pathDir, perp, cross ); - avoidRadius = sqrt( ( blocker->maxs[0] * blocker->maxs[0] ) + ( blocker->maxs[1] * blocker->maxs[1] ) ) + + avoidRadius = sqrt( ( blocker->maxs[0] * blocker->maxs[0] ) + ( blocker->maxs[1] * blocker->maxs[1] ) ) + sqrt( ( self->maxs[0] * self->maxs[0] ) + ( self->maxs[1] * self->maxs[1] ) ); VectorMA( blocker->currentOrigin, avoidRadius, cross, test ); @@ -822,7 +824,7 @@ qboolean NAV_ResolveEntityCollision( gentity_t *self, gentity_t *blocker, vec3_t //Make sure an actual collision is going to happen // if ( NAV_PredictCollision( self, blocker, movedir, blocked_dir ) == qfalse ) // return qtrue; - + //See if we can get around the blocker at all (only for player!) if ( blocker->s.number == 0 ) { @@ -927,7 +929,7 @@ qboolean NAV_AvoidCollision( gentity_t *self, gentity_t *goal, navInfo_t &info ) return qfalse; VectorCopy( movedir, info.direction ); - + return qtrue; } @@ -958,7 +960,7 @@ int NAV_TestBestNode( gentity_t *self, int startID, int endID, qboolean failEdge //Offset the step height VectorSet( mins, self->mins[0], self->mins[1], self->mins[2] + STEPSIZE ); - + gi.trace( &trace, self->currentOrigin, mins, self->maxs, end, self->s.number, clipmask, G2_NOCOLLIDE, 0 ); if ( trace.startsolid&&(trace.contents&CONTENTS_BOTCLIP) ) @@ -993,7 +995,7 @@ int NAV_TestBestNode( gentity_t *self, int startID, int endID, qboolean failEdge if ( trace.entityNum < ENTITYNUM_WORLD ) { gentity_t *blocker = &g_entities[trace.entityNum]; - + if VALIDSTRING( blocker->classname ) {//special case: doors are architecture, but are dynamic, like entitites if ( G_EntIsUnlockedDoor( blocker->s.number ) ) @@ -1047,7 +1049,7 @@ int NAV_TestBestNode( gentity_t *self, int startID, int endID, qboolean failEdge } } } - //path is blocked + //path is blocked //use the fallback choice return startID; } @@ -1129,7 +1131,7 @@ int NAV_MoveToGoal( gentity_t *self, navInfo_t &info ) CG_DrawNode( origin, NODE_GOAL ); CG_DrawNode( self->NPC->goalEntity->currentOrigin, NODE_START ); } - + return WAYPOINT_NONE; } @@ -1252,7 +1254,7 @@ void SP_waypoint ( gentity_t *ent ) { VectorSet(ent->mins, DEFAULT_MINS_0, DEFAULT_MINS_1, DEFAULT_MINS_2); VectorSet(ent->maxs, DEFAULT_MAXS_0, DEFAULT_MAXS_1, DEFAULT_MAXS_2); - + ent->contents = CONTENTS_TRIGGER; ent->clipmask = MASK_DEADSOLID; @@ -1459,7 +1461,7 @@ targetname - name you would use in script when setting a navgoal (like so:) You CANNOT set a radius on these navgoals, they are touch-reach ONLY */ void SP_waypoint_navgoal_2( gentity_t *ent ) -{ +{ VectorSet( ent->mins, -2, -2, -24 ); VectorSet( ent->maxs, 2, 2, 32 ); ent->s.origin[2] += 0.125; @@ -1533,11 +1535,11 @@ void Svcmd_Nav_f( void ) if ( Q_stricmp( cmd, "all" ) == 0 ) { NAVDEBUG_showNodes = !NAVDEBUG_showNodes; - + //NOTENOTE: This causes the two states to sync up if they aren't already - NAVDEBUG_showCollision = NAVDEBUG_showNavGoals = - NAVDEBUG_showCombatPoints = NAVDEBUG_showEnemyPath = - NAVDEBUG_showEdges = NAVDEBUG_showRadius = NAVDEBUG_showNodes; + NAVDEBUG_showCollision = NAVDEBUG_showNavGoals = + NAVDEBUG_showCombatPoints = NAVDEBUG_showEnemyPath = + NAVDEBUG_showEdges = NAVDEBUG_showRadius = NAVDEBUG_showNodes; } else if ( Q_stricmp( cmd, "nodes" ) == 0 ) { @@ -1645,7 +1647,7 @@ qboolean NAV_WaypointsTooFar( gentity_t *wp1, gentity_t *wp2 ) sprintf( temp, S_COLOR_RED"Waypoint conn %s->%s > 1024\n", wp1->targetname, wp2->targetname ); } len = strlen( temp ); - if ( (fatalErrorPointer-fatalErrorString)+len >= sizeof( fatalErrorString ) ) + if ( (fatalErrorPointer-fatalErrorString)+len >= (int)sizeof( fatalErrorString ) ) { Com_Error( ERR_DROP, "%s%s%dTOO MANY FATAL NAV ERRORS!!!\n", fatalErrorString, temp, fatalErrors ); return qtrue; @@ -1854,7 +1856,7 @@ void NAV_ShowDebugInfo( void ) //Get the nearest node to the player int nearestNode = navigator.GetNearestNode( &g_entities[0], g_entities[0].waypoint, NF_ANY, WAYPOINT_NONE ); int testNode = navigator.GetBestNode( nearestNode, NAVDEBUG_curGoal ); - + nearestNode = NAV_TestBestNode( &g_entities[0], nearestNode, testNode, qfalse ); //Show the connection diff --git a/codeJK2/game/g_nav.h b/codeJK2/game/g_nav.h index 95859bf59c..cde2d7df01 100644 --- a/codeJK2/game/g_nav.h +++ b/codeJK2/game/g_nav.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __G_NAV_H__ #define __G_NAV_H__ diff --git a/codeJK2/game/g_navigator.cpp b/codeJK2/game/g_navigator.cpp index de14738555..b7f9273fad 100644 --- a/codeJK2/game/g_navigator.cpp +++ b/codeJK2/game/g_navigator.cpp @@ -1,22 +1,25 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" #include @@ -97,7 +100,7 @@ CNode *CNode::Create( vec3_t position, int flags, int radius, int ID ) CNode *node = new CNode; VectorCopy( position, node->m_position ); - + node->m_flags = flags; node->m_ID = ID; node->m_radius = radius; @@ -138,7 +141,7 @@ void CNode::AddEdge( int ID, int cost, int flags ) } } } - + edge_t edge; edge.ID = ID; @@ -280,7 +283,7 @@ unsigned char CNode::GetEdgeFlags( int edgeNum ) count++; } - + return 0; } @@ -591,7 +594,7 @@ bool CNavigator::Load( const char *filename, int checksum ) } int numNodes = GetInt( file ); - + for ( int i = 0; i < numNodes; i++ ) { CNode *node = CNode::Create(); @@ -609,9 +612,9 @@ bool CNavigator::Load( const char *filename, int checksum ) gi.FS_Read( &failedEdges, sizeof( failedEdges ), file ); for ( int j = 0; j < MAX_FAILED_EDGES; j++ ) { - m_edgeLookupMap.insert(pair(failedEdges[j].startID, j)); + m_edgeLookupMap.insert(pair(failedEdges[j].startID, j)); } - + gi.FS_FCloseFile( file ); @@ -678,7 +681,7 @@ int CNavigator::AddRawPoint( vec3_t point, int flags, int radius ) Com_Error( ERR_DROP, "Error adding node!\n" ); return -1; } - + //TODO: Validate the position //TODO: Correct stuck waypoints @@ -730,7 +733,7 @@ void CNavigator::SetEdgeCost( int ID1, int ID2, int cost ) {//they want us to calc it //FIXME: can we just remember this instead of recalcing every time? vec3_t pos1, pos2; - + node1->GetPosition( pos1 ); node2->GetPosition( pos2 ); cost = Distance( pos1, pos2 ); @@ -800,15 +803,13 @@ void CNavigator::CalculatePath( CNode *node ) pathList->Push( new CEdge( nextNode->GetID(), nextNode->GetID(), node->GetEdgeCost(i) ) ); } - float minDist; - CEdge *test; + CEdge *test; //Now flood fill all the others while ( !pathList->Empty() ) { - minDist = Q3_INFINITE; test = pathList->Pop(); - + CNode *testNode = m_nodes[ (*test).m_first ]; assert( testNode ); @@ -851,27 +852,27 @@ void CNavigator::CalculatePaths( bool recalc ) #endif #if _HARD_CONNECT #else -#endif +#endif int i; - for ( i = 0; i < m_nodes.size(); i++ ) + for ( i = 0; i < (int)m_nodes.size(); i++ ) { //Allocate the needed memory m_nodes[i]->InitRanks( m_nodes.size() ); } - for ( i = 0; i < m_nodes.size(); i++ ) + for ( i = 0; i < (int)m_nodes.size(); i++ ) { CalculatePath( m_nodes[i] ); } - + #ifndef FINAL_BUILD if ( pathsCalculated ) { gi.Printf( S_COLOR_CYAN"%s recalced paths in %d ms\n", (NPC!=NULL?NPC->targetname:"NULL"), gi.Milliseconds()-startTime ); } #endif - + if(!recalc) //Mike says doesn't need to happen on recalc { CP_FindCombatPointWaypoints(); @@ -901,11 +902,11 @@ void CNavigator::ShowNodes( void ) showRadius = qfalse; if( NAVDEBUG_showRadius ) - { + { dist = DistanceSquared( g_entities[0].currentOrigin, position ); radius = (*ni)->GetRadius(); // if player within node radius or 256, draw radius (sometimes the radius is really small, so we check for 256 to catch everything) - if( (dist <= radius*radius) || dist <= 65536 ) + if( (dist <= radius*radius) || dist <= 65536 ) { showRadius = qtrue; } @@ -1092,7 +1093,7 @@ void CNavigator::HardConnect( int first, int second ) end->GetPosition( p2 ); trace_t trace; - + int flags = EFLAG_NONE; gi.trace( &trace, p1, wpMins, wpMaxs, p2, ENTITYNUM_NONE, MASK_SOLID|CONTENTS_BOTCLIP|CONTENTS_MONSTERCLIP, G2_NOCOLLIDE, 0 ); @@ -1127,7 +1128,7 @@ int CNavigator::TestNodePath( gentity_t *ent, int okToHitEntNum, vec3_t position //Check the path if ( NAV_ClearPathToPoint( ent, ent->mins, ent->maxs, position, clipmask, okToHitEntNum ) == false ) return false; - + return true; } @@ -1154,7 +1155,7 @@ int CNavigator::TestBestFirst( gentity_t *ent, int lastID, int flags ) if ( lastID == NODE_NONE ) return NODE_NONE; - if ( lastID >= m_nodes.size() ) + if ( lastID >= (int)m_nodes.size() ) return NODE_NONE; //Get the info @@ -1166,7 +1167,7 @@ int CNavigator::TestBestFirst( gentity_t *ent, int lastID, int flags ) node->GetPosition( nodePos ); - //Setup our last node as our root, and search for a closer one according to its edges + //Setup our last node as our root, and search for a closer one according to its edges int bestNode = ( TestNodePath( ent, ENTITYNUM_NONE, nodePos, qtrue ) ) ? lastID : NODE_NONE; float bestDist = ( bestNode == NODE_NONE ) ? Q3_INFINITE : DistanceSquared( ent->currentOrigin, nodePos ); @@ -1199,7 +1200,7 @@ int CNavigator::TestBestFirst( gentity_t *ent, int lastID, int flags ) { SetCheckedNode(testNode->GetID(),ent->s.number,CHECKED_FAILED); } - } + } } return bestNode; @@ -1234,7 +1235,7 @@ int CNavigator::CollectNearestNodes( vec3_t origin, int radius, int maxCollect, //Must be within our radius range if ( dist > (float) ( radius * radius ) ) continue; - + nodeList_t nChain; nodeChain_l::iterator nci; @@ -1262,9 +1263,9 @@ int CNavigator::CollectNearestNodes( vec3_t origin, int radius, int maxCollect, nodeChain.insert( nci, nChain ); collected = nodeChain.size(); added = true; - + //If we've hit our collection limit, throw off the oldest one - if ( nodeChain.size() > maxCollect ) + if ( (int)nodeChain.size() > maxCollect ) { nodeChain.pop_back(); } @@ -1274,7 +1275,7 @@ int CNavigator::CollectNearestNodes( vec3_t origin, int radius, int maxCollect, } //Otherwise, always pad out the collection if possible so we don't miss anything - if ( ( added == false ) && ( nodeChain.size() < maxCollect ) ) + if ( ( added == false ) && ( (int)nodeChain.size() < maxCollect ) ) { nChain.nodeID = (*ni)->GetID(); nChain.distance = dist; @@ -1340,9 +1341,9 @@ int CNavigator::GetBestPathBetweenEnts( gentity_t *ent, gentity_t *goal, int fla } //okay, since we only have to do this once, let's check to see if this node is even usable (could help us short-circuit a whole loop of the dest nodes) radius = node->GetRadius(); - + //If we're not within the known clear radius of this node OR out of Z height range... - if ( (*nci).distance >= (radius*radius) || ( fabs( position[2] - ent->currentOrigin[2] ) >= MAX_Z_DELTA ) ) + if ( (signed)(*nci).distance >= (radius*radius) || ( fabs( position[2] - ent->currentOrigin[2] ) >= MAX_Z_DELTA ) ) { //We're not *within* this node, so check clear path, etc. @@ -1430,9 +1431,9 @@ int CNavigator::GetBestPathBetweenEnts( gentity_t *ent, gentity_t *goal, int fla continue; } radius = node2->GetRadius(); - + //If we're not within the known clear radius of this node OR out of Z height range... - if ( (*nci2).distance >= (radius*radius) || ( fabs( position2[2] - goal->currentOrigin[2] ) >= MAX_Z_DELTA ) ) + if ( (signed)(*nci2).distance >= (radius*radius) || ( fabs( position2[2] - goal->currentOrigin[2] ) >= MAX_Z_DELTA ) ) { //We're not *within* this node, so check clear path, etc. @@ -1521,18 +1522,18 @@ int CNavigator::GetNearestNode( gentity_t *ent, int lastID, int flags, int targe node->GetPosition( position ); radius = node->GetRadius(); - + if ( NodeFailed( ent, (*nci).nodeID ) ) { continue; } //Are we within the known clear radius of this node? - if ( (*nci).distance < (radius*radius) ) + if ( (signed)(*nci).distance < (radius*radius) ) { //Do a z-difference sanity check if ( fabs( position[2] - ent->currentOrigin[2] ) < MAX_Z_DELTA ) { - //Found one + //Found one return (*nci).nodeID; } } @@ -1599,18 +1600,18 @@ ShowPath */ void CNavigator::ShowPath( int start, int end ) -{ +{ //Validate the start position - if ( ( start < 0 ) || ( start >= m_nodes.size() ) ) + if ( ( start < 0 ) || ( start >= (int)m_nodes.size() ) ) return; //Validate the end position - if ( ( end < 0 ) || ( end >= m_nodes.size() ) ) + if ( ( end < 0 ) || ( end >= (int)m_nodes.size() ) ) return; CNode *startNode = m_nodes[ start ]; CNode *endNode = m_nodes[ end ]; - + CNode *moveNode = startNode; CNode *testNode = NULL; @@ -1623,7 +1624,7 @@ void CNavigator::ShowPath( int start, int end ) while ( moveNode != endNode ) { bestNode = GetBestNode( moveNode->GetID(), end ); - + //Some nodes may be fragmented if ( bestNode == -1 ) { @@ -1637,7 +1638,7 @@ void CNavigator::ShowPath( int start, int end ) //Get their origins moveNode->GetPosition( startPos ); testNode->GetPosition( endPos ); - + //Draw the edge CG_DrawEdge( startPos, endPos, EDGE_PATH ); @@ -1834,25 +1835,25 @@ void CNavigator::ClearAllFailedEdges( void ) } int CNavigator::EdgeFailed( int startID, int endID ) -{ +{ //OPTIMIZED WAY (bjg 01/02) //find in lookup map pair findValue; - findValue = m_edgeLookupMap.equal_range(startID); - while ( findValue.first != findValue.second ) + findValue = m_edgeLookupMap.equal_range(startID); + while ( findValue.first != findValue.second ) { if( failedEdges[findValue.first->second].endID == endID) - { - return findValue.first->second; + { + return findValue.first->second; } ++findValue.first; } - findValue = m_edgeLookupMap.equal_range(endID); - while ( findValue.first != findValue.second ) + findValue = m_edgeLookupMap.equal_range(endID); + while ( findValue.first != findValue.second ) { if( failedEdges[findValue.first->second].endID == startID) - { - return findValue.first->second; + { + return findValue.first->second; } ++findValue.first; } @@ -1909,7 +1910,7 @@ void CNavigator::AddFailedEdge( int entID, int startID, int endID ) } //Validate the start position - if ( ( startID < 0 ) || ( startID >= m_nodes.size() ) ) + if ( ( startID < 0 ) || ( startID >= (int)m_nodes.size() ) ) { #ifndef FINAL_BUILD gi.Printf( S_COLOR_RED"NAV ERROR: tried to fail invalid waypoint %d\n", startID ); @@ -1919,7 +1920,7 @@ void CNavigator::AddFailedEdge( int entID, int startID, int endID ) } //Validate the end position - if ( ( endID < 0 ) || ( endID >= m_nodes.size() ) ) + if ( ( endID < 0 ) || ( endID >= (int)m_nodes.size() ) ) { #ifndef FINAL_BUILD gi.Printf( S_COLOR_RED"NAV ERROR: tried to fail invalid waypoint %d\n", endID ); @@ -1972,7 +1973,7 @@ void CNavigator::AddFailedEdge( int entID, int startID, int endID ) } } */ - + //Remember who needed it failedEdges[j].entID = entID; @@ -2145,7 +2146,7 @@ qboolean CNavigator::RouteBlocked( int startID, int testEdgeID, int endID, int r {//Neighbors, checked out, all clear return qfalse; } - + //Okay, first edge is clear, now check rest of route! end = m_nodes[ endID ]; nextID = testEdgeID; @@ -2197,7 +2198,7 @@ qboolean CNavigator::RouteBlocked( int startID, int testEdgeID, int endID, int r allEdgesFailed = qfalse; } } - + if ( allEdgesFailed ) { //This route has no clear way of getting to end @@ -2224,11 +2225,11 @@ int CNavigator::GetBestNodeAltRoute( int startID, int endID, int *pathCost, int return WAYPOINT_NONE; //Validate the start position - if ( ( startID < 0 ) || ( startID >= m_nodes.size() ) ) + if ( ( startID < 0 ) || ( startID >= (int)m_nodes.size() ) ) return WAYPOINT_NONE; //Validate the end position - if ( ( endID < 0 ) || ( endID >= m_nodes.size() ) ) + if ( ( endID < 0 ) || ( endID >= (int)m_nodes.size() ) ) return WAYPOINT_NONE; //Is it the same node? @@ -2336,11 +2337,11 @@ GetBestNode int CNavigator::GetBestNode( int startID, int endID, int rejectID ) { //Validate the start position - if ( ( startID < 0 ) || ( startID >= m_nodes.size() ) ) + if ( ( startID < 0 ) || ( startID >= (int)m_nodes.size() ) ) return WAYPOINT_NONE; //Validate the end position - if ( ( endID < 0 ) || ( endID >= m_nodes.size() ) ) + if ( ( endID < 0 ) || ( endID >= (int)m_nodes.size() ) ) return WAYPOINT_NONE; if ( startID == endID ) @@ -2403,7 +2404,7 @@ GetNodePosition int CNavigator::GetNodePosition( int nodeID, vec3_t out ) { //Validate the number - if ( ( nodeID < 0 ) || ( nodeID >= m_nodes.size() ) ) + if ( ( nodeID < 0 ) || ( nodeID >= (int)m_nodes.size() ) ) return false; CNode *node = m_nodes[ nodeID ]; @@ -2421,7 +2422,7 @@ GetNodeNumEdges int CNavigator::GetNodeNumEdges( int nodeID ) { - if ( ( nodeID < 0 ) || ( nodeID >= m_nodes.size() ) ) + if ( ( nodeID < 0 ) || ( nodeID >= (int)m_nodes.size() ) ) return -1; CNode *node = m_nodes[ nodeID ]; @@ -2439,7 +2440,7 @@ GetNodeEdge int CNavigator::GetNodeEdge( int nodeID, int edge ) { - if ( ( nodeID < 0 ) || ( nodeID >= m_nodes.size() ) ) + if ( ( nodeID < 0 ) || ( nodeID >= (int)m_nodes.size() ) ) return -1; CNode *node = m_nodes[ nodeID ]; @@ -2458,11 +2459,11 @@ Connected bool CNavigator::Connected( int startID, int endID ) { //Validate the start position - if ( ( startID < 0 ) || ( startID >= m_nodes.size() ) ) + if ( ( startID < 0 ) || ( startID >= (int)m_nodes.size() ) ) return false; //Validate the end position - if ( ( endID < 0 ) || ( endID >= m_nodes.size() ) ) + if ( ( endID < 0 ) || ( endID >= (int)m_nodes.size() ) ) return false; if ( startID == endID ) @@ -2495,11 +2496,11 @@ GetPathCost unsigned int CNavigator::GetPathCost( int startID, int endID ) { //Validate the start position - if ( ( startID < 0 ) || ( startID >= m_nodes.size() ) ) + if ( ( startID < 0 ) || ( startID >= (int)m_nodes.size() ) ) return Q3_INFINITE; // return 0; //Validate the end position - if ( ( endID < 0 ) || ( endID >= m_nodes.size() ) ) + if ( ( endID < 0 ) || ( endID >= (int)m_nodes.size() ) ) return Q3_INFINITE; // return 0; CNode *startNode = m_nodes[ startID ]; @@ -2510,7 +2511,7 @@ unsigned int CNavigator::GetPathCost( int startID, int endID ) } CNode *endNode = m_nodes[ endID ]; - + CNode *moveNode = startNode; int bestNode; @@ -2535,7 +2536,7 @@ unsigned int CNavigator::GetPathCost( int startID, int endID ) if ( edgeID == endID ) { return pathCost + moveNode->GetEdgeCost( i ); - } + } testRank = endNode->GetRank( edgeID ); @@ -2572,11 +2573,11 @@ GetEdgeCost unsigned int CNavigator::GetEdgeCost( int startID, int endID ) { //Validate the start position - if ( ( startID < 0 ) || ( startID >= m_nodes.size() ) ) + if ( ( startID < 0 ) || ( startID >= (int)m_nodes.size() ) ) return Q3_INFINITE; // return 0; //Validate the end position - if ( ( endID < 0 ) || ( endID >= m_nodes.size() ) ) + if ( ( endID < 0 ) || ( endID >= (int)m_nodes.size() ) ) return Q3_INFINITE; // return 0; CNode *start = m_nodes[startID]; @@ -2594,7 +2595,7 @@ GetProjectedNode int CNavigator::GetProjectedNode( vec3_t origin, int nodeID ) { //Validate the start position - if ( ( nodeID < 0 ) || ( nodeID >= m_nodes.size() ) ) + if ( ( nodeID < 0 ) || ( nodeID >= (int)m_nodes.size() ) ) return NODE_NONE; CNode *node = m_nodes[nodeID]; @@ -2641,7 +2642,7 @@ int CNavigator::GetProjectedNode( vec3_t origin, int nodeID ) ////////////////////////////////////////////////////////////////// // Helper pop_mHeap algorithm class ////////////////////////////////////////////////////////////////// -class NodeTotalGreater +class NodeTotalGreater { public: bool operator()( CEdge * first, CEdge * second ) const { @@ -2680,7 +2681,7 @@ CEdge* CPriorityQueue::Find(int npNum) // Remove Node And Resort ////////////////////////////////////////////////////////////////// CEdge* CPriorityQueue::Pop() -{ +{ CEdge *edge = mHeap.front(); //pop_mHeap will move the node at the front to the position N @@ -2700,7 +2701,7 @@ CEdge* CPriorityQueue::Pop() // Add New Node And Resort ////////////////////////////////////////////////////////////////// void CPriorityQueue::Push(CEdge* theEdge ) -{ +{ //Pushes the node onto the back of the mHeap mHeap.push_back( theEdge ); @@ -2712,7 +2713,7 @@ void CPriorityQueue::Push(CEdge* theEdge ) // Find The Node In Question And Resort mHeap Around It ////////////////////////////////////////////////////////////////// void CPriorityQueue::Update( CEdge* edge ) -{ +{ for(vector::iterator i=mHeap.begin(); i!=mHeap.end(); i++) { if( (*i)->m_first == edge->m_first ) diff --git a/codeJK2/game/g_navigator.h b/codeJK2/game/g_navigator.h index dd67da16fe..a4b91662aa 100644 --- a/codeJK2/game/g_navigator.h +++ b/codeJK2/game/g_navigator.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __G_NAVIGATOR__ #define __G_NAVIGATOR__ @@ -36,8 +40,8 @@ This file is part of Jedi Knight 2. //Miscellaneous defines #define NODE_NONE -1 -#define NAV_HEADER_ID 'JNV5' -#define NODE_HEADER_ID 'NODE' +#define NAV_HEADER_ID INT_ID('J','N','V','5') +#define NODE_HEADER_ID INT_ID('N','O','D','E') typedef multimap EdgeMultimap; typedef multimap::iterator EdgeMultimapIt; @@ -95,7 +99,7 @@ class CNode int GetID( void ) const { return m_ID; } void GetPosition( vec3_t position ) const { if ( position ) VectorCopy( m_position, position ); } - + int GetNumEdges( void ) const { return m_numEdges; } int GetEdgeNumToNode( int ID ); int GetEdge( int edgeNum ); @@ -120,7 +124,7 @@ class CNode int m_flags; int m_radius; int m_ID; - + edge_v m_edges; int *m_ranks; @@ -147,7 +151,7 @@ class CNavigator typedef list < CEdge > edge_l; #if __NEWCOLLECT - + struct nodeList_t { int nodeID; @@ -192,7 +196,7 @@ class CNavigator float GetNodeLeadDistance( int nodeID ); int GetNumNodes( void ) const { return (int)m_nodes.size(); } - + bool Connected( int startID, int endID ); unsigned int GetPathCost( int startID, int endID ); @@ -223,7 +227,7 @@ class CNavigator void FlagAllNodes( int newFlag ); qboolean pathsCalculated; - failedEdge_t failedEdges[MAX_FAILED_EDGES]; + failedEdge_t failedEdges[MAX_FAILED_EDGES]; //MCG Added END @@ -232,7 +236,7 @@ class CNavigator int TestNodePath( gentity_t *ent, int okToHitEntNum, vec3_t position, qboolean includeEnts ); int TestNodeLOS( gentity_t *ent, vec3_t position ); int TestBestFirst( gentity_t *ent, int lastID, int flags ); - + #if __NEWCOLLECT int CollectNearestNodes( vec3_t origin, int radius, int maxCollect, nodeChain_l &nodeChain ); #else @@ -265,7 +269,7 @@ class CPriorityQueue public: CPriorityQueue() {}; ~CPriorityQueue(); - + // Functionality //-------------------------------------------------------------- public: @@ -274,7 +278,7 @@ class CPriorityQueue void Push( CEdge* theEdge ); void Update(CEdge* edge ); bool Empty(); - + // DATA //-------------------------------------------------------------- diff --git a/codeJK2/game/g_navnew.cpp b/codeJK2/game/g_navnew.cpp index 23af270e41..9e53e7b6a7 100644 --- a/codeJK2/game/g_navnew.cpp +++ b/codeJK2/game/g_navnew.cpp @@ -1,25 +1,27 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - #include "b_local.h" #include "g_nav.h" #include "g_navigator.h" @@ -137,7 +139,7 @@ void NAVNEW_PushBlocker( gentity_t *self, gentity_t *blocker, vec3_t right, qboo { leftSucc = 0.0f; } - + if ( leftSucc >= 1.0f ) {//it's clear, shove him that way VectorScale( right, -moveamt, blocker->client->pushVec ); @@ -155,7 +157,7 @@ void NAVNEW_PushBlocker( gentity_t *self, gentity_t *blocker, vec3_t right, qboo { rightSucc = 0.0f; } - + if ( leftSucc == 0.0f && rightSucc == 0.0f ) {//both sides failed if ( d_patched->integer ) @@ -252,7 +254,7 @@ qboolean NAVNEW_SidestepBlocker( gentity_t *self, gentity_t *blocker, vec3_t blo float yaw = vectoyaw( blocked_dir ); //Get the avoid radius - float avoidRadius = sqrt( ( blocker->maxs[0] * blocker->maxs[0] ) + ( blocker->maxs[1] * blocker->maxs[1] ) ) + + float avoidRadius = sqrt( ( blocker->maxs[0] * blocker->maxs[0] ) + ( blocker->maxs[1] * blocker->maxs[1] ) ) + sqrt( ( self->maxs[0] * self->maxs[0] ) + ( self->maxs[1] * self->maxs[1] ) ); //See if we're inside our avoidance radius @@ -287,7 +289,7 @@ qboolean NAVNEW_SidestepBlocker( gentity_t *self, gentity_t *blocker, vec3_t blo AngleVectors( avoidAngles, avoidRight_dir, NULL, NULL ); VectorMA( self->currentOrigin, blocked_dist, avoidRight_dir, block_pos ); - + gi.trace( &tr, self->currentOrigin, mins, self->maxs, block_pos, self->s.number, self->clipmask|CONTENTS_BOTCLIP, G2_NOCOLLIDE, 0 ); if ( !tr.allsolid && !tr.startsolid ) @@ -313,7 +315,7 @@ qboolean NAVNEW_SidestepBlocker( gentity_t *self, gentity_t *blocker, vec3_t blo AngleVectors( avoidAngles, avoidLeft_dir, NULL, NULL ); VectorMA( self->currentOrigin, blocked_dist, avoidLeft_dir, block_pos ); - + gi.trace( &tr, self->currentOrigin, mins, self->maxs, block_pos, self->s.number, self->clipmask|CONTENTS_BOTCLIP, G2_NOCOLLIDE, 0 ); if ( !tr.allsolid && !tr.startsolid ) @@ -337,7 +339,7 @@ qboolean NAVNEW_SidestepBlocker( gentity_t *self, gentity_t *blocker, vec3_t blo return qfalse; } - if ( rightSucc*blocked_dist >= avoidRadius || leftSucc*blocked_dist >= avoidRadius ) + if ( rightSucc*blocked_dist >= avoidRadius || leftSucc*blocked_dist >= avoidRadius ) {//the traces hit something, but got a relatively good distance if ( rightSucc >= leftSucc ) {//favor the right, all things being equal @@ -363,7 +365,7 @@ qboolean NAVNEW_SidestepBlocker( gentity_t *self, gentity_t *blocker, vec3_t blo NAVNEW_Bypass ------------------------- */ -qboolean NAVNEW_Bypass( gentity_t *self, gentity_t *blocker, vec3_t blocked_dir, float blocked_dist, vec3_t movedir, qboolean setBlockedInfo ) +qboolean NAVNEW_Bypass( gentity_t *self, gentity_t *blocker, vec3_t blocked_dir, float blocked_dist, vec3_t movedir, qboolean setBlockedInfo ) { //Draw debug info if requested if ( NAVDEBUG_showCollision ) @@ -434,7 +436,7 @@ qboolean NAVNEW_ResolveEntityCollision( gentity_t *self, gentity_t *blocker, vec //Make sure an actual collision is going to happen // if ( NAVNEW_PredictCollision( self, blocker, movedir, blocked_dir ) == qfalse ) // return qtrue; - + //First, attempt to walk around the blocker or shove him out of the way if ( NAVNEW_Bypass( self, blocker, blocked_dir, blocked_dist, movedir, setBlockedInfo ) ) return qtrue; @@ -515,7 +517,7 @@ qboolean NAVNEW_AvoidCollision( gentity_t *self, gentity_t *goal, navInfo_t &inf return qfalse; VectorCopy( movedir, info.direction ); - + return qtrue; } else @@ -572,7 +574,7 @@ qboolean NAVNEW_TestNodeConnectionBlocked( int wp1, int wp2, gentity_t *ignoreEn mins[2] += STEPSIZE; //don't let box get inverted if ( mins[2] > maxs[2] ) - { + { mins[2] = maxs[2]; } @@ -596,7 +598,7 @@ int NAVNEW_MoveToGoal( gentity_t *self, navInfo_t &info ) vec3_t origin; navInfo_t tempInfo; qboolean setBlockedInfo = qtrue; - qboolean inBestWP, inGoalWP, goalWPFailed = qfalse; + qboolean inGoalWP; int numTries = 0; memcpy( &tempInfo, &info, sizeof( tempInfo ) ); @@ -641,7 +643,7 @@ int NAVNEW_MoveToGoal( gentity_t *self, navInfo_t &info ) while( !foundClearPath ) { - inBestWP = inGoalWP = qfalse; + /*inBestWP = */inGoalWP = qfalse; /* bestNode = navigator.GetBestNodeAltRoute( self->waypoint, self->NPC->goalEntity->waypoint, bestNode ); */ @@ -655,7 +657,7 @@ int NAVNEW_MoveToGoal( gentity_t *self, navInfo_t &info ) //NOTE: shouldn't be necc. now /* int oldBestNode = bestNode; - bestNode = NAV_TestBestNode( self, self->waypoint, bestNode, qtrue );//, self->NPC->goalEntity->waypoint );// + bestNode = NAV_TestBestNode( self, self->waypoint, bestNode, qtrue );//, self->NPC->goalEntity->waypoint );// //NOTE: Guaranteed to return something if ( bestNode != oldBestNode ) {//we were blocked somehow @@ -765,7 +767,7 @@ int NAVNEW_MoveToGoal( gentity_t *self, navInfo_t &info ) } else {//try going for our waypoint this time - goalWPFailed = qtrue; + //goalWPFailed = qtrue; inGoalWP = qfalse; } } @@ -790,7 +792,7 @@ int NAVNEW_MoveToGoal( gentity_t *self, navInfo_t &info ) goto failed; } } - else + else {//we headed for *our* waypoint and couldn't get to it if ( d_altRoutes->integer ) { @@ -873,7 +875,7 @@ int NAVNEW_MoveToGoal( gentity_t *self, navInfo_t &info ) VectorSubtract( origin, self->currentOrigin, info.direction ); VectorNormalize( info.direction ); } - + goto finish; */ } \ No newline at end of file diff --git a/codeJK2/game/g_object.cpp b/codeJK2/game/g_object.cpp index 5133fd82d1..169af46e3f 100644 --- a/codeJK2/game/g_object.cpp +++ b/codeJK2/game/g_object.cpp @@ -1,25 +1,27 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - #include "g_local.h" #include "g_functions.h" diff --git a/codeJK2/game/g_objectives.cpp b/codeJK2/game/g_objectives.cpp index c8a40940af..ecaf60c9fd 100644 --- a/codeJK2/game/g_objectives.cpp +++ b/codeJK2/game/g_objectives.cpp @@ -1,25 +1,27 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - //g_objectives.cpp //reads in ext_data\objectives.dat to objectives[] diff --git a/codeJK2/game/g_public.h b/codeJK2/game/g_public.h index fefb8398ed..a428f7ecc4 100644 --- a/codeJK2/game/g_public.h +++ b/codeJK2/game/g_public.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __G_PUBLIC_H__ #define __G_PUBLIC_H__ @@ -163,7 +168,7 @@ typedef struct { int (*FS_Read)( void *buffer, int len, fileHandle_t f ); int (*FS_Write)( const void *buffer, int len, fileHandle_t f ); void (*FS_FCloseFile)( fileHandle_t f ); - int (*FS_ReadFile)( const char *name, void **buf ); + long (*FS_ReadFile)( const char *name, void **buf ); void (*FS_FreeFile)( void *buf ); int (*FS_GetFileList)( const char *path, const char *extension, char *listbuf, int bufsize ); diff --git a/codeJK2/game/g_ref.cpp b/codeJK2/game/g_ref.cpp index 31e372b59b..53f54189f6 100644 --- a/codeJK2/game/g_ref.cpp +++ b/codeJK2/game/g_ref.cpp @@ -1,27 +1,28 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Reference tag utility functions -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - - #include "g_local.h" #include "g_functions.h" #include "g_nav.h" @@ -85,7 +86,7 @@ void TAG_Init( void ) } refTag_v::iterator rti; - + //Delete all tags within the owner's scope for ( rti = ((*rtoi).second)->tags.begin(); rti != ((*rtoi).second)->tags.end(); rti++ ) { @@ -168,7 +169,7 @@ reference_tag_t *TAG_Find( const char *owner, const char *name ) Q_strlwr( (char *) tempName ); //NOTENOTE: For case insensitive searches on a map rti = tagOwner->tagMap.find( tempName ); - + if ( rti == tagOwner->tagMap.end() ) return NULL; } @@ -186,7 +187,7 @@ reference_tag_t *TAG_Add( const char *name, const char *owner, vec3_t origin, ve { reference_tag_t *tag = new reference_tag_t; VALIDATEP( tag ); - + //Copy the information VectorCopy( origin, tag->origin ); VectorCopy( angles, tag->angles ); @@ -197,6 +198,7 @@ reference_tag_t *TAG_Add( const char *name, const char *owner, vec3_t origin, ve { //gi.Error("Nameless ref_tag found at (%i %i %i)", (int)origin[0], (int)origin[1], (int)origin[2]); gi.Printf(S_COLOR_RED"ERROR: Nameless ref_tag found at (%i %i %i)\n", (int)origin[0], (int)origin[1], (int)origin[2]); + delete tag; return NULL; } @@ -208,6 +210,7 @@ reference_tag_t *TAG_Add( const char *name, const char *owner, vec3_t origin, ve if ( TAG_Find( owner, name ) ) { gi.Printf(S_COLOR_RED"Duplicate tag name \"%s\"\n", name ); + delete tag; return NULL; } @@ -219,7 +222,7 @@ reference_tag_t *TAG_Add( const char *name, const char *owner, vec3_t origin, ve } tagOwner_t *tagOwner = TAG_FindOwner( owner ); - + //If the owner is valid, add this tag to it if VALID( tagOwner ) { @@ -300,7 +303,7 @@ int TAG_GetAngles( const char *owner, const char *name, vec3_t angles ) VALIDATEB( tag ); VectorCopy( tag->angles, angles ); - + return true; } @@ -354,12 +357,12 @@ If you target a ref_tag at an entity, that will set the ref_tag's angles toward that entity. If you set the ref_tag's ownername to the ownername of an entity, -it makes that entity is the owner of the ref_tag. This means +it makes that entity is the owner of the ref_tag. This means that the owner, and only the owner, may refer to that tag. Tags may not have the same name as another tag with the same owner. However, tags with different owners may have the same -name as one another. In this way, scripts can generically +name as one another. In this way, scripts can generically refer to tags by name, and their owners will automatically specifiy which tag is being referred to. @@ -370,8 +373,6 @@ target - use to point the tag at something for angles void ref_link ( gentity_t *ent ) { - reference_tag_t *tag; - if ( ent->target ) { //TODO: Find the target and set our angles to that direction @@ -384,7 +385,7 @@ void ref_link ( gentity_t *ent ) VectorSubtract( target->s.origin, ent->s.origin, dir ); VectorNormalize( dir ); vectoangles( dir, ent->s.angles ); - + //FIXME: Does pitch get flipped? } else @@ -392,9 +393,9 @@ void ref_link ( gentity_t *ent ) gi.Printf( S_COLOR_RED"ERROR: ref_tag (%s) has invalid target (%s)\n", ent->targetname, ent->target ); } } - + //Add the tag - tag = TAG_Add( ent->targetname, ent->ownername, ent->s.origin, ent->s.angles, 16, 0 ); + TAG_Add( ent->targetname, ent->ownername, ent->s.origin, ent->s.angles, 16, 0 ); //Delete immediately, cannot be refered to as an entity again //NOTE: this means if you wanted to link them in a chain for, say, a path, you can't diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp index 0c3280178d..8175f19e6e 100644 --- a/codeJK2/game/g_roff.cpp +++ b/codeJK2/game/g_roff.cpp @@ -1,25 +1,27 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - #include "g_local.h" #include "g_roff.h" #include "g_icarus.h" @@ -428,7 +430,7 @@ int G_LoadRoff( const char *fileName ) // See if I'm already precached for ( i = 0; i < num_roffs; i++ ) { - if ( stricmp( file, roffs[i].fileName ) == 0 ) + if ( Q_stricmp( file, roffs[i].fileName ) == 0 ) { // Good, just return me...avoid zero index return i + 1; diff --git a/codeJK2/game/g_roff.h b/codeJK2/game/g_roff.h index 97f5f38919..666adb6f49 100644 --- a/codeJK2/game/g_roff.h +++ b/codeJK2/game/g_roff.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __G_ROFF_H__ #define __G_ROFF_H__ diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index fe7d11ec94..22030ea9c8 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -1,24 +1,27 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- g_savegame.cpp -// -// leave this line at the top for all g_xxxx.cpp files... + #include "g_headers.h" #ifndef _WIN32 @@ -77,10 +80,10 @@ static const field_t savefields_gEntity[] = {strFOFS(script_targetname),F_STRING}, {strFOFS(sequencer), F_NULL}, // CSequencer *sequencer; {strFOFS(taskManager), F_NULL}, // CTaskManager *taskManager; - {strFOFS(NPC), F_BOOLPTR}, + {strFOFS(NPC), F_BOOLPTR}, {strFOFS(soundSet), F_STRING}, {strFOFS(cameraGroup), F_STRING}, - {strFOFS(parms), F_BOOLPTR}, + {strFOFS(parms), F_BOOLPTR}, {strFOFS(fullName), F_STRING}, // {strFOFS(timers), F_BOOLPTR}, // handled directly @@ -108,9 +111,9 @@ static const field_t savefields_gNPC[] = static const field_t savefields_LevelLocals[] = { - {strLLOFS(locationHead), F_GENTITY}, + {strLLOFS(locationHead), F_GENTITY}, {strLLOFS(alertEvents), F_ALERTEVENT}, - {strLLOFS(groups), F_AIGROUPS}, + {strLLOFS(groups), F_AIGROUPS}, {NULL, 0, F_IGNORE} }; @@ -128,7 +131,7 @@ ok usercmd_t usercmd; // most recent usercmd //Client info - updated when ClientInfoChanged is called, instead of using configstrings ok clientInfo_t clientInfo; ok renderInfo_t renderInfo; -}; +}; */ // I'll keep a blank one for now in case I need to add anything... // @@ -179,7 +182,7 @@ char *GetStringPtr(int iStrlen, char *psOriginal/*may be NULL*/) memset(sString,0, sizeof(sString)); assert(iStrlen+1<=(int)sizeof(sString)); - + gi.ReadFromSaveGame(INT_ID('S','T','R','G'), sString, iStrlen, NULL); // we can't do string recycling with the new g_alloc pool dumping, so just always alloc here... @@ -215,7 +218,7 @@ intptr_t GetGEntityNum(gentity_t* ent) intptr_t iReturnIndex = ent - g_entities; if (iReturnIndex < 0 || iReturnIndex >= MAX_GENTITIES) - { + { iReturnIndex = -1; // will get a NULL ptr on reload } return iReturnIndex; @@ -242,8 +245,8 @@ static intptr_t GetGroupNumber(AIGroupInfo_t *pGroup) } int iReturnIndex = pGroup - level.groups; - if (iReturnIndex < 0 || iReturnIndex >= (sizeof(level.groups) / sizeof(level.groups[0])) ) - { + if (iReturnIndex < 0 || iReturnIndex >= (int)(sizeof(level.groups) / sizeof(level.groups[0])) ) + { iReturnIndex = -1; // will get a NULL ptr on reload } return iReturnIndex; @@ -256,7 +259,7 @@ static AIGroupInfo_t *GetGroupPtr(intptr_t iGroupNum) return NULL; } assert(iGroupNum >= 0); - assert(iGroupNum < (sizeof(level.groups) / sizeof(level.groups[0]))); + assert( iGroupNum < (int)ARRAY_LEN( level.groups ) ); return (level.groups + iGroupNum); } @@ -274,7 +277,7 @@ intptr_t GetGClientNum(gclient_t *c) return -1; } - return (c - level.clients); + return (c - level.clients); } gclient_t *GetGClientPtr(intptr_t c) @@ -303,12 +306,12 @@ gclient_t *GetGClientPtr(intptr_t c) int GetGItemNum (gitem_t *pItem) { assert(pItem != (gitem_t*) 0xcdcdcdcd); - + if (pItem == NULL) { return -1; } - + return pItem - bg_itemlist; } @@ -438,7 +441,7 @@ void EnumerateField(const field_t *pField, byte *pbBase) } } -static void EnumerateFields(const field_t *pFields, byte *pbData, unsigned int ulChid, int iLen) +static void EnumerateFields(const field_t *pFields, byte *pbData, unsigned int ulChid, size_t iLen) { strList = new list; @@ -452,7 +455,7 @@ static void EnumerateFields(const field_t *pFields, byte *pbData, unsigned int u EnumerateField(pField, pbData); } } - + // save out raw data... // gi.AppendToSaveGame(ulChid, pbData, iLen); @@ -463,7 +466,7 @@ static void EnumerateFields(const field_t *pFields, byte *pbData, unsigned int u { gi.AppendToSaveGame(INT_ID('S','T','R','G'), (void*)it->c_str(), it->length()+1); } - + delete strList; strList = NULL; } @@ -520,7 +523,7 @@ static void EvaluateField(const field_t *pField, byte *pbBase, byte *pbOriginalR */ case F_ALERTEVENT: - { + { alertEvent_t* p = (alertEvent_t *) pv; for (int i=0; iui = BigLong( chid ); + chidtext[4] = '\0'; return chidtext; } static void EvaluateFields(const field_t *pFields, byte *pbData, byte *pbOriginalRefData, unsigned int ulChid, int iSize, qboolean bOkToSizeMisMatch) -{ +{ int iReadSize = gi.ReadFromSaveGame(ulChid, pbData, bOkToSizeMisMatch?0:iSize, NULL); if (iReadSize != iSize) { - // handle any chunks that are ok to change length (typically this is a last minute hack, + // handle any chunks that are ok to change length (typically this is a last minute hack, // so hopefully we won't need it any more... ;-) // switch (ulChid) { // example chunk handler... - // + // case INT_ID('G','C','L','I'): /* assert(iSize>iReadSize); - memset(&pbData[iReadSize], 0, iSize-iReadSize); // zero out new objectives that weren't in old-format save file + memset(&pbData[iReadSize], 0, iSize-iReadSize); // zero out new objectives that weren't in old-format save file break; */ default: @@ -593,7 +597,7 @@ static void EvaluateFields(const field_t *pFields, byte *pbData, byte *pbOrigina break; } } - + if (pFields) { for (const field_t *pField = pFields; pField->psName; pField++) @@ -650,7 +654,7 @@ static void WriteGEntities(qboolean qbAutosave) { gentity_t* ent = &g_entities[i]; - if ( ent->inuse ) + if ( ent->inuse ) { iCount++; } @@ -676,7 +680,7 @@ static void WriteGEntities(qboolean qbAutosave) gi.linkentity( ent ); } - EnumerateFields(savefields_gEntity, (byte *)&tempEnt, INT_ID('G','E','N','T'), sizeof(tempEnt)); + EnumerateFields(savefields_gEntity, (byte *)&tempEnt, INT_ID('G','E','N','T'), sizeof(tempEnt)); // now for any fiddly bits that would be rather awkward to build into the enumerator... // @@ -700,7 +704,7 @@ static void WriteGEntities(qboolean qbAutosave) // the scary ghoul2 saver stuff... (fingers crossed) // - gi.G2API_SaveGhoul2Models(tempEnt.ghoul2); + gi.G2API_SaveGhoul2Models(tempEnt.ghoul2); tempEnt.ghoul2.kill(); // this handle was shallow copied from an ent. We don't want it destroyed } } @@ -713,8 +717,8 @@ static void WriteGEntities(qboolean qbAutosave) //Save out ICARUS information iICARUS->Save(); - // this marker needs to be here, it lets me know if Icarus doesn't load everything back later, - // which has happened, and doesn't always show up onscreen until certain game situations. + // this marker needs to be here, it lets me know if Icarus doesn't load everything back later, + // which has happened, and doesn't always show up onscreen until certain game situations. // This saves time debugging, and makes things easier to track. // static int iBlah = 1234; @@ -722,7 +726,7 @@ static void WriteGEntities(qboolean qbAutosave) } if (!qbAutosave )//really shouldn't need to write these bits at all, just restore them from the ents... { - WriteInUseBits(); + WriteInUseBits(); } } @@ -730,7 +734,7 @@ static void ReadGEntities(qboolean qbAutosave) { int iCount; int i; - + gi.ReadFromSaveGame(INT_ID('N','M','E','D'), (void *)&iCount, sizeof(iCount), NULL); int iPreviousEntRead = -1; @@ -759,9 +763,9 @@ static void ReadGEntities(qboolean qbAutosave) // slightly naff syntax here, but makes a few ops clearer later... // gentity_t entity; -// gentity_t* pEntOriginal = &g_entities[iEntIndex]; +// gentity_t* pEntOriginal = &g_entities[iEntIndex]; // gentity_t* pEnt = &entity; - gentity_t* pEntOriginal = &entity; + gentity_t* pEntOriginal = &entity; gentity_t* pEnt = &g_entities[iEntIndex]; *pEntOriginal = *pEnt; // struct copy, so we can refer to original pEntOriginal->ghoul2.kill(); @@ -807,7 +811,7 @@ static void ReadGEntities(qboolean qbAutosave) if (pEnt->client == (gclient_t*) -2) // one of Mike G's NPC clients? { - gclient_t tempGClient; + gclient_t tempGClient; EvaluateFields(savefields_gClient, (byte *)&tempGClient, (byte *)pEntOriginal->client, INT_ID('G','C','L','I'), sizeof(*pEnt->client),qfalse); @@ -822,7 +826,7 @@ static void ReadGEntities(qboolean qbAutosave) else { // original didn't have one (hmmm...) so make a new one... - // + // pEnt->client = (gclient_t *) G_Alloc(sizeof(*pEnt->client)); } @@ -836,7 +840,7 @@ static void ReadGEntities(qboolean qbAutosave) if (pEnt->parms) // will be qtrue/qfalse { parms_t tempParms; - + gi.ReadFromSaveGame(INT_ID('P','A','R','M'), &tempParms, sizeof(tempParms), NULL); // so can we pinch the original's one or do we have to alloc a new one?... @@ -850,7 +854,7 @@ static void ReadGEntities(qboolean qbAutosave) else { // original didn't have one, so make a new one... - // + // pEnt->parms = (parms_t *) G_Alloc(sizeof(*pEnt->parms)); } @@ -868,14 +872,14 @@ static void ReadGEntities(qboolean qbAutosave) gi.Free(pGhoul2Data); } -// gi.unlinkentity (pEntOriginal); +// gi.unlinkentity (pEntOriginal); // ICARUS_FreeEnt( pEntOriginal ); -// *pEntOriginal = *pEnt; // struct copy +// *pEntOriginal = *pEnt; // struct copy // qboolean qbLinked = pEntOriginal->linked; // pEntOriginal->linked = qfalse; // if (qbLinked) // { -// gi.linkentity (pEntOriginal); +// gi.linkentity (pEntOriginal); // } // because the sytem stores sfx_t handles directly instead of the set, we have to reget the set's sfx_t... @@ -897,8 +901,8 @@ static void ReadGEntities(qboolean qbAutosave) pEnt->linked = qfalse; if (qbLinked) { - gi.linkentity (pEnt); - } + gi.linkentity (pEnt); + } } //Read in all the entity timers @@ -915,7 +919,7 @@ static void ReadGEntities(qboolean qbAutosave) { G_FreeEntity(&g_entities[i]); } - } + } //Load ICARUS information ICARUS_EntList.clear(); @@ -941,8 +945,8 @@ void WriteLevel(qboolean qbAutosave) // assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way ReadGame works gclient_t client = level.clients[0]; - EnumerateFields(savefields_gClient, (byte *)&client, INT_ID('G','C','L','I'), sizeof(client)); - WriteLevelLocals(); // level_locals_t level + EnumerateFields(savefields_gClient, (byte *)&client, INT_ID('G','C','L','I'), sizeof(client)); + WriteLevelLocals(); // level_locals_t level } OBJ_SaveObjectiveData(); @@ -971,13 +975,13 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) //In a loadtransition, client data is carried over on the server and will be stomped later anyway. //The objective info (in client->sess data), however, is read in from G_ReadSessionData which is called before this func, //we do NOT want to stomp that session data when doing a load transition - + //However, we should still save this info out because these savegames may need to be //loaded normally later- perhaps if you die and need to respawn, perhaps as some kind //of emergency savegame for resuming, etc. //SO: We read it in, but throw it away. - + //Read & throw away gclient info gclient_t junkClient; EvaluateFields(savefields_gClient, (byte *)&junkClient, (byte *)&level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qfalse); @@ -986,20 +990,20 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) objectives_t junkObj[MAX_MISSION_OBJ]; gi.ReadFromSaveGame(INT_ID('O','B','J','T'), (void *) &junkObj, 0, NULL); - ReadLevelLocals(); // level_locals_t level + ReadLevelLocals(); // level_locals_t level } else { if (!qbAutosave )//always load the client unless it's an autosave { assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way things work - + gclient_t GClient; EvaluateFields(savefields_gClient, (byte *)&GClient, (byte *)&level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qfalse); level.clients[0] = GClient; // struct copy - ReadLevelLocals(); // level_locals_t level + ReadLevelLocals(); // level_locals_t level } - + OBJ_LoadObjectiveData();//loads mission objectives AND tactical info } diff --git a/codeJK2/game/g_session.cpp b/codeJK2/game/g_session.cpp index 1a05c723f8..1499dfa09d 100644 --- a/codeJK2/game/g_session.cpp +++ b/codeJK2/game/g_session.cpp @@ -1,29 +1,31 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - #include "g_local.h" #include "objectives.h" - /* ======================================================================= @@ -115,7 +117,9 @@ void G_ReadSessionData( gclient_t *client ) { var = va( "session%i", client - level.clients ); gi.Cvar_VariableStringBuffer( var, s, sizeof(s) ); - sscanf( s, "%i", &client->sess.sessionTeam ); + int tmp; + sscanf( s, "%i", &tmp ); + client->sess.sessionTeam = (team_t)tmp; var = va( "sessionobj%i", client - level.clients ); gi.Cvar_VariableStringBuffer( var, s, sizeof(s) ); @@ -124,11 +128,11 @@ void G_ReadSessionData( gclient_t *client ) { var++; for (i=0;i< MAX_OBJECTIVES; i++) { - sscanf( var, "%i %i", + sscanf( var, "%i %i", &client->sess.mission_objectives[i].display, &client->sess.mission_objectives[i].status); var+=4; - } + } var = va( "missionstats%i", client - level.clients ); gi.Cvar_VariableStringBuffer( var, s, sizeof(s) ); diff --git a/codeJK2/game/g_shared.h b/codeJK2/game/g_shared.h index fa6fa956a4..a017126cda 100644 --- a/codeJK2/game/g_shared.h +++ b/codeJK2/game/g_shared.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __G_SHARED_H__ #define __G_SHARED_H__ diff --git a/codeJK2/game/g_spawn.cpp b/codeJK2/game/g_spawn.cpp index 775361d85e..04dad050f2 100644 --- a/codeJK2/game/g_spawn.cpp +++ b/codeJK2/game/g_spawn.cpp @@ -1,26 +1,27 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software - -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - - #include "g_local.h" #include "g_functions.h" #include "g_icarus.h" diff --git a/codeJK2/game/g_svcmds.cpp b/codeJK2/game/g_svcmds.cpp index 0a89cbc9a5..83b28a27d4 100644 --- a/codeJK2/game/g_svcmds.cpp +++ b/codeJK2/game/g_svcmds.cpp @@ -1,26 +1,27 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software - -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - - #include "g_local.h" #include "g_icarus.h" #include "wp_saber.h" diff --git a/codeJK2/game/g_target.cpp b/codeJK2/game/g_target.cpp index 6bc1590807..bfa38e1985 100644 --- a/codeJK2/game/g_target.cpp +++ b/codeJK2/game/g_target.cpp @@ -1,26 +1,27 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software - -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - - #include "g_local.h" #include "g_functions.h" #include "g_icarus.h" diff --git a/codeJK2/game/g_trigger.cpp b/codeJK2/game/g_trigger.cpp index 294b61a9ec..6657c95e4e 100644 --- a/codeJK2/game/g_trigger.cpp +++ b/codeJK2/game/g_trigger.cpp @@ -1,25 +1,26 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top for all g_xxxx.cpp files... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" - #include "g_local.h" #include "g_functions.h" #include "b_local.h" diff --git a/codeJK2/game/g_turret.cpp b/codeJK2/game/g_turret.cpp index c1e5871d19..f38270d810 100644 --- a/codeJK2/game/g_turret.cpp +++ b/codeJK2/game/g_turret.cpp @@ -1,22 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// leave this line at the top for all g_xxxx.cpp files... +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" #include "g_local.h" @@ -82,7 +84,7 @@ void turret_die ( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, in VectorMA( self->currentOrigin, 12, forward, pos ); G_PlayEffect( self->fxID, pos, forward ); } - + if ( self->splashDamage > 0 && self->splashRadius > 0 ) { G_RadiusDamage( self->currentOrigin, attacker, self->splashDamage, self->splashRadius, attacker, MOD_UNKNOWN ); @@ -102,7 +104,7 @@ void turret_die ( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, in VectorCopy( self->currentAngles, self->s.apos.trBase ); VectorClear( self->s.apos.trDelta ); - + if ( self->target ) { G_UseTargets( self, attacker ); @@ -132,7 +134,7 @@ static void turret_fire ( gentity_t *ent, vec3_t start, vec3_t dir ) G_PlayEffect( "blaster/muzzle_flash", org, dir ); bolt = G_Spawn(); - + bolt->classname = "turret_proj"; bolt->nextthink = level.time + 10000; bolt->e_ThinkFunc = thinkF_G_FreeEntity; @@ -145,7 +147,7 @@ static void turret_fire ( gentity_t *ent, vec3_t start, vec3_t dir ) bolt->splashRadius = 0; bolt->methodOfDeath = MOD_ENERGY; bolt->clipmask = MASK_SHOT | CONTENTS_LIGHTSABER; - bolt->trigger_formation = qfalse; // don't draw tail on first frame + bolt->trigger_formation = qfalse; // don't draw tail on first frame VectorSet( bolt->maxs, 1.5, 1.5, 1.5 ); VectorScale( bolt->maxs, -1, bolt->mins ); @@ -171,7 +173,7 @@ void turret_head_think( gentity_t *self ) mdxaBone_t boltMatrix; // Getting the flash bolt here - gi.G2API_GetBoltMatrix( self->ghoul2, self->playerModel, + gi.G2API_GetBoltMatrix( self->ghoul2, self->playerModel, self->torsoBolt, &boltMatrix, self->currentAngles, self->currentOrigin, (cg.time?cg.time:level.time), NULL, self->s.modelScale ); @@ -222,7 +224,7 @@ static void turret_aim( gentity_t *self ) mdxaBone_t boltMatrix; // Getting the "eye" here - gi.G2API_GetBoltMatrix( self->ghoul2, self->playerModel, + gi.G2API_GetBoltMatrix( self->ghoul2, self->playerModel, self->torsoBolt, &boltMatrix, self->currentAngles, self->s.origin, (cg.time?cg.time:level.time), NULL, self->s.modelScale ); @@ -281,8 +283,8 @@ static void turret_aim( gentity_t *self ) VectorSet( desiredAngles, -self->speed, 0.0f, 0.0f ); } - gi.G2API_SetBoneAngles( &self->ghoul2[0], "Bone_body", desiredAngles, - BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 100, cg.time ); + gi.G2API_SetBoneAngles( &self->ghoul2[0], "Bone_body", desiredAngles, + BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 100, cg.time ); } if ( diffYaw || diffPitch ) @@ -307,7 +309,7 @@ static void turret_turnoff( gentity_t *self ) // shut-down sound G_Sound( self, G_SoundIndex( "sound/chars/turret/shutdown.wav" )); - + // make turret play ping sound for 5 seconds self->aimDebounceTime = level.time + 5000; @@ -362,7 +364,7 @@ static qboolean turret_find_enemies( gentity_t *self ) continue; } if ( target->client->playerTeam == self->noDamageTeam ) - { + { // A bot we don't want to shoot continue; } @@ -549,11 +551,11 @@ Turret that hangs from the ceiling, will aim and shoot at enemies wait - Time between shots (default 150 ms) dmg - How much damage each shot does (default 5) health - How much damage it can take before exploding (default 100) - + splashDamage - How much damage the explosion does splashRadius - The radius of the explosion NOTE: If either of the above two are 0, it will not make an explosion - + targetname - Toggles it on/off target - What to use when destroyed target2 - What to use when it decides to start shooting at an enemy @@ -569,10 +571,10 @@ void SP_misc_turret( gentity_t *base ) { base->s.modelindex = G_ModelIndex( "models/map_objects/imp_mine/turret_canon.glm" ); base->s.modelindex2 = G_ModelIndex( "models/map_objects/imp_mine/turret_damage.md3" ); - base->playerModel = gi.G2API_InitGhoul2Model( base->ghoul2, "models/map_objects/imp_mine/turret_canon.glm", base->s.modelindex, NULL, NULL, 0, 0 ); + base->playerModel = gi.G2API_InitGhoul2Model( base->ghoul2, "models/map_objects/imp_mine/turret_canon.glm", base->s.modelindex, NULL_HANDLE, NULL_HANDLE, 0, 0 ); base->s.radius = 80.0f; - gi.G2API_SetBoneAngles( &base->ghoul2[base->playerModel], "Bone_body", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 0, 0 ); + gi.G2API_SetBoneAngles( &base->ghoul2[base->playerModel], "Bone_body", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 0, 0 ); base->torsoBolt = gi.G2API_AddBolt( &base->ghoul2[base->playerModel], "*flash03" ); finish_spawning_turret( base ); @@ -605,7 +607,7 @@ void finish_spawning_turret( gentity_t *base ) G_SetOrigin(base, base->s.origin); base->noDamageTeam = TEAM_ENEMY; - + base->s.eType = ET_GENERAL; if ( base->team && base->team[0] ) @@ -707,11 +709,11 @@ NS turret that only hangs from the ceiling, will aim and shoot at enemies wait - Time between shots (default 150 ms) dmg - How much damage each shot does (default 5) health - How much damage it can take before exploding (default 100) - + splashDamage - How much damage the explosion does splashRadius - The radius of the explosion NOTE: If either of the above two are 0, it will not make an explosion - + targetname - Toggles it on/off target - What to use when destroyed @@ -726,10 +728,10 @@ void SP_misc_ns_turret( gentity_t *base ) { base->s.modelindex = G_ModelIndex( "models/map_objects/nar_shaddar/turret/turret.glm" ); base->s.modelindex2 = G_ModelIndex( "models/map_objects/imp_mine/turret_damage.md3" ); // FIXME! - base->playerModel = gi.G2API_InitGhoul2Model( base->ghoul2, "models/map_objects/nar_shaddar/turret/turret.glm", base->s.modelindex, NULL, NULL, 0, 0 ); + base->playerModel = gi.G2API_InitGhoul2Model( base->ghoul2, "models/map_objects/nar_shaddar/turret/turret.glm", base->s.modelindex, NULL_HANDLE, NULL_HANDLE, 0, 0 ); base->s.radius = 80.0f; - gi.G2API_SetBoneAngles( &base->ghoul2[base->playerModel], "Bone_body", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 0, 0 ); + gi.G2API_SetBoneAngles( &base->ghoul2[base->playerModel], "Bone_body", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 0, 0 ); base->torsoBolt = gi.G2API_AddBolt( &base->ghoul2[base->playerModel], "*flash02" ); finish_spawning_turret( base ); @@ -755,11 +757,11 @@ void laser_arm_fire (gentity_t *ent) // If a fool gets in the laser path, fry 'em AngleVectors( ent->currentAngles, fwd, rt, up ); - VectorMA( ent->currentOrigin, 20, fwd, start ); + VectorMA( ent->currentOrigin, 20, fwd, start ); //VectorMA( start, -6, rt, start ); //VectorMA( start, -3, up, start ); VectorMA( start, 4096, fwd, end ); - + gi.trace( &trace, start, NULL, NULL, end, ENTITYNUM_NONE, MASK_SHOT, G2_NOCOLLIDE, 0 );//ignore ent->fly_sound_debounce_time = level.time;//used as lastShotTime @@ -775,7 +777,7 @@ void laser_arm_fire (gentity_t *ent) } } } - + if ( ent->alt_fire ) { // CG_FireLaser( start, trace.endpos, trace.plane.normal, ent->nextTrain->startRGBA, qfalse ); @@ -850,7 +852,7 @@ void laser_arm_use (gentity_t *self, gentity_t *other, gentity_t *activator) break; } } -/*QUAKED misc_laser_arm (1 0 0) (-8 -8 -8) (8 8 8) +/*QUAKED misc_laser_arm (1 0 0) (-8 -8 -8) (8 8 8) What it does when used depends on it's "count" (can be set by a script) count: @@ -863,7 +865,7 @@ What it does when used depends on it's "count" (can be set by a script) speed - How fast it turns (degrees per second, default 30) dmg - How much damage the laser does 10 times a second (default 5 = 50 points per second) wait - How long the beam lasts, in seconds (default is 3) - + targetname - to use it target - What thing for it to be pointing at to start with @@ -1029,7 +1031,7 @@ void pas_fire( gentity_t *ent ) mdxaBone_t boltMatrix; // Getting the flash bolt here - gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, + gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, ent->torsoBolt, &boltMatrix, ent->currentAngles, ent->s.origin, (cg.time?cg.time:level.time), NULL, ent->s.modelScale ); @@ -1042,7 +1044,7 @@ void pas_fire( gentity_t *ent ) gentity_t *bolt; bolt = G_Spawn(); - + bolt->classname = "turret_proj"; bolt->nextthink = level.time + 10000; bolt->e_ThinkFunc = thinkF_G_FreeEntity; @@ -1091,7 +1093,7 @@ static qboolean pas_find_enemies( gentity_t *self ) mdxaBone_t boltMatrix; // Getting the "eye" here - gi.G2API_GetBoltMatrix( self->ghoul2, self->playerModel, + gi.G2API_GetBoltMatrix( self->ghoul2, self->playerModel, self->torsoBolt, &boltMatrix, self->currentAngles, self->s.origin, (cg.time?cg.time:level.time), NULL, self->s.modelScale ); @@ -1113,7 +1115,7 @@ static qboolean pas_find_enemies( gentity_t *self ) continue; } if ( target->client->playerTeam == self->noDamageTeam ) - { + { // A bot we don't want to shoot continue; } @@ -1189,7 +1191,7 @@ void pas_adjust_enemy( gentity_t *ent ) vec3_t org, org2; // Getting the "eye" here - gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, + gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, ent->torsoBolt, &boltMatrix, ent->currentAngles, ent->s.origin, (cg.time?cg.time:level.time), NULL, ent->s.modelScale ); @@ -1225,7 +1227,7 @@ void pas_adjust_enemy( gentity_t *ent ) ent->enemy = NULL; // shut-down sound G_Sound( ent, G_SoundIndex( "sound/chars/turret/shutdown.wav" )); - + // make turret play ping sound for 5 seconds ent->aimDebounceTime = level.time + 5000; } @@ -1335,12 +1337,12 @@ void pas_think( gentity_t *ent ) VectorSet( frontAngles, -ent->random, 0.0f, 0.0f ); VectorSet( backAngles, 0.0f, 0.0f, ent->speed - ent->s.angles[YAW] ); - gi.G2API_SetBoneAngles( &ent->ghoul2[ent->playerModel], "bone_barrel", frontAngles, - BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, NEGATIVE_X, NULL,100,cg.time); - gi.G2API_SetBoneAngles( &ent->ghoul2[ent->playerModel], "bone_gback", frontAngles, - BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, NEGATIVE_X, NULL,100,cg.time); - gi.G2API_SetBoneAngles( &ent->ghoul2[ent->playerModel], "bone_hinge", backAngles, - BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL,100,cg.time); + gi.G2API_SetBoneAngles( &ent->ghoul2[ent->playerModel], "bone_barrel", frontAngles, + BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, NEGATIVE_X, NULL,100,cg.time); + gi.G2API_SetBoneAngles( &ent->ghoul2[ent->playerModel], "bone_gback", frontAngles, + BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, NEGATIVE_X, NULL,100,cg.time); + gi.G2API_SetBoneAngles( &ent->ghoul2[ent->playerModel], "bone_hinge", backAngles, + BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL,100,cg.time); if ( moved ) { @@ -1376,11 +1378,11 @@ personal assault sentry, like the ones you can carry in your inventory radius - How far away an enemy can be for it to pick it up (default 512) count - number of shots before thing deactivates. -1 = infinite, default 150 health - How much damage it can take before exploding (default 50) - + splashDamage - How much damage the explosion does splashRadius - The radius of the explosion NOTE: If either of the above two are 0, it will not make an explosion - + target - What to use when destroyed target2 - What to use when it decides to fire at an enemy @@ -1402,14 +1404,14 @@ void SP_PAS( gentity_t *base ) base->speed = base->s.angles[YAW]; base->s.modelindex = G_ModelIndex( "models/items/psgun.glm" ); - base->playerModel = gi.G2API_InitGhoul2Model( base->ghoul2, "models/items/psgun.glm", base->s.modelindex, NULL, NULL, 0, 0 ); + base->playerModel = gi.G2API_InitGhoul2Model( base->ghoul2, "models/items/psgun.glm", base->s.modelindex, NULL_HANDLE, NULL_HANDLE, 0, 0 ); base->s.radius = 30.0f; VectorSet( base->s.modelScale, 1.0f, 1.0f, 1.0f ); base->rootBone = gi.G2API_GetBoneIndex( &base->ghoul2[base->playerModel], "model_root", qtrue ); - gi.G2API_SetBoneAngles( &base->ghoul2[base->playerModel], "bone_hinge", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 0, 0 ); - gi.G2API_SetBoneAngles( &base->ghoul2[base->playerModel], "bone_gback", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 0, 0 ); - gi.G2API_SetBoneAngles( &base->ghoul2[base->playerModel], "bone_barrel", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 0, 0 ); + gi.G2API_SetBoneAngles( &base->ghoul2[base->playerModel], "bone_hinge", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 0, 0 ); + gi.G2API_SetBoneAngles( &base->ghoul2[base->playerModel], "bone_gback", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 0, 0 ); + gi.G2API_SetBoneAngles( &base->ghoul2[base->playerModel], "bone_barrel", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 0, 0 ); base->torsoBolt = gi.G2API_AddBolt( &base->ghoul2[base->playerModel], "*flash02" ); @@ -1516,7 +1518,7 @@ qboolean place_portable_assault_sentry( gentity_t *self, vec3_t origin, vec3_t a pas->contents |= CONTENTS_PLAYERCLIP; // player placed ones can block players but not npcs pas->e_UseFunc = useF_NULL; // placeable ones never need to be used - + // we don't hurt us or anyone who belongs to the same team as us. if ( self->client ) { @@ -1565,7 +1567,7 @@ void ion_cannon_think( gentity_t *self ) mdxaBone_t boltMatrix; // Getting the flash bolt here - gi.G2API_GetBoltMatrix( self->ghoul2, self->playerModel, + gi.G2API_GetBoltMatrix( self->ghoul2, self->playerModel, self->torsoBolt, &boltMatrix, self->s.angles, self->s.origin, (cg.time?cg.time:level.time), NULL, self->s.modelScale ); @@ -1625,10 +1627,10 @@ void ion_cannon_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, VectorCopy( self->currentOrigin, org ); org[2] += 20; G_PlayEffect( "env/ion_cannon_explosion", org ); - + if ( self->splashDamage > 0 && self->splashRadius > 0 ) { - G_RadiusDamage( self->currentOrigin, attacker, self->splashDamage, self->splashRadius, + G_RadiusDamage( self->currentOrigin, attacker, self->splashDamage, self->splashRadius, attacker, MOD_UNKNOWN ); } @@ -1680,7 +1682,7 @@ void SP_misc_ion_cannon( gentity_t *base ) G_SetOrigin(base, base->s.origin); base->s.modelindex = G_ModelIndex( "models/map_objects/imp_mine/ion_cannon.glm" ); - base->playerModel = gi.G2API_InitGhoul2Model( base->ghoul2, "models/map_objects/imp_mine/ion_cannon.glm", base->s.modelindex, NULL, NULL, 0, 0 ); + base->playerModel = gi.G2API_InitGhoul2Model( base->ghoul2, "models/map_objects/imp_mine/ion_cannon.glm", base->s.modelindex, NULL_HANDLE, NULL_HANDLE, 0, 0 ); base->s.radius = 320.0f; VectorSet( base->s.modelScale, 1.0f, 1.0f, 1.0f ); @@ -1867,7 +1869,7 @@ void SP_misc_spotlight( gentity_t *base ) G_FreeEntity( base ); return; } - + G_SetAngles( base, base->s.angles ); G_SetOrigin( base, base->s.origin ); @@ -1903,7 +1905,7 @@ Creates a turret that, when the player uses a panel, takes control of this turre damage - amount of damage shots do, (default 50). speed - missile speed, (default 3000) - heatlh - how much heatlh the thing has, (default 200) only works if HEALTH is checked, otherwise it can't be destroyed. + heatlh - how much heatlh the thing has, (default 200) only works if HEALTH is checked, otherwise it can't be destroyed. */ extern gentity_t *player; @@ -2013,7 +2015,7 @@ void panel_turret_think( gentity_t *self ) G_Sound( player, self->soundPos2 ); cg.overrides.active &= ~CG_OVERRIDE_FOV; - cg.overrides.fov = 0; + cg.overrides.fov = 0; if ( ucmd->upmove > 0 ) {//stop player from doing anything for a half second after player->aimDebounceTime = level.time + 500; @@ -2092,7 +2094,7 @@ void panel_turret_use( gentity_t *self, gentity_t *other, gentity_t *activator ) } //----------------------------------------- -void SP_misc_panel_turret( gentity_t *self ) +void SP_misc_panel_turret( gentity_t *self ) { G_SpawnFloat( "radius", "90", &self->radius ); // yaw G_SpawnFloat( "random", "60", &self->random ); // pitch diff --git a/codeJK2/game/g_usable.cpp b/codeJK2/game/g_usable.cpp index 50180e88bf..9b5fc7a77c 100644 --- a/codeJK2/game/g_usable.cpp +++ b/codeJK2/game/g_usable.cpp @@ -1,25 +1,28 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - #include "g_local.h" #include "g_functions.h" diff --git a/codeJK2/game/g_utils.cpp b/codeJK2/game/g_utils.cpp index f91a368fcd..95a70c62f2 100644 --- a/codeJK2/game/g_utils.cpp +++ b/codeJK2/game/g_utils.cpp @@ -1,28 +1,30 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // g_utils.c -- misc utility functions for game module -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - - #include "g_local.h" #include "g_functions.h" #include "g_nav.h" @@ -63,7 +65,7 @@ int G_FindConfigstringIndex( const char *name, int start, int max, qboolean crea if ( !s[0] ) { break; } - if ( !stricmp( s, name ) ) { + if ( !Q_stricmp( s, name ) ) { return i; } } @@ -98,7 +100,7 @@ int G_ModelIndex( const char *name ) { int G_SoundIndex( const char *name ) { char stripped[MAX_QPATH]; COM_StripExtension(name, stripped, sizeof(stripped)); - + return G_FindConfigstringIndex (stripped, CS_SOUNDS, MAX_SOUNDS, qtrue); } @@ -195,7 +197,7 @@ void G_PlayEffect( int fxID, const int modelIndex, const int boltIndex, const in tent->s.eventParm = fxID; tent->svFlags |=SVF_BROADCAST; - gi.G2API_AttachEnt(&tent->s.boltInfo, &g_entities[entNum].ghoul2[modelIndex], boltIndex, entNum, modelIndex); + gi.G2API_AttachEnt(&tent->s.boltInfo, &g_entities[entNum].ghoul2[modelIndex], boltIndex, entNum, modelIndex); } //----------------------------- @@ -240,7 +242,7 @@ void G_SoundOnEnt (gentity_t *ent, soundChannel_t channel, const char *soundPath } cgi_S_UpdateEntityPosition( ent->s.number, ent->currentOrigin ); - if ( cgs.sound_precache[ index ] ) + if ( cgs.sound_precache[ index ] ) { cgi_S_StartSound( NULL, ent->s.number, channel, cgs.sound_precache[ index ] ); } @@ -406,7 +408,7 @@ NULL will be returned if the end of the list is reached. gentity_t *G_Find (gentity_t *from, int fieldofs, const char *match) { char *s; - + if(!match || !match[0]) { return NULL; @@ -421,7 +423,7 @@ gentity_t *G_Find (gentity_t *from, int fieldofs, const char *match) int i=from-g_entities; for ( ; i < globals.num_entities ; i++) { -// if (!from->inuse) +// if (!from->inuse) if(!PInUse(i)) continue; @@ -442,7 +444,7 @@ gentity_t *G_Find (gentity_t *from, int fieldofs, const char *match) G_RadiusList - given an origin and a radius, return all entities that are in use that are within the list ============ */ -int G_RadiusList ( vec3_t origin, float radius, gentity_t *ignore, qboolean takeDamage, gentity_t *ent_list[MAX_GENTITIES]) +int G_RadiusList ( vec3_t origin, float radius, gentity_t *ignore, qboolean takeDamage, gentity_t *ent_list[MAX_GENTITIES]) { float dist; gentity_t *ent; @@ -453,12 +455,12 @@ int G_RadiusList ( vec3_t origin, float radius, gentity_t *ignore, qboolean take int i, e; int ent_count = 0; - if ( radius < 1 ) + if ( radius < 1 ) { radius = 1; } - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { mins[i] = origin[i] - radius; maxs[i] = origin[i] + radius; @@ -466,7 +468,7 @@ int G_RadiusList ( vec3_t origin, float radius, gentity_t *ignore, qboolean take numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); - for ( e = 0 ; e < numListedEntities ; e++ ) + for ( e = 0 ; e < numListedEntities ; e++ ) { ent = entityList[ e ]; @@ -474,26 +476,26 @@ int G_RadiusList ( vec3_t origin, float radius, gentity_t *ignore, qboolean take continue; // find the distance from the edge of the bounding box - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { - if ( origin[i] < ent->absmin[i] ) + if ( origin[i] < ent->absmin[i] ) { v[i] = ent->absmin[i] - origin[i]; - } else if ( origin[i] > ent->absmax[i] ) + } else if ( origin[i] > ent->absmax[i] ) { v[i] = origin[i] - ent->absmax[i]; - } else + } else { v[i] = 0; } } dist = VectorLength( v ); - if ( dist >= radius ) + if ( dist >= radius ) { continue; } - + // ok, we are within the radius, add us to the incoming list ent_list[ent_count] = ent; ent_count++; @@ -547,7 +549,7 @@ gentity_t *G_PickTarget (char *targetname) void G_UseTargets2 (gentity_t *ent, gentity_t *activator, const char *string) { gentity_t *t; - + // // fire targets // @@ -672,7 +674,7 @@ void G_SetMovedir( vec3_t angles, vec3_t movedir ) { float vectoyaw( const vec3_t vec ) { float yaw; - + if (vec[YAW] == 0 && vec[PITCH] == 0) { yaw = 0; } else { @@ -692,7 +694,7 @@ float vectoyaw( const vec3_t vec ) { } -void G_InitGentity( gentity_t *e ) +void G_InitGentity( gentity_t *e ) { e->inuse = qtrue; SetInUse(e); @@ -700,7 +702,7 @@ void G_InitGentity( gentity_t *e ) e->s.number = e - g_entities; ICARUS_FreeEnt( e ); //ICARUS information must be added after this point - + // remove any ghoul2 models here //let not gi.G2API_CleanGhoul2Models(e->ghoul2); @@ -725,14 +727,14 @@ instead of being removed and recreated, which can cause interpolated angles and bad trails. ================= */ -gentity_t *G_Spawn( void ) +gentity_t *G_Spawn( void ) { int i, force; gentity_t *e; e = NULL; // shut up warning i = 0; // shut up warning - for ( force = 0 ; force < 2 ; force++ ) + for ( force = 0 ; force < 2 ; force++ ) { // if we go through all entities and can't find one to free, // override the normal minimum times before use @@ -743,12 +745,12 @@ gentity_t *G_Spawn( void ) // { // continue; // } - for ( i = MAX_CLIENTS ; iclassname ) { @@ -788,7 +790,7 @@ gentity_t *G_Spawn( void ) } fclose( fp ); //---------------Or use this to dump to the console -- beware though, the console will fill quickly and you probably won't see the full list - for ( i = 0 ; iclassname ) { @@ -799,7 +801,7 @@ gentity_t *G_Spawn( void ) */ G_Error( "G_Spawn: no free entities" ); } - + // open up a new slot globals.num_entities++; G_InitGentity( e ); @@ -903,7 +905,7 @@ void G_KillBox (gentity_t *ent) { if ( hit == ent ) { continue; } - if ( ent->s.number && hit->client->ps.stats[STAT_HEALTH] <= 0 ) + if ( ent->s.number && hit->client->ps.stats[STAT_HEALTH] <= 0 ) {//NPC continue; } @@ -914,9 +916,9 @@ void G_KillBox (gentity_t *ent) { continue; } } - else + else {//player - if ( !(hit->contents & ent->contents) ) + if ( !(hit->contents & ent->contents) ) { continue; } @@ -1004,7 +1006,7 @@ void G_AddEvent( gentity_t *ent, int event, int eventParm ) { G_Sound ============= */ -void G_Sound( gentity_t *ent, int soundIndex ) +void G_Sound( gentity_t *ent, int soundIndex ) { gentity_t *te; @@ -1017,7 +1019,7 @@ void G_Sound( gentity_t *ent, int soundIndex ) G_Sound ============= */ -void G_SoundAtSpot( vec3_t org, int soundIndex ) +void G_SoundAtSpot( vec3_t org, int soundIndex ) { gentity_t *te; @@ -1032,7 +1034,7 @@ G_SoundBroadcast Plays sound that can permeate PVS blockage ============= */ -void G_SoundBroadcast( gentity_t *ent, int soundIndex ) +void G_SoundBroadcast( gentity_t *ent, int soundIndex ) { gentity_t *te; @@ -1050,7 +1052,7 @@ G_SetOrigin Sets the pos trajectory for a fixed position ================ */ -void G_SetOrigin( gentity_t *ent, const vec3_t origin ) +void G_SetOrigin( gentity_t *ent, const vec3_t origin ) { VectorCopy( origin, ent->s.pos.trBase ); if(ent->client) @@ -1085,7 +1087,7 @@ qboolean G_CheckInSolid (gentity_t *self, qboolean fix) { return qtrue; } - + if(trace.fraction < 1.0) { if(fix) @@ -1104,7 +1106,7 @@ qboolean G_CheckInSolid (gentity_t *self, qboolean fix) return qtrue; } } - + return qfalse; } @@ -1240,12 +1242,12 @@ qboolean ValidUseTarget( gentity_t *ent ) {//set by target_deactivate return qfalse; } - + if ( !(ent->svFlags & SVF_PLAYER_USABLE) ) {//Check for flag that denotes BUTTON_USE useability return qfalse; } - + //FIXME: This is only a temp fix.. if ( !strncmp( ent->classname, "trigger", 7) ) { @@ -1279,14 +1281,14 @@ void TryUse( gentity_t *ent ) //FIXME: this does not match where the new accurate crosshair aims... //cg.refdef.vieworg, basically VectorCopy( ent->client->renderInfo.eyePoint, src ); - + AngleVectors( ent->client->ps.viewangles, vf, NULL, NULL );//ent->client->renderInfo.eyeAngles was cg.refdef.viewangles, basically //extend to find end of use trace VectorMA( src, USE_DISTANCE, vf, dest ); //Trace ahead to find a valid target gi.trace( &trace, src, vec3_origin, vec3_origin, dest, ent->s.number, MASK_OPAQUE|CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_ITEM|CONTENTS_CORPSE, G2_NOCOLLIDE, 0 ); - + if ( trace.fraction == 1.0f || trace.entityNum < 1 ) { //TODO: Play a failure sound @@ -1315,10 +1317,10 @@ void TryUse( gentity_t *ent ) GEntity_UseFunc( target, ent, ent ); return; } - else if ( target->client - && target->client->ps.pm_type < PM_DEAD - && target->NPC!=NULL - && target->client->playerTeam + else if ( target->client + && target->client->ps.pm_type < PM_DEAD + && target->NPC!=NULL + && target->client->playerTeam && (target->client->playerTeam == ent->client->playerTeam || target->client->playerTeam == TEAM_NEUTRAL) && !(target->NPC->scriptFlags&SCF_NO_RESPONSE) ) { @@ -1448,7 +1450,7 @@ qboolean G_ExpandPointToBBox( vec3_t point, const vec3_t mins, const vec3_t maxs vec3_t start, end; VectorCopy( point, start ); - + for ( int i = 0; i < 3; i++ ) { VectorCopy( start, end ); @@ -1494,9 +1496,9 @@ void removeBoltSurface( gentity_t *ent) // check first to be sure the bolt is still there on the model if ((hitEnt->ghoul2.size() > ent->damage) && (hitEnt->ghoul2[ent->damage].mModelindex != -1) && - (hitEnt->ghoul2[ent->damage].mSlist.size() > ent->aimDebounceTime) && + ((int)hitEnt->ghoul2[ent->damage].mSlist.size() > ent->aimDebounceTime) && (hitEnt->ghoul2[ent->damage].mSlist[ent->aimDebounceTime].surface != -1) && - (hitEnt->ghoul2[ent->damage].mSlist[ent->aimDebounceTime].offFlags == G2SURFACEFLAG_GENERATED)) + (hitEnt->ghoul2[ent->damage].mSlist[ent->aimDebounceTime].offFlags == G2SURFACEFLAG_GENERATED)) { // remove the bolt gi.G2API_RemoveBolt(&hitEnt->ghoul2[ent->damage], ent->attackDebounceTime); diff --git a/codeJK2/game/g_weapon.cpp b/codeJK2/game/g_weapon.cpp index a150fcdb5b..37c2c6c292 100644 --- a/codeJK2/game/g_weapon.cpp +++ b/codeJK2/game/g_weapon.cpp @@ -1,29 +1,31 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// g_weapon.c +// g_weapon.c // perform the server side effects of a weapon firing -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - - #include "g_local.h" #include "g_functions.h" #include "anims.h" @@ -83,7 +85,7 @@ gentity_t *CreateMissile( vec3_t org, vec3_t dir, float vel, int life, gentity_t gentity_t *missile; missile = G_Spawn(); - + missile->nextthink = level.time + life; missile->e_ThinkFunc = thinkF_G_FreeEntity; missile->s.eType = ET_MISSILE; @@ -114,7 +116,7 @@ void WP_Stick( gentity_t *missile, trace_t *trace, float fudge_distance ) VectorClear( missile->s.apos.trDelta ); // so we don't stick into the wall - VectorMA( trace->endpos, fudge_distance, trace->plane.normal, org ); + VectorMA( trace->endpos, fudge_distance, trace->plane.normal, org ); G_SetOrigin( missile, org ); vectoangles( trace->plane.normal, ang ); @@ -145,7 +147,7 @@ void WP_Explode( gentity_t *self ) { G_PlayEffect( self->fxID, self->currentOrigin, wpFwd ); } - + if ( self->owner ) { attacker = self->owner; @@ -255,7 +257,7 @@ qboolean W_AccuracyLoggableWeapon( int weapon, qboolean alt_fire, int mod ) { if ( mod != MOD_UNKNOWN ) { - switch( mod ) + switch( mod ) { //standard weapons case MOD_BRYAR: @@ -291,8 +293,8 @@ qboolean W_AccuracyLoggableWeapon( int weapon, qboolean alt_fire, int mod ) } } else if ( weapon != WP_NONE ) - { - switch( weapon ) + { + switch( weapon ) { case WP_BRYAR_PISTOL: case WP_BLASTER: @@ -358,13 +360,13 @@ qboolean LogAccuracyHit( gentity_t *target, gentity_t *attacker ) { } //--------------------------------------------------------- -void CalcMuzzlePoint( gentity_t *const ent, vec3_t wpFwd, vec3_t right, vec3_t wpUp, vec3_t muzzlePoint, float lead_in ) +void CalcMuzzlePoint( gentity_t *const ent, vec3_t wpFwd, vec3_t right, vec3_t wpUp, vec3_t muzzlePoint, float lead_in ) //--------------------------------------------------------- { vec3_t org; mdxaBone_t boltMatrix; - if( !lead_in ) //&& ent->s.number != 0 + if( !lead_in ) //&& ent->s.number != 0 {//Not players or melee if( ent->client ) { @@ -377,7 +379,7 @@ void CalcMuzzlePoint( gentity_t *const ent, vec3_t wpFwd, vec3_t right, vec3_t w } VectorCopy( ent->currentOrigin, muzzlePoint ); - + switch( ent->s.weapon ) { case WP_BRYAR_PISTOL: @@ -431,7 +433,7 @@ void CalcMuzzlePoint( gentity_t *const ent, vec3_t wpFwd, vec3_t right, vec3_t w if (ent->count > 0) { ent->count = 0; - gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, + gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, ent->handLBolt, &boltMatrix, ent->s.angles, ent->s.origin, (cg.time?cg.time:level.time), NULL, ent->s.modelScale ); @@ -439,7 +441,7 @@ void CalcMuzzlePoint( gentity_t *const ent, vec3_t wpFwd, vec3_t right, vec3_t w else { ent->count = 1; - gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, + gi.G2API_GetBoltMatrix( ent->ghoul2, ent->playerModel, ent->handRBolt, &boltMatrix, ent->s.angles, ent->s.origin, (cg.time?cg.time:level.time), NULL, ent->s.modelScale ); @@ -456,12 +458,12 @@ void CalcMuzzlePoint( gentity_t *const ent, vec3_t wpFwd, vec3_t right, vec3_t w } //--------------------------------------------------------- -void FireWeapon( gentity_t *ent, qboolean alt_fire ) +void FireWeapon( gentity_t *ent, qboolean alt_fire ) //--------------------------------------------------------- { float alert = 256; - // track shots taken for accuracy tracking. + // track shots taken for accuracy tracking. ent->client->ps.persistant[PERS_ACCURACY_SHOTS]++; // set aiming directions @@ -473,7 +475,7 @@ void FireWeapon( gentity_t *ent, qboolean alt_fire ) AngleVectors( ent->lastAngles, wpFwd, wpVright, wpUp ); } } - else if ( ent->s.weapon == WP_ATST_SIDE || ent->s.weapon == WP_ATST_MAIN ) + else if ( ent->s.weapon == WP_ATST_SIDE || ent->s.weapon == WP_ATST_MAIN ) { vec3_t delta1, enemy_org1, muzzle1; vec3_t angleToEnemy1; @@ -539,21 +541,21 @@ void FireWeapon( gentity_t *ent, qboolean alt_fire ) else {//NPC, auto-aim at enemy CalcEntitySpot( ent->enemy, SPOT_HEAD, enemy_org1 ); - + VectorSubtract (enemy_org1, muzzle1, delta1); vectoangles ( delta1, angleToEnemy1 ); AngleVectors (angleToEnemy1, wpFwd, wpVright, wpUp); } - } - else if ( ent->s.weapon == WP_BOT_LASER && ent->enemy ) + } + else if ( ent->s.weapon == WP_BOT_LASER && ent->enemy ) { vec3_t delta1, enemy_org1, muzzle1; vec3_t angleToEnemy1; CalcEntitySpot( ent->enemy, SPOT_HEAD, enemy_org1 ); CalcEntitySpot( ent, SPOT_WEAPON, muzzle1 ); - + VectorSubtract (enemy_org1, muzzle1, delta1); vectoangles ( delta1, angleToEnemy1 ); @@ -568,7 +570,7 @@ void FireWeapon( gentity_t *ent, qboolean alt_fire ) CalcMuzzlePoint ( ent, wpFwd, wpVright, wpUp, wpMuzzle , 0); // fire the specific weapon - switch( ent->s.weapon ) + switch( ent->s.weapon ) { // Player weapons //----------------- @@ -671,7 +673,7 @@ void FireWeapon( gentity_t *ent, qboolean alt_fire ) // TEMP if ( alt_fire ) { - WP_FireRepeater( ent, alt_fire ); + WP_FireRepeater( ent, alt_fire ); } else { @@ -734,7 +736,7 @@ void FireWeapon( gentity_t *ent, qboolean alt_fire ) splashdamage - how much damage a blowing up gun deals ( default 80 ) splashradius - radius for exploding damage ( default 128 ) */ - + //---------------------------------------------------------- void emplaced_gun_use( gentity_t *self, gentity_t *other, gentity_t *activator ) { @@ -918,7 +920,7 @@ void emplaced_gun_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacke // turn off any firing animations it may have been doing self->s.frame = self->startFrame = self->endFrame = 0; self->svFlags &= ~SVF_ANIMATING; - + self->health = 0; // self->s.weapon = WP_EMPLACED_GUN; // we need to be able to switch back to the old weapon @@ -969,7 +971,7 @@ void emplaced_gun_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacke ugly[YAW] = 4; ugly[PITCH] = self->lastAngles[PITCH] * 0.8f + crandom() * 6; ugly[ROLL] = crandom() * 7; - gi.G2API_SetBoneAnglesIndex( &self->ghoul2[self->playerModel], self->lowerLumbarBone, ugly, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex( &self->ghoul2[self->playerModel], self->lowerLumbarBone, ugly, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 0, 0 ); VectorCopy( self->currentOrigin, org ); org[2] += 20; @@ -986,7 +988,7 @@ void emplaced_gun_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacke ent->fxID = G_EffectIndex( "emplaced/dead_smoke" ); - ent->e_ThinkFunc = thinkF_fx_runner_think; + ent->e_ThinkFunc = thinkF_fx_runner_think; ent->nextthink = level.time + 50; // move up above the gun origin @@ -1053,7 +1055,7 @@ void SP_emplaced_gun( gentity_t *ent ) ent->dflags |= DAMAGE_CUSTOM_HUD; // dumb, but we draw a custom hud ent->s.modelindex = G_ModelIndex( name ); - ent->playerModel = gi.G2API_InitGhoul2Model( ent->ghoul2, name, ent->s.modelindex, NULL, NULL, 0, 0 ); + ent->playerModel = gi.G2API_InitGhoul2Model( ent->ghoul2, name, ent->s.modelindex, NULL_HANDLE, NULL_HANDLE, 0, 0 ); // Activate our tags and bones ent->headBolt = gi.G2API_AddBolt( &ent->ghoul2[0], "*seat" ); @@ -1061,7 +1063,7 @@ void SP_emplaced_gun( gentity_t *ent ) ent->handRBolt = gi.G2API_AddBolt( &ent->ghoul2[0], "*flash02" ); ent->rootBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->playerModel], "base_bone", qtrue ); ent->lowerLumbarBone = gi.G2API_GetBoneIndex( &ent->ghoul2[0], "swivel_bone", qtrue ); - gi.G2API_SetBoneAngles( &ent->ghoul2[0], "swivel_bone", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 0, 0); + gi.G2API_SetBoneAngles( &ent->ghoul2[0], "swivel_bone", vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 0, 0); RegisterItem( FindItemForWeapon( WP_EMPLACED_GUN )); ent->s.weapon = WP_EMPLACED_GUN; diff --git a/codeJK2/game/g_weaponLoad.cpp b/codeJK2/game/g_weaponLoad.cpp index f75bea69a3..034a7b82ef 100644 --- a/codeJK2/game/g_weaponLoad.cpp +++ b/codeJK2/game/g_weaponLoad.cpp @@ -1,26 +1,28 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// g_weaponLoad.cpp +// g_weaponLoad.cpp // fills in memory struct with ext_dat\weapons.dat -// this is excluded from PCH usage 'cos it looks kinda scary to me, being game and ui.... -Ste - #include "g_local.h" typedef struct { @@ -92,7 +94,7 @@ func_t funcs[] = { }; //qboolean COM_ParseInt( char **data, int *i ); -//qboolean COM_ParseString( char **data, char **s ); +//qboolean COM_ParseString( char **data, char **s ); //qboolean COM_ParseFloat( char **data, float *f ); struct wpnParms_s @@ -150,7 +152,7 @@ void WPN_AltSplashRadius(const char **holdBuf); // Legacy weapons.dat force fields void WPN_FuncSkip(const char **holdBuf); -typedef struct +typedef struct { const char *parmName; void (*func)(const char **holdBuf); @@ -313,7 +315,7 @@ const float defaultAltSplashRadius[] = { 0 // WP_BLASTER_PISTOL }; -wpnParms_t WpnParms[] = +wpnParms_t WpnParms[] = { { "ammo", WPN_Ammo }, //ammo { "ammoicon", WPN_AmmoIcon }, @@ -378,45 +380,45 @@ void WPN_WeaponType( const char **holdBuf) int weaponNum; const char *tokenStr; - if (COM_ParseString(holdBuf,&tokenStr)) + if (COM_ParseString(holdBuf,&tokenStr)) { return; } // FIXME : put this in an array (maybe a weaponDataInternal array???) - if (!Q_stricmp(tokenStr,"WP_NONE")) + if (!Q_stricmp(tokenStr,"WP_NONE")) weaponNum = WP_NONE; - else if (!Q_stricmp(tokenStr,"WP_SABER")) + else if (!Q_stricmp(tokenStr,"WP_SABER")) weaponNum = WP_SABER; - else if (!Q_stricmp(tokenStr,"WP_BRYAR_PISTOL")) + else if (!Q_stricmp(tokenStr,"WP_BRYAR_PISTOL")) weaponNum = WP_BRYAR_PISTOL; - else if (!Q_stricmp(tokenStr,"WP_BLASTER")) + else if (!Q_stricmp(tokenStr,"WP_BLASTER")) weaponNum = WP_BLASTER; - else if (!Q_stricmp(tokenStr,"WP_DISRUPTOR")) + else if (!Q_stricmp(tokenStr,"WP_DISRUPTOR")) weaponNum = WP_DISRUPTOR; - else if (!Q_stricmp(tokenStr,"WP_BOWCASTER")) + else if (!Q_stricmp(tokenStr,"WP_BOWCASTER")) weaponNum = WP_BOWCASTER; - else if (!Q_stricmp(tokenStr,"WP_REPEATER")) + else if (!Q_stricmp(tokenStr,"WP_REPEATER")) weaponNum = WP_REPEATER; - else if (!Q_stricmp(tokenStr,"WP_DEMP2")) + else if (!Q_stricmp(tokenStr,"WP_DEMP2")) weaponNum = WP_DEMP2; - else if (!Q_stricmp(tokenStr,"WP_FLECHETTE")) + else if (!Q_stricmp(tokenStr,"WP_FLECHETTE")) weaponNum = WP_FLECHETTE; - else if (!Q_stricmp(tokenStr,"WP_ROCKET_LAUNCHER")) + else if (!Q_stricmp(tokenStr,"WP_ROCKET_LAUNCHER")) weaponNum = WP_ROCKET_LAUNCHER; - else if (!Q_stricmp(tokenStr,"WP_THERMAL")) + else if (!Q_stricmp(tokenStr,"WP_THERMAL")) weaponNum = WP_THERMAL; - else if (!Q_stricmp(tokenStr,"WP_TRIP_MINE")) + else if (!Q_stricmp(tokenStr,"WP_TRIP_MINE")) weaponNum = WP_TRIP_MINE; - else if (!Q_stricmp(tokenStr,"WP_DET_PACK")) + else if (!Q_stricmp(tokenStr,"WP_DET_PACK")) weaponNum = WP_DET_PACK; - else if (!Q_stricmp(tokenStr,"WP_STUN_BATON")) + else if (!Q_stricmp(tokenStr,"WP_STUN_BATON")) weaponNum = WP_STUN_BATON; - else if (!Q_stricmp(tokenStr,"WP_BOT_LASER")) + else if (!Q_stricmp(tokenStr,"WP_BOT_LASER")) weaponNum = WP_BOT_LASER; - else if (!Q_stricmp(tokenStr,"WP_EMPLACED_GUN")) + else if (!Q_stricmp(tokenStr,"WP_EMPLACED_GUN")) weaponNum = WP_EMPLACED_GUN; - else if (!Q_stricmp(tokenStr,"WP_MELEE")) + else if (!Q_stricmp(tokenStr,"WP_MELEE")) weaponNum = WP_MELEE; else if (!Q_stricmp(tokenStr,"WP_TURRET")) weaponNum = WP_TURRET; @@ -445,7 +447,7 @@ void WPN_WeaponClass(const char **holdBuf) int len; const char *tokenStr; - if (COM_ParseString(holdBuf,&tokenStr)) + if (COM_ParseString(holdBuf,&tokenStr)) { return; } @@ -468,7 +470,7 @@ void WPN_WeaponModel(const char **holdBuf) int len; const char *tokenStr; - if ( COM_ParseString(holdBuf,&tokenStr)) + if ( COM_ParseString(holdBuf,&tokenStr)) { return; } @@ -490,7 +492,7 @@ void WPN_WeaponIcon(const char **holdBuf) int len; const char *tokenStr; - if ( COM_ParseString(holdBuf,&tokenStr)) + if ( COM_ParseString(holdBuf,&tokenStr)) { return; } @@ -511,7 +513,7 @@ void WPN_AmmoType(const char **holdBuf) { int tokenInt; - if ( COM_ParseInt(holdBuf,&tokenInt)) + if ( COM_ParseInt(holdBuf,&tokenInt)) { SkipRestOfLine(holdBuf); return; @@ -531,7 +533,7 @@ void WPN_AmmoLowCnt(const char **holdBuf) { int tokenInt; - if ( COM_ParseInt(holdBuf,&tokenInt)) + if ( COM_ParseInt(holdBuf,&tokenInt)) { SkipRestOfLine(holdBuf); return; @@ -552,7 +554,7 @@ void WPN_FiringSnd(const char **holdBuf) const char *tokenStr; int len; - if ( COM_ParseString(holdBuf,&tokenStr)) + if ( COM_ParseString(holdBuf,&tokenStr)) { return; } @@ -574,7 +576,7 @@ void WPN_AltFiringSnd( const char **holdBuf ) const char *tokenStr; int len; - if ( COM_ParseString(holdBuf,&tokenStr)) + if ( COM_ParseString(holdBuf,&tokenStr)) { return; } @@ -596,7 +598,7 @@ void WPN_StopSnd( const char **holdBuf ) const char *tokenStr; int len; - if ( COM_ParseString(holdBuf,&tokenStr)) + if ( COM_ParseString(holdBuf,&tokenStr)) { return; } @@ -618,7 +620,7 @@ void WPN_ChargeSnd(const char **holdBuf) const char *tokenStr; int len; - if ( COM_ParseString(holdBuf,&tokenStr)) + if ( COM_ParseString(holdBuf,&tokenStr)) { return; } @@ -640,7 +642,7 @@ void WPN_AltChargeSnd(const char **holdBuf) const char *tokenStr; int len; - if ( COM_ParseString(holdBuf,&tokenStr)) + if ( COM_ParseString(holdBuf,&tokenStr)) { return; } @@ -662,7 +664,7 @@ void WPN_SelectSnd( const char **holdBuf ) const char *tokenStr; int len; - if ( COM_ParseString( holdBuf,&tokenStr )) + if ( COM_ParseString( holdBuf,&tokenStr )) { return; } @@ -684,7 +686,7 @@ void WPN_FireTime(const char **holdBuf) { int tokenInt; - if ( COM_ParseInt(holdBuf,&tokenInt)) + if ( COM_ParseInt(holdBuf,&tokenInt)) { SkipRestOfLine(holdBuf); return; @@ -703,7 +705,7 @@ void WPN_Range(const char **holdBuf) { int tokenInt; - if ( COM_ParseInt(holdBuf,&tokenInt)) + if ( COM_ParseInt(holdBuf,&tokenInt)) { SkipRestOfLine(holdBuf); return; @@ -723,7 +725,7 @@ void WPN_EnergyPerShot(const char **holdBuf) { int tokenInt; - if ( COM_ParseInt(holdBuf,&tokenInt)) + if ( COM_ParseInt(holdBuf,&tokenInt)) { SkipRestOfLine(holdBuf); return; @@ -742,7 +744,7 @@ void WPN_AltFireTime(const char **holdBuf) { int tokenInt; - if ( COM_ParseInt(holdBuf,&tokenInt)) + if ( COM_ParseInt(holdBuf,&tokenInt)) { SkipRestOfLine(holdBuf); return; @@ -761,7 +763,7 @@ void WPN_AltRange(const char **holdBuf) { int tokenInt; - if ( COM_ParseInt(holdBuf,&tokenInt)) + if ( COM_ParseInt(holdBuf,&tokenInt)) { SkipRestOfLine(holdBuf); return; @@ -781,7 +783,7 @@ void WPN_AltEnergyPerShot(const char **holdBuf) { int tokenInt; - if ( COM_ParseInt(holdBuf,&tokenInt)) + if ( COM_ParseInt(holdBuf,&tokenInt)) { SkipRestOfLine(holdBuf); return; @@ -800,30 +802,30 @@ void WPN_Ammo(const char **holdBuf) { const char *tokenStr; - if ( COM_ParseString(holdBuf,&tokenStr)) + if ( COM_ParseString(holdBuf,&tokenStr)) { return; } - if (!Q_stricmp(tokenStr,"AMMO_NONE")) + if (!Q_stricmp(tokenStr,"AMMO_NONE")) wpnParms.ammoNum = AMMO_NONE; - else if (!Q_stricmp(tokenStr,"AMMO_FORCE")) + else if (!Q_stricmp(tokenStr,"AMMO_FORCE")) wpnParms.ammoNum = AMMO_FORCE; - else if (!Q_stricmp(tokenStr,"AMMO_BLASTER")) + else if (!Q_stricmp(tokenStr,"AMMO_BLASTER")) wpnParms.ammoNum = AMMO_BLASTER; - else if (!Q_stricmp(tokenStr,"AMMO_POWERCELL")) + else if (!Q_stricmp(tokenStr,"AMMO_POWERCELL")) wpnParms.ammoNum = AMMO_POWERCELL; - else if (!Q_stricmp(tokenStr,"AMMO_METAL_BOLTS")) + else if (!Q_stricmp(tokenStr,"AMMO_METAL_BOLTS")) wpnParms.ammoNum = AMMO_METAL_BOLTS; - else if (!Q_stricmp(tokenStr,"AMMO_ROCKETS")) + else if (!Q_stricmp(tokenStr,"AMMO_ROCKETS")) wpnParms.ammoNum = AMMO_ROCKETS; - else if (!Q_stricmp(tokenStr,"AMMO_EMPLACED")) + else if (!Q_stricmp(tokenStr,"AMMO_EMPLACED")) wpnParms.ammoNum = AMMO_EMPLACED; - else if (!Q_stricmp(tokenStr,"AMMO_THERMAL")) + else if (!Q_stricmp(tokenStr,"AMMO_THERMAL")) wpnParms.ammoNum = AMMO_THERMAL; - else if (!Q_stricmp(tokenStr,"AMMO_TRIPMINE")) + else if (!Q_stricmp(tokenStr,"AMMO_TRIPMINE")) wpnParms.ammoNum = AMMO_TRIPMINE; - else if (!Q_stricmp(tokenStr,"AMMO_DETPACK")) + else if (!Q_stricmp(tokenStr,"AMMO_DETPACK")) wpnParms.ammoNum = AMMO_DETPACK; else { @@ -838,7 +840,7 @@ void WPN_AmmoIcon(const char **holdBuf) const char *tokenStr; int len; - if ( COM_ParseString(holdBuf,&tokenStr)) + if ( COM_ParseString(holdBuf,&tokenStr)) { return; } @@ -860,13 +862,13 @@ void WPN_AmmoMax(const char **holdBuf) { int tokenInt; - if ( COM_ParseInt(holdBuf,&tokenInt)) + if ( COM_ParseInt(holdBuf,&tokenInt)) { SkipRestOfLine(holdBuf); return; } - if ((tokenInt < 0) || (tokenInt > 1000 )) + if ((tokenInt < 0) || (tokenInt > 1000 )) { gi.Printf(S_COLOR_YELLOW"WARNING: bad Ammo Max in external weapon data '%d'\n", tokenInt); return; @@ -879,13 +881,13 @@ void WPN_BarrelCount(const char **holdBuf) { int tokenInt; - if ( COM_ParseInt(holdBuf,&tokenInt)) + if ( COM_ParseInt(holdBuf,&tokenInt)) { SkipRestOfLine(holdBuf); return; } - if ((tokenInt < 0) || (tokenInt > 4 )) + if ((tokenInt < 0) || (tokenInt > 4 )) { gi.Printf(S_COLOR_YELLOW"WARNING: bad Range in external weapon data '%d'\n", tokenInt); return; @@ -911,7 +913,7 @@ static void WP_ParseWeaponParms(const char **holdBuf) // Loop through possible parameters for (i=0;i. -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// Filename:- genericparser2.cpp +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #ifdef _JK2EXE #include "../qcommon/qcommon.h" @@ -24,14 +26,6 @@ This file is part of Jedi Knight 2. #include "g_headers.h" #endif - - - - - -//#define _EXE - - #define MAX_TOKEN_SIZE 1024 static char token[MAX_TOKEN_SIZE]; @@ -690,7 +684,7 @@ CGPGroup *CGPGroup::FindSubGroup(const char *name) group = mSubGroups; while(group) { - if(!stricmp(name, group->GetName())) + if(!Q_stricmp(name, group->GetName())) { return(group); } diff --git a/codeJK2/game/genericparser2.h b/codeJK2/game/genericparser2.h index 3c0667de7f..c3d0988673 100644 --- a/codeJK2/game/genericparser2.h +++ b/codeJK2/game/genericparser2.h @@ -1,28 +1,28 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software - -// Filename:- genericparser2.h +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #ifndef GENERICPARSER2_H #define GENERICPARSER2_H - // conditional expression is constant // conversion from int to char, possible loss of data // unreferenced inline funciton has been removed diff --git a/codeJK2/game/ghoul2_shared.h b/codeJK2/game/ghoul2_shared.h index ea5a9d0df7..e089989e53 100644 --- a/codeJK2/game/ghoul2_shared.h +++ b/codeJK2/game/ghoul2_shared.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #pragma once #if !defined(GHOUL2_SHARED_H_INC) @@ -29,7 +33,6 @@ Ghoul2 Insert Start #include #pragma warning (pop) #pragma warning (disable:4503) // decorated name length xceeded, name was truncated -using namespace std; /* Ghoul2 Insert End */ diff --git a/codeJK2/game/npc_headers.h b/codeJK2/game/npc_headers.h index 29d55434ff..acf95e49a6 100644 --- a/codeJK2/game/npc_headers.h +++ b/codeJK2/game/npc_headers.h @@ -1,22 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . -*/ -// Copyright 2001-2013 Raven Software +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// PCH header file organiser for NPC_xxxx cpp files' most commonly used headers +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "b_local.h" #include "anims.h" diff --git a/codeJK2/game/objectives.h b/codeJK2/game/objectives.h index 3d3ad2ac87..1e7e7cd4aa 100644 --- a/codeJK2/game/objectives.h +++ b/codeJK2/game/objectives.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __OBJECTIVES_H__ #define __OBJECTIVES_H__ diff --git a/codeJK2/game/say.h b/codeJK2/game/say.h index 11fd02f9eb..c19b581efd 100644 --- a/codeJK2/game/say.h +++ b/codeJK2/game/say.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __SAY_H__ #define __SAY_H__ diff --git a/codeJK2/game/statindex.h b/codeJK2/game/statindex.h index 0e1553ed16..481eef607b 100644 --- a/codeJK2/game/statindex.h +++ b/codeJK2/game/statindex.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename: statindex.h // @@ -23,7 +27,6 @@ This file is part of Jedi Knight 2. #ifndef STATINDEX_H #define STATINDEX_H - // player_state->stats[] indexes typedef enum { STAT_HEALTH, @@ -35,8 +38,6 @@ typedef enum { STAT_MAX_HEALTH // health / armor limit, changable by handicap } statIndex_t; - - #endif // #ifndef STATINDEX_H diff --git a/codeJK2/game/surfaceflags.h b/codeJK2/game/surfaceflags.h index 78dc985865..7faaaaa82a 100644 --- a/codeJK2/game/surfaceflags.h +++ b/codeJK2/game/surfaceflags.h @@ -1,23 +1,26 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 1999 - 2005, id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// Copyright (C) 1999-2000 Id Software, Inc. -// // This file must be identical in the quake and utils directories // contents flags are seperate bits diff --git a/codeJK2/game/teams.h b/codeJK2/game/teams.h index ad9208513a..29197f6825 100644 --- a/codeJK2/game/teams.h +++ b/codeJK2/game/teams.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef TEAMS_H #define TEAMS_H diff --git a/codeJK2/game/w_local.h b/codeJK2/game/w_local.h index 3629fca615..5fd05a180f 100644 --- a/codeJK2/game/w_local.h +++ b/codeJK2/game/w_local.h @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK // Stuff from g_weapon.cpp extern vec3_t wpFwd, wpVright, wpUp; diff --git a/codeJK2/game/weapons.h b/codeJK2/game/weapons.h index 9e2fa00875..f796fc6533 100644 --- a/codeJK2/game/weapons.h +++ b/codeJK2/game/weapons.h @@ -1,20 +1,25 @@ /* -This file is part of Jedi Knight 2. - - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Filename:- weapons.h // diff --git a/codeJK2/game/wp_atst.cpp b/codeJK2/game/wp_atst.cpp index 755aa654ab..b47aaa429f 100644 --- a/codeJK2/game/wp_atst.cpp +++ b/codeJK2/game/wp_atst.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_headers.h" diff --git a/codeJK2/game/wp_blaster_rifle.cpp b/codeJK2/game/wp_blaster_rifle.cpp index f568bdd83f..f9df6d0de0 100644 --- a/codeJK2/game/wp_blaster_rifle.cpp +++ b/codeJK2/game/wp_blaster_rifle.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_headers.h" diff --git a/codeJK2/game/wp_bot_laser.cpp b/codeJK2/game/wp_bot_laser.cpp index 9c3e28f08f..3aee2449ea 100644 --- a/codeJK2/game/wp_bot_laser.cpp +++ b/codeJK2/game/wp_bot_laser.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_headers.h" diff --git a/codeJK2/game/wp_bowcaster.cpp b/codeJK2/game/wp_bowcaster.cpp index 38fa5a0564..a3fe78a2d3 100644 --- a/codeJK2/game/wp_bowcaster.cpp +++ b/codeJK2/game/wp_bowcaster.cpp @@ -1,21 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . -*/ -// Copyright 2013 OpenJK +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_headers.h" #include "b_local.h" diff --git a/codeJK2/game/wp_bryar_pistol.cpp b/codeJK2/game/wp_bryar_pistol.cpp index b54114c17b..383895bfda 100644 --- a/codeJK2/game/wp_bryar_pistol.cpp +++ b/codeJK2/game/wp_bryar_pistol.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_headers.h" diff --git a/codeJK2/game/wp_demp2.cpp b/codeJK2/game/wp_demp2.cpp index 07d76db873..b7cca42dc2 100644 --- a/codeJK2/game/wp_demp2.cpp +++ b/codeJK2/game/wp_demp2.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_headers.h" diff --git a/codeJK2/game/wp_det_pack.cpp b/codeJK2/game/wp_det_pack.cpp index 421b519284..cb5169b48b 100644 --- a/codeJK2/game/wp_det_pack.cpp +++ b/codeJK2/game/wp_det_pack.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_headers.h" @@ -46,7 +50,7 @@ void charge_stick( gentity_t *self, gentity_t *other, trace_t *trace ) VectorScale( self->maxs, -1, self->mins ); self->activator = self->owner; - self->owner = NULL; + self->owner = NULL; self->e_TouchFunc = touchF_NULL; self->e_ThinkFunc = thinkF_NULL; @@ -56,7 +60,7 @@ void charge_stick( gentity_t *self, gentity_t *other, trace_t *trace ) } //--------------------------------------------------------- -static void WP_DropDetPack( gentity_t *self, vec3_t start, vec3_t dir ) +static void WP_DropDetPack( gentity_t *self, vec3_t start, vec3_t dir ) //--------------------------------------------------------- { // Chucking a new one @@ -79,7 +83,7 @@ static void WP_DropDetPack( gentity_t *self, vec3_t start, vec3_t dir ) missile->s.eFlags |= EF_MISSILE_STICK; missile->e_TouchFunc = touchF_charge_stick; - + missile->damage = weaponData[WP_DET_PACK].damage; missile->methodOfDeath = MOD_DETPACK; @@ -94,7 +98,7 @@ static void WP_DropDetPack( gentity_t *self, vec3_t start, vec3_t dir ) missile->s.radius = 30; VectorSet( missile->s.modelScale, 1.0f, 1.0f, 1.0f ); - gi.G2API_InitGhoul2Model( missile->ghoul2, weaponData[WP_DET_PACK].missileMdl, G_ModelIndex( weaponData[WP_DET_PACK].missileMdl ), NULL, NULL, 0, 0); + gi.G2API_InitGhoul2Model( missile->ghoul2, weaponData[WP_DET_PACK].missileMdl, G_ModelIndex( weaponData[WP_DET_PACK].missileMdl ), NULL_HANDLE, NULL_HANDLE, 0, 0); AddSoundEvent( NULL, missile->currentOrigin, 128, AEL_MINOR, qtrue ); AddSightEvent( NULL, missile->currentOrigin, 128, AEL_SUSPICIOUS, 10 ); diff --git a/codeJK2/game/wp_disruptor.cpp b/codeJK2/game/wp_disruptor.cpp index 2be4beb236..4cea823d87 100644 --- a/codeJK2/game/wp_disruptor.cpp +++ b/codeJK2/game/wp_disruptor.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_headers.h" diff --git a/codeJK2/game/wp_emplaced_gun.cpp b/codeJK2/game/wp_emplaced_gun.cpp index b04d1860b1..25758823d5 100644 --- a/codeJK2/game/wp_emplaced_gun.cpp +++ b/codeJK2/game/wp_emplaced_gun.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_headers.h" diff --git a/codeJK2/game/wp_flechette.cpp b/codeJK2/game/wp_flechette.cpp index 660ecb0c09..382b20b934 100644 --- a/codeJK2/game/wp_flechette.cpp +++ b/codeJK2/game/wp_flechette.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_headers.h" diff --git a/codeJK2/game/wp_melee.cpp b/codeJK2/game/wp_melee.cpp index 42b5198775..a6237c4a3f 100644 --- a/codeJK2/game/wp_melee.cpp +++ b/codeJK2/game/wp_melee.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_headers.h" diff --git a/codeJK2/game/wp_repeater.cpp b/codeJK2/game/wp_repeater.cpp index 512ea014d8..b744628dfe 100644 --- a/codeJK2/game/wp_repeater.cpp +++ b/codeJK2/game/wp_repeater.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_headers.h" diff --git a/codeJK2/game/wp_rocket_launcher.cpp b/codeJK2/game/wp_rocket_launcher.cpp index 18d6f4b817..174a86e69f 100644 --- a/codeJK2/game/wp_rocket_launcher.cpp +++ b/codeJK2/game/wp_rocket_launcher.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_headers.h" diff --git a/codeJK2/game/wp_saber.cpp b/codeJK2/game/wp_saber.cpp index f87736a1b6..1b5f5fcb40 100644 --- a/codeJK2/game/wp_saber.cpp +++ b/codeJK2/game/wp_saber.cpp @@ -1,30 +1,31 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// leave this line at the top for all g_xxxx.cpp files... #include "g_headers.h" - - #include "g_local.h" #include "anims.h" #include "b_local.h" -#include "bg_local.h" +#include "bg_local.h" #include "g_functions.h" #include "wp_saber.h" #include "../../code/qcommon/tri_coll_test.h" @@ -122,7 +123,7 @@ extern int g_crosshairEntNum; int g_saberFlashTime = 0; vec3_t g_saberFlashPos = {0,0,0}; -int forcePowerNeeded[NUM_FORCE_POWERS] = +int forcePowerNeeded[NUM_FORCE_POWERS] = { 0,//FP_HEAL,//instant 10,//FP_LEVITATION,//hold/duration @@ -138,7 +139,7 @@ int forcePowerNeeded[NUM_FORCE_POWERS] = //NUM_FORCE_POWERS }; -float forceJumpStrength[NUM_FORCE_POWER_LEVELS] = +float forceJumpStrength[NUM_FORCE_POWER_LEVELS] = { JUMP_VELOCITY,//normal jump 420, @@ -146,7 +147,7 @@ float forceJumpStrength[NUM_FORCE_POWER_LEVELS] = 840 }; -float forceJumpHeight[NUM_FORCE_POWER_LEVELS] = +float forceJumpHeight[NUM_FORCE_POWER_LEVELS] = { 32,//normal jump (+stepheight+crouchdiff = 66) 96,//(+stepheight+crouchdiff = 130) @@ -154,7 +155,7 @@ float forceJumpHeight[NUM_FORCE_POWER_LEVELS] = 384//(+stepheight+crouchdiff = 418) }; -float forceJumpHeightMax[NUM_FORCE_POWER_LEVELS] = +float forceJumpHeightMax[NUM_FORCE_POWER_LEVELS] = { 66,//normal jump (32+stepheight(18)+crouchdiff(24) = 74) 130,//(96+stepheight(18)+crouchdiff(24) = 138) @@ -279,7 +280,7 @@ void G_CreateG2AttachedWeaponModel( gentity_t *ent, const char *psWeaponModel ) if (char *spot = (char*)Q_stristr(weaponModel, ".md3") ) { *spot = 0; spot = (char*)Q_stristr(weaponModel, "_w");//i'm using the in view weapon array instead of scanning the item list, so put the _w back on - if (!spot&&!Q_stristr(weaponModel, "noweap")) + if (!spot&&!Q_stristr(weaponModel, "noweap")) { Q_strcat (weaponModel, sizeof(weaponModel), "_w"); } @@ -291,11 +292,11 @@ void G_CreateG2AttachedWeaponModel( gentity_t *ent, const char *psWeaponModel ) return; } // give us a sabre model - ent->weaponModel = gi.G2API_InitGhoul2Model(ent->ghoul2, weaponModel, G_ModelIndex( weaponModel ), NULL, NULL, 0, 0); + ent->weaponModel = gi.G2API_InitGhoul2Model(ent->ghoul2, weaponModel, G_ModelIndex( weaponModel ), NULL_HANDLE, NULL_HANDLE, 0, 0); if ( ent->weaponModel != -1 ) { // attach it to the hand - gi.G2API_AttachG2Model(&ent->ghoul2[ent->weaponModel], &ent->ghoul2[ent->playerModel], + gi.G2API_AttachG2Model(&ent->ghoul2[ent->weaponModel], &ent->ghoul2[ent->playerModel], ent->handRBolt, ent->playerModel); // set up a bolt on the end so we can get where the sabre muzzle is - we can assume this is always bolt 0 gi.G2API_AddBolt(&ent->ghoul2[ent->weaponModel], "*flash"); @@ -342,17 +343,17 @@ void G_Throw( gentity_t *targ, vec3_t newDir, float push ) // set the timer so that the other client can't cancel // out the movement immediately - if ( targ->client && !targ->client->ps.pm_time ) + if ( targ->client && !targ->client->ps.pm_time ) { int t; t = push * 2; - if ( t < 50 ) + if ( t < 50 ) { t = 50; } - if ( t > 200 ) + if ( t > 200 ) { t = 200; } @@ -405,7 +406,7 @@ int WP_SetSaberModel( gclient_t *client, class_t npcClass ) void WP_SaberInitBladeData( gentity_t *ent ) { gentity_t *saberent; - + if ( ent->client ) { VectorClear( ent->client->renderInfo.muzzlePoint ); @@ -439,7 +440,7 @@ void WP_SaberInitBladeData( gentity_t *ent ) {//shadowtroopers ent->client->ps.saberAnimLevel = Q_irand( FORCE_LEVEL_1, FORCE_LEVEL_3 ); } - else if ( ent->NPC && ent->client->playerTeam == TEAM_ENEMY && ent->NPC->rank == RANK_LT ) + else if ( ent->NPC && ent->client->playerTeam == TEAM_ENEMY && ent->NPC->rank == RANK_LT ) {//boss always starts with strong attacks ent->client->ps.saberAnimLevel = FORCE_LEVEL_3; } @@ -483,7 +484,7 @@ void WP_SaberInitBladeData( gentity_t *ent ) saberent = G_Spawn(); ent->client->ps.saberEntityNum = saberent->s.number; saberent->classname = "lightsaber"; - + saberent->s.eType = ET_GENERAL; saberent->svFlags = SVF_USE_CURRENT_ORIGIN; saberent->s.weapon = WP_SABER; @@ -504,11 +505,11 @@ Ghoul2 Insert Start */ //FIXME: get saberModel from NPCs.cfg for NPCs? saberent->s.modelindex = WP_SetSaberModel( ent->client, ent->client->NPC_class ); - gi.G2API_InitGhoul2Model( saberent->ghoul2, ent->client->ps.saberModel, saberent->s.modelindex, NULL, NULL, 0, 0 ); + gi.G2API_InitGhoul2Model( saberent->ghoul2, ent->client->ps.saberModel, saberent->s.modelindex, NULL_HANDLE, NULL_HANDLE, 0, 0 ); // set up a bolt on the end so we can get where the sabre muzzle is - we can assume this is always bolt 0 gi.G2API_AddBolt( &saberent->ghoul2[0], "*flash" ); //gi.G2API_SetLodBias( &saberent->ghoul2[0], 0 ); - + /* Ghoul2 Insert End */ @@ -625,7 +626,7 @@ qboolean WP_GetSaberDeflectionAngle( gentity_t *attacker, gentity_t *defender ) attacker->client->ps.saberBounceMove = PM_SaberBounceForAttack( attacker->client->ps.saberMove ); return qfalse; } - else + else {//a deflection vec3_t att_Right, att_Up, att_DeflectionDir; float swingRDot, swingUDot; @@ -766,7 +767,7 @@ qboolean WP_SaberApplyDamage( gentity_t *ent, float baseDamage, int baseDFlags, { continue; } - + if ( victim->e_DieFunc == dieF_maglock_die ) {//*sigh*, special check for maglocks vec3_t testFrom; @@ -993,7 +994,7 @@ void WP_SaberDamageAdd( float trDmg, int trVictimEntityNum, vec3_t trDmgDir, vec {//this hitLoc is more critical than the previous one this frame hitLoc[curVictim] = trHitLoc; } - + totalDmg[curVictim] += addDmg; if ( !VectorLengthSquared( dmgDir[curVictim] ) ) { @@ -1004,7 +1005,7 @@ void WP_SaberDamageAdd( float trDmg, int trVictimEntityNum, vec3_t trDmgDir, vec VectorCopy( trDmgSpot, dmgSpot[curVictim] ); } - // Make sure we keep track of the fraction. Why? + // Make sure we keep track of the fraction. Why? // Well, if the saber hits something that stops it, the damage isn't done past that point. dmgFraction[curVictim] = fraction; if ( (trDismemberLoc != HL_NONE && hitDismemberLoc[curVictim] == HL_NONE) @@ -1281,7 +1282,7 @@ qboolean WP_SaberDamageEffects( trace_t *tr, const vec3_t start, float length, f float distFromStart,doDmg; char *hitEffect; gentity_t *hitEnt; - + for (z=0; z < MAX_G2_COLLISIONS; z++) { if ( tr->G2CollisionMap[z].mEntityNum == -1 ) @@ -1340,7 +1341,7 @@ qboolean WP_SaberDamageEffects( trace_t *tr, const vec3_t start, float length, f //remember the entrance dir VectorCopy( coll.mCollisionNormal, hitEntDir[numHitEnts] ); VectorNormalize( hitEntDir[numHitEnts] ); - + //do the effect //FIXME: check material rather than team? @@ -1354,7 +1355,7 @@ qboolean WP_SaberDamageEffects( trace_t *tr, const vec3_t start, float length, f if ( npc_class == CLASS_SEEKER || npc_class == CLASS_PROBE || npc_class == CLASS_MOUSE || npc_class == CLASS_REMOTE || npc_class == CLASS_GONK || npc_class == CLASS_R2D2 || npc_class == CLASS_R5D2 || npc_class == CLASS_PROTOCOL || npc_class == CLASS_MARK1 || npc_class == CLASS_MARK2 || - npc_class == CLASS_INTERROGATOR || npc_class == CLASS_ATST || npc_class == CLASS_SENTRY ) + npc_class == CLASS_INTERROGATOR || npc_class == CLASS_ATST || npc_class == CLASS_SENTRY ) { hitEffect = hit_sparks; } @@ -1449,7 +1450,7 @@ void WP_SaberKnockaway( gentity_t *attacker, trace_t *tr ) #define SABER_COLLISION_DIST 6//was 2//was 4//was 8//was 16 extern qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f ); -qboolean WP_SaberDamageForTrace( int ignore, vec3_t start, vec3_t end, float dmg, +qboolean WP_SaberDamageForTrace( int ignore, vec3_t start, vec3_t end, float dmg, vec3_t bladeDir, qboolean noGhoul, int attackStrength, qboolean extrapolate = qtrue ) { @@ -1523,12 +1524,12 @@ qboolean WP_SaberDamageForTrace( int ignore, vec3_t start, vec3_t end, float dmg { if ( attacker && attacker->client && attacker->client->ps.saberInFlight ) {//thrown saber hit something - if ( owner + if ( owner && owner->s.number - && owner->client - && owner->NPC - && owner->health > 0 - && ( owner->client->NPC_class == CLASS_TAVION + && owner->client + && owner->NPC + && owner->health > 0 + && ( owner->client->NPC_class == CLASS_TAVION /*|| (owner->client->NPC_class == CLASS_SHADOWTROOPER && !Q_irand( 0, g_spskill->integer*3 )) || (Q_irand( -5, owner->NPC->rank ) > RANK_CIVILIAN && !Q_irand( 0, g_spskill->integer*3 ))*/ ) ) @@ -1541,11 +1542,11 @@ qboolean WP_SaberDamageForTrace( int ignore, vec3_t start, vec3_t end, float dmg //FIXME: take target FP_SABER_DEFENSE and attacker FP_SABER_OFFENSE into account here somehow? qboolean sabersIntersect = WP_SabersIntersect( attacker, owner, qfalse );//qtrue ); float sabersDist; - if ( attacker && attacker->client && attacker->client->ps.saberInFlight + if ( attacker && attacker->client && attacker->client->ps.saberInFlight && owner && owner->s.number == 0 && (g_saberAutoBlocking->integer||attacker->client->ps.saberBlockingTime>level.time) )//NPC flying saber hit player's saber bounding box {//players have g_saberAutoBlocking, do the more generous check against flying sabers - //FIXME: instead of hitting the player's saber bounding box - //and picking an anim afterwards, have him use AI similar + //FIXME: instead of hitting the player's saber bounding box + //and picking an anim afterwards, have him use AI similar //to the AI the jedi use for picking a saber melee block...? sabersDist = 0; } @@ -1580,8 +1581,8 @@ qboolean WP_SaberDamageForTrace( int ignore, vec3_t start, vec3_t end, float dmg { collisionDist = SABER_COLLISION_DIST+6+g_spskill->integer*4; } - if ( owner && owner->client && (attacker != NULL) - && (sabersDist > collisionDist )//|| !InFront( attacker->currentOrigin, owner->currentOrigin, owner->client->ps.viewangles, 0.35f )) + if ( owner && owner->client && (attacker != NULL) + && (sabersDist > collisionDist )//|| !InFront( attacker->currentOrigin, owner->currentOrigin, owner->client->ps.viewangles, 0.35f )) && !sabersIntersect )//was qtrue, but missed too much? {//swing came from behind and/or was not stopped by a lightsaber //re-try the trace without checking for lightsabers @@ -1593,14 +1594,14 @@ qboolean WP_SaberDamageForTrace( int ignore, vec3_t start, vec3_t end, float dmg if ( tr.entityNum == ENTITYNUM_NONE || &g_entities[tr.entityNum] == NULL ) {//didn't hit the owner /* - if ( attacker - && attacker->client + if ( attacker + && attacker->client && (PM_SaberInAttack( attacker->client->ps.saberMove ) || PM_SaberInStart( attacker->client->ps.saberMove )) && DistanceSquared( tr.endpos, owner->currentOrigin ) < 10000 ) { - if ( owner->NPC - && !owner->client->ps.saberInFlight - && owner->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN + if ( owner->NPC + && !owner->client->ps.saberInFlight + && owner->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN && !Jedi_SaberBusy( owner ) ) {//owner parried, just make sure they're saber is in the right spot - only does this if they're not already doing something with saber if ( g_spskill->integer && (g_spskill->integer > 1 || Q_irand( 0, 1 ))) @@ -1631,10 +1632,10 @@ qboolean WP_SaberDamageForTrace( int ignore, vec3_t start, vec3_t end, float dmg hitEnt = &g_entities[tr.entityNum]; owner = g_entities[tr.entityNum].owner; } - else + else {//hit a lightsaber if ( (tr.fraction < saberHitFraction || tr.startsolid) - && sabersDist < (8.0f+g_spskill->value)*4.0f// 50.0f//16.0f + && sabersDist < (8.0f+g_spskill->value)*4.0f// 50.0f//16.0f && (sabersIntersect || sabersDist < (4.0f+g_spskill->value)*2.0f) )//32.0f) ) { // This saber hit closer than the last one. if ( (tr.allsolid || tr.startsolid) && owner && owner->client ) @@ -1689,16 +1690,16 @@ qboolean WP_SaberDamageForTrace( int ignore, vec3_t start, vec3_t end, float dmg saberHitEntity = tr.entityNum; } /* - if ( owner - && owner->client - && attacker - && attacker->client + if ( owner + && owner->client + && attacker + && attacker->client && (PM_SaberInAttack( attacker->client->ps.saberMove ) || PM_SaberInStart( attacker->client->ps.saberMove )) && DistanceSquared( tr.endpos, owner->currentOrigin ) < 10000 ) { - if ( owner->NPC - && !owner->client->ps.saberInFlight - && owner->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN + if ( owner->NPC + && !owner->client->ps.saberInFlight + && owner->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN && !Jedi_SaberBusy( owner ) ) {//owner parried, just make sure they're saber is in the right spot - only does this if they're not already doing something with saber if ( g_spskill->integer && (g_spskill->integer > 1 || Q_irand( 0, 1 ))) @@ -1810,7 +1811,7 @@ qboolean WP_SaberDamageForTrace( int ignore, vec3_t start, vec3_t end, float dmg if ( npc_class == CLASS_SEEKER || npc_class == CLASS_PROBE || npc_class == CLASS_MOUSE || npc_class == CLASS_GONK || npc_class == CLASS_R2D2 || npc_class == CLASS_R5D2 || npc_class == CLASS_REMOTE || npc_class == CLASS_PROTOCOL || npc_class == CLASS_MARK1 || npc_class == CLASS_MARK2 || - npc_class == CLASS_INTERROGATOR || npc_class == CLASS_ATST || npc_class == CLASS_SENTRY ) + npc_class == CLASS_INTERROGATOR || npc_class == CLASS_ATST || npc_class == CLASS_SENTRY ) { hitEffect = hit_sparks; } @@ -2029,7 +2030,7 @@ qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLo defAngles[YAW] = AngleNormalize180( attAngles[YAW] + 180); defAngles[ROLL] = 0; SetClientViewAngle( defender, defAngles ); - + //MATCH POSITIONS vec3_t newOrg; /* @@ -2456,8 +2457,8 @@ qboolean WP_SaberParry( gentity_t *victim, gentity_t *attacker ) } if ( victim->s.number || g_saberAutoBlocking->integer || victim->client->ps.saberBlockingTime > level.time ) {//either an NPC or a player who is blocking - if ( !PM_SaberInTransitionAny( victim->client->ps.saberMove ) - && !PM_SaberInBounce( victim->client->ps.saberMove ) + if ( !PM_SaberInTransitionAny( victim->client->ps.saberMove ) + && !PM_SaberInBounce( victim->client->ps.saberMove ) && !PM_SaberInKnockaway( victim->client->ps.saberMove ) ) {//I'm not attacking, in transition or in a bounce or knockaway, so play a parry WP_SaberBlockNonRandom( victim, saberHitLocation, qfalse ); @@ -2485,7 +2486,7 @@ qboolean WP_BrokenParryKnockDown( gentity_t *victim ) { return qfalse; } - if ( victim->client->ps.saberMove == LS_PARRY_UP + if ( victim->client->ps.saberMove == LS_PARRY_UP || victim->client->ps.saberMove == LS_PARRY_UR || victim->client->ps.saberMove == LS_PARRY_UL || victim->client->ps.saberMove == LS_H1_BR @@ -2643,24 +2644,24 @@ void WP_SaberDamageTrace( gentity_t *ent ) {//just do effects baseDamage = 0; } - else if ( ent->client->ps.saberBlocked > BLOCKED_NONE - || ( !PM_SaberInAttack( ent->client->ps.saberMove ) - && !PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) - && !PM_SaberInTransitionAny( ent->client->ps.saberMove ) - ) + else if ( ent->client->ps.saberBlocked > BLOCKED_NONE + || ( !PM_SaberInAttack( ent->client->ps.saberMove ) + && !PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) + && !PM_SaberInTransitionAny( ent->client->ps.saberMove ) + ) ) {//don't do damage if parrying/reflecting/bouncing/deflecting or not actually attacking or in a transition to/from/between attacks baseDamage = 0; } - else + else {//okay, in a saberMove that does damage //make sure we're in the right anim - if ( !PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) + if ( !PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) && !PM_InAnimForSaberMove( ent->client->ps.torsoAnim, ent->client->ps.saberMove ) ) {//forced into some other animation somehow, like a pain or death? baseDamage = 0; } - else if ( ent->client->ps.weaponstate == WEAPON_FIRING && ent->client->ps.saberBlocked == BLOCKED_NONE && + else if ( ent->client->ps.weaponstate == WEAPON_FIRING && ent->client->ps.saberBlocked == BLOCKED_NONE && ( PM_SaberInAttack(ent->client->ps.saberMove) || PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) || PM_SpinningSaberAnim(ent->client->ps.torsoAnim) || entPowerLevel > FORCE_LEVEL_2 ) ) {//normal attack swing swinging/spinning (or if using strong set), do normal damage //FIXME: more damage for higher attack power levels? @@ -2750,10 +2751,10 @@ void WP_SaberDamageTrace( gentity_t *ent ) if ( trace.entityNum < ENTITYNUM_WORLD && (trace.entityNum > 0||ent->client->NPC_class == CLASS_DESANN) )//NPCs don't push player away, unless it's Desann {//a valid ent gentity_t *traceEnt = &g_entities[trace.entityNum]; - if ( traceEnt - && traceEnt->client - && traceEnt->health > 0 - && traceEnt->client->playerTeam != ent->client->playerTeam + if ( traceEnt + && traceEnt->client + && traceEnt->health > 0 + && traceEnt->client->playerTeam != ent->client->playerTeam && !PM_InKnockDown( &traceEnt->client->ps ) ) {//enemy client, push them away if ( !traceEnt->client->ps.saberLockTime && !traceEnt->message ) @@ -2814,7 +2815,7 @@ void WP_SaberDamageTrace( gentity_t *ent ) int xx; //do the trace at the base first hit_wall = WP_SaberDamageForTrace( ent->s.number, baseOld, baseNew, baseDamage, md2, qfalse, entPowerLevel ); - + //if hit a saber, shorten rest of traces to match if ( saberHitFraction < 1.0 ) { @@ -2835,10 +2836,10 @@ void WP_SaberDamageTrace( gentity_t *ent ) //If the angle diff in the blade is high, need to do it in chunks of 33 to avoid flattening of the arc float dirInc, curDirFrac; - if ( PM_SaberInAttack( ent->client->ps.saberMove ) - || PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) - || PM_SpinningSaberAnim( ent->client->ps.torsoAnim ) - || PM_InSpecialJump( ent->client->ps.torsoAnim ) + if ( PM_SaberInAttack( ent->client->ps.saberMove ) + || PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) + || PM_SpinningSaberAnim( ent->client->ps.torsoAnim ) + || PM_InSpecialJump( ent->client->ps.torsoAnim ) || (g_timescale->value<1.0f&&PM_SaberInTransitionAny( ent->client->ps.saberMove )) ) { curDirFrac = DotProduct( md1, md2 ); @@ -2987,8 +2988,8 @@ void WP_SaberDamageTrace( gentity_t *ent ) //FIXME: check for certain anims, facing, etc, to make them lock into a sabers-locked pose //SEF_LOCKED - if ( ent->client->ps.saberInFlight && - ent->client->ps.saberActive && + if ( ent->client->ps.saberInFlight && + ent->client->ps.saberActive && ent->client->ps.saberEntityNum != ENTITYNUM_NONE && ent->client->ps.saberEntityState != SES_RETURNING ) {//saber was blocked, return it @@ -3005,7 +3006,7 @@ void WP_SaberDamageTrace( gentity_t *ent ) //Check deflections and broken parries if ( hitOwner && hitOwner->health > 0 && ent->health > 0 //both are alive && !inFlightSaberBlocked && hitOwner->client && !hitOwner->client->ps.saberInFlight && !ent->client->ps.saberInFlight//both have sabers in-hand - && ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN + && ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN && ent->client->ps.saberLockTime < level.time && hitOwner->client->ps.saberLockTime < level.time ) {//2 in-hand sabers hit @@ -3016,7 +3017,7 @@ void WP_SaberDamageTrace( gentity_t *ent ) qboolean hitOwnerAttacking = qfalse; qboolean entDefending = qfalse; qboolean hitOwnerDefending = qfalse; - + if ( PM_SaberInAttack( ent->client->ps.saberMove ) || PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) ) { entAttacking = qtrue; @@ -3028,7 +3029,7 @@ void WP_SaberDamageTrace( gentity_t *ent ) entAttacking = qtrue; } } - if ( PM_SaberInParry( ent->client->ps.saberMove ) + if ( PM_SaberInParry( ent->client->ps.saberMove ) || ent->client->ps.saberMove == LS_READY ) { entDefending = qtrue; @@ -3045,15 +3046,15 @@ void WP_SaberDamageTrace( gentity_t *ent ) hitOwnerAttacking = qtrue; } } - if ( PM_SaberInParry( hitOwner->client->ps.saberMove ) + if ( PM_SaberInParry( hitOwner->client->ps.saberMove ) || hitOwner->client->ps.saberMove == LS_READY ) { hitOwnerDefending = qtrue; } - if ( entAttacking - && hitOwnerAttacking - && ( entPowerLevel == hitOwnerPowerLevel + if ( entAttacking + && hitOwnerAttacking + && ( entPowerLevel == hitOwnerPowerLevel || (entPowerLevel > FORCE_LEVEL_2 && hitOwnerPowerLevel > FORCE_LEVEL_2 ) || (entPowerLevel < FORCE_LEVEL_3 && hitOwnerPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && Q_irand( 0, 2 )) || (entPowerLevel < FORCE_LEVEL_2 && hitOwnerPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && Q_irand( 0, 1 )) @@ -3063,8 +3064,8 @@ void WP_SaberDamageTrace( gentity_t *ent ) { collisionResolved = qtrue; } - else if ( hitOwnerAttacking - && entDefending + else if ( hitOwnerAttacking + && entDefending && !Q_irand( 0, 2 ) && (ent->client->ps.saberMove != LS_READY || (hitOwnerPowerLevel-ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand( -6, 0 ) ) && ((hitOwnerPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2 )|| @@ -3097,9 +3098,9 @@ void WP_SaberDamageTrace( gentity_t *ent ) ent->client->ps.saberEventFlags |= SEF_BLOCKED; } //base parry breaks on animation (saber attack level), not FP_SABER_OFFENSE - if ( entPowerLevel < FORCE_LEVEL_3 + if ( entPowerLevel < FORCE_LEVEL_3 //&& ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] < FORCE_LEVEL_3//if you have high saber offense, you cannot have your attack knocked away, regardless of what style you're using? - && hitOwner->client->ps.saberAnimLevel != FORCE_LEVEL_5 + && hitOwner->client->ps.saberAnimLevel != FORCE_LEVEL_5 && activeDefense && (hitOwnerPowerLevel > FORCE_LEVEL_2||(hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]>FORCE_LEVEL_2&&Q_irand(0,hitOwner->client->ps.saberAnimLevel))) ) {//knockaways can make fast-attacker go into a broken parry anim if the ent is using fast or med (but not Tavion) @@ -3110,7 +3111,7 @@ void WP_SaberDamageTrace( gentity_t *ent ) //make them go into a broken parry ent->client->ps.saberBounceMove = PM_BrokenParryForAttack( ent->client->ps.saberMove ); ent->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; - if ( ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] < FORCE_LEVEL_2 + if ( ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] < FORCE_LEVEL_2 && (ent->s.number||g_saberRealisticCombat->integer) )//&& !Q_irand( 0, 3 ) ) {//knocked the saber right out of his hand! (never happens to player) //Get a good velocity to send the saber in based on my parry move @@ -3130,7 +3131,7 @@ void WP_SaberDamageTrace( gentity_t *ent ) } #endif } - else if ( entPowerLevel > FORCE_LEVEL_2 + else if ( entPowerLevel > FORCE_LEVEL_2 || !activeDefense || (!deflected && Q_irand( 0, PM_PowerLevelForSaberAnim( &ent->client->ps ) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]/*PM_PowerLevelForSaberAnim( &hitOwner->client->ps )*/ ) > 0 ) ) {//broke their parry altogether @@ -3143,7 +3144,7 @@ void WP_SaberDamageTrace( gentity_t *ent ) //do some time-consuming saber-knocked-aside broken parry anim hitOwner->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; hitOwner->client->ps.saberBounceMove = LS_NONE; - if ( hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] < FORCE_LEVEL_2 + if ( hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] < FORCE_LEVEL_2 && (ent->s.number||g_saberRealisticCombat->integer) && !Q_irand( 0, 2 ) ) {//knocked the saber right out of his hand! @@ -3151,7 +3152,7 @@ void WP_SaberDamageTrace( gentity_t *ent ) vec3_t throwDir; PM_VelocityForSaberMove( &ent->client->ps, throwDir ); WP_SaberLose( hitOwner, throwDir ); - if ( (ent->client->ps.saberAnimLevel == FORCE_LEVEL_3 && !Q_irand(0,3) ) + if ( (ent->client->ps.saberAnimLevel == FORCE_LEVEL_3 && !Q_irand(0,3) ) || ( ent->client->ps.saberAnimLevel==FORCE_LEVEL_4&&!Q_irand(0,1) ) ) {// a strong attack if ( WP_BrokenParryKnockDown( hitOwner ) ) @@ -3163,7 +3164,7 @@ void WP_SaberDamageTrace( gentity_t *ent ) } else { - if ( (ent->client->ps.saberAnimLevel == FORCE_LEVEL_3 && !Q_irand(0,5) ) + if ( (ent->client->ps.saberAnimLevel == FORCE_LEVEL_3 && !Q_irand(0,5) ) || ( ent->client->ps.saberAnimLevel==FORCE_LEVEL_4&&!Q_irand(0,3) ) ) {// a strong attack if ( WP_BrokenParryKnockDown( hitOwner ) ) @@ -3198,7 +3199,7 @@ void WP_SaberDamageTrace( gentity_t *ent ) //turn the parry into a knockaway hitOwner->client->ps.saberBounceMove = PM_KnockawayForParry( hitOwner->client->ps.saberBlocked ); } - else if ( (ent->client->ps.saberAnimLevel == FORCE_LEVEL_3 && !Q_irand(0,6) ) + else if ( (ent->client->ps.saberAnimLevel == FORCE_LEVEL_3 && !Q_irand(0,6) ) || ( ent->client->ps.saberAnimLevel==FORCE_LEVEL_4 && !Q_irand(0,3) ) ) {// a strong attack can sometimes do a knockdown //HMM... maybe only if they're moving backwards? @@ -3267,7 +3268,7 @@ void WP_SaberDamageTrace( gentity_t *ent ) if ( !collisionResolved && baseDamage ) {//some other kind of in-hand saber collision //handle my reaction - if ( !ent->client->ps.saberInFlight + if ( !ent->client->ps.saberInFlight && ent->client->ps.saberLockTime < level.time ) {//my saber is in hand if ( ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN ) @@ -3313,10 +3314,10 @@ void WP_SaberDamageTrace( gentity_t *ent ) {//nothing happens to *me* when my inFlight saber hits something } //handle their reaction - if ( hitOwner - && hitOwner->health > 0 - && hitOwner->client - && !hitOwner->client->ps.saberInFlight + if ( hitOwner + && hitOwner->health > 0 + && hitOwner->client + && !hitOwner->client->ps.saberInFlight && hitOwner->client->ps.saberLockTime < level.time ) {//their saber is in hand if ( PM_SaberInAttack( hitOwner->client->ps.saberMove ) || PM_SaberInSpecialAttack( hitOwner->client->ps.torsoAnim ) || @@ -3394,9 +3395,9 @@ void WP_SaberDamageTrace( gentity_t *ent ) if ( inFlightSaberBlocked ) {//we threw a saber and it was blocked, do any effects, etc. int knockAway = 5; - if ( hitEnt - && hitOwner - && hitOwner->client + if ( hitEnt + && hitOwner + && hitOwner->client && (PM_SaberInAttack( hitOwner->client->ps.saberMove ) || PM_SaberInSpecialAttack( hitOwner->client->ps.torsoAnim ) || PM_SpinningSaberAnim( hitOwner->client->ps.torsoAnim )) ) {//if hit someone who was in an attack or spin anim, more likely to have in-flight saber knocked away if ( hitOwnerPowerLevel > FORCE_LEVEL_2 ) @@ -3410,7 +3411,7 @@ void WP_SaberDamageTrace( gentity_t *ent ) } if ( !Q_irand( 0, knockAway ) || //random ( hitOwner && hitOwner->client && - (hitOwner->client->NPC_class==CLASS_DESANN||hitOwner->client->NPC_class==CLASS_TAVION||hitOwner->client->NPC_class==CLASS_LUKE) + (hitOwner->client->NPC_class==CLASS_DESANN||hitOwner->client->NPC_class==CLASS_TAVION||hitOwner->client->NPC_class==CLASS_LUKE) ) //or if blocked by a Boss character FIXME: or base on defense level? )//FIXME: player should not auto-block a flying saber, let him override the parry with an attack to knock the saber from the air, rather than this random chance {//knock it aside and turn it off @@ -3441,8 +3442,8 @@ void WP_SaberDamageTrace( gentity_t *ent ) } } - if ( ent->client->ps.saberLockTime > level.time - && ent->s.number < ent->client->ps.saberLockEnemy + if ( ent->client->ps.saberLockTime > level.time + && ent->s.number < ent->client->ps.saberLockEnemy && !Q_irand( 0, 3 ) ) {//need to make some kind of effect vec3_t hitNorm = {0,0,1}; @@ -3471,7 +3472,7 @@ void WP_SaberDamageTrace( gentity_t *ent ) #endif G_Sound( ent, G_SoundIndex( va( "sound/weapons/saber/saberhit%d.wav", Q_irand( 1, 3 ) ) ) ); } - + if ( hit_wall ) { //just so Jedi knows that he hit a wall @@ -3497,7 +3498,7 @@ WP_SaberImpact ================ */ -void WP_SaberImpact( gentity_t *owner, gentity_t *saber, trace_t *trace ) +void WP_SaberImpact( gentity_t *owner, gentity_t *saber, trace_t *trace ) { gentity_t *other; @@ -3521,7 +3522,7 @@ void WP_SaberImpact( gentity_t *owner, gentity_t *saber, trace_t *trace ) AddSoundEvent( owner, trace->endpos, 256, AEL_DISCOVERED ); AddSightEvent( owner, trace->endpos, 512, AEL_DISCOVERED, 50 ); } - return; + return; } if ( saber->s.pos.trType == TR_LINEAR ) @@ -3541,7 +3542,7 @@ void WP_SaberImpact( gentity_t *owner, gentity_t *saber, trace_t *trace ) VectorCopy( trace->endpos, g_saberFlashPos ); } - if ( owner && owner->s.number == 0 && owner->client ) + if ( owner && owner->s.number == 0 && owner->client ) { //Add the event if ( owner->client->ps.saberLength > 0 ) @@ -3557,7 +3558,7 @@ void WP_SaberImpact( gentity_t *owner, gentity_t *saber, trace_t *trace ) } // check for bounce - if ( !other->takedamage && ( saber->s.eFlags & ( EF_BOUNCE | EF_BOUNCE_HALF ) ) ) + if ( !other->takedamage && ( saber->s.eFlags & ( EF_BOUNCE | EF_BOUNCE_HALF ) ) ) { // Check to see if there is a bounce count if ( saber->bounceCount ) { @@ -3571,7 +3572,7 @@ void WP_SaberImpact( gentity_t *owner, gentity_t *saber, trace_t *trace ) } return; } - else + else {//bounced and still have bounces left if ( saber->s.pos.trType == TR_LINEAR && owner && owner->client && owner->client->ps.saberEntityState == SES_RETURNING ) {//under telekinetic control @@ -3606,9 +3607,9 @@ void WP_SaberImpact( gentity_t *owner, gentity_t *saber, trace_t *trace ) } return; } - + G_BounceMissile( saber, trace ); - + if ( saber->s.pos.trType == TR_GRAVITY ) {//bounced //play a bounce sound @@ -3632,7 +3633,7 @@ void WP_SaberImpact( gentity_t *owner, gentity_t *saber, trace_t *trace ) saber->aimDebounceTime = level.time; } } - else if ( other->client && other->health > 0 + else if ( other->client && other->health > 0 && ( other->client->NPC_class == CLASS_DESANN || other->client->NPC_class == CLASS_TAVION || other->client->NPC_class == CLASS_LUKE || ( other->client->NPC_class == CLASS_GALAKMECH && other->client->ps.powerups[PW_GALAK_SHIELD] > 0 ) ) ) {//Luke, Desann and Tavion slap thrown sabers aside WP_SaberDrop( owner, saber ); @@ -3690,7 +3691,7 @@ void WP_SaberInFlightReflectCheck( gentity_t *self, usercmd_t *ucmd ) VectorCopy( saberent->currentOrigin, center ); - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { mins[i] = center[i] - radius; maxs[i] = center[i] + radius; @@ -3699,7 +3700,7 @@ void WP_SaberInFlightReflectCheck( gentity_t *self, usercmd_t *ucmd ) numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); //FIXME: check visibility? - for ( e = 0 ; e < numListedEntities ; e++ ) + for ( e = 0 ; e < numListedEntities ; e++ ) { ent = entityList[ e ]; @@ -3742,7 +3743,7 @@ void WP_SaberInFlightReflectCheck( gentity_t *self, usercmd_t *ucmd ) //don't deflect it if it's not within 16 units of the blade VectorMA( self->client->renderInfo.muzzlePoint, self->client->ps.saberLength, self->client->renderInfo.muzzleDir, tip ); - + if( G_PointDistFromLineSegment( self->client->renderInfo.muzzlePoint, tip, ent->currentOrigin ) > 32 ) { continue; @@ -3820,7 +3821,7 @@ qboolean WP_SaberValidateEnemy( gentity_t *self, gentity_t *enemy ) return qfalse; } - if ( (!InFront( enemy->currentOrigin, self->currentOrigin, self->client->ps.viewangles, 0.0f) || !G_ClearLOS( self, self->client->renderInfo.eyePoint, enemy ) ) + if ( (!InFront( enemy->currentOrigin, self->currentOrigin, self->client->ps.viewangles, 0.0f) || !G_ClearLOS( self, self->client->renderInfo.eyePoint, enemy ) ) && ( DistanceHorizontalSquared( enemy->currentOrigin, self->currentOrigin ) > 65536 || fabs(enemy->currentOrigin[2]-self->currentOrigin[2]) > 384 ) ) {//(not in front or not clear LOS) & greater than 256 away return qfalse; @@ -3865,7 +3866,7 @@ gentity_t *WP_SaberFindEnemy( gentity_t *self, gentity_t *saber ) VectorCopy( saber->currentOrigin, center ); - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { mins[i] = center[i] - radius; maxs[i] = center[i] + radius; @@ -3878,13 +3879,13 @@ gentity_t *WP_SaberFindEnemy( gentity_t *self, gentity_t *saber ) } numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); - + if ( !numListedEntities ) {//should we clear the enemy? return bestEnt; } - for ( e = 0 ; e < numListedEntities ; e++ ) + for ( e = 0 ; e < numListedEntities ; e++ ) { ent = entityList[ e ]; @@ -3915,7 +3916,7 @@ gentity_t *WP_SaberFindEnemy( gentity_t *self, gentity_t *saber ) return bestEnt; } -void WP_RunSaber( gentity_t *self, gentity_t *saber ) +void WP_RunSaber( gentity_t *self, gentity_t *saber ) { vec3_t origin, oldOrg; trace_t tr; @@ -3933,7 +3934,7 @@ void WP_RunSaber( gentity_t *self, gentity_t *saber ) {//don't keep hitting other sabers when turned off clipmask &= ~CONTENTS_LIGHTSABER; } - gi.trace( &tr, saber->currentOrigin, saber->mins, saber->maxs, origin, + gi.trace( &tr, saber->currentOrigin, saber->mins, saber->maxs, origin, saber->owner ? saber->owner->s.number : ENTITYNUM_NONE, clipmask, G2_NOCOLLIDE, 0 ); VectorCopy( tr.endpos, saber->currentOrigin ); @@ -3949,7 +3950,7 @@ void WP_RunSaber( gentity_t *self, gentity_t *saber ) } } - if ( tr.startsolid ) + if ( tr.startsolid ) { tr.fraction = 0; } @@ -3958,7 +3959,7 @@ void WP_RunSaber( gentity_t *self, gentity_t *saber ) //touch push triggers? - if ( tr.fraction != 1 ) + if ( tr.fraction != 1 ) { WP_SaberImpact( self, saber, &tr ); } @@ -3978,8 +3979,8 @@ void WP_RunSaber( gentity_t *self, gentity_t *saber ) fwdangles[0] -= 5; } - if ( self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_1 - || self->client->ps.saberEntityState == SES_RETURNING + if ( self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_1 + || self->client->ps.saberEntityState == SES_RETURNING || VectorCompare( saber->s.pos.trDelta, vec3_origin ) ) {//control if it's returning or just starting float saberSpeed = 500;//FIXME: based on force level? @@ -4010,7 +4011,7 @@ void WP_RunSaber( gentity_t *self, gentity_t *saber ) self->client->ps.saberEntityDist = enemyDist; } } - + //Make the saber head there VectorSubtract( saberDest, saber->currentOrigin, saber->s.pos.trDelta ); @@ -4118,7 +4119,7 @@ qboolean WP_SaberLaunch( gentity_t *self, gentity_t *saber, qboolean thrown ) saber->s.eFlags &= ~EF_NODRAW; saber->svFlags |= SVF_BROADCAST; saber->svFlags &= ~SVF_NOCLIENT; - + //place it VectorCopy( self->client->renderInfo.handRPoint, saber->currentOrigin );//muzzlePoint VectorCopy( saber->currentOrigin, saber->s.pos.trBase ); @@ -4165,7 +4166,7 @@ qboolean WP_SaberLaunch( gentity_t *self, gentity_t *saber, qboolean thrown ) { self->client->ps.forcePowerDebounce[FP_SABERTHROW] = level.time + 1000;//so we can keep it out for a minimum amount of time } - + //if it's not active, turn it on self->client->ps.saberActive = qtrue; @@ -4215,7 +4216,7 @@ qboolean WP_SaberLose( gentity_t *self, vec3_t throwDir ) //optionally give it some thrown velocity if ( throwDir && !VectorCompare( throwDir, vec3_origin ) ) { - VectorCopy( throwDir, dropped->s.pos.trDelta ); + VectorCopy( throwDir, dropped->s.pos.trDelta ); } //don't pull it back on the next frame if ( self->NPC ) @@ -4363,7 +4364,7 @@ void WP_SaberThrow( gentity_t *self, usercmd_t *ucmd ) //static float SABER_SPEED = 10; gentity_t *saberent; - + if ( self->client->ps.saberEntityNum <= 0 || self->client->ps.saberEntityNum >= ENTITYNUM_WORLD ) {//WTF?!! We lost it? return; @@ -4401,7 +4402,7 @@ void WP_SaberThrow( gentity_t *self, usercmd_t *ucmd ) return; } } - else + else {//inflight //is our saber currently on it's way back to us? if ( self->client->ps.saberEntityState == SES_RETURNING ) @@ -4467,7 +4468,7 @@ void WP_SaberThrow( gentity_t *self, usercmd_t *ucmd ) {//weapon is saber and not flying if ( self->client->ps.saberInFlight ) {//we dropped it - if ( ucmd->buttons & BUTTON_ATTACK )//|| self->client->ps.weaponstate == WEAPON_RAISING )//ucmd->buttons & BUTTON_ALT_ATTACK || + if ( ucmd->buttons & BUTTON_ATTACK )//|| self->client->ps.weaponstate == WEAPON_RAISING )//ucmd->buttons & BUTTON_ALT_ATTACK || {//we actively want to pick it up or we just switched to it, so pull it back gi.trace( &tr, saberent->currentOrigin, saberent->mins, saberent->maxs, self->client->renderInfo.handRPoint, self->s.number, MASK_SOLID, G2_NOCOLLIDE, 0 ); @@ -4497,9 +4498,9 @@ void WP_SaberThrow( gentity_t *self, usercmd_t *ucmd ) WP_SaberDrop( self, saberent ); return; } - + //TODO: if deactivate saber in flight, should it drop? - + if ( saberent->s.pos.trType != TR_LINEAR ) {//don't home return; @@ -4539,7 +4540,7 @@ void WP_SaberThrow( gentity_t *self, usercmd_t *ucmd ) WP_SaberReturn( self, saberent ); } } - else if ( level.time - self->client->ps.saberThrowTime > 3000 + else if ( level.time - self->client->ps.saberThrowTime > 3000 || (self->client->ps.forcePowerLevel[FP_SABERTHROW]==FORCE_LEVEL_1&&saberDist>=self->client->ps.saberEntityDist) ) {//been out too long, or saber throw 1 went too far, return to me if ( self->client->ps.saberActive ) @@ -4622,7 +4623,7 @@ void WP_SaberBlockNonRandom( gentity_t *self, vec3_t hitloc, qboolean missileBlo rightdot = DotProduct(right, diff); zdiff = hitloc[2] - self->client->renderInfo.eyePoint[2]; - + //FIXME: take torsoAngles into account? if ( zdiff > -5 )//0 )//40 ) { @@ -4739,7 +4740,7 @@ void WP_SaberBlock( gentity_t *saber, vec3_t hitloc, qboolean missileBlock ) { // Bad entity passed. return; } - + //temporarily disabling auto-blocking for NPCs... if ( !missileBlock && playerent->s.number != 0 && playerent->client->ps.saberBlocked != BLOCKED_NONE ) { @@ -4755,7 +4756,7 @@ void WP_SaberBlock( gentity_t *saber, vec3_t hitloc, qboolean missileBlock ) rightdot = DotProduct(right, diff) + Q_flrand(-0.2f,0.2f); zdiff = hitloc[2] - playerent->currentOrigin[2] + Q_irand(-8,8); - + // Figure out what quadrant the block was in. if (zdiff > 24) { // Attack from above @@ -4875,7 +4876,7 @@ void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ) if ( !self->s.number ) {//don't do this if already attacking! - if ( ucmd->buttons & BUTTON_ATTACK + if ( ucmd->buttons & BUTTON_ATTACK || PM_SaberInAttack( self->client->ps.saberMove ) || PM_SaberInSpecialAttack( self->client->ps.torsoAnim ) || PM_SaberInTransitionAny( self->client->ps.saberMove )) @@ -4897,7 +4898,7 @@ void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ) fwdangles[1] = self->client->ps.viewangles[1]; AngleVectors( fwdangles, forward, NULL, NULL ); - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { mins[i] = self->currentOrigin[i] - radius; maxs[i] = self->currentOrigin[i] + radius; @@ -4907,7 +4908,7 @@ void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ) closestDist = radius; - for ( e = 0 ; e < numListedEntities ; e++ ) + for ( e = 0 ; e < numListedEntities ; e++ ) { ent = entityList[ e ]; @@ -4967,10 +4968,10 @@ void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ) {//thermal detonator! if ( self->NPC && dist < ent->splashRadius ) { - if ( dist < ent->splashRadius && - ent->nextthink < level.time + 600 && - ent->count && - self->client->ps.groundEntityNum != ENTITYNUM_NONE && + if ( dist < ent->splashRadius && + ent->nextthink < level.time + 600 && + ent->count && + self->client->ps.groundEntityNum != ENTITYNUM_NONE && (ent->s.pos.trType == TR_STATIONARY|| ent->s.pos.trType == TR_INTERPOLATE|| (dot1 = DotProduct( dir, forward )) < SABER_REFLECT_MISSILE_CONE|| @@ -4988,14 +4989,14 @@ void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ) } else if ( ent->splashDamage && ent->splashRadius ) {//exploding missile - //FIXME: handle tripmines and detpacks somehow... - // maybe do a force-gesture that makes them explode? + //FIXME: handle tripmines and detpacks somehow... + // maybe do a force-gesture that makes them explode? // But what if we're within it's splashradius? if ( !self->s.number ) {//players don't auto-handle these at all continue; } - else + else { if ( ent->s.pos.trType == TR_STATIONARY && (ent->s.eFlags&EF_MISSILE_STICK) ) {//a placed explosive like a tripmine or detpack @@ -5028,8 +5029,8 @@ void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ) } } } - else if ( dist < ent->splashRadius && - self->client->ps.groundEntityNum != ENTITYNUM_NONE && + else if ( dist < ent->splashRadius && + self->client->ps.groundEntityNum != ENTITYNUM_NONE && (DotProduct( dir, forward ) < SABER_REFLECT_MISSILE_CONE|| !WP_ForcePowerUsable( self, FP_PUSH, 0 )) ) {//NPCs try to evade it @@ -5146,7 +5147,7 @@ void WP_SaberUpdate( gentity_t *self, usercmd_t *ucmd ) { return; } - + if ( self->client->ps.saberEntityNum < 0 || self->client->ps.saberEntityNum >= ENTITYNUM_WORLD ) {//never got one return; @@ -5160,7 +5161,7 @@ void WP_SaberUpdate( gentity_t *self, usercmd_t *ucmd ) //vec3_t sabermins={-8,-8,-8}, sabermaxs={8,8,8}; gentity_t *saberent; - + if (self->client->ps.saberEntityNum <= 0) {//WTF?!! We lost it? return; @@ -5195,7 +5196,7 @@ void WP_SaberUpdate( gentity_t *self, usercmd_t *ucmd ) AngleVectors( saberang, fwd, NULL, NULL ); VectorMA( self->currentOrigin, 12, fwd, saberOrg ); - + VectorAdd( self->mins, sabermins, saberent->mins ); VectorAdd( self->maxs, sabermaxs, saberent->maxs ); @@ -5245,7 +5246,7 @@ void WP_SaberUpdate( gentity_t *self, usercmd_t *ucmd ) AngleVectors( saberang, fwd, NULL, NULL ); VectorMA(self->currentOrigin, 12, fwd, saberloc); - + VectorAdd(self->mins, sabermins, saberent->mins); VectorAdd(self->maxs, sabermaxs, saberent->maxs); @@ -5381,13 +5382,13 @@ void WP_KnockdownTurret( gentity_t *self, gentity_t *pas ) VectorCopy( pas->currentOrigin, pas->s.pos.trBase ); pas->s.pos.trType = TR_LINEAR_STOP; pas->s.pos.trDuration = 250; - pas->s.pos.trTime = level.time; + pas->s.pos.trTime = level.time; pas->s.pos.trDelta[2] = ( 12.0f / ( pas->s.pos.trDuration * 0.001f ) ); VectorCopy( pas->currentAngles, pas->s.apos.trBase ); pas->s.apos.trType = TR_LINEAR_STOP; - pas->s.apos.trDuration = 250; - pas->s.apos.trTime = level.time; + pas->s.apos.trDuration = 250; + pas->s.apos.trTime = level.time; //FIXME: pick pitch/roll that always tilts it directly away from pusher pas->s.apos.trDelta[PITCH] = ( 100.0f / ( pas->s.apos.trDuration * 0.001f ) ); @@ -5404,7 +5405,7 @@ void WP_ResistForcePush( gentity_t *self, gentity_t *pusher, qboolean noPenalty int parts; qboolean runningResist = qfalse; - if ( !self || self->health <= 0 || !self->client || !pusher || !pusher->client ) + if ( !self || self->health <= 0 || !self->client || !pusher || !pusher->client ) { return; } @@ -5414,11 +5415,11 @@ void WP_ResistForcePush( gentity_t *self, gentity_t *pusher, qboolean noPenalty runningResist = qtrue; } if ( !runningResist - && self->client->ps.groundEntityNum != ENTITYNUM_NONE - && !PM_SpinningSaberAnim( self->client->ps.legsAnim ) - && !PM_FlippingAnim( self->client->ps.legsAnim ) - && !PM_RollingAnim( self->client->ps.legsAnim ) - && !PM_InKnockDown( &self->client->ps ) + && self->client->ps.groundEntityNum != ENTITYNUM_NONE + && !PM_SpinningSaberAnim( self->client->ps.legsAnim ) + && !PM_FlippingAnim( self->client->ps.legsAnim ) + && !PM_RollingAnim( self->client->ps.legsAnim ) + && !PM_InKnockDown( &self->client->ps ) && !PM_CrouchAnim( self->client->ps.legsAnim )) {//if on a surface and not in a spin or flip, play full body resist parts = SETANIM_BOTH; @@ -5494,9 +5495,9 @@ void WP_ForceKnockdown( gentity_t *self, gentity_t *pusher, qboolean pull, qbool } G_CheckLedgeDive( self, 72, pushDir, qfalse, qfalse ); - if ( !PM_SpinningSaberAnim( self->client->ps.legsAnim ) - && !PM_FlippingAnim( self->client->ps.legsAnim ) - && !PM_RollingAnim( self->client->ps.legsAnim ) + if ( !PM_SpinningSaberAnim( self->client->ps.legsAnim ) + && !PM_FlippingAnim( self->client->ps.legsAnim ) + && !PM_RollingAnim( self->client->ps.legsAnim ) && !PM_InKnockDown( &self->client->ps ) ) { int knockAnim = BOTH_KNOCKDOWN1;//default knockdown @@ -5504,8 +5505,8 @@ void WP_ForceKnockdown( gentity_t *self, gentity_t *pusher, qboolean pull, qbool {//desann always knocks down, unless you're Luke strongKnockdown = qtrue; } - if ( !self->s.number - && !strongKnockdown + if ( !self->s.number + && !strongKnockdown && ( (!pull&&(self->client->ps.forcePowerLevel[FP_PUSH]>FORCE_LEVEL_1||!g_spskill->integer)) || (pull&&(self->client->ps.forcePowerLevel[FP_PULL]>FORCE_LEVEL_1||!g_spskill->integer)) ) ) {//player only knocked down if pushed *hard* if ( self->s.weapon == WP_SABER ) @@ -5618,7 +5619,7 @@ void ForceThrow( gentity_t *self, qboolean pull ) self->client->ps.saberLockEnemy = ENTITYNUM_NONE; } - if ( self->client->ps.legsAnim == BOTH_KNOCKDOWN3 + if ( self->client->ps.legsAnim == BOTH_KNOCKDOWN3 || (self->client->ps.torsoAnim == BOTH_FORCE_GETUP_F1 && self->client->ps.torsoAnimTimer > 400) || (self->client->ps.torsoAnim == BOTH_FORCE_GETUP_F2 && self->client->ps.torsoAnimTimer > 900) || (self->client->ps.torsoAnim == BOTH_GETUP3 && self->client->ps.torsoAnimTimer > 500) @@ -5676,7 +5677,7 @@ void ForceThrow( gentity_t *self, qboolean pull ) hold += 1000; parts = SETANIM_BOTH; } - else if ( !VectorLengthSquared( self->client->ps.velocity ) && !(self->client->ps.pm_flags&PMF_DUCKED)) + else if ( !VectorLengthSquared( self->client->ps.velocity ) && !(self->client->ps.pm_flags&PMF_DUCKED)) { parts = SETANIM_BOTH; } @@ -5699,7 +5700,7 @@ void ForceThrow( gentity_t *self, qboolean pull ) AngleVectors( fwdangles, forward, right, NULL ); VectorCopy( self->currentOrigin, center ); - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { mins[i] = center[i] - radius; maxs[i] = center[i] + radius; @@ -5730,7 +5731,7 @@ void ForceThrow( gentity_t *self, qboolean pull ) forwardEnt = &g_entities[tr.entityNum]; } - for ( e = 0 ; e < numListedEntities ; e++ ) + for ( e = 0 ; e < numListedEntities ; e++ ) { ent = entityList[ e ]; @@ -5780,7 +5781,7 @@ void ForceThrow( gentity_t *self, qboolean pull ) if ( !ent->client ) { if ( Q_stricmp( "lightsaber", ent->classname ) != 0 ) - {//not a lightsaber + {//not a lightsaber if ( !(ent->svFlags&SVF_GLASS_BRUSH) ) {//and not glass if ( Q_stricmp( "func_door", ent->classname ) != 0 || !(ent->spawnflags & 2/*MOVER_FORCE_ACTIVATE*/) ) @@ -5831,9 +5832,9 @@ void ForceThrow( gentity_t *self, qboolean pull ) continue; } } - else if ( ent->s.eType == ET_ITEM - && ent->item - && ent->item->giType == IT_HOLDABLE + else if ( ent->s.eType == ET_ITEM + && ent->item + && ent->item->giType == IT_HOLDABLE && ent->item->giTag == INV_SECURITY_KEY ) //&& (ent->flags&FL_DROPPED_ITEM) ??? {//dropped security keys can't be pushed? But placed ones can...? does this make any sense? @@ -5841,7 +5842,7 @@ void ForceThrow( gentity_t *self, qboolean pull ) {//can't push, NPC's can't do anything to it continue; } - else + else { if ( g_crosshairEntNum != ent->s.number ) {//player can pull it if looking *right* at it @@ -5879,15 +5880,15 @@ void ForceThrow( gentity_t *self, qboolean pull ) //this is all to see if we need to start a saber attack, if it's in flight, this doesn't matter // find the distance from the edge of the bounding box - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { - if ( center[i] < ent->absmin[i] ) + if ( center[i] < ent->absmin[i] ) { v[i] = ent->absmin[i] - center[i]; - } else if ( center[i] > ent->absmax[i] ) + } else if ( center[i] > ent->absmax[i] ) { v[i] = center[i] - ent->absmax[i]; - } else + } else { v[i] = 0; } @@ -5933,16 +5934,16 @@ void ForceThrow( gentity_t *self, qboolean pull ) //if within a certain range, deflect it if ( ent->s.eType == ET_MISSILE && cone >= 1.0f ) {//smaller radius on missile checks at force push 1 - if ( dist >= 192 ) + if ( dist >= 192 ) { continue; } } - else if ( dist >= radius ) + else if ( dist >= radius ) { continue; } - + //in PVS? if ( !ent->bmodel && !gi.inPVS( ent_org, self->client->renderInfo.eyePoint ) ) {//must be in PVS @@ -6008,7 +6009,7 @@ void ForceThrow( gentity_t *self, qboolean pull ) continue; } - + //okay, everyone else (or player who couldn't resist it)... if ( ((self->s.number == 0 && Q_irand( 0, 2 ) ) || Q_irand( 0, 2 ) ) && push_list[x]->client && push_list[x]->health > 0 //a living client && push_list[x]->client->ps.weapon == WP_SABER //Jedi @@ -6056,7 +6057,7 @@ void ForceThrow( gentity_t *self, qboolean pull ) WP_ResistForcePush( push_list[x], self, qfalse ); } } - else + else { //UGH: FIXME: for enemy jedi, they should probably always do force pull 3, and not your weapon (if player?)! //shove them @@ -6069,10 +6070,10 @@ void ForceThrow( gentity_t *self, qboolean pull ) if ( pull ) { VectorSubtract( self->currentOrigin, push_list[x]->currentOrigin, pushDir ); - if ( self->client->ps.forcePowerLevel[FP_PULL] > FORCE_LEVEL_1 - && push_list[x]->s.weapon != WP_SABER - && push_list[x]->s.weapon != WP_MELEE - && push_list[x]->s.weapon != WP_THERMAL ) + if ( self->client->ps.forcePowerLevel[FP_PULL] > FORCE_LEVEL_1 + && push_list[x]->s.weapon != WP_SABER + && push_list[x]->s.weapon != WP_MELEE + && push_list[x]->s.weapon != WP_THERMAL ) {//yank the weapon - NOTE: level 1 just knocks them down, not take weapon //FIXME: weapon yank anim if not a knockdown? if ( InFront( self->currentOrigin, push_list[x]->currentOrigin, push_list[x]->client->ps.viewangles, 0.0f ) ) @@ -6167,8 +6168,8 @@ void ForceThrow( gentity_t *self, qboolean pull ) //different effect? } } - else if ( push_list[x]->s.eType == ET_MISSILE - && push_list[x]->s.pos.trType != TR_STATIONARY + else if ( push_list[x]->s.eType == ET_MISSILE + && push_list[x]->s.pos.trType != TR_STATIONARY && (push_list[x]->s.pos.trType != TR_INTERPOLATE||push_list[x]->s.weapon != WP_THERMAL) )//rolling and stationary thermal detonators are dealt with below { vec3_t dir2Me; @@ -6177,7 +6178,7 @@ void ForceThrow( gentity_t *self, qboolean pull ) if ( pull ) {//deflect rather than reflect? } - else + else { if ( push_list[x]->s.eFlags&EF_MISSILE_STICK ) {//caught a sticky in-air @@ -6328,8 +6329,8 @@ void ForceThrow( gentity_t *self, qboolean pull ) } GEntity_UseFunc( push_list[x], self, self ); } - else if ( push_list[x]->s.eType == ET_MISSILE/*thermal resting on ground*/ - || push_list[x]->s.eType == ET_ITEM + else if ( push_list[x]->s.eType == ET_MISSILE/*thermal resting on ground*/ + || push_list[x]->s.eType == ET_ITEM || push_list[x]->e_ThinkFunc == thinkF_G_RunObject || Q_stricmp( "limb", push_list[x]->classname ) == 0 ) {//general object, toss it vec3_t pushDir, kvel; @@ -6353,9 +6354,9 @@ void ForceThrow( gentity_t *self, qboolean pull ) { knockback = 200; } - if ( push_list[x]->s.eType == ET_ITEM - && push_list[x]->item - && push_list[x]->item->giType == IT_HOLDABLE + if ( push_list[x]->s.eType == ET_ITEM + && push_list[x]->item + && push_list[x]->item->giType == IT_HOLDABLE && push_list[x]->item->giTag == INV_SECURITY_KEY ) {//security keys are pulled with less enthusiasm if ( knockback > 100 ) @@ -6437,8 +6438,8 @@ void ForceThrow( gentity_t *self, qboolean pull ) AddSightEvent( player, push_list[x]->currentOrigin, 128, AEL_SUSPICIOUS );//hmm... or should this always be discovered? } } - else if ( push_list[x]->s.weapon == WP_TURRET - && !Q_stricmp( "PAS", push_list[x]->classname ) + else if ( push_list[x]->s.weapon == WP_TURRET + && !Q_stricmp( "PAS", push_list[x]->classname ) && push_list[x]->s.apos.trType == TR_STATIONARY ) {//a portable turret WP_KnockdownTurret( self, push_list[x] ); @@ -6624,7 +6625,7 @@ void ForceHeal( gentity_t *self ) */ } } - + //FIXME: always play healing effect G_SoundOnEnt( self, CHAN_ITEM, "sound/weapons/force/heal.mp3" ); } @@ -6709,16 +6710,16 @@ void ForceTelepathy( gentity_t *self ) AngleVectors( self->client->ps.viewangles, forward, NULL, NULL ); VectorNormalize( forward ); VectorMA( self->client->renderInfo.eyePoint, 2048, forward, end ); - + //Cause a distraction if enemy is not fighting gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_OPAQUE|CONTENTS_BODY, G2_NOCOLLIDE, 0 ); if ( tr.entityNum == ENTITYNUM_NONE || tr.fraction == 1.0 || tr.allsolid || tr.startsolid ) { return; } - + traceEnt = &g_entities[tr.entityNum]; - + if( traceEnt->NPC && traceEnt->NPC->scriptFlags & SCF_NO_FORCE ) { return; @@ -6834,7 +6835,7 @@ void ForceTelepathy( gentity_t *self ) NPC_SetAnim( self, SETANIM_TORSO, BOTH_MINDTRICK1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD ); //FIXME: build-up or delay this until in proper part of anim } - else + else { if ( self->client->ps.forcePowerLevel[FP_TELEPATHY] > FORCE_LEVEL_1 && tr.fraction * 2048 > 64 ) {//don't create a diversion less than 64 from you of if at power level 1 @@ -6865,7 +6866,7 @@ void ForceGrip( gentity_t *self ) if ( self->health <= 0 ) { return; - } + } if ( !self->s.number && (cg.zoomMode || in_camera) ) {//can't force grip when zoomed in or in cinematic return; @@ -6922,8 +6923,8 @@ void ForceGrip( gentity_t *self ) AngleVectors( self->client->ps.viewangles, forward, NULL, NULL ); VectorNormalize( forward ); VectorMA( self->client->renderInfo.handLPoint, FORCE_GRIP_DIST, forward, end ); - - if ( self->enemy && (self->s.number || InFront( self->enemy->currentOrigin, self->client->renderInfo.eyePoint, self->client->ps.viewangles, 0.2f ) ) ) + + if ( self->enemy && (self->s.number || InFront( self->enemy->currentOrigin, self->client->renderInfo.eyePoint, self->client->ps.viewangles, 0.2f ) ) ) {//NPCs can always lift enemy since we assume they're looking at them, players need to be facing the enemy if ( gi.inPVS( self->enemy->currentOrigin, self->client->renderInfo.eyePoint ) ) {//must be in PVS @@ -6944,7 +6945,7 @@ void ForceGrip( gentity_t *self ) traceEnt = &g_entities[tr.entityNum]; } - + if ( !traceEnt || traceEnt == self/*???*/ || traceEnt->bmodel || (traceEnt->health <= 0 && traceEnt->takedamage) || (traceEnt->NPC && traceEnt->NPC->scriptFlags & SCF_NO_FORCE) ) { return; @@ -7122,7 +7123,7 @@ void ForceLightning( gentity_t *self ) {//holding it self->s.loopSound = G_SoundIndex( "sound/weapons/force/lightning2.wav" ); } - + //FIXME: build-up or delay this until in proper part of anim self->client->ps.weaponTime = self->client->ps.torsoAnimTimer; WP_ForcePowerStart( self, FP_LIGHTNING, self->client->ps.torsoAnimTimer ); @@ -7253,14 +7254,14 @@ void ForceShootLightning( gentity_t *self ) int e, numListedEntities, i; VectorCopy( self->currentOrigin, center ); - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { mins[i] = center[i] - radius; maxs[i] = center[i] + radius; } numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); - for ( e = 0 ; e < numListedEntities ; e++ ) + for ( e = 0 ; e < numListedEntities ; e++ ) { traceEnt = entityList[e]; @@ -7278,15 +7279,15 @@ void ForceShootLightning( gentity_t *self ) continue; //this is all to see if we need to start a saber attack, if it's in flight, this doesn't matter // find the distance from the edge of the bounding box - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { - if ( center[i] < traceEnt->absmin[i] ) + if ( center[i] < traceEnt->absmin[i] ) { v[i] = traceEnt->absmin[i] - center[i]; - } else if ( center[i] > traceEnt->absmax[i] ) + } else if ( center[i] > traceEnt->absmax[i] ) { v[i] = center[i] - traceEnt->absmax[i]; - } else + } else { v[i] = 0; } @@ -7304,11 +7305,11 @@ void ForceShootLightning( gentity_t *self ) //must be close enough dist = VectorLength( v ); - if ( dist >= radius ) + if ( dist >= radius ) { continue; } - + //in PVS? if ( !traceEnt->bmodel && !gi.inPVS( ent_org, self->client->renderInfo.handLPoint ) ) {//must be in PVS @@ -7337,7 +7338,7 @@ void ForceShootLightning( gentity_t *self ) VectorCopy( self->client->renderInfo.handLPoint, start ); VectorMA( self->client->renderInfo.handLPoint, 2048, forward, end ); - + while ( traces < 10 ) {//need to loop this in case we hit a Jedi who dodges the shot gi.trace( &tr, start, vec3_origin, vec3_origin, end, ignore, MASK_SHOT, G2_RETURNONHIT, 0 ); @@ -7348,7 +7349,7 @@ void ForceShootLightning( gentity_t *self ) traceEnt = &g_entities[tr.entityNum]; //NOTE: only NPCs do this auto-dodge - if ( traceEnt && traceEnt->s.number && traceEnt->s.weapon == WP_SABER )//&& traceEnt->NPC + if ( traceEnt && traceEnt->s.number && traceEnt->s.weapon == WP_SABER )//&& traceEnt->NPC {//FIXME: need a more reliable way to know we hit a jedi? if ( !Jedi_DodgeEvasion( traceEnt, self, &tr, HL_NONE ) ) {//act like we didn't even hit him @@ -7361,7 +7362,7 @@ void ForceShootLightning( gentity_t *self ) //a Jedi is not dodging this shot break; } - + traceEnt = &g_entities[tr.entityNum]; ForceLightningDamage( self, traceEnt, forward, 0, 0, tr.endpos ); } @@ -7674,7 +7675,7 @@ void WP_ForcePowerStart( gentity_t *self, forcePowers_t forcePower, int override self->client->ps.forcePowerDuration[forcePower] = 0; } self->client->ps.forcePowerDebounce[forcePower] = 0; - + WP_ForcePowerDrain( self, forcePower, overrideAmt ); if ( !self->s.number ) @@ -7705,12 +7706,12 @@ qboolean WP_ForcePowerAvailable( gentity_t *self, forcePowers_t forcePower, int extern void CG_PlayerLockedWeaponSpeech( int jumping ); qboolean WP_ForcePowerUsable( gentity_t *self, forcePowers_t forcePower, int overrideAmt ) { - + if ( !(self->client->ps.forcePowersKnown & ( 1 << forcePower )) ) {//don't know this power return qfalse; } - + if ( self->client->ps.forcePowerLevel[forcePower] <= 0 ) {//can't use this power return qfalse; @@ -7909,7 +7910,7 @@ void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ) } break; case FP_LIGHTNING: - if ( self->client->ps.torsoAnim == BOTH_FORCELIGHTNING_HOLD + if ( self->client->ps.torsoAnim == BOTH_FORCELIGHTNING_HOLD || self->client->ps.torsoAnim == BOTH_FORCELIGHTNING_START ) { NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCELIGHTNING_RELEASE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); @@ -8041,7 +8042,7 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd case FP_TELEPATHY: break; case FP_GRIP: - if ( !WP_ForcePowerAvailable( self, FP_GRIP, 0 ) + if ( !WP_ForcePowerAvailable( self, FP_GRIP, 0 ) || (self->client->ps.forcePowerLevel[FP_GRIP]>FORCE_LEVEL_1&&!self->s.number&&!(cmd->buttons&BUTTON_FORCEGRIP)) ) { WP_ForcePowerStop( self, FP_GRIP ); @@ -8056,7 +8057,7 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd WP_ForcePowerStop( self, FP_GRIP ); return; } - else if ( self->client->ps.forcePowerLevel[FP_GRIP] == FORCE_LEVEL_1 + else if ( self->client->ps.forcePowerLevel[FP_GRIP] == FORCE_LEVEL_1 && gripEnt->client && gripEnt->client->ps.groundEntityNum == ENTITYNUM_NONE ) { @@ -8190,7 +8191,7 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd gripEnt->s.eFlags |= EF_FORCE_GRIPPED; } - + //Shouldn't this be discovered? //AddSightEvent( self, gripOrg, 128, AEL_DANGER, 20 ); AddSightEvent( self, gripOrg, 128, AEL_DISCOVERED, 20 ); @@ -8324,10 +8325,10 @@ void WP_ForcePowersUpdate( gentity_t *self, usercmd_t *ucmd ) ForceJumpCharge( self, ucmd ); } else */ - if ( self->client->ps.forceJumpCharge ) + if ( self->client->ps.forceJumpCharge ) {//let go of charge button, have charge //if leave the ground by some other means, cancel the force jump so we don't suddenly jump when we land. - if ( self->client->ps.groundEntityNum == ENTITYNUM_NONE + if ( self->client->ps.groundEntityNum == ENTITYNUM_NONE && !PM_SwimmingAnim( self->client->ps.legsAnim ) ) {//FIXME: stop sound? //self->client->ps.forceJumpCharge = 0; diff --git a/codeJK2/game/wp_saber.h b/codeJK2/game/wp_saber.h index c95482df97..3a01640a28 100644 --- a/codeJK2/game/wp_saber.h +++ b/codeJK2/game/wp_saber.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #ifndef __WP_SABER_H #define __WP_SABER_H diff --git a/codeJK2/game/wp_stun_baton.cpp b/codeJK2/game/wp_stun_baton.cpp index 325fc98d1f..c8ee189623 100644 --- a/codeJK2/game/wp_stun_baton.cpp +++ b/codeJK2/game/wp_stun_baton.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_headers.h" diff --git a/codeJK2/game/wp_thermal.cpp b/codeJK2/game/wp_thermal.cpp index 56530e47e9..656f33f6fb 100644 --- a/codeJK2/game/wp_thermal.cpp +++ b/codeJK2/game/wp_thermal.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_headers.h" @@ -64,20 +68,20 @@ void thermal_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, in } //--------------------------------------------------------- -qboolean WP_LobFire( gentity_t *self, vec3_t start, vec3_t target, vec3_t mins, vec3_t maxs, int clipmask, +qboolean WP_LobFire( gentity_t *self, vec3_t start, vec3_t target, vec3_t mins, vec3_t maxs, int clipmask, vec3_t velocity, qboolean tracePath, int ignoreEntNum, int enemyNum, float minSpeed, float maxSpeed, float idealSpeed, qboolean mustHit ) //--------------------------------------------------------- { - float targetDist, shotSpeed, speedInc = 100, travelTime, impactDist, bestImpactDist = Q3_INFINITE;//fireSpeed, - vec3_t targetDir, shotVel, failCase; + float targetDist, shotSpeed, speedInc = 100, travelTime, impactDist, bestImpactDist = Q3_INFINITE;//fireSpeed, + vec3_t targetDir, shotVel, failCase = { 0.0f }; trace_t trace; trajectory_t tr; qboolean blocked; int elapsedTime, skipNum, timeStep = 500, hitCount = 0, maxHits = 7; vec3_t lastPos, testPos; gentity_t *traceEnt; - + if ( !idealSpeed ) { idealSpeed = 300; @@ -105,7 +109,7 @@ qboolean WP_LobFire( gentity_t *self, vec3_t start, vec3_t target, vec3_t mins, travelTime = targetDist/shotSpeed; shotVel[2] += travelTime * 0.5 * g_gravity->value; - if ( !hitCount ) + if ( !hitCount ) {//save the first (ideal) one as the failCase (fallback value) if ( !mustHit ) {//default is fine as a return value @@ -123,7 +127,7 @@ qboolean WP_LobFire( gentity_t *self, vec3_t start, vec3_t target, vec3_t mins, tr.trTime = level.time; travelTime *= 1000.0f; VectorCopy( start, lastPos ); - + //This may be kind of wasteful, especially on long throws... use larger steps? Divide the travelTime into a certain hard number of slices? Trace just to apex and down? for ( elapsedTime = timeStep; elapsedTime < floor(travelTime)+timeStep; elapsedTime += timeStep ) { @@ -273,7 +277,7 @@ gentity_t *WP_FireThermalDetonator( gentity_t *ent, qboolean alt_fire ) VectorCopy( wpMuzzle, start ); bolt = G_Spawn(); - + bolt->classname = "thermal_detonator"; if ( ent->s.number != 0 ) @@ -310,7 +314,7 @@ gentity_t *WP_FireThermalDetonator( gentity_t *ent, qboolean alt_fire ) WP_TraceSetStart( ent, start, bolt->mins, bolt->maxs );//make sure our start point isn't on the other side of a wall float chargeAmount = 1.0f; // default of full charge - + if ( ent->client ) { chargeAmount = level.time - ent->client->ps.weaponChargeTime; @@ -340,7 +344,7 @@ gentity_t *WP_FireThermalDetonator( gentity_t *ent, qboolean alt_fire ) if ( ent->NPC && ent->enemy ) {//FIXME: we're assuming he's actually facing this direction... vec3_t target; - + VectorCopy( ent->enemy->currentOrigin, target ); if ( target[2] <= start[2] ) { @@ -391,7 +395,7 @@ gentity_t *WP_FireThermalDetonator( gentity_t *ent, qboolean alt_fire ) bolt->s.pos.trTime = level.time; // move a bit on the very first frame VectorCopy( start, bolt->s.pos.trBase ); - + SnapVector( bolt->s.pos.trDelta ); // save net bandwidth VectorCopy (start, bolt->currentOrigin); diff --git a/codeJK2/game/wp_trip_mine.cpp b/codeJK2/game/wp_trip_mine.cpp index 0f4a3079da..1b50019d98 100644 --- a/codeJK2/game/wp_trip_mine.cpp +++ b/codeJK2/game/wp_trip_mine.cpp @@ -1,20 +1,24 @@ /* -This file is part of OpenJK. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - OpenJK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - OpenJK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with OpenJK. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2013 OpenJK #include "g_headers.h" @@ -149,7 +153,7 @@ void laserTrapThink( gentity_t *ent ) // Find the main impact point VectorMA( ent->s.pos.trBase, 2048, ent->movedir, end ); gi.trace( &tr, ent->s.origin2, mins, maxs, end, ent->s.number, MASK_SHOT, G2_RETURNONHIT, 0 ); - + traceEnt = &g_entities[ tr.entityNum ]; // Adjust this so that the effect has a relatively fresh endpoint @@ -202,14 +206,14 @@ void CreateLaserTrap( gentity_t *laserTrap, vec3_t start, gentity_t *owner ) VectorCopy( start, laserTrap->currentOrigin); VectorCopy( start, laserTrap->pos2 ); // ?? wtf ? - + laserTrap->fxID = G_EffectIndex( "tripMine/explosion" ); laserTrap->e_TouchFunc = touchF_touchLaserTrap; laserTrap->s.radius = 60; VectorSet( laserTrap->s.modelScale, 1.0f, 1.0f, 1.0f ); - gi.G2API_InitGhoul2Model( laserTrap->ghoul2, weaponData[WP_TRIP_MINE].missileMdl, G_ModelIndex( weaponData[WP_TRIP_MINE].missileMdl ), NULL, NULL, 0, 0); + gi.G2API_InitGhoul2Model( laserTrap->ghoul2, weaponData[WP_TRIP_MINE].missileMdl, G_ModelIndex( weaponData[WP_TRIP_MINE].missileMdl ), NULL_HANDLE, NULL_HANDLE, 0, 0); } //--------------------------------------------------------- diff --git a/codeJK2/icarus/BlockStream.cpp b/codeJK2/icarus/BlockStream.cpp index 47c3f7d27c..bcaa8c5477 100644 --- a/codeJK2/icarus/BlockStream.cpp +++ b/codeJK2/icarus/BlockStream.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Interpreted Block Stream Functions // @@ -23,11 +27,6 @@ This file is part of Jedi Knight 2. // this include must remain at the top of every Icarus CPP file #include "icarus.h" -#ifdef _MSC_VER - #pragma warning(disable : 4100) //unref formal parm - #pragma warning(disable : 4710) //member not inlined -#endif - #include #include "blockstream.h" #include "g_local.h" diff --git a/codeJK2/icarus/Instance.cpp b/codeJK2/icarus/Instance.cpp index 90a0cd3690..568f7d6394 100644 --- a/codeJK2/icarus/Instance.cpp +++ b/codeJK2/icarus/Instance.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // ICARUS Instance // diff --git a/codeJK2/icarus/Sequence.cpp b/codeJK2/icarus/Sequence.cpp index 658571f3a4..d39f91f09b 100644 --- a/codeJK2/icarus/Sequence.cpp +++ b/codeJK2/icarus/Sequence.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Script Command Sequences // diff --git a/codeJK2/icarus/Sequencer.cpp b/codeJK2/icarus/Sequencer.cpp index 56c8cdca5c..3fcfa75d38 100644 --- a/codeJK2/icarus/Sequencer.cpp +++ b/codeJK2/icarus/Sequencer.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Script Command Sequencer // @@ -186,7 +190,7 @@ Deletes parsing stream */ void CSequencer::DeleteStream( bstream_t *bstream ) { - vector::iterator finder = find(m_streamsCreated.begin(), m_streamsCreated.end(), bstream); + vector::iterator finder = std::find(m_streamsCreated.begin(), m_streamsCreated.end(), bstream); if(finder != m_streamsCreated.end()) { m_streamsCreated.erase(finder); @@ -2259,13 +2263,7 @@ int CSequencer::DestroySequence( CSequence *sequence ) { if((*tsi).second == sequence) { -#ifdef _WIN32 - tsi = m_taskSequences.erase(tsi); -#else - taskSequence_m::iterator itTemp = tsi; - tsi++; - m_taskSequences.erase(itTemp); -#endif + m_taskSequences.erase(tsi++); } else { diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index fff8a926aa..f0cecc1d6d 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Task Manager // diff --git a/codeJK2/icarus/blockstream.h b/codeJK2/icarus/blockstream.h index 06fb45191a..ac376bea75 100644 --- a/codeJK2/icarus/blockstream.h +++ b/codeJK2/icarus/blockstream.h @@ -1,44 +1,35 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // BlockStream.h #ifndef __INTERPRETED_BLOCK_STREAM__ #define __INTERPRETED_BLOCK_STREAM__ -#ifdef _MSC_VER - #pragma warning(disable : 4786) //identifier was truncated - #pragma warning(disable : 4514) //unreffed inline func removed -#endif - #include #include - -#ifdef _MSC_VER - #pragma warning (push, 3) //go back down to 3 for the stl include -#endif +#include #include #include -#ifdef _MSC_VER - #pragma warning (pop) -#endif - -using namespace std; #define IBI_HEADER_ID_LENGTH 4 // Length of IBI_HEADER_ID + 1 for the null terminating byte. #define IBI_EXT ".IBI" //(I)nterpreted (B)lock (I)nstructions diff --git a/codeJK2/icarus/icarus.h b/codeJK2/icarus/icarus.h index d31aa8a0a4..06a040a037 100644 --- a/codeJK2/icarus/icarus.h +++ b/codeJK2/icarus/icarus.h @@ -1,38 +1,30 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // ICARUS Public Header File -#ifdef _MSC_VER - #pragma warning ( disable : 4786 ) //NOTENOTE: STL Debug name length warning -#endif - #ifndef __ICARUS__ #define __ICARUS__ -#ifdef _MSC_VER - #pragma warning( disable : 4786 ) // identifier was truncated - #pragma warning( disable : 4514 ) // unreferenced inline was removed - #pragma warning( disable : 4710 ) // not inlined - - #pragma warning( push, 3 ) //save current state and change to 3 -#endif - //For system-wide prints enum WL_e { WL_ERROR=1, @@ -51,10 +43,6 @@ enum WL_e { #include "taskmanager.h" #include "instance.h" -#ifdef _MSC_VER - #pragma warning( pop ) //restore -#endif - extern void *ICARUS_Malloc(int iSize); extern void ICARUS_Free(void *pMem); diff --git a/codeJK2/icarus/instance.h b/codeJK2/icarus/instance.h index 2113eab0fc..409cfa2e64 100644 --- a/codeJK2/icarus/instance.h +++ b/codeJK2/icarus/instance.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // ICARUS Intance header diff --git a/codeJK2/icarus/interface.h b/codeJK2/icarus/interface.h index 8cb5b7d964..aca6e3f8c6 100644 --- a/codeJK2/icarus/interface.h +++ b/codeJK2/icarus/interface.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // ICARUS Interface header file diff --git a/codeJK2/icarus/interpreter.h b/codeJK2/icarus/interpreter.h index 2763c711c9..89e1517969 100644 --- a/codeJK2/icarus/interpreter.h +++ b/codeJK2/icarus/interpreter.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Interpreter.h diff --git a/codeJK2/icarus/sequence.h b/codeJK2/icarus/sequence.h index 6e16e3bc26..f776e55c73 100644 --- a/codeJK2/icarus/sequence.h +++ b/codeJK2/icarus/sequence.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Sequence Header File diff --git a/codeJK2/icarus/sequencer.h b/codeJK2/icarus/sequencer.h index f53f7468c3..28dc0c7ae4 100644 --- a/codeJK2/icarus/sequencer.h +++ b/codeJK2/icarus/sequencer.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Sequencer Header File @@ -26,22 +30,10 @@ This file is part of Jedi Knight 2. #include "taskmanager.h" #include "sequence.h" -#ifdef _MSC_VER - #pragma warning(disable : 4786) //identifier was truncated - - #pragma warning (push, 3) //go back down to 3 for the stl include - #pragma warning (disable:4503) // decorated name length xceeded, name was truncated -#endif #include #include #include #include -#ifdef _MSC_VER - #pragma warning (pop) - #pragma warning (disable:4503) // decorated name length xceeded, name was truncated -#endif - -using namespace std; //Defines diff --git a/codeJK2/icarus/taskmanager.h b/codeJK2/icarus/taskmanager.h index 30370a1dbb..177e9a2b0c 100644 --- a/codeJK2/icarus/taskmanager.h +++ b/codeJK2/icarus/taskmanager.h @@ -1,20 +1,24 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Task Manager header file diff --git a/codeJK2/icarus/tokenizer.h b/codeJK2/icarus/tokenizer.h index 076e9082a9..2556e08202 100644 --- a/codeJK2/icarus/tokenizer.h +++ b/codeJK2/icarus/tokenizer.h @@ -1,55 +1,37 @@ /* -This file is part of Jedi Knight 2. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Knight 2 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Knight 2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Knight 2. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software // Tokenizer.h -// #ifndef __TOKENIZER_H #define __TOKENIZER_H -#ifdef _WIN32 - #define WIN32_FILE_IO -#endif - -#ifdef _MSC_VER - #pragma warning( disable : 4786 ) // identifier was truncated - - #pragma warning (push, 3) // go back down to 3 for the stl include - #pragma warning (disable:4503) // decorated name length xceeded, name was truncated -#endif #include +#include #include #include -#ifdef _MSC_VER - #pragma warning (pop) - #pragma warning (disable:4503) // decorated name length xceeded, name was truncated -#endif using namespace std; -#include "../../tools/Ibize/ibize_platform.h" - -#ifndef _WIN32 -#include -#endif - -//#include - typedef unsigned char byte; typedef unsigned short word; @@ -445,7 +427,7 @@ class CTokenizer void SetErrorProc(LPTokenizerErrorProc errorProc); void AddParseStream(byte* data, long datasize); bool AddParseFile(const char *filename); - COLORREF ParseRGB(); + unsigned int ParseRGB(); long GetRemainingSize(); unsigned GetFlags(); @@ -597,42 +579,4 @@ class CParseDefine : public CParseMemory CDirectiveSymbol* m_defineSymbol; }; -class CParseFile : public CParseStream -{ -public: - CParseFile(); - ~CParseFile(); - static CParseFile* Create(); - static CParseFile* Create(const char *filename, CTokenizer* tokenizer); -// static CParseFile* Create(CFile* file, CTokenizer* tokenizer); - virtual void Delete(); - virtual int GetCurLine(); - virtual void GetCurFilename(char** theBuff); - virtual long GetRemainingSize(); - - virtual bool NextChar(byte& theByte); - -protected: - bool Init(); - bool Init(const char *filename, CTokenizer* tokenizer); -// virtual void Init(CFile* file, CTokenizer* tokenizer); - DWORD GetFileSize(); - void Read(void* buff, unsigned buffsize); - -// CFile* m_file; -#ifdef WIN32_FILE_IO - HANDLE m_fileHandle; -#else - FILE* m_fileHandle; -#endif - char* m_fileName; - int m_curLine; - int m_curPos; - byte* m_buff; - unsigned int m_curByte; - unsigned int m_filesize; - bool m_ownsFile; -}; - - #endif//__TOKENIZER_H diff --git a/codeJK2/win32/AutoVersion.h b/codeJK2/win32/AutoVersion.h index 7f972de160..841c109e4b 100644 --- a/codeJK2/win32/AutoVersion.h +++ b/codeJK2/win32/AutoVersion.h @@ -2,9 +2,8 @@ This file is part of Jedi Academy. Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. Jedi Academy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/codeJK2/win32/afxres.h b/codeJK2/win32/afxres.h index bc4d941f1d..cb2bee755f 100644 --- a/codeJK2/win32/afxres.h +++ b/codeJK2/win32/afxres.h @@ -2,9 +2,8 @@ This file is part of Jedi Academy. Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. Jedi Academy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/codemp/CMakeLists.txt b/codemp/CMakeLists.txt index a3983df4c7..2791c16882 100644 --- a/codemp/CMakeLists.txt +++ b/codemp/CMakeLists.txt @@ -1,4 +1,20 @@ -cmake_minimum_required(VERSION 2.8.8) +#============================================================================ +# Copyright (C) 2013 - 2015, OpenJK contributors +# +# This file is part of the OpenJK source code. +# +# OpenJK is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +#============================================================================ # Make sure the user is not executing this script directly if(NOT InOpenJK) @@ -27,15 +43,14 @@ if(BuildMPRdVanilla) add_subdirectory("${MPDir}/rd-vanilla") endif(BuildMPRdVanilla) - # Common things between Engine and Dedicated Server if(BuildMPEngine OR BuildMPDed) # Botlib # the files could arguably just be put into the engine and dedicated projects without having a library for it. set(MPBotlibDefines ${SharedDefines} "BOTLIB") - set(MPBotlibIncludeDirectories ${MPDir}) - set(MPBotlibHeaderFiles + set(MPBotlibIncludeDirectories ${SharedDir} ${MPDir}) + set(MPBotlibBotlibFiles "${MPDir}/botlib/aasfile.h" "${MPDir}/botlib/be_aas.h" "${MPDir}/botlib/be_aas_bsp.h" @@ -62,8 +77,6 @@ if(BuildMPEngine OR BuildMPDed) "${MPDir}/botlib/be_ea.h" "${MPDir}/botlib/be_interface.h" "${MPDir}/botlib/botlib.h" - "${MPDir}/qcommon/cm_public.h" - "${MPDir}/qcommon/disablewarnings.h" "${MPDir}/botlib/l_crc.h" "${MPDir}/botlib/l_libvar.h" "${MPDir}/botlib/l_log.h" @@ -72,16 +85,7 @@ if(BuildMPEngine OR BuildMPDed) "${MPDir}/botlib/l_script.h" "${MPDir}/botlib/l_struct.h" "${MPDir}/botlib/l_utils.h" - "${MPDir}/qcommon/q_shared.h" - "${MPDir}/qcommon/q_platform.h" - "${MPDir}/qcommon/qcommon.h" - "${MPDir}/qcommon/qfiles.h" - "${MPDir}/server/server.h" - "${MPDir}/game/surfaceflags.h" - "${MPDir}/qcommon/tags.h" - ) - source_group("Header Files" FILES ${MPBotlibHeaderFiles}) - set(MPBotlibSourceFiles + "${MPDir}/botlib/be_aas_bspq3.cpp" "${MPDir}/botlib/be_aas_cluster.cpp" "${MPDir}/botlib/be_aas_debug.cpp" @@ -111,9 +115,34 @@ if(BuildMPEngine OR BuildMPDed) "${MPDir}/botlib/l_script.cpp" "${MPDir}/botlib/l_struct.cpp" ) - source_group("Source Files" FILES ${MPBotlibSourceFiles}) + source_group("botlib" FILES ${MPBotlibBotlibFiles}) + set(MPBotlibFiles ${MPBotlibFiles} ${MPBotlibBotlibFiles}) - add_library(${MPBotLib} STATIC ${MPBotlibHeaderFiles} ${MPBotlibSourceFiles}) + set(MPBotlibGameFiles + "${MPDir}/game/surfaceflags.h" + ) + source_group("game" FILES ${MPBotlibGameFiles}) + set(MPBotlibFiles ${MPBotlibFiles} ${MPBotlibGameFiles}) + + set(MPBotlibCommonFiles + "${MPDir}/qcommon/cm_public.h" + "${MPDir}/qcommon/disablewarnings.h" + "${MPDir}/qcommon/q_shared.h" + "${MPDir}/qcommon/q_platform.h" + "${MPDir}/qcommon/qcommon.h" + "${MPDir}/qcommon/qfiles.h" + "${MPDir}/qcommon/tags.h" + ) + source_group("common" FILES ${MPBotlibCommonFiles}) + set(MPBotlibFiles ${MPBotlibFiles} ${MPBotlibCommonFiles}) + + set(MPBotlibServerFiles + "${MPDir}/server/server.h" + ) + source_group("server" FILES ${MPBotlibServerFiles}) + set(MPBotlibFiles ${MPBotlibFiles} ${MPBotlibServerFiles}) + + add_library(${MPBotLib} STATIC ${MPBotlibFiles}) set_target_properties(${MPBotLib} PROPERTIES COMPILE_DEFINITIONS "${MPBotlibDefines}") set_target_properties(${MPBotLib} PROPERTIES INCLUDE_DIRECTORIES "${MPBotlibIncludeDirectories}") set_target_properties(${MPBotLib} PROPERTIES PROJECT_LABEL "Bot Library") @@ -127,7 +156,7 @@ if(BuildMPEngine OR BuildMPDed) set(MPEngineAndDedLibraries ${MPEngineAndDedLibraries} "winmm" "wsock32") endif(WIN32) # Include directories - set(MPEngineAndDedIncludeDirectories ${MPDir} ${OpenJKLibDir}) # codemp folder, since includes are not always relative in the files + set(MPEngineAndDedIncludeDirectories ${MPDir} ${SharedDir} ${OpenJKLibDir}) # codemp folder, since includes are not always relative in the files if(UseInternalZlib) set(MPEngineAndDedZLibFiles @@ -315,21 +344,11 @@ if(BuildMPEngine OR BuildMPDed) source_group("minizip" FILES ${MPEngineAndDedMinizipFiles}) set(MPEngineAndDedFiles ${MPEngineAndDedFiles} ${MPEngineAndDedMinizipFiles}) - if(WIN32) - set(MPEngineAndDedWin32Files - "${MPDir}/win32/win_local.h" - "${MPDir}/win32/win_shared.cpp" - "${MPDir}/sys/snapvector.cpp" - ) - source_group("win32" FILES ${MPEngineAndDedWin32Files}) - set(MPEngineAndDedFiles ${MPEngineAndDedFiles} ${MPEngineAndDedWin32Files}) - else(WIN32) - set(MPEngineAndDedSysFiles - "${MPDir}/sys/snapvector.cpp" - ) - set(MPEngineAndDedFiles ${MPEngineAndDedFiles} ${MPEngineAndDedSysFiles}) - source_group("sys" FILES ${MPEngineAndDedSysFiles}) - endif(WIN32) + set(MPEngineAndDedSysFiles + "${SharedDir}/sys/snapvector.cpp" + ) + set(MPEngineAndDedFiles ${MPEngineAndDedFiles} ${MPEngineAndDedSysFiles}) + source_group("sys" FILES ${MPEngineAndDedSysFiles}) endif(BuildMPEngine OR BuildMPDed) # Engine/Executable (jamp.exe) @@ -350,9 +369,8 @@ if(BuildMPEngine) endif() # OpenAL (is optionally included for Windows) - if (WIN32 AND NOT WIN64) + if (MSVC AND NOT WIN64) if(UseInternalOpenAL) - set(MPEngineIncludeDirectories ${MPEngineIncludeDirectories} "${MPDir}/client/OpenAL") # There's a libs/OpenAL32.lib # (mrw) TODO Is this actually required on windows? It is loaded at runtime, should not be linked? find_library(OpenALLibrary NAMES OpenAL32 PATHS ${OpenJKLibDir}) @@ -367,21 +385,40 @@ if(BuildMPEngine) endif(UseInternalOpenAL) endif() - if(NOT WIN32) + if(UseInternalSDL2) + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(MPEngineLibraries + ${MPEngineLibraries} + ${OpenJKLibDir}/SDL2/lib/x86/SDL2.lib + ${OpenJKLibDir}/SDL2/lib/x86/SDL2main.lib + ) + else() + set(MPEngineLibraries + ${MPEngineLibraries} + ${OpenJKLibDir}/SDL2/lib/x64/SDL2.lib + ${OpenJKLibDir}/SDL2/lib/x64/SDL2main.lib + ) + endif() + + set(MPEngineIncludeDirectories + ${MPEngineIncludeDirectories} + ${OpenJKLibDir}/SDL2/include + ) + else() find_package(SDL2 REQUIRED) set(MPEngineIncludeDirectories ${MPEngineIncludeDirectories} ${SDL2_INCLUDE_DIR}) set(MPEngineLibraries ${MPEngineLibraries} ${SDL2_LIBRARY}) - endif(NOT WIN32) + endif() # EAX is Windows-Only (right?) - if(WIN32) + if(MSVC) set(MPEngineEAXFiles "${MPDir}/client/eax/eax.h" "${MPDir}/client/eax/EaxMan.h" ) source_group("eax" FILES ${MPEngineEAXFiles}) set(MPEngineFiles ${MPEngineFiles} ${MPEngineEAXFiles}) - endif(WIN32) + endif(MSVC) # Source Files @@ -477,36 +514,45 @@ if(BuildMPEngine) source_group("mp3code" FILES ${MPEngineMp3Files}) set(MPEngineFiles ${MPEngineFiles} ${MPEngineMp3Files}) + set(MPEngineSysFiles + "${SharedDir}/sdl/sdl_window.cpp" + "${SharedDir}/sdl/sdl_icon.h" + "${SharedDir}/sdl/sdl_input.cpp" + "${SharedDir}/sdl/sdl_sound.cpp" + "${SharedDir}/sys/sys_loadlib.h" + "${SharedDir}/sys/sys_local.h" + "${SharedDir}/sys/sys_main.cpp" + "${SharedDir}/sys/sys_event.cpp" + "${SharedDir}/sys/sys_public.h" + "${SharedDir}/sys/con_local.h" + "${SharedDir}/sys/con_log.cpp" + ) + if(WIN32) set(MPEngineWin32Files - "${MPDir}/win32/glw_win.h" "${MPDir}/win32/icon.ico" "${MPDir}/win32/resource.h" - "${MPDir}/win32/win_input.cpp" - "${MPDir}/win32/win_main.cpp" - "${MPDir}/win32/win_snd.cpp" - "${MPDir}/win32/win_syscon.cpp" - "${MPDir}/win32/win_wndproc.cpp" "${MPDir}/win32/openjk.rc" ) - source_group("win32" FILES ${MPEngineWin32Files}) + set(MPEngineFiles ${MPEngineFiles} ${MPEngineWin32Files}) + source_group("win32" FILES ${MPEngineWin32Files}) + + set(MPEngineSysFiles + ${MPEngineSysFiles} + "${SharedDir}/sys/sys_win32.cpp" + "${SharedDir}/sys/con_passive.cpp" + ) else(WIN32) set(MPEngineSysFiles - "${MPDir}/sdl/sdl_input.cpp" - "${MPDir}/sdl/sdl_qgl.h" - "${MPDir}/sdl/sdl_snd.cpp" - "${MPDir}/sys/sys_loadlib.h" - "${MPDir}/sys/sys_local.h" - "${MPDir}/sys/sys_main.cpp" - "${MPDir}/sys/sys_unix.cpp" - "${MPDir}/sys/unix_local.h" + ${MPEngineSysFiles} + "${SharedDir}/sys/sys_unix.cpp" + "${SharedDir}/sys/con_tty.cpp" ) - source_group("sys" FILES ${MPEngineSysFiles}) - set(MPEngineFiles ${MPEngineFiles} ${MPEngineSysFiles}) endif(WIN32) - # todo: windows resources + set(MPEngineFiles ${MPEngineFiles} ${MPEngineSysFiles}) + source_group("sys" FILES ${MPEngineSysFiles}) if(MakeApplicationBundles) set(MACOSX_BUNDLE_BUNDLE_NAME ${MPEngine}) @@ -520,6 +566,17 @@ if(BuildMPEngine) if(WIN32) add_executable(${MPEngine} WIN32 ${MPEngineFiles}) + if(UseInternalSDL2) + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(MPEngineExtraInstallFiles + ${OpenJKLibDir}/SDL2/bin/x86/SDL2.dll + ) + else() + set(MPEngineExtraInstallFiles + ${OpenJKLibDir}/SDL2/bin/x64/SDL2.dll + ) + endif() + endif() else(WIN32) if(MakeApplicationBundles) add_executable(${MPEngine} MACOSX_BUNDLE ${MPEngineFiles}) @@ -530,9 +587,20 @@ if(BuildMPEngine) endif(WIN32) if(MakeApplicationBundles) - install(TARGETS ${MPEngine} BUNDLE DESTINATION ".") + install(TARGETS ${MPEngine} + BUNDLE + DESTINATION ${JKAInstallDir} + COMPONENT ${JKAMPClientComponent}) else(MakeApplicationBundles) - install(TARGETS ${MPEngine} RUNTIME DESTINATION ".") + install(TARGETS ${MPEngine} + RUNTIME + DESTINATION ${JKAInstallDir} + COMPONENT ${JKAMPClientComponent}) + if(MPEngineExtraInstallFiles) + install(FILES ${MPEngineExtraInstallFiles} + DESTINATION ${JKAInstallDir} + COMPONENT ${JKAMPClientComponent}) + endif() endif(MakeApplicationBundles) set_target_properties(${MPEngine} PROPERTIES COMPILE_DEFINITIONS_RELWITHDEBINFO "${MPEngineDefines};${ReleaseDefines}") @@ -584,16 +652,36 @@ if(BuildMPDed) set(MPDedFiles ${MPDedFiles} ${MPDedNullFiles}) if(WIN32) set(MPDedWin32Files - "${MPDir}/win32/win_main_ded.cpp" "${MPDir}/win32/openjkded.rc" ) source_group("win32" FILES ${MPDedWin32Files}) set(MPDedFiles ${MPDedFiles} ${MPDedWin32Files}) + + set(MPDedSysFiles + "${SharedDir}/sys/sys_loadlib.h" + "${SharedDir}/sys/sys_local.h" + "${SharedDir}/sys/sys_main.cpp" + "${SharedDir}/sys/sys_event.cpp" + "${SharedDir}/sys/sys_public.h" + "${SharedDir}/sys/sys_win32.cpp" + "${SharedDir}/sys/con_local.h" + "${SharedDir}/sys/con_log.cpp" + "${SharedDir}/sys/con_win32.cpp" + ) + set(MPDedLibraries ${MPDedLibraries} ${CMAKE_DL_LIBS}) + source_group("sys" FILES ${MPDedSysFiles}) + set(MPDedFiles ${MPDedFiles} ${MPDedSysFiles}) else(WIN32) set(MPDedSysFiles - "${MPDir}/sys/sys_main.cpp" - "${MPDir}/sys/sys_unix.cpp" - "${MPDir}/sys/unix_local.h" + "${SharedDir}/sys/sys_loadlib.h" + "${SharedDir}/sys/sys_local.h" + "${SharedDir}/sys/sys_main.cpp" + "${SharedDir}/sys/sys_event.cpp" + "${SharedDir}/sys/sys_public.h" + "${SharedDir}/sys/sys_unix.cpp" + "${SharedDir}/sys/con_local.h" + "${SharedDir}/sys/con_log.cpp" + "${SharedDir}/sys/con_tty.cpp" ) set(MPDedLibraries ${MPDedLibraries} ${CMAKE_DL_LIBS}) source_group("sys" FILES ${MPDedSysFiles}) @@ -601,7 +689,10 @@ if(BuildMPDed) endif(WIN32) add_executable(${MPDed} ${MPDedFiles}) - install(TARGETS ${MPDed} RUNTIME DESTINATION ".") + install(TARGETS ${MPDed} + RUNTIME + DESTINATION ${JKAInstallDir} + COMPONENT ${JKAMPServerComponent}) set_target_properties(${MPDed} PROPERTIES COMPILE_DEFINITIONS_RELWITHDEBINFO "${MPDedDefines};${ReleaseDefines}") set_target_properties(${MPDed} PROPERTIES COMPILE_DEFINITIONS_MINSIZEREL "${MPDedDefines};${ReleaseDefines}") set_target_properties(${MPDed} PROPERTIES COMPILE_DEFINITIONS_RELEASE "${MPDedDefines};${ReleaseDefines}") @@ -610,3 +701,44 @@ if(BuildMPDed) set_target_properties(${MPDed} PROPERTIES PROJECT_LABEL "MP Dedicated Server") target_link_libraries(${MPDed} ${MPDedLibraries}) endif(BuildMPDed) + +set(GameLibsBuilt) +if(BuildMPGame) + set(GameLibsBuilt ${GameLibsBuilt} ${MPGame}) +endif() + +if(BuildMPCGame) + set(GameLibsBuilt ${GameLibsBuilt} ${MPCGame}) +endif() + +if(BuildMPUI) + set(GameLibsBuilt ${GameLibsBuilt} ${MPUI}) +endif() + +if(WIN32) +set(GameLibFullPaths) + if(MSVC) + foreach(GameLib ${GameLibsBuilt}) + set(GameLibFullPaths + ${GameLibFullPaths} + ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${GameLib}${CMAKE_SHARED_LIBRARY_SUFFIX}) + endforeach(GameLib) + else() + foreach(GameLib ${GameLibsBuilt}) + set(GameLibFullPaths + ${GameLibFullPaths} + ${CMAKE_BINARY_DIR}/${GameLib}${CMAKE_SHARED_LIBRARY_SUFFIX}) + endforeach(GameLib) + endif() + + include(InstallZIP) + add_zip_command(openjk.pk3 + FILES ${GameLibFullPaths} + DEPENDS "${GameLibsBuilt}") + add_custom_target(Assets + ALL + DEPENDS openjk.pk3) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/openjk.pk3 + DESTINATION "${JKAInstallDir}/OpenJK" + COMPONENT ${JKAMPCoreComponent}) +endif() diff --git a/codemp/Ratl/bits_vs.h b/codemp/Ratl/bits_vs.h index af05a2b99a..464adb8b54 100644 --- a/codemp/Ratl/bits_vs.h +++ b/codemp/Ratl/bits_vs.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once //////////////////////////////////////////////////////////////////////////////////////// diff --git a/codemp/Ratl/ratl_common.h b/codemp/Ratl/ratl_common.h index 0f9622f58b..2a0a47cd0f 100644 --- a/codemp/Ratl/ratl_common.h +++ b/codemp/Ratl/ratl_common.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once //////////////////////////////////////////////////////////////////////////////////////// @@ -1023,11 +1045,7 @@ class array_base : public ratl_base //////////////////////////////////////////////////////////////////////////////////// // Data //////////////////////////////////////////////////////////////////////////////////// -#ifdef _WIN32 - typedef typename T TStorageTraits; -#else typedef T TStorageTraits; -#endif typedef typename T::TArray TTArray; typedef typename T::TValue TTValue; typedef typename T::TConstructed TTConstructed; diff --git a/codemp/Ratl/vector_vs.h b/codemp/Ratl/vector_vs.h index b8a4bb4b71..31883d18cc 100644 --- a/codemp/Ratl/vector_vs.h +++ b/codemp/Ratl/vector_vs.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once //////////////////////////////////////////////////////////////////////////////////////// @@ -36,11 +58,7 @@ template class vector_base : public ratl_base { public: -#ifdef _WIN32 - typedef typename T TStorageTraits; -#else typedef T TStorageTraits; -#endif typedef typename T::TValue TTValue; //////////////////////////////////////////////////////////////////////////////////// // Capacity Enum diff --git a/codemp/Ravl/CVec.h b/codemp/Ravl/CVec.h index 2da4c793e1..b3e55b3639 100644 --- a/codemp/Ravl/CVec.h +++ b/codemp/Ravl/CVec.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once //////////////////////////////////////////////////////////////////////////////////////// diff --git a/codemp/botlib/aasfile.h b/codemp/botlib/aasfile.h index 55fe8de782..f9447bbbf9 100644 --- a/codemp/botlib/aasfile.h +++ b/codemp/botlib/aasfile.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once //NOTE: int = default signed diff --git a/codemp/botlib/be_aas.h b/codemp/botlib/be_aas.h index dd4b286202..e57e798756 100644 --- a/codemp/botlib/be_aas.h +++ b/codemp/botlib/be_aas.h @@ -1,7 +1,25 @@ -#pragma once - -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas.h @@ -15,6 +33,7 @@ * $Date: 2003/03/15 23:43:59 $ * *****************************************************************************/ +#pragma once #define AASINTERN diff --git a/codemp/botlib/be_aas_bsp.h b/codemp/botlib/be_aas_bsp.h index 2e9465ac3a..024ceaa72d 100644 --- a/codemp/botlib/be_aas_bsp.h +++ b/codemp/botlib/be_aas_bsp.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_bsp.h @@ -12,6 +33,7 @@ * $Date: 10/05/99 3:42p $ * *****************************************************************************/ +#pragma once #ifdef AASINTERN //loads the given BSP file diff --git a/codemp/botlib/be_aas_bspq3.cpp b/codemp/botlib/be_aas_bspq3.cpp index 7ff35b6bb9..522b8250e2 100644 --- a/codemp/botlib/be_aas_bspq3.cpp +++ b/codemp/botlib/be_aas_bspq3.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_bspq3.c diff --git a/codemp/botlib/be_aas_cluster.cpp b/codemp/botlib/be_aas_cluster.cpp index fcf0208709..0a42799fe7 100644 --- a/codemp/botlib/be_aas_cluster.cpp +++ b/codemp/botlib/be_aas_cluster.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_cluster.c diff --git a/codemp/botlib/be_aas_cluster.h b/codemp/botlib/be_aas_cluster.h index 6c021d092c..dedd9c6472 100644 --- a/codemp/botlib/be_aas_cluster.h +++ b/codemp/botlib/be_aas_cluster.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_cluster.h @@ -12,6 +33,7 @@ * $Date: 10/05/99 3:42p $ * *****************************************************************************/ +#pragma once #ifdef AASINTERN //initialize the AAS clustering diff --git a/codemp/botlib/be_aas_debug.cpp b/codemp/botlib/be_aas_debug.cpp index 183ad95cd0..855d25638b 100644 --- a/codemp/botlib/be_aas_debug.cpp +++ b/codemp/botlib/be_aas_debug.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_debug.c diff --git a/codemp/botlib/be_aas_debug.h b/codemp/botlib/be_aas_debug.h index 46e7f86ff9..3cc4b96835 100644 --- a/codemp/botlib/be_aas_debug.h +++ b/codemp/botlib/be_aas_debug.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_debug.h @@ -12,6 +33,7 @@ * $Date: 10/05/99 3:42p $ * *****************************************************************************/ +#pragma once //clear the shown debug lines void AAS_ClearShownDebugLines(void); diff --git a/codemp/botlib/be_aas_def.h b/codemp/botlib/be_aas_def.h index b40c3a2e2f..856a001c64 100644 --- a/codemp/botlib/be_aas_def.h +++ b/codemp/botlib/be_aas_def.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_def.h @@ -12,6 +33,7 @@ * $Date: 2003/03/15 23:43:54 $ * *****************************************************************************/ +#pragma once #include "../qcommon/q_shared.h" diff --git a/codemp/botlib/be_aas_entity.cpp b/codemp/botlib/be_aas_entity.cpp index cf2c22737b..b5dc11eac3 100644 --- a/codemp/botlib/be_aas_entity.cpp +++ b/codemp/botlib/be_aas_entity.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_entity.c diff --git a/codemp/botlib/be_aas_entity.h b/codemp/botlib/be_aas_entity.h index 6316498615..1be5948019 100644 --- a/codemp/botlib/be_aas_entity.h +++ b/codemp/botlib/be_aas_entity.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_entity.h @@ -13,6 +34,8 @@ * *****************************************************************************/ +#pragma once + #ifdef AASINTERN //invalidates all entity infos void AAS_InvalidateEntities(void); diff --git a/codemp/botlib/be_aas_file.cpp b/codemp/botlib/be_aas_file.cpp index e3572fd98b..9f9a2fa02c 100644 --- a/codemp/botlib/be_aas_file.cpp +++ b/codemp/botlib/be_aas_file.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_file.c diff --git a/codemp/botlib/be_aas_file.h b/codemp/botlib/be_aas_file.h index 41e3aaedff..ed46c66382 100644 --- a/codemp/botlib/be_aas_file.h +++ b/codemp/botlib/be_aas_file.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_file.h @@ -13,6 +34,8 @@ * *****************************************************************************/ +#pragma once + #ifdef AASINTERN //loads the AAS file with the given name int AAS_LoadAASFile(char *filename); diff --git a/codemp/botlib/be_aas_funcs.h b/codemp/botlib/be_aas_funcs.h index 71e5c43a80..d2ddbffdba 100644 --- a/codemp/botlib/be_aas_funcs.h +++ b/codemp/botlib/be_aas_funcs.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_funcs.h @@ -13,6 +34,8 @@ * *****************************************************************************/ +#pragma once + #ifndef BSPCINCLUDE #include "be_aas_main.h" diff --git a/codemp/botlib/be_aas_main.cpp b/codemp/botlib/be_aas_main.cpp index a6a0075543..60093cba75 100644 --- a/codemp/botlib/be_aas_main.cpp +++ b/codemp/botlib/be_aas_main.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_main.c diff --git a/codemp/botlib/be_aas_main.h b/codemp/botlib/be_aas_main.h index 178eb10434..861809facf 100644 --- a/codemp/botlib/be_aas_main.h +++ b/codemp/botlib/be_aas_main.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_main.h @@ -13,6 +34,8 @@ * *****************************************************************************/ +#pragma once + #include "be_aas_def.h" #ifdef AASINTERN diff --git a/codemp/botlib/be_aas_move.cpp b/codemp/botlib/be_aas_move.cpp index 952bee7fa0..897f8427da 100644 --- a/codemp/botlib/be_aas_move.cpp +++ b/codemp/botlib/be_aas_move.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_move.c diff --git a/codemp/botlib/be_aas_move.h b/codemp/botlib/be_aas_move.h index 7e9ff7a999..4934340419 100644 --- a/codemp/botlib/be_aas_move.h +++ b/codemp/botlib/be_aas_move.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_move.h @@ -13,6 +34,8 @@ * *****************************************************************************/ +#pragma once + #ifdef AASINTERN extern aas_settings_t aassettings; #endif //AASINTERN diff --git a/codemp/botlib/be_aas_optimize.cpp b/codemp/botlib/be_aas_optimize.cpp index 14194ba333..6a8508bf97 100644 --- a/codemp/botlib/be_aas_optimize.cpp +++ b/codemp/botlib/be_aas_optimize.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_optimize.c diff --git a/codemp/botlib/be_aas_optimize.h b/codemp/botlib/be_aas_optimize.h index b532f45542..cce146fffa 100644 --- a/codemp/botlib/be_aas_optimize.h +++ b/codemp/botlib/be_aas_optimize.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_optimize.h @@ -13,4 +34,6 @@ * *****************************************************************************/ +#pragma once + void AAS_Optimize(void); diff --git a/codemp/botlib/be_aas_reach.cpp b/codemp/botlib/be_aas_reach.cpp index 4c323b5354..2e957dfa99 100644 --- a/codemp/botlib/be_aas_reach.cpp +++ b/codemp/botlib/be_aas_reach.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_reach.c diff --git a/codemp/botlib/be_aas_reach.h b/codemp/botlib/be_aas_reach.h index 247e9ad188..e5759a35e6 100644 --- a/codemp/botlib/be_aas_reach.h +++ b/codemp/botlib/be_aas_reach.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_reach.h @@ -13,6 +34,8 @@ * *****************************************************************************/ +#pragma once + #ifdef AASINTERN //initialize calculating the reachabilities void AAS_InitReachability(void); diff --git a/codemp/botlib/be_aas_route.cpp b/codemp/botlib/be_aas_route.cpp index 90a9f583f5..c85dc7dcec 100644 --- a/codemp/botlib/be_aas_route.cpp +++ b/codemp/botlib/be_aas_route.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_route.c @@ -1751,7 +1773,7 @@ int AAS_AreaRouteToGoalArea(int areanum, vec3_t origin, int goalareanum, int tra //=========================================================================== int AAS_AreaTravelTimeToGoalArea(int areanum, vec3_t origin, int goalareanum, int travelflags) { - int traveltime, reachnum; + int traveltime, reachnum = 0; if (AAS_AreaRouteToGoalArea(areanum, origin, goalareanum, travelflags, &traveltime, &reachnum)) { @@ -1767,7 +1789,7 @@ int AAS_AreaTravelTimeToGoalArea(int areanum, vec3_t origin, int goalareanum, in //=========================================================================== int AAS_AreaReachabilityToGoalArea(int areanum, vec3_t origin, int goalareanum, int travelflags) { - int traveltime, reachnum; + int traveltime, reachnum = 0; if (AAS_AreaRouteToGoalArea(areanum, origin, goalareanum, travelflags, &traveltime, &reachnum)) { diff --git a/codemp/botlib/be_aas_route.h b/codemp/botlib/be_aas_route.h index cc9b9e03fc..7f59d8b30f 100644 --- a/codemp/botlib/be_aas_route.h +++ b/codemp/botlib/be_aas_route.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_route.h @@ -13,6 +34,8 @@ * *****************************************************************************/ +#pragma once + #ifdef AASINTERN //initialize the AAS routing void AAS_InitRouting(void); diff --git a/codemp/botlib/be_aas_routealt.cpp b/codemp/botlib/be_aas_routealt.cpp index 9cd4a5f680..4017597f61 100644 --- a/codemp/botlib/be_aas_routealt.cpp +++ b/codemp/botlib/be_aas_routealt.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_routealt.c diff --git a/codemp/botlib/be_aas_routealt.h b/codemp/botlib/be_aas_routealt.h index 020b56d6ae..0ab1f08399 100644 --- a/codemp/botlib/be_aas_routealt.h +++ b/codemp/botlib/be_aas_routealt.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_routealt.h @@ -13,6 +34,8 @@ * *****************************************************************************/ +#pragma once + #ifdef AASINTERN void AAS_InitAlternativeRouting(void); void AAS_ShutdownAlternativeRouting(void); diff --git a/codemp/botlib/be_aas_sample.cpp b/codemp/botlib/be_aas_sample.cpp index 802edcf0b6..64d8cdabb1 100644 --- a/codemp/botlib/be_aas_sample.cpp +++ b/codemp/botlib/be_aas_sample.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_sample.c diff --git a/codemp/botlib/be_aas_sample.h b/codemp/botlib/be_aas_sample.h index ef0c9b6d64..752cd8e7b0 100644 --- a/codemp/botlib/be_aas_sample.h +++ b/codemp/botlib/be_aas_sample.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_aas_sample.h @@ -13,6 +34,8 @@ * *****************************************************************************/ +#pragma once + #ifdef AASINTERN void AAS_InitAASLinkHeap(void); void AAS_InitAASLinkedEntities(void); diff --git a/codemp/botlib/be_ai_char.cpp b/codemp/botlib/be_ai_char.cpp index 61c86b331b..413d83e29c 100644 --- a/codemp/botlib/be_ai_char.cpp +++ b/codemp/botlib/be_ai_char.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_ai_char.c diff --git a/codemp/botlib/be_ai_char.h b/codemp/botlib/be_ai_char.h index 33e930ffbb..4443b9d67a 100644 --- a/codemp/botlib/be_ai_char.h +++ b/codemp/botlib/be_ai_char.h @@ -1,7 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. -// Copyright (C) 1999-2000 Id Software, Inc. -// +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_ai_char.h @@ -16,6 +34,8 @@ * *****************************************************************************/ +#pragma once + //loads a bot character from a file int BotLoadCharacter(char *charfile, float skill); //frees a bot character diff --git a/codemp/botlib/be_ai_chat.cpp b/codemp/botlib/be_ai_chat.cpp index 6ee09dd235..11f4cd3845 100644 --- a/codemp/botlib/be_ai_chat.cpp +++ b/codemp/botlib/be_ai_chat.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_ai_chat.c diff --git a/codemp/botlib/be_ai_chat.h b/codemp/botlib/be_ai_chat.h index 27ca80f017..b36c9e6216 100644 --- a/codemp/botlib/be_ai_chat.h +++ b/codemp/botlib/be_ai_chat.h @@ -1,7 +1,26 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ -// Copyright (C) 1999-2000 Id Software, Inc. -// /***************************************************************************** * name: be_ai_chat.h * @@ -15,6 +34,8 @@ * *****************************************************************************/ +#pragma once + #define MAX_MESSAGE_SIZE 256 #define MAX_CHATTYPE_NAME 32 #define MAX_MATCHVARIABLES 8 diff --git a/codemp/botlib/be_ai_gen.cpp b/codemp/botlib/be_ai_gen.cpp index 6a5eeb6f1f..e2835fc12f 100644 --- a/codemp/botlib/be_ai_gen.cpp +++ b/codemp/botlib/be_ai_gen.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_ai_gen.c diff --git a/codemp/botlib/be_ai_gen.h b/codemp/botlib/be_ai_gen.h index 787f2420fc..4186a0b562 100644 --- a/codemp/botlib/be_ai_gen.h +++ b/codemp/botlib/be_ai_gen.h @@ -1,7 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. -// Copyright (C) 1999-2000 Id Software, Inc. -// +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_ai_gen.h @@ -16,4 +34,6 @@ * *****************************************************************************/ +#pragma once + int GeneticParentsAndChildSelection(int numranks, float *ranks, int *parent1, int *parent2, int *child); diff --git a/codemp/botlib/be_ai_goal.cpp b/codemp/botlib/be_ai_goal.cpp index 226b7d2e72..88c882f6b8 100644 --- a/codemp/botlib/be_ai_goal.cpp +++ b/codemp/botlib/be_ai_goal.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_ai_goal.c diff --git a/codemp/botlib/be_ai_goal.h b/codemp/botlib/be_ai_goal.h index 7974c52a5f..524f737d95 100644 --- a/codemp/botlib/be_ai_goal.h +++ b/codemp/botlib/be_ai_goal.h @@ -1,7 +1,26 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ -// Copyright (C) 1999-2000 Id Software, Inc. -// /***************************************************************************** * name: be_ai_goal.h * @@ -15,6 +34,8 @@ * *****************************************************************************/ +#pragma once + #define MAX_AVOIDGOALS 256 #define MAX_GOALSTACK 8 diff --git a/codemp/botlib/be_ai_move.cpp b/codemp/botlib/be_ai_move.cpp index 81d3303fa7..a65e85a2dd 100644 --- a/codemp/botlib/be_ai_move.cpp +++ b/codemp/botlib/be_ai_move.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_ai_move.c diff --git a/codemp/botlib/be_ai_move.h b/codemp/botlib/be_ai_move.h index 355166423b..1c0cd08ac7 100644 --- a/codemp/botlib/be_ai_move.h +++ b/codemp/botlib/be_ai_move.h @@ -1,7 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors -// Copyright (C) 1999-2000 Id Software, Inc. -// +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_ai_move.h @@ -16,6 +34,8 @@ * *****************************************************************************/ +#pragma once + //movement types #define MOVE_WALK 1 #define MOVE_CROUCH 2 diff --git a/codemp/botlib/be_ai_weap.cpp b/codemp/botlib/be_ai_weap.cpp index e0aa579d77..231f722a55 100644 --- a/codemp/botlib/be_ai_weap.cpp +++ b/codemp/botlib/be_ai_weap.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_ai_weap.c diff --git a/codemp/botlib/be_ai_weap.h b/codemp/botlib/be_ai_weap.h index 7c28beaf72..34ededb844 100644 --- a/codemp/botlib/be_ai_weap.h +++ b/codemp/botlib/be_ai_weap.h @@ -1,7 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. -// Copyright (C) 1999-2000 Id Software, Inc. -// +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_ai_weap.h @@ -16,6 +34,8 @@ * *****************************************************************************/ +#pragma once + //projectile flags #define PFL_WINDOWDAMAGE 1 //projectile damages through window #define PFL_RETURN 2 //set when projectile returns to owner diff --git a/codemp/botlib/be_ai_weight.cpp b/codemp/botlib/be_ai_weight.cpp index 88e4a1ce09..d3bbcb2d6d 100644 --- a/codemp/botlib/be_ai_weight.cpp +++ b/codemp/botlib/be_ai_weight.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_ai_weight.c diff --git a/codemp/botlib/be_ai_weight.h b/codemp/botlib/be_ai_weight.h index 9e7268ebb3..145abf001a 100644 --- a/codemp/botlib/be_ai_weight.h +++ b/codemp/botlib/be_ai_weight.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_ai_weight.h @@ -13,6 +34,8 @@ * *****************************************************************************/ +#pragma once + #define WT_BALANCE 1 #define MAX_WEIGHTS 128 diff --git a/codemp/botlib/be_ea.cpp b/codemp/botlib/be_ea.cpp index a290ffe5c9..24ea43b707 100644 --- a/codemp/botlib/be_ea.cpp +++ b/codemp/botlib/be_ea.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_ea.c diff --git a/codemp/botlib/be_ea.h b/codemp/botlib/be_ea.h index c9eca252a0..ccacd538b4 100644 --- a/codemp/botlib/be_ea.h +++ b/codemp/botlib/be_ea.h @@ -1,7 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. -// Copyright (C) 1999-2000 Id Software, Inc. -// +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_ea.h @@ -16,6 +34,8 @@ * *****************************************************************************/ +#pragma once + //ClientCommand elementary actions void EA_Say(int client, char *str); void EA_SayTeam(int client, char *str); diff --git a/codemp/botlib/be_interface.cpp b/codemp/botlib/be_interface.cpp index 13af85e9bc..6d61da92a3 100644 --- a/codemp/botlib/be_interface.cpp +++ b/codemp/botlib/be_interface.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_interface.c // bk010221 - FIXME - DEAD code elimination diff --git a/codemp/botlib/be_interface.h b/codemp/botlib/be_interface.h index 11afa0ca6d..caa376abed 100644 --- a/codemp/botlib/be_interface.h +++ b/codemp/botlib/be_interface.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: be_interface.h @@ -13,6 +34,8 @@ * *****************************************************************************/ +#pragma once + //#define DEBUG //debug code #define RANDOMIZE //randomize bot behaviour diff --git a/codemp/botlib/botlib.h b/codemp/botlib/botlib.h index e76e7c1201..0345e758b1 100644 --- a/codemp/botlib/botlib.h +++ b/codemp/botlib/botlib.h @@ -1,7 +1,28 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once -// Copyright (C) 1999-2000 Id Software, Inc. -// /***************************************************************************** * name: botlib.h * diff --git a/codemp/botlib/l_crc.cpp b/codemp/botlib/l_crc.cpp index c9b961118a..d542eea4dc 100644 --- a/codemp/botlib/l_crc.cpp +++ b/codemp/botlib/l_crc.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: l_crc.c diff --git a/codemp/botlib/l_crc.h b/codemp/botlib/l_crc.h index 11b6677563..709cf6f813 100644 --- a/codemp/botlib/l_crc.h +++ b/codemp/botlib/l_crc.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ //=========================================================================== // @@ -9,6 +30,8 @@ // Tab Size: 3 //=========================================================================== +#pragma once + typedef unsigned short crc_t; void CRC_Init(unsigned short *crcvalue); diff --git a/codemp/botlib/l_libvar.cpp b/codemp/botlib/l_libvar.cpp index 143a3f913e..a27e93a762 100644 --- a/codemp/botlib/l_libvar.cpp +++ b/codemp/botlib/l_libvar.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: l_libvar.c diff --git a/codemp/botlib/l_libvar.h b/codemp/botlib/l_libvar.h index bc5db0fa14..a41871a06f 100644 --- a/codemp/botlib/l_libvar.h +++ b/codemp/botlib/l_libvar.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: l_libvar.h @@ -13,6 +34,8 @@ * *****************************************************************************/ +#pragma once + //library variable typedef struct libvar_s { diff --git a/codemp/botlib/l_log.cpp b/codemp/botlib/l_log.cpp index a858c39eb9..0a977ee6bb 100644 --- a/codemp/botlib/l_log.cpp +++ b/codemp/botlib/l_log.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: l_log.c diff --git a/codemp/botlib/l_log.h b/codemp/botlib/l_log.h index 101081ef70..142c703aff 100644 --- a/codemp/botlib/l_log.h +++ b/codemp/botlib/l_log.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: l_log.h @@ -13,6 +34,8 @@ * *****************************************************************************/ +#pragma once + //open a log file void Log_Open(char *filename); //close the current log file diff --git a/codemp/botlib/l_memory.cpp b/codemp/botlib/l_memory.cpp index b12bfa63e8..1a71e98d1c 100644 --- a/codemp/botlib/l_memory.cpp +++ b/codemp/botlib/l_memory.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: l_memory.c diff --git a/codemp/botlib/l_memory.h b/codemp/botlib/l_memory.h index 919ad31542..e85b919ccd 100644 --- a/codemp/botlib/l_memory.h +++ b/codemp/botlib/l_memory.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: l_memory.h @@ -13,6 +34,8 @@ * *****************************************************************************/ +#pragma once + //#define MEMDEBUG #ifdef MEMDEBUG diff --git a/codemp/botlib/l_precomp.cpp b/codemp/botlib/l_precomp.cpp index e922c03435..9560f97ce7 100644 --- a/codemp/botlib/l_precomp.cpp +++ b/codemp/botlib/l_precomp.cpp @@ -1,5 +1,25 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: l_precomp.c diff --git a/codemp/botlib/l_precomp.h b/codemp/botlib/l_precomp.h index 0132e7677a..b1731c11f6 100644 --- a/codemp/botlib/l_precomp.h +++ b/codemp/botlib/l_precomp.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: l_precomp.h @@ -13,6 +34,8 @@ * *****************************************************************************/ +#pragma once + #ifndef MAX_PATH #define MAX_PATH MAX_QPATH #endif diff --git a/codemp/botlib/l_script.cpp b/codemp/botlib/l_script.cpp index b6ce1f23b2..8be425b0c8 100644 --- a/codemp/botlib/l_script.cpp +++ b/codemp/botlib/l_script.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: l_script.c diff --git a/codemp/botlib/l_script.h b/codemp/botlib/l_script.h index 8490d9f1c2..574732a711 100644 --- a/codemp/botlib/l_script.h +++ b/codemp/botlib/l_script.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: l_script.h @@ -13,6 +34,8 @@ * *****************************************************************************/ +#pragma once + //undef if binary numbers of the form 0b... or 0B... are not allowed #define BINARYNUMBERS //undef if not using the token.intvalue and token.floatvalue diff --git a/codemp/botlib/l_struct.cpp b/codemp/botlib/l_struct.cpp index 69091ddf0a..bd8e0bfcce 100644 --- a/codemp/botlib/l_struct.cpp +++ b/codemp/botlib/l_struct.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: l_struct.c diff --git a/codemp/botlib/l_struct.h b/codemp/botlib/l_struct.h index a869671c1c..62b6d2e49e 100644 --- a/codemp/botlib/l_struct.h +++ b/codemp/botlib/l_struct.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: l_struct.h @@ -13,6 +34,7 @@ * *****************************************************************************/ +#pragma once #define MAX_STRINGFIELD 80 //field types diff --git a/codemp/botlib/l_utils.h b/codemp/botlib/l_utils.h index 020b482633..955323cf8d 100644 --- a/codemp/botlib/l_utils.h +++ b/codemp/botlib/l_utils.h @@ -1,4 +1,25 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: l_util.h @@ -13,6 +34,8 @@ * *****************************************************************************/ +#pragma once + #define Vector2Angles(v,a) vectoangles(v,a) #ifdef MAX_PATH #undef MAX_PATH diff --git a/codemp/cgame/CMakeLists.txt b/codemp/cgame/CMakeLists.txt index 7c62494dc4..69acb5f03f 100644 --- a/codemp/cgame/CMakeLists.txt +++ b/codemp/cgame/CMakeLists.txt @@ -1,4 +1,20 @@ -cmake_minimum_required(VERSION 2.8.8) +#============================================================================ +# Copyright (C) 2013 - 2015, OpenJK contributors +# +# This file is part of the OpenJK source code. +# +# OpenJK is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +#============================================================================ # Make sure the user is not executing this script directly if(NOT InOpenJK) @@ -115,21 +131,44 @@ set(MPCGameFiles ${MPCGameFiles} ${MPCGameG2Files}) add_library(${MPCGame} SHARED ${MPCGameFiles}) -if(NOT WIN32) +if(NOT MSVC) # remove "lib" prefix for .so/.dylib files set_target_properties(${MPCGame} PROPERTIES PREFIX "") -endif(NOT WIN32) +endif() + +if(MakeApplicationBundles AND BuildMPEngine) + install(TARGETS ${MPCGame} + LIBRARY + DESTINATION "${JKAInstallDir}/${MPEngine}.app/Contents/MacOS/OpenJK" + COMPONENT ${JKAMPCoreComponent}) + install(TARGETS ${MPCGame} + LIBRARY + DESTINATION "${JKAInstallDir}/${MPEngine}.app/Contents/MacOS/base" + COMPONENT ${JKAMPCoreComponent}) +elseif(WIN32) + install(TARGETS ${MPCGame} + RUNTIME + DESTINATION "${JKAInstallDir}/OpenJK" + COMPONENT ${JKAMPCoreComponent}) + if (WIN64) + # Don't do this on 32-bit Windows to avoid overwriting + # vanilla JKA's DLLs + install(TARGETS ${MPCGame} + RUNTIME + DESTINATION "${JKAInstallDir}/base" + COMPONENT ${JKAMPCoreComponent}) + endif() +else() + install(TARGETS ${MPCGame} + LIBRARY + DESTINATION "${JKAInstallDir}/OpenJK" + COMPONENT ${JKAMPCoreComponent}) + install(TARGETS ${MPCGame} + LIBRARY + DESTINATION "${JKAInstallDir}/base" + COMPONENT ${JKAMPCoreComponent}) +endif() -if(WIN32) - install(TARGETS ${MPCGame} RUNTIME DESTINATION "OpenJK") -else(WIN32) - if(MakeApplicationBundles AND BuildMPEngine) - install(TARGETS ${MPCGame} LIBRARY DESTINATION "${MPEngine}.app/Contents/MacOS/OpenJK") - install(TARGETS ${MPCGame} LIBRARY DESTINATION "${MPEngine}.app/Contents/MacOS/base") - else(MakeApplicationBundles AND BuildMPEngine) - install(TARGETS ${MPCGame} LIBRARY DESTINATION "OpenJK") - endif(MakeApplicationBundles AND BuildMPEngine) -endif(WIN32) set_target_properties(${MPCGame} PROPERTIES COMPILE_DEFINITIONS_RELWITHDEBINFO "${MPCGameDefines};${ReleaseDefines}") set_target_properties(${MPCGame} PROPERTIES COMPILE_DEFINITIONS_MINSIZEREL "${MPCGameDefines};${ReleaseDefines}") set_target_properties(${MPCGame} PROPERTIES COMPILE_DEFINITIONS_RELEASE "${MPCGameDefines};${ReleaseDefines}") diff --git a/codemp/cgame/animtable.h b/codemp/cgame/animtable.h index 318ad4fa5b..60c1964072 100644 --- a/codemp/cgame/animtable.h +++ b/codemp/cgame/animtable.h @@ -1,7 +1,26 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // special file included only by cg_players.cpp & ui_players.cpp -// -// moved it from the original header file for PCH reasons... -// stringID_table_t animTable [MAX_ANIMATIONS+1] = { diff --git a/codemp/cgame/cg_consolecmds.c b/codemp/cgame/cg_consolecmds.c index fd39f3e8c2..70b240aa17 100644 --- a/codemp/cgame/cg_consolecmds.c +++ b/codemp/cgame/cg_consolecmds.c @@ -1,5 +1,27 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_consolecmds.c -- text commands typed in at the local console, or // executed by a key binding diff --git a/codemp/cgame/cg_cvar.c b/codemp/cgame/cg_cvar.c index 3e10f4f906..4666010135 100644 --- a/codemp/cgame/cg_cvar.c +++ b/codemp/cgame/cg_cvar.c @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "cg_local.h" // diff --git a/codemp/cgame/cg_draw.c b/codemp/cgame/cg_draw.c index 001699285f..a7a6222aa6 100644 --- a/codemp/cgame/cg_draw.c +++ b/codemp/cgame/cg_draw.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_draw.c -- draw all of the graphical elements during // active (after loading) gameplay diff --git a/codemp/cgame/cg_drawtools.c b/codemp/cgame/cg_drawtools.c index ae0c038e76..8e6b9a2b91 100644 --- a/codemp/cgame/cg_drawtools.c +++ b/codemp/cgame/cg_drawtools.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_drawtools.c -- helper functions called by cg_draw, cg_scoreboard, cg_info, etc #include "cg_local.h" #include "qcommon/q_shared.h" diff --git a/codemp/cgame/cg_effects.c b/codemp/cgame/cg_effects.c index 38198881de..dc0dc22b17 100644 --- a/codemp/cgame/cg_effects.c +++ b/codemp/cgame/cg_effects.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_effects.c -- these functions generate localentities, usually as a result // of event processing diff --git a/codemp/cgame/cg_ents.c b/codemp/cgame/cg_ents.c index ca4245ebb3..349e8c64c6 100644 --- a/codemp/cgame/cg_ents.c +++ b/codemp/cgame/cg_ents.c @@ -1,5 +1,27 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_ents.c -- present snapshot entities, happens every single frame #include "cg_local.h" @@ -323,7 +345,7 @@ static void CG_EntityEffects( centity_t *cent ) { // constant light glow - if ( cent->currentState.constantLight && cent->currentState.eType != ET_PLAYER && cent->currentState.eType != ET_BODY && cent->currentState.eType != ET_NPC ) { + if ( cent->currentState.constantLight && cent->currentState.eType != ET_PLAYER && cent->currentState.eType != ET_BODY && cent->currentState.eType != ET_NPC && cent->currentState.eType != ET_INVISIBLE ) { int cl; float i, r, g, b; diff --git a/codemp/cgame/cg_event.c b/codemp/cgame/cg_event.c index 8d85d36a0c..bd1046543c 100644 --- a/codemp/cgame/cg_event.c +++ b/codemp/cgame/cg_event.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_event.c -- handle entity events at snapshot or playerstate transitions #include "cg_local.h" diff --git a/codemp/cgame/cg_info.c b/codemp/cgame/cg_info.c index cddd35e85c..75342288de 100644 --- a/codemp/cgame/cg_info.c +++ b/codemp/cgame/cg_info.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_info.c -- display information while data is being loading #include "cg_local.h" diff --git a/codemp/cgame/cg_light.c b/codemp/cgame/cg_light.c index 06bd603846..976ae03918 100644 --- a/codemp/cgame/cg_light.c +++ b/codemp/cgame/cg_light.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "cg_local.h" typedef struct clightstyle_s { @@ -32,7 +54,7 @@ CG_RunLightStyles */ void CG_RunLightStyles (void) { - int ofs, i, j; + int ofs, i; clightstyle_t *ls; ofs = cg.time / 50; @@ -41,7 +63,7 @@ void CG_RunLightStyles (void) lastofs = ofs; for ( i=0, ls=cl_lightstyle; ivalue; ls->value[3] = 255; if ( !ls->length ) { @@ -60,9 +82,7 @@ void CG_RunLightStyles (void) // ls->value[3] = ls->map[ofs%ls->length][3]; } - for ( j=0; j<4; j++ ) - a.b[j] = ls->value[j]; - trap->R_SetLightStyle( i, a.i ); + trap->R_SetLightStyle( i, ba->i ); } } diff --git a/codemp/cgame/cg_local.h b/codemp/cgame/cg_local.h index c04e753526..490ec1c239 100644 --- a/codemp/cgame/cg_local.h +++ b/codemp/cgame/cg_local.h @@ -1,7 +1,29 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once -// Copyright (C) 1999-2000 Id Software, Inc. -// #include "qcommon/q_shared.h" #include "rd-common/tr_types.h" #include "game/bg_public.h" diff --git a/codemp/cgame/cg_localents.c b/codemp/cgame/cg_localents.c index c86d9a9e4e..89018a164c 100644 --- a/codemp/cgame/cg_localents.c +++ b/codemp/cgame/cg_localents.c @@ -1,5 +1,25 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ // cg_localents.c -- every frame, generate renderer commands for locally // processed entities, like smoke puffs, gibs, shells, etc. diff --git a/codemp/cgame/cg_main.c b/codemp/cgame/cg_main.c index 4f9f984db9..c6703a160c 100644 --- a/codemp/cgame/cg_main.c +++ b/codemp/cgame/cg_main.c @@ -1,5 +1,27 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_main.c -- initialization and primary entry point for cgame #include "cg_local.h" diff --git a/codemp/cgame/cg_marks.c b/codemp/cgame/cg_marks.c index ebe2a4cfc6..6106e9614e 100644 --- a/codemp/cgame/cg_marks.c +++ b/codemp/cgame/cg_marks.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_marks.c -- wall marks #include "cg_local.h" diff --git a/codemp/cgame/cg_newDraw.c b/codemp/cgame/cg_newDraw.c index 3a92344223..6fb6e93848 100644 --- a/codemp/cgame/cg_newDraw.c +++ b/codemp/cgame/cg_newDraw.c @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "cg_local.h" #include "ui/ui_shared.h" diff --git a/codemp/cgame/cg_players.c b/codemp/cgame/cg_players.c index d7fd1a7aed..84da903418 100644 --- a/codemp/cgame/cg_players.c +++ b/codemp/cgame/cg_players.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_players.c -- handle the media and animation for player entities #include "cg_local.h" #include "ghoul2/G2.h" @@ -933,7 +954,9 @@ void CG_LoadCISounds(clientInfo_t *ci, qboolean modelloaded) // if the model didn't load use the sounds of the default model if (soundpath[0]) { - ci->siegeSounds[i] = trap->S_RegisterSound( va("sound/%s/%s", soundpath, soundName) ); + ci->siegeSounds[i] = trap->S_RegisterSound( va("sound/chars/%s/misc/%s", soundpath, soundName) ); + if ( !ci->siegeSounds[i] ) + ci->siegeSounds[i] = trap->S_RegisterSound( va( "sound/%s/%s", soundpath, soundName ) ); } else { @@ -10575,9 +10598,9 @@ void CG_Player( centity_t *cent ) { savRGBA[0] = legs.shaderRGBA[0]; savRGBA[1] = legs.shaderRGBA[1]; savRGBA[2] = legs.shaderRGBA[2]; - legs.shaderRGBA[0] = max(255-subLen/4,1); - legs.shaderRGBA[1] = max(255-subLen/4,1); - legs.shaderRGBA[2] = max(255-subLen/4,1); + legs.shaderRGBA[0] = Q_max(255-subLen/4,1); + legs.shaderRGBA[1] = Q_max(255-subLen/4,1); + legs.shaderRGBA[2] = Q_max(255-subLen/4,1); legs.renderfx &= ~RF_RGB_TINT; legs.renderfx &= ~RF_FORCE_ENT_ALPHA; @@ -10587,9 +10610,9 @@ void CG_Player( centity_t *cent ) { legs.customShader = 0; //reset to player model - legs.shaderRGBA[0] = max(savRGBA[0]-subLen/8,1); - legs.shaderRGBA[1] = max(savRGBA[1]-subLen/8,1); - legs.shaderRGBA[2] = max(savRGBA[2]-subLen/8,1); + legs.shaderRGBA[0] = Q_max(savRGBA[0]-subLen/8,1); + legs.shaderRGBA[1] = Q_max(savRGBA[1]-subLen/8,1); + legs.shaderRGBA[2] = Q_max(savRGBA[2]-subLen/8,1); } if (subLen <= 1024) diff --git a/codemp/cgame/cg_playerstate.c b/codemp/cgame/cg_playerstate.c index d333031819..3fa6c36284 100644 --- a/codemp/cgame/cg_playerstate.c +++ b/codemp/cgame/cg_playerstate.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_playerstate.c -- this file acts on changes in a new playerState_t // With normal play, this will be done after local prediction, but when // following another player or playing back a demo, it will be checked @@ -195,8 +216,6 @@ void CG_Respawn( void ) { cg.weaponSelect = cg.snap->ps.weapon; } -extern char *eventnames[]; - /* ============== CG_CheckPlayerstateEvents diff --git a/codemp/cgame/cg_predict.c b/codemp/cgame/cg_predict.c index 9a2904df1c..9ef7c3e905 100644 --- a/codemp/cgame/cg_predict.c +++ b/codemp/cgame/cg_predict.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_predict.c -- this file generates cg.predictedPlayerState by either // interpolating between snapshots from the server or locally predicting // ahead the client's movement. @@ -199,11 +220,6 @@ static QINLINE qboolean CG_VehicleClipCheck(centity_t *ignored, trace_t *trace) return qtrue; } -//rww - I'm disabling this warning for this function. It complains about oldTrace but as you can see it -//always gets set before use, and I am not wasting CPU memsetting it to shut the compiler up. -#ifdef _MSC_VER -#pragma warning(disable : 4701) //local variable may be used without having been initialized -#endif /* ==================== CG_ClipMoveToEntities @@ -348,9 +364,6 @@ static void CG_ClipMoveToEntities ( const vec3_t start, const vec3_t mins, const } } } -#ifdef _MSC_VER -#pragma warning(default : 4701) //local variable may be used without having been initialized -#endif /* ================ @@ -911,9 +924,6 @@ extern vmCvar_t cg_showVehBounds; pmove_t cg_vehPmove; qboolean cg_vehPmoveSet = qfalse; -#ifdef _MSC_VER -#pragma warning(disable : 4701) //local variable may be used without having been initialized -#endif void CG_PredictPlayerState( void ) { int cmdNum, current, i; playerState_t oldPlayerState; @@ -1461,6 +1471,3 @@ void CG_PredictPlayerState( void ) { } } } -#ifdef _MSC_VER -#pragma warning(default : 4701) //local variable may be used without having been initialized -#endif diff --git a/codemp/cgame/cg_public.h b/codemp/cgame/cg_public.h index 43a3ad235c..8b32ca61dd 100644 --- a/codemp/cgame/cg_public.h +++ b/codemp/cgame/cg_public.h @@ -1,7 +1,27 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. -// Copyright (C) 1999-2000 Id Software, Inc. -// +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#pragma once #define CGAME_API_VERSION 1 diff --git a/codemp/cgame/cg_saga.c b/codemp/cgame/cg_saga.c index 12d31c5440..7f3ebdea8e 100644 --- a/codemp/cgame/cg_saga.c +++ b/codemp/cgame/cg_saga.c @@ -1,5 +1,25 @@ -// Copyright (C) 2000-2002 Raven Software, Inc. -// +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + /***************************************************************************** * name: cg_siege.c * diff --git a/codemp/cgame/cg_scoreboard.c b/codemp/cgame/cg_scoreboard.c index d353e7ea84..b46108483a 100644 --- a/codemp/cgame/cg_scoreboard.c +++ b/codemp/cgame/cg_scoreboard.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_scoreboard -- draw the scoreboard on top of the game screen #include "cg_local.h" #include "ui/ui_shared.h" diff --git a/codemp/cgame/cg_servercmds.c b/codemp/cgame/cg_servercmds.c index fe396cbb46..c37c062220 100644 --- a/codemp/cgame/cg_servercmds.c +++ b/codemp/cgame/cg_servercmds.c @@ -1,5 +1,27 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_servercmds.c -- reliably sequenced text commands sent by the server // these are processed at snapshot transition time, so there will definately // be a valid snapshot this frame diff --git a/codemp/cgame/cg_snapshot.c b/codemp/cgame/cg_snapshot.c index e774fa504d..5d7a990e0e 100644 --- a/codemp/cgame/cg_snapshot.c +++ b/codemp/cgame/cg_snapshot.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_snapshot.c -- things that happen on snapshot transition, // not necessarily every single rendered frame diff --git a/codemp/cgame/cg_spawn.c b/codemp/cgame/cg_spawn.c index b8828aecac..dd8dbed545 100644 --- a/codemp/cgame/cg_spawn.c +++ b/codemp/cgame/cg_spawn.c @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + /* ** cg_spawn.c ** diff --git a/codemp/cgame/cg_syscalls.c b/codemp/cgame/cg_syscalls.c index e6c14ab58c..36b1069d83 100644 --- a/codemp/cgame/cg_syscalls.c +++ b/codemp/cgame/cg_syscalls.c @@ -1,7 +1,28 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_syscalls.c -- this file is only included when building a dll -// cg_syscalls.asm is included instead when building a qvm #include "cg_local.h" static intptr_t (QDECL *Q_syscall)( intptr_t arg, ... ) = (intptr_t (QDECL *)( intptr_t, ...))-1; diff --git a/codemp/cgame/cg_turret.c b/codemp/cgame/cg_turret.c index 646be170c5..906cdb4455 100644 --- a/codemp/cgame/cg_turret.c +++ b/codemp/cgame/cg_turret.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "cg_local.h" #include "qcommon/q_shared.h" #include "ghoul2/G2.h" diff --git a/codemp/cgame/cg_view.c b/codemp/cgame/cg_view.c index 6cb5ca2480..492ef371bb 100644 --- a/codemp/cgame/cg_view.c +++ b/codemp/cgame/cg_view.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_view.c -- setup all the parameters (position, angle, etc) // for a 3D rendering #include "cg_local.h" diff --git a/codemp/cgame/cg_weaponinit.c b/codemp/cgame/cg_weaponinit.c index 0b231d307a..9e1d69d94c 100644 --- a/codemp/cgame/cg_weaponinit.c +++ b/codemp/cgame/cg_weaponinit.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // // cg_weaponinit.c -- events and effects dealing with weapons #include "cg_local.h" diff --git a/codemp/cgame/cg_weapons.c b/codemp/cgame/cg_weapons.c index 905e7d5ce0..acf996e3a8 100644 --- a/codemp/cgame/cg_weapons.c +++ b/codemp/cgame/cg_weapons.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cg_weapons.c -- events and effects dealing with weapons #include "cg_local.h" #include "fx_local.h" diff --git a/codemp/cgame/cg_xcvar.h b/codemp/cgame/cg_xcvar.h index 557e1f8d7b..dbed12773e 100644 --- a/codemp/cgame/cg_xcvar.h +++ b/codemp/cgame/cg_xcvar.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #ifdef XCVAR_PROTO #define XCVAR_DEF( name, defVal, update, flags ) extern vmCvar_t name; diff --git a/codemp/cgame/fx_blaster.c b/codemp/cgame/fx_blaster.c index 761796220b..d57c30bf0b 100644 --- a/codemp/cgame/fx_blaster.c +++ b/codemp/cgame/fx_blaster.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Blaster Weapon #include "cg_local.h" diff --git a/codemp/cgame/fx_bowcaster.c b/codemp/cgame/fx_bowcaster.c index 8b2c9a7459..04f966fc65 100644 --- a/codemp/cgame/fx_bowcaster.c +++ b/codemp/cgame/fx_bowcaster.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Bowcaster Weapon #include "cg_local.h" diff --git a/codemp/cgame/fx_bryarpistol.c b/codemp/cgame/fx_bryarpistol.c index e2909e9e1e..58ae911592 100644 --- a/codemp/cgame/fx_bryarpistol.c +++ b/codemp/cgame/fx_bryarpistol.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Bryar Pistol Weapon Effects #include "cg_local.h" diff --git a/codemp/cgame/fx_demp2.c b/codemp/cgame/fx_demp2.c index 238532ad0d..374c334533 100644 --- a/codemp/cgame/fx_demp2.c +++ b/codemp/cgame/fx_demp2.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // DEMP2 Weapon #include "cg_local.h" diff --git a/codemp/cgame/fx_disruptor.c b/codemp/cgame/fx_disruptor.c index 7a4e113d56..dd2d5fd183 100644 --- a/codemp/cgame/fx_disruptor.c +++ b/codemp/cgame/fx_disruptor.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Disruptor Weapon #include "cg_local.h" diff --git a/codemp/cgame/fx_flechette.c b/codemp/cgame/fx_flechette.c index e0f7c315c4..acf5dbd70a 100644 --- a/codemp/cgame/fx_flechette.c +++ b/codemp/cgame/fx_flechette.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Golan Arms Flechette Weapon #include "cg_local.h" diff --git a/codemp/cgame/fx_force.c b/codemp/cgame/fx_force.c index 06ed1fb4c2..1d6766982f 100644 --- a/codemp/cgame/fx_force.c +++ b/codemp/cgame/fx_force.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Any dedicated force oriented effects #include "cg_local.h" diff --git a/codemp/cgame/fx_heavyrepeater.c b/codemp/cgame/fx_heavyrepeater.c index e9c814e9cf..f20353980a 100644 --- a/codemp/cgame/fx_heavyrepeater.c +++ b/codemp/cgame/fx_heavyrepeater.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Heavy Repeater Weapon #include "cg_local.h" diff --git a/codemp/cgame/fx_local.h b/codemp/cgame/fx_local.h index 89a89238f2..70423ace39 100644 --- a/codemp/cgame/fx_local.h +++ b/codemp/cgame/fx_local.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // diff --git a/codemp/cgame/fx_rocketlauncher.c b/codemp/cgame/fx_rocketlauncher.c index f2d1f0aec0..10a74184c8 100644 --- a/codemp/cgame/fx_rocketlauncher.c +++ b/codemp/cgame/fx_rocketlauncher.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Rocket Launcher Weapon #include "cg_local.h" diff --git a/codemp/client/FXExport.cpp b/codemp/client/FXExport.cpp index 5427240860..ecd0c6fc0d 100644 --- a/codemp/client/FXExport.cpp +++ b/codemp/client/FXExport.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "client.h" #include "FxScheduler.h" diff --git a/codemp/client/FXExport.h b/codemp/client/FXExport.h index 3ce0231b20..b2a53a69cd 100644 --- a/codemp/client/FXExport.h +++ b/codemp/client/FXExport.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once int FX_RegisterEffect(const char *file); diff --git a/codemp/client/FxPrimitives.cpp b/codemp/client/FxPrimitives.cpp index aeddc5aef3..38818ae6c9 100644 --- a/codemp/client/FxPrimitives.cpp +++ b/codemp/client/FxPrimitives.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "client.h" #include "cl_cgameapi.h" #include "FxScheduler.h" @@ -205,88 +227,91 @@ bool CParticle::UpdateOrigin(void) // Only perform physics if this object is tagged to do so if ( (mFlags & FX_APPLY_PHYSICS) && !(mFlags & FX_PLAYER_VIEW) ) { - trace_t trace; - float dot; - - if ( mFlags & FX_USE_BBOX ) + if ( mFlags & FX_EXPENSIVE_PHYSICS ) { - if (mFlags & FX_GHOUL2_TRACE) - { - theFxHelper.G2Trace( trace, mOrigin1, mMin, mMax, new_origin, -1, MASK_SOLID ); - } - else - { - theFxHelper.Trace( trace, mOrigin1, mMin, mMax, new_origin, -1, MASK_SOLID ); - } - } - else - { - if (mFlags & FX_GHOUL2_TRACE) + trace_t trace; + float dot; + + if ( mFlags & FX_USE_BBOX ) { - theFxHelper.G2Trace( trace, mOrigin1, NULL, NULL, new_origin, -1, MASK_PLAYERSOLID ); + if (mFlags & FX_GHOUL2_TRACE) + { + theFxHelper.G2Trace( trace, mOrigin1, mMin, mMax, new_origin, -1, MASK_SOLID ); + } + else + { + theFxHelper.Trace( trace, mOrigin1, mMin, mMax, new_origin, -1, MASK_SOLID ); + } } else { - theFxHelper.Trace( trace, mOrigin1, NULL, NULL, new_origin, -1, MASK_SOLID ); + if (mFlags & FX_GHOUL2_TRACE) + { + theFxHelper.G2Trace( trace, mOrigin1, NULL, NULL, new_origin, -1, MASK_PLAYERSOLID ); + } + else + { + theFxHelper.Trace( trace, mOrigin1, NULL, NULL, new_origin, -1, MASK_SOLID ); + } } - } - - // Hit something - if (trace.startsolid || trace.allsolid) - { - VectorClear( mVel ); - VectorClear( mAccel ); - if ((mFlags & FX_GHOUL2_TRACE) && (mFlags & FX_IMPACT_RUNS_FX)) + // Hit something + if (trace.startsolid || trace.allsolid) { - static vec3_t bsNormal = {0, 1, 0}; + VectorClear( mVel ); + VectorClear( mAccel ); - theFxScheduler.PlayEffect( mImpactFxID, trace.endpos, bsNormal ); - } + if ((mFlags & FX_GHOUL2_TRACE) && (mFlags & FX_IMPACT_RUNS_FX)) + { + static vec3_t bsNormal = {0, 1, 0}; - mFlags &= ~(FX_APPLY_PHYSICS | FX_IMPACT_RUNS_FX); + theFxScheduler.PlayEffect( mImpactFxID, trace.endpos, bsNormal ); + } - return true; - } - else if ( trace.fraction < 1.0f )//&& !trace.startsolid && !trace.allsolid ) - { - if ( mFlags & FX_IMPACT_RUNS_FX && !(trace.surfaceFlags & SURF_NOIMPACT )) - { - theFxScheduler.PlayEffect( mImpactFxID, trace.endpos, trace.plane.normal ); + mFlags &= ~(FX_APPLY_PHYSICS | FX_IMPACT_RUNS_FX); + + return true; } + else if ( trace.fraction < 1.0f )//&& !trace.startsolid && !trace.allsolid ) + { + if ( mFlags & FX_IMPACT_RUNS_FX && !(trace.surfaceFlags & SURF_NOIMPACT )) + { + theFxScheduler.PlayEffect( mImpactFxID, trace.endpos, trace.plane.normal ); + } - // may need to interact with the material type we hit - theFxScheduler.MaterialImpact(&trace, (CEffect*)this); + // may need to interact with the material type we hit + theFxScheduler.MaterialImpact(&trace, (CEffect*)this); - if ( mFlags & FX_KILL_ON_IMPACT ) - { - // time to die - return false; - } + if ( mFlags & FX_KILL_ON_IMPACT ) + { + // time to die + return false; + } - VectorMA( mVel, theFxHelper.mRealTime * trace.fraction, mAccel, mVel ); + VectorMA( mVel, theFxHelper.mRealTime * trace.fraction, mAccel, mVel ); - dot = DotProduct( mVel, trace.plane.normal ); + dot = DotProduct( mVel, trace.plane.normal ); - VectorMA( mVel, -2.0f * dot, trace.plane.normal, mVel ); + VectorMA( mVel, -2.0f * dot, trace.plane.normal, mVel ); - VectorScale( mVel, mElasticity, mVel ); - mElasticity *= 0.5f; + VectorScale( mVel, mElasticity, mVel ); + mElasticity *= 0.5f; - // If the velocity is too low, make it stop moving, rotating, and turn off physics to avoid - // doing expensive operations when they aren't needed - //if ( trace.plane.normal[2] > 0.33f && mVel[2] < 10.0f ) - if (VectorLengthSquared(mVel) < 100.0f) - { - VectorClear( mVel ); - VectorClear( mAccel ); + // If the velocity is too low, make it stop moving, rotating, and turn off physics to avoid + // doing expensive operations when they aren't needed + //if ( trace.plane.normal[2] > 0.33f && mVel[2] < 10.0f ) + if (VectorLengthSquared(mVel) < 100.0f) + { + VectorClear( mVel ); + VectorClear( mAccel ); - mFlags &= ~(FX_APPLY_PHYSICS | FX_IMPACT_RUNS_FX); - } + mFlags &= ~(FX_APPLY_PHYSICS | FX_IMPACT_RUNS_FX); + } - // Set the origin to the exact impact point - VectorMA( trace.endpos, 1.0f, trace.plane.normal, mOrigin1 ); - return true; + // Set the origin to the exact impact point + VectorMA( trace.endpos, 1.0f, trace.plane.normal, mOrigin1 ); + return true; + } } } diff --git a/codemp/client/FxPrimitives.h b/codemp/client/FxPrimitives.h index 62be3817d4..b04ccf5a59 100644 --- a/codemp/client/FxPrimitives.h +++ b/codemp/client/FxPrimitives.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "FxSystem.h" diff --git a/codemp/client/FxScheduler.cpp b/codemp/client/FxScheduler.cpp index 805ed6c9ba..f4decbd84b 100644 --- a/codemp/client/FxScheduler.cpp +++ b/codemp/client/FxScheduler.cpp @@ -1,13 +1,33 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "client.h" #include "cl_cgameapi.h" #include "FxScheduler.h" #include "qcommon/q_shared.h" -#ifndef _WIN32 #include #include #include -#endif CFxScheduler theFxScheduler; @@ -216,7 +236,7 @@ void CFxScheduler::Clean(bool bRemoveTemplates /*= true*/, int idToPreserve /*= { // Clear the effect names, but first get the name of the effect to preserve, // and restore it after clearing. - string str; + std::string str; TEffectID::iterator iter; for (iter = mEffectIDs.begin(); iter != mEffectIDs.end(); ++iter) @@ -257,12 +277,9 @@ int CFxScheduler::RegisterEffect( const char *file, bool bHasCorrectPath /*= fal char sfile[MAX_QPATH]; COM_StripExtension( file, sfile, sizeof( sfile ) ); -#ifdef _WIN32 - strlwr(sfile); -#else - string s = sfile; + + std::string s = sfile; transform(s.begin(), s.end(), s.begin(), ::tolower); -#endif Com_DPrintf("Registering effect : %s\n", sfile); @@ -283,10 +300,10 @@ int CFxScheduler::RegisterEffect( const char *file, bool bHasCorrectPath /*= fal char *bufParse = 0; // if our file doesn't have an extension, add one - string finalFilename = file; - string effectsSubstr = finalFilename.substr(0, 7); + std::string finalFilename = file; + std::string effectsSubstr = finalFilename.substr(0, 7); - if (finalFilename.find('.') == string::npos) + if (finalFilename.find('.') == std::string::npos) { // didn't find an extension so add one finalFilename += ".efx"; @@ -296,7 +313,7 @@ int CFxScheduler::RegisterEffect( const char *file, bool bHasCorrectPath /*= fal if (effectsSubstr.compare("effects") != 0) { //theFxHelper.Print("Hey!!! '%s' should be pathed from the base directory!!!\n", finalFilename.c_str()); - string strTemp = finalFilename; + std::string strTemp = finalFilename; finalFilename = "effects/"; finalFilename += strTemp; } @@ -994,7 +1011,7 @@ void CFxScheduler::PlayEffect( const char *file, vec3_t origin, int vol, int rad char sfile[MAX_QPATH]; // Get an extenstion stripped version of the file - COM_StripExtension( file, sfile ); + COM_StripExtension( file, sfile, sizeof(sfile) ); PlayEffect( mEffectIDs[sfile], origin, vol, rad ); } diff --git a/codemp/client/FxScheduler.h b/codemp/client/FxScheduler.h index 9e61a3cc11..a7950c118e 100644 --- a/codemp/client/FxScheduler.h +++ b/codemp/client/FxScheduler.h @@ -1,22 +1,35 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "FxUtil.h" #include "qcommon/GenericParser2.h" -#ifdef _MSC_VER -#pragma warning (push, 3) //go back down to 3 for the stl include -#endif #include #include #include #include #include -#ifdef _MSC_VER -#pragma warning (pop) -#endif - -using namespace std; - #define FX_FILE_PATH "effects" @@ -65,7 +78,7 @@ class CMediaHandles { private: - vector mMediaList; + std::vector mMediaList; public: @@ -385,7 +398,7 @@ class PoolAllocator std::rotate (freeAndAllocated, freeAndAllocated + 1, freeAndAllocated + N); numFree--; - highWatermark = max (highWatermark, N - numFree); + highWatermark = Q_max(highWatermark, N - numFree); return ptr; } @@ -601,9 +614,9 @@ class CFxScheduler }; // this makes looking up the index based on the string name much easier - typedef map TEffectID; + typedef std::map TEffectID; - typedef list TScheduledEffect; + typedef std::list TScheduledEffect; // Effects SEffectTemplate mEffectTemplates[FX_MAX_EFFECTS]; diff --git a/codemp/client/FxSystem.cpp b/codemp/client/FxSystem.cpp index e0fd986200..79fb2f83d0 100644 --- a/codemp/client/FxSystem.cpp +++ b/codemp/client/FxSystem.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "client.h" #include "cl_cgameapi.h" #include "FxScheduler.h" diff --git a/codemp/client/FxSystem.h b/codemp/client/FxSystem.h index a719745b26..38ea37d656 100644 --- a/codemp/client/FxSystem.h +++ b/codemp/client/FxSystem.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "client/cl_cgameapi.h" diff --git a/codemp/client/FxTemplate.cpp b/codemp/client/FxTemplate.cpp index ece4fed71f..83f404c94c 100644 --- a/codemp/client/FxTemplate.cpp +++ b/codemp/client/FxTemplate.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "client.h" #include "FxScheduler.h" diff --git a/codemp/client/FxUtil.cpp b/codemp/client/FxUtil.cpp index af8d1009fd..f98e87e93c 100644 --- a/codemp/client/FxUtil.cpp +++ b/codemp/client/FxUtil.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "client.h" #include "FxScheduler.h" diff --git a/codemp/client/FxUtil.h b/codemp/client/FxUtil.h index 92ec558f9a..54d01559c8 100644 --- a/codemp/client/FxUtil.h +++ b/codemp/client/FxUtil.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "FxPrimitives.h" diff --git a/codemp/client/cl_avi.cpp b/codemp/client/cl_avi.cpp index d4e711cf81..2a8c268390 100644 --- a/codemp/client/cl_avi.cpp +++ b/codemp/client/cl_avi.cpp @@ -455,12 +455,12 @@ static qboolean CL_CheckFileSize( int bytesToAdd ) if ( newFileSize > INT_MAX ) { // Close the current file... - CL_CloseAVI(); + CL_CloseAVI(); - // ...And open a new one - CL_OpenAVIForWriting( va( "%s_", afd.fileName ) ); + // ...And open a new one + CL_OpenAVIForWriting( va( "%s_", afd.fileName ) ); - return qtrue; + return qtrue; } } diff --git a/codemp/client/cl_cgame.cpp b/codemp/client/cl_cgame.cpp index cbcffbc249..65a96f4366 100644 --- a/codemp/client/cl_cgame.cpp +++ b/codemp/client/cl_cgame.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cl_cgame.c -- client system interaction with client game #include "client.h" #include "cl_cgameapi.h" @@ -161,16 +184,6 @@ void CL_SetUserCmdValue( int userCmdValue, float sensitivityScale, float mPitchO cl.cgameInvenSelection = invenSel; } -/* -===================== -CL_CgameError -===================== -*/ -void CL_CgameError( const char *string ) { - Com_Error( ERR_DROP, "%s", string ); -} - - int gCLTotalClientNum = 0; //keep track of the total number of clients extern cvar_t *cl_autolodscale; diff --git a/codemp/client/cl_cgameapi.cpp b/codemp/client/cl_cgameapi.cpp index 1dba300eb7..4d90f44772 100644 --- a/codemp/client/cl_cgameapi.cpp +++ b/codemp/client/cl_cgameapi.cpp @@ -1,3 +1,23 @@ +/* +=========================================================================== +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cl_cgameapi.cpp -- client system interaction with client game #include "qcommon/cm_public.h" #include "qcommon/RoffSystem.h" @@ -1627,7 +1647,7 @@ void CL_BindCGame( void ) { static cgameImport_t cgi; cgameExport_t *ret; GetCGameAPI_t GetCGameAPI; - char dllName[MAX_OSPATH] = "cgame"ARCH_STRING DLL_EXT; + char dllName[MAX_OSPATH] = "cgame" ARCH_STRING DLL_EXT; memset( &cgi, 0, sizeof( cgi ) ); diff --git a/codemp/client/cl_cgameapi.h b/codemp/client/cl_cgameapi.h index 9c5538b8d4..b4f9933e28 100644 --- a/codemp/client/cl_cgameapi.h +++ b/codemp/client/cl_cgameapi.h @@ -1,3 +1,23 @@ +/* +=========================================================================== +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once void CGVM_Init ( int serverMessageNum, int serverCommandSequence, int clientNum ); diff --git a/codemp/client/cl_cin.cpp b/codemp/client/cl_cin.cpp index b23c890528..343dc0d87a 100644 --- a/codemp/client/cl_cin.cpp +++ b/codemp/client/cl_cin.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + /***************************************************************************** * name: cl_cin.c * diff --git a/codemp/client/cl_console.cpp b/codemp/client/cl_console.cpp index d953cd990f..fad2bf9fc9 100644 --- a/codemp/client/cl_console.cpp +++ b/codemp/client/cl_console.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // console.c #include "client.h" diff --git a/codemp/client/cl_input.cpp b/codemp/client/cl_input.cpp index 139a625f43..3c98abff7d 100644 --- a/codemp/client/cl_input.cpp +++ b/codemp/client/cl_input.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cl.input.c -- builds an intended movement command to send to the server #include "client.h" @@ -948,18 +971,6 @@ void CL_JoystickMove( usercmd_t *cmd ) { return; } -#ifdef _WIN32 - if( in_joystick->integer == 2 ) - { - if(abs(cl.joystickAxis[AXIS_FORWARD]) >= 30) cmd->forwardmove = cl.joystickAxis[AXIS_FORWARD]; - if(abs(cl.joystickAxis[AXIS_SIDE]) >= 30) cmd->rightmove = cl.joystickAxis[AXIS_SIDE]; - anglespeed = 0.001 * cls.frametime * cl_anglespeedkey->value; - cl.viewangles[YAW] -= (cl_yawspeed->value / 100.0f) * (cl.joystickAxis[AXIS_YAW]/1024.0f); - cl.viewangles[PITCH] += (cl_pitchspeed->value / 100.0f) * (cl.joystickAxis[AXIS_PITCH]/1024.0f); - } - else - { -#endif if ( !(in_speed.active ^ cl_run->integer) ) { cmd->buttons |= BUTTON_WALKING; } @@ -986,7 +997,8 @@ void CL_JoystickMove( usercmd_t *cmd ) { { cl.viewangles[YAW] += anglespeed * (cl_yawspeed->value / 100.0f) * cl.joystickAxis[AXIS_SIDE]; } - } else + } + else { cmd->rightmove = ClampChar( cmd->rightmove + cl.joystickAxis[AXIS_SIDE] ); } @@ -1013,9 +1025,6 @@ void CL_JoystickMove( usercmd_t *cmd ) { } cmd->upmove = ClampChar( cmd->upmove + cl.joystickAxis[AXIS_UP] ); -#ifdef _WIN32 - } -#endif } /* @@ -1440,10 +1449,11 @@ qboolean CL_ReadyToSendPacket( void ) { } // check for exceeding cl_maxpackets - if ( cl_maxpackets->integer < 15 ) { - Cvar_Set( "cl_maxpackets", "15" ); - } else if ( cl_maxpackets->integer > 100 ) { - Cvar_Set( "cl_maxpackets", "100" ); + if ( cl_maxpackets->integer < 20 ) { + Cvar_Set( "cl_maxpackets", "20" ); + } + else if ( cl_maxpackets->integer > 1000 ) { + Cvar_Set( "cl_maxpackets", "1000" ); } oldPacketNum = (clc.netchan.outgoingSequence - 1) & PACKET_MASK; delta = cls.realtime - cl.outPackets[ oldPacketNum ].p_realtime; diff --git a/codemp/client/cl_keys.cpp b/codemp/client/cl_keys.cpp index 6baf3b72af..93fb8df96e 100644 --- a/codemp/client/cl_keys.cpp +++ b/codemp/client/cl_keys.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "client.h" #include "cl_cgameapi.h" #include "cl_uiapi.h" @@ -467,19 +491,19 @@ Field_Paste ================ */ void Field_Paste( field_t *edit ) { - char *cbd; - int pasteLen, i; + char *cbd, *c; - cbd = Sys_GetClipboardData(); + c = cbd = Sys_GetClipboardData(); if ( !cbd ) { return; } // send as if typed, so insert / overstrike works properly - pasteLen = strlen( cbd ); - for ( i = 0 ; i < pasteLen ; i++ ) { - Field_CharEvent( edit, cbd[i] ); + while( *c ) + { + uint32_t utf32 = ConvertUTF8ToUTF32( c, &c ); + Field_CharEvent( edit, ConvertUTF32ToExpectedCharset( utf32 ) ); } Z_Free( cbd ); @@ -1061,7 +1085,7 @@ void Key_Bind_f( void ) { if ( c == 2 ) { if ( kg.keys[b].binding && kg.keys[b].binding[0] ) - Com_Printf( S_COLOR_GREY"Bind "S_COLOR_WHITE"%s = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\""S_COLOR_WHITE"\n", Key_KeynumToString( b ), kg.keys[b].binding ); + Com_Printf( S_COLOR_GREY "Bind " S_COLOR_WHITE "%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", Key_KeynumToString( b ), kg.keys[b].binding ); else Com_Printf( "\"%s\" is not bound\n", Key_KeynumToString( b ) ); return; @@ -1101,7 +1125,7 @@ Key_Bindlist_f void Key_Bindlist_f( void ) { for ( size_t i=0; i. +=========================================================================== +*/ + #include "client.h" // This is for compatibility of old servercache only diff --git a/codemp/client/cl_lan.h b/codemp/client/cl_lan.h index cfa48fb974..3579e1b162 100644 --- a/codemp/client/cl_lan.h +++ b/codemp/client/cl_lan.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once void LAN_LoadCachedServers( ); diff --git a/codemp/client/cl_main.cpp b/codemp/client/cl_main.cpp index 83ebe24d8b..3a13e13298 100644 --- a/codemp/client/cl_main.cpp +++ b/codemp/client/cl_main.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cl_main.c -- client main loop #include "client.h" @@ -11,11 +35,7 @@ #include "cl_uiapi.h" #include "cl_lan.h" #include "snd_local.h" - -#ifndef _WIN32 #include "sys/sys_loadlib.h" -#include "sys/sys_local.h" -#endif cvar_t *cl_renderer; @@ -75,9 +95,7 @@ cvar_t *cl_guidServerUniq; cvar_t *cl_autolodscale; -#ifndef _WIN32 cvar_t *cl_consoleKeys; -#endif cvar_t *cl_lanForcePackets; @@ -2110,8 +2128,8 @@ void CL_Frame ( int msec ) { // if recording an avi, lock to a fixed fps if ( CL_VideoRecording( ) && cl_aviFrameRate->integer && msec) { if ( cls.state == CA_ACTIVE || cl_forceavidemo->integer) { - float fps = min(cl_aviFrameRate->value * com_timescale->value, 1000.0f); - float frameDuration = max(1000.0f / fps, 1.0f) + clc.aviVideoFrameRemainder; + float fps = Q_min(cl_aviFrameRate->value * com_timescale->value, 1000.0f); + float frameDuration = Q_max(1000.0f / fps, 1.0f) + clc.aviVideoFrameRemainder; takeVideoFrame = qtrue; msec = (int)frameDuration; @@ -2195,7 +2213,6 @@ CL_RefPrintf DLL glue ================ */ -#define MAXPRINTMSG 4096 void QDECL CL_RefPrintf( int print_level, const char *fmt, ...) { va_list argptr; char msg[MAXPRINTMSG]; @@ -2300,11 +2317,6 @@ CL_InitRef */ qboolean Com_TheHunkMarkHasBeenMade(void); -#ifdef _WIN32 - //win32/win_main.cpp - #include "win32/win_local.h" - extern WinVars_t g_wv; -#endif //qcommon/cm_load.cpp extern void *gpvCachedMapDiskImage; extern qboolean gbUsingCachedMapDataRightNow; @@ -2312,9 +2324,6 @@ extern qboolean gbUsingCachedMapDataRightNow; static char *GetSharedMemory( void ) { return cl.mSharedMemory; } static vm_t *GetCurrentVM( void ) { return currentVM; } static qboolean CGVMLoaded( void ) { return (qboolean)cls.cgameStarted; } -#ifdef _WIN32 - static void *GetWinVars( void ) { return (void *)&g_wv; } -#endif static void *CM_GetCachedMapDiskImage( void ) { return gpvCachedMapDiskImage; } static void CM_SetCachedMapDiskImage( void *ptr ) { gpvCachedMapDiskImage = ptr; } static void CM_SetUsingCache( qboolean usingCache ) { gbUsingCachedMapDataRightNow = usingCache; } @@ -2426,15 +2435,12 @@ void CL_InitRef( void ) { ri.CGVMLoaded = CGVMLoaded; ri.CGVM_RagCallback = CGVM_RagCallback; - // ugly win32 backend -#ifdef _WIN32 - ri.GetWinVars = GetWinVars; -#endif -#ifndef _WIN32 - ri.IN_Init = IN_Init; - ri.IN_Shutdown = IN_Shutdown; - ri.IN_Restart = IN_Restart; -#endif + ri.WIN_Init = WIN_Init; + ri.WIN_SetGamma = WIN_SetGamma; + ri.WIN_Shutdown = WIN_Shutdown; + ri.WIN_Present = WIN_Present; + ri.GL_GetProcAddress = WIN_GL_GetProcAddress; + ri.CM_GetCachedMapDiskImage = CM_GetCachedMapDiskImage; ri.CM_SetCachedMapDiskImage = CM_SetCachedMapDiskImage; ri.CM_SetUsingCache = CM_SetUsingCache; @@ -2733,10 +2739,8 @@ void CL_Init( void ) { cl_guidServerUniq = Cvar_Get ("cl_guidServerUniq", "1", CVAR_ARCHIVE); -#ifndef _WIN32 // ~ and `, as keys and characters cl_consoleKeys = Cvar_Get( "cl_consoleKeys", "~ ` 0x7e 0x60", CVAR_ARCHIVE); -#endif // userinfo Cvar_Get ("name", "Padawan", CVAR_USERINFO | CVAR_ARCHIVE ); diff --git a/codemp/client/cl_net_chan.cpp b/codemp/client/cl_net_chan.cpp index 5ac02a13ff..d34317bbad 100644 --- a/codemp/client/cl_net_chan.cpp +++ b/codemp/client/cl_net_chan.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "client.h" // TTimo: unused, commenting out to make gcc happy diff --git a/codemp/client/cl_parse.cpp b/codemp/client/cl_parse.cpp index a48fa0babe..53d47f66e2 100644 --- a/codemp/client/cl_parse.cpp +++ b/codemp/client/cl_parse.cpp @@ -1,9 +1,38 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cl_parse.c -- parse a message received from the server #include "client.h" #include "cl_cgameapi.h" #include "qcommon/stringed_ingame.h" + +#ifdef USE_INTERNAL_ZLIB #include "zlib/zlib.h" +#else +#include +#endif static char hiddenCvarVal[128]; @@ -408,7 +437,7 @@ void CL_SystemInfoChanged( void ) { // NOTE TTimo: // when the serverId changes, any further messages we send to the server will use this new serverId // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=475 - // in some cases, outdated cp commands might get sent with this news serverId + // in some cases, outdated cp commands might get sent with this new serverId cl.serverId = atoi( Info_ValueForKey( systemInfo, "sv_serverid" ) ); // don't set any vars when playing a demo diff --git a/codemp/client/cl_scrn.cpp b/codemp/client/cl_scrn.cpp index eb93f0ca3a..58d7ca17a8 100644 --- a/codemp/client/cl_scrn.cpp +++ b/codemp/client/cl_scrn.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cl_scrn.c -- master for refresh, status bar, console, chat, notify, etc #include "client.h" @@ -393,16 +417,6 @@ void SCR_DrawScreenField( stereoFrame_t stereoFrame ) { qboolean uiFullscreen = (qboolean)(cls.uiStarted && UIVM_IsFullscreen()); - // wide aspect ratio screens need to have the sides cleared - // unless they are displaying game renderings - if ( uiFullscreen || (cls.state != CA_ACTIVE && cls.state != CA_CINEMATIC) ) { - if ( cls.glconfig.vidWidth * 480 > cls.glconfig.vidHeight * 640 ) { - re->SetColor( g_color_table[0] ); - re->DrawStretchPic( 0, 0, cls.glconfig.vidWidth, cls.glconfig.vidHeight, 0, 0, 0, 0, cls.whiteShader ); - re->SetColor( NULL ); - } - } - if ( !cls.uiStarted ) { Com_DPrintf("draw screen without UI loaded\n"); return; diff --git a/codemp/client/cl_ui.cpp b/codemp/client/cl_ui.cpp index 2d5a5445fe..76feaffae7 100644 --- a/codemp/client/cl_ui.cpp +++ b/codemp/client/cl_ui.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "client.h" #include "cl_uiapi.h" diff --git a/codemp/client/cl_uiapi.cpp b/codemp/client/cl_uiapi.cpp index 47002e0e37..8921aa610c 100644 --- a/codemp/client/cl_uiapi.cpp +++ b/codemp/client/cl_uiapi.cpp @@ -1,3 +1,23 @@ +/* +=========================================================================== +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cl_uiapi.c -- client system interaction with client game #include "qcommon/RoffSystem.h" #include "qcommon/stringed_ingame.h" @@ -138,16 +158,19 @@ static void CL_GetGlconfig( glconfig_t *config ) { } static void GetClipboardData( char *buf, int buflen ) { - char *cbd; - - cbd = Sys_GetClipboardData(); + char *cbd, *c; + c = cbd = Sys_GetClipboardData(); if ( !cbd ) { *buf = 0; return; } - Q_strncpyz( buf, cbd, buflen ); + for ( int i = 0, end = buflen - 1; *c && i < end; i++ ) + { + uint32_t utf32 = ConvertUTF8ToUTF32( c, &c ); + buf[i] = ConvertUTF32ToExpectedCharset( utf32 ); + } Z_Free( cbd ); } @@ -1021,7 +1044,7 @@ void CL_BindUI( void ) { static uiImport_t uii; uiExport_t *ret; GetUIAPI_t GetUIAPI; - char dllName[MAX_OSPATH] = "ui"ARCH_STRING DLL_EXT; + char dllName[MAX_OSPATH] = "ui" ARCH_STRING DLL_EXT; memset( &uii, 0, sizeof( uii ) ); diff --git a/codemp/client/cl_uiapi.h b/codemp/client/cl_uiapi.h index 17a77d0fb0..21760ddd1d 100644 --- a/codemp/client/cl_uiapi.h +++ b/codemp/client/cl_uiapi.h @@ -1,3 +1,23 @@ +/* +=========================================================================== +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once void UIVM_Init ( qboolean inGameLoad ); diff --git a/codemp/client/client.h b/codemp/client/client.h index 96a39f3180..641e804073 100644 --- a/codemp/client/client.h +++ b/codemp/client/client.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // client.h -- primary header for client @@ -385,9 +408,7 @@ extern cvar_t *cl_allowAltEnter; extern cvar_t *cl_conXOffset; extern cvar_t *cl_inGameVideo; -#ifndef _WIN32 extern cvar_t *cl_consoleKeys; -#endif extern cvar_t *cl_lanForcePackets; diff --git a/codemp/client/keys.h b/codemp/client/keys.h index a676e85ed4..b7066d6c19 100644 --- a/codemp/client/keys.h +++ b/codemp/client/keys.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "ui/keycodes.h" diff --git a/codemp/client/snd_ambient.cpp b/codemp/client/snd_ambient.cpp index 7c43befc76..b30e63a17b 100644 --- a/codemp/client/snd_ambient.cpp +++ b/codemp/client/snd_ambient.cpp @@ -1,8 +1,27 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Ambient Sound System (ASS!) -#ifdef _MSC_VER -#pragma warning ( disable : 4710 ) //not inlined -#endif #include "client.h" #include "snd_ambient.h" #include "snd_local.h" @@ -34,7 +53,7 @@ static int parsePos = 0; static char tempBuffer[1024]; //NOTENOTE: Be sure to change the mirrored code in g_spawn.cpp, and cg_main.cpp -typedef map namePrecache_m; +typedef std::map namePrecache_m; static namePrecache_m* pMap = NULL; // Used for enum / string matching @@ -70,8 +89,8 @@ static const char *keywordNames[NUM_AS_KEYWORDS]= CSetGroup::CSetGroup(void) { - m_ambientSets = new vector; - m_setMap = new map; + m_ambientSets = new std::vector; + m_setMap = new std::map; m_numSets = 0; } @@ -90,7 +109,7 @@ Free void CSetGroup::Free( void ) { - vector < ambientSet_t * >::iterator ai; + std::vector < ambientSet_t * >::iterator ai; for ( ai = m_ambientSets->begin(); ai != m_ambientSets->end(); ++ai ) { @@ -100,8 +119,8 @@ void CSetGroup::Free( void ) //Do this in place of clear() so it *really* frees the memory. delete m_ambientSets; delete m_setMap; - m_ambientSets = new vector; - m_setMap = new map; + m_ambientSets = new std::vector; + m_setMap = new std::map; m_numSets = 0; } @@ -148,7 +167,7 @@ GetSet ambientSet_t *CSetGroup::GetSet( const char *name ) { - map < sstring_t, ambientSet_t *>::iterator mi; + std::map < sstring_t, ambientSet_t *>::iterator mi; if ( name == NULL ) return NULL; diff --git a/codemp/client/snd_ambient.h b/codemp/client/snd_ambient.h index c04459099a..fb0315b6b7 100644 --- a/codemp/client/snd_ambient.h +++ b/codemp/client/snd_ambient.h @@ -1,30 +1,30 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. -// Includes +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -#ifdef _MSC_VER -#pragma warning ( disable : 4786 ) -#pragma warning ( disable : 4511 ) //copy constructor could not be gen -#pragma warning ( disable : 4512 ) //assign constructor could not be gen +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ -//these don't work because stl re-sets them -//#pragma warning ( disable : 4663 ) //spcialize class -//#pragma warning ( disable : 4018 ) //signed/unsigned -#pragma warning (disable:4503) // decorated name length xceeded, name was truncated -#pragma warning (push, 3) //go back down to 3 for the stl include -#endif +#pragma once #include "qcommon/sstring.h" // #include #include #include -#ifdef _MSC_VER -#pragma warning (pop) -#pragma warning (disable:4503) // decorated name length xceeded, name was truncated -#endif - -using namespace std; - -// Defines #define AMBIENT_SET_FILENAME "sound/sound.txt" @@ -102,8 +102,8 @@ class CSetGroup protected: int m_numSets; - vector < ambientSet_t * > *m_ambientSets; - map < sstring_t, ambientSet_t * > *m_setMap; + std::vector < ambientSet_t * > *m_ambientSets; + std::map < sstring_t, ambientSet_t * > *m_setMap; }; // Prototypes diff --git a/codemp/client/snd_dma.cpp b/codemp/client/snd_dma.cpp index 7c756c5a4f..65b587ef69 100644 --- a/codemp/client/snd_dma.cpp +++ b/codemp/client/snd_dma.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + /***************************************************************************** * name: snd_dma.c * @@ -12,6 +35,10 @@ #define __STDC_FORMAT_MACROS #include +#if defined(_WIN32) +#include +#endif + qboolean s_shutUp = qfalse; static void S_Play_f(void); @@ -2116,7 +2143,7 @@ S_RawSamples Music streaming ============ */ -void S_RawSamples( int samples, int rate, int width, int s_channels, const byte *data, float volume, int bFirstOrOnlyUpdateThisFrame ) +void S_RawSamples( int samples, int rate, int width, int channels, const byte *data, float volume, int bFirstOrOnlyUpdateThisFrame ) { int i; int src, dst; @@ -2137,7 +2164,7 @@ void S_RawSamples( int samples, int rate, int width, int s_channels, const byte scale = (float)rate / dma.speed; //Com_Printf ("%i < %i < %i\n", s_soundtime, s_paintedtime, s_rawend); - if (s_channels == 2 && width == 2) + if (channels == 2 && width == 2) { if (scale == 1.0) { // optimized case @@ -2192,7 +2219,7 @@ void S_RawSamples( int samples, int rate, int width, int s_channels, const byte } } } - else if (s_channels == 1 && width == 2) + else if (channels == 1 && width == 2) { if (bFirstOrOnlyUpdateThisFrame) { @@ -2221,7 +2248,7 @@ void S_RawSamples( int samples, int rate, int width, int s_channels, const byte } } } - else if (s_channels == 2 && width == 1) + else if (channels == 2 && width == 1) { intVolume *= 256; @@ -2252,7 +2279,7 @@ void S_RawSamples( int samples, int rate, int width, int s_channels, const byte } } } - else if (s_channels == 1 && width == 1) + else if (channels == 1 && width == 1) { intVolume *= 256; @@ -2773,8 +2800,8 @@ void S_GetSoundtime(void) if( CL_VideoRecording( ) ) { - float fps = min(cl_aviFrameRate->value, 1000.0f); - float frameDuration = max(dma.speed / fps, 1.0f) + clc.aviSoundFrameRemainder; + float fps = Q_min(cl_aviFrameRate->value, 1000.0f); + float frameDuration = Q_max(dma.speed / fps, 1.0f) + clc.aviSoundFrameRemainder; int msec = (int)frameDuration; s_soundtime += msec; clc.aviSoundFrameRemainder = frameDuration - msec; @@ -6037,7 +6064,7 @@ void UpdateEAXListener() float flSin = (float)sin(-flTheta); float flCos = (float)cos(-flTheta); - for (i = 0; i < min(s_NumFXSlots,s_lNumEnvironments); i++) + for (i = 0; i < Q_min(s_NumFXSlots,s_lNumEnvironments); i++) { if (s_FXSlotInfo[i].lEnvID == s_EnvironmentID) { diff --git a/codemp/client/snd_local.h b/codemp/client/snd_local.h index 6e24f5bd55..bdd8d99475 100644 --- a/codemp/client/snd_local.h +++ b/codemp/client/snd_local.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // snd_local.h -- private sound definations @@ -5,7 +28,7 @@ #include "snd_public.h" #include "mp3code/mp3struct.h" -#if defined(_WIN32) && !defined(WIN64) +#if defined(_MSC_VER) && !defined(WIN64) #define USE_OPENAL #endif diff --git a/codemp/client/snd_mem.cpp b/codemp/client/snd_mem.cpp index 092eb276fb..0b6d8b938c 100644 --- a/codemp/client/snd_mem.cpp +++ b/codemp/client/snd_mem.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // snd_mem.c: sound caching #include "snd_local.h" @@ -292,7 +315,7 @@ int iFilesUpdated; int iErrors; qboolean qbForceRescan; qboolean qbForceStereo; -string strErrors; +std::string strErrors; void R_CheckMP3s( const char *psDir ) { diff --git a/codemp/client/snd_mix.cpp b/codemp/client/snd_mix.cpp index e7ca35cf44..52dab4422f 100644 --- a/codemp/client/snd_mix.cpp +++ b/codemp/client/snd_mix.cpp @@ -1,7 +1,28 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // snd_mix.c -- portable code to mix sounds for snd_dma.c -// leave this as first line for PCH reasons... -// #include "client.h" #include "snd_local.h" @@ -12,7 +33,7 @@ short *snd_out; // FIXME: proper fix for that ? -#if defined __linux__ || defined MACOS_X || !id386 +#if !defined(_MSC_VER) || !id386 void S_WriteLinearBlastStereo16 (void) { int i; diff --git a/codemp/client/snd_mp3.cpp b/codemp/client/snd_mp3.cpp index d6d6e36540..452d21082a 100644 --- a/codemp/client/snd_mp3.cpp +++ b/codemp/client/snd_mp3.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Filename:- cl_mp3.cpp // // (The interface module between all the MP3 stuff and the game) diff --git a/codemp/client/snd_mp3.h b/codemp/client/snd_mp3.h index bec5f2ff49..20abb91feb 100644 --- a/codemp/client/snd_mp3.h +++ b/codemp/client/snd_mp3.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // Filename:- cl_mp3.h diff --git a/codemp/client/snd_music.cpp b/codemp/client/snd_music.cpp index c7d07e3b44..686209c46c 100644 --- a/codemp/client/snd_music.cpp +++ b/codemp/client/snd_music.cpp @@ -1,31 +1,40 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Filename:- snd_music.cpp // // Stuff to parse in special x-fade music format and handle blending etc -#include "qcommon/q_shared.h" - -#ifndef _WIN32 +#include #include -#endif +#include "qcommon/q_shared.h" #include "qcommon/sstring.h" - -#ifdef _MSC_VER -#pragma warning ( disable : 4663 ) //spcialize class -#pragma warning( push, 3 ) -#endif -#include -#ifdef _MSC_VER -#pragma warning (pop) -#endif +#include "qcommon/GenericParser2.h" #include "snd_local.h" - -// #include "snd_music.h" #include "snd_ambient.h" -#include "qcommon/GenericParser2.h" extern qboolean S_FileExists( const char *psFilename ); @@ -70,9 +79,9 @@ struct MusicExitTime_t // need to declare this way for operator < below // it's possible for all 3 of these to be empty if it's boss or death music // -typedef vector MusicExitPoints_t; -typedef vector MusicExitTimes_t; -typedef map MusicEntryTimes_t; // key eg "marker1" +typedef std::vector MusicExitPoints_t; +typedef std::vector MusicExitTimes_t; +typedef std::map MusicEntryTimes_t; // key eg "marker1" typedef struct MusicFile_s { sstring_t sFileNameBase; @@ -82,7 +91,7 @@ typedef struct MusicFile_s { } MusicFile_t; -typedef map MusicData_t; // string is "explore", "action", "boss" etc +typedef std::map MusicData_t; // string is "explore", "action", "boss" etc MusicData_t* MusicData = NULL; // there are now 2 of these, because of the new "uses" keyword... // @@ -346,7 +355,7 @@ static qboolean Music_ParseMusic(CGenericParser2 &Parser, MusicData_t *MusicData // static char *StripTrailingWhiteSpaceOnEveryLine(char *pText) { - string strNewText; + std::string strNewText; while (*pText) { @@ -769,12 +778,9 @@ qboolean Music_DynamicDataAvailable(const char *psDynamicMusicLabel) { char sLevelName[MAX_QPATH]; Q_strncpyz(sLevelName,COM_SkipPath( const_cast( (psDynamicMusicLabel&&psDynamicMusicLabel[0])?psDynamicMusicLabel:gsLevelNameFromServer.c_str() ) ),sizeof(sLevelName)); -#ifdef _WIN32 - strlwr(sLevelName); -#else - string s = sLevelName; - transform(s.begin(), s.end(), s.begin(), ::tolower); -#endif + + std::string s = sLevelName; + std::transform(s.begin(), s.end(), s.begin(), ::tolower); if (strlen(sLevelName)) // avoid error messages when there's no music waiting to be played and we try and restart it... { @@ -936,7 +942,7 @@ qboolean Music_AllowedToTransition( float fPlayingTimeElapsed, // since a MusicExitTimes_t item is a sorted array, we can use the equal_range algorithm... // - pair itp = equal_range( pMusicFile->MusicExitTimes.begin(), pMusicFile->MusicExitTimes.end(), T); + std::pair itp = equal_range( pMusicFile->MusicExitTimes.begin(), pMusicFile->MusicExitTimes.end(), T); if (itp.first != pMusicFile->MusicExitTimes.begin()) itp.first--; // encompass the one before, in case we've just missed an exit point by < fTimeEpsilon if (itp.second!= pMusicFile->MusicExitTimes.end()) diff --git a/codemp/client/snd_music.h b/codemp/client/snd_music.h index 2e3c326528..03eb2865fd 100644 --- a/codemp/client/snd_music.h +++ b/codemp/client/snd_music.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // Filename:- snd_music.h diff --git a/codemp/client/snd_public.h b/codemp/client/snd_public.h index eb91d36d34..83bb896aaf 100644 --- a/codemp/client/snd_public.h +++ b/codemp/client/snd_public.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "qcommon/qcommon.h" @@ -21,7 +44,7 @@ float S_GetSampleLengthInMilliSeconds( sfxHandle_t sfxHandle); // cinematics and voice-over-network will send raw samples // 1.0 volume will be direct output of source samples -void S_RawSamples( int samples, int rate, int width, int s_channels, const byte *data, float volume, int bFirstOrOnlyUpdateThisFrame ); +void S_RawSamples( int samples, int rate, int width, int channels, const byte *data, float volume, int bFirstOrOnlyUpdateThisFrame ); // stop all sounds void S_StopSounds(void); // from snd_dma.cpp // stop all sounds and the background track diff --git a/codemp/game/AnimalNPC.c b/codemp/game/AnimalNPC.c index bad0cc1b80..8eaec59174 100644 --- a/codemp/game/AnimalNPC.c +++ b/codemp/game/AnimalNPC.c @@ -1,3 +1,24 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #ifdef _GAME //including game headers on cgame is FORBIDDEN ^_^ #include "g_local.h" diff --git a/codemp/game/CMakeLists.txt b/codemp/game/CMakeLists.txt index 6a5054c363..c3f4f5a818 100644 --- a/codemp/game/CMakeLists.txt +++ b/codemp/game/CMakeLists.txt @@ -1,4 +1,20 @@ -cmake_minimum_required(VERSION 2.8.8) +#============================================================================ +# Copyright (C) 2013 - 2015, OpenJK contributors +# +# This file is part of the OpenJK source code. +# +# OpenJK is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +#============================================================================ # Make sure the user is not executing this script directly if(NOT InOpenJK) @@ -183,21 +199,44 @@ set(MPGameFiles ${MPGameFiles} ${MPGameUiFiles}) add_library(${MPGame} SHARED ${MPGameFiles}) -if(NOT WIN32) +if(NOT MSVC) # remove "lib" prefix for .so/.dylib files set_target_properties(${MPGame} PROPERTIES PREFIX "") -endif(NOT WIN32) +endif() + +if(MakeApplicationBundles AND BuildMPEngine) + install(TARGETS ${MPGame} + LIBRARY + DESTINATION "${JKAInstallDir}/${MPEngine}.app/Contents/MacOS/OpenJK" + COMPONENT ${JKAMPCoreComponent}) + install(TARGETS ${MPGame} + LIBRARY + DESTINATION "${JKAInstallDir}/${MPEngine}.app/Contents/MacOS/base" + COMPONENT ${JKAMPCoreComponent}) +elseif(WIN32) + install(TARGETS ${MPGame} + RUNTIME + DESTINATION "${JKAInstallDir}/OpenJK" + COMPONENT ${JKAMPCoreComponent}) + if (WIN64) + # Don't do this on 32-bit Windows to avoid overwriting + # vanilla JKA's DLLs + install(TARGETS ${MPGame} + RUNTIME + DESTINATION "${JKAInstallDir}/base" + COMPONENT ${JKAMPCoreComponent}) + endif() +else() + install(TARGETS ${MPGame} + LIBRARY + DESTINATION "${JKAInstallDir}/OpenJK" + COMPONENT ${JKAMPCoreComponent}) + install(TARGETS ${MPGame} + LIBRARY + DESTINATION "${JKAInstallDir}/base" + COMPONENT ${JKAMPCoreComponent}) +endif() -if(WIN32) - install(TARGETS ${MPGame} RUNTIME DESTINATION "OpenJK") -else(WIN32) - if(MakeApplicationBundles AND BuildMPEngine) - install(TARGETS ${MPGame} LIBRARY DESTINATION "${MPEngine}.app/Contents/MacOS/OpenJK") - install(TARGETS ${MPGame} LIBRARY DESTINATION "${MPEngine}.app/Contents/MacOS/base") - else(MakeApplicationBundles AND BuildMPEngine) - install(TARGETS ${MPGame} LIBRARY DESTINATION "OpenJK") - endif(MakeApplicationBundles AND BuildMPEngine) -endif(WIN32) set_target_properties(${MPGame} PROPERTIES COMPILE_DEFINITIONS_RELWITHDEBINFO "${MPGameDefines};${ReleaseDefines}") set_target_properties(${MPGame} PROPERTIES COMPILE_DEFINITIONS_MINSIZEREL "${MPGameDefines};${ReleaseDefines}") set_target_properties(${MPGame} PROPERTIES COMPILE_DEFINITIONS_RELEASE "${MPGameDefines};${ReleaseDefines}") diff --git a/codemp/game/FighterNPC.c b/codemp/game/FighterNPC.c index d0e1c4f1a0..db2bf74c48 100644 --- a/codemp/game/FighterNPC.c +++ b/codemp/game/FighterNPC.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "bg_public.h" #include "bg_vehicles.h" diff --git a/codemp/game/NPC.c b/codemp/game/NPC.c index f99a72b840..dd30299a35 100644 --- a/codemp/game/NPC.c +++ b/codemp/game/NPC.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // // NPC.cpp - generic functions // diff --git a/codemp/game/NPC_AI_Atst.c b/codemp/game/NPC_AI_Atst.c index 0c8ddeb445..d4322c39eb 100644 --- a/codemp/game/NPC_AI_Atst.c +++ b/codemp/game/NPC_AI_Atst.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #define MIN_MELEE_RANGE 640 diff --git a/codemp/game/NPC_AI_Default.c b/codemp/game/NPC_AI_Default.c index d547f8ebca..6a67700e32 100644 --- a/codemp/game/NPC_AI_Default.c +++ b/codemp/game/NPC_AI_Default.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #include "g_nav.h" #include "icarus/Q3_Interface.h" diff --git a/codemp/game/NPC_AI_Droid.c b/codemp/game/NPC_AI_Droid.c index c90cca7547..70f869c842 100644 --- a/codemp/game/NPC_AI_Droid.c +++ b/codemp/game/NPC_AI_Droid.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" //static void R5D2_LookAround( void ); diff --git a/codemp/game/NPC_AI_GalakMech.c b/codemp/game/NPC_AI_GalakMech.c index 112e47020d..45a42bf620 100644 --- a/codemp/game/NPC_AI_GalakMech.c +++ b/codemp/game/NPC_AI_GalakMech.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #include "g_nav.h" #include "anims.h" diff --git a/codemp/game/NPC_AI_Grenadier.c b/codemp/game/NPC_AI_Grenadier.c index c7669f2266..549314b3d5 100644 --- a/codemp/game/NPC_AI_Grenadier.c +++ b/codemp/game/NPC_AI_Grenadier.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #include "g_nav.h" #include "anims.h" diff --git a/codemp/game/NPC_AI_Howler.c b/codemp/game/NPC_AI_Howler.c index 8ebc0283ed..477e3143b6 100644 --- a/codemp/game/NPC_AI_Howler.c +++ b/codemp/game/NPC_AI_Howler.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" // These define the working combat range for these suckers diff --git a/codemp/game/NPC_AI_ImperialProbe.c b/codemp/game/NPC_AI_ImperialProbe.c index c89f15c1e6..c016040057 100644 --- a/codemp/game/NPC_AI_ImperialProbe.c +++ b/codemp/game/NPC_AI_ImperialProbe.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #include "g_nav.h" diff --git a/codemp/game/NPC_AI_Interrogator.c b/codemp/game/NPC_AI_Interrogator.c index 38dc396ec7..70eafef463 100644 --- a/codemp/game/NPC_AI_Interrogator.c +++ b/codemp/game/NPC_AI_Interrogator.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #include "g_nav.h" diff --git a/codemp/game/NPC_AI_Jedi.c b/codemp/game/NPC_AI_Jedi.c index 05be0e6b92..97a4772100 100644 --- a/codemp/game/NPC_AI_Jedi.c +++ b/codemp/game/NPC_AI_Jedi.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #include "g_nav.h" #include "anims.h" diff --git a/codemp/game/NPC_AI_Mark1.c b/codemp/game/NPC_AI_Mark1.c index 1fe5d0692b..75909593af 100644 --- a/codemp/game/NPC_AI_Mark1.c +++ b/codemp/game/NPC_AI_Mark1.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #include "g_nav.h" diff --git a/codemp/game/NPC_AI_Mark2.c b/codemp/game/NPC_AI_Mark2.c index c98a4c065e..90da001b6b 100644 --- a/codemp/game/NPC_AI_Mark2.c +++ b/codemp/game/NPC_AI_Mark2.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #include "g_nav.h" diff --git a/codemp/game/NPC_AI_MineMonster.c b/codemp/game/NPC_AI_MineMonster.c index 8fd099f287..05977d9f81 100644 --- a/codemp/game/NPC_AI_MineMonster.c +++ b/codemp/game/NPC_AI_MineMonster.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" // These define the working combat range for these suckers diff --git a/codemp/game/NPC_AI_Rancor.c b/codemp/game/NPC_AI_Rancor.c index 9103290959..b89fc8fb60 100644 --- a/codemp/game/NPC_AI_Rancor.c +++ b/codemp/game/NPC_AI_Rancor.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" extern void G_GetBoltPosition( gentity_t *self, int boltIndex, vec3_t pos, int modelIndex ); diff --git a/codemp/game/NPC_AI_Remote.c b/codemp/game/NPC_AI_Remote.c index c1024fd454..79d79830f0 100644 --- a/codemp/game/NPC_AI_Remote.c +++ b/codemp/game/NPC_AI_Remote.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #include "g_nav.h" diff --git a/codemp/game/NPC_AI_Seeker.c b/codemp/game/NPC_AI_Seeker.c index 9d4b3e9c2c..899ecb6ab5 100644 --- a/codemp/game/NPC_AI_Seeker.c +++ b/codemp/game/NPC_AI_Seeker.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #include "g_nav.h" diff --git a/codemp/game/NPC_AI_Sentry.c b/codemp/game/NPC_AI_Sentry.c index 6de0fdc4f9..98d28a9d62 100644 --- a/codemp/game/NPC_AI_Sentry.c +++ b/codemp/game/NPC_AI_Sentry.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #include "g_nav.h" diff --git a/codemp/game/NPC_AI_Sniper.c b/codemp/game/NPC_AI_Sniper.c index f92615d670..1701a65056 100644 --- a/codemp/game/NPC_AI_Sniper.c +++ b/codemp/game/NPC_AI_Sniper.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #include "g_nav.h" #include "anims.h" diff --git a/codemp/game/NPC_AI_Stormtrooper.c b/codemp/game/NPC_AI_Stormtrooper.c index 4d8a914d06..9818da68ea 100644 --- a/codemp/game/NPC_AI_Stormtrooper.c +++ b/codemp/game/NPC_AI_Stormtrooper.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #include "g_nav.h" #include "anims.h" diff --git a/codemp/game/NPC_AI_Utils.c b/codemp/game/NPC_AI_Utils.c index d91f4feedb..0271286c8f 100644 --- a/codemp/game/NPC_AI_Utils.c +++ b/codemp/game/NPC_AI_Utils.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // These utilities are meant for strictly non-player, non-team NPCs. // These functions are in their own file because they are only intended // for use with NPCs who's logic has been overriden from the original diff --git a/codemp/game/NPC_AI_Wampa.c b/codemp/game/NPC_AI_Wampa.c index 2495d27cda..df9ea97d13 100644 --- a/codemp/game/NPC_AI_Wampa.c +++ b/codemp/game/NPC_AI_Wampa.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #include "g_nav.h" diff --git a/codemp/game/NPC_behavior.c b/codemp/game/NPC_behavior.c index 60ac4a777a..4e54f975bd 100644 --- a/codemp/game/NPC_behavior.c +++ b/codemp/game/NPC_behavior.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + //NPC_behavior.cpp /* FIXME - MCG: diff --git a/codemp/game/NPC_combat.c b/codemp/game/NPC_combat.c index 361d65c476..2565fe20ae 100644 --- a/codemp/game/NPC_combat.c +++ b/codemp/game/NPC_combat.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + //NPC_combat.cpp #include "b_local.h" #include "g_nav.h" diff --git a/codemp/game/NPC_goal.c b/codemp/game/NPC_goal.c index 48a885e9e7..499710f487 100644 --- a/codemp/game/NPC_goal.c +++ b/codemp/game/NPC_goal.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + //b_goal.cpp #include "b_local.h" #include "icarus/Q3_Interface.h" diff --git a/codemp/game/NPC_misc.c b/codemp/game/NPC_misc.c index e25c98be05..9a06391a90 100644 --- a/codemp/game/NPC_misc.c +++ b/codemp/game/NPC_misc.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // // NPC_misc.cpp // diff --git a/codemp/game/NPC_move.c b/codemp/game/NPC_move.c index e3e7a27703..7fe0842767 100644 --- a/codemp/game/NPC_move.c +++ b/codemp/game/NPC_move.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // // NPC_move.cpp // diff --git a/codemp/game/NPC_reactions.c b/codemp/game/NPC_reactions.c index b8a93a9359..17e50a32ab 100644 --- a/codemp/game/NPC_reactions.c +++ b/codemp/game/NPC_reactions.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + //NPC_reactions.cpp #include "b_local.h" #include "anims.h" diff --git a/codemp/game/NPC_senses.c b/codemp/game/NPC_senses.c index c66a010c8d..1eff5a4192 100644 --- a/codemp/game/NPC_senses.c +++ b/codemp/game/NPC_senses.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + //NPC_senses.cpp #include "b_local.h" diff --git a/codemp/game/NPC_sounds.c b/codemp/game/NPC_sounds.c index 947a40bdee..be0a571bf2 100644 --- a/codemp/game/NPC_sounds.c +++ b/codemp/game/NPC_sounds.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + //NPC_sounds.cpp #include "b_local.h" #include "icarus/Q3_Interface.h" diff --git a/codemp/game/NPC_spawn.c b/codemp/game/NPC_spawn.c index 282e49185e..883550d1b6 100644 --- a/codemp/game/NPC_spawn.c +++ b/codemp/game/NPC_spawn.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + //b_spawn.cpp //added by MCG #include "b_local.h" @@ -1397,7 +1419,7 @@ gentity_t *NPC_Spawn_Do( gentity_t *ent ) if ( newent == NULL ) { - Com_Printf ( S_COLOR_RED"ERROR: NPC G_Spawn failed\n" ); + Com_Printf ( S_COLOR_RED "ERROR: NPC G_Spawn failed\n" ); return NULL; } @@ -1406,7 +1428,7 @@ gentity_t *NPC_Spawn_Do( gentity_t *ent ) newent->NPC = New_NPC_t(newent->s.number); if ( newent->NPC == NULL ) { - Com_Printf ( S_COLOR_RED"ERROR: NPC G_Alloc NPC failed\n" ); + Com_Printf ( S_COLOR_RED "ERROR: NPC G_Alloc NPC failed\n" ); goto finish; // return NULL; } @@ -1429,7 +1451,7 @@ gentity_t *NPC_Spawn_Do( gentity_t *ent ) if ( newent->client == NULL ) { - Com_Printf ( S_COLOR_RED"ERROR: NPC BG_Alloc client failed\n" ); + Com_Printf ( S_COLOR_RED "ERROR: NPC BG_Alloc client failed\n" ); goto finish; // return NULL; } diff --git a/codemp/game/NPC_stats.c b/codemp/game/NPC_stats.c index ebb454c0a1..75d71a0699 100644 --- a/codemp/game/NPC_stats.c +++ b/codemp/game/NPC_stats.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + //NPC_stats.cpp #include "b_local.h" #include "b_public.h" diff --git a/codemp/game/NPC_utils.c b/codemp/game/NPC_utils.c index 6e5e076d09..c6e48bac98 100644 --- a/codemp/game/NPC_utils.c +++ b/codemp/game/NPC_utils.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + //NPC_utils.cpp #include "b_local.h" diff --git a/codemp/game/SpeederNPC.c b/codemp/game/SpeederNPC.c index 2a60daf08a..dc66ef3c61 100644 --- a/codemp/game/SpeederNPC.c +++ b/codemp/game/SpeederNPC.c @@ -1,3 +1,24 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #ifdef _GAME //including game headers on cgame is FORBIDDEN ^_^ #include "g_local.h" diff --git a/codemp/game/WalkerNPC.c b/codemp/game/WalkerNPC.c index 5d75e2cb84..a611718b0f 100644 --- a/codemp/game/WalkerNPC.c +++ b/codemp/game/WalkerNPC.c @@ -1,3 +1,24 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #ifdef _GAME //including game headers on cgame is FORBIDDEN ^_^ #include "g_local.h" diff --git a/codemp/game/ai.h b/codemp/game/ai.h index 1d16ed62f9..f7fd7e9a2e 100644 --- a/codemp/game/ai.h +++ b/codemp/game/ai.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once //Distance ratings diff --git a/codemp/game/ai_main.c b/codemp/game/ai_main.c index de9a5313a3..24910a17f1 100644 --- a/codemp/game/ai_main.c +++ b/codemp/game/ai_main.c @@ -1,5 +1,25 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ /***************************************************************************** * name: ai_main.c diff --git a/codemp/game/ai_main.h b/codemp/game/ai_main.h index aa0e2d81a7..105a5cc22e 100644 --- a/codemp/game/ai_main.h +++ b/codemp/game/ai_main.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "bg_saga.h" diff --git a/codemp/game/ai_util.c b/codemp/game/ai_util.c index e6f95c8344..44bd1572bb 100644 --- a/codemp/game/ai_util.c +++ b/codemp/game/ai_util.c @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "g_local.h" #include "qcommon/q_shared.h" #include "botlib/botlib.h" diff --git a/codemp/game/ai_wpnav.c b/codemp/game/ai_wpnav.c index b7326d0b0c..992060f53c 100644 --- a/codemp/game/ai_wpnav.c +++ b/codemp/game/ai_wpnav.c @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "g_local.h" #include "qcommon/q_shared.h" #include "botlib/botlib.h" diff --git a/codemp/game/anims.h b/codemp/game/anims.h index c5269ee238..8bfda3f66b 100644 --- a/codemp/game/anims.h +++ b/codemp/game/anims.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // playerAnimations diff --git a/codemp/game/b_local.h b/codemp/game/b_local.h index 744230b529..233ea8ef66 100644 --- a/codemp/game/b_local.h +++ b/codemp/game/b_local.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once //B_local.h diff --git a/codemp/game/b_public.h b/codemp/game/b_public.h index b9d740ab9e..76ad1c8533 100644 --- a/codemp/game/b_public.h +++ b/codemp/game/b_public.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "ai.h" diff --git a/codemp/game/bg_g2_utils.c b/codemp/game/bg_g2_utils.c index 7cfb4751ef..f8e6739a95 100644 --- a/codemp/game/bg_g2_utils.c +++ b/codemp/game/bg_g2_utils.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // bg_g2_utils.c -- both games misc functions, all completely stateless // only in game and cgame, NOT ui diff --git a/codemp/game/bg_local.h b/codemp/game/bg_local.h index 2dab13dd0b..0df703eb7e 100644 --- a/codemp/game/bg_local.h +++ b/codemp/game/bg_local.h @@ -1,7 +1,28 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once -// Copyright (C) 1999-2000 Id Software, Inc. -// // bg_local.h -- local definitions for the bg (both games) files #define MIN_WALK_NORMAL 0.7f // can't walk on very steep slopes diff --git a/codemp/game/bg_misc.c b/codemp/game/bg_misc.c index 9dd7c62710..0ecc3a9ddc 100644 --- a/codemp/game/bg_misc.c +++ b/codemp/game/bg_misc.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // bg_misc.c -- both games misc functions, all completely stateless #include "qcommon/q_shared.h" @@ -2311,7 +2332,7 @@ void BG_EvaluateTrajectoryDelta( const trajectory_t *tr, int atTime, vec3_t resu } } -char *eventnames[] = { +const char *eventnames[] = { "EV_NONE", "EV_CLIENTJOIN", diff --git a/codemp/game/bg_panimate.c b/codemp/game/bg_panimate.c index 14e48f4b39..014ade5d6b 100644 --- a/codemp/game/bg_panimate.c +++ b/codemp/game/bg_panimate.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // BG_PAnimate.c // game and cgame, NOT ui diff --git a/codemp/game/bg_pmove.c b/codemp/game/bg_pmove.c index 11d0b672e9..62efce9d89 100644 --- a/codemp/game/bg_pmove.c +++ b/codemp/game/bg_pmove.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // bg_pmove.c -- both games player movement code // takes a playerstate and a usercmd as input and returns a modifed playerstate diff --git a/codemp/game/bg_public.h b/codemp/game/bg_public.h index f4b1ca310a..d34a6184c0 100644 --- a/codemp/game/bg_public.h +++ b/codemp/game/bg_public.h @@ -1,7 +1,28 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once -// Copyright (C) 1999-2000 Id Software, Inc. -// // bg_public.h -- definitions shared by both the server game and client game modules // because games can change separately from the main system version, we need a diff --git a/codemp/game/bg_saber.c b/codemp/game/bg_saber.c index a4bb5520fa..e59413515b 100644 --- a/codemp/game/bg_saber.c +++ b/codemp/game/bg_saber.c @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "qcommon/q_shared.h" #include "bg_public.h" #include "bg_local.h" diff --git a/codemp/game/bg_saberLoad.c b/codemp/game/bg_saberLoad.c index e9b0c2cb2c..7cde29479d 100644 --- a/codemp/game/bg_saberLoad.c +++ b/codemp/game/bg_saberLoad.c @@ -1,4 +1,26 @@ -//bg_saberLoad.c +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +// bg_saberLoad.c // game and cgame, NOT ui #include "qcommon/q_shared.h" diff --git a/codemp/game/bg_saga.c b/codemp/game/bg_saga.c index 947560242e..7fab3b14d5 100644 --- a/codemp/game/bg_saga.c +++ b/codemp/game/bg_saga.c @@ -1,5 +1,25 @@ -// Copyright (C) 2000-2002 Raven Software, Inc. -// +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + /***************************************************************************** * name: bg_saga.c * diff --git a/codemp/game/bg_saga.h b/codemp/game/bg_saga.h index 9728c1660f..09fc95eca6 100644 --- a/codemp/game/bg_saga.h +++ b/codemp/game/bg_saga.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #define MAX_SIEGE_INFO_SIZE 16384 diff --git a/codemp/game/bg_slidemove.c b/codemp/game/bg_slidemove.c index 792c472184..0016e0d738 100644 --- a/codemp/game/bg_slidemove.c +++ b/codemp/game/bg_slidemove.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // bg_slidemove.c -- part of bg_pmove functionality // game and cgame, NOT ui diff --git a/codemp/game/bg_vehicleLoad.c b/codemp/game/bg_vehicleLoad.c index eea8166726..2a6e59723c 100644 --- a/codemp/game/bg_vehicleLoad.c +++ b/codemp/game/bg_vehicleLoad.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + //bg_vehicleLoad.c #include "qcommon/q_shared.h" @@ -50,7 +72,7 @@ typedef enum { VF_IGNORE, VF_INT, VF_FLOAT, - VF_LSTRING, // string on disk, pointer in memory, TAG_LEVEL + VF_STRING, // string on disk, pointer in memory VF_VECTOR, VF_BOOL, VF_VEHTYPE, @@ -67,14 +89,14 @@ typedef enum { } vehFieldType_t; typedef struct vehField_s { - char *name; + const char *name; size_t ofs; vehFieldType_t type; } vehField_t; -vehField_t vehWeaponFields[NUM_VWEAP_PARMS] = +vehField_t vehWeaponFields[] = { - {"name", VWFOFS(name), VF_LSTRING}, //unique name of the vehicle + {"name", VWFOFS(name), VF_STRING}, //unique name of the vehicle {"projectile", VWFOFS(bIsProjectile), VF_BOOL}, //traceline or entity? {"hasGravity", VWFOFS(bHasGravity), VF_BOOL}, //if a projectile, drops {"ionWeapon", VWFOFS(bIonWeapon), VF_BOOL}, //disables ship shields and sends them out of control @@ -101,9 +123,22 @@ vehField_t vehWeaponFields[NUM_VWEAP_PARMS] = {"explodeOnExpire", VWFOFS(bExplodeOnExpire), VF_BOOL}, //when iLifeTime is up, explodes rather than simply removing itself }; -static qboolean BG_ParseVehWeaponParm( vehWeaponInfo_t *vehWeapon, char *parmName, char *pValue ) +static const size_t numVehWeaponFields = ARRAY_LEN( vehWeaponFields ); + +static vehField_t *FindVehWeaponParm( const char *parmName ) { - int i; + size_t i; + for ( i = 0; itype ) { - if ( vehWeaponFields[i].name && !Q_stricmp( vehWeaponFields[i].name, parmName ) ) + case VF_INT: + *(int *)(b+vehWeaponField->ofs) = atoi(value); + break; + case VF_FLOAT: + *(float *)(b+vehWeaponField->ofs) = atof(value); + break; + case VF_STRING: // string on disk, pointer in memory + if (!*(char **)(b+vehWeaponField->ofs)) + { //just use 1024 bytes in case we want to write over the string + *(char **)(b+vehWeaponField->ofs) = (char *)BG_Alloc(1024);//(char *)BG_Alloc(strlen(value)); + strcpy(*(char **)(b+vehWeaponField->ofs), value); + } + + break; + case VF_VECTOR: + _iFieldsRead = sscanf (value, "%f %f %f", &vec[0], &vec[1], &vec[2]); + //assert(_iFieldsRead==3 ); + if (_iFieldsRead!=3) { - // found it - switch( vehWeaponFields[i].type ) - { - case VF_INT: - *(int *)(b+vehWeaponFields[i].ofs) = atoi(value); - break; - case VF_FLOAT: - *(float *)(b+vehWeaponFields[i].ofs) = atof(value); - break; - case VF_LSTRING: // string on disk, pointer in memory, TAG_LEVEL - if (!*(char **)(b+vehWeaponFields[i].ofs)) - { //just use 1024 bytes in case we want to write over the string - *(char **)(b+vehWeaponFields[i].ofs) = (char *)BG_Alloc(1024);//(char *)BG_Alloc(strlen(value)); - strcpy(*(char **)(b+vehWeaponFields[i].ofs), value); - } - - break; - case VF_VECTOR: - _iFieldsRead = sscanf (value, "%f %f %f", &vec[0], &vec[1], &vec[2]); - assert(_iFieldsRead==3 ); - if (_iFieldsRead!=3) - { - Com_Printf (S_COLOR_YELLOW"BG_ParseVehWeaponParm: VEC3 sscanf() failed to read 3 floats ('angle' key bug?)\n"); - } - ((float *)(b+vehWeaponFields[i].ofs))[0] = vec[0]; - ((float *)(b+vehWeaponFields[i].ofs))[1] = vec[1]; - ((float *)(b+vehWeaponFields[i].ofs))[2] = vec[2]; - break; - case VF_BOOL: - *(qboolean *)(b+vehWeaponFields[i].ofs) = (qboolean)(atof(value)!=0); - break; - case VF_VEHTYPE: - vehType = (vehicleType_t)GetIDForString( VehicleTable, value ); - *(vehicleType_t *)(b+vehWeaponFields[i].ofs) = vehType; - break; - case VF_ANIM: - { - int anim = GetIDForString( animTable, value ); - *(int *)(b+vehWeaponFields[i].ofs) = anim; - } - break; - case VF_WEAPON: // take string, resolve into index into VehWeaponParms - //*(int *)(b+vehWeaponFields[i].ofs) = VEH_VehWeaponIndexForName( value ); - break; - case VF_MODEL:// take the string, get the G_ModelIndex - #ifdef _GAME - *(int *)(b+vehWeaponFields[i].ofs) = G_ModelIndex( value ); - #else - *(int *)(b+vehWeaponFields[i].ofs) = trap->R_RegisterModel( value ); - #endif - break; - case VF_MODEL_CLIENT: // (MP cgame only) take the string, get the G_ModelIndex - #ifdef _GAME - *(int *)(b+vehWeaponFields[i].ofs) = G_ModelIndex( value ); - #else - *(int *)(b+vehWeaponFields[i].ofs) = trap->R_RegisterModel( value ); - #endif - break; - case VF_EFFECT: // take the string, get the G_EffectIndex - #ifdef _GAME - // *(int *)(b+vehWeaponFields[i].ofs) = G_EffectIndex( value ); - #elif _CGAME - *(int *)(b+vehWeaponFields[i].ofs) = trap->FX_RegisterEffect( value ); - #endif - break; - case VF_EFFECT_CLIENT: // (MP cgame only) take the string, get the index - #ifdef _GAME - //*(int *)(b+vehWeaponFields[i].ofs) = G_EffectIndex( value ); - #elif _CGAME - *(int *)(b+vehWeaponFields[i].ofs) = trap->FX_RegisterEffect( value ); - #endif - break; - case VF_SHADER: // (cgame only) take the string, call trap_R_RegisterShader - #ifdef _UI - *(int *)(b+vehWeaponFields[i].ofs) = trap->R_RegisterShaderNoMip( value ); - #elif _CGAME - *(int *)(b+vehWeaponFields[i].ofs) = trap->R_RegisterShader( value ); - #endif - break; - case VF_SHADER_NOMIP:// (cgame only) take the string, call trap_R_RegisterShaderNoMip - #if defined(_CGAME) || defined(_UI) - *(int *)(b+vehWeaponFields[i].ofs) = trap->R_RegisterShaderNoMip( value ); - #endif - break; - case VF_SOUND: // take the string, get the G_SoundIndex - #ifdef _GAME - *(int *)(b+vehWeaponFields[i].ofs) = G_SoundIndex( value ); - #else - *(int *)(b+vehWeaponFields[i].ofs) = trap->S_RegisterSound( value ); - #endif - break; - case VF_SOUND_CLIENT: // (MP cgame only) take the string, get the index - #ifdef _GAME - //*(int *)(b+vehWeaponFields[i].ofs) = G_SoundIndex( value ); - #else - *(int *)(b+vehWeaponFields[i].ofs) = trap->S_RegisterSound( value ); - #endif - break; - default: - //Unknown type? - return qfalse; - break; - } - break; + Com_Printf (S_COLOR_YELLOW"BG_ParseVehWeaponParm: VEC3 sscanf() failed to read 3 floats ('angle' key bug?)\n"); + VectorClear( vec ); } + ((float *)(b+vehWeaponField->ofs))[0] = vec[0]; + ((float *)(b+vehWeaponField->ofs))[1] = vec[1]; + ((float *)(b+vehWeaponField->ofs))[2] = vec[2]; + break; + case VF_BOOL: + *(qboolean *)(b+vehWeaponField->ofs) = (qboolean)(atof(value)!=0); + break; + case VF_VEHTYPE: + vehType = (vehicleType_t)GetIDForString( VehicleTable, value ); + *(vehicleType_t *)(b+vehWeaponField->ofs) = vehType; + break; + case VF_ANIM: + { + int anim = GetIDForString( animTable, value ); + *(int *)(b+vehWeaponField->ofs) = anim; + } + break; + case VF_WEAPON: // take string, resolve into index into VehWeaponParms + //*(int *)(b+vehWeaponField->ofs) = VEH_VehWeaponIndexForName( value ); + break; + case VF_MODEL:// take the string, get the G_ModelIndex +#ifdef _GAME + *(int *)(b+vehWeaponField->ofs) = G_ModelIndex( value ); +#else + *(int *)(b+vehWeaponField->ofs) = trap->R_RegisterModel( value ); +#endif + break; + case VF_MODEL_CLIENT: // (MP cgame only) take the string, get the G_ModelIndex +#ifdef _GAME + *(int *)(b+vehWeaponField->ofs) = G_ModelIndex( value ); +#else + *(int *)(b+vehWeaponField->ofs) = trap->R_RegisterModel( value ); +#endif + break; + case VF_EFFECT: // take the string, get the G_EffectIndex +#ifdef _GAME + //*(int *)(b+vehWeaponField->ofs) = G_EffectIndex( value ); +#elif _CGAME + *(int *)(b+vehWeaponField->ofs) = trap->FX_RegisterEffect( value ); +#endif + break; + case VF_EFFECT_CLIENT: // (MP cgame only) take the string, get the index +#ifdef _GAME + //*(int *)(b+vehWeaponField->ofs) = G_EffectIndex( value ); +#elif _CGAME + *(int *)(b+vehWeaponField->ofs) = trap->FX_RegisterEffect( value ); +#endif + break; + case VF_SHADER: // (cgame only) take the string, call trap_R_RegisterShader +#ifdef _UI + *(int *)(b+vehWeaponField->ofs) = trap->R_RegisterShaderNoMip( value ); +#elif CGAME + *(int *)(b+vehWeaponField->ofs) = trap->R_RegisterShader( value ); +#endif + break; + case VF_SHADER_NOMIP:// (cgame only) take the string, call trap_R_RegisterShaderNoMip +#if defined(_CGAME) || defined(_UI) + *(int *)(b+vehWeaponField->ofs) = trap->R_RegisterShaderNoMip( value ); +#endif + break; + case VF_SOUND: // take the string, get the G_SoundIndex +#ifdef _GAME + *(int *)(b+vehWeaponField->ofs) = G_SoundIndex( value ); +#else + *(int *)(b+vehWeaponField->ofs) = trap->S_RegisterSound( value ); +#endif + break; + case VF_SOUND_CLIENT: // (MP cgame only) take the string, get the index +#ifdef _GAME + //*(int *)(b+vehWeaponField->ofs) = G_SoundIndex( value ); +#else + *(int *)(b+vehWeaponField->ofs) = trap->S_RegisterSound( value ); +#endif + break; + default: + //Unknown type? + return qfalse; } - if ( i == NUM_VWEAP_PARMS ) - { - return qfalse; - } - else - { - return qtrue; - } + + return qtrue; } int VEH_LoadVehWeapon( const char *vehWeaponName ) @@ -361,7 +388,7 @@ int VEH_VehWeaponIndexForName( const char *vehWeaponName ) vehField_t vehicleFields[] = { - {"name", VFOFS(name), VF_LSTRING}, //unique name of the vehicle + {"name", VFOFS(name), VF_STRING}, //unique name of the vehicle //general data {"type", VFOFS(type), VF_VEHTYPE}, //what kind of vehicle @@ -408,11 +435,11 @@ vehField_t vehicleFields[] = {"surfDestruction", VFOFS(surfDestruction), VF_INT}, //visuals & sounds - {"model", VFOFS(model), VF_LSTRING}, //what model to use - if make it an NPC's primary model, don't need this? - {"skin", VFOFS(skin), VF_LSTRING}, //what skin to use - if make it an NPC's primary model, don't need this? + {"model", VFOFS(model), VF_STRING}, //what model to use - if make it an NPC's primary model, don't need this? + {"skin", VFOFS(skin), VF_STRING}, //what skin to use - if make it an NPC's primary model, don't need this? {"g2radius", VFOFS(g2radius), VF_INT}, //render radius (really diameter, but...) for the ghoul2 model {"riderAnim", VFOFS(riderAnim), VF_ANIM}, //what animation the rider uses - {"droidNPC", VFOFS(droidNPC), VF_LSTRING}, //NPC to attach to *droidunit tag (if it exists in the model) + {"droidNPC", VFOFS(droidNPC), VF_STRING}, //NPC to attach to *droidunit tag (if it exists in the model) {"radarIcon", VFOFS(radarIconHandle), VF_SHADER_NOMIP}, //what icon to show on radar in MP {"dmgIndicFrame", VFOFS(dmgIndicFrameHandle), VF_SHADER_NOMIP}, //what image to use for the frame of the damage indicator @@ -533,8 +560,8 @@ vehField_t vehicleFields[] = {"turret1Delay", VFOFS(turret[0].iDelay), VF_INT}, {"turret1AmmoMax", VFOFS(turret[0].iAmmoMax), VF_INT}, {"turret1AmmoRechargeMS", VFOFS(turret[0].iAmmoRechargeMS), VF_INT}, - {"turret1YawBone", VFOFS(turret[0].yawBone), VF_LSTRING}, - {"turret1PitchBone", VFOFS(turret[0].pitchBone), VF_LSTRING}, + {"turret1YawBone", VFOFS(turret[0].yawBone), VF_STRING}, + {"turret1PitchBone", VFOFS(turret[0].pitchBone), VF_STRING}, {"turret1YawAxis", VFOFS(turret[0].yawAxis), VF_INT}, {"turret1PitchAxis", VFOFS(turret[0].pitchAxis), VF_INT}, {"turret1ClampYawL", VFOFS(turret[0].yawClampLeft), VF_FLOAT}, //how far the turret is allowed to turn left @@ -548,15 +575,15 @@ vehField_t vehicleFields[] = {"turret1AILead", VFOFS(turret[0].bAILead), VF_BOOL}, {"turret1AIRange", VFOFS(turret[0].fAIRange), VF_FLOAT}, {"turret1PassengerNum", VFOFS(turret[0].passengerNum), VF_INT},//which number passenger can control this turret - {"turret1GunnerViewTag", VFOFS(turret[0].gunnerViewTag), VF_LSTRING}, + {"turret1GunnerViewTag", VFOFS(turret[0].gunnerViewTag), VF_STRING}, //Turret 2 {"turret2Weap", VFOFS(turret[1].iWeapon), VF_WEAPON}, {"turret2Delay", VFOFS(turret[1].iDelay), VF_INT}, {"turret2AmmoMax", VFOFS(turret[1].iAmmoMax), VF_INT}, {"turret2AmmoRechargeMS", VFOFS(turret[1].iAmmoRechargeMS), VF_INT}, - {"turret2YawBone", VFOFS(turret[1].yawBone), VF_LSTRING}, - {"turret2PitchBone", VFOFS(turret[1].pitchBone), VF_LSTRING}, + {"turret2YawBone", VFOFS(turret[1].yawBone), VF_STRING}, + {"turret2PitchBone", VFOFS(turret[1].pitchBone), VF_STRING}, {"turret2YawAxis", VFOFS(turret[1].yawAxis), VF_INT}, {"turret2PitchAxis", VFOFS(turret[1].pitchAxis), VF_INT}, {"turret2ClampYawL", VFOFS(turret[1].yawClampLeft), VF_FLOAT}, //how far the turret is allowed to turn left @@ -570,12 +597,12 @@ vehField_t vehicleFields[] = {"turret2AILead", VFOFS(turret[1].bAILead), VF_BOOL}, {"turret2AIRange", VFOFS(turret[1].fAIRange), VF_FLOAT}, {"turret2PassengerNum", VFOFS(turret[1].passengerNum), VF_INT},//which number passenger can control this turret - {"turret2GunnerViewTag", VFOFS(turret[1].gunnerViewTag), VF_LSTRING}, + {"turret2GunnerViewTag", VFOFS(turret[1].gunnerViewTag), VF_STRING}, //===END TURRETS=========================================================================== - //terminating entry - {0, -1, VF_INT} }; +static const size_t numVehicleFields = ARRAY_LEN( vehicleFields ); + stringID_table_t VehicleTable[VH_NUM_VEHICLES+1] = { ENUM2STRING(VH_NONE), @@ -743,9 +770,20 @@ void BG_VehicleClampData( vehicleInfo_t *vehicle ) } } -static qboolean BG_ParseVehicleParm( vehicleInfo_t *vehicle, char *parmName, char *pValue ) +static vehField_t *FindVehicleParm( const char *parmName ) { - int i; + size_t i; + for ( i = 0; itype ) { - if ( !Q_stricmp( vehicleFields[i].name, parmName ) ) + case VF_IGNORE: + break; + case VF_INT: + *(int *)(b+vehField->ofs) = atoi(value); + break; + case VF_FLOAT: + *(float *)(b+vehField->ofs) = atof(value); + break; + case VF_STRING: // string on disk, pointer in memory + if (!*(char **)(b+vehField->ofs)) + { //just use 128 bytes in case we want to write over the string + *(char **)(b+vehField->ofs) = (char *)BG_Alloc(128);//(char *)BG_Alloc(strlen(value)); + strcpy(*(char **)(b+vehField->ofs), value); + } + + break; + case VF_VECTOR: + _iFieldsRead = sscanf (value, "%f %f %f", &vec[0], &vec[1], &vec[2]); + //assert(_iFieldsRead==3 ); + if (_iFieldsRead!=3) { - // found it - switch( vehicleFields[i].type ) - { - case VF_IGNORE: - break; - case VF_INT: - *(int *)(b+vehicleFields[i].ofs) = atoi(value); - break; - case VF_FLOAT: - *(float *)(b+vehicleFields[i].ofs) = atof(value); - break; - case VF_LSTRING: // string on disk, pointer in memory, TAG_LEVEL - if (!*(char **)(b+vehicleFields[i].ofs)) - { //just use 128 bytes in case we want to write over the string - *(char **)(b+vehicleFields[i].ofs) = (char *)BG_Alloc(128);//(char *)BG_Alloc(strlen(value)); - strcpy(*(char **)(b+vehicleFields[i].ofs), value); - } - - break; - case VF_VECTOR: - _iFieldsRead = sscanf (value, "%f %f %f", &vec[0], &vec[1], &vec[2]); - assert(_iFieldsRead==3 ); - if (_iFieldsRead!=3) - { - Com_Printf (S_COLOR_YELLOW"BG_ParseVehicleParm: VEC3 sscanf() failed to read 3 floats ('angle' key bug?)\n"); - } - ((float *)(b+vehWeaponFields[i].ofs))[0] = vec[0]; - ((float *)(b+vehWeaponFields[i].ofs))[1] = vec[1]; - ((float *)(b+vehWeaponFields[i].ofs))[2] = vec[2]; - break; - case VF_BOOL: - *(qboolean *)(b+vehicleFields[i].ofs) = (qboolean)(atof(value)!=0); - break; - case VF_VEHTYPE: - vehType = (vehicleType_t)GetIDForString( VehicleTable, value ); - *(vehicleType_t *)(b+vehicleFields[i].ofs) = vehType; - break; - case VF_ANIM: - { - int anim = GetIDForString( animTable, value ); - *(int *)(b+vehicleFields[i].ofs) = anim; - } - break; - case VF_WEAPON: // take string, resolve into index into VehWeaponParms - *(int *)(b+vehicleFields[i].ofs) = VEH_VehWeaponIndexForName( value ); - break; - case VF_MODEL: // take the string, get the G_ModelIndex - #ifdef _GAME - *(int *)(b+vehicleFields[i].ofs) = G_ModelIndex( value ); - #else - *(int *)(b+vehicleFields[i].ofs) = trap->R_RegisterModel( value ); - #endif - break; - case VF_MODEL_CLIENT: // (MP cgame only) take the string, get the G_ModelIndex - #ifdef _GAME - //*(int *)(b+vehicleFields[i].ofs) = G_ModelIndex( value ); - #else - *(int *)(b+vehicleFields[i].ofs) = trap->R_RegisterModel( value ); - #endif - break; - case VF_EFFECT: // take the string, get the G_EffectIndex - #ifdef _GAME - *(int *)(b+vehicleFields[i].ofs) = G_EffectIndex( value ); - #elif defined(_CGAME) - *(int *)(b+vehicleFields[i].ofs) = trap->FX_RegisterEffect( value ); - #endif - break; - case VF_EFFECT_CLIENT: // (MP cgame only) take the string, get the G_EffectIndex - #ifdef _GAME - //*(int *)(b+vehicleFields[i].ofs) = G_EffectIndex( value ); - #elif defined(_CGAME) - *(int *)(b+vehicleFields[i].ofs) = trap->FX_RegisterEffect( value ); - #endif - break; - case VF_SHADER: // (cgame only) take the string, call trap_R_RegisterShader - #ifdef _UI - *(int *)(b+vehicleFields[i].ofs) = trap->R_RegisterShaderNoMip( value ); - #elif defined(_CGAME) - *(int *)(b+vehicleFields[i].ofs) = trap->R_RegisterShader( value ); - #endif - break; - case VF_SHADER_NOMIP:// (cgame only) take the string, call trap_R_RegisterShaderNoMip - #if defined(_CGAME) - *(int *)(b+vehicleFields[i].ofs) = trap->R_RegisterShaderNoMip( value ); - #elif defined(_UI) - *(int *)(b+vehicleFields[i].ofs) = trap->R_RegisterShaderNoMip( value ); - #endif - break; - case VF_SOUND: // take the string, get the G_SoundIndex - #ifdef _GAME - *(int *)(b+vehicleFields[i].ofs) = G_SoundIndex( value ); - #else - *(int *)(b+vehicleFields[i].ofs) = trap->S_RegisterSound( value ); - #endif - break; - case VF_SOUND_CLIENT: // (MP cgame only) take the string, get the G_SoundIndex - #ifdef _GAME - //*(int *)(b+vehicleFields[i].ofs) = G_SoundIndex( value ); - #else - *(int *)(b+vehicleFields[i].ofs) = trap->S_RegisterSound( value ); - #endif - break; - default: - //Unknown type? - return qfalse; - break; - } - break; + Com_Printf (S_COLOR_YELLOW"BG_ParseVehicleParm: VEC3 sscanf() failed to read 3 floats ('angle' key bug?)\n"); + VectorClear( vec ); } + ((float *)(b+vehField->ofs))[0] = vec[0]; + ((float *)(b+vehField->ofs))[1] = vec[1]; + ((float *)(b+vehField->ofs))[2] = vec[2]; + break; + case VF_BOOL: + *(qboolean *)(b+vehField->ofs) = (qboolean)(atof(value)!=0); + break; + case VF_VEHTYPE: + vehType = (vehicleType_t)GetIDForString( VehicleTable, value ); + *(vehicleType_t *)(b+vehField->ofs) = vehType; + break; + case VF_ANIM: + { + int anim = GetIDForString( animTable, value ); + *(int *)(b+vehField->ofs) = anim; + } + break; + case VF_WEAPON: // take string, resolve into index into VehWeaponParms + *(int *)(b+vehField->ofs) = VEH_VehWeaponIndexForName( value ); + break; + case VF_MODEL: // take the string, get the G_ModelIndex +#ifdef _GAME + *(int *)(b+vehField->ofs) = G_ModelIndex( value ); +#else + *(int *)(b+vehField->ofs) = trap->R_RegisterModel( value ); +#endif + break; + case VF_MODEL_CLIENT: // (MP cgame only) take the string, get the G_ModelIndex +#ifdef _GAME + //*(int *)(b+vehField->ofs) = G_ModelIndex( value ); +#else + *(int *)(b+vehField->ofs) = trap->R_RegisterModel( value ); +#endif + break; + case VF_EFFECT: // take the string, get the G_EffectIndex +#ifdef _GAME + *(int *)(b+vehField->ofs) = G_EffectIndex( value ); +#elif _CGAME + *(int *)(b+vehField->ofs) = trap->FX_RegisterEffect( value ); +#endif + break; + case VF_EFFECT_CLIENT: // (MP cgame only) take the string, get the G_EffectIndex +#ifdef _GAME + //*(int *)(b+vehField->ofs) = G_EffectIndex( value ); +#elif _CGAME + *(int *)(b+vehField->ofs) = trap->FX_RegisterEffect( value ); +#endif + break; + case VF_SHADER: // (cgame only) take the string, call trap_R_RegisterShader +#ifdef _UI + *(int *)(b+vehField->ofs) = trap->R_RegisterShaderNoMip( value ); +#elif _CGAME + *(int *)(b+vehField->ofs) = trap->R_RegisterShader( value ); +#endif + break; + case VF_SHADER_NOMIP:// (cgame only) take the string, call trap_R_RegisterShaderNoMip +#if defined(_CGAME) || defined(_UI) + *(int *)(b+vehField->ofs) = trap->R_RegisterShaderNoMip( value ); +#endif + break; + case VF_SOUND: // take the string, get the G_SoundIndex +#ifdef _GAME + *(int *)(b+vehField->ofs) = G_SoundIndex( value ); +#else + *(int *)(b+vehField->ofs) = trap->S_RegisterSound( value ); +#endif + break; + case VF_SOUND_CLIENT: // (MP cgame only) take the string, get the G_SoundIndex +#ifdef _GAME + //*(int *)(b+vehField->ofs) = G_SoundIndex( value ); +#else + *(int *)(b+vehField->ofs) = trap->S_RegisterSound( value ); +#endif + break; + default: + //Unknown type? + return qfalse; } - if ( vehicleFields[i].ofs == -1 ) - { - return qfalse; - } - else - { - return qtrue; - } + + return qtrue; } int VEH_LoadVehicle( const char *vehicleName ) diff --git a/codemp/game/bg_vehicles.h b/codemp/game/bg_vehicles.h index a6578c458e..0ddcc5e8b2 100644 --- a/codemp/game/bg_vehicles.h +++ b/codemp/game/bg_vehicles.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "qcommon/q_shared.h" @@ -30,7 +52,6 @@ extern stringID_table_t VehicleTable[VH_NUM_VEHICLES+1]; //START VEHICLE WEAPONS //=========================================================================================================== typedef struct vehWeaponInfo_s { -//*** IMPORTANT!!! *** the number of variables in the vehWeaponStats_t struct (including all elements of arrays) must be reflected by NUM_VWEAP_PARMS!!! //*** IMPORTANT!!! *** vWeapFields table correponds to this structure! char *name; qboolean bIsProjectile; //traceline or entity? @@ -58,8 +79,6 @@ typedef struct vehWeaponInfo_s { int iLifeTime; //removes itself after this amount of time qboolean bExplodeOnExpire; //when iLifeTime is up, explodes rather than simply removing itself } vehWeaponInfo_t; -//NOTE: this MUST stay up to date with the number of variables in the vehFields table!!! -#define NUM_VWEAP_PARMS 25 #define VWFOFS(x) offsetof(vehWeaponInfo_t, x) diff --git a/codemp/game/bg_weapons.c b/codemp/game/bg_weapons.c index 5400c80664..9f0c4e8e0d 100644 --- a/codemp/game/bg_weapons.c +++ b/codemp/game/bg_weapons.c @@ -1,5 +1,25 @@ -// Copyright (C) 2001-2002 Raven Software -// +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // bg_weapons.c -- part of bg_pmove functionality #include "qcommon/q_shared.h" diff --git a/codemp/game/bg_weapons.h b/codemp/game/bg_weapons.h index 4d5d73b936..e17df82db6 100644 --- a/codemp/game/bg_weapons.h +++ b/codemp/game/bg_weapons.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // Filename:- bg_weapons.h diff --git a/codemp/game/chars.h b/codemp/game/chars.h index 404a045999..2db8bccb59 100644 --- a/codemp/game/chars.h +++ b/codemp/game/chars.h @@ -1,7 +1,28 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once -// Copyright (C) 1999-2000 Id Software, Inc. -// //=========================================================================== // // Name: chars.h diff --git a/codemp/game/g_ICARUScb.c b/codemp/game/g_ICARUScb.c index e0825853f3..657bf6c5da 100644 --- a/codemp/game/g_ICARUScb.c +++ b/codemp/game/g_ICARUScb.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + //==================================================================================== // //rww - ICARUS callback file, all that can be handled within vm's is handled in here. diff --git a/codemp/game/g_ICARUScb.h b/codemp/game/g_ICARUScb.h index 2150efaed7..2b3901469a 100644 --- a/codemp/game/g_ICARUScb.h +++ b/codemp/game/g_ICARUScb.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once int Q3_PlaySound( int taskID, int entID, const char *name, const char *channel ); diff --git a/codemp/game/g_active.c b/codemp/game/g_active.c index e46e5208a3..12db0e7dad 100644 --- a/codemp/game/g_active.c +++ b/codemp/game/g_active.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_local.h" #include "bg_saga.h" @@ -1093,126 +1114,66 @@ void SendPendingPredictableEvents( playerState_t *ps ) { } } -/* -================== -G_UpdateClientBroadcasts - -Determines whether this client should be broadcast to any other clients. -A client is broadcast when another client is using force sight or is -================== -*/ -#define MAX_JEDIMASTER_DISTANCE 2500 -#define MAX_JEDIMASTER_FOV 100 - -#define MAX_SIGHT_DISTANCE 1500 -#define MAX_SIGHT_FOV 100 +static const float maxJediMasterDistance = 2500.0f * 2500.0f; // x^2, optimisation +static const float maxJediMasterFOV = 100.0f; +static const float maxForceSightDistance = Square( 1500.0f ) * 1500.0f; // x^2, optimisation +static const float maxForceSightFOV = 100.0f; -static void G_UpdateForceSightBroadcasts ( gentity_t *self ) -{ +void G_UpdateClientBroadcasts( gentity_t *self ) { int i; - - // Any clients with force sight on should see this client - for ( i = 0; i < level.numConnectedClients; i ++ ) - { - gentity_t *ent = &g_entities[level.sortedClients[i]]; - float dist; - vec3_t angles; - - if ( ent == self ) - { - continue; - } - - // Not using force sight so we shouldnt broadcast to this one - if ( !(ent->client->ps.fd.forcePowersActive & (1<r.broadcastClients[0] = 0u; + self->r.broadcastClients[1] = 0u; + + for ( i = 0, other = g_entities; i < MAX_CLIENTS; i++, other++ ) { + qboolean send = qfalse; + float dist; + vec3_t angles; + + if ( !other->inuse || other->client->pers.connected != CON_CONNECTED ) { + // no need to compute visibility for non-connected clients continue; } - VectorSubtract( self->client->ps.origin, ent->client->ps.origin, angles ); - dist = VectorLengthSquared ( angles ); - vectoangles ( angles, angles ); - - // Too far away then just forget it - if ( dist > MAX_SIGHT_DISTANCE * MAX_SIGHT_DISTANCE ) - { + if ( other == self ) { + // we are always sent to ourselves anyway, this is purely an optimisation continue; } - // If not within the field of view then forget it - if ( !InFieldOfVision ( ent->client->ps.viewangles, MAX_SIGHT_FOV, angles ) ) - { - break; - } - - // Turn on the broadcast bit for the master and since there is only one - // master we are done - self->r.broadcastClients[ent->s.clientNum/32] |= (1 << (ent->s.clientNum%32)); - - break; - } -} - -static void G_UpdateJediMasterBroadcasts ( gentity_t *self ) -{ - int i; - - // Not jedi master mode then nothing to do - if ( level.gametype != GT_JEDIMASTER ) - { - return; - } - - // This client isnt the jedi master so it shouldnt broadcast - if ( !self->client->ps.isJediMaster ) - { - return; - } + VectorSubtract( self->client->ps.origin, other->client->ps.origin, angles ); + dist = VectorLengthSquared( angles ); + vectoangles( angles, angles ); - // Broadcast ourself to all clients within range - for ( i = 0; i < level.numConnectedClients; i ++ ) - { - gentity_t *ent = &g_entities[level.sortedClients[i]]; - float dist; - vec3_t angles; - - if ( ent == self ) - { - continue; + // broadcast jedi master to everyone if we are in distance/field of view + if ( level.gametype == GT_JEDIMASTER && self->client->ps.isJediMaster ) { + if ( dist < maxJediMasterDistance + && InFieldOfVision( other->client->ps.viewangles, maxJediMasterFOV, angles ) ) + { + send = qtrue; + } } - VectorSubtract( self->client->ps.origin, ent->client->ps.origin, angles ); - dist = VectorLengthSquared ( angles ); - vectoangles ( angles, angles ); - - // Too far away then just forget it - if ( dist > MAX_JEDIMASTER_DISTANCE * MAX_JEDIMASTER_DISTANCE ) - { - continue; + // broadcast this client to everyone using force sight if we are in distance/field of view + if ( (other->client->ps.fd.forcePowersActive & (1 << FP_SEE)) ) { + if ( dist < maxForceSightDistance + && InFieldOfVision( other->client->ps.viewangles, maxForceSightFOV, angles ) ) + { + send = qtrue; + } } - // If not within the field of view then forget it - if ( !InFieldOfVision ( ent->client->ps.viewangles, MAX_JEDIMASTER_FOV, angles ) ) - { - continue; + if ( send ) { + Q_AddToBitflags( self->r.broadcastClients, i, 32 ); } - - // Turn on the broadcast bit for the master and since there is only one - // master we are done - self->r.broadcastClients[ent->s.clientNum/32] |= (1 << (ent->s.clientNum%32)); } -} - -void G_UpdateClientBroadcasts ( gentity_t *self ) -{ - // Clear all the broadcast bits for this client - memset ( self->r.broadcastClients, 0, sizeof ( self->r.broadcastClients ) ); - - // The jedi master is broadcast to everyone in range - G_UpdateJediMasterBroadcasts ( self ); - // Anyone with force sight on should see this client - G_UpdateForceSightBroadcasts ( self ); + trap->LinkEntity( (sharedEntity_t *)self ); } void G_AddPushVecToUcmd( gentity_t *self, usercmd_t *ucmd ) diff --git a/codemp/game/g_bot.c b/codemp/game/g_bot.c index c0f398db2f..ed8459a803 100644 --- a/codemp/game/g_bot.c +++ b/codemp/game/g_bot.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // g_bot.c #include "g_local.h" @@ -817,8 +838,8 @@ static void G_AddBot( const char *name, float skill, const char *team, int delay // get the botinfo from bots.txt botinfo = G_GetBotInfoByName( name ); if ( !botinfo ) { - trap->BotFreeClient( clientNum ); trap->Print( S_COLOR_RED "Error: Bot '%s' not defined\n", name ); + trap->BotFreeClient( clientNum ); return; } @@ -912,7 +933,7 @@ static void G_AddBot( const char *name, float skill, const char *team, int delay // initialize the bot settings if ( !team || !*team ) { if ( level.gametype >= GT_TEAM ) { - if ( PickTeam( clientNum ) == TEAM_RED) + if ( PickTeam( clientNum ) == TEAM_RED ) team = "red"; else team = "blue"; @@ -1135,7 +1156,7 @@ static void G_SpawnBots( char *botList, int baseDelay ) { while( *p && *p == ' ' ) { p++; } - if( !p ) { + if( !*p ) { break; } diff --git a/codemp/game/g_client.c b/codemp/game/g_client.c index e7b1912068..80cc113488 100644 --- a/codemp/game/g_client.c +++ b/codemp/game/g_client.c @@ -1,5 +1,27 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "g_local.h" #include "ghoul2/G2.h" #include "bg_saga.h" @@ -2138,7 +2160,7 @@ qboolean ClientUserinfoChanged( int clientNum ) { Q_StripColor( client->pers.netname_nocolor ); } else { - trap->SendServerCommand( -1, va( "print \"%s"S_COLOR_WHITE" %s %s\n\"", oldname, G_GetStringEdString( "MP_SVGAME", "PLRENAME" ), client->pers.netname ) ); + trap->SendServerCommand( -1, va( "print \"%s" S_COLOR_WHITE " %s %s\n\"", oldname, G_GetStringEdString( "MP_SVGAME", "PLRENAME" ), client->pers.netname ) ); G_LogPrintf( "ClientRename: %i [%s] (%s) \"%s^7\" -> \"%s^7\"\n", clientNum, ent->client->sess.IP, ent->client->pers.guid, oldname, ent->client->pers.netname ); client->pers.netnameTime = level.time + 5000; } @@ -2294,7 +2316,7 @@ qboolean ClientUserinfoChanged( int clientNum ) { s = Info_ValueForKey( userinfo, "snaps" ); if ( atoi( s ) < sv_fps.integer ) - trap->SendServerCommand( clientNum, va( "print \""S_COLOR_YELLOW"Recommend setting /snaps %d or higher to match this server's sv_fps\n\"", sv_fps.integer ) ); + trap->SendServerCommand( clientNum, va( "print \"" S_COLOR_YELLOW "Recommend setting /snaps %d or higher to match this server's sv_fps\n\"", sv_fps.integer ) ); // send over a subset of the userinfo keys so other clients can // print scoreboards, display models, and play custom sounds @@ -3912,6 +3934,16 @@ void ClientDisconnect( int clientNum ) { G_LeaveVehicle( ent, qtrue ); + if ( ent->client->ewebIndex ) + { + gentity_t *eweb = &g_entities[ent->client->ewebIndex]; + + ent->client->ps.emplacedIndex = 0; + ent->client->ewebIndex = 0; + ent->client->ewebHealth = 0; + G_FreeEntity( eweb ); + } + // stop any following clients for ( i = 0 ; i < level.maxclients ; i++ ) { if ( level.clients[i].sess.sessionTeam == TEAM_SPECTATOR diff --git a/codemp/game/g_cmds.c b/codemp/game/g_cmds.c index bbc7572af0..c6df3ff8b6 100644 --- a/codemp/game/g_cmds.c +++ b/codemp/game/g_cmds.c @@ -1,5 +1,27 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "g_local.h" #include "bg_saga.h" @@ -545,24 +567,6 @@ void Cmd_KillOther_f( gentity_t *ent ) G_Kill( otherEnt ); } -gentity_t *G_GetDuelWinner(gclient_t *client) -{ - gclient_t *wCl; - int i; - - for ( i = 0 ; i < level.maxclients ; i++ ) { - wCl = &level.clients[i]; - - if (wCl && wCl != client && /*wCl->ps.clientNum != client->ps.clientNum &&*/ - wCl->pers.connected == CON_CONNECTED && wCl->sess.sessionTeam != TEAM_SPECTATOR) - { - return &g_entities[wCl->ps.clientNum]; - } - } - - return NULL; -} - /* ================= BroadCastTeamChange @@ -589,29 +593,8 @@ void BroadcastTeamChange( gclient_t *client, int oldTeam ) trap->SendServerCommand( -1, va("cp \"%s" S_COLOR_WHITE " %s\n\"", client->pers.netname, G_GetStringEdString("MP_SVGAME", "JOINEDTHESPECTATORS"))); } else if ( client->sess.sessionTeam == TEAM_FREE ) { - if (level.gametype == GT_DUEL || level.gametype == GT_POWERDUEL) - { - /* - gentity_t *currentWinner = G_GetDuelWinner(client); - - if (currentWinner && currentWinner->client) - { - trap->SendServerCommand( -1, va("cp \"%s" S_COLOR_WHITE " %s %s\n\"", - currentWinner->client->pers.netname, G_GetStringEdString("MP_SVGAME", "VERSUS"), client->pers.netname)); - } - else - { - trap->SendServerCommand( -1, va("cp \"%s" S_COLOR_WHITE " %s\n\"", - client->pers.netname, G_GetStringEdString("MP_SVGAME", "JOINEDTHEBATTLE"))); - } - */ - //NOTE: Just doing a vs. once it counts two players up - } - else - { - trap->SendServerCommand( -1, va("cp \"%s" S_COLOR_WHITE " %s\n\"", - client->pers.netname, G_GetStringEdString("MP_SVGAME", "JOINEDTHEBATTLE"))); - } + trap->SendServerCommand( -1, va("cp \"%s" S_COLOR_WHITE " %s\n\"", + client->pers.netname, G_GetStringEdString("MP_SVGAME", "JOINEDTHEBATTLE"))); } G_LogPrintf( "ChangeTeam: %i [%s] (%s) \"%s^7\" %s -> %s\n", (int)(client - level.clients), client->sess.IP, client->pers.guid, client->pers.netname, TeamName( oldTeam ), TeamName( client->sess.sessionTeam ) ); @@ -963,7 +946,7 @@ void StopFollowing( gentity_t *ent ) { ent->client->ps.forceHandExtend = HANDEXTEND_NONE; ent->client->ps.forceHandExtendTime = 0; ent->client->ps.zoomMode = 0; - ent->client->ps.zoomLocked = 0; + ent->client->ps.zoomLocked = qfalse; ent->client->ps.zoomLockTime = 0; ent->client->ps.saberMove = LS_NONE; ent->client->ps.legsAnim = 0; @@ -1472,7 +1455,7 @@ void Cmd_FollowCycle_f( gentity_t *ent, int dir ) { clientnum += dir; if ( clientnum >= level.maxclients ) { - //JAC: Avoid /team follow1 crash + // Avoid /team follow1 crash if ( looped ) { clientnum = original; @@ -2119,7 +2102,7 @@ static voteString_t validVoteStrings[] = { { "map", NULL, G_VoteMap, 0, GTB_ALL, qtrue, "" }, { "map_restart", "restart", G_VoteMapRestart, 0, GTB_ALL, qtrue, "" }, { "nextmap", NULL, G_VoteNextmap, 0, GTB_ALL, qtrue, NULL }, - { "timelimit", "time", G_VoteTimelimit, 1, GTB_ALL, qtrue, "" }, + { "timelimit", "time", G_VoteTimelimit, 1, GTB_ALL &~GTB_SIEGE, qtrue, "" }, }; static const int validVoteStringsSize = ARRAY_LEN( validVoteStrings ); diff --git a/codemp/game/g_combat.c b/codemp/game/g_combat.c index d46008e7ed..ccccc690f0 100644 --- a/codemp/game/g_combat.c +++ b/codemp/game/g_combat.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // g_combat.c #include "b_local.h" diff --git a/codemp/game/g_cvar.c b/codemp/game/g_cvar.c index 492b9e7971..ea8f8d0468 100644 --- a/codemp/game/g_cvar.c +++ b/codemp/game/g_cvar.c @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "g_local.h" // diff --git a/codemp/game/g_exphysics.c b/codemp/game/g_exphysics.c index 7f064488d2..3c556937f2 100644 --- a/codemp/game/g_exphysics.c +++ b/codemp/game/g_exphysics.c @@ -1,5 +1,25 @@ -// Copyright (C) 2000-2002 Raven Software, Inc. -// +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + /***************************************************************************** * name: g_exphysics.c * diff --git a/codemp/game/g_items.c b/codemp/game/g_items.c index f8aa0075ce..074b4df394 100644 --- a/codemp/game/g_items.c +++ b/codemp/game/g_items.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "g_local.h" #include "ghoul2/G2.h" #include "qcommon/q_shared.h" diff --git a/codemp/game/g_local.h b/codemp/game/g_local.h index 9cb535bc32..34601bd45e 100644 --- a/codemp/game/g_local.h +++ b/codemp/game/g_local.h @@ -1,7 +1,29 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once -// Copyright (C) 1999-2000 Id Software, Inc. -// // g_local.h -- local definitions for game module #include "qcommon/q_shared.h" @@ -984,6 +1006,8 @@ typedef struct level_locals_s { } locations; gametype_t gametype; + char mapname[MAX_QPATH]; + char rawmapname[MAX_QPATH]; } level_locals_t; @@ -1012,8 +1036,6 @@ int G_ItemUsable(playerState_t *ps, int forcedUse); void Cmd_ToggleSaber_f(gentity_t *ent); void Cmd_EngageDuel_f(gentity_t *ent); -gentity_t *G_GetDuelWinner(gclient_t *client); - // // g_items.c // diff --git a/codemp/game/g_log.c b/codemp/game/g_log.c index a5228b2cbe..a513f1ddef 100644 --- a/codemp/game/g_log.c +++ b/codemp/game/g_log.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "g_local.h" #define LOGGING_WEAPONS diff --git a/codemp/game/g_main.c b/codemp/game/g_main.c index f81acd3906..e2a3e6bfe4 100644 --- a/codemp/game/g_main.c +++ b/codemp/game/g_main.c @@ -1,5 +1,27 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "g_local.h" #include "g_ICARUScb.h" @@ -131,6 +153,12 @@ void G_CacheGametype( void ) trap->Cvar_Update( &g_gametype ); } +void G_CacheMapname( const vmCvar_t *mapname ) +{ + Com_sprintf( level.mapname, sizeof( level.mapname ), "maps/%s.bsp", mapname->string ); + Com_sprintf( level.rawmapname, sizeof( level.rawmapname ), "maps/%s", mapname->string ); +} + /* ============ G_InitGame @@ -281,6 +309,7 @@ void G_InitGame( int levelTime, int randomSeed, int restart ) { InitSiegeMode(); trap->Cvar_Register( &mapname, "mapname", "", CVAR_SERVERINFO | CVAR_ROM ); + G_CacheMapname( &mapname ); trap->Cvar_Register( &ckSum, "sv_mapChecksum", "", CVAR_ROM ); navCalculatePaths = ( trap->Nav_Load( mapname.string, ckSum.integer ) == qfalse ); @@ -1083,20 +1112,6 @@ void CalculateRanks( void ) { if ( !g_warmup.integer || level.gametype == GT_SIEGE ) level.warmupTime = 0; - /* - if (level.numNonSpectatorClients == 2 && preNumSpec < 2 && nonSpecIndex != -1 && level.gametype == GT_DUEL && !level.warmupTime) - { - gentity_t *currentWinner = G_GetDuelWinner(&level.clients[nonSpecIndex]); - - if (currentWinner && currentWinner->client) - { - trap->SendServerCommand( -1, va("cp \"%s" S_COLOR_WHITE " %s %s\n\"", - currentWinner->client->pers.netname, G_GetStringEdString("MP_SVGAME", "VERSUS"), level.clients[nonSpecIndex].pers.netname)); - } - } - */ - //NOTE: for now not doing this either. May use later if appropriate. - qsort( level.sortedClients, level.numConnectedClients, sizeof(level.sortedClients[0]), SortRanks ); diff --git a/codemp/game/g_mem.c b/codemp/game/g_mem.c index 5e596c9a78..b047df8f67 100644 --- a/codemp/game/g_mem.c +++ b/codemp/game/g_mem.c @@ -1,7 +1,28 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// -// Simple linear memory allocator +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // g_mem.c +// Simple linear memory allocator // #include "g_local.h" @@ -39,7 +60,7 @@ void *G_Alloc( int size ) { } if ( allocPoint + size > POOLSIZE ) { - trap->Error( ERR_DROP, "G_Alloc: failed on allocation of %i bytes\n", size ); // bk010103 - was %u, but is signed + trap->Error( ERR_DROP, "G_Alloc: failed on allocation of %i bytes\n", size ); // bk010103 - was %u, but is signed return NULL; } diff --git a/codemp/game/g_misc.c b/codemp/game/g_misc.c index 1e645535ef..1a1dcbbac2 100644 --- a/codemp/game/g_misc.c +++ b/codemp/game/g_misc.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // g_misc.c #include "g_local.h" diff --git a/codemp/game/g_missile.c b/codemp/game/g_missile.c index 5f8600d5a0..d87a1e8175 100644 --- a/codemp/game/g_missile.c +++ b/codemp/game/g_missile.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "g_local.h" #include "w_saber.h" #include "qcommon/q_shared.h" diff --git a/codemp/game/g_mover.c b/codemp/game/g_mover.c index a3e9dfd2e1..4db30f45b8 100644 --- a/codemp/game/g_mover.c +++ b/codemp/game/g_mover.c @@ -1,10 +1,30 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_local.h" - /* =============================================================================== @@ -1787,25 +1807,6 @@ void Reached_Train( gentity_t *ent ) { ent->s.pos.trDuration = length * 1000 / speed; - // Tequila comment: Be sure to send to clients after any fast move case - ent->r.svFlags &= ~SVF_NOCLIENT; - - // Tequila comment: Fast move case - if ( ent->s.pos.trDuration < 1 ) { - // Tequila comment: As trDuration is used later in a division, we need to avoid that case now - // With null trDuration, - // the calculated rocks bounding box becomes infinite and the engine think for a short time - // any entity is riding that mover but not the world entity... In rare case, I found it - // can also stuck every map entities after func_door are used. - // The desired effect with very very big speed is to have instant move, so any not null duration - // lower than a frame duration should be sufficient. - // Afaik, the negative case don't have to be supported. - ent->s.pos.trDuration = 1; - - // Tequila comment: Don't send entity to clients so it becomes really invisible - ent->r.svFlags |= SVF_NOCLIENT; - } - // start it going SetMoverState( ent, MOVER_1TO2, level.time ); diff --git a/codemp/game/g_nav.c b/codemp/game/g_nav.c index 452bf17cf8..dadff7f035 100644 --- a/codemp/game/g_nav.c +++ b/codemp/game/g_nav.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #include "g_nav.h" diff --git a/codemp/game/g_nav.h b/codemp/game/g_nav.h index c16073a066..3a269d83f9 100644 --- a/codemp/game/g_nav.h +++ b/codemp/game/g_nav.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once //This file is shared by the exe nav code. diff --git a/codemp/game/g_navnew.c b/codemp/game/g_navnew.c index 8a18169997..c937755d9a 100644 --- a/codemp/game/g_navnew.c +++ b/codemp/game/g_navnew.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #include "g_nav.h" diff --git a/codemp/game/g_object.c b/codemp/game/g_object.c index 4ff20c9854..6f6c3a7aaa 100644 --- a/codemp/game/g_object.c +++ b/codemp/game/g_object.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "g_local.h" extern void G_MoverTouchPushTriggers( gentity_t *ent, vec3_t oldOrg ); diff --git a/codemp/game/g_public.h b/codemp/game/g_public.h index 1423a81e1a..4ebeed70f9 100644 --- a/codemp/game/g_public.h +++ b/codemp/game/g_public.h @@ -1,10 +1,30 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -// Copyright (C) 1999-2000 Id Software, Inc. -// +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ // g_public.h -- game module information visible to server +#pragma once + #include "qcommon/q_shared.h" #define Q3_INFINITE 16777216 @@ -89,11 +109,10 @@ typedef struct entityShared_s { // entity[ent->s.ownerNum].ownerNum = passEntityNum (don't interact with other missiles from owner) int ownerNum; - // mask of clients that this entity should be broadcast too. The first 32 clients - // are represented by the first array index and the latter 32 clients are represented - // by the second array index. - int broadcastClients[2]; - + // mask of clients that this entity should be broadcast to + // the first 32 clients are represented by the first array index and the latter 32 clients are represented by the + // second array index. + uint32_t broadcastClients[2]; } entityShared_t; //bstate.h diff --git a/codemp/game/g_saga.c b/codemp/game/g_saga.c index 22afe65409..70424152fb 100644 --- a/codemp/game/g_saga.c +++ b/codemp/game/g_saga.c @@ -1,5 +1,25 @@ -// Copyright (C) 2000-2002 Raven Software, Inc. -// +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + /***************************************************************************** * name: g_saga.c * @@ -780,7 +800,7 @@ void G_ValidateSiegeClassForTeam(gentity_t *ent, int team) if (newClassIndex != -1) { //ok, let's find it in the global class array ent->client->siegeClass = BG_SiegeFindClassIndexByName(stm->classes[newClassIndex]->name); - strcpy(ent->client->sess.siegeClass, stm->classes[newClassIndex]->name); + Q_strncpyz( ent->client->sess.siegeClass, stm->classes[newClassIndex]->name, sizeof( ent->client->sess.siegeClass )); } } } diff --git a/codemp/game/g_session.c b/codemp/game/g_session.c index c087edf96f..d582337126 100644 --- a/codemp/game/g_session.c +++ b/codemp/game/g_session.c @@ -1,7 +1,28 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// -#include "g_local.h" +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ +#include "g_local.h" /* ======================================================================= @@ -141,7 +162,7 @@ void G_InitSessionData( gclient_t *client, char *userinfo, qboolean isBot ) { if ( level.gametype >= GT_TEAM ) { if ( g_teamAutoJoin.integer && !(g_entities[client-level.clients].r.svFlags & SVF_BOT) ) { sess->sessionTeam = PickTeam( -1 ); - BroadcastTeamChange( client, -1 ); + client->ps.fd.forceDoInit = 1; //every time we change teams make sure our force powers are set right } else { // always spawn as spectator in team games if (!isBot) @@ -163,7 +184,7 @@ void G_InitSessionData( gclient_t *client, char *userinfo, qboolean isBot ) { { sess->sessionTeam = PickTeam( -1 ); } - BroadcastTeamChange( client, -1 ); + client->ps.fd.forceDoInit = 1; //every time we change teams make sure our force powers are set right } } } else { diff --git a/codemp/game/g_spawn.c b/codemp/game/g_spawn.c index 6d650d9b59..03fbbab516 100644 --- a/codemp/game/g_spawn.c +++ b/codemp/game/g_spawn.c @@ -1,5 +1,25 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_local.h" @@ -1482,9 +1502,9 @@ void SP_worldspawn( void ) G_SpawnString( "gravity", "800", &text ); trap->Cvar_Set( "g_gravity", text ); + trap->Cvar_Update( &g_gravity ); G_SpawnString( "enableBreath", "0", &text ); - trap->Cvar_Set( "g_enableBreath", text ); G_SpawnString( "soundSet", "default", &text ); trap->SetConfigstring( CS_GLOBAL_AMBIENT_SET, text ); @@ -1501,6 +1521,7 @@ void SP_worldspawn( void ) trap->SetConfigstring( CS_WARMUP, "" ); if ( g_restarted.integer ) { trap->Cvar_Set( "g_restarted", "0" ); + trap->Cvar_Update( &g_restarted ); level.warmupTime = 0; } else if ( g_doWarmup.integer && level.gametype != GT_DUEL && level.gametype != GT_POWERDUEL && level.gametype != GT_SIEGE ) { // Turn it on diff --git a/codemp/game/g_svcmds.c b/codemp/game/g_svcmds.c index 29d71cab87..d037d5b55d 100644 --- a/codemp/game/g_svcmds.c +++ b/codemp/game/g_svcmds.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ // this file holds commands that can be executed by the server console, but not remote clients @@ -111,7 +132,7 @@ static void UpdateIPBans( void ) { if ( m.b[j] != 0xFF ) Q_strcat( ip, sizeof( ip ), "*" ); else - Q_strcat( ip, sizeof( ip ), va( "%i", (int)b.c[j] ) ); + Q_strcat( ip, sizeof( ip ), va( "%i", b.b[j] ) ); Q_strcat( ip, sizeof( ip ), (j<3) ? "." : " " ); } if ( strlen( iplist_final )+strlen( ip ) < MAX_CVAR_VALUE_STRING ) diff --git a/codemp/game/g_syscalls.c b/codemp/game/g_syscalls.c index f082c3d8c0..52d0d25427 100644 --- a/codemp/game/g_syscalls.c +++ b/codemp/game/g_syscalls.c @@ -1,7 +1,28 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // this file is only included when building a dll -// g_syscalls.asm is included instead when building a qvm #include "g_local.h" static void TranslateSyscalls( void ); diff --git a/codemp/game/g_target.c b/codemp/game/g_target.c index 9d9212eb64..2e2b1f721e 100644 --- a/codemp/game/g_target.c +++ b/codemp/game/g_target.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "g_local.h" //========================================================== @@ -576,9 +597,10 @@ void SP_target_location( gentity_t *self ) { if ( level.locations.num >= MAX_LOCATIONS ) { if ( !didwarn ) { - trap->Print( "Maximum target_locations hit (%d)\n", MAX_LOCATIONS ); + trap->Print( "Maximum target_locations hit (%d)! Remaining locations will be removed.\n", MAX_LOCATIONS ); didwarn = qtrue; } + G_FreeEntity( self ); return; } diff --git a/codemp/game/g_team.c b/codemp/game/g_team.c index 2240c97022..ece5c3ccf6 100644 --- a/codemp/game/g_team.c +++ b/codemp/game/g_team.c @@ -1,10 +1,29 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #include "g_local.h" #include "bg_saga.h" - typedef struct teamgame_s { float last_flag_capture; int last_capture_team; diff --git a/codemp/game/g_team.h b/codemp/game/g_team.h index 855e6aeba5..3047af54d9 100644 --- a/codemp/game/g_team.h +++ b/codemp/game/g_team.h @@ -1,7 +1,27 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. -// Copyright (C) 1999-2000 Id Software, Inc. -// +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#pragma once #define CTF_CAPTURE_BONUS 100 // what you get for capture #define CTF_TEAM_BONUS 25 // what your team gets for capture diff --git a/codemp/game/g_timer.c b/codemp/game/g_timer.c index cfc15ac0af..63d146159a 100644 --- a/codemp/game/g_timer.c +++ b/codemp/game/g_timer.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + //rww - rewrite from C++ SP version. //This is here only to make porting from SP easier, it's really sort of nasty (being static //now). Basically it's slower and takes more memory. diff --git a/codemp/game/g_trigger.c b/codemp/game/g_trigger.c index 609bcf0e4c..2946e1ec05 100644 --- a/codemp/game/g_trigger.c +++ b/codemp/game/g_trigger.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "g_local.h" #include "bg_saga.h" diff --git a/codemp/game/g_turret.c b/codemp/game/g_turret.c index 73dff3b555..682a8bf32d 100644 --- a/codemp/game/g_turret.c +++ b/codemp/game/g_turret.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "g_local.h" #include "qcommon/q_shared.h" diff --git a/codemp/game/g_turret_G2.c b/codemp/game/g_turret_G2.c index 2c42ac23ac..cfde7602e6 100644 --- a/codemp/game/g_turret_G2.c +++ b/codemp/game/g_turret_G2.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "g_local.h" #include "ghoul2/G2.h" #include "qcommon/q_shared.h" diff --git a/codemp/game/g_utils.c b/codemp/game/g_utils.c index c1ce5595af..7d83e62619 100644 --- a/codemp/game/g_utils.c +++ b/codemp/game/g_utils.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // g_utils.c -- misc utility functions for game module #include "g_local.h" diff --git a/codemp/game/g_vehicleTurret.c b/codemp/game/g_vehicleTurret.c index ab377e4f7c..e2477376c7 100644 --- a/codemp/game/g_vehicleTurret.c +++ b/codemp/game/g_vehicleTurret.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "bg_vehicles.h" #include "b_local.h" #include "ghoul2/G2.h" diff --git a/codemp/game/g_vehicles.c b/codemp/game/g_vehicles.c index 45e99d131f..73fc4e3eae 100644 --- a/codemp/game/g_vehicles.c +++ b/codemp/game/g_vehicles.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "qcommon/q_shared.h" #include "g_local.h" diff --git a/codemp/game/g_weapon.c b/codemp/game/g_weapon.c index b97130828a..f5b3844b52 100644 --- a/codemp/game/g_weapon.c +++ b/codemp/game/g_weapon.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // g_weapon.c // perform the server side effects of a weapon firing diff --git a/codemp/game/g_xcvar.h b/codemp/game/g_xcvar.h index 1fa0939ca1..ea1761c742 100644 --- a/codemp/game/g_xcvar.h +++ b/codemp/game/g_xcvar.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #ifdef XCVAR_PROTO #define XCVAR_DEF( name, defVal, update, flags, announce ) extern vmCvar_t name; diff --git a/codemp/game/inv.h b/codemp/game/inv.h index a97e6a949f..2d5b08166a 100644 --- a/codemp/game/inv.h +++ b/codemp/game/inv.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #define INVENTORY_NONE 0 diff --git a/codemp/game/match.h b/codemp/game/match.h index 0a64d61300..b86a88dece 100644 --- a/codemp/game/match.h +++ b/codemp/game/match.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once //=========================================================================== diff --git a/codemp/game/npc_headers.h b/codemp/game/npc_headers.h index 5a3e02bf35..05bdefb687 100644 --- a/codemp/game/npc_headers.h +++ b/codemp/game/npc_headers.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "b_local.h" diff --git a/codemp/game/surfaceflags.h b/codemp/game/surfaceflags.h index d892d61b6c..e2782a1b54 100644 --- a/codemp/game/surfaceflags.h +++ b/codemp/game/surfaceflags.h @@ -1,7 +1,28 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once -// Copyright (C) 1999-2000 Id Software, Inc. -// // This file must be identical in the quake and utils directories // contents flags are seperate bits diff --git a/codemp/game/teams.h b/codemp/game/teams.h index 16b4252882..b4a830caab 100644 --- a/codemp/game/teams.h +++ b/codemp/game/teams.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once typedef enum //# team_e diff --git a/codemp/game/tri_coll_test.c b/codemp/game/tri_coll_test.c index fa7a9bbd5b..dc63373353 100644 --- a/codemp/game/tri_coll_test.c +++ b/codemp/game/tri_coll_test.c @@ -3,6 +3,24 @@ * See article "A Fast Triangle-Triangle Intersection Test", * Journal of Graphics Tools, 2(2), 1997 * + * + * Copyright (C) 1997 Tomas Möller + * Copyright (C) 2000-2013 Raven Software, Inc. + * Copyright (C) 2001-2013 Activision, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * * int tri_tri_intersect(float V0[3],float V1[3],float V2[3], * float U0[3],float U1[3],float U2[3]) * diff --git a/codemp/game/w_force.c b/codemp/game/w_force.c index c95fa62a5b..64e4f87f00 100644 --- a/codemp/game/w_force.c +++ b/codemp/game/w_force.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "b_local.h" #include "w_saber.h" #include "ai_main.h" @@ -206,7 +228,7 @@ void WP_InitForcePowers( gentity_t *ent ) { if ( strlen( forcePowers ) != DEFAULT_FORCEPOWERS_LEN ) { Q_strncpyz( forcePowers, DEFAULT_FORCEPOWERS, sizeof( forcePowers ) ); - trap->SendServerCommand( ent-g_entities, "print \""S_COLOR_RED"Invalid forcepowers string, setting default\n\"" ); + trap->SendServerCommand( ent-g_entities, "print \"" S_COLOR_RED "Invalid forcepowers string, setting default\n\"" ); } //if it's a bot just copy the info directly from its personality @@ -5414,21 +5436,21 @@ void WP_ForcePowersUpdate( gentity_t *self, usercmd_t *ucmd ) if ( self->client->holdingObjectiveItem && g_entities[self->client->holdingObjectiveItem].inuse && g_entities[self->client->holdingObjectiveItem].genericValue15 ) self->client->ps.fd.forcePowerRegenDebounceTime += 7000; //1 point per 7 seconds.. super slow else if (self->client->siegeClass != -1 && (bgSiegeClasses[self->client->siegeClass].classflags & (1<client->ps.fd.forcePowerRegenDebounceTime += max(g_forceRegenTime.integer*0.2, 1); //if this is siege and our player class has the fast force regen ability, then recharge with 1/5th the usual delay + self->client->ps.fd.forcePowerRegenDebounceTime += Q_max(g_forceRegenTime.integer*0.2, 1); //if this is siege and our player class has the fast force regen ability, then recharge with 1/5th the usual delay else - self->client->ps.fd.forcePowerRegenDebounceTime += max(g_forceRegenTime.integer, 1); + self->client->ps.fd.forcePowerRegenDebounceTime += Q_max(g_forceRegenTime.integer, 1); } else { if ( level.gametype == GT_POWERDUEL && self->client->sess.duelTeam == DUELTEAM_LONE ) { if ( duel_fraglimit.integer ) - self->client->ps.fd.forcePowerRegenDebounceTime += max(g_forceRegenTime.integer * (0.6 + (.3 * (float)self->client->sess.wins / (float)duel_fraglimit.integer)), 1); + self->client->ps.fd.forcePowerRegenDebounceTime += Q_max(g_forceRegenTime.integer * (0.6 + (.3 * (float)self->client->sess.wins / (float)duel_fraglimit.integer)), 1); else - self->client->ps.fd.forcePowerRegenDebounceTime += max(g_forceRegenTime.integer*0.7, 1); + self->client->ps.fd.forcePowerRegenDebounceTime += Q_max(g_forceRegenTime.integer*0.7, 1); } else - self->client->ps.fd.forcePowerRegenDebounceTime += max(g_forceRegenTime.integer, 1); + self->client->ps.fd.forcePowerRegenDebounceTime += Q_max(g_forceRegenTime.integer, 1); } } } diff --git a/codemp/game/w_saber.c b/codemp/game/w_saber.c index 4e3b273175..aa283ed4d7 100644 --- a/codemp/game/w_saber.c +++ b/codemp/game/w_saber.c @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "g_local.h" #include "bg_local.h" #include "w_saber.h" diff --git a/codemp/game/w_saber.h b/codemp/game/w_saber.h index c2699d0020..f501a8fb55 100644 --- a/codemp/game/w_saber.h +++ b/codemp/game/w_saber.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #define ARMOR_EFFECT_TIME 500 diff --git a/codemp/ghoul2/G2.h b/codemp/ghoul2/G2.h index 1e9c9b08c7..27e4dbeaf9 100644 --- a/codemp/ghoul2/G2.h +++ b/codemp/ghoul2/G2.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #define BONE_ANGLES_PREMULT 0x0001 diff --git a/codemp/ghoul2/G2_gore.cpp b/codemp/ghoul2/G2_gore.cpp index 2a912eaba1..719d1de17d 100644 --- a/codemp/ghoul2/G2_gore.cpp +++ b/codemp/ghoul2/G2_gore.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "G2_gore.h" #include "../rd-common/tr_common.h" diff --git a/codemp/ghoul2/G2_gore.h b/codemp/ghoul2/G2_gore.h index f5f07e4f43..613ed0ab51 100644 --- a/codemp/ghoul2/G2_gore.h +++ b/codemp/ghoul2/G2_gore.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "../ghoul2/ghoul2_shared.h" @@ -38,7 +60,7 @@ class CGoreSet public: int mMyGoreSetTag; unsigned char mRefCount; - multimap mGoreRecords; // a map from surface index + std::multimap mGoreRecords; // a map from surface index CGoreSet(int tag) : mMyGoreSetTag(tag), mRefCount(0) {} ~CGoreSet(); }; @@ -52,11 +74,6 @@ void DeleteGoreSet(int goreSetTag); //rww - RAGDOLL_BEGIN /// ragdoll stuff - -#ifdef _MSC_VER -#pragma warning(disable: 4512) -#endif - struct SRagDollEffectorCollision { vec3_t effectorPosition; diff --git a/codemp/ghoul2/g2_local.h b/codemp/ghoul2/g2_local.h index 1366047adf..ac8e6753a4 100644 --- a/codemp/ghoul2/g2_local.h +++ b/codemp/ghoul2/g2_local.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // defines to setup the @@ -20,8 +42,8 @@ class IGhoul2InfoArray virtual int New()=0; virtual void Delete(int handle)=0; virtual bool IsValid(int handle) const=0; - virtual vector &Get(int handle)=0; - virtual const vector &Get(int handle) const=0; + virtual std::vector &Get(int handle)=0; + virtual const std::vector &Get(int handle) const=0; }; IGhoul2InfoArray &TheGhoul2InfoArray(); @@ -47,12 +69,12 @@ class CGhoul2Info_v mItem=0; } } - vector &Array() + std::vector &Array() { assert(InfoArray().IsValid(mItem)); return InfoArray().Get(mItem); } - const vector &Array() const + const std::vector &Array() const { assert(InfoArray().IsValid(mItem)); return InfoArray().Get(mItem); @@ -188,7 +210,7 @@ qboolean G2_Stop_Bone_Angles(const char *fileName, boneInfo_v &blist, const char //rww - RAGDOLL_BEGIN void G2_Animate_Bone_List(CGhoul2Info_v &ghoul2, const int currentTime, const int index,CRagDollUpdateParams *params); //rww - RAGDOLL_END -void G2_Init_Bone_List(boneInfo_v &blist); +void G2_Init_Bone_List(boneInfo_v &blist, int numBones); int G2_Find_Bone_In_List(boneInfo_v &blist, const int boneNum); void G2_RemoveRedundantBoneOverrides(boneInfo_v &blist, int *activeBones); qboolean G2_Set_Bone_Angles_Matrix(const char *fileName, boneInfo_v &blist, const char *boneName, const mdxaBone_t &matrix, const int flags, qhandle_t *modelList, const int modelIndex, const int blendTime, const int currentTime); diff --git a/codemp/ghoul2/ghoul2_shared.h b/codemp/ghoul2/ghoul2_shared.h index f8f65d77ea..f20fa75c54 100644 --- a/codemp/ghoul2/ghoul2_shared.h +++ b/codemp/ghoul2/ghoul2_shared.h @@ -1,20 +1,29 @@ -#pragma once - /* -Ghoul2 Insert Start +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -#ifdef _MSC_VER -#pragma warning (push, 3) //go back down to 3 for the stl include -#endif + +#pragma once + #include #include -#ifdef _MSC_VER -#pragma warning (pop) -#endif -using namespace std; -/* -Ghoul2 Insert End -*/ #define MDXABONEDEF #include "rd-common/mdx_format.h" @@ -221,10 +230,10 @@ struct SSkinGoreData #define MAX_GHOUL_COUNT_BITS 8 // bits required to send across the MAX_G2_MODELS inside of the networking - this is the only restriction on ghoul models possible per entity -typedef vector surfaceInfo_v; -typedef vector boneInfo_v; -typedef vector boltInfo_v; -typedef vector > mdxaBone_v; +typedef std::vector surfaceInfo_v; +typedef std::vector boneInfo_v; +typedef std::vector boltInfo_v; +typedef std::vector > mdxaBone_v; // defines for stuff to go into the mflags #define GHOUL2_NOCOLLIDE 0x001 diff --git a/codemp/icarus/BlockStream.cpp b/codemp/icarus/BlockStream.cpp index 3189f589da..2c0398186a 100644 --- a/codemp/icarus/BlockStream.cpp +++ b/codemp/icarus/BlockStream.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Interpreted Block Stream Functions // // -- jweier @@ -5,12 +27,6 @@ // this include must remain at the top of every Icarus CPP file #include "icarus.h" - -#ifdef _MSC_VER -#pragma warning(disable : 4100) //unref formal parm -#pragma warning(disable : 4710) //member not inlined -#endif - #include #include "blockstream.h" diff --git a/codemp/icarus/GameInterface.cpp b/codemp/icarus/GameInterface.cpp index dfe6506182..f44c084e93 100644 --- a/codemp/icarus/GameInterface.cpp +++ b/codemp/icarus/GameInterface.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // ICARUS Utility functions //rww - mangled to work in server exe setting. diff --git a/codemp/icarus/GameInterface.h b/codemp/icarus/GameInterface.h index 8f010a8357..666fd6c035 100644 --- a/codemp/icarus/GameInterface.h +++ b/codemp/icarus/GameInterface.h @@ -1,13 +1,38 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once +#include +#include + typedef struct pscript_s { char *buffer; long length; } pscript_t; -typedef map < string, int, less, allocator > entlist_t; -typedef map < string, pscript_t*, less, allocator > bufferlist_t; +typedef std::map < std::string, int > entlist_t; +typedef std::map < std::string, pscript_t* > bufferlist_t; //ICARUS includes extern interface_export_t interface_export; diff --git a/codemp/icarus/Instance.cpp b/codemp/icarus/Instance.cpp index 9eea6103fa..58b32617f3 100644 --- a/codemp/icarus/Instance.cpp +++ b/codemp/icarus/Instance.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // ICARUS Instance // // -- jweier diff --git a/codemp/icarus/Interface.cpp b/codemp/icarus/Interface.cpp index 1aeae84d2c..fa64e91342 100644 --- a/codemp/icarus/Interface.cpp +++ b/codemp/icarus/Interface.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // ICARUS Engine Interface File // // This file is the only section of the ICARUS systems that diff --git a/codemp/icarus/Memory.cpp b/codemp/icarus/Memory.cpp index 9f17f1f334..d9d907cf19 100644 --- a/codemp/icarus/Memory.cpp +++ b/codemp/icarus/Memory.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "icarus.h" // leave these two as standard mallocs for the moment, there's something weird happening in ICARUS... diff --git a/codemp/icarus/Q3_Interface.cpp b/codemp/icarus/Q3_Interface.cpp index 580be87d91..667bafe394 100644 --- a/codemp/icarus/Q3_Interface.cpp +++ b/codemp/icarus/Q3_Interface.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // ICARUS Engine Interface File // // This file is the only section of the ICARUS systems that diff --git a/codemp/icarus/Q3_Interface.h b/codemp/icarus/Q3_Interface.h index e4941eb4ea..a8df673de2 100644 --- a/codemp/icarus/Q3_Interface.h +++ b/codemp/icarus/Q3_Interface.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once //NOTENOTE: The enums and tables in this file will obviously bitch if they are included multiple times, don't do that diff --git a/codemp/icarus/Q3_Registers.cpp b/codemp/icarus/Q3_Registers.cpp index ab9cfaa9f6..53fd3b01dc 100644 --- a/codemp/icarus/Q3_Registers.cpp +++ b/codemp/icarus/Q3_Registers.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "game/g_public.h" #include "Q3_Registers.h" diff --git a/codemp/icarus/Q3_Registers.h b/codemp/icarus/Q3_Registers.h index 3df6c1117c..abed6c4a44 100644 --- a/codemp/icarus/Q3_Registers.h +++ b/codemp/icarus/Q3_Registers.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once enum @@ -12,8 +34,8 @@ enum #define MAX_VARIABLES 32 -typedef map < string, string > varString_m; -typedef map < string, float > varFloat_m; +typedef std::map < std::string, std::string > varString_m; +typedef std::map < std::string, float > varFloat_m; extern varString_m varStrings; extern varFloat_m varFloats; diff --git a/codemp/icarus/Sequence.cpp b/codemp/icarus/Sequence.cpp index 3988532cd3..9f39c929bf 100644 --- a/codemp/icarus/Sequence.cpp +++ b/codemp/icarus/Sequence.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Script Command Sequences // // -- jweier diff --git a/codemp/icarus/Sequencer.cpp b/codemp/icarus/Sequencer.cpp index c9a2ac23d8..63d1a87003 100644 --- a/codemp/icarus/Sequencer.cpp +++ b/codemp/icarus/Sequencer.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Script Command Sequencer // // -- jweier @@ -6,6 +28,7 @@ #include "icarus.h" #include "assert.h" +#include // Sequencer @@ -162,7 +185,7 @@ Deletes parsing stream */ void CSequencer::DeleteStream( bstream_t *bstream ) { - vector::iterator finder = find(m_streamsCreated.begin(), m_streamsCreated.end(), bstream); + std::vector::iterator finder = std::find(m_streamsCreated.begin(), m_streamsCreated.end(), bstream); if(finder != m_streamsCreated.end()) { m_streamsCreated.erase(finder); @@ -2248,13 +2271,7 @@ int CSequencer::DestroySequence( CSequence *sequence ) { if((*tsi).second == sequence) { -#ifdef _WIN32 - tsi = m_taskSequences.erase(tsi); -#else - taskSequence_m::iterator itTemp = tsi; - ++tsi; - m_taskSequences.erase(itTemp); -#endif + m_taskSequences.erase(tsi++); } else { diff --git a/codemp/icarus/TaskManager.cpp b/codemp/icarus/TaskManager.cpp index 390d98dcd3..c4e31c24a2 100644 --- a/codemp/icarus/TaskManager.cpp +++ b/codemp/icarus/TaskManager.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Task Manager // // -- jweier diff --git a/codemp/icarus/blockstream.h b/codemp/icarus/blockstream.h index a7bea247f3..afcba7050a 100644 --- a/codemp/icarus/blockstream.h +++ b/codemp/icarus/blockstream.h @@ -1,24 +1,33 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors -// BlockStream.h +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -#ifdef _MSC_VER -#pragma warning(disable : 4786) //identifier was truncated -#pragma warning(disable : 4514) //unreffed inline func removed -#endif +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ +#pragma once + +// BlockStream.h #include "qcommon/qcommon.h" #include -#ifdef _MSC_VER -#pragma warning (push, 3) //go back down to 3 for the stl include -#endif #include #include -#ifdef _MSC_VER -#pragma warning (pop) -#endif -using namespace std; #define IBI_EXT ".IBI" //(I)nterpreted (B)lock (I)nstructions #define IBI_HEADER_ID "IBI" @@ -114,7 +123,7 @@ class CBlockMember class CBlock { - typedef vector< CBlockMember * > blockMember_v; + typedef std::vector< CBlockMember * > blockMember_v; public: diff --git a/codemp/icarus/icarus.h b/codemp/icarus/icarus.h index 4506f58c6c..e8803ad175 100644 --- a/codemp/icarus/icarus.h +++ b/codemp/icarus/icarus.h @@ -1,24 +1,32 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors -// ICARUS Public Header File +This file is part of the OpenJK source code. -#ifdef _MSC_VER -#pragma warning ( disable : 4786 ) //NOTENOTE: STL Debug name length warning -#endif +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. -extern void *ICARUS_Malloc(int iSize); -extern void ICARUS_Free(void *pMem); +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -#include "game/g_public.h" +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ -#ifdef _MSC_VER -#pragma warning( disable : 4786 ) // identifier was truncated -#pragma warning( disable : 4514 ) // unreferenced inline was removed -#pragma warning( disable : 4710 ) // not inlined +#pragma once -#pragma warning( push, 3 ) //save current state and change to 3 -#endif +// ICARUS Public Header File +extern void *ICARUS_Malloc(int iSize); +extern void ICARUS_Free(void *pMem); +#include "game/g_public.h" #define STL_ITERATE( a, b ) for ( a = b.begin(); a != b.end(); ++a ) #define STL_INSERT( a, b ) a.insert( a.end(), b ); @@ -28,7 +36,3 @@ extern void ICARUS_Free(void *pMem); #include "sequencer.h" #include "taskmanager.h" #include "instance.h" - -#ifdef _MSC_VER -#pragma warning( pop ) //restore -#endif diff --git a/codemp/icarus/instance.h b/codemp/icarus/instance.h index dd6344b785..954766bedf 100644 --- a/codemp/icarus/instance.h +++ b/codemp/icarus/instance.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // ICARUS Intance header @@ -12,9 +34,9 @@ class ICARUS_Instance { public: - typedef list< CSequence * > sequence_l; - typedef list< CSequencer * > sequencer_l; - typedef map < string, unsigned char > signal_m; + typedef std::list< CSequence * > sequence_l; + typedef std::list< CSequencer * > sequencer_l; + typedef std::map < std::string, unsigned char > signal_m; ICARUS_Instance( void ); virtual ~ICARUS_Instance( void ); diff --git a/codemp/icarus/interface.h b/codemp/icarus/interface.h index 9a70dac418..6013e4570c 100644 --- a/codemp/icarus/interface.h +++ b/codemp/icarus/interface.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // ICARUS Interface header file diff --git a/codemp/icarus/interpreter.h b/codemp/icarus/interpreter.h index cb2cf0f5a9..ca87f7b8fb 100644 --- a/codemp/icarus/interpreter.h +++ b/codemp/icarus/interpreter.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // Interpreter.h @@ -111,6 +133,7 @@ enum }; #ifdef __cplusplus + typedef struct variable_s { char name[MAX_VAR_NAME]; @@ -118,8 +141,8 @@ typedef struct variable_s void *data; } variable_t; -typedef map< string, variable_t * > variable_m; -typedef vector < variable_t * > variable_v; +typedef std::map< std::string, variable_t * > variable_m; +typedef std::vector < variable_t * > variable_v; //CInterpreter @@ -208,8 +231,8 @@ class CInterpreter variable_v m_vars; variable_m m_varMap; - string m_sCurrentLine; // used in IBIze error reporting for more clarity - string m_sCurrentFile; // full-pathed name of .TXT file (needed because of above, which affects parsestreams) + std::string m_sCurrentLine; // used in IBIze error reporting for more clarity + std::string m_sCurrentFile; // full-pathed name of .TXT file (needed because of above, which affects parsestreams) int m_iCurrentLine; // also needed now because of 'm_sCurrentLine' int m_iBadCBlockNumber; // used for final app return code (NZ = err) diff --git a/codemp/icarus/sequence.h b/codemp/icarus/sequence.h index e70694df52..19c80f23e0 100644 --- a/codemp/icarus/sequence.h +++ b/codemp/icarus/sequence.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // Sequence Header File @@ -11,9 +33,9 @@ class ICARUS_Instance; class CSequence { - typedef list < CSequence * > sequence_l; - typedef map < int, CSequence *> sequenceID_m; - typedef list < CBlock * > block_l; + typedef std::list < CSequence * > sequence_l; + typedef std::map < int, CSequence *> sequenceID_m; + typedef std::list < CBlock * > block_l; public: diff --git a/codemp/icarus/sequencer.h b/codemp/icarus/sequencer.h index 8a10120885..608ebe91ac 100644 --- a/codemp/icarus/sequencer.h +++ b/codemp/icarus/sequencer.h @@ -1,30 +1,38 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // Sequencer Header File - #include "blockstream.h" #include "interface.h" #include "taskmanager.h" #include "sequence.h" -#ifdef _MSC_VER -#pragma warning(disable : 4786) //identifier was truncated - -#pragma warning (push, 3) //go back down to 3 for the stl include -#pragma warning (disable:4503) // decorated name length xceeded, name was truncated -#endif #include #include #include -#include -#ifdef _MSC_VER -#pragma warning (pop) -#pragma warning (disable:4503) // decorated name length xceeded, name was truncated -#endif -using namespace std; //Defines - #define SQ_COMMON 0x00000000 //Common one-pass sequence #define SQ_LOOP 0x00000001 //Looping sequence #define SQ_RETAIN 0x00000002 //Inside a looping sequence list, retain the information @@ -71,8 +79,8 @@ class ICARUS_Instance; class CSequencer { // typedef map < int, CSequence * > sequenceID_m; - typedef list < CSequence * > sequence_l; - typedef map < CTaskGroup *, CSequence * > taskSequence_m; + typedef std::list < CSequence * > sequence_l; + typedef std::map < CTaskGroup *, CSequence * > taskSequence_m; public: @@ -184,5 +192,5 @@ class CSequencer int m_elseValid; CBlock *m_elseOwner; - vector m_streamsCreated; + std::vector m_streamsCreated; }; diff --git a/codemp/icarus/taskmanager.h b/codemp/icarus/taskmanager.h index a329712231..ebe8a5a8be 100644 --- a/codemp/icarus/taskmanager.h +++ b/codemp/icarus/taskmanager.h @@ -1,11 +1,31 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // Task Manager header file #include -#ifndef _WIN32 #include -#endif #include "sequencer.h" class CSequencer; @@ -65,7 +85,7 @@ class CTaskGroup { public: - typedef map < int, bool > taskCallback_m; + typedef std::map < int, bool > taskCallback_m; CTaskGroup( void ); ~CTaskGroup( void ); @@ -99,11 +119,11 @@ class CTaskGroup class CTaskManager { - typedef map < int, CTask * > taskID_m; - typedef map < string, CTaskGroup * > taskGroupName_m; - typedef map < int, CTaskGroup * > taskGroupID_m; - typedef vector < CTaskGroup * > taskGroup_v; - typedef list < CTask *> tasks_l; + typedef std::map < int, CTask * > taskID_m; + typedef std::map < std::string, CTaskGroup * > taskGroupName_m; + typedef std::map < int, CTaskGroup * > taskGroupID_m; + typedef std::vector < CTaskGroup * > taskGroup_v; + typedef std::list < CTask *> tasks_l; public: diff --git a/codemp/icarus/tokenizer.h b/codemp/icarus/tokenizer.h index bae3cb4ae0..7a71accbad 100644 --- a/codemp/icarus/tokenizer.h +++ b/codemp/icarus/tokenizer.h @@ -1,27 +1,33 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // Tokenizer.h // -#ifdef _MSC_VER -#pragma warning( disable : 4786 ) // identifier was truncated - -#pragma warning (push, 3) // go back down to 3 for the stl include -#pragma warning (disable:4503) // decorated name length xceeded, name was truncated -#endif #include #include #include -#ifdef _MSC_VER -#pragma warning (pop) -#pragma warning (disable:4503) // decorated name length xceeded, name was truncated -#endif - -using namespace std; - -#ifndef _WIN32 -#include -#endif #include "qcommon/q_shared.h" @@ -272,7 +278,7 @@ class CSymbol char* m_symbolName; }; -typedef map symbolmap_t; +typedef std::map symbolmap_t; class CDirectiveSymbol : public CSymbol { diff --git a/codemp/macosx/macosx_qgl.h b/codemp/macosx/macosx_qgl.h deleted file mode 100755 index 9378e533ec..0000000000 --- a/codemp/macosx/macosx_qgl.h +++ /dev/null @@ -1,5097 +0,0 @@ -#pragma once - -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code is free software; you can redistribute it -and/or modify it under the terms of the GNU General Public License as -published by the Free Software Foundation; either version 2 of the License, -or (at your option) any later version. - -Quake III Arena source code is distributed in the hope that it will be -useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Foobar; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ -/**** This file is autogenerated. Run GenerateQGL.pl to update it ****/ - -#ifdef QGL_LOG_GL_CALLS -extern unsigned int QGLLogGLCalls; -extern FILE *QGLDebugFile(void); -#endif - -extern void QGLCheckError(const char *message); -extern unsigned int QGLBeginStarted; - -// This has to be done to avoid infinite recursion between our glGetError wrapper and QGLCheckError() -static inline GLenum _glGetError(void) { - return glGetError(); -} - -// void glAccum (GLenum op, GLfloat value); -static inline void qglAccum(GLenum op, GLfloat value) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glAccum(op=%lu, value=%f)\n", op, value); -#endif - glAccum(op, value); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glAccum"); -#endif -} - -// void glAlphaFunc (GLenum func, GLclampf ref); -static inline void qglAlphaFunc(GLenum func, GLclampf ref) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glAlphaFunc(func=%lu, ref=%f)\n", func, ref); -#endif - glAlphaFunc(func, ref); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glAlphaFunc"); -#endif -} - -// GLboolean glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); -static inline GLboolean qglAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences) -{ - GLboolean returnValue; -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glAreTexturesResident(n=%ld, textures=%p, residences=%p)\n", n, textures, residences); -#endif - returnValue = glAreTexturesResident(n, textures, residences); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glAreTexturesResident"); -#endif - return returnValue; -} - -// void glArrayElement (GLint i); -static inline void qglArrayElement(GLint i) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glArrayElement(i=%ld)\n", i); -#endif - glArrayElement(i); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glArrayElement"); -#endif -} - -// void glBegin (GLenum mode); -static inline void qglBegin(GLenum mode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glBegin(mode=%lu)\n", mode); -#endif - glBegin(mode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - QGLBeginStarted++; - if (!QGLBeginStarted) - QGLCheckError("glBegin"); -#endif -} - -// void glBindTexture (GLenum target, GLuint texture); -static inline void qglBindTexture(GLenum target, GLuint texture) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glBindTexture(target=%lu, texture=%lu)\n", target, texture); -#endif - glBindTexture(target, texture); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glBindTexture"); -#endif -} - -// void glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); -static inline void qglBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glBitmap(width=%ld, height=%ld, xorig=%f, yorig=%f, xmove=%f, ymove=%f, bitmap=%p)\n", width, height, xorig, yorig, xmove, ymove, bitmap); -#endif - glBitmap(width, height, xorig, yorig, xmove, ymove, bitmap); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glBitmap"); -#endif -} - -// void glBlendFunc (GLenum sfactor, GLenum dfactor); -static inline void qglBlendFunc(GLenum sfactor, GLenum dfactor) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glBlendFunc(sfactor=%lu, dfactor=%lu)\n", sfactor, dfactor); -#endif - glBlendFunc(sfactor, dfactor); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glBlendFunc"); -#endif -} - -// void glCallList (GLuint list); -static inline void qglCallList(GLuint list) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glCallList(list=%lu)\n", list); -#endif - glCallList(list); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glCallList"); -#endif -} - -// void glCallLists (GLsizei n, GLenum type, const GLvoid *lists); -static inline void qglCallLists(GLsizei n, GLenum type, const GLvoid *lists) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glCallLists(n=%ld, type=%lu, lists=%p)\n", n, type, lists); -#endif - glCallLists(n, type, lists); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glCallLists"); -#endif -} - -// void glClear (GLbitfield mask); -static inline void qglClear(GLbitfield mask) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glClear(mask=%lu)\n", mask); -#endif - glClear(mask); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glClear"); -#endif -} - -// void glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -static inline void qglClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glClearAccum(red=%f, green=%f, blue=%f, alpha=%f)\n", red, green, blue, alpha); -#endif - glClearAccum(red, green, blue, alpha); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glClearAccum"); -#endif -} - -// void glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -static inline void qglClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glClearColor(red=%f, green=%f, blue=%f, alpha=%f)\n", red, green, blue, alpha); -#endif - glClearColor(red, green, blue, alpha); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glClearColor"); -#endif -} - -// void glClearDepth (GLclampd depth); -static inline void qglClearDepth(GLclampd depth) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glClearDepth(depth=%f)\n", depth); -#endif - glClearDepth(depth); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glClearDepth"); -#endif -} - -// void glClearIndex (GLfloat c); -static inline void qglClearIndex(GLfloat c) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glClearIndex(c=%f)\n", c); -#endif - glClearIndex(c); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glClearIndex"); -#endif -} - -// void glClearStencil (GLint s); -static inline void qglClearStencil(GLint s) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glClearStencil(s=%ld)\n", s); -#endif - glClearStencil(s); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glClearStencil"); -#endif -} - -// void glClipPlane (GLenum plane, const GLdouble *equation); -static inline void qglClipPlane(GLenum plane, const GLdouble *equation) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glClipPlane(plane=%lu, equation=%p)\n", plane, equation); -#endif - glClipPlane(plane, equation); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glClipPlane"); -#endif -} - -// void glColor3b (GLbyte red, GLbyte green, GLbyte blue); -static inline void qglColor3b(GLbyte red, GLbyte green, GLbyte blue) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor3b(red=%d, green=%d, blue=%d)\n", red, green, blue); -#endif - glColor3b(red, green, blue); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor3b"); -#endif -} - -// void glColor3bv (const GLbyte *v); -static inline void qglColor3bv(const GLbyte *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor3bv(v=%p)\n", v); -#endif - glColor3bv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor3bv"); -#endif -} - -// void glColor3d (GLdouble red, GLdouble green, GLdouble blue); -static inline void qglColor3d(GLdouble red, GLdouble green, GLdouble blue) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor3d(red=%f, green=%f, blue=%f)\n", red, green, blue); -#endif - glColor3d(red, green, blue); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor3d"); -#endif -} - -// void glColor3dv (const GLdouble *v); -static inline void qglColor3dv(const GLdouble *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor3dv(v=%p)\n", v); -#endif - glColor3dv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor3dv"); -#endif -} - -// void glColor3f (GLfloat red, GLfloat green, GLfloat blue); -static inline void qglColor3f(GLfloat red, GLfloat green, GLfloat blue) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor3f(red=%f, green=%f, blue=%f)\n", red, green, blue); -#endif - glColor3f(red, green, blue); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor3f"); -#endif -} - -// void glColor3fv (const GLfloat *v); -static inline void qglColor3fv(const GLfloat *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor3fv(v=%p)\n", v); -#endif - glColor3fv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor3fv"); -#endif -} - -// void glColor3i (GLint red, GLint green, GLint blue); -static inline void qglColor3i(GLint red, GLint green, GLint blue) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor3i(red=%ld, green=%ld, blue=%ld)\n", red, green, blue); -#endif - glColor3i(red, green, blue); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor3i"); -#endif -} - -// void glColor3iv (const GLint *v); -static inline void qglColor3iv(const GLint *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor3iv(v=%p)\n", v); -#endif - glColor3iv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor3iv"); -#endif -} - -// void glColor3s (GLshort red, GLshort green, GLshort blue); -static inline void qglColor3s(GLshort red, GLshort green, GLshort blue) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor3s(red=%d, green=%d, blue=%d)\n", red, green, blue); -#endif - glColor3s(red, green, blue); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor3s"); -#endif -} - -// void glColor3sv (const GLshort *v); -static inline void qglColor3sv(const GLshort *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor3sv(v=%p)\n", v); -#endif - glColor3sv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor3sv"); -#endif -} - -// void glColor3ub (GLubyte red, GLubyte green, GLubyte blue); -static inline void qglColor3ub(GLubyte red, GLubyte green, GLubyte blue) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor3ub(red=%u, green=%u, blue=%u)\n", red, green, blue); -#endif - glColor3ub(red, green, blue); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor3ub"); -#endif -} - -// void glColor3ubv (const GLubyte *v); -static inline void qglColor3ubv(const GLubyte *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor3ubv(v=%p)\n", v); -#endif - glColor3ubv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor3ubv"); -#endif -} - -// void glColor3ui (GLuint red, GLuint green, GLuint blue); -static inline void qglColor3ui(GLuint red, GLuint green, GLuint blue) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor3ui(red=%lu, green=%lu, blue=%lu)\n", red, green, blue); -#endif - glColor3ui(red, green, blue); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor3ui"); -#endif -} - -// void glColor3uiv (const GLuint *v); -static inline void qglColor3uiv(const GLuint *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor3uiv(v=%p)\n", v); -#endif - glColor3uiv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor3uiv"); -#endif -} - -// void glColor3us (GLushort red, GLushort green, GLushort blue); -static inline void qglColor3us(GLushort red, GLushort green, GLushort blue) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor3us(red=%u, green=%u, blue=%u)\n", red, green, blue); -#endif - glColor3us(red, green, blue); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor3us"); -#endif -} - -// void glColor3usv (const GLushort *v); -static inline void qglColor3usv(const GLushort *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor3usv(v=%p)\n", v); -#endif - glColor3usv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor3usv"); -#endif -} - -// void glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -static inline void qglColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4b(red=%d, green=%d, blue=%d, alpha=%d)\n", red, green, blue, alpha); -#endif - glColor4b(red, green, blue, alpha); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4b"); -#endif -} - -// void glColor4bv (const GLbyte *v); -static inline void qglColor4bv(const GLbyte *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4bv(v=%p)\n", v); -#endif - glColor4bv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4bv"); -#endif -} - -// void glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -static inline void qglColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4d(red=%f, green=%f, blue=%f, alpha=%f)\n", red, green, blue, alpha); -#endif - glColor4d(red, green, blue, alpha); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4d"); -#endif -} - -// void glColor4dv (const GLdouble *v); -static inline void qglColor4dv(const GLdouble *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4dv(v=%p)\n", v); -#endif - glColor4dv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4dv"); -#endif -} - -// void glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -static inline void qglColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4f(red=%f, green=%f, blue=%f, alpha=%f)\n", red, green, blue, alpha); -#endif - glColor4f(red, green, blue, alpha); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4f"); -#endif -} - -// void glColor4fv (const GLfloat *v); -static inline void qglColor4fv(const GLfloat *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4fv(v=%p)\n", v); -#endif - glColor4fv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4fv"); -#endif -} - -// void glColor4i (GLint red, GLint green, GLint blue, GLint alpha); -static inline void qglColor4i(GLint red, GLint green, GLint blue, GLint alpha) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4i(red=%ld, green=%ld, blue=%ld, alpha=%ld)\n", red, green, blue, alpha); -#endif - glColor4i(red, green, blue, alpha); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4i"); -#endif -} - -// void glColor4iv (const GLint *v); -static inline void qglColor4iv(const GLint *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4iv(v=%p)\n", v); -#endif - glColor4iv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4iv"); -#endif -} - -// void glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); -static inline void qglColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4s(red=%d, green=%d, blue=%d, alpha=%d)\n", red, green, blue, alpha); -#endif - glColor4s(red, green, blue, alpha); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4s"); -#endif -} - -// void glColor4sv (const GLshort *v); -static inline void qglColor4sv(const GLshort *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4sv(v=%p)\n", v); -#endif - glColor4sv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4sv"); -#endif -} - -// void glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -static inline void qglColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4ub(red=%u, green=%u, blue=%u, alpha=%u)\n", red, green, blue, alpha); -#endif - glColor4ub(red, green, blue, alpha); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4ub"); -#endif -} - -// void glColor4ubv (const GLubyte *v); -static inline void qglColor4ubv(const GLubyte *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4ubv(v=%p)\n", v); -#endif - glColor4ubv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4ubv"); -#endif -} - -// void glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); -static inline void qglColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4ui(red=%lu, green=%lu, blue=%lu, alpha=%lu)\n", red, green, blue, alpha); -#endif - glColor4ui(red, green, blue, alpha); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4ui"); -#endif -} - -// void glColor4uiv (const GLuint *v); -static inline void qglColor4uiv(const GLuint *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4uiv(v=%p)\n", v); -#endif - glColor4uiv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4uiv"); -#endif -} - -// void glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); -static inline void qglColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4us(red=%u, green=%u, blue=%u, alpha=%u)\n", red, green, blue, alpha); -#endif - glColor4us(red, green, blue, alpha); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4us"); -#endif -} - -// void glColor4usv (const GLushort *v); -static inline void qglColor4usv(const GLushort *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4usv(v=%p)\n", v); -#endif - glColor4usv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4usv"); -#endif -} - -// void glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -static inline void qglColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColorMask(red=%u, green=%u, blue=%u, alpha=%u)\n", red, green, blue, alpha); -#endif - glColorMask(red, green, blue, alpha); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColorMask"); -#endif -} - -// void glColorMaterial (GLenum face, GLenum mode); -static inline void qglColorMaterial(GLenum face, GLenum mode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColorMaterial(face=%lu, mode=%lu)\n", face, mode); -#endif - glColorMaterial(face, mode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColorMaterial"); -#endif -} - -// void glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static inline void qglColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColorPointer(size=%ld, type=%lu, stride=%ld, pointer=%p)\n", size, type, stride, pointer); -#endif - glColorPointer(size, type, stride, pointer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColorPointer"); -#endif -} - -// void glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -static inline void qglCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glCopyPixels(x=%ld, y=%ld, width=%ld, height=%ld, type=%lu)\n", x, y, width, height, type); -#endif - glCopyPixels(x, y, width, height, type); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glCopyPixels"); -#endif -} - -// void glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -static inline void qglCopyTexImage1D(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glCopyTexImage1D(target=%lu, level=%ld, internalFormat=%lu, x=%ld, y=%ld, width=%ld, border=%ld)\n", target, level, internalFormat, x, y, width, border); -#endif - glCopyTexImage1D(target, level, internalFormat, x, y, width, border); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glCopyTexImage1D"); -#endif -} - -// void glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -static inline void qglCopyTexImage2D(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glCopyTexImage2D(target=%lu, level=%ld, internalFormat=%lu, x=%ld, y=%ld, width=%ld, height=%ld, border=%ld)\n", target, level, internalFormat, x, y, width, height, border); -#endif - glCopyTexImage2D(target, level, internalFormat, x, y, width, height, border); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glCopyTexImage2D"); -#endif -} - -// void glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -static inline void qglCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glCopyTexSubImage1D(target=%lu, level=%ld, xoffset=%ld, x=%ld, y=%ld, width=%ld)\n", target, level, xoffset, x, y, width); -#endif - glCopyTexSubImage1D(target, level, xoffset, x, y, width); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glCopyTexSubImage1D"); -#endif -} - -// void glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -static inline void qglCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glCopyTexSubImage2D(target=%lu, level=%ld, xoffset=%ld, yoffset=%ld, x=%ld, y=%ld, width=%ld, height=%ld)\n", target, level, xoffset, yoffset, x, y, width, height); -#endif - glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glCopyTexSubImage2D"); -#endif -} - -// void glCullFace (GLenum mode); -static inline void qglCullFace(GLenum mode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glCullFace(mode=%lu)\n", mode); -#endif - glCullFace(mode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glCullFace"); -#endif -} - -// void glDeleteLists (GLuint list, GLsizei range); -static inline void qglDeleteLists(GLuint list, GLsizei range) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDeleteLists(list=%lu, range=%ld)\n", list, range); -#endif - glDeleteLists(list, range); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDeleteLists"); -#endif -} - -// void glDeleteTextures (GLsizei n, const GLuint *textures); -static inline void qglDeleteTextures(GLsizei n, const GLuint *textures) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDeleteTextures(n=%ld, textures=%p)\n", n, textures); -#endif - glDeleteTextures(n, textures); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDeleteTextures"); -#endif -} - -// void glDepthFunc (GLenum func); -static inline void qglDepthFunc(GLenum func) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDepthFunc(func=%lu)\n", func); -#endif - glDepthFunc(func); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDepthFunc"); -#endif -} - -// void glDepthMask (GLboolean flag); -static inline void qglDepthMask(GLboolean flag) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDepthMask(flag=%u)\n", flag); -#endif - glDepthMask(flag); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDepthMask"); -#endif -} - -// void glDepthRange (GLclampd zNear, GLclampd zFar); -static inline void qglDepthRange(GLclampd zNear, GLclampd zFar) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDepthRange(zNear=%f, zFar=%f)\n", zNear, zFar); -#endif - glDepthRange(zNear, zFar); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDepthRange"); -#endif -} - -// void glDisable (GLenum cap); -static inline void qglDisable(GLenum cap) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDisable(cap=%lu)\n", cap); -#endif - glDisable(cap); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDisable"); -#endif -} - -// void glDisableClientState (GLenum array); -static inline void qglDisableClientState(GLenum array) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDisableClientState(array=%lu)\n", array); -#endif - glDisableClientState(array); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDisableClientState"); -#endif -} - -// void glDrawArrays (GLenum mode, GLint first, GLsizei count); -static inline void qglDrawArrays(GLenum mode, GLint first, GLsizei count) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDrawArrays(mode=%lu, first=%ld, count=%ld)\n", mode, first, count); -#endif - glDrawArrays(mode, first, count); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDrawArrays"); -#endif -} - -// void glDrawBuffer (GLenum mode); -static inline void qglDrawBuffer(GLenum mode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDrawBuffer(mode=%lu)\n", mode); -#endif - glDrawBuffer(mode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDrawBuffer"); -#endif -} - -// void glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -static inline void qglDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDrawElements(mode=%lu, count=%ld, type=%lu, indices=%p)\n", mode, count, type, indices); -#endif - glDrawElements(mode, count, type, indices); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDrawElements"); -#endif -} - -// void glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -static inline void qglDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDrawPixels(width=%ld, height=%ld, format=%lu, type=%lu, pixels=%p)\n", width, height, format, type, pixels); -#endif - glDrawPixels(width, height, format, type, pixels); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDrawPixels"); -#endif -} - -// void glEdgeFlag (GLboolean flag); -static inline void qglEdgeFlag(GLboolean flag) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEdgeFlag(flag=%u)\n", flag); -#endif - glEdgeFlag(flag); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEdgeFlag"); -#endif -} - -// void glEdgeFlagPointer (GLsizei stride, const GLvoid *pointer); -static inline void qglEdgeFlagPointer(GLsizei stride, const GLvoid *pointer) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEdgeFlagPointer(stride=%ld, pointer=%p)\n", stride, pointer); -#endif - glEdgeFlagPointer(stride, pointer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEdgeFlagPointer"); -#endif -} - -// void glEdgeFlagv (const GLboolean *flag); -static inline void qglEdgeFlagv(const GLboolean *flag) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEdgeFlagv(flag=%p)\n", flag); -#endif - glEdgeFlagv(flag); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEdgeFlagv"); -#endif -} - -// void glEnable (GLenum cap); -static inline void qglEnable(GLenum cap) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEnable(cap=%lu)\n", cap); -#endif - glEnable(cap); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEnable"); -#endif -} - -// void glEnableClientState (GLenum array); -static inline void qglEnableClientState(GLenum array) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEnableClientState(array=%lu)\n", array); -#endif - glEnableClientState(array); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEnableClientState"); -#endif -} - -// void glEnd (void); -static inline void qglEnd(void) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEnd(void)\n"); -#endif - glEnd(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - QGLBeginStarted--; - if (!QGLBeginStarted) - QGLCheckError("glEnd"); -#endif -} - -// void glEndList (void); -static inline void qglEndList(void) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEndList(void)\n"); -#endif - glEndList(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEndList"); -#endif -} - -// void glEvalCoord1d (GLdouble u); -static inline void qglEvalCoord1d(GLdouble u) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEvalCoord1d(u=%f)\n", u); -#endif - glEvalCoord1d(u); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEvalCoord1d"); -#endif -} - -// void glEvalCoord1dv (const GLdouble *u); -static inline void qglEvalCoord1dv(const GLdouble *u) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEvalCoord1dv(u=%p)\n", u); -#endif - glEvalCoord1dv(u); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEvalCoord1dv"); -#endif -} - -// void glEvalCoord1f (GLfloat u); -static inline void qglEvalCoord1f(GLfloat u) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEvalCoord1f(u=%f)\n", u); -#endif - glEvalCoord1f(u); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEvalCoord1f"); -#endif -} - -// void glEvalCoord1fv (const GLfloat *u); -static inline void qglEvalCoord1fv(const GLfloat *u) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEvalCoord1fv(u=%p)\n", u); -#endif - glEvalCoord1fv(u); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEvalCoord1fv"); -#endif -} - -// void glEvalCoord2d (GLdouble u, GLdouble v); -static inline void qglEvalCoord2d(GLdouble u, GLdouble v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEvalCoord2d(u=%f, v=%f)\n", u, v); -#endif - glEvalCoord2d(u, v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEvalCoord2d"); -#endif -} - -// void glEvalCoord2dv (const GLdouble *u); -static inline void qglEvalCoord2dv(const GLdouble *u) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEvalCoord2dv(u=%p)\n", u); -#endif - glEvalCoord2dv(u); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEvalCoord2dv"); -#endif -} - -// void glEvalCoord2f (GLfloat u, GLfloat v); -static inline void qglEvalCoord2f(GLfloat u, GLfloat v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEvalCoord2f(u=%f, v=%f)\n", u, v); -#endif - glEvalCoord2f(u, v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEvalCoord2f"); -#endif -} - -// void glEvalCoord2fv (const GLfloat *u); -static inline void qglEvalCoord2fv(const GLfloat *u) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEvalCoord2fv(u=%p)\n", u); -#endif - glEvalCoord2fv(u); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEvalCoord2fv"); -#endif -} - -// void glEvalMesh1 (GLenum mode, GLint i1, GLint i2); -static inline void qglEvalMesh1(GLenum mode, GLint i1, GLint i2) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEvalMesh1(mode=%lu, i1=%ld, i2=%ld)\n", mode, i1, i2); -#endif - glEvalMesh1(mode, i1, i2); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEvalMesh1"); -#endif -} - -// void glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -static inline void qglEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEvalMesh2(mode=%lu, i1=%ld, i2=%ld, j1=%ld, j2=%ld)\n", mode, i1, i2, j1, j2); -#endif - glEvalMesh2(mode, i1, i2, j1, j2); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEvalMesh2"); -#endif -} - -// void glEvalPoint1 (GLint i); -static inline void qglEvalPoint1(GLint i) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEvalPoint1(i=%ld)\n", i); -#endif - glEvalPoint1(i); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEvalPoint1"); -#endif -} - -// void glEvalPoint2 (GLint i, GLint j); -static inline void qglEvalPoint2(GLint i, GLint j) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEvalPoint2(i=%ld, j=%ld)\n", i, j); -#endif - glEvalPoint2(i, j); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEvalPoint2"); -#endif -} - -// void glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); -static inline void qglFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFeedbackBuffer(size=%ld, type=%lu, buffer=%p)\n", size, type, buffer); -#endif - glFeedbackBuffer(size, type, buffer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFeedbackBuffer"); -#endif -} - -// void glFinish (void); -static inline void qglFinish(void) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFinish(void)\n"); -#endif - glFinish(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFinish"); -#endif -} - -// void glFlush (void); -static inline void qglFlush(void) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFlush(void)\n"); -#endif - glFlush(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFlush"); -#endif -} - -// void glFogf (GLenum pname, GLfloat param); -static inline void qglFogf(GLenum pname, GLfloat param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFogf(pname=%lu, param=%f)\n", pname, param); -#endif - glFogf(pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFogf"); -#endif -} - -// void glFogfv (GLenum pname, const GLfloat *params); -static inline void qglFogfv(GLenum pname, const GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFogfv(pname=%lu, params=%p)\n", pname, params); -#endif - glFogfv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFogfv"); -#endif -} - -// void glFogi (GLenum pname, GLint param); -static inline void qglFogi(GLenum pname, GLint param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFogi(pname=%lu, param=%ld)\n", pname, param); -#endif - glFogi(pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFogi"); -#endif -} - -// void glFogiv (GLenum pname, const GLint *params); -static inline void qglFogiv(GLenum pname, const GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFogiv(pname=%lu, params=%p)\n", pname, params); -#endif - glFogiv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFogiv"); -#endif -} - -// void glFrontFace (GLenum mode); -static inline void qglFrontFace(GLenum mode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFrontFace(mode=%lu)\n", mode); -#endif - glFrontFace(mode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFrontFace"); -#endif -} - -// void glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -static inline void qglFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFrustum(left=%f, right=%f, bottom=%f, top=%f, zNear=%f, zFar=%f)\n", left, right, bottom, top, zNear, zFar); -#endif - glFrustum(left, right, bottom, top, zNear, zFar); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFrustum"); -#endif -} - -// GLuint glGenLists (GLsizei range); -static inline GLuint qglGenLists(GLsizei range) -{ - GLuint returnValue; -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGenLists(range=%ld)\n", range); -#endif - returnValue = glGenLists(range); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGenLists"); -#endif - return returnValue; -} - -// void glGenTextures (GLsizei n, GLuint *textures); -static inline void qglGenTextures(GLsizei n, GLuint *textures) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGenTextures(n=%ld, textures=%p)\n", n, textures); -#endif - glGenTextures(n, textures); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGenTextures"); -#endif -} - -// void glGetBooleanv (GLenum pname, GLboolean *params); -static inline void qglGetBooleanv(GLenum pname, GLboolean *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetBooleanv(pname=%lu, params=%p)\n", pname, params); -#endif - glGetBooleanv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetBooleanv"); -#endif -} - -// void glGetClipPlane (GLenum plane, GLdouble *equation); -static inline void qglGetClipPlane(GLenum plane, GLdouble *equation) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetClipPlane(plane=%lu, equation=%p)\n", plane, equation); -#endif - glGetClipPlane(plane, equation); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetClipPlane"); -#endif -} - -// void glGetDoublev (GLenum pname, GLdouble *params); -static inline void qglGetDoublev(GLenum pname, GLdouble *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetDoublev(pname=%lu, params=%p)\n", pname, params); -#endif - glGetDoublev(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetDoublev"); -#endif -} - -// GLenum glGetError (void); -static inline GLenum qglGetError(void) -{ - GLenum returnValue; -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetError(void)\n"); -#endif - returnValue = glGetError(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetError"); -#endif - return returnValue; -} - -// void glGetFloatv (GLenum pname, GLfloat *params); -static inline void qglGetFloatv(GLenum pname, GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetFloatv(pname=%lu, params=%p)\n", pname, params); -#endif - glGetFloatv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetFloatv"); -#endif -} - -// void glGetIntegerv (GLenum pname, GLint *params); -static inline void qglGetIntegerv(GLenum pname, GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetIntegerv(pname=%lu, params=%p)\n", pname, params); -#endif - glGetIntegerv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetIntegerv"); -#endif -} - -// void glGetLightfv (GLenum light, GLenum pname, GLfloat *params); -static inline void qglGetLightfv(GLenum light, GLenum pname, GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetLightfv(light=%lu, pname=%lu, params=%p)\n", light, pname, params); -#endif - glGetLightfv(light, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetLightfv"); -#endif -} - -// void glGetLightiv (GLenum light, GLenum pname, GLint *params); -static inline void qglGetLightiv(GLenum light, GLenum pname, GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetLightiv(light=%lu, pname=%lu, params=%p)\n", light, pname, params); -#endif - glGetLightiv(light, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetLightiv"); -#endif -} - -// void glGetMapdv (GLenum target, GLenum query, GLdouble *v); -static inline void qglGetMapdv(GLenum target, GLenum query, GLdouble *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetMapdv(target=%lu, query=%lu, v=%p)\n", target, query, v); -#endif - glGetMapdv(target, query, v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetMapdv"); -#endif -} - -// void glGetMapfv (GLenum target, GLenum query, GLfloat *v); -static inline void qglGetMapfv(GLenum target, GLenum query, GLfloat *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetMapfv(target=%lu, query=%lu, v=%p)\n", target, query, v); -#endif - glGetMapfv(target, query, v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetMapfv"); -#endif -} - -// void glGetMapiv (GLenum target, GLenum query, GLint *v); -static inline void qglGetMapiv(GLenum target, GLenum query, GLint *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetMapiv(target=%lu, query=%lu, v=%p)\n", target, query, v); -#endif - glGetMapiv(target, query, v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetMapiv"); -#endif -} - -// void glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); -static inline void qglGetMaterialfv(GLenum face, GLenum pname, GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetMaterialfv(face=%lu, pname=%lu, params=%p)\n", face, pname, params); -#endif - glGetMaterialfv(face, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetMaterialfv"); -#endif -} - -// void glGetMaterialiv (GLenum face, GLenum pname, GLint *params); -static inline void qglGetMaterialiv(GLenum face, GLenum pname, GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetMaterialiv(face=%lu, pname=%lu, params=%p)\n", face, pname, params); -#endif - glGetMaterialiv(face, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetMaterialiv"); -#endif -} - -// void glGetPixelMapfv (GLenum map, GLfloat *values); -static inline void qglGetPixelMapfv(GLenum map, GLfloat *values) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetPixelMapfv(map=%lu, values=%p)\n", map, values); -#endif - glGetPixelMapfv(map, values); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetPixelMapfv"); -#endif -} - -// void glGetPixelMapuiv (GLenum map, GLuint *values); -static inline void qglGetPixelMapuiv(GLenum map, GLuint *values) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetPixelMapuiv(map=%lu, values=%p)\n", map, values); -#endif - glGetPixelMapuiv(map, values); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetPixelMapuiv"); -#endif -} - -// void glGetPixelMapusv (GLenum map, GLushort *values); -static inline void qglGetPixelMapusv(GLenum map, GLushort *values) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetPixelMapusv(map=%lu, values=%p)\n", map, values); -#endif - glGetPixelMapusv(map, values); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetPixelMapusv"); -#endif -} - -// void glGetPointerv (GLenum pname, GLvoid* *params); -static inline void qglGetPointerv(GLenum pname, GLvoid* *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetPointerv(pname=%lu, params=%p)\n", pname, params); -#endif - glGetPointerv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetPointerv"); -#endif -} - -// void glGetPolygonStipple (GLubyte *mask); -static inline void qglGetPolygonStipple(GLubyte *mask) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetPolygonStipple(mask=%p)\n", mask); -#endif - glGetPolygonStipple(mask); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetPolygonStipple"); -#endif -} - -// const GLubyte * glGetString (GLenum name); -static inline const GLubyte * qglGetString(GLenum name) -{ - const GLubyte * returnValue; -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetString(name=%lu)\n", name); -#endif - returnValue = glGetString(name); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetString"); -#endif - return returnValue; -} - -// void glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); -static inline void qglGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetTexEnvfv(target=%lu, pname=%lu, params=%p)\n", target, pname, params); -#endif - glGetTexEnvfv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetTexEnvfv"); -#endif -} - -// void glGetTexEnviv (GLenum target, GLenum pname, GLint *params); -static inline void qglGetTexEnviv(GLenum target, GLenum pname, GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetTexEnviv(target=%lu, pname=%lu, params=%p)\n", target, pname, params); -#endif - glGetTexEnviv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetTexEnviv"); -#endif -} - -// void glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); -static inline void qglGetTexGendv(GLenum coord, GLenum pname, GLdouble *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetTexGendv(coord=%lu, pname=%lu, params=%p)\n", coord, pname, params); -#endif - glGetTexGendv(coord, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetTexGendv"); -#endif -} - -// void glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); -static inline void qglGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetTexGenfv(coord=%lu, pname=%lu, params=%p)\n", coord, pname, params); -#endif - glGetTexGenfv(coord, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetTexGenfv"); -#endif -} - -// void glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); -static inline void qglGetTexGeniv(GLenum coord, GLenum pname, GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetTexGeniv(coord=%lu, pname=%lu, params=%p)\n", coord, pname, params); -#endif - glGetTexGeniv(coord, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetTexGeniv"); -#endif -} - -// void glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -static inline void qglGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetTexImage(target=%lu, level=%ld, format=%lu, type=%lu, pixels=%p)\n", target, level, format, type, pixels); -#endif - glGetTexImage(target, level, format, type, pixels); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetTexImage"); -#endif -} - -// void glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); -static inline void qglGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetTexLevelParameterfv(target=%lu, level=%ld, pname=%lu, params=%p)\n", target, level, pname, params); -#endif - glGetTexLevelParameterfv(target, level, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetTexLevelParameterfv"); -#endif -} - -// void glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); -static inline void qglGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetTexLevelParameteriv(target=%lu, level=%ld, pname=%lu, params=%p)\n", target, level, pname, params); -#endif - glGetTexLevelParameteriv(target, level, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetTexLevelParameteriv"); -#endif -} - -// void glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); -static inline void qglGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetTexParameterfv(target=%lu, pname=%lu, params=%p)\n", target, pname, params); -#endif - glGetTexParameterfv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetTexParameterfv"); -#endif -} - -// void glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); -static inline void qglGetTexParameteriv(GLenum target, GLenum pname, GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetTexParameteriv(target=%lu, pname=%lu, params=%p)\n", target, pname, params); -#endif - glGetTexParameteriv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetTexParameteriv"); -#endif -} - -// void glHint (GLenum target, GLenum mode); -static inline void qglHint(GLenum target, GLenum mode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glHint(target=%lu, mode=%lu)\n", target, mode); -#endif - glHint(target, mode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glHint"); -#endif -} - -// void glIndexMask (GLuint mask); -static inline void qglIndexMask(GLuint mask) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIndexMask(mask=%lu)\n", mask); -#endif - glIndexMask(mask); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIndexMask"); -#endif -} - -// void glIndexPointer (GLenum type, GLsizei stride, const GLvoid *pointer); -static inline void qglIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIndexPointer(type=%lu, stride=%ld, pointer=%p)\n", type, stride, pointer); -#endif - glIndexPointer(type, stride, pointer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIndexPointer"); -#endif -} - -// void glIndexd (GLdouble c); -static inline void qglIndexd(GLdouble c) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIndexd(c=%f)\n", c); -#endif - glIndexd(c); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIndexd"); -#endif -} - -// void glIndexdv (const GLdouble *c); -static inline void qglIndexdv(const GLdouble *c) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIndexdv(c=%p)\n", c); -#endif - glIndexdv(c); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIndexdv"); -#endif -} - -// void glIndexf (GLfloat c); -static inline void qglIndexf(GLfloat c) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIndexf(c=%f)\n", c); -#endif - glIndexf(c); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIndexf"); -#endif -} - -// void glIndexfv (const GLfloat *c); -static inline void qglIndexfv(const GLfloat *c) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIndexfv(c=%p)\n", c); -#endif - glIndexfv(c); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIndexfv"); -#endif -} - -// void glIndexi (GLint c); -static inline void qglIndexi(GLint c) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIndexi(c=%ld)\n", c); -#endif - glIndexi(c); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIndexi"); -#endif -} - -// void glIndexiv (const GLint *c); -static inline void qglIndexiv(const GLint *c) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIndexiv(c=%p)\n", c); -#endif - glIndexiv(c); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIndexiv"); -#endif -} - -// void glIndexs (GLshort c); -static inline void qglIndexs(GLshort c) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIndexs(c=%d)\n", c); -#endif - glIndexs(c); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIndexs"); -#endif -} - -// void glIndexsv (const GLshort *c); -static inline void qglIndexsv(const GLshort *c) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIndexsv(c=%p)\n", c); -#endif - glIndexsv(c); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIndexsv"); -#endif -} - -// void glIndexub (GLubyte c); -static inline void qglIndexub(GLubyte c) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIndexub(c=%u)\n", c); -#endif - glIndexub(c); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIndexub"); -#endif -} - -// void glIndexubv (const GLubyte *c); -static inline void qglIndexubv(const GLubyte *c) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIndexubv(c=%p)\n", c); -#endif - glIndexubv(c); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIndexubv"); -#endif -} - -// void glInitNames (void); -static inline void qglInitNames(void) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glInitNames(void)\n"); -#endif - glInitNames(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glInitNames"); -#endif -} - -// void glInterleavedArrays (GLenum format, GLsizei stride, const GLvoid *pointer); -static inline void qglInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glInterleavedArrays(format=%lu, stride=%ld, pointer=%p)\n", format, stride, pointer); -#endif - glInterleavedArrays(format, stride, pointer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glInterleavedArrays"); -#endif -} - -// GLboolean glIsEnabled (GLenum cap); -static inline GLboolean qglIsEnabled(GLenum cap) -{ - GLboolean returnValue; -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIsEnabled(cap=%lu)\n", cap); -#endif - returnValue = glIsEnabled(cap); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIsEnabled"); -#endif - return returnValue; -} - -// GLboolean glIsList (GLuint list); -static inline GLboolean qglIsList(GLuint list) -{ - GLboolean returnValue; -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIsList(list=%lu)\n", list); -#endif - returnValue = glIsList(list); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIsList"); -#endif - return returnValue; -} - -// GLboolean glIsTexture (GLuint texture); -static inline GLboolean qglIsTexture(GLuint texture) -{ - GLboolean returnValue; -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIsTexture(texture=%lu)\n", texture); -#endif - returnValue = glIsTexture(texture); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIsTexture"); -#endif - return returnValue; -} - -// void glLightModelf (GLenum pname, GLfloat param); -static inline void qglLightModelf(GLenum pname, GLfloat param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLightModelf(pname=%lu, param=%f)\n", pname, param); -#endif - glLightModelf(pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLightModelf"); -#endif -} - -// void glLightModelfv (GLenum pname, const GLfloat *params); -static inline void qglLightModelfv(GLenum pname, const GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLightModelfv(pname=%lu, params=%p)\n", pname, params); -#endif - glLightModelfv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLightModelfv"); -#endif -} - -// void glLightModeli (GLenum pname, GLint param); -static inline void qglLightModeli(GLenum pname, GLint param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLightModeli(pname=%lu, param=%ld)\n", pname, param); -#endif - glLightModeli(pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLightModeli"); -#endif -} - -// void glLightModeliv (GLenum pname, const GLint *params); -static inline void qglLightModeliv(GLenum pname, const GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLightModeliv(pname=%lu, params=%p)\n", pname, params); -#endif - glLightModeliv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLightModeliv"); -#endif -} - -// void glLightf (GLenum light, GLenum pname, GLfloat param); -static inline void qglLightf(GLenum light, GLenum pname, GLfloat param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLightf(light=%lu, pname=%lu, param=%f)\n", light, pname, param); -#endif - glLightf(light, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLightf"); -#endif -} - -// void glLightfv (GLenum light, GLenum pname, const GLfloat *params); -static inline void qglLightfv(GLenum light, GLenum pname, const GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLightfv(light=%lu, pname=%lu, params=%p)\n", light, pname, params); -#endif - glLightfv(light, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLightfv"); -#endif -} - -// void glLighti (GLenum light, GLenum pname, GLint param); -static inline void qglLighti(GLenum light, GLenum pname, GLint param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLighti(light=%lu, pname=%lu, param=%ld)\n", light, pname, param); -#endif - glLighti(light, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLighti"); -#endif -} - -// void glLightiv (GLenum light, GLenum pname, const GLint *params); -static inline void qglLightiv(GLenum light, GLenum pname, const GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLightiv(light=%lu, pname=%lu, params=%p)\n", light, pname, params); -#endif - glLightiv(light, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLightiv"); -#endif -} - -// void glLineStipple (GLint factor, GLushort pattern); -static inline void qglLineStipple(GLint factor, GLushort pattern) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLineStipple(factor=%ld, pattern=%u)\n", factor, pattern); -#endif - glLineStipple(factor, pattern); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLineStipple"); -#endif -} - -// void glLineWidth (GLfloat width); -static inline void qglLineWidth(GLfloat width) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLineWidth(width=%f)\n", width); -#endif - glLineWidth(width); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLineWidth"); -#endif -} - -// void glListBase (GLuint base); -static inline void qglListBase(GLuint base) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glListBase(base=%lu)\n", base); -#endif - glListBase(base); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glListBase"); -#endif -} - -// void glLoadIdentity (void); -static inline void qglLoadIdentity(void) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLoadIdentity(void)\n"); -#endif - glLoadIdentity(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLoadIdentity"); -#endif -} - -// void glLoadMatrixd (const GLdouble *m); -static inline void qglLoadMatrixd(const GLdouble *m) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLoadMatrixd(m=%p)\n", m); -#endif - glLoadMatrixd(m); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLoadMatrixd"); -#endif -} - -// void glLoadMatrixf (const GLfloat *m); -static inline void qglLoadMatrixf(const GLfloat *m) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLoadMatrixf(m=%p)\n", m); -#endif - glLoadMatrixf(m); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLoadMatrixf"); -#endif -} - -// void glLoadName (GLuint name); -static inline void qglLoadName(GLuint name) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLoadName(name=%lu)\n", name); -#endif - glLoadName(name); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLoadName"); -#endif -} - -// void glLogicOp (GLenum opcode); -static inline void qglLogicOp(GLenum opcode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLogicOp(opcode=%lu)\n", opcode); -#endif - glLogicOp(opcode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLogicOp"); -#endif -} - -// void glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -static inline void qglMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMap1d(target=%lu, u1=%f, u2=%f, stride=%ld, order=%ld, points=%p)\n", target, u1, u2, stride, order, points); -#endif - glMap1d(target, u1, u2, stride, order, points); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMap1d"); -#endif -} - -// void glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -static inline void qglMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMap1f(target=%lu, u1=%f, u2=%f, stride=%ld, order=%ld, points=%p)\n", target, u1, u2, stride, order, points); -#endif - glMap1f(target, u1, u2, stride, order, points); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMap1f"); -#endif -} - -// void glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -static inline void qglMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMap2d(target=%lu, u1=%f, u2=%f, ustride=%ld, uorder=%ld, v1=%f, v2=%f, vstride=%ld, vorder=%ld, points=%p)\n", target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); -#endif - glMap2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMap2d"); -#endif -} - -// void glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -static inline void qglMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMap2f(target=%lu, u1=%f, u2=%f, ustride=%ld, uorder=%ld, v1=%f, v2=%f, vstride=%ld, vorder=%ld, points=%p)\n", target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); -#endif - glMap2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMap2f"); -#endif -} - -// void glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); -static inline void qglMapGrid1d(GLint un, GLdouble u1, GLdouble u2) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMapGrid1d(un=%ld, u1=%f, u2=%f)\n", un, u1, u2); -#endif - glMapGrid1d(un, u1, u2); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMapGrid1d"); -#endif -} - -// void glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); -static inline void qglMapGrid1f(GLint un, GLfloat u1, GLfloat u2) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMapGrid1f(un=%ld, u1=%f, u2=%f)\n", un, u1, u2); -#endif - glMapGrid1f(un, u1, u2); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMapGrid1f"); -#endif -} - -// void glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -static inline void qglMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMapGrid2d(un=%ld, u1=%f, u2=%f, vn=%ld, v1=%f, v2=%f)\n", un, u1, u2, vn, v1, v2); -#endif - glMapGrid2d(un, u1, u2, vn, v1, v2); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMapGrid2d"); -#endif -} - -// void glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -static inline void qglMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMapGrid2f(un=%ld, u1=%f, u2=%f, vn=%ld, v1=%f, v2=%f)\n", un, u1, u2, vn, v1, v2); -#endif - glMapGrid2f(un, u1, u2, vn, v1, v2); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMapGrid2f"); -#endif -} - -// void glMaterialf (GLenum face, GLenum pname, GLfloat param); -static inline void qglMaterialf(GLenum face, GLenum pname, GLfloat param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMaterialf(face=%lu, pname=%lu, param=%f)\n", face, pname, param); -#endif - glMaterialf(face, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMaterialf"); -#endif -} - -// void glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); -static inline void qglMaterialfv(GLenum face, GLenum pname, const GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMaterialfv(face=%lu, pname=%lu, params=%p)\n", face, pname, params); -#endif - glMaterialfv(face, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMaterialfv"); -#endif -} - -// void glMateriali (GLenum face, GLenum pname, GLint param); -static inline void qglMateriali(GLenum face, GLenum pname, GLint param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMateriali(face=%lu, pname=%lu, param=%ld)\n", face, pname, param); -#endif - glMateriali(face, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMateriali"); -#endif -} - -// void glMaterialiv (GLenum face, GLenum pname, const GLint *params); -static inline void qglMaterialiv(GLenum face, GLenum pname, const GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMaterialiv(face=%lu, pname=%lu, params=%p)\n", face, pname, params); -#endif - glMaterialiv(face, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMaterialiv"); -#endif -} - -// void glMatrixMode (GLenum mode); -static inline void qglMatrixMode(GLenum mode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMatrixMode(mode=%lu)\n", mode); -#endif - glMatrixMode(mode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMatrixMode"); -#endif -} - -// void glMultMatrixd (const GLdouble *m); -static inline void qglMultMatrixd(const GLdouble *m) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMultMatrixd(m=%p)\n", m); -#endif - glMultMatrixd(m); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMultMatrixd"); -#endif -} - -// void glMultMatrixf (const GLfloat *m); -static inline void qglMultMatrixf(const GLfloat *m) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMultMatrixf(m=%p)\n", m); -#endif - glMultMatrixf(m); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMultMatrixf"); -#endif -} - -// void glNewList (GLuint list, GLenum mode); -static inline void qglNewList(GLuint list, GLenum mode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glNewList(list=%lu, mode=%lu)\n", list, mode); -#endif - glNewList(list, mode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glNewList"); -#endif -} - -// void glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); -static inline void qglNormal3b(GLbyte nx, GLbyte ny, GLbyte nz) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glNormal3b(nx=%d, ny=%d, nz=%d)\n", nx, ny, nz); -#endif - glNormal3b(nx, ny, nz); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glNormal3b"); -#endif -} - -// void glNormal3bv (const GLbyte *v); -static inline void qglNormal3bv(const GLbyte *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glNormal3bv(v=%p)\n", v); -#endif - glNormal3bv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glNormal3bv"); -#endif -} - -// void glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); -static inline void qglNormal3d(GLdouble nx, GLdouble ny, GLdouble nz) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glNormal3d(nx=%f, ny=%f, nz=%f)\n", nx, ny, nz); -#endif - glNormal3d(nx, ny, nz); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glNormal3d"); -#endif -} - -// void glNormal3dv (const GLdouble *v); -static inline void qglNormal3dv(const GLdouble *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glNormal3dv(v=%p)\n", v); -#endif - glNormal3dv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glNormal3dv"); -#endif -} - -// void glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); -static inline void qglNormal3f(GLfloat nx, GLfloat ny, GLfloat nz) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glNormal3f(nx=%f, ny=%f, nz=%f)\n", nx, ny, nz); -#endif - glNormal3f(nx, ny, nz); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glNormal3f"); -#endif -} - -// void glNormal3fv (const GLfloat *v); -static inline void qglNormal3fv(const GLfloat *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glNormal3fv(v=%p)\n", v); -#endif - glNormal3fv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glNormal3fv"); -#endif -} - -// void glNormal3i (GLint nx, GLint ny, GLint nz); -static inline void qglNormal3i(GLint nx, GLint ny, GLint nz) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glNormal3i(nx=%ld, ny=%ld, nz=%ld)\n", nx, ny, nz); -#endif - glNormal3i(nx, ny, nz); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glNormal3i"); -#endif -} - -// void glNormal3iv (const GLint *v); -static inline void qglNormal3iv(const GLint *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glNormal3iv(v=%p)\n", v); -#endif - glNormal3iv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glNormal3iv"); -#endif -} - -// void glNormal3s (GLshort nx, GLshort ny, GLshort nz); -static inline void qglNormal3s(GLshort nx, GLshort ny, GLshort nz) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glNormal3s(nx=%d, ny=%d, nz=%d)\n", nx, ny, nz); -#endif - glNormal3s(nx, ny, nz); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glNormal3s"); -#endif -} - -// void glNormal3sv (const GLshort *v); -static inline void qglNormal3sv(const GLshort *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glNormal3sv(v=%p)\n", v); -#endif - glNormal3sv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glNormal3sv"); -#endif -} - -// void glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer); -static inline void qglNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glNormalPointer(type=%lu, stride=%ld, pointer=%p)\n", type, stride, pointer); -#endif - glNormalPointer(type, stride, pointer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glNormalPointer"); -#endif -} - -// void glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -static inline void qglOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glOrtho(left=%f, right=%f, bottom=%f, top=%f, zNear=%f, zFar=%f)\n", left, right, bottom, top, zNear, zFar); -#endif - glOrtho(left, right, bottom, top, zNear, zFar); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glOrtho"); -#endif -} - -// void glPassThrough (GLfloat token); -static inline void qglPassThrough(GLfloat token) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPassThrough(token=%f)\n", token); -#endif - glPassThrough(token); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPassThrough"); -#endif -} - -// void glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values); -static inline void qglPixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPixelMapfv(map=%lu, mapsize=%ld, values=%p)\n", map, mapsize, values); -#endif - glPixelMapfv(map, mapsize, values); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPixelMapfv"); -#endif -} - -// void glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values); -static inline void qglPixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPixelMapuiv(map=%lu, mapsize=%ld, values=%p)\n", map, mapsize, values); -#endif - glPixelMapuiv(map, mapsize, values); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPixelMapuiv"); -#endif -} - -// void glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values); -static inline void qglPixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPixelMapusv(map=%lu, mapsize=%ld, values=%p)\n", map, mapsize, values); -#endif - glPixelMapusv(map, mapsize, values); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPixelMapusv"); -#endif -} - -// void glPixelStoref (GLenum pname, GLfloat param); -static inline void qglPixelStoref(GLenum pname, GLfloat param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPixelStoref(pname=%lu, param=%f)\n", pname, param); -#endif - glPixelStoref(pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPixelStoref"); -#endif -} - -// void glPixelStorei (GLenum pname, GLint param); -static inline void qglPixelStorei(GLenum pname, GLint param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPixelStorei(pname=%lu, param=%ld)\n", pname, param); -#endif - glPixelStorei(pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPixelStorei"); -#endif -} - -// void glPixelTransferf (GLenum pname, GLfloat param); -static inline void qglPixelTransferf(GLenum pname, GLfloat param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPixelTransferf(pname=%lu, param=%f)\n", pname, param); -#endif - glPixelTransferf(pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPixelTransferf"); -#endif -} - -// void glPixelTransferi (GLenum pname, GLint param); -static inline void qglPixelTransferi(GLenum pname, GLint param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPixelTransferi(pname=%lu, param=%ld)\n", pname, param); -#endif - glPixelTransferi(pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPixelTransferi"); -#endif -} - -// void glPixelZoom (GLfloat xfactor, GLfloat yfactor); -static inline void qglPixelZoom(GLfloat xfactor, GLfloat yfactor) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPixelZoom(xfactor=%f, yfactor=%f)\n", xfactor, yfactor); -#endif - glPixelZoom(xfactor, yfactor); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPixelZoom"); -#endif -} - -// void glPointSize (GLfloat size); -static inline void qglPointSize(GLfloat size) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPointSize(size=%f)\n", size); -#endif - glPointSize(size); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPointSize"); -#endif -} - -// void glPolygonMode (GLenum face, GLenum mode); -static inline void qglPolygonMode(GLenum face, GLenum mode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPolygonMode(face=%lu, mode=%lu)\n", face, mode); -#endif - glPolygonMode(face, mode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPolygonMode"); -#endif -} - -// void glPolygonOffset (GLfloat factor, GLfloat units); -static inline void qglPolygonOffset(GLfloat factor, GLfloat units) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPolygonOffset(factor=%f, units=%f)\n", factor, units); -#endif - glPolygonOffset(factor, units); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPolygonOffset"); -#endif -} - -// void glPolygonStipple (const GLubyte *mask); -static inline void qglPolygonStipple(const GLubyte *mask) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPolygonStipple(mask=%p)\n", mask); -#endif - glPolygonStipple(mask); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPolygonStipple"); -#endif -} - -// void glPopAttrib (void); -static inline void qglPopAttrib(void) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPopAttrib(void)\n"); -#endif - glPopAttrib(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPopAttrib"); -#endif -} - -// void glPopClientAttrib (void); -static inline void qglPopClientAttrib(void) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPopClientAttrib(void)\n"); -#endif - glPopClientAttrib(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPopClientAttrib"); -#endif -} - -// void glPopMatrix (void); -static inline void qglPopMatrix(void) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPopMatrix(void)\n"); -#endif - glPopMatrix(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPopMatrix"); -#endif -} - -// void glPopName (void); -static inline void qglPopName(void) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPopName(void)\n"); -#endif - glPopName(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPopName"); -#endif -} - -// void glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); -static inline void qglPrioritizeTextures(GLsizei n, const GLuint *textures, const GLclampf *priorities) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPrioritizeTextures(n=%ld, textures=%p, priorities=%p)\n", n, textures, priorities); -#endif - glPrioritizeTextures(n, textures, priorities); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPrioritizeTextures"); -#endif -} - -// void glPushAttrib (GLbitfield mask); -static inline void qglPushAttrib(GLbitfield mask) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPushAttrib(mask=%lu)\n", mask); -#endif - glPushAttrib(mask); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPushAttrib"); -#endif -} - -// void glPushClientAttrib (GLbitfield mask); -static inline void qglPushClientAttrib(GLbitfield mask) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPushClientAttrib(mask=%lu)\n", mask); -#endif - glPushClientAttrib(mask); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPushClientAttrib"); -#endif -} - -// void glPushMatrix (void); -static inline void qglPushMatrix(void) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPushMatrix(void)\n"); -#endif - glPushMatrix(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPushMatrix"); -#endif -} - -// void glPushName (GLuint name); -static inline void qglPushName(GLuint name) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPushName(name=%lu)\n", name); -#endif - glPushName(name); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPushName"); -#endif -} - -// void glRasterPos2d (GLdouble x, GLdouble y); -static inline void qglRasterPos2d(GLdouble x, GLdouble y) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos2d(x=%f, y=%f)\n", x, y); -#endif - glRasterPos2d(x, y); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos2d"); -#endif -} - -// void glRasterPos2dv (const GLdouble *v); -static inline void qglRasterPos2dv(const GLdouble *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos2dv(v=%p)\n", v); -#endif - glRasterPos2dv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos2dv"); -#endif -} - -// void glRasterPos2f (GLfloat x, GLfloat y); -static inline void qglRasterPos2f(GLfloat x, GLfloat y) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos2f(x=%f, y=%f)\n", x, y); -#endif - glRasterPos2f(x, y); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos2f"); -#endif -} - -// void glRasterPos2fv (const GLfloat *v); -static inline void qglRasterPos2fv(const GLfloat *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos2fv(v=%p)\n", v); -#endif - glRasterPos2fv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos2fv"); -#endif -} - -// void glRasterPos2i (GLint x, GLint y); -static inline void qglRasterPos2i(GLint x, GLint y) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos2i(x=%ld, y=%ld)\n", x, y); -#endif - glRasterPos2i(x, y); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos2i"); -#endif -} - -// void glRasterPos2iv (const GLint *v); -static inline void qglRasterPos2iv(const GLint *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos2iv(v=%p)\n", v); -#endif - glRasterPos2iv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos2iv"); -#endif -} - -// void glRasterPos2s (GLshort x, GLshort y); -static inline void qglRasterPos2s(GLshort x, GLshort y) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos2s(x=%d, y=%d)\n", x, y); -#endif - glRasterPos2s(x, y); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos2s"); -#endif -} - -// void glRasterPos2sv (const GLshort *v); -static inline void qglRasterPos2sv(const GLshort *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos2sv(v=%p)\n", v); -#endif - glRasterPos2sv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos2sv"); -#endif -} - -// void glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); -static inline void qglRasterPos3d(GLdouble x, GLdouble y, GLdouble z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos3d(x=%f, y=%f, z=%f)\n", x, y, z); -#endif - glRasterPos3d(x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos3d"); -#endif -} - -// void glRasterPos3dv (const GLdouble *v); -static inline void qglRasterPos3dv(const GLdouble *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos3dv(v=%p)\n", v); -#endif - glRasterPos3dv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos3dv"); -#endif -} - -// void glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); -static inline void qglRasterPos3f(GLfloat x, GLfloat y, GLfloat z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos3f(x=%f, y=%f, z=%f)\n", x, y, z); -#endif - glRasterPos3f(x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos3f"); -#endif -} - -// void glRasterPos3fv (const GLfloat *v); -static inline void qglRasterPos3fv(const GLfloat *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos3fv(v=%p)\n", v); -#endif - glRasterPos3fv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos3fv"); -#endif -} - -// void glRasterPos3i (GLint x, GLint y, GLint z); -static inline void qglRasterPos3i(GLint x, GLint y, GLint z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos3i(x=%ld, y=%ld, z=%ld)\n", x, y, z); -#endif - glRasterPos3i(x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos3i"); -#endif -} - -// void glRasterPos3iv (const GLint *v); -static inline void qglRasterPos3iv(const GLint *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos3iv(v=%p)\n", v); -#endif - glRasterPos3iv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos3iv"); -#endif -} - -// void glRasterPos3s (GLshort x, GLshort y, GLshort z); -static inline void qglRasterPos3s(GLshort x, GLshort y, GLshort z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos3s(x=%d, y=%d, z=%d)\n", x, y, z); -#endif - glRasterPos3s(x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos3s"); -#endif -} - -// void glRasterPos3sv (const GLshort *v); -static inline void qglRasterPos3sv(const GLshort *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos3sv(v=%p)\n", v); -#endif - glRasterPos3sv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos3sv"); -#endif -} - -// void glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -static inline void qglRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos4d(x=%f, y=%f, z=%f, w=%f)\n", x, y, z, w); -#endif - glRasterPos4d(x, y, z, w); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos4d"); -#endif -} - -// void glRasterPos4dv (const GLdouble *v); -static inline void qglRasterPos4dv(const GLdouble *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos4dv(v=%p)\n", v); -#endif - glRasterPos4dv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos4dv"); -#endif -} - -// void glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -static inline void qglRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos4f(x=%f, y=%f, z=%f, w=%f)\n", x, y, z, w); -#endif - glRasterPos4f(x, y, z, w); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos4f"); -#endif -} - -// void glRasterPos4fv (const GLfloat *v); -static inline void qglRasterPos4fv(const GLfloat *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos4fv(v=%p)\n", v); -#endif - glRasterPos4fv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos4fv"); -#endif -} - -// void glRasterPos4i (GLint x, GLint y, GLint z, GLint w); -static inline void qglRasterPos4i(GLint x, GLint y, GLint z, GLint w) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos4i(x=%ld, y=%ld, z=%ld, w=%ld)\n", x, y, z, w); -#endif - glRasterPos4i(x, y, z, w); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos4i"); -#endif -} - -// void glRasterPos4iv (const GLint *v); -static inline void qglRasterPos4iv(const GLint *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos4iv(v=%p)\n", v); -#endif - glRasterPos4iv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos4iv"); -#endif -} - -// void glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); -static inline void qglRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos4s(x=%d, y=%d, z=%d, w=%d)\n", x, y, z, w); -#endif - glRasterPos4s(x, y, z, w); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos4s"); -#endif -} - -// void glRasterPos4sv (const GLshort *v); -static inline void qglRasterPos4sv(const GLshort *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRasterPos4sv(v=%p)\n", v); -#endif - glRasterPos4sv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRasterPos4sv"); -#endif -} - -// void glReadBuffer (GLenum mode); -static inline void qglReadBuffer(GLenum mode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glReadBuffer(mode=%lu)\n", mode); -#endif - glReadBuffer(mode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glReadBuffer"); -#endif -} - -// void glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); -static inline void qglReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glReadPixels(x=%ld, y=%ld, width=%ld, height=%ld, format=%lu, type=%lu, pixels=%p)\n", x, y, width, height, format, type, pixels); -#endif - glReadPixels(x, y, width, height, format, type, pixels); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glReadPixels"); -#endif -} - -// void glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -static inline void qglRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRectd(x1=%f, y1=%f, x2=%f, y2=%f)\n", x1, y1, x2, y2); -#endif - glRectd(x1, y1, x2, y2); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRectd"); -#endif -} - -// void glRectdv (const GLdouble *v1, const GLdouble *v2); -static inline void qglRectdv(const GLdouble *v1, const GLdouble *v2) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRectdv(v1=%p, v2=%p)\n", v1, v2); -#endif - glRectdv(v1, v2); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRectdv"); -#endif -} - -// void glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -static inline void qglRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRectf(x1=%f, y1=%f, x2=%f, y2=%f)\n", x1, y1, x2, y2); -#endif - glRectf(x1, y1, x2, y2); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRectf"); -#endif -} - -// void glRectfv (const GLfloat *v1, const GLfloat *v2); -static inline void qglRectfv(const GLfloat *v1, const GLfloat *v2) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRectfv(v1=%p, v2=%p)\n", v1, v2); -#endif - glRectfv(v1, v2); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRectfv"); -#endif -} - -// void glRecti (GLint x1, GLint y1, GLint x2, GLint y2); -static inline void qglRecti(GLint x1, GLint y1, GLint x2, GLint y2) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRecti(x1=%ld, y1=%ld, x2=%ld, y2=%ld)\n", x1, y1, x2, y2); -#endif - glRecti(x1, y1, x2, y2); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRecti"); -#endif -} - -// void glRectiv (const GLint *v1, const GLint *v2); -static inline void qglRectiv(const GLint *v1, const GLint *v2) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRectiv(v1=%p, v2=%p)\n", v1, v2); -#endif - glRectiv(v1, v2); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRectiv"); -#endif -} - -// void glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); -static inline void qglRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRects(x1=%d, y1=%d, x2=%d, y2=%d)\n", x1, y1, x2, y2); -#endif - glRects(x1, y1, x2, y2); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRects"); -#endif -} - -// void glRectsv (const GLshort *v1, const GLshort *v2); -static inline void qglRectsv(const GLshort *v1, const GLshort *v2) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRectsv(v1=%p, v2=%p)\n", v1, v2); -#endif - glRectsv(v1, v2); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRectsv"); -#endif -} - -// GLint glRenderMode (GLenum mode); -static inline GLint qglRenderMode(GLenum mode) -{ - GLint returnValue; -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRenderMode(mode=%lu)\n", mode); -#endif - returnValue = glRenderMode(mode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRenderMode"); -#endif - return returnValue; -} - -// void glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -static inline void qglRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRotated(angle=%f, x=%f, y=%f, z=%f)\n", angle, x, y, z); -#endif - glRotated(angle, x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRotated"); -#endif -} - -// void glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -static inline void qglRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRotatef(angle=%f, x=%f, y=%f, z=%f)\n", angle, x, y, z); -#endif - glRotatef(angle, x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRotatef"); -#endif -} - -// void glScaled (GLdouble x, GLdouble y, GLdouble z); -static inline void qglScaled(GLdouble x, GLdouble y, GLdouble z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glScaled(x=%f, y=%f, z=%f)\n", x, y, z); -#endif - glScaled(x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glScaled"); -#endif -} - -// void glScalef (GLfloat x, GLfloat y, GLfloat z); -static inline void qglScalef(GLfloat x, GLfloat y, GLfloat z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glScalef(x=%f, y=%f, z=%f)\n", x, y, z); -#endif - glScalef(x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glScalef"); -#endif -} - -// void glScissor (GLint x, GLint y, GLsizei width, GLsizei height); -static inline void qglScissor(GLint x, GLint y, GLsizei width, GLsizei height) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glScissor(x=%ld, y=%ld, width=%ld, height=%ld)\n", x, y, width, height); -#endif - glScissor(x, y, width, height); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glScissor"); -#endif -} - -// void glSelectBuffer (GLsizei size, GLuint *buffer); -static inline void qglSelectBuffer(GLsizei size, GLuint *buffer) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glSelectBuffer(size=%ld, buffer=%p)\n", size, buffer); -#endif - glSelectBuffer(size, buffer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glSelectBuffer"); -#endif -} - -// void glShadeModel (GLenum mode); -static inline void qglShadeModel(GLenum mode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glShadeModel(mode=%lu)\n", mode); -#endif - glShadeModel(mode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glShadeModel"); -#endif -} - -// void glStencilFunc (GLenum func, GLint ref, GLuint mask); -static inline void qglStencilFunc(GLenum func, GLint ref, GLuint mask) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glStencilFunc(func=%lu, ref=%ld, mask=%lu)\n", func, ref, mask); -#endif - glStencilFunc(func, ref, mask); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glStencilFunc"); -#endif -} - -// void glStencilMask (GLuint mask); -static inline void qglStencilMask(GLuint mask) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glStencilMask(mask=%lu)\n", mask); -#endif - glStencilMask(mask); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glStencilMask"); -#endif -} - -// void glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); -static inline void qglStencilOp(GLenum fail, GLenum zfail, GLenum zpass) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glStencilOp(fail=%lu, zfail=%lu, zpass=%lu)\n", fail, zfail, zpass); -#endif - glStencilOp(fail, zfail, zpass); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glStencilOp"); -#endif -} - -// void glTexCoord1d (GLdouble s); -static inline void qglTexCoord1d(GLdouble s) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord1d(s=%f)\n", s); -#endif - glTexCoord1d(s); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord1d"); -#endif -} - -// void glTexCoord1dv (const GLdouble *v); -static inline void qglTexCoord1dv(const GLdouble *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord1dv(v=%p)\n", v); -#endif - glTexCoord1dv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord1dv"); -#endif -} - -// void glTexCoord1f (GLfloat s); -static inline void qglTexCoord1f(GLfloat s) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord1f(s=%f)\n", s); -#endif - glTexCoord1f(s); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord1f"); -#endif -} - -// void glTexCoord1fv (const GLfloat *v); -static inline void qglTexCoord1fv(const GLfloat *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord1fv(v=%p)\n", v); -#endif - glTexCoord1fv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord1fv"); -#endif -} - -// void glTexCoord1i (GLint s); -static inline void qglTexCoord1i(GLint s) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord1i(s=%ld)\n", s); -#endif - glTexCoord1i(s); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord1i"); -#endif -} - -// void glTexCoord1iv (const GLint *v); -static inline void qglTexCoord1iv(const GLint *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord1iv(v=%p)\n", v); -#endif - glTexCoord1iv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord1iv"); -#endif -} - -// void glTexCoord1s (GLshort s); -static inline void qglTexCoord1s(GLshort s) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord1s(s=%d)\n", s); -#endif - glTexCoord1s(s); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord1s"); -#endif -} - -// void glTexCoord1sv (const GLshort *v); -static inline void qglTexCoord1sv(const GLshort *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord1sv(v=%p)\n", v); -#endif - glTexCoord1sv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord1sv"); -#endif -} - -// void glTexCoord2d (GLdouble s, GLdouble t); -static inline void qglTexCoord2d(GLdouble s, GLdouble t) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord2d(s=%f, t=%f)\n", s, t); -#endif - glTexCoord2d(s, t); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord2d"); -#endif -} - -// void glTexCoord2dv (const GLdouble *v); -static inline void qglTexCoord2dv(const GLdouble *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord2dv(v=%p)\n", v); -#endif - glTexCoord2dv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord2dv"); -#endif -} - -// void glTexCoord2f (GLfloat s, GLfloat t); -static inline void qglTexCoord2f(GLfloat s, GLfloat t) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord2f(s=%f, t=%f)\n", s, t); -#endif - glTexCoord2f(s, t); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord2f"); -#endif -} - -// void glTexCoord2fv (const GLfloat *v); -static inline void qglTexCoord2fv(const GLfloat *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord2fv(v=%p)\n", v); -#endif - glTexCoord2fv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord2fv"); -#endif -} - -// void glTexCoord2i (GLint s, GLint t); -static inline void qglTexCoord2i(GLint s, GLint t) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord2i(s=%ld, t=%ld)\n", s, t); -#endif - glTexCoord2i(s, t); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord2i"); -#endif -} - -// void glTexCoord2iv (const GLint *v); -static inline void qglTexCoord2iv(const GLint *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord2iv(v=%p)\n", v); -#endif - glTexCoord2iv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord2iv"); -#endif -} - -// void glTexCoord2s (GLshort s, GLshort t); -static inline void qglTexCoord2s(GLshort s, GLshort t) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord2s(s=%d, t=%d)\n", s, t); -#endif - glTexCoord2s(s, t); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord2s"); -#endif -} - -// void glTexCoord2sv (const GLshort *v); -static inline void qglTexCoord2sv(const GLshort *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord2sv(v=%p)\n", v); -#endif - glTexCoord2sv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord2sv"); -#endif -} - -// void glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); -static inline void qglTexCoord3d(GLdouble s, GLdouble t, GLdouble r) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord3d(s=%f, t=%f, r=%f)\n", s, t, r); -#endif - glTexCoord3d(s, t, r); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord3d"); -#endif -} - -// void glTexCoord3dv (const GLdouble *v); -static inline void qglTexCoord3dv(const GLdouble *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord3dv(v=%p)\n", v); -#endif - glTexCoord3dv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord3dv"); -#endif -} - -// void glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); -static inline void qglTexCoord3f(GLfloat s, GLfloat t, GLfloat r) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord3f(s=%f, t=%f, r=%f)\n", s, t, r); -#endif - glTexCoord3f(s, t, r); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord3f"); -#endif -} - -// void glTexCoord3fv (const GLfloat *v); -static inline void qglTexCoord3fv(const GLfloat *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord3fv(v=%p)\n", v); -#endif - glTexCoord3fv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord3fv"); -#endif -} - -// void glTexCoord3i (GLint s, GLint t, GLint r); -static inline void qglTexCoord3i(GLint s, GLint t, GLint r) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord3i(s=%ld, t=%ld, r=%ld)\n", s, t, r); -#endif - glTexCoord3i(s, t, r); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord3i"); -#endif -} - -// void glTexCoord3iv (const GLint *v); -static inline void qglTexCoord3iv(const GLint *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord3iv(v=%p)\n", v); -#endif - glTexCoord3iv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord3iv"); -#endif -} - -// void glTexCoord3s (GLshort s, GLshort t, GLshort r); -static inline void qglTexCoord3s(GLshort s, GLshort t, GLshort r) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord3s(s=%d, t=%d, r=%d)\n", s, t, r); -#endif - glTexCoord3s(s, t, r); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord3s"); -#endif -} - -// void glTexCoord3sv (const GLshort *v); -static inline void qglTexCoord3sv(const GLshort *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord3sv(v=%p)\n", v); -#endif - glTexCoord3sv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord3sv"); -#endif -} - -// void glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); -static inline void qglTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord4d(s=%f, t=%f, r=%f, q=%f)\n", s, t, r, q); -#endif - glTexCoord4d(s, t, r, q); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord4d"); -#endif -} - -// void glTexCoord4dv (const GLdouble *v); -static inline void qglTexCoord4dv(const GLdouble *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord4dv(v=%p)\n", v); -#endif - glTexCoord4dv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord4dv"); -#endif -} - -// void glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); -static inline void qglTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord4f(s=%f, t=%f, r=%f, q=%f)\n", s, t, r, q); -#endif - glTexCoord4f(s, t, r, q); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord4f"); -#endif -} - -// void glTexCoord4fv (const GLfloat *v); -static inline void qglTexCoord4fv(const GLfloat *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord4fv(v=%p)\n", v); -#endif - glTexCoord4fv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord4fv"); -#endif -} - -// void glTexCoord4i (GLint s, GLint t, GLint r, GLint q); -static inline void qglTexCoord4i(GLint s, GLint t, GLint r, GLint q) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord4i(s=%ld, t=%ld, r=%ld, q=%ld)\n", s, t, r, q); -#endif - glTexCoord4i(s, t, r, q); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord4i"); -#endif -} - -// void glTexCoord4iv (const GLint *v); -static inline void qglTexCoord4iv(const GLint *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord4iv(v=%p)\n", v); -#endif - glTexCoord4iv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord4iv"); -#endif -} - -// void glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); -static inline void qglTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord4s(s=%d, t=%d, r=%d, q=%d)\n", s, t, r, q); -#endif - glTexCoord4s(s, t, r, q); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord4s"); -#endif -} - -// void glTexCoord4sv (const GLshort *v); -static inline void qglTexCoord4sv(const GLshort *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoord4sv(v=%p)\n", v); -#endif - glTexCoord4sv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoord4sv"); -#endif -} - -// void glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static inline void qglTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoordPointer(size=%ld, type=%lu, stride=%ld, pointer=%p)\n", size, type, stride, pointer); -#endif - glTexCoordPointer(size, type, stride, pointer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoordPointer"); -#endif -} - -// void glTexEnvf (GLenum target, GLenum pname, GLfloat param); -static inline void qglTexEnvf(GLenum target, GLenum pname, GLfloat param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexEnvf(target=%lu, pname=%lu, param=%f)\n", target, pname, param); -#endif - glTexEnvf(target, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexEnvf"); -#endif -} - -// void glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); -static inline void qglTexEnvfv(GLenum target, GLenum pname, const GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexEnvfv(target=%lu, pname=%lu, params=%p)\n", target, pname, params); -#endif - glTexEnvfv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexEnvfv"); -#endif -} - -// void glTexEnvi (GLenum target, GLenum pname, GLint param); -static inline void qglTexEnvi(GLenum target, GLenum pname, GLint param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexEnvi(target=%lu, pname=%lu, param=%ld)\n", target, pname, param); -#endif - glTexEnvi(target, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexEnvi"); -#endif -} - -// void glTexEnviv (GLenum target, GLenum pname, const GLint *params); -static inline void qglTexEnviv(GLenum target, GLenum pname, const GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexEnviv(target=%lu, pname=%lu, params=%p)\n", target, pname, params); -#endif - glTexEnviv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexEnviv"); -#endif -} - -// void glTexGend (GLenum coord, GLenum pname, GLdouble param); -static inline void qglTexGend(GLenum coord, GLenum pname, GLdouble param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexGend(coord=%lu, pname=%lu, param=%f)\n", coord, pname, param); -#endif - glTexGend(coord, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexGend"); -#endif -} - -// void glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); -static inline void qglTexGendv(GLenum coord, GLenum pname, const GLdouble *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexGendv(coord=%lu, pname=%lu, params=%p)\n", coord, pname, params); -#endif - glTexGendv(coord, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexGendv"); -#endif -} - -// void glTexGenf (GLenum coord, GLenum pname, GLfloat param); -static inline void qglTexGenf(GLenum coord, GLenum pname, GLfloat param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexGenf(coord=%lu, pname=%lu, param=%f)\n", coord, pname, param); -#endif - glTexGenf(coord, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexGenf"); -#endif -} - -// void glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); -static inline void qglTexGenfv(GLenum coord, GLenum pname, const GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexGenfv(coord=%lu, pname=%lu, params=%p)\n", coord, pname, params); -#endif - glTexGenfv(coord, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexGenfv"); -#endif -} - -// void glTexGeni (GLenum coord, GLenum pname, GLint param); -static inline void qglTexGeni(GLenum coord, GLenum pname, GLint param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexGeni(coord=%lu, pname=%lu, param=%ld)\n", coord, pname, param); -#endif - glTexGeni(coord, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexGeni"); -#endif -} - -// void glTexGeniv (GLenum coord, GLenum pname, const GLint *params); -static inline void qglTexGeniv(GLenum coord, GLenum pname, const GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexGeniv(coord=%lu, pname=%lu, params=%p)\n", coord, pname, params); -#endif - glTexGeniv(coord, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexGeniv"); -#endif -} - -// void glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -static inline void qglTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexImage1D(target=%lu, level=%ld, internalformat=%ld, width=%ld, border=%ld, format=%lu, type=%lu, pixels=%p)\n", target, level, internalformat, width, border, format, type, pixels); -#endif - glTexImage1D(target, level, internalformat, width, border, format, type, pixels); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexImage1D"); -#endif -} - -// void glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -static inline void qglTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexImage2D(target=%lu, level=%ld, internalformat=%ld, width=%ld, height=%ld, border=%ld, format=%lu, type=%lu, pixels=%p)\n", target, level, internalformat, width, height, border, format, type, pixels); -#endif - glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexImage2D"); -#endif -} - -// void glTexParameterf (GLenum target, GLenum pname, GLfloat param); -static inline void qglTexParameterf(GLenum target, GLenum pname, GLfloat param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexParameterf(target=%lu, pname=%lu, param=%f)\n", target, pname, param); -#endif - glTexParameterf(target, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexParameterf"); -#endif -} - -// void glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); -static inline void qglTexParameterfv(GLenum target, GLenum pname, const GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexParameterfv(target=%lu, pname=%lu, params=%p)\n", target, pname, params); -#endif - glTexParameterfv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexParameterfv"); -#endif -} - -// void glTexParameteri (GLenum target, GLenum pname, GLint param); -static inline void qglTexParameteri(GLenum target, GLenum pname, GLint param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexParameteri(target=%lu, pname=%lu, param=%ld)\n", target, pname, param); -#endif - glTexParameteri(target, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexParameteri"); -#endif -} - -// void glTexParameteriv (GLenum target, GLenum pname, const GLint *params); -static inline void qglTexParameteriv(GLenum target, GLenum pname, const GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexParameteriv(target=%lu, pname=%lu, params=%p)\n", target, pname, params); -#endif - glTexParameteriv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexParameteriv"); -#endif -} - -// void glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -static inline void qglTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexSubImage1D(target=%lu, level=%ld, xoffset=%ld, width=%ld, format=%lu, type=%lu, pixels=%p)\n", target, level, xoffset, width, format, type, pixels); -#endif - glTexSubImage1D(target, level, xoffset, width, format, type, pixels); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexSubImage1D"); -#endif -} - -// void glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -static inline void qglTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexSubImage2D(target=%lu, level=%ld, xoffset=%ld, yoffset=%ld, width=%ld, height=%ld, format=%lu, type=%lu, pixels=%p)\n", target, level, xoffset, yoffset, width, height, format, type, pixels); -#endif - glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexSubImage2D"); -#endif -} - -// void glTranslated (GLdouble x, GLdouble y, GLdouble z); -static inline void qglTranslated(GLdouble x, GLdouble y, GLdouble z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTranslated(x=%f, y=%f, z=%f)\n", x, y, z); -#endif - glTranslated(x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTranslated"); -#endif -} - -// void glTranslatef (GLfloat x, GLfloat y, GLfloat z); -static inline void qglTranslatef(GLfloat x, GLfloat y, GLfloat z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTranslatef(x=%f, y=%f, z=%f)\n", x, y, z); -#endif - glTranslatef(x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTranslatef"); -#endif -} - -// void glVertex2d (GLdouble x, GLdouble y); -static inline void qglVertex2d(GLdouble x, GLdouble y) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex2d(x=%f, y=%f)\n", x, y); -#endif - glVertex2d(x, y); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex2d"); -#endif -} - -// void glVertex2dv (const GLdouble *v); -static inline void qglVertex2dv(const GLdouble *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex2dv(v=%p)\n", v); -#endif - glVertex2dv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex2dv"); -#endif -} - -// void glVertex2f (GLfloat x, GLfloat y); -static inline void qglVertex2f(GLfloat x, GLfloat y) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex2f(x=%f, y=%f)\n", x, y); -#endif - glVertex2f(x, y); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex2f"); -#endif -} - -// void glVertex2fv (const GLfloat *v); -static inline void qglVertex2fv(const GLfloat *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex2fv(v=%p)\n", v); -#endif - glVertex2fv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex2fv"); -#endif -} - -// void glVertex2i (GLint x, GLint y); -static inline void qglVertex2i(GLint x, GLint y) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex2i(x=%ld, y=%ld)\n", x, y); -#endif - glVertex2i(x, y); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex2i"); -#endif -} - -// void glVertex2iv (const GLint *v); -static inline void qglVertex2iv(const GLint *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex2iv(v=%p)\n", v); -#endif - glVertex2iv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex2iv"); -#endif -} - -// void glVertex2s (GLshort x, GLshort y); -static inline void qglVertex2s(GLshort x, GLshort y) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex2s(x=%d, y=%d)\n", x, y); -#endif - glVertex2s(x, y); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex2s"); -#endif -} - -// void glVertex2sv (const GLshort *v); -static inline void qglVertex2sv(const GLshort *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex2sv(v=%p)\n", v); -#endif - glVertex2sv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex2sv"); -#endif -} - -// void glVertex3d (GLdouble x, GLdouble y, GLdouble z); -static inline void qglVertex3d(GLdouble x, GLdouble y, GLdouble z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex3d(x=%f, y=%f, z=%f)\n", x, y, z); -#endif - glVertex3d(x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex3d"); -#endif -} - -// void glVertex3dv (const GLdouble *v); -static inline void qglVertex3dv(const GLdouble *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex3dv(v=%p)\n", v); -#endif - glVertex3dv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex3dv"); -#endif -} - -// void glVertex3f (GLfloat x, GLfloat y, GLfloat z); -static inline void qglVertex3f(GLfloat x, GLfloat y, GLfloat z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex3f(x=%f, y=%f, z=%f)\n", x, y, z); -#endif - glVertex3f(x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex3f"); -#endif -} - -// void glVertex3fv (const GLfloat *v); -static inline void qglVertex3fv(const GLfloat *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex3fv(v=%p)\n", v); -#endif - glVertex3fv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex3fv"); -#endif -} - -// void glVertex3i (GLint x, GLint y, GLint z); -static inline void qglVertex3i(GLint x, GLint y, GLint z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex3i(x=%ld, y=%ld, z=%ld)\n", x, y, z); -#endif - glVertex3i(x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex3i"); -#endif -} - -// void glVertex3iv (const GLint *v); -static inline void qglVertex3iv(const GLint *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex3iv(v=%p)\n", v); -#endif - glVertex3iv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex3iv"); -#endif -} - -// void glVertex3s (GLshort x, GLshort y, GLshort z); -static inline void qglVertex3s(GLshort x, GLshort y, GLshort z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex3s(x=%d, y=%d, z=%d)\n", x, y, z); -#endif - glVertex3s(x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex3s"); -#endif -} - -// void glVertex3sv (const GLshort *v); -static inline void qglVertex3sv(const GLshort *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex3sv(v=%p)\n", v); -#endif - glVertex3sv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex3sv"); -#endif -} - -// void glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -static inline void qglVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex4d(x=%f, y=%f, z=%f, w=%f)\n", x, y, z, w); -#endif - glVertex4d(x, y, z, w); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex4d"); -#endif -} - -// void glVertex4dv (const GLdouble *v); -static inline void qglVertex4dv(const GLdouble *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex4dv(v=%p)\n", v); -#endif - glVertex4dv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex4dv"); -#endif -} - -// void glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -static inline void qglVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex4f(x=%f, y=%f, z=%f, w=%f)\n", x, y, z, w); -#endif - glVertex4f(x, y, z, w); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex4f"); -#endif -} - -// void glVertex4fv (const GLfloat *v); -static inline void qglVertex4fv(const GLfloat *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex4fv(v=%p)\n", v); -#endif - glVertex4fv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex4fv"); -#endif -} - -// void glVertex4i (GLint x, GLint y, GLint z, GLint w); -static inline void qglVertex4i(GLint x, GLint y, GLint z, GLint w) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex4i(x=%ld, y=%ld, z=%ld, w=%ld)\n", x, y, z, w); -#endif - glVertex4i(x, y, z, w); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex4i"); -#endif -} - -// void glVertex4iv (const GLint *v); -static inline void qglVertex4iv(const GLint *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex4iv(v=%p)\n", v); -#endif - glVertex4iv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex4iv"); -#endif -} - -// void glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); -static inline void qglVertex4s(GLshort x, GLshort y, GLshort z, GLshort w) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex4s(x=%d, y=%d, z=%d, w=%d)\n", x, y, z, w); -#endif - glVertex4s(x, y, z, w); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex4s"); -#endif -} - -// void glVertex4sv (const GLshort *v); -static inline void qglVertex4sv(const GLshort *v) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertex4sv(v=%p)\n", v); -#endif - glVertex4sv(v); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertex4sv"); -#endif -} - -// void glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static inline void qglVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertexPointer(size=%ld, type=%lu, stride=%ld, pointer=%p)\n", size, type, stride, pointer); -#endif - glVertexPointer(size, type, stride, pointer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertexPointer"); -#endif -} - -// void glViewport (GLint x, GLint y, GLsizei width, GLsizei height); -static inline void qglViewport(GLint x, GLint y, GLsizei width, GLsizei height) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glViewport(x=%ld, y=%ld, width=%ld, height=%ld)\n", x, y, width, height); -#endif - glViewport(x, y, width, height); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glViewport"); -#endif -} - -// Prevent calls to the 'normal' GL functions -#define glAccum CALL_THE_QGL_VERSION_OF_glAccum -#define glAlphaFunc CALL_THE_QGL_VERSION_OF_glAlphaFunc -#define glAreTexturesResident CALL_THE_QGL_VERSION_OF_glAreTexturesResident -#define glArrayElement CALL_THE_QGL_VERSION_OF_glArrayElement -#define glBegin CALL_THE_QGL_VERSION_OF_glBegin -#define glBindTexture CALL_THE_QGL_VERSION_OF_glBindTexture -#define glBitmap CALL_THE_QGL_VERSION_OF_glBitmap -#define glBlendFunc CALL_THE_QGL_VERSION_OF_glBlendFunc -#define glCallList CALL_THE_QGL_VERSION_OF_glCallList -#define glCallLists CALL_THE_QGL_VERSION_OF_glCallLists -#define glClear CALL_THE_QGL_VERSION_OF_glClear -#define glClearAccum CALL_THE_QGL_VERSION_OF_glClearAccum -#define glClearColor CALL_THE_QGL_VERSION_OF_glClearColor -#define glClearDepth CALL_THE_QGL_VERSION_OF_glClearDepth -#define glClearIndex CALL_THE_QGL_VERSION_OF_glClearIndex -#define glClearStencil CALL_THE_QGL_VERSION_OF_glClearStencil -#define glClipPlane CALL_THE_QGL_VERSION_OF_glClipPlane -#define glColor3b CALL_THE_QGL_VERSION_OF_glColor3b -#define glColor3bv CALL_THE_QGL_VERSION_OF_glColor3bv -#define glColor3d CALL_THE_QGL_VERSION_OF_glColor3d -#define glColor3dv CALL_THE_QGL_VERSION_OF_glColor3dv -#define glColor3f CALL_THE_QGL_VERSION_OF_glColor3f -#define glColor3fv CALL_THE_QGL_VERSION_OF_glColor3fv -#define glColor3i CALL_THE_QGL_VERSION_OF_glColor3i -#define glColor3iv CALL_THE_QGL_VERSION_OF_glColor3iv -#define glColor3s CALL_THE_QGL_VERSION_OF_glColor3s -#define glColor3sv CALL_THE_QGL_VERSION_OF_glColor3sv -#define glColor3ub CALL_THE_QGL_VERSION_OF_glColor3ub -#define glColor3ubv CALL_THE_QGL_VERSION_OF_glColor3ubv -#define glColor3ui CALL_THE_QGL_VERSION_OF_glColor3ui -#define glColor3uiv CALL_THE_QGL_VERSION_OF_glColor3uiv -#define glColor3us CALL_THE_QGL_VERSION_OF_glColor3us -#define glColor3usv CALL_THE_QGL_VERSION_OF_glColor3usv -#define glColor4b CALL_THE_QGL_VERSION_OF_glColor4b -#define glColor4bv CALL_THE_QGL_VERSION_OF_glColor4bv -#define glColor4d CALL_THE_QGL_VERSION_OF_glColor4d -#define glColor4dv CALL_THE_QGL_VERSION_OF_glColor4dv -#define glColor4f CALL_THE_QGL_VERSION_OF_glColor4f -#define glColor4fv CALL_THE_QGL_VERSION_OF_glColor4fv -#define glColor4i CALL_THE_QGL_VERSION_OF_glColor4i -#define glColor4iv CALL_THE_QGL_VERSION_OF_glColor4iv -#define glColor4s CALL_THE_QGL_VERSION_OF_glColor4s -#define glColor4sv CALL_THE_QGL_VERSION_OF_glColor4sv -#define glColor4ub CALL_THE_QGL_VERSION_OF_glColor4ub -#define glColor4ubv CALL_THE_QGL_VERSION_OF_glColor4ubv -#define glColor4ui CALL_THE_QGL_VERSION_OF_glColor4ui -#define glColor4uiv CALL_THE_QGL_VERSION_OF_glColor4uiv -#define glColor4us CALL_THE_QGL_VERSION_OF_glColor4us -#define glColor4usv CALL_THE_QGL_VERSION_OF_glColor4usv -#define glColorMask CALL_THE_QGL_VERSION_OF_glColorMask -#define glColorMaterial CALL_THE_QGL_VERSION_OF_glColorMaterial -#define glColorPointer CALL_THE_QGL_VERSION_OF_glColorPointer -#define glCopyPixels CALL_THE_QGL_VERSION_OF_glCopyPixels -#define glCopyTexImage1D CALL_THE_QGL_VERSION_OF_glCopyTexImage1D -#define glCopyTexImage2D CALL_THE_QGL_VERSION_OF_glCopyTexImage2D -#define glCopyTexSubImage1D CALL_THE_QGL_VERSION_OF_glCopyTexSubImage1D -#define glCopyTexSubImage2D CALL_THE_QGL_VERSION_OF_glCopyTexSubImage2D -#define glCullFace CALL_THE_QGL_VERSION_OF_glCullFace -#define glDeleteLists CALL_THE_QGL_VERSION_OF_glDeleteLists -#define glDeleteTextures CALL_THE_QGL_VERSION_OF_glDeleteTextures -#define glDepthFunc CALL_THE_QGL_VERSION_OF_glDepthFunc -#define glDepthMask CALL_THE_QGL_VERSION_OF_glDepthMask -#define glDepthRange CALL_THE_QGL_VERSION_OF_glDepthRange -#define glDisable CALL_THE_QGL_VERSION_OF_glDisable -#define glDisableClientState CALL_THE_QGL_VERSION_OF_glDisableClientState -#define glDrawArrays CALL_THE_QGL_VERSION_OF_glDrawArrays -#define glDrawBuffer CALL_THE_QGL_VERSION_OF_glDrawBuffer -#define glDrawElements CALL_THE_QGL_VERSION_OF_glDrawElements -#define glDrawPixels CALL_THE_QGL_VERSION_OF_glDrawPixels -#define glEdgeFlag CALL_THE_QGL_VERSION_OF_glEdgeFlag -#define glEdgeFlagPointer CALL_THE_QGL_VERSION_OF_glEdgeFlagPointer -#define glEdgeFlagv CALL_THE_QGL_VERSION_OF_glEdgeFlagv -#define glEnable CALL_THE_QGL_VERSION_OF_glEnable -#define glEnableClientState CALL_THE_QGL_VERSION_OF_glEnableClientState -#define glEnd CALL_THE_QGL_VERSION_OF_glEnd -#define glEndList CALL_THE_QGL_VERSION_OF_glEndList -#define glEvalCoord1d CALL_THE_QGL_VERSION_OF_glEvalCoord1d -#define glEvalCoord1dv CALL_THE_QGL_VERSION_OF_glEvalCoord1dv -#define glEvalCoord1f CALL_THE_QGL_VERSION_OF_glEvalCoord1f -#define glEvalCoord1fv CALL_THE_QGL_VERSION_OF_glEvalCoord1fv -#define glEvalCoord2d CALL_THE_QGL_VERSION_OF_glEvalCoord2d -#define glEvalCoord2dv CALL_THE_QGL_VERSION_OF_glEvalCoord2dv -#define glEvalCoord2f CALL_THE_QGL_VERSION_OF_glEvalCoord2f -#define glEvalCoord2fv CALL_THE_QGL_VERSION_OF_glEvalCoord2fv -#define glEvalMesh1 CALL_THE_QGL_VERSION_OF_glEvalMesh1 -#define glEvalMesh2 CALL_THE_QGL_VERSION_OF_glEvalMesh2 -#define glEvalPoint1 CALL_THE_QGL_VERSION_OF_glEvalPoint1 -#define glEvalPoint2 CALL_THE_QGL_VERSION_OF_glEvalPoint2 -#define glFeedbackBuffer CALL_THE_QGL_VERSION_OF_glFeedbackBuffer -#define glFinish CALL_THE_QGL_VERSION_OF_glFinish -#define glFlush CALL_THE_QGL_VERSION_OF_glFlush -#define glFogf CALL_THE_QGL_VERSION_OF_glFogf -#define glFogfv CALL_THE_QGL_VERSION_OF_glFogfv -#define glFogi CALL_THE_QGL_VERSION_OF_glFogi -#define glFogiv CALL_THE_QGL_VERSION_OF_glFogiv -#define glFrontFace CALL_THE_QGL_VERSION_OF_glFrontFace -#define glFrustum CALL_THE_QGL_VERSION_OF_glFrustum -#define glGenLists CALL_THE_QGL_VERSION_OF_glGenLists -#define glGenTextures CALL_THE_QGL_VERSION_OF_glGenTextures -#define glGetBooleanv CALL_THE_QGL_VERSION_OF_glGetBooleanv -#define glGetClipPlane CALL_THE_QGL_VERSION_OF_glGetClipPlane -#define glGetDoublev CALL_THE_QGL_VERSION_OF_glGetDoublev -#define glGetError CALL_THE_QGL_VERSION_OF_glGetError -#define glGetFloatv CALL_THE_QGL_VERSION_OF_glGetFloatv -#define glGetIntegerv CALL_THE_QGL_VERSION_OF_glGetIntegerv -#define glGetLightfv CALL_THE_QGL_VERSION_OF_glGetLightfv -#define glGetLightiv CALL_THE_QGL_VERSION_OF_glGetLightiv -#define glGetMapdv CALL_THE_QGL_VERSION_OF_glGetMapdv -#define glGetMapfv CALL_THE_QGL_VERSION_OF_glGetMapfv -#define glGetMapiv CALL_THE_QGL_VERSION_OF_glGetMapiv -#define glGetMaterialfv CALL_THE_QGL_VERSION_OF_glGetMaterialfv -#define glGetMaterialiv CALL_THE_QGL_VERSION_OF_glGetMaterialiv -#define glGetPixelMapfv CALL_THE_QGL_VERSION_OF_glGetPixelMapfv -#define glGetPixelMapuiv CALL_THE_QGL_VERSION_OF_glGetPixelMapuiv -#define glGetPixelMapusv CALL_THE_QGL_VERSION_OF_glGetPixelMapusv -#define glGetPointerv CALL_THE_QGL_VERSION_OF_glGetPointerv -#define glGetPolygonStipple CALL_THE_QGL_VERSION_OF_glGetPolygonStipple -#define glGetString CALL_THE_QGL_VERSION_OF_glGetString -#define glGetTexEnvfv CALL_THE_QGL_VERSION_OF_glGetTexEnvfv -#define glGetTexEnviv CALL_THE_QGL_VERSION_OF_glGetTexEnviv -#define glGetTexGendv CALL_THE_QGL_VERSION_OF_glGetTexGendv -#define glGetTexGenfv CALL_THE_QGL_VERSION_OF_glGetTexGenfv -#define glGetTexGeniv CALL_THE_QGL_VERSION_OF_glGetTexGeniv -#define glGetTexImage CALL_THE_QGL_VERSION_OF_glGetTexImage -#define glGetTexLevelParameterfv CALL_THE_QGL_VERSION_OF_glGetTexLevelParameterfv -#define glGetTexLevelParameteriv CALL_THE_QGL_VERSION_OF_glGetTexLevelParameteriv -#define glGetTexParameterfv CALL_THE_QGL_VERSION_OF_glGetTexParameterfv -#define glGetTexParameteriv CALL_THE_QGL_VERSION_OF_glGetTexParameteriv -#define glHint CALL_THE_QGL_VERSION_OF_glHint -#define glIndexMask CALL_THE_QGL_VERSION_OF_glIndexMask -#define glIndexPointer CALL_THE_QGL_VERSION_OF_glIndexPointer -#define glIndexd CALL_THE_QGL_VERSION_OF_glIndexd -#define glIndexdv CALL_THE_QGL_VERSION_OF_glIndexdv -#define glIndexf CALL_THE_QGL_VERSION_OF_glIndexf -#define glIndexfv CALL_THE_QGL_VERSION_OF_glIndexfv -#define glIndexi CALL_THE_QGL_VERSION_OF_glIndexi -#define glIndexiv CALL_THE_QGL_VERSION_OF_glIndexiv -#define glIndexs CALL_THE_QGL_VERSION_OF_glIndexs -#define glIndexsv CALL_THE_QGL_VERSION_OF_glIndexsv -#define glIndexub CALL_THE_QGL_VERSION_OF_glIndexub -#define glIndexubv CALL_THE_QGL_VERSION_OF_glIndexubv -#define glInitNames CALL_THE_QGL_VERSION_OF_glInitNames -#define glInterleavedArrays CALL_THE_QGL_VERSION_OF_glInterleavedArrays -#define glIsEnabled CALL_THE_QGL_VERSION_OF_glIsEnabled -#define glIsList CALL_THE_QGL_VERSION_OF_glIsList -#define glIsTexture CALL_THE_QGL_VERSION_OF_glIsTexture -#define glLightModelf CALL_THE_QGL_VERSION_OF_glLightModelf -#define glLightModelfv CALL_THE_QGL_VERSION_OF_glLightModelfv -#define glLightModeli CALL_THE_QGL_VERSION_OF_glLightModeli -#define glLightModeliv CALL_THE_QGL_VERSION_OF_glLightModeliv -#define glLightf CALL_THE_QGL_VERSION_OF_glLightf -#define glLightfv CALL_THE_QGL_VERSION_OF_glLightfv -#define glLighti CALL_THE_QGL_VERSION_OF_glLighti -#define glLightiv CALL_THE_QGL_VERSION_OF_glLightiv -#define glLineStipple CALL_THE_QGL_VERSION_OF_glLineStipple -#define glLineWidth CALL_THE_QGL_VERSION_OF_glLineWidth -#define glListBase CALL_THE_QGL_VERSION_OF_glListBase -#define glLoadIdentity CALL_THE_QGL_VERSION_OF_glLoadIdentity -#define glLoadMatrixd CALL_THE_QGL_VERSION_OF_glLoadMatrixd -#define glLoadMatrixf CALL_THE_QGL_VERSION_OF_glLoadMatrixf -#define glLoadName CALL_THE_QGL_VERSION_OF_glLoadName -#define glLogicOp CALL_THE_QGL_VERSION_OF_glLogicOp -#define glMap1d CALL_THE_QGL_VERSION_OF_glMap1d -#define glMap1f CALL_THE_QGL_VERSION_OF_glMap1f -#define glMap2d CALL_THE_QGL_VERSION_OF_glMap2d -#define glMap2f CALL_THE_QGL_VERSION_OF_glMap2f -#define glMapGrid1d CALL_THE_QGL_VERSION_OF_glMapGrid1d -#define glMapGrid1f CALL_THE_QGL_VERSION_OF_glMapGrid1f -#define glMapGrid2d CALL_THE_QGL_VERSION_OF_glMapGrid2d -#define glMapGrid2f CALL_THE_QGL_VERSION_OF_glMapGrid2f -#define glMaterialf CALL_THE_QGL_VERSION_OF_glMaterialf -#define glMaterialfv CALL_THE_QGL_VERSION_OF_glMaterialfv -#define glMateriali CALL_THE_QGL_VERSION_OF_glMateriali -#define glMaterialiv CALL_THE_QGL_VERSION_OF_glMaterialiv -#define glMatrixMode CALL_THE_QGL_VERSION_OF_glMatrixMode -#define glMultMatrixd CALL_THE_QGL_VERSION_OF_glMultMatrixd -#define glMultMatrixf CALL_THE_QGL_VERSION_OF_glMultMatrixf -#define glNewList CALL_THE_QGL_VERSION_OF_glNewList -#define glNormal3b CALL_THE_QGL_VERSION_OF_glNormal3b -#define glNormal3bv CALL_THE_QGL_VERSION_OF_glNormal3bv -#define glNormal3d CALL_THE_QGL_VERSION_OF_glNormal3d -#define glNormal3dv CALL_THE_QGL_VERSION_OF_glNormal3dv -#define glNormal3f CALL_THE_QGL_VERSION_OF_glNormal3f -#define glNormal3fv CALL_THE_QGL_VERSION_OF_glNormal3fv -#define glNormal3i CALL_THE_QGL_VERSION_OF_glNormal3i -#define glNormal3iv CALL_THE_QGL_VERSION_OF_glNormal3iv -#define glNormal3s CALL_THE_QGL_VERSION_OF_glNormal3s -#define glNormal3sv CALL_THE_QGL_VERSION_OF_glNormal3sv -#define glNormalPointer CALL_THE_QGL_VERSION_OF_glNormalPointer -#define glOrtho CALL_THE_QGL_VERSION_OF_glOrtho -#define glPassThrough CALL_THE_QGL_VERSION_OF_glPassThrough -#define glPixelMapfv CALL_THE_QGL_VERSION_OF_glPixelMapfv -#define glPixelMapuiv CALL_THE_QGL_VERSION_OF_glPixelMapuiv -#define glPixelMapusv CALL_THE_QGL_VERSION_OF_glPixelMapusv -#define glPixelStoref CALL_THE_QGL_VERSION_OF_glPixelStoref -#define glPixelStorei CALL_THE_QGL_VERSION_OF_glPixelStorei -#define glPixelTransferf CALL_THE_QGL_VERSION_OF_glPixelTransferf -#define glPixelTransferi CALL_THE_QGL_VERSION_OF_glPixelTransferi -#define glPixelZoom CALL_THE_QGL_VERSION_OF_glPixelZoom -#define glPointSize CALL_THE_QGL_VERSION_OF_glPointSize -#define glPolygonMode CALL_THE_QGL_VERSION_OF_glPolygonMode -#define glPolygonOffset CALL_THE_QGL_VERSION_OF_glPolygonOffset -#define glPolygonStipple CALL_THE_QGL_VERSION_OF_glPolygonStipple -#define glPopAttrib CALL_THE_QGL_VERSION_OF_glPopAttrib -#define glPopClientAttrib CALL_THE_QGL_VERSION_OF_glPopClientAttrib -#define glPopMatrix CALL_THE_QGL_VERSION_OF_glPopMatrix -#define glPopName CALL_THE_QGL_VERSION_OF_glPopName -#define glPrioritizeTextures CALL_THE_QGL_VERSION_OF_glPrioritizeTextures -#define glPushAttrib CALL_THE_QGL_VERSION_OF_glPushAttrib -#define glPushClientAttrib CALL_THE_QGL_VERSION_OF_glPushClientAttrib -#define glPushMatrix CALL_THE_QGL_VERSION_OF_glPushMatrix -#define glPushName CALL_THE_QGL_VERSION_OF_glPushName -#define glRasterPos2d CALL_THE_QGL_VERSION_OF_glRasterPos2d -#define glRasterPos2dv CALL_THE_QGL_VERSION_OF_glRasterPos2dv -#define glRasterPos2f CALL_THE_QGL_VERSION_OF_glRasterPos2f -#define glRasterPos2fv CALL_THE_QGL_VERSION_OF_glRasterPos2fv -#define glRasterPos2i CALL_THE_QGL_VERSION_OF_glRasterPos2i -#define glRasterPos2iv CALL_THE_QGL_VERSION_OF_glRasterPos2iv -#define glRasterPos2s CALL_THE_QGL_VERSION_OF_glRasterPos2s -#define glRasterPos2sv CALL_THE_QGL_VERSION_OF_glRasterPos2sv -#define glRasterPos3d CALL_THE_QGL_VERSION_OF_glRasterPos3d -#define glRasterPos3dv CALL_THE_QGL_VERSION_OF_glRasterPos3dv -#define glRasterPos3f CALL_THE_QGL_VERSION_OF_glRasterPos3f -#define glRasterPos3fv CALL_THE_QGL_VERSION_OF_glRasterPos3fv -#define glRasterPos3i CALL_THE_QGL_VERSION_OF_glRasterPos3i -#define glRasterPos3iv CALL_THE_QGL_VERSION_OF_glRasterPos3iv -#define glRasterPos3s CALL_THE_QGL_VERSION_OF_glRasterPos3s -#define glRasterPos3sv CALL_THE_QGL_VERSION_OF_glRasterPos3sv -#define glRasterPos4d CALL_THE_QGL_VERSION_OF_glRasterPos4d -#define glRasterPos4dv CALL_THE_QGL_VERSION_OF_glRasterPos4dv -#define glRasterPos4f CALL_THE_QGL_VERSION_OF_glRasterPos4f -#define glRasterPos4fv CALL_THE_QGL_VERSION_OF_glRasterPos4fv -#define glRasterPos4i CALL_THE_QGL_VERSION_OF_glRasterPos4i -#define glRasterPos4iv CALL_THE_QGL_VERSION_OF_glRasterPos4iv -#define glRasterPos4s CALL_THE_QGL_VERSION_OF_glRasterPos4s -#define glRasterPos4sv CALL_THE_QGL_VERSION_OF_glRasterPos4sv -#define glReadBuffer CALL_THE_QGL_VERSION_OF_glReadBuffer -#define glReadPixels CALL_THE_QGL_VERSION_OF_glReadPixels -#define glRectd CALL_THE_QGL_VERSION_OF_glRectd -#define glRectdv CALL_THE_QGL_VERSION_OF_glRectdv -#define glRectf CALL_THE_QGL_VERSION_OF_glRectf -#define glRectfv CALL_THE_QGL_VERSION_OF_glRectfv -#define glRecti CALL_THE_QGL_VERSION_OF_glRecti -#define glRectiv CALL_THE_QGL_VERSION_OF_glRectiv -#define glRects CALL_THE_QGL_VERSION_OF_glRects -#define glRectsv CALL_THE_QGL_VERSION_OF_glRectsv -#define glRenderMode CALL_THE_QGL_VERSION_OF_glRenderMode -#define glRotated CALL_THE_QGL_VERSION_OF_glRotated -#define glRotatef CALL_THE_QGL_VERSION_OF_glRotatef -#define glScaled CALL_THE_QGL_VERSION_OF_glScaled -#define glScalef CALL_THE_QGL_VERSION_OF_glScalef -#define glScissor CALL_THE_QGL_VERSION_OF_glScissor -#define glSelectBuffer CALL_THE_QGL_VERSION_OF_glSelectBuffer -#define glShadeModel CALL_THE_QGL_VERSION_OF_glShadeModel -#define glStencilFunc CALL_THE_QGL_VERSION_OF_glStencilFunc -#define glStencilMask CALL_THE_QGL_VERSION_OF_glStencilMask -#define glStencilOp CALL_THE_QGL_VERSION_OF_glStencilOp -#define glTexCoord1d CALL_THE_QGL_VERSION_OF_glTexCoord1d -#define glTexCoord1dv CALL_THE_QGL_VERSION_OF_glTexCoord1dv -#define glTexCoord1f CALL_THE_QGL_VERSION_OF_glTexCoord1f -#define glTexCoord1fv CALL_THE_QGL_VERSION_OF_glTexCoord1fv -#define glTexCoord1i CALL_THE_QGL_VERSION_OF_glTexCoord1i -#define glTexCoord1iv CALL_THE_QGL_VERSION_OF_glTexCoord1iv -#define glTexCoord1s CALL_THE_QGL_VERSION_OF_glTexCoord1s -#define glTexCoord1sv CALL_THE_QGL_VERSION_OF_glTexCoord1sv -#define glTexCoord2d CALL_THE_QGL_VERSION_OF_glTexCoord2d -#define glTexCoord2dv CALL_THE_QGL_VERSION_OF_glTexCoord2dv -#define glTexCoord2f CALL_THE_QGL_VERSION_OF_glTexCoord2f -#define glTexCoord2fv CALL_THE_QGL_VERSION_OF_glTexCoord2fv -#define glTexCoord2i CALL_THE_QGL_VERSION_OF_glTexCoord2i -#define glTexCoord2iv CALL_THE_QGL_VERSION_OF_glTexCoord2iv -#define glTexCoord2s CALL_THE_QGL_VERSION_OF_glTexCoord2s -#define glTexCoord2sv CALL_THE_QGL_VERSION_OF_glTexCoord2sv -#define glTexCoord3d CALL_THE_QGL_VERSION_OF_glTexCoord3d -#define glTexCoord3dv CALL_THE_QGL_VERSION_OF_glTexCoord3dv -#define glTexCoord3f CALL_THE_QGL_VERSION_OF_glTexCoord3f -#define glTexCoord3fv CALL_THE_QGL_VERSION_OF_glTexCoord3fv -#define glTexCoord3i CALL_THE_QGL_VERSION_OF_glTexCoord3i -#define glTexCoord3iv CALL_THE_QGL_VERSION_OF_glTexCoord3iv -#define glTexCoord3s CALL_THE_QGL_VERSION_OF_glTexCoord3s -#define glTexCoord3sv CALL_THE_QGL_VERSION_OF_glTexCoord3sv -#define glTexCoord4d CALL_THE_QGL_VERSION_OF_glTexCoord4d -#define glTexCoord4dv CALL_THE_QGL_VERSION_OF_glTexCoord4dv -#define glTexCoord4f CALL_THE_QGL_VERSION_OF_glTexCoord4f -#define glTexCoord4fv CALL_THE_QGL_VERSION_OF_glTexCoord4fv -#define glTexCoord4i CALL_THE_QGL_VERSION_OF_glTexCoord4i -#define glTexCoord4iv CALL_THE_QGL_VERSION_OF_glTexCoord4iv -#define glTexCoord4s CALL_THE_QGL_VERSION_OF_glTexCoord4s -#define glTexCoord4sv CALL_THE_QGL_VERSION_OF_glTexCoord4sv -#define glTexCoordPointer CALL_THE_QGL_VERSION_OF_glTexCoordPointer -#define glTexEnvf CALL_THE_QGL_VERSION_OF_glTexEnvf -#define glTexEnvfv CALL_THE_QGL_VERSION_OF_glTexEnvfv -#define glTexEnvi CALL_THE_QGL_VERSION_OF_glTexEnvi -#define glTexEnviv CALL_THE_QGL_VERSION_OF_glTexEnviv -#define glTexGend CALL_THE_QGL_VERSION_OF_glTexGend -#define glTexGendv CALL_THE_QGL_VERSION_OF_glTexGendv -#define glTexGenf CALL_THE_QGL_VERSION_OF_glTexGenf -#define glTexGenfv CALL_THE_QGL_VERSION_OF_glTexGenfv -#define glTexGeni CALL_THE_QGL_VERSION_OF_glTexGeni -#define glTexGeniv CALL_THE_QGL_VERSION_OF_glTexGeniv -#define glTexImage1D CALL_THE_QGL_VERSION_OF_glTexImage1D -#define glTexImage2D CALL_THE_QGL_VERSION_OF_glTexImage2D -#define glTexParameterf CALL_THE_QGL_VERSION_OF_glTexParameterf -#define glTexParameterfv CALL_THE_QGL_VERSION_OF_glTexParameterfv -#define glTexParameteri CALL_THE_QGL_VERSION_OF_glTexParameteri -#define glTexParameteriv CALL_THE_QGL_VERSION_OF_glTexParameteriv -#define glTexSubImage1D CALL_THE_QGL_VERSION_OF_glTexSubImage1D -#define glTexSubImage2D CALL_THE_QGL_VERSION_OF_glTexSubImage2D -#define glTranslated CALL_THE_QGL_VERSION_OF_glTranslated -#define glTranslatef CALL_THE_QGL_VERSION_OF_glTranslatef -#define glVertex2d CALL_THE_QGL_VERSION_OF_glVertex2d -#define glVertex2dv CALL_THE_QGL_VERSION_OF_glVertex2dv -#define glVertex2f CALL_THE_QGL_VERSION_OF_glVertex2f -#define glVertex2fv CALL_THE_QGL_VERSION_OF_glVertex2fv -#define glVertex2i CALL_THE_QGL_VERSION_OF_glVertex2i -#define glVertex2iv CALL_THE_QGL_VERSION_OF_glVertex2iv -#define glVertex2s CALL_THE_QGL_VERSION_OF_glVertex2s -#define glVertex2sv CALL_THE_QGL_VERSION_OF_glVertex2sv -#define glVertex3d CALL_THE_QGL_VERSION_OF_glVertex3d -#define glVertex3dv CALL_THE_QGL_VERSION_OF_glVertex3dv -#define glVertex3f CALL_THE_QGL_VERSION_OF_glVertex3f -#define glVertex3fv CALL_THE_QGL_VERSION_OF_glVertex3fv -#define glVertex3i CALL_THE_QGL_VERSION_OF_glVertex3i -#define glVertex3iv CALL_THE_QGL_VERSION_OF_glVertex3iv -#define glVertex3s CALL_THE_QGL_VERSION_OF_glVertex3s -#define glVertex3sv CALL_THE_QGL_VERSION_OF_glVertex3sv -#define glVertex4d CALL_THE_QGL_VERSION_OF_glVertex4d -#define glVertex4dv CALL_THE_QGL_VERSION_OF_glVertex4dv -#define glVertex4f CALL_THE_QGL_VERSION_OF_glVertex4f -#define glVertex4fv CALL_THE_QGL_VERSION_OF_glVertex4fv -#define glVertex4i CALL_THE_QGL_VERSION_OF_glVertex4i -#define glVertex4iv CALL_THE_QGL_VERSION_OF_glVertex4iv -#define glVertex4s CALL_THE_QGL_VERSION_OF_glVertex4s -#define glVertex4sv CALL_THE_QGL_VERSION_OF_glVertex4sv -#define glVertexPointer CALL_THE_QGL_VERSION_OF_glVertexPointer -#define glViewport CALL_THE_QGL_VERSION_OF_glViewport diff --git a/codemp/mp3code/cdct.c b/codemp/mp3code/cdct.c index 0dacf49ca9..7afb95f608 100644 --- a/codemp/mp3code/cdct.c +++ b/codemp/mp3code/cdct.c @@ -40,10 +40,6 @@ portable C #include #include -#ifdef _MSC_VER -#pragma warning ( disable : 4711 ) // function 'xxxx' selected for automatic inline expansion -#endif - float coef32[31]; /* 32 pt dct coefs */ // !!!!!!!!!!!!!!!!!! (only generated once (always to same value) /*------------------------------------------------------------*/ diff --git a/codemp/mp3code/config.h b/codemp/mp3code/config.h index 5c335ac9c9..36a2651766 100644 --- a/codemp/mp3code/config.h +++ b/codemp/mp3code/config.h @@ -48,8 +48,6 @@ ____________________________________________________________________________*/ #define __PDP_ENDIAN 3412 #define __BYTE_ORDER __LITTLE_ENDIAN #define usleep(x) ::Sleep(x/1000) -#define strcasecmp(a,b) Q_stricmp(a,b) -#define strncasecmp(a,b,c) Q_stricmpn(a,b,c) typedef int socklen_t; #endif diff --git a/codemp/mp3code/csbtb.c b/codemp/mp3code/csbtb.c index ffb99bb785..dfb401171c 100644 --- a/codemp/mp3code/csbtb.c +++ b/codemp/mp3code/csbtb.c @@ -1,7 +1,4 @@ #ifdef COMPILE_ME -#ifdef _MSC_VER -#pragma warning(disable:4206) // nonstandard extension used : translation unit is empty -#endif /*____________________________________________________________________________ FreeAmp - The Free MP3 Player diff --git a/codemp/mp3code/csbtl3.c b/codemp/mp3code/csbtl3.c index af70d70dc6..e63995c08e 100644 --- a/codemp/mp3code/csbtl3.c +++ b/codemp/mp3code/csbtl3.c @@ -1,7 +1,4 @@ #ifdef COMPILE_ME -#ifdef _MSC_VER -#pragma warning(disable:4206) // nonstandard extension used : translation unit is empty -#endif /*____________________________________________________________________________ FreeAmp - The Free MP3 Player diff --git a/codemp/mp3code/cup.c b/codemp/mp3code/cup.c index 3f584acba8..beaa54ffd3 100644 --- a/codemp/mp3code/cup.c +++ b/codemp/mp3code/cup.c @@ -99,11 +99,6 @@ IN_OUT structure returns: #include #include "mhead.h" /* mpeg header structure */ - -#ifdef _MSC_VER -#pragma warning(disable: 4709) -#endif - #include "mp3struct.h" diff --git a/codemp/mp3code/cupini.c b/codemp/mp3code/cupini.c index c33967e852..c014920b57 100644 --- a/codemp/mp3code/cupini.c +++ b/codemp/mp3code/cupini.c @@ -1,7 +1,4 @@ #ifdef COMPILE_ME -#ifdef _MSC_VER -#pragma warning(disable:4206) // nonstandard extension used : translation unit is empty -#endif /*____________________________________________________________________________ FreeAmp - The Free MP3 Player @@ -44,12 +41,6 @@ mod 11/15/95 for Layer I =========================================================*/ /*-- compiler bug, floating constant overflow w/ansi --*/ -#ifdef _MSC_VER -#pragma warning(disable:4056) -#endif - - - static const long steps[18] = { diff --git a/codemp/mp3code/cupl1.c b/codemp/mp3code/cupl1.c index 54d182312d..8d095e22b0 100644 --- a/codemp/mp3code/cupl1.c +++ b/codemp/mp3code/cupl1.c @@ -1,8 +1,4 @@ #ifdef COMPILE_ME -#ifdef _MSC_VER -#pragma warning(disable:4206) // nonstandard extension used : translation unit is empty -#pragma warning(disable:4711) // function 'xxxx' selected for automatic inline expansion -#endif /*____________________________________________________________________________ FreeAmp - The Free MP3 Player diff --git a/codemp/mp3code/cupl3.c b/codemp/mp3code/cupl3.c index 54aa27400b..d3562f9eb4 100644 --- a/codemp/mp3code/cupl3.c +++ b/codemp/mp3code/cupl3.c @@ -59,6 +59,10 @@ TO DO: Test mixed blocks (mixed long/short) #include "mp3struct.h" +#if !defined(min) +# define min(a, b) ((a) < (b) ? (a) : (b)) +#endif + /*====================================================================*/ static const int mp_sr20_table[2][4] = {{441, 480, 320, -999}, {882, 960, 640, -999}}; diff --git a/codemp/mp3code/cwin.c b/codemp/mp3code/cwin.c index 8366d5856f..b1714055de 100644 --- a/codemp/mp3code/cwin.c +++ b/codemp/mp3code/cwin.c @@ -1,7 +1,4 @@ #ifdef COMPILE_ME -#ifdef _MSC_VER -#pragma warning(disable:4206) // nonstandard extension used : translation unit is empty -#endif /*____________________________________________________________________________ FreeAmp - The Free MP3 Player @@ -70,7 +67,7 @@ void window(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; } /*-- special case --*/ sum = 0.0F; @@ -84,7 +81,7 @@ void window(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; /*-- last 15 --*/ coef = wincoef + 255; /* back pass through coefs */ for (i = 0; i < 15; i++) @@ -104,7 +101,7 @@ void window(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; } } @@ -141,7 +138,7 @@ void window_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; } /*-- special case --*/ @@ -156,7 +153,7 @@ void window_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; /*-- last 15 --*/ coef = wincoef + 255; /* back pass through coefs */ @@ -177,7 +174,7 @@ void window_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; } } @@ -214,7 +211,7 @@ void window16(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; } /*-- special case --*/ sum = 0.0F; @@ -228,7 +225,7 @@ void window16(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; /*-- last 7 --*/ coef = wincoef + 255; /* back pass through coefs */ for (i = 0; i < 7; i++) @@ -249,7 +246,7 @@ void window16(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; } } /*--------------- 16 pt dual window (interleaved output) -----------------*/ @@ -284,7 +281,7 @@ void window16_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; } /*-- special case --*/ @@ -299,7 +296,7 @@ void window16_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; /*-- last 7 --*/ coef = wincoef + 255; /* back pass through coefs */ @@ -321,7 +318,7 @@ void window16_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; } } @@ -357,7 +354,7 @@ void window8(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; } /*-- special case --*/ sum = 0.0F; @@ -371,7 +368,7 @@ void window8(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; /*-- last 3 --*/ coef = wincoef + 255; /* back pass through coefs */ for (i = 0; i < 3; i++) @@ -392,7 +389,7 @@ void window8(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm++ = tmp; + *pcm++ = (short)tmp; } } /*--------------- 8 pt dual window (interleaved output) -----------------*/ @@ -427,7 +424,7 @@ void window8_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; } /*-- special case --*/ @@ -442,7 +439,7 @@ void window8_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; /*-- last 3 --*/ coef = wincoef + 255; /* back pass through coefs */ @@ -464,7 +461,7 @@ void window8_dual(float *vbuf, int vb_ptr, short *pcm) tmp = 32767; else if (tmp < -32768) tmp = -32768; - *pcm = tmp; + *pcm = (short)tmp; pcm += 2; } } diff --git a/codemp/mp3code/cwinb.c b/codemp/mp3code/cwinb.c index 9e95f739f2..2b78f1e43b 100644 --- a/codemp/mp3code/cwinb.c +++ b/codemp/mp3code/cwinb.c @@ -1,7 +1,4 @@ #ifdef COMPILE_ME -#ifdef _MSC_VER -#pragma warning(disable:4206) // nonstandard extension used : translation unit is empty -#endif /*____________________________________________________________________________ FreeAmp - The Free MP3 Player diff --git a/codemp/mp3code/cwinm.c b/codemp/mp3code/cwinm.c index 25b51b8f2f..d1a292e11f 100644 --- a/codemp/mp3code/cwinm.c +++ b/codemp/mp3code/cwinm.c @@ -37,12 +37,6 @@ portable C #include #include - -/* disable precision loss warning on type conversion */ -#ifdef _MSC_VER -#pragma warning(disable:4244 4056) -#endif - const float wincoef[264] = { /* window coefs */ #include "tableawd.h" diff --git a/codemp/mp3code/jdw.h b/codemp/mp3code/jdw.h index 553c3d17b8..61dedca465 100644 --- a/codemp/mp3code/jdw.h +++ b/codemp/mp3code/jdw.h @@ -20,9 +20,3 @@ $Id: jdw.h,v 1.2 1999/10/19 07:13:08 elrod Exp $ ____________________________________________________________________________*/ - -/* LOL */ - -#ifndef min -#define min(a,b) ((a>b)?b:a) -#endif diff --git a/codemp/mp3code/l3.h b/codemp/mp3code/l3.h index 0f650a7312..f1f1e1df37 100644 --- a/codemp/mp3code/l3.h +++ b/codemp/mp3code/l3.h @@ -37,41 +37,15 @@ ____________________________________________________________________________*/ #include "config.h" +#include "qcommon/q_platform.h" + #define GLOBAL_GAIN_SCALE (4*15) /* #define GLOBAL_GAIN_SCALE 0 */ -#ifdef _WIN32 -#if (defined _M_IX86 || defined __i386__) -#define LITTLE_ENDIAN 1 -#endif - -#if (defined _M_X64 || defined _WIN64 || defined __WIN64__ || defined __x86_64__) -#define LITTLE_ENDIAN 1 -#endif - -#ifdef _M_ALPHA -#define LITTLE_ENDIAN 1 -#endif - -#ifdef sparc -#define LITTLE_ENDIAN 0 -#endif - -#if defined(__POWERPC__) -#define LITTLE_ENDIAN 0 -#elif defined(__INTEL__) -#define LITTLE_ENDIAN 1 -#endif -#endif - -#ifndef LITTLE_ENDIAN -#error Layer III LITTLE_ENDIAN must be defined 0 or 1 -#endif - /*-----------------------------------------------------------*/ /*---- huffman lookup tables ---*/ /* endian dependent !!! */ -#if LITTLE_ENDIAN +#ifdef Q3_LITTLE_ENDIAN typedef union { int ptr; diff --git a/codemp/mp3code/l3dq.c b/codemp/mp3code/l3dq.c index 489bf5956c..a5a56d3bc6 100644 --- a/codemp/mp3code/l3dq.c +++ b/codemp/mp3code/l3dq.c @@ -111,10 +111,6 @@ float *quant_init_subblock_addr() } /*=============================================================*/ -#ifdef _MSC_VER -#pragma warning(disable: 4056) -#endif - void dequant(SAMPLE Sample[], int *nsamp, SCALEFACT * sf, GR * gr, @@ -255,8 +251,4 @@ block type = 2 short blocks return; } -#ifdef _MSC_VER -#pragma warning(default: 4056) -#endif - /*-------------------------------------------------------------*/ diff --git a/codemp/mp3code/l3init.c b/codemp/mp3code/l3init.c index 94279b2c93..174bb39deb 100644 --- a/codemp/mp3code/l3init.c +++ b/codemp/mp3code/l3init.c @@ -36,12 +36,6 @@ ____________________________________________________________________________*/ #include #include "l3.h" -/* get rid of precision loss warnings on conversion */ -#ifdef _MSC_VER -#pragma warning(disable:4244 4056) -#endif - - /*---------- quant ---------------------------------*/ /* 8 bit lookup x = pow(2.0, 0.25*(global_gain-210)) */ float *quant_init_global_addr(); @@ -257,7 +251,7 @@ void imdct_init() for (p = 0; p < n; p++) w[p] = (float) (2.0 * cos(t * (2 * p + 1))); for (p = 0; p < 9; p++) - w2[p] = (float) 2.0 *cos(2 * t * (2 * p + 1)); + w2[p] = (float) (2.0 *cos(2 * t * (2 * p + 1))); t = pi / (2 * n); for (k = 0; k < 9; k++) @@ -276,10 +270,10 @@ void imdct_init() pi = 4.0 * atan(1.0); t = pi / (4 * n); for (p = 0; p < n; p++) - v[p] = (float) 2.0 *cos(t * (2 * p + 1)); + v[p] = (float) (2.0 *cos(t * (2 * p + 1))); for (p = 0; p < 3; p++) - v2[p] = (float) 2.0 *cos(2 * t * (2 * p + 1)); + v2[p] = (float) (2.0 *cos(2 * t * (2 * p + 1))); t = pi / (2 * n); k = 1; @@ -288,7 +282,7 @@ void imdct_init() /* adjust scaling to save a few mults */ for (p = 0; p < 6; p++) v[p] = v[p] / 2.0f; - *coef87 = (float) 2.0 *(*coef87); + *coef87 = (float) (2.0 *(*coef87)); } } diff --git a/codemp/mp3code/mhead.h b/codemp/mp3code/mhead.h index c3846de86e..6ee9871d15 100644 --- a/codemp/mp3code/mhead.h +++ b/codemp/mp3code/mhead.h @@ -96,9 +96,4 @@ extern "C" } #endif -#ifdef _MSC_VER -#pragma warning(disable:4711) // function 'xxxx' selected for automatic inline expansion -#endif - #endif // #ifndef MHEAD_H - diff --git a/codemp/mp3code/mp3struct.h b/codemp/mp3code/mp3struct.h index 090aa5bdc1..63c1837d04 100644 --- a/codemp/mp3code/mp3struct.h +++ b/codemp/mp3code/mp3struct.h @@ -6,10 +6,6 @@ #ifndef MP3STRUCT_H #define MP3STRUCT_H -#ifdef _MSC_VER -#pragma warning (disable : 4201 ) // nonstandard extension used : nameless struct/union -#endif - #include "small_header.h" // for SAMPLE and IN_OUT #include "qcommon/q_shared.h" @@ -134,11 +130,6 @@ typedef struct extern LP_MP3STREAM pMP3Stream; extern int bFastEstimateOnly; -#ifdef _MSC_VER -#pragma warning (default : 4201 ) // nonstandard extension used : nameless struct/union -#pragma warning (disable : 4711 ) // function 'xxxx' selected for automatic inline expansion -#endif - #endif // #ifndef MP3STRUCT_H ////////////////// eof ///////////////////// diff --git a/codemp/mp3code/uph.c b/codemp/mp3code/uph.c index 14eb124b6f..aec373f8cb 100644 --- a/codemp/mp3code/uph.c +++ b/codemp/mp3code/uph.c @@ -38,13 +38,6 @@ Layer 3 audio #include "l3.h" -#ifdef _MSC_VER -#pragma warning ( disable : 4711 ) // function 'xxxx' selected for automatic inline expansion - - -#pragma warning(disable: 4505) -#endif - /*===============================================================*/ /* max bits required for any lookup - change if htable changes */ diff --git a/codemp/mp3code/wavep.c b/codemp/mp3code/wavep.c index 23f4596b0c..b82073ee8f 100644 --- a/codemp/mp3code/wavep.c +++ b/codemp/mp3code/wavep.c @@ -1,7 +1,4 @@ #if 0 -#ifdef _MSC_VER -#pragma warning(disable:4206) // nonstandard extension used : translation unit is empty -#endif /*____________________________________________________________________________ FreeAmp - The Free MP3 Player diff --git a/codemp/null/null_client.cpp b/codemp/null/null_client.cpp index 4340ef6228..a0bafab5fa 100644 --- a/codemp/null/null_client.cpp +++ b/codemp/null/null_client.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "qcommon/qcommon.h" cvar_t *cl_shownet; diff --git a/codemp/null/null_input.cpp b/codemp/null/null_input.cpp index 2b80cf77b8..855d915650 100644 --- a/codemp/null/null_input.cpp +++ b/codemp/null/null_input.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ void IN_Init( void ) { } diff --git a/codemp/null/null_renderer.cpp b/codemp/null/null_renderer.cpp index f216809dc2..0e825399ab 100644 --- a/codemp/null/null_renderer.cpp +++ b/codemp/null/null_renderer.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + /* Null renderer functions */ void RB_StageIteratorGeneric(void) diff --git a/codemp/null/null_snddma.cpp b/codemp/null/null_snddma.cpp index 28fdafa29c..a13533e35b 100644 --- a/codemp/null/null_snddma.cpp +++ b/codemp/null/null_snddma.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // snddma_null.c // all other sound mixing is portable diff --git a/codemp/qcommon/GenericParser2.cpp b/codemp/qcommon/GenericParser2.cpp index 77be05fc7e..37f7916bf4 100644 --- a/codemp/qcommon/GenericParser2.cpp +++ b/codemp/qcommon/GenericParser2.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "GenericParser2.h" #include @@ -154,9 +176,6 @@ static char *GetToken(char **text, bool allowLineBreaks, bool readUntilEOL = fal return token; } - - - CTextPool::CTextPool(int initSize) : mNext(0), mSize(initSize), diff --git a/codemp/qcommon/GenericParser2.h b/codemp/qcommon/GenericParser2.h index ca8ca58c26..250f866eeb 100644 --- a/codemp/qcommon/GenericParser2.h +++ b/codemp/qcommon/GenericParser2.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #ifdef DEBUG_LINKING @@ -48,6 +70,7 @@ class CGPObject public: CGPObject(const char *initName); + virtual ~CGPObject( void ) {} const char *GetName(void) { return mName; } diff --git a/codemp/qcommon/MiniHeap.h b/codemp/qcommon/MiniHeap.h index 7b65353a77..5f4a9959a1 100644 --- a/codemp/qcommon/MiniHeap.h +++ b/codemp/qcommon/MiniHeap.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "../qcommon/q_shared.h" diff --git a/codemp/qcommon/RoffSystem.cpp b/codemp/qcommon/RoffSystem.cpp index b123cbaddb..a61e0e3334 100644 --- a/codemp/qcommon/RoffSystem.cpp +++ b/codemp/qcommon/RoffSystem.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "RoffSystem.h" #ifndef DEDICATED @@ -430,20 +453,12 @@ qboolean CROFFSystem::Unload( int id ) if ( itr != mROFFList.end() ) { // requested item found in the list, free mem, then remove from list - delete ((CROFF *)(*itr).second); + delete itr->second; -#ifdef _WIN32 - itr = mROFFList.erase( itr ); -#else - // darn stl differences - TROFFList::iterator titr; - titr = itr; - ++itr; - mROFFList.erase(titr); -#endif + mROFFList.erase( itr++ ); #ifdef _DEBUG - Com_Printf( S_COLOR_GREEN"roff unloaded\n" ); + Com_Printf( S_COLOR_GREEN "roff unloaded\n" ); #endif return qtrue; @@ -452,7 +467,7 @@ qboolean CROFFSystem::Unload( int id ) { // not found #ifdef _DEBUG - Com_Printf( S_COLOR_RED"unload failed: roff <%i> does not exist\n", id ); + Com_Printf( S_COLOR_RED "unload failed: roff <%i> does not exist\n", id ); #endif return qfalse; } @@ -609,18 +624,23 @@ qboolean CROFFSystem::List( int id ) //--------------------------------------------------------------------------- qboolean CROFFSystem::Play( int entID, int id, qboolean doTranslation, qboolean isClient ) { - sharedEntity_t *ent = SV_GentityNum( entID ); + sharedEntity_t *ent = NULL; - ent->r.mIsRoffing = qtrue; -/*rjr if(ent->GetPhysics() == PHYSICS_TYPE_NONE) + if ( !isClient ) { - ent->SetPhysics(PHYSICS_TYPE_BRUSHMODEL); - }*/ - //bjg TODO: reset this latter? + ent = SV_GentityNum( entID ); - if ( ent == 0 ) - { // shame on you.. - return qfalse; + if ( ent == NULL ) + { // shame on you.. + return qfalse; + } + ent->r.mIsRoffing = qtrue; + + /*rjr if(ent->GetPhysics() == PHYSICS_TYPE_NONE) + { + ent->SetPhysics(PHYSICS_TYPE_BRUSHMODEL); + }*/ + //bjg TODO: reset this latter? } SROFFEntity *roffing_ent = new SROFFEntity; @@ -634,7 +654,8 @@ qboolean CROFFSystem::Play( int entID, int id, qboolean doTranslation, qboolean roffing_ent->mTranslated = doTranslation; roffing_ent->mIsClient = isClient; - VectorCopy(ent->s.apos.trBase, roffing_ent->mStartAngles); + if ( !isClient ) + VectorCopy(ent->s.apos.trBase, roffing_ent->mStartAngles); mROFFEntList.push_back( roffing_ent ); @@ -839,8 +860,8 @@ qboolean CROFFSystem::ApplyROFF( SROFFEntity *roff_ent, CROFFSystem::CROFF *roff { vec3_t f, r, u, result; sharedEntity_t *ent = NULL; - trajectory_t *originTrajectory, *angleTrajectory; - float *origin, *angle; + trajectory_t *originTrajectory = NULL, *angleTrajectory = NULL; + float *origin = NULL, *angle = NULL; if ( svs.time < roff_ent->mNextROFFTime ) @@ -922,7 +943,8 @@ qboolean CROFFSystem::ApplyROFF( SROFFEntity *roff_ent, CROFFSystem::CROFF *roff roff_ent->mNextROFFTime = svs.time + roff->mFrameTime; //rww - npcs need to know when they're getting roff'd - ent->next_roff_time = roff_ent->mNextROFFTime; + if ( !roff_ent->mIsClient ) + ent->next_roff_time = roff_ent->mNextROFFTime; return qtrue; @@ -990,7 +1012,7 @@ void CROFFSystem::ProcessNote(SROFFEntity *roff_ent, char *note) //--------------------------------------------------------------------------- qboolean CROFFSystem::ClearLerp( SROFFEntity *roff_ent ) { - sharedEntity_t *ent; + sharedEntity_t *ent = NULL; trajectory_t *originTrajectory = NULL, *angleTrajectory = NULL; float *origin = NULL, *angle = NULL; diff --git a/codemp/qcommon/RoffSystem.h b/codemp/qcommon/RoffSystem.h index 2b86800625..23c1dd26a1 100644 --- a/codemp/qcommon/RoffSystem.h +++ b/codemp/qcommon/RoffSystem.h @@ -1,17 +1,32 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "qcommon/q_shared.h" //needs to be in here for entityState_t #include "server/server.h" -#ifdef _MSC_VER -#pragma warning (push, 3) //go back down to 3 for the stl include -#endif #include #include -#ifdef _MSC_VER -#pragma warning (pop) -#endif -using namespace std; // ROFF Defines //------------------- @@ -36,8 +51,8 @@ class CROFFSystem class CROFF; struct SROFFEntity; - typedef map TROFFList; - typedef vector TROFFEntList; + typedef std::map TROFFList; + typedef std::vector TROFFEntList; TROFFList mROFFList; // List of cached roffs int mID; // unique ID generator for new roff objects diff --git a/codemp/qcommon/cm_load.cpp b/codemp/qcommon/cm_load.cpp index 572e67fbd7..a3296f725a 100644 --- a/codemp/qcommon/cm_load.cpp +++ b/codemp/qcommon/cm_load.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cmodel.c -- model loading #include "cm_local.h" #include "qcommon/qfiles.h" @@ -432,7 +455,28 @@ void CMod_LoadBrushSides (lump_t *l, clipMap_t &cm) CMod_LoadEntityString ================= */ -void CMod_LoadEntityString( lump_t *l, clipMap_t &cm ) { +void CMod_LoadEntityString( lump_t *l, clipMap_t &cm, const char* name ) { + fileHandle_t h; + char entName[MAX_QPATH]; + + // Attempt to load entities from an external .ent file if available + Q_strncpyz(entName, name, sizeof(entName)); + const int entNameLen = strlen(entName); + entName[entNameLen - 3] = 'e'; + entName[entNameLen - 2] = 'n'; + entName[entNameLen - 1] = 't'; + const int iEntityFileLen = FS_FOpenFileRead(entName, &h, qfalse); + if (h) + { + cm.entityString = (char *)Hunk_Alloc(iEntityFileLen + 1, h_high); + cm.numEntityChars = iEntityFileLen + 1; + FS_Read(cm.entityString, iEntityFileLen, h); + FS_FCloseFile(h); + cm.entityString[iEntityFileLen] = '\0'; + Com_Printf("Loaded entities from %s\n", entName); + return; + } + cm.entityString = (char *)Hunk_Alloc( l->filelen, h_high ); cm.numEntityChars = l->filelen; Com_Memcpy (cm.entityString, cmod_base + l->fileofs, l->filelen); @@ -695,7 +739,7 @@ static void CM_LoadMap_Actual( const char *name, qboolean clientload, int *check CMod_LoadBrushes (&header.lumps[LUMP_BRUSHES], cm); CMod_LoadSubmodels (&header.lumps[LUMP_MODELS], cm); CMod_LoadNodes (&header.lumps[LUMP_NODES], cm); - CMod_LoadEntityString (&header.lumps[LUMP_ENTITIES], cm); + CMod_LoadEntityString (&header.lumps[LUMP_ENTITIES], cm, name); CMod_LoadVisibility( &header.lumps[LUMP_VISIBILITY], cm ); CMod_LoadPatches( &header.lumps[LUMP_SURFACES], &header.lumps[LUMP_DRAWVERTS], cm ); diff --git a/codemp/qcommon/cm_local.h b/codemp/qcommon/cm_local.h index 48fd1c9947..30f725ee50 100644 --- a/codemp/qcommon/cm_local.h +++ b/codemp/qcommon/cm_local.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "cm_polylib.h" diff --git a/codemp/qcommon/cm_patch.cpp b/codemp/qcommon/cm_patch.cpp index 0ca30ae5f6..cbb8074f73 100644 --- a/codemp/qcommon/cm_patch.cpp +++ b/codemp/qcommon/cm_patch.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "cm_local.h" #include "cm_patch.h" #include "qcommon/qcommon.h" @@ -391,8 +414,8 @@ static patchPlane_t planes[MAX_PATCH_PLANES]; //static facet_t facets[MAX_PATCH_PLANES]; //maybe MAX_FACETS ?? static facet_t *facets = NULL; -#define NORMAL_EPSILON 0.0001 -#define DIST_EPSILON 0.02 +#define NORMAL_EPSILON 0.00015 +#define DIST_EPSILON 0.0235 static inline int CM_PlaneEqual(patchPlane_t *p, float plane[4], int *flipped) { float invplane[4]; @@ -1371,7 +1394,7 @@ void CM_TraceThroughPatchCollide( traceWork_t *tw, trace_t &trace, const struct float offset, enterFrac, leaveFrac, t; patchPlane_t *planes; facet_t *facet; - float plane[4], bestplane[4]; + float plane[4] = { 0.0f }, bestplane[4] = { 0.0f }; vec3_t startp, endp; #ifndef BSPC static cvar_t *cv; diff --git a/codemp/qcommon/cm_patch.h b/codemp/qcommon/cm_patch.h index 065598bbf2..e0815e8df1 100644 --- a/codemp/qcommon/cm_patch.h +++ b/codemp/qcommon/cm_patch.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once //#define CULL_BBOX diff --git a/codemp/qcommon/cm_polylib.cpp b/codemp/qcommon/cm_polylib.cpp index 9ad689cb4d..89dc86cf2d 100644 --- a/codemp/qcommon/cm_polylib.cpp +++ b/codemp/qcommon/cm_polylib.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // this is only used for visualization tools in cm_ debug functions #include "cm_local.h" #include "qcommon/qcommon.h" diff --git a/codemp/qcommon/cm_polylib.h b/codemp/qcommon/cm_polylib.h index 09751365bf..cfb110f74f 100644 --- a/codemp/qcommon/cm_polylib.h +++ b/codemp/qcommon/cm_polylib.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "qcommon/q_shared.h" diff --git a/codemp/qcommon/cm_public.h b/codemp/qcommon/cm_public.h index 6d90cfd4fe..8d1be8cbfd 100644 --- a/codemp/qcommon/cm_public.h +++ b/codemp/qcommon/cm_public.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "qcommon/q_shared.h" diff --git a/codemp/qcommon/cm_test.cpp b/codemp/qcommon/cm_test.cpp index 734274b9a6..ab5fe36146 100644 --- a/codemp/qcommon/cm_test.cpp +++ b/codemp/qcommon/cm_test.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "cm_local.h" /* diff --git a/codemp/qcommon/cm_trace.cpp b/codemp/qcommon/cm_trace.cpp index 44e2e91556..2aa6bf432a 100644 --- a/codemp/qcommon/cm_trace.cpp +++ b/codemp/qcommon/cm_trace.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "cm_local.h" // always use bbox vs. bbox collision and never capsule vs. bbox or vice versa diff --git a/codemp/qcommon/cmd.cpp b/codemp/qcommon/cmd.cpp index e5a8bd07bc..0cfd50f4a9 100644 --- a/codemp/qcommon/cmd.cpp +++ b/codemp/qcommon/cmd.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cmd.c -- Quake script command processing module #include "qcommon/qcommon.h" diff --git a/codemp/qcommon/common.cpp b/codemp/qcommon/common.cpp index 55e15f9b39..46eaf15ab3 100644 --- a/codemp/qcommon/common.cpp +++ b/codemp/qcommon/common.cpp @@ -1,18 +1,43 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // common.c -- misc functions used in client and server #include "stringed_ingame.h" #include "qcommon/cm_public.h" #include "qcommon/game_version.h" #include "../server/NPCNav/navigator.h" - -#define MAXPRINTMSG 4096 +#if defined(_WIN32) +#define WIN32_LEAN_AND_MEAN +#include +#endif FILE *debuglogfile; fileHandle_t logfile; fileHandle_t com_journalFile; // events are written here fileHandle_t com_journalDataFile; // config files are written here -cvar_t *com_viewlog; cvar_t *com_speeds; cvar_t *com_developer; cvar_t *com_dedicated; @@ -39,9 +64,10 @@ cvar_t *com_bootlogo; cvar_t *cl_paused; cvar_t *sv_paused; cvar_t *com_cameraMode; -cvar_t *com_unfocused; -cvar_t *com_minimized; cvar_t *com_homepath; +#ifndef _WIN32 +cvar_t *com_ansiColor = NULL; +#endif cvar_t *com_affinity; @@ -218,7 +244,7 @@ Both client and server can use this, and it will do the appropriate things. ============= */ -void QDECL Com_Error( int code, const char *fmt, ... ) { +void NORETURN QDECL Com_Error( int code, const char *fmt, ... ) { va_list argptr; static int lastErrorTime; static int errorCount; @@ -235,6 +261,13 @@ void QDECL Com_Error( int code, const char *fmt, ... ) { code = ERR_FATAL; } + // ERR_DROPs on dedicated drop to an interactive console + // which doesn't make sense for dedicated as it's generally + // run unattended + if ( com_dedicated && com_dedicated->integer ) { + code = ERR_FATAL; + } + // if we are getting a solid stream of ERR_DROP, do an ERR_FATAL currentTime = Sys_Milliseconds(); if ( currentTime - lastErrorTime < 100 ) { @@ -663,12 +696,9 @@ journaled file =================================================================== */ -// bk001129 - here we go again: upped from 64 #define MAX_PUSHED_EVENTS 1024 -// bk001129 - init, also static static int com_pushedEventsHead = 0; static int com_pushedEventsTail = 0; -// bk001129 - static static sysEvent_t com_pushedEvents[MAX_PUSHED_EVENTS]; /* @@ -744,24 +774,21 @@ sysEvent_t Com_GetRealEvent( void ) { return ev; } - /* ================= Com_InitPushEvent ================= */ -// bk001129 - added void Com_InitPushEvent( void ) { - // clear the static buffer array - // this requires SE_NONE to be accepted as a valid but NOP event - memset( com_pushedEvents, 0, sizeof(com_pushedEvents) ); - // reset counters while we are at it - // beware: GetEvent might still return an SE_NONE from the buffer - com_pushedEventsHead = 0; - com_pushedEventsTail = 0; + // clear the static buffer array + // this requires SE_NONE to be accepted as a valid but NOP event + memset( com_pushedEvents, 0, sizeof(com_pushedEvents) ); + // reset counters while we are at it + // beware: GetEvent might still return an SE_NONE from the buffer + com_pushedEventsHead = 0; + com_pushedEventsTail = 0; } - /* ================= Com_PushEvent @@ -769,7 +796,7 @@ Com_PushEvent */ void Com_PushEvent( sysEvent_t *event ) { sysEvent_t *ev; - static int printedWarning = 0; // bk001129 - init, bk001204 - explicit int + static int printedWarning = 0; ev = &com_pushedEvents[ com_pushedEventsHead & (MAX_PUSHED_EVENTS-1) ]; @@ -869,7 +896,6 @@ int Com_EventLoop( void ) { switch ( ev.evType ) { default: - // bk001129 - was ev.evTime Com_Error( ERR_FATAL, "Com_EventLoop: bad event type %i", ev.evType ); break; case SE_NONE: @@ -970,7 +996,7 @@ Just throw a fatal error to test error shutdown procedures ============= */ -static void Com_Error_f (void) { +static void NORETURN Com_Error_f (void) { if ( Cmd_Argc() > 1 ) { Com_Error( ERR_DROP, "Testing drop error" ); } else { @@ -1014,8 +1040,10 @@ Com_Crash_f A way to force a bus error for development reasons ================= */ -static void Com_Crash_f( void ) { +static void NORETURN Com_Crash_f( void ) { * ( volatile int * ) 0 = 0x12345678; + /* that should crash already, but to reassure the compiler: */ + abort(); } /* @@ -1223,14 +1251,10 @@ void Com_Init( char *commandLine ) { com_showtrace = Cvar_Get ("com_showtrace", "0", CVAR_CHEAT); com_dropsim = Cvar_Get ("com_dropsim", "0", CVAR_CHEAT); - com_viewlog = Cvar_Get( "viewlog", "0", 0 ); com_speeds = Cvar_Get ("com_speeds", "0", 0); com_timedemo = Cvar_Get ("timedemo", "0", 0); com_cameraMode = Cvar_Get ("com_cameraMode", "0", CVAR_CHEAT); - com_unfocused = Cvar_Get( "com_unfocused", "0", CVAR_ROM ); - com_minimized = Cvar_Get( "com_minimized", "0", CVAR_ROM ); - com_optvehtrace = Cvar_Get("com_optvehtrace", "0", 0); cl_paused = Cvar_Get ("cl_paused", "0", CVAR_ROM); @@ -1238,6 +1262,9 @@ void Com_Init( char *commandLine ) { com_sv_running = Cvar_Get ("sv_running", "0", CVAR_ROM); com_cl_running = Cvar_Get ("cl_running", "0", CVAR_ROM); com_buildScript = Cvar_Get( "com_buildScript", "0", 0 ); +#ifndef _WIN32 + com_ansiColor = Cvar_Get( "com_ansiColor", "0", CVAR_ARCHIVE ); +#endif #ifdef G2_PERFORMANCE_ANALYSIS com_G2Report = Cvar_Get("com_G2Report", "0", 0); @@ -1247,12 +1274,6 @@ void Com_Init( char *commandLine ) { com_bootlogo = Cvar_Get( "com_bootlogo", "1", CVAR_ARCHIVE); - if ( com_dedicated->integer ) { - if ( !com_viewlog->integer ) { - Cvar_Set( "viewlog", "1" ); - } - } - s = va("%s %s %s", JK_VERSION_OLD, PLATFORM_STRING, __DATE__ ); com_version = Cvar_Get ("version", s, CVAR_ROM | CVAR_SERVERINFO ); @@ -1272,7 +1293,6 @@ void Com_Init( char *commandLine ) { com_dedicated->modified = qfalse; if ( !com_dedicated->integer ) { CL_Init(); - Sys_ShowConsole( com_viewlog->integer, qfalse ); } // set com_frameTime so that if a map is started on the @@ -1455,32 +1475,15 @@ void Com_Frame( void ) { int msec, minMsec; static int lastTime = 0; - int timeBeforeFirstEvents; - int timeBeforeServer; - int timeBeforeEvents; - int timeBeforeClient; - int timeAfter; - - - // bk001204 - init to zero. - // also: might be clobbered by `longjmp' or `vfork' - timeBeforeFirstEvents =0; - timeBeforeServer =0; - timeBeforeEvents =0; - timeBeforeClient = 0; - timeAfter = 0; + int timeBeforeFirstEvents = 0; + int timeBeforeServer = 0; + int timeBeforeEvents = 0; + int timeBeforeClient = 0; + int timeAfter = 0; // write config file if anything changed Com_WriteConfiguration(); - // if "viewlog" has been modified, show or hide the log console - if ( com_viewlog->modified ) { - if ( !com_dedicated->value ) { - Sys_ShowConsole( com_viewlog->integer, qfalse ); - } - com_viewlog->modified = qfalse; - } - // // main event loop // @@ -1528,11 +1531,9 @@ void Com_Frame( void ) { com_dedicated->modified = qfalse; if ( !com_dedicated->integer ) { CL_Init(); - Sys_ShowConsole( com_viewlog->integer, qfalse ); CL_StartHunkUsers(); //fire up the UI! } else { CL_Shutdown(); - Sys_ShowConsole( 1, qtrue ); } } @@ -1605,6 +1606,12 @@ void Com_Frame( void ) { c_pointcontents = 0; } + if ( com_affinity->modified ) + { + com_affinity->modified = qfalse; + Sys_SetProcessorAffinity(); + } + com_frameNumber++; } catch (int code) { @@ -1664,7 +1671,7 @@ Field_Clear ================== */ void Field_Clear( field_t *edit ) { - edit->buffer[0] = 0; + memset(edit->buffer, 0, MAX_EDIT_LINE); edit->cursor = 0; edit->scroll = 0; } @@ -1722,7 +1729,7 @@ PrintMatches */ static void PrintMatches( const char *s ) { if ( !Q_stricmpn( s, shortestMatch, strlen( shortestMatch ) ) ) { - Com_Printf( S_COLOR_GREY"Cmd "S_COLOR_WHITE"%s\n", s ); + Com_Printf( S_COLOR_GREY "Cmd " S_COLOR_WHITE "%s\n", s ); } } @@ -1736,7 +1743,7 @@ PrintArgMatches // This is here for if ever commands with other argument completion static void PrintArgMatches( const char *s ) { if ( !Q_stricmpn( s, shortestMatch, strlen( shortestMatch ) ) ) { - Com_Printf( S_COLOR_WHITE" %s\n", s ); + Com_Printf( S_COLOR_WHITE " %s\n", s ); } } #endif @@ -1750,7 +1757,7 @@ PrintKeyMatches */ static void PrintKeyMatches( const char *s ) { if ( !Q_stricmpn( s, shortestMatch, strlen( shortestMatch ) ) ) { - Com_Printf( S_COLOR_GREY"Key "S_COLOR_WHITE"%s\n", s ); + Com_Printf( S_COLOR_GREY "Key " S_COLOR_WHITE "%s\n", s ); } } #endif @@ -1763,7 +1770,7 @@ PrintFileMatches */ static void PrintFileMatches( const char *s ) { if ( !Q_stricmpn( s, shortestMatch, strlen( shortestMatch ) ) ) { - Com_Printf( S_COLOR_GREY"File "S_COLOR_WHITE"%s\n", s ); + Com_Printf( S_COLOR_GREY "File " S_COLOR_WHITE "%s\n", s ); } } @@ -1778,7 +1785,7 @@ static void PrintCvarMatches( const char *s ) { if ( !Q_stricmpn( s, shortestMatch, (int)strlen( shortestMatch ) ) ) { Com_TruncateLongString( value, Cvar_VariableString( s ) ); - Com_Printf( S_COLOR_GREY"Cvar "S_COLOR_WHITE"%s = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\""S_COLOR_WHITE"\n", s, value ); + Com_Printf( S_COLOR_GREY "Cvar " S_COLOR_WHITE "%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", s, value ); } } @@ -1956,3 +1963,44 @@ void Com_RandomBytes( byte *string, int len ) for( i = 0; i < len; i++ ) string[i] = (unsigned char)( rand() % 255 ); } + +/* +=============== +Converts a UTF-8 character to UTF-32. +=============== +*/ +uint32_t ConvertUTF8ToUTF32( char *utf8CurrentChar, char **utf8NextChar ) +{ + uint32_t utf32 = 0; + char *c = utf8CurrentChar; + + if( ( *c & 0x80 ) == 0 ) + utf32 = *c++; + else if( ( *c & 0xE0 ) == 0xC0 ) // 110x xxxx + { + utf32 |= ( *c++ & 0x1F ) << 6; + utf32 |= ( *c++ & 0x3F ); + } + else if( ( *c & 0xF0 ) == 0xE0 ) // 1110 xxxx + { + utf32 |= ( *c++ & 0x0F ) << 12; + utf32 |= ( *c++ & 0x3F ) << 6; + utf32 |= ( *c++ & 0x3F ); + } + else if( ( *c & 0xF8 ) == 0xF0 ) // 1111 0xxx + { + utf32 |= ( *c++ & 0x07 ) << 18; + utf32 |= ( *c++ & 0x3F ) << 12; + utf32 |= ( *c++ & 0x3F ) << 6; + utf32 |= ( *c++ & 0x3F ); + } + else + { + Com_DPrintf( "Unrecognised UTF-8 lead byte: 0x%x\n", (unsigned int)*c ); + c++; + } + + *utf8NextChar = c; + + return utf32; +} diff --git a/codemp/qcommon/cvar.cpp b/codemp/qcommon/cvar.cpp index a5dee7b8d6..1a648dbd4d 100644 --- a/codemp/qcommon/cvar.cpp +++ b/codemp/qcommon/cvar.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // cvar.c -- dynamic variable tracking #include @@ -461,19 +485,19 @@ Prints the value, default, and latched string of the given variable ============ */ void Cvar_Print( cvar_t *v ) { - Com_Printf( S_COLOR_GREY"Cvar "S_COLOR_WHITE"%s = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\""S_COLOR_WHITE, v->name, v->string ); + Com_Printf( S_COLOR_GREY "Cvar " S_COLOR_WHITE "%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE, v->name, v->string ); if ( !(v->flags & CVAR_ROM) ) { if ( !Q_stricmp( v->string, v->resetString ) ) - Com_Printf( ", "S_COLOR_WHITE"the default" ); + Com_Printf( ", " S_COLOR_WHITE "the default" ); else - Com_Printf( ", "S_COLOR_WHITE"default = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\""S_COLOR_WHITE, v->resetString ); + Com_Printf( ", " S_COLOR_WHITE "default = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE, v->resetString ); } Com_Printf( "\n" ); if ( v->latchedString ) - Com_Printf( " latched = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\"\n", v->latchedString ); + Com_Printf( " latched = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"\n", v->latchedString ); } /* @@ -1064,9 +1088,9 @@ void Cvar_List_f( void ) { if (var->flags & CVAR_CHEAT) Com_Printf( "C" ); else Com_Printf( " " ); if (var->flags & CVAR_USER_CREATED) Com_Printf( "?" ); else Com_Printf( " " ); - Com_Printf( S_COLOR_WHITE" %s = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\""S_COLOR_WHITE, var->name, var->string ); + Com_Printf( S_COLOR_WHITE " %s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE, var->name, var->string ); if ( var->latchedString ) - Com_Printf( ", latched = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\""S_COLOR_WHITE, var->latchedString ); + Com_Printf( ", latched = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE, var->latchedString ); Com_Printf( "\n" ); } @@ -1103,9 +1127,9 @@ void Cvar_ListModified_f( void ) { { char *value = (*itr)->latchedString ? (*itr)->latchedString : (*itr)->string; - Com_Printf( S_COLOR_GREY"Cvar " - S_COLOR_WHITE"%s = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\""S_COLOR_WHITE", " - S_COLOR_WHITE"default = "S_COLOR_GREY"\""S_COLOR_WHITE"%s"S_COLOR_GREY"\""S_COLOR_WHITE"\n", + Com_Printf( S_COLOR_GREY "Cvar " + S_COLOR_WHITE "%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE ", " + S_COLOR_WHITE "default = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", (*itr)->name, value, (*itr)->resetString ); } } @@ -1333,8 +1357,8 @@ updates an interpreted modules' version of a cvar ===================== */ void Cvar_Update( vmCvar_t *vmCvar ) { - cvar_t *cv = NULL; // bk001129 - assert(vmCvar); // bk + cvar_t *cv = NULL; + assert(vmCvar); if ( (unsigned)vmCvar->handle >= (unsigned)cvar_numIndexes ) { Com_Error( ERR_DROP, "Cvar_Update: handle %u out of range", (unsigned)vmCvar->handle ); @@ -1349,17 +1373,9 @@ void Cvar_Update( vmCvar_t *vmCvar ) { return; // variable might have been cleared by a cvar_restart } vmCvar->modificationCount = cv->modificationCount; - // bk001129 - mismatches. - if ( strlen(cv->string)+1 > MAX_CVAR_VALUE_STRING ) - Com_Error( ERR_DROP, "Cvar_Update: src %s length %u exceeds MAX_CVAR_VALUE_STRING", - cv->string, - (unsigned int) strlen(cv->string)); - // bk001212 - Q_strncpyz guarantees zero padding and dest[MAX_CVAR_VALUE_STRING-1]==0 - // bk001129 - paranoia. Never trust the destination string. - // bk001129 - beware, sizeof(char*) is always 4 (for cv->string). - // sizeof(vmCvar->string) always MAX_CVAR_VALUE_STRING - //Q_strncpyz( vmCvar->string, cv->string, sizeof( vmCvar->string ) ); // id - Q_strncpyz( vmCvar->string, cv->string, MAX_CVAR_VALUE_STRING ); + if ( strlen(cv->string)+1 > MAX_CVAR_VALUE_STRING ) + Com_Error( ERR_DROP, "Cvar_Update: src %s length %u exceeds MAX_CVAR_VALUE_STRING", cv->string, (unsigned int) strlen(cv->string)); + Q_strncpyz( vmCvar->string, cv->string, MAX_CVAR_VALUE_STRING ); vmCvar->value = cv->value; vmCvar->integer = cv->integer; diff --git a/codemp/qcommon/disablewarnings.h b/codemp/qcommon/disablewarnings.h index 2d77eb8a03..cabd9cd439 100644 --- a/codemp/qcommon/disablewarnings.h +++ b/codemp/qcommon/disablewarnings.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // hide these nasty warnings diff --git a/codemp/qcommon/files.cpp b/codemp/qcommon/files.cpp index 953ddcf4a0..9af30e7eb0 100644 --- a/codemp/qcommon/files.cpp +++ b/codemp/qcommon/files.cpp @@ -1,4 +1,29 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + /***************************************************************************** + * name: files.cpp * * desc: file code @@ -14,6 +39,10 @@ #endif #include "minizip/unzip.h" +#if defined(_WIN32) +#include +#endif + // for rmdir #if defined (_MSC_VER) #include @@ -515,7 +544,9 @@ qboolean FS_CreatePath (char *OSPath) { // Skip creation of the root directory as it will always be there ofs = strchr( path, PATH_SEP ); - ofs++; + if ( ofs ) { + ofs++; + } for (; ofs != NULL && *ofs ; ofs++) { if (*ofs == PATH_SEP) { @@ -1319,7 +1350,7 @@ long FS_FOpenFileRead( const char *filename, fileHandle_t *file, qboolean unique // from every pk3 file.. // The x86.dll suffixes are needed in order for sv_pure to continue to - // work on non-x86/windows systems... + // work on non-x86/windows systems... l = strlen( filename ); if ( !(pak->referenced & FS_GENERAL_REF)) { @@ -1675,7 +1706,6 @@ int FS_Write( const void *buffer, int len, fileHandle_t h ) { return len; } -#define MAXPRINTMSG 4096 void QDECL FS_Printf( fileHandle_t h, const char *fmt, ... ) { va_list argptr; char msg[MAXPRINTMSG]; @@ -3814,7 +3844,6 @@ void FS_Restart( int checksumFeed ) { Com_Error( ERR_FATAL, "Couldn't load mpdefault.cfg" ); } - // bk010116 - new check before safeMode if ( Q_stricmp(fs_gamedirvar->string, lastValidGame) ) { // skip the jampconfig.cfg if "safe" is on the command line if ( !Com_SafeMode() ) { diff --git a/codemp/qcommon/game_version.h b/codemp/qcommon/game_version.h index aae39d99c5..a0988af0e3 100644 --- a/codemp/qcommon/game_version.h +++ b/codemp/qcommon/game_version.h @@ -1,5 +1,24 @@ -// Copyright (C) 2000-2002 Raven Software, Inc. -// +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #define _STR(x) #x #define STR(x) _STR(x) @@ -14,9 +33,9 @@ #define VERSION_STRING_DOTTED STR(VERSION_MAJOR_RELEASE) "." STR(VERSION_MINOR_RELEASE) "." STR(VERSION_EXTERNAL_BUILD) "." STR(VERSION_INTERNAL_BUILD) // "a.b.c.d" #if defined(_DEBUG) - #define JK_VERSION "(debug)OpenJK-MP: v"VERSION_STRING_DOTTED - #define JK_VERSION_OLD "(debug)JAmp: v"VERSION_STRING_DOTTED + #define JK_VERSION "(debug)OpenJK-MP: v" VERSION_STRING_DOTTED + #define JK_VERSION_OLD "(debug)JAmp: v" VERSION_STRING_DOTTED #else - #define JK_VERSION "OpenJK-MP: v"VERSION_STRING_DOTTED - #define JK_VERSION_OLD "JAmp: v"VERSION_STRING_DOTTED + #define JK_VERSION "OpenJK-MP: v" VERSION_STRING_DOTTED + #define JK_VERSION_OLD "JAmp: v" VERSION_STRING_DOTTED #endif diff --git a/codemp/qcommon/huffman.cpp b/codemp/qcommon/huffman.cpp index 8e1f4f8f71..a08e5fab3f 100644 --- a/codemp/qcommon/huffman.cpp +++ b/codemp/qcommon/huffman.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + /* This is based on the Adaptive Huffman algorithm described in Sayood's Data * Compression book. The ranks are not actually stored, but implicitly defined * by the location of a node within a doubly-linked list */ diff --git a/codemp/qcommon/matcomp.cpp b/codemp/qcommon/matcomp.cpp index 286034dc60..b73007685c 100644 --- a/codemp/qcommon/matcomp.cpp +++ b/codemp/qcommon/matcomp.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#include "q_shared.h" #include "matcomp.h" #include #include @@ -61,7 +84,8 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_X; val=(int)(mat[1][3]/MC_SCALE_Y); val+=1<<(MC_BITS_Y-1); @@ -69,7 +93,8 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_Y; val=(int)(mat[2][3]/MC_SCALE_Z); val+=1<<(MC_BITS_Z-1); @@ -77,8 +102,8 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_Z; val=(int)(mat[0][0]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -86,7 +111,8 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V11; val=(int)(mat[0][1]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -94,7 +120,8 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V12; val=(int)(mat[0][2]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -102,8 +129,8 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V13; val=(int)(mat[1][0]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -111,7 +138,8 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V21; val=(int)(mat[1][1]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -119,7 +147,8 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V22; val=(int)(mat[1][2]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -127,7 +156,8 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V23; val=(int)(mat[2][0]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -135,7 +165,8 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V31; val=(int)(mat[2][1]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -143,7 +174,8 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V32; val=(int)(mat[2][2]/MC_SCALE_VECT); val+=1<<(MC_BITS_VECT-1); @@ -151,7 +183,8 @@ void MC_Compress(const float mat[3][4],unsigned char * _comp) val=(1<ui |= ((uint32_t)val) << MC_SHIFT_V33; // I added this because the line above actually ORs data into an int at the 22 byte (from 0), and therefore technically // is writing beyond the 24th byte of the output array. This *should** be harmless if the OR'd-in value doesn't change diff --git a/codemp/qcommon/matcomp.h b/codemp/qcommon/matcomp.h index 5000f22ef9..4ad827d07a 100644 --- a/codemp/qcommon/matcomp.h +++ b/codemp/qcommon/matcomp.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #ifdef __cplusplus diff --git a/codemp/qcommon/md4.cpp b/codemp/qcommon/md4.cpp index b9464150ad..dd988ef643 100644 --- a/codemp/qcommon/md4.cpp +++ b/codemp/qcommon/md4.cpp @@ -30,10 +30,10 @@ #include "q_shared.h" #include "qcommon.h" -struct mdfour { +typedef struct mdfour_s { uint32_t A, B, C, D; uint32_t totalN; -}; +} mdfour_ctx; /* NOTE: This code makes no attempt to be fast! @@ -41,7 +41,7 @@ struct mdfour { It assumes that an int is at least 32 bits long */ -static struct mdfour *m; +static mdfour_ctx *m; #define F(X,Y,Z) (((X)&(Y)) | ((~(X))&(Z))) #define G(X,Y,Z) (((X)&(Y)) | ((X)&(Z)) | ((Y)&(Z))) @@ -118,7 +118,7 @@ static void copy4(byte *out,uint32_t x) out[3] = (x>>24)&0xFF; } -void mdfour_begin(struct mdfour *md) +void mdfour_begin(mdfour_ctx *md) { md->A = 0x67452301; md->B = 0xefcdab89; @@ -155,7 +155,7 @@ static void mdfour_tail(byte *in, int n) } } -static void mdfour_update(struct mdfour *md, byte *in, int n) +static void mdfour_update(mdfour_ctx *md, byte *in, int n) { uint32_t M[16]; @@ -175,7 +175,7 @@ static void mdfour_update(struct mdfour *md, byte *in, int n) } -static void mdfour_result(struct mdfour *md, byte *out) +static void mdfour_result(mdfour_ctx *md, byte *out) { m = md; @@ -187,7 +187,7 @@ static void mdfour_result(struct mdfour *md, byte *out) static void mdfour(byte *out, byte *in, int n) { - struct mdfour md; + mdfour_ctx md; mdfour_begin(&md); mdfour_update(&md, in, n); mdfour_result(&md, out); diff --git a/codemp/qcommon/msg.cpp b/codemp/qcommon/msg.cpp index fd2d10764e..6d6e4bfe75 100644 --- a/codemp/qcommon/msg.cpp +++ b/codemp/qcommon/msg.cpp @@ -1,8 +1,30 @@ -// rjr: this is only used when cl_shownet is turned on and the server and client are in the same session -#include "game/g_public.h" -#include "server/server.h" +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ -extern cvar_t *cl_shownet; +#include "qcommon/q_shared.h" +#include "qcommon/qcommon.h" +#include "server/server.h" //#define _NEWHUFFTABLE_ // Build "c:\\netchan.bin" //#define _USINGNEWHUFFTABLE_ // Build a new frequency table to cut and paste. @@ -247,7 +269,7 @@ int MSG_ReadBits( msg_t *msg, int bits ) { } msg->readcount = (msg->bit>>3)+1; } - if ( sgn ) { + if ( sgn && bits > 0 && bits < 32 ) { if ( value & ( 1 << ( bits - 1 ) ) ) { value |= -1 ^ ( ( 1 << bits ) - 1 ); } @@ -544,7 +566,9 @@ delta functions ============================================================================= */ -#define LOG(x) if( cl_shownet->integer == 4 ) { Com_Printf("%s ", x ); }; +extern cvar_t *cl_shownet; + +#define LOG(x) if( cl_shownet && cl_shownet->integer == 4 ) { Com_Printf("%s ", x ); }; void MSG_WriteDelta( msg_t *msg, int oldV, int newV, int bits ) { if ( oldV == newV ) { @@ -993,7 +1017,7 @@ void MSG_WriteDeltaEntity( msg_t *msg, struct entityState_s *from, struct entity float fullFloat; int *fromF, *toF; - numFields = sizeof(entityStateFields)/sizeof(entityStateFields[0]); + numFields = (int)ARRAY_LEN( entityStateFields ); // all fields should be 32 bits to avoid any compiler packing issues // the "number" field is not part of the field list @@ -1017,8 +1041,6 @@ void MSG_WriteDeltaEntity( msg_t *msg, struct entityState_s *from, struct entity lc = 0; // build the change vector as bytes so it is endian independent - // TODO: OPTIMIZE: How about we do this in reverse order so we can - // just break out at the first changed field we find? for ( i = 0, field = entityStateFields ; i < numFields ; i++, field++ ) { fromF = (int *)( (byte *)from + field->offset ); toF = (int *)( (byte *)to + field->offset ); @@ -1121,13 +1143,17 @@ void MSG_ReadDeltaEntity( msg_t *msg, entityState_t *from, entityState_t *to, Com_Error( ERR_DROP, "Bad delta entity number: %i", number ); } - startBit = msg->bit; + if ( msg->bit == 0 ) { + startBit = msg->readcount * 8 - GENTITYNUM_BITS; + } else { + startBit = ( msg->readcount - 1 ) * 8 + msg->bit - GENTITYNUM_BITS; + } // check for a remove if ( MSG_ReadBits( msg, 1 ) == 1 ) { Com_Memset( to, 0, sizeof( *to ) ); to->number = MAX_GENTITIES - 1; - if ( cl_shownet->integer >= 2 || cl_shownet->integer == -1 ) { + if ( cl_shownet && ( cl_shownet->integer >= 2 || cl_shownet->integer == -1 ) ) { Com_Printf( "%3i: #%-3i remove\n", msg->readcount, number ); } return; @@ -1140,12 +1166,15 @@ void MSG_ReadDeltaEntity( msg_t *msg, entityState_t *from, entityState_t *to, return; } - numFields = sizeof(entityStateFields)/sizeof(entityStateFields[0]); + numFields = (int)ARRAY_LEN(entityStateFields); lc = MSG_ReadByte(msg); + if ( lc > numFields || lc < 0 ) + Com_Error( ERR_DROP, "invalid entityState field count" ); + // shownet 2/3 will interleave with other printed info, -1 will // just print the delta records` - if ( cl_shownet->integer >= 2 || cl_shownet->integer == -1 ) { + if ( cl_shownet && ( cl_shownet->integer >= 2 || cl_shownet->integer == -1 ) ) { print = 1; if (sv.state) { @@ -1212,7 +1241,11 @@ void MSG_ReadDeltaEntity( msg_t *msg, entityState_t *from, entityState_t *to, } if ( print ) { - endBit = msg->bit; + if ( msg->bit == 0 ) { + endBit = msg->readcount * 8 - GENTITYNUM_BITS; + } else { + endBit = ( msg->readcount - 1 ) * 8 + msg->bit - GENTITYNUM_BITS; + } Com_Printf( " (%i bits)\n", endBit - startBit ); } } @@ -1843,13 +1876,13 @@ void MSG_CheckNETFPSFOverrides(qboolean psfOverrides) { //do PSF overrides instead of NETF fileName = "psf_overrides.txt"; bitStorage = &g_psfBitStorage; - numFields = sizeof(playerStateFields)/sizeof(playerStateFields[0]); + numFields = (int)ARRAY_LEN( playerStateFields ); } else { fileName = "netf_overrides.txt"; bitStorage = &g_netfBitStorage; - numFields = sizeof(entityStateFields)/sizeof(entityStateFields[0]); + numFields = (int)ARRAY_LEN( entityStateFields ); } if (*bitStorage) @@ -1876,7 +1909,7 @@ void MSG_CheckNETFPSFOverrides(qboolean psfOverrides) len = FS_FOpenFileRead(va("ext_data/MP/%s", fileName), &f, qfalse); - if (!f) + if (!f || len < 0) { //silently exit since this file is not needed to proceed. return; } @@ -2040,7 +2073,6 @@ void MSG_WriteDeltaPlayerstate( msg_t *msg, struct playerState_s *from, struct p int ammobits; int powerupbits; int numFields; - int c; netField_t *field; netField_t *PSFields = playerStateFields; int *fromF, *toF; @@ -2056,13 +2088,11 @@ void MSG_WriteDeltaPlayerstate( msg_t *msg, struct playerState_s *from, struct p Com_Memset (&dummy, 0, sizeof(dummy)); } - c = msg->cursize; - //=====_OPTIMIZED_VEHICLE_NETWORKING======================================================================= #ifdef _OPTIMIZED_VEHICLE_NETWORKING if ( isVehiclePS ) {//a vehicle playerstate - numFields = sizeof( vehPlayerStateFields ) / sizeof( vehPlayerStateFields[0] ); + numFields = (int)ARRAY_LEN( vehPlayerStateFields ); PSFields = vehPlayerStateFields; } else @@ -2071,18 +2101,18 @@ void MSG_WriteDeltaPlayerstate( msg_t *msg, struct playerState_s *from, struct p && (to->eFlags&EF_NODRAW) ) {//pilot riding *inside* a vehicle! MSG_WriteBits( msg, 1, 1 ); // Pilot player state - numFields = sizeof( pilotPlayerStateFields ) / sizeof( pilotPlayerStateFields[0] ) - 82; + numFields = (int)ARRAY_LEN( pilotPlayerStateFields ) - 82; PSFields = pilotPlayerStateFields; } else {//normal client MSG_WriteBits( msg, 0, 1 ); // Normal player state - numFields = sizeof( playerStateFields ) / sizeof( playerStateFields[0] ); + numFields = (int)ARRAY_LEN( playerStateFields ); } } //=====_OPTIMIZED_VEHICLE_NETWORKING======================================================================= #else// _OPTIMIZED_VEHICLE_NETWORKING - numFields = sizeof( playerStateFields ) / sizeof( playerStateFields[0] ); + numFields = (int)ARRAY_LEN( playerStateFields ); #endif// _OPTIMIZED_VEHICLE_NETWORKING lc = 0; @@ -2146,7 +2176,6 @@ void MSG_WriteDeltaPlayerstate( msg_t *msg, struct playerState_s *from, struct p MSG_WriteBits( msg, *toF, field->bits ); } } - c = msg->cursize - c; // @@ -2302,7 +2331,7 @@ void MSG_ReadDeltaPlayerstate (msg_t *msg, playerState_t *from, playerState_t *t // shownet 2/3 will interleave with other printed info, -2 will // just print the delta records - if ( cl_shownet->integer >= 2 || cl_shownet->integer == -2 ) { + if ( cl_shownet && ( cl_shownet->integer >= 2 || cl_shownet->integer == -2 ) ) { print = 1; Com_Printf( "%3i: playerstate ", msg->readcount ); } else { @@ -2313,7 +2342,7 @@ void MSG_ReadDeltaPlayerstate (msg_t *msg, playerState_t *from, playerState_t *t #ifdef _OPTIMIZED_VEHICLE_NETWORKING if ( isVehiclePS ) {//a vehicle playerstate - numFields = sizeof( vehPlayerStateFields ) / sizeof( vehPlayerStateFields[0] ); + numFields = (int)ARRAY_LEN( vehPlayerStateFields ); PSFields = vehPlayerStateFields; } else @@ -2321,21 +2350,24 @@ void MSG_ReadDeltaPlayerstate (msg_t *msg, playerState_t *from, playerState_t *t int isPilot = MSG_ReadBits( msg, 1 ); if ( isPilot ) {//pilot riding *inside* a vehicle! - numFields = sizeof( pilotPlayerStateFields ) / sizeof( pilotPlayerStateFields[0] ) - 82; + numFields = (int)ARRAY_LEN( pilotPlayerStateFields ) - 82; PSFields = pilotPlayerStateFields; } else {//normal client - numFields = sizeof( playerStateFields ) / sizeof( playerStateFields[0] ); + numFields = (int)ARRAY_LEN( playerStateFields ); } } //=====_OPTIMIZED_VEHICLE_NETWORKING======================================================================= #else//_OPTIMIZED_VEHICLE_NETWORKING - numFields = sizeof( playerStateFields ) / sizeof( playerStateFields[0] ); + numFields = (int)ARRAY_LEN( playerStateFields ); #endif//_OPTIMIZED_VEHICLE_NETWORKING lc = MSG_ReadByte(msg); + if ( lc > numFields || lc < 0 ) + Com_Error( ERR_DROP, "invalid playerState field count" ); + for ( i = 0, field = PSFields ; i < lc ; i++, field++ ) { fromF = (int *)( (byte *)from + field->offset ); toF = (int *)( (byte *)to + field->offset ); @@ -3070,12 +3102,12 @@ MSG_ReportChangeVectors_f Prints out a table from the current statistics for copying to code ================= */ -void MSG_ReportChangeVectors_f( void ) { #ifndef FINAL_BUILD +void MSG_ReportChangeVectors_f( void ) { int numFields, i; netField_t *field; - numFields = sizeof(entityStateFields)/sizeof(entityStateFields[0]); + numFields = (int)ARRAY_LEN( entityStateFields ); Com_Printf("Entity State Fields:\n"); for ( i = 0, field = entityStateFields ; i < numFields ; i++, field++ ) @@ -3085,14 +3117,14 @@ void MSG_ReportChangeVectors_f( void ) { } Com_Printf("\nPlayer State Fields:\n"); - numFields = sizeof( playerStateFields ) / sizeof( playerStateFields[0] ); + numFields = (int)ARRAY_LEN( playerStateFields ); for ( i = 0, field = playerStateFields ; i < numFields ; i++, field++ ) { Com_Printf("%s\t\t%d\n", field->name, field->mCount); field->mCount = 0; } -#endif // FINAL_BUILD } +#endif // FINAL_BUILD //=========================================================================== diff --git a/codemp/qcommon/net_chan.cpp b/codemp/qcommon/net_chan.cpp index d2dfe7bc48..69ee3ed5cf 100644 --- a/codemp/qcommon/net_chan.cpp +++ b/codemp/qcommon/net_chan.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + /* packet header diff --git a/codemp/qcommon/net_ip.cpp b/codemp/qcommon/net_ip.cpp index 77b68a50f7..3105df117d 100644 --- a/codemp/qcommon/net_ip.cpp +++ b/codemp/qcommon/net_ip.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "qcommon/qcommon.h" #ifdef _WIN32 @@ -463,7 +487,6 @@ NET_OpenSocks */ void NET_OpenSocks( int port ) { struct sockaddr_in address; - int err; struct hostent *h; int len; qboolean rfc1929; @@ -474,14 +497,12 @@ void NET_OpenSocks( int port ) { Com_Printf( "Opening connection to SOCKS server.\n" ); if ( ( socks_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ) ) == INVALID_SOCKET ) { - err = socketError; Com_Printf( "WARNING: NET_OpenSocks: socket: %s\n", NET_ErrorString() ); return; } h = gethostbyname( net_socksServer->string ); if ( h == NULL ) { - err = socketError; Com_Printf( "WARNING: NET_OpenSocks: gethostbyname: %s\n", NET_ErrorString() ); return; } @@ -495,7 +516,6 @@ void NET_OpenSocks( int port ) { address.sin_port = htons( (short)net_socksPort->integer ); if ( connect( socks_socket, (struct sockaddr *)&address, sizeof( address ) ) == SOCKET_ERROR ) { - err = socketError; Com_Printf( "NET_OpenSocks: connect: %s\n", NET_ErrorString() ); return; } @@ -523,7 +543,6 @@ void NET_OpenSocks( int port ) { buf[2] = 2; // method #2 - method id #02: username/password } if ( send( socks_socket, (const char *)buf, len, 0 ) == SOCKET_ERROR ) { - err = socketError; Com_Printf( "NET_OpenSocks: send: %s\n", NET_ErrorString() ); return; } @@ -531,7 +550,6 @@ void NET_OpenSocks( int port ) { // get the response len = recv( socks_socket, (char *)buf, 64, 0 ); if ( len == SOCKET_ERROR ) { - err = socketError; Com_Printf( "NET_OpenSocks: recv: %s\n", NET_ErrorString() ); return; } @@ -570,7 +588,6 @@ void NET_OpenSocks( int port ) { // send it if ( send( socks_socket, (const char *)buf, 3 + ulen + plen, 0 ) == SOCKET_ERROR ) { - err = socketError; Com_Printf( "NET_OpenSocks: send: %s\n", NET_ErrorString() ); return; } @@ -578,7 +595,6 @@ void NET_OpenSocks( int port ) { // get the response len = recv( socks_socket, (char *)buf, 64, 0 ); if ( len == SOCKET_ERROR ) { - err = socketError; Com_Printf( "NET_OpenSocks: recv: %s\n", NET_ErrorString() ); return; } @@ -600,7 +616,6 @@ void NET_OpenSocks( int port ) { *(int *)&buf[4] = INADDR_ANY; *(short *)&buf[8] = htons( (short)port ); // port if ( send( socks_socket, (const char *)buf, 10, 0 ) == SOCKET_ERROR ) { - err = socketError; Com_Printf( "NET_OpenSocks: send: %s\n", NET_ErrorString() ); return; } @@ -608,7 +623,6 @@ void NET_OpenSocks( int port ) { // get the response len = recv( socks_socket, (char *)buf, 64, 0 ); if( len == SOCKET_ERROR ) { - err = socketError; Com_Printf( "NET_OpenSocks: recv: %s\n", NET_ErrorString() ); return; } @@ -651,7 +665,7 @@ NET_GetLocalAddress // tjw: assume that once upon a time some version did have sa_len #define IFR_NEXT(ifr) \ ((struct ifreq *) ((char *) (ifr) + sizeof(*(ifr)) + \ - max(0, (int) (ifr)->ifr_addr.sa_len - (int) sizeof((ifr)->ifr_addr)))) + Q_max(0, (int) (ifr)->ifr_addr.sa_len - (int) sizeof((ifr)->ifr_addr)))) #endif @@ -755,7 +769,6 @@ void NET_GetLocalAddress( void ) { char hostname[256]; struct hostent *hostInfo; - int error; char *p; int ip; int n; @@ -764,13 +777,11 @@ void NET_GetLocalAddress( void ) numIP = 0; if( gethostname( hostname, 256 ) == SOCKET_ERROR ) { - error = socketError; return; } hostInfo = gethostbyname( hostname ); if( !hostInfo ) { - error = socketError; return; } diff --git a/codemp/qcommon/persistence.cpp b/codemp/qcommon/persistence.cpp index 57800a6282..f856af6bdd 100644 --- a/codemp/qcommon/persistence.cpp +++ b/codemp/qcommon/persistence.cpp @@ -1,3 +1,23 @@ +/* +=========================================================================== +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "qcommon/qcommon.h" typedef struct persisentData_t diff --git a/codemp/qcommon/q_math.c b/codemp/qcommon/q_math.c index ef2fb63681..db30e622ab 100644 --- a/codemp/qcommon/q_math.c +++ b/codemp/qcommon/q_math.c @@ -1,5 +1,27 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // q_math.c -- stateless support routines that are included in each code module #include "q_shared.h" @@ -389,7 +411,7 @@ void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal ) float inv_denom; inv_denom = DotProduct( normal, normal ); - assert( Q_fabs(inv_denom) != 0.0f ); // bk010122 - zero vectors get here + assert( Q_fabs(inv_denom) != 0.0f ); inv_denom = 1.0f / inv_denom; d = DotProduct( normal, p ) * inv_denom; @@ -454,9 +476,7 @@ float Q_rsqrt( float number ) y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed -#ifdef __linux__ - assert( !isnan(y) ); // bk010122 - FPE? -#endif + assert( !Q_isnan(y) ); return y; } diff --git a/codemp/qcommon/q_math.cpp b/codemp/qcommon/q_math.cpp index 8bbd5318de..461b2a9ed1 100644 --- a/codemp/qcommon/q_math.cpp +++ b/codemp/qcommon/q_math.cpp @@ -1 +1,24 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "qcommon/q_math.c" diff --git a/codemp/qcommon/q_platform.h b/codemp/qcommon/q_platform.h index 1b3221b6e8..863a2a6e5a 100644 --- a/codemp/qcommon/q_platform.h +++ b/codemp/qcommon/q_platform.h @@ -1,3 +1,29 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#pragma once + // for windows fastcall option #define QDECL #define QCALL @@ -100,7 +126,7 @@ #ifdef __clang__ #define QINLINE static inline #else - #define QINLINE /*inline*/ + #define QINLINE inline #endif #define PATH_SEP '/' diff --git a/codemp/qcommon/q_shared.c b/codemp/qcommon/q_shared.c index f830d18da5..a80c4a05f9 100644 --- a/codemp/qcommon/q_shared.c +++ b/codemp/qcommon/q_shared.c @@ -1,5 +1,27 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // q_shared.c -- stateless support routines that are included in each code dll #include "q_shared.h" @@ -931,7 +953,6 @@ Safe strncpy that ensures a trailing zero ============= */ void Q_strncpyz( char *dest, const char *src, int destsize ) { - // bk001129 - also NULL dest if ( !dest ) { Com_Error( ERR_FATAL, "Q_strncpyz: NULL dest" ); return; @@ -952,17 +973,14 @@ void Q_strncpyz( char *dest, const char *src, int destsize ) { int Q_stricmpn (const char *s1, const char *s2, int n) { int c1, c2; - // bk001129 - moved in 1.17 fix not in id codebase - if ( s1 == NULL ) { - if ( s2 == NULL ) - return 0; - else - return -1; - } - else if ( s2==NULL ) - return 1; - - + if ( s1 == NULL ) { + if ( s2 == NULL ) + return 0; + else + return -1; + } + else if ( s2==NULL ) + return 1; do { c1 = *s1++; @@ -1011,7 +1029,6 @@ int Q_stricmp (const char *s1, const char *s2) { return (s1 && s2) ? Q_stricmpn (s1, s2, 99999) : -1; } - char *Q_strlwr( char *s1 ) { char *s; @@ -1049,33 +1066,32 @@ void Q_strcat( char *dest, int size, const char *src ) { /* * Find the first occurrence of find in s. */ -const char *Q_stristr( const char *s, const char *find) -{ - char c, sc; - size_t len; - - if ((c = *find++) != 0) - { - if (c >= 'a' && c <= 'z') - { - c -= ('a' - 'A'); - } - len = strlen(find); - do - { - do - { - if ((sc = *s++) == 0) - return NULL; - if (sc >= 'a' && sc <= 'z') - { - sc -= ('a' - 'A'); - } - } while (sc != c); - } while (Q_stricmpn(s, find, len) != 0); - s--; - } - return s; +const char *Q_stristr( const char *s, const char *find ) { + char c, sc; + size_t len; + + if ((c = *find++) != 0) + { + if (c >= 'a' && c <= 'z') + { + c -= ('a' - 'A'); + } + len = strlen(find); + do + { + do + { + if ((sc = *s++) == 0) + return NULL; + if (sc >= 'a' && sc <= 'z') + { + sc -= ('a' - 'A'); + } + } while (sc != c); + } while (Q_stricmpn(s, find, len) != 0); + s--; + } + return s; } int Q_PrintStrlen( const char *string ) { @@ -1725,3 +1741,15 @@ char *Com_SkipTokens( char *s, int numTokens, char *sep ) { else return s; } + +qboolean Q_InBitflags( const uint32_t *bits, int index, uint32_t bitsPerByte ) { + return ( bits[index / bitsPerByte] & (1 << (index % bitsPerByte)) ) ? qtrue : qfalse; +} + +void Q_AddToBitflags( uint32_t *bits, int index, uint32_t bitsPerByte ) { + bits[index / bitsPerByte] |= (1 << (index % bitsPerByte)); +} + +void Q_RemoveFromBitflags( uint32_t *bits, int index, uint32_t bitsPerByte ) { + bits[index / bitsPerByte] &= ~(1 << (index % bitsPerByte)); +} diff --git a/codemp/qcommon/q_shared.cpp b/codemp/qcommon/q_shared.cpp index 1725ea8886..c2b3c72313 100644 --- a/codemp/qcommon/q_shared.cpp +++ b/codemp/qcommon/q_shared.cpp @@ -1 +1,24 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "qcommon/q_shared.c" diff --git a/codemp/qcommon/q_shared.h b/codemp/qcommon/q_shared.h index 5bdc17ba83..2bf37ac557 100644 --- a/codemp/qcommon/q_shared.h +++ b/codemp/qcommon/q_shared.h @@ -1,7 +1,28 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ -// Copyright (C) 1999-2000 Id Software, Inc. -// +#pragma once // q_shared.h -- included first by ALL program modules. // A user mod should never modify this file @@ -15,6 +36,7 @@ #define HOMEPATH_NAME_MACOSX HOMEPATH_NAME_WIN #define BASEGAME "base" +#define OPENJKGAME "OpenJK" //NOTENOTE: Only change this to re-point ICARUS to a new script directory #define Q3_SCRIPT_DIR "scripts" @@ -105,6 +127,12 @@ #define Q_EXPORT #endif +#if defined(__GNUC__) +#define NORETURN __attribute__((noreturn)) +#elif defined(_MSC_VER) +#define NORETURN __declspec(noreturn) +#endif + // this is the define for determining if we have an asm version of a C function #if (defined(_M_IX86) || defined(__i386__)) && !defined(__sun__) #define id386 1 @@ -135,12 +163,8 @@ typedef unsigned long ulong; typedef enum qboolean_e { qfalse=0, qtrue } qboolean; -#ifndef min - #define min(x,y) ((x)<(y)?(x):(y)) -#endif -#ifndef max - #define max(x,y) ((x)>(y)?(x):(y)) -#endif +#define Q_min(x,y) ((x)<(y)?(x):(y)) +#define Q_max(x,y) ((x)>(y)?(x):(y)) #if defined (_MSC_VER) && (_MSC_VER >= 1600) @@ -1137,7 +1161,7 @@ qboolean Info_NextPair( const char **s, char *key, char *value ); void (*Com_Error)( int level, const char *error, ... ); void (*Com_Printf)( const char *msg, ... ); #else - void QDECL Com_Error( int level, const char *error, ... ); + void NORETURN QDECL Com_Error( int level, const char *error, ... ); void QDECL Com_Printf( const char *msg, ... ); #endif @@ -2374,3 +2398,7 @@ enum { }; void NET_AddrToString( char *out, size_t size, void *addr ); + +qboolean Q_InBitflags( const uint32_t *bits, int index, uint32_t bitsPerByte ); +void Q_AddToBitflags( uint32_t *bits, int index, uint32_t bitsPerByte ); +void Q_RemoveFromBitflags( uint32_t *bits, int index, uint32_t bitsPerByte ); diff --git a/codemp/qcommon/qcommon.h b/codemp/qcommon/qcommon.h index 70522de8c7..32c499f511 100644 --- a/codemp/qcommon/qcommon.h +++ b/codemp/qcommon/qcommon.h @@ -1,8 +1,33 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // qcommon.h -- definitions common between client and server, but not game.or ref modules #include "qcommon/q_shared.h" +#include "sys/sys_public.h" //============================================================================ @@ -73,8 +98,9 @@ void MSG_WriteDeltaPlayerstate( msg_t *msg, struct playerState_s *from, struct p #endif void MSG_ReadDeltaPlayerstate( msg_t *msg, struct playerState_s *from, struct playerState_s *to, qboolean isVehiclePS = qfalse ); - +#ifndef FINAL_BUILD void MSG_ReportChangeVectors_f( void ); +#endif //============================================================================ @@ -100,35 +126,19 @@ NET #define MAX_RELIABLE_COMMANDS 128 // max string commands buffered for restransmit -typedef enum { - NA_BAD = 0, // an address lookup failed - NA_BOT, - NA_LOOPBACK, - NA_BROADCAST, - NA_IP -} netadrtype_t; - typedef enum { NS_CLIENT, NS_SERVER } netsrc_t; -typedef struct netadr_s { - netadrtype_t type; - - byte ip[4]; - - unsigned short port; -} netadr_t; - void NET_Init( void ); void NET_Shutdown( void ); void NET_Restart_f( void ); void NET_Config( qboolean enableNetworking ); void NET_SendPacket (netsrc_t sock, int length, const void *data, netadr_t to); -void QDECL NET_OutOfBandPrint( netsrc_t net_socket, netadr_t adr, const char *format, ...); -void QDECL NET_OutOfBandData( netsrc_t sock, netadr_t adr, byte *format, int len ); +void NET_OutOfBandPrint( netsrc_t net_socket, netadr_t adr, const char *format, ...); +void NET_OutOfBandData( netsrc_t sock, netadr_t adr, byte *format, int len ); qboolean NET_CompareAdr (netadr_t a, netadr_t b); qboolean NET_CompareBaseAdrMask( netadr_t a, netadr_t b, int netmask ); @@ -139,6 +149,12 @@ qboolean NET_StringToAdr ( const char *s, netadr_t *a); qboolean NET_GetLoopPacket (netsrc_t sock, netadr_t *net_from, msg_t *net_message); void NET_Sleep(int msec); +void Sys_SendPacket( int length, const void *data, netadr_t to ); +//Does NOT parse port numbers, only base addresses. +qboolean Sys_StringToAdr( const char *s, netadr_t *a ); +qboolean Sys_IsLANAddress (netadr_t adr); +void Sys_ShowIP(void); + #define MAX_MSGLEN 49152 // max length of a message, which may // be fragmented into multiple packets @@ -619,6 +635,15 @@ void FS_ForceFlush( fileHandle_t f ); void FS_FreeFile( void *buffer ); // frees the memory returned by FS_ReadFile +class FS_AutoFreeFile { +private: + FS_AutoFreeFile(); + void *buffer; +public: + FS_AutoFreeFile(void *inbuf) : buffer(inbuf) { }; + ~FS_AutoFreeFile() { if (buffer) FS_FreeFile(buffer); }; +}; + void FS_WriteFile( const char *qpath, const void *buffer, int size ); // writes a complete file, creating any subdirectories needed @@ -722,8 +747,8 @@ void Com_EndRedirect( void ); void QDECL Com_Printf( const char *fmt, ... ); void QDECL Com_DPrintf( const char *fmt, ... ); void QDECL Com_OPrintf( const char *fmt, ...); // Outputs to the VC / Windows Debug window (only in debug compile) -void QDECL Com_Error( int code, const char *fmt, ... ) __attribute__((noreturn)); -void Com_Quit_f( void ); +void NORETURN QDECL Com_Error( int code, const char *fmt, ... ); +void NORETURN Com_Quit_f( void ); int Com_EventLoop( void ); int Com_Milliseconds( void ); // will be journaled properly unsigned Com_BlockChecksum( const void *buffer, int length ); @@ -746,14 +771,14 @@ extern cvar_t *com_speeds; extern cvar_t *com_timescale; extern cvar_t *com_sv_running; extern cvar_t *com_cl_running; -extern cvar_t *com_viewlog; // 0 = hidden, 1 = visible, 2 = minimized extern cvar_t *com_version; extern cvar_t *com_buildScript; // for building release pak files extern cvar_t *com_journal; extern cvar_t *com_cameraMode; -extern cvar_t *com_unfocused; -extern cvar_t *com_minimized; extern cvar_t *com_homepath; +#ifndef _WIN32 +extern cvar_t *com_ansiColor; +#endif extern cvar_t *com_optvehtrace; @@ -961,117 +986,6 @@ qboolean SV_GameCommand( void ); // qboolean UI_GameCommand( void ); -/* -============================================================== - -NON-PORTABLE SYSTEM SERVICES - -============================================================== -*/ - -typedef enum { - AXIS_SIDE, - AXIS_FORWARD, - AXIS_UP, - AXIS_ROLL, - AXIS_YAW, - AXIS_PITCH, - MAX_JOYSTICK_AXIS -} joystickAxis_t; - -typedef enum { - // bk001129 - make sure SE_NONE is zero - SE_NONE = 0, // evTime is still valid - SE_KEY, // evValue is a key code, evValue2 is the down flag - SE_CHAR, // evValue is an ascii char - SE_MOUSE, // evValue and evValue2 are reletive signed x / y moves - SE_JOYSTICK_AXIS, // evValue is an axis number and evValue2 is the current state (-127 to 127) - SE_CONSOLE, // evPtr is a char* - SE_PACKET // evPtr is a netadr_t followed by data bytes to evPtrLength -} sysEventType_t; - -typedef struct sysEvent_s { - int evTime; - sysEventType_t evType; - int evValue, evValue2; - int evPtrLength; // bytes of data pointed to by evPtr, for journaling - void *evPtr; // this must be manually freed if not NULL -} sysEvent_t; - -sysEvent_t Sys_GetEvent( void ); - -void Sys_Init (void); - -#ifdef _WIN32 - #include - #define Sys_LoadLibrary(f) (void*)LoadLibrary(f) - #define Sys_UnloadLibrary(h) FreeLibrary((HMODULE)h) - #define Sys_LoadFunction(h,fn) (void*)GetProcAddress((HMODULE)h,fn) - #define Sys_LibraryError() "unknown" -#endif // linux and mac use SDL in SDL_loadlibrary.h - -// general development dll loading for virtual machine testing -void * QDECL Sys_LoadDll(const char *name, qboolean useSystemLib); -void * QDECL Sys_LoadLegacyGameDll( const char *name, intptr_t (QDECL **vmMain)(int, ...), intptr_t (QDECL *systemcalls)(intptr_t, ...) ); -void * QDECL Sys_LoadGameDll( const char *name, void *(QDECL **moduleAPI)(int, ...) ); -void Sys_UnloadDll( void *dllHandle ); - -char *Sys_GetCurrentUser( void ); - -void QDECL Sys_Error( const char *error, ...) __attribute__((noreturn)); -void Sys_Quit (void); -char *Sys_GetClipboardData( void ); // note that this isn't journaled... - -void Sys_Print( const char *msg ); - -// Sys_Milliseconds should only be used for profiling purposes, -// any game related timing information should come from event timestamps -int Sys_Milliseconds (bool baseTime = false); -int Sys_Milliseconds2(void); -void Sys_SetEnv(const char *name, const char *value); - -extern "C" void Sys_SnapVector( float *v ); - -qboolean Sys_RandomBytes( byte *string, int len ); - -// the system console is shown when a dedicated server is running -void Sys_DisplaySystemConsole( qboolean show ); - -void Sys_ShowConsole( int level, qboolean quitOnClose ); -void Sys_SetErrorText( const char *text ); - -void Sys_SendPacket( int length, const void *data, netadr_t to ); - -qboolean Sys_StringToAdr( const char *s, netadr_t *a ); -//Does NOT parse port numbers, only base addresses. - -qboolean Sys_IsLANAddress (netadr_t adr); -void Sys_ShowIP(void); - -qboolean Sys_Mkdir( const char *path ); -char *Sys_Cwd( void ); -void Sys_SetDefaultInstallPath(const char *path); -char *Sys_DefaultInstallPath(void); - -#ifdef MACOS_X -char *Sys_DefaultAppPath(void); -#endif - -char *Sys_DefaultHomePath(void); -const char *Sys_Dirname( char *path ); -const char *Sys_Basename( char *path ); - -bool Sys_PathCmp( const char *path1, const char *path2 ); - -char **Sys_ListFiles( const char *directory, const char *extension, char *filter, int *numfiles, qboolean wantsubs ); -void Sys_FreeFileList( char **fileList ); -//rwwRMG - changed to fileList to not conflict with list type - -qboolean Sys_LowPhysicalMemory(); -unsigned int Sys_ProcessorCount(); - -void Sys_SetProcessorAffinity( void ); - /* This is based on the Adaptive Huffman algorithm described in Sayood's Data * Compression book. The ranks are not actually stored, but implicitly defined * by the location of a node within a doubly-linked list */ @@ -1134,3 +1048,7 @@ inline int Round(float value) // Persistent data store API bool PD_Store ( const char *name, const void *data, size_t size ); const void *PD_Load ( const char *name, size_t *size ); + +uint32_t ConvertUTF8ToUTF32( char *utf8CurrentChar, char **utf8NextChar ); + +#include "sys/sys_public.h" diff --git a/codemp/qcommon/qfiles.h b/codemp/qcommon/qfiles.h index 7fa4b716f7..98a6e4d7e8 100644 --- a/codemp/qcommon/qfiles.h +++ b/codemp/qcommon/qfiles.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "../qcommon/q_shared.h" diff --git a/codemp/qcommon/sstring.h b/codemp/qcommon/sstring.h index 2021388985..ef08ab2088 100644 --- a/codemp/qcommon/sstring.h +++ b/codemp/qcommon/sstring.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "../qcommon/q_shared.h" diff --git a/codemp/qcommon/stringed_ingame.cpp b/codemp/qcommon/stringed_ingame.cpp index 22319910b3..3518f0db8d 100644 --- a/codemp/qcommon/stringed_ingame.cpp +++ b/codemp/qcommon/stringed_ingame.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Filename:- stringed_ingame.cpp // // This file is designed to be pasted into each game project that uses the StringEd package's files. @@ -14,31 +36,20 @@ #include "qcommon.h" // ////////////////////////////////////////////////// - - -#ifdef _MSC_VER -#pragma warning ( disable : 4511 ) // copy constructor could not be generated -#pragma warning ( disable : 4512 ) // assignment operator could not be generated -#pragma warning ( disable : 4663 ) // C++ language change: blah blah template crap blah blah -#endif #include "stringed_ingame.h" #include "stringed_interface.h" /////////////////////////////////////////////// // // some STL stuff... -#ifdef _MSC_VER -#pragma warning ( disable : 4786 ) // disable the usual stupid and pointless STL warning -#endif #include #include #include #include #include -using namespace std; -typedef vector vStrings_t; -typedef vector vInts_t; +typedef std::vector vStrings_t; +typedef std::vector vInts_t; // /////////////////////////////////////////////// @@ -51,8 +62,8 @@ cvar_t *sp_leet = NULL; // kept as 'sp_' for JK2 compat. typedef struct SE_Entry_s { - string m_strString; - string m_strDebug; // english and/or "#same", used for debugging only. Also prefixed by "SE:" to show which strings go through StringEd (ie aren't hardwired) + std::string m_strString; + std::string m_strDebug; // english and/or "#same", used for debugging only. Also prefixed by "SE:" to show which strings go through StringEd (ie aren't hardwired) int m_iFlags; SE_Entry_s() @@ -63,17 +74,17 @@ typedef struct SE_Entry_s } SE_Entry_t; -typedef map mapStringEntries_t; +typedef std::map mapStringEntries_t; class CStringEdPackage { private: SE_BOOL m_bEndMarkerFound_ParseOnly; - string m_strCurrentEntryRef_ParseOnly; - string m_strCurrentEntryEnglish_ParseOnly; - string m_strCurrentFileRef_ParseOnly; - string m_strLoadingLanguage_ParseOnly; // eg "german" + std::string m_strCurrentEntryRef_ParseOnly; + std::string m_strCurrentEntryEnglish_ParseOnly; + std::string m_strCurrentFileRef_ParseOnly; + std::string m_strLoadingLanguage_ParseOnly; // eg "german" SE_BOOL m_bLoadingEnglish_ParseOnly; public: @@ -93,8 +104,8 @@ class CStringEdPackage // // flag stuff... // - vector m_vstrFlagNames; - map m_mapFlagMasks; + std::vector m_vstrFlagNames; + std::map m_mapFlagMasks; void Clear( SE_BOOL bChangingLanguages ); void SetupNewFileParse( const char *psFileName, SE_BOOL bLoadDebug ); @@ -278,7 +289,7 @@ SE_BOOL CStringEdPackage::CheckLineForKeyword( const char *psKeyword, const char // const char *CStringEdPackage::ConvertCRLiterals_Read( const char *psString ) { - static string str; + static std::string str; str = psString; int iLoc; while ( (iLoc = str.find("\\n")) != -1 ) @@ -394,7 +405,7 @@ const char *CStringEdPackage::InsideQuotes( const char *psLine ) // I *could* replace this string object with a declared array, but wasn't sure how big to leave it, and it'd have to // be static as well, hence permanent. (problem on consoles?) // - static string str; + static std::string str; str = ""; // do NOT join to above line // skip any leading whitespace... @@ -444,7 +455,7 @@ const char *CStringEdPackage::InsideQuotes( const char *psLine ) // int CStringEdPackage::GetFlagMask( const char *psFlagName ) { - map ::iterator itFlag = m_mapFlagMasks.find( psFlagName ); + std::map ::iterator itFlag = m_mapFlagMasks.find( psFlagName ); if ( itFlag != m_mapFlagMasks.end() ) { int &iMask = (*itFlag).second; @@ -754,7 +765,7 @@ void CStringEdPackage::AddEntry( const char *psLocalReference ) const char *Leetify( const char *psString ) { - static string str; + static std::string str; str = psString; if (sp_leet->integer == 42) // very specific test, so you won't hit it accidentally { @@ -875,7 +886,7 @@ static const char *SE_Load_Actual( const char *psFileName, SE_BOOL bLoadDebug, S return psErrorMessage; } -static const char *SE_GetFoundFile( string &strResult ) +static const char *SE_GetFoundFile( std::string &strResult ) { static char sTemp[1024/*MAX_PATH*/]; @@ -1071,12 +1082,12 @@ int SE_GetFlagMask( const char *psFlagName ) // Groan, except for Bob. I mentioned that this was slow and only call it once, but he's calling it from // every level-load... Ok, cacheing it is... // -vector gvLanguagesAvailable; +std::vector gvLanguagesAvailable; int SE_GetNumLanguages(void) { if ( gvLanguagesAvailable.empty() ) { - string strResults; + std::string strResults; /*int iFilesFound = */SE_BuildFileList( #ifdef _STRINGED va("C:\\Source\\Tools\\StringEd\\test_data\\%s",sSE_STRINGS_DIR) @@ -1086,7 +1097,7 @@ int SE_GetNumLanguages(void) , strResults ); - set strUniqueStrings; // laziness + std::set strUniqueStrings; // laziness const char *p; while ((p=SE_GetFoundFile (strResults)) != NULL) { @@ -1208,7 +1219,7 @@ const char *SE_LoadLanguage( const char *psLanguage, SE_BOOL bLoadDebug /* = SE_ { SE_NewLanguage(); - string strResults; + std::string strResults; /*int iFilesFound = */SE_BuildFileList( #ifdef _STRINGED va("C:\\Source\\Tools\\StringEd\\test_data\\%s",sSE_STRINGS_DIR) diff --git a/codemp/qcommon/stringed_ingame.h b/codemp/qcommon/stringed_ingame.h index 78895cde67..c7f0deb5fe 100644 --- a/codemp/qcommon/stringed_ingame.h +++ b/codemp/qcommon/stringed_ingame.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "qcommon/q_shared.h" diff --git a/codemp/qcommon/stringed_interface.cpp b/codemp/qcommon/stringed_interface.cpp index 96a3855361..78c9e1faf6 100644 --- a/codemp/qcommon/stringed_interface.cpp +++ b/codemp/qcommon/stringed_interface.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Filename:- stringed_interface.cpp // // This file contains functions that StringEd wants to call to do things like load/save, they can be modified @@ -17,17 +39,10 @@ // ////////////////////////////////////////////////// - -#ifdef _MSC_VER -#pragma warning ( disable : 4511 ) // copy constructor could not be generated -#pragma warning ( disable : 4512 ) // assignment operator could not be generated -#pragma warning ( disable : 4663 ) // C++ language change: blah blah template crap blah blah -#endif #include "stringed_interface.h" #include "stringed_ingame.h" #include -using namespace std; #ifdef _STRINGED #include @@ -131,7 +146,7 @@ void SE_FreeFileDataAfterLoad( unsigned char *psLoadedFile ) // quake-style method of doing things since their file-list code doesn't have a 'recursive' flag... // int giFilesFound; -static void SE_R_ListFiles( const char *psExtension, const char *psDir, string &strResults ) +static void SE_R_ListFiles( const char *psExtension, const char *psDir, std::string &strResults ) { // Com_Printf(va("Scanning Dir: %s\n",psDir)); @@ -191,7 +206,7 @@ static void SE_R_ListFiles( const char *psExtension, const char *psDir, string & // // expected result is a ';'-delineated string (including last one) containing file-list search results // -int SE_BuildFileList( const char *psStartDir, string &strResults ) +int SE_BuildFileList( const char *psStartDir, std::string &strResults ) { #ifndef _STRINGED giFilesFound = 0; diff --git a/codemp/qcommon/stringed_interface.h b/codemp/qcommon/stringed_interface.h index 466731e424..1c00289c8f 100644 --- a/codemp/qcommon/stringed_interface.h +++ b/codemp/qcommon/stringed_interface.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // Filename:- stringed_interface.h @@ -5,14 +27,10 @@ // These are the functions that get replaced by game-specific ones (or StringEd code) so SGE can access files etc // -#ifdef _MSC_VER -#pragma warning ( disable : 4786 ) // disable the usual stupid and pointless STL warning -#endif #include -using namespace std; unsigned char * SE_LoadFileData ( const char *psFileName, int *piLoadedLength = 0); void SE_FreeFileDataAfterLoad( unsigned char *psLoadedFile ); -int SE_BuildFileList ( const char *psStartDir, string &strResults ); +int SE_BuildFileList ( const char *psStartDir, std::string &strResults ); ////////////////// eof /////////////////// diff --git a/codemp/qcommon/tags.h b/codemp/qcommon/tags.h index d9a0d1e6f0..32bb2f4ce8 100644 --- a/codemp/qcommon/tags.h +++ b/codemp/qcommon/tags.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Filename:- tags.h // do NOT include-protect this file, or add any fields or labels, because it's included within enums and tables diff --git a/codemp/qcommon/timing.h b/codemp/qcommon/timing.h index 31a403e38e..28ef999e94 100644 --- a/codemp/qcommon/timing.h +++ b/codemp/qcommon/timing.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #ifdef _WIN32 diff --git a/codemp/qcommon/vm.cpp b/codemp/qcommon/vm.cpp index 77672f924a..c1f810d569 100644 --- a/codemp/qcommon/vm.cpp +++ b/codemp/qcommon/vm.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #define __STDC_FORMAT_MACROS #include @@ -63,10 +87,10 @@ intptr_t QDECL VM_DllSyscall( intptr_t arg, ... ) { args[0] = arg; - va_start(ap, arg); + va_start( ap, arg ); for (size_t i = 1; i < ARRAY_LEN (args); i++) - args[i] = va_arg(ap, intptr_t); - va_end(ap); + args[i] = va_arg( ap, intptr_t ); + va_end( ap ); return currentVM->legacy.syscall( args ); #else // original id code @@ -111,9 +135,9 @@ vm_t *VM_CreateLegacy( vmSlots_t vmSlot, intptr_t( *systemCalls )(intptr_t *) ) // find the legacy syscall api FS_FindPureDLL( vm->name ); - Com_Printf( "VM_CreateLegacy: %s"ARCH_STRING DLL_EXT, vm->name ); vm->dllHandle = Sys_LoadLegacyGameDll( vm->name, &vm->legacy.main, VM_DllSyscall ); + Com_Printf( "VM_CreateLegacy: %s" ARCH_STRING DLL_EXT, vm->name ); if ( vm->dllHandle ) { if ( com_developer->integer ) Com_Printf( " succeeded [0x%" PRIxPTR "]\n", (uintptr_t)vm->dllHandle ); @@ -152,7 +176,7 @@ vm_t *VM_Create( vmSlots_t vmSlot ) { FS_FindPureDLL( vm->name ); vm->dllHandle = Sys_LoadGameDll( vm->name, &vm->GetModuleAPI ); - Com_Printf( "VM_Create: %s"ARCH_STRING DLL_EXT, vm->name ); + Com_Printf( "VM_Create: %s" ARCH_STRING DLL_EXT, vm->name ); if ( vm->dllHandle ) { if ( com_developer->integer ) Com_Printf( " succeeded [0x%" PRIxPTR "+0x%" PRIxPTR "]\n", vm->dllHandle, (intptr_t)vm->GetModuleAPI - (intptr_t)vm->dllHandle ); diff --git a/codemp/qcommon/z_memman_pc.cpp b/codemp/qcommon/z_memman_pc.cpp index 49fbbf0bd3..1a1a7d525d 100644 --- a/codemp/qcommon/z_memman_pc.cpp +++ b/codemp/qcommon/z_memman_pc.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Created 3/13/03 by Brian Osman (VV) - Split Zone/Hunk from common #include "client/client.h" // hi i'm bad @@ -168,12 +190,10 @@ void *Z_Malloc(int iSize, memtag_t eTag, qboolean bZeroit /* = qfalse */, int iU zoneHeader_t *pMemory = NULL; while (pMemory == NULL) { - #ifdef _WIN32 if (gbMemFreeupOccured) { - Sleep(1000); // sleep for a second, so Windows has a chance to shuffle mem to de-swiss-cheese it + Sys_Sleep(1000); // sleep for a second, so Windows has a chance to shuffle mem to de-swiss-cheese it } - #endif if (bZeroit) { pMemory = (zoneHeader_t *) calloc ( iRealSize, 1 ); diff --git a/codemp/rd-common/mdx_format.h b/codemp/rd-common/mdx_format.h index 990d9314d7..13cf02215b 100644 --- a/codemp/rd-common/mdx_format.h +++ b/codemp/rd-common/mdx_format.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once // Filename:- mdx_format.h diff --git a/codemp/rd-common/tr_common.h b/codemp/rd-common/tr_common.h index 2717305c07..2f7be801a0 100644 --- a/codemp/rd-common/tr_common.h +++ b/codemp/rd-common/tr_common.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #ifndef TR_COMMON_H #define TR_COMMON_H diff --git a/codemp/rd-common/tr_font.cpp b/codemp/rd-common/tr_font.cpp index 4d8af4ef05..8c33625ed9 100644 --- a/codemp/rd-common/tr_font.cpp +++ b/codemp/rd-common/tr_font.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "qcommon/sstring.h" // stl string class won't compile in here (MS shite), so use Gil's. #include "tr_local.h" #include "tr_font.h" @@ -73,8 +95,8 @@ SBCSOverrideLanguages_t g_SBCSOverrideLanguages[]= struct ThaiCodes_t { - map m_mapValidCodes; - vector m_viGlyphWidths; + std::map m_mapValidCodes; + std::vector m_viGlyphWidths; sstring_t m_strInitFailureReason; // so we don't have to keep retrying to work this out void Clear( void ) @@ -93,7 +115,7 @@ struct ThaiCodes_t // int GetValidIndex( int iCode ) { - map ::iterator it = m_mapValidCodes.find( iCode ); + std::map ::iterator it = m_mapValidCodes.find( iCode ); if (it != m_mapValidCodes.end()) { return (*it).second; @@ -240,8 +262,8 @@ float RoundTenth( float fValue ) int g_iCurrentFontIndex; // entry 0 is reserved index for missing/invalid, else ++ with each new font registered -vector g_vFontArray; -typedef map FontIndexMap_t; +std::vector g_vFontArray; +typedef std::map FontIndexMap_t; FontIndexMap_t g_mapFontIndexes; int g_iNonScaledCharRange; // this is used with auto-scaling of asian fonts, anything below this number is preserved in scale, anything above is scaled down by 0.75f @@ -1584,7 +1606,7 @@ void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, c { vec4_t color; Com_Memcpy( color, g_color_table[colour], sizeof( color ) ); - color[3] = rgba[3]; + color[3] = rgba ? rgba[3] : 1.0f; RE_SetColor( color ); } break; @@ -1636,7 +1658,7 @@ void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, c break; } } - //let it remember the old color //RE_SetColor(NULL);; + //let it remember the old color //RE_SetColor(NULL); } int RE_RegisterFont(const char *psName) @@ -1714,7 +1736,7 @@ void R_ReloadFonts_f(void) { // first, grab all the currently-registered fonts IN THE ORDER THEY WERE REGISTERED... // - vector vstrFonts; + std::vector vstrFonts; int iFontToFind; for (iFontToFind = 1; iFontToFind < g_iCurrentFontIndex; iFontToFind++) diff --git a/codemp/rd-common/tr_font.h b/codemp/rd-common/tr_font.h index 4be4dd884b..0017e18395 100644 --- a/codemp/rd-common/tr_font.h +++ b/codemp/rd-common/tr_font.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // Filename:- tr_font.h // // font support diff --git a/codemp/rd-common/tr_image_jpg.cpp b/codemp/rd-common/tr_image_jpg.cpp index 9e35130c1a..40da2d8d5f 100644 --- a/codemp/rd-common/tr_image_jpg.cpp +++ b/codemp/rd-common/tr_image_jpg.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "tr_common.h" /* @@ -7,8 +31,12 @@ * (stdio.h is sufficient on ANSI-conforming systems.) * You may also wish to include "jerror.h". */ +#ifdef USE_INTERNAL_JPEG #define JPEG_INTERNALS #include "jpeg-8c/jpeglib.h" +#else +#include +#endif static void R_JPGErrorExit(j_common_ptr cinfo) { @@ -57,10 +85,7 @@ void LoadJPG( const char *filename, unsigned char **pic, int *width, int *height unsigned int pixelcount, memcount; unsigned int sindex, dindex; byte *out; - union { - byte *b; - void *v; - } fbuffer; + fileBuffer_t fbuffer; byte *buf; /* In this example we want to open the input file before doing anything else, * so that the setjmp() error recovery below can assume the file is open. diff --git a/codemp/rd-common/tr_image_load.cpp b/codemp/rd-common/tr_image_load.cpp index ee5f9a75fd..d34a7c7455 100644 --- a/codemp/rd-common/tr_image_load.cpp +++ b/codemp/rd-common/tr_image_load.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "tr_common.h" const int MAX_IMAGE_LOADERS = 10; diff --git a/codemp/rd-common/tr_image_png.cpp b/codemp/rd-common/tr_image_png.cpp index 7a566fcd3c..7b89b787c6 100644 --- a/codemp/rd-common/tr_image_png.cpp +++ b/codemp/rd-common/tr_image_png.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "tr_common.h" #include diff --git a/codemp/rd-common/tr_image_tga.cpp b/codemp/rd-common/tr_image_tga.cpp index 1f80579b4c..09ff7759cd 100644 --- a/codemp/rd-common/tr_image_tga.cpp +++ b/codemp/rd-common/tr_image_tga.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "tr_common.h" // My TGA loader... diff --git a/codemp/rd-common/tr_noise.cpp b/codemp/rd-common/tr_noise.cpp index 41c00313ba..8ec0b428a4 100644 --- a/codemp/rd-common/tr_noise.cpp +++ b/codemp/rd-common/tr_noise.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_noise.c #include "tr_common.h" diff --git a/codemp/rd-common/tr_public.h b/codemp/rd-common/tr_public.h index 684f7561e4..ac62599d31 100644 --- a/codemp/rd-common/tr_public.h +++ b/codemp/rd-common/tr_public.h @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #ifndef TR_PUBLIC_H #define TR_PUBLIC_H @@ -6,7 +30,7 @@ #include "../qcommon/qcommon.h" #include "../ghoul2/ghoul2_shared.h" -#define REF_API_VERSION 5 +#define REF_API_VERSION 7 // // these are the functions exported by the refresh module @@ -293,13 +317,14 @@ typedef struct refimport_s { qboolean (*CGVMLoaded) ( void ); int (*CGVM_RagCallback) ( int callType ); - // ugly win32 backend - void * (*GetWinVars) ( void ); //g_wv + // window handling + window_t (*WIN_Init) ( const windowDesc_t *desc, glconfig_t *glConfig ); + void (*WIN_SetGamma) ( glconfig_t *glConfig, byte red[256], byte green[256], byte blue[256] ); + void (*WIN_Present) ( window_t *window ); + void (*WIN_Shutdown) ( void ); - // input event handling - void (*IN_Init) ( void *windowData ); - void (*IN_Shutdown) ( void ); - void (*IN_Restart) ( void ); + // OpenGL-specific + void * (*GL_GetProcAddress) ( const char *name ); // gpvCachedMapDiskImage void * (*CM_GetCachedMapDiskImage) ( void ); @@ -309,7 +334,7 @@ typedef struct refimport_s { // even the server will have this, which is a singleton // so before assigning to this in R_Init, check if it's NULL! - IHeapAllocator * (*GetG2VertSpaceServer) ( void ); + IHeapAllocator *(*GetG2VertSpaceServer) ( void ); // Persistent data store bool (*PD_Store) ( const char *name, const void *data, size_t size ); diff --git a/codemp/rd-common/tr_types.h b/codemp/rd-common/tr_types.h index 229321775f..1a454ce998 100644 --- a/codemp/rd-common/tr_types.h +++ b/codemp/rd-common/tr_types.h @@ -1,7 +1,28 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ -// Copyright (C) 1999-2000 Id Software, Inc. -// +#pragma once #include "../qcommon/q_shared.h" @@ -131,9 +152,6 @@ typedef struct miniRefEntity_s } miniRefEntity_t; -#ifdef _MSC_VER -#pragma warning (disable : 4201 ) -#endif typedef struct refEntity_s { // this stucture must remain identical as the miniRefEntity_t // diff --git a/codemp/rd-dedicated/G2_API.cpp b/codemp/rd-dedicated/G2_API.cpp index 0ab2a4febe..eb66cbc221 100644 --- a/codemp/rd-dedicated/G2_API.cpp +++ b/codemp/rd-dedicated/G2_API.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "qcommon/MiniHeap.h" #include "ghoul2/G2.h" @@ -7,15 +29,8 @@ #include "tr_local.h" #include - -#ifdef _MSC_VER -#pragma warning (push, 3) //go back down to 3 for the stl include -#endif #include #include -#ifdef _MSC_VER -#pragma warning (pop) -#endif #ifdef _FULL_G2_LEAK_CHECKING int g_Ghoul2Allocations = 0; @@ -288,9 +303,9 @@ qboolean G2API_OverrideServerWithClientData(CGhoul2Info_v& ghoul2, int modelInde class Ghoul2InfoArray : public IGhoul2InfoArray { - vector mInfos[MAX_G2_MODELS]; + std::vector mInfos[MAX_G2_MODELS]; int mIds[MAX_G2_MODELS]; - list mFreeIndecies; + std::list mFreeIndecies; void DeleteLow(int idx) { for (size_t model=0; model< mInfos[idx].size(); model++) @@ -396,9 +411,9 @@ class Ghoul2InfoArray : public IGhoul2InfoArray DeleteLow(handle&G2_INDEX_MASK); } } - vector &Get(int handle) + std::vector &Get(int handle) { - static vector null; + static std::vector null; assert(handle>0); //null handle assert((handle&G2_INDEX_MASK)>=0&&(handle&G2_INDEX_MASK) &Get(int handle) const + const std::vector &Get(int handle) const { assert(handle>0); assert(mIds[handle&G2_INDEX_MASK]==handle); // not a valid handle, could be old or garbage @@ -619,7 +634,7 @@ int G2API_InitGhoul2Model(CGhoul2Info_v **ghoul2Ptr, const char *fileName, int m } else { - G2_Init_Bone_List(ghoul2[model].mBlist); + G2_Init_Bone_List(ghoul2[model].mBlist, ghoul2[model].aHeader->numBones); G2_Init_Bolt_List(ghoul2[model].mBltlist); ghoul2[model].mCustomShader = customShader; ghoul2[model].mCustomSkin = customSkin; @@ -1847,20 +1862,18 @@ qboolean G2API_GetBoltMatrix(CGhoul2Info_v &ghoul2, const int modelIndex, const if (!gG2_GBMUseSPMethod) { //this is horribly stupid and I hate it. But lots of game code is written to assume this 90 degree offset thing. - mdxaBone_t rotMat, tempMatrix; - vec3_t newangles = {0,270,0}; - Create_Matrix(newangles, &rotMat); - // make the model space matrix we have for this bolt into a world matrix - Multiply_3x4Matrix(&tempMatrix, &worldMatrix, &bolt); - vec3_t origin; - origin[0] = tempMatrix.matrix[0][3]; - origin[1] = tempMatrix.matrix[1][3]; - origin[2] = tempMatrix.matrix[2][3]; - tempMatrix.matrix[0][3] = tempMatrix.matrix[1][3] = tempMatrix.matrix[2][3] = 0; - Multiply_3x4Matrix(matrix, &tempMatrix, &rotMat); - matrix->matrix[0][3] = origin[0]; - matrix->matrix[1][3] = origin[1]; - matrix->matrix[2][3] = origin[2]; + float ftemp; + ftemp = matrix->matrix[0][0]; + matrix->matrix[0][0] = -matrix->matrix[0][1]; + matrix->matrix[0][1] = ftemp; + + ftemp = matrix->matrix[1][0]; + matrix->matrix[1][0] = -matrix->matrix[1][1]; + matrix->matrix[1][1] = ftemp; + + ftemp = matrix->matrix[2][0]; + matrix->matrix[2][0] = -matrix->matrix[2][1]; + matrix->matrix[2][1] = ftemp; } else { //reset it diff --git a/codemp/rd-dedicated/G2_bolts.cpp b/codemp/rd-dedicated/G2_bolts.cpp index 2f22d6ce43..ab08223d41 100644 --- a/codemp/rd-dedicated/G2_bolts.cpp +++ b/codemp/rd-dedicated/G2_bolts.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "ghoul2/G2.h" #include "ghoul2/g2_local.h" diff --git a/codemp/rd-dedicated/G2_bones.cpp b/codemp/rd-dedicated/G2_bones.cpp index 8cd60a9824..65c5d67ce6 100644 --- a/codemp/rd-dedicated/G2_bones.cpp +++ b/codemp/rd-dedicated/G2_bones.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "qcommon/matcomp.h" #include "ghoul2/G2.h" @@ -938,8 +960,8 @@ qboolean G2_Pause_Bone_Anim(CGhoul2Info *ghlInfo, boneInfo_v &blist, const char // are we pausing or un pausing? if (blist[index].pauseTime) { - int startFrame, endFrame, flags; - float currentFrame, animSpeed; + int startFrame = 0, endFrame = 0, flags = 0; + float currentFrame = 0.0f, animSpeed = 1.0f; // figure out what frame we are on now G2_Get_Bone_Anim(ghlInfo, blist, boneName, blist[index].pauseTime, ¤tFrame, &startFrame, &endFrame, &flags, &animSpeed, NULL, 0); @@ -1232,7 +1254,7 @@ enum ERagState }; static int ragState; -static vector rag; // once we get the dependents precomputed this can be local +static std::vector rag; // once we get the dependents precomputed this can be local static void G2_Generate_MatrixRag( @@ -1592,7 +1614,7 @@ void G2_ResetRagDoll(CGhoul2Info_v &ghoul2V) boneInfo_v &blist = ghoul2.mBlist; #if 1 //Eh, screw it. Ragdoll does a lot of terrible things to the bones that probably aren't directly reversible, so just reset it all. - G2_Init_Bone_List(blist); + G2_Init_Bone_List(blist, ghoul2.aHeader->numBones); #else //The anims on every bone are messed up too, as are the angles. There's not really any way to get back to a normal state, so just clear the list //and let them re-set their anims/angles gameside. int i = 0; @@ -4614,9 +4636,10 @@ qboolean G2_IKMove(CGhoul2Info_v &ghoul2, int time, sharedIKMoveParams_t *params } // set the bone list to all unused so the bone transformation routine ignores it. -void G2_Init_Bone_List(boneInfo_v &blist) +void G2_Init_Bone_List(boneInfo_v &blist, int numBones) { blist.clear(); + blist.reserve(numBones); } void G2_RemoveRedundantBoneOverrides(boneInfo_v &blist, int *activeBones) diff --git a/codemp/rd-dedicated/G2_misc.cpp b/codemp/rd-dedicated/G2_misc.cpp index b528d74e3c..4a06c54317 100644 --- a/codemp/rd-dedicated/G2_misc.cpp +++ b/codemp/rd-dedicated/G2_misc.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "qcommon/matcomp.h" #include "ghoul2/G2.h" #include "qcommon/MiniHeap.h" @@ -15,8 +37,8 @@ static int CurrentTag=GORE_TAG_UPPER+1; static int CurrentTagUpper=GORE_TAG_UPPER; -static map GoreRecords; -static map,int> GoreTagsTemp; // this is a surface index to gore tag map used only +static std::map GoreRecords; +static std::map,int> GoreTagsTemp; // this is a surface index to gore tag map used only // temporarily during the generation phase so we reuse gore tags per LOD int goreModelIndex; @@ -43,7 +65,7 @@ int AllocGoreRecord() while (GoreRecords.size()>MAX_GORE_RECORDS) { int tagHigh=(*GoreRecords.begin()).first&GORE_TAG_MASK; - map::iterator it; + std::map::iterator it; GoreTextureCoordinates *gTC; it = GoreRecords.begin(); @@ -85,7 +107,7 @@ void ResetGoreTag() GoreTextureCoordinates *FindGoreRecord(int tag) { - map::iterator i=GoreRecords.find(tag); + std::map::iterator i=GoreRecords.find(tag); if (i!=GoreRecords.end()) { return &(*i).second; @@ -105,11 +127,11 @@ void DeleteGoreRecord(int tag) } static int CurrentGoreSet=1; // this is a UUID for gore sets -static map GoreSets; // map from uuid to goreset +static std::map GoreSets; // map from uuid to goreset CGoreSet *FindGoreSet(int goreSetTag) { - map::iterator f=GoreSets.find(goreSetTag); + std::map::iterator f=GoreSets.find(goreSetTag); if (f!=GoreSets.end()) { return (*f).second; @@ -127,7 +149,7 @@ CGoreSet *NewGoreSet() void DeleteGoreSet(int goreSetTag) { - map::iterator f=GoreSets.find(goreSetTag); + std::map::iterator f=GoreSets.find(goreSetTag); if (f!=GoreSets.end()) { if ( (*f).second->mRefCount == 0 || (*f).second->mRefCount - 1 == 0 ) @@ -145,7 +167,7 @@ void DeleteGoreSet(int goreSetTag) CGoreSet::~CGoreSet() { - multimap::iterator i; + std::multimap::iterator i; for (i=mGoreRecords.begin();i!=mGoreRecords.end();++i) { DeleteGoreRecord((*i).second.mGoreTag); @@ -154,10 +176,6 @@ CGoreSet::~CGoreSet() #endif // _SOF2 const mdxaBone_t &EvalBoneCache(int index,CBoneCache *boneCache); - -#ifdef _MSC_VER -#pragma warning(disable : 4512) //assignment op could not be genereated -#endif class CTraceSurface { public: @@ -171,11 +189,7 @@ class CTraceSurface int entNum; int modelIndex; skin_t *skin; -#ifdef _WIN32 - struct shader_t *cust_shader; -#else shader_t *cust_shader; -#endif size_t *TransformedVertsArray; int traceFlags; bool hitOne; @@ -925,7 +939,7 @@ void G2_GorePolys( const mdxmSurface_t *surface, CTraceSurface &TS, const mdxmSu } int newTag; - map,int>::iterator f=GoreTagsTemp.find(pair(goreModelIndex,TS.surfaceNum)); + std::map,int>::iterator f=GoreTagsTemp.find(std::make_pair(goreModelIndex,TS.surfaceNum)); if (f==GoreTagsTemp.end()) // need to generate a record { newTag=AllocGoreRecord(); @@ -965,8 +979,8 @@ void G2_GorePolys( const mdxmSurface_t *surface, CTraceSurface &TS, const mdxmSu add.mGoreGrowFactor = ( 1.0f - TS.gore->goreScaleStartFraction) / (float)(TS.gore->growDuration); //curscale = (curtime-mGoreGrowStartTime)*mGoreGrowFactor; add.mGoreGrowOffset = TS.gore->goreScaleStartFraction; - goreSet->mGoreRecords.insert(pair(TS.surfaceNum,add)); - GoreTagsTemp[pair(goreModelIndex,TS.surfaceNum)]=newTag; + goreSet->mGoreRecords.insert(std::make_pair(TS.surfaceNum,add)); + GoreTagsTemp[std::make_pair(goreModelIndex,TS.surfaceNum)]=newTag; } else { diff --git a/codemp/rd-dedicated/G2_surfaces.cpp b/codemp/rd-dedicated/G2_surfaces.cpp index ac3ba93e67..2019e09440 100644 --- a/codemp/rd-dedicated/G2_surfaces.cpp +++ b/codemp/rd-dedicated/G2_surfaces.cpp @@ -1,10 +1,29 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "rd-common/tr_types.h" #include "ghoul2/G2.h" #include "ghoul2/g2_local.h" #include "tr_local.h" -#ifdef _MSC_VER -#pragma warning(disable : 4512) //assignment op could not be genereated -#endif class CConstructBoneList { @@ -619,7 +638,7 @@ int G2_IsSurfaceRendered(CGhoul2Info *ghlInfo, const char *surfaceName, surfaceI while (surfNum != -1) { const mdxmSurface_t *parentSurf; - int parentFlags; + int parentFlags = 0; const mdxmSurfHierarchy_t *parentSurfInfo; parentSurfInfo = (mdxmSurfHierarchy_t *)((byte *)surfIndexes + surfIndexes->offsets[surfNum]); diff --git a/codemp/rd-dedicated/glext.h b/codemp/rd-dedicated/glext.h deleted file mode 100644 index e656e49b1a..0000000000 --- a/codemp/rd-dedicated/glext.h +++ /dev/null @@ -1,3034 +0,0 @@ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** License Applicability. Except to the extent portions of this file are -** made subject to an alternative license as permitted in the SGI Free -** Software License B, Version 1.1 (the "License"), the contents of this -** file are subject only to the provisions of the License. You may not use -** this file except in compliance with the License. You may obtain a copy -** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 -** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: -** -** http://oss.sgi.com/projects/FreeB -** -** Note that, as provided in the License, the Software is distributed on an -** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS -** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND -** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A -** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. -** -** Original Code. The Original Code is: OpenGL Sample Implementation, -** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, -** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. -** Copyright in any portions created by third parties is as indicated -** elsewhere herein. All Rights Reserved. -** -** Additional Notice Provisions: This software was created using the -** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has -** not been independently verified as being compliant with the OpenGL(R) -** version 1.2.1 Specification. -*/ - -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) -#define WIN32_LEAN_AND_MEAN 1 -#include -#endif - -#ifndef APIENTRY -#define APIENTRY -#endif - -/*************************************************************/ - -/* Header file version number, required by OpenGL ABI for Linux */ -#define GL_GLEXT_VERSION 7 - -#ifndef GL_VERSION_1_2 -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_FUNC_ADD 0x8006 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_BLEND_EQUATION 0x8009 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_CONVOLUTION_1D 0x8010 -#define GL_CONVOLUTION_2D 0x8011 -#define GL_SEPARABLE_2D 0x8012 -#define GL_CONVOLUTION_BORDER_MODE 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS 0x8015 -#define GL_REDUCE 0x8016 -#define GL_CONVOLUTION_FORMAT 0x8017 -#define GL_CONVOLUTION_WIDTH 0x8018 -#define GL_CONVOLUTION_HEIGHT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 -#define GL_HISTOGRAM 0x8024 -#define GL_PROXY_HISTOGRAM 0x8025 -#define GL_HISTOGRAM_WIDTH 0x8026 -#define GL_HISTOGRAM_FORMAT 0x8027 -#define GL_HISTOGRAM_RED_SIZE 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C -#define GL_HISTOGRAM_SINK 0x802D -#define GL_MINMAX 0x802E -#define GL_MINMAX_FORMAT 0x802F -#define GL_MINMAX_SINK 0x8030 -#define GL_TABLE_TOO_LARGE 0x8031 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_RESCALE_NORMAL 0x803A -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_COLOR_MATRIX 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA -#define GL_COLOR_TABLE 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 -#define GL_PROXY_COLOR_TABLE 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 -#define GL_COLOR_TABLE_SCALE 0x80D6 -#define GL_COLOR_TABLE_BIAS 0x80D7 -#define GL_COLOR_TABLE_FORMAT 0x80D8 -#define GL_COLOR_TABLE_WIDTH 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#endif - -#ifndef GL_ARB_multitexture -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_TEXTURE4_ARB 0x84C4 -#define GL_TEXTURE5_ARB 0x84C5 -#define GL_TEXTURE6_ARB 0x84C6 -#define GL_TEXTURE7_ARB 0x84C7 -#define GL_TEXTURE8_ARB 0x84C8 -#define GL_TEXTURE9_ARB 0x84C9 -#define GL_TEXTURE10_ARB 0x84CA -#define GL_TEXTURE11_ARB 0x84CB -#define GL_TEXTURE12_ARB 0x84CC -#define GL_TEXTURE13_ARB 0x84CD -#define GL_TEXTURE14_ARB 0x84CE -#define GL_TEXTURE15_ARB 0x84CF -#define GL_TEXTURE16_ARB 0x84D0 -#define GL_TEXTURE17_ARB 0x84D1 -#define GL_TEXTURE18_ARB 0x84D2 -#define GL_TEXTURE19_ARB 0x84D3 -#define GL_TEXTURE20_ARB 0x84D4 -#define GL_TEXTURE21_ARB 0x84D5 -#define GL_TEXTURE22_ARB 0x84D6 -#define GL_TEXTURE23_ARB 0x84D7 -#define GL_TEXTURE24_ARB 0x84D8 -#define GL_TEXTURE25_ARB 0x84D9 -#define GL_TEXTURE26_ARB 0x84DA -#define GL_TEXTURE27_ARB 0x84DB -#define GL_TEXTURE28_ARB 0x84DC -#define GL_TEXTURE29_ARB 0x84DD -#define GL_TEXTURE30_ARB 0x84DE -#define GL_TEXTURE31_ARB 0x84DF -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 -#endif - -#ifndef GL_ARB_transpose_matrix -#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 -#endif - -#ifndef GL_ARB_multisample -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 -#endif - -#ifndef GL_ARB_texture_cube_map -#define GL_NORMAL_MAP_ARB 0x8511 -#define GL_REFLECTION_MAP_ARB 0x8512 -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C -#endif - -#ifndef GL_ARB_texture_compression -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 -#endif - -#ifndef GL_ARB_vertex_blend -#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 -#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 -#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 -#define GL_VERTEX_BLEND_ARB 0x86A7 -#define GL_CURRENT_WEIGHT_ARB 0x86A8 -#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 -#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA -#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB -#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC -#define GL_WEIGHT_ARRAY_ARB 0x86AD -#define GL_MODELVIEW0_ARB 0x1700 -#define GL_MODELVIEW1_ARB 0x850A -#define GL_MODELVIEW2_ARB 0x8722 -#define GL_MODELVIEW3_ARB 0x8723 -#define GL_MODELVIEW4_ARB 0x8724 -#define GL_MODELVIEW5_ARB 0x8725 -#define GL_MODELVIEW6_ARB 0x8726 -#define GL_MODELVIEW7_ARB 0x8727 -#define GL_MODELVIEW8_ARB 0x8728 -#define GL_MODELVIEW9_ARB 0x8729 -#define GL_MODELVIEW10_ARB 0x872A -#define GL_MODELVIEW11_ARB 0x872B -#define GL_MODELVIEW12_ARB 0x872C -#define GL_MODELVIEW13_ARB 0x872D -#define GL_MODELVIEW14_ARB 0x872E -#define GL_MODELVIEW15_ARB 0x872F -#define GL_MODELVIEW16_ARB 0x8730 -#define GL_MODELVIEW17_ARB 0x8731 -#define GL_MODELVIEW18_ARB 0x8732 -#define GL_MODELVIEW19_ARB 0x8733 -#define GL_MODELVIEW20_ARB 0x8734 -#define GL_MODELVIEW21_ARB 0x8735 -#define GL_MODELVIEW22_ARB 0x8736 -#define GL_MODELVIEW23_ARB 0x8737 -#define GL_MODELVIEW24_ARB 0x8738 -#define GL_MODELVIEW25_ARB 0x8739 -#define GL_MODELVIEW26_ARB 0x873A -#define GL_MODELVIEW27_ARB 0x873B -#define GL_MODELVIEW28_ARB 0x873C -#define GL_MODELVIEW29_ARB 0x873D -#define GL_MODELVIEW30_ARB 0x873E -#define GL_MODELVIEW31_ARB 0x873F -#endif - -#ifndef GL_EXT_abgr -#define GL_ABGR_EXT 0x8000 -#endif - -#ifndef GL_EXT_blend_color -#define GL_CONSTANT_COLOR_EXT 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 -#define GL_CONSTANT_ALPHA_EXT 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 -#define GL_BLEND_COLOR_EXT 0x8005 -#endif - -#ifndef GL_EXT_polygon_offset -#define GL_POLYGON_OFFSET_EXT 0x8037 -#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 -#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 -#endif - -#ifndef GL_EXT_texture -#define GL_ALPHA4_EXT 0x803B -#define GL_ALPHA8_EXT 0x803C -#define GL_ALPHA12_EXT 0x803D -#define GL_ALPHA16_EXT 0x803E -#define GL_LUMINANCE4_EXT 0x803F -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE12_EXT 0x8041 -#define GL_LUMINANCE16_EXT 0x8042 -#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 -#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 -#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 -#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 -#define GL_INTENSITY_EXT 0x8049 -#define GL_INTENSITY4_EXT 0x804A -#define GL_INTENSITY8_EXT 0x804B -#define GL_INTENSITY12_EXT 0x804C -#define GL_INTENSITY16_EXT 0x804D -#define GL_RGB2_EXT 0x804E -#define GL_RGB4_EXT 0x804F -#define GL_RGB5_EXT 0x8050 -#define GL_RGB8_EXT 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB12_EXT 0x8053 -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA2_EXT 0x8055 -#define GL_RGBA4_EXT 0x8056 -#define GL_RGB5_A1_EXT 0x8057 -#define GL_RGBA8_EXT 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGBA12_EXT 0x805A -#define GL_RGBA16_EXT 0x805B -#define GL_TEXTURE_RED_SIZE_EXT 0x805C -#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D -#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E -#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 -#define GL_REPLACE_EXT 0x8062 -#define GL_PROXY_TEXTURE_1D_EXT 0x8063 -#define GL_PROXY_TEXTURE_2D_EXT 0x8064 -#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 -#endif - -#ifndef GL_EXT_texture3D -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_SKIP_IMAGES_EXT 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_DEPTH_EXT 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_TEXTURE_WRAP_R_EXT 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 -#endif - -#ifndef GL_SGIS_texture_filter4 -#define GL_FILTER4_SGIS 0x8146 -#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 -#endif - -#ifndef GL_EXT_subtexture -#endif - -#ifndef GL_EXT_copy_texture -#endif - -#ifndef GL_EXT_histogram -#define GL_HISTOGRAM_EXT 0x8024 -#define GL_PROXY_HISTOGRAM_EXT 0x8025 -#define GL_HISTOGRAM_WIDTH_EXT 0x8026 -#define GL_HISTOGRAM_FORMAT_EXT 0x8027 -#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C -#define GL_HISTOGRAM_SINK_EXT 0x802D -#define GL_MINMAX_EXT 0x802E -#define GL_MINMAX_FORMAT_EXT 0x802F -#define GL_MINMAX_SINK_EXT 0x8030 -#define GL_TABLE_TOO_LARGE_EXT 0x8031 -#endif - -#ifndef GL_EXT_convolution -#define GL_CONVOLUTION_1D_EXT 0x8010 -#define GL_CONVOLUTION_2D_EXT 0x8011 -#define GL_SEPARABLE_2D_EXT 0x8012 -#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 -#define GL_REDUCE_EXT 0x8016 -#define GL_CONVOLUTION_FORMAT_EXT 0x8017 -#define GL_CONVOLUTION_WIDTH_EXT 0x8018 -#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 -#endif - -#ifndef GL_SGI_color_matrix -#define GL_COLOR_MATRIX_SGI 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB -#endif - -#ifndef GL_SGI_color_table -#define GL_COLOR_TABLE_SGI 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 -#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 -#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 -#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 -#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 -#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF -#endif - -#ifndef GL_SGIS_pixel_texture -#define GL_PIXEL_TEXTURE_SGIS 0x8353 -#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 -#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 -#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 -#endif - -#ifndef GL_SGIX_pixel_texture -#define GL_PIXEL_TEX_GEN_SGIX 0x8139 -#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B -#endif - -#ifndef GL_SGIS_texture4D -#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 -#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 -#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 -#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 -#define GL_TEXTURE_4D_SGIS 0x8134 -#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 -#define GL_TEXTURE_4DSIZE_SGIS 0x8136 -#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 -#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 -#define GL_TEXTURE_4D_BINDING_SGIS 0x814F -#endif - -#ifndef GL_SGI_texture_color_table -#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC -#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD -#endif - -#ifndef GL_EXT_cmyka -#define GL_CMYK_EXT 0x800C -#define GL_CMYKA_EXT 0x800D -#define GL_PACK_CMYK_HINT_EXT 0x800E -#define GL_UNPACK_CMYK_HINT_EXT 0x800F -#endif - -#ifndef GL_EXT_texture_object -#define GL_TEXTURE_PRIORITY_EXT 0x8066 -#define GL_TEXTURE_RESIDENT_EXT 0x8067 -#define GL_TEXTURE_1D_BINDING_EXT 0x8068 -#define GL_TEXTURE_2D_BINDING_EXT 0x8069 -#define GL_TEXTURE_3D_BINDING_EXT 0x806A -#endif - -#ifndef GL_SGIS_detail_texture -#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 -#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 -#define GL_LINEAR_DETAIL_SGIS 0x8097 -#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 -#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 -#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A -#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B -#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C -#endif - -#ifndef GL_SGIS_sharpen_texture -#define GL_LINEAR_SHARPEN_SGIS 0x80AD -#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE -#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF -#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 -#endif - -#ifndef GL_EXT_packed_pixels -#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 -#endif - -#ifndef GL_SGIS_texture_lod -#define GL_TEXTURE_MIN_LOD_SGIS 0x813A -#define GL_TEXTURE_MAX_LOD_SGIS 0x813B -#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C -#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D -#endif - -#ifndef GL_SGIS_multisample -#define GL_MULTISAMPLE_SGIS 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F -#define GL_SAMPLE_MASK_SGIS 0x80A0 -#define GL_1PASS_SGIS 0x80A1 -#define GL_2PASS_0_SGIS 0x80A2 -#define GL_2PASS_1_SGIS 0x80A3 -#define GL_4PASS_0_SGIS 0x80A4 -#define GL_4PASS_1_SGIS 0x80A5 -#define GL_4PASS_2_SGIS 0x80A6 -#define GL_4PASS_3_SGIS 0x80A7 -#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 -#define GL_SAMPLES_SGIS 0x80A9 -#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA -#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB -#define GL_SAMPLE_PATTERN_SGIS 0x80AC -#endif - -#ifndef GL_EXT_rescale_normal -#define GL_RESCALE_NORMAL_EXT 0x803A -#endif - -#ifndef GL_EXT_vertex_array -#define GL_VERTEX_ARRAY_EXT 0x8074 -#define GL_NORMAL_ARRAY_EXT 0x8075 -#define GL_COLOR_ARRAY_EXT 0x8076 -#define GL_INDEX_ARRAY_EXT 0x8077 -#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 -#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 -#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A -#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B -#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C -#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D -#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E -#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F -#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 -#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 -#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 -#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 -#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 -#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 -#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 -#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 -#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A -#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B -#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C -#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D -#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E -#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F -#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 -#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 -#endif - -#ifndef GL_EXT_misc_attribute -#endif - -#ifndef GL_SGIS_generate_mipmap -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 -#endif - -#ifndef GL_SGIX_clipmap -#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 -#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 -#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 -#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 -#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 -#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 -#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 -#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 -#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 -#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D -#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E -#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F -#endif - -#ifndef GL_SGIX_shadow -#define GL_TEXTURE_COMPARE_SGIX 0x819A -#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B -#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C -#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D -#endif - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_CLAMP_TO_EDGE_SGIS 0x812F -#endif - -#ifndef GL_SGIS_texture_border_clamp -#define GL_CLAMP_TO_BORDER_SGIS 0x812D -#endif - -#ifndef GL_EXT_blend_minmax -#define GL_FUNC_ADD_EXT 0x8006 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#define GL_BLEND_EQUATION_EXT 0x8009 -#endif - -#ifndef GL_EXT_blend_subtract -#define GL_FUNC_SUBTRACT_EXT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B -#endif - -#ifndef GL_EXT_blend_logic_op -#endif - -#ifndef GL_SGIX_interlace -#define GL_INTERLACE_SGIX 0x8094 -#endif - -#ifndef GL_SGIX_pixel_tiles -#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E -#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F -#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 -#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 -#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 -#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 -#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 -#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 -#endif - -#ifndef GL_SGIS_texture_select -#define GL_DUAL_ALPHA4_SGIS 0x8110 -#define GL_DUAL_ALPHA8_SGIS 0x8111 -#define GL_DUAL_ALPHA12_SGIS 0x8112 -#define GL_DUAL_ALPHA16_SGIS 0x8113 -#define GL_DUAL_LUMINANCE4_SGIS 0x8114 -#define GL_DUAL_LUMINANCE8_SGIS 0x8115 -#define GL_DUAL_LUMINANCE12_SGIS 0x8116 -#define GL_DUAL_LUMINANCE16_SGIS 0x8117 -#define GL_DUAL_INTENSITY4_SGIS 0x8118 -#define GL_DUAL_INTENSITY8_SGIS 0x8119 -#define GL_DUAL_INTENSITY12_SGIS 0x811A -#define GL_DUAL_INTENSITY16_SGIS 0x811B -#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C -#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D -#define GL_QUAD_ALPHA4_SGIS 0x811E -#define GL_QUAD_ALPHA8_SGIS 0x811F -#define GL_QUAD_LUMINANCE4_SGIS 0x8120 -#define GL_QUAD_LUMINANCE8_SGIS 0x8121 -#define GL_QUAD_INTENSITY4_SGIS 0x8122 -#define GL_QUAD_INTENSITY8_SGIS 0x8123 -#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 -#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 -#endif - -#ifndef GL_SGIX_sprite -#define GL_SPRITE_SGIX 0x8148 -#define GL_SPRITE_MODE_SGIX 0x8149 -#define GL_SPRITE_AXIS_SGIX 0x814A -#define GL_SPRITE_TRANSLATION_SGIX 0x814B -#define GL_SPRITE_AXIAL_SGIX 0x814C -#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D -#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E -#endif - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E -#endif - -#ifndef GL_SGIS_point_parameters -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MIN_SGIS 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_SIZE_MAX_SGIS 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 -#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 -#endif - -#ifndef GL_SGIX_instruments -#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 -#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 -#endif - -#ifndef GL_SGIX_texture_scale_bias -#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 -#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A -#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B -#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C -#endif - -#ifndef GL_SGIX_framezoom -#define GL_FRAMEZOOM_SGIX 0x818B -#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C -#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D -#endif - -#ifndef GL_SGIX_tag_sample_buffer -#endif - -#ifndef GL_FfdMaskSGIX -#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 -#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 -#endif - -#ifndef GL_SGIX_polynomial_ffd -#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 -#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 -#define GL_DEFORMATIONS_MASK_SGIX 0x8196 -#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 -#endif - -#ifndef GL_SGIX_reference_plane -#define GL_REFERENCE_PLANE_SGIX 0x817D -#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E -#endif - -#ifndef GL_SGIX_flush_raster -#endif - -#ifndef GL_SGIX_depth_texture -#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 -#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 -#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 -#endif - -#ifndef GL_SGIS_fog_function -#define GL_FOG_FUNC_SGIS 0x812A -#define GL_FOG_FUNC_POINTS_SGIS 0x812B -#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C -#endif - -#ifndef GL_SGIX_fog_offset -#define GL_FOG_OFFSET_SGIX 0x8198 -#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 -#endif - -#ifndef GL_HP_image_transform -#define GL_IMAGE_SCALE_X_HP 0x8155 -#define GL_IMAGE_SCALE_Y_HP 0x8156 -#define GL_IMAGE_TRANSLATE_X_HP 0x8157 -#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 -#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 -#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A -#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B -#define GL_IMAGE_MAG_FILTER_HP 0x815C -#define GL_IMAGE_MIN_FILTER_HP 0x815D -#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E -#define GL_CUBIC_HP 0x815F -#define GL_AVERAGE_HP 0x8160 -#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 -#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 -#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 -#endif - -#ifndef GL_HP_convolution_border_modes -#define GL_IGNORE_BORDER_HP 0x8150 -#define GL_CONSTANT_BORDER_HP 0x8151 -#define GL_REPLICATE_BORDER_HP 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 -#endif - -#ifndef GL_INGR_palette_buffer -#endif - -#ifndef GL_SGIX_texture_add_env -#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE -#endif - -#ifndef GL_EXT_color_subtable -#endif - -#ifndef GL_PGI_vertex_hints -#define GL_VERTEX_DATA_HINT_PGI 0x1A22A -#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B -#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C -#define GL_MAX_VERTEX_HINT_PGI 0x1A22D -#define GL_COLOR3_BIT_PGI 0x00010000 -#define GL_COLOR4_BIT_PGI 0x00020000 -#define GL_EDGEFLAG_BIT_PGI 0x00040000 -#define GL_INDEX_BIT_PGI 0x00080000 -#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 -#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 -#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 -#define GL_MAT_EMISSION_BIT_PGI 0x00800000 -#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 -#define GL_MAT_SHININESS_BIT_PGI 0x02000000 -#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 -#define GL_NORMAL_BIT_PGI 0x08000000 -#define GL_TEXCOORD1_BIT_PGI 0x10000000 -#define GL_TEXCOORD2_BIT_PGI 0x20000000 -#define GL_TEXCOORD3_BIT_PGI 0x40000000 -#define GL_TEXCOORD4_BIT_PGI 0x80000000 -#define GL_VERTEX23_BIT_PGI 0x00000004 -#define GL_VERTEX4_BIT_PGI 0x00000008 -#endif - -#ifndef GL_PGI_misc_hints -#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 -#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD -#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE -#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 -#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 -#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 -#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C -#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D -#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E -#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F -#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 -#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 -#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 -#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 -#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 -#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 -#define GL_CLIP_NEAR_HINT_PGI 0x1A220 -#define GL_CLIP_FAR_HINT_PGI 0x1A221 -#define GL_WIDE_LINE_HINT_PGI 0x1A222 -#define GL_BACK_NORMALS_HINT_PGI 0x1A223 -#endif - -#ifndef GL_EXT_paletted_texture -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -#endif - -#ifndef GL_EXT_clip_volume_hint -#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 -#endif - -#ifndef GL_SGIX_list_priority -#define GL_LIST_PRIORITY_SGIX 0x8182 -#endif - -#ifndef GL_SGIX_ir_instrument1 -#define GL_IR_INSTRUMENT1_SGIX 0x817F -#endif - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 -#endif - -#ifndef GL_SGIX_texture_lod_bias -#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E -#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F -#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 -#endif - -#ifndef GL_SGIX_shadow_ambient -#define GL_SHADOW_AMBIENT_SGIX 0x80BF -#endif - -#ifndef GL_EXT_index_texture -#endif - -#ifndef GL_EXT_index_material -#define GL_INDEX_MATERIAL_EXT 0x81B8 -#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 -#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA -#endif - -#ifndef GL_EXT_index_func -#define GL_INDEX_TEST_EXT 0x81B5 -#define GL_INDEX_TEST_FUNC_EXT 0x81B6 -#define GL_INDEX_TEST_REF_EXT 0x81B7 -#endif - -#ifndef GL_EXT_index_array_formats -#define GL_IUI_V2F_EXT 0x81AD -#define GL_IUI_V3F_EXT 0x81AE -#define GL_IUI_N3F_V2F_EXT 0x81AF -#define GL_IUI_N3F_V3F_EXT 0x81B0 -#define GL_T2F_IUI_V2F_EXT 0x81B1 -#define GL_T2F_IUI_V3F_EXT 0x81B2 -#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 -#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 -#endif - -#ifndef GL_EXT_compiled_vertex_array -#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 -#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 -#endif - -#ifndef GL_EXT_cull_vertex -#define GL_CULL_VERTEX_EXT 0x81AA -#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB -#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC -#endif - -#ifndef GL_SGIX_ycrcb -#define GL_YCRCB_422_SGIX 0x81BB -#define GL_YCRCB_444_SGIX 0x81BC -#endif - -#ifndef GL_SGIX_fragment_lighting -#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 -#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 -#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 -#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 -#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 -#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 -#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 -#define GL_LIGHT_ENV_MODE_SGIX 0x8407 -#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 -#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 -#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A -#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B -#define GL_FRAGMENT_LIGHT0_SGIX 0x840C -#define GL_FRAGMENT_LIGHT1_SGIX 0x840D -#define GL_FRAGMENT_LIGHT2_SGIX 0x840E -#define GL_FRAGMENT_LIGHT3_SGIX 0x840F -#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 -#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 -#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 -#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 -#endif - -#ifndef GL_IBM_rasterpos_clip -#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 -#endif - -#ifndef GL_HP_texture_lighting -#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 -#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 -#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 -#endif - -#ifndef GL_EXT_draw_range_elements -#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 -#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 -#endif - -#ifndef GL_WIN_phong_shading -#define GL_PHONG_WIN 0x80EA -#define GL_PHONG_HINT_WIN 0x80EB -#endif - -#ifndef GL_WIN_specular_fog -#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC -#endif - -#ifndef GL_EXT_light_texture -#define GL_FRAGMENT_MATERIAL_EXT 0x8349 -#define GL_FRAGMENT_NORMAL_EXT 0x834A -#define GL_FRAGMENT_COLOR_EXT 0x834C -#define GL_ATTENUATION_EXT 0x834D -#define GL_SHADOW_ATTENUATION_EXT 0x834E -#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F -#define GL_TEXTURE_LIGHT_EXT 0x8350 -#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 -#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 -/* reuse GL_FRAGMENT_DEPTH_EXT */ -#endif - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_ALPHA_MIN_SGIX 0x8320 -#define GL_ALPHA_MAX_SGIX 0x8321 -#endif - -#ifndef GL_EXT_bgra -#define GL_BGR_EXT 0x80E0 -#define GL_BGRA_EXT 0x80E1 -#endif - -#ifndef GL_SGIX_async -#define GL_ASYNC_MARKER_SGIX 0x8329 -#endif - -#ifndef GL_SGIX_async_pixel -#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C -#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D -#define GL_ASYNC_READ_PIXELS_SGIX 0x835E -#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F -#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 -#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 -#endif - -#ifndef GL_SGIX_async_histogram -#define GL_ASYNC_HISTOGRAM_SGIX 0x832C -#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D -#endif - -#ifndef GL_INTEL_texture_scissor -#endif - -#ifndef GL_INTEL_parallel_arrays -#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 -#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 -#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 -#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 -#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 -#endif - -#ifndef GL_HP_occlusion_test -#define GL_OCCLUSION_TEST_HP 0x8165 -#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 -#endif - -#ifndef GL_EXT_pixel_transform -#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 -#define GL_PIXEL_MAG_FILTER_EXT 0x8331 -#define GL_PIXEL_MIN_FILTER_EXT 0x8332 -#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 -#define GL_CUBIC_EXT 0x8334 -#define GL_AVERAGE_EXT 0x8335 -#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 -#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 -#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 -#endif - -#ifndef GL_EXT_pixel_transform_color_table -#endif - -#ifndef GL_EXT_shared_texture_palette -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB -#endif - -#ifndef GL_EXT_separate_specular_color -#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 -#define GL_SINGLE_COLOR_EXT 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA -#endif - -#ifndef GL_EXT_secondary_color -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E -#endif - -#ifndef GL_EXT_texture_perturb_normal -#define GL_PERTURB_EXT 0x85AE -#define GL_TEXTURE_NORMAL_EXT 0x85AF -#endif - -#ifndef GL_EXT_multi_draw_arrays -#endif - -#ifndef GL_EXT_fog_coord -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 -#endif - -#ifndef GL_REND_screen_coordinates -#define GL_SCREEN_COORDINATES_REND 0x8490 -#define GL_INVERTED_SCREEN_W_REND 0x8491 -#endif - -#ifndef GL_EXT_coordinate_frame -#define GL_TANGENT_ARRAY_EXT 0x8439 -#define GL_BINORMAL_ARRAY_EXT 0x843A -#define GL_CURRENT_TANGENT_EXT 0x843B -#define GL_CURRENT_BINORMAL_EXT 0x843C -#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E -#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F -#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 -#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 -#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 -#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 -#define GL_MAP1_TANGENT_EXT 0x8444 -#define GL_MAP2_TANGENT_EXT 0x8445 -#define GL_MAP1_BINORMAL_EXT 0x8446 -#define GL_MAP2_BINORMAL_EXT 0x8447 -#endif - -#ifndef GL_EXT_texture_env_combine -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE3_RGB_EXT 0x8583 -#define GL_SOURCE4_RGB_EXT 0x8584 -#define GL_SOURCE5_RGB_EXT 0x8585 -#define GL_SOURCE6_RGB_EXT 0x8586 -#define GL_SOURCE7_RGB_EXT 0x8587 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_SOURCE3_ALPHA_EXT 0x858B -#define GL_SOURCE4_ALPHA_EXT 0x858C -#define GL_SOURCE5_ALPHA_EXT 0x858D -#define GL_SOURCE6_ALPHA_EXT 0x858E -#define GL_SOURCE7_ALPHA_EXT 0x858F -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND3_RGB_EXT 0x8593 -#define GL_OPERAND4_RGB_EXT 0x8594 -#define GL_OPERAND5_RGB_EXT 0x8595 -#define GL_OPERAND6_RGB_EXT 0x8596 -#define GL_OPERAND7_RGB_EXT 0x8597 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A -#define GL_OPERAND3_ALPHA_EXT 0x859B -#define GL_OPERAND4_ALPHA_EXT 0x859C -#define GL_OPERAND5_ALPHA_EXT 0x859D -#define GL_OPERAND6_ALPHA_EXT 0x859E -#define GL_OPERAND7_ALPHA_EXT 0x859F -#endif - -#ifndef GL_APPLE_specular_vector -#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 -#endif - -#ifndef GL_APPLE_transform_hint -#define GL_TRANSFORM_HINT_APPLE 0x85B1 -#endif - -#ifndef GL_SGIX_fog_scale -#define GL_FOG_SCALE_SGIX 0x81FC -#define GL_FOG_SCALE_VALUE_SGIX 0x81FD -#endif - -#ifndef GL_SUNX_constant_data -#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 -#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 -#endif - -#ifndef GL_SUN_global_alpha -#define GL_GLOBAL_ALPHA_SUN 0x81D9 -#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA -#endif - -#ifndef GL_SUN_triangle_list -#define GL_RESTART_SUN 0x01 -#define GL_REPLACE_MIDDLE_SUN 0x02 -#define GL_REPLACE_OLDEST_SUN 0x03 -#define GL_TRIANGLE_LIST_SUN 0x81D7 -#define GL_REPLACEMENT_CODE_SUN 0x81D8 -#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 -#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 -#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 -#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 -#define GL_R1UI_V3F_SUN 0x85C4 -#define GL_R1UI_C4UB_V3F_SUN 0x85C5 -#define GL_R1UI_C3F_V3F_SUN 0x85C6 -#define GL_R1UI_N3F_V3F_SUN 0x85C7 -#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 -#define GL_R1UI_T2F_V3F_SUN 0x85C9 -#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA -#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB -#endif - -#ifndef GL_SUN_vertex -#endif - -#ifndef GL_EXT_blend_func_separate -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB -#endif - -#ifndef GL_INGR_color_clamp -#define GL_RED_MIN_CLAMP_INGR 0x8560 -#define GL_GREEN_MIN_CLAMP_INGR 0x8561 -#define GL_BLUE_MIN_CLAMP_INGR 0x8562 -#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 -#define GL_RED_MAX_CLAMP_INGR 0x8564 -#define GL_GREEN_MAX_CLAMP_INGR 0x8565 -#define GL_BLUE_MAX_CLAMP_INGR 0x8566 -#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 -#endif - -#ifndef GL_INGR_interlace_read -#define GL_INTERLACE_READ_INGR 0x8568 -#endif - -#ifndef GL_EXT_stencil_wrap -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 -#endif - -#ifndef GL_EXT_422_pixels -#define GL_422_EXT 0x80CC -#define GL_422_REV_EXT 0x80CD -#define GL_422_AVERAGE_EXT 0x80CE -#define GL_422_REV_AVERAGE_EXT 0x80CF -#endif - -#ifndef GL_NV_texgen_reflection -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 -#endif - -#ifndef GL_EXT_texture_cube_map -#define GL_NORMAL_MAP_EXT 0x8511 -#define GL_REFLECTION_MAP_EXT 0x8512 -#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C -#endif - -#ifndef GL_SUN_convolution_border_modes -#define GL_WRAP_BORDER_SUN 0x81D4 -#endif - -#ifndef GL_EXT_texture_env_add -#endif - -#ifndef GL_EXT_texture_lod_bias -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 -#endif - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#endif - -#ifndef GL_EXT_vertex_weighting -#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH -#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 -#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX -#define GL_MODELVIEW_MATRIX1_EXT 0x8506 -#define GL_VERTEX_WEIGHTING_EXT 0x8509 -#define GL_MODELVIEW0_EXT GL_MODELVIEW -#define GL_MODELVIEW1_EXT 0x850A -#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B -#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C -#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D -#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E -#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F -#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 -#endif - -#ifndef GL_NV_light_max_exponent -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 -#endif - -#ifndef GL_NV_vertex_array_range -#define GL_VERTEX_ARRAY_RANGE_NV 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E -#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 -#endif - -#ifndef GL_NV_register_combiners -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 -/* reuse GL_TEXTURE0_ARB */ -/* reuse GL_TEXTURE1_ARB */ -/* reuse GL_ZERO */ -/* reuse GL_NONE */ -/* reuse GL_FOG */ -#endif - -#ifndef GL_NV_fog_distance -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C -/* reuse GL_EYE_PLANE */ -#endif - -#ifndef GL_NV_texgen_emboss -#define GL_EMBOSS_LIGHT_NV 0x855D -#define GL_EMBOSS_CONSTANT_NV 0x855E -#define GL_EMBOSS_MAP_NV 0x855F -#endif - -#ifndef GL_NV_blend_square -#endif - -#ifndef GL_NV_texture_env_combine4 -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B -#endif - -#ifndef GL_MESA_resize_buffers -#endif - -#ifndef GL_MESA_window_pos -#endif - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#endif - -#ifndef GL_IBM_cull_vertex -#define GL_CULL_VERTEX_IBM 103050 -#endif - -#ifndef GL_IBM_multimode_draw_arrays -#endif - -#ifndef GL_IBM_vertex_array_lists -#define GL_VERTEX_ARRAY_LIST_IBM 103070 -#define GL_NORMAL_ARRAY_LIST_IBM 103071 -#define GL_COLOR_ARRAY_LIST_IBM 103072 -#define GL_INDEX_ARRAY_LIST_IBM 103073 -#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 -#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 -#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 -#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 -#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 -#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 -#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 -#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 -#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 -#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 -#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 -#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 -#endif - -#ifndef GL_SGIX_subsample -#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 -#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 -#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 -#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 -#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 -#endif - -#ifndef GL_SGIX_ycrcb_subsample -#endif - -#ifndef GL_SGIX_ycrcba -#define GL_YCRCB_SGIX 0x8318 -#define GL_YCRCBA_SGIX 0x8319 -#endif - -#ifndef GL_SGI_depth_pass_instrument -#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 -#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 -#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 -#endif - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 -#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 -#endif - -#ifndef GL_3DFX_multisample -#define GL_MULTISAMPLE_3DFX 0x86B2 -#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 -#define GL_SAMPLES_3DFX 0x86B4 -#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 -#endif - -#ifndef GL_3DFX_tbuffer -#endif - -#ifndef GL_EXT_multisample -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F -#define GL_SAMPLE_MASK_EXT 0x80A0 -#define GL_1PASS_EXT 0x80A1 -#define GL_2PASS_0_EXT 0x80A2 -#define GL_2PASS_1_EXT 0x80A3 -#define GL_4PASS_0_EXT 0x80A4 -#define GL_4PASS_1_EXT 0x80A5 -#define GL_4PASS_2_EXT 0x80A6 -#define GL_4PASS_3_EXT 0x80A7 -#define GL_SAMPLE_BUFFERS_EXT 0x80A8 -#define GL_SAMPLES_EXT 0x80A9 -#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA -#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB -#define GL_SAMPLE_PATTERN_EXT 0x80AC -#endif - -#ifndef GL_SGIX_vertex_preclip -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF -#endif - -#ifndef GL_SGIX_convolution_accuracy -#define GL_CONVOLUTION_HINT_SGIX 0x8316 -#endif - -#ifndef GL_SGIX_resample -#define GL_PACK_RESAMPLE_SGIX 0x842C -#define GL_UNPACK_RESAMPLE_SGIX 0x842D -#define GL_RESAMPLE_REPLICATE_SGIX 0x842E -#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F -#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 -#endif - -#ifndef GL_SGIS_point_line_texgen -#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 -#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 -#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 -#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 -#define GL_EYE_POINT_SGIS 0x81F4 -#define GL_OBJECT_POINT_SGIS 0x81F5 -#define GL_EYE_LINE_SGIS 0x81F6 -#define GL_OBJECT_LINE_SGIS 0x81F7 -#endif - -#ifndef GL_SGIS_texture_color_mask -#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF -#endif - - -/*************************************************************/ - -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glBlendColor (GLclampf, GLclampf, GLclampf, GLclampf); -extern void APIENTRY glBlendEquation (GLenum); -extern void APIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); -extern void APIENTRY glColorTable (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glColorTableParameterfv (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glColorTableParameteriv (GLenum, GLenum, const GLint *); -extern void APIENTRY glCopyColorTable (GLenum, GLenum, GLint, GLint, GLsizei); -extern void APIENTRY glGetColorTable (GLenum, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetColorTableParameterfv (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetColorTableParameteriv (GLenum, GLenum, GLint *); -extern void APIENTRY glColorSubTable (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glCopyColorSubTable (GLenum, GLsizei, GLint, GLint, GLsizei); -extern void APIENTRY glConvolutionFilter1D (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glConvolutionFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glConvolutionParameterf (GLenum, GLenum, GLfloat); -extern void APIENTRY glConvolutionParameterfv (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glConvolutionParameteri (GLenum, GLenum, GLint); -extern void APIENTRY glConvolutionParameteriv (GLenum, GLenum, const GLint *); -extern void APIENTRY glCopyConvolutionFilter1D (GLenum, GLenum, GLint, GLint, GLsizei); -extern void APIENTRY glCopyConvolutionFilter2D (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); -extern void APIENTRY glGetConvolutionFilter (GLenum, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetConvolutionParameterfv (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetConvolutionParameteriv (GLenum, GLenum, GLint *); -extern void APIENTRY glGetSeparableFilter (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); -extern void APIENTRY glSeparableFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); -extern void APIENTRY glGetHistogram (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetHistogramParameterfv (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetHistogramParameteriv (GLenum, GLenum, GLint *); -extern void APIENTRY glGetMinmax (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetMinmaxParameterfv (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetMinmaxParameteriv (GLenum, GLenum, GLint *); -extern void APIENTRY glHistogram (GLenum, GLsizei, GLenum, GLboolean); -extern void APIENTRY glMinmax (GLenum, GLenum, GLboolean); -extern void APIENTRY glResetHistogram (GLenum); -extern void APIENTRY glResetMinmax (GLenum); -extern void APIENTRY glTexImage3D (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glCopyTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -typedef void (APIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); -typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -typedef void (APIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (APIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); -typedef void (APIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); -typedef void (APIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_ARB_multitexture -#define GL_ARB_multitexture 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glActiveTextureARB (GLenum); -extern void APIENTRY glClientActiveTextureARB (GLenum); -extern void APIENTRY glMultiTexCoord1dARB (GLenum, GLdouble); -extern void APIENTRY glMultiTexCoord1dvARB (GLenum, const GLdouble *); -extern void APIENTRY glMultiTexCoord1fARB (GLenum, GLfloat); -extern void APIENTRY glMultiTexCoord1fvARB (GLenum, const GLfloat *); -extern void APIENTRY glMultiTexCoord1iARB (GLenum, GLint); -extern void APIENTRY glMultiTexCoord1ivARB (GLenum, const GLint *); -extern void APIENTRY glMultiTexCoord1sARB (GLenum, GLshort); -extern void APIENTRY glMultiTexCoord1svARB (GLenum, const GLshort *); -extern void APIENTRY glMultiTexCoord2dARB (GLenum, GLdouble, GLdouble); -extern void APIENTRY glMultiTexCoord2dvARB (GLenum, const GLdouble *); -extern void APIENTRY glMultiTexCoord2fARB (GLenum, GLfloat, GLfloat); -extern void APIENTRY glMultiTexCoord2fvARB (GLenum, const GLfloat *); -extern void APIENTRY glMultiTexCoord2iARB (GLenum, GLint, GLint); -extern void APIENTRY glMultiTexCoord2ivARB (GLenum, const GLint *); -extern void APIENTRY glMultiTexCoord2sARB (GLenum, GLshort, GLshort); -extern void APIENTRY glMultiTexCoord2svARB (GLenum, const GLshort *); -extern void APIENTRY glMultiTexCoord3dARB (GLenum, GLdouble, GLdouble, GLdouble); -extern void APIENTRY glMultiTexCoord3dvARB (GLenum, const GLdouble *); -extern void APIENTRY glMultiTexCoord3fARB (GLenum, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glMultiTexCoord3fvARB (GLenum, const GLfloat *); -extern void APIENTRY glMultiTexCoord3iARB (GLenum, GLint, GLint, GLint); -extern void APIENTRY glMultiTexCoord3ivARB (GLenum, const GLint *); -extern void APIENTRY glMultiTexCoord3sARB (GLenum, GLshort, GLshort, GLshort); -extern void APIENTRY glMultiTexCoord3svARB (GLenum, const GLshort *); -extern void APIENTRY glMultiTexCoord4dARB (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -extern void APIENTRY glMultiTexCoord4dvARB (GLenum, const GLdouble *); -extern void APIENTRY glMultiTexCoord4fARB (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glMultiTexCoord4fvARB (GLenum, const GLfloat *); -extern void APIENTRY glMultiTexCoord4iARB (GLenum, GLint, GLint, GLint, GLint); -extern void APIENTRY glMultiTexCoord4ivARB (GLenum, const GLint *); -extern void APIENTRY glMultiTexCoord4sARB (GLenum, GLshort, GLshort, GLshort, GLshort); -extern void APIENTRY glMultiTexCoord4svARB (GLenum, const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); -#endif - -#ifndef GL_ARB_transpose_matrix -#define GL_ARB_transpose_matrix 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *); -extern void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *); -extern void APIENTRY glMultTransposeMatrixfARB (const GLfloat *); -extern void APIENTRY glMultTransposeMatrixdARB (const GLdouble *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -typedef void (APIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -#endif - -#ifndef GL_ARB_multisample -#define GL_ARB_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSampleCoverageARB (GLclampf, GLboolean); -extern void APIENTRY glSamplePassARB (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRY * PFNGLSAMPLEPASSARBPROC) (GLenum pass); -#endif - -#ifndef GL_ARB_texture_env_add -#define GL_ARB_texture_env_add 1 -#endif - -#ifndef GL_ARB_texture_cube_map -#define GL_ARB_texture_cube_map 1 -#endif - -#ifndef GL_ARB_texture_compression -#define GL_ARB_texture_compression 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -extern void APIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -extern void APIENTRY glCompressedTexImage1DARB (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); -extern void APIENTRY glCompressedTexSubImage3DARB (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -extern void APIENTRY glCompressedTexSubImage2DARB (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -extern void APIENTRY glCompressedTexSubImage1DARB (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); -extern void APIENTRY glGetCompressedTexImageARB (GLenum, GLint, void *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *img); -#endif - -#ifndef GL_EXT_abgr -#define GL_EXT_abgr 1 -#endif - -#ifndef GL_EXT_blend_color -#define GL_EXT_blend_color 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glBlendColorEXT (GLclampf, GLclampf, GLclampf, GLclampf); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -#endif - -#ifndef GL_EXT_polygon_offset -#define GL_EXT_polygon_offset 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glPolygonOffsetEXT (GLfloat, GLfloat); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); -#endif - -#ifndef GL_EXT_texture -#define GL_EXT_texture 1 -#endif - -#ifndef GL_EXT_texture3D -#define GL_EXT_texture3D 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTexImage3DEXT (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_SGIS_texture_filter4 -#define GL_SGIS_texture_filter4 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glGetTexFilterFuncSGIS (GLenum, GLenum, GLfloat *); -extern void APIENTRY glTexFilterFuncSGIS (GLenum, GLenum, GLsizei, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); -typedef void (APIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); -#endif - -#ifndef GL_EXT_subtexture -#define GL_EXT_subtexture 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTexSubImage1DEXT (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_EXT_copy_texture -#define GL_EXT_copy_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glCopyTexImage1DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); -extern void APIENTRY glCopyTexImage2DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); -extern void APIENTRY glCopyTexSubImage1DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei); -extern void APIENTRY glCopyTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -extern void APIENTRY glCopyTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_EXT_histogram -#define GL_EXT_histogram 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glGetHistogramEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetHistogramParameterfvEXT (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetHistogramParameterivEXT (GLenum, GLenum, GLint *); -extern void APIENTRY glGetMinmaxEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetMinmaxParameterfvEXT (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetMinmaxParameterivEXT (GLenum, GLenum, GLint *); -extern void APIENTRY glHistogramEXT (GLenum, GLsizei, GLenum, GLboolean); -extern void APIENTRY glMinmaxEXT (GLenum, GLenum, GLboolean); -extern void APIENTRY glResetHistogramEXT (GLenum); -extern void APIENTRY glResetMinmaxEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); -typedef void (APIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); -#endif - -#ifndef GL_EXT_convolution -#define GL_EXT_convolution 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glConvolutionFilter1DEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glConvolutionFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glConvolutionParameterfEXT (GLenum, GLenum, GLfloat); -extern void APIENTRY glConvolutionParameterfvEXT (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glConvolutionParameteriEXT (GLenum, GLenum, GLint); -extern void APIENTRY glConvolutionParameterivEXT (GLenum, GLenum, const GLint *); -extern void APIENTRY glCopyConvolutionFilter1DEXT (GLenum, GLenum, GLint, GLint, GLsizei); -extern void APIENTRY glCopyConvolutionFilter2DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); -extern void APIENTRY glGetConvolutionFilterEXT (GLenum, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetConvolutionParameterfvEXT (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetConvolutionParameterivEXT (GLenum, GLenum, GLint *); -extern void APIENTRY glGetSeparableFilterEXT (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); -extern void APIENTRY glSeparableFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (APIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -#endif - -#ifndef GL_EXT_color_matrix -#define GL_EXT_color_matrix 1 -#endif - -#ifndef GL_SGI_color_table -#define GL_SGI_color_table 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glColorTableSGI (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glColorTableParameterfvSGI (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glColorTableParameterivSGI (GLenum, GLenum, const GLint *); -extern void APIENTRY glCopyColorTableSGI (GLenum, GLenum, GLint, GLint, GLsizei); -extern void APIENTRY glGetColorTableSGI (GLenum, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetColorTableParameterfvSGI (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetColorTableParameterivSGI (GLenum, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); -#endif - -#ifndef GL_SGIX_pixel_texture -#define GL_SGIX_pixel_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glPixelTexGenSGIX (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); -#endif - -#ifndef GL_SGIS_pixel_texture -#define GL_SGIS_pixel_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glPixelTexGenParameteriSGIS (GLenum, GLint); -extern void APIENTRY glPixelTexGenParameterivSGIS (GLenum, const GLint *); -extern void APIENTRY glPixelTexGenParameterfSGIS (GLenum, GLfloat); -extern void APIENTRY glPixelTexGenParameterfvSGIS (GLenum, const GLfloat *); -extern void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum, GLint *); -extern void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); -#endif - -#ifndef GL_SGIS_texture4D -#define GL_SGIS_texture4D 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTexImage4DSGIS (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glTexSubImage4DSGIS (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_SGI_texture_color_table -#define GL_SGI_texture_color_table 1 -#endif - -#ifndef GL_EXT_cmyka -#define GL_EXT_cmyka 1 -#endif - -#ifndef GL_EXT_texture_object -#define GL_EXT_texture_object 1 -#ifdef GL_GLEXT_PROTOTYPES -extern GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei, const GLuint *, GLboolean *); -extern void APIENTRY glBindTextureEXT (GLenum, GLuint); -extern void APIENTRY glDeleteTexturesEXT (GLsizei, const GLuint *); -extern void APIENTRY glGenTexturesEXT (GLsizei, GLuint *); -extern GLboolean APIENTRY glIsTextureEXT (GLuint); -extern void APIENTRY glPrioritizeTexturesEXT (GLsizei, const GLuint *, const GLclampf *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); -typedef void (APIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); -typedef void (APIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); -typedef void (APIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); -typedef GLboolean (APIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); -typedef void (APIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); -#endif - -#ifndef GL_SGIS_detail_texture -#define GL_SGIS_detail_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glDetailTexFuncSGIS (GLenum, GLsizei, const GLfloat *); -extern void APIENTRY glGetDetailTexFuncSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#endif - -#ifndef GL_SGIS_sharpen_texture -#define GL_SGIS_sharpen_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSharpenTexFuncSGIS (GLenum, GLsizei, const GLfloat *); -extern void APIENTRY glGetSharpenTexFuncSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#endif - -#ifndef GL_EXT_packed_pixels -#define GL_EXT_packed_pixels 1 -#endif - -#ifndef GL_SGIS_texture_lod -#define GL_SGIS_texture_lod 1 -#endif - -#ifndef GL_SGIS_multisample -#define GL_SGIS_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSampleMaskSGIS (GLclampf, GLboolean); -extern void APIENTRY glSamplePatternSGIS (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); -#endif - -#ifndef GL_EXT_rescale_normal -#define GL_EXT_rescale_normal 1 -#endif - -#ifndef GL_EXT_vertex_array -#define GL_EXT_vertex_array 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glArrayElementEXT (GLint); -extern void APIENTRY glColorPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -extern void APIENTRY glDrawArraysEXT (GLenum, GLint, GLsizei); -extern void APIENTRY glEdgeFlagPointerEXT (GLsizei, GLsizei, const GLboolean *); -extern void APIENTRY glGetPointervEXT (GLenum, GLvoid* *); -extern void APIENTRY glIndexPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); -extern void APIENTRY glNormalPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); -extern void APIENTRY glTexCoordPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -extern void APIENTRY glVertexPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); -typedef void (APIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); -typedef void (APIENTRY * PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); -typedef void (APIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_misc_attribute -#define GL_EXT_misc_attribute 1 -#endif - -#ifndef GL_SGIS_generate_mipmap -#define GL_SGIS_generate_mipmap 1 -#endif - -#ifndef GL_SGIX_clipmap -#define GL_SGIX_clipmap 1 -#endif - -#ifndef GL_SGIX_shadow -#define GL_SGIX_shadow 1 -#endif - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_SGIS_texture_edge_clamp 1 -#endif - -#ifndef GL_SGIS_texture_border_clamp -#define GL_SGIS_texture_border_clamp 1 -#endif - -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glBlendEquationEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_blend_subtract -#define GL_EXT_blend_subtract 1 -#endif - -#ifndef GL_EXT_blend_logic_op -#define GL_EXT_blend_logic_op 1 -#endif - -#ifndef GL_SGIX_interlace -#define GL_SGIX_interlace 1 -#endif - -#ifndef GL_SGIX_pixel_tiles -#define GL_SGIX_pixel_tiles 1 -#endif - -#ifndef GL_SGIX_texture_select -#define GL_SGIX_texture_select 1 -#endif - -#ifndef GL_SGIX_sprite -#define GL_SGIX_sprite 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSpriteParameterfSGIX (GLenum, GLfloat); -extern void APIENTRY glSpriteParameterfvSGIX (GLenum, const GLfloat *); -extern void APIENTRY glSpriteParameteriSGIX (GLenum, GLint); -extern void APIENTRY glSpriteParameterivSGIX (GLenum, const GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); -#endif - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_SGIX_texture_multi_buffer 1 -#endif - -#ifndef GL_EXT_point_parameters -#define GL_EXT_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glPointParameterfEXT (GLenum, GLfloat); -extern void APIENTRY glPointParameterfvEXT (GLenum, const GLfloat *); -extern void APIENTRY glPointParameterfSGIS (GLenum, GLfloat); -extern void APIENTRY glPointParameterfvSGIS (GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_SGIX_instruments -#define GL_SGIX_instruments 1 -#ifdef GL_GLEXT_PROTOTYPES -extern GLint APIENTRY glGetInstrumentsSGIX (void); -extern void APIENTRY glInstrumentsBufferSGIX (GLsizei, GLint *); -extern GLint APIENTRY glPollInstrumentsSGIX (GLint *); -extern void APIENTRY glReadInstrumentsSGIX (GLint); -extern void APIENTRY glStartInstrumentsSGIX (void); -extern void APIENTRY glStopInstrumentsSGIX (GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLint (APIENTRY * PFNGLGETINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRY * PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); -typedef GLint (APIENTRY * PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); -typedef void (APIENTRY * PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); -typedef void (APIENTRY * PFNGLSTARTINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRY * PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); -#endif - -#ifndef GL_SGIX_texture_scale_bias -#define GL_SGIX_texture_scale_bias 1 -#endif - -#ifndef GL_SGIX_framezoom -#define GL_SGIX_framezoom 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFrameZoomSGIX (GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); -#endif - -#ifndef GL_SGIX_tag_sample_buffer -#define GL_SGIX_tag_sample_buffer 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTagSampleBufferSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); -#endif - -#ifndef GL_SGIX_polynomial_ffd -#define GL_SGIX_polynomial_ffd 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glDeformationMap3dSGIX (GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *); -extern void APIENTRY glDeformationMap3fSGIX (GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *); -extern void APIENTRY glDeformSGIX (GLbitfield); -extern void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); -typedef void (APIENTRY * PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); -typedef void (APIENTRY * PFNGLDEFORMSGIXPROC) (GLbitfield mask); -typedef void (APIENTRY * PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); -#endif - -#ifndef GL_SGIX_reference_plane -#define GL_SGIX_reference_plane 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glReferencePlaneSGIX (const GLdouble *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); -#endif - -#ifndef GL_SGIX_flush_raster -#define GL_SGIX_flush_raster 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFlushRasterSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); -#endif - -#ifndef GL_SGIX_depth_texture -#define GL_SGIX_depth_texture 1 -#endif - -#ifndef GL_SGIS_fog_function -#define GL_SGIS_fog_function 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFogFuncSGIS (GLsizei, const GLfloat *); -extern void APIENTRY glGetFogFuncSGIS (const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); -typedef void (APIENTRY * PFNGLGETFOGFUNCSGISPROC) (const GLfloat *points); -#endif - -#ifndef GL_SGIX_fog_offset -#define GL_SGIX_fog_offset 1 -#endif - -#ifndef GL_HP_image_transform -#define GL_HP_image_transform 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glImageTransformParameteriHP (GLenum, GLenum, GLint); -extern void APIENTRY glImageTransformParameterfHP (GLenum, GLenum, GLfloat); -extern void APIENTRY glImageTransformParameterivHP (GLenum, GLenum, const GLint *); -extern void APIENTRY glImageTransformParameterfvHP (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glGetImageTransformParameterivHP (GLenum, GLenum, GLint *); -extern void APIENTRY glGetImageTransformParameterfvHP (GLenum, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_HP_convolution_border_modes -#define GL_HP_convolution_border_modes 1 -#endif - -#ifndef GL_SGIX_texture_add_env -#define GL_SGIX_texture_add_env 1 -#endif - -#ifndef GL_EXT_color_subtable -#define GL_EXT_color_subtable 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glColorSubTableEXT (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glCopyColorSubTableEXT (GLenum, GLsizei, GLint, GLint, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -#endif - -#ifndef GL_PGI_vertex_hints -#define GL_PGI_vertex_hints 1 -#endif - -#ifndef GL_PGI_misc_hints -#define GL_PGI_misc_hints 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glHintPGI (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLHINTPGIPROC) (GLenum target, GLint mode); -#endif - -#ifndef GL_EXT_paletted_texture -#define GL_EXT_paletted_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glColorTableEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glGetColorTableEXT (GLenum, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetColorTableParameterivEXT (GLenum, GLenum, GLint *); -extern void APIENTRY glGetColorTableParameterfvEXT (GLenum, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_EXT_clip_volume_hint -#define GL_EXT_clip_volume_hint 1 -#endif - -#ifndef GL_SGIX_list_priority -#define GL_SGIX_list_priority 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glGetListParameterfvSGIX (GLuint, GLenum, GLfloat *); -extern void APIENTRY glGetListParameterivSGIX (GLuint, GLenum, GLint *); -extern void APIENTRY glListParameterfSGIX (GLuint, GLenum, GLfloat); -extern void APIENTRY glListParameterfvSGIX (GLuint, GLenum, const GLfloat *); -extern void APIENTRY glListParameteriSGIX (GLuint, GLenum, GLint); -extern void APIENTRY glListParameterivSGIX (GLuint, GLenum, const GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); -#endif - -#ifndef GL_SGIX_ir_instrument1 -#define GL_SGIX_ir_instrument1 1 -#endif - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_SGIX_calligraphic_fragment 1 -#endif - -#ifndef GL_SGIX_texture_lod_bias -#define GL_SGIX_texture_lod_bias 1 -#endif - -#ifndef GL_SGIX_shadow_ambient -#define GL_SGIX_shadow_ambient 1 -#endif - -#ifndef GL_EXT_index_texture -#define GL_EXT_index_texture 1 -#endif - -#ifndef GL_EXT_index_material -#define GL_EXT_index_material 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glIndexMaterialEXT (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); -#endif - -#ifndef GL_EXT_index_func -#define GL_EXT_index_func 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glIndexFuncEXT (GLenum, GLclampf); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); -#endif - -#ifndef GL_EXT_index_array_formats -#define GL_EXT_index_array_formats 1 -#endif - -#ifndef GL_EXT_compiled_vertex_array -#define GL_EXT_compiled_vertex_array 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glLockArraysEXT (GLint, GLsizei); -extern void APIENTRY glUnlockArraysEXT (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); -typedef void (APIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); -#endif - -#ifndef GL_EXT_cull_vertex -#define GL_EXT_cull_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glCullParameterdvEXT (GLenum, GLdouble *); -extern void APIENTRY glCullParameterfvEXT (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); -typedef void (APIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); -#endif - -#ifndef GL_SGIX_ycrcb -#define GL_SGIX_ycrcb 1 -#endif - -#ifndef GL_SGIX_fragment_lighting -#define GL_SGIX_fragment_lighting 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFragmentColorMaterialSGIX (GLenum, GLenum); -extern void APIENTRY glFragmentLightfSGIX (GLenum, GLenum, GLfloat); -extern void APIENTRY glFragmentLightfvSGIX (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glFragmentLightiSGIX (GLenum, GLenum, GLint); -extern void APIENTRY glFragmentLightivSGIX (GLenum, GLenum, const GLint *); -extern void APIENTRY glFragmentLightModelfSGIX (GLenum, GLfloat); -extern void APIENTRY glFragmentLightModelfvSGIX (GLenum, const GLfloat *); -extern void APIENTRY glFragmentLightModeliSGIX (GLenum, GLint); -extern void APIENTRY glFragmentLightModelivSGIX (GLenum, const GLint *); -extern void APIENTRY glFragmentMaterialfSGIX (GLenum, GLenum, GLfloat); -extern void APIENTRY glFragmentMaterialfvSGIX (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glFragmentMaterialiSGIX (GLenum, GLenum, GLint); -extern void APIENTRY glFragmentMaterialivSGIX (GLenum, GLenum, const GLint *); -extern void APIENTRY glGetFragmentLightfvSGIX (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetFragmentLightivSGIX (GLenum, GLenum, GLint *); -extern void APIENTRY glGetFragmentMaterialfvSGIX (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetFragmentMaterialivSGIX (GLenum, GLenum, GLint *); -extern void APIENTRY glLightEnviSGIX (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); -#endif - -#ifndef GL_IBM_rasterpos_clip -#define GL_IBM_rasterpos_clip 1 -#endif - -#ifndef GL_HP_texture_lighting -#define GL_HP_texture_lighting 1 -#endif - -#ifndef GL_EXT_draw_range_elements -#define GL_EXT_draw_range_elements 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glDrawRangeElementsEXT (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -#endif - -#ifndef GL_WIN_phong_shading -#define GL_WIN_phong_shading 1 -#endif - -#ifndef GL_WIN_specular_fog -#define GL_WIN_specular_fog 1 -#endif - -#ifndef GL_EXT_light_texture -#define GL_EXT_light_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glApplyTextureEXT (GLenum); -extern void APIENTRY glTextureLightEXT (GLenum); -extern void APIENTRY glTextureMaterialEXT (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); -typedef void (APIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); -typedef void (APIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); -#endif - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_SGIX_blend_alpha_minmax 1 -#endif - -#ifndef GL_EXT_bgra -#define GL_EXT_bgra 1 -#endif - -#ifndef GL_SGIX_async -#define GL_SGIX_async 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glAsyncMarkerSGIX (GLuint); -extern GLint APIENTRY glFinishAsyncSGIX (GLuint *); -extern GLint APIENTRY glPollAsyncSGIX (GLuint *); -extern GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei); -extern void APIENTRY glDeleteAsyncMarkersSGIX (GLuint, GLsizei); -extern GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker); -typedef GLint (APIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); -typedef GLint (APIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); -typedef GLuint (APIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); -typedef void (APIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); -typedef GLboolean (APIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); -#endif - -#ifndef GL_SGIX_async_pixel -#define GL_SGIX_async_pixel 1 -#endif - -#ifndef GL_SGIX_async_histogram -#define GL_SGIX_async_histogram 1 -#endif - -#ifndef GL_INTEL_parallel_arrays -#define GL_INTEL_parallel_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glVertexPointervINTEL (GLint, GLenum, const GLvoid* *); -extern void APIENTRY glNormalPointervINTEL (GLenum, const GLvoid* *); -extern void APIENTRY glColorPointervINTEL (GLint, GLenum, const GLvoid* *); -extern void APIENTRY glTexCoordPointervINTEL (GLint, GLenum, const GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (APIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); -typedef void (APIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (APIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -#endif - -#ifndef GL_HP_occlusion_test -#define GL_HP_occlusion_test 1 -#endif - -#ifndef GL_EXT_pixel_transform -#define GL_EXT_pixel_transform 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glPixelTransformParameteriEXT (GLenum, GLenum, GLint); -extern void APIENTRY glPixelTransformParameterfEXT (GLenum, GLenum, GLfloat); -extern void APIENTRY glPixelTransformParameterivEXT (GLenum, GLenum, const GLint *); -extern void APIENTRY glPixelTransformParameterfvEXT (GLenum, GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_EXT_pixel_transform_color_table -#define GL_EXT_pixel_transform_color_table 1 -#endif - -#ifndef GL_EXT_shared_texture_palette -#define GL_EXT_shared_texture_palette 1 -#endif - -#ifndef GL_EXT_separate_specular_color -#define GL_EXT_separate_specular_color 1 -#endif - -#ifndef GL_EXT_secondary_color -#define GL_EXT_secondary_color 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSecondaryColor3bEXT (GLbyte, GLbyte, GLbyte); -extern void APIENTRY glSecondaryColor3bvEXT (const GLbyte *); -extern void APIENTRY glSecondaryColor3dEXT (GLdouble, GLdouble, GLdouble); -extern void APIENTRY glSecondaryColor3dvEXT (const GLdouble *); -extern void APIENTRY glSecondaryColor3fEXT (GLfloat, GLfloat, GLfloat); -extern void APIENTRY glSecondaryColor3fvEXT (const GLfloat *); -extern void APIENTRY glSecondaryColor3iEXT (GLint, GLint, GLint); -extern void APIENTRY glSecondaryColor3ivEXT (const GLint *); -extern void APIENTRY glSecondaryColor3sEXT (GLshort, GLshort, GLshort); -extern void APIENTRY glSecondaryColor3svEXT (const GLshort *); -extern void APIENTRY glSecondaryColor3ubEXT (GLubyte, GLubyte, GLubyte); -extern void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *); -extern void APIENTRY glSecondaryColor3uiEXT (GLuint, GLuint, GLuint); -extern void APIENTRY glSecondaryColor3uivEXT (const GLuint *); -extern void APIENTRY glSecondaryColor3usEXT (GLushort, GLushort, GLushort); -extern void APIENTRY glSecondaryColor3usvEXT (const GLushort *); -extern void APIENTRY glSecondaryColorPointerEXT (GLint, GLenum, GLsizei, GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); -#endif - -#ifndef GL_EXT_texture_perturb_normal -#define GL_EXT_texture_perturb_normal 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTextureNormalEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); -extern void APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); -typedef void (APIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -#endif - -#ifndef GL_EXT_fog_coord -#define GL_EXT_fog_coord 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFogCoordfEXT (GLfloat); -extern void APIENTRY glFogCoordfvEXT (const GLfloat *); -extern void APIENTRY glFogCoorddEXT (GLdouble); -extern void APIENTRY glFogCoorddvEXT (const GLdouble *); -extern void APIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); -typedef void (APIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); -typedef void (APIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); -typedef void (APIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); -typedef void (APIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_REND_screen_coordinates -#define GL_REND_screen_coordinates 1 -#endif - -#ifndef GL_EXT_coordinate_frame -#define GL_EXT_coordinate_frame 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTangent3bEXT (GLbyte, GLbyte, GLbyte); -extern void APIENTRY glTangent3bvEXT (const GLbyte *); -extern void APIENTRY glTangent3dEXT (GLdouble, GLdouble, GLdouble); -extern void APIENTRY glTangent3dvEXT (const GLdouble *); -extern void APIENTRY glTangent3fEXT (GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTangent3fvEXT (const GLfloat *); -extern void APIENTRY glTangent3iEXT (GLint, GLint, GLint); -extern void APIENTRY glTangent3ivEXT (const GLint *); -extern void APIENTRY glTangent3sEXT (GLshort, GLshort, GLshort); -extern void APIENTRY glTangent3svEXT (const GLshort *); -extern void APIENTRY glBinormal3bEXT (GLbyte, GLbyte, GLbyte); -extern void APIENTRY glBinormal3bvEXT (const GLbyte *); -extern void APIENTRY glBinormal3dEXT (GLdouble, GLdouble, GLdouble); -extern void APIENTRY glBinormal3dvEXT (const GLdouble *); -extern void APIENTRY glBinormal3fEXT (GLfloat, GLfloat, GLfloat); -extern void APIENTRY glBinormal3fvEXT (const GLfloat *); -extern void APIENTRY glBinormal3iEXT (GLint, GLint, GLint); -extern void APIENTRY glBinormal3ivEXT (const GLint *); -extern void APIENTRY glBinormal3sEXT (GLshort, GLshort, GLshort); -extern void APIENTRY glBinormal3svEXT (const GLshort *); -extern void APIENTRY glTangentPointerEXT (GLenum, GLsizei, const GLvoid *); -extern void APIENTRY glBinormalPointerEXT (GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); -typedef void (APIENTRY * PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRY * PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); -typedef void (APIENTRY * PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); -typedef void (APIENTRY * PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); -typedef void (APIENTRY * PFNGLTANGENT3IVEXTPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); -typedef void (APIENTRY * PFNGLTANGENT3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRY * PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); -typedef void (APIENTRY * PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRY * PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); -typedef void (APIENTRY * PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); -typedef void (APIENTRY * PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); -typedef void (APIENTRY * PFNGLBINORMAL3IVEXTPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); -typedef void (APIENTRY * PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_texture_env_combine -#define GL_EXT_texture_env_combine 1 -#endif - -#ifndef GL_APPLE_specular_vector -#define GL_APPLE_specular_vector 1 -#endif - -#ifndef GL_APPLE_transform_hint -#define GL_APPLE_transform_hint 1 -#endif - -#ifndef GL_SGIX_fog_scale -#define GL_SGIX_fog_scale 1 -#endif - -#ifndef GL_SUNX_constant_data -#define GL_SUNX_constant_data 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFinishTextureSUNX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); -#endif - -#ifndef GL_SUN_global_alpha -#define GL_SUN_global_alpha 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glGlobalAlphaFactorbSUN (GLbyte); -extern void APIENTRY glGlobalAlphaFactorsSUN (GLshort); -extern void APIENTRY glGlobalAlphaFactoriSUN (GLint); -extern void APIENTRY glGlobalAlphaFactorfSUN (GLfloat); -extern void APIENTRY glGlobalAlphaFactordSUN (GLdouble); -extern void APIENTRY glGlobalAlphaFactorubSUN (GLubyte); -extern void APIENTRY glGlobalAlphaFactorusSUN (GLushort); -extern void APIENTRY glGlobalAlphaFactoruiSUN (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); -#endif - -#ifndef GL_SUN_triangle_list -#define GL_SUN_triangle_list 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glReplacementCodeuiSUN (GLuint); -extern void APIENTRY glReplacementCodeusSUN (GLushort); -extern void APIENTRY glReplacementCodeubSUN (GLubyte); -extern void APIENTRY glReplacementCodeuivSUN (const GLuint *); -extern void APIENTRY glReplacementCodeusvSUN (const GLushort *); -extern void APIENTRY glReplacementCodeubvSUN (const GLubyte *); -extern void APIENTRY glReplacementCodePointerSUN (GLenum, GLsizei, const GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); -#endif - -#ifndef GL_SUN_vertex -#define GL_SUN_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glColor4ubVertex2fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat); -extern void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *, const GLfloat *); -extern void APIENTRY glColor4ubVertex3fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *, const GLfloat *); -extern void APIENTRY glColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glColor3fVertex3fvSUN (const GLfloat *, const GLfloat *); -extern void APIENTRY glNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *); -extern void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord2fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord4fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat, GLfloat, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *, const GLubyte *, const GLfloat *); -extern void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLenum *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLenum, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLenum *, const GLubyte *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLenum rc, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLenum rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLenum *rc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLenum rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLenum rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -#endif - -#ifndef GL_EXT_blend_func_separate -#define GL_EXT_blend_func_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glBlendFuncSeparateEXT (GLenum, GLenum, GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif - -#ifndef GL_INGR_color_clamp -#define GL_INGR_color_clamp 1 -#endif - -#ifndef GL_INGR_interlace_read -#define GL_INGR_interlace_read 1 -#endif - -#ifndef GL_EXT_stencil_wrap -#define GL_EXT_stencil_wrap 1 -#endif - -#ifndef GL_EXT_422_pixels -#define GL_EXT_422_pixels 1 -#endif - -#ifndef GL_NV_texgen_reflection -#define GL_NV_texgen_reflection 1 -#endif - -#ifndef GL_SUN_convolution_border_modes -#define GL_SUN_convolution_border_modes 1 -#endif - -#ifndef GL_EXT_texture_env_add -#define GL_EXT_texture_env_add 1 -#endif - -#ifndef GL_EXT_texture_lod_bias -#define GL_EXT_texture_lod_bias 1 -#endif - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 -#endif - -#ifndef GL_EXT_vertex_weighting -#define GL_EXT_vertex_weighting 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glVertexWeightfEXT (GLfloat); -extern void APIENTRY glVertexWeightfvEXT (const GLfloat *); -extern void APIENTRY glVertexWeightPointerEXT (GLsizei, GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); -typedef void (APIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); -typedef void (APIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_NV_light_max_exponent -#define GL_NV_light_max_exponent 1 -#endif - -#ifndef GL_NV_vertex_array_range -#define GL_NV_vertex_array_range 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFlushVertexArrayRangeNV (void); -extern void APIENTRY glVertexArrayRangeNV (GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); -typedef void (APIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei size, const GLvoid *pointer); -#endif - -#ifndef GL_NV_register_combiners -#define GL_NV_register_combiners 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glCombinerParameterfvNV (GLenum, const GLfloat *); -extern void APIENTRY glCombinerParameterfNV (GLenum, GLfloat); -extern void APIENTRY glCombinerParameterivNV (GLenum, const GLint *); -extern void APIENTRY glCombinerParameteriNV (GLenum, GLint); -extern void APIENTRY glCombinerInputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); -extern void APIENTRY glCombinerOutputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); -extern void APIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum); -extern void APIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *); -extern void APIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *); -extern void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -typedef void (APIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); -#endif - -#ifndef GL_NV_fog_distance -#define GL_NV_fog_distance 1 -#endif - -#ifndef GL_NV_texgen_emboss -#define GL_NV_texgen_emboss 1 -#endif - -#ifndef GL_NV_blend_square -#define GL_NV_blend_square 1 -#endif - -#ifndef GL_NV_texture_env_combine4 -#define GL_NV_texture_env_combine4 1 -#endif - -#ifndef GL_MESA_resize_buffers -#define GL_MESA_resize_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glResizeBuffersMESA (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); -#endif - -#ifndef GL_MESA_window_pos -#define GL_MESA_window_pos 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glWindowPos2dMESA (GLdouble, GLdouble); -extern void APIENTRY glWindowPos2dvMESA (const GLdouble *); -extern void APIENTRY glWindowPos2fMESA (GLfloat, GLfloat); -extern void APIENTRY glWindowPos2fvMESA (const GLfloat *); -extern void APIENTRY glWindowPos2iMESA (GLint, GLint); -extern void APIENTRY glWindowPos2ivMESA (const GLint *); -extern void APIENTRY glWindowPos2sMESA (GLshort, GLshort); -extern void APIENTRY glWindowPos2svMESA (const GLshort *); -extern void APIENTRY glWindowPos3dMESA (GLdouble, GLdouble, GLdouble); -extern void APIENTRY glWindowPos3dvMESA (const GLdouble *); -extern void APIENTRY glWindowPos3fMESA (GLfloat, GLfloat, GLfloat); -extern void APIENTRY glWindowPos3fvMESA (const GLfloat *); -extern void APIENTRY glWindowPos3iMESA (GLint, GLint, GLint); -extern void APIENTRY glWindowPos3ivMESA (const GLint *); -extern void APIENTRY glWindowPos3sMESA (GLshort, GLshort, GLshort); -extern void APIENTRY glWindowPos3svMESA (const GLshort *); -extern void APIENTRY glWindowPos4dMESA (GLdouble, GLdouble, GLdouble, GLdouble); -extern void APIENTRY glWindowPos4dvMESA (const GLdouble *); -extern void APIENTRY glWindowPos4fMESA (GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glWindowPos4fvMESA (const GLfloat *); -extern void APIENTRY glWindowPos4iMESA (GLint, GLint, GLint, GLint); -extern void APIENTRY glWindowPos4ivMESA (const GLint *); -extern void APIENTRY glWindowPos4sMESA (GLshort, GLshort, GLshort, GLshort); -extern void APIENTRY glWindowPos4svMESA (const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); -typedef void (APIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); -typedef void (APIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); -typedef void (APIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); -typedef void (APIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); -#endif - -#ifndef GL_IBM_cull_vertex -#define GL_IBM_cull_vertex 1 -#endif - -#ifndef GL_IBM_multimode_draw_arrays -#define GL_IBM_multimode_draw_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glMultiModeDrawArraysIBM (GLenum, const GLint *, const GLsizei *, GLsizei, GLint); -extern void APIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* *, GLsizei, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -typedef void (APIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount, GLint modestride); -#endif - -#ifndef GL_IBM_vertex_array_lists -#define GL_IBM_vertex_array_lists 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glSecondaryColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glEdgeFlagPointerListIBM (GLint, const GLboolean* *, GLint); -extern void APIENTRY glFogCoordPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glIndexPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glNormalPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glTexCoordPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glVertexPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -#endif - -#ifndef GL_SGIX_subsample -#define GL_SGIX_subsample 1 -#endif - -#ifndef GL_SGIX_ycrcba -#define GL_SGIX_ycrcba 1 -#endif - -#ifndef GL_SGIX_ycrcb_subsample -#define GL_SGIX_ycrcb_subsample 1 -#endif - -#ifndef GL_SGIX_depth_pass_instrument -#define GL_SGIX_depth_pass_instrument 1 -#endif - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_3DFX_texture_compression_FXT1 1 -#endif - -#ifndef GL_3DFX_multisample -#define GL_3DFX_multisample 1 -#endif - -#ifndef GL_3DFX_tbuffer -#define GL_3DFX_tbuffer 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTbufferMask3DFX (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); -#endif - -#ifndef GL_EXT_multisample -#define GL_EXT_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSampleMaskEXT (GLclampf, GLboolean); -extern void APIENTRY glSamplePatternEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); -#endif - -#ifndef GL_SGI_vertex_preclip -#define GL_SGI_vertex_preclip 1 -#endif - -#ifndef GL_SGIX_convolution_accuracy -#define GL_SGIX_convolution_accuracy 1 -#endif - -#ifndef GL_SGIX_resample -#define GL_SGIX_resample 1 -#endif - -#ifndef GL_SGIS_point_line_texgen -#define GL_SGIS_point_line_texgen 1 -#endif - -#ifndef GL_SGIS_texture_color_mask -#define GL_SGIS_texture_color_mask 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTextureColorMaskSGIS (GLboolean, GLboolean, GLboolean, GLboolean); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -#endif - -#ifndef GL_SGIX_igloo_interface -#define GL_SGIX_igloo_interface 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glIglooInterfaceSGIX (GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); -#endif - - -#ifdef __cplusplus -} -#endif diff --git a/codemp/rd-dedicated/tr_backend.cpp b/codemp/rd-dedicated/tr_backend.cpp index e59b962977..08bfa3cf93 100644 --- a/codemp/rd-dedicated/tr_backend.cpp +++ b/codemp/rd-dedicated/tr_backend.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "tr_local.h" backEndData_t *backEndData; diff --git a/codemp/rd-dedicated/tr_ghoul2.cpp b/codemp/rd-dedicated/tr_ghoul2.cpp index d7c9afbeca..cbc00588a3 100644 --- a/codemp/rd-dedicated/tr_ghoul2.cpp +++ b/codemp/rd-dedicated/tr_ghoul2.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "client/client.h" //FIXME!! EVIL - just include the definitions needed #include "tr_local.h" #include "qcommon/matcomp.h" @@ -8,9 +30,6 @@ #include "ghoul2/G2_gore.h" #endif -#ifdef _MSC_VER -#pragma warning (disable: 4512) //default assignment operator could not be gened -#endif #include "qcommon/disablewarnings.h" #define LL(x) x=LittleLong(x) @@ -297,10 +316,10 @@ class CBoneCache const model_t *mod; // these are split for better cpu cache behavior - vector mBones; - vector mFinalBones; + std::vector mBones; + std::vector mFinalBones; - vector mSmoothBones; // for render smoothing + std::vector mSmoothBones; // for render smoothing //vector mSkels; boneInfo_v *rootBoneList; diff --git a/codemp/rd-dedicated/tr_init.cpp b/codemp/rd-dedicated/tr_init.cpp index 1c40ef798f..e36f136c90 100644 --- a/codemp/rd-dedicated/tr_init.cpp +++ b/codemp/rd-dedicated/tr_init.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_init.c -- functions that are not called every frame #include "tr_local.h" @@ -454,10 +477,6 @@ void R_Init( void ) { memset( &tr, 0, sizeof( tr ) ); memset( &backEnd, 0, sizeof( backEnd ) ); -#ifdef _WIN32 - tr.wv = (WinVars_t *)ri->GetWinVars(); -#endif - // Swap_Init(); // @@ -488,8 +507,8 @@ void R_Init( void ) { } R_Register(); - max_polys = (std::min)( r_maxpolys->integer, DEFAULT_MAX_POLYS ); - max_polyverts = (std::min)( r_maxpolyverts->integer, DEFAULT_MAX_POLYVERTS ); + max_polys = Q_min( r_maxpolys->integer, DEFAULT_MAX_POLYS ); + max_polyverts = Q_min( r_maxpolyverts->integer, DEFAULT_MAX_POLYVERTS ); ptr = (byte *)Hunk_Alloc( sizeof( *backEndData ) + sizeof(srfPoly_t) * max_polys + sizeof(polyVert_t) * max_polyverts, h_low); backEndData = (backEndData_t *) ptr; diff --git a/codemp/rd-dedicated/tr_local.h b/codemp/rd-dedicated/tr_local.h index cb8f8490ea..d09f278056 100644 --- a/codemp/rd-dedicated/tr_local.h +++ b/codemp/rd-dedicated/tr_local.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once typedef unsigned int GLuint; @@ -934,10 +957,6 @@ typedef struct backEndState_s { #define NUM_SCRATCH_IMAGES 16 -#ifdef _WIN32 - #include "../win32/win_local.h" -#endif - typedef struct trGlobals_s { qboolean registered; // cleared at shutdown, set at beginRegistration @@ -1045,10 +1064,6 @@ typedef struct trGlobals_s { float rangedFog; float distanceCull; - -#ifdef _WIN32 - WinVars_t *wv; -#endif } trGlobals_t; @@ -1578,9 +1593,6 @@ ANIMATED MODELS /* Ghoul2 Insert Start */ -#ifdef _MSC_VER -#pragma warning (disable: 4512) //default assignment operator could not be gened -#endif class CRenderableSurface { public: diff --git a/codemp/rd-dedicated/tr_main.cpp b/codemp/rd-dedicated/tr_main.cpp index 8d79f997f5..e1c1f442c1 100644 --- a/codemp/rd-dedicated/tr_main.cpp +++ b/codemp/rd-dedicated/tr_main.cpp @@ -1,11 +1,29 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_main.c -- main control flow for each frame #include "tr_local.h" #include "ghoul2/g2_local.h" -// Yeah, this might be kind of bad, but no linux version is planned so far :-) - AReis -// Gee- thanks guys - jdrews, the linux porter... -#ifdef _WIN32 - #include "win32/glw_win.h" -#endif trGlobals_t tr; diff --git a/codemp/rd-dedicated/tr_mesh.cpp b/codemp/rd-dedicated/tr_mesh.cpp index 7338e49799..84a5fb2826 100644 --- a/codemp/rd-dedicated/tr_mesh.cpp +++ b/codemp/rd-dedicated/tr_mesh.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_mesh.c: triangle model functions #include "tr_local.h" diff --git a/codemp/rd-dedicated/tr_model.cpp b/codemp/rd-dedicated/tr_model.cpp index 949f65108b..f048d79a6b 100644 --- a/codemp/rd-dedicated/tr_model.cpp +++ b/codemp/rd-dedicated/tr_model.cpp @@ -1,22 +1,34 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_models.c -- model loading and caching #include "tr_local.h" - - #include "qcommon/disablewarnings.h" - -#ifdef _MSC_VER -#pragma warning (push, 3) //go back down to 3 for the stl include -#endif #include "qcommon/sstring.h" // #include + #include #include -#ifdef _MSC_VER -#pragma warning (pop) -#endif - -using namespace std; - #define LL(x) x=LittleLong(x) @@ -44,8 +56,8 @@ Ghoul2 Insert End // This stuff looks a bit messy, but it's kept here as black box, and nothing appears in any .H files for other // modules to worry about. I may make another module for this sometime. // -typedef pair StringOffsetAndShaderIndexDest_t; -typedef vector ShaderRegisterData_t; +typedef std::pair StringOffsetAndShaderIndexDest_t; +typedef std::vector ShaderRegisterData_t; struct CachedEndianedModelBinary_s { void *pModelDiskImage; @@ -65,7 +77,7 @@ struct CachedEndianedModelBinary_s } }; typedef struct CachedEndianedModelBinary_s CachedEndianedModelBinary_t; -typedef map CachedModels_t; +typedef std::map CachedModels_t; CachedModels_t *CachedModels = NULL; // the important cache item. void RE_RegisterModels_StoreShaderRequest(const char *psModelFileName, const char *psShaderName, int *piShaderIndexPoke) diff --git a/codemp/rd-dedicated/tr_shader.cpp b/codemp/rd-dedicated/tr_shader.cpp index 829526cc90..03501c90e8 100644 --- a/codemp/rd-dedicated/tr_shader.cpp +++ b/codemp/rd-dedicated/tr_shader.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_shader.c -- this file deals with the parsing and definition of shaders #include "tr_local.h" @@ -2060,7 +2083,7 @@ static qboolean ParseShader( const char **text ) else if ( token[0] == '{' ) { if ( s >= MAX_SHADER_STAGES ) { - ri->Printf( PRINT_WARNING, "WARNING: too many stages in shader %s\n", shader.name ); + ri->Printf( PRINT_WARNING, "WARNING: too many stages in shader %s (max is %i)\n", shader.name, MAX_SHADER_STAGES ); return qfalse; } diff --git a/codemp/rd-dedicated/tr_skin.cpp b/codemp/rd-dedicated/tr_skin.cpp index 81bc849700..0fac2de75e 100644 --- a/codemp/rd-dedicated/tr_skin.cpp +++ b/codemp/rd-dedicated/tr_skin.cpp @@ -1,14 +1,30 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_image.c #include "tr_local.h" -#ifdef _MSC_VER -#pragma warning (push, 3) //go back down to 3 for the stl include -#endif #include -#ifdef _MSC_VER -#pragma warning (pop) -#endif -using namespace std; + bool gServerSkinHack = false; shader_t *R_FindServerShader( const char *name, const int *lightmapIndex, const byte *styles, qboolean mipRawImage ); @@ -247,7 +263,7 @@ static char *CommaParse( char **data_p ) { while ( 1 ) { // skip whitespace - while( (c = *data) <= ' ') { + while( (c = *(const unsigned char* /*eurofix*/)data) <= ' ') { if( !c ) { break; } diff --git a/codemp/rd-vanilla/CMakeLists.txt b/codemp/rd-vanilla/CMakeLists.txt index 9404ba0d44..f31b98327c 100644 --- a/codemp/rd-vanilla/CMakeLists.txt +++ b/codemp/rd-vanilla/CMakeLists.txt @@ -1,12 +1,35 @@ -cmake_minimum_required(VERSION 2.8.8) +#============================================================================ +# Copyright (C) 2013 - 2015, OpenJK contributors +# +# This file is part of the OpenJK source code. +# +# OpenJK is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +#============================================================================ # Make sure the user is not executing this script directly if(NOT InOpenJK) message(FATAL_ERROR "Use the top-level cmake script!") endif(NOT InOpenJK) +# Check for dependencies first + set(MPVanillaRendererIncludeDirectories ${MPDir}) -set(MPVanillaRendererIncludeDirectories ${MPVanillaRendererIncludeDirectories} "${MPDir}/rd-vanilla") +set(MPVanillaRendererIncludeDirectories + ${MPVanillaRendererIncludeDirectories} + ${SharedDir} + ${MPDir} + "${MPDir}/rd-vanilla" + ) set(MPVanillaRendererFiles "${MPDir}/rd-vanilla/glext.h" @@ -72,16 +95,22 @@ set(MPVanillaRendererRdCommonFiles source_group("rd-common" FILES ${MPVanillaRendererRdCommonFiles}) set(MPVanillaRendererFiles ${MPVanillaRendererFiles} ${MPVanillaRendererRdCommonFiles}) -set(MPVanillaRendererQcommonFiles +set(MPVanillaRendererCommonFiles "${MPDir}/qcommon/matcomp.cpp" "${MPDir}/qcommon/q_math.cpp" "${MPDir}/qcommon/q_shared.cpp") -source_group("qcommon" FILES ${MPVanillaRendererQcommonFiles}) -set(MPVanillaRendererFiles ${MPVanillaRendererFiles} ${MPVanillaRendererQcommonFiles}) +source_group("common" FILES ${MPVanillaRendererCommonFiles}) +set(MPVanillaRendererFiles ${MPVanillaRendererFiles} ${MPVanillaRendererCommonFiles}) -file(GLOB_RECURSE MPVanillaRendererJpegFiles "${OpenJKLibDir}/jpeg-8c/*.c" "${OpenJKLibDir}/jpeg-8c/*.h") -source_group("jpeg-8c" FILES ${MPVanillaRendererJpegFiles}) -set(MPVanillaRendererFiles ${MPVanillaRendererFiles} ${MPVanillaRendererJpegFiles}) +if(UseInternalJPEG) + file(GLOB_RECURSE MPVanillaRendererJpegFiles "${OpenJKLibDir}/jpeg-8c/*.c" "${OpenJKLibDir}/jpeg-8c/*.h") + source_group("jpeg-8c" FILES ${MPVanillaRendererJpegFiles}) + set(MPVanillaRendererFiles ${MPVanillaRendererFiles} ${MPVanillaRendererJpegFiles}) +else() + find_package(JPEG REQUIRED) + set(MPVanillaRendererIncludeDirectories ${MPVanillaRendererIncludeDirectories} ${JPEG_INCLUDE_DIR}) + set(MPVanillaRendererLibraries ${MPVanillaRendererLibraries} ${JPEG_LIBRARIES}) +endif() if(UseInternalPNG) set(MPVanillaRendererLibPngFiles @@ -147,49 +176,37 @@ else() set(MPVanillaRendererLibraries ${MPVanillaRendererLibraries} ${ZLIB_LIBRARY}) endif() -if(NOT WIN32) - find_package(OpenGL REQUIRED) - set(MPVanillaRendererIncludeDirectories ${MPVanillaRendererIncludeDirectories} ${OPENGL_INCLUDE_DIR}) - set(MPVanillaRendererLibraries ${MPVanillaRendererLibraries} ${OPENGL_LIBRARIES}) - - set(SDL2_BUILDING_LIBRARY ON) # don't want main() in Renderer - find_package(SDL2 REQUIRED) - set(MPVanillaRendererIncludeDirectories ${MPVanillaRendererIncludeDirectories} ${SDL2_INCLUDE_DIR}) - set(MPVanillaRendererLibraries ${MPVanillaRendererLibraries} ${SDL2_LIBRARY}) -endif(NOT WIN32) - - -if(WIN32) - set(MPVanillaRendererWin32Files - "${MPDir}/win32/win_gamma.cpp" - "${MPDir}/win32/win_glimp.cpp" - "${MPDir}/win32/win_qgl.cpp") - source_group("win32" FILES ${MPVanillaRendererWin32Files}) - set(MPVanillaRendererFiles ${MPVanillaRendererFiles} ${MPVanillaRendererWin32Files}) -else(WIN32) - set(MPVanillaRendererSysFiles - "${MPDir}/sdl/sdl_glimp.cpp") - source_group("sys" FILES ${MPVanillaRendererSysFiles}) - set(MPVanillaRendererFiles ${MPVanillaRendererFiles} ${MPVanillaRendererSysFiles}) -endif(WIN32) +find_package(OpenGL REQUIRED) +set(MPVanillaRendererIncludeDirectories ${MPVanillaRendererIncludeDirectories} ${OPENGL_INCLUDE_DIR}) +set(MPVanillaRendererLibraries ${MPVanillaRendererLibraries} ${OPENGL_LIBRARIES}) set(MPVanillaRendererIncludeDirectories ${MPVanillaRendererIncludeDirectories} ${OpenJKLibDir}) add_library(${MPVanillaRenderer} SHARED ${MPVanillaRendererFiles}) -if(NOT WIN32) +if(NOT MSVC) # remove "lib" prefix for .so/.dylib files set_target_properties(${MPVanillaRenderer} PROPERTIES PREFIX "") -endif(NOT WIN32) +endif() if(WIN32) - install(TARGETS ${MPVanillaRenderer} RUNTIME DESTINATION ".") + install(TARGETS ${MPVanillaRenderer} + RUNTIME + DESTINATION ${JKAInstallDir} + COMPONENT ${JKAMPClientComponent}) else(WIN32) if(MakeApplicationBundles AND BuildMPEngine) - install(TARGETS ${MPVanillaRenderer} LIBRARY DESTINATION "${MPEngine}.app/Contents/MacOS/") - else(MakeApplicationBundles AND BuildMPEngine) - install(TARGETS ${MPVanillaRenderer} LIBRARY DESTINATION ".") - endif(MakeApplicationBundles AND BuildMPEngine) -endif(WIN32) + install(TARGETS ${MPVanillaRenderer} + LIBRARY + DESTINATION "${JKAInstallDir}/${MPEngine}.app/Contents/MacOS/" + COMPONENT ${JKAMPClientComponent}) + else() + install(TARGETS ${MPVanillaRenderer} + LIBRARY + DESTINATION ${JKAInstallDir} + COMPONENT ${JKAMPClientComponent}) + endif() +endif() + set_target_properties(${MPVanillaRenderer} PROPERTIES COMPILE_DEFINITIONS_RELWITHDEBINFO "${SharedDefines};${ReleaseDefines}") set_target_properties(${MPVanillaRenderer} PROPERTIES COMPILE_DEFINITIONS_MINSIZEREL "${SharedDefines};${ReleaseDefines}") set_target_properties(${MPVanillaRenderer} PROPERTIES COMPILE_DEFINITIONS_RELEASE "${SharedDefines};${ReleaseDefines}") diff --git a/codemp/rd-vanilla/G2_API.cpp b/codemp/rd-vanilla/G2_API.cpp index 09b7bcfa9c..200a517ac5 100644 --- a/codemp/rd-vanilla/G2_API.cpp +++ b/codemp/rd-vanilla/G2_API.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "ghoul2/G2.h" #include "ghoul2/g2_local.h" #include "ghoul2/G2_gore.h" @@ -6,14 +28,7 @@ #include "tr_local.h" #include - -#ifdef _MSC_VER -#pragma warning (push, 3) //go back down to 3 for the stl include -#endif #include -#ifdef _MSC_VER -#pragma warning (pop) -#endif #ifdef _FULL_G2_LEAK_CHECKING int g_Ghoul2Allocations = 0; @@ -287,7 +302,7 @@ qboolean G2API_OverrideServerWithClientData(CGhoul2Info_v& ghoul2, int modelInde static size_t GetSizeOfGhoul2Info ( const CGhoul2Info& g2Info ) { size_t size = 0; - + // This is pretty ugly, but we don't want to save everything in the CGhoul2Info object. size += offsetof (CGhoul2Info, mTransformedVertsArray) - offsetof (CGhoul2Info, mModelindex); @@ -310,7 +325,7 @@ static size_t SerializeGhoul2Info ( char *buffer, const CGhoul2Info& g2Info ) { char *base = buffer; size_t blockSize; - + // Oh the ugliness... blockSize = offsetof (CGhoul2Info, mTransformedVertsArray) - offsetof (CGhoul2Info, mModelindex); memcpy (buffer, &g2Info.mModelindex, blockSize); @@ -327,7 +342,7 @@ static size_t SerializeGhoul2Info ( char *buffer, const CGhoul2Info& g2Info ) // Bones vector + size *(int *)buffer = g2Info.mBlist.size(); buffer += sizeof (int); - + blockSize = g2Info.mBlist.size() * sizeof (boneInfo_t); memcpy (buffer, g2Info.mBlist.data(), g2Info.mBlist.size() * sizeof (boneInfo_t)); buffer += blockSize; @@ -335,7 +350,7 @@ static size_t SerializeGhoul2Info ( char *buffer, const CGhoul2Info& g2Info ) // Bolts vector + size *(int *)buffer = g2Info.mBltlist.size(); buffer += sizeof (int); - + blockSize = g2Info.mBltlist.size() * sizeof (boltInfo_t); memcpy (buffer, g2Info.mBltlist.data(), g2Info.mBltlist.size() * sizeof (boltInfo_t)); buffer += blockSize; @@ -378,9 +393,9 @@ static size_t DeserializeGhoul2Info ( const char *buffer, CGhoul2Info& g2Info ) class Ghoul2InfoArray : public IGhoul2InfoArray { - vector mInfos[MAX_G2_MODELS]; + std::vector mInfos[MAX_G2_MODELS]; int mIds[MAX_G2_MODELS]; - list mFreeIndecies; + std::list mFreeIndecies; void DeleteLow(int idx) { for (size_t model=0; model< mInfos[idx].size(); model++) @@ -418,7 +433,7 @@ class Ghoul2InfoArray : public IGhoul2InfoArray size_t GetSerializedSize() const { - size_t size = 0; + size_t size = 0; size += sizeof (int); // size of mFreeIndecies linked list size += mFreeIndecies.size() * sizeof (int); @@ -493,7 +508,7 @@ class Ghoul2InfoArray : public IGhoul2InfoArray buffer += sizeof (int); mInfos[i].resize (count); - + for ( size_t j = 0; j < count; j++ ) { buffer += DeserializeGhoul2Info (buffer, mInfos[i][j]); @@ -577,16 +592,16 @@ class Ghoul2InfoArray : public IGhoul2InfoArray DeleteLow(handle&G2_INDEX_MASK); } } - vector &Get(int handle) + std::vector &Get(int handle) { assert(handle>0); //null handle assert((handle&G2_INDEX_MASK)>=0&&(handle&G2_INDEX_MASK)=MAX_G2_MODELS||mIds[handle&G2_INDEX_MASK]!=handle)); - + return mInfos[handle&G2_INDEX_MASK]; } - const vector &Get(int handle) const + const std::vector &Get(int handle) const { assert(handle>0); assert(mIds[handle&G2_INDEX_MASK]==handle); // not a valid handle, could be old or garbage @@ -648,7 +663,10 @@ void RestoreGhoul2InfoArray() return; } - size_t read = singleton->Deserialize ((const char *)data, size); +#ifdef _DEBUG + size_t read = +#endif + singleton->Deserialize ((const char *)data, size); Z_Free ((void *)data); assert (read == size); @@ -659,7 +677,10 @@ void SaveGhoul2InfoArray() { size_t size = singleton->GetSerializedSize(); void *data = Z_Malloc (size, TAG_GHOUL2); - size_t written = singleton->Serialize ((char *)data); +#ifdef _DEBUG + size_t written = +#endif + singleton->Serialize ((char *)data); assert (written == size); @@ -829,7 +850,7 @@ int G2API_InitGhoul2Model(CGhoul2Info_v **ghoul2Ptr, const char *fileName, int m } else { - G2_Init_Bone_List(ghoul2[model].mBlist); + G2_Init_Bone_List(ghoul2[model].mBlist, ghoul2[model].aHeader->numBones); G2_Init_Bolt_List(ghoul2[model].mBltlist); ghoul2[model].mCustomShader = customShader; ghoul2[model].mCustomSkin = customSkin; @@ -2058,20 +2079,18 @@ qboolean G2API_GetBoltMatrix(CGhoul2Info_v &ghoul2, const int modelIndex, const if (!gG2_GBMUseSPMethod) { //this is horribly stupid and I hate it. But lots of game code is written to assume this 90 degree offset thing. - mdxaBone_t rotMat, tempMatrix; - vec3_t newangles = {0,270,0}; - Create_Matrix(newangles, &rotMat); - // make the model space matrix we have for this bolt into a world matrix - Multiply_3x4Matrix(&tempMatrix, &worldMatrix, &bolt); - vec3_t origin; - origin[0] = tempMatrix.matrix[0][3]; - origin[1] = tempMatrix.matrix[1][3]; - origin[2] = tempMatrix.matrix[2][3]; - tempMatrix.matrix[0][3] = tempMatrix.matrix[1][3] = tempMatrix.matrix[2][3] = 0; - Multiply_3x4Matrix(matrix, &tempMatrix, &rotMat); - matrix->matrix[0][3] = origin[0]; - matrix->matrix[1][3] = origin[1]; - matrix->matrix[2][3] = origin[2]; + float ftemp; + ftemp = matrix->matrix[0][0]; + matrix->matrix[0][0] = -matrix->matrix[0][1]; + matrix->matrix[0][1] = ftemp; + + ftemp = matrix->matrix[1][0]; + matrix->matrix[1][0] = -matrix->matrix[1][1]; + matrix->matrix[1][1] = ftemp; + + ftemp = matrix->matrix[2][0]; + matrix->matrix[2][0] = -matrix->matrix[2][1]; + matrix->matrix[2][1] = ftemp; } else { //reset it diff --git a/codemp/rd-vanilla/G2_bolts.cpp b/codemp/rd-vanilla/G2_bolts.cpp index ae63d69eee..db30d6f633 100644 --- a/codemp/rd-vanilla/G2_bolts.cpp +++ b/codemp/rd-vanilla/G2_bolts.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "ghoul2/G2.h" #include "ghoul2/g2_local.h" diff --git a/codemp/rd-vanilla/G2_bones.cpp b/codemp/rd-vanilla/G2_bones.cpp index ff6ff81f2d..4d95362460 100644 --- a/codemp/rd-vanilla/G2_bones.cpp +++ b/codemp/rd-vanilla/G2_bones.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "qcommon/matcomp.h" #include "ghoul2/G2.h" @@ -937,8 +959,8 @@ qboolean G2_Pause_Bone_Anim(CGhoul2Info *ghlInfo, boneInfo_v &blist, const char // are we pausing or un pausing? if (blist[index].pauseTime) { - int startFrame, endFrame, flags; - float currentFrame, animSpeed; + int startFrame = 0, endFrame = 0, flags = 0; + float currentFrame = 0.0f, animSpeed = 1.0f; // figure out what frame we are on now G2_Get_Bone_Anim(ghlInfo, blist, boneName, blist[index].pauseTime, ¤tFrame, &startFrame, &endFrame, &flags, &animSpeed, NULL, 0); @@ -1231,7 +1253,7 @@ enum ERagState }; static int ragState; -static vector rag; // once we get the dependents precomputed this can be local +static std::vector rag; // once we get the dependents precomputed this can be local static void G2_Generate_MatrixRag( @@ -1591,7 +1613,7 @@ void G2_ResetRagDoll(CGhoul2Info_v &ghoul2V) boneInfo_v &blist = ghoul2.mBlist; #if 1 //Eh, screw it. Ragdoll does a lot of terrible things to the bones that probably aren't directly reversible, so just reset it all. - G2_Init_Bone_List(blist); + G2_Init_Bone_List(blist, ghoul2.aHeader->numBones); #else //The anims on every bone are messed up too, as are the angles. There's not really any way to get back to a normal state, so just clear the list //and let them re-set their anims/angles gameside. int i = 0; @@ -4836,9 +4858,10 @@ qboolean G2_IKMove(CGhoul2Info_v &ghoul2, int time, sharedIKMoveParams_t *params } // set the bone list to all unused so the bone transformation routine ignores it. -void G2_Init_Bone_List(boneInfo_v &blist) +void G2_Init_Bone_List(boneInfo_v &blist, int numBones) { blist.clear(); + blist.reserve(numBones); } void G2_RemoveRedundantBoneOverrides(boneInfo_v &blist, int *activeBones) diff --git a/codemp/rd-vanilla/G2_misc.cpp b/codemp/rd-vanilla/G2_misc.cpp index f762a98c36..3a84d7162f 100644 --- a/codemp/rd-vanilla/G2_misc.cpp +++ b/codemp/rd-vanilla/G2_misc.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "qcommon/matcomp.h" #include "ghoul2/G2.h" #include "qcommon/MiniHeap.h" @@ -15,8 +37,8 @@ static int CurrentTag=GORE_TAG_UPPER+1; static int CurrentTagUpper=GORE_TAG_UPPER; -static map GoreRecords; -static map,int> GoreTagsTemp; // this is a surface index to gore tag map used only +static std::map GoreRecords; +static std::map,int> GoreTagsTemp; // this is a surface index to gore tag map used only // temporarily during the generation phase so we reuse gore tags per LOD int goreModelIndex; @@ -43,7 +65,7 @@ int AllocGoreRecord() while (GoreRecords.size()>MAX_GORE_RECORDS) { int tagHigh=(*GoreRecords.begin()).first&GORE_TAG_MASK; - map::iterator it; + std::map::iterator it; GoreTextureCoordinates *gTC; it = GoreRecords.begin(); @@ -85,7 +107,7 @@ void ResetGoreTag() GoreTextureCoordinates *FindGoreRecord(int tag) { - map::iterator i=GoreRecords.find(tag); + std::map::iterator i=GoreRecords.find(tag); if (i!=GoreRecords.end()) { return &(*i).second; @@ -105,11 +127,11 @@ void DeleteGoreRecord(int tag) } static int CurrentGoreSet=1; // this is a UUID for gore sets -static map GoreSets; // map from uuid to goreset +static std::map GoreSets; // map from uuid to goreset CGoreSet *FindGoreSet(int goreSetTag) { - map::iterator f=GoreSets.find(goreSetTag); + std::map::iterator f=GoreSets.find(goreSetTag); if (f!=GoreSets.end()) { return (*f).second; @@ -127,7 +149,7 @@ CGoreSet *NewGoreSet() void DeleteGoreSet(int goreSetTag) { - map::iterator f=GoreSets.find(goreSetTag); + std::map::iterator f=GoreSets.find(goreSetTag); if (f!=GoreSets.end()) { if ( (*f).second->mRefCount == 0 || (*f).second->mRefCount - 1 == 0 ) @@ -145,7 +167,7 @@ void DeleteGoreSet(int goreSetTag) CGoreSet::~CGoreSet() { - multimap::iterator i; + std::multimap::iterator i; for (i=mGoreRecords.begin();i!=mGoreRecords.end();++i) { DeleteGoreRecord((*i).second.mGoreTag); @@ -154,10 +176,6 @@ CGoreSet::~CGoreSet() #endif // _SOF2 const mdxaBone_t &EvalBoneCache(int index,CBoneCache *boneCache); - -#ifdef _MSC_VER -#pragma warning(disable : 4512) //assignment op could not be genereated -#endif class CTraceSurface { public: @@ -171,11 +189,7 @@ class CTraceSurface int entNum; int modelIndex; skin_t *skin; -#ifdef _WIN32 - struct shader_t *cust_shader; -#else - shader_t *cust_shader; -#endif + shader_t *cust_shader; size_t *TransformedVertsArray; int traceFlags; bool hitOne; @@ -925,7 +939,7 @@ void G2_GorePolys( const mdxmSurface_t *surface, CTraceSurface &TS, const mdxmSu } int newTag; - map,int>::iterator f=GoreTagsTemp.find(pair(goreModelIndex,TS.surfaceNum)); + std::map,int>::iterator f=GoreTagsTemp.find(std::make_pair(goreModelIndex,TS.surfaceNum)); if (f==GoreTagsTemp.end()) // need to generate a record { newTag=AllocGoreRecord(); @@ -965,8 +979,8 @@ void G2_GorePolys( const mdxmSurface_t *surface, CTraceSurface &TS, const mdxmSu add.mGoreGrowFactor = ( 1.0f - TS.gore->goreScaleStartFraction) / (float)(TS.gore->growDuration); //curscale = (curtime-mGoreGrowStartTime)*mGoreGrowFactor; add.mGoreGrowOffset = TS.gore->goreScaleStartFraction; - goreSet->mGoreRecords.insert(pair(TS.surfaceNum,add)); - GoreTagsTemp[pair(goreModelIndex,TS.surfaceNum)]=newTag; + goreSet->mGoreRecords.insert(std::make_pair(TS.surfaceNum,add)); + GoreTagsTemp[std::make_pair(goreModelIndex,TS.surfaceNum)]=newTag; } else { diff --git a/codemp/rd-vanilla/G2_surfaces.cpp b/codemp/rd-vanilla/G2_surfaces.cpp index ac3ba93e67..2019e09440 100644 --- a/codemp/rd-vanilla/G2_surfaces.cpp +++ b/codemp/rd-vanilla/G2_surfaces.cpp @@ -1,10 +1,29 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "rd-common/tr_types.h" #include "ghoul2/G2.h" #include "ghoul2/g2_local.h" #include "tr_local.h" -#ifdef _MSC_VER -#pragma warning(disable : 4512) //assignment op could not be genereated -#endif class CConstructBoneList { @@ -619,7 +638,7 @@ int G2_IsSurfaceRendered(CGhoul2Info *ghlInfo, const char *surfaceName, surfaceI while (surfNum != -1) { const mdxmSurface_t *parentSurf; - int parentFlags; + int parentFlags = 0; const mdxmSurfHierarchy_t *parentSurfInfo; parentSurfInfo = (mdxmSurfHierarchy_t *)((byte *)surfIndexes + surfIndexes->offsets[surfNum]); diff --git a/codemp/rd-vanilla/glext.h b/codemp/rd-vanilla/glext.h index 7cd6ef69ae..63ea7f2465 100644 --- a/codemp/rd-vanilla/glext.h +++ b/codemp/rd-vanilla/glext.h @@ -1,64 +1,3352 @@ -#pragma once +#ifndef __glext_h_ +#define __glext_h_ 1 #ifdef __cplusplus extern "C" { #endif /* -** License Applicability. Except to the extent portions of this file are -** made subject to an alternative license as permitted in the SGI Free -** Software License B, Version 1.1 (the "License"), the contents of this -** file are subject only to the provisions of the License. You may not use -** this file except in compliance with the License. You may obtain a copy -** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 -** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** Copyright (c) 2013-2014 The Khronos Group Inc. ** -** http://oss.sgi.com/projects/FreeB +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: ** -** Note that, as provided in the License, the Software is distributed on an -** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS -** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND -** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A -** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. ** -** Original Code. The Original Code is: OpenGL Sample Implementation, -** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, -** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. -** Copyright in any portions created by third parties is as indicated -** elsewhere herein. All Rights Reserved. +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ +/* +** This header is generated from the Khronos OpenGL / OpenGL ES XML +** API Registry. The current version of the Registry, generator scripts +** used to make the header, and the header can be found at +** http://www.opengl.org/registry/ ** -** Additional Notice Provisions: This software was created using the -** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has -** not been independently verified as being compliant with the OpenGL(R) -** version 1.2.1 Specification. +** Khronos $Revision: 28986 $ on $Date: 2014-11-18 18:43:15 -0800 (Tue, 18 Nov 2014) $ */ -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) - #define WIN32_LEAN_AND_MEAN 1 - #include +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include #endif #ifndef APIENTRY - #define APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +#ifndef GLAPI +#define GLAPI extern #endif -/*************************************************************/ +#define GL_GLEXT_VERSION 20141118 -/* Header file version number, required by OpenGL ABI for Linux */ -#define GL_GLEXT_VERSION 7 +/* Generated C header for: + * API: gl + * Profile: compatibility + * Versions considered: .* + * Versions emitted: 1\.[2-9]|[234]\.[0-9] + * Default extensions included: gl + * Additional extensions included: _nomatch_^ + * Extensions removed: _nomatch_^ + */ #ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_RESCALE_NORMAL 0x803A +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif +#endif /* GL_VERSION_1_2 */ + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTexture (GLenum texture); +GLAPI void APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); +GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, void *img); +GLAPI void APIENTRY glClientActiveTexture (GLenum texture); +GLAPI void APIENTRY glMultiTexCoord1d (GLenum target, GLdouble s); +GLAPI void APIENTRY glMultiTexCoord1dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord1f (GLenum target, GLfloat s); +GLAPI void APIENTRY glMultiTexCoord1fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord1i (GLenum target, GLint s); +GLAPI void APIENTRY glMultiTexCoord1iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord1s (GLenum target, GLshort s); +GLAPI void APIENTRY glMultiTexCoord1sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t); +GLAPI void APIENTRY glMultiTexCoord2dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t); +GLAPI void APIENTRY glMultiTexCoord2fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord2i (GLenum target, GLint s, GLint t); +GLAPI void APIENTRY glMultiTexCoord2iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord2s (GLenum target, GLshort s, GLshort t); +GLAPI void APIENTRY glMultiTexCoord2sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void APIENTRY glMultiTexCoord3dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void APIENTRY glMultiTexCoord3fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r); +GLAPI void APIENTRY glMultiTexCoord3iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void APIENTRY glMultiTexCoord3sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void APIENTRY glMultiTexCoord4dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void APIENTRY glMultiTexCoord4fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void APIENTRY glMultiTexCoord4iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void APIENTRY glMultiTexCoord4sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *m); +GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *m); +GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *m); +GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *m); +#endif +#endif /* GL_VERSION_1_3 */ + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 #define GL_CONSTANT_COLOR 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 #define GL_CONSTANT_ALPHA 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); +GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param); +GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params); +GLAPI void APIENTRY glFogCoordf (GLfloat coord); +GLAPI void APIENTRY glFogCoordfv (const GLfloat *coord); +GLAPI void APIENTRY glFogCoordd (GLdouble coord); +GLAPI void APIENTRY glFogCoorddv (const GLdouble *coord); +GLAPI void APIENTRY glFogCoordPointer (GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *v); +GLAPI void APIENTRY glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *v); +GLAPI void APIENTRY glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *v); +GLAPI void APIENTRY glSecondaryColor3i (GLint red, GLint green, GLint blue); +GLAPI void APIENTRY glSecondaryColor3iv (const GLint *v); +GLAPI void APIENTRY glSecondaryColor3s (GLshort red, GLshort green, GLshort blue); +GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *v); +GLAPI void APIENTRY glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *v); +GLAPI void APIENTRY glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue); +GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *v); +GLAPI void APIENTRY glSecondaryColor3us (GLushort red, GLushort green, GLushort blue); +GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *v); +GLAPI void APIENTRY glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glWindowPos2d (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dv (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2f (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fv (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2i (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2iv (const GLint *v); +GLAPI void APIENTRY glWindowPos2s (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2sv (const GLshort *v); +GLAPI void APIENTRY glWindowPos3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dv (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fv (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3i (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3iv (const GLint *v); +GLAPI void APIENTRY glWindowPos3s (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3sv (const GLshort *v); +GLAPI void APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void APIENTRY glBlendEquation (GLenum mode); +#endif +#endif /* GL_VERSION_1_4 */ + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 +#include +typedef ptrdiff_t GLsizeiptr; +typedef ptrdiff_t GLintptr; +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 +#define GL_SRC1_ALPHA 0x8589 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_FOG_COORD_SRC 0x8450 +#define GL_FOG_COORD 0x8451 +#define GL_CURRENT_FOG_COORD 0x8453 +#define GL_FOG_COORD_ARRAY_TYPE 0x8454 +#define GL_FOG_COORD_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORD_ARRAY_POINTER 0x8456 +#define GL_FOG_COORD_ARRAY 0x8457 +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D +#define GL_SRC0_RGB 0x8580 +#define GL_SRC1_RGB 0x8581 +#define GL_SRC2_RGB 0x8582 +#define GL_SRC0_ALPHA 0x8588 +#define GL_SRC2_ALPHA 0x858A +typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void *data); +typedef void *(APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsQuery (GLuint id); +GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id); +GLAPI void APIENTRY glEndQuery (GLenum target); +GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); +GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); +GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); +GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer); +GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, void *data); +GLAPI void *APIENTRY glMapBuffer (GLenum target, GLenum access); +GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target); +GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params); +#endif +#endif /* GL_VERSION_1_5 */ + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 +typedef char GLchar; +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_TEXTURE_COORDS 0x8871 +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); +GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); +GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); +GLAPI void APIENTRY glCompileShader (GLuint shader); +GLAPI GLuint APIENTRY glCreateProgram (void); +GLAPI GLuint APIENTRY glCreateShader (GLenum type); +GLAPI void APIENTRY glDeleteProgram (GLuint program); +GLAPI void APIENTRY glDeleteShader (GLuint shader); +GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); +GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); +GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); +GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); +GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); +GLAPI GLboolean APIENTRY glIsProgram (GLuint program); +GLAPI GLboolean APIENTRY glIsShader (GLuint shader); +GLAPI void APIENTRY glLinkProgram (GLuint program); +GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +GLAPI void APIENTRY glUseProgram (GLuint program); +GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0); +GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); +GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glValidateProgram (GLuint program); +GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +#endif +#endif /* GL_VERSION_2_0 */ + +#ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#endif +#endif /* GL_VERSION_2_1 */ + +#ifndef GL_VERSION_3_0 +#define GL_VERSION_3_0 1 +typedef unsigned short GLhalf; +#define GL_COMPARE_REF_TO_TEXTURE 0x884E +#define GL_CLIP_DISTANCE0 0x3000 +#define GL_CLIP_DISTANCE1 0x3001 +#define GL_CLIP_DISTANCE2 0x3002 +#define GL_CLIP_DISTANCE3 0x3003 +#define GL_CLIP_DISTANCE4 0x3004 +#define GL_CLIP_DISTANCE5 0x3005 +#define GL_CLIP_DISTANCE6 0x3006 +#define GL_CLIP_DISTANCE7 0x3007 +#define GL_MAX_CLIP_DISTANCES 0x0D32 +#define GL_MAJOR_VERSION 0x821B +#define GL_MINOR_VERSION 0x821C +#define GL_NUM_EXTENSIONS 0x821D +#define GL_CONTEXT_FLAGS 0x821E +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RG 0x8226 +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 +#define GL_RGBA32F 0x8814 +#define GL_RGB32F 0x8815 +#define GL_RGBA16F 0x881A +#define GL_RGB16F 0x881B +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_FIXED_ONLY 0x891D +#define GL_MAX_VARYING_COMPONENTS 0x8B4B +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_RGB9_E5 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_RGBA32UI 0x8D70 +#define GL_RGB32UI 0x8D71 +#define GL_RGBA16UI 0x8D76 +#define GL_RGB16UI 0x8D77 +#define GL_RGBA8UI 0x8D7C +#define GL_RGB8UI 0x8D7D +#define GL_RGBA32I 0x8D82 +#define GL_RGB32I 0x8D83 +#define GL_RGBA16I 0x8D88 +#define GL_RGB16I 0x8D89 +#define GL_RGBA8I 0x8D8E +#define GL_RGB8I 0x8D8F +#define GL_RED_INTEGER 0x8D94 +#define GL_GREEN_INTEGER 0x8D95 +#define GL_BLUE_INTEGER 0x8D96 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_BGR_INTEGER 0x8D9A +#define GL_BGRA_INTEGER 0x8D9B +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_QUERY_WAIT 0x8E13 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT9 0x8CE9 +#define GL_COLOR_ATTACHMENT10 0x8CEA +#define GL_COLOR_ATTACHMENT11 0x8CEB +#define GL_COLOR_ATTACHMENT12 0x8CEC +#define GL_COLOR_ATTACHMENT13 0x8CED +#define GL_COLOR_ATTACHMENT14 0x8CEE +#define GL_COLOR_ATTACHMENT15 0x8CEF +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_STENCIL_INDEX1 0x8D46 +#define GL_STENCIL_INDEX4 0x8D47 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_INDEX16 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_MAX_SAMPLES 0x8D57 +#define GL_INDEX 0x8222 +#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 +#define GL_FRAMEBUFFER_SRGB 0x8DB9 +#define GL_HALF_FLOAT 0x140B +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE +#define GL_RG 0x8227 +#define GL_RG_INTEGER 0x8228 +#define GL_R8 0x8229 +#define GL_R16 0x822A +#define GL_RG8 0x822B +#define GL_RG16 0x822C +#define GL_R16F 0x822D +#define GL_R32F 0x822E +#define GL_RG16F 0x822F +#define GL_RG32F 0x8230 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C +#define GL_VERTEX_ARRAY_BINDING 0x85B5 +#define GL_CLAMP_VERTEX_COLOR 0x891A +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_ALPHA_INTEGER 0x8D97 +typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); +typedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); +typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void *(APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data); +GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); +GLAPI void APIENTRY glEnablei (GLenum target, GLuint index); +GLAPI void APIENTRY glDisablei (GLenum target, GLuint index); +GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index); +GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedback (void); +GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp); +GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode); +GLAPI void APIENTRY glEndConditionalRender (void); +GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); +GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x); +GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y); +GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x); +GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y); +GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); +GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0); +GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); +GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); +GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); +GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +GLAPI const GLubyte *APIENTRY glGetStringi (GLenum name, GLuint index); +GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer); +GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); +GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer); +GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); +GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); +GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); +GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target); +GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateMipmap (GLenum target); +GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void *APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glBindVertexArray (GLuint array); +GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); +GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); +GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array); +#endif +#endif /* GL_VERSION_3_0 */ + +#ifndef GL_VERSION_3_1 +#define GL_VERSION_3_1 1 +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_INVALID_INDEX 0xFFFFFFFFu +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); +typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index); +typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); +GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index); +GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); +GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +#endif +#endif /* GL_VERSION_3_1 */ + +#ifndef GL_VERSION_3_2 +#define GL_VERSION_3_2 1 +typedef struct __GLsync *GLsync; +#ifndef GLEXT_64_TYPES_DEFINED +/* This code block is duplicated in glxext.h, so must be protected */ +#define GLEXT_64_TYPES_DEFINED +/* Define int32_t, int64_t, and uint64_t types for UST/MSC */ +/* (as used in the GL_EXT_timer_query extension). */ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +#elif defined(__sun__) || defined(__digital__) +#include +#if defined(__STDC__) +#if defined(__arch64__) || defined(_LP64) +typedef long int int64_t; +typedef unsigned long int uint64_t; +#else +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +#endif /* __arch64__ */ +#endif /* __STDC__ */ +#elif defined( __VMS ) || defined(__sgi) +#include +#elif defined(__SCO__) || defined(__USLC__) +#include +#elif defined(__UNIXOS2__) || defined(__SOL64__) +typedef long int int32_t; +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +#elif defined(_WIN32) && defined(__GNUC__) +#include +#elif defined(_WIN32) +typedef __int32 int32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else +/* Fallback if nothing above works */ +#include +#endif +#endif +typedef uint64_t GLuint64; +typedef int64_t GLint64; +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_CONTEXT_PROFILE_MASK 0x9126 +#define GL_DEPTH_CLAMP 0x864F +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_PROVOKING_VERTEX 0x8E4F +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_OBJECT_TYPE 0x9112 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_STATUS 0x9114 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_UNSIGNALED 0x9118 +#define GL_SIGNALED 0x9119 +#define GL_ALREADY_SIGNALED 0x911A +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_CONDITION_SATISFIED 0x911C +#define GL_WAIT_FAILED 0x911D +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_INTEGER_SAMPLES 0x9110 +typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode); +typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); +typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync); +typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); +typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data); +typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +GLAPI void APIENTRY glProvokingVertex (GLenum mode); +GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags); +GLAPI GLboolean APIENTRY glIsSync (GLsync sync); +GLAPI void APIENTRY glDeleteSync (GLsync sync); +GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *data); +GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); +GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); +GLAPI void APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask); +#endif +#endif /* GL_VERSION_3_2 */ + +#ifndef GL_VERSION_3_3 +#define GL_VERSION_3_3 1 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +#define GL_SRC1_COLOR 0x88F9 +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC +#define GL_ANY_SAMPLES_PASSED 0x8C2F +#define GL_SAMPLER_BINDING 0x8919 +#define GL_RGB10_A2UI 0x906F +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 +#define GL_TIME_ELAPSED 0x88BF +#define GL_TIMESTAMP 0x8E28 +#define GL_INT_2_10_10_10_REV 0x8D9F +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); +typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); +typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); +typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); +GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); +GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler); +GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); +GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); +GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); +GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); +GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param); +GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param); +GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params); +GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target); +GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params); +GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); +GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color); +GLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color); +GLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color); +GLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color); +#endif +#endif /* GL_VERSION_3_3 */ + +#ifndef GL_VERSION_4_0 +#define GL_VERSION_4_0 1 +#define GL_SAMPLE_SHADING 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D +#define GL_MAX_VERTEX_STREAMS 0x8E71 +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_MAT2x3 0x8F49 +#define GL_DOUBLE_MAT2x4 0x8F4A +#define GL_DOUBLE_MAT3x2 0x8F4B +#define GL_DOUBLE_MAT3x4 0x8F4C +#define GL_DOUBLE_MAT4x2 0x8F4D +#define GL_DOUBLE_MAT4x3 0x8F4E +#define GL_ACTIVE_SUBROUTINES 0x8DE5 +#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 +#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 +#define GL_MAX_SUBROUTINES 0x8DE7 +#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 +#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A +#define GL_COMPATIBLE_SUBROUTINES 0x8E4B +#define GL_PATCHES 0x000E +#define GL_PATCH_VERTICES 0x8E72 +#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 +#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 +#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 +#define GL_TESS_GEN_MODE 0x8E76 +#define GL_TESS_GEN_SPACING 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 +#define GL_TESS_GEN_POINT_MODE 0x8E79 +#define GL_ISOLINES 0x8E7A +#define GL_FRACTIONAL_ODD 0x8E7B +#define GL_FRACTIONAL_EVEN 0x8E7C +#define GL_MAX_PATCH_VERTICES 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 +#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 +typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value); +typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); +typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); +typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params); +typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices); +typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); +typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values); +typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); +typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); +typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); +typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMinSampleShading (GLfloat value); +GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect); +GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect); +GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x); +GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y); +GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params); +GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name); +GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name); +GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices); +GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params); +GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values); +GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value); +GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values); +GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); +GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); +GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id); +GLAPI void APIENTRY glPauseTransformFeedback (void); +GLAPI void APIENTRY glResumeTransformFeedback (void); +GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id); +GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream); +GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id); +GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index); +GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params); +#endif +#endif /* GL_VERSION_4_0 */ + +#ifndef GL_VERSION_4_1 +#define GL_VERSION_4_1 1 +#define GL_FIXED 0x140C +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_RGB565 0x8D62 +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_PROGRAM_BINARY_FORMATS 0x87FF +#define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT 0x00000002 +#define GL_GEOMETRY_SHADER_BIT 0x00000004 +#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 +#define GL_ALL_SHADER_BITS 0xFFFFFFFF +#define GL_PROGRAM_SEPARABLE 0x8258 +#define GL_ACTIVE_PROGRAM 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING 0x825A +#define GL_MAX_VIEWPORTS 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE 0x825D +#define GL_LAYER_PROVOKING_VERTEX 0x825E +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F +#define GL_UNDEFINED_VERTEX 0x8260 +typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); +typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); +typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); +typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d); +typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings); +typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); +typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v); +typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLdouble n, GLdouble f); +typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReleaseShaderCompiler (void); +GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); +GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +GLAPI void APIENTRY glDepthRangef (GLfloat n, GLfloat f); +GLAPI void APIENTRY glClearDepthf (GLfloat d); +GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); +GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program); +GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program); +GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings); +GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines); +GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines); +GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params); +GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0); +GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0); +GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0); +GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0); +GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1); +GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v); +GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v); +GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f); +GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data); +GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data); +#endif +#endif /* GL_VERSION_4_1 */ + +#ifndef GL_VERSION_4_2 +#define GL_VERSION_4_2 1 +#define GL_COPY_READ_BUFFER_BINDING 0x8F36 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 +#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 +#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 +#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 +#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A +#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B +#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C +#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D +#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E +#define GL_NUM_SAMPLE_COUNTS 0x9380 +#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC +#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 +#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 +#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 +#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 +#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB +#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF +#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 +#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 +#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 +#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 +#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC +#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 +#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA +#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 +#define GL_COMMAND_BARRIER_BIT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 +#define GL_ALL_BARRIER_BITS 0xFFFFFFFF +#define GL_MAX_IMAGE_UNITS 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 +#define GL_IMAGE_BINDING_NAME 0x8F3A +#define GL_IMAGE_BINDING_LEVEL 0x8F3B +#define GL_IMAGE_BINDING_LAYERED 0x8F3C +#define GL_IMAGE_BINDING_LAYER 0x8F3D +#define GL_IMAGE_BINDING_ACCESS 0x8F3E +#define GL_IMAGE_1D 0x904C +#define GL_IMAGE_2D 0x904D +#define GL_IMAGE_3D 0x904E +#define GL_IMAGE_2D_RECT 0x904F +#define GL_IMAGE_CUBE 0x9050 +#define GL_IMAGE_BUFFER 0x9051 +#define GL_IMAGE_1D_ARRAY 0x9052 +#define GL_IMAGE_2D_ARRAY 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 +#define GL_INT_IMAGE_1D 0x9057 +#define GL_INT_IMAGE_2D 0x9058 +#define GL_INT_IMAGE_3D 0x9059 +#define GL_INT_IMAGE_2D_RECT 0x905A +#define GL_INT_IMAGE_CUBE 0x905B +#define GL_INT_IMAGE_BUFFER 0x905C +#define GL_INT_IMAGE_1D_ARRAY 0x905D +#define GL_INT_IMAGE_2D_ARRAY 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C +#define GL_MAX_IMAGE_SAMPLES 0x906D +#define GL_IMAGE_BINDING_FORMAT 0x906E +#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 +#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD +#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE +#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF +#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F +#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); +typedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei instancecount); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +GLAPI void APIENTRY glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +GLAPI void APIENTRY glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +GLAPI void APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); +GLAPI void APIENTRY glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); +GLAPI void APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +GLAPI void APIENTRY glMemoryBarrier (GLbitfield barriers); +GLAPI void APIENTRY glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount); +GLAPI void APIENTRY glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); +#endif +#endif /* GL_VERSION_4_2 */ + +#ifndef GL_VERSION_4_3 +#define GL_VERSION_4_3 1 +typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 +#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E +#define GL_COMPRESSED_RGB8_ETC2 0x9274 +#define GL_COMPRESSED_SRGB8_ETC2 0x9275 +#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 +#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 +#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 +#define GL_COMPRESSED_R11_EAC 0x9270 +#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 +#define GL_COMPRESSED_RG11_EAC 0x9272 +#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A +#define GL_MAX_ELEMENT_INDEX 0x8D6B +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB +#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC +#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD +#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 +#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 +#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 +#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 +#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF +#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED +#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE +#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF +#define GL_COMPUTE_SHADER_BIT 0x00000020 +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 +#define GL_DEBUG_SOURCE_API 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION 0x824A +#define GL_DEBUG_SOURCE_OTHER 0x824B +#define GL_DEBUG_TYPE_ERROR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_LOW 0x9148 +#define GL_DEBUG_TYPE_MARKER 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D +#define GL_BUFFER 0x82E0 +#define GL_SHADER 0x82E1 +#define GL_PROGRAM 0x82E2 +#define GL_QUERY 0x82E3 +#define GL_PROGRAM_PIPELINE 0x82E4 +#define GL_SAMPLER 0x82E6 +#define GL_MAX_LABEL_LENGTH 0x82E8 +#define GL_DEBUG_OUTPUT 0x92E0 +#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 +#define GL_MAX_UNIFORM_LOCATIONS 0x826E +#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 +#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 +#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 +#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 +#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 +#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 +#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 +#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 +#define GL_INTERNALFORMAT_SUPPORTED 0x826F +#define GL_INTERNALFORMAT_PREFERRED 0x8270 +#define GL_INTERNALFORMAT_RED_SIZE 0x8271 +#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 +#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 +#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 +#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 +#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 +#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 +#define GL_INTERNALFORMAT_RED_TYPE 0x8278 +#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 +#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A +#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B +#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C +#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D +#define GL_MAX_WIDTH 0x827E +#define GL_MAX_HEIGHT 0x827F +#define GL_MAX_DEPTH 0x8280 +#define GL_MAX_LAYERS 0x8281 +#define GL_MAX_COMBINED_DIMENSIONS 0x8282 +#define GL_COLOR_COMPONENTS 0x8283 +#define GL_DEPTH_COMPONENTS 0x8284 +#define GL_STENCIL_COMPONENTS 0x8285 +#define GL_COLOR_RENDERABLE 0x8286 +#define GL_DEPTH_RENDERABLE 0x8287 +#define GL_STENCIL_RENDERABLE 0x8288 +#define GL_FRAMEBUFFER_RENDERABLE 0x8289 +#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A +#define GL_FRAMEBUFFER_BLEND 0x828B +#define GL_READ_PIXELS 0x828C +#define GL_READ_PIXELS_FORMAT 0x828D +#define GL_READ_PIXELS_TYPE 0x828E +#define GL_TEXTURE_IMAGE_FORMAT 0x828F +#define GL_TEXTURE_IMAGE_TYPE 0x8290 +#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 +#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 +#define GL_MIPMAP 0x8293 +#define GL_MANUAL_GENERATE_MIPMAP 0x8294 +#define GL_AUTO_GENERATE_MIPMAP 0x8295 +#define GL_COLOR_ENCODING 0x8296 +#define GL_SRGB_READ 0x8297 +#define GL_SRGB_WRITE 0x8298 +#define GL_FILTER 0x829A +#define GL_VERTEX_TEXTURE 0x829B +#define GL_TESS_CONTROL_TEXTURE 0x829C +#define GL_TESS_EVALUATION_TEXTURE 0x829D +#define GL_GEOMETRY_TEXTURE 0x829E +#define GL_FRAGMENT_TEXTURE 0x829F +#define GL_COMPUTE_TEXTURE 0x82A0 +#define GL_TEXTURE_SHADOW 0x82A1 +#define GL_TEXTURE_GATHER 0x82A2 +#define GL_TEXTURE_GATHER_SHADOW 0x82A3 +#define GL_SHADER_IMAGE_LOAD 0x82A4 +#define GL_SHADER_IMAGE_STORE 0x82A5 +#define GL_SHADER_IMAGE_ATOMIC 0x82A6 +#define GL_IMAGE_TEXEL_SIZE 0x82A7 +#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 +#define GL_IMAGE_PIXEL_FORMAT 0x82A9 +#define GL_IMAGE_PIXEL_TYPE 0x82AA +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF +#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 +#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 +#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 +#define GL_CLEAR_BUFFER 0x82B4 +#define GL_TEXTURE_VIEW 0x82B5 +#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 +#define GL_FULL_SUPPORT 0x82B7 +#define GL_CAVEAT_SUPPORT 0x82B8 +#define GL_IMAGE_CLASS_4_X_32 0x82B9 +#define GL_IMAGE_CLASS_2_X_32 0x82BA +#define GL_IMAGE_CLASS_1_X_32 0x82BB +#define GL_IMAGE_CLASS_4_X_16 0x82BC +#define GL_IMAGE_CLASS_2_X_16 0x82BD +#define GL_IMAGE_CLASS_1_X_16 0x82BE +#define GL_IMAGE_CLASS_4_X_8 0x82BF +#define GL_IMAGE_CLASS_2_X_8 0x82C0 +#define GL_IMAGE_CLASS_1_X_8 0x82C1 +#define GL_IMAGE_CLASS_11_11_10 0x82C2 +#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 +#define GL_VIEW_CLASS_128_BITS 0x82C4 +#define GL_VIEW_CLASS_96_BITS 0x82C5 +#define GL_VIEW_CLASS_64_BITS 0x82C6 +#define GL_VIEW_CLASS_48_BITS 0x82C7 +#define GL_VIEW_CLASS_32_BITS 0x82C8 +#define GL_VIEW_CLASS_24_BITS 0x82C9 +#define GL_VIEW_CLASS_16_BITS 0x82CA +#define GL_VIEW_CLASS_8_BITS 0x82CB +#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC +#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD +#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE +#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF +#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 +#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 +#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 +#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 +#define GL_UNIFORM 0x92E1 +#define GL_UNIFORM_BLOCK 0x92E2 +#define GL_PROGRAM_INPUT 0x92E3 +#define GL_PROGRAM_OUTPUT 0x92E4 +#define GL_BUFFER_VARIABLE 0x92E5 +#define GL_SHADER_STORAGE_BLOCK 0x92E6 +#define GL_VERTEX_SUBROUTINE 0x92E8 +#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 +#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA +#define GL_GEOMETRY_SUBROUTINE 0x92EB +#define GL_FRAGMENT_SUBROUTINE 0x92EC +#define GL_COMPUTE_SUBROUTINE 0x92ED +#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE +#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF +#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 +#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 +#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 +#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 +#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 +#define GL_ACTIVE_RESOURCES 0x92F5 +#define GL_MAX_NAME_LENGTH 0x92F6 +#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 +#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 +#define GL_NAME_LENGTH 0x92F9 +#define GL_TYPE 0x92FA +#define GL_ARRAY_SIZE 0x92FB +#define GL_OFFSET 0x92FC +#define GL_BLOCK_INDEX 0x92FD +#define GL_ARRAY_STRIDE 0x92FE +#define GL_MATRIX_STRIDE 0x92FF +#define GL_IS_ROW_MAJOR 0x9300 +#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 +#define GL_BUFFER_BINDING 0x9302 +#define GL_BUFFER_DATA_SIZE 0x9303 +#define GL_NUM_ACTIVE_VARIABLES 0x9304 +#define GL_ACTIVE_VARIABLES 0x9305 +#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 +#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 +#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A +#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B +#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C +#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D +#define GL_LOCATION 0x930E +#define GL_LOCATION_INDEX 0x930F +#define GL_IS_PER_PATCH 0x92E7 +#define GL_SHADER_STORAGE_BUFFER 0x90D2 +#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 +#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 +#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 +#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 +#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA +#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB +#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC +#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD +#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE +#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF +#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 +#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 +#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA +#define GL_TEXTURE_BUFFER_OFFSET 0x919D +#define GL_TEXTURE_BUFFER_SIZE 0x919E +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F +#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF +#define GL_VERTEX_ATTRIB_BINDING 0x82D4 +#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 +#define GL_VERTEX_BINDING_DIVISOR 0x82D6 +#define GL_VERTEX_BINDING_OFFSET 0x82D7 +#define GL_VERTEX_BINDING_STRIDE 0x82D8 +#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 +#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_VERTEX_BINDING_BUFFER 0x8F4F +#define GL_DISPLAY_LIST 0x82E7 +typedef void (APIENTRYP PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); +typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); +typedef void (APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); +typedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); +typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); +typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +typedef void (APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +typedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); +typedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void); +typedef void (APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +GLAPI void APIENTRY glDispatchComputeIndirect (GLintptr indirect); +GLAPI void APIENTRY glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +GLAPI void APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); +GLAPI void APIENTRY glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glInvalidateTexImage (GLuint texture, GLint level); +GLAPI void APIENTRY glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glInvalidateBufferData (GLuint buffer); +GLAPI void APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments); +GLAPI void APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +GLAPI void APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params); +GLAPI GLuint APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI void APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); +GLAPI GLint APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI GLint APIENTRY glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI void APIENTRY glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +GLAPI void APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +GLAPI void APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI void APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex); +GLAPI void APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor); +GLAPI void APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +GLAPI void APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message); +GLAPI void APIENTRY glPopDebugGroup (void); +GLAPI void APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +GLAPI void APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +#endif +#endif /* GL_VERSION_4_3 */ + +#ifndef GL_VERSION_4_4 +#define GL_VERSION_4_4 1 +#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 +#define GL_TEXTURE_BUFFER_BINDING 0x8C2A +#define GL_MAP_PERSISTENT_BIT 0x0040 +#define GL_MAP_COHERENT_BIT 0x0080 +#define GL_DYNAMIC_STORAGE_BIT 0x0100 +#define GL_CLIENT_STORAGE_BIT 0x0200 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 +#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F +#define GL_BUFFER_STORAGE_FLAGS 0x8220 +#define GL_CLEAR_TEXTURE 0x9365 +#define GL_LOCATION_COMPONENT 0x934A +#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B +#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C +#define GL_QUERY_BUFFER 0x9192 +#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 +#define GL_QUERY_BUFFER_BINDING 0x9193 +#define GL_QUERY_RESULT_NO_WAIT 0x9194 +#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 +typedef void (APIENTRYP PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); +typedef void (APIENTRYP PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +typedef void (APIENTRYP PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); +typedef void (APIENTRYP PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint *samplers); +typedef void (APIENTRYP PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); +typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferStorage (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +GLAPI void APIENTRY glClearTexImage (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glBindBuffersBase (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); +GLAPI void APIENTRY glBindBuffersRange (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +GLAPI void APIENTRY glBindTextures (GLuint first, GLsizei count, const GLuint *textures); +GLAPI void APIENTRY glBindSamplers (GLuint first, GLsizei count, const GLuint *samplers); +GLAPI void APIENTRY glBindImageTextures (GLuint first, GLsizei count, const GLuint *textures); +GLAPI void APIENTRY glBindVertexBuffers (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +#endif +#endif /* GL_VERSION_4_4 */ + +#ifndef GL_VERSION_4_5 +#define GL_VERSION_4_5 1 +#define GL_CONTEXT_LOST 0x0507 +#define GL_NEGATIVE_ONE_TO_ONE 0x935E +#define GL_ZERO_TO_ONE 0x935F +#define GL_CLIP_ORIGIN 0x935C +#define GL_CLIP_DEPTH_MODE 0x935D +#define GL_QUERY_WAIT_INVERTED 0x8E17 +#define GL_QUERY_NO_WAIT_INVERTED 0x8E18 +#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 +#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A +#define GL_MAX_CULL_DISTANCES 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA +#define GL_TEXTURE_TARGET 0x1006 +#define GL_QUERY_TARGET 0x82EA +#define GL_TEXTURE_BINDING 0x82EB +#define GL_GUILTY_CONTEXT_RESET 0x8253 +#define GL_INNOCENT_CONTEXT_RESET 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 +#define GL_LOSE_CONTEXT_ON_RESET 0x8252 +#define GL_NO_RESET_NOTIFICATION 0x8261 +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 +#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC +typedef void (APIENTRYP PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); +typedef void (APIENTRYP PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint *param); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); +typedef void (APIENTRYP PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizei size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizei size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizei size, const void *data); +typedef void (APIENTRYP PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access); +typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizei length); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void **params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizei size, void *data); +typedef void (APIENTRYP PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum buf); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum src); +typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); +typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, const GLfloat depth, GLint stencil); +typedef void (APIENTRYP PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint *textures); +typedef void (APIENTRYP PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); +typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); +typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); +typedef void (APIENTRYP PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint *samplers); +typedef void (APIENTRYP PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); +typedef void (APIENTRYP PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); +typedef void (APIENTRYP PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); +typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSPROC) (void); +typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETNTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (APIENTRYP PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (APIENTRYP PFNGLGETNMAPDVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +typedef void (APIENTRYP PFNGLGETNMAPFVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +typedef void (APIENTRYP PFNGLGETNMAPIVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +typedef void (APIENTRYP PFNGLGETNPIXELMAPFVPROC) (GLenum map, GLsizei bufSize, GLfloat *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVPROC) (GLenum map, GLsizei bufSize, GLuint *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVPROC) (GLenum map, GLsizei bufSize, GLushort *values); +typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEPROC) (GLsizei bufSize, GLubyte *pattern); +typedef void (APIENTRYP PFNGLGETNCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +typedef void (APIENTRYP PFNGLGETNHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP PFNGLGETNMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP PFNGLTEXTUREBARRIERPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClipControl (GLenum origin, GLenum depth); +GLAPI void APIENTRY glCreateTransformFeedbacks (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glTransformFeedbackBufferBase (GLuint xfb, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackBufferRange (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size); +GLAPI void APIENTRY glGetTransformFeedbackiv (GLuint xfb, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetTransformFeedbacki_v (GLuint xfb, GLenum pname, GLuint index, GLint *param); +GLAPI void APIENTRY glGetTransformFeedbacki64_v (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); +GLAPI void APIENTRY glCreateBuffers (GLsizei n, GLuint *buffers); +GLAPI void APIENTRY glNamedBufferStorage (GLuint buffer, GLsizei size, const void *data, GLbitfield flags); +GLAPI void APIENTRY glNamedBufferData (GLuint buffer, GLsizei size, const void *data, GLenum usage); +GLAPI void APIENTRY glNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizei size, const void *data); +GLAPI void APIENTRY glCopyNamedBufferSubData (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size); +GLAPI void APIENTRY glClearNamedBufferData (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearNamedBufferSubData (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data); +GLAPI void *APIENTRY glMapNamedBuffer (GLuint buffer, GLenum access); +GLAPI void *APIENTRY glMapNamedBufferRange (GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access); +GLAPI GLboolean APIENTRY glUnmapNamedBuffer (GLuint buffer); +GLAPI void APIENTRY glFlushMappedNamedBufferRange (GLuint buffer, GLintptr offset, GLsizei length); +GLAPI void APIENTRY glGetNamedBufferParameteriv (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedBufferParameteri64v (GLuint buffer, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetNamedBufferPointerv (GLuint buffer, GLenum pname, void **params); +GLAPI void APIENTRY glGetNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizei size, void *data); +GLAPI void APIENTRY glCreateFramebuffers (GLsizei n, GLuint *framebuffers); +GLAPI void APIENTRY glNamedFramebufferRenderbuffer (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glNamedFramebufferParameteri (GLuint framebuffer, GLenum pname, GLint param); +GLAPI void APIENTRY glNamedFramebufferTexture (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTextureLayer (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glNamedFramebufferDrawBuffer (GLuint framebuffer, GLenum buf); +GLAPI void APIENTRY glNamedFramebufferDrawBuffers (GLuint framebuffer, GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glNamedFramebufferReadBuffer (GLuint framebuffer, GLenum src); +GLAPI void APIENTRY glInvalidateNamedFramebufferData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); +GLAPI void APIENTRY glInvalidateNamedFramebufferSubData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glClearNamedFramebufferiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); +GLAPI void APIENTRY glClearNamedFramebufferuiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); +GLAPI void APIENTRY glClearNamedFramebufferfv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); +GLAPI void APIENTRY glClearNamedFramebufferfi (GLuint framebuffer, GLenum buffer, const GLfloat depth, GLint stencil); +GLAPI void APIENTRY glBlitNamedFramebuffer (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +GLAPI GLenum APIENTRY glCheckNamedFramebufferStatus (GLuint framebuffer, GLenum target); +GLAPI void APIENTRY glGetNamedFramebufferParameteriv (GLuint framebuffer, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameteriv (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glCreateRenderbuffers (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glNamedRenderbufferStorage (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisample (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetNamedRenderbufferParameteriv (GLuint renderbuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glCreateTextures (GLenum target, GLsizei n, GLuint *textures); +GLAPI void APIENTRY glTextureBuffer (GLuint texture, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glTextureBufferRange (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size); +GLAPI void APIENTRY glTextureStorage1D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTextureStorage2D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTextureStorage3D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glTextureStorage2DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureStorage3DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCompressedTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCopyTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glCopyTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTextureParameterf (GLuint texture, GLenum pname, GLfloat param); +GLAPI void APIENTRY glTextureParameterfv (GLuint texture, GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glTextureParameteri (GLuint texture, GLenum pname, GLint param); +GLAPI void APIENTRY glTextureParameterIiv (GLuint texture, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureParameterIuiv (GLuint texture, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glTextureParameteriv (GLuint texture, GLenum pname, const GLint *param); +GLAPI void APIENTRY glGenerateTextureMipmap (GLuint texture); +GLAPI void APIENTRY glBindTextureUnit (GLuint unit, GLuint texture); +GLAPI void APIENTRY glGetTextureImage (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetCompressedTextureImage (GLuint texture, GLint level, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetTextureLevelParameterfv (GLuint texture, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureLevelParameteriv (GLuint texture, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterfv (GLuint texture, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureParameterIiv (GLuint texture, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterIuiv (GLuint texture, GLenum pname, GLuint *params); +GLAPI void APIENTRY glGetTextureParameteriv (GLuint texture, GLenum pname, GLint *params); +GLAPI void APIENTRY glCreateVertexArrays (GLsizei n, GLuint *arrays); +GLAPI void APIENTRY glDisableVertexArrayAttrib (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glEnableVertexArrayAttrib (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glVertexArrayElementBuffer (GLuint vaobj, GLuint buffer); +GLAPI void APIENTRY glVertexArrayVertexBuffer (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI void APIENTRY glVertexArrayVertexBuffers (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +GLAPI void APIENTRY glVertexArrayAttribBinding (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +GLAPI void APIENTRY glVertexArrayAttribFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayAttribIFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayAttribLFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayBindingDivisor (GLuint vaobj, GLuint bindingindex, GLuint divisor); +GLAPI void APIENTRY glGetVertexArrayiv (GLuint vaobj, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayIndexediv (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayIndexed64iv (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); +GLAPI void APIENTRY glCreateSamplers (GLsizei n, GLuint *samplers); +GLAPI void APIENTRY glCreateProgramPipelines (GLsizei n, GLuint *pipelines); +GLAPI void APIENTRY glCreateQueries (GLenum target, GLsizei n, GLuint *ids); +GLAPI void APIENTRY glGetQueryBufferObjecti64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glGetQueryBufferObjectiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glGetQueryBufferObjectui64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glGetQueryBufferObjectuiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glMemoryBarrierByRegion (GLbitfield barriers); +GLAPI void APIENTRY glGetTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetCompressedTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); +GLAPI GLenum APIENTRY glGetGraphicsResetStatus (void); +GLAPI void APIENTRY glGetnCompressedTexImage (GLenum target, GLint lod, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetnTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetnUniformdv (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +GLAPI void APIENTRY glGetnUniformfv (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GLAPI void APIENTRY glGetnUniformiv (GLuint program, GLint location, GLsizei bufSize, GLint *params); +GLAPI void APIENTRY glGetnUniformuiv (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +GLAPI void APIENTRY glReadnPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +GLAPI void APIENTRY glGetnMapdv (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +GLAPI void APIENTRY glGetnMapfv (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +GLAPI void APIENTRY glGetnMapiv (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +GLAPI void APIENTRY glGetnPixelMapfv (GLenum map, GLsizei bufSize, GLfloat *values); +GLAPI void APIENTRY glGetnPixelMapuiv (GLenum map, GLsizei bufSize, GLuint *values); +GLAPI void APIENTRY glGetnPixelMapusv (GLenum map, GLsizei bufSize, GLushort *values); +GLAPI void APIENTRY glGetnPolygonStipple (GLsizei bufSize, GLubyte *pattern); +GLAPI void APIENTRY glGetnColorTable (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +GLAPI void APIENTRY glGetnConvolutionFilter (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +GLAPI void APIENTRY glGetnSeparableFilter (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +GLAPI void APIENTRY glGetnHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +GLAPI void APIENTRY glGetnMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +GLAPI void APIENTRY glTextureBarrier (void); +#endif +#endif /* GL_VERSION_4_5 */ + +#ifndef GL_ARB_ES2_compatibility +#define GL_ARB_ES2_compatibility 1 +#endif /* GL_ARB_ES2_compatibility */ + +#ifndef GL_ARB_ES3_1_compatibility +#define GL_ARB_ES3_1_compatibility 1 +#endif /* GL_ARB_ES3_1_compatibility */ + +#ifndef GL_ARB_ES3_compatibility +#define GL_ARB_ES3_compatibility 1 +#endif /* GL_ARB_ES3_compatibility */ + +#ifndef GL_ARB_arrays_of_arrays +#define GL_ARB_arrays_of_arrays 1 +#endif /* GL_ARB_arrays_of_arrays */ + +#ifndef GL_ARB_base_instance +#define GL_ARB_base_instance 1 +#endif /* GL_ARB_base_instance */ + +#ifndef GL_ARB_bindless_texture +#define GL_ARB_bindless_texture 1 +typedef uint64_t GLuint64EXT; +#define GL_UNSIGNED_INT64_ARB 0x140F +typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); +typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint64 APIENTRY glGetTextureHandleARB (GLuint texture); +GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleARB (GLuint texture, GLuint sampler); +GLAPI void APIENTRY glMakeTextureHandleResidentARB (GLuint64 handle); +GLAPI void APIENTRY glMakeTextureHandleNonResidentARB (GLuint64 handle); +GLAPI GLuint64 APIENTRY glGetImageHandleARB (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +GLAPI void APIENTRY glMakeImageHandleResidentARB (GLuint64 handle, GLenum access); +GLAPI void APIENTRY glMakeImageHandleNonResidentARB (GLuint64 handle); +GLAPI void APIENTRY glUniformHandleui64ARB (GLint location, GLuint64 value); +GLAPI void APIENTRY glUniformHandleui64vARB (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniformHandleui64ARB (GLuint program, GLint location, GLuint64 value); +GLAPI void APIENTRY glProgramUniformHandleui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +GLAPI GLboolean APIENTRY glIsTextureHandleResidentARB (GLuint64 handle); +GLAPI GLboolean APIENTRY glIsImageHandleResidentARB (GLuint64 handle); +GLAPI void APIENTRY glVertexAttribL1ui64ARB (GLuint index, GLuint64EXT x); +GLAPI void APIENTRY glVertexAttribL1ui64vARB (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glGetVertexAttribLui64vARB (GLuint index, GLenum pname, GLuint64EXT *params); +#endif +#endif /* GL_ARB_bindless_texture */ + +#ifndef GL_ARB_blend_func_extended +#define GL_ARB_blend_func_extended 1 +#endif /* GL_ARB_blend_func_extended */ + +#ifndef GL_ARB_buffer_storage +#define GL_ARB_buffer_storage 1 +#endif /* GL_ARB_buffer_storage */ + +#ifndef GL_ARB_cl_event +#define GL_ARB_cl_event 1 +struct _cl_context; +struct _cl_event; +#define GL_SYNC_CL_EVENT_ARB 0x8240 +#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 +typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); +#endif +#endif /* GL_ARB_cl_event */ + +#ifndef GL_ARB_clear_buffer_object +#define GL_ARB_clear_buffer_object 1 +#endif /* GL_ARB_clear_buffer_object */ + +#ifndef GL_ARB_clear_texture +#define GL_ARB_clear_texture 1 +#endif /* GL_ARB_clear_texture */ + +#ifndef GL_ARB_clip_control +#define GL_ARB_clip_control 1 +#endif /* GL_ARB_clip_control */ + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D +typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClampColorARB (GLenum target, GLenum clamp); +#endif +#endif /* GL_ARB_color_buffer_float */ + +#ifndef GL_ARB_compatibility +#define GL_ARB_compatibility 1 +#endif /* GL_ARB_compatibility */ + +#ifndef GL_ARB_compressed_texture_pixel_storage +#define GL_ARB_compressed_texture_pixel_storage 1 +#endif /* GL_ARB_compressed_texture_pixel_storage */ + +#ifndef GL_ARB_compute_shader +#define GL_ARB_compute_shader 1 +#endif /* GL_ARB_compute_shader */ + +#ifndef GL_ARB_compute_variable_group_size +#define GL_ARB_compute_variable_group_size 1 +#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 +#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB +#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 +#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDispatchComputeGroupSizeARB (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); +#endif +#endif /* GL_ARB_compute_variable_group_size */ + +#ifndef GL_ARB_conditional_render_inverted +#define GL_ARB_conditional_render_inverted 1 +#endif /* GL_ARB_conditional_render_inverted */ + +#ifndef GL_ARB_conservative_depth +#define GL_ARB_conservative_depth 1 +#endif /* GL_ARB_conservative_depth */ + +#ifndef GL_ARB_copy_buffer +#define GL_ARB_copy_buffer 1 +#endif /* GL_ARB_copy_buffer */ + +#ifndef GL_ARB_copy_image +#define GL_ARB_copy_image 1 +#endif /* GL_ARB_copy_image */ + +#ifndef GL_ARB_cull_distance +#define GL_ARB_cull_distance 1 +#endif /* GL_ARB_cull_distance */ + +#ifndef GL_ARB_debug_output +#define GL_ARB_debug_output 1 +typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 +#define GL_DEBUG_SOURCE_API_ARB 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A +#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B +#define GL_DEBUG_TYPE_ERROR_ARB 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 +#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 +#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 +typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +#endif +#endif /* GL_ARB_debug_output */ + +#ifndef GL_ARB_depth_buffer_float +#define GL_ARB_depth_buffer_float 1 +#endif /* GL_ARB_depth_buffer_float */ + +#ifndef GL_ARB_depth_clamp +#define GL_ARB_depth_clamp 1 +#endif /* GL_ARB_depth_clamp */ + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B +#endif /* GL_ARB_depth_texture */ + +#ifndef GL_ARB_derivative_control +#define GL_ARB_derivative_control 1 +#endif /* GL_ARB_derivative_control */ + +#ifndef GL_ARB_direct_state_access +#define GL_ARB_direct_state_access 1 +#endif /* GL_ARB_direct_state_access */ + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 +typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersARB (GLsizei n, const GLenum *bufs); +#endif +#endif /* GL_ARB_draw_buffers */ + +#ifndef GL_ARB_draw_buffers_blend +#define GL_ARB_draw_buffers_blend 1 +typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#endif +#endif /* GL_ARB_draw_buffers_blend */ + +#ifndef GL_ARB_draw_elements_base_vertex +#define GL_ARB_draw_elements_base_vertex 1 +#endif /* GL_ARB_draw_elements_base_vertex */ + +#ifndef GL_ARB_draw_indirect +#define GL_ARB_draw_indirect 1 +#endif /* GL_ARB_draw_indirect */ + +#ifndef GL_ARB_draw_instanced +#define GL_ARB_draw_instanced 1 +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#endif +#endif /* GL_ARB_draw_instanced */ + +#ifndef GL_ARB_enhanced_layouts +#define GL_ARB_enhanced_layouts 1 +#endif /* GL_ARB_enhanced_layouts */ + +#ifndef GL_ARB_explicit_attrib_location +#define GL_ARB_explicit_attrib_location 1 +#endif /* GL_ARB_explicit_attrib_location */ + +#ifndef GL_ARB_explicit_uniform_location +#define GL_ARB_explicit_uniform_location 1 +#endif /* GL_ARB_explicit_uniform_location */ + +#ifndef GL_ARB_fragment_coord_conventions +#define GL_ARB_fragment_coord_conventions 1 +#endif /* GL_ARB_fragment_coord_conventions */ + +#ifndef GL_ARB_fragment_layer_viewport +#define GL_ARB_fragment_layer_viewport 1 +#endif /* GL_ARB_fragment_layer_viewport */ + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramStringARB (GLenum target, GLenum format, GLsizei len, const void *string); +GLAPI void APIENTRY glBindProgramARB (GLenum target, GLuint program); +GLAPI void APIENTRY glDeleteProgramsARB (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glGenProgramsARB (GLsizei n, GLuint *programs); +GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetProgramivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramStringARB (GLenum target, GLenum pname, void *string); +GLAPI GLboolean APIENTRY glIsProgramARB (GLuint program); +#endif +#endif /* GL_ARB_fragment_program */ + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 +#endif /* GL_ARB_fragment_program_shadow */ + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B +#endif /* GL_ARB_fragment_shader */ + +#ifndef GL_ARB_framebuffer_no_attachments +#define GL_ARB_framebuffer_no_attachments 1 +#endif /* GL_ARB_framebuffer_no_attachments */ + +#ifndef GL_ARB_framebuffer_object +#define GL_ARB_framebuffer_object 1 +#endif /* GL_ARB_framebuffer_object */ + +#ifndef GL_ARB_framebuffer_sRGB +#define GL_ARB_framebuffer_sRGB 1 +#endif /* GL_ARB_framebuffer_sRGB */ + +#ifndef GL_ARB_geometry_shader4 +#define GL_ARB_geometry_shader4 1 +#define GL_LINES_ADJACENCY_ARB 0x000A +#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B +#define GL_TRIANGLES_ADJACENCY_ARB 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D +#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 +#define GL_GEOMETRY_SHADER_ARB 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramParameteriARB (GLuint program, GLenum pname, GLint value); +GLAPI void APIENTRY glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#endif +#endif /* GL_ARB_geometry_shader4 */ + +#ifndef GL_ARB_get_program_binary +#define GL_ARB_get_program_binary 1 +#endif /* GL_ARB_get_program_binary */ + +#ifndef GL_ARB_get_texture_sub_image +#define GL_ARB_get_texture_sub_image 1 +#endif /* GL_ARB_get_texture_sub_image */ + +#ifndef GL_ARB_gpu_shader5 +#define GL_ARB_gpu_shader5 1 +#endif /* GL_ARB_gpu_shader5 */ + +#ifndef GL_ARB_gpu_shader_fp64 +#define GL_ARB_gpu_shader_fp64 1 +#endif /* GL_ARB_gpu_shader_fp64 */ + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 +typedef unsigned short GLhalfARB; +#define GL_HALF_FLOAT_ARB 0x140B +#endif /* GL_ARB_half_float_pixel */ + +#ifndef GL_ARB_half_float_vertex +#define GL_ARB_half_float_vertex 1 +#endif /* GL_ARB_half_float_vertex */ + +#ifndef GL_ARB_imaging +#define GL_ARB_imaging 1 #define GL_BLEND_COLOR 0x8005 -#define GL_FUNC_ADD 0x8006 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 #define GL_BLEND_EQUATION 0x8009 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B #define GL_CONVOLUTION_1D 0x8010 #define GL_CONVOLUTION_2D 0x8011 #define GL_SEPARABLE_2D 0x8012 @@ -93,19 +3381,6 @@ extern "C" { #define GL_MINMAX_FORMAT 0x802F #define GL_MINMAX_SINK 0x8030 #define GL_TABLE_TOO_LARGE 0x8031 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_RESCALE_NORMAL 0x803A -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 #define GL_COLOR_MATRIX 0x80B1 #define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 #define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 @@ -116,6 +3391,7 @@ extern "C" { #define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 #define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 #define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB #define GL_COLOR_TABLE 0x80D0 #define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 #define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 @@ -132,14 +3408,172 @@ extern "C" { #define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD #define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE #define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glGetColorTable (GLenum target, GLenum format, GLenum type, void *table); +GLAPI void APIENTRY glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params); +GLAPI void APIENTRY glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glConvolutionParameteri (GLenum target, GLenum pname, GLint params); +GLAPI void APIENTRY glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, void *image); +GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSeparableFilter (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +GLAPI void APIENTRY glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +GLAPI void APIENTRY glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glMinmax (GLenum target, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glResetHistogram (GLenum target); +GLAPI void APIENTRY glResetMinmax (GLenum target); +#endif +#endif /* GL_ARB_imaging */ + +#ifndef GL_ARB_indirect_parameters +#define GL_ARB_indirect_parameters 1 +#define GL_PARAMETER_BUFFER_ARB 0x80EE +#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectCountARB (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirectCountARB (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#endif +#endif /* GL_ARB_indirect_parameters */ + +#ifndef GL_ARB_instanced_arrays +#define GL_ARB_instanced_arrays 1 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribDivisorARB (GLuint index, GLuint divisor); +#endif +#endif /* GL_ARB_instanced_arrays */ + +#ifndef GL_ARB_internalformat_query +#define GL_ARB_internalformat_query 1 +#endif /* GL_ARB_internalformat_query */ + +#ifndef GL_ARB_internalformat_query2 +#define GL_ARB_internalformat_query2 1 +#define GL_SRGB_DECODE_ARB 0x8299 +#endif /* GL_ARB_internalformat_query2 */ + +#ifndef GL_ARB_invalidate_subdata +#define GL_ARB_invalidate_subdata 1 +#endif /* GL_ARB_invalidate_subdata */ + +#ifndef GL_ARB_map_buffer_alignment +#define GL_ARB_map_buffer_alignment 1 +#endif /* GL_ARB_map_buffer_alignment */ + +#ifndef GL_ARB_map_buffer_range +#define GL_ARB_map_buffer_range 1 +#endif /* GL_ARB_map_buffer_range */ + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 +typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint index); +GLAPI void APIENTRY glMatrixIndexubvARB (GLint size, const GLubyte *indices); +GLAPI void APIENTRY glMatrixIndexusvARB (GLint size, const GLushort *indices); +GLAPI void APIENTRY glMatrixIndexuivARB (GLint size, const GLuint *indices); +GLAPI void APIENTRY glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_ARB_matrix_palette */ + +#ifndef GL_ARB_multi_bind +#define GL_ARB_multi_bind 1 +#endif /* GL_ARB_multi_bind */ + +#ifndef GL_ARB_multi_draw_indirect +#define GL_ARB_multi_draw_indirect 1 +#endif /* GL_ARB_multi_draw_indirect */ + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLfloat value, GLboolean invert); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleCoverageARB (GLfloat value, GLboolean invert); #endif +#endif /* GL_ARB_multisample */ #ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 #define GL_TEXTURE0_ARB 0x84C0 #define GL_TEXTURE1_ARB 0x84C1 #define GL_TEXTURE2_ARB 0x84C2 @@ -175,28 +3609,588 @@ extern "C" { #define GL_ACTIVE_TEXTURE_ARB 0x84E0 #define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 #define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTextureARB (GLenum texture); +GLAPI void APIENTRY glClientActiveTextureARB (GLenum texture); +GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum target, GLdouble s); +GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum target, GLfloat s); +GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum target, GLint s); +GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum target, GLshort s); +GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t); +GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t); +GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum target, GLint s, GLint t); +GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t); +GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r); +GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum target, const GLshort *v); +#endif +#endif /* GL_ARB_multitexture */ + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 +typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueriesARB (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteQueriesARB (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsQueryARB (GLuint id); +GLAPI void APIENTRY glBeginQueryARB (GLenum target, GLuint id); +GLAPI void APIENTRY glEndQueryARB (GLenum target); +GLAPI void APIENTRY glGetQueryivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectivARB (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint *params); +#endif +#endif /* GL_ARB_occlusion_query */ + +#ifndef GL_ARB_occlusion_query2 +#define GL_ARB_occlusion_query2 1 +#endif /* GL_ARB_occlusion_query2 */ + +#ifndef GL_ARB_pipeline_statistics_query +#define GL_ARB_pipeline_statistics_query 1 +#define GL_VERTICES_SUBMITTED_ARB 0x82EE +#define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF +#define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 +#define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 +#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 +#define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 +#define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 +#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 +#endif /* GL_ARB_pipeline_statistics_query */ + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF +#endif /* GL_ARB_pixel_buffer_object */ + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfARB (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvARB (GLenum pname, const GLfloat *params); +#endif +#endif /* GL_ARB_point_parameters */ + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 +#endif /* GL_ARB_point_sprite */ + +#ifndef GL_ARB_program_interface_query +#define GL_ARB_program_interface_query 1 +#endif /* GL_ARB_program_interface_query */ + +#ifndef GL_ARB_provoking_vertex +#define GL_ARB_provoking_vertex 1 +#endif /* GL_ARB_provoking_vertex */ + +#ifndef GL_ARB_query_buffer_object +#define GL_ARB_query_buffer_object 1 +#endif /* GL_ARB_query_buffer_object */ + +#ifndef GL_ARB_robust_buffer_access_behavior +#define GL_ARB_robust_buffer_access_behavior 1 +#endif /* GL_ARB_robust_buffer_access_behavior */ + +#ifndef GL_ARB_robustness +#define GL_ARB_robustness 1 +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 +typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); +typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); +typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void *img); +typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +typedef void (APIENTRYP PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +typedef void (APIENTRYP PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +typedef void (APIENTRYP PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort *values); +typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte *pattern); +typedef void (APIENTRYP PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +typedef void (APIENTRYP PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void); +GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); +GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, void *img); +GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params); +GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +GLAPI void APIENTRY glGetnMapdvARB (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +GLAPI void APIENTRY glGetnMapfvARB (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +GLAPI void APIENTRY glGetnMapivARB (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +GLAPI void APIENTRY glGetnPixelMapfvARB (GLenum map, GLsizei bufSize, GLfloat *values); +GLAPI void APIENTRY glGetnPixelMapuivARB (GLenum map, GLsizei bufSize, GLuint *values); +GLAPI void APIENTRY glGetnPixelMapusvARB (GLenum map, GLsizei bufSize, GLushort *values); +GLAPI void APIENTRY glGetnPolygonStippleARB (GLsizei bufSize, GLubyte *pattern); +GLAPI void APIENTRY glGetnColorTableARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +GLAPI void APIENTRY glGetnConvolutionFilterARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +GLAPI void APIENTRY glGetnSeparableFilterARB (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +GLAPI void APIENTRY glGetnHistogramARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +GLAPI void APIENTRY glGetnMinmaxARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +#endif +#endif /* GL_ARB_robustness */ + +#ifndef GL_ARB_robustness_isolation +#define GL_ARB_robustness_isolation 1 +#endif /* GL_ARB_robustness_isolation */ + +#ifndef GL_ARB_sample_shading +#define GL_ARB_sample_shading 1 +#define GL_SAMPLE_SHADING_ARB 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 +typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLfloat value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMinSampleShadingARB (GLfloat value); +#endif +#endif /* GL_ARB_sample_shading */ + +#ifndef GL_ARB_sampler_objects +#define GL_ARB_sampler_objects 1 +#endif /* GL_ARB_sampler_objects */ + +#ifndef GL_ARB_seamless_cube_map +#define GL_ARB_seamless_cube_map 1 +#endif /* GL_ARB_seamless_cube_map */ + +#ifndef GL_ARB_seamless_cubemap_per_texture +#define GL_ARB_seamless_cubemap_per_texture 1 +#endif /* GL_ARB_seamless_cubemap_per_texture */ + +#ifndef GL_ARB_separate_shader_objects +#define GL_ARB_separate_shader_objects 1 +#endif /* GL_ARB_separate_shader_objects */ + +#ifndef GL_ARB_shader_atomic_counters +#define GL_ARB_shader_atomic_counters 1 +#endif /* GL_ARB_shader_atomic_counters */ + +#ifndef GL_ARB_shader_bit_encoding +#define GL_ARB_shader_bit_encoding 1 +#endif /* GL_ARB_shader_bit_encoding */ + +#ifndef GL_ARB_shader_draw_parameters +#define GL_ARB_shader_draw_parameters 1 +#endif /* GL_ARB_shader_draw_parameters */ + +#ifndef GL_ARB_shader_group_vote +#define GL_ARB_shader_group_vote 1 +#endif /* GL_ARB_shader_group_vote */ + +#ifndef GL_ARB_shader_image_load_store +#define GL_ARB_shader_image_load_store 1 +#endif /* GL_ARB_shader_image_load_store */ + +#ifndef GL_ARB_shader_image_size +#define GL_ARB_shader_image_size 1 +#endif /* GL_ARB_shader_image_size */ + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 +#ifdef __APPLE__ +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif +typedef char GLcharARB; +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); +typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB obj); +GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum pname); +GLAPI void APIENTRY glDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj); +GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum shaderType); +GLAPI void APIENTRY glShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); +GLAPI void APIENTRY glCompileShaderARB (GLhandleARB shaderObj); +GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); +GLAPI void APIENTRY glAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj); +GLAPI void APIENTRY glLinkProgramARB (GLhandleARB programObj); +GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB programObj); +GLAPI void APIENTRY glValidateProgramARB (GLhandleARB programObj); +GLAPI void APIENTRY glUniform1fARB (GLint location, GLfloat v0); +GLAPI void APIENTRY glUniform2fARB (GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glUniform1iARB (GLint location, GLint v0); +GLAPI void APIENTRY glUniform2iARB (GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glUniform1fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform2fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform3fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform4fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform1ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform2ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform3ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform4ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name); +GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params); +GLAPI void APIENTRY glGetUniformivARB (GLhandleARB programObj, GLint location, GLint *params); +GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#endif +#endif /* GL_ARB_shader_objects */ + +#ifndef GL_ARB_shader_precision +#define GL_ARB_shader_precision 1 +#endif /* GL_ARB_shader_precision */ + +#ifndef GL_ARB_shader_stencil_export +#define GL_ARB_shader_stencil_export 1 +#endif /* GL_ARB_shader_stencil_export */ + +#ifndef GL_ARB_shader_storage_buffer_object +#define GL_ARB_shader_storage_buffer_object 1 +#endif /* GL_ARB_shader_storage_buffer_object */ + +#ifndef GL_ARB_shader_subroutine +#define GL_ARB_shader_subroutine 1 +#endif /* GL_ARB_shader_subroutine */ + +#ifndef GL_ARB_shader_texture_image_samples +#define GL_ARB_shader_texture_image_samples 1 +#endif /* GL_ARB_shader_texture_image_samples */ + +#ifndef GL_ARB_shader_texture_lod +#define GL_ARB_shader_texture_lod 1 +#endif /* GL_ARB_shader_texture_lod */ + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C +#endif /* GL_ARB_shading_language_100 */ + +#ifndef GL_ARB_shading_language_420pack +#define GL_ARB_shading_language_420pack 1 +#endif /* GL_ARB_shading_language_420pack */ + +#ifndef GL_ARB_shading_language_include +#define GL_ARB_shading_language_include 1 +#define GL_SHADER_INCLUDE_ARB 0x8DAE +#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 +#define GL_NAMED_STRING_TYPE_ARB 0x8DEA +typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); +typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); +typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); +typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); +GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name); +GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); +GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name); +GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); +GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params); +#endif +#endif /* GL_ARB_shading_language_include */ + +#ifndef GL_ARB_shading_language_packing +#define GL_ARB_shading_language_packing 1 +#endif /* GL_ARB_shading_language_packing */ + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E +#endif /* GL_ARB_shadow */ + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF +#endif /* GL_ARB_shadow_ambient */ + +#ifndef GL_ARB_sparse_buffer +#define GL_ARB_sparse_buffer 1 +#define GL_SPARSE_STORAGE_BIT_ARB 0x0400 +#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 +typedef void (APIENTRYP PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); +typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTARBPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferPageCommitmentARB (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); +GLAPI void APIENTRY glNamedBufferPageCommitmentEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +GLAPI void APIENTRY glNamedBufferPageCommitmentARB (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +#endif +#endif /* GL_ARB_sparse_buffer */ + +#ifndef GL_ARB_sparse_texture +#define GL_ARB_sparse_texture 1 +#define GL_TEXTURE_SPARSE_ARB 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 +#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA +#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 +#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 +typedef void (APIENTRYP PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexPageCommitmentARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +#endif +#endif /* GL_ARB_sparse_texture */ + +#ifndef GL_ARB_stencil_texturing +#define GL_ARB_stencil_texturing 1 +#endif /* GL_ARB_stencil_texturing */ + +#ifndef GL_ARB_sync +#define GL_ARB_sync 1 +#endif /* GL_ARB_sync */ + +#ifndef GL_ARB_tessellation_shader +#define GL_ARB_tessellation_shader 1 +#endif /* GL_ARB_tessellation_shader */ + +#ifndef GL_ARB_texture_barrier +#define GL_ARB_texture_barrier 1 +#endif /* GL_ARB_texture_barrier */ + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 +#define GL_CLAMP_TO_BORDER_ARB 0x812D +#endif /* GL_ARB_texture_border_clamp */ + +#ifndef GL_ARB_texture_buffer_object +#define GL_ARB_texture_buffer_object 1 +#define GL_TEXTURE_BUFFER_ARB 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E +typedef void (APIENTRYP PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer); #endif +#endif /* GL_ARB_texture_buffer_object */ -#ifndef GL_ARB_transpose_matrix -#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 -#endif +#ifndef GL_ARB_texture_buffer_object_rgb32 +#define GL_ARB_texture_buffer_object_rgb32 1 +#endif /* GL_ARB_texture_buffer_object_rgb32 */ -#ifndef GL_ARB_multisample -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 -#endif +#ifndef GL_ARB_texture_buffer_range +#define GL_ARB_texture_buffer_range 1 +#endif /* GL_ARB_texture_buffer_range */ + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *img); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum target, GLint level, void *img); +#endif +#endif /* GL_ARB_texture_compression */ + +#ifndef GL_ARB_texture_compression_bptc +#define GL_ARB_texture_compression_bptc 1 +#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F +#endif /* GL_ARB_texture_compression_bptc */ + +#ifndef GL_ARB_texture_compression_rgtc +#define GL_ARB_texture_compression_rgtc 1 +#endif /* GL_ARB_texture_compression_rgtc */ #ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 #define GL_NORMAL_MAP_ARB 0x8511 #define GL_REFLECTION_MAP_ARB 0x8512 #define GL_TEXTURE_CUBE_MAP_ARB 0x8513 @@ -209,23 +4203,213 @@ extern "C" { #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C -#endif +#endif /* GL_ARB_texture_cube_map */ + +#ifndef GL_ARB_texture_cube_map_array +#define GL_ARB_texture_cube_map_array 1 +#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F +#endif /* GL_ARB_texture_cube_map_array */ -#ifndef GL_ARB_texture_compression -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 +#endif /* GL_ARB_texture_env_add */ + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#endif /* GL_ARB_texture_env_combine */ + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 +#endif /* GL_ARB_texture_env_crossbar */ + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF +#endif /* GL_ARB_texture_env_dot3 */ + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#endif /* GL_ARB_texture_float */ + +#ifndef GL_ARB_texture_gather +#define GL_ARB_texture_gather 1 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F +#endif /* GL_ARB_texture_gather */ + +#ifndef GL_ARB_texture_mirror_clamp_to_edge +#define GL_ARB_texture_mirror_clamp_to_edge 1 +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#endif /* GL_ARB_texture_mirrored_repeat */ + +#ifndef GL_ARB_texture_multisample +#define GL_ARB_texture_multisample 1 +#endif /* GL_ARB_texture_multisample */ + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 +#endif /* GL_ARB_texture_non_power_of_two */ + +#ifndef GL_ARB_texture_query_levels +#define GL_ARB_texture_query_levels 1 +#endif /* GL_ARB_texture_query_levels */ + +#ifndef GL_ARB_texture_query_lod +#define GL_ARB_texture_query_lod 1 +#endif /* GL_ARB_texture_query_lod */ + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#endif /* GL_ARB_texture_rectangle */ + +#ifndef GL_ARB_texture_rg +#define GL_ARB_texture_rg 1 +#endif /* GL_ARB_texture_rg */ + +#ifndef GL_ARB_texture_rgb10_a2ui +#define GL_ARB_texture_rgb10_a2ui 1 +#endif /* GL_ARB_texture_rgb10_a2ui */ + +#ifndef GL_ARB_texture_stencil8 +#define GL_ARB_texture_stencil8 1 +#endif /* GL_ARB_texture_stencil8 */ + +#ifndef GL_ARB_texture_storage +#define GL_ARB_texture_storage 1 +#endif /* GL_ARB_texture_storage */ + +#ifndef GL_ARB_texture_storage_multisample +#define GL_ARB_texture_storage_multisample 1 +#endif /* GL_ARB_texture_storage_multisample */ + +#ifndef GL_ARB_texture_swizzle +#define GL_ARB_texture_swizzle 1 +#endif /* GL_ARB_texture_swizzle */ + +#ifndef GL_ARB_texture_view +#define GL_ARB_texture_view 1 +#endif /* GL_ARB_texture_view */ + +#ifndef GL_ARB_timer_query +#define GL_ARB_timer_query 1 +#endif /* GL_ARB_timer_query */ + +#ifndef GL_ARB_transform_feedback2 +#define GL_ARB_transform_feedback2 1 +#endif /* GL_ARB_transform_feedback2 */ + +#ifndef GL_ARB_transform_feedback3 +#define GL_ARB_transform_feedback3 1 +#endif /* GL_ARB_transform_feedback3 */ + +#ifndef GL_ARB_transform_feedback_instanced +#define GL_ARB_transform_feedback_instanced 1 +#endif /* GL_ARB_transform_feedback_instanced */ + +#ifndef GL_ARB_transform_feedback_overflow_query +#define GL_ARB_transform_feedback_overflow_query 1 +#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED +#endif /* GL_ARB_transform_feedback_overflow_query */ + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *m); +GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *m); +GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *m); +GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *m); #endif +#endif /* GL_ARB_transpose_matrix */ + +#ifndef GL_ARB_uniform_buffer_object +#define GL_ARB_uniform_buffer_object 1 +#endif /* GL_ARB_uniform_buffer_object */ + +#ifndef GL_ARB_vertex_array_bgra +#define GL_ARB_vertex_array_bgra 1 +#endif /* GL_ARB_vertex_array_bgra */ + +#ifndef GL_ARB_vertex_array_object +#define GL_ARB_vertex_array_object 1 +#endif /* GL_ARB_vertex_array_object */ + +#ifndef GL_ARB_vertex_attrib_64bit +#define GL_ARB_vertex_attrib_64bit 1 +#endif /* GL_ARB_vertex_attrib_64bit */ + +#ifndef GL_ARB_vertex_attrib_binding +#define GL_ARB_vertex_attrib_binding 1 +#endif /* GL_ARB_vertex_attrib_binding */ #ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 #define GL_MAX_VERTEX_UNITS_ARB 0x86A4 #define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 #define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 @@ -268,122 +4452,1829 @@ extern "C" { #define GL_MODELVIEW29_ARB 0x873D #define GL_MODELVIEW30_ARB 0x873E #define GL_MODELVIEW31_ARB 0x873F +typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); +typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); +typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); +typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); +typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); +typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); +typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWeightbvARB (GLint size, const GLbyte *weights); +GLAPI void APIENTRY glWeightsvARB (GLint size, const GLshort *weights); +GLAPI void APIENTRY glWeightivARB (GLint size, const GLint *weights); +GLAPI void APIENTRY glWeightfvARB (GLint size, const GLfloat *weights); +GLAPI void APIENTRY glWeightdvARB (GLint size, const GLdouble *weights); +GLAPI void APIENTRY glWeightubvARB (GLint size, const GLubyte *weights); +GLAPI void APIENTRY glWeightusvARB (GLint size, const GLushort *weights); +GLAPI void APIENTRY glWeightuivARB (GLint size, const GLuint *weights); +GLAPI void APIENTRY glWeightPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glVertexBlendARB (GLint count); +#endif +#endif /* GL_ARB_vertex_blend */ + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 +// Unfortunate problem with the OS X SDK which defines these types incorrectly +#if !defined(MACOS_X) +typedef ptrdiff_t GLsizeiptrARB; +typedef ptrdiff_t GLintptrARB; +#endif +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA +typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); +typedef void *(APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindBufferARB (GLenum target, GLuint buffer); +GLAPI void APIENTRY glDeleteBuffersARB (GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glGenBuffersARB (GLsizei n, GLuint *buffers); +GLAPI GLboolean APIENTRY glIsBufferARB (GLuint buffer); +GLAPI void APIENTRY glBufferDataARB (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); +GLAPI void APIENTRY glBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); +GLAPI void APIENTRY glGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); +GLAPI void *APIENTRY glMapBufferARB (GLenum target, GLenum access); +GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum target); +GLAPI void APIENTRY glGetBufferParameterivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetBufferPointervARB (GLenum target, GLenum pname, void **params); +#endif +#endif /* GL_ARB_vertex_buffer_object */ + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void **pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttrib1dARB (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1fARB (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1sARB (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2sARB (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint index); +GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint index); +GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint index, GLenum pname, void **pointer); +#endif +#endif /* GL_ARB_vertex_program */ + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name); +GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name); +#endif +#endif /* GL_ARB_vertex_shader */ + +#ifndef GL_ARB_vertex_type_10f_11f_11f_rev +#define GL_ARB_vertex_type_10f_11f_11f_rev 1 +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ + +#ifndef GL_ARB_vertex_type_2_10_10_10_rev +#define GL_ARB_vertex_type_2_10_10_10_rev 1 +#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ + +#ifndef GL_ARB_viewport_array +#define GL_ARB_viewport_array 1 +#endif /* GL_ARB_viewport_array */ + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 +typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dARB (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2fARB (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2iARB (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2ivARB (const GLint *v); +GLAPI void APIENTRY glWindowPos2sARB (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2svARB (const GLshort *v); +GLAPI void APIENTRY glWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3iARB (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3ivARB (const GLint *v); +GLAPI void APIENTRY glWindowPos3sARB (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3svARB (const GLshort *v); +#endif +#endif /* GL_ARB_window_pos */ + +#ifndef GL_KHR_blend_equation_advanced +#define GL_KHR_blend_equation_advanced 1 +#define GL_MULTIPLY_KHR 0x9294 +#define GL_SCREEN_KHR 0x9295 +#define GL_OVERLAY_KHR 0x9296 +#define GL_DARKEN_KHR 0x9297 +#define GL_LIGHTEN_KHR 0x9298 +#define GL_COLORDODGE_KHR 0x9299 +#define GL_COLORBURN_KHR 0x929A +#define GL_HARDLIGHT_KHR 0x929B +#define GL_SOFTLIGHT_KHR 0x929C +#define GL_DIFFERENCE_KHR 0x929E +#define GL_EXCLUSION_KHR 0x92A0 +#define GL_HSL_HUE_KHR 0x92AD +#define GL_HSL_SATURATION_KHR 0x92AE +#define GL_HSL_COLOR_KHR 0x92AF +#define GL_HSL_LUMINOSITY_KHR 0x92B0 +typedef void (APIENTRYP PFNGLBLENDBARRIERKHRPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendBarrierKHR (void); +#endif +#endif /* GL_KHR_blend_equation_advanced */ + +#ifndef GL_KHR_blend_equation_advanced_coherent +#define GL_KHR_blend_equation_advanced_coherent 1 +#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 +#endif /* GL_KHR_blend_equation_advanced_coherent */ + +#ifndef GL_KHR_context_flush_control +#define GL_KHR_context_flush_control 1 +#endif /* GL_KHR_context_flush_control */ + +#ifndef GL_KHR_debug +#define GL_KHR_debug 1 +#endif /* GL_KHR_debug */ + +#ifndef GL_KHR_robust_buffer_access_behavior +#define GL_KHR_robust_buffer_access_behavior 1 +#endif /* GL_KHR_robust_buffer_access_behavior */ + +#ifndef GL_KHR_robustness +#define GL_KHR_robustness 1 +#define GL_CONTEXT_ROBUST_ACCESS 0x90F3 +#endif /* GL_KHR_robustness */ + +#ifndef GL_KHR_texture_compression_astc_hdr +#define GL_KHR_texture_compression_astc_hdr 1 +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD +#endif /* GL_KHR_texture_compression_astc_hdr */ + +#ifndef GL_KHR_texture_compression_astc_ldr +#define GL_KHR_texture_compression_astc_ldr 1 +#endif /* GL_KHR_texture_compression_astc_ldr */ + +#ifndef GL_OES_byte_coordinates +#define GL_OES_byte_coordinates 1 +typedef void (APIENTRYP PFNGLMULTITEXCOORD1BOESPROC) (GLenum texture, GLbyte s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2BOESPROC) (GLenum texture, GLbyte s, GLbyte t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD1BOESPROC) (GLbyte s); +typedef void (APIENTRYP PFNGLTEXCOORD1BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD2BOESPROC) (GLbyte s, GLbyte t); +typedef void (APIENTRYP PFNGLTEXCOORD2BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD3BOESPROC) (GLbyte s, GLbyte t, GLbyte r); +typedef void (APIENTRYP PFNGLTEXCOORD3BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD4BOESPROC) (GLbyte s, GLbyte t, GLbyte r, GLbyte q); +typedef void (APIENTRYP PFNGLTEXCOORD4BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX2BOESPROC) (GLbyte x, GLbyte y); +typedef void (APIENTRYP PFNGLVERTEX2BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX3BOESPROC) (GLbyte x, GLbyte y, GLbyte z); +typedef void (APIENTRYP PFNGLVERTEX3BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX4BOESPROC) (GLbyte x, GLbyte y, GLbyte z, GLbyte w); +typedef void (APIENTRYP PFNGLVERTEX4BVOESPROC) (const GLbyte *coords); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiTexCoord1bOES (GLenum texture, GLbyte s); +GLAPI void APIENTRY glMultiTexCoord1bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord2bOES (GLenum texture, GLbyte s, GLbyte t); +GLAPI void APIENTRY glMultiTexCoord2bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord3bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r); +GLAPI void APIENTRY glMultiTexCoord3bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord4bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); +GLAPI void APIENTRY glMultiTexCoord4bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glTexCoord1bOES (GLbyte s); +GLAPI void APIENTRY glTexCoord1bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord2bOES (GLbyte s, GLbyte t); +GLAPI void APIENTRY glTexCoord2bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord3bOES (GLbyte s, GLbyte t, GLbyte r); +GLAPI void APIENTRY glTexCoord3bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord4bOES (GLbyte s, GLbyte t, GLbyte r, GLbyte q); +GLAPI void APIENTRY glTexCoord4bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex2bOES (GLbyte x, GLbyte y); +GLAPI void APIENTRY glVertex2bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex3bOES (GLbyte x, GLbyte y, GLbyte z); +GLAPI void APIENTRY glVertex3bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex4bOES (GLbyte x, GLbyte y, GLbyte z, GLbyte w); +GLAPI void APIENTRY glVertex4bvOES (const GLbyte *coords); +#endif +#endif /* GL_OES_byte_coordinates */ + +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 +#endif /* GL_OES_compressed_paletted_texture */ + +#ifndef GL_OES_fixed_point +#define GL_OES_fixed_point 1 +typedef GLint GLfixed; +#define GL_FIXED_OES 0x140C +typedef void (APIENTRYP PFNGLALPHAFUNCXOESPROC) (GLenum func, GLfixed ref); +typedef void (APIENTRYP PFNGLCLEARCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCLEARDEPTHXOESPROC) (GLfixed depth); +typedef void (APIENTRYP PFNGLCLIPPLANEXOESPROC) (GLenum plane, const GLfixed *equation); +typedef void (APIENTRYP PFNGLCOLOR4XOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLDEPTHRANGEXOESPROC) (GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLFOGXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLFOGXVOESPROC) (GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLFRUSTUMXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLGETCLIPPLANEXOESPROC) (GLenum plane, GLfixed *equation); +typedef void (APIENTRYP PFNGLGETFIXEDVOESPROC) (GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXENVXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLLIGHTMODELXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLLIGHTMODELXVOESPROC) (GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLLIGHTXVOESPROC) (GLenum light, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLLINEWIDTHXOESPROC) (GLfixed width); +typedef void (APIENTRYP PFNGLLOADMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLMATERIALXVOESPROC) (GLenum face, GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLMULTMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (APIENTRYP PFNGLNORMAL3XOESPROC) (GLfixed nx, GLfixed ny, GLfixed nz); +typedef void (APIENTRYP PFNGLORTHOXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLPOINTPARAMETERXVOESPROC) (GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLPOINTSIZEXOESPROC) (GLfixed size); +typedef void (APIENTRYP PFNGLPOLYGONOFFSETXOESPROC) (GLfixed factor, GLfixed units); +typedef void (APIENTRYP PFNGLROTATEXOESPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEOESPROC) (GLfixed value, GLboolean invert); +typedef void (APIENTRYP PFNGLSCALEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLTEXENVXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXENVXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLTRANSLATEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLACCUMXOESPROC) (GLenum op, GLfixed value); +typedef void (APIENTRYP PFNGLBITMAPXOESPROC) (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); +typedef void (APIENTRYP PFNGLBLENDCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCLEARACCUMXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCOLOR3XOESPROC) (GLfixed red, GLfixed green, GLfixed blue); +typedef void (APIENTRYP PFNGLCOLOR3XVOESPROC) (const GLfixed *components); +typedef void (APIENTRYP PFNGLCOLOR4XVOESPROC) (const GLfixed *components); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLEVALCOORD1XOESPROC) (GLfixed u); +typedef void (APIENTRYP PFNGLEVALCOORD1XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLEVALCOORD2XOESPROC) (GLfixed u, GLfixed v); +typedef void (APIENTRYP PFNGLEVALCOORD2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLFEEDBACKBUFFERXOESPROC) (GLsizei n, GLenum type, const GLfixed *buffer); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETMAPXVOESPROC) (GLenum target, GLenum query, GLfixed *v); +typedef void (APIENTRYP PFNGLGETMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLGETPIXELMAPXVPROC) (GLenum map, GLint size, GLfixed *values); +typedef void (APIENTRYP PFNGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERXVOESPROC) (GLenum target, GLint level, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLINDEXXOESPROC) (GLfixed component); +typedef void (APIENTRYP PFNGLINDEXXVOESPROC) (const GLfixed *component); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMAP1XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); +typedef void (APIENTRYP PFNGLMAP2XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); +typedef void (APIENTRYP PFNGLMAPGRID1XOESPROC) (GLint n, GLfixed u1, GLfixed u2); +typedef void (APIENTRYP PFNGLMAPGRID2XOESPROC) (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1XOESPROC) (GLenum texture, GLfixed s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2XOESPROC) (GLenum texture, GLfixed s, GLfixed t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLNORMAL3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLPASSTHROUGHXOESPROC) (GLfixed token); +typedef void (APIENTRYP PFNGLPIXELMAPXPROC) (GLenum map, GLint size, const GLfixed *values); +typedef void (APIENTRYP PFNGLPIXELSTOREXPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLPIXELTRANSFERXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLPIXELZOOMXOESPROC) (GLfixed xfactor, GLfixed yfactor); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESXOESPROC) (GLsizei n, const GLuint *textures, const GLfixed *priorities); +typedef void (APIENTRYP PFNGLRASTERPOS2XOESPROC) (GLfixed x, GLfixed y); +typedef void (APIENTRYP PFNGLRASTERPOS2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRASTERPOS3XOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLRASTERPOS3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRASTERPOS4XOESPROC) (GLfixed x, GLfixed y, GLfixed z, GLfixed w); +typedef void (APIENTRYP PFNGLRASTERPOS4XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRECTXOESPROC) (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); +typedef void (APIENTRYP PFNGLRECTXVOESPROC) (const GLfixed *v1, const GLfixed *v2); +typedef void (APIENTRYP PFNGLTEXCOORD1XOESPROC) (GLfixed s); +typedef void (APIENTRYP PFNGLTEXCOORD1XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD2XOESPROC) (GLfixed s, GLfixed t); +typedef void (APIENTRYP PFNGLTEXCOORD2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD3XOESPROC) (GLfixed s, GLfixed t, GLfixed r); +typedef void (APIENTRYP PFNGLTEXCOORD3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD4XOESPROC) (GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (APIENTRYP PFNGLTEXCOORD4XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLVERTEX2XOESPROC) (GLfixed x); +typedef void (APIENTRYP PFNGLVERTEX2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLVERTEX3XOESPROC) (GLfixed x, GLfixed y); +typedef void (APIENTRYP PFNGLVERTEX3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLVERTEX4XOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLVERTEX4XVOESPROC) (const GLfixed *coords); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAlphaFuncxOES (GLenum func, GLfixed ref); +GLAPI void APIENTRY glClearColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glClearDepthxOES (GLfixed depth); +GLAPI void APIENTRY glClipPlanexOES (GLenum plane, const GLfixed *equation); +GLAPI void APIENTRY glColor4xOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glDepthRangexOES (GLfixed n, GLfixed f); +GLAPI void APIENTRY glFogxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glFogxvOES (GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glFrustumxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +GLAPI void APIENTRY glGetClipPlanexOES (GLenum plane, GLfixed *equation); +GLAPI void APIENTRY glGetFixedvOES (GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexEnvxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glLightModelxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glLightModelxvOES (GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glLightxOES (GLenum light, GLenum pname, GLfixed param); +GLAPI void APIENTRY glLightxvOES (GLenum light, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glLineWidthxOES (GLfixed width); +GLAPI void APIENTRY glLoadMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMaterialxOES (GLenum face, GLenum pname, GLfixed param); +GLAPI void APIENTRY glMaterialxvOES (GLenum face, GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glMultMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMultiTexCoord4xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +GLAPI void APIENTRY glNormal3xOES (GLfixed nx, GLfixed ny, GLfixed nz); +GLAPI void APIENTRY glOrthoxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +GLAPI void APIENTRY glPointParameterxvOES (GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glPointSizexOES (GLfixed size); +GLAPI void APIENTRY glPolygonOffsetxOES (GLfixed factor, GLfixed units); +GLAPI void APIENTRY glRotatexOES (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glSampleCoverageOES (GLfixed value, GLboolean invert); +GLAPI void APIENTRY glScalexOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glTexEnvxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexEnvxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glTexParameterxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glTranslatexOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glAccumxOES (GLenum op, GLfixed value); +GLAPI void APIENTRY glBitmapxOES (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); +GLAPI void APIENTRY glBlendColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glClearAccumxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glColor3xOES (GLfixed red, GLfixed green, GLfixed blue); +GLAPI void APIENTRY glColor3xvOES (const GLfixed *components); +GLAPI void APIENTRY glColor4xvOES (const GLfixed *components); +GLAPI void APIENTRY glConvolutionParameterxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glConvolutionParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glEvalCoord1xOES (GLfixed u); +GLAPI void APIENTRY glEvalCoord1xvOES (const GLfixed *coords); +GLAPI void APIENTRY glEvalCoord2xOES (GLfixed u, GLfixed v); +GLAPI void APIENTRY glEvalCoord2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glFeedbackBufferxOES (GLsizei n, GLenum type, const GLfixed *buffer); +GLAPI void APIENTRY glGetConvolutionParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetHistogramParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetLightxOES (GLenum light, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetMapxvOES (GLenum target, GLenum query, GLfixed *v); +GLAPI void APIENTRY glGetMaterialxOES (GLenum face, GLenum pname, GLfixed param); +GLAPI void APIENTRY glGetPixelMapxv (GLenum map, GLint size, GLfixed *values); +GLAPI void APIENTRY glGetTexGenxvOES (GLenum coord, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexLevelParameterxvOES (GLenum target, GLint level, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glIndexxOES (GLfixed component); +GLAPI void APIENTRY glIndexxvOES (const GLfixed *component); +GLAPI void APIENTRY glLoadTransposeMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMap1xOES (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); +GLAPI void APIENTRY glMap2xOES (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); +GLAPI void APIENTRY glMapGrid1xOES (GLint n, GLfixed u1, GLfixed u2); +GLAPI void APIENTRY glMapGrid2xOES (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); +GLAPI void APIENTRY glMultTransposeMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMultiTexCoord1xOES (GLenum texture, GLfixed s); +GLAPI void APIENTRY glMultiTexCoord1xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord2xOES (GLenum texture, GLfixed s, GLfixed t); +GLAPI void APIENTRY glMultiTexCoord2xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord3xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r); +GLAPI void APIENTRY glMultiTexCoord3xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord4xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glNormal3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glPassThroughxOES (GLfixed token); +GLAPI void APIENTRY glPixelMapx (GLenum map, GLint size, const GLfixed *values); +GLAPI void APIENTRY glPixelStorex (GLenum pname, GLfixed param); +GLAPI void APIENTRY glPixelTransferxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glPixelZoomxOES (GLfixed xfactor, GLfixed yfactor); +GLAPI void APIENTRY glPrioritizeTexturesxOES (GLsizei n, const GLuint *textures, const GLfixed *priorities); +GLAPI void APIENTRY glRasterPos2xOES (GLfixed x, GLfixed y); +GLAPI void APIENTRY glRasterPos2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRasterPos3xOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glRasterPos3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRasterPos4xOES (GLfixed x, GLfixed y, GLfixed z, GLfixed w); +GLAPI void APIENTRY glRasterPos4xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRectxOES (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); +GLAPI void APIENTRY glRectxvOES (const GLfixed *v1, const GLfixed *v2); +GLAPI void APIENTRY glTexCoord1xOES (GLfixed s); +GLAPI void APIENTRY glTexCoord1xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord2xOES (GLfixed s, GLfixed t); +GLAPI void APIENTRY glTexCoord2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord3xOES (GLfixed s, GLfixed t, GLfixed r); +GLAPI void APIENTRY glTexCoord3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord4xOES (GLfixed s, GLfixed t, GLfixed r, GLfixed q); +GLAPI void APIENTRY glTexCoord4xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexGenxOES (GLenum coord, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexGenxvOES (GLenum coord, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glVertex2xOES (GLfixed x); +GLAPI void APIENTRY glVertex2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glVertex3xOES (GLfixed x, GLfixed y); +GLAPI void APIENTRY glVertex3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glVertex4xOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glVertex4xvOES (const GLfixed *coords); +#endif +#endif /* GL_OES_fixed_point */ + +#ifndef GL_OES_query_matrix +#define GL_OES_query_matrix 1 +typedef GLbitfield (APIENTRYP PFNGLQUERYMATRIXXOESPROC) (GLfixed *mantissa, GLint *exponent); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLbitfield APIENTRY glQueryMatrixxOES (GLfixed *mantissa, GLint *exponent); +#endif +#endif /* GL_OES_query_matrix */ + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B +#endif /* GL_OES_read_format */ + +#ifndef GL_OES_single_precision +#define GL_OES_single_precision 1 +typedef void (APIENTRYP PFNGLCLEARDEPTHFOESPROC) (GLclampf depth); +typedef void (APIENTRYP PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat *equation); +typedef void (APIENTRYP PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); +typedef void (APIENTRYP PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +typedef void (APIENTRYP PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat *equation); +typedef void (APIENTRYP PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClearDepthfOES (GLclampf depth); +GLAPI void APIENTRY glClipPlanefOES (GLenum plane, const GLfloat *equation); +GLAPI void APIENTRY glDepthRangefOES (GLclampf n, GLclampf f); +GLAPI void APIENTRY glFrustumfOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +GLAPI void APIENTRY glGetClipPlanefOES (GLenum plane, GLfloat *equation); +GLAPI void APIENTRY glOrthofOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); #endif +#endif /* GL_OES_single_precision */ -#ifndef GL_EXT_abgr -#define GL_ABGR_EXT 0x8000 +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 +#endif /* GL_3DFX_multisample */ + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 +typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTbufferMask3DFX (GLuint mask); #endif +#endif /* GL_3DFX_tbuffer */ -#ifndef GL_EXT_blend_color -#define GL_CONSTANT_COLOR_EXT 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 -#define GL_CONSTANT_ALPHA_EXT 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 -#define GL_BLEND_COLOR_EXT 0x8005 +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 +#endif /* GL_3DFX_texture_compression_FXT1 */ + +#ifndef GL_AMD_blend_minmax_factor +#define GL_AMD_blend_minmax_factor 1 +#define GL_FACTOR_MIN_AMD 0x901C +#define GL_FACTOR_MAX_AMD 0x901D +#endif /* GL_AMD_blend_minmax_factor */ + +#ifndef GL_AMD_conservative_depth +#define GL_AMD_conservative_depth 1 +#endif /* GL_AMD_conservative_depth */ + +#ifndef GL_AMD_debug_output +#define GL_AMD_debug_output 1 +typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); +#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 +#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 +#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 +#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A +#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B +#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C +#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D +#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E +#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F +#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 +typedef void (APIENTRYP PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDebugMessageEnableAMD (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsertAMD (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallbackAMD (GLDEBUGPROCAMD callback, void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLogAMD (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); +#endif +#endif /* GL_AMD_debug_output */ + +#ifndef GL_AMD_depth_clamp_separate +#define GL_AMD_depth_clamp_separate 1 +#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E +#define GL_DEPTH_CLAMP_FAR_AMD 0x901F +#endif /* GL_AMD_depth_clamp_separate */ + +#ifndef GL_AMD_draw_buffers_blend +#define GL_AMD_draw_buffers_blend 1 +typedef void (APIENTRYP PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncIndexedAMD (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparateIndexedAMD (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GLAPI void APIENTRY glBlendEquationIndexedAMD (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparateIndexedAMD (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +#endif +#endif /* GL_AMD_draw_buffers_blend */ + +#ifndef GL_AMD_gcn_shader +#define GL_AMD_gcn_shader 1 +#endif /* GL_AMD_gcn_shader */ + +#ifndef GL_AMD_gpu_shader_int64 +#define GL_AMD_gpu_shader_int64 1 +typedef int64_t GLint64EXT; +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F +#define GL_INT8_NV 0x8FE0 +#define GL_INT8_VEC2_NV 0x8FE1 +#define GL_INT8_VEC3_NV 0x8FE2 +#define GL_INT8_VEC4_NV 0x8FE3 +#define GL_INT16_NV 0x8FE4 +#define GL_INT16_VEC2_NV 0x8FE5 +#define GL_INT16_VEC3_NV 0x8FE6 +#define GL_INT16_VEC4_NV 0x8FE7 +#define GL_INT64_VEC2_NV 0x8FE9 +#define GL_INT64_VEC3_NV 0x8FEA +#define GL_INT64_VEC4_NV 0x8FEB +#define GL_UNSIGNED_INT8_NV 0x8FEC +#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED +#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE +#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF +#define GL_UNSIGNED_INT16_NV 0x8FF0 +#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 +#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 +#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 +#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB +typedef void (APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); +typedef void (APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); +typedef void (APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniform1i64NV (GLint location, GLint64EXT x); +GLAPI void APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x); +GLAPI void APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params); +GLAPI void APIENTRY glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT *params); +GLAPI void APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x); +GLAPI void APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x); +GLAPI void APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif +#endif /* GL_AMD_gpu_shader_int64 */ + +#ifndef GL_AMD_interleaved_elements +#define GL_AMD_interleaved_elements 1 +#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 +#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 +typedef void (APIENTRYP PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribParameteriAMD (GLuint index, GLenum pname, GLint param); #endif +#endif /* GL_AMD_interleaved_elements */ -#ifndef GL_EXT_polygon_offset -#define GL_POLYGON_OFFSET_EXT 0x8037 -#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 -#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +#ifndef GL_AMD_multi_draw_indirect +#define GL_AMD_multi_draw_indirect 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectAMD (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirectAMD (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); +#endif +#endif /* GL_AMD_multi_draw_indirect */ + +#ifndef GL_AMD_name_gen_delete +#define GL_AMD_name_gen_delete 1 +#define GL_DATA_BUFFER_AMD 0x9151 +#define GL_PERFORMANCE_MONITOR_AMD 0x9152 +#define GL_QUERY_OBJECT_AMD 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 +#define GL_SAMPLER_OBJECT_AMD 0x9155 +typedef void (APIENTRYP PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint *names); +typedef void (APIENTRYP PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint *names); +typedef GLboolean (APIENTRYP PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenNamesAMD (GLenum identifier, GLuint num, GLuint *names); +GLAPI void APIENTRY glDeleteNamesAMD (GLenum identifier, GLuint num, const GLuint *names); +GLAPI GLboolean APIENTRY glIsNameAMD (GLenum identifier, GLuint name); +#endif +#endif /* GL_AMD_name_gen_delete */ + +#ifndef GL_AMD_occlusion_query_event +#define GL_AMD_occlusion_query_event 1 +#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F +#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 +#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 +#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 +#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 +#define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF +typedef void (APIENTRYP PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glQueryObjectParameteruiAMD (GLenum target, GLuint id, GLenum pname, GLuint param); +#endif +#endif /* GL_AMD_occlusion_query_event */ + +#ifndef GL_AMD_performance_monitor +#define GL_AMD_performance_monitor 1 +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFMON_RESULT_AMD 0x8BC6 +typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); +typedef void (APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +typedef void (APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); +typedef void (APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +GLAPI void APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +GLAPI void APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +GLAPI void APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +GLAPI void APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data); +GLAPI void APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); +GLAPI void APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); +GLAPI void APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +GLAPI void APIENTRY glBeginPerfMonitorAMD (GLuint monitor); +GLAPI void APIENTRY glEndPerfMonitorAMD (GLuint monitor); +GLAPI void APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#endif +#endif /* GL_AMD_performance_monitor */ + +#ifndef GL_AMD_pinned_memory +#define GL_AMD_pinned_memory 1 +#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 +#endif /* GL_AMD_pinned_memory */ + +#ifndef GL_AMD_query_buffer_object +#define GL_AMD_query_buffer_object 1 +#define GL_QUERY_BUFFER_AMD 0x9192 +#define GL_QUERY_BUFFER_BINDING_AMD 0x9193 +#define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 +#endif /* GL_AMD_query_buffer_object */ + +#ifndef GL_AMD_sample_positions +#define GL_AMD_sample_positions 1 +#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F +typedef void (APIENTRYP PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat *val); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSetMultisamplefvAMD (GLenum pname, GLuint index, const GLfloat *val); +#endif +#endif /* GL_AMD_sample_positions */ + +#ifndef GL_AMD_seamless_cubemap_per_texture +#define GL_AMD_seamless_cubemap_per_texture 1 +#endif /* GL_AMD_seamless_cubemap_per_texture */ + +#ifndef GL_AMD_shader_atomic_counter_ops +#define GL_AMD_shader_atomic_counter_ops 1 +#endif /* GL_AMD_shader_atomic_counter_ops */ + +#ifndef GL_AMD_shader_stencil_export +#define GL_AMD_shader_stencil_export 1 +#endif /* GL_AMD_shader_stencil_export */ + +#ifndef GL_AMD_shader_trinary_minmax +#define GL_AMD_shader_trinary_minmax 1 +#endif /* GL_AMD_shader_trinary_minmax */ + +#ifndef GL_AMD_sparse_texture +#define GL_AMD_sparse_texture 1 +#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A +#define GL_MIN_SPARSE_LEVEL_AMD 0x919B +#define GL_MIN_LOD_WARNING_AMD 0x919C +#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 +typedef void (APIENTRYP PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +typedef void (APIENTRYP PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexStorageSparseAMD (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +GLAPI void APIENTRY glTextureStorageSparseAMD (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +#endif +#endif /* GL_AMD_sparse_texture */ + +#ifndef GL_AMD_stencil_operation_extended +#define GL_AMD_stencil_operation_extended 1 +#define GL_SET_AMD 0x874A +#define GL_REPLACE_VALUE_AMD 0x874B +#define GL_STENCIL_OP_VALUE_AMD 0x874C +#define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D +typedef void (APIENTRYP PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpValueAMD (GLenum face, GLuint value); +#endif +#endif /* GL_AMD_stencil_operation_extended */ + +#ifndef GL_AMD_texture_texture4 +#define GL_AMD_texture_texture4 1 +#endif /* GL_AMD_texture_texture4 */ + +#ifndef GL_AMD_transform_feedback3_lines_triangles +#define GL_AMD_transform_feedback3_lines_triangles 1 +#endif /* GL_AMD_transform_feedback3_lines_triangles */ + +#ifndef GL_AMD_transform_feedback4 +#define GL_AMD_transform_feedback4 1 +#define GL_STREAM_RASTERIZATION_AMD 0x91A0 +#endif /* GL_AMD_transform_feedback4 */ + +#ifndef GL_AMD_vertex_shader_layer +#define GL_AMD_vertex_shader_layer 1 +#endif /* GL_AMD_vertex_shader_layer */ + +#ifndef GL_AMD_vertex_shader_tessellator +#define GL_AMD_vertex_shader_tessellator 1 +#define GL_SAMPLER_BUFFER_AMD 0x9001 +#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 +#define GL_TESSELLATION_MODE_AMD 0x9004 +#define GL_TESSELLATION_FACTOR_AMD 0x9005 +#define GL_DISCRETE_AMD 0x9006 +#define GL_CONTINUOUS_AMD 0x9007 +typedef void (APIENTRYP PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTessellationFactorAMD (GLfloat factor); +GLAPI void APIENTRY glTessellationModeAMD (GLenum mode); +#endif +#endif /* GL_AMD_vertex_shader_tessellator */ + +#ifndef GL_AMD_vertex_shader_viewport_index +#define GL_AMD_vertex_shader_viewport_index 1 +#endif /* GL_AMD_vertex_shader_viewport_index */ + +#ifndef GL_APPLE_aux_depth_stencil +#define GL_APPLE_aux_depth_stencil 1 +#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 +#endif /* GL_APPLE_aux_depth_stencil */ + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 +#endif /* GL_APPLE_client_storage */ + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 +#define GL_ELEMENT_ARRAY_APPLE 0x8A0C +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E +typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerAPPLE (GLenum type, const void *pointer); +GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count); +GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#endif +#endif /* GL_APPLE_element_array */ + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B +typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); +typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); +typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenFencesAPPLE (GLsizei n, GLuint *fences); +GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei n, const GLuint *fences); +GLAPI void APIENTRY glSetFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint fence); +GLAPI void APIENTRY glFinishFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum object, GLuint name); +GLAPI void APIENTRY glFinishObjectAPPLE (GLenum object, GLint name); +#endif +#endif /* GL_APPLE_fence */ + +#ifndef GL_APPLE_float_pixels +#define GL_APPLE_float_pixels 1 +#define GL_HALF_APPLE 0x140B +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_RGBA_FLOAT16_APPLE 0x881A +#define GL_RGB_FLOAT16_APPLE 0x881B +#define GL_ALPHA_FLOAT16_APPLE 0x881C +#define GL_INTENSITY_FLOAT16_APPLE 0x881D +#define GL_LUMINANCE_FLOAT16_APPLE 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F +#define GL_COLOR_FLOAT_APPLE 0x8A0F +#endif /* GL_APPLE_float_pixels */ + +#ifndef GL_APPLE_flush_buffer_range +#define GL_APPLE_flush_buffer_range 1 +#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 +#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 +typedef void (APIENTRYP PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferParameteriAPPLE (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glFlushMappedBufferRangeAPPLE (GLenum target, GLintptr offset, GLsizeiptr size); +#endif +#endif /* GL_APPLE_flush_buffer_range */ + +#ifndef GL_APPLE_object_purgeable +#define GL_APPLE_object_purgeable 1 +#define GL_BUFFER_OBJECT_APPLE 0x85B3 +#define GL_RELEASED_APPLE 0x8A19 +#define GL_VOLATILE_APPLE 0x8A1A +#define GL_RETAINED_APPLE 0x8A1B +#define GL_UNDEFINED_APPLE 0x8A1C +#define GL_PURGEABLE_APPLE 0x8A1D +typedef GLenum (APIENTRYP PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef GLenum (APIENTRYP PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLenum APIENTRY glObjectPurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); +GLAPI GLenum APIENTRY glObjectUnpurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); +GLAPI void APIENTRY glGetObjectParameterivAPPLE (GLenum objectType, GLuint name, GLenum pname, GLint *params); +#endif +#endif /* GL_APPLE_object_purgeable */ + +#ifndef GL_APPLE_rgb_422 +#define GL_APPLE_rgb_422 1 +#define GL_RGB_422_APPLE 0x8A1F +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#define GL_RGB_RAW_422_APPLE 0x8A51 +#endif /* GL_APPLE_rgb_422 */ + +#ifndef GL_APPLE_row_bytes +#define GL_APPLE_row_bytes 1 +#define GL_PACK_ROW_BYTES_APPLE 0x8A15 +#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 +#endif /* GL_APPLE_row_bytes */ + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 +#endif /* GL_APPLE_specular_vector */ + +#ifndef GL_APPLE_texture_range +#define GL_APPLE_texture_range 1 +#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 +#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#define GL_STORAGE_PRIVATE_APPLE 0x85BD +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF +typedef void (APIENTRYP PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, const void *pointer); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureRangeAPPLE (GLenum target, GLsizei length, const void *pointer); +GLAPI void APIENTRY glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, void **params); #endif +#endif /* GL_APPLE_texture_range */ -#ifndef GL_EXT_texture -#define GL_ALPHA4_EXT 0x803B -#define GL_ALPHA8_EXT 0x803C -#define GL_ALPHA12_EXT 0x803D -#define GL_ALPHA16_EXT 0x803E -#define GL_LUMINANCE4_EXT 0x803F -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE12_EXT 0x8041 -#define GL_LUMINANCE16_EXT 0x8042 -#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 -#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 -#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 -#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 -#define GL_INTENSITY_EXT 0x8049 -#define GL_INTENSITY4_EXT 0x804A -#define GL_INTENSITY8_EXT 0x804B -#define GL_INTENSITY12_EXT 0x804C -#define GL_INTENSITY16_EXT 0x804D -#define GL_RGB2_EXT 0x804E -#define GL_RGB4_EXT 0x804F -#define GL_RGB5_EXT 0x8050 -#define GL_RGB8_EXT 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB12_EXT 0x8053 -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA2_EXT 0x8055 -#define GL_RGBA4_EXT 0x8056 -#define GL_RGB5_A1_EXT 0x8057 -#define GL_RGBA8_EXT 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGBA12_EXT 0x805A -#define GL_RGBA16_EXT 0x805B -#define GL_TEXTURE_RED_SIZE_EXT 0x805C -#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D -#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E -#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 -#define GL_REPLACE_EXT 0x8062 -#define GL_PROXY_TEXTURE_1D_EXT 0x8063 -#define GL_PROXY_TEXTURE_2D_EXT 0x8064 -#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 +#define GL_TRANSFORM_HINT_APPLE 0x85B1 +#endif /* GL_APPLE_transform_hint */ + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint array); +GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei n, const GLuint *arrays); +GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei n, GLuint *arrays); +GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint array); +#endif +#endif /* GL_APPLE_vertex_array_object */ + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CLIENT_APPLE 0x85B4 +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); +typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei length, void *pointer); +GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei length, void *pointer); +GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum pname, GLint param); +#endif +#endif /* GL_APPLE_vertex_array_range */ + +#ifndef GL_APPLE_vertex_program_evaluators +#define GL_APPLE_vertex_program_evaluators 1 +#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 +#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 +#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 +#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 +#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 +#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 +#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 +#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 +#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 +#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef GLboolean (APIENTRYP PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glEnableVertexAttribAPPLE (GLuint index, GLenum pname); +GLAPI void APIENTRY glDisableVertexAttribAPPLE (GLuint index, GLenum pname); +GLAPI GLboolean APIENTRY glIsVertexAttribEnabledAPPLE (GLuint index, GLenum pname); +GLAPI void APIENTRY glMapVertexAttrib1dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +GLAPI void APIENTRY glMapVertexAttrib1fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +GLAPI void APIENTRY glMapVertexAttrib2dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +GLAPI void APIENTRY glMapVertexAttrib2fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +#endif +#endif /* GL_APPLE_vertex_program_evaluators */ + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 +#define GL_YCBCR_422_APPLE 0x85B9 +#endif /* GL_APPLE_ycbcr_422 */ + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 +typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersATI (GLsizei n, const GLenum *bufs); +#endif +#endif /* GL_ATI_draw_buffers */ + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerATI (GLenum type, const void *pointer); +GLAPI void APIENTRY glDrawElementArrayATI (GLenum mode, GLsizei count); +GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count); +#endif +#endif /* GL_ATI_element_array */ + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBumpParameterivATI (GLenum pname, const GLint *param); +GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum pname, GLint *param); +GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param); +#endif +#endif /* GL_ATI_envmap_bumpmap */ + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_REG_6_ATI 0x8927 +#define GL_REG_7_ATI 0x8928 +#define GL_REG_8_ATI 0x8929 +#define GL_REG_9_ATI 0x892A +#define GL_REG_10_ATI 0x892B +#define GL_REG_11_ATI 0x892C +#define GL_REG_12_ATI 0x892D +#define GL_REG_13_ATI 0x892E +#define GL_REG_14_ATI 0x892F +#define GL_REG_15_ATI 0x8930 +#define GL_REG_16_ATI 0x8931 +#define GL_REG_17_ATI 0x8932 +#define GL_REG_18_ATI 0x8933 +#define GL_REG_19_ATI 0x8934 +#define GL_REG_20_ATI 0x8935 +#define GL_REG_21_ATI 0x8936 +#define GL_REG_22_ATI 0x8937 +#define GL_REG_23_ATI 0x8938 +#define GL_REG_24_ATI 0x8939 +#define GL_REG_25_ATI 0x893A +#define GL_REG_26_ATI 0x893B +#define GL_REG_27_ATI 0x893C +#define GL_REG_28_ATI 0x893D +#define GL_REG_29_ATI 0x893E +#define GL_REG_30_ATI 0x893F +#define GL_REG_31_ATI 0x8940 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_CON_8_ATI 0x8949 +#define GL_CON_9_ATI 0x894A +#define GL_CON_10_ATI 0x894B +#define GL_CON_11_ATI 0x894C +#define GL_CON_12_ATI 0x894D +#define GL_CON_13_ATI 0x894E +#define GL_CON_14_ATI 0x894F +#define GL_CON_15_ATI 0x8950 +#define GL_CON_16_ATI 0x8951 +#define GL_CON_17_ATI 0x8952 +#define GL_CON_18_ATI 0x8953 +#define GL_CON_19_ATI 0x8954 +#define GL_CON_20_ATI 0x8955 +#define GL_CON_21_ATI 0x8956 +#define GL_CON_22_ATI 0x8957 +#define GL_CON_23_ATI 0x8958 +#define GL_CON_24_ATI 0x8959 +#define GL_CON_25_ATI 0x895A +#define GL_CON_26_ATI 0x895B +#define GL_CON_27_ATI 0x895C +#define GL_CON_28_ATI 0x895D +#define GL_CON_29_ATI 0x895E +#define GL_CON_30_ATI 0x895F +#define GL_CON_31_ATI 0x8960 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B +#define GL_RED_BIT_ATI 0x00000001 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint range); +GLAPI void APIENTRY glBindFragmentShaderATI (GLuint id); +GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint id); +GLAPI void APIENTRY glBeginFragmentShaderATI (void); +GLAPI void APIENTRY glEndFragmentShaderATI (void); +GLAPI void APIENTRY glPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle); +GLAPI void APIENTRY glSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle); +GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint dst, const GLfloat *value); +#endif +#endif /* GL_ATI_fragment_shader */ + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 +typedef void *(APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void *APIENTRY glMapObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint buffer); +#endif +#endif /* GL_ATI_map_object_buffer */ + +#ifndef GL_ATI_meminfo +#define GL_ATI_meminfo 1 +#define GL_VBO_FREE_MEMORY_ATI 0x87FB +#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC +#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD +#endif /* GL_ATI_meminfo */ + +#ifndef GL_ATI_pixel_format_float +#define GL_ATI_pixel_format_float 1 +#define GL_RGBA_FLOAT_MODE_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 +#endif /* GL_ATI_pixel_format_float */ + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 +typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPNTrianglesiATI (GLenum pname, GLint param); +GLAPI void APIENTRY glPNTrianglesfATI (GLenum pname, GLfloat param); +#endif +#endif /* GL_ATI_pn_triangles */ + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#endif +#endif /* GL_ATI_separate_stencil */ + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 +#endif /* GL_ATI_text_fragment_shader */ + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +#endif /* GL_ATI_texture_env_combine3 */ + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F +#endif /* GL_ATI_texture_float */ + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#endif /* GL_ATI_texture_mirror_once */ + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 +typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage); +typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei size, const void *pointer, GLenum usage); +GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); +GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glFreeObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetArrayObjectivATI (GLenum array, GLenum pname, GLint *params); +GLAPI void APIENTRY glVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint *params); +#endif +#endif /* GL_ATI_vertex_array_object */ + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 +typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint *params); +#endif +#endif /* GL_ATI_vertex_attrib_array_object */ + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_STREAM0_ATI 0x876C +#define GL_VERTEX_STREAM1_ATI 0x876D +#define GL_VERTEX_STREAM2_ATI 0x876E +#define GL_VERTEX_STREAM3_ATI 0x876F +#define GL_VERTEX_STREAM4_ATI 0x8770 +#define GL_VERTEX_STREAM5_ATI 0x8771 +#define GL_VERTEX_STREAM6_ATI 0x8772 +#define GL_VERTEX_STREAM7_ATI 0x8773 +#define GL_VERTEX_SOURCE_ATI 0x8774 +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexStream1sATI (GLenum stream, GLshort x); +GLAPI void APIENTRY glVertexStream1svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream1iATI (GLenum stream, GLint x); +GLAPI void APIENTRY glVertexStream1ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream1fATI (GLenum stream, GLfloat x); +GLAPI void APIENTRY glVertexStream1fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream1dATI (GLenum stream, GLdouble x); +GLAPI void APIENTRY glVertexStream1dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream2sATI (GLenum stream, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexStream2svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream2iATI (GLenum stream, GLint x, GLint y); +GLAPI void APIENTRY glVertexStream2ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexStream2fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexStream2dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexStream3svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexStream3ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexStream3fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexStream3dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexStream4svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexStream4ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexStream4fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexStream4dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glNormalStream3bATI (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +GLAPI void APIENTRY glNormalStream3bvATI (GLenum stream, const GLbyte *coords); +GLAPI void APIENTRY glNormalStream3sATI (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +GLAPI void APIENTRY glNormalStream3svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glNormalStream3iATI (GLenum stream, GLint nx, GLint ny, GLint nz); +GLAPI void APIENTRY glNormalStream3ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glNormalStream3fATI (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI void APIENTRY glNormalStream3fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glNormalStream3dATI (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +GLAPI void APIENTRY glNormalStream3dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum stream); +GLAPI void APIENTRY glVertexBlendEnviATI (GLenum pname, GLint param); +GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum pname, GLfloat param); +#endif +#endif /* GL_ATI_vertex_streams */ + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF +#endif /* GL_EXT_422_pixels */ + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 +#define GL_ABGR_EXT 0x8000 +#endif /* GL_EXT_abgr */ + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 +#endif /* GL_EXT_bgra */ + +#ifndef GL_EXT_bindable_uniform +#define GL_EXT_bindable_uniform 1 +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF +typedef void (APIENTRYP PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); +typedef GLint (APIENTRYP PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); +typedef GLintptr (APIENTRYP PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniformBufferEXT (GLuint program, GLint location, GLuint buffer); +GLAPI GLint APIENTRY glGetUniformBufferSizeEXT (GLuint program, GLint location); +GLAPI GLintptr APIENTRY glGetUniformOffsetEXT (GLuint program, GLint location); #endif +#endif /* GL_EXT_bindable_uniform */ -#ifndef GL_EXT_texture3D -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_SKIP_IMAGES_EXT 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_DEPTH_EXT 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_TEXTURE_WRAP_R_EXT 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 +typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColorEXT (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); #endif +#endif /* GL_EXT_blend_color */ -#ifndef GL_SGIS_texture_filter4 -#define GL_FILTER4_SGIS 0x8146 -#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha); #endif +#endif /* GL_EXT_blend_equation_separate */ -#ifndef GL_EXT_subtexture +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #endif +#endif /* GL_EXT_blend_func_separate */ -#ifndef GL_EXT_copy_texture +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 +#endif /* GL_EXT_blend_logic_op */ + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_BLEND_EQUATION_EXT 0x8009 +typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationEXT (GLenum mode); #endif +#endif /* GL_EXT_blend_minmax */ -#ifndef GL_EXT_histogram -#define GL_HISTOGRAM_EXT 0x8024 -#define GL_PROXY_HISTOGRAM_EXT 0x8025 -#define GL_HISTOGRAM_WIDTH_EXT 0x8026 -#define GL_HISTOGRAM_FORMAT_EXT 0x8027 -#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C -#define GL_HISTOGRAM_SINK_EXT 0x802D -#define GL_MINMAX_EXT 0x802E -#define GL_MINMAX_FORMAT_EXT 0x802F -#define GL_MINMAX_SINK_EXT 0x8030 -#define GL_TABLE_TOO_LARGE_EXT 0x8031 +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B +#endif /* GL_EXT_blend_subtract */ + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 +#endif /* GL_EXT_clip_volume_hint */ + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F +#endif /* GL_EXT_cmyka */ + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 +typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); #endif +#endif /* GL_EXT_color_subtable */ + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 +typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLockArraysEXT (GLint first, GLsizei count); +GLAPI void APIENTRY glUnlockArraysEXT (void); +#endif +#endif /* GL_EXT_compiled_vertex_array */ #ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 #define GL_CONVOLUTION_1D_EXT 0x8010 #define GL_CONVOLUTION_2D_EXT 0x8011 #define GL_SEPARABLE_2D_EXT 0x8012 @@ -404,1045 +6295,1073 @@ extern "C" { #define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 #define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 #define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 -#endif +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat params); +GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum target, GLenum pname, GLint params); +GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, void *image); +GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +#endif +#endif /* GL_EXT_convolution */ -#ifndef GL_SGI_color_matrix -#define GL_COLOR_MATRIX_SGI 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB -#endif +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 +typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); +typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); +typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); +typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); +typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); +typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); +typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); +typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); +typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); +typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); +typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTangent3bEXT (GLbyte tx, GLbyte ty, GLbyte tz); +GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glTangent3dEXT (GLdouble tx, GLdouble ty, GLdouble tz); +GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glTangent3fEXT (GLfloat tx, GLfloat ty, GLfloat tz); +GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glTangent3iEXT (GLint tx, GLint ty, GLint tz); +GLAPI void APIENTRY glTangent3ivEXT (const GLint *v); +GLAPI void APIENTRY glTangent3sEXT (GLshort tx, GLshort ty, GLshort tz); +GLAPI void APIENTRY glTangent3svEXT (const GLshort *v); +GLAPI void APIENTRY glBinormal3bEXT (GLbyte bx, GLbyte by, GLbyte bz); +GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glBinormal3dEXT (GLdouble bx, GLdouble by, GLdouble bz); +GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glBinormal3fEXT (GLfloat bx, GLfloat by, GLfloat bz); +GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glBinormal3iEXT (GLint bx, GLint by, GLint bz); +GLAPI void APIENTRY glBinormal3ivEXT (const GLint *v); +GLAPI void APIENTRY glBinormal3sEXT (GLshort bx, GLshort by, GLshort bz); +GLAPI void APIENTRY glBinormal3svEXT (const GLshort *v); +GLAPI void APIENTRY glTangentPointerEXT (GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glBinormalPointerEXT (GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_coordinate_frame */ -#ifndef GL_SGI_color_table -#define GL_COLOR_TABLE_SGI 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 -#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 -#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 -#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 -#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 -#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); #endif +#endif /* GL_EXT_copy_texture */ -#ifndef GL_SGIS_pixel_texture -#define GL_PIXEL_TEXTURE_SGIS 0x8353 -#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 -#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 -#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC +typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCullParameterdvEXT (GLenum pname, GLdouble *params); +GLAPI void APIENTRY glCullParameterfvEXT (GLenum pname, GLfloat *params); +#endif +#endif /* GL_EXT_cull_vertex */ + +#ifndef GL_EXT_debug_label +#define GL_EXT_debug_label 1 +#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F +#define GL_PROGRAM_OBJECT_EXT 0x8B40 +#define GL_SHADER_OBJECT_EXT 0x8B48 +#define GL_BUFFER_OBJECT_EXT 0x9151 +#define GL_QUERY_OBJECT_EXT 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 +typedef void (APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); #endif +#endif /* GL_EXT_debug_label */ -#ifndef GL_SGIX_pixel_texture -#define GL_PIXEL_TEX_GEN_SGIX 0x8139 -#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +#ifndef GL_EXT_debug_marker +#define GL_EXT_debug_marker 1 +typedef void (APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); +GLAPI void APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); +GLAPI void APIENTRY glPopGroupMarkerEXT (void); #endif +#endif /* GL_EXT_debug_marker */ -#ifndef GL_SGIS_texture4D -#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 -#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 -#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 -#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 -#define GL_TEXTURE_4D_SGIS 0x8134 -#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 -#define GL_TEXTURE_4DSIZE_SGIS 0x8136 -#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 -#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 -#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthBoundsEXT (GLclampd zmin, GLclampd zmax); +#endif +#endif /* GL_EXT_depth_bounds_test */ + +#ifndef GL_EXT_direct_state_access +#define GL_EXT_direct_state_access 1 +#define GL_PROGRAM_MATRIX_EXT 0x8E2D +#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E +#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F +typedef void (APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +typedef void (APIENTRYP PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); +typedef void (APIENTRYP PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble *data); +typedef void (APIENTRYP PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void **data); +typedef void (APIENTRYP PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); +typedef void (APIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, void *img); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, void *img); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void **params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint *params); +typedef void (APIENTRYP PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void **params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); +typedef void (APIENTRYP PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (APIENTRYP PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void **param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void **param); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixLoadIdentityEXT (GLenum mode); +GLAPI void APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glMatrixPopEXT (GLenum mode); +GLAPI void APIENTRY glMatrixPushEXT (GLenum mode); +GLAPI void APIENTRY glClientAttribDefaultEXT (GLbitfield mask); +GLAPI void APIENTRY glPushClientAttribDefaultEXT (GLbitfield mask); +GLAPI void APIENTRY glTextureParameterfEXT (GLuint texture, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glTextureParameteriEXT (GLuint texture, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetTextureImageEXT (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +GLAPI void APIENTRY glGetTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureLevelParameterfvEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureLevelParameterivEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture); +GLAPI void APIENTRY glMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +GLAPI void APIENTRY glMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); +GLAPI void APIENTRY glMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint *params); +GLAPI void APIENTRY glMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +GLAPI void APIENTRY glGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glEnableClientStateIndexedEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glDisableClientStateIndexedEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat *data); +GLAPI void APIENTRY glGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble *data); +GLAPI void APIENTRY glGetPointerIndexedvEXT (GLenum target, GLuint index, void **data); +GLAPI void APIENTRY glEnableIndexedEXT (GLenum target, GLuint index); +GLAPI void APIENTRY glDisableIndexedEXT (GLenum target, GLuint index); +GLAPI GLboolean APIENTRY glIsEnabledIndexedEXT (GLenum target, GLuint index); +GLAPI void APIENTRY glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data); +GLAPI void APIENTRY glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data); +GLAPI void APIENTRY glCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glGetCompressedTextureImageEXT (GLuint texture, GLenum target, GLint lod, void *img); +GLAPI void APIENTRY glCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint lod, void *img); +GLAPI void APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glNamedBufferDataEXT (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +GLAPI void APIENTRY glNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void *APIENTRY glMapNamedBufferEXT (GLuint buffer, GLenum access); +GLAPI GLboolean APIENTRY glUnmapNamedBufferEXT (GLuint buffer); +GLAPI void APIENTRY glGetNamedBufferParameterivEXT (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedBufferPointervEXT (GLuint buffer, GLenum pname, void **params); +GLAPI void APIENTRY glGetNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +GLAPI void APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); +GLAPI void APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); +GLAPI void APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glTextureBufferEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); +GLAPI void APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint *params); +GLAPI void APIENTRY glEnableClientStateiEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glDisableClientStateiEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glGetFloati_vEXT (GLenum pname, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetDoublei_vEXT (GLenum pname, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetPointeri_vEXT (GLenum pname, GLuint index, void **params); +GLAPI void APIENTRY glNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); +GLAPI void APIENTRY glNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, void *string); +GLAPI void APIENTRY glNamedRenderbufferStorageEXT (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetNamedRenderbufferParameterivEXT (GLuint renderbuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleEXT (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI GLenum APIENTRY glCheckNamedFramebufferStatusEXT (GLuint framebuffer, GLenum target); +GLAPI void APIENTRY glNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glNamedFramebufferRenderbufferEXT (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameterivEXT (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateTextureMipmapEXT (GLuint texture, GLenum target); +GLAPI void APIENTRY glGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target); +GLAPI void APIENTRY glFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode); +GLAPI void APIENTRY glFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode); +GLAPI void APIENTRY glGetFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glNamedFramebufferTextureEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTextureLayerEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +GLAPI void APIENTRY glTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glVertexArrayVertexOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayEdgeFlagOffsetEXT (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayIndexOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayNormalOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayMultiTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayFogCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArraySecondaryColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayVertexAttribOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayVertexAttribIOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glEnableVertexArrayEXT (GLuint vaobj, GLenum array); +GLAPI void APIENTRY glDisableVertexArrayEXT (GLuint vaobj, GLenum array); +GLAPI void APIENTRY glEnableVertexArrayAttribEXT (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glDisableVertexArrayAttribEXT (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glGetVertexArrayIntegervEXT (GLuint vaobj, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayPointervEXT (GLuint vaobj, GLenum pname, void **param); +GLAPI void APIENTRY glGetVertexArrayIntegeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayPointeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, void **param); +GLAPI void *APIENTRY glMapNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI void APIENTRY glFlushMappedNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glNamedBufferStorageEXT (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +GLAPI void APIENTRY glClearNamedBufferDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearNamedBufferSubDataEXT (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glNamedFramebufferParameteriEXT (GLuint framebuffer, GLenum pname, GLint param); +GLAPI void APIENTRY glGetNamedFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glProgramUniform1dEXT (GLuint program, GLint location, GLdouble x); +GLAPI void APIENTRY glProgramUniform2dEXT (GLuint program, GLint location, GLdouble x, GLdouble y); +GLAPI void APIENTRY glProgramUniform3dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glProgramUniform4dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramUniform1dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform2dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform3dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform4dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glTextureBufferRangeEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glTextureStorage2DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureStorage3DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glVertexArrayBindVertexBufferEXT (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI void APIENTRY glVertexArrayVertexAttribFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribIFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribLFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribBindingEXT (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +GLAPI void APIENTRY glVertexArrayVertexBindingDivisorEXT (GLuint vaobj, GLuint bindingindex, GLuint divisor); +GLAPI void APIENTRY glVertexArrayVertexAttribLOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glTexturePageCommitmentEXT (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +GLAPI void APIENTRY glVertexArrayVertexAttribDivisorEXT (GLuint vaobj, GLuint index, GLuint divisor); +#endif +#endif /* GL_EXT_direct_state_access */ + +#ifndef GL_EXT_draw_buffers2 +#define GL_EXT_draw_buffers2 1 +typedef void (APIENTRYP PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); #endif +#endif /* GL_EXT_draw_buffers2 */ -#ifndef GL_SGI_texture_color_table -#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC -#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); #endif +#endif /* GL_EXT_draw_instanced */ -#ifndef GL_EXT_cmyka -#define GL_CMYK_EXT 0x800C -#define GL_CMYKA_EXT 0x800D -#define GL_PACK_CMYK_HINT_EXT 0x800E -#define GL_UNPACK_CMYK_HINT_EXT 0x800F -#endif - -#ifndef GL_EXT_texture_object -#define GL_TEXTURE_PRIORITY_EXT 0x8066 -#define GL_TEXTURE_RESIDENT_EXT 0x8067 -#define GL_TEXTURE_1D_BINDING_EXT 0x8068 -#define GL_TEXTURE_2D_BINDING_EXT 0x8069 -#define GL_TEXTURE_3D_BINDING_EXT 0x806A -#endif - -#ifndef GL_SGIS_detail_texture -#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 -#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 -#define GL_LINEAR_DETAIL_SGIS 0x8097 -#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 -#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 -#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A -#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B -#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C -#endif - -#ifndef GL_SGIS_sharpen_texture -#define GL_LINEAR_SHARPEN_SGIS 0x80AD -#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE -#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF -#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 -#endif - -#ifndef GL_EXT_packed_pixels -#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 -#endif - -#ifndef GL_SGIS_texture_lod -#define GL_TEXTURE_MIN_LOD_SGIS 0x813A -#define GL_TEXTURE_MAX_LOD_SGIS 0x813B -#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C -#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D -#endif - -#ifndef GL_SGIS_multisample -#define GL_MULTISAMPLE_SGIS 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F -#define GL_SAMPLE_MASK_SGIS 0x80A0 -#define GL_1PASS_SGIS 0x80A1 -#define GL_2PASS_0_SGIS 0x80A2 -#define GL_2PASS_1_SGIS 0x80A3 -#define GL_4PASS_0_SGIS 0x80A4 -#define GL_4PASS_1_SGIS 0x80A5 -#define GL_4PASS_2_SGIS 0x80A6 -#define GL_4PASS_3_SGIS 0x80A7 -#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 -#define GL_SAMPLES_SGIS 0x80A9 -#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA -#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB -#define GL_SAMPLE_PATTERN_SGIS 0x80AC -#endif - -#ifndef GL_EXT_rescale_normal -#define GL_RESCALE_NORMAL_EXT 0x803A -#endif - -#ifndef GL_EXT_vertex_array -#define GL_VERTEX_ARRAY_EXT 0x8074 -#define GL_NORMAL_ARRAY_EXT 0x8075 -#define GL_COLOR_ARRAY_EXT 0x8076 -#define GL_INDEX_ARRAY_EXT 0x8077 -#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 -#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 -#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A -#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B -#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C -#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D -#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E -#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F -#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 -#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 -#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 -#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 -#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 -#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 -#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 -#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 -#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A -#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B -#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C -#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D -#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E -#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F -#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 -#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 -#endif - -#ifndef GL_EXT_misc_attribute -#endif - -#ifndef GL_SGIS_generate_mipmap -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 -#endif - -#ifndef GL_SGIX_clipmap -#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 -#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 -#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 -#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 -#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 -#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 -#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 -#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 -#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 -#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D -#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E -#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F -#endif - -#ifndef GL_SGIX_shadow -#define GL_TEXTURE_COMPARE_SGIX 0x819A -#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B -#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C -#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D -#endif - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_CLAMP_TO_EDGE_SGIS 0x812F -#endif - -#ifndef GL_SGIS_texture_border_clamp -#define GL_CLAMP_TO_BORDER_SGIS 0x812D -#endif - -#ifndef GL_EXT_blend_minmax -#define GL_FUNC_ADD_EXT 0x8006 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#define GL_BLEND_EQUATION_EXT 0x8009 -#endif - -#ifndef GL_EXT_blend_subtract -#define GL_FUNC_SUBTRACT_EXT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B -#endif - -#ifndef GL_EXT_blend_logic_op -#endif - -#ifndef GL_SGIX_interlace -#define GL_INTERLACE_SGIX 0x8094 -#endif - -#ifndef GL_SGIX_pixel_tiles -#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E -#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F -#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 -#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 -#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 -#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 -#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 -#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 -#endif - -#ifndef GL_SGIS_texture_select -#define GL_DUAL_ALPHA4_SGIS 0x8110 -#define GL_DUAL_ALPHA8_SGIS 0x8111 -#define GL_DUAL_ALPHA12_SGIS 0x8112 -#define GL_DUAL_ALPHA16_SGIS 0x8113 -#define GL_DUAL_LUMINANCE4_SGIS 0x8114 -#define GL_DUAL_LUMINANCE8_SGIS 0x8115 -#define GL_DUAL_LUMINANCE12_SGIS 0x8116 -#define GL_DUAL_LUMINANCE16_SGIS 0x8117 -#define GL_DUAL_INTENSITY4_SGIS 0x8118 -#define GL_DUAL_INTENSITY8_SGIS 0x8119 -#define GL_DUAL_INTENSITY12_SGIS 0x811A -#define GL_DUAL_INTENSITY16_SGIS 0x811B -#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C -#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D -#define GL_QUAD_ALPHA4_SGIS 0x811E -#define GL_QUAD_ALPHA8_SGIS 0x811F -#define GL_QUAD_LUMINANCE4_SGIS 0x8120 -#define GL_QUAD_LUMINANCE8_SGIS 0x8121 -#define GL_QUAD_INTENSITY4_SGIS 0x8122 -#define GL_QUAD_INTENSITY8_SGIS 0x8123 -#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 -#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 -#endif - -#ifndef GL_SGIX_sprite -#define GL_SPRITE_SGIX 0x8148 -#define GL_SPRITE_MODE_SGIX 0x8149 -#define GL_SPRITE_AXIS_SGIX 0x814A -#define GL_SPRITE_TRANSLATION_SGIX 0x814B -#define GL_SPRITE_AXIAL_SGIX 0x814C -#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D -#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E -#endif - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E -#endif - -#ifndef GL_SGIS_point_parameters -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MIN_SGIS 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_SIZE_MAX_SGIS 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 -#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 -#endif - -#ifndef GL_SGIX_instruments -#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 -#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 -#endif - -#ifndef GL_SGIX_texture_scale_bias -#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 -#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A -#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B -#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C -#endif - -#ifndef GL_SGIX_framezoom -#define GL_FRAMEZOOM_SGIX 0x818B -#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C -#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D -#endif - -#ifndef GL_SGIX_tag_sample_buffer -#endif - -#ifndef GL_FfdMaskSGIX -#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 -#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 -#endif - -#ifndef GL_SGIX_polynomial_ffd -#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 -#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 -#define GL_DEFORMATIONS_MASK_SGIX 0x8196 -#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 -#endif - -#ifndef GL_SGIX_reference_plane -#define GL_REFERENCE_PLANE_SGIX 0x817D -#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E -#endif - -#ifndef GL_SGIX_flush_raster -#endif - -#ifndef GL_SGIX_depth_texture -#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 -#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 -#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 -#endif - -#ifndef GL_SGIS_fog_function -#define GL_FOG_FUNC_SGIS 0x812A -#define GL_FOG_FUNC_POINTS_SGIS 0x812B -#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C -#endif - -#ifndef GL_SGIX_fog_offset -#define GL_FOG_OFFSET_SGIX 0x8198 -#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 -#endif - -#ifndef GL_HP_image_transform -#define GL_IMAGE_SCALE_X_HP 0x8155 -#define GL_IMAGE_SCALE_Y_HP 0x8156 -#define GL_IMAGE_TRANSLATE_X_HP 0x8157 -#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 -#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 -#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A -#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B -#define GL_IMAGE_MAG_FILTER_HP 0x815C -#define GL_IMAGE_MIN_FILTER_HP 0x815D -#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E -#define GL_CUBIC_HP 0x815F -#define GL_AVERAGE_HP 0x8160 -#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 -#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 -#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 -#endif - -#ifndef GL_HP_convolution_border_modes -#define GL_IGNORE_BORDER_HP 0x8150 -#define GL_CONSTANT_BORDER_HP 0x8151 -#define GL_REPLICATE_BORDER_HP 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 -#endif - -#ifndef GL_INGR_palette_buffer -#endif - -#ifndef GL_SGIX_texture_add_env -#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE -#endif - -#ifndef GL_EXT_color_subtable -#endif - -#ifndef GL_PGI_vertex_hints -#define GL_VERTEX_DATA_HINT_PGI 0x1A22A -#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B -#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C -#define GL_MAX_VERTEX_HINT_PGI 0x1A22D -#define GL_COLOR3_BIT_PGI 0x00010000 -#define GL_COLOR4_BIT_PGI 0x00020000 -#define GL_EDGEFLAG_BIT_PGI 0x00040000 -#define GL_INDEX_BIT_PGI 0x00080000 -#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 -#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 -#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 -#define GL_MAT_EMISSION_BIT_PGI 0x00800000 -#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 -#define GL_MAT_SHININESS_BIT_PGI 0x02000000 -#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 -#define GL_NORMAL_BIT_PGI 0x08000000 -#define GL_TEXCOORD1_BIT_PGI 0x10000000 -#define GL_TEXCOORD2_BIT_PGI 0x20000000 -#define GL_TEXCOORD3_BIT_PGI 0x40000000 -#define GL_TEXCOORD4_BIT_PGI 0x80000000 -#define GL_VERTEX23_BIT_PGI 0x00000004 -#define GL_VERTEX4_BIT_PGI 0x00000008 -#endif - -#ifndef GL_PGI_misc_hints -#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 -#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD -#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE -#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 -#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 -#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 -#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C -#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D -#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E -#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F -#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 -#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 -#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 -#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 -#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 -#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 -#define GL_CLIP_NEAR_HINT_PGI 0x1A220 -#define GL_CLIP_FAR_HINT_PGI 0x1A221 -#define GL_WIDE_LINE_HINT_PGI 0x1A222 -#define GL_BACK_NORMALS_HINT_PGI 0x1A223 -#endif - -#ifndef GL_EXT_paletted_texture -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -#endif - -#ifndef GL_EXT_clip_volume_hint -#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 -#endif - -#ifndef GL_SGIX_list_priority -#define GL_LIST_PRIORITY_SGIX 0x8182 -#endif - -#ifndef GL_SGIX_ir_instrument1 -#define GL_IR_INSTRUMENT1_SGIX 0x817F -#endif - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 -#endif - -#ifndef GL_SGIX_texture_lod_bias -#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E -#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F -#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 -#endif - -#ifndef GL_SGIX_shadow_ambient -#define GL_SHADOW_AMBIENT_SGIX 0x80BF -#endif - -#ifndef GL_EXT_index_texture -#endif - -#ifndef GL_EXT_index_material -#define GL_INDEX_MATERIAL_EXT 0x81B8 -#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 -#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA -#endif - -#ifndef GL_EXT_index_func -#define GL_INDEX_TEST_EXT 0x81B5 -#define GL_INDEX_TEST_FUNC_EXT 0x81B6 -#define GL_INDEX_TEST_REF_EXT 0x81B7 -#endif - -#ifndef GL_EXT_index_array_formats -#define GL_IUI_V2F_EXT 0x81AD -#define GL_IUI_V3F_EXT 0x81AE -#define GL_IUI_N3F_V2F_EXT 0x81AF -#define GL_IUI_N3F_V3F_EXT 0x81B0 -#define GL_T2F_IUI_V2F_EXT 0x81B1 -#define GL_T2F_IUI_V3F_EXT 0x81B2 -#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 -#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 -#endif - -#ifndef GL_EXT_compiled_vertex_array -#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 -#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 -#endif - -#ifndef GL_EXT_cull_vertex -#define GL_CULL_VERTEX_EXT 0x81AA -#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB -#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC -#endif - -#ifndef GL_SGIX_ycrcb -#define GL_YCRCB_422_SGIX 0x81BB -#define GL_YCRCB_444_SGIX 0x81BC -#endif - -#ifndef GL_SGIX_fragment_lighting -#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 -#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 -#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 -#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 -#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 -#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 -#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 -#define GL_LIGHT_ENV_MODE_SGIX 0x8407 -#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 -#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 -#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A -#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B -#define GL_FRAGMENT_LIGHT0_SGIX 0x840C -#define GL_FRAGMENT_LIGHT1_SGIX 0x840D -#define GL_FRAGMENT_LIGHT2_SGIX 0x840E -#define GL_FRAGMENT_LIGHT3_SGIX 0x840F -#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 -#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 -#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 -#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 -#endif - -#ifndef GL_IBM_rasterpos_clip -#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 -#endif - -#ifndef GL_HP_texture_lighting -#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 -#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 -#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 -#endif - -#ifndef GL_EXT_draw_range_elements -#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 -#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 -#endif - -#ifndef GL_WIN_phong_shading -#define GL_PHONG_WIN 0x80EA -#define GL_PHONG_HINT_WIN 0x80EB -#endif - -#ifndef GL_WIN_specular_fog -#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC -#endif - -#ifndef GL_EXT_light_texture -#define GL_FRAGMENT_MATERIAL_EXT 0x8349 -#define GL_FRAGMENT_NORMAL_EXT 0x834A -#define GL_FRAGMENT_COLOR_EXT 0x834C -#define GL_ATTENUATION_EXT 0x834D -#define GL_SHADOW_ATTENUATION_EXT 0x834E -#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F -#define GL_TEXTURE_LIGHT_EXT 0x8350 -#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 -#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 -/* reuse GL_FRAGMENT_DEPTH_EXT */ -#endif - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_ALPHA_MIN_SGIX 0x8320 -#define GL_ALPHA_MAX_SGIX 0x8321 -#endif - -#ifndef GL_EXT_bgra -#define GL_BGR_EXT 0x80E0 -#define GL_BGRA_EXT 0x80E1 -#endif - -#ifndef GL_SGIX_async -#define GL_ASYNC_MARKER_SGIX 0x8329 -#endif - -#ifndef GL_SGIX_async_pixel -#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C -#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D -#define GL_ASYNC_READ_PIXELS_SGIX 0x835E -#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F -#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 -#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 -#endif - -#ifndef GL_SGIX_async_histogram -#define GL_ASYNC_HISTOGRAM_SGIX 0x832C -#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D -#endif - -#ifndef GL_INTEL_texture_scissor -#endif - -#ifndef GL_INTEL_parallel_arrays -#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 -#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 -#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 -#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 -#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 -#endif - -#ifndef GL_HP_occlusion_test -#define GL_OCCLUSION_TEST_HP 0x8165 -#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 -#endif - -#ifndef GL_EXT_pixel_transform -#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 -#define GL_PIXEL_MAG_FILTER_EXT 0x8331 -#define GL_PIXEL_MIN_FILTER_EXT 0x8332 -#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 -#define GL_CUBIC_EXT 0x8334 -#define GL_AVERAGE_EXT 0x8335 -#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 -#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 -#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 -#endif - -#ifndef GL_EXT_pixel_transform_color_table -#endif - -#ifndef GL_EXT_shared_texture_palette -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB -#endif - -#ifndef GL_EXT_separate_specular_color -#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 -#define GL_SINGLE_COLOR_EXT 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA -#endif - -#ifndef GL_EXT_secondary_color -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E -#endif - -#ifndef GL_EXT_texture_perturb_normal -#define GL_PERTURB_EXT 0x85AE -#define GL_TEXTURE_NORMAL_EXT 0x85AF -#endif - -#ifndef GL_EXT_multi_draw_arrays -#endif - -#ifndef GL_EXT_fog_coord -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 -#endif - -#ifndef GL_REND_screen_coordinates -#define GL_SCREEN_COORDINATES_REND 0x8490 -#define GL_INVERTED_SCREEN_W_REND 0x8491 -#endif - -#ifndef GL_EXT_coordinate_frame -#define GL_TANGENT_ARRAY_EXT 0x8439 -#define GL_BINORMAL_ARRAY_EXT 0x843A -#define GL_CURRENT_TANGENT_EXT 0x843B -#define GL_CURRENT_BINORMAL_EXT 0x843C -#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E -#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F -#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 -#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 -#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 -#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 -#define GL_MAP1_TANGENT_EXT 0x8444 -#define GL_MAP2_TANGENT_EXT 0x8445 -#define GL_MAP1_BINORMAL_EXT 0x8446 -#define GL_MAP2_BINORMAL_EXT 0x8447 -#endif - -#ifndef GL_EXT_texture_env_combine -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE3_RGB_EXT 0x8583 -#define GL_SOURCE4_RGB_EXT 0x8584 -#define GL_SOURCE5_RGB_EXT 0x8585 -#define GL_SOURCE6_RGB_EXT 0x8586 -#define GL_SOURCE7_RGB_EXT 0x8587 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_SOURCE3_ALPHA_EXT 0x858B -#define GL_SOURCE4_ALPHA_EXT 0x858C -#define GL_SOURCE5_ALPHA_EXT 0x858D -#define GL_SOURCE6_ALPHA_EXT 0x858E -#define GL_SOURCE7_ALPHA_EXT 0x858F -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND3_RGB_EXT 0x8593 -#define GL_OPERAND4_RGB_EXT 0x8594 -#define GL_OPERAND5_RGB_EXT 0x8595 -#define GL_OPERAND6_RGB_EXT 0x8596 -#define GL_OPERAND7_RGB_EXT 0x8597 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A -#define GL_OPERAND3_ALPHA_EXT 0x859B -#define GL_OPERAND4_ALPHA_EXT 0x859C -#define GL_OPERAND5_ALPHA_EXT 0x859D -#define GL_OPERAND6_ALPHA_EXT 0x859E -#define GL_OPERAND7_ALPHA_EXT 0x859F -#endif - -#ifndef GL_APPLE_specular_vector -#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 -#endif - -#ifndef GL_APPLE_transform_hint -#define GL_TRANSFORM_HINT_APPLE 0x85B1 -#endif - -#ifndef GL_SGIX_fog_scale -#define GL_FOG_SCALE_SGIX 0x81FC -#define GL_FOG_SCALE_VALUE_SGIX 0x81FD -#endif - -#ifndef GL_SUNX_constant_data -#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 -#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 -#endif - -#ifndef GL_SUN_global_alpha -#define GL_GLOBAL_ALPHA_SUN 0x81D9 -#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA -#endif - -#ifndef GL_SUN_triangle_list -#define GL_RESTART_SUN 0x01 -#define GL_REPLACE_MIDDLE_SUN 0x02 -#define GL_REPLACE_OLDEST_SUN 0x03 -#define GL_TRIANGLE_LIST_SUN 0x81D7 -#define GL_REPLACEMENT_CODE_SUN 0x81D8 -#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 -#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 -#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 -#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 -#define GL_R1UI_V3F_SUN 0x85C4 -#define GL_R1UI_C4UB_V3F_SUN 0x85C5 -#define GL_R1UI_C3F_V3F_SUN 0x85C6 -#define GL_R1UI_N3F_V3F_SUN 0x85C7 -#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 -#define GL_R1UI_T2F_V3F_SUN 0x85C9 -#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA -#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB -#endif - -#ifndef GL_SUN_vertex -#endif - -#ifndef GL_EXT_blend_func_separate -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB -#endif - -#ifndef GL_INGR_color_clamp -#define GL_RED_MIN_CLAMP_INGR 0x8560 -#define GL_GREEN_MIN_CLAMP_INGR 0x8561 -#define GL_BLUE_MIN_CLAMP_INGR 0x8562 -#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 -#define GL_RED_MAX_CLAMP_INGR 0x8564 -#define GL_GREEN_MAX_CLAMP_INGR 0x8565 -#define GL_BLUE_MAX_CLAMP_INGR 0x8566 -#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 -#endif - -#ifndef GL_INGR_interlace_read -#define GL_INTERLACE_READ_INGR 0x8568 -#endif - -#ifndef GL_EXT_stencil_wrap -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 -#endif - -#ifndef GL_EXT_422_pixels -#define GL_422_EXT 0x80CC -#define GL_422_REV_EXT 0x80CD -#define GL_422_AVERAGE_EXT 0x80CE -#define GL_422_REV_AVERAGE_EXT 0x80CF -#endif - -#ifndef GL_NV_texgen_reflection -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 -#endif - -#ifndef GL_EXT_texture_cube_map -#define GL_NORMAL_MAP_EXT 0x8511 -#define GL_REFLECTION_MAP_EXT 0x8512 -#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C -#endif - -#ifndef GL_SUN_convolution_border_modes -#define GL_WRAP_BORDER_SUN 0x81D4 -#endif - -#ifndef GL_EXT_texture_env_add -#endif - -#ifndef GL_EXT_texture_lod_bias -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 -#endif - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#endif - -#ifndef GL_EXT_vertex_weighting -#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH -#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 -#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX -#define GL_MODELVIEW_MATRIX1_EXT 0x8506 -#define GL_VERTEX_WEIGHTING_EXT 0x8509 -#define GL_MODELVIEW0_EXT GL_MODELVIEW -#define GL_MODELVIEW1_EXT 0x850A -#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B -#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C -#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D -#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E -#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F -#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 -#endif - -#ifndef GL_NV_light_max_exponent -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 -#endif - -#ifndef GL_NV_vertex_array_range -#define GL_VERTEX_ARRAY_RANGE_NV 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E -#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 -#endif - -#ifndef GL_NV_register_combiners -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 -/* reuse GL_TEXTURE0_ARB */ -/* reuse GL_TEXTURE1_ARB */ -/* reuse GL_ZERO */ -/* reuse GL_NONE */ -/* reuse GL_FOG */ -#endif - -#ifndef GL_NV_fog_distance -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C -/* reuse GL_EYE_PLANE */ -#endif - -#ifndef GL_NV_texgen_emboss -#define GL_EMBOSS_LIGHT_NV 0x855D -#define GL_EMBOSS_CONSTANT_NV 0x855E -#define GL_EMBOSS_MAP_NV 0x855F -#endif - -#ifndef GL_NV_blend_square -#endif - -#ifndef GL_NV_texture_env_combine4 -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B -#endif - -#ifndef GL_MESA_resize_buffers -#endif - -#ifndef GL_MESA_window_pos +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); #endif +#endif /* GL_EXT_draw_range_elements */ -#ifndef GL_EXT_texture_compression_s3tc -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogCoordfEXT (GLfloat coord); +GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *coord); +GLAPI void APIENTRY glFogCoorddEXT (GLdouble coord); +GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *coord); +GLAPI void APIENTRY glFogCoordPointerEXT (GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_fog_coord */ + +#ifndef GL_EXT_framebuffer_blit +#define GL_EXT_framebuffer_blit 1 +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA +typedef void (APIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); #endif +#endif /* GL_EXT_framebuffer_blit */ -#ifndef GL_IBM_cull_vertex -#define GL_CULL_VERTEX_IBM 103050 +#ifndef GL_EXT_framebuffer_multisample +#define GL_EXT_framebuffer_multisample 1 +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_EXT_framebuffer_multisample */ + +#ifndef GL_EXT_framebuffer_multisample_blit_scaled +#define GL_EXT_framebuffer_multisample_blit_scaled 1 +#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA +#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB +#endif /* GL_EXT_framebuffer_multisample_blit_scaled */ + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint renderbuffer); +GLAPI void APIENTRY glBindRenderbufferEXT (GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers); +GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint framebuffer); +GLAPI void APIENTRY glBindFramebufferEXT (GLenum target, GLuint framebuffer); +GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers); +GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei n, GLuint *framebuffers); +GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum target); +GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateMipmapEXT (GLenum target); +#endif +#endif /* GL_EXT_framebuffer_object */ + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_EXT_framebuffer_sRGB 1 +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA +#endif /* GL_EXT_framebuffer_sRGB */ + +#ifndef GL_EXT_geometry_shader4 +#define GL_EXT_geometry_shader4 1 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_LINES_ADJACENCY_EXT 0x000A +#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B +#define GL_TRIANGLES_ADJACENCY_EXT 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); #endif +#endif /* GL_EXT_geometry_shader4 */ -#ifndef GL_IBM_multimode_draw_arrays -#endif +#ifndef GL_EXT_gpu_program_parameters +#define GL_EXT_gpu_program_parameters 1 +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +#endif +#endif /* GL_EXT_gpu_program_parameters */ + +#ifndef GL_EXT_gpu_shader4 +#define GL_EXT_gpu_shader4 1 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT 0x8905 +typedef void (APIENTRYP PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetUniformuivEXT (GLuint program, GLint location, GLuint *params); +GLAPI void APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataLocationEXT (GLuint program, const GLchar *name); +GLAPI void APIENTRY glUniform1uiEXT (GLint location, GLuint v0); +GLAPI void APIENTRY glUniform2uiEXT (GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value); +#endif +#endif /* GL_EXT_gpu_shader4 */ -#ifndef GL_IBM_vertex_array_lists -#define GL_VERTEX_ARRAY_LIST_IBM 103070 -#define GL_NORMAL_ARRAY_LIST_IBM 103071 -#define GL_COLOR_ARRAY_LIST_IBM 103072 -#define GL_INDEX_ARRAY_LIST_IBM 103073 -#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 -#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 -#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 -#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 -#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 -#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 -#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 -#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 -#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 -#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 -#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 -#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 -#endif +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 +#define GL_TABLE_TOO_LARGE_EXT 0x8031 +typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glResetHistogramEXT (GLenum target); +GLAPI void APIENTRY glResetMinmaxEXT (GLenum target); +#endif +#endif /* GL_EXT_histogram */ -#ifndef GL_SGIX_subsample -#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 -#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 -#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 -#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 -#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 -#endif +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 +#define GL_IUI_V2F_EXT 0x81AD +#define GL_IUI_V3F_EXT 0x81AE +#define GL_IUI_N3F_V2F_EXT 0x81AF +#define GL_IUI_N3F_V3F_EXT 0x81B0 +#define GL_T2F_IUI_V2F_EXT 0x81B1 +#define GL_T2F_IUI_V3F_EXT 0x81B2 +#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 +#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 +#endif /* GL_EXT_index_array_formats */ -#ifndef GL_SGIX_ycrcb_subsample +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 +#define GL_INDEX_TEST_EXT 0x81B5 +#define GL_INDEX_TEST_FUNC_EXT 0x81B6 +#define GL_INDEX_TEST_REF_EXT 0x81B7 +typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexFuncEXT (GLenum func, GLclampf ref); #endif +#endif /* GL_EXT_index_func */ -#ifndef GL_SGIX_ycrcba -#define GL_YCRCB_SGIX 0x8318 -#define GL_YCRCBA_SGIX 0x8319 +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 +#define GL_INDEX_MATERIAL_EXT 0x81B8 +#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 +#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA +typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexMaterialEXT (GLenum face, GLenum mode); #endif +#endif /* GL_EXT_index_material */ -#ifndef GL_SGI_depth_pass_instrument -#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 -#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 -#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 -#endif +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 +#endif /* GL_EXT_index_texture */ -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 -#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glApplyTextureEXT (GLenum mode); +GLAPI void APIENTRY glTextureLightEXT (GLenum pname); +GLAPI void APIENTRY glTextureMaterialEXT (GLenum face, GLenum mode); #endif +#endif /* GL_EXT_light_texture */ -#ifndef GL_3DFX_multisample -#define GL_MULTISAMPLE_3DFX 0x86B2 -#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 -#define GL_SAMPLES_3DFX 0x86B4 -#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 -#endif +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 +#endif /* GL_EXT_misc_attribute */ -#ifndef GL_3DFX_tbuffer +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); #endif +#endif /* GL_EXT_multi_draw_arrays */ #ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 #define GL_MULTISAMPLE_EXT 0x809D #define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E #define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F @@ -1459,1576 +7378,4393 @@ extern "C" { #define GL_SAMPLE_MASK_VALUE_EXT 0x80AA #define GL_SAMPLE_MASK_INVERT_EXT 0x80AB #define GL_SAMPLE_PATTERN_EXT 0x80AC -#endif - -#ifndef GL_SGIX_vertex_preclip -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF -#endif - -#ifndef GL_SGIX_convolution_accuracy -#define GL_CONVOLUTION_HINT_SGIX 0x8316 -#endif - -#ifndef GL_SGIX_resample -#define GL_PACK_RESAMPLE_SGIX 0x842C -#define GL_UNPACK_RESAMPLE_SGIX 0x842D -#define GL_RESAMPLE_REPLICATE_SGIX 0x842E -#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F -#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 -#endif - -#ifndef GL_SGIS_point_line_texgen -#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 -#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 -#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 -#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 -#define GL_EYE_POINT_SGIS 0x81F4 -#define GL_OBJECT_POINT_SGIS 0x81F5 -#define GL_EYE_LINE_SGIS 0x81F6 -#define GL_OBJECT_LINE_SGIS 0x81F7 -#endif - -#ifndef GL_SGIS_texture_color_mask -#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF -#endif - - -/*************************************************************/ - -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glBlendColor (GLclampf, GLclampf, GLclampf, GLclampf); -extern void APIENTRY glBlendEquation (GLenum); -extern void APIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); -extern void APIENTRY glColorTable (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glColorTableParameterfv (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glColorTableParameteriv (GLenum, GLenum, const GLint *); -extern void APIENTRY glCopyColorTable (GLenum, GLenum, GLint, GLint, GLsizei); -extern void APIENTRY glGetColorTable (GLenum, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetColorTableParameterfv (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetColorTableParameteriv (GLenum, GLenum, GLint *); -extern void APIENTRY glColorSubTable (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glCopyColorSubTable (GLenum, GLsizei, GLint, GLint, GLsizei); -extern void APIENTRY glConvolutionFilter1D (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glConvolutionFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glConvolutionParameterf (GLenum, GLenum, GLfloat); -extern void APIENTRY glConvolutionParameterfv (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glConvolutionParameteri (GLenum, GLenum, GLint); -extern void APIENTRY glConvolutionParameteriv (GLenum, GLenum, const GLint *); -extern void APIENTRY glCopyConvolutionFilter1D (GLenum, GLenum, GLint, GLint, GLsizei); -extern void APIENTRY glCopyConvolutionFilter2D (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); -extern void APIENTRY glGetConvolutionFilter (GLenum, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetConvolutionParameterfv (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetConvolutionParameteriv (GLenum, GLenum, GLint *); -extern void APIENTRY glGetSeparableFilter (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); -extern void APIENTRY glSeparableFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); -extern void APIENTRY glGetHistogram (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetHistogramParameterfv (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetHistogramParameteriv (GLenum, GLenum, GLint *); -extern void APIENTRY glGetMinmax (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetMinmaxParameterfv (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetMinmaxParameteriv (GLenum, GLenum, GLint *); -extern void APIENTRY glHistogram (GLenum, GLsizei, GLenum, GLboolean); -extern void APIENTRY glMinmax (GLenum, GLenum, GLboolean); -extern void APIENTRY glResetHistogram (GLenum); -extern void APIENTRY glResetMinmax (GLenum); -extern void APIENTRY glTexImage3D (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glCopyTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -typedef void (APIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); -typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -typedef void (APIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (APIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); -typedef void (APIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); -typedef void (APIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_ARB_multitexture -#define GL_ARB_multitexture 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glActiveTextureARB (GLenum); -extern void APIENTRY glClientActiveTextureARB (GLenum); -extern void APIENTRY glMultiTexCoord1dARB (GLenum, GLdouble); -extern void APIENTRY glMultiTexCoord1dvARB (GLenum, const GLdouble *); -extern void APIENTRY glMultiTexCoord1fARB (GLenum, GLfloat); -extern void APIENTRY glMultiTexCoord1fvARB (GLenum, const GLfloat *); -extern void APIENTRY glMultiTexCoord1iARB (GLenum, GLint); -extern void APIENTRY glMultiTexCoord1ivARB (GLenum, const GLint *); -extern void APIENTRY glMultiTexCoord1sARB (GLenum, GLshort); -extern void APIENTRY glMultiTexCoord1svARB (GLenum, const GLshort *); -extern void APIENTRY glMultiTexCoord2dARB (GLenum, GLdouble, GLdouble); -extern void APIENTRY glMultiTexCoord2dvARB (GLenum, const GLdouble *); -extern void APIENTRY glMultiTexCoord2fARB (GLenum, GLfloat, GLfloat); -extern void APIENTRY glMultiTexCoord2fvARB (GLenum, const GLfloat *); -extern void APIENTRY glMultiTexCoord2iARB (GLenum, GLint, GLint); -extern void APIENTRY glMultiTexCoord2ivARB (GLenum, const GLint *); -extern void APIENTRY glMultiTexCoord2sARB (GLenum, GLshort, GLshort); -extern void APIENTRY glMultiTexCoord2svARB (GLenum, const GLshort *); -extern void APIENTRY glMultiTexCoord3dARB (GLenum, GLdouble, GLdouble, GLdouble); -extern void APIENTRY glMultiTexCoord3dvARB (GLenum, const GLdouble *); -extern void APIENTRY glMultiTexCoord3fARB (GLenum, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glMultiTexCoord3fvARB (GLenum, const GLfloat *); -extern void APIENTRY glMultiTexCoord3iARB (GLenum, GLint, GLint, GLint); -extern void APIENTRY glMultiTexCoord3ivARB (GLenum, const GLint *); -extern void APIENTRY glMultiTexCoord3sARB (GLenum, GLshort, GLshort, GLshort); -extern void APIENTRY glMultiTexCoord3svARB (GLenum, const GLshort *); -extern void APIENTRY glMultiTexCoord4dARB (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -extern void APIENTRY glMultiTexCoord4dvARB (GLenum, const GLdouble *); -extern void APIENTRY glMultiTexCoord4fARB (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glMultiTexCoord4fvARB (GLenum, const GLfloat *); -extern void APIENTRY glMultiTexCoord4iARB (GLenum, GLint, GLint, GLint, GLint); -extern void APIENTRY glMultiTexCoord4ivARB (GLenum, const GLint *); -extern void APIENTRY glMultiTexCoord4sARB (GLenum, GLshort, GLshort, GLshort, GLshort); -extern void APIENTRY glMultiTexCoord4svARB (GLenum, const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); -#endif - -#ifndef GL_ARB_transpose_matrix -#define GL_ARB_transpose_matrix 1 +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 +typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *); -extern void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *); -extern void APIENTRY glMultTransposeMatrixfARB (const GLfloat *); -extern void APIENTRY glMultTransposeMatrixdARB (const GLdouble *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -typedef void (APIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -#endif +GLAPI void APIENTRY glSampleMaskEXT (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glSamplePatternEXT (GLenum pattern); +#endif +#endif /* GL_EXT_multisample */ + +#ifndef GL_EXT_packed_depth_stencil +#define GL_EXT_packed_depth_stencil 1 +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 +#endif /* GL_EXT_packed_depth_stencil */ + +#ifndef GL_EXT_packed_float +#define GL_EXT_packed_float 1 +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C +#endif /* GL_EXT_packed_float */ -#ifndef GL_ARB_multisample -#define GL_ARB_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSampleCoverageARB (GLclampf, GLboolean); -extern void APIENTRY glSamplePassARB (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRY * PFNGLSAMPLEPASSARBPROC) (GLenum pass); -#endif +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 +#endif /* GL_EXT_packed_pixels */ -#ifndef GL_ARB_texture_env_add -#define GL_ARB_texture_env_add 1 +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glGetColorTableEXT (GLenum target, GLenum format, GLenum type, void *data); +GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); #endif +#endif /* GL_EXT_paletted_texture */ -#ifndef GL_ARB_texture_cube_map -#define GL_ARB_texture_cube_map 1 -#endif +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF +#endif /* GL_EXT_pixel_buffer_object */ -#ifndef GL_ARB_texture_compression -#define GL_ARB_texture_compression 1 +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -extern void APIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -extern void APIENTRY glCompressedTexImage1DARB (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); -extern void APIENTRY glCompressedTexSubImage3DARB (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -extern void APIENTRY glCompressedTexSubImage2DARB (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -extern void APIENTRY glCompressedTexSubImage1DARB (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); -extern void APIENTRY glGetCompressedTexImageARB (GLenum, GLint, void *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *img); +GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetPixelTransformParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetPixelTransformParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); #endif +#endif /* GL_EXT_pixel_transform */ -#ifndef GL_EXT_abgr -#define GL_EXT_abgr 1 -#endif +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 +#endif /* GL_EXT_pixel_transform_color_table */ -#ifndef GL_EXT_blend_color -#define GL_EXT_blend_color 1 +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glBlendColorEXT (GLclampf, GLclampf, GLclampf, GLclampf); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GLAPI void APIENTRY glPointParameterfEXT (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvEXT (GLenum pname, const GLfloat *params); #endif +#endif /* GL_EXT_point_parameters */ #ifndef GL_EXT_polygon_offset #define GL_EXT_polygon_offset 1 +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glPolygonOffsetEXT (GLfloat, GLfloat); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); -#endif - -#ifndef GL_EXT_texture -#define GL_EXT_texture 1 -#endif - -#ifndef GL_EXT_texture3D -#define GL_EXT_texture3D 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTexImage3DEXT (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat factor, GLfloat bias); #endif +#endif /* GL_EXT_polygon_offset */ -#ifndef GL_SGIS_texture_filter4 -#define GL_SGIS_texture_filter4 1 +#ifndef GL_EXT_polygon_offset_clamp +#define GL_EXT_polygon_offset_clamp 1 +#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B +typedef void (APIENTRYP PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glGetTexFilterFuncSGIS (GLenum, GLenum, GLfloat *); -extern void APIENTRY glTexFilterFuncSGIS (GLenum, GLenum, GLsizei, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); -typedef void (APIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); +GLAPI void APIENTRY glPolygonOffsetClampEXT (GLfloat factor, GLfloat units, GLfloat clamp); #endif +#endif /* GL_EXT_polygon_offset_clamp */ -#ifndef GL_EXT_subtexture -#define GL_EXT_subtexture 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTexSubImage1DEXT (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -#endif +#ifndef GL_EXT_post_depth_coverage +#define GL_EXT_post_depth_coverage 1 +#endif /* GL_EXT_post_depth_coverage */ -#ifndef GL_EXT_copy_texture -#define GL_EXT_copy_texture 1 +#ifndef GL_EXT_provoking_vertex +#define GL_EXT_provoking_vertex 1 +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_PROVOKING_VERTEX_EXT 0x8E4F +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glCopyTexImage1DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); -extern void APIENTRY glCopyTexImage2DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); -extern void APIENTRY glCopyTexSubImage1DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei); -extern void APIENTRY glCopyTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -extern void APIENTRY glCopyTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_EXT_histogram -#define GL_EXT_histogram 1 +GLAPI void APIENTRY glProvokingVertexEXT (GLenum mode); +#endif +#endif /* GL_EXT_provoking_vertex */ + +#ifndef GL_EXT_raster_multisample +#define GL_EXT_raster_multisample 1 +#define GL_RASTER_MULTISAMPLE_EXT 0x9327 +#define GL_RASTER_SAMPLES_EXT 0x9328 +#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 +#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A +#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B +#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C +typedef void (APIENTRYP PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glGetHistogramEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetHistogramParameterfvEXT (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetHistogramParameterivEXT (GLenum, GLenum, GLint *); -extern void APIENTRY glGetMinmaxEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetMinmaxParameterfvEXT (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetMinmaxParameterivEXT (GLenum, GLenum, GLint *); -extern void APIENTRY glHistogramEXT (GLenum, GLsizei, GLenum, GLboolean); -extern void APIENTRY glMinmaxEXT (GLenum, GLenum, GLboolean); -extern void APIENTRY glResetHistogramEXT (GLenum); -extern void APIENTRY glResetMinmaxEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); -typedef void (APIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); +GLAPI void APIENTRY glRasterSamplesEXT (GLuint samples, GLboolean fixedsamplelocations); #endif +#endif /* GL_EXT_raster_multisample */ -#ifndef GL_EXT_convolution -#define GL_EXT_convolution 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glConvolutionFilter1DEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glConvolutionFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glConvolutionParameterfEXT (GLenum, GLenum, GLfloat); -extern void APIENTRY glConvolutionParameterfvEXT (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glConvolutionParameteriEXT (GLenum, GLenum, GLint); -extern void APIENTRY glConvolutionParameterivEXT (GLenum, GLenum, const GLint *); -extern void APIENTRY glCopyConvolutionFilter1DEXT (GLenum, GLenum, GLint, GLint, GLsizei); -extern void APIENTRY glCopyConvolutionFilter2DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); -extern void APIENTRY glGetConvolutionFilterEXT (GLenum, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetConvolutionParameterfvEXT (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetConvolutionParameterivEXT (GLenum, GLenum, GLint *); -extern void APIENTRY glGetSeparableFilterEXT (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); -extern void APIENTRY glSeparableFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (APIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -#endif - -#ifndef GL_EXT_color_matrix -#define GL_EXT_color_matrix 1 -#endif +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 +#define GL_RESCALE_NORMAL_EXT 0x803A +#endif /* GL_EXT_rescale_normal */ -#ifndef GL_SGI_color_table -#define GL_SGI_color_table 1 +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glColorTableSGI (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glColorTableParameterfvSGI (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glColorTableParameterivSGI (GLenum, GLenum, const GLint *); -extern void APIENTRY glCopyColorTableSGI (GLenum, GLenum, GLint, GLint, GLsizei); -extern void APIENTRY glGetColorTableSGI (GLenum, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetColorTableParameterfvSGI (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetColorTableParameterivSGI (GLenum, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); -#endif - -#ifndef GL_SGIX_pixel_texture -#define GL_SGIX_pixel_texture 1 +GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glSecondaryColor3iEXT (GLint red, GLint green, GLint blue); +GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *v); +GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue); +GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *v); +GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *v); +GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue); +GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *v); +GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue); +GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *v); +GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_secondary_color */ + +#ifndef GL_EXT_separate_shader_objects +#define GL_EXT_separate_shader_objects 1 +#define GL_ACTIVE_PROGRAM_EXT 0x8B8D +typedef void (APIENTRYP PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); +typedef void (APIENTRYP PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar *string); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glPixelTexGenSGIX (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); +GLAPI void APIENTRY glUseShaderProgramEXT (GLenum type, GLuint program); +GLAPI void APIENTRY glActiveProgramEXT (GLuint program); +GLAPI GLuint APIENTRY glCreateShaderProgramEXT (GLenum type, const GLchar *string); #endif +#endif /* GL_EXT_separate_shader_objects */ -#ifndef GL_SGIS_pixel_texture -#define GL_SGIS_pixel_texture 1 +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA +#endif /* GL_EXT_separate_specular_color */ + +#ifndef GL_EXT_shader_image_load_formatted +#define GL_EXT_shader_image_load_formatted 1 +#endif /* GL_EXT_shader_image_load_formatted */ + +#ifndef GL_EXT_shader_image_load_store +#define GL_EXT_shader_image_load_store 1 +#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 +#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A +#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B +#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C +#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D +#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E +#define GL_IMAGE_1D_EXT 0x904C +#define GL_IMAGE_2D_EXT 0x904D +#define GL_IMAGE_3D_EXT 0x904E +#define GL_IMAGE_2D_RECT_EXT 0x904F +#define GL_IMAGE_CUBE_EXT 0x9050 +#define GL_IMAGE_BUFFER_EXT 0x9051 +#define GL_IMAGE_1D_ARRAY_EXT 0x9052 +#define GL_IMAGE_2D_ARRAY_EXT 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 +#define GL_INT_IMAGE_1D_EXT 0x9057 +#define GL_INT_IMAGE_2D_EXT 0x9058 +#define GL_INT_IMAGE_3D_EXT 0x9059 +#define GL_INT_IMAGE_2D_RECT_EXT 0x905A +#define GL_INT_IMAGE_CUBE_EXT 0x905B +#define GL_INT_IMAGE_BUFFER_EXT 0x905C +#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D +#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C +#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D +#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 +#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 +#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF +typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +typedef void (APIENTRYP PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glPixelTexGenParameteriSGIS (GLenum, GLint); -extern void APIENTRY glPixelTexGenParameterivSGIS (GLenum, const GLint *); -extern void APIENTRY glPixelTexGenParameterfSGIS (GLenum, GLfloat); -extern void APIENTRY glPixelTexGenParameterfvSGIS (GLenum, const GLfloat *); -extern void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum, GLint *); -extern void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); +GLAPI void APIENTRY glBindImageTextureEXT (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +GLAPI void APIENTRY glMemoryBarrierEXT (GLbitfield barriers); #endif +#endif /* GL_EXT_shader_image_load_store */ -#ifndef GL_SGIS_texture4D -#define GL_SGIS_texture4D 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTexImage4DSGIS (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glTexSubImage4DSGIS (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); -#endif +#ifndef GL_EXT_shader_integer_mix +#define GL_EXT_shader_integer_mix 1 +#endif /* GL_EXT_shader_integer_mix */ -#ifndef GL_SGI_texture_color_table -#define GL_SGI_texture_color_table 1 -#endif +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 +#endif /* GL_EXT_shadow_funcs */ -#ifndef GL_EXT_cmyka -#define GL_EXT_cmyka 1 -#endif +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB +#endif /* GL_EXT_shared_texture_palette */ -#ifndef GL_EXT_texture_object -#define GL_EXT_texture_object 1 -#ifdef GL_GLEXT_PROTOTYPES -extern GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei, const GLuint *, GLboolean *); -extern void APIENTRY glBindTextureEXT (GLenum, GLuint); -extern void APIENTRY glDeleteTexturesEXT (GLsizei, const GLuint *); -extern void APIENTRY glGenTexturesEXT (GLsizei, GLuint *); -extern GLboolean APIENTRY glIsTextureEXT (GLuint); -extern void APIENTRY glPrioritizeTexturesEXT (GLsizei, const GLuint *, const GLclampf *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); -typedef void (APIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); -typedef void (APIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); -typedef void (APIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); -typedef GLboolean (APIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); -typedef void (APIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); -#endif +#ifndef GL_EXT_sparse_texture2 +#define GL_EXT_sparse_texture2 1 +#endif /* GL_EXT_sparse_texture2 */ -#ifndef GL_SGIS_detail_texture -#define GL_SGIS_detail_texture 1 +#ifndef GL_EXT_stencil_clear_tag +#define GL_EXT_stencil_clear_tag 1 +#define GL_STENCIL_TAG_BITS_EXT 0x88F2 +#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 +typedef void (APIENTRYP PFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glDetailTexFuncSGIS (GLenum, GLsizei, const GLfloat *); -extern void APIENTRY glGetDetailTexFuncSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +GLAPI void APIENTRY glStencilClearTagEXT (GLsizei stencilTagBits, GLuint stencilClearTag); #endif +#endif /* GL_EXT_stencil_clear_tag */ -#ifndef GL_SGIS_sharpen_texture -#define GL_SGIS_sharpen_texture 1 +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSharpenTexFuncSGIS (GLenum, GLsizei, const GLfloat *); -extern void APIENTRY glGetSharpenTexFuncSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#endif - -#ifndef GL_EXT_packed_pixels -#define GL_EXT_packed_pixels 1 +GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum face); #endif +#endif /* GL_EXT_stencil_two_side */ -#ifndef GL_SGIS_texture_lod -#define GL_SGIS_texture_lod 1 -#endif +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 +#endif /* GL_EXT_stencil_wrap */ -#ifndef GL_SGIS_multisample -#define GL_SGIS_multisample 1 +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 +typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSampleMaskSGIS (GLclampf, GLboolean); -extern void APIENTRY glSamplePatternSGIS (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); +GLAPI void APIENTRY glTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); #endif +#endif /* GL_EXT_subtexture */ -#ifndef GL_EXT_rescale_normal -#define GL_EXT_rescale_normal 1 -#endif +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 +#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#endif /* GL_EXT_texture */ -#ifndef GL_EXT_vertex_array -#define GL_EXT_vertex_array 1 +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glArrayElementEXT (GLint); -extern void APIENTRY glColorPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -extern void APIENTRY glDrawArraysEXT (GLenum, GLint, GLsizei); -extern void APIENTRY glEdgeFlagPointerEXT (GLsizei, GLsizei, const GLboolean *); -extern void APIENTRY glGetPointervEXT (GLenum, GLvoid* *); -extern void APIENTRY glIndexPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); -extern void APIENTRY glNormalPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); -extern void APIENTRY glTexCoordPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -extern void APIENTRY glVertexPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); -typedef void (APIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); -typedef void (APIENTRY * PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); -typedef void (APIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_misc_attribute -#define GL_EXT_misc_attribute 1 -#endif +GLAPI void APIENTRY glTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +#endif +#endif /* GL_EXT_texture3D */ + +#ifndef GL_EXT_texture_array +#define GL_EXT_texture_array 1 +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +#endif +#endif /* GL_EXT_texture_array */ + +#ifndef GL_EXT_texture_buffer_object +#define GL_EXT_texture_buffer_object 1 +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E +typedef void (APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); +#endif +#endif /* GL_EXT_texture_buffer_object */ + +#ifndef GL_EXT_texture_compression_latc +#define GL_EXT_texture_compression_latc 1 +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 +#endif /* GL_EXT_texture_compression_latc */ + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE +#endif /* GL_EXT_texture_compression_rgtc */ -#ifndef GL_SGIS_generate_mipmap -#define GL_SGIS_generate_mipmap 1 -#endif +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif /* GL_EXT_texture_compression_s3tc */ -#ifndef GL_SGIX_clipmap -#define GL_SGIX_clipmap 1 -#endif +#ifndef GL_EXT_texture_cube_map +#define GL_EXT_texture_cube_map 1 +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C +#endif /* GL_EXT_texture_cube_map */ -#ifndef GL_SGIX_shadow -#define GL_SGIX_shadow 1 -#endif +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 +#endif /* GL_EXT_texture_env_add */ -#ifndef GL_SGIS_texture_edge_clamp -#define GL_SGIS_texture_edge_clamp 1 -#endif +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A +#endif /* GL_EXT_texture_env_combine */ -#ifndef GL_SGIS_texture_border_clamp -#define GL_SGIS_texture_border_clamp 1 -#endif +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 +#endif /* GL_EXT_texture_env_dot3 */ -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif /* GL_EXT_texture_filter_anisotropic */ + +#ifndef GL_EXT_texture_filter_minmax +#define GL_EXT_texture_filter_minmax 1 +#endif /* GL_EXT_texture_filter_minmax */ + +#ifndef GL_EXT_texture_integer +#define GL_EXT_texture_integer 1 +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGB8UI_EXT 0x8D7D +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGB32I_EXT 0x8D83 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGB16I_EXT 0x8D89 +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGB8I_EXT 0x8D8F +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E +typedef void (APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); +typedef void (APIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glBlendEquationEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_blend_subtract -#define GL_EXT_blend_subtract 1 -#endif - -#ifndef GL_EXT_blend_logic_op -#define GL_EXT_blend_logic_op 1 -#endif - -#ifndef GL_SGIX_interlace -#define GL_SGIX_interlace 1 +GLAPI void APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha); +GLAPI void APIENTRY glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha); #endif +#endif /* GL_EXT_texture_integer */ -#ifndef GL_SGIX_pixel_tiles -#define GL_SGIX_pixel_tiles 1 -#endif +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif /* GL_EXT_texture_lod_bias */ -#ifndef GL_SGIX_texture_select -#define GL_SGIX_texture_select 1 -#endif +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 +#endif /* GL_EXT_texture_mirror_clamp */ -#ifndef GL_SGIX_sprite -#define GL_SGIX_sprite 1 +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A +typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); +typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSpriteParameterfSGIX (GLenum, GLfloat); -extern void APIENTRY glSpriteParameterfvSGIX (GLenum, const GLfloat *); -extern void APIENTRY glSpriteParameteriSGIX (GLenum, GLint); -extern void APIENTRY glSpriteParameterivSGIX (GLenum, const GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); +GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei n, const GLuint *textures, GLboolean *residences); +GLAPI void APIENTRY glBindTextureEXT (GLenum target, GLuint texture); +GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei n, const GLuint *textures); +GLAPI void APIENTRY glGenTexturesEXT (GLsizei n, GLuint *textures); +GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint texture); +GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei n, const GLuint *textures, const GLclampf *priorities); #endif +#endif /* GL_EXT_texture_object */ -#ifndef GL_SGIX_texture_multi_buffer -#define GL_SGIX_texture_multi_buffer 1 -#endif - -#ifndef GL_EXT_point_parameters -#define GL_EXT_point_parameters 1 +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF +typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glPointParameterfEXT (GLenum, GLfloat); -extern void APIENTRY glPointParameterfvEXT (GLenum, const GLfloat *); -extern void APIENTRY glPointParameterfSGIS (GLenum, GLfloat); -extern void APIENTRY glPointParameterfvSGIS (GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_SGIX_instruments -#define GL_SGIX_instruments 1 +GLAPI void APIENTRY glTextureNormalEXT (GLenum mode); +#endif +#endif /* GL_EXT_texture_perturb_normal */ + +#ifndef GL_EXT_texture_sRGB +#define GL_EXT_texture_sRGB 1 +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB8_EXT 0x8C41 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 +#define GL_SLUMINANCE_EXT 0x8C46 +#define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_COMPRESSED_SRGB_EXT 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F +#endif /* GL_EXT_texture_sRGB */ + +#ifndef GL_EXT_texture_sRGB_decode +#define GL_EXT_texture_sRGB_decode 1 +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#define GL_DECODE_EXT 0x8A49 +#define GL_SKIP_DECODE_EXT 0x8A4A +#endif /* GL_EXT_texture_sRGB_decode */ + +#ifndef GL_EXT_texture_shared_exponent +#define GL_EXT_texture_shared_exponent 1 +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F +#endif /* GL_EXT_texture_shared_exponent */ + +#ifndef GL_EXT_texture_snorm +#define GL_EXT_texture_snorm 1 +#define GL_ALPHA_SNORM 0x9010 +#define GL_LUMINANCE_SNORM 0x9011 +#define GL_LUMINANCE_ALPHA_SNORM 0x9012 +#define GL_INTENSITY_SNORM 0x9013 +#define GL_ALPHA8_SNORM 0x9014 +#define GL_LUMINANCE8_SNORM 0x9015 +#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 +#define GL_INTENSITY8_SNORM 0x9017 +#define GL_ALPHA16_SNORM 0x9018 +#define GL_LUMINANCE16_SNORM 0x9019 +#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A +#define GL_INTENSITY16_SNORM 0x901B +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 +#endif /* GL_EXT_texture_snorm */ + +#ifndef GL_EXT_texture_swizzle +#define GL_EXT_texture_swizzle 1 +#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 +#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 +#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 +#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 +#endif /* GL_EXT_texture_swizzle */ + +#ifndef GL_EXT_timer_query +#define GL_EXT_timer_query 1 +#define GL_TIME_ELAPSED_EXT 0x88BF +typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params); #ifdef GL_GLEXT_PROTOTYPES -extern GLint APIENTRY glGetInstrumentsSGIX (void); -extern void APIENTRY glInstrumentsBufferSGIX (GLsizei, GLint *); -extern GLint APIENTRY glPollInstrumentsSGIX (GLint *); -extern void APIENTRY glReadInstrumentsSGIX (GLint); -extern void APIENTRY glStartInstrumentsSGIX (void); -extern void APIENTRY glStopInstrumentsSGIX (GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLint (APIENTRY * PFNGLGETINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRY * PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); -typedef GLint (APIENTRY * PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); -typedef void (APIENTRY * PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); -typedef void (APIENTRY * PFNGLSTARTINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRY * PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); -#endif - -#ifndef GL_SGIX_texture_scale_bias -#define GL_SGIX_texture_scale_bias 1 -#endif - -#ifndef GL_SGIX_framezoom -#define GL_SGIX_framezoom 1 +GLAPI void APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params); +#endif +#endif /* GL_EXT_timer_query */ + +#ifndef GL_EXT_transform_feedback +#define GL_EXT_transform_feedback 1 +#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F +#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C +#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 +#define GL_RASTERIZER_DISCARD_EXT 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (APIENTRYP PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFrameZoomSGIX (GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); +GLAPI void APIENTRY glBeginTransformFeedbackEXT (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedbackEXT (void); +GLAPI void APIENTRY glBindBufferRangeEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferOffsetEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +GLAPI void APIENTRY glBindBufferBaseEXT (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryingsEXT (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +GLAPI void APIENTRY glGetTransformFeedbackVaryingEXT (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); #endif +#endif /* GL_EXT_transform_feedback */ -#ifndef GL_SGIX_tag_sample_buffer -#define GL_SGIX_tag_sample_buffer 1 +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 +typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); +typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, void **params); +typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTagSampleBufferSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); -#endif - -#ifndef GL_SGIX_polynomial_ffd -#define GL_SGIX_polynomial_ffd 1 +GLAPI void APIENTRY glArrayElementEXT (GLint i); +GLAPI void APIENTRY glColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glDrawArraysEXT (GLenum mode, GLint first, GLsizei count); +GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean *pointer); +GLAPI void APIENTRY glGetPointervEXT (GLenum pname, void **params); +GLAPI void APIENTRY glIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +#endif +#endif /* GL_EXT_vertex_array */ + +#ifndef GL_EXT_vertex_array_bgra +#define GL_EXT_vertex_array_bgra 1 +#endif /* GL_EXT_vertex_array_bgra */ + +#ifndef GL_EXT_vertex_attrib_64bit +#define GL_EXT_vertex_attrib_64bit 1 +#define GL_DOUBLE_VEC2_EXT 0x8FFC +#define GL_DOUBLE_VEC3_EXT 0x8FFD +#define GL_DOUBLE_VEC4_EXT 0x8FFE +#define GL_DOUBLE_MAT2_EXT 0x8F46 +#define GL_DOUBLE_MAT3_EXT 0x8F47 +#define GL_DOUBLE_MAT4_EXT 0x8F48 +#define GL_DOUBLE_MAT2x3_EXT 0x8F49 +#define GL_DOUBLE_MAT2x4_EXT 0x8F4A +#define GL_DOUBLE_MAT3x2_EXT 0x8F4B +#define GL_DOUBLE_MAT3x4_EXT 0x8F4C +#define GL_DOUBLE_MAT4x2_EXT 0x8F4D +#define GL_DOUBLE_MAT4x3_EXT 0x8F4E +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glDeformationMap3dSGIX (GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *); -extern void APIENTRY glDeformationMap3fSGIX (GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *); -extern void APIENTRY glDeformSGIX (GLbitfield); -extern void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); -typedef void (APIENTRY * PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); -typedef void (APIENTRY * PFNGLDEFORMSGIXPROC) (GLbitfield mask); -typedef void (APIENTRY * PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); -#endif - -#ifndef GL_SGIX_reference_plane -#define GL_SGIX_reference_plane 1 +GLAPI void APIENTRY glVertexAttribL1dEXT (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttribL2dEXT (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttribL3dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttribL4dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttribL1dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL2dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL3dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL4dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribLPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribLdvEXT (GLuint index, GLenum pname, GLdouble *params); +#endif +#endif /* GL_EXT_vertex_attrib_64bit */ + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED +typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const void *addr); +typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const void *addr); +typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); +typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); +typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); +typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); +typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); +typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); +typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); +typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); +typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const void *addr); +typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data); +typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glReferencePlaneSGIX (const GLdouble *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); -#endif +GLAPI void APIENTRY glBeginVertexShaderEXT (void); +GLAPI void APIENTRY glEndVertexShaderEXT (void); +GLAPI void APIENTRY glBindVertexShaderEXT (GLuint id); +GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint range); +GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint id); +GLAPI void APIENTRY glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1); +GLAPI void APIENTRY glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +GLAPI void APIENTRY glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +GLAPI void APIENTRY glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +GLAPI void APIENTRY glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +GLAPI void APIENTRY glInsertComponentEXT (GLuint res, GLuint src, GLuint num); +GLAPI void APIENTRY glExtractComponentEXT (GLuint res, GLuint src, GLuint num); +GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +GLAPI void APIENTRY glSetInvariantEXT (GLuint id, GLenum type, const void *addr); +GLAPI void APIENTRY glSetLocalConstantEXT (GLuint id, GLenum type, const void *addr); +GLAPI void APIENTRY glVariantbvEXT (GLuint id, const GLbyte *addr); +GLAPI void APIENTRY glVariantsvEXT (GLuint id, const GLshort *addr); +GLAPI void APIENTRY glVariantivEXT (GLuint id, const GLint *addr); +GLAPI void APIENTRY glVariantfvEXT (GLuint id, const GLfloat *addr); +GLAPI void APIENTRY glVariantdvEXT (GLuint id, const GLdouble *addr); +GLAPI void APIENTRY glVariantubvEXT (GLuint id, const GLubyte *addr); +GLAPI void APIENTRY glVariantusvEXT (GLuint id, const GLushort *addr); +GLAPI void APIENTRY glVariantuivEXT (GLuint id, const GLuint *addr); +GLAPI void APIENTRY glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, const void *addr); +GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint id); +GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint id); +GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum light, GLenum value); +GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum face, GLenum value); +GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value); +GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum unit, GLenum value); +GLAPI GLuint APIENTRY glBindParameterEXT (GLenum value); +GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint id, GLenum cap); +GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +GLAPI void APIENTRY glGetVariantPointervEXT (GLuint id, GLenum value, void **data); +GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +#endif +#endif /* GL_EXT_vertex_shader */ -#ifndef GL_SGIX_flush_raster -#define GL_SGIX_flush_raster 1 +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 +#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW0_EXT 0x1700 +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFlushRasterSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); +GLAPI void APIENTRY glVertexWeightfEXT (GLfloat weight); +GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *weight); +GLAPI void APIENTRY glVertexWeightPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer); #endif +#endif /* GL_EXT_vertex_weighting */ -#ifndef GL_SGIX_depth_texture -#define GL_SGIX_depth_texture 1 -#endif - -#ifndef GL_SGIS_fog_function -#define GL_SGIS_fog_function 1 +#ifndef GL_EXT_x11_sync_object +#define GL_EXT_x11_sync_object 1 +#define GL_SYNC_X11_FENCE_EXT 0x90E1 +typedef GLsync (APIENTRYP PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFogFuncSGIS (GLsizei, const GLfloat *); -extern void APIENTRY glGetFogFuncSGIS (const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); -typedef void (APIENTRY * PFNGLGETFOGFUNCSGISPROC) (const GLfloat *points); +GLAPI GLsync APIENTRY glImportSyncEXT (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); #endif +#endif /* GL_EXT_x11_sync_object */ -#ifndef GL_SGIX_fog_offset -#define GL_SGIX_fog_offset 1 +#ifndef GL_GREMEDY_frame_terminator +#define GL_GREMEDY_frame_terminator 1 +typedef void (APIENTRYP PFNGLFRAMETERMINATORGREMEDYPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFrameTerminatorGREMEDY (void); #endif +#endif /* GL_GREMEDY_frame_terminator */ -#ifndef GL_HP_image_transform -#define GL_HP_image_transform 1 +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 +typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glImageTransformParameteriHP (GLenum, GLenum, GLint); -extern void APIENTRY glImageTransformParameterfHP (GLenum, GLenum, GLfloat); -extern void APIENTRY glImageTransformParameterivHP (GLenum, GLenum, const GLint *); -extern void APIENTRY glImageTransformParameterfvHP (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glGetImageTransformParameterivHP (GLenum, GLenum, GLint *); -extern void APIENTRY glGetImageTransformParameterfvHP (GLenum, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei len, const void *string); #endif +#endif /* GL_GREMEDY_string_marker */ #ifndef GL_HP_convolution_border_modes #define GL_HP_convolution_border_modes 1 -#endif - -#ifndef GL_SGIX_texture_add_env -#define GL_SGIX_texture_add_env 1 -#endif +#define GL_IGNORE_BORDER_HP 0x8150 +#define GL_CONSTANT_BORDER_HP 0x8151 +#define GL_REPLICATE_BORDER_HP 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 +#endif /* GL_HP_convolution_border_modes */ -#ifndef GL_EXT_color_subtable -#define GL_EXT_color_subtable 1 +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 +#define GL_IMAGE_SCALE_X_HP 0x8155 +#define GL_IMAGE_SCALE_Y_HP 0x8156 +#define GL_IMAGE_TRANSLATE_X_HP 0x8157 +#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 +#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 +#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A +#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B +#define GL_IMAGE_MAG_FILTER_HP 0x815C +#define GL_IMAGE_MIN_FILTER_HP 0x815D +#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E +#define GL_CUBIC_HP 0x815F +#define GL_AVERAGE_HP 0x8160 +#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 +#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 +#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glColorSubTableEXT (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glCopyColorSubTableEXT (GLenum, GLsizei, GLint, GLint, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glImageTransformParameteriHP (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glImageTransformParameterfHP (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glImageTransformParameterivHP (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum target, GLenum pname, GLfloat *params); #endif +#endif /* GL_HP_image_transform */ -#ifndef GL_PGI_vertex_hints -#define GL_PGI_vertex_hints 1 -#endif +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 +#endif /* GL_HP_occlusion_test */ -#ifndef GL_PGI_misc_hints -#define GL_PGI_misc_hints 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glHintPGI (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLHINTPGIPROC) (GLenum target, GLint mode); -#endif +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 +#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 +#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 +#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 +#endif /* GL_HP_texture_lighting */ -#ifndef GL_EXT_paletted_texture -#define GL_EXT_paletted_texture 1 +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 +#define GL_CULL_VERTEX_IBM 103050 +#endif /* GL_IBM_cull_vertex */ + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 +typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glColorTableEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -extern void APIENTRY glGetColorTableEXT (GLenum, GLenum, GLenum, GLvoid *); -extern void APIENTRY glGetColorTableParameterivEXT (GLenum, GLenum, GLint *); -extern void APIENTRY glGetColorTableParameterfvEXT (GLenum, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride); #endif +#endif /* GL_IBM_multimode_draw_arrays */ -#ifndef GL_EXT_clip_volume_hint -#define GL_EXT_clip_volume_hint 1 -#endif +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 +#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 +#endif /* GL_IBM_rasterpos_clip */ -#ifndef GL_SGIX_list_priority -#define GL_SGIX_list_priority 1 +#ifndef GL_IBM_static_data +#define GL_IBM_static_data 1 +#define GL_ALL_STATIC_DATA_IBM 103060 +#define GL_STATIC_VERTEX_ARRAY_IBM 103061 +typedef void (APIENTRYP PFNGLFLUSHSTATICDATAIBMPROC) (GLenum target); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glGetListParameterfvSGIX (GLuint, GLenum, GLfloat *); -extern void APIENTRY glGetListParameterivSGIX (GLuint, GLenum, GLint *); -extern void APIENTRY glListParameterfSGIX (GLuint, GLenum, GLfloat); -extern void APIENTRY glListParameterfvSGIX (GLuint, GLenum, const GLfloat *); -extern void APIENTRY glListParameteriSGIX (GLuint, GLenum, GLint); -extern void APIENTRY glListParameterivSGIX (GLuint, GLenum, const GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); -#endif - -#ifndef GL_SGIX_ir_instrument1 -#define GL_SGIX_ir_instrument1 1 +GLAPI void APIENTRY glFlushStaticDataIBM (GLenum target); #endif +#endif /* GL_IBM_static_data */ -#ifndef GL_SGIX_calligraphic_fragment -#define GL_SGIX_calligraphic_fragment 1 -#endif +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_IBM_texture_mirrored_repeat 1 +#define GL_MIRRORED_REPEAT_IBM 0x8370 +#endif /* GL_IBM_texture_mirrored_repeat */ -#ifndef GL_SGIX_texture_lod_bias -#define GL_SGIX_texture_lod_bias 1 +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 +typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint stride, const GLboolean **pointer, GLint ptrstride); +GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glIndexPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glNormalPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glVertexPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +#endif +#endif /* GL_IBM_vertex_array_lists */ + +#ifndef GL_INGR_blend_func_separate +#define GL_INGR_blend_func_separate 1 +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #endif +#endif /* GL_INGR_blend_func_separate */ -#ifndef GL_SGIX_shadow_ambient -#define GL_SGIX_shadow_ambient 1 -#endif +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 +#endif /* GL_INGR_color_clamp */ -#ifndef GL_EXT_index_texture -#define GL_EXT_index_texture 1 +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 +#define GL_INTERLACE_READ_INGR 0x8568 +#endif /* GL_INGR_interlace_read */ + +#ifndef GL_INTEL_fragment_shader_ordering +#define GL_INTEL_fragment_shader_ordering 1 +#endif /* GL_INTEL_fragment_shader_ordering */ + +#ifndef GL_INTEL_map_texture +#define GL_INTEL_map_texture 1 +#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF +#define GL_LAYOUT_DEFAULT_INTEL 0 +#define GL_LAYOUT_LINEAR_INTEL 1 +#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 +typedef void (APIENTRYP PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); +typedef void *(APIENTRYP PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSyncTextureINTEL (GLuint texture); +GLAPI void APIENTRY glUnmapTexture2DINTEL (GLuint texture, GLint level); +GLAPI void *APIENTRY glMapTexture2DINTEL (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout); #endif +#endif /* GL_INTEL_map_texture */ -#ifndef GL_EXT_index_material -#define GL_EXT_index_material 1 +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 +typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glIndexMaterialEXT (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); -#endif - -#ifndef GL_EXT_index_func -#define GL_EXT_index_func 1 +GLAPI void APIENTRY glVertexPointervINTEL (GLint size, GLenum type, const void **pointer); +GLAPI void APIENTRY glNormalPointervINTEL (GLenum type, const void **pointer); +GLAPI void APIENTRY glColorPointervINTEL (GLint size, GLenum type, const void **pointer); +GLAPI void APIENTRY glTexCoordPointervINTEL (GLint size, GLenum type, const void **pointer); +#endif +#endif /* GL_INTEL_parallel_arrays */ + +#ifndef GL_INTEL_performance_query +#define GL_INTEL_performance_query 1 +#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000 +#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001 +#define GL_PERFQUERY_WAIT_INTEL 0x83FB +#define GL_PERFQUERY_FLUSH_INTEL 0x83FA +#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 +#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 +#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 +#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 +#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 +#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 +#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 +#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 +#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 +#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA +#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB +#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC +#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD +#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE +#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF +#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 +typedef void (APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle); +typedef void (APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId); +typedef void (APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId); +typedef void (APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +typedef void (APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); +typedef void (APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId); +typedef void (APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glIndexFuncEXT (GLenum, GLclampf); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); -#endif +GLAPI void APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle); +GLAPI void APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glEndPerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId); +GLAPI void APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId); +GLAPI void APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +GLAPI void APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); +GLAPI void APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId); +GLAPI void APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); +#endif +#endif /* GL_INTEL_performance_query */ + +#ifndef GL_MESAX_texture_stack +#define GL_MESAX_texture_stack 1 +#define GL_TEXTURE_1D_STACK_MESAX 0x8759 +#define GL_TEXTURE_2D_STACK_MESAX 0x875A +#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B +#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C +#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D +#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E +#endif /* GL_MESAX_texture_stack */ + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 +#define GL_PACK_INVERT_MESA 0x8758 +#endif /* GL_MESA_pack_invert */ -#ifndef GL_EXT_index_array_formats -#define GL_EXT_index_array_formats 1 +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 +typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glResizeBuffersMESA (void); #endif +#endif /* GL_MESA_resize_buffers */ -#ifndef GL_EXT_compiled_vertex_array -#define GL_EXT_compiled_vertex_array 1 +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 +typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dMESA (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2fMESA (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2iMESA (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos2sMESA (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *v); +GLAPI void APIENTRY glWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3iMESA (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos3sMESA (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *v); +GLAPI void APIENTRY glWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *v); +#endif +#endif /* GL_MESA_window_pos */ + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 +#endif /* GL_MESA_ycbcr_texture */ + +#ifndef GL_NVX_conditional_render +#define GL_NVX_conditional_render 1 +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginConditionalRenderNVX (GLuint id); +GLAPI void APIENTRY glEndConditionalRenderNVX (void); +#endif +#endif /* GL_NVX_conditional_render */ + +#ifndef GL_NVX_gpu_memory_info +#define GL_NVX_gpu_memory_info 1 +#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 +#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 +#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 +#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A +#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B +#endif /* GL_NVX_gpu_memory_info */ + +#ifndef GL_NV_bindless_multi_draw_indirect +#define GL_NV_bindless_multi_draw_indirect 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glLockArraysEXT (GLint, GLsizei); -extern void APIENTRY glUnlockArraysEXT (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); -typedef void (APIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); +GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); #endif +#endif /* GL_NV_bindless_multi_draw_indirect */ -#ifndef GL_EXT_cull_vertex -#define GL_EXT_cull_vertex 1 +#ifndef GL_NV_bindless_multi_draw_indirect_count +#define GL_NV_bindless_multi_draw_indirect_count 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessCountNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessCountNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +#endif +#endif /* GL_NV_bindless_multi_draw_indirect_count */ + +#ifndef GL_NV_bindless_texture +#define GL_NV_bindless_texture 1 +typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); +typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint64 APIENTRY glGetTextureHandleNV (GLuint texture); +GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler); +GLAPI void APIENTRY glMakeTextureHandleResidentNV (GLuint64 handle); +GLAPI void APIENTRY glMakeTextureHandleNonResidentNV (GLuint64 handle); +GLAPI GLuint64 APIENTRY glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +GLAPI void APIENTRY glMakeImageHandleResidentNV (GLuint64 handle, GLenum access); +GLAPI void APIENTRY glMakeImageHandleNonResidentNV (GLuint64 handle); +GLAPI void APIENTRY glUniformHandleui64NV (GLint location, GLuint64 value); +GLAPI void APIENTRY glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value); +GLAPI void APIENTRY glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +GLAPI GLboolean APIENTRY glIsTextureHandleResidentNV (GLuint64 handle); +GLAPI GLboolean APIENTRY glIsImageHandleResidentNV (GLuint64 handle); +#endif +#endif /* GL_NV_bindless_texture */ + +#ifndef GL_NV_blend_equation_advanced +#define GL_NV_blend_equation_advanced 1 +#define GL_BLEND_OVERLAP_NV 0x9281 +#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 +#define GL_BLUE_NV 0x1905 +#define GL_COLORBURN_NV 0x929A +#define GL_COLORDODGE_NV 0x9299 +#define GL_CONJOINT_NV 0x9284 +#define GL_CONTRAST_NV 0x92A1 +#define GL_DARKEN_NV 0x9297 +#define GL_DIFFERENCE_NV 0x929E +#define GL_DISJOINT_NV 0x9283 +#define GL_DST_ATOP_NV 0x928F +#define GL_DST_IN_NV 0x928B +#define GL_DST_NV 0x9287 +#define GL_DST_OUT_NV 0x928D +#define GL_DST_OVER_NV 0x9289 +#define GL_EXCLUSION_NV 0x92A0 +#define GL_GREEN_NV 0x1904 +#define GL_HARDLIGHT_NV 0x929B +#define GL_HARDMIX_NV 0x92A9 +#define GL_HSL_COLOR_NV 0x92AF +#define GL_HSL_HUE_NV 0x92AD +#define GL_HSL_LUMINOSITY_NV 0x92B0 +#define GL_HSL_SATURATION_NV 0x92AE +#define GL_INVERT_OVG_NV 0x92B4 +#define GL_INVERT_RGB_NV 0x92A3 +#define GL_LIGHTEN_NV 0x9298 +#define GL_LINEARBURN_NV 0x92A5 +#define GL_LINEARDODGE_NV 0x92A4 +#define GL_LINEARLIGHT_NV 0x92A7 +#define GL_MINUS_CLAMPED_NV 0x92B3 +#define GL_MINUS_NV 0x929F +#define GL_MULTIPLY_NV 0x9294 +#define GL_OVERLAY_NV 0x9296 +#define GL_PINLIGHT_NV 0x92A8 +#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 +#define GL_PLUS_CLAMPED_NV 0x92B1 +#define GL_PLUS_DARKER_NV 0x9292 +#define GL_PLUS_NV 0x9291 +#define GL_RED_NV 0x1903 +#define GL_SCREEN_NV 0x9295 +#define GL_SOFTLIGHT_NV 0x929C +#define GL_SRC_ATOP_NV 0x928E +#define GL_SRC_IN_NV 0x928A +#define GL_SRC_NV 0x9286 +#define GL_SRC_OUT_NV 0x928C +#define GL_SRC_OVER_NV 0x9288 +#define GL_UNCORRELATED_NV 0x9282 +#define GL_VIVIDLIGHT_NV 0x92A6 +#define GL_XOR_NV 0x1506 +typedef void (APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLBLENDBARRIERNVPROC) (void); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glCullParameterdvEXT (GLenum, GLdouble *); -extern void APIENTRY glCullParameterfvEXT (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); -typedef void (APIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); +GLAPI void APIENTRY glBlendParameteriNV (GLenum pname, GLint value); +GLAPI void APIENTRY glBlendBarrierNV (void); #endif +#endif /* GL_NV_blend_equation_advanced */ -#ifndef GL_SGIX_ycrcb -#define GL_SGIX_ycrcb 1 -#endif +#ifndef GL_NV_blend_equation_advanced_coherent +#define GL_NV_blend_equation_advanced_coherent 1 +#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 +#endif /* GL_NV_blend_equation_advanced_coherent */ -#ifndef GL_SGIX_fragment_lighting -#define GL_SGIX_fragment_lighting 1 +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 +#endif /* GL_NV_blend_square */ + +#ifndef GL_NV_compute_program5 +#define GL_NV_compute_program5 1 +#define GL_COMPUTE_PROGRAM_NV 0x90FB +#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC +#endif /* GL_NV_compute_program5 */ + +#ifndef GL_NV_conditional_render +#define GL_NV_conditional_render 1 +#define GL_QUERY_WAIT_NV 0x8E13 +#define GL_QUERY_NO_WAIT_NV 0x8E14 +#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFragmentColorMaterialSGIX (GLenum, GLenum); -extern void APIENTRY glFragmentLightfSGIX (GLenum, GLenum, GLfloat); -extern void APIENTRY glFragmentLightfvSGIX (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glFragmentLightiSGIX (GLenum, GLenum, GLint); -extern void APIENTRY glFragmentLightivSGIX (GLenum, GLenum, const GLint *); -extern void APIENTRY glFragmentLightModelfSGIX (GLenum, GLfloat); -extern void APIENTRY glFragmentLightModelfvSGIX (GLenum, const GLfloat *); -extern void APIENTRY glFragmentLightModeliSGIX (GLenum, GLint); -extern void APIENTRY glFragmentLightModelivSGIX (GLenum, const GLint *); -extern void APIENTRY glFragmentMaterialfSGIX (GLenum, GLenum, GLfloat); -extern void APIENTRY glFragmentMaterialfvSGIX (GLenum, GLenum, const GLfloat *); -extern void APIENTRY glFragmentMaterialiSGIX (GLenum, GLenum, GLint); -extern void APIENTRY glFragmentMaterialivSGIX (GLenum, GLenum, const GLint *); -extern void APIENTRY glGetFragmentLightfvSGIX (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetFragmentLightivSGIX (GLenum, GLenum, GLint *); -extern void APIENTRY glGetFragmentMaterialfvSGIX (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetFragmentMaterialivSGIX (GLenum, GLenum, GLint *); -extern void APIENTRY glLightEnviSGIX (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); -#endif - -#ifndef GL_IBM_rasterpos_clip -#define GL_IBM_rasterpos_clip 1 +GLAPI void APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode); +GLAPI void APIENTRY glEndConditionalRenderNV (void); +#endif +#endif /* GL_NV_conditional_render */ + +#ifndef GL_NV_conservative_raster +#define GL_NV_conservative_raster 1 +#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 +#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 +#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 +#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 +typedef void (APIENTRYP PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSubpixelPrecisionBiasNV (GLuint xbits, GLuint ybits); #endif +#endif /* GL_NV_conservative_raster */ -#ifndef GL_HP_texture_lighting -#define GL_HP_texture_lighting 1 -#endif +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F +#endif /* GL_NV_copy_depth_to_color */ -#ifndef GL_EXT_draw_range_elements -#define GL_EXT_draw_range_elements 1 +#ifndef GL_NV_copy_image +#define GL_NV_copy_image 1 +typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glDrawRangeElementsEXT (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -#endif - -#ifndef GL_WIN_phong_shading -#define GL_WIN_phong_shading 1 +GLAPI void APIENTRY glCopyImageSubDataNV (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +#endif +#endif /* GL_NV_copy_image */ + +#ifndef GL_NV_deep_texture3D +#define GL_NV_deep_texture3D 1 +#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 +#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 +#endif /* GL_NV_deep_texture3D */ + +#ifndef GL_NV_depth_buffer_float +#define GL_NV_depth_buffer_float 1 +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF +typedef void (APIENTRYP PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); +typedef void (APIENTRYP PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthRangedNV (GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glClearDepthdNV (GLdouble depth); +GLAPI void APIENTRY glDepthBoundsdNV (GLdouble zmin, GLdouble zmax); #endif +#endif /* GL_NV_depth_buffer_float */ -#ifndef GL_WIN_specular_fog -#define GL_WIN_specular_fog 1 -#endif +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 +#define GL_DEPTH_CLAMP_NV 0x864F +#endif /* GL_NV_depth_clamp */ -#ifndef GL_EXT_light_texture -#define GL_EXT_light_texture 1 +#ifndef GL_NV_draw_texture +#define GL_NV_draw_texture 1 +typedef void (APIENTRYP PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glApplyTextureEXT (GLenum); -extern void APIENTRY glTextureLightEXT (GLenum); -extern void APIENTRY glTextureMaterialEXT (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); -typedef void (APIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); -typedef void (APIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); -#endif +GLAPI void APIENTRY glDrawTextureNV (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +#endif +#endif /* GL_NV_draw_texture */ + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); +typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); +GLAPI void APIENTRY glMapParameterivNV (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMapParameterfvNV (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); +GLAPI void APIENTRY glGetMapParameterivNV (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glEvalMapsNV (GLenum target, GLenum mode); +#endif +#endif /* GL_NV_evaluators */ + +#ifndef GL_NV_explicit_multisample +#define GL_NV_explicit_multisample 1 +#define GL_SAMPLE_POSITION_NV 0x8E50 +#define GL_SAMPLE_MASK_NV 0x8E51 +#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 +#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 +#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 +#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 +#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 +#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 +#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 +#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 +typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (APIENTRYP PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); +typedef void (APIENTRYP PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetMultisamplefvNV (GLenum pname, GLuint index, GLfloat *val); +GLAPI void APIENTRY glSampleMaskIndexedNV (GLuint index, GLbitfield mask); +GLAPI void APIENTRY glTexRenderbufferNV (GLenum target, GLuint renderbuffer); +#endif +#endif /* GL_NV_explicit_multisample */ + +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); +GLAPI void APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); +GLAPI GLboolean APIENTRY glIsFenceNV (GLuint fence); +GLAPI GLboolean APIENTRY glTestFenceNV (GLuint fence); +GLAPI void APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); +GLAPI void APIENTRY glFinishFenceNV (GLuint fence); +GLAPI void APIENTRY glSetFenceNV (GLuint fence, GLenum condition); +#endif +#endif /* GL_NV_fence */ + +#ifndef GL_NV_fill_rectangle +#define GL_NV_fill_rectangle 1 +#define GL_FILL_RECTANGLE_NV 0x933C +#endif /* GL_NV_fill_rectangle */ + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E +#endif /* GL_NV_float_buffer */ -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_SGIX_blend_alpha_minmax 1 -#endif +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +#endif /* GL_NV_fog_distance */ -#ifndef GL_EXT_bgra -#define GL_EXT_bgra 1 +#ifndef GL_NV_fragment_coverage_to_color +#define GL_NV_fragment_coverage_to_color 1 +#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD +#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE +typedef void (APIENTRYP PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFragmentCoverageColorNV (GLuint color); +#endif +#endif /* GL_NV_fragment_coverage_to_color */ + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#endif +#endif /* GL_NV_fragment_program */ + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 +#endif /* GL_NV_fragment_program2 */ + +#ifndef GL_NV_fragment_program4 +#define GL_NV_fragment_program4 1 +#endif /* GL_NV_fragment_program4 */ + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 +#endif /* GL_NV_fragment_program_option */ + +#ifndef GL_NV_fragment_shader_interlock +#define GL_NV_fragment_shader_interlock 1 +#endif /* GL_NV_fragment_shader_interlock */ + +#ifndef GL_NV_framebuffer_mixed_samples +#define GL_NV_framebuffer_mixed_samples 1 +#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 +#define GL_COLOR_SAMPLES_NV 0x8E20 +#define GL_DEPTH_SAMPLES_NV 0x932D +#define GL_STENCIL_SAMPLES_NV 0x932E +#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F +#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 +#define GL_COVERAGE_MODULATION_NV 0x9332 +#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 +typedef void (APIENTRYP PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat *v); +typedef void (APIENTRYP PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat *v); +typedef void (APIENTRYP PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCoverageModulationTableNV (GLsizei n, const GLfloat *v); +GLAPI void APIENTRY glGetCoverageModulationTableNV (GLsizei bufsize, GLfloat *v); +GLAPI void APIENTRY glCoverageModulationNV (GLenum components); +#endif +#endif /* GL_NV_framebuffer_mixed_samples */ + +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_NV_framebuffer_multisample_coverage 1 +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_NV_framebuffer_multisample_coverage */ + +#ifndef GL_NV_geometry_program4 +#define GL_NV_geometry_program4 1 +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 +typedef void (APIENTRYP PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramVertexLimitNV (GLenum target, GLint limit); +GLAPI void APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#endif +#endif /* GL_NV_geometry_program4 */ + +#ifndef GL_NV_geometry_shader4 +#define GL_NV_geometry_shader4 1 +#endif /* GL_NV_geometry_shader4 */ + +#ifndef GL_NV_geometry_shader_passthrough +#define GL_NV_geometry_shader_passthrough 1 +#endif /* GL_NV_geometry_shader_passthrough */ + +#ifndef GL_NV_gpu_program4 +#define GL_NV_gpu_program4 1 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 +#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 +#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 +#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 +#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 +#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 +#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params); +GLAPI void APIENTRY glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params); +#endif +#endif /* GL_NV_gpu_program4 */ + +#ifndef GL_NV_gpu_program5 +#define GL_NV_gpu_program5 1 +#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C +#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F +#define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44 +#define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV 0x8F45 +typedef void (APIENTRYP PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC) (GLenum target, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC) (GLenum target, GLuint index, GLuint *param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramSubroutineParametersuivNV (GLenum target, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetProgramSubroutineParameteruivNV (GLenum target, GLuint index, GLuint *param); +#endif +#endif /* GL_NV_gpu_program5 */ + +#ifndef GL_NV_gpu_program5_mem_extended +#define GL_NV_gpu_program5_mem_extended 1 +#endif /* GL_NV_gpu_program5_mem_extended */ + +#ifndef GL_NV_gpu_shader5 +#define GL_NV_gpu_shader5 1 +#endif /* GL_NV_gpu_shader5 */ + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 +typedef unsigned short GLhalfNV; +#define GL_HALF_FLOAT_NV 0x140B +typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); +typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); +typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertex2hNV (GLhalfNV x, GLhalfNV y); +GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertex3hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z); +GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertex4hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glNormal3hNV (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glColor4hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV s); +GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV s, GLhalfNV t); +GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r); +GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum target, GLhalfNV s); +GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum target, GLhalfNV s, GLhalfNV t); +GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glFogCoordhNV (GLhalfNV fog); +GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *fog); +GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV weight); +GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *weight); +GLAPI void APIENTRY glVertexAttrib1hNV (GLuint index, GLhalfNV x); +GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib2hNV (GLuint index, GLhalfNV x, GLhalfNV y); +GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib3hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib4hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +#endif +#endif /* GL_NV_half_float */ + +#ifndef GL_NV_internalformat_sample_query +#define GL_NV_internalformat_sample_query 1 +#define GL_MULTISAMPLES_NV 0x9371 +#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 +#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 +#define GL_CONFORMANT_NV 0x9374 +typedef void (APIENTRYP PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetInternalformatSampleivNV (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params); #endif +#endif /* GL_NV_internalformat_sample_query */ -#ifndef GL_SGIX_async -#define GL_SGIX_async 1 +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 +#endif /* GL_NV_light_max_exponent */ + +#ifndef GL_NV_multisample_coverage +#define GL_NV_multisample_coverage 1 +#endif /* GL_NV_multisample_coverage */ + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#endif /* GL_NV_multisample_filter_hint */ + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint id); +GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint id); +GLAPI void APIENTRY glEndOcclusionQueryNV (void); +GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint *params); +#endif +#endif /* GL_NV_occlusion_query */ + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA +#endif /* GL_NV_packed_depth_stencil */ + +#ifndef GL_NV_parameter_buffer_object +#define GL_NV_parameter_buffer_object 1 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 +#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 +#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 +#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramBufferParametersfvNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glProgramBufferParametersIivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramBufferParametersIuivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); +#endif +#endif /* GL_NV_parameter_buffer_object */ + +#ifndef GL_NV_parameter_buffer_object2 +#define GL_NV_parameter_buffer_object2 1 +#endif /* GL_NV_parameter_buffer_object2 */ + +#ifndef GL_NV_path_rendering +#define GL_NV_path_rendering 1 +#define GL_PATH_FORMAT_SVG_NV 0x9070 +#define GL_PATH_FORMAT_PS_NV 0x9071 +#define GL_STANDARD_FONT_NAME_NV 0x9072 +#define GL_SYSTEM_FONT_NAME_NV 0x9073 +#define GL_FILE_NAME_NV 0x9074 +#define GL_PATH_STROKE_WIDTH_NV 0x9075 +#define GL_PATH_END_CAPS_NV 0x9076 +#define GL_PATH_INITIAL_END_CAP_NV 0x9077 +#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 +#define GL_PATH_JOIN_STYLE_NV 0x9079 +#define GL_PATH_MITER_LIMIT_NV 0x907A +#define GL_PATH_DASH_CAPS_NV 0x907B +#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C +#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D +#define GL_PATH_DASH_OFFSET_NV 0x907E +#define GL_PATH_CLIENT_LENGTH_NV 0x907F +#define GL_PATH_FILL_MODE_NV 0x9080 +#define GL_PATH_FILL_MASK_NV 0x9081 +#define GL_PATH_FILL_COVER_MODE_NV 0x9082 +#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 +#define GL_PATH_STROKE_MASK_NV 0x9084 +#define GL_COUNT_UP_NV 0x9088 +#define GL_COUNT_DOWN_NV 0x9089 +#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A +#define GL_CONVEX_HULL_NV 0x908B +#define GL_BOUNDING_BOX_NV 0x908D +#define GL_TRANSLATE_X_NV 0x908E +#define GL_TRANSLATE_Y_NV 0x908F +#define GL_TRANSLATE_2D_NV 0x9090 +#define GL_TRANSLATE_3D_NV 0x9091 +#define GL_AFFINE_2D_NV 0x9092 +#define GL_AFFINE_3D_NV 0x9094 +#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 +#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 +#define GL_UTF8_NV 0x909A +#define GL_UTF16_NV 0x909B +#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C +#define GL_PATH_COMMAND_COUNT_NV 0x909D +#define GL_PATH_COORD_COUNT_NV 0x909E +#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F +#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 +#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 +#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 +#define GL_SQUARE_NV 0x90A3 +#define GL_ROUND_NV 0x90A4 +#define GL_TRIANGULAR_NV 0x90A5 +#define GL_BEVEL_NV 0x90A6 +#define GL_MITER_REVERT_NV 0x90A7 +#define GL_MITER_TRUNCATE_NV 0x90A8 +#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 +#define GL_USE_MISSING_GLYPH_NV 0x90AA +#define GL_PATH_ERROR_POSITION_NV 0x90AB +#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD +#define GL_ADJACENT_PAIRS_NV 0x90AE +#define GL_FIRST_TO_REST_NV 0x90AF +#define GL_PATH_GEN_MODE_NV 0x90B0 +#define GL_PATH_GEN_COEFF_NV 0x90B1 +#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 +#define GL_PATH_STENCIL_FUNC_NV 0x90B7 +#define GL_PATH_STENCIL_REF_NV 0x90B8 +#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 +#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD +#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE +#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF +#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 +#define GL_MOVE_TO_RESETS_NV 0x90B5 +#define GL_MOVE_TO_CONTINUES_NV 0x90B6 +#define GL_CLOSE_PATH_NV 0x00 +#define GL_MOVE_TO_NV 0x02 +#define GL_RELATIVE_MOVE_TO_NV 0x03 +#define GL_LINE_TO_NV 0x04 +#define GL_RELATIVE_LINE_TO_NV 0x05 +#define GL_HORIZONTAL_LINE_TO_NV 0x06 +#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 +#define GL_VERTICAL_LINE_TO_NV 0x08 +#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 +#define GL_QUADRATIC_CURVE_TO_NV 0x0A +#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B +#define GL_CUBIC_CURVE_TO_NV 0x0C +#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D +#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E +#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F +#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 +#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 +#define GL_SMALL_CCW_ARC_TO_NV 0x12 +#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 +#define GL_SMALL_CW_ARC_TO_NV 0x14 +#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 +#define GL_LARGE_CCW_ARC_TO_NV 0x16 +#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 +#define GL_LARGE_CW_ARC_TO_NV 0x18 +#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 +#define GL_RESTART_PATH_NV 0xF0 +#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 +#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 +#define GL_RECT_NV 0xF6 +#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 +#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA +#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC +#define GL_ARC_TO_NV 0xFE +#define GL_RELATIVE_ARC_TO_NV 0xFF +#define GL_BOLD_BIT_NV 0x01 +#define GL_ITALIC_BIT_NV 0x02 +#define GL_GLYPH_WIDTH_BIT_NV 0x01 +#define GL_GLYPH_HEIGHT_BIT_NV 0x02 +#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 +#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 +#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 +#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 +#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 +#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 +#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 +#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 +#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 +#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 +#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 +#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 +#define GL_FONT_ASCENDER_BIT_NV 0x00200000 +#define GL_FONT_DESCENDER_BIT_NV 0x00400000 +#define GL_FONT_HEIGHT_BIT_NV 0x00800000 +#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 +#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 +#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 +#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 +#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 +#define GL_ROUNDED_RECT_NV 0xE8 +#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 +#define GL_ROUNDED_RECT2_NV 0xEA +#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB +#define GL_ROUNDED_RECT4_NV 0xEC +#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED +#define GL_ROUNDED_RECT8_NV 0xEE +#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF +#define GL_RELATIVE_RECT_NV 0xF7 +#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 +#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 +#define GL_FONT_UNAVAILABLE_NV 0x936A +#define GL_FONT_UNINTELLIGIBLE_NV 0x936B +#define GL_CONIC_CURVE_TO_NV 0x1A +#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B +#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 +#define GL_STANDARD_FONT_FORMAT_NV 0x936C +#define GL_2_BYTES_NV 0x1407 +#define GL_3_BYTES_NV 0x1408 +#define GL_4_BYTES_NV 0x1409 +#define GL_EYE_LINEAR_NV 0x2400 +#define GL_OBJECT_LINEAR_NV 0x2401 +#define GL_CONSTANT_NV 0x8576 +#define GL_PATH_FOG_GEN_MODE_NV 0x90AC +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 +#define GL_PATH_PROJECTION_NV 0x1701 +#define GL_PATH_MODELVIEW_NV 0x1700 +#define GL_PATH_MODELVIEW_STACK_DEPTH_NV 0x0BA3 +#define GL_PATH_MODELVIEW_MATRIX_NV 0x0BA6 +#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36 +#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3 +#define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4 +#define GL_PATH_PROJECTION_MATRIX_NV 0x0BA7 +#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38 +#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4 +#define GL_FRAGMENT_INPUT_NV 0x936D +typedef GLuint (APIENTRYP PFNGLGENPATHSNVPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISPATHNVPROC) (GLuint path); +typedef void (APIENTRYP PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); +typedef void (APIENTRYP PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); +typedef void (APIENTRYP PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); +typedef void (APIENTRYP PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +typedef void (APIENTRYP PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value); +typedef void (APIENTRYP PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value); +typedef void (APIENTRYP PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); +typedef void (APIENTRYP PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray); +typedef void (APIENTRYP PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); +typedef void (APIENTRYP PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func); +typedef void (APIENTRYP PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (APIENTRYP PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value); +typedef void (APIENTRYP PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands); +typedef void (APIENTRYP PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords); +typedef void (APIENTRYP PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray); +typedef void (APIENTRYP PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +typedef void (APIENTRYP PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); +typedef void (APIENTRYP PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +typedef GLboolean (APIENTRYP PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); +typedef GLboolean (APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); +typedef GLfloat (APIENTRYP PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); +typedef GLboolean (APIENTRYP PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +typedef void (APIENTRYP PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); +typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (APIENTRYP PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); +typedef void (APIENTRYP PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); +typedef void (APIENTRYP PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); +typedef void (APIENTRYP PFNGLPATHFOGGENNVPROC) (GLenum genMode); +typedef void (APIENTRYP PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat *value); +typedef void (APIENTRYP PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat *value); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glAsyncMarkerSGIX (GLuint); -extern GLint APIENTRY glFinishAsyncSGIX (GLuint *); -extern GLint APIENTRY glPollAsyncSGIX (GLuint *); -extern GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei); -extern void APIENTRY glDeleteAsyncMarkersSGIX (GLuint, GLsizei); -extern GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker); -typedef GLint (APIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); -typedef GLint (APIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); -typedef GLuint (APIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); -typedef void (APIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); -typedef GLboolean (APIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +GLAPI GLuint APIENTRY glGenPathsNV (GLsizei range); +GLAPI void APIENTRY glDeletePathsNV (GLuint path, GLsizei range); +GLAPI GLboolean APIENTRY glIsPathNV (GLuint path); +GLAPI void APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString); +GLAPI void APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI void APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI void APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); +GLAPI void APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath); +GLAPI void APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +GLAPI void APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value); +GLAPI void APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value); +GLAPI void APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value); +GLAPI void APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value); +GLAPI void APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray); +GLAPI void APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask); +GLAPI void APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units); +GLAPI void APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask); +GLAPI void APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask); +GLAPI void APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glPathCoverDepthFuncNV (GLenum func); +GLAPI void APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode); +GLAPI void APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode); +GLAPI void APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value); +GLAPI void APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands); +GLAPI void APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords); +GLAPI void APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray); +GLAPI void APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +GLAPI void APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); +GLAPI void APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +GLAPI GLboolean APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y); +GLAPI GLboolean APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y); +GLAPI GLfloat APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments); +GLAPI GLboolean APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +GLAPI void APIENTRY glMatrixLoad3x2fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoad3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoadTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMult3x2fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMult3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glStencilThenCoverFillPathNV (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +GLAPI void APIENTRY glStencilThenCoverStrokePathNV (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +GLAPI void APIENTRY glStencilThenCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glStencilThenCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI GLenum APIENTRY glPathGlyphIndexRangeNV (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); +GLAPI GLenum APIENTRY glPathGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI GLenum APIENTRY glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI void APIENTRY glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); +GLAPI void APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); +GLAPI void APIENTRY glPathColorGenNV (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); +GLAPI void APIENTRY glPathTexGenNV (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); +GLAPI void APIENTRY glPathFogGenNV (GLenum genMode); +GLAPI void APIENTRY glGetPathColorGenivNV (GLenum color, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathColorGenfvNV (GLenum color, GLenum pname, GLfloat *value); +GLAPI void APIENTRY glGetPathTexGenivNV (GLenum texCoordSet, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathTexGenfvNV (GLenum texCoordSet, GLenum pname, GLfloat *value); +#endif +#endif /* GL_NV_path_rendering */ + +#ifndef GL_NV_path_rendering_shared_edge +#define GL_NV_path_rendering_shared_edge 1 +#define GL_SHARED_EDGE_NV 0xC0 +#endif /* GL_NV_path_rendering_shared_edge */ + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D +typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, const void *pointer); +typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelDataRangeNV (GLenum target, GLsizei length, const void *pointer); +GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum target); +#endif +#endif /* GL_NV_pixel_data_range */ + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameteriNV (GLenum pname, GLint param); +GLAPI void APIENTRY glPointParameterivNV (GLenum pname, const GLint *params); +#endif +#endif /* GL_NV_point_sprite */ + +#ifndef GL_NV_present_video +#define GL_NV_present_video 1 +#define GL_FRAME_NV 0x8E26 +#define GL_FIELDS_NV 0x8E27 +#define GL_CURRENT_TIME_NV 0x8E28 +#define GL_NUM_FILL_STREAMS_NV 0x8E29 +#define GL_PRESENT_TIME_NV 0x8E2A +#define GL_PRESENT_DURATION_NV 0x8E2B +typedef void (APIENTRYP PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +typedef void (APIENTRYP PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +typedef void (APIENTRYP PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPresentFrameKeyedNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +GLAPI void APIENTRY glPresentFrameDualFillNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +GLAPI void APIENTRY glGetVideoivNV (GLuint video_slot, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideouivNV (GLuint video_slot, GLenum pname, GLuint *params); +GLAPI void APIENTRY glGetVideoi64vNV (GLuint video_slot, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetVideoui64vNV (GLuint video_slot, GLenum pname, GLuint64EXT *params); +#endif +#endif /* GL_NV_present_video */ + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPrimitiveRestartNV (void); +GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint index); #endif +#endif /* GL_NV_primitive_restart */ -#ifndef GL_SGIX_async_pixel -#define GL_SGIX_async_pixel 1 -#endif +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerParameterfvNV (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glCombinerParameterfNV (GLenum pname, GLfloat param); +GLAPI void APIENTRY glCombinerParameterivNV (GLenum pname, const GLint *params); +GLAPI void APIENTRY glCombinerParameteriNV (GLenum pname, GLint param); +GLAPI void APIENTRY glCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +GLAPI void APIENTRY glCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +GLAPI void APIENTRY glFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint *params); +#endif +#endif /* GL_NV_register_combiners */ + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat *params); +#endif +#endif /* GL_NV_register_combiners2 */ + +#ifndef GL_NV_sample_locations +#define GL_NV_sample_locations 1 +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 +#define GL_SAMPLE_LOCATION_NV 0x8E50 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 +typedef void (APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLRESOLVEDEPTHVALUESNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferSampleLocationsfvNV (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glNamedFramebufferSampleLocationsfvNV (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glResolveDepthValuesNV (void); +#endif +#endif /* GL_NV_sample_locations */ + +#ifndef GL_NV_sample_mask_override_coverage +#define GL_NV_sample_mask_override_coverage 1 +#endif /* GL_NV_sample_mask_override_coverage */ + +#ifndef GL_NV_shader_atomic_counters +#define GL_NV_shader_atomic_counters 1 +#endif /* GL_NV_shader_atomic_counters */ + +#ifndef GL_NV_shader_atomic_float +#define GL_NV_shader_atomic_float 1 +#endif /* GL_NV_shader_atomic_float */ + +#ifndef GL_NV_shader_atomic_fp16_vector +#define GL_NV_shader_atomic_fp16_vector 1 +#endif /* GL_NV_shader_atomic_fp16_vector */ + +#ifndef GL_NV_shader_atomic_int64 +#define GL_NV_shader_atomic_int64 1 +#endif /* GL_NV_shader_atomic_int64 */ + +#ifndef GL_NV_shader_buffer_load +#define GL_NV_shader_buffer_load 1 +#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D +#define GL_GPU_ADDRESS_NV 0x8F34 +#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 +typedef void (APIENTRYP PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); +typedef void (APIENTRYP PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); +typedef GLboolean (APIENTRYP PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); +typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); +typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); +typedef GLboolean (APIENTRYP PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT *result); +typedef void (APIENTRYP PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); +typedef void (APIENTRYP PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMakeBufferResidentNV (GLenum target, GLenum access); +GLAPI void APIENTRY glMakeBufferNonResidentNV (GLenum target); +GLAPI GLboolean APIENTRY glIsBufferResidentNV (GLenum target); +GLAPI void APIENTRY glMakeNamedBufferResidentNV (GLuint buffer, GLenum access); +GLAPI void APIENTRY glMakeNamedBufferNonResidentNV (GLuint buffer); +GLAPI GLboolean APIENTRY glIsNamedBufferResidentNV (GLuint buffer); +GLAPI void APIENTRY glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glGetIntegerui64vNV (GLenum value, GLuint64EXT *result); +GLAPI void APIENTRY glUniformui64NV (GLint location, GLuint64EXT value); +GLAPI void APIENTRY glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value); +GLAPI void APIENTRY glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif +#endif /* GL_NV_shader_buffer_load */ + +#ifndef GL_NV_shader_buffer_store +#define GL_NV_shader_buffer_store 1 +#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010 +#endif /* GL_NV_shader_buffer_store */ + +#ifndef GL_NV_shader_storage_buffer_object +#define GL_NV_shader_storage_buffer_object 1 +#endif /* GL_NV_shader_storage_buffer_object */ + +#ifndef GL_NV_shader_thread_group +#define GL_NV_shader_thread_group 1 +#define GL_WARP_SIZE_NV 0x9339 +#define GL_WARPS_PER_SM_NV 0x933A +#define GL_SM_COUNT_NV 0x933B +#endif /* GL_NV_shader_thread_group */ + +#ifndef GL_NV_shader_thread_shuffle +#define GL_NV_shader_thread_shuffle 1 +#endif /* GL_NV_shader_thread_shuffle */ + +#ifndef GL_NV_tessellation_program5 +#define GL_NV_tessellation_program5 1 +#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 +#define GL_TESS_CONTROL_PROGRAM_NV 0x891E +#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F +#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 +#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 +#endif /* GL_NV_tessellation_program5 */ -#ifndef GL_SGIX_async_histogram -#define GL_SGIX_async_histogram 1 -#endif +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F +#endif /* GL_NV_texgen_emboss */ -#ifndef GL_INTEL_parallel_arrays -#define GL_INTEL_parallel_arrays 1 +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 +#endif /* GL_NV_texgen_reflection */ + +#ifndef GL_NV_texture_barrier +#define GL_NV_texture_barrier 1 +typedef void (APIENTRYP PFNGLTEXTUREBARRIERNVPROC) (void); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glVertexPointervINTEL (GLint, GLenum, const GLvoid* *); -extern void APIENTRY glNormalPointervINTEL (GLenum, const GLvoid* *); -extern void APIENTRY glColorPointervINTEL (GLint, GLenum, const GLvoid* *); -extern void APIENTRY glTexCoordPointervINTEL (GLint, GLenum, const GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (APIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); -typedef void (APIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (APIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +GLAPI void APIENTRY glTextureBarrierNV (void); #endif +#endif /* GL_NV_texture_barrier */ -#ifndef GL_HP_occlusion_test -#define GL_HP_occlusion_test 1 -#endif +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 +#endif /* GL_NV_texture_compression_vtc */ -#ifndef GL_EXT_pixel_transform -#define GL_EXT_pixel_transform 1 +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B +#endif /* GL_NV_texture_env_combine4 */ + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F +#endif /* GL_NV_texture_expand_normal */ + +#ifndef GL_NV_texture_multisample +#define GL_NV_texture_multisample 1 +#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 +#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 +typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glPixelTransformParameteriEXT (GLenum, GLenum, GLint); -extern void APIENTRY glPixelTransformParameterfEXT (GLenum, GLenum, GLfloat); -extern void APIENTRY glPixelTransformParameterivEXT (GLenum, GLenum, const GLint *); -extern void APIENTRY glPixelTransformParameterfvEXT (GLenum, GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -#endif +GLAPI void APIENTRY glTexImage2DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTexImage3DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage2DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage3DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage2DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage3DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +#endif +#endif /* GL_NV_texture_multisample */ + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 +#endif /* GL_NV_texture_rectangle */ + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#endif /* GL_NV_texture_shader */ + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#endif /* GL_NV_texture_shader2 */ + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#endif /* GL_NV_texture_shader3 */ + +#ifndef GL_NV_transform_feedback +#define GL_NV_transform_feedback 1 +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F +#define GL_LAYER_NV 0x8DAA +#define GL_NEXT_BUFFER_NV -2 +#define GL_SKIP_COMPONENTS4_NV -3 +#define GL_SKIP_COMPONENTS3_NV -4 +#define GL_SKIP_COMPONENTS2_NV -5 +#define GL_SKIP_COMPONENTS1_NV -6 +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLenum bufferMode); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (APIENTRYP PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); +typedef void (APIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginTransformFeedbackNV (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedbackNV (void); +GLAPI void APIENTRY glTransformFeedbackAttribsNV (GLsizei count, const GLint *attribs, GLenum bufferMode); +GLAPI void APIENTRY glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +GLAPI void APIENTRY glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); +GLAPI void APIENTRY glActiveVaryingNV (GLuint program, const GLchar *name); +GLAPI GLint APIENTRY glGetVaryingLocationNV (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location); +GLAPI void APIENTRY glTransformFeedbackStreamAttribsNV (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); +#endif +#endif /* GL_NV_transform_feedback */ + +#ifndef GL_NV_transform_feedback2 +#define GL_NV_transform_feedback2 1 +#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 +typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint *ids); +typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindTransformFeedbackNV (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteTransformFeedbacksNV (GLsizei n, const GLuint *ids); +GLAPI void APIENTRY glGenTransformFeedbacksNV (GLsizei n, GLuint *ids); +GLAPI GLboolean APIENTRY glIsTransformFeedbackNV (GLuint id); +GLAPI void APIENTRY glPauseTransformFeedbackNV (void); +GLAPI void APIENTRY glResumeTransformFeedbackNV (void); +GLAPI void APIENTRY glDrawTransformFeedbackNV (GLenum mode, GLuint id); +#endif +#endif /* GL_NV_transform_feedback2 */ + +#ifndef GL_NV_uniform_buffer_unified_memory +#define GL_NV_uniform_buffer_unified_memory 1 +#define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E +#define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F +#define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 +#endif /* GL_NV_uniform_buffer_unified_memory */ + +#ifndef GL_NV_vdpau_interop +#define GL_NV_vdpau_interop 1 +typedef GLintptr GLvdpauSurfaceNV; +#define GL_SURFACE_STATE_NV 0x86EB +#define GL_SURFACE_REGISTERED_NV 0x86FD +#define GL_SURFACE_MAPPED_NV 0x8700 +#define GL_WRITE_DISCARD_NV 0x88BE +typedef void (APIENTRYP PFNGLVDPAUINITNVPROC) (const void *vdpDevice, const void *getProcAddress); +typedef void (APIENTRYP PFNGLVDPAUFININVPROC) (void); +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLboolean (APIENTRYP PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (APIENTRYP PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (APIENTRYP PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +typedef void (APIENTRYP PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); +typedef void (APIENTRYP PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); +typedef void (APIENTRYP PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVDPAUInitNV (const void *vdpDevice, const void *getProcAddress); +GLAPI void APIENTRY glVDPAUFiniNV (void); +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterOutputSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +GLAPI GLboolean APIENTRY glVDPAUIsSurfaceNV (GLvdpauSurfaceNV surface); +GLAPI void APIENTRY glVDPAUUnregisterSurfaceNV (GLvdpauSurfaceNV surface); +GLAPI void APIENTRY glVDPAUGetSurfaceivNV (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +GLAPI void APIENTRY glVDPAUSurfaceAccessNV (GLvdpauSurfaceNV surface, GLenum access); +GLAPI void APIENTRY glVDPAUMapSurfacesNV (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); +GLAPI void APIENTRY glVDPAUUnmapSurfacesNV (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); +#endif +#endif /* GL_NV_vdpau_interop */ -#ifndef GL_EXT_pixel_transform_color_table -#define GL_EXT_pixel_transform_color_table 1 -#endif +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); +GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei length, const void *pointer); +#endif +#endif /* GL_NV_vertex_array_range */ + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 +#endif /* GL_NV_vertex_array_range2 */ + +#ifndef GL_NV_vertex_attrib_integer_64bit +#define GL_NV_vertex_attrib_integer_64bit 1 +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribL1i64NV (GLuint index, GLint64EXT x); +GLAPI void APIENTRY glVertexAttribL2i64NV (GLuint index, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glVertexAttribL3i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glVertexAttribL4i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glVertexAttribL1i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL2i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL3i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL4i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL1ui64NV (GLuint index, GLuint64EXT x); +GLAPI void APIENTRY glVertexAttribL2ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glVertexAttribL3ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glVertexAttribL4ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glVertexAttribL1ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL2ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL3ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL4ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glGetVertexAttribLi64vNV (GLuint index, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetVertexAttribLui64vNV (GLuint index, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glVertexAttribLFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); +#endif +#endif /* GL_NV_vertex_attrib_integer_64bit */ + +#ifndef GL_NV_vertex_buffer_unified_memory +#define GL_NV_vertex_buffer_unified_memory 1 +#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E +#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F +#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 +#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 +#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 +#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 +#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 +#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 +#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 +#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 +#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 +#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 +#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A +#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B +#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C +#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D +#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E +#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F +#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 +#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 +#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 +#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 +#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 +#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 +#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 +typedef void (APIENTRYP PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +typedef void (APIENTRYP PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +GLAPI void APIENTRY glVertexFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glNormalFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glColorFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glIndexFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glEdgeFlagFormatNV (GLsizei stride); +GLAPI void APIENTRY glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glFogCoordFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +GLAPI void APIENTRY glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT *result); +#endif +#endif /* GL_NV_vertex_buffer_unified_memory */ + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); +typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); +typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void **pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei n, const GLuint *programs, GLboolean *residences); +GLAPI void APIENTRY glBindProgramNV (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteProgramsNV (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glExecuteProgramNV (GLenum target, GLuint id, const GLfloat *params); +GLAPI void APIENTRY glGenProgramsNV (GLsizei n, GLuint *programs); +GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetProgramivNV (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramStringNV (GLuint id, GLenum pname, GLubyte *program); +GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribivNV (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint index, GLenum pname, void **pointer); +GLAPI GLboolean APIENTRY glIsProgramNV (GLuint id); +GLAPI void APIENTRY glLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +GLAPI void APIENTRY glProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v); +GLAPI void APIENTRY glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v); +GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform); +GLAPI void APIENTRY glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glVertexAttrib1dNV (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1fNV (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1sNV (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2sNV (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs1svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs2svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs3svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs4svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint index, GLsizei count, const GLubyte *v); +#endif +#endif /* GL_NV_vertex_program */ + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 +#endif /* GL_NV_vertex_program1_1 */ + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 +#endif /* GL_NV_vertex_program2 */ + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 +#endif /* GL_NV_vertex_program2_option */ + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 +#endif /* GL_NV_vertex_program3 */ + +#ifndef GL_NV_vertex_program4 +#define GL_NV_vertex_program4 1 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribI1iEXT (GLuint index, GLint x); +GLAPI void APIENTRY glVertexAttribI2iEXT (GLuint index, GLint x, GLint y); +GLAPI void APIENTRY glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexAttribI1uiEXT (GLuint index, GLuint x); +GLAPI void APIENTRY glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y); +GLAPI void APIENTRY glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI void APIENTRY glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glVertexAttribI1ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI2ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI3ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI4ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI1uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI2uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI3uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4bvEXT (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttribI4svEXT (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribI4usvEXT (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params); +#endif +#endif /* GL_NV_vertex_program4 */ + +#ifndef GL_NV_video_capture +#define GL_NV_video_capture 1 +#define GL_VIDEO_BUFFER_NV 0x9020 +#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 +#define GL_FIELD_UPPER_NV 0x9022 +#define GL_FIELD_LOWER_NV 0x9023 +#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 +#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 +#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 +#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 +#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 +#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 +#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A +#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B +#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C +#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D +#define GL_PARTIAL_SUCCESS_NV 0x902E +#define GL_SUCCESS_NV 0x902F +#define GL_FAILURE_NV 0x9030 +#define GL_YCBYCR8_422_NV 0x9031 +#define GL_YCBAYCR8A_4224_NV 0x9032 +#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 +#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 +#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 +#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 +#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 +#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 +#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 +#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A +#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B +#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C +typedef void (APIENTRYP PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); +typedef GLenum (APIENTRYP PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVideoCaptureNV (GLuint video_capture_slot); +GLAPI void APIENTRY glBindVideoCaptureStreamBufferNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +GLAPI void APIENTRY glBindVideoCaptureStreamTextureNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +GLAPI void APIENTRY glEndVideoCaptureNV (GLuint video_capture_slot); +GLAPI void APIENTRY glGetVideoCaptureivNV (GLuint video_capture_slot, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideoCaptureStreamivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideoCaptureStreamfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVideoCaptureStreamdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); +GLAPI GLenum APIENTRY glVideoCaptureNV (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); +GLAPI void APIENTRY glVideoCaptureStreamParameterivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); +GLAPI void APIENTRY glVideoCaptureStreamParameterfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glVideoCaptureStreamParameterdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); +#endif +#endif /* GL_NV_video_capture */ + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 +#endif /* GL_OML_interlace */ + +#ifndef GL_OML_resample +#define GL_OML_resample 1 +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 +#endif /* GL_OML_resample */ + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 +#endif /* GL_OML_subsample */ -#ifndef GL_EXT_shared_texture_palette -#define GL_EXT_shared_texture_palette 1 +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 +#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD +#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 +#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C +#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E +#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F +#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 +#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 +#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 +#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 +#define GL_CLIP_NEAR_HINT_PGI 0x1A220 +#define GL_CLIP_FAR_HINT_PGI 0x1A221 +#define GL_WIDE_LINE_HINT_PGI 0x1A222 +#define GL_BACK_NORMALS_HINT_PGI 0x1A223 +typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glHintPGI (GLenum target, GLint mode); #endif +#endif /* GL_PGI_misc_hints */ -#ifndef GL_EXT_separate_specular_color -#define GL_EXT_separate_specular_color 1 -#endif +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 +#define GL_VERTEX_DATA_HINT_PGI 0x1A22A +#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B +#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C +#define GL_MAX_VERTEX_HINT_PGI 0x1A22D +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#endif /* GL_PGI_vertex_hints */ -#ifndef GL_EXT_secondary_color -#define GL_EXT_secondary_color 1 +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 +#endif /* GL_REND_screen_coordinates */ + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#define GL_RGBA_DXT5_S3TC 0x83A4 +#define GL_RGBA4_DXT5_S3TC 0x83A5 +#endif /* GL_S3_s3tc */ + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 +#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 +#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 +#define GL_LINEAR_DETAIL_SGIS 0x8097 +#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 +#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 +#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A +#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B +#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C +typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSecondaryColor3bEXT (GLbyte, GLbyte, GLbyte); -extern void APIENTRY glSecondaryColor3bvEXT (const GLbyte *); -extern void APIENTRY glSecondaryColor3dEXT (GLdouble, GLdouble, GLdouble); -extern void APIENTRY glSecondaryColor3dvEXT (const GLdouble *); -extern void APIENTRY glSecondaryColor3fEXT (GLfloat, GLfloat, GLfloat); -extern void APIENTRY glSecondaryColor3fvEXT (const GLfloat *); -extern void APIENTRY glSecondaryColor3iEXT (GLint, GLint, GLint); -extern void APIENTRY glSecondaryColor3ivEXT (const GLint *); -extern void APIENTRY glSecondaryColor3sEXT (GLshort, GLshort, GLshort); -extern void APIENTRY glSecondaryColor3svEXT (const GLshort *); -extern void APIENTRY glSecondaryColor3ubEXT (GLubyte, GLubyte, GLubyte); -extern void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *); -extern void APIENTRY glSecondaryColor3uiEXT (GLuint, GLuint, GLuint); -extern void APIENTRY glSecondaryColor3uivEXT (const GLuint *); -extern void APIENTRY glSecondaryColor3usEXT (GLushort, GLushort, GLushort); -extern void APIENTRY glSecondaryColor3usvEXT (const GLushort *); -extern void APIENTRY glSecondaryColorPointerEXT (GLint, GLenum, GLsizei, GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); -typedef void (APIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); +GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum target, GLfloat *points); #endif +#endif /* GL_SGIS_detail_texture */ -#ifndef GL_EXT_texture_perturb_normal -#define GL_EXT_texture_perturb_normal 1 +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 +#define GL_FOG_FUNC_SGIS 0x812A +#define GL_FOG_FUNC_POINTS_SGIS 0x812B +#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C +typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTextureNormalEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); +GLAPI void APIENTRY glFogFuncSGIS (GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *points); #endif +#endif /* GL_SGIS_fog_function */ -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 +#endif /* GL_SGIS_generate_mipmap */ + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); -extern void APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); -typedef void (APIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +GLAPI void APIENTRY glSampleMaskSGIS (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glSamplePatternSGIS (GLenum pattern); #endif +#endif /* GL_SGIS_multisample */ -#ifndef GL_EXT_fog_coord -#define GL_EXT_fog_coord 1 +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 +#define GL_PIXEL_TEXTURE_SGIS 0x8353 +#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 +#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 +#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFogCoordfEXT (GLfloat); -extern void APIENTRY glFogCoordfvEXT (const GLfloat *); -extern void APIENTRY glFogCoorddEXT (GLdouble); -extern void APIENTRY glFogCoorddvEXT (const GLdouble *); -extern void APIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); -typedef void (APIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); -typedef void (APIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); -typedef void (APIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); -typedef void (APIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum pname, GLint param); +GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum pname, const GLint *params); +GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum pname, GLint *params); +GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum pname, GLfloat *params); #endif +#endif /* GL_SGIS_pixel_texture */ -#ifndef GL_REND_screen_coordinates -#define GL_REND_screen_coordinates 1 -#endif +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 +#endif /* GL_SGIS_point_line_texgen */ -#ifndef GL_EXT_coordinate_frame -#define GL_EXT_coordinate_frame 1 +#ifndef GL_SGIS_point_parameters +#define GL_SGIS_point_parameters 1 +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTangent3bEXT (GLbyte, GLbyte, GLbyte); -extern void APIENTRY glTangent3bvEXT (const GLbyte *); -extern void APIENTRY glTangent3dEXT (GLdouble, GLdouble, GLdouble); -extern void APIENTRY glTangent3dvEXT (const GLdouble *); -extern void APIENTRY glTangent3fEXT (GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTangent3fvEXT (const GLfloat *); -extern void APIENTRY glTangent3iEXT (GLint, GLint, GLint); -extern void APIENTRY glTangent3ivEXT (const GLint *); -extern void APIENTRY glTangent3sEXT (GLshort, GLshort, GLshort); -extern void APIENTRY glTangent3svEXT (const GLshort *); -extern void APIENTRY glBinormal3bEXT (GLbyte, GLbyte, GLbyte); -extern void APIENTRY glBinormal3bvEXT (const GLbyte *); -extern void APIENTRY glBinormal3dEXT (GLdouble, GLdouble, GLdouble); -extern void APIENTRY glBinormal3dvEXT (const GLdouble *); -extern void APIENTRY glBinormal3fEXT (GLfloat, GLfloat, GLfloat); -extern void APIENTRY glBinormal3fvEXT (const GLfloat *); -extern void APIENTRY glBinormal3iEXT (GLint, GLint, GLint); -extern void APIENTRY glBinormal3ivEXT (const GLint *); -extern void APIENTRY glBinormal3sEXT (GLshort, GLshort, GLshort); -extern void APIENTRY glBinormal3svEXT (const GLshort *); -extern void APIENTRY glTangentPointerEXT (GLenum, GLsizei, const GLvoid *); -extern void APIENTRY glBinormalPointerEXT (GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); -typedef void (APIENTRY * PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRY * PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); -typedef void (APIENTRY * PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); -typedef void (APIENTRY * PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); -typedef void (APIENTRY * PFNGLTANGENT3IVEXTPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); -typedef void (APIENTRY * PFNGLTANGENT3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRY * PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); -typedef void (APIENTRY * PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRY * PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); -typedef void (APIENTRY * PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); -typedef void (APIENTRY * PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); -typedef void (APIENTRY * PFNGLBINORMAL3IVEXTPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); -typedef void (APIENTRY * PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_texture_env_combine -#define GL_EXT_texture_env_combine 1 +GLAPI void APIENTRY glPointParameterfSGIS (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvSGIS (GLenum pname, const GLfloat *params); #endif +#endif /* GL_SGIS_point_parameters */ -#ifndef GL_APPLE_specular_vector -#define GL_APPLE_specular_vector 1 +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 +#define GL_LINEAR_SHARPEN_SGIS 0x80AD +#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE +#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF +#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 +typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum target, GLfloat *points); #endif +#endif /* GL_SGIS_sharpen_texture */ -#ifndef GL_APPLE_transform_hint -#define GL_APPLE_transform_hint 1 +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 +#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 +#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 +#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 +#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 +#define GL_TEXTURE_4D_SGIS 0x8134 +#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 +#define GL_TEXTURE_4DSIZE_SGIS 0x8136 +#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 +#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 +#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage4DSGIS (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels); #endif +#endif /* GL_SGIS_texture4D */ -#ifndef GL_SGIX_fog_scale -#define GL_SGIX_fog_scale 1 -#endif +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 +#define GL_CLAMP_TO_BORDER_SGIS 0x812D +#endif /* GL_SGIS_texture_border_clamp */ -#ifndef GL_SUNX_constant_data -#define GL_SUNX_constant_data 1 +#ifndef GL_SGIS_texture_color_mask +#define GL_SGIS_texture_color_mask 1 +#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFinishTextureSUNX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); +GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); #endif +#endif /* GL_SGIS_texture_color_mask */ -#ifndef GL_SUN_global_alpha -#define GL_SUN_global_alpha 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glGlobalAlphaFactorbSUN (GLbyte); -extern void APIENTRY glGlobalAlphaFactorsSUN (GLshort); -extern void APIENTRY glGlobalAlphaFactoriSUN (GLint); -extern void APIENTRY glGlobalAlphaFactorfSUN (GLfloat); -extern void APIENTRY glGlobalAlphaFactordSUN (GLdouble); -extern void APIENTRY glGlobalAlphaFactorubSUN (GLubyte); -extern void APIENTRY glGlobalAlphaFactorusSUN (GLushort); -extern void APIENTRY glGlobalAlphaFactoruiSUN (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); -#endif +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 +#define GL_CLAMP_TO_EDGE_SGIS 0x812F +#endif /* GL_SGIS_texture_edge_clamp */ -#ifndef GL_SUN_triangle_list -#define GL_SUN_triangle_list 1 +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 +#define GL_FILTER4_SGIS 0x8146 +#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); +typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glReplacementCodeuiSUN (GLuint); -extern void APIENTRY glReplacementCodeusSUN (GLushort); -extern void APIENTRY glReplacementCodeubSUN (GLubyte); -extern void APIENTRY glReplacementCodeuivSUN (const GLuint *); -extern void APIENTRY glReplacementCodeusvSUN (const GLushort *); -extern void APIENTRY glReplacementCodeubvSUN (const GLubyte *); -extern void APIENTRY glReplacementCodePointerSUN (GLenum, GLsizei, const GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); +GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat *weights); +GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); #endif +#endif /* GL_SGIS_texture_filter4 */ -#ifndef GL_SUN_vertex -#define GL_SUN_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glColor4ubVertex2fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat); -extern void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *, const GLfloat *); -extern void APIENTRY glColor4ubVertex3fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *, const GLfloat *); -extern void APIENTRY glColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glColor3fVertex3fvSUN (const GLfloat *, const GLfloat *); -extern void APIENTRY glNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *); -extern void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord2fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord4fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat, GLfloat, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *, const GLubyte *, const GLfloat *); -extern void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLenum *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLenum, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLenum *, const GLubyte *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *, const GLfloat *); -extern void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLenum rc, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLenum rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLenum *rc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLenum rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLenum rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -#endif +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D +#endif /* GL_SGIS_texture_lod */ -#ifndef GL_EXT_blend_func_separate -#define GL_EXT_blend_func_separate 1 +#ifndef GL_SGIS_texture_select +#define GL_SGIS_texture_select 1 +#define GL_DUAL_ALPHA4_SGIS 0x8110 +#define GL_DUAL_ALPHA8_SGIS 0x8111 +#define GL_DUAL_ALPHA12_SGIS 0x8112 +#define GL_DUAL_ALPHA16_SGIS 0x8113 +#define GL_DUAL_LUMINANCE4_SGIS 0x8114 +#define GL_DUAL_LUMINANCE8_SGIS 0x8115 +#define GL_DUAL_LUMINANCE12_SGIS 0x8116 +#define GL_DUAL_LUMINANCE16_SGIS 0x8117 +#define GL_DUAL_INTENSITY4_SGIS 0x8118 +#define GL_DUAL_INTENSITY8_SGIS 0x8119 +#define GL_DUAL_INTENSITY12_SGIS 0x811A +#define GL_DUAL_INTENSITY16_SGIS 0x811B +#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C +#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D +#define GL_QUAD_ALPHA4_SGIS 0x811E +#define GL_QUAD_ALPHA8_SGIS 0x811F +#define GL_QUAD_LUMINANCE4_SGIS 0x8120 +#define GL_QUAD_LUMINANCE8_SGIS 0x8121 +#define GL_QUAD_INTENSITY4_SGIS 0x8122 +#define GL_QUAD_INTENSITY8_SGIS 0x8123 +#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 +#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 +#endif /* GL_SGIS_texture_select */ + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 +#define GL_ASYNC_MARKER_SGIX 0x8329 +typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); +typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); +typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glBlendFuncSeparateEXT (GLenum, GLenum, GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint marker); +GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *markerp); +GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *markerp); +GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei range); +GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range); +GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint marker); #endif +#endif /* GL_SGIX_async */ -#ifndef GL_INGR_color_clamp -#define GL_INGR_color_clamp 1 -#endif +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D +#endif /* GL_SGIX_async_histogram */ -#ifndef GL_INGR_interlace_read -#define GL_INGR_interlace_read 1 -#endif +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 +#endif /* GL_SGIX_async_pixel */ -#ifndef GL_EXT_stencil_wrap -#define GL_EXT_stencil_wrap 1 -#endif +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 +#endif /* GL_SGIX_blend_alpha_minmax */ -#ifndef GL_EXT_422_pixels -#define GL_EXT_422_pixels 1 -#endif +#ifndef GL_SGIX_calligraphic_fragment +#define GL_SGIX_calligraphic_fragment 1 +#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 +#endif /* GL_SGIX_calligraphic_fragment */ -#ifndef GL_NV_texgen_reflection -#define GL_NV_texgen_reflection 1 -#endif +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 +#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 +#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 +#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 +#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 +#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 +#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 +#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 +#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 +#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 +#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D +#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E +#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F +#endif /* GL_SGIX_clipmap */ -#ifndef GL_SUN_convolution_border_modes -#define GL_SUN_convolution_border_modes 1 -#endif +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 +#define GL_CONVOLUTION_HINT_SGIX 0x8316 +#endif /* GL_SGIX_convolution_accuracy */ -#ifndef GL_EXT_texture_env_add -#define GL_EXT_texture_env_add 1 -#endif +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 +#endif /* GL_SGIX_depth_pass_instrument */ -#ifndef GL_EXT_texture_lod_bias -#define GL_EXT_texture_lod_bias 1 -#endif +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 +#endif /* GL_SGIX_depth_texture */ -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 +typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushRasterSGIX (void); #endif +#endif /* GL_SGIX_flush_raster */ -#ifndef GL_EXT_vertex_weighting -#define GL_EXT_vertex_weighting 1 +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 +#endif /* GL_SGIX_fog_offset */ + +#ifndef GL_SGIX_fragment_lighting +#define GL_SGIX_fragment_lighting 1 +#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 +#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 +#define GL_LIGHT_ENV_MODE_SGIX 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B +#define GL_FRAGMENT_LIGHT0_SGIX 0x840C +#define GL_FRAGMENT_LIGHT1_SGIX 0x840D +#define GL_FRAGMENT_LIGHT2_SGIX 0x840E +#define GL_FRAGMENT_LIGHT3_SGIX 0x840F +#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 +#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 +#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 +#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 +typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum face, GLenum mode); +GLAPI void APIENTRY glFragmentLightfSGIX (GLenum light, GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum light, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentLightiSGIX (GLenum light, GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentLightivSGIX (GLenum light, GLenum pname, const GLint *params); +GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum pname, const GLint *params); +GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum face, GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum face, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum face, GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum face, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum light, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum light, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum face, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum face, GLenum pname, GLint *params); +GLAPI void APIENTRY glLightEnviSGIX (GLenum pname, GLint param); +#endif +#endif /* GL_SGIX_fragment_lighting */ + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 +#define GL_FRAMEZOOM_SGIX 0x818B +#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C +#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D +typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glVertexWeightfEXT (GLfloat); -extern void APIENTRY glVertexWeightfvEXT (const GLfloat *); -extern void APIENTRY glVertexWeightPointerEXT (GLsizei, GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); -typedef void (APIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); -typedef void (APIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_NV_light_max_exponent -#define GL_NV_light_max_exponent 1 +GLAPI void APIENTRY glFrameZoomSGIX (GLint factor); #endif +#endif /* GL_SGIX_framezoom */ -#ifndef GL_NV_vertex_array_range -#define GL_NV_vertex_array_range 1 +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 +typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const void *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glFlushVertexArrayRangeNV (void); -extern void APIENTRY glVertexArrayRangeNV (GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); -typedef void (APIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei size, const GLvoid *pointer); +GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum pname, const void *params); #endif +#endif /* GL_SGIX_igloo_interface */ -#ifndef GL_NV_register_combiners -#define GL_NV_register_combiners 1 +#ifndef GL_SGIX_instruments +#define GL_SGIX_instruments 1 +#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 +#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 +typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); +typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); +typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); +typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glCombinerParameterfvNV (GLenum, const GLfloat *); -extern void APIENTRY glCombinerParameterfNV (GLenum, GLfloat); -extern void APIENTRY glCombinerParameterivNV (GLenum, const GLint *); -extern void APIENTRY glCombinerParameteriNV (GLenum, GLint); -extern void APIENTRY glCombinerInputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); -extern void APIENTRY glCombinerOutputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); -extern void APIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum); -extern void APIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *); -extern void APIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *); -extern void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *); -extern void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (APIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -typedef void (APIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); +GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); +GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei size, GLint *buffer); +GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *marker_p); +GLAPI void APIENTRY glReadInstrumentsSGIX (GLint marker); +GLAPI void APIENTRY glStartInstrumentsSGIX (void); +GLAPI void APIENTRY glStopInstrumentsSGIX (GLint marker); #endif +#endif /* GL_SGIX_instruments */ -#ifndef GL_NV_fog_distance -#define GL_NV_fog_distance 1 -#endif +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 +#define GL_INTERLACE_SGIX 0x8094 +#endif /* GL_SGIX_interlace */ -#ifndef GL_NV_texgen_emboss -#define GL_NV_texgen_emboss 1 -#endif +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 +#define GL_IR_INSTRUMENT1_SGIX 0x817F +#endif /* GL_SGIX_ir_instrument1 */ -#ifndef GL_NV_blend_square -#define GL_NV_blend_square 1 +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 +#define GL_LIST_PRIORITY_SGIX 0x8182 +typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint list, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetListParameterivSGIX (GLuint list, GLenum pname, GLint *params); +GLAPI void APIENTRY glListParameterfSGIX (GLuint list, GLenum pname, GLfloat param); +GLAPI void APIENTRY glListParameterfvSGIX (GLuint list, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glListParameteriSGIX (GLuint list, GLenum pname, GLint param); +GLAPI void APIENTRY glListParameterivSGIX (GLuint list, GLenum pname, const GLint *params); #endif +#endif /* GL_SGIX_list_priority */ -#ifndef GL_NV_texture_env_combine4 -#define GL_NV_texture_env_combine4 1 +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 +#define GL_PIXEL_TEX_GEN_SGIX 0x8139 +#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenSGIX (GLenum mode); #endif +#endif /* GL_SGIX_pixel_texture */ -#ifndef GL_MESA_resize_buffers -#define GL_MESA_resize_buffers 1 +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 +#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E +#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F +#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 +#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 +#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 +#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 +#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 +#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 +#endif /* GL_SGIX_pixel_tiles */ + +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 +#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 +#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 +#define GL_DEFORMATIONS_MASK_SGIX 0x8196 +#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glResizeBuffersMESA (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); +GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +GLAPI void APIENTRY glDeformSGIX (GLbitfield mask); +GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield mask); #endif +#endif /* GL_SGIX_polynomial_ffd */ -#ifndef GL_MESA_window_pos -#define GL_MESA_window_pos 1 +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 +#define GL_REFERENCE_PLANE_SGIX 0x817D +#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E +typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glWindowPos2dMESA (GLdouble, GLdouble); -extern void APIENTRY glWindowPos2dvMESA (const GLdouble *); -extern void APIENTRY glWindowPos2fMESA (GLfloat, GLfloat); -extern void APIENTRY glWindowPos2fvMESA (const GLfloat *); -extern void APIENTRY glWindowPos2iMESA (GLint, GLint); -extern void APIENTRY glWindowPos2ivMESA (const GLint *); -extern void APIENTRY glWindowPos2sMESA (GLshort, GLshort); -extern void APIENTRY glWindowPos2svMESA (const GLshort *); -extern void APIENTRY glWindowPos3dMESA (GLdouble, GLdouble, GLdouble); -extern void APIENTRY glWindowPos3dvMESA (const GLdouble *); -extern void APIENTRY glWindowPos3fMESA (GLfloat, GLfloat, GLfloat); -extern void APIENTRY glWindowPos3fvMESA (const GLfloat *); -extern void APIENTRY glWindowPos3iMESA (GLint, GLint, GLint); -extern void APIENTRY glWindowPos3ivMESA (const GLint *); -extern void APIENTRY glWindowPos3sMESA (GLshort, GLshort, GLshort); -extern void APIENTRY glWindowPos3svMESA (const GLshort *); -extern void APIENTRY glWindowPos4dMESA (GLdouble, GLdouble, GLdouble, GLdouble); -extern void APIENTRY glWindowPos4dvMESA (const GLdouble *); -extern void APIENTRY glWindowPos4fMESA (GLfloat, GLfloat, GLfloat, GLfloat); -extern void APIENTRY glWindowPos4fvMESA (const GLfloat *); -extern void APIENTRY glWindowPos4iMESA (GLint, GLint, GLint, GLint); -extern void APIENTRY glWindowPos4ivMESA (const GLint *); -extern void APIENTRY glWindowPos4sMESA (GLshort, GLshort, GLshort, GLshort); -extern void APIENTRY glWindowPos4svMESA (const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); -typedef void (APIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); -typedef void (APIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); -typedef void (APIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); -typedef void (APIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); -typedef void (APIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); +GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *equation); #endif +#endif /* GL_SGIX_reference_plane */ -#ifndef GL_IBM_cull_vertex -#define GL_IBM_cull_vertex 1 -#endif +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 +#define GL_PACK_RESAMPLE_SGIX 0x842C +#define GL_UNPACK_RESAMPLE_SGIX 0x842D +#define GL_RESAMPLE_REPLICATE_SGIX 0x842E +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#endif /* GL_SGIX_resample */ -#ifndef GL_IBM_multimode_draw_arrays -#define GL_IBM_multimode_draw_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glMultiModeDrawArraysIBM (GLenum, const GLint *, const GLsizei *, GLsizei, GLint); -extern void APIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* *, GLsizei, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -typedef void (APIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount, GLint modestride); -#endif +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 +#define GL_SCALEBIAS_HINT_SGIX 0x8322 +#endif /* GL_SGIX_scalebias_hint */ -#ifndef GL_IBM_vertex_array_lists -#define GL_IBM_vertex_array_lists 1 +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D +#endif /* GL_SGIX_shadow */ + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 +#define GL_SHADOW_AMBIENT_SGIX 0x80BF +#endif /* GL_SGIX_shadow_ambient */ + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 +#define GL_SPRITE_SGIX 0x8148 +#define GL_SPRITE_MODE_SGIX 0x8149 +#define GL_SPRITE_AXIS_SGIX 0x814A +#define GL_SPRITE_TRANSLATION_SGIX 0x814B +#define GL_SPRITE_AXIAL_SGIX 0x814C +#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D +#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glSecondaryColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glEdgeFlagPointerListIBM (GLint, const GLboolean* *, GLint); -extern void APIENTRY glFogCoordPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glIndexPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glNormalPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glTexCoordPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -extern void APIENTRY glVertexPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum pname, GLfloat param); +GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum pname, GLint param); +GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum pname, const GLint *params); #endif +#endif /* GL_SGIX_sprite */ #ifndef GL_SGIX_subsample #define GL_SGIX_subsample 1 -#endif +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 +#endif /* GL_SGIX_subsample */ -#ifndef GL_SGIX_ycrcba -#define GL_SGIX_ycrcba 1 +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 +typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTagSampleBufferSGIX (void); #endif +#endif /* GL_SGIX_tag_sample_buffer */ + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 +#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE +#endif /* GL_SGIX_texture_add_env */ + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B +#endif /* GL_SGIX_texture_coordinate_clamp */ + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 +#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E +#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F +#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 +#endif /* GL_SGIX_texture_lod_bias */ + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E +#endif /* GL_SGIX_texture_multi_buffer */ + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C +#endif /* GL_SGIX_texture_scale_bias */ + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF +#endif /* GL_SGIX_vertex_preclip */ + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 +#define GL_YCRCB_422_SGIX 0x81BB +#define GL_YCRCB_444_SGIX 0x81BC +#endif /* GL_SGIX_ycrcb */ #ifndef GL_SGIX_ycrcb_subsample #define GL_SGIX_ycrcb_subsample 1 -#endif - -#ifndef GL_SGIX_depth_pass_instrument -#define GL_SGIX_depth_pass_instrument 1 -#endif +#endif /* GL_SGIX_ycrcb_subsample */ -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_3DFX_texture_compression_FXT1 1 -#endif +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 +#endif /* GL_SGIX_ycrcba */ -#ifndef GL_3DFX_multisample -#define GL_3DFX_multisample 1 -#endif +#ifndef GL_SGI_color_matrix +#define GL_SGI_color_matrix 1 +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB +#endif /* GL_SGI_color_matrix */ -#ifndef GL_3DFX_tbuffer -#define GL_3DFX_tbuffer 1 +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTbufferMask3DFX (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); +GLAPI void APIENTRY glColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glColorTableParameterivSGI (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glGetColorTableSGI (GLenum target, GLenum format, GLenum type, void *table); +GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint *params); #endif +#endif /* GL_SGI_color_table */ -#ifndef GL_EXT_multisample -#define GL_EXT_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glSampleMaskEXT (GLclampf, GLboolean); -extern void APIENTRY glSamplePatternEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); -#endif +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#endif /* GL_SGI_texture_color_table */ -#ifndef GL_SGI_vertex_preclip -#define GL_SGI_vertex_preclip 1 +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 +typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFinishTextureSUNX (void); #endif +#endif /* GL_SUNX_constant_data */ -#ifndef GL_SGIX_convolution_accuracy -#define GL_SGIX_convolution_accuracy 1 -#endif +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 +#define GL_WRAP_BORDER_SUN 0x81D4 +#endif /* GL_SUN_convolution_border_modes */ -#ifndef GL_SGIX_resample -#define GL_SGIX_resample 1 +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte factor); +GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort factor); +GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint factor); +GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat factor); +GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble factor); +GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte factor); +GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort factor); +GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint factor); +#endif +#endif /* GL_SUN_global_alpha */ + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 +typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width); #endif +#endif /* GL_SUN_mesh_array */ -#ifndef GL_SGIS_point_line_texgen -#define GL_SGIS_point_line_texgen 1 -#endif +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 +#define GL_SLICE_ACCUM_SUN 0x85CC +#endif /* GL_SUN_slice_accum */ -#ifndef GL_SGIS_texture_color_mask -#define GL_SGIS_texture_color_mask 1 +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 +#define GL_RESTART_SUN 0x0001 +#define GL_REPLACE_MIDDLE_SUN 0x0002 +#define GL_REPLACE_OLDEST_SUN 0x0003 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void **pointer); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glTextureColorMaskSGIS (GLboolean, GLboolean, GLboolean, GLboolean); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint code); +GLAPI void APIENTRY glReplacementCodeusSUN (GLushort code); +GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte code); +GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *code); +GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *code); +GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *code); +GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum type, GLsizei stride, const void **pointer); #endif +#endif /* GL_SUN_triangle_list */ -#ifndef GL_SGIX_igloo_interface -#define GL_SGIX_igloo_interface 1 +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); #ifdef GL_GLEXT_PROTOTYPES -extern void APIENTRY glIglooInterfaceSGIX (GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRY * PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); -#endif +GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *rc, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *rc, const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +#endif +#endif /* GL_SUN_vertex */ + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB +#endif /* GL_WIN_phong_shading */ +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC +#endif /* GL_WIN_specular_fog */ #ifdef __cplusplus } #endif + +#endif \ No newline at end of file diff --git a/codemp/rd-vanilla/qgl.h b/codemp/rd-vanilla/qgl.h index 029e0344a8..3489f03ca7 100644 --- a/codemp/rd-vanilla/qgl.h +++ b/codemp/rd-vanilla/qgl.h @@ -1,308 +1,420 @@ -#pragma once - /* -** QGL.H +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -#if defined( __LINT__ ) - -#include +#pragma once +#if defined( __LINT__ ) +# include #elif defined( _WIN32 ) - -#pragma warning (disable: 4201) -#pragma warning (disable: 4214) -#pragma warning (disable: 4514) -#pragma warning (disable: 4032) -#pragma warning (disable: 4201) -#pragma warning (disable: 4214) -#include -#include - +# include +# include #elif defined(MACOS_X) - -#include "../macosx/macosx_glimp.h" - +// Prevent OS X from including its own out-of-date glext.h +# define GL_GLEXT_LEGACY +# include #elif defined( __linux__ ) - -#include -#include +# include +# include // bk001129 - from cvs1.17 (mkv) -#if defined(__FX__) -#include -#endif - +# if defined(__FX__) +# include +# endif #elif defined( __FreeBSD__ ) // rb010123 - -#include -#include -#if defined(__FX__) -#include -#endif - +# include +# include +# if defined(__FX__) +# include +# endif #else - -#include - +# include #endif -#ifndef APIENTRY -#define APIENTRY +#include "glext.h" + +#define qglAccum glAccum +#define qglAlphaFunc glAlphaFunc +#define qglAreTexturesResident glAreTexturesResident +#define qglArrayElement glArrayElement +#define qglBegin glBegin +#define qglBindTexture glBindTexture +#define qglBitmap glBitmap +#define qglBlendFunc glBlendFunc +#define qglCallList glCallList +#define qglCallLists glCallLists +#define qglClear glClear +#define qglClearAccum glClearAccum +#define qglClearColor glClearColor +#define qglClearDepth glClearDepth +#define qglClearIndex glClearIndex +#define qglClearStencil glClearStencil +#define qglClipPlane glClipPlane +#define qglColor3b glColor3b +#define qglColor3bv glColor3bv +#define qglColor3d glColor3d +#define qglColor3dv glColor3dv +#define qglColor3f glColor3f +#define qglColor3fv glColor3fv +#define qglColor3i glColor3i +#define qglColor3iv glColor3iv +#define qglColor3s glColor3s +#define qglColor3sv glColor3sv +#define qglColor3ub glColor3ub +#define qglColor3ubv glColor3ubv +#define qglColor3ui glColor3ui +#define qglColor3uiv glColor3uiv +#define qglColor3us glColor3us +#define qglColor3usv glColor3usv +#define qglColor4b glColor4b +#define qglColor4bv glColor4bv +#define qglColor4d glColor4d +#define qglColor4dv glColor4dv +#define qglColor4f glColor4f +#define qglColor4fv glColor4fv +#define qglColor4i glColor4i +#define qglColor4iv glColor4iv +#define qglColor4s glColor4s +#define qglColor4sv glColor4sv +#define qglColor4ub glColor4ub +#define qglColor4ubv glColor4ubv +#define qglColor4ui glColor4ui +#define qglColor4uiv glColor4uiv +#define qglColor4us glColor4us +#define qglColor4usv glColor4usv +#define qglColorMask glColorMask +#define qglColorMaterial glColorMaterial +#define qglColorPointer glColorPointer +#define qglCopyPixels glCopyPixels +#define qglCopyTexImage1D glCopyTexImage1D +#define qglCopyTexImage2D glCopyTexImage2D +#define qglCopyTexSubImage1D glCopyTexSubImage1D +#define qglCopyTexSubImage2D glCopyTexSubImage2D +#define qglCullFace glCullFace +#define qglDeleteLists glDeleteLists +#define qglDeleteTextures glDeleteTextures +#define qglDepthFunc glDepthFunc +#define qglDepthMask glDepthMask +#define qglDepthRange glDepthRange +#define qglDisable glDisable +#define qglDisableClientState glDisableClientState +#define qglDrawArrays glDrawArrays +#define qglDrawBuffer glDrawBuffer +#define qglDrawElements glDrawElements +#define qglDrawPixels glDrawPixels +#define qglEdgeFlag glEdgeFlag +#define qglEdgeFlagPointer glEdgeFlagPointer +#define qglEdgeFlagv glEdgeFlagv +#define qglEnable glEnable +#define qglEnableClientState glEnableClientState +#define qglEnd glEnd +#define qglEndList glEndList +#define qglEvalCoord1d glEvalCoord1d +#define qglEvalCoord1dv glEvalCoord1dv +#define qglEvalCoord1f glEvalCoord1f +#define qglEvalCoord1fv glEvalCoord1fv +#define qglEvalCoord2d glEvalCoord2d +#define qglEvalCoord2dv glEvalCoord2dv +#define qglEvalCoord2f glEvalCoord2f +#define qglEvalCoord2fv glEvalCoord2fv +#define qglEvalMesh1 glEvalMesh1 +#define qglEvalMesh2 glEvalMesh2 +#define qglEvalPoint1 glEvalPoint1 +#define qglEvalPoint2 glEvalPoint2 +#define qglFeedbackBuffer glFeedbackBuffer +#define qglFinish glFinish +#define qglFlush glFlush +#define qglFogf glFogf +#define qglFogfv glFogfv +#define qglFogi glFogi +#define qglFogiv glFogiv +#define qglFrontFace glFrontFace +#define qglFrustum glFrustum +#define qglGenLists glGenLists +#define qglGenTextures glGenTextures +#define qglGetBooleanv glGetBooleanv +#define qglGetClipPlane glGetClipPlane +#define qglGetDoublev glGetDoublev +#define qglGetError glGetError +#define qglGetFloatv glGetFloatv +#define qglGetIntegerv glGetIntegerv +#define qglGetLightfv glGetLightfv +#define qglGetLightiv glGetLightiv +#define qglGetMapdv glGetMapdv +#define qglGetMapfv glGetMapfv +#define qglGetMapiv glGetMapiv +#define qglGetMaterialfv glGetMaterialfv +#define qglGetMaterialiv glGetMaterialiv +#define qglGetPixelMapfv glGetPixelMapfv +#define qglGetPixelMapuiv glGetPixelMapuiv +#define qglGetPixelMapusv glGetPixelMapusv +#define qglGetPointerv glGetPointerv +#define qglGetPolygonStipple glGetPolygonStipple +#define qglGetString glGetString +#define qglGetTexGendv glGetTexGendv +#define qglGetTexGenfv glGetTexGenfv +#define qglGetTexGeniv glGetTexGeniv +#define qglGetTexImage glGetTexImage +#define qglGetTexLevelParameterfv glGetTexLevelParameterfv +#define qglGetTexLevelParameteriv glGetTexLevelParameteriv +#define qglGetTexParameterfv glGetTexParameterfv +#define qglGetTexParameteriv glGetTexParameteriv +#define qglHint glHint +#define qglIndexMask glIndexMask +#define qglIndexPointer glIndexPointer +#define qglIndexd glIndexd +#define qglIndexdv glIndexdv +#define qglIndexf glIndexf +#define qglIndexfv glIndexfv +#define qglIndexi glIndexi +#define qglIndexiv glIndexiv +#define qglIndexs glIndexs +#define qglIndexsv glIndexsv +#define qglIndexub glIndexub +#define qglIndexubv glIndexubv +#define qglInitNames glInitNames +#define qglInterleavedArrays glInterleavedArrays +#define qglIsEnabled glIsEnabled +#define qglIsList glIsList +#define qglIsTexture glIsTexture +#define qglLightModelf glLightModelf +#define qglLightModelfv glLightModelfv +#define qglLightModeli glLightModeli +#define qglLightModeliv glLightModeliv +#define qglLightf glLightf +#define qglLightfv glLightfv +#define qglLighti glLighti +#define qglLightiv glLightiv +#define qglLineStipple glLineStipple +#define qglLineWidth glLineWidth +#define qglListBase glListBase +#define qglLoadIdentity glLoadIdentity +#define qglLoadMatrixd glLoadMatrixd +#define qglLoadMatrixf glLoadMatrixf +#define qglLoadName glLoadName +#define qglLogicOp glLogicOp +#define qglMap1d glMap1d +#define qglMap1f glMap1f +#define qglMap2d glMap2d +#define qglMap2f glMap2f +#define qglMapGrid1d glMapGrid1d +#define qglMapGrid1f glMapGrid1f +#define qglMapGrid2d glMapGrid2d +#define qglMapGrid2f glMapGrid2f +#define qglMaterialf glMaterialf +#define qglMaterialfv glMaterialfv +#define qglMateriali glMateriali +#define qglMaterialiv glMaterialiv +#define qglMatrixMode glMatrixMode +#define qglMultMatrixd glMultMatrixd +#define qglMultMatrixf glMultMatrixf +#define qglNewList glNewList +#define qglNormal3b glNormal3b +#define qglNormal3bv glNormal3bv +#define qglNormal3d glNormal3d +#define qglNormal3dv glNormal3dv +#define qglNormal3f glNormal3f +#define qglNormal3fv glNormal3fv +#define qglNormal3i glNormal3i +#define qglNormal3iv glNormal3iv +#define qglNormal3s glNormal3s +#define qglNormal3sv glNormal3sv +#define qglNormalPointer glNormalPointer +#define qglOrtho glOrtho +#define qglPassThrough glPassThrough +#define qglPixelMapfv glPixelMapfv +#define qglPixelMapuiv glPixelMapuiv +#define qglPixelMapusv glPixelMapusv +#define qglPixelStoref glPixelStoref +#define qglPixelStorei glPixelStorei +#define qglPixelTransferf glPixelTransferf +#define qglPixelTransferi glPixelTransferi +#define qglPixelZoom glPixelZoom +#define qglPointSize glPointSize +#define qglPolygonMode glPolygonMode +#define qglPolygonOffset glPolygonOffset +#define qglPolygonStipple glPolygonStipple +#define qglPopAttrib glPopAttrib +#define qglPopClientAttrib glPopClientAttrib +#define qglPopMatrix glPopMatrix +#define qglPopName glPopName +#define qglPrioritizeTextures glPrioritizeTextures +#define qglPushAttrib glPushAttrib +#define qglPushClientAttrib glPushClientAttrib +#define qglPushMatrix glPushMatrix +#define qglPushName glPushName +#define qglRasterPos2d glRasterPos2d +#define qglRasterPos2dv glRasterPos2dv +#define qglRasterPos2f glRasterPos2f +#define qglRasterPos2fv glRasterPos2fv +#define qglRasterPos2i glRasterPos2i +#define qglRasterPos2iv glRasterPos2iv +#define qglRasterPos2s glRasterPos2s +#define qglRasterPos2sv glRasterPos2sv +#define qglRasterPos3d glRasterPos3d +#define qglRasterPos3dv glRasterPos3dv +#define qglRasterPos3f glRasterPos3f +#define qglRasterPos3fv glRasterPos3fv +#define qglRasterPos3i glRasterPos3i +#define qglRasterPos3iv glRasterPos3iv +#define qglRasterPos3s glRasterPos3s +#define qglRasterPos3sv glRasterPos3sv +#define qglRasterPos4d glRasterPos4d +#define qglRasterPos4dv glRasterPos4dv +#define qglRasterPos4f glRasterPos4f +#define qglRasterPos4fv glRasterPos4fv +#define qglRasterPos4i glRasterPos4i +#define qglRasterPos4iv glRasterPos4iv +#define qglRasterPos4s glRasterPos4s +#define qglRasterPos4sv glRasterPos4sv +#define qglReadBuffer glReadBuffer +#define qglReadPixels glReadPixels +#define qglRectd glRectd +#define qglRectdv glRectdv +#define qglRectf glRectf +#define qglRectfv glRectfv +#define qglRecti glRecti +#define qglRectiv glRectiv +#define qglRects glRects +#define qglRectsv glRectsv +#define qglRenderMode glRenderMode +#define qglRotated glRotated +#define qglRotatef glRotatef +#define qglScaled glScaled +#define qglScalef glScalef +#define qglScissor glScissor +#define qglSelectBuffer glSelectBuffer +#define qglShadeModel glShadeModel +#define qglStencilFunc glStencilFunc +#define qglStencilMask glStencilMask +#define qglStencilOp glStencilOp +#define qglTexCoord1d glTexCoord1d +#define qglTexCoord1dv glTexCoord1dv +#define qglTexCoord1f glTexCoord1f +#define qglTexCoord1fv glTexCoord1fv +#define qglTexCoord1i glTexCoord1i +#define qglTexCoord1iv glTexCoord1iv +#define qglTexCoord1s glTexCoord1s +#define qglTexCoord1sv glTexCoord1sv +#define qglTexCoord2d glTexCoord2d +#define qglTexCoord2dv glTexCoord2dv +#define qglTexCoord2f glTexCoord2f +#define qglTexCoord2fv glTexCoord2fv +#define qglTexCoord2i glTexCoord2i +#define qglTexCoord2iv glTexCoord2iv +#define qglTexCoord2s glTexCoord2s +#define qglTexCoord2sv glTexCoord2sv +#define qglTexCoord3d glTexCoord3d +#define qglTexCoord3dv glTexCoord3dv +#define qglTexCoord3f glTexCoord3f +#define qglTexCoord3fv glTexCoord3fv +#define qglTexCoord3i glTexCoord3i +#define qglTexCoord3iv glTexCoord3iv +#define qglTexCoord3s glTexCoord3s +#define qglTexCoord3sv glTexCoord3sv +#define qglTexCoord4d glTexCoord4d +#define qglTexCoord4dv glTexCoord4dv +#define qglTexCoord4f glTexCoord4f +#define qglTexCoord4fv glTexCoord4fv +#define qglTexCoord4i glTexCoord4i +#define qglTexCoord4iv glTexCoord4iv +#define qglTexCoord4s glTexCoord4s +#define qglTexCoord4sv glTexCoord4sv +#define qglTexCoordPointer glTexCoordPointer +#define qglTexEnvf glTexEnvf +#define qglTexEnvfv glTexEnvfv +#define qglTexEnvi glTexEnvi +#define qglTexEnviv glTexEnviv +#define qglTexGend glTexGend +#define qglTexGendv glTexGendv +#define qglTexGenf glTexGenf +#define qglTexGenfv glTexGenfv +#define qglTexGeni glTexGeni +#define qglTexGeniv glTexGeniv +#define qglTexImage1D glTexImage1D +#define qglTexImage2D glTexImage2D +#if defined(__APPLE__) +#define qglTexImage3D glTexImage3D #endif -#ifndef WINAPI -#define WINAPI +#define qglTexParameterf glTexParameterf +#define qglTexParameterfv glTexParameterfv +#define qglTexParameteri glTexParameteri +#define qglTexParameteriv glTexParameteriv +#define qglTexSubImage1D glTexSubImage1D +#define qglTexSubImage2D glTexSubImage2D +#if defined(__APPLE__) +#define qglTexSubImage3D glTexSubImage3D #endif - - -//=========================================================================== - -/* -** multitexture extension definitions -*/ -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_ACTIVE_TEXTURES_ARB 0x84E2 - -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 - -#define GL_TEXTURE_RECTANGLE_EXT 0x84F5 - -// TTimo: FIXME -// linux needs those prototypes -// GL_VERSION_1_2 is defined after #include -#if !defined(GL_VERSION_1_2) || defined(__linux__) -typedef void (APIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum target); -typedef void (APIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum target); -#endif - - -// Steps to adding a new extension: -// - Add the typedef and function pointer externs here. -// - Define the function pointer in tr_init.cpp and possibly add a cvar to track your ext status. -// - Load the extension in win_glimp.cpp. - - -///////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Register Combiner extension definitions. - AReis -/***********************************************************************************************************/ -// NOTE: These are obviously not all the regcom flags. I'm only including the ones I use (to reduce code clutter), so -// if you need any of the other flags, just add them. -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_DISCARD_NV 0x8530 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 - -typedef void (APIENTRY *PFNGLCOMBINERPARAMETERFVNV) (GLenum pname,const GLfloat *params); -typedef void (APIENTRY *PFNGLCOMBINERPARAMETERIVNV) (GLenum pname,const GLint *params); -typedef void (APIENTRY *PFNGLCOMBINERPARAMETERFNV) (GLenum pname,GLfloat param); -typedef void (APIENTRY *PFNGLCOMBINERPARAMETERINV) (GLenum pname,GLint param); -typedef void (APIENTRY *PFNGLCOMBINERINPUTNV) (GLenum stage,GLenum portion,GLenum variable,GLenum input,GLenum mapping, - GLenum componentUsage); -typedef void (APIENTRY *PFNGLCOMBINEROUTPUTNV) (GLenum stage,GLenum portion,GLenum abOutput,GLenum cdOutput,GLenum sumOutput, - GLenum scale, GLenum bias,GLboolean abDotProduct,GLboolean cdDotProduct, - GLboolean muxSum); -typedef void (APIENTRY *PFNGLFINALCOMBINERINPUTNV) (GLenum variable,GLenum input,GLenum mapping,GLenum componentUsage); - -typedef void (APIENTRY *PFNGLGETCOMBINERINPUTPARAMETERFVNV) (GLenum stage,GLenum portion,GLenum variable,GLenum pname,GLfloat *params); -typedef void (APIENTRY *PFNGLGETCOMBINERINPUTPARAMETERIVNV) (GLenum stage,GLenum portion,GLenum variable,GLenum pname,GLint *params); -typedef void (APIENTRY *PFNGLGETCOMBINEROUTPUTPARAMETERFVNV) (GLenum stage,GLenum portion,GLenum pname,GLfloat *params); -typedef void (APIENTRY *PFNGLGETCOMBINEROUTPUTPARAMETERIVNV) (GLenum stage,GLenum portion,GLenum pname,GLint *params); -typedef void (APIENTRY *PFNGLGETFINALCOMBINERINPUTPARAMETERFVNV) (GLenum variable,GLenum pname,GLfloat *params); -typedef void (APIENTRY *PFNGLGETFINALCOMBINERINPUTPARAMETERIVNV) (GLenum variable,GLenum pname,GLint *params); -/***********************************************************************************************************/ - -// Declare Register Combiners function pointers. -extern PFNGLCOMBINERPARAMETERFVNV qglCombinerParameterfvNV; -extern PFNGLCOMBINERPARAMETERIVNV qglCombinerParameterivNV; -extern PFNGLCOMBINERPARAMETERFNV qglCombinerParameterfNV; -extern PFNGLCOMBINERPARAMETERINV qglCombinerParameteriNV; -extern PFNGLCOMBINERINPUTNV qglCombinerInputNV; -extern PFNGLCOMBINEROUTPUTNV qglCombinerOutputNV; -extern PFNGLFINALCOMBINERINPUTNV qglFinalCombinerInputNV; -extern PFNGLGETCOMBINERINPUTPARAMETERFVNV qglGetCombinerInputParameterfvNV; -extern PFNGLGETCOMBINERINPUTPARAMETERIVNV qglGetCombinerInputParameterivNV; -extern PFNGLGETCOMBINEROUTPUTPARAMETERFVNV qglGetCombinerOutputParameterfvNV; -extern PFNGLGETCOMBINEROUTPUTPARAMETERIVNV qglGetCombinerOutputParameterivNV; -extern PFNGLGETFINALCOMBINERINPUTPARAMETERFVNV qglGetFinalCombinerInputParameterfvNV; -extern PFNGLGETFINALCOMBINERINPUTPARAMETERIVNV qglGetFinalCombinerInputParameterivNV; - - -#ifdef _WIN32 - -///////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Pixel Format extension definitions. - AReis -/***********************************************************************************************************/ -#define WGL_COLOR_BITS_ARB 0x2014 -#define WGL_ALPHA_BITS_ARB 0x201B -#define WGL_DEPTH_BITS_ARB 0x2022 -#define WGL_STENCIL_BITS_ARB 0x2023 - -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); -typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); -/***********************************************************************************************************/ - -// Declare Pixel Format function pointers. -extern PFNWGLGETPIXELFORMATATTRIBIVARBPROC qwglGetPixelFormatAttribivARB; -extern PFNWGLGETPIXELFORMATATTRIBFVARBPROC qwglGetPixelFormatAttribfvARB; -extern PFNWGLCHOOSEPIXELFORMATARBPROC qwglChoosePixelFormatARB; - - -///////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Pixel Buffer extension definitions. - AReis -/***********************************************************************************************************/ -DECLARE_HANDLE(HPBUFFERARB); - -#define WGL_SUPPORT_OPENGL_ARB 0x2010 -#define WGL_DOUBLE_BUFFER_ARB 0x2011 -#define WGL_DRAW_TO_PBUFFER_ARB 0x202D -#define WGL_PBUFFER_WIDTH_ARB 0x2034 -#define WGL_PBUFFER_HEIGHT_ARB 0x2035 -#define WGL_RED_BITS_ARB 0x2015 -#define WGL_GREEN_BITS_ARB 0x2017 -#define WGL_BLUE_BITS_ARB 0x2019 - -typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); -typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); -typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); -typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); -typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue); -/***********************************************************************************************************/ - -// Declare Pixel Buffer function pointers. -extern PFNWGLCREATEPBUFFERARBPROC qwglCreatePbufferARB; -extern PFNWGLGETPBUFFERDCARBPROC qwglGetPbufferDCARB; -extern PFNWGLRELEASEPBUFFERDCARBPROC qwglReleasePbufferDCARB; -extern PFNWGLDESTROYPBUFFERARBPROC qwglDestroyPbufferARB; -extern PFNWGLQUERYPBUFFERARBPROC qwglQueryPbufferARB; - - -///////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Render-Texture extension definitions. - AReis -/***********************************************************************************************************/ -#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 -#define WGL_TEXTURE_FORMAT_ARB 0x2072 -#define WGL_TEXTURE_TARGET_ARB 0x2073 -#define WGL_TEXTURE_RGB_ARB 0x2075 -#define WGL_TEXTURE_RGBA_ARB 0x2076 -#define WGL_TEXTURE_2D_ARB 0x207A -#define WGL_FRONT_LEFT_ARB 0x2083 - -typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); -typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); -typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int * piAttribList); -/***********************************************************************************************************/ - -// Declare Render-Texture function pointers. -extern PFNWGLBINDTEXIMAGEARBPROC qwglBindTexImageARB; -extern PFNWGLRELEASETEXIMAGEARBPROC qwglReleaseTexImageARB; -extern PFNWGLSETPBUFFERATTRIBARBPROC qwglSetPbufferAttribARB; - -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Vertex and Fragment Program extension definitions. - AReis -/***********************************************************************************************************/ -#ifndef GL_ARB_fragment_program -#define GL_FRAGMENT_PROGRAM_ARB 0x8804 -#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 -#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 -#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 -#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 -#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 -#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A -#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B -#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C -#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D -#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E -#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F -#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 -#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#define qglTranslated glTranslated +#define qglTranslatef glTranslatef +#define qglVertex2d glVertex2d +#define qglVertex2dv glVertex2dv +#define qglVertex2f glVertex2f +#define qglVertex2fv glVertex2fv +#define qglVertex2i glVertex2i +#define qglVertex2iv glVertex2iv +#define qglVertex2s glVertex2s +#define qglVertex2sv glVertex2sv +#define qglVertex3d glVertex3d +#define qglVertex3dv glVertex3dv +#define qglVertex3f glVertex3f +#define qglVertex3fv glVertex3fv +#define qglVertex3i glVertex3i +#define qglVertex3iv glVertex3iv +#define qglVertex3s glVertex3s +#define qglVertex3sv glVertex3sv +#define qglVertex4d glVertex4d +#define qglVertex4dv glVertex4dv +#define qglVertex4f glVertex4f +#define qglVertex4fv glVertex4fv +#define qglVertex4i glVertex4i +#define qglVertex4iv glVertex4iv +#define qglVertex4s glVertex4s +#define qglVertex4sv glVertex4sv +#define qglVertexPointer glVertexPointer +#define qglViewport glViewport + +extern PFNGLACTIVETEXTUREARBPROC qglActiveTextureARB; +extern PFNGLCLIENTACTIVETEXTUREARBPROC qglClientActiveTextureARB; +extern PFNGLMULTITEXCOORD2FARBPROC qglMultiTexCoord2fARB; +#if !defined(__APPLE__) +extern PFNGLTEXIMAGE3DPROC qglTexImage3D; +extern PFNGLTEXSUBIMAGE3DPROC qglTexSubImage3D; #endif -// NOTE: These are obviously not all the vertex program flags (have you seen how many there actually are!). I'm -// only including the ones I use (to reduce code clutter), so if you need any of the other flags, just add them. -#define GL_VERTEX_PROGRAM_ARB 0x8620 -#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 - -typedef void (APIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); -typedef void (APIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); -typedef void (APIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); -typedef void (APIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); -typedef GLboolean (APIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program); -/***********************************************************************************************************/ +extern PFNGLCOMBINERPARAMETERFVNVPROC qglCombinerParameterfvNV; +extern PFNGLCOMBINERPARAMETERIVNVPROC qglCombinerParameterivNV; +extern PFNGLCOMBINERPARAMETERFNVPROC qglCombinerParameterfNV; +extern PFNGLCOMBINERPARAMETERINVPROC qglCombinerParameteriNV; +extern PFNGLCOMBINERINPUTNVPROC qglCombinerInputNV; +extern PFNGLCOMBINEROUTPUTNVPROC qglCombinerOutputNV; + +extern PFNGLFINALCOMBINERINPUTNVPROC qglFinalCombinerInputNV; +extern PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC qglGetCombinerInputParameterfvNV; +extern PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC qglGetCombinerInputParameterivNV; +extern PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC qglGetCombinerOutputParameterfvNV; +extern PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC qglGetCombinerOutputParameterivNV; +extern PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC qglGetFinalCombinerInputParameterfvNV; +extern PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC qglGetFinalCombinerInputParameterivNV; -// Declare Vertex and Fragment Program function pointers. extern PFNGLPROGRAMSTRINGARBPROC qglProgramStringARB; extern PFNGLBINDPROGRAMARBPROC qglBindProgramARB; extern PFNGLDELETEPROGRAMSARBPROC qglDeleteProgramsARB; @@ -323,423 +435,5 @@ extern PFNGLGETPROGRAMIVARBPROC qglGetProgramivARB; extern PFNGLGETPROGRAMSTRINGARBPROC qglGetProgramStringARB; extern PFNGLISPROGRAMARBPROC qglIsProgramARB; - -/* -** extension constants -*/ - - -// S3TC compression constants -#define GL_RGB_S3TC 0x83A0 -#define GL_RGB4_S3TC 0x83A1 - - -// extensions will be function pointers on all platforms - -extern void ( APIENTRY * qglMultiTexCoord2fARB )( GLenum texture, GLfloat s, GLfloat t ); -extern void ( APIENTRY * qglActiveTextureARB )( GLenum texture ); -extern void ( APIENTRY * qglClientActiveTextureARB )( GLenum texture ); - -extern void ( APIENTRY * qglLockArraysEXT) (GLint, GLint); -extern void ( APIENTRY * qglUnlockArraysEXT) (void); - -//=========================================================================== - -// non-windows systems will just redefine qgl* to gl* -#if defined(MACOS_X) - // This includes #ifdefs for optional logging and GL error checking after every GL call as well as #defines to prevent incorrect usage of the non-'qgl' versions of the GL API. - #include "../macosx/macosx_qgl.h" -#else - -// windows systems use a function pointer for each call so we can load minidrivers - -extern void ( APIENTRY * qglAccum )(GLenum op, GLfloat value); -extern void ( APIENTRY * qglAlphaFunc )(GLenum func, GLclampf ref); -extern GLboolean ( APIENTRY * qglAreTexturesResident )(GLsizei n, const GLuint *textures, GLboolean *residences); -extern void ( APIENTRY * qglArrayElement )(GLint i); -extern void ( APIENTRY * qglBegin )(GLenum mode); -extern void ( APIENTRY * qglBindTexture )(GLenum target, GLuint texture); -extern void ( APIENTRY * qglBitmap )(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); -extern void ( APIENTRY * qglBlendFunc )(GLenum sfactor, GLenum dfactor); -extern void ( APIENTRY * qglCallList )(GLuint list); -extern void ( APIENTRY * qglCallLists )(GLsizei n, GLenum type, const GLvoid *lists); -extern void ( APIENTRY * qglClear )(GLbitfield mask); -extern void ( APIENTRY * qglClearAccum )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -extern void ( APIENTRY * qglClearColor )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -extern void ( APIENTRY * qglClearDepth )(GLclampd depth); -extern void ( APIENTRY * qglClearIndex )(GLfloat c); -extern void ( APIENTRY * qglClearStencil )(GLint s); -extern void ( APIENTRY * qglClipPlane )(GLenum plane, const GLdouble *equation); -extern void ( APIENTRY * qglColor3b )(GLbyte red, GLbyte green, GLbyte blue); -extern void ( APIENTRY * qglColor3bv )(const GLbyte *v); -extern void ( APIENTRY * qglColor3d )(GLdouble red, GLdouble green, GLdouble blue); -extern void ( APIENTRY * qglColor3dv )(const GLdouble *v); -extern void ( APIENTRY * qglColor3f )(GLfloat red, GLfloat green, GLfloat blue); -extern void ( APIENTRY * qglColor3fv )(const GLfloat *v); -extern void ( APIENTRY * qglColor3i )(GLint red, GLint green, GLint blue); -extern void ( APIENTRY * qglColor3iv )(const GLint *v); -extern void ( APIENTRY * qglColor3s )(GLshort red, GLshort green, GLshort blue); -extern void ( APIENTRY * qglColor3sv )(const GLshort *v); -extern void ( APIENTRY * qglColor3ub )(GLubyte red, GLubyte green, GLubyte blue); -extern void ( APIENTRY * qglColor3ubv )(const GLubyte *v); -extern void ( APIENTRY * qglColor3ui )(GLuint red, GLuint green, GLuint blue); -extern void ( APIENTRY * qglColor3uiv )(const GLuint *v); -extern void ( APIENTRY * qglColor3us )(GLushort red, GLushort green, GLushort blue); -extern void ( APIENTRY * qglColor3usv )(const GLushort *v); -extern void ( APIENTRY * qglColor4b )(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -extern void ( APIENTRY * qglColor4bv )(const GLbyte *v); -extern void ( APIENTRY * qglColor4d )(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -extern void ( APIENTRY * qglColor4dv )(const GLdouble *v); -extern void ( APIENTRY * qglColor4f )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -extern void ( APIENTRY * qglColor4fv )(const GLfloat *v); -extern void ( APIENTRY * qglColor4i )(GLint red, GLint green, GLint blue, GLint alpha); -extern void ( APIENTRY * qglColor4iv )(const GLint *v); -extern void ( APIENTRY * qglColor4s )(GLshort red, GLshort green, GLshort blue, GLshort alpha); -extern void ( APIENTRY * qglColor4sv )(const GLshort *v); -extern void ( APIENTRY * qglColor4ub )(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -extern void ( APIENTRY * qglColor4ubv )(const GLubyte *v); -extern void ( APIENTRY * qglColor4ui )(GLuint red, GLuint green, GLuint blue, GLuint alpha); -extern void ( APIENTRY * qglColor4uiv )(const GLuint *v); -extern void ( APIENTRY * qglColor4us )(GLushort red, GLushort green, GLushort blue, GLushort alpha); -extern void ( APIENTRY * qglColor4usv )(const GLushort *v); -extern void ( APIENTRY * qglColorMask )(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -extern void ( APIENTRY * qglColorMaterial )(GLenum face, GLenum mode); -extern void ( APIENTRY * qglColorPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -extern void ( APIENTRY * qglCopyPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -extern void ( APIENTRY * qglCopyTexImage1D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -extern void ( APIENTRY * qglCopyTexImage2D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -extern void ( APIENTRY * qglCopyTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -extern void ( APIENTRY * qglCopyTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -extern void ( APIENTRY * qglCullFace )(GLenum mode); -extern void ( APIENTRY * qglDeleteLists )(GLuint list, GLsizei range); -extern void ( APIENTRY * qglDeleteTextures )(GLsizei n, const GLuint *textures); -extern void ( APIENTRY * qglDepthFunc )(GLenum func); -extern void ( APIENTRY * qglDepthMask )(GLboolean flag); -extern void ( APIENTRY * qglDepthRange )(GLclampd zNear, GLclampd zFar); -extern void ( APIENTRY * qglDisable )(GLenum cap); -extern void ( APIENTRY * qglDisableClientState )(GLenum array); -extern void ( APIENTRY * qglDrawArrays )(GLenum mode, GLint first, GLsizei count); -extern void ( APIENTRY * qglDrawBuffer )(GLenum mode); -extern void ( APIENTRY * qglDrawElements )(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -extern void ( APIENTRY * qglDrawPixels )(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -extern void ( APIENTRY * qglEdgeFlag )(GLboolean flag); -extern void ( APIENTRY * qglEdgeFlagPointer )(GLsizei stride, const GLvoid *pointer); -extern void ( APIENTRY * qglEdgeFlagv )(const GLboolean *flag); -extern void ( APIENTRY * qglEnable )(GLenum cap); -extern void ( APIENTRY * qglEnableClientState )(GLenum array); -extern void ( APIENTRY * qglEnd )(void); -extern void ( APIENTRY * qglEndList )(void); -extern void ( APIENTRY * qglEvalCoord1d )(GLdouble u); -extern void ( APIENTRY * qglEvalCoord1dv )(const GLdouble *u); -extern void ( APIENTRY * qglEvalCoord1f )(GLfloat u); -extern void ( APIENTRY * qglEvalCoord1fv )(const GLfloat *u); -extern void ( APIENTRY * qglEvalCoord2d )(GLdouble u, GLdouble v); -extern void ( APIENTRY * qglEvalCoord2dv )(const GLdouble *u); -extern void ( APIENTRY * qglEvalCoord2f )(GLfloat u, GLfloat v); -extern void ( APIENTRY * qglEvalCoord2fv )(const GLfloat *u); -extern void ( APIENTRY * qglEvalMesh1 )(GLenum mode, GLint i1, GLint i2); -extern void ( APIENTRY * qglEvalMesh2 )(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -extern void ( APIENTRY * qglEvalPoint1 )(GLint i); -extern void ( APIENTRY * qglEvalPoint2 )(GLint i, GLint j); -extern void ( APIENTRY * qglFeedbackBuffer )(GLsizei size, GLenum type, GLfloat *buffer); -extern void ( APIENTRY * qglFinish )(void); -extern void ( APIENTRY * qglFlush )(void); -extern void ( APIENTRY * qglFogf )(GLenum pname, GLfloat param); -extern void ( APIENTRY * qglFogfv )(GLenum pname, const GLfloat *params); -extern void ( APIENTRY * qglFogi )(GLenum pname, GLint param); -extern void ( APIENTRY * qglFogiv )(GLenum pname, const GLint *params); -extern void ( APIENTRY * qglFrontFace )(GLenum mode); -extern void ( APIENTRY * qglFrustum )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -extern GLuint ( APIENTRY * qglGenLists )(GLsizei range); -extern void ( APIENTRY * qglGenTextures )(GLsizei n, GLuint *textures); -extern void ( APIENTRY * qglGetBooleanv )(GLenum pname, GLboolean *params); -extern void ( APIENTRY * qglGetClipPlane )(GLenum plane, GLdouble *equation); -extern void ( APIENTRY * qglGetDoublev )(GLenum pname, GLdouble *params); -extern GLenum ( APIENTRY * qglGetError )(void); -extern void ( APIENTRY * qglGetFloatv )(GLenum pname, GLfloat *params); -extern void ( APIENTRY * qglGetIntegerv )(GLenum pname, GLint *params); -extern void ( APIENTRY * qglGetLightfv )(GLenum light, GLenum pname, GLfloat *params); -extern void ( APIENTRY * qglGetLightiv )(GLenum light, GLenum pname, GLint *params); -extern void ( APIENTRY * qglGetMapdv )(GLenum target, GLenum query, GLdouble *v); -extern void ( APIENTRY * qglGetMapfv )(GLenum target, GLenum query, GLfloat *v); -extern void ( APIENTRY * qglGetMapiv )(GLenum target, GLenum query, GLint *v); -extern void ( APIENTRY * qglGetMaterialfv )(GLenum face, GLenum pname, GLfloat *params); -extern void ( APIENTRY * qglGetMaterialiv )(GLenum face, GLenum pname, GLint *params); -extern void ( APIENTRY * qglGetPixelMapfv )(GLenum map, GLfloat *values); -extern void ( APIENTRY * qglGetPixelMapuiv )(GLenum map, GLuint *values); -extern void ( APIENTRY * qglGetPixelMapusv )(GLenum map, GLushort *values); -extern void ( APIENTRY * qglGetPointerv )(GLenum pname, GLvoid* *params); -extern void ( APIENTRY * qglGetPolygonStipple )(GLubyte *mask); -extern const GLubyte * ( APIENTRY * qglGetString )(GLenum name); -extern void ( APIENTRY * qglGetTexEnvfv )(GLenum target, GLenum pname, GLfloat *params); -extern void ( APIENTRY * qglGetTexEnviv )(GLenum target, GLenum pname, GLint *params); -extern void ( APIENTRY * qglGetTexGendv )(GLenum coord, GLenum pname, GLdouble *params); -extern void ( APIENTRY * qglGetTexGenfv )(GLenum coord, GLenum pname, GLfloat *params); -extern void ( APIENTRY * qglGetTexGeniv )(GLenum coord, GLenum pname, GLint *params); -extern void ( APIENTRY * qglGetTexImage )(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -extern void ( APIENTRY * qglGetTexLevelParameterfv )(GLenum target, GLint level, GLenum pname, GLfloat *params); -extern void ( APIENTRY * qglGetTexLevelParameteriv )(GLenum target, GLint level, GLenum pname, GLint *params); -extern void ( APIENTRY * qglGetTexParameterfv )(GLenum target, GLenum pname, GLfloat *params); -extern void ( APIENTRY * qglGetTexParameteriv )(GLenum target, GLenum pname, GLint *params); -extern void ( APIENTRY * qglHint )(GLenum target, GLenum mode); -extern void ( APIENTRY * qglIndexMask )(GLuint mask); -extern void ( APIENTRY * qglIndexPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -extern void ( APIENTRY * qglIndexd )(GLdouble c); -extern void ( APIENTRY * qglIndexdv )(const GLdouble *c); -extern void ( APIENTRY * qglIndexf )(GLfloat c); -extern void ( APIENTRY * qglIndexfv )(const GLfloat *c); -extern void ( APIENTRY * qglIndexi )(GLint c); -extern void ( APIENTRY * qglIndexiv )(const GLint *c); -extern void ( APIENTRY * qglIndexs )(GLshort c); -extern void ( APIENTRY * qglIndexsv )(const GLshort *c); -extern void ( APIENTRY * qglIndexub )(GLubyte c); -extern void ( APIENTRY * qglIndexubv )(const GLubyte *c); -extern void ( APIENTRY * qglInitNames )(void); -extern void ( APIENTRY * qglInterleavedArrays )(GLenum format, GLsizei stride, const GLvoid *pointer); -extern GLboolean ( APIENTRY * qglIsEnabled )(GLenum cap); -extern GLboolean ( APIENTRY * qglIsList )(GLuint ilist); -extern GLboolean ( APIENTRY * qglIsTexture )(GLuint texture); -extern void ( APIENTRY * qglLightModelf )(GLenum pname, GLfloat param); -extern void ( APIENTRY * qglLightModelfv )(GLenum pname, const GLfloat *params); -extern void ( APIENTRY * qglLightModeli )(GLenum pname, GLint param); -extern void ( APIENTRY * qglLightModeliv )(GLenum pname, const GLint *params); -extern void ( APIENTRY * qglLightf )(GLenum light, GLenum pname, GLfloat param); -extern void ( APIENTRY * qglLightfv )(GLenum light, GLenum pname, const GLfloat *params); -extern void ( APIENTRY * qglLighti )(GLenum light, GLenum pname, GLint param); -extern void ( APIENTRY * qglLightiv )(GLenum light, GLenum pname, const GLint *params); -extern void ( APIENTRY * qglLineStipple )(GLint factor, GLushort pattern); -extern void ( APIENTRY * qglLineWidth )(GLfloat width); -extern void ( APIENTRY * qglListBase )(GLuint base); -extern void ( APIENTRY * qglLoadIdentity )(void); -extern void ( APIENTRY * qglLoadMatrixd )(const GLdouble *m); -extern void ( APIENTRY * qglLoadMatrixf )(const GLfloat *m); -extern void ( APIENTRY * qglLoadName )(GLuint name); -extern void ( APIENTRY * qglLogicOp )(GLenum opcode); -extern void ( APIENTRY * qglMap1d )(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -extern void ( APIENTRY * qglMap1f )(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -extern void ( APIENTRY * qglMap2d )(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -extern void ( APIENTRY * qglMap2f )(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -extern void ( APIENTRY * qglMapGrid1d )(GLint un, GLdouble u1, GLdouble u2); -extern void ( APIENTRY * qglMapGrid1f )(GLint un, GLfloat u1, GLfloat u2); -extern void ( APIENTRY * qglMapGrid2d )(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -extern void ( APIENTRY * qglMapGrid2f )(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -extern void ( APIENTRY * qglMaterialf )(GLenum face, GLenum pname, GLfloat param); -extern void ( APIENTRY * qglMaterialfv )(GLenum face, GLenum pname, const GLfloat *params); -extern void ( APIENTRY * qglMateriali )(GLenum face, GLenum pname, GLint param); -extern void ( APIENTRY * qglMaterialiv )(GLenum face, GLenum pname, const GLint *params); -extern void ( APIENTRY * qglMatrixMode )(GLenum mode); -extern void ( APIENTRY * qglMultMatrixd )(const GLdouble *m); -extern void ( APIENTRY * qglMultMatrixf )(const GLfloat *m); -extern void ( APIENTRY * qglNewList )(GLuint list, GLenum mode); -extern void ( APIENTRY * qglNormal3b )(GLbyte nx, GLbyte ny, GLbyte nz); -extern void ( APIENTRY * qglNormal3bv )(const GLbyte *v); -extern void ( APIENTRY * qglNormal3d )(GLdouble nx, GLdouble ny, GLdouble nz); -extern void ( APIENTRY * qglNormal3dv )(const GLdouble *v); -extern void ( APIENTRY * qglNormal3f )(GLfloat nx, GLfloat ny, GLfloat nz); -extern void ( APIENTRY * qglNormal3fv )(const GLfloat *v); -extern void ( APIENTRY * qglNormal3i )(GLint nx, GLint ny, GLint nz); -extern void ( APIENTRY * qglNormal3iv )(const GLint *v); -extern void ( APIENTRY * qglNormal3s )(GLshort nx, GLshort ny, GLshort nz); -extern void ( APIENTRY * qglNormal3sv )(const GLshort *v); -extern void ( APIENTRY * qglNormalPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -extern void ( APIENTRY * qglOrtho )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -extern void ( APIENTRY * qglPassThrough )(GLfloat token); -extern void ( APIENTRY * qglPixelMapfv )(GLenum map, GLsizei mapsize, const GLfloat *values); -extern void ( APIENTRY * qglPixelMapuiv )(GLenum map, GLsizei mapsize, const GLuint *values); -extern void ( APIENTRY * qglPixelMapusv )(GLenum map, GLsizei mapsize, const GLushort *values); -extern void ( APIENTRY * qglPixelStoref )(GLenum pname, GLfloat param); -extern void ( APIENTRY * qglPixelStorei )(GLenum pname, GLint param); -extern void ( APIENTRY * qglPixelTransferf )(GLenum pname, GLfloat param); -extern void ( APIENTRY * qglPixelTransferi )(GLenum pname, GLint param); -extern void ( APIENTRY * qglPixelZoom )(GLfloat xfactor, GLfloat yfactor); -extern void ( APIENTRY * qglPointSize )(GLfloat size); -extern void ( APIENTRY * qglPolygonMode )(GLenum face, GLenum mode); -extern void ( APIENTRY * qglPolygonOffset )(GLfloat factor, GLfloat units); -extern void ( APIENTRY * qglPolygonStipple )(const GLubyte *mask); -extern void ( APIENTRY * qglPopAttrib )(void); -extern void ( APIENTRY * qglPopClientAttrib )(void); -extern void ( APIENTRY * qglPopMatrix )(void); -extern void ( APIENTRY * qglPopName )(void); -extern void ( APIENTRY * qglPrioritizeTextures )(GLsizei n, const GLuint *textures, const GLclampf *priorities); -extern void ( APIENTRY * qglPushAttrib )(GLbitfield mask); -extern void ( APIENTRY * qglPushClientAttrib )(GLbitfield mask); -extern void ( APIENTRY * qglPushMatrix )(void); -extern void ( APIENTRY * qglPushName )(GLuint name); -extern void ( APIENTRY * qglRasterPos2d )(GLdouble x, GLdouble y); -extern void ( APIENTRY * qglRasterPos2dv )(const GLdouble *v); -extern void ( APIENTRY * qglRasterPos2f )(GLfloat x, GLfloat y); -extern void ( APIENTRY * qglRasterPos2fv )(const GLfloat *v); -extern void ( APIENTRY * qglRasterPos2i )(GLint x, GLint y); -extern void ( APIENTRY * qglRasterPos2iv )(const GLint *v); -extern void ( APIENTRY * qglRasterPos2s )(GLshort x, GLshort y); -extern void ( APIENTRY * qglRasterPos2sv )(const GLshort *v); -extern void ( APIENTRY * qglRasterPos3d )(GLdouble x, GLdouble y, GLdouble z); -extern void ( APIENTRY * qglRasterPos3dv )(const GLdouble *v); -extern void ( APIENTRY * qglRasterPos3f )(GLfloat x, GLfloat y, GLfloat z); -extern void ( APIENTRY * qglRasterPos3fv )(const GLfloat *v); -extern void ( APIENTRY * qglRasterPos3i )(GLint x, GLint y, GLint z); -extern void ( APIENTRY * qglRasterPos3iv )(const GLint *v); -extern void ( APIENTRY * qglRasterPos3s )(GLshort x, GLshort y, GLshort z); -extern void ( APIENTRY * qglRasterPos3sv )(const GLshort *v); -extern void ( APIENTRY * qglRasterPos4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -extern void ( APIENTRY * qglRasterPos4dv )(const GLdouble *v); -extern void ( APIENTRY * qglRasterPos4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -extern void ( APIENTRY * qglRasterPos4fv )(const GLfloat *v); -extern void ( APIENTRY * qglRasterPos4i )(GLint x, GLint y, GLint z, GLint w); -extern void ( APIENTRY * qglRasterPos4iv )(const GLint *v); -extern void ( APIENTRY * qglRasterPos4s )(GLshort x, GLshort y, GLshort z, GLshort w); -extern void ( APIENTRY * qglRasterPos4sv )(const GLshort *v); -extern void ( APIENTRY * qglReadBuffer )(GLenum mode); -extern void ( APIENTRY * qglReadPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); -extern void ( APIENTRY * qglRectd )(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -extern void ( APIENTRY * qglRectdv )(const GLdouble *v1, const GLdouble *v2); -extern void ( APIENTRY * qglRectf )(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -extern void ( APIENTRY * qglRectfv )(const GLfloat *v1, const GLfloat *v2); -extern void ( APIENTRY * qglRecti )(GLint x1, GLint y1, GLint x2, GLint y2); -extern void ( APIENTRY * qglRectiv )(const GLint *v1, const GLint *v2); -extern void ( APIENTRY * qglRects )(GLshort x1, GLshort y1, GLshort x2, GLshort y2); -extern void ( APIENTRY * qglRectsv )(const GLshort *v1, const GLshort *v2); -extern GLint ( APIENTRY * qglRenderMode )(GLenum mode); -extern void ( APIENTRY * qglRotated )(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -extern void ( APIENTRY * qglRotatef )(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -extern void ( APIENTRY * qglScaled )(GLdouble x, GLdouble y, GLdouble z); -extern void ( APIENTRY * qglScalef )(GLfloat x, GLfloat y, GLfloat z); -extern void ( APIENTRY * qglScissor )(GLint x, GLint y, GLsizei width, GLsizei height); -extern void ( APIENTRY * qglSelectBuffer )(GLsizei size, GLuint *buffer); -extern void ( APIENTRY * qglShadeModel )(GLenum mode); -extern void ( APIENTRY * qglStencilFunc )(GLenum func, GLint ref, GLuint mask); -extern void ( APIENTRY * qglStencilMask )(GLuint mask); -extern void ( APIENTRY * qglStencilOp )(GLenum fail, GLenum zfail, GLenum zpass); -extern void ( APIENTRY * qglTexCoord1d )(GLdouble s); -extern void ( APIENTRY * qglTexCoord1dv )(const GLdouble *v); -extern void ( APIENTRY * qglTexCoord1f )(GLfloat s); -extern void ( APIENTRY * qglTexCoord1fv )(const GLfloat *v); -extern void ( APIENTRY * qglTexCoord1i )(GLint s); -extern void ( APIENTRY * qglTexCoord1iv )(const GLint *v); -extern void ( APIENTRY * qglTexCoord1s )(GLshort s); -extern void ( APIENTRY * qglTexCoord1sv )(const GLshort *v); -extern void ( APIENTRY * qglTexCoord2d )(GLdouble s, GLdouble t); -extern void ( APIENTRY * qglTexCoord2dv )(const GLdouble *v); -extern void ( APIENTRY * qglTexCoord2f )(GLfloat s, GLfloat t); -extern void ( APIENTRY * qglTexCoord2fv )(const GLfloat *v); -extern void ( APIENTRY * qglTexCoord2i )(GLint s, GLint t); -extern void ( APIENTRY * qglTexCoord2iv )(const GLint *v); -extern void ( APIENTRY * qglTexCoord2s )(GLshort s, GLshort t); -extern void ( APIENTRY * qglTexCoord2sv )(const GLshort *v); -extern void ( APIENTRY * qglTexCoord3d )(GLdouble s, GLdouble t, GLdouble r); -extern void ( APIENTRY * qglTexCoord3dv )(const GLdouble *v); -extern void ( APIENTRY * qglTexCoord3f )(GLfloat s, GLfloat t, GLfloat r); -extern void ( APIENTRY * qglTexCoord3fv )(const GLfloat *v); -extern void ( APIENTRY * qglTexCoord3i )(GLint s, GLint t, GLint r); -extern void ( APIENTRY * qglTexCoord3iv )(const GLint *v); -extern void ( APIENTRY * qglTexCoord3s )(GLshort s, GLshort t, GLshort r); -extern void ( APIENTRY * qglTexCoord3sv )(const GLshort *v); -extern void ( APIENTRY * qglTexCoord4d )(GLdouble s, GLdouble t, GLdouble r, GLdouble q); -extern void ( APIENTRY * qglTexCoord4dv )(const GLdouble *v); -extern void ( APIENTRY * qglTexCoord4f )(GLfloat s, GLfloat t, GLfloat r, GLfloat q); -extern void ( APIENTRY * qglTexCoord4fv )(const GLfloat *v); -extern void ( APIENTRY * qglTexCoord4i )(GLint s, GLint t, GLint r, GLint q); -extern void ( APIENTRY * qglTexCoord4iv )(const GLint *v); -extern void ( APIENTRY * qglTexCoord4s )(GLshort s, GLshort t, GLshort r, GLshort q); -extern void ( APIENTRY * qglTexCoord4sv )(const GLshort *v); -extern void ( APIENTRY * qglTexCoordPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -extern void ( APIENTRY * qglTexEnvf )(GLenum target, GLenum pname, GLfloat param); -extern void ( APIENTRY * qglTexEnvfv )(GLenum target, GLenum pname, const GLfloat *params); -extern void ( APIENTRY * qglTexEnvi )(GLenum target, GLenum pname, GLint param); -extern void ( APIENTRY * qglTexEnviv )(GLenum target, GLenum pname, const GLint *params); -extern void ( APIENTRY * qglTexGend )(GLenum coord, GLenum pname, GLdouble param); -extern void ( APIENTRY * qglTexGendv )(GLenum coord, GLenum pname, const GLdouble *params); -extern void ( APIENTRY * qglTexGenf )(GLenum coord, GLenum pname, GLfloat param); -extern void ( APIENTRY * qglTexGenfv )(GLenum coord, GLenum pname, const GLfloat *params); -extern void ( APIENTRY * qglTexGeni )(GLenum coord, GLenum pname, GLint param); -extern void ( APIENTRY * qglTexGeniv )(GLenum coord, GLenum pname, const GLint *params); -extern void ( APIENTRY * qglTexImage1D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -extern void ( APIENTRY * qglTexImage2D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -extern void ( APIENTRY * qglTexParameterf )(GLenum target, GLenum pname, GLfloat param); -extern void ( APIENTRY * qglTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params); -extern void ( APIENTRY * qglTexParameteri )(GLenum target, GLenum pname, GLint param); -extern void ( APIENTRY * qglTexParameteriv )(GLenum target, GLenum pname, const GLint *params); -extern void ( APIENTRY * qglTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -extern void ( APIENTRY * qglTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -extern void ( APIENTRY * qglTranslated )(GLdouble x, GLdouble y, GLdouble z); -extern void ( APIENTRY * qglTranslatef )(GLfloat x, GLfloat y, GLfloat z); -extern void ( APIENTRY * qglVertex2d )(GLdouble x, GLdouble y); -extern void ( APIENTRY * qglVertex2dv )(const GLdouble *v); -extern void ( APIENTRY * qglVertex2f )(GLfloat x, GLfloat y); -extern void ( APIENTRY * qglVertex2fv )(const GLfloat *v); -extern void ( APIENTRY * qglVertex2i )(GLint x, GLint y); -extern void ( APIENTRY * qglVertex2iv )(const GLint *v); -extern void ( APIENTRY * qglVertex2s )(GLshort x, GLshort y); -extern void ( APIENTRY * qglVertex2sv )(const GLshort *v); -extern void ( APIENTRY * qglVertex3d )(GLdouble x, GLdouble y, GLdouble z); -extern void ( APIENTRY * qglVertex3dv )(const GLdouble *v); -extern void ( APIENTRY * qglVertex3f )(GLfloat x, GLfloat y, GLfloat z); -extern void ( APIENTRY * qglVertex3fv )(const GLfloat *v); -extern void ( APIENTRY * qglVertex3i )(GLint x, GLint y, GLint z); -extern void ( APIENTRY * qglVertex3iv )(const GLint *v); -extern void ( APIENTRY * qglVertex3s )(GLshort x, GLshort y, GLshort z); -extern void ( APIENTRY * qglVertex3sv )(const GLshort *v); -extern void ( APIENTRY * qglVertex4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -extern void ( APIENTRY * qglVertex4dv )(const GLdouble *v); -extern void ( APIENTRY * qglVertex4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -extern void ( APIENTRY * qglVertex4fv )(const GLfloat *v); -extern void ( APIENTRY * qglVertex4i )(GLint x, GLint y, GLint z, GLint w); -extern void ( APIENTRY * qglVertex4iv )(const GLint *v); -extern void ( APIENTRY * qglVertex4s )(GLshort x, GLshort y, GLshort z, GLshort w); -extern void ( APIENTRY * qglVertex4sv )(const GLshort *v); -extern void ( APIENTRY * qglVertexPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -extern void ( APIENTRY * qglViewport )(GLint x, GLint y, GLsizei width, GLsizei height); - -#if defined( _WIN32 ) - -extern BOOL ( WINAPI * qwglCopyContext)(HGLRC, HGLRC, UINT); -extern HGLRC ( WINAPI * qwglCreateContext)(HDC); -extern HGLRC ( WINAPI * qwglCreateLayerContext)(HDC, int); -extern BOOL ( WINAPI * qwglDeleteContext)(HGLRC); -extern HGLRC ( WINAPI * qwglGetCurrentContext)(VOID); -extern HDC ( WINAPI * qwglGetCurrentDC)(VOID); -extern PROC ( WINAPI * qwglGetProcAddress)(LPCSTR); -extern BOOL ( WINAPI * qwglMakeCurrent)(HDC, HGLRC); -extern BOOL ( WINAPI * qwglShareLists)(HGLRC, HGLRC); -extern BOOL ( WINAPI * qwglUseFontBitmaps)(HDC, DWORD, DWORD, DWORD); - -extern BOOL ( WINAPI * qwglUseFontOutlines)(HDC, DWORD, DWORD, DWORD, FLOAT, - FLOAT, int, LPGLYPHMETRICSFLOAT); - -extern BOOL ( WINAPI * qwglDescribeLayerPlane)(HDC, int, int, UINT, - LPLAYERPLANEDESCRIPTOR); -extern int ( WINAPI * qwglSetLayerPaletteEntries)(HDC, int, int, int, - CONST COLORREF *); -extern int ( WINAPI * qwglGetLayerPaletteEntries)(HDC, int, int, int, - COLORREF *); -extern BOOL ( WINAPI * qwglRealizeLayerPalette)(HDC, int, BOOL); -extern BOOL ( WINAPI * qwglSwapLayerBuffers)(HDC, UINT); - -extern BOOL ( WINAPI * qwglSwapIntervalEXT)( int interval ); - -#endif // _WIN32 - -#if ( (defined __linux__ ) || (defined __FreeBSD__ ) ) // rb010123 - -//FX Mesa Functions -// bk001129 - from cvs1.17 (mkv) -#if defined (__FX__) -extern fxMesaContext (*qfxMesaCreateContext)(GLuint win, GrScreenResolution_t, GrScreenRefresh_t, const GLint attribList[]); -extern fxMesaContext (*qfxMesaCreateBestContext)(GLuint win, GLint width, GLint height, const GLint attribList[]); -extern void (*qfxMesaDestroyContext)(fxMesaContext ctx); -extern void (*qfxMesaMakeCurrent)(fxMesaContext ctx); -extern fxMesaContext (*qfxMesaGetCurrentContext)(void); -extern void (*qfxMesaSwapBuffers)(void); -#endif - -//GLX Functions -extern XVisualInfo * (*qglXChooseVisual)( Display *dpy, int screen, int *attribList ); -extern GLXContext (*qglXCreateContext)( Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct ); -extern void (*qglXDestroyContext)( Display *dpy, GLXContext ctx ); -extern Bool (*qglXMakeCurrent)( Display *dpy, GLXDrawable drawable, GLXContext ctx); -extern void (*qglXCopyContext)( Display *dpy, GLXContext src, GLXContext dst, GLuint mask ); -extern void (*qglXSwapBuffers)( Display *dpy, GLXDrawable drawable ); - -#endif // __linux__ || __FreeBSD__ // rb010123 - -#endif // _WIN32 && __linux__ +extern PFNGLLOCKARRAYSEXTPROC qglLockArraysEXT; +extern PFNGLUNLOCKARRAYSEXTPROC qglUnlockArraysEXT; diff --git a/codemp/rd-vanilla/tr_WorldEffects.cpp b/codemp/rd-vanilla/tr_WorldEffects.cpp index 66ee399865..e8efaff306 100644 --- a/codemp/rd-vanilla/tr_WorldEffects.cpp +++ b/codemp/rd-vanilla/tr_WorldEffects.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + //////////////////////////////////////////////////////////////////////////////////////// // RAVEN SOFTWARE - STAR WARS: JK II // (c) 2002 Activision @@ -17,9 +39,7 @@ #include "Ratl/vector_vs.h" #include "Ratl/bits_vs.h" -#ifdef _WIN32 #include "glext.h" -#endif //////////////////////////////////////////////////////////////////////////////////////// // Defines @@ -50,10 +70,6 @@ int mParticlesRendered; //////////////////////////////////////////////////////////////////////////////////////// // Handy Functions //////////////////////////////////////////////////////////////////////////////////////// -#ifdef _MSC_VER -#pragma warning( disable : 4512 ) -#endif - // Returns a float min <= x < max (exclusive; will get max - 0.00001; but never max) inline float WE_flrand(float min, float max) { return ((rand() * (max - min)) / (RAND_MAX)) + min; diff --git a/codemp/rd-vanilla/tr_WorldEffects.h b/codemp/rd-vanilla/tr_WorldEffects.h index 31eab172a5..3aee6d348d 100644 --- a/codemp/rd-vanilla/tr_WorldEffects.h +++ b/codemp/rd-vanilla/tr_WorldEffects.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once void R_InitWorldEffects(void); diff --git a/codemp/rd-vanilla/tr_arb.cpp b/codemp/rd-vanilla/tr_arb.cpp index 9a9906ab1d..5f12c09996 100644 --- a/codemp/rd-vanilla/tr_arb.cpp +++ b/codemp/rd-vanilla/tr_arb.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_arb.c -- this file deals with the arb shaders for dynamic glow #include "tr_local.h" @@ -85,25 +107,40 @@ const unsigned char g_strGlowPShaderARB[] = \ END" }; + +static const char *gammaCorrectVtxShader = +"!!ARBvp1.0\ +MOV result.position, vertex.position;\ +MOV result.texcoord[0], vertex.texcoord[0];\ +END"; + +static const char *gammaCorrectPxShader = +"!!ARBfp1.0\ +TEMP r0;\ +TEX r0, fragment.texcoord[0], texture[0], RECT;\ +TEX result.color, r0, texture[1], 3D;\ +END"; /***********************************************************************************************************/ #define GL_PROGRAM_ERROR_STRING_ARB 0x8874 #define GL_PROGRAM_ERROR_POSITION_ARB 0x864B -void ARB_InitGlowShaders(void) { - // Allocate and Load the global 'Glow' Vertex Program. - AReis - if ( qglGenProgramsARB ) +void ARB_InitGPUShaders(void) { + if ( !qglGenProgramsARB ) { - qglGenProgramsARB( 1, &tr.glowVShader ); - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, tr.glowVShader ); - qglProgramStringARB( GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, ( GLsizei ) strlen( ( char * ) g_strGlowVShaderARB ), g_strGlowVShaderARB ); - -// const GLubyte *strErr = qglGetString( GL_PROGRAM_ERROR_STRING_ARB ); - int iErrPos = 0; - qglGetIntegerv( GL_PROGRAM_ERROR_POSITION_ARB, &iErrPos ); - assert( iErrPos == -1 ); + return; } + // Allocate and Load the global 'Glow' Vertex Program. - AReis + qglGenProgramsARB( 1, &tr.glowVShader ); + qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, tr.glowVShader ); + qglProgramStringARB( GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, ( GLsizei ) strlen( ( char * ) g_strGlowVShaderARB ), g_strGlowVShaderARB ); + +// const GLubyte *strErr = qglGetString( GL_PROGRAM_ERROR_STRING_ARB ); + int iErrPos = 0; + qglGetIntegerv( GL_PROGRAM_ERROR_POSITION_ARB, &iErrPos ); + assert( iErrPos == -1 ); + // NOTE: I make an assumption here. If you have (current) nvidia hardware, you obviously support register combiners instead of fragment // programs, so use those. The problem with this is that nv30 WILL support fragment shaders, breaking this logic. The good thing is that // if you always ask for regcoms before fragment shaders, you'll always just use regcoms (problem solved... for now). - AReis @@ -156,7 +193,7 @@ void ARB_InitGlowShaders(void) { qglFinalCombinerInputNV( GL_VARIABLE_D_NV, GL_SPARE1_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); qglEndList(); } - else if ( qglGenProgramsARB ) + else { qglGenProgramsARB( 1, &tr.glowPShader ); qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, tr.glowPShader ); @@ -167,4 +204,29 @@ void ARB_InitGlowShaders(void) { qglGetIntegerv( GL_PROGRAM_ERROR_POSITION_ARB, &iErrPos ); assert( iErrPos == -1 ); } + + qglGenProgramsARB(1, &tr.gammaCorrectVtxShader); + qglBindProgramARB(GL_VERTEX_PROGRAM_ARB, tr.gammaCorrectVtxShader); + qglProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(gammaCorrectVtxShader), gammaCorrectVtxShader); + + int errorChar; + qglGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorChar); + if ( errorChar != -1 ) + { + Com_Printf(S_COLOR_RED "ERROR: Failed to compile gamma correction vertex shader. Error at character %d\n", errorChar); + glConfigExt.doGammaCorrectionWithShaders = qfalse; + } + else + { + qglGenProgramsARB(1, &tr.gammaCorrectPxShader); + qglBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, tr.gammaCorrectPxShader); + qglProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(gammaCorrectPxShader), gammaCorrectPxShader); + + qglGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorChar); + if ( errorChar != -1 ) + { + Com_Printf(S_COLOR_RED "Failed to compile gamma correction pixel shader. Error at character %d\n", errorChar); + glConfigExt.doGammaCorrectionWithShaders = qfalse; + } + } } diff --git a/codemp/rd-vanilla/tr_backend.cpp b/codemp/rd-vanilla/tr_backend.cpp index 9ef4971262..eb6ee3f80a 100644 --- a/codemp/rd-vanilla/tr_backend.cpp +++ b/codemp/rd-vanilla/tr_backend.cpp @@ -1,11 +1,29 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "tr_local.h" -#ifdef _WIN32 #include "glext.h" -#endif - -#if !defined __TR_WORLDEFFECTS_H - #include "tr_WorldEffects.h" -#endif +#include "tr_WorldEffects.h" backEndData_t *backEndData; backEndState_t backEnd; @@ -1348,10 +1366,11 @@ const void *RB_StretchPic ( const void *data ) { tess.indexes[ numIndexes + 4 ] = numVerts + 0; tess.indexes[ numIndexes + 5 ] = numVerts + 1; - *(int *)tess.vertexColors[ numVerts ] = - *(int *)tess.vertexColors[ numVerts + 1 ] = - *(int *)tess.vertexColors[ numVerts + 2 ] = - *(int *)tess.vertexColors[ numVerts + 3 ] = *(int *)backEnd.color2D; + byteAlias_t *baDest = NULL, *baSource = (byteAlias_t *)&backEnd.color2D; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 0]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 1]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 2]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 3]; baDest->ui = baSource->ui; tess.xyz[ numVerts ][0] = cmd->x; tess.xyz[ numVerts ][1] = cmd->y; @@ -1393,75 +1412,89 @@ RB_DrawRotatePic const void *RB_RotatePic ( const void *data ) { const rotatePicCommand_t *cmd; + image_t *image; shader_t *shader; - int numVerts, numIndexes; - vec3_t point, rotatedPoint; - vec3_t axis = { 0.0f, 0.0f, 1.0f }; - vec3_t xlat; cmd = (const rotatePicCommand_t *)data; - if ( !backEnd.projection2D ) { - RB_SetGL2D(); - } - shader = cmd->shader; - if ( shader != tess.shader ) { - if ( tess.numIndexes ) { - RB_EndSurface(); + image = &shader->stages[0].bundle[0].image[0]; + + if ( image ) { + if ( !backEnd.projection2D ) { + RB_SetGL2D(); } - backEnd.currentEntity = &backEnd.entity2D; - RB_BeginSurface( shader, 0 ); - } - RB_CHECKOVERFLOW( 4, 6 ); - numVerts = tess.numVertexes; - numIndexes = tess.numIndexes; + shader = cmd->shader; + if ( shader != tess.shader ) { + if ( tess.numIndexes ) { + RB_EndSurface(); + } + backEnd.currentEntity = &backEnd.entity2D; + RB_BeginSurface( shader, 0 ); + } - tess.numVertexes += 4; - tess.numIndexes += 6; + RB_CHECKOVERFLOW( 4, 6 ); + int numVerts = tess.numVertexes; + int numIndexes = tess.numIndexes; - tess.indexes[ numIndexes ] = numVerts + 3; - tess.indexes[ numIndexes + 1 ] = numVerts + 0; - tess.indexes[ numIndexes + 2 ] = numVerts + 2; - tess.indexes[ numIndexes + 3 ] = numVerts + 2; - tess.indexes[ numIndexes + 4 ] = numVerts + 0; - tess.indexes[ numIndexes + 5 ] = numVerts + 1; + float angle = DEG2RAD( cmd-> a ); + float s = sinf( angle ); + float c = cosf( angle ); - *(int *)tess.vertexColors[ numVerts ] = - *(int *)tess.vertexColors[ numVerts + 1 ] = - *(int *)tess.vertexColors[ numVerts + 2 ] = - *(int *)tess.vertexColors[ numVerts + 3 ] = *(int *)backEnd.color2D; + matrix3_t m = { + { c, s, 0.0f }, + { -s, c, 0.0f }, + { cmd->x + cmd->w, cmd->y, 1.0f } + }; - VectorSet (xlat, cmd->x + cmd->w, cmd->y, 0.0f); + tess.numVertexes += 4; + tess.numIndexes += 6; - VectorSet (point, -cmd->w, 0.0f, 0.0f); - RotatePointAroundVector (rotatedPoint, axis, point, cmd->a); - VectorAdd (rotatedPoint, xlat, tess.xyz[numVerts]); + tess.indexes[ numIndexes ] = numVerts + 3; + tess.indexes[ numIndexes + 1 ] = numVerts + 0; + tess.indexes[ numIndexes + 2 ] = numVerts + 2; + tess.indexes[ numIndexes + 3 ] = numVerts + 2; + tess.indexes[ numIndexes + 4 ] = numVerts + 0; + tess.indexes[ numIndexes + 5 ] = numVerts + 1; - tess.texCoords[ numVerts ][0][0] = cmd->s1; - tess.texCoords[ numVerts ][0][1] = cmd->t1; + byteAlias_t *baDest = NULL, *baSource = (byteAlias_t *)&backEnd.color2D; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 0]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 1]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 2]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 3]; baDest->ui = baSource->ui; - VectorSet (point, 0.0f, 0.0f, 0.0f); - RotatePointAroundVector (rotatedPoint, axis, point, cmd->a); - VectorAdd (rotatedPoint, xlat, tess.xyz[numVerts + 1]); + tess.xyz[ numVerts ][0] = m[0][0] * (-cmd->w) + m[2][0]; + tess.xyz[ numVerts ][1] = m[0][1] * (-cmd->w) + m[2][1]; + tess.xyz[ numVerts ][2] = 0; - tess.texCoords[ numVerts + 1 ][0][0] = cmd->s2; - tess.texCoords[ numVerts + 1 ][0][1] = cmd->t1; + tess.texCoords[ numVerts ][0][0] = cmd->s1; + tess.texCoords[ numVerts ][0][1] = cmd->t1; - VectorSet (point, 0.0f, cmd->h, 0.0f); - RotatePointAroundVector (rotatedPoint, axis, point, cmd->a); - VectorAdd (rotatedPoint, xlat, tess.xyz[numVerts + 2]); + tess.xyz[ numVerts + 1 ][0] = m[2][0]; + tess.xyz[ numVerts + 1 ][1] = m[2][1]; + tess.xyz[ numVerts + 1 ][2] = 0; - tess.texCoords[ numVerts + 2 ][0][0] = cmd->s2; - tess.texCoords[ numVerts + 2 ][0][1] = cmd->t2; + tess.texCoords[ numVerts + 1 ][0][0] = cmd->s2; + tess.texCoords[ numVerts + 1 ][0][1] = cmd->t1; - VectorSet (point, -cmd->w, cmd->h, 0.0f); - RotatePointAroundVector (rotatedPoint, axis, point, cmd->a); - VectorAdd (rotatedPoint, xlat, tess.xyz[numVerts + 3]); + tess.xyz[ numVerts + 2 ][0] = m[1][0] * (cmd->h) + m[2][0]; + tess.xyz[ numVerts + 2 ][1] = m[1][1] * (cmd->h) + m[2][1]; + tess.xyz[ numVerts + 2 ][2] = 0; - tess.texCoords[ numVerts + 3 ][0][0] = cmd->s1; - tess.texCoords[ numVerts + 3 ][0][1] = cmd->t2; + tess.texCoords[ numVerts + 2 ][0][0] = cmd->s2; + tess.texCoords[ numVerts + 2 ][0][1] = cmd->t2; + + tess.xyz[ numVerts + 3 ][0] = m[0][0] * (-cmd->w) + m[1][0] * (cmd->h) + m[2][0]; + tess.xyz[ numVerts + 3 ][1] = m[0][1] * (-cmd->w) + m[1][1] * (cmd->h) + m[2][1]; + tess.xyz[ numVerts + 3 ][2] = 0; + + tess.texCoords[ numVerts + 3 ][0][0] = cmd->s1; + tess.texCoords[ numVerts + 3 ][0][1] = cmd->t2; + + return (const void *)(cmd + 1); + + } return (const void *)(cmd + 1); } @@ -1474,77 +1507,101 @@ RB_DrawRotatePic2 const void *RB_RotatePic2 ( const void *data ) { const rotatePicCommand_t *cmd; + image_t *image; shader_t *shader; - int numVerts, numIndexes; - vec3_t point, rotatedPoint; - vec3_t axis = { 0.0f, 0.0f, 1.0f }; - vec3_t xlat; cmd = (const rotatePicCommand_t *)data; shader = cmd->shader; - if ( !backEnd.projection2D ) { - RB_SetGL2D(); - } + if ( shader->numUnfoggedPasses ) + { + image = &shader->stages[0].bundle[0].image[0]; - shader = cmd->shader; - if ( shader != tess.shader ) { - if ( tess.numIndexes ) { - RB_EndSurface(); - } - backEnd.currentEntity = &backEnd.entity2D; - RB_BeginSurface( shader, 0 ); - } + if ( image ) + { + if ( !backEnd.projection2D ) { + RB_SetGL2D(); + } - RB_CHECKOVERFLOW( 4, 6 ); - numVerts = tess.numVertexes; - numIndexes = tess.numIndexes; + shader = cmd->shader; + if ( shader != tess.shader ) { + if ( tess.numIndexes ) { + RB_EndSurface(); + } + backEnd.currentEntity = &backEnd.entity2D; + RB_BeginSurface( shader, 0 ); + } - tess.numVertexes += 4; - tess.numIndexes += 6; + RB_CHECKOVERFLOW( 4, 6 ); + int numVerts = tess.numVertexes; + int numIndexes = tess.numIndexes; - tess.indexes[ numIndexes ] = numVerts + 3; - tess.indexes[ numIndexes + 1 ] = numVerts + 0; - tess.indexes[ numIndexes + 2 ] = numVerts + 2; - tess.indexes[ numIndexes + 3 ] = numVerts + 2; - tess.indexes[ numIndexes + 4 ] = numVerts + 0; - tess.indexes[ numIndexes + 5 ] = numVerts + 1; + float angle = DEG2RAD( cmd-> a ); + float s = sinf( angle ); + float c = cosf( angle ); - *(int *)tess.vertexColors[ numVerts ] = - *(int *)tess.vertexColors[ numVerts + 1 ] = - *(int *)tess.vertexColors[ numVerts + 2 ] = - *(int *)tess.vertexColors[ numVerts + 3 ] = *(int *)backEnd.color2D; + matrix3_t m = { + { c, s, 0.0f }, + { -s, c, 0.0f }, + { cmd->x, cmd->y, 1.0f } + }; - VectorSet (xlat, cmd->x, cmd->y, 0.0f); + tess.numVertexes += 4; + tess.numIndexes += 6; - VectorSet (point, -cmd->w * 0.5f, -cmd->h * 0.5f, 0.0f); - RotatePointAroundVector (rotatedPoint, axis, point, -cmd->a); - VectorAdd (rotatedPoint, xlat, tess.xyz[numVerts]); + tess.indexes[ numIndexes ] = numVerts + 3; + tess.indexes[ numIndexes + 1 ] = numVerts + 0; + tess.indexes[ numIndexes + 2 ] = numVerts + 2; + tess.indexes[ numIndexes + 3 ] = numVerts + 2; + tess.indexes[ numIndexes + 4 ] = numVerts + 0; + tess.indexes[ numIndexes + 5 ] = numVerts + 1; - tess.texCoords[ numVerts ][0][0] = cmd->s1; - tess.texCoords[ numVerts ][0][1] = cmd->t1; + byteAlias_t *baDest = NULL, *baSource = (byteAlias_t *)&backEnd.color2D; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 0]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 1]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 2]; baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[numVerts + 3]; baDest->ui = baSource->ui; - VectorSet (point, cmd->w * 0.5f, -cmd->h * 0.5f, 0.0f); - RotatePointAroundVector (rotatedPoint, axis, point, -cmd->a); - VectorAdd (rotatedPoint, xlat, tess.xyz[numVerts + 1]); + tess.xyz[ numVerts ][0] = m[0][0] * (-cmd->w * 0.5f) + m[1][0] * (-cmd->h * 0.5f) + m[2][0]; + tess.xyz[ numVerts ][1] = m[0][1] * (-cmd->w * 0.5f) + m[1][1] * (-cmd->h * 0.5f) + m[2][1]; + tess.xyz[ numVerts ][2] = 0; - tess.texCoords[ numVerts + 1 ][0][0] = cmd->s2; - tess.texCoords[ numVerts + 1 ][0][1] = cmd->t1; + tess.texCoords[ numVerts ][0][0] = cmd->s1; + tess.texCoords[ numVerts ][0][1] = cmd->t1; - VectorSet (point, cmd->w * 0.5f, cmd->h * 0.5f, 0.0f); - RotatePointAroundVector (rotatedPoint, axis, point, -cmd->a); - VectorAdd (rotatedPoint, xlat, tess.xyz[numVerts + 2]); + tess.xyz[ numVerts + 1 ][0] = m[0][0] * (cmd->w * 0.5f) + m[1][0] * (-cmd->h * 0.5f) + m[2][0]; + tess.xyz[ numVerts + 1 ][1] = m[0][1] * (cmd->w * 0.5f) + m[1][1] * (-cmd->h * 0.5f) + m[2][1]; + tess.xyz[ numVerts + 1 ][2] = 0; - tess.texCoords[ numVerts + 2 ][0][0] = cmd->s2; - tess.texCoords[ numVerts + 2 ][0][1] = cmd->t2; + tess.texCoords[ numVerts + 1 ][0][0] = cmd->s2; + tess.texCoords[ numVerts + 1 ][0][1] = cmd->t1; - VectorSet (point, -cmd->w * 0.5f, cmd->h * 0.5f, 0.0f); - RotatePointAroundVector (rotatedPoint, axis, point, -cmd->a); - VectorAdd (rotatedPoint, xlat, tess.xyz[numVerts + 3]); + tess.xyz[ numVerts + 2 ][0] = m[0][0] * (cmd->w * 0.5f) + m[1][0] * (cmd->h * 0.5f) + m[2][0]; + tess.xyz[ numVerts + 2 ][1] = m[0][1] * (cmd->w * 0.5f) + m[1][1] * (cmd->h * 0.5f) + m[2][1]; + tess.xyz[ numVerts + 2 ][2] = 0; - tess.texCoords[ numVerts + 3 ][0][0] = cmd->s1; - tess.texCoords[ numVerts + 3 ][0][1] = cmd->t2; + tess.texCoords[ numVerts + 2 ][0][0] = cmd->s2; + tess.texCoords[ numVerts + 2 ][0][1] = cmd->t2; + + tess.xyz[ numVerts + 3 ][0] = m[0][0] * (-cmd->w * 0.5f) + m[1][0] * (cmd->h * 0.5f) + m[2][0]; + tess.xyz[ numVerts + 3 ][1] = m[0][1] * (-cmd->w * 0.5f) + m[1][1] * (cmd->h * 0.5f) + m[2][1]; + tess.xyz[ numVerts + 3 ][2] = 0; + + tess.texCoords[ numVerts + 3 ][0][0] = cmd->s1; + tess.texCoords[ numVerts + 3 ][0][1] = cmd->t2; + + return (const void *)(cmd + 1); + + +#if 0 + // Hmmm, this is not too cool + GL_State( GLS_DEPTHTEST_DISABLE | + GLS_SRCBLEND_SRC_ALPHA | + GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA ); +#endif + } + } return (const void *)(cmd + 1); } @@ -1585,10 +1642,10 @@ const void *RB_DrawSurfs( const void *data ) { { // Copy the normal scene to texture. qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.sceneImage ); - qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, 0, 0, glConfig.vidWidth, glConfig.vidHeight ); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.sceneImage ); + qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, 0, 0, glConfig.vidWidth, glConfig.vidHeight ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglEnable( GL_TEXTURE_2D ); // Just clear colors, but leave the depth buffer intact so we can 'share' it. @@ -1604,10 +1661,10 @@ const void *RB_DrawSurfs( const void *data ) { // Copy the glow scene to texture. qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.screenGlow ); - qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, 0, 0, glConfig.vidWidth, glConfig.vidHeight ); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.screenGlow ); + qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, 0, 0, glConfig.vidWidth, glConfig.vidHeight ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglEnable( GL_TEXTURE_2D ); // Resize the viewport to the blur texture size. @@ -1622,10 +1679,10 @@ const void *RB_DrawSurfs( const void *data ) { // Copy the finished glow scene back to texture. qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.blurImage ); - qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, 0, 0, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.blurImage ); + qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, 0, 0, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglEnable( GL_TEXTURE_2D ); // Set the viewport back to normal. @@ -1766,6 +1823,51 @@ void RB_ShowImages( void ) { // ri->Printf( PRINT_ALL, "%i msec to draw all images\n", end - start ); } +static void RB_GammaCorrectRender() +{ + qglPushAttrib(GL_CLIENT_ALL_ATTRIB_BITS); + + RB_SetGL2D(); + + // All this fixed-function texture type enabling/disabling is ludicrous :( + qglEnable(GL_TEXTURE_RECTANGLE_ARB); + GL_SelectTexture(0); + qglBindTexture(GL_TEXTURE_RECTANGLE_ARB, tr.sceneImage); + qglCopyTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, 0, 0, glConfig.vidWidth, glConfig.vidHeight, 0); + + qglEnable(GL_TEXTURE_3D); + GL_SelectTexture(1); + qglBindTexture(GL_TEXTURE_3D, tr.gammaCorrectLUTImage); + + qglBindProgramARB(GL_VERTEX_PROGRAM_ARB, tr.gammaCorrectVtxShader); + qglBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, tr.gammaCorrectPxShader); + + qglEnable(GL_VERTEX_PROGRAM_ARB); + qglEnable(GL_FRAGMENT_PROGRAM_ARB); + + qglBegin(GL_QUADS); + qglTexCoord2f(0.0f, 0.0f); + qglVertex2f(-1.0f, -1.0f); + + qglTexCoord2f(0.0f, (float)glConfig.vidHeight); + qglVertex2f(-1.0f, 1.0f); + + qglTexCoord2f((float)glConfig.vidWidth, (float)glConfig.vidHeight); + qglVertex2f( 1.0f, 1.0f); + + qglTexCoord2f((float)glConfig.vidWidth, 0.0f); + qglVertex2f( 1.0f, -1.0f); + qglEnd(); + + qglDisable(GL_VERTEX_PROGRAM_ARB); + qglDisable(GL_FRAGMENT_PROGRAM_ARB); + + qglDisable(GL_TEXTURE_3D); + GL_SelectTexture(0); + + qglPopAttrib(); +} + /* ============= @@ -1781,6 +1883,11 @@ const void *RB_SwapBuffers( const void *data ) { RB_EndSurface(); } + if ( glConfigExt.doGammaCorrectionWithShaders ) + { + RB_GammaCorrectRender(); + } + // texture swapping test if ( r_showImages->integer ) { RB_ShowImages(); @@ -1812,7 +1919,7 @@ const void *RB_SwapBuffers( const void *data ) { GLimp_LogComment( "***************** RB_SwapBuffers *****************\n\n\n" ); - GLimp_EndFrame(); + ri->WIN_Present(&window); backEnd.projection2D = qfalse; @@ -2004,21 +2111,21 @@ static inline void RB_BlurGlowTexture() GLuint uiTex = tr.screenGlow; qglActiveTextureARB( GL_TEXTURE3_ARB ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); qglActiveTextureARB( GL_TEXTURE2_ARB ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); qglActiveTextureARB( GL_TEXTURE1_ARB ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); qglActiveTextureARB(GL_TEXTURE0_ARB ); qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); ///////////////////////////////////////////////////////// // Draw the blur passes (each pass blurs it more, increasing the blur radius ). @@ -2049,24 +2156,24 @@ static inline void RB_BlurGlowTexture() uiTex = tr.blurImage; qglActiveTextureARB( GL_TEXTURE3_ARB ); qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); qglActiveTextureARB( GL_TEXTURE2_ARB ); qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); qglActiveTextureARB( GL_TEXTURE1_ARB ); qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); qglActiveTextureARB(GL_TEXTURE0_ARB ); qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); // Copy the current image over. - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex ); - qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, 0, 0, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex ); + qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, 0, 0, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); } // Draw the fullscreen quad. @@ -2084,8 +2191,8 @@ static inline void RB_BlurGlowTexture() qglVertex2f( backEnd.viewParms.viewportWidth, 0 ); qglEnd(); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.blurImage ); - qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, 0, 0, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.blurImage ); + qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, 0, 0, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); // Increase the texel offsets. // NOTE: This is possibly the most important input to the effect. Even by using an exponential function I've been able to @@ -2098,16 +2205,16 @@ static inline void RB_BlurGlowTexture() // Disable multi-texturing. qglActiveTextureARB( GL_TEXTURE3_ARB ); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglActiveTextureARB( GL_TEXTURE2_ARB ); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglActiveTextureARB( GL_TEXTURE1_ARB ); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglActiveTextureARB(GL_TEXTURE0_ARB ); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglEnable( GL_TEXTURE_2D ); qglDisable( GL_VERTEX_PROGRAM_ARB ); @@ -2143,13 +2250,13 @@ static inline void RB_DrawGlowOverlay() GL_State(0); qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); // For debug purposes. if ( r_DynamicGlow->integer != 2 ) { // Render the normal scene texture. - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.sceneImage ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.sceneImage ); qglBegin(GL_QUADS); qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); qglTexCoord2f( 0, glConfig.vidHeight ); @@ -2179,7 +2286,7 @@ static inline void RB_DrawGlowOverlay() qglEnable( GL_BLEND ); // Now additively render the glow texture. - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.blurImage ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.blurImage ); qglBegin(GL_QUADS); qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); qglTexCoord2f( 0, r_DynamicGlowHeight->integer ); @@ -2195,7 +2302,7 @@ static inline void RB_DrawGlowOverlay() qglVertex2f( glConfig.vidWidth, 0 ); qglEnd(); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglEnable( GL_TEXTURE_2D ); qglBlendFunc( GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR ); qglDisable( GL_BLEND ); @@ -2205,7 +2312,7 @@ static inline void RB_DrawGlowOverlay() /* else { int iTexWidth = glConfig.vidWidth, iTexHeight = glConfig.vidHeight; - if ( GL_TEXTURE_RECTANGLE_EXT == GL_TEXTURE_RECTANGLE_NV ) + if ( GL_TEXTURE_RECTANGLE_ARB == GL_TEXTURE_RECTANGLE_NV ) { iTexWidth = r_DynamicGlowWidth->integer; iTexHeight = r_DynamicGlowHeight->integer; @@ -2213,14 +2320,14 @@ static inline void RB_DrawGlowOverlay() qglActiveTextureARB( GL_TEXTURE1_ARB ); qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.screenGlow ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.screenGlow ); qglTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD ); qglActiveTextureARB(GL_TEXTURE0_ARB ); qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.sceneImage ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.sceneImage ); qglTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ); qglBegin(GL_QUADS); @@ -2244,11 +2351,11 @@ static inline void RB_DrawGlowOverlay() qglActiveTextureARB( GL_TEXTURE1_ARB ); qglTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglActiveTextureARB(GL_TEXTURE0_ARB ); qglTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); qglEnable( GL_TEXTURE_2D ); }*/ diff --git a/codemp/rd-vanilla/tr_bsp.cpp b/codemp/rd-vanilla/tr_bsp.cpp index 7035557160..24ae1b320a 100644 --- a/codemp/rd-vanilla/tr_bsp.cpp +++ b/codemp/rd-vanilla/tr_bsp.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_map.c #include "tr_local.h" @@ -79,7 +102,7 @@ void R_ColorShiftLightingBytes( byte in[4], byte out[4] ) { int shift, r, g, b; // shift the color data based on overbright range - shift = r_mapOverBrightBits->integer - tr.overbrightBits; + shift = Q_max( 0, r_mapOverBrightBits->integer - tr.overbrightBits ); // shift the data based on overbright range r = in[0] << shift; @@ -113,7 +136,7 @@ void R_ColorShiftLightingBytes( byte in[3] ) { int shift, r, g, b; // shift the color data based on overbright range - shift = r_mapOverBrightBits->integer - tr.overbrightBits; + shift = Q_max( 0, r_mapOverBrightBits->integer - tr.overbrightBits ); // shift the data based on overbright range r = in[0] << shift; diff --git a/codemp/rd-vanilla/tr_cmds.cpp b/codemp/rd-vanilla/tr_cmds.cpp index fc8239ac15..c7546b7dd9 100644 --- a/codemp/rd-vanilla/tr_cmds.cpp +++ b/codemp/rd-vanilla/tr_cmds.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "tr_local.h" @@ -67,9 +90,10 @@ void R_IssueRenderCommands( qboolean runPerformanceCounters ) { renderCommandList_t *cmdList; cmdList = &backEndData->commands; - assert(cmdList); // bk001205 + assert(cmdList); // add an end-of-list command - *(int *)(cmdList->cmds + cmdList->used) = RC_END_OF_LIST; + byteAlias_t *ba = (byteAlias_t *)&cmdList->cmds[cmdList->used]; + ba->ui = RC_END_OF_LIST; // clear it out, in case this is a sync and not a buffer flip cmdList->used = 0; @@ -115,7 +139,7 @@ void *R_GetCommandBuffer( int bytes ) { cmdList = &backEndData->commands; bytes = PAD(bytes, sizeof (void *)); - assert(cmdList); // bk001205 + assert(cmdList); // always leave room for the end of list command if ( cmdList->used + bytes + 4 > MAX_RENDER_COMMANDS ) { @@ -361,16 +385,18 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) { R_IssuePendingRenderCommands(); R_SetColorMappings(); + R_SetGammaCorrectionLUT(); } // check for errors if ( !r_ignoreGLErrors->integer ) { - int err; - R_IssuePendingRenderCommands(); - if ( ( err = qglGetError() ) != GL_NO_ERROR ) { +#if defined(_DEBUG) + GLenum err = qglGetError(); + if ( err != GL_NO_ERROR ) { Com_Error( ERR_FATAL, "RE_BeginFrame() - glGetError() failed (0x%x)!\n", err ); } +#endif } // diff --git a/codemp/rd-vanilla/tr_curve.cpp b/codemp/rd-vanilla/tr_curve.cpp index 5d8b8900db..bc67911d0d 100644 --- a/codemp/rd-vanilla/tr_curve.cpp +++ b/codemp/rd-vanilla/tr_curve.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "tr_local.h" /* diff --git a/codemp/rd-vanilla/tr_decals.cpp b/codemp/rd-vanilla/tr_decals.cpp index 74650c27bd..6e52131211 100644 --- a/codemp/rd-vanilla/tr_decals.cpp +++ b/codemp/rd-vanilla/tr_decals.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "tr_local.h" #define MAX_VERTS_ON_DECAL_POLY 10 diff --git a/codemp/rd-vanilla/tr_ghoul2.cpp b/codemp/rd-vanilla/tr_ghoul2.cpp index e20ecb8e44..056c704db2 100644 --- a/codemp/rd-vanilla/tr_ghoul2.cpp +++ b/codemp/rd-vanilla/tr_ghoul2.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "client/client.h" //FIXME!! EVIL - just include the definitions needed #include "tr_local.h" #include "qcommon/matcomp.h" @@ -8,9 +30,6 @@ #include "ghoul2/G2_gore.h" #endif -#ifdef _MSC_VER -#pragma warning (disable: 4512) //default assignment operator could not be gened -#endif #include "qcommon/disablewarnings.h" #define LL(x) x=LittleLong(x) @@ -299,10 +318,10 @@ class CBoneCache const model_t *mod; // these are split for better cpu cache behavior - vector mBones; - vector mFinalBones; + std::vector mBones; + std::vector mFinalBones; - vector mSmoothBones; // for render smoothing + std::vector mSmoothBones; // for render smoothing //vector mSkels; boneInfo_v *rootBoneList; @@ -2493,9 +2512,9 @@ void RenderSurfaces(CRenderSurface &RS) //also ended up just ripping right from if (RS.gore_set && drawGore) { int curTime = G2API_GetTime(tr.refdef.time); - pair::iterator,multimap::iterator> range= + std::pair::iterator,std::multimap::iterator> range= RS.gore_set->mGoreRecords.equal_range(RS.surfaceNum); - multimap::iterator k,kcur; + std::multimap::iterator k,kcur; CRenderableSurface *last=newSurf; for (k=range.first;k!=range.second;) { diff --git a/codemp/rd-vanilla/tr_image.cpp b/codemp/rd-vanilla/tr_image.cpp index 17310a404b..884a91edaf 100644 --- a/codemp/rd-vanilla/tr_image.cpp +++ b/codemp/rd-vanilla/tr_image.cpp @@ -1,18 +1,32 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_image.c #include "tr_local.h" #include "../rd-common/tr_common.h" -#ifdef _WIN32 #include "glext.h" -#endif -#ifdef _MSC_VER -#pragma warning (push, 3) //go back down to 3 for the stl include -#endif #include -#ifdef _MSC_VER -#pragma warning (pop) -#endif -using namespace std; static byte s_intensitytable[256]; static unsigned char s_gammatable[256]; @@ -304,7 +318,7 @@ void R_LightScaleTexture (unsigned *in, int inwidth, int inheight, qboolean only { if ( only_gamma ) { - if ( !glConfig.deviceSupportsGamma ) + if ( !glConfig.deviceSupportsGamma && !glConfigExt.doGammaCorrectionWithShaders ) { int i, c; byte *p; @@ -329,7 +343,7 @@ void R_LightScaleTexture (unsigned *in, int inwidth, int inheight, qboolean only c = inwidth*inheight; - if ( glConfig.deviceSupportsGamma ) + if ( glConfig.deviceSupportsGamma || glConfigExt.doGammaCorrectionWithShaders ) { for (i=0 ; i AllocatedImages_t; +typedef std::map AllocatedImages_t; AllocatedImages_t AllocatedImages; AllocatedImages_t::iterator itAllocatedImages; int giTextureBindNum = 1024; // will be set to this anyway at runtime, but wtf? @@ -568,7 +582,7 @@ static void Upload32( unsigned *data, GLuint uiTarget = GL_TEXTURE_2D; if ( bRectangle ) { - uiTarget = GL_TEXTURE_RECTANGLE_EXT; + uiTarget = GL_TEXTURE_RECTANGLE_ARB; } if (format == GL_RGBA) @@ -1020,7 +1034,7 @@ image_t *R_CreateImage( const char *name, const byte *pic, int width, int height if ( bRectangle ) { qglDisable( uiTarget ); - uiTarget = GL_TEXTURE_RECTANGLE_EXT; + uiTarget = GL_TEXTURE_RECTANGLE_ARB; qglEnable( uiTarget ); glWrapClampMode = GL_CLAMP_TO_EDGE; // default mode supported by rectangle. qglBindTexture( uiTarget, image->texnum ); @@ -1308,22 +1322,22 @@ void R_CreateBuiltinImages( void ) { // Create the scene glow image. - AReis tr.screenGlow = 1024 + giTextureBindNum++; qglDisable( GL_TEXTURE_2D ); - qglEnable( GL_TEXTURE_RECTANGLE_EXT ); - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.screenGlow ); - qglTexImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA16, glConfig.vidWidth, glConfig.vidHeight, 0, GL_RGB, GL_FLOAT, 0 ); - qglTexParameteri( GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - qglTexParameteri( GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - qglTexParameteri( GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP ); - qglTexParameteri( GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP ); + qglEnable( GL_TEXTURE_RECTANGLE_ARB ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.screenGlow ); + qglTexImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA16, glConfig.vidWidth, glConfig.vidHeight, 0, GL_RGB, GL_FLOAT, 0 ); + qglTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + qglTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + qglTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP ); + qglTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP ); // Create the scene image. - AReis tr.sceneImage = 1024 + giTextureBindNum++; - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.sceneImage ); - qglTexImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA16, glConfig.vidWidth, glConfig.vidHeight, 0, GL_RGB, GL_FLOAT, 0 ); - qglTexParameteri( GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - qglTexParameteri( GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - qglTexParameteri( GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP ); - qglTexParameteri( GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP ); + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.sceneImage ); + qglTexImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA16, glConfig.vidWidth, glConfig.vidHeight, 0, GL_RGB, GL_FLOAT, 0 ); + qglTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + qglTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + qglTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP ); + qglTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP ); // Create the minimized scene blur image. if ( r_DynamicGlowWidth->integer > glConfig.vidWidth ) @@ -1335,15 +1349,25 @@ void R_CreateBuiltinImages( void ) { r_DynamicGlowHeight->integer = glConfig.vidHeight; } tr.blurImage = 1024 + giTextureBindNum++; - qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.blurImage ); - qglTexImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA16, r_DynamicGlowWidth->integer, r_DynamicGlowHeight->integer, 0, GL_RGB, GL_FLOAT, 0 ); - qglTexParameteri( GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - qglTexParameteri( GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - qglTexParameteri( GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP ); - qglTexParameteri( GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP ); - qglDisable( GL_TEXTURE_RECTANGLE_EXT ); - qglEnable( GL_TEXTURE_2D ); - + qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.blurImage ); + qglTexImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA16, r_DynamicGlowWidth->integer, r_DynamicGlowHeight->integer, 0, GL_RGB, GL_FLOAT, 0 ); + qglTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + qglTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + qglTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP ); + qglTexParameteri( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP ); + qglDisable( GL_TEXTURE_RECTANGLE_ARB ); + qglEnable( GL_TEXTURE_3D ); + + tr.gammaCorrectLUTImage = 1024 + giTextureBindNum++; + qglBindTexture(GL_TEXTURE_3D, tr.gammaCorrectLUTImage); + qglTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 64, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + qglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + qglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + qglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + qglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + qglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + qglDisable(GL_TEXTURE_3D); + qglEnable(GL_TEXTURE_2D); // with overbright bits active, we need an image which is some fraction of full color, // for default lightmaps, etc @@ -1382,7 +1406,7 @@ void R_SetColorMappings( void ) { // setup the overbright lighting tr.overbrightBits = r_overBrightBits->integer; - if ( !glConfig.deviceSupportsGamma ) { + if ( !glConfig.deviceSupportsGamma && !glConfigExt.doGammaCorrectionWithShaders ) { tr.overbrightBits = 0; // need hardware gamma for overbright } @@ -1418,20 +1442,28 @@ void R_SetColorMappings( void ) { shift = tr.overbrightBits; - for ( i = 0; i < 256; i++ ) { - if ( g == 1 ) { - inf = i; - } else { - inf = 255 * pow ( i/255.0f, 1.0f / g ) + 0.5f; - } - inf <<= shift; - if (inf < 0) { - inf = 0; + if ( !glConfigExt.doGammaCorrectionWithShaders ) + { + for ( i = 0; i < 256; i++ ) { + if ( g == 1 ) { + inf = i; + } else { + inf = 255 * pow ( i/255.0f, 1.0f / g ) + 0.5f; + } + inf <<= shift; + if (inf < 0) { + inf = 0; + } + if (inf > 255) { + inf = 255; + } + s_gammatable[i] = inf; } - if (inf > 255) { - inf = 255; + + if ( glConfig.deviceSupportsGamma ) + { + ri->WIN_SetGamma( &glConfig, s_gammatable, s_gammatable, s_gammatable ); } - s_gammatable[i] = inf; } for (i=0 ; i<256 ; i++) { @@ -1441,10 +1473,51 @@ void R_SetColorMappings( void ) { } s_intensitytable[i] = j; } +} - if ( glConfig.deviceSupportsGamma ) +void R_SetGammaCorrectionLUT() +{ + if ( glConfigExt.doGammaCorrectionWithShaders ) { - GLimp_SetGamma( s_gammatable, s_gammatable, s_gammatable ); + int inf; + int shift = tr.overbrightBits; + float g = r_gamma->value; + byte gammaCorrected[64]; + + for ( int i = 0; i < 64; i++ ) + { + if ( g == 1.0f ) + { + inf = (int)(((float)i / 63.0f) * 255.0f + 0.5f); + } + else + { + inf = (int)(255.0f * pow((float)i / 63.0f, 1.0f / g) + 0.5f); + } + + gammaCorrected[i] = Com_Clampi(0, 255, inf << shift); + } + + byte *lutTable = (byte *)ri->Hunk_AllocateTempMemory(64 * 64 * 64 * 3); + byte *write = lutTable; + for ( int z = 0; z < 64; z++ ) + { + for ( int y = 0; y < 64; y++ ) + { + for ( int x = 0; x < 64; x++ ) + { + *write++ = gammaCorrected[x]; + *write++ = gammaCorrected[y]; + *write++ = gammaCorrected[z]; + } + } + } + + qglBindTexture(GL_TEXTURE_3D, tr.gammaCorrectLUTImage); + qglPixelStorei(GL_UNPACK_ALIGNMENT, 1); + qglTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 64, 64, 64, GL_RGB, GL_UNSIGNED_BYTE, lutTable); + + ri->Hunk_FreeTempMemory(lutTable); } } @@ -1460,6 +1533,8 @@ void R_InitImages( void ) { // create default texture and white texture R_CreateBuiltinImages(); + + R_SetGammaCorrectionLUT(); } /* diff --git a/codemp/rd-vanilla/tr_init.cpp b/codemp/rd-vanilla/tr_init.cpp index f6a17fa8ce..28da439214 100644 --- a/codemp/rd-vanilla/tr_init.cpp +++ b/codemp/rd-vanilla/tr_init.cpp @@ -1,29 +1,52 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_init.c -- functions that are not called every frame #include "tr_local.h" + +#include #include "../rd-common/tr_common.h" #include "tr_WorldEffects.h" #include "qcommon/MiniHeap.h" #include "ghoul2/g2_local.h" -#include glconfig_t glConfig; glconfigExt_t glConfigExt; glstate_t glState; +window_t window; + static void GfxInfo_f( void ); cvar_t *r_verbose; cvar_t *r_ignore; -cvar_t *r_displayRefresh; - cvar_t *r_detailTextures; cvar_t *r_znear; cvar_t *r_skipBackEnd; -cvar_t *r_ignorehwgamma; cvar_t *r_measureOverdraw; cvar_t *r_inGameVideo; @@ -91,10 +114,6 @@ cvar_t *r_DynamicGlowHeight; cvar_t *r_ignoreGLErrors; cvar_t *r_logFile; -cvar_t *r_stencilbits; -cvar_t *r_depthbits; -cvar_t *r_colorbits; -cvar_t *r_stereo; cvar_t *r_primitives; cvar_t *r_texturebits; cvar_t *r_texturebitslm; @@ -105,7 +124,6 @@ cvar_t *r_uiFullScreen; cvar_t *r_shadows; cvar_t *r_shadowRange; cvar_t *r_flares; -cvar_t *r_mode; cvar_t *r_nobind; cvar_t *r_singleShader; cvar_t *r_colorMipLevels; @@ -115,7 +133,6 @@ cvar_t *r_showsky; cvar_t *r_shownormals; cvar_t *r_finish; cvar_t *r_clear; -cvar_t *r_swapInterval; cvar_t *r_markcount; cvar_t *r_textureMode; cvar_t *r_offsetFactor; @@ -129,12 +146,7 @@ cvar_t *r_portalOnly; cvar_t *r_subdivisions; cvar_t *r_lodCurveError; -cvar_t *r_fullscreen = 0; -cvar_t *r_noborder; -cvar_t *r_centerWindow; -cvar_t *r_customwidth; -cvar_t *r_customheight; cvar_t *r_overBrightBits; cvar_t *r_mapOverBrightBits; @@ -202,71 +214,55 @@ cvar_t *se_language; cvar_t *r_aviMotionJpegQuality; cvar_t *r_screenshotJpegQuality; -#ifdef _WIN32 -void ( APIENTRY * qglMultiTexCoord2fARB )( GLenum texture, GLfloat s, GLfloat t ); -void ( APIENTRY * qglActiveTextureARB )( GLenum texture ); -void ( APIENTRY * qglClientActiveTextureARB )( GLenum texture ); - -void ( APIENTRY * qglLockArraysEXT)( GLint, GLint); -void ( APIENTRY * qglUnlockArraysEXT) ( void ); - - -// Declare Register Combiners function pointers. -PFNGLCOMBINERPARAMETERFVNV qglCombinerParameterfvNV = NULL; -PFNGLCOMBINERPARAMETERIVNV qglCombinerParameterivNV = NULL; -PFNGLCOMBINERPARAMETERFNV qglCombinerParameterfNV = NULL; -PFNGLCOMBINERPARAMETERINV qglCombinerParameteriNV = NULL; -PFNGLCOMBINERINPUTNV qglCombinerInputNV = NULL; -PFNGLCOMBINEROUTPUTNV qglCombinerOutputNV = NULL; -PFNGLFINALCOMBINERINPUTNV qglFinalCombinerInputNV = NULL; -PFNGLGETCOMBINERINPUTPARAMETERFVNV qglGetCombinerInputParameterfvNV = NULL; -PFNGLGETCOMBINERINPUTPARAMETERIVNV qglGetCombinerInputParameterivNV = NULL; -PFNGLGETCOMBINEROUTPUTPARAMETERFVNV qglGetCombinerOutputParameterfvNV = NULL; -PFNGLGETCOMBINEROUTPUTPARAMETERIVNV qglGetCombinerOutputParameterivNV = NULL; -PFNGLGETFINALCOMBINERINPUTPARAMETERFVNV qglGetFinalCombinerInputParameterfvNV = NULL; -PFNGLGETFINALCOMBINERINPUTPARAMETERIVNV qglGetFinalCombinerInputParameterivNV = NULL; - -// Declare Pixel Format function pointers. -PFNWGLGETPIXELFORMATATTRIBIVARBPROC qwglGetPixelFormatAttribivARB = NULL; -PFNWGLGETPIXELFORMATATTRIBFVARBPROC qwglGetPixelFormatAttribfvARB = NULL; -PFNWGLCHOOSEPIXELFORMATARBPROC qwglChoosePixelFormatARB = NULL; - -// Declare Pixel Buffer function pointers. -PFNWGLCREATEPBUFFERARBPROC qwglCreatePbufferARB = NULL; -PFNWGLGETPBUFFERDCARBPROC qwglGetPbufferDCARB = NULL; -PFNWGLRELEASEPBUFFERDCARBPROC qwglReleasePbufferDCARB = NULL; -PFNWGLDESTROYPBUFFERARBPROC qwglDestroyPbufferARB = NULL; -PFNWGLQUERYPBUFFERARBPROC qwglQueryPbufferARB = NULL; - -// Declare Render-Texture function pointers. -PFNWGLBINDTEXIMAGEARBPROC qwglBindTexImageARB = NULL; -PFNWGLRELEASETEXIMAGEARBPROC qwglReleaseTexImageARB = NULL; -PFNWGLSETPBUFFERATTRIBARBPROC qwglSetPbufferAttribARB = NULL; - -// Declare Vertex and Fragment Program function pointers. -PFNGLPROGRAMSTRINGARBPROC qglProgramStringARB = NULL; -PFNGLBINDPROGRAMARBPROC qglBindProgramARB = NULL; -PFNGLDELETEPROGRAMSARBPROC qglDeleteProgramsARB = NULL; -PFNGLGENPROGRAMSARBPROC qglGenProgramsARB = NULL; -PFNGLPROGRAMENVPARAMETER4DARBPROC qglProgramEnvParameter4dARB = NULL; -PFNGLPROGRAMENVPARAMETER4DVARBPROC qglProgramEnvParameter4dvARB = NULL; -PFNGLPROGRAMENVPARAMETER4FARBPROC qglProgramEnvParameter4fARB = NULL; -PFNGLPROGRAMENVPARAMETER4FVARBPROC qglProgramEnvParameter4fvARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4DARBPROC qglProgramLocalParameter4dARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4DVARBPROC qglProgramLocalParameter4dvARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4FARBPROC qglProgramLocalParameter4fARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4FVARBPROC qglProgramLocalParameter4fvARB = NULL; -PFNGLGETPROGRAMENVPARAMETERDVARBPROC qglGetProgramEnvParameterdvARB = NULL; -PFNGLGETPROGRAMENVPARAMETERFVARBPROC qglGetProgramEnvParameterfvARB = NULL; -PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC qglGetProgramLocalParameterdvARB = NULL; -PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC qglGetProgramLocalParameterfvARB = NULL; -PFNGLGETPROGRAMIVARBPROC qglGetProgramivARB = NULL; -PFNGLGETPROGRAMSTRINGARBPROC qglGetProgramStringARB = NULL; -PFNGLISPROGRAMARBPROC qglIsProgramARB = NULL; +PFNGLACTIVETEXTUREARBPROC qglActiveTextureARB; +PFNGLCLIENTACTIVETEXTUREARBPROC qglClientActiveTextureARB; +PFNGLMULTITEXCOORD2FARBPROC qglMultiTexCoord2fARB; +#if !defined(__APPLE__) +PFNGLTEXIMAGE3DPROC qglTexImage3D; +PFNGLTEXSUBIMAGE3DPROC qglTexSubImage3D; #endif -void RE_SetLightStyle(int style, int color); +PFNGLCOMBINERPARAMETERFVNVPROC qglCombinerParameterfvNV; +PFNGLCOMBINERPARAMETERIVNVPROC qglCombinerParameterivNV; +PFNGLCOMBINERPARAMETERFNVPROC qglCombinerParameterfNV; +PFNGLCOMBINERPARAMETERINVPROC qglCombinerParameteriNV; +PFNGLCOMBINERINPUTNVPROC qglCombinerInputNV; +PFNGLCOMBINEROUTPUTNVPROC qglCombinerOutputNV; + +PFNGLFINALCOMBINERINPUTNVPROC qglFinalCombinerInputNV; +PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC qglGetCombinerInputParameterfvNV; +PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC qglGetCombinerInputParameterivNV; +PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC qglGetCombinerOutputParameterfvNV; +PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC qglGetCombinerOutputParameterivNV; +PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC qglGetFinalCombinerInputParameterfvNV; +PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC qglGetFinalCombinerInputParameterivNV; + +PFNGLPROGRAMSTRINGARBPROC qglProgramStringARB; +PFNGLBINDPROGRAMARBPROC qglBindProgramARB; +PFNGLDELETEPROGRAMSARBPROC qglDeleteProgramsARB; +PFNGLGENPROGRAMSARBPROC qglGenProgramsARB; +PFNGLPROGRAMENVPARAMETER4DARBPROC qglProgramEnvParameter4dARB; +PFNGLPROGRAMENVPARAMETER4DVARBPROC qglProgramEnvParameter4dvARB; +PFNGLPROGRAMENVPARAMETER4FARBPROC qglProgramEnvParameter4fARB; +PFNGLPROGRAMENVPARAMETER4FVARBPROC qglProgramEnvParameter4fvARB; +PFNGLPROGRAMLOCALPARAMETER4DARBPROC qglProgramLocalParameter4dARB; +PFNGLPROGRAMLOCALPARAMETER4DVARBPROC qglProgramLocalParameter4dvARB; +PFNGLPROGRAMLOCALPARAMETER4FARBPROC qglProgramLocalParameter4fARB; +PFNGLPROGRAMLOCALPARAMETER4FVARBPROC qglProgramLocalParameter4fvARB; +PFNGLGETPROGRAMENVPARAMETERDVARBPROC qglGetProgramEnvParameterdvARB; +PFNGLGETPROGRAMENVPARAMETERFVARBPROC qglGetProgramEnvParameterfvARB; +PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC qglGetProgramLocalParameterdvARB; +PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC qglGetProgramLocalParameterfvARB; +PFNGLGETPROGRAMIVARBPROC qglGetProgramivARB; +PFNGLGETPROGRAMSTRINGARBPROC qglGetProgramStringARB; +PFNGLISPROGRAMARBPROC qglIsProgramARB; + +PFNGLLOCKARRAYSEXTPROC qglLockArraysEXT; +PFNGLUNLOCKARRAYSEXTPROC qglUnlockArraysEXT; + +bool g_bTextureRectangleHack = false; +void RE_SetLightStyle(int style, int color); void RE_GetBModelVerts( int bmodelIndex, vec3_t *verts, vec3_t normal ); void R_Splash() @@ -310,7 +306,461 @@ void R_Splash() qglVertex2f(x2, y2); qglEnd(); - GLimp_EndFrame(); + ri->WIN_Present(&window); +} + +/* +** GLW_CheckForExtension + + Cannot use strstr directly to differentiate between (for eg) reg_combiners and reg_combiners2 +*/ +bool GL_CheckForExtension(const char *ext) +{ + const char *ptr = Q_stristr( glConfigExt.originalExtensionString, ext ); + if (ptr == NULL) + return false; + ptr += strlen(ext); + return ((*ptr == ' ') || (*ptr == '\0')); // verify it's complete string. +} + + +static void GLW_InitTextureCompression( void ) +{ + bool newer_tc, old_tc; + + // Check for available tc methods. + newer_tc = GL_CheckForExtension("ARB_texture_compression") && GL_CheckForExtension("EXT_texture_compression_s3tc"); + old_tc = GL_CheckForExtension("GL_S3_s3tc"); + + if ( old_tc ) + { + Com_Printf ("...GL_S3_s3tc available\n" ); + } + + if ( newer_tc ) + { + Com_Printf ("...GL_EXT_texture_compression_s3tc available\n" ); + } + + if ( !r_ext_compressed_textures->value ) + { + // Compressed textures are off + glConfig.textureCompression = TC_NONE; + Com_Printf ("...ignoring texture compression\n" ); + } + else if ( !old_tc && !newer_tc ) + { + // Requesting texture compression, but no method found + glConfig.textureCompression = TC_NONE; + Com_Printf ("...no supported texture compression method found\n" ); + Com_Printf (".....ignoring texture compression\n" ); + } + else + { + // some form of supported texture compression is avaiable, so see if the user has a preference + if ( r_ext_preferred_tc_method->integer == TC_NONE ) + { + // No preference, so pick the best + if ( newer_tc ) + { + Com_Printf ("...no tc preference specified\n" ); + Com_Printf (".....using GL_EXT_texture_compression_s3tc\n" ); + glConfig.textureCompression = TC_S3TC_DXT; + } + else + { + Com_Printf ("...no tc preference specified\n" ); + Com_Printf (".....using GL_S3_s3tc\n" ); + glConfig.textureCompression = TC_S3TC; + } + } + else + { + // User has specified a preference, now see if this request can be honored + if ( old_tc && newer_tc ) + { + // both are avaiable, so we can use the desired tc method + if ( r_ext_preferred_tc_method->integer == TC_S3TC ) + { + Com_Printf ("...using preferred tc method, GL_S3_s3tc\n" ); + glConfig.textureCompression = TC_S3TC; + } + else + { + Com_Printf ("...using preferred tc method, GL_EXT_texture_compression_s3tc\n" ); + glConfig.textureCompression = TC_S3TC_DXT; + } + } + else + { + // Both methods are not available, so this gets trickier + if ( r_ext_preferred_tc_method->integer == TC_S3TC ) + { + // Preferring to user older compression + if ( old_tc ) + { + Com_Printf ("...using GL_S3_s3tc\n" ); + glConfig.textureCompression = TC_S3TC; + } + else + { + // Drat, preference can't be honored + Com_Printf ("...preferred tc method, GL_S3_s3tc not available\n" ); + Com_Printf (".....falling back to GL_EXT_texture_compression_s3tc\n" ); + glConfig.textureCompression = TC_S3TC_DXT; + } + } + else + { + // Preferring to user newer compression + if ( newer_tc ) + { + Com_Printf ("...using GL_EXT_texture_compression_s3tc\n" ); + glConfig.textureCompression = TC_S3TC_DXT; + } + else + { + // Drat, preference can't be honored + Com_Printf ("...preferred tc method, GL_EXT_texture_compression_s3tc not available\n" ); + Com_Printf (".....falling back to GL_S3_s3tc\n" ); + glConfig.textureCompression = TC_S3TC; + } + } + } + } + } +} + +/* +=============== +GLimp_InitExtensions +=============== +*/ +extern bool g_bDynamicGlowSupported; +extern bool g_bARBShadersAvailable; +static void GLimp_InitExtensions( void ) +{ + if ( !r_allowExtensions->integer ) + { + Com_Printf ("*** IGNORING OPENGL EXTENSIONS ***\n" ); + g_bDynamicGlowSupported = false; + ri->Cvar_Set( "r_DynamicGlow","0" ); + return; + } + + Com_Printf ("Initializing OpenGL extensions\n" ); + + // Select our tc scheme + GLW_InitTextureCompression(); + + // GL_EXT_texture_env_add + glConfig.textureEnvAddAvailable = qfalse; + if ( GL_CheckForExtension( "EXT_texture_env_add" ) ) + { + if ( r_ext_texture_env_add->integer ) + { + glConfig.textureEnvAddAvailable = qtrue; + Com_Printf ("...using GL_EXT_texture_env_add\n" ); + } + else + { + glConfig.textureEnvAddAvailable = qfalse; + Com_Printf ("...ignoring GL_EXT_texture_env_add\n" ); + } + } + else + { + Com_Printf ("...GL_EXT_texture_env_add not found\n" ); + } + + // GL_EXT_texture_filter_anisotropic + glConfig.maxTextureFilterAnisotropy = 0; + if ( GL_CheckForExtension( "EXT_texture_filter_anisotropic" ) ) + { + qglGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &glConfig.maxTextureFilterAnisotropy ); + Com_Printf ("...GL_EXT_texture_filter_anisotropic available\n" ); + + if ( r_ext_texture_filter_anisotropic->integer > 1 ) + { + Com_Printf ("...using GL_EXT_texture_filter_anisotropic\n" ); + } + else + { + Com_Printf ("...ignoring GL_EXT_texture_filter_anisotropic\n" ); + } + ri->Cvar_SetValue( "r_ext_texture_filter_anisotropic_avail", glConfig.maxTextureFilterAnisotropy ); + if ( r_ext_texture_filter_anisotropic->value > glConfig.maxTextureFilterAnisotropy ) + { + ri->Cvar_SetValue( "r_ext_texture_filter_anisotropic_avail", glConfig.maxTextureFilterAnisotropy ); + } + } + else + { + Com_Printf ("...GL_EXT_texture_filter_anisotropic not found\n" ); + ri->Cvar_Set( "r_ext_texture_filter_anisotropic_avail", "0" ); + } + + // GL_EXT_clamp_to_edge + glConfig.clampToEdgeAvailable = qtrue; + Com_Printf ("...using GL_EXT_texture_edge_clamp\n" ); + + // GL_ARB_multitexture + qglMultiTexCoord2fARB = NULL; + qglActiveTextureARB = NULL; + qglClientActiveTextureARB = NULL; + if ( GL_CheckForExtension( "GL_ARB_multitexture" ) ) + { + if ( r_ext_multitexture->integer ) + { + qglMultiTexCoord2fARB = ( PFNGLMULTITEXCOORD2FARBPROC ) ri->GL_GetProcAddress( "glMultiTexCoord2fARB" ); + qglActiveTextureARB = ( PFNGLACTIVETEXTUREARBPROC ) ri->GL_GetProcAddress( "glActiveTextureARB" ); + qglClientActiveTextureARB = ( PFNGLCLIENTACTIVETEXTUREARBPROC ) ri->GL_GetProcAddress( "glClientActiveTextureARB" ); + + if ( qglActiveTextureARB ) + { + qglGetIntegerv( GL_MAX_TEXTURE_UNITS_ARB, &glConfig.maxActiveTextures ); + + if ( glConfig.maxActiveTextures > 1 ) + { + Com_Printf ("...using GL_ARB_multitexture\n" ); + } + else + { + qglMultiTexCoord2fARB = NULL; + qglActiveTextureARB = NULL; + qglClientActiveTextureARB = NULL; + Com_Printf ("...not using GL_ARB_multitexture, < 2 texture units\n" ); + } + } + } + else + { + Com_Printf ("...ignoring GL_ARB_multitexture\n" ); + } + } + else + { + Com_Printf ("...GL_ARB_multitexture not found\n" ); + } + + // GL_EXT_compiled_vertex_array + qglLockArraysEXT = NULL; + qglUnlockArraysEXT = NULL; + if ( GL_CheckForExtension( "GL_EXT_compiled_vertex_array" ) ) + { + if ( r_ext_compiled_vertex_array->integer ) + { + Com_Printf ("...using GL_EXT_compiled_vertex_array\n" ); + qglLockArraysEXT = ( PFNGLLOCKARRAYSEXTPROC ) ri->GL_GetProcAddress( "glLockArraysEXT" ); + qglUnlockArraysEXT = ( PFNGLUNLOCKARRAYSEXTPROC ) ri->GL_GetProcAddress( "glUnlockArraysEXT" ); + if (!qglLockArraysEXT || !qglUnlockArraysEXT) { + Com_Error (ERR_FATAL, "bad getprocaddress"); + } + } + else + { + Com_Printf ("...ignoring GL_EXT_compiled_vertex_array\n" ); + } + } + else + { + Com_Printf ("...GL_EXT_compiled_vertex_array not found\n" ); + } + + bool bNVRegisterCombiners = false; + // Register Combiners. + if ( GL_CheckForExtension( "GL_NV_register_combiners" ) ) + { + // NOTE: This extension requires multitexture support (over 2 units). + if ( glConfig.maxActiveTextures >= 2 ) + { + bNVRegisterCombiners = true; + // Register Combiners function pointer address load. - AReis + // NOTE: VV guys will _definetly_ not be able to use regcoms. Pixel Shaders are just as good though :-) + // NOTE: Also, this is an nVidia specific extension (of course), so fragment shaders would serve the same purpose + // if we needed some kind of fragment/pixel manipulation support. + qglCombinerParameterfvNV = (PFNGLCOMBINERPARAMETERFVNVPROC)ri->GL_GetProcAddress( "glCombinerParameterfvNV" ); + qglCombinerParameterivNV = (PFNGLCOMBINERPARAMETERIVNVPROC)ri->GL_GetProcAddress( "glCombinerParameterivNV" ); + qglCombinerParameterfNV = (PFNGLCOMBINERPARAMETERFNVPROC)ri->GL_GetProcAddress( "glCombinerParameterfNV" ); + qglCombinerParameteriNV = (PFNGLCOMBINERPARAMETERINVPROC)ri->GL_GetProcAddress( "glCombinerParameteriNV" ); + qglCombinerInputNV = (PFNGLCOMBINERINPUTNVPROC)ri->GL_GetProcAddress( "glCombinerInputNV" ); + qglCombinerOutputNV = (PFNGLCOMBINEROUTPUTNVPROC)ri->GL_GetProcAddress( "glCombinerOutputNV" ); + qglFinalCombinerInputNV = (PFNGLFINALCOMBINERINPUTNVPROC)ri->GL_GetProcAddress( "glFinalCombinerInputNV" ); + qglGetCombinerInputParameterfvNV = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)ri->GL_GetProcAddress( "glGetCombinerInputParameterfvNV" ); + qglGetCombinerInputParameterivNV = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)ri->GL_GetProcAddress( "glGetCombinerInputParameterivNV" ); + qglGetCombinerOutputParameterfvNV = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)ri->GL_GetProcAddress( "glGetCombinerOutputParameterfvNV" ); + qglGetCombinerOutputParameterivNV = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)ri->GL_GetProcAddress( "glGetCombinerOutputParameterivNV" ); + qglGetFinalCombinerInputParameterfvNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)ri->GL_GetProcAddress( "glGetFinalCombinerInputParameterfvNV" ); + qglGetFinalCombinerInputParameterivNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)ri->GL_GetProcAddress( "glGetFinalCombinerInputParameterivNV" ); + + // Validate the functions we need. + if ( !qglCombinerParameterfvNV || !qglCombinerParameterivNV || !qglCombinerParameterfNV || !qglCombinerParameteriNV || !qglCombinerInputNV || + !qglCombinerOutputNV || !qglFinalCombinerInputNV || !qglGetCombinerInputParameterfvNV || !qglGetCombinerInputParameterivNV || + !qglGetCombinerOutputParameterfvNV || !qglGetCombinerOutputParameterivNV || !qglGetFinalCombinerInputParameterfvNV || !qglGetFinalCombinerInputParameterivNV ) + { + bNVRegisterCombiners = false; + qglCombinerParameterfvNV = NULL; + qglCombinerParameteriNV = NULL; + Com_Printf ("...GL_NV_register_combiners failed\n" ); + } + } + else + { + bNVRegisterCombiners = false; + Com_Printf ("...ignoring GL_NV_register_combiners\n" ); + } + } + else + { + bNVRegisterCombiners = false; + Com_Printf ("...GL_NV_register_combiners not found\n" ); + } + + // NOTE: Vertex and Fragment Programs are very dependant on each other - this is actually a + // good thing! So, just check to see which we support (one or the other) and load the shared + // function pointers. ARB rocks! + + // Vertex Programs. + bool bARBVertexProgram = false; + if ( GL_CheckForExtension( "GL_ARB_vertex_program" ) ) + { + bARBVertexProgram = true; + } + else + { + bARBVertexProgram = false; + Com_Printf ("...GL_ARB_vertex_program not found\n" ); + } + + // Fragment Programs. + bool bARBFragmentProgram = false; + if ( GL_CheckForExtension( "GL_ARB_fragment_program" ) ) + { + bARBFragmentProgram = true; + } + else + { + bARBFragmentProgram = false; + Com_Printf ("...GL_ARB_fragment_program not found\n" ); + } + + // If we support one or the other, load the shared function pointers. + if ( bARBVertexProgram || bARBFragmentProgram ) + { + qglProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) ri->GL_GetProcAddress("glProgramStringARB"); + qglBindProgramARB = (PFNGLBINDPROGRAMARBPROC) ri->GL_GetProcAddress("glBindProgramARB"); + qglDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) ri->GL_GetProcAddress("glDeleteProgramsARB"); + qglGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) ri->GL_GetProcAddress("glGenProgramsARB"); + qglProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC) ri->GL_GetProcAddress("glProgramEnvParameter4dARB"); + qglProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC) ri->GL_GetProcAddress("glProgramEnvParameter4dvARB"); + qglProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC) ri->GL_GetProcAddress("glProgramEnvParameter4fARB"); + qglProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC) ri->GL_GetProcAddress("glProgramEnvParameter4fvARB"); + qglProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) ri->GL_GetProcAddress("glProgramLocalParameter4dARB"); + qglProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) ri->GL_GetProcAddress("glProgramLocalParameter4dvARB"); + qglProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC) ri->GL_GetProcAddress("glProgramLocalParameter4fARB"); + qglProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) ri->GL_GetProcAddress("glProgramLocalParameter4fvARB"); + qglGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC) ri->GL_GetProcAddress("glGetProgramEnvParameterdvARB"); + qglGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC) ri->GL_GetProcAddress("glGetProgramEnvParameterfvARB"); + qglGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) ri->GL_GetProcAddress("glGetProgramLocalParameterdvARB"); + qglGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) ri->GL_GetProcAddress("glGetProgramLocalParameterfvARB"); + qglGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) ri->GL_GetProcAddress("glGetProgramivARB"); + qglGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC) ri->GL_GetProcAddress("glGetProgramStringARB"); + qglIsProgramARB = (PFNGLISPROGRAMARBPROC) ri->GL_GetProcAddress("glIsProgramARB"); + + // Validate the functions we need. + if ( !qglProgramStringARB || !qglBindProgramARB || !qglDeleteProgramsARB || !qglGenProgramsARB || + !qglProgramEnvParameter4dARB || !qglProgramEnvParameter4dvARB || !qglProgramEnvParameter4fARB || + !qglProgramEnvParameter4fvARB || !qglProgramLocalParameter4dARB || !qglProgramLocalParameter4dvARB || + !qglProgramLocalParameter4fARB || !qglProgramLocalParameter4fvARB || !qglGetProgramEnvParameterdvARB || + !qglGetProgramEnvParameterfvARB || !qglGetProgramLocalParameterdvARB || !qglGetProgramLocalParameterfvARB || + !qglGetProgramivARB || !qglGetProgramStringARB || !qglIsProgramARB ) + { + bARBVertexProgram = false; + bARBFragmentProgram = false; + qglGenProgramsARB = NULL; //clear ptrs that get checked + qglProgramEnvParameter4fARB = NULL; + Com_Printf ("...ignoring GL_ARB_vertex_program\n" ); + Com_Printf ("...ignoring GL_ARB_fragment_program\n" ); + } + } + + // Figure out which texture rectangle extension to use. + bool bTexRectSupported = false; + if ( Q_stricmpn( glConfig.vendor_string, "ATI Technologies",16 )==0 + && Q_stricmpn( glConfig.version_string, "1.3.3",5 )==0 + && glConfig.version_string[5] < '9' ) //1.3.34 and 1.3.37 and 1.3.38 are broken for sure, 1.3.39 is not + { + g_bTextureRectangleHack = true; + } + + if ( GL_CheckForExtension( "GL_NV_texture_rectangle" ) || GL_CheckForExtension( "GL_EXT_texture_rectangle" ) ) + { + bTexRectSupported = true; + } + + // Find out how many general combiners they have. + #define GL_MAX_GENERAL_COMBINERS_NV 0x854D + GLint iNumGeneralCombiners = 0; + if(bNVRegisterCombiners) + qglGetIntegerv( GL_MAX_GENERAL_COMBINERS_NV, &iNumGeneralCombiners ); + + glConfigExt.doGammaCorrectionWithShaders = qfalse; + if ( bTexRectSupported && bARBVertexProgram && bARBFragmentProgram ) + { +#if !defined(__APPLE__) + qglTexImage3D = (PFNGLTEXIMAGE3DPROC)ri->GL_GetProcAddress("glTexImage3D"); + qglTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)ri->GL_GetProcAddress("glTexSubImage3D"); + if ( qglTexImage3D && qglTexSubImage3D ) + { + glConfigExt.doGammaCorrectionWithShaders = qtrue; + } +#else + glConfigExt.doGammaCorrectionWithShaders = qtrue; +#endif + } + + // Only allow dynamic glows/flares if they have the hardware + if ( bTexRectSupported && bARBVertexProgram && qglActiveTextureARB && glConfig.maxActiveTextures >= 4 && + ( ( bNVRegisterCombiners && iNumGeneralCombiners >= 2 ) || bARBFragmentProgram ) ) + { + g_bDynamicGlowSupported = true; + // this would overwrite any achived setting gwg + // ri->Cvar_Set( "r_DynamicGlow", "1" ); + } + else + { + g_bDynamicGlowSupported = false; + ri->Cvar_Set( "r_DynamicGlow","0" ); + } +} + +// Truncates the GL extensions string by only allowing up to 'maxExtensions' extensions in the string. +static const char *TruncateGLExtensionsString (const char *extensionsString, int maxExtensions) +{ + const char *p = extensionsString; + const char *q; + int numExtensions = 0; + size_t extensionsLen = strlen (extensionsString); + + char *truncatedExtensions; + + while ( (q = strchr (p, ' ')) != NULL && numExtensions <= maxExtensions ) + { + p = q + 1; + numExtensions++; + } + + if ( q != NULL ) + { + // We still have more extensions. We'll call this the end + + extensionsLen = p - extensionsString - 1; + } + + truncatedExtensions = (char *)Hunk_Alloc(extensionsLen + 1, h_low); + Q_strncpyz (truncatedExtensions, extensionsString, extensionsLen + 1); + + return truncatedExtensions; } /* @@ -336,11 +786,35 @@ static void InitOpenGL( void ) if ( glConfig.vidWidth == 0 ) { - GLimp_Init(); - // print info the first time only + windowDesc_t windowDesc = { GRAPHICS_API_OPENGL }; + memset(&glConfig, 0, sizeof(glConfig)); + memset(&glConfigExt, 0, sizeof(glConfigExt)); + + window = ri->WIN_Init(&windowDesc, &glConfig); + + Com_Printf( "GL_RENDERER: %s\n", (char *)qglGetString (GL_RENDERER) ); + + // get our config strings + glConfig.vendor_string = (const char *)qglGetString (GL_VENDOR); + glConfig.renderer_string = (const char *)qglGetString (GL_RENDERER); + glConfig.version_string = (const char *)qglGetString (GL_VERSION); + glConfig.extensions_string = (const char *)qglGetString (GL_EXTENSIONS); + + glConfigExt.originalExtensionString = glConfig.extensions_string; + glConfig.extensions_string = TruncateGLExtensionsString(glConfigExt.originalExtensionString, 128); + + // OpenGL driver constants + qglGetIntegerv( GL_MAX_TEXTURE_SIZE, &glConfig.maxTextureSize ); + + // stubbed or broken drivers may have reported 0... + glConfig.maxTextureSize = Q_max(0, glConfig.maxTextureSize); + + // initialize extensions + GLimp_InitExtensions( ); + + // set default state GL_SetDefaultState(); R_Splash(); //get something on screen asap - GfxInfo_f(); } else { @@ -355,7 +829,8 @@ GL_CheckErrors ================== */ void GL_CheckErrors( void ) { - int err; +#if defined(_DEBUG) + GLenum err; char s[64]; err = qglGetError(); @@ -390,73 +865,7 @@ void GL_CheckErrors( void ) { } Com_Error( ERR_FATAL, "GL_CheckErrors: %s", s ); -} - -/* -** R_GetModeInfo -*/ -typedef struct vidmode_s -{ - const char *description; - int width, height; -} vidmode_t; - -const vidmode_t r_vidModes[] = { - { "Mode 0: 320x240", 320, 240 }, - { "Mode 1: 400x300", 400, 300 }, - { "Mode 2: 512x384", 512, 384 }, - { "Mode 3: 640x480", 640, 480 }, - { "Mode 4: 800x600", 800, 600 }, - { "Mode 5: 960x720", 960, 720 }, - { "Mode 6: 1024x768", 1024, 768 }, - { "Mode 7: 1152x864", 1152, 864 }, - { "Mode 8: 1280x1024", 1280, 1024 }, - { "Mode 9: 1600x1200", 1600, 1200 }, - { "Mode 10: 2048x1536", 2048, 1536 }, - { "Mode 11: 856x480 (wide)", 856, 480 }, - { "Mode 12: 2400x600(surround)",2400,600 } -}; -static const int s_numVidModes = ( sizeof( r_vidModes ) / sizeof( r_vidModes[0] ) ); - -qboolean R_GetModeInfo( int *width, int *height, int mode ) { - const vidmode_t *vm; - - if ( mode < -1 ) { - return qfalse; - } - if ( mode >= s_numVidModes ) { - return qfalse; - } - - if ( mode == -1 ) { - *width = r_customwidth->integer; - *height = r_customheight->integer; - return qtrue; - } - - vm = &r_vidModes[mode]; - - *width = vm->width; - *height = vm->height; - - return qtrue; -} - -/* -** R_ModeList_f -*/ -static void R_ModeList_f( void ) -{ - int i; - - ri->Printf( PRINT_ALL, "\n" ); - ri->Printf( PRINT_ALL, "Mode -2: Use desktop resolution\n" ); - ri->Printf( PRINT_ALL, "Mode -1: Use r_customWidth and r_customHeight variables\n" ); - for ( i = 0; i < s_numVidModes; i++ ) - { - ri->Printf( PRINT_ALL, "%s\n", r_vidModes[i].description ); - } - ri->Printf( PRINT_ALL, "\n" ); +#endif } /* @@ -560,7 +969,7 @@ void R_TakeScreenshot( int x, int y, int width, int height, char *fileName ) { memcount = linelen * height; // gamma correct - if(glConfig.deviceSupportsGamma) + if(glConfig.deviceSupportsGamma && !glConfigExt.doGammaCorrectionWithShaders) R_GammaCorrect(allbuf + offset, memcount); ri->FS_WriteFile(fileName, buffer, memcount + 18); @@ -597,7 +1006,7 @@ void R_TakeScreenshotJPEG( int x, int y, int width, int height, char *fileName ) memcount = (width * 3 + padlen) * height; // gamma correct - if(glConfig.deviceSupportsGamma) + if(glConfig.deviceSupportsGamma && !glConfigExt.doGammaCorrectionWithShaders) R_GammaCorrect(buffer + offset, memcount); RE_SaveJPG(fileName, r_screenshotJpegQuality->integer, width, height, buffer + offset, padlen); @@ -676,7 +1085,7 @@ static void R_LevelShot( void ) { } // gamma correct - if ( ( tr.overbrightBits > 0 ) && glConfig.deviceSupportsGamma ) { + if ( ( tr.overbrightBits > 0 ) && glConfig.deviceSupportsGamma && !glConfigExt.doGammaCorrectionWithShaders ) { R_GammaCorrect( buffer + 18, LEVELSHOTSIZE * LEVELSHOTSIZE * 3 ); } @@ -841,7 +1250,7 @@ const void *RB_TakeVideoFrameCmd( const void *data ) memcount = padwidth * cmd->height; // gamma correct - if(glConfig.deviceSupportsGamma) + if(glConfig.deviceSupportsGamma && !glConfigExt.doGammaCorrectionWithShaders) R_GammaCorrect(cBuf, memcount); if(cmd->motionJpeg) @@ -931,14 +1340,6 @@ void GL_SetDefaultState( void ) qglDisable( GL_BLEND ); } - -/* -================ -GfxInfo_f -================ -*/ -extern bool g_bTextureRectangleHack; - /* ================ R_PrintLongString @@ -961,6 +1362,12 @@ void R_PrintLongString(const char *string) { } } +/* +================ +GfxInfo_f +================ +*/ +extern bool g_bTextureRectangleHack; void GfxInfo_f( void ) { const char *enablestrings[] = @@ -986,15 +1393,22 @@ void GfxInfo_f( void ) "GL_EXT_texture_compression_s3tc", }; + int fullscreen = ri->Cvar_VariableIntegerValue("r_fullscreen"); + int noborder = ri->Cvar_VariableIntegerValue("r_noborder"); + ri->Printf( PRINT_ALL, "\nGL_VENDOR: %s\n", glConfig.vendor_string ); ri->Printf( PRINT_ALL, "GL_RENDERER: %s\n", glConfig.renderer_string ); ri->Printf( PRINT_ALL, "GL_VERSION: %s\n", glConfig.version_string ); R_PrintLongString( glConfigExt.originalExtensionString ); ri->Printf( PRINT_ALL, "\n"); ri->Printf( PRINT_ALL, "GL_MAX_TEXTURE_SIZE: %d\n", glConfig.maxTextureSize ); - ri->Printf( PRINT_ALL, "GL_MAX_ACTIVE_TEXTURES_ARB: %d\n", glConfig.maxActiveTextures ); + ri->Printf( PRINT_ALL, "GL_MAX_TEXTURE_UNITS_ARB: %d\n", glConfig.maxActiveTextures ); ri->Printf( PRINT_ALL, "\nPIXELFORMAT: color(%d-bits) Z(%d-bit) stencil(%d-bits)\n", glConfig.colorBits, glConfig.depthBits, glConfig.stencilBits ); - ri->Printf( PRINT_ALL, "MODE: %d, %d x %d %s%s hz:", r_mode->integer, glConfig.vidWidth, glConfig.vidHeight, r_fullscreen->integer == 0 ? noborderstrings[r_noborder->integer == 1] : noborderstrings[0] ,fsstrings[r_fullscreen->integer == 1] ); + ri->Printf( PRINT_ALL, "MODE: %d, %d x %d %s%s hz:", + ri->Cvar_VariableIntegerValue("r_mode"), + glConfig.vidWidth, glConfig.vidHeight, + fullscreen == 0 ? noborderstrings[noborder == 1] : noborderstrings[0], + fsstrings[fullscreen == 1] ); if ( glConfig.displayFrequency ) { ri->Printf( PRINT_ALL, "%d\n", glConfig.displayFrequency ); @@ -1003,7 +1417,7 @@ void GfxInfo_f( void ) { ri->Printf( PRINT_ALL, "N/A\n" ); } - if ( glConfig.deviceSupportsGamma ) + if ( glConfig.deviceSupportsGamma && !glConfigExt.doGammaCorrectionWithShaders ) { ri->Printf( PRINT_ALL, "GAMMA: hardware w/ %d overbright bits\n", tr.overbrightBits ); } @@ -1066,8 +1480,10 @@ void GfxInfo_f( void ) if ( r_finish->integer ) { ri->Printf( PRINT_ALL, "Forcing glFinish\n" ); } - if ( r_displayRefresh ->integer ) { - ri->Printf( PRINT_ALL, "Display refresh set to %d\n", r_displayRefresh->integer ); + + int displayRefresh = ri->Cvar_VariableIntegerValue("r_displayRefresh"); + if ( displayRefresh ) { + ri->Printf( PRINT_ALL, "Display refresh set to %d\n", displayRefresh); } if (tr.world) { @@ -1098,9 +1514,7 @@ static consoleCommand_t commands[] = { { "r_we", R_WorldEffect_f }, { "imagecacheinfo", RE_RegisterImages_Info_f }, { "modellist", R_Modellist_f }, - { "modelist", R_ModeList_f }, { "modelcacheinfo", RE_RegisterModels_Info_f }, - { "minimize", GLimp_Minimize }, }; static const size_t numCommands = ARRAY_LEN( commands ); @@ -1112,12 +1526,6 @@ static const size_t numCommands = ARRAY_LEN( commands ); #endif #define MAX_PRIMITIVES 3 -#ifdef _WIN32 -#define SWAPINTERVAL_FLAGS CVAR_ARCHIVE -#else -#define SWAPINTERVAL_FLAGS CVAR_ARCHIVE | CVAR_LATCH -#endif - /* =============== R_Register @@ -1153,26 +1561,14 @@ void R_Register( void ) r_detailTextures = ri->Cvar_Get( "r_detailtextures", "1", CVAR_ARCHIVE|CVAR_LATCH ); r_texturebits = ri->Cvar_Get( "r_texturebits", "0", CVAR_ARCHIVE|CVAR_LATCH ); r_texturebitslm = ri->Cvar_Get( "r_texturebitslm", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_colorbits = ri->Cvar_Get( "r_colorbits", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_stereo = ri->Cvar_Get( "r_stereo", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_stencilbits = ri->Cvar_Get( "r_stencilbits", "8", CVAR_ARCHIVE|CVAR_LATCH ); - r_depthbits = ri->Cvar_Get( "r_depthbits", "0", CVAR_ARCHIVE|CVAR_LATCH ); r_overBrightBits = ri->Cvar_Get( "r_overBrightBits", "0", CVAR_ARCHIVE|CVAR_LATCH ); r_mapOverBrightBits = ri->Cvar_Get( "r_mapOverBrightBits", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_ignorehwgamma = ri->Cvar_Get( "r_ignorehwgamma", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_mode = ri->Cvar_Get( "r_mode", "4", CVAR_ARCHIVE|CVAR_LATCH ); - r_fullscreen = ri->Cvar_Get( "r_fullscreen", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_noborder = ri->Cvar_Get( "r_noborder", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_centerWindow = ri->Cvar_Get( "r_centerWindow", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_customwidth = ri->Cvar_Get( "r_customwidth", "1600", CVAR_ARCHIVE|CVAR_LATCH ); - r_customheight = ri->Cvar_Get( "r_customheight", "1024", CVAR_ARCHIVE|CVAR_LATCH ); r_simpleMipMaps = ri->Cvar_Get( "r_simpleMipMaps", "1", CVAR_ARCHIVE|CVAR_LATCH ); r_vertexLight = ri->Cvar_Get( "r_vertexLight", "0", CVAR_ARCHIVE|CVAR_LATCH ); r_uiFullScreen = ri->Cvar_Get( "r_uifullscreen", "0", CVAR_NONE ); r_subdivisions = ri->Cvar_Get( "r_subdivisions", "4", CVAR_ARCHIVE|CVAR_LATCH ); ri->Cvar_CheckRange( r_subdivisions, 4, 80, qfalse ); - r_displayRefresh = ri->Cvar_Get( "r_displayRefresh", "0", CVAR_LATCH ); - ri->Cvar_CheckRange( r_displayRefresh, 0, 240, qtrue ); + r_fullbright = ri->Cvar_Get( "r_fullbright", "0", CVAR_CHEAT ); r_intensity = ri->Cvar_Get( "r_intensity", "1", CVAR_LATCH ); r_singleShader = ri->Cvar_Get( "r_singleShader", "0", CVAR_CHEAT|CVAR_LATCH ); @@ -1192,7 +1588,6 @@ void R_Register( void ) // r_dlightBacks = ri->Cvar_Get( "r_dlightBacks", "1", CVAR_CHEAT ); r_finish = ri->Cvar_Get( "r_finish", "0", CVAR_ARCHIVE ); r_textureMode = ri->Cvar_Get( "r_textureMode", "GL_LINEAR_MIPMAP_NEAREST", CVAR_ARCHIVE ); - r_swapInterval = ri->Cvar_Get( "r_swapInterval", "0", SWAPINTERVAL_FLAGS ); r_markcount = ri->Cvar_Get( "r_markcount", "100", CVAR_ARCHIVE ); r_gamma = ri->Cvar_Get( "r_gamma", "1", CVAR_ARCHIVE ); r_facePlaneCull = ri->Cvar_Get( "r_facePlaneCull", "1", CVAR_ARCHIVE ); @@ -1306,10 +1701,6 @@ void R_Init( void ) { memset( &backEnd, 0, sizeof( backEnd ) ); memset( &tess, 0, sizeof( tess ) ); -#ifdef _WIN32 - tr.wv = (WinVars_t *)ri->GetWinVars(); -#endif - // Swap_Init(); #ifndef FINAL_BUILD @@ -1349,8 +1740,8 @@ void R_Init( void ) { R_NoiseInit(); R_Register(); - max_polys = (std::min)( r_maxpolys->integer, DEFAULT_MAX_POLYS ); - max_polyverts = (std::min)( r_maxpolyverts->integer, DEFAULT_MAX_POLYVERTS ); + max_polys = Q_min( r_maxpolys->integer, DEFAULT_MAX_POLYS ); + max_polyverts = Q_min( r_maxpolyverts->integer, DEFAULT_MAX_POLYVERTS ); ptr = (byte *)Hunk_Alloc( sizeof( *backEndData ) + sizeof(srfPoly_t) * max_polys + sizeof(polyVert_t) * max_polyverts, h_low); backEndData = (backEndData_t *) ptr; @@ -1377,11 +1768,15 @@ void R_Init( void ) { R_InitWorldEffects(); +#if defined(_DEBUG) int err = qglGetError(); if ( err != GL_NO_ERROR ) ri->Printf( PRINT_ALL, "glGetError() = 0x%x\n", err); +#endif RestoreGhoul2InfoArray(); + // print info + GfxInfo_f(); // ri->Printf( PRINT_ALL, "----- finished R_Init -----\n" ); } @@ -1421,16 +1816,29 @@ void RE_Shutdown( qboolean destroyWindow, qboolean restarting ) { } } + if ( tr.gammaCorrectVtxShader ) + { + qglDeleteProgramsARB(1, &tr.gammaCorrectVtxShader); + } + + if ( tr.gammaCorrectPxShader ) + { + qglDeleteProgramsARB(1, &tr.gammaCorrectPxShader); + } + // Release the scene glow texture. qglDeleteTextures( 1, &tr.screenGlow ); // Release the scene texture. qglDeleteTextures( 1, &tr.sceneImage ); + qglDeleteTextures(1, &tr.gammaCorrectLUTImage); + // Release the blur texture. qglDeleteTextures( 1, &tr.blurImage ); } + R_ShutdownWorldEffects(); R_ShutdownFonts(); if ( tr.registered ) { R_IssuePendingRenderCommands(); @@ -1447,7 +1855,7 @@ void RE_Shutdown( qboolean destroyWindow, qboolean restarting ) { // shut down platform specific OpenGL stuff if ( destroyWindow ) { - GLimp_Shutdown(); + ri->WIN_Shutdown(); } tr.registered = qfalse; @@ -1475,7 +1883,8 @@ void RE_GetLightStyle(int style, color4ub_t color) return; } - *(int *)color = *(int *)styleColors[style]; + byteAlias_t *baDest = (byteAlias_t *)&color, *baSource = (byteAlias_t *)&styleColors[style]; + baDest->i = baSource->i; } void RE_SetLightStyle(int style, int color) @@ -1486,9 +1895,9 @@ void RE_SetLightStyle(int style, int color) return; } - if (*(int*)styleColors[style] != color) - { - *(int *)styleColors[style] = color; + byteAlias_t *ba = (byteAlias_t *)&styleColors[style]; + if ( ba->i != color) { + ba->i = color; } } diff --git a/codemp/rd-vanilla/tr_light.cpp b/codemp/rd-vanilla/tr_light.cpp index 01ff6eba7b..7b5f1cc002 100644 --- a/codemp/rd-vanilla/tr_light.cpp +++ b/codemp/rd-vanilla/tr_light.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_light.c #include "tr_local.h" @@ -397,9 +420,8 @@ int R_LightForPoint( vec3_t point, vec3_t ambientLight, vec3_t directedLight, ve { trRefEntity_t ent; - // bk010103 - this segfaults with -nolight maps if ( tr.world->lightGridData == NULL ) - return qfalse; + return qfalse; memset(&ent, 0, sizeof(ent)); VectorCopy( point, ent.e.origin ); diff --git a/codemp/rd-vanilla/tr_local.h b/codemp/rd-vanilla/tr_local.h index 097ad011c4..6c47877d12 100644 --- a/codemp/rd-vanilla/tr_local.h +++ b/codemp/rd-vanilla/tr_local.h @@ -1,16 +1,33 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "qcommon/qfiles.h" #include "rd-common/tr_public.h" #include "rd-common/tr_common.h" - -#ifdef _WIN32 - #include "qgl.h" -#else - #include "../sdl/sdl_qgl.h" -#endif - #include "ghoul2/ghoul2_shared.h" //rwwRMG - added +#include "qgl.h" #define GL_INDEX_TYPE GL_UNSIGNED_INT typedef unsigned int glIndex_t; @@ -925,13 +942,11 @@ typedef struct backEndState_s { #define NUM_SCRATCH_IMAGES 16 -#ifdef _WIN32 - #include "../win32/win_local.h" -#endif - typedef struct trGlobals_s { qboolean registered; // cleared at shutdown, set at beginRegistration + window_t window; + int visCount; // incremented every time a new vis cluster is entered int frameCount; // incremented every frame int sceneCount; // incremented every scene @@ -971,6 +986,11 @@ typedef struct trGlobals_s { // Image used to downsample and blur scene to. - AReis GLuint blurImage; + // Gamma correction using vertex/pixel programs + GLuint gammaCorrectLUTImage; + GLuint gammaCorrectVtxShader; + GLuint gammaCorrectPxShader; + shader_t *defaultShader; shader_t *shadowShader; shader_t *distortionShader; @@ -1036,16 +1056,13 @@ typedef struct trGlobals_s { float rangedFog; float distanceCull; - -#ifdef _WIN32 - WinVars_t *wv; -#endif } trGlobals_t; struct glconfigExt_t { glconfig_t *glConfig; + qboolean doGammaCorrectionWithShaders; const char *originalExtensionString; }; @@ -1061,6 +1078,7 @@ extern trGlobals_t tr; extern glconfig_t glConfig; // outside of TR since it shouldn't be cleared during ref re-init extern glconfigExt_t glConfigExt; extern glstate_t glState; // outside of TR since it shouldn't be cleared during ref re-init +extern window_t window; // @@ -1337,6 +1355,7 @@ image_t *R_CreateImage( const char *name, const byte *pic, int width, int heigh qboolean R_GetModeInfo( int *width, int *height, int mode ); void R_SetColorMappings( void ); +void R_SetGammaCorrectionLUT(); void R_GammaCorrect( byte *buffer, int bufSize ); void R_ImageList_f( void ); @@ -1380,7 +1399,7 @@ void R_RemapShader(const char *oldShader, const char *newShader, const char * // // tr_arb.c // -void ARB_InitGlowShaders( void ); +void ARB_InitGPUShaders( void ); /* @@ -1391,14 +1410,7 @@ IMPLEMENTATION SPECIFIC FUNCTIONS ==================================================================== */ -void GLimp_Init( void ); -void GLimp_Shutdown( void ); -void GLimp_EndFrame( void ); - -void GLimp_LogComment( char *comment ); -void GLimp_Minimize( void ); - -void GLimp_SetGamma( unsigned char red[256], unsigned char green[256], unsigned char blue[256] ); +static QINLINE void GLimp_LogComment( char *comment ) {} /* ==================================================================== @@ -1451,7 +1463,7 @@ struct shaderCommands_s bool fading; }; -#ifdef _WIN32 +#ifdef _MSC_VER typedef __declspec(align(16)) shaderCommands_s shaderCommands_t; #else typedef struct shaderCommands_s shaderCommands_t; @@ -1603,9 +1615,6 @@ ANIMATED MODELS /* Ghoul2 Insert Start */ -#ifdef _MSC_VER -#pragma warning (disable: 4512) //default assignment operator could not be gened -#endif class CRenderableSurface { public: diff --git a/codemp/rd-vanilla/tr_main.cpp b/codemp/rd-vanilla/tr_main.cpp index a45e094c14..8de44f08dc 100644 --- a/codemp/rd-vanilla/tr_main.cpp +++ b/codemp/rd-vanilla/tr_main.cpp @@ -1,11 +1,29 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_main.c -- main control flow for each frame #include "tr_local.h" #include "ghoul2/g2_local.h" -// Yeah, this might be kind of bad, but no linux version is planned so far :-) - AReis -// Gee- thanks guys - jdrews, the linux porter... -#ifdef _WIN32 - #include "win32/glw_win.h" -#endif trGlobals_t tr; diff --git a/codemp/rd-vanilla/tr_marks.cpp b/codemp/rd-vanilla/tr_marks.cpp index f89a947cd0..d77da90ebe 100644 --- a/codemp/rd-vanilla/tr_marks.cpp +++ b/codemp/rd-vanilla/tr_marks.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_marks.c -- polygon projection on the world polygons #include "tr_local.h" diff --git a/codemp/rd-vanilla/tr_mesh.cpp b/codemp/rd-vanilla/tr_mesh.cpp index e9db2eb746..f05b5391cc 100644 --- a/codemp/rd-vanilla/tr_mesh.cpp +++ b/codemp/rd-vanilla/tr_mesh.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_mesh.c: triangle model functions #include "tr_local.h" diff --git a/codemp/rd-vanilla/tr_model.cpp b/codemp/rd-vanilla/tr_model.cpp index 21de459bfd..e3c635586a 100644 --- a/codemp/rd-vanilla/tr_model.cpp +++ b/codemp/rd-vanilla/tr_model.cpp @@ -1,22 +1,34 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_models.c -- model loading and caching #include "tr_local.h" - - #include "qcommon/disablewarnings.h" - -#ifdef _MSC_VER -#pragma warning (push, 3) //go back down to 3 for the stl include -#endif #include "qcommon/sstring.h" // #include + #include #include -#ifdef _MSC_VER -#pragma warning (pop) -#endif - -using namespace std; - #define LL(x) x=LittleLong(x) #define LS(x) x=LittleShort(x) @@ -46,8 +58,8 @@ Ghoul2 Insert End // This stuff looks a bit messy, but it's kept here as black box, and nothing appears in any .H files for other // modules to worry about. I may make another module for this sometime. // -typedef pair StringOffsetAndShaderIndexDest_t; -typedef vector ShaderRegisterData_t; +typedef std::pair StringOffsetAndShaderIndexDest_t; +typedef std::vector ShaderRegisterData_t; struct CachedEndianedModelBinary_s { void *pModelDiskImage; @@ -67,7 +79,7 @@ struct CachedEndianedModelBinary_s } }; typedef struct CachedEndianedModelBinary_s CachedEndianedModelBinary_t; -typedef map CachedModels_t; +typedef std::map CachedModels_t; CachedModels_t *CachedModels = NULL; // the important cache item. void RE_RegisterModels_StoreShaderRequest(const char *psModelFileName, const char *psShaderName, int *piShaderIndexPoke) diff --git a/codemp/rd-vanilla/tr_quicksprite.cpp b/codemp/rd-vanilla/tr_quicksprite.cpp index 494cfd0713..add8d2d2cb 100644 --- a/codemp/rd-vanilla/tr_quicksprite.cpp +++ b/codemp/rd-vanilla/tr_quicksprite.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_QuickSprite.cpp: implementation of the CQuickSpriteSystem class. // ////////////////////////////////////////////////////////////////////// @@ -18,10 +40,19 @@ CQuickSpriteSystem SQuickSprite; // Construction/Destruction ////////////////////////////////////////////////////////////////////// -CQuickSpriteSystem::CQuickSpriteSystem() +CQuickSpriteSystem::CQuickSpriteSystem() : + mTexBundle(NULL), + mGLStateBits(0), + mFogIndex(-1), + mUseFog(qfalse), + mNextVert(0) { int i; + memset( mVerts, 0, sizeof( mVerts ) ); + memset( mFogTextureCoords, 0, sizeof( mFogTextureCoords ) ); + memset( mColors, 0, sizeof( mColors ) ); + for (i=0; i. +=========================================================================== +*/ + #pragma once // tr_QuickSprite.h: interface for the CQuickSprite class. @@ -21,7 +43,7 @@ class CQuickSpriteSystem public: CQuickSpriteSystem(); - virtual ~CQuickSpriteSystem(); + ~CQuickSpriteSystem(); void StartGroup(textureBundle_t *bundle, uint32_t glbits, int fogIndex = -1); void EndGroup(void); diff --git a/codemp/rd-vanilla/tr_scene.cpp b/codemp/rd-vanilla/tr_scene.cpp index ed3a0e0526..d54163df43 100644 --- a/codemp/rd-vanilla/tr_scene.cpp +++ b/codemp/rd-vanilla/tr_scene.cpp @@ -1,12 +1,31 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "tr_local.h" #include "ghoul2/G2.h" #include "ghoul2/g2_local.h" #include "qcommon/matcomp.h" - -#ifdef _MSC_VER -#pragma warning (disable: 4512) //default assignment operator could not be gened -#endif #include "qcommon/disablewarnings.h" static int r_firstSceneDrawSurf; diff --git a/codemp/rd-vanilla/tr_shade.cpp b/codemp/rd-vanilla/tr_shade.cpp index 267a65a0cf..50c90cd6ea 100644 --- a/codemp/rd-vanilla/tr_shade.cpp +++ b/codemp/rd-vanilla/tr_shade.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_shade.c #include "tr_local.h" @@ -596,9 +619,11 @@ static void ProjectDlightTexture2( void ) { colorTemp[1] = Q_ftol(floatColor[1] * modulate); colorTemp[2] = Q_ftol(floatColor[2] * modulate); colorTemp[3] = 255; - colorArray[numIndexes]=*(unsigned int *)colorTemp; - colorArray[numIndexes+1]=*(unsigned int *)colorTemp; - colorArray[numIndexes+2]=*(unsigned int *)colorTemp; + + byteAlias_t *ba = (byteAlias_t *)&colorTemp; + colorArray[numIndexes + 0] = ba->ui; + colorArray[numIndexes + 1] = ba->ui; + colorArray[numIndexes + 2] = ba->ui; hitIndexes[numIndexes] = numIndexes; hitIndexes[numIndexes+1] = numIndexes+1; @@ -1085,7 +1110,8 @@ static void RB_FogPass( void ) { fog = tr.world->fogs + tess.fogNum; for ( i = 0; i < tess.numVertexes; i++ ) { - * ( int * )&tess.svars.colors[i] = fog->colorInt; + byteAlias_t *ba = (byteAlias_t *)&tess.svars.colors[i]; + ba->i = fog->colorInt; } RB_CalcFogTexCoords( ( float * ) tess.svars.texcoords[0] ); @@ -1195,7 +1221,9 @@ static void ComputeColors( shaderStage_t *pStage, int forceRGBGen ) break; case CGEN_CONST: for ( i = 0; i < tess.numVertexes; i++ ) { - *(int *)tess.svars.colors[i] = *(int *)pStage->constantColor; + byteAlias_t *baDest = (byteAlias_t *)&tess.svars.colors[i], + *baSource = (byteAlias_t *)&pStage->constantColor; + baDest->i = baSource->i; } break; case CGEN_VERTEX: @@ -1241,7 +1269,8 @@ static void ComputeColors( shaderStage_t *pStage, int forceRGBGen ) fog = tr.world->fogs + tess.fogNum; for ( i = 0; i < tess.numVertexes; i++ ) { - * ( int * )&tess.svars.colors[i] = fog->colorInt; + byteAlias_t *ba = (byteAlias_t *)&tess.svars.colors[i]; + ba->i = fog->colorInt; } } break; @@ -1263,7 +1292,9 @@ static void ComputeColors( shaderStage_t *pStage, int forceRGBGen ) case CGEN_LIGHTMAPSTYLE: for ( i = 0; i < tess.numVertexes; i++ ) { - *(unsigned *)&colors[i] = *(unsigned *)styleColors[pStage->lightmapStyle]; + byteAlias_t *baDest = (byteAlias_t *)&tess.svars.colors[i], + *baSource = (byteAlias_t *)&styleColors[pStage->lightmapStyle]; + baDest->i = baSource->i; } break; } diff --git a/codemp/rd-vanilla/tr_shade_calc.cpp b/codemp/rd-vanilla/tr_shade_calc.cpp index 6f4bdb3320..feedcc301b 100644 --- a/codemp/rd-vanilla/tr_shade_calc.cpp +++ b/codemp/rd-vanilla/tr_shade_calc.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_shade_calc.c #include "tr_local.h" @@ -627,16 +650,14 @@ void RB_CalcColorFromEntity( unsigned char *dstColors ) { int i; int *pColors = ( int * ) dstColors; - int c; if ( !backEnd.currentEntity ) return; - c = * ( int * ) backEnd.currentEntity->e.shaderRGBA; + const byteAlias_t *ba = (byteAlias_t *)&backEnd.currentEntity->e.shaderRGBA; - for ( i = 0; i < tess.numVertexes; i++, pColors++ ) - { - *pColors = c; + for ( i = 0; i < tess.numVertexes; i++ ) { + *pColors++ = ba->i; } } @@ -648,7 +669,6 @@ void RB_CalcColorFromOneMinusEntity( unsigned char *dstColors ) int i; int *pColors = ( int * ) dstColors; unsigned char invModulate[4]; - int c; if ( !backEnd.currentEntity ) return; @@ -658,11 +678,10 @@ void RB_CalcColorFromOneMinusEntity( unsigned char *dstColors ) invModulate[2] = 255 - backEnd.currentEntity->e.shaderRGBA[2]; invModulate[3] = 255 - backEnd.currentEntity->e.shaderRGBA[3]; // this trashes alpha, but the AGEN block fixes it - c = * ( int * ) invModulate; + byteAlias_t *ba = (byteAlias_t *)&invModulate; - for ( i = 0; i < tess.numVertexes; i++, pColors++ ) - { - *pColors = c; + for ( i = 0; i < tess.numVertexes; i++ ) { + *pColors++ = ba->i; } } @@ -730,10 +749,10 @@ void RB_CalcWaveColor( const waveForm_t *wf, unsigned char *dstColors ) v = Q_ftol( 255 * glow ); color[0] = color[1] = color[2] = v; color[3] = 255; - v = *(int *)color; + byteAlias_t *ba = (byteAlias_t *)&color; - for ( i = 0; i < tess.numVertexes; i++, colors++ ) { - *colors = v; + for ( i = 0; i < tess.numVertexes; i++ ) { + *colors++ = ba->i; } } diff --git a/codemp/rd-vanilla/tr_shader.cpp b/codemp/rd-vanilla/tr_shader.cpp index d89bb6ea3d..ddf2deec80 100644 --- a/codemp/rd-vanilla/tr_shader.cpp +++ b/codemp/rd-vanilla/tr_shader.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_shader.c -- this file deals with the parsing and definition of shaders #include "tr_local.h" @@ -10,6 +33,10 @@ static shaderStage_t stages[MAX_SHADER_STAGES]; static shader_t shader; static texModInfo_t texMods[MAX_SHADER_STAGES][TR_MAX_TEXMODS]; +// Hash value (generated using the generateHashValueForText function) for the original +// retail JKA shader for gfx/2d/wedge. +#define RETAIL_ROCKET_WEDGE_SHADER_HASH (1217042) + #define FILE_HASH_SIZE 1024 static shader_t* hashTable[FILE_HASH_SIZE]; @@ -84,6 +111,20 @@ static void ClearGlobalShader(void) shader.contentFlags = CONTENTS_SOLID | CONTENTS_OPAQUE; } +static uint32_t generateHashValueForText( const char *string, size_t length ) +{ + int i = 0; + uint32_t hash = 0; + + while ( length-- ) + { + hash += string[i] * (i + 119); + i++; + } + + return (hash ^ (hash >> 10) ^ (hash >> 20)); +} + /* ================ return a hash value for the filename @@ -1369,6 +1410,8 @@ static qboolean ParseStage( shaderStage_t *stage, const char **text ) { vec3_t color; + VectorClear( color ); + ParseVector( text, 3, color ); stage->constantColor[0] = 255 * color[0]; stage->constantColor[1] = 255 * color[1]; @@ -2052,6 +2095,7 @@ will optimize it. static qboolean ParseShader( const char **text ) { char *token; + const char *begin = *text; int s; s = 0; @@ -2081,7 +2125,7 @@ static qboolean ParseShader( const char **text ) else if ( token[0] == '{' ) { if ( s >= MAX_SHADER_STAGES ) { - ri->Printf( PRINT_WARNING, "WARNING: too many stages in shader %s\n", shader.name ); + ri->Printf( PRINT_WARNING, "WARNING: too many stages in shader %s (max is %i)\n", shader.name, MAX_SHADER_STAGES ); return qfalse; } @@ -2303,6 +2347,22 @@ static qboolean ParseShader( const char **text ) shader.explicitlyDefined = true; + // The basejka rocket lock wedge shader uses the incorrect blending mode. + // It only worked because the shader state was not being set, and relied + // on previous state to be multiplied by alpha. Since fixing RB_RotatePic, + // the shader needs to be fixed here to render correctly. + // + // We match against the retail version of gfx/2d/wedge by calculating the + // hash value of the shader text, and comparing it against a precalculated + // value. + uint32_t shaderHash = generateHashValueForText( begin, *text - begin ); + if ( shaderHash == RETAIL_ROCKET_WEDGE_SHADER_HASH && + Q_stricmp( shader.name, "gfx/2d/wedge" ) == 0 ) + { + stages[0].stateBits &= ~(GLS_SRCBLEND_BITS | GLS_DSTBLEND_BITS); + stages[0].stateBits |= GLS_SRCBLEND_SRC_ALPHA | GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA; + } + return qtrue; } @@ -3774,6 +3834,106 @@ void R_ShaderList_f (void) { ri->Printf( PRINT_ALL, "------------------\n"); } +int COM_CompressShader( char *data_p ) +{ + char *in, *out; + int c; + qboolean newline = qfalse, whitespace = qfalse; + + in = out = data_p; + if ( in ) + { + while ( (c = *in) != 0 ) + { + // skip double slash comments + if ( c == '/' && in[1] == '/' ) + { + while ( *in && *in != '\n' ) + { + in++; + } + } + // skip number sign comments + else if ( c == '#' ) + { + while ( *in && *in != '\n' ) + { + in++; + } + } + // skip /* */ comments + else if ( c == '/' && in[1] == '*' ) + { + while ( *in && (*in != '*' || in[1] != '/') ) + in++; + if ( *in ) + in += 2; + } + // record when we hit a newline + else if ( c == '\n' || c == '\r' ) + { + newline = qtrue; + in++; + } + // record when we hit whitespace + else if ( c == ' ' || c == '\t' ) + { + whitespace = qtrue; + in++; + // an actual token + } + else + { + // if we have a pending newline, emit it (and it counts as whitespace) + if ( newline ) + { + *out++ = '\n'; + newline = qfalse; + whitespace = qfalse; + } if ( whitespace ) + { + *out++ = ' '; + whitespace = qfalse; + } + + // copy quoted strings unmolested + if ( c == '"' ) + { + *out++ = c; + in++; + while ( 1 ) + { + c = *in; + if ( c && c != '"' ) + { + *out++ = c; + in++; + } + else + { + break; + } + } + if ( c == '"' ) + { + *out++ = c; + in++; + } + } + else + { + *out = c; + out++; + in++; + } + } + } + + *out = 0; + } + return out - data_p; +} + /* ==================== ScanAndLoadShaderFiles @@ -3835,6 +3995,14 @@ static void ScanAndLoadShaderFiles( void ) Q_strncpyz(shaderName, token, sizeof(shaderName)); shaderLine = COM_GetCurrentParseLine(); + if ( token[0] == '#' ) + { + ri->Printf( PRINT_WARNING, "WARNING: Deprecated shader comment \"%s\" on line %d in file %s. Ignoring line.\n", + shaderName, shaderLine, filename ); + SkipRestOfLine( &p ); + continue; + } + token = COM_ParseExt(&p, qtrue); if(token[0] != '{' || token[1] != '\0') { @@ -3882,7 +4050,7 @@ static void ScanAndLoadShaderFiles( void ) ri->FS_FreeFile( buffers[i] ); } - COM_Compress( s_shaderText ); + COM_CompressShader( s_shaderText ); // free up memory ri->FS_FreeFileList( shaderFiles ); @@ -3898,6 +4066,12 @@ static void ScanAndLoadShaderFiles( void ) break; } + if ( token[0] == '#' ) + { + SkipRestOfLine( &p ); + continue; + } + hash = generateHashValue(token, MAX_SHADERTEXT_HASH); shaderTextHashTableSizes[hash]++; size++; @@ -3924,6 +4098,12 @@ static void ScanAndLoadShaderFiles( void ) break; } + if ( token[0] == '#' ) + { + SkipRestOfLine( &p ); + continue; + } + hash = generateHashValue(token, MAX_SHADERTEXT_HASH); shaderTextHashTable[hash][shaderTextHashTableSizes[hash]++] = oldp; @@ -3970,7 +4150,7 @@ static void CreateInternalShaders( void ) { tr.distortionShader = FinishShader(); shader.defaultShader = qtrue; - ARB_InitGlowShaders(); + ARB_InitGPUShaders(); } static void CreateExternalShaders( void ) { diff --git a/codemp/rd-vanilla/tr_shadows.cpp b/codemp/rd-vanilla/tr_shadows.cpp index a741d44b2c..473e2538fc 100644 --- a/codemp/rd-vanilla/tr_shadows.cpp +++ b/codemp/rd-vanilla/tr_shadows.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "tr_local.h" @@ -25,6 +48,7 @@ typedef struct edgeDef_s { static edgeDef_t edgeDefs[SHADER_MAX_VERTEXES][MAX_EDGE_DEFS]; static int numEdgeDefs[SHADER_MAX_VERTEXES]; static int facing[SHADER_MAX_INDEXES/3]; +static vec3_t shadowXyz[SHADER_MAX_VERTEXES]; void R_AddEdgeDef( int i1, int i2, int facing ) { int c; @@ -77,9 +101,9 @@ void R_RenderShadowEdges( void ) { i2 = edgeDefs[ i ][ j ].i2; qglBegin( GL_TRIANGLE_STRIP ); qglVertex3fv( tess.xyz[ i ] ); - qglVertex3fv( tess.xyz[ i + tess.numVertexes ] ); + qglVertex3fv( shadowXyz[ i ] ); qglVertex3fv( tess.xyz[ i2 ] ); - qglVertex3fv( tess.xyz[ i2 + tess.numVertexes ] ); + qglVertex3fv( shadowXyz[ i2 ] ); qglEnd(); #else hit[0] = 0; @@ -99,9 +123,9 @@ void R_RenderShadowEdges( void ) { { qglBegin( GL_TRIANGLE_STRIP ); qglVertex3fv( tess.xyz[ i ] ); - qglVertex3fv( tess.xyz[ i + tess.numVertexes ] ); + qglVertex3fv( shadowXyz[ i ] ); qglVertex3fv( tess.xyz[ i2 ] ); - qglVertex3fv( tess.xyz[ i2 + tess.numVertexes ] ); + qglVertex3fv( shadowXyz[ i2 ] ); qglEnd(); c_edges++; } else { @@ -133,9 +157,9 @@ void R_RenderShadowEdges( void ) { qglVertex3fv(tess.xyz[o3]); qglEnd(); qglBegin(GL_TRIANGLES); - qglVertex3fv(tess.xyz[o3 + tess.numVertexes]); - qglVertex3fv(tess.xyz[o2 + tess.numVertexes]); - qglVertex3fv(tess.xyz[o1 + tess.numVertexes]); + qglVertex3fv(shadowXyz[o3]); + qglVertex3fv(shadowXyz[o2]); + qglVertex3fv(shadowXyz[o1]); qglEnd(); } #endif @@ -204,11 +228,6 @@ void RB_DoShadowTessEnd( vec3_t lightPos ) int numTris; vec3_t lightDir; - // we can only do this if we have enough space in the vertex buffers - if ( tess.numVertexes >= SHADER_MAX_VERTEXES / 2 ) { - return; - } - if ( glConfig.stencilBits < 4 ) { return; } @@ -233,16 +252,16 @@ void RB_DoShadowTessEnd( vec3_t lightPos ) VectorAdd(tess.xyz[i], backEnd.ori.origin, worldxyz); groundDist = worldxyz[2] - backEnd.currentEntity->e.shadowPlane; groundDist += 16.0f; //fudge factor - VectorMA( tess.xyz[i], -groundDist, lightDir, tess.xyz[i+tess.numVertexes] ); + VectorMA( tess.xyz[i], -groundDist, lightDir, shadowXyz[i] ); } #else if (lightPos) { for ( i = 0 ; i < tess.numVertexes ; i++ ) { - tess.xyz[i+tess.numVertexes][0] = tess.xyz[i][0]+(( tess.xyz[i][0]-lightPos[0] )*128.0f); - tess.xyz[i+tess.numVertexes][1] = tess.xyz[i][1]+(( tess.xyz[i][1]-lightPos[1] )*128.0f); - tess.xyz[i+tess.numVertexes][2] = tess.xyz[i][2]+(( tess.xyz[i][2]-lightPos[2] )*128.0f); + shadowXyz[i][0] = tess.xyz[i][0]+(( tess.xyz[i][0]-lightPos[0] )*128.0f); + shadowXyz[i][1] = tess.xyz[i][1]+(( tess.xyz[i][1]-lightPos[1] )*128.0f); + shadowXyz[i][2] = tess.xyz[i][2]+(( tess.xyz[i][2]-lightPos[2] )*128.0f); } } else @@ -251,7 +270,7 @@ void RB_DoShadowTessEnd( vec3_t lightPos ) // project vertexes away from light direction for ( i = 0 ; i < tess.numVertexes ; i++ ) { - VectorMA( tess.xyz[i], -512, lightDir, tess.xyz[i+tess.numVertexes] ); + VectorMA( tess.xyz[i], -512, lightDir, shadowXyz[i] ); } } #endif diff --git a/codemp/rd-vanilla/tr_skin.cpp b/codemp/rd-vanilla/tr_skin.cpp index d064fcd3f0..f54e8beaa7 100644 --- a/codemp/rd-vanilla/tr_skin.cpp +++ b/codemp/rd-vanilla/tr_skin.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "tr_local.h" /* @@ -255,7 +277,7 @@ static char *CommaParse( char **data_p ) { while ( 1 ) { // skip whitespace - while( (c = *data) <= ' ') { + while( (c = *(const unsigned char* /*eurofix*/)data) <= ' ') { if( !c ) { break; } diff --git a/codemp/rd-vanilla/tr_sky.cpp b/codemp/rd-vanilla/tr_sky.cpp index 0b288635bd..77ee0aba0c 100644 --- a/codemp/rd-vanilla/tr_sky.cpp +++ b/codemp/rd-vanilla/tr_sky.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_sky.c #include "tr_local.h" diff --git a/codemp/rd-vanilla/tr_subs.cpp b/codemp/rd-vanilla/tr_subs.cpp index aaf22db3c1..503ac069df 100644 --- a/codemp/rd-vanilla/tr_subs.cpp +++ b/codemp/rd-vanilla/tr_subs.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_subs.cpp - common function replacements for modular renderer #include "tr_local.h" @@ -70,13 +93,3 @@ int Z_MemSize( memtag_t eTag ) { void Z_MorphMallocTag( void *pvBuffer, memtag_t eDesiredTag ) { ri->Z_MorphMallocTag( pvBuffer, eDesiredTag ); } - -#ifndef _WIN32 -void Sys_SetEnv(const char *name, const char *value) -{ - if(value && *value) - setenv(name, value, 1); - else - unsetenv(name); -} -#endif diff --git a/codemp/rd-vanilla/tr_surface.cpp b/codemp/rd-vanilla/tr_surface.cpp index 20f3716bf1..9219f7e36b 100644 --- a/codemp/rd-vanilla/tr_surface.cpp +++ b/codemp/rd-vanilla/tr_surface.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_surf.c #include "tr_local.h" @@ -25,16 +48,10 @@ RB_CheckOverflow ============== */ void RB_CheckOverflow( int verts, int indexes ) { - if ( tess.shader == tr.shadowShader ) { - if (tess.numVertexes + verts < SHADER_MAX_VERTEXES/2 - && tess.numIndexes + indexes < SHADER_MAX_INDEXES) { - return; - } - } else - if (tess.numVertexes + verts < SHADER_MAX_VERTEXES - && tess.numIndexes + indexes < SHADER_MAX_INDEXES) { - return; - } + if (tess.numVertexes + verts < SHADER_MAX_VERTEXES + && tess.numIndexes + indexes < SHADER_MAX_INDEXES) { + return; + } RB_EndSurface(); @@ -110,11 +127,15 @@ void RB_AddQuadStampExt( vec3_t origin, vec3_t left, vec3_t up, byte *color, flo // constant color all the way around // should this be identity and let the shader specify from entity? - * ( unsigned int * ) &tess.vertexColors[ndx] = - * ( unsigned int * ) &tess.vertexColors[ndx+1] = - * ( unsigned int * ) &tess.vertexColors[ndx+2] = - * ( unsigned int * ) &tess.vertexColors[ndx+3] = - * ( unsigned int * )color; + byteAlias_t *baSource = (byteAlias_t *)color, *baDest; + baDest = (byteAlias_t *)&tess.vertexColors[ndx + 0]; + baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[ndx + 1]; + baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[ndx + 2]; + baDest->ui = baSource->ui; + baDest = (byteAlias_t *)&tess.vertexColors[ndx + 3]; + baDest->ui = baSource->ui; tess.numVertexes += 4; @@ -233,9 +254,9 @@ void RB_SurfacePolychain( srfPoly_t *p ) { VectorCopy( p->verts[i].xyz, tess.xyz[numv] ); tess.texCoords[numv][0][0] = p->verts[i].st[0]; tess.texCoords[numv][0][1] = p->verts[i].st[1]; - *(int *)&tess.vertexColors[numv] = *(int *)p->verts[ i ].modulate; - - numv++; + byteAlias_t *baDest = (byteAlias_t *)&tess.vertexColors[numv++], + *baSource = (byteAlias_t *)&p->verts[ i ].modulate; + baDest->i = baSource->i; } // generate fan indexes into the tess array diff --git a/codemp/rd-vanilla/tr_surfacesprites.cpp b/codemp/rd-vanilla/tr_surfacesprites.cpp index 93e406aab6..ecbda8ee73 100644 --- a/codemp/rd-vanilla/tr_surfacesprites.cpp +++ b/codemp/rd-vanilla/tr_surfacesprites.cpp @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // tr_shade.c #include "tr_local.h" diff --git a/codemp/rd-vanilla/tr_world.cpp b/codemp/rd-vanilla/tr_world.cpp index ed70211274..9a7a6baa76 100644 --- a/codemp/rd-vanilla/tr_world.cpp +++ b/codemp/rd-vanilla/tr_world.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "tr_local.h" inline void Q_CastShort2Float(float *f, const short *s) diff --git a/codemp/sdl/sdl_glimp.cpp b/codemp/sdl/sdl_glimp.cpp deleted file mode 100644 index 1b0139fb62..0000000000 --- a/codemp/sdl/sdl_glimp.cpp +++ /dev/null @@ -1,1105 +0,0 @@ -#include -#include "qcommon/qcommon.h" -#include "../rd-vanilla/tr_local.h" -#include "sdl_qgl.h" -#include "sys/sys_local.h" - -static float displayAspect; -cvar_t *r_allowSoftwareGL; // Don't abort out if a hardware visual can't be obtained -cvar_t *r_allowResize; // make window resizable -cvar_t *r_sdlDriver; - -typedef enum -{ - RSERR_OK, - - RSERR_INVALID_FULLSCREEN, - RSERR_INVALID_MODE, - - RSERR_UNKNOWN -} rserr_t; - -static SDL_Window *screen = NULL; -static SDL_GLContext opengl_context; - -bool g_bTextureRectangleHack = false; - -void (APIENTRYP qglActiveTextureARB) (GLenum texture); -void (APIENTRYP qglClientActiveTextureARB) (GLenum texture); -void (APIENTRYP qglMultiTexCoord2fARB) (GLenum target, GLfloat s, GLfloat t); - -void (APIENTRYP qglCombinerParameterfvNV) (GLenum pname,const GLfloat *params); -void (APIENTRYP qglCombinerParameterivNV) (GLenum pname,const GLint *params); -void (APIENTRYP qglCombinerParameterfNV) (GLenum pname,GLfloat param); -void (APIENTRYP qglCombinerParameteriNV) (GLenum pname,GLint param); -void (APIENTRYP qglCombinerInputNV) (GLenum stage,GLenum portion,GLenum variable,GLenum input,GLenum mapping, - GLenum componentUsage); -void (APIENTRYP qglCombinerOutputNV) (GLenum stage,GLenum portion,GLenum abOutput,GLenum cdOutput,GLenum sumOutput, - GLenum scale, GLenum bias,GLboolean abDotProduct,GLboolean cdDotProduct, - GLboolean muxSum); - -void (APIENTRYP qglFinalCombinerInputNV) (GLenum variable,GLenum input,GLenum mapping,GLenum componentUsage); -void (APIENTRYP qglGetCombinerInputParameterfvNV) (GLenum stage,GLenum portion,GLenum variable,GLenum pname,GLfloat *params); -void (APIENTRYP qglGetCombinerInputParameterivNV) (GLenum stage,GLenum portion,GLenum variable,GLenum pname,GLint *params); -void (APIENTRYP qglGetCombinerOutputParameterfvNV) (GLenum stage,GLenum portion,GLenum pname,GLfloat *params); -void (APIENTRYP qglGetCombinerOutputParameterivNV) (GLenum stage,GLenum portion,GLenum pname,GLint *params); -void (APIENTRYP qglGetFinalCombinerInputParameterfvNV) (GLenum variable,GLenum pname,GLfloat *params); -void (APIENTRYP qglGetFinalCombinerInputParameterivNV) (GLenum variable,GLenum pname,GLint *params); - -PFNGLPROGRAMSTRINGARBPROC qglProgramStringARB = NULL; -PFNGLBINDPROGRAMARBPROC qglBindProgramARB = NULL; -PFNGLDELETEPROGRAMSARBPROC qglDeleteProgramsARB = NULL; -PFNGLGENPROGRAMSARBPROC qglGenProgramsARB = NULL; -PFNGLPROGRAMENVPARAMETER4DARBPROC qglProgramEnvParameter4dARB = NULL; -PFNGLPROGRAMENVPARAMETER4DVARBPROC qglProgramEnvParameter4dvARB = NULL; -PFNGLPROGRAMENVPARAMETER4FARBPROC qglProgramEnvParameter4fARB = NULL; -PFNGLPROGRAMENVPARAMETER4FVARBPROC qglProgramEnvParameter4fvARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4DARBPROC qglProgramLocalParameter4dARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4DVARBPROC qglProgramLocalParameter4dvARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4FARBPROC qglProgramLocalParameter4fARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4FVARBPROC qglProgramLocalParameter4fvARB = NULL; -PFNGLGETPROGRAMENVPARAMETERDVARBPROC qglGetProgramEnvParameterdvARB = NULL; -PFNGLGETPROGRAMENVPARAMETERFVARBPROC qglGetProgramEnvParameterfvARB = NULL; -PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC qglGetProgramLocalParameterdvARB = NULL; -PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC qglGetProgramLocalParameterfvARB = NULL; -PFNGLGETPROGRAMIVARBPROC qglGetProgramivARB = NULL; -PFNGLGETPROGRAMSTRINGARBPROC qglGetProgramStringARB = NULL; -PFNGLISPROGRAMARBPROC qglIsProgramARB = NULL; - -void ( * qglLockArraysEXT)( int, int); -void ( * qglUnlockArraysEXT) ( void ); - -/* -=============== -GLimp_Minimize - -Minimize the game so that user is back at the desktop -=============== -*/ -void GLimp_Minimize(void) -{ - SDL_MinimizeWindow( screen ); -} - -void GLimp_EndFrame( void ) -{ - SDL_GL_SwapWindow(screen); -} - -/* -=============== -GLimp_CompareModes -=============== -*/ -static int GLimp_CompareModes( const void *a, const void *b ) -{ - const float ASPECT_EPSILON = 0.001f; - SDL_Rect *modeA = (SDL_Rect *)a; - SDL_Rect *modeB = (SDL_Rect *)b; - float aspectA = (float)modeA->w / (float)modeA->h; - float aspectB = (float)modeB->w / (float)modeB->h; - int areaA = modeA->w * modeA->h; - int areaB = modeB->w * modeB->h; - float aspectDiffA = fabs( aspectA - displayAspect ); - float aspectDiffB = fabs( aspectB - displayAspect ); - float aspectDiffsDiff = aspectDiffA - aspectDiffB; - - if( aspectDiffsDiff > ASPECT_EPSILON ) - return 1; - else if( aspectDiffsDiff < -ASPECT_EPSILON ) - return -1; - else - return areaA - areaB; -} - -/* -=============== -GLimp_DetectAvailableModes -=============== -*/ -static bool GLimp_DetectAvailableModes(void) -{ - int i; - char buf[ MAX_STRING_CHARS ] = { 0 }; - SDL_Rect modes[ 128 ]; - int numModes = 0; - - int display = SDL_GetWindowDisplayIndex( screen ); - SDL_DisplayMode windowMode; - - if( SDL_GetWindowDisplayMode( screen, &windowMode ) < 0 ) - { - Com_Printf( "Couldn't get window display mode, no resolutions detected (%s).\n", SDL_GetError() ); - return false; - } - - int numDisplayModes = SDL_GetNumDisplayModes( display ); - for( i = 0; i < numDisplayModes; i++ ) - { - SDL_DisplayMode mode; - - if( SDL_GetDisplayMode( display, i, &mode ) < 0 ) - continue; - - if( !mode.w || !mode.h ) - { - Com_Printf( "Display supports any resolution\n" ); - return true; - } - - if( windowMode.format != mode.format ) - continue; - - modes[ numModes ].w = mode.w; - modes[ numModes ].h = mode.h; - numModes++; - } - - if( numModes > 1 ) - qsort( modes, numModes, sizeof( SDL_Rect ), GLimp_CompareModes ); - - for( i = 0; i < numModes; i++ ) - { - const char *newModeString = va( "%ux%u ", modes[ i ].w, modes[ i ].h ); - - if( strlen( newModeString ) < (int)sizeof( buf ) - strlen( buf ) ) - Q_strcat( buf, sizeof( buf ), newModeString ); - else - Com_Printf( "Skipping mode %ux%x, buffer too small\n", modes[ i ].w, modes[ i ].h ); - } - - if( *buf ) - { - buf[ strlen( buf ) - 1 ] = 0; - Com_Printf( "Available modes: '%s'\n", buf ); - ri->Cvar_Set( "r_availableModes", buf ); - } - - return true; -} - -/* -=============== -GLimp_SetMode -=============== -*/ -static rserr_t GLimp_SetMode(int mode, qboolean fullscreen, qboolean noborder) -{ - const char *glstring; - int perChannelColorBits; - int colorBits, depthBits, stencilBits; - //int samples; - int i = 0; - Uint32 flags = SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL; - SDL_DisplayMode desktopMode; - int display = 0; - int x = SDL_WINDOWPOS_UNDEFINED, y = SDL_WINDOWPOS_UNDEFINED; - - Com_Printf( "Initializing OpenGL display\n"); - - if ( r_allowResize->integer && !fullscreen ) - flags |= SDL_WINDOW_RESIZABLE; - - // If a window exists, note its display index - if( screen != NULL ) - display = SDL_GetWindowDisplayIndex( screen ); - - if( SDL_GetDesktopDisplayMode( display, &desktopMode ) == 0 ) - { - displayAspect = (float)desktopMode.w / (float)desktopMode.h; - - Com_Printf( "Display aspect: %.3f\n", displayAspect ); - } - else - { - Com_Memset( &desktopMode, 0, sizeof( SDL_DisplayMode ) ); - - Com_Printf( "Cannot determine display aspect, assuming 1.333\n" ); - } - - Com_Printf( "...setting mode %d:", mode ); - - if (mode == -2) - { - // use desktop video resolution - if( desktopMode.h > 0 ) - { - glConfig.vidWidth = desktopMode.w; - glConfig.vidHeight = desktopMode.h; - } - else - { - glConfig.vidWidth = 640; - glConfig.vidHeight = 480; - Com_Printf( "Cannot determine display resolution, assuming 640x480\n" ); - } - - //glConfig.windowAspect = (float)glConfig.vidWidth / (float)glConfig.vidHeight; - } - else if ( !R_GetModeInfo( &glConfig.vidWidth, &glConfig.vidHeight, /*&glConfig.windowAspect,*/ mode ) ) - { - Com_Printf( " invalid mode\n" ); - return RSERR_INVALID_MODE; - } - Com_Printf( " %d %d\n", glConfig.vidWidth, glConfig.vidHeight); - - // Center window - if( r_centerWindow->integer && !fullscreen ) - { - x = ( desktopMode.w / 2 ) - ( glConfig.vidWidth / 2 ); - y = ( desktopMode.h / 2 ) - ( glConfig.vidHeight / 2 ); - } - - // Destroy existing state if it exists - if( opengl_context != NULL ) - { - SDL_GL_DeleteContext( opengl_context ); - opengl_context = NULL; - } - - if( screen != NULL ) - { - SDL_GetWindowPosition( screen, &x, &y ); - ri->Printf( PRINT_DEVELOPER, "Existing window at %dx%d before being destroyed\n", x, y ); - SDL_DestroyWindow( screen ); - screen = NULL; - } - - if( fullscreen ) - { - flags |= SDL_WINDOW_FULLSCREEN; - glConfig.isFullscreen = qtrue; - } - else - { - if( noborder ) - flags |= SDL_WINDOW_BORDERLESS; - - glConfig.isFullscreen = qfalse; - } - - colorBits = r_colorbits->value; - if ((!colorBits) || (colorBits >= 32)) - colorBits = 24; - - if (!r_depthbits->value) - depthBits = 24; - else - depthBits = r_depthbits->value; - - stencilBits = r_stencilbits->value; - //samples = r_ext_multisample->value; - - for (i = 0; i < 16; i++) - { - int testColorBits, testDepthBits, testStencilBits; - - // 0 - default - // 1 - minus colorBits - // 2 - minus depthBits - // 3 - minus stencil - if ((i % 4) == 0 && i) - { - // one pass, reduce - switch (i / 4) - { - case 2 : - if (colorBits == 24) - colorBits = 16; - break; - case 1 : - if (depthBits == 24) - depthBits = 16; - else if (depthBits == 16) - depthBits = 8; - case 3 : - if (stencilBits == 24) - stencilBits = 16; - else if (stencilBits == 16) - stencilBits = 8; - } - } - - testColorBits = colorBits; - testDepthBits = depthBits; - testStencilBits = stencilBits; - - if ((i % 4) == 3) - { // reduce colorBits - if (testColorBits == 24) - testColorBits = 16; - } - - if ((i % 4) == 2) - { // reduce depthBits - if (testDepthBits == 24) - testDepthBits = 16; - else if (testDepthBits == 16) - testDepthBits = 8; - } - - if ((i % 4) == 1) - { // reduce stencilBits - if (testStencilBits == 24) - testStencilBits = 16; - else if (testStencilBits == 16) - testStencilBits = 8; - else - testStencilBits = 0; - } - - if (testColorBits == 24) - perChannelColorBits = 8; - else - perChannelColorBits = 4; - -#ifdef __sgi /* Fix for SGIs grabbing too many bits of color */ - if (perChannelColorBits == 4) - perChannelColorBits = 0; /* Use minimum size for 16-bit color */ - - /* Need alpha or else SGIs choose 36+ bit RGB mode */ - SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 1); -#endif - - SDL_GL_SetAttribute( SDL_GL_RED_SIZE, perChannelColorBits ); - SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, perChannelColorBits ); - SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, perChannelColorBits ); - SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, testDepthBits ); - SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, testStencilBits ); - - /*SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, samples ? 1 : 0 ); - SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, samples );*/ - - if(r_stereo->integer) - { - glConfig.stereoEnabled = qtrue; - SDL_GL_SetAttribute(SDL_GL_STEREO, 1); - } - else - { - glConfig.stereoEnabled = qfalse; - SDL_GL_SetAttribute(SDL_GL_STEREO, 0); - } - - SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); - - // If not allowing software GL, demand accelerated - if( !r_allowSoftwareGL->integer ) - SDL_GL_SetAttribute( SDL_GL_ACCELERATED_VISUAL, 1 ); - - if( ( screen = SDL_CreateWindow( CLIENT_WINDOW_TITLE, x, y, - glConfig.vidWidth, glConfig.vidHeight, flags ) ) == NULL ) - { - ri->Printf( PRINT_DEVELOPER, "SDL_CreateWindow failed: %s\n", SDL_GetError( ) ); - continue; - } - - if( fullscreen ) - { - SDL_DisplayMode mode; - - switch( testColorBits ) - { - case 16: mode.format = SDL_PIXELFORMAT_RGB565; break; - case 24: mode.format = SDL_PIXELFORMAT_RGB24; break; - default: ri->Printf( PRINT_DEVELOPER, "testColorBits is %d, can't fullscreen\n", testColorBits ); continue; - } - - mode.w = glConfig.vidWidth; - mode.h = glConfig.vidHeight; - mode.refresh_rate = glConfig.displayFrequency = ri->Cvar_VariableIntegerValue( "r_displayRefresh" ); - mode.driverdata = NULL; - - if( SDL_SetWindowDisplayMode( screen, &mode ) < 0 ) - { - ri->Printf( PRINT_DEVELOPER, "SDL_SetWindowDisplayMode failed: %s\n", SDL_GetError( ) ); - continue; - } - } - - SDL_SetWindowTitle( screen, CLIENT_WINDOW_TITLE ); - - if( ( opengl_context = SDL_GL_CreateContext( screen ) ) == NULL ) - { - Com_Printf( "SDL_GL_CreateContext failed: %s\n", SDL_GetError( ) ); - continue; - } - - SDL_GL_SetSwapInterval( r_swapInterval->integer ); - - glConfig.colorBits = testColorBits; - glConfig.depthBits = testDepthBits; - glConfig.stencilBits = testStencilBits; - - Com_Printf( "Using %d color bits, %d depth, %d stencil display.\n", - glConfig.colorBits, glConfig.depthBits, glConfig.stencilBits ); - break; - } - - if (!GLimp_DetectAvailableModes()) - { - return RSERR_UNKNOWN; - } - - glstring = (char *) qglGetString (GL_RENDERER); - Com_Printf( "GL_RENDERER: %s\n", glstring ); - - return RSERR_OK; -} - -/* -=============== -GLimp_StartDriverAndSetMode -=============== -*/ -static qboolean GLimp_StartDriverAndSetMode(int mode, qboolean fullscreen, qboolean noborder) -{ - rserr_t err; - - if (!SDL_WasInit(SDL_INIT_VIDEO)) - { - const char *driverName; - - if (SDL_Init(SDL_INIT_VIDEO) == -1) - { - Com_Printf( "SDL_Init( SDL_INIT_VIDEO ) FAILED (%s)\n", - SDL_GetError()); - return qfalse; - } - - driverName = SDL_GetCurrentVideoDriver(); - - if (!driverName) - { - Com_Error( ERR_FATAL, "No video driver initialized" ); - return qfalse; - } - - Com_Printf( "SDL using driver \"%s\"\n", driverName ); - ri->Cvar_Set( "r_sdlDriver", driverName ); - } - - if (SDL_GetNumVideoDisplays() <= 0) - { - Com_Error( ERR_FATAL, "SDL_GetNumVideoDisplays() FAILED (%s)", SDL_GetError() ); - } - - if (fullscreen && ri->Cvar_VariableIntegerValue( "in_nograb" ) ) - { - Com_Printf( "Fullscreen not allowed with in_nograb 1\n"); - ri->Cvar_Set( "r_fullscreen", "0" ); - r_fullscreen->modified = qfalse; - fullscreen = qfalse; - } - - err = GLimp_SetMode(mode, fullscreen, noborder); - - switch ( err ) - { - case RSERR_INVALID_FULLSCREEN: - Com_Printf( "...WARNING: fullscreen unavailable in this mode\n" ); - return qfalse; - case RSERR_INVALID_MODE: - Com_Printf( "...WARNING: could not set the given mode (%d)\n", mode ); - return qfalse; - case RSERR_UNKNOWN: - Com_Printf( "...ERROR: no display modes could be found.\n" ); - return qfalse; - default: - break; - } - - return qtrue; -} - -/* -** GLW_CheckForExtension - - Cannot use strstr directly to differentiate between (for eg) reg_combiners and reg_combiners2 -*/ - -bool GL_CheckForExtension(const char *ext) -{ - const char *ptr = Q_stristr( glConfigExt.originalExtensionString, ext ); - if (ptr == NULL) - return false; - ptr += strlen(ext); - return ((*ptr == ' ') || (*ptr == '\0')); // verify it's complete string. -} - -static void GLW_InitTextureCompression( void ) -{ - bool newer_tc, old_tc; - - // Check for available tc methods. - newer_tc = GL_CheckForExtension("ARB_texture_compression") && GL_CheckForExtension("EXT_texture_compression_s3tc"); - old_tc = GL_CheckForExtension("GL_S3_s3tc"); - - if ( old_tc ) - { - Com_Printf ("...GL_S3_s3tc available\n" ); - } - - if ( newer_tc ) - { - Com_Printf ("...GL_EXT_texture_compression_s3tc available\n" ); - } - - if ( !r_ext_compressed_textures->value ) - { - // Compressed textures are off - glConfig.textureCompression = TC_NONE; - Com_Printf ("...ignoring texture compression\n" ); - } - else if ( !old_tc && !newer_tc ) - { - // Requesting texture compression, but no method found - glConfig.textureCompression = TC_NONE; - Com_Printf ("...no supported texture compression method found\n" ); - Com_Printf (".....ignoring texture compression\n" ); - } - else - { - // some form of supported texture compression is avaiable, so see if the user has a preference - if ( r_ext_preferred_tc_method->integer == TC_NONE ) - { - // No preference, so pick the best - if ( newer_tc ) - { - Com_Printf ("...no tc preference specified\n" ); - Com_Printf (".....using GL_EXT_texture_compression_s3tc\n" ); - glConfig.textureCompression = TC_S3TC_DXT; - } - else - { - Com_Printf ("...no tc preference specified\n" ); - Com_Printf (".....using GL_S3_s3tc\n" ); - glConfig.textureCompression = TC_S3TC; - } - } - else - { - // User has specified a preference, now see if this request can be honored - if ( old_tc && newer_tc ) - { - // both are avaiable, so we can use the desired tc method - if ( r_ext_preferred_tc_method->integer == TC_S3TC ) - { - Com_Printf ("...using preferred tc method, GL_S3_s3tc\n" ); - glConfig.textureCompression = TC_S3TC; - } - else - { - Com_Printf ("...using preferred tc method, GL_EXT_texture_compression_s3tc\n" ); - glConfig.textureCompression = TC_S3TC_DXT; - } - } - else - { - // Both methods are not available, so this gets trickier - if ( r_ext_preferred_tc_method->integer == TC_S3TC ) - { - // Preferring to user older compression - if ( old_tc ) - { - Com_Printf ("...using GL_S3_s3tc\n" ); - glConfig.textureCompression = TC_S3TC; - } - else - { - // Drat, preference can't be honored - Com_Printf ("...preferred tc method, GL_S3_s3tc not available\n" ); - Com_Printf (".....falling back to GL_EXT_texture_compression_s3tc\n" ); - glConfig.textureCompression = TC_S3TC_DXT; - } - } - else - { - // Preferring to user newer compression - if ( newer_tc ) - { - Com_Printf ("...using GL_EXT_texture_compression_s3tc\n" ); - glConfig.textureCompression = TC_S3TC_DXT; - } - else - { - // Drat, preference can't be honored - Com_Printf ("...preferred tc method, GL_EXT_texture_compression_s3tc not available\n" ); - Com_Printf (".....falling back to GL_S3_s3tc\n" ); - glConfig.textureCompression = TC_S3TC; - } - } - } - } - } -} - -/* -=============== -GLimp_InitExtensions -=============== -*/ -extern bool g_bDynamicGlowSupported; -static void GLimp_InitExtensions( void ) -{ - if ( !r_allowExtensions->integer ) - { - Com_Printf ("*** IGNORING OPENGL EXTENSIONS ***\n" ); - g_bDynamicGlowSupported = false; - ri->Cvar_Set( "r_DynamicGlow","0" ); - return; - } - - Com_Printf ("Initializing OpenGL extensions\n" ); - - // Select our tc scheme - GLW_InitTextureCompression(); - - // GL_EXT_texture_env_add - glConfig.textureEnvAddAvailable = qfalse; - if ( GL_CheckForExtension( "EXT_texture_env_add" ) ) - { - if ( r_ext_texture_env_add->integer ) - { - glConfig.textureEnvAddAvailable = qtrue; - Com_Printf ("...using GL_EXT_texture_env_add\n" ); - } - else - { - glConfig.textureEnvAddAvailable = qfalse; - Com_Printf ("...ignoring GL_EXT_texture_env_add\n" ); - } - } - else - { - Com_Printf ("...GL_EXT_texture_env_add not found\n" ); - } - - // GL_EXT_texture_filter_anisotropic - glConfig.maxTextureFilterAnisotropy = 0; - if ( GL_CheckForExtension( "EXT_texture_filter_anisotropic" ) ) - { -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF //can't include glext.h here ... sigh - qglGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &glConfig.maxTextureFilterAnisotropy ); - Com_Printf ("...GL_EXT_texture_filter_anisotropic available\n" ); - - if ( r_ext_texture_filter_anisotropic->integer > 1 ) - { - Com_Printf ("...using GL_EXT_texture_filter_anisotropic\n" ); - } - else - { - Com_Printf ("...ignoring GL_EXT_texture_filter_anisotropic\n" ); - } - ri->Cvar_SetValue( "r_ext_texture_filter_anisotropic_avail", glConfig.maxTextureFilterAnisotropy ); - if ( r_ext_texture_filter_anisotropic->value > glConfig.maxTextureFilterAnisotropy ) - { - ri->Cvar_SetValue( "r_ext_texture_filter_anisotropic_avail", glConfig.maxTextureFilterAnisotropy ); - } - } - else - { - Com_Printf ("...GL_EXT_texture_filter_anisotropic not found\n" ); - ri->Cvar_Set( "r_ext_texture_filter_anisotropic_avail", "0" ); - } - - // GL_EXT_clamp_to_edge - glConfig.clampToEdgeAvailable = qtrue; - Com_Printf ("...using GL_EXT_texture_edge_clamp\n" ); - - // GL_ARB_multitexture - qglMultiTexCoord2fARB = NULL; - qglActiveTextureARB = NULL; - qglClientActiveTextureARB = NULL; - if ( GL_CheckForExtension( "GL_ARB_multitexture" ) ) - { - if ( r_ext_multitexture->integer ) - { - qglMultiTexCoord2fARB = ( PFNGLMULTITEXCOORD2FARBPROC ) SDL_GL_GetProcAddress( "glMultiTexCoord2fARB" ); - qglActiveTextureARB = ( PFNGLACTIVETEXTUREARBPROC ) SDL_GL_GetProcAddress( "glActiveTextureARB" ); - qglClientActiveTextureARB = ( PFNGLCLIENTACTIVETEXTUREARBPROC ) SDL_GL_GetProcAddress( "glClientActiveTextureARB" ); - - if ( qglActiveTextureARB ) - { - qglGetIntegerv( GL_MAX_ACTIVE_TEXTURES_ARB, &glConfig.maxActiveTextures ); - - if ( glConfig.maxActiveTextures > 1 ) - { - Com_Printf ("...using GL_ARB_multitexture\n" ); - } - else - { - qglMultiTexCoord2fARB = NULL; - qglActiveTextureARB = NULL; - qglClientActiveTextureARB = NULL; - Com_Printf ("...not using GL_ARB_multitexture, < 2 texture units\n" ); - } - } - } - else - { - Com_Printf ("...ignoring GL_ARB_multitexture\n" ); - } - } - else - { - Com_Printf ("...GL_ARB_multitexture not found\n" ); - } - - // GL_EXT_compiled_vertex_array - qglLockArraysEXT = NULL; - qglUnlockArraysEXT = NULL; - if ( GL_CheckForExtension( "GL_EXT_compiled_vertex_array" ) ) - { - if ( r_ext_compiled_vertex_array->integer ) - { - Com_Printf ("...using GL_EXT_compiled_vertex_array\n" ); - qglLockArraysEXT = ( void ( APIENTRY * )( int, int ) ) SDL_GL_GetProcAddress( "glLockArraysEXT" ); - qglUnlockArraysEXT = ( void ( APIENTRY * )( void ) ) SDL_GL_GetProcAddress( "glUnlockArraysEXT" ); - if (!qglLockArraysEXT || !qglUnlockArraysEXT) { - Com_Error (ERR_FATAL, "bad getprocaddress"); - } - } - else - { - Com_Printf ("...ignoring GL_EXT_compiled_vertex_array\n" ); - } - } - else - { - Com_Printf ("...GL_EXT_compiled_vertex_array not found\n" ); - } - - bool bNVRegisterCombiners = false; - // Register Combiners. - if ( GL_CheckForExtension( "GL_NV_register_combiners" ) ) - { - // NOTE: This extension requires multitexture support (over 2 units). - if ( glConfig.maxActiveTextures >= 2 ) - { - bNVRegisterCombiners = true; - // Register Combiners function pointer address load. - AReis - // NOTE: VV guys will _definetly_ not be able to use regcoms. Pixel Shaders are just as good though :-) - // NOTE: Also, this is an nVidia specific extension (of course), so fragment shaders would serve the same purpose - // if we needed some kind of fragment/pixel manipulation support. - qglCombinerParameterfvNV = (PFNGLCOMBINERPARAMETERFVNVPROC)SDL_GL_GetProcAddress( "glCombinerParameterfvNV" ); - qglCombinerParameterivNV = (PFNGLCOMBINERPARAMETERIVNVPROC)SDL_GL_GetProcAddress( "glCombinerParameterivNV" ); - qglCombinerParameterfNV = (PFNGLCOMBINERPARAMETERFNVPROC)SDL_GL_GetProcAddress( "glCombinerParameterfNV" ); - qglCombinerParameteriNV = (PFNGLCOMBINERPARAMETERINVPROC)SDL_GL_GetProcAddress( "glCombinerParameteriNV" ); - qglCombinerInputNV = (PFNGLCOMBINERINPUTNVPROC)SDL_GL_GetProcAddress( "glCombinerInputNV" ); - qglCombinerOutputNV = (PFNGLCOMBINEROUTPUTNVPROC)SDL_GL_GetProcAddress( "glCombinerOutputNV" ); - qglFinalCombinerInputNV = (PFNGLFINALCOMBINERINPUTNVPROC)SDL_GL_GetProcAddress( "glFinalCombinerInputNV" ); - qglGetCombinerInputParameterfvNV = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)SDL_GL_GetProcAddress( "glGetCombinerInputParameterfvNV" ); - qglGetCombinerInputParameterivNV = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)SDL_GL_GetProcAddress( "glGetCombinerInputParameterivNV" ); - qglGetCombinerOutputParameterfvNV = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)SDL_GL_GetProcAddress( "glGetCombinerOutputParameterfvNV" ); - qglGetCombinerOutputParameterivNV = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)SDL_GL_GetProcAddress( "glGetCombinerOutputParameterivNV" ); - qglGetFinalCombinerInputParameterfvNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)SDL_GL_GetProcAddress( "glGetFinalCombinerInputParameterfvNV" ); - qglGetFinalCombinerInputParameterivNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)SDL_GL_GetProcAddress( "glGetFinalCombinerInputParameterivNV" ); - - // Validate the functions we need. - if ( !qglCombinerParameterfvNV || !qglCombinerParameterivNV || !qglCombinerParameterfNV || !qglCombinerParameteriNV || !qglCombinerInputNV || - !qglCombinerOutputNV || !qglFinalCombinerInputNV || !qglGetCombinerInputParameterfvNV || !qglGetCombinerInputParameterivNV || - !qglGetCombinerOutputParameterfvNV || !qglGetCombinerOutputParameterivNV || !qglGetFinalCombinerInputParameterfvNV || !qglGetFinalCombinerInputParameterivNV ) - { - bNVRegisterCombiners = false; - qglCombinerParameterfvNV = NULL; - qglCombinerParameteriNV = NULL; - Com_Printf ("...GL_NV_register_combiners failed\n" ); - } - } - else - { - bNVRegisterCombiners = false; - Com_Printf ("...ignoring GL_NV_register_combiners\n" ); - } - } - else - { - bNVRegisterCombiners = false; - Com_Printf ("...GL_NV_register_combiners not found\n" ); - } - - // NOTE: Vertex and Fragment Programs are very dependant on each other - this is actually a - // good thing! So, just check to see which we support (one or the other) and load the shared - // function pointers. ARB rocks! - - // Vertex Programs. - bool bARBVertexProgram = false; - if ( GL_CheckForExtension( "GL_ARB_vertex_program" ) ) - { - bARBVertexProgram = true; - } - else - { - bARBVertexProgram = false; - Com_Printf ("...GL_ARB_vertex_program not found\n" ); - } - - // Fragment Programs. - bool bARBFragmentProgram = false; - if ( GL_CheckForExtension( "GL_ARB_fragment_program" ) ) - { - bARBFragmentProgram = true; - } - else - { - bARBFragmentProgram = false; - Com_Printf ("...GL_ARB_fragment_program not found\n" ); - } - - // If we support one or the other, load the shared function pointers. - if ( bARBVertexProgram || bARBFragmentProgram ) - { - qglProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) SDL_GL_GetProcAddress("glProgramStringARB"); - qglBindProgramARB = (PFNGLBINDPROGRAMARBPROC) SDL_GL_GetProcAddress("glBindProgramARB"); - qglDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) SDL_GL_GetProcAddress("glDeleteProgramsARB"); - qglGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) SDL_GL_GetProcAddress("glGenProgramsARB"); - qglProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC) SDL_GL_GetProcAddress("glProgramEnvParameter4dARB"); - qglProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC) SDL_GL_GetProcAddress("glProgramEnvParameter4dvARB"); - qglProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC) SDL_GL_GetProcAddress("glProgramEnvParameter4fARB"); - qglProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC) SDL_GL_GetProcAddress("glProgramEnvParameter4fvARB"); - qglProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) SDL_GL_GetProcAddress("glProgramLocalParameter4dARB"); - qglProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) SDL_GL_GetProcAddress("glProgramLocalParameter4dvARB"); - qglProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC) SDL_GL_GetProcAddress("glProgramLocalParameter4fARB"); - qglProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) SDL_GL_GetProcAddress("glProgramLocalParameter4fvARB"); - qglGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC) SDL_GL_GetProcAddress("glGetProgramEnvParameterdvARB"); - qglGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC) SDL_GL_GetProcAddress("glGetProgramEnvParameterfvARB"); - qglGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) SDL_GL_GetProcAddress("glGetProgramLocalParameterdvARB"); - qglGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) SDL_GL_GetProcAddress("glGetProgramLocalParameterfvARB"); - qglGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) SDL_GL_GetProcAddress("glGetProgramivARB"); - qglGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC) SDL_GL_GetProcAddress("glGetProgramStringARB"); - qglIsProgramARB = (PFNGLISPROGRAMARBPROC) SDL_GL_GetProcAddress("glIsProgramARB"); - - // Validate the functions we need. - if ( !qglProgramStringARB || !qglBindProgramARB || !qglDeleteProgramsARB || !qglGenProgramsARB || - !qglProgramEnvParameter4dARB || !qglProgramEnvParameter4dvARB || !qglProgramEnvParameter4fARB || - !qglProgramEnvParameter4fvARB || !qglProgramLocalParameter4dARB || !qglProgramLocalParameter4dvARB || - !qglProgramLocalParameter4fARB || !qglProgramLocalParameter4fvARB || !qglGetProgramEnvParameterdvARB || - !qglGetProgramEnvParameterfvARB || !qglGetProgramLocalParameterdvARB || !qglGetProgramLocalParameterfvARB || - !qglGetProgramivARB || !qglGetProgramStringARB || !qglIsProgramARB ) - { - bARBVertexProgram = false; - bARBFragmentProgram = false; - qglGenProgramsARB = NULL; //clear ptrs that get checked - qglProgramEnvParameter4fARB = NULL; - Com_Printf ("...ignoring GL_ARB_vertex_program\n" ); - Com_Printf ("...ignoring GL_ARB_fragment_program\n" ); - } - } - - // Figure out which texture rectangle extension to use. - bool bTexRectSupported = false; - if ( Q_stricmpn( glConfig.vendor_string, "ATI Technologies",16 )==0 - && Q_stricmpn( glConfig.version_string, "1.3.3",5 )==0 - && glConfig.version_string[5] < '9' ) //1.3.34 and 1.3.37 and 1.3.38 are broken for sure, 1.3.39 is not - { - g_bTextureRectangleHack = true; - } - - if ( GL_CheckForExtension( "GL_NV_texture_rectangle" ) || GL_CheckForExtension( "GL_EXT_texture_rectangle" ) ) - { - bTexRectSupported = true; - } - - // Find out how many general combiners they have. - #define GL_MAX_GENERAL_COMBINERS_NV 0x854D - GLint iNumGeneralCombiners = 0; - if(bNVRegisterCombiners) - qglGetIntegerv( GL_MAX_GENERAL_COMBINERS_NV, &iNumGeneralCombiners ); - - // Only allow dynamic glows/flares if they have the hardware - if ( bTexRectSupported && bARBVertexProgram && qglActiveTextureARB && glConfig.maxActiveTextures >= 4 && - ( ( bNVRegisterCombiners && iNumGeneralCombiners >= 2 ) || bARBFragmentProgram ) ) - { - g_bDynamicGlowSupported = true; - // this would overwrite any achived setting gwg - // Cvar_Set( "r_DynamicGlow", "1" ); - } - else - { - g_bDynamicGlowSupported = false; - ri->Cvar_Set( "r_DynamicGlow","0" ); - } -} - -// Truncates the GL extensions string by only allowing up to 'maxExtensions' extensions in the string. -static const char *TruncateGLExtensionsString (const char *extensionsString, int maxExtensions) -{ - const char *p = extensionsString; - const char *q; - int numExtensions = 0; - size_t extensionsLen = strlen (extensionsString); - - char *truncatedExtensions; - - while ( (q = strchr (p, ' ')) != NULL && numExtensions <= maxExtensions ) - { - p = q + 1; - numExtensions++; - } - - if ( q != NULL ) - { - // We still have more extensions. We'll call this the end - - extensionsLen = p - extensionsString - 1; - } - - truncatedExtensions = (char *)ri->Hunk_Alloc (extensionsLen + 1, h_low); - Q_strncpyz (truncatedExtensions, extensionsString, extensionsLen + 1); - - return truncatedExtensions; -} - -void GLimp_Init( void ) -{ - ri->Cvar_Get( "r_restartOnResize", "1", CVAR_ARCHIVE ); - ri->Cvar_Get( "r_resizeDelay", "1000", CVAR_ARCHIVE ); - r_allowSoftwareGL = ri->Cvar_Get( "r_allowSoftwareGL", "0", CVAR_LATCH ); - r_sdlDriver = ri->Cvar_Get( "r_sdlDriver", "", CVAR_ROM ); - r_allowResize = ri->Cvar_Get( "r_allowResize", "0", CVAR_ARCHIVE ); - - /* if( Cvar_VariableIntegerValue( "com_abnormalExit" ) ) - { - Cvar_Set( "r_mode", va( "%d", R_MODE_FALLBACK ) ); - Cvar_Set( "r_picmap", "1" ); - Cvar_Set( "r_texturebits", "0" ); - Cvar_Set( "r_textureMode", "GL_LINEAR_MIPMAP_NEAREST" ); - Cvar_Set( "r_fullscreen", "0" ); - Cvar_Set( "r_centerWindow", "0" ); - Cvar_Set( "com_abnormalExit", "0" ); - }*/ - - // Create the window and set up the context - if(GLimp_StartDriverAndSetMode(r_mode->integer, (qboolean)r_fullscreen->integer, (qboolean)r_noborder->integer)) - goto success; - - // Try again, this time in a platform specific "safe mode" - /* Sys_GLimpSafeInit( ); - - if(GLimp_StartDriverAndSetMode(r_mode->integer, r_fullscreen->integer, qfalse)) - goto success; */ - - /* // Finally, try the default screen resolution - if( r_mode->integer != R_MODE_FALLBACK ) - { - Com_Printf( "Setting r_mode %d failed, falling back on r_mode %d\n", - r_mode->integer, R_MODE_FALLBACK ); - - if(GLimp_StartDriverAndSetMode(R_MODE_FALLBACK, qfalse, qfalse)) - goto success; - }*/ - - // Nothing worked, give up - Com_Error( ERR_FATAL, "GLimp_Init() - could not load OpenGL subsystem" ); - -success: - // This values force the UI to disable driver selection - // glConfig.driverType = GLDRV_ICD; - // glConfig.hardwareType = GLHW_GENERIC; - glConfig.deviceSupportsGamma = (qboolean)(!r_ignorehwgamma->integer && - SDL_SetWindowBrightness( screen, 1.0f ) >= 0); - - // get our config strings - glConfig.vendor_string = (const char *) qglGetString (GL_VENDOR); - glConfig.renderer_string = (const char *) qglGetString (GL_RENDERER); - glConfig.version_string = (const char *) qglGetString (GL_VERSION); - glConfig.extensions_string = (const char *) qglGetString (GL_EXTENSIONS); - - glConfigExt.originalExtensionString = glConfig.extensions_string; - glConfig.extensions_string = TruncateGLExtensionsString (glConfigExt.originalExtensionString, 128); - - // OpenGL driver constants - qglGetIntegerv( GL_MAX_TEXTURE_SIZE, &glConfig.maxTextureSize ); - // stubbed or broken drivers may have reported 0... - if ( glConfig.maxTextureSize <= 0 ) - { - glConfig.maxTextureSize = 0; - } - - // initialize extensions - GLimp_InitExtensions( ); - - ri->Cvar_Get( "r_availableModes", "", CVAR_ROM ); - - // This depends on SDL_INIT_VIDEO, hence having it here - ri->IN_Init( screen ); -} - -/* -=============== -GLimp_Shutdown -=============== -*/ -void GLimp_Shutdown( void ) -{ - ri->IN_Shutdown(); - - SDL_QuitSubSystem( SDL_INIT_VIDEO ); - - Com_Memset( &glConfig, 0, sizeof( glConfig ) ); - Com_Memset( &glState, 0, sizeof( glState ) ); -} - -void GLimp_EnableLogging( qboolean enable ) -{ -} - -void GLimp_LogComment( char *comment ) -{ -} - -void GLimp_SetGamma( unsigned char red[256], unsigned char green[256], unsigned char blue[256] ) -{ - Uint16 table[3][256]; - int i, j; - - if( !glConfig.deviceSupportsGamma || r_ignorehwgamma->integer > 0 ) - return; - - for (i = 0; i < 256; i++) - { - table[0][i] = ( ( ( Uint16 ) red[i] ) << 8 ) | red[i]; - table[1][i] = ( ( ( Uint16 ) green[i] ) << 8 ) | green[i]; - table[2][i] = ( ( ( Uint16 ) blue[i] ) << 8 ) | blue[i]; - } - -#ifdef _WIN32 -#include - - // Win2K and newer put this odd restriction on gamma ramps... - { - OSVERSIONINFO vinfo; - - vinfo.dwOSVersionInfoSize = sizeof( vinfo ); - GetVersionEx( &vinfo ); - if( vinfo.dwMajorVersion >= 5 && vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) - { - ri->Printf( PRINT_DEVELOPER, "performing gamma clamp.\n" ); - for( j = 0 ; j < 3 ; j++ ) - { - for( i = 0 ; i < 128 ; i++ ) - { - if( table[ j ] [ i] > ( ( 128 + i ) << 8 ) ) - table[ j ][ i ] = ( 128 + i ) << 8; - } - - if( table[ j ] [127 ] > 254 << 8 ) - table[ j ][ 127 ] = 254 << 8; - } - } - } -#endif - - // enforce constantly increasing - for (j = 0; j < 3; j++) - { - for (i = 1; i < 256; i++) - { - if (table[j][i] < table[j][i-1]) - table[j][i] = table[j][i-1]; - } - } - - SDL_SetWindowGammaRamp(screen, table[0], table[1], table[2]); -} diff --git a/codemp/server/NPCNav/navigator.cpp b/codemp/server/NPCNav/navigator.cpp index 68e131a095..0473b0d29f 100644 --- a/codemp/server/NPCNav/navigator.cpp +++ b/codemp/server/NPCNav/navigator.cpp @@ -1,19 +1,28 @@ -#include "qcommon/q_shared.h" +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors -#ifdef _MSC_VER -#pragma warning( disable : 4018) -#pragma warning( disable : 4245) -#pragma warning( disable : 4284) -#pragma warning( disable : 4512) -#pragma warning( disable : 4786) +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#include "qcommon/q_shared.h" -#pragma warning ( disable : 4663 ) //spcialize class -#pragma warning( push, 3 ) -#endif #include -#ifdef _MSC_VER -#pragma warning (pop) -#endif #include "navigator.h" #include "game/g_nav.h" @@ -645,7 +654,7 @@ bool CNavigator::Load( const char *filename, int checksum ) FS_Read( &failedEdges, sizeof( failedEdges ), file ); for ( int j = 0; j < MAX_FAILED_EDGES; j++ ) { - m_edgeLookupMap.insert(pair(failedEdges[j].startID, j)); + m_edgeLookupMap.insert(std::pair(failedEdges[j].startID, j)); } @@ -955,7 +964,7 @@ ShowEdges ------------------------- */ -typedef map < int, bool > drawMap_m; +typedef std::map < int, bool > drawMap_m; void CNavigator::ShowEdges( void ) { @@ -1681,7 +1690,7 @@ void CNavigator::ShowPath( int start, int end ) } } -static map CheckedNodes; +static std::map CheckedNodes; void CNavigator::ClearCheckedNodes( void ) { CheckedNodes.clear(); @@ -1695,7 +1704,7 @@ byte CNavigator::CheckedNode(int wayPoint,int ent) return CHECKED_NO; } assert(ent>=0&&ent::iterator f=CheckedNodes.find(wayPoint*MAX_GENTITIES+ent); + std::map::iterator f=CheckedNodes.find(wayPoint*MAX_GENTITIES+ent); if (f!=CheckedNodes.end()) { return (*f).second; @@ -1874,7 +1883,7 @@ int CNavigator::EdgeFailed( int startID, int endID ) { //OPTIMIZED WAY (bjg 01/02) //find in lookup map - pair findValue; + std::pair findValue; findValue = m_edgeLookupMap.equal_range(startID); while ( findValue.first != findValue.second ) { @@ -1983,7 +1992,7 @@ void CNavigator::AddFailedEdge( int entID, int startID, int endID ) //Check one second from now to see if it's clear failedEdges[j].checkTime = svs.time + CHECK_FAILED_EDGE_INTERVAL + Q_irand( 0, 1000 ); - m_edgeLookupMap.insert(pair(startID, j)); + m_edgeLookupMap.insert(std::pair(startID, j)); /* //DISABLED this for now, makes people stand around too long when @@ -2712,7 +2721,7 @@ CPriorityQueue::~CPriorityQueue() ////////////////////////////////////////////////////////////////// CEdge* CPriorityQueue::Find(int npNum) { - for(vector::iterator HeapIter=mHeap.begin(); HeapIter!=mHeap.end(); ++HeapIter) + for(std::vector::iterator HeapIter=mHeap.begin(); HeapIter!=mHeap.end(); ++HeapIter) { if ((*HeapIter)->m_first == npNum) { @@ -2759,7 +2768,7 @@ void CPriorityQueue::Push(CEdge* theEdge ) ////////////////////////////////////////////////////////////////// void CPriorityQueue::Update( CEdge* edge ) { - for(vector::iterator i=mHeap.begin(); i!=mHeap.end(); ++i) + for(std::vector::iterator i=mHeap.begin(); i!=mHeap.end(); ++i) { if( (*i)->m_first == edge->m_first ) { //Found node - resort from this position in the mHeap diff --git a/codemp/server/NPCNav/navigator.h b/codemp/server/NPCNav/navigator.h index 421da50118..d026322e12 100644 --- a/codemp/server/NPCNav/navigator.h +++ b/codemp/server/NPCNav/navigator.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #define __NEWCOLLECT 1 @@ -14,19 +36,9 @@ #define EFLAG_BLOCKED 0x00000001 #define EFLAG_FAILED 0x00000002 -#ifdef _MSC_VER -#pragma warning( disable : 4786) -#endif - -#if defined(_WIN32) - #define COM_NO_WINDOWS_H - #include -#endif - #include #include #include -using namespace std; #include "server/server.h" #include "qcommon/q_shared.h" @@ -36,8 +48,8 @@ using namespace std; #define NAV_HEADER_ID INT_ID('J','N','V','5') #define NODE_HEADER_ID INT_ID('N','O','D','E') -typedef multimap EdgeMultimap; -typedef multimap::iterator EdgeMultimapIt; +typedef std::multimap EdgeMultimap; +typedef EdgeMultimap::iterator EdgeMultimapIt; /* @@ -75,7 +87,7 @@ class CNode byte flags; } edge_t; - typedef vector< edge_t > edge_v; + typedef std::vector< edge_t > edge_v; public: @@ -132,8 +144,8 @@ CNavigator #define MAX_FAILED_EDGES 32 class CNavigator { - typedef vector < CNode * > node_v; - typedef list < CEdge > edge_l; + typedef std::vector < CNode * > node_v; + typedef std::list < CEdge > edge_l; #if __NEWCOLLECT @@ -143,7 +155,7 @@ class CNavigator unsigned int distance; }; - typedef list < nodeList_t > nodeChain_l; + typedef std::list < nodeList_t > nodeChain_l; #endif //__NEWCOLLECT @@ -270,7 +282,7 @@ class CPriorityQueue // DATA //-------------------------------------------------------------- private: - vector mHeap; + std::vector mHeap; }; extern CNavigator navigator; diff --git a/codemp/server/server.h b/codemp/server/server.h index 32c4ab2466..b2a671e0b5 100644 --- a/codemp/server/server.h +++ b/codemp/server/server.h @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "qcommon/q_shared.h" @@ -198,6 +221,7 @@ typedef struct serverStatic_s { qboolean initialized; // sv_init has completed int time; // will be strictly increasing across level changes + time_t startTime; // time since epoch the executable was started int snapFlagServerBit; // ^= SNAPFLAG_SERVERCOUNT every SV_SpawnServer() diff --git a/codemp/server/sv_bot.cpp b/codemp/server/sv_bot.cpp index b1f612f685..3dfa473a63 100644 --- a/codemp/server/sv_bot.cpp +++ b/codemp/server/sv_bot.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // sv_bot.c #include "server.h" #include "botlib/botlib.h" @@ -714,7 +737,7 @@ void SV_BotInitBotLib(void) { botlib_import.DebugPolygonDelete = BotImport_DebugPolygonDelete; botlib_export = (botlib_export_t *)GetBotLibAPI( BOTLIB_API_VERSION, &botlib_import ); - assert(botlib_export); // bk001129 - somehow we end up with a zero import. + assert(botlib_export); } diff --git a/codemp/server/sv_ccmds.cpp b/codemp/server/sv_ccmds.cpp index a0073e8eb5..bf6b50137f 100644 --- a/codemp/server/sv_ccmds.cpp +++ b/codemp/server/sv_ccmds.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "server.h" #include "qcommon/stringed_ingame.h" #include "server/sv_gameapi.h" @@ -324,7 +348,7 @@ static void SV_MapRestart_f( void ) { // this generally shouldn't happen, because the client // was connected before the level change SV_DropClient( client, denied ); - Com_Printf( "SV_MapRestart_f(%d): dropped client %i - denied!\n", delay, i ); // bk010125 + Com_Printf( "SV_MapRestart_f(%d): dropped client %i - denied!\n", delay, i ); continue; } @@ -673,11 +697,10 @@ Remove a ban or an exception from the list. ================== */ -static qboolean SV_DelBanEntryFromList( int index ) -{ +static qboolean SV_DelBanEntryFromList( int index ) { if ( index == serverBansCount - 1 ) serverBansCount--; - else if ( index < ARRAY_LEN( serverBans ) - 1 ) + else if ( index < (int)ARRAY_LEN( serverBans ) - 1 ) { memmove( serverBans + index, serverBans + index + 1, (serverBansCount - index - 1) * sizeof( *serverBans ) ); serverBansCount--; @@ -760,7 +783,7 @@ static void SV_AddBanToList( qboolean isexception ) return; } - if ( serverBansCount >= ARRAY_LEN( serverBans ) ) + if ( serverBansCount >= (int)ARRAY_LEN( serverBans ) ) { Com_Printf( "Error: Maximum number of bans/exceptions exceeded.\n" ); return; @@ -1052,6 +1075,35 @@ static void SV_ExceptDel_f( void ) SV_DelBanFromList( qtrue ); } +static const char *SV_CalcUptime( void ) { + static char buf[MAX_STRING_CHARS / 4] = { '\0' }; + char tmp[64] = { '\0' }; + time_t currTime; + + time( &currTime ); + + int secs = difftime( currTime, svs.startTime ); + int mins = secs / 60; + int hours = mins / 60; + int days = hours / 24; + + secs %= 60; + mins %= 60; + hours %= 24; + //days %= 365; + + buf[0] = '\0'; + if ( days > 0 ) { + Com_sprintf( tmp, sizeof(tmp), "%i days ", days ); + Q_strcat( buf, sizeof(buf), tmp ); + } + + Com_sprintf( tmp, sizeof(tmp), "%ih%im%is", hours, mins, secs ); + Q_strcat( buf, sizeof(buf), tmp ); + + return buf; +} + /* ================ SV_Status_f @@ -1111,39 +1163,33 @@ static void SV_Status_f( void ) "public dedicated", }; - char hostname[MAX_HOSTNAMELENGTH]={0}; + char hostname[MAX_HOSTNAMELENGTH] = { 0 }; - Q_strncpyz(hostname, sv_hostname->string, sizeof(hostname)); - Q_StripColor(hostname); + Q_strncpyz( hostname, sv_hostname->string, sizeof(hostname) ); + Q_StripColor( hostname ); - Com_Printf ("hostname: %s^7\n", hostname ); - Com_Printf ("version : %s %i\n", VERSION_STRING_DOTTED, PROTOCOL_VERSION ); - Com_Printf ("game : %s\n", FS_GetCurrentGameDir() ); - Com_Printf ("udp/ip : %s:%i os(%s) type(%s)\n", Cvar_VariableString("net_ip"), Cvar_VariableIntegerValue("net_port"), STATUS_OS, ded_table[com_dedicated->integer]); - Com_Printf ("map : %s gametype(%i)\n", sv_mapname->string, sv_gametype->integer ); - Com_Printf ("players : %i humans, %i bots (%i max)\n", humans, bots, sv_maxclients->integer - sv_privateClients->integer); + Com_Printf( "hostname: %s^7\n", hostname ); + Com_Printf( "version : %s %i\n", VERSION_STRING_DOTTED, PROTOCOL_VERSION ); + Com_Printf( "game : %s\n", FS_GetCurrentGameDir() ); + Com_Printf( "udp/ip : %s:%i os(%s) type(%s)\n", Cvar_VariableString( "net_ip" ), Cvar_VariableIntegerValue( "net_port" ), STATUS_OS, ded_table[com_dedicated->integer] ); + Com_Printf( "map : %s gametype(%i)\n", sv_mapname->string, sv_gametype->integer ); + Com_Printf( "players : %i humans, %i bots (%i max)\n", humans, bots, sv_maxclients->integer - sv_privateClients->integer ); + Com_Printf( "uptime : %s\n", SV_CalcUptime() ); - Com_Printf ("num score ping name lastmsg address qport rate\n"); - Com_Printf ("--- ----- ---- --------------- ------- --------------------- ----- -----\n"); + Com_Printf ("cl score ping name address rate \n"); + Com_Printf ("-- ----- ---- --------------- --------------------------------------- -----\n"); for (i=0,cl=svs.clients ; i < sv_maxclients->integer ; i++,cl++) { - if (!cl->state) - { + if ( !cl->state ) continue; - } - if (cl->state == CS_CONNECTED) - { - strcpy(state, "CNCT "); - } - else if (cl->state == CS_ZOMBIE) - { - strcpy(state, "ZMBI "); - } - else - { + if ( cl->state == CS_CONNECTED ) + Q_strncpyz( state, "CON ", sizeof( state ) ); + else if ( cl->state == CS_ZOMBIE ) + Q_strncpyz( state, "ZMB ", sizeof( state ) ); + else { ping = cl->ping < 9999 ? cl->ping : 9999; - Com_sprintf(state, sizeof(state), "%4i", ping); + Com_sprintf( state, sizeof(state), "%4i", ping ); } ps = SV_GameClientNum( i ); @@ -1151,27 +1197,23 @@ static void SV_Status_f( void ) if (!avoidTruncation) { - Com_Printf ("%3i %5i %s %-15.15s %7i %21s %5i %5i\n", + Com_Printf ("%2i %5i %s %-15.15s ^7%39s %5i\n", i, ps->persistant[PERS_SCORE], state, cl->name, - svs.time - cl->lastPacketTime, s, - cl->netchan.qport, cl->rate ); } else { - Com_Printf ("%3i %5i %s %s %7i %21s %5i %5i\n", + Com_Printf ("%2i %5i %s %s ^7%39s %5i\n", i, ps->persistant[PERS_SCORE], state, cl->name, - svs.time - cl->lastPacketTime, s, - cl->netchan.qport, cl->rate ); } @@ -1207,8 +1249,8 @@ static void SV_ConSay_f(void) { Cmd_ArgsBuffer( text, sizeof(text) ); - Com_Printf ("broadcast: chat \""SVSAY_PREFIX"%s\\n\"\n", SV_ExpandNewlines((char *)text) ); - SV_SendServerCommand(NULL, "chat \""SVSAY_PREFIX"%s\"\n", text); + Com_Printf ("broadcast: chat \"" SVSAY_PREFIX "%s\\n\"\n", SV_ExpandNewlines((char *)text) ); + SV_SendServerCommand(NULL, "chat \"" SVSAY_PREFIX "%s\"\n", text); } #define SVTELL_PREFIX "\x19[Server^7\x19]\x19: " @@ -1245,8 +1287,8 @@ static void SV_ConTell_f(void) { Cmd_ArgsFromBuffer( 2, text, sizeof(text) ); - Com_Printf ("tell: svtell to %s"S_COLOR_WHITE": %s\n", cl->name, SV_ExpandNewlines((char *)text) ); - SV_SendServerCommand(cl, "chat \""SVTELL_PREFIX S_COLOR_MAGENTA"%s"S_COLOR_WHITE"\"\n", text); + Com_Printf ("tell: svtell to %s" S_COLOR_WHITE ": %s\n", cl->name, SV_ExpandNewlines((char *)text) ); + SV_SendServerCommand(cl, "chat \"" SVTELL_PREFIX S_COLOR_MAGENTA "%s" S_COLOR_WHITE "\"\n", text); } const char *forceToggleNamePrints[NUM_FORCE_POWERS] = { @@ -1594,6 +1636,7 @@ static time_t SV_ExtractTimeFromDemoFolder( char *folder ) { return 0; } timeinfo.tm_year -= 1900; + timeinfo.tm_mon--; return mktime( &timeinfo ); } diff --git a/codemp/server/sv_client.cpp b/codemp/server/sv_client.cpp index c883d36c5d..c453fef68f 100644 --- a/codemp/server/sv_client.cpp +++ b/codemp/server/sv_client.cpp @@ -1,8 +1,38 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // sv_client.c -- server code for dealing with clients #include "server.h" #include "qcommon/stringed_ingame.h" + +#ifdef USE_INTERNAL_ZLIB #include "zlib/zlib.h" +#else +#include +#endif + #include "server/sv_gameapi.h" static void SV_CloseDownload( client_t *cl ); @@ -123,6 +153,10 @@ static qboolean SV_IsBanned( netadr_t *from, qboolean isexception ) int index; serverBan_t *curban; + if ( !serverBansCount ) { + return qfalse; + } + if ( !isexception ) { // If this is a query for a ban, first check whether the client is excepted @@ -463,7 +497,7 @@ void SV_DropClient( client_t *drop, const char *reason ) { GVM_ClientDisconnect( drop - svs.clients ); // add the disconnect command - SV_SendServerCommand( drop, va("disconnect \"%s\"", reason ) ); + SV_SendServerCommand( drop, "disconnect \"%s\"", reason ); if ( isBot ) { SV_BotFreeClient( drop - svs.clients ); @@ -699,7 +733,7 @@ SV_StopDownload_f Abort a download if in progress ================== */ -void SV_StopDownload_f( client_t *cl ) { +static void SV_StopDownload_f( client_t *cl ) { if ( cl->state == CS_ACTIVE ) return; @@ -716,7 +750,7 @@ SV_DoneDownload_f Downloads are finished ================== */ -void SV_DoneDownload_f( client_t *cl ) { +static void SV_DoneDownload_f( client_t *cl ) { if ( cl->state == CS_ACTIVE ) return; @@ -733,7 +767,7 @@ The argument will be the last acknowledged block from the client, it should be the same as cl->downloadClientBlock ================== */ -void SV_NextDownload_f( client_t *cl ) +static void SV_NextDownload_f( client_t *cl ) { int block = atoi( Cmd_Argv(1) ); @@ -765,7 +799,7 @@ void SV_NextDownload_f( client_t *cl ) SV_BeginDownload_f ================== */ -void SV_BeginDownload_f( client_t *cl ) { +static void SV_BeginDownload_f( client_t *cl ) { if ( cl->state == CS_ACTIVE ) return; @@ -831,7 +865,7 @@ void SV_WriteDownloadToClient(client_t *cl, msg_t *msg) // check whether it's legal to download it. missionPack = FS_idPak(pakbuf, "missionpack"); idPack = missionPack; - idPack = (qboolean)(idPack || FS_idPak(pakbuf, "base")); + idPack = (qboolean)(idPack || FS_idPak(pakbuf, BASEGAME)); break; } @@ -997,7 +1031,7 @@ void SV_WriteDownloadToClient(client_t *cl, msg_t *msg) MSG_WriteData( msg, cl->downloadBlocks[curindex], cl->downloadBlockSize[curindex] ); } - Com_DPrintf( "clientDownload: %d : writing block %d\n", cl - svs.clients, cl->downloadXmitBlock ); + Com_DPrintf( "clientDownload: %d : writing block %d\n", (int) (cl - svs.clients), cl->downloadXmitBlock ); // Move on to the next block // It will get sent with next snap shot. The rate will keep us in line. @@ -1218,7 +1252,7 @@ void SV_UserinfoChanged( client_t *cl ) { // snaps command //Note: cl->snapshotMsec is also validated in sv_main.cpp -> SV_CheckCvars if sv_fps, sv_snapsMin or sv_snapsMax is changed int minSnaps = Com_Clampi( 1, sv_snapsMax->integer, sv_snapsMin->integer ); // between 1 and sv_snapsMax ( 1 <-> 40 ) - int maxSnaps = min( sv_fps->integer, sv_snapsMax->integer ); // can't produce more than sv_fps snapshots/sec, but can send less than sv_fps snapshots/sec + int maxSnaps = Q_min( sv_fps->integer, sv_snapsMax->integer ); // can't produce more than sv_fps snapshots/sec, but can send less than sv_fps snapshots/sec val = Info_ValueForKey( cl->userinfo, "snaps" ); cl->wishSnaps = atoi( val ); if ( !cl->wishSnaps ) @@ -1495,8 +1529,9 @@ static void SV_UserMove( client_t *cl, msg_t *msg, qboolean delta ) { SV_ClientEnterWorld( cl, &cmds[0] ); // the moves can be processed normaly } - // - if (sv_pure->integer != 0 && cl->pureAuthentic == 0) { + + // a bad cp command was sent, drop the client + if (sv_pure->integer != 0 && cl->pureAuthentic == 0) { SV_DropClient( cl, "Cannot validate pure client!"); return; } @@ -1600,7 +1635,7 @@ void SV_ExecuteClientMessage( client_t *cl, msg_t *msg ) { // this client has acknowledged the new gamestate so it's // safe to start sending it the real time again - if( cl->oldServerTime && serverId == sv.serverId ){ + if( cl->oldServerTime && serverId == sv.serverId ) { Com_DPrintf( "%s acknowledged gamestate\n", cl->name ); cl->oldServerTime = 0; } diff --git a/codemp/server/sv_game.cpp b/codemp/server/sv_game.cpp index 9c7b0ec284..807394ed2e 100644 --- a/codemp/server/sv_game.cpp +++ b/codemp/server/sv_game.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // sv_game.c -- interface to the game dll #include "server.h" #include "botlib/botlib.h" diff --git a/codemp/server/sv_gameapi.cpp b/codemp/server/sv_gameapi.cpp index 5d2d60d841..60190f5f5d 100644 --- a/codemp/server/sv_gameapi.cpp +++ b/codemp/server/sv_gameapi.cpp @@ -1,3 +1,23 @@ +/* +=========================================================================== +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // sv_gameapi.cpp -- interface to the game dll //Anything above this #include will be ignored by the compiler @@ -1509,8 +1529,12 @@ static qboolean SV_G2API_GetBoneAnim( void *ghoul2, const char *boneName, const } static void SV_G2API_GetGLAName( void *ghoul2, int modelIndex, char *fillBuf ) { + assert( ghoul2 && "invalid g2 handle" ); + char *tmp = re->G2API_GetGLAName( *((CGhoul2Info_v *)ghoul2), modelIndex ); - strcpy( fillBuf, tmp ); + if ( tmp ) { + strcpy( fillBuf, tmp ); + } } static int SV_G2API_CopyGhoul2Instance( void *g2From, void *g2To, int modelIndex ) { @@ -2858,7 +2882,7 @@ void SV_BindGame( void ) { static gameImport_t gi; gameExport_t *ret; GetGameAPI_t GetGameAPI; - char dllName[MAX_OSPATH] = "jampgame"ARCH_STRING DLL_EXT; + char dllName[MAX_OSPATH] = "jampgame" ARCH_STRING DLL_EXT; memset( &gi, 0, sizeof( gi ) ); diff --git a/codemp/server/sv_gameapi.h b/codemp/server/sv_gameapi.h index a84e6cfe91..ea651e5b14 100644 --- a/codemp/server/sv_gameapi.h +++ b/codemp/server/sv_gameapi.h @@ -1,3 +1,23 @@ +/* +=========================================================================== +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once void GVM_InitGame ( int levelTime, int randomSeed, int restart ); diff --git a/codemp/server/sv_init.cpp b/codemp/server/sv_init.cpp index dc47f250f0..fb1cbf17e5 100644 --- a/codemp/server/sv_init.cpp +++ b/codemp/server/sv_init.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "server.h" #include "ghoul2/G2.h" #include "qcommon/cm_public.h" @@ -757,7 +781,6 @@ CL_RefPrintf DLL glue ================ */ -#define MAXPRINTMSG 4096 void QDECL SV_RefPrintf( int print_level, const char *fmt, ...) { va_list argptr; char msg[MAXPRINTMSG]; @@ -897,6 +920,9 @@ static void SV_InitRef( void ) { #endif void SV_Init (void) { + + time( &svs.startTime ); + SV_AddOperatorCommands (); // serverinfo vars @@ -947,10 +973,10 @@ void SV_Init (void) { Cvar_Get ("nextmap", "", CVAR_TEMP ); sv_allowDownload = Cvar_Get ("sv_allowDownload", "0", CVAR_SERVERINFO); - sv_master[0] = Cvar_Get ("sv_master1", MASTER_SERVER_NAME, 0 ); - sv_master[1] = Cvar_Get("sv_master2", JKHUB_MASTER_SERVER_NAME, 0); + sv_master[0] = Cvar_Get ("sv_master1", MASTER_SERVER_NAME, CVAR_PROTECTED ); + sv_master[1] = Cvar_Get ("sv_master2", JKHUB_MASTER_SERVER_NAME, CVAR_PROTECTED); for(int index = 2; index < MAX_MASTER_SERVERS; index++) - sv_master[index] = Cvar_Get(va("sv_master%d", index + 1), "", CVAR_ARCHIVE); + sv_master[index] = Cvar_Get(va("sv_master%d", index + 1), "", CVAR_ARCHIVE|CVAR_PROTECTED); sv_reconnectlimit = Cvar_Get ("sv_reconnectlimit", "3", 0); sv_showghoultraces = Cvar_Get ("sv_showghoultraces", "0", 0); sv_showloss = Cvar_Get ("sv_showloss", "0", 0); diff --git a/codemp/server/sv_main.cpp b/codemp/server/sv_main.cpp index 1e77dd1eb2..6542b39e51 100644 --- a/codemp/server/sv_main.cpp +++ b/codemp/server/sv_main.cpp @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "server.h" #include "ghoul2/ghoul2_shared.h" @@ -61,7 +85,7 @@ Converts newlines to "\n" so a line prints nicer */ char *SV_ExpandNewlines( char *in ) { static char string[1024]; - unsigned int l; + size_t l; l = 0; while ( *in && l < sizeof(string) - 3 ) { @@ -89,6 +113,11 @@ not have future snapshot_t executed before it is executed void SV_AddServerCommand( client_t *client, const char *cmd ) { int index, i; + // do not send commands until the gamestate has been sent + if ( client->state < CS_PRIMED ) { + return; + } + client->reliableSequence++; // if we would be losing an old command that hasn't been acknowledged, // we must drop the connection @@ -147,9 +176,6 @@ void QDECL SV_SendServerCommand(client_t *cl, const char *fmt, ...) { // send the data to all relevent clients for (j = 0, client = svs.clients; j < sv_maxclients->integer ; j++, client++) { - if ( client->state < CS_PRIMED ) { - continue; - } SV_AddServerCommand( client, (char *)message ); } } @@ -399,7 +425,7 @@ qboolean SVC_RateLimit( leakyBucket_t *bucket, int burst, int period ) { int expired = interval / period; int expiredRemainder = interval % period; - if ( expired > bucket->burst ) { + if ( expired > bucket->burst || interval < 0 ) { bucket->burst = 0; bucket->lastTime = now; } else { @@ -474,7 +500,7 @@ void SVC_Status( netadr_t from ) { if(strlen(Cmd_Argv(1)) > 128) return; - strcpy( infostring, Cvar_InfoString( CVAR_SERVERINFO ) ); + Q_strncpyz( infostring, Cvar_InfoString( CVAR_SERVERINFO ), sizeof( infostring ) ); // echo back the parameter to status. so master servers can use it as a challenge // to prevent timed spoofed reply packets that add ghost servers @@ -796,7 +822,7 @@ void SV_PacketEvent( netadr_t from, msg_t *msg ) { return; } - // if we received a sequenced packet from an address we don't reckognize, + // if we received a sequenced packet from an address we don't recognize, // send an out of band disconnect packet to it NET_OutOfBandPrint( NS_SERVER, from, "disconnect" ); } @@ -976,7 +1002,7 @@ void SV_CheckCvars( void ) { client_t *cl = NULL; int i=0; int minSnaps = Com_Clampi( 1, sv_snapsMax->integer, sv_snapsMin->integer ); // between 1 and sv_snapsMax ( 1 <-> 40 ) - int maxSnaps = min( sv_fps->integer, sv_snapsMax->integer ); // can't produce more than sv_fps snapshots/sec, but can send less than sv_fps snapshots/sec + int maxSnaps = Q_min( sv_fps->integer, sv_snapsMax->integer ); // can't produce more than sv_fps snapshots/sec, but can send less than sv_fps snapshots/sec lastModFramerate = sv_fps->modificationCount; lastModSnapsMin = sv_snapsMin->modificationCount; diff --git a/codemp/server/sv_net_chan.cpp b/codemp/server/sv_net_chan.cpp index 3c3afb6b3d..24b2915e03 100644 --- a/codemp/server/sv_net_chan.cpp +++ b/codemp/server/sv_net_chan.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "server.h" // TTimo: unused, commenting out to make gcc happy diff --git a/codemp/server/sv_snapshot.cpp b/codemp/server/sv_snapshot.cpp index edf52eafd5..286d7f41b8 100644 --- a/codemp/server/sv_snapshot.cpp +++ b/codemp/server/sv_snapshot.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "server.h" #include "qcommon/cm_public.h" diff --git a/codemp/server/sv_world.cpp b/codemp/server/sv_world.cpp index f961bda82c..68a253a9d3 100644 --- a/codemp/server/sv_world.cpp +++ b/codemp/server/sv_world.cpp @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // world.c -- world query functions #include "server.h" @@ -511,9 +534,7 @@ static float VectorDistance(vec3_t p1, vec3_t p2) return VectorLength(dir); } #endif -#ifdef _MSC_VER -#pragma warning(disable : 4701) //local variable used without having been init -#endif + static void SV_ClipMoveToEntities( moveclip_t *clip ) { static int touchlist[MAX_GENTITIES]; int i, num; @@ -782,9 +803,6 @@ Ghoul2 Insert End */ } } -#ifdef _MSC_VER -#pragma warning(default : 4701) //local variable used without having been init -#endif /* ================== diff --git a/codemp/sys/snapvector.cpp b/codemp/sys/snapvector.cpp deleted file mode 100644 index 566d777b65..0000000000 --- a/codemp/sys/snapvector.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include -#if _MSC_VER -# include -# pragma fenv_access (on) -#else -# include -#endif - -#if _MSC_VER -static inline float roundfloat(float n) -{ - return (n < 0.0f) ? ceilf(n - 0.5f) : floorf(n + 0.5f); -} -#endif - -extern "C" -void Sys_SnapVector(float *v) -{ -#if _MSC_VER - unsigned int oldcontrol; - unsigned int newcontrol; - - _controlfp_s(&oldcontrol, 0, 0); - _controlfp_s(&newcontrol, _RC_NEAR, _MCW_RC); - - v[0] = roundfloat(v[0]); - v[1] = roundfloat(v[1]); - v[2] = roundfloat(v[2]); - - _controlfp_s(&newcontrol, oldcontrol, _MCW_RC); -#else - // pure C99 - int oldround = fegetround(); - fesetround(FE_TONEAREST); - - v[0] = nearbyintf(v[0]); - v[1] = nearbyintf(v[1]); - v[2] = nearbyintf(v[2]); - - fesetround(oldround); -#endif -} diff --git a/codemp/sys/sys_loadlib.h b/codemp/sys/sys_loadlib.h deleted file mode 100644 index 893f6a47b6..0000000000 --- a/codemp/sys/sys_loadlib.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#ifdef DEDICATED -# ifdef _WIN32 -# include -# define Sys_LoadLibrary(f) (void*)LoadLibrary(f) -# define Sys_UnloadLibrary(h) FreeLibrary((HMODULE)h) -# define Sys_LoadFunction(h,fn) (void*)GetProcAddress((HMODULE)h,fn) -# define Sys_LibraryError() "unknown" -# else -# include -# define Sys_LoadLibrary(f) dlopen(f,RTLD_NOW) -# define Sys_UnloadLibrary(h) dlclose(h) -# define Sys_LoadFunction(h,fn) dlsym(h,fn) -# define Sys_LibraryError() dlerror() -# endif -#else -# include -# include -# define Sys_LoadLibrary(f) SDL_LoadObject(f) -# define Sys_UnloadLibrary(h) SDL_UnloadObject(h) -# define Sys_LoadFunction(h,fn) SDL_LoadFunction(h,fn) -# define Sys_LibraryError() SDL_GetError() -#endif - -void * QDECL Sys_LoadDll(const char *name, qboolean useSystemLib); diff --git a/codemp/sys/sys_local.h b/codemp/sys/sys_local.h deleted file mode 100644 index 792875aff3..0000000000 --- a/codemp/sys/sys_local.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -void IN_Init( void *windowData ); -void IN_Frame (void); -void IN_Shutdown( void ); -void IN_Restart( void ); - -qboolean Sys_GetPacket ( netadr_t *net_from, msg_t *net_message ); -char *Sys_ConsoleInput (void); -void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptrLength, void *ptr ); -void Sys_ListFilteredFiles( const char *basedir, char *subdirs, char *filter, char **psList, int *numfiles ); - -void Sys_Exit( int ex ); diff --git a/codemp/sys/sys_main.cpp b/codemp/sys/sys_main.cpp deleted file mode 100644 index d0e03fec77..0000000000 --- a/codemp/sys/sys_main.cpp +++ /dev/null @@ -1,624 +0,0 @@ -#include -#ifdef DEDICATED -#include -#endif -#include "qcommon/q_shared.h" -#include "qcommon/qcommon.h" - -#include "sys_loadlib.h" -#ifdef DEDICATED -#include "unix_local.h" -#else -#include "sys_local.h" -#endif - -#if defined(MACOS_X) || defined(__linux__) || defined(__FreeBSD_kernel__) - #include -#endif - -static char binaryPath[ MAX_OSPATH ] = { 0 }; -static char installPath[ MAX_OSPATH ] = { 0 }; - -/* -================= -Sys_SetBinaryPath -================= -*/ -void Sys_SetBinaryPath(const char *path) -{ - Q_strncpyz(binaryPath, path, sizeof(binaryPath)); -} - -/* -================= -Sys_BinaryPath -================= -*/ -char *Sys_BinaryPath(void) -{ - return binaryPath; -} - -/* -================= -Sys_SetDefaultInstallPath -================= -*/ -void Sys_SetDefaultInstallPath(const char *path) -{ - Q_strncpyz(installPath, path, sizeof(installPath)); -} - -/* -================= -Sys_DefaultInstallPath -================= -*/ -char *Sys_DefaultInstallPath(void) -{ - if (*installPath) - return installPath; - else - return Sys_Cwd(); -} - -/* -================= -Sys_DefaultAppPath -================= -*/ -char *Sys_DefaultAppPath(void) -{ - return Sys_BinaryPath(); -} - -// We now expect newlines instead of always appending -// otherwise sectioned prints get messed up. -#define MAXPRINTMSG 4096 -void Conbuf_AppendText( const char *pMsg ) -{ - char msg[MAXPRINTMSG] = {0}; - Q_strncpyz(msg, pMsg, sizeof(msg)); - Q_StripColor(msg); - printf("%s", msg); -} - -void Sys_Print( const char *msg ) { - // TTimo - prefix for text that shows up in console but not in notify - // backported from RTCW - if ( !Q_strncmp( msg, "[skipnotify]", 12 ) ) { - msg += 12; - } - if ( msg[0] == '*' ) { - msg += 1; - } - Conbuf_AppendText( msg ); -} - -/* -================= -Sys_In_Restart_f -================= -*/ -void Sys_In_Restart_f( void ) -{ -#ifdef DEDICATED - IN_Shutdown(); - IN_Init(); -#else - IN_Restart( ); -#endif -} - -void Sys_Init (void) { - Cmd_AddCommand ("in_restart", Sys_In_Restart_f); - Cvar_Set( "arch", OS_STRING " " ARCH_STRING ); - Cvar_Set( "username", Sys_GetCurrentUser( ) ); -} - -void Sys_Exit( int ex ) __attribute__((noreturn)); -void Sys_Exit( int ex ) { -#ifndef DEDICATED - SDL_Quit( ); -#endif - -#ifdef NDEBUG // regular behavior - // We can't do this - // as long as GL DLL's keep installing with atexit... - exit(ex); - //_exit(ex); -#else - // Give me a backtrace on error exits. - assert( ex == 0 ); - exit(ex); -#endif -} - -void Sys_Error( const char *error, ... ) -{ - va_list argptr; - char string[1024]; - - va_start (argptr,error); - Q_vsnprintf (string, sizeof(string), error, argptr); - va_end (argptr); - - //Sys_ErrorDialog( string ); - Sys_Print( string ); - - Sys_Exit( 3 ); -} - -void Sys_Quit (void) { - IN_Shutdown(); - - Com_ShutdownZoneMemory(); - Com_ShutdownHunkMemory(); - -#ifdef DEDICATED - fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY); -#endif - Sys_Exit(0); -} - -/* -================= -Sys_UnloadDll -================= -*/ -void Sys_UnloadDll( void *dllHandle ) -{ - if( !dllHandle ) - { - Com_Printf("Sys_UnloadDll(NULL)\n"); - return; - } - - Sys_UnloadLibrary(dllHandle); -} - -/* -================= -Sys_LoadDll - -First try to load library name from system library path, -from executable path, then fs_basepath. -================= -*/ - -void *Sys_LoadDll(const char *name, qboolean useSystemLib) -{ - void *dllhandle = NULL; - - if(useSystemLib) - Com_Printf("Trying to load \"%s\"...\n", name); - - if(!useSystemLib || !(dllhandle = Sys_LoadLibrary(name))) - { - const char *topDir; - char libPath[MAX_OSPATH]; - - topDir = Sys_BinaryPath(); - - if(!*topDir) - topDir = "."; - - Com_Printf("Trying to load \"%s\" from \"%s\"...\n", name, topDir); - Com_sprintf(libPath, sizeof(libPath), "%s%c%s", topDir, PATH_SEP, name); - - if(!(dllhandle = Sys_LoadLibrary(libPath))) - { - const char *basePath = Cvar_VariableString("fs_basepath"); - - if(!basePath || !*basePath) - basePath = "."; - - if(FS_FilenameCompare(topDir, basePath)) - { - Com_Printf("Trying to load \"%s\" from \"%s\"...\n", name, basePath); - Com_sprintf(libPath, sizeof(libPath), "%s%c%s", basePath, PATH_SEP, name); - dllhandle = Sys_LoadLibrary(libPath); - } - - if(!dllhandle) - { - Com_Printf("Loading \"%s\" failed\n", name); - } - } - } - - return dllhandle; -} - -#ifdef MACOS_X -void *Sys_LoadMachOBundle( const char *name ) -{ - if ( !FS_LoadMachOBundle(name) ) - return NULL; - - char *homepath = Cvar_VariableString( "fs_homepath" ); - char *gamedir = Cvar_VariableString( "fs_game" ); - char dllName[MAX_QPATH]; - - Com_sprintf( dllName, sizeof(dllName), "%s_pk3" DLL_EXT, name ); - - //load the unzipped library - char *fn = FS_BuildOSPath( homepath, gamedir, dllName ); - - void *libHandle = Sys_LoadLibrary( fn ); - - if ( libHandle != NULL ) { - Com_Printf( "Loaded pk3 bundle %s.\n", name ); - } - - return libHandle; -} -#endif - -/* - ================= - Sys_LoadGameDll - - Used to load a development dll instead of a virtual machine - ================= - */ - -//TODO: load mac dlls that are inside zip things inside pk3s. - -void *Sys_LoadLegacyGameDll( const char *name, intptr_t (QDECL **vmMain)(int, ...), intptr_t (QDECL *systemcalls)(intptr_t, ...) ) -{ - void *libHandle = NULL; - void (QDECL *dllEntry)( intptr_t (QDECL *syscallptr)(intptr_t, ...) ); - char *basepath; - char *homepath; - char *cdpath; - char *gamedir; -#ifdef MACOS_X - char *apppath; -#endif - char *fn; - char filename[MAX_OSPATH]; - - Com_sprintf (filename, sizeof(filename), "%s" ARCH_STRING DLL_EXT, name); - -#if 0 - libHandle = Sys_LoadLibrary( filename ); -#endif - -#ifdef MACOS_X - //First, look for the old-style mac .bundle that's inside a pk3 - //It's actually zipped, and the zipfile has the same name as 'name' - libHandle = Sys_LoadMachOBundle( name ); -#endif - - if (!libHandle) { - //Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", filename, Sys_LibraryError() ); - - basepath = Cvar_VariableString( "fs_basepath" ); - homepath = Cvar_VariableString( "fs_homepath" ); - cdpath = Cvar_VariableString( "fs_cdpath" ); - gamedir = Cvar_VariableString( "fs_game" ); -#ifdef MACOS_X - apppath = Cvar_VariableString( "fs_apppath" ); -#endif - - fn = FS_BuildOSPath( basepath, gamedir, filename ); - libHandle = Sys_LoadLibrary( fn ); - - if ( !libHandle ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - if( homepath[0] ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - fn = FS_BuildOSPath( homepath, gamedir, filename ); - libHandle = Sys_LoadLibrary( fn ); - } - if ( !libHandle ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); -#ifdef MACOS_X - if( apppath[0] ) { - fn = FS_BuildOSPath( apppath, gamedir, filename ); - libHandle = Sys_LoadLibrary( fn ); - } - if ( !libHandle ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); -#endif - if( cdpath[0] ) { - fn = FS_BuildOSPath( cdpath, gamedir, filename ); - libHandle = Sys_LoadLibrary( fn ); - } - if ( !libHandle ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - // now we try base - fn = FS_BuildOSPath( basepath, BASEGAME, filename ); - libHandle = Sys_LoadLibrary( fn ); - if ( !libHandle ) { - if( homepath[0] ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - fn = FS_BuildOSPath( homepath, BASEGAME, filename ); - libHandle = Sys_LoadLibrary( fn ); - } - if ( !libHandle ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); -#ifdef MACOS_X - if( apppath[0] ) { - fn = FS_BuildOSPath( apppath, BASEGAME, filename); - libHandle = Sys_LoadLibrary( fn ); - } - if ( !libHandle ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); -#endif - if( cdpath[0] ) { - fn = FS_BuildOSPath( cdpath, BASEGAME, filename ); - libHandle = Sys_LoadLibrary( fn ); - } - if ( !libHandle ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - return NULL; - } -#ifdef MACOS_X - } -#endif - } - } - } -#ifdef MACOS_X - } -#endif - } - } - } - - dllEntry = ( void (QDECL *)( intptr_t (QDECL *)( intptr_t, ... ) ) )Sys_LoadFunction( libHandle, "dllEntry" ); - *vmMain = (intptr_t (QDECL *)(int,...))Sys_LoadFunction( libHandle, "vmMain" ); - if ( !*vmMain || !dllEntry ) { - Com_Printf ( "Sys_LoadGameDll(%s) failed to find vmMain function:\n\"%s\" !\n", name, Sys_LibraryError() ); - Sys_UnloadLibrary( libHandle ); - return NULL; - } - - Com_Printf ( "Sys_LoadGameDll(%s) found vmMain function at %p\n", name, *vmMain ); - dllEntry( systemcalls ); - - return libHandle; -} - -void *Sys_LoadGameDll( const char *name, void *(QDECL **moduleAPI)(int, ...) ) -{ - void *libHandle = NULL; - char *basepath; - char *homepath; - char *cdpath; - char *gamedir; -#ifdef MACOS_X - char *apppath; -#endif - char *fn; - char filename[MAX_OSPATH]; - - Com_sprintf (filename, sizeof(filename), "%s" ARCH_STRING DLL_EXT, name); - -#if 0 - libHandle = Sys_LoadLibrary( filename ); -#endif - -#ifdef MACOS_X - //First, look for the old-style mac .bundle that's inside a pk3 - //It's actually zipped, and the zipfile has the same name as 'name' - libHandle = Sys_LoadMachOBundle( name ); -#endif - - if (!libHandle) { - //Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", filename, Sys_LibraryError() ); - - basepath = Cvar_VariableString( "fs_basepath" ); - homepath = Cvar_VariableString( "fs_homepath" ); - cdpath = Cvar_VariableString( "fs_cdpath" ); - gamedir = Cvar_VariableString( "fs_game" ); -#ifdef MACOS_X - apppath = Cvar_VariableString( "fs_apppath" ); -#endif - - fn = FS_BuildOSPath( basepath, gamedir, filename ); - libHandle = Sys_LoadLibrary( fn ); - - if ( !libHandle ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - if( homepath[0] ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - fn = FS_BuildOSPath( homepath, gamedir, filename ); - libHandle = Sys_LoadLibrary( fn ); - } - if ( !libHandle ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); -#ifdef MACOS_X - if( apppath[0] ) { - fn = FS_BuildOSPath( apppath, gamedir, filename ); - libHandle = Sys_LoadLibrary( fn ); - } - if ( !libHandle ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); -#endif - if( cdpath[0] ) { - fn = FS_BuildOSPath( cdpath, gamedir, filename ); - libHandle = Sys_LoadLibrary( fn ); - } - if ( !libHandle ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - // now we try base - fn = FS_BuildOSPath( basepath, BASEGAME, filename ); - libHandle = Sys_LoadLibrary( fn ); - if ( !libHandle ) { - if( homepath[0] ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - fn = FS_BuildOSPath( homepath, BASEGAME, filename ); - libHandle = Sys_LoadLibrary( fn ); - } - if ( !libHandle ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); -#ifdef MACOS_X - if( apppath[0] ) { - fn = FS_BuildOSPath( apppath, BASEGAME, filename); - libHandle = Sys_LoadLibrary( fn ); - } - if ( !libHandle ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); -#endif - if( cdpath[0] ) { - fn = FS_BuildOSPath( cdpath, BASEGAME, filename ); - libHandle = Sys_LoadLibrary( fn ); - } - if ( !libHandle ) { - Com_Printf( "Sys_LoadGameDll(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); - return NULL; - } -#ifdef MACOS_X - } -#endif - } - } - } -#ifdef MACOS_X - } -#endif - } - } - } - - *moduleAPI = (void *(QDECL *)(int,...))Sys_LoadFunction( libHandle, "GetModuleAPI" ); - if ( !*moduleAPI ) { - Com_Printf ( "Sys_LoadGameDll(%s) failed to find GetModuleAPI function:\n\"%s\" !\n", name, Sys_LibraryError() ); - Sys_UnloadLibrary( libHandle ); - return NULL; - } - - return libHandle; -} - -void Sys_ConfigureFPU() { // bk001213 - divide by zero -#ifdef __linux2__ -#ifdef __i386 -#ifndef NDEBUG - // bk0101022 - enable FPE's in debug mode - static int fpu_word = _FPU_DEFAULT & ~(_FPU_MASK_ZM | _FPU_MASK_IM); - int current = 0; - _FPU_GETCW(current); - if ( current!=fpu_word) { -#if 0 - Com_Printf("FPU Control 0x%x (was 0x%x)\n", fpu_word, current ); - _FPU_SETCW( fpu_word ); - _FPU_GETCW( current ); - assert(fpu_word==current); -#endif - } -#else // NDEBUG - static int fpu_word = _FPU_DEFAULT; - _FPU_SETCW( fpu_word ); -#endif // NDEBUG -#endif // __i386 -#endif // __linux -} - -#ifdef MACOS_X -/* - ================= - Sys_StripAppBundle - - Discovers if passed dir is suffixed with the directory structure of a Mac OS X - .app bundle. If it is, the .app directory structure is stripped off the end and - the result is returned. If not, dir is returned untouched. - ================= - */ -char *Sys_StripAppBundle( char *dir ) -{ - static char cwd[MAX_OSPATH]; - - Q_strncpyz(cwd, dir, sizeof(cwd)); - if(strcmp(Sys_Basename(cwd), "MacOS")) - return dir; - Q_strncpyz(cwd, Sys_Dirname(cwd), sizeof(cwd)); - if(strcmp(Sys_Basename(cwd), "Contents")) - return dir; - Q_strncpyz(cwd, Sys_Dirname(cwd), sizeof(cwd)); - if(!strstr(Sys_Basename(cwd), ".app")) - return dir; - Q_strncpyz(cwd, Sys_Dirname(cwd), sizeof(cwd)); - return cwd; -} -#endif - -#ifndef DEFAULT_BASEDIR -# ifdef MACOS_X -# define DEFAULT_BASEDIR Sys_StripAppBundle(Sys_BinaryPath()) -# else -# define DEFAULT_BASEDIR Sys_BinaryPath() -# endif -#endif - -int main ( int argc, char* argv[] ) -{ - int i; - char commandLine[ MAX_STRING_CHARS ] = { 0 }; - - // done before Com/Sys_Init since we need this for error output - //Sys_CreateConsole(); - - // no abort/retry/fail errors - //SetErrorMode (SEM_FAILCRITICALERRORS); - - // get the initial time base - Sys_Milliseconds(); - -#ifdef MACOS_X - // This is passed if we are launched by double-clicking - if ( argc >= 2 && Q_strncmp ( argv[1], "-psn", 4 ) == 0 ) - argc = 1; -#endif - - Sys_SetBinaryPath( Sys_Dirname( argv[ 0 ] ) ); - Sys_SetDefaultInstallPath( DEFAULT_BASEDIR ); - - // Concatenate the command line for passing to Com_Init - for( i = 1; i < argc; i++ ) - { - const bool containsSpaces = (strchr(argv[i], ' ') != NULL); - if (containsSpaces) - Q_strcat( commandLine, sizeof( commandLine ), "\"" ); - - Q_strcat( commandLine, sizeof( commandLine ), argv[ i ] ); - - if (containsSpaces) - Q_strcat( commandLine, sizeof( commandLine ), "\"" ); - - Q_strcat( commandLine, sizeof( commandLine ), " " ); - } - - Com_Init (commandLine); - - NET_Init(); - -#ifdef DEDICATED - fcntl(0, F_SETFL, fcntl (0, F_GETFL, 0) | FNDELAY); -#else - // hide the early console since we've reached the point where we - // have a working graphics subsystems - if (!com_dedicated->integer && !com_viewlog->integer) - { - Sys_ShowConsole(0, qfalse); - } -#endif - - // main game loop - while (1) - { -#if defined __linux__ && defined DEDICATED - Sys_ConfigureFPU();//FIXME: what's this for? -#endif - // make sure mouse and joystick are only called once a frame - IN_Frame(); - - // run the game - Com_Frame(); - } - - // never gets here -} diff --git a/codemp/ui/CMakeLists.txt b/codemp/ui/CMakeLists.txt index d9845bf279..e677f4f4d8 100644 --- a/codemp/ui/CMakeLists.txt +++ b/codemp/ui/CMakeLists.txt @@ -1,4 +1,20 @@ -cmake_minimum_required(VERSION 2.8.8) +#============================================================================ +# Copyright (C) 2013 - 2015, OpenJK contributors +# +# This file is part of the OpenJK source code. +# +# OpenJK is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +#============================================================================ # Make sure the user is not executing this script directly if(NOT InOpenJK) @@ -68,21 +84,44 @@ set(MPUIFiles ${MPUIFiles} ${MPUIRendererFiles}) add_library(${MPUI} SHARED ${MPUIFiles}) -if(NOT WIN32) +if(NOT MSVC) # remove "lib" prefix for .so/.dylib files set_target_properties(${MPUI} PROPERTIES PREFIX "") -endif(NOT WIN32) +endif() + +if(MakeApplicationBundles AND BuildMPEngine) + install(TARGETS ${MPUI} + LIBRARY + DESTINATION "${JKAInstallDir}/${MPEngine}.app/Contents/MacOS/OpenJK" + COMPONENT ${JKAMPCoreComponent}) + install(TARGETS ${MPUI} + LIBRARY + DESTINATION "${JKAInstallDir}/${MPEngine}.app/Contents/MacOS/base" + COMPONENT ${JKAMPCoreComponent}) +elseif(WIN32) + install(TARGETS ${MPUI} + RUNTIME + DESTINATION "${JKAInstallDir}/OpenJK" + COMPONENT ${JKAMPCoreComponent}) + if (WIN64) + # Don't do this on 32-bit Windows to avoid overwriting + # vanilla JKA's DLLs + install(TARGETS ${MPUI} + RUNTIME + DESTINATION "${JKAInstallDir}/base" + COMPONENT ${JKAMPCoreComponent}) + endif() +else() + install(TARGETS ${MPUI} + LIBRARY + DESTINATION "${JKAInstallDir}/OpenJK" + COMPONENT ${JKAMPCoreComponent}) + install(TARGETS ${MPUI} + LIBRARY + DESTINATION "${JKAInstallDir}/base" + COMPONENT ${JKAMPCoreComponent}) +endif() -if(WIN32) - install(TARGETS ${MPUI} RUNTIME DESTINATION "OpenJK") -else(WIN32) - if(MakeApplicationBundles AND BuildMPEngine) - install(TARGETS ${MPUI} LIBRARY DESTINATION "${MPEngine}.app/Contents/MacOS/OpenJK") - install(TARGETS ${MPUI} LIBRARY DESTINATION "${MPEngine}.app/Contents/MacOS/base") - else(MakeApplicationBundles AND BuildMPEngine) - install(TARGETS ${MPUI} LIBRARY DESTINATION "OpenJK") - endif(MakeApplicationBundles AND BuildMPEngine) -endif(WIN32) set_target_properties(${MPUI} PROPERTIES COMPILE_DEFINITIONS_RELWITHDEBINFO "${MPUIDefines};${ReleaseDefines}") set_target_properties(${MPUI} PROPERTIES COMPILE_DEFINITIONS_MINSIZEREL "${MPUIDefines};${ReleaseDefines}") set_target_properties(${MPUI} PROPERTIES COMPILE_DEFINITIONS_RELEASE "${MPUIDefines};${ReleaseDefines}") diff --git a/codemp/ui/keycodes.h b/codemp/ui/keycodes.h index 871cfb75d2..43b514a170 100644 --- a/codemp/ui/keycodes.h +++ b/codemp/ui/keycodes.h @@ -1,7 +1,27 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. -// Copyright (C) 1999-2000 Id Software, Inc. -// +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#pragma once // these are the key numbers that should be passed to KeyEvent diff --git a/codemp/ui/menudef.h b/codemp/ui/menudef.h index 0d21d1aff7..737d59d288 100644 --- a/codemp/ui/menudef.h +++ b/codemp/ui/menudef.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // this file is parsed at runtime by botlib's text preprocessor (used for .menu scripting) // include guards aren't necessary diff --git a/codemp/ui/ui_atoms.c b/codemp/ui/ui_atoms.c index 0683587cc4..2aff0fbedc 100644 --- a/codemp/ui/ui_atoms.c +++ b/codemp/ui/ui_atoms.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + /********************************************************************** UI_ATOMS.C diff --git a/codemp/ui/ui_cvar.c b/codemp/ui/ui_cvar.c index be67dcd9ec..1fae9af73e 100644 --- a/codemp/ui/ui_cvar.c +++ b/codemp/ui/ui_cvar.c @@ -1,3 +1,26 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include "ui_local.h" // diff --git a/codemp/ui/ui_force.c b/codemp/ui/ui_force.c index d03577a1b5..b5a2676c5f 100644 --- a/codemp/ui/ui_force.c +++ b/codemp/ui/ui_force.c @@ -1,4 +1,25 @@ -// +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + /* ======================================================================= diff --git a/codemp/ui/ui_force.h b/codemp/ui/ui_force.h index b7eeea7c43..7b4f494bb0 100644 --- a/codemp/ui/ui_force.h +++ b/codemp/ui/ui_force.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "qcommon/qfiles.h" diff --git a/codemp/ui/ui_gameinfo.c b/codemp/ui/ui_gameinfo.c index 3fa3f53d17..f348d9cf19 100644 --- a/codemp/ui/ui_gameinfo.c +++ b/codemp/ui/ui_gameinfo.c @@ -1,5 +1,26 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // // gameinfo.c // diff --git a/codemp/ui/ui_local.h b/codemp/ui/ui_local.h index a6887c1647..071332979e 100644 --- a/codemp/ui/ui_local.h +++ b/codemp/ui/ui_local.h @@ -1,7 +1,27 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors -// Copyright (C) 1999-2000 Id Software, Inc. -// +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#pragma once #include "qcommon/q_shared.h" #include "rd-common/tr_types.h" @@ -121,7 +141,6 @@ typedef struct playerInfo_s { #define MAX_DEMOS 2048 // 256 #define MAX_MOVIES 2048 // 256 #define MAX_Q3PLAYERMODELS 1024 //256 -#define MAX_PLAYERMODELS 512 //32 #define DEMO_DIRECTORY "demos" #define DEMO_EXTENSION "dm_" @@ -236,17 +255,32 @@ typedef struct modInfo_s { const char *modDescr; } modInfo_t; +#define SKIN_LENGTH 16 +#define ACTION_BUFFER_SIZE 128 + +typedef struct { + char name[SKIN_LENGTH]; +} skinName_t; + +typedef struct { + char shader[MAX_QPATH]; + char actionText[ACTION_BUFFER_SIZE]; +} playerColor_t; + typedef struct playerSpeciesInfo_s { - char Name[64]; + char Name[MAX_QPATH]; int SkinHeadCount; - char SkinHeadNames[MAX_PLAYERMODELS][16]; + int SkinHeadMax; + skinName_t *SkinHead; int SkinTorsoCount; - char SkinTorsoNames[MAX_PLAYERMODELS][16]; + int SkinTorsoMax; + skinName_t *SkinTorso; int SkinLegCount; - char SkinLegNames[MAX_PLAYERMODELS][16]; - char ColorShader[MAX_PLAYERMODELS][64]; + int SkinLegMax; + skinName_t *SkinLeg; + int ColorMax; int ColorCount; - char ColorActionText[MAX_PLAYERMODELS][128]; + playerColor_t *Color; } playerSpeciesInfo_t; typedef struct uiInfo_s { @@ -340,8 +374,9 @@ typedef struct uiInfo_s { qboolean inGameLoad; + int playerSpeciesMax; int playerSpeciesCount; - playerSpeciesInfo_t playerSpecies[MAX_PLAYERMODELS]; + playerSpeciesInfo_t *playerSpecies; int playerSpeciesIndex; short movesTitleIndex; diff --git a/codemp/ui/ui_main.c b/codemp/ui/ui_main.c index fce41dc9b8..7c896275ea 100644 --- a/codemp/ui/ui_main.c +++ b/codemp/ui/ui_main.c @@ -1,5 +1,27 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + /* ======================================================================= @@ -721,9 +743,9 @@ void Text_PaintWithCursor(float x, float y, float scale, vec4_t color, const cha // { char sTemp[1024]; - int iCopyCount = limit ? min( (signed)strlen( text ), limit ) : (signed)strlen( text ); - iCopyCount = min( iCopyCount, cursorPos ); - iCopyCount = min( iCopyCount, sizeof( sTemp ) ); + int iCopyCount = limit > 0 ? Q_min( (int)strlen( text ), limit ) : (int)strlen( text ); + iCopyCount = Q_min( iCopyCount, cursorPos ); + iCopyCount = Q_min( iCopyCount, (int)sizeof( sTemp )-1 ); // copy text into temp buffer for pixel measure... // @@ -1021,10 +1043,12 @@ _UI_Shutdown ================= */ void UI_CleanupGhoul2(void); +void UI_FreeAllSpecies(void); void UI_Shutdown( void ) { trap->LAN_SaveCachedServers(); UI_CleanupGhoul2(); + UI_FreeAllSpecies(); } char *defaultMenu = NULL; @@ -2284,7 +2308,7 @@ void UpdateForceStatus() static void UI_DrawNetSource(rectDef_t *rect, float scale, vec4_t color, int textStyle, int iMenuFont) { - if (ui_netSource.integer < 0 || ui_netSource.integer > numNetSources) { + if (ui_netSource.integer < 0 || ui_netSource.integer >= numNetSources) { trap->Cvar_Set("ui_netSource", "0"); trap->Cvar_Update(&ui_netSource); } @@ -2731,7 +2755,7 @@ static int UI_OwnerDrawWidth(int ownerDraw, float scale) { s = va("%i. %s", iUse, text); break; case UI_NETSOURCE: - if (ui_netSource.integer < 0 || ui_netSource.integer > numNetSources) { + if (ui_netSource.integer < 0 || ui_netSource.integer >= numNetSources) { trap->Cvar_Set("ui_netSource", "0"); trap->Cvar_Update(&ui_netSource); } @@ -2804,7 +2828,7 @@ static void UI_DrawCrosshair(rectDef_t *rect, float scale, vec4_t color) { uiInfo.currentCrosshair = 0; } - size = min( rect->w, rect->h ); + size = Q_min( rect->w, rect->h ); UI_DrawHandlePic( rect->x, rect->y, size, size, uiInfo.uiDC.Assets.crosshairShader[uiInfo.currentCrosshair]); trap->R_SetColor( NULL ); } @@ -4397,16 +4421,37 @@ static void UI_LoadMovies() { UI_LoadDemos =============== */ +#define MAX_DEMO_FOLDER_DEPTH (8) +typedef struct loadDemoContext_s +{ + int depth; + qboolean warned; + char demoList[MAX_DEMOLIST]; + char directoryList[MAX_DEMOLIST]; + char *dirListHead; +} loadDemoContext_t; + +static void UI_LoadDemosInDirectory( loadDemoContext_t *ctx, const char *directory ) +{ + char *demoname = NULL; + char demoExt[32] = {0}; + int protocol = trap->Cvar_VariableValue( "com_protocol" ); + int protocolLegacy = trap->Cvar_VariableValue( "com_legacyprotocol" ); + char *dirListEnd; + int j; -#if 1 + if ( ctx->depth > MAX_DEMO_FOLDER_DEPTH ) + { + if ( !ctx->warned ) + { + ctx->warned = qtrue; + Com_Printf( S_COLOR_YELLOW "WARNING: Maximum demo folder depth (%d) was reached.\n", MAX_DEMO_FOLDER_DEPTH ); + } -static void UI_LoadDemosInDirectory( const char *directory ) -{ - char demolist[MAX_DEMOLIST] = {0}, *demoname = NULL; - char fileList[MAX_DEMOLIST] = {0}, *fileName = NULL; - char demoExt[32] = {0}; - int i=0, j=0, len=0, numFiles=0; - int protocol = trap->Cvar_VariableValue( "com_protocol" ), protocolLegacy = trap->Cvar_VariableValue( "com_legacyprotocol" ); + return; + } + + ctx->depth++; if ( !protocol ) protocol = trap->Cvar_VariableValue( "protocol" ); @@ -4415,11 +4460,11 @@ static void UI_LoadDemosInDirectory( const char *directory ) Com_sprintf( demoExt, sizeof( demoExt ), ".%s%d", DEMO_EXTENSION, protocol); - uiInfo.demoCount += trap->FS_GetFileList( directory, demoExt, demolist, sizeof( demolist ) ); + uiInfo.demoCount += trap->FS_GetFileList( directory, demoExt, ctx->demoList, sizeof( ctx->demoList ) ); - demoname = demolist; + demoname = ctx->demoList; - for ( j=0; j<2; j++ ) + for ( j = 0; j < 2; j++ ) { if ( uiInfo.demoCount > MAX_DEMOS ) uiInfo.demoCount = MAX_DEMOS; @@ -4427,6 +4472,8 @@ static void UI_LoadDemosInDirectory( const char *directory ) for( ; uiInfo.loadedDemos 0 && uiInfo.demoCount < MAX_DEMOS ) { Com_sprintf( demoExt, sizeof( demoExt ), ".%s%d", DEMO_EXTENSION, protocolLegacy ); - uiInfo.demoCount += trap->FS_GetFileList( directory, demoExt, demolist, sizeof( demolist ) ); - demoname = demolist; + uiInfo.demoCount += trap->FS_GetFileList( directory, demoExt, ctx->demoList, sizeof( ctx->demoList ) ); + demoname = ctx->demoList; } else break; } } - numFiles = trap->FS_GetFileList( directory, "/", fileList, sizeof( fileList ) ); - - fileName = fileList; - for ( i=0; idirectoryList + sizeof( ctx->directoryList ); + if ( ctx->dirListHead < dirListEnd ) { - len = strlen( fileName ); - fileName[len] = '\0'; - if ( Q_stricmp( fileName, "." ) && Q_stricmp( fileName, ".." ) && len ) - UI_LoadDemosInDirectory( va( "%s/%s", directory, fileName ) ); - fileName += len+1; + int i; + int dirListSpaceRemaining = dirListEnd - ctx->dirListHead; + int numFiles = trap->FS_GetFileList( directory, "/", ctx->dirListHead, dirListSpaceRemaining ); + char *dirList; + char *childDirListBase; + char *fileName; + + // Find end of this list so we have a base pointer for the child folders to use + dirList = ctx->dirListHead; + for ( i = 0; i < numFiles; i++ ) + { + ctx->dirListHead += strlen( ctx->dirListHead ) + 1; + } + ctx->dirListHead++; + + // Iterate through child directories + childDirListBase = ctx->dirListHead; + fileName = dirList; + for ( i = 0; i < numFiles; i++ ) + { + size_t len = strlen( fileName ); + + if ( Q_stricmp( fileName, "." ) && Q_stricmp( fileName, ".." ) && len ) + UI_LoadDemosInDirectory( ctx, va( "%s/%s", directory, fileName ) ); + + ctx->dirListHead = childDirListBase; + fileName += len+1; + } + + assert( (fileName + 1) == childDirListBase ); } + ctx->depth--; } -static void UI_LoadDemos( void ) +static void InitLoadDemoContext( loadDemoContext_t *ctx ) { - uiInfo.demoCount = 0; - uiInfo.loadedDemos = 0; - memset( uiInfo.demoList, 0, sizeof( uiInfo.demoList ) ); - UI_LoadDemosInDirectory( DEMO_DIRECTORY ); + ctx->warned = qfalse; + ctx->depth = 0; + ctx->dirListHead = ctx->directoryList; } -#else - static void UI_LoadDemos( void ) { - char demolist[4096] = {0}; - char demoExt[8] = {0}; - char *demoname = NULL; - int i, len, extLen; + loadDemoContext_t loadDemoContext; + InitLoadDemoContext( &loadDemoContext ); - Com_sprintf( demoExt, sizeof( demoExt ), "dm_%d", (int)trap->Cvar_VariableValue( "protocol" ) ); - uiInfo.demoCount = Com_Clampi( 0, MAX_DEMOS, trap->FS_GetFileList( "demos", demoExt, demolist, sizeof( demolist ) ) ); - Com_sprintf( demoExt, sizeof( demoExt ), ".dm_%d", (int)trap->Cvar_VariableValue( "protocol" ) ); - extLen = strlen( demoExt ); - - if ( uiInfo.demoCount ) - { - demoname = demolist; - for ( i=0; iCmd_ExecuteText( EXEC_APPEND, va(buff, uiInfo.teamNames[i]) ); + Com_sprintf( buff, sizeof( buff ), orders, uiInfo.teamClientNums[i] ); + trap->Cmd_ExecuteText( EXEC_APPEND, buff ); trap->Cmd_ExecuteText( EXEC_APPEND, "\n" ); } } @@ -7017,6 +7067,10 @@ static void UI_RunMenuScript(char **args) { UI_ClampMaxPlayers(); } + else if ( Q_stricmp( name, "LaunchSP" ) == 0 ) + { + // TODO for MAC_PORT + } else { Com_Printf("unknown UI script %s\n", name); @@ -7604,8 +7658,6 @@ static int UI_GetServerStatusInfo( const char *serverAddress, serverStatusInfo_t while (p && *p) { if (*p == '\\') *p++ = '\0'; - if (!p) - break; score = p; p = strchr(p, ' '); if (!p) @@ -8389,7 +8441,10 @@ static const char *UI_FeederItemText(float feederID, int index, int column, } else if (feederID == FEEDER_PLAYER_SPECIES) { - return uiInfo.playerSpecies[index].Name; + if (index >= 0 && index < uiInfo.playerSpeciesCount) + { + return uiInfo.playerSpecies[index].Name; + } } else if (feederID == FEEDER_LANGUAGES) { @@ -8399,32 +8454,32 @@ static const char *UI_FeederItemText(float feederID, int index, int column, { if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorCount) { - *handle1 = trap->R_RegisterShaderNoMip( uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorShader[index]); - return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorShader[index]; + *handle1 = trap->R_RegisterShaderNoMip( uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color[index].shader); + return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color[index].shader; } } else if (feederID == FEEDER_PLAYER_SKIN_HEAD) { if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadCount) { - *handle1 = trap->R_RegisterShaderNoMip(va("models/players/%s/icon_%s", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadNames[index])); - return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadNames[index]; + *handle1 = trap->R_RegisterShaderNoMip(va("models/players/%s/icon_%s", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHead[index].name)); + return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHead[index].name; } } else if (feederID == FEEDER_PLAYER_SKIN_TORSO) { if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoCount) { - *handle1 = trap->R_RegisterShaderNoMip(va("models/players/%s/icon_%s", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoNames[index])); - return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoNames[index]; + *handle1 = trap->R_RegisterShaderNoMip(va("models/players/%s/icon_%s", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorso[index].name)); + return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorso[index].name; } } else if (feederID == FEEDER_PLAYER_SKIN_LEGS) { if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegCount) { - *handle1 = trap->R_RegisterShaderNoMip(va("models/players/%s/icon_%s", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegNames[index])); - return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegNames[index]; + *handle1 = trap->R_RegisterShaderNoMip(va("models/players/%s/icon_%s", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLeg[index].name)); + return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLeg[index].name; } } else if (feederID == FEEDER_SIEGE_BASE_CLASS) @@ -8452,7 +8507,7 @@ static qhandle_t UI_FeederItemImage(float feederID, int index) { } else if (feederID == FEEDER_Q3HEADS) { - int actual; + int actual = 0; UI_SelectedTeamHead(index, &actual); index = actual; @@ -8571,7 +8626,7 @@ static qhandle_t UI_FeederItemImage(float feederID, int index) { if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadCount) { //return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadIcons[index]; - return trap->R_RegisterShaderNoMip(va("models/players/%s/icon_%s", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadNames[index])); + return trap->R_RegisterShaderNoMip(va("models/players/%s/icon_%s", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHead[index].name)); } } else if (feederID == FEEDER_PLAYER_SKIN_TORSO) @@ -8579,7 +8634,7 @@ static qhandle_t UI_FeederItemImage(float feederID, int index) { if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoCount) { //return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoIcons[index]; - return trap->R_RegisterShaderNoMip(va("models/players/%s/icon_%s", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoNames[index])); + return trap->R_RegisterShaderNoMip(va("models/players/%s/icon_%s", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorso[index].name)); } } else if (feederID == FEEDER_PLAYER_SKIN_LEGS) @@ -8587,14 +8642,14 @@ static qhandle_t UI_FeederItemImage(float feederID, int index) { if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegCount) { //return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegIcons[index]; - return trap->R_RegisterShaderNoMip(va("models/players/%s/icon_%s", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegNames[index])); + return trap->R_RegisterShaderNoMip(va("models/players/%s/icon_%s", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Name, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLeg[index].name)); } } else if (feederID == FEEDER_COLORCHOICES) { if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorCount) { - return trap->R_RegisterShaderNoMip( uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorShader[index]); + return trap->R_RegisterShaderNoMip( uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color[index].shader); } } @@ -8708,7 +8763,7 @@ qboolean UI_FeederSelection(float feederFloat, int index, itemDef_t *item) if (feederID == FEEDER_Q3HEADS) { - int actual; + int actual = 0; UI_SelectedTeamHead(index, &actual); uiInfo.q3SelectedHead = index; trap->Cvar_Set("ui_selectedModelIndex", va("%i", index)); @@ -8965,33 +9020,36 @@ qboolean UI_FeederSelection(float feederFloat, int index, itemDef_t *item) { if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorCount) { - Item_RunScript(item, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorActionText[index]); + Item_RunScript(item, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color[index].actionText); } } else if (feederID == FEEDER_PLAYER_SKIN_HEAD) { if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadCount) { - trap->Cvar_Set("ui_char_skin_head", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadNames[index]); + trap->Cvar_Set("ui_char_skin_head", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHead[index].name); } } else if (feederID == FEEDER_PLAYER_SKIN_TORSO) { if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoCount) { - trap->Cvar_Set("ui_char_skin_torso", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorsoNames[index]); + trap->Cvar_Set("ui_char_skin_torso", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinTorso[index].name); } } else if (feederID == FEEDER_PLAYER_SKIN_LEGS) { if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegCount) { - trap->Cvar_Set("ui_char_skin_legs", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLegNames[index]); + trap->Cvar_Set("ui_char_skin_legs", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinLeg[index].name); } } else if (feederID == FEEDER_PLAYER_SPECIES) { - uiInfo.playerSpeciesIndex = index; + if (index >= 0 && index < uiInfo.playerSpeciesCount) + { + uiInfo.playerSpeciesIndex = index; + } } else if (feederID == FEEDER_LANGUAGES) { @@ -9504,6 +9562,8 @@ static qboolean UI_ParseColorData(char* buf, playerSpeciesInfo_t *species,char* p = buf; COM_BeginParseSession(file); species->ColorCount = 0; + species->ColorMax = 16; + species->Color = (playerColor_t *)malloc(species->ColorMax * sizeof(playerColor_t)); while ( p ) { @@ -9512,15 +9572,22 @@ static qboolean UI_ParseColorData(char* buf, playerSpeciesInfo_t *species,char* { return species->ColorCount; } - Q_strncpyz( species->ColorShader[species->ColorCount], token, sizeof(species->ColorShader[0]) ); + if (species->ColorCount >= species->ColorMax) + { + species->ColorMax *= 2; + species->Color = (playerColor_t *)realloc(species->Color, species->ColorMax * sizeof(playerColor_t)); + } + + memset(&species->Color[species->ColorCount], 0, sizeof(playerColor_t)); + + Q_strncpyz( species->Color[species->ColorCount].shader, token, MAX_QPATH ); token = COM_ParseExt( &p, qtrue ); //looking for action block { if ( token[0] != '{' ) { return qfalse; } - - assert(!species->ColorActionText[species->ColorCount][0]); + token = COM_ParseExt( &p, qtrue ); //looking for action commands while (token[0] != '}') { @@ -9528,9 +9595,8 @@ static qboolean UI_ParseColorData(char* buf, playerSpeciesInfo_t *species,char* { //EOF return qfalse; } - assert(species->ColorCount < sizeof(species->ColorActionText)/sizeof(species->ColorActionText[0]) ); - Q_strcat(species->ColorActionText[species->ColorCount], sizeof(species->ColorActionText[0]), token); - Q_strcat(species->ColorActionText[species->ColorCount], sizeof(species->ColorActionText[0]), " "); + Q_strcat(species->Color[species->ColorCount].actionText, ACTION_BUFFER_SIZE, token); + Q_strcat(species->Color[species->ColorCount].actionText, ACTION_BUFFER_SIZE, " "); token = COM_ParseExt( &p, qtrue ); //looking for action commands or final } } species->ColorCount++; //next color please @@ -9538,6 +9604,26 @@ static qboolean UI_ParseColorData(char* buf, playerSpeciesInfo_t *species,char* return qtrue;//never get here } +static void UI_FreeSpecies( playerSpeciesInfo_t *species ) +{ + free(species->SkinHead); + free(species->SkinTorso); + free(species->SkinLeg); + free(species->Color); + memset(species, 0, sizeof(playerSpeciesInfo_t)); +} + +void UI_FreeAllSpecies( void ) +{ + int i; + + for (i = 0; i < uiInfo.playerSpeciesCount; i++) + { + UI_FreeSpecies(&uiInfo.playerSpecies[i]); + } + free(uiInfo.playerSpecies); +} + /* ================= UI_BuildPlayerModel_List @@ -9554,7 +9640,8 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) uiInfo.playerSpeciesCount = 0; uiInfo.playerSpeciesIndex = 0; - memset(uiInfo.playerSpecies, 0, sizeof (uiInfo.playerSpecies) ); + uiInfo.playerSpeciesMax = 8; + uiInfo.playerSpecies = (playerSpeciesInfo_t *)malloc(uiInfo.playerSpeciesMax * sizeof(playerSpeciesInfo_t)); // iterate directory of all player models numdirs = trap->FS_GetFileList("models/players", "/", dirlist, 2048 ); @@ -9588,6 +9675,7 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) if (f) { char buffer[2048]; + playerSpeciesInfo_t *species; char skinname[64]; int numfiles; int iSkinParts=0; @@ -9597,12 +9685,27 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) buffer[filelen] = 0; //ensure trailing NULL //record this species - Q_strncpyz( uiInfo.playerSpecies[uiInfo.playerSpeciesCount].Name, dirptr, sizeof(uiInfo.playerSpecies[0].Name) ); + if (uiInfo.playerSpeciesCount >= uiInfo.playerSpeciesMax) + { + uiInfo.playerSpeciesMax *= 2; + uiInfo.playerSpecies = (playerSpeciesInfo_t *)realloc(uiInfo.playerSpecies, uiInfo.playerSpeciesMax*sizeof(playerSpeciesInfo_t)); + } + species = &uiInfo.playerSpecies[uiInfo.playerSpeciesCount]; + memset(species, 0, sizeof(playerSpeciesInfo_t)); + Q_strncpyz( species->Name, dirptr, MAX_QPATH ); - if (!UI_ParseColorData(buffer,&uiInfo.playerSpecies[uiInfo.playerSpeciesCount],fpath)) + if (!UI_ParseColorData(buffer,species,fpath)) { Com_Printf(S_COLOR_RED"UI_BuildPlayerModel_List: Errors parsing '%s'\n", fpath); } + + species->SkinHeadMax = 8; + species->SkinTorsoMax = 8; + species->SkinLegMax = 8; + + species->SkinHead = (skinName_t *)malloc(species->SkinHeadMax * sizeof(skinName_t)); + species->SkinTorso = (skinName_t *)malloc(species->SkinTorsoMax * sizeof(skinName_t)); + species->SkinLeg = (skinName_t *)malloc(species->SkinLegMax * sizeof(skinName_t)); numfiles = trap->FS_GetFileList( va("models/players/%s",dirptr), ".skin", filelist, 2048 ); fileptr = filelist; @@ -9622,43 +9725,39 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) { //if it exists if (Q_stricmpn(skinname,"head_",5) == 0) { - if (uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinHeadCount < MAX_PLAYERMODELS) + if (species->SkinHeadCount >= species->SkinHeadMax) { - Q_strncpyz( - uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinHeadNames[uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinHeadCount++], - skinname, - sizeof(uiInfo.playerSpecies[0].SkinHeadNames[0]) - ); - iSkinParts |= 1<<0; + species->SkinHeadMax *= 2; + species->SkinHead = (skinName_t *)realloc(species->SkinHead, species->SkinHeadMax*sizeof(skinName_t)); } + Q_strncpyz(species->SkinHead[species->SkinHeadCount++].name, skinname, SKIN_LENGTH); + iSkinParts |= 1<<0; } else if (Q_stricmpn(skinname,"torso_",6) == 0) { - if (uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinTorsoCount < MAX_PLAYERMODELS) + if (species->SkinTorsoCount >= species->SkinTorsoMax) { - Q_strncpyz(uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinTorsoNames[uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinTorsoCount++], - skinname, - sizeof(uiInfo.playerSpecies[0].SkinTorsoNames[0]) - ); - iSkinParts |= 1<<1; + species->SkinTorsoMax *= 2; + species->SkinTorso = (skinName_t *)realloc(species->SkinTorso, species->SkinTorsoMax*sizeof(skinName_t)); } + Q_strncpyz(species->SkinTorso[species->SkinTorsoCount++].name, skinname, SKIN_LENGTH); + iSkinParts |= 1<<1; } else if (Q_stricmpn(skinname,"lower_",6) == 0) { - if (uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinLegCount < MAX_PLAYERMODELS) + if (species->SkinLegCount >= species->SkinLegMax) { - Q_strncpyz(uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinLegNames[uiInfo.playerSpecies[uiInfo.playerSpeciesCount].SkinLegCount++], - skinname, - sizeof(uiInfo.playerSpecies[0].SkinLegNames[0]) - ); - iSkinParts |= 1<<2; + species->SkinLegMax *= 2; + species->SkinLeg = (skinName_t *)realloc(species->SkinLeg, species->SkinLegMax*sizeof(skinName_t)); } + Q_strncpyz(species->SkinLeg[species->SkinLegCount++].name, skinname, SKIN_LENGTH); + iSkinParts |= 1<<2; } } } if (iSkinParts != 7) { //didn't get a skin for each, then skip this model. - memset(&uiInfo.playerSpecies[uiInfo.playerSpeciesCount], 0, sizeof(uiInfo.playerSpecies[uiInfo.playerSpeciesCount]));//undo the colors + UI_FreeSpecies(species); continue; } uiInfo.playerSpeciesCount++; @@ -9674,10 +9773,6 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) trap->G2API_CleanGhoul2Models (&ghoul2); } } - if (uiInfo.playerSpeciesCount >= MAX_PLAYERMODELS) - { - return; - } } } } diff --git a/codemp/ui/ui_public.h b/codemp/ui/ui_public.h index 262dc0157d..d03305167b 100644 --- a/codemp/ui/ui_public.h +++ b/codemp/ui/ui_public.h @@ -1,7 +1,27 @@ -#pragma once +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. -// Copyright (C) 1999-2000 Id Software, Inc. -// +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#pragma once #define UI_API_VERSION 1 #define UI_LEGACY_API_VERSION 7 diff --git a/codemp/ui/ui_saber.c b/codemp/ui/ui_saber.c index 8deade1a8a..5546ecd56c 100644 --- a/codemp/ui/ui_saber.c +++ b/codemp/ui/ui_saber.c @@ -1,4 +1,25 @@ -// +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + /* ======================================================================= diff --git a/codemp/ui/ui_shared.c b/codemp/ui/ui_shared.c index 815c41f82b..b8fa4d30dd 100644 --- a/codemp/ui/ui_shared.c +++ b/codemp/ui/ui_shared.c @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // // string allocation/managment @@ -287,6 +311,7 @@ void String_Init() { } } +#if 0 /* ================= PC_SourceWarning @@ -308,6 +333,7 @@ void PC_SourceWarning(int handle, char *format, ...) { Com_Printf(S_COLOR_YELLOW "WARNING: %s, line %d: %s\n", filename, line, string); } +#endif /* ================= @@ -385,7 +411,7 @@ qboolean PC_Float_Parse(int handle, float *f) { negative = qtrue; } if (token.type != TT_NUMBER) { - PC_SourceError(handle, "expected float but found %s\n", token.string); + PC_SourceError(handle, "expected float but found %s", token.string); return qfalse; } if (negative) @@ -465,7 +491,7 @@ qboolean PC_Int_Parse(int handle, int *i) { negative = qtrue; } if (token.type != TT_NUMBER) { - PC_SourceError(handle, "expected integer but found %s\n", token.string); + PC_SourceError(handle, "expected integer but found %s", token.string); return qfalse; } *i = token.intvalue; @@ -656,12 +682,15 @@ void Window_Paint(windowDef_t *w, float fadeAmount, float fadeClamp, float fadeC vec4_t color; rectDef_t fillRect; + if ( w == NULL ) + return; + if ( debugMode ) { color[0] = color[1] = color[2] = color[3] = 1; DC->drawRect(w->rect.x, w->rect.y, w->rect.w, w->rect.h, 1, color); } - if ( w == NULL || ( w->style == 0 && w->border == 0 ) ) + if ( w->style == 0 && w->border == 0 ) return; fillRect = w->rect; @@ -1167,7 +1196,7 @@ qboolean Script_SetItemColorCvar(itemDef_t *item, char **args) char *colorCvarName,*holdBuf,*holdVal; char cvarBuf[1024]; const char *name; - vec4_t color; + vec4_t color = { 0.0f }; int i; vec4_t *out; @@ -1897,8 +1926,7 @@ transition3 lfvscr (min extent) (max extent) (fovx,y) 20 25 */ qboolean Script_Transition3(itemDef_t *item, char **args) { - const char *name; - const char *value; + const char *name = NULL, *value = NULL; float minx, miny, minz, maxx, maxy, maxz, fovtx, fovty; int time; float amt; @@ -1956,7 +1984,9 @@ qboolean Script_Transition3(itemDef_t *item, char **args) } } } - Com_Printf(S_COLOR_YELLOW"WARNING: Script_Transition2: error parsing '%s'\n", name ); + if ( name ) { + Com_Printf( S_COLOR_YELLOW "WARNING: Script_Transition2: error parsing '%s'\n", name ); + } return qtrue; } #endif @@ -5901,7 +5931,7 @@ void Item_OwnerDraw_Paint(itemDef_t *item) { if ( item->cvarFlags & (CVAR_ENABLE | CVAR_DISABLE) && !Item_EnableShowViaCvar( item, CVAR_ENABLE ) ) memcpy( color, parent->disableColor, sizeof( vec4_t ) ); - + if (item->text) { Item_Text_Paint(item); if (item->text[0]) { @@ -7466,7 +7496,7 @@ qboolean ItemParse_flag( itemDef_t *item, int handle) if (itemFlags[i].string == NULL) { - Com_Printf( S_COLOR_YELLOW "Unknown item style value '%s'", token.string ); + Com_Printf( S_COLOR_YELLOW "Unknown item style value '%s'\n", token.string ); } return qtrue; @@ -7482,7 +7512,7 @@ qboolean ItemParse_style( itemDef_t *item, int handle) { if (!PC_Int_Parse(handle, &item->window.style)) { - Com_Printf(S_COLOR_YELLOW "Unknown item style value"); + Com_Printf(S_COLOR_YELLOW "Unknown item style value\n"); return qfalse; } @@ -7710,7 +7740,7 @@ qboolean ItemParse_textalign( itemDef_t *item, int handle ) { if (!PC_Int_Parse(handle, &item->textalignment)) { - Com_Printf(S_COLOR_YELLOW "Unknown text alignment value"); + Com_Printf(S_COLOR_YELLOW "Unknown text alignment value\n"); return qfalse; } @@ -8030,8 +8060,10 @@ qboolean ItemParse_cvarFloat( itemDef_t *item, int handle ) { return qfalse; } +#ifdef _UI char currLanguage[32][128]; static const char languageString[32] = "@MENUS_MYLANGUAGE"; +#endif qboolean ItemParse_cvarStrList( itemDef_t *item, int handle ) { pc_token_t token; @@ -8090,7 +8122,7 @@ qboolean ItemParse_cvarStrList( itemDef_t *item, int handle ) { if (!PC_String_Parse(handle, (const char **)&psString)) { - PC_SourceError(handle, "end of file inside menu item\n"); + PC_SourceError(handle, "end of file inside menu item"); return qfalse; } @@ -8152,7 +8184,7 @@ qboolean ItemParse_cvarFloatList( itemDef_t *item, int handle ) if ( !PC_String_Parse ( handle, (const char **)&string ) ) { - PC_SourceError(handle, "end of file inside menu item\n"); + PC_SourceError(handle, "end of file inside menu item"); return qfalse; } @@ -8441,7 +8473,7 @@ qboolean Item_Parse(int handle, itemDef_t *item) { } while ( 1 ) { if (!trap->PC_ReadToken(handle, &token)) { - PC_SourceError(handle, "end of file inside menu item\n"); + PC_SourceError(handle, "end of file inside menu item"); return qfalse; } @@ -8759,7 +8791,7 @@ qboolean MenuParse_style( itemDef_t *item, int handle) if (!PC_Int_Parse(handle, &menu->window.style)) { - Com_Printf(S_COLOR_YELLOW "Unknown menu style value"); + Com_Printf(S_COLOR_YELLOW "Unknown menu style value\n"); return qfalse; } @@ -8863,7 +8895,7 @@ qboolean MenuParse_descAlignment( itemDef_t *item, int handle ) if (!PC_Int_Parse(handle, &menu->descAlignment)) { - Com_Printf(S_COLOR_YELLOW "Unknown desc alignment value"); + Com_Printf(S_COLOR_YELLOW "Unknown desc alignment value\n"); return qfalse; } @@ -9207,7 +9239,7 @@ qboolean Menu_Parse(int handle, menuDef_t *menu) { while ( 1 ) { if (!trap->PC_ReadToken(handle, &token)) { - PC_SourceError(handle, "end of file inside menu\n"); + PC_SourceError(handle, "end of file inside menu"); return qfalse; } diff --git a/codemp/ui/ui_shared.h b/codemp/ui/ui_shared.h index 68acc000c5..005e56cff8 100644 --- a/codemp/ui/ui_shared.h +++ b/codemp/ui/ui_shared.h @@ -1,3 +1,27 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include "qcommon/q_shared.h" diff --git a/codemp/ui/ui_syscalls.c b/codemp/ui/ui_syscalls.c index 1fea3ae4a4..aac79fff5a 100644 --- a/codemp/ui/ui_syscalls.c +++ b/codemp/ui/ui_syscalls.c @@ -1,7 +1,28 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + // this file is only included when building a dll -// syscalls.asm is included instead when building a qvm #include "ui_local.h" static intptr_t (QDECL *Q_syscall)( intptr_t arg, ... ) = (intptr_t (QDECL *)( intptr_t, ...))-1; diff --git a/codemp/ui/ui_xcvar.h b/codemp/ui/ui_xcvar.h index 1078ae9368..6f4758d95f 100644 --- a/codemp/ui/ui_xcvar.h +++ b/codemp/ui/ui_xcvar.h @@ -1,3 +1,25 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ #ifdef XCVAR_PROTO #define XCVAR_DEF( name, defVal, update, flags ) extern vmCvar_t name; diff --git a/codemp/win32/glw_win.h b/codemp/win32/glw_win.h index 454beee0c4..9ddd4d2087 100644 --- a/codemp/win32/glw_win.h +++ b/codemp/win32/glw_win.h @@ -1,8 +1,5 @@ #pragma once - -#ifndef _WIN32 - #error You should not be including this file on this platform -#endif +#error You should not be including this file on this platform #include diff --git a/codemp/win32/win_local.h b/codemp/win32/win_local.h index 1a9dd91279..855ef10805 100644 --- a/codemp/win32/win_local.h +++ b/codemp/win32/win_local.h @@ -1,5 +1,6 @@ // win_local.h: Win32-specific Quake3 header file #pragma once +#error Deprecated file #include "qcommon/qcommon.h" diff --git a/codemp/win32/win_main.cpp b/codemp/win32/win_main.cpp index caef083ff2..349bc65628 100644 --- a/codemp/win32/win_main.cpp +++ b/codemp/win32/win_main.cpp @@ -11,797 +11,18 @@ #include #include #include +#include "../sys/sys_loadlib.h" +#include "../sys/sys_local.h" #include "qcommon/stringed_ingame.h" -#define MEM_THRESHOLD 128*1024*1024 +//WinVars_t g_wv; -/* win_shared.cpp */ -void Sys_SetBinaryPath(const char *path); -char *Sys_BinaryPath(void); -/* -================== -Sys_LowPhysicalMemory() -================== -*/ - -qboolean Sys_LowPhysicalMemory(void) { - static MEMORYSTATUSEX stat; - static qboolean bAsked = qfalse; - static cvar_t* sys_lowmem = Cvar_Get( "sys_lowmem", "0", 0 ); - - if (!bAsked) // just in case it takes a little time for GlobalMemoryStatusEx() to gather stats on - { // stuff we don't care about such as virtual mem etc. - bAsked = qtrue; - - stat.dwLength = sizeof (stat); - GlobalMemoryStatusEx (&stat); - } - if (sys_lowmem->integer) - { - return qtrue; - } - return (stat.ullTotalPhys <= MEM_THRESHOLD) ? qtrue : qfalse; -} - -/* -============= -Sys_Error - -Show the early console as an error dialog -============= -*/ -void QDECL Sys_Error( const char *error, ... ) { - va_list argptr; - char text[4096]; - MSG msg; - - va_start (argptr, error); - Q_vsnprintf(text, sizeof(text), error, argptr); - va_end (argptr); - - Conbuf_AppendText( text ); - Conbuf_AppendText( "\n" ); - - Sys_SetErrorText( text ); - Sys_ShowConsole( 1, qtrue ); - - timeEndPeriod( 1 ); - - IN_Shutdown(); - - // wait for the user to quit - while ( 1 ) { - if (!GetMessage (&msg, NULL, 0, 0)) - Com_Quit_f (); - TranslateMessage (&msg); - DispatchMessage (&msg); - } - - Sys_DestroyConsole(); - Com_ShutdownZoneMemory(); - Com_ShutdownHunkMemory(); - - exit (1); -} - -/* -============== -Sys_Quit -============== -*/ -void Sys_Quit( void ) { - timeEndPeriod( 1 ); - IN_Shutdown(); - Sys_DestroyConsole(); - Com_ShutdownZoneMemory(); - Com_ShutdownHunkMemory(); - - exit (0); -} - -/* -============== -Sys_Print -============== -*/ -void Sys_Print( const char *msg ) { - // TTimo - prefix for text that shows up in console but not in notify - // backported from RTCW - if ( !Q_strncmp( msg, "[skipnotify]", 12 ) ) { - msg += 12; - } - if ( msg[0] == '*' ) { - msg += 1; - } - Conbuf_AppendText( msg ); -} - - -/* -============== -Sys_Mkdir -============== -*/ -qboolean Sys_Mkdir( const char *path ) { - if( !CreateDirectory( path, NULL ) ) - { - if( GetLastError( ) != ERROR_ALREADY_EXISTS ) - return qfalse; - } - return qtrue; -} - -/* -============== -Sys_Cwd -============== -*/ -char *Sys_Cwd( void ) { - static char cwd[MAX_OSPATH]; - - _getcwd( cwd, sizeof( cwd ) - 1 ); - cwd[MAX_OSPATH-1] = 0; - - return cwd; -} - -/* Resolves path names and determines if they are the same */ -/* For use with full OS paths not quake paths */ -/* Returns true if resulting paths are valid and the same, otherwise false */ -bool Sys_PathCmp( const char *path1, const char *path2 ) { - char *r1, *r2; - - r1 = _fullpath(NULL, path1, MAX_OSPATH); - r2 = _fullpath(NULL, path2, MAX_OSPATH); - - if(r1 && r2 && !Q_stricmp(r1, r2)) - { - free(r1); - free(r2); - return true; - } - - free(r1); - free(r2); - return false; -} - -/* -============================================================== - -DIRECTORY SCANNING - -============================================================== -*/ - -#define MAX_FOUND_FILES 0x1000 - -void Sys_ListFilteredFiles( const char *basedir, char *subdirs, char *filter, char **psList, int *numfiles ) { - char search[MAX_OSPATH], newsubdirs[MAX_OSPATH]; - char filename[MAX_OSPATH]; - intptr_t findhandle; - struct _finddata_t findinfo; - - if ( *numfiles >= MAX_FOUND_FILES - 1 ) { - return; - } - - if (strlen(subdirs)) { - Com_sprintf( search, sizeof(search), "%s\\%s\\*", basedir, subdirs ); - } - else { - Com_sprintf( search, sizeof(search), "%s\\*", basedir ); - } - - findhandle = _findfirst (search, &findinfo); - if (findhandle == -1) { - return; - } - - do { - if (findinfo.attrib & _A_SUBDIR) { - if (Q_stricmp(findinfo.name, ".") && Q_stricmp(findinfo.name, "..")) { - if (strlen(subdirs)) { - Com_sprintf( newsubdirs, sizeof(newsubdirs), "%s\\%s", subdirs, findinfo.name); - } - else { - Com_sprintf( newsubdirs, sizeof(newsubdirs), "%s", findinfo.name); - } - Sys_ListFilteredFiles( basedir, newsubdirs, filter, psList, numfiles ); - } - } - if ( *numfiles >= MAX_FOUND_FILES - 1 ) { - break; - } - Com_sprintf( filename, sizeof(filename), "%s\\%s", subdirs, findinfo.name ); - if (!Com_FilterPath( filter, filename, qfalse )) - continue; - psList[ *numfiles ] = CopyString( filename ); - (*numfiles)++; - } while ( _findnext (findhandle, &findinfo) != -1 ); - - _findclose (findhandle); -} - -static qboolean strgtr(const char *s0, const char *s1) { - int l0, l1, i; - - l0 = strlen(s0); - l1 = strlen(s1); - - if (l1 s0[i]) { - return qtrue; - } - if (s1[i] < s0[i]) { - return qfalse; - } - } - return qfalse; -} - -char **Sys_ListFiles( const char *directory, const char *extension, char *filter, int *numfiles, qboolean wantsubs ) { - char search[MAX_OSPATH]; - int nfiles; - char **listCopy; - char *list[MAX_FOUND_FILES]; - struct _finddata_t findinfo; - intptr_t findhandle; - int flag; - int i; - - if (filter) { - - nfiles = 0; - Sys_ListFilteredFiles( directory, "", filter, list, &nfiles ); - - list[ nfiles ] = 0; - *numfiles = nfiles; - - if (!nfiles) - return NULL; - - listCopy = (char **)Z_Malloc( ( nfiles + 1 ) * sizeof( *listCopy ), TAG_LISTFILES ); - for ( i = 0 ; i < nfiles ; i++ ) { - listCopy[i] = list[i]; - } - listCopy[i] = NULL; - - return listCopy; - } - - if ( !extension) { - extension = ""; - } - - // passing a slash as extension will find directories - if ( extension[0] == '/' && extension[1] == 0 ) { - extension = ""; - flag = 0; - } else { - flag = _A_SUBDIR; - } - - Com_sprintf( search, sizeof(search), "%s\\*%s", directory, extension ); - - // search - nfiles = 0; - - findhandle = _findfirst (search, &findinfo); - if (findhandle == -1) { - *numfiles = 0; - return NULL; - } - - do { - if ( (!wantsubs && flag ^ ( findinfo.attrib & _A_SUBDIR )) || (wantsubs && findinfo.attrib & _A_SUBDIR) ) { - if ( nfiles == MAX_FOUND_FILES - 1 ) { - break; - } - list[ nfiles ] = CopyString( findinfo.name ); - nfiles++; - } - } while ( _findnext (findhandle, &findinfo) != -1 ); - - list[ nfiles ] = 0; - - _findclose (findhandle); - - // return a copy of the list - *numfiles = nfiles; - - if ( !nfiles ) { - return NULL; - } - - listCopy = (char **)Z_Malloc( ( nfiles + 1 ) * sizeof( *listCopy ), TAG_LISTFILES ); - for ( i = 0 ; i < nfiles ; i++ ) { - listCopy[i] = list[i]; - } - listCopy[i] = NULL; - - do { - flag = 0; - for(i=1; iinteger ) - Com_Printf( "Sys_LoadLegacyGameDll: Failed to unpack %s from PK3.\n", filename ); - - return NULL; - } - - libHandle = LoadLibrary( filename ); - if ( !libHandle ) { - basepath = Cvar_VariableString( "fs_basepath" ); - homepath = Cvar_VariableString( "fs_homepath" ); - cdpath = Cvar_VariableString( "fs_cdpath" ); - gamedir = Cvar_VariableString( "fs_game" ); - - fn = FS_BuildOSPath( basepath, gamedir, filename ); - libHandle = LoadLibrary( fn ); - - if ( !libHandle ) { - if( homepath[0] ) { - fn = FS_BuildOSPath( homepath, gamedir, filename ); - libHandle = LoadLibrary( fn ); - } - if ( !libHandle ) { - if( cdpath[0] ) { - fn = FS_BuildOSPath( cdpath, gamedir, filename ); - libHandle = LoadLibrary( fn ); - } - if ( !libHandle ) { - return NULL; - } - } - } - } - - dllEntry = ( void (QDECL *)( intptr_t (QDECL *)( intptr_t, ... ) ) )GetProcAddress( libHandle, "dllEntry" ); - *vmMain = (intptr_t (QDECL *)(int,...))GetProcAddress( libHandle, "vmMain" ); - if ( !*vmMain || !dllEntry ) { - if ( com_developer->integer ) - Com_Printf( "Sys_LoadLegacyGameDll: Entry point not found in %s. Failed with system error code 0x%X.\n", filename, GetLastError() ); - - FreeLibrary( libHandle ); - return NULL; - } - dllEntry( systemcalls ); - - return libHandle; -} - -void *QDECL Sys_LoadGameDll( const char *name, void *(QDECL **moduleAPI)(int, ...) ) { - HINSTANCE libHandle; - char *basepath, *homepath, *cdpath, *gamedir; - char *fn; - char filename[MAX_QPATH]; - - Com_sprintf( filename, sizeof( filename ), "%s" ARCH_STRING DLL_EXT, name ); - - if (!Sys_UnpackDLL(filename)) - { - if ( com_developer->integer ) - Com_Printf( "Sys_LoadGameDll: Failed to unpack %s from PK3.\n", filename ); - - return NULL; - } - - libHandle = LoadLibrary( filename ); - if ( !libHandle ) { - basepath = Cvar_VariableString( "fs_basepath" ); - homepath = Cvar_VariableString( "fs_homepath" ); - cdpath = Cvar_VariableString( "fs_cdpath" ); - gamedir = Cvar_VariableString( "fs_game" ); - - fn = FS_BuildOSPath( basepath, gamedir, filename ); - libHandle = LoadLibrary( fn ); - - if ( !libHandle ) { - if( homepath[0] ) { - fn = FS_BuildOSPath( homepath, gamedir, filename ); - libHandle = LoadLibrary( fn ); - } - if ( !libHandle ) { - if( cdpath[0] ) { - fn = FS_BuildOSPath( cdpath, gamedir, filename ); - libHandle = LoadLibrary( fn ); - } - if ( !libHandle ) { - return NULL; - } - } - } - } - - *moduleAPI = (void *(QDECL *)(int,...))GetProcAddress( libHandle, "GetModuleAPI" ); - if ( !*moduleAPI ) { - if ( com_developer->integer ) - Com_Printf( "Sys_LoadGameDll: Entry point not found in %s. Failed with system error code 0x%X.\n", filename, GetLastError() ); - - FreeLibrary( libHandle ); - return NULL; - } - - return libHandle; -} - -/* -======================================================================== - -EVENT LOOP - -======================================================================== -*/ - -#define MAX_QUED_EVENTS 256 -#define MASK_QUED_EVENTS ( MAX_QUED_EVENTS - 1 ) - -sysEvent_t eventQue[MAX_QUED_EVENTS]; -int eventHead, eventTail; -byte sys_packetReceived[MAX_MSGLEN]; - -/* -================ -Sys_QueEvent - -A time of 0 will get the current time -Ptr should either be null, or point to a block of data that can -be freed by the game later. -================ -*/ -void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptrLength, void *ptr ) { - sysEvent_t *ev; - - ev = &eventQue[ eventHead & MASK_QUED_EVENTS ]; - if ( eventHead - eventTail >= MAX_QUED_EVENTS ) { - Com_Printf("Sys_QueEvent: overflow\n"); - // we are discarding an event, but don't leak memory - if ( ev->evPtr ) { - Z_Free( ev->evPtr ); - } - eventTail++; - } - - eventHead++; - - if ( time == 0 ) { - time = Sys_Milliseconds(); - } - - ev->evTime = time; - ev->evType = type; - ev->evValue = value; - ev->evValue2 = value2; - ev->evPtrLength = ptrLength; - ev->evPtr = ptr; -} - -/* -================ -Sys_GetEvent - -================ -*/ -sysEvent_t Sys_GetEvent( void ) { - MSG msg; - sysEvent_t ev; - char *s; - msg_t netmsg; - netadr_t adr; - - // return if we have data - if ( eventHead > eventTail ) { - eventTail++; - return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ]; - } - - // pump the message loop - while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) { - if ( !GetMessage (&msg, NULL, 0, 0) ) { - Com_Quit_f(); - } - - // save the msg time, because wndprocs don't have access to the timestamp - g_wv.sysMsgTime = msg.time; - - TranslateMessage (&msg); - DispatchMessage (&msg); - } - - // check for console commands - s = Sys_ConsoleInput(); - if ( s ) { - char *b; - int len; - - len = strlen( s ) + 1; - b = (char *)Z_Malloc( len, TAG_EVENT ); - Q_strncpyz( b, s, len ); - Sys_QueEvent( 0, SE_CONSOLE, 0, 0, len, b ); - } - - // check for network packets - MSG_Init( &netmsg, sys_packetReceived, sizeof( sys_packetReceived ) ); - if ( Sys_GetPacket ( &adr, &netmsg ) ) { - netadr_t *buf; - int len; - - // copy out to a seperate buffer for qeueing - // the readcount stepahead is for SOCKS support - len = sizeof( netadr_t ) + netmsg.cursize - netmsg.readcount; - buf = (netadr_t *)Z_Malloc( len, TAG_EVENT, qtrue ); - *buf = adr; - memcpy( buf+1, &netmsg.data[netmsg.readcount], netmsg.cursize - netmsg.readcount ); - Sys_QueEvent( 0, SE_PACKET, 0, 0, len, buf ); - } - - // return if we have data - if ( eventHead > eventTail ) { - eventTail++; - return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ]; - } - - // create an empty event to return - - memset( &ev, 0, sizeof( ev ) ); - ev.evTime = timeGetTime(); - - return ev; -} //================================================================ -/* -================= -Sys_In_Restart_f - -Restart the input subsystem -================= -*/ -void Sys_In_Restart_f( void ) { - IN_Shutdown(); - IN_Init(); -} - -/* -================ -Sys_Init - -Called after the common systems (cvars, files, etc) -are initialized -================ -*/ - -void Sys_Init( void ) { - // make sure the timer is high precision, otherwise - // NT gets 18ms resolution - timeBeginPeriod( 1 ); - - Cmd_AddCommand ("in_restart", Sys_In_Restart_f); - - g_wv.osversion.dwOSVersionInfoSize = sizeof( g_wv.osversion ); - - if (!GetVersionEx (&g_wv.osversion)) - Sys_Error ("Couldn't get OS info"); - - if (g_wv.osversion.dwMajorVersion < 4) - Sys_Error ("This game requires Windows version 4 or greater"); - if (g_wv.osversion.dwPlatformId == VER_PLATFORM_WIN32s) - Sys_Error ("This game doesn't run on Win32s"); - - Cvar_Set( "arch", OS_STRING " " ARCH_STRING ); - - // save out a couple things in rom cvars for the renderer to access - Cvar_Get( "win_hinstance", va("%p", g_wv.hInstance), CVAR_ROM ); - Cvar_Get( "win_wndproc", va("%p", MainWndProc), CVAR_ROM ); - - Cvar_Set( "username", Sys_GetCurrentUser() ); - - IN_Init(); // FIXME: not in dedicated? -} // do a quick mem test to check for any potential future mem problems... // @@ -932,6 +153,7 @@ static int ParseCommandLine(char *cmdline, char **argv) # define DEFAULT_BASEDIR Sys_BinaryPath() #endif +#if 0 int main( int argc, char **argv ) { int i; @@ -998,6 +220,7 @@ int main( int argc, char **argv ) Com_Frame(); } } +#endif /* ================== @@ -1005,6 +228,8 @@ WinMain ================== */ + +#if 0 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // should never get a previous instance in Win32 if ( hPrevInstance ) { @@ -1043,3 +268,4 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin // never gets here return 0; } +#endif \ No newline at end of file diff --git a/codemp/win32/win_main_ded.cpp b/codemp/win32/win_main_ded.cpp index 6304446905..2ba7864f00 100644 --- a/codemp/win32/win_main_ded.cpp +++ b/codemp/win32/win_main_ded.cpp @@ -12,988 +12,13 @@ #include #include #include +#include "../sys/sys_loadlib.h" +#include "../sys/sys_local.h" #include "qcommon/stringed_ingame.h" -#define MEM_THRESHOLD 128*1024*1024 - -/* win_shared.cpp */ -void Sys_SetBinaryPath(const char *path); -char *Sys_BinaryPath(void); - void *Sys_GetBotAIAPI (void *parms ) { return NULL; } -// We now expect newlines instead of always appending -// otherwise sectioned prints get messed up. -#define MAXPRINTMSG 4096 -void Conbuf_AppendText( const char *pMsg ) -{ - char msg[MAXPRINTMSG] = {0}; - Q_strncpyz(msg, pMsg, sizeof(msg)); - Q_StripColor(msg); - printf("%s", msg); -} - -/* -================== -Sys_LowPhysicalMemory() -================== -*/ - -qboolean Sys_LowPhysicalMemory(void) { - static MEMORYSTATUSEX stat; - static qboolean bAsked = qfalse; - if (!bAsked) // just in case it takes a little time for GlobalMemoryStatusEx() to gather stats on - { // stuff we don't care about such as virtual mem etc. - bAsked = qtrue; - - stat.dwLength = sizeof (stat); - GlobalMemoryStatusEx (&stat); - } - return (stat.ullTotalPhys <= MEM_THRESHOLD) ? qtrue : qfalse; -} - -/* -=============== -PrintMatches - -=============== -*/ -static char g_consoleField1[256]; -static char g_consoleField2[256]; - -static void PrintMatches( const char *s ) { - if ( !Q_stricmpn( s, g_consoleField1, strlen( g_consoleField1 ) ) ) { - printf( " %s\n", s ); - } -} - //qboolean stdin_active = qtrue; -char *Sys_ConsoleInput(void) -{ - const char ClearLine[] = "\r \r"; - - static int len=0; - static bool bPendingExtended = false; - - if (!kbhit()) return NULL; - - if (len == 0) memset(g_consoleField1,0,sizeof(g_consoleField1)); - - g_consoleField1[len] = getch(); - - if (bPendingExtended) - { - switch (g_consoleField1[len]) - { - case 'H': //up - strcpy(g_consoleField1, g_consoleField2); - printf(ClearLine); - printf("%s",g_consoleField1); - len = strlen(g_consoleField1); - break; - - case 'K': //left - break; - - case 'M': //right - break; - - case 'P': //down - break; - } - g_consoleField1[len] = 0; //erase last key hit - bPendingExtended = false; - } - else - switch ((unsigned char) g_consoleField1[len]) - { - case 0x00: //fkey is next - case 0xe0: //extended = arrow keys - g_consoleField1[len] = 0; //erase last key hit - bPendingExtended = true; - break; - case 8: // backspace - printf("%c %c",g_consoleField1[len],g_consoleField1[len]); - g_consoleField1[len] = 0; - if (len > 0) len--; - g_consoleField1[len] = 0; - break; - case 9: //Tab - if (len) { - g_consoleField1[len] = 0; //erase last key hit - printf( "\n"); - // run through again, printing matches - Cmd_CommandCompletion( PrintMatches ); - Cvar_CommandCompletion( PrintMatches ); - printf( "\n%s", g_consoleField1); - } - break; - case 27: // esc - // clear the line - printf(ClearLine); - len = 0; - break; - case '\r': //enter - g_consoleField1[len] = 0; //erase last key hit - printf("\n"); - if (len) { - len = 0; - strcpy(g_consoleField2, g_consoleField1); - return g_consoleField1; - } - break; - case 'v' - 'a' + 1: // ctrl-v is paste - g_consoleField1[len] = 0; //erase last key hit - char *cbd; - cbd = Sys_GetClipboardData(); - if (cbd) { - strncpy (&g_consoleField1[len], cbd, sizeof(g_consoleField1) ); - printf("%s",cbd); - len += strlen(cbd); - Z_Free( cbd ); - if (len == sizeof(g_consoleField1)) - { - len = 0; - return g_consoleField1; - } - } - break; - default: - printf("%c",g_consoleField1[len]); - len++; - if (len == sizeof(g_consoleField1)) - { - len = 0; - return g_consoleField1; - } - break; - } - - return NULL; -} - -void Sys_ShowConsole( int visLevel, qboolean quitOnClose ) { -} - -/* -============= -Sys_Error - -Show the early console as an error dialog -============= -*/ -void QDECL Sys_Error( const char *error, ... ) { - va_list argptr; - char text[4096]; - MSG msg; - - va_start (argptr, error); - Q_vsnprintf(text, sizeof(text), error, argptr); - va_end (argptr); - - Conbuf_AppendText( text ); - Conbuf_AppendText( "\n" ); - -// Sys_SetErrorText( text ); - Sys_ShowConsole( 1, qtrue ); - - timeEndPeriod( 1 ); - - IN_Shutdown(); - - // wait for the user to quit - while ( 1 ) { - if (!GetMessage (&msg, NULL, 0, 0)) - Com_Quit_f (); - TranslateMessage (&msg); - DispatchMessage (&msg); - } - -// Sys_DestroyConsole(); - Com_ShutdownZoneMemory(); - Com_ShutdownHunkMemory(); - - exit (1); -} - -/* -============== -Sys_Quit -============== -*/ -void Sys_Quit( void ) { - timeEndPeriod( 1 ); - IN_Shutdown(); -// Sys_DestroyConsole(); - Com_ShutdownZoneMemory(); - Com_ShutdownHunkMemory(); - - exit (0); -} - -/* -============== -Sys_Print -============== -*/ -void Sys_Print( const char *msg ) { - // TTimo - prefix for text that shows up in console but not in notify - // backported from RTCW - if ( !Q_strncmp( msg, "[skipnotify]", 12 ) ) { - msg += 12; - } - if ( msg[0] == '*' ) { - msg += 1; - } - Conbuf_AppendText( msg ); -} - - -/* -============== -Sys_Mkdir -============== -*/ -qboolean Sys_Mkdir( const char *path ) { - if( !CreateDirectory( path, NULL ) ) - { - if( GetLastError( ) != ERROR_ALREADY_EXISTS ) - return qfalse; - } - return qtrue; -} - -/* -============== -Sys_Cwd -============== -*/ -char *Sys_Cwd( void ) { - static char cwd[MAX_OSPATH]; - - _getcwd( cwd, sizeof( cwd ) - 1 ); - cwd[MAX_OSPATH-1] = 0; - - return cwd; -} - -/* -============== -Sys_DefaultCDPath -============== -*/ -char *Sys_DefaultCDPath( void ) { - return ""; -} - -/* Resolves path names and determines if they are the same */ -/* For use with full OS paths not quake paths */ -/* Returns true if resulting paths are valid and the same, otherwise false */ -bool Sys_PathCmp( const char *path1, const char *path2 ) { - char *r1, *r2; - - r1 = _fullpath(NULL, path1, MAX_OSPATH); - r2 = _fullpath(NULL, path2, MAX_OSPATH); - - if(r1 && r2 && !Q_stricmp(r1, r2)) - { - free(r1); - free(r2); - return true; - } - - free(r1); - free(r2); - return false; -} - -/* -============================================================== - -DIRECTORY SCANNING - -============================================================== -*/ - -#define MAX_FOUND_FILES 0x1000 - -void Sys_ListFilteredFiles( const char *basedir, char *subdirs, char *filter, char **psList, int *numfiles ) { - char search[MAX_OSPATH], newsubdirs[MAX_OSPATH]; - char filename[MAX_OSPATH]; - intptr_t findhandle; - struct _finddata_t findinfo; - - if ( *numfiles >= MAX_FOUND_FILES - 1 ) { - return; - } - - if (strlen(subdirs)) { - Com_sprintf( search, sizeof(search), "%s\\%s\\*", basedir, subdirs ); - } - else { - Com_sprintf( search, sizeof(search), "%s\\*", basedir ); - } - - findhandle = _findfirst (search, &findinfo); - if (findhandle == -1) { - return; - } - - do { - if (findinfo.attrib & _A_SUBDIR) { - if (Q_stricmp(findinfo.name, ".") && Q_stricmp(findinfo.name, "..")) { - if (strlen(subdirs)) { - Com_sprintf( newsubdirs, sizeof(newsubdirs), "%s\\%s", subdirs, findinfo.name); - } - else { - Com_sprintf( newsubdirs, sizeof(newsubdirs), "%s", findinfo.name); - } - Sys_ListFilteredFiles( basedir, newsubdirs, filter, psList, numfiles ); - } - } - if ( *numfiles >= MAX_FOUND_FILES - 1 ) { - break; - } - Com_sprintf( filename, sizeof(filename), "%s\\%s", subdirs, findinfo.name ); - if (!Com_FilterPath( filter, filename, qfalse )) - continue; - psList[ *numfiles ] = CopyString( filename ); - (*numfiles)++; - } while ( _findnext (findhandle, &findinfo) != -1 ); - - _findclose (findhandle); -} - -static qboolean strgtr(const char *s0, const char *s1) { - int l0, l1, i; - - l0 = strlen(s0); - l1 = strlen(s1); - - if (l1 s0[i]) { - return qtrue; - } - if (s1[i] < s0[i]) { - return qfalse; - } - } - return qfalse; -} - -char **Sys_ListFiles( const char *directory, const char *extension, char *filter, int *numfiles, qboolean wantsubs ) { - char search[MAX_OSPATH]; - int nfiles; - char **listCopy; - char *list[MAX_FOUND_FILES]; - struct _finddata_t findinfo; - intptr_t findhandle; - int flag; - int i; - - if (filter) { - - nfiles = 0; - Sys_ListFilteredFiles( directory, "", filter, list, &nfiles ); - - list[ nfiles ] = 0; - *numfiles = nfiles; - - if (!nfiles) - return NULL; - - listCopy = (char **)Z_Malloc( ( nfiles + 1 ) * sizeof( *listCopy ), TAG_LISTFILES ); - for ( i = 0 ; i < nfiles ; i++ ) { - listCopy[i] = list[i]; - } - listCopy[i] = NULL; - - return listCopy; - } - - if ( !extension) { - extension = ""; - } - - // passing a slash as extension will find directories - if ( extension[0] == '/' && extension[1] == 0 ) { - extension = ""; - flag = 0; - } else { - flag = _A_SUBDIR; - } - - Com_sprintf( search, sizeof(search), "%s\\*%s", directory, extension ); - - // search - nfiles = 0; - - findhandle = _findfirst (search, &findinfo); - if (findhandle == -1) { - *numfiles = 0; - return NULL; - } - - do { - if ( (!wantsubs && flag ^ ( findinfo.attrib & _A_SUBDIR )) || (wantsubs && findinfo.attrib & _A_SUBDIR) ) { - if ( nfiles == MAX_FOUND_FILES - 1 ) { - break; - } - list[ nfiles ] = CopyString( findinfo.name ); - nfiles++; - } - } while ( _findnext (findhandle, &findinfo) != -1 ); - - list[ nfiles ] = 0; - - _findclose (findhandle); - - // return a copy of the list - *numfiles = nfiles; - - if ( !nfiles ) { - return NULL; - } - - listCopy = (char **)Z_Malloc( ( nfiles + 1 ) * sizeof( *listCopy ), TAG_LISTFILES ); - for ( i = 0 ; i < nfiles ; i++ ) { - listCopy[i] = list[i]; - } - listCopy[i] = NULL; - - do { - flag = 0; - for(i=1; iinteger ) - Com_Printf( "Sys_LoadLegacyGameDll: Failed to unpack %s from PK3.\n", filename ); - - return NULL; - } - - libHandle = LoadLibrary( filename ); - if ( !libHandle ) { - basepath = Cvar_VariableString( "fs_basepath" ); - homepath = Cvar_VariableString( "fs_homepath" ); - cdpath = Cvar_VariableString( "fs_cdpath" ); - gamedir = Cvar_VariableString( "fs_game" ); - - fn = FS_BuildOSPath( basepath, gamedir, filename ); - libHandle = LoadLibrary( fn ); - - if ( !libHandle ) { - if( homepath[0] ) { - fn = FS_BuildOSPath( homepath, gamedir, filename ); - libHandle = LoadLibrary( fn ); - } - if ( !libHandle ) { - if( cdpath[0] ) { - fn = FS_BuildOSPath( cdpath, gamedir, filename ); - libHandle = LoadLibrary( fn ); - } - if ( !libHandle ) { - return NULL; - } - } - } - } - - dllEntry = ( void (QDECL *)( intptr_t (QDECL *)( intptr_t, ... ) ) )GetProcAddress( libHandle, "dllEntry" ); - *vmMain = (intptr_t (QDECL *)(int,...))GetProcAddress( libHandle, "vmMain" ); - if ( !*vmMain || !dllEntry ) { - if ( com_developer->integer ) - Com_Printf( "Sys_LoadLegacyGameDll: Entry point not found in %s. Failed with system error code 0x%X.\n", filename, GetLastError() ); - - FreeLibrary( libHandle ); - return NULL; - } - dllEntry( systemcalls ); - - return libHandle; -} - -void *QDECL Sys_LoadGameDll( const char *name, void *(QDECL **moduleAPI)(int, ...) ) { - HINSTANCE libHandle; - char *basepath, *homepath, *cdpath, *gamedir; - char *fn; - char filename[MAX_QPATH]; - - Com_sprintf( filename, sizeof( filename ), "%s" ARCH_STRING DLL_EXT, name ); - - if (!Sys_UnpackDLL(filename)) - { - if ( com_developer->integer ) - Com_Printf( "Sys_LoadGameDll: Failed to unpack %s from PK3.\n", filename ); - - return NULL; - } - - libHandle = LoadLibrary( filename ); - if ( !libHandle ) { - basepath = Cvar_VariableString( "fs_basepath" ); - homepath = Cvar_VariableString( "fs_homepath" ); - cdpath = Cvar_VariableString( "fs_cdpath" ); - gamedir = Cvar_VariableString( "fs_game" ); - - fn = FS_BuildOSPath( basepath, gamedir, filename ); - libHandle = LoadLibrary( fn ); - - if ( !libHandle ) { - if( homepath[0] ) { - fn = FS_BuildOSPath( homepath, gamedir, filename ); - libHandle = LoadLibrary( fn ); - } - if ( !libHandle ) { - if( cdpath[0] ) { - fn = FS_BuildOSPath( cdpath, gamedir, filename ); - libHandle = LoadLibrary( fn ); - } - if ( !libHandle ) { - return NULL; - } - } - } - } - - *moduleAPI = (void *(QDECL *)(int,...))GetProcAddress( libHandle, "GetModuleAPI" ); - if ( !*moduleAPI ) { - if ( com_developer->integer ) - Com_Printf( "Sys_LoadGameDll: Entry point not found in %s. Failed with system error code 0x%X.\n", filename, GetLastError() ); - - FreeLibrary( libHandle ); - return NULL; - } - - return libHandle; -} - -/* -======================================================================== - -EVENT LOOP - -======================================================================== -*/ - -#define MAX_QUED_EVENTS 256 -#define MASK_QUED_EVENTS ( MAX_QUED_EVENTS - 1 ) - -sysEvent_t eventQue[MAX_QUED_EVENTS]; -static int eventHead=0; -static int eventTail=0; -byte sys_packetReceived[MAX_MSGLEN]; - -/* -================ -Sys_QueEvent - -A time of 0 will get the current time -Ptr should either be null, or point to a block of data that can -be freed by the game later. -================ -*/ -void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptrLength, void *ptr ) { - sysEvent_t *ev; - - ev = &eventQue[ eventHead & MASK_QUED_EVENTS ]; - if ( eventHead - eventTail >= MAX_QUED_EVENTS ) { - Com_Printf("Sys_QueEvent: overflow\n"); - // we are discarding an event, but don't leak memory - if ( ev->evPtr ) { - Z_Free( ev->evPtr ); - } - eventTail++; - } - - eventHead++; - - if ( time == 0 ) { - time = Sys_Milliseconds(); - } - - ev->evTime = time; - ev->evType = type; - ev->evValue = value; - ev->evValue2 = value2; - ev->evPtrLength = ptrLength; - ev->evPtr = ptr; -} - -/* -================ -Sys_GetEvent - -================ -*/ -sysEvent_t Sys_GetEvent( void ) { - MSG msg; - sysEvent_t ev; - char *s; - msg_t netmsg; - netadr_t adr; - - // return if we have data - if ( eventHead > eventTail ) { - eventTail++; - return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ]; - } - - // pump the message loop - while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) { - if ( !GetMessage (&msg, NULL, 0, 0) ) { - Com_Quit_f(); - } - - // save the msg time, because wndprocs don't have access to the timestamp -// g_wv.sysMsgTime = msg.time; - - TranslateMessage (&msg); - DispatchMessage (&msg); - } - - // check for console commands - s = Sys_ConsoleInput(); - if ( s ) { - char *b; - int len; - - len = strlen( s ) + 1; - b = (char *)Z_Malloc( len, TAG_EVENT ); - Q_strncpyz( b, s, len ); - Sys_QueEvent( 0, SE_CONSOLE, 0, 0, len, b ); - } - - // check for network packets - MSG_Init( &netmsg, sys_packetReceived, sizeof( sys_packetReceived ) ); - if ( Sys_GetPacket ( &adr, &netmsg ) ) { - netadr_t *buf; - int len; - - // copy out to a seperate buffer for qeueing - // the readcount stepahead is for SOCKS support - len = sizeof( netadr_t ) + netmsg.cursize - netmsg.readcount; - buf = (netadr_t *)Z_Malloc( len, TAG_EVENT, qtrue ); - *buf = adr; - memcpy( buf+1, &netmsg.data[netmsg.readcount], netmsg.cursize - netmsg.readcount ); - Sys_QueEvent( 0, SE_PACKET, 0, 0, len, buf ); - } - - // return if we have data - if ( eventHead > eventTail ) { - eventTail++; - return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ]; - } - - // create an empty event to return - - memset( &ev, 0, sizeof( ev ) ); - ev.evTime = timeGetTime(); - - return ev; -} - -//================================================================ - -/* -================= -Sys_In_Restart_f - -Restart the input subsystem -================= -*/ -void Sys_In_Restart_f( void ) { - IN_Shutdown(); - IN_Init(); -} - -/* -================ -Sys_Init - -Called after the common systems (cvars, files, etc) -are initialized -================ -*/ - -void Sys_Init( void ) { - // make sure the timer is high precision, otherwise - // NT gets 18ms resolution - timeBeginPeriod( 1 ); - - Cmd_AddCommand ("in_restart", Sys_In_Restart_f); - - Cvar_Set( "arch", OS_STRING " " ARCH_STRING ); - - Cvar_Set( "username", Sys_GetCurrentUser() ); - - IN_Init(); // FIXME: not in dedicated? -} - - -//======================================================================= -//int totalMsec, countMsec; - -#ifndef DEFAULT_BASEDIR -# define DEFAULT_BASEDIR Sys_BinaryPath() -#endif - -int main( int argc, char **argv ) -{ - int i; - char commandLine[ MAX_STRING_CHARS ] = { 0 }; - - // done before Com/Sys_Init since we need this for error output - //Sys_CreateConsole(); - - // no abort/retry/fail errors - SetErrorMode( SEM_FAILCRITICALERRORS ); - - // get the initial time base - Sys_Milliseconds(); - - Sys_SetBinaryPath( Sys_Dirname( argv[ 0 ] ) ); - Sys_SetDefaultInstallPath( DEFAULT_BASEDIR ); - - // Concatenate the command line for passing to Com_Init - for( i = 1; i < argc; i++ ) - { - const bool containsSpaces = (strchr(argv[i], ' ') != NULL); - if (containsSpaces) - Q_strcat( commandLine, sizeof( commandLine ), "\"" ); - - Q_strcat( commandLine, sizeof( commandLine ), argv[ i ] ); - - if (containsSpaces) - Q_strcat( commandLine, sizeof( commandLine ), "\"" ); - - Q_strcat( commandLine, sizeof( commandLine ), " " ); - } - - Com_Init( commandLine ); - - NET_Init(); - - // hide the early console since we've reached the point where we - // have a working graphics subsystems - if ( !com_dedicated->integer && !com_viewlog->integer ) { - Sys_ShowConsole( 0, qfalse ); - } - - // main game loop - while( 1 ) { - // if not running as a game client, sleep a bit -// if ( g_wv.isMinimized || ( com_dedicated && com_dedicated->integer ) ) { - Sleep( 5 ); -// } - - // make sure mouse and joystick are only called once a frame - IN_Frame(); - - // run the game - Com_Frame(); - } - - // never gets here - return 0; -} diff --git a/codemp/win32/win_shared.cpp b/codemp/win32/win_shared.cpp index da0ab43677..24c25d795c 100644 --- a/codemp/win32/win_shared.cpp +++ b/codemp/win32/win_shared.cpp @@ -12,265 +12,15 @@ #include #include "qcommon/qcommon.h" -// Used to determine where to store user-specific files -static char homePath[ MAX_OSPATH ] = { 0 }; + static char binaryPath[ MAX_OSPATH ] = { 0 }; static char installPath[ MAX_OSPATH ] = { 0 }; -/* -================= -Sys_SetBinaryPath -================= -*/ -void Sys_SetBinaryPath(const char *path) -{ - Q_strncpyz(binaryPath, path, sizeof(binaryPath)); -} - -/* -================= -Sys_BinaryPath -================= -*/ -char *Sys_BinaryPath(void) -{ - return binaryPath; -} - -/* -================= -Sys_SetDefaultInstallPath -================= -*/ -void Sys_SetDefaultInstallPath(const char *path) -{ - Q_strncpyz(installPath, path, sizeof(installPath)); -} - -/* -================= -Sys_DefaultInstallPath -================= -*/ -char *Sys_DefaultInstallPath(void) -{ - if (*installPath) - return installPath; - else - return Sys_Cwd(); -} - -/* -================= -Sys_DefaultAppPath -================= -*/ -char *Sys_DefaultAppPath(void) -{ - return Sys_BinaryPath(); -} - -/* -============== -Sys_Basename -============== -*/ -const char *Sys_Basename( char *path ) -{ - static char base[ MAX_OSPATH ] = { 0 }; - int length; - - length = strlen( path ) - 1; - - // Skip trailing slashes - while( length > 0 && path[ length ] == '\\' ) - length--; - - while( length > 0 && path[ length - 1 ] != '\\' ) - length--; - - Q_strncpyz( base, &path[ length ], sizeof( base ) ); - - length = strlen( base ) - 1; - - // Strip trailing slashes - while( length > 0 && base[ length ] == '\\' ) - base[ length-- ] = '\0'; - - return base; -} - -/* -============== -Sys_Dirname -============== -*/ -const char *Sys_Dirname( char *path ) -{ - static char dir[ MAX_OSPATH ] = { 0 }; - int length; - - Q_strncpyz( dir, path, sizeof( dir ) ); - length = strlen( dir ) - 1; - - while( length > 0 && dir[ length ] != '\\' ) - length--; - - dir[ length ] = '\0'; - - return dir; -} - -/* -================ -Sys_Milliseconds -================ -*/ -int Sys_Milliseconds (bool baseTime) -{ - static int sys_timeBase = timeGetTime(); - int sys_curtime; - - sys_curtime = timeGetTime(); - if(!baseTime) - { - sys_curtime -= sys_timeBase; - } - - return sys_curtime; -} - -int Sys_Milliseconds2( void ) -{ - static int sys_timeBase = timeGetTime(); - int sys_curtime; - - sys_curtime = timeGetTime(); - sys_curtime -= sys_timeBase; - - return sys_curtime; -} - -/* -================ -Sys_RandomBytes -================ -*/ -qboolean Sys_RandomBytes( byte *string, int len ) -{ - HCRYPTPROV prov; - - if( !CryptAcquireContext( &prov, NULL, NULL, - PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ) ) { - - return qfalse; - } - - if( !CryptGenRandom( prov, len, (BYTE *)string ) ) { - CryptReleaseContext( prov, 0 ); - return qfalse; - } - CryptReleaseContext( prov, 0 ); - return qtrue; -} - //============================================ -char *Sys_GetCurrentUser( void ) -{ - static char s_userName[1024]; - DWORD size = sizeof( s_userName ); - - if ( !GetUserName( s_userName, &size ) ) - strcpy( s_userName, "player" ); - - if ( !s_userName[0] ) - { - strcpy( s_userName, "player" ); - } - - return s_userName; -} - -char *Sys_DefaultHomePath(void) { -#ifdef _PORTABLE_VERSION - Com_Printf("Portable install requested, skipping homepath support\n"); - return NULL; -#else - typedef HRESULT (__stdcall * GETFOLDERPATH)(HWND, int, HANDLE, DWORD, LPSTR); - - TCHAR szPath[MAX_PATH]; - GETFOLDERPATH qSHGetFolderPath; - HMODULE shfolder = LoadLibrary("shfolder.dll"); - - if(shfolder == NULL) - { - Com_Printf("Unable to load SHFolder.dll\n"); - return NULL; - } - - if(!*homePath && com_homepath) - { - qSHGetFolderPath = (GETFOLDERPATH)GetProcAddress(shfolder, "SHGetFolderPathA"); - if(qSHGetFolderPath == NULL) - { - Com_Printf("Unable to find SHGetFolderPath in SHFolder.dll\n"); - FreeLibrary(shfolder); - return NULL; - } - - if( !SUCCEEDED( qSHGetFolderPath( NULL, CSIDL_PERSONAL, - NULL, 0, szPath ) ) ) - { - Com_Printf("Unable to detect CSIDL_PERSONAL\n"); - FreeLibrary(shfolder); - return NULL; - } - - Com_sprintf(homePath, sizeof(homePath), "%s%cMy Games%c", szPath, PATH_SEP, PATH_SEP); - - if(com_homepath->string[0]) - Q_strcat(homePath, sizeof(homePath), com_homepath->string); - else - Q_strcat(homePath, sizeof(homePath), HOMEPATH_NAME_WIN); - } - - FreeLibrary(shfolder); - return homePath; -#endif -} - -static const char *GetErrorString( DWORD error ) { - static char buf[MAX_STRING_CHARS]; - buf[0] = '\0'; - - if ( error ) { - LPVOID lpMsgBuf; - DWORD bufLen = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, error, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), (LPTSTR)&lpMsgBuf, 0, NULL ); - if ( bufLen ) { - LPCSTR lpMsgStr = (LPCSTR)lpMsgBuf; - Q_strncpyz( buf, lpMsgStr, min( (size_t)(lpMsgStr + bufLen), sizeof(buf) ) ); - LocalFree( lpMsgBuf ); - } - } - return buf; -} -void Sys_SetProcessorAffinity( void ) { - DWORD_PTR processMask, dummy; - HANDLE handle = GetCurrentProcess(); - if ( !GetProcessAffinityMask( handle, &dummy, &dummy ) ) - return; - if ( sscanf( com_affinity->string, "%X", &processMask ) != 1 ) - processMask = 1; // set to first core only - if ( !processMask ) - return; - if ( !SetProcessAffinityMask( handle, processMask ) ) - Com_DPrintf( "Setting affinity mask failed (%s)\n", GetErrorString( GetLastError() ) ); -} diff --git a/lib/SDL2/include/SDL.h b/lib/SDL2/include/SDL.h new file mode 100644 index 0000000000..a9077095fe --- /dev/null +++ b/lib/SDL2/include/SDL.h @@ -0,0 +1,163 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL.h + * + * Main include header for the SDL library + */ + +/** + * \mainpage Simple DirectMedia Layer (SDL) + * + * http://www.libsdl.org/ + * + * \section intro_sec Introduction + * + * Simple DirectMedia Layer is a cross-platform development library designed + * to provide low level access to audio, keyboard, mouse, joystick, and + * graphics hardware via OpenGL and Direct3D. It is used by video playback + * software, emulators, and popular games including Valve's award winning + * catalog and many Humble Bundle games. + * + * SDL officially supports Windows, Mac OS X, Linux, iOS, and Android. + * Support for other platforms may be found in the source code. + * + * SDL is written in C, works natively with C++, and there are bindings + * available for several other languages, including C# and Python. + * + * This library is distributed under the zlib license, which can be found + * in the file "COPYING.txt". + * + * The best way to learn how to use SDL is to check out the header files in + * the "include" subdirectory and the programs in the "test" subdirectory. + * The header files and test programs are well commented and always up to date. + * More documentation and FAQs are available online at: + * http://wiki.libsdl.org/ + * + * If you need help with the library, or just want to discuss SDL related + * issues, you can join the developers mailing list: + * http://www.libsdl.org/mailing-list.php + * + * Enjoy! + * Sam Lantinga (slouken@libsdl.org) + */ + +#ifndef _SDL_H +#define _SDL_H + +#include "SDL_main.h" +#include "SDL_stdinc.h" +#include "SDL_assert.h" +#include "SDL_atomic.h" +#include "SDL_audio.h" +#include "SDL_clipboard.h" +#include "SDL_cpuinfo.h" +#include "SDL_endian.h" +#include "SDL_error.h" +#include "SDL_events.h" +#include "SDL_filesystem.h" +#include "SDL_joystick.h" +#include "SDL_gamecontroller.h" +#include "SDL_haptic.h" +#include "SDL_hints.h" +#include "SDL_loadso.h" +#include "SDL_log.h" +#include "SDL_messagebox.h" +#include "SDL_mutex.h" +#include "SDL_power.h" +#include "SDL_render.h" +#include "SDL_rwops.h" +#include "SDL_system.h" +#include "SDL_thread.h" +#include "SDL_timer.h" +#include "SDL_version.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* As of version 0.5, SDL is loaded dynamically into the application */ + +/** + * \name SDL_INIT_* + * + * These are the flags which may be passed to SDL_Init(). You should + * specify the subsystems which you will be using in your application. + */ +/* @{ */ +#define SDL_INIT_TIMER 0x00000001 +#define SDL_INIT_AUDIO 0x00000010 +#define SDL_INIT_VIDEO 0x00000020 /**< SDL_INIT_VIDEO implies SDL_INIT_EVENTS */ +#define SDL_INIT_JOYSTICK 0x00000200 /**< SDL_INIT_JOYSTICK implies SDL_INIT_EVENTS */ +#define SDL_INIT_HAPTIC 0x00001000 +#define SDL_INIT_GAMECONTROLLER 0x00002000 /**< SDL_INIT_GAMECONTROLLER implies SDL_INIT_JOYSTICK */ +#define SDL_INIT_EVENTS 0x00004000 +#define SDL_INIT_NOPARACHUTE 0x00100000 /**< Don't catch fatal signals */ +#define SDL_INIT_EVERYTHING ( \ + SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_EVENTS | \ + SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC | SDL_INIT_GAMECONTROLLER \ + ) +/* @} */ + +/** + * This function initializes the subsystems specified by \c flags + * Unless the ::SDL_INIT_NOPARACHUTE flag is set, it will install cleanup + * signal handlers for some commonly ignored fatal signals (like SIGSEGV). + */ +extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags); + +/** + * This function initializes specific SDL subsystems + */ +extern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags); + +/** + * This function cleans up specific SDL subsystems + */ +extern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags); + +/** + * This function returns a mask of the specified subsystems which have + * previously been initialized. + * + * If \c flags is 0, it returns a mask of all initialized subsystems. + */ +extern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags); + +/** + * This function cleans up all initialized subsystems. You should + * call it upon all exit conditions. + */ +extern DECLSPEC void SDLCALL SDL_Quit(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_H */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_assert.h b/lib/SDL2/include/SDL_assert.h new file mode 100644 index 0000000000..42348f7d13 --- /dev/null +++ b/lib/SDL2/include/SDL_assert.h @@ -0,0 +1,284 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_assert_h +#define _SDL_assert_h + +#include "SDL_config.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef SDL_ASSERT_LEVEL +#ifdef SDL_DEFAULT_ASSERT_LEVEL +#define SDL_ASSERT_LEVEL SDL_DEFAULT_ASSERT_LEVEL +#elif defined(_DEBUG) || defined(DEBUG) || \ + (defined(__GNUC__) && !defined(__OPTIMIZE__)) +#define SDL_ASSERT_LEVEL 2 +#else +#define SDL_ASSERT_LEVEL 1 +#endif +#endif /* SDL_ASSERT_LEVEL */ + +/* +These are macros and not first class functions so that the debugger breaks +on the assertion line and not in some random guts of SDL, and so each +assert can have unique static variables associated with it. +*/ + +#if defined(_MSC_VER) +/* Don't include intrin.h here because it contains C++ code */ + extern void __cdecl __debugbreak(void); + #define SDL_TriggerBreakpoint() __debugbreak() +#elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))) + #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" ) +#elif defined(HAVE_SIGNAL_H) + #include + #define SDL_TriggerBreakpoint() raise(SIGTRAP) +#else + /* How do we trigger breakpoints on this platform? */ + #define SDL_TriggerBreakpoint() +#endif + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 supports __func__ as a standard. */ +# define SDL_FUNCTION __func__ +#elif ((__GNUC__ >= 2) || defined(_MSC_VER)) +# define SDL_FUNCTION __FUNCTION__ +#else +# define SDL_FUNCTION "???" +#endif +#define SDL_FILE __FILE__ +#define SDL_LINE __LINE__ + +/* +sizeof (x) makes the compiler still parse the expression even without +assertions enabled, so the code is always checked at compile time, but +doesn't actually generate code for it, so there are no side effects or +expensive checks at run time, just the constant size of what x WOULD be, +which presumably gets optimized out as unused. +This also solves the problem of... + + int somevalue = blah(); + SDL_assert(somevalue == 1); + +...which would cause compiles to complain that somevalue is unused if we +disable assertions. +*/ + +#ifdef _MSC_VER /* stupid /W4 warnings. */ +#define SDL_NULL_WHILE_LOOP_CONDITION (-1 == __LINE__) +#else +#define SDL_NULL_WHILE_LOOP_CONDITION (0) +#endif + +#define SDL_disabled_assert(condition) \ + do { (void) sizeof ((condition)); } while (SDL_NULL_WHILE_LOOP_CONDITION) + +typedef enum +{ + SDL_ASSERTION_RETRY, /**< Retry the assert immediately. */ + SDL_ASSERTION_BREAK, /**< Make the debugger trigger a breakpoint. */ + SDL_ASSERTION_ABORT, /**< Terminate the program. */ + SDL_ASSERTION_IGNORE, /**< Ignore the assert. */ + SDL_ASSERTION_ALWAYS_IGNORE /**< Ignore the assert from now on. */ +} SDL_assert_state; + +typedef struct SDL_assert_data +{ + int always_ignore; + unsigned int trigger_count; + const char *condition; + const char *filename; + int linenum; + const char *function; + const struct SDL_assert_data *next; +} SDL_assert_data; + +#if (SDL_ASSERT_LEVEL > 0) + +/* Never call this directly. Use the SDL_assert* macros. */ +extern DECLSPEC SDL_assert_state SDLCALL SDL_ReportAssertion(SDL_assert_data *, + const char *, + const char *, int) +#if defined(__clang__) +#if __has_feature(attribute_analyzer_noreturn) +/* this tells Clang's static analysis that we're a custom assert function, + and that the analyzer should assume the condition was always true past this + SDL_assert test. */ + __attribute__((analyzer_noreturn)) +#endif +#endif +; + +/* the do {} while(0) avoids dangling else problems: + if (x) SDL_assert(y); else blah(); + ... without the do/while, the "else" could attach to this macro's "if". + We try to handle just the minimum we need here in a macro...the loop, + the static vars, and break points. The heavy lifting is handled in + SDL_ReportAssertion(), in SDL_assert.c. +*/ +#define SDL_enabled_assert(condition) \ + do { \ + while ( !(condition) ) { \ + static struct SDL_assert_data assert_data = { \ + 0, 0, #condition, 0, 0, 0, 0 \ + }; \ + const SDL_assert_state state = SDL_ReportAssertion(&assert_data, \ + SDL_FUNCTION, \ + SDL_FILE, \ + SDL_LINE); \ + if (state == SDL_ASSERTION_RETRY) { \ + continue; /* go again. */ \ + } else if (state == SDL_ASSERTION_BREAK) { \ + SDL_TriggerBreakpoint(); \ + } \ + break; /* not retrying. */ \ + } \ + } while (SDL_NULL_WHILE_LOOP_CONDITION) + +#endif /* enabled assertions support code */ + +/* Enable various levels of assertions. */ +#if SDL_ASSERT_LEVEL == 0 /* assertions disabled */ +# define SDL_assert(condition) SDL_disabled_assert(condition) +# define SDL_assert_release(condition) SDL_disabled_assert(condition) +# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition) +#elif SDL_ASSERT_LEVEL == 1 /* release settings. */ +# define SDL_assert(condition) SDL_disabled_assert(condition) +# define SDL_assert_release(condition) SDL_enabled_assert(condition) +# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition) +#elif SDL_ASSERT_LEVEL == 2 /* normal settings. */ +# define SDL_assert(condition) SDL_enabled_assert(condition) +# define SDL_assert_release(condition) SDL_enabled_assert(condition) +# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition) +#elif SDL_ASSERT_LEVEL == 3 /* paranoid settings. */ +# define SDL_assert(condition) SDL_enabled_assert(condition) +# define SDL_assert_release(condition) SDL_enabled_assert(condition) +# define SDL_assert_paranoid(condition) SDL_enabled_assert(condition) +#else +# error Unknown assertion level. +#endif + +/* this assertion is never disabled at any level. */ +#define SDL_assert_always(condition) SDL_enabled_assert(condition) + + +typedef SDL_assert_state (SDLCALL *SDL_AssertionHandler)( + const SDL_assert_data* data, void* userdata); + +/** + * \brief Set an application-defined assertion handler. + * + * This allows an app to show its own assertion UI and/or force the + * response to an assertion failure. If the app doesn't provide this, SDL + * will try to do the right thing, popping up a system-specific GUI dialog, + * and probably minimizing any fullscreen windows. + * + * This callback may fire from any thread, but it runs wrapped in a mutex, so + * it will only fire from one thread at a time. + * + * Setting the callback to NULL restores SDL's original internal handler. + * + * This callback is NOT reset to SDL's internal handler upon SDL_Quit()! + * + * \return SDL_assert_state value of how to handle the assertion failure. + * + * \param handler Callback function, called when an assertion fails. + * \param userdata A pointer passed to the callback as-is. + */ +extern DECLSPEC void SDLCALL SDL_SetAssertionHandler( + SDL_AssertionHandler handler, + void *userdata); + +/** + * \brief Get the default assertion handler. + * + * This returns the function pointer that is called by default when an + * assertion is triggered. This is an internal function provided by SDL, + * that is used for assertions when SDL_SetAssertionHandler() hasn't been + * used to provide a different function. + * + * \return The default SDL_AssertionHandler that is called when an assert triggers. + */ +extern DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetDefaultAssertionHandler(void); + +/** + * \brief Get the current assertion handler. + * + * This returns the function pointer that is called when an assertion is + * triggered. This is either the value last passed to + * SDL_SetAssertionHandler(), or if no application-specified function is + * set, is equivalent to calling SDL_GetDefaultAssertionHandler(). + * + * \param puserdata Pointer to a void*, which will store the "userdata" + * pointer that was passed to SDL_SetAssertionHandler(). + * This value will always be NULL for the default handler. + * If you don't care about this data, it is safe to pass + * a NULL pointer to this function to ignore it. + * \return The SDL_AssertionHandler that is called when an assert triggers. + */ +extern DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetAssertionHandler(void **puserdata); + +/** + * \brief Get a list of all assertion failures. + * + * Get all assertions triggered since last call to SDL_ResetAssertionReport(), + * or the start of the program. + * + * The proper way to examine this data looks something like this: + * + * + * const SDL_assert_data *item = SDL_GetAssertionReport(); + * while (item) { + * printf("'%s', %s (%s:%d), triggered %u times, always ignore: %s.\n", + * item->condition, item->function, item->filename, + * item->linenum, item->trigger_count, + * item->always_ignore ? "yes" : "no"); + * item = item->next; + * } + * + * + * \return List of all assertions. + * \sa SDL_ResetAssertionReport + */ +extern DECLSPEC const SDL_assert_data * SDLCALL SDL_GetAssertionReport(void); + +/** + * \brief Reset the list of all assertion failures. + * + * Reset list of all assertions triggered. + * + * \sa SDL_GetAssertionReport + */ +extern DECLSPEC void SDLCALL SDL_ResetAssertionReport(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_assert_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_atomic.h b/lib/SDL2/include/SDL_atomic.h new file mode 100644 index 0000000000..bb3a9b657d --- /dev/null +++ b/lib/SDL2/include/SDL_atomic.h @@ -0,0 +1,260 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_atomic.h + * + * Atomic operations. + * + * IMPORTANT: + * If you are not an expert in concurrent lockless programming, you should + * only be using the atomic lock and reference counting functions in this + * file. In all other cases you should be protecting your data structures + * with full mutexes. + * + * The list of "safe" functions to use are: + * SDL_AtomicLock() + * SDL_AtomicUnlock() + * SDL_AtomicIncRef() + * SDL_AtomicDecRef() + * + * Seriously, here be dragons! + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * + * You can find out a little more about lockless programming and the + * subtle issues that can arise here: + * http://msdn.microsoft.com/en-us/library/ee418650%28v=vs.85%29.aspx + * + * There's also lots of good information here: + * http://www.1024cores.net/home/lock-free-algorithms + * http://preshing.com/ + * + * These operations may or may not actually be implemented using + * processor specific atomic operations. When possible they are + * implemented as true processor specific atomic operations. When that + * is not possible the are implemented using locks that *do* use the + * available atomic operations. + * + * All of the atomic operations that modify memory are full memory barriers. + */ + +#ifndef _SDL_atomic_h_ +#define _SDL_atomic_h_ + +#include "SDL_stdinc.h" +#include "SDL_platform.h" + +#include "begin_code.h" + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \name SDL AtomicLock + * + * The atomic locks are efficient spinlocks using CPU instructions, + * but are vulnerable to starvation and can spin forever if a thread + * holding a lock has been terminated. For this reason you should + * minimize the code executed inside an atomic lock and never do + * expensive things like API or system calls while holding them. + * + * The atomic locks are not safe to lock recursively. + * + * Porting Note: + * The spin lock functions and type are required and can not be + * emulated because they are used in the atomic emulation code. + */ +/* @{ */ + +typedef int SDL_SpinLock; + +/** + * \brief Try to lock a spin lock by setting it to a non-zero value. + * + * \param lock Points to the lock. + * + * \return SDL_TRUE if the lock succeeded, SDL_FALSE if the lock is already held. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_AtomicTryLock(SDL_SpinLock *lock); + +/** + * \brief Lock a spin lock by setting it to a non-zero value. + * + * \param lock Points to the lock. + */ +extern DECLSPEC void SDLCALL SDL_AtomicLock(SDL_SpinLock *lock); + +/** + * \brief Unlock a spin lock by setting it to 0. Always returns immediately + * + * \param lock Points to the lock. + */ +extern DECLSPEC void SDLCALL SDL_AtomicUnlock(SDL_SpinLock *lock); + +/* @} *//* SDL AtomicLock */ + + +/** + * The compiler barrier prevents the compiler from reordering + * reads and writes to globally visible variables across the call. + */ +#if defined(_MSC_VER) && (_MSC_VER > 1200) +void _ReadWriteBarrier(void); +#pragma intrinsic(_ReadWriteBarrier) +#define SDL_CompilerBarrier() _ReadWriteBarrier() +#elif defined(__GNUC__) +#define SDL_CompilerBarrier() __asm__ __volatile__ ("" : : : "memory") +#else +#define SDL_CompilerBarrier() \ +{ SDL_SpinLock _tmp = 0; SDL_AtomicLock(&_tmp); SDL_AtomicUnlock(&_tmp); } +#endif + +/** + * Memory barriers are designed to prevent reads and writes from being + * reordered by the compiler and being seen out of order on multi-core CPUs. + * + * A typical pattern would be for thread A to write some data and a flag, + * and for thread B to read the flag and get the data. In this case you + * would insert a release barrier between writing the data and the flag, + * guaranteeing that the data write completes no later than the flag is + * written, and you would insert an acquire barrier between reading the + * flag and reading the data, to ensure that all the reads associated + * with the flag have completed. + * + * In this pattern you should always see a release barrier paired with + * an acquire barrier and you should gate the data reads/writes with a + * single flag variable. + * + * For more information on these semantics, take a look at the blog post: + * http://preshing.com/20120913/acquire-and-release-semantics + */ +#if defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("lwsync" : : : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("lwsync" : : : "memory") +#elif defined(__GNUC__) && defined(__arm__) +#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory") +#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) +#ifdef __thumb__ +/* The mcr instruction isn't available in thumb mode, use real functions */ +extern DECLSPEC void SDLCALL SDL_MemoryBarrierRelease(); +extern DECLSPEC void SDLCALL SDL_MemoryBarrierAcquire(); +#else +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory") +#endif /* __thumb__ */ +#else +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("" : : : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("" : : : "memory") +#endif /* __GNUC__ && __arm__ */ +#else +/* This is correct for the x86 and x64 CPUs, and we'll expand this over time. */ +#define SDL_MemoryBarrierRelease() SDL_CompilerBarrier() +#define SDL_MemoryBarrierAcquire() SDL_CompilerBarrier() +#endif + +/** + * \brief A type representing an atomic integer value. It is a struct + * so people don't accidentally use numeric operations on it. + */ +typedef struct { int value; } SDL_atomic_t; + +/** + * \brief Set an atomic variable to a new value if it is currently an old value. + * + * \return SDL_TRUE if the atomic variable was set, SDL_FALSE otherwise. + * + * \note If you don't know what this function is for, you shouldn't use it! +*/ +extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCAS(SDL_atomic_t *a, int oldval, int newval); + +/** + * \brief Set an atomic variable to a value. + * + * \return The previous value of the atomic variable. + */ +extern DECLSPEC int SDLCALL SDL_AtomicSet(SDL_atomic_t *a, int v); + +/** + * \brief Get the value of an atomic variable + */ +extern DECLSPEC int SDLCALL SDL_AtomicGet(SDL_atomic_t *a); + +/** + * \brief Add to an atomic variable. + * + * \return The previous value of the atomic variable. + * + * \note This same style can be used for any number operation + */ +extern DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_atomic_t *a, int v); + +/** + * \brief Increment an atomic variable used as a reference count. + */ +#ifndef SDL_AtomicIncRef +#define SDL_AtomicIncRef(a) SDL_AtomicAdd(a, 1) +#endif + +/** + * \brief Decrement an atomic variable used as a reference count. + * + * \return SDL_TRUE if the variable reached zero after decrementing, + * SDL_FALSE otherwise + */ +#ifndef SDL_AtomicDecRef +#define SDL_AtomicDecRef(a) (SDL_AtomicAdd(a, -1) == 1) +#endif + +/** + * \brief Set a pointer to a new value if it is currently an old value. + * + * \return SDL_TRUE if the pointer was set, SDL_FALSE otherwise. + * + * \note If you don't know what this function is for, you shouldn't use it! +*/ +extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCASPtr(void **a, void *oldval, void *newval); + +/** + * \brief Set a pointer to a value atomically. + * + * \return The previous value of the pointer. + */ +extern DECLSPEC void* SDLCALL SDL_AtomicSetPtr(void **a, void* v); + +/** + * \brief Get the value of a pointer atomically. + */ +extern DECLSPEC void* SDLCALL SDL_AtomicGetPtr(void **a); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif + +#include "close_code.h" + +#endif /* _SDL_atomic_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_audio.h b/lib/SDL2/include/SDL_audio.h new file mode 100644 index 0000000000..4c987d5110 --- /dev/null +++ b/lib/SDL2/include/SDL_audio.h @@ -0,0 +1,506 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_audio.h + * + * Access to the raw audio mixing buffer for the SDL library. + */ + +#ifndef _SDL_audio_h +#define _SDL_audio_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_endian.h" +#include "SDL_mutex.h" +#include "SDL_thread.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Audio format flags. + * + * These are what the 16 bits in SDL_AudioFormat currently mean... + * (Unspecified bits are always zero). + * + * \verbatim + ++-----------------------sample is signed if set + || + || ++-----------sample is bigendian if set + || || + || || ++---sample is float if set + || || || + || || || +---sample bit size---+ + || || || | | + 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 + \endverbatim + * + * There are macros in SDL 2.0 and later to query these bits. + */ +typedef Uint16 SDL_AudioFormat; + +/** + * \name Audio flags + */ +/* @{ */ + +#define SDL_AUDIO_MASK_BITSIZE (0xFF) +#define SDL_AUDIO_MASK_DATATYPE (1<<8) +#define SDL_AUDIO_MASK_ENDIAN (1<<12) +#define SDL_AUDIO_MASK_SIGNED (1<<15) +#define SDL_AUDIO_BITSIZE(x) (x & SDL_AUDIO_MASK_BITSIZE) +#define SDL_AUDIO_ISFLOAT(x) (x & SDL_AUDIO_MASK_DATATYPE) +#define SDL_AUDIO_ISBIGENDIAN(x) (x & SDL_AUDIO_MASK_ENDIAN) +#define SDL_AUDIO_ISSIGNED(x) (x & SDL_AUDIO_MASK_SIGNED) +#define SDL_AUDIO_ISINT(x) (!SDL_AUDIO_ISFLOAT(x)) +#define SDL_AUDIO_ISLITTLEENDIAN(x) (!SDL_AUDIO_ISBIGENDIAN(x)) +#define SDL_AUDIO_ISUNSIGNED(x) (!SDL_AUDIO_ISSIGNED(x)) + +/** + * \name Audio format flags + * + * Defaults to LSB byte order. + */ +/* @{ */ +#define AUDIO_U8 0x0008 /**< Unsigned 8-bit samples */ +#define AUDIO_S8 0x8008 /**< Signed 8-bit samples */ +#define AUDIO_U16LSB 0x0010 /**< Unsigned 16-bit samples */ +#define AUDIO_S16LSB 0x8010 /**< Signed 16-bit samples */ +#define AUDIO_U16MSB 0x1010 /**< As above, but big-endian byte order */ +#define AUDIO_S16MSB 0x9010 /**< As above, but big-endian byte order */ +#define AUDIO_U16 AUDIO_U16LSB +#define AUDIO_S16 AUDIO_S16LSB +/* @} */ + +/** + * \name int32 support + */ +/* @{ */ +#define AUDIO_S32LSB 0x8020 /**< 32-bit integer samples */ +#define AUDIO_S32MSB 0x9020 /**< As above, but big-endian byte order */ +#define AUDIO_S32 AUDIO_S32LSB +/* @} */ + +/** + * \name float32 support + */ +/* @{ */ +#define AUDIO_F32LSB 0x8120 /**< 32-bit floating point samples */ +#define AUDIO_F32MSB 0x9120 /**< As above, but big-endian byte order */ +#define AUDIO_F32 AUDIO_F32LSB +/* @} */ + +/** + * \name Native audio byte ordering + */ +/* @{ */ +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define AUDIO_U16SYS AUDIO_U16LSB +#define AUDIO_S16SYS AUDIO_S16LSB +#define AUDIO_S32SYS AUDIO_S32LSB +#define AUDIO_F32SYS AUDIO_F32LSB +#else +#define AUDIO_U16SYS AUDIO_U16MSB +#define AUDIO_S16SYS AUDIO_S16MSB +#define AUDIO_S32SYS AUDIO_S32MSB +#define AUDIO_F32SYS AUDIO_F32MSB +#endif +/* @} */ + +/** + * \name Allow change flags + * + * Which audio format changes are allowed when opening a device. + */ +/* @{ */ +#define SDL_AUDIO_ALLOW_FREQUENCY_CHANGE 0x00000001 +#define SDL_AUDIO_ALLOW_FORMAT_CHANGE 0x00000002 +#define SDL_AUDIO_ALLOW_CHANNELS_CHANGE 0x00000004 +#define SDL_AUDIO_ALLOW_ANY_CHANGE (SDL_AUDIO_ALLOW_FREQUENCY_CHANGE|SDL_AUDIO_ALLOW_FORMAT_CHANGE|SDL_AUDIO_ALLOW_CHANNELS_CHANGE) +/* @} */ + +/* @} *//* Audio flags */ + +/** + * This function is called when the audio device needs more data. + * + * \param userdata An application-specific parameter saved in + * the SDL_AudioSpec structure + * \param stream A pointer to the audio data buffer. + * \param len The length of that buffer in bytes. + * + * Once the callback returns, the buffer will no longer be valid. + * Stereo samples are stored in a LRLRLR ordering. + */ +typedef void (SDLCALL * SDL_AudioCallback) (void *userdata, Uint8 * stream, + int len); + +/** + * The calculated values in this structure are calculated by SDL_OpenAudio(). + */ +typedef struct SDL_AudioSpec +{ + int freq; /**< DSP frequency -- samples per second */ + SDL_AudioFormat format; /**< Audio data format */ + Uint8 channels; /**< Number of channels: 1 mono, 2 stereo */ + Uint8 silence; /**< Audio buffer silence value (calculated) */ + Uint16 samples; /**< Audio buffer size in samples (power of 2) */ + Uint16 padding; /**< Necessary for some compile environments */ + Uint32 size; /**< Audio buffer size in bytes (calculated) */ + SDL_AudioCallback callback; + void *userdata; +} SDL_AudioSpec; + + +struct SDL_AudioCVT; +typedef void (SDLCALL * SDL_AudioFilter) (struct SDL_AudioCVT * cvt, + SDL_AudioFormat format); + +/** + * A structure to hold a set of audio conversion filters and buffers. + */ +#ifdef __GNUC__ +/* This structure is 84 bytes on 32-bit architectures, make sure GCC doesn't + pad it out to 88 bytes to guarantee ABI compatibility between compilers. + vvv + The next time we rev the ABI, make sure to size the ints and add padding. +*/ +#define SDL_AUDIOCVT_PACKED __attribute__((packed)) +#else +#define SDL_AUDIOCVT_PACKED +#endif +/* */ +typedef struct SDL_AudioCVT +{ + int needed; /**< Set to 1 if conversion possible */ + SDL_AudioFormat src_format; /**< Source audio format */ + SDL_AudioFormat dst_format; /**< Target audio format */ + double rate_incr; /**< Rate conversion increment */ + Uint8 *buf; /**< Buffer to hold entire audio data */ + int len; /**< Length of original audio buffer */ + int len_cvt; /**< Length of converted audio buffer */ + int len_mult; /**< buffer must be len*len_mult big */ + double len_ratio; /**< Given len, final size is len*len_ratio */ + SDL_AudioFilter filters[10]; /**< Filter list */ + int filter_index; /**< Current audio conversion function */ +} SDL_AUDIOCVT_PACKED SDL_AudioCVT; + + +/* Function prototypes */ + +/** + * \name Driver discovery functions + * + * These functions return the list of built in audio drivers, in the + * order that they are normally initialized by default. + */ +/* @{ */ +extern DECLSPEC int SDLCALL SDL_GetNumAudioDrivers(void); +extern DECLSPEC const char *SDLCALL SDL_GetAudioDriver(int index); +/* @} */ + +/** + * \name Initialization and cleanup + * + * \internal These functions are used internally, and should not be used unless + * you have a specific need to specify the audio driver you want to + * use. You should normally use SDL_Init() or SDL_InitSubSystem(). + */ +/* @{ */ +extern DECLSPEC int SDLCALL SDL_AudioInit(const char *driver_name); +extern DECLSPEC void SDLCALL SDL_AudioQuit(void); +/* @} */ + +/** + * This function returns the name of the current audio driver, or NULL + * if no driver has been initialized. + */ +extern DECLSPEC const char *SDLCALL SDL_GetCurrentAudioDriver(void); + +/** + * This function opens the audio device with the desired parameters, and + * returns 0 if successful, placing the actual hardware parameters in the + * structure pointed to by \c obtained. If \c obtained is NULL, the audio + * data passed to the callback function will be guaranteed to be in the + * requested format, and will be automatically converted to the hardware + * audio format if necessary. This function returns -1 if it failed + * to open the audio device, or couldn't set up the audio thread. + * + * When filling in the desired audio spec structure, + * - \c desired->freq should be the desired audio frequency in samples-per- + * second. + * - \c desired->format should be the desired audio format. + * - \c desired->samples is the desired size of the audio buffer, in + * samples. This number should be a power of two, and may be adjusted by + * the audio driver to a value more suitable for the hardware. Good values + * seem to range between 512 and 8096 inclusive, depending on the + * application and CPU speed. Smaller values yield faster response time, + * but can lead to underflow if the application is doing heavy processing + * and cannot fill the audio buffer in time. A stereo sample consists of + * both right and left channels in LR ordering. + * Note that the number of samples is directly related to time by the + * following formula: \code ms = (samples*1000)/freq \endcode + * - \c desired->size is the size in bytes of the audio buffer, and is + * calculated by SDL_OpenAudio(). + * - \c desired->silence is the value used to set the buffer to silence, + * and is calculated by SDL_OpenAudio(). + * - \c desired->callback should be set to a function that will be called + * when the audio device is ready for more data. It is passed a pointer + * to the audio buffer, and the length in bytes of the audio buffer. + * This function usually runs in a separate thread, and so you should + * protect data structures that it accesses by calling SDL_LockAudio() + * and SDL_UnlockAudio() in your code. + * - \c desired->userdata is passed as the first parameter to your callback + * function. + * + * The audio device starts out playing silence when it's opened, and should + * be enabled for playing by calling \c SDL_PauseAudio(0) when you are ready + * for your audio callback function to be called. Since the audio driver + * may modify the requested size of the audio buffer, you should allocate + * any local mixing buffers after you open the audio device. + */ +extern DECLSPEC int SDLCALL SDL_OpenAudio(SDL_AudioSpec * desired, + SDL_AudioSpec * obtained); + +/** + * SDL Audio Device IDs. + * + * A successful call to SDL_OpenAudio() is always device id 1, and legacy + * SDL audio APIs assume you want this device ID. SDL_OpenAudioDevice() calls + * always returns devices >= 2 on success. The legacy calls are good both + * for backwards compatibility and when you don't care about multiple, + * specific, or capture devices. + */ +typedef Uint32 SDL_AudioDeviceID; + +/** + * Get the number of available devices exposed by the current driver. + * Only valid after a successfully initializing the audio subsystem. + * Returns -1 if an explicit list of devices can't be determined; this is + * not an error. For example, if SDL is set up to talk to a remote audio + * server, it can't list every one available on the Internet, but it will + * still allow a specific host to be specified to SDL_OpenAudioDevice(). + * + * In many common cases, when this function returns a value <= 0, it can still + * successfully open the default device (NULL for first argument of + * SDL_OpenAudioDevice()). + */ +extern DECLSPEC int SDLCALL SDL_GetNumAudioDevices(int iscapture); + +/** + * Get the human-readable name of a specific audio device. + * Must be a value between 0 and (number of audio devices-1). + * Only valid after a successfully initializing the audio subsystem. + * The values returned by this function reflect the latest call to + * SDL_GetNumAudioDevices(); recall that function to redetect available + * hardware. + * + * The string returned by this function is UTF-8 encoded, read-only, and + * managed internally. You are not to free it. If you need to keep the + * string for any length of time, you should make your own copy of it, as it + * will be invalid next time any of several other SDL functions is called. + */ +extern DECLSPEC const char *SDLCALL SDL_GetAudioDeviceName(int index, + int iscapture); + + +/** + * Open a specific audio device. Passing in a device name of NULL requests + * the most reasonable default (and is equivalent to calling SDL_OpenAudio()). + * + * The device name is a UTF-8 string reported by SDL_GetAudioDeviceName(), but + * some drivers allow arbitrary and driver-specific strings, such as a + * hostname/IP address for a remote audio server, or a filename in the + * diskaudio driver. + * + * \return 0 on error, a valid device ID that is >= 2 on success. + * + * SDL_OpenAudio(), unlike this function, always acts on device ID 1. + */ +extern DECLSPEC SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice(const char + *device, + int iscapture, + const + SDL_AudioSpec * + desired, + SDL_AudioSpec * + obtained, + int + allowed_changes); + + + +/** + * \name Audio state + * + * Get the current audio state. + */ +/* @{ */ +typedef enum +{ + SDL_AUDIO_STOPPED = 0, + SDL_AUDIO_PLAYING, + SDL_AUDIO_PAUSED +} SDL_AudioStatus; +extern DECLSPEC SDL_AudioStatus SDLCALL SDL_GetAudioStatus(void); + +extern DECLSPEC SDL_AudioStatus SDLCALL +SDL_GetAudioDeviceStatus(SDL_AudioDeviceID dev); +/* @} *//* Audio State */ + +/** + * \name Pause audio functions + * + * These functions pause and unpause the audio callback processing. + * They should be called with a parameter of 0 after opening the audio + * device to start playing sound. This is so you can safely initialize + * data for your callback function after opening the audio device. + * Silence will be written to the audio device during the pause. + */ +/* @{ */ +extern DECLSPEC void SDLCALL SDL_PauseAudio(int pause_on); +extern DECLSPEC void SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev, + int pause_on); +/* @} *//* Pause audio functions */ + +/** + * This function loads a WAVE from the data source, automatically freeing + * that source if \c freesrc is non-zero. For example, to load a WAVE file, + * you could do: + * \code + * SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, ...); + * \endcode + * + * If this function succeeds, it returns the given SDL_AudioSpec, + * filled with the audio data format of the wave data, and sets + * \c *audio_buf to a malloc()'d buffer containing the audio data, + * and sets \c *audio_len to the length of that audio buffer, in bytes. + * You need to free the audio buffer with SDL_FreeWAV() when you are + * done with it. + * + * This function returns NULL and sets the SDL error message if the + * wave file cannot be opened, uses an unknown data format, or is + * corrupt. Currently raw and MS-ADPCM WAVE files are supported. + */ +extern DECLSPEC SDL_AudioSpec *SDLCALL SDL_LoadWAV_RW(SDL_RWops * src, + int freesrc, + SDL_AudioSpec * spec, + Uint8 ** audio_buf, + Uint32 * audio_len); + +/** + * Loads a WAV from a file. + * Compatibility convenience function. + */ +#define SDL_LoadWAV(file, spec, audio_buf, audio_len) \ + SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"),1, spec,audio_buf,audio_len) + +/** + * This function frees data previously allocated with SDL_LoadWAV_RW() + */ +extern DECLSPEC void SDLCALL SDL_FreeWAV(Uint8 * audio_buf); + +/** + * This function takes a source format and rate and a destination format + * and rate, and initializes the \c cvt structure with information needed + * by SDL_ConvertAudio() to convert a buffer of audio data from one format + * to the other. + * + * \return -1 if the format conversion is not supported, 0 if there's + * no conversion needed, or 1 if the audio filter is set up. + */ +extern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT * cvt, + SDL_AudioFormat src_format, + Uint8 src_channels, + int src_rate, + SDL_AudioFormat dst_format, + Uint8 dst_channels, + int dst_rate); + +/** + * Once you have initialized the \c cvt structure using SDL_BuildAudioCVT(), + * created an audio buffer \c cvt->buf, and filled it with \c cvt->len bytes of + * audio data in the source format, this function will convert it in-place + * to the desired format. + * + * The data conversion may expand the size of the audio data, so the buffer + * \c cvt->buf should be allocated after the \c cvt structure is initialized by + * SDL_BuildAudioCVT(), and should be \c cvt->len*cvt->len_mult bytes long. + */ +extern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT * cvt); + +#define SDL_MIX_MAXVOLUME 128 +/** + * This takes two audio buffers of the playing audio format and mixes + * them, performing addition, volume adjustment, and overflow clipping. + * The volume ranges from 0 - 128, and should be set to ::SDL_MIX_MAXVOLUME + * for full audio volume. Note this does not change hardware volume. + * This is provided for convenience -- you can mix your own audio data. + */ +extern DECLSPEC void SDLCALL SDL_MixAudio(Uint8 * dst, const Uint8 * src, + Uint32 len, int volume); + +/** + * This works like SDL_MixAudio(), but you specify the audio format instead of + * using the format of audio device 1. Thus it can be used when no audio + * device is open at all. + */ +extern DECLSPEC void SDLCALL SDL_MixAudioFormat(Uint8 * dst, + const Uint8 * src, + SDL_AudioFormat format, + Uint32 len, int volume); + +/** + * \name Audio lock functions + * + * The lock manipulated by these functions protects the callback function. + * During a SDL_LockAudio()/SDL_UnlockAudio() pair, you can be guaranteed that + * the callback function is not running. Do not call these from the callback + * function or you will cause deadlock. + */ +/* @{ */ +extern DECLSPEC void SDLCALL SDL_LockAudio(void); +extern DECLSPEC void SDLCALL SDL_LockAudioDevice(SDL_AudioDeviceID dev); +extern DECLSPEC void SDLCALL SDL_UnlockAudio(void); +extern DECLSPEC void SDLCALL SDL_UnlockAudioDevice(SDL_AudioDeviceID dev); +/* @} *//* Audio lock functions */ + +/** + * This function shuts down audio processing and closes the audio device. + */ +extern DECLSPEC void SDLCALL SDL_CloseAudio(void); +extern DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID dev); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_audio_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_bits.h b/lib/SDL2/include/SDL_bits.h new file mode 100644 index 0000000000..341524fd9f --- /dev/null +++ b/lib/SDL2/include/SDL_bits.h @@ -0,0 +1,97 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_bits.h + * + * Functions for fiddling with bits and bitmasks. + */ + +#ifndef _SDL_bits_h +#define _SDL_bits_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file SDL_bits.h + */ + +/** + * Get the index of the most significant bit. Result is undefined when called + * with 0. This operation can also be stated as "count leading zeroes" and + * "log base 2". + * + * \return Index of the most significant bit, or -1 if the value is 0. + */ +SDL_FORCE_INLINE int +SDL_MostSignificantBitIndex32(Uint32 x) +{ +#if defined(__GNUC__) && __GNUC__ >= 4 + /* Count Leading Zeroes builtin in GCC. + * http://gcc.gnu.org/onlinedocs/gcc-4.3.4/gcc/Other-Builtins.html + */ + if (x == 0) { + return -1; + } + return 31 - __builtin_clz(x); +#else + /* Based off of Bit Twiddling Hacks by Sean Eron Anderson + * , released in the public domain. + * http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog + */ + const Uint32 b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000}; + const int S[] = {1, 2, 4, 8, 16}; + + int msbIndex = 0; + int i; + + if (x == 0) { + return -1; + } + + for (i = 4; i >= 0; i--) + { + if (x & b[i]) + { + x >>= S[i]; + msbIndex |= S[i]; + } + } + + return msbIndex; +#endif +} + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_bits_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_blendmode.h b/lib/SDL2/include/SDL_blendmode.h new file mode 100644 index 0000000000..8c257be9c0 --- /dev/null +++ b/lib/SDL2/include/SDL_blendmode.h @@ -0,0 +1,63 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_blendmode.h + * + * Header file declaring the SDL_BlendMode enumeration + */ + +#ifndef _SDL_blendmode_h +#define _SDL_blendmode_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief The blend mode used in SDL_RenderCopy() and drawing operations. + */ +typedef enum +{ + SDL_BLENDMODE_NONE = 0x00000000, /**< no blending + dstRGBA = srcRGBA */ + SDL_BLENDMODE_BLEND = 0x00000001, /**< alpha blending + dstRGB = (srcRGB * srcA) + (dstRGB * (1-srcA)) + dstA = srcA + (dstA * (1-srcA)) */ + SDL_BLENDMODE_ADD = 0x00000002, /**< additive blending + dstRGB = (srcRGB * srcA) + dstRGB + dstA = dstA */ + SDL_BLENDMODE_MOD = 0x00000004 /**< color modulate + dstRGB = srcRGB * dstRGB + dstA = dstA */ +} SDL_BlendMode; + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_video_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_clipboard.h b/lib/SDL2/include/SDL_clipboard.h new file mode 100644 index 0000000000..74e2b32fe7 --- /dev/null +++ b/lib/SDL2/include/SDL_clipboard.h @@ -0,0 +1,71 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_clipboard.h + * + * Include file for SDL clipboard handling + */ + +#ifndef _SDL_clipboard_h +#define _SDL_clipboard_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Function prototypes */ + +/** + * \brief Put UTF-8 text into the clipboard + * + * \sa SDL_GetClipboardText() + */ +extern DECLSPEC int SDLCALL SDL_SetClipboardText(const char *text); + +/** + * \brief Get UTF-8 text from the clipboard, which must be freed with SDL_free() + * + * \sa SDL_SetClipboardText() + */ +extern DECLSPEC char * SDLCALL SDL_GetClipboardText(void); + +/** + * \brief Returns a flag indicating whether the clipboard exists and contains a text string that is non-empty + * + * \sa SDL_GetClipboardText() + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasClipboardText(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_clipboard_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_config.h b/lib/SDL2/include/SDL_config.h new file mode 100644 index 0000000000..35eda4653e --- /dev/null +++ b/lib/SDL2/include/SDL_config.h @@ -0,0 +1,210 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_config_windows_h +#define _SDL_config_windows_h + +#include "SDL_platform.h" + +/* This is a set of defines to configure the SDL features */ + +#if !defined(_STDINT_H_) && (!defined(HAVE_STDINT_H) || !_HAVE_STDINT_H) +#if defined(__GNUC__) || defined(__DMC__) || defined(__WATCOMC__) +#define HAVE_STDINT_H 1 +#elif defined(_MSC_VER) +typedef signed __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef signed __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef signed __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; +#ifndef _UINTPTR_T_DEFINED +#ifdef _WIN64 +typedef unsigned __int64 uintptr_t; +#else +typedef unsigned int uintptr_t; +#endif +#define _UINTPTR_T_DEFINED +#endif +/* Older Visual C++ headers don't have the Win64-compatible typedefs... */ +#if ((_MSC_VER <= 1200) && (!defined(DWORD_PTR))) +#define DWORD_PTR DWORD +#endif +#if ((_MSC_VER <= 1200) && (!defined(LONG_PTR))) +#define LONG_PTR LONG +#endif +#else /* !__GNUC__ && !_MSC_VER */ +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; +#ifndef _SIZE_T_DEFINED_ +#define _SIZE_T_DEFINED_ +typedef unsigned int size_t; +#endif +typedef unsigned int uintptr_t; +#endif /* __GNUC__ || _MSC_VER */ +#endif /* !_STDINT_H_ && !HAVE_STDINT_H */ + +#ifdef _WIN64 +# define SIZEOF_VOIDP 8 +#else +# define SIZEOF_VOIDP 4 +#endif + +/* This is disabled by default to avoid C runtime dependencies and manifest requirements */ +#ifdef HAVE_LIBC +/* Useful headers */ +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_SIGNAL_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE__STRREV 1 +#define HAVE__STRUPR 1 +#define HAVE__STRLWR 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE__LTOA 1 +#define HAVE__ULTOA 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE__STRICMP 1 +#define HAVE__STRNICMP 1 +#define HAVE_ATAN 1 +#define HAVE_ATAN2 1 +#define HAVE_ACOS 1 +#define HAVE_ASIN 1 +#define HAVE_CEIL 1 +#define HAVE_COS 1 +#define HAVE_COSF 1 +#define HAVE_FABS 1 +#define HAVE_FLOOR 1 +#define HAVE_LOG 1 +#define HAVE_POW 1 +#define HAVE_SIN 1 +#define HAVE_SINF 1 +#define HAVE_SQRT 1 +#if _MSC_VER >= 1800 +#define HAVE_STRTOLL 1 +#define HAVE_VSSCANF 1 +#define HAVE_COPYSIGN 1 +#define HAVE_SCALBN 1 +#endif +#if !defined(_MSC_VER) || defined(_USE_MATH_DEFINES) +#define HAVE_M_PI 1 +#endif +#else +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 +#endif + +/* Enable various audio drivers */ +#define SDL_AUDIO_DRIVER_DSOUND 1 +#define SDL_AUDIO_DRIVER_XAUDIO2 1 +#define SDL_AUDIO_DRIVER_WINMM 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various input drivers */ +#define SDL_JOYSTICK_DINPUT 1 +#define SDL_HAPTIC_DINPUT 1 + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_WINDOWS 1 + +/* Enable various threading systems */ +#define SDL_THREAD_WINDOWS 1 + +/* Enable various timer systems */ +#define SDL_TIMER_WINDOWS 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_DUMMY 1 +#define SDL_VIDEO_DRIVER_WINDOWS 1 + +#ifndef SDL_VIDEO_RENDER_D3D +#define SDL_VIDEO_RENDER_D3D 1 +#endif +#ifndef SDL_VIDEO_RENDER_D3D11 +#define SDL_VIDEO_RENDER_D3D11 0 +#endif + +/* Enable OpenGL support */ +#ifndef SDL_VIDEO_OPENGL +#define SDL_VIDEO_OPENGL 1 +#endif +#ifndef SDL_VIDEO_OPENGL_WGL +#define SDL_VIDEO_OPENGL_WGL 1 +#endif +#ifndef SDL_VIDEO_RENDER_OGL +#define SDL_VIDEO_RENDER_OGL 1 +#endif +#ifndef SDL_VIDEO_RENDER_OGL_ES2 +#define SDL_VIDEO_RENDER_OGL_ES2 1 +#endif +#ifndef SDL_VIDEO_OPENGL_ES2 +#define SDL_VIDEO_OPENGL_ES2 1 +#endif +#ifndef SDL_VIDEO_OPENGL_EGL +#define SDL_VIDEO_OPENGL_EGL 1 +#endif + + +/* Enable system power support */ +#define SDL_POWER_WINDOWS 1 + +/* Enable filesystem support */ +#define SDL_FILESYSTEM_WINDOWS 1 + +/* Enable assembly routines (Win64 doesn't have inline asm) */ +#ifndef _WIN64 +#define SDL_ASSEMBLY_ROUTINES 1 +#endif + +#endif /* _SDL_config_windows_h */ diff --git a/lib/SDL2/include/SDL_cpuinfo.h b/lib/SDL2/include/SDL_cpuinfo.h new file mode 100644 index 0000000000..1f6efd384a --- /dev/null +++ b/lib/SDL2/include/SDL_cpuinfo.h @@ -0,0 +1,156 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_cpuinfo.h + * + * CPU feature detection for SDL. + */ + +#ifndef _SDL_cpuinfo_h +#define _SDL_cpuinfo_h + +#include "SDL_stdinc.h" + +/* Need to do this here because intrin.h has C++ code in it */ +/* Visual Studio 2005 has a bug where intrin.h conflicts with winnt.h */ +#if defined(_MSC_VER) && (_MSC_VER >= 1500) && (defined(_M_IX86) || defined(_M_X64)) +#include +#ifndef _WIN64 +#define __MMX__ +#define __3dNOW__ +#endif +#define __SSE__ +#define __SSE2__ +#elif defined(__MINGW64_VERSION_MAJOR) +#include +#else +#ifdef __ALTIVEC__ +#if HAVE_ALTIVEC_H && !defined(__APPLE_ALTIVEC__) +#include +#undef pixel +#endif +#endif +#ifdef __MMX__ +#include +#endif +#ifdef __3dNOW__ +#include +#endif +#ifdef __SSE__ +#include +#endif +#ifdef __SSE2__ +#include +#endif +#endif + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* This is a guess for the cacheline size used for padding. + * Most x86 processors have a 64 byte cache line. + * The 64-bit PowerPC processors have a 128 byte cache line. + * We'll use the larger value to be generally safe. + */ +#define SDL_CACHELINE_SIZE 128 + +/** + * This function returns the number of CPU cores available. + */ +extern DECLSPEC int SDLCALL SDL_GetCPUCount(void); + +/** + * This function returns the L1 cache line size of the CPU + * + * This is useful for determining multi-threaded structure padding + * or SIMD prefetch sizes. + */ +extern DECLSPEC int SDLCALL SDL_GetCPUCacheLineSize(void); + +/** + * This function returns true if the CPU has the RDTSC instruction. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasRDTSC(void); + +/** + * This function returns true if the CPU has AltiVec features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void); + +/** + * This function returns true if the CPU has MMX features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void); + +/** + * This function returns true if the CPU has 3DNow! features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow(void); + +/** + * This function returns true if the CPU has SSE features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void); + +/** + * This function returns true if the CPU has SSE2 features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void); + +/** + * This function returns true if the CPU has SSE3 features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE3(void); + +/** + * This function returns true if the CPU has SSE4.1 features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE41(void); + +/** + * This function returns true if the CPU has SSE4.2 features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE42(void); + +/** + * This function returns true if the CPU has AVX features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX(void); + +/** + * This function returns the amount of RAM configured in the system, in MB. + */ +extern DECLSPEC int SDLCALL SDL_GetSystemRAM(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_cpuinfo_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_endian.h b/lib/SDL2/include/SDL_endian.h new file mode 100644 index 0000000000..161c418de9 --- /dev/null +++ b/lib/SDL2/include/SDL_endian.h @@ -0,0 +1,239 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_endian.h + * + * Functions for reading and writing endian-specific values + */ + +#ifndef _SDL_endian_h +#define _SDL_endian_h + +#include "SDL_stdinc.h" + +/** + * \name The two types of endianness + */ +/* @{ */ +#define SDL_LIL_ENDIAN 1234 +#define SDL_BIG_ENDIAN 4321 +/* @} */ + +#ifndef SDL_BYTEORDER /* Not defined in SDL_config.h? */ +#ifdef __linux__ +#include +#define SDL_BYTEORDER __BYTE_ORDER +#else /* __linux __ */ +#if defined(__hppa__) || \ + defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \ + (defined(__MIPS__) && defined(__MISPEB__)) || \ + defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \ + defined(__sparc__) +#define SDL_BYTEORDER SDL_BIG_ENDIAN +#else +#define SDL_BYTEORDER SDL_LIL_ENDIAN +#endif +#endif /* __linux __ */ +#endif /* !SDL_BYTEORDER */ + + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file SDL_endian.h + */ +#if defined(__GNUC__) && defined(__i386__) && \ + !(__GNUC__ == 2 && __GNUC_MINOR__ == 95 /* broken gcc version */) +SDL_FORCE_INLINE Uint16 +SDL_Swap16(Uint16 x) +{ + __asm__("xchgb %b0,%h0": "=q"(x):"0"(x)); + return x; +} +#elif defined(__GNUC__) && defined(__x86_64__) +SDL_FORCE_INLINE Uint16 +SDL_Swap16(Uint16 x) +{ + __asm__("xchgb %b0,%h0": "=Q"(x):"0"(x)); + return x; +} +#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) +SDL_FORCE_INLINE Uint16 +SDL_Swap16(Uint16 x) +{ + int result; + + __asm__("rlwimi %0,%2,8,16,23": "=&r"(result):"0"(x >> 8), "r"(x)); + return (Uint16)result; +} +#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) && !defined(__mcoldfire__) +SDL_FORCE_INLINE Uint16 +SDL_Swap16(Uint16 x) +{ + __asm__("rorw #8,%0": "=d"(x): "0"(x):"cc"); + return x; +} +#else +SDL_FORCE_INLINE Uint16 +SDL_Swap16(Uint16 x) +{ + return SDL_static_cast(Uint16, ((x << 8) | (x >> 8))); +} +#endif + +#if defined(__GNUC__) && defined(__i386__) +SDL_FORCE_INLINE Uint32 +SDL_Swap32(Uint32 x) +{ + __asm__("bswap %0": "=r"(x):"0"(x)); + return x; +} +#elif defined(__GNUC__) && defined(__x86_64__) +SDL_FORCE_INLINE Uint32 +SDL_Swap32(Uint32 x) +{ + __asm__("bswapl %0": "=r"(x):"0"(x)); + return x; +} +#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) +SDL_FORCE_INLINE Uint32 +SDL_Swap32(Uint32 x) +{ + Uint32 result; + + __asm__("rlwimi %0,%2,24,16,23": "=&r"(result):"0"(x >> 24), "r"(x)); + __asm__("rlwimi %0,%2,8,8,15": "=&r"(result):"0"(result), "r"(x)); + __asm__("rlwimi %0,%2,24,0,7": "=&r"(result):"0"(result), "r"(x)); + return result; +} +#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) && !defined(__mcoldfire__) +SDL_FORCE_INLINE Uint32 +SDL_Swap32(Uint32 x) +{ + __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0": "=d"(x): "0"(x):"cc"); + return x; +} +#else +SDL_FORCE_INLINE Uint32 +SDL_Swap32(Uint32 x) +{ + return SDL_static_cast(Uint32, ((x << 24) | ((x << 8) & 0x00FF0000) | + ((x >> 8) & 0x0000FF00) | (x >> 24))); +} +#endif + +#if defined(__GNUC__) && defined(__i386__) +SDL_FORCE_INLINE Uint64 +SDL_Swap64(Uint64 x) +{ + union + { + struct + { + Uint32 a, b; + } s; + Uint64 u; + } v; + v.u = x; + __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1": "=r"(v.s.a), "=r"(v.s.b):"0"(v.s.a), + "1"(v.s. + b)); + return v.u; +} +#elif defined(__GNUC__) && defined(__x86_64__) +SDL_FORCE_INLINE Uint64 +SDL_Swap64(Uint64 x) +{ + __asm__("bswapq %0": "=r"(x):"0"(x)); + return x; +} +#else +SDL_FORCE_INLINE Uint64 +SDL_Swap64(Uint64 x) +{ + Uint32 hi, lo; + + /* Separate into high and low 32-bit values and swap them */ + lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF); + x >>= 32; + hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF); + x = SDL_Swap32(lo); + x <<= 32; + x |= SDL_Swap32(hi); + return (x); +} +#endif + + +SDL_FORCE_INLINE float +SDL_SwapFloat(float x) +{ + union + { + float f; + Uint32 ui32; + } swapper; + swapper.f = x; + swapper.ui32 = SDL_Swap32(swapper.ui32); + return swapper.f; +} + + +/** + * \name Swap to native + * Byteswap item from the specified endianness to the native endianness. + */ +/* @{ */ +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define SDL_SwapLE16(X) (X) +#define SDL_SwapLE32(X) (X) +#define SDL_SwapLE64(X) (X) +#define SDL_SwapFloatLE(X) (X) +#define SDL_SwapBE16(X) SDL_Swap16(X) +#define SDL_SwapBE32(X) SDL_Swap32(X) +#define SDL_SwapBE64(X) SDL_Swap64(X) +#define SDL_SwapFloatBE(X) SDL_SwapFloat(X) +#else +#define SDL_SwapLE16(X) SDL_Swap16(X) +#define SDL_SwapLE32(X) SDL_Swap32(X) +#define SDL_SwapLE64(X) SDL_Swap64(X) +#define SDL_SwapFloatLE(X) SDL_SwapFloat(X) +#define SDL_SwapBE16(X) (X) +#define SDL_SwapBE32(X) (X) +#define SDL_SwapBE64(X) (X) +#define SDL_SwapFloatBE(X) (X) +#endif +/* @} *//* Swap to native */ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_endian_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_error.h b/lib/SDL2/include/SDL_error.h new file mode 100644 index 0000000000..5776cfa260 --- /dev/null +++ b/lib/SDL2/include/SDL_error.h @@ -0,0 +1,76 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_error.h + * + * Simple error message routines for SDL. + */ + +#ifndef _SDL_error_h +#define _SDL_error_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Public functions */ +/* SDL_SetError() unconditionally returns -1. */ +extern DECLSPEC int SDLCALL SDL_SetError(const char *fmt, ...); +extern DECLSPEC const char *SDLCALL SDL_GetError(void); +extern DECLSPEC void SDLCALL SDL_ClearError(void); + +/** + * \name Internal error functions + * + * \internal + * Private error reporting function - used internally. + */ +/* @{ */ +#define SDL_OutOfMemory() SDL_Error(SDL_ENOMEM) +#define SDL_Unsupported() SDL_Error(SDL_UNSUPPORTED) +#define SDL_InvalidParamError(param) SDL_SetError("Parameter '%s' is invalid", (param)) +typedef enum +{ + SDL_ENOMEM, + SDL_EFREAD, + SDL_EFWRITE, + SDL_EFSEEK, + SDL_UNSUPPORTED, + SDL_LASTERROR +} SDL_errorcode; +/* SDL_Error() unconditionally returns -1. */ +extern DECLSPEC int SDLCALL SDL_Error(SDL_errorcode code); +/* @} *//* Internal error functions */ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_error_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_events.h b/lib/SDL2/include/SDL_events.h new file mode 100644 index 0000000000..fc5a145e75 --- /dev/null +++ b/lib/SDL2/include/SDL_events.h @@ -0,0 +1,723 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_events.h + * + * Include file for SDL event handling. + */ + +#ifndef _SDL_events_h +#define _SDL_events_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" +#include "SDL_keyboard.h" +#include "SDL_mouse.h" +#include "SDL_joystick.h" +#include "SDL_gamecontroller.h" +#include "SDL_quit.h" +#include "SDL_gesture.h" +#include "SDL_touch.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* General keyboard/mouse state definitions */ +#define SDL_RELEASED 0 +#define SDL_PRESSED 1 + +/** + * \brief The types of events that can be delivered. + */ +typedef enum +{ + SDL_FIRSTEVENT = 0, /**< Unused (do not remove) */ + + /* Application events */ + SDL_QUIT = 0x100, /**< User-requested quit */ + + /* These application events have special meaning on iOS, see README-ios.txt for details */ + SDL_APP_TERMINATING, /**< The application is being terminated by the OS + Called on iOS in applicationWillTerminate() + Called on Android in onDestroy() + */ + SDL_APP_LOWMEMORY, /**< The application is low on memory, free memory if possible. + Called on iOS in applicationDidReceiveMemoryWarning() + Called on Android in onLowMemory() + */ + SDL_APP_WILLENTERBACKGROUND, /**< The application is about to enter the background + Called on iOS in applicationWillResignActive() + Called on Android in onPause() + */ + SDL_APP_DIDENTERBACKGROUND, /**< The application did enter the background and may not get CPU for some time + Called on iOS in applicationDidEnterBackground() + Called on Android in onPause() + */ + SDL_APP_WILLENTERFOREGROUND, /**< The application is about to enter the foreground + Called on iOS in applicationWillEnterForeground() + Called on Android in onResume() + */ + SDL_APP_DIDENTERFOREGROUND, /**< The application is now interactive + Called on iOS in applicationDidBecomeActive() + Called on Android in onResume() + */ + + /* Window events */ + SDL_WINDOWEVENT = 0x200, /**< Window state change */ + SDL_SYSWMEVENT, /**< System specific event */ + + /* Keyboard events */ + SDL_KEYDOWN = 0x300, /**< Key pressed */ + SDL_KEYUP, /**< Key released */ + SDL_TEXTEDITING, /**< Keyboard text editing (composition) */ + SDL_TEXTINPUT, /**< Keyboard text input */ + + /* Mouse events */ + SDL_MOUSEMOTION = 0x400, /**< Mouse moved */ + SDL_MOUSEBUTTONDOWN, /**< Mouse button pressed */ + SDL_MOUSEBUTTONUP, /**< Mouse button released */ + SDL_MOUSEWHEEL, /**< Mouse wheel motion */ + + /* Joystick events */ + SDL_JOYAXISMOTION = 0x600, /**< Joystick axis motion */ + SDL_JOYBALLMOTION, /**< Joystick trackball motion */ + SDL_JOYHATMOTION, /**< Joystick hat position change */ + SDL_JOYBUTTONDOWN, /**< Joystick button pressed */ + SDL_JOYBUTTONUP, /**< Joystick button released */ + SDL_JOYDEVICEADDED, /**< A new joystick has been inserted into the system */ + SDL_JOYDEVICEREMOVED, /**< An opened joystick has been removed */ + + /* Game controller events */ + SDL_CONTROLLERAXISMOTION = 0x650, /**< Game controller axis motion */ + SDL_CONTROLLERBUTTONDOWN, /**< Game controller button pressed */ + SDL_CONTROLLERBUTTONUP, /**< Game controller button released */ + SDL_CONTROLLERDEVICEADDED, /**< A new Game controller has been inserted into the system */ + SDL_CONTROLLERDEVICEREMOVED, /**< An opened Game controller has been removed */ + SDL_CONTROLLERDEVICEREMAPPED, /**< The controller mapping was updated */ + + /* Touch events */ + SDL_FINGERDOWN = 0x700, + SDL_FINGERUP, + SDL_FINGERMOTION, + + /* Gesture events */ + SDL_DOLLARGESTURE = 0x800, + SDL_DOLLARRECORD, + SDL_MULTIGESTURE, + + /* Clipboard events */ + SDL_CLIPBOARDUPDATE = 0x900, /**< The clipboard changed */ + + /* Drag and drop events */ + SDL_DROPFILE = 0x1000, /**< The system requests a file open */ + + /* Render events */ + SDL_RENDER_TARGETS_RESET = 0x2000, /**< The render targets have been reset */ + + /** Events ::SDL_USEREVENT through ::SDL_LASTEVENT are for your use, + * and should be allocated with SDL_RegisterEvents() + */ + SDL_USEREVENT = 0x8000, + + /** + * This last event is only for bounding internal arrays + */ + SDL_LASTEVENT = 0xFFFF +} SDL_EventType; + +/** + * \brief Fields shared by every event + */ +typedef struct SDL_CommonEvent +{ + Uint32 type; + Uint32 timestamp; +} SDL_CommonEvent; + +/** + * \brief Window state change event data (event.window.*) + */ +typedef struct SDL_WindowEvent +{ + Uint32 type; /**< ::SDL_WINDOWEVENT */ + Uint32 timestamp; + Uint32 windowID; /**< The associated window */ + Uint8 event; /**< ::SDL_WindowEventID */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint32 data1; /**< event dependent data */ + Sint32 data2; /**< event dependent data */ +} SDL_WindowEvent; + +/** + * \brief Keyboard button event structure (event.key.*) + */ +typedef struct SDL_KeyboardEvent +{ + Uint32 type; /**< ::SDL_KEYDOWN or ::SDL_KEYUP */ + Uint32 timestamp; + Uint32 windowID; /**< The window with keyboard focus, if any */ + Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ + Uint8 repeat; /**< Non-zero if this is a key repeat */ + Uint8 padding2; + Uint8 padding3; + SDL_Keysym keysym; /**< The key that was pressed or released */ +} SDL_KeyboardEvent; + +#define SDL_TEXTEDITINGEVENT_TEXT_SIZE (32) +/** + * \brief Keyboard text editing event structure (event.edit.*) + */ +typedef struct SDL_TextEditingEvent +{ + Uint32 type; /**< ::SDL_TEXTEDITING */ + Uint32 timestamp; + Uint32 windowID; /**< The window with keyboard focus, if any */ + char text[SDL_TEXTEDITINGEVENT_TEXT_SIZE]; /**< The editing text */ + Sint32 start; /**< The start cursor of selected editing text */ + Sint32 length; /**< The length of selected editing text */ +} SDL_TextEditingEvent; + + +#define SDL_TEXTINPUTEVENT_TEXT_SIZE (32) +/** + * \brief Keyboard text input event structure (event.text.*) + */ +typedef struct SDL_TextInputEvent +{ + Uint32 type; /**< ::SDL_TEXTINPUT */ + Uint32 timestamp; + Uint32 windowID; /**< The window with keyboard focus, if any */ + char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]; /**< The input text */ +} SDL_TextInputEvent; + +/** + * \brief Mouse motion event structure (event.motion.*) + */ +typedef struct SDL_MouseMotionEvent +{ + Uint32 type; /**< ::SDL_MOUSEMOTION */ + Uint32 timestamp; + Uint32 windowID; /**< The window with mouse focus, if any */ + Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */ + Uint32 state; /**< The current button state */ + Sint32 x; /**< X coordinate, relative to window */ + Sint32 y; /**< Y coordinate, relative to window */ + Sint32 xrel; /**< The relative motion in the X direction */ + Sint32 yrel; /**< The relative motion in the Y direction */ +} SDL_MouseMotionEvent; + +/** + * \brief Mouse button event structure (event.button.*) + */ +typedef struct SDL_MouseButtonEvent +{ + Uint32 type; /**< ::SDL_MOUSEBUTTONDOWN or ::SDL_MOUSEBUTTONUP */ + Uint32 timestamp; + Uint32 windowID; /**< The window with mouse focus, if any */ + Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */ + Uint8 button; /**< The mouse button index */ + Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ + Uint8 clicks; /**< 1 for single-click, 2 for double-click, etc. */ + Uint8 padding1; + Sint32 x; /**< X coordinate, relative to window */ + Sint32 y; /**< Y coordinate, relative to window */ +} SDL_MouseButtonEvent; + +/** + * \brief Mouse wheel event structure (event.wheel.*) + */ +typedef struct SDL_MouseWheelEvent +{ + Uint32 type; /**< ::SDL_MOUSEWHEEL */ + Uint32 timestamp; + Uint32 windowID; /**< The window with mouse focus, if any */ + Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */ + Sint32 x; /**< The amount scrolled horizontally, positive to the right and negative to the left */ + Sint32 y; /**< The amount scrolled vertically, positive away from the user and negative toward the user */ +} SDL_MouseWheelEvent; + +/** + * \brief Joystick axis motion event structure (event.jaxis.*) + */ +typedef struct SDL_JoyAxisEvent +{ + Uint32 type; /**< ::SDL_JOYAXISMOTION */ + Uint32 timestamp; + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 axis; /**< The joystick axis index */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint16 value; /**< The axis value (range: -32768 to 32767) */ + Uint16 padding4; +} SDL_JoyAxisEvent; + +/** + * \brief Joystick trackball motion event structure (event.jball.*) + */ +typedef struct SDL_JoyBallEvent +{ + Uint32 type; /**< ::SDL_JOYBALLMOTION */ + Uint32 timestamp; + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 ball; /**< The joystick trackball index */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint16 xrel; /**< The relative motion in the X direction */ + Sint16 yrel; /**< The relative motion in the Y direction */ +} SDL_JoyBallEvent; + +/** + * \brief Joystick hat position change event structure (event.jhat.*) + */ +typedef struct SDL_JoyHatEvent +{ + Uint32 type; /**< ::SDL_JOYHATMOTION */ + Uint32 timestamp; + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 hat; /**< The joystick hat index */ + Uint8 value; /**< The hat position value. + * \sa ::SDL_HAT_LEFTUP ::SDL_HAT_UP ::SDL_HAT_RIGHTUP + * \sa ::SDL_HAT_LEFT ::SDL_HAT_CENTERED ::SDL_HAT_RIGHT + * \sa ::SDL_HAT_LEFTDOWN ::SDL_HAT_DOWN ::SDL_HAT_RIGHTDOWN + * + * Note that zero means the POV is centered. + */ + Uint8 padding1; + Uint8 padding2; +} SDL_JoyHatEvent; + +/** + * \brief Joystick button event structure (event.jbutton.*) + */ +typedef struct SDL_JoyButtonEvent +{ + Uint32 type; /**< ::SDL_JOYBUTTONDOWN or ::SDL_JOYBUTTONUP */ + Uint32 timestamp; + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 button; /**< The joystick button index */ + Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ + Uint8 padding1; + Uint8 padding2; +} SDL_JoyButtonEvent; + +/** + * \brief Joystick device event structure (event.jdevice.*) + */ +typedef struct SDL_JoyDeviceEvent +{ + Uint32 type; /**< ::SDL_JOYDEVICEADDED or ::SDL_JOYDEVICEREMOVED */ + Uint32 timestamp; + Sint32 which; /**< The joystick device index for the ADDED event, instance id for the REMOVED event */ +} SDL_JoyDeviceEvent; + + +/** + * \brief Game controller axis motion event structure (event.caxis.*) + */ +typedef struct SDL_ControllerAxisEvent +{ + Uint32 type; /**< ::SDL_CONTROLLERAXISMOTION */ + Uint32 timestamp; + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 axis; /**< The controller axis (SDL_GameControllerAxis) */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint16 value; /**< The axis value (range: -32768 to 32767) */ + Uint16 padding4; +} SDL_ControllerAxisEvent; + + +/** + * \brief Game controller button event structure (event.cbutton.*) + */ +typedef struct SDL_ControllerButtonEvent +{ + Uint32 type; /**< ::SDL_CONTROLLERBUTTONDOWN or ::SDL_CONTROLLERBUTTONUP */ + Uint32 timestamp; + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 button; /**< The controller button (SDL_GameControllerButton) */ + Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ + Uint8 padding1; + Uint8 padding2; +} SDL_ControllerButtonEvent; + + +/** + * \brief Controller device event structure (event.cdevice.*) + */ +typedef struct SDL_ControllerDeviceEvent +{ + Uint32 type; /**< ::SDL_CONTROLLERDEVICEADDED, ::SDL_CONTROLLERDEVICEREMOVED, or ::SDL_CONTROLLERDEVICEREMAPPED */ + Uint32 timestamp; + Sint32 which; /**< The joystick device index for the ADDED event, instance id for the REMOVED or REMAPPED event */ +} SDL_ControllerDeviceEvent; + + +/** + * \brief Touch finger event structure (event.tfinger.*) + */ +typedef struct SDL_TouchFingerEvent +{ + Uint32 type; /**< ::SDL_FINGERMOTION or ::SDL_FINGERDOWN or ::SDL_FINGERUP */ + Uint32 timestamp; + SDL_TouchID touchId; /**< The touch device id */ + SDL_FingerID fingerId; + float x; /**< Normalized in the range 0...1 */ + float y; /**< Normalized in the range 0...1 */ + float dx; /**< Normalized in the range 0...1 */ + float dy; /**< Normalized in the range 0...1 */ + float pressure; /**< Normalized in the range 0...1 */ +} SDL_TouchFingerEvent; + + +/** + * \brief Multiple Finger Gesture Event (event.mgesture.*) + */ +typedef struct SDL_MultiGestureEvent +{ + Uint32 type; /**< ::SDL_MULTIGESTURE */ + Uint32 timestamp; + SDL_TouchID touchId; /**< The touch device index */ + float dTheta; + float dDist; + float x; + float y; + Uint16 numFingers; + Uint16 padding; +} SDL_MultiGestureEvent; + + +/** + * \brief Dollar Gesture Event (event.dgesture.*) + */ +typedef struct SDL_DollarGestureEvent +{ + Uint32 type; /**< ::SDL_DOLLARGESTURE */ + Uint32 timestamp; + SDL_TouchID touchId; /**< The touch device id */ + SDL_GestureID gestureId; + Uint32 numFingers; + float error; + float x; /**< Normalized center of gesture */ + float y; /**< Normalized center of gesture */ +} SDL_DollarGestureEvent; + + +/** + * \brief An event used to request a file open by the system (event.drop.*) + * This event is disabled by default, you can enable it with SDL_EventState() + * \note If you enable this event, you must free the filename in the event. + */ +typedef struct SDL_DropEvent +{ + Uint32 type; /**< ::SDL_DROPFILE */ + Uint32 timestamp; + char *file; /**< The file name, which should be freed with SDL_free() */ +} SDL_DropEvent; + + +/** + * \brief The "quit requested" event + */ +typedef struct SDL_QuitEvent +{ + Uint32 type; /**< ::SDL_QUIT */ + Uint32 timestamp; +} SDL_QuitEvent; + +/** + * \brief OS Specific event + */ +typedef struct SDL_OSEvent +{ + Uint32 type; /**< ::SDL_QUIT */ + Uint32 timestamp; +} SDL_OSEvent; + +/** + * \brief A user-defined event type (event.user.*) + */ +typedef struct SDL_UserEvent +{ + Uint32 type; /**< ::SDL_USEREVENT through ::SDL_LASTEVENT-1 */ + Uint32 timestamp; + Uint32 windowID; /**< The associated window if any */ + Sint32 code; /**< User defined event code */ + void *data1; /**< User defined data pointer */ + void *data2; /**< User defined data pointer */ +} SDL_UserEvent; + + +struct SDL_SysWMmsg; +typedef struct SDL_SysWMmsg SDL_SysWMmsg; + +/** + * \brief A video driver dependent system event (event.syswm.*) + * This event is disabled by default, you can enable it with SDL_EventState() + * + * \note If you want to use this event, you should include SDL_syswm.h. + */ +typedef struct SDL_SysWMEvent +{ + Uint32 type; /**< ::SDL_SYSWMEVENT */ + Uint32 timestamp; + SDL_SysWMmsg *msg; /**< driver dependent data, defined in SDL_syswm.h */ +} SDL_SysWMEvent; + +/** + * \brief General event structure + */ +typedef union SDL_Event +{ + Uint32 type; /**< Event type, shared with all events */ + SDL_CommonEvent common; /**< Common event data */ + SDL_WindowEvent window; /**< Window event data */ + SDL_KeyboardEvent key; /**< Keyboard event data */ + SDL_TextEditingEvent edit; /**< Text editing event data */ + SDL_TextInputEvent text; /**< Text input event data */ + SDL_MouseMotionEvent motion; /**< Mouse motion event data */ + SDL_MouseButtonEvent button; /**< Mouse button event data */ + SDL_MouseWheelEvent wheel; /**< Mouse wheel event data */ + SDL_JoyAxisEvent jaxis; /**< Joystick axis event data */ + SDL_JoyBallEvent jball; /**< Joystick ball event data */ + SDL_JoyHatEvent jhat; /**< Joystick hat event data */ + SDL_JoyButtonEvent jbutton; /**< Joystick button event data */ + SDL_JoyDeviceEvent jdevice; /**< Joystick device change event data */ + SDL_ControllerAxisEvent caxis; /**< Game Controller axis event data */ + SDL_ControllerButtonEvent cbutton; /**< Game Controller button event data */ + SDL_ControllerDeviceEvent cdevice; /**< Game Controller device event data */ + SDL_QuitEvent quit; /**< Quit request event data */ + SDL_UserEvent user; /**< Custom event data */ + SDL_SysWMEvent syswm; /**< System dependent window event data */ + SDL_TouchFingerEvent tfinger; /**< Touch finger event data */ + SDL_MultiGestureEvent mgesture; /**< Gesture event data */ + SDL_DollarGestureEvent dgesture; /**< Gesture event data */ + SDL_DropEvent drop; /**< Drag and drop event data */ + + /* This is necessary for ABI compatibility between Visual C++ and GCC + Visual C++ will respect the push pack pragma and use 52 bytes for + this structure, and GCC will use the alignment of the largest datatype + within the union, which is 8 bytes. + + So... we'll add padding to force the size to be 56 bytes for both. + */ + Uint8 padding[56]; +} SDL_Event; + + +/* Function prototypes */ + +/** + * Pumps the event loop, gathering events from the input devices. + * + * This function updates the event queue and internal input device state. + * + * This should only be run in the thread that sets the video mode. + */ +extern DECLSPEC void SDLCALL SDL_PumpEvents(void); + +/* @{ */ +typedef enum +{ + SDL_ADDEVENT, + SDL_PEEKEVENT, + SDL_GETEVENT +} SDL_eventaction; + +/** + * Checks the event queue for messages and optionally returns them. + * + * If \c action is ::SDL_ADDEVENT, up to \c numevents events will be added to + * the back of the event queue. + * + * If \c action is ::SDL_PEEKEVENT, up to \c numevents events at the front + * of the event queue, within the specified minimum and maximum type, + * will be returned and will not be removed from the queue. + * + * If \c action is ::SDL_GETEVENT, up to \c numevents events at the front + * of the event queue, within the specified minimum and maximum type, + * will be returned and will be removed from the queue. + * + * \return The number of events actually stored, or -1 if there was an error. + * + * This function is thread-safe. + */ +extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event * events, int numevents, + SDL_eventaction action, + Uint32 minType, Uint32 maxType); +/* @} */ + +/** + * Checks to see if certain event types are in the event queue. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasEvent(Uint32 type); +extern DECLSPEC SDL_bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxType); + +/** + * This function clears events from the event queue + */ +extern DECLSPEC void SDLCALL SDL_FlushEvent(Uint32 type); +extern DECLSPEC void SDLCALL SDL_FlushEvents(Uint32 minType, Uint32 maxType); + +/** + * \brief Polls for currently pending events. + * + * \return 1 if there are any pending events, or 0 if there are none available. + * + * \param event If not NULL, the next event is removed from the queue and + * stored in that area. + */ +extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event * event); + +/** + * \brief Waits indefinitely for the next available event. + * + * \return 1, or 0 if there was an error while waiting for events. + * + * \param event If not NULL, the next event is removed from the queue and + * stored in that area. + */ +extern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event * event); + +/** + * \brief Waits until the specified timeout (in milliseconds) for the next + * available event. + * + * \return 1, or 0 if there was an error while waiting for events. + * + * \param event If not NULL, the next event is removed from the queue and + * stored in that area. + * \param timeout The timeout (in milliseconds) to wait for next event. + */ +extern DECLSPEC int SDLCALL SDL_WaitEventTimeout(SDL_Event * event, + int timeout); + +/** + * \brief Add an event to the event queue. + * + * \return 1 on success, 0 if the event was filtered, or -1 if the event queue + * was full or there was some other error. + */ +extern DECLSPEC int SDLCALL SDL_PushEvent(SDL_Event * event); + +typedef int (SDLCALL * SDL_EventFilter) (void *userdata, SDL_Event * event); + +/** + * Sets up a filter to process all events before they change internal state and + * are posted to the internal event queue. + * + * The filter is prototyped as: + * \code + * int SDL_EventFilter(void *userdata, SDL_Event * event); + * \endcode + * + * If the filter returns 1, then the event will be added to the internal queue. + * If it returns 0, then the event will be dropped from the queue, but the + * internal state will still be updated. This allows selective filtering of + * dynamically arriving events. + * + * \warning Be very careful of what you do in the event filter function, as + * it may run in a different thread! + * + * There is one caveat when dealing with the ::SDL_QuitEvent event type. The + * event filter is only called when the window manager desires to close the + * application window. If the event filter returns 1, then the window will + * be closed, otherwise the window will remain open if possible. + * + * If the quit event is generated by an interrupt signal, it will bypass the + * internal queue and be delivered to the application at the next event poll. + */ +extern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter, + void *userdata); + +/** + * Return the current event filter - can be used to "chain" filters. + * If there is no event filter set, this function returns SDL_FALSE. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetEventFilter(SDL_EventFilter * filter, + void **userdata); + +/** + * Add a function which is called when an event is added to the queue. + */ +extern DECLSPEC void SDLCALL SDL_AddEventWatch(SDL_EventFilter filter, + void *userdata); + +/** + * Remove an event watch function added with SDL_AddEventWatch() + */ +extern DECLSPEC void SDLCALL SDL_DelEventWatch(SDL_EventFilter filter, + void *userdata); + +/** + * Run the filter function on the current event queue, removing any + * events for which the filter returns 0. + */ +extern DECLSPEC void SDLCALL SDL_FilterEvents(SDL_EventFilter filter, + void *userdata); + +/* @{ */ +#define SDL_QUERY -1 +#define SDL_IGNORE 0 +#define SDL_DISABLE 0 +#define SDL_ENABLE 1 + +/** + * This function allows you to set the state of processing certain events. + * - If \c state is set to ::SDL_IGNORE, that event will be automatically + * dropped from the event queue and will not event be filtered. + * - If \c state is set to ::SDL_ENABLE, that event will be processed + * normally. + * - If \c state is set to ::SDL_QUERY, SDL_EventState() will return the + * current processing state of the specified event. + */ +extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint32 type, int state); +/* @} */ +#define SDL_GetEventState(type) SDL_EventState(type, SDL_QUERY) + +/** + * This function allocates a set of user-defined events, and returns + * the beginning event number for that set of events. + * + * If there aren't enough user-defined events left, this function + * returns (Uint32)-1 + */ +extern DECLSPEC Uint32 SDLCALL SDL_RegisterEvents(int numevents); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_events_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_filesystem.h b/lib/SDL2/include/SDL_filesystem.h new file mode 100644 index 0000000000..de3e227d42 --- /dev/null +++ b/lib/SDL2/include/SDL_filesystem.h @@ -0,0 +1,136 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_filesystem.h + * + * \brief Include file for filesystem SDL API functions + */ + +#ifndef _SDL_filesystem_h +#define _SDL_filesystem_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Get the path where the application resides. + * + * Get the "base path". This is the directory where the application was run + * from, which is probably the installation directory, and may or may not + * be the process's current working directory. + * + * This returns an absolute path in UTF-8 encoding, and is guaranteed to + * end with a path separator ('\\' on Windows, '/' most other places). + * + * The pointer returned by this function is owned by you. Please call + * SDL_free() on the pointer when you are done with it, or it will be a + * memory leak. This is not necessarily a fast call, though, so you should + * call this once near startup and save the string if you need it. + * + * Some platforms can't determine the application's path, and on other + * platforms, this might be meaningless. In such cases, this function will + * return NULL. + * + * \return String of base dir in UTF-8 encoding, or NULL on error. + * + * \sa SDL_GetPrefPath + */ +extern DECLSPEC char *SDLCALL SDL_GetBasePath(void); + +/** + * \brief Get the user-and-app-specific path where files can be written. + * + * Get the "pref dir". This is meant to be where users can write personal + * files (preferences and save games, etc) that are specific to your + * application. This directory is unique per user, per application. + * + * This function will decide the appropriate location in the native filesystem, + * create the directory if necessary, and return a string of the absolute + * path to the directory in UTF-8 encoding. + * + * On Windows, the string might look like: + * "C:\\Users\\bob\\AppData\\Roaming\\My Company\\My Program Name\\" + * + * On Linux, the string might look like: + * "/home/bob/.local/share/My Program Name/" + * + * On Mac OS X, the string might look like: + * "/Users/bob/Library/Application Support/My Program Name/" + * + * (etc.) + * + * You specify the name of your organization (if it's not a real organization, + * your name or an Internet domain you own might do) and the name of your + * application. These should be untranslated proper names. + * + * Both the org and app strings may become part of a directory name, so + * please follow these rules: + * + * - Try to use the same org string (including case-sensitivity) for + * all your applications that use this function. + * - Always use a unique app string for each one, and make sure it never + * changes for an app once you've decided on it. + * - Unicode characters are legal, as long as it's UTF-8 encoded, but... + * - ...only use letters, numbers, and spaces. Avoid punctuation like + * "Game Name 2: Bad Guy's Revenge!" ... "Game Name 2" is sufficient. + * + * This returns an absolute path in UTF-8 encoding, and is guaranteed to + * end with a path separator ('\\' on Windows, '/' most other places). + * + * The pointer returned by this function is owned by you. Please call + * SDL_free() on the pointer when you are done with it, or it will be a + * memory leak. This is not necessarily a fast call, though, so you should + * call this once near startup and save the string if you need it. + * + * You should assume the path returned by this function is the only safe + * place to write files (and that SDL_GetBasePath(), while it might be + * writable, or even the parent of the returned path, aren't where you + * should be writing things). + * + * Some platforms can't determine the pref path, and on other + * platforms, this might be meaningless. In such cases, this function will + * return NULL. + * + * \param org The name of your organization. + * \param app The name of your application. + * \return UTF-8 string of user dir in platform-dependent notation. NULL + * if there's a problem (creating directory failed, etc). + * + * \sa SDL_GetBasePath + */ +extern DECLSPEC char *SDLCALL SDL_GetPrefPath(const char *org, const char *app); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_system_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_gamecontroller.h b/lib/SDL2/include/SDL_gamecontroller.h new file mode 100644 index 0000000000..b00ad713d1 --- /dev/null +++ b/lib/SDL2/include/SDL_gamecontroller.h @@ -0,0 +1,316 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_gamecontroller.h + * + * Include file for SDL game controller event handling + */ + +#ifndef _SDL_gamecontroller_h +#define _SDL_gamecontroller_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_rwops.h" +#include "SDL_joystick.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file SDL_gamecontroller.h + * + * In order to use these functions, SDL_Init() must have been called + * with the ::SDL_INIT_JOYSTICK flag. This causes SDL to scan the system + * for game controllers, and load appropriate drivers. + * + * If you would like to receive controller updates while the application + * is in the background, you should set the following hint before calling + * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS + */ + +/* The gamecontroller structure used to identify an SDL game controller */ +struct _SDL_GameController; +typedef struct _SDL_GameController SDL_GameController; + + +typedef enum +{ + SDL_CONTROLLER_BINDTYPE_NONE = 0, + SDL_CONTROLLER_BINDTYPE_BUTTON, + SDL_CONTROLLER_BINDTYPE_AXIS, + SDL_CONTROLLER_BINDTYPE_HAT +} SDL_GameControllerBindType; + +/** + * Get the SDL joystick layer binding for this controller button/axis mapping + */ +typedef struct SDL_GameControllerButtonBind +{ + SDL_GameControllerBindType bindType; + union + { + int button; + int axis; + struct { + int hat; + int hat_mask; + } hat; + } value; + +} SDL_GameControllerButtonBind; + + +/** + * To count the number of game controllers in the system for the following: + * int nJoysticks = SDL_NumJoysticks(); + * int nGameControllers = 0; + * for ( int i = 0; i < nJoysticks; i++ ) { + * if ( SDL_IsGameController(i) ) { + * nGameControllers++; + * } + * } + * + * Using the SDL_HINT_GAMECONTROLLERCONFIG hint or the SDL_GameControllerAddMapping you can add support for controllers SDL is unaware of or cause an existing controller to have a different binding. The format is: + * guid,name,mappings + * + * Where GUID is the string value from SDL_JoystickGetGUIDString(), name is the human readable string for the device and mappings are controller mappings to joystick ones. + * Under Windows there is a reserved GUID of "xinput" that covers any XInput devices. + * The mapping format for joystick is: + * bX - a joystick button, index X + * hX.Y - hat X with value Y + * aX - axis X of the joystick + * Buttons can be used as a controller axis and vice versa. + * + * This string shows an example of a valid mapping for a controller + * "341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7", + * + */ + +/** + * Load a set of mappings from a seekable SDL data stream (memory or file), filtered by the current SDL_GetPlatform() + * A community sourced database of controllers is available at https://raw.github.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt + * + * If \c freerw is non-zero, the stream will be closed after being read. + * + * \return number of mappings added, -1 on error + */ +extern DECLSPEC int SDLCALL SDL_GameControllerAddMappingsFromRW( SDL_RWops * rw, int freerw ); + +/** + * Load a set of mappings from a file, filtered by the current SDL_GetPlatform() + * + * Convenience macro. + */ +#define SDL_GameControllerAddMappingsFromFile(file) SDL_GameControllerAddMappingsFromRW(SDL_RWFromFile(file, "rb"), 1) + +/** + * Add or update an existing mapping configuration + * + * \return 1 if mapping is added, 0 if updated, -1 on error + */ +extern DECLSPEC int SDLCALL SDL_GameControllerAddMapping( const char* mappingString ); + +/** + * Get a mapping string for a GUID + * + * \return the mapping string. Must be freed with SDL_free. Returns NULL if no mapping is available + */ +extern DECLSPEC char * SDLCALL SDL_GameControllerMappingForGUID( SDL_JoystickGUID guid ); + +/** + * Get a mapping string for an open GameController + * + * \return the mapping string. Must be freed with SDL_free. Returns NULL if no mapping is available + */ +extern DECLSPEC char * SDLCALL SDL_GameControllerMapping( SDL_GameController * gamecontroller ); + +/** + * Is the joystick on this index supported by the game controller interface? + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsGameController(int joystick_index); + + +/** + * Get the implementation dependent name of a game controller. + * This can be called before any controllers are opened. + * If no name can be found, this function returns NULL. + */ +extern DECLSPEC const char *SDLCALL SDL_GameControllerNameForIndex(int joystick_index); + +/** + * Open a game controller for use. + * The index passed as an argument refers to the N'th game controller on the system. + * This index is the value which will identify this controller in future controller + * events. + * + * \return A controller identifier, or NULL if an error occurred. + */ +extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerOpen(int joystick_index); + +/** + * Return the name for this currently opened controller + */ +extern DECLSPEC const char *SDLCALL SDL_GameControllerName(SDL_GameController *gamecontroller); + +/** + * Returns SDL_TRUE if the controller has been opened and currently connected, + * or SDL_FALSE if it has not. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerGetAttached(SDL_GameController *gamecontroller); + +/** + * Get the underlying joystick object used by a controller + */ +extern DECLSPEC SDL_Joystick *SDLCALL SDL_GameControllerGetJoystick(SDL_GameController *gamecontroller); + +/** + * Enable/disable controller event polling. + * + * If controller events are disabled, you must call SDL_GameControllerUpdate() + * yourself and check the state of the controller when you want controller + * information. + * + * The state can be one of ::SDL_QUERY, ::SDL_ENABLE or ::SDL_IGNORE. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerEventState(int state); + +/** + * Update the current state of the open game controllers. + * + * This is called automatically by the event loop if any game controller + * events are enabled. + */ +extern DECLSPEC void SDLCALL SDL_GameControllerUpdate(void); + + +/** + * The list of axes available from a controller + */ +typedef enum +{ + SDL_CONTROLLER_AXIS_INVALID = -1, + SDL_CONTROLLER_AXIS_LEFTX, + SDL_CONTROLLER_AXIS_LEFTY, + SDL_CONTROLLER_AXIS_RIGHTX, + SDL_CONTROLLER_AXIS_RIGHTY, + SDL_CONTROLLER_AXIS_TRIGGERLEFT, + SDL_CONTROLLER_AXIS_TRIGGERRIGHT, + SDL_CONTROLLER_AXIS_MAX +} SDL_GameControllerAxis; + +/** + * turn this string into a axis mapping + */ +extern DECLSPEC SDL_GameControllerAxis SDLCALL SDL_GameControllerGetAxisFromString(const char *pchString); + +/** + * turn this axis enum into a string mapping + */ +extern DECLSPEC const char* SDLCALL SDL_GameControllerGetStringForAxis(SDL_GameControllerAxis axis); + +/** + * Get the SDL joystick layer binding for this controller button mapping + */ +extern DECLSPEC SDL_GameControllerButtonBind SDLCALL +SDL_GameControllerGetBindForAxis(SDL_GameController *gamecontroller, + SDL_GameControllerAxis axis); + +/** + * Get the current state of an axis control on a game controller. + * + * The state is a value ranging from -32768 to 32767. + * + * The axis indices start at index 0. + */ +extern DECLSPEC Sint16 SDLCALL +SDL_GameControllerGetAxis(SDL_GameController *gamecontroller, + SDL_GameControllerAxis axis); + +/** + * The list of buttons available from a controller + */ +typedef enum +{ + SDL_CONTROLLER_BUTTON_INVALID = -1, + SDL_CONTROLLER_BUTTON_A, + SDL_CONTROLLER_BUTTON_B, + SDL_CONTROLLER_BUTTON_X, + SDL_CONTROLLER_BUTTON_Y, + SDL_CONTROLLER_BUTTON_BACK, + SDL_CONTROLLER_BUTTON_GUIDE, + SDL_CONTROLLER_BUTTON_START, + SDL_CONTROLLER_BUTTON_LEFTSTICK, + SDL_CONTROLLER_BUTTON_RIGHTSTICK, + SDL_CONTROLLER_BUTTON_LEFTSHOULDER, + SDL_CONTROLLER_BUTTON_RIGHTSHOULDER, + SDL_CONTROLLER_BUTTON_DPAD_UP, + SDL_CONTROLLER_BUTTON_DPAD_DOWN, + SDL_CONTROLLER_BUTTON_DPAD_LEFT, + SDL_CONTROLLER_BUTTON_DPAD_RIGHT, + SDL_CONTROLLER_BUTTON_MAX +} SDL_GameControllerButton; + +/** + * turn this string into a button mapping + */ +extern DECLSPEC SDL_GameControllerButton SDLCALL SDL_GameControllerGetButtonFromString(const char *pchString); + +/** + * turn this button enum into a string mapping + */ +extern DECLSPEC const char* SDLCALL SDL_GameControllerGetStringForButton(SDL_GameControllerButton button); + +/** + * Get the SDL joystick layer binding for this controller button mapping + */ +extern DECLSPEC SDL_GameControllerButtonBind SDLCALL +SDL_GameControllerGetBindForButton(SDL_GameController *gamecontroller, + SDL_GameControllerButton button); + + +/** + * Get the current state of a button on a game controller. + * + * The button indices start at index 0. + */ +extern DECLSPEC Uint8 SDLCALL SDL_GameControllerGetButton(SDL_GameController *gamecontroller, + SDL_GameControllerButton button); + +/** + * Close a controller previously opened with SDL_GameControllerOpen(). + */ +extern DECLSPEC void SDLCALL SDL_GameControllerClose(SDL_GameController *gamecontroller); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_gamecontroller_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_gesture.h b/lib/SDL2/include/SDL_gesture.h new file mode 100644 index 0000000000..dbc1692423 --- /dev/null +++ b/lib/SDL2/include/SDL_gesture.h @@ -0,0 +1,87 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_gesture.h + * + * Include file for SDL gesture event handling. + */ + +#ifndef _SDL_gesture_h +#define _SDL_gesture_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" + +#include "SDL_touch.h" + + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef Sint64 SDL_GestureID; + +/* Function prototypes */ + +/** + * \brief Begin Recording a gesture on the specified touch, or all touches (-1) + * + * + */ +extern DECLSPEC int SDLCALL SDL_RecordGesture(SDL_TouchID touchId); + + +/** + * \brief Save all currently loaded Dollar Gesture templates + * + * + */ +extern DECLSPEC int SDLCALL SDL_SaveAllDollarTemplates(SDL_RWops *dst); + +/** + * \brief Save a currently loaded Dollar Gesture template + * + * + */ +extern DECLSPEC int SDLCALL SDL_SaveDollarTemplate(SDL_GestureID gestureId,SDL_RWops *dst); + + +/** + * \brief Load Dollar Gesture templates from a file + * + * + */ +extern DECLSPEC int SDLCALL SDL_LoadDollarTemplates(SDL_TouchID touchId, SDL_RWops *src); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_gesture_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_haptic.h b/lib/SDL2/include/SDL_haptic.h new file mode 100644 index 0000000000..234975abe3 --- /dev/null +++ b/lib/SDL2/include/SDL_haptic.h @@ -0,0 +1,1225 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_haptic.h + * + * \brief The SDL Haptic subsystem allows you to control haptic (force feedback) + * devices. + * + * The basic usage is as follows: + * - Initialize the Subsystem (::SDL_INIT_HAPTIC). + * - Open a Haptic Device. + * - SDL_HapticOpen() to open from index. + * - SDL_HapticOpenFromJoystick() to open from an existing joystick. + * - Create an effect (::SDL_HapticEffect). + * - Upload the effect with SDL_HapticNewEffect(). + * - Run the effect with SDL_HapticRunEffect(). + * - (optional) Free the effect with SDL_HapticDestroyEffect(). + * - Close the haptic device with SDL_HapticClose(). + * + * \par Simple rumble example: + * \code + * SDL_Haptic *haptic; + * + * // Open the device + * haptic = SDL_HapticOpen( 0 ); + * if (haptic == NULL) + * return -1; + * + * // Initialize simple rumble + * if (SDL_HapticRumbleInit( haptic ) != 0) + * return -1; + * + * // Play effect at 50% strength for 2 seconds + * if (SDL_HapticRumblePlay( haptic, 0.5, 2000 ) != 0) + * return -1; + * SDL_Delay( 2000 ); + * + * // Clean up + * SDL_HapticClose( haptic ); + * \endcode + * + * \par Complete example: + * \code + * int test_haptic( SDL_Joystick * joystick ) { + * SDL_Haptic *haptic; + * SDL_HapticEffect effect; + * int effect_id; + * + * // Open the device + * haptic = SDL_HapticOpenFromJoystick( joystick ); + * if (haptic == NULL) return -1; // Most likely joystick isn't haptic + * + * // See if it can do sine waves + * if ((SDL_HapticQuery(haptic) & SDL_HAPTIC_SINE)==0) { + * SDL_HapticClose(haptic); // No sine effect + * return -1; + * } + * + * // Create the effect + * memset( &effect, 0, sizeof(SDL_HapticEffect) ); // 0 is safe default + * effect.type = SDL_HAPTIC_SINE; + * effect.periodic.direction.type = SDL_HAPTIC_POLAR; // Polar coordinates + * effect.periodic.direction.dir[0] = 18000; // Force comes from south + * effect.periodic.period = 1000; // 1000 ms + * effect.periodic.magnitude = 20000; // 20000/32767 strength + * effect.periodic.length = 5000; // 5 seconds long + * effect.periodic.attack_length = 1000; // Takes 1 second to get max strength + * effect.periodic.fade_length = 1000; // Takes 1 second to fade away + * + * // Upload the effect + * effect_id = SDL_HapticNewEffect( haptic, &effect ); + * + * // Test the effect + * SDL_HapticRunEffect( haptic, effect_id, 1 ); + * SDL_Delay( 5000); // Wait for the effect to finish + * + * // We destroy the effect, although closing the device also does this + * SDL_HapticDestroyEffect( haptic, effect_id ); + * + * // Close the device + * SDL_HapticClose(haptic); + * + * return 0; // Success + * } + * \endcode + * + * You can also find out more information on my blog: + * http://bobbens.dyndns.org/journal/2010/sdl_haptic/ + * + * \author Edgar Simo Serra + */ + +#ifndef _SDL_haptic_h +#define _SDL_haptic_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_joystick.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * \typedef SDL_Haptic + * + * \brief The haptic structure used to identify an SDL haptic. + * + * \sa SDL_HapticOpen + * \sa SDL_HapticOpenFromJoystick + * \sa SDL_HapticClose + */ +struct _SDL_Haptic; +typedef struct _SDL_Haptic SDL_Haptic; + + +/** + * \name Haptic features + * + * Different haptic features a device can have. + */ +/* @{ */ + +/** + * \name Haptic effects + */ +/* @{ */ + +/** + * \brief Constant effect supported. + * + * Constant haptic effect. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_CONSTANT (1<<0) + +/** + * \brief Sine wave effect supported. + * + * Periodic haptic effect that simulates sine waves. + * + * \sa SDL_HapticPeriodic + */ +#define SDL_HAPTIC_SINE (1<<1) + +/** + * \brief Left/Right effect supported. + * + * Haptic effect for direct control over high/low frequency motors. + * + * \sa SDL_HapticLeftRight + * \warning this value was SDL_HAPTIC_SQUARE right before 2.0.0 shipped. Sorry, + * we ran out of bits, and this is important for XInput devices. + */ +#define SDL_HAPTIC_LEFTRIGHT (1<<2) + +/* !!! FIXME: put this back when we have more bits in 2.1 */ +/* #define SDL_HAPTIC_SQUARE (1<<2) */ + +/** + * \brief Triangle wave effect supported. + * + * Periodic haptic effect that simulates triangular waves. + * + * \sa SDL_HapticPeriodic + */ +#define SDL_HAPTIC_TRIANGLE (1<<3) + +/** + * \brief Sawtoothup wave effect supported. + * + * Periodic haptic effect that simulates saw tooth up waves. + * + * \sa SDL_HapticPeriodic + */ +#define SDL_HAPTIC_SAWTOOTHUP (1<<4) + +/** + * \brief Sawtoothdown wave effect supported. + * + * Periodic haptic effect that simulates saw tooth down waves. + * + * \sa SDL_HapticPeriodic + */ +#define SDL_HAPTIC_SAWTOOTHDOWN (1<<5) + +/** + * \brief Ramp effect supported. + * + * Ramp haptic effect. + * + * \sa SDL_HapticRamp + */ +#define SDL_HAPTIC_RAMP (1<<6) + +/** + * \brief Spring effect supported - uses axes position. + * + * Condition haptic effect that simulates a spring. Effect is based on the + * axes position. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_SPRING (1<<7) + +/** + * \brief Damper effect supported - uses axes velocity. + * + * Condition haptic effect that simulates dampening. Effect is based on the + * axes velocity. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_DAMPER (1<<8) + +/** + * \brief Inertia effect supported - uses axes acceleration. + * + * Condition haptic effect that simulates inertia. Effect is based on the axes + * acceleration. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_INERTIA (1<<9) + +/** + * \brief Friction effect supported - uses axes movement. + * + * Condition haptic effect that simulates friction. Effect is based on the + * axes movement. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_FRICTION (1<<10) + +/** + * \brief Custom effect is supported. + * + * User defined custom haptic effect. + */ +#define SDL_HAPTIC_CUSTOM (1<<11) + +/* @} *//* Haptic effects */ + +/* These last few are features the device has, not effects */ + +/** + * \brief Device can set global gain. + * + * Device supports setting the global gain. + * + * \sa SDL_HapticSetGain + */ +#define SDL_HAPTIC_GAIN (1<<12) + +/** + * \brief Device can set autocenter. + * + * Device supports setting autocenter. + * + * \sa SDL_HapticSetAutocenter + */ +#define SDL_HAPTIC_AUTOCENTER (1<<13) + +/** + * \brief Device can be queried for effect status. + * + * Device can be queried for effect status. + * + * \sa SDL_HapticGetEffectStatus + */ +#define SDL_HAPTIC_STATUS (1<<14) + +/** + * \brief Device can be paused. + * + * \sa SDL_HapticPause + * \sa SDL_HapticUnpause + */ +#define SDL_HAPTIC_PAUSE (1<<15) + + +/** + * \name Direction encodings + */ +/* @{ */ + +/** + * \brief Uses polar coordinates for the direction. + * + * \sa SDL_HapticDirection + */ +#define SDL_HAPTIC_POLAR 0 + +/** + * \brief Uses cartesian coordinates for the direction. + * + * \sa SDL_HapticDirection + */ +#define SDL_HAPTIC_CARTESIAN 1 + +/** + * \brief Uses spherical coordinates for the direction. + * + * \sa SDL_HapticDirection + */ +#define SDL_HAPTIC_SPHERICAL 2 + +/* @} *//* Direction encodings */ + +/* @} *//* Haptic features */ + +/* + * Misc defines. + */ + +/** + * \brief Used to play a device an infinite number of times. + * + * \sa SDL_HapticRunEffect + */ +#define SDL_HAPTIC_INFINITY 4294967295U + + +/** + * \brief Structure that represents a haptic direction. + * + * Directions can be specified by: + * - ::SDL_HAPTIC_POLAR : Specified by polar coordinates. + * - ::SDL_HAPTIC_CARTESIAN : Specified by cartesian coordinates. + * - ::SDL_HAPTIC_SPHERICAL : Specified by spherical coordinates. + * + * Cardinal directions of the haptic device are relative to the positioning + * of the device. North is considered to be away from the user. + * + * The following diagram represents the cardinal directions: + * \verbatim + .--. + |__| .-------. + |=.| |.-----.| + |--| || || + | | |'-----'| + |__|~')_____(' + [ COMPUTER ] + + + North (0,-1) + ^ + | + | + (1,0) West <----[ HAPTIC ]----> East (-1,0) + | + | + v + South (0,1) + + + [ USER ] + \|||/ + (o o) + ---ooO-(_)-Ooo--- + \endverbatim + * + * If type is ::SDL_HAPTIC_POLAR, direction is encoded by hundredths of a + * degree starting north and turning clockwise. ::SDL_HAPTIC_POLAR only uses + * the first \c dir parameter. The cardinal directions would be: + * - North: 0 (0 degrees) + * - East: 9000 (90 degrees) + * - South: 18000 (180 degrees) + * - West: 27000 (270 degrees) + * + * If type is ::SDL_HAPTIC_CARTESIAN, direction is encoded by three positions + * (X axis, Y axis and Z axis (with 3 axes)). ::SDL_HAPTIC_CARTESIAN uses + * the first three \c dir parameters. The cardinal directions would be: + * - North: 0,-1, 0 + * - East: -1, 0, 0 + * - South: 0, 1, 0 + * - West: 1, 0, 0 + * + * The Z axis represents the height of the effect if supported, otherwise + * it's unused. In cartesian encoding (1, 2) would be the same as (2, 4), you + * can use any multiple you want, only the direction matters. + * + * If type is ::SDL_HAPTIC_SPHERICAL, direction is encoded by two rotations. + * The first two \c dir parameters are used. The \c dir parameters are as + * follows (all values are in hundredths of degrees): + * - Degrees from (1, 0) rotated towards (0, 1). + * - Degrees towards (0, 0, 1) (device needs at least 3 axes). + * + * + * Example of force coming from the south with all encodings (force coming + * from the south means the user will have to pull the stick to counteract): + * \code + * SDL_HapticDirection direction; + * + * // Cartesian directions + * direction.type = SDL_HAPTIC_CARTESIAN; // Using cartesian direction encoding. + * direction.dir[0] = 0; // X position + * direction.dir[1] = 1; // Y position + * // Assuming the device has 2 axes, we don't need to specify third parameter. + * + * // Polar directions + * direction.type = SDL_HAPTIC_POLAR; // We'll be using polar direction encoding. + * direction.dir[0] = 18000; // Polar only uses first parameter + * + * // Spherical coordinates + * direction.type = SDL_HAPTIC_SPHERICAL; // Spherical encoding + * direction.dir[0] = 9000; // Since we only have two axes we don't need more parameters. + * \endcode + * + * \sa SDL_HAPTIC_POLAR + * \sa SDL_HAPTIC_CARTESIAN + * \sa SDL_HAPTIC_SPHERICAL + * \sa SDL_HapticEffect + * \sa SDL_HapticNumAxes + */ +typedef struct SDL_HapticDirection +{ + Uint8 type; /**< The type of encoding. */ + Sint32 dir[3]; /**< The encoded direction. */ +} SDL_HapticDirection; + + +/** + * \brief A structure containing a template for a Constant effect. + * + * The struct is exclusive to the ::SDL_HAPTIC_CONSTANT effect. + * + * A constant effect applies a constant force in the specified direction + * to the joystick. + * + * \sa SDL_HAPTIC_CONSTANT + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticConstant +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_CONSTANT */ + SDL_HapticDirection direction; /**< Direction of the effect. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Constant */ + Sint16 level; /**< Strength of the constant effect. */ + + /* Envelope */ + Uint16 attack_length; /**< Duration of the attack. */ + Uint16 attack_level; /**< Level at the start of the attack. */ + Uint16 fade_length; /**< Duration of the fade. */ + Uint16 fade_level; /**< Level at the end of the fade. */ +} SDL_HapticConstant; + +/** + * \brief A structure containing a template for a Periodic effect. + * + * The struct handles the following effects: + * - ::SDL_HAPTIC_SINE + * - ::SDL_HAPTIC_LEFTRIGHT + * - ::SDL_HAPTIC_TRIANGLE + * - ::SDL_HAPTIC_SAWTOOTHUP + * - ::SDL_HAPTIC_SAWTOOTHDOWN + * + * A periodic effect consists in a wave-shaped effect that repeats itself + * over time. The type determines the shape of the wave and the parameters + * determine the dimensions of the wave. + * + * Phase is given by hundredth of a cycle meaning that giving the phase a value + * of 9000 will displace it 25% of its period. Here are sample values: + * - 0: No phase displacement. + * - 9000: Displaced 25% of its period. + * - 18000: Displaced 50% of its period. + * - 27000: Displaced 75% of its period. + * - 36000: Displaced 100% of its period, same as 0, but 0 is preferred. + * + * Examples: + * \verbatim + SDL_HAPTIC_SINE + __ __ __ __ + / \ / \ / \ / + / \__/ \__/ \__/ + + SDL_HAPTIC_SQUARE + __ __ __ __ __ + | | | | | | | | | | + | |__| |__| |__| |__| | + + SDL_HAPTIC_TRIANGLE + /\ /\ /\ /\ /\ + / \ / \ / \ / \ / + / \/ \/ \/ \/ + + SDL_HAPTIC_SAWTOOTHUP + /| /| /| /| /| /| /| + / | / | / | / | / | / | / | + / |/ |/ |/ |/ |/ |/ | + + SDL_HAPTIC_SAWTOOTHDOWN + \ |\ |\ |\ |\ |\ |\ | + \ | \ | \ | \ | \ | \ | \ | + \| \| \| \| \| \| \| + \endverbatim + * + * \sa SDL_HAPTIC_SINE + * \sa SDL_HAPTIC_LEFTRIGHT + * \sa SDL_HAPTIC_TRIANGLE + * \sa SDL_HAPTIC_SAWTOOTHUP + * \sa SDL_HAPTIC_SAWTOOTHDOWN + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticPeriodic +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_SINE, ::SDL_HAPTIC_LEFTRIGHT, + ::SDL_HAPTIC_TRIANGLE, ::SDL_HAPTIC_SAWTOOTHUP or + ::SDL_HAPTIC_SAWTOOTHDOWN */ + SDL_HapticDirection direction; /**< Direction of the effect. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Periodic */ + Uint16 period; /**< Period of the wave. */ + Sint16 magnitude; /**< Peak value. */ + Sint16 offset; /**< Mean value of the wave. */ + Uint16 phase; /**< Horizontal shift given by hundredth of a cycle. */ + + /* Envelope */ + Uint16 attack_length; /**< Duration of the attack. */ + Uint16 attack_level; /**< Level at the start of the attack. */ + Uint16 fade_length; /**< Duration of the fade. */ + Uint16 fade_level; /**< Level at the end of the fade. */ +} SDL_HapticPeriodic; + +/** + * \brief A structure containing a template for a Condition effect. + * + * The struct handles the following effects: + * - ::SDL_HAPTIC_SPRING: Effect based on axes position. + * - ::SDL_HAPTIC_DAMPER: Effect based on axes velocity. + * - ::SDL_HAPTIC_INERTIA: Effect based on axes acceleration. + * - ::SDL_HAPTIC_FRICTION: Effect based on axes movement. + * + * Direction is handled by condition internals instead of a direction member. + * The condition effect specific members have three parameters. The first + * refers to the X axis, the second refers to the Y axis and the third + * refers to the Z axis. The right terms refer to the positive side of the + * axis and the left terms refer to the negative side of the axis. Please + * refer to the ::SDL_HapticDirection diagram for which side is positive and + * which is negative. + * + * \sa SDL_HapticDirection + * \sa SDL_HAPTIC_SPRING + * \sa SDL_HAPTIC_DAMPER + * \sa SDL_HAPTIC_INERTIA + * \sa SDL_HAPTIC_FRICTION + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticCondition +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_SPRING, ::SDL_HAPTIC_DAMPER, + ::SDL_HAPTIC_INERTIA or ::SDL_HAPTIC_FRICTION */ + SDL_HapticDirection direction; /**< Direction of the effect - Not used ATM. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Condition */ + Uint16 right_sat[3]; /**< Level when joystick is to the positive side. */ + Uint16 left_sat[3]; /**< Level when joystick is to the negative side. */ + Sint16 right_coeff[3]; /**< How fast to increase the force towards the positive side. */ + Sint16 left_coeff[3]; /**< How fast to increase the force towards the negative side. */ + Uint16 deadband[3]; /**< Size of the dead zone. */ + Sint16 center[3]; /**< Position of the dead zone. */ +} SDL_HapticCondition; + +/** + * \brief A structure containing a template for a Ramp effect. + * + * This struct is exclusively for the ::SDL_HAPTIC_RAMP effect. + * + * The ramp effect starts at start strength and ends at end strength. + * It augments in linear fashion. If you use attack and fade with a ramp + * the effects get added to the ramp effect making the effect become + * quadratic instead of linear. + * + * \sa SDL_HAPTIC_RAMP + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticRamp +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_RAMP */ + SDL_HapticDirection direction; /**< Direction of the effect. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Ramp */ + Sint16 start; /**< Beginning strength level. */ + Sint16 end; /**< Ending strength level. */ + + /* Envelope */ + Uint16 attack_length; /**< Duration of the attack. */ + Uint16 attack_level; /**< Level at the start of the attack. */ + Uint16 fade_length; /**< Duration of the fade. */ + Uint16 fade_level; /**< Level at the end of the fade. */ +} SDL_HapticRamp; + +/** + * \brief A structure containing a template for a Left/Right effect. + * + * This struct is exclusively for the ::SDL_HAPTIC_LEFTRIGHT effect. + * + * The Left/Right effect is used to explicitly control the large and small + * motors, commonly found in modern game controllers. One motor is high + * frequency, the other is low frequency. + * + * \sa SDL_HAPTIC_LEFTRIGHT + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticLeftRight +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_LEFTRIGHT */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + + /* Rumble */ + Uint16 large_magnitude; /**< Control of the large controller motor. */ + Uint16 small_magnitude; /**< Control of the small controller motor. */ +} SDL_HapticLeftRight; + +/** + * \brief A structure containing a template for the ::SDL_HAPTIC_CUSTOM effect. + * + * A custom force feedback effect is much like a periodic effect, where the + * application can define its exact shape. You will have to allocate the + * data yourself. Data should consist of channels * samples Uint16 samples. + * + * If channels is one, the effect is rotated using the defined direction. + * Otherwise it uses the samples in data for the different axes. + * + * \sa SDL_HAPTIC_CUSTOM + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticCustom +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_CUSTOM */ + SDL_HapticDirection direction; /**< Direction of the effect. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Custom */ + Uint8 channels; /**< Axes to use, minimum of one. */ + Uint16 period; /**< Sample periods. */ + Uint16 samples; /**< Amount of samples. */ + Uint16 *data; /**< Should contain channels*samples items. */ + + /* Envelope */ + Uint16 attack_length; /**< Duration of the attack. */ + Uint16 attack_level; /**< Level at the start of the attack. */ + Uint16 fade_length; /**< Duration of the fade. */ + Uint16 fade_level; /**< Level at the end of the fade. */ +} SDL_HapticCustom; + +/** + * \brief The generic template for any haptic effect. + * + * All values max at 32767 (0x7FFF). Signed values also can be negative. + * Time values unless specified otherwise are in milliseconds. + * + * You can also pass ::SDL_HAPTIC_INFINITY to length instead of a 0-32767 + * value. Neither delay, interval, attack_length nor fade_length support + * ::SDL_HAPTIC_INFINITY. Fade will also not be used since effect never ends. + * + * Additionally, the ::SDL_HAPTIC_RAMP effect does not support a duration of + * ::SDL_HAPTIC_INFINITY. + * + * Button triggers may not be supported on all devices, it is advised to not + * use them if possible. Buttons start at index 1 instead of index 0 like + * the joystick. + * + * If both attack_length and fade_level are 0, the envelope is not used, + * otherwise both values are used. + * + * Common parts: + * \code + * // Replay - All effects have this + * Uint32 length; // Duration of effect (ms). + * Uint16 delay; // Delay before starting effect. + * + * // Trigger - All effects have this + * Uint16 button; // Button that triggers effect. + * Uint16 interval; // How soon before effect can be triggered again. + * + * // Envelope - All effects except condition effects have this + * Uint16 attack_length; // Duration of the attack (ms). + * Uint16 attack_level; // Level at the start of the attack. + * Uint16 fade_length; // Duration of the fade out (ms). + * Uint16 fade_level; // Level at the end of the fade. + * \endcode + * + * + * Here we have an example of a constant effect evolution in time: + * \verbatim + Strength + ^ + | + | effect level --> _________________ + | / \ + | / \ + | / \ + | / \ + | attack_level --> | \ + | | | <--- fade_level + | + +--------------------------------------------------> Time + [--] [---] + attack_length fade_length + + [------------------][-----------------------] + delay length + \endverbatim + * + * Note either the attack_level or the fade_level may be above the actual + * effect level. + * + * \sa SDL_HapticConstant + * \sa SDL_HapticPeriodic + * \sa SDL_HapticCondition + * \sa SDL_HapticRamp + * \sa SDL_HapticLeftRight + * \sa SDL_HapticCustom + */ +typedef union SDL_HapticEffect +{ + /* Common for all force feedback effects */ + Uint16 type; /**< Effect type. */ + SDL_HapticConstant constant; /**< Constant effect. */ + SDL_HapticPeriodic periodic; /**< Periodic effect. */ + SDL_HapticCondition condition; /**< Condition effect. */ + SDL_HapticRamp ramp; /**< Ramp effect. */ + SDL_HapticLeftRight leftright; /**< Left/Right effect. */ + SDL_HapticCustom custom; /**< Custom effect. */ +} SDL_HapticEffect; + + +/* Function prototypes */ +/** + * \brief Count the number of haptic devices attached to the system. + * + * \return Number of haptic devices detected on the system. + */ +extern DECLSPEC int SDLCALL SDL_NumHaptics(void); + +/** + * \brief Get the implementation dependent name of a Haptic device. + * + * This can be called before any joysticks are opened. + * If no name can be found, this function returns NULL. + * + * \param device_index Index of the device to get its name. + * \return Name of the device or NULL on error. + * + * \sa SDL_NumHaptics + */ +extern DECLSPEC const char *SDLCALL SDL_HapticName(int device_index); + +/** + * \brief Opens a Haptic device for usage. + * + * The index passed as an argument refers to the N'th Haptic device on this + * system. + * + * When opening a haptic device, its gain will be set to maximum and + * autocenter will be disabled. To modify these values use + * SDL_HapticSetGain() and SDL_HapticSetAutocenter(). + * + * \param device_index Index of the device to open. + * \return Device identifier or NULL on error. + * + * \sa SDL_HapticIndex + * \sa SDL_HapticOpenFromMouse + * \sa SDL_HapticOpenFromJoystick + * \sa SDL_HapticClose + * \sa SDL_HapticSetGain + * \sa SDL_HapticSetAutocenter + * \sa SDL_HapticPause + * \sa SDL_HapticStopAll + */ +extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpen(int device_index); + +/** + * \brief Checks if the haptic device at index has been opened. + * + * \param device_index Index to check to see if it has been opened. + * \return 1 if it has been opened or 0 if it hasn't. + * + * \sa SDL_HapticOpen + * \sa SDL_HapticIndex + */ +extern DECLSPEC int SDLCALL SDL_HapticOpened(int device_index); + +/** + * \brief Gets the index of a haptic device. + * + * \param haptic Haptic device to get the index of. + * \return The index of the haptic device or -1 on error. + * + * \sa SDL_HapticOpen + * \sa SDL_HapticOpened + */ +extern DECLSPEC int SDLCALL SDL_HapticIndex(SDL_Haptic * haptic); + +/** + * \brief Gets whether or not the current mouse has haptic capabilities. + * + * \return SDL_TRUE if the mouse is haptic, SDL_FALSE if it isn't. + * + * \sa SDL_HapticOpenFromMouse + */ +extern DECLSPEC int SDLCALL SDL_MouseIsHaptic(void); + +/** + * \brief Tries to open a haptic device from the current mouse. + * + * \return The haptic device identifier or NULL on error. + * + * \sa SDL_MouseIsHaptic + * \sa SDL_HapticOpen + */ +extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromMouse(void); + +/** + * \brief Checks to see if a joystick has haptic features. + * + * \param joystick Joystick to test for haptic capabilities. + * \return 1 if the joystick is haptic, 0 if it isn't + * or -1 if an error ocurred. + * + * \sa SDL_HapticOpenFromJoystick + */ +extern DECLSPEC int SDLCALL SDL_JoystickIsHaptic(SDL_Joystick * joystick); + +/** + * \brief Opens a Haptic device for usage from a Joystick device. + * + * You must still close the haptic device seperately. It will not be closed + * with the joystick. + * + * When opening from a joystick you should first close the haptic device before + * closing the joystick device. If not, on some implementations the haptic + * device will also get unallocated and you'll be unable to use force feedback + * on that device. + * + * \param joystick Joystick to create a haptic device from. + * \return A valid haptic device identifier on success or NULL on error. + * + * \sa SDL_HapticOpen + * \sa SDL_HapticClose + */ +extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromJoystick(SDL_Joystick * + joystick); + +/** + * \brief Closes a Haptic device previously opened with SDL_HapticOpen(). + * + * \param haptic Haptic device to close. + */ +extern DECLSPEC void SDLCALL SDL_HapticClose(SDL_Haptic * haptic); + +/** + * \brief Returns the number of effects a haptic device can store. + * + * On some platforms this isn't fully supported, and therefore is an + * approximation. Always check to see if your created effect was actually + * created and do not rely solely on SDL_HapticNumEffects(). + * + * \param haptic The haptic device to query effect max. + * \return The number of effects the haptic device can store or + * -1 on error. + * + * \sa SDL_HapticNumEffectsPlaying + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticNumEffects(SDL_Haptic * haptic); + +/** + * \brief Returns the number of effects a haptic device can play at the same + * time. + * + * This is not supported on all platforms, but will always return a value. + * Added here for the sake of completeness. + * + * \param haptic The haptic device to query maximum playing effects. + * \return The number of effects the haptic device can play at the same time + * or -1 on error. + * + * \sa SDL_HapticNumEffects + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticNumEffectsPlaying(SDL_Haptic * haptic); + +/** + * \brief Gets the haptic devices supported features in bitwise matter. + * + * Example: + * \code + * if (SDL_HapticQuery(haptic) & SDL_HAPTIC_CONSTANT) { + * printf("We have constant haptic effect!"); + * } + * \endcode + * + * \param haptic The haptic device to query. + * \return Haptic features in bitwise manner (OR'd). + * + * \sa SDL_HapticNumEffects + * \sa SDL_HapticEffectSupported + */ +extern DECLSPEC unsigned int SDLCALL SDL_HapticQuery(SDL_Haptic * haptic); + + +/** + * \brief Gets the number of haptic axes the device has. + * + * \sa SDL_HapticDirection + */ +extern DECLSPEC int SDLCALL SDL_HapticNumAxes(SDL_Haptic * haptic); + +/** + * \brief Checks to see if effect is supported by haptic. + * + * \param haptic Haptic device to check on. + * \param effect Effect to check to see if it is supported. + * \return SDL_TRUE if effect is supported, SDL_FALSE if it isn't or -1 on error. + * + * \sa SDL_HapticQuery + * \sa SDL_HapticNewEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticEffectSupported(SDL_Haptic * haptic, + SDL_HapticEffect * + effect); + +/** + * \brief Creates a new haptic effect on the device. + * + * \param haptic Haptic device to create the effect on. + * \param effect Properties of the effect to create. + * \return The id of the effect on success or -1 on error. + * + * \sa SDL_HapticUpdateEffect + * \sa SDL_HapticRunEffect + * \sa SDL_HapticDestroyEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticNewEffect(SDL_Haptic * haptic, + SDL_HapticEffect * effect); + +/** + * \brief Updates the properties of an effect. + * + * Can be used dynamically, although behaviour when dynamically changing + * direction may be strange. Specifically the effect may reupload itself + * and start playing from the start. You cannot change the type either when + * running SDL_HapticUpdateEffect(). + * + * \param haptic Haptic device that has the effect. + * \param effect Effect to update. + * \param data New effect properties to use. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticNewEffect + * \sa SDL_HapticRunEffect + * \sa SDL_HapticDestroyEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticUpdateEffect(SDL_Haptic * haptic, + int effect, + SDL_HapticEffect * data); + +/** + * \brief Runs the haptic effect on its associated haptic device. + * + * If iterations are ::SDL_HAPTIC_INFINITY, it'll run the effect over and over + * repeating the envelope (attack and fade) every time. If you only want the + * effect to last forever, set ::SDL_HAPTIC_INFINITY in the effect's length + * parameter. + * + * \param haptic Haptic device to run the effect on. + * \param effect Identifier of the haptic effect to run. + * \param iterations Number of iterations to run the effect. Use + * ::SDL_HAPTIC_INFINITY for infinity. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticStopEffect + * \sa SDL_HapticDestroyEffect + * \sa SDL_HapticGetEffectStatus + */ +extern DECLSPEC int SDLCALL SDL_HapticRunEffect(SDL_Haptic * haptic, + int effect, + Uint32 iterations); + +/** + * \brief Stops the haptic effect on its associated haptic device. + * + * \param haptic Haptic device to stop the effect on. + * \param effect Identifier of the effect to stop. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticRunEffect + * \sa SDL_HapticDestroyEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticStopEffect(SDL_Haptic * haptic, + int effect); + +/** + * \brief Destroys a haptic effect on the device. + * + * This will stop the effect if it's running. Effects are automatically + * destroyed when the device is closed. + * + * \param haptic Device to destroy the effect on. + * \param effect Identifier of the effect to destroy. + * + * \sa SDL_HapticNewEffect + */ +extern DECLSPEC void SDLCALL SDL_HapticDestroyEffect(SDL_Haptic * haptic, + int effect); + +/** + * \brief Gets the status of the current effect on the haptic device. + * + * Device must support the ::SDL_HAPTIC_STATUS feature. + * + * \param haptic Haptic device to query the effect status on. + * \param effect Identifier of the effect to query its status. + * \return 0 if it isn't playing, 1 if it is playing or -1 on error. + * + * \sa SDL_HapticRunEffect + * \sa SDL_HapticStopEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticGetEffectStatus(SDL_Haptic * haptic, + int effect); + +/** + * \brief Sets the global gain of the device. + * + * Device must support the ::SDL_HAPTIC_GAIN feature. + * + * The user may specify the maximum gain by setting the environment variable + * SDL_HAPTIC_GAIN_MAX which should be between 0 and 100. All calls to + * SDL_HapticSetGain() will scale linearly using SDL_HAPTIC_GAIN_MAX as the + * maximum. + * + * \param haptic Haptic device to set the gain on. + * \param gain Value to set the gain to, should be between 0 and 100. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticSetGain(SDL_Haptic * haptic, int gain); + +/** + * \brief Sets the global autocenter of the device. + * + * Autocenter should be between 0 and 100. Setting it to 0 will disable + * autocentering. + * + * Device must support the ::SDL_HAPTIC_AUTOCENTER feature. + * + * \param haptic Haptic device to set autocentering on. + * \param autocenter Value to set autocenter to, 0 disables autocentering. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticSetAutocenter(SDL_Haptic * haptic, + int autocenter); + +/** + * \brief Pauses a haptic device. + * + * Device must support the ::SDL_HAPTIC_PAUSE feature. Call + * SDL_HapticUnpause() to resume playback. + * + * Do not modify the effects nor add new ones while the device is paused. + * That can cause all sorts of weird errors. + * + * \param haptic Haptic device to pause. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticUnpause + */ +extern DECLSPEC int SDLCALL SDL_HapticPause(SDL_Haptic * haptic); + +/** + * \brief Unpauses a haptic device. + * + * Call to unpause after SDL_HapticPause(). + * + * \param haptic Haptic device to pause. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticPause + */ +extern DECLSPEC int SDLCALL SDL_HapticUnpause(SDL_Haptic * haptic); + +/** + * \brief Stops all the currently playing effects on a haptic device. + * + * \param haptic Haptic device to stop. + * \return 0 on success or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_HapticStopAll(SDL_Haptic * haptic); + +/** + * \brief Checks to see if rumble is supported on a haptic device. + * + * \param haptic Haptic device to check to see if it supports rumble. + * \return SDL_TRUE if effect is supported, SDL_FALSE if it isn't or -1 on error. + * + * \sa SDL_HapticRumbleInit + * \sa SDL_HapticRumblePlay + * \sa SDL_HapticRumbleStop + */ +extern DECLSPEC int SDLCALL SDL_HapticRumbleSupported(SDL_Haptic * haptic); + +/** + * \brief Initializes the haptic device for simple rumble playback. + * + * \param haptic Haptic device to initialize for simple rumble playback. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticOpen + * \sa SDL_HapticRumbleSupported + * \sa SDL_HapticRumblePlay + * \sa SDL_HapticRumbleStop + */ +extern DECLSPEC int SDLCALL SDL_HapticRumbleInit(SDL_Haptic * haptic); + +/** + * \brief Runs simple rumble on a haptic device + * + * \param haptic Haptic device to play rumble effect on. + * \param strength Strength of the rumble to play as a 0-1 float value. + * \param length Length of the rumble to play in milliseconds. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticRumbleSupported + * \sa SDL_HapticRumbleInit + * \sa SDL_HapticRumbleStop + */ +extern DECLSPEC int SDLCALL SDL_HapticRumblePlay(SDL_Haptic * haptic, float strength, Uint32 length ); + +/** + * \brief Stops the simple rumble on a haptic device. + * + * \param haptic Haptic to stop the rumble on. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticRumbleSupported + * \sa SDL_HapticRumbleInit + * \sa SDL_HapticRumblePlay + */ +extern DECLSPEC int SDLCALL SDL_HapticRumbleStop(SDL_Haptic * haptic); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_haptic_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_hints.h b/lib/SDL2/include/SDL_hints.h new file mode 100644 index 0000000000..b98ce6834c --- /dev/null +++ b/lib/SDL2/include/SDL_hints.h @@ -0,0 +1,517 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_hints.h + * + * Official documentation for SDL configuration variables + * + * This file contains functions to set and get configuration hints, + * as well as listing each of them alphabetically. + * + * The convention for naming hints is SDL_HINT_X, where "SDL_X" is + * the environment variable that can be used to override the default. + * + * In general these hints are just that - they may or may not be + * supported or applicable on any given platform, but they provide + * a way for an application or user to give the library a hint as + * to how they would like the library to work. + */ + +#ifndef _SDL_hints_h +#define _SDL_hints_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief A variable controlling how 3D acceleration is used to accelerate the SDL screen surface. + * + * SDL can try to accelerate the SDL screen surface by using streaming + * textures with a 3D rendering engine. This variable controls whether and + * how this is done. + * + * This variable can be set to the following values: + * "0" - Disable 3D acceleration + * "1" - Enable 3D acceleration, using the default renderer. + * "X" - Enable 3D acceleration, using X where X is one of the valid rendering drivers. (e.g. "direct3d", "opengl", etc.) + * + * By default SDL tries to make a best guess for each platform whether + * to use acceleration or not. + */ +#define SDL_HINT_FRAMEBUFFER_ACCELERATION "SDL_FRAMEBUFFER_ACCELERATION" + +/** + * \brief A variable specifying which render driver to use. + * + * If the application doesn't pick a specific renderer to use, this variable + * specifies the name of the preferred renderer. If the preferred renderer + * can't be initialized, the normal default renderer is used. + * + * This variable is case insensitive and can be set to the following values: + * "direct3d" + * "opengl" + * "opengles2" + * "opengles" + * "software" + * + * The default varies by platform, but it's the first one in the list that + * is available on the current platform. + */ +#define SDL_HINT_RENDER_DRIVER "SDL_RENDER_DRIVER" + +/** + * \brief A variable controlling whether the OpenGL render driver uses shaders if they are available. + * + * This variable can be set to the following values: + * "0" - Disable shaders + * "1" - Enable shaders + * + * By default shaders are used if OpenGL supports them. + */ +#define SDL_HINT_RENDER_OPENGL_SHADERS "SDL_RENDER_OPENGL_SHADERS" + +/** + * \brief A variable controlling whether the Direct3D device is initialized for thread-safe operations. + * + * This variable can be set to the following values: + * "0" - Thread-safety is not enabled (faster) + * "1" - Thread-safety is enabled + * + * By default the Direct3D device is created with thread-safety disabled. + */ +#define SDL_HINT_RENDER_DIRECT3D_THREADSAFE "SDL_RENDER_DIRECT3D_THREADSAFE" + +/** + * \brief A variable controlling whether to enable Direct3D 11+'s Debug Layer. + * + * This variable does not have any effect on the Direct3D 9 based renderer. + * + * This variable can be set to the following values: + * "0" - Disable Debug Layer use + * "1" - Enable Debug Layer use + * + * By default, SDL does not use Direct3D Debug Layer. + */ +#define SDL_HINT_RENDER_DIRECT3D11_DEBUG "SDL_HINT_RENDER_DIRECT3D11_DEBUG" + +/** + * \brief A variable controlling the scaling quality + * + * This variable can be set to the following values: + * "0" or "nearest" - Nearest pixel sampling + * "1" or "linear" - Linear filtering (supported by OpenGL and Direct3D) + * "2" or "best" - Currently this is the same as "linear" + * + * By default nearest pixel sampling is used + */ +#define SDL_HINT_RENDER_SCALE_QUALITY "SDL_RENDER_SCALE_QUALITY" + +/** + * \brief A variable controlling whether updates to the SDL screen surface should be synchronized with the vertical refresh, to avoid tearing. + * + * This variable can be set to the following values: + * "0" - Disable vsync + * "1" - Enable vsync + * + * By default SDL does not sync screen surface updates with vertical refresh. + */ +#define SDL_HINT_RENDER_VSYNC "SDL_RENDER_VSYNC" + +/** + * \brief A variable controlling whether the screensaver is enabled. + * + * This variable can be set to the following values: + * "0" - Disable screensaver + * "1" - Enable screensaver + * + * By default SDL will disable the screensaver. + */ +#define SDL_HINT_VIDEO_ALLOW_SCREENSAVER "SDL_VIDEO_ALLOW_SCREENSAVER" + +/** + * \brief A variable controlling whether the X11 VidMode extension should be used. + * + * This variable can be set to the following values: + * "0" - Disable XVidMode + * "1" - Enable XVidMode + * + * By default SDL will use XVidMode if it is available. + */ +#define SDL_HINT_VIDEO_X11_XVIDMODE "SDL_VIDEO_X11_XVIDMODE" + +/** + * \brief A variable controlling whether the X11 Xinerama extension should be used. + * + * This variable can be set to the following values: + * "0" - Disable Xinerama + * "1" - Enable Xinerama + * + * By default SDL will use Xinerama if it is available. + */ +#define SDL_HINT_VIDEO_X11_XINERAMA "SDL_VIDEO_X11_XINERAMA" + +/** + * \brief A variable controlling whether the X11 XRandR extension should be used. + * + * This variable can be set to the following values: + * "0" - Disable XRandR + * "1" - Enable XRandR + * + * By default SDL will not use XRandR because of window manager issues. + */ +#define SDL_HINT_VIDEO_X11_XRANDR "SDL_VIDEO_X11_XRANDR" + +/** + * \brief A variable controlling whether grabbing input grabs the keyboard + * + * This variable can be set to the following values: + * "0" - Grab will affect only the mouse + * "1" - Grab will affect mouse and keyboard + * + * By default SDL will not grab the keyboard so system shortcuts still work. + */ +#define SDL_HINT_GRAB_KEYBOARD "SDL_GRAB_KEYBOARD" + +/** +* \brief A variable controlling whether relative mouse mode is implemented using mouse warping +* +* This variable can be set to the following values: +* "0" - Relative mouse mode uses raw input +* "1" - Relative mouse mode uses mouse warping +* +* By default SDL will use raw input for relative mouse mode +*/ +#define SDL_HINT_MOUSE_RELATIVE_MODE_WARP "SDL_MOUSE_RELATIVE_MODE_WARP" + +/** + * \brief Minimize your SDL_Window if it loses key focus when in fullscreen mode. Defaults to true. + * + */ +#define SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS "SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS" + +/** + * \brief A variable controlling whether the idle timer is disabled on iOS. + * + * When an iOS app does not receive touches for some time, the screen is + * dimmed automatically. For games where the accelerometer is the only input + * this is problematic. This functionality can be disabled by setting this + * hint. + * + * This variable can be set to the following values: + * "0" - Enable idle timer + * "1" - Disable idle timer + */ +#define SDL_HINT_IDLE_TIMER_DISABLED "SDL_IOS_IDLE_TIMER_DISABLED" + +/** + * \brief A variable controlling which orientations are allowed on iOS. + * + * In some circumstances it is necessary to be able to explicitly control + * which UI orientations are allowed. + * + * This variable is a space delimited list of the following values: + * "LandscapeLeft", "LandscapeRight", "Portrait" "PortraitUpsideDown" + */ +#define SDL_HINT_ORIENTATIONS "SDL_IOS_ORIENTATIONS" + +/** + * \brief A variable controlling whether an Android built-in accelerometer should be + * listed as a joystick device, rather than listing actual joysticks only. + * + * This variable can be set to the following values: + * "0" - List only real joysticks and accept input from them + * "1" - List real joysticks along with the accelerometer as if it were a 3 axis joystick (the default). + */ +#define SDL_HINT_ACCELEROMETER_AS_JOYSTICK "SDL_ACCELEROMETER_AS_JOYSTICK" + + +/** + * \brief A variable that lets you disable the detection and use of Xinput gamepad devices + * + * The variable can be set to the following values: + * "0" - Disable XInput detection (only uses direct input) + * "1" - Enable XInput detection (the default) + */ +#define SDL_HINT_XINPUT_ENABLED "SDL_XINPUT_ENABLED" + + +/** + * \brief A variable that lets you manually hint extra gamecontroller db entries + * + * The variable should be newline delimited rows of gamecontroller config data, see SDL_gamecontroller.h + * + * This hint must be set before calling SDL_Init(SDL_INIT_GAMECONTROLLER) + * You can update mappings after the system is initialized with SDL_GameControllerMappingForGUID() and SDL_GameControllerAddMapping() + */ +#define SDL_HINT_GAMECONTROLLERCONFIG "SDL_GAMECONTROLLERCONFIG" + + +/** + * \brief A variable that lets you enable joystick (and gamecontroller) events even when your app is in the background. + * + * The variable can be set to the following values: + * "0" - Disable joystick & gamecontroller input events when the + * application is in the background. + * "1" - Enable joystick & gamecontroller input events when the + * application is in the background. + * + * The default value is "0". This hint may be set at any time. + */ +#define SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS "SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS" + + +/** + * \brief If set to 0 then never set the top most bit on a SDL Window, even if the video mode expects it. + * This is a debugging aid for developers and not expected to be used by end users. The default is "1" + * + * This variable can be set to the following values: + * "0" - don't allow topmost + * "1" - allow topmost + */ +#define SDL_HINT_ALLOW_TOPMOST "SDL_ALLOW_TOPMOST" + + +/** + * \brief A variable that controls the timer resolution, in milliseconds. + * + * The higher resolution the timer, the more frequently the CPU services + * timer interrupts, and the more precise delays are, but this takes up + * power and CPU time. This hint is only used on Windows 7 and earlier. + * + * See this blog post for more information: + * http://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/ + * + * If this variable is set to "0", the system timer resolution is not set. + * + * The default value is "1". This hint may be set at any time. + */ +#define SDL_HINT_TIMER_RESOLUTION "SDL_TIMER_RESOLUTION" + + +/** + * \brief If set to 1, then do not allow high-DPI windows. ("Retina" on Mac) + */ +#define SDL_HINT_VIDEO_HIGHDPI_DISABLED "SDL_VIDEO_HIGHDPI_DISABLED" + +/** + * \brief A variable that determines whether ctrl+click should generate a right-click event on Mac + * + * If present, holding ctrl while left clicking will generate a right click + * event when on Mac. + */ +#define SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK "SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK" + +/** +* \brief A variable specifying which shader compiler to preload when using the Chrome ANGLE binaries +* +* SDL has EGL and OpenGL ES2 support on Windows via the ANGLE project. It +* can use two different sets of binaries, those compiled by the user from source +* or those provided by the Chrome browser. In the later case, these binaries require +* that SDL loads a DLL providing the shader compiler. +* +* This variable can be set to the following values: +* "d3dcompiler_46.dll" - default, best for Vista or later. +* "d3dcompiler_43.dll" - for XP support. +* "none" - do not load any library, useful if you compiled ANGLE from source and included the compiler in your binaries. +* +*/ +#define SDL_HINT_VIDEO_WIN_D3DCOMPILER "SDL_VIDEO_WIN_D3DCOMPILER" + +/** +* \brief A variable that is the address of another SDL_Window* (as a hex string formatted with "%p"). +* +* If this hint is set before SDL_CreateWindowFrom() and the SDL_Window* it is set to has +* SDL_WINDOW_OPENGL set (and running on WGL only, currently), then two things will occur on the newly +* created SDL_Window: +* +* 1. Its pixel format will be set to the same pixel format as this SDL_Window. This is +* needed for example when sharing an OpenGL context across multiple windows. +* +* 2. The flag SDL_WINDOW_OPENGL will be set on the new window so it can be used for +* OpenGL rendering. +* +* This variable can be set to the following values: +* The address (as a string "%p") of the SDL_Window* that new windows created with SDL_CreateWindowFrom() should +* share a pixel format with. +*/ +#define SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT "SDL_VIDEO_WINDOW_SHARE_PIXEL_FORMAT" + +/* + * \brief A URL to a WinRT app's privacy policy + * + * All network-enabled WinRT apps must make a privacy policy available to its + * users. On Windows 8, 8.1, and RT, Microsoft mandates that this policy be + * be available in the Windows Settings charm, as accessed from within the app. + * SDL provides code to add a URL-based link there, which can point to the app's + * privacy policy. + * + * To setup a URL to an app's privacy policy, set SDL_HINT_WINRT_PRIVACY_POLICY_URL + * before calling any SDL_Init functions. The contents of the hint should + * be a valid URL. For example, "http://www.example.com". + * + * The default value is "", which will prevent SDL from adding a privacy policy + * link to the Settings charm. This hint should only be set during app init. + * + * The label text of an app's "Privacy Policy" link may be customized via another + * hint, SDL_HINT_WINRT_PRIVACY_POLICY_LABEL. + * + * Please note that on Windows Phone, Microsoft does not provide standard UI + * for displaying a privacy policy link, and as such, SDL_HINT_WINRT_PRIVACY_POLICY_URL + * will not get used on that platform. Network-enabled phone apps should display + * their privacy policy through some other, in-app means. + */ +#define SDL_HINT_WINRT_PRIVACY_POLICY_URL "SDL_HINT_WINRT_PRIVACY_POLICY_URL" + +/** \brief Label text for a WinRT app's privacy policy link + * + * Network-enabled WinRT apps must include a privacy policy. On Windows 8, 8.1, and RT, + * Microsoft mandates that this policy be available via the Windows Settings charm. + * SDL provides code to add a link there, with it's label text being set via the + * optional hint, SDL_HINT_WINRT_PRIVACY_POLICY_LABEL. + * + * Please note that a privacy policy's contents are not set via this hint. A separate + * hint, SDL_HINT_WINRT_PRIVACY_POLICY_URL, is used to link to the actual text of the + * policy. + * + * The contents of this hint should be encoded as a UTF8 string. + * + * The default value is "Privacy Policy". This hint should only be set during app + * initialization, preferably before any calls to SDL_Init. + * + * For additional information on linking to a privacy policy, see the documentation for + * SDL_HINT_WINRT_PRIVACY_POLICY_URL. + */ +#define SDL_HINT_WINRT_PRIVACY_POLICY_LABEL "SDL_HINT_WINRT_PRIVACY_POLICY_LABEL" + +/** \brief If set to 1, back button press events on Windows Phone 8+ will be marked as handled. + * + * TODO, WinRT: document SDL_HINT_WINRT_HANDLE_BACK_BUTTON need and use + * For now, more details on why this is needed can be found at the + * beginning of the following web page: + * http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj247550(v=vs.105).aspx + */ +#define SDL_HINT_WINRT_HANDLE_BACK_BUTTON "SDL_HINT_WINRT_HANDLE_BACK_BUTTON" + +/** + * \brief A variable that dictates policy for fullscreen Spaces on Mac OS X. + * + * This hint only applies to Mac OS X. + * + * The variable can be set to the following values: + * "0" - Disable Spaces support (FULLSCREEN_DESKTOP won't use them and + * SDL_WINDOW_RESIZABLE windows won't offer the "fullscreen" + * button on their titlebars). + * "1" - Enable Spaces support (FULLSCREEN_DESKTOP will use them and + * SDL_WINDOW_RESIZABLE windows will offer the "fullscreen" + * button on their titlebars. + * + * The default value is "1". Spaces are disabled regardless of this hint if + * the OS isn't at least Mac OS X Lion (10.7). This hint must be set before + * any windows are created. + */ +#define SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES "SDL_VIDEO_MAC_FULLSCREEN_SPACES" + + +/** + * \brief An enumeration of hint priorities + */ +typedef enum +{ + SDL_HINT_DEFAULT, + SDL_HINT_NORMAL, + SDL_HINT_OVERRIDE +} SDL_HintPriority; + + +/** + * \brief Set a hint with a specific priority + * + * The priority controls the behavior when setting a hint that already + * has a value. Hints will replace existing hints of their priority and + * lower. Environment variables are considered to have override priority. + * + * \return SDL_TRUE if the hint was set, SDL_FALSE otherwise + */ +extern DECLSPEC SDL_bool SDLCALL SDL_SetHintWithPriority(const char *name, + const char *value, + SDL_HintPriority priority); + +/** + * \brief Set a hint with normal priority + * + * \return SDL_TRUE if the hint was set, SDL_FALSE otherwise + */ +extern DECLSPEC SDL_bool SDLCALL SDL_SetHint(const char *name, + const char *value); + +/** + * \brief Get a hint + * + * \return The string value of a hint variable. + */ +extern DECLSPEC const char * SDLCALL SDL_GetHint(const char *name); + +/** + * \brief Add a function to watch a particular hint + * + * \param name The hint to watch + * \param callback The function to call when the hint value changes + * \param userdata A pointer to pass to the callback function + */ +typedef void (*SDL_HintCallback)(void *userdata, const char *name, const char *oldValue, const char *newValue); +extern DECLSPEC void SDLCALL SDL_AddHintCallback(const char *name, + SDL_HintCallback callback, + void *userdata); + +/** + * \brief Remove a function watching a particular hint + * + * \param name The hint being watched + * \param callback The function being called when the hint value changes + * \param userdata A pointer being passed to the callback function + */ +extern DECLSPEC void SDLCALL SDL_DelHintCallback(const char *name, + SDL_HintCallback callback, + void *userdata); + +/** + * \brief Clear all hints + * + * This function is called during SDL_Quit() to free stored hints. + */ +extern DECLSPEC void SDLCALL SDL_ClearHints(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_hints_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_joystick.h b/lib/SDL2/include/SDL_joystick.h new file mode 100644 index 0000000000..b0b1c6673f --- /dev/null +++ b/lib/SDL2/include/SDL_joystick.h @@ -0,0 +1,253 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_joystick.h + * + * Include file for SDL joystick event handling + * + * The term "device_index" identifies currently plugged in joystick devices between 0 and SDL_NumJoysticks, with the exact joystick + * behind a device_index changing as joysticks are plugged and unplugged. + * + * The term "instance_id" is the current instantiation of a joystick device in the system, if the joystick is removed and then re-inserted + * then it will get a new instance_id, instance_id's are monotonically increasing identifiers of a joystick plugged in. + * + * The term JoystickGUID is a stable 128-bit identifier for a joystick device that does not change over time, it identifies class of + * the device (a X360 wired controller for example). This identifier is platform dependent. + * + * + */ + +#ifndef _SDL_joystick_h +#define _SDL_joystick_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file SDL_joystick.h + * + * In order to use these functions, SDL_Init() must have been called + * with the ::SDL_INIT_JOYSTICK flag. This causes SDL to scan the system + * for joysticks, and load appropriate drivers. + * + * If you would like to receive joystick updates while the application + * is in the background, you should set the following hint before calling + * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS + */ + +/* The joystick structure used to identify an SDL joystick */ +struct _SDL_Joystick; +typedef struct _SDL_Joystick SDL_Joystick; + +/* A structure that encodes the stable unique id for a joystick device */ +typedef struct { + Uint8 data[16]; +} SDL_JoystickGUID; + +typedef Sint32 SDL_JoystickID; + + +/* Function prototypes */ +/** + * Count the number of joysticks attached to the system right now + */ +extern DECLSPEC int SDLCALL SDL_NumJoysticks(void); + +/** + * Get the implementation dependent name of a joystick. + * This can be called before any joysticks are opened. + * If no name can be found, this function returns NULL. + */ +extern DECLSPEC const char *SDLCALL SDL_JoystickNameForIndex(int device_index); + +/** + * Open a joystick for use. + * The index passed as an argument refers tothe N'th joystick on the system. + * This index is the value which will identify this joystick in future joystick + * events. + * + * \return A joystick identifier, or NULL if an error occurred. + */ +extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickOpen(int device_index); + +/** + * Return the name for this currently opened joystick. + * If no name can be found, this function returns NULL. + */ +extern DECLSPEC const char *SDLCALL SDL_JoystickName(SDL_Joystick * joystick); + +/** + * Return the GUID for the joystick at this index + */ +extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetDeviceGUID(int device_index); + +/** + * Return the GUID for this opened joystick + */ +extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetGUID(SDL_Joystick * joystick); + +/** + * Return a string representation for this guid. pszGUID must point to at least 33 bytes + * (32 for the string plus a NULL terminator). + */ +extern DECLSPEC void SDLCALL SDL_JoystickGetGUIDString(SDL_JoystickGUID guid, char *pszGUID, int cbGUID); + +/** + * convert a string into a joystick formatted guid + */ +extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetGUIDFromString(const char *pchGUID); + +/** + * Returns SDL_TRUE if the joystick has been opened and currently connected, or SDL_FALSE if it has not. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_JoystickGetAttached(SDL_Joystick * joystick); + +/** + * Get the instance ID of an opened joystick or -1 if the joystick is invalid. + */ +extern DECLSPEC SDL_JoystickID SDLCALL SDL_JoystickInstanceID(SDL_Joystick * joystick); + +/** + * Get the number of general axis controls on a joystick. + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumAxes(SDL_Joystick * joystick); + +/** + * Get the number of trackballs on a joystick. + * + * Joystick trackballs have only relative motion events associated + * with them and their state cannot be polled. + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumBalls(SDL_Joystick * joystick); + +/** + * Get the number of POV hats on a joystick. + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumHats(SDL_Joystick * joystick); + +/** + * Get the number of buttons on a joystick. + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumButtons(SDL_Joystick * joystick); + +/** + * Update the current state of the open joysticks. + * + * This is called automatically by the event loop if any joystick + * events are enabled. + */ +extern DECLSPEC void SDLCALL SDL_JoystickUpdate(void); + +/** + * Enable/disable joystick event polling. + * + * If joystick events are disabled, you must call SDL_JoystickUpdate() + * yourself and check the state of the joystick when you want joystick + * information. + * + * The state can be one of ::SDL_QUERY, ::SDL_ENABLE or ::SDL_IGNORE. + */ +extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state); + +/** + * Get the current state of an axis control on a joystick. + * + * The state is a value ranging from -32768 to 32767. + * + * The axis indices start at index 0. + */ +extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick * joystick, + int axis); + +/** + * \name Hat positions + */ +/* @{ */ +#define SDL_HAT_CENTERED 0x00 +#define SDL_HAT_UP 0x01 +#define SDL_HAT_RIGHT 0x02 +#define SDL_HAT_DOWN 0x04 +#define SDL_HAT_LEFT 0x08 +#define SDL_HAT_RIGHTUP (SDL_HAT_RIGHT|SDL_HAT_UP) +#define SDL_HAT_RIGHTDOWN (SDL_HAT_RIGHT|SDL_HAT_DOWN) +#define SDL_HAT_LEFTUP (SDL_HAT_LEFT|SDL_HAT_UP) +#define SDL_HAT_LEFTDOWN (SDL_HAT_LEFT|SDL_HAT_DOWN) +/* @} */ + +/** + * Get the current state of a POV hat on a joystick. + * + * The hat indices start at index 0. + * + * \return The return value is one of the following positions: + * - ::SDL_HAT_CENTERED + * - ::SDL_HAT_UP + * - ::SDL_HAT_RIGHT + * - ::SDL_HAT_DOWN + * - ::SDL_HAT_LEFT + * - ::SDL_HAT_RIGHTUP + * - ::SDL_HAT_RIGHTDOWN + * - ::SDL_HAT_LEFTUP + * - ::SDL_HAT_LEFTDOWN + */ +extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetHat(SDL_Joystick * joystick, + int hat); + +/** + * Get the ball axis change since the last poll. + * + * \return 0, or -1 if you passed it invalid parameters. + * + * The ball indices start at index 0. + */ +extern DECLSPEC int SDLCALL SDL_JoystickGetBall(SDL_Joystick * joystick, + int ball, int *dx, int *dy); + +/** + * Get the current state of a button on a joystick. + * + * The button indices start at index 0. + */ +extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetButton(SDL_Joystick * joystick, + int button); + +/** + * Close a joystick previously opened with SDL_JoystickOpen(). + */ +extern DECLSPEC void SDLCALL SDL_JoystickClose(SDL_Joystick * joystick); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_joystick_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_keyboard.h b/lib/SDL2/include/SDL_keyboard.h new file mode 100644 index 0000000000..586a26cff2 --- /dev/null +++ b/lib/SDL2/include/SDL_keyboard.h @@ -0,0 +1,217 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_keyboard.h + * + * Include file for SDL keyboard event handling + */ + +#ifndef _SDL_keyboard_h +#define _SDL_keyboard_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_keycode.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief The SDL keysym structure, used in key events. + * + * \note If you are looking for translated character input, see the ::SDL_TEXTINPUT event. + */ +typedef struct SDL_Keysym +{ + SDL_Scancode scancode; /**< SDL physical key code - see ::SDL_Scancode for details */ + SDL_Keycode sym; /**< SDL virtual key code - see ::SDL_Keycode for details */ + Uint16 mod; /**< current key modifiers */ + Uint32 unused; +} SDL_Keysym; + +/* Function prototypes */ + +/** + * \brief Get the window which currently has keyboard focus. + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void); + +/** + * \brief Get a snapshot of the current state of the keyboard. + * + * \param numkeys if non-NULL, receives the length of the returned array. + * + * \return An array of key states. Indexes into this array are obtained by using ::SDL_Scancode values. + * + * \b Example: + * \code + * const Uint8 *state = SDL_GetKeyboardState(NULL); + * if ( state[SDL_SCANCODE_RETURN] ) { + * printf(" is pressed.\n"); + * } + * \endcode + */ +extern DECLSPEC const Uint8 *SDLCALL SDL_GetKeyboardState(int *numkeys); + +/** + * \brief Get the current key modifier state for the keyboard. + */ +extern DECLSPEC SDL_Keymod SDLCALL SDL_GetModState(void); + +/** + * \brief Set the current key modifier state for the keyboard. + * + * \note This does not change the keyboard state, only the key modifier flags. + */ +extern DECLSPEC void SDLCALL SDL_SetModState(SDL_Keymod modstate); + +/** + * \brief Get the key code corresponding to the given scancode according + * to the current keyboard layout. + * + * See ::SDL_Keycode for details. + * + * \sa SDL_GetKeyName() + */ +extern DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromScancode(SDL_Scancode scancode); + +/** + * \brief Get the scancode corresponding to the given key code according to the + * current keyboard layout. + * + * See ::SDL_Scancode for details. + * + * \sa SDL_GetScancodeName() + */ +extern DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromKey(SDL_Keycode key); + +/** + * \brief Get a human-readable name for a scancode. + * + * \return A pointer to the name for the scancode. + * If the scancode doesn't have a name, this function returns + * an empty string (""). + * + * \sa SDL_Scancode + */ +extern DECLSPEC const char *SDLCALL SDL_GetScancodeName(SDL_Scancode scancode); + +/** + * \brief Get a scancode from a human-readable name + * + * \return scancode, or SDL_SCANCODE_UNKNOWN if the name wasn't recognized + * + * \sa SDL_Scancode + */ +extern DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromName(const char *name); + +/** + * \brief Get a human-readable name for a key. + * + * \return A pointer to a UTF-8 string that stays valid at least until the next + * call to this function. If you need it around any longer, you must + * copy it. If the key doesn't have a name, this function returns an + * empty string (""). + * + * \sa SDL_Key + */ +extern DECLSPEC const char *SDLCALL SDL_GetKeyName(SDL_Keycode key); + +/** + * \brief Get a key code from a human-readable name + * + * \return key code, or SDLK_UNKNOWN if the name wasn't recognized + * + * \sa SDL_Keycode + */ +extern DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromName(const char *name); + +/** + * \brief Start accepting Unicode text input events. + * This function will show the on-screen keyboard if supported. + * + * \sa SDL_StopTextInput() + * \sa SDL_SetTextInputRect() + * \sa SDL_HasScreenKeyboardSupport() + */ +extern DECLSPEC void SDLCALL SDL_StartTextInput(void); + +/** + * \brief Return whether or not Unicode text input events are enabled. + * + * \sa SDL_StartTextInput() + * \sa SDL_StopTextInput() + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsTextInputActive(void); + +/** + * \brief Stop receiving any text input events. + * This function will hide the on-screen keyboard if supported. + * + * \sa SDL_StartTextInput() + * \sa SDL_HasScreenKeyboardSupport() + */ +extern DECLSPEC void SDLCALL SDL_StopTextInput(void); + +/** + * \brief Set the rectangle used to type Unicode text inputs. + * This is used as a hint for IME and on-screen keyboard placement. + * + * \sa SDL_StartTextInput() + */ +extern DECLSPEC void SDLCALL SDL_SetTextInputRect(SDL_Rect *rect); + +/** + * \brief Returns whether the platform has some screen keyboard support. + * + * \return SDL_TRUE if some keyboard support is available else SDL_FALSE. + * + * \note Not all screen keyboard functions are supported on all platforms. + * + * \sa SDL_IsScreenKeyboardShown() + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasScreenKeyboardSupport(void); + +/** + * \brief Returns whether the screen keyboard is shown for given window. + * + * \param window The window for which screen keyboard should be queried. + * + * \return SDL_TRUE if screen keyboard is shown else SDL_FALSE. + * + * \sa SDL_HasScreenKeyboardSupport() + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsScreenKeyboardShown(SDL_Window *window); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_keyboard_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_keycode.h b/lib/SDL2/include/SDL_keycode.h new file mode 100644 index 0000000000..d5f5dd0aef --- /dev/null +++ b/lib/SDL2/include/SDL_keycode.h @@ -0,0 +1,341 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_keycode.h + * + * Defines constants which identify keyboard keys and modifiers. + */ + +#ifndef _SDL_keycode_h +#define _SDL_keycode_h + +#include "SDL_stdinc.h" +#include "SDL_scancode.h" + +/** + * \brief The SDL virtual key representation. + * + * Values of this type are used to represent keyboard keys using the current + * layout of the keyboard. These values include Unicode values representing + * the unmodified character that would be generated by pressing the key, or + * an SDLK_* constant for those keys that do not generate characters. + */ +typedef Sint32 SDL_Keycode; + +#define SDLK_SCANCODE_MASK (1<<30) +#define SDL_SCANCODE_TO_KEYCODE(X) (X | SDLK_SCANCODE_MASK) + +enum +{ + SDLK_UNKNOWN = 0, + + SDLK_RETURN = '\r', + SDLK_ESCAPE = '\033', + SDLK_BACKSPACE = '\b', + SDLK_TAB = '\t', + SDLK_SPACE = ' ', + SDLK_EXCLAIM = '!', + SDLK_QUOTEDBL = '"', + SDLK_HASH = '#', + SDLK_PERCENT = '%', + SDLK_DOLLAR = '$', + SDLK_AMPERSAND = '&', + SDLK_QUOTE = '\'', + SDLK_LEFTPAREN = '(', + SDLK_RIGHTPAREN = ')', + SDLK_ASTERISK = '*', + SDLK_PLUS = '+', + SDLK_COMMA = ',', + SDLK_MINUS = '-', + SDLK_PERIOD = '.', + SDLK_SLASH = '/', + SDLK_0 = '0', + SDLK_1 = '1', + SDLK_2 = '2', + SDLK_3 = '3', + SDLK_4 = '4', + SDLK_5 = '5', + SDLK_6 = '6', + SDLK_7 = '7', + SDLK_8 = '8', + SDLK_9 = '9', + SDLK_COLON = ':', + SDLK_SEMICOLON = ';', + SDLK_LESS = '<', + SDLK_EQUALS = '=', + SDLK_GREATER = '>', + SDLK_QUESTION = '?', + SDLK_AT = '@', + /* + Skip uppercase letters + */ + SDLK_LEFTBRACKET = '[', + SDLK_BACKSLASH = '\\', + SDLK_RIGHTBRACKET = ']', + SDLK_CARET = '^', + SDLK_UNDERSCORE = '_', + SDLK_BACKQUOTE = '`', + SDLK_a = 'a', + SDLK_b = 'b', + SDLK_c = 'c', + SDLK_d = 'd', + SDLK_e = 'e', + SDLK_f = 'f', + SDLK_g = 'g', + SDLK_h = 'h', + SDLK_i = 'i', + SDLK_j = 'j', + SDLK_k = 'k', + SDLK_l = 'l', + SDLK_m = 'm', + SDLK_n = 'n', + SDLK_o = 'o', + SDLK_p = 'p', + SDLK_q = 'q', + SDLK_r = 'r', + SDLK_s = 's', + SDLK_t = 't', + SDLK_u = 'u', + SDLK_v = 'v', + SDLK_w = 'w', + SDLK_x = 'x', + SDLK_y = 'y', + SDLK_z = 'z', + + SDLK_CAPSLOCK = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CAPSLOCK), + + SDLK_F1 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F1), + SDLK_F2 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F2), + SDLK_F3 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F3), + SDLK_F4 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F4), + SDLK_F5 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F5), + SDLK_F6 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F6), + SDLK_F7 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F7), + SDLK_F8 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F8), + SDLK_F9 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F9), + SDLK_F10 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F10), + SDLK_F11 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F11), + SDLK_F12 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F12), + + SDLK_PRINTSCREEN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRINTSCREEN), + SDLK_SCROLLLOCK = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SCROLLLOCK), + SDLK_PAUSE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAUSE), + SDLK_INSERT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_INSERT), + SDLK_HOME = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HOME), + SDLK_PAGEUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEUP), + SDLK_DELETE = '\177', + SDLK_END = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_END), + SDLK_PAGEDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEDOWN), + SDLK_RIGHT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT), + SDLK_LEFT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LEFT), + SDLK_DOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DOWN), + SDLK_UP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UP), + + SDLK_NUMLOCKCLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_NUMLOCKCLEAR), + SDLK_KP_DIVIDE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DIVIDE), + SDLK_KP_MULTIPLY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MULTIPLY), + SDLK_KP_MINUS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MINUS), + SDLK_KP_PLUS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUS), + SDLK_KP_ENTER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_ENTER), + SDLK_KP_1 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_1), + SDLK_KP_2 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_2), + SDLK_KP_3 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_3), + SDLK_KP_4 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_4), + SDLK_KP_5 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_5), + SDLK_KP_6 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_6), + SDLK_KP_7 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_7), + SDLK_KP_8 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_8), + SDLK_KP_9 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_9), + SDLK_KP_0 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_0), + SDLK_KP_PERIOD = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERIOD), + + SDLK_APPLICATION = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APPLICATION), + SDLK_POWER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_POWER), + SDLK_KP_EQUALS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALS), + SDLK_F13 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F13), + SDLK_F14 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F14), + SDLK_F15 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F15), + SDLK_F16 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F16), + SDLK_F17 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F17), + SDLK_F18 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F18), + SDLK_F19 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F19), + SDLK_F20 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F20), + SDLK_F21 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F21), + SDLK_F22 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F22), + SDLK_F23 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F23), + SDLK_F24 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F24), + SDLK_EXECUTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXECUTE), + SDLK_HELP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HELP), + SDLK_MENU = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MENU), + SDLK_SELECT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SELECT), + SDLK_STOP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_STOP), + SDLK_AGAIN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AGAIN), + SDLK_UNDO = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UNDO), + SDLK_CUT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CUT), + SDLK_COPY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COPY), + SDLK_PASTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PASTE), + SDLK_FIND = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_FIND), + SDLK_MUTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MUTE), + SDLK_VOLUMEUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEUP), + SDLK_VOLUMEDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEDOWN), + SDLK_KP_COMMA = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COMMA), + SDLK_KP_EQUALSAS400 = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALSAS400), + + SDLK_ALTERASE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ALTERASE), + SDLK_SYSREQ = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SYSREQ), + SDLK_CANCEL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CANCEL), + SDLK_CLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEAR), + SDLK_PRIOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRIOR), + SDLK_RETURN2 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RETURN2), + SDLK_SEPARATOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SEPARATOR), + SDLK_OUT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OUT), + SDLK_OPER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OPER), + SDLK_CLEARAGAIN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEARAGAIN), + SDLK_CRSEL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CRSEL), + SDLK_EXSEL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXSEL), + + SDLK_KP_00 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_00), + SDLK_KP_000 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_000), + SDLK_THOUSANDSSEPARATOR = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_THOUSANDSSEPARATOR), + SDLK_DECIMALSEPARATOR = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DECIMALSEPARATOR), + SDLK_CURRENCYUNIT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYUNIT), + SDLK_CURRENCYSUBUNIT = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYSUBUNIT), + SDLK_KP_LEFTPAREN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTPAREN), + SDLK_KP_RIGHTPAREN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTPAREN), + SDLK_KP_LEFTBRACE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTBRACE), + SDLK_KP_RIGHTBRACE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTBRACE), + SDLK_KP_TAB = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_TAB), + SDLK_KP_BACKSPACE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BACKSPACE), + SDLK_KP_A = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_A), + SDLK_KP_B = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_B), + SDLK_KP_C = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_C), + SDLK_KP_D = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_D), + SDLK_KP_E = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_E), + SDLK_KP_F = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_F), + SDLK_KP_XOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_XOR), + SDLK_KP_POWER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_POWER), + SDLK_KP_PERCENT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERCENT), + SDLK_KP_LESS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LESS), + SDLK_KP_GREATER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_GREATER), + SDLK_KP_AMPERSAND = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AMPERSAND), + SDLK_KP_DBLAMPERSAND = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLAMPERSAND), + SDLK_KP_VERTICALBAR = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_VERTICALBAR), + SDLK_KP_DBLVERTICALBAR = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLVERTICALBAR), + SDLK_KP_COLON = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COLON), + SDLK_KP_HASH = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HASH), + SDLK_KP_SPACE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_SPACE), + SDLK_KP_AT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AT), + SDLK_KP_EXCLAM = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EXCLAM), + SDLK_KP_MEMSTORE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSTORE), + SDLK_KP_MEMRECALL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMRECALL), + SDLK_KP_MEMCLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMCLEAR), + SDLK_KP_MEMADD = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMADD), + SDLK_KP_MEMSUBTRACT = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSUBTRACT), + SDLK_KP_MEMMULTIPLY = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMMULTIPLY), + SDLK_KP_MEMDIVIDE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMDIVIDE), + SDLK_KP_PLUSMINUS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUSMINUS), + SDLK_KP_CLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEAR), + SDLK_KP_CLEARENTRY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEARENTRY), + SDLK_KP_BINARY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BINARY), + SDLK_KP_OCTAL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_OCTAL), + SDLK_KP_DECIMAL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DECIMAL), + SDLK_KP_HEXADECIMAL = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HEXADECIMAL), + + SDLK_LCTRL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LCTRL), + SDLK_LSHIFT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LSHIFT), + SDLK_LALT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LALT), + SDLK_LGUI = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LGUI), + SDLK_RCTRL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RCTRL), + SDLK_RSHIFT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RSHIFT), + SDLK_RALT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RALT), + SDLK_RGUI = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RGUI), + + SDLK_MODE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MODE), + + SDLK_AUDIONEXT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIONEXT), + SDLK_AUDIOPREV = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOPREV), + SDLK_AUDIOSTOP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOSTOP), + SDLK_AUDIOPLAY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOPLAY), + SDLK_AUDIOMUTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOMUTE), + SDLK_MEDIASELECT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIASELECT), + SDLK_WWW = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_WWW), + SDLK_MAIL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MAIL), + SDLK_CALCULATOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALCULATOR), + SDLK_COMPUTER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COMPUTER), + SDLK_AC_SEARCH = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SEARCH), + SDLK_AC_HOME = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_HOME), + SDLK_AC_BACK = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BACK), + SDLK_AC_FORWARD = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_FORWARD), + SDLK_AC_STOP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_STOP), + SDLK_AC_REFRESH = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_REFRESH), + SDLK_AC_BOOKMARKS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BOOKMARKS), + + SDLK_BRIGHTNESSDOWN = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_BRIGHTNESSDOWN), + SDLK_BRIGHTNESSUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_BRIGHTNESSUP), + SDLK_DISPLAYSWITCH = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DISPLAYSWITCH), + SDLK_KBDILLUMTOGGLE = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMTOGGLE), + SDLK_KBDILLUMDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMDOWN), + SDLK_KBDILLUMUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMUP), + SDLK_EJECT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EJECT), + SDLK_SLEEP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SLEEP) +}; + +/** + * \brief Enumeration of valid key mods (possibly OR'd together). + */ +typedef enum +{ + KMOD_NONE = 0x0000, + KMOD_LSHIFT = 0x0001, + KMOD_RSHIFT = 0x0002, + KMOD_LCTRL = 0x0040, + KMOD_RCTRL = 0x0080, + KMOD_LALT = 0x0100, + KMOD_RALT = 0x0200, + KMOD_LGUI = 0x0400, + KMOD_RGUI = 0x0800, + KMOD_NUM = 0x1000, + KMOD_CAPS = 0x2000, + KMOD_MODE = 0x4000, + KMOD_RESERVED = 0x8000 +} SDL_Keymod; + +#define KMOD_CTRL (KMOD_LCTRL|KMOD_RCTRL) +#define KMOD_SHIFT (KMOD_LSHIFT|KMOD_RSHIFT) +#define KMOD_ALT (KMOD_LALT|KMOD_RALT) +#define KMOD_GUI (KMOD_LGUI|KMOD_RGUI) + +#endif /* _SDL_keycode_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_loadso.h b/lib/SDL2/include/SDL_loadso.h new file mode 100644 index 0000000000..0359eae17d --- /dev/null +++ b/lib/SDL2/include/SDL_loadso.h @@ -0,0 +1,81 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_loadso.h + * + * System dependent library loading routines + * + * Some things to keep in mind: + * \li These functions only work on C function names. Other languages may + * have name mangling and intrinsic language support that varies from + * compiler to compiler. + * \li Make sure you declare your function pointers with the same calling + * convention as the actual library function. Your code will crash + * mysteriously if you do not do this. + * \li Avoid namespace collisions. If you load a symbol from the library, + * it is not defined whether or not it goes into the global symbol + * namespace for the application. If it does and it conflicts with + * symbols in your code or other shared libraries, you will not get + * the results you expect. :) + */ + +#ifndef _SDL_loadso_h +#define _SDL_loadso_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * This function dynamically loads a shared object and returns a pointer + * to the object handle (or NULL if there was an error). + * The 'sofile' parameter is a system dependent name of the object file. + */ +extern DECLSPEC void *SDLCALL SDL_LoadObject(const char *sofile); + +/** + * Given an object handle, this function looks up the address of the + * named function in the shared object and returns it. This address + * is no longer valid after calling SDL_UnloadObject(). + */ +extern DECLSPEC void *SDLCALL SDL_LoadFunction(void *handle, + const char *name); + +/** + * Unload a shared object from memory. + */ +extern DECLSPEC void SDLCALL SDL_UnloadObject(void *handle); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_loadso_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_log.h b/lib/SDL2/include/SDL_log.h new file mode 100644 index 0000000000..5c2bca5932 --- /dev/null +++ b/lib/SDL2/include/SDL_log.h @@ -0,0 +1,211 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_log.h + * + * Simple log messages with categories and priorities. + * + * By default logs are quiet, but if you're debugging SDL you might want: + * + * SDL_LogSetAllPriority(SDL_LOG_PRIORITY_WARN); + * + * Here's where the messages go on different platforms: + * Windows: debug output stream + * Android: log output + * Others: standard error output (stderr) + */ + +#ifndef _SDL_log_h +#define _SDL_log_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * \brief The maximum size of a log message + * + * Messages longer than the maximum size will be truncated + */ +#define SDL_MAX_LOG_MESSAGE 4096 + +/** + * \brief The predefined log categories + * + * By default the application category is enabled at the INFO level, + * the assert category is enabled at the WARN level, test is enabled + * at the VERBOSE level and all other categories are enabled at the + * CRITICAL level. + */ +enum +{ + SDL_LOG_CATEGORY_APPLICATION, + SDL_LOG_CATEGORY_ERROR, + SDL_LOG_CATEGORY_ASSERT, + SDL_LOG_CATEGORY_SYSTEM, + SDL_LOG_CATEGORY_AUDIO, + SDL_LOG_CATEGORY_VIDEO, + SDL_LOG_CATEGORY_RENDER, + SDL_LOG_CATEGORY_INPUT, + SDL_LOG_CATEGORY_TEST, + + /* Reserved for future SDL library use */ + SDL_LOG_CATEGORY_RESERVED1, + SDL_LOG_CATEGORY_RESERVED2, + SDL_LOG_CATEGORY_RESERVED3, + SDL_LOG_CATEGORY_RESERVED4, + SDL_LOG_CATEGORY_RESERVED5, + SDL_LOG_CATEGORY_RESERVED6, + SDL_LOG_CATEGORY_RESERVED7, + SDL_LOG_CATEGORY_RESERVED8, + SDL_LOG_CATEGORY_RESERVED9, + SDL_LOG_CATEGORY_RESERVED10, + + /* Beyond this point is reserved for application use, e.g. + enum { + MYAPP_CATEGORY_AWESOME1 = SDL_LOG_CATEGORY_CUSTOM, + MYAPP_CATEGORY_AWESOME2, + MYAPP_CATEGORY_AWESOME3, + ... + }; + */ + SDL_LOG_CATEGORY_CUSTOM +}; + +/** + * \brief The predefined log priorities + */ +typedef enum +{ + SDL_LOG_PRIORITY_VERBOSE = 1, + SDL_LOG_PRIORITY_DEBUG, + SDL_LOG_PRIORITY_INFO, + SDL_LOG_PRIORITY_WARN, + SDL_LOG_PRIORITY_ERROR, + SDL_LOG_PRIORITY_CRITICAL, + SDL_NUM_LOG_PRIORITIES +} SDL_LogPriority; + + +/** + * \brief Set the priority of all log categories + */ +extern DECLSPEC void SDLCALL SDL_LogSetAllPriority(SDL_LogPriority priority); + +/** + * \brief Set the priority of a particular log category + */ +extern DECLSPEC void SDLCALL SDL_LogSetPriority(int category, + SDL_LogPriority priority); + +/** + * \brief Get the priority of a particular log category + */ +extern DECLSPEC SDL_LogPriority SDLCALL SDL_LogGetPriority(int category); + +/** + * \brief Reset all priorities to default. + * + * \note This is called in SDL_Quit(). + */ +extern DECLSPEC void SDLCALL SDL_LogResetPriorities(void); + +/** + * \brief Log a message with SDL_LOG_CATEGORY_APPLICATION and SDL_LOG_PRIORITY_INFO + */ +extern DECLSPEC void SDLCALL SDL_Log(const char *fmt, ...); + +/** + * \brief Log a message with SDL_LOG_PRIORITY_VERBOSE + */ +extern DECLSPEC void SDLCALL SDL_LogVerbose(int category, const char *fmt, ...); + +/** + * \brief Log a message with SDL_LOG_PRIORITY_DEBUG + */ +extern DECLSPEC void SDLCALL SDL_LogDebug(int category, const char *fmt, ...); + +/** + * \brief Log a message with SDL_LOG_PRIORITY_INFO + */ +extern DECLSPEC void SDLCALL SDL_LogInfo(int category, const char *fmt, ...); + +/** + * \brief Log a message with SDL_LOG_PRIORITY_WARN + */ +extern DECLSPEC void SDLCALL SDL_LogWarn(int category, const char *fmt, ...); + +/** + * \brief Log a message with SDL_LOG_PRIORITY_ERROR + */ +extern DECLSPEC void SDLCALL SDL_LogError(int category, const char *fmt, ...); + +/** + * \brief Log a message with SDL_LOG_PRIORITY_CRITICAL + */ +extern DECLSPEC void SDLCALL SDL_LogCritical(int category, const char *fmt, ...); + +/** + * \brief Log a message with the specified category and priority. + */ +extern DECLSPEC void SDLCALL SDL_LogMessage(int category, + SDL_LogPriority priority, + const char *fmt, ...); + +/** + * \brief Log a message with the specified category and priority. + */ +extern DECLSPEC void SDLCALL SDL_LogMessageV(int category, + SDL_LogPriority priority, + const char *fmt, va_list ap); + +/** + * \brief The prototype for the log output function + */ +typedef void (*SDL_LogOutputFunction)(void *userdata, int category, SDL_LogPriority priority, const char *message); + +/** + * \brief Get the current log output function. + */ +extern DECLSPEC void SDLCALL SDL_LogGetOutputFunction(SDL_LogOutputFunction *callback, void **userdata); + +/** + * \brief This function allows you to replace the default log output + * function with one of your own. + */ +extern DECLSPEC void SDLCALL SDL_LogSetOutputFunction(SDL_LogOutputFunction callback, void *userdata); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_log_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_main.h b/lib/SDL2/include/SDL_main.h new file mode 100644 index 0000000000..2e8fae95ea --- /dev/null +++ b/lib/SDL2/include/SDL_main.h @@ -0,0 +1,155 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_main_h +#define _SDL_main_h + +#include "SDL_stdinc.h" + +/** + * \file SDL_main.h + * + * Redefine main() on some platforms so that it is called by SDL. + */ + +#ifndef SDL_MAIN_HANDLED +#if defined(__WIN32__) +/* On Windows SDL provides WinMain(), which parses the command line and passes + the arguments to your main function. + + If you provide your own WinMain(), you may define SDL_MAIN_HANDLED + */ +#define SDL_MAIN_AVAILABLE + +#elif defined(__WINRT__) +/* On WinRT, SDL provides a main function that initializes CoreApplication, + creating an instance of IFrameworkView in the process. + + Please note that #include'ing SDL_main.h is not enough to get a main() + function working. In non-XAML apps, the file, + src/main/winrt/SDL_WinRT_main_NonXAML.cpp, or a copy of it, must be compiled + into the app itself. In XAML apps, the function, SDL_WinRTRunApp must be + called, with a pointer to the Direct3D-hosted XAML control passed in. +*/ +#define SDL_MAIN_NEEDED + +#elif defined(__IPHONEOS__) +/* On iOS SDL provides a main function that creates an application delegate + and starts the iOS application run loop. + + See src/video/uikit/SDL_uikitappdelegate.m for more details. + */ +#define SDL_MAIN_NEEDED + +#elif defined(__ANDROID__) +/* On Android SDL provides a Java class in SDLActivity.java that is the + main activity entry point. + + See README-android.txt for more details on extending that class. + */ +#define SDL_MAIN_NEEDED + +#endif +#endif /* SDL_MAIN_HANDLED */ + +#ifdef __cplusplus +#define C_LINKAGE "C" +#else +#define C_LINKAGE +#endif /* __cplusplus */ + +/** + * \file SDL_main.h + * + * The application's main() function must be called with C linkage, + * and should be declared like this: + * \code + * #ifdef __cplusplus + * extern "C" + * #endif + * int main(int argc, char *argv[]) + * { + * } + * \endcode + */ + +#if defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE) +#define main SDL_main +#endif + +/** + * The prototype for the application's main() function + */ +extern C_LINKAGE int SDL_main(int argc, char *argv[]); + + +#include "begin_code.h" +#ifdef __cplusplus +extern "C" { +#endif + +/** + * This is called by the real SDL main function to let the rest of the + * library know that initialization was done properly. + * + * Calling this yourself without knowing what you're doing can cause + * crashes and hard to diagnose problems with your application. + */ +extern DECLSPEC void SDLCALL SDL_SetMainReady(void); + +#ifdef __WIN32__ + +/** + * This can be called to set the application class at startup + */ +extern DECLSPEC int SDLCALL SDL_RegisterApp(char *name, Uint32 style, + void *hInst); +extern DECLSPEC void SDLCALL SDL_UnregisterApp(void); + +#endif /* __WIN32__ */ + + +#ifdef __WINRT__ + +/** + * \brief Initializes and launches an SDL/WinRT application. + * + * \param mainFunction The SDL app's C-style main(). + * \param xamlBackgroundPanel An optional, XAML-based, background panel. + * For Non-XAML apps, this value must be set to NULL. For XAML apps, + * pass in a pointer to a SwapChainBackgroundPanel, casted to an + * IInspectable (via reinterpret_cast). + * \ret 0 on success, -1 on failure. On failure, use SDL_GetError to retrieve more + * information on the failure. + */ +extern DECLSPEC int SDLCALL SDL_WinRTRunApp(int (*mainFunction)(int, char **), void * xamlBackgroundPanel); + +#endif /* __WINRT__ */ + + +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_main_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_messagebox.h b/lib/SDL2/include/SDL_messagebox.h new file mode 100644 index 0000000000..6004da0f5f --- /dev/null +++ b/lib/SDL2/include/SDL_messagebox.h @@ -0,0 +1,144 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_messagebox_h +#define _SDL_messagebox_h + +#include "SDL_stdinc.h" +#include "SDL_video.h" /* For SDL_Window */ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief SDL_MessageBox flags. If supported will display warning icon, etc. + */ +typedef enum +{ + SDL_MESSAGEBOX_ERROR = 0x00000010, /**< error dialog */ + SDL_MESSAGEBOX_WARNING = 0x00000020, /**< warning dialog */ + SDL_MESSAGEBOX_INFORMATION = 0x00000040 /**< informational dialog */ +} SDL_MessageBoxFlags; + +/** + * \brief Flags for SDL_MessageBoxButtonData. + */ +typedef enum +{ + SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT = 0x00000001, /**< Marks the default button when return is hit */ + SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT = 0x00000002 /**< Marks the default button when escape is hit */ +} SDL_MessageBoxButtonFlags; + +/** + * \brief Individual button data. + */ +typedef struct +{ + Uint32 flags; /**< ::SDL_MessageBoxButtonFlags */ + int buttonid; /**< User defined button id (value returned via SDL_ShowMessageBox) */ + const char * text; /**< The UTF-8 button text */ +} SDL_MessageBoxButtonData; + +/** + * \brief RGB value used in a message box color scheme + */ +typedef struct +{ + Uint8 r, g, b; +} SDL_MessageBoxColor; + +typedef enum +{ + SDL_MESSAGEBOX_COLOR_BACKGROUND, + SDL_MESSAGEBOX_COLOR_TEXT, + SDL_MESSAGEBOX_COLOR_BUTTON_BORDER, + SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND, + SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED, + SDL_MESSAGEBOX_COLOR_MAX +} SDL_MessageBoxColorType; + +/** + * \brief A set of colors to use for message box dialogs + */ +typedef struct +{ + SDL_MessageBoxColor colors[SDL_MESSAGEBOX_COLOR_MAX]; +} SDL_MessageBoxColorScheme; + +/** + * \brief MessageBox structure containing title, text, window, etc. + */ +typedef struct +{ + Uint32 flags; /**< ::SDL_MessageBoxFlags */ + SDL_Window *window; /**< Parent window, can be NULL */ + const char *title; /**< UTF-8 title */ + const char *message; /**< UTF-8 message text */ + + int numbuttons; + const SDL_MessageBoxButtonData *buttons; + + const SDL_MessageBoxColorScheme *colorScheme; /**< ::SDL_MessageBoxColorScheme, can be NULL to use system settings */ +} SDL_MessageBoxData; + +/** + * \brief Create a modal message box. + * + * \param messageboxdata The SDL_MessageBoxData structure with title, text, etc. + * \param buttonid The pointer to which user id of hit button should be copied. + * + * \return -1 on error, otherwise 0 and buttonid contains user id of button + * hit or -1 if dialog was closed. + * + * \note This function should be called on the thread that created the parent + * window, or on the main thread if the messagebox has no parent. It will + * block execution of that thread until the user clicks a button or + * closes the messagebox. + */ +extern DECLSPEC int SDLCALL SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); + +/** + * \brief Create a simple modal message box + * + * \param flags ::SDL_MessageBoxFlags + * \param title UTF-8 title text + * \param message UTF-8 message text + * \param window The parent window, or NULL for no parent + * + * \return 0 on success, -1 on error + * + * \sa SDL_ShowMessageBox + */ +extern DECLSPEC int SDLCALL SDL_ShowSimpleMessageBox(Uint32 flags, const char *title, const char *message, SDL_Window *window); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_messagebox_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_mouse.h b/lib/SDL2/include/SDL_mouse.h new file mode 100644 index 0000000000..ebfd18fa74 --- /dev/null +++ b/lib/SDL2/include/SDL_mouse.h @@ -0,0 +1,224 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_mouse.h + * + * Include file for SDL mouse event handling. + */ + +#ifndef _SDL_mouse_h +#define _SDL_mouse_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct SDL_Cursor SDL_Cursor; /* Implementation dependent */ + +/** + * \brief Cursor types for SDL_CreateSystemCursor. + */ +typedef enum +{ + SDL_SYSTEM_CURSOR_ARROW, /**< Arrow */ + SDL_SYSTEM_CURSOR_IBEAM, /**< I-beam */ + SDL_SYSTEM_CURSOR_WAIT, /**< Wait */ + SDL_SYSTEM_CURSOR_CROSSHAIR, /**< Crosshair */ + SDL_SYSTEM_CURSOR_WAITARROW, /**< Small wait cursor (or Wait if not available) */ + SDL_SYSTEM_CURSOR_SIZENWSE, /**< Double arrow pointing northwest and southeast */ + SDL_SYSTEM_CURSOR_SIZENESW, /**< Double arrow pointing northeast and southwest */ + SDL_SYSTEM_CURSOR_SIZEWE, /**< Double arrow pointing west and east */ + SDL_SYSTEM_CURSOR_SIZENS, /**< Double arrow pointing north and south */ + SDL_SYSTEM_CURSOR_SIZEALL, /**< Four pointed arrow pointing north, south, east, and west */ + SDL_SYSTEM_CURSOR_NO, /**< Slashed circle or crossbones */ + SDL_SYSTEM_CURSOR_HAND, /**< Hand */ + SDL_NUM_SYSTEM_CURSORS +} SDL_SystemCursor; + +/* Function prototypes */ + +/** + * \brief Get the window which currently has mouse focus. + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_GetMouseFocus(void); + +/** + * \brief Retrieve the current state of the mouse. + * + * The current button state is returned as a button bitmask, which can + * be tested using the SDL_BUTTON(X) macros, and x and y are set to the + * mouse cursor position relative to the focus window for the currently + * selected mouse. You can pass NULL for either x or y. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetMouseState(int *x, int *y); + +/** + * \brief Retrieve the relative state of the mouse. + * + * The current button state is returned as a button bitmask, which can + * be tested using the SDL_BUTTON(X) macros, and x and y are set to the + * mouse deltas since the last call to SDL_GetRelativeMouseState(). + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetRelativeMouseState(int *x, int *y); + +/** + * \brief Moves the mouse to the given position within the window. + * + * \param window The window to move the mouse into, or NULL for the current mouse focus + * \param x The x coordinate within the window + * \param y The y coordinate within the window + * + * \note This function generates a mouse motion event + */ +extern DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_Window * window, + int x, int y); + +/** + * \brief Set relative mouse mode. + * + * \param enabled Whether or not to enable relative mode + * + * \return 0 on success, or -1 if relative mode is not supported. + * + * While the mouse is in relative mode, the cursor is hidden, and the + * driver will try to report continuous motion in the current window. + * Only relative motion events will be delivered, the mouse position + * will not change. + * + * \note This function will flush any pending mouse motion. + * + * \sa SDL_GetRelativeMouseMode() + */ +extern DECLSPEC int SDLCALL SDL_SetRelativeMouseMode(SDL_bool enabled); + +/** + * \brief Query whether relative mouse mode is enabled. + * + * \sa SDL_SetRelativeMouseMode() + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetRelativeMouseMode(void); + +/** + * \brief Create a cursor, using the specified bitmap data and + * mask (in MSB format). + * + * The cursor width must be a multiple of 8 bits. + * + * The cursor is created in black and white according to the following: + * + * + * + * + * + * + *
data mask resulting pixel on screen
0 1 White
1 1 Black
0 0 Transparent
1 0 Inverted color if possible, black + * if not.
+ * + * \sa SDL_FreeCursor() + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateCursor(const Uint8 * data, + const Uint8 * mask, + int w, int h, int hot_x, + int hot_y); + +/** + * \brief Create a color cursor. + * + * \sa SDL_FreeCursor() + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateColorCursor(SDL_Surface *surface, + int hot_x, + int hot_y); + +/** + * \brief Create a system cursor. + * + * \sa SDL_FreeCursor() + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateSystemCursor(SDL_SystemCursor id); + +/** + * \brief Set the active cursor. + */ +extern DECLSPEC void SDLCALL SDL_SetCursor(SDL_Cursor * cursor); + +/** + * \brief Return the active cursor. + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_GetCursor(void); + +/** + * \brief Return the default cursor. + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_GetDefaultCursor(void); + +/** + * \brief Frees a cursor created with SDL_CreateCursor(). + * + * \sa SDL_CreateCursor() + */ +extern DECLSPEC void SDLCALL SDL_FreeCursor(SDL_Cursor * cursor); + +/** + * \brief Toggle whether or not the cursor is shown. + * + * \param toggle 1 to show the cursor, 0 to hide it, -1 to query the current + * state. + * + * \return 1 if the cursor is shown, or 0 if the cursor is hidden. + */ +extern DECLSPEC int SDLCALL SDL_ShowCursor(int toggle); + +/** + * Used as a mask when testing buttons in buttonstate. + * - Button 1: Left mouse button + * - Button 2: Middle mouse button + * - Button 3: Right mouse button + */ +#define SDL_BUTTON(X) (1 << ((X)-1)) +#define SDL_BUTTON_LEFT 1 +#define SDL_BUTTON_MIDDLE 2 +#define SDL_BUTTON_RIGHT 3 +#define SDL_BUTTON_X1 4 +#define SDL_BUTTON_X2 5 +#define SDL_BUTTON_LMASK SDL_BUTTON(SDL_BUTTON_LEFT) +#define SDL_BUTTON_MMASK SDL_BUTTON(SDL_BUTTON_MIDDLE) +#define SDL_BUTTON_RMASK SDL_BUTTON(SDL_BUTTON_RIGHT) +#define SDL_BUTTON_X1MASK SDL_BUTTON(SDL_BUTTON_X1) +#define SDL_BUTTON_X2MASK SDL_BUTTON(SDL_BUTTON_X2) + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_mouse_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_mutex.h b/lib/SDL2/include/SDL_mutex.h new file mode 100644 index 0000000000..3e8b4dbed9 --- /dev/null +++ b/lib/SDL2/include/SDL_mutex.h @@ -0,0 +1,251 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_mutex_h +#define _SDL_mutex_h + +/** + * \file SDL_mutex.h + * + * Functions to provide thread synchronization primitives. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Synchronization functions which can time out return this value + * if they time out. + */ +#define SDL_MUTEX_TIMEDOUT 1 + +/** + * This is the timeout value which corresponds to never time out. + */ +#define SDL_MUTEX_MAXWAIT (~(Uint32)0) + + +/** + * \name Mutex functions + */ +/* @{ */ + +/* The SDL mutex structure, defined in SDL_sysmutex.c */ +struct SDL_mutex; +typedef struct SDL_mutex SDL_mutex; + +/** + * Create a mutex, initialized unlocked. + */ +extern DECLSPEC SDL_mutex *SDLCALL SDL_CreateMutex(void); + +/** + * Lock the mutex. + * + * \return 0, or -1 on error. + */ +#define SDL_mutexP(m) SDL_LockMutex(m) +extern DECLSPEC int SDLCALL SDL_LockMutex(SDL_mutex * mutex); + +/** + * Try to lock the mutex + * + * \return 0, SDL_MUTEX_TIMEDOUT, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_TryLockMutex(SDL_mutex * mutex); + +/** + * Unlock the mutex. + * + * \return 0, or -1 on error. + * + * \warning It is an error to unlock a mutex that has not been locked by + * the current thread, and doing so results in undefined behavior. + */ +#define SDL_mutexV(m) SDL_UnlockMutex(m) +extern DECLSPEC int SDLCALL SDL_UnlockMutex(SDL_mutex * mutex); + +/** + * Destroy a mutex. + */ +extern DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_mutex * mutex); + +/* @} *//* Mutex functions */ + + +/** + * \name Semaphore functions + */ +/* @{ */ + +/* The SDL semaphore structure, defined in SDL_syssem.c */ +struct SDL_semaphore; +typedef struct SDL_semaphore SDL_sem; + +/** + * Create a semaphore, initialized with value, returns NULL on failure. + */ +extern DECLSPEC SDL_sem *SDLCALL SDL_CreateSemaphore(Uint32 initial_value); + +/** + * Destroy a semaphore. + */ +extern DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_sem * sem); + +/** + * This function suspends the calling thread until the semaphore pointed + * to by \c sem has a positive count. It then atomically decreases the + * semaphore count. + */ +extern DECLSPEC int SDLCALL SDL_SemWait(SDL_sem * sem); + +/** + * Non-blocking variant of SDL_SemWait(). + * + * \return 0 if the wait succeeds, ::SDL_MUTEX_TIMEDOUT if the wait would + * block, and -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_SemTryWait(SDL_sem * sem); + +/** + * Variant of SDL_SemWait() with a timeout in milliseconds. + * + * \return 0 if the wait succeeds, ::SDL_MUTEX_TIMEDOUT if the wait does not + * succeed in the allotted time, and -1 on error. + * + * \warning On some platforms this function is implemented by looping with a + * delay of 1 ms, and so should be avoided if possible. + */ +extern DECLSPEC int SDLCALL SDL_SemWaitTimeout(SDL_sem * sem, Uint32 ms); + +/** + * Atomically increases the semaphore's count (not blocking). + * + * \return 0, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_SemPost(SDL_sem * sem); + +/** + * Returns the current count of the semaphore. + */ +extern DECLSPEC Uint32 SDLCALL SDL_SemValue(SDL_sem * sem); + +/* @} *//* Semaphore functions */ + + +/** + * \name Condition variable functions + */ +/* @{ */ + +/* The SDL condition variable structure, defined in SDL_syscond.c */ +struct SDL_cond; +typedef struct SDL_cond SDL_cond; + +/** + * Create a condition variable. + * + * Typical use of condition variables: + * + * Thread A: + * SDL_LockMutex(lock); + * while ( ! condition ) { + * SDL_CondWait(cond, lock); + * } + * SDL_UnlockMutex(lock); + * + * Thread B: + * SDL_LockMutex(lock); + * ... + * condition = true; + * ... + * SDL_CondSignal(cond); + * SDL_UnlockMutex(lock); + * + * There is some discussion whether to signal the condition variable + * with the mutex locked or not. There is some potential performance + * benefit to unlocking first on some platforms, but there are some + * potential race conditions depending on how your code is structured. + * + * In general it's safer to signal the condition variable while the + * mutex is locked. + */ +extern DECLSPEC SDL_cond *SDLCALL SDL_CreateCond(void); + +/** + * Destroy a condition variable. + */ +extern DECLSPEC void SDLCALL SDL_DestroyCond(SDL_cond * cond); + +/** + * Restart one of the threads that are waiting on the condition variable. + * + * \return 0 or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondSignal(SDL_cond * cond); + +/** + * Restart all threads that are waiting on the condition variable. + * + * \return 0 or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondBroadcast(SDL_cond * cond); + +/** + * Wait on the condition variable, unlocking the provided mutex. + * + * \warning The mutex must be locked before entering this function! + * + * The mutex is re-locked once the condition variable is signaled. + * + * \return 0 when it is signaled, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondWait(SDL_cond * cond, SDL_mutex * mutex); + +/** + * Waits for at most \c ms milliseconds, and returns 0 if the condition + * variable is signaled, ::SDL_MUTEX_TIMEDOUT if the condition is not + * signaled in the allotted time, and -1 on error. + * + * \warning On some platforms this function is implemented by looping with a + * delay of 1 ms, and so should be avoided if possible. + */ +extern DECLSPEC int SDLCALL SDL_CondWaitTimeout(SDL_cond * cond, + SDL_mutex * mutex, Uint32 ms); + +/* @} *//* Condition variable functions */ + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_mutex_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_name.h b/lib/SDL2/include/SDL_name.h new file mode 100644 index 0000000000..719666ff1e --- /dev/null +++ b/lib/SDL2/include/SDL_name.h @@ -0,0 +1,33 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDLname_h_ +#define _SDLname_h_ + +#if defined(__STDC__) || defined(__cplusplus) +#define NeedFunctionPrototypes 1 +#endif + +#define SDL_NAME(X) SDL_##X + +#endif /* _SDLname_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_opengl.h b/lib/SDL2/include/SDL_opengl.h new file mode 100644 index 0000000000..b48ea7abe9 --- /dev/null +++ b/lib/SDL2/include/SDL_opengl.h @@ -0,0 +1,11126 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_opengl.h + * + * This is a simple file to encapsulate the OpenGL API headers. + */ + +#ifndef _SDL_opengl_h +#define _SDL_opengl_h + +#include "SDL_config.h" + +#ifndef __IPHONEOS__ + +#ifdef __WIN32__ +#define WIN32_LEAN_AND_MEAN +#ifndef NOMINMAX +#define NOMINMAX /* Don't defined min() and max() */ +#endif +#include +#endif + +#ifdef __glext_h_ +/* Someone has already included glext.h */ +#define NO_SDL_GLEXT +#endif +#ifndef NO_SDL_GLEXT +#define __glext_h_ /* Don't let gl.h include glext.h */ +#endif +#if defined(__MACOSX__) +#include /* Header File For The OpenGL Library */ +#define __X_GL_H +#else +#include /* Header File For The OpenGL Library */ +#endif +#ifndef NO_SDL_GLEXT +#undef __glext_h_ +#endif + +/** + * \file SDL_opengl.h + * + * This file is included because glext.h is not available on some systems. + * If you don't want this version included, simply define ::NO_SDL_GLEXT. + * + * The latest version is available from: + * http://www.opengl.org/registry/ + */ + +/** + * \def NO_SDL_GLEXT + * + * Define this if you have your own version of glext.h and want to disable the + * version included in SDL_opengl.h. + */ + +#if !defined(NO_SDL_GLEXT) && !defined(GL_GLEXT_LEGACY) +#ifndef __glext_h_ +#define __glext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2007-2010 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +/* Header file version number, required by OpenGL ABI for Linux */ +/* glext.h last updated $Date: 2010-08-03 01:30:25 -0700 (Tue, 03 Aug 2010) $ */ +/* Current version at http://www.opengl.org/registry/ */ +#define GL_GLEXT_VERSION 64 +/* Function declaration macros - to move into glplatform.h */ + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#define WIN32_LEAN_AND_MEAN 1 +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +/*************************************************************/ + +#ifndef GL_VERSION_1_2 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#endif + +#ifndef GL_VERSION_1_2_DEPRECATED +#define GL_RESCALE_NORMAL 0x803A +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#endif + +#ifndef GL_ARB_imaging +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#endif + +#ifndef GL_ARB_imaging_DEPRECATED +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#endif + +#ifndef GL_VERSION_1_3 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CLAMP_TO_BORDER 0x812D +#endif + +#ifndef GL_VERSION_1_3_DEPRECATED +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#endif + +#ifndef GL_VERSION_1_4 +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#endif + +#ifndef GL_VERSION_1_4_DEPRECATED +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#endif + +#ifndef GL_VERSION_1_5 +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 +#endif + +#ifndef GL_VERSION_1_5_DEPRECATED +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_FOG_COORD_SRC 0x8450 +#define GL_FOG_COORD 0x8451 +#define GL_CURRENT_FOG_COORD 0x8453 +#define GL_FOG_COORD_ARRAY_TYPE 0x8454 +#define GL_FOG_COORD_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORD_ARRAY_POINTER 0x8456 +#define GL_FOG_COORD_ARRAY 0x8457 +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D +#define GL_SRC0_RGB 0x8580 +#define GL_SRC1_RGB 0x8581 +#define GL_SRC2_RGB 0x8582 +#define GL_SRC0_ALPHA 0x8588 +#define GL_SRC1_ALPHA 0x8589 +#define GL_SRC2_ALPHA 0x858A +#endif + +#ifndef GL_VERSION_2_0 +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#endif + +#ifndef GL_VERSION_2_0_DEPRECATED +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_TEXTURE_COORDS 0x8871 +#endif + +#ifndef GL_VERSION_2_1 +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#endif + +#ifndef GL_VERSION_2_1_DEPRECATED +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B +#endif + +#ifndef GL_VERSION_3_0 +#define GL_COMPARE_REF_TO_TEXTURE 0x884E +#define GL_CLIP_DISTANCE0 0x3000 +#define GL_CLIP_DISTANCE1 0x3001 +#define GL_CLIP_DISTANCE2 0x3002 +#define GL_CLIP_DISTANCE3 0x3003 +#define GL_CLIP_DISTANCE4 0x3004 +#define GL_CLIP_DISTANCE5 0x3005 +#define GL_CLIP_DISTANCE6 0x3006 +#define GL_CLIP_DISTANCE7 0x3007 +#define GL_MAX_CLIP_DISTANCES 0x0D32 +#define GL_MAJOR_VERSION 0x821B +#define GL_MINOR_VERSION 0x821C +#define GL_NUM_EXTENSIONS 0x821D +#define GL_CONTEXT_FLAGS 0x821E +#define GL_DEPTH_BUFFER 0x8223 +#define GL_STENCIL_BUFFER 0x8224 +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RG 0x8226 +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 +#define GL_RGBA32F 0x8814 +#define GL_RGB32F 0x8815 +#define GL_RGBA16F 0x881A +#define GL_RGB16F 0x881B +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_FIXED_ONLY 0x891D +#define GL_MAX_VARYING_COMPONENTS 0x8B4B +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_RGB9_E5 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_RGBA32UI 0x8D70 +#define GL_RGB32UI 0x8D71 +#define GL_RGBA16UI 0x8D76 +#define GL_RGB16UI 0x8D77 +#define GL_RGBA8UI 0x8D7C +#define GL_RGB8UI 0x8D7D +#define GL_RGBA32I 0x8D82 +#define GL_RGB32I 0x8D83 +#define GL_RGBA16I 0x8D88 +#define GL_RGB16I 0x8D89 +#define GL_RGBA8I 0x8D8E +#define GL_RGB8I 0x8D8F +#define GL_RED_INTEGER 0x8D94 +#define GL_GREEN_INTEGER 0x8D95 +#define GL_BLUE_INTEGER 0x8D96 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_BGR_INTEGER 0x8D9A +#define GL_BGRA_INTEGER 0x8D9B +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_QUERY_WAIT 0x8E13 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 +/* Reuse tokens from ARB_depth_buffer_float */ +/* reuse GL_DEPTH_COMPONENT32F */ +/* reuse GL_DEPTH32F_STENCIL8 */ +/* reuse GL_FLOAT_32_UNSIGNED_INT_24_8_REV */ +/* Reuse tokens from ARB_framebuffer_object */ +/* reuse GL_INVALID_FRAMEBUFFER_OPERATION */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE */ +/* reuse GL_FRAMEBUFFER_DEFAULT */ +/* reuse GL_FRAMEBUFFER_UNDEFINED */ +/* reuse GL_DEPTH_STENCIL_ATTACHMENT */ +/* reuse GL_INDEX */ +/* reuse GL_MAX_RENDERBUFFER_SIZE */ +/* reuse GL_DEPTH_STENCIL */ +/* reuse GL_UNSIGNED_INT_24_8 */ +/* reuse GL_DEPTH24_STENCIL8 */ +/* reuse GL_TEXTURE_STENCIL_SIZE */ +/* reuse GL_TEXTURE_RED_TYPE */ +/* reuse GL_TEXTURE_GREEN_TYPE */ +/* reuse GL_TEXTURE_BLUE_TYPE */ +/* reuse GL_TEXTURE_ALPHA_TYPE */ +/* reuse GL_TEXTURE_DEPTH_TYPE */ +/* reuse GL_UNSIGNED_NORMALIZED */ +/* reuse GL_FRAMEBUFFER_BINDING */ +/* reuse GL_DRAW_FRAMEBUFFER_BINDING */ +/* reuse GL_RENDERBUFFER_BINDING */ +/* reuse GL_READ_FRAMEBUFFER */ +/* reuse GL_DRAW_FRAMEBUFFER */ +/* reuse GL_READ_FRAMEBUFFER_BINDING */ +/* reuse GL_RENDERBUFFER_SAMPLES */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */ +/* reuse GL_FRAMEBUFFER_COMPLETE */ +/* reuse GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT */ +/* reuse GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT */ +/* reuse GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER */ +/* reuse GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER */ +/* reuse GL_FRAMEBUFFER_UNSUPPORTED */ +/* reuse GL_MAX_COLOR_ATTACHMENTS */ +/* reuse GL_COLOR_ATTACHMENT0 */ +/* reuse GL_COLOR_ATTACHMENT1 */ +/* reuse GL_COLOR_ATTACHMENT2 */ +/* reuse GL_COLOR_ATTACHMENT3 */ +/* reuse GL_COLOR_ATTACHMENT4 */ +/* reuse GL_COLOR_ATTACHMENT5 */ +/* reuse GL_COLOR_ATTACHMENT6 */ +/* reuse GL_COLOR_ATTACHMENT7 */ +/* reuse GL_COLOR_ATTACHMENT8 */ +/* reuse GL_COLOR_ATTACHMENT9 */ +/* reuse GL_COLOR_ATTACHMENT10 */ +/* reuse GL_COLOR_ATTACHMENT11 */ +/* reuse GL_COLOR_ATTACHMENT12 */ +/* reuse GL_COLOR_ATTACHMENT13 */ +/* reuse GL_COLOR_ATTACHMENT14 */ +/* reuse GL_COLOR_ATTACHMENT15 */ +/* reuse GL_DEPTH_ATTACHMENT */ +/* reuse GL_STENCIL_ATTACHMENT */ +/* reuse GL_FRAMEBUFFER */ +/* reuse GL_RENDERBUFFER */ +/* reuse GL_RENDERBUFFER_WIDTH */ +/* reuse GL_RENDERBUFFER_HEIGHT */ +/* reuse GL_RENDERBUFFER_INTERNAL_FORMAT */ +/* reuse GL_STENCIL_INDEX1 */ +/* reuse GL_STENCIL_INDEX4 */ +/* reuse GL_STENCIL_INDEX8 */ +/* reuse GL_STENCIL_INDEX16 */ +/* reuse GL_RENDERBUFFER_RED_SIZE */ +/* reuse GL_RENDERBUFFER_GREEN_SIZE */ +/* reuse GL_RENDERBUFFER_BLUE_SIZE */ +/* reuse GL_RENDERBUFFER_ALPHA_SIZE */ +/* reuse GL_RENDERBUFFER_DEPTH_SIZE */ +/* reuse GL_RENDERBUFFER_STENCIL_SIZE */ +/* reuse GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE */ +/* reuse GL_MAX_SAMPLES */ +/* Reuse tokens from ARB_framebuffer_sRGB */ +/* reuse GL_FRAMEBUFFER_SRGB */ +/* Reuse tokens from ARB_half_float_vertex */ +/* reuse GL_HALF_FLOAT */ +/* Reuse tokens from ARB_map_buffer_range */ +/* reuse GL_MAP_READ_BIT */ +/* reuse GL_MAP_WRITE_BIT */ +/* reuse GL_MAP_INVALIDATE_RANGE_BIT */ +/* reuse GL_MAP_INVALIDATE_BUFFER_BIT */ +/* reuse GL_MAP_FLUSH_EXPLICIT_BIT */ +/* reuse GL_MAP_UNSYNCHRONIZED_BIT */ +/* Reuse tokens from ARB_texture_compression_rgtc */ +/* reuse GL_COMPRESSED_RED_RGTC1 */ +/* reuse GL_COMPRESSED_SIGNED_RED_RGTC1 */ +/* reuse GL_COMPRESSED_RG_RGTC2 */ +/* reuse GL_COMPRESSED_SIGNED_RG_RGTC2 */ +/* Reuse tokens from ARB_texture_rg */ +/* reuse GL_RG */ +/* reuse GL_RG_INTEGER */ +/* reuse GL_R8 */ +/* reuse GL_R16 */ +/* reuse GL_RG8 */ +/* reuse GL_RG16 */ +/* reuse GL_R16F */ +/* reuse GL_R32F */ +/* reuse GL_RG16F */ +/* reuse GL_RG32F */ +/* reuse GL_R8I */ +/* reuse GL_R8UI */ +/* reuse GL_R16I */ +/* reuse GL_R16UI */ +/* reuse GL_R32I */ +/* reuse GL_R32UI */ +/* reuse GL_RG8I */ +/* reuse GL_RG8UI */ +/* reuse GL_RG16I */ +/* reuse GL_RG16UI */ +/* reuse GL_RG32I */ +/* reuse GL_RG32UI */ +/* Reuse tokens from ARB_vertex_array_object */ +/* reuse GL_VERTEX_ARRAY_BINDING */ +#endif + +#ifndef GL_VERSION_3_0_DEPRECATED +#define GL_CLAMP_VERTEX_COLOR 0x891A +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_ALPHA_INTEGER 0x8D97 +/* Reuse tokens from ARB_framebuffer_object */ +/* reuse GL_TEXTURE_LUMINANCE_TYPE */ +/* reuse GL_TEXTURE_INTENSITY_TYPE */ +#endif + +#ifndef GL_VERSION_3_1 +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT 0x8C2E +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +/* Reuse tokens from ARB_copy_buffer */ +/* reuse GL_COPY_READ_BUFFER */ +/* reuse GL_COPY_WRITE_BUFFER */ +/* Reuse tokens from ARB_draw_instanced (none) */ +/* Reuse tokens from ARB_uniform_buffer_object */ +/* reuse GL_UNIFORM_BUFFER */ +/* reuse GL_UNIFORM_BUFFER_BINDING */ +/* reuse GL_UNIFORM_BUFFER_START */ +/* reuse GL_UNIFORM_BUFFER_SIZE */ +/* reuse GL_MAX_VERTEX_UNIFORM_BLOCKS */ +/* reuse GL_MAX_FRAGMENT_UNIFORM_BLOCKS */ +/* reuse GL_MAX_COMBINED_UNIFORM_BLOCKS */ +/* reuse GL_MAX_UNIFORM_BUFFER_BINDINGS */ +/* reuse GL_MAX_UNIFORM_BLOCK_SIZE */ +/* reuse GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS */ +/* reuse GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS */ +/* reuse GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT */ +/* reuse GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH */ +/* reuse GL_ACTIVE_UNIFORM_BLOCKS */ +/* reuse GL_UNIFORM_TYPE */ +/* reuse GL_UNIFORM_SIZE */ +/* reuse GL_UNIFORM_NAME_LENGTH */ +/* reuse GL_UNIFORM_BLOCK_INDEX */ +/* reuse GL_UNIFORM_OFFSET */ +/* reuse GL_UNIFORM_ARRAY_STRIDE */ +/* reuse GL_UNIFORM_MATRIX_STRIDE */ +/* reuse GL_UNIFORM_IS_ROW_MAJOR */ +/* reuse GL_UNIFORM_BLOCK_BINDING */ +/* reuse GL_UNIFORM_BLOCK_DATA_SIZE */ +/* reuse GL_UNIFORM_BLOCK_NAME_LENGTH */ +/* reuse GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS */ +/* reuse GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES */ +/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER */ +/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER */ +/* reuse GL_INVALID_INDEX */ +#endif + +#ifndef GL_VERSION_3_2 +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_CONTEXT_PROFILE_MASK 0x9126 +/* reuse GL_MAX_VARYING_COMPONENTS */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */ +/* Reuse tokens from ARB_depth_clamp */ +/* reuse GL_DEPTH_CLAMP */ +/* Reuse tokens from ARB_draw_elements_base_vertex (none) */ +/* Reuse tokens from ARB_fragment_coord_conventions (none) */ +/* Reuse tokens from ARB_provoking_vertex */ +/* reuse GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION */ +/* reuse GL_FIRST_VERTEX_CONVENTION */ +/* reuse GL_LAST_VERTEX_CONVENTION */ +/* reuse GL_PROVOKING_VERTEX */ +/* Reuse tokens from ARB_seamless_cube_map */ +/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS */ +/* Reuse tokens from ARB_sync */ +/* reuse GL_MAX_SERVER_WAIT_TIMEOUT */ +/* reuse GL_OBJECT_TYPE */ +/* reuse GL_SYNC_CONDITION */ +/* reuse GL_SYNC_STATUS */ +/* reuse GL_SYNC_FLAGS */ +/* reuse GL_SYNC_FENCE */ +/* reuse GL_SYNC_GPU_COMMANDS_COMPLETE */ +/* reuse GL_UNSIGNALED */ +/* reuse GL_SIGNALED */ +/* reuse GL_ALREADY_SIGNALED */ +/* reuse GL_TIMEOUT_EXPIRED */ +/* reuse GL_CONDITION_SATISFIED */ +/* reuse GL_WAIT_FAILED */ +/* reuse GL_TIMEOUT_IGNORED */ +/* reuse GL_SYNC_FLUSH_COMMANDS_BIT */ +/* reuse GL_TIMEOUT_IGNORED */ +/* Reuse tokens from ARB_texture_multisample */ +/* reuse GL_SAMPLE_POSITION */ +/* reuse GL_SAMPLE_MASK */ +/* reuse GL_SAMPLE_MASK_VALUE */ +/* reuse GL_MAX_SAMPLE_MASK_WORDS */ +/* reuse GL_TEXTURE_2D_MULTISAMPLE */ +/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE */ +/* reuse GL_TEXTURE_2D_MULTISAMPLE_ARRAY */ +/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY */ +/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE */ +/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY */ +/* reuse GL_TEXTURE_SAMPLES */ +/* reuse GL_TEXTURE_FIXED_SAMPLE_LOCATIONS */ +/* reuse GL_SAMPLER_2D_MULTISAMPLE */ +/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE */ +/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE */ +/* reuse GL_SAMPLER_2D_MULTISAMPLE_ARRAY */ +/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */ +/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */ +/* reuse GL_MAX_COLOR_TEXTURE_SAMPLES */ +/* reuse GL_MAX_DEPTH_TEXTURE_SAMPLES */ +/* reuse GL_MAX_INTEGER_SAMPLES */ +/* Don't need to reuse tokens from ARB_vertex_array_bgra since they're already in 1.2 core */ +#endif + +#ifndef GL_VERSION_3_3 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +/* Reuse tokens from ARB_blend_func_extended */ +/* reuse GL_SRC1_COLOR */ +/* reuse GL_ONE_MINUS_SRC1_COLOR */ +/* reuse GL_ONE_MINUS_SRC1_ALPHA */ +/* reuse GL_MAX_DUAL_SOURCE_DRAW_BUFFERS */ +/* Reuse tokens from ARB_explicit_attrib_location (none) */ +/* Reuse tokens from ARB_occlusion_query2 */ +/* reuse GL_ANY_SAMPLES_PASSED */ +/* Reuse tokens from ARB_sampler_objects */ +/* reuse GL_SAMPLER_BINDING */ +/* Reuse tokens from ARB_shader_bit_encoding (none) */ +/* Reuse tokens from ARB_texture_rgb10_a2ui */ +/* reuse GL_RGB10_A2UI */ +/* Reuse tokens from ARB_texture_swizzle */ +/* reuse GL_TEXTURE_SWIZZLE_R */ +/* reuse GL_TEXTURE_SWIZZLE_G */ +/* reuse GL_TEXTURE_SWIZZLE_B */ +/* reuse GL_TEXTURE_SWIZZLE_A */ +/* reuse GL_TEXTURE_SWIZZLE_RGBA */ +/* Reuse tokens from ARB_timer_query */ +/* reuse GL_TIME_ELAPSED */ +/* reuse GL_TIMESTAMP */ +/* Reuse tokens from ARB_vertex_type_2_10_10_10_rev */ +/* reuse GL_INT_2_10_10_10_REV */ +#endif + +#ifndef GL_VERSION_4_0 +#define GL_SAMPLE_SHADING 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F +/* Reuse tokens from ARB_texture_query_lod (none) */ +/* Reuse tokens from ARB_draw_buffers_blend (none) */ +/* Reuse tokens from ARB_draw_indirect */ +/* reuse GL_DRAW_INDIRECT_BUFFER */ +/* reuse GL_DRAW_INDIRECT_BUFFER_BINDING */ +/* Reuse tokens from ARB_gpu_shader5 */ +/* reuse GL_GEOMETRY_SHADER_INVOCATIONS */ +/* reuse GL_MAX_GEOMETRY_SHADER_INVOCATIONS */ +/* reuse GL_MIN_FRAGMENT_INTERPOLATION_OFFSET */ +/* reuse GL_MAX_FRAGMENT_INTERPOLATION_OFFSET */ +/* reuse GL_FRAGMENT_INTERPOLATION_OFFSET_BITS */ +/* reuse GL_MAX_VERTEX_STREAMS */ +/* Reuse tokens from ARB_gpu_shader_fp64 */ +/* reuse GL_DOUBLE_VEC2 */ +/* reuse GL_DOUBLE_VEC3 */ +/* reuse GL_DOUBLE_VEC4 */ +/* reuse GL_DOUBLE_MAT2 */ +/* reuse GL_DOUBLE_MAT3 */ +/* reuse GL_DOUBLE_MAT4 */ +/* reuse GL_DOUBLE_MAT2x3 */ +/* reuse GL_DOUBLE_MAT2x4 */ +/* reuse GL_DOUBLE_MAT3x2 */ +/* reuse GL_DOUBLE_MAT3x4 */ +/* reuse GL_DOUBLE_MAT4x2 */ +/* reuse GL_DOUBLE_MAT4x3 */ +/* Reuse tokens from ARB_shader_subroutine */ +/* reuse GL_ACTIVE_SUBROUTINES */ +/* reuse GL_ACTIVE_SUBROUTINE_UNIFORMS */ +/* reuse GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS */ +/* reuse GL_ACTIVE_SUBROUTINE_MAX_LENGTH */ +/* reuse GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH */ +/* reuse GL_MAX_SUBROUTINES */ +/* reuse GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS */ +/* reuse GL_NUM_COMPATIBLE_SUBROUTINES */ +/* reuse GL_COMPATIBLE_SUBROUTINES */ +/* Reuse tokens from ARB_tessellation_shader */ +/* reuse GL_PATCHES */ +/* reuse GL_PATCH_VERTICES */ +/* reuse GL_PATCH_DEFAULT_INNER_LEVEL */ +/* reuse GL_PATCH_DEFAULT_OUTER_LEVEL */ +/* reuse GL_TESS_CONTROL_OUTPUT_VERTICES */ +/* reuse GL_TESS_GEN_MODE */ +/* reuse GL_TESS_GEN_SPACING */ +/* reuse GL_TESS_GEN_VERTEX_ORDER */ +/* reuse GL_TESS_GEN_POINT_MODE */ +/* reuse GL_ISOLINES */ +/* reuse GL_FRACTIONAL_ODD */ +/* reuse GL_FRACTIONAL_EVEN */ +/* reuse GL_MAX_PATCH_VERTICES */ +/* reuse GL_MAX_TESS_GEN_LEVEL */ +/* reuse GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS */ +/* reuse GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS */ +/* reuse GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS */ +/* reuse GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS */ +/* reuse GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS */ +/* reuse GL_MAX_TESS_PATCH_COMPONENTS */ +/* reuse GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS */ +/* reuse GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS */ +/* reuse GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS */ +/* reuse GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS */ +/* reuse GL_MAX_TESS_CONTROL_INPUT_COMPONENTS */ +/* reuse GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS */ +/* reuse GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS */ +/* reuse GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS */ +/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER */ +/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER */ +/* reuse GL_TESS_EVALUATION_SHADER */ +/* reuse GL_TESS_CONTROL_SHADER */ +/* Reuse tokens from ARB_texture_buffer_object_rgb32 (none) */ +/* Reuse tokens from ARB_transform_feedback2 */ +/* reuse GL_TRANSFORM_FEEDBACK */ +/* reuse GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED */ +/* reuse GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE */ +/* reuse GL_TRANSFORM_FEEDBACK_BINDING */ +/* Reuse tokens from ARB_transform_feedback3 */ +/* reuse GL_MAX_TRANSFORM_FEEDBACK_BUFFERS */ +/* reuse GL_MAX_VERTEX_STREAMS */ +#endif + +#ifndef GL_VERSION_4_1 +/* Reuse tokens from ARB_ES2_compatibility */ +/* reuse GL_FIXED */ +/* reuse GL_IMPLEMENTATION_COLOR_READ_TYPE */ +/* reuse GL_IMPLEMENTATION_COLOR_READ_FORMAT */ +/* reuse GL_LOW_FLOAT */ +/* reuse GL_MEDIUM_FLOAT */ +/* reuse GL_HIGH_FLOAT */ +/* reuse GL_LOW_INT */ +/* reuse GL_MEDIUM_INT */ +/* reuse GL_HIGH_INT */ +/* reuse GL_SHADER_COMPILER */ +/* reuse GL_NUM_SHADER_BINARY_FORMATS */ +/* reuse GL_MAX_VERTEX_UNIFORM_VECTORS */ +/* reuse GL_MAX_VARYING_VECTORS */ +/* reuse GL_MAX_FRAGMENT_UNIFORM_VECTORS */ +/* Reuse tokens from ARB_get_program_binary */ +/* reuse GL_PROGRAM_BINARY_RETRIEVABLE_HINT */ +/* reuse GL_PROGRAM_BINARY_LENGTH */ +/* reuse GL_NUM_PROGRAM_BINARY_FORMATS */ +/* reuse GL_PROGRAM_BINARY_FORMATS */ +/* Reuse tokens from ARB_separate_shader_objects */ +/* reuse GL_VERTEX_SHADER_BIT */ +/* reuse GL_FRAGMENT_SHADER_BIT */ +/* reuse GL_GEOMETRY_SHADER_BIT */ +/* reuse GL_TESS_CONTROL_SHADER_BIT */ +/* reuse GL_TESS_EVALUATION_SHADER_BIT */ +/* reuse GL_ALL_SHADER_BITS */ +/* reuse GL_PROGRAM_SEPARABLE */ +/* reuse GL_ACTIVE_PROGRAM */ +/* reuse GL_PROGRAM_PIPELINE_BINDING */ +/* Reuse tokens from ARB_shader_precision (none) */ +/* Reuse tokens from ARB_vertex_attrib_64bit - all are in GL 3.0 and 4.0 already */ +/* Reuse tokens from ARB_viewport_array - some are in GL 1.1 and ARB_provoking_vertex already */ +/* reuse GL_MAX_VIEWPORTS */ +/* reuse GL_VIEWPORT_SUBPIXEL_BITS */ +/* reuse GL_VIEWPORT_BOUNDS_RANGE */ +/* reuse GL_LAYER_PROVOKING_VERTEX */ +/* reuse GL_VIEWPORT_INDEX_PROVOKING_VERTEX */ +/* reuse GL_UNDEFINED_VERTEX */ +#endif + +#ifndef GL_ARB_multitexture +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +#endif + +#ifndef GL_ARB_transpose_matrix +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +#endif + +#ifndef GL_ARB_multisample +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +#endif + +#ifndef GL_ARB_texture_env_add +#endif + +#ifndef GL_ARB_texture_cube_map +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C +#endif + +#ifndef GL_ARB_texture_compression +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +#endif + +#ifndef GL_ARB_texture_border_clamp +#define GL_CLAMP_TO_BORDER_ARB 0x812D +#endif + +#ifndef GL_ARB_point_parameters +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +#endif + +#ifndef GL_ARB_vertex_blend +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F +#endif + +#ifndef GL_ARB_matrix_palette +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 +#endif + +#ifndef GL_ARB_texture_env_combine +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#endif + +#ifndef GL_ARB_texture_env_crossbar +#endif + +#ifndef GL_ARB_texture_env_dot3 +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF +#endif + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#endif + +#ifndef GL_ARB_depth_texture +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B +#endif + +#ifndef GL_ARB_shadow +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E +#endif + +#ifndef GL_ARB_shadow_ambient +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF +#endif + +#ifndef GL_ARB_window_pos +#endif + +#ifndef GL_ARB_vertex_program +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +#endif + +#ifndef GL_ARB_fragment_program +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#endif + +#ifndef GL_ARB_vertex_buffer_object +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA +#endif + +#ifndef GL_ARB_occlusion_query +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 +#endif + +#ifndef GL_ARB_shader_objects +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +#endif + +#ifndef GL_ARB_vertex_shader +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +#endif + +#ifndef GL_ARB_fragment_shader +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B +#endif + +#ifndef GL_ARB_shading_language_100 +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C +#endif + +#ifndef GL_ARB_texture_non_power_of_two +#endif + +#ifndef GL_ARB_point_sprite +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 +#endif + +#ifndef GL_ARB_fragment_program_shadow +#endif + +#ifndef GL_ARB_draw_buffers +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 +#endif + +#ifndef GL_ARB_texture_rectangle +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#endif + +#ifndef GL_ARB_color_buffer_float +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D +#endif + +#ifndef GL_ARB_half_float_pixel +#define GL_HALF_FLOAT_ARB 0x140B +#endif + +#ifndef GL_ARB_texture_float +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#endif + +#ifndef GL_ARB_pixel_buffer_object +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF +#endif + +#ifndef GL_ARB_depth_buffer_float +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD +#endif + +#ifndef GL_ARB_draw_instanced +#endif + +#ifndef GL_ARB_framebuffer_object +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_DRAW_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT9 0x8CE9 +#define GL_COLOR_ATTACHMENT10 0x8CEA +#define GL_COLOR_ATTACHMENT11 0x8CEB +#define GL_COLOR_ATTACHMENT12 0x8CEC +#define GL_COLOR_ATTACHMENT13 0x8CED +#define GL_COLOR_ATTACHMENT14 0x8CEE +#define GL_COLOR_ATTACHMENT15 0x8CEF +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_STENCIL_INDEX1 0x8D46 +#define GL_STENCIL_INDEX4 0x8D47 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_INDEX16 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_MAX_SAMPLES 0x8D57 +#endif + +#ifndef GL_ARB_framebuffer_object_DEPRECATED +#define GL_INDEX 0x8222 +#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 +#endif + +#ifndef GL_ARB_framebuffer_sRGB +#define GL_FRAMEBUFFER_SRGB 0x8DB9 +#endif + +#ifndef GL_ARB_geometry_shader4 +#define GL_LINES_ADJACENCY_ARB 0x000A +#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B +#define GL_TRIANGLES_ADJACENCY_ARB 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D +#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 +#define GL_GEOMETRY_SHADER_ARB 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 +/* reuse GL_MAX_VARYING_COMPONENTS */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */ +#endif + +#ifndef GL_ARB_half_float_vertex +#define GL_HALF_FLOAT 0x140B +#endif + +#ifndef GL_ARB_instanced_arrays +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE +#endif + +#ifndef GL_ARB_map_buffer_range +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#endif + +#ifndef GL_ARB_texture_buffer_object +#define GL_TEXTURE_BUFFER_ARB 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E +#endif + +#ifndef GL_ARB_texture_compression_rgtc +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE +#endif + +#ifndef GL_ARB_texture_rg +#define GL_RG 0x8227 +#define GL_RG_INTEGER 0x8228 +#define GL_R8 0x8229 +#define GL_R16 0x822A +#define GL_RG8 0x822B +#define GL_RG16 0x822C +#define GL_R16F 0x822D +#define GL_R32F 0x822E +#define GL_RG16F 0x822F +#define GL_RG32F 0x8230 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C +#endif + +#ifndef GL_ARB_vertex_array_object +#define GL_VERTEX_ARRAY_BINDING 0x85B5 +#endif + +#ifndef GL_ARB_uniform_buffer_object +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_INVALID_INDEX 0xFFFFFFFFu +#endif + +#ifndef GL_ARB_compatibility +/* ARB_compatibility just defines tokens from core 3.0 */ +#endif + +#ifndef GL_ARB_copy_buffer +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 +#endif + +#ifndef GL_ARB_shader_texture_lod +#endif + +#ifndef GL_ARB_depth_clamp +#define GL_DEPTH_CLAMP 0x864F +#endif + +#ifndef GL_ARB_draw_elements_base_vertex +#endif + +#ifndef GL_ARB_fragment_coord_conventions +#endif + +#ifndef GL_ARB_provoking_vertex +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_PROVOKING_VERTEX 0x8E4F +#endif + +#ifndef GL_ARB_seamless_cube_map +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F +#endif + +#ifndef GL_ARB_sync +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_OBJECT_TYPE 0x9112 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_STATUS 0x9114 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_UNSIGNALED 0x9118 +#define GL_SIGNALED 0x9119 +#define GL_ALREADY_SIGNALED 0x911A +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_CONDITION_SATISFIED 0x911C +#define GL_WAIT_FAILED 0x911D +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull +#endif + +#ifndef GL_ARB_texture_multisample +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_INTEGER_SAMPLES 0x9110 +#endif + +#ifndef GL_ARB_vertex_array_bgra +/* reuse GL_BGRA */ +#endif + +#ifndef GL_ARB_draw_buffers_blend +#endif + +#ifndef GL_ARB_sample_shading +#define GL_SAMPLE_SHADING_ARB 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 +#endif + +#ifndef GL_ARB_texture_cube_map_array +#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F +#endif + +#ifndef GL_ARB_texture_gather +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F +#endif + +#ifndef GL_ARB_texture_query_lod +#endif + +#ifndef GL_ARB_shading_language_include +#define GL_SHADER_INCLUDE_ARB 0x8DAE +#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 +#define GL_NAMED_STRING_TYPE_ARB 0x8DEA +#endif + +#ifndef GL_ARB_texture_compression_bptc +#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F +#endif + +#ifndef GL_ARB_blend_func_extended +#define GL_SRC1_COLOR 0x88F9 +/* reuse GL_SRC1_ALPHA */ +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC +#endif + +#ifndef GL_ARB_explicit_attrib_location +#endif + +#ifndef GL_ARB_occlusion_query2 +#define GL_ANY_SAMPLES_PASSED 0x8C2F +#endif + +#ifndef GL_ARB_sampler_objects +#define GL_SAMPLER_BINDING 0x8919 +#endif + +#ifndef GL_ARB_shader_bit_encoding +#endif + +#ifndef GL_ARB_texture_rgb10_a2ui +#define GL_RGB10_A2UI 0x906F +#endif + +#ifndef GL_ARB_texture_swizzle +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 +#endif + +#ifndef GL_ARB_timer_query +#define GL_TIME_ELAPSED 0x88BF +#define GL_TIMESTAMP 0x8E28 +#endif + +#ifndef GL_ARB_vertex_type_2_10_10_10_rev +/* reuse GL_UNSIGNED_INT_2_10_10_10_REV */ +#define GL_INT_2_10_10_10_REV 0x8D9F +#endif + +#ifndef GL_ARB_draw_indirect +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 +#endif + +#ifndef GL_ARB_gpu_shader5 +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D +/* reuse GL_MAX_VERTEX_STREAMS */ +#endif + +#ifndef GL_ARB_gpu_shader_fp64 +/* reuse GL_DOUBLE */ +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_MAT2x3 0x8F49 +#define GL_DOUBLE_MAT2x4 0x8F4A +#define GL_DOUBLE_MAT3x2 0x8F4B +#define GL_DOUBLE_MAT3x4 0x8F4C +#define GL_DOUBLE_MAT4x2 0x8F4D +#define GL_DOUBLE_MAT4x3 0x8F4E +#endif + +#ifndef GL_ARB_shader_subroutine +#define GL_ACTIVE_SUBROUTINES 0x8DE5 +#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 +#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 +#define GL_MAX_SUBROUTINES 0x8DE7 +#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 +#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A +#define GL_COMPATIBLE_SUBROUTINES 0x8E4B +/* reuse GL_UNIFORM_SIZE */ +/* reuse GL_UNIFORM_NAME_LENGTH */ +#endif + +#ifndef GL_ARB_tessellation_shader +#define GL_PATCHES 0x000E +#define GL_PATCH_VERTICES 0x8E72 +#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 +#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 +#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 +#define GL_TESS_GEN_MODE 0x8E76 +#define GL_TESS_GEN_SPACING 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 +#define GL_TESS_GEN_POINT_MODE 0x8E79 +/* reuse GL_TRIANGLES */ +/* reuse GL_QUADS */ +#define GL_ISOLINES 0x8E7A +/* reuse GL_EQUAL */ +#define GL_FRACTIONAL_ODD 0x8E7B +#define GL_FRACTIONAL_EVEN 0x8E7C +/* reuse GL_CCW */ +/* reuse GL_CW */ +#define GL_MAX_PATCH_VERTICES 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#endif + +#ifndef GL_ARB_texture_buffer_object_rgb32 +/* reuse GL_RGB32F */ +/* reuse GL_RGB32UI */ +/* reuse GL_RGB32I */ +#endif + +#ifndef GL_ARB_transform_feedback2 +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 +#endif + +#ifndef GL_ARB_transform_feedback3 +#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 +#define GL_MAX_VERTEX_STREAMS 0x8E71 +#endif + +#ifndef GL_ARB_ES2_compatibility +#define GL_FIXED 0x140C +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#endif + +#ifndef GL_ARB_get_program_binary +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_PROGRAM_BINARY_FORMATS 0x87FF +#endif + +#ifndef GL_ARB_separate_shader_objects +#define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT 0x00000002 +#define GL_GEOMETRY_SHADER_BIT 0x00000004 +#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 +#define GL_ALL_SHADER_BITS 0xFFFFFFFF +#define GL_PROGRAM_SEPARABLE 0x8258 +#define GL_ACTIVE_PROGRAM 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING 0x825A +#endif + +#ifndef GL_ARB_shader_precision +#endif + +#ifndef GL_ARB_vertex_attrib_64bit +/* reuse GL_RGB32I */ +/* reuse GL_DOUBLE_VEC2 */ +/* reuse GL_DOUBLE_VEC3 */ +/* reuse GL_DOUBLE_VEC4 */ +/* reuse GL_DOUBLE_MAT2 */ +/* reuse GL_DOUBLE_MAT3 */ +/* reuse GL_DOUBLE_MAT4 */ +/* reuse GL_DOUBLE_MAT2x3 */ +/* reuse GL_DOUBLE_MAT2x4 */ +/* reuse GL_DOUBLE_MAT3x2 */ +/* reuse GL_DOUBLE_MAT3x4 */ +/* reuse GL_DOUBLE_MAT4x2 */ +/* reuse GL_DOUBLE_MAT4x3 */ +#endif + +#ifndef GL_ARB_viewport_array +/* reuse GL_SCISSOR_BOX */ +/* reuse GL_VIEWPORT */ +/* reuse GL_DEPTH_RANGE */ +/* reuse GL_SCISSOR_TEST */ +#define GL_MAX_VIEWPORTS 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE 0x825D +#define GL_LAYER_PROVOKING_VERTEX 0x825E +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F +#define GL_UNDEFINED_VERTEX 0x8260 +/* reuse GL_FIRST_VERTEX_CONVENTION */ +/* reuse GL_LAST_VERTEX_CONVENTION */ +/* reuse GL_PROVOKING_VERTEX */ +#endif + +#ifndef GL_ARB_cl_event +#define GL_SYNC_CL_EVENT_ARB 0x8240 +#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 +#endif + +#ifndef GL_ARB_debug_output +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 +#define GL_DEBUG_SOURCE_API_ARB 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A +#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B +#define GL_DEBUG_TYPE_ERROR_ARB 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 +#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 +#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 +#endif + +#ifndef GL_ARB_robustness +/* reuse GL_NO_ERROR */ +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 +#endif + +#ifndef GL_ARB_shader_stencil_export +#endif + +#ifndef GL_EXT_abgr +#define GL_ABGR_EXT 0x8000 +#endif + +#ifndef GL_EXT_blend_color +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 +#endif + +#ifndef GL_EXT_polygon_offset +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +#endif + +#ifndef GL_EXT_texture +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 +#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#endif + +#ifndef GL_EXT_texture3D +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +#endif + +#ifndef GL_SGIS_texture_filter4 +#define GL_FILTER4_SGIS 0x8146 +#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +#endif + +#ifndef GL_EXT_subtexture +#endif + +#ifndef GL_EXT_copy_texture +#endif + +#ifndef GL_EXT_histogram +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 +#define GL_TABLE_TOO_LARGE_EXT 0x8031 +#endif + +#ifndef GL_EXT_convolution +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 +#endif + +#ifndef GL_SGI_color_matrix +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB +#endif + +#ifndef GL_SGI_color_table +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +#endif + +#ifndef GL_SGIS_pixel_texture +#define GL_PIXEL_TEXTURE_SGIS 0x8353 +#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 +#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 +#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +#endif + +#ifndef GL_SGIX_pixel_texture +#define GL_PIXEL_TEX_GEN_SGIX 0x8139 +#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +#endif + +#ifndef GL_SGIS_texture4D +#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 +#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 +#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 +#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 +#define GL_TEXTURE_4D_SGIS 0x8134 +#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 +#define GL_TEXTURE_4DSIZE_SGIS 0x8136 +#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 +#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 +#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +#endif + +#ifndef GL_SGI_texture_color_table +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#endif + +#ifndef GL_EXT_cmyka +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F +#endif + +#ifndef GL_EXT_texture_object +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A +#endif + +#ifndef GL_SGIS_detail_texture +#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 +#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 +#define GL_LINEAR_DETAIL_SGIS 0x8097 +#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 +#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 +#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A +#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B +#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C +#endif + +#ifndef GL_SGIS_sharpen_texture +#define GL_LINEAR_SHARPEN_SGIS 0x80AD +#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE +#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF +#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 +#endif + +#ifndef GL_EXT_packed_pixels +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 +#endif + +#ifndef GL_SGIS_texture_lod +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D +#endif + +#ifndef GL_SGIS_multisample +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +#endif + +#ifndef GL_EXT_rescale_normal +#define GL_RESCALE_NORMAL_EXT 0x803A +#endif + +#ifndef GL_EXT_vertex_array +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 +#endif + +#ifndef GL_EXT_misc_attribute +#endif + +#ifndef GL_SGIS_generate_mipmap +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 +#endif + +#ifndef GL_SGIX_clipmap +#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 +#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 +#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 +#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 +#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 +#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 +#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 +#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 +#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 +#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D +#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E +#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F +#endif + +#ifndef GL_SGIX_shadow +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D +#endif + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_CLAMP_TO_EDGE_SGIS 0x812F +#endif + +#ifndef GL_SGIS_texture_border_clamp +#define GL_CLAMP_TO_BORDER_SGIS 0x812D +#endif + +#ifndef GL_EXT_blend_minmax +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_BLEND_EQUATION_EXT 0x8009 +#endif + +#ifndef GL_EXT_blend_subtract +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B +#endif + +#ifndef GL_EXT_blend_logic_op +#endif + +#ifndef GL_SGIX_interlace +#define GL_INTERLACE_SGIX 0x8094 +#endif + +#ifndef GL_SGIX_pixel_tiles +#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E +#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F +#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 +#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 +#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 +#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 +#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 +#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 +#endif + +#ifndef GL_SGIS_texture_select +#define GL_DUAL_ALPHA4_SGIS 0x8110 +#define GL_DUAL_ALPHA8_SGIS 0x8111 +#define GL_DUAL_ALPHA12_SGIS 0x8112 +#define GL_DUAL_ALPHA16_SGIS 0x8113 +#define GL_DUAL_LUMINANCE4_SGIS 0x8114 +#define GL_DUAL_LUMINANCE8_SGIS 0x8115 +#define GL_DUAL_LUMINANCE12_SGIS 0x8116 +#define GL_DUAL_LUMINANCE16_SGIS 0x8117 +#define GL_DUAL_INTENSITY4_SGIS 0x8118 +#define GL_DUAL_INTENSITY8_SGIS 0x8119 +#define GL_DUAL_INTENSITY12_SGIS 0x811A +#define GL_DUAL_INTENSITY16_SGIS 0x811B +#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C +#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D +#define GL_QUAD_ALPHA4_SGIS 0x811E +#define GL_QUAD_ALPHA8_SGIS 0x811F +#define GL_QUAD_LUMINANCE4_SGIS 0x8120 +#define GL_QUAD_LUMINANCE8_SGIS 0x8121 +#define GL_QUAD_INTENSITY4_SGIS 0x8122 +#define GL_QUAD_INTENSITY8_SGIS 0x8123 +#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 +#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 +#endif + +#ifndef GL_SGIX_sprite +#define GL_SPRITE_SGIX 0x8148 +#define GL_SPRITE_MODE_SGIX 0x8149 +#define GL_SPRITE_AXIS_SGIX 0x814A +#define GL_SPRITE_TRANSLATION_SGIX 0x814B +#define GL_SPRITE_AXIAL_SGIX 0x814C +#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D +#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E +#endif + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E +#endif + +#ifndef GL_EXT_point_parameters +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +#endif + +#ifndef GL_SGIS_point_parameters +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 +#endif + +#ifndef GL_SGIX_instruments +#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 +#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 +#endif + +#ifndef GL_SGIX_texture_scale_bias +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C +#endif + +#ifndef GL_SGIX_framezoom +#define GL_FRAMEZOOM_SGIX 0x818B +#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C +#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D +#endif + +#ifndef GL_SGIX_tag_sample_buffer +#endif + +#ifndef GL_FfdMaskSGIX +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 +#endif + +#ifndef GL_SGIX_polynomial_ffd +#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 +#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 +#define GL_DEFORMATIONS_MASK_SGIX 0x8196 +#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 +#endif + +#ifndef GL_SGIX_reference_plane +#define GL_REFERENCE_PLANE_SGIX 0x817D +#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E +#endif + +#ifndef GL_SGIX_flush_raster +#endif + +#ifndef GL_SGIX_depth_texture +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 +#endif + +#ifndef GL_SGIS_fog_function +#define GL_FOG_FUNC_SGIS 0x812A +#define GL_FOG_FUNC_POINTS_SGIS 0x812B +#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C +#endif + +#ifndef GL_SGIX_fog_offset +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 +#endif + +#ifndef GL_HP_image_transform +#define GL_IMAGE_SCALE_X_HP 0x8155 +#define GL_IMAGE_SCALE_Y_HP 0x8156 +#define GL_IMAGE_TRANSLATE_X_HP 0x8157 +#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 +#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 +#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A +#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B +#define GL_IMAGE_MAG_FILTER_HP 0x815C +#define GL_IMAGE_MIN_FILTER_HP 0x815D +#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E +#define GL_CUBIC_HP 0x815F +#define GL_AVERAGE_HP 0x8160 +#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 +#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 +#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 +#endif + +#ifndef GL_HP_convolution_border_modes +#define GL_IGNORE_BORDER_HP 0x8150 +#define GL_CONSTANT_BORDER_HP 0x8151 +#define GL_REPLICATE_BORDER_HP 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 +#endif + +#ifndef GL_INGR_palette_buffer +#endif + +#ifndef GL_SGIX_texture_add_env +#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE +#endif + +#ifndef GL_EXT_color_subtable +#endif + +#ifndef GL_PGI_vertex_hints +#define GL_VERTEX_DATA_HINT_PGI 0x1A22A +#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B +#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C +#define GL_MAX_VERTEX_HINT_PGI 0x1A22D +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#endif + +#ifndef GL_PGI_misc_hints +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 +#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD +#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 +#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C +#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E +#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F +#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 +#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 +#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 +#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 +#define GL_CLIP_NEAR_HINT_PGI 0x1A220 +#define GL_CLIP_FAR_HINT_PGI 0x1A221 +#define GL_WIDE_LINE_HINT_PGI 0x1A222 +#define GL_BACK_NORMALS_HINT_PGI 0x1A223 +#endif + +#ifndef GL_EXT_paletted_texture +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#endif + +#ifndef GL_EXT_clip_volume_hint +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 +#endif + +#ifndef GL_SGIX_list_priority +#define GL_LIST_PRIORITY_SGIX 0x8182 +#endif + +#ifndef GL_SGIX_ir_instrument1 +#define GL_IR_INSTRUMENT1_SGIX 0x817F +#endif + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 +#endif + +#ifndef GL_SGIX_texture_lod_bias +#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E +#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F +#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 +#endif + +#ifndef GL_SGIX_shadow_ambient +#define GL_SHADOW_AMBIENT_SGIX 0x80BF +#endif + +#ifndef GL_EXT_index_texture +#endif + +#ifndef GL_EXT_index_material +#define GL_INDEX_MATERIAL_EXT 0x81B8 +#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 +#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA +#endif + +#ifndef GL_EXT_index_func +#define GL_INDEX_TEST_EXT 0x81B5 +#define GL_INDEX_TEST_FUNC_EXT 0x81B6 +#define GL_INDEX_TEST_REF_EXT 0x81B7 +#endif + +#ifndef GL_EXT_index_array_formats +#define GL_IUI_V2F_EXT 0x81AD +#define GL_IUI_V3F_EXT 0x81AE +#define GL_IUI_N3F_V2F_EXT 0x81AF +#define GL_IUI_N3F_V3F_EXT 0x81B0 +#define GL_T2F_IUI_V2F_EXT 0x81B1 +#define GL_T2F_IUI_V3F_EXT 0x81B2 +#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 +#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 +#endif + +#ifndef GL_EXT_compiled_vertex_array +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 +#endif + +#ifndef GL_EXT_cull_vertex +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC +#endif + +#ifndef GL_SGIX_ycrcb +#define GL_YCRCB_422_SGIX 0x81BB +#define GL_YCRCB_444_SGIX 0x81BC +#endif + +#ifndef GL_SGIX_fragment_lighting +#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 +#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 +#define GL_LIGHT_ENV_MODE_SGIX 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B +#define GL_FRAGMENT_LIGHT0_SGIX 0x840C +#define GL_FRAGMENT_LIGHT1_SGIX 0x840D +#define GL_FRAGMENT_LIGHT2_SGIX 0x840E +#define GL_FRAGMENT_LIGHT3_SGIX 0x840F +#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 +#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 +#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 +#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 +#endif + +#ifndef GL_IBM_rasterpos_clip +#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 +#endif + +#ifndef GL_HP_texture_lighting +#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 +#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 +#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 +#endif + +#ifndef GL_EXT_draw_range_elements +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 +#endif + +#ifndef GL_WIN_phong_shading +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB +#endif + +#ifndef GL_WIN_specular_fog +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC +#endif + +#ifndef GL_EXT_light_texture +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +/* reuse GL_FRAGMENT_DEPTH_EXT */ +#endif + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 +#endif + +#ifndef GL_SGIX_impact_pixel_texture +#define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX 0x8184 +#define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX 0x8185 +#define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX 0x8186 +#define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX 0x8187 +#define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX 0x8188 +#define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX 0x8189 +#define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX 0x818A +#endif + +#ifndef GL_EXT_bgra +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 +#endif + +#ifndef GL_SGIX_async +#define GL_ASYNC_MARKER_SGIX 0x8329 +#endif + +#ifndef GL_SGIX_async_pixel +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 +#endif + +#ifndef GL_SGIX_async_histogram +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D +#endif + +#ifndef GL_INTEL_texture_scissor +#endif + +#ifndef GL_INTEL_parallel_arrays +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 +#endif + +#ifndef GL_HP_occlusion_test +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 +#endif + +#ifndef GL_EXT_pixel_transform +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 +#endif + +#ifndef GL_EXT_pixel_transform_color_table +#endif + +#ifndef GL_EXT_shared_texture_palette +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB +#endif + +#ifndef GL_EXT_separate_specular_color +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA +#endif + +#ifndef GL_EXT_secondary_color +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +#endif + +#ifndef GL_EXT_texture_perturb_normal +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF +#endif + +#ifndef GL_EXT_multi_draw_arrays +#endif + +#ifndef GL_EXT_fog_coord +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +#endif + +#ifndef GL_REND_screen_coordinates +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 +#endif + +#ifndef GL_EXT_coordinate_frame +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 +#endif + +#ifndef GL_EXT_texture_env_combine +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A +#endif + +#ifndef GL_APPLE_specular_vector +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 +#endif + +#ifndef GL_APPLE_transform_hint +#define GL_TRANSFORM_HINT_APPLE 0x85B1 +#endif + +#ifndef GL_SGIX_fog_scale +#define GL_FOG_SCALE_SGIX 0x81FC +#define GL_FOG_SCALE_VALUE_SGIX 0x81FD +#endif + +#ifndef GL_SUNX_constant_data +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 +#endif + +#ifndef GL_SUN_global_alpha +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA +#endif + +#ifndef GL_SUN_triangle_list +#define GL_RESTART_SUN 0x0001 +#define GL_REPLACE_MIDDLE_SUN 0x0002 +#define GL_REPLACE_OLDEST_SUN 0x0003 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB +#endif + +#ifndef GL_SUN_vertex +#endif + +#ifndef GL_EXT_blend_func_separate +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +#endif + +#ifndef GL_INGR_color_clamp +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 +#endif + +#ifndef GL_INGR_interlace_read +#define GL_INTERLACE_READ_INGR 0x8568 +#endif + +#ifndef GL_EXT_stencil_wrap +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 +#endif + +#ifndef GL_EXT_422_pixels +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF +#endif + +#ifndef GL_NV_texgen_reflection +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 +#endif + +#ifndef GL_EXT_texture_cube_map +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C +#endif + +#ifndef GL_SUN_convolution_border_modes +#define GL_WRAP_BORDER_SUN 0x81D4 +#endif + +#ifndef GL_EXT_texture_env_add +#endif + +#ifndef GL_EXT_texture_lod_bias +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif + +#ifndef GL_EXT_vertex_weighting +#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW0_EXT GL_MODELVIEW +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 +#endif + +#ifndef GL_NV_light_max_exponent +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 +#endif + +#ifndef GL_NV_vertex_array_range +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 +#endif + +#ifndef GL_NV_register_combiners +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +/* reuse GL_TEXTURE0_ARB */ +/* reuse GL_TEXTURE1_ARB */ +/* reuse GL_ZERO */ +/* reuse GL_NONE */ +/* reuse GL_FOG */ +#endif + +#ifndef GL_NV_fog_distance +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +/* reuse GL_EYE_PLANE */ +#endif + +#ifndef GL_NV_texgen_emboss +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F +#endif + +#ifndef GL_NV_blend_square +#endif + +#ifndef GL_NV_texture_env_combine4 +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B +#endif + +#ifndef GL_MESA_resize_buffers +#endif + +#ifndef GL_MESA_window_pos +#endif + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif + +#ifndef GL_IBM_cull_vertex +#define GL_CULL_VERTEX_IBM 103050 +#endif + +#ifndef GL_IBM_multimode_draw_arrays +#endif + +#ifndef GL_IBM_vertex_array_lists +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 +#endif + +#ifndef GL_SGIX_subsample +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 +#endif + +#ifndef GL_SGIX_ycrcb_subsample +#endif + +#ifndef GL_SGIX_ycrcba +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 +#endif + +#ifndef GL_SGI_depth_pass_instrument +#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 +#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 +#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 +#endif + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 +#endif + +#ifndef GL_3DFX_multisample +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 +#endif + +#ifndef GL_3DFX_tbuffer +#endif + +#ifndef GL_EXT_multisample +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 +#endif + +#ifndef GL_SGIX_vertex_preclip +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF +#endif + +#ifndef GL_SGIX_convolution_accuracy +#define GL_CONVOLUTION_HINT_SGIX 0x8316 +#endif + +#ifndef GL_SGIX_resample +#define GL_PACK_RESAMPLE_SGIX 0x842C +#define GL_UNPACK_RESAMPLE_SGIX 0x842D +#define GL_RESAMPLE_REPLICATE_SGIX 0x842E +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#endif + +#ifndef GL_SGIS_point_line_texgen +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 +#endif + +#ifndef GL_SGIS_texture_color_mask +#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +#endif + +#ifndef GL_EXT_texture_env_dot3 +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 +#endif + +#ifndef GL_ATI_texture_mirror_once +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#endif + +#ifndef GL_NV_fence +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +#endif + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_MIRRORED_REPEAT_IBM 0x8370 +#endif + +#ifndef GL_NV_evaluators +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +#endif + +#ifndef GL_NV_packed_depth_stencil +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA +#endif + +#ifndef GL_NV_register_combiners2 +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +#endif + +#ifndef GL_NV_texture_compression_vtc +#endif + +#ifndef GL_NV_texture_rectangle +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 +#endif + +#ifndef GL_NV_texture_shader +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV +#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV +#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#endif + +#ifndef GL_NV_texture_shader2 +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#endif + +#ifndef GL_NV_vertex_array_range2 +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 +#endif + +#ifndef GL_NV_vertex_program +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +#endif + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B +#endif + +#ifndef GL_SGIX_scalebias_hint +#define GL_SCALEBIAS_HINT_SGIX 0x8322 +#endif + +#ifndef GL_OML_interlace +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 +#endif + +#ifndef GL_OML_subsample +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 +#endif + +#ifndef GL_OML_resample +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 +#endif + +#ifndef GL_NV_copy_depth_to_color +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F +#endif + +#ifndef GL_ATI_envmap_bumpmap +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C +#endif + +#ifndef GL_ATI_fragment_shader +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_REG_6_ATI 0x8927 +#define GL_REG_7_ATI 0x8928 +#define GL_REG_8_ATI 0x8929 +#define GL_REG_9_ATI 0x892A +#define GL_REG_10_ATI 0x892B +#define GL_REG_11_ATI 0x892C +#define GL_REG_12_ATI 0x892D +#define GL_REG_13_ATI 0x892E +#define GL_REG_14_ATI 0x892F +#define GL_REG_15_ATI 0x8930 +#define GL_REG_16_ATI 0x8931 +#define GL_REG_17_ATI 0x8932 +#define GL_REG_18_ATI 0x8933 +#define GL_REG_19_ATI 0x8934 +#define GL_REG_20_ATI 0x8935 +#define GL_REG_21_ATI 0x8936 +#define GL_REG_22_ATI 0x8937 +#define GL_REG_23_ATI 0x8938 +#define GL_REG_24_ATI 0x8939 +#define GL_REG_25_ATI 0x893A +#define GL_REG_26_ATI 0x893B +#define GL_REG_27_ATI 0x893C +#define GL_REG_28_ATI 0x893D +#define GL_REG_29_ATI 0x893E +#define GL_REG_30_ATI 0x893F +#define GL_REG_31_ATI 0x8940 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_CON_8_ATI 0x8949 +#define GL_CON_9_ATI 0x894A +#define GL_CON_10_ATI 0x894B +#define GL_CON_11_ATI 0x894C +#define GL_CON_12_ATI 0x894D +#define GL_CON_13_ATI 0x894E +#define GL_CON_14_ATI 0x894F +#define GL_CON_15_ATI 0x8950 +#define GL_CON_16_ATI 0x8951 +#define GL_CON_17_ATI 0x8952 +#define GL_CON_18_ATI 0x8953 +#define GL_CON_19_ATI 0x8954 +#define GL_CON_20_ATI 0x8955 +#define GL_CON_21_ATI 0x8956 +#define GL_CON_22_ATI 0x8957 +#define GL_CON_23_ATI 0x8958 +#define GL_CON_24_ATI 0x8959 +#define GL_CON_25_ATI 0x895A +#define GL_CON_26_ATI 0x895B +#define GL_CON_27_ATI 0x895C +#define GL_CON_28_ATI 0x895D +#define GL_CON_29_ATI 0x895E +#define GL_CON_30_ATI 0x895F +#define GL_CON_31_ATI 0x8960 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B +#define GL_RED_BIT_ATI 0x00000001 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#endif + +#ifndef GL_ATI_pn_triangles +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 +#endif + +#ifndef GL_ATI_vertex_array_object +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 +#endif + +#ifndef GL_EXT_vertex_shader +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED +#endif + +#ifndef GL_ATI_vertex_streams +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_STREAM0_ATI 0x876C +#define GL_VERTEX_STREAM1_ATI 0x876D +#define GL_VERTEX_STREAM2_ATI 0x876E +#define GL_VERTEX_STREAM3_ATI 0x876F +#define GL_VERTEX_STREAM4_ATI 0x8770 +#define GL_VERTEX_STREAM5_ATI 0x8771 +#define GL_VERTEX_STREAM6_ATI 0x8772 +#define GL_VERTEX_STREAM7_ATI 0x8773 +#define GL_VERTEX_SOURCE_ATI 0x8774 +#endif + +#ifndef GL_ATI_element_array +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +#endif + +#ifndef GL_SUN_mesh_array +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 +#endif + +#ifndef GL_SUN_slice_accum +#define GL_SLICE_ACCUM_SUN 0x85CC +#endif + +#ifndef GL_NV_multisample_filter_hint +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#endif + +#ifndef GL_NV_depth_clamp +#define GL_DEPTH_CLAMP_NV 0x864F +#endif + +#ifndef GL_NV_occlusion_query +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +#endif + +#ifndef GL_NV_point_sprite +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +#endif + +#ifndef GL_NV_texture_shader3 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#endif + +#ifndef GL_NV_vertex_program1_1 +#endif + +#ifndef GL_EXT_shadow_funcs +#endif + +#ifndef GL_EXT_stencil_two_side +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +#endif + +#ifndef GL_ATI_text_fragment_shader +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 +#endif + +#ifndef GL_APPLE_client_storage +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 +#endif + +#ifndef GL_APPLE_element_array +#define GL_ELEMENT_ARRAY_APPLE 0x8A0C +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E +#endif + +#ifndef GL_APPLE_fence +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B +#endif + +#ifndef GL_APPLE_vertex_array_object +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +#endif + +#ifndef GL_APPLE_vertex_array_range +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CLIENT_APPLE 0x85B4 +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF +#endif + +#ifndef GL_APPLE_ycbcr_422 +#define GL_YCBCR_422_APPLE 0x85B9 +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#endif + +#ifndef GL_S3_s3tc +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#endif + +#ifndef GL_ATI_draw_buffers +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 +#endif + +#ifndef GL_ATI_pixel_format_float +#define GL_TYPE_RGBA_FLOAT_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 +#endif + +#ifndef GL_ATI_texture_env_combine3 +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +#endif + +#ifndef GL_ATI_texture_float +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F +#endif + +#ifndef GL_NV_float_buffer +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E +#endif + +#ifndef GL_NV_fragment_program +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 +#endif + +#ifndef GL_NV_half_float +#define GL_HALF_FLOAT_NV 0x140B +#endif + +#ifndef GL_NV_pixel_data_range +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D +#endif + +#ifndef GL_NV_primitive_restart +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 +#endif + +#ifndef GL_NV_texture_expand_normal +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F +#endif + +#ifndef GL_NV_vertex_program2 +#endif + +#ifndef GL_ATI_map_object_buffer +#endif + +#ifndef GL_ATI_separate_stencil +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +#endif + +#ifndef GL_ATI_vertex_attrib_array_object +#endif + +#ifndef GL_OES_read_format +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B +#endif + +#ifndef GL_EXT_depth_bounds_test +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +#endif + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 +#endif + +#ifndef GL_EXT_blend_equation_separate +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +#endif + +#ifndef GL_MESA_pack_invert +#define GL_PACK_INVERT_MESA 0x8758 +#endif + +#ifndef GL_MESA_ycbcr_texture +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 +#endif + +#ifndef GL_EXT_pixel_buffer_object +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF +#endif + +#ifndef GL_NV_fragment_program_option +#endif + +#ifndef GL_NV_fragment_program2 +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 +#endif + +#ifndef GL_NV_vertex_program2_option +/* reuse GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */ +/* reuse GL_MAX_PROGRAM_CALL_DEPTH_NV */ +#endif + +#ifndef GL_NV_vertex_program3 +/* reuse GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */ +#endif + +#ifndef GL_EXT_framebuffer_object +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +#endif + +#ifndef GL_GREMEDY_string_marker +#endif + +#ifndef GL_EXT_packed_depth_stencil +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 +#endif + +#ifndef GL_EXT_stencil_clear_tag +#define GL_STENCIL_TAG_BITS_EXT 0x88F2 +#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 +#endif + +#ifndef GL_EXT_texture_sRGB +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB8_EXT 0x8C41 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 +#define GL_SLUMINANCE_EXT 0x8C46 +#define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_COMPRESSED_SRGB_EXT 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F +#endif + +#ifndef GL_EXT_framebuffer_blit +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT GL_FRAMEBUFFER_BINDING_EXT +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA +#endif + +#ifndef GL_EXT_framebuffer_multisample +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 +#endif + +#ifndef GL_MESAX_texture_stack +#define GL_TEXTURE_1D_STACK_MESAX 0x8759 +#define GL_TEXTURE_2D_STACK_MESAX 0x875A +#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B +#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C +#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D +#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E +#endif + +#ifndef GL_EXT_timer_query +#define GL_TIME_ELAPSED_EXT 0x88BF +#endif + +#ifndef GL_EXT_gpu_program_parameters +#endif + +#ifndef GL_APPLE_flush_buffer_range +#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 +#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 +#endif + +#ifndef GL_NV_gpu_program4 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 +#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 +#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 +#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 +#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 +#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 +#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 +#endif + +#ifndef GL_NV_geometry_program4 +#define GL_LINES_ADJACENCY_EXT 0x000A +#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B +#define GL_TRIANGLES_ADJACENCY_EXT 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +#endif + +#ifndef GL_EXT_geometry_shader4 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +/* reuse GL_GEOMETRY_VERTICES_OUT_EXT */ +/* reuse GL_GEOMETRY_INPUT_TYPE_EXT */ +/* reuse GL_GEOMETRY_OUTPUT_TYPE_EXT */ +/* reuse GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT */ +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +/* reuse GL_LINES_ADJACENCY_EXT */ +/* reuse GL_LINE_STRIP_ADJACENCY_EXT */ +/* reuse GL_TRIANGLES_ADJACENCY_EXT */ +/* reuse GL_TRIANGLE_STRIP_ADJACENCY_EXT */ +/* reuse GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT */ +/* reuse GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT */ +/* reuse GL_PROGRAM_POINT_SIZE_EXT */ +#endif + +#ifndef GL_NV_vertex_program4 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD +#endif + +#ifndef GL_EXT_gpu_shader4 +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 +#endif + +#ifndef GL_EXT_draw_instanced +#endif + +#ifndef GL_EXT_packed_float +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C +#endif + +#ifndef GL_EXT_texture_array +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT */ +#endif + +#ifndef GL_EXT_texture_buffer_object +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E +#endif + +#ifndef GL_EXT_texture_compression_latc +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 +#endif + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE +#endif + +#ifndef GL_EXT_texture_shared_exponent +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F +#endif + +#ifndef GL_NV_depth_buffer_float +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF +#endif + +#ifndef GL_NV_fragment_program4 +#endif + +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 +#endif + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA +#endif + +#ifndef GL_NV_geometry_shader4 +#endif + +#ifndef GL_NV_parameter_buffer_object +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 +#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 +#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 +#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 +#endif + +#ifndef GL_EXT_draw_buffers2 +#endif + +#ifndef GL_NV_transform_feedback +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_ATTRIBS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F +#define GL_LAYER_NV 0x8DAA +#define GL_NEXT_BUFFER_NV -2 +#define GL_SKIP_COMPONENTS4_NV -3 +#define GL_SKIP_COMPONENTS3_NV -4 +#define GL_SKIP_COMPONENTS2_NV -5 +#define GL_SKIP_COMPONENTS1_NV -6 +#endif + +#ifndef GL_EXT_bindable_uniform +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF +#endif + +#ifndef GL_EXT_texture_integer +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGB8UI_EXT 0x8D7D +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGB32I_EXT 0x8D83 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGB16I_EXT 0x8D89 +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGB8I_EXT 0x8D8F +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E +#endif + +#ifndef GL_GREMEDY_frame_terminator +#endif + +#ifndef GL_NV_conditional_render +#define GL_QUERY_WAIT_NV 0x8E13 +#define GL_QUERY_NO_WAIT_NV 0x8E14 +#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 +#endif + +#ifndef GL_NV_present_video +#define GL_FRAME_NV 0x8E26 +#define GL_FIELDS_NV 0x8E27 +#define GL_CURRENT_TIME_NV 0x8E28 +#define GL_NUM_FILL_STREAMS_NV 0x8E29 +#define GL_PRESENT_TIME_NV 0x8E2A +#define GL_PRESENT_DURATION_NV 0x8E2B +#endif + +#ifndef GL_EXT_transform_feedback +#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F +#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C +#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 +#define GL_RASTERIZER_DISCARD_EXT 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 +#endif + +#ifndef GL_EXT_direct_state_access +#define GL_PROGRAM_MATRIX_EXT 0x8E2D +#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E +#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F +#endif + +#ifndef GL_EXT_vertex_array_bgra +/* reuse GL_BGRA */ +#endif + +#ifndef GL_EXT_texture_swizzle +#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 +#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 +#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 +#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 +#endif + +#ifndef GL_NV_explicit_multisample +#define GL_SAMPLE_POSITION_NV 0x8E50 +#define GL_SAMPLE_MASK_NV 0x8E51 +#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 +#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 +#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 +#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 +#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 +#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 +#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 +#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 +#endif + +#ifndef GL_NV_transform_feedback2 +#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 +#endif + +#ifndef GL_ATI_meminfo +#define GL_VBO_FREE_MEMORY_ATI 0x87FB +#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC +#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD +#endif + +#ifndef GL_AMD_performance_monitor +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFMON_RESULT_AMD 0x8BC6 +#endif + +#ifndef GL_AMD_texture_texture4 +#endif + +#ifndef GL_AMD_vertex_shader_tesselator +#define GL_SAMPLER_BUFFER_AMD 0x9001 +#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 +#define GL_TESSELLATION_MODE_AMD 0x9004 +#define GL_TESSELLATION_FACTOR_AMD 0x9005 +#define GL_DISCRETE_AMD 0x9006 +#define GL_CONTINUOUS_AMD 0x9007 +#endif + +#ifndef GL_EXT_provoking_vertex +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_PROVOKING_VERTEX_EXT 0x8E4F +#endif + +#ifndef GL_EXT_texture_snorm +#define GL_ALPHA_SNORM 0x9010 +#define GL_LUMINANCE_SNORM 0x9011 +#define GL_LUMINANCE_ALPHA_SNORM 0x9012 +#define GL_INTENSITY_SNORM 0x9013 +#define GL_ALPHA8_SNORM 0x9014 +#define GL_LUMINANCE8_SNORM 0x9015 +#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 +#define GL_INTENSITY8_SNORM 0x9017 +#define GL_ALPHA16_SNORM 0x9018 +#define GL_LUMINANCE16_SNORM 0x9019 +#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A +#define GL_INTENSITY16_SNORM 0x901B +/* reuse GL_RED_SNORM */ +/* reuse GL_RG_SNORM */ +/* reuse GL_RGB_SNORM */ +/* reuse GL_RGBA_SNORM */ +/* reuse GL_R8_SNORM */ +/* reuse GL_RG8_SNORM */ +/* reuse GL_RGB8_SNORM */ +/* reuse GL_RGBA8_SNORM */ +/* reuse GL_R16_SNORM */ +/* reuse GL_RG16_SNORM */ +/* reuse GL_RGB16_SNORM */ +/* reuse GL_RGBA16_SNORM */ +/* reuse GL_SIGNED_NORMALIZED */ +#endif + +#ifndef GL_AMD_draw_buffers_blend +#endif + +#ifndef GL_APPLE_texture_range +#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 +#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#define GL_STORAGE_PRIVATE_APPLE 0x85BD +/* reuse GL_STORAGE_CACHED_APPLE */ +/* reuse GL_STORAGE_SHARED_APPLE */ +#endif + +#ifndef GL_APPLE_float_pixels +#define GL_HALF_APPLE 0x140B +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_RGBA_FLOAT16_APPLE 0x881A +#define GL_RGB_FLOAT16_APPLE 0x881B +#define GL_ALPHA_FLOAT16_APPLE 0x881C +#define GL_INTENSITY_FLOAT16_APPLE 0x881D +#define GL_LUMINANCE_FLOAT16_APPLE 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F +#define GL_COLOR_FLOAT_APPLE 0x8A0F +#endif + +#ifndef GL_APPLE_vertex_program_evaluators +#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 +#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 +#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 +#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 +#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 +#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 +#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 +#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 +#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 +#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 +#endif + +#ifndef GL_APPLE_aux_depth_stencil +#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 +#endif + +#ifndef GL_APPLE_object_purgeable +#define GL_BUFFER_OBJECT_APPLE 0x85B3 +#define GL_RELEASED_APPLE 0x8A19 +#define GL_VOLATILE_APPLE 0x8A1A +#define GL_RETAINED_APPLE 0x8A1B +#define GL_UNDEFINED_APPLE 0x8A1C +#define GL_PURGEABLE_APPLE 0x8A1D +#endif + +#ifndef GL_APPLE_row_bytes +#define GL_PACK_ROW_BYTES_APPLE 0x8A15 +#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 +#endif + +#ifndef GL_APPLE_rgb_422 +#define GL_RGB_422_APPLE 0x8A1F +/* reuse GL_UNSIGNED_SHORT_8_8_APPLE */ +/* reuse GL_UNSIGNED_SHORT_8_8_REV_APPLE */ +#endif + +#ifndef GL_NV_video_capture +#define GL_VIDEO_BUFFER_NV 0x9020 +#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 +#define GL_FIELD_UPPER_NV 0x9022 +#define GL_FIELD_LOWER_NV 0x9023 +#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 +#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 +#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 +#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 +#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 +#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 +#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A +#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B +#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C +#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D +#define GL_PARTIAL_SUCCESS_NV 0x902E +#define GL_SUCCESS_NV 0x902F +#define GL_FAILURE_NV 0x9030 +#define GL_YCBYCR8_422_NV 0x9031 +#define GL_YCBAYCR8A_4224_NV 0x9032 +#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 +#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 +#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 +#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 +#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 +#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 +#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 +#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A +#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B +#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C +#endif + +#ifndef GL_NV_copy_image +#endif + +#ifndef GL_EXT_separate_shader_objects +#define GL_ACTIVE_PROGRAM_EXT 0x8B8D +#endif + +#ifndef GL_NV_parameter_buffer_object2 +#endif + +#ifndef GL_NV_shader_buffer_load +#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D +#define GL_GPU_ADDRESS_NV 0x8F34 +#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 +#endif + +#ifndef GL_NV_vertex_buffer_unified_memory +#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E +#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F +#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 +#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 +#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 +#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 +#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 +#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 +#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 +#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 +#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 +#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 +#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A +#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B +#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C +#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D +#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E +#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F +#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 +#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 +#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 +#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 +#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 +#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 +#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 +#endif + +#ifndef GL_NV_texture_barrier +#endif + +#ifndef GL_AMD_shader_stencil_export +#endif + +#ifndef GL_AMD_seamless_cubemap_per_texture +/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS_ARB */ +#endif + +#ifndef GL_AMD_conservative_depth +#endif + +#ifndef GL_EXT_shader_image_load_store +#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 +#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A +#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B +#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C +#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D +#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E +#define GL_IMAGE_1D_EXT 0x904C +#define GL_IMAGE_2D_EXT 0x904D +#define GL_IMAGE_3D_EXT 0x904E +#define GL_IMAGE_2D_RECT_EXT 0x904F +#define GL_IMAGE_CUBE_EXT 0x9050 +#define GL_IMAGE_BUFFER_EXT 0x9051 +#define GL_IMAGE_1D_ARRAY_EXT 0x9052 +#define GL_IMAGE_2D_ARRAY_EXT 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 +#define GL_INT_IMAGE_1D_EXT 0x9057 +#define GL_INT_IMAGE_2D_EXT 0x9058 +#define GL_INT_IMAGE_3D_EXT 0x9059 +#define GL_INT_IMAGE_2D_RECT_EXT 0x905A +#define GL_INT_IMAGE_CUBE_EXT 0x905B +#define GL_INT_IMAGE_BUFFER_EXT 0x905C +#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D +#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C +#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D +#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 +#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 +#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF +#endif + +#ifndef GL_EXT_vertex_attrib_64bit +/* reuse GL_DOUBLE */ +#define GL_DOUBLE_VEC2_EXT 0x8FFC +#define GL_DOUBLE_VEC3_EXT 0x8FFD +#define GL_DOUBLE_VEC4_EXT 0x8FFE +#define GL_DOUBLE_MAT2_EXT 0x8F46 +#define GL_DOUBLE_MAT3_EXT 0x8F47 +#define GL_DOUBLE_MAT4_EXT 0x8F48 +#define GL_DOUBLE_MAT2x3_EXT 0x8F49 +#define GL_DOUBLE_MAT2x4_EXT 0x8F4A +#define GL_DOUBLE_MAT3x2_EXT 0x8F4B +#define GL_DOUBLE_MAT3x4_EXT 0x8F4C +#define GL_DOUBLE_MAT4x2_EXT 0x8F4D +#define GL_DOUBLE_MAT4x3_EXT 0x8F4E +#endif + +#ifndef GL_NV_gpu_program5 +#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C +#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D +#define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44 +#define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV 0x8F45 +#endif + +#ifndef GL_NV_gpu_shader5 +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F +#define GL_INT8_NV 0x8FE0 +#define GL_INT8_VEC2_NV 0x8FE1 +#define GL_INT8_VEC3_NV 0x8FE2 +#define GL_INT8_VEC4_NV 0x8FE3 +#define GL_INT16_NV 0x8FE4 +#define GL_INT16_VEC2_NV 0x8FE5 +#define GL_INT16_VEC3_NV 0x8FE6 +#define GL_INT16_VEC4_NV 0x8FE7 +#define GL_INT64_VEC2_NV 0x8FE9 +#define GL_INT64_VEC3_NV 0x8FEA +#define GL_INT64_VEC4_NV 0x8FEB +#define GL_UNSIGNED_INT8_NV 0x8FEC +#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED +#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE +#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF +#define GL_UNSIGNED_INT16_NV 0x8FF0 +#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 +#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 +#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 +#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB +/* reuse GL_PATCHES */ +#endif + +#ifndef GL_NV_shader_buffer_store +#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010 +/* reuse GL_READ_WRITE */ +/* reuse GL_WRITE_ONLY */ +#endif + +#ifndef GL_NV_tessellation_program5 +#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 +#define GL_TESS_CONTROL_PROGRAM_NV 0x891E +#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F +#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 +#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 +#endif + +#ifndef GL_NV_vertex_attrib_integer_64bit +/* reuse GL_INT64_NV */ +/* reuse GL_UNSIGNED_INT64_NV */ +#endif + +#ifndef GL_NV_multisample_coverage +#define GL_COVERAGE_SAMPLES_NV 0x80A9 +#define GL_COLOR_SAMPLES_NV 0x8E20 +#endif + +#ifndef GL_AMD_name_gen_delete +#define GL_DATA_BUFFER_AMD 0x9151 +#define GL_PERFORMANCE_MONITOR_AMD 0x9152 +#define GL_QUERY_OBJECT_AMD 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 +#define GL_SAMPLER_OBJECT_AMD 0x9155 +#endif + +#ifndef GL_AMD_debug_output +#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 +#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 +#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 +#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A +#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B +#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C +#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D +#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E +#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F +#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 +#endif + +#ifndef GL_NV_vdpau_interop +#define GL_SURFACE_STATE_NV 0x86EB +#define GL_SURFACE_REGISTERED_NV 0x86FD +#define GL_SURFACE_MAPPED_NV 0x8700 +#define GL_WRITE_DISCARD_NV 0x88BE +#endif + +#ifndef GL_AMD_transform_feedback3_lines_triangles +#endif + + +/*************************************************************/ + +#include +#ifndef GL_VERSION_2_0 +/* GL type for program/shader text */ +typedef char GLchar; +#endif + +#ifndef GL_VERSION_1_5 +/* GL types for handling large vertex buffer objects */ +#if defined(__APPLE__) +typedef long GLintptr; +typedef long GLsizeiptr; +#else +typedef ptrdiff_t GLintptr; +typedef ptrdiff_t GLsizeiptr; +#endif +#endif + +#ifndef GL_ARB_vertex_buffer_object +/* GL types for handling large vertex buffer objects */ +#if defined(__APPLE__) +typedef long GLintptrARB; +typedef long GLsizeiptrARB; +#else +typedef ptrdiff_t GLintptrARB; +typedef ptrdiff_t GLsizeiptrARB; +#endif +#endif + +#ifndef GL_ARB_shader_objects +/* GL types for program/shader text and shader object handles */ +typedef char GLcharARB; +#if defined(__APPLE__) +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif +#endif + +/* GL type for "half" precision (s10e5) float data in host memory */ +#ifndef GL_ARB_half_float_pixel +typedef unsigned short GLhalfARB; +#endif + +#ifndef GL_NV_half_float +typedef unsigned short GLhalfNV; +#endif + +#ifndef GLEXT_64_TYPES_DEFINED +/* This code block is duplicated in glxext.h, so must be protected */ +#define GLEXT_64_TYPES_DEFINED +/* Define int32_t, int64_t, and uint64_t types for UST/MSC */ +/* (as used in the GL_EXT_timer_query extension). */ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +#elif defined(__sun__) || defined(__digital__) +#include +#if defined(__STDC__) +#if defined(__arch64__) || defined(_LP64) +typedef long int int64_t; +typedef unsigned long int uint64_t; +#else +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +#endif /* __arch64__ */ +#endif /* __STDC__ */ +#elif defined( __VMS ) || defined(__sgi) +#include +#elif defined(__SCO__) || defined(__USLC__) +#include +#elif defined(__UNIXOS2__) || defined(__SOL64__) +typedef long int int32_t; +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +#elif defined(_WIN32) && defined(__GNUC__) +#include +#elif defined(_WIN32) +typedef __int32 int32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else +/* Fallback if nothing above works */ +#include +#endif +#endif + +#ifndef GL_EXT_timer_query +typedef int64_t GLint64EXT; +typedef uint64_t GLuint64EXT; +#endif + +#ifndef GL_ARB_sync +typedef int64_t GLint64; +typedef uint64_t GLuint64; +typedef struct __GLsync *GLsync; +#endif + +#ifndef GL_ARB_cl_event +/* These incomplete types let us declare types compatible with OpenCL's cl_context and cl_event */ +struct _cl_context; +struct _cl_event; +#endif + +#ifndef GL_ARB_debug_output +typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam); +#endif + +#ifndef GL_AMD_debug_output +typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam); +#endif + +#ifndef GL_NV_vdpau_interop +typedef GLintptr GLvdpauSurfaceNV; +#endif + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GLAPI void APIENTRY glBlendEquation (GLenum mode); +GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif + +#ifndef GL_VERSION_1_2_DEPRECATED +#define GL_VERSION_1_2_DEPRECATED 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +GLAPI void APIENTRY glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glGetColorTable (GLenum target, GLenum format, GLenum type, GLvoid *table); +GLAPI void APIENTRY glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +GLAPI void APIENTRY glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +GLAPI void APIENTRY glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +GLAPI void APIENTRY glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params); +GLAPI void APIENTRY glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glConvolutionParameteri (GLenum target, GLenum pname, GLint params); +GLAPI void APIENTRY glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, GLvoid *image); +GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSeparableFilter (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +GLAPI void APIENTRY glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +GLAPI void APIENTRY glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +GLAPI void APIENTRY glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glMinmax (GLenum target, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glResetHistogram (GLenum target); +GLAPI void APIENTRY glResetMinmax (GLenum target); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); +#endif + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTexture (GLenum texture); +GLAPI void APIENTRY glSampleCoverage (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, GLvoid *img); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); +#endif + +#ifndef GL_VERSION_1_3_DEPRECATED +#define GL_VERSION_1_3_DEPRECATED 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClientActiveTexture (GLenum texture); +GLAPI void APIENTRY glMultiTexCoord1d (GLenum target, GLdouble s); +GLAPI void APIENTRY glMultiTexCoord1dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord1f (GLenum target, GLfloat s); +GLAPI void APIENTRY glMultiTexCoord1fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord1i (GLenum target, GLint s); +GLAPI void APIENTRY glMultiTexCoord1iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord1s (GLenum target, GLshort s); +GLAPI void APIENTRY glMultiTexCoord1sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t); +GLAPI void APIENTRY glMultiTexCoord2dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t); +GLAPI void APIENTRY glMultiTexCoord2fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord2i (GLenum target, GLint s, GLint t); +GLAPI void APIENTRY glMultiTexCoord2iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord2s (GLenum target, GLshort s, GLshort t); +GLAPI void APIENTRY glMultiTexCoord2sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void APIENTRY glMultiTexCoord3dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void APIENTRY glMultiTexCoord3fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r); +GLAPI void APIENTRY glMultiTexCoord3iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void APIENTRY glMultiTexCoord3sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void APIENTRY glMultiTexCoord4dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void APIENTRY glMultiTexCoord4fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void APIENTRY glMultiTexCoord4iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void APIENTRY glMultiTexCoord4sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *m); +GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *m); +GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *m); +GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *m); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); +#endif + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param); +GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_VERSION_1_4_DEPRECATED +#define GL_VERSION_1_4_DEPRECATED 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogCoordf (GLfloat coord); +GLAPI void APIENTRY glFogCoordfv (const GLfloat *coord); +GLAPI void APIENTRY glFogCoordd (GLdouble coord); +GLAPI void APIENTRY glFogCoorddv (const GLdouble *coord); +GLAPI void APIENTRY glFogCoordPointer (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *v); +GLAPI void APIENTRY glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *v); +GLAPI void APIENTRY glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *v); +GLAPI void APIENTRY glSecondaryColor3i (GLint red, GLint green, GLint blue); +GLAPI void APIENTRY glSecondaryColor3iv (const GLint *v); +GLAPI void APIENTRY glSecondaryColor3s (GLshort red, GLshort green, GLshort blue); +GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *v); +GLAPI void APIENTRY glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *v); +GLAPI void APIENTRY glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue); +GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *v); +GLAPI void APIENTRY glSecondaryColor3us (GLushort red, GLushort green, GLushort blue); +GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *v); +GLAPI void APIENTRY glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glWindowPos2d (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dv (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2f (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fv (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2i (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2iv (const GLint *v); +GLAPI void APIENTRY glWindowPos2s (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2sv (const GLshort *v); +GLAPI void APIENTRY glWindowPos3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dv (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fv (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3i (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3iv (const GLint *v); +GLAPI void APIENTRY glWindowPos3s (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3sv (const GLshort *v); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); +#endif + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsQuery (GLuint id); +GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id); +GLAPI void APIENTRY glEndQuery (GLenum target); +GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); +GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); +GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); +GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer); +GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); +GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); +GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); +GLAPI GLvoid* APIENTRY glMapBuffer (GLenum target, GLenum access); +GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target); +GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, GLvoid* *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); +typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); +GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); +GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); +GLAPI void APIENTRY glCompileShader (GLuint shader); +GLAPI GLuint APIENTRY glCreateProgram (void); +GLAPI GLuint APIENTRY glCreateShader (GLenum type); +GLAPI void APIENTRY glDeleteProgram (GLuint program); +GLAPI void APIENTRY glDeleteShader (GLuint shader); +GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); +GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); +GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); +GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); +GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); +GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, GLvoid* *pointer); +GLAPI GLboolean APIENTRY glIsProgram (GLuint program); +GLAPI GLboolean APIENTRY glIsShader (GLuint shader); +GLAPI void APIENTRY glLinkProgram (GLuint program); +GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); +GLAPI void APIENTRY glUseProgram (GLuint program); +GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0); +GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); +GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glValidateProgram (GLuint program); +GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); +typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#endif + +#ifndef GL_VERSION_3_0 +#define GL_VERSION_3_0 1 +/* OpenGL 3.0 also reuses entry points from these extensions: */ +/* ARB_framebuffer_object */ +/* ARB_map_buffer_range */ +/* ARB_vertex_array_object */ +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data); +GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); +GLAPI void APIENTRY glEnablei (GLenum target, GLuint index); +GLAPI void APIENTRY glDisablei (GLenum target, GLuint index); +GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index); +GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedback (void); +GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); +GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp); +GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode); +GLAPI void APIENTRY glEndConditionalRender (void); +GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); +GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x); +GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y); +GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x); +GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y); +GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); +GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0); +GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); +GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); +GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); +GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +GLAPI const GLubyte * APIENTRY glGetStringi (GLenum name, GLuint index); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); +typedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); +#endif + +#ifndef GL_VERSION_3_1 +#define GL_VERSION_3_1 1 +/* OpenGL 3.1 also reuses entry points from these extensions: */ +/* ARB_copy_buffer */ +/* ARB_uniform_buffer_object */ +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); +GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); +typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index); +#endif + +#ifndef GL_VERSION_3_2 +#define GL_VERSION_3_2 1 +/* OpenGL 3.2 also reuses entry points from these extensions: */ +/* ARB_draw_elements_base_vertex */ +/* ARB_provoking_vertex */ +/* ARB_sync */ +/* ARB_texture_multisample */ +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); +GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +#endif + +#ifndef GL_VERSION_3_3 +#define GL_VERSION_3_3 1 +/* OpenGL 3.3 also reuses entry points from these extensions: */ +/* ARB_blend_func_extended */ +/* ARB_sampler_objects */ +/* ARB_explicit_attrib_location, but it has none */ +/* ARB_occlusion_query2 (no entry points) */ +/* ARB_shader_bit_encoding (no entry points) */ +/* ARB_texture_rgb10_a2ui (no entry points) */ +/* ARB_texture_swizzle (no entry points) */ +/* ARB_timer_query */ +/* ARB_vertex_type_2_10_10_10_rev */ +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); +#endif + +#ifndef GL_VERSION_4_0 +#define GL_VERSION_4_0 1 +/* OpenGL 4.0 also reuses entry points from these extensions: */ +/* ARB_texture_query_lod (no entry points) */ +/* ARB_draw_indirect */ +/* ARB_gpu_shader5 (no entry points) */ +/* ARB_gpu_shader_fp64 */ +/* ARB_shader_subroutine */ +/* ARB_tessellation_shader */ +/* ARB_texture_buffer_object_rgb32 (no entry points) */ +/* ARB_texture_cube_map_array (no entry points) */ +/* ARB_texture_gather (no entry points) */ +/* ARB_transform_feedback2 */ +/* ARB_transform_feedback3 */ +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMinSampleShading (GLclampf value); +GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLclampf value); +typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#endif + +#ifndef GL_VERSION_4_1 +#define GL_VERSION_4_1 1 +/* OpenGL 4.1 also reuses entry points from these extensions: */ +/* ARB_ES2_compatibility */ +/* ARB_get_program_binary */ +/* ARB_separate_shader_objects */ +/* ARB_shader_precision (no entry points) */ +/* ARB_vertex_attrib_64bit */ +/* ARB_viewport_array */ +#endif + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTextureARB (GLenum texture); +GLAPI void APIENTRY glClientActiveTextureARB (GLenum texture); +GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum target, GLdouble s); +GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum target, GLfloat s); +GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum target, GLint s); +GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum target, GLshort s); +GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t); +GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t); +GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum target, GLint s, GLint t); +GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t); +GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r); +GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum target, const GLshort *v); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); +#endif + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *m); +GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *m); +GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *m); +GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *m); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +#endif + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleCoverageARB (GLclampf value, GLboolean invert); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); +#endif + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 +#endif + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 +#endif + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum target, GLint level, GLvoid *img); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid *img); +#endif + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 +#endif + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfARB (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvARB (GLenum pname, const GLfloat *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWeightbvARB (GLint size, const GLbyte *weights); +GLAPI void APIENTRY glWeightsvARB (GLint size, const GLshort *weights); +GLAPI void APIENTRY glWeightivARB (GLint size, const GLint *weights); +GLAPI void APIENTRY glWeightfvARB (GLint size, const GLfloat *weights); +GLAPI void APIENTRY glWeightdvARB (GLint size, const GLdouble *weights); +GLAPI void APIENTRY glWeightubvARB (GLint size, const GLubyte *weights); +GLAPI void APIENTRY glWeightusvARB (GLint size, const GLushort *weights); +GLAPI void APIENTRY glWeightuivARB (GLint size, const GLuint *weights); +GLAPI void APIENTRY glWeightPointerARB (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glVertexBlendARB (GLint count); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); +typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); +typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); +typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); +typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); +typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); +typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); +#endif + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint index); +GLAPI void APIENTRY glMatrixIndexubvARB (GLint size, const GLubyte *indices); +GLAPI void APIENTRY glMatrixIndexusvARB (GLint size, const GLushort *indices); +GLAPI void APIENTRY glMatrixIndexuivARB (GLint size, const GLuint *indices); +GLAPI void APIENTRY glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 +#endif + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 +#endif + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 +#endif + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 +#endif + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 +#endif + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 +#endif + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 +#endif + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dARB (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2fARB (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2iARB (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2ivARB (const GLint *v); +GLAPI void APIENTRY glWindowPos2sARB (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2svARB (const GLshort *v); +GLAPI void APIENTRY glWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3iARB (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3ivARB (const GLint *v); +GLAPI void APIENTRY glWindowPos3sARB (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3svARB (const GLshort *v); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); +#endif + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttrib1dARB (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1fARB (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1sARB (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2sARB (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint index); +GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint index); +GLAPI void APIENTRY glProgramStringARB (GLenum target, GLenum format, GLsizei len, const GLvoid *string); +GLAPI void APIENTRY glBindProgramARB (GLenum target, GLuint program); +GLAPI void APIENTRY glDeleteProgramsARB (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glGenProgramsARB (GLsizei n, GLuint *programs); +GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetProgramivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramStringARB (GLenum target, GLenum pname, GLvoid *string); +GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint index, GLenum pname, GLvoid* *pointer); +GLAPI GLboolean APIENTRY glIsProgramARB (GLuint program); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); +typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); +#endif + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 +/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ +#endif + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindBufferARB (GLenum target, GLuint buffer); +GLAPI void APIENTRY glDeleteBuffersARB (GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glGenBuffersARB (GLsizei n, GLuint *buffers); +GLAPI GLboolean APIENTRY glIsBufferARB (GLuint buffer); +GLAPI void APIENTRY glBufferDataARB (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); +GLAPI void APIENTRY glBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); +GLAPI void APIENTRY glGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); +GLAPI GLvoid* APIENTRY glMapBufferARB (GLenum target, GLenum access); +GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum target); +GLAPI void APIENTRY glGetBufferParameterivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetBufferPointervARB (GLenum target, GLenum pname, GLvoid* *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); +typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueriesARB (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteQueriesARB (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsQueryARB (GLuint id); +GLAPI void APIENTRY glBeginQueryARB (GLenum target, GLuint id); +GLAPI void APIENTRY glEndQueryARB (GLenum target); +GLAPI void APIENTRY glGetQueryivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectivARB (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); +#endif + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB obj); +GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum pname); +GLAPI void APIENTRY glDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj); +GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum shaderType); +GLAPI void APIENTRY glShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); +GLAPI void APIENTRY glCompileShaderARB (GLhandleARB shaderObj); +GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); +GLAPI void APIENTRY glAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj); +GLAPI void APIENTRY glLinkProgramARB (GLhandleARB programObj); +GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB programObj); +GLAPI void APIENTRY glValidateProgramARB (GLhandleARB programObj); +GLAPI void APIENTRY glUniform1fARB (GLint location, GLfloat v0); +GLAPI void APIENTRY glUniform2fARB (GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glUniform1iARB (GLint location, GLint v0); +GLAPI void APIENTRY glUniform2iARB (GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glUniform1fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform2fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform3fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform4fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform1ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform2ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform3ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform4ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name); +GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params); +GLAPI void APIENTRY glGetUniformivARB (GLhandleARB programObj, GLint location, GLint *params); +GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); +typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#endif + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name); +GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +#endif + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 +#endif + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 +#endif + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 +#endif + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 +#endif + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 +#endif + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersARB (GLsizei n, const GLenum *bufs); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); +#endif + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 +#endif + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClampColorARB (GLenum target, GLenum clamp); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); +#endif + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 +#endif + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 +#endif + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 +#endif + +#ifndef GL_ARB_depth_buffer_float +#define GL_ARB_depth_buffer_float 1 +#endif + +#ifndef GL_ARB_draw_instanced +#define GL_ARB_draw_instanced 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); +#endif + +#ifndef GL_ARB_framebuffer_object +#define GL_ARB_framebuffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer); +GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); +GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer); +GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); +GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); +GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); +GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target); +GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateMipmap (GLenum target); +GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); +typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +#endif + +#ifndef GL_ARB_framebuffer_sRGB +#define GL_ARB_framebuffer_sRGB 1 +#endif + +#ifndef GL_ARB_geometry_shader4 +#define GL_ARB_geometry_shader4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramParameteriARB (GLuint program, GLenum pname, GLint value); +GLAPI void APIENTRY glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#endif + +#ifndef GL_ARB_half_float_vertex +#define GL_ARB_half_float_vertex 1 +#endif + +#ifndef GL_ARB_instanced_arrays +#define GL_ARB_instanced_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribDivisorARB (GLuint index, GLuint divisor); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); +#endif + +#ifndef GL_ARB_map_buffer_range +#define GL_ARB_map_buffer_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLvoid* APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +#endif + +#ifndef GL_ARB_texture_buffer_object +#define GL_ARB_texture_buffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); +#endif + +#ifndef GL_ARB_texture_compression_rgtc +#define GL_ARB_texture_compression_rgtc 1 +#endif + +#ifndef GL_ARB_texture_rg +#define GL_ARB_texture_rg 1 +#endif + +#ifndef GL_ARB_vertex_array_object +#define GL_ARB_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindVertexArray (GLuint array); +GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); +GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); +GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); +#endif + +#ifndef GL_ARB_uniform_buffer_object +#define GL_ARB_uniform_buffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar* *uniformNames, GLuint *uniformIndices); +GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); +GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* *uniformNames, GLuint *uniformIndices); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +#endif + +#ifndef GL_ARB_compatibility +#define GL_ARB_compatibility 1 +#endif + +#ifndef GL_ARB_copy_buffer +#define GL_ARB_copy_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +#endif + +#ifndef GL_ARB_shader_texture_lod +#define GL_ARB_shader_texture_lod 1 +#endif + +#ifndef GL_ARB_depth_clamp +#define GL_ARB_depth_clamp 1 +#endif + +#ifndef GL_ARB_draw_elements_base_vertex +#define GL_ARB_draw_elements_base_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); +GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); +GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex); +GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount, const GLint *basevertex); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount, const GLint *basevertex); +#endif + +#ifndef GL_ARB_fragment_coord_conventions +#define GL_ARB_fragment_coord_conventions 1 +#endif + +#ifndef GL_ARB_provoking_vertex +#define GL_ARB_provoking_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProvokingVertex (GLenum mode); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode); +#endif + +#ifndef GL_ARB_seamless_cube_map +#define GL_ARB_seamless_cube_map 1 +#endif + +#ifndef GL_ARB_sync +#define GL_ARB_sync 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags); +GLAPI GLboolean APIENTRY glIsSync (GLsync sync); +GLAPI void APIENTRY glDeleteSync (GLsync sync); +GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); +typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync); +typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); +typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +#endif + +#ifndef GL_ARB_texture_multisample +#define GL_ARB_texture_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); +GLAPI void APIENTRY glSampleMaski (GLuint index, GLbitfield mask); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); +#endif + +#ifndef GL_ARB_vertex_array_bgra +#define GL_ARB_vertex_array_bgra 1 +#endif + +#ifndef GL_ARB_draw_buffers_blend +#define GL_ARB_draw_buffers_blend 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#endif + +#ifndef GL_ARB_sample_shading +#define GL_ARB_sample_shading 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMinSampleShadingARB (GLclampf value); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value); +#endif + +#ifndef GL_ARB_texture_cube_map_array +#define GL_ARB_texture_cube_map_array 1 +#endif + +#ifndef GL_ARB_texture_gather +#define GL_ARB_texture_gather 1 +#endif + +#ifndef GL_ARB_texture_query_lod +#define GL_ARB_texture_query_lod 1 +#endif + +#ifndef GL_ARB_shading_language_include +#define GL_ARB_shading_language_include 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); +GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name); +GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar* *path, const GLint *length); +GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name); +GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); +GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); +typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* *path, const GLint *length); +typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); +typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); +#endif + +#ifndef GL_ARB_texture_compression_bptc +#define GL_ARB_texture_compression_bptc 1 +#endif + +#ifndef GL_ARB_blend_func_extended +#define GL_ARB_blend_func_extended 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); +#endif + +#ifndef GL_ARB_explicit_attrib_location +#define GL_ARB_explicit_attrib_location 1 +#endif + +#ifndef GL_ARB_occlusion_query2 +#define GL_ARB_occlusion_query2 1 +#endif + +#ifndef GL_ARB_sampler_objects +#define GL_ARB_sampler_objects 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); +GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); +GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler); +GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); +GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); +GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); +GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); +GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param); +GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param); +GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); +typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); +typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); +typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); +#endif + +#ifndef GL_ARB_texture_rgb10_a2ui +#define GL_ARB_texture_rgb10_a2ui 1 +#endif + +#ifndef GL_ARB_texture_swizzle +#define GL_ARB_texture_swizzle 1 +#endif + +#ifndef GL_ARB_timer_query +#define GL_ARB_timer_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target); +GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params); +#endif + +#ifndef GL_ARB_vertex_type_2_10_10_10_rev +#define GL_ARB_vertex_type_2_10_10_10_rev 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color); +GLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color); +GLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color); +GLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +#endif + +#ifndef GL_ARB_draw_indirect +#define GL_ARB_draw_indirect 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const GLvoid *indirect); +GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const GLvoid *indirect); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const GLvoid *indirect); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const GLvoid *indirect); +#endif + +#ifndef GL_ARB_gpu_shader5 +#define GL_ARB_gpu_shader5 1 +#endif + +#ifndef GL_ARB_gpu_shader_fp64 +#define GL_ARB_gpu_shader_fp64 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x); +GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y); +GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); +typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params); +#endif + +#ifndef GL_ARB_shader_subroutine +#define GL_ARB_shader_subroutine 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name); +GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name); +GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices); +GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params); +GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices); +typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); +#endif + +#ifndef GL_ARB_tessellation_shader +#define GL_ARB_tessellation_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value); +GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values); +#endif + +#ifndef GL_ARB_texture_buffer_object_rgb32 +#define GL_ARB_texture_buffer_object_rgb32 1 +#endif + +#ifndef GL_ARB_transform_feedback2 +#define GL_ARB_transform_feedback2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); +GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); +GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id); +GLAPI void APIENTRY glPauseTransformFeedback (void); +GLAPI void APIENTRY glResumeTransformFeedback (void); +GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); +typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); +typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); +#endif + +#ifndef GL_ARB_transform_feedback3 +#define GL_ARB_transform_feedback3 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream); +GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id); +GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index); +GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); +typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +#endif + +#ifndef GL_ARB_ES2_compatibility +#define GL_ARB_ES2_compatibility 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReleaseShaderCompiler (void); +GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length); +GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +GLAPI void APIENTRY glDepthRangef (GLclampf n, GLclampf f); +GLAPI void APIENTRY glClearDepthf (GLclampf d); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); +typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length); +typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f); +typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLclampf d); +#endif + +#ifndef GL_ARB_get_program_binary +#define GL_ARB_get_program_binary 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); +GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length); +GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); +typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); +#endif + +#ifndef GL_ARB_separate_shader_objects +#define GL_ARB_separate_shader_objects 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program); +GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program); +GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar* *strings); +GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines); +GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines); +GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params); +GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0); +GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0); +GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0); +GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0); +GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1); +GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar* *strings); +typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); +typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +#endif + +#ifndef GL_ARB_vertex_attrib_64bit +#define GL_ARB_vertex_attrib_64bit 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params); +#endif + +#ifndef GL_ARB_viewport_array +#define GL_ARB_viewport_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v); +GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v); +GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLclampd *v); +GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLclampd n, GLclampd f); +GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data); +GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v); +typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLclampd *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLclampd n, GLclampd f); +typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); +#endif + +#ifndef GL_ARB_cl_event +#define GL_ARB_cl_event 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context * context, struct _cl_event * event, GLbitfield flags); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context * context, struct _cl_event * event, GLbitfield flags); +#endif + +#ifndef GL_ARB_debug_output +#define GL_ARB_debug_output 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const GLvoid *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const GLvoid *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +#endif + +#ifndef GL_ARB_robustness +#define GL_ARB_robustness 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void); +GLAPI void APIENTRY glGetnMapdvARB (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +GLAPI void APIENTRY glGetnMapfvARB (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +GLAPI void APIENTRY glGetnMapivARB (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +GLAPI void APIENTRY glGetnPixelMapfvARB (GLenum map, GLsizei bufSize, GLfloat *values); +GLAPI void APIENTRY glGetnPixelMapuivARB (GLenum map, GLsizei bufSize, GLuint *values); +GLAPI void APIENTRY glGetnPixelMapusvARB (GLenum map, GLsizei bufSize, GLushort *values); +GLAPI void APIENTRY glGetnPolygonStippleARB (GLsizei bufSize, GLubyte *pattern); +GLAPI void APIENTRY glGetnColorTableARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *table); +GLAPI void APIENTRY glGetnConvolutionFilterARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *image); +GLAPI void APIENTRY glGetnSeparableFilterARB (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, GLvoid *row, GLsizei columnBufSize, GLvoid *column, GLvoid *span); +GLAPI void APIENTRY glGetnHistogramARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); +GLAPI void APIENTRY glGetnMinmaxARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); +GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *img); +GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data); +GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, GLvoid *img); +GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params); +GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); +typedef void (APIENTRYP PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +typedef void (APIENTRYP PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +typedef void (APIENTRYP PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +typedef void (APIENTRYP PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort *values); +typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte *pattern); +typedef void (APIENTRYP PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *table); +typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *image); +typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, GLvoid *row, GLsizei columnBufSize, GLvoid *column, GLvoid *span); +typedef void (APIENTRYP PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); +typedef void (APIENTRYP PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); +typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *img); +typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data); +typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *img); +typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +#endif + +#ifndef GL_ARB_shader_stencil_export +#define GL_ARB_shader_stencil_export 1 +#endif + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 +#endif + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColorEXT (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +#endif + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat factor, GLfloat bias); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); +#endif + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 +#endif + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat *weights); +GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); +typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); +#endif + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glResetHistogramEXT (GLenum target); +GLAPI void APIENTRY glResetMinmaxEXT (GLenum target); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); +#endif + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat params); +GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum target, GLenum pname, GLint params); +GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, GLvoid *image); +GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +#endif + +#ifndef GL_SGI_color_matrix +#define GL_SGI_color_matrix 1 +#endif + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glColorTableParameterivSGI (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glGetColorTableSGI (GLenum target, GLenum format, GLenum type, GLvoid *table); +GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); +#endif + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenSGIX (GLenum mode); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); +#endif + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum pname, GLint param); +GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum pname, const GLint *params); +GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum pname, GLint *params); +GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum pname, GLfloat *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); +#endif + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage4DSGIS (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 +#endif + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 +#endif + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei n, const GLuint *textures, GLboolean *residences); +GLAPI void APIENTRY glBindTextureEXT (GLenum target, GLuint texture); +GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei n, const GLuint *textures); +GLAPI void APIENTRY glGenTexturesEXT (GLsizei n, GLuint *textures); +GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint texture); +GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei n, const GLuint *textures, const GLclampf *priorities); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); +typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); +#endif + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum target, GLfloat *points); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#endif + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum target, GLfloat *points); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#endif + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 +#endif + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 +#endif + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskSGIS (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glSamplePatternSGIS (GLenum pattern); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); +#endif + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 +#endif + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glArrayElementEXT (GLint i); +GLAPI void APIENTRY glColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +GLAPI void APIENTRY glDrawArraysEXT (GLenum mode, GLint first, GLsizei count); +GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean *pointer); +GLAPI void APIENTRY glGetPointervEXT (GLenum pname, GLvoid* *params); +GLAPI void APIENTRY glIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +GLAPI void APIENTRY glNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +GLAPI void APIENTRY glTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +GLAPI void APIENTRY glVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); +typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); +typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 +#endif + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 +#endif + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 +#endif + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 +#endif + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 +#endif + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 +#endif + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationEXT (GLenum mode); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 +#endif + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 +#endif + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 +#endif + +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 +#endif + +#ifndef GL_SGIX_texture_select +#define GL_SGIX_texture_select 1 +#endif + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum pname, GLfloat param); +GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum pname, GLint param); +GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum pname, const GLint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 +#endif + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfEXT (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvEXT (GLenum pname, const GLfloat *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_SGIS_point_parameters +#define GL_SGIS_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfSGIS (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvSGIS (GLenum pname, const GLfloat *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_SGIX_instruments +#define GL_SGIX_instruments 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); +GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei size, GLint *buffer); +GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *marker_p); +GLAPI void APIENTRY glReadInstrumentsSGIX (GLint marker); +GLAPI void APIENTRY glStartInstrumentsSGIX (void); +GLAPI void APIENTRY glStopInstrumentsSGIX (GLint marker); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); +typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); +typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); +typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); +#endif + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 +#endif + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFrameZoomSGIX (GLint factor); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); +#endif + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTagSampleBufferSGIX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); +#endif + +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +GLAPI void APIENTRY glDeformSGIX (GLbitfield mask); +GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield mask); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); +#endif + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *equation); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); +#endif + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushRasterSGIX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); +#endif + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 +#endif + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogFuncSGIS (GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *points); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); +#endif + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 +#endif + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImageTransformParameteriHP (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glImageTransformParameterfHP (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glImageTransformParameterivHP (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum target, GLenum pname, GLfloat *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 +#endif + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 +#endif + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#endif + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 +#endif + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glHintPGI (GLenum target, GLint mode); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); +#endif + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +GLAPI void APIENTRY glGetColorTableEXT (GLenum target, GLenum format, GLenum type, GLvoid *data); +GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 +#endif + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint list, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetListParameterivSGIX (GLuint list, GLenum pname, GLint *params); +GLAPI void APIENTRY glListParameterfSGIX (GLuint list, GLenum pname, GLfloat param); +GLAPI void APIENTRY glListParameterfvSGIX (GLuint list, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glListParameteriSGIX (GLuint list, GLenum pname, GLint param); +GLAPI void APIENTRY glListParameterivSGIX (GLuint list, GLenum pname, const GLint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); +#endif + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 +#endif + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_SGIX_calligraphic_fragment 1 +#endif + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 +#endif + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 +#endif + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 +#endif + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexMaterialEXT (GLenum face, GLenum mode); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); +#endif + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexFuncEXT (GLenum func, GLclampf ref); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); +#endif + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 +#endif + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLockArraysEXT (GLint first, GLsizei count); +GLAPI void APIENTRY glUnlockArraysEXT (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); +#endif + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCullParameterdvEXT (GLenum pname, GLdouble *params); +GLAPI void APIENTRY glCullParameterfvEXT (GLenum pname, GLfloat *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); +#endif + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 +#endif + +#ifndef GL_SGIX_fragment_lighting +#define GL_SGIX_fragment_lighting 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum face, GLenum mode); +GLAPI void APIENTRY glFragmentLightfSGIX (GLenum light, GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum light, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentLightiSGIX (GLenum light, GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentLightivSGIX (GLenum light, GLenum pname, const GLint *params); +GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum pname, const GLint *params); +GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum face, GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum face, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum face, GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum face, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum light, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum light, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum face, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum face, GLenum pname, GLint *params); +GLAPI void APIENTRY glLightEnviSGIX (GLenum pname, GLint param); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); +#endif + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 +#endif + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 +#endif + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +#endif + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 +#endif + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 +#endif + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glApplyTextureEXT (GLenum mode); +GLAPI void APIENTRY glTextureLightEXT (GLenum pname); +GLAPI void APIENTRY glTextureMaterialEXT (GLenum face, GLenum mode); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); +#endif + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 +#endif + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 +#endif + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint marker); +GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *markerp); +GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *markerp); +GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei range); +GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range); +GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint marker); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); +typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); +typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +#endif + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 +#endif + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 +#endif + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer); +GLAPI void APIENTRY glNormalPointervINTEL (GLenum type, const GLvoid* *pointer); +GLAPI void APIENTRY glColorPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer); +GLAPI void APIENTRY glTexCoordPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +#endif + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 +#endif + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 +#endif + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 +#endif + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 +#endif + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glSecondaryColor3iEXT (GLint red, GLint green, GLint blue); +GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *v); +GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue); +GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *v); +GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *v); +GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue); +GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *v); +GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue); +GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *v); +GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureNormalEXT (GLenum mode); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +#endif + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogCoordfEXT (GLfloat coord); +GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *coord); +GLAPI void APIENTRY glFogCoorddEXT (GLdouble coord); +GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *coord); +GLAPI void APIENTRY glFogCoordPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 +#endif + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTangent3bEXT (GLbyte tx, GLbyte ty, GLbyte tz); +GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glTangent3dEXT (GLdouble tx, GLdouble ty, GLdouble tz); +GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glTangent3fEXT (GLfloat tx, GLfloat ty, GLfloat tz); +GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glTangent3iEXT (GLint tx, GLint ty, GLint tz); +GLAPI void APIENTRY glTangent3ivEXT (const GLint *v); +GLAPI void APIENTRY glTangent3sEXT (GLshort tx, GLshort ty, GLshort tz); +GLAPI void APIENTRY glTangent3svEXT (const GLshort *v); +GLAPI void APIENTRY glBinormal3bEXT (GLbyte bx, GLbyte by, GLbyte bz); +GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glBinormal3dEXT (GLdouble bx, GLdouble by, GLdouble bz); +GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glBinormal3fEXT (GLfloat bx, GLfloat by, GLfloat bz); +GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glBinormal3iEXT (GLint bx, GLint by, GLint bz); +GLAPI void APIENTRY glBinormal3ivEXT (const GLint *v); +GLAPI void APIENTRY glBinormal3sEXT (GLshort bx, GLshort by, GLshort bz); +GLAPI void APIENTRY glBinormal3svEXT (const GLshort *v); +GLAPI void APIENTRY glTangentPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glBinormalPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); +typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); +typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); +typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); +typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); +typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); +typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); +typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); +typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); +typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); +typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 +#endif + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 +#endif + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 +#endif + +#ifndef GL_SGIX_fog_scale +#define GL_SGIX_fog_scale 1 +#endif + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFinishTextureSUNX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); +#endif + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte factor); +GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort factor); +GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint factor); +GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat factor); +GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble factor); +GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte factor); +GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort factor); +GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint factor); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +#endif + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint code); +GLAPI void APIENTRY glReplacementCodeusSUN (GLushort code); +GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte code); +GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *code); +GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *code); +GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *code); +GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum type, GLsizei stride, const GLvoid* *pointer); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); +#endif + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *rc, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *rc, const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +#endif + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif + +#ifndef GL_INGR_blend_func_separate +#define GL_INGR_blend_func_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 +#endif + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 +#endif + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 +#endif + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 +#endif + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 +#endif + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 +#endif + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 +#endif + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#endif + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#endif + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexWeightfEXT (GLfloat weight); +GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *weight); +GLAPI void APIENTRY glVertexWeightPointerEXT (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 +#endif + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); +GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei length, const GLvoid *pointer); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid *pointer); +#endif + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerParameterfvNV (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glCombinerParameterfNV (GLenum pname, GLfloat param); +GLAPI void APIENTRY glCombinerParameterivNV (GLenum pname, const GLint *params); +GLAPI void APIENTRY glCombinerParameteriNV (GLenum pname, GLint param); +GLAPI void APIENTRY glCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +GLAPI void APIENTRY glCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +GLAPI void APIENTRY glFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); +#endif + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 +#endif + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 +#endif + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 +#endif + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 +#endif + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glResizeBuffersMESA (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); +#endif + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dMESA (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2fMESA (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2iMESA (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos2sMESA (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *v); +GLAPI void APIENTRY glWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3iMESA (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos3sMESA (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *v); +GLAPI void APIENTRY glWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *v); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); +#endif + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 +#endif + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); +#endif + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint stride, const GLboolean* *pointer, GLint ptrstride); +GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +GLAPI void APIENTRY glIndexPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +GLAPI void APIENTRY glNormalPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +GLAPI void APIENTRY glTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +GLAPI void APIENTRY glVertexPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +#endif + +#ifndef GL_SGIX_subsample +#define GL_SGIX_subsample 1 +#endif + +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 +#endif + +#ifndef GL_SGIX_ycrcb_subsample +#define GL_SGIX_ycrcb_subsample 1 +#endif + +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 +#endif + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 +#endif + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 +#endif + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTbufferMask3DFX (GLuint mask); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); +#endif + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskEXT (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glSamplePatternEXT (GLenum pattern); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); +#endif + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 +#endif + +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 +#endif + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 +#endif + +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 +#endif + +#ifndef GL_SGIS_texture_color_mask +#define GL_SGIS_texture_color_mask 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +#endif + +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum pname, const GLvoid *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); +#endif + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#endif + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 +#endif + +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); +GLAPI void APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); +GLAPI GLboolean APIENTRY glIsFenceNV (GLuint fence); +GLAPI GLboolean APIENTRY glTestFenceNV (GLuint fence); +GLAPI void APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); +GLAPI void APIENTRY glFinishFenceNV (GLuint fence); +GLAPI void APIENTRY glSetFenceNV (GLuint fence, GLenum condition); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#endif + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); +GLAPI void APIENTRY glMapParameterivNV (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMapParameterfvNV (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); +GLAPI void APIENTRY glGetMapParameterivNV (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glEvalMapsNV (GLenum target, GLenum mode); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); +typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +#endif + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 +#endif + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 +#endif + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 +#endif + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 +#endif + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 +#endif + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 +#endif + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei n, const GLuint *programs, GLboolean *residences); +GLAPI void APIENTRY glBindProgramNV (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteProgramsNV (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glExecuteProgramNV (GLenum target, GLuint id, const GLfloat *params); +GLAPI void APIENTRY glGenProgramsNV (GLsizei n, GLuint *programs); +GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetProgramivNV (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramStringNV (GLuint id, GLenum pname, GLubyte *program); +GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribivNV (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint index, GLenum pname, GLvoid* *pointer); +GLAPI GLboolean APIENTRY glIsProgramNV (GLuint id); +GLAPI void APIENTRY glLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +GLAPI void APIENTRY glProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v); +GLAPI void APIENTRY glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v); +GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLuint count, const GLdouble *v); +GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLuint count, const GLfloat *v); +GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform); +GLAPI void APIENTRY glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glVertexAttrib1dNV (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1fNV (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1sNV (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2sNV (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs1svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs2svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs3svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs4svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint index, GLsizei count, const GLubyte *v); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); +typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); +typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v); +typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); +#endif + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 +#endif + +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 +#endif + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 +#endif + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 +#endif + +#ifndef GL_OML_resample +#define GL_OML_resample 1 +#endif + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 +#endif + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBumpParameterivATI (GLenum pname, const GLint *param); +GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum pname, GLint *param); +GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +#endif + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint range); +GLAPI void APIENTRY glBindFragmentShaderATI (GLuint id); +GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint id); +GLAPI void APIENTRY glBeginFragmentShaderATI (void); +GLAPI void APIENTRY glEndFragmentShaderATI (void); +GLAPI void APIENTRY glPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle); +GLAPI void APIENTRY glSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle); +GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint dst, const GLfloat *value); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); +#endif + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPNTrianglesiATI (GLenum pname, GLint param); +GLAPI void APIENTRY glPNTrianglesfATI (GLenum pname, GLfloat param); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +#endif + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei size, const GLvoid *pointer, GLenum usage); +GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); +GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glFreeObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetArrayObjectivATI (GLenum array, GLenum pname, GLint *params); +GLAPI void APIENTRY glVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); +typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); +#endif + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVertexShaderEXT (void); +GLAPI void APIENTRY glEndVertexShaderEXT (void); +GLAPI void APIENTRY glBindVertexShaderEXT (GLuint id); +GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint range); +GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint id); +GLAPI void APIENTRY glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1); +GLAPI void APIENTRY glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +GLAPI void APIENTRY glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +GLAPI void APIENTRY glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +GLAPI void APIENTRY glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +GLAPI void APIENTRY glInsertComponentEXT (GLuint res, GLuint src, GLuint num); +GLAPI void APIENTRY glExtractComponentEXT (GLuint res, GLuint src, GLuint num); +GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +GLAPI void APIENTRY glSetInvariantEXT (GLuint id, GLenum type, const GLvoid *addr); +GLAPI void APIENTRY glSetLocalConstantEXT (GLuint id, GLenum type, const GLvoid *addr); +GLAPI void APIENTRY glVariantbvEXT (GLuint id, const GLbyte *addr); +GLAPI void APIENTRY glVariantsvEXT (GLuint id, const GLshort *addr); +GLAPI void APIENTRY glVariantivEXT (GLuint id, const GLint *addr); +GLAPI void APIENTRY glVariantfvEXT (GLuint id, const GLfloat *addr); +GLAPI void APIENTRY glVariantdvEXT (GLuint id, const GLdouble *addr); +GLAPI void APIENTRY glVariantubvEXT (GLuint id, const GLubyte *addr); +GLAPI void APIENTRY glVariantusvEXT (GLuint id, const GLushort *addr); +GLAPI void APIENTRY glVariantuivEXT (GLuint id, const GLuint *addr); +GLAPI void APIENTRY glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); +GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint id); +GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint id); +GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum light, GLenum value); +GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum face, GLenum value); +GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value); +GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum unit, GLenum value); +GLAPI GLuint APIENTRY glBindParameterEXT (GLenum value); +GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint id, GLenum cap); +GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +GLAPI void APIENTRY glGetVariantPointervEXT (GLuint id, GLenum value, GLvoid* *data); +GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); +typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); +typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); +typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); +typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); +typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); +typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); +typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); +typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); +typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); +typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); +typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* *data); +typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +#endif + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexStream1sATI (GLenum stream, GLshort x); +GLAPI void APIENTRY glVertexStream1svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream1iATI (GLenum stream, GLint x); +GLAPI void APIENTRY glVertexStream1ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream1fATI (GLenum stream, GLfloat x); +GLAPI void APIENTRY glVertexStream1fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream1dATI (GLenum stream, GLdouble x); +GLAPI void APIENTRY glVertexStream1dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream2sATI (GLenum stream, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexStream2svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream2iATI (GLenum stream, GLint x, GLint y); +GLAPI void APIENTRY glVertexStream2ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexStream2fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexStream2dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexStream3svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexStream3ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexStream3fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexStream3dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexStream4svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexStream4ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexStream4fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexStream4dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glNormalStream3bATI (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +GLAPI void APIENTRY glNormalStream3bvATI (GLenum stream, const GLbyte *coords); +GLAPI void APIENTRY glNormalStream3sATI (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +GLAPI void APIENTRY glNormalStream3svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glNormalStream3iATI (GLenum stream, GLint nx, GLint ny, GLint nz); +GLAPI void APIENTRY glNormalStream3ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glNormalStream3fATI (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI void APIENTRY glNormalStream3fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glNormalStream3dATI (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +GLAPI void APIENTRY glNormalStream3dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum stream); +GLAPI void APIENTRY glVertexBlendEnviATI (GLenum pname, GLint param); +GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum pname, GLfloat param); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +#endif + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerATI (GLenum type, const GLvoid *pointer); +GLAPI void APIENTRY glDrawElementArrayATI (GLenum mode, GLsizei count); +GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +#endif + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); +#endif + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 +#endif + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 +#endif + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 +#endif + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint id); +GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint id); +GLAPI void APIENTRY glEndOcclusionQueryNV (void); +GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); +#endif + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameteriNV (GLenum pname, GLint param); +GLAPI void APIENTRY glPointParameterivNV (GLenum pname, const GLint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 +#endif + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 +#endif + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 +#endif + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum face); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); +#endif + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 +#endif + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 +#endif + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerAPPLE (GLenum type, const GLvoid *pointer); +GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count); +GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#endif + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenFencesAPPLE (GLsizei n, GLuint *fences); +GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei n, const GLuint *fences); +GLAPI void APIENTRY glSetFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint fence); +GLAPI void APIENTRY glFinishFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum object, GLuint name); +GLAPI void APIENTRY glFinishObjectAPPLE (GLenum object, GLint name); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); +typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); +typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +#endif + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint array); +GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei n, const GLuint *arrays); +GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei n, GLuint *arrays); +GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint array); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); +#endif + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei length, GLvoid *pointer); +GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei length, GLvoid *pointer); +GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum pname, GLint param); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +#endif + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 +#endif + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 +#endif + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersATI (GLsizei n, const GLenum *bufs); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); +#endif + +#ifndef GL_ATI_pixel_format_float +#define GL_ATI_pixel_format_float 1 +/* This is really a WGL extension, but defines some associated GL enums. + * ATI does not export "GL_ATI_pixel_format_float" in the GL_EXTENSIONS string. + */ +#endif + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 +#endif + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 +#endif + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 +#endif + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 +/* Some NV_fragment_program entry points are shared with ARB_vertex_program. */ +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#endif + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertex2hNV (GLhalfNV x, GLhalfNV y); +GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertex3hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z); +GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertex4hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glNormal3hNV (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glColor4hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV s); +GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV s, GLhalfNV t); +GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r); +GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum target, GLhalfNV s); +GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum target, GLhalfNV s, GLhalfNV t); +GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glFogCoordhNV (GLhalfNV fog); +GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *fog); +GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV weight); +GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *weight); +GLAPI void APIENTRY glVertexAttrib1hNV (GLuint index, GLhalfNV x); +GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib2hNV (GLuint index, GLhalfNV x, GLhalfNV y); +GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib3hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib4hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); +typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); +typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +#endif + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelDataRangeNV (GLenum target, GLsizei length, GLvoid *pointer); +GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum target); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +#endif + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPrimitiveRestartNV (void); +GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint index); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +#endif + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 +#endif + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 +#endif + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLvoid* APIENTRY glMapObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint buffer); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLvoid* (APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); +#endif + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#endif + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); +#endif + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 +#endif + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthBoundsEXT (GLclampd zmin, GLclampd zmax); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); +#endif + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 +#endif + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); +#endif + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 +#endif + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 +#endif + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 +#endif + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 +#endif + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 +#endif + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 +#endif + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 +#endif + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint renderbuffer); +GLAPI void APIENTRY glBindRenderbufferEXT (GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers); +GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint framebuffer); +GLAPI void APIENTRY glBindFramebufferEXT (GLenum target, GLuint framebuffer); +GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers); +GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei n, GLuint *framebuffers); +GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum target); +GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateMipmapEXT (GLenum target); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +#endif + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei len, const GLvoid *string); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid *string); +#endif + +#ifndef GL_EXT_packed_depth_stencil +#define GL_EXT_packed_depth_stencil 1 +#endif + +#ifndef GL_EXT_stencil_clear_tag +#define GL_EXT_stencil_clear_tag 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilClearTagEXT (GLsizei stencilTagBits, GLuint stencilClearTag); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag); +#endif + +#ifndef GL_EXT_texture_sRGB +#define GL_EXT_texture_sRGB 1 +#endif + +#ifndef GL_EXT_framebuffer_blit +#define GL_EXT_framebuffer_blit 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif + +#ifndef GL_EXT_framebuffer_multisample +#define GL_EXT_framebuffer_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif + +#ifndef GL_MESAX_texture_stack +#define GL_MESAX_texture_stack 1 +#endif + +#ifndef GL_EXT_timer_query +#define GL_EXT_timer_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64EXT *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); +#endif + +#ifndef GL_EXT_gpu_program_parameters +#define GL_EXT_gpu_program_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +#endif + +#ifndef GL_APPLE_flush_buffer_range +#define GL_APPLE_flush_buffer_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferParameteriAPPLE (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glFlushMappedBufferRangeAPPLE (GLenum target, GLintptr offset, GLsizeiptr size); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); +#endif + +#ifndef GL_NV_gpu_program4 +#define GL_NV_gpu_program4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params); +GLAPI void APIENTRY glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); +#endif + +#ifndef GL_NV_geometry_program4 +#define GL_NV_geometry_program4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramVertexLimitNV (GLenum target, GLint limit); +GLAPI void APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#endif + +#ifndef GL_EXT_geometry_shader4 +#define GL_EXT_geometry_shader4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); +#endif + +#ifndef GL_NV_vertex_program4 +#define GL_NV_vertex_program4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribI1iEXT (GLuint index, GLint x); +GLAPI void APIENTRY glVertexAttribI2iEXT (GLuint index, GLint x, GLint y); +GLAPI void APIENTRY glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexAttribI1uiEXT (GLuint index, GLuint x); +GLAPI void APIENTRY glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y); +GLAPI void APIENTRY glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI void APIENTRY glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glVertexAttribI1ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI2ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI3ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI4ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI1uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI2uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI3uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4bvEXT (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttribI4svEXT (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribI4usvEXT (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); +#endif + +#ifndef GL_EXT_gpu_shader4 +#define GL_EXT_gpu_shader4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetUniformuivEXT (GLuint program, GLint location, GLuint *params); +GLAPI void APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataLocationEXT (GLuint program, const GLchar *name); +GLAPI void APIENTRY glUniform1uiEXT (GLint location, GLuint v0); +GLAPI void APIENTRY glUniform2uiEXT (GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +#endif + +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); +#endif + +#ifndef GL_EXT_packed_float +#define GL_EXT_packed_float 1 +#endif + +#ifndef GL_EXT_texture_array +#define GL_EXT_texture_array 1 +#endif + +#ifndef GL_EXT_texture_buffer_object +#define GL_EXT_texture_buffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); +#endif + +#ifndef GL_EXT_texture_compression_latc +#define GL_EXT_texture_compression_latc 1 +#endif + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 +#endif + +#ifndef GL_EXT_texture_shared_exponent +#define GL_EXT_texture_shared_exponent 1 +#endif + +#ifndef GL_NV_depth_buffer_float +#define GL_NV_depth_buffer_float 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthRangedNV (GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glClearDepthdNV (GLdouble depth); +GLAPI void APIENTRY glDepthBoundsdNV (GLdouble zmin, GLdouble zmax); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); +typedef void (APIENTRYP PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); +#endif + +#ifndef GL_NV_fragment_program4 +#define GL_NV_fragment_program4 1 +#endif + +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_NV_framebuffer_multisample_coverage 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +#endif + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_EXT_framebuffer_sRGB 1 +#endif + +#ifndef GL_NV_geometry_shader4 +#define GL_NV_geometry_shader4 1 +#endif + +#ifndef GL_NV_parameter_buffer_object +#define GL_NV_parameter_buffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramBufferParametersfvNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glProgramBufferParametersIivNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramBufferParametersIuivNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); +#endif + +#ifndef GL_EXT_draw_buffers2 +#define GL_EXT_draw_buffers2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +GLAPI void APIENTRY glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data); +GLAPI void APIENTRY glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data); +GLAPI void APIENTRY glEnableIndexedEXT (GLenum target, GLuint index); +GLAPI void APIENTRY glDisableIndexedEXT (GLenum target, GLuint index); +GLAPI GLboolean APIENTRY glIsEnabledIndexedEXT (GLenum target, GLuint index); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (APIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); +typedef void (APIENTRYP PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); +#endif + +#ifndef GL_NV_transform_feedback +#define GL_NV_transform_feedback 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginTransformFeedbackNV (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedbackNV (void); +GLAPI void APIENTRY glTransformFeedbackAttribsNV (GLuint count, const GLint *attribs, GLenum bufferMode); +GLAPI void APIENTRY glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +GLAPI void APIENTRY glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); +GLAPI void APIENTRY glActiveVaryingNV (GLuint program, const GLchar *name); +GLAPI GLint APIENTRY glGetVaryingLocationNV (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location); +GLAPI void APIENTRY glTransformFeedbackStreamAttribsNV (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (APIENTRYP PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); +typedef void (APIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); +#endif + +#ifndef GL_EXT_bindable_uniform +#define GL_EXT_bindable_uniform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniformBufferEXT (GLuint program, GLint location, GLuint buffer); +GLAPI GLint APIENTRY glGetUniformBufferSizeEXT (GLuint program, GLint location); +GLAPI GLintptr APIENTRY glGetUniformOffsetEXT (GLuint program, GLint location); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); +typedef GLint (APIENTRYP PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); +typedef GLintptr (APIENTRYP PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); +#endif + +#ifndef GL_EXT_texture_integer +#define GL_EXT_texture_integer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha); +GLAPI void APIENTRY glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); +typedef void (APIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); +#endif + +#ifndef GL_GREMEDY_frame_terminator +#define GL_GREMEDY_frame_terminator 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFrameTerminatorGREMEDY (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFRAMETERMINATORGREMEDYPROC) (void); +#endif + +#ifndef GL_NV_conditional_render +#define GL_NV_conditional_render 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode); +GLAPI void APIENTRY glEndConditionalRenderNV (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void); +#endif + +#ifndef GL_NV_present_video +#define GL_NV_present_video 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPresentFrameKeyedNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +GLAPI void APIENTRY glPresentFrameDualFillNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +GLAPI void APIENTRY glGetVideoivNV (GLuint video_slot, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideouivNV (GLuint video_slot, GLenum pname, GLuint *params); +GLAPI void APIENTRY glGetVideoi64vNV (GLuint video_slot, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetVideoui64vNV (GLuint video_slot, GLenum pname, GLuint64EXT *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +typedef void (APIENTRYP PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +typedef void (APIENTRYP PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT *params); +#endif + +#ifndef GL_EXT_transform_feedback +#define GL_EXT_transform_feedback 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginTransformFeedbackEXT (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedbackEXT (void); +GLAPI void APIENTRY glBindBufferRangeEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferOffsetEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +GLAPI void APIENTRY glBindBufferBaseEXT (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryingsEXT (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); +GLAPI void APIENTRY glGetTransformFeedbackVaryingEXT (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (APIENTRYP PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +#endif + +#ifndef GL_EXT_direct_state_access +#define GL_EXT_direct_state_access 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClientAttribDefaultEXT (GLbitfield mask); +GLAPI void APIENTRY glPushClientAttribDefaultEXT (GLbitfield mask); +GLAPI void APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixLoadIdentityEXT (GLenum mode); +GLAPI void APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glMatrixPopEXT (GLenum mode); +GLAPI void APIENTRY glMatrixPushEXT (GLenum mode); +GLAPI void APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glTextureParameterfEXT (GLuint texture, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glTextureParameteriEXT (GLuint texture, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetTextureImageEXT (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); +GLAPI void APIENTRY glGetTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureLevelParameterfvEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureLevelParameterivEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); +GLAPI void APIENTRY glGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture); +GLAPI void APIENTRY glEnableClientStateIndexedEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glDisableClientStateIndexedEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +GLAPI void APIENTRY glMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); +GLAPI void APIENTRY glMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat *data); +GLAPI void APIENTRY glGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble *data); +GLAPI void APIENTRY glGetPointerIndexedvEXT (GLenum target, GLuint index, GLvoid* *data); +GLAPI void APIENTRY glCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glGetCompressedTextureImageEXT (GLuint texture, GLenum target, GLint lod, GLvoid *img); +GLAPI void APIENTRY glCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint lod, GLvoid *img); +GLAPI void APIENTRY glNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid *string); +GLAPI void APIENTRY glNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, GLvoid *string); +GLAPI void APIENTRY glNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint *params); +GLAPI void APIENTRY glTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); +GLAPI void APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); +GLAPI void APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); +GLAPI void APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glNamedBufferDataEXT (GLuint buffer, GLsizeiptr size, const GLvoid *data, GLenum usage); +GLAPI void APIENTRY glNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid *data); +GLAPI GLvoid* APIENTRY glMapNamedBufferEXT (GLuint buffer, GLenum access); +GLAPI GLboolean APIENTRY glUnmapNamedBufferEXT (GLuint buffer); +GLAPI GLvoid* APIENTRY glMapNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI void APIENTRY glFlushMappedNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glGetNamedBufferParameterivEXT (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedBufferPointervEXT (GLuint buffer, GLenum pname, GLvoid* *params); +GLAPI void APIENTRY glGetNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid *data); +GLAPI void APIENTRY glTextureBufferEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glNamedRenderbufferStorageEXT (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetNamedRenderbufferParameterivEXT (GLuint renderbuffer, GLenum pname, GLint *params); +GLAPI GLenum APIENTRY glCheckNamedFramebufferStatusEXT (GLuint framebuffer, GLenum target); +GLAPI void APIENTRY glNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glNamedFramebufferRenderbufferEXT (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameterivEXT (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateTextureMipmapEXT (GLuint texture, GLenum target); +GLAPI void APIENTRY glGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target); +GLAPI void APIENTRY glFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode); +GLAPI void APIENTRY glFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode); +GLAPI void APIENTRY glGetFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleEXT (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glNamedFramebufferTextureEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTextureLayerEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +GLAPI void APIENTRY glTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glProgramUniform1dEXT (GLuint program, GLint location, GLdouble x); +GLAPI void APIENTRY glProgramUniform2dEXT (GLuint program, GLint location, GLdouble x, GLdouble y); +GLAPI void APIENTRY glProgramUniform3dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glProgramUniform4dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramUniform1dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform2dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform3dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform4dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +typedef void (APIENTRYP PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); +typedef void (APIENTRYP PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble *data); +typedef void (APIENTRYP PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLvoid* *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, GLvoid *img); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, GLvoid *img); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid *string); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, GLvoid *string); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const GLvoid *data, GLenum usage); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid *data); +typedef GLvoid* (APIENTRYP PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); +typedef GLvoid* (APIENTRYP PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, GLvoid* *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid *data); +typedef void (APIENTRYP PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint *params); +typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); +typedef void (APIENTRYP PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (APIENTRYP PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +#endif + +#ifndef GL_EXT_vertex_array_bgra +#define GL_EXT_vertex_array_bgra 1 +#endif + +#ifndef GL_EXT_texture_swizzle +#define GL_EXT_texture_swizzle 1 +#endif + +#ifndef GL_NV_explicit_multisample +#define GL_NV_explicit_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetMultisamplefvNV (GLenum pname, GLuint index, GLfloat *val); +GLAPI void APIENTRY glSampleMaskIndexedNV (GLuint index, GLbitfield mask); +GLAPI void APIENTRY glTexRenderbufferNV (GLenum target, GLuint renderbuffer); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (APIENTRYP PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); +typedef void (APIENTRYP PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); +#endif + +#ifndef GL_NV_transform_feedback2 +#define GL_NV_transform_feedback2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindTransformFeedbackNV (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteTransformFeedbacksNV (GLsizei n, const GLuint *ids); +GLAPI void APIENTRY glGenTransformFeedbacksNV (GLsizei n, GLuint *ids); +GLAPI GLboolean APIENTRY glIsTransformFeedbackNV (GLuint id); +GLAPI void APIENTRY glPauseTransformFeedbackNV (void); +GLAPI void APIENTRY glResumeTransformFeedbackNV (void); +GLAPI void APIENTRY glDrawTransformFeedbackNV (GLenum mode, GLuint id); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint *ids); +typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); +#endif + +#ifndef GL_ATI_meminfo +#define GL_ATI_meminfo 1 +#endif + +#ifndef GL_AMD_performance_monitor +#define GL_AMD_performance_monitor 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +GLAPI void APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +GLAPI void APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +GLAPI void APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +GLAPI void APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, GLvoid *data); +GLAPI void APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); +GLAPI void APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); +GLAPI void APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +GLAPI void APIENTRY glBeginPerfMonitorAMD (GLuint monitor); +GLAPI void APIENTRY glEndPerfMonitorAMD (GLuint monitor); +GLAPI void APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, GLvoid *data); +typedef void (APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +typedef void (APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); +typedef void (APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#endif + +#ifndef GL_AMD_texture_texture4 +#define GL_AMD_texture_texture4 1 +#endif + +#ifndef GL_AMD_vertex_shader_tesselator +#define GL_AMD_vertex_shader_tesselator 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTessellationFactorAMD (GLfloat factor); +GLAPI void APIENTRY glTessellationModeAMD (GLenum mode); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_provoking_vertex +#define GL_EXT_provoking_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProvokingVertexEXT (GLenum mode); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_texture_snorm +#define GL_EXT_texture_snorm 1 +#endif + +#ifndef GL_AMD_draw_buffers_blend +#define GL_AMD_draw_buffers_blend 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncIndexedAMD (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparateIndexedAMD (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GLAPI void APIENTRY glBlendEquationIndexedAMD (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparateIndexedAMD (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +#endif + +#ifndef GL_APPLE_texture_range +#define GL_APPLE_texture_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureRangeAPPLE (GLenum target, GLsizei length, const GLvoid *pointer); +GLAPI void APIENTRY glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, GLvoid* *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_APPLE_float_pixels +#define GL_APPLE_float_pixels 1 +#endif + +#ifndef GL_APPLE_vertex_program_evaluators +#define GL_APPLE_vertex_program_evaluators 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glEnableVertexAttribAPPLE (GLuint index, GLenum pname); +GLAPI void APIENTRY glDisableVertexAttribAPPLE (GLuint index, GLenum pname); +GLAPI GLboolean APIENTRY glIsVertexAttribEnabledAPPLE (GLuint index, GLenum pname); +GLAPI void APIENTRY glMapVertexAttrib1dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +GLAPI void APIENTRY glMapVertexAttrib1fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +GLAPI void APIENTRY glMapVertexAttrib2dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +GLAPI void APIENTRY glMapVertexAttrib2fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef GLboolean (APIENTRYP PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +#endif + +#ifndef GL_APPLE_aux_depth_stencil +#define GL_APPLE_aux_depth_stencil 1 +#endif + +#ifndef GL_APPLE_object_purgeable +#define GL_APPLE_object_purgeable 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLenum APIENTRY glObjectPurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); +GLAPI GLenum APIENTRY glObjectUnpurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); +GLAPI void APIENTRY glGetObjectParameterivAPPLE (GLenum objectType, GLuint name, GLenum pname, GLint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLenum (APIENTRYP PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef GLenum (APIENTRYP PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint *params); +#endif + +#ifndef GL_APPLE_row_bytes +#define GL_APPLE_row_bytes 1 +#endif + +#ifndef GL_APPLE_rgb_422 +#define GL_APPLE_rgb_422 1 +#endif + +#ifndef GL_NV_video_capture +#define GL_NV_video_capture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVideoCaptureNV (GLuint video_capture_slot); +GLAPI void APIENTRY glBindVideoCaptureStreamBufferNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +GLAPI void APIENTRY glBindVideoCaptureStreamTextureNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +GLAPI void APIENTRY glEndVideoCaptureNV (GLuint video_capture_slot); +GLAPI void APIENTRY glGetVideoCaptureivNV (GLuint video_capture_slot, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideoCaptureStreamivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideoCaptureStreamfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVideoCaptureStreamdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); +GLAPI GLenum APIENTRY glVideoCaptureNV (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); +GLAPI void APIENTRY glVideoCaptureStreamParameterivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); +GLAPI void APIENTRY glVideoCaptureStreamParameterfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glVideoCaptureStreamParameterdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); +typedef GLenum (APIENTRYP PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); +#endif + +#ifndef GL_NV_copy_image +#define GL_NV_copy_image 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyImageSubDataNV (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +#endif + +#ifndef GL_EXT_separate_shader_objects +#define GL_EXT_separate_shader_objects 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUseShaderProgramEXT (GLenum type, GLuint program); +GLAPI void APIENTRY glActiveProgramEXT (GLuint program); +GLAPI GLuint APIENTRY glCreateShaderProgramEXT (GLenum type, const GLchar *string); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); +typedef void (APIENTRYP PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar *string); +#endif + +#ifndef GL_NV_parameter_buffer_object2 +#define GL_NV_parameter_buffer_object2 1 +#endif + +#ifndef GL_NV_shader_buffer_load +#define GL_NV_shader_buffer_load 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMakeBufferResidentNV (GLenum target, GLenum access); +GLAPI void APIENTRY glMakeBufferNonResidentNV (GLenum target); +GLAPI GLboolean APIENTRY glIsBufferResidentNV (GLenum target); +GLAPI void APIENTRY glMakeNamedBufferResidentNV (GLuint buffer, GLenum access); +GLAPI void APIENTRY glMakeNamedBufferNonResidentNV (GLuint buffer); +GLAPI GLboolean APIENTRY glIsNamedBufferResidentNV (GLuint buffer); +GLAPI void APIENTRY glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glGetIntegerui64vNV (GLenum value, GLuint64EXT *result); +GLAPI void APIENTRY glUniformui64NV (GLint location, GLuint64EXT value); +GLAPI void APIENTRY glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT *params); +GLAPI void APIENTRY glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value); +GLAPI void APIENTRY glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); +typedef void (APIENTRYP PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); +typedef GLboolean (APIENTRYP PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); +typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); +typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); +typedef GLboolean (APIENTRYP PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT *result); +typedef void (APIENTRYP PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); +typedef void (APIENTRYP PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif + +#ifndef GL_NV_vertex_buffer_unified_memory +#define GL_NV_vertex_buffer_unified_memory 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +GLAPI void APIENTRY glVertexFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glNormalFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glColorFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glIndexFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glEdgeFlagFormatNV (GLsizei stride); +GLAPI void APIENTRY glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glFogCoordFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +GLAPI void APIENTRY glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT *result); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +typedef void (APIENTRYP PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result); +#endif + +#ifndef GL_NV_texture_barrier +#define GL_NV_texture_barrier 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureBarrierNV (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTUREBARRIERNVPROC) (void); +#endif + +#ifndef GL_AMD_shader_stencil_export +#define GL_AMD_shader_stencil_export 1 +#endif + +#ifndef GL_AMD_seamless_cubemap_per_texture +#define GL_AMD_seamless_cubemap_per_texture 1 +#endif + +#ifndef GL_AMD_conservative_depth +#define GL_AMD_conservative_depth 1 +#endif + +#ifndef GL_EXT_shader_image_load_store +#define GL_EXT_shader_image_load_store 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindImageTextureEXT (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +GLAPI void APIENTRY glMemoryBarrierEXT (GLbitfield barriers); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +typedef void (APIENTRYP PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); +#endif + +#ifndef GL_EXT_vertex_attrib_64bit +#define GL_EXT_vertex_attrib_64bit 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribL1dEXT (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttribL2dEXT (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttribL3dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttribL4dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttribL1dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL2dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL3dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL4dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribLPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glGetVertexAttribLdvEXT (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glVertexArrayVertexAttribLOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +#endif + +#ifndef GL_NV_gpu_program5 +#define GL_NV_gpu_program5 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramSubroutineParametersuivNV (GLenum target, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetProgramSubroutineParameteruivNV (GLenum target, GLuint index, GLuint *param); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC) (GLenum target, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC) (GLenum target, GLuint index, GLuint *param); +#endif + +#ifndef GL_NV_gpu_shader5 +#define GL_NV_gpu_shader5 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniform1i64NV (GLint location, GLint64EXT x); +GLAPI void APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x); +GLAPI void APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params); +GLAPI void APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x); +GLAPI void APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x); +GLAPI void APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); +typedef void (APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); +typedef void (APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif + +#ifndef GL_NV_shader_buffer_store +#define GL_NV_shader_buffer_store 1 +#endif + +#ifndef GL_NV_tessellation_program5 +#define GL_NV_tessellation_program5 1 +#endif + +#ifndef GL_NV_vertex_attrib_integer_64bit +#define GL_NV_vertex_attrib_integer_64bit 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribL1i64NV (GLuint index, GLint64EXT x); +GLAPI void APIENTRY glVertexAttribL2i64NV (GLuint index, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glVertexAttribL3i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glVertexAttribL4i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glVertexAttribL1i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL2i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL3i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL4i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL1ui64NV (GLuint index, GLuint64EXT x); +GLAPI void APIENTRY glVertexAttribL2ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glVertexAttribL3ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glVertexAttribL4ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glVertexAttribL1ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL2ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL3ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL4ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glGetVertexAttribLi64vNV (GLuint index, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetVertexAttribLui64vNV (GLuint index, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glVertexAttribLFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +#endif + +#ifndef GL_NV_multisample_coverage +#define GL_NV_multisample_coverage 1 +#endif + +#ifndef GL_AMD_name_gen_delete +#define GL_AMD_name_gen_delete 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenNamesAMD (GLenum identifier, GLuint num, GLuint *names); +GLAPI void APIENTRY glDeleteNamesAMD (GLenum identifier, GLuint num, const GLuint *names); +GLAPI GLboolean APIENTRY glIsNameAMD (GLenum identifier, GLuint name); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint *names); +typedef void (APIENTRYP PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint *names); +typedef GLboolean (APIENTRYP PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); +#endif + +#ifndef GL_AMD_debug_output +#define GL_AMD_debug_output 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDebugMessageEnableAMD (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsertAMD (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallbackAMD (GLDEBUGPROCAMD callback, GLvoid *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLogAMD (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, GLvoid *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); +#endif + +#ifndef GL_NV_vdpau_interop +#define GL_NV_vdpau_interop 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVDPAUInitNV (const GLvoid *vdpDevice, const GLvoid *getProcAddress); +GLAPI void APIENTRY glVDPAUFiniNV (void); +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceNV (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterOutputSurfaceNV (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +GLAPI void APIENTRY glVDPAUIsSurfaceNV (GLvdpauSurfaceNV surface); +GLAPI void APIENTRY glVDPAUUnregisterSurfaceNV (GLvdpauSurfaceNV surface); +GLAPI void APIENTRY glVDPAUGetSurfaceivNV (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +GLAPI void APIENTRY glVDPAUSurfaceAccessNV (GLvdpauSurfaceNV surface, GLenum access); +GLAPI void APIENTRY glVDPAUMapSurfacesNV (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); +GLAPI void APIENTRY glVDPAUUnmapSurfacesNV (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVDPAUINITNVPROC) (const GLvoid *vdpDevice, const GLvoid *getProcAddress); +typedef void (APIENTRYP PFNGLVDPAUFININVPROC) (void); +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef void (APIENTRYP PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (APIENTRYP PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (APIENTRYP PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +typedef void (APIENTRYP PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); +typedef void (APIENTRYP PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); +typedef void (APIENTRYP PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); +#endif + +#ifndef GL_AMD_transform_feedback3_lines_triangles +#define GL_AMD_transform_feedback3_lines_triangles 1 +#endif + + +#ifdef __cplusplus +} +#endif + +#endif +#endif /* NO_SDL_GLEXT */ + +#endif /* !__IPHONEOS__ */ + +#endif /* _SDL_opengl_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_opengles.h b/lib/SDL2/include/SDL_opengles.h new file mode 100644 index 0000000000..d88e1573f9 --- /dev/null +++ b/lib/SDL2/include/SDL_opengles.h @@ -0,0 +1,38 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_opengles.h + * + * This is a simple file to encapsulate the OpenGL ES 1.X API headers. + */ + +#ifdef __IPHONEOS__ +#include +#include +#else +#include +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif diff --git a/lib/SDL2/include/SDL_opengles2.h b/lib/SDL2/include/SDL_opengles2.h new file mode 100644 index 0000000000..2c05479231 --- /dev/null +++ b/lib/SDL2/include/SDL_opengles2.h @@ -0,0 +1,2790 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_opengles.h + * + * This is a simple file to encapsulate the OpenGL ES 2.0 API headers. + */ +#ifndef _MSC_VER +#ifdef __IPHONEOS__ +#include +#include +#else +#include +#include +#endif + +#else /* _MSC_VER */ + +/* OpenGL ES2 headers for Visual Studio */ + +#ifndef __khrplatform_h_ +#define __khrplatform_h_ + +/* +** Copyright (c) 2008-2009 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +/* Khronos platform-specific types and definitions. +* +* $Revision: 23298 $ on $Date: 2013-09-30 17:07:13 -0700 (Mon, 30 Sep 2013) $ +* +* Adopters may modify this file to suit their platform. Adopters are +* encouraged to submit platform specific modifications to the Khronos +* group so that they can be included in future versions of this file. +* Please submit changes by sending them to the public Khronos Bugzilla +* (http://khronos.org/bugzilla) by filing a bug against product +* "Khronos (general)" component "Registry". +* +* A predefined template which fills in some of the bug fields can be +* reached using http://tinyurl.com/khrplatform-h-bugreport, but you +* must create a Bugzilla login first. +* +* +* See the Implementer's Guidelines for information about where this file +* should be located on your system and for more details of its use: +* http://www.khronos.org/registry/implementers_guide.pdf +* +* This file should be included as +* #include +* by Khronos client API header files that use its types and defines. +* +* The types in khrplatform.h should only be used to define API-specific types. +* +* Types defined in khrplatform.h: +* khronos_int8_t signed 8 bit +* khronos_uint8_t unsigned 8 bit +* khronos_int16_t signed 16 bit +* khronos_uint16_t unsigned 16 bit +* khronos_int32_t signed 32 bit +* khronos_uint32_t unsigned 32 bit +* khronos_int64_t signed 64 bit +* khronos_uint64_t unsigned 64 bit +* khronos_intptr_t signed same number of bits as a pointer +* khronos_uintptr_t unsigned same number of bits as a pointer +* khronos_ssize_t signed size +* khronos_usize_t unsigned size +* khronos_float_t signed 32 bit floating point +* khronos_time_ns_t unsigned 64 bit time in nanoseconds +* khronos_utime_nanoseconds_t unsigned time interval or absolute time in +* nanoseconds +* khronos_stime_nanoseconds_t signed time interval in nanoseconds +* khronos_boolean_enum_t enumerated boolean type. This should +* only be used as a base type when a client API's boolean type is +* an enum. Client APIs which use an integer or other type for +* booleans cannot use this as the base type for their boolean. +* +* Tokens defined in khrplatform.h: +* +* KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. +* +* KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. +* KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. +* +* Calling convention macros defined in this file: +* KHRONOS_APICALL +* KHRONOS_APIENTRY +* KHRONOS_APIATTRIBUTES +* +* These may be used in function prototypes as: +* +* KHRONOS_APICALL void KHRONOS_APIENTRY funcname( +* int arg1, +* int arg2) KHRONOS_APIATTRIBUTES; +*/ + +/*------------------------------------------------------------------------- +* Definition of KHRONOS_APICALL +*------------------------------------------------------------------------- +* This precedes the return type of the function in the function prototype. +*/ +#if defined(_WIN32) && !defined(__SCITECH_SNAP__) +# define KHRONOS_APICALL __declspec(dllimport) +#elif defined (__SYMBIAN32__) +# define KHRONOS_APICALL IMPORT_C +#else +# define KHRONOS_APICALL +#endif + +/*------------------------------------------------------------------------- +* Definition of KHRONOS_APIENTRY +*------------------------------------------------------------------------- +* This follows the return type of the function and precedes the function +* name in the function prototype. +*/ +#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) +/* Win32 but not WinCE */ +# define KHRONOS_APIENTRY __stdcall +#else +# define KHRONOS_APIENTRY +#endif + +/*------------------------------------------------------------------------- +* Definition of KHRONOS_APIATTRIBUTES +*------------------------------------------------------------------------- +* This follows the closing parenthesis of the function prototype arguments. +*/ +#if defined (__ARMCC_2__) +#define KHRONOS_APIATTRIBUTES __softfp +#else +#define KHRONOS_APIATTRIBUTES +#endif + +/*------------------------------------------------------------------------- +* basic type definitions +*-----------------------------------------------------------------------*/ +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) + + +/* +* Using +*/ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(__VMS ) || defined(__sgi) + +/* +* Using +*/ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(_WIN32) && !defined(__SCITECH_SNAP__) + +/* +* Win32 +*/ +typedef __int32 khronos_int32_t; +typedef unsigned __int32 khronos_uint32_t; +typedef __int64 khronos_int64_t; +typedef unsigned __int64 khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(__sun__) || defined(__digital__) + +/* +* Sun or Digital +*/ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#if defined(__arch64__) || defined(_LP64) +typedef long int khronos_int64_t; +typedef unsigned long int khronos_uint64_t; +#else +typedef long long int khronos_int64_t; +typedef unsigned long long int khronos_uint64_t; +#endif /* __arch64__ */ +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif 0 + +/* +* Hypothetical platform with no float or int64 support +*/ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#define KHRONOS_SUPPORT_INT64 0 +#define KHRONOS_SUPPORT_FLOAT 0 + +#else + +/* +* Generic fallback +*/ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#endif + + +/* +* Types that are (so far) the same on all platforms +*/ +typedef signed char khronos_int8_t; +typedef unsigned char khronos_uint8_t; +typedef signed short int khronos_int16_t; +typedef unsigned short int khronos_uint16_t; + +/* +* Types that differ between LLP64 and LP64 architectures - in LLP64, +* pointers are 64 bits, but 'long' is still 32 bits. Win64 appears +* to be the only LLP64 architecture in current use. +*/ +#ifdef _WIN64 +typedef signed long long int khronos_intptr_t; +typedef unsigned long long int khronos_uintptr_t; +typedef signed long long int khronos_ssize_t; +typedef unsigned long long int khronos_usize_t; +#else +typedef signed long int khronos_intptr_t; +typedef unsigned long int khronos_uintptr_t; +typedef signed long int khronos_ssize_t; +typedef unsigned long int khronos_usize_t; +#endif + +#if KHRONOS_SUPPORT_FLOAT +/* +* Float type +*/ +typedef float khronos_float_t; +#endif + +#if KHRONOS_SUPPORT_INT64 +/* Time types +* +* These types can be used to represent a time interval in nanoseconds or +* an absolute Unadjusted System Time. Unadjusted System Time is the number +* of nanoseconds since some arbitrary system event (e.g. since the last +* time the system booted). The Unadjusted System Time is an unsigned +* 64 bit value that wraps back to 0 every 584 years. Time intervals +* may be either signed or unsigned. +*/ +typedef khronos_uint64_t khronos_utime_nanoseconds_t; +typedef khronos_int64_t khronos_stime_nanoseconds_t; +#endif + +/* +* Dummy value used to pad enum types to 32 bits. +*/ +#ifndef KHRONOS_MAX_ENUM +#define KHRONOS_MAX_ENUM 0x7FFFFFFF +#endif + +/* +* Enumerated boolean type +* +* Values other than zero should be considered to be true. Therefore +* comparisons should not be made against KHRONOS_TRUE. +*/ +typedef enum { + KHRONOS_FALSE = 0, + KHRONOS_TRUE = 1, + KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM +} khronos_boolean_enum_t; + +#endif /* __khrplatform_h_ */ + + +#ifndef __gl2platform_h_ +#define __gl2platform_h_ + +/* $Revision: 10602 $ on $Date:: 2010-03-04 22:35:34 -0800 #$ */ + +/* + * This document is licensed under the SGI Free Software B License Version + * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . + */ + +/* Platform-specific types and definitions for OpenGL ES 2.X gl2.h + * + * Adopters may modify khrplatform.h and this file to suit their platform. + * You are encouraged to submit all modifications to the Khronos group so that + * they can be included in future versions of this file. Please submit changes + * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla) + * by filing a bug against product "OpenGL-ES" component "Registry". + */ + +/*#include */ + +#ifndef GL_APICALL +#define GL_APICALL KHRONOS_APICALL +#endif + +#ifndef GL_APIENTRY +#define GL_APIENTRY KHRONOS_APIENTRY +#endif + +#endif /* __gl2platform_h_ */ + +#ifndef __gl2_h_ +#define __gl2_h_ + +/* $Revision: 16803 $ on $Date:: 2012-02-02 09:49:18 -0800 #$ */ + +/*#include */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * This document is licensed under the SGI Free Software B License Version + * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . + */ + +/*------------------------------------------------------------------------- + * Data type definitions + *-----------------------------------------------------------------------*/ + +typedef void GLvoid; +typedef char GLchar; +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef khronos_int8_t GLbyte; +typedef short GLshort; +typedef int GLint; +typedef int GLsizei; +typedef khronos_uint8_t GLubyte; +typedef unsigned short GLushort; +typedef unsigned int GLuint; +typedef khronos_float_t GLfloat; +typedef khronos_float_t GLclampf; +typedef khronos_int32_t GLfixed; + +/* GL types for handling large vertex buffer objects */ +typedef khronos_intptr_t GLintptr; +typedef khronos_ssize_t GLsizeiptr; + +/* OpenGL ES core versions */ +#define GL_ES_VERSION_2_0 1 + +/* ClearBufferMask */ +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_COLOR_BUFFER_BIT 0x00004000 + +/* Boolean */ +#define GL_FALSE 0 +#define GL_TRUE 1 + +/* BeginMode */ +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 + +/* AlphaFunction (not supported in ES20) */ +/* GL_NEVER */ +/* GL_LESS */ +/* GL_EQUAL */ +/* GL_LEQUAL */ +/* GL_GREATER */ +/* GL_NOTEQUAL */ +/* GL_GEQUAL */ +/* GL_ALWAYS */ + +/* BlendingFactorDest */ +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 + +/* BlendingFactorSrc */ +/* GL_ZERO */ +/* GL_ONE */ +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +/* GL_SRC_ALPHA */ +/* GL_ONE_MINUS_SRC_ALPHA */ +/* GL_DST_ALPHA */ +/* GL_ONE_MINUS_DST_ALPHA */ + +/* BlendEquationSeparate */ +#define GL_FUNC_ADD 0x8006 +#define GL_BLEND_EQUATION 0x8009 +#define GL_BLEND_EQUATION_RGB 0x8009 /* same as BLEND_EQUATION */ +#define GL_BLEND_EQUATION_ALPHA 0x883D + +/* BlendSubtract */ +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B + +/* Separate Blend Functions */ +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 + +/* Buffer Objects */ +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 + +#define GL_STREAM_DRAW 0x88E0 +#define GL_STATIC_DRAW 0x88E4 +#define GL_DYNAMIC_DRAW 0x88E8 + +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 + +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 + +/* CullFaceMode */ +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_FRONT_AND_BACK 0x0408 + +/* DepthFunction */ +/* GL_NEVER */ +/* GL_LESS */ +/* GL_EQUAL */ +/* GL_LEQUAL */ +/* GL_GREATER */ +/* GL_NOTEQUAL */ +/* GL_GEQUAL */ +/* GL_ALWAYS */ + +/* EnableCap */ +#define GL_TEXTURE_2D 0x0DE1 +#define GL_CULL_FACE 0x0B44 +#define GL_BLEND 0x0BE2 +#define GL_DITHER 0x0BD0 +#define GL_STENCIL_TEST 0x0B90 +#define GL_DEPTH_TEST 0x0B71 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_COVERAGE 0x80A0 + +/* ErrorCode */ +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_OUT_OF_MEMORY 0x0505 + +/* FrontFaceDirection */ +#define GL_CW 0x0900 +#define GL_CCW 0x0901 + +/* GetPName */ +#define GL_LINE_WIDTH 0x0B21 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_VIEWPORT 0x0BA2 +#define GL_SCISSOR_BOX 0x0C10 +/* GL_SCISSOR_TEST */ +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +/* GL_POLYGON_OFFSET_FILL */ +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB + +/* GetTextureParameter */ +/* GL_TEXTURE_MAG_FILTER */ +/* GL_TEXTURE_MIN_FILTER */ +/* GL_TEXTURE_WRAP_S */ +/* GL_TEXTURE_WRAP_T */ + +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 + +/* HintMode */ +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 + +/* HintTarget */ +#define GL_GENERATE_MIPMAP_HINT 0x8192 + +/* DataType */ +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_FIXED 0x140C + +/* PixelFormat */ +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A + +/* PixelType */ +/* GL_UNSIGNED_BYTE */ +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 + +/* Shaders */ +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_SHADER_TYPE 0x8B4F +#define GL_DELETE_STATUS 0x8B80 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D + +/* StencilFunction */ +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 + +/* StencilOp */ +/* GL_ZERO */ +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_INVERT 0x150A +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 + +/* StringName */ +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 + +/* TextureMagFilter */ +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 + +/* TextureMinFilter */ +/* GL_NEAREST */ +/* GL_LINEAR */ +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 + +/* TextureParameterName */ +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 + +/* TextureTarget */ +/* GL_TEXTURE_2D */ +#define GL_TEXTURE 0x1702 + +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C + +/* TextureUnit */ +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 + +/* TextureWrapMode */ +#define GL_REPEAT 0x2901 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_MIRRORED_REPEAT 0x8370 + +/* Uniform Types */ +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_CUBE 0x8B60 + +/* Vertex Arrays */ +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F + +/* Read Format */ +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B + +/* Shader Source */ +#define GL_COMPILE_STATUS 0x8B81 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_SHADER_COMPILER 0x8DFA + +/* Shader Binary */ +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 + +/* Shader Precision-Specified Types */ +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 + +/* Framebuffer Object. */ +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 + +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGB565 0x8D62 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_STENCIL_INDEX8 0x8D48 + +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 + +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 + +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 + +#define GL_NONE 0 + +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD + +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 + +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 + +/*------------------------------------------------------------------------- + * GL core functions. + *-----------------------------------------------------------------------*/ + +GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture); +GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader); +GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar* name); +GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer); +GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); +GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); +GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture); +GL_APICALL void GL_APIENTRY glBlendColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GL_APICALL void GL_APIENTRY glBlendEquation ( GLenum mode ); +GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); +GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); +GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage); +GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data); +GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target); +GL_APICALL void GL_APIENTRY glClear (GLbitfield mask); +GL_APICALL void GL_APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GL_APICALL void GL_APIENTRY glClearDepthf (GLclampf depth); +GL_APICALL void GL_APIENTRY glClearStencil (GLint s); +GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader); +GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data); +GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data); +GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GL_APICALL GLuint GL_APIENTRY glCreateProgram (void); +GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type); +GL_APICALL void GL_APIENTRY glCullFace (GLenum mode); +GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint* buffers); +GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint* framebuffers); +GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program); +GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint* renderbuffers); +GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader); +GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint* textures); +GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func); +GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag); +GL_APICALL void GL_APIENTRY glDepthRangef (GLclampf zNear, GLclampf zFar); +GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader); +GL_APICALL void GL_APIENTRY glDisable (GLenum cap); +GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index); +GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); +GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices); +GL_APICALL void GL_APIENTRY glEnable (GLenum cap); +GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index); +GL_APICALL void GL_APIENTRY glFinish (void); +GL_APICALL void GL_APIENTRY glFlush (void); +GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode); +GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint* buffers); +GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target); +GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint* framebuffers); +GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint* renderbuffers); +GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint* textures); +GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders); +GL_APICALL int GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar* name); +GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean* params); +GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint* params); +GL_APICALL GLenum GL_APIENTRY glGetError (void); +GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat* params); +GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog); +GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog); +GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision); +GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source); +GL_APICALL const GLubyte* GL_APIENTRY glGetString (GLenum name); +GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat* params); +GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat* params); +GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint* params); +GL_APICALL int GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar* name); +GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat* params); +GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, GLvoid** pointer); +GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode); +GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer); +GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap); +GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer); +GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program); +GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer); +GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader); +GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture); +GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width); +GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program); +GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param); +GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); +GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels); +GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void); +GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glSampleCoverage (GLclampf value, GLboolean invert); +GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length); +GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length); +GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask); +GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); +GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass); +GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels); +GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); +GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat* params); +GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); +GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint* params); +GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels); +GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat x); +GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat* v); +GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint x); +GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint* v); +GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat x, GLfloat y); +GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat* v); +GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint x, GLint y); +GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint* v); +GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat x, GLfloat y, GLfloat z); +GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat* v); +GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint x, GLint y, GLint z); +GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint* v); +GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat* v); +GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint x, GLint y, GLint z, GLint w); +GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint* v); +GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +GL_APICALL void GL_APIENTRY glUseProgram (GLuint program); +GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program); +GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint indx, GLfloat x); +GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint indx, const GLfloat* values); +GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint indx, GLfloat x, GLfloat y); +GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint indx, const GLfloat* values); +GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint indx, GLfloat x, GLfloat y, GLfloat z); +GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint indx, const GLfloat* values); +GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint indx, const GLfloat* values); +GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr); +GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); + +#ifdef __cplusplus +} +#endif + +#endif /* __gl2_h_ */ + + +#ifndef __gl2ext_h_ +#define __gl2ext_h_ + +/* $Revision: 19436 $ on $Date:: 2012-10-10 10:37:04 -0700 #$ */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * This document is licensed under the SGI Free Software B License Version + * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . + */ + +#ifndef GL_APIENTRYP +# define GL_APIENTRYP GL_APIENTRY* +#endif + +/*------------------------------------------------------------------------* + * OES extension tokens + *------------------------------------------------------------------------*/ + +/* GL_OES_compressed_ETC1_RGB8_texture */ +#ifndef GL_OES_compressed_ETC1_RGB8_texture +#define GL_ETC1_RGB8_OES 0x8D64 +#endif + +/* GL_OES_compressed_paletted_texture */ +#ifndef GL_OES_compressed_paletted_texture +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 +#endif + +/* GL_OES_depth24 */ +#ifndef GL_OES_depth24 +#define GL_DEPTH_COMPONENT24_OES 0x81A6 +#endif + +/* GL_OES_depth32 */ +#ifndef GL_OES_depth32 +#define GL_DEPTH_COMPONENT32_OES 0x81A7 +#endif + +/* GL_OES_depth_texture */ +/* No new tokens introduced by this extension. */ + +/* GL_OES_EGL_image */ +#ifndef GL_OES_EGL_image +typedef void* GLeglImageOES; +#endif + +/* GL_OES_EGL_image_external */ +#ifndef GL_OES_EGL_image_external +/* GLeglImageOES defined in GL_OES_EGL_image already. */ +#define GL_TEXTURE_EXTERNAL_OES 0x8D65 +#define GL_SAMPLER_EXTERNAL_OES 0x8D66 +#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 +#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 +#endif + +/* GL_OES_element_index_uint */ +#ifndef GL_OES_element_index_uint +#define GL_UNSIGNED_INT 0x1405 +#endif + +/* GL_OES_get_program_binary */ +#ifndef GL_OES_get_program_binary +#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE +#define GL_PROGRAM_BINARY_FORMATS_OES 0x87FF +#endif + +/* GL_OES_mapbuffer */ +#ifndef GL_OES_mapbuffer +#define GL_WRITE_ONLY_OES 0x88B9 +#define GL_BUFFER_ACCESS_OES 0x88BB +#define GL_BUFFER_MAPPED_OES 0x88BC +#define GL_BUFFER_MAP_POINTER_OES 0x88BD +#endif + +/* GL_OES_packed_depth_stencil */ +#ifndef GL_OES_packed_depth_stencil +#define GL_DEPTH_STENCIL_OES 0x84F9 +#define GL_UNSIGNED_INT_24_8_OES 0x84FA +#define GL_DEPTH24_STENCIL8_OES 0x88F0 +#endif + +/* GL_OES_required_internalformat */ +#ifndef GL_OES_required_internalformat +#define GL_ALPHA8_OES 0x803C +#define GL_DEPTH_COMPONENT16_OES 0x81A5 +/* reuse GL_DEPTH_COMPONENT24_OES */ +/* reuse GL_DEPTH24_STENCIL8_OES */ +/* reuse GL_DEPTH_COMPONENT32_OES */ +#define GL_LUMINANCE4_ALPHA4_OES 0x8043 +#define GL_LUMINANCE8_ALPHA8_OES 0x8045 +#define GL_LUMINANCE8_OES 0x8040 +#define GL_RGBA4_OES 0x8056 +#define GL_RGB5_A1_OES 0x8057 +#define GL_RGB565_OES 0x8D62 +/* reuse GL_RGB8_OES */ +/* reuse GL_RGBA8_OES */ +/* reuse GL_RGB10_EXT */ +/* reuse GL_RGB10_A2_EXT */ +#endif + +/* GL_OES_rgb8_rgba8 */ +#ifndef GL_OES_rgb8_rgba8 +#define GL_RGB8_OES 0x8051 +#define GL_RGBA8_OES 0x8058 +#endif + +/* GL_OES_standard_derivatives */ +#ifndef GL_OES_standard_derivatives +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B +#endif + +/* GL_OES_stencil1 */ +#ifndef GL_OES_stencil1 +#define GL_STENCIL_INDEX1_OES 0x8D46 +#endif + +/* GL_OES_stencil4 */ +#ifndef GL_OES_stencil4 +#define GL_STENCIL_INDEX4_OES 0x8D47 +#endif + +#ifndef GL_OES_surfaceless_context +#define GL_FRAMEBUFFER_UNDEFINED_OES 0x8219 +#endif + +/* GL_OES_texture_3D */ +#ifndef GL_OES_texture_3D +#define GL_TEXTURE_WRAP_R_OES 0x8072 +#define GL_TEXTURE_3D_OES 0x806F +#define GL_TEXTURE_BINDING_3D_OES 0x806A +#define GL_MAX_3D_TEXTURE_SIZE_OES 0x8073 +#define GL_SAMPLER_3D_OES 0x8B5F +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES 0x8CD4 +#endif + +/* GL_OES_texture_float */ +/* No new tokens introduced by this extension. */ + +/* GL_OES_texture_float_linear */ +/* No new tokens introduced by this extension. */ + +/* GL_OES_texture_half_float */ +#ifndef GL_OES_texture_half_float +#define GL_HALF_FLOAT_OES 0x8D61 +#endif + +/* GL_OES_texture_half_float_linear */ +/* No new tokens introduced by this extension. */ + +/* GL_OES_texture_npot */ +/* No new tokens introduced by this extension. */ + +/* GL_OES_vertex_array_object */ +#ifndef GL_OES_vertex_array_object +#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5 +#endif + +/* GL_OES_vertex_half_float */ +/* GL_HALF_FLOAT_OES defined in GL_OES_texture_half_float already. */ + +/* GL_OES_vertex_type_10_10_10_2 */ +#ifndef GL_OES_vertex_type_10_10_10_2 +#define GL_UNSIGNED_INT_10_10_10_2_OES 0x8DF6 +#define GL_INT_10_10_10_2_OES 0x8DF7 +#endif + +/*------------------------------------------------------------------------* + * KHR extension tokens + *------------------------------------------------------------------------*/ + +#ifndef GL_KHR_debug +typedef void (GL_APIENTRYP GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam); +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 +#define GL_DEBUG_SOURCE_API 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION 0x824A +#define GL_DEBUG_SOURCE_OTHER 0x824B +#define GL_DEBUG_TYPE_ERROR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_DEBUG_TYPE_MARKER 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D +#define GL_BUFFER 0x82E0 +#define GL_SHADER 0x82E1 +#define GL_PROGRAM 0x82E2 +#define GL_QUERY 0x82E3 +/* PROGRAM_PIPELINE only in GL */ +#define GL_SAMPLER 0x82E6 +/* DISPLAY_LIST only in GL */ +#define GL_MAX_LABEL_LENGTH 0x82E8 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_LOW 0x9148 +#define GL_DEBUG_OUTPUT 0x92E0 +#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#endif + +#ifndef GL_KHR_texture_compression_astc_ldr +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD +#endif + +/*------------------------------------------------------------------------* + * AMD extension tokens + *------------------------------------------------------------------------*/ + +/* GL_AMD_compressed_3DC_texture */ +#ifndef GL_AMD_compressed_3DC_texture +#define GL_3DC_X_AMD 0x87F9 +#define GL_3DC_XY_AMD 0x87FA +#endif + +/* GL_AMD_compressed_ATC_texture */ +#ifndef GL_AMD_compressed_ATC_texture +#define GL_ATC_RGB_AMD 0x8C92 +#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 +#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE +#endif + +/* GL_AMD_performance_monitor */ +#ifndef GL_AMD_performance_monitor +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFMON_RESULT_AMD 0x8BC6 +#endif + +/* GL_AMD_program_binary_Z400 */ +#ifndef GL_AMD_program_binary_Z400 +#define GL_Z400_BINARY_AMD 0x8740 +#endif + +/*------------------------------------------------------------------------* + * ANGLE extension tokens + *------------------------------------------------------------------------*/ + +/* GL_ANGLE_framebuffer_blit */ +#ifndef GL_ANGLE_framebuffer_blit +#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA +#endif + +/* GL_ANGLE_framebuffer_multisample */ +#ifndef GL_ANGLE_framebuffer_multisample +#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 +#define GL_MAX_SAMPLES_ANGLE 0x8D57 +#endif + +/* GL_ANGLE_instanced_arrays */ +#ifndef GL_ANGLE_instanced_arrays +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE +#endif + +/* GL_ANGLE_pack_reverse_row_order */ +#ifndef GL_ANGLE_pack_reverse_row_order +#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 +#endif + +/* GL_ANGLE_texture_compression_dxt3 */ +#ifndef GL_ANGLE_texture_compression_dxt3 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#endif + +/* GL_ANGLE_texture_compression_dxt5 */ +#ifndef GL_ANGLE_texture_compression_dxt5 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 +#endif + +/* GL_ANGLE_texture_usage */ +#ifndef GL_ANGLE_texture_usage +#define GL_TEXTURE_USAGE_ANGLE 0x93A2 +#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 +#endif + +/* GL_ANGLE_translated_shader_source */ +#ifndef GL_ANGLE_translated_shader_source +#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 +#endif + +/*------------------------------------------------------------------------* + * APPLE extension tokens + *------------------------------------------------------------------------*/ + +/* GL_APPLE_copy_texture_levels */ +/* No new tokens introduced by this extension. */ + +/* GL_APPLE_framebuffer_multisample */ +#ifndef GL_APPLE_framebuffer_multisample +#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 +#define GL_MAX_SAMPLES_APPLE 0x8D57 +#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA +#endif + +/* GL_APPLE_rgb_422 */ +#ifndef GL_APPLE_rgb_422 +#define GL_RGB_422_APPLE 0x8A1F +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#endif + +/* GL_APPLE_sync */ +#ifndef GL_APPLE_sync + +#ifndef __gl3_h_ +/* These types are defined with reference to + * in the Apple extension spec, but here we use the Khronos + * portable types in khrplatform.h, and assume those types + * are always defined. + * If any other extensions using these types are defined, + * the typedefs must move out of this block and be shared. + */ +typedef khronos_int64_t GLint64; +typedef khronos_uint64_t GLuint64; +typedef struct __GLsync *GLsync; +#endif + +#define GL_SYNC_OBJECT_APPLE 0x8A53 +#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE 0x9111 +#define GL_OBJECT_TYPE_APPLE 0x9112 +#define GL_SYNC_CONDITION_APPLE 0x9113 +#define GL_SYNC_STATUS_APPLE 0x9114 +#define GL_SYNC_FLAGS_APPLE 0x9115 +#define GL_SYNC_FENCE_APPLE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117 +#define GL_UNSIGNALED_APPLE 0x9118 +#define GL_SIGNALED_APPLE 0x9119 +#define GL_ALREADY_SIGNALED_APPLE 0x911A +#define GL_TIMEOUT_EXPIRED_APPLE 0x911B +#define GL_CONDITION_SATISFIED_APPLE 0x911C +#define GL_WAIT_FAILED_APPLE 0x911D +#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001 +#define GL_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFFull +#endif + +/* GL_APPLE_texture_format_BGRA8888 */ +#ifndef GL_APPLE_texture_format_BGRA8888 +#define GL_BGRA_EXT 0x80E1 +#endif + +/* GL_APPLE_texture_max_level */ +#ifndef GL_APPLE_texture_max_level +#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D +#endif + +/*------------------------------------------------------------------------* + * ARM extension tokens + *------------------------------------------------------------------------*/ + +/* GL_ARM_mali_program_binary */ +#ifndef GL_ARM_mali_program_binary +#define GL_MALI_PROGRAM_BINARY_ARM 0x8F61 +#endif + +/* GL_ARM_mali_shader_binary */ +#ifndef GL_ARM_mali_shader_binary +#define GL_MALI_SHADER_BINARY_ARM 0x8F60 +#endif + +/* GL_ARM_rgba8 */ +/* No new tokens introduced by this extension. */ + +/*------------------------------------------------------------------------* + * EXT extension tokens + *------------------------------------------------------------------------*/ + +/* GL_EXT_blend_minmax */ +#ifndef GL_EXT_blend_minmax +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#endif + +/* GL_EXT_color_buffer_half_float */ +#ifndef GL_EXT_color_buffer_half_float +#define GL_RGBA16F_EXT 0x881A +#define GL_RGB16F_EXT 0x881B +#define GL_RG16F_EXT 0x822F +#define GL_R16F_EXT 0x822D +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 +#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 +#endif + +/* GL_EXT_debug_label */ +#ifndef GL_EXT_debug_label +#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F +#define GL_PROGRAM_OBJECT_EXT 0x8B40 +#define GL_SHADER_OBJECT_EXT 0x8B48 +#define GL_BUFFER_OBJECT_EXT 0x9151 +#define GL_QUERY_OBJECT_EXT 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 +#endif + +/* GL_EXT_debug_marker */ +/* No new tokens introduced by this extension. */ + +/* GL_EXT_discard_framebuffer */ +#ifndef GL_EXT_discard_framebuffer +#define GL_COLOR_EXT 0x1800 +#define GL_DEPTH_EXT 0x1801 +#define GL_STENCIL_EXT 0x1802 +#endif + +/* GL_EXT_map_buffer_range */ +#ifndef GL_EXT_map_buffer_range +#define GL_MAP_READ_BIT_EXT 0x0001 +#define GL_MAP_WRITE_BIT_EXT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 +#endif + +/* GL_EXT_multisampled_render_to_texture */ +#ifndef GL_EXT_multisampled_render_to_texture +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C +/* reuse values from GL_EXT_framebuffer_multisample (desktop extension) */ +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 +#endif + +/* GL_EXT_multiview_draw_buffers */ +#ifndef GL_EXT_multiview_draw_buffers +#define GL_COLOR_ATTACHMENT_EXT 0x90F0 +#define GL_MULTIVIEW_EXT 0x90F1 +#define GL_DRAW_BUFFER_EXT 0x0C01 +#define GL_READ_BUFFER_EXT 0x0C02 +#define GL_MAX_MULTIVIEW_BUFFERS_EXT 0x90F2 +#endif + +/* GL_EXT_multi_draw_arrays */ +/* No new tokens introduced by this extension. */ + +/* GL_EXT_occlusion_query_boolean */ +#ifndef GL_EXT_occlusion_query_boolean +#define GL_ANY_SAMPLES_PASSED_EXT 0x8C2F +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 0x8D6A +#define GL_CURRENT_QUERY_EXT 0x8865 +#define GL_QUERY_RESULT_EXT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867 +#endif + +/* GL_EXT_read_format_bgra */ +#ifndef GL_EXT_read_format_bgra +#define GL_BGRA_EXT 0x80E1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 +#endif + +/* GL_EXT_robustness */ +#ifndef GL_EXT_robustness +/* reuse GL_NO_ERROR */ +#define GL_GUILTY_CONTEXT_RESET_EXT 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_EXT 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_EXT 0x8255 +#define GL_CONTEXT_ROBUST_ACCESS_EXT 0x90F3 +#define GL_RESET_NOTIFICATION_STRATEGY_EXT 0x8256 +#define GL_LOSE_CONTEXT_ON_RESET_EXT 0x8252 +#define GL_NO_RESET_NOTIFICATION_EXT 0x8261 +#endif + +/* GL_EXT_separate_shader_objects */ +#ifndef GL_EXT_separate_shader_objects +#define GL_VERTEX_SHADER_BIT_EXT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT_EXT 0x00000002 +#define GL_ALL_SHADER_BITS_EXT 0xFFFFFFFF +#define GL_PROGRAM_SEPARABLE_EXT 0x8258 +#define GL_ACTIVE_PROGRAM_EXT 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING_EXT 0x825A +#endif + +/* GL_EXT_shader_framebuffer_fetch */ +#ifndef GL_EXT_shader_framebuffer_fetch +#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 +#endif + +/* GL_EXT_shader_texture_lod */ +/* No new tokens introduced by this extension. */ + +/* GL_EXT_shadow_samplers */ +#ifndef GL_EXT_shadow_samplers +#define GL_TEXTURE_COMPARE_MODE_EXT 0x884C +#define GL_TEXTURE_COMPARE_FUNC_EXT 0x884D +#define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E +#define GL_SAMPLER_2D_SHADOW_EXT 0x8B62 +#endif + +/* GL_EXT_sRGB */ +#ifndef GL_EXT_sRGB +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 +#endif + +/* GL_EXT_texture_compression_dxt1 */ +#ifndef GL_EXT_texture_compression_dxt1 +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#endif + +/* GL_EXT_texture_filter_anisotropic */ +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif + +/* GL_EXT_texture_format_BGRA8888 */ +#ifndef GL_EXT_texture_format_BGRA8888 +#define GL_BGRA_EXT 0x80E1 +#endif + +/* GL_EXT_texture_rg */ +#ifndef GL_EXT_texture_rg +#define GL_RED_EXT 0x1903 +#define GL_RG_EXT 0x8227 +#define GL_R8_EXT 0x8229 +#define GL_RG8_EXT 0x822B +#endif + +/* GL_EXT_texture_storage */ +#ifndef GL_EXT_texture_storage +#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F +#define GL_ALPHA8_EXT 0x803C +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_RGBA32F_EXT 0x8814 +#define GL_RGB32F_EXT 0x8815 +#define GL_ALPHA32F_EXT 0x8816 +#define GL_LUMINANCE32F_EXT 0x8818 +#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 +/* reuse GL_RGBA16F_EXT */ +/* reuse GL_RGB16F_EXT */ +#define GL_ALPHA16F_EXT 0x881C +#define GL_LUMINANCE16F_EXT 0x881E +#define GL_LUMINANCE_ALPHA16F_EXT 0x881F +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGB10_EXT 0x8052 +#define GL_BGRA8_EXT 0x93A1 +#define GL_R8_EXT 0x8229 +#define GL_RG8_EXT 0x822B +#define GL_R32F_EXT 0x822E +#define GL_RG32F_EXT 0x8230 +#define GL_R16F_EXT 0x822D +#define GL_RG16F_EXT 0x822F +#endif + +/* GL_EXT_texture_type_2_10_10_10_REV */ +#ifndef GL_EXT_texture_type_2_10_10_10_REV +#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 +#endif + +/* GL_EXT_unpack_subimage */ +#ifndef GL_EXT_unpack_subimage +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#endif + +/*------------------------------------------------------------------------* + * DMP extension tokens + *------------------------------------------------------------------------*/ + +/* GL_DMP_shader_binary */ +#ifndef GL_DMP_shader_binary +#define GL_SHADER_BINARY_DMP 0x9250 +#endif + +/*------------------------------------------------------------------------* + * FJ extension tokens + *------------------------------------------------------------------------*/ + +/* GL_FJ_shader_binary_GCCSO */ +#ifndef GL_FJ_shader_binary_GCCSO +#define GCCSO_SHADER_BINARY_FJ 0x9260 +#endif + +/*------------------------------------------------------------------------* + * IMG extension tokens + *------------------------------------------------------------------------*/ + +/* GL_IMG_program_binary */ +#ifndef GL_IMG_program_binary +#define GL_SGX_PROGRAM_BINARY_IMG 0x9130 +#endif + +/* GL_IMG_read_format */ +#ifndef GL_IMG_read_format +#define GL_BGRA_IMG 0x80E1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG 0x8365 +#endif + +/* GL_IMG_shader_binary */ +#ifndef GL_IMG_shader_binary +#define GL_SGX_BINARY_IMG 0x8C0A +#endif + +/* GL_IMG_texture_compression_pvrtc */ +#ifndef GL_IMG_texture_compression_pvrtc +#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 +#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 +#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 +#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 +#endif + +/* GL_IMG_multisampled_render_to_texture */ +#ifndef GL_IMG_multisampled_render_to_texture +#define GL_RENDERBUFFER_SAMPLES_IMG 0x9133 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134 +#define GL_MAX_SAMPLES_IMG 0x9135 +#define GL_TEXTURE_SAMPLES_IMG 0x9136 +#endif + +/*------------------------------------------------------------------------* + * NV extension tokens + *------------------------------------------------------------------------*/ + +/* GL_NV_coverage_sample */ +#ifndef GL_NV_coverage_sample +#define GL_COVERAGE_COMPONENT_NV 0x8ED0 +#define GL_COVERAGE_COMPONENT4_NV 0x8ED1 +#define GL_COVERAGE_ATTACHMENT_NV 0x8ED2 +#define GL_COVERAGE_BUFFERS_NV 0x8ED3 +#define GL_COVERAGE_SAMPLES_NV 0x8ED4 +#define GL_COVERAGE_ALL_FRAGMENTS_NV 0x8ED5 +#define GL_COVERAGE_EDGE_FRAGMENTS_NV 0x8ED6 +#define GL_COVERAGE_AUTOMATIC_NV 0x8ED7 +#define GL_COVERAGE_BUFFER_BIT_NV 0x8000 +#endif + +/* GL_NV_depth_nonlinear */ +#ifndef GL_NV_depth_nonlinear +#define GL_DEPTH_COMPONENT16_NONLINEAR_NV 0x8E2C +#endif + +/* GL_NV_draw_buffers */ +#ifndef GL_NV_draw_buffers +#define GL_MAX_DRAW_BUFFERS_NV 0x8824 +#define GL_DRAW_BUFFER0_NV 0x8825 +#define GL_DRAW_BUFFER1_NV 0x8826 +#define GL_DRAW_BUFFER2_NV 0x8827 +#define GL_DRAW_BUFFER3_NV 0x8828 +#define GL_DRAW_BUFFER4_NV 0x8829 +#define GL_DRAW_BUFFER5_NV 0x882A +#define GL_DRAW_BUFFER6_NV 0x882B +#define GL_DRAW_BUFFER7_NV 0x882C +#define GL_DRAW_BUFFER8_NV 0x882D +#define GL_DRAW_BUFFER9_NV 0x882E +#define GL_DRAW_BUFFER10_NV 0x882F +#define GL_DRAW_BUFFER11_NV 0x8830 +#define GL_DRAW_BUFFER12_NV 0x8831 +#define GL_DRAW_BUFFER13_NV 0x8832 +#define GL_DRAW_BUFFER14_NV 0x8833 +#define GL_DRAW_BUFFER15_NV 0x8834 +#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 +#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 +#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 +#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 +#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 +#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 +#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 +#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 +#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 +#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 +#define GL_COLOR_ATTACHMENT10_NV 0x8CEA +#define GL_COLOR_ATTACHMENT11_NV 0x8CEB +#define GL_COLOR_ATTACHMENT12_NV 0x8CEC +#define GL_COLOR_ATTACHMENT13_NV 0x8CED +#define GL_COLOR_ATTACHMENT14_NV 0x8CEE +#define GL_COLOR_ATTACHMENT15_NV 0x8CEF +#endif + +/* GL_NV_fbo_color_attachments */ +#ifndef GL_NV_fbo_color_attachments +#define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF +/* GL_COLOR_ATTACHMENT{0-15}_NV defined in GL_NV_draw_buffers already. */ +#endif + +/* GL_NV_fence */ +#ifndef GL_NV_fence +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +#endif + +/* GL_NV_read_buffer */ +#ifndef GL_NV_read_buffer +#define GL_READ_BUFFER_NV 0x0C02 +#endif + +/* GL_NV_read_buffer_front */ +/* No new tokens introduced by this extension. */ + +/* GL_NV_read_depth */ +/* No new tokens introduced by this extension. */ + +/* GL_NV_read_depth_stencil */ +/* No new tokens introduced by this extension. */ + +/* GL_NV_read_stencil */ +/* No new tokens introduced by this extension. */ + +/* GL_NV_texture_compression_s3tc_update */ +/* No new tokens introduced by this extension. */ + +/* GL_NV_texture_npot_2D_mipmap */ +/* No new tokens introduced by this extension. */ + +/*------------------------------------------------------------------------* + * QCOM extension tokens + *------------------------------------------------------------------------*/ + +/* GL_QCOM_alpha_test */ +#ifndef GL_QCOM_alpha_test +#define GL_ALPHA_TEST_QCOM 0x0BC0 +#define GL_ALPHA_TEST_FUNC_QCOM 0x0BC1 +#define GL_ALPHA_TEST_REF_QCOM 0x0BC2 +#endif + +/* GL_QCOM_binning_control */ +#ifndef GL_QCOM_binning_control +#define GL_BINNING_CONTROL_HINT_QCOM 0x8FB0 +#define GL_CPU_OPTIMIZED_QCOM 0x8FB1 +#define GL_GPU_OPTIMIZED_QCOM 0x8FB2 +#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM 0x8FB3 +#endif + +/* GL_QCOM_driver_control */ +/* No new tokens introduced by this extension. */ + +/* GL_QCOM_extended_get */ +#ifndef GL_QCOM_extended_get +#define GL_TEXTURE_WIDTH_QCOM 0x8BD2 +#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3 +#define GL_TEXTURE_DEPTH_QCOM 0x8BD4 +#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5 +#define GL_TEXTURE_FORMAT_QCOM 0x8BD6 +#define GL_TEXTURE_TYPE_QCOM 0x8BD7 +#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8 +#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9 +#define GL_TEXTURE_TARGET_QCOM 0x8BDA +#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB +#define GL_STATE_RESTORE 0x8BDC +#endif + +/* GL_QCOM_extended_get2 */ +/* No new tokens introduced by this extension. */ + +/* GL_QCOM_perfmon_global_mode */ +#ifndef GL_QCOM_perfmon_global_mode +#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 +#endif + +/* GL_QCOM_writeonly_rendering */ +#ifndef GL_QCOM_writeonly_rendering +#define GL_WRITEONLY_RENDERING_QCOM 0x8823 +#endif + +/* GL_QCOM_tiled_rendering */ +#ifndef GL_QCOM_tiled_rendering +#define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 +#define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002 +#define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004 +#define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008 +#define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010 +#define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020 +#define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040 +#define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080 +#define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100 +#define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200 +#define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400 +#define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800 +#define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000 +#define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000 +#define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000 +#define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000 +#define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000 +#define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000 +#define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000 +#define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000 +#define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000 +#define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000 +#define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000 +#define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000 +#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000 +#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000 +#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000 +#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000 +#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000 +#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000 +#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000 +#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000 +#endif + +/*------------------------------------------------------------------------* + * VIV extension tokens + *------------------------------------------------------------------------*/ + +/* GL_VIV_shader_binary */ +#ifndef GL_VIV_shader_binary +#define GL_SHADER_BINARY_VIV 0x8FC4 +#endif + +/*------------------------------------------------------------------------* + * End of extension tokens, start of corresponding extension functions + *------------------------------------------------------------------------*/ + +/*------------------------------------------------------------------------* + * OES extension functions + *------------------------------------------------------------------------*/ + +/* GL_OES_compressed_ETC1_RGB8_texture */ +#ifndef GL_OES_compressed_ETC1_RGB8_texture +#define GL_OES_compressed_ETC1_RGB8_texture 1 +#endif + +/* GL_OES_compressed_paletted_texture */ +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 +#endif + +/* GL_OES_depth24 */ +#ifndef GL_OES_depth24 +#define GL_OES_depth24 1 +#endif + +/* GL_OES_depth32 */ +#ifndef GL_OES_depth32 +#define GL_OES_depth32 1 +#endif + +/* GL_OES_depth_texture */ +#ifndef GL_OES_depth_texture +#define GL_OES_depth_texture 1 +#endif + +/* GL_OES_EGL_image */ +#ifndef GL_OES_EGL_image +#define GL_OES_EGL_image 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image); +GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image); +#endif +typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image); +typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image); +#endif + +/* GL_OES_EGL_image_external */ +#ifndef GL_OES_EGL_image_external +#define GL_OES_EGL_image_external 1 +/* glEGLImageTargetTexture2DOES defined in GL_OES_EGL_image already. */ +#endif + +/* GL_OES_element_index_uint */ +#ifndef GL_OES_element_index_uint +#define GL_OES_element_index_uint 1 +#endif + +/* GL_OES_fbo_render_mipmap */ +#ifndef GL_OES_fbo_render_mipmap +#define GL_OES_fbo_render_mipmap 1 +#endif + +/* GL_OES_fragment_precision_high */ +#ifndef GL_OES_fragment_precision_high +#define GL_OES_fragment_precision_high 1 +#endif + +/* GL_OES_get_program_binary */ +#ifndef GL_OES_get_program_binary +#define GL_OES_get_program_binary 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetProgramBinaryOES (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); +GL_APICALL void GL_APIENTRY glProgramBinaryOES (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLint length); +#endif +typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); +typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLint length); +#endif + +/* GL_OES_mapbuffer */ +#ifndef GL_OES_mapbuffer +#define GL_OES_mapbuffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void* GL_APIENTRY glMapBufferOES (GLenum target, GLenum access); +GL_APICALL GLboolean GL_APIENTRY glUnmapBufferOES (GLenum target); +GL_APICALL void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, GLvoid** params); +#endif +typedef void* (GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access); +typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target); +typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, GLvoid** params); +#endif + +/* GL_OES_packed_depth_stencil */ +#ifndef GL_OES_packed_depth_stencil +#define GL_OES_packed_depth_stencil 1 +#endif + +/* GL_OES_required_internalformat */ +#ifndef GL_OES_required_internalformat +#define GL_OES_required_internalformat 1 +#endif + +/* GL_OES_rgb8_rgba8 */ +#ifndef GL_OES_rgb8_rgba8 +#define GL_OES_rgb8_rgba8 1 +#endif + +/* GL_OES_standard_derivatives */ +#ifndef GL_OES_standard_derivatives +#define GL_OES_standard_derivatives 1 +#endif + +/* GL_OES_stencil1 */ +#ifndef GL_OES_stencil1 +#define GL_OES_stencil1 1 +#endif + +/* GL_OES_stencil4 */ +#ifndef GL_OES_stencil4 +#define GL_OES_stencil4 1 +#endif + +#ifndef GL_OES_surfaceless_context +#define GL_OES_surfaceless_context 1 +#endif + +/* GL_OES_texture_3D */ +#ifndef GL_OES_texture_3D +#define GL_OES_texture_3D 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels); +GL_APICALL void GL_APIENTRY glTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels); +GL_APICALL void GL_APIENTRY glCopyTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glCompressedTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data); +GL_APICALL void GL_APIENTRY glCompressedTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data); +GL_APICALL void GL_APIENTRY glFramebufferTexture3DOES (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +#endif +typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels); +typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels); +typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data); +typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOES) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +#endif + +/* GL_OES_texture_float */ +#ifndef GL_OES_texture_float +#define GL_OES_texture_float 1 +#endif + +/* GL_OES_texture_float_linear */ +#ifndef GL_OES_texture_float_linear +#define GL_OES_texture_float_linear 1 +#endif + +/* GL_OES_texture_half_float */ +#ifndef GL_OES_texture_half_float +#define GL_OES_texture_half_float 1 +#endif + +/* GL_OES_texture_half_float_linear */ +#ifndef GL_OES_texture_half_float_linear +#define GL_OES_texture_half_float_linear 1 +#endif + +/* GL_OES_texture_npot */ +#ifndef GL_OES_texture_npot +#define GL_OES_texture_npot 1 +#endif + +/* GL_OES_vertex_array_object */ +#ifndef GL_OES_vertex_array_object +#define GL_OES_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBindVertexArrayOES (GLuint array); +GL_APICALL void GL_APIENTRY glDeleteVertexArraysOES (GLsizei n, const GLuint *arrays); +GL_APICALL void GL_APIENTRY glGenVertexArraysOES (GLsizei n, GLuint *arrays); +GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOES (GLuint array); +#endif +typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESPROC) (GLuint array); +typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays); +typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESPROC) (GLuint array); +#endif + +/* GL_OES_vertex_half_float */ +#ifndef GL_OES_vertex_half_float +#define GL_OES_vertex_half_float 1 +#endif + +/* GL_OES_vertex_type_10_10_10_2 */ +#ifndef GL_OES_vertex_type_10_10_10_2 +#define GL_OES_vertex_type_10_10_10_2 1 +#endif + +/*------------------------------------------------------------------------* + * KHR extension functions + *------------------------------------------------------------------------*/ + +#ifndef GL_KHR_debug +#define GL_KHR_debug 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GL_APICALL void GL_APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GL_APICALL void GL_APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam); +GL_APICALL GLuint GL_APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +GL_APICALL void GL_APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message); +GL_APICALL void GL_APIENTRY glPopDebugGroup (void); +GL_APICALL void GL_APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +GL_APICALL void GL_APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +GL_APICALL void GL_APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label); +GL_APICALL void GL_APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +GL_APICALL void GL_APIENTRY glGetPointerv (GLenum pname, void **params); +#endif +typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); +typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); +typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void); +typedef void (GL_APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETPOINTERVPROC) (GLenum pname, void **params); +#endif + +#ifndef GL_KHR_texture_compression_astc_ldr +#define GL_KHR_texture_compression_astc_ldr 1 +#endif + + +/*------------------------------------------------------------------------* + * AMD extension functions + *------------------------------------------------------------------------*/ + +/* GL_AMD_compressed_3DC_texture */ +#ifndef GL_AMD_compressed_3DC_texture +#define GL_AMD_compressed_3DC_texture 1 +#endif + +/* GL_AMD_compressed_ATC_texture */ +#ifndef GL_AMD_compressed_ATC_texture +#define GL_AMD_compressed_ATC_texture 1 +#endif + +/* AMD_performance_monitor */ +#ifndef GL_AMD_performance_monitor +#define GL_AMD_performance_monitor 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, GLvoid *data); +GL_APICALL void GL_APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); +GL_APICALL void GL_APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); +GL_APICALL void GL_APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList); +GL_APICALL void GL_APIENTRY glBeginPerfMonitorAMD (GLuint monitor); +GL_APICALL void GL_APIENTRY glEndPerfMonitorAMD (GLuint monitor); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#endif +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, GLvoid *data); +typedef void (GL_APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (GL_APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (GL_APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList); +typedef void (GL_APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GL_APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#endif + +/* GL_AMD_program_binary_Z400 */ +#ifndef GL_AMD_program_binary_Z400 +#define GL_AMD_program_binary_Z400 1 +#endif + +/*------------------------------------------------------------------------* + * ANGLE extension functions + *------------------------------------------------------------------------*/ + +/* GL_ANGLE_framebuffer_blit */ +#ifndef GL_ANGLE_framebuffer_blit +#define GL_ANGLE_framebuffer_blit 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBlitFramebufferANGLE (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif +typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif + +/* GL_ANGLE_framebuffer_multisample */ +#ifndef GL_ANGLE_framebuffer_multisample +#define GL_ANGLE_framebuffer_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleANGLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif + +#ifndef GL_ANGLE_instanced_arrays +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLE (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLE (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLE (GLuint index, GLuint divisor); +#endif +typedef void (GL_APIENTRYP PFLGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GL_APIENTRYP PFLGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +typedef void (GL_APIENTRYP PFLGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); +#endif + +/* GL_ANGLE_pack_reverse_row_order */ +#ifndef GL_ANGLE_pack_reverse_row_order +#define GL_ANGLE_pack_reverse_row_order 1 +#endif + +/* GL_ANGLE_texture_compression_dxt3 */ +#ifndef GL_ANGLE_texture_compression_dxt3 +#define GL_ANGLE_texture_compression_dxt3 1 +#endif + +/* GL_ANGLE_texture_compression_dxt5 */ +#ifndef GL_ANGLE_texture_compression_dxt5 +#define GL_ANGLE_texture_compression_dxt5 1 +#endif + +/* GL_ANGLE_texture_usage */ +#ifndef GL_ANGLE_texture_usage +#define GL_ANGLE_texture_usage 1 +#endif + +#ifndef GL_ANGLE_translated_shader_source +#define GL_ANGLE_translated_shader_source 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLE (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source); +#endif +typedef void (GL_APIENTRYP PFLGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source); +#endif + +/*------------------------------------------------------------------------* + * APPLE extension functions + *------------------------------------------------------------------------*/ + +/* GL_APPLE_copy_texture_levels */ +#ifndef GL_APPLE_copy_texture_levels +#define GL_APPLE_copy_texture_levels 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCopyTextureLevelsAPPLE (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); +#endif +typedef void (GL_APIENTRYP PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); +#endif + +/* GL_APPLE_framebuffer_multisample */ +#ifndef GL_APPLE_framebuffer_multisample +#define GL_APPLE_framebuffer_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleAPPLE (GLenum, GLsizei, GLenum, GLsizei, GLsizei); +GL_APICALL void GL_APIENTRY glResolveMultisampleFramebufferAPPLE (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void); +#endif + +/* GL_APPLE_rgb_422 */ +#ifndef GL_APPLE_rgb_422 +#define GL_APPLE_rgb_422 1 +#endif + +/* GL_APPLE_sync */ +#ifndef GL_APPLE_sync +#define GL_APPLE_sync 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLsync GL_APIENTRY glFenceSyncAPPLE (GLenum condition, GLbitfield flags); +GL_APICALL GLboolean GL_APIENTRY glIsSyncAPPLE (GLsync sync); +GL_APICALL void GL_APIENTRY glDeleteSyncAPPLE (GLsync sync); +GL_APICALL GLenum GL_APIENTRY glClientWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); +GL_APICALL void GL_APIENTRY glWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); +GL_APICALL void GL_APIENTRY glGetInteger64vAPPLE (GLenum pname, GLint64 *params); +GL_APICALL void GL_APIENTRY glGetSyncivAPPLE (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +#endif +typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags); +typedef GLboolean (GL_APIENTRYP PFNGLISSYNCAPPLEPROC) (GLsync sync); +typedef void (GL_APIENTRYP PFNGLDELETESYNCAPPLEPROC) (GLsync sync); +typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GL_APIENTRYP PFNGLWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GL_APIENTRYP PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64 *params); +typedef void (GL_APIENTRYP PFNGLGETSYNCIVAPPLEPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +#endif + +/* GL_APPLE_texture_format_BGRA8888 */ +#ifndef GL_APPLE_texture_format_BGRA8888 +#define GL_APPLE_texture_format_BGRA8888 1 +#endif + +/* GL_APPLE_texture_max_level */ +#ifndef GL_APPLE_texture_max_level +#define GL_APPLE_texture_max_level 1 +#endif + +/*------------------------------------------------------------------------* + * ARM extension functions + *------------------------------------------------------------------------*/ + +/* GL_ARM_mali_program_binary */ +#ifndef GL_ARM_mali_program_binary +#define GL_ARM_mali_program_binary 1 +#endif + +/* GL_ARM_mali_shader_binary */ +#ifndef GL_ARM_mali_shader_binary +#define GL_ARM_mali_shader_binary 1 +#endif + +/* GL_ARM_rgba8 */ +#ifndef GL_ARM_rgba8 +#define GL_ARM_rgba8 1 +#endif + +/*------------------------------------------------------------------------* + * EXT extension functions + *------------------------------------------------------------------------*/ + +/* GL_EXT_blend_minmax */ +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#endif + +/* GL_EXT_color_buffer_half_float */ +#ifndef GL_EXT_color_buffer_half_float +#define GL_EXT_color_buffer_half_float 1 +#endif + +/* GL_EXT_debug_label */ +#ifndef GL_EXT_debug_label +#define GL_EXT_debug_label 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label); +GL_APICALL void GL_APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#endif +typedef void (GL_APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#endif + +/* GL_EXT_debug_marker */ +#ifndef GL_EXT_debug_marker +#define GL_EXT_debug_marker 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); +GL_APICALL void GL_APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); +GL_APICALL void GL_APIENTRY glPopGroupMarkerEXT (void); +#endif +typedef void (GL_APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (GL_APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (GL_APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); +#endif + +/* GL_EXT_discard_framebuffer */ +#ifndef GL_EXT_discard_framebuffer +#define GL_EXT_discard_framebuffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numAttachments, const GLenum *attachments); +#endif +typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); +#endif + +/* GL_EXT_map_buffer_range */ +#ifndef GL_EXT_map_buffer_range +#define GL_EXT_map_buffer_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void* GL_APIENTRY glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +GL_APICALL void GL_APIENTRY glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length); +#endif +typedef void* (GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +#endif + +/* GL_EXT_multisampled_render_to_texture */ +#ifndef GL_EXT_multisampled_render_to_texture +#define GL_EXT_multisampled_render_to_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleEXT (GLenum, GLsizei, GLenum, GLsizei, GLsizei); +GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleEXT (GLenum, GLenum, GLenum, GLuint, GLint, GLsizei); +#endif +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +#endif + +/* GL_EXT_multiview_draw_buffers */ +#ifndef GL_EXT_multiview_draw_buffers +#define GL_EXT_multiview_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glReadBufferIndexedEXT (GLenum src, GLint index); +GL_APICALL void GL_APIENTRY glDrawBuffersIndexedEXT (GLint n, const GLenum *location, const GLint *indices); +GL_APICALL void GL_APIENTRY glGetIntegeri_vEXT (GLenum target, GLuint index, GLint *data); +#endif +typedef void (GL_APIENTRYP PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index); +typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum *location, const GLint *indices); +typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint *data); +#endif + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); +GL_APICALL void GL_APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +#endif + +/* GL_EXT_occlusion_query_boolean */ +#ifndef GL_EXT_occlusion_query_boolean +#define GL_EXT_occlusion_query_boolean 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGenQueriesEXT (GLsizei n, GLuint *ids); +GL_APICALL void GL_APIENTRY glDeleteQueriesEXT (GLsizei n, const GLuint *ids); +GL_APICALL GLboolean GL_APIENTRY glIsQueryEXT (GLuint id); +GL_APICALL void GL_APIENTRY glBeginQueryEXT (GLenum target, GLuint id); +GL_APICALL void GL_APIENTRY glEndQueryEXT (GLenum target); +GL_APICALL void GL_APIENTRY glGetQueryivEXT (GLenum target, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetQueryObjectuivEXT (GLuint id, GLenum pname, GLuint *params); +#endif +typedef void (GL_APIENTRYP PFNGLGENQUERIESEXTPROC) (GLsizei n, GLuint *ids); +typedef void (GL_APIENTRYP PFNGLDELETEQUERIESEXTPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (GL_APIENTRYP PFNGLISQUERYEXTPROC) (GLuint id); +typedef void (GL_APIENTRYP PFNGLBEGINQUERYEXTPROC) (GLenum target, GLuint id); +typedef void (GL_APIENTRYP PFNGLENDQUERYEXTPROC) (GLenum target); +typedef void (GL_APIENTRYP PFNGLGETQUERYIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVEXTPROC) (GLuint id, GLenum pname, GLuint *params); +#endif + +/* GL_EXT_read_format_bgra */ +#ifndef GL_EXT_read_format_bgra +#define GL_EXT_read_format_bgra 1 +#endif + +/* GL_EXT_robustness */ +#ifndef GL_EXT_robustness +#define GL_EXT_robustness 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXT (void); +GL_APICALL void GL_APIENTRY glReadnPixelsEXT (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +GL_APICALL void GL_APIENTRY glGetnUniformfvEXT (GLuint program, GLint location, GLsizei bufSize, float *params); +GL_APICALL void GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, GLsizei bufSize, GLint *params); +#endif +typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTPROC) (void); +typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, float *params); +typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +#endif + +/* GL_EXT_separate_shader_objects */ +#ifndef GL_EXT_separate_shader_objects +#define GL_EXT_separate_shader_objects 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glUseProgramStagesEXT (GLuint pipeline, GLbitfield stages, GLuint program); +GL_APICALL void GL_APIENTRY glActiveShaderProgramEXT (GLuint pipeline, GLuint program); +GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramvEXT (GLenum type, GLsizei count, const GLchar **strings); +GL_APICALL void GL_APIENTRY glBindProgramPipelineEXT (GLuint pipeline); +GL_APICALL void GL_APIENTRY glDeleteProgramPipelinesEXT (GLsizei n, const GLuint *pipelines); +GL_APICALL void GL_APIENTRY glGenProgramPipelinesEXT (GLsizei n, GLuint *pipelines); +GL_APICALL GLboolean GL_APIENTRY glIsProgramPipelineEXT (GLuint pipeline); +GL_APICALL void GL_APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); +GL_APICALL void GL_APIENTRY glGetProgramPipelineivEXT (GLuint pipeline, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint x); +GL_APICALL void GL_APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint x, GLint y); +GL_APICALL void GL_APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint x, GLint y, GLint z); +GL_APICALL void GL_APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w); +GL_APICALL void GL_APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat x); +GL_APICALL void GL_APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat x, GLfloat y); +GL_APICALL void GL_APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z); +GL_APICALL void GL_APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GL_APICALL void GL_APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glValidateProgramPipelineEXT (GLuint pipeline); +GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLogEXT (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +#endif +typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESEXTPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMEXTPROC) (GLuint pipeline, GLuint program); +typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVEXTPROC) (GLenum type, GLsizei count, const GLchar **strings); +typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESEXTPROC) (GLsizei n, const GLuint *pipelines); +typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESEXTPROC) (GLsizei n, GLuint *pipelines); +typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVEXTPROC) (GLuint pipeline, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint x); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint x, GLint y); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat x); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGEXTPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +#endif + +/* GL_EXT_shader_framebuffer_fetch */ +#ifndef GL_EXT_shader_framebuffer_fetch +#define GL_EXT_shader_framebuffer_fetch 1 +#endif + +/* GL_EXT_shader_texture_lod */ +#ifndef GL_EXT_shader_texture_lod +#define GL_EXT_shader_texture_lod 1 +#endif + +/* GL_EXT_shadow_samplers */ +#ifndef GL_EXT_shadow_samplers +#define GL_EXT_shadow_samplers 1 +#endif + +/* GL_EXT_sRGB */ +#ifndef GL_EXT_sRGB +#define GL_EXT_sRGB 1 +#endif + +/* GL_EXT_texture_compression_dxt1 */ +#ifndef GL_EXT_texture_compression_dxt1 +#define GL_EXT_texture_compression_dxt1 1 +#endif + +/* GL_EXT_texture_filter_anisotropic */ +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#endif + +/* GL_EXT_texture_format_BGRA8888 */ +#ifndef GL_EXT_texture_format_BGRA8888 +#define GL_EXT_texture_format_BGRA8888 1 +#endif + +/* GL_EXT_texture_rg */ +#ifndef GL_EXT_texture_rg +#define GL_EXT_texture_rg 1 +#endif + +/* GL_EXT_texture_storage */ +#ifndef GL_EXT_texture_storage +#define GL_EXT_texture_storage 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GL_APICALL void GL_APIENTRY glTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glTexStorage3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GL_APICALL void GL_APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GL_APICALL void GL_APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +#endif +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +#endif + +/* GL_EXT_texture_type_2_10_10_10_REV */ +#ifndef GL_EXT_texture_type_2_10_10_10_REV +#define GL_EXT_texture_type_2_10_10_10_REV 1 +#endif + +/* GL_EXT_unpack_subimage */ +#ifndef GL_EXT_unpack_subimage +#define GL_EXT_unpack_subimage 1 +#endif + +/*------------------------------------------------------------------------* + * DMP extension functions + *------------------------------------------------------------------------*/ + +/* GL_DMP_shader_binary */ +#ifndef GL_DMP_shader_binary +#define GL_DMP_shader_binary 1 +#endif + +/*------------------------------------------------------------------------* + * FJ extension functions + *------------------------------------------------------------------------*/ + +/* GL_FJ_shader_binary_GCCSO */ +#ifndef GL_FJ_shader_binary_GCCSO +#define GL_FJ_shader_binary_GCCSO 1 +#endif + +/*------------------------------------------------------------------------* + * IMG extension functions + *------------------------------------------------------------------------*/ + +/* GL_IMG_program_binary */ +#ifndef GL_IMG_program_binary +#define GL_IMG_program_binary 1 +#endif + +/* GL_IMG_read_format */ +#ifndef GL_IMG_read_format +#define GL_IMG_read_format 1 +#endif + +/* GL_IMG_shader_binary */ +#ifndef GL_IMG_shader_binary +#define GL_IMG_shader_binary 1 +#endif + +/* GL_IMG_texture_compression_pvrtc */ +#ifndef GL_IMG_texture_compression_pvrtc +#define GL_IMG_texture_compression_pvrtc 1 +#endif + +/* GL_IMG_multisampled_render_to_texture */ +#ifndef GL_IMG_multisampled_render_to_texture +#define GL_IMG_multisampled_render_to_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleIMG (GLenum, GLsizei, GLenum, GLsizei, GLsizei); +GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum, GLenum, GLenum, GLuint, GLint, GLsizei); +#endif +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +#endif + +/*------------------------------------------------------------------------* + * NV extension functions + *------------------------------------------------------------------------*/ + +/* GL_NV_coverage_sample */ +#ifndef GL_NV_coverage_sample +#define GL_NV_coverage_sample 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCoverageMaskNV (GLboolean mask); +GL_APICALL void GL_APIENTRY glCoverageOperationNV (GLenum operation); +#endif +typedef void (GL_APIENTRYP PFNGLCOVERAGEMASKNVPROC) (GLboolean mask); +typedef void (GL_APIENTRYP PFNGLCOVERAGEOPERATIONNVPROC) (GLenum operation); +#endif + +/* GL_NV_depth_nonlinear */ +#ifndef GL_NV_depth_nonlinear +#define GL_NV_depth_nonlinear 1 +#endif + +/* GL_NV_draw_buffers */ +#ifndef GL_NV_draw_buffers +#define GL_NV_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawBuffersNV (GLsizei n, const GLenum *bufs); +#endif +typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum *bufs); +#endif + +/* GL_NV_fbo_color_attachments */ +#ifndef GL_NV_fbo_color_attachments +#define GL_NV_fbo_color_attachments 1 +#endif + +/* GL_NV_fence */ +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDeleteFencesNV (GLsizei, const GLuint *); +GL_APICALL void GL_APIENTRY glGenFencesNV (GLsizei, GLuint *); +GL_APICALL GLboolean GL_APIENTRY glIsFenceNV (GLuint); +GL_APICALL GLboolean GL_APIENTRY glTestFenceNV (GLuint); +GL_APICALL void GL_APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *); +GL_APICALL void GL_APIENTRY glFinishFenceNV (GLuint); +GL_APICALL void GL_APIENTRY glSetFenceNV (GLuint, GLenum); +#endif +typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (GL_APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (GL_APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#endif + +/* GL_NV_read_buffer */ +#ifndef GL_NV_read_buffer +#define GL_NV_read_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glReadBufferNV (GLenum mode); +#endif +typedef void (GL_APIENTRYP PFNGLREADBUFFERNVPROC) (GLenum mode); +#endif + +/* GL_NV_read_buffer_front */ +#ifndef GL_NV_read_buffer_front +#define GL_NV_read_buffer_front 1 +#endif + +/* GL_NV_read_depth */ +#ifndef GL_NV_read_depth +#define GL_NV_read_depth 1 +#endif + +/* GL_NV_read_depth_stencil */ +#ifndef GL_NV_read_depth_stencil +#define GL_NV_read_depth_stencil 1 +#endif + +/* GL_NV_read_stencil */ +#ifndef GL_NV_read_stencil +#define GL_NV_read_stencil 1 +#endif + +/* GL_NV_texture_compression_s3tc_update */ +#ifndef GL_NV_texture_compression_s3tc_update +#define GL_NV_texture_compression_s3tc_update 1 +#endif + +/* GL_NV_texture_npot_2D_mipmap */ +#ifndef GL_NV_texture_npot_2D_mipmap +#define GL_NV_texture_npot_2D_mipmap 1 +#endif + +/*------------------------------------------------------------------------* + * QCOM extension functions + *------------------------------------------------------------------------*/ + +/* GL_QCOM_alpha_test */ +#ifndef GL_QCOM_alpha_test +#define GL_QCOM_alpha_test 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glAlphaFuncQCOM (GLenum func, GLclampf ref); +#endif +typedef void (GL_APIENTRYP PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref); +#endif + +/* GL_QCOM_binning_control */ +#ifndef GL_QCOM_binning_control +#define GL_QCOM_binning_control 1 +#endif + +/* GL_QCOM_driver_control */ +#ifndef GL_QCOM_driver_control +#define GL_QCOM_driver_control 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetDriverControlsQCOM (GLint *num, GLsizei size, GLuint *driverControls); +GL_APICALL void GL_APIENTRY glGetDriverControlStringQCOM (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); +GL_APICALL void GL_APIENTRY glEnableDriverControlQCOM (GLuint driverControl); +GL_APICALL void GL_APIENTRY glDisableDriverControlQCOM (GLuint driverControl); +#endif +typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint *num, GLsizei size, GLuint *driverControls); +typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); +typedef void (GL_APIENTRYP PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +typedef void (GL_APIENTRYP PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +#endif + +/* GL_QCOM_extended_get */ +#ifndef GL_QCOM_extended_get +#define GL_QCOM_extended_get 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glExtGetTexturesQCOM (GLuint *textures, GLint maxTextures, GLint *numTextures); +GL_APICALL void GL_APIENTRY glExtGetBuffersQCOM (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); +GL_APICALL void GL_APIENTRY glExtGetRenderbuffersQCOM (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); +GL_APICALL void GL_APIENTRY glExtGetFramebuffersQCOM (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); +GL_APICALL void GL_APIENTRY glExtGetTexLevelParameterivQCOM (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glExtTexObjectStateOverrideiQCOM (GLenum target, GLenum pname, GLint param); +GL_APICALL void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels); +GL_APICALL void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, GLvoid **params); +#endif +typedef void (GL_APIENTRYP PFNGLEXTGETTEXTURESQCOMPROC) (GLuint *textures, GLint maxTextures, GLint *numTextures); +typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERSQCOMPROC) (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GL_APIENTRYP PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels); +typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, GLvoid **params); +#endif + +/* GL_QCOM_extended_get2 */ +#ifndef GL_QCOM_extended_get2 +#define GL_QCOM_extended_get2 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glExtGetShadersQCOM (GLuint *shaders, GLint maxShaders, GLint *numShaders); +GL_APICALL void GL_APIENTRY glExtGetProgramsQCOM (GLuint *programs, GLint maxPrograms, GLint *numPrograms); +GL_APICALL GLboolean GL_APIENTRY glExtIsProgramBinaryQCOM (GLuint program); +GL_APICALL void GL_APIENTRY glExtGetProgramBinarySourceQCOM (GLuint program, GLenum shadertype, GLchar *source, GLint *length); +#endif +typedef void (GL_APIENTRYP PFNGLEXTGETSHADERSQCOMPROC) (GLuint *shaders, GLint maxShaders, GLint *numShaders); +typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint *programs, GLint maxPrograms, GLint *numPrograms); +typedef GLboolean (GL_APIENTRYP PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program); +typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar *source, GLint *length); +#endif + +/* GL_QCOM_perfmon_global_mode */ +#ifndef GL_QCOM_perfmon_global_mode +#define GL_QCOM_perfmon_global_mode 1 +#endif + +/* GL_QCOM_writeonly_rendering */ +#ifndef GL_QCOM_writeonly_rendering +#define GL_QCOM_writeonly_rendering 1 +#endif + +/* GL_QCOM_tiled_rendering */ +#ifndef GL_QCOM_tiled_rendering +#define GL_QCOM_tiled_rendering 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glStartTilingQCOM (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); +GL_APICALL void GL_APIENTRY glEndTilingQCOM (GLbitfield preserveMask); +#endif +typedef void (GL_APIENTRYP PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); +typedef void (GL_APIENTRYP PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask); +#endif + +/*------------------------------------------------------------------------* + * VIV extension tokens + *------------------------------------------------------------------------*/ + +/* GL_VIV_shader_binary */ +#ifndef GL_VIV_shader_binary +#define GL_VIV_shader_binary 1 +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __gl2ext_h_ */ + +#endif /* _MSC_VER */ + +#ifndef APIENTRY +#define APIENTRY GL_APIENTRY +#endif diff --git a/lib/SDL2/include/SDL_pixels.h b/lib/SDL2/include/SDL_pixels.h new file mode 100644 index 0000000000..3131af7b74 --- /dev/null +++ b/lib/SDL2/include/SDL_pixels.h @@ -0,0 +1,429 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_pixels.h + * + * Header for the enumerated pixel format definitions. + */ + +#ifndef _SDL_pixels_h +#define _SDL_pixels_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \name Transparency definitions + * + * These define alpha as the opacity of a surface. + */ +/* @{ */ +#define SDL_ALPHA_OPAQUE 255 +#define SDL_ALPHA_TRANSPARENT 0 +/* @} */ + +/** Pixel type. */ +enum +{ + SDL_PIXELTYPE_UNKNOWN, + SDL_PIXELTYPE_INDEX1, + SDL_PIXELTYPE_INDEX4, + SDL_PIXELTYPE_INDEX8, + SDL_PIXELTYPE_PACKED8, + SDL_PIXELTYPE_PACKED16, + SDL_PIXELTYPE_PACKED32, + SDL_PIXELTYPE_ARRAYU8, + SDL_PIXELTYPE_ARRAYU16, + SDL_PIXELTYPE_ARRAYU32, + SDL_PIXELTYPE_ARRAYF16, + SDL_PIXELTYPE_ARRAYF32 +}; + +/** Bitmap pixel order, high bit -> low bit. */ +enum +{ + SDL_BITMAPORDER_NONE, + SDL_BITMAPORDER_4321, + SDL_BITMAPORDER_1234 +}; + +/** Packed component order, high bit -> low bit. */ +enum +{ + SDL_PACKEDORDER_NONE, + SDL_PACKEDORDER_XRGB, + SDL_PACKEDORDER_RGBX, + SDL_PACKEDORDER_ARGB, + SDL_PACKEDORDER_RGBA, + SDL_PACKEDORDER_XBGR, + SDL_PACKEDORDER_BGRX, + SDL_PACKEDORDER_ABGR, + SDL_PACKEDORDER_BGRA +}; + +/** Array component order, low byte -> high byte. */ +enum +{ + SDL_ARRAYORDER_NONE, + SDL_ARRAYORDER_RGB, + SDL_ARRAYORDER_RGBA, + SDL_ARRAYORDER_ARGB, + SDL_ARRAYORDER_BGR, + SDL_ARRAYORDER_BGRA, + SDL_ARRAYORDER_ABGR +}; + +/** Packed component layout. */ +enum +{ + SDL_PACKEDLAYOUT_NONE, + SDL_PACKEDLAYOUT_332, + SDL_PACKEDLAYOUT_4444, + SDL_PACKEDLAYOUT_1555, + SDL_PACKEDLAYOUT_5551, + SDL_PACKEDLAYOUT_565, + SDL_PACKEDLAYOUT_8888, + SDL_PACKEDLAYOUT_2101010, + SDL_PACKEDLAYOUT_1010102 +}; + +#define SDL_DEFINE_PIXELFOURCC(A, B, C, D) SDL_FOURCC(A, B, C, D) + +#define SDL_DEFINE_PIXELFORMAT(type, order, layout, bits, bytes) \ + ((1 << 28) | ((type) << 24) | ((order) << 20) | ((layout) << 16) | \ + ((bits) << 8) | ((bytes) << 0)) + +#define SDL_PIXELFLAG(X) (((X) >> 28) & 0x0F) +#define SDL_PIXELTYPE(X) (((X) >> 24) & 0x0F) +#define SDL_PIXELORDER(X) (((X) >> 20) & 0x0F) +#define SDL_PIXELLAYOUT(X) (((X) >> 16) & 0x0F) +#define SDL_BITSPERPIXEL(X) (((X) >> 8) & 0xFF) +#define SDL_BYTESPERPIXEL(X) \ + (SDL_ISPIXELFORMAT_FOURCC(X) ? \ + ((((X) == SDL_PIXELFORMAT_YUY2) || \ + ((X) == SDL_PIXELFORMAT_UYVY) || \ + ((X) == SDL_PIXELFORMAT_YVYU)) ? 2 : 1) : (((X) >> 0) & 0xFF)) + +#define SDL_ISPIXELFORMAT_INDEXED(format) \ + (!SDL_ISPIXELFORMAT_FOURCC(format) && \ + ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX1) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX4) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX8))) + +#define SDL_ISPIXELFORMAT_ALPHA(format) \ + (!SDL_ISPIXELFORMAT_FOURCC(format) && \ + ((SDL_PIXELORDER(format) == SDL_PACKEDORDER_ARGB) || \ + (SDL_PIXELORDER(format) == SDL_PACKEDORDER_RGBA) || \ + (SDL_PIXELORDER(format) == SDL_PACKEDORDER_ABGR) || \ + (SDL_PIXELORDER(format) == SDL_PACKEDORDER_BGRA))) + +/* The flag is set to 1 because 0x1? is not in the printable ASCII range */ +#define SDL_ISPIXELFORMAT_FOURCC(format) \ + ((format) && (SDL_PIXELFLAG(format) != 1)) + +/* Note: If you modify this list, update SDL_GetPixelFormatName() */ +enum +{ + SDL_PIXELFORMAT_UNKNOWN, + SDL_PIXELFORMAT_INDEX1LSB = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1, SDL_BITMAPORDER_4321, 0, + 1, 0), + SDL_PIXELFORMAT_INDEX1MSB = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1, SDL_BITMAPORDER_1234, 0, + 1, 0), + SDL_PIXELFORMAT_INDEX4LSB = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4, SDL_BITMAPORDER_4321, 0, + 4, 0), + SDL_PIXELFORMAT_INDEX4MSB = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4, SDL_BITMAPORDER_1234, 0, + 4, 0), + SDL_PIXELFORMAT_INDEX8 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX8, 0, 0, 8, 1), + SDL_PIXELFORMAT_RGB332 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED8, SDL_PACKEDORDER_XRGB, + SDL_PACKEDLAYOUT_332, 8, 1), + SDL_PIXELFORMAT_RGB444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB, + SDL_PACKEDLAYOUT_4444, 12, 2), + SDL_PIXELFORMAT_RGB555 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB, + SDL_PACKEDLAYOUT_1555, 15, 2), + SDL_PIXELFORMAT_BGR555 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR, + SDL_PACKEDLAYOUT_1555, 15, 2), + SDL_PIXELFORMAT_ARGB4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ARGB, + SDL_PACKEDLAYOUT_4444, 16, 2), + SDL_PIXELFORMAT_RGBA4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_RGBA, + SDL_PACKEDLAYOUT_4444, 16, 2), + SDL_PIXELFORMAT_ABGR4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ABGR, + SDL_PACKEDLAYOUT_4444, 16, 2), + SDL_PIXELFORMAT_BGRA4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_BGRA, + SDL_PACKEDLAYOUT_4444, 16, 2), + SDL_PIXELFORMAT_ARGB1555 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ARGB, + SDL_PACKEDLAYOUT_1555, 16, 2), + SDL_PIXELFORMAT_RGBA5551 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_RGBA, + SDL_PACKEDLAYOUT_5551, 16, 2), + SDL_PIXELFORMAT_ABGR1555 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ABGR, + SDL_PACKEDLAYOUT_1555, 16, 2), + SDL_PIXELFORMAT_BGRA5551 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_BGRA, + SDL_PACKEDLAYOUT_5551, 16, 2), + SDL_PIXELFORMAT_RGB565 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB, + SDL_PACKEDLAYOUT_565, 16, 2), + SDL_PIXELFORMAT_BGR565 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR, + SDL_PACKEDLAYOUT_565, 16, 2), + SDL_PIXELFORMAT_RGB24 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU8, SDL_ARRAYORDER_RGB, 0, + 24, 3), + SDL_PIXELFORMAT_BGR24 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU8, SDL_ARRAYORDER_BGR, 0, + 24, 3), + SDL_PIXELFORMAT_RGB888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XRGB, + SDL_PACKEDLAYOUT_8888, 24, 4), + SDL_PIXELFORMAT_RGBX8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBX, + SDL_PACKEDLAYOUT_8888, 24, 4), + SDL_PIXELFORMAT_BGR888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XBGR, + SDL_PACKEDLAYOUT_8888, 24, 4), + SDL_PIXELFORMAT_BGRX8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_BGRX, + SDL_PACKEDLAYOUT_8888, 24, 4), + SDL_PIXELFORMAT_ARGB8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB, + SDL_PACKEDLAYOUT_8888, 32, 4), + SDL_PIXELFORMAT_RGBA8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBA, + SDL_PACKEDLAYOUT_8888, 32, 4), + SDL_PIXELFORMAT_ABGR8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ABGR, + SDL_PACKEDLAYOUT_8888, 32, 4), + SDL_PIXELFORMAT_BGRA8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_BGRA, + SDL_PACKEDLAYOUT_8888, 32, 4), + SDL_PIXELFORMAT_ARGB2101010 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB, + SDL_PACKEDLAYOUT_2101010, 32, 4), + + SDL_PIXELFORMAT_YV12 = /**< Planar mode: Y + V + U (3 planes) */ + SDL_DEFINE_PIXELFOURCC('Y', 'V', '1', '2'), + SDL_PIXELFORMAT_IYUV = /**< Planar mode: Y + U + V (3 planes) */ + SDL_DEFINE_PIXELFOURCC('I', 'Y', 'U', 'V'), + SDL_PIXELFORMAT_YUY2 = /**< Packed mode: Y0+U0+Y1+V0 (1 plane) */ + SDL_DEFINE_PIXELFOURCC('Y', 'U', 'Y', '2'), + SDL_PIXELFORMAT_UYVY = /**< Packed mode: U0+Y0+V0+Y1 (1 plane) */ + SDL_DEFINE_PIXELFOURCC('U', 'Y', 'V', 'Y'), + SDL_PIXELFORMAT_YVYU = /**< Packed mode: Y0+V0+Y1+U0 (1 plane) */ + SDL_DEFINE_PIXELFOURCC('Y', 'V', 'Y', 'U') +}; + +typedef struct SDL_Color +{ + Uint8 r; + Uint8 g; + Uint8 b; + Uint8 a; +} SDL_Color; +#define SDL_Colour SDL_Color + +typedef struct SDL_Palette +{ + int ncolors; + SDL_Color *colors; + Uint32 version; + int refcount; +} SDL_Palette; + +/** + * \note Everything in the pixel format structure is read-only. + */ +typedef struct SDL_PixelFormat +{ + Uint32 format; + SDL_Palette *palette; + Uint8 BitsPerPixel; + Uint8 BytesPerPixel; + Uint8 padding[2]; + Uint32 Rmask; + Uint32 Gmask; + Uint32 Bmask; + Uint32 Amask; + Uint8 Rloss; + Uint8 Gloss; + Uint8 Bloss; + Uint8 Aloss; + Uint8 Rshift; + Uint8 Gshift; + Uint8 Bshift; + Uint8 Ashift; + int refcount; + struct SDL_PixelFormat *next; +} SDL_PixelFormat; + +/** + * \brief Get the human readable name of a pixel format + */ +extern DECLSPEC const char* SDLCALL SDL_GetPixelFormatName(Uint32 format); + +/** + * \brief Convert one of the enumerated pixel formats to a bpp and RGBA masks. + * + * \return SDL_TRUE, or SDL_FALSE if the conversion wasn't possible. + * + * \sa SDL_MasksToPixelFormatEnum() + */ +extern DECLSPEC SDL_bool SDLCALL SDL_PixelFormatEnumToMasks(Uint32 format, + int *bpp, + Uint32 * Rmask, + Uint32 * Gmask, + Uint32 * Bmask, + Uint32 * Amask); + +/** + * \brief Convert a bpp and RGBA masks to an enumerated pixel format. + * + * \return The pixel format, or ::SDL_PIXELFORMAT_UNKNOWN if the conversion + * wasn't possible. + * + * \sa SDL_PixelFormatEnumToMasks() + */ +extern DECLSPEC Uint32 SDLCALL SDL_MasksToPixelFormatEnum(int bpp, + Uint32 Rmask, + Uint32 Gmask, + Uint32 Bmask, + Uint32 Amask); + +/** + * \brief Create an SDL_PixelFormat structure from a pixel format enum. + */ +extern DECLSPEC SDL_PixelFormat * SDLCALL SDL_AllocFormat(Uint32 pixel_format); + +/** + * \brief Free an SDL_PixelFormat structure. + */ +extern DECLSPEC void SDLCALL SDL_FreeFormat(SDL_PixelFormat *format); + +/** + * \brief Create a palette structure with the specified number of color + * entries. + * + * \return A new palette, or NULL if there wasn't enough memory. + * + * \note The palette entries are initialized to white. + * + * \sa SDL_FreePalette() + */ +extern DECLSPEC SDL_Palette *SDLCALL SDL_AllocPalette(int ncolors); + +/** + * \brief Set the palette for a pixel format structure. + */ +extern DECLSPEC int SDLCALL SDL_SetPixelFormatPalette(SDL_PixelFormat * format, + SDL_Palette *palette); + +/** + * \brief Set a range of colors in a palette. + * + * \param palette The palette to modify. + * \param colors An array of colors to copy into the palette. + * \param firstcolor The index of the first palette entry to modify. + * \param ncolors The number of entries to modify. + * + * \return 0 on success, or -1 if not all of the colors could be set. + */ +extern DECLSPEC int SDLCALL SDL_SetPaletteColors(SDL_Palette * palette, + const SDL_Color * colors, + int firstcolor, int ncolors); + +/** + * \brief Free a palette created with SDL_AllocPalette(). + * + * \sa SDL_AllocPalette() + */ +extern DECLSPEC void SDLCALL SDL_FreePalette(SDL_Palette * palette); + +/** + * \brief Maps an RGB triple to an opaque pixel value for a given pixel format. + * + * \sa SDL_MapRGBA + */ +extern DECLSPEC Uint32 SDLCALL SDL_MapRGB(const SDL_PixelFormat * format, + Uint8 r, Uint8 g, Uint8 b); + +/** + * \brief Maps an RGBA quadruple to a pixel value for a given pixel format. + * + * \sa SDL_MapRGB + */ +extern DECLSPEC Uint32 SDLCALL SDL_MapRGBA(const SDL_PixelFormat * format, + Uint8 r, Uint8 g, Uint8 b, + Uint8 a); + +/** + * \brief Get the RGB components from a pixel of the specified format. + * + * \sa SDL_GetRGBA + */ +extern DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, + const SDL_PixelFormat * format, + Uint8 * r, Uint8 * g, Uint8 * b); + +/** + * \brief Get the RGBA components from a pixel of the specified format. + * + * \sa SDL_GetRGB + */ +extern DECLSPEC void SDLCALL SDL_GetRGBA(Uint32 pixel, + const SDL_PixelFormat * format, + Uint8 * r, Uint8 * g, Uint8 * b, + Uint8 * a); + +/** + * \brief Calculate a 256 entry gamma ramp for a gamma value. + */ +extern DECLSPEC void SDLCALL SDL_CalculateGammaRamp(float gamma, Uint16 * ramp); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_pixels_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_platform.h b/lib/SDL2/include/SDL_platform.h new file mode 100644 index 0000000000..c43f4b54a0 --- /dev/null +++ b/lib/SDL2/include/SDL_platform.h @@ -0,0 +1,164 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_platform.h + * + * Try to get a standard set of platform defines. + */ + +#ifndef _SDL_platform_h +#define _SDL_platform_h + +#if defined(_AIX) +#undef __AIX__ +#define __AIX__ 1 +#endif +#if defined(__HAIKU__) +#undef __HAIKU__ +#define __HAIKU__ 1 +#endif +#if defined(bsdi) || defined(__bsdi) || defined(__bsdi__) +#undef __BSDI__ +#define __BSDI__ 1 +#endif +#if defined(_arch_dreamcast) +#undef __DREAMCAST__ +#define __DREAMCAST__ 1 +#endif +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) +#undef __FREEBSD__ +#define __FREEBSD__ 1 +#endif +#if defined(hpux) || defined(__hpux) || defined(__hpux__) +#undef __HPUX__ +#define __HPUX__ 1 +#endif +#if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE) +#undef __IRIX__ +#define __IRIX__ 1 +#endif +#if defined(linux) || defined(__linux) || defined(__linux__) +#undef __LINUX__ +#define __LINUX__ 1 +#endif +#if defined(ANDROID) || defined(__ANDROID__) +#undef __ANDROID__ +#undef __LINUX__ /* do we need to do this? */ +#define __ANDROID__ 1 +#endif + +#if defined(__APPLE__) +/* lets us know what version of Mac OS X we're compiling on */ +#include "AvailabilityMacros.h" +#include "TargetConditionals.h" +#if TARGET_OS_IPHONE +/* if compiling for iPhone */ +#undef __IPHONEOS__ +#define __IPHONEOS__ 1 +#undef __MACOSX__ +#else +/* if not compiling for iPhone */ +#undef __MACOSX__ +#define __MACOSX__ 1 +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1050 +# error SDL for Mac OS X only supports deploying on 10.5 and above. +#endif /* MAC_OS_X_VERSION_MIN_REQUIRED < 1050 */ +#endif /* TARGET_OS_IPHONE */ +#endif /* defined(__APPLE__) */ + +#if defined(__NetBSD__) +#undef __NETBSD__ +#define __NETBSD__ 1 +#endif +#if defined(__OpenBSD__) +#undef __OPENBSD__ +#define __OPENBSD__ 1 +#endif +#if defined(__OS2__) +#undef __OS2__ +#define __OS2__ 1 +#endif +#if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE) +#undef __OSF__ +#define __OSF__ 1 +#endif +#if defined(__QNXNTO__) +#undef __QNXNTO__ +#define __QNXNTO__ 1 +#endif +#if defined(riscos) || defined(__riscos) || defined(__riscos__) +#undef __RISCOS__ +#define __RISCOS__ 1 +#endif +#if defined(__SVR4) +#undef __SOLARIS__ +#define __SOLARIS__ 1 +#endif + +#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) +/* Try to find out if we're compiling for WinRT or non-WinRT */ +/* If _USING_V110_SDK71_ is defined it means we are using the v110_xp or v120_xp toolset. */ +#if defined(__MINGW32__) || (defined(_MSC_VER) && (_MSC_VER >= 1700) && !_USING_V110_SDK71_) /* _MSC_VER==1700 for MSVC 2012 */ +#include +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) +#undef __WINDOWS__ +#define __WINDOWS__ 1 +/* See if we're compiling for WinRT: */ +#elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) +#undef __WINRT__ +#define __WINRT__ 1 +#endif +#else +#undef __WINDOWS__ +#define __WINDOWS__ 1 +#endif /* _MSC_VER < 1700 */ +#endif /* defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) */ + +#if defined(__WINDOWS__) +#undef __WIN32__ +#define __WIN32__ 1 +#endif +#if defined(__PSP__) +#undef __PSP__ +#define __PSP__ 1 +#endif + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Gets the name of the platform. + */ +extern DECLSPEC const char * SDLCALL SDL_GetPlatform (void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_platform_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_power.h b/lib/SDL2/include/SDL_power.h new file mode 100644 index 0000000000..cf71c98249 --- /dev/null +++ b/lib/SDL2/include/SDL_power.h @@ -0,0 +1,75 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_power_h +#define _SDL_power_h + +/** + * \file SDL_power.h + * + * Header for the SDL power management routines. + */ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief The basic state for the system's power supply. + */ +typedef enum +{ + SDL_POWERSTATE_UNKNOWN, /**< cannot determine power status */ + SDL_POWERSTATE_ON_BATTERY, /**< Not plugged in, running on the battery */ + SDL_POWERSTATE_NO_BATTERY, /**< Plugged in, no battery available */ + SDL_POWERSTATE_CHARGING, /**< Plugged in, charging battery */ + SDL_POWERSTATE_CHARGED /**< Plugged in, battery charged */ +} SDL_PowerState; + + +/** + * \brief Get the current power supply details. + * + * \param secs Seconds of battery life left. You can pass a NULL here if + * you don't care. Will return -1 if we can't determine a + * value, or we're not running on a battery. + * + * \param pct Percentage of battery life left, between 0 and 100. You can + * pass a NULL here if you don't care. Will return -1 if we + * can't determine a value, or we're not running on a battery. + * + * \return The state of the battery (if any). + */ +extern DECLSPEC SDL_PowerState SDLCALL SDL_GetPowerInfo(int *secs, int *pct); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_power_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_quit.h b/lib/SDL2/include/SDL_quit.h new file mode 100644 index 0000000000..8a786445d1 --- /dev/null +++ b/lib/SDL2/include/SDL_quit.h @@ -0,0 +1,58 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_quit.h + * + * Include file for SDL quit event handling. + */ + +#ifndef _SDL_quit_h +#define _SDL_quit_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +/** + * \file SDL_quit.h + * + * An ::SDL_QUIT event is generated when the user tries to close the application + * window. If it is ignored or filtered out, the window will remain open. + * If it is not ignored or filtered, it is queued normally and the window + * is allowed to close. When the window is closed, screen updates will + * complete, but have no effect. + * + * SDL_Init() installs signal handlers for SIGINT (keyboard interrupt) + * and SIGTERM (system termination request), if handlers do not already + * exist, that generate ::SDL_QUIT events as well. There is no way + * to determine the cause of an ::SDL_QUIT event, but setting a signal + * handler in your application will override the default generation of + * quit events for that signal. + * + * \sa SDL_Quit() + */ + +/* There are no functions directly affecting the quit event */ + +#define SDL_QuitRequested() \ + (SDL_PumpEvents(), (SDL_PeepEvents(NULL,0,SDL_PEEKEVENT,SDL_QUIT,SDL_QUIT) > 0)) + +#endif /* _SDL_quit_h */ diff --git a/lib/SDL2/include/SDL_rect.h b/lib/SDL2/include/SDL_rect.h new file mode 100644 index 0000000000..0a95a33449 --- /dev/null +++ b/lib/SDL2/include/SDL_rect.h @@ -0,0 +1,138 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_rect.h + * + * Header file for SDL_rect definition and management functions. + */ + +#ifndef _SDL_rect_h +#define _SDL_rect_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_pixels.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief The structure that defines a point + * + * \sa SDL_EnclosePoints + */ +typedef struct SDL_Point +{ + int x; + int y; +} SDL_Point; + +/** + * \brief A rectangle, with the origin at the upper left. + * + * \sa SDL_RectEmpty + * \sa SDL_RectEquals + * \sa SDL_HasIntersection + * \sa SDL_IntersectRect + * \sa SDL_UnionRect + * \sa SDL_EnclosePoints + */ +typedef struct SDL_Rect +{ + int x, y; + int w, h; +} SDL_Rect; + +/** + * \brief Returns true if the rectangle has no area. + */ +SDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r) +{ + return ((!r) || (r->w <= 0) || (r->h <= 0)) ? SDL_TRUE : SDL_FALSE; +} + +/** + * \brief Returns true if the two rectangles are equal. + */ +SDL_FORCE_INLINE SDL_bool SDL_RectEquals(const SDL_Rect *a, const SDL_Rect *b) +{ + return (a && b && (a->x == b->x) && (a->y == b->y) && + (a->w == b->w) && (a->h == b->h)) ? SDL_TRUE : SDL_FALSE; +} + +/** + * \brief Determine whether two rectangles intersect. + * + * \return SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasIntersection(const SDL_Rect * A, + const SDL_Rect * B); + +/** + * \brief Calculate the intersection of two rectangles. + * + * \return SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IntersectRect(const SDL_Rect * A, + const SDL_Rect * B, + SDL_Rect * result); + +/** + * \brief Calculate the union of two rectangles. + */ +extern DECLSPEC void SDLCALL SDL_UnionRect(const SDL_Rect * A, + const SDL_Rect * B, + SDL_Rect * result); + +/** + * \brief Calculate a minimal rectangle enclosing a set of points + * + * \return SDL_TRUE if any points were within the clipping rect + */ +extern DECLSPEC SDL_bool SDLCALL SDL_EnclosePoints(const SDL_Point * points, + int count, + const SDL_Rect * clip, + SDL_Rect * result); + +/** + * \brief Calculate the intersection of a rectangle and line segment. + * + * \return SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IntersectRectAndLine(const SDL_Rect * + rect, int *X1, + int *Y1, int *X2, + int *Y2); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_rect_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_render.h b/lib/SDL2/include/SDL_render.h new file mode 100644 index 0000000000..77f706a9b2 --- /dev/null +++ b/lib/SDL2/include/SDL_render.h @@ -0,0 +1,870 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_render.h + * + * Header file for SDL 2D rendering functions. + * + * This API supports the following features: + * * single pixel points + * * single pixel lines + * * filled rectangles + * * texture images + * + * The primitives may be drawn in opaque, blended, or additive modes. + * + * The texture images may be drawn in opaque, blended, or additive modes. + * They can have an additional color tint or alpha modulation applied to + * them, and may also be stretched with linear interpolation. + * + * This API is designed to accelerate simple 2D operations. You may + * want more functionality such as polygons and particle effects and + * in that case you should use SDL's OpenGL/Direct3D support or one + * of the many good 3D engines. + * + * These functions must be called from the main thread. + * See this bug for details: http://bugzilla.libsdl.org/show_bug.cgi?id=1995 + */ + +#ifndef _SDL_render_h +#define _SDL_render_h + +#include "SDL_stdinc.h" +#include "SDL_rect.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Flags used when creating a rendering context + */ +typedef enum +{ + SDL_RENDERER_SOFTWARE = 0x00000001, /**< The renderer is a software fallback */ + SDL_RENDERER_ACCELERATED = 0x00000002, /**< The renderer uses hardware + acceleration */ + SDL_RENDERER_PRESENTVSYNC = 0x00000004, /**< Present is synchronized + with the refresh rate */ + SDL_RENDERER_TARGETTEXTURE = 0x00000008 /**< The renderer supports + rendering to texture */ +} SDL_RendererFlags; + +/** + * \brief Information on the capabilities of a render driver or context. + */ +typedef struct SDL_RendererInfo +{ + const char *name; /**< The name of the renderer */ + Uint32 flags; /**< Supported ::SDL_RendererFlags */ + Uint32 num_texture_formats; /**< The number of available texture formats */ + Uint32 texture_formats[16]; /**< The available texture formats */ + int max_texture_width; /**< The maximimum texture width */ + int max_texture_height; /**< The maximimum texture height */ +} SDL_RendererInfo; + +/** + * \brief The access pattern allowed for a texture. + */ +typedef enum +{ + SDL_TEXTUREACCESS_STATIC, /**< Changes rarely, not lockable */ + SDL_TEXTUREACCESS_STREAMING, /**< Changes frequently, lockable */ + SDL_TEXTUREACCESS_TARGET /**< Texture can be used as a render target */ +} SDL_TextureAccess; + +/** + * \brief The texture channel modulation used in SDL_RenderCopy(). + */ +typedef enum +{ + SDL_TEXTUREMODULATE_NONE = 0x00000000, /**< No modulation */ + SDL_TEXTUREMODULATE_COLOR = 0x00000001, /**< srcC = srcC * color */ + SDL_TEXTUREMODULATE_ALPHA = 0x00000002 /**< srcA = srcA * alpha */ +} SDL_TextureModulate; + +/** + * \brief Flip constants for SDL_RenderCopyEx + */ +typedef enum +{ + SDL_FLIP_NONE = 0x00000000, /**< Do not flip */ + SDL_FLIP_HORIZONTAL = 0x00000001, /**< flip horizontally */ + SDL_FLIP_VERTICAL = 0x00000002 /**< flip vertically */ +} SDL_RendererFlip; + +/** + * \brief A structure representing rendering state + */ +struct SDL_Renderer; +typedef struct SDL_Renderer SDL_Renderer; + +/** + * \brief An efficient driver-specific representation of pixel data + */ +struct SDL_Texture; +typedef struct SDL_Texture SDL_Texture; + + +/* Function prototypes */ + +/** + * \brief Get the number of 2D rendering drivers available for the current + * display. + * + * A render driver is a set of code that handles rendering and texture + * management on a particular display. Normally there is only one, but + * some drivers may have several available with different capabilities. + * + * \sa SDL_GetRenderDriverInfo() + * \sa SDL_CreateRenderer() + */ +extern DECLSPEC int SDLCALL SDL_GetNumRenderDrivers(void); + +/** + * \brief Get information about a specific 2D rendering driver for the current + * display. + * + * \param index The index of the driver to query information about. + * \param info A pointer to an SDL_RendererInfo struct to be filled with + * information on the rendering driver. + * + * \return 0 on success, -1 if the index was out of range. + * + * \sa SDL_CreateRenderer() + */ +extern DECLSPEC int SDLCALL SDL_GetRenderDriverInfo(int index, + SDL_RendererInfo * info); + +/** + * \brief Create a window and default renderer + * + * \param width The width of the window + * \param height The height of the window + * \param window_flags The flags used to create the window + * \param window A pointer filled with the window, or NULL on error + * \param renderer A pointer filled with the renderer, or NULL on error + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CreateWindowAndRenderer( + int width, int height, Uint32 window_flags, + SDL_Window **window, SDL_Renderer **renderer); + + +/** + * \brief Create a 2D rendering context for a window. + * + * \param window The window where rendering is displayed. + * \param index The index of the rendering driver to initialize, or -1 to + * initialize the first one supporting the requested flags. + * \param flags ::SDL_RendererFlags. + * + * \return A valid rendering context or NULL if there was an error. + * + * \sa SDL_CreateSoftwareRenderer() + * \sa SDL_GetRendererInfo() + * \sa SDL_DestroyRenderer() + */ +extern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRenderer(SDL_Window * window, + int index, Uint32 flags); + +/** + * \brief Create a 2D software rendering context for a surface. + * + * \param surface The surface where rendering is done. + * + * \return A valid rendering context or NULL if there was an error. + * + * \sa SDL_CreateRenderer() + * \sa SDL_DestroyRenderer() + */ +extern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateSoftwareRenderer(SDL_Surface * surface); + +/** + * \brief Get the renderer associated with a window. + */ +extern DECLSPEC SDL_Renderer * SDLCALL SDL_GetRenderer(SDL_Window * window); + +/** + * \brief Get information about a rendering context. + */ +extern DECLSPEC int SDLCALL SDL_GetRendererInfo(SDL_Renderer * renderer, + SDL_RendererInfo * info); + +/** + * \brief Get the output size of a rendering context. + */ +extern DECLSPEC int SDLCALL SDL_GetRendererOutputSize(SDL_Renderer * renderer, + int *w, int *h); + +/** + * \brief Create a texture for a rendering context. + * + * \param renderer The renderer. + * \param format The format of the texture. + * \param access One of the enumerated values in ::SDL_TextureAccess. + * \param w The width of the texture in pixels. + * \param h The height of the texture in pixels. + * + * \return The created texture is returned, or 0 if no rendering context was + * active, the format was unsupported, or the width or height were out + * of range. + * + * \sa SDL_QueryTexture() + * \sa SDL_UpdateTexture() + * \sa SDL_DestroyTexture() + */ +extern DECLSPEC SDL_Texture * SDLCALL SDL_CreateTexture(SDL_Renderer * renderer, + Uint32 format, + int access, int w, + int h); + +/** + * \brief Create a texture from an existing surface. + * + * \param renderer The renderer. + * \param surface The surface containing pixel data used to fill the texture. + * + * \return The created texture is returned, or 0 on error. + * + * \note The surface is not modified or freed by this function. + * + * \sa SDL_QueryTexture() + * \sa SDL_DestroyTexture() + */ +extern DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureFromSurface(SDL_Renderer * renderer, SDL_Surface * surface); + +/** + * \brief Query the attributes of a texture + * + * \param texture A texture to be queried. + * \param format A pointer filled in with the raw format of the texture. The + * actual format may differ, but pixel transfers will use this + * format. + * \param access A pointer filled in with the actual access to the texture. + * \param w A pointer filled in with the width of the texture in pixels. + * \param h A pointer filled in with the height of the texture in pixels. + * + * \return 0 on success, or -1 if the texture is not valid. + */ +extern DECLSPEC int SDLCALL SDL_QueryTexture(SDL_Texture * texture, + Uint32 * format, int *access, + int *w, int *h); + +/** + * \brief Set an additional color value used in render copy operations. + * + * \param texture The texture to update. + * \param r The red color value multiplied into copy operations. + * \param g The green color value multiplied into copy operations. + * \param b The blue color value multiplied into copy operations. + * + * \return 0 on success, or -1 if the texture is not valid or color modulation + * is not supported. + * + * \sa SDL_GetTextureColorMod() + */ +extern DECLSPEC int SDLCALL SDL_SetTextureColorMod(SDL_Texture * texture, + Uint8 r, Uint8 g, Uint8 b); + + +/** + * \brief Get the additional color value used in render copy operations. + * + * \param texture The texture to query. + * \param r A pointer filled in with the current red color value. + * \param g A pointer filled in with the current green color value. + * \param b A pointer filled in with the current blue color value. + * + * \return 0 on success, or -1 if the texture is not valid. + * + * \sa SDL_SetTextureColorMod() + */ +extern DECLSPEC int SDLCALL SDL_GetTextureColorMod(SDL_Texture * texture, + Uint8 * r, Uint8 * g, + Uint8 * b); + +/** + * \brief Set an additional alpha value used in render copy operations. + * + * \param texture The texture to update. + * \param alpha The alpha value multiplied into copy operations. + * + * \return 0 on success, or -1 if the texture is not valid or alpha modulation + * is not supported. + * + * \sa SDL_GetTextureAlphaMod() + */ +extern DECLSPEC int SDLCALL SDL_SetTextureAlphaMod(SDL_Texture * texture, + Uint8 alpha); + +/** + * \brief Get the additional alpha value used in render copy operations. + * + * \param texture The texture to query. + * \param alpha A pointer filled in with the current alpha value. + * + * \return 0 on success, or -1 if the texture is not valid. + * + * \sa SDL_SetTextureAlphaMod() + */ +extern DECLSPEC int SDLCALL SDL_GetTextureAlphaMod(SDL_Texture * texture, + Uint8 * alpha); + +/** + * \brief Set the blend mode used for texture copy operations. + * + * \param texture The texture to update. + * \param blendMode ::SDL_BlendMode to use for texture blending. + * + * \return 0 on success, or -1 if the texture is not valid or the blend mode is + * not supported. + * + * \note If the blend mode is not supported, the closest supported mode is + * chosen. + * + * \sa SDL_GetTextureBlendMode() + */ +extern DECLSPEC int SDLCALL SDL_SetTextureBlendMode(SDL_Texture * texture, + SDL_BlendMode blendMode); + +/** + * \brief Get the blend mode used for texture copy operations. + * + * \param texture The texture to query. + * \param blendMode A pointer filled in with the current blend mode. + * + * \return 0 on success, or -1 if the texture is not valid. + * + * \sa SDL_SetTextureBlendMode() + */ +extern DECLSPEC int SDLCALL SDL_GetTextureBlendMode(SDL_Texture * texture, + SDL_BlendMode *blendMode); + +/** + * \brief Update the given texture rectangle with new pixel data. + * + * \param texture The texture to update + * \param rect A pointer to the rectangle of pixels to update, or NULL to + * update the entire texture. + * \param pixels The raw pixel data. + * \param pitch The number of bytes between rows of pixel data. + * + * \return 0 on success, or -1 if the texture is not valid. + * + * \note This is a fairly slow function. + */ +extern DECLSPEC int SDLCALL SDL_UpdateTexture(SDL_Texture * texture, + const SDL_Rect * rect, + const void *pixels, int pitch); + +/** + * \brief Update a rectangle within a planar YV12 or IYUV texture with new pixel data. + * + * \param texture The texture to update + * \param rect A pointer to the rectangle of pixels to update, or NULL to + * update the entire texture. + * \param Yplane The raw pixel data for the Y plane. + * \param Ypitch The number of bytes between rows of pixel data for the Y plane. + * \param Uplane The raw pixel data for the U plane. + * \param Upitch The number of bytes between rows of pixel data for the U plane. + * \param Vplane The raw pixel data for the V plane. + * \param Vpitch The number of bytes between rows of pixel data for the V plane. + * + * \return 0 on success, or -1 if the texture is not valid. + * + * \note You can use SDL_UpdateTexture() as long as your pixel data is + * a contiguous block of Y and U/V planes in the proper order, but + * this function is available if your pixel data is not contiguous. + */ +extern DECLSPEC int SDLCALL SDL_UpdateYUVTexture(SDL_Texture * texture, + const SDL_Rect * rect, + const Uint8 *Yplane, int Ypitch, + const Uint8 *Uplane, int Upitch, + const Uint8 *Vplane, int Vpitch); + +/** + * \brief Lock a portion of the texture for write-only pixel access. + * + * \param texture The texture to lock for access, which was created with + * ::SDL_TEXTUREACCESS_STREAMING. + * \param rect A pointer to the rectangle to lock for access. If the rect + * is NULL, the entire texture will be locked. + * \param pixels This is filled in with a pointer to the locked pixels, + * appropriately offset by the locked area. + * \param pitch This is filled in with the pitch of the locked pixels. + * + * \return 0 on success, or -1 if the texture is not valid or was not created with ::SDL_TEXTUREACCESS_STREAMING. + * + * \sa SDL_UnlockTexture() + */ +extern DECLSPEC int SDLCALL SDL_LockTexture(SDL_Texture * texture, + const SDL_Rect * rect, + void **pixels, int *pitch); + +/** + * \brief Unlock a texture, uploading the changes to video memory, if needed. + * + * \sa SDL_LockTexture() + */ +extern DECLSPEC void SDLCALL SDL_UnlockTexture(SDL_Texture * texture); + +/** + * \brief Determines whether a window supports the use of render targets + * + * \param renderer The renderer that will be checked + * + * \return SDL_TRUE if supported, SDL_FALSE if not. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_RenderTargetSupported(SDL_Renderer *renderer); + +/** + * \brief Set a texture as the current rendering target. + * + * \param renderer The renderer. + * \param texture The targeted texture, which must be created with the SDL_TEXTUREACCESS_TARGET flag, or NULL for the default render target + * + * \return 0 on success, or -1 on error + * + * \sa SDL_GetRenderTarget() + */ +extern DECLSPEC int SDLCALL SDL_SetRenderTarget(SDL_Renderer *renderer, + SDL_Texture *texture); + +/** + * \brief Get the current render target or NULL for the default render target. + * + * \return The current render target + * + * \sa SDL_SetRenderTarget() + */ +extern DECLSPEC SDL_Texture * SDLCALL SDL_GetRenderTarget(SDL_Renderer *renderer); + +/** + * \brief Set device independent resolution for rendering + * + * \param renderer The renderer for which resolution should be set. + * \param w The width of the logical resolution + * \param h The height of the logical resolution + * + * This function uses the viewport and scaling functionality to allow a fixed logical + * resolution for rendering, regardless of the actual output resolution. If the actual + * output resolution doesn't have the same aspect ratio the output rendering will be + * centered within the output display. + * + * If the output display is a window, mouse events in the window will be filtered + * and scaled so they seem to arrive within the logical resolution. + * + * \note If this function results in scaling or subpixel drawing by the + * rendering backend, it will be handled using the appropriate + * quality hints. + * + * \sa SDL_RenderGetLogicalSize() + * \sa SDL_RenderSetScale() + * \sa SDL_RenderSetViewport() + */ +extern DECLSPEC int SDLCALL SDL_RenderSetLogicalSize(SDL_Renderer * renderer, int w, int h); + +/** + * \brief Get device independent resolution for rendering + * + * \param renderer The renderer from which resolution should be queried. + * \param w A pointer filled with the width of the logical resolution + * \param h A pointer filled with the height of the logical resolution + * + * \sa SDL_RenderSetLogicalSize() + */ +extern DECLSPEC void SDLCALL SDL_RenderGetLogicalSize(SDL_Renderer * renderer, int *w, int *h); + +/** + * \brief Set the drawing area for rendering on the current target. + * + * \param renderer The renderer for which the drawing area should be set. + * \param rect The rectangle representing the drawing area, or NULL to set the viewport to the entire target. + * + * The x,y of the viewport rect represents the origin for rendering. + * + * \return 0 on success, or -1 on error + * + * \note If the window associated with the renderer is resized, the viewport is automatically reset. + * + * \sa SDL_RenderGetViewport() + * \sa SDL_RenderSetLogicalSize() + */ +extern DECLSPEC int SDLCALL SDL_RenderSetViewport(SDL_Renderer * renderer, + const SDL_Rect * rect); + +/** + * \brief Get the drawing area for the current target. + * + * \sa SDL_RenderSetViewport() + */ +extern DECLSPEC void SDLCALL SDL_RenderGetViewport(SDL_Renderer * renderer, + SDL_Rect * rect); + +/** + * \brief Set the clip rectangle for the current target. + * + * \param renderer The renderer for which clip rectangle should be set. + * \param rect A pointer to the rectangle to set as the clip rectangle, or + * NULL to disable clipping. + * + * \return 0 on success, or -1 on error + * + * \sa SDL_RenderGetClipRect() + */ +extern DECLSPEC int SDLCALL SDL_RenderSetClipRect(SDL_Renderer * renderer, + const SDL_Rect * rect); + +/** + * \brief Get the clip rectangle for the current target. + * + * \param renderer The renderer from which clip rectangle should be queried. + * \param rect A pointer filled in with the current clip rectangle, or + * an empty rectangle if clipping is disabled. + * + * \sa SDL_RenderSetClipRect() + */ +extern DECLSPEC void SDLCALL SDL_RenderGetClipRect(SDL_Renderer * renderer, + SDL_Rect * rect); + +/** + * \brief Set the drawing scale for rendering on the current target. + * + * \param renderer The renderer for which the drawing scale should be set. + * \param scaleX The horizontal scaling factor + * \param scaleY The vertical scaling factor + * + * The drawing coordinates are scaled by the x/y scaling factors + * before they are used by the renderer. This allows resolution + * independent drawing with a single coordinate system. + * + * \note If this results in scaling or subpixel drawing by the + * rendering backend, it will be handled using the appropriate + * quality hints. For best results use integer scaling factors. + * + * \sa SDL_RenderGetScale() + * \sa SDL_RenderSetLogicalSize() + */ +extern DECLSPEC int SDLCALL SDL_RenderSetScale(SDL_Renderer * renderer, + float scaleX, float scaleY); + +/** + * \brief Get the drawing scale for the current target. + * + * \param renderer The renderer from which drawing scale should be queried. + * \param scaleX A pointer filled in with the horizontal scaling factor + * \param scaleY A pointer filled in with the vertical scaling factor + * + * \sa SDL_RenderSetScale() + */ +extern DECLSPEC void SDLCALL SDL_RenderGetScale(SDL_Renderer * renderer, + float *scaleX, float *scaleY); + +/** + * \brief Set the color used for drawing operations (Rect, Line and Clear). + * + * \param renderer The renderer for which drawing color should be set. + * \param r The red value used to draw on the rendering target. + * \param g The green value used to draw on the rendering target. + * \param b The blue value used to draw on the rendering target. + * \param a The alpha value used to draw on the rendering target, usually + * ::SDL_ALPHA_OPAQUE (255). + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_SetRenderDrawColor(SDL_Renderer * renderer, + Uint8 r, Uint8 g, Uint8 b, + Uint8 a); + +/** + * \brief Get the color used for drawing operations (Rect, Line and Clear). + * + * \param renderer The renderer from which drawing color should be queried. + * \param r A pointer to the red value used to draw on the rendering target. + * \param g A pointer to the green value used to draw on the rendering target. + * \param b A pointer to the blue value used to draw on the rendering target. + * \param a A pointer to the alpha value used to draw on the rendering target, + * usually ::SDL_ALPHA_OPAQUE (255). + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_GetRenderDrawColor(SDL_Renderer * renderer, + Uint8 * r, Uint8 * g, Uint8 * b, + Uint8 * a); + +/** + * \brief Set the blend mode used for drawing operations (Fill and Line). + * + * \param renderer The renderer for which blend mode should be set. + * \param blendMode ::SDL_BlendMode to use for blending. + * + * \return 0 on success, or -1 on error + * + * \note If the blend mode is not supported, the closest supported mode is + * chosen. + * + * \sa SDL_GetRenderDrawBlendMode() + */ +extern DECLSPEC int SDLCALL SDL_SetRenderDrawBlendMode(SDL_Renderer * renderer, + SDL_BlendMode blendMode); + +/** + * \brief Get the blend mode used for drawing operations. + * + * \param renderer The renderer from which blend mode should be queried. + * \param blendMode A pointer filled in with the current blend mode. + * + * \return 0 on success, or -1 on error + * + * \sa SDL_SetRenderDrawBlendMode() + */ +extern DECLSPEC int SDLCALL SDL_GetRenderDrawBlendMode(SDL_Renderer * renderer, + SDL_BlendMode *blendMode); + +/** + * \brief Clear the current rendering target with the drawing color + * + * This function clears the entire rendering target, ignoring the viewport. + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderClear(SDL_Renderer * renderer); + +/** + * \brief Draw a point on the current rendering target. + * + * \param renderer The renderer which should draw a point. + * \param x The x coordinate of the point. + * \param y The y coordinate of the point. + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawPoint(SDL_Renderer * renderer, + int x, int y); + +/** + * \brief Draw multiple points on the current rendering target. + * + * \param renderer The renderer which should draw multiple points. + * \param points The points to draw + * \param count The number of points to draw + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawPoints(SDL_Renderer * renderer, + const SDL_Point * points, + int count); + +/** + * \brief Draw a line on the current rendering target. + * + * \param renderer The renderer which should draw a line. + * \param x1 The x coordinate of the start point. + * \param y1 The y coordinate of the start point. + * \param x2 The x coordinate of the end point. + * \param y2 The y coordinate of the end point. + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawLine(SDL_Renderer * renderer, + int x1, int y1, int x2, int y2); + +/** + * \brief Draw a series of connected lines on the current rendering target. + * + * \param renderer The renderer which should draw multiple lines. + * \param points The points along the lines + * \param count The number of points, drawing count-1 lines + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawLines(SDL_Renderer * renderer, + const SDL_Point * points, + int count); + +/** + * \brief Draw a rectangle on the current rendering target. + * + * \param renderer The renderer which should draw a rectangle. + * \param rect A pointer to the destination rectangle, or NULL to outline the entire rendering target. + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawRect(SDL_Renderer * renderer, + const SDL_Rect * rect); + +/** + * \brief Draw some number of rectangles on the current rendering target. + * + * \param renderer The renderer which should draw multiple rectangles. + * \param rects A pointer to an array of destination rectangles. + * \param count The number of rectangles. + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawRects(SDL_Renderer * renderer, + const SDL_Rect * rects, + int count); + +/** + * \brief Fill a rectangle on the current rendering target with the drawing color. + * + * \param renderer The renderer which should fill a rectangle. + * \param rect A pointer to the destination rectangle, or NULL for the entire + * rendering target. + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderFillRect(SDL_Renderer * renderer, + const SDL_Rect * rect); + +/** + * \brief Fill some number of rectangles on the current rendering target with the drawing color. + * + * \param renderer The renderer which should fill multiple rectangles. + * \param rects A pointer to an array of destination rectangles. + * \param count The number of rectangles. + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderFillRects(SDL_Renderer * renderer, + const SDL_Rect * rects, + int count); + +/** + * \brief Copy a portion of the texture to the current rendering target. + * + * \param renderer The renderer which should copy parts of a texture. + * \param texture The source texture. + * \param srcrect A pointer to the source rectangle, or NULL for the entire + * texture. + * \param dstrect A pointer to the destination rectangle, or NULL for the + * entire rendering target. + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderCopy(SDL_Renderer * renderer, + SDL_Texture * texture, + const SDL_Rect * srcrect, + const SDL_Rect * dstrect); + +/** + * \brief Copy a portion of the source texture to the current rendering target, rotating it by angle around the given center + * + * \param renderer The renderer which should copy parts of a texture. + * \param texture The source texture. + * \param srcrect A pointer to the source rectangle, or NULL for the entire + * texture. + * \param dstrect A pointer to the destination rectangle, or NULL for the + * entire rendering target. + * \param angle An angle in degrees that indicates the rotation that will be applied to dstrect + * \param center A pointer to a point indicating the point around which dstrect will be rotated (if NULL, rotation will be done aroud dstrect.w/2, dstrect.h/2) + * \param flip An SDL_RendererFlip value stating which flipping actions should be performed on the texture + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderCopyEx(SDL_Renderer * renderer, + SDL_Texture * texture, + const SDL_Rect * srcrect, + const SDL_Rect * dstrect, + const double angle, + const SDL_Point *center, + const SDL_RendererFlip flip); + +/** + * \brief Read pixels from the current rendering target. + * + * \param renderer The renderer from which pixels should be read. + * \param rect A pointer to the rectangle to read, or NULL for the entire + * render target. + * \param format The desired format of the pixel data, or 0 to use the format + * of the rendering target + * \param pixels A pointer to be filled in with the pixel data + * \param pitch The pitch of the pixels parameter. + * + * \return 0 on success, or -1 if pixel reading is not supported. + * + * \warning This is a very slow operation, and should not be used frequently. + */ +extern DECLSPEC int SDLCALL SDL_RenderReadPixels(SDL_Renderer * renderer, + const SDL_Rect * rect, + Uint32 format, + void *pixels, int pitch); + +/** + * \brief Update the screen with rendering performed. + */ +extern DECLSPEC void SDLCALL SDL_RenderPresent(SDL_Renderer * renderer); + +/** + * \brief Destroy the specified texture. + * + * \sa SDL_CreateTexture() + * \sa SDL_CreateTextureFromSurface() + */ +extern DECLSPEC void SDLCALL SDL_DestroyTexture(SDL_Texture * texture); + +/** + * \brief Destroy the rendering context for a window and free associated + * textures. + * + * \sa SDL_CreateRenderer() + */ +extern DECLSPEC void SDLCALL SDL_DestroyRenderer(SDL_Renderer * renderer); + + +/** + * \brief Bind the texture to the current OpenGL/ES/ES2 context for use with + * OpenGL instructions. + * + * \param texture The SDL texture to bind + * \param texw A pointer to a float that will be filled with the texture width + * \param texh A pointer to a float that will be filled with the texture height + * + * \return 0 on success, or -1 if the operation is not supported + */ +extern DECLSPEC int SDLCALL SDL_GL_BindTexture(SDL_Texture *texture, float *texw, float *texh); + +/** + * \brief Unbind a texture from the current OpenGL/ES/ES2 context. + * + * \param texture The SDL texture to unbind + * + * \return 0 on success, or -1 if the operation is not supported + */ +extern DECLSPEC int SDLCALL SDL_GL_UnbindTexture(SDL_Texture *texture); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_render_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_revision.h b/lib/SDL2/include/SDL_revision.h new file mode 100644 index 0000000000..a75dc33097 --- /dev/null +++ b/lib/SDL2/include/SDL_revision.h @@ -0,0 +1,2 @@ +#define SDL_REVISION "hg-8628:b558f99d48f0" +#define SDL_REVISION_NUMBER 8628 diff --git a/lib/SDL2/include/SDL_rwops.h b/lib/SDL2/include/SDL_rwops.h new file mode 100644 index 0000000000..4bdd7876a3 --- /dev/null +++ b/lib/SDL2/include/SDL_rwops.h @@ -0,0 +1,232 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_rwops.h + * + * This file provides a general interface for SDL to read and write + * data streams. It can easily be extended to files, memory, etc. + */ + +#ifndef _SDL_rwops_h +#define _SDL_rwops_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* RWops Types */ +#define SDL_RWOPS_UNKNOWN 0 /* Unknown stream type */ +#define SDL_RWOPS_WINFILE 1 /* Win32 file */ +#define SDL_RWOPS_STDFILE 2 /* Stdio file */ +#define SDL_RWOPS_JNIFILE 3 /* Android asset */ +#define SDL_RWOPS_MEMORY 4 /* Memory stream */ +#define SDL_RWOPS_MEMORY_RO 5 /* Read-Only memory stream */ + +/** + * This is the read/write operation structure -- very basic. + */ +typedef struct SDL_RWops +{ + /** + * Return the size of the file in this rwops, or -1 if unknown + */ + Sint64 (SDLCALL * size) (struct SDL_RWops * context); + + /** + * Seek to \c offset relative to \c whence, one of stdio's whence values: + * RW_SEEK_SET, RW_SEEK_CUR, RW_SEEK_END + * + * \return the final offset in the data stream, or -1 on error. + */ + Sint64 (SDLCALL * seek) (struct SDL_RWops * context, Sint64 offset, + int whence); + + /** + * Read up to \c maxnum objects each of size \c size from the data + * stream to the area pointed at by \c ptr. + * + * \return the number of objects read, or 0 at error or end of file. + */ + size_t (SDLCALL * read) (struct SDL_RWops * context, void *ptr, + size_t size, size_t maxnum); + + /** + * Write exactly \c num objects each of size \c size from the area + * pointed at by \c ptr to data stream. + * + * \return the number of objects written, or 0 at error or end of file. + */ + size_t (SDLCALL * write) (struct SDL_RWops * context, const void *ptr, + size_t size, size_t num); + + /** + * Close and free an allocated SDL_RWops structure. + * + * \return 0 if successful or -1 on write error when flushing data. + */ + int (SDLCALL * close) (struct SDL_RWops * context); + + Uint32 type; + union + { +#if defined(ANDROID) + struct + { + void *fileNameRef; + void *inputStreamRef; + void *readableByteChannelRef; + void *readMethod; + void *assetFileDescriptorRef; + long position; + long size; + long offset; + int fd; + } androidio; +#elif defined(__WIN32__) + struct + { + SDL_bool append; + void *h; + struct + { + void *data; + size_t size; + size_t left; + } buffer; + } windowsio; +#endif + +#ifdef HAVE_STDIO_H + struct + { + SDL_bool autoclose; + FILE *fp; + } stdio; +#endif + struct + { + Uint8 *base; + Uint8 *here; + Uint8 *stop; + } mem; + struct + { + void *data1; + void *data2; + } unknown; + } hidden; + +} SDL_RWops; + + +/** + * \name RWFrom functions + * + * Functions to create SDL_RWops structures from various data streams. + */ +/* @{ */ + +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFile(const char *file, + const char *mode); + +#ifdef HAVE_STDIO_H +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFP(FILE * fp, + SDL_bool autoclose); +#else +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFP(void * fp, + SDL_bool autoclose); +#endif + +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromMem(void *mem, int size); +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromConstMem(const void *mem, + int size); + +/* @} *//* RWFrom functions */ + + +extern DECLSPEC SDL_RWops *SDLCALL SDL_AllocRW(void); +extern DECLSPEC void SDLCALL SDL_FreeRW(SDL_RWops * area); + +#define RW_SEEK_SET 0 /**< Seek from the beginning of data */ +#define RW_SEEK_CUR 1 /**< Seek relative to current read point */ +#define RW_SEEK_END 2 /**< Seek relative to the end of data */ + +/** + * \name Read/write macros + * + * Macros to easily read and write from an SDL_RWops structure. + */ +/* @{ */ +#define SDL_RWsize(ctx) (ctx)->size(ctx) +#define SDL_RWseek(ctx, offset, whence) (ctx)->seek(ctx, offset, whence) +#define SDL_RWtell(ctx) (ctx)->seek(ctx, 0, RW_SEEK_CUR) +#define SDL_RWread(ctx, ptr, size, n) (ctx)->read(ctx, ptr, size, n) +#define SDL_RWwrite(ctx, ptr, size, n) (ctx)->write(ctx, ptr, size, n) +#define SDL_RWclose(ctx) (ctx)->close(ctx) +/* @} *//* Read/write macros */ + + +/** + * \name Read endian functions + * + * Read an item of the specified endianness and return in native format. + */ +/* @{ */ +extern DECLSPEC Uint8 SDLCALL SDL_ReadU8(SDL_RWops * src); +extern DECLSPEC Uint16 SDLCALL SDL_ReadLE16(SDL_RWops * src); +extern DECLSPEC Uint16 SDLCALL SDL_ReadBE16(SDL_RWops * src); +extern DECLSPEC Uint32 SDLCALL SDL_ReadLE32(SDL_RWops * src); +extern DECLSPEC Uint32 SDLCALL SDL_ReadBE32(SDL_RWops * src); +extern DECLSPEC Uint64 SDLCALL SDL_ReadLE64(SDL_RWops * src); +extern DECLSPEC Uint64 SDLCALL SDL_ReadBE64(SDL_RWops * src); +/* @} *//* Read endian functions */ + +/** + * \name Write endian functions + * + * Write an item of native format to the specified endianness. + */ +/* @{ */ +extern DECLSPEC size_t SDLCALL SDL_WriteU8(SDL_RWops * dst, Uint8 value); +extern DECLSPEC size_t SDLCALL SDL_WriteLE16(SDL_RWops * dst, Uint16 value); +extern DECLSPEC size_t SDLCALL SDL_WriteBE16(SDL_RWops * dst, Uint16 value); +extern DECLSPEC size_t SDLCALL SDL_WriteLE32(SDL_RWops * dst, Uint32 value); +extern DECLSPEC size_t SDLCALL SDL_WriteBE32(SDL_RWops * dst, Uint32 value); +extern DECLSPEC size_t SDLCALL SDL_WriteLE64(SDL_RWops * dst, Uint64 value); +extern DECLSPEC size_t SDLCALL SDL_WriteBE64(SDL_RWops * dst, Uint64 value); +/* @} *//* Write endian functions */ + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_rwops_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_scancode.h b/lib/SDL2/include/SDL_scancode.h new file mode 100644 index 0000000000..4b3be28fb4 --- /dev/null +++ b/lib/SDL2/include/SDL_scancode.h @@ -0,0 +1,401 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_scancode.h + * + * Defines keyboard scancodes. + */ + +#ifndef _SDL_scancode_h +#define _SDL_scancode_h + +#include "SDL_stdinc.h" + +/** + * \brief The SDL keyboard scancode representation. + * + * Values of this type are used to represent keyboard keys, among other places + * in the \link SDL_Keysym::scancode key.keysym.scancode \endlink field of the + * SDL_Event structure. + * + * The values in this enumeration are based on the USB usage page standard: + * http://www.usb.org/developers/devclass_docs/Hut1_12v2.pdf + */ +typedef enum +{ + SDL_SCANCODE_UNKNOWN = 0, + + /** + * \name Usage page 0x07 + * + * These values are from usage page 0x07 (USB keyboard page). + */ + /* @{ */ + + SDL_SCANCODE_A = 4, + SDL_SCANCODE_B = 5, + SDL_SCANCODE_C = 6, + SDL_SCANCODE_D = 7, + SDL_SCANCODE_E = 8, + SDL_SCANCODE_F = 9, + SDL_SCANCODE_G = 10, + SDL_SCANCODE_H = 11, + SDL_SCANCODE_I = 12, + SDL_SCANCODE_J = 13, + SDL_SCANCODE_K = 14, + SDL_SCANCODE_L = 15, + SDL_SCANCODE_M = 16, + SDL_SCANCODE_N = 17, + SDL_SCANCODE_O = 18, + SDL_SCANCODE_P = 19, + SDL_SCANCODE_Q = 20, + SDL_SCANCODE_R = 21, + SDL_SCANCODE_S = 22, + SDL_SCANCODE_T = 23, + SDL_SCANCODE_U = 24, + SDL_SCANCODE_V = 25, + SDL_SCANCODE_W = 26, + SDL_SCANCODE_X = 27, + SDL_SCANCODE_Y = 28, + SDL_SCANCODE_Z = 29, + + SDL_SCANCODE_1 = 30, + SDL_SCANCODE_2 = 31, + SDL_SCANCODE_3 = 32, + SDL_SCANCODE_4 = 33, + SDL_SCANCODE_5 = 34, + SDL_SCANCODE_6 = 35, + SDL_SCANCODE_7 = 36, + SDL_SCANCODE_8 = 37, + SDL_SCANCODE_9 = 38, + SDL_SCANCODE_0 = 39, + + SDL_SCANCODE_RETURN = 40, + SDL_SCANCODE_ESCAPE = 41, + SDL_SCANCODE_BACKSPACE = 42, + SDL_SCANCODE_TAB = 43, + SDL_SCANCODE_SPACE = 44, + + SDL_SCANCODE_MINUS = 45, + SDL_SCANCODE_EQUALS = 46, + SDL_SCANCODE_LEFTBRACKET = 47, + SDL_SCANCODE_RIGHTBRACKET = 48, + SDL_SCANCODE_BACKSLASH = 49, /**< Located at the lower left of the return + * key on ISO keyboards and at the right end + * of the QWERTY row on ANSI keyboards. + * Produces REVERSE SOLIDUS (backslash) and + * VERTICAL LINE in a US layout, REVERSE + * SOLIDUS and VERTICAL LINE in a UK Mac + * layout, NUMBER SIGN and TILDE in a UK + * Windows layout, DOLLAR SIGN and POUND SIGN + * in a Swiss German layout, NUMBER SIGN and + * APOSTROPHE in a German layout, GRAVE + * ACCENT and POUND SIGN in a French Mac + * layout, and ASTERISK and MICRO SIGN in a + * French Windows layout. + */ + SDL_SCANCODE_NONUSHASH = 50, /**< ISO USB keyboards actually use this code + * instead of 49 for the same key, but all + * OSes I've seen treat the two codes + * identically. So, as an implementor, unless + * your keyboard generates both of those + * codes and your OS treats them differently, + * you should generate SDL_SCANCODE_BACKSLASH + * instead of this code. As a user, you + * should not rely on this code because SDL + * will never generate it with most (all?) + * keyboards. + */ + SDL_SCANCODE_SEMICOLON = 51, + SDL_SCANCODE_APOSTROPHE = 52, + SDL_SCANCODE_GRAVE = 53, /**< Located in the top left corner (on both ANSI + * and ISO keyboards). Produces GRAVE ACCENT and + * TILDE in a US Windows layout and in US and UK + * Mac layouts on ANSI keyboards, GRAVE ACCENT + * and NOT SIGN in a UK Windows layout, SECTION + * SIGN and PLUS-MINUS SIGN in US and UK Mac + * layouts on ISO keyboards, SECTION SIGN and + * DEGREE SIGN in a Swiss German layout (Mac: + * only on ISO keyboards), CIRCUMFLEX ACCENT and + * DEGREE SIGN in a German layout (Mac: only on + * ISO keyboards), SUPERSCRIPT TWO and TILDE in a + * French Windows layout, COMMERCIAL AT and + * NUMBER SIGN in a French Mac layout on ISO + * keyboards, and LESS-THAN SIGN and GREATER-THAN + * SIGN in a Swiss German, German, or French Mac + * layout on ANSI keyboards. + */ + SDL_SCANCODE_COMMA = 54, + SDL_SCANCODE_PERIOD = 55, + SDL_SCANCODE_SLASH = 56, + + SDL_SCANCODE_CAPSLOCK = 57, + + SDL_SCANCODE_F1 = 58, + SDL_SCANCODE_F2 = 59, + SDL_SCANCODE_F3 = 60, + SDL_SCANCODE_F4 = 61, + SDL_SCANCODE_F5 = 62, + SDL_SCANCODE_F6 = 63, + SDL_SCANCODE_F7 = 64, + SDL_SCANCODE_F8 = 65, + SDL_SCANCODE_F9 = 66, + SDL_SCANCODE_F10 = 67, + SDL_SCANCODE_F11 = 68, + SDL_SCANCODE_F12 = 69, + + SDL_SCANCODE_PRINTSCREEN = 70, + SDL_SCANCODE_SCROLLLOCK = 71, + SDL_SCANCODE_PAUSE = 72, + SDL_SCANCODE_INSERT = 73, /**< insert on PC, help on some Mac keyboards (but + does send code 73, not 117) */ + SDL_SCANCODE_HOME = 74, + SDL_SCANCODE_PAGEUP = 75, + SDL_SCANCODE_DELETE = 76, + SDL_SCANCODE_END = 77, + SDL_SCANCODE_PAGEDOWN = 78, + SDL_SCANCODE_RIGHT = 79, + SDL_SCANCODE_LEFT = 80, + SDL_SCANCODE_DOWN = 81, + SDL_SCANCODE_UP = 82, + + SDL_SCANCODE_NUMLOCKCLEAR = 83, /**< num lock on PC, clear on Mac keyboards + */ + SDL_SCANCODE_KP_DIVIDE = 84, + SDL_SCANCODE_KP_MULTIPLY = 85, + SDL_SCANCODE_KP_MINUS = 86, + SDL_SCANCODE_KP_PLUS = 87, + SDL_SCANCODE_KP_ENTER = 88, + SDL_SCANCODE_KP_1 = 89, + SDL_SCANCODE_KP_2 = 90, + SDL_SCANCODE_KP_3 = 91, + SDL_SCANCODE_KP_4 = 92, + SDL_SCANCODE_KP_5 = 93, + SDL_SCANCODE_KP_6 = 94, + SDL_SCANCODE_KP_7 = 95, + SDL_SCANCODE_KP_8 = 96, + SDL_SCANCODE_KP_9 = 97, + SDL_SCANCODE_KP_0 = 98, + SDL_SCANCODE_KP_PERIOD = 99, + + SDL_SCANCODE_NONUSBACKSLASH = 100, /**< This is the additional key that ISO + * keyboards have over ANSI ones, + * located between left shift and Y. + * Produces GRAVE ACCENT and TILDE in a + * US or UK Mac layout, REVERSE SOLIDUS + * (backslash) and VERTICAL LINE in a + * US or UK Windows layout, and + * LESS-THAN SIGN and GREATER-THAN SIGN + * in a Swiss German, German, or French + * layout. */ + SDL_SCANCODE_APPLICATION = 101, /**< windows contextual menu, compose */ + SDL_SCANCODE_POWER = 102, /**< The USB document says this is a status flag, + * not a physical key - but some Mac keyboards + * do have a power key. */ + SDL_SCANCODE_KP_EQUALS = 103, + SDL_SCANCODE_F13 = 104, + SDL_SCANCODE_F14 = 105, + SDL_SCANCODE_F15 = 106, + SDL_SCANCODE_F16 = 107, + SDL_SCANCODE_F17 = 108, + SDL_SCANCODE_F18 = 109, + SDL_SCANCODE_F19 = 110, + SDL_SCANCODE_F20 = 111, + SDL_SCANCODE_F21 = 112, + SDL_SCANCODE_F22 = 113, + SDL_SCANCODE_F23 = 114, + SDL_SCANCODE_F24 = 115, + SDL_SCANCODE_EXECUTE = 116, + SDL_SCANCODE_HELP = 117, + SDL_SCANCODE_MENU = 118, + SDL_SCANCODE_SELECT = 119, + SDL_SCANCODE_STOP = 120, + SDL_SCANCODE_AGAIN = 121, /**< redo */ + SDL_SCANCODE_UNDO = 122, + SDL_SCANCODE_CUT = 123, + SDL_SCANCODE_COPY = 124, + SDL_SCANCODE_PASTE = 125, + SDL_SCANCODE_FIND = 126, + SDL_SCANCODE_MUTE = 127, + SDL_SCANCODE_VOLUMEUP = 128, + SDL_SCANCODE_VOLUMEDOWN = 129, +/* not sure whether there's a reason to enable these */ +/* SDL_SCANCODE_LOCKINGCAPSLOCK = 130, */ +/* SDL_SCANCODE_LOCKINGNUMLOCK = 131, */ +/* SDL_SCANCODE_LOCKINGSCROLLLOCK = 132, */ + SDL_SCANCODE_KP_COMMA = 133, + SDL_SCANCODE_KP_EQUALSAS400 = 134, + + SDL_SCANCODE_INTERNATIONAL1 = 135, /**< used on Asian keyboards, see + footnotes in USB doc */ + SDL_SCANCODE_INTERNATIONAL2 = 136, + SDL_SCANCODE_INTERNATIONAL3 = 137, /**< Yen */ + SDL_SCANCODE_INTERNATIONAL4 = 138, + SDL_SCANCODE_INTERNATIONAL5 = 139, + SDL_SCANCODE_INTERNATIONAL6 = 140, + SDL_SCANCODE_INTERNATIONAL7 = 141, + SDL_SCANCODE_INTERNATIONAL8 = 142, + SDL_SCANCODE_INTERNATIONAL9 = 143, + SDL_SCANCODE_LANG1 = 144, /**< Hangul/English toggle */ + SDL_SCANCODE_LANG2 = 145, /**< Hanja conversion */ + SDL_SCANCODE_LANG3 = 146, /**< Katakana */ + SDL_SCANCODE_LANG4 = 147, /**< Hiragana */ + SDL_SCANCODE_LANG5 = 148, /**< Zenkaku/Hankaku */ + SDL_SCANCODE_LANG6 = 149, /**< reserved */ + SDL_SCANCODE_LANG7 = 150, /**< reserved */ + SDL_SCANCODE_LANG8 = 151, /**< reserved */ + SDL_SCANCODE_LANG9 = 152, /**< reserved */ + + SDL_SCANCODE_ALTERASE = 153, /**< Erase-Eaze */ + SDL_SCANCODE_SYSREQ = 154, + SDL_SCANCODE_CANCEL = 155, + SDL_SCANCODE_CLEAR = 156, + SDL_SCANCODE_PRIOR = 157, + SDL_SCANCODE_RETURN2 = 158, + SDL_SCANCODE_SEPARATOR = 159, + SDL_SCANCODE_OUT = 160, + SDL_SCANCODE_OPER = 161, + SDL_SCANCODE_CLEARAGAIN = 162, + SDL_SCANCODE_CRSEL = 163, + SDL_SCANCODE_EXSEL = 164, + + SDL_SCANCODE_KP_00 = 176, + SDL_SCANCODE_KP_000 = 177, + SDL_SCANCODE_THOUSANDSSEPARATOR = 178, + SDL_SCANCODE_DECIMALSEPARATOR = 179, + SDL_SCANCODE_CURRENCYUNIT = 180, + SDL_SCANCODE_CURRENCYSUBUNIT = 181, + SDL_SCANCODE_KP_LEFTPAREN = 182, + SDL_SCANCODE_KP_RIGHTPAREN = 183, + SDL_SCANCODE_KP_LEFTBRACE = 184, + SDL_SCANCODE_KP_RIGHTBRACE = 185, + SDL_SCANCODE_KP_TAB = 186, + SDL_SCANCODE_KP_BACKSPACE = 187, + SDL_SCANCODE_KP_A = 188, + SDL_SCANCODE_KP_B = 189, + SDL_SCANCODE_KP_C = 190, + SDL_SCANCODE_KP_D = 191, + SDL_SCANCODE_KP_E = 192, + SDL_SCANCODE_KP_F = 193, + SDL_SCANCODE_KP_XOR = 194, + SDL_SCANCODE_KP_POWER = 195, + SDL_SCANCODE_KP_PERCENT = 196, + SDL_SCANCODE_KP_LESS = 197, + SDL_SCANCODE_KP_GREATER = 198, + SDL_SCANCODE_KP_AMPERSAND = 199, + SDL_SCANCODE_KP_DBLAMPERSAND = 200, + SDL_SCANCODE_KP_VERTICALBAR = 201, + SDL_SCANCODE_KP_DBLVERTICALBAR = 202, + SDL_SCANCODE_KP_COLON = 203, + SDL_SCANCODE_KP_HASH = 204, + SDL_SCANCODE_KP_SPACE = 205, + SDL_SCANCODE_KP_AT = 206, + SDL_SCANCODE_KP_EXCLAM = 207, + SDL_SCANCODE_KP_MEMSTORE = 208, + SDL_SCANCODE_KP_MEMRECALL = 209, + SDL_SCANCODE_KP_MEMCLEAR = 210, + SDL_SCANCODE_KP_MEMADD = 211, + SDL_SCANCODE_KP_MEMSUBTRACT = 212, + SDL_SCANCODE_KP_MEMMULTIPLY = 213, + SDL_SCANCODE_KP_MEMDIVIDE = 214, + SDL_SCANCODE_KP_PLUSMINUS = 215, + SDL_SCANCODE_KP_CLEAR = 216, + SDL_SCANCODE_KP_CLEARENTRY = 217, + SDL_SCANCODE_KP_BINARY = 218, + SDL_SCANCODE_KP_OCTAL = 219, + SDL_SCANCODE_KP_DECIMAL = 220, + SDL_SCANCODE_KP_HEXADECIMAL = 221, + + SDL_SCANCODE_LCTRL = 224, + SDL_SCANCODE_LSHIFT = 225, + SDL_SCANCODE_LALT = 226, /**< alt, option */ + SDL_SCANCODE_LGUI = 227, /**< windows, command (apple), meta */ + SDL_SCANCODE_RCTRL = 228, + SDL_SCANCODE_RSHIFT = 229, + SDL_SCANCODE_RALT = 230, /**< alt gr, option */ + SDL_SCANCODE_RGUI = 231, /**< windows, command (apple), meta */ + + SDL_SCANCODE_MODE = 257, /**< I'm not sure if this is really not covered + * by any of the above, but since there's a + * special KMOD_MODE for it I'm adding it here + */ + + /* @} *//* Usage page 0x07 */ + + /** + * \name Usage page 0x0C + * + * These values are mapped from usage page 0x0C (USB consumer page). + */ + /* @{ */ + + SDL_SCANCODE_AUDIONEXT = 258, + SDL_SCANCODE_AUDIOPREV = 259, + SDL_SCANCODE_AUDIOSTOP = 260, + SDL_SCANCODE_AUDIOPLAY = 261, + SDL_SCANCODE_AUDIOMUTE = 262, + SDL_SCANCODE_MEDIASELECT = 263, + SDL_SCANCODE_WWW = 264, + SDL_SCANCODE_MAIL = 265, + SDL_SCANCODE_CALCULATOR = 266, + SDL_SCANCODE_COMPUTER = 267, + SDL_SCANCODE_AC_SEARCH = 268, + SDL_SCANCODE_AC_HOME = 269, + SDL_SCANCODE_AC_BACK = 270, + SDL_SCANCODE_AC_FORWARD = 271, + SDL_SCANCODE_AC_STOP = 272, + SDL_SCANCODE_AC_REFRESH = 273, + SDL_SCANCODE_AC_BOOKMARKS = 274, + + /* @} *//* Usage page 0x0C */ + + /** + * \name Walther keys + * + * These are values that Christian Walther added (for mac keyboard?). + */ + /* @{ */ + + SDL_SCANCODE_BRIGHTNESSDOWN = 275, + SDL_SCANCODE_BRIGHTNESSUP = 276, + SDL_SCANCODE_DISPLAYSWITCH = 277, /**< display mirroring/dual display + switch, video mode switch */ + SDL_SCANCODE_KBDILLUMTOGGLE = 278, + SDL_SCANCODE_KBDILLUMDOWN = 279, + SDL_SCANCODE_KBDILLUMUP = 280, + SDL_SCANCODE_EJECT = 281, + SDL_SCANCODE_SLEEP = 282, + + SDL_SCANCODE_APP1 = 283, + SDL_SCANCODE_APP2 = 284, + + /* @} *//* Walther keys */ + + /* Add any other keys here. */ + + SDL_NUM_SCANCODES = 512 /**< not a key, just marks the number of scancodes + for array bounds */ +} SDL_Scancode; + +#endif /* _SDL_scancode_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_shape.h b/lib/SDL2/include/SDL_shape.h new file mode 100644 index 0000000000..53029306e3 --- /dev/null +++ b/lib/SDL2/include/SDL_shape.h @@ -0,0 +1,143 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_shape_h +#define _SDL_shape_h + +#include "SDL_stdinc.h" +#include "SDL_pixels.h" +#include "SDL_rect.h" +#include "SDL_surface.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** \file SDL_shape.h + * + * Header file for the shaped window API. + */ + +#define SDL_NONSHAPEABLE_WINDOW -1 +#define SDL_INVALID_SHAPE_ARGUMENT -2 +#define SDL_WINDOW_LACKS_SHAPE -3 + +/** + * \brief Create a window that can be shaped with the specified position, dimensions, and flags. + * + * \param title The title of the window, in UTF-8 encoding. + * \param x The x position of the window, ::SDL_WINDOWPOS_CENTERED, or + * ::SDL_WINDOWPOS_UNDEFINED. + * \param y The y position of the window, ::SDL_WINDOWPOS_CENTERED, or + * ::SDL_WINDOWPOS_UNDEFINED. + * \param w The width of the window. + * \param h The height of the window. + * \param flags The flags for the window, a mask of SDL_WINDOW_BORDERLESS with any of the following: + * ::SDL_WINDOW_OPENGL, ::SDL_WINDOW_INPUT_GRABBED, + * ::SDL_WINDOW_HIDDEN, ::SDL_WINDOW_RESIZABLE, + * ::SDL_WINDOW_MAXIMIZED, ::SDL_WINDOW_MINIMIZED, + * ::SDL_WINDOW_BORDERLESS is always set, and ::SDL_WINDOW_FULLSCREEN is always unset. + * + * \return The window created, or NULL if window creation failed. + * + * \sa SDL_DestroyWindow() + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags); + +/** + * \brief Return whether the given window is a shaped window. + * + * \param window The window to query for being shaped. + * + * \return SDL_TRUE if the window is a window that can be shaped, SDL_FALSE if the window is unshaped or NULL. + * \sa SDL_CreateShapedWindow + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsShapedWindow(const SDL_Window *window); + +/** \brief An enum denoting the specific type of contents present in an SDL_WindowShapeParams union. */ +typedef enum { + /** \brief The default mode, a binarized alpha cutoff of 1. */ + ShapeModeDefault, + /** \brief A binarized alpha cutoff with a given integer value. */ + ShapeModeBinarizeAlpha, + /** \brief A binarized alpha cutoff with a given integer value, but with the opposite comparison. */ + ShapeModeReverseBinarizeAlpha, + /** \brief A color key is applied. */ + ShapeModeColorKey +} WindowShapeMode; + +#define SDL_SHAPEMODEALPHA(mode) (mode == ShapeModeDefault || mode == ShapeModeBinarizeAlpha || mode == ShapeModeReverseBinarizeAlpha) + +/** \brief A union containing parameters for shaped windows. */ +typedef union { + /** \brief a cutoff alpha value for binarization of the window shape's alpha channel. */ + Uint8 binarizationCutoff; + SDL_Color colorKey; +} SDL_WindowShapeParams; + +/** \brief A struct that tags the SDL_WindowShapeParams union with an enum describing the type of its contents. */ +typedef struct SDL_WindowShapeMode { + /** \brief The mode of these window-shape parameters. */ + WindowShapeMode mode; + /** \brief Window-shape parameters. */ + SDL_WindowShapeParams parameters; +} SDL_WindowShapeMode; + +/** + * \brief Set the shape and parameters of a shaped window. + * + * \param window The shaped window whose parameters should be set. + * \param shape A surface encoding the desired shape for the window. + * \param shape_mode The parameters to set for the shaped window. + * + * \return 0 on success, SDL_INVALID_SHAPE_ARGUMENT on invalid an invalid shape argument, or SDL_NONSHAPEABLE_WINDOW + * if the SDL_Window* given does not reference a valid shaped window. + * + * \sa SDL_WindowShapeMode + * \sa SDL_GetShapedWindowMode. + */ +extern DECLSPEC int SDLCALL SDL_SetWindowShape(SDL_Window *window,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode); + +/** + * \brief Get the shape parameters of a shaped window. + * + * \param window The shaped window whose parameters should be retrieved. + * \param shape_mode An empty shape-mode structure to fill, or NULL to check whether the window has a shape. + * + * \return 0 if the window has a shape and, provided shape_mode was not NULL, shape_mode has been filled with the mode + * data, SDL_NONSHAPEABLE_WINDOW if the SDL_Window given is not a shaped window, or SDL_WINDOW_LACKS_SHAPE if + * the SDL_Window* given is a shapeable window currently lacking a shape. + * + * \sa SDL_WindowShapeMode + * \sa SDL_SetWindowShape + */ +extern DECLSPEC int SDLCALL SDL_GetShapedWindowMode(SDL_Window *window,SDL_WindowShapeMode *shape_mode); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_shape_h */ diff --git a/lib/SDL2/include/SDL_stdinc.h b/lib/SDL2/include/SDL_stdinc.h new file mode 100644 index 0000000000..31b343d303 --- /dev/null +++ b/lib/SDL2/include/SDL_stdinc.h @@ -0,0 +1,405 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_stdinc.h + * + * This is a general header that includes C language support. + */ + +#ifndef _SDL_stdinc_h +#define _SDL_stdinc_h + +#include "SDL_config.h" + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_STDIO_H +#include +#endif +#if defined(STDC_HEADERS) +# include +# include +# include +#else +# if defined(HAVE_STDLIB_H) +# include +# elif defined(HAVE_MALLOC_H) +# include +# endif +# if defined(HAVE_STDDEF_H) +# include +# endif +# if defined(HAVE_STDARG_H) +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H) +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#if defined(HAVE_INTTYPES_H) +# include +#elif defined(HAVE_STDINT_H) +# include +#endif +#ifdef HAVE_CTYPE_H +# include +#endif +#ifdef HAVE_MATH_H +# if defined(__WINRT__) +/* Defining _USE_MATH_DEFINES is required to get M_PI to be defined on + WinRT. See http://msdn.microsoft.com/en-us/library/4hwaceh6.aspx + for more information. +*/ +# define _USE_MATH_DEFINES +# endif +# include +#endif +#ifdef HAVE_FLOAT_H +# include +#endif +#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H) +# include +#endif + +/** + * The number of elements in an array. + */ +#define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) +#define SDL_TABLESIZE(table) SDL_arraysize(table) + +/** + * \name Cast operators + * + * Use proper C++ casts when compiled as C++ to be compatible with the option + * -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above). + */ +/* @{ */ +#ifdef __cplusplus +#define SDL_reinterpret_cast(type, expression) reinterpret_cast(expression) +#define SDL_static_cast(type, expression) static_cast(expression) +#define SDL_const_cast(type, expression) const_cast(expression) +#else +#define SDL_reinterpret_cast(type, expression) ((type)(expression)) +#define SDL_static_cast(type, expression) ((type)(expression)) +#define SDL_const_cast(type, expression) ((type)(expression)) +#endif +/* @} *//* Cast operators */ + +/* Define a four character code as a Uint32 */ +#define SDL_FOURCC(A, B, C, D) \ + ((SDL_static_cast(Uint32, SDL_static_cast(Uint8, (A))) << 0) | \ + (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (B))) << 8) | \ + (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (C))) << 16) | \ + (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (D))) << 24)) + +/** + * \name Basic data types + */ +/* @{ */ + +typedef enum +{ + SDL_FALSE = 0, + SDL_TRUE = 1 +} SDL_bool; + +/** + * \brief A signed 8-bit integer type. + */ +typedef int8_t Sint8; +/** + * \brief An unsigned 8-bit integer type. + */ +typedef uint8_t Uint8; +/** + * \brief A signed 16-bit integer type. + */ +typedef int16_t Sint16; +/** + * \brief An unsigned 16-bit integer type. + */ +typedef uint16_t Uint16; +/** + * \brief A signed 32-bit integer type. + */ +typedef int32_t Sint32; +/** + * \brief An unsigned 32-bit integer type. + */ +typedef uint32_t Uint32; + +/** + * \brief A signed 64-bit integer type. + */ +typedef int64_t Sint64; +/** + * \brief An unsigned 64-bit integer type. + */ +typedef uint64_t Uint64; + +/* @} *//* Basic data types */ + + +#define SDL_COMPILE_TIME_ASSERT(name, x) \ + typedef int SDL_dummy_ ## name[(x) * 2 - 1] +/** \cond */ +#ifndef DOXYGEN_SHOULD_IGNORE_THIS +SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1); +SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1); +SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2); +SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2); +SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4); +SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4); +SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8); +SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); +#endif /* DOXYGEN_SHOULD_IGNORE_THIS */ +/** \endcond */ + +/* Check to make sure enums are the size of ints, for structure packing. + For both Watcom C/C++ and Borland C/C++ the compiler option that makes + enums having the size of an int must be enabled. + This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11). +*/ + +/** \cond */ +#ifndef DOXYGEN_SHOULD_IGNORE_THIS +#if !defined(__ANDROID__) + /* TODO: include/SDL_stdinc.h:174: error: size of array 'SDL_dummy_enum' is negative */ +typedef enum +{ + DUMMY_ENUM_VALUE +} SDL_DUMMY_ENUM; + +SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int)); +#endif +#endif /* DOXYGEN_SHOULD_IGNORE_THIS */ +/** \endcond */ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(HAVE_ALLOCA) && !defined(alloca) +# if defined(HAVE_ALLOCA_H) +# include +# elif defined(__GNUC__) +# define alloca __builtin_alloca +# elif defined(_MSC_VER) +# include +# define alloca _alloca +# elif defined(__WATCOMC__) +# include +# elif defined(__BORLANDC__) +# include +# elif defined(__DMC__) +# include +# elif defined(__AIX__) +#pragma alloca +# elif defined(__MRC__) +void *alloca(unsigned); +# else +char *alloca(); +# endif +#endif +#ifdef HAVE_ALLOCA +#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) +#define SDL_stack_free(data) +#else +#define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count)) +#define SDL_stack_free(data) SDL_free(data) +#endif + +extern DECLSPEC void *SDLCALL SDL_malloc(size_t size); +extern DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size); +extern DECLSPEC void *SDLCALL SDL_realloc(void *mem, size_t size); +extern DECLSPEC void SDLCALL SDL_free(void *mem); + +extern DECLSPEC char *SDLCALL SDL_getenv(const char *name); +extern DECLSPEC int SDLCALL SDL_setenv(const char *name, const char *value, int overwrite); + +extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, int (*compare) (const void *, const void *)); + +extern DECLSPEC int SDLCALL SDL_abs(int x); + +/* !!! FIXME: these have side effects. You probably shouldn't use them. */ +/* !!! FIXME: Maybe we do forceinline functions of SDL_mini, SDL_minf, etc? */ +#define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) +#define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) + +extern DECLSPEC int SDLCALL SDL_isdigit(int x); +extern DECLSPEC int SDLCALL SDL_isspace(int x); +extern DECLSPEC int SDLCALL SDL_toupper(int x); +extern DECLSPEC int SDLCALL SDL_tolower(int x); + +extern DECLSPEC void *SDLCALL SDL_memset(void *dst, int c, size_t len); + +#define SDL_zero(x) SDL_memset(&(x), 0, sizeof((x))) +#define SDL_zerop(x) SDL_memset((x), 0, sizeof(*(x))) + +/* Note that memset() is a byte assignment and this is a 32-bit assignment, so they're not directly equivalent. */ +SDL_FORCE_INLINE void SDL_memset4(void *dst, Uint32 val, size_t dwords) +{ +#if defined(__GNUC__) && defined(i386) + int u0, u1, u2; + __asm__ __volatile__ ( + "cld \n\t" + "rep ; stosl \n\t" + : "=&D" (u0), "=&a" (u1), "=&c" (u2) + : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, dwords)) + : "memory" + ); +#else + size_t _n = (dwords + 3) / 4; + Uint32 *_p = SDL_static_cast(Uint32 *, dst); + Uint32 _val = (val); + if (dwords == 0) + return; + switch (dwords % 4) + { + case 0: do { *_p++ = _val; + case 3: *_p++ = _val; + case 2: *_p++ = _val; + case 1: *_p++ = _val; + } while ( --_n ); + } +#endif +} + + +extern DECLSPEC void *SDLCALL SDL_memcpy(void *dst, const void *src, size_t len); + +SDL_FORCE_INLINE void *SDL_memcpy4(void *dst, const void *src, size_t dwords) +{ + return SDL_memcpy(dst, src, dwords * 4); +} + +extern DECLSPEC void *SDLCALL SDL_memmove(void *dst, const void *src, size_t len); +extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); + +extern DECLSPEC size_t SDLCALL SDL_wcslen(const wchar_t *wstr); +extern DECLSPEC size_t SDLCALL SDL_wcslcpy(wchar_t *dst, const wchar_t *src, size_t maxlen); +extern DECLSPEC size_t SDLCALL SDL_wcslcat(wchar_t *dst, const wchar_t *src, size_t maxlen); + +extern DECLSPEC size_t SDLCALL SDL_strlen(const char *str); +extern DECLSPEC size_t SDLCALL SDL_strlcpy(char *dst, const char *src, size_t maxlen); +extern DECLSPEC size_t SDLCALL SDL_utf8strlcpy(char *dst, const char *src, size_t dst_bytes); +extern DECLSPEC size_t SDLCALL SDL_strlcat(char *dst, const char *src, size_t maxlen); +extern DECLSPEC char *SDLCALL SDL_strdup(const char *str); +extern DECLSPEC char *SDLCALL SDL_strrev(char *str); +extern DECLSPEC char *SDLCALL SDL_strupr(char *str); +extern DECLSPEC char *SDLCALL SDL_strlwr(char *str); +extern DECLSPEC char *SDLCALL SDL_strchr(const char *str, int c); +extern DECLSPEC char *SDLCALL SDL_strrchr(const char *str, int c); +extern DECLSPEC char *SDLCALL SDL_strstr(const char *haystack, const char *needle); + +extern DECLSPEC char *SDLCALL SDL_itoa(int value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_uitoa(unsigned int value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_ltoa(long value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_ultoa(unsigned long value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_lltoa(Sint64 value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_ulltoa(Uint64 value, char *str, int radix); + +extern DECLSPEC int SDLCALL SDL_atoi(const char *str); +extern DECLSPEC double SDLCALL SDL_atof(const char *str); +extern DECLSPEC long SDLCALL SDL_strtol(const char *str, char **endp, int base); +extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *str, char **endp, int base); +extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *str, char **endp, int base); +extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *str, char **endp, int base); +extern DECLSPEC double SDLCALL SDL_strtod(const char *str, char **endp); + +extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); +extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen); +extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); +extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t len); + +extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, const char *fmt, ...); +extern DECLSPEC int SDLCALL SDL_vsscanf(const char *text, const char *fmt, va_list ap); +extern DECLSPEC int SDLCALL SDL_snprintf(char *text, size_t maxlen, const char *fmt, ...); +extern DECLSPEC int SDLCALL SDL_vsnprintf(char *text, size_t maxlen, const char *fmt, va_list ap); + +#ifndef HAVE_M_PI +#ifndef M_PI +#define M_PI 3.14159265358979323846264338327950288 /* pi */ +#endif +#endif + +extern DECLSPEC double SDLCALL SDL_acos(double x); +extern DECLSPEC double SDLCALL SDL_asin(double x); +extern DECLSPEC double SDLCALL SDL_atan(double x); +extern DECLSPEC double SDLCALL SDL_atan2(double x, double y); +extern DECLSPEC double SDLCALL SDL_ceil(double x); +extern DECLSPEC double SDLCALL SDL_copysign(double x, double y); +extern DECLSPEC double SDLCALL SDL_cos(double x); +extern DECLSPEC float SDLCALL SDL_cosf(float x); +extern DECLSPEC double SDLCALL SDL_fabs(double x); +extern DECLSPEC double SDLCALL SDL_floor(double x); +extern DECLSPEC double SDLCALL SDL_log(double x); +extern DECLSPEC double SDLCALL SDL_pow(double x, double y); +extern DECLSPEC double SDLCALL SDL_scalbn(double x, int n); +extern DECLSPEC double SDLCALL SDL_sin(double x); +extern DECLSPEC float SDLCALL SDL_sinf(float x); +extern DECLSPEC double SDLCALL SDL_sqrt(double x); + +/* The SDL implementation of iconv() returns these error codes */ +#define SDL_ICONV_ERROR (size_t)-1 +#define SDL_ICONV_E2BIG (size_t)-2 +#define SDL_ICONV_EILSEQ (size_t)-3 +#define SDL_ICONV_EINVAL (size_t)-4 + +/* SDL_iconv_* are now always real symbols/types, not macros or inlined. */ +typedef struct _SDL_iconv_t *SDL_iconv_t; +extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, + const char *fromcode); +extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); +extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, + size_t * inbytesleft, char **outbuf, + size_t * outbytesleft); +/** + * This function converts a string between encodings in one pass, returning a + * string that must be freed with SDL_free() or NULL on error. + */ +extern DECLSPEC char *SDLCALL SDL_iconv_string(const char *tocode, + const char *fromcode, + const char *inbuf, + size_t inbytesleft); +#define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2-INTERNAL", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4-INTERNAL", "UTF-8", S, SDL_strlen(S)+1) + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_stdinc_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_surface.h b/lib/SDL2/include/SDL_surface.h new file mode 100644 index 0000000000..aa8d821741 --- /dev/null +++ b/lib/SDL2/include/SDL_surface.h @@ -0,0 +1,503 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_surface.h + * + * Header file for ::SDL_Surface definition and management functions. + */ + +#ifndef _SDL_surface_h +#define _SDL_surface_h + +#include "SDL_stdinc.h" +#include "SDL_pixels.h" +#include "SDL_rect.h" +#include "SDL_blendmode.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \name Surface flags + * + * These are the currently supported flags for the ::SDL_Surface. + * + * \internal + * Used internally (read-only). + */ +/* @{ */ +#define SDL_SWSURFACE 0 /**< Just here for compatibility */ +#define SDL_PREALLOC 0x00000001 /**< Surface uses preallocated memory */ +#define SDL_RLEACCEL 0x00000002 /**< Surface is RLE encoded */ +#define SDL_DONTFREE 0x00000004 /**< Surface is referenced internally */ +/* @} *//* Surface flags */ + +/** + * Evaluates to true if the surface needs to be locked before access. + */ +#define SDL_MUSTLOCK(S) (((S)->flags & SDL_RLEACCEL) != 0) + +/** + * \brief A collection of pixels used in software blitting. + * + * \note This structure should be treated as read-only, except for \c pixels, + * which, if not NULL, contains the raw pixel data for the surface. + */ +typedef struct SDL_Surface +{ + Uint32 flags; /**< Read-only */ + SDL_PixelFormat *format; /**< Read-only */ + int w, h; /**< Read-only */ + int pitch; /**< Read-only */ + void *pixels; /**< Read-write */ + + /** Application data associated with the surface */ + void *userdata; /**< Read-write */ + + /** information needed for surfaces requiring locks */ + int locked; /**< Read-only */ + void *lock_data; /**< Read-only */ + + /** clipping information */ + SDL_Rect clip_rect; /**< Read-only */ + + /** info for fast blit mapping to other surfaces */ + struct SDL_BlitMap *map; /**< Private */ + + /** Reference count -- used when freeing surface */ + int refcount; /**< Read-mostly */ +} SDL_Surface; + +/** + * \brief The type of function used for surface blitting functions. + */ +typedef int (*SDL_blit) (struct SDL_Surface * src, SDL_Rect * srcrect, + struct SDL_Surface * dst, SDL_Rect * dstrect); + +/** + * Allocate and free an RGB surface. + * + * If the depth is 4 or 8 bits, an empty palette is allocated for the surface. + * If the depth is greater than 8 bits, the pixel format is set using the + * flags '[RGB]mask'. + * + * If the function runs out of memory, it will return NULL. + * + * \param flags The \c flags are obsolete and should be set to 0. + * \param width The width in pixels of the surface to create. + * \param height The height in pixels of the surface to create. + * \param depth The depth in bits of the surface to create. + * \param Rmask The red mask of the surface to create. + * \param Gmask The green mask of the surface to create. + * \param Bmask The blue mask of the surface to create. + * \param Amask The alpha mask of the surface to create. + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurface + (Uint32 flags, int width, int height, int depth, + Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); +extern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurfaceFrom(void *pixels, + int width, + int height, + int depth, + int pitch, + Uint32 Rmask, + Uint32 Gmask, + Uint32 Bmask, + Uint32 Amask); +extern DECLSPEC void SDLCALL SDL_FreeSurface(SDL_Surface * surface); + +/** + * \brief Set the palette used by a surface. + * + * \return 0, or -1 if the surface format doesn't use a palette. + * + * \note A single palette can be shared with many surfaces. + */ +extern DECLSPEC int SDLCALL SDL_SetSurfacePalette(SDL_Surface * surface, + SDL_Palette * palette); + +/** + * \brief Sets up a surface for directly accessing the pixels. + * + * Between calls to SDL_LockSurface() / SDL_UnlockSurface(), you can write + * to and read from \c surface->pixels, using the pixel format stored in + * \c surface->format. Once you are done accessing the surface, you should + * use SDL_UnlockSurface() to release it. + * + * Not all surfaces require locking. If SDL_MUSTLOCK(surface) evaluates + * to 0, then you can read and write to the surface at any time, and the + * pixel format of the surface will not change. + * + * No operating system or library calls should be made between lock/unlock + * pairs, as critical system locks may be held during this time. + * + * SDL_LockSurface() returns 0, or -1 if the surface couldn't be locked. + * + * \sa SDL_UnlockSurface() + */ +extern DECLSPEC int SDLCALL SDL_LockSurface(SDL_Surface * surface); +/** \sa SDL_LockSurface() */ +extern DECLSPEC void SDLCALL SDL_UnlockSurface(SDL_Surface * surface); + +/** + * Load a surface from a seekable SDL data stream (memory or file). + * + * If \c freesrc is non-zero, the stream will be closed after being read. + * + * The new surface should be freed with SDL_FreeSurface(). + * + * \return the new surface, or NULL if there was an error. + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_LoadBMP_RW(SDL_RWops * src, + int freesrc); + +/** + * Load a surface from a file. + * + * Convenience macro. + */ +#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1) + +/** + * Save a surface to a seekable SDL data stream (memory or file). + * + * If \c freedst is non-zero, the stream will be closed after being written. + * + * \return 0 if successful or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_SaveBMP_RW + (SDL_Surface * surface, SDL_RWops * dst, int freedst); + +/** + * Save a surface to a file. + * + * Convenience macro. + */ +#define SDL_SaveBMP(surface, file) \ + SDL_SaveBMP_RW(surface, SDL_RWFromFile(file, "wb"), 1) + +/** + * \brief Sets the RLE acceleration hint for a surface. + * + * \return 0 on success, or -1 if the surface is not valid + * + * \note If RLE is enabled, colorkey and alpha blending blits are much faster, + * but the surface must be locked before directly accessing the pixels. + */ +extern DECLSPEC int SDLCALL SDL_SetSurfaceRLE(SDL_Surface * surface, + int flag); + +/** + * \brief Sets the color key (transparent pixel) in a blittable surface. + * + * \param surface The surface to update + * \param flag Non-zero to enable colorkey and 0 to disable colorkey + * \param key The transparent pixel in the native surface format + * + * \return 0 on success, or -1 if the surface is not valid + * + * You can pass SDL_RLEACCEL to enable RLE accelerated blits. + */ +extern DECLSPEC int SDLCALL SDL_SetColorKey(SDL_Surface * surface, + int flag, Uint32 key); + +/** + * \brief Gets the color key (transparent pixel) in a blittable surface. + * + * \param surface The surface to update + * \param key A pointer filled in with the transparent pixel in the native + * surface format + * + * \return 0 on success, or -1 if the surface is not valid or colorkey is not + * enabled. + */ +extern DECLSPEC int SDLCALL SDL_GetColorKey(SDL_Surface * surface, + Uint32 * key); + +/** + * \brief Set an additional color value used in blit operations. + * + * \param surface The surface to update. + * \param r The red color value multiplied into blit operations. + * \param g The green color value multiplied into blit operations. + * \param b The blue color value multiplied into blit operations. + * + * \return 0 on success, or -1 if the surface is not valid. + * + * \sa SDL_GetSurfaceColorMod() + */ +extern DECLSPEC int SDLCALL SDL_SetSurfaceColorMod(SDL_Surface * surface, + Uint8 r, Uint8 g, Uint8 b); + + +/** + * \brief Get the additional color value used in blit operations. + * + * \param surface The surface to query. + * \param r A pointer filled in with the current red color value. + * \param g A pointer filled in with the current green color value. + * \param b A pointer filled in with the current blue color value. + * + * \return 0 on success, or -1 if the surface is not valid. + * + * \sa SDL_SetSurfaceColorMod() + */ +extern DECLSPEC int SDLCALL SDL_GetSurfaceColorMod(SDL_Surface * surface, + Uint8 * r, Uint8 * g, + Uint8 * b); + +/** + * \brief Set an additional alpha value used in blit operations. + * + * \param surface The surface to update. + * \param alpha The alpha value multiplied into blit operations. + * + * \return 0 on success, or -1 if the surface is not valid. + * + * \sa SDL_GetSurfaceAlphaMod() + */ +extern DECLSPEC int SDLCALL SDL_SetSurfaceAlphaMod(SDL_Surface * surface, + Uint8 alpha); + +/** + * \brief Get the additional alpha value used in blit operations. + * + * \param surface The surface to query. + * \param alpha A pointer filled in with the current alpha value. + * + * \return 0 on success, or -1 if the surface is not valid. + * + * \sa SDL_SetSurfaceAlphaMod() + */ +extern DECLSPEC int SDLCALL SDL_GetSurfaceAlphaMod(SDL_Surface * surface, + Uint8 * alpha); + +/** + * \brief Set the blend mode used for blit operations. + * + * \param surface The surface to update. + * \param blendMode ::SDL_BlendMode to use for blit blending. + * + * \return 0 on success, or -1 if the parameters are not valid. + * + * \sa SDL_GetSurfaceBlendMode() + */ +extern DECLSPEC int SDLCALL SDL_SetSurfaceBlendMode(SDL_Surface * surface, + SDL_BlendMode blendMode); + +/** + * \brief Get the blend mode used for blit operations. + * + * \param surface The surface to query. + * \param blendMode A pointer filled in with the current blend mode. + * + * \return 0 on success, or -1 if the surface is not valid. + * + * \sa SDL_SetSurfaceBlendMode() + */ +extern DECLSPEC int SDLCALL SDL_GetSurfaceBlendMode(SDL_Surface * surface, + SDL_BlendMode *blendMode); + +/** + * Sets the clipping rectangle for the destination surface in a blit. + * + * If the clip rectangle is NULL, clipping will be disabled. + * + * If the clip rectangle doesn't intersect the surface, the function will + * return SDL_FALSE and blits will be completely clipped. Otherwise the + * function returns SDL_TRUE and blits to the surface will be clipped to + * the intersection of the surface area and the clipping rectangle. + * + * Note that blits are automatically clipped to the edges of the source + * and destination surfaces. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_SetClipRect(SDL_Surface * surface, + const SDL_Rect * rect); + +/** + * Gets the clipping rectangle for the destination surface in a blit. + * + * \c rect must be a pointer to a valid rectangle which will be filled + * with the correct values. + */ +extern DECLSPEC void SDLCALL SDL_GetClipRect(SDL_Surface * surface, + SDL_Rect * rect); + +/** + * Creates a new surface of the specified format, and then copies and maps + * the given surface to it so the blit of the converted surface will be as + * fast as possible. If this function fails, it returns NULL. + * + * The \c flags parameter is passed to SDL_CreateRGBSurface() and has those + * semantics. You can also pass ::SDL_RLEACCEL in the flags parameter and + * SDL will try to RLE accelerate colorkey and alpha blits in the resulting + * surface. + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_ConvertSurface + (SDL_Surface * src, const SDL_PixelFormat * fmt, Uint32 flags); +extern DECLSPEC SDL_Surface *SDLCALL SDL_ConvertSurfaceFormat + (SDL_Surface * src, Uint32 pixel_format, Uint32 flags); + +/** + * \brief Copy a block of pixels of one format to another format + * + * \return 0 on success, or -1 if there was an error + */ +extern DECLSPEC int SDLCALL SDL_ConvertPixels(int width, int height, + Uint32 src_format, + const void * src, int src_pitch, + Uint32 dst_format, + void * dst, int dst_pitch); + +/** + * Performs a fast fill of the given rectangle with \c color. + * + * If \c rect is NULL, the whole surface will be filled with \c color. + * + * The color should be a pixel of the format used by the surface, and + * can be generated by the SDL_MapRGB() function. + * + * \return 0 on success, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_FillRect + (SDL_Surface * dst, const SDL_Rect * rect, Uint32 color); +extern DECLSPEC int SDLCALL SDL_FillRects + (SDL_Surface * dst, const SDL_Rect * rects, int count, Uint32 color); + +/** + * Performs a fast blit from the source surface to the destination surface. + * + * This assumes that the source and destination rectangles are + * the same size. If either \c srcrect or \c dstrect are NULL, the entire + * surface (\c src or \c dst) is copied. The final blit rectangles are saved + * in \c srcrect and \c dstrect after all clipping is performed. + * + * \return If the blit is successful, it returns 0, otherwise it returns -1. + * + * The blit function should not be called on a locked surface. + * + * The blit semantics for surfaces with and without blending and colorkey + * are defined as follows: + * \verbatim + RGBA->RGB: + Source surface blend mode set to SDL_BLENDMODE_BLEND: + alpha-blend (using the source alpha-channel and per-surface alpha) + SDL_SRCCOLORKEY ignored. + Source surface blend mode set to SDL_BLENDMODE_NONE: + copy RGB. + if SDL_SRCCOLORKEY set, only copy the pixels matching the + RGB values of the source color key, ignoring alpha in the + comparison. + + RGB->RGBA: + Source surface blend mode set to SDL_BLENDMODE_BLEND: + alpha-blend (using the source per-surface alpha) + Source surface blend mode set to SDL_BLENDMODE_NONE: + copy RGB, set destination alpha to source per-surface alpha value. + both: + if SDL_SRCCOLORKEY set, only copy the pixels matching the + source color key. + + RGBA->RGBA: + Source surface blend mode set to SDL_BLENDMODE_BLEND: + alpha-blend (using the source alpha-channel and per-surface alpha) + SDL_SRCCOLORKEY ignored. + Source surface blend mode set to SDL_BLENDMODE_NONE: + copy all of RGBA to the destination. + if SDL_SRCCOLORKEY set, only copy the pixels matching the + RGB values of the source color key, ignoring alpha in the + comparison. + + RGB->RGB: + Source surface blend mode set to SDL_BLENDMODE_BLEND: + alpha-blend (using the source per-surface alpha) + Source surface blend mode set to SDL_BLENDMODE_NONE: + copy RGB. + both: + if SDL_SRCCOLORKEY set, only copy the pixels matching the + source color key. + \endverbatim + * + * You should call SDL_BlitSurface() unless you know exactly how SDL + * blitting works internally and how to use the other blit functions. + */ +#define SDL_BlitSurface SDL_UpperBlit + +/** + * This is the public blit function, SDL_BlitSurface(), and it performs + * rectangle validation and clipping before passing it to SDL_LowerBlit() + */ +extern DECLSPEC int SDLCALL SDL_UpperBlit + (SDL_Surface * src, const SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect); + +/** + * This is a semi-private blit function and it performs low-level surface + * blitting only. + */ +extern DECLSPEC int SDLCALL SDL_LowerBlit + (SDL_Surface * src, SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect); + +/** + * \brief Perform a fast, low quality, stretch blit between two surfaces of the + * same pixel format. + * + * \note This function uses a static buffer, and is not thread-safe. + */ +extern DECLSPEC int SDLCALL SDL_SoftStretch(SDL_Surface * src, + const SDL_Rect * srcrect, + SDL_Surface * dst, + const SDL_Rect * dstrect); + +#define SDL_BlitScaled SDL_UpperBlitScaled + +/** + * This is the public scaled blit function, SDL_BlitScaled(), and it performs + * rectangle validation and clipping before passing it to SDL_LowerBlitScaled() + */ +extern DECLSPEC int SDLCALL SDL_UpperBlitScaled + (SDL_Surface * src, const SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect); + +/** + * This is a semi-private blit function and it performs low-level surface + * scaled blitting only. + */ +extern DECLSPEC int SDLCALL SDL_LowerBlitScaled + (SDL_Surface * src, SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_surface_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_system.h b/lib/SDL2/include/SDL_system.h new file mode 100644 index 0000000000..fd929f7f98 --- /dev/null +++ b/lib/SDL2/include/SDL_system.h @@ -0,0 +1,191 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_system.h + * + * Include file for platform specific SDL API functions + */ + +#ifndef _SDL_system_h +#define _SDL_system_h + +#include "SDL_stdinc.h" +#include "SDL_keyboard.h" +#include "SDL_render.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/* Platform specific functions for Windows */ +#ifdef __WIN32__ + +/* Returns the D3D9 adapter index that matches the specified display index. + This adapter index can be passed to IDirect3D9::CreateDevice and controls + on which monitor a full screen application will appear. +*/ +extern DECLSPEC int SDLCALL SDL_Direct3D9GetAdapterIndex( int displayIndex ); + +/* Returns the D3D device associated with a renderer, or NULL if it's not a D3D renderer. + Once you are done using the device, you should release it to avoid a resource leak. + */ +typedef struct IDirect3DDevice9 IDirect3DDevice9; +extern DECLSPEC IDirect3DDevice9* SDLCALL SDL_RenderGetD3D9Device(SDL_Renderer * renderer); + +/* Returns the DXGI Adapter and Output indices for the specified display index. + These can be passed to EnumAdapters and EnumOutputs respectively to get the objects + required to create a DX10 or DX11 device and swap chain. + */ +extern DECLSPEC void SDLCALL SDL_DXGIGetOutputInfo( int displayIndex, int *adapterIndex, int *outputIndex ); + +#endif /* __WIN32__ */ + + +/* Platform specific functions for iOS */ +#if defined(__IPHONEOS__) && __IPHONEOS__ + +extern DECLSPEC int SDLCALL SDL_iPhoneSetAnimationCallback(SDL_Window * window, int interval, void (*callback)(void*), void *callbackParam); +extern DECLSPEC void SDLCALL SDL_iPhoneSetEventPump(SDL_bool enabled); + +#endif /* __IPHONEOS__ */ + + +/* Platform specific functions for Android */ +#if defined(__ANDROID__) && __ANDROID__ + +/* Get the JNI environment for the current thread + This returns JNIEnv*, but the prototype is void* so we don't need jni.h + */ +extern DECLSPEC void * SDLCALL SDL_AndroidGetJNIEnv(); + +/* Get the SDL Activity object for the application + This returns jobject, but the prototype is void* so we don't need jni.h + The jobject returned by SDL_AndroidGetActivity is a local reference. + It is the caller's responsibility to properly release it + (using env->Push/PopLocalFrame or manually with env->DeleteLocalRef) + */ +extern DECLSPEC void * SDLCALL SDL_AndroidGetActivity(); + +/* See the official Android developer guide for more information: + http://developer.android.com/guide/topics/data/data-storage.html +*/ +#define SDL_ANDROID_EXTERNAL_STORAGE_READ 0x01 +#define SDL_ANDROID_EXTERNAL_STORAGE_WRITE 0x02 + +/* Get the path used for internal storage for this application. + This path is unique to your application and cannot be written to + by other applications. + */ +extern DECLSPEC const char * SDLCALL SDL_AndroidGetInternalStoragePath(); + +/* Get the current state of external storage, a bitmask of these values: + SDL_ANDROID_EXTERNAL_STORAGE_READ + SDL_ANDROID_EXTERNAL_STORAGE_WRITE + If external storage is currently unavailable, this will return 0. +*/ +extern DECLSPEC int SDLCALL SDL_AndroidGetExternalStorageState(); + +/* Get the path used for external storage for this application. + This path is unique to your application, but is public and can be + written to by other applications. + */ +extern DECLSPEC const char * SDLCALL SDL_AndroidGetExternalStoragePath(); + +#endif /* __ANDROID__ */ + +/* Platform specific functions for WinRT */ +#if defined(__WINRT__) && __WINRT__ + +/** + * \brief WinRT / Windows Phone path types + */ +typedef enum +{ + /** \brief The installed app's root directory. + Files here are likely to be read-only. */ + SDL_WINRT_PATH_INSTALLED_LOCATION, + + /** \brief The app's local data store. Files may be written here */ + SDL_WINRT_PATH_LOCAL_FOLDER, + + /** \brief The app's roaming data store. Unsupported on Windows Phone. + Files written here may be copied to other machines via a network + connection. + */ + SDL_WINRT_PATH_ROAMING_FOLDER, + + /** \brief The app's temporary data store. Unsupported on Windows Phone. + Files written here may be deleted at any time. */ + SDL_WINRT_PATH_TEMP_FOLDER +} SDL_WinRT_Path; + + +/** + * \brief Retrieves a WinRT defined path on the local file system + * + * \note Documentation on most app-specific path types on WinRT + * can be found on MSDN, at the URL: + * http://msdn.microsoft.com/en-us/library/windows/apps/hh464917.aspx + * + * \param pathType The type of path to retrieve. + * \ret A UCS-2 string (16-bit, wide-char) containing the path, or NULL + * if the path is not available for any reason. Not all paths are + * available on all versions of Windows. This is especially true on + * Windows Phone. Check the documentation for the given + * SDL_WinRT_Path for more information on which path types are + * supported where. + */ +extern DECLSPEC const wchar_t * SDLCALL SDL_WinRTGetFSPathUNICODE(SDL_WinRT_Path pathType); + +/** + * \brief Retrieves a WinRT defined path on the local file system + * + * \note Documentation on most app-specific path types on WinRT + * can be found on MSDN, at the URL: + * http://msdn.microsoft.com/en-us/library/windows/apps/hh464917.aspx + * + * \param pathType The type of path to retrieve. + * \ret A UTF-8 string (8-bit, multi-byte) containing the path, or NULL + * if the path is not available for any reason. Not all paths are + * available on all versions of Windows. This is especially true on + * Windows Phone. Check the documentation for the given + * SDL_WinRT_Path for more information on which path types are + * supported where. + */ +extern DECLSPEC const char * SDLCALL SDL_WinRTGetFSPathUTF8(SDL_WinRT_Path pathType); + +#endif /* __WINRT__ */ + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_system_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_syswm.h b/lib/SDL2/include/SDL_syswm.h new file mode 100644 index 0000000000..a3fe73861c --- /dev/null +++ b/lib/SDL2/include/SDL_syswm.h @@ -0,0 +1,272 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_syswm.h + * + * Include file for SDL custom system window manager hooks. + */ + +#ifndef _SDL_syswm_h +#define _SDL_syswm_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" +#include "SDL_version.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file SDL_syswm.h + * + * Your application has access to a special type of event ::SDL_SYSWMEVENT, + * which contains window-manager specific information and arrives whenever + * an unhandled window event occurs. This event is ignored by default, but + * you can enable it with SDL_EventState(). + */ +#ifdef SDL_PROTOTYPES_ONLY +struct SDL_SysWMinfo; +#else + +#if defined(SDL_VIDEO_DRIVER_WINDOWS) +#define WIN32_LEAN_AND_MEAN +#include +#endif + +#if defined(SDL_VIDEO_DRIVER_WINRT) +#include +#endif + +/* This is the structure for custom window manager events */ +#if defined(SDL_VIDEO_DRIVER_X11) +#if defined(__APPLE__) && defined(__MACH__) +/* conflicts with Quickdraw.h */ +#define Cursor X11Cursor +#endif + +#include +#include + +#if defined(__APPLE__) && defined(__MACH__) +/* matches the re-define above */ +#undef Cursor +#endif + +#endif /* defined(SDL_VIDEO_DRIVER_X11) */ + +#if defined(SDL_VIDEO_DRIVER_DIRECTFB) +#include +#endif + +#if defined(SDL_VIDEO_DRIVER_COCOA) +#ifdef __OBJC__ +#include +#else +typedef struct _NSWindow NSWindow; +#endif +#endif + +#if defined(SDL_VIDEO_DRIVER_UIKIT) +#ifdef __OBJC__ +#include +#else +typedef struct _UIWindow UIWindow; +typedef struct _UIViewController UIViewController; +#endif +#endif + +#if defined(SDL_VIDEO_DRIVER_MIR) +#include +#endif + + +/** + * These are the various supported windowing subsystems + */ +typedef enum +{ + SDL_SYSWM_UNKNOWN, + SDL_SYSWM_WINDOWS, + SDL_SYSWM_X11, + SDL_SYSWM_DIRECTFB, + SDL_SYSWM_COCOA, + SDL_SYSWM_UIKIT, + SDL_SYSWM_WAYLAND, + SDL_SYSWM_MIR, + SDL_SYSWM_WINRT, +} SDL_SYSWM_TYPE; + +/** + * The custom event structure. + */ +struct SDL_SysWMmsg +{ + SDL_version version; + SDL_SYSWM_TYPE subsystem; + union + { +#if defined(SDL_VIDEO_DRIVER_WINDOWS) + struct { + HWND hwnd; /**< The window for the message */ + UINT msg; /**< The type of message */ + WPARAM wParam; /**< WORD message parameter */ + LPARAM lParam; /**< LONG message parameter */ + } win; +#endif +#if defined(SDL_VIDEO_DRIVER_X11) + struct { + XEvent event; + } x11; +#endif +#if defined(SDL_VIDEO_DRIVER_DIRECTFB) + struct { + DFBEvent event; + } dfb; +#endif +#if defined(SDL_VIDEO_DRIVER_COCOA) + struct + { + /* No Cocoa window events yet */ + } cocoa; +#endif +#if defined(SDL_VIDEO_DRIVER_UIKIT) + struct + { + /* No UIKit window events yet */ + } uikit; +#endif + /* Can't have an empty union */ + int dummy; + } msg; +}; + +/** + * The custom window manager information structure. + * + * When this structure is returned, it holds information about which + * low level system it is using, and will be one of SDL_SYSWM_TYPE. + */ +struct SDL_SysWMinfo +{ + SDL_version version; + SDL_SYSWM_TYPE subsystem; + union + { +#if defined(SDL_VIDEO_DRIVER_WINDOWS) + struct + { + HWND window; /**< The window handle */ + } win; +#endif +#if defined(SDL_VIDEO_DRIVER_WINRT) + struct + { + IInspectable * window; /**< The WinRT CoreWindow */ + } winrt; +#endif +#if defined(SDL_VIDEO_DRIVER_X11) + struct + { + Display *display; /**< The X11 display */ + Window window; /**< The X11 window */ + } x11; +#endif +#if defined(SDL_VIDEO_DRIVER_DIRECTFB) + struct + { + IDirectFB *dfb; /**< The directfb main interface */ + IDirectFBWindow *window; /**< The directfb window handle */ + IDirectFBSurface *surface; /**< The directfb client surface */ + } dfb; +#endif +#if defined(SDL_VIDEO_DRIVER_COCOA) + struct + { + NSWindow *window; /* The Cocoa window */ + } cocoa; +#endif +#if defined(SDL_VIDEO_DRIVER_UIKIT) + struct + { + UIWindow *window; /* The UIKit window */ + } uikit; +#endif +#if defined(SDL_VIDEO_DRIVER_WAYLAND) + struct + { + struct wl_display *display; /**< Wayland display */ + struct wl_surface *surface; /**< Wayland surface */ + struct wl_shell_surface *shell_surface; /**< Wayland shell_surface (window manager handle) */ + } wl; +#endif +#if defined(SDL_VIDEO_DRIVER_MIR) + struct + { + MirConnection *connection; /**< Mir display server connection */ + MirSurface *surface; /**< Mir surface */ + } mir; +#endif + + /* Can't have an empty union */ + int dummy; + } info; +}; + +#endif /* SDL_PROTOTYPES_ONLY */ + +typedef struct SDL_SysWMinfo SDL_SysWMinfo; + +/* Function prototypes */ +/** + * \brief This function allows access to driver-dependent window information. + * + * \param window The window about which information is being requested + * \param info This structure must be initialized with the SDL version, and is + * then filled in with information about the given window. + * + * \return SDL_TRUE if the function is implemented and the version member of + * the \c info struct is valid, SDL_FALSE otherwise. + * + * You typically use this function like this: + * \code + * SDL_SysWMinfo info; + * SDL_VERSION(&info.version); + * if ( SDL_GetWindowWMInfo(window, &info) ) { ... } + * \endcode + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowWMInfo(SDL_Window * window, + SDL_SysWMinfo * info); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_syswm_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_test.h b/lib/SDL2/include/SDL_test.h new file mode 100644 index 0000000000..ae649a420f --- /dev/null +++ b/lib/SDL2/include/SDL_test.h @@ -0,0 +1,68 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +#ifndef _SDL_test_h +#define _SDL_test_h + +#include "SDL.h" +#include "SDL_test_common.h" +#include "SDL_test_font.h" +#include "SDL_test_random.h" +#include "SDL_test_fuzzer.h" +#include "SDL_test_crc32.h" +#include "SDL_test_md5.h" +#include "SDL_test_log.h" +#include "SDL_test_assert.h" +#include "SDL_test_harness.h" +#include "SDL_test_images.h" +#include "SDL_test_compare.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Global definitions */ + +/* + * Note: Maximum size of SDLTest log message is less than SDLs limit + * to ensure we can fit additional information such as the timestamp. + */ +#define SDLTEST_MAX_LOGMESSAGE_LENGTH 3584 + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_test_assert.h b/lib/SDL2/include/SDL_test_assert.h new file mode 100644 index 0000000000..79c84d6064 --- /dev/null +++ b/lib/SDL2/include/SDL_test_assert.h @@ -0,0 +1,105 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_assert.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + * + * Assert API for test code and test cases + * + */ + +#ifndef _SDL_test_assert_h +#define _SDL_test_assert_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Fails the assert. + */ +#define ASSERT_FAIL 0 + +/** + * \brief Passes the assert. + */ +#define ASSERT_PASS 1 + +/** + * \brief Assert that logs and break execution flow on failures. + * + * \param assertCondition Evaluated condition or variable to assert; fail (==0) or pass (!=0). + * \param assertDescription Message to log with the assert describing it. + */ +void SDLTest_Assert(int assertCondition, const char *assertDescription, ...); + +/** + * \brief Assert for test cases that logs but does not break execution flow on failures. Updates assertion counters. + * + * \param assertCondition Evaluated condition or variable to assert; fail (==0) or pass (!=0). + * \param assertDescription Message to log with the assert describing it. + * + * \returns Returns the assertCondition so it can be used to externally to break execution flow if desired. + */ +int SDLTest_AssertCheck(int assertCondition, const char *assertDescription, ...); + +/** + * \brief Explicitely pass without checking an assertion condition. Updates assertion counter. + * + * \param assertDescription Message to log with the assert describing it. + */ +void SDLTest_AssertPass(const char *assertDescription, ...); + +/** + * \brief Resets the assert summary counters to zero. + */ +void SDLTest_ResetAssertSummary(); + +/** + * \brief Logs summary of all assertions (total, pass, fail) since last reset as INFO or ERROR. + */ +void SDLTest_LogAssertSummary(); + + +/** + * \brief Converts the current assert summary state to a test result. + * + * \returns TEST_RESULT_PASSED, TEST_RESULT_FAILED, or TEST_RESULT_NO_ASSERT + */ +int SDLTest_AssertSummaryToTestResult(); + +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_assert_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_test_common.h b/lib/SDL2/include/SDL_test_common.h new file mode 100644 index 0000000000..45c9edafd2 --- /dev/null +++ b/lib/SDL2/include/SDL_test_common.h @@ -0,0 +1,188 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_common.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* Ported from original test\common.h file. */ + +#ifndef _SDL_test_common_h +#define _SDL_test_common_h + +#include "SDL.h" + +#if defined(__PSP__) +#define DEFAULT_WINDOW_WIDTH 480 +#define DEFAULT_WINDOW_HEIGHT 272 +#else +#define DEFAULT_WINDOW_WIDTH 640 +#define DEFAULT_WINDOW_HEIGHT 480 +#endif + +#define VERBOSE_VIDEO 0x00000001 +#define VERBOSE_MODES 0x00000002 +#define VERBOSE_RENDER 0x00000004 +#define VERBOSE_EVENT 0x00000008 +#define VERBOSE_AUDIO 0x00000010 + +typedef struct +{ + /* SDL init flags */ + char **argv; + Uint32 flags; + Uint32 verbose; + + /* Video info */ + const char *videodriver; + int display; + const char *window_title; + const char *window_icon; + Uint32 window_flags; + int window_x; + int window_y; + int window_w; + int window_h; + int window_minW; + int window_minH; + int window_maxW; + int window_maxH; + int logical_w; + int logical_h; + float scale; + int depth; + int refresh_rate; + int num_windows; + SDL_Window **windows; + + /* Renderer info */ + const char *renderdriver; + Uint32 render_flags; + SDL_bool skip_renderer; + SDL_Renderer **renderers; + SDL_Texture **targets; + + /* Audio info */ + const char *audiodriver; + SDL_AudioSpec audiospec; + + /* GL settings */ + int gl_red_size; + int gl_green_size; + int gl_blue_size; + int gl_alpha_size; + int gl_buffer_size; + int gl_depth_size; + int gl_stencil_size; + int gl_double_buffer; + int gl_accum_red_size; + int gl_accum_green_size; + int gl_accum_blue_size; + int gl_accum_alpha_size; + int gl_stereo; + int gl_multisamplebuffers; + int gl_multisamplesamples; + int gl_retained_backing; + int gl_accelerated; + int gl_major_version; + int gl_minor_version; + int gl_debug; + int gl_profile_mask; +} SDLTest_CommonState; + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Function prototypes */ + +/** + * \brief Parse command line parameters and create common state. + * + * \param argv Array of command line parameters + * \param flags Flags indicating which subsystem to initialize (i.e. SDL_INIT_VIDEO | SDL_INIT_AUDIO) + * + * \returns Returns a newly allocated common state object. + */ +SDLTest_CommonState *SDLTest_CommonCreateState(char **argv, Uint32 flags); + +/** + * \brief Process one common argument. + * + * \param state The common state describing the test window to create. + * \param index The index of the argument to process in argv[]. + * + * \returns The number of arguments processed (i.e. 1 for --fullscreen, 2 for --video [videodriver], or -1 on error. + */ +int SDLTest_CommonArg(SDLTest_CommonState * state, int index); + +/** + * \brief Returns common usage information + * + * \param state The common state describing the test window to create. + * + * \returns String with usage information + */ +const char *SDLTest_CommonUsage(SDLTest_CommonState * state); + +/** + * \brief Open test window. + * + * \param state The common state describing the test window to create. + * + * \returns True if initialization succeeded, false otherwise + */ +SDL_bool SDLTest_CommonInit(SDLTest_CommonState * state); + +/** + * \brief Common event handler for test windows. + * + * \param state The common state used to create test window. + * \param event The event to handle. + * \param done Flag indicating we are done. + * + */ +void SDLTest_CommonEvent(SDLTest_CommonState * state, SDL_Event * event, int *done); + +/** + * \brief Close test window. + * + * \param state The common state used to create test window. + * + */ +void SDLTest_CommonQuit(SDLTest_CommonState * state); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_common_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_test_compare.h b/lib/SDL2/include/SDL_test_compare.h new file mode 100644 index 0000000000..f1353a8d25 --- /dev/null +++ b/lib/SDL2/include/SDL_test_compare.h @@ -0,0 +1,69 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_compare.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + Defines comparison functions (i.e. for surfaces). + +*/ + +#ifndef _SDL_test_compare_h +#define _SDL_test_compare_h + +#include "SDL.h" + +#include "SDL_test_images.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Compares a surface and with reference image data for equality + * + * \param surface Surface used in comparison + * \param referenceSurface Test Surface used in comparison + * \param allowable_error Allowable difference (squared) in blending accuracy. + * + * \returns 0 if comparison succeeded, >0 (=number of pixels where comparison failed) if comparison failed, -1 if any of the surfaces were NULL, -2 if the surface sizes differ. + */ +int SDLTest_CompareSurfaces(SDL_Surface *surface, SDL_Surface *referenceSurface, int allowable_error); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_compare_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_test_crc32.h b/lib/SDL2/include/SDL_test_crc32.h new file mode 100644 index 0000000000..a180fe3bbc --- /dev/null +++ b/lib/SDL2/include/SDL_test_crc32.h @@ -0,0 +1,124 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_crc32.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + Implements CRC32 calculations (default output is Perl String::CRC32 compatible). + +*/ + +#ifndef _SDL_test_crc32_h +#define _SDL_test_crc32_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/* ------------ Definitions --------- */ + +/* Definition shared by all CRC routines */ + +#ifndef CrcUint32 + #define CrcUint32 unsigned int +#endif +#ifndef CrcUint8 + #define CrcUint8 unsigned char +#endif + +#ifdef ORIGINAL_METHOD + #define CRC32_POLY 0x04c11db7 /* AUTODIN II, Ethernet, & FDDI */ +#else + #define CRC32_POLY 0xEDB88320 /* Perl String::CRC32 compatible */ +#endif + +/** + * Data structure for CRC32 (checksum) computation + */ + typedef struct { + CrcUint32 crc32_table[256]; /* CRC table */ + } SDLTest_Crc32Context; + +/* ---------- Function Prototypes ------------- */ + +/** + * /brief Initialize the CRC context + * + * Note: The function initializes the crc table required for all crc calculations. + * + * /param crcContext pointer to context variable + * + * /returns 0 for OK, -1 on error + * + */ + int SDLTest_Crc32Init(SDLTest_Crc32Context * crcContext); + + +/** + * /brief calculate a crc32 from a data block + * + * /param crcContext pointer to context variable + * /param inBuf input buffer to checksum + * /param inLen length of input buffer + * /param crc32 pointer to Uint32 to store the final CRC into + * + * /returns 0 for OK, -1 on error + * + */ +int SDLTest_crc32Calc(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32); + +/* Same routine broken down into three steps */ +int SDLTest_Crc32CalcStart(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32); +int SDLTest_Crc32CalcEnd(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32); +int SDLTest_Crc32CalcBuffer(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32); + + +/** + * /brief clean up CRC context + * + * /param crcContext pointer to context variable + * + * /returns 0 for OK, -1 on error + * +*/ + +int SDLTest_Crc32Done(SDLTest_Crc32Context * crcContext); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_crc32_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_test_font.h b/lib/SDL2/include/SDL_test_font.h new file mode 100644 index 0000000000..8d51d4a9b5 --- /dev/null +++ b/lib/SDL2/include/SDL_test_font.h @@ -0,0 +1,76 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_font.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +#ifndef _SDL_test_font_h +#define _SDL_test_font_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Function prototypes */ + +#define FONT_CHARACTER_SIZE 8 + +/** + * \brief Draw a string in the currently set font. + * + * \param renderer The renderer to draw on. + * \param x The X coordinate of the upper left corner of the character. + * \param y The Y coordinate of the upper left corner of the character. + * \param c The character to draw. + * + * \returns Returns 0 on success, -1 on failure. + */ +int SDLTest_DrawCharacter( SDL_Renderer *renderer, int x, int y, char c ); + +/** + * \brief Draw a string in the currently set font. + * + * \param renderer The renderer to draw on. + * \param x The X coordinate of the upper left corner of the string. + * \param y The Y coordinate of the upper left corner of the string. + * \param s The string to draw. + * + * \returns Returns 0 on success, -1 on failure. + */ +int SDLTest_DrawString( SDL_Renderer * renderer, int x, int y, const char *s ); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_font_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_test_fuzzer.h b/lib/SDL2/include/SDL_test_fuzzer.h new file mode 100644 index 0000000000..640180397c --- /dev/null +++ b/lib/SDL2/include/SDL_test_fuzzer.h @@ -0,0 +1,384 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_fuzzer.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + Data generators for fuzzing test data in a reproducible way. + +*/ + +#ifndef _SDL_test_fuzzer_h +#define _SDL_test_fuzzer_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/* + Based on GSOC code by Markus Kauppila +*/ + + +/** + * \file + * Note: The fuzzer implementation uses a static instance of random context + * internally which makes it thread-UNsafe. + */ + +/** + * Initializes the fuzzer for a test + * + * /param execKey Execution "Key" that initializes the random number generator uniquely for the test. + * + */ +void SDLTest_FuzzerInit(Uint64 execKey); + + +/** + * Returns a random Uint8 + * + * \returns Generated integer + */ +Uint8 SDLTest_RandomUint8(); + +/** + * Returns a random Sint8 + * + * \returns Generated signed integer + */ +Sint8 SDLTest_RandomSint8(); + + +/** + * Returns a random Uint16 + * + * \returns Generated integer + */ +Uint16 SDLTest_RandomUint16(); + +/** + * Returns a random Sint16 + * + * \returns Generated signed integer + */ +Sint16 SDLTest_RandomSint16(); + + +/** + * Returns a random integer + * + * \returns Generated integer + */ +Sint32 SDLTest_RandomSint32(); + + +/** + * Returns a random positive integer + * + * \returns Generated integer + */ +Uint32 SDLTest_RandomUint32(); + +/** + * Returns random Uint64. + * + * \returns Generated integer + */ +Uint64 SDLTest_RandomUint64(); + + +/** + * Returns random Sint64. + * + * \returns Generated signed integer + */ +Sint64 SDLTest_RandomSint64(); + +/** + * \returns random float in range [0.0 - 1.0[ + */ +float SDLTest_RandomUnitFloat(); + +/** + * \returns random double in range [0.0 - 1.0[ + */ +double SDLTest_RandomUnitDouble(); + +/** + * \returns random float. + * + */ +float SDLTest_RandomFloat(); + +/** + * \returns random double. + * + */ +double SDLTest_RandomDouble(); + +/** + * Returns a random boundary value for Uint8 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomUint8BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 + * RandomUint8BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 + * RandomUint8BoundaryValue(0, 99, SDL_FALSE) returns 100 + * RandomUint8BoundaryValue(0, 255, SDL_FALSE) returns 0 (error set) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns Random boundary value for the given range and domain or 0 with error set + */ +Uint8 SDLTest_RandomUint8BoundaryValue(Uint8 boundary1, Uint8 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Uint16 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomUint16BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 + * RandomUint16BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 + * RandomUint16BoundaryValue(0, 99, SDL_FALSE) returns 100 + * RandomUint16BoundaryValue(0, 0xFFFF, SDL_FALSE) returns 0 (error set) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns Random boundary value for the given range and domain or 0 with error set + */ +Uint16 SDLTest_RandomUint16BoundaryValue(Uint16 boundary1, Uint16 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Uint32 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomUint32BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 + * RandomUint32BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 + * RandomUint32BoundaryValue(0, 99, SDL_FALSE) returns 100 + * RandomUint32BoundaryValue(0, 0xFFFFFFFF, SDL_FALSE) returns 0 (with error set) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns Random boundary value for the given range and domain or 0 with error set + */ +Uint32 SDLTest_RandomUint32BoundaryValue(Uint32 boundary1, Uint32 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Uint64 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomUint64BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 + * RandomUint64BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 + * RandomUint64BoundaryValue(0, 99, SDL_FALSE) returns 100 + * RandomUint64BoundaryValue(0, 0xFFFFFFFFFFFFFFFF, SDL_FALSE) returns 0 (with error set) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns Random boundary value for the given range and domain or 0 with error set + */ +Uint64 SDLTest_RandomUint64BoundaryValue(Uint64 boundary1, Uint64 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Sint8 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomSint8BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 + * RandomSint8BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 + * RandomSint8BoundaryValue(SINT8_MIN, 99, SDL_FALSE) returns 100 + * RandomSint8BoundaryValue(SINT8_MIN, SINT8_MAX, SDL_FALSE) returns SINT8_MIN (== error value) with error set + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns Random boundary value for the given range and domain or SINT8_MIN with error set + */ +Sint8 SDLTest_RandomSint8BoundaryValue(Sint8 boundary1, Sint8 boundary2, SDL_bool validDomain); + + +/** + * Returns a random boundary value for Sint16 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomSint16BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 + * RandomSint16BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 + * RandomSint16BoundaryValue(SINT16_MIN, 99, SDL_FALSE) returns 100 + * RandomSint16BoundaryValue(SINT16_MIN, SINT16_MAX, SDL_FALSE) returns SINT16_MIN (== error value) with error set + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns Random boundary value for the given range and domain or SINT16_MIN with error set + */ +Sint16 SDLTest_RandomSint16BoundaryValue(Sint16 boundary1, Sint16 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Sint32 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomSint32BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 + * RandomSint32BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 + * RandomSint32BoundaryValue(SINT32_MIN, 99, SDL_FALSE) returns 100 + * RandomSint32BoundaryValue(SINT32_MIN, SINT32_MAX, SDL_FALSE) returns SINT32_MIN (== error value) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns Random boundary value for the given range and domain or SINT32_MIN with error set + */ +Sint32 SDLTest_RandomSint32BoundaryValue(Sint32 boundary1, Sint32 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Sint64 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomSint64BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 + * RandomSint64BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 + * RandomSint64BoundaryValue(SINT64_MIN, 99, SDL_FALSE) returns 100 + * RandomSint64BoundaryValue(SINT64_MIN, SINT64_MAX, SDL_FALSE) returns SINT64_MIN (== error value) and error set + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns Random boundary value for the given range and domain or SINT64_MIN with error set + */ +Sint64 SDLTest_RandomSint64BoundaryValue(Sint64 boundary1, Sint64 boundary2, SDL_bool validDomain); + + +/** + * Returns integer in range [min, max] (inclusive). + * Min and max values can be negative values. + * If Max in smaller tham min, then the values are swapped. + * Min and max are the same value, that value will be returned. + * + * \param min Minimum inclusive value of returned random number + * \param max Maximum inclusive value of returned random number + * + * \returns Generated random integer in range + */ +Sint32 SDLTest_RandomIntegerInRange(Sint32 min, Sint32 max); + + +/** + * Generates random null-terminated string. The minimum length for + * the string is 1 character, maximum length for the string is 255 + * characters and it can contain ASCII characters from 32 to 126. + * + * Note: Returned string needs to be deallocated. + * + * \returns Newly allocated random string; or NULL if length was invalid or string could not be allocated. + */ +char * SDLTest_RandomAsciiString(); + + +/** + * Generates random null-terminated string. The maximum length for + * the string is defined by the maxLength parameter. + * String can contain ASCII characters from 32 to 126. + * + * Note: Returned string needs to be deallocated. + * + * \param maxLength The maximum length of the generated string. + * + * \returns Newly allocated random string; or NULL if maxLength was invalid or string could not be allocated. + */ +char * SDLTest_RandomAsciiStringWithMaximumLength(int maxLength); + + +/** + * Generates random null-terminated string. The length for + * the string is defined by the size parameter. + * String can contain ASCII characters from 32 to 126. + * + * Note: Returned string needs to be deallocated. + * + * \param size The length of the generated string + * + * \returns Newly allocated random string; or NULL if size was invalid or string could not be allocated. + */ +char * SDLTest_RandomAsciiStringOfSize(int size); + +/** + * Returns the invocation count for the fuzzer since last ...FuzzerInit. + */ +int SDLTest_GetFuzzerInvocationCount(); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_fuzzer_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_test_harness.h b/lib/SDL2/include/SDL_test_harness.h new file mode 100644 index 0000000000..2c1e2ade84 --- /dev/null +++ b/lib/SDL2/include/SDL_test_harness.h @@ -0,0 +1,123 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_harness.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + Defines types for test case definitions and the test execution harness API. + + Based on original GSOC code by Markus Kauppila +*/ + +#ifndef _SDL_test_harness_h +#define _SDL_test_harness_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/* ! Definitions for test case structures */ +#define TEST_ENABLED 1 +#define TEST_DISABLED 0 + +/* ! Definition of all the possible test return values of the test case method */ +#define TEST_ABORTED -1 +#define TEST_STARTED 0 +#define TEST_COMPLETED 1 +#define TEST_SKIPPED 2 + +/* ! Definition of all the possible test results for the harness */ +#define TEST_RESULT_PASSED 0 +#define TEST_RESULT_FAILED 1 +#define TEST_RESULT_NO_ASSERT 2 +#define TEST_RESULT_SKIPPED 3 +#define TEST_RESULT_SETUP_FAILURE 4 + +/* !< Function pointer to a test case setup function (run before every test) */ +typedef void (*SDLTest_TestCaseSetUpFp)(void *arg); + +/* !< Function pointer to a test case function */ +typedef int (*SDLTest_TestCaseFp)(void *arg); + +/* !< Function pointer to a test case teardown function (run after every test) */ +typedef void (*SDLTest_TestCaseTearDownFp)(void *arg); + +/** + * Holds information about a single test case. + */ +typedef struct SDLTest_TestCaseReference { + /* !< Func2Stress */ + SDLTest_TestCaseFp testCase; + /* !< Short name (or function name) "Func2Stress" */ + char *name; + /* !< Long name or full description "This test pushes func2() to the limit." */ + char *description; + /* !< Set to TEST_ENABLED or TEST_DISABLED (test won't be run) */ + int enabled; +} SDLTest_TestCaseReference; + +/** + * Holds information about a test suite (multiple test cases). + */ +typedef struct SDLTest_TestSuiteReference { + /* !< "PlatformSuite" */ + char *name; + /* !< The function that is run before each test. NULL skips. */ + SDLTest_TestCaseSetUpFp testSetUp; + /* !< The test cases that are run as part of the suite. Last item should be NULL. */ + const SDLTest_TestCaseReference **testCases; + /* !< The function that is run after each test. NULL skips. */ + SDLTest_TestCaseTearDownFp testTearDown; +} SDLTest_TestSuiteReference; + + +/** + * \brief Execute a test suite using the given run seed and execution key. + * + * \param testSuites Suites containing the test case. + * \param userRunSeed Custom run seed provided by user, or NULL to autogenerate one. + * \param userExecKey Custom execution key provided by user, or 0 to autogenerate one. + * \param filter Filter specification. NULL disables. Case sensitive. + * \param testIterations Number of iterations to run each test case. + * + * \returns Test run result; 0 when all tests passed, 1 if any tests failed. + */ +int SDLTest_RunSuites(SDLTest_TestSuiteReference *testSuites[], const char *userRunSeed, Uint64 userExecKey, const char *filter, int testIterations); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_harness_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_test_images.h b/lib/SDL2/include/SDL_test_images.h new file mode 100644 index 0000000000..0562799618 --- /dev/null +++ b/lib/SDL2/include/SDL_test_images.h @@ -0,0 +1,78 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_images.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + Defines some images for tests. + +*/ + +#ifndef _SDL_test_images_h +#define _SDL_test_images_h + +#include "SDL.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + *Type for test images. + */ +typedef struct SDLTest_SurfaceImage_s { + int width; + int height; + unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */ + const char *pixel_data; +} SDLTest_SurfaceImage_t; + +/* Test images */ +SDL_Surface *SDLTest_ImageBlit(); +SDL_Surface *SDLTest_ImageBlitColor(); +SDL_Surface *SDLTest_ImageBlitAlpha(); +SDL_Surface *SDLTest_ImageBlitBlendAdd(); +SDL_Surface *SDLTest_ImageBlitBlend(); +SDL_Surface *SDLTest_ImageBlitBlendMod(); +SDL_Surface *SDLTest_ImageBlitBlendNone(); +SDL_Surface *SDLTest_ImageBlitBlendAll(); +SDL_Surface *SDLTest_ImageFace(); +SDL_Surface *SDLTest_ImagePrimitives(); +SDL_Surface *SDLTest_ImagePrimitivesBlend(); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_images_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_test_log.h b/lib/SDL2/include/SDL_test_log.h new file mode 100644 index 0000000000..76ce105835 --- /dev/null +++ b/lib/SDL2/include/SDL_test_log.h @@ -0,0 +1,67 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_log.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + * + * Wrapper to log in the TEST category + * + */ + +#ifndef _SDL_test_log_h +#define _SDL_test_log_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Prints given message with a timestamp in the TEST category and INFO priority. + * + * \param fmt Message to be logged + */ +void SDLTest_Log(const char *fmt, ...); + +/** + * \brief Prints given message with a timestamp in the TEST category and the ERROR priority. + * + * \param fmt Message to be logged + */ +void SDLTest_LogError(const char *fmt, ...); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_log_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_test_md5.h b/lib/SDL2/include/SDL_test_md5.h new file mode 100644 index 0000000000..029e164bf8 --- /dev/null +++ b/lib/SDL2/include/SDL_test_md5.h @@ -0,0 +1,129 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_md5.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + *********************************************************************** + ** Header file for implementation of MD5 ** + ** RSA Data Security, Inc. MD5 Message-Digest Algorithm ** + ** Created: 2/17/90 RLR ** + ** Revised: 12/27/90 SRD,AJ,BSK,JT Reference C version ** + ** Revised (for MD5): RLR 4/27/91 ** + ** -- G modified to have y&~z instead of y&z ** + ** -- FF, GG, HH modified to add in last register done ** + ** -- Access pattern: round 2 works mod 5, round 3 works mod 3 ** + ** -- distinct additive constant for each step ** + ** -- round 4 added, working mod 7 ** + *********************************************************************** +*/ + +/* + *********************************************************************** + ** Message-digest routines: ** + ** To form the message digest for a message M ** + ** (1) Initialize a context buffer mdContext using MD5Init ** + ** (2) Call MD5Update on mdContext and M ** + ** (3) Call MD5Final on mdContext ** + ** The message digest is now in mdContext->digest[0...15] ** + *********************************************************************** +*/ + +#ifndef _SDL_test_md5_h +#define _SDL_test_md5_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------ Definitions --------- */ + +/* typedef a 32-bit type */ + typedef unsigned long int MD5UINT4; + +/* Data structure for MD5 (Message-Digest) computation */ + typedef struct { + MD5UINT4 i[2]; /* number of _bits_ handled mod 2^64 */ + MD5UINT4 buf[4]; /* scratch buffer */ + unsigned char in[64]; /* input buffer */ + unsigned char digest[16]; /* actual digest after Md5Final call */ + } SDLTest_Md5Context; + +/* ---------- Function Prototypes ------------- */ + +/** + * /brief initialize the context + * + * /param mdContext pointer to context variable + * + * Note: The function initializes the message-digest context + * mdContext. Call before each new use of the context - + * all fields are set to zero. + */ + void SDLTest_Md5Init(SDLTest_Md5Context * mdContext); + + +/** + * /brief update digest from variable length data + * + * /param mdContext pointer to context variable + * /param inBuf pointer to data array/string + * /param inLen length of data array/string + * + * Note: The function updates the message-digest context to account + * for the presence of each of the characters inBuf[0..inLen-1] + * in the message whose digest is being computed. +*/ + + void SDLTest_Md5Update(SDLTest_Md5Context * mdContext, unsigned char *inBuf, + unsigned int inLen); + + +/* + * /brief complete digest computation + * + * /param mdContext pointer to context variable + * + * Note: The function terminates the message-digest computation and + * ends with the desired message digest in mdContext.digest[0..15]. + * Always call before using the digest[] variable. +*/ + + void SDLTest_Md5Final(SDLTest_Md5Context * mdContext); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_md5_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_test_random.h b/lib/SDL2/include/SDL_test_random.h new file mode 100644 index 0000000000..6c5660d80d --- /dev/null +++ b/lib/SDL2/include/SDL_test_random.h @@ -0,0 +1,115 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_random.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + A "32-bit Multiply with carry random number generator. Very fast. + Includes a list of recommended multipliers. + + multiply-with-carry generator: x(n) = a*x(n-1) + carry mod 2^32. + period: (a*2^31)-1 + +*/ + +#ifndef _SDL_test_random_h +#define _SDL_test_random_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* --- Definitions */ + +/* + * Macros that return a random number in a specific format. + */ +#define SDLTest_RandomInt(c) ((int)SDLTest_Random(c)) + +/* + * Context structure for the random number generator state. + */ + typedef struct { + unsigned int a; + unsigned int x; + unsigned int c; + unsigned int ah; + unsigned int al; + } SDLTest_RandomContext; + + +/* --- Function prototypes */ + +/** + * \brief Initialize random number generator with two integers. + * + * Note: The random sequence of numbers returned by ...Random() is the + * same for the same two integers and has a period of 2^31. + * + * \param rndContext pointer to context structure + * \param xi integer that defines the random sequence + * \param ci integer that defines the random sequence + * + */ + void SDLTest_RandomInit(SDLTest_RandomContext * rndContext, unsigned int xi, + unsigned int ci); + +/** + * \brief Initialize random number generator based on current system time. + * + * \param rndContext pointer to context structure + * + */ + void SDLTest_RandomInitTime(SDLTest_RandomContext *rndContext); + + +/** + * \brief Initialize random number generator based on current system time. + * + * Note: ...RandomInit() or ...RandomInitTime() must have been called + * before using this function. + * + * \param rndContext pointer to context structure + * + * \returns A random number (32bit unsigned integer) + * + */ + unsigned int SDLTest_Random(SDLTest_RandomContext *rndContext); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_random_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_thread.h b/lib/SDL2/include/SDL_thread.h new file mode 100644 index 0000000000..4e48cc34c1 --- /dev/null +++ b/lib/SDL2/include/SDL_thread.h @@ -0,0 +1,287 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_thread_h +#define _SDL_thread_h + +/** + * \file SDL_thread.h + * + * Header for the SDL thread management routines. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +/* Thread synchronization primitives */ +#include "SDL_atomic.h" +#include "SDL_mutex.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* The SDL thread structure, defined in SDL_thread.c */ +struct SDL_Thread; +typedef struct SDL_Thread SDL_Thread; + +/* The SDL thread ID */ +typedef unsigned long SDL_threadID; + +/* Thread local storage ID, 0 is the invalid ID */ +typedef unsigned int SDL_TLSID; + +/** + * The SDL thread priority. + * + * \note On many systems you require special privileges to set high priority. + */ +typedef enum { + SDL_THREAD_PRIORITY_LOW, + SDL_THREAD_PRIORITY_NORMAL, + SDL_THREAD_PRIORITY_HIGH +} SDL_ThreadPriority; + +/** + * The function passed to SDL_CreateThread(). + * It is passed a void* user context parameter and returns an int. + */ +typedef int (SDLCALL * SDL_ThreadFunction) (void *data); + +#if defined(__WIN32__) && !defined(HAVE_LIBC) +/** + * \file SDL_thread.h + * + * We compile SDL into a DLL. This means, that it's the DLL which + * creates a new thread for the calling process with the SDL_CreateThread() + * API. There is a problem with this, that only the RTL of the SDL.DLL will + * be initialized for those threads, and not the RTL of the calling + * application! + * + * To solve this, we make a little hack here. + * + * We'll always use the caller's _beginthread() and _endthread() APIs to + * start a new thread. This way, if it's the SDL.DLL which uses this API, + * then the RTL of SDL.DLL will be used to create the new thread, and if it's + * the application, then the RTL of the application will be used. + * + * So, in short: + * Always use the _beginthread() and _endthread() of the calling runtime + * library! + */ +#define SDL_PASSED_BEGINTHREAD_ENDTHREAD +#include /* This has _beginthread() and _endthread() defined! */ + +typedef uintptr_t(__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned, + unsigned (__stdcall * + func) (void + *), + void *arg, unsigned, + unsigned *threadID); +typedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code); + +/** + * Create a thread. + */ +extern DECLSPEC SDL_Thread *SDLCALL +SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data, + pfnSDL_CurrentBeginThread pfnBeginThread, + pfnSDL_CurrentEndThread pfnEndThread); + +/** + * Create a thread. + */ +#if defined(SDL_CreateThread) && SDL_DYNAMIC_API +#undef SDL_CreateThread +#define SDL_CreateThread(fn, name, data) SDL_CreateThread_REAL(fn, name, data, (pfnSDL_CurrentBeginThread)_beginthreadex, (pfnSDL_CurrentEndThread)_endthreadex) +#else +#define SDL_CreateThread(fn, name, data) SDL_CreateThread(fn, name, data, (pfnSDL_CurrentBeginThread)_beginthreadex, (pfnSDL_CurrentEndThread)_endthreadex) +#endif + +#else + +/** + * Create a thread. + * + * Thread naming is a little complicated: Most systems have very small + * limits for the string length (Haiku has 32 bytes, Linux currently has 16, + * Visual C++ 6.0 has nine!), and possibly other arbitrary rules. You'll + * have to see what happens with your system's debugger. The name should be + * UTF-8 (but using the naming limits of C identifiers is a better bet). + * There are no requirements for thread naming conventions, so long as the + * string is null-terminated UTF-8, but these guidelines are helpful in + * choosing a name: + * + * http://stackoverflow.com/questions/149932/naming-conventions-for-threads + * + * If a system imposes requirements, SDL will try to munge the string for + * it (truncate, etc), but the original string contents will be available + * from SDL_GetThreadName(). + */ +extern DECLSPEC SDL_Thread *SDLCALL +SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data); + +#endif + +/** + * Get the thread name, as it was specified in SDL_CreateThread(). + * This function returns a pointer to a UTF-8 string that names the + * specified thread, or NULL if it doesn't have a name. This is internal + * memory, not to be free()'d by the caller, and remains valid until the + * specified thread is cleaned up by SDL_WaitThread(). + */ +extern DECLSPEC const char *SDLCALL SDL_GetThreadName(SDL_Thread *thread); + +/** + * Get the thread identifier for the current thread. + */ +extern DECLSPEC SDL_threadID SDLCALL SDL_ThreadID(void); + +/** + * Get the thread identifier for the specified thread. + * + * Equivalent to SDL_ThreadID() if the specified thread is NULL. + */ +extern DECLSPEC SDL_threadID SDLCALL SDL_GetThreadID(SDL_Thread * thread); + +/** + * Set the priority for the current thread + */ +extern DECLSPEC int SDLCALL SDL_SetThreadPriority(SDL_ThreadPriority priority); + +/** + * Wait for a thread to finish. Threads that haven't been detached will + * remain (as a "zombie") until this function cleans them up. Not doing so + * is a resource leak. + * + * Once a thread has been cleaned up through this function, the SDL_Thread + * that references it becomes invalid and should not be referenced again. + * As such, only one thread may call SDL_WaitThread() on another. + * + * The return code for the thread function is placed in the area + * pointed to by \c status, if \c status is not NULL. + * + * You may not wait on a thread that has been used in a call to + * SDL_DetachThread(). Use either that function or this one, but not + * both, or behavior is undefined. + * + * It is safe to pass NULL to this function; it is a no-op. + */ +extern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread * thread, int *status); + +/** + * A thread may be "detached" to signify that it should not remain until + * another thread has called SDL_WaitThread() on it. Detaching a thread + * is useful for long-running threads that nothing needs to synchronize + * with or further manage. When a detached thread is done, it simply + * goes away. + * + * There is no way to recover the return code of a detached thread. If you + * need this, don't detach the thread and instead use SDL_WaitThread(). + * + * Once a thread is detached, you should usually assume the SDL_Thread isn't + * safe to reference again, as it will become invalid immediately upon + * the detached thread's exit, instead of remaining until someone has called + * SDL_WaitThread() to finally clean it up. As such, don't detach the same + * thread more than once. + * + * If a thread has already exited when passed to SDL_DetachThread(), it will + * stop waiting for a call to SDL_WaitThread() and clean up immediately. + * It is not safe to detach a thread that might be used with SDL_WaitThread(). + * + * You may not call SDL_WaitThread() on a thread that has been detached. + * Use either that function or this one, but not both, or behavior is + * undefined. + * + * It is safe to pass NULL to this function; it is a no-op. + */ +extern DECLSPEC void SDLCALL SDL_DetachThread(SDL_Thread * thread); + +/** + * \brief Create an identifier that is globally visible to all threads but refers to data that is thread-specific. + * + * \return The newly created thread local storage identifier, or 0 on error + * + * \code + * static SDL_SpinLock tls_lock; + * static SDL_TLSID thread_local_storage; + * + * void SetMyThreadData(void *value) + * { + * if (!thread_local_storage) { + * SDL_AtomicLock(&tls_lock); + * if (!thread_local_storage) { + * thread_local_storage = SDL_TLSCreate(); + * } + * SDL_AtomicUnLock(&tls_lock); + * } + * SDL_TLSSet(thread_local_storage, value); + * } + * + * void *GetMyThreadData(void) + * { + * return SDL_TLSGet(thread_local_storage); + * } + * \endcode + * + * \sa SDL_TLSGet() + * \sa SDL_TLSSet() + */ +extern DECLSPEC SDL_TLSID SDLCALL SDL_TLSCreate(void); + +/** + * \brief Get the value associated with a thread local storage ID for the current thread. + * + * \param id The thread local storage ID + * + * \return The value associated with the ID for the current thread, or NULL if no value has been set. + * + * \sa SDL_TLSCreate() + * \sa SDL_TLSSet() + */ +extern DECLSPEC void * SDLCALL SDL_TLSGet(SDL_TLSID id); + +/** + * \brief Set the value associated with a thread local storage ID for the current thread. + * + * \param id The thread local storage ID + * \param value The value to associate with the ID for the current thread + * \param destructor A function called when the thread exits, to free the value. + * + * \return 0 on success, -1 on error + * + * \sa SDL_TLSCreate() + * \sa SDL_TLSGet() + */ +extern DECLSPEC int SDLCALL SDL_TLSSet(SDL_TLSID id, const void *value, void (*destructor)(void*)); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_thread_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_timer.h b/lib/SDL2/include/SDL_timer.h new file mode 100644 index 0000000000..a48e0466e1 --- /dev/null +++ b/lib/SDL2/include/SDL_timer.h @@ -0,0 +1,115 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_timer_h +#define _SDL_timer_h + +/** + * \file SDL_timer.h + * + * Header for the SDL time management routines. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Get the number of milliseconds since the SDL library initialization. + * + * \note This value wraps if the program runs for more than ~49 days. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void); + +/** + * \brief Compare SDL ticks values, and return true if A has passed B + * + * e.g. if you want to wait 100 ms, you could do this: + * Uint32 timeout = SDL_GetTicks() + 100; + * while (!SDL_TICKS_PASSED(SDL_GetTicks(), timeout)) { + * ... do work until timeout has elapsed + * } + */ +#define SDL_TICKS_PASSED(A, B) ((Sint32)((B) - (A)) <= 0) + +/** + * \brief Get the current value of the high resolution counter + */ +extern DECLSPEC Uint64 SDLCALL SDL_GetPerformanceCounter(void); + +/** + * \brief Get the count per second of the high resolution counter + */ +extern DECLSPEC Uint64 SDLCALL SDL_GetPerformanceFrequency(void); + +/** + * \brief Wait a specified number of milliseconds before returning. + */ +extern DECLSPEC void SDLCALL SDL_Delay(Uint32 ms); + +/** + * Function prototype for the timer callback function. + * + * The callback function is passed the current timer interval and returns + * the next timer interval. If the returned value is the same as the one + * passed in, the periodic alarm continues, otherwise a new alarm is + * scheduled. If the callback returns 0, the periodic alarm is cancelled. + */ +typedef Uint32 (SDLCALL * SDL_TimerCallback) (Uint32 interval, void *param); + +/** + * Definition of the timer ID type. + */ +typedef int SDL_TimerID; + +/** + * \brief Add a new timer to the pool of timers already running. + * + * \return A timer ID, or NULL when an error occurs. + */ +extern DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, + SDL_TimerCallback callback, + void *param); + +/** + * \brief Remove a timer knowing its ID. + * + * \return A boolean value indicating success or failure. + * + * \warning It is not safe to remove a timer multiple times. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_RemoveTimer(SDL_TimerID id); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_timer_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_touch.h b/lib/SDL2/include/SDL_touch.h new file mode 100644 index 0000000000..017deb28b8 --- /dev/null +++ b/lib/SDL2/include/SDL_touch.h @@ -0,0 +1,86 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_touch.h + * + * Include file for SDL touch event handling. + */ + +#ifndef _SDL_touch_h +#define _SDL_touch_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef Sint64 SDL_TouchID; +typedef Sint64 SDL_FingerID; + +typedef struct SDL_Finger +{ + SDL_FingerID id; + float x; + float y; + float pressure; +} SDL_Finger; + +/* Used as the device ID for mouse events simulated with touch input */ +#define SDL_TOUCH_MOUSEID ((Uint32)-1) + + +/* Function prototypes */ + +/** + * \brief Get the number of registered touch devices. + */ +extern DECLSPEC int SDLCALL SDL_GetNumTouchDevices(void); + +/** + * \brief Get the touch ID with the given index, or 0 if the index is invalid. + */ +extern DECLSPEC SDL_TouchID SDLCALL SDL_GetTouchDevice(int index); + +/** + * \brief Get the number of active fingers for a given touch device. + */ +extern DECLSPEC int SDLCALL SDL_GetNumTouchFingers(SDL_TouchID touchID); + +/** + * \brief Get the finger object of the given touch, with the given index. + */ +extern DECLSPEC SDL_Finger * SDLCALL SDL_GetTouchFinger(SDL_TouchID touchID, int index); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_touch_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_types.h b/lib/SDL2/include/SDL_types.h new file mode 100644 index 0000000000..cd3ba33cd3 --- /dev/null +++ b/lib/SDL2/include/SDL_types.h @@ -0,0 +1,29 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_types.h + * + * \deprecated + */ + +/* DEPRECATED */ +#include "SDL_stdinc.h" diff --git a/lib/SDL2/include/SDL_version.h b/lib/SDL2/include/SDL_version.h new file mode 100644 index 0000000000..d02898bbba --- /dev/null +++ b/lib/SDL2/include/SDL_version.h @@ -0,0 +1,162 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_version.h + * + * This header defines the current SDL version. + */ + +#ifndef _SDL_version_h +#define _SDL_version_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Information the version of SDL in use. + * + * Represents the library's version as three levels: major revision + * (increments with massive changes, additions, and enhancements), + * minor revision (increments with backwards-compatible changes to the + * major revision), and patchlevel (increments with fixes to the minor + * revision). + * + * \sa SDL_VERSION + * \sa SDL_GetVersion + */ +typedef struct SDL_version +{ + Uint8 major; /**< major version */ + Uint8 minor; /**< minor version */ + Uint8 patch; /**< update version */ +} SDL_version; + +/* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL +*/ +#define SDL_MAJOR_VERSION 2 +#define SDL_MINOR_VERSION 0 +#define SDL_PATCHLEVEL 3 + +/** + * \brief Macro to determine SDL version program was compiled against. + * + * This macro fills in a SDL_version structure with the version of the + * library you compiled against. This is determined by what header the + * compiler uses. Note that if you dynamically linked the library, you might + * have a slightly newer or older version at runtime. That version can be + * determined with SDL_GetVersion(), which, unlike SDL_VERSION(), + * is not a macro. + * + * \param x A pointer to a SDL_version struct to initialize. + * + * \sa SDL_version + * \sa SDL_GetVersion + */ +#define SDL_VERSION(x) \ +{ \ + (x)->major = SDL_MAJOR_VERSION; \ + (x)->minor = SDL_MINOR_VERSION; \ + (x)->patch = SDL_PATCHLEVEL; \ +} + +/** + * This macro turns the version numbers into a numeric value: + * \verbatim + (1,2,3) -> (1203) + \endverbatim + * + * This assumes that there will never be more than 100 patchlevels. + */ +#define SDL_VERSIONNUM(X, Y, Z) \ + ((X)*1000 + (Y)*100 + (Z)) + +/** + * This is the version number macro for the current SDL version. + */ +#define SDL_COMPILEDVERSION \ + SDL_VERSIONNUM(SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL) + +/** + * This macro will evaluate to true if compiled with SDL at least X.Y.Z. + */ +#define SDL_VERSION_ATLEAST(X, Y, Z) \ + (SDL_COMPILEDVERSION >= SDL_VERSIONNUM(X, Y, Z)) + +/** + * \brief Get the version of SDL that is linked against your program. + * + * If you are linking to SDL dynamically, then it is possible that the + * current version will be different than the version you compiled against. + * This function returns the current version, while SDL_VERSION() is a + * macro that tells you what version you compiled with. + * + * \code + * SDL_version compiled; + * SDL_version linked; + * + * SDL_VERSION(&compiled); + * SDL_GetVersion(&linked); + * printf("We compiled against SDL version %d.%d.%d ...\n", + * compiled.major, compiled.minor, compiled.patch); + * printf("But we linked against SDL version %d.%d.%d.\n", + * linked.major, linked.minor, linked.patch); + * \endcode + * + * This function may be called safely at any time, even before SDL_Init(). + * + * \sa SDL_VERSION + */ +extern DECLSPEC void SDLCALL SDL_GetVersion(SDL_version * ver); + +/** + * \brief Get the code revision of SDL that is linked against your program. + * + * Returns an arbitrary string (a hash value) uniquely identifying the + * exact revision of the SDL library in use, and is only useful in comparing + * against other revisions. It is NOT an incrementing number. + */ +extern DECLSPEC const char *SDLCALL SDL_GetRevision(void); + +/** + * \brief Get the revision number of SDL that is linked against your program. + * + * Returns a number uniquely identifying the exact revision of the SDL + * library in use. It is an incrementing number based on commits to + * hg.libsdl.org. + */ +extern DECLSPEC int SDLCALL SDL_GetRevisionNumber(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_version_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_video.h b/lib/SDL2/include/SDL_video.h new file mode 100644 index 0000000000..49ea37ad00 --- /dev/null +++ b/lib/SDL2/include/SDL_video.h @@ -0,0 +1,979 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_video.h + * + * Header file for SDL video functions. + */ + +#ifndef _SDL_video_h +#define _SDL_video_h + +#include "SDL_stdinc.h" +#include "SDL_pixels.h" +#include "SDL_rect.h" +#include "SDL_surface.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief The structure that defines a display mode + * + * \sa SDL_GetNumDisplayModes() + * \sa SDL_GetDisplayMode() + * \sa SDL_GetDesktopDisplayMode() + * \sa SDL_GetCurrentDisplayMode() + * \sa SDL_GetClosestDisplayMode() + * \sa SDL_SetWindowDisplayMode() + * \sa SDL_GetWindowDisplayMode() + */ +typedef struct +{ + Uint32 format; /**< pixel format */ + int w; /**< width */ + int h; /**< height */ + int refresh_rate; /**< refresh rate (or zero for unspecified) */ + void *driverdata; /**< driver-specific data, initialize to 0 */ +} SDL_DisplayMode; + +/** + * \brief The type used to identify a window + * + * \sa SDL_CreateWindow() + * \sa SDL_CreateWindowFrom() + * \sa SDL_DestroyWindow() + * \sa SDL_GetWindowData() + * \sa SDL_GetWindowFlags() + * \sa SDL_GetWindowGrab() + * \sa SDL_GetWindowPosition() + * \sa SDL_GetWindowSize() + * \sa SDL_GetWindowTitle() + * \sa SDL_HideWindow() + * \sa SDL_MaximizeWindow() + * \sa SDL_MinimizeWindow() + * \sa SDL_RaiseWindow() + * \sa SDL_RestoreWindow() + * \sa SDL_SetWindowData() + * \sa SDL_SetWindowFullscreen() + * \sa SDL_SetWindowGrab() + * \sa SDL_SetWindowIcon() + * \sa SDL_SetWindowPosition() + * \sa SDL_SetWindowSize() + * \sa SDL_SetWindowBordered() + * \sa SDL_SetWindowTitle() + * \sa SDL_ShowWindow() + */ +typedef struct SDL_Window SDL_Window; + +/** + * \brief The flags on a window + * + * \sa SDL_GetWindowFlags() + */ +typedef enum +{ + SDL_WINDOW_FULLSCREEN = 0x00000001, /**< fullscreen window */ + SDL_WINDOW_OPENGL = 0x00000002, /**< window usable with OpenGL context */ + SDL_WINDOW_SHOWN = 0x00000004, /**< window is visible */ + SDL_WINDOW_HIDDEN = 0x00000008, /**< window is not visible */ + SDL_WINDOW_BORDERLESS = 0x00000010, /**< no window decoration */ + SDL_WINDOW_RESIZABLE = 0x00000020, /**< window can be resized */ + SDL_WINDOW_MINIMIZED = 0x00000040, /**< window is minimized */ + SDL_WINDOW_MAXIMIZED = 0x00000080, /**< window is maximized */ + SDL_WINDOW_INPUT_GRABBED = 0x00000100, /**< window has grabbed input focus */ + SDL_WINDOW_INPUT_FOCUS = 0x00000200, /**< window has input focus */ + SDL_WINDOW_MOUSE_FOCUS = 0x00000400, /**< window has mouse focus */ + SDL_WINDOW_FULLSCREEN_DESKTOP = ( SDL_WINDOW_FULLSCREEN | 0x00001000 ), + SDL_WINDOW_FOREIGN = 0x00000800, /**< window not created by SDL */ + SDL_WINDOW_ALLOW_HIGHDPI = 0x00002000 /**< window should be created in high-DPI mode if supported */ +} SDL_WindowFlags; + +/** + * \brief Used to indicate that you don't care what the window position is. + */ +#define SDL_WINDOWPOS_UNDEFINED_MASK 0x1FFF0000 +#define SDL_WINDOWPOS_UNDEFINED_DISPLAY(X) (SDL_WINDOWPOS_UNDEFINED_MASK|(X)) +#define SDL_WINDOWPOS_UNDEFINED SDL_WINDOWPOS_UNDEFINED_DISPLAY(0) +#define SDL_WINDOWPOS_ISUNDEFINED(X) \ + (((X)&0xFFFF0000) == SDL_WINDOWPOS_UNDEFINED_MASK) + +/** + * \brief Used to indicate that the window position should be centered. + */ +#define SDL_WINDOWPOS_CENTERED_MASK 0x2FFF0000 +#define SDL_WINDOWPOS_CENTERED_DISPLAY(X) (SDL_WINDOWPOS_CENTERED_MASK|(X)) +#define SDL_WINDOWPOS_CENTERED SDL_WINDOWPOS_CENTERED_DISPLAY(0) +#define SDL_WINDOWPOS_ISCENTERED(X) \ + (((X)&0xFFFF0000) == SDL_WINDOWPOS_CENTERED_MASK) + +/** + * \brief Event subtype for window events + */ +typedef enum +{ + SDL_WINDOWEVENT_NONE, /**< Never used */ + SDL_WINDOWEVENT_SHOWN, /**< Window has been shown */ + SDL_WINDOWEVENT_HIDDEN, /**< Window has been hidden */ + SDL_WINDOWEVENT_EXPOSED, /**< Window has been exposed and should be + redrawn */ + SDL_WINDOWEVENT_MOVED, /**< Window has been moved to data1, data2 + */ + SDL_WINDOWEVENT_RESIZED, /**< Window has been resized to data1xdata2 */ + SDL_WINDOWEVENT_SIZE_CHANGED, /**< The window size has changed, either as a result of an API call or through the system or user changing the window size. */ + SDL_WINDOWEVENT_MINIMIZED, /**< Window has been minimized */ + SDL_WINDOWEVENT_MAXIMIZED, /**< Window has been maximized */ + SDL_WINDOWEVENT_RESTORED, /**< Window has been restored to normal size + and position */ + SDL_WINDOWEVENT_ENTER, /**< Window has gained mouse focus */ + SDL_WINDOWEVENT_LEAVE, /**< Window has lost mouse focus */ + SDL_WINDOWEVENT_FOCUS_GAINED, /**< Window has gained keyboard focus */ + SDL_WINDOWEVENT_FOCUS_LOST, /**< Window has lost keyboard focus */ + SDL_WINDOWEVENT_CLOSE /**< The window manager requests that the + window be closed */ +} SDL_WindowEventID; + +/** + * \brief An opaque handle to an OpenGL context. + */ +typedef void *SDL_GLContext; + +/** + * \brief OpenGL configuration attributes + */ +typedef enum +{ + SDL_GL_RED_SIZE, + SDL_GL_GREEN_SIZE, + SDL_GL_BLUE_SIZE, + SDL_GL_ALPHA_SIZE, + SDL_GL_BUFFER_SIZE, + SDL_GL_DOUBLEBUFFER, + SDL_GL_DEPTH_SIZE, + SDL_GL_STENCIL_SIZE, + SDL_GL_ACCUM_RED_SIZE, + SDL_GL_ACCUM_GREEN_SIZE, + SDL_GL_ACCUM_BLUE_SIZE, + SDL_GL_ACCUM_ALPHA_SIZE, + SDL_GL_STEREO, + SDL_GL_MULTISAMPLEBUFFERS, + SDL_GL_MULTISAMPLESAMPLES, + SDL_GL_ACCELERATED_VISUAL, + SDL_GL_RETAINED_BACKING, + SDL_GL_CONTEXT_MAJOR_VERSION, + SDL_GL_CONTEXT_MINOR_VERSION, + SDL_GL_CONTEXT_EGL, + SDL_GL_CONTEXT_FLAGS, + SDL_GL_CONTEXT_PROFILE_MASK, + SDL_GL_SHARE_WITH_CURRENT_CONTEXT, + SDL_GL_FRAMEBUFFER_SRGB_CAPABLE +} SDL_GLattr; + +typedef enum +{ + SDL_GL_CONTEXT_PROFILE_CORE = 0x0001, + SDL_GL_CONTEXT_PROFILE_COMPATIBILITY = 0x0002, + SDL_GL_CONTEXT_PROFILE_ES = 0x0004 /* GLX_CONTEXT_ES2_PROFILE_BIT_EXT */ +} SDL_GLprofile; + +typedef enum +{ + SDL_GL_CONTEXT_DEBUG_FLAG = 0x0001, + SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG = 0x0002, + SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG = 0x0004, + SDL_GL_CONTEXT_RESET_ISOLATION_FLAG = 0x0008 +} SDL_GLcontextFlag; + + +/* Function prototypes */ + +/** + * \brief Get the number of video drivers compiled into SDL + * + * \sa SDL_GetVideoDriver() + */ +extern DECLSPEC int SDLCALL SDL_GetNumVideoDrivers(void); + +/** + * \brief Get the name of a built in video driver. + * + * \note The video drivers are presented in the order in which they are + * normally checked during initialization. + * + * \sa SDL_GetNumVideoDrivers() + */ +extern DECLSPEC const char *SDLCALL SDL_GetVideoDriver(int index); + +/** + * \brief Initialize the video subsystem, optionally specifying a video driver. + * + * \param driver_name Initialize a specific driver by name, or NULL for the + * default video driver. + * + * \return 0 on success, -1 on error + * + * This function initializes the video subsystem; setting up a connection + * to the window manager, etc, and determines the available display modes + * and pixel formats, but does not initialize a window or graphics mode. + * + * \sa SDL_VideoQuit() + */ +extern DECLSPEC int SDLCALL SDL_VideoInit(const char *driver_name); + +/** + * \brief Shuts down the video subsystem. + * + * This function closes all windows, and restores the original video mode. + * + * \sa SDL_VideoInit() + */ +extern DECLSPEC void SDLCALL SDL_VideoQuit(void); + +/** + * \brief Returns the name of the currently initialized video driver. + * + * \return The name of the current video driver or NULL if no driver + * has been initialized + * + * \sa SDL_GetNumVideoDrivers() + * \sa SDL_GetVideoDriver() + */ +extern DECLSPEC const char *SDLCALL SDL_GetCurrentVideoDriver(void); + +/** + * \brief Returns the number of available video displays. + * + * \sa SDL_GetDisplayBounds() + */ +extern DECLSPEC int SDLCALL SDL_GetNumVideoDisplays(void); + +/** + * \brief Get the name of a display in UTF-8 encoding + * + * \return The name of a display, or NULL for an invalid display index. + * + * \sa SDL_GetNumVideoDisplays() + */ +extern DECLSPEC const char * SDLCALL SDL_GetDisplayName(int displayIndex); + +/** + * \brief Get the desktop area represented by a display, with the primary + * display located at 0,0 + * + * \return 0 on success, or -1 if the index is out of range. + * + * \sa SDL_GetNumVideoDisplays() + */ +extern DECLSPEC int SDLCALL SDL_GetDisplayBounds(int displayIndex, SDL_Rect * rect); + +/** + * \brief Returns the number of available display modes. + * + * \sa SDL_GetDisplayMode() + */ +extern DECLSPEC int SDLCALL SDL_GetNumDisplayModes(int displayIndex); + +/** + * \brief Fill in information about a specific display mode. + * + * \note The display modes are sorted in this priority: + * \li bits per pixel -> more colors to fewer colors + * \li width -> largest to smallest + * \li height -> largest to smallest + * \li refresh rate -> highest to lowest + * + * \sa SDL_GetNumDisplayModes() + */ +extern DECLSPEC int SDLCALL SDL_GetDisplayMode(int displayIndex, int modeIndex, + SDL_DisplayMode * mode); + +/** + * \brief Fill in information about the desktop display mode. + */ +extern DECLSPEC int SDLCALL SDL_GetDesktopDisplayMode(int displayIndex, SDL_DisplayMode * mode); + +/** + * \brief Fill in information about the current display mode. + */ +extern DECLSPEC int SDLCALL SDL_GetCurrentDisplayMode(int displayIndex, SDL_DisplayMode * mode); + + +/** + * \brief Get the closest match to the requested display mode. + * + * \param displayIndex The index of display from which mode should be queried. + * \param mode The desired display mode + * \param closest A pointer to a display mode to be filled in with the closest + * match of the available display modes. + * + * \return The passed in value \c closest, or NULL if no matching video mode + * was available. + * + * The available display modes are scanned, and \c closest is filled in with the + * closest mode matching the requested mode and returned. The mode format and + * refresh_rate default to the desktop mode if they are 0. The modes are + * scanned with size being first priority, format being second priority, and + * finally checking the refresh_rate. If all the available modes are too + * small, then NULL is returned. + * + * \sa SDL_GetNumDisplayModes() + * \sa SDL_GetDisplayMode() + */ +extern DECLSPEC SDL_DisplayMode * SDLCALL SDL_GetClosestDisplayMode(int displayIndex, const SDL_DisplayMode * mode, SDL_DisplayMode * closest); + +/** + * \brief Get the display index associated with a window. + * + * \return the display index of the display containing the center of the + * window, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_GetWindowDisplayIndex(SDL_Window * window); + +/** + * \brief Set the display mode used when a fullscreen window is visible. + * + * By default the window's dimensions and the desktop format and refresh rate + * are used. + * + * \param window The window for which the display mode should be set. + * \param mode The mode to use, or NULL for the default mode. + * + * \return 0 on success, or -1 if setting the display mode failed. + * + * \sa SDL_GetWindowDisplayMode() + * \sa SDL_SetWindowFullscreen() + */ +extern DECLSPEC int SDLCALL SDL_SetWindowDisplayMode(SDL_Window * window, + const SDL_DisplayMode + * mode); + +/** + * \brief Fill in information about the display mode used when a fullscreen + * window is visible. + * + * \sa SDL_SetWindowDisplayMode() + * \sa SDL_SetWindowFullscreen() + */ +extern DECLSPEC int SDLCALL SDL_GetWindowDisplayMode(SDL_Window * window, + SDL_DisplayMode * mode); + +/** + * \brief Get the pixel format associated with the window. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetWindowPixelFormat(SDL_Window * window); + +/** + * \brief Create a window with the specified position, dimensions, and flags. + * + * \param title The title of the window, in UTF-8 encoding. + * \param x The x position of the window, ::SDL_WINDOWPOS_CENTERED, or + * ::SDL_WINDOWPOS_UNDEFINED. + * \param y The y position of the window, ::SDL_WINDOWPOS_CENTERED, or + * ::SDL_WINDOWPOS_UNDEFINED. + * \param w The width of the window. + * \param h The height of the window. + * \param flags The flags for the window, a mask of any of the following: + * ::SDL_WINDOW_FULLSCREEN, ::SDL_WINDOW_OPENGL, + * ::SDL_WINDOW_HIDDEN, ::SDL_WINDOW_BORDERLESS, + * ::SDL_WINDOW_RESIZABLE, ::SDL_WINDOW_MAXIMIZED, + * ::SDL_WINDOW_MINIMIZED, ::SDL_WINDOW_INPUT_GRABBED, + * ::SDL_WINDOW_ALLOW_HIGHDPI. + * + * \return The id of the window created, or zero if window creation failed. + * + * \sa SDL_DestroyWindow() + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_CreateWindow(const char *title, + int x, int y, int w, + int h, Uint32 flags); + +/** + * \brief Create an SDL window from an existing native window. + * + * \param data A pointer to driver-dependent window creation data + * + * \return The id of the window created, or zero if window creation failed. + * + * \sa SDL_DestroyWindow() + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_CreateWindowFrom(const void *data); + +/** + * \brief Get the numeric ID of a window, for logging purposes. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetWindowID(SDL_Window * window); + +/** + * \brief Get a window from a stored ID, or NULL if it doesn't exist. + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_GetWindowFromID(Uint32 id); + +/** + * \brief Get the window flags. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetWindowFlags(SDL_Window * window); + +/** + * \brief Set the title of a window, in UTF-8 format. + * + * \sa SDL_GetWindowTitle() + */ +extern DECLSPEC void SDLCALL SDL_SetWindowTitle(SDL_Window * window, + const char *title); + +/** + * \brief Get the title of a window, in UTF-8 format. + * + * \sa SDL_SetWindowTitle() + */ +extern DECLSPEC const char *SDLCALL SDL_GetWindowTitle(SDL_Window * window); + +/** + * \brief Set the icon for a window. + * + * \param window The window for which the icon should be set. + * \param icon The icon for the window. + */ +extern DECLSPEC void SDLCALL SDL_SetWindowIcon(SDL_Window * window, + SDL_Surface * icon); + +/** + * \brief Associate an arbitrary named pointer with a window. + * + * \param window The window to associate with the pointer. + * \param name The name of the pointer. + * \param userdata The associated pointer. + * + * \return The previous value associated with 'name' + * + * \note The name is case-sensitive. + * + * \sa SDL_GetWindowData() + */ +extern DECLSPEC void* SDLCALL SDL_SetWindowData(SDL_Window * window, + const char *name, + void *userdata); + +/** + * \brief Retrieve the data pointer associated with a window. + * + * \param window The window to query. + * \param name The name of the pointer. + * + * \return The value associated with 'name' + * + * \sa SDL_SetWindowData() + */ +extern DECLSPEC void *SDLCALL SDL_GetWindowData(SDL_Window * window, + const char *name); + +/** + * \brief Set the position of a window. + * + * \param window The window to reposition. + * \param x The x coordinate of the window, ::SDL_WINDOWPOS_CENTERED, or + ::SDL_WINDOWPOS_UNDEFINED. + * \param y The y coordinate of the window, ::SDL_WINDOWPOS_CENTERED, or + ::SDL_WINDOWPOS_UNDEFINED. + * + * \note The window coordinate origin is the upper left of the display. + * + * \sa SDL_GetWindowPosition() + */ +extern DECLSPEC void SDLCALL SDL_SetWindowPosition(SDL_Window * window, + int x, int y); + +/** + * \brief Get the position of a window. + * + * \param window The window to query. + * \param x Pointer to variable for storing the x position, may be NULL + * \param y Pointer to variable for storing the y position, may be NULL + * + * \sa SDL_SetWindowPosition() + */ +extern DECLSPEC void SDLCALL SDL_GetWindowPosition(SDL_Window * window, + int *x, int *y); + +/** + * \brief Set the size of a window's client area. + * + * \param window The window to resize. + * \param w The width of the window, must be >0 + * \param h The height of the window, must be >0 + * + * \note You can't change the size of a fullscreen window, it automatically + * matches the size of the display mode. + * + * \sa SDL_GetWindowSize() + */ +extern DECLSPEC void SDLCALL SDL_SetWindowSize(SDL_Window * window, int w, + int h); + +/** + * \brief Get the size of a window's client area. + * + * \param window The window to query. + * \param w Pointer to variable for storing the width, may be NULL + * \param h Pointer to variable for storing the height, may be NULL + * + * \sa SDL_SetWindowSize() + */ +extern DECLSPEC void SDLCALL SDL_GetWindowSize(SDL_Window * window, int *w, + int *h); + +/** + * \brief Set the minimum size of a window's client area. + * + * \param window The window to set a new minimum size. + * \param min_w The minimum width of the window, must be >0 + * \param min_h The minimum height of the window, must be >0 + * + * \note You can't change the minimum size of a fullscreen window, it + * automatically matches the size of the display mode. + * + * \sa SDL_GetWindowMinimumSize() + * \sa SDL_SetWindowMaximumSize() + */ +extern DECLSPEC void SDLCALL SDL_SetWindowMinimumSize(SDL_Window * window, + int min_w, int min_h); + +/** + * \brief Get the minimum size of a window's client area. + * + * \param window The window to query. + * \param w Pointer to variable for storing the minimum width, may be NULL + * \param h Pointer to variable for storing the minimum height, may be NULL + * + * \sa SDL_GetWindowMaximumSize() + * \sa SDL_SetWindowMinimumSize() + */ +extern DECLSPEC void SDLCALL SDL_GetWindowMinimumSize(SDL_Window * window, + int *w, int *h); + +/** + * \brief Set the maximum size of a window's client area. + * + * \param window The window to set a new maximum size. + * \param max_w The maximum width of the window, must be >0 + * \param max_h The maximum height of the window, must be >0 + * + * \note You can't change the maximum size of a fullscreen window, it + * automatically matches the size of the display mode. + * + * \sa SDL_GetWindowMaximumSize() + * \sa SDL_SetWindowMinimumSize() + */ +extern DECLSPEC void SDLCALL SDL_SetWindowMaximumSize(SDL_Window * window, + int max_w, int max_h); + +/** + * \brief Get the maximum size of a window's client area. + * + * \param window The window to query. + * \param w Pointer to variable for storing the maximum width, may be NULL + * \param h Pointer to variable for storing the maximum height, may be NULL + * + * \sa SDL_GetWindowMinimumSize() + * \sa SDL_SetWindowMaximumSize() + */ +extern DECLSPEC void SDLCALL SDL_GetWindowMaximumSize(SDL_Window * window, + int *w, int *h); + +/** + * \brief Set the border state of a window. + * + * This will add or remove the window's SDL_WINDOW_BORDERLESS flag and + * add or remove the border from the actual window. This is a no-op if the + * window's border already matches the requested state. + * + * \param window The window of which to change the border state. + * \param bordered SDL_FALSE to remove border, SDL_TRUE to add border. + * + * \note You can't change the border state of a fullscreen window. + * + * \sa SDL_GetWindowFlags() + */ +extern DECLSPEC void SDLCALL SDL_SetWindowBordered(SDL_Window * window, + SDL_bool bordered); + +/** + * \brief Show a window. + * + * \sa SDL_HideWindow() + */ +extern DECLSPEC void SDLCALL SDL_ShowWindow(SDL_Window * window); + +/** + * \brief Hide a window. + * + * \sa SDL_ShowWindow() + */ +extern DECLSPEC void SDLCALL SDL_HideWindow(SDL_Window * window); + +/** + * \brief Raise a window above other windows and set the input focus. + */ +extern DECLSPEC void SDLCALL SDL_RaiseWindow(SDL_Window * window); + +/** + * \brief Make a window as large as possible. + * + * \sa SDL_RestoreWindow() + */ +extern DECLSPEC void SDLCALL SDL_MaximizeWindow(SDL_Window * window); + +/** + * \brief Minimize a window to an iconic representation. + * + * \sa SDL_RestoreWindow() + */ +extern DECLSPEC void SDLCALL SDL_MinimizeWindow(SDL_Window * window); + +/** + * \brief Restore the size and position of a minimized or maximized window. + * + * \sa SDL_MaximizeWindow() + * \sa SDL_MinimizeWindow() + */ +extern DECLSPEC void SDLCALL SDL_RestoreWindow(SDL_Window * window); + +/** + * \brief Set a window's fullscreen state. + * + * \return 0 on success, or -1 if setting the display mode failed. + * + * \sa SDL_SetWindowDisplayMode() + * \sa SDL_GetWindowDisplayMode() + */ +extern DECLSPEC int SDLCALL SDL_SetWindowFullscreen(SDL_Window * window, + Uint32 flags); + +/** + * \brief Get the SDL surface associated with the window. + * + * \return The window's framebuffer surface, or NULL on error. + * + * A new surface will be created with the optimal format for the window, + * if necessary. This surface will be freed when the window is destroyed. + * + * \note You may not combine this with 3D or the rendering API on this window. + * + * \sa SDL_UpdateWindowSurface() + * \sa SDL_UpdateWindowSurfaceRects() + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_GetWindowSurface(SDL_Window * window); + +/** + * \brief Copy the window surface to the screen. + * + * \return 0 on success, or -1 on error. + * + * \sa SDL_GetWindowSurface() + * \sa SDL_UpdateWindowSurfaceRects() + */ +extern DECLSPEC int SDLCALL SDL_UpdateWindowSurface(SDL_Window * window); + +/** + * \brief Copy a number of rectangles on the window surface to the screen. + * + * \return 0 on success, or -1 on error. + * + * \sa SDL_GetWindowSurface() + * \sa SDL_UpdateWindowSurfaceRect() + */ +extern DECLSPEC int SDLCALL SDL_UpdateWindowSurfaceRects(SDL_Window * window, + const SDL_Rect * rects, + int numrects); + +/** + * \brief Set a window's input grab mode. + * + * \param window The window for which the input grab mode should be set. + * \param grabbed This is SDL_TRUE to grab input, and SDL_FALSE to release input. + * + * \sa SDL_GetWindowGrab() + */ +extern DECLSPEC void SDLCALL SDL_SetWindowGrab(SDL_Window * window, + SDL_bool grabbed); + +/** + * \brief Get a window's input grab mode. + * + * \return This returns SDL_TRUE if input is grabbed, and SDL_FALSE otherwise. + * + * \sa SDL_SetWindowGrab() + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowGrab(SDL_Window * window); + +/** + * \brief Set the brightness (gamma correction) for a window. + * + * \return 0 on success, or -1 if setting the brightness isn't supported. + * + * \sa SDL_GetWindowBrightness() + * \sa SDL_SetWindowGammaRamp() + */ +extern DECLSPEC int SDLCALL SDL_SetWindowBrightness(SDL_Window * window, float brightness); + +/** + * \brief Get the brightness (gamma correction) for a window. + * + * \return The last brightness value passed to SDL_SetWindowBrightness() + * + * \sa SDL_SetWindowBrightness() + */ +extern DECLSPEC float SDLCALL SDL_GetWindowBrightness(SDL_Window * window); + +/** + * \brief Set the gamma ramp for a window. + * + * \param window The window for which the gamma ramp should be set. + * \param red The translation table for the red channel, or NULL. + * \param green The translation table for the green channel, or NULL. + * \param blue The translation table for the blue channel, or NULL. + * + * \return 0 on success, or -1 if gamma ramps are unsupported. + * + * Set the gamma translation table for the red, green, and blue channels + * of the video hardware. Each table is an array of 256 16-bit quantities, + * representing a mapping between the input and output for that channel. + * The input is the index into the array, and the output is the 16-bit + * gamma value at that index, scaled to the output color precision. + * + * \sa SDL_GetWindowGammaRamp() + */ +extern DECLSPEC int SDLCALL SDL_SetWindowGammaRamp(SDL_Window * window, + const Uint16 * red, + const Uint16 * green, + const Uint16 * blue); + +/** + * \brief Get the gamma ramp for a window. + * + * \param window The window from which the gamma ramp should be queried. + * \param red A pointer to a 256 element array of 16-bit quantities to hold + * the translation table for the red channel, or NULL. + * \param green A pointer to a 256 element array of 16-bit quantities to hold + * the translation table for the green channel, or NULL. + * \param blue A pointer to a 256 element array of 16-bit quantities to hold + * the translation table for the blue channel, or NULL. + * + * \return 0 on success, or -1 if gamma ramps are unsupported. + * + * \sa SDL_SetWindowGammaRamp() + */ +extern DECLSPEC int SDLCALL SDL_GetWindowGammaRamp(SDL_Window * window, + Uint16 * red, + Uint16 * green, + Uint16 * blue); + +/** + * \brief Destroy a window. + */ +extern DECLSPEC void SDLCALL SDL_DestroyWindow(SDL_Window * window); + + +/** + * \brief Returns whether the screensaver is currently enabled (default on). + * + * \sa SDL_EnableScreenSaver() + * \sa SDL_DisableScreenSaver() + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsScreenSaverEnabled(void); + +/** + * \brief Allow the screen to be blanked by a screensaver + * + * \sa SDL_IsScreenSaverEnabled() + * \sa SDL_DisableScreenSaver() + */ +extern DECLSPEC void SDLCALL SDL_EnableScreenSaver(void); + +/** + * \brief Prevent the screen from being blanked by a screensaver + * + * \sa SDL_IsScreenSaverEnabled() + * \sa SDL_EnableScreenSaver() + */ +extern DECLSPEC void SDLCALL SDL_DisableScreenSaver(void); + + +/** + * \name OpenGL support functions + */ +/* @{ */ + +/** + * \brief Dynamically load an OpenGL library. + * + * \param path The platform dependent OpenGL library name, or NULL to open the + * default OpenGL library. + * + * \return 0 on success, or -1 if the library couldn't be loaded. + * + * This should be done after initializing the video driver, but before + * creating any OpenGL windows. If no OpenGL library is loaded, the default + * library will be loaded upon creation of the first OpenGL window. + * + * \note If you do this, you need to retrieve all of the GL functions used in + * your program from the dynamic library using SDL_GL_GetProcAddress(). + * + * \sa SDL_GL_GetProcAddress() + * \sa SDL_GL_UnloadLibrary() + */ +extern DECLSPEC int SDLCALL SDL_GL_LoadLibrary(const char *path); + +/** + * \brief Get the address of an OpenGL function. + */ +extern DECLSPEC void *SDLCALL SDL_GL_GetProcAddress(const char *proc); + +/** + * \brief Unload the OpenGL library previously loaded by SDL_GL_LoadLibrary(). + * + * \sa SDL_GL_LoadLibrary() + */ +extern DECLSPEC void SDLCALL SDL_GL_UnloadLibrary(void); + +/** + * \brief Return true if an OpenGL extension is supported for the current + * context. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GL_ExtensionSupported(const char + *extension); + +/** + * \brief Reset all previously set OpenGL context attributes to their default values + */ +extern DECLSPEC void SDLCALL SDL_GL_ResetAttributes(void); + +/** + * \brief Set an OpenGL window attribute before window creation. + */ +extern DECLSPEC int SDLCALL SDL_GL_SetAttribute(SDL_GLattr attr, int value); + +/** + * \brief Get the actual value for an attribute from the current context. + */ +extern DECLSPEC int SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int *value); + +/** + * \brief Create an OpenGL context for use with an OpenGL window, and make it + * current. + * + * \sa SDL_GL_DeleteContext() + */ +extern DECLSPEC SDL_GLContext SDLCALL SDL_GL_CreateContext(SDL_Window * + window); + +/** + * \brief Set up an OpenGL context for rendering into an OpenGL window. + * + * \note The context must have been created with a compatible window. + */ +extern DECLSPEC int SDLCALL SDL_GL_MakeCurrent(SDL_Window * window, + SDL_GLContext context); + +/** + * \brief Get the currently active OpenGL window. + */ +extern DECLSPEC SDL_Window* SDLCALL SDL_GL_GetCurrentWindow(void); + +/** + * \brief Get the currently active OpenGL context. + */ +extern DECLSPEC SDL_GLContext SDLCALL SDL_GL_GetCurrentContext(void); + +/** + * \brief Get the size of a window's underlying drawable (for use with glViewport). + * + * \param window Window from which the drawable size should be queried + * \param w Pointer to variable for storing the width, may be NULL + * \param h Pointer to variable for storing the height, may be NULL + * + * This may differ from SDL_GetWindowSize if we're rendering to a high-DPI + * drawable, i.e. the window was created with SDL_WINDOW_ALLOW_HIGHDPI on a + * platform with high-DPI support (Apple calls this "Retina"), and not disabled + * by the SDL_HINT_VIDEO_HIGHDPI_DISABLED hint. + * + * \sa SDL_GetWindowSize() + * \sa SDL_CreateWindow() + */ +extern DECLSPEC void SDLCALL SDL_GL_GetDrawableSize(SDL_Window * window, int *w, + int *h); + +/** + * \brief Set the swap interval for the current OpenGL context. + * + * \param interval 0 for immediate updates, 1 for updates synchronized with the + * vertical retrace. If the system supports it, you may + * specify -1 to allow late swaps to happen immediately + * instead of waiting for the next retrace. + * + * \return 0 on success, or -1 if setting the swap interval is not supported. + * + * \sa SDL_GL_GetSwapInterval() + */ +extern DECLSPEC int SDLCALL SDL_GL_SetSwapInterval(int interval); + +/** + * \brief Get the swap interval for the current OpenGL context. + * + * \return 0 if there is no vertical retrace synchronization, 1 if the buffer + * swap is synchronized with the vertical retrace, and -1 if late + * swaps happen immediately instead of waiting for the next retrace. + * If the system can't determine the swap interval, or there isn't a + * valid current context, this will return 0 as a safe default. + * + * \sa SDL_GL_SetSwapInterval() + */ +extern DECLSPEC int SDLCALL SDL_GL_GetSwapInterval(void); + +/** + * \brief Swap the OpenGL buffers for a window, if double-buffering is + * supported. + */ +extern DECLSPEC void SDLCALL SDL_GL_SwapWindow(SDL_Window * window); + +/** + * \brief Delete an OpenGL context. + * + * \sa SDL_GL_CreateContext() + */ +extern DECLSPEC void SDLCALL SDL_GL_DeleteContext(SDL_GLContext context); + +/* @} *//* OpenGL support functions */ + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_video_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/begin_code.h b/lib/SDL2/include/begin_code.h new file mode 100644 index 0000000000..f37ee3696e --- /dev/null +++ b/lib/SDL2/include/begin_code.h @@ -0,0 +1,140 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file begin_code.h + * + * This file sets things up for C dynamic library function definitions, + * static inlined functions, and structures aligned at 4-byte alignment. + * If you don't like ugly C preprocessor code, don't look at this file. :) + */ + +/* This shouldn't be nested -- included it around code only. */ +#ifdef _begin_code_h +#error Nested inclusion of begin_code.h +#endif +#define _begin_code_h + +#ifndef SDL_DEPRECATED +# if (__GNUC__ >= 4) /* technically, this arrived in gcc 3.1, but oh well. */ +# define SDL_DEPRECATED __attribute__((deprecated)) +# else +# define SDL_DEPRECATED +# endif +#endif + +/* Some compilers use a special export keyword */ +#ifndef DECLSPEC +# if defined(__WIN32__) || defined(__WINRT__) +# ifdef __BORLANDC__ +# ifdef BUILD_SDL +# define DECLSPEC +# else +# define DECLSPEC __declspec(dllimport) +# endif +# else +# define DECLSPEC __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && __GNUC__ >= 4 +# define DECLSPEC __attribute__ ((visibility("default"))) +# elif defined(__GNUC__) && __GNUC__ >= 2 +# define DECLSPEC __declspec(dllexport) +# else +# define DECLSPEC +# endif +# endif +#endif + +/* By default SDL uses the C calling convention */ +#ifndef SDLCALL +#if (defined(__WIN32__) || defined(__WINRT__)) && !defined(__GNUC__) +#define SDLCALL __cdecl +#else +#define SDLCALL +#endif +#endif /* SDLCALL */ + +/* Removed DECLSPEC on Symbian OS because SDL cannot be a DLL in EPOC */ +#ifdef __SYMBIAN32__ +#undef DECLSPEC +#define DECLSPEC +#endif /* __SYMBIAN32__ */ + +/* Force structure packing at 4 byte alignment. + This is necessary if the header is included in code which has structure + packing set to an alternate value, say for loading structures from disk. + The packing is reset to the previous value in close_code.h + */ +#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__) +#ifdef _MSC_VER +#pragma warning(disable: 4103) +#endif +#ifdef __BORLANDC__ +#pragma nopackwarning +#endif +#ifdef _M_X64 +/* Use 8-byte alignment on 64-bit architectures, so pointers are aligned */ +#pragma pack(push,8) +#else +#pragma pack(push,4) +#endif +#endif /* Compiler needs structure packing set */ + +#ifndef SDL_INLINE +#if defined(__GNUC__) +#define SDL_INLINE __inline__ +#elif defined(_MSC_VER) || defined(__BORLANDC__) || \ + defined(__DMC__) || defined(__SC__) || \ + defined(__WATCOMC__) || defined(__LCC__) || \ + defined(__DECC) +#define SDL_INLINE __inline +#ifndef __inline__ +#define __inline__ __inline +#endif +#else +#define SDL_INLINE inline +#ifndef __inline__ +#define __inline__ inline +#endif +#endif +#endif /* SDL_INLINE not defined */ + +#ifndef SDL_FORCE_INLINE +#if defined(_MSC_VER) +#define SDL_FORCE_INLINE __forceinline +#elif ( (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) ) +#define SDL_FORCE_INLINE __attribute__((always_inline)) static __inline__ +#else +#define SDL_FORCE_INLINE static SDL_INLINE +#endif +#endif /* SDL_FORCE_INLINE not defined */ + +/* Apparently this is needed by several Windows compilers */ +#if !defined(__MACH__) +#ifndef NULL +#ifdef __cplusplus +#define NULL 0 +#else +#define NULL ((void *)0) +#endif +#endif /* NULL */ +#endif /* ! Mac OS X - breaks precompiled headers */ diff --git a/lib/SDL2/include/close_code.h b/lib/SDL2/include/close_code.h new file mode 100644 index 0000000000..9826f14786 --- /dev/null +++ b/lib/SDL2/include/close_code.h @@ -0,0 +1,37 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file close_code.h + * + * This file reverses the effects of begin_code.h and should be included + * after you finish any function and structure declarations in your headers + */ + +#undef _begin_code_h + +/* Reset structure packing at previous byte alignment */ +#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__WATCOMC__) || defined(__BORLANDC__) +#ifdef __BORLANDC__ +#pragma nopackwarning +#endif +#pragma pack(pop) +#endif /* Compiler needs structure packing set */ diff --git a/lib/SDL2/lib/x64/SDL2.lib b/lib/SDL2/lib/x64/SDL2.lib new file mode 100644 index 0000000000000000000000000000000000000000..6faf131fb97eed99ed0d78923112618dee1f2fb5 GIT binary patch literal 113700 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 literal 0 HcmV?d00001 diff --git a/lib/SDL2/lib/x64/SDL2main.lib b/lib/SDL2/lib/x64/SDL2main.lib new file mode 100644 index 0000000000000000000000000000000000000000..699f8f6d80e4daad791121146d4234eda4fabc9d GIT binary patch literal 42824 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�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 literal 0 HcmV?d00001 diff --git a/lib/SDL2/lib/x64/SDL2test.lib b/lib/SDL2/lib/x64/SDL2test.lib new file mode 100644 index 0000000000000000000000000000000000000000..e4d409b4cc2bd9ba2c3f23678d08f04028f5b94d GIT binary patch literal 842536 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 Riiw9nO6J-X2BjS*{y(Xl&kFzm literal 0 HcmV?d00001 diff --git a/lib/SDL2/lib/x86/SDL2.lib b/lib/SDL2/lib/x86/SDL2.lib new file mode 100644 index 0000000000000000000000000000000000000000..88452a90421a005628600f2f5f4e79b488ab5762 GIT binary patch literal 116400 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 Y4Yjvik7>66rBcacYV!*?O3-8af8qy7ivR!s literal 0 HcmV?d00001 diff --git a/lib/SDL2/lib/x86/SDL2main.lib b/lib/SDL2/lib/x86/SDL2main.lib new file mode 100644 index 0000000000000000000000000000000000000000..ad65ae091bf2f64ce9fd634cc34324f3a5cbfc4d GIT binary patch literal 40536 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 literal 0 HcmV?d00001 diff --git a/lib/SDL2/lib/x86/SDL2test.lib b/lib/SDL2/lib/x86/SDL2test.lib new file mode 100644 index 0000000000000000000000000000000000000000..09e11c655d5c67191098e01037eda8e5363aae84 GIT binary patch literal 821670 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 z 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

5JgZ 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 C&h5qk literal 0 HcmV?d00001 diff --git a/lib/libpng/png.c b/lib/libpng/png.c index 0cb4a1d048..4d93dfa913 100644 --- a/lib/libpng/png.c +++ b/lib/libpng/png.c @@ -1,7 +1,7 @@ /* png.c - location for general purpose libpng functions * - * Last changed in libpng 1.6.9 [February 6, 2014] + * Last changed in libpng 1.6.16 [December 22, 2014] * Copyright (c) 1998-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -14,7 +14,7 @@ #include "pngpriv.h" /* Generate a compiler error if there is an old png.h in the search path. */ -typedef png_libpng_version_1_6_10 Your_png_h_is_not_version_1_6_10; +typedef png_libpng_version_1_6_16 Your_png_h_is_not_version_1_6_16; /* Tells libpng that we have already handled the first "num_bytes" bytes * of the PNG file signature. If the PNG data is embedded into another @@ -65,7 +65,7 @@ png_sig_cmp(png_const_bytep sig, png_size_t start, png_size_t num_to_check) return ((int)(memcmp(&sig[start], &png_signature[start], num_to_check))); } -#endif /* PNG_READ_SUPPORTED */ +#endif /* READ */ #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) /* Function to allocate memory for zlib */ @@ -115,7 +115,7 @@ png_calculate_crc(png_structrp png_ptr, png_const_bytep ptr, png_size_t length) { int need_crc = 1; - if (PNG_CHUNK_ANCILLARY(png_ptr->chunk_name)) + if (PNG_CHUNK_ANCILLARY(png_ptr->chunk_name) != 0) { if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) == (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) @@ -124,7 +124,7 @@ png_calculate_crc(png_structrp png_ptr, png_const_bytep ptr, png_size_t length) else /* critical */ { - if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) + if ((png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) != 0) need_crc = 0; } @@ -133,7 +133,7 @@ png_calculate_crc(png_structrp png_ptr, png_const_bytep ptr, png_size_t length) * following cast is safe. 'uInt' may be no more than 16 bits, so it is * necessary to perform a loop here. */ - if (need_crc && length > 0) + if (need_crc != 0 && length > 0) { uLong crc = png_ptr->crc; /* Should never issue a warning */ @@ -165,53 +165,51 @@ png_calculate_crc(png_structrp png_ptr, png_const_bytep ptr, png_size_t length) int png_user_version_check(png_structrp png_ptr, png_const_charp user_png_ver) { - if (user_png_ver) + /* Libpng versions 1.0.0 and later are binary compatible if the version + * string matches through the second '.'; we must recompile any + * applications that use any older library version. + */ + + if (user_png_ver != NULL) { - int i = 0; + int i = -1; + int found_dots = 0; do { - if (user_png_ver[i] != png_libpng_ver[i]) + i++; + if (user_png_ver[i] != PNG_LIBPNG_VER_STRING[i]) png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; - } while (png_libpng_ver[i++]); + if (user_png_ver[i] == '.') + found_dots++; + } while (found_dots < 2 && user_png_ver[i] != 0 && + PNG_LIBPNG_VER_STRING[i] != 0); } else png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; - if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) + if ((png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) != 0) { - /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so - * we must recompile any applications that use any older library version. - * For versions after libpng 1.0, we will be compatible, so we need - * only check the first and third digits (note that when we reach version - * 1.10 we will need to check the fourth symbol, namely user_png_ver[3]). - */ - if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || - (user_png_ver[0] == '1' && (user_png_ver[2] != png_libpng_ver[2] || - user_png_ver[3] != png_libpng_ver[3])) || - (user_png_ver[0] == '0' && user_png_ver[2] < '9')) - { #ifdef PNG_WARNINGS_SUPPORTED - size_t pos = 0; - char m[128]; + size_t pos = 0; + char m[128]; - pos = png_safecat(m, (sizeof m), pos, - "Application built with libpng-"); - pos = png_safecat(m, (sizeof m), pos, user_png_ver); - pos = png_safecat(m, (sizeof m), pos, " but running with "); - pos = png_safecat(m, (sizeof m), pos, png_libpng_ver); - PNG_UNUSED(pos) + pos = png_safecat(m, (sizeof m), pos, + "Application built with libpng-"); + pos = png_safecat(m, (sizeof m), pos, user_png_ver); + pos = png_safecat(m, (sizeof m), pos, " but running with "); + pos = png_safecat(m, (sizeof m), pos, PNG_LIBPNG_VER_STRING); + PNG_UNUSED(pos) - png_warning(png_ptr, m); + png_warning(png_ptr, m); #endif #ifdef PNG_ERROR_NUMBERS_SUPPORTED - png_ptr->flags = 0; + png_ptr->flags = 0; #endif - return 0; - } + return 0; } /* Success return. */ @@ -289,7 +287,7 @@ png_create_png_struct,(png_const_charp user_png_ver, png_voidp error_ptr, # endif /* Call the general version checker (shared with read and write code): */ - if (png_user_version_check(&create_struct, user_png_ver)) + if (png_user_version_check(&create_struct, user_png_ver) != 0) { png_structrp png_ptr = png_voidcast(png_structrp, png_malloc_warn(&create_struct, (sizeof *png_ptr))); @@ -451,32 +449,32 @@ png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask, #ifdef PNG_TEXT_SUPPORTED /* Free text item num or (if num == -1) all text items */ - if ((mask & PNG_FREE_TEXT) & info_ptr->free_me) + if (info_ptr->text != 0 && + ((mask & PNG_FREE_TEXT) & info_ptr->free_me) != 0) { if (num != -1) { - if (info_ptr->text && info_ptr->text[num].key) - { - png_free(png_ptr, info_ptr->text[num].key); - info_ptr->text[num].key = NULL; - } + png_free(png_ptr, info_ptr->text[num].key); + info_ptr->text[num].key = NULL; } else { int i; + for (i = 0; i < info_ptr->num_text; i++) - png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i); + png_free(png_ptr, info_ptr->text[i].key); + png_free(png_ptr, info_ptr->text); info_ptr->text = NULL; - info_ptr->num_text=0; + info_ptr->num_text = 0; } } #endif #ifdef PNG_tRNS_SUPPORTED /* Free any tRNS entry */ - if ((mask & PNG_FREE_TRNS) & info_ptr->free_me) + if (((mask & PNG_FREE_TRNS) & info_ptr->free_me) != 0) { png_free(png_ptr, info_ptr->trans_alpha); info_ptr->trans_alpha = NULL; @@ -486,7 +484,7 @@ png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask, #ifdef PNG_sCAL_SUPPORTED /* Free any sCAL entry */ - if ((mask & PNG_FREE_SCAL) & info_ptr->free_me) + if (((mask & PNG_FREE_SCAL) & info_ptr->free_me) != 0) { png_free(png_ptr, info_ptr->scal_s_width); png_free(png_ptr, info_ptr->scal_s_height); @@ -498,20 +496,20 @@ png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask, #ifdef PNG_pCAL_SUPPORTED /* Free any pCAL entry */ - if ((mask & PNG_FREE_PCAL) & info_ptr->free_me) + if (((mask & PNG_FREE_PCAL) & info_ptr->free_me) != 0) { png_free(png_ptr, info_ptr->pcal_purpose); png_free(png_ptr, info_ptr->pcal_units); info_ptr->pcal_purpose = NULL; info_ptr->pcal_units = NULL; + if (info_ptr->pcal_params != NULL) { - unsigned int i; + int i; + for (i = 0; i < info_ptr->pcal_nparams; i++) - { png_free(png_ptr, info_ptr->pcal_params[i]); - info_ptr->pcal_params[i] = NULL; - } + png_free(png_ptr, info_ptr->pcal_params); info_ptr->pcal_params = NULL; } @@ -521,7 +519,7 @@ png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask, #ifdef PNG_iCCP_SUPPORTED /* Free any profile entry */ - if ((mask & PNG_FREE_ICCP) & info_ptr->free_me) + if (((mask & PNG_FREE_ICCP) & info_ptr->free_me) != 0) { png_free(png_ptr, info_ptr->iccp_name); png_free(png_ptr, info_ptr->iccp_profile); @@ -533,26 +531,28 @@ png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask, #ifdef PNG_sPLT_SUPPORTED /* Free a given sPLT entry, or (if num == -1) all sPLT entries */ - if ((mask & PNG_FREE_SPLT) & info_ptr->free_me) + if (info_ptr->splt_palettes != 0 && + ((mask & PNG_FREE_SPLT) & info_ptr->free_me) != 0) { if (num != -1) { - if (info_ptr->splt_palettes) - { - png_free(png_ptr, info_ptr->splt_palettes[num].name); - png_free(png_ptr, info_ptr->splt_palettes[num].entries); - info_ptr->splt_palettes[num].name = NULL; - info_ptr->splt_palettes[num].entries = NULL; - } + png_free(png_ptr, info_ptr->splt_palettes[num].name); + png_free(png_ptr, info_ptr->splt_palettes[num].entries); + info_ptr->splt_palettes[num].name = NULL; + info_ptr->splt_palettes[num].entries = NULL; } else { - if (info_ptr->splt_palettes_num) + if (info_ptr->splt_palettes_num != 0) { int i; + for (i = 0; i < info_ptr->splt_palettes_num; i++) - png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, (int)i); + { + png_free(png_ptr, info_ptr->splt_palettes[i].name); + png_free(png_ptr, info_ptr->splt_palettes[i].entries); + } png_free(png_ptr, info_ptr->splt_palettes); info_ptr->splt_palettes = NULL; @@ -564,25 +564,23 @@ png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask, #endif #ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED - if ((mask & PNG_FREE_UNKN) & info_ptr->free_me) + if (info_ptr->unknown_chunks != 0 && + ((mask & PNG_FREE_UNKN) & info_ptr->free_me) != 0) { if (num != -1) { - if (info_ptr->unknown_chunks) - { - png_free(png_ptr, info_ptr->unknown_chunks[num].data); - info_ptr->unknown_chunks[num].data = NULL; - } + png_free(png_ptr, info_ptr->unknown_chunks[num].data); + info_ptr->unknown_chunks[num].data = NULL; } else { int i; - if (info_ptr->unknown_chunks_num) + if (info_ptr->unknown_chunks_num != 0) { for (i = 0; i < info_ptr->unknown_chunks_num; i++) - png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, (int)i); + png_free(png_ptr, info_ptr->unknown_chunks[i].data); png_free(png_ptr, info_ptr->unknown_chunks); info_ptr->unknown_chunks = NULL; @@ -594,7 +592,7 @@ png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask, #ifdef PNG_hIST_SUPPORTED /* Free any hIST entry */ - if ((mask & PNG_FREE_HIST) & info_ptr->free_me) + if (((mask & PNG_FREE_HIST) & info_ptr->free_me) != 0) { png_free(png_ptr, info_ptr->hist); info_ptr->hist = NULL; @@ -603,7 +601,7 @@ png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask, #endif /* Free any PLTE entry that was internally allocated */ - if ((mask & PNG_FREE_PLTE) & info_ptr->free_me) + if (((mask & PNG_FREE_PLTE) & info_ptr->free_me) != 0) { png_free(png_ptr, info_ptr->palette); info_ptr->palette = NULL; @@ -613,16 +611,14 @@ png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask, #ifdef PNG_INFO_IMAGE_SUPPORTED /* Free any image bits attached to the info structure */ - if ((mask & PNG_FREE_ROWS) & info_ptr->free_me) + if (((mask & PNG_FREE_ROWS) & info_ptr->free_me) != 0) { - if (info_ptr->row_pointers) + if (info_ptr->row_pointers != 0) { png_uint_32 row; for (row = 0; row < info_ptr->height; row++) - { png_free(png_ptr, info_ptr->row_pointers[row]); - info_ptr->row_pointers[row] = NULL; - } + png_free(png_ptr, info_ptr->row_pointers); info_ptr->row_pointers = NULL; } @@ -635,7 +631,7 @@ png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask, info_ptr->free_me &= ~mask; } -#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ +#endif /* READ || WRITE */ /* This function returns a pointer to the io_ptr associated with the user * functions. The application should free any memory associated with this @@ -750,7 +746,7 @@ png_convert_to_rfc1123(png_structrp png_ptr, png_const_timep ptime) if (png_ptr != NULL) { /* The only failure above if png_ptr != NULL is from an invalid ptime */ - if (!png_convert_to_rfc1123_buffer(png_ptr->time_buffer, ptime)) + if (png_convert_to_rfc1123_buffer(png_ptr->time_buffer, ptime) == 0) png_warning(png_ptr, "Ignoring invalid time value"); else @@ -760,9 +756,9 @@ png_convert_to_rfc1123(png_structrp png_ptr, png_const_timep ptime) return NULL; } # endif -# endif /* PNG_TIME_RFC1123_SUPPORTED */ +# endif /* TIME_RFC1123 */ -#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ +#endif /* READ || WRITE */ png_const_charp PNGAPI png_get_copyright(png_const_structrp png_ptr) @@ -773,13 +769,13 @@ png_get_copyright(png_const_structrp png_ptr) #else # ifdef __STDC__ return PNG_STRING_NEWLINE \ - "libpng version 1.6.10 - March 6, 2014" PNG_STRING_NEWLINE \ + "libpng version 1.6.16 - December 22, 2014" PNG_STRING_NEWLINE \ "Copyright (c) 1998-2014 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \ "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \ "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \ PNG_STRING_NEWLINE; # else - return "libpng version 1.6.10 - March 6, 2014\ + return "libpng version 1.6.16 - December 22, 2014\ Copyright (c) 1998-2014 Glenn Randers-Pehrson\ Copyright (c) 1996-1997 Andreas Dilger\ Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc."; @@ -904,7 +900,7 @@ png_handle_as_unknown(png_const_structrp png_ptr, png_const_bytep chunk_name) { p -= 5; - if (!memcmp(chunk_name, p, 4)) + if (memcmp(chunk_name, p, 4) == 0) return p[4]; } while (p > p_end); @@ -941,7 +937,7 @@ png_reset_zstream(png_structrp png_ptr) /* WARNING: this resets the window bits to the maximum! */ return (inflateReset(&png_ptr->zstream)); } -#endif /* PNG_READ_SUPPORTED */ +#endif /* READ */ /* This function was added to libpng-1.0.7 */ png_uint_32 PNGAPI @@ -1046,8 +1042,8 @@ png_colorspace_check_gamma(png_const_structrp png_ptr, png_fixed_point gtest; if ((colorspace->flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 && - (!png_muldiv(>est, colorspace->gamma, PNG_FP_1, gAMA) || - png_gamma_significant(gtest))) + (png_muldiv(>est, colorspace->gamma, PNG_FP_1, gAMA) == 0 || + png_gamma_significant(gtest) != 0)) { /* Either this is an sRGB image, in which case the calculated gamma * approximation should match, or this is an image with a profile and the @@ -1079,7 +1075,7 @@ png_colorspace_set_gamma(png_const_structrp png_ptr, png_colorspacerp colorspace, png_fixed_point gAMA) { /* Changed in libpng-1.5.4 to limit the values to ensure overflow can't - * occur. Since the fixed point representation is assymetrical it is + * occur. Since the fixed point representation is asymetrical it is * possible for 1/gamma to overflow the limit of 21474 and this means the * gamma value must be at least 5/100000 and hence at most 20000.0. For * safety the limits here are a little narrower. The values are 0.00016 to @@ -1102,12 +1098,13 @@ png_colorspace_set_gamma(png_const_structrp png_ptr, # endif /* Do nothing if the colorspace is already invalid */ - else if (colorspace->flags & PNG_COLORSPACE_INVALID) + else if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0) return; else { - if (png_colorspace_check_gamma(png_ptr, colorspace, gAMA, 1/*from gAMA*/)) + if (png_colorspace_check_gamma(png_ptr, colorspace, gAMA, + 1/*from gAMA*/) != 0) { /* Store this gamma value. */ colorspace->gamma = gAMA; @@ -1131,7 +1128,7 @@ png_colorspace_set_gamma(png_const_structrp png_ptr, void /* PRIVATE */ png_colorspace_sync_info(png_const_structrp png_ptr, png_inforp info_ptr) { - if (info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) + if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) != 0) { /* Everything is invalid */ info_ptr->valid &= ~(PNG_INFO_gAMA|PNG_INFO_cHRM|PNG_INFO_sRGB| @@ -1152,20 +1149,20 @@ png_colorspace_sync_info(png_const_structrp png_ptr, png_inforp info_ptr) * it; this allows a PNG to contain a profile which matches sRGB and * yet still have that profile retrievable by the application. */ - if (info_ptr->colorspace.flags & PNG_COLORSPACE_MATCHES_sRGB) + if ((info_ptr->colorspace.flags & PNG_COLORSPACE_MATCHES_sRGB) != 0) info_ptr->valid |= PNG_INFO_sRGB; else info_ptr->valid &= ~PNG_INFO_sRGB; - if (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) + if ((info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0) info_ptr->valid |= PNG_INFO_cHRM; else info_ptr->valid &= ~PNG_INFO_cHRM; # endif - if (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) + if ((info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0) info_ptr->valid |= PNG_INFO_gAMA; else @@ -1198,22 +1195,28 @@ png_xy_from_XYZ(png_xy *xy, const png_XYZ *XYZ) png_int_32 d, dwhite, whiteX, whiteY; d = XYZ->red_X + XYZ->red_Y + XYZ->red_Z; - if (!png_muldiv(&xy->redx, XYZ->red_X, PNG_FP_1, d)) return 1; - if (!png_muldiv(&xy->redy, XYZ->red_Y, PNG_FP_1, d)) return 1; + if (png_muldiv(&xy->redx, XYZ->red_X, PNG_FP_1, d) == 0) + return 1; + if (png_muldiv(&xy->redy, XYZ->red_Y, PNG_FP_1, d) == 0) + return 1; dwhite = d; whiteX = XYZ->red_X; whiteY = XYZ->red_Y; d = XYZ->green_X + XYZ->green_Y + XYZ->green_Z; - if (!png_muldiv(&xy->greenx, XYZ->green_X, PNG_FP_1, d)) return 1; - if (!png_muldiv(&xy->greeny, XYZ->green_Y, PNG_FP_1, d)) return 1; + if (png_muldiv(&xy->greenx, XYZ->green_X, PNG_FP_1, d) == 0) + return 1; + if (png_muldiv(&xy->greeny, XYZ->green_Y, PNG_FP_1, d) == 0) + return 1; dwhite += d; whiteX += XYZ->green_X; whiteY += XYZ->green_Y; d = XYZ->blue_X + XYZ->blue_Y + XYZ->blue_Z; - if (!png_muldiv(&xy->bluex, XYZ->blue_X, PNG_FP_1, d)) return 1; - if (!png_muldiv(&xy->bluey, XYZ->blue_Y, PNG_FP_1, d)) return 1; + if (png_muldiv(&xy->bluex, XYZ->blue_X, PNG_FP_1, d) == 0) + return 1; + if (png_muldiv(&xy->bluey, XYZ->blue_Y, PNG_FP_1, d) == 0) + return 1; dwhite += d; whiteX += XYZ->blue_X; whiteY += XYZ->blue_Y; @@ -1221,8 +1224,10 @@ png_xy_from_XYZ(png_xy *xy, const png_XYZ *XYZ) /* The reference white is simply the sum of the end-point (X,Y,Z) vectors, * thus: */ - if (!png_muldiv(&xy->whitex, whiteX, PNG_FP_1, dwhite)) return 1; - if (!png_muldiv(&xy->whitey, whiteY, PNG_FP_1, dwhite)) return 1; + if (png_muldiv(&xy->whitex, whiteX, PNG_FP_1, dwhite) == 0) + return 1; + if (png_muldiv(&xy->whitey, whiteY, PNG_FP_1, dwhite) == 0) + return 1; return 0; } @@ -1319,7 +1324,7 @@ png_XYZ_from_xy(png_XYZ *XYZ, const png_xy *xy) * (1/white-y), so we can immediately see that as white-y approaches 0 the * accuracy inherent in the cHRM chunk drops off substantially. * - * libpng arithmetic: a simple invertion of the above equations + * libpng arithmetic: a simple inversion of the above equations * ------------------------------------------------------------ * * white_scale = 1/white-y @@ -1425,16 +1430,16 @@ png_XYZ_from_xy(png_XYZ *XYZ, const png_xy *xy) /* By the argument, above overflow should be impossible here. The return * value of 2 indicates an internal error to the caller. */ - if (!png_muldiv(&left, xy->greenx-xy->bluex, xy->redy - xy->bluey, 7)) + if (png_muldiv(&left, xy->greenx-xy->bluex, xy->redy - xy->bluey, 7) == 0) return 2; - if (!png_muldiv(&right, xy->greeny-xy->bluey, xy->redx - xy->bluex, 7)) + if (png_muldiv(&right, xy->greeny-xy->bluey, xy->redx - xy->bluex, 7) == 0) return 2; denominator = left - right; /* Now find the red numerator. */ - if (!png_muldiv(&left, xy->greenx-xy->bluex, xy->whitey-xy->bluey, 7)) + if (png_muldiv(&left, xy->greenx-xy->bluex, xy->whitey-xy->bluey, 7) == 0) return 2; - if (!png_muldiv(&right, xy->greeny-xy->bluey, xy->whitex-xy->bluex, 7)) + if (png_muldiv(&right, xy->greeny-xy->bluey, xy->whitex-xy->bluex, 7) == 0) return 2; /* Overflow is possible here and it indicates an extreme set of PNG cHRM @@ -1442,16 +1447,16 @@ png_XYZ_from_xy(png_XYZ *XYZ, const png_xy *xy) * scale value because this allows us to delay the multiplication of white-y * into the denominator, which tends to produce a small number. */ - if (!png_muldiv(&red_inverse, xy->whitey, denominator, left-right) || + if (png_muldiv(&red_inverse, xy->whitey, denominator, left-right) == 0 || red_inverse <= xy->whitey /* r+g+b scales = white scale */) return 1; /* Similarly for green_inverse: */ - if (!png_muldiv(&left, xy->redy-xy->bluey, xy->whitex-xy->bluex, 7)) + if (png_muldiv(&left, xy->redy-xy->bluey, xy->whitex-xy->bluex, 7) == 0) return 2; - if (!png_muldiv(&right, xy->redx-xy->bluex, xy->whitey-xy->bluey, 7)) + if (png_muldiv(&right, xy->redx-xy->bluex, xy->whitey-xy->bluey, 7) == 0) return 2; - if (!png_muldiv(&green_inverse, xy->whitey, denominator, left-right) || + if (png_muldiv(&green_inverse, xy->whitey, denominator, left-right) == 0 || green_inverse <= xy->whitey) return 1; @@ -1459,29 +1464,34 @@ png_XYZ_from_xy(png_XYZ *XYZ, const png_xy *xy) * can still produce 0 for extreme cHRM values. */ blue_scale = png_reciprocal(xy->whitey) - png_reciprocal(red_inverse) - - png_reciprocal(green_inverse); - if (blue_scale <= 0) return 1; + png_reciprocal(green_inverse); + if (blue_scale <= 0) + return 1; /* And fill in the png_XYZ: */ - if (!png_muldiv(&XYZ->red_X, xy->redx, PNG_FP_1, red_inverse)) return 1; - if (!png_muldiv(&XYZ->red_Y, xy->redy, PNG_FP_1, red_inverse)) return 1; - if (!png_muldiv(&XYZ->red_Z, PNG_FP_1 - xy->redx - xy->redy, PNG_FP_1, - red_inverse)) + if (png_muldiv(&XYZ->red_X, xy->redx, PNG_FP_1, red_inverse) == 0) + return 1; + if (png_muldiv(&XYZ->red_Y, xy->redy, PNG_FP_1, red_inverse) == 0) + return 1; + if (png_muldiv(&XYZ->red_Z, PNG_FP_1 - xy->redx - xy->redy, PNG_FP_1, + red_inverse) == 0) return 1; - if (!png_muldiv(&XYZ->green_X, xy->greenx, PNG_FP_1, green_inverse)) + if (png_muldiv(&XYZ->green_X, xy->greenx, PNG_FP_1, green_inverse) == 0) return 1; - if (!png_muldiv(&XYZ->green_Y, xy->greeny, PNG_FP_1, green_inverse)) + if (png_muldiv(&XYZ->green_Y, xy->greeny, PNG_FP_1, green_inverse) == 0) return 1; - if (!png_muldiv(&XYZ->green_Z, PNG_FP_1 - xy->greenx - xy->greeny, PNG_FP_1, - green_inverse)) + if (png_muldiv(&XYZ->green_Z, PNG_FP_1 - xy->greenx - xy->greeny, PNG_FP_1, + green_inverse) == 0) return 1; - if (!png_muldiv(&XYZ->blue_X, xy->bluex, blue_scale, PNG_FP_1)) return 1; - if (!png_muldiv(&XYZ->blue_Y, xy->bluey, blue_scale, PNG_FP_1)) return 1; - if (!png_muldiv(&XYZ->blue_Z, PNG_FP_1 - xy->bluex - xy->bluey, blue_scale, - PNG_FP_1)) + if (png_muldiv(&XYZ->blue_X, xy->bluex, blue_scale, PNG_FP_1) == 0) + return 1; + if (png_muldiv(&XYZ->blue_Y, xy->bluey, blue_scale, PNG_FP_1) == 0) + return 1; + if (png_muldiv(&XYZ->blue_Z, PNG_FP_1 - xy->bluex - xy->bluey, blue_scale, + PNG_FP_1) == 0) return 1; return 0; /*success*/ @@ -1503,24 +1513,35 @@ png_XYZ_normalize(png_XYZ *XYZ) * safe. */ Y = XYZ->red_Y; - if (0x7fffffff - Y < XYZ->green_X) return 1; + if (0x7fffffff - Y < XYZ->green_X) + return 1; Y += XYZ->green_Y; - if (0x7fffffff - Y < XYZ->blue_X) return 1; + if (0x7fffffff - Y < XYZ->blue_X) + return 1; Y += XYZ->blue_Y; if (Y != PNG_FP_1) { - if (!png_muldiv(&XYZ->red_X, XYZ->red_X, PNG_FP_1, Y)) return 1; - if (!png_muldiv(&XYZ->red_Y, XYZ->red_Y, PNG_FP_1, Y)) return 1; - if (!png_muldiv(&XYZ->red_Z, XYZ->red_Z, PNG_FP_1, Y)) return 1; + if (png_muldiv(&XYZ->red_X, XYZ->red_X, PNG_FP_1, Y) == 0) + return 1; + if (png_muldiv(&XYZ->red_Y, XYZ->red_Y, PNG_FP_1, Y) == 0) + return 1; + if (png_muldiv(&XYZ->red_Z, XYZ->red_Z, PNG_FP_1, Y) == 0) + return 1; - if (!png_muldiv(&XYZ->green_X, XYZ->green_X, PNG_FP_1, Y)) return 1; - if (!png_muldiv(&XYZ->green_Y, XYZ->green_Y, PNG_FP_1, Y)) return 1; - if (!png_muldiv(&XYZ->green_Z, XYZ->green_Z, PNG_FP_1, Y)) return 1; + if (png_muldiv(&XYZ->green_X, XYZ->green_X, PNG_FP_1, Y) == 0) + return 1; + if (png_muldiv(&XYZ->green_Y, XYZ->green_Y, PNG_FP_1, Y) == 0) + return 1; + if (png_muldiv(&XYZ->green_Z, XYZ->green_Z, PNG_FP_1, Y) == 0) + return 1; - if (!png_muldiv(&XYZ->blue_X, XYZ->blue_X, PNG_FP_1, Y)) return 1; - if (!png_muldiv(&XYZ->blue_Y, XYZ->blue_Y, PNG_FP_1, Y)) return 1; - if (!png_muldiv(&XYZ->blue_Z, XYZ->blue_Z, PNG_FP_1, Y)) return 1; + if (png_muldiv(&XYZ->blue_X, XYZ->blue_X, PNG_FP_1, Y) == 0) + return 1; + if (png_muldiv(&XYZ->blue_Y, XYZ->blue_Y, PNG_FP_1, Y) == 0) + return 1; + if (png_muldiv(&XYZ->blue_Z, XYZ->blue_Z, PNG_FP_1, Y) == 0) + return 1; } return 0; @@ -1530,14 +1551,16 @@ static int png_colorspace_endpoints_match(const png_xy *xy1, const png_xy *xy2, int delta) { /* Allow an error of +/-0.01 (absolute value) on each chromaticity */ - return !(PNG_OUT_OF_RANGE(xy1->whitex, xy2->whitex,delta) || - PNG_OUT_OF_RANGE(xy1->whitey, xy2->whitey,delta) || - PNG_OUT_OF_RANGE(xy1->redx, xy2->redx, delta) || - PNG_OUT_OF_RANGE(xy1->redy, xy2->redy, delta) || - PNG_OUT_OF_RANGE(xy1->greenx, xy2->greenx,delta) || - PNG_OUT_OF_RANGE(xy1->greeny, xy2->greeny,delta) || - PNG_OUT_OF_RANGE(xy1->bluex, xy2->bluex, delta) || - PNG_OUT_OF_RANGE(xy1->bluey, xy2->bluey, delta)); + if (PNG_OUT_OF_RANGE(xy1->whitex, xy2->whitex,delta) || + PNG_OUT_OF_RANGE(xy1->whitey, xy2->whitey,delta) || + PNG_OUT_OF_RANGE(xy1->redx, xy2->redx, delta) || + PNG_OUT_OF_RANGE(xy1->redy, xy2->redy, delta) || + PNG_OUT_OF_RANGE(xy1->greenx, xy2->greenx,delta) || + PNG_OUT_OF_RANGE(xy1->greeny, xy2->greeny,delta) || + PNG_OUT_OF_RANGE(xy1->bluex, xy2->bluex, delta) || + PNG_OUT_OF_RANGE(xy1->bluey, xy2->bluey, delta)) + return 0; + return 1; } /* Added in libpng-1.6.0, a different check for the validity of a set of cHRM @@ -1558,13 +1581,15 @@ png_colorspace_check_xy(png_XYZ *XYZ, const png_xy *xy) /* As a side-effect this routine also returns the XYZ endpoints. */ result = png_XYZ_from_xy(XYZ, xy); - if (result) return result; + if (result != 0) + return result; result = png_xy_from_XYZ(&xy_test, XYZ); - if (result) return result; + if (result != 0) + return result; if (png_colorspace_endpoints_match(xy, &xy_test, - 5/*actually, the math is pretty accurate*/)) + 5/*actually, the math is pretty accurate*/) != 0) return 0; /* Too much slip */ @@ -1581,10 +1606,12 @@ png_colorspace_check_XYZ(png_xy *xy, png_XYZ *XYZ) png_XYZ XYZtemp; result = png_XYZ_normalize(XYZ); - if (result) return result; + if (result != 0) + return result; result = png_xy_from_XYZ(xy, XYZ); - if (result) return result; + if (result != 0) + return result; XYZtemp = *XYZ; return png_colorspace_check_xy(&XYZtemp, xy); @@ -1605,19 +1632,21 @@ png_colorspace_set_xy_and_XYZ(png_const_structrp png_ptr, png_colorspacerp colorspace, const png_xy *xy, const png_XYZ *XYZ, int preferred) { - if (colorspace->flags & PNG_COLORSPACE_INVALID) + if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0) return 0; /* The consistency check is performed on the chromaticities; this factors out * variations because of the normalization (or not) of the end point Y * values. */ - if (preferred < 2 && (colorspace->flags & PNG_COLORSPACE_HAVE_ENDPOINTS)) + if (preferred < 2 && + (colorspace->flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0) { /* The end points must be reasonably close to any we already have. The * following allows an error of up to +/-.001 */ - if (!png_colorspace_endpoints_match(xy, &colorspace->end_points_xy, 100)) + if (png_colorspace_endpoints_match(xy, &colorspace->end_points_xy, + 100) == 0) { colorspace->flags |= PNG_COLORSPACE_INVALID; png_benign_error(png_ptr, "inconsistent chromaticities"); @@ -1625,7 +1654,7 @@ png_colorspace_set_xy_and_XYZ(png_const_structrp png_ptr, } /* Only overwrite with preferred values */ - if (!preferred) + if (preferred == 0) return 1; /* ok, but no change */ } @@ -1636,7 +1665,7 @@ png_colorspace_set_xy_and_XYZ(png_const_structrp png_ptr, /* The end points are normally quoted to two decimal digits, so allow +/-0.01 * on this test. */ - if (png_colorspace_endpoints_match(xy, &sRGB_xy, 1000)) + if (png_colorspace_endpoints_match(xy, &sRGB_xy, 1000) != 0) colorspace->flags |= PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB; else @@ -1764,7 +1793,7 @@ png_icc_profile_error(png_const_structrp png_ptr, png_colorspacerp colorspace, pos = png_safecat(message, (sizeof message), 0, "profile '"); /* 9 chars */ pos = png_safecat(message, pos+79, pos, name); /* Truncate to 79 chars */ pos = png_safecat(message, (sizeof message), pos, "': "); /* +2 = 90 */ - if (is_ICC_signature(value)) + if (is_ICC_signature(value) != 0) { /* So 'value' is at most 4 bytes and the following cast is safe */ png_icc_tag_name(message+pos, (png_uint_32)value); @@ -1788,7 +1817,7 @@ png_icc_profile_error(png_const_structrp png_ptr, png_colorspacerp colorspace, PNG_UNUSED(pos) /* This is recoverable, but make it unconditionally an app_error on write to - * avoid writing invalid ICC profiles into PNG files. (I.e. we handle them + * avoid writing invalid ICC profiles into PNG files (i.e., we handle them * on read, with a warning, but on write unless the app turns off * application errors the PNG won't be written.) */ @@ -1807,7 +1836,7 @@ png_colorspace_set_sRGB(png_const_structrp png_ptr, png_colorspacerp colorspace, /* sRGB sets known gamma, end points and (from the chunk) intent. */ /* IMPORTANT: these are not necessarily the values found in an ICC profile * because ICC profiles store values adapted to a D50 environment; it is - * expected that the ICC profile mediaWhitePointTag will be D50, see the + * expected that the ICC profile mediaWhitePointTag will be D50; see the * checks and code elsewhere to understand this better. * * These XYZ values, which are accurate to 5dp, produce rgb to gray @@ -1825,7 +1854,7 @@ png_colorspace_set_sRGB(png_const_structrp png_ptr, png_colorspacerp colorspace, }; /* Do nothing if the colorspace is already invalidated. */ - if (colorspace->flags & PNG_COLORSPACE_INVALID) + if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0) return 0; /* Check the intent, then check for existing settings. It is valid for the @@ -1906,10 +1935,6 @@ png_icc_check_length(png_const_structrp png_ptr, png_colorspacerp colorspace, return png_icc_profile_error(png_ptr, colorspace, name, profile_length, "too short"); - if (profile_length & 3) - return png_icc_profile_error(png_ptr, colorspace, name, profile_length, - "invalid length"); - return 1; } @@ -1930,6 +1955,11 @@ png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace, return png_icc_profile_error(png_ptr, colorspace, name, temp, "length does not match profile"); + temp = (png_uint_32) (*(profile+8)); + if (temp > 3 && (profile_length & 3)) + return png_icc_profile_error(png_ptr, colorspace, name, profile_length, + "invalid length"); + temp = png_get_uint_32(profile+128); /* tag count: 12 bytes/tag */ if (temp > 357913930 || /* (2^32-4-132)/12: maximum possible tag count */ profile_length < 132+12*temp) /* truncated tag table */ @@ -2003,13 +2033,13 @@ png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace, switch (temp) { case 0x52474220: /* 'RGB ' */ - if (!(color_type & PNG_COLOR_MASK_COLOR)) + if ((color_type & PNG_COLOR_MASK_COLOR) == 0) return png_icc_profile_error(png_ptr, colorspace, name, temp, "RGB color space not permitted on grayscale PNG"); break; case 0x47524159: /* 'GRAY' */ - if (color_type & PNG_COLOR_MASK_COLOR) + if ((color_type & PNG_COLOR_MASK_COLOR) != 0) return png_icc_profile_error(png_ptr, colorspace, name, temp, "Gray color space not permitted on RGB PNG"); break; @@ -2044,7 +2074,7 @@ png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace, "invalid embedded Abstract ICC profile"); case 0x6C696E6B: /* 'link' */ - /* DeviceLink profiles cannnot be interpreted in a non-device specific + /* DeviceLink profiles cannot be interpreted in a non-device specific * fashion, if an app uses the AToB0Tag in the profile the results are * undefined unless the result is sent to the intended device, * therefore a DeviceLink profile should not be found embedded in a @@ -2055,7 +2085,7 @@ png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace, case 0x6E6D636C: /* 'nmcl' */ /* A NamedColor profile is also device specific, however it doesn't - * contain an AToB0 tag that is open to misintrepretation. Almost + * contain an AToB0 tag that is open to misinterpretation. Almost * certainly it will fail the tests below. */ (void)png_icc_profile_error(png_ptr, NULL, name, temp, @@ -2136,7 +2166,7 @@ png_icc_check_tag_table(png_const_structrp png_ptr, png_colorspacerp colorspace, return 1; /* success, maybe with warnings */ } -#ifdef PNG_sRGB_SUPPORTED +#if defined(PNG_sRGB_SUPPORTED) && PNG_sRGB_PROFILE_CHECKS >= 0 /* Information about the known ICC sRGB profiles */ static const struct { @@ -2210,6 +2240,7 @@ png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr, * by sRGB (but maybe defined by a later ICC specification) the read of * the profile will fail at that point. */ + png_uint_32 length = 0; png_uint_32 intent = 0x10000; /* invalid */ #if PNG_sRGB_PROFILE_CHECKS > 1 @@ -2217,6 +2248,13 @@ png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr, #endif unsigned int i; +#ifdef PNG_SET_OPTION_SUPPORTED + /* First see if PNG_SKIP_sRGB_CHECK_PROFILE has been set to "on" */ + if (((png_ptr->options >> PNG_SKIP_sRGB_CHECK_PROFILE) & 3) == + PNG_OPTION_ON) + return 0; +#endif + for (i=0; i < (sizeof png_sRGB_checks) / (sizeof png_sRGB_checks[0]); ++i) { if (png_get_uint_32(profile+84) == png_sRGB_checks[i].md5[0] && @@ -2229,7 +2267,7 @@ png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr, * are not used by default if there is an MD5!) */ # if PNG_sRGB_PROFILE_CHECKS == 0 - if (png_sRGB_checks[i].have_md5) + if (png_sRGB_checks[i].have_md5 != 0) return 1+png_sRGB_checks[i].is_broken; # endif @@ -2269,7 +2307,7 @@ png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr, if (crc == png_sRGB_checks[i].crc) # endif { - if (png_sRGB_checks[i].is_broken) + if (png_sRGB_checks[i].is_broken != 0) { /* These profiles are known to have bad data that may cause * problems if they are used, therefore attempt to @@ -2284,28 +2322,28 @@ png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr, * the profile is perfectly valid, but it would be nice if * people used the up-to-date ones. */ - else if (!png_sRGB_checks[i].have_md5) + else if (png_sRGB_checks[i].have_md5 == 0) { - png_chunk_report(png_ptr, - "out-of-date sRGB profile with no signature", + png_chunk_report(png_ptr, "out-of-date sRGB profile with" + " no signature", PNG_CHUNK_WARNING); } return 1+png_sRGB_checks[i].is_broken; } } - } # if PNG_sRGB_PROFILE_CHECKS > 0 /* The signature matched, but the profile had been changed in some * way. This probably indicates a data error or uninformed hacking. * Fall through to "no match". */ - png_chunk_report(png_ptr, - "Not recognizing known sRGB profile that has been edited", + png_chunk_report(png_ptr, "Not recognizing known sRGB profile that" + " has been edited", PNG_CHUNK_WARNING); break; # endif + } } } @@ -2321,25 +2359,27 @@ png_icc_set_sRGB(png_const_structrp png_ptr, /* Is this profile one of the known ICC sRGB profiles? If it is, just set * the sRGB information. */ - if (png_compare_ICC_profile_with_sRGB(png_ptr, profile, adler)) +#if PNG_sRGB_PROFILE_CHECKS >= 0 + if (png_compare_ICC_profile_with_sRGB(png_ptr, profile, adler) != 0) +#endif (void)png_colorspace_set_sRGB(png_ptr, colorspace, (int)/*already checked*/png_get_uint_32(profile+64)); } -#endif /* PNG_READ_sRGB_SUPPORTED */ +#endif /* READ_sRGB */ int /* PRIVATE */ png_colorspace_set_ICC(png_const_structrp png_ptr, png_colorspacerp colorspace, png_const_charp name, png_uint_32 profile_length, png_const_bytep profile, int color_type) { - if (colorspace->flags & PNG_COLORSPACE_INVALID) + if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0) return 0; - if (png_icc_check_length(png_ptr, colorspace, name, profile_length) && - png_icc_check_header(png_ptr, colorspace, name, profile_length, profile, - color_type) && - png_icc_check_tag_table(png_ptr, colorspace, name, profile_length, - profile)) + if (png_icc_check_length(png_ptr, colorspace, name, profile_length) != 0 && + png_icc_check_header(png_ptr, colorspace, name, profile_length, profile, + color_type) != 0 && + png_icc_check_tag_table(png_ptr, colorspace, name, profile_length, + profile) != 0) { # ifdef PNG_sRGB_SUPPORTED /* If no sRGB support, don't try storing sRGB information */ @@ -2358,7 +2398,7 @@ void /* PRIVATE */ png_colorspace_set_rgb_coefficients(png_structrp png_ptr) { /* Set the rgb_to_gray coefficients from the colorspace. */ - if (!png_ptr->rgb_to_gray_coefficients_set && + if (png_ptr->rgb_to_gray_coefficients_set == 0 && (png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0) { /* png_set_background has not been called, get the coefficients from the Y @@ -2421,6 +2461,17 @@ png_colorspace_set_rgb_coefficients(png_structrp png_ptr) #endif /* COLORSPACE */ +#ifdef __GNUC__ +/* This exists solely to work round a warning from GNU C. */ +static int /* PRIVATE */ +png_gt(size_t a, size_t b) +{ + return a > b; +} +#else +# define png_gt(a,b) ((a) > (b)) +#endif + void /* PRIVATE */ png_check_IHDR(png_const_structrp png_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, @@ -2435,45 +2486,68 @@ png_check_IHDR(png_const_structrp png_ptr, png_warning(png_ptr, "Image width is zero in IHDR"); error = 1; } - - if (height == 0) + else if (width > PNG_UINT_31_MAX) { - png_warning(png_ptr, "Image height is zero in IHDR"); + png_warning(png_ptr, "Invalid image width in IHDR"); error = 1; } -# ifdef PNG_SET_USER_LIMITS_SUPPORTED - if (width > png_ptr->user_width_max) - -# else - if (width > PNG_USER_WIDTH_MAX) -# endif + else if (png_gt(width, + (PNG_SIZE_MAX >> 3) /* 8-byte RGBA pixels */ + - 48 /* big_row_buf hack */ + - 1 /* filter byte */ + - 7*8 /* rounding width to multiple of 8 pix */ + - 8)) /* extra max_pixel_depth pad */ { - png_warning(png_ptr, "Image width exceeds user limit in IHDR"); + /* The size of the row must be within the limits of this architecture. + * Because the read code can perform arbitrary transformations the + * maximum size is checked here. Because the code in png_read_start_row + * adds extra space "for safety's sake" in several places a conservative + * limit is used here. + * + * NOTE: it would be far better to check the size that is actually used, + * but the effect in the real world is minor and the changes are more + * extensive, therefore much more dangerous and much more difficult to + * write in a way that avoids compiler warnings. + */ + png_warning(png_ptr, "Image width is too large for this architecture"); error = 1; } - -# ifdef PNG_SET_USER_LIMITS_SUPPORTED - if (height > png_ptr->user_height_max) -# else - if (height > PNG_USER_HEIGHT_MAX) -# endif + else { - png_warning(png_ptr, "Image height exceeds user limit in IHDR"); - error = 1; +# ifdef PNG_SET_USER_LIMITS_SUPPORTED + if (width > png_ptr->user_width_max) +# else + if (width > PNG_USER_WIDTH_MAX) +# endif + { + png_warning(png_ptr, "Image width exceeds user limit in IHDR"); + error = 1; + } } - if (width > PNG_UINT_31_MAX) + if (height == 0) { - png_warning(png_ptr, "Invalid image width in IHDR"); + png_warning(png_ptr, "Image height is zero in IHDR"); error = 1; } - - if (height > PNG_UINT_31_MAX) + else if (height > PNG_UINT_31_MAX) { png_warning(png_ptr, "Invalid image height in IHDR"); error = 1; } + else + { +# ifdef PNG_SET_USER_LIMITS_SUPPORTED + if (height > png_ptr->user_height_max) +# else + if (height > PNG_USER_HEIGHT_MAX) +# endif + { + png_warning(png_ptr, "Image height exceeds user limit in IHDR"); + error = 1; + } + } /* Check other values */ if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 && @@ -2521,13 +2595,13 @@ png_check_IHDR(png_const_structrp png_ptr, * 4. The filter_method is 64 and * 5. The color_type is RGB or RGBA */ - if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) && - png_ptr->mng_features_permitted) + if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0 && + png_ptr->mng_features_permitted != 0) png_warning(png_ptr, "MNG features are not allowed in a PNG datastream"); if (filter_type != PNG_FILTER_TYPE_BASE) { - if (!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && + if (!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 && (filter_type == PNG_INTRAPIXEL_DIFFERENCING) && ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) == 0) && (color_type == PNG_COLOR_TYPE_RGB || @@ -2537,7 +2611,7 @@ png_check_IHDR(png_const_structrp png_ptr, error = 1; } - if (png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) + if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0) { png_warning(png_ptr, "Invalid filter method in IHDR"); error = 1; @@ -2597,7 +2671,7 @@ png_check_fp_number(png_const_charp string, png_size_t size, int *statep, switch ((state & PNG_FP_STATE) + (type & PNG_FP_SAW_ANY)) { case PNG_FP_INTEGER + PNG_FP_SAW_SIGN: - if (state & PNG_FP_SAW_ANY) + if ((state & PNG_FP_SAW_ANY) != 0) goto PNG_FP_End; /* not a part of the number */ png_fp_add(state, type); @@ -2605,10 +2679,10 @@ png_check_fp_number(png_const_charp string, png_size_t size, int *statep, case PNG_FP_INTEGER + PNG_FP_SAW_DOT: /* Ok as trailer, ok as lead of fraction. */ - if (state & PNG_FP_SAW_DOT) /* two dots */ + if ((state & PNG_FP_SAW_DOT) != 0) /* two dots */ goto PNG_FP_End; - else if (state & PNG_FP_SAW_DIGIT) /* trailing dot? */ + else if ((state & PNG_FP_SAW_DIGIT) != 0) /* trailing dot? */ png_fp_add(state, type); else @@ -2617,7 +2691,7 @@ png_check_fp_number(png_const_charp string, png_size_t size, int *statep, break; case PNG_FP_INTEGER + PNG_FP_SAW_DIGIT: - if (state & PNG_FP_SAW_DOT) /* delayed fraction */ + if ((state & PNG_FP_SAW_DOT) != 0) /* delayed fraction */ png_fp_set(state, PNG_FP_FRACTION | PNG_FP_SAW_DOT); png_fp_add(state, type | PNG_FP_WAS_VALID); @@ -2655,7 +2729,7 @@ png_check_fp_number(png_const_charp string, png_size_t size, int *statep, break; case PNG_FP_EXPONENT + PNG_FP_SAW_SIGN: - if (state & PNG_FP_SAW_ANY) + if ((state & PNG_FP_SAW_ANY) != 0) goto PNG_FP_End; /* not a part of the number */ png_fp_add(state, PNG_FP_SAW_SIGN); @@ -2698,13 +2772,13 @@ png_check_fp_string(png_const_charp string, png_size_t size) int state=0; png_size_t char_index=0; - if (png_check_fp_number(string, size, &state, &char_index) && + if (png_check_fp_number(string, size, &state, &char_index) != 0 && (char_index == size || string[char_index] == 0)) return state /* must be non-zero - see above */; return 0; /* i.e. fail */ } -#endif /* pCAL or sCAL */ +#endif /* pCAL || sCAL */ #ifdef PNG_sCAL_SUPPORTED # ifdef PNG_FLOATING_POINT_SUPPORTED @@ -2738,7 +2812,7 @@ png_pow10(int power) } while (power > 0); - if (recip) d = 1/d; + if (recip != 0) d = 1/d; } /* else power is 0 and d is 1 */ @@ -2952,8 +3026,9 @@ png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size, if (exp_b10 != (-1)) { - if (exp_b10 == 0) *ascii++ = 46, --size; /* counted - above */ + if (exp_b10 == 0) + *ascii++ = 46, --size; /* counted above */ + --exp_b10; } *ascii++ = (char)(48 + (int)d), ++cdigits; @@ -3261,11 +3336,12 @@ png_muldiv(png_fixed_point_p res, png_fixed_point a, png_int_32 times, if (s00 >= (D >> 1)) ++result; - if (negative) + if (negative != 0) result = -result; /* Check for overflow. */ - if ((negative && result <= 0) || (!negative && result >= 0)) + if ((negative != 0 && result <= 0) || + (negative == 0 && result >= 0)) { *res = result; return 1; @@ -3289,7 +3365,7 @@ png_muldiv_warn(png_const_structrp png_ptr, png_fixed_point a, png_int_32 times, { png_fixed_point result; - if (png_muldiv(&result, a, times, divisor)) + if (png_muldiv(&result, a, times, divisor) != 0) return result; png_warning(png_ptr, "fixed point overflow ignored"); @@ -3310,7 +3386,7 @@ png_reciprocal(png_fixed_point a) #else png_fixed_point res; - if (png_muldiv(&res, 100000, 100000, a)) + if (png_muldiv(&res, 100000, 100000, a) != 0) return res; #endif @@ -3329,7 +3405,7 @@ png_gamma_significant(png_fixed_point gamma_val) #endif #ifdef PNG_READ_GAMMA_SUPPORTED -# ifdef PNG_16BIT_SUPPORTED +#if defined(PNG_16BIT_SUPPORTED) || !defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) /* A local convenience routine. */ static png_fixed_point png_product2(png_fixed_point a, png_fixed_point b) @@ -3345,13 +3421,13 @@ png_product2(png_fixed_point a, png_fixed_point b) # else png_fixed_point res; - if (png_muldiv(&res, a, b, 100000)) + if (png_muldiv(&res, a, b, 100000) != 0) return res; # endif return 0; /* overflow */ } -# endif /* 16BIT */ +#endif /* 16BIT || !FLOATING_ARITHMETIC */ /* The inverse of the above. */ png_fixed_point @@ -3503,6 +3579,7 @@ png_log8bit(unsigned int x) * Zero (257): 0 * End (258): 23499 */ +#ifdef PNG_16BIT_SUPPORTED static png_int_32 png_log16bit(png_uint_32 x) { @@ -3553,14 +3630,15 @@ png_log16bit(png_uint_32 x) /* Safe, because the result can't have more than 20 bits: */ return (png_int_32)((lg2 + 2048) >> 12); } +#endif /* 16BIT */ /* The 'exp()' case must invert the above, taking a 20-bit fixed point * logarithmic value and returning a 16 or 8-bit number as appropriate. In * each case only the low 16 bits are relevant - the fraction - since the * integer bits (the top 4) simply determine a shift. * - * The worst case is the 16-bit distinction between 65535 and 65534, this - * requires perhaps spurious accuracty in the decoding of the logarithm to + * The worst case is the 16-bit distinction between 65535 and 65534. This + * requires perhaps spurious accuracy in the decoding of the logarithm to * distinguish log2(65535/65534.5) - 10^-5 or 17 bits. There is little chance * of getting this accuracy in practice. * @@ -3648,7 +3726,7 @@ png_exp8bit(png_fixed_point lg2) /* Get a 32-bit value: */ png_uint_32 x = png_exp(lg2); - /* Convert the 32-bit value to 0..255 by multiplying by 256-1, note that the + /* Convert the 32-bit value to 0..255 by multiplying by 256-1. Note that the * second, rounding, step can't overflow because of the first, subtraction, * step. */ @@ -3676,13 +3754,37 @@ png_gamma_8bit_correct(unsigned int value, png_fixed_point gamma_val) if (value > 0 && value < 255) { # ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED - double r = floor(255*pow(value/255.,gamma_val*.00001)+.5); + /* 'value' is unsigned, ANSI-C90 requires the compiler to correctly + * convert this to a floating point value. This includes values that + * would overflow if 'value' were to be converted to 'int'. + * + * Apparently GCC, however, does an intermediate conversion to (int) + * on some (ARM) but not all (x86) platforms, possibly because of + * hardware FP limitations. (E.g. if the hardware conversion always + * assumes the integer register contains a signed value.) This results + * in ANSI-C undefined behavior for large values. + * + * Other implementations on the same machine might actually be ANSI-C90 + * conformant and therefore compile spurious extra code for the large + * values. + * + * We can be reasonably sure that an unsigned to float conversion + * won't be faster than an int to float one. Therefore this code + * assumes responsibility for the undefined behavior, which it knows + * can't happen because of the check above. + * + * Note the argument to this routine is an (unsigned int) because, on + * 16-bit platforms, it is assigned a value which might be out of + * range for an (int); that would result in undefined behavior in the + * caller if the *argument* ('value') were to be declared (int). + */ + double r = floor(255*pow((int)/*SAFE*/value/255.,gamma_val*.00001)+.5); return (png_byte)r; # else png_int_32 lg2 = png_log8bit(value); png_fixed_point res; - if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1)) + if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1) != 0) return png_exp8bit(res); /* Overflow. */ @@ -3700,13 +3802,19 @@ png_gamma_16bit_correct(unsigned int value, png_fixed_point gamma_val) if (value > 0 && value < 65535) { # ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED - double r = floor(65535*pow(value/65535.,gamma_val*.00001)+.5); + /* The same (unsigned int)->(double) constraints apply here as above, + * however in this case the (unsigned int) to (int) conversion can + * overflow on an ANSI-C90 compliant system so the cast needs to ensure + * that this is not possible. + */ + double r = floor(65535*pow((png_int_32)value/65535., + gamma_val*.00001)+.5); return (png_uint_16)r; # else png_int_32 lg2 = png_log16bit(value); png_fixed_point res; - if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1)) + if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1) != 0) return png_exp16bit(res); /* Overflow. */ @@ -3754,6 +3862,12 @@ png_build_16bit_table(png_structrp png_ptr, png_uint_16pp *ptable, { /* Various values derived from 'shift': */ PNG_CONST unsigned int num = 1U << (8U - shift); +#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED + /* CSE the division and work round wacky GCC warnings (see the comments + * in png_gamma_8bit_correct for where these come from.) + */ + PNG_CONST double fmax = 1./(((png_int_32)1 << (16U - shift))-1); +#endif PNG_CONST unsigned int max = (1U << (16U - shift))-1U; PNG_CONST unsigned int max_by_2 = 1U << (15U-shift); unsigned int i; @@ -3769,7 +3883,7 @@ png_build_16bit_table(png_structrp png_ptr, png_uint_16pp *ptable, /* The 'threshold' test is repeated here because it can arise for one of * the 16-bit tables even if the others don't hit it. */ - if (png_gamma_significant(gamma_val)) + if (png_gamma_significant(gamma_val) != 0) { /* The old code would overflow at the end and this would cause the * 'pow' function to return a result >1, resulting in an @@ -3785,10 +3899,13 @@ png_build_16bit_table(png_structrp png_ptr, png_uint_16pp *ptable, png_uint_32 ig = (j << (8-shift)) + i; # ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED /* Inline the 'max' scaling operation: */ - double d = floor(65535*pow(ig/(double)max, gamma_val*.00001)+.5); + /* See png_gamma_8bit_correct for why the cast to (int) is + * required here. + */ + double d = floor(65535.*pow(ig*fmax, gamma_val*.00001)+.5); sub_table[j] = (png_uint_16)d; # else - if (shift) + if (shift != 0) ig = (ig * 65535U + max_by_2)/max; sub_table[j] = png_gamma_16bit_correct(ig, gamma_val); @@ -3804,7 +3921,7 @@ png_build_16bit_table(png_structrp png_ptr, png_uint_16pp *ptable, { png_uint_32 ig = (j << (8-shift)) + i; - if (shift) + if (shift != 0) ig = (ig * 65535U + max_by_2)/max; sub_table[j] = (png_uint_16)ig; @@ -3830,7 +3947,7 @@ png_build_16to8_table(png_structrp png_ptr, png_uint_16pp *ptable, /* 'num' is the number of tables and also the number of low bits of low * bits of the input 16-bit value used to select a table. Each table is - * itself index by the high 8 bits of the value. + * itself indexed by the high 8 bits of the value. */ for (i = 0; i < num; i++) table[i] = (png_uint_16p)png_malloc(png_ptr, @@ -3882,7 +3999,7 @@ png_build_16to8_table(png_structrp png_ptr, png_uint_16pp *ptable, /* Build a single 8-bit table: same as the 16-bit case but much simpler (and * typically much faster). Note that libpng currently does no sBIT processing - * (apparently contrary to the spec) so a 256 entry table is always generated. + * (apparently contrary to the spec) so a 256-entry table is always generated. */ static void png_build_8bit_table(png_structrp png_ptr, png_bytepp ptable, @@ -3891,11 +4008,13 @@ png_build_8bit_table(png_structrp png_ptr, png_bytepp ptable, unsigned int i; png_bytep table = *ptable = (png_bytep)png_malloc(png_ptr, 256); - if (png_gamma_significant(gamma_val)) for (i=0; i<256; i++) - table[i] = png_gamma_8bit_correct(i, gamma_val); + if (png_gamma_significant(gamma_val) != 0) + for (i=0; i<256; i++) + table[i] = png_gamma_8bit_correct(i, gamma_val); - else for (i=0; i<256; ++i) - table[i] = (png_byte)i; + else + for (i=0; i<256; ++i) + table[i] = (png_byte)i; } /* Used from png_read_destroy and below to release the memory used by the gamma @@ -3987,7 +4106,7 @@ png_build_gamma_table(png_structrp png_ptr, int bit_depth) #if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \ defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - if (png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY)) + if ((png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY)) != 0) { png_build_8bit_table(png_ptr, &png_ptr->gamma_to_1, png_reciprocal(png_ptr->colorspace.gamma)); @@ -4003,7 +4122,7 @@ png_build_gamma_table(png_structrp png_ptr, int bit_depth) { png_byte shift, sig_bit; - if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) + if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0) { sig_bit = png_ptr->sig_bit.red; @@ -4023,7 +4142,7 @@ png_build_gamma_table(png_structrp png_ptr, int bit_depth) * Where 'iv' is the input color value and 'ov' is the output value - * pow(iv, gamma). * - * Thus the gamma table consists of up to 256 256 entry tables. The table + * Thus the gamma table consists of up to 256 256-entry tables. The table * is selected by the (8-gamma_shift) most significant of the low 8 bits of * the color value then indexed by the upper 8 bits: * @@ -4040,7 +4159,7 @@ png_build_gamma_table(png_structrp png_ptr, int bit_depth) else shift = 0; /* keep all 16 bits */ - if (png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8)) + if ((png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8)) != 0) { /* PNG_MAX_GAMMA_8 is the number of bits to keep - effectively * the significant bits in the *input* when the output will @@ -4060,7 +4179,7 @@ png_build_gamma_table(png_structrp png_ptr, int bit_depth) * 16-bit output because the 8-bit table assumes the result will be reduced * to 8 bits. */ - if (png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8)) + if ((png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8)) != 0) png_build_16to8_table(png_ptr, &png_ptr->gamma_16_table, shift, png_ptr->screen_gamma > 0 ? png_product2(png_ptr->colorspace.gamma, png_ptr->screen_gamma) : PNG_FP_1); @@ -4073,7 +4192,7 @@ png_build_gamma_table(png_structrp png_ptr, int bit_depth) #if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \ defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - if (png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY)) + if ((png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY)) != 0) { png_build_16bit_table(png_ptr, &png_ptr->gamma_16_to_1, shift, png_reciprocal(png_ptr->colorspace.gamma)); @@ -4092,7 +4211,7 @@ png_build_gamma_table(png_structrp png_ptr, int bit_depth) } #endif /* READ_GAMMA */ -/* HARDWARE OPTION SUPPORT */ +/* HARDWARE OR SOFTWARE OPTION SUPPORT */ #ifdef PNG_SET_OPTION_SUPPORTED int PNGAPI png_set_option(png_structrp png_ptr, int option, int onoff) @@ -4131,7 +4250,7 @@ png_set_option(png_structrp png_ptr, int option, int onoff) * * error: -0.513727 - 0.607759, 308 (0.469978%) of readings inexact * - * In all cases the inexact readings are off by one. + * In all cases the inexact readings are only off by one. */ #ifdef PNG_SIMPLIFIED_READ_SUPPORTED @@ -4171,8 +4290,7 @@ const png_uint_16 png_sRGB_table[256] = 57105,57646,58190,58737,59287,59840,60396,60955, 61517,62082,62650,63221,63795,64372,64952,65535 }; - -#endif /* simplified read only */ +#endif /* SIMPLIFIED_READ */ /* The base/delta tables are required for both read and write (but currently * only the simplified versions.) @@ -4300,7 +4418,7 @@ png_image_free_function(png_voidp argument) /* First free any data held in the control structure. */ # ifdef PNG_STDIO_SUPPORTED - if (cp->owned_file) + if (cp->owned_file != 0) { FILE *fp = png_voidcast(FILE*, cp->png_ptr->io_ptr); cp->owned_file = 0; @@ -4324,7 +4442,7 @@ png_image_free_function(png_voidp argument) png_free(c.png_ptr, cp); /* Then the structures, calling the correct API. */ - if (c.for_write) + if (c.for_write != 0) { # ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED png_destroy_write_struct(&c.png_ptr, &c.info_ptr); @@ -4372,4 +4490,4 @@ png_image_error(png_imagep image, png_const_charp error_message) } #endif /* SIMPLIFIED READ/WRITE */ -#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ +#endif /* READ || WRITE */ diff --git a/lib/libpng/png.h b/lib/libpng/png.h index 16d3299aaa..997130d38f 100644 --- a/lib/libpng/png.h +++ b/lib/libpng/png.h @@ -1,7 +1,7 @@ /* png.h - header file for PNG reference library * - * libpng version 1.6.10 - March 6, 2014 + * libpng version 1.6.16, December 22, 2014 * Copyright (c) 1998-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -11,7 +11,7 @@ * Authors and maintainers: * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger - * libpng versions 0.97, January 1998, through 1.6.10 - March 6, 2014: Glenn + * libpng versions 0.97, January 1998, through 1.6.16, December 22, 2014: Glenn * See also "Contributing Authors", below. * * Note about libpng version numbers: @@ -193,8 +193,25 @@ * 1.6.9rc01-02 16 10609 16.so.16.9[.0] * 1.6.9 16 10609 16.so.16.9[.0] * 1.6.10beta01-03 16 10610 16.so.16.10[.0] - * 1.6.10betarc01-04 16 10610 16.so.16.10[.0] - * 1.6.10beta 16 10610 16.so.16.10[.0] + * 1.6.10rc01-03 16 10610 16.so.16.10[.0] + * 1.6.10 16 10610 16.so.16.10[.0] + * 1.6.11beta01-06 16 10611 16.so.16.11[.0] + * 1.6.11rc01-02 16 10611 16.so.16.11[.0] + * 1.6.11 16 10611 16.so.16.11[.0] + * 1.6.12rc01-03 16 10612 16.so.16.12[.0] + * 1.6.12 16 10612 16.so.16.12[.0] + * 1.6.13beta01-04 16 10613 16.so.16.13[.0] + * 1.6.13rc01-02 16 10613 16.so.16.13[.0] + * 1.6.13 16 10613 16.so.16.13[.0] + * 1.6.14beta01-07 16 10614 16.so.16.14[.0] + * 1.6.14rc01-02 16 10614 16.so.16.14[.0] + * 1.6.14 16 10614 16.so.16.14[.0] + * 1.6.15beta01-08 16 10615 16.so.16.15[.0] + * 1.6.15rc01-03 16 10615 16.so.16.15[.0] + * 1.6.15 16 10615 16.so.16.15[.0] + * 1.6.16beta01-03 16 10616 16.so.16.16[.0] + * 1.6.16rc01-02 16 10616 16.so.16.16[.0] + * 1.6.16 16 10616 16.so.16.16[.0] * * Henceforth the source version will match the shared-library major * and minor numbers; the shared-library major version number will be @@ -226,8 +243,8 @@ * * This code is released under the libpng license. * - * libpng versions 1.2.6, August 15, 2004, through 1.6.10, March 6, 2014, are - * Copyright (c) 2004, 2006-2013 Glenn Randers-Pehrson, and are + * libpng versions 1.2.6, August 15, 2004, through 1.6.16, December 22, 2014, are + * Copyright (c) 2004, 2006-2014 Glenn Randers-Pehrson, and are * distributed according to the same disclaimer and license as libpng-1.2.5 * with the following individual added to the list of Contributing Authors: * @@ -338,13 +355,13 @@ * Y2K compliance in libpng: * ========================= * - * March 6, 2014 + * December 22, 2014 * * Since the PNG Development group is an ad-hoc body, we can't make * an official declaration. * * This is your unofficial assurance that libpng from version 0.71 and - * upward through 1.6.10 are Y2K compliant. It is my belief that + * upward through 1.6.16 are Y2K compliant. It is my belief that * earlier versions were also Y2K compliant. * * Libpng only has two year fields. One is a 2-byte unsigned integer @@ -397,16 +414,18 @@ /* This is not the place to learn how to use libpng. The file libpng-manual.txt * describes how to use libpng, and the file example.c summarizes it * with some code on which to build. This file is useful for looking - * at the actual function definitions and structure components. + * at the actual function definitions and structure components. If that + * file has been stripped from your copy of libpng, you can find it at + * * * If you just need to read a PNG file and don't want to read the documentation * skip to the end of this file and read the section entitled 'simplified API'. */ /* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.6.10" +#define PNG_LIBPNG_VER_STRING "1.6.16" #define PNG_HEADER_VERSION_STRING \ - " libpng version 1.6.10 - March 6, 2014\n" + " libpng version 1.6.16 - December 22, 2014\n" #define PNG_LIBPNG_VER_SONUM 16 #define PNG_LIBPNG_VER_DLLNUM 16 @@ -414,7 +433,7 @@ /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */ #define PNG_LIBPNG_VER_MAJOR 1 #define PNG_LIBPNG_VER_MINOR 6 -#define PNG_LIBPNG_VER_RELEASE 10 +#define PNG_LIBPNG_VER_RELEASE 16 /* This should match the numeric part of the final component of * PNG_LIBPNG_VER_STRING, omitting any leading zero: @@ -445,7 +464,7 @@ * version 1.0.0 was mis-numbered 100 instead of 10000). From * version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release */ -#define PNG_LIBPNG_VER 10610 /* 1.6.10 */ +#define PNG_LIBPNG_VER 10616 /* 1.6.16 */ /* Library configuration: these options cannot be changed after * the library has been built. @@ -550,7 +569,7 @@ extern "C" { /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ -typedef char* png_libpng_version_1_6_10; +typedef char* png_libpng_version_1_6_16; /* Basic control structions. Read libpng-manual.txt or libpng.3 for more info. * @@ -1163,7 +1182,7 @@ PNG_EXPORT(24, void, png_convert_from_struct_tm, (png_timep ptime, /* Convert from time_t to png_time. Uses gmtime() */ PNG_EXPORT(25, void, png_convert_from_time_t, (png_timep ptime, time_t ttime)); -#endif /* PNG_CONVERT_tIME_SUPPORTED */ +#endif /* CONVERT_tIME */ #ifdef PNG_READ_EXPAND_SUPPORTED /* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ @@ -1369,7 +1388,7 @@ PNG_EXPORT(39, void, png_set_filler, (png_structrp png_ptr, png_uint_32 filler, /* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */ PNG_EXPORT(40, void, png_set_add_alpha, (png_structrp png_ptr, png_uint_32 filler, int flags)); -#endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */ +#endif /* READ_FILLER || WRITE_FILLER */ #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) /* Swap bytes in 16-bit depth files. */ @@ -1633,7 +1652,7 @@ PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed, (png_structrp png_ptr, int heuristic_method, int num_weights, png_const_fixed_point_p filter_weights, png_const_fixed_point_p filter_costs)) -#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ +#endif /* WRITE_WEIGHTED_FILTER */ /* Heuristic used for row filter selection. These defines should NOT be * changed. @@ -1689,7 +1708,7 @@ PNG_EXPORT(225, void, png_set_text_compression_window_bits, PNG_EXPORT(226, void, png_set_text_compression_method, (png_structrp png_ptr, int method)); -#endif /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */ +#endif /* WRITE_CUSTOMIZE_ZTXT_COMPRESSION */ /* These next functions are called for input/output, memory, and error * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, @@ -1849,7 +1868,6 @@ PNG_EXPORT(219, png_size_t, png_process_data_pause, (png_structrp, int save)); */ PNG_EXPORT(220, png_uint_32, png_process_data_skip, (png_structrp)); -#ifdef PNG_READ_INTERLACING_SUPPORTED /* Function that combines rows. 'new_row' is a flag that should come from * the callback and be non-NULL if anything needs to be done; the library * stores its own version of the new data internally and ignores the passed @@ -1857,8 +1875,7 @@ PNG_EXPORT(220, png_uint_32, png_process_data_skip, (png_structrp)); */ PNG_EXPORT(93, void, png_progressive_combine_row, (png_const_structrp png_ptr, png_bytep old_row, png_const_bytep new_row)); -#endif /* PNG_READ_INTERLACING_SUPPORTED */ -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ +#endif /* PROGRESSIVE_READ */ PNG_EXPORTA(94, png_voidp, png_malloc, (png_const_structrp png_ptr, png_alloc_size_t size), PNG_ALLOCATED); @@ -2059,7 +2076,7 @@ PNG_EXPORT(128, png_int_32, png_get_x_offset_microns, PNG_EXPORT(129, png_int_32, png_get_y_offset_microns, (png_const_structrp png_ptr, png_const_inforp info_ptr)); -#endif /* PNG_EASY_ACCESS_SUPPORTED */ +#endif /* EASY_ACCESS */ #ifdef PNG_READ_SUPPORTED /* Returns pointer to signature string read from PNG header */ @@ -2311,7 +2328,7 @@ PNG_FIXED_EXPORT(213, void, png_set_sCAL_fixed, (png_const_structrp png_ptr, PNG_EXPORT(171, void, png_set_sCAL_s, (png_const_structrp png_ptr, png_inforp info_ptr, int unit, png_const_charp swidth, png_const_charp sheight)); -#endif /* PNG_sCAL_SUPPORTED */ +#endif /* sCAL */ #ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED /* Provide the default handling for all unknown chunks or, optionally, for @@ -2539,8 +2556,8 @@ PNG_FIXED_EXPORT(212, png_fixed_point, png_get_y_offset_inches_fixed, PNG_EXPORT(198, png_uint_32, png_get_pHYs_dpi, (png_const_structrp png_ptr, png_const_inforp info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); -# endif /* PNG_pHYs_SUPPORTED */ -#endif /* PNG_INCH_CONVERSIONS_SUPPORTED */ +# endif /* pHYs */ +#endif /* INCH_CONVERSIONS */ /* Added in libpng-1.4.0 */ #ifdef PNG_IO_STATE_SUPPORTED @@ -2563,7 +2580,7 @@ PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type, # define PNG_IO_CHUNK_CRC 0x0080 /* currently at the chunk crc */ # define PNG_IO_MASK_OP 0x000f /* current operation: reading/writing */ # define PNG_IO_MASK_LOC 0x00f0 /* current location: sig/hdr/data/crc */ -#endif /* ?PNG_IO_STATE_SUPPORTED */ +#endif /* IO_STATE */ /* Interlace support. The following macros are always defined so that if * libpng interlace handling is turned off the macros may be used to handle @@ -2667,7 +2684,7 @@ PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type, (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \ (png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) + \ 32767) / 65535) -#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ +#endif /* READ_COMPOSITE_NODIV */ #ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED PNG_EXPORT(201, png_uint_32, png_get_uint_32, (png_const_bytep buf)); @@ -2737,6 +2754,8 @@ PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i)); # endif #endif +#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) || \ + defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) /******************************************************************************* * SIMPLIFIED API ******************************************************************************* @@ -2808,7 +2827,7 @@ typedef struct # define PNG_IMAGE_WARNING 1 # define PNG_IMAGE_ERROR 2 /* - * The result is a two bit code such that a value more than 1 indicates + * The result is a two-bit code such that a value more than 1 indicates * a failure in the API just called: * * 0 - no warning or error @@ -3093,7 +3112,7 @@ PNG_EXPORT(234, int, png_image_begin_read_from_file, (png_imagep image, PNG_EXPORT(235, int, png_image_begin_read_from_stdio, (png_imagep image, FILE* file)); /* The PNG header is read from the stdio FILE object. */ -#endif /* PNG_STDIO_SUPPORTED */ +#endif /* STDIO */ PNG_EXPORT(236, int, png_image_begin_read_from_memory, (png_imagep image, png_const_voidp memory, png_size_t size)); @@ -3138,7 +3157,7 @@ PNG_EXPORT(238, void, png_image_free, (png_imagep image)); /* Free any data allocated by libpng in image->opaque, setting the pointer to * NULL. May be called at any time after the structure is initialized. */ -#endif /* PNG_SIMPLIFIED_READ_SUPPORTED */ +#endif /* SIMPLIFIED_READ */ #ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED #ifdef PNG_STDIO_SUPPORTED @@ -3184,11 +3203,12 @@ PNG_EXPORT(240, int, png_image_write_to_stdio, (png_imagep image, FILE *file, * * Note that the write API does not support interlacing or sub-8-bit pixels. */ -#endif /* PNG_STDIO_SUPPORTED */ -#endif /* PNG_SIMPLIFIED_WRITE_SUPPORTED */ +#endif /* STDIO */ +#endif /* SIMPLIFIED_WRITE */ /******************************************************************************* * END OF SIMPLIFIED API ******************************************************************************/ +#endif /* SIMPLIFIED_{READ|WRITE} */ #ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED PNG_EXPORT(242, void, png_set_check_for_invalid_index, @@ -3225,7 +3245,8 @@ PNG_EXPORT(243, int, png_get_palette_max, (png_const_structp png_ptr, # define PNG_ARM_NEON 0 /* HARDWARE: ARM Neon SIMD instructions supported */ #endif #define PNG_MAXIMUM_INFLATE_WINDOW 2 /* SOFTWARE: force maximum window */ -#define PNG_OPTION_NEXT 4 /* Next option - numbers must be even */ +#define PNG_SKIP_sRGB_CHECK_PROFILE 4 /* SOFTWARE: Check ICC profile for sRGB */ +#define PNG_OPTION_NEXT 6 /* Next option - numbers must be even */ /* Return values: NOTE: there are four values and 'off' is *not* zero */ #define PNG_OPTION_UNSET 0 /* Unset - defaults to off */ @@ -3235,19 +3256,18 @@ PNG_EXPORT(243, int, png_get_palette_max, (png_const_structp png_ptr, PNG_EXPORT(244, int, png_set_option, (png_structrp png_ptr, int option, int onoff)); -#endif +#endif /* SET_OPTION */ /******************************************************************************* - * END OF HARDWARE OPTIONS + * END OF HARDWARE AND SOFTWARE OPTIONS ******************************************************************************/ -/* Maintainer: Put new public prototypes here ^, in libpng.3, and project - * defs, scripts/pnglibconf.h, and scripts/pnglibconf.h.prebuilt +/* Maintainer: Put new public prototypes here ^, in libpng.3, in project + * defs, and in scripts/symbols.def. */ /* The last ordinal number (this is the *last* one already used; the next - * one to use is one more than this.) Maintainer, remember to add an entry to - * scripts/symbols.def as well. + * one to use is one more than this.) */ #ifdef PNG_EXPORT_LAST_ORDINAL PNG_EXPORT_LAST_ORDINAL(244); diff --git a/lib/libpng/pngconf.h b/lib/libpng/pngconf.h index afc0ead2b6..03615f0e77 100644 --- a/lib/libpng/pngconf.h +++ b/lib/libpng/pngconf.h @@ -1,9 +1,9 @@ /* pngconf.h - machine configurable file for libpng * - * libpng version 1.6.10 - March 6, 2014 + * libpng version 1.6.16,December 22, 2014 * - * Copyright (c) 1998-2013 Glenn Randers-Pehrson + * Copyright (c) 1998-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -361,7 +361,7 @@ * version 1.2.41. Disabling these removes the warnings but may also produce * less efficient code. */ -# if defined(__clang__) +# if defined(__clang__) && defined(__has_attribute) /* Clang defines both __clang__ and __GNUC__. Check __clang__ first. */ # if !defined(PNG_USE_RESULT) && __has_attribute(__warn_unused_result__) # define PNG_USE_RESULT __attribute__((__warn_unused_result__)) diff --git a/lib/libpng/pngerror.c b/lib/libpng/pngerror.c index 5876b477cb..0781866a89 100644 --- a/lib/libpng/pngerror.c +++ b/lib/libpng/pngerror.c @@ -1,7 +1,7 @@ /* pngerror.c - stub functions for i/o and memory allocation * - * Last changed in libpng 1.6.10 [March 6, 2014] + * Last changed in libpng 1.6.15 [November 20, 2014] * Copyright (c) 1998-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -27,7 +27,7 @@ static PNG_FUNCTION(void, png_default_error,PNGARG((png_const_structrp png_ptr, static void /* PRIVATE */ png_default_warning PNGARG((png_const_structrp png_ptr, png_const_charp warning_message)); -#endif /* PNG_WARNINGS_SUPPORTED */ +#endif /* WARNINGS */ /* This function is called whenever there is a fatal error. This function * should not be changed. If there is a need to handle errors differently, @@ -43,8 +43,8 @@ png_error,(png_const_structrp png_ptr, png_const_charp error_message), char msg[16]; if (png_ptr != NULL) { - if (png_ptr->flags& - (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) + if ((png_ptr->flags & + (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0 { if (*error_message == PNG_LITERAL_SHARP) { @@ -54,7 +54,7 @@ png_error,(png_const_structrp png_ptr, png_const_charp error_message), if (error_message[offset] == ' ') break; - if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) + if ((png_ptr->flags & PNG_FLAG_STRIP_ERROR_TEXT) != 0) { int i; for (i = 0; i < offset - 1; i++) @@ -69,7 +69,7 @@ png_error,(png_const_structrp png_ptr, png_const_charp error_message), else { - if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) + if ((png_ptr->flags & PNG_FLAG_STRIP_ERROR_TEXT) != 0) { msg[0] = '0'; msg[1] = '\0'; @@ -103,7 +103,7 @@ png_err,(png_const_structrp png_ptr),PNG_NORETURN) use the default handler, which will not return. */ png_default_error(png_ptr, ""); } -#endif /* PNG_ERROR_TEXT_SUPPORTED */ +#endif /* ERROR_TEXT */ /* Utility to safely appends strings to a buffer. This never errors out so * error checking is not required in the caller. @@ -152,7 +152,7 @@ png_format_number(png_const_charp start, png_charp end, int format, case PNG_NUMBER_FORMAT_fixed: /* Needs five digits (the fraction) */ mincount = 5; - if (output || number % 10 != 0) + if (output != 0 || number % 10 != 0) { *--end = digits[number % 10]; output = 1; @@ -189,13 +189,13 @@ png_format_number(png_const_charp start, png_charp end, int format, ++count; /* Float a fixed number here: */ - if (format == PNG_NUMBER_FORMAT_fixed) if (count == 5) if (end > start) + if ((format == PNG_NUMBER_FORMAT_fixed) && (count == 5) && (end > start)) { /* End of the fraction, but maybe nothing was output? In that case * drop the decimal point. If the number is a true zero handle that * here. */ - if (output) + if (output != 0) *--end = '.'; else if (number == 0) /* and !output */ *--end = '0'; @@ -219,8 +219,8 @@ png_warning(png_const_structrp png_ptr, png_const_charp warning_message) if (png_ptr != NULL) { #ifdef PNG_ERROR_NUMBERS_SUPPORTED - if (png_ptr->flags& - (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) + if ((png_ptr->flags & + (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0) #endif { if (*warning_message == PNG_LITERAL_SHARP) @@ -355,13 +355,13 @@ png_formatted_warning(png_const_structrp png_ptr, png_warning_parameters p, */ png_warning(png_ptr, msg); } -#endif /* PNG_WARNINGS_SUPPORTED */ +#endif /* WARNINGS */ #ifdef PNG_BENIGN_ERRORS_SUPPORTED void PNGAPI png_benign_error(png_const_structrp png_ptr, png_const_charp error_message) { - if (png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) + if ((png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) != 0) { # ifdef PNG_READ_SUPPORTED if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 && @@ -391,7 +391,7 @@ png_benign_error(png_const_structrp png_ptr, png_const_charp error_message) void /* PRIVATE */ png_app_warning(png_const_structrp png_ptr, png_const_charp error_message) { - if (png_ptr->flags & PNG_FLAG_APP_WARNINGS_WARN) + if ((png_ptr->flags & PNG_FLAG_APP_WARNINGS_WARN) != 0) png_warning(png_ptr, error_message); else png_error(png_ptr, error_message); @@ -404,7 +404,7 @@ png_app_warning(png_const_structrp png_ptr, png_const_charp error_message) void /* PRIVATE */ png_app_error(png_const_structrp png_ptr, png_const_charp error_message) { - if (png_ptr->flags & PNG_FLAG_APP_ERRORS_WARN) + if ((png_ptr->flags & PNG_FLAG_APP_ERRORS_WARN) != 0) png_warning(png_ptr, error_message); else png_error(png_ptr, error_message); @@ -415,10 +415,13 @@ png_app_error(png_const_structrp png_ptr, png_const_charp error_message) } #endif /* BENIGN_ERRORS */ +#define PNG_MAX_ERROR_TEXT 196 /* Currently limited by profile_error in png.c */ +#if defined(PNG_WARNINGS_SUPPORTED) || \ + (defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED)) /* These utilities are used internally to build an error message that relates * to the current chunk. The chunk name comes from png_ptr->chunk_name, - * this is used to prefix the message. The message is limited in length - * to 63 bytes, the name characters are output as hex digits wrapped in [] + * which is used to prefix the message. The message is limited in length + * to 63 bytes. The name characters are output as hex digits wrapped in [] * if the character is invalid. */ #define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97)) @@ -427,9 +430,6 @@ static PNG_CONST char png_digit[16] = { 'A', 'B', 'C', 'D', 'E', 'F' }; -#define PNG_MAX_ERROR_TEXT 196 /* Currently limited be profile_error in png.c */ -#if defined(PNG_WARNINGS_SUPPORTED) || \ - (defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED)) static void /* PRIVATE */ png_format_buffer(png_const_structrp png_ptr, png_charp buffer, png_const_charp error_message) @@ -442,7 +442,7 @@ png_format_buffer(png_const_structrp png_ptr, png_charp buffer, png_const_charp int c = (int)(chunk_name >> ishift) & 0xff; ishift -= 8; - if (isnonalpha(c)) + if (isnonalpha(c) != 0) { buffer[iout++] = PNG_LITERAL_LEFT_SQUARE_BRACKET; buffer[iout++] = png_digit[(c & 0xf0) >> 4]; @@ -473,7 +473,7 @@ png_format_buffer(png_const_structrp png_ptr, png_charp buffer, png_const_charp buffer[iout] = '\0'; } } -#endif /* PNG_WARNINGS_SUPPORTED || PNG_ERROR_TEXT_SUPPORTED */ +#endif /* WARNINGS || ERROR_TEXT */ #if defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED) PNG_FUNCTION(void,PNGAPI @@ -490,7 +490,7 @@ png_chunk_error,(png_const_structrp png_ptr, png_const_charp error_message), png_error(png_ptr, msg); } } -#endif /* PNG_READ_SUPPORTED && PNG_ERROR_TEXT_SUPPORTED */ +#endif /* READ && ERROR_TEXT */ #ifdef PNG_WARNINGS_SUPPORTED void PNGAPI @@ -506,7 +506,7 @@ png_chunk_warning(png_const_structrp png_ptr, png_const_charp warning_message) png_warning(png_ptr, msg); } } -#endif /* PNG_WARNINGS_SUPPORTED */ +#endif /* WARNINGS */ #ifdef PNG_READ_SUPPORTED #ifdef PNG_BENIGN_ERRORS_SUPPORTED @@ -514,7 +514,7 @@ void PNGAPI png_chunk_benign_error(png_const_structrp png_ptr, png_const_charp error_message) { - if (png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) + if ((png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) != 0) png_chunk_warning(png_ptr, error_message); else @@ -525,7 +525,7 @@ png_chunk_benign_error(png_const_structrp png_ptr, png_const_charp # endif } #endif -#endif /* PNG_READ_SUPPORTED */ +#endif /* READ */ void /* PRIVATE */ png_chunk_report(png_const_structrp png_ptr, png_const_charp message, int error) @@ -538,7 +538,7 @@ png_chunk_report(png_const_structrp png_ptr, png_const_charp message, int error) * unconditionally does the right thing. */ # if defined(PNG_READ_SUPPORTED) && defined(PNG_WRITE_SUPPORTED) - if (png_ptr->mode & PNG_IS_READ_STRUCT) + if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0) # endif # ifdef PNG_READ_SUPPORTED @@ -552,7 +552,7 @@ png_chunk_report(png_const_structrp png_ptr, png_const_charp message, int error) # endif # if defined(PNG_READ_SUPPORTED) && defined(PNG_WRITE_SUPPORTED) - else if (!(png_ptr->mode & PNG_IS_READ_STRUCT)) + else if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0) # endif # ifdef PNG_WRITE_SUPPORTED @@ -577,11 +577,12 @@ png_fixed_error,(png_const_structrp png_ptr, png_const_charp name),PNG_NORETURN) char msg[fixed_message_ln+PNG_MAX_ERROR_TEXT]; memcpy(msg, fixed_message, fixed_message_ln); iin = 0; - if (name != NULL) while (iin < (PNG_MAX_ERROR_TEXT-1) && name[iin] != 0) - { - msg[fixed_message_ln + iin] = name[iin]; - ++iin; - } + if (name != NULL) + while (iin < (PNG_MAX_ERROR_TEXT-1) && name[iin] != 0) + { + msg[fixed_message_ln + iin] = name[iin]; + ++iin; + } msg[fixed_message_ln + iin] = 0; png_error(png_ptr, msg); } @@ -757,8 +758,12 @@ PNG_FUNCTION(void,PNGAPI png_longjmp,(png_const_structrp png_ptr, int val),PNG_NORETURN) { #ifdef PNG_SETJMP_SUPPORTED - if (png_ptr && png_ptr->longjmp_fn && png_ptr->jmp_buf_ptr) + if (png_ptr != NULL && png_ptr->longjmp_fn != NULL && + png_ptr->jmp_buf_ptr != NULL) png_ptr->longjmp_fn(*png_ptr->jmp_buf_ptr, val); +#else + PNG_UNUSED(png_ptr) + PNG_UNUSED(val) #endif /* If control reaches this point, png_longjmp() must not return. The only @@ -819,7 +824,7 @@ png_default_warning(png_const_structrp png_ptr, png_const_charp warning_message) #endif PNG_UNUSED(png_ptr) /* Make compiler happy */ } -#endif /* PNG_WARNINGS_SUPPORTED */ +#endif /* WARNINGS */ /* This function is called when the application wants to use another method * of handling errors and warnings. Note that the error function MUST NOT @@ -939,7 +944,7 @@ png_safe_execute(png_imagep image_in, int (*function)(png_voidp), png_voidp arg) saved_error_buf = image->opaque->error_buf; result = setjmp(safe_jmpbuf) == 0; - if (result) + if (result != 0) { image->opaque->error_buf = safe_jmpbuf; @@ -949,10 +954,10 @@ png_safe_execute(png_imagep image_in, int (*function)(png_voidp), png_voidp arg) image->opaque->error_buf = saved_error_buf; /* And do the cleanup prior to any failure return. */ - if (!result) + if (result == 0) png_image_free(image); return result; } -#endif /* SIMPLIFIED READ/WRITE */ -#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ +#endif /* SIMPLIFIED READ || SIMPLIFIED_WRITE */ +#endif /* READ || WRITE */ diff --git a/lib/libpng/pngget.c b/lib/libpng/pngget.c index aca63a9589..fce126cd0b 100644 --- a/lib/libpng/pngget.c +++ b/lib/libpng/pngget.c @@ -1,8 +1,8 @@ /* pngget.c - retrieval of values from info struct * - * Last changed in libpng 1.6.1 [March 28, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson + * Last changed in libpng 1.6.15 [November 20, 2014] + * Copyright (c) 1998-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -116,7 +116,8 @@ png_get_x_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp info_ptr) { #ifdef PNG_pHYs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_pHYs) != 0) { png_debug1(1, "in %s retrieval function", "png_get_x_pixels_per_meter"); @@ -124,6 +125,9 @@ png_get_x_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER) return (info_ptr->x_pixels_per_unit); } +#else + PNG_UNUSED(png_ptr) + PNG_UNUSED(info_ptr) #endif return (0); @@ -134,7 +138,8 @@ png_get_y_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp info_ptr) { #ifdef PNG_pHYs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_pHYs) != 0) { png_debug1(1, "in %s retrieval function", "png_get_y_pixels_per_meter"); @@ -142,6 +147,9 @@ png_get_y_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER) return (info_ptr->y_pixels_per_unit); } +#else + PNG_UNUSED(png_ptr) + PNG_UNUSED(info_ptr) #endif return (0); @@ -151,7 +159,8 @@ png_uint_32 PNGAPI png_get_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp info_ptr) { #ifdef PNG_pHYs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_pHYs) != 0) { png_debug1(1, "in %s retrieval function", "png_get_pixels_per_meter"); @@ -159,6 +168,9 @@ png_get_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp info_ptr) info_ptr->x_pixels_per_unit == info_ptr->y_pixels_per_unit) return (info_ptr->x_pixels_per_unit); } +#else + PNG_UNUSED(png_ptr) + PNG_UNUSED(info_ptr) #endif return (0); @@ -170,7 +182,8 @@ png_get_pixel_aspect_ratio(png_const_structrp png_ptr, png_const_inforp info_ptr) { #ifdef PNG_READ_pHYs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_pHYs) != 0) { png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio"); @@ -193,10 +206,11 @@ png_get_pixel_aspect_ratio_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr) { #ifdef PNG_READ_pHYs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs) - && info_ptr->x_pixels_per_unit > 0 && info_ptr->y_pixels_per_unit > 0 - && info_ptr->x_pixels_per_unit <= PNG_UINT_31_MAX - && info_ptr->y_pixels_per_unit <= PNG_UINT_31_MAX) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_pHYs) != 0 && + info_ptr->x_pixels_per_unit > 0 && info_ptr->y_pixels_per_unit > 0 && + info_ptr->x_pixels_per_unit <= PNG_UINT_31_MAX && + info_ptr->y_pixels_per_unit <= PNG_UINT_31_MAX) { png_fixed_point res; @@ -206,7 +220,7 @@ png_get_pixel_aspect_ratio_fixed(png_const_structrp png_ptr, * range of 0..2^31-1; otherwise the cast might overflow. */ if (png_muldiv(&res, (png_int_32)info_ptr->y_pixels_per_unit, PNG_FP_1, - (png_int_32)info_ptr->x_pixels_per_unit)) + (png_int_32)info_ptr->x_pixels_per_unit) != 0) return res; } #else @@ -222,13 +236,17 @@ png_int_32 PNGAPI png_get_x_offset_microns(png_const_structrp png_ptr, png_const_inforp info_ptr) { #ifdef PNG_oFFs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_oFFs) != 0) { png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns"); if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER) return (info_ptr->x_offset); } +#else + PNG_UNUSED(png_ptr) + PNG_UNUSED(info_ptr) #endif return (0); @@ -238,13 +256,17 @@ png_int_32 PNGAPI png_get_y_offset_microns(png_const_structrp png_ptr, png_const_inforp info_ptr) { #ifdef PNG_oFFs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_oFFs) != 0) { png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns"); if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER) return (info_ptr->y_offset); } +#else + PNG_UNUSED(png_ptr) + PNG_UNUSED(info_ptr) #endif return (0); @@ -254,13 +276,17 @@ png_int_32 PNGAPI png_get_x_offset_pixels(png_const_structrp png_ptr, png_const_inforp info_ptr) { #ifdef PNG_oFFs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_oFFs) != 0) { png_debug1(1, "in %s retrieval function", "png_get_x_offset_pixels"); if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL) return (info_ptr->x_offset); } +#else + PNG_UNUSED(png_ptr) + PNG_UNUSED(info_ptr) #endif return (0); @@ -270,13 +296,17 @@ png_int_32 PNGAPI png_get_y_offset_pixels(png_const_structrp png_ptr, png_const_inforp info_ptr) { #ifdef PNG_oFFs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_oFFs) != 0) { png_debug1(1, "in %s retrieval function", "png_get_y_offset_pixels"); if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL) return (info_ptr->y_offset); } +#else + PNG_UNUSED(png_ptr) + PNG_UNUSED(info_ptr) #endif return (0); @@ -307,7 +337,7 @@ ppi_from_ppm(png_uint_32 ppm) */ png_fixed_point result; if (ppm <= PNG_UINT_31_MAX && png_muldiv(&result, (png_int_32)ppm, 127, - 5000)) + 5000) != 0) return result; /* Overflow. */ @@ -393,7 +423,8 @@ png_get_pHYs_dpi(png_const_structrp png_ptr, png_const_inforp info_ptr, { png_uint_32 retval = 0; - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_pHYs) != 0) { png_debug1(1, "in %s retrieval function", "pHYs"); @@ -424,12 +455,12 @@ png_get_pHYs_dpi(png_const_structrp png_ptr, png_const_inforp info_ptr, return (retval); } -#endif /* PNG_pHYs_SUPPORTED */ -#endif /* PNG_INCH_CONVERSIONS_SUPPORTED */ +#endif /* pHYs */ +#endif /* INCH_CONVERSIONS */ /* png_get_channels really belongs in here, too, but it's been around longer */ -#endif /* PNG_EASY_ACCESS_SUPPORTED */ +#endif /* EASY_ACCESS */ png_byte PNGAPI @@ -457,8 +488,9 @@ png_uint_32 PNGAPI png_get_bKGD(png_const_structrp png_ptr, png_inforp info_ptr, png_color_16p *background) { - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) - && background != NULL) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_bKGD) != 0 && + background != NULL) { png_debug1(1, "in %s retrieval function", "bKGD"); @@ -488,7 +520,7 @@ png_get_cHRM(png_const_structrp png_ptr, png_const_inforp info_ptr, * consistent. */ if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS)) + (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0) { png_debug1(1, "in %s retrieval function", "cHRM"); @@ -529,7 +561,7 @@ png_get_cHRM_XYZ(png_const_structrp png_ptr, png_const_inforp info_ptr, double *blue_Z) { if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS)) + (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0) { png_debug1(1, "in %s retrieval function", "cHRM_XYZ(float)"); @@ -577,7 +609,7 @@ png_get_cHRM_XYZ_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr, png_fixed_point *int_blue_Z) { if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS)) + (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0) { png_debug1(1, "in %s retrieval function", "cHRM_XYZ"); @@ -614,7 +646,7 @@ png_get_cHRM_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr, png_debug1(1, "in %s retrieval function", "cHRM"); if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS)) + (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0) { if (white_x != NULL) *white_x = info_ptr->colorspace.end_points_xy.whitex; @@ -649,7 +681,7 @@ png_get_gAMA_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr, png_debug1(1, "in %s retrieval function", "gAMA"); if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) && + (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 && file_gamma != NULL) { *file_gamma = info_ptr->colorspace.gamma; @@ -668,7 +700,7 @@ png_get_gAMA(png_const_structrp png_ptr, png_const_inforp info_ptr, png_debug1(1, "in %s retrieval function", "gAMA(float)"); if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) && + (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 && file_gamma != NULL) { *file_gamma = png_float(png_ptr, info_ptr->colorspace.gamma, @@ -688,8 +720,8 @@ png_get_sRGB(png_const_structrp png_ptr, png_const_inforp info_ptr, { png_debug1(1, "in %s retrieval function", "sRGB"); - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB) - && file_srgb_intent != NULL) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_sRGB) != 0 && file_srgb_intent != NULL) { *file_srgb_intent = info_ptr->colorspace.rendering_intent; return (PNG_INFO_sRGB); @@ -707,9 +739,10 @@ png_get_iCCP(png_const_structrp png_ptr, png_inforp info_ptr, { png_debug1(1, "in %s retrieval function", "iCCP"); - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP) - && name != NULL && compression_type != NULL && profile != NULL && - proflen != NULL) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_iCCP) != 0 && + name != NULL && compression_type != NULL && profile != NULL && + proflen != NULL) { *name = info_ptr->iccp_name; *profile = info_ptr->iccp_profile; @@ -747,8 +780,8 @@ png_get_hIST(png_const_structrp png_ptr, png_inforp info_ptr, { png_debug1(1, "in %s retrieval function", "hIST"); - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) - && hist != NULL) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_hIST) != 0 && hist != NULL) { *hist = info_ptr->hist; return (PNG_INFO_hIST); @@ -803,8 +836,9 @@ png_get_oFFs(png_const_structrp png_ptr, png_const_inforp info_ptr, { png_debug1(1, "in %s retrieval function", "oFFs"); - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs) - && offset_x != NULL && offset_y != NULL && unit_type != NULL) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_oFFs) != 0 && + offset_x != NULL && offset_y != NULL && unit_type != NULL) { *offset_x = info_ptr->x_offset; *offset_y = info_ptr->y_offset; @@ -824,8 +858,9 @@ png_get_pCAL(png_const_structrp png_ptr, png_inforp info_ptr, { png_debug1(1, "in %s retrieval function", "pCAL"); - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL) - && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL && + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_pCAL) != 0 && + purpose != NULL && X0 != NULL && X1 != NULL && type != NULL && nparams != NULL && units != NULL && params != NULL) { *purpose = info_ptr->pcal_purpose; @@ -851,7 +886,7 @@ png_get_sCAL_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr, int *unit, png_fixed_point *width, png_fixed_point *height) { if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_sCAL)) + (info_ptr->valid & PNG_INFO_sCAL) != 0) { *unit = info_ptr->scal_unit; /*TODO: make this work without FP support; the API is currently eliminated @@ -874,7 +909,7 @@ png_get_sCAL(png_const_structrp png_ptr, png_const_inforp info_ptr, int *unit, double *width, double *height) { if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_sCAL)) + (info_ptr->valid & PNG_INFO_sCAL) != 0) { *unit = info_ptr->scal_unit; *width = atof(info_ptr->scal_s_width); @@ -890,7 +925,7 @@ png_get_sCAL_s(png_const_structrp png_ptr, png_const_inforp info_ptr, int *unit, png_charpp width, png_charpp height) { if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_sCAL)) + (info_ptr->valid & PNG_INFO_sCAL) != 0) { *unit = info_ptr->scal_unit; *width = info_ptr->scal_s_width; @@ -912,7 +947,7 @@ png_get_pHYs(png_const_structrp png_ptr, png_const_inforp info_ptr, png_debug1(1, "in %s retrieval function", "pHYs"); if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_pHYs)) + (info_ptr->valid & PNG_INFO_pHYs) != 0) { if (res_x != NULL) { @@ -943,8 +978,8 @@ png_get_PLTE(png_const_structrp png_ptr, png_inforp info_ptr, { png_debug1(1, "in %s retrieval function", "PLTE"); - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE) - && palette != NULL) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_PLTE) != 0 && palette != NULL) { *palette = info_ptr->palette; *num_palette = info_ptr->num_palette; @@ -962,8 +997,8 @@ png_get_sBIT(png_const_structrp png_ptr, png_inforp info_ptr, { png_debug1(1, "in %s retrieval function", "sBIT"); - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT) - && sig_bit != NULL) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_sBIT) != 0 && sig_bit != NULL) { *sig_bit = &(info_ptr->sig_bit); return (PNG_INFO_sBIT); @@ -1006,8 +1041,8 @@ png_get_tIME(png_const_structrp png_ptr, png_inforp info_ptr, { png_debug1(1, "in %s retrieval function", "tIME"); - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME) - && mod_time != NULL) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_tIME) != 0 && mod_time != NULL) { *mod_time = &(info_ptr->mod_time); return (PNG_INFO_tIME); @@ -1023,7 +1058,8 @@ png_get_tRNS(png_const_structrp png_ptr, png_inforp info_ptr, png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color) { png_uint_32 retval = 0; - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_tRNS) != 0) { png_debug1(1, "in %s retrieval function", "tRNS"); @@ -1100,7 +1136,7 @@ png_get_compression_buffer_size(png_const_structrp png_ptr) return 0; # ifdef PNG_WRITE_SUPPORTED - if (png_ptr->mode & PNG_IS_READ_STRUCT) + if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0) # endif { # ifdef PNG_SEQUENTIAL_READ_SUPPORTED @@ -1144,7 +1180,7 @@ png_get_chunk_malloc_max (png_const_structrp png_ptr) { return (png_ptr ? png_ptr->user_chunk_malloc_max : 0); } -#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ +#endif /* SET_USER_LIMITS */ /* These functions were added to libpng 1.4.0 */ #ifdef PNG_IO_STATE_SUPPORTED @@ -1159,7 +1195,7 @@ png_get_io_chunk_type (png_const_structrp png_ptr) { return png_ptr->chunk_name; } -#endif /* ?PNG_IO_STATE_SUPPORTED */ +#endif /* IO_STATE */ #ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED # ifdef PNG_GET_PALETTE_MAX_SUPPORTED @@ -1174,4 +1210,4 @@ png_get_palette_max(png_const_structp png_ptr, png_const_infop info_ptr) # endif #endif -#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ +#endif /* READ || WRITE */ diff --git a/lib/libpng/pnginfo.h b/lib/libpng/pnginfo.h index 26bf26502c..122a90a411 100644 --- a/lib/libpng/pnginfo.h +++ b/lib/libpng/pnginfo.h @@ -121,7 +121,7 @@ struct png_info_def int num_text; /* number of comments read or comments to write */ int max_text; /* current size of text array */ png_textp text; /* array of comments read or comments to write */ -#endif /* PNG_TEXT_SUPPORTED */ +#endif /* TEXT */ #ifdef PNG_tIME_SUPPORTED /* The tIME chunk holds the last time the displayed image data was diff --git a/lib/libpng/pnglibconf.h b/lib/libpng/pnglibconf.h index 83e94e5bed..da3b229215 100644 --- a/lib/libpng/pnglibconf.h +++ b/lib/libpng/pnglibconf.h @@ -1,10 +1,10 @@ -/* libpng 1.6.6 STANDARD API DEFINITION */ +/* libpng 1.6.16 STANDARD API DEFINITION */ /* pnglibconf.h - library build configuration */ -/* Libpng version 1.6.6 - September 16, 2013 */ +/* Libpng version 1.6.16 - December 22, 2014 */ -/* Copyright (c) 1998-2013 Glenn Randers-Pehrson */ +/* Copyright (c) 1998-2014 Glenn Randers-Pehrson */ /* This code is released under the libpng license. */ /* For conditions of distribution and use, see the disclaimer */ @@ -104,7 +104,7 @@ #define PNG_SETJMP_SUPPORTED #define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED #define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED -/*#undef PNG_SET_OPTION_SUPPORTED*/ +#define PNG_SET_OPTION_SUPPORTED #define PNG_SET_UNKNOWN_CHUNKS_SUPPORTED #define PNG_SET_USER_LIMITS_SUPPORTED #define PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED @@ -187,7 +187,6 @@ /* end of options */ /* settings */ #define PNG_API_RULE 0 -#define PNG_CALLOC_SUPPORTED #define PNG_COST_SHIFT 3 #define PNG_DEFAULT_READ_MACROS 1 #define PNG_GAMMA_THRESHOLD_FIXED 5000 @@ -201,6 +200,7 @@ #define PNG_TEXT_Z_DEFAULT_STRATEGY 0 #define PNG_WEIGHT_SHIFT 8 #define PNG_ZBUF_SIZE 8192 +#define PNG_ZLIB_VERNUM 0 /* unknown */ #define PNG_Z_DEFAULT_COMPRESSION (-1) #define PNG_Z_DEFAULT_NOFILTER_STRATEGY 0 #define PNG_Z_DEFAULT_STRATEGY 1 diff --git a/lib/libpng/pngmem.c b/lib/libpng/pngmem.c index 8ee0866f67..d6caf273f1 100644 --- a/lib/libpng/pngmem.c +++ b/lib/libpng/pngmem.c @@ -1,8 +1,8 @@ /* pngmem.c - stub functions for memory allocation * - * Last changed in libpng 1.6.8 [December 19, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson + * Last changed in libpng 1.6.15 [November 20, 2014] + * Copyright (c) 1998-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -199,7 +199,7 @@ png_malloc_default,(png_const_structrp png_ptr, png_alloc_size_t size), return ret; } -#endif /* PNG_USER_MEM_SUPPORTED */ +#endif /* USER_MEM */ /* This function was added at libpng version 1.2.3. The png_malloc_warn() * function will issue a png_warning and return NULL instead of issuing a @@ -244,7 +244,7 @@ png_free_default,(png_const_structrp png_ptr, png_voidp ptr),PNG_DEPRECATED) { if (png_ptr == NULL || ptr == NULL) return; -#endif /* PNG_USER_MEM_SUPPORTED */ +#endif /* USER_MEM */ free(ptr); } @@ -277,5 +277,5 @@ png_get_mem_ptr(png_const_structrp png_ptr) return png_ptr->mem_ptr; } -#endif /* PNG_USER_MEM_SUPPORTED */ -#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ +#endif /* USER_MEM */ +#endif /* READ || WRITE */ diff --git a/lib/libpng/pngpread.c b/lib/libpng/pngpread.c index 6c8404e476..fb40e7db3b 100644 --- a/lib/libpng/pngpread.c +++ b/lib/libpng/pngpread.c @@ -1,7 +1,7 @@ /* pngpread.c - read a png file in push mode * - * Last changed in libpng 1.6.10 [March 6, 2014] + * Last changed in libpng 1.6.15 [November 20, 2014] * Copyright (c) 1998-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -26,6 +26,13 @@ #define PNG_READ_iTXt_MODE 7 #define PNG_ERROR_MODE 8 +#define PNG_PUSH_SAVE_BUFFER_IF_FULL \ +if (png_ptr->push_length + 4 > png_ptr->buffer_size) \ + { png_push_save_buffer(png_ptr); return; } +#define PNG_PUSH_SAVE_BUFFER_IF_LT(N) \ +if (png_ptr->buffer_size < N) \ + { png_push_save_buffer(png_ptr); return; } + void PNGAPI png_process_data(png_structrp png_ptr, png_inforp info_ptr, png_bytep buffer, png_size_t buffer_size) @@ -46,10 +53,10 @@ png_process_data_pause(png_structrp png_ptr, int save) { if (png_ptr != NULL) { - /* It's easiest for the caller if we do the save, then the caller doesn't + /* It's easiest for the caller if we do the save; then the caller doesn't * have to supply the same data again: */ - if (save) + if (save != 0) png_push_save_buffer(png_ptr); else { @@ -189,23 +196,18 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) int keep; /* unknown handling method */ #endif - /* First we make sure we have enough data for the 4 byte chunk name - * and the 4 byte chunk length before proceeding with decoding the + /* First we make sure we have enough data for the 4-byte chunk name + * and the 4-byte chunk length before proceeding with decoding the * chunk data. To fully decode each of these chunks, we also make - * sure we have enough data in the buffer for the 4 byte CRC at the + * sure we have enough data in the buffer for the 4-byte CRC at the * end of every chunk (except IDAT, which is handled separately). */ - if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) + if ((png_ptr->mode & PNG_HAVE_CHUNK_HEADER) == 0) { png_byte chunk_length[4]; png_byte chunk_tag[4]; - if (png_ptr->buffer_size < 8) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_LT(8) png_push_fill_buffer(png_ptr, chunk_length, 4); png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); png_reset_crc(png_ptr); @@ -219,28 +221,28 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) if (chunk_name == png_IDAT) { - if (png_ptr->mode & PNG_AFTER_IDAT) + if ((png_ptr->mode & PNG_AFTER_IDAT) != 0) png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; /* If we reach an IDAT chunk, this means we have read all of the * header chunks, and we can start reading the image (or if this * is called after the image has been read - we have an error). */ - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_error(png_ptr, "Missing IHDR before IDAT"); else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - !(png_ptr->mode & PNG_HAVE_PLTE)) + (png_ptr->mode & PNG_HAVE_PLTE) == 0) png_error(png_ptr, "Missing PLTE before IDAT"); png_ptr->mode |= PNG_HAVE_IDAT; png_ptr->process_mode = PNG_READ_IDAT_MODE; - if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) + if ((png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) == 0) if (png_ptr->push_length == 0) return; - if (png_ptr->mode & PNG_AFTER_IDAT) + if ((png_ptr->mode & PNG_AFTER_IDAT) != 0) png_benign_error(png_ptr, "Too many IDATs found"); } @@ -249,23 +251,13 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) if (png_ptr->push_length != 13) png_error(png_ptr, "Invalid IHDR length"); - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length); } else if (chunk_name == png_IEND) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length); png_ptr->process_mode = PNG_READ_DONE_MODE; @@ -275,12 +267,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED else if ((keep = png_chunk_unknown_handling(png_ptr, chunk_name)) != 0) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length, keep); if (chunk_name == png_PLTE) @@ -290,11 +277,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) else if (chunk_name == png_PLTE) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length); } @@ -313,12 +296,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_gAMA_SUPPORTED else if (png_ptr->chunk_name == png_gAMA) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length); } @@ -326,12 +304,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_sBIT_SUPPORTED else if (png_ptr->chunk_name == png_sBIT) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length); } @@ -339,12 +312,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_cHRM_SUPPORTED else if (png_ptr->chunk_name == png_cHRM) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length); } @@ -352,12 +320,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_sRGB_SUPPORTED else if (chunk_name == png_sRGB) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length); } @@ -365,12 +328,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_iCCP_SUPPORTED else if (png_ptr->chunk_name == png_iCCP) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length); } @@ -378,12 +336,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_sPLT_SUPPORTED else if (chunk_name == png_sPLT) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length); } @@ -391,12 +344,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_tRNS_SUPPORTED else if (chunk_name == png_tRNS) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length); } @@ -404,12 +352,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_bKGD_SUPPORTED else if (chunk_name == png_bKGD) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length); } @@ -417,12 +360,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_hIST_SUPPORTED else if (chunk_name == png_hIST) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length); } @@ -430,12 +368,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_pHYs_SUPPORTED else if (chunk_name == png_pHYs) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length); } @@ -443,12 +376,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_oFFs_SUPPORTED else if (chunk_name == png_oFFs) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length); } #endif @@ -456,12 +384,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_pCAL_SUPPORTED else if (chunk_name == png_pCAL) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length); } @@ -469,12 +392,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_sCAL_SUPPORTED else if (chunk_name == png_sCAL) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length); } @@ -482,12 +400,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_tIME_SUPPORTED else if (chunk_name == png_tIME) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length); } @@ -495,12 +408,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_tEXt_SUPPORTED else if (chunk_name == png_tEXt) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); } @@ -508,12 +416,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_zTXt_SUPPORTED else if (chunk_name == png_zTXt) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); } @@ -521,23 +424,14 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_iTXt_SUPPORTED else if (chunk_name == png_iTXt) { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); } #endif else { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } + PNG_PUSH_SAVE_BUFFER_IF_FULL png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length, PNG_HANDLE_CHUNK_AS_DEFAULT); } @@ -555,7 +449,7 @@ png_push_crc_skip(png_structrp png_ptr, png_uint_32 skip) void /* PRIVATE */ png_push_crc_finish(png_structrp png_ptr) { - if (png_ptr->skip_length && png_ptr->save_buffer_size) + if (png_ptr->skip_length != 0 && png_ptr->save_buffer_size != 0) { png_size_t save_size = png_ptr->save_buffer_size; png_uint_32 skip_length = png_ptr->skip_length; @@ -579,7 +473,7 @@ png_push_crc_finish(png_structrp png_ptr) png_ptr->save_buffer_size -= save_size; png_ptr->save_buffer_ptr += save_size; } - if (png_ptr->skip_length && png_ptr->current_buffer_size) + if (png_ptr->skip_length != 0 && png_ptr->current_buffer_size != 0) { png_size_t save_size = png_ptr->current_buffer_size; png_uint_32 skip_length = png_ptr->skip_length; @@ -600,14 +494,9 @@ png_push_crc_finish(png_structrp png_ptr) png_ptr->current_buffer_size -= save_size; png_ptr->current_buffer_ptr += save_size; } - if (!png_ptr->skip_length) + if (png_ptr->skip_length == 0) { - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_LT(4) png_crc_finish(png_ptr, 0); png_ptr->process_mode = PNG_READ_CHUNK_MODE; } @@ -622,7 +511,7 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) return; ptr = buffer; - if (png_ptr->save_buffer_size) + if (png_ptr->save_buffer_size != 0) { png_size_t save_size; @@ -639,7 +528,7 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) png_ptr->save_buffer_size -= save_size; png_ptr->save_buffer_ptr += save_size; } - if (length && png_ptr->current_buffer_size) + if (length != 0 && png_ptr->current_buffer_size != 0) { png_size_t save_size; @@ -659,7 +548,7 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) void /* PRIVATE */ png_push_save_buffer(png_structrp png_ptr) { - if (png_ptr->save_buffer_size) + if (png_ptr->save_buffer_size != 0) { if (png_ptr->save_buffer_ptr != png_ptr->save_buffer) { @@ -695,11 +584,13 @@ png_push_save_buffer(png_structrp png_ptr) if (png_ptr->save_buffer == NULL) { png_free(png_ptr, old_buffer); + old_buffer = NULL; png_error(png_ptr, "Insufficient memory for save_buffer"); } memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size); png_free(png_ptr, old_buffer); + old_buffer = NULL; png_ptr->save_buffer_max = new_max; } if (png_ptr->current_buffer_size) @@ -726,18 +617,13 @@ png_push_restore_buffer(png_structrp png_ptr, png_bytep buffer, void /* PRIVATE */ png_push_read_IDAT(png_structrp png_ptr) { - if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) + if ((png_ptr->mode & PNG_HAVE_CHUNK_HEADER) == 0) { png_byte chunk_length[4]; png_byte chunk_tag[4]; /* TODO: this code can be commoned up with the same code in push_read */ - if (png_ptr->buffer_size < 8) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_LT(8) png_push_fill_buffer(png_ptr, chunk_length, 4); png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); png_reset_crc(png_ptr); @@ -749,7 +635,7 @@ png_push_read_IDAT(png_structrp png_ptr) { png_ptr->process_mode = PNG_READ_CHUNK_MODE; - if (!(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED)) + if ((png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0) png_error(png_ptr, "Not enough compressed data"); return; @@ -758,7 +644,7 @@ png_push_read_IDAT(png_structrp png_ptr) png_ptr->idat_size = png_ptr->push_length; } - if (png_ptr->idat_size && png_ptr->save_buffer_size) + if (png_ptr->idat_size != 0 && png_ptr->save_buffer_size != 0) { png_size_t save_size = png_ptr->save_buffer_size; png_uint_32 idat_size = png_ptr->idat_size; @@ -785,7 +671,7 @@ png_push_read_IDAT(png_structrp png_ptr) png_ptr->save_buffer_ptr += save_size; } - if (png_ptr->idat_size && png_ptr->current_buffer_size) + if (png_ptr->idat_size != 0 && png_ptr->current_buffer_size != 0) { png_size_t save_size = png_ptr->current_buffer_size; png_uint_32 idat_size = png_ptr->idat_size; @@ -810,14 +696,9 @@ png_push_read_IDAT(png_structrp png_ptr) png_ptr->current_buffer_size -= save_size; png_ptr->current_buffer_ptr += save_size; } - if (!png_ptr->idat_size) + if (png_ptr->idat_size == 0) { - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - + PNG_PUSH_SAVE_BUFFER_IF_LT(4) png_crc_finish(png_ptr, 0); png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; png_ptr->mode |= PNG_AFTER_IDAT; @@ -962,7 +843,7 @@ png_push_process_row(png_structrp png_ptr) memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1); #ifdef PNG_READ_TRANSFORMS_SUPPORTED - if (png_ptr->transformations) + if (png_ptr->transformations != 0) png_do_read_transformations(png_ptr, &row_info); #endif @@ -979,15 +860,16 @@ png_push_process_row(png_structrp png_ptr) #ifdef PNG_READ_INTERLACING_SUPPORTED - /* Blow up interlaced rows to full size */ - if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) + /* Expand interlaced rows to full size */ + if (png_ptr->interlaced != 0 && + (png_ptr->transformations & PNG_INTERLACE) != 0) { if (png_ptr->pass < 6) png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); - switch (png_ptr->pass) - { + switch (png_ptr->pass) + { case 0: { int i; @@ -1154,7 +1036,6 @@ png_push_process_row(png_structrp png_ptr) } } else -#endif { png_push_have_row(png_ptr, png_ptr->row_buf + 1); png_read_push_finish_row(png_ptr); @@ -1164,7 +1045,6 @@ png_push_process_row(png_structrp png_ptr) void /* PRIVATE */ png_read_push_finish_row(png_structrp png_ptr) { -#ifdef PNG_READ_INTERLACING_SUPPORTED /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ /* Start of interlace block */ @@ -1189,8 +1069,7 @@ png_read_push_finish_row(png_structrp png_ptr) if (png_ptr->row_number < png_ptr->num_rows) return; -#ifdef PNG_READ_INTERLACING_SUPPORTED - if (png_ptr->interlaced) + if (png_ptr->interlaced != 0) { png_ptr->row_number = 0; memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1); @@ -1214,7 +1093,7 @@ png_read_push_finish_row(png_structrp png_ptr) png_pass_start[png_ptr->pass]) / png_pass_inc[png_ptr->pass]; - if (png_ptr->transformations & PNG_INTERLACE) + if ((png_ptr->transformations & PNG_INTERLACE) != 0) break; png_ptr->num_rows = (png_ptr->height + @@ -1224,7 +1103,6 @@ png_read_push_finish_row(png_structrp png_ptr) } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); } -#endif /* PNG_READ_INTERLACING_SUPPORTED */ } void /* PRIVATE */ @@ -1249,7 +1127,6 @@ png_push_have_row(png_structrp png_ptr, png_bytep row) (int)png_ptr->pass); } -#ifdef PNG_READ_INTERLACING_SUPPORTED void PNGAPI png_progressive_combine_row(png_const_structrp png_ptr, png_bytep old_row, png_const_bytep new_row) @@ -1262,9 +1139,8 @@ png_progressive_combine_row(png_const_structrp png_ptr, png_bytep old_row, * it must be png_ptr->row_buf+1 */ if (new_row != NULL) - png_combine_row(png_ptr, old_row, 1/*display*/); + png_combine_row(png_ptr, old_row, 1/*blocky display*/); } -#endif /* PNG_READ_INTERLACING_SUPPORTED */ void PNGAPI png_set_progressive_read_fn(png_structrp png_ptr, png_voidp progressive_ptr, @@ -1289,4 +1165,4 @@ png_get_progressive_ptr(png_const_structrp png_ptr) return png_ptr->io_ptr; } -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ +#endif /* PROGRESSIVE_READ */ diff --git a/lib/libpng/pngpriv.h b/lib/libpng/pngpriv.h index a3fd1a46a2..cbd66decea 100644 --- a/lib/libpng/pngpriv.h +++ b/lib/libpng/pngpriv.h @@ -6,7 +6,7 @@ * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * - * Last changed in libpng 1.6.10 [March 6, 2014] + * Last changed in libpng 1.6.10 [March 6, 1014]] * * This code is released under the libpng license. * For conditions of distribution and use, see the disclaimer @@ -119,8 +119,12 @@ * PNG_ARM_NEON_OPT is set in CPPFLAGS (to >0) then arm/arm_init.c will fail * to compile with an appropriate #error if ALIGNED_MEMORY has been turned * off. + * + * Note that gcc-4.9 defines __ARM_NEON instead of __ARM_NEON__, so we + * check both variants. */ -# if defined(__ARM_NEON__) && defined(PNG_ALIGNED_MEMORY_SUPPORTED) +# if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \ + defined(PNG_ALIGNED_MEMORY_SUPPORTED) # define PNG_ARM_NEON_OPT 2 # else # define PNG_ARM_NEON_OPT 0 @@ -148,7 +152,7 @@ * libpng implementation list for incorporation in the next minor release. */ # ifndef PNG_ARM_NEON_IMPLEMENTATION -# ifdef __ARM_NEON__ +# if defined(__ARM_NEON__) || defined(__ARM_NEON) # if defined(__clang__) /* At present it is unknown by the libpng developers which versions * of clang support the intrinsics, however some or perhaps all @@ -168,7 +172,7 @@ */ # define PNG_ARM_NEON_IMPLEMENTATION 2 # endif /* __ARM_NEON__ */ -# endif /* !defined PNG_ARM_NEON_IMPLEMENTATION */ +# endif /* !PNG_ARM_NEON_IMPLEMENTATION */ # ifndef PNG_ARM_NEON_IMPLEMENTATION /* Use the intrinsics code by default. */ @@ -822,7 +826,7 @@ * zlib version number and because this affects handling of certain broken * PNG files the -I directives must match. * - * The most likely explanation is that you passed a -I in CFLAGS, this will + * The most likely explanation is that you passed a -I in CFLAGS. This will * not work; all the preprocessor directories and in particular all the -I * directives must be in CPPFLAGS. */ @@ -851,7 +855,7 @@ PNG_INTERNAL_DATA(const png_byte, png_sRGB_delta, [512]); /* Given a value 'linear' in the range 0..255*65535 calculate the 8-bit sRGB * encoded value with maximum error 0.646365. Note that the input is not a * 16-bit value; it has been multiplied by 255! */ -#endif /* PNG_SIMPLIFIED_READ/WRITE */ +#endif /* SIMPLIFIED_READ/WRITE */ /* Inhibit C++ name-mangling for libpng functions but not for system calls. */ @@ -1086,7 +1090,7 @@ PNG_INTERNAL_FUNCTION(void,png_write_tEXt,(png_structrp png_ptr, #ifdef PNG_WRITE_zTXt_SUPPORTED PNG_INTERNAL_FUNCTION(void,png_write_zTXt,(png_structrp png_ptr, png_const_charp - key, png_const_charp text, png_size_t text_len, int compression),PNG_EMPTY); + key, png_const_charp text, int compression),PNG_EMPTY); #endif #ifdef PNG_WRITE_iTXt_SUPPORTED @@ -1225,7 +1229,7 @@ PNG_INTERNAL_FUNCTION(void,png_read_finish_IDAT,(png_structrp png_ptr), PNG_INTERNAL_FUNCTION(void,png_read_finish_row,(png_structrp png_ptr), PNG_EMPTY); /* Finish a row while reading, dealing with interlacing passes, etc. */ -#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ +#endif /* SEQUENTIAL_READ */ /* Initialize the row buffers, etc. */ PNG_INTERNAL_FUNCTION(void,png_read_start_row,(png_structrp png_ptr),PNG_EMPTY); @@ -1301,7 +1305,7 @@ PNG_INTERNAL_FUNCTION(void,png_handle_hIST,(png_structrp png_ptr, #ifdef PNG_READ_iCCP_SUPPORTED PNG_INTERNAL_FUNCTION(void,png_handle_iCCP,(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif /* PNG_READ_iCCP_SUPPORTED */ +#endif /* READ_iCCP */ #ifdef PNG_READ_iTXt_SUPPORTED PNG_INTERNAL_FUNCTION(void,png_handle_iTXt,(png_structrp png_ptr, @@ -1336,7 +1340,7 @@ PNG_INTERNAL_FUNCTION(void,png_handle_sCAL,(png_structrp png_ptr, #ifdef PNG_READ_sPLT_SUPPORTED PNG_INTERNAL_FUNCTION(void,png_handle_sPLT,(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif /* PNG_READ_sPLT_SUPPORTED */ +#endif /* READ_sPLT */ #ifdef PNG_READ_sRGB_SUPPORTED PNG_INTERNAL_FUNCTION(void,png_handle_sRGB,(png_structrp png_ptr, @@ -1450,7 +1454,7 @@ PNG_INTERNAL_FUNCTION(void,png_push_read_iTXt,(png_structrp png_ptr, png_inforp info_ptr),PNG_EMPTY); # endif -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ +#endif /* PROGRESSIVE_READ */ /* Added at libpng version 1.6.0 */ #ifdef PNG_GAMMA_SUPPORTED diff --git a/lib/libpng/pngread.c b/lib/libpng/pngread.c index cd9ab58b4e..87a789157b 100644 --- a/lib/libpng/pngread.c +++ b/lib/libpng/pngread.c @@ -1,7 +1,7 @@ /* pngread.c - read a PNG file * - * Last changed in libpng 1.6.10 [March 6, 2014] + * Last changed in libpng 1.6.15 [November 20, 2014] * Copyright (c) 1998-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -44,7 +44,7 @@ png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, { png_structp png_ptr = png_create_png_struct(user_png_ver, error_ptr, error_fn, warn_fn, mem_ptr, malloc_fn, free_fn); -#endif /* PNG_USER_MEM_SUPPORTED */ +#endif /* USER_MEM */ if (png_ptr != NULL) { @@ -113,20 +113,20 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr) */ if (chunk_name == png_IDAT) { - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "Missing IHDR before IDAT"); else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - !(png_ptr->mode & PNG_HAVE_PLTE)) + (png_ptr->mode & PNG_HAVE_PLTE) == 0) png_chunk_error(png_ptr, "Missing PLTE before IDAT"); - else if (png_ptr->mode & PNG_AFTER_IDAT) + else if ((png_ptr->mode & PNG_AFTER_IDAT) != 0) png_chunk_benign_error(png_ptr, "Too many IDATs found"); png_ptr->mode |= PNG_HAVE_IDAT; } - else if (png_ptr->mode & PNG_HAVE_IDAT) + else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0) png_ptr->mode |= PNG_AFTER_IDAT; /* This should be a binary subdivision search or a hash for @@ -252,7 +252,7 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr) PNG_HANDLE_CHUNK_AS_DEFAULT); } } -#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ +#endif /* SEQUENTIAL_READ */ /* Optional call to update the users info_ptr structure */ void PNGAPI @@ -302,7 +302,7 @@ png_start_read_image(png_structrp png_ptr) "png_start_read_image/png_read_update_info: duplicate call"); } } -#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ +#endif /* SEQUENTIAL_READ */ #ifdef PNG_SEQUENTIAL_READ_SUPPORTED #ifdef PNG_MNG_FEATURES_SUPPORTED @@ -315,7 +315,7 @@ png_do_read_intrapixel(png_row_infop row_info, png_bytep row) png_debug(1, "in png_do_read_intrapixel"); if ( - (row_info->color_type & PNG_COLOR_MASK_COLOR)) + (row_info->color_type & PNG_COLOR_MASK_COLOR) != 0) { int bytes_per_pixel; png_uint_32 row_width = row_info->width; @@ -369,7 +369,7 @@ png_do_read_intrapixel(png_row_infop row_info, png_bytep row) } } } -#endif /* PNG_MNG_FEATURES_SUPPORTED */ +#endif /* MNG_FEATURES */ void PNGAPI png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row) @@ -385,7 +385,7 @@ png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row) /* png_read_start_row sets the information (in particular iwidth) for this * interlace pass. */ - if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) + if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0) png_read_start_row(png_ptr); /* 1.5.6: row_info moved out of png_struct to a local here. */ @@ -396,45 +396,47 @@ png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row) row_info.pixel_depth = png_ptr->pixel_depth; row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width); +#ifdef PNG_WARNINGS_SUPPORTED if (png_ptr->row_number == 0 && png_ptr->pass == 0) { /* Check for transforms that have been set but were defined out */ #if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED) - if (png_ptr->transformations & PNG_INVERT_MONO) + if ((png_ptr->transformations & PNG_INVERT_MONO) != 0) png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined"); #endif #if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED) - if (png_ptr->transformations & PNG_FILLER) + if ((png_ptr->transformations & PNG_FILLER) != 0) png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined"); #endif #if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \ !defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) + if ((png_ptr->transformations & PNG_PACKSWAP) != 0) png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined"); #endif #if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED) - if (png_ptr->transformations & PNG_PACK) + if ((png_ptr->transformations & PNG_PACK) != 0) png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined"); #endif #if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) - if (png_ptr->transformations & PNG_SHIFT) + if ((png_ptr->transformations & PNG_SHIFT) != 0) png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined"); #endif #if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED) - if (png_ptr->transformations & PNG_BGR) + if ((png_ptr->transformations & PNG_BGR) != 0) png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined"); #endif #if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED) - if (png_ptr->transformations & PNG_SWAP_BYTES) + if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0) png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined"); #endif } +#endif /* WARNINGS */ #ifdef PNG_READ_INTERLACING_SUPPORTED /* If interlaced and we do not need a new row, combine row and return. @@ -443,7 +445,8 @@ png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row) * untransformed) and, because of the libpng API for interlaced images, this * means we must transform before de-interlacing. */ - if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) + if (png_ptr->interlaced != 0 && + (png_ptr->transformations & PNG_INTERLACE) != 0) { switch (png_ptr->pass) { @@ -514,7 +517,7 @@ png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row) default: case 6: - if (!(png_ptr->row_number & 1)) + if ((png_ptr->row_number & 1) == 0) { png_read_finish_row(png_ptr); return; @@ -524,7 +527,7 @@ png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row) } #endif - if (!(png_ptr->mode & PNG_HAVE_IDAT)) + if ((png_ptr->mode & PNG_HAVE_IDAT) == 0) png_error(png_ptr, "Invalid attempt to read row data"); /* Fill the row with IDAT data: */ @@ -547,7 +550,7 @@ png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row) memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1); #ifdef PNG_MNG_FEATURES_SUPPORTED - if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && + if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 && (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) { /* Intrapixel differencing */ @@ -572,9 +575,9 @@ png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row) png_error(png_ptr, "internal sequential row size calculation error"); #ifdef PNG_READ_INTERLACING_SUPPORTED - /* Blow up interlaced rows to full size */ - if (png_ptr->interlaced && - (png_ptr->transformations & PNG_INTERLACE)) + /* Expand interlaced rows to full size */ + if (png_ptr->interlaced != 0 && + (png_ptr->transformations & PNG_INTERLACE) != 0) { if (png_ptr->pass < 6) png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass, @@ -602,7 +605,7 @@ png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row) (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); } -#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ +#endif /* SEQUENTIAL_READ */ #ifdef PNG_SEQUENTIAL_READ_SUPPORTED /* Read one or more rows of image data. If the image is interlaced, @@ -669,7 +672,7 @@ png_read_rows(png_structrp png_ptr, png_bytepp row, dp++; } } -#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ +#endif /* SEQUENTIAL_READ */ #ifdef PNG_SEQUENTIAL_READ_SUPPORTED /* Read the entire image. If the image has an alpha channel or a tRNS @@ -697,7 +700,7 @@ png_read_image(png_structrp png_ptr, png_bytepp image) return; #ifdef PNG_READ_INTERLACING_SUPPORTED - if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) + if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0) { pass = png_set_interlace_handling(png_ptr); /* And make sure transforms are initialized. */ @@ -705,7 +708,8 @@ png_read_image(png_structrp png_ptr, png_bytepp image) } else { - if (png_ptr->interlaced && !(png_ptr->transformations & PNG_INTERLACE)) + if (png_ptr->interlaced != 0 && + (png_ptr->transformations & PNG_INTERLACE) == 0) { /* Caller called png_start_read_image or png_read_update_info without * first turning on the PNG_INTERLACE transform. We can fix this here, @@ -742,7 +746,7 @@ png_read_image(png_structrp png_ptr, png_bytepp image) } } } -#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ +#endif /* SEQUENTIAL_READ */ #ifdef PNG_SEQUENTIAL_READ_SUPPORTED /* Read the end of the PNG file. Will not read past the end of the @@ -765,7 +769,7 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr) * still be pending IDAT data and an owned zstream. Deal with this here. */ #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED - if (!png_chunk_unknown_handling(png_ptr, png_IDAT)) + if (png_chunk_unknown_handling(png_ptr, png_IDAT) == 0) #endif png_read_finish_IDAT(png_ptr); @@ -795,7 +799,8 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr) { if (chunk_name == png_IDAT) { - if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) + if ((length > 0) || + (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0) png_benign_error(png_ptr, "Too many IDATs found"); } png_handle_unknown(png_ptr, info_ptr, length, keep); @@ -809,7 +814,8 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr) /* Zero length IDATs are legal after the last IDAT has been * read, but not after other chunks have been read. */ - if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) + if ((length > 0) || + (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0) png_benign_error(png_ptr, "Too many IDATs found"); png_crc_finish(png_ptr, length); @@ -905,9 +911,9 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr) else png_handle_unknown(png_ptr, info_ptr, length, PNG_HANDLE_CHUNK_AS_DEFAULT); - } while (!(png_ptr->mode & PNG_HAVE_IEND)); + } while ((png_ptr->mode & PNG_HAVE_IEND) == 0); } -#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ +#endif /* SEQUENTIAL_READ */ /* Free all memory used in the read struct */ static void @@ -920,22 +926,33 @@ png_read_destroy(png_structrp png_ptr) #endif png_free(png_ptr, png_ptr->big_row_buf); + png_ptr->big_row_buf = NULL; png_free(png_ptr, png_ptr->big_prev_row); + png_ptr->big_prev_row = NULL; png_free(png_ptr, png_ptr->read_buffer); + png_ptr->read_buffer = NULL; #ifdef PNG_READ_QUANTIZE_SUPPORTED png_free(png_ptr, png_ptr->palette_lookup); + png_ptr->palette_lookup = NULL; png_free(png_ptr, png_ptr->quantize_index); + png_ptr->quantize_index = NULL; #endif - if (png_ptr->free_me & PNG_FREE_PLTE) + if ((png_ptr->free_me & PNG_FREE_PLTE) != 0) + { png_zfree(png_ptr, png_ptr->palette); + png_ptr->palette = NULL; + } png_ptr->free_me &= ~PNG_FREE_PLTE; #if defined(PNG_tRNS_SUPPORTED) || \ defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - if (png_ptr->free_me & PNG_FREE_TRNS) + if ((png_ptr->free_me & PNG_FREE_TRNS) != 0) + { png_free(png_ptr, png_ptr->trans_alpha); + png_ptr->trans_alpha = NULL; + } png_ptr->free_me &= ~PNG_FREE_TRNS; #endif @@ -943,15 +960,18 @@ png_read_destroy(png_structrp png_ptr) #ifdef PNG_PROGRESSIVE_READ_SUPPORTED png_free(png_ptr, png_ptr->save_buffer); + png_ptr->save_buffer = NULL; #endif -#if defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED) &&\ +#if defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED) && \ defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) png_free(png_ptr, png_ptr->unknown_chunk.data); + png_ptr->unknown_chunk.data = NULL; #endif #ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED png_free(png_ptr, png_ptr->chunk_list); + png_ptr->chunk_list = NULL; #endif /* NOTE: the 'setjmp' buffer may still be allocated and the memory and error @@ -1023,7 +1043,7 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr, /* Tell libpng to strip 16-bit/color files down to 8 bits per color. */ - if (transforms & PNG_TRANSFORM_SCALE_16) + if ((transforms & PNG_TRANSFORM_SCALE_16) != 0) /* Added at libpng-1.5.4. "strip_16" produces the same result that it * did in earlier versions, while "scale_16" is now more accurate. */ @@ -1037,7 +1057,7 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr, * latter by doing SCALE first. This is ok and allows apps not to check for * which is supported to get the right answer. */ - if (transforms & PNG_TRANSFORM_STRIP_16) + if ((transforms & PNG_TRANSFORM_STRIP_16) != 0) #ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED png_set_strip_16(png_ptr); #else @@ -1047,7 +1067,7 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr, /* Strip alpha bytes from the input data without combining with * the background (not recommended). */ - if (transforms & PNG_TRANSFORM_STRIP_ALPHA) + if ((transforms & PNG_TRANSFORM_STRIP_ALPHA) != 0) #ifdef PNG_READ_STRIP_ALPHA_SUPPORTED png_set_strip_alpha(png_ptr); #else @@ -1057,7 +1077,7 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr, /* Extract multiple pixels with bit depths of 1, 2, or 4 from a single * byte into separate bytes (useful for paletted and grayscale images). */ - if (transforms & PNG_TRANSFORM_PACKING) + if ((transforms & PNG_TRANSFORM_PACKING) != 0) #ifdef PNG_READ_PACK_SUPPORTED png_set_packing(png_ptr); #else @@ -1067,7 +1087,7 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr, /* Change the order of packed pixels to least significant bit first * (not useful if you are using png_set_packing). */ - if (transforms & PNG_TRANSFORM_PACKSWAP) + if ((transforms & PNG_TRANSFORM_PACKSWAP) != 0) #ifdef PNG_READ_PACKSWAP_SUPPORTED png_set_packswap(png_ptr); #else @@ -1079,7 +1099,7 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr, * Expand paletted or RGB images with transparency to full alpha * channels so the data will be available as RGBA quartets. */ - if (transforms & PNG_TRANSFORM_EXPAND) + if ((transforms & PNG_TRANSFORM_EXPAND) != 0) #ifdef PNG_READ_EXPAND_SUPPORTED png_set_expand(png_ptr); #else @@ -1091,7 +1111,7 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr, /* Invert monochrome files to have 0 as white and 1 as black */ - if (transforms & PNG_TRANSFORM_INVERT_MONO) + if ((transforms & PNG_TRANSFORM_INVERT_MONO) != 0) #ifdef PNG_READ_INVERT_SUPPORTED png_set_invert_mono(png_ptr); #else @@ -1102,16 +1122,16 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr, * [0,65535] to the original [0,7] or [0,31], or whatever range the * colors were originally in: */ - if (transforms & PNG_TRANSFORM_SHIFT) + if ((transforms & PNG_TRANSFORM_SHIFT) != 0) #ifdef PNG_READ_SHIFT_SUPPORTED - if (info_ptr->valid & PNG_INFO_sBIT) + if ((info_ptr->valid & PNG_INFO_sBIT) != 0) png_set_shift(png_ptr, &info_ptr->sig_bit); #else png_app_error(png_ptr, "PNG_TRANSFORM_SHIFT not supported"); #endif /* Flip the RGB pixels to BGR (or RGBA to BGRA) */ - if (transforms & PNG_TRANSFORM_BGR) + if ((transforms & PNG_TRANSFORM_BGR) != 0) #ifdef PNG_READ_BGR_SUPPORTED png_set_bgr(png_ptr); #else @@ -1119,7 +1139,7 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr, #endif /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) */ - if (transforms & PNG_TRANSFORM_SWAP_ALPHA) + if ((transforms & PNG_TRANSFORM_SWAP_ALPHA) != 0) #ifdef PNG_READ_SWAP_ALPHA_SUPPORTED png_set_swap_alpha(png_ptr); #else @@ -1127,7 +1147,7 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr, #endif /* Swap bytes of 16-bit files to least significant byte first */ - if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) + if ((transforms & PNG_TRANSFORM_SWAP_ENDIAN) != 0) #ifdef PNG_READ_SWAP_SUPPORTED png_set_swap(png_ptr); #else @@ -1136,7 +1156,7 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr, /* Added at libpng-1.2.41 */ /* Invert the alpha channel from opacity to transparency */ - if (transforms & PNG_TRANSFORM_INVERT_ALPHA) + if ((transforms & PNG_TRANSFORM_INVERT_ALPHA) != 0) #ifdef PNG_READ_INVERT_ALPHA_SUPPORTED png_set_invert_alpha(png_ptr); #else @@ -1145,7 +1165,7 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr, /* Added at libpng-1.2.41 */ /* Expand grayscale image to RGB */ - if (transforms & PNG_TRANSFORM_GRAY_TO_RGB) + if ((transforms & PNG_TRANSFORM_GRAY_TO_RGB) != 0) #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED png_set_gray_to_rgb(png_ptr); #else @@ -1153,7 +1173,7 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr, #endif /* Added at libpng-1.5.4 */ - if (transforms & PNG_TRANSFORM_EXPAND_16) + if ((transforms & PNG_TRANSFORM_EXPAND_16) != 0) #ifdef PNG_READ_EXPAND_16_SUPPORTED png_set_expand_16(png_ptr); #else @@ -1201,8 +1221,8 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr, PNG_UNUSED(params) } -#endif /* PNG_INFO_IMAGE_SUPPORTED */ -#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ +#endif /* INFO_IMAGE */ +#endif /* SEQUENTIAL_READ */ #ifdef PNG_SIMPLIFIED_READ_SUPPORTED /* SIMPLIFIED READ @@ -1220,7 +1240,7 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr, # define P_LINEAR8 4 /* 8-bit linear: only from a file value */ /* Color-map processing: after libpng has run on the PNG image further - * processing may be needed to conver the data to color-map indicies. + * processing may be needed to convert the data to color-map indices. */ #define PNG_CMAP_NONE 0 #define PNG_CMAP_GA 1 /* Process GA data to a color-map with alpha */ @@ -1311,10 +1331,10 @@ png_image_format(png_structrp png_ptr) { png_uint_32 format = 0; - if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) + if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0) format |= PNG_FORMAT_FLAG_COLOR; - if (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) + if ((png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0) format |= PNG_FORMAT_FLAG_ALPHA; /* Use png_ptr here, not info_ptr, because by examination png_handle_tRNS @@ -1328,7 +1348,7 @@ png_image_format(png_structrp png_ptr) if (png_ptr->bit_depth == 16) format |= PNG_FORMAT_FLAG_LINEAR; - if (png_ptr->color_type & PNG_COLOR_MASK_PALETTE) + if ((png_ptr->color_type & PNG_COLOR_MASK_PALETTE) != 0) format |= PNG_FORMAT_FLAG_COLORMAP; return format; @@ -1428,7 +1448,7 @@ png_image_begin_read_from_stdio(png_imagep image, FILE* file) { if (file != NULL) { - if (png_image_read_init(image)) + if (png_image_read_init(image) != 0) { /* This is slightly evil, but png_init_io doesn't do anything other * than this and we haven't changed the standard IO functions so @@ -1462,7 +1482,7 @@ png_image_begin_read_from_file(png_imagep image, const char *file_name) if (fp != NULL) { - if (png_image_read_init(image)) + if (png_image_read_init(image) != 0) { image->opaque->png_ptr->io_ptr = fp; image->opaque->owned_file = 1; @@ -1488,7 +1508,7 @@ png_image_begin_read_from_file(png_imagep image, const char *file_name) return 0; } -#endif /* PNG_STDIO_SUPPORTED */ +#endif /* STDIO */ static void PNGCBAPI png_image_memory_read(png_structp png_ptr, png_bytep out, png_size_t need) @@ -1527,7 +1547,7 @@ int PNGAPI png_image_begin_read_from_memory(png_imagep image, { if (memory != NULL && size > 0) { - if (png_image_read_init(image)) + if (png_image_read_init(image) != 0) { /* Now set the IO functions to read from the memory buffer and * store it into io_ptr. Again do this in-place to avoid calling a @@ -1599,14 +1619,14 @@ png_image_skip_unused_chunks(png_structrp png_ptr) /* But do not ignore image data handling chunks */ png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_AS_DEFAULT, - chunks_to_process, (sizeof chunks_to_process)/5); + chunks_to_process, (int)/*SAFE*/(sizeof chunks_to_process)/5); } } # define PNG_SKIP_CHUNKS(p) png_image_skip_unused_chunks(p) #else # define PNG_SKIP_CHUNKS(p) ((void)0) -#endif /* PNG_HANDLE_AS_UNKNOWN_SUPPORTED */ +#endif /* HANDLE_AS_UNKNOWN */ /* The following macro gives the exact rounded answer for all values in the * range 0..255 (it actually divides by 51.2, but the rounding still generates @@ -1619,9 +1639,9 @@ static void set_file_encoding(png_image_read_control *display) { png_fixed_point g = display->image->opaque->png_ptr->colorspace.gamma; - if (png_gamma_significant(g)) + if (png_gamma_significant(g) != 0) { - if (png_gamma_not_sRGB(g)) + if (png_gamma_not_sRGB(g) != 0) { display->file_encoding = P_FILE; display->gamma_to_linear = png_reciprocal(g); @@ -1716,7 +1736,7 @@ png_create_colormap_entry(png_image_read_control *display, png_uint_32 alpha, int encoding) { png_imagep image = display->image; - const int output_encoding = (image->format & PNG_FORMAT_FLAG_LINEAR) ? + const int output_encoding = (image->format & PNG_FORMAT_FLAG_LINEAR) != 0 ? P_LINEAR : P_sRGB; const int convert_to_Y = (image->format & PNG_FORMAT_FLAG_COLOR) == 0 && (red != green || green != blue); @@ -1746,7 +1766,7 @@ png_create_colormap_entry(png_image_read_control *display, green = png_gamma_16bit_correct(green*257, g); blue = png_gamma_16bit_correct(blue*257, g); - if (convert_to_Y || output_encoding == P_LINEAR) + if (convert_to_Y != 0 || output_encoding == P_LINEAR) { alpha *= 257; encoding = P_LINEAR; @@ -1773,7 +1793,8 @@ png_create_colormap_entry(png_image_read_control *display, encoding = P_LINEAR; } - else if (encoding == P_sRGB && (convert_to_Y || output_encoding == P_LINEAR)) + else if (encoding == P_sRGB && + (convert_to_Y != 0 || output_encoding == P_LINEAR)) { /* The values are 8-bit sRGB values, but must be converted to 16-bit * linear. @@ -1788,7 +1809,7 @@ png_create_colormap_entry(png_image_read_control *display, /* This is set if the color isn't gray but the output is. */ if (encoding == P_LINEAR) { - if (convert_to_Y) + if (convert_to_Y != 0) { /* NOTE: these values are copied from png_do_rgb_to_gray */ png_uint_32 y = (png_uint_32)6968 * red + (png_uint_32)23434 * green + @@ -1831,7 +1852,7 @@ png_create_colormap_entry(png_image_read_control *display, # define afirst 0 # endif # ifdef PNG_FORMAT_BGR_SUPPORTED - const int bgr = (image->format & PNG_FORMAT_FLAG_BGR) ? 2 : 0; + const int bgr = (image->format & PNG_FORMAT_FLAG_BGR) != 0 ? 2 : 0; # else # define bgr 0 # endif @@ -2043,7 +2064,7 @@ png_image_read_colormap(png_voidp argument) const png_structrp png_ptr = image->opaque->png_ptr; const png_uint_32 output_format = image->format; - const int output_encoding = (output_format & PNG_FORMAT_FLAG_LINEAR) ? + const int output_encoding = (output_format & PNG_FORMAT_FLAG_LINEAR) != 0 ? P_LINEAR : P_sRGB; unsigned int cmap_entries; @@ -2082,7 +2103,7 @@ png_image_read_colormap(png_voidp argument) else { back_g = display->background->green; - if (output_format & PNG_FORMAT_FLAG_COLOR) + if ((output_format & PNG_FORMAT_FLAG_COLOR) != 0) { back_r = display->background->red; back_b = display->background->blue; @@ -2187,7 +2208,7 @@ png_image_read_colormap(png_voidp argument) data_encoding = P_FILE; /* The rows from libpng, while technically gray values, are now also - * color-map indicies; however, they may need to be expanded to 1 + * color-map indices; however, they may need to be expanded to 1 * byte per pixel. This is what png_set_packing does (i.e., it * unpacks the bit values into bytes.) */ @@ -2224,7 +2245,7 @@ png_image_read_colormap(png_voidp argument) { unsigned int back_alpha; - if (output_format & PNG_FORMAT_FLAG_ALPHA) + if ((output_format & PNG_FORMAT_FLAG_ALPHA) != 0) back_alpha = 0; else @@ -2273,8 +2294,8 @@ png_image_read_colormap(png_voidp argument) * 8-bit GA and it has to be processing to single byte color-map * values. Entry 254 is replaced by either a completely * transparent entry or by the background color at full - * precision (and the background color is not a simple gray leve - * in this case.) + * precision (and the background color is not a simple gray + * level in this case.) */ expand_tRNS = 1; output_processing = PNG_CMAP_TRANS; @@ -2305,7 +2326,7 @@ png_image_read_colormap(png_voidp argument) */ data_encoding = P_sRGB; - if (output_format & PNG_FORMAT_FLAG_ALPHA) + if ((output_format & PNG_FORMAT_FLAG_ALPHA) != 0) { if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries) png_error(png_ptr, "gray+alpha color-map: too few entries"); @@ -2500,7 +2521,7 @@ png_image_read_colormap(png_voidp argument) */ if ((png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA || png_ptr->num_trans > 0) && - png_gamma_not_sRGB(png_ptr->colorspace.gamma)) + png_gamma_not_sRGB(png_ptr->colorspace.gamma) != 0) { cmap_entries = make_gray_file_colormap(display); data_encoding = P_FILE; @@ -2588,7 +2609,7 @@ png_image_read_colormap(png_voidp argument) /* Is there alpha in the output too? If so all four channels are * processed into a special RGB cube with alpha support. */ - if (output_format & PNG_FORMAT_FLAG_ALPHA) + if ((output_format & PNG_FORMAT_FLAG_ALPHA) != 0) { png_uint_32 r; @@ -2752,7 +2773,7 @@ png_image_read_colormap(png_voidp argument) num_trans = 0; output_processing = PNG_CMAP_NONE; - data_encoding = P_FILE; /* Don't change from color-map indicies */ + data_encoding = P_FILE; /* Don't change from color-map indices */ cmap_entries = png_ptr->num_palette; if (cmap_entries > 256) cmap_entries = 256; @@ -2762,7 +2783,7 @@ png_image_read_colormap(png_voidp argument) for (i=0; i < cmap_entries; ++i) { - if (do_background && i < num_trans && trans[i] < 255) + if (do_background != 0 && i < num_trans && trans[i] < 255) { if (trans[i] == 0) png_create_colormap_entry(display, i, back_r, back_g, @@ -2792,7 +2813,7 @@ png_image_read_colormap(png_voidp argument) i < num_trans ? trans[i] : 255U, P_FILE/*8-bit*/); } - /* The PNG data may have indicies packed in fewer than 8 bits, it + /* The PNG data may have indices packed in fewer than 8 bits, it * must be expanded if so. */ if (png_ptr->bit_depth < 8) @@ -2807,8 +2828,8 @@ png_image_read_colormap(png_voidp argument) } /* Now deal with the output processing */ - if (expand_tRNS && png_ptr->num_trans > 0 && - (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) == 0) + if (expand_tRNS != 0 && png_ptr->num_trans > 0 && + (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) == 0) png_set_tRNS_to_alpha(png_ptr); switch (data_encoding) @@ -3224,7 +3245,8 @@ png_image_read_composite(png_voidp argument) png_uint_32 height = image->height; png_uint_32 width = image->width; ptrdiff_t step_row = display->row_bytes; - unsigned int channels = (image->format & PNG_FORMAT_FLAG_COLOR) ? 3 : 1; + unsigned int channels = + (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1; int pass; for (pass = 0; pass < passes; ++pass) @@ -3317,11 +3339,11 @@ png_image_read_composite(png_voidp argument) * PNG_COMPOSITE * PNG_GAMMA * - * This is a work-round for the fact that both the PNG_RGB_TO_GRAY and + * This is a work-around for the fact that both the PNG_RGB_TO_GRAY and * PNG_COMPOSITE code performs gamma correction, so we get double gamma - * correction. The fix-up is to prevent the PNG_COMPOSITE operation happening - * inside libpng, so this routine sees an 8 or 16-bit gray+alpha row and handles - * the removal or pre-multiplication of the alpha channel. + * correction. The fix-up is to prevent the PNG_COMPOSITE operation from + * happening inside libpng, so this routine sees an 8 or 16-bit gray+alpha + * row and handles the removal or pre-multiplication of the alpha channel. */ static int png_image_read_background(png_voidp argument) @@ -3522,7 +3544,8 @@ png_image_read_background(png_voidp argument) int swap_alpha = 0; # ifdef PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED - if (preserve_alpha && (image->format & PNG_FORMAT_FLAG_AFIRST)) + if (preserve_alpha != 0 && + (image->format & PNG_FORMAT_FLAG_AFIRST) != 0) swap_alpha = 1; # endif @@ -3586,7 +3609,7 @@ png_image_read_background(png_voidp argument) component = 0; outrow[swap_alpha] = (png_uint_16)component; - if (preserve_alpha) + if (preserve_alpha != 0) outrow[1 ^ swap_alpha] = alpha; inrow += 2; /* components and alpha channel */ @@ -3631,10 +3654,10 @@ png_image_read_direct(png_voidp argument) int mode; /* alpha mode */ /* Do this first so that we have a record if rgb to gray is happening. */ - if (change & PNG_FORMAT_FLAG_COLOR) + if ((change & PNG_FORMAT_FLAG_COLOR) != 0) { /* gray<->color transformation required. */ - if (format & PNG_FORMAT_FLAG_COLOR) + if ((format & PNG_FORMAT_FLAG_COLOR) != 0) png_set_gray_to_rgb(png_ptr); else @@ -3652,7 +3675,7 @@ png_image_read_direct(png_voidp argument) * enormous change) 'do_local_background' is used to indicate that * the problem exists. */ - if (base_format & PNG_FORMAT_FLAG_ALPHA) + if ((base_format & PNG_FORMAT_FLAG_ALPHA) != 0) do_local_background = 1/*maybe*/; png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE, @@ -3667,8 +3690,8 @@ png_image_read_direct(png_voidp argument) { png_fixed_point input_gamma_default; - if ((base_format & PNG_FORMAT_FLAG_LINEAR) && - (image->flags & PNG_IMAGE_FLAG_16BIT_sRGB) == 0) + if ((base_format & PNG_FORMAT_FLAG_LINEAR) != 0 && + (image->flags & PNG_IMAGE_FLAG_16BIT_sRGB) == 0) input_gamma_default = PNG_GAMMA_LINEAR; else input_gamma_default = PNG_DEFAULT_sRGB; @@ -3679,12 +3702,12 @@ png_image_read_direct(png_voidp argument) png_set_alpha_mode_fixed(png_ptr, PNG_ALPHA_PNG, input_gamma_default); } - if (linear) + if (linear != 0) { /* If there *is* an alpha channel in the input it must be multiplied * out; use PNG_ALPHA_STANDARD, otherwise just use PNG_ALPHA_PNG. */ - if (base_format & PNG_FORMAT_FLAG_ALPHA) + if ((base_format & PNG_FORMAT_FLAG_ALPHA) != 0) mode = PNG_ALPHA_STANDARD; /* associated alpha */ else @@ -3705,7 +3728,7 @@ png_image_read_direct(png_voidp argument) * * TODO: fix libpng and remove this. */ - if (do_local_background) + if (do_local_background != 0) { png_fixed_point gtest; @@ -3715,7 +3738,7 @@ png_image_read_direct(png_voidp argument) * final value. */ if (png_muldiv(>est, output_gamma, png_ptr->colorspace.gamma, - PNG_FP_1) && !png_gamma_significant(gtest)) + PNG_FP_1) != 0 && png_gamma_significant(gtest) == 0) do_local_background = 0; else if (mode == PNG_ALPHA_STANDARD) @@ -3728,9 +3751,9 @@ png_image_read_direct(png_voidp argument) } /* If the bit-depth changes then handle that here. */ - if (change & PNG_FORMAT_FLAG_LINEAR) + if ((change & PNG_FORMAT_FLAG_LINEAR) != 0) { - if (linear /*16-bit output*/) + if (linear != 0 /*16-bit output*/) png_set_expand_16(png_ptr); else /* 8-bit output */ @@ -3740,24 +3763,24 @@ png_image_read_direct(png_voidp argument) } /* Now the background/alpha channel changes. */ - if (change & PNG_FORMAT_FLAG_ALPHA) + if ((change & PNG_FORMAT_FLAG_ALPHA) != 0) { /* Removing an alpha channel requires composition for the 8-bit * formats; for the 16-bit it is already done, above, by the * pre-multiplication and the channel just needs to be stripped. */ - if (base_format & PNG_FORMAT_FLAG_ALPHA) + if ((base_format & PNG_FORMAT_FLAG_ALPHA) != 0) { /* If RGB->gray is happening the alpha channel must be left and the * operation completed locally. * * TODO: fix libpng and remove this. */ - if (do_local_background) + if (do_local_background != 0) do_local_background = 2/*required*/; /* 16-bit output: just remove the channel */ - else if (linear) /* compose on black (well, pre-multiply) */ + else if (linear != 0) /* compose on black (well, pre-multiply) */ png_set_strip_alpha(png_ptr); /* 8-bit output: do an appropriate compose */ @@ -3804,14 +3827,14 @@ png_image_read_direct(png_voidp argument) png_uint_32 filler; /* opaque filler */ int where; - if (linear) + if (linear != 0) filler = 65535; else filler = 255; # ifdef PNG_FORMAT_AFIRST_SUPPORTED - if (format & PNG_FORMAT_FLAG_AFIRST) + if ((format & PNG_FORMAT_FLAG_AFIRST) != 0) { where = PNG_FILLER_BEFORE; change &= ~PNG_FORMAT_FLAG_AFIRST; @@ -3835,12 +3858,12 @@ png_image_read_direct(png_voidp argument) png_set_alpha_mode_fixed(png_ptr, mode, output_gamma); # ifdef PNG_FORMAT_BGR_SUPPORTED - if (change & PNG_FORMAT_FLAG_BGR) + if ((change & PNG_FORMAT_FLAG_BGR) != 0) { /* Check only the output format; PNG is never BGR; don't do this if * the output is gray, but fix up the 'format' value in that case. */ - if (format & PNG_FORMAT_FLAG_COLOR) + if ((format & PNG_FORMAT_FLAG_COLOR) != 0) png_set_bgr(png_ptr); else @@ -3851,14 +3874,14 @@ png_image_read_direct(png_voidp argument) # endif # ifdef PNG_FORMAT_AFIRST_SUPPORTED - if (change & PNG_FORMAT_FLAG_AFIRST) + if ((change & PNG_FORMAT_FLAG_AFIRST) != 0) { /* Only relevant if there is an alpha channel - it's particularly * important to handle this correctly because do_local_compose may * be set above and then libpng will keep the alpha channel for this * code to remove. */ - if (format & PNG_FORMAT_FLAG_ALPHA) + if ((format & PNG_FORMAT_FLAG_ALPHA) != 0) { /* Disable this if doing a local background, * TODO: remove this when local background is no longer required. @@ -3877,16 +3900,16 @@ png_image_read_direct(png_voidp argument) /* If the *output* is 16-bit then we need to check for a byte-swap on this * architecture. */ - if (linear) + if (linear != 0) { PNG_CONST png_uint_16 le = 0x0001; - if (*(png_const_bytep)&le) + if ((*(png_const_bytep) & le) != 0) png_set_swap(png_ptr); } /* If change is not now 0 some transformation is missing - error out. */ - if (change) + if (change != 0) png_error(png_ptr, "png_read_image: unsupported transformation"); } @@ -3898,7 +3921,7 @@ png_image_read_direct(png_voidp argument) * * TODO: remove the do_local_background fixup below. */ - if (!do_local_compose && do_local_background != 2) + if (do_local_compose == 0 && do_local_background != 2) passes = png_set_interlace_handling(png_ptr); png_read_update_info(png_ptr, info_ptr); @@ -3906,13 +3929,13 @@ png_image_read_direct(png_voidp argument) { png_uint_32 info_format = 0; - if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) + if ((info_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0) info_format |= PNG_FORMAT_FLAG_COLOR; - if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) + if ((info_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0) { /* do_local_compose removes this channel below. */ - if (!do_local_compose) + if (do_local_compose == 0) { /* do_local_background does the same if required. */ if (do_local_background != 2 || @@ -3921,21 +3944,21 @@ png_image_read_direct(png_voidp argument) } } - else if (do_local_compose) /* internal error */ + else if (do_local_compose != 0) /* internal error */ png_error(png_ptr, "png_image_read: alpha channel lost"); if (info_ptr->bit_depth == 16) info_format |= PNG_FORMAT_FLAG_LINEAR; # ifdef PNG_FORMAT_BGR_SUPPORTED - if (png_ptr->transformations & PNG_BGR) + if ((png_ptr->transformations & PNG_BGR) != 0) info_format |= PNG_FORMAT_FLAG_BGR; # endif # ifdef PNG_FORMAT_AFIRST_SUPPORTED if (do_local_background == 2) { - if (format & PNG_FORMAT_FLAG_AFIRST) + if ((format & PNG_FORMAT_FLAG_AFIRST) != 0) info_format |= PNG_FORMAT_FLAG_AFIRST; } @@ -3964,7 +3987,7 @@ png_image_read_direct(png_voidp argument) png_voidp first_row = display->buffer; ptrdiff_t row_bytes = display->row_stride; - if (linear) + if (linear != 0) row_bytes *= 2; /* The following expression is designed to work correctly whether it gives @@ -3981,7 +4004,7 @@ png_image_read_direct(png_voidp argument) display->row_bytes = row_bytes; } - if (do_local_compose) + if (do_local_compose != 0) { int result; png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr)); @@ -4064,7 +4087,7 @@ png_image_finish_read(png_imagep image, png_const_colorp background, /* Choose the correct 'end' routine; for the color-map case all the * setup has already been done. */ - if (image->format & PNG_FORMAT_FLAG_COLORMAP) + if ((image->format & PNG_FORMAT_FLAG_COLORMAP) != 0) result = png_safe_execute(image, png_image_read_colormap, &display) && png_safe_execute(image, png_image_read_colormapped, &display); @@ -4094,5 +4117,5 @@ png_image_finish_read(png_imagep image, png_const_colorp background, return 0; } -#endif /* PNG_SIMPLIFIED_READ_SUPPORTED */ -#endif /* PNG_READ_SUPPORTED */ +#endif /* SIMPLIFIED_READ */ +#endif /* READ */ diff --git a/lib/libpng/pngrio.c b/lib/libpng/pngrio.c index d75ac5b4dd..1e98395fd7 100644 --- a/lib/libpng/pngrio.c +++ b/lib/libpng/pngrio.c @@ -1,7 +1,7 @@ /* pngrio.c - functions for data input * - * Last changed in libpng 1.6.9 [February 6, 2014] + * Last changed in libpng 1.6.15 [November 20, 2014] * Copyright (c) 1998-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -117,4 +117,4 @@ png_set_read_fn(png_structrp png_ptr, png_voidp io_ptr, png_ptr->output_flush_fn = NULL; #endif } -#endif /* PNG_READ_SUPPORTED */ +#endif /* READ */ diff --git a/lib/libpng/pngrtran.c b/lib/libpng/pngrtran.c index 53953966e6..e6fe9fdbfb 100644 --- a/lib/libpng/pngrtran.c +++ b/lib/libpng/pngrtran.c @@ -1,7 +1,7 @@ /* pngrtran.c - transforms the data in a row for PNG readers * - * Last changed in libpng 1.6.10 [March 6, 2014] + * Last changed in libpng 1.6.15 [November 20, 2014] * Copyright (c) 1998-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -91,14 +91,15 @@ png_set_crc_action(png_structrp png_ptr, int crit_action, int ancil_action) #ifdef PNG_READ_TRANSFORMS_SUPPORTED /* Is it OK to set a transformation now? Only if png_start_read_image or * png_read_update_info have not been called. It is not necessary for the IHDR - * to have been read in all cases, the parameter allows for this check too. + * to have been read in all cases; the need_IHDR parameter allows for this + * check too. */ static int png_rtran_ok(png_structrp png_ptr, int need_IHDR) { if (png_ptr != NULL) { - if (png_ptr->flags & PNG_FLAG_ROW_INIT) + if ((png_ptr->flags & PNG_FLAG_ROW_INIT) != 0) png_app_error(png_ptr, "invalid after png_start_read_image or png_read_update_info"); @@ -127,7 +128,7 @@ png_set_background_fixed(png_structrp png_ptr, { png_debug(1, "in png_set_background_fixed"); - if (!png_rtran_ok(png_ptr, 0) || background_color == NULL) + if (png_rtran_ok(png_ptr, 0) == 0 || background_color == NULL) return; if (background_gamma_code == PNG_BACKGROUND_GAMMA_UNKNOWN) @@ -143,7 +144,7 @@ png_set_background_fixed(png_structrp png_ptr, png_ptr->background = *background_color; png_ptr->background_gamma = background_gamma; png_ptr->background_gamma_type = (png_byte)(background_gamma_code); - if (need_expand) + if (need_expand != 0) png_ptr->transformations |= PNG_BACKGROUND_EXPAND; else png_ptr->transformations &= ~PNG_BACKGROUND_EXPAND; @@ -171,7 +172,7 @@ png_set_scale_16(png_structrp png_ptr) { png_debug(1, "in png_set_scale_16"); - if (!png_rtran_ok(png_ptr, 0)) + if (png_rtran_ok(png_ptr, 0) == 0) return; png_ptr->transformations |= PNG_SCALE_16_TO_8; @@ -185,7 +186,7 @@ png_set_strip_16(png_structrp png_ptr) { png_debug(1, "in png_set_strip_16"); - if (!png_rtran_ok(png_ptr, 0)) + if (png_rtran_ok(png_ptr, 0) == 0) return; png_ptr->transformations |= PNG_16_TO_8; @@ -198,7 +199,7 @@ png_set_strip_alpha(png_structrp png_ptr) { png_debug(1, "in png_set_strip_alpha"); - if (!png_rtran_ok(png_ptr, 0)) + if (png_rtran_ok(png_ptr, 0) == 0) return; png_ptr->transformations |= PNG_STRIP_ALPHA; @@ -226,7 +227,7 @@ translate_gamma_flags(png_structrp png_ptr, png_fixed_point output_gamma, # else PNG_UNUSED(png_ptr) # endif - if (is_screen) + if (is_screen != 0) output_gamma = PNG_GAMMA_sRGB; else output_gamma = PNG_GAMMA_sRGB_INVERSE; @@ -235,7 +236,7 @@ translate_gamma_flags(png_structrp png_ptr, png_fixed_point output_gamma, else if (output_gamma == PNG_GAMMA_MAC_18 || output_gamma == PNG_FP_1 / PNG_GAMMA_MAC_18) { - if (is_screen) + if (is_screen != 0) output_gamma = PNG_GAMMA_MAC_OLD; else output_gamma = PNG_GAMMA_MAC_INVERSE; @@ -279,7 +280,7 @@ png_set_alpha_mode_fixed(png_structrp png_ptr, int mode, png_debug(1, "in png_set_alpha_mode"); - if (!png_rtran_ok(png_ptr, 0)) + if (png_rtran_ok(png_ptr, 0) == 0) return; output_gamma = translate_gamma_flags(png_ptr, output_gamma, 1/*screen*/); @@ -363,7 +364,7 @@ png_set_alpha_mode_fixed(png_structrp png_ptr, int mode, /* Finally, if pre-multiplying, set the background fields to achieve the * desired result. */ - if (compose) + if (compose != 0) { /* And obtain alpha pre-multiplication by composing on black: */ memset(&png_ptr->background, 0, (sizeof png_ptr->background)); @@ -371,7 +372,7 @@ png_set_alpha_mode_fixed(png_structrp png_ptr, int mode, png_ptr->background_gamma_type = PNG_BACKGROUND_GAMMA_FILE; png_ptr->transformations &= ~PNG_BACKGROUND_EXPAND; - if (png_ptr->transformations & PNG_COMPOSE) + if ((png_ptr->transformations & PNG_COMPOSE) != 0) png_error(png_ptr, "conflicting calls to set alpha mode and background"); @@ -415,12 +416,12 @@ png_set_quantize(png_structrp png_ptr, png_colorp palette, { png_debug(1, "in png_set_quantize"); - if (!png_rtran_ok(png_ptr, 0)) + if (png_rtran_ok(png_ptr, 0) == 0) return; png_ptr->transformations |= PNG_QUANTIZE; - if (!full_quantize) + if (full_quantize == 0) { int i; @@ -475,12 +476,12 @@ png_set_quantize(png_structrp png_ptr, png_colorp palette, } } - if (done) + if (done != 0) break; } /* Swap the palette around, and set up a table, if necessary */ - if (full_quantize) + if (full_quantize != 0) { int j = num_palette; @@ -663,7 +664,7 @@ png_set_quantize(png_structrp png_ptr, png_colorp palette, num_new_palette--; palette[png_ptr->index_to_palette[j]] = palette[num_new_palette]; - if (!full_quantize) + if (full_quantize == 0) { int k; @@ -731,7 +732,7 @@ png_set_quantize(png_structrp png_ptr, png_colorp palette, } png_ptr->num_palette = (png_uint_16)num_palette; - if (full_quantize) + if (full_quantize != 0) { int i; png_bytep distance; @@ -793,7 +794,7 @@ png_set_quantize(png_structrp png_ptr, png_colorp palette, png_free(png_ptr, distance); } } -#endif /* PNG_READ_QUANTIZE_SUPPORTED */ +#endif /* READ_QUANTIZE */ #ifdef PNG_READ_GAMMA_SUPPORTED void PNGFAPI @@ -802,7 +803,7 @@ png_set_gamma_fixed(png_structrp png_ptr, png_fixed_point scrn_gamma, { png_debug(1, "in png_set_gamma_fixed"); - if (!png_rtran_ok(png_ptr, 0)) + if (png_rtran_ok(png_ptr, 0) == 0) return; /* New in libpng-1.5.4 - reserve particular negative values as flags. */ @@ -842,7 +843,7 @@ png_set_gamma(png_structrp png_ptr, double scrn_gamma, double file_gamma) png_set_gamma_fixed(png_ptr, convert_gamma_value(png_ptr, scrn_gamma), convert_gamma_value(png_ptr, file_gamma)); } -# endif /* FLOATING_POINT_SUPPORTED */ +# endif /* FLOATING_POINT */ #endif /* READ_GAMMA */ #ifdef PNG_READ_EXPAND_SUPPORTED @@ -855,7 +856,7 @@ png_set_expand(png_structrp png_ptr) { png_debug(1, "in png_set_expand"); - if (!png_rtran_ok(png_ptr, 0)) + if (png_rtran_ok(png_ptr, 0) == 0) return; png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); @@ -885,7 +886,7 @@ png_set_palette_to_rgb(png_structrp png_ptr) { png_debug(1, "in png_set_palette_to_rgb"); - if (!png_rtran_ok(png_ptr, 0)) + if (png_rtran_ok(png_ptr, 0) == 0) return; png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); @@ -897,7 +898,7 @@ png_set_expand_gray_1_2_4_to_8(png_structrp png_ptr) { png_debug(1, "in png_set_expand_gray_1_2_4_to_8"); - if (!png_rtran_ok(png_ptr, 0)) + if (png_rtran_ok(png_ptr, 0) == 0) return; png_ptr->transformations |= PNG_EXPAND; @@ -909,12 +910,12 @@ png_set_tRNS_to_alpha(png_structrp png_ptr) { png_debug(1, "in png_set_tRNS_to_alpha"); - if (!png_rtran_ok(png_ptr, 0)) + if (png_rtran_ok(png_ptr, 0) == 0) return; png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); } -#endif /* defined(PNG_READ_EXPAND_SUPPORTED) */ +#endif /* READ_EXPAND */ #ifdef PNG_READ_EXPAND_16_SUPPORTED /* Expand to 16-bit channels, expand the tRNS chunk too (because otherwise @@ -925,7 +926,7 @@ png_set_expand_16(png_structrp png_ptr) { png_debug(1, "in png_set_expand_16"); - if (!png_rtran_ok(png_ptr, 0)) + if (png_rtran_ok(png_ptr, 0) == 0) return; png_ptr->transformations |= (PNG_EXPAND_16 | PNG_EXPAND | PNG_EXPAND_tRNS); @@ -938,7 +939,7 @@ png_set_gray_to_rgb(png_structrp png_ptr) { png_debug(1, "in png_set_gray_to_rgb"); - if (!png_rtran_ok(png_ptr, 0)) + if (png_rtran_ok(png_ptr, 0) == 0) return; /* Because rgb must be 8 bits or more: */ @@ -956,10 +957,10 @@ png_set_rgb_to_gray_fixed(png_structrp png_ptr, int error_action, /* Need the IHDR here because of the check on color_type below. */ /* TODO: fix this */ - if (!png_rtran_ok(png_ptr, 1)) + if (png_rtran_ok(png_ptr, 1) == 0) return; - switch(error_action) + switch (error_action) { case PNG_ERROR_ACTION_NONE: png_ptr->transformations |= PNG_RGB_TO_GRAY; @@ -998,7 +999,7 @@ png_set_rgb_to_gray_fixed(png_structrp png_ptr, int error_action, png_uint_16 red_int, green_int; /* NOTE: this calculation does not round, but this behavior is retained - * for consistency, the inaccuracy is very small. The code here always + * for consistency; the inaccuracy is very small. The code here always * overwrites the coefficients, regardless of whether they have been * defaulted or set already. */ @@ -1091,7 +1092,7 @@ png_gamma_threshold(png_fixed_point screen_gamma, png_fixed_point file_gamma) * the palette. */ -/*For the moment 'png_init_palette_transformations' and +/* For the moment 'png_init_palette_transformations' and * 'png_init_rgb_transformations' only do some flag canceling optimizations. * The intent is that these two routines should have palette or rgb operations * extracted from 'png_init_read_transformations'. @@ -1131,7 +1132,7 @@ png_init_palette_transformations(png_structrp png_ptr) } /* If no alpha we can optimize. */ - if (!input_has_alpha) + if (input_has_alpha == 0) { /* Any alpha means background and associative alpha processing is * required, however if the alpha is 0 or 1 throughout OPTIMIZE_ALPHA @@ -1140,7 +1141,7 @@ png_init_palette_transformations(png_structrp png_ptr) png_ptr->transformations &= ~PNG_ENCODE_ALPHA; png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA; - if (!input_has_transparency) + if (input_has_transparency == 0) png_ptr->transformations &= ~(PNG_COMPOSE | PNG_BACKGROUND_EXPAND); } @@ -1153,8 +1154,8 @@ png_init_palette_transformations(png_structrp png_ptr) /* The following code cannot be entered in the alpha pre-multiplication case * because PNG_BACKGROUND_EXPAND is cancelled below. */ - if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) && - (png_ptr->transformations & PNG_EXPAND)) + if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) != 0 && + (png_ptr->transformations & PNG_EXPAND) != 0) { { png_ptr->background.red = @@ -1165,9 +1166,9 @@ png_init_palette_transformations(png_structrp png_ptr) png_ptr->palette[png_ptr->background.index].blue; #ifdef PNG_READ_INVERT_ALPHA_SUPPORTED - if (png_ptr->transformations & PNG_INVERT_ALPHA) + if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0) { - if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) + if ((png_ptr->transformations & PNG_EXPAND_tRNS) == 0) { /* Invert the alpha channel (in tRNS) unless the pixels are * going to be expanded, in which case leave it for later @@ -1179,10 +1180,10 @@ png_init_palette_transformations(png_structrp png_ptr) png_ptr->trans_alpha[i]); } } -#endif /* PNG_READ_INVERT_ALPHA_SUPPORTED */ +#endif /* READ_INVERT_ALPHA */ } } /* background expand and (therefore) no alpha association. */ -#endif /* PNG_READ_EXPAND_SUPPORTED && PNG_READ_BACKGROUND_SUPPORTED */ +#endif /* READ_EXPAND && READ_BACKGROUND */ } static void /* PRIVATE */ @@ -1196,7 +1197,7 @@ png_init_rgb_transformations(png_structrp png_ptr) int input_has_transparency = png_ptr->num_trans > 0; /* If no alpha we can optimize. */ - if (!input_has_alpha) + if (input_has_alpha == 0) { /* Any alpha means background and associative alpha processing is * required, however if the alpha is 0 or 1 throughout OPTIMIZE_ALPHA @@ -1207,7 +1208,7 @@ png_init_rgb_transformations(png_structrp png_ptr) png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA; # endif - if (!input_has_transparency) + if (input_has_transparency == 0) png_ptr->transformations &= ~(PNG_COMPOSE | PNG_BACKGROUND_EXPAND); } @@ -1220,9 +1221,9 @@ png_init_rgb_transformations(png_structrp png_ptr) /* The following code cannot be entered in the alpha pre-multiplication case * because PNG_BACKGROUND_EXPAND is cancelled below. */ - if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) && - (png_ptr->transformations & PNG_EXPAND) && - !(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) + if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) != 0 && + (png_ptr->transformations & PNG_EXPAND) != 0 && + (png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0) /* i.e., GRAY or GRAY_ALPHA */ { { @@ -1260,14 +1261,14 @@ png_init_rgb_transformations(png_structrp png_ptr) png_ptr->background.red = png_ptr->background.green = png_ptr->background.blue = (png_uint_16)gray; - if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) + if ((png_ptr->transformations & PNG_EXPAND_tRNS) == 0) { png_ptr->trans_color.red = png_ptr->trans_color.green = png_ptr->trans_color.blue = (png_uint_16)trans_gray; } } } /* background expand and (therefore) no alpha association. */ -#endif /* PNG_READ_EXPAND_SUPPORTED && PNG_READ_BACKGROUND_SUPPORTED */ +#endif /* READ_EXPAND && READ_BACKGROUND */ } void /* PRIVATE */ @@ -1336,7 +1337,7 @@ png_init_read_transformations(png_structrp png_ptr) * the code immediately below if the transform can be handled outside the * row loop. */ - if (gamma_correction) + if (gamma_correction != 0) png_ptr->transformations |= PNG_GAMMA; else @@ -1345,7 +1346,7 @@ png_init_read_transformations(png_structrp png_ptr) #endif /* Certain transformations have the effect of preventing other - * transformations that happen afterward in png_do_read_transformations, + * transformations that happen afterward in png_do_read_transformations; * resolve the interdependencies here. From the code of * png_do_read_transformations the order is: * @@ -1374,8 +1375,8 @@ png_init_read_transformations(png_structrp png_ptr) * 23) PNG_USER_TRANSFORM [must be last] */ #ifdef PNG_READ_STRIP_ALPHA_SUPPORTED - if ((png_ptr->transformations & PNG_STRIP_ALPHA) && - !(png_ptr->transformations & PNG_COMPOSE)) + if ((png_ptr->transformations & PNG_STRIP_ALPHA) != 0 && + (png_ptr->transformations & PNG_COMPOSE) == 0) { /* Stripping the alpha channel happens immediately after the 'expand' * transformations, before all other transformation, so it cancels out @@ -1401,7 +1402,7 @@ png_init_read_transformations(png_structrp png_ptr) /* If the screen gamma is about 1.0 then the OPTIMIZE_ALPHA and ENCODE_ALPHA * settings will have no effect. */ - if (!png_gamma_significant(png_ptr->screen_gamma)) + if (png_gamma_significant(png_ptr->screen_gamma) == 0) { png_ptr->transformations &= ~PNG_ENCODE_ALPHA; png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA; @@ -1412,7 +1413,7 @@ png_init_read_transformations(png_structrp png_ptr) /* Make sure the coefficients for the rgb to gray conversion are set * appropriately. */ - if (png_ptr->transformations & PNG_RGB_TO_GRAY) + if ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0) png_colorspace_set_rgb_coefficients(png_ptr); #endif @@ -1433,23 +1434,23 @@ png_init_read_transformations(png_structrp png_ptr) * png_set_background, along with the bit depth, then the code has a record * of exactly what color space the background is currently in. */ - if (png_ptr->transformations & PNG_BACKGROUND_EXPAND) + if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) != 0) { /* PNG_BACKGROUND_EXPAND: the background is in the file color space, so if * the file was grayscale the background value is gray. */ - if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) + if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0) png_ptr->mode |= PNG_BACKGROUND_IS_GRAY; } - else if (png_ptr->transformations & PNG_COMPOSE) + else if ((png_ptr->transformations & PNG_COMPOSE) != 0) { /* PNG_COMPOSE: png_set_background was called with need_expand false, * so the color is in the color space of the output or png_set_alpha_mode * was called and the color is black. Ignore RGB_TO_GRAY because that * happens before GRAY_TO_RGB. */ - if (png_ptr->transformations & PNG_GRAY_TO_RGB) + if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0) { if (png_ptr->background.red == png_ptr->background.green && png_ptr->background.red == png_ptr->background.blue) @@ -1459,8 +1460,8 @@ png_init_read_transformations(png_structrp png_ptr) } } } -#endif /* PNG_READ_EXPAND_SUPPORTED && PNG_READ_BACKGROUND_SUPPORTED */ -#endif /* PNG_READ_GRAY_TO_RGB_SUPPORTED */ +#endif /* READ_EXPAND && READ_BACKGROUND */ +#endif /* READ_GRAY_TO_RGB */ /* For indexed PNG data (PNG_COLOR_TYPE_PALETTE) many of the transformations * can be performed directly on the palette, and some (such as rgb to gray) @@ -1481,10 +1482,10 @@ png_init_read_transformations(png_structrp png_ptr) #if defined(PNG_READ_BACKGROUND_SUPPORTED) && \ defined(PNG_READ_EXPAND_16_SUPPORTED) - if ((png_ptr->transformations & PNG_EXPAND_16) && - (png_ptr->transformations & PNG_COMPOSE) && - !(png_ptr->transformations & PNG_BACKGROUND_EXPAND) && - png_ptr->bit_depth != 16) + if ((png_ptr->transformations & PNG_EXPAND_16) != 0 && + (png_ptr->transformations & PNG_COMPOSE) != 0 && + (png_ptr->transformations & PNG_BACKGROUND_EXPAND) == 0 && + png_ptr->bit_depth != 16) { /* TODO: fix this. Because the expand_16 operation is after the compose * handling the background color must be 8, not 16, bits deep, but the @@ -1503,15 +1504,15 @@ png_init_read_transformations(png_structrp png_ptr) CHOP(png_ptr->background.gray); # undef CHOP } -#endif /* PNG_READ_BACKGROUND_SUPPORTED && PNG_READ_EXPAND_16_SUPPORTED */ +#endif /* READ_BACKGROUND && READ_EXPAND_16 */ #if defined(PNG_READ_BACKGROUND_SUPPORTED) && \ (defined(PNG_READ_SCALE_16_TO_8_SUPPORTED) || \ defined(PNG_READ_STRIP_16_TO_8_SUPPORTED)) - if ((png_ptr->transformations & (PNG_16_TO_8|PNG_SCALE_16_TO_8)) && - (png_ptr->transformations & PNG_COMPOSE) && - !(png_ptr->transformations & PNG_BACKGROUND_EXPAND) && - png_ptr->bit_depth == 16) + if ((png_ptr->transformations & (PNG_16_TO_8|PNG_SCALE_16_TO_8)) != 0 && + (png_ptr->transformations & PNG_COMPOSE) != 0 && + (png_ptr->transformations & PNG_BACKGROUND_EXPAND) == 0 && + png_ptr->bit_depth == 16) { /* On the other hand, if a 16-bit file is to be reduced to 8-bits per * component this will also happen after PNG_COMPOSE and so the background @@ -1554,25 +1555,24 @@ png_init_read_transformations(png_structrp png_ptr) * file gamma - if it is not 1.0 both RGB_TO_GRAY and COMPOSE need the * tables. */ - if ((png_ptr->transformations & PNG_GAMMA) - || ((png_ptr->transformations & PNG_RGB_TO_GRAY) - && (png_gamma_significant(png_ptr->colorspace.gamma) || - png_gamma_significant(png_ptr->screen_gamma))) - || ((png_ptr->transformations & PNG_COMPOSE) - && (png_gamma_significant(png_ptr->colorspace.gamma) - || png_gamma_significant(png_ptr->screen_gamma) + if ((png_ptr->transformations & PNG_GAMMA) != 0 || + ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0 && + (png_gamma_significant(png_ptr->colorspace.gamma) != 0 || + png_gamma_significant(png_ptr->screen_gamma) != 0)) || + ((png_ptr->transformations & PNG_COMPOSE) != 0 && + (png_gamma_significant(png_ptr->colorspace.gamma) != 0 || + png_gamma_significant(png_ptr->screen_gamma) != 0 # ifdef PNG_READ_BACKGROUND_SUPPORTED - || (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_UNIQUE - && png_gamma_significant(png_ptr->background_gamma)) + || (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_UNIQUE && + png_gamma_significant(png_ptr->background_gamma) != 0) # endif - )) || ((png_ptr->transformations & PNG_ENCODE_ALPHA) - && png_gamma_significant(png_ptr->screen_gamma)) - ) + )) || ((png_ptr->transformations & PNG_ENCODE_ALPHA) != 0 && + png_gamma_significant(png_ptr->screen_gamma) != 0)) { png_build_gamma_table(png_ptr, png_ptr->bit_depth); #ifdef PNG_READ_BACKGROUND_SUPPORTED - if (png_ptr->transformations & PNG_COMPOSE) + if ((png_ptr->transformations & PNG_COMPOSE) != 0) { /* Issue a warning about this combination: because RGB_TO_GRAY is * optimized to do the gamma transform if present yet do_background has @@ -1580,11 +1580,11 @@ png_init_read_transformations(png_structrp png_ptr) * double-gamma-correction happens. This is true in all versions of * libpng to date. */ - if (png_ptr->transformations & PNG_RGB_TO_GRAY) + if ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0) png_warning(png_ptr, "libpng does not support gamma+background+rgb_to_gray"); - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + if ((png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) != 0) { /* We don't get to here unless there is a tRNS chunk with non-opaque * entries - see the checking code at the start of this function. @@ -1632,7 +1632,7 @@ png_init_read_transformations(png_structrp png_ptr) break; } - if (png_gamma_significant(gs)) + if (png_gamma_significant(gs) != 0) { back.red = png_gamma_8bit_correct(png_ptr->background.red, gs); @@ -1649,7 +1649,7 @@ png_init_read_transformations(png_structrp png_ptr) back.blue = (png_byte)png_ptr->background.blue; } - if (png_gamma_significant(g)) + if (png_gamma_significant(g) != 0) { back_1.red = png_gamma_8bit_correct(png_ptr->background.red, g); @@ -1743,11 +1743,11 @@ png_init_read_transformations(png_structrp png_ptr) g_sig = png_gamma_significant(g); gs_sig = png_gamma_significant(gs); - if (g_sig) + if (g_sig != 0) png_ptr->background_1.gray = png_gamma_correct(png_ptr, png_ptr->background.gray, g); - if (gs_sig) + if (gs_sig != 0) png_ptr->background.gray = png_gamma_correct(png_ptr, png_ptr->background.gray, gs); @@ -1756,7 +1756,7 @@ png_init_read_transformations(png_structrp png_ptr) (png_ptr->background.red != png_ptr->background.gray)) { /* RGB or RGBA with color background */ - if (g_sig) + if (g_sig != 0) { png_ptr->background_1.red = png_gamma_correct(png_ptr, png_ptr->background.red, g); @@ -1768,7 +1768,7 @@ png_init_read_transformations(png_structrp png_ptr) png_ptr->background.blue, g); } - if (gs_sig) + if (gs_sig != 0) { png_ptr->background.red = png_gamma_correct(png_ptr, png_ptr->background.red, gs); @@ -1798,7 +1798,7 @@ png_init_read_transformations(png_structrp png_ptr) else /* Transformation does not include PNG_BACKGROUND */ -#endif /* PNG_READ_BACKGROUND_SUPPORTED */ +#endif /* READ_BACKGROUND */ if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED /* RGB_TO_GRAY needs to have non-gamma-corrected values! */ @@ -1828,11 +1828,11 @@ png_init_read_transformations(png_structrp png_ptr) #ifdef PNG_READ_BACKGROUND_SUPPORTED else #endif -#endif /* PNG_READ_GAMMA_SUPPORTED */ +#endif /* READ_GAMMA */ #ifdef PNG_READ_BACKGROUND_SUPPORTED /* No GAMMA transformation (see the hanging else 4 lines above) */ - if ((png_ptr->transformations & PNG_COMPOSE) && + if ((png_ptr->transformations & PNG_COMPOSE) != 0 && (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)) { int i; @@ -1867,11 +1867,11 @@ png_init_read_transformations(png_structrp png_ptr) png_ptr->transformations &= ~PNG_COMPOSE; } -#endif /* PNG_READ_BACKGROUND_SUPPORTED */ +#endif /* READ_BACKGROUND */ #ifdef PNG_READ_SHIFT_SUPPORTED - if ((png_ptr->transformations & PNG_SHIFT) && - !(png_ptr->transformations & PNG_EXPAND) && + if ((png_ptr->transformations & PNG_SHIFT) != 0 && + (png_ptr->transformations & PNG_EXPAND) == 0 && (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)) { int i; @@ -1913,7 +1913,7 @@ png_init_read_transformations(png_structrp png_ptr) png_ptr->palette[i].blue = (png_byte)component; } } -#endif /* PNG_READ_SHIFT_SUPPORTED */ +#endif /* READ_SHIFT */ } /* Modify the info structure to reflect the transformations. The @@ -1926,7 +1926,7 @@ png_read_transform_info(png_structrp png_ptr, png_inforp info_ptr) png_debug(1, "in png_read_transform_info"); #ifdef PNG_READ_EXPAND_SUPPORTED - if (png_ptr->transformations & PNG_EXPAND) + if ((png_ptr->transformations & PNG_EXPAND) != 0) { if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { @@ -1948,9 +1948,9 @@ png_read_transform_info(png_structrp png_ptr, png_inforp info_ptr) } else { - if (png_ptr->num_trans) + if (png_ptr->num_trans != 0) { - if (png_ptr->transformations & PNG_EXPAND_tRNS) + if ((png_ptr->transformations & PNG_EXPAND_tRNS) != 0) info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; } if (info_ptr->bit_depth < 8) @@ -1966,7 +1966,7 @@ png_read_transform_info(png_structrp png_ptr, png_inforp info_ptr) /* The following is almost certainly wrong unless the background value is in * the screen space! */ - if (png_ptr->transformations & PNG_COMPOSE) + if ((png_ptr->transformations & PNG_COMPOSE) != 0) info_ptr->background = png_ptr->background; #endif @@ -1987,12 +1987,12 @@ png_read_transform_info(png_structrp png_ptr, png_inforp info_ptr) { # ifdef PNG_READ_16BIT_SUPPORTED # ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED - if (png_ptr->transformations & PNG_SCALE_16_TO_8) + if ((png_ptr->transformations & PNG_SCALE_16_TO_8) != 0) info_ptr->bit_depth = 8; # endif # ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED - if (png_ptr->transformations & PNG_16_TO_8) + if ((png_ptr->transformations & PNG_16_TO_8) != 0) info_ptr->bit_depth = 8; # endif @@ -2018,27 +2018,27 @@ png_read_transform_info(png_structrp png_ptr, png_inforp info_ptr) CONFIGURATION ERROR: you must enable at least one 16 to 8 method # endif # endif -#endif /* !READ_16BIT_SUPPORTED */ +#endif /* !READ_16BIT */ } #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED - if (png_ptr->transformations & PNG_GRAY_TO_RGB) + if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0) info_ptr->color_type = (png_byte)(info_ptr->color_type | PNG_COLOR_MASK_COLOR); #endif #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED - if (png_ptr->transformations & PNG_RGB_TO_GRAY) + if ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0) info_ptr->color_type = (png_byte)(info_ptr->color_type & ~PNG_COLOR_MASK_COLOR); #endif #ifdef PNG_READ_QUANTIZE_SUPPORTED - if (png_ptr->transformations & PNG_QUANTIZE) + if ((png_ptr->transformations & PNG_QUANTIZE) != 0) { if (((info_ptr->color_type == PNG_COLOR_TYPE_RGB) || (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)) && - png_ptr->palette_lookup && info_ptr->bit_depth == 8) + png_ptr->palette_lookup != 0 && info_ptr->bit_depth == 8) { info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; } @@ -2046,29 +2046,31 @@ png_read_transform_info(png_structrp png_ptr, png_inforp info_ptr) #endif #ifdef PNG_READ_EXPAND_16_SUPPORTED - if (png_ptr->transformations & PNG_EXPAND_16 && info_ptr->bit_depth == 8 && - info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) + if ((png_ptr->transformations & PNG_EXPAND_16) != 0 && + info_ptr->bit_depth == 8 && + info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) { info_ptr->bit_depth = 16; } #endif #ifdef PNG_READ_PACK_SUPPORTED - if ((png_ptr->transformations & PNG_PACK) && (info_ptr->bit_depth < 8)) + if ((png_ptr->transformations & PNG_PACK) != 0 && + (info_ptr->bit_depth < 8)) info_ptr->bit_depth = 8; #endif if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) info_ptr->channels = 1; - else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) + else if ((info_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0) info_ptr->channels = 3; else info_ptr->channels = 1; #ifdef PNG_READ_STRIP_ALPHA_SUPPORTED - if (png_ptr->transformations & PNG_STRIP_ALPHA) + if ((png_ptr->transformations & PNG_STRIP_ALPHA) != 0) { info_ptr->color_type = (png_byte)(info_ptr->color_type & ~PNG_COLOR_MASK_ALPHA); @@ -2076,25 +2078,25 @@ png_read_transform_info(png_structrp png_ptr, png_inforp info_ptr) } #endif - if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) + if ((info_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0) info_ptr->channels++; #ifdef PNG_READ_FILLER_SUPPORTED /* STRIP_ALPHA and FILLER allowed: MASK_ALPHA bit stripped above */ - if ((png_ptr->transformations & PNG_FILLER) && - ((info_ptr->color_type == PNG_COLOR_TYPE_RGB) || - (info_ptr->color_type == PNG_COLOR_TYPE_GRAY))) + if ((png_ptr->transformations & PNG_FILLER) != 0 && + (info_ptr->color_type == PNG_COLOR_TYPE_RGB || + info_ptr->color_type == PNG_COLOR_TYPE_GRAY)) { info_ptr->channels++; /* If adding a true alpha channel not just filler */ - if (png_ptr->transformations & PNG_ADD_ALPHA) + if ((png_ptr->transformations & PNG_ADD_ALPHA) != 0) info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; } #endif #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) && \ defined(PNG_READ_USER_TRANSFORM_SUPPORTED) - if (png_ptr->transformations & PNG_USER_TRANSFORM) + if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0) { if (info_ptr->bit_depth < png_ptr->user_transform_depth) info_ptr->bit_depth = png_ptr->user_transform_depth; @@ -2118,7 +2120,7 @@ defined(PNG_READ_USER_TRANSFORM_SUPPORTED) png_ptr->info_rowbytes = info_ptr->rowbytes; #ifndef PNG_READ_EXPAND_SUPPORTED - if (png_ptr) + if (png_ptr != NULL) return; #endif } @@ -2245,7 +2247,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row, int channels = 0; int bit_depth = row_info->bit_depth; - if (color_type & PNG_COLOR_MASK_COLOR) + if ((color_type & PNG_COLOR_MASK_COLOR) != 0) { shift[channels++] = bit_depth - sig_bits->red; shift[channels++] = bit_depth - sig_bits->green; @@ -2257,7 +2259,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row, shift[channels++] = bit_depth - sig_bits->gray; } - if (color_type & PNG_COLOR_MASK_ALPHA) + if ((color_type & PNG_COLOR_MASK_ALPHA) != 0) { shift[channels++] = bit_depth - sig_bits->alpha; } @@ -2277,7 +2279,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row, have_shift = 1; } - if (!have_shift) + if (have_shift == 0) return; } @@ -2671,7 +2673,7 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, { if (row_info->bit_depth == 8) { - if (flags & PNG_FLAG_FILLER_AFTER) + if ((flags & PNG_FLAG_FILLER_AFTER) != 0) { /* This changes the data from G to GX */ png_bytep sp = row + (png_size_t)row_width; @@ -2706,7 +2708,7 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, #ifdef PNG_READ_16BIT_SUPPORTED else if (row_info->bit_depth == 16) { - if (flags & PNG_FLAG_FILLER_AFTER) + if ((flags & PNG_FLAG_FILLER_AFTER) != 0) { /* This changes the data from GG to GGXX */ png_bytep sp = row + (png_size_t)row_width * 2; @@ -2748,7 +2750,7 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, { if (row_info->bit_depth == 8) { - if (flags & PNG_FLAG_FILLER_AFTER) + if ((flags & PNG_FLAG_FILLER_AFTER) != 0) { /* This changes the data from RGB to RGBX */ png_bytep sp = row + (png_size_t)row_width * 3; @@ -2787,7 +2789,7 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, #ifdef PNG_READ_16BIT_SUPPORTED else if (row_info->bit_depth == 16) { - if (flags & PNG_FLAG_FILLER_AFTER) + if ((flags & PNG_FLAG_FILLER_AFTER) != 0) { /* This changes the data from RRGGBB to RRGGBBXX */ png_bytep sp = row + (png_size_t)row_width * 6; @@ -2848,7 +2850,7 @@ png_do_gray_to_rgb(png_row_infop row_info, png_bytep row) png_debug(1, "in png_do_gray_to_rgb"); if (row_info->bit_depth >= 8 && - !(row_info->color_type & PNG_COLOR_MASK_COLOR)) + (row_info->color_type & PNG_COLOR_MASK_COLOR) == 0) { if (row_info->color_type == PNG_COLOR_TYPE_GRAY) { @@ -2986,8 +2988,8 @@ png_do_rgb_to_gray(png_structrp png_ptr, png_row_infop row_info, png_bytep row) png_debug(1, "in png_do_rgb_to_gray"); - if (!(row_info->color_type & PNG_COLOR_MASK_PALETTE) && - (row_info->color_type & PNG_COLOR_MASK_COLOR)) + if ((row_info->color_type & PNG_COLOR_MASK_PALETTE) == 0 && + (row_info->color_type & PNG_COLOR_MASK_COLOR) != 0) { PNG_CONST png_uint_32 rc = png_ptr->rgb_to_gray_red_coeff; PNG_CONST png_uint_32 gc = png_ptr->rgb_to_gray_green_coeff; @@ -3038,7 +3040,7 @@ png_do_rgb_to_gray(png_structrp png_ptr, png_row_infop row_info, png_bytep row) *(dp++) = red; } - if (have_alpha) + if (have_alpha != 0) *(dp++) = *(sp++); } } @@ -3067,7 +3069,7 @@ png_do_rgb_to_gray(png_structrp png_ptr, png_row_infop row_info, png_bytep row) else *(dp++) = red; - if (have_alpha) + if (have_alpha != 0) *(dp++) = *(sp++); } } @@ -3086,15 +3088,15 @@ png_do_rgb_to_gray(png_structrp png_ptr, png_row_infop row_info, png_bytep row) { png_uint_16 red, green, blue, w; - red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; - green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; - blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; + red = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2; + green = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2; + blue = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2; if (red == green && red == blue) { if (png_ptr->gamma_16_table != NULL) - w = png_ptr->gamma_16_table[(red&0xff) - >> png_ptr->gamma_shift][red>>8]; + w = png_ptr->gamma_16_table[(red & 0xff) + >> png_ptr->gamma_shift][red >> 8]; else w = red; @@ -3119,7 +3121,7 @@ png_do_rgb_to_gray(png_structrp png_ptr, png_row_infop row_info, png_bytep row) *(dp++) = (png_byte)((w>>8) & 0xff); *(dp++) = (png_byte)(w & 0xff); - if (have_alpha) + if (have_alpha != 0) { *(dp++) = *(sp++); *(dp++) = *(sp++); @@ -3137,9 +3139,9 @@ png_do_rgb_to_gray(png_structrp png_ptr, png_row_infop row_info, png_bytep row) { png_uint_16 red, green, blue, gray16; - red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; - green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; - blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; + red = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2; + green = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2; + blue = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2; if (red != green || red != blue) rgb_error |= 1; @@ -3150,10 +3152,10 @@ png_do_rgb_to_gray(png_structrp png_ptr, png_row_infop row_info, png_bytep row) */ gray16 = (png_uint_16)((rc*red + gc*green + bc*blue + 16384) >> 15); - *(dp++) = (png_byte)((gray16>>8) & 0xff); + *(dp++) = (png_byte)((gray16 >> 8) & 0xff); *(dp++) = (png_byte)(gray16 & 0xff); - if (have_alpha) + if (have_alpha != 0) { *(dp++) = *(sp++); *(dp++) = *(sp++); @@ -3221,7 +3223,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr) *sp = (png_byte)(tmp & 0xff); } - if (!shift) + if (shift == 0) { shift = 7; sp++; @@ -3260,7 +3262,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr) *sp = (png_byte)(tmp & 0xff); } - if (!shift) + if (shift == 0) { shift = 6; sp++; @@ -3286,7 +3288,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr) *sp = (png_byte)(tmp & 0xff); } - if (!shift) + if (shift == 0) { shift = 6; sp++; @@ -3326,7 +3328,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr) *sp = (png_byte)(tmp & 0xff); } - if (!shift) + if (shift == 0) { shift = 4; sp++; @@ -3352,7 +3354,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr) *sp = (png_byte)(tmp & 0xff); } - if (!shift) + if (shift == 0) { shift = 4; sp++; @@ -3605,7 +3607,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr) v = gamma_to_1[*sp]; png_composite(w, v, a, png_ptr->background_1.gray); - if (!optimize) + if (optimize == 0) w = gamma_from_1[w]; *sp = w; } @@ -3662,7 +3664,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr) g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; png_composite_16(v, g, a, png_ptr->background_1.gray); - if (optimize) + if (optimize != 0) w = v; else w = gamma_16_from_1[(v&0xff) >> gamma_shift][v >> 8]; @@ -3736,17 +3738,17 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr) v = gamma_to_1[*sp]; png_composite(w, v, a, png_ptr->background_1.red); - if (!optimize) w = gamma_from_1[w]; + if (optimize == 0) w = gamma_from_1[w]; *sp = w; v = gamma_to_1[*(sp + 1)]; png_composite(w, v, a, png_ptr->background_1.green); - if (!optimize) w = gamma_from_1[w]; + if (optimize == 0) w = gamma_from_1[w]; *(sp + 1) = w; v = gamma_to_1[*(sp + 2)]; png_composite(w, v, a, png_ptr->background_1.blue); - if (!optimize) w = gamma_from_1[w]; + if (optimize == 0) w = gamma_from_1[w]; *(sp + 2) = w; } } @@ -3828,7 +3830,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr) v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; png_composite_16(w, v, a, png_ptr->background_1.red); - if (!optimize) + if (optimize == 0) w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; *sp = (png_byte)((w >> 8) & 0xff); @@ -3836,7 +3838,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr) v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)]; png_composite_16(w, v, a, png_ptr->background_1.green); - if (!optimize) + if (optimize == 0) w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; @@ -3845,7 +3847,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr) v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)]; png_composite_16(w, v, a, png_ptr->background_1.blue); - if (!optimize) + if (optimize == 0) w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; @@ -3910,7 +3912,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr) } } } -#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_READ_ALPHA_MODE_SUPPORTED */ +#endif /* READ_BACKGROUND || READ_ALPHA_MODE */ #ifdef PNG_READ_GAMMA_SUPPORTED /* Gamma correct the image, avoiding the alpha channel. Make sure @@ -4127,7 +4129,7 @@ png_do_encode_alpha(png_row_infop row_info, png_bytep row, png_structrp png_ptr) png_debug(1, "in png_do_encode_alpha"); - if (row_info->color_type & PNG_COLOR_MASK_ALPHA) + if ((row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0) { if (row_info->bit_depth == 8) { @@ -4353,7 +4355,7 @@ png_do_expand(png_row_infop row_info, png_bytep row, { if (row_info->color_type == PNG_COLOR_TYPE_GRAY) { - unsigned int gray = trans_color ? trans_color->gray : 0; + unsigned int gray = trans_color != NULL ? trans_color->gray : 0; if (row_info->bit_depth < 8) { @@ -4497,7 +4499,8 @@ png_do_expand(png_row_infop row_info, png_bytep row, row_width); } } - else if (row_info->color_type == PNG_COLOR_TYPE_RGB && trans_color) + else if (row_info->color_type == PNG_COLOR_TYPE_RGB && + trans_color != NULL) { if (row_info->bit_depth == 8) { @@ -4688,7 +4691,7 @@ png_do_quantize(png_row_infop row_info, png_bytep row, } } } -#endif /* PNG_READ_QUANTIZE_SUPPORTED */ +#endif /* READ_QUANTIZE */ /* Transform the row. The order of transformations is significant, * and is very touchy. If you add a transformation, take care to @@ -4715,7 +4718,7 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info) * demand, if necessary. */ if ((png_ptr->flags & PNG_FLAG_DETECT_UNINITIALIZED) != 0 && - !(png_ptr->flags & PNG_FLAG_ROW_INIT)) + (png_ptr->flags & PNG_FLAG_ROW_INIT) == 0) { /* Application has failed to call either png_read_start_image() or * png_read_update_info() after setting transforms that expand pixels. @@ -4725,7 +4728,7 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info) } #ifdef PNG_READ_EXPAND_SUPPORTED - if (png_ptr->transformations & PNG_EXPAND) + if ((png_ptr->transformations & PNG_EXPAND) != 0) { if (row_info->color_type == PNG_COLOR_TYPE_PALETTE) { @@ -4735,8 +4738,8 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info) else { - if (png_ptr->num_trans && - (png_ptr->transformations & PNG_EXPAND_tRNS)) + if (png_ptr->num_trans != 0 && + (png_ptr->transformations & PNG_EXPAND_tRNS) != 0) png_do_expand(row_info, png_ptr->row_buf + 1, &(png_ptr->trans_color)); @@ -4748,22 +4751,22 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info) #endif #ifdef PNG_READ_STRIP_ALPHA_SUPPORTED - if ((png_ptr->transformations & PNG_STRIP_ALPHA) && - !(png_ptr->transformations & PNG_COMPOSE) && - (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA || - row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)) + if ((png_ptr->transformations & PNG_STRIP_ALPHA) != 0 && + (png_ptr->transformations & PNG_COMPOSE) == 0 && + (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA || + row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)) png_do_strip_channel(row_info, png_ptr->row_buf + 1, 0 /* at_start == false, because SWAP_ALPHA happens later */); #endif #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED - if (png_ptr->transformations & PNG_RGB_TO_GRAY) + if ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0) { int rgb_error = png_do_rgb_to_gray(png_ptr, row_info, png_ptr->row_buf + 1); - if (rgb_error) + if (rgb_error != 0) { png_ptr->rgb_to_gray_status=1; if ((png_ptr->transformations & PNG_RGB_TO_GRAY) == @@ -4812,22 +4815,22 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info) /* If gray -> RGB, do so now only if background is non-gray; else do later * for performance reasons */ - if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && - !(png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) + if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0 && + (png_ptr->mode & PNG_BACKGROUND_IS_GRAY) == 0) png_do_gray_to_rgb(row_info, png_ptr->row_buf + 1); #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\ defined(PNG_READ_ALPHA_MODE_SUPPORTED) - if (png_ptr->transformations & PNG_COMPOSE) + if ((png_ptr->transformations & PNG_COMPOSE) != 0) png_do_compose(row_info, png_ptr->row_buf + 1, png_ptr); #endif #ifdef PNG_READ_GAMMA_SUPPORTED - if ((png_ptr->transformations & PNG_GAMMA) && + if ((png_ptr->transformations & PNG_GAMMA) != 0 && #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED /* Because RGB_TO_GRAY does the gamma transform. */ - !(png_ptr->transformations & PNG_RGB_TO_GRAY) && + (png_ptr->transformations & PNG_RGB_TO_GRAY) == 0 && #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\ defined(PNG_READ_ALPHA_MODE_SUPPORTED) @@ -4836,7 +4839,7 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info) */ !((png_ptr->transformations & PNG_COMPOSE) && ((png_ptr->num_trans != 0) || - (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) && + (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)) && #endif /* Because png_init_read_transformations transforms the palette, unless * RGB_TO_GRAY will do the transform. @@ -4846,22 +4849,22 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info) #endif #ifdef PNG_READ_STRIP_ALPHA_SUPPORTED - if ((png_ptr->transformations & PNG_STRIP_ALPHA) && - (png_ptr->transformations & PNG_COMPOSE) && - (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA || - row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)) + if ((png_ptr->transformations & PNG_STRIP_ALPHA) != 0 && + (png_ptr->transformations & PNG_COMPOSE) != 0 && + (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA || + row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)) png_do_strip_channel(row_info, png_ptr->row_buf + 1, - 0 /* at_start == false, because SWAP_ALPHA happens later */); + 0 /* at_start == false, because SWAP_ALPHA happens later */); #endif #ifdef PNG_READ_ALPHA_MODE_SUPPORTED - if ((png_ptr->transformations & PNG_ENCODE_ALPHA) && - (row_info->color_type & PNG_COLOR_MASK_ALPHA)) + if ((png_ptr->transformations & PNG_ENCODE_ALPHA) != 0 && + (row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0) png_do_encode_alpha(row_info, png_ptr->row_buf + 1, png_ptr); #endif #ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED - if (png_ptr->transformations & PNG_SCALE_16_TO_8) + if ((png_ptr->transformations & PNG_SCALE_16_TO_8) != 0) png_do_scale_16_to_8(row_info, png_ptr->row_buf + 1); #endif @@ -4870,12 +4873,12 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info) * by putting the 'scale' option first if the app asks for scale (either by * calling the API or in a TRANSFORM flag) this is what happens. */ - if (png_ptr->transformations & PNG_16_TO_8) + if ((png_ptr->transformations & PNG_16_TO_8) != 0) png_do_chop(row_info, png_ptr->row_buf + 1); #endif #ifdef PNG_READ_QUANTIZE_SUPPORTED - if (png_ptr->transformations & PNG_QUANTIZE) + if ((png_ptr->transformations & PNG_QUANTIZE) != 0) { png_do_quantize(row_info, png_ptr->row_buf + 1, png_ptr->palette_lookup, png_ptr->quantize_index); @@ -4883,7 +4886,7 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info) if (row_info->rowbytes == 0) png_error(png_ptr, "png_do_quantize returned rowbytes=0"); } -#endif /* PNG_READ_QUANTIZE_SUPPORTED */ +#endif /* READ_QUANTIZE */ #ifdef PNG_READ_EXPAND_16_SUPPORTED /* Do the expansion now, after all the arithmetic has been done. Notice @@ -4891,35 +4894,35 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info) * is efficient (particularly true in the case of gamma correction, where * better accuracy results faster!) */ - if (png_ptr->transformations & PNG_EXPAND_16) + if ((png_ptr->transformations & PNG_EXPAND_16) != 0) png_do_expand_16(row_info, png_ptr->row_buf + 1); #endif #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED /* NOTE: moved here in 1.5.4 (from much later in this list.) */ - if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && - (png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) + if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0 && + (png_ptr->mode & PNG_BACKGROUND_IS_GRAY) != 0) png_do_gray_to_rgb(row_info, png_ptr->row_buf + 1); #endif #ifdef PNG_READ_INVERT_SUPPORTED - if (png_ptr->transformations & PNG_INVERT_MONO) + if ((png_ptr->transformations & PNG_INVERT_MONO) != 0) png_do_invert(row_info, png_ptr->row_buf + 1); #endif #ifdef PNG_READ_INVERT_ALPHA_SUPPORTED - if (png_ptr->transformations & PNG_INVERT_ALPHA) + if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0) png_do_read_invert_alpha(row_info, png_ptr->row_buf + 1); #endif #ifdef PNG_READ_SHIFT_SUPPORTED - if (png_ptr->transformations & PNG_SHIFT) + if ((png_ptr->transformations & PNG_SHIFT) != 0) png_do_unshift(row_info, png_ptr->row_buf + 1, &(png_ptr->shift)); #endif #ifdef PNG_READ_PACK_SUPPORTED - if (png_ptr->transformations & PNG_PACK) + if ((png_ptr->transformations & PNG_PACK) != 0) png_do_unpack(row_info, png_ptr->row_buf + 1); #endif @@ -4931,36 +4934,36 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info) #endif #ifdef PNG_READ_BGR_SUPPORTED - if (png_ptr->transformations & PNG_BGR) + if ((png_ptr->transformations & PNG_BGR) != 0) png_do_bgr(row_info, png_ptr->row_buf + 1); #endif #ifdef PNG_READ_PACKSWAP_SUPPORTED - if (png_ptr->transformations & PNG_PACKSWAP) + if ((png_ptr->transformations & PNG_PACKSWAP) != 0) png_do_packswap(row_info, png_ptr->row_buf + 1); #endif #ifdef PNG_READ_FILLER_SUPPORTED - if (png_ptr->transformations & PNG_FILLER) + if ((png_ptr->transformations & PNG_FILLER) != 0) png_do_read_filler(row_info, png_ptr->row_buf + 1, (png_uint_32)png_ptr->filler, png_ptr->flags); #endif #ifdef PNG_READ_SWAP_ALPHA_SUPPORTED - if (png_ptr->transformations & PNG_SWAP_ALPHA) + if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0) png_do_read_swap_alpha(row_info, png_ptr->row_buf + 1); #endif #ifdef PNG_READ_16BIT_SUPPORTED #ifdef PNG_READ_SWAP_SUPPORTED - if (png_ptr->transformations & PNG_SWAP_BYTES) + if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0) png_do_swap(row_info, png_ptr->row_buf + 1); #endif #endif #ifdef PNG_READ_USER_TRANSFORM_SUPPORTED - if (png_ptr->transformations & PNG_USER_TRANSFORM) - { + if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0) + { if (png_ptr->read_user_transform_fn != NULL) (*(png_ptr->read_user_transform_fn)) /* User read transform function */ (png_ptr, /* png_ptr */ @@ -4973,10 +4976,10 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info) /* png_byte pixel_depth; bits per pixel (depth*channels) */ png_ptr->row_buf + 1); /* start of pixel data for row */ #ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED - if (png_ptr->user_transform_depth) + if (png_ptr->user_transform_depth != 0) row_info->bit_depth = png_ptr->user_transform_depth; - if (png_ptr->user_transform_channels) + if (png_ptr->user_transform_channels != 0) row_info->channels = png_ptr->user_transform_channels; #endif row_info->pixel_depth = (png_byte)(row_info->bit_depth * @@ -4987,5 +4990,5 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info) #endif } -#endif /* PNG_READ_TRANSFORMS_SUPPORTED */ -#endif /* PNG_READ_SUPPORTED */ +#endif /* READ_TRANSFORMS */ +#endif /* READ */ diff --git a/lib/libpng/pngrutil.c b/lib/libpng/pngrutil.c index 98e9524061..4c26be48ca 100644 --- a/lib/libpng/pngrutil.c +++ b/lib/libpng/pngrutil.c @@ -1,7 +1,7 @@ /* pngrutil.c - utilities to read a PNG file * - * Last changed in libpng 1.6.10 [March 6, 2014] + * Last changed in libpng 1.6.15 [November 20, 2014] * Copyright (c) 1998-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -108,7 +108,7 @@ png_get_uint_16)(png_const_bytep buf) return (png_uint_16)val; } -#endif /* PNG_READ_INT_FUNCTIONS_SUPPORTED */ +#endif /* READ_INT_FUNCTIONS */ /* Read and check the PNG file signature */ void /* PRIVATE */ @@ -131,7 +131,7 @@ png_read_sig(png_structrp png_ptr, png_inforp info_ptr) png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check); png_ptr->sig_bytes = 8; - if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) + if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check) != 0) { if (num_checked < 4 && png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) @@ -217,11 +217,11 @@ png_crc_finish(png_structrp png_ptr, png_uint_32 skip) png_crc_read(png_ptr, tmpbuf, len); } - if (png_crc_error(png_ptr)) + if (png_crc_error(png_ptr) != 0) { - if (PNG_CHUNK_ANCILLARY(png_ptr->chunk_name) ? - !(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) : - (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE)) + if (PNG_CHUNK_ANCILLARY(png_ptr->chunk_name) != 0 ? + (png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) == 0 : + (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE) != 0) { png_chunk_warning(png_ptr, "CRC error"); } @@ -245,7 +245,7 @@ png_crc_error(png_structrp png_ptr) png_uint_32 crc; int need_crc = 1; - if (PNG_CHUNK_ANCILLARY(png_ptr->chunk_name)) + if (PNG_CHUNK_ANCILLARY(png_ptr->chunk_name) != 0) { if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) == (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) @@ -254,7 +254,7 @@ png_crc_error(png_structrp png_ptr) else /* critical */ { - if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) + if ((png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) != 0) need_crc = 0; } @@ -265,7 +265,7 @@ png_crc_error(png_structrp png_ptr) /* The chunk CRC must be serialized in a single I/O call. */ png_read_data(png_ptr, crc_bytes, 4); - if (need_crc) + if (need_crc != 0) { crc = png_get_uint_32(crc_bytes); return ((int)(crc != png_ptr->crc)); @@ -311,7 +311,7 @@ png_read_buffer(png_structrp png_ptr, png_alloc_size_t new_size, int warn) else if (warn < 2) /* else silent */ { - if (warn) + if (warn != 0) png_chunk_warning(png_ptr, "insufficient memory to read chunk"); else @@ -321,7 +321,7 @@ png_read_buffer(png_structrp png_ptr, png_alloc_size_t new_size, int warn) return buffer; } -#endif /* PNG_READ_iCCP|iTXt|pCAL|sCAL|sPLT|tEXt|zTXt|SEQUENTIAL_READ */ +#endif /* READ_iCCP|iTXt|pCAL|sCAL|sPLT|tEXt|zTXt|SEQUENTIAL_READ */ /* png_inflate_claim: claim the zstream for some nefarious purpose that involves * decompression. Returns Z_OK on success, else a zlib error code. It checks @@ -341,12 +341,12 @@ png_inflate_claim(png_structrp png_ptr, png_uint_32 owner) * are minimal. */ (void)png_safecat(msg, (sizeof msg), 4, " using zstream"); -# if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC - png_chunk_warning(png_ptr, msg); - png_ptr->zowner = 0; -# else - png_chunk_error(png_ptr, msg); -# endif +#if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC + png_chunk_warning(png_ptr, msg); + png_ptr->zowner = 0; +#else + png_chunk_error(png_ptr, msg); +#endif } /* Implementation note: unlike 'png_deflate_claim' this internal function @@ -364,22 +364,21 @@ png_inflate_claim(png_structrp png_ptr, png_uint_32 owner) */ { int ret; /* zlib return code */ -# if PNG_ZLIB_VERNUM >= 0x1240 +#if PNG_ZLIB_VERNUM >= 0x1240 -# if defined(PNG_SET_OPTION_SUPPORTED) && \ - defined(PNG_MAXIMUM_INFLATE_WINDOW) - int window_bits; +# if defined(PNG_SET_OPTION_SUPPORTED) && defined(PNG_MAXIMUM_INFLATE_WINDOW) + int window_bits; - if (((png_ptr->options >> PNG_MAXIMUM_INFLATE_WINDOW) & 3) == - PNG_OPTION_ON) - window_bits = 15; + if (((png_ptr->options >> PNG_MAXIMUM_INFLATE_WINDOW) & 3) == + PNG_OPTION_ON) + window_bits = 15; - else - window_bits = 0; -# else -# define window_bits 0 -# endif -# endif + else + window_bits = 0; +# else +# define window_bits 0 +# endif +#endif /* Set this for safety, just in case the previous owner left pointers to * memory allocations. @@ -389,22 +388,22 @@ png_inflate_claim(png_structrp png_ptr, png_uint_32 owner) png_ptr->zstream.next_out = NULL; png_ptr->zstream.avail_out = 0; - if (png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) + if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) != 0) { -# if PNG_ZLIB_VERNUM < 0x1240 - ret = inflateReset(&png_ptr->zstream); -# else - ret = inflateReset2(&png_ptr->zstream, window_bits); -# endif +#if PNG_ZLIB_VERNUM < 0x1240 + ret = inflateReset(&png_ptr->zstream); +#else + ret = inflateReset2(&png_ptr->zstream, window_bits); +#endif } else { -# if PNG_ZLIB_VERNUM < 0x1240 - ret = inflateInit(&png_ptr->zstream); -# else - ret = inflateInit2(&png_ptr->zstream, window_bits); -# endif +#if PNG_ZLIB_VERNUM < 0x1240 + ret = inflateInit(&png_ptr->zstream); +#else + ret = inflateInit2(&png_ptr->zstream, window_bits); +#endif if (ret == Z_OK) png_ptr->flags |= PNG_FLAG_ZSTREAM_INITIALIZED; @@ -419,9 +418,9 @@ png_inflate_claim(png_structrp png_ptr, png_uint_32 owner) return ret; } -# ifdef window_bits -# undef window_bits -# endif +#ifdef window_bits +# undef window_bits +#endif } #ifdef PNG_READ_COMPRESSED_TEXT_SUPPORTED @@ -518,7 +517,7 @@ png_inflate(png_structrp png_ptr, png_uint_32 owner, int finish, * end of the output buffer. */ ret = inflate(&png_ptr->zstream, avail_out > 0 ? Z_NO_FLUSH : - (finish ? Z_FINISH : Z_SYNC_FLUSH)); + (finish ? Z_FINISH : Z_SYNC_FLUSH)); } while (ret == Z_OK); /* For safety kill the local buffer pointer now */ @@ -576,14 +575,14 @@ png_decompress_chunk(png_structrp png_ptr, */ png_alloc_size_t limit = PNG_SIZE_MAX; -# ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED - if (png_ptr->user_chunk_malloc_max > 0 && - png_ptr->user_chunk_malloc_max < limit) - limit = png_ptr->user_chunk_malloc_max; -# elif PNG_USER_CHUNK_MALLOC_MAX > 0 - if (PNG_USER_CHUNK_MALLOC_MAX < limit) - limit = PNG_USER_CHUNK_MALLOC_MAX; -# endif +# ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED + if (png_ptr->user_chunk_malloc_max > 0 && + png_ptr->user_chunk_malloc_max < limit) + limit = png_ptr->user_chunk_malloc_max; +# elif PNG_USER_CHUNK_MALLOC_MAX > 0 + if (PNG_USER_CHUNK_MALLOC_MAX < limit) + limit = PNG_USER_CHUNK_MALLOC_MAX; +# endif if (limit >= prefix_size + (terminate != 0)) { @@ -637,7 +636,7 @@ png_decompress_chunk(png_structrp png_ptr, { if (new_size == *newlength) { - if (terminate) + if (terminate != 0) text[prefix_size + *newlength] = 0; if (prefix_size > 0) @@ -671,6 +670,7 @@ png_decompress_chunk(png_structrp png_ptr, * success) */ png_free(png_ptr, text); + text = NULL; /* This really is very benign, but it's still an error because * the extra space may otherwise be used as a Trojan Horse. @@ -718,7 +718,7 @@ png_decompress_chunk(png_structrp png_ptr, return Z_MEM_ERROR; } } -#endif /* PNG_READ_COMPRESSED_TEXT_SUPPORTED */ +#endif /* READ_COMPRESSED_TEXT */ #ifdef PNG_READ_iCCP_SUPPORTED /* Perform a partial read and decompress, producing 'avail_out' bytes and @@ -788,6 +788,7 @@ png_inflate_read(png_structrp png_ptr, png_bytep read_buffer, uInt read_size, #endif /* Read and check the IDHR chunk */ + void /* PRIVATE */ png_handle_IHDR(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) { @@ -798,7 +799,7 @@ png_handle_IHDR(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_debug(1, "in png_handle_IHDR"); - if (png_ptr->mode & PNG_HAVE_IHDR) + if ((png_ptr->mode & PNG_HAVE_IHDR) != 0) png_chunk_error(png_ptr, "out of place"); /* Check the length */ @@ -852,8 +853,7 @@ png_handle_IHDR(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) } /* Set up other useful info */ - png_ptr->pixel_depth = (png_byte)(png_ptr->bit_depth * - png_ptr->channels); + png_ptr->pixel_depth = (png_byte)(png_ptr->bit_depth * png_ptr->channels); png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->width); png_debug1(3, "bit_depth = %d", png_ptr->bit_depth); png_debug1(3, "channels = %d", png_ptr->channels); @@ -874,7 +874,7 @@ png_handle_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_debug(1, "in png_handle_PLTE"); - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); /* Moved to before the 'after IDAT' check below because otherwise duplicate @@ -882,10 +882,10 @@ png_handle_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) * than one PLTE, the error is not treated as benign, so this check trumps * the requirement that PLTE appears before IDAT.) */ - else if (png_ptr->mode & PNG_HAVE_PLTE) + else if ((png_ptr->mode & PNG_HAVE_PLTE) != 0) png_chunk_error(png_ptr, "duplicate"); - else if (png_ptr->mode & PNG_HAVE_IDAT) + else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0) { /* This is benign because the non-benign error happened before, when an * IDAT was encountered in a color-mapped image with no PLTE. @@ -897,7 +897,7 @@ png_handle_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_ptr->mode |= PNG_HAVE_PLTE; - if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) + if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "ignored in grayscale PNG"); @@ -964,7 +964,7 @@ png_handle_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) } #ifndef PNG_READ_OPT_PLTE_SUPPORTED - else if (png_crc_error(png_ptr)) /* Only if we have a CRC error */ + else if (png_crc_error(png_ptr) != 0) /* Only if we have a CRC error */ { /* If we don't want to use the data from an ancillary chunk, * we have two options: an error abort, or a warning and we @@ -975,9 +975,9 @@ png_handle_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) * chunk type to determine whether to check the ancillary or the critical * flags. */ - if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_USE)) + if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_USE) == 0) { - if (png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) + if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) != 0) return; else @@ -985,7 +985,7 @@ png_handle_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) } /* Otherwise, we (optionally) emit a warning and use the chunk. */ - else if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) + else if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) == 0) png_chunk_warning(png_ptr, "CRC error"); } #endif @@ -1011,7 +1011,7 @@ png_handle_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) */ #ifdef PNG_READ_tRNS_SUPPORTED if (png_ptr->num_trans > 0 || - (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS) != 0)) + (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS) != 0)) { /* Cancel this because otherwise it would be used if the transforms * require it. Don't cancel the 'valid' flag because this would prevent @@ -1042,7 +1042,8 @@ png_handle_IEND(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) { png_debug(1, "in png_handle_IEND"); - if (!(png_ptr->mode & PNG_HAVE_IHDR) || !(png_ptr->mode & PNG_HAVE_IDAT)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0 || + (png_ptr->mode & PNG_HAVE_IDAT) == 0) png_chunk_error(png_ptr, "out of place"); png_ptr->mode |= (PNG_AFTER_IDAT | PNG_HAVE_IEND); @@ -1064,10 +1065,10 @@ png_handle_gAMA(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_debug(1, "in png_handle_gAMA"); - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); - else if (png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) + else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "out of place"); @@ -1083,7 +1084,7 @@ png_handle_gAMA(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_crc_read(png_ptr, buf, 4); - if (png_crc_finish(png_ptr, 0)) + if (png_crc_finish(png_ptr, 0) != 0) return; igamma = png_get_fixed_point(NULL, buf); @@ -1103,17 +1104,17 @@ png_handle_sBIT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_debug(1, "in png_handle_sBIT"); - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); - else if (png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) + else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "out of place"); return; } - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)) + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "duplicate"); @@ -1142,7 +1143,7 @@ png_handle_sBIT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) buf[0] = buf[1] = buf[2] = buf[3] = sample_depth; png_crc_read(png_ptr, buf, truelen); - if (png_crc_finish(png_ptr, 0)) + if (png_crc_finish(png_ptr, 0) != 0) return; for (i=0; icolor_type & PNG_COLOR_MASK_COLOR) + if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0) { png_ptr->sig_bit.red = buf[0]; png_ptr->sig_bit.green = buf[1]; @@ -1182,10 +1183,10 @@ png_handle_cHRM(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_debug(1, "in png_handle_cHRM"); - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); - else if (png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) + else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "out of place"); @@ -1201,7 +1202,7 @@ png_handle_cHRM(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_crc_read(png_ptr, buf, 32); - if (png_crc_finish(png_ptr, 0)) + if (png_crc_finish(png_ptr, 0) != 0) return; xy.whitex = png_get_fixed_point(NULL, buf); @@ -1227,10 +1228,10 @@ png_handle_cHRM(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) } /* If a colorspace error has already been output skip this chunk */ - if (png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) + if ((png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) != 0) return; - if (png_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) + if ((png_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) != 0) { png_ptr->colorspace.flags |= PNG_COLORSPACE_INVALID; png_colorspace_sync(png_ptr, info_ptr); @@ -1253,10 +1254,10 @@ png_handle_sRGB(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_debug(1, "in png_handle_sRGB"); - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); - else if (png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) + else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "out of place"); @@ -1272,17 +1273,17 @@ png_handle_sRGB(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_crc_read(png_ptr, &intent, 1); - if (png_crc_finish(png_ptr, 0)) + if (png_crc_finish(png_ptr, 0) != 0) return; /* If a colorspace error has already been output skip this chunk */ - if (png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) + if ((png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) != 0) return; /* Only one sRGB or iCCP chunk is allowed, use the HAVE_INTENT flag to detect * this. */ - if (png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_INTENT) + if ((png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_INTENT) != 0) { png_ptr->colorspace.flags |= PNG_COLORSPACE_INVALID; png_colorspace_sync(png_ptr, info_ptr); @@ -1293,7 +1294,7 @@ png_handle_sRGB(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) (void)png_colorspace_set_sRGB(png_ptr, &png_ptr->colorspace, intent); png_colorspace_sync(png_ptr, info_ptr); } -#endif /* PNG_READ_sRGB_SUPPORTED */ +#endif /* READ_sRGB */ #ifdef PNG_READ_iCCP_SUPPORTED void /* PRIVATE */ @@ -1305,10 +1306,10 @@ png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_debug(1, "in png_handle_iCCP"); - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); - else if (png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) + else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "out of place"); @@ -1319,9 +1320,9 @@ png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) * chunk is just ignored, so does not invalidate the color space. An * alternative is to set the 'invalid' flags at the start of this routine * and only clear them in they were not set before and all the tests pass. - * The minimum 'deflate' stream is assumed to be just the 2 byte header and 4 - * byte checksum. The keyword must be one character and there is a - * terminator (0) byte and the compression method. + * The minimum 'deflate' stream is assumed to be just the 2 byte header and + * 4 byte checksum. The keyword must be at least one character and there is + * a terminator (0) byte and the compression method. */ if (length < 9) { @@ -1331,7 +1332,7 @@ png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) } /* If a colorspace error has already been output skip this chunk */ - if (png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) + if ((png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) != 0) { png_crc_finish(png_ptr, length); return; @@ -1391,14 +1392,14 @@ png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_get_uint_32(profile_header); if (png_icc_check_length(png_ptr, &png_ptr->colorspace, - keyword, profile_length)) + keyword, profile_length) != 0) { /* The length is apparently ok, so we can check the 132 * byte header. */ if (png_icc_check_header(png_ptr, &png_ptr->colorspace, keyword, profile_length, profile_header, - png_ptr->color_type)) + png_ptr->color_type) != 0) { /* Now read the tag table; a variable size buffer is * needed at this point, allocate one for the whole @@ -1428,7 +1429,7 @@ png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) { if (png_icc_check_tag_table(png_ptr, &png_ptr->colorspace, keyword, profile_length, - profile)) + profile) != 0) { /* The profile has been validated for basic * security issues, so read the whole thing in. @@ -1558,7 +1559,7 @@ png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) errmsg = "too many profiles"; /* Failure: the reason is in 'errmsg' */ - if (!finished) + if (finished == 0) png_crc_finish(png_ptr, length); png_ptr->colorspace.flags |= PNG_COLORSPACE_INVALID; @@ -1566,7 +1567,7 @@ png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) if (errmsg != NULL) /* else already output */ png_chunk_benign_error(png_ptr, errmsg); } -#endif /* PNG_READ_iCCP_SUPPORTED */ +#endif /* READ_iCCP */ #ifdef PNG_READ_sPLT_SUPPORTED void /* PRIVATE */ @@ -1602,10 +1603,10 @@ png_handle_sPLT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) } #endif - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); - else if (png_ptr->mode & PNG_HAVE_IDAT) + else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "out of place"); @@ -1636,7 +1637,7 @@ png_handle_sPLT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) */ png_crc_read(png_ptr, buffer, length); - if (png_crc_finish(png_ptr, skip)) + if (png_crc_finish(png_ptr, skip) != 0) return; buffer[length] = 0; @@ -1661,7 +1662,7 @@ png_handle_sPLT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) data_length = length - (png_uint_32)(entry_start - buffer); /* Integrity-check the data length */ - if (data_length % entry_size) + if ((data_length % entry_size) != 0) { png_warning(png_ptr, "sPLT chunk has bad length"); return; @@ -1743,7 +1744,7 @@ png_handle_sPLT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_free(png_ptr, new_palette.entries); } -#endif /* PNG_READ_sPLT_SUPPORTED */ +#endif /* READ_sPLT */ #ifdef PNG_READ_tRNS_SUPPORTED void /* PRIVATE */ @@ -1753,17 +1754,17 @@ png_handle_tRNS(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_debug(1, "in png_handle_tRNS"); - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); - else if (png_ptr->mode & PNG_HAVE_IDAT) + else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "out of place"); return; } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "duplicate"); @@ -1806,7 +1807,7 @@ png_handle_tRNS(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { - if (!(png_ptr->mode & PNG_HAVE_PLTE)) + if ((png_ptr->mode & PNG_HAVE_PLTE) == 0) { /* TODO: is this actually an error in the ISO spec? */ png_crc_finish(png_ptr, length); @@ -1833,7 +1834,7 @@ png_handle_tRNS(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) return; } - if (png_crc_finish(png_ptr, 0)) + if (png_crc_finish(png_ptr, 0) != 0) { png_ptr->num_trans = 0; return; @@ -1858,19 +1859,19 @@ png_handle_bKGD(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_debug(1, "in png_handle_bKGD"); - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); - else if ((png_ptr->mode & PNG_HAVE_IDAT) || - (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - !(png_ptr->mode & PNG_HAVE_PLTE))) + else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0 || + (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + (png_ptr->mode & PNG_HAVE_PLTE) == 0)) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "out of place"); return; } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)) + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "duplicate"); @@ -1880,7 +1881,7 @@ png_handle_bKGD(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) truelen = 1; - else if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) + else if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0) truelen = 6; else @@ -1895,7 +1896,7 @@ png_handle_bKGD(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_crc_read(png_ptr, buf, truelen); - if (png_crc_finish(png_ptr, 0)) + if (png_crc_finish(png_ptr, 0) != 0) return; /* We convert the index value into RGB components so that we can allow @@ -1907,7 +1908,7 @@ png_handle_bKGD(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) { background.index = buf[0]; - if (info_ptr && info_ptr->num_palette) + if (info_ptr != NULL && info_ptr->num_palette != 0) { if (buf[0] >= info_ptr->num_palette) { @@ -1926,7 +1927,7 @@ png_handle_bKGD(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) background.gray = 0; } - else if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) /* GRAY */ + else if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0) /* GRAY */ { background.index = 0; background.red = @@ -1957,17 +1958,18 @@ png_handle_hIST(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_debug(1, "in png_handle_hIST"); - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); - else if ((png_ptr->mode & PNG_HAVE_IDAT) || !(png_ptr->mode & PNG_HAVE_PLTE)) + else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0 || + (png_ptr->mode & PNG_HAVE_PLTE) == 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "out of place"); return; } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)) + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "duplicate"); @@ -1991,7 +1993,7 @@ png_handle_hIST(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) readbuf[i] = png_get_uint_16(buf); } - if (png_crc_finish(png_ptr, 0)) + if (png_crc_finish(png_ptr, 0) != 0) return; png_set_hIST(png_ptr, info_ptr, readbuf); @@ -2008,17 +2010,17 @@ png_handle_pHYs(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_debug(1, "in png_handle_pHYs"); - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); - else if (png_ptr->mode & PNG_HAVE_IDAT) + else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "out of place"); return; } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "duplicate"); @@ -2034,7 +2036,7 @@ png_handle_pHYs(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_crc_read(png_ptr, buf, 9); - if (png_crc_finish(png_ptr, 0)) + if (png_crc_finish(png_ptr, 0) != 0) return; res_x = png_get_uint_32(buf); @@ -2054,17 +2056,17 @@ png_handle_oFFs(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_debug(1, "in png_handle_oFFs"); - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); - else if (png_ptr->mode & PNG_HAVE_IDAT) + else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "out of place"); return; } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "duplicate"); @@ -2080,7 +2082,7 @@ png_handle_oFFs(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_crc_read(png_ptr, buf, 9); - if (png_crc_finish(png_ptr, 0)) + if (png_crc_finish(png_ptr, 0) != 0) return; offset_x = png_get_int_32(buf); @@ -2103,17 +2105,17 @@ png_handle_pCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_debug(1, "in png_handle_pCAL"); - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); - else if (png_ptr->mode & PNG_HAVE_IDAT) + else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "out of place"); return; } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)) + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "duplicate"); @@ -2134,7 +2136,7 @@ png_handle_pCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_crc_read(png_ptr, buffer, length); - if (png_crc_finish(png_ptr, 0)) + if (png_crc_finish(png_ptr, 0) != 0) return; buffer[length] = 0; /* Null terminate the last string */ @@ -2230,17 +2232,17 @@ png_handle_sCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_debug(1, "in png_handle_sCAL"); - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); - else if (png_ptr->mode & PNG_HAVE_IDAT) + else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "out of place"); return; } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL)) + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "duplicate"); @@ -2270,7 +2272,7 @@ png_handle_sCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_crc_read(png_ptr, buffer, length); buffer[length] = 0; /* Null terminate the last string */ - if (png_crc_finish(png_ptr, 0)) + if (png_crc_finish(png_ptr, 0) != 0) return; /* Validate the unit. */ @@ -2286,11 +2288,11 @@ png_handle_sCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) i = 1; state = 0; - if (!png_check_fp_number((png_const_charp)buffer, length, &state, &i) || + if (png_check_fp_number((png_const_charp)buffer, length, &state, &i) == 0 || i >= length || buffer[i++] != 0) png_chunk_benign_error(png_ptr, "bad width format"); - else if (!PNG_FP_IS_POSITIVE(state)) + else if (PNG_FP_IS_POSITIVE(state) == 0) png_chunk_benign_error(png_ptr, "non-positive width"); else @@ -2298,11 +2300,11 @@ png_handle_sCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_size_t heighti = i; state = 0; - if (!png_check_fp_number((png_const_charp)buffer, length, &state, &i) || - i != length) + if (png_check_fp_number((png_const_charp)buffer, length, + &state, &i) == 0 || i != length) png_chunk_benign_error(png_ptr, "bad height format"); - else if (!PNG_FP_IS_POSITIVE(state)) + else if (PNG_FP_IS_POSITIVE(state) == 0) png_chunk_benign_error(png_ptr, "non-positive height"); else @@ -2322,17 +2324,17 @@ png_handle_tIME(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_debug(1, "in png_handle_tIME"); - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)) + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME) != 0) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "duplicate"); return; } - if (png_ptr->mode & PNG_HAVE_IDAT) + if ((png_ptr->mode & PNG_HAVE_IDAT) != 0) png_ptr->mode |= PNG_AFTER_IDAT; if (length != 7) @@ -2344,7 +2346,7 @@ png_handle_tIME(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_crc_read(png_ptr, buf, 7); - if (png_crc_finish(png_ptr, 0)) + if (png_crc_finish(png_ptr, 0) != 0) return; mod_time.second = buf[6]; @@ -2389,10 +2391,10 @@ png_handle_tEXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) } #endif - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); - if (png_ptr->mode & PNG_HAVE_IDAT) + if ((png_ptr->mode & PNG_HAVE_IDAT) != 0) png_ptr->mode |= PNG_AFTER_IDAT; #ifdef PNG_MAX_MALLOC_64K @@ -2414,7 +2416,7 @@ png_handle_tEXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_crc_read(png_ptr, buffer, length); - if (png_crc_finish(png_ptr, skip)) + if (png_crc_finish(png_ptr, skip) != 0) return; key = (png_charp)buffer; @@ -2434,7 +2436,7 @@ png_handle_tEXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) text_info.text = text; text_info.text_length = strlen(text); - if (png_set_text_2(png_ptr, info_ptr, &text_info, 1)) + if (png_set_text_2(png_ptr, info_ptr, &text_info, 1) != 0) png_warning(png_ptr, "Insufficient memory to process text chunk"); } #endif @@ -2468,10 +2470,10 @@ png_handle_zTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) } #endif - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); - if (png_ptr->mode & PNG_HAVE_IDAT) + if ((png_ptr->mode & PNG_HAVE_IDAT) != 0) png_ptr->mode |= PNG_AFTER_IDAT; buffer = png_read_buffer(png_ptr, length, 2/*silent*/); @@ -2485,7 +2487,7 @@ png_handle_zTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_crc_read(png_ptr, buffer, length); - if (png_crc_finish(png_ptr, 0)) + if (png_crc_finish(png_ptr, 0) != 0) return; /* TODO: also check that the keyword contents match the spec! */ @@ -2535,7 +2537,7 @@ png_handle_zTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) text.lang = NULL; text.lang_key = NULL; - if (png_set_text_2(png_ptr, info_ptr, &text, 1)) + if (png_set_text_2(png_ptr, info_ptr, &text, 1) != 0) errmsg = "insufficient memory"; } @@ -2577,10 +2579,10 @@ png_handle_iTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) } #endif - if (!(png_ptr->mode & PNG_HAVE_IHDR)) + if ((png_ptr->mode & PNG_HAVE_IHDR) == 0) png_chunk_error(png_ptr, "missing IHDR"); - if (png_ptr->mode & PNG_HAVE_IDAT) + if ((png_ptr->mode & PNG_HAVE_IDAT) != 0) png_ptr->mode |= PNG_AFTER_IDAT; buffer = png_read_buffer(png_ptr, length+1, 1/*warn*/); @@ -2594,7 +2596,7 @@ png_handle_iTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_crc_read(png_ptr, buffer, length); - if (png_crc_finish(png_ptr, 0)) + if (png_crc_finish(png_ptr, 0) != 0) return; /* First the keyword. */ @@ -2640,14 +2642,14 @@ png_handle_iTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) /* prefix_length should now be at the trailing '\0' of the translated * keyword, but it may already be over the end. None of this arithmetic * can overflow because chunks are at most 2^31 bytes long, but on 16-bit - * systems the available allocaton may overflow. + * systems the available allocation may overflow. */ ++prefix_length; - if (!compressed && prefix_length <= length) + if (compressed == 0 && prefix_length <= length) uncompressed_length = length - prefix_length; - else if (compressed && prefix_length < length) + else if (compressed != 0 && prefix_length < length) { uncompressed_length = PNG_SIZE_MAX; @@ -2672,7 +2674,7 @@ png_handle_iTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) buffer[uncompressed_length+prefix_length] = 0; - if (compressed) + if (compressed == 0) text.compression = PNG_ITXT_COMPRESSION_NONE; else @@ -2685,7 +2687,7 @@ png_handle_iTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) text.text_length = 0; text.itxt_length = uncompressed_length; - if (png_set_text_2(png_ptr, info_ptr, &text, 1)) + if (png_set_text_2(png_ptr, info_ptr, &text, 1) != 0) errmsg = "insufficient memory"; } } @@ -2713,7 +2715,7 @@ png_cache_unknown_chunk(png_structrp png_ptr, png_uint_32 length) # ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED if (png_ptr->user_chunk_malloc_max > 0 && - png_ptr->user_chunk_malloc_max < limit) + png_ptr->user_chunk_malloc_max < limit) limit = png_ptr->user_chunk_malloc_max; # elif PNG_USER_CHUNK_MALLOC_MAX > 0 @@ -2756,7 +2758,7 @@ png_cache_unknown_chunk(png_structrp png_ptr, png_uint_32 length) return 1; } } -#endif /* PNG_READ_UNKNOWN_CHUNKS_SUPPORTED */ +#endif /* READ_UNKNOWN_CHUNKS */ /* Handle an unknown, or known but disabled, chunk */ void /* PRIVATE */ @@ -2795,7 +2797,7 @@ png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr, */ if (png_ptr->read_user_chunk_fn != NULL) { - if (png_cache_unknown_chunk(png_ptr, length)) + if (png_cache_unknown_chunk(png_ptr, length) != 0) { /* Callback to user unknown chunk handler */ int ret = (*(png_ptr->read_user_chunk_fn))(png_ptr, @@ -2856,7 +2858,7 @@ png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr, else /* Use the SAVE_UNKNOWN_CHUNKS code or skip the chunk */ -# endif /* PNG_READ_USER_CHUNKS_SUPPORTED */ +# endif /* READ_USER_CHUNKS */ # ifdef PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED { @@ -2872,7 +2874,7 @@ png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr, (keep == PNG_HANDLE_CHUNK_IF_SAFE && PNG_CHUNK_ANCILLARY(png_ptr->chunk_name))) { - if (!png_cache_unknown_chunk(png_ptr, length)) + if (png_cache_unknown_chunk(png_ptr, length) == 0) keep = PNG_HANDLE_CHUNK_NEVER; } @@ -2923,7 +2925,7 @@ png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr, --(png_ptr->user_chunk_cache_max); /* FALL THROUGH */ case 0: /* no limit */ -# endif /* PNG_USER_LIMITS_SUPPORTED */ +# endif /* USER_LIMITS */ /* Here when the limit isn't reached or when limits are compiled * out; store the chunk. */ @@ -2952,10 +2954,10 @@ png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr, png_crc_finish(png_ptr, length); PNG_UNUSED(info_ptr) PNG_UNUSED(keep) -#endif /* !PNG_READ_UNKNOWN_CHUNKS_SUPPORTED */ +#endif /* !READ_UNKNOWN_CHUNKS */ /* Check for unhandled critical chunks */ - if (!handled && PNG_CHUNK_CRITICAL(png_ptr->chunk_name)) + if (handled == 0 && PNG_CHUNK_CRITICAL(png_ptr->chunk_name)) png_chunk_error(png_ptr, "unhandled critical chunk"); } @@ -3001,7 +3003,7 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display) { unsigned int pixel_depth = png_ptr->transformed_pixel_depth; png_const_bytep sp = png_ptr->row_buf + 1; - png_uint_32 row_width = png_ptr->width; + png_alloc_size_t row_width = png_ptr->width; unsigned int pass = png_ptr->pass; png_bytep end_ptr = 0; png_byte end_byte = 0; @@ -3038,7 +3040,8 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display) end_ptr = dp + PNG_ROWBYTES(pixel_depth, row_width) - 1; end_byte = *end_ptr; # ifdef PNG_READ_PACKSWAP_SUPPORTED - if (png_ptr->transformations & PNG_PACKSWAP) /* little-endian byte */ + if ((png_ptr->transformations & PNG_PACKSWAP) != 0) + /* little-endian byte */ end_mask = 0xff << end_mask; else /* big-endian byte */ @@ -3054,10 +3057,11 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display) * pass. */ #ifdef PNG_READ_INTERLACING_SUPPORTED - if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE) && - pass < 6 && (display == 0 || - /* The following copies everything for 'display' on passes 0, 2 and 4. */ - (display == 1 && (pass & 1) != 0))) + if (png_ptr->interlaced != 0 && + (png_ptr->transformations & PNG_INTERLACE) != 0 && + pass < 6 && (display == 0 || + /* The following copies everything for 'display' on passes 0, 2 and 4. */ + (display == 1 && (pass & 1) != 0))) { /* Narrow images may have no bits in a pass; the caller should handle * this, but this test is cheap: @@ -3153,7 +3157,7 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display) # define S_MASKS(d,s) { S_MASK(0,d,s), S_MASK(1,d,s), S_MASK(2,d,s),\ S_MASK(3,d,s), S_MASK(4,d,s), S_MASK(5,d,s) } -# define B_MASKS(d,s) { B_MASK(1,d,s), S_MASK(3,d,s), S_MASK(5,d,s) } +# define B_MASKS(d,s) { B_MASK(1,d,s), B_MASK(3,d,s), B_MASK(5,d,s) } # define DEPTH_INDEX(d) ((d)==1?0:((d)==2?1:2)) @@ -3189,10 +3193,10 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display) */ # define MASK(pass,depth,display,png)\ ((display)?B_MASK(pass,depth,png):S_MASK(pass,depth,png)) -#endif /* !PNG_USE_COMPILE_TIME_MASKS */ +#endif /* !USE_COMPILE_TIME_MASKS */ /* Use the appropriate mask to copy the required bits. In some cases - * the byte mask will be 0 or 0xff, optimize these cases. row_width is + * the byte mask will be 0 or 0xff; optimize these cases. row_width is * the number of pixels, but the code copies bytes, so it is necessary * to special case the end. */ @@ -3200,7 +3204,7 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display) png_uint_32 mask; # ifdef PNG_READ_PACKSWAP_SUPPORTED - if (png_ptr->transformations & PNG_PACKSWAP) + if ((png_ptr->transformations & PNG_PACKSWAP) != 0) mask = MASK(pass, pixel_depth, display, 0); else @@ -3264,7 +3268,7 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display) } /* Work out the bytes to copy. */ - if (display) + if (display != 0) { /* When doing the 'block' algorithm the pixel in the pass gets * replicated to adjacent pixels. This is why the even (0,2,4,6) @@ -3274,7 +3278,7 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display) /* But don't allow this number to exceed the actual row width. */ if (bytes_to_copy > row_width) - bytes_to_copy = row_width; + bytes_to_copy = (unsigned int)/*SAFE*/row_width; } else /* normal row; Adam7 only ever gives us one pixel to copy. */ @@ -3331,7 +3335,7 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display) /* This can only be the RGB case, so each copy is exactly one * pixel and it is not necessary to check for a partial copy. */ - for(;;) + for (;;) { dp[0] = sp[0], dp[1] = sp[1], dp[2] = sp[2]; @@ -3351,24 +3355,24 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display) * wide bytes_to_copy either - use the memcpy there. */ if (bytes_to_copy < 16 /*else use memcpy*/ && - png_isaligned(dp, png_uint_16) && - png_isaligned(sp, png_uint_16) && - bytes_to_copy % (sizeof (png_uint_16)) == 0 && - bytes_to_jump % (sizeof (png_uint_16)) == 0) + png_isaligned(dp, png_uint_16) && + png_isaligned(sp, png_uint_16) && + bytes_to_copy % (sizeof (png_uint_16)) == 0 && + bytes_to_jump % (sizeof (png_uint_16)) == 0) { /* Everything is aligned for png_uint_16 copies, but try for * png_uint_32 first. */ - if (png_isaligned(dp, png_uint_32) && - png_isaligned(sp, png_uint_32) && - bytes_to_copy % (sizeof (png_uint_32)) == 0 && - bytes_to_jump % (sizeof (png_uint_32)) == 0) + if (png_isaligned(dp, png_uint_32) != 0 && + png_isaligned(sp, png_uint_32) != 0 && + bytes_to_copy % (sizeof (png_uint_32)) == 0 && + bytes_to_jump % (sizeof (png_uint_32)) == 0) { png_uint_32p dp32 = png_aligncast(png_uint_32p,dp); png_const_uint_32p sp32 = png_aligncastconst( - png_const_uint_32p, sp); + png_const_uint_32p, sp); size_t skip = (bytes_to_jump-bytes_to_copy) / - (sizeof (png_uint_32)); + (sizeof (png_uint_32)); do { @@ -3440,7 +3444,7 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display) return; } } -#endif /* PNG_ALIGN_ code */ +#endif /* ALIGN_TYPE code */ /* The true default - use a memcpy: */ for (;;) @@ -3454,7 +3458,7 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display) dp += bytes_to_jump; row_width -= bytes_to_jump; if (bytes_to_copy > row_width) - bytes_to_copy = row_width; + bytes_to_copy = (unsigned int)/*SAFE*/row_width; } } @@ -3464,7 +3468,7 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display) /* Here if pixel_depth < 8 to check 'end_ptr' below. */ } else -#endif +#endif /* READ_INTERLACING */ /* If here then the switch above wasn't used so just memcpy the whole row * from the temporary row buffer (notice that this overwrites the end of the @@ -3507,7 +3511,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass, int j; #ifdef PNG_READ_PACKSWAP_SUPPORTED - if (transformations & PNG_PACKSWAP) + if ((transformations & PNG_PACKSWAP) != 0) { sshift = (int)((row_info->width + 7) & 0x07); dshift = (int)((final_width + 7) & 0x07); @@ -3567,7 +3571,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass, png_uint_32 i; #ifdef PNG_READ_PACKSWAP_SUPPORTED - if (transformations & PNG_PACKSWAP) + if ((transformations & PNG_PACKSWAP) != 0) { sshift = (int)(((row_info->width + 3) & 0x03) << 1); dshift = (int)(((final_width + 3) & 0x03) << 1); @@ -3630,7 +3634,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass, int jstop = png_pass_inc[pass]; #ifdef PNG_READ_PACKSWAP_SUPPORTED - if (transformations & PNG_PACKSWAP) + if ((transformations & PNG_PACKSWAP) != 0) { sshift = (int)(((row_info->width + 1) & 0x01) << 2); dshift = (int)(((final_width + 1) & 0x01) << 2); @@ -3720,7 +3724,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass, PNG_UNUSED(transformations) /* Silence compiler warning */ #endif } -#endif /* PNG_READ_INTERLACING_SUPPORTED */ +#endif /* READ_INTERLACING */ static void png_read_filter_row_sub(png_row_infop row_info, png_bytep row, @@ -4071,7 +4075,7 @@ png_read_finish_IDAT(png_structrp png_ptr) * read it otherwise stray unread IDAT data or, more likely, an IDAT chunk * may still remain to be consumed. */ - if (!(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED)) + if ((png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0) { /* The NULL causes png_read_IDAT_data to swallow any remaining bytes in * the compressed stream, but the stream may be damaged too, so even after @@ -4083,7 +4087,7 @@ png_read_finish_IDAT(png_structrp png_ptr) /* Now clear everything out for safety; the following may not have been * done. */ - if (!(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED)) + if ((png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0) { png_ptr->mode |= PNG_AFTER_IDAT; png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED; @@ -4114,7 +4118,6 @@ png_read_finish_IDAT(png_structrp png_ptr) void /* PRIVATE */ png_read_finish_row(png_structrp png_ptr) { -#ifdef PNG_READ_INTERLACING_SUPPORTED /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ /* Start of interlace block */ @@ -4128,15 +4131,13 @@ png_read_finish_row(png_structrp png_ptr) /* Offset to next interlace block in the y direction */ static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; -#endif /* PNG_READ_INTERLACING_SUPPORTED */ png_debug(1, "in png_read_finish_row"); png_ptr->row_number++; if (png_ptr->row_number < png_ptr->num_rows) return; -#ifdef PNG_READ_INTERLACING_SUPPORTED - if (png_ptr->interlaced) + if (png_ptr->interlaced != 0) { png_ptr->row_number = 0; @@ -4157,7 +4158,7 @@ png_read_finish_row(png_structrp png_ptr) png_pass_start[png_ptr->pass]) / png_pass_inc[png_ptr->pass]; - if (!(png_ptr->transformations & PNG_INTERLACE)) + if ((png_ptr->transformations & PNG_INTERLACE) == 0) { png_ptr->num_rows = (png_ptr->height + png_pass_yinc[png_ptr->pass] - 1 - @@ -4173,17 +4174,15 @@ png_read_finish_row(png_structrp png_ptr) if (png_ptr->pass < 7) return; } -#endif /* PNG_READ_INTERLACING_SUPPORTED */ /* Here after at the end of the last row of the last pass. */ png_read_finish_IDAT(png_ptr); } -#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ +#endif /* SEQUENTIAL_READ */ void /* PRIVATE */ png_read_start_row(png_structrp png_ptr) { -#ifdef PNG_READ_INTERLACING_SUPPORTED /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ /* Start of interlace block */ @@ -4197,7 +4196,6 @@ png_read_start_row(png_structrp png_ptr) /* Offset to next interlace block in the y direction */ static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; -#endif int max_pixel_depth; png_size_t row_bytes; @@ -4207,10 +4205,9 @@ png_read_start_row(png_structrp png_ptr) #ifdef PNG_READ_TRANSFORMS_SUPPORTED png_init_read_transformations(png_ptr); #endif -#ifdef PNG_READ_INTERLACING_SUPPORTED - if (png_ptr->interlaced) + if (png_ptr->interlaced != 0) { - if (!(png_ptr->transformations & PNG_INTERLACE)) + if ((png_ptr->transformations & PNG_INTERLACE) == 0) png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - png_pass_ystart[0]) / png_pass_yinc[0]; @@ -4224,7 +4221,6 @@ png_read_start_row(png_structrp png_ptr) } else -#endif /* PNG_READ_INTERLACING_SUPPORTED */ { png_ptr->num_rows = png_ptr->height; png_ptr->iwidth = png_ptr->width; @@ -4232,7 +4228,7 @@ png_read_start_row(png_structrp png_ptr) max_pixel_depth = png_ptr->pixel_depth; - /* WARNING: * png_read_transform_info (pngrtran.c) performs a simpliar set of + /* WARNING: * png_read_transform_info (pngrtran.c) performs a simpler set of * calculations to calculate the final pixel depth, then * png_do_read_transforms actually does the transforms. This means that the * code which effectively calculates this value is actually repeated in three @@ -4243,16 +4239,16 @@ png_read_start_row(png_structrp png_ptr) * TODO: fix this. */ #ifdef PNG_READ_PACK_SUPPORTED - if ((png_ptr->transformations & PNG_PACK) && png_ptr->bit_depth < 8) + if ((png_ptr->transformations & PNG_PACK) != 0 && png_ptr->bit_depth < 8) max_pixel_depth = 8; #endif #ifdef PNG_READ_EXPAND_SUPPORTED - if (png_ptr->transformations & PNG_EXPAND) + if ((png_ptr->transformations & PNG_EXPAND) != 0) { if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { - if (png_ptr->num_trans) + if (png_ptr->num_trans != 0) max_pixel_depth = 32; else @@ -4264,13 +4260,13 @@ png_read_start_row(png_structrp png_ptr) if (max_pixel_depth < 8) max_pixel_depth = 8; - if (png_ptr->num_trans) + if (png_ptr->num_trans != 0) max_pixel_depth *= 2; } else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) { - if (png_ptr->num_trans) + if (png_ptr->num_trans != 0) { max_pixel_depth *= 4; max_pixel_depth /= 3; @@ -4280,13 +4276,13 @@ png_read_start_row(png_structrp png_ptr) #endif #ifdef PNG_READ_EXPAND_16_SUPPORTED - if (png_ptr->transformations & PNG_EXPAND_16) + if ((png_ptr->transformations & PNG_EXPAND_16) != 0) { # ifdef PNG_READ_EXPAND_SUPPORTED /* In fact it is an error if it isn't supported, but checking is * the safe way. */ - if (png_ptr->transformations & PNG_EXPAND) + if ((png_ptr->transformations & PNG_EXPAND) != 0) { if (png_ptr->bit_depth < 16) max_pixel_depth *= 2; @@ -4298,7 +4294,7 @@ png_read_start_row(png_structrp png_ptr) #endif #ifdef PNG_READ_FILLER_SUPPORTED - if (png_ptr->transformations & (PNG_FILLER)) + if ((png_ptr->transformations & (PNG_FILLER)) != 0) { if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) { @@ -4322,14 +4318,15 @@ png_read_start_row(png_structrp png_ptr) #endif #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED - if (png_ptr->transformations & PNG_GRAY_TO_RGB) + if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0) { if ( #ifdef PNG_READ_EXPAND_SUPPORTED - (png_ptr->num_trans && (png_ptr->transformations & PNG_EXPAND)) || + (png_ptr->num_trans != 0 && + (png_ptr->transformations & PNG_EXPAND) != 0) || #endif #ifdef PNG_READ_FILLER_SUPPORTED - (png_ptr->transformations & (PNG_FILLER)) || + (png_ptr->transformations & (PNG_FILLER)) != 0 || #endif png_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { @@ -4362,7 +4359,7 @@ png_read_start_row(png_structrp png_ptr) #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) && \ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) - if (png_ptr->transformations & PNG_USER_TRANSFORM) + if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0) { int user_pixel_depth = png_ptr->user_transform_depth * png_ptr->user_transform_channels; @@ -4398,7 +4395,7 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) png_free(png_ptr, png_ptr->big_row_buf); png_free(png_ptr, png_ptr->big_prev_row); - if (png_ptr->interlaced) + if (png_ptr->interlaced != 0) png_ptr->big_row_buf = (png_bytep)png_calloc(png_ptr, row_bytes + 48); @@ -4455,7 +4452,7 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) * does not, so free the read buffer now regardless; the sequential reader * reallocates it on demand. */ - if (png_ptr->read_buffer) + if (png_ptr->read_buffer != 0) { png_bytep buffer = png_ptr->read_buffer; @@ -4474,4 +4471,4 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) png_ptr->flags |= PNG_FLAG_ROW_INIT; } -#endif /* PNG_READ_SUPPORTED */ +#endif /* READ */ diff --git a/lib/libpng/pngset.c b/lib/libpng/pngset.c index fd718c95ce..2f1f550daf 100644 --- a/lib/libpng/pngset.c +++ b/lib/libpng/pngset.c @@ -1,8 +1,8 @@ /* pngset.c - storage of image information into info struct * - * Last changed in libpng 1.6.8 [December 19, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson + * Last changed in libpng 1.6.15 [November 20, 2014] + * Copyright (c) 1998-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -59,7 +59,7 @@ png_set_cHRM_fixed(png_const_structrp png_ptr, png_inforp info_ptr, xy.whitey = white_y; if (png_colorspace_set_chromaticities(png_ptr, &info_ptr->colorspace, &xy, - 2/* override with app values*/)) + 2/* override with app values*/) != 0) info_ptr->colorspace.flags |= PNG_COLORSPACE_FROM_cHRM; png_colorspace_sync_info(png_ptr, info_ptr); @@ -90,7 +90,8 @@ png_set_cHRM_XYZ_fixed(png_const_structrp png_ptr, png_inforp info_ptr, XYZ.blue_Y = int_blue_Y; XYZ.blue_Z = int_blue_Z; - if (png_colorspace_set_endpoints(png_ptr, &info_ptr->colorspace, &XYZ, 2)) + if (png_colorspace_set_endpoints(png_ptr, &info_ptr->colorspace, + &XYZ, 2) != 0) info_ptr->colorspace.flags |= PNG_COLORSPACE_FROM_cHRM; png_colorspace_sync_info(png_ptr, info_ptr); @@ -129,9 +130,9 @@ png_set_cHRM_XYZ(png_const_structrp png_ptr, png_inforp info_ptr, double red_X, png_fixed(png_ptr, blue_Y, "cHRM Red Y"), png_fixed(png_ptr, blue_Z, "cHRM Red Z")); } -# endif /* PNG_FLOATING_POINT_SUPPORTED */ +# endif /* FLOATING_POINT */ -#endif /* PNG_cHRM_SUPPORTED */ +#endif /* cHRM */ #ifdef PNG_gAMA_SUPPORTED void PNGFAPI @@ -227,13 +228,13 @@ png_set_IHDR(png_const_structrp png_ptr, png_inforp info_ptr, if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) info_ptr->channels = 1; - else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) + else if ((info_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0) info_ptr->channels = 3; else info_ptr->channels = 1; - if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) + if ((info_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0) info_ptr->channels++; info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth); @@ -288,12 +289,14 @@ png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr, /* Validate params[nparams] */ for (i=0; ipcal_purpose = png_voidcast(png_charp, - png_malloc_warn(png_ptr, length)); + png_malloc_warn(png_ptr, length)); if (info_ptr->pcal_purpose == NULL) { @@ -594,7 +597,8 @@ png_set_sRGB_gAMA_and_cHRM(png_const_structrp png_ptr, png_inforp info_ptr, if (png_ptr == NULL || info_ptr == NULL) return; - if (png_colorspace_set_sRGB(png_ptr, &info_ptr->colorspace, srgb_intent)) + if (png_colorspace_set_sRGB(png_ptr, &info_ptr->colorspace, + srgb_intent) != 0) { /* This causes the gAMA and cHRM to be written too */ info_ptr->colorspace.flags |= @@ -637,7 +641,7 @@ png_set_iCCP(png_const_structrp png_ptr, png_inforp info_ptr, png_colorspace_sync_info(png_ptr, info_ptr); /* Don't do any of the copying if the profile was bad, or inconsistent. */ - if (!result) + if (result == 0) return; /* But do write the gAMA and cHRM chunks from the profile. */ @@ -661,6 +665,7 @@ png_set_iCCP(png_const_structrp png_ptr, png_inforp info_ptr, if (new_iccp_profile == NULL) { png_free(png_ptr, new_iccp_name); + new_iccp_name = NULL; png_benign_error(png_ptr, "Insufficient memory to process iCCP profile"); return; @@ -686,7 +691,7 @@ png_set_text(png_const_structrp png_ptr, png_inforp info_ptr, int ret; ret = png_set_text_2(png_ptr, info_ptr, text_ptr, num_text); - if (ret) + if (ret != 0) png_error(png_ptr, "Insufficient memory to store text"); } @@ -726,7 +731,7 @@ png_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr, else max_text = INT_MAX; - /* Now allocate a new array and copy the old members in, this does all + /* Now allocate a new array and copy the old members in; this does all * the overflow checks. */ new_text = png_voidcast(png_textp,png_realloc_array(png_ptr, @@ -855,7 +860,7 @@ png_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr, textp->text = textp->key + key_len + 1; } - if (text_length) + if (text_length != 0) memcpy(textp->text, text_ptr[i].text, text_length); *(textp->text + text_length) = '\0'; @@ -890,7 +895,7 @@ png_set_tIME(png_const_structrp png_ptr, png_inforp info_ptr, png_debug1(1, "in %s storage function", "tIME"); if (png_ptr == NULL || info_ptr == NULL || mod_time == NULL || - (png_ptr->mode & PNG_WROTE_tIME)) + (png_ptr->mode & PNG_WROTE_tIME) != 0) return; if (mod_time->month == 0 || mod_time->month > 12 || @@ -1020,8 +1025,8 @@ png_set_sPLT(png_const_structrp png_ptr, np->depth = entries->depth; - /* In the even of out-of-memory just return - there's no point keeping on - * trying to add sPLT chunks. + /* In the event of out-of-memory just return - there's no point keeping + * on trying to add sPLT chunks. */ length = strlen(entries->name) + 1; np->name = png_voidcast(png_charp, png_malloc_base(png_ptr, length)); @@ -1032,8 +1037,8 @@ png_set_sPLT(png_const_structrp png_ptr, memcpy(np->name, entries->name, length); /* IMPORTANT: we have memory now that won't get freed if something else - * goes wrong, this code must free it. png_malloc_array produces no - * warnings, use a png_chunk_report (below) if there is an error. + * goes wrong; this code must free it. png_malloc_array produces no + * warnings; use a png_chunk_report (below) if there is an error. */ np->entries = png_voidcast(png_sPLT_entryp, png_malloc_array(png_ptr, entries->nentries, sizeof (png_sPLT_entry))); @@ -1041,6 +1046,7 @@ png_set_sPLT(png_const_structrp png_ptr, if (np->entries == NULL) { png_free(png_ptr, np->name); + np->name = NULL; break; } @@ -1063,7 +1069,7 @@ png_set_sPLT(png_const_structrp png_ptr, if (nentries > 0) png_chunk_report(png_ptr, "sPLT out of memory", PNG_CHUNK_WRITE_ERROR); } -#endif /* PNG_sPLT_SUPPORTED */ +#endif /* sPLT */ #ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED static png_byte @@ -1072,10 +1078,10 @@ check_location(png_const_structrp png_ptr, int location) location &= (PNG_HAVE_IHDR|PNG_HAVE_PLTE|PNG_AFTER_IDAT); /* New in 1.6.0; copy the location and check it. This is an API - * change, previously the app had to use the + * change; previously the app had to use the * png_set_unknown_chunk_location API below for each chunk. */ - if (location == 0 && !(png_ptr->mode & PNG_IS_READ_STRUCT)) + if (location == 0 && (png_ptr->mode & PNG_IS_READ_STRUCT) == 0) { /* Write struct, so unknown chunks come from the app */ png_app_warning(png_ptr, @@ -1121,7 +1127,7 @@ png_set_unknown_chunks(png_const_structrp png_ptr, */ # if !defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) && \ defined(PNG_READ_SUPPORTED) - if (png_ptr->mode & PNG_IS_READ_STRUCT) + if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0) { png_app_error(png_ptr, "no unknown chunk support on read"); return; @@ -1129,7 +1135,7 @@ png_set_unknown_chunks(png_const_structrp png_ptr, # endif # if !defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) && \ defined(PNG_WRITE_SUPPORTED) - if (!(png_ptr->mode & PNG_IS_READ_STRUCT)) + if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0) { png_app_error(png_ptr, "no unknown chunk support on write"); return; @@ -1215,7 +1221,7 @@ png_set_unknown_chunk_location(png_const_structrp png_ptr, png_inforp info_ptr, { png_app_error(png_ptr, "invalid unknown chunk location"); /* Fake out the pre 1.6.0 behavior: */ - if ((location & PNG_HAVE_IDAT)) /* undocumented! */ + if ((location & PNG_HAVE_IDAT) != 0) /* undocumented! */ location = PNG_AFTER_IDAT; else @@ -1253,10 +1259,13 @@ add_one_chunk(png_bytep list, unsigned int count, png_const_bytep add, int keep) /* Utility function: update the 'keep' state of a chunk if it is already in * the list, otherwise add it to the list. */ - for (i=0; i 0 */ @@ -1353,7 +1362,7 @@ png_set_keep_unknown_chunks(png_structrp png_ptr, int keep, * required because add_one_chunk above doesn't extend the list if the 'keep' * parameter is the default. */ - if (keep) + if (keep != 0) { new_list = png_voidcast(png_bytep, png_malloc(png_ptr, 5 * (num_chunks + old_num_chunks))); @@ -1380,12 +1389,15 @@ png_set_keep_unknown_chunks(png_structrp png_ptr, int keep, unsigned int i; for (i=0; irow_pointers && (info_ptr->row_pointers != row_pointers)) + if (info_ptr->row_pointers != NULL && + (info_ptr->row_pointers != row_pointers)) png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); info_ptr->row_pointers = row_pointers; - if (row_pointers) + if (row_pointers != NULL) info_ptr->valid |= PNG_INFO_IDAT; } #endif @@ -1464,7 +1478,7 @@ png_set_compression_buffer_size(png_structrp png_ptr, png_size_t size) png_error(png_ptr, "invalid compression buffer size"); # ifdef PNG_SEQUENTIAL_READ_SUPPORTED - if (png_ptr->mode & PNG_IS_READ_STRUCT) + if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0) { png_ptr->IDAT_read_size = (png_uint_32)size; /* checked above */ return; @@ -1472,7 +1486,7 @@ png_set_compression_buffer_size(png_structrp png_ptr, png_size_t size) # endif # ifdef PNG_WRITE_SUPPORTED - if (!(png_ptr->mode & PNG_IS_READ_STRUCT)) + if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0) { if (png_ptr->zowner != 0) { @@ -1510,7 +1524,7 @@ png_set_compression_buffer_size(png_structrp png_ptr, png_size_t size) void PNGAPI png_set_invalid(png_const_structrp png_ptr, png_inforp info_ptr, int mask) { - if (png_ptr && info_ptr) + if (png_ptr != NULL && info_ptr != NULL) info_ptr->valid &= ~mask; } @@ -1536,7 +1550,7 @@ png_set_user_limits (png_structrp png_ptr, png_uint_32 user_width_max, void PNGAPI png_set_chunk_cache_max (png_structrp png_ptr, png_uint_32 user_chunk_cache_max) { - if (png_ptr) + if (png_ptr != NULL) png_ptr->user_chunk_cache_max = user_chunk_cache_max; } @@ -1545,10 +1559,10 @@ void PNGAPI png_set_chunk_malloc_max (png_structrp png_ptr, png_alloc_size_t user_chunk_malloc_max) { - if (png_ptr) + if (png_ptr != NULL) png_ptr->user_chunk_malloc_max = user_chunk_malloc_max; } -#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ +#endif /* ?SET_USER_LIMITS */ #ifdef PNG_BENIGN_ERRORS_SUPPORTED @@ -1563,7 +1577,7 @@ png_set_benign_errors(png_structrp png_ptr, int allowed) * is the default behavior if png_set_benign_errors() is not called). */ - if (allowed) + if (allowed != 0) png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN | PNG_FLAG_APP_WARNINGS_WARN | PNG_FLAG_APP_ERRORS_WARN; @@ -1571,14 +1585,14 @@ png_set_benign_errors(png_structrp png_ptr, int allowed) png_ptr->flags &= ~(PNG_FLAG_BENIGN_ERRORS_WARN | PNG_FLAG_APP_WARNINGS_WARN | PNG_FLAG_APP_ERRORS_WARN); } -#endif /* PNG_BENIGN_ERRORS_SUPPORTED */ +#endif /* BENIGN_ERRORS */ #ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED /* Whether to report invalid palette index; added at libng-1.5.10. * It is possible for an indexed (color-type==3) PNG file to contain * pixels with invalid (out-of-range) indexes if the PLTE chunk has * fewer entries than the image's bit-depth would allow. We recover - * from this gracefully by filling any incomplete palette with zeroes + * from this gracefully by filling any incomplete palette with zeros * (opaque black). By default, when this occurs libpng will issue * a benign error. This API can be used to override that behavior. */ @@ -1594,4 +1608,4 @@ png_set_check_for_invalid_index(png_structrp png_ptr, int allowed) png_ptr->num_palette_max = -1; } #endif -#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ +#endif /* READ || WRITE */ diff --git a/lib/libpng/pngstruct.h b/lib/libpng/pngstruct.h index d58c028844..c1dd026a90 100644 --- a/lib/libpng/pngstruct.h +++ b/lib/libpng/pngstruct.h @@ -274,7 +274,7 @@ struct png_struct_def #ifdef PNG_READ_GAMMA_SUPPORTED png_color_16 background_1; /* background normalized to gamma 1.0 */ #endif -#endif /* PNG_bKGD_SUPPORTED */ +#endif /* bKGD */ #ifdef PNG_WRITE_FLUSH_SUPPORTED png_flush_ptr output_flush_fn; /* Function for flushing output */ @@ -331,7 +331,7 @@ struct png_struct_def int process_mode; /* what push library is currently doing */ int cur_palette; /* current push library palette index */ -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ +#endif /* PROGRESSIVE_READ */ #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) /* For the Borland special 64K segment handler */ diff --git a/lib/libpng/pngtrans.c b/lib/libpng/pngtrans.c index 94f18df27e..56856b4802 100644 --- a/lib/libpng/pngtrans.c +++ b/lib/libpng/pngtrans.c @@ -1,7 +1,7 @@ /* pngtrans.c - transforms the data in a row (used by both readers and writers) * - * Last changed in libpng 1.6.9 [February 6, 2014] + * Last changed in libpng 1.6.15 [November 20, 2014] * Copyright (c) 1998-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -100,7 +100,7 @@ png_set_interlace_handling(png_structrp png_ptr) { png_debug(1, "in png_set_interlace handling"); - if (png_ptr && png_ptr->interlaced) + if (png_ptr != 0 && png_ptr->interlaced != 0) { png_ptr->transformations |= PNG_INTERLACE; return (7); @@ -127,7 +127,7 @@ png_set_filler(png_structrp png_ptr, png_uint_32 filler, int filler_loc) /* In libpng 1.6 it is possible to determine whether this is a read or write * operation and therefore to do more checking here for a valid call. */ - if (png_ptr->mode & PNG_IS_READ_STRUCT) + if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0) { # ifdef PNG_READ_FILLER_SUPPORTED /* On read png_set_filler is always valid, regardless of the base PNG @@ -210,7 +210,7 @@ png_set_add_alpha(png_structrp png_ptr, png_uint_32 filler, int filler_loc) png_set_filler(png_ptr, filler, filler_loc); /* The above may fail to do anything. */ - if (png_ptr->transformations & PNG_FILLER) + if ((png_ptr->transformations & PNG_FILLER) != 0) png_ptr->transformations |= PNG_ADD_ALPHA; } @@ -327,9 +327,16 @@ png_do_swap(png_row_infop row_info, png_bytep row) for (i = 0; i < istop; i++, rp += 2) { +#ifdef PNG_BUILTIN_BSWAP16_SUPPORTED + /* Feature added to libpng-1.6.11 for testing purposes, not + * enabled by default. + */ + *(png_uint_16*)rp = __builtin_bswap16(*(png_uint_16*)rp); +#else png_byte t = *rp; *rp = *(rp + 1); *(rp + 1) = t; +#endif } } } @@ -471,7 +478,7 @@ png_do_packswap(png_row_infop row_info, png_bytep row) *rp = table[*rp]; } } -#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */ +#endif /* PACKSWAP || WRITE_PACKSWAP */ #if defined(PNG_WRITE_FILLER_SUPPORTED) || \ defined(PNG_READ_STRIP_ALPHA_SUPPORTED) @@ -503,7 +510,7 @@ png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start) { if (row_info->bit_depth == 8) { - if (at_start) /* Skip initial filler */ + if (at_start != 0) /* Skip initial filler */ ++sp; else /* Skip initial channel and, for sp, the filler */ sp += 2, ++dp; @@ -517,7 +524,7 @@ png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start) else if (row_info->bit_depth == 16) { - if (at_start) /* Skip initial filler */ + if (at_start != 0) /* Skip initial filler */ sp += 2; else /* Skip initial channel and, for sp, the filler */ sp += 4, dp += 2; @@ -543,7 +550,7 @@ png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start) { if (row_info->bit_depth == 8) { - if (at_start) /* Skip initial filler */ + if (at_start != 0) /* Skip initial filler */ ++sp; else /* Skip initial channels and, for sp, the filler */ sp += 4, dp += 3; @@ -557,7 +564,7 @@ png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start) else if (row_info->bit_depth == 16) { - if (at_start) /* Skip initial filler */ + if (at_start != 0) /* Skip initial filler */ sp += 2; else /* Skip initial channels and, for sp, the filler */ sp += 8, dp += 6; @@ -598,7 +605,7 @@ png_do_bgr(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_bgr"); - if ((row_info->color_type & PNG_COLOR_MASK_COLOR)) + if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0) { png_uint_32 row_width = row_info->width; if (row_info->bit_depth == 8) @@ -668,7 +675,7 @@ png_do_bgr(png_row_infop row_info, png_bytep row) #endif } } -#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ +#endif /* READ_BGR || WRITE_BGR */ #if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \ defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED) @@ -771,7 +778,7 @@ png_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info) } } } -#endif /* PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED */ +#endif /* CHECK_FOR_INVALID_INDEX */ #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) @@ -821,7 +828,7 @@ png_get_user_transform_ptr(png_const_structrp png_ptr) png_uint_32 PNGAPI png_get_current_row_number(png_const_structrp png_ptr) { - /* See the comments in png.h - this is the sub-image row when reading and + /* See the comments in png.h - this is the sub-image row when reading an * interlaced image. */ if (png_ptr != NULL) @@ -837,7 +844,6 @@ png_get_current_pass_number(png_const_structrp png_ptr) return png_ptr->pass; return 8; /* invalid */ } -#endif /* PNG_USER_TRANSFORM_INFO_SUPPORTED */ -#endif /* PNG_READ_USER_TRANSFORM_SUPPORTED || - PNG_WRITE_USER_TRANSFORM_SUPPORTED */ -#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ +#endif /* USER_TRANSFORM_INFO */ +#endif /* READ_USER_TRANSFORM || WRITE_USER_TRANSFORM */ +#endif /* READ || WRITE */ diff --git a/lib/libpng/pngwio.c b/lib/libpng/pngwio.c index 1b525f9484..0a40948aab 100644 --- a/lib/libpng/pngwio.c +++ b/lib/libpng/pngwio.c @@ -1,7 +1,7 @@ /* pngwio.c - functions for data output * - * Last changed in libpng 1.6.9 [February 6, 2014] + * Last changed in libpng 1.6.15 [November 20, 2014] * Copyright (c) 1998-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -151,7 +151,7 @@ png_set_write_fn(png_structrp png_ptr, png_voidp io_ptr, # endif #else PNG_UNUSED(output_flush_fn) -#endif /* PNG_WRITE_FLUSH_SUPPORTED */ +#endif /* WRITE_FLUSH */ #ifdef PNG_READ_SUPPORTED /* It is an error to read while writing a png file */ @@ -165,4 +165,4 @@ png_set_write_fn(png_structrp png_ptr, png_voidp io_ptr, } #endif } -#endif /* PNG_WRITE_SUPPORTED */ +#endif /* WRITE */ diff --git a/lib/libpng/pngwrite.c b/lib/libpng/pngwrite.c index cff7864cb7..94548877bd 100644 --- a/lib/libpng/pngwrite.c +++ b/lib/libpng/pngwrite.c @@ -1,7 +1,7 @@ /* pngwrite.c - general routines to write a PNG file * - * Last changed in libpng 1.6.10 [March 6, 2014] + * Last changed in libpng 1.6.15 [November 20, 2014] * Copyright (c) 1998-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -24,7 +24,7 @@ static void write_unknown_chunks(png_structrp png_ptr, png_const_inforp info_ptr, unsigned int where) { - if (info_ptr->unknown_chunks_num) + if (info_ptr->unknown_chunks_num != 0) { png_const_unknown_chunkp up; @@ -33,7 +33,7 @@ write_unknown_chunks(png_structrp png_ptr, png_const_inforp info_ptr, for (up = info_ptr->unknown_chunks; up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; ++up) - if (up->location & where) + if ((up->location & where) != 0) { /* If per-chunk unknown chunk handling is enabled use it, otherwise * just write the chunks the application has set. @@ -69,7 +69,7 @@ write_unknown_chunks(png_structrp png_ptr, png_const_inforp info_ptr, } } } -#endif /* PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED */ +#endif /* WRITE_UNKNOWN_CHUNKS */ /* Writes all the PNG information. This is the suggested way to use the * library. If you have a new chunk to add, make a function to write it, @@ -88,14 +88,14 @@ png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr) if (png_ptr == NULL || info_ptr == NULL) return; - if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) + if ((png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE) == 0) { /* Write PNG signature */ png_write_sig(png_ptr); #ifdef PNG_MNG_FEATURES_SUPPORTED - if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) && \ - (png_ptr->mng_features_permitted)) + if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0 && \ + png_ptr->mng_features_permitted != 0) { png_warning(png_ptr, "MNG features are not allowed in a PNG datastream"); png_ptr->mng_features_permitted = 0; @@ -129,9 +129,9 @@ png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr) */ #ifdef PNG_GAMMA_SUPPORTED # ifdef PNG_WRITE_gAMA_SUPPORTED - if (!(info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) && - (info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_gAMA) && - (info_ptr->valid & PNG_INFO_gAMA)) + if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 && + (info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_gAMA) != 0 && + (info_ptr->valid & PNG_INFO_gAMA) != 0) png_write_gAMA_fixed(png_ptr, info_ptr->colorspace.gamma); # endif #endif @@ -141,11 +141,11 @@ png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr) * and it matches one of the known sRGB ones issue a warning. */ # ifdef PNG_WRITE_iCCP_SUPPORTED - if (!(info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) && - (info_ptr->valid & PNG_INFO_iCCP)) + if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 && + (info_ptr->valid & PNG_INFO_iCCP) != 0) { # ifdef PNG_WRITE_sRGB_SUPPORTED - if (info_ptr->valid & PNG_INFO_sRGB) + if ((info_ptr->valid & PNG_INFO_sRGB) != 0) png_app_warning(png_ptr, "profile matches sRGB but writing iCCP instead"); # endif @@ -159,22 +159,22 @@ png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr) # endif # ifdef PNG_WRITE_sRGB_SUPPORTED - if (!(info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) && - (info_ptr->valid & PNG_INFO_sRGB)) + if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 && + (info_ptr->valid & PNG_INFO_sRGB) != 0) png_write_sRGB(png_ptr, info_ptr->colorspace.rendering_intent); # endif /* WRITE_sRGB */ #endif /* COLORSPACE */ #ifdef PNG_WRITE_sBIT_SUPPORTED - if (info_ptr->valid & PNG_INFO_sBIT) + if ((info_ptr->valid & PNG_INFO_sBIT) != 0) png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type); #endif #ifdef PNG_COLORSPACE_SUPPORTED # ifdef PNG_WRITE_cHRM_SUPPORTED - if (!(info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) && - (info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) && - (info_ptr->valid & PNG_INFO_cHRM)) + if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 && + (info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) != 0 && + (info_ptr->valid & PNG_INFO_cHRM) != 0) png_write_cHRM_fixed(png_ptr, &info_ptr->colorspace.end_points_xy); # endif #endif @@ -201,19 +201,19 @@ png_write_info(png_structrp png_ptr, png_const_inforp info_ptr) png_write_info_before_PLTE(png_ptr, info_ptr); - if (info_ptr->valid & PNG_INFO_PLTE) + if ((info_ptr->valid & PNG_INFO_PLTE) != 0) png_write_PLTE(png_ptr, info_ptr->palette, (png_uint_32)info_ptr->num_palette); - else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + else if ((info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) !=0) png_error(png_ptr, "Valid palette required for paletted images"); #ifdef PNG_WRITE_tRNS_SUPPORTED - if (info_ptr->valid & PNG_INFO_tRNS) + if ((info_ptr->valid & PNG_INFO_tRNS) !=0) { #ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED /* Invert the alpha channel (in tRNS) */ - if ((png_ptr->transformations & PNG_INVERT_ALPHA) && + if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0 && info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { int j; @@ -227,42 +227,42 @@ png_write_info(png_structrp png_ptr, png_const_inforp info_ptr) } #endif #ifdef PNG_WRITE_bKGD_SUPPORTED - if (info_ptr->valid & PNG_INFO_bKGD) + if ((info_ptr->valid & PNG_INFO_bKGD) != 0) png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type); #endif #ifdef PNG_WRITE_hIST_SUPPORTED - if (info_ptr->valid & PNG_INFO_hIST) + if ((info_ptr->valid & PNG_INFO_hIST) != 0) png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette); #endif #ifdef PNG_WRITE_oFFs_SUPPORTED - if (info_ptr->valid & PNG_INFO_oFFs) + if ((info_ptr->valid & PNG_INFO_oFFs) != 0) png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset, info_ptr->offset_unit_type); #endif #ifdef PNG_WRITE_pCAL_SUPPORTED - if (info_ptr->valid & PNG_INFO_pCAL) + if ((info_ptr->valid & PNG_INFO_pCAL) != 0) png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0, info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams, info_ptr->pcal_units, info_ptr->pcal_params); #endif #ifdef PNG_WRITE_sCAL_SUPPORTED - if (info_ptr->valid & PNG_INFO_sCAL) + if ((info_ptr->valid & PNG_INFO_sCAL) != 0) png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit, info_ptr->scal_s_width, info_ptr->scal_s_height); #endif /* sCAL */ #ifdef PNG_WRITE_pHYs_SUPPORTED - if (info_ptr->valid & PNG_INFO_pHYs) + if ((info_ptr->valid & PNG_INFO_pHYs) != 0) png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit, info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type); #endif /* pHYs */ #ifdef PNG_WRITE_tIME_SUPPORTED - if (info_ptr->valid & PNG_INFO_tIME) + if ((info_ptr->valid & PNG_INFO_tIME) != 0) { png_write_tIME(png_ptr, &(info_ptr->mod_time)); png_ptr->mode |= PNG_WROTE_tIME; @@ -270,7 +270,7 @@ png_write_info(png_structrp png_ptr, png_const_inforp info_ptr) #endif /* tIME */ #ifdef PNG_WRITE_sPLT_SUPPORTED - if (info_ptr->valid & PNG_INFO_sPLT) + if ((info_ptr->valid & PNG_INFO_sPLT) != 0) for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) png_write_sPLT(png_ptr, info_ptr->splt_palettes + i); #endif /* sPLT */ @@ -292,11 +292,14 @@ png_write_info(png_structrp png_ptr, png_const_inforp info_ptr) info_ptr->text[i].lang, info_ptr->text[i].lang_key, info_ptr->text[i].text); + /* Mark this chunk as written */ + if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; + else + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; #else - png_warning(png_ptr, "Unable to write international text"); + png_warning(png_ptr, "Unable to write international text"); #endif - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; } /* If we want a compressed text chunk */ @@ -305,13 +308,12 @@ png_write_info(png_structrp png_ptr, png_const_inforp info_ptr) #ifdef PNG_WRITE_zTXt_SUPPORTED /* Write compressed chunk */ png_write_zTXt(png_ptr, info_ptr->text[i].key, - info_ptr->text[i].text, 0, - info_ptr->text[i].compression); + info_ptr->text[i].text, info_ptr->text[i].compression); + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; #else png_warning(png_ptr, "Unable to write compressed text"); #endif - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; } else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) @@ -349,7 +351,7 @@ png_write_end(png_structrp png_ptr, png_inforp info_ptr) if (png_ptr == NULL) return; - if (!(png_ptr->mode & PNG_HAVE_IDAT)) + if ((png_ptr->mode & PNG_HAVE_IDAT) == 0) png_error(png_ptr, "No IDATs written into file"); #ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED @@ -365,8 +367,8 @@ png_write_end(png_structrp png_ptr, png_inforp info_ptr) #endif #ifdef PNG_WRITE_tIME_SUPPORTED /* Check to see if user has supplied a time chunk */ - if ((info_ptr->valid & PNG_INFO_tIME) && - !(png_ptr->mode & PNG_WROTE_tIME)) + if ((info_ptr->valid & PNG_INFO_tIME) != 0 && + (png_ptr->mode & PNG_WROTE_tIME) == 0) png_write_tIME(png_ptr, &(info_ptr->mod_time)); #endif @@ -387,11 +389,14 @@ png_write_end(png_structrp png_ptr, png_inforp info_ptr) info_ptr->text[i].lang, info_ptr->text[i].lang_key, info_ptr->text[i].text); + /* Mark this chunk as written */ + if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; + else + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; #else png_warning(png_ptr, "Unable to write international text"); #endif - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; } else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt) @@ -399,13 +404,12 @@ png_write_end(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_WRITE_zTXt_SUPPORTED /* Write compressed chunk */ png_write_zTXt(png_ptr, info_ptr->text[i].key, - info_ptr->text[i].text, 0, - info_ptr->text[i].compression); + info_ptr->text[i].text, info_ptr->text[i].compression); + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; #else png_warning(png_ptr, "Unable to write compressed text"); #endif - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; } else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) @@ -414,12 +418,11 @@ png_write_end(png_structrp png_ptr, png_inforp info_ptr) /* Write uncompressed chunk */ png_write_tEXt(png_ptr, info_ptr->text[i].key, info_ptr->text[i].text, 0); + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; #else png_warning(png_ptr, "Unable to write uncompressed text"); #endif - - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; } } #endif @@ -432,6 +435,7 @@ png_write_end(png_structrp png_ptr, png_inforp info_ptr) /* Write end of PNG file */ png_write_IEND(png_ptr); + /* This flush, added in libpng-1.0.8, removed from libpng-1.0.9beta03, * and restored again in libpng-1.2.30, may cause some applications that * do not set png_ptr->output_flush_fn to crash. If your application @@ -479,7 +483,7 @@ png_create_write_struct,(png_const_charp user_png_ver, png_voidp error_ptr, { #ifndef PNG_USER_MEM_SUPPORTED png_structrp png_ptr = png_create_png_struct(user_png_ver, error_ptr, - error_fn, warn_fn, NULL, NULL, NULL); + error_fn, warn_fn, NULL, NULL, NULL); #else return png_create_write_struct_2(user_png_ver, error_ptr, error_fn, warn_fn, NULL, NULL, NULL); @@ -492,8 +496,8 @@ png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED) { png_structrp png_ptr = png_create_png_struct(user_png_ver, error_ptr, - error_fn, warn_fn, mem_ptr, malloc_fn, free_fn); -#endif /* PNG_USER_MEM_SUPPORTED */ + error_fn, warn_fn, mem_ptr, malloc_fn, free_fn); +#endif /* USER_MEM */ if (png_ptr != NULL) { /* Set the zlib control values to defaults; they can be overridden by the @@ -517,7 +521,7 @@ png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, png_ptr->zlib_text_mem_level = 8; png_ptr->zlib_text_window_bits = 15; png_ptr->zlib_text_method = 8; -#endif /* PNG_WRITE_COMPRESSED_TEXT_SUPPORTED */ +#endif /* WRITE_COMPRESSED_TEXT */ /* This is a highly dubious configuration option; by default it is off, * but it may be appropriate for private builds that are testing @@ -525,10 +529,10 @@ png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, * applications that must not fail to write at all costs! */ #ifdef PNG_BENIGN_WRITE_ERRORS_SUPPORTED - png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN; /* In stable builds only warn if an application error can be completely * handled. */ + png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN; #endif /* App warnings are warnings in release (or release candidate) builds but @@ -614,7 +618,7 @@ png_do_write_intrapixel(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_write_intrapixel"); - if ((row_info->color_type & PNG_COLOR_MASK_COLOR)) + if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0) { int bytes_per_pixel; png_uint_32 row_width = row_info->width; @@ -667,10 +671,10 @@ png_do_write_intrapixel(png_row_infop row_info, png_bytep row) *(rp + 5) = (png_byte)(blue & 0xff); } } -#endif /* PNG_WRITE_16BIT_SUPPORTED */ +#endif /* WRITE_16BIT */ } } -#endif /* PNG_MNG_FEATURES_SUPPORTED */ +#endif /* MNG_FEATURES */ /* Called by user to write a row of image data */ void PNGAPI @@ -689,44 +693,44 @@ png_write_row(png_structrp png_ptr, png_const_bytep row) if (png_ptr->row_number == 0 && png_ptr->pass == 0) { /* Make sure we wrote the header info */ - if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) + if ((png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE) == 0) png_error(png_ptr, "png_write_info was never called before png_write_row"); /* Check for transforms that have been set but were defined out */ #if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED) - if (png_ptr->transformations & PNG_INVERT_MONO) + if ((png_ptr->transformations & PNG_INVERT_MONO) != 0) png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined"); #endif #if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED) - if (png_ptr->transformations & PNG_FILLER) + if ((png_ptr->transformations & PNG_FILLER) != 0) png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined"); #endif #if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \ defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) + if ((png_ptr->transformations & PNG_PACKSWAP) != 0) png_warning(png_ptr, "PNG_WRITE_PACKSWAP_SUPPORTED is not defined"); #endif #if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED) - if (png_ptr->transformations & PNG_PACK) + if ((png_ptr->transformations & PNG_PACK) != 0) png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined"); #endif #if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED) - if (png_ptr->transformations & PNG_SHIFT) + if ((png_ptr->transformations & PNG_SHIFT) != 0) png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined"); #endif #if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED) - if (png_ptr->transformations & PNG_BGR) + if ((png_ptr->transformations & PNG_BGR) != 0) png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined"); #endif #if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED) - if (png_ptr->transformations & PNG_SWAP_BYTES) + if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0) png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined"); #endif @@ -735,12 +739,13 @@ png_write_row(png_structrp png_ptr, png_const_bytep row) #ifdef PNG_WRITE_INTERLACING_SUPPORTED /* If interlaced and not interested in row, return */ - if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) + if (png_ptr->interlaced != 0 && + (png_ptr->transformations & PNG_INTERLACE) != 0) { switch (png_ptr->pass) { case 0: - if (png_ptr->row_number & 0x07) + if ((png_ptr->row_number & 0x07) != 0) { png_write_finish_row(png_ptr); return; @@ -748,7 +753,7 @@ png_write_row(png_structrp png_ptr, png_const_bytep row) break; case 1: - if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) + if ((png_ptr->row_number & 0x07) != 0 || png_ptr->width < 5) { png_write_finish_row(png_ptr); return; @@ -764,7 +769,7 @@ png_write_row(png_structrp png_ptr, png_const_bytep row) break; case 3: - if ((png_ptr->row_number & 0x03) || png_ptr->width < 3) + if ((png_ptr->row_number & 0x03) != 0 || png_ptr->width < 3) { png_write_finish_row(png_ptr); return; @@ -780,7 +785,7 @@ png_write_row(png_structrp png_ptr, png_const_bytep row) break; case 5: - if ((png_ptr->row_number & 0x01) || png_ptr->width < 2) + if ((png_ptr->row_number & 0x01) != 0 || png_ptr->width < 2) { png_write_finish_row(png_ptr); return; @@ -788,7 +793,7 @@ png_write_row(png_structrp png_ptr, png_const_bytep row) break; case 6: - if (!(png_ptr->row_number & 0x01)) + if ((png_ptr->row_number & 0x01) == 0) { png_write_finish_row(png_ptr); return; @@ -822,11 +827,11 @@ png_write_row(png_structrp png_ptr, png_const_bytep row) #ifdef PNG_WRITE_INTERLACING_SUPPORTED /* Handle interlacing */ if (png_ptr->interlaced && png_ptr->pass < 6 && - (png_ptr->transformations & PNG_INTERLACE)) + (png_ptr->transformations & PNG_INTERLACE) != 0) { png_do_write_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass); /* This should always get caught above, but still ... */ - if (!(row_info.width)) + if (row_info.width == 0) { png_write_finish_row(png_ptr); return; @@ -836,7 +841,7 @@ png_write_row(png_structrp png_ptr, png_const_bytep row) #ifdef PNG_WRITE_TRANSFORMS_SUPPORTED /* Handle other transformations */ - if (png_ptr->transformations) + if (png_ptr->transformations != 0) png_do_write_transformations(png_ptr, &row_info); #endif @@ -857,7 +862,7 @@ png_write_row(png_structrp png_ptr, png_const_bytep row) * 4. The filter_method is 64 and * 5. The color_type is RGB or RGBA */ - if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && + if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 && (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) { /* Intrapixel differencing */ @@ -910,7 +915,7 @@ png_write_flush(png_structrp png_ptr) png_ptr->flush_rows = 0; png_flush(png_ptr); } -#endif /* PNG_WRITE_FLUSH_SUPPORTED */ +#endif /* WRITE_FLUSH */ #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED static void png_reset_filter_heuristics(png_structrp png_ptr);/* forward decl */ @@ -923,18 +928,24 @@ png_write_destroy(png_structrp png_ptr) png_debug(1, "in png_write_destroy"); /* Free any memory zlib uses */ - if (png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) + if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) != 0) deflateEnd(&png_ptr->zstream); /* Free our memory. png_free checks NULL for us. */ png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list); png_free(png_ptr, png_ptr->row_buf); + png_ptr->row_buf = NULL; #ifdef PNG_WRITE_FILTER_SUPPORTED png_free(png_ptr, png_ptr->prev_row); png_free(png_ptr, png_ptr->sub_row); png_free(png_ptr, png_ptr->up_row); png_free(png_ptr, png_ptr->avg_row); png_free(png_ptr, png_ptr->paeth_row); + png_ptr->prev_row = NULL; + png_ptr->sub_row = NULL; + png_ptr->up_row = NULL; + png_ptr->avg_row = NULL; + png_ptr->paeth_row = NULL; #endif #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED @@ -942,10 +953,13 @@ png_write_destroy(png_structrp png_ptr) png_reset_filter_heuristics(png_ptr); png_free(png_ptr, png_ptr->filter_costs); png_free(png_ptr, png_ptr->inv_filter_costs); + png_ptr->filter_costs = NULL; + png_ptr->inv_filter_costs = NULL; #endif #ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED png_free(png_ptr, png_ptr->chunk_list); + png_ptr->chunk_list = NULL; #endif /* The error handling and memory handling information is left intact at this @@ -991,7 +1005,7 @@ png_set_filter(png_structrp png_ptr, int method, int filters) return; #ifdef PNG_MNG_FEATURES_SUPPORTED - if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && + if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 && (method == PNG_INTRAPIXEL_DIFFERENCING)) method = PNG_FILTER_TYPE_BASE; @@ -1005,7 +1019,7 @@ png_set_filter(png_structrp png_ptr, int method, int filters) case 6: case 7: png_app_error(png_ptr, "Unknown row filter for method 0"); /* FALL THROUGH */ -#endif /* PNG_WRITE_FILTER_SUPPORTED */ +#endif /* WRITE_FILTER */ case PNG_FILTER_VALUE_NONE: png_ptr->do_filter = PNG_FILTER_NONE; break; @@ -1027,7 +1041,7 @@ png_set_filter(png_structrp png_ptr, int method, int filters) #else default: png_app_error(png_ptr, "Unknown row filter for method 0"); -#endif /* PNG_WRITE_FILTER_SUPPORTED */ +#endif /* WRITE_FILTER */ } /* If we have allocated the row_buf, this means we have already started @@ -1042,14 +1056,16 @@ png_set_filter(png_structrp png_ptr, int method, int filters) if (png_ptr->row_buf != NULL) { #ifdef PNG_WRITE_FILTER_SUPPORTED - if ((png_ptr->do_filter & PNG_FILTER_SUB) && png_ptr->sub_row == NULL) + if ((png_ptr->do_filter & PNG_FILTER_SUB) != 0 && + png_ptr->sub_row == NULL) { png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, (png_ptr->rowbytes + 1)); png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB; } - if ((png_ptr->do_filter & PNG_FILTER_UP) && png_ptr->up_row == NULL) + if ((png_ptr->do_filter & PNG_FILTER_UP) != 0 && + png_ptr->up_row == NULL) { if (png_ptr->prev_row == NULL) { @@ -1066,7 +1082,8 @@ png_set_filter(png_structrp png_ptr, int method, int filters) } } - if ((png_ptr->do_filter & PNG_FILTER_AVG) && png_ptr->avg_row == NULL) + if ((png_ptr->do_filter & PNG_FILTER_AVG) != 0 && + png_ptr->avg_row == NULL) { if (png_ptr->prev_row == NULL) { @@ -1083,7 +1100,7 @@ png_set_filter(png_structrp png_ptr, int method, int filters) } } - if ((png_ptr->do_filter & PNG_FILTER_PAETH) && + if ((png_ptr->do_filter & PNG_FILTER_PAETH) != 0 && png_ptr->paeth_row == NULL) { if (png_ptr->prev_row == NULL) @@ -1101,7 +1118,7 @@ png_set_filter(png_structrp png_ptr, int method, int filters) } if (png_ptr->do_filter == PNG_NO_FILTERS) -#endif /* PNG_WRITE_FILTER_SUPPORTED */ +#endif /* WRITE_FILTER */ png_ptr->do_filter = PNG_FILTER_NONE; } } @@ -1244,7 +1261,7 @@ png_set_filter_heuristics(png_structrp png_ptr, int heuristic_method, /* The internal API allocates all the arrays and ensures that the elements of * those arrays are set to the default value. */ - if (!png_init_filter_heuristics(png_ptr, heuristic_method, num_weights)) + if (png_init_filter_heuristics(png_ptr, heuristic_method, num_weights) == 0) return; /* If using the weighted method copy in the weights. */ @@ -1299,7 +1316,7 @@ png_set_filter_heuristics_fixed(png_structrp png_ptr, int heuristic_method, /* The internal API allocates all the arrays and ensures that the elements of * those arrays are set to the default value. */ - if (!png_init_filter_heuristics(png_ptr, heuristic_method, num_weights)) + if (png_init_filter_heuristics(png_ptr, heuristic_method, num_weights) == 0) return; /* If using the weighted method copy in the weights. */ @@ -1353,7 +1370,7 @@ png_set_filter_heuristics_fixed(png_structrp png_ptr, int heuristic_method, } } #endif /* FIXED_POINT */ -#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ +#endif /* WRITE_WEIGHTED_FILTER */ void PNGAPI png_set_compression_level(png_structrp png_ptr, int level) @@ -1510,7 +1527,7 @@ png_set_text_compression_method(png_structrp png_ptr, int method) png_ptr->zlib_text_method = method; } -#endif /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */ +#endif /* WRITE_CUSTOMIZE_ZTXT_COMPRESSION */ /* end of API added to libpng-1.5.4 */ void PNGAPI @@ -1558,7 +1575,7 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr, /* ------ these transformations don't touch the info structure ------- */ /* Invert monochrome pixels */ - if (transforms & PNG_TRANSFORM_INVERT_MONO) + if ((transforms & PNG_TRANSFORM_INVERT_MONO) != 0) #ifdef PNG_WRITE_INVERT_SUPPORTED png_set_invert_mono(png_ptr); #else @@ -1568,16 +1585,16 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr, /* Shift the pixels up to a legal bit depth and fill in * as appropriate to correctly scale the image. */ - if (transforms & PNG_TRANSFORM_SHIFT) + if ((transforms & PNG_TRANSFORM_SHIFT) != 0) #ifdef PNG_WRITE_SHIFT_SUPPORTED - if (info_ptr->valid & PNG_INFO_sBIT) + if ((info_ptr->valid & PNG_INFO_sBIT) != 0) png_set_shift(png_ptr, &info_ptr->sig_bit); #else png_app_error(png_ptr, "PNG_TRANSFORM_SHIFT not supported"); #endif /* Pack pixels into bytes */ - if (transforms & PNG_TRANSFORM_PACKING) + if ((transforms & PNG_TRANSFORM_PACKING) != 0) #ifdef PNG_WRITE_PACK_SUPPORTED png_set_packing(png_ptr); #else @@ -1585,7 +1602,7 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr, #endif /* Swap location of alpha bytes from ARGB to RGBA */ - if (transforms & PNG_TRANSFORM_SWAP_ALPHA) + if ((transforms & PNG_TRANSFORM_SWAP_ALPHA) != 0) #ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED png_set_swap_alpha(png_ptr); #else @@ -1596,13 +1613,13 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr, * RGB, note that the code expects the input color type to be G or RGB; no * alpha channel. */ - if (transforms & - (PNG_TRANSFORM_STRIP_FILLER_AFTER|PNG_TRANSFORM_STRIP_FILLER_BEFORE)) + if ((transforms & (PNG_TRANSFORM_STRIP_FILLER_AFTER| + PNG_TRANSFORM_STRIP_FILLER_BEFORE)) != 0) { #ifdef PNG_WRITE_FILLER_SUPPORTED - if (transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) + if ((transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) != 0) { - if (transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) + if ((transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) != 0) png_app_error(png_ptr, "PNG_TRANSFORM_STRIP_FILLER: BEFORE+AFTER not supported"); @@ -1610,7 +1627,7 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr, png_set_filler(png_ptr, 0, PNG_FILLER_AFTER); } - else if (transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) + else if ((transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) != 0) png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); #else png_app_error(png_ptr, "PNG_TRANSFORM_STRIP_FILLER not supported"); @@ -1618,7 +1635,7 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr, } /* Flip BGR pixels to RGB */ - if (transforms & PNG_TRANSFORM_BGR) + if ((transforms & PNG_TRANSFORM_BGR) != 0) #ifdef PNG_WRITE_BGR_SUPPORTED png_set_bgr(png_ptr); #else @@ -1626,7 +1643,7 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr, #endif /* Swap bytes of 16-bit files to most significant byte first */ - if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) + if ((transforms & PNG_TRANSFORM_SWAP_ENDIAN) != 0) #ifdef PNG_WRITE_SWAP_SUPPORTED png_set_swap(png_ptr); #else @@ -1634,7 +1651,7 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr, #endif /* Swap bits of 1, 2, 4 bit packed pixel formats */ - if (transforms & PNG_TRANSFORM_PACKSWAP) + if ((transforms & PNG_TRANSFORM_PACKSWAP) != 0) #ifdef PNG_WRITE_PACKSWAP_SUPPORTED png_set_packswap(png_ptr); #else @@ -1642,7 +1659,7 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr, #endif /* Invert the alpha channel from opacity to transparency */ - if (transforms & PNG_TRANSFORM_INVERT_ALPHA) + if ((transforms & PNG_TRANSFORM_INVERT_ALPHA) != 0) #ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED png_set_invert_alpha(png_ptr); #else @@ -1733,14 +1750,14 @@ png_write_image_16bit(png_voidp argument) display->first_row); png_uint_16p output_row = png_voidcast(png_uint_16p, display->local_row); png_uint_16p row_end; - const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) ? 3 : 1; + const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1; int aindex = 0; png_uint_32 y = image->height; - if (image->format & PNG_FORMAT_FLAG_ALPHA) + if ((image->format & PNG_FORMAT_FLAG_ALPHA) != 0) { # ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED - if (image->format & PNG_FORMAT_FLAG_AFIRST) + if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0) { aindex = -1; ++input_row; /* To point to the first component */ @@ -1890,15 +1907,15 @@ png_write_image_8bit(png_voidp argument) display->first_row); png_bytep output_row = png_voidcast(png_bytep, display->local_row); png_uint_32 y = image->height; - const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) ? 3 : 1; + const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1; - if (image->format & PNG_FORMAT_FLAG_ALPHA) + if ((image->format & PNG_FORMAT_FLAG_ALPHA) != 0) { png_bytep row_end; int aindex; # ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED - if (image->format & PNG_FORMAT_FLAG_AFIRST) + if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0) { aindex = -1; ++input_row; /* To point to the first component */ @@ -1995,7 +2012,7 @@ png_image_set_PLTE(png_image_write_control *display) # endif # ifdef PNG_FORMAT_BGR_SUPPORTED - const int bgr = (format & PNG_FORMAT_FLAG_BGR) ? 2 : 0; + const int bgr = (format & PNG_FORMAT_FLAG_BGR) != 0 ? 2 : 0; # else # define bgr 0 # endif @@ -2012,13 +2029,13 @@ png_image_set_PLTE(png_image_write_control *display) /* This gets automatically converted to sRGB with reversal of the * pre-multiplication if the color-map has an alpha channel. */ - if (format & PNG_FORMAT_FLAG_LINEAR) + if ((format & PNG_FORMAT_FLAG_LINEAR) != 0) { png_const_uint_16p entry = png_voidcast(png_const_uint_16p, cmap); entry += i * channels; - if (channels & 1) /* no alpha */ + if ((channels & 1) != 0) /* no alpha */ { if (channels >= 3) /* RGB */ { @@ -2130,10 +2147,11 @@ png_image_write_main(png_voidp argument) png_inforp info_ptr = image->opaque->info_ptr; png_uint_32 format = image->format; - int colormap = (format & PNG_FORMAT_FLAG_COLORMAP) != 0; - int linear = !colormap && (format & PNG_FORMAT_FLAG_LINEAR) != 0; /* input */ - int alpha = !colormap && (format & PNG_FORMAT_FLAG_ALPHA) != 0; - int write_16bit = linear && !colormap && !display->convert_to_8bit; + /* The following four ints are actually booleans */ + int colormap = (format & PNG_FORMAT_FLAG_COLORMAP); + int linear = !colormap && (format & PNG_FORMAT_FLAG_LINEAR); /* input */ + int alpha = !colormap && (format & PNG_FORMAT_FLAG_ALPHA); + int write_16bit = linear && !colormap && (display->convert_to_8bit == 0); # ifdef PNG_BENIGN_ERRORS_SUPPORTED /* Make sure we error out on any bad situation */ @@ -2145,7 +2163,7 @@ png_image_write_main(png_voidp argument) display->row_stride = PNG_IMAGE_ROW_STRIDE(*image); /* Set the required transforms then write the rows in the correct order. */ - if (format & PNG_FORMAT_FLAG_COLORMAP) + if ((format & PNG_FORMAT_FLAG_COLORMAP) != 0) { if (display->colormap != NULL && image->colormap_entries > 0) { @@ -2177,12 +2195,12 @@ png_image_write_main(png_voidp argument) * write an interlaced image. */ - if (write_16bit) + if (write_16bit != 0) { /* The gamma here is 1.0 (linear) and the cHRM chunk matches sRGB. */ png_set_gAMA_fixed(png_ptr, info_ptr, PNG_GAMMA_LINEAR); - if (!(image->flags & PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB)) + if ((image->flags & PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB) == 0) png_set_cHRM_fixed(png_ptr, info_ptr, /* color x y */ /* white */ 31270, 32900, @@ -2192,7 +2210,7 @@ png_image_write_main(png_voidp argument) ); } - else if (!(image->flags & PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB)) + else if ((image->flags & PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB) == 0) png_set_sRGB(png_ptr, info_ptr, PNG_sRGB_INTENT_PERCEPTUAL); /* Else writing an 8-bit file and the *colors* aren't sRGB, but the 8-bit @@ -2209,27 +2227,27 @@ png_image_write_main(png_voidp argument) * * First check for a little endian system if writing 16 bit files. */ - if (write_16bit) + if (write_16bit != 0) { PNG_CONST png_uint_16 le = 0x0001; - if (*(png_const_bytep)&le) + if ((*(png_const_bytep) & le) != 0) png_set_swap(png_ptr); } # ifdef PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED - if (format & PNG_FORMAT_FLAG_BGR) + if ((format & PNG_FORMAT_FLAG_BGR) != 0) { - if (!colormap && (format & PNG_FORMAT_FLAG_COLOR) != 0) + if (colormap == 0 && (format & PNG_FORMAT_FLAG_COLOR) != 0) png_set_bgr(png_ptr); format &= ~PNG_FORMAT_FLAG_BGR; } # endif # ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED - if (format & PNG_FORMAT_FLAG_AFIRST) + if ((format & PNG_FORMAT_FLAG_AFIRST) != 0) { - if (!colormap && (format & PNG_FORMAT_FLAG_ALPHA) != 0) + if (colormap == 0 && (format & PNG_FORMAT_FLAG_ALPHA) != 0) png_set_swap_alpha(png_ptr); format &= ~PNG_FORMAT_FLAG_AFIRST; } @@ -2238,7 +2256,7 @@ png_image_write_main(png_voidp argument) /* If there are 16 or fewer color-map entries we wrote a lower bit depth * above, but the application data is still byte packed. */ - if (colormap && image->colormap_entries <= 16) + if (colormap != 0 && image->colormap_entries <= 16) png_set_packing(png_ptr); /* That should have handled all (both) the transforms. */ @@ -2250,7 +2268,7 @@ png_image_write_main(png_voidp argument) png_const_bytep row = png_voidcast(png_const_bytep, display->buffer); ptrdiff_t row_bytes = display->row_stride; - if (linear) + if (linear != 0) row_bytes *= (sizeof (png_uint_16)); if (row_bytes < 0) @@ -2276,14 +2294,15 @@ png_image_write_main(png_voidp argument) * before it is written. This only applies when the input is 16-bit and * either there is an alpha channel or it is converted to 8-bit. */ - if ((linear && alpha) || (!colormap && display->convert_to_8bit)) + if ((linear != 0 && alpha != 0 ) || + (colormap == 0 && display->convert_to_8bit != 0)) { png_bytep row = png_voidcast(png_bytep, png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr))); int result; display->local_row = row; - if (write_16bit) + if (write_16bit != 0) result = png_safe_execute(image, png_write_image_16bit, display); else result = png_safe_execute(image, png_write_image_8bit, display); @@ -2292,7 +2311,7 @@ png_image_write_main(png_voidp argument) png_free(png_ptr, row); /* Skip the 'write_end' on error: */ - if (!result) + if (result == 0) return 0; } @@ -2325,7 +2344,7 @@ png_image_write_to_stdio(png_imagep image, FILE *file, int convert_to_8bit, { if (file != NULL) { - if (png_image_write_init(image)) + if (png_image_write_init(image) != 0) { png_image_write_control display; int result; @@ -2380,7 +2399,7 @@ png_image_write_to_file(png_imagep image, const char *file_name, if (fp != NULL) { if (png_image_write_to_stdio(image, fp, convert_to_8bit, buffer, - row_stride, colormap)) + row_stride, colormap) != 0) { int error; /* from fflush/fclose */ @@ -2431,6 +2450,6 @@ png_image_write_to_file(png_imagep image, const char *file_name, else return 0; } -#endif /* PNG_STDIO_SUPPORTED */ +#endif /* STDIO */ #endif /* SIMPLIFIED_WRITE */ -#endif /* PNG_WRITE_SUPPORTED */ +#endif /* WRITE */ diff --git a/lib/libpng/pngwtran.c b/lib/libpng/pngwtran.c index 215bd68a9d..09562a787d 100644 --- a/lib/libpng/pngwtran.c +++ b/lib/libpng/pngwtran.c @@ -1,7 +1,7 @@ /* pngwtran.c - transforms the data in a row for PNG writers * - * Last changed in libpng 1.6.9 [February 6, 2014] + * Last changed in libpng 1.6.15 [November 20, 2014] * Copyright (c) 1998-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -177,7 +177,7 @@ png_do_shift(png_row_infop row_info, png_bytep row, int shift_start[4], shift_dec[4]; int channels = 0; - if (row_info->color_type & PNG_COLOR_MASK_COLOR) + if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0) { shift_start[channels] = row_info->bit_depth - bit_depth->red; shift_dec[channels] = bit_depth->red; @@ -199,7 +199,7 @@ png_do_shift(png_row_infop row_info, png_bytep row, channels++; } - if (row_info->color_type & PNG_COLOR_MASK_ALPHA) + if ((row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0) { shift_start[channels] = row_info->bit_depth - bit_depth->alpha; shift_dec[channels] = bit_depth->alpha; @@ -353,7 +353,7 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) *(dp++) = save[1]; } } -#endif /* PNG_WRITE_16BIT_SUPPORTED */ +#endif /* WRITE_16BIT */ } else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) @@ -392,7 +392,7 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) *(dp++) = save[1]; } } -#endif /* PNG_WRITE_16BIT_SUPPORTED */ +#endif /* WRITE_16BIT */ } } } @@ -449,7 +449,7 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row) *(dp++) = (png_byte)(255 - *(sp++)); } } -#endif /* PNG_WRITE_16BIT_SUPPORTED */ +#endif /* WRITE_16BIT */ } else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) @@ -487,7 +487,7 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row) *(dp++) = (png_byte)(255 - *(sp++)); } } -#endif /* PNG_WRITE_16BIT_SUPPORTED */ +#endif /* WRITE_16BIT */ } } } @@ -505,7 +505,7 @@ png_do_write_transformations(png_structrp png_ptr, png_row_infop row_info) return; #ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED - if (png_ptr->transformations & PNG_USER_TRANSFORM) + if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0) if (png_ptr->write_user_transform_fn != NULL) (*(png_ptr->write_user_transform_fn)) /* User write transform function */ @@ -521,52 +521,54 @@ png_do_write_transformations(png_structrp png_ptr, png_row_infop row_info) #endif #ifdef PNG_WRITE_FILLER_SUPPORTED - if (png_ptr->transformations & PNG_FILLER) + if ((png_ptr->transformations & PNG_FILLER) != 0) png_do_strip_channel(row_info, png_ptr->row_buf + 1, !(png_ptr->flags & PNG_FLAG_FILLER_AFTER)); #endif #ifdef PNG_WRITE_PACKSWAP_SUPPORTED - if (png_ptr->transformations & PNG_PACKSWAP) + if ((png_ptr->transformations & PNG_PACKSWAP) != 0) png_do_packswap(row_info, png_ptr->row_buf + 1); #endif #ifdef PNG_WRITE_PACK_SUPPORTED - if (png_ptr->transformations & PNG_PACK) + if ((png_ptr->transformations & PNG_PACK) != 0) png_do_pack(row_info, png_ptr->row_buf + 1, (png_uint_32)png_ptr->bit_depth); #endif #ifdef PNG_WRITE_SWAP_SUPPORTED - if (png_ptr->transformations & PNG_SWAP_BYTES) +# ifdef PNG_16BIT_SUPPORTED + if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0) png_do_swap(row_info, png_ptr->row_buf + 1); +# endif #endif #ifdef PNG_WRITE_SHIFT_SUPPORTED - if (png_ptr->transformations & PNG_SHIFT) + if ((png_ptr->transformations & PNG_SHIFT) != 0) png_do_shift(row_info, png_ptr->row_buf + 1, &(png_ptr->shift)); #endif #ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED - if (png_ptr->transformations & PNG_SWAP_ALPHA) + if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0) png_do_write_swap_alpha(row_info, png_ptr->row_buf + 1); #endif #ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED - if (png_ptr->transformations & PNG_INVERT_ALPHA) + if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0) png_do_write_invert_alpha(row_info, png_ptr->row_buf + 1); #endif #ifdef PNG_WRITE_BGR_SUPPORTED - if (png_ptr->transformations & PNG_BGR) + if ((png_ptr->transformations & PNG_BGR) != 0) png_do_bgr(row_info, png_ptr->row_buf + 1); #endif #ifdef PNG_WRITE_INVERT_SUPPORTED - if (png_ptr->transformations & PNG_INVERT_MONO) + if ((png_ptr->transformations & PNG_INVERT_MONO) != 0) png_do_invert(row_info, png_ptr->row_buf + 1); #endif } -#endif /* PNG_WRITE_TRANSFORMS_SUPPORTED */ -#endif /* PNG_WRITE_SUPPORTED */ +#endif /* WRITE_TRANSFORMS */ +#endif /* WRITE */ diff --git a/lib/libpng/pngwutil.c b/lib/libpng/pngwutil.c index 755bbdb28f..10c1edffaf 100644 --- a/lib/libpng/pngwutil.c +++ b/lib/libpng/pngwutil.c @@ -1,8 +1,8 @@ /* pngwutil.c - utilities to write a PNG file * - * Last changed in libpng 1.6.2 [April 25, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson + * Last changed in libpng 1.6.15 [November 20, 2014] + * Copyright (c) 1998-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -136,7 +136,7 @@ png_write_chunk_data(png_structrp png_ptr, png_const_bytep data, png_write_data(png_ptr, data, length); /* Update the CRC after writing the data, - * in case that the user I/O routine alters it. + * in case the user I/O routine alters it. */ png_calculate_crc(png_ptr, data, length); } @@ -181,7 +181,7 @@ png_write_complete_chunk(png_structrp png_ptr, png_uint_32 chunk_name, /* On 64 bit architectures 'length' may not fit in a png_uint_32. */ if (length > PNG_UINT_31_MAX) - png_error(png_ptr, "length exceeds PNG maxima"); + png_error(png_ptr, "length exceeds PNG maximum"); png_write_chunk_header(png_ptr, chunk_name, (png_uint_32)length); png_write_chunk_data(png_ptr, data, length); @@ -204,14 +204,14 @@ png_write_chunk(png_structrp png_ptr, png_const_bytep chunk_string, static png_alloc_size_t png_image_size(png_structrp png_ptr) { - /* Only return sizes up to the maximum of a png_uint_32, do this by limiting + /* Only return sizes up to the maximum of a png_uint_32; do this by limiting * the width and height used to 15 bits. */ png_uint_32 h = png_ptr->height; if (png_ptr->rowbytes < 32768 && h < 32768) { - if (png_ptr->interlaced) + if (png_ptr->interlaced != 0) { /* Interlacing makes the image larger because of the replication of * both the filter byte and the padding to a byte boundary. @@ -286,9 +286,7 @@ optimize_cmf(png_bytep data, png_alloc_size_t data_size) } } } -#else -# define optimize_cmf(dp,dl) ((void)0) -#endif /* PNG_WRITE_OPTIMIZE_CMF_SUPPORTED */ +#endif /* WRITE_OPTIMIZE_CMF */ /* Initialize the compressor for the appropriate type of compression. */ static int @@ -297,6 +295,7 @@ png_deflate_claim(png_structrp png_ptr, png_uint_32 owner, { if (png_ptr->zowner != 0) { +#if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_ERROR_TEXT_SUPPORTED) char msg[64]; PNG_STRING_FROM_CHUNK(msg, owner); @@ -308,7 +307,8 @@ png_deflate_claim(png_structrp png_ptr, png_uint_32 owner, * are minimal. */ (void)png_safecat(msg, (sizeof msg), 10, " using zstream"); -# if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC +#endif +#if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC png_warning(png_ptr, msg); /* Attempt sane error recovery */ @@ -319,9 +319,9 @@ png_deflate_claim(png_structrp png_ptr, png_uint_32 owner, } png_ptr->zowner = 0; -# else +#else png_error(png_ptr, msg); -# endif +#endif } { @@ -334,7 +334,7 @@ png_deflate_claim(png_structrp png_ptr, png_uint_32 owner, if (owner == png_IDAT) { - if (png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_STRATEGY) + if ((png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_STRATEGY) != 0) strategy = png_ptr->zlib_strategy; else if (png_ptr->do_filter != PNG_FILTER_NONE) @@ -346,20 +346,20 @@ png_deflate_claim(png_structrp png_ptr, png_uint_32 owner, else { -# ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED +#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED level = png_ptr->zlib_text_level; method = png_ptr->zlib_text_method; windowBits = png_ptr->zlib_text_window_bits; memLevel = png_ptr->zlib_text_mem_level; strategy = png_ptr->zlib_text_strategy; -# else +#else /* If customization is not supported the values all come from the * IDAT values except for the strategy, which is fixed to the * default. (This is the pre-1.6.0 behavior too, although it was * implemented in a very different way.) */ strategy = Z_DEFAULT_STRATEGY; -# endif +#endif } /* Adjust 'windowBits' down if larger than 'data_size'; to stop this @@ -386,7 +386,7 @@ png_deflate_claim(png_structrp png_ptr, png_uint_32 owner, } /* Check against the previous initialized values, if any. */ - if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) && + if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) != 0 && (png_ptr->zlib_set_level != level || png_ptr->zlib_set_method != method || png_ptr->zlib_set_window_bits != windowBits || @@ -410,7 +410,7 @@ png_deflate_claim(png_structrp png_ptr, png_uint_32 owner, /* Now initialize if required, setting the new parameters, otherwise just * to a simple reset to the previous parameters. */ - if (png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) + if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) != 0) ret = deflateReset(&png_ptr->zstream); else @@ -492,7 +492,7 @@ png_text_compress(png_structrp png_ptr, png_uint_32 chunk_name, int ret; /* To find the length of the output it is necessary to first compress the - * input, the result is buffered rather than using the two-pass algorithm + * input. The result is buffered rather than using the two-pass algorithm * that is used on the inflate side; deflate is assumed to be slower and a * PNG writer is assumed to have more memory available than a PNG reader. * @@ -589,7 +589,7 @@ png_text_compress(png_structrp png_ptr, png_uint_32 chunk_name, } while (ret == Z_OK); - /* There may be some space left in the last output buffer, this needs to + /* There may be some space left in the last output buffer. This needs to * be subtracted from output_len. */ output_len -= png_ptr->zstream.avail_out; @@ -612,14 +612,15 @@ png_text_compress(png_structrp png_ptr, png_uint_32 chunk_name, /* Reset zlib for another zTXt/iTXt or image data */ png_ptr->zowner = 0; - /* The only success case is Z_STREAM_END, input_len must be 0, if not this + /* The only success case is Z_STREAM_END, input_len must be 0; if not this * is an internal error. */ if (ret == Z_STREAM_END && input_len == 0) { +#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED /* Fix up the deflate header, if required */ optimize_cmf(comp->output, comp->input_len); - +#endif /* But Z_OK is returned, not Z_STREAM_END; this allows the claim * function above to return Z_STREAM_END on an error (though it never * does in the current versions of zlib.) @@ -662,7 +663,7 @@ png_write_compressed_data_out(png_structrp png_ptr, compression_state *comp) if (output_len > 0) png_error(png_ptr, "error writing ancillary chunked compressed data"); } -#endif /* PNG_WRITE_COMPRESSED_TEXT_SUPPORTED */ +#endif /* WRITE_COMPRESSED_TEXT */ #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) @@ -699,7 +700,7 @@ png_check_keyword(png_structrp png_ptr, png_const_charp key, png_bytep new_key) if ((ch > 32 && ch <= 126) || (ch >= 161 /*&& ch <= 255*/)) *new_key++ = ch, ++key_len, space = 0; - else if (!space) + else if (space == 0) { /* A space or an invalid character when one wasn't seen immediately * before; output just a space. @@ -711,14 +712,14 @@ png_check_keyword(png_structrp png_ptr, png_const_charp key, png_bytep new_key) bad_character = ch; } - else if (!bad_character) + else if (bad_character == 0) bad_character = ch; /* just skip it, record the first error */ } - if (key_len > 0 && space) /* trailing space */ + if (key_len > 0 && space != 0) /* trailing space */ { --key_len, --new_key; - if (!bad_character) + if (bad_character == 0) bad_character = 32; } @@ -728,11 +729,12 @@ png_check_keyword(png_structrp png_ptr, png_const_charp key, png_bytep new_key) if (key_len == 0) return 0; +#ifdef PNG_WARNINGS_SUPPORTED /* Try to only output one warning per keyword: */ - if (*key) /* keyword too long */ + if (*key != 0) /* keyword too long */ png_warning(png_ptr, "keyword truncated"); - else if (bad_character) + else if (bad_character != 0) { PNG_WARNING_PARAMETERS(p) @@ -741,10 +743,11 @@ png_check_keyword(png_structrp png_ptr, png_const_charp key, png_bytep new_key) png_formatted_warning(png_ptr, p, "keyword \"@1\": bad character '0x@2'"); } +#endif /* WARNINGS */ return key_len; } -#endif +#endif /* WRITE_TEXT || WRITE_pCAL || WRITE_iCCP || WRITE_sPLT */ /* Write the IHDR chunk, and update the png_struct with the necessary * information. Note that the rest of this code depends upon this @@ -845,8 +848,8 @@ png_write_IHDR(png_structrp png_ptr, png_uint_32 width, png_uint_32 height, */ if ( #ifdef PNG_MNG_FEATURES_SUPPORTED - !((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && - ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) && + !((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 && + ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) == 0) && (color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_RGB_ALPHA) && (filter_type == PNG_INTRAPIXEL_DIFFERENCING)) && @@ -898,7 +901,7 @@ png_write_IHDR(png_structrp png_ptr, png_uint_32 width, png_uint_32 height, /* Write the chunk */ png_write_complete_chunk(png_ptr, png_IHDR, buf, (png_size_t)13); - if (!(png_ptr->do_filter)) + if ((png_ptr->do_filter) == PNG_NO_FILTERS) { if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE || png_ptr->bit_depth < 8) @@ -927,7 +930,7 @@ png_write_PLTE(png_structrp png_ptr, png_const_colorp palette, if (( #ifdef PNG_MNG_FEATURES_SUPPORTED - !(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) && + (png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0 && #endif num_pal == 0) || num_pal > 256) { @@ -943,7 +946,7 @@ png_write_PLTE(png_structrp png_ptr, png_const_colorp palette, } } - if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR)) + if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0) { png_warning(png_ptr, "Ignoring request to write a PLTE chunk in grayscale PNG"); @@ -998,7 +1001,7 @@ png_write_PLTE(png_structrp png_ptr, png_const_colorp palette, * Z_FINISH: this is the end of the input, do a Z_FINISH and clean up * * The routine manages the acquire and release of the png_ptr->zstream by - * checking and (at the end) clearing png_ptr->zowner, it does some sanity + * checking and (at the end) clearing png_ptr->zowner; it does some sanity * checks on the 'mode' flags while doing this. */ void /* PRIVATE */ @@ -1058,7 +1061,7 @@ png_compress_IDAT(png_structrp png_ptr, png_const_bytep input, input_len += png_ptr->zstream.avail_in; png_ptr->zstream.avail_in = 0; - /* OUTPUT: write complete IDAT chunks when avail_out drops to zero, note + /* OUTPUT: write complete IDAT chunks when avail_out drops to zero. Note * that these two zstream fields are preserved across the calls, therefore * there is no need to set these up on entry to the loop. */ @@ -1070,11 +1073,11 @@ png_compress_IDAT(png_structrp png_ptr, png_const_bytep input, /* Write an IDAT containing the data then reset the buffer. The * first IDAT may need deflate header optimization. */ -# ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED - if (!(png_ptr->mode & PNG_HAVE_IDAT) && - png_ptr->compression_type == PNG_COMPRESSION_TYPE_BASE) +#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED + if ((png_ptr->mode & PNG_HAVE_IDAT) == 0 && + png_ptr->compression_type == PNG_COMPRESSION_TYPE_BASE) optimize_cmf(data, png_image_size(png_ptr)); -# endif +#endif png_write_complete_chunk(png_ptr, png_IDAT, data, size); png_ptr->mode |= PNG_HAVE_IDAT; @@ -1090,7 +1093,7 @@ png_compress_IDAT(png_structrp png_ptr, png_const_bytep input, continue; } - /* The order of these checks doesn't matter much; it just effect which + /* The order of these checks doesn't matter much; it just affects which * possible error might be detected if multiple things go wrong at once. */ if (ret == Z_OK) /* most likely return code! */ @@ -1116,11 +1119,11 @@ png_compress_IDAT(png_structrp png_ptr, png_const_bytep input, png_bytep data = png_ptr->zbuffer_list->output; uInt size = png_ptr->zbuffer_size - png_ptr->zstream.avail_out; -# ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED - if (!(png_ptr->mode & PNG_HAVE_IDAT) && - png_ptr->compression_type == PNG_COMPRESSION_TYPE_BASE) - optimize_cmf(data, png_image_size(png_ptr)); -# endif +#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED + if ((png_ptr->mode & PNG_HAVE_IDAT) == 0 && + png_ptr->compression_type == PNG_COMPRESSION_TYPE_BASE) + optimize_cmf(data, png_image_size(png_ptr)); +#endif png_write_complete_chunk(png_ptr, png_IDAT, data, size); png_ptr->zstream.avail_out = 0; @@ -1193,6 +1196,7 @@ png_write_iCCP(png_structrp png_ptr, png_const_charp name, png_uint_32 profile_len; png_byte new_name[81]; /* 1 byte for the compression byte */ compression_state comp; + png_uint_32 temp; png_debug(1, "in png_write_iCCP"); @@ -1207,7 +1211,8 @@ png_write_iCCP(png_structrp png_ptr, png_const_charp name, if (profile_len < 132) png_error(png_ptr, "ICC profile too short"); - if (profile_len & 0x03) + temp = (png_uint_32) (*(profile+8)); + if (temp > 3 && (profile_len & 0x03)) png_error(png_ptr, "ICC profile length invalid (not a multiple of 4)"); { @@ -1339,7 +1344,7 @@ png_write_sBIT(png_structrp png_ptr, png_const_color_8p sbit, int color_type) png_debug(1, "in png_write_sBIT"); /* Make sure we don't depend upon the order of PNG_COLOR_8 */ - if (color_type & PNG_COLOR_MASK_COLOR) + if ((color_type & PNG_COLOR_MASK_COLOR) != 0) { png_byte maxbits; @@ -1372,7 +1377,7 @@ png_write_sBIT(png_structrp png_ptr, png_const_color_8p sbit, int color_type) size = 1; } - if (color_type & PNG_COLOR_MASK_ALPHA) + if ((color_type & PNG_COLOR_MASK_ALPHA) != 0) { if (sbit->alpha == 0 || sbit->alpha > png_ptr->usr_bit_depth) { @@ -1459,9 +1464,9 @@ png_write_tRNS(png_structrp png_ptr, png_const_bytep trans_alpha, png_save_uint_16(buf + 2, tran->green); png_save_uint_16(buf + 4, tran->blue); #ifdef PNG_WRITE_16BIT_SUPPORTED - if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) + if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4]) != 0) #else - if (buf[0] | buf[2] | buf[4]) + if ((buf[0] | buf[2] | buf[4]) != 0) #endif { png_app_warning(png_ptr, @@ -1492,8 +1497,8 @@ png_write_bKGD(png_structrp png_ptr, png_const_color_16p back, int color_type) { if ( #ifdef PNG_MNG_FEATURES_SUPPORTED - (png_ptr->num_palette || - (!(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE))) && + (png_ptr->num_palette != 0 || + (png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0) && #endif back->index >= png_ptr->num_palette) { @@ -1505,15 +1510,15 @@ png_write_bKGD(png_structrp png_ptr, png_const_color_16p back, int color_type) png_write_complete_chunk(png_ptr, png_bKGD, buf, (png_size_t)1); } - else if (color_type & PNG_COLOR_MASK_COLOR) + else if ((color_type & PNG_COLOR_MASK_COLOR) != 0) { png_save_uint_16(buf, back->red); png_save_uint_16(buf + 2, back->green); png_save_uint_16(buf + 4, back->blue); #ifdef PNG_WRITE_16BIT_SUPPORTED - if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) + if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4]) != 0) #else - if (buf[0] | buf[2] | buf[4]) + if ((buf[0] | buf[2] | buf[4]) != 0) #endif { png_warning(png_ptr, @@ -1608,7 +1613,7 @@ png_write_tEXt(png_structrp png_ptr, png_const_charp key, png_const_charp text, */ png_write_chunk_data(png_ptr, new_key, key_len + 1); - if (text_len) + if (text_len != 0) png_write_chunk_data(png_ptr, (png_const_bytep)text, text_len); png_write_chunk_end(png_ptr); @@ -1619,14 +1624,13 @@ png_write_tEXt(png_structrp png_ptr, png_const_charp key, png_const_charp text, /* Write a compressed text chunk */ void /* PRIVATE */ png_write_zTXt(png_structrp png_ptr, png_const_charp key, png_const_charp text, - png_size_t text_len, int compression) + int compression) { png_uint_32 key_len; png_byte new_key[81]; compression_state comp; png_debug(1, "in png_write_zTXt"); - PNG_UNUSED(text_len) /* Always use strlen */ if (compression == PNG_TEXT_COMPRESSION_NONE) { @@ -1734,7 +1738,7 @@ png_write_iTXt(png_structrp png_ptr, int compression, png_const_charp key, png_text_compress_init(&comp, (png_const_bytep)text, strlen(text)); - if (compression) + if (compression != 0) { if (png_text_compress(png_ptr, png_iTXt, &comp, prefix_len) != Z_OK) png_error(png_ptr, png_ptr->zstream.msg); @@ -1757,7 +1761,7 @@ png_write_iTXt(png_structrp png_ptr, int compression, png_const_charp key, png_write_chunk_data(png_ptr, (png_const_bytep)lang_key, lang_key_len); - if (compression) + if (compression != 0) png_write_compressed_data_out(png_ptr, &comp); else @@ -1981,12 +1985,13 @@ png_write_start_row(png_structrp png_ptr) } /* We only need to keep the previous row if we are using one of these. */ - if (png_ptr->do_filter & (PNG_FILTER_AVG | PNG_FILTER_UP | PNG_FILTER_PAETH)) + if ((png_ptr->do_filter & + (PNG_FILTER_AVG | PNG_FILTER_UP | PNG_FILTER_PAETH)) != 0) { /* Set up previous row buffer */ png_ptr->prev_row = (png_bytep)png_calloc(png_ptr, buf_size); - if (png_ptr->do_filter & PNG_FILTER_UP) + if ((png_ptr->do_filter & PNG_FILTER_UP) != 0) { png_ptr->up_row = (png_bytep)png_malloc(png_ptr, png_ptr->rowbytes + 1); @@ -1994,7 +1999,7 @@ png_write_start_row(png_structrp png_ptr) png_ptr->up_row[0] = PNG_FILTER_VALUE_UP; } - if (png_ptr->do_filter & PNG_FILTER_AVG) + if ((png_ptr->do_filter & PNG_FILTER_AVG) != 0) { png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, png_ptr->rowbytes + 1); @@ -2002,7 +2007,7 @@ png_write_start_row(png_structrp png_ptr) png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG; } - if (png_ptr->do_filter & PNG_FILTER_PAETH) + if ((png_ptr->do_filter & PNG_FILTER_PAETH) != 0) { png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr, png_ptr->rowbytes + 1); @@ -2010,13 +2015,13 @@ png_write_start_row(png_structrp png_ptr) png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH; } } -#endif /* PNG_WRITE_FILTER_SUPPORTED */ +#endif /* WRITE_FILTER */ #ifdef PNG_WRITE_INTERLACING_SUPPORTED /* If interlaced, we need to set up width and height of pass */ - if (png_ptr->interlaced) + if (png_ptr->interlaced != 0) { - if (!(png_ptr->transformations & PNG_INTERLACE)) + if ((png_ptr->transformations & PNG_INTERLACE) == 0) { png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - png_pass_ystart[0]) / png_pass_yinc[0]; @@ -2071,10 +2076,10 @@ png_write_finish_row(png_structrp png_ptr) #ifdef PNG_WRITE_INTERLACING_SUPPORTED /* If interlaced, go to next pass */ - if (png_ptr->interlaced) + if (png_ptr->interlaced != 0) { png_ptr->row_number = 0; - if (png_ptr->transformations & PNG_INTERLACE) + if ((png_ptr->transformations & PNG_INTERLACE) != 0) { png_ptr->pass++; } @@ -2099,7 +2104,7 @@ png_write_finish_row(png_structrp png_ptr) png_pass_ystart[png_ptr->pass]) / png_pass_yinc[png_ptr->pass]; - if (png_ptr->transformations & PNG_INTERLACE) + if ((png_ptr->transformations & PNG_INTERLACE) != 0) break; } while (png_ptr->usr_width == 0 || png_ptr->num_rows == 0); @@ -2378,7 +2383,7 @@ png_write_find_filter(png_structrp png_ptr, png_row_infop row_info) /* We don't need to test the 'no filter' case if this is the only filter * that has been chosen, as it doesn't actually do anything to the data. */ - if ((filter_to_do & PNG_FILTER_NONE) && filter_to_do != PNG_FILTER_NONE) + if ((filter_to_do & PNG_FILTER_NONE) != 0 && filter_to_do != PNG_FILTER_NONE) { png_bytep rp; png_uint_32 sum = 0; @@ -2454,7 +2459,7 @@ png_write_find_filter(png_structrp png_ptr, png_row_infop row_info) best_row = png_ptr->sub_row; } - else if (filter_to_do & PNG_FILTER_SUB) + else if ((filter_to_do & PNG_FILTER_SUB) != 0) { png_bytep rp, dp, lp; png_uint_32 sum = 0, lmins = mins; @@ -2575,7 +2580,7 @@ png_write_find_filter(png_structrp png_ptr, png_row_infop row_info) best_row = png_ptr->up_row; } - else if (filter_to_do & PNG_FILTER_UP) + else if ((filter_to_do & PNG_FILTER_UP) != 0) { png_bytep rp, dp, pp; png_uint_32 sum = 0, lmins = mins; @@ -2689,7 +2694,7 @@ png_write_find_filter(png_structrp png_ptr, png_row_infop row_info) best_row = png_ptr->avg_row; } - else if (filter_to_do & PNG_FILTER_AVG) + else if ((filter_to_do & PNG_FILTER_AVG) != 0) { png_bytep rp, dp, pp, lp; png_uint_32 sum = 0, lmins = mins; @@ -2791,7 +2796,7 @@ png_write_find_filter(png_structrp png_ptr, png_row_infop row_info) } /* Paeth filter */ - if (filter_to_do == PNG_FILTER_PAETH) + if ((filter_to_do == PNG_FILTER_PAETH) != 0) { png_bytep rp, dp, pp, cp, lp; png_size_t i; @@ -2830,7 +2835,7 @@ png_write_find_filter(png_structrp png_ptr, png_row_infop row_info) best_row = png_ptr->paeth_row; } - else if (filter_to_do & PNG_FILTER_PAETH) + else if ((filter_to_do & PNG_FILTER_PAETH) != 0) { png_bytep rp, dp, pp, cp, lp; png_uint_32 sum = 0, lmins = mins; @@ -2900,7 +2905,7 @@ png_write_find_filter(png_structrp png_ptr, png_row_infop row_info) pc = (p + pc) < 0 ? -(p + pc) : p + pc; #endif p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; -#else /* PNG_SLOW_PAETH */ +#else /* SLOW_PAETH */ p = a + b - c; pa = abs(p - a); pb = abs(p - b); @@ -2914,7 +2919,7 @@ png_write_find_filter(png_structrp png_ptr, png_row_infop row_info) else p = c; -#endif /* PNG_SLOW_PAETH */ +#endif /* SLOW_PAETH */ v = *dp++ = (png_byte)(((int)*rp++ - p) & 0xff); @@ -2963,7 +2968,7 @@ png_write_find_filter(png_structrp png_ptr, png_row_infop row_info) best_row = png_ptr->paeth_row; } } -#endif /* PNG_WRITE_FILTER_SUPPORTED */ +#endif /* WRITE_FILTER */ /* Do the actual writing of the filtered row data from the chosen filter. */ png_write_filtered_row(png_ptr, best_row, row_info->rowbytes+1); @@ -2983,7 +2988,7 @@ png_write_find_filter(png_structrp png_ptr, png_row_infop row_info) png_ptr->prev_filters[j] = best_row[0]; } #endif -#endif /* PNG_WRITE_FILTER_SUPPORTED */ +#endif /* WRITE_FILTER */ } @@ -3019,6 +3024,6 @@ png_write_filtered_row(png_structrp png_ptr, png_bytep filtered_row, { png_write_flush(png_ptr); } -#endif +#endif /* WRITE_FLUSH */ } -#endif /* PNG_WRITE_SUPPORTED */ +#endif /* WRITE */ diff --git a/lib/minizip/ioapi.c b/lib/minizip/ioapi.c index 217eb2544d..e0ffbeb6f2 100644 --- a/lib/minizip/ioapi.c +++ b/lib/minizip/ioapi.c @@ -10,7 +10,12 @@ #include #include +#ifdef USE_INTERNAL_ZLIB #include "../zlib/zlib.h" +#else +#include +#endif + #include "ioapi.h" diff --git a/lib/minizip/unzip.cpp b/lib/minizip/unzip.cpp index 3347bc6208..3b79426be3 100644 --- a/lib/minizip/unzip.cpp +++ b/lib/minizip/unzip.cpp @@ -34,13 +34,8 @@ woven in by Terry Thorsen 1/2003. version without encryption capabilities). */ -#ifdef _JK2EXE -#include "../code/qcommon/q_shared.h" -#include "../code/qcommon/qcommon.h" -#else -#include "../codemp/qcommon/q_shared.h" -#include "../codemp/qcommon/qcommon.h" -#endif +#include "qcommon/q_shared.h" +#include "qcommon/qcommon.h" #include "unzip.h" #ifndef local diff --git a/lib/minizip/unzip.h b/lib/minizip/unzip.h index 4b090bd6e8..f8f9f29bb2 100644 --- a/lib/minizip/unzip.h +++ b/lib/minizip/unzip.h @@ -48,7 +48,12 @@ extern "C" { #endif +#ifdef USE_INTERNAL_ZLIB #include "zlib/zlib.h" +#else +#include +#endif + #include "ioapi.h" #define NOUNCRYPT diff --git a/rv-readme.txt b/rv-readme.txt new file mode 100644 index 0000000000..779675e6e3 --- /dev/null +++ b/rv-readme.txt @@ -0,0 +1,22 @@ +Activision and Raven are releasing this code for people to learn from and play with. +This code is copyright Activision 2003. This source is released under GNU GPLv2. + + +Some source code in this release is not covered by the GPL: +e.g. +zlib is Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler + + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. diff --git a/shared/icons/OpenJK_IconPSD.psd b/shared/icons/OpenJK_IconPSD.psd new file mode 100644 index 0000000000000000000000000000000000000000..2dddc1bbec2f4c3ca1bbc96719d495266d36f33d GIT binary patch literal 1672382 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

  • `h-h6h5lC%Wn~=?aVZ2tKylsWi%urtu`LL;H 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 rFHE^QOQnbg+*(pd|2mVwiNA zO?5!3=jR&WRzMmsM@muph(K6Dz~YNwJGGU$ShGSZ2xnH1cJLFjf{{g#7emJkWD*ge+Fp z*FOf1AB;pE3>?20B*ktC!W*%OYS)4V9iT?H7X5yvh2(a$pu^5ST1U+35B8-n$q7BU zMWQm}&@<}x zclK`Iv~I=Y)8UccJW^9veVMk3XC-CA-7y|yWVWy~2L8woTV{}d+Vvo8fjkoYJ7^^x zI1u5O>w#amOKGDAndP`VCeZp!zI}%icd`aclrBW_^7ek_EGi1Mr}I)3CGeP#p0ag1 zO-(-Z;fAkw?p<qpq_#wYtakL7)T2iOte{<%~HwLE4gpiG1|Z4-@bw=oH=YvMO6I;e}r0hac4A#T>!Z+vYEbRlAcHaz2q z0*ej8B5cq_6IK(5H?m$~vBNj++5E}s#WTqyc3-JScsPe88W~AB*qo0lW+QrC5u)9s zFG7f*hFcVMaNh(RBQ+!6L@V-jEJA2)f)sLyDI`s!5OINvZrRWY2%Vx3S`a7#D=9>Z zvPJ8o!mM6i;|?QE*PMY}Ske4T3JIZA4e9?~LUu9X&9xhU+`InXIKqk0hXnuIf_WCP z=!(h`d}*9xsQ63zs7H?6-<55o=U~uOS;maZ?OY#fpm6k1THC-r5Oh!L0tq<0m}?8` z89Dg%-?naCz4X!P(8~I=4cLQ%TP4NW=p4s>WISYI2Owg$=gI$g(dMI2)N8EhGUO41 z@52&CqN7#CPM(UilEk!<&bSjd6Uy13J9apWm=j;;treeye@8;3)kk89ns@M;%cu=q zJ&Xryt`vlBGLp1k=F-UWtQG4%|9SU|iBb44vR)$Ae9cTFW;(=Q%L9juwry0%V${IF zIn<4RvD{;EE8!&8rnngllVKMaw-l;I%3(cv z&f30n)9Ux0BBi`gUe|!r44|`lscHF`f2AbaNPRSJ=68H$FE`I%@+eFxoDq z|9bZiQ@cml@uH|DpdKAzx&CiCDl22|eS6Z`}3e+V@|XL3+umZK}u8pi_s*gO$>_7=;rS z)Khy&SREH`ij-J9LGVR9A+3-D1KfS-;yFsunpDr^-U@QXZ=7bZpx#z5YEb9yOXOyx z6$$Pu6a@~S7xA)KU40@41BhfR7A4usNI$fmY-QZS4?h0>_qBJ&f?-a z#eO8-W=w35YREmKZhdRlckADOV-_i8&(&tyhcip#a<$M z4aW2+EivGVF@3f8!GPds<)ol%Cq_94UyEqPjvX5M;-Q6Vo?hV*edheU?UN7QeoUSo zIql0!%}w=)_~gdY3n~y>5b)u~tg`+y_;|PA$SATG4oYD!kA(5x{`~3tOXtbcqo%!c zvZjR3jsj6)8Y1JN;Lqa>mZ5sZePn0#b&|$SR$B;>8 zmz+3znYaKCIt>p(Nj_l`lq5tzW<-l_#pMxa74b|mT~U#t4H-b*skx=4(|9=kz)WGs z7ULEjg6g|Z?9Z34T&=xStU5WUh@4zj+LvTT;}@)0_wBB?Z^LY-_&(K;Z2lH7doxoM z`BA!ifZ2dHF^HG}(P+53$e@7hrgRD z3SQ2(M2c!rR%vrZku^!-o{@tV?f7cdvV{+lyUVFJz};OwccLseDT4wL*Z~wp?rsB$ zQTkBCY@sN!QqB+P^ci>;OZy$IiTgXQsvKC8$%(h|mnT7``MCrVAz_{TodnLSj|!B$ zeeNs8jJv#MO?_{?nbL}WdVs?y@l1R3@GqK_seg03nku(z>c=(7^IY1`vVR&4nB zlc8}!TLdN^rAPoezXql+!B>zVI=Dc1BqceboV8~MJ)i+Ryk9$pWk2{PZ{_OZ?_NA# zRUM$<;M}fATN3s@qlel-TjT_75gu_vH*EXp-NkdEu1%K=hhK)HpwD9o zIYJ^8QnWQj7Y1$hOu7O;c%~qeYfHydB^I!m&|dPfZYm}2_GddLrw z0A#;c@!s~2m%Z^6wDtaZ1NlM3tkRq$T2upaLE562 z^+%NCTJiqg!x@rpV7-p<8Tp zFcfyzVG#A|<5)(_%*(E@jEwBe9g{|m9y9Lww^n}f)BFL^q%hSP@;6o*RgtmkpKj?; zVMDMC?h+l9CeBKARA~+Utpf(Or!;W`THf*2GeT+34pB{Wao$Ja)e<(k(qoDl38qk- zc-E35JfjD_x_#sFH=YA6jC#GY#n?it?oUe^_K_W3Bt9#*;V%o zR2K+)6ED&>bRf|qkdBQ~siBO_4LLhIwV}htO0GG|4h8Xm<|6yf+xq!?Z@lmTH23t8 z79;LMU%Pbra6wvH0WE67b~}Z8G|qtL0wTc%FrPt)<`I*)4QC&MC{opeC&pI1(wUHU zgY)5YdD_(OYz2S(sU2hc7h$`A*kskZX-hO^7DW+X4&ZL#CEcLST)QgscW_&|# za_WM&Kltw3$=##aSCZ;@SmUZgMuUq-jZAsm?gZNr>|RSn{+jY?`rnK)MqAy{DO2dK z0Xy3y`B$bp&g`9CB^{9=p>nGuW5B)zKZA0FjjWFAj+itYN`x)aqvwO)f3@QE`5^gG z50*5yQhdXPpvfK2o6S zHg)U;R=7>7qytqMMjC=@B<yzmhY&_tEgQa&DE$dl2nL$ zEjg*Hpu({aFL-O+wq<{h!!aH$(o`Md5*`jIHnEK`>d9kA9U>Y5H9SN3Yi_ihMh%VFZ?N;W5kkk{gLsH9;co^u0#=!B$=?pcp9pC~5GnHQ#@@_?6kx^sXt;prH|a z^iQH#l2vlz9PJXeYq07r*}Ich2sUuRE)@CjK&T7WDN3X&v8qHFZ9_;15DKx&U7yb^ zvBVwBE{(}nSqy2LBU5~0QzqMy%QzKW)m@*IsC=^2u#F=aWOXL@wOo9ni` zIw*#HCikVHP%5StFqiAo$kfOaN|B%NqfumvyeRp9szxl?wVUD_^MeD!X=s^3A!X#M zC*?FoHAJdzNWM75s=!XDk$Y2wGo-&BF@JyW$5o48MsnWuU?cYZH`QOmXjyJ@CdU2Q znOR|oEe}Yzg%uSOV^ze%DNOYz^(V;=9d$p%S?%Bu?(S~4e5|U!w;-UjV zW_(v(g$^&2;GmrY)Kie5=j0|YAtlaP`1VIXK6f*{2y$CgGaV|VQX0YLF430L z%Eqi!d*nfp(;9K0^#3nK?s@aY(7-T9KFU2R=QNJ?h+%NwW*lPW3k~oqlot!$S;!O_ zeao9au6k`gDe}(-Gwxb|*Hl*Ir(lB|+f&UGL4-x=P01Uq6o%noj>P`C3va7RkqnY5 z3z;fQ?LL*Ok}`K~V5CwD4^ncNF5E2~Z^(A9>J}H}4`l{@ca`$@Lfou%Rwk|(CBF&3 zI)3iLC7=B8L_fasfG6?1#vq<9h}~EaYK&Mh&l~r7nMVzfItC+RIHLUWf8<=bRT_w* z{{EJ#OlRlX)+&kh)1eRC(PrPQ&N88x#7e$2x9<_1`11Fw7QOJOG(F+BdMFfUTv(Qo zUWmnq)grTpLggQVWN#2viD{HdQ)-M+&Ewh485H?uWg zJjoHB-I?$F->H*ryoNf@;bu0ebMIR(h6~%Yxp1;t+e8>(5HzC6k3&$X69k2&Wt4Y7 zol!SEw;Aeu4C?%~0mr*qaFqw^-qX{lVC|sJj5x_#7hwfMrf|t?ceYTSh9lEID)dR? zE!;kdxEl0D%sxqLR$6@cCI=oIW-Z$w#lOYv@Ec=Acm)F-fEO$%{tc zKW@U@7vJ9a-2=VYw`!3`)Q2cGQ3=}aBzv<9@GNhIe_`H%+$|5)g2Mi*^-qs}@lW;!i*p;O7*W=|$n zpR3v^u@MQRQXfm{Z0b^NPf~ngwF|c=fC;sSCe|+JB5)FS<^lj z)5te1nQLT=2!xUHN(2wx_;pHFscQ5uJtkH6@87;kud>VbGWL{42ZScrlS-jd{L@MS zRjAa)x^_sV&E97F_5>#)i+wcgN0c4gSdaigG1cD&KO~z(izY6(%jFh!|Z* zuQzBIX0N#&(JPjv##~RY!f1H%N1RjgY4SEHdIjladR4tIe>U*w^XPYLUw!7$8S?am z-3=Bn-9|dwRGgWdTYl<-gJPQ}f$4_EV8gqU5ePiFGFG0i;G~kG*TW70Rg_$v^{O&X zInoU)leq(y6?2_gb&a}?T<8^NRtr)V!CWVjxo*1Ou2*gBS3NN4)r`B-BqUyXA|K4( zEh((F)hs=GC>DFeR&YhLiS1eJ@pFpBVrOfD&}=+=@}T5}YOu~um|H9rwaqw8YQqH~ zzVk%YuIh-1Sb9eHn)S`<1y4Ju_sThYSqNo4a>dMU&2zzjLukg^ZVT8Lh$EQ1jOc8* zqBctk<`K4(87?W9M_7@}@V6@)x|CJJRTWH(iF;!y4pGnB-{-|@sP|&2gL+wQhz`LP zq%6kGx`~fJ|K`TeMt9>o)dU%6YqlgOo0kFm`Lzn>F8TjV!Gl~Y7za6og0Vdo3hv5W zay%}g%dwrXo?g9BEF`R&u8bY9MlU)n(4K<1`Fck8eDJGPuRO&Ryr+@ux2cX4oRyS| z?3gyx+Z8M=hJvxFUa?;awz_bYhKsTh&sLGND8+YG!DURrNB**cbx}NPlw+-mir=ip z3cvGo4Mq*PqIQ&5koGn>@x;fTePiRsk=?r_6rUH|I-f4`xQvC7s#$F6Rc>)3}2BPJaKn)Zc<^x;Uw6*fg-jTgRc(fxbQ zBqcvG0}ZXXKbvC3@_KMeeGteEw++&AC*`Uyj1C{51)0z??f)S& zCO^%!eAKRGsWbjpO@+68Gp61^S`iT%9~+9h?Y{3-U#+e=TjZc+rL=@&)fr1k%a1<& z+J+4yy4k;$`upg?oPR5)%9KgaQe>-FGt)A;YU<+VK^W1;g{u}?MvIz@wq9)ea@Yf} zxayl-YB>{@eD-R+fm+kCTenw02(x4=GdXiBdnKm=RHhHPHKjd=>+FFMak!`(5(r(lDDGjqYsScO6I(o8#1R@>OW7D3uMS@Zc8dI zXND|Ptfg4IR^eL3)Ci@Ec0<9EcHA%}`}p{-B_*FObWm~>uOH&HSLVtwXkBTZyz83jd0yHm5%!6q&gG&&RK(7yAx+W zwQ&805zx2lgVfRs#Tl)>E!aiTiu>@i!iJLsLBgCZyA!x4f+zFeoP?D?J#!STW4b1#z`k*|c`}DF_q4?u=#p5B6 z%$+H|vah0e?%-+O^slM?2($JRinUWb=ah|?Oo%RNgQ&K;NNU%`>e#foJ~jl_9{Nj7 zHP%((?6ZcO+gV#t!S|&22OgWhYU8*bnyoqfgSEU(HFpvnZUB3b&4|Jr=Wmp1YrXuP zF0|i6(f*>Jam}_7k2i;lvavuv-`Jya-QJj$?k=`2>`sbL8-TD_q@f0mJM+A zhyPCMKS@Wm)znN?f8lmg|BTtsuG}<%)K4Ew7kY&H9ZP)lbWOW*E#RLfCOh)@7!p+I zyQBIM<5^gb;tLINvV3({5{bK_Z^nb?<^`E=^VD60v-uhGA) z>K1yYvg_YXDGWIJec_5o|050QX!#ux`s?Xm7f0{8iUatwrlz*$1g<42 z9Rc)Wr82zY-GqSYv!7nJX=+b0AL69kWvKyQEfxs~Sm8Wd83fc6gCdbD2#BEX2LCU2 zqYREO0efcAPbSoz(RPhv=_$DM=j;O5CaU%zz)pFwMg6psd$3CgbYYn?RjN4zgw#2! z25Iqt6L4?=y!DR{_BgqK*qfjK{EfK}N;A5@dkI%4K=^oNRSEq90(hykRsWqJ5RDZ? z5T`C$+d|~XJApdp0t5uq(0`1%fK$u`h|vF6AYhBr5d`8wDF*DVsdj*X?GVme*^|1G z{nG$}X|tbRx@l%_M+j&^OUXMA0^|j_2Q@PBwGRQOg5|FO0&ztAs3NC&0dEBYAt4xufEOSLz{0jg=rF`Z)*U;1?6Bi0$+KduG>P@4k+j-n@zlRpIkcnAXm{=pC+wK1rU>i@W+ zf9?Xb96*&eFPQ+^ZAvE8V5N%}`VaZFwx+iF1O)+VkEQlJiMQvWpCqrSG<6>IKV{~; zC7(amPaG0dgO*5*o%K&1)WCMy@u0+=lA{Z_k^Y}vxQ*WX&tj`8?rGuHKwB4pja>bQ zxsC$tt7_+X4>6^qt^lh+TnE(38+bjswKn(JYwSp zE&Axi*$+rF`hH(;B^1Dgoxz|F_Je4sfPw-aZ*RY7ya7-H6TJecp0zCy_$R43fQ8lX zI1nmzYAg_Bu%kdgt42H+f{%aTuG*TKYE39`!a?RD;9&Cf#}|J-?d#p_khBu;8a9gcJ>K>dssN`GThw{D@wGbJ%;HkHfyWNn;9fBSW?!0!lP0s9?ou|TATenwkDh}S9>gDoEBE_5PPg#yn71u3Lz6(@z<9dwC} zyX~E|^JiOU^xe~}AOWo_g&D~?s5>d75Tgy;ANcqPBoN8!7!HUN3Qll>IfTfZe8QUWuJh+ZSV&*CyR2knLl6+*Ajmr$D0fsLhgG2!lbDWz4Gbv0~mPK zHdtOPQ>zwgI~;97BWt1)@+3m+<#K_9PGRBbl0su8M*_l4{2(PSRFUw?_gF(!d9MKYCW|NWg-!>mWgFiZ5FUBm_A}1!p7>HKb`)+IGQ_VD&I{F)K)*+8@FN zD!s(Gs4Bo8yHq4l%T<^7f4{%_xre4nGvZPWRx0VktyNYOV4oRwZct%>kGTL09yR{} z7W`x4@jwbFDxzGKya8g>xFd-2T^ntBvIrE+?DZ%3=eci7li_<2iofd>h+5!U;4J{d?jvGQ zVqycW&T9t{xE5tUC2{0~1^;dj5d2ZVH6SE72pdjFT@MtF;eyKUUAm22zjV&jDe{c? z$4+9#o=|b^!bxlzNyY0f6^%8hs7jQ5ItKt1am3`6w9FY7YE~;;mv9rDJe*=~;;bfU zv?ULewzcvg&$UxN!A#zq>!VNtr9U@`f@XFmAgt^{W{p%Mr+ zmn1OrDQAm^QL!&qxbO%G#ncJHh8!8@$RAW((B;C%pWAfuXgOe!m7YR3?P>p*11_wI z%>!CcRCGZhQj$^`F4SWI?c##BKDojLQ8zlBiz`BK7PReI1P?W<;K744N}>^j3y-)S z6F0mudlG=5Uwl!vMwyMxsElAILuwiW27mTf+{J~PWuH!gv5+wJ#q)Gs#YNi!H-$7& zVB%!Ls28}P@S$dxL?%>HsTLRr$>iSfuP7BA!iBA?KE@}=$Jh7O`r6vMGo=C-IPrUk zR~V>)vY@0qX&P`baoQ8_t-G%~FVJ!ZL?6u)O#aa#!BBBw^)TS%mC;`Fb|e&Dn8CFp zgNA-lXx79J?l9OX)<>TH;N*3f7rgq=;AWZ zK-^<5w%|pb&1@GeM}}H;BKs4xLJcDv8NFw1STJkCG`NiQH4;@Fn$Zt}hq07&+6_q$ zi)tXL?2SMY3}hhnQzk#Pp+toSu^kagI5gByQpsG#Ik*fn8f$T)RC!wz%z~&rC7zCz z9u*pV!=_uTA6$n2lXZ2qb!SUqlA7`(Jv%7S$eB;jnE1$B8^-nEa~>+w)P@r7=hRR_ zyQdLI=o%Ue%aE|0UAP4VLZ00OI3gmP$%X1Q7&sn!a$QMb9@WQ_lgJCS0S7K}4rm%+ zzAiZU!3&&TxF;Ye#wEY-RKO9$xSimeSenX=6X{cDQ@h}xL{x+mk~DW4wzw|+=B=Oq zz{Kf5$4^ZR9lR!mwTQHVPiYrY{Kko{vX5IxY`o~)cjOrY9F8S2m3H!Ya#{h0>NjNj z!!sGD>q@W|95VK^xyJ_h_y+h+1kI>BUq;~IWeL$spGJP8xT0tUfn)503pdQ@jX&lB z(P|n(g(AaEob7&us=0yXOlq}J!J@+Mye9ED(h`Y?EPS7L694W1@(t|4Ly z$HsZaL3vEkat(SV5U*C=!ZukZC}Ij9L2^ro3zB{P@48%DTYsUvP)Sj>C9ABQ{Njqz zFMy3nWitl;J8Z3R!IOrZDqR2AC7; z6$VE|iXz$c$tWM`!s&b{F%BVU?xD5lprlDv`&Vx9d zp|b_{b{&8yd^E%%YgGaZu95Wa*$2*J#-s0NXTWtNCml*k0YHkK0fK9}0~+wo**+l^ z06D+*)#0uH5~(R~1_cEMIs$|{57rB)oFH)q2&evSqYG6Cx+L8F!P42|#)FkUdlsw| z?{y7ykPo*yvWgC$Vq*e!g#7LgghaHD5XTo-m6H z2ASjC7^)9RP<;p^rcU7{E&|i-W-NB`nD^{D0E2d#ho+$^0h0~7LWVYrHR?GsE;>XOQQc5e z0`VNqvla33fPYaLHg`+t8Y%m_g{9T|*41A-UM%tzs&DZ5Aj)Hl$`0o~2VjgF_wd^v z-qX$QJG4GeyohjCDjKZC;&n657U~p#jI&I3W@-nAh%cObuZAV^9pt;sos4W;N8N%=439rO^NNAC^?>3E zxebr_o>M=XKV|e(5Ra{m63QGRXGu-LB{4Py$T!Czvbe4C!8&ezwEbw4Drar|g%@b4 zAcwamrT-O)37*T%Xp=g}JO|-Jo3ilO(jF^yiH~U6*FE6phFYJx>Juf7NeexfQqodb zdZc94go%^KkDBr7`msG|pDCr`{B4KWhhtErCsSvDSUR_Mvcc>qz^DKT^79woLjXjM z^wq={oEwMpu=;n-{gXDgQHt#n9Rmk8B9z%c-RtjF_N$Qx`w(s@7hyk z>SL;7wc~Kb4?xGH`zAj3(agT;wp$g};swf)o2vWBES(LVK1Ni)1<1ago@uDBuk$)nF5cOA62s?WSb}@>Pdv9y z9x>*z51zT1ZAMo2b*Y}DEeBDtV(r}ANwoV5tn~5qBdi1lDya-(sw~SDk)~^iuWw!h zCU$LTgS1%8CPUq&vXo@3U{7(06U)GsL>V}7A*8x#05<)68Q+A(xvO)mo1q&daOL7>!K>0ac0R3r>Yq=1W;Aes6N2yT0H&(ums0B zgXQ|YA_C4L>ReF3qDCDx-&I*j2f)%bME31GzP_Qp;euC%6Jb@Rs3_$!U|L z_|D>6HG8yG&myv3L8t^{MNyXx&s#e;-2g2rX;q7<31R-e%l5SzFppubJ(evzifgEt z2O1Kk#QFiZJFh#-$w(onup4UZcodz>@ehh>!&|-7$U`2Ix9hmEVhHyrBqWOuq3 zPqV~CPQ*x}BRLV#$I+{F={9`z!YRWi$TMQUY~bvKYVGCuIG~(g&faQSNtK@FJg+69 z4ig&h3>07WBZGN8Pi-pF(i84gI8ZLTj6a;7xFPbZ^i`z3p1h>3%t&C60f|kQ!516q z8ZI62L^YdF+llA72t3c>@xHkHSm`q0WbBBki&oyvaG_q2DnKak@e^sV=>ytaX8lTQ1SEEkz)A;6fG z*BPp^woh2v1x%Fe>k(51$8zOZiH9SfCC9?^oufxLBj1@YY~u54C-ii1EY4ppC=0Lh zP+J0bEK=wC4&p^H7WT*=5g0J{r5|O3A6xlygkJZl4s4-L6qjHz4m5QTERCNruyn)E zp_fRd9Z-&J<6RuVVqT<5R@lW}dL@F(pLtpOb8J80GI_}8IjbM-ZS)8rZz)b@DMchK;9Eh2^yr4jWwgbvJYfHiGJEd`#EDi{6?( ze55=h;pIyj{!*BgOt-+?sR!^UgvDKgO!tAJ~>LSz!k^y=S`eE zW%#fMmcBAbz{b_5s|6wAFQQG8hb40-gS*ZFHpoZu>}2zEr`RM14WQTr+_1u%+EB!B zGjGAR)>hg_1YTIo9wZT(2sdzruG~$ZL4%9~Es5sDruLAdc}F&U@%jS{ISDs#I9lZ3 zZZvZ^60D)c2|1h?h*}G;iHlcw;c)1wwM)WXD;7)~G7il5i$+O8PYG)sAUczdMwiNq z*tuj+r*+GamiWiI1dek)&7Hh>ycXe!$}Lq4I9Ht<4i8WKv&B2x4S++$*K1A_(xh{T zQI6~ENN6IdQcJ}5M8z5)XY}0@7QB0>i#0f|SUab_ycoctW9ifc3CnhW!+{gX(`uF~ zf&8*ZAHiu@jOqr5^VGuaCbq~*0EajYcR2XOwxp(y4B%K@0;h=cU=46^R|>$1q~CS@ zNabsHIdtKUfMa77j%Eko@KQPF!IXMX%B1DNXa`(Ue<*I>vR z!xfrBj1FE$FV6;cg5vGi(GJ1QVN|x;c zI(SKD(D})1qKCDPLPr90q(l=Mm7E!|7CQFJR}c6H{*Tb1ES4;Sr%)(_D4jnyf)0PB z?b7%0_h%2k2Q(+{1cfW5HUpZ2B&tl!w-K!XotA$CI$>?0D{ent37#WZG2@)t*3tx&d41xJAYffSjuzwW40pBtAlhE$J$f=7Y1EYe40~wB zBmJD*j$^Q;h^10`@%+i%jDm-nZG)#6q!dXs?}&qsl0Ej^WcSVPQH6M zz_Yv>A&cG>ui+*@VO9!FfHA$uq`YWP?sk)6XQOBYR=Jazazliyr8xXm&? zl=U6HUG#dZPv-(VbsFq|EO-%i{_dEFyCOT?B7y>*#(X6+%Z_>;Gq7X35q6ZDd$<@j z+ZA?jRz(ck@Zybg&=S}|rO(Z%Sr^X-TX|XddVPnA_v!YpWiO1r6PzdZ7Xxt~{=ifQ z&Xby5q@?7?vfTI^LRK&k6w?+#ZIVHrsi<#E+Q4;%c^?iS?tQd@i@IA}lAgBn?_KdV zzV9|SHrAbHEzB8dgdkDHiL#TPaGyx8}S|!Af!t)qLiyd>}(@DIwyVqhJcV9@1bVsZ6G8X zUT8nMr>6&F6EfSG-P#5~;(5}M`LuOFU3!dr|Is1;#0zCiA+mG~qBmiN>u5=C#vzbq zq+8S+WwzQRtP!^9zCn4`j}4J%Q(ao&A>R5N(=Auwt5wedRHKA1YbTrX!sDvr*%s1S zbUfRl0;3%lC=m1Uo7jZ#b^b^xAMDn10NG!$!F-ONIt2Vo`seUDA5QAk#s#_lc%nYe z_^ENXu~-Yb$tqCff`aTW2+dN0`}AO?KoPzEI)1{V`m_!*xxh~i;MW#EII;Gae_#Yz z#$Uw`BoFeVb2GX*B1mv&kPsFL_>CVyBODu%x+L86#L}sE{Raqo;UdK_EUW>^JIpp& zu)K?!AS|7fcTC-UU?>=KPTF#bU=fbZf1)##k{2rVXr0hi=7efADLXkKHS-ctOi-Wz zNA^s^R$bVzRRT&q{(UYqH8fToFIT##bQlb!QcsMaKxIcOOP-rFW$ImbO?!9V&FWbT zn|<9~TLLGFJ^bs16RLIq5pRhQaZHnYIa8qS%n9wF4uTFkq44NFMu5oK1vx@U?2nSS zyfN1fAzNH$th2%vKVHJ>%$x3b6l?2(1cVGYZ%A3Cc!uB*;%ZO}`XX=dq7?K+7Ss9G z#jo7|FBE;EziwhY2&p>`&te|}hT-Xnlb*ue@chcggiQCM^DSH)xaAc$0ij?QJ%U7p z_+tcz5U=`NV-Tv7Qg-7=#0OMPrFmdNSp_^1Gj^s40oF}%ApsDIZVRF7brEteMCV4ROl8I^xqwisz1_yy z3vmx>Q@M0FxU^>ClS3#p0o8B66-0&3upC~K!p9`riBRPMKxq8!_s&^4yr(NC)DDdk zd6|A!x`%9x#@?}P_1Gki(QnL z3+e|(e?#Y34J{QFm3EY&QX=k)sBg=tuV%ie&dC?G7tZXI$lv}h%JhRN^3X_Vaa=Pv z(S>8k==nTBlElIpZ``7X(c@=IpPoEr%ANn5`tC!0U3;TIk-p$rmp9XLPDJ5M-MUC8 zqakt)FTzVBD?|rqu|%nv9NE)>7j-8rDffVzYUl++i>1i+ummt!2HN11THAL@>XA%b z@Y8_F7VG{O;+jk^Gj2^zU{d3n^XQM3Tyv*nOXxiCrA1?IzgM0S`9-75@_UMF$nQ}d zLK8I29(WMH<~?4z)p*tpigy7fKb|Jj>IPDWc1qhZu&H3G*MLa^Wz}~0^9)~bqePV( zIr8i7u>e!gb4`s+mrt^G45|(#CCO|IHXh^%=8iVNqm?JW067|R+sIcI4pxqS@#!{P z1INxEW%UH#JfUq85DZ&5rdD@@o7G*$dl*%xiDkP+6Dv*wP54^Dvb*E9s@O-~7ER&p zph*Urtk*}A_K4>%PG|~j^YhwgNgPd$Koh<7IWDObWK|TY1<`hXm+aE*UrV33=N4r9 z5t$}!jLS?;&d4jl6UVjA{Eg%PqwYHc#V)@+D*tLYcZ-((|KP$e~+rHA8fyF=bQ}yBP?}-(;>l4CY;qIj1FoXqi}+`W0EJF3H1e|GWwd5h!m4{diu zI+9F6b&rGWwk6ZydTSEe>jgVG3N)1c=Nip1GdGgm0}@VM20OXoq}j=scaDhQVNSJH zPsew>ujkmYqubZpO{i99LFZDWZZS&Tu+j%Lvu*3{xn|L|^G>|}I8(9h46 zH7NgxT4)Cgy9?4D?4;o2Oy5|2E7@ej2?y=7VqGqFN&!x3z^T7^u<1H4I4zTKQb+ri z6qiglKaU$u>ap`%S2mJ{(@_VU)R?P#l2Ne}vKB}AdrVE^M<2L!?zvWc`VUpG!+`GV zFF&`EHdVmQ9*^e3e(Zo?3I05$+e#}~$2#zo^}MwakR9v}3wG+VjR0jPk)$th;;n2J*8-2ToeRi8sPf&-*K{y|rb_6W3h3=)9H-m)z4T z&&y(`ANoF&@biq-WG89q#Bl1e;RG|-4t55dIGJ;*a8%PUd#6q`96y}WV5eci>8^JO zry~+hx*61L!m&zcbGXpz!?5?P>M=F*AG`J3HZ-zM(+S;HBy`VWM2V;5Xr?&>4KEMUjT|dCeDpaK&cl_ z9+T4IW_wOmP53>CcXJT$KCFyNoIXU}@l5CPXVH*3j+%=^iwMi7tF1{*Ga&}ZtCR$l zi&5=SRA;;+`E*1OR5u7p6>D?FyIJZz$YD8KjMI9sX~CMQAgFKm9y@kq8^=4ed!bt5 zTS`{txg77PM`YVuk6yEA(Y*G{KY@7X#8lp&ujCWgnkn8Lc3?`C-Js&o|Ek(wIkiJ{ zw#7K9rxU?cT>_ZOw4~75IM_5COyM%-JHwP!FoOBbXUS%Q`2zA z$KTa{mKC4+M6XEj#8QgaUwUrkQqoWp*VB-f)=&qdu${_HO`9u+pm)w|xG3h)n31-f zjtWQ}%OWX?dDcXNi9J9?kisXT^gCNY1!v=beK!!*y-SBYvc7#w)1Aap+!p)R)@{E7 zqAqMc=Z^c@T!^A~Y|WG*Z>mRns!TIl-!@oy$bqPWapOgl=8$J23cuFS<7{8%M^p~y zsji)9iXb(B-2^!yrH`%BjZPC%^~0vA(fH@33sVIdym%+1l#J3zo?Ta`ui|bZ%+!pY z|EUixs7KtJvKH$c$?-q5d&~N@6!)Hf{^d!pi=Gl&Mvd((Mj0M)Pg}~i$zhbBeeeu) zhi^7ZDM;mJDX+K}%@XCoNjznHpjaJOZC_+MataUhN^P-2KY>l?M1VvT< zI^4K9a@*#|uUWMCwAM=>zOjzPlvO=Z#cif3@$;1p<=haUOifbeiNXU0sMvyA!@zDw%QyzSw+p=_d}66r+cl(RECN@zj;_2zQIeFYgI&@(P; z^E5e3BpV3qY|jwrc|n!KJ*cw~{EiD$bTRcrgP#J`F#}Ylp7IEO)KoSji>ZPOK6TwG zb*SQ%Zb0lyiC%)uv=SS^ulTu_UUllJ(3{hXCKXlY7r7ii@&&(c!Bo8lQ@JI&SMU=J zP0BJP&oCIOMABEaz2{iZ-c3}-(@7sZPV9};;cw^qyRKbyZA07Dk6jv3u(CZ6r(^CF z{***d6!sS+@hA5}*6H*XFbZH#sWGw?w+fRpKV9WU7SUB+vO>jGT;iq6Vtlss#6lqB zsvDUfQI%5ZtaEADL0g5?-0jii!JGC+M>`(5w0RCt^^GoBhJiD+?qzJ+UKV)f1@fl$ zVC#sg!?gVXS?JX29Iz5QwDWrj6aWYO3RZ5e%C@FVFTuG;N4PyTQ$be0>Fen^yiFJN zs80@+7$z$j0C)Tf0r1S)bMC&aL7_@TK%vuzh~M0xP5}^^HfCYGV8z*=f)!_fkb&G) zEVa5iYLiZRNvmA2N(;hDAOO)09cBoiZ9TQ~LC&&sl08uLA&L@h1^?4(ph$(DPg@R=O)%*KVDy9gCwiRyu zCQzM%8C9XwVRvrb^$G&u716oZe`0<}fhsRmxdR{-V<`6U3c zbi3($I@UdhE_m#kwz_NM@g@5NS>XWOPSjr!152<1e6^_a@x}*gWtp_I0|wL&d-Wzk-!XR!+69VxV3NC%%$+`c~yQ2`i3)J9~SO0KO^LT`J?VPRu@2jSmUn zwr^a!XmMNJ#gAMQ1+LsK8?=G_<5k(hWwNm&Lb##@onBn!i7PV;B*9J#_y6DHYNBd>}DJK3K-g0A{OS4lam!rE&1K~QAt!H@`o zzZ5|bjhc>;-1FJ062-nLq zc6{bNbbVVCJqg7dZN*Ne`m=!*OU0T{bWCA4FSHf0)$}-i$ZW4fO2k0NPp0<{gWu8p z%gRcDN|6;?3;g4mYolsIgQ)OljlqhR$RNkSj=tU=VSpMj5VrcVTG`+78ghm}1S9W$=)zbVK=mCiCBs(VhEnqLlj-aM4VpU4g&F&5fE5)36=j%!ke91?r*gafCRnK$h81E;s2b3%+}7LEvw!n?Ihdg45`4?f6P*dG z*SxWD$F4sk2A&l;{mz@~-DG9EpgGbF@TY8vC%ryU(Cxw%d+Q6boKTM}P#mB-Ua~5y zOMt9Wt;d0@6&|>v>cQ~HirjUd|DcU5x4I(N3NCl)P;}LF=Pjp1pxKLFl$xDZX{~*6 z3T!Kig0k6Mbt(A%%PML@6f^~jXpT3V+One{*;ZP#5BL?bG+`-+fkgWhQ?#oNZfmCK zOocMED#t5v6`T&y{?mSBf=FLglL9Xo@Gn~)qk_$guTX{Ht=kqYzA9FK?IZJvuy|}r zK4$SO#LS@Z+}uB2)donk6R^4rU{Pr~3s?^0itPoJ2S!dH3LXcr)a`P4;F$bso3IRE zsj?L8YOg5Bz&ap+Wy&khTAG}UHyEpezfCZ7&ZAc})-8(1A2=W_2I};DWhz-$90%$6 zjqNe`Zi3M|+X~{`b9JTu*;-y1Cc9O{YoFAop-Ny%^bPk3#v07SSVIItE`@}`6~NWI zfvaP?scb`cEqI0@)#+chVhZ(nqH42w*REeLTD16-$Qk!u8?!>ARVG_aLu-<-#EmiI zxAR||x)tb6ux2M%9rc729Z_)kq1Mb8+Y3f2NViXpQ(P%nS%`xPY@^Pd3)+X$aYDHs zCzRh2tP+09$4+~`F>T3NwplIhluEoK;nUULxa7>p0xLf0uY>HgAEK>NQ&+Egx>H6& zG!o0s1@xpJtg(tFSGtn*A)=w)5XI4Oz^}07#aTL-6XoWNhQbsL)sz$!&3GHi{lM0@ zM57)zF3_&o0x0)$h_t8%wdb{tMT;+w)W`2_W70CV&*0bRXIwKH4i+47q3b+UnkV4M zyF?dzqGVpVjRsQgk=avnqszN6SXMWO!eP2~D0sd2s(qGS9BY2Z@Ja(-gN8dwBA8+d zxuYs$H|<3{CU<=;bjrgW&5^6(@el4K=Awi1s18np;jlt?x)T+NdBE1-=Rme`JU7vE&5>y3|xiHdYz+ zs8epc>j#S#FK&yR^T4GMTf|$HlbzfpLSk;WgpZCL@}tl%i#b?yX1DI0;jrALkLB>EDBvbb)fZ|+M(<5YoO4l4=ZqfsS$j7-{j8M0*V7B&y{~;^(~fjyTxMQ9981tqP5U1qY88UXBzoFMD}cput|CuN3GjjsEqa@g=T} zmuWz7c=4jInOXirDAc^<#^&&)R(!%H zX+U6w#&r0l&kA!Fp@qh5?C4muw-SZ1DwW1#4p=gPHPg%$CwLqXP>P=DYe3Lf(nVj& zf;iJl(K}K_CA?~;6cv@c(BIp8aGO1UEbr2e5-xlzHnEeU-~Po#ix)LUFMROauuWg2 z8y(V1(wFg)DSRe3zPNbU zVtyb>=0%g7Hni#ZqNK0T1rMGVZUVgiwTHrEe-GLmW}weOF0gXfqbc`KW7XrZN-O2tu-j7f#2vZZNHj_s4nchFGo(E)PZ-Und`P(Rd$&Eh zXz{gm(S;A4F2t8@NHBW=y53KNDhkR=VePd)2fSE&x&2dZM~G5SB$^Li-i7J1I!gpc zBCkB~qC5=Zi{J%c>6I_sI|qlChXt>q9KjL&?oxayS3*S>()P2JIChd3{=sAz$(a^> zq6H6L6sbeY`7KxJ=p88(Dpo&Lv~lHbF>)gd|?5`Pq*ye*9rDo z5Seqwdu#Ktm*>+kW8)xdK55^e4KZi0mK$QyO2r@Cv?iiBcXZs|1VJp>mT65vf8}H_ z0kQQ2F}m}<_6zsYZSO3IWoA^H4QaAR(_4R~kmP&CN1fi&b;H~Y#`%5i`)_XxWBfQHEmGURq6Ig~x{q`wk^ z!3bi^VDza}8-)7#MQZmy$D8Z`2?h&8-v_Sk@9RCbN9%ir*cicJ&#w+bL2lo-<^DyB zuZ~48e_)0#aYXLDjAD>E#qu~rO^^&-SW1um(_F-B?RFffMeHWFhvM1EReGB423 z|5WO$tsH{Jki3W?XvUa!!88x#tgM(iOsV|X;ydR?&amQRS0;fmOkK>zf)mMN%f)Wn zO=cR|x&~i$3PnnyF)hS|P2mwK6%#mFEGbxwAm(H-k3gwpzGt8eQ# z!m?aewpAjLcZe|3Vph`yUPc&Ef<~CQY@UTMhn;MdPEqN;87NJJ_1IdBHzzxdFs=$W zXK68!Ia4A@RpIcQ`>%?S&w3A6hA!g-ZvHVhBCBYOYt0DF0cK7%8?1j{)%`)WTbLnxMFe)$|{dyyeiv53G zw7BEc$lN8DMYYz~Purkit8|k3vpa+&)wdX9{l26tQgZpx#26><U+7%Nr(SdB4C`N<69NJ$v;ij+C(!|ESwdle)O-hKDH z@F`Y&%s&%?#mcZQj#+H^Qs{kLW~Fpej7^I@SbdFFQDwDlDCPJ}W7RKLW`)UO;4Z;p z1hHH!HebbgL+%@alD&#>XnIjm;2+Rphqt5O(P+m>brQtDV(1*4k8_(_?p(b1%5e0m zB`r3KNv~BI#V!U`EM{htG*Hq90Xzi4WUYvsQt3B4-LMlx7{y7nr3$&9kHy|ZoD?0z z8@_V?&2Pv8?Bzn?DF*y$*=! z9ttKgdql&i7a0%(hrMHn4dRAs?m+qG);$cdO<%qLyg;d2in&NE55!WKMd|S!6ONeK zm#zTj;aKVxmttA!25nz*_uTMYD?a+~g2F0jI$B`$*Q`JVM|2Zxd8Dort5Xg(#3~Ek#9llhYlcVa);UF0T#WCdGa6IihnqfpO(cAIJbnj}S9#JwUdwPn zT@;IXm{E9PgQp0EFU>G-0>G^YtsG4&Op%u*$!icJ5z5e4@{7qUx5780V|XUKr{DGW z^&Qzs6SC+tw0(++26^ope`p0Ik>Q3rF18|d=F=F8ytKmSk?}r%moH`HkY>SqfoDmQ zDk%SR@S+ql({x(y;Hcn5=j$0>cH0P#o|SpSiyJBwyvS@#fTz1kGheV5$zw;wsC79)-gLoUngQ@KynHZs7N*&Y@#URA8Wx3U zG}QBfO59VnPw9RYg3(pS`umPy4*^Dmv_+BX1iEbQI(XWyM;CX%in&B^mlF3X_ceaG zi+8ndB!_}b;y(Y;VWTUnT=WjeD+1r( z5?NEH^M*rT92^^Oe@`R?`uf;@D_xC)H>ABpJ#xjerBL^(S|m*{oJ>liQF=m_XOOuKBj1)@)FS0%UXG0?Exu^L`Hd|S zU;DoGz``u@q89vWA}^1o1l9~ij6`n!B78mO^Z5ro9Wc98AeQt5b)zRpMA8WB94KhADV>>4% zlEIvrukMs2aepKygK;&IXZ^`kfn=<+f3#d6A>`N8<4+%%!F*DH<=`*}#`b^v<5zfM ztdcQir}+W=Yt4>B!(^qk20k8nG$j~06m#=(m=O3XL^j@jMU?W#dk9W3xr)v7>9+#+Zw; z6_06*Wq`4?Z@()}Y94D)R(RfmUL4nV%P8{uCH&W>}%iE7aI8gK5A#2+e8apr6q7Xl5Mk1b!tCu` zvZ`lKe`yO08Gj8ZzWpF<{A`o8*rc$d>lOoFXNF@Rx-w=(N>rS*T?(;#EH8!e%OHFm zJT82>3Pt}T_!`K^U<9vzXquznfACrpUdGJ}V;y8br~AxcI*%lHZL;BIzJ6*uwAsrj z z%QLLeDHxL`Q|K?jLAu84Y1s z6{4}Ez?2Wp78t91tH6@f#aI83q~XK|sV`ZJsjX{e_T+Wh;D>y10#E(ElmlXMC0)15v}s zAhknbTS-#K)F3P_JOb@S>&MLb?Nny~#I;hI_xq1-zG?B8j`PFO_g)R+s#U~QRVnTk zXmdqpkZ$e8kAlE;z$UJo;4=Djju%{>^N=&j>gSTcr^v`A#d~t1Yn?(@&kr90bImfQ zzJ_72;zSG#Rzg<_m!Ak-v?|Wj_A15qVlG>_s0<9T<&xWCAuP!Wzky*Q+~Yk;Ck$R; z;v#>-t?gSA_Wlm`73hgcmU41`#=)K28?yc+9oe@khHyO zIFw^W=@EriYi60d{eTjgmXDqtj-Zh>{I7k2ytuYa1xR>W6r6_?y_7zQhfLxR3k4_K9ER-BsYEK1(HlB*#KirLcR*8yqdto<`2pn74=fYU;}?&J_3{Yay|;^5mDQg{{4v&7$uI! zg|ES%Jk0pAyN&5e>nwPz<$3)tQuZ7leFdq4E%we!lfa@Xar81Mg|O!c19-K6Y+g9l z5s$|IlU7mCxEkB5Hi4-wR&LLMvhSXQzhaHYN3v#OU%;>!EaA`iKkXxYr5y&VI!Qs9 ziDodzbfL{)_*!7FDlpiRBmMm-5n(xtqePTh77)Go-2Jidvx_^fXbnX!y1CvJB5m#H zejD1tSH%ZHSigU-M3@hy2Qx&TWi(2UEW!?o)G_(9hi?!JM%~7;8pey$jjO1(gT&T^ zHJxauobWOUv2mqkJg0kH=U3yn_(#hYYM*aSvB zI&vA9Ah5)tVYT^8xRlxB_sU;o4oesMup?n7AePNy&E6`^HYs?FNR-1C ze596&Ly?!VObTR?aFMWG(ounI@3{%csRqDYA<|C8h9)sa*yqu!2LoS-d|e!Jkr-wC zW{yIN*(l}_iGA%*e}9*g#3)7rV&bT9Jx+JcL=!8uQIN|@D$H4c zWD;9P$(tfEWGS|VKLm+UenQb5nIqKKXMGGYFA{U*kzORmNm&Rr?#7+RoFv9Z*c3rx z>V@pNx1;0YP;~B<*Vfu`lKIymAhTabHi?Zi#1c3bJJ@`BZisDE5c@SCRsyGjB8>?# zk&t;#-EwD=dQx<0vb*4rpKhaTtCizS#2IH?EMO=5fuhn5F(bG@~3I&^F0i}?i^?d=es~IWuPn5+f zz+&G&G~mTzz?i6UV^RetZ=Z+KZwuEJe)zN)%nDSwd6-Da$h@yZ{mGfdcIIWVtUmng zPS)BJWwAti24>jsA@-Y3+!iR2QcOXNb4i!h&jcnBi;4M9^Gy-P4q;n%R}LDhGqo5S zmbx{`&LyKQA2~IAeH2?+f0IyhpH3;P(lqAuD>9kXwu<87sYGM=P~7YdL*L6(a%nM5 zV`PJUPGHO@>F^x?Hjj1PcpzFxDIy$ZlMb4RXQ@t4} zJ>N+&aImM~ls!=ka@KKc>D81tC;r_yJl)S2`?q^Fk{qh&Sf zQDq9#g?kZn4twxeV-}Ce{$0^@Y*?1j=;iT9eds(~l|@UdU5`X7h2k-6*)a!-z+*k1 zw~Cu8jkJI04`uQgk%8sF81>|5^H?>%5r-NxlnwNLI^rW5`?rGw1Fnpc#28^rS+0kU zZM?3dk-x|HavIJy{^uk|$E`lw$06Cd63pSLW3Fy5_CCrPL^2 zVXANqD2(de?6~TtW8qjj9ao3e7luV)bk0X={ow{He%>=Kv9FXEdZyppEY8e|#Q~X2 za(A@2cuL4a?TbZQMpBmJBPAugzKC5&TIzFY&%@6*YA5nkYu1;4NdMre3FAp+biFESSHxpE!SUr{M|4NGE>{2V8&12A4WwB^K#A zIuqRBBFXG4Oct*7;I0PZE~o)xn8?vpsl#J!$3+d1;AQdn7iqVlQ{^vZvsG*i&{wSd z$G&M5w^iiluF0k1x~BR_W{@H7g7Wfz-bdh4B3~Da>d6$>zh0-2263^*j}UYH;z0iZ zrICi0Ps}yVb}H~Ny7xWM(Q#oYa^)47Se>*gD6qRp*CFz?$HL_kUJ11A#K1-G;eQZZ zXXIqA*EcHWdg{?7@WLERbXC15OM#8E6_{G(M(9caTPAU_cF9btLk|l}&Fm~+w(N=w zGJ3`>18*ZM|#M`Zw=SpK5wdL zP!uDa_B$38RF=9*hA8{4-~ay>TAsTNVY6DoX4SeY541MyJlG{Xu%{lqD^NNk3tCEe zO>qh@PvXKkxYu07r7WbF$y^?t2>ke?4L3K=3y0B3@vA{4?1hg{!d@|#bXi3o7*tpH z4;6Dclsy|sc6iCdTm-L#{|mk^fw`!dYR(ez>!{7aU3MRsnph?7`uTov7dL{bQ8nVO z>4rgZu&e8*9UWH%BWJw7-cOMc4lzYWhX*Eqx>oky+_g1}yDrGLB|s&Q!{n~v0<1O{ zcfItw4X{6a;;ul+47!aG)dqzryBq^W1TfVS&WkrtW*s$9xDEi*vWvfu%LRu!AyvKp zK*9wth{i6N(Gd-u8;}1B&DnC7A)EMMuM0o{&pSOCUb?3%7ag;9u zp;7x^`ShaVuL1v-lOA3>4lsZH;gP$hluYN-D{zyr{x?&ugjZH<)OUlqb%fTmqtk6v zZ{eFc2u!aw)#Ak-v$vITtgZ0FbtLPfD_Pd_93&bIHG!cQOx>jwqukxUu!{W^V1dSb z`ZzCvF~Yu#Efhpx7$&fXAy0(B_91OlovhpnMhMF+n?%x{vfds0yLwkx9iwYQwYN6M zT5WH_cpSFi& zC~H)A;RX*1GyB+c6!K(36!&CHXa?K-zs_J@@LJ#*AeTS$90H_**Pk9G zcsWmGnBG@rT4riyiVp)5*xws4DNJoU_Kix9I$F5NpfIhGGeyEUvYiQSe95&4B1HP5 zu~Dbr5(~|Pz~4jypBnLTl}HMFbR($4E5nkDxU)lwi=4zIX;T;-erf6@~ z3trlo7`FbR66B9|gTD6T)QxV$w;=EVFD3Bz9qlF8>y%LJ1M_QREzaE0cowSB&=B}K z=Ox#R*z29a3-f7tjR`OPvmoq}j8{($7sw6(s7e&bAs3V12 zJ;=-PeH@*}y3d6Z<(un2G)L(BKO~)f_#7UIyquk^nasex`HH-TmN6;~)72p=KoYvX z0`j6k6;}7knNaD;u*fTdCa~5mhX?u(?^bi%N`B4M>K>_Y&r=;8iz4C14>rVNcBiy6 zIA*;HrS6rdN{-5af73f6um2@<^`T40`pctB$^^P}qfVwgQ zd(o^tokW(mYmq=6G1$xQ(@~|NA-@yW8Wi||urJvNQ{hqnd`D$S%g5|otO{wsw|5T= z9urf+=q=*w?PH;`;NN&s zAZ%fN{-S|G>#t6Pne|82M!^ts$45&XRZWlajm`jJ2Mc$)C`^$+*!C!lZ^VTm*`z}Q zpQB@Kh>y4&bK|QNA8Abh&)7zhUKNM^s=Z}SEjbiT`gc1cq?f)Q z3jxNRcf?^MjW8NjOE!D!dlF!;ZP-p)83_B^Czn)|OtV7c>?R7!NFseRtm*kkEG_O} zCIGNq4hrKGEat2{8q+wg7&$vu8$T@+M32tT*#kQ&E{=-gwxBSs-HEI2M7)+wVeULE zmjKHSHAGbc=d7Cwu z86}+>AJ>nIe6YcI`4Jr)_u*j;j5<`f$A*~sjWR`Ip2)57r444g6q(rkv#*N;7ofP! zHkc75JIQC29JWF43dm&ocZ0*Gguw;aOe0z-9F-QE!=RR(xxPxq2v~z2Ak#XZPqB#2 zG~OI0gM0)7k)ibm1_qAmRzu-~B|CvJ?lh!!>E3W&3O-7kWxYyIZ$>^E|jf)^=*Z+<&WJR1_KH5F9~M8F=@c82cFo0 zf&tOgsuF)|LdM~x zT;}nu%&Dksl$nxW#8)F$z@h#dNdXSmwk9k*I#bfulP{w5DE3<6x zf>l{&az;3>SV&%!k*bVPmKu{17&~ZFnPvi4RqZ`u#(OOY}{{ zcI9w+fu|(v-d2y^{M<}N;gaH|l4NGTH?7uiLX3hXx3ei8&hjnb8PB4ATsMuC6$hrS zgzws=d{-_T5sk^sO;lE;Ms)Spc*$kW=EVJw0Z0pnSPJn*bpA-PA&kL}l zLXfTeGy@Dr&4X4=rdkyzN%m)?IW|Vp7+V)4`zczc(dSMV@@TVTVs!7QF7!?ljj5(X zRXz@x=9tm8r#=&${YWGeZHv_|yfhNL5T&DDuW0GXWApZX8S}N(g2%M(H|;Tl$Gofy zsu&IWzv}xsq9tz;pr5Z_h#~r2r6YS)AlWXla7l6Cy_=7sbi`XUpJn5MFjgi)kp^n6kd0x&x{y*b$In)wk_6ewfiax)^O%vu(o=-WZTlEw z&wS>d1`3sqSV`tZc5dlrF$S4$Eb$nFOgB#JuOwP59EwKxOOE_M5FBh{vp1&albpT(FCl46SsvlwkT^kKw+X;{AygU4WA zm@Mq%vB;F-z{ML64)%-lBx2Z`5=$K`X&DvuxAwncbxf!W)qYUMN?xRCH;LhGplC;N z!;umzkKg36lLKU@41>p>|13Z@RV+rbMZeB1DO!@~A7_hx3x#kKWtnk4I2cKRv+lwp zE+UPn?{{IiNa}$R0^E6-58~ac?0csGP?DVU8XuO<1b~_EaAoOxC3++ z8j{YG@He)e>7_vgv&V%fBRW&sUo|BvIx8tPEDX`nqijBCO31S4jN(Ako4W@GM45tS z@L*vOoh3WVRmc?0NC(iae?~CMArmOWaS0n`s$}W%UYwDhls~DmlLKUVR2hM+msX&z z{@lHDN~Y105kr?b>5SUO+(A>L%o>*(I|x*_;6G*;`NDVlnyXh}g+kr^g)b>Gat8I#+x^UE;BgTOfS_g z2OTm8{p&`U$*883PnWG_kYU@+%b$0Ej518>O;qAv#Y|_0nGqQ#QCVg@R&oGl1Ay6p zgqay~tO;S$D9af#GZA+iTg5HPs{JC9>D_)^ptvNQ zMP;&yAul8FdVxXz*TG{HE(v2pYJamXPGx{yAQJd9*#g&8h; z`+h5|*j9u~7XO)09R+&B!*E%#IxSY=GA)>Ft+DjDJ2a9LY>n@e*dT@kZ?YShZik#s~y%-*9-aPj-gO{tJqi6(U|z{~P`A!=Dmf z?7J68RTk#PQ1P>mBVG>rUmqbVqtQvSViP#H?1{3K;&h9FvbA5h_cVzz%YicXF^I}^ zyksB4g8Ww~vw*Rrh?fJS2xDqvFz0A2{;M5@C3nOjHpoP7C5)+fDco3Yf?X@R8DzZV zGBX?}j9bu#cEVWKmP-P~Q`pBKbt7B;%&%qmu}*bED_$`9iKUx_GGa5@zUz#bs>?@f zf2AqO>0>erlPIf2S)lZvTebF=T^N*PR+3pJ);)=c`8M`FHHKn0h=>VU7Os^)+;lRs zlT2=er6YJm!YRnIlLKZRhOC0wdg=(E>z}WE@xIear`4d7f!T~hW`13!ab`{MO-LhT zCV;dgLS_$^rqIF^r~0pvZ04i`vd(S!TtxypR$F($B@qglU+>2F0dz5VPPcXAn z%-;ULpxLJ;)NpN`6lNi)QBIDB^kg|^vicwNzc%7*mT0k>hXb>9U%YQV!7ObDO-?dR zWkz&nDl-i;&=p{omM|N{WRfB@N&r-aM!`(Xgp;#rR%iqvgg(YFt8KeMB$>DFq9oJ4 zJ3}Tq2Tj>GLo4jWSzjWw{cpDfif14Jh;qT%-8#d@tadY$lBPFH$Gn>zFL|*XOn_s@~EQHOdAT(#-v_t`b0w?)q-bnLJuz<7_ zkd^?U5z^d*#-Xz+Z|LMZfWpqGe_vgY{Ml!LG%-Jd1{&IvC{j(U^L!b9s36Frdq7(M z*2nNMf|Ark4Zu@Rn_o;<%L!Q&IvHuH0^&H6k@+7G)c*kSRM0|h8ybq!tk~3L?DIOS>=qKJN^Y@;=$1f$1{Dw>+r(i2jG(=^gZq&Y)pb>7fPAF5hV8imd?Lp2x2<3CD>Mr55p4tOR4Celcx5z=x+PZ|5&B2!hHYN_A+ z!S#m{z1gV%0Zm8GfmN6%35M$8^)}Eb<5Yc&syWUM`(_5?jGiM4v=nlI!ImbErLW+$ zWk@*JtXG`2;Vbu_jo^u|lnpe>2C{oIOrT{Z`X;7qQcHo<`b7A2e<=ku9X=H&C_SAC z-!24oUE88a%_;HtJqJN*7`mjxM^w9k5hcT?Xx5UI8_}1Y$sF7KFDRLY6{#s|Q2mUa z-Ufvs4xbFQLH{=pJ{fAxm!h%(zT`;$nIrfsMnf)B5eQ6wdNazJqLNp*Psg|@Pa1psFVp6YvT*bbAKvKi88J3C7Q#g(cQ?V<)UYHex|8G*A9O>PDS&u{p?1(`G9ozJ%;4H?si&G#nJck_9>@upahC zEEv1K!A=Kw{|Jdo$Is3V`5I_sZ=4K3Yt99<7uEo1oVIQI`UAvhRLK>glk)*@O7l&# zFi>t%nr{*nI8&0+6wP4omAwWq}9A0xihFs0eUjoDs-8H7|mfE-g$+MxfNpfst{uzA6JDk^xgm1c9A zGH7a)Ut3#?bf9hRR-^+w(4=NEQwW~Gnrxn>Z3_ecjk-W}sQ%qrrBUYTtq2*!*+SHd8HO_DPzAYoC4?ARFvKjZ%6s7Syanv}aW6Q533`%?W^#h4Md74hv z1t@mb;HUFe578FX^UaQqbE?DV&nKKw7K7&zb2%I&EgkbFUa@neaW;r#z%zC(UA7Wu z=xs{d^^FHEMJ`Z#0zkuJ=^|edK`kjbEhV6q6i`dZ#7&z~mHDG*Fe5Y1+Pb={8$#9Z ziO2tf7BsO%YV(`aE(nXm>hwXTy^A~!;xyjZPsT0MfejDg*@q2IbJw6)rYUYvZW_B% z1U8as1U8PI3^t0NIf_s^AuwCez{r#kEPp#OD2{A$lQ|XC71+es2`!T98Q6U%ERLFJ zyvY`78f?cAKL`DaI~pb4E`!6@ci&Wodk>x&;@9YtD(szcG;QaS+nZ=NLpwrR?KL znauX*rUwEQ+|H%?Y*Y(`=-e=orWUfOy*XYu)3K8i0%MBK4xY}0fI@!^^?~=S-Qn=k zXugSpCs<7`WWnS~-{5MpID&N@^)}FgHI>9_!}!_!Ksb1gJkGrG&SeT`yIG~}`_==O z6V8SKG%{{YpjiQ5QNg4M6A5ZWY7DhB;^%<$INaZguC|-;Q+XUr3LyzKV6FMOXiZBz ze&;?h9Uz)FAk@g?NOoQ(5;)PDstyiNLa_e5fxzTwE=tqgsSY!Zl{FU*2mRj?ghqKM zZD4b%Oe1=Fmj`5VBZ%nv<2R1Etu)3Nx196*$sn3H-c=oJz0eS8Xl4j1oH>RAvWXaf zTG54;@V`9be3mbCZjm_K|Lu=oiL|q>&aw$DS3=;%SwUdZSZj3QICTFwftCc&j@qNO zDtcDAyM*lAQ|dGWXZ0OO_A%-7GV3(l8WhX>QHtW|$y<+T8LMG(Bsc!r3N#=iP|4>I z$~wCdIsvGCN5;;~DC}Yr2~Ez}>3Al#X zrp_uIRT7vqdUSep;dpf3q(t^fq()fiyIFHM23dxh1!QpqHPKcuYP2IQ$V|#`ECxZLl5w?t@n$fYuKOZO)#dQ6-bcj2S&<^v$D3k1G;_Eh!4^ z1h}*S9FvzH z0-D{XW=$!WTw0VKGwPo0fSct3w?U6sS}9|xVNPN2R@bV-vTK#ngNFCUYT$X?PLt_W zm$DmfCEAGJL?uxy237@wO)DusP`x-t(OOLvnfZaUKZ4OlnW%}j+_BV7545+YoWa@| zfxtPdHzieJN_lHZ#L^Icw=g}pU@(YnK^IjA=bUYVtvX`o2YGax>En(x*apxG>5Qe` zVC((?fvv_mF0f^$_$LEvzK@MgtQ$RgJo+Ln5l*R%D1{MX#co{Sp>T?qDE8}>=Ln}P z-E6o4Z}sn~3szqfk3VCVr<~G_(*)77W^{M#dF^V{4Ui8?yUOiW**y{-X@ZHj?@IM% zdbymBMvNRs&ED~xy4~ZAUr#36XV>maQZ(hg@}gf&;f;L{kw+i4@N8_G^I7M*Ic&ZR5ZBbt62!`PPNP#$*x>P-=Kl8LuHD=a- zP8&mA0xkms1dH{hkD&THEi2Ri)=#ZKOVAc@L)q}!YD4~sERdvUuyq*b0K_G=0<88*hC-dgwavTSG${3`c;oT*WF{u5H=-+gZW+rv$9Ag=0Rp zyKn672gZz@fDyQ~blf!HQUKf$QCf5YE;DJiK@oC;s2x%xh^R`y)wf&~sh$^)KiZW; zz=@QBPfF96u1p!WzKl{rnL?cCZgr*%xkD-$xis6B@P9`jjs+a8t0a>4N>J^fDqf6{ zG1S(@rUe4mtlp9w5ZxYXh&|Pr6qrLyr4{acmvnW!s zCohg5$0geOaUrv@dPXkHty2Q7|Hp*6>P7~gmm$JsD|Ix0KZBY0)f&<&YU4%RLuoBpDRmMag~NZb@58*0=vP8H1_lk1ViTwiN*OKWRQZqRL_ ze=JOq!Jj;Q-4uYX(L!w1$*LJ!-Kg_V1Lj6Ou=_w)_o#<%96N3zbsK4-qZNG=SyMRW zbVS&2PNH*zPOM5M?M*Fh5jF6J*i=`4Swpb;%6NRKhnAzr`Y!r(Xr-W%>0x2U z3|4u{qHK?WhutYeG2l3`W=0nXXXJPTD~ee+ys+6bu!7};2*qs_nmMFBYK_&=#U$qJ zhfRAlAGT~%u+Cx0YoO)E+q2QkOl zL(|ofYRrm0M$Jb9WEk<~~abVKE#*FH~foF+MEtwFePx!OWhf#|z};uPW( z!C4b(oj*P+sM>`O+h^6<|D+Qv=zvOrtc z&qm$-!ExgzSsrj>f=ggI5%ncH%aF4@gq#XV3U0s~_^p0%tU45r-@3_BLS?v7OkF7C z5bwa&L-22{oD~RED!4gwhatWl&5cs#KyXXSrb?$E7%HA}3AL`SJP@dTR>f1Dt5Q6T z@ULFIRur}d61Z>iuBu?e*-jBh<_H1K76P6k&Wxuc3%EpEPtJ%c0H+GwPdsunMbxHj zhNGBDEpK|KU-8V6@#Dr#{Kl>WUA^61-9I0F&&>c_sW;+?;56bCN07nbMx3eQfH=bd zuD_(dx)LgGg-~&3(;J1DZYce{0 z*Y|x}#5v!K3Auc!DkAEwFQ`N?i@?_=)$(75rFN)5zO zLoY3oWD!RvV435{v*(b?9_mbwn93q9Q*C>|lsB9*x26gwR-QoXIGW!uRKm+}X|FdS zj!s>2$-$Ta-|7!hgDJE(u#n>>Ju*=mSNSd zs8U!3&6z5Wh7_8rBiACVDry#^6+sWosh8pmtDNkNJmwnmg;m9Jzy1VauDLmF@La|* zub_69`ey@k6H9(V-5E!Z9_#D-#i;uLx+2Q~I@WQP%p4TxOoyZ_yUs;T7u*IH6LT@L zzo)Lg>GCj{a$o2XIu1KP*Q?$O<&dz?Aot8lQ*QmLAlJEUM^$GIS$%L5jWt;WIu%;K zCwML!bY4cVJ6Sb?YtxEX(f+Qgs>F2UkPzzFl;Z}a#G5yFEUvDub)l}Rl29j%;Jm+^ zatCTkPWYc2QKlPg>&+EgS2$wpZ$5E5#a5s$ThDQHWz?0<4&ZG~{sj%x96i$A+duHc z==*K~=rE9_gDWp*W2(y?TxaE$bBsDWduZs0Rl}FNW4o||F}m=!5=IuzMpJNAj6v(O z#l6K$X4~o;soLe>j69T~!xTBbDo_#VNY8QY!AFNb?C#Ng;nk1^wG>{T-IyGpHeb6{ ziNkADC_313tmu-R9UYfd*3_TxN+Bx40(G{c!>&p9wEx(#TG5>hsLPQ;0Cg{~+o-ti zw~u}VsKZ(s1v{=ns5u7Sa8y`TSr)J+6wUb6#+`?{4<733=^q$;V$A)wj0frr*zrz4 zvPp>Sh7UVi(^Xd5u#;KD!n&HutK;$K*bY|tA1FgdSa};j`iyYqy4L>83e<))>^vf@ zk+c%*^u!EDs_*%J07b`4XN_jiu}dPtD-KM_mIR~3>JeUl{vuhy;)a=OSRzR$FehC( zNV>!?F~?99oHIvbjvEm&6*E*8;m)-6ThT9NWu0ZY<1HCmP@Tx zBx7&Y@|P7`6N<~9TEA`ok$w9QclQk>62BY^$W181KnGJDZ9Jlp2DMg~Fh{EH5Xizb zN?6s+FswP_vsDPp={%yoett`^3U$`sh>-@m2&5|ej5*3&d3Q5iJyBJ!_0QD>0_CPY z8fJjy@0Tn{`c2T0I=E=e*sr0^&17~jHw@3B{t}^6^t^gsS0#-T{S|{bpT7XGVOzHeOb|Ujp$kGT=C5F z;JKZ$F8TXM@0dEhCJmxX2~|fm2sh}amKQ_#1pm2V)82zSb{#m{(?6I@{&E~+E(>(D zD}+{`YS3xBgsEb74pm3Beej&40@3`gP&Mvqh}}nA+o!9oXv#>7@OlY$oX^r(I=wWzY*^32Ix@79~>Q)qGIl5+KjXxu% z1jh((vb@NeSQ33^^QK*UHf~0rP;Y-CnS4?}t{8ua$!SQsj3_~6UbM_jWDHUi!P$)i>Z{)WzfX?vsYFI^O7rt$IHiClcMSJSk(VJCU%Z5pUt<>{Z3q z%$R~P==+t)E1^zHIw9gqYnNhcjM-V0 zS(9sSL}|aeZlM!&;O3CZB63^8rk)#F&<&ut@78lJ&~YSs>e0IZx)w{Kj*L2!>IzXb zDz_$0p4j}-wyisNt`pTID3Db0$??Q<#p3Rx}*bh89TiCLlx;slTUqp$Bx}wUw)a2Wf&1prczH%xc}Di z69Ui}j@arZI)Yq(f#n~x%MqqkH{BF<#-vRa?9ObcseBjaR6P<2%3l#+^`0TMB5Ct; z6kuyziA0t>a#~(!CKa$_(*a2AW>JC(8)rm*LHF((uD z`fxBU)8@%~3Vdj65a9dcC+?a(y(%TK$3?M>NGme2f@q}NDw;Ow;w`&(@7wm=%2nV! zf*y>q)RPkh^yqIP6rOV}99@B@`?i$H684h7o;pgPiEoCX@{G?{F0f~)y!!fvD@=#wa82QpBce;Yqj^arCY7G#+=0W((BYzBe3_UN0$J5ZSC!81Aat(6m|<@k@9rW zv}3Mfmnj=u950I zS39vJ+PM*BO=m5_UA~y>{)AMsfOjGzZqok)-@h7(2ECc{HRTcRa@s12u2CYM_WNg# z+O~>3VMK`r!H$M>WM60UHy!Z>l{Kx+?gY1@qH6f=ank?vhz8ueg!dYEumW~}1?&)P zEjZ3;8+b%{1@*C6R`IOBXZG#ge{l1QPcK`#oN!0!34PYolVb^YCE$LwUQX@&q9m6X z&xyMMQRZ|v6;BshFZ<)w={%7;JR6$N3|5^MkN-3)&tR>0DMc+%2abQ~VEfjJ>#3zU zcaEFSkL6<74<+!F)XR)59E-ArH6f3)VuxDMEQqqjS$|s%XNAUgb%!S@Jphlh44%~K z|6xbGtuk~mDLwI<6-RpjFL##l{|WH^{>df5>6L9M8+aBN&uXl0h|PrdF8$8Feftk? zTK&ulBQs&#O#tpD5$^0zn-TW``9KH*PbV1(Y;~mix;OCj5=teM1n|rxqoEN=Mk9Js zRFYx$L8V0XLI97>H<*!j&#G@?z&_&qin_>7RIN`oyK7GxclgC1iVs@t>?}|;VQvM6!hB~-4uCDc?R-ixw9VrgjqMMZ)mtGR$UX1-^B?AcSCXa zB#AsnthMvor(P_Ke(ISt}~o;{H*|Pgd+Q zCV9E%lcH@M=NC3pZ@4qQxUwqdEY^zrmdr@>8RyE%soF<5Ig7jz$6hcW_E-y9O9^|G z?bh6cK%WJnXEhf#HP%kG0_A0YB<#KY;xkV#$D;I=PVm83nF#QSzlF>&H0@D#n-Lj? zH~5s!o1t}{T@9dCymG>xSwMrea(-P^#g*|JU*w*sz1!Ya8w449dTh*yx9gT)83@cW z`vhopgW)L?g=A%kxJqq%D@nf-dsIJD`wLDtwSt(aP?ZeFvw^b``|ni=jQ`u+4OBm~ zp-0PfXyp_h^{N}Bdup*&kVWj zj0x;%p{|=$+}J~MJGY^_0y&1PXHY>(Iur)>RLE7H^0ucxLrdzMAy-c-s5{viR?>B<H_9l#?L*MbmV48@J>?A7GqgKV-_U$& zP38P}{7KOuCEDBMP!`F(6xGsLvfCMyl{xm@AFyaA=n->0eHHl`DZ$m2^1u2t^vKi8 zfcDN){ZZOjF-mDl@2Qv@n}W3`OE;wK`8T_imZX?#CK`z+I^w5Q2Im8N&L55UQawaD z!?ct~lK4{X$J#RO^|{gaDwhqBCKo!st0pC|hAD83NvmH$|N zP?cfCnq(@bQMOSh3mP)p==nxRys0vLxs5)Z=9UL-^bM75B>gK!FzhDVdxk*Y+hXA@ z(D(GG1^N>6k^+61wu0s`IIQ}T&B$=~y!QOF;yN1+87+r@!Q992gRw{4rvk4v#V5~_ z__E+fMp+UQf&@R+si#G|C;VoYG5nml?p4t$3^so9Kz2b*lApQef!C|A@BC;9RWw|V zMgF{zw-A$dr{+*E_?>H#pK3@p%4y1E;fGThC^`L)&!7s}b#SNLph)F35`Fb5-=MQY zsAuecC>{@1MMbhJf3vLRLZ~|6=TfR>zA@71>ut00aNp`zZS+0!nS0v6ef{%NK%dp_ zZwXqZ!IJBC?%RK8_p4ZIDlY>rBU&-RHx=M3BJdgcE{&TJ`H}2%rW}mE9y|2vwzugX zDF?~+2D|S~#jl3Oi(*yf*Tz5c7T43n@Q+G&Equs}Mfa4wm=I6P%Itmmr${x!&L}pN z(W1adMvDd?&tP!Efn>^I@QG@SL-g5g1od?@0wp*9|+e#6u0Gu@Qo38NjhH6z-2MEf%VOvScak1M zDede3+?1vG1|;j@H)Ff9*j15QaYOuFNOe!~NH@wVjA3ru8*;mnBos!L^#;)qpCaT< zHy4j-j}NS;koWv&!Fm;~-Sg6OtvUXdN~^SJ@@Mt~dD~uD1?15IhbeSA(9L?q58OJb zsFYN@N;o*?n&9KY1|_>ggO6Q4Et|5zhlHcCx&q5m{=fw_BiUu}&EoK7_xuXlTl~zsa=xLi7MS4EzdVbsQBN!TuVqJ3$K|;* zYUo#j4c(a-@KrJRa^&Z>Etv-RmXDC&>xWr4fJG_EVSz9G;^*#} z2k;%8XU&~Dr@0JdKJ5pDy)7>Rd-xkcmt@mk86j`7LY~Yv#A8G?#47R`H8m&nXraC{ z+hE@FfSzzG?3)wt_!`d)R^r?tEnTGD(@;+G+95$N*?Ex&xV%V?TXWFAvg~sufhjR( zz%^|a58dtzUkN{9&zWr~?B%rhRMRL`)aoz^RC2*n&p0w9w)m1zduH<#<_)fk&#Mfc z-slCrnxUYlnpZ{&dg-|XfZoBpuzQPQ64lvPf9~E>W>mBsnO8V>PSXr)a&g&j_wPk5 zWA(F)I^Kj{A`(bb>5XROSu=|rQjeDPxDySHykq{fN1|aOPsgoHxvb{eBMv~`mEp>U zc>Jpv^mgaDB=s($h`Wkge}$I7Wt}4{e~WRPkP~@BNIi`_)_P9lk=FB%8}G{__S_~* z-ONDANB&!gy#sm)GmE_j{AjAGVcJ$SPW65-9&e~b)2JJJ;<+g7dAt{AqA@b8H+<+N z)9IH#FQHd3w{Z%P7yidS_{nd-h}4$&j)otsP8)f$!8!fp6h@vRJ=L|xbq!83l)q;p zPx*T~$(Uv&8LDv#Nk#)2SnPIlWw2ZstwK%hfn74gMdL5eqNO?&@Z`*`JQjo`W7VI| zDB<=Mr()N|DW}vMKYpC*o8qaUq)mCsS*GONH~yUQ6DCX)zuh>8DANqL*o(s6`_|te z_Ii&R#h6qli9JFdnyk5`23u(VXOQAnMy~+yV4$SpKmKtTX$F3@ zxU0d%TpM{@QKS1#sf~BVuPv*Loo^#gi_@~%<@kfk)JT*8S)FEAHB$a%Bck+d&dZIw zwP-Kmi@a;UaPNW{<;`6{UMxMi=$!TY_aEH%#tY8~oWS83K6L%<($fQaMd! z7{dV`M*6WlYKocOs#V7fJVza-qRmH{e88pG62jf;%mutDvu9bhpNucaVT(o`aFd4)K)7?;ZXxsB2?it2m0)-x zk8;~H2YlAp*{TqQZM1HgPNe6;UVUTZ<>5*k>-kQfa8;-tWp@x* z_>Sk;u8JBlwlZt~f*RUPDf4g@LQJK(T@^#C`^NjnqvJ+55G4Hyd!+N6e$bGH9%LR& zl~74Z*{}Y#U%SatB2c((bfvb*CvS|mRRquS2A_EA6mGMdT-9$rxv}>&(H>U|Q|Y%D zdwsxO^GslG*3VJ5J+$=|E=?^Pw6Vvt%65){{&*rj3c1ov9y;Qt3cBnX8YLOrIyKcZ zy#@AUdaHaDa`Y~bR#u^ayPtiP-S&DP;=N?&1^A9`UuEmxzYRw(n%h^=pHYr>jlu3y zb0L@$d_%g)yi?aH^{N6TXZ_}%XxbBQvfLJq`j7&jncen&|9$b=oW2T*Xb^i0KI6r> z=fG3`&JoNp@(~|{Pr46pfA#)zXOuPe1AM|+srheotQ^|>64%cFK1&kc5a44&IY05a z!KX~w$tuyXdq!u?ZlqfShPOhlY(wL@wUuR8$3OOVwzrZ7i4gdBkA!+!meuvo-&T~c z+Edy|meJ&A%xaV$CBUcUUOw=7*~#kF7(V#yK*{@m=d_baN!!>n^4o)-i^r=fqYJY= zJ<7@L0xq|?s_KjLCsUp=lGr=aZsiQRz@E6sPED1mjbFX*B4BSoc`MH$(SV)&9Gfcx z!+>6q&T$EPR$z>0ra@P6jv~{b(B)(g8+yiAT9bgDGFLcuH8jqxt1P=Te#;BWTv7Kw z!6B4sWR{(0swWz_vob6G3xcmgT4bhCp?wPRV(3SUa;Wn|QazNTuJ*!lx`^aLCTI76 zTk+LSFDd!tQ?I5e*N_X~A!t&a{W9uO4VUNA5~2i`{ZDEt)yUrGo*7w@5M1wj{GJc2&Nj1a7U}G@)K`|D8~?yRJPa0Ad@^UGX<_Q^0`^}1)9p}v%AWO7 zeC{R?x260OWVtD$-%CR8tYJ9H{AePROD6yHPunQjpp~bx#oC6RBh6iNNBpv~irTr2 zjb6_sGqVgKH;2DM4Wo4VY9yi8kG9XF?P*Wm!?4A2!FzySH!ZQ)^7Z>KnqJnBV1uRj znk{?xAKv%oYAm@V-*cdoVi`Fs4(O$x%mqF2_Of}83|i(ruS9nk&=a$T4UJ7r)fK13 zZ~6lzx;)HpJ1q1&#iAkPoXLi7 zf&gC*Q&~6c(FKK?KuPnHe>p0yb?D`6B>0lZHo(=0M7#hanR@!R_ysWc$YW7PIIZZG zqwATO75Yk}X$!GPC69%(jgbnv1ir5J6u>ttt8<0H_X7P>X?af~x$W!sUkdOgVX{=A zpz)C%0Nq9uL< zZHTug9;CZxV~?s*vK~sjcj)iGE-NWP5w}j9`7w@Q>+a3&F- zfju!{A}53dU(3Be^$qZq-~F4Vu9Y#Q_ayYNdj-CbIEMANTjC4KtJq|*eIc}0^K%&{ z^iuw%Ba~|l3woPy#RBU<6WbrZZ{hT^`ZRKlmf65)|*D3 zT-YM1&jWoEFk6&uE@xApPIafaQ(dxXbD$44OEi9+v{_g@i8IzIFm#eHV(=CnwRbAL z^gqrj!EB@^5!>P8oY9?Zn7fmiLxu#Ovs2l_9-38Ba_8@!cXd5*ve85d5?o0<7@lGO z{fFXn%d6)|mnBB$-u1qsS(%yBRiax;e`w+1i)xzbvWzVFy4#a^d2ijOo%@d*>l+x{ z@%X*qy?P7aYnle|&HC|<-3Jcuc>SdpW!z1OW^M=gsL7PTcgv*W;|AXm&wQg)U7XUX zE`g6zU7az4`Yw%DRL0|?Nsd+BRatoRswU~AFjisishelXrx5xgLW#g~~` zqQGZM1^2c+QhX!Hd<4GcTtW9)Y9!yW?=aTV_V0ZB-pi-YuAeuLng~iGf84(Nz@e?L zy|P*nA3x6`Tl0yQTH3u5yq~cr4Q9D{%FAZSV3)EYzMR-I#v{d~Lq@l-*d8CScV?^t zHp{)62z%IFXLx+14sfkNv^!u%h&sd2o?~U!{qeDqlIgYiJwE$8PMA10gD*2NGYPc~w=*spAY_`vH?zW}B{P5a`yE-e4a#%{_@vE3>qYv0aAQ1N5nh-D zKK8^j9u}XwjbNm~cdR{;4}3`Kx9vH2^jL4-&d2Y0_w?Cy^X4_9b*gmUv)gtbIJoK6 zHB5Zsayk8l6!_!-1^SOi)`sbxAV_GL#7$Yt@&IAvkQEfXp;Gc*ALHG+@RmB9}UutdH?>@k*xj) z1wPwmL3)1Zi|>t>S41w(2A?47*{YX-dsvh=lx4HL6XwH)N<5nKsgsRP_cz29Bfe-z z2hp85QhM80?!I&e)Z1Lrd_7oi(UhC{Fckol9q#Hrw&QDegZTiyh&6fgrE9nDK5$^e zt7~3)=>-@ql*&Qq_xrm5avm796%kNPr1h84*%sgnvOpLzz6&T zxOL~gBPY+Czj*2Lu{Xw10OL)jew+55ICpyY_Oi0Aa_V&#-+-_}0K^Mj{NA1`#MG+> z&>AY*D81UGtN%HU!lIvY(@S8ds?tp`oH7v2JAUrhX8n2kskop;GM8NhmN0y zIqrqS^PcWvwx>633IKleuN~)(@07~wZ6n#2NX;^U_$NXD>7`rO7xAq26QyRAql#{- z@c@X+Ldc&-_!`lgB=hHEFVOIp%EacJrU@}koI}3j%WCpdw{9X1u@!N=aY7uKSpIGP z+gO9arfogwwRWA>quTtj(-_16%RN=fK^fvMz&Xd9Z-0f>Lwt0GiY_@UW^*%6=@@4_ zdu)2H%pVwE;rV#9FXMjht?`F{>j(L7UGukQpBX*7yxh5s1dROMD6DAmAn<1q5;z>j zUcUwfKRE5PWykIVM^BzUbN1}PIZr_V1pX4EOk-dF_n~cDwv|Bw-c&*t)gVQ%07z2= zURs8yTin+_iXS_mf!z0kyOI1PMMs|$;nf)W@O5)H#6NM=MlA*=oeq-n=cD@Nv`dQ3 zat@}dAJ~)xPan1)gg@d%m#4hmz2DC>7@~=rR4ZcWRq_zkG*{bQ;p+IO@97h_bd@<9 z?LJ`GVf*BpBPdj=q#`T;bD?7r7dPCiM>|_P;xcmt00qI>YVj8UdB>y||5W@bxrVIC z{5kw32I6n~ultW2J1L!tJ1}c>N5WsSHQG7!%}u3Swr<FI>)KjY0 z{i+*~B!i*JqHoXYcE8AcR=9_wa#w*ZN4vg(pIKf1{criZ z3GvTcbie-qxVfx+-@&8DPMkQlZ`Mdiz>S+WO|e9Y^p*Z{+NQ?DID5~$fbxqvn7HAm(uV(3 z_v!J+J+WaC0H6|0SnDo3tOUt2-eBmk^dFVF z9WViKeaRLg8KJ8B!$@a=BcT8r5JfE415nnC^t8W_03;vzj}3s=n|NVg_ojaU;ldeA z26pY)f9S~3qlfprJ{&SI1@N){ua{5&Ne7~|z$Wq=l^w&ESM}=Ivu@9O?e^w`z&m6D zaprc1F!j*tFEj+|4SjV9rpdc0#BT7* zUmi0UgQK(@}|E1GA*;BUz1#jFJ;U6axRQv&J2 zCklY>uSYnuVv<^u7T9<2W+iG?IancZ6Uo6cfv6I=iW?$<@FU%^7uHL!UM%+XOzi$Zo32j$3I&I$R(w`> zz%IBvU#03mcqH*gQ2s=}OD;JMNqv6&*%Yw(WfuT{9i7jVQ~s1UB;8~{i2RWcx{vQl zN#4?L##N&O;rxjW@DgZ%xdJ0b?y!hfGy?ie-ZULZhSgwr;ma)^;xUzv_+ouSD?m{K ztXekInG%yiB|sQe%ab?e$!7R5i;j;3NbN5FxA;{;0F;X2)EO8w#P#gDC~Q~nDBt7R zAHQeEt3$e&ZD}L{Ki2Q{jk@%K{)`nM2scO1Ts*fz>KWdnU)<2)lV&}_`STrq_%^_Z zU#0LhiV9$0{4oA8%S(1{daS*z^C>({ihf~1&AUzWVMUXKYMLJ6{2icEDhG z!2(dbj-ocaR1ZJ$qMf<{zUAn5tw~s6RUx#&+5%9<4^8M>w(t6N&)&Uz%D2DzWM{%( zs@>A9@2eYp_(NkxBm@=Og6uzj_P77^=+U#s6Qk|pXDu0(K>^fuz*2)6IxB710jmL& z>RPxepsk~L_!AXq41YP9agKYPqgSH>Nd4+`h1>-KjH|dcSLT_T2KXKOc99JyAbPcw zT+7ReOk2yN&(t^i(Y`&5PTz#ra~1tXUg8D6RaT10kn+Lu!=z*t?|h)R0LfSA?yB5p zX7=l8i%Ip}?toLi_{SFTlQm0OGv|J*>fi?+57b)!K>S>V*8@a9f?wIra%p!$`L43p z6#TmOp0UmczseO=Wc-HDn3ch!k|%%aF7>GK#8VRzW-lF;S?vzEQquv`FVaW^7*!uB z;|HCj9R6Uv2n1+HGv}!P_zplQe&oxfQaLr7p8sxf6N4eifB&Hxz|{uFpU?DnN!U_V z)gaZa!+te>r@!P=%bu%5qoKtIfB6l2cGZa^tZZ`mFNQpL<#HdH*85SLBekh-_@m2s zA^H9O@A$h4H(Ra&eX)LWFVeTUY=@^jVb_kbR|j|Hv9Ggpx-WcH0H1fIiNwCGU<^9^ z!{gn1^cXN^;_Nz0M`xlQDp|$mLv6Xz7JnH0)cT7^pDK#vvD!}=f1qs>45x(&jsoY% zA9Tha*nG4m#h-AwMUvb|U7l&aNt{$|x} ze~pGt3%|Y2U%Zk{vNC_f^hdXD_D*tkusPE5b@_v0`xg0AKJz`kEjxWtRwY2+a{j%F z6W}JEqWeKn5%gyv`>rq9ylwl=@^S!h+iQa#HQQ2Q0&KT*?yW=#F%*E?zM5t*;C`=8|KU^1-y!p-G$3x7Kdt@}d;m-bAX#>U zVf@myOn%|(QMCV{_@T7GI`-0Moo(zf8954mstFu5o+|jsPyQ(bkXyzt9)C5rg`d0V zS}6E!-?3vm7!76)>c;Ww+HVGJezyqHi)Tdz!4H`&E8q2H*KUtL{>0Oh=6*UV+bbOM z3PFFy1I-jaJ@rq-lIVaX~S4FE6H`{kTHw zzkOf5Yr^qcDD6i?aQZ~`MWB!VY?SsxtXi`&EC$2t%eMJ6>?pnv`b714%{XUEdu*mc zA1N95zK2zDp2EzA?^voQh7hL1|EtmdLJEF_KD3QN(7v_c7Xp1S;wUTIz8$B$GY3De z(D$-PAJs-BppU-ghG+tkbM8rvvGwfx8f=);S*mhbgW~7YejNMDhp7frirjvPqg0>nH;jz3l)HU&l#0n$ z`P>i|;d~m@w)Mgz>Vy47Uwu)vziCkh>w;ywHR=nUtyBKUt1$GLo?piHZfcLi@tgi< z)^k3qS3{9MOup_KQq3^3)ha4oH2G>Cy+ffNQw{cdl)v;_5}%R3%T3%xvHprbsN+hv zZ1a>QY~8$h_8`D7h17ms`%(P1(%{GOt1Pzg+`E12r(L>sdu+g12!128NJIYp@sTi4z%kl6=L-w?lbB>GiBEV&m8 zDKHYVH{((JJNxB_Eeu9JeG}bRHU+>Bq952#=}Y68 zS;;0t_B)>*LiI&8u0i#MJ>wk+!m@o&J`=jVMoA_v?+M8H)54B$V&GM=X2 z8$ukxd63zU_~*4M{$~|``DqSY2j?U>QZIa&8vcYz$|F^L_fcnqF~s(l@~2FH_4vb& zjc-tr+mRUlm}_nx)0Pp8P1<@GW*bE?B%#;wfWX!r}vAIL9TrLsgc`OO{FO9T){zd``S!;DqMc!7J( zIw=3PZC=u;%cI=@z&Ab}nG+8L8sz?i8xXWBmvsC~cRx6RiUJclfpRE;jo-#GwzkfR za7U7v>E!c5as(8v&|(Pu&*Fgwqt5gfqqo+}sU?tZf2bp%ia>9J<{AS1=r50d^mjMY z|CExI5lF`$^chsQ`S6kNJR+Ipvwg7Lw#s$x4OaO0+Jn-+J196Vs$WF(LnGQ2T0 zhzO{7U;;}pRnUXn&`2;en;Cp0XfX&1*$fcOh_SbEj)w^xA}DSk;j^~)C}y1tS8tM6 zV%9GkZ!p+3ZW1<3)i%H)fr|d3C6JeZ-iWaJJ_u?A7~(+9iZK|5E{3&Vx+f1$Jg}x+ zK(MTw4Q;AEAKf?6k$gWOsBWA1XAT`fbi3681VPM{>sD_BASjltX4*Fi2&S-iQEoK| zUV$3$t^i3GgCICf!Rfbg&OksgNkMS44}z{@2O@~6d+Vl8I(F&$C?GihvynOI%8kRn ziBJdz%)`78ybgI-^Z|+pf(~tjE|^#&WdwbPaIyB5y`RA~5HN z0<+`nO?!|1MIn$cRbU>z2R^TCDM3%2B<=n59jhTKO(akeHMpgdje+k}<{%tF+^JX^ zwv5DX-&Y?H!Di%ha{)aj+B-}1r(J_ zHV3vSL9luR;vYH`0_hggZ4v0d55baS(-vu4A`&=HOW>BRTcJE;hYuvk!tUZ&nZS~d zI&uO>5DW*FbTrmG;5bmX&lvlT4{nqgtDLfcn{Q(LiCi{S`rLkdmA6hW;PsMTWP z<}WIzaa;JvIEo`d5M7qcyK`pNpdMCx3O#|KhhPj5UeO8T4?#tVRz5M!HWWc&=B^V2 zsSubEdkd?W*os_%F^IRRUoA$>;GmxBD5zmD3>b{lFgWPhsSpK$L7IqTyy7?{Xd=d1 z@ES?PzVQSY6vrU}7;Ki{$n5*{_sF2I+z6|qGK1=A-1)z}-&zo4gn2L%WQ4&&U3z#; zSw^RNpg#s{Kw9&2Xjd)Bq(mBW-}q#orgosykbL+XL#3k(<4(LX@KJy;Pnm`YpBZP^ z(fSaI(-3Tk)qP)E-oh&#y#Hko96jA0gOPfAj8t5QI1A)B_{N}~F_wfTv>TbRv2?Q! zgP!7e&fpe|gIyjS^y~|7eKsNwPm_>b9MiDcxfmhTlLci6Sx(Eh=q5D?gsqbtX?@3h zgEQf47unN+usjb#5v0(&vK9P$3US3FdA|Sn@la)%kSU~bB`}48ERz&zxO@JRW4w=N z3*JVITT7Cu{1j6wYLis>Wj7^n}RfA#mW*oj7joG-m5XysL zI$#9|?@x9l_8t9s6+nnXeql2hdy=~~1wK@S#Y=`63^7m;YEm0^QyO8WA&-QzGe!x8 z>aSD`*#mQWW~zkfY~0s)AyuOz3zl^u@4Eio?-&_{TR8L$yDK zV(8Nvmwq}0)furd!KMleTELK7jY)y!iy;bxv@ua*cn8mK4V3dRx)L>2XW~r;=eys5 zprj*F6Aa0Om=&_Srwwdpb@;c(SQ_Dnmd}r~1v#;j{Ub2U_;WDKRAcz|lRe`t@hm03 zq`^=sPQ`aDxi-Tn96#;t&xhyJYhg4c!|SpU>Orw~O9}VXxlBzl6w4JwZKElfV;F5F z7^()v^!v=tX_4ZvI)}V<5eCKlQB|h6;j_$l!-png2YjHE`V@99n`iW=&?p$v_ghra zP&qKV4EkdcL*;Xa*Z1L2J>X_hJkDeo_C6eU&>B_ca44K9^6Z>C@P1oNy8mz}aOmHu z@Qa_8o`yrd*Aie*0vtxFXKh3Zqc8sXyA%^N9Oft-q9DEC$)1Uf!!CWMujk=#1HO2) zl0?HKNN_|VEP0;xoyQ{`STsM^5Xo&b z0i_ymeP7pBwKyc#=J*I!;4sr}G`#r!29NH{1hX>UKqlwOF@l#)9^A?nlPPeh(U&wD zr?13`Sy_)m6b##hAXziDCi72;hjB88WJLV#lf9BG@r6x+!w$VBuPNQ+*;1DrtArth zr#J=vI3yNQ2!~9Z{?6ya3)0vkAxp}3QL|QcC=gh14Tv9)!4?IRvR?`n4FO9mh=#0B zR+svq7pB^+od?bU_YBQ%${<#uP*6TR(ut*S-ff8FyCeJnDJ=~(f}yv*uX!sZ3VDX} zM`1ds=C8e5%DO7S?#-j2%D%8+^5EvS*eorD>|`%>D~X%KYWoad-CO~A2Nek#4e=LG z+bWqtKB4lj8UA?`t|vR{gu?fS^h&kF5egr1QVR3=$yAJm8VX-T3du_wLQbZ#wO&qE zzX_*DA=R;Qx6UO(7q71^DTe)L(9bX!{i#-!J6?ug3t*N7LZWb zd&=6N#dp6LUI+}T6S8lABA(5sp%D8MH(ar-f;(DbDD(p% z{$&D$!p073yFt_Th%KiELOP9wJA%Z+@VEDz1{3-U?cAplLi-9;{*oD??#w7I!I@)bH`y)%Dnr<@?+fcGgzSuwRGdb{x6-W} z-^J10(B}ZcVNKFGg-o~x-P){_g{p+?+nr!OzARLQS_lOfLjVZVV{G>ioVpW@G~||y z>}JK+hg$K)T;-O`e?Ay)FvV$2DSC%I8p#l96hnU$*2DnrZFpBB423=v3bJ)dl;N(K zAMAxtsGd2B6w+IQ@Voi%bAxkjaXCsPWYJsRzNZwDVW~C}D!atREFF7mg=xH8eksKB z52Barc0yrr3c)k;2vWFkm@|WgLQ3K0E$}~+V_GXAA7cqAK=|Gl!vR9yeC)M)Ep_16 zsn?q*Z?y7!tfi0!6`GF)CxeQ@MCLIkp6c9;7~8#rrfek?QiC${R5J<{Cj(V#)_gd@ zV2tr67-DbFC$iO|5X=0KDNK$s+&}B%6Y>a;n=cd!6)%nFUlX6qvc>26rO;eW3TtTW zT$DnwkR=7UdZQf`rvD9v9}x=kF(IodBvQ>vvj4te0Y<`MlU_my$%!3RLWb6aJTO2g zRE0v_-lW1O7KTQl;A_pzjIp&EJQ<$w(mJa-g&L)%G^TukaSx@zCQ{rp;5S!U9k1m z;uO-)d|x#h!efFGC2oNN`)1J_#>vedqN= zgSoK?p-|_m%6xTI$R{Um(5yezNbPqjUuZxG+2ABT%FuVtSMo;|%nU3NB82=T)88i! zNwg(2)vS2Req13E28OVT*+$fV=r*BuCbz_(r|2q7l954ugEgu11O^umcjj1P^JqFo z2Bpmf#9WAjlhyE5B7$8W9sc~wAAB*aDfFFnH1m-!Bvy^sa27HPq~Q@AYg$bSnS!8tE4qWUrz&h!7c6<|Y9dY@oAcB3#)g z3}$7=M;f1;_jljetpq}Jb+NZ~znd^L!Ise6he3JpE!TvB7+eK`kXx6q1>_yQUj}(! z!VUgVMBGXotS*B~N2nMq;S8=_4Pg*`=j-28A*i2=t#_c(LB2}5=oHq__s$k=ODe*H zB1lbL0)kAfW?v@sjPbUd!4u)ok#@@jFM_ocWkRCR?Ei39GeeX-G0~R^$qWn#)E_>0nX_~W1;7p2}5ISi7jpu!PNvo`lySd zLU%`wEy;KFm|nVo4;`h;q1tG@7BF;?mwLi#hpCqC?i1=lJ~q+u7lKT4 zTO`8s57i*?^HF*vZdkXvc;(uStL7kxBPYMI5aJwp-CP!<+X*&hu%e`1F=9PeH)7_ z(PEzrg)?gUK8hjD%(o9>(*$eM(1}p+a}ZGk=Fe(DL}a%>$a{_G?fQCdKVww9&-BE1 zgm)+T(5ge2^rYIS!7{U0Zt2DG44Wx->P!Zr_ft7TLEzc zfQS*%Q!A`?4I9XoX$HTAWRmJe%|OUq`M#->4L zmMcWIeB#x45r^3IwDXgS@C(%ph-$|*RERmvpphIp5!}lnhpXB1Zj3{+hQ~aH-@h@$ z7#Xkkm1;)G-Ud3mCupjv28VK8OU7YbWlFc2lBdoDiAie&k~tJla@|}+ID}um-iJn) zcqjpJW7u`MKoomrZ~ZpJ&B^DE+*1SFC!`2cwof20|F1CoQV+w8>sGH=_46x_bYK(? zZJsCmP2>WRNC?Ci5XIVMZJ+XIP}m~T<`_ER8!d(O^;$w9It+Pe@ksxE^J!ybto94# zwtu10`U5DG$0usRJ>6nTpE?WFc1~dlJ7uS$kngYF_!ucn68_?1G{m1yC=`|eg)Y{n zh!ox*T6LIC@8HInqpEGWmWnExxC-6yHV*DW`45I@9E4zKf?)XdQ+=9R9N8=wuG!!& z&EK$Y<%)mLc%*&DE)WPmUJeNQFi0P`WEt54321$g^)z=8wzF>x8HDYflUHphkxC0Tu3xj_r|Azr(xLNcN@0E;9k2T< z49yfnZL92SbG@la$Wq-XE+nXy6gh>;iA*LOX6M|MWHS$WhAiUgQ>d2Vq?K>HV2pHx zFi8%DLa)Z5!Xz8`PJJn4nGH|drCCfxFU;FUC_HmimqKAr;o1k)q7X}PpK8_}z6mJg zp)jnD*bI8>-^UNskU;@Y$!bRft|en-c#9xbHmNFfK{WKgBafxwTCmJOG(-@;1rW`S ztfr0amWO*jSG<0sR8p{EUGYC&c<7P#okmZc`N{Gj%?kiTRvDtd%eOK#*QUb=MZpf! zSw6vO@_AKZ7??wG1xn_yFv)5jI&N77TBS76&{f=m3)p-hA+4PKg2iOdU`;;DZF+`= zU>H)Lt9bCm8zEpA$lL`OwwO8(3~Aci#!4_G=N0iGXt(Fud%-ZI6DufxaEKyfsNM(N z%rNx8uqv!h7=%MUMR`D*lTjS=y;VpRoBs)h*r9y)bYF_0!}?H<@xQFwuyNytb*sLg z((d8*9Y;@_xoG*276th-hHRirS3;G_(Cm#il9?FHlLPn3w~b+bqSZWT++th^Rliq) z0=A6dVYvE21ngC_rpB6V!7v0%!!2Ui5Cm+DhJi3lwM5=M<&9qfL(T4>8bj9EUweOC zZ@8kSR~WM1J`@bM0EShveqE;yTv>#~Bh_n*Z8DwQW1Ac_D+i2*R%QxX;5Ud zD_UJG=E&g1p{r))9}x|635JUh!)vNzH55afqX?EgY0a#u$tKxZlZp+#Vrr1Ll0(AK z*KiHdFhmSnPni$LK7(Tj3sBcTc((8DW4M)Jh|$nnrwhZ7T>F$=OrhlDoIurKXc)%% zv)It2yjdcG%@5;{!%WP|?Rrl5dF?uw=6ydAF?{L;42CTWfkT}pMU)NA=K7@Jp#Hylh9If zwK06e;>av2s%lbE2w9orEC zuAyqRYqQxzFw_$bz2r&*wHgM%P%&Xby@H*xdM#P*P%s$w8~edEf5DKC^5E5Zh%D0f zH(n?*S@?21{{e|JWf?=c)+g&HXfzb%8a{xe-zggZLkNa|VPh-B5AeXG*0H>S1-3?g$IdK+l3H1HK)svF)Oh#e;{I2jN`=-VnY`5J~+ygXE!>nMm8oi2rdSSbWVe@+|5 z;TAZ|0N$?uPIyA*(D~ditACo<4lo=uZPt=62Dd6A90ux@=}FCKZ~|H4 z$Zv>Y=jRvv#xUHcKCq7EA=!{WaN>`|a2LZ+EDvF#5YbN4r0}e)d18m_hB-O82{MJE zaW^CitKhLuZ&QEep-AE8O)H-t(AI2E$E@7G@05Q{d>H0et#iiXMgZ3vEccPUX=MQXTpUhDp}weiQsRDNym32)>3xZ%(-{(t-x;0FFa! zQZN|m8?bMa!mR9MOH`NV-u}&htNbTWSgxW_QLnxA+v>zZ?(&tBZX2^Z&4a)Qc%FwQ4asF zFr4_2uW-l|8;T(s8%Rz*`qq?ok>(WtenT-Q|9Kd8p77TH7QAdb~r&PLC1>2efiGO~?Ku6!khZ2GxQM{zh*tB{K%;NO>b3 zV5FzZLA{m@HkYnfxICVd3nq8?|A#@%bGdw$$5S$4uyWC){NO6Ou`qmC zE!S{^jixKsdr%$wWDF_njTD1V69-xQ_Qrop&82nQZWF9Xe3@Xb-p3@7S=Ln|% z--f}{5C#FkV>;#<6@sp%lLtgwz-K65{1^IqV(|(k4DJ&U4LVJbI0$b+?eOf1+VR?Oc#k`+X?k43BVBt=oIYpS zvVJWq|NkeD{~&1|_O5KE+4McLU{aSTOENWEvn!xJwc!7bz{?>Jxcr4-eu5zEK>7Gw z<#CUC8Selguo7xPc*>8h$0L7_U>@c&Aq#;Zv^ z^(5W^F)$#2xZJd&m?q*aW!rbU%T2RJz>~;nO*0bH9_u&v`PUJ@ifZAf(g*dGnLj)L z9^&}n+aa#v=EPYjoH{u3*2K>LXY{3_%0`5lPS3o7oyZMBAL}UTYbU<(@5^b`p-OSG zs->dlzO|r&;6`{Be#frz-MjbfnKugFMNVs)nV8c3yUzDK^=6-zH>=eSs~Ge((%{JM zhRS7)Kg|Fmy8!CoM0{t0t%36GJCQ;8i?(YV41<_j$`MZ zAPk<#Cw&4IYX%`-idP^M?hgGa5Ym?;L!6UjWv5u9JB*oighEIkuvf1l za|o&B;+yHCu@JmH2oL)}DBT%WuT#AUacnF^LX}3%uBwZXuz*1LB^H7Z2{+THbg>fj z51|_%bQgF4LN`RhCV?T`TDG%%&%XT!4lWqe*KA8|3M)EW{^I}&WAiZ*dYh#9x3+Q$ zVG%jd)R-O<#;Ng*aB&kk2!&*%uH)viL=Tv}1YUj$MB(96^aR`gghIatYdWn13fn#P z8dwVH;n`h&(=ny+Z_}T;eF~2V6vCe$+7YxAN)hd4QHITo{fz4r??P@Kq~ikcE{%F_ z`K5Cw5AOki8bt^^y&o7t*f^0PED8eQ_Fcd3-GAWFQCxDM5dI>qj+aa|9C<~R!7wD5 zjh=?q$56cj`UhYLVpWnQdf?R0@Jm%+s!;_)z!0Bz_52@WNX%TRHgnriuk523!l9aN zrR?&oRvV-k{_x_MD06~NFyvdSp)7zNWf;0iPeQ9g>`4fQLQlfQL2>&|iG@U-#;ULY zIUG6hv-78p?k_Lf#Ge%pj-k7tio`;lD{^90xOIE^?tKRi9Xa;lGXoLBbX(+WE>CGP zaA?abs#0;tDiyN#mhE-al#v?3?&I+(q7U=H>SoqxVG-W(klAS8x##_%{{v8tv^j)~Om-yuTG&7x4_ zJ3HnxI~o-8!CyFL;^)T>?B0R7nU=WT00p84wm}sXn+3_uJIVpYBS%jx9uFs@QktgQ zEzbEKSH<3ZU@8s$7NBGlHNA?b4!+Dt!{TLsVbO<0otNdv zED6%{u<2jREVAZJ5N$Y%xQBOq&e)F8)<0M>44K8W#vpxUH@2Ja88ID}l9@SA`1R0x zhAOYM^wUcd?9s7)kNt;q*3}h$5?HLLQ7N-1vDsYn((ywXi#;ao^HfzFZtgLKXBWBE zEOIe{OCU<$>~|SYEESQ(>+t-EpA;P;i@CX|rA~)qA>^AC?p(_$8kh0-PUzv8W79!qe}D{)bF=8{!~f6tf@6CHEAES?fr zgjhfpld)C|tKVDJMmVe)ewxAPuH~sM!Uzg)gS)UCBK0C9 zY1X;;QE`;cB{$J1nHs#jyZq2D5OFw+Qotk)=W7ZOMt2i$kuHp@rDAvqRE81j#iiqi z!(MC=B7a-yD0o5Gu~E_ zg>9YK===62abZH~@*>vC-{syprL8<8l=Rl?86n zzWBZ_zhN!Vm`n$JypKM*>&(L@{|Z1tC2 zIaD{(G&o)lzYdxD_GpAcdi+ap_Ek~p&=c$@IQ}|g)cqmR7|erRT^fahN?9@1{K3!t z0yM&+|7oOA@TjSSBR;vi=JiQwQFhgfjpDAq5F7*1ct(dt%+&Y`@;3A~@*2Fx*0gM7 znVRc5g8h}ZFeoqP#sQ7dA740o_RLQ-76@KDSX_F;^M(WN0y8m=CCF* z8qZ$8R#91T^U45^DXlT$sIxDssT(D07`_!H>@CB;t!jIo_b?SuH{MXusKl8DteU|c z52$7MZ6&fVL3VbSpA>u`ana@pFa1+*e4zwK`N^9dFOFyfQ>5GXVk7s zg_puOYx=-v|A9bWC$45@DRmbM=~~#U*))4few0lEWTJ8mg#j7lCCBr`k5~z2FkU@M z#0rK$hOq$I29NUKFNx)AZ7-v;L*zJsNXOrh$b(xsk(D73SpoSP`)WT#vbP$+4N?9p z3<38ql8Jo$={JA7di4r8Wv@R{#CprBp9^xIM4wu3^Xxan0kcWP0TP5tCN*&XK}o4juezkmGP zngUWe1#m$_Bo}&+NKDxeU_Yaqve_Cb`m}|Von?dnf84(>oWF44z!n8aPmmBVkN zf+RFF7$i4u+rF#(S8zuxdTMZ-C7}s4G>?s$fBMRm%a^a*^i+k-^q3ka7s^RnI76pN z+R$H{$rE*OJ%)?mvhqlSB+c5Dp!UF3s@p~~J0?0|;*6gW$x9mV9}AN7jW9Zq*)Vlz zGm9exB!g|&2S8H(A))zM?o^ehRPKSB$^)MM(oH_H>L8*PNxJp5YyQ+0k=As@C&B;Z z97&7-eDh0%BuxC_ItA?1LyP^pE|OA2ZLE(PHhNI$v6?-rW<&v&IoklsvwJpelw)NTVCi!h=g8b= z5X&ae;kXLi`JQ}m^@M^YtQo+ji}|CG{Sz(mn7=y@pLy`y1pxE%mFtxfgoeLaB~waV z9_@3)OR_ZL2+{IRj-_w3)M9y-9DCMY2BuB75-GVz2K}qpE&!65_Nc7MGuJB(19zFo z(;D%0#eYp0lx>v{yWjH3I`xD}eh!lK+$?+hC9*KtX6Zg~=2<~Qg(q$J(;TGdriZ}k zgDajhAI@kG2P`l-=|2fY05 z&tCu@ufa0A)LxAw8yS~kNBoAoO^=<9am@E9Mz@t*6J@bw9j zDan=tb9LcFgmP+Ip4xcvyev~Db(mm45VUD!dV>2+2rE1AL*Ew; zAdu>DwgRN^M4#uz(pP)H3L^qZKDN&e83IXfk+MtM0NR~3pa9191}jN7JR5Ue1`=#7 zK0u;K9%j6QF6Wa{(jfrJb2bjN$>k;hvM~Vpz@c;Jeg_~yA;)2MMKPZ9B{w+u;eazJY}hpDbbQm zF4~c*MtFrlh>;Owu1)?>fpazzc_9dqs%(bpi62eJDt#+O2K-PAX?pM0u%C#P_Seb2#8DrBHJH>5P5o+LgYuwfhn0{X*h>h3$UGzxM4(N0*bWYgEgaq_%@S9b;jp&r{oJ}=_a8oX>f8m$ z+7*ztC6BZ>8`c$~v!r~7a!1EENY+Opq1x7plVaLNCCE+E_C@xvq1rzKL6WXg(nJyf z$;Q^md#1g$7m!rnf#*o#tDxKYv*I_GjOq`s)7~bM%QS}}1th% zNMW>1hc_vJSiq6a1XNTFnkkIYoAEt1D|Nn4}DNUzOnZ6K>a zByB7GHgtD)Vj-yzc}YVgZkIPA2gU>sjUJIWNq``kW{G@o`nyMbY%~gy!bA6$7YylR zwI%Vq&7%$X{tNjp&=q7Yk#v2F1W9kh<^i2Q_@OgmY^|JQ;o&rLl18k36(og?GwC05 zN137%^cMN)Q<5PdSp@>{RkFyB_FT-{-a9-(AxVeZUQ@cdvEdSsoR;uU4uxcHb}|sz z@3*sOFPz-LW%7#R>!hubgZ$~=uimV3xpuuYqAkc9Apf{SK@!>;yh01_I!l|qrLiRo zhxKMiw&^+cKby;T?m2ku^!ZCyZ&p;nbs8!BbSsFG#tbRXCj4jtNpkIU+(ezY z0Hvp(0^%grk`gvI(B)}fWm~)2Q=G+_ z#J9#vHhwg$cLoWQ7GUzH4W(Om>^^wxw+ojcPP*Li=SjNoAP!~H@$eW~sL_d&Uc0}{ z4ZR(l@+hNih0q(Ar^f45w5{QXg@BkIY+w+{GzL$u&e^xxXBZo;e(eYPM z;0dlNrYIfjIR7Pi&307y{W6K;n+gzrugKPM8YlIb^hVYq9!bd>2S|$5WQtf#=4K}X zlFyujIC*RvpWRdxU*$-`?Mw26`n8)kk4*2?v*!b88Lb$Sl_YfsK(Y=)65rU(+PHxt znGZI;`+AN22fmTFefPl=XD?p40dW$L^h(mzP6%b1lxvZz8{DF2ff7yRjli468XU2l zRGhn7D3!;*5XxxbNSn~U>OhGx2NFqcvf0$*m8I7Sl*A?pmOYgCWGL}E=)PlT$$)PE z)V}R4HfABmPp;knm%rTrkMGhziLPC>a-~2?{Yx^GY9+OGq9emO;wz87PM(hi{)SQk z%GL9xnU84lL@2(1xnvBHwH>KG~H+X04X(y;4UDn+r81r%ykiEM9hfNfto3+{f)-9JB`flS@>s-pEQPmrOE<3nc(^me z5=(gO`SkaAx)j4%%*;?ec=Wm!M7_clPW-#Dz=(kllr!`+EcYTkiD8I zwyu7jCC68I5lFpxq83O$L+*A-jwI)hMU_M*KhJ(cvP{l_EI)YaJQQOP2iDG=9%r%% zR!KFGR91*9`TpZ)FJ1n1wA8b<^T{U$Ki?aZ_Rai?d?|3!R){PuE!nVs z(Qs!rC9+MAF@G;EUbS`u$hAjKoxgky(>BzSfMnGWkI|NlzGnKZLccAxH?`oq#aa^H zC}$cF<`en#H9Vrs2RAft--MJx-$zu3n}#@e)x=0YhXE3!O@n8_nvHVMmkQ+qlJw0K zJYBnGeDC|L4lt+bO3v_^(Z4_xXFo`~!y|D~kEBzhapX`Wn_Mdl2 zR?6jC1BFQi$&=^lp|X-UUP?7tMJo_VN%9j(AgC&%c~vo~2$Sc6B3YX%Kwfhb658Q& zvk%TyNmfYa^vlTFG)B5hQ-R0D!<{*n*gVYG5Fz22m*O=WHpAfm^m(WwNzRreZ@7D$ z$7oH0o(p;8Wu%<4y)kj@wQ_wRBO*LLKteAlKgy)&S z;H(+zY-Ni<&xPKUm;s3%uZ9dr-@UI;f%H2{Y?0!yb$3pK(T#T3ra}P{7GgP&+uwdU z*Ju%qKrnC;+>#VX_#u(cEp|5wkmm&;B{H_5osAMB>rf!gMMSw$IvXNN!f%QEm`ItF zL}mYyZ*H7cN5;iH!{sDNUD*RzpIzeuzv2ErnH)vM8yFk%%PMfM|@oQA2`1 z7WG?Tzs*NCDkNbeiDy8Kbs<~IiH?ghJv)zj(^N(;j-+b${=Z|KP3`iF(K>Y`_jomo zz_A>8^;VdIpvg;%q$E6EfxV4tc4PN_M6Mv!Ve9042CfC5qnzD@B}aG}k?N-oqVhvn>D~629QzMxb>ynz z;-06;o2CWwTu>OzSVNNB zr-c#S+HC@$zKbzxk&Dz^HiAc%TUaWBpcI7-_<0 zgG6%FEHfu9#@^038uw!HMmF3>?ijXy*M!Gg>W}KA`yx$u#;I zZDUh&(T7GTonWjjHK+kU9|@G7J6L=~Ls}kuY{4eUU}Rlnh819Re1G=r`E&cx2Tx~+ zmseDhd<_!`$k+Q1{P!`S@rh}#z4P^l-R>eyc4fYl=gouvBxPj4oV^}^Oa~x89nm}A z5|c}E_ShfStc8D8@yd0jW#tEs{r0;+r2Ruo4zZb}iqvH7x^!I|%Sh7Lh@Cbk63a*` zlhY7+p$0ybqaNDO@F;tKWFqxkl9A@=b5^0ar(PBih=h`cra$*rBb*tI#Mb<)ReLRH zDMo5u(Dg(j>%feOdtlY!5o0)6YiAO!gZ0&$ZGzBitli1yKHa@c0>2J5m0DC~5mk6fo(?WI4u_ zIHApL$BJ^+wwaNnzF`D?dC)(yk^e&e6;{?4LxA#Pg%d zy)z+5D%yZl`ImV;jL~Gat?Nf4NXm+p@>3F##F33?+Vw@Uo{Xf$nhzPtFOpg5(ST&i zYD99ch-3xG``DIXl-%`o*KUtLKIp~Q-}~!ZotmO!SAw~=JI|Bn0y$Cwg*<4KL?S;Q z*}ITMNhH#<&bVe(@oE%+)I?f;umF*^bn>H3CqS~a?Tz!sdShzRW}6HXX_UmkBQ;VJ zsfgs4NR-4zTVer+5XnZ{bo*H$Qfu1Hu$od|oVO8(R6osub5`=ixu7;*oY&tO<4C?g z2$4Aas0NX|@D0Nt>4!*R39My8OulpQ*PunpY87)xDnx?7EL+K?zr8uYNN3xuOk%$z z9Dl-WI~Iea4v}nX;{olb3is`TAQ?fCq$^-FN(!AeSxh8HakH};M*)%a974q0LXLp+;rG*+wKK@XBx3>hP zm#xZbrZy;$qpC;4CXNOVZT9r@W(|=uOR+FsG(C2`n-trpLa$ZqvB=3ElsH< z$#mNh2uc(rF?HVv3Z>Un4@cV+N}Jc7&E+5b>|$?|m1Y7c^R^?DyVX!yi24KFcG;Fs zx^(UK*w7iXKKyp(Lrsfd6A=_iq|yz6GDIq~fy%##RQ?21Zdea5pF{G7ztEmTC(c}? z*_)*A@R9_{5N>WPW!8s+l4ftzfg-?9UL7v!l)IwlHQ-X4zP)rE1pWZ{8-_oY45m64 z0+@}>#%8a+yO(^+r-Y+uSW_wJC*%cE(McGdD!b%J3UOqNUdqA%JN&%etfjCJK{M7WmQ(4e#0wI{6vml!RCb zPDu=wRF#B{nX=ONJ9T-q+wd8)7k>M4J6N^G4DNyDhN|j-X#z069Nnj>#gR?JbiPFP7 zK@~M`$S*%BS`Z;q7<309Gu3Ro|Mi8(X#5e*QX!cwX{n>wv`e3IwzJ2i<&cEv#UDyzXJUX{Zq zys@X{iQZI8tr+5plyb=Y|8hmrR? z)oyKMbE%*4qMA)6o%;%vMW79JbdKDLY-;wpacdxt_$SHvOL~}E+VswAcB44V(V!V@ znB%H>HUO4h0}Oyo4JejeH}}SPW255Yl{OqJ5il5JB?Fdi51%=E;q*?D$>oR%9S_za zfaTg*9Xoe@bo9$}KKXXa{Y^QS?)*x|CAxy5^oBX`kfFk5K63e2;L_~KA~AF9KOvWI z+z9D>^~x11*Mi{ZOXjgA9z%na3=}MRHuomhPl)#gQ*B!F4Vtc66;K4xCsMHY2^~z? zv6d8V>^^sSh3=4%1WnP1@zXG8Ge=w&%jP`z(6p$Tjp%{tf!L!3Q>t5+n@7Z$Nw`!m zKcte+oRc2wc)&S$rQDA5_a!lAGA@OF%_D7lcV?>5EX;HWm+}P+qvmsiLWJ87Jl1=l z%sdyA%Z6$$9T8-)n{g?n-od#{0xmlphj4jnC%bFPGC5S3$R(T!SUsa-=PupGygX;o zHxut`ssU53G5v!H8?+cOqY%t*$8a#)^nCh908`p%L!S+dz)^|@GC?O2#7onemN?Q* z7SU`()bv|H^Bk)(17hj5XW|^0SD7TOWJ8si7;SuF{&&m)CcJnh$4iL$yY^ER(Easb zXMRiqZ-400qV8dqh7IcJO6hu7QsFW@qW;~=>1sd1B{5RQ$Fy<|_yMq_x3H{NCEccK)EE#;+WlOpQ2_^8L{qPl#c8-~q`?xxr8myR zuvGf-%tXMl=V`$52sU4xheEQ|Ni@$lMwM4MQ)(7Jy)R;Vv2gR}w zvHb4oKCK{LX2w`scYo@8jF%;#u&;%H31y}pmvt^aNVt?T>hdzvK&Lz^E`7Y`TrLvp zOjoT7@|$M#EA~dvJPyqdb%2>IxhSalo`eQ2boTwsrQeowF8K_=Bb{72zl|}93F?GP zmd9z7x69#@)*rH6YMk36E8V)=I zWS-crxF|W9WPxGRFB5>wZsT5_xAd=L?)4y~c@i3#!x1kIe-NaMtJSE8~`hk5jsDQc<&I92n< z3p1V0_}J9;BAn#cge|Vp;nFrj2%5^YM;kQ7${1p%uF+R58FfmDOLscoyv90nVbKlS zA7E2648Qi}f-c4=RMvGX5Xz>$j*0CL=JHEEY=Y&QO?ohBMsf{PU=xC7r1-ELNm3aJ zz-HKJ>1;hTokNf8)BC`>*MFbt0Bnwb`Hf{?jl9R*^v{S3?`1q& zbsr6QZj?%DL9MxFl~ink@0aq4hIBq7m%KG9oS>Z7Nq`m|_>@vj@OvhB67dM}lvT~( zcwQnINBpL}a12t^+0B+5R<`k^PUS(sGs|Hz&Ugne5x{B3Bjhz);(TB^olJhvuZZTb zLld3d?J=os)OgC0CJyz8oeh@^8mjQ5=2>29swY3ZKE8+J$pgObNA8do8|QRRg?H!Z zCx+{P{C0xOCn-Z9+>`OR^uzo8jgg7^!$`X|IG?VXS9JKq**M*bkc?4!e8xc&M6_6{ zXHq`nF?LQm2VS@n4f zgI$JO1@y;f`?faQGcp~PdwP!ffdE>Y6rT`5BgyG$Nb$Q5z@pjZ>$3B$hG!fQS~spS zCG<|BC8<+uf4NXqrTIz5Fr${aCaZ3;(PI6 z=Yx*e^c>wOw1!Zf{W3fot^lgNiKGIQcI&E=nRe@i>2Wa+I|rBfQnbI zqzxZUF`8ohiSH%>P_A$)?K<>A04O-G;V+DbD%BQs9zs=s-bnx@V@fZ&IYdCy9k|gs z9{@dnSae^~zKASzm;TTL0PX(#t8Xp;{0RbRn#WYT-MA7W5_}F`$ef~~bcR28JfIsx(D#rU!ScZy|ONgRd zKbmPW+Q4rj={>9tZD96Kq;E)Ky~<{e&gPy^5CR91)4dJ3ZnwP890j7q6C`0UUl zHMYZSByu67`SXHhT@Iq_K(df~XkiL4I{M~(2&1qio_{m1 z5<2)$8I1!2`?`NU+wVRWMJb~tWYGeXrKdO&{$A@Dqp)KEmUdzw2Dj#XPovr~gwO~w zDWrg=au-q+{LHIJpG4Czb_-IJNLX;B9+!NO;Tvea-br!}Z-pe}?LGx?wazKs3Rd7!Qb2eF+h@0iw~LA)*Ji2$o?vi~^!xw+BRfPJL~`my3F} z07MHCJ*GO-Dy~fgH@?CsyoMY|mB#{&#Zh4NKNI>r0Jm{5)3Z2Q8jl@5?$AIWEhd!0 zQ1jRQN697-r!@Ry2&A>_Y0xcs(^wz{6UeP#`a5JHI1fx@d8wX>weq4xoacETM3bY8 z9p`_3Nq5zPAW9eZNLhFFEvGX*E~S%LiTcx-*eH|7BK;Uj13%tlKtk{4{T-{Gd9S1@ zO}eIHD?jtHPOnr2vV5*QE@Gz-r9B_b%Qi-(X(pNcW0U(&qH$9;2ap*o5_*m$c}geu z5QF5$w#V_vhBw-44udkZzJe$GrHN~W-$~C*vjCp9ZxBy35tBxqj@P{_qwu7``i-R< z{(^iur@j8p*9*HhM?T>x&pV>txac|318y0k)H^Srs3>#?Qx z`k!vnIJyz*QHY~IKiBU;F^&SIb@6{k!OK$|MefLu$D<&Qo&!p`>p1*Jv(%`DB{ki~ zHTzqp^s*dBX))@p&ncyjG)Ac)*kkvR2_}3H>?4iC-uo8{_TYdQ791F*OcOmpM5mo2 zoZTF;Y1{$Ng>R~SE1D?nj1@|;Go}Xk5GeKE($k%c*6H!FU7Q0-m5vFY`XhrR?3l=H zGZ-Xsoy;R$TE3vYF%qx4@e+l9ZgeYo(S4)RB7jotnCQ<71L^M}1=1R@VlG)5swqwK zCdcqVnvog}lqM7-r5c~HK%g!AE;xb#A8Ywvreqd@~9e)SNN4!Gn`j3&+C(wTUMh8M_u30ig zr2KN>%5~TKW7Mc}ozy?7@eEbgC>2juP<{Fb$nvGqrc~TjCt(${KS}>+RH3x0456j* zFg}W^l_KCuTK($ddV~BuQ72L3ijz<_?AG7o$j-^K8;vh7NAm-Q4E`f!~n^$IzfzT)y0bx)EP-Q=4VpnO2g)3bV zn@W{>Rf3yzsFZAg_khax9XWYch3w8$sZnjyZ4&FQ;{tKY#U3!^wE!G!<5tTc$YxlK zwmA#8X~GqqkKU~)Q=~p^`?b2meRwMp^0u-xC4ki^DDLB;dxh_J`rNq!kz!pwQnP_PtKUN z@Y`400kPplnee`8vz=f`x_R}$>rdYbvB2L(7GqaW>E8j~4q z)c}fDsF6LaMz-eu>_&}hG%_Yjjl+0RAbX)g>$0#YaM!skE72&Vdg~j64vPxsJjALx zYA6WOqKp~yK0+mx-K1fKAl9ywS7o8%BFyvC<5Ihd9TxAVeZO`zjjHc0;Ppy1uS$#M zjQ}N89P%o>syeK0Y4M3p=h&mLn8e9vbcoo!skF;~?8<9p!roK*P7I>u+FjWEY z(2AFs#?k*+rCSnsVYY-ff)LWNs{7PLK6Q}5mz{aNUj%e=0$;2 z9H!;<#M$4k-k=9;V9T?{@uEgh79`y+u2*ZjiQ-2K0u$D+#ASqnfC^Xm>eVYtDUrtJ zZ!S5)G%ICIQpQ!#tPYNI_KJ&3Q)yOy1%Ze=d~Pw|aB7JvylQZz_7nAdU#_|7aO#1K zgxE)&{Yppy%U)|GXUJT|_?`(Au(I%f5tLvM{`W0?JINT;SRdCYomz(XS~R>?)RJme z1jW@60N2zyBEML01J&MG+bow6MZ}^zOq=w_SHZeNRBinr)|j5bT}leZlG2qg0jr(BjKAocN%tYEsUDNz3H-xfzXCUi56)J> zS`oB%^+mOlQVHN&Y-Q5+dS%~4 z?J71;p~Zl=K_jtv1zKT8QDuoH-#kvO5+jYhKlq-Nf`XET8=+7QF#8m}--6hxHKm4M?}E4{a9q8~#K*6W ztwH?K?z$I+xQgd6RH$MNm_?Tsd0-_A8h~m}oXI%y;}w7^U8o1m8WI9kvhHTzIy>K5 zxvZD7d0bNS(4>I~|D=jimQ=SEaR6YoO{Z6ap25yisA}!UQsT3m&X;gSluk30r4mXi z|8?unh8L5r85nXvDSV%&S=DaW*=5# z9E4SF22h$Tg;jU$8&CuUj;irNSZ!P*y>T3{Is~2ke%;a~|9uKr?eZ+RrN171FR+>) zE19CA-#7r~#q($BjcxMqM(BaHKn|=F)>j5}g}@4L%(v=3>bsK7+jf-0gRFaYm+vgw zilG%pTC@}(>#O({A(#OfuGAk8=Jmp9#$i&Un1*ps-H@GUd0ZflUjqhL350>Gb=<%! zc3F~|SDsM`ubN%gcx|cICKCPR`tK4N# zEl6=GMUW+DaqNnk0Ogf?S9p^ZRu6dfGj>(FEK<7MmzfyX$?06d#ssGhs*6_Om0Ta@ zlVaet?DJQR#9jp-TP3?fp=A|CEY2&@U1=HM0g12*B*MVJCIkaEJ-l(Or%~8AwD*e# zyjdAQ(sgO+PeTFNt`pEcJ^XGm%(6?SX#3*5hfiNPeS+KttDYfGj9g>t7w% z4Uo-_wKeZH?5~*WcklJ=kJ$U`uI<}4(X|5)X|zOQHTKnT=~?78HXyHLNncq2fElNJ z{R!TSxWirdW*wItU$Gc4VBJc)EViua2iV3@#>BT4?-n*p6}J@uR*(fY_U+X*HX-8y z-!ERtsr&{ReCxQCA1bi-abU$ROK+}Kcvn(<8yFP8^T9s8e{8dmSd?AiUiMk~ez3In z^LNe0Xs}ypWLG@)ZRW&Mr-1CYq9GQihL?iSnyAnUx9~8BQM*602*9r_Ei4AY>kH?= z?0>|c*}wG1{y=ND=U$or`SK@QA+5O<$z)FW+kpco&mKN_jNKeLjIU$bGjO%9f*1p3 zvw+_bES9cPX$CIwZFn7VP034$Y4TvFS*u`pwRiu)!-o$Y+`p%M2LpDc&~B0UUbSx4 zFud$I1CfoXKC<-nBSf|ewAU&?R(bA(Aj?ZZ6b48Ei}8wBg19h{odZf%(Sl`%QN<)z zMfoG_EXGpP!2T0t%kTSMy&jB9%qr5hT6%i`As~xKtmuV-uzLE)%B@x+bS?BVXLm_S zD1;j)R}oq2ZIP8%8Cl`_4oF$Ymw%9DG^J{k0h%22kmVIDS}@&pP$cB#ma^QZNUllx z$igQkQ&>dS0RsZVEYx<6^5Mr~VB$Flm=fj7OpWXx8zYJOO zU}3e91s{tAa{h+d10MroiyEgid$4WWIcvcWc<88ftl`na2lmOx^0ELArlBE>8n6{} zs~3oE@g`macLX37I&aaFg_|OMmUF1g|Wg`{}0}xcaURjFc5_zlDvvtJzCM#>M6CtlmKY$0kn22%tKlqn!RE7 zfg{IHN~ap0IC^OR?w!0OP*<_ChY;@FbC+w2PmDmH4TNy9gcS`hL211Lv?{UHNXr4m zHvqVjvoTy8Am2UUnj3F4_W9(WB)2N}k6{Q;am9X%oE1Ui!1)(@^~#D*c}%QdeTQ05 z1~Lyb;;IZ`sm~=OTvZL1Qoxeu0UyasjPK@juHyx)pt`!@7lvaT;UnXc)qg+jV>HAm zv1VCmv1{*+HOp4xc;LQM!fPM;ILLWeMX!M@Uq*mUD;#m> zkRewBuophQ8V}3uLm#+r&(3Xa5sNq>BUo$d)rQYh(aIJi0kUcBLY6&XqZ2HDFT}{a zD&3WC%>uE!Vi|~)9TziRjc;EfwmdsN{{HuthII(eA~DD+D_>~&`PSOud3mlYtmAj_ z=u2qF1ve`^V&5{w24u^H|H&AO@hXZ!+c81ks)Aeuv*sEC)(Gcv#LAk$cWv?MuADbI z-obMNArYOdR9Xnva|5j9;?Aoi*u%dQt=)9As>M+#m&K_-Yh3a?LaXVfc;lj0c7FnB zTCr-yd_wE+Ni$yj==Gte5nA0!Lgt`fckSA@W7X1cR@2Lqxcv2jBK)>=MyVNEI>PZrmnM^IZtbvdBr;ldEJ1992YHDR?CF_VawOp}K zSsFX8twbFah&4V~bAqrfznT$?TRyI$6d*P|_HRhHSPzd|0@)uBWU({w(#J0kL4Yu# z8moa>S8v<3=fL*W^-Gtn#ts~ND3Kn3mzWJ8qisoOhc;a}E2Y*;%p!u7P7$nGHxAE8 z%kOjd{I{NXPYNO*w!@)f}ehUGuQXkJe20dE{8yGc*-oYWzF3F@{ zh2^B%hEZz5vKz- z)YaPd(d(HkI}qY(p*EzM0n5^aOv5r&fJv5a78=hjS$7CJMr?ONY!VQg{iSvwI^-_7 z1+nj448&rEVD`cnD4fm4TG{vP+P(L{w$(TRxoq`XKo+{pLbIWeP3sV{$Y53ACB+p_ z-B=6A_CD+G1@Fw7dhZ~d$(XSbuf!ie-qd*H(B3eZb$|kB*v0a&yAMK}MC#F(vNd_Y zY+_*;q80a7n3%O-mfr^Am_5!g%T+-FJ}3)jk;`QBSZg#7Mr?6He97z&w#tdow=2b= zdeX7Lthw!KoKag_l~;7Rm~v4lPjoM`wp!b+=x%~!>Dr2%97vKi`YxU(9AFw8$j~nH z2tt(1r6mP9IvkrXxW_5ggA(1TqwTU>P3A194&}7Au zE>OD#bi^pv$Q#wGkMRReFwL$ z!kuT_hFmKjl2^8e;aR0Bxw;$o?K+c=x_YO=QYOo*8k zYs4oO*m75GZBd?Uc$+U@=POH;G&;I7!4}(Oa0~bgh5@(*TpDoHaxrV`es1?@X~*&( zo3uFEwv1<-R+tAh%W~Uv*oZx>B7SN*Y=yTaVp{%B-yIb1$TJ!+;|G^w3U14{1IU9R zA|TlM(SVU@Xi%;EY&*;nGGj|Ejv?3*gSb~70M&*bH#dc~UnSVy@bF`=ESz;QMPDm( z)P%g`=lAT{e{jnx95r416_$M30GA(J;{u@r;C7=!79x?AjzrdTH`ivT=2h3!{OR`j z?>#kj^k5wOe|Sr?;*D=@25@&0aMy?%Ml}CY=mkFZA3;%W%Efjw-J{OkTn^wm3Y^k9 z2nB8jS5<@2KA1AT?m^Q78?4rvfSajhxk9LmfScopuX_)RT=F!Fo+${{_t%>+G_ANQ z@O5qN6}kB(7ZGQd;OiF%vp3Q0^BEWPQD}E7Q%%TEdw=iV{RcO%rmOmRSureX z>D(_4{$la)#HeNAtnLWAyl_ih4p6Js#P+-8!}p(_Hs;D9R}G!G#jE-ge620V7;e`C zx5nI7;m@LxN?7~T#;v>dcQ*%QlXuquxAuH9ZrNJ5@dQe{uR8{#8wF<7SSm}pLZA&< z8q<4B(E>R~K(xRSKk~z6Y*f2jKb1~77=c-1isYMvF+y%ZRo_rmE5-=S-lX>%g}WIY zX7crx?aem6frV;MplUrOb?ySF+8Z|st82GuR!fjArCyn@$cjfr)$is%6z@pK?^8ln zUpPp$K-Q#cIn^rN$Uh{SHRcEW+3yY_+XAwk@fGH)agp}wpAI0g-7VxSy0KyK)zcRb z8g$96bQXQ;`3$lZX=*}2&foX$J8d!Gt&!4m_5t7--AS0nQ z`_`)ovr0{2zZ*aJ;F)O;4!dgD@CUbegTa8`+j8vi{+(Mk0<+@yE9crCf@^t1HrkSr z%{_1?zVWzF%!<=(>~dQ>m{nqe(Z{<7LO$Ide67m>t)4H?L0g*Yh<|+kj|zWv)Hq{G zvKB;3vKFCO%)VND$EMfT_Q@-{L`)NqgE)b#?GUu`?cRuP-Rbne$;#SGN(=L@sH^)D z)`1W;X16N{(2Bnqff(T(Y+CSQf`gB1Ej?sTc7_gG)A0c|qu~!~2D`Puk_knv8ebsK zvY9uz#GICa7MU&8X#;4Z?EP>r{m{PkQP#`U`kukcuO0)0FxAmM5zT zg~dzu?mKvJ<0=StYzH!;4Fg&~o}wV4?GUsi4=}@GQLS$4*S&hj)p@D8)xnzBGp>6d zm>pL)Y{dH;}NJ=P#XZ* zQ1@WZCvO)y;xVpeJZp%Woa{6SS-lezMM8`f12hO{E~1%ePa3j$YFsz_xm&@rxTPM+ zi*S~lwLH5tcZ+|lW9H?0ueZ}-#y?;OLE8@5g+M$%CVR;rl?MY!anKBoM zW68wU8+Tq?0MG_%3eULay$_$AHsPA#wY7Ksir295k+w7)-X8|E(HykMAg;?`<@X3R#- zuI@YOc5TJIS$Uy`;7V`jU~so)oxDVcSKya?bUo|8w31i>S0QLL(-aJF6_;m4c0+*~ z(;Q;P@FYx>yuXfj<2!5;9u_ufzh!1`*UP8<5h{O2E?cs&3+;wK5%BL{YG z{nY?0Pa$?=fF+{tA%e5U70vF!I|+i>#T@`P>_b7pm}3B}L9c2&2P}nRSVUUOcIqQA zF|;i!&vwM$G-pwp-m4WdmHupj<{-YYFk@0D!S1u0`m z6VQ)eLt7B+?(G&3jThHhvhnK5ud;Up*K9Q|#(o0@x%tvT=P+t&;OlAGX) z(N~Y!y$uaV_Wgv7H9%bHh+cho3pI%Mc{^0G(d;{<>sXZ6irW6s$eUcLIaS`8ZhfzO z4RC$vhFY~QbzO&WjgoMUZF}^!yZRu(HH*PDUhu2Qp2cxnT@c8yff}oVUYnzXK&wHo z;yES0&H<`&vzmprfGu)>tLQ7lyV?`xtrj6!Yu7bEwB6!J|Hd02VGG=K=9(H3>NZ77 z*vrvoe&rhWP1_sHD=;*yO`HJX8G{fBD~`VyC86rF;(~s4byI}9b#SK`fYF){(QAoy z077ux`uEoo97*mrRzXgN4p)nW74#a6KB8mQ>cw`Z1ca&|&InNg$TelDaS`^r)B{m+ z>7bK^T4|oNawQ9KU;eVa`tc1K8|y(B?H|m$6@l1@ zssbgUWJ+V>(Z+qhe8-d{yBvtymhCB5FP=VEdU`vi)?|)WY;5za)~91{_W-ReKGHq?>`()vYA0pj?k0+_P;{s1WGN(Q2otEWfa6+<}dF!J)=EGjQ96q1Eylf$X%{ ztd@ipzg$SfdK5@iEY@}mpBga@Kv0z}7FU31v5Mmzg>Nm~C4C`X01{Ns#$QOPbseHZ zm>V^}P+L17zv!IPL!c_}xl03ZQ+q{L+lcw*ack1yql7sQw_EEUsC*FsM4hpW1voL5*{#6}5$`Y_Tkg6(kCkrSxcu zQCR(#u_E?voi10!c#8=DlB*;D%JUtL0dxLwJaoK8a+Q$Er{PCL)H$P*%py|8!At0UWF+TfhOrC}xXjRQ`3C zT8FaQ*B{^PaAdLaubTmsf=FdA(2Hp|-794aKB8GwQKEdz6AS}Wbga|?VEn@VLSj@H z7PMo)V4AL?HavY0nQi@id%e&4z`)AC4gpZF9FN=B?~kC+HeJo^lsdOXZSH<>^ZM^s zkyu4G8NvT{aoSRO{KOcgN7m^;X2a3O#{W*b8yKxT4vb#>)WX>_Cf^E-enlT8=+wX{ z{=a70gU)DlCXB{YPSJD@mM)SYND#3wS&b`9Pw6o zT7^$wfBfrI2U3MFtV9_Q6Ijh+vkD79>~BEo$26GyKi>Oi%if;>6sn)SF<=2`QJRW4 z=c@pyal5^~-ftijIqFp_J{bgr4xKpt`T6hEozAANxR@D{^@Y;vY}mG89dQ|8B2ET| z0coa($drRrsY+@m>p~?T82x$kj(vxYB8Ro);d^_gW>+@VMD@Ao@rAQzPPrWzttX7) z`zMTU-}KWD-_g$l-UH`RZLw`>0(1(`!iHSf{32D2>y%swt4g*~_~io-OiYF9Q^Kec z8$c_C{{}`SjcSQK*h}8j^^@hJ%zlD&9rHFMh|TZzVbsU2XcPH1_*4q^Xrim6)TtiDG=7dc&U(#-Ab*EyDK}m&lH{ z|0dtSQ0oII_cEOgPFnF1MO}yCeEUal3_Xo7O1Cm23YV!qxA!Pbk%jW=7^Oj!e4^45 zpcL_>-*8E&@pwz?vZ?p=21<_sr2}Uyd}ZdtcL1gTJ}yyu2q^uz4N6mJd)E?vmD$&b zuOPxZB@s%q+cx}0hA<&PGHEdOc#ojCK&r+&boIo1sqhGOCpi*c{oCdsJ4j3y{q)$N zu>B29dU$eeZNGxz%S6-_f09054eO+av;E(&y>4ps&9=YR<4k$f%^Vx#<}ZpUj!%-2 zdhR(z1sBxSy+|4=T&edM^HsJF34|W|{KImGqo55!9fVM+NLlM=7$;hfU`!K3sM$E7 zEP!b9+e2s}s$X2H^?tijA2eCS6CXm606$r6+ip^0e=&7FZd-T zwLYEQUTud+PZpv-{IX^D!K26qdRI)lza}-iXCokb{-UVTs~&ZY_znZP;)H@Wt&>TQ$}Mh{75hM}w?}|M)L74q5z2{`C701R z3G=kPFy7&M@9+C?zokK}Xz^y5O8q(V`^Ne+G5{N{#fny;``S`k)fc^o)s1SaM!Ojg zWN^=w4U53K6!teK#-myv3JxKNWkR zl=V&68kI}i+LBKOI~>^prE;X2mz&PZk`$!oVoz;o00Td1nsD({r2p)hdSV}Hs2Np| z1eB(KhRMHi!aZ28grf94fRrV$KYsCY9C5dK)P#i7w)q3WK+6$qMHmUP@Pahcqp-&5 zWLT6ennTzK^!is%A59QFQWJUZl!dQ7_VAy9(7zqyB-(5sly`dkK1LcpPt1Z=EFfsg z2S)tjRO3?O^TR?^O$)i`roy>8B5FL?AVIuYD|9`&PiF0lUWxb!y;82jF>vk|K7MuD zxIE0!$;bU%i26Q55-`88Y)Ho?-W;n!fHfRCd9%cos1|i$RJW5fpg4z)C@m_+FzRb- zSI^CTO`hu3kaM+b?BV>*p@*>#s>EOh`C?AHW&(HbJ>;G6ojy zqchmcTiIM0M2#;Gt3)Z=!bJIoZ9pd;2@HHUbM)z{Sv?QeM4t1|!q*;u_#U8hA=%Cl zqG8b43G}U5P7!b2Wj#f_rJS6$Jfp^&l&DeT6H()dK-IWou?iHZL7qKWS1crGj+i`& zK8bnxSq{fd3zo`aN$2|^(5X+7bN!Wg|BCseO;5mdDk#3_Ol!9x8e%qH5KGN`!Ic;I zF4(>@76bed#GYmmY739g4qT^;&Mq#zu&!>lSJrsbY+pqjSX=C(>65f|S>w6=i&q_v zM7Pl@@#LSDlSBeq$WT_~SwqkJPNl~&-NloiXrA>cV9_TDzX>8FKOW#Lv|elX<2$BX zEF$W+eC6t8uMs#YQT@r27x(qmq~|9j%-aoY(rg_zniN`)pa`RcZRd$Se-AzpdO}_P zVdj{AsaX{bHIZkJTlmHkkK6}*es~nW^q}7heD1~4ATD1BpG>WfScKn|=~6buRLv>X zh`lvRTz(!#LsEgt;FN6T`De<}sl+u4bP{)JiE*qy;!Qji$&k4y$g?EX;dtaPKR|w3 zPg@XqvK+Ns4Q%#qy9Gv5q3gN|b9jTAHYwpmbOU2DIErM6s(R{#oA=?c*@bbZDDCE> z!WcU6w$4=A5%B7bJ|4S)ckY#?-8{*s((bm7$H)|E{P%()hodl5fa39U@zX+*T6iLo zJQdh>&9LprVK(|BU42H1{z%P<)q8k+Mfq^D<2=^G?7n(iC^lzbe90x3-b~5qnHTi& z)}$9DCrtWiBhP*Cg$9;V5!mDv%$n{aYzBJyPL?}qOAFXs_c+7mp_<46V-~*2vH9L% z1DiV-HZ9422~D0xwS-Y44xOpQCFK?s7vZPQO-J$G5Z<@$u79F}I0JEk*Z?C=4o&k% z$=nd9Zr2OhS>{4t`{v)b2HE?-rq^}}o9F7Xlg@&A>uYO=7GSDlE$kg(leSj*1AN@A zCv3ik*2qwuwkR!1J_+Bx$7F8bORq;^uf=TuUfAgu1T(mr~~)vGd)3&=E(z-ZD|L8 zdSc93safR*Ya;uP`uMF`kBkIqzHz8SVA61bW(y3M=ESM0MI5_GjVp-F0WwYgC-;`j z6`dhdu{Xs9QO+eQW6k9}n;az`dXs_ZvI2*reC|IFliD;NFQamP9@(*O~*k zc#K!W86?pu|DQsV&Y~#4%o=kxAbFrBs{ef-zddW}=&RMbh}j2KB^iahh3)s57OCs& zBkCcH1SnagG$c_P(Q>64mmiDwkz^rfA0|P;wAq)Kpg?8@?X7VE6DGCf9wIHmT3u#y zT3VpeY=`6Wh4t-gOlBfszx=p&$8AVA6}qnJWv=2xHcX@mjj7*M|0lN^Db0zHsd1eT3TNuF~O9S$NLs}JbCp; z{q6JT9F8Q9xdlSmNfh=1mzer!gL)tpplkssxn<0M;kj0MX^b;j@54daKlGHkwy4Ph z%CBZ1&vZEsRKNMjgmaGTphOEopp;M9p9quzWSvFxQxIZrq1j_w2 zQP`Bm(kTPwGl<|OAtlxplp0&!V`EsJ8kM0@;2W|COzFE0%};EWT4cABaOibQ2`5nc z@NxR>ibG+_QZL_8wChG9oqO-5#s}WJWAvxrNolFa@Tq)*DQQ52$Q}7FUgVjF6&IC` z_@VjkvloW)M9w`78xdUq8ZYX{f-#9m)%%e&NAqijp{8WI+bsHh_S&Qeuhce^5`FCim2V#X<$DW zmIf)xA)*|(on`J>s)NOr)J4aEN&0em9b7VH(506R#u4hb7LFOvBry4Uv&5v}{1ai) zk42~7hsjM(jy)$evus~Y)R}k8fA7huW3Ex_(jMOngz1>H?2~F}xHu$D_f(Bos55vs zB@!|rDvjA?nA)wxD~@9(IMUmmG173uuR2%DD>S~_60|z*M2F**&$kFUxlT`ia6Iy_ zmVBbd*5fbM)?QFpeD;M_JhIxy$eMkjmi0S!1jWW4dX#$db=#{#Ps)iUJ*#yxm7AYI z@eI1qSp=*7$!6B-;3;aFoG=9@Dz}UOiq_I`U$M&sIe9k8Nqu6;+VCU_*|SE?urZ~h zp|o){^sDGJRSPNGMOg&K!MgxP^F4HBQL_LebE?QA@M!*26~0AuRZ-2#juOQJT&hEOzy z+)8z-;|Przg|cX~?%QOp^GQ0YcF@sc4>EF8F{H4QinOA!z=TFj&kI2tAANZ^5JpCd zv%S(4+KC;dK83Cky-k)neV>+!9kT7Ab+bjaMWdl3wa7t{QHE=&Kj*_HKW#g2#*Z~O zdy4Sv^oXrgv#BTBzEN6yTu1_rVo!;U0;u!WzWeMp*p@UwH*$0N$=qU-wvedVqES@h zj_V$VzDLIrh%DG)RgoNySBD-w4=!pk!*TV0M?pglp;OWy-*Z-@gkuZ;XPh(~{Wya9 z`{20s>9H52WR~u!iRyRL+&NEA8+WZ*mojMwmSKn+k2PTba|8B2+0JqVU6r)LaosPQ zx9>GSnVvd>(3p;eB)#F5BlE7j;Rg5s#(=|b4*-lRd+>;;v4?cfnV(j~?!%e##yJkh zg`c$5k6x5&LL`5Xx2ICtYL5N1;MTeOeB@}7w0EXeyoYHiMP+zV{`ULUvR0b5YO;T zI%;wx^xCJP@il>MFbcCVsx(8nmPm1h1MVnw|rl&ekKhm|w(%r69MAsq*B}JT9_U@>!nt$B&!UE{&=6m&v2+F#Y;MrO>}Oa z#+ilNjldxW7g_VZJU}{;-QU31NvT>{nOXRoj=jKkzX+Y~+8n>{@L2^*BjTh~6KG5r)E_{yo~^ zNGY*&Ezy()7Idhlne+|OA)E;2MsQO{m8qb_HbuFpAWcPLXb*#Qg=e{0@zv{qS{aHGBld<1*IZ1<-t z-?f+7%0!-8`>yTd;>eh9J9f9J8nZo* zbFX$6^{=b@Gwr3*gHwCAAyg-0pHz(rexbT>&*Hb?4mm}aLKI$DkY>P7#w+w@PjNKD zdLZo4r>H+D+NKm2qyl@6=Pi+5FI~1aV{g@8E(7*z5$T=x?$xIsIz{aHtGvBzmEKD4 z3HXn&w^ek@`(GG8I3=TGJFWD-&UPf#y7;Tthwey53e!nquY<(o*BJm`e6Aikm)(gh z#0uV^Zj4uS@M)=9nwH)@gO3MbdXZ-nq6TmM$0~R>)=O_xg)h*nFq^h)z6Qp2k>_Tr z!jv@UN$(|ttSJ(J>1Ve_|o_x zxX!!{s}Dn7{Rm6C*n70E4Z&ZOc|V61g+&^YwtU#-Pa_SvHcySsZ~%U0>f- z-&*%>yXi+bi2oS=nBgvOA)2C&NgJFkL*9wGH0@CY+MSp<)eo$b~)s@j&`gA;KsuF!SaK%)a;rI&T%9hF|z@S4c)Ws~~r z)D@{REZ6cao09O;W>$Vpt<#@wb{C%p1@jy4K@fouJqWE$5&IQ~QGdVw_hE-4*<)6J zX-qqW2xwM+Rozg~@G+VmoVAXa^B~3JQbTWYH!adE*jxDlVQ&O(9Dh9fioW~*7wjGR z9k@F(d%{(~-4@{PvgffuI~g0au`4YbwB3KQ>?MZa&YEG2+*SeH#b&D%8<4ztF`F%mz}R1C$sflmZvrv_Oe^5oKBd53;m|1 zLySsz(Iwc0s=kJ$^Aq60n_yR%#7hSiUDIHms;-(4h;IhxS%q`FQ9QUOl$!w9W&Vqz zv%ju^WT$OdZ~d`FHY@DjA=q6{XNsS{tna>4g`Ka;*Xv|q*9x7{_{xOgDH-k^HNoCd zeFig;y6HRY+ciP(r5%}0llv^|3LDi*b;JaXA zb3zb5QWd3^xUPrsY01q@Y<*LyMdybg;yquimD4%>)gn`=B?}s*w&^{jxC@iGHqBV2kA6Z5j&yTz?0*S9og<$i*_po)-(2_Tax+4HlJ}aM%JjH7#`1 zkptU5t_U}+8~90UPI8TlY}lvPBiL(}zf5?$g<`IcUD#(&$9QWmO{iA;;4l-(^(;tB zzGuQh{L36P7Cj**an^+5ytEt)9J5U|fd*IBEXHTDub=Bzqk|t*Bs)u4N z`>HHGriZuK``KG|?lW#!Qlju;rH3s;&Fx0jl?`4|MWN~la7P)~@P7uw#R`UlDyL|P z1RG!K$4-CYr%R9f*)FQFyW<1ccxA;R0IRGmU#YddON&eHs5H7j!ljqOu|_!# znhok}RG6{tTlTu@h;f<>mQxrMJWl#Li(`+{UgL5gE>of9F%9t_ncbVI8t z0L2=I0EQPFYP^;jP=mo7V{RKvd(WY5!&$d_oM;;o>C`kyPqG?Czat6)9{dmjPP+H1 z>R9vdVuvG72sqewMG|VVao`^vX%Q8@S4(^l&XerD$a&H-a>Pdn;OAvQM921GN2KZM zBMqO}%^lis76*B8M*o|qC}@R5>g%6OIdA8wBF&3*i_mT-g*5M54*_XTrT4aKr7H5A zDIdQ)WAa@}UAKQU30AX*Tg~IFhNvCgjBK0!yI$=P5tF9oXxUm;XHxB))zsubk~c9R zpr)k7nSYX)Pvp~@m=ta_D4Vos16Y}EDo{X)$^rLCVx`%znNs>2)!K^FirqK=$;4`) zH9qhR-=)eLYU^rPbT2br<6z?!vCLJS9nzyRPmG06ExcBKdta9e-NIZxqCk!tJ0!v+ z;k;Hze>dGfK%c|jx4{o{eSIAw(GaTqhf++DNw$BjH(b2YC$K4r0d%PWOQSD6cKW@l zdA2OIhduW6O$QG)>|1Zf8tp0@So`WR%2DBx?wg-XJZHzLVNI#_Rs|W>Do&Es{BJX? z^*&m?zbbOTLm$67V=|UNqy8e6KpkQB>`3ieQ+*U%@$&a2!D_*K2x=*6PLwDDI@FG! zJy2Njq@QDq@pH^C$U`BL!GKZ>!V=~$J%H+|UzejbI$|_Fk6rmKKQq>}09KsSS#?W$ zgD?sPAh+Ju305Pi5m3Y|jBw@?#~eC!>DoaBHHKlKymraeZs)mmb+_yxUSm5}COd>a zvqC+>N52q04BPSbEc{#DMg`SKu5nA#5Fb<#sKsguY3+@wfby9^C_85x4ukHspp15n z@pZ8(v}*N|sX*Bk_e`Dj*1`wR-hQemYsIed?_spSyAR!zl2+`k-VG{@JZtR7ug;uu zw^A4R5#N@J7wd9Aulvqem$SkQ`KTQhm^su5bfr5bTl^+7(iJAtl;mR;lxdmKdakjc zP{7R1wuzC1s`+9iYLNB#hA5mAT87%$zW+$`p1X0^w%9dnkill59YK4AleL>b8I{hL zZ7)Hk5u0gU%qR;jo@`w+TumxKK6vQx9t+55WtcdD=aUyt zB#_-V^~twC9(mTbQv+GBx)m3~PXc5=;XVo;jD@Cp@1dKL(~5)DO;!7PMV|SB?Vux`bMG`pD9msMVL5*<4He zVbO&Sd!||vDXJ#U{aCVM*nZ(yfNxwxd%vve z&?eaG|Bk^Nb;!u6PrkF@o->u+rzp(~jCI&?(s3&(4(3b(#)_&@XOHx1tc>h;|AN+&`&S0;+h-;nJ}6Utb&Zu53}KwL*z#LKa2Omt!vfsB+HtCvbj0MaZVP)7Aq z%Z$;P3^0q)3uZ~FQ*}6A`+7GOOghd^K_E(w=mnE@g0NQK(A4la-ux_f4ZNmA>DJ`Bm&lCZRV+schH_e3@VTHsec%=1lmCn-hl>?F1Z!WOfEC zl);pymg05k+W?tiW+GX&@y&=I@bKU0aJF%c`henNl#H{ z9%!ZXI-SyFUaf?dc_oRjK{l>hh+`mydW}r5tO4*3PPR@KuyPAZNZ z#NBn|$l)Wq*9&Xiddrp4n7092SB{zX)cf;pJp&NweS#2Dd*}*OH-m*(2Clunl3w00 z#=jp%P^Z|Jg82);q01{o(u+ik&6-3 zy8bO5`HCbp3n0qSScMFvv?d1tE+{g5HgU2#@)~3DE|37OU9?WWHYCdpF`|Rr!1(&{wFymItI__@cO7gh54Yud^*M?fkiO_L%LTh)|?q2FlaD0CVx*X z-71SC59k=hQ7k-Q?UKU1=Q!P0UveS>gFn``I6`c(ZqjGrFx65XwU|&2!{!ikT$r^7 z3gd0CyYiktx!mwA-ejW___4^gSvf4<SI;o2|3J!umzLvN=_?KD1Fp(cSTgqO>^IVeDWyle%WTE?g1qc zhwZFKuyxNK&rDvCF*;=)u`fGpKc2mL46QMxT%h22;|M)W#Hrv6q@*4`DAL zD~m5Ml#~|O9ciDfIOeB=D*DAqLKgWtJ@9G4SNe(ku%^#Z8_Qhf_x5J&#eVx8i+giz zq)Ny;$d^zZeXN7zxH2*urNR#r(jLqB+~*H*DcqOe;BlUV29j-dv0WNE_`@^1oa*z% zzV1&f>B()1W8W@}x7!P)?n>gova*-xje>e_B&9_fLsk-y75jY4@usG|zwqO_OBVB! zyq!Ro2@F}Q{(3o(HGKTEXXn0C*SD1+%YW*~Qmc-2JWN8LY(my2Q|?YqE$D?sM1RjC z6;0(T&~^Qscb=F$n$}z&-f01sT;-BG3m8vGaKWkAhg%muv9b`SY`P^nnw>gk;yws? zH8FUpOw@DbWjr*m6?b9yQcIFD?T!on^Sz(l;@be*lG)TjChJ*sWU`*lN$nepgQiaR z#8oq@ud5VyQ9kB| zD-Du1;>e*czSMf)iwufy*@VBDAK%q}`l>H_M^PP%wcc?SyI1&3j{LO`un6RZF$6ckt8z=7T?> zR5hJ|x(HyK*0ImnFt*c9~o3P!ynMI3&qW9&3 z6^-v#^l;zzF!pyIzyg5W>W^IV?x5({v}`rY#<(k(7EJY~1XBYRS+8M3x+}Zlj*m8z zolQhpMBs7!(oNyYBF08yWgllkjxWdiYQ0@0_xvd=cd_Lwy=O!=$;dm>*oYcL+Bfh; zykwKuGS4W<`#PsRFP~;H`%?*4=t|C0l@$rfVRv76n5-IF9KXt7?sX8aYz)@CRXsn z3;VXzb;hVFS5K72&v>#d40Yw{4nBJXmBFj&dvj^jijxGqbkU{b%jk;8GfXGm%5VT) ziJ$s>UhiRg-JJ8JgjW~VbJoBygfNrAEaXfH(=bjKFNtPkJ%xp_?w>5(qgv<=Hnv)eN~m_p*8pcY5Tn#hN^obZXb4hykL z79mJ0!yX+Sle!4!jeU)KX-vy?16}T>EOu9hs+Do8SH4T6HR7R1U-;;mi+ZU&n}I7N zaH@m7lbxpkt5(E!e6X!L?iK}U@e>w*pA1;#R;WFL75?(0Wlg32vdGFIufPA~~Izp7Ga`F(lXTi;aA~BxLtp`r&2(Ro2ZPmD6`YnsyC~7 z)kInbw0KPnr{^th1YLI22i)|B_aE7dd{j9Q;=vuEx99+jQlCqFOK~H1ca)nEyVl@^ zvji76BNCZnWL~{NT5TI4@*pxDYIH=_awX8?xak#8IL-W!S0snl>ev-;611*=X!?r_ zo*3Ax1y8x)01}|30$S<6o3Tm=TCE7cc9;xfVqOoz0b0q)ITb)wpuDAQM`_odm%sAC zQ&S=yBwSr*ddg7j+?iMIn14fSi$89}p=3!}U@U?aPlZ8jsp(!Q`PMX2@hU5ZYEHCK z3`LiSVpwRm$1hlY*w5xD@{9(jEct%sIywq_>{n3M*-p<5m$yq<`ZQZt@q7ei1ay26 zFWR1GrBLmxg(-zvZ2vg%Y?gTBg@>%IQmgE?A#Nw)V54~4H5_B*N_(Cb^qB-vHSdp~ zp-s%^QY(gFWu+|86Vnh%YBMxyP}isksz-OqUmH;II0@x}JyEtqjmPj7_}?^y+btUz^2Z)bYS?=6KTEm$RKfgRehhl-lQo;_#(%1LB}!?Ria{@Z@N}ms4_=Qa2s(askoP_a=y1oJ6ILj&l=Ox)Mbtr+kyUph zD|R4CM^y<5VV@=I{9Z&_j1h34K7c{lK=#!zTYmr1qaO~h9bW3{JF+G$Sy|666?mpnEC46{o5m@|KRjw$5G7-kAl07|V5s66A|)X@+VwLCFNkOy?sNW#wvZ%mpq^iN>&8*FX4#7|K-J)zCr_Wf z;E@46k5%~b0A;XOpek4mwmLOXH6!P6qC#i_)juYWN>9#)Ac_A>13)AoTkdOZw8LZ-oujnHpzB(*mC2OFD1>nwPIjXEF zWHm6+?znF`tAVu4NP3h8iLwUrLIOX&aVxyiflklWwe0pkH?&AzSsVwZufk1xXpl&L z{0p|{n7C3qA<0DcnFZ30q2ZBEO=@<0bo7^AI6+9Wi#1hY%5Y5KsDkx$_D@@k z_ih=ezJ7errQI$ceEX#7uPk`5-;r`3Ko!8NIl(HeV^D=X>5`gR(!04jSk;7>4Q}$c zpBL0o)j~$Y=Tk=IBxMn%lv005v!}`3;)y6bx9hAApP4caJCz+gxtAs1S7FB>CBaKj zq10um_{{~=j{{Ty7c>8Q%E+fV!YCm-sc>ZtE7b`hKI05*$2d9_UuBh=xBC) zcctB)3=7Ncj-XC3R!0@%D#`C&n18K$pOc!M7#s7zll4JyKUbbA1+3_RU#uPpTsjSD zt*9&Rnl$~@k4Bw#tjq^s1$zboETt-?x+AhW30!qFIh1V0aP{7`t*MIMqhz(pUD0&uma1sS-g2#S;L`dTDS z45LfC?0hf_u-!?wK*NB_yJ(Ox6_w_&U{`)OemJ9Z!$V-dEV z1-61UPOx$PE2_Oq z5kX6H_0T0d4GoF0B(x6dY^7x+bxW()-0YxA;8GH zC(nF+{ylvUmHEs46?ojclGvuh64)-Pjw23#40#%*s`6ymibhvo5~?yw%gYs@Dp(Tm z_}m9wKDW&iRdUue0u?H&RwC?ZoHMCHd$B|NcXhkN4;zgieY*P=7viGWfLcz|o!e4X?e_=^k=h*~u{$ zdw{_h=RioI@KGV;unKe{m>Hs-FL@6n(>=~^y_DNVUO8Qr_YL;A@Gk8GtQDk*p(&|V zUyr#x!hl906uD+?)9NC-Jxlf204oyhF=on=RIfmiQWfOwb8>QA>}_M`2HN0?F6!Co z6QU}(X3>L~5ngd`*GV(qn15$YQ)vs36#%jnAWQupkag&!lok8;{rllj1%xW4Oa-Wd zo`Ac>)#7Y%sqSuWProVipL=*b;p#ue7Mf)VO|8!cu9mQunvHv|>t}FrC14fIIF=q{ zkW#@@!e!@TJ;LeYkn%um3|P6*@8z*ScIusEgDip|D&+oPEgbm|h^mjf*U0liiAu(2 z=y0)RKxnqCfSs_23JuU`vF>o@f@CUjbj@|~sNOEx09q`ViUL|PUkWSKD1w#|;hwd( z+wF;X7Q}7GKO%&w3`8|D@c^9#e&>k#(1a+_&(L)|+A`u67`wzq(E2&Gme|^#3`z~q$sCL zb8DXD5+@!uef0aiewm18V_P#tQJiekj{Qe>ju~EixywEHu8J@eB`nZ(>~-!{QO8Fe z;B&TTn5v>HD8|H@%ymXkXwe)b)%84T6zBvj~o5p$OGvA*m+P8l-%)Q1ZAyz zMB%E|`pZJq-WgVv+abo920`({N6fB3iv}4%ncyS}-xm4&80|lK>*G0`DBgDm;B@8v zlOOB+_6OHjHIxKOePuxa3eT@sYQ0jbI#N{s6P{Ln_alFq5C6hNkBlx%$|zCGG=?X| z9dP-ahl~Bt&x$Lu@7Q@SJTeZOvc3Nr2HySU+U@C!fA;&@_*7yP2))KOVGk2U^>tU?Kd>W;YR6F^ zolbry6+Ht{Ql%S%z>Wz@CP-Zujqbymzb`4oKnYSjab^&d(Z=AnAXa&3T(j-_zVNA3 zPiF#@S{zM);@7c+lp;h0(tT+GXayoDRT5NNMEQWI1SSe7(D(WEK-5*ECO`g8r}wVu z6)f?4j+X>6ED4q?0#zLfs`f$ERIP!esya|p1OOdWi>HouCZ(6)0ULly@hI+~E8yH! ztT;8N>WZuxO`xK8SU(B-gdjy_QXv&qe7kNVxAzpq0x2c4fx(Fi9*0vGMo=71X=En2 zQ|$ID*KF}Io7nKDNJD9h`?F~f(#SX+v2*nB+ACb{%kS;^I|#}!)0H-G3Y;84Srin{ z#8lol)I$c#`^9W&M;xl-1Vw!d8(d;bSM+>GetAT-cPjRHGOvm#cz>&&uq&S<4j~6u;+lqtE z$lmwQd+CvJcrLYSUbyGfmM)=!M+ZJ}Hyz(K8~mA&MCI;Ch5}+TkR*vob4Iw_T?k6W zs@*aBheN*Ol&z#)ckT@nlvqZA6VvWPhyM*?I?Yve|Ap-lQ%Lk!24JKurGS_y0Q0Qv zY1ZV~umC2hNuGqzdXyMyJWQ9TQ`3cG&R`z;U+KX102F$70jT7nv{S)TQ?;!_^%R1quQ;C6QWbDgK}(9$TkI`T3Y&|9#X&@Y zBdhM7JA3LlY*D9}UqO>E^x>L2h54gV2Z5T#@`nh>R;zmwe5nbLZiC#A%b zjfmum4L(xiSY{DwJWwCRNM?W-$zZUt@9>V1!)ph-JcIA6nfn3`B8uqK8nZ*pYm?#S#b=arQ9m)bn2K0$qw*|2v4C*i%Sbm7+yS5o zeLGwsq9?TyXi7c>cH(GC3d>GveH!(zyv*U>2krFrv9_;;Hv?GTGweCGu?Za> z-2Aa>kI46QrI1UgY*JXAQ!>5C2YK=HBgxc0H7TGbJnu|&lujHY8k;uTx7Mt$e$U=@ar(5`er7j2)8E%19;d?eZJis zPJEMrNuie7t=XrV}kUpClUAoI4{7aI1pd{wPi8X(ryqkWVq1tUlnx_jf5<0m^(aGUc zVZ}|skM5YD@b*!pF%+?-EF^1JzE3E+X6%%wKYa3>64iOY832yZLorHH8IDegkd)p{ z?Gh62x3K$5!z2cymD3rFN|;O{7zK+Jz$j2~BtKAKD-0AWMcs-kM!f&pv~l+kBRzq) zcilRYXk`mXT3lbh^qW;{f2KegeP#d>WjS+llx!vINM;aR#4DS@MVPR=0HRJ@c0auS z0A#l~F~w!KiHqp=-`5d!V) z(!m9wq(1I5#$0$pN-{0?nf-uZXY_68;-0oWiQ-0pGLsV5+~=8RDppdG`8rNYXHFdC zDaZSRQ|ZD2d6r}e828rrM1`zYlfBfi@dgZ#qMUq>0kj04tq`@I6*q&5|5Q~QAp_QB2JctWWuRe>k9B89Fa{BGGz#MBX-Qdos! z)WqQQt$-6plZL;A(4-Xj^BeMl`C5JurLJ31>9BX+oId_OfT?uyPPx<2uy5yY;HFi} zzg|+m{}dKWO_>3~OlB+*Gj)O=kX%BVd&K(PzGm~nIB(yCN&+)s>bv2Z;kB2z zORj;nL@KF0W@1-|EX*Vgfj|h9ln`#>@4#rWo;YTICkXqyEjf|@U2?;Hr+Wsdb-li# zwFTw~kmlx&fFvhcx5B`hUt)*q*0z5Jr#~teSmLVNOiqNQAmi~9;D|go)HlM>n&mGM zj&2-vXBI$3tx;W4B2x;bkmf2`ejK)z^Q$;yYaa;A3ACEd{cg z1(Z}wdhr8f?Hg-=h?a!l{%B(h1h*-iLQo3OO?yKr?SC7zRORVEejv3zPH`{=`7?Ht zn4AE;eY4P#VFlopkf5bmpe3!7auT#8mP1J^ftFC{C|e3BIZvNBw5;SxT)D-fHk?X& zuW&1U7HkZp@J5+QZhARWl(|EjF0k9XB{?~g1TB%~raH%=)QC^3LnzspeaoS=YRxy# z($T$}#y$M}ym5V;^xYjS@(C!x-4V2;Rh%-EwCcm{7CElF4TE~^V`EMOl!%lx$R+w~ zREDHL-l1G2PXRS4`1+&Vm%skj42C85{rq_=tRXWjVf*o$rHhs>|JDMfSm>o-wm-|8 z=?5tVVFZMd5>4ci+^KeZ-*wx4t>p6=v1kI4w)jlucQaBtv~Jk&;TO5fZuoPB2ssHK z07#-&r`b+I*aW$-QI zA9-=!=xQ%BZ~_1lw2E5-NrPSjkdl6Pc?*)~-2sr&B`1k}o^_8sct%1B{CqbkNfSU) zK}o^9VD8bJK&~w}z`zvcy5yC&XN(^ST5{dFi7&u#C_y2t{HA{KvNh}FO6iYK-W*B3 zEENB&AQRrIiIb4MaCIiT8*0Jsc=YE6AG_Ts=cAmHkOeb1Y0q=&@XDT^b0?f*DQ|MS zo5HkR4D+f!XSCrKoMtr;izvs&5jt^*{|0~*HJyrqv4l5QVA^`#H*tx}8ph5OMd z1&Tokn4A-qFlH^&%2O)-2q~d z_B%7j-;X6d=go4HigD5}>((q^TK~=JA2*5BWQijs`yj)RwXTswqJJfp@9Y^Xe)D>{ zt;fURh?|(%=zD734lV~94RrUq?Y1%&)L^?sW>=Cnq%3S?%uFaAKx{+`+Y2^&0%eUL z6wqfT=5el&NLDs#;{gnMXrKp6QaxX!xnzJcOorU%Y(#5hB)1QUq_d`Zw@tHa_NYP= zhE(Py;nxKW1+%^IlJMW{OKrY>Wn9HuGMNH#cZ{3*@`rc!^cAWF4F!JmM}#6Uf_85xH-l1C@xT|}eQf+ltWFhOE1rxJ zjI?(3H}y+bt=mK%91b1`90juv2^jIBh7S%76~V}cf2Pfuh%KQTe%|XlPWr+ay%CQ3 z6BR8JM$-1l!-o$m_Y9hNmW7H;exy|%(WJy`NTNprj(ibM3LMe##ZW3Lw^EU5R3d^) z(o5=j@13W6E&vs+q2N-8)K=g<(-arOZ3t~?Z)^L0$kOcHGK32Nc_gWbaE9 z7QR~pIK{119(@~22>SE*X|H^6OSuXY`Dnf$T@m`EHW)hPnx$_Nbx|7UG(S;By$Cl$O&zeE3;Tk#ie~Y3-0dk9+jh zIoFp3&{!XYcIEJ)00*Za8=8Kt{11T-3xAkK_P-K*k_(A|Y$o&&!3J^y*+;2c2ZmIT zP`CV|{IAcKHNRY$mz zG`r*c4ST#T>^zBxVsI@a2ndP-%LAM58b18WlCq&_X<4gJH%aK-UQ*R!Qj6TAu|^(_ zfM^clig03ATKb}6W&T?!Ivnzi_6OuDAG=L$HnzX>%>(KhB5Vb70J zr2G@Mgh!gT$6Q6La)N`1=4q-%97LaUAiFUukex>HBa7e2FoXi8A}_*EBdz}YCP3)Q zd&f_I<;DhCn%lNk+ZOiycn5QxZkq~MSQ(Qi+UJ&!;ne;^u^8UMGD z$_r*4#vW1-|H2^DkOmx`{^*=17>;t62^`@d=eCV&moHlJ<8OOV`TYSMMn~}T;xKB< zLY>gt$JLb&FN+Dw zlMLE{E?>ZK%tqgBq9KVOfA(?wPJ6bCAPg??oe>B9;~D_ys{1C)eCy3CTxz}-@HvdO z89#YYJUl)fK%9k=^HY9*V;{g)Tt_5CW+TIohzV_ddfa*O$@yYd$O%@~XPWW^SlmN} zb3s^8a-;J5KK%Zy38S!qnX|M7OvDaT@7eP6w_km;mKri-Y}QSuGM27phX)YqC3JKr zY*@tGANj4(*TiR<{EC}FL!fP}CxV7{J_Q8z_6(eOiA6_SZN`piD8LZpi+F+|NDD(l zY77(7GO>;E2k+@Aa}+X^?e)MN{X7`%m#z?=HC;pz_7JfUPf@VV1^Fa{*4$&)ApCpH zEJUSDV#t@>0t_XG#Sn@kB5M>2S+)A_R{=po?;k(&?bj}K`ty9bT23R(mmn|%<%&Lq zFvQzk!jM+>2V;m^^4p&ocYb_wo{k~OuiQaJxFhpmh7B8m z2MXH11OOW7IsJ}%domqlZRqvLTKhtXkMwP*V-i5&rH~dofa(|`|6B@j3gS}QT*uCz zI<&e1QuEh0 zLK<;EC?GO5R;*gNfDRB2C-gjjULnBKl4Hwm%Jwpa3MSM06i)D3Nm^-HSzb!w?>48Y zhMf>Us}20@=J?@p7b)+^ETyD5-yZVf_M1OlMWT~})nqhB|4vRpwyp%6Ndo!C}G zf4!9B5$b2fJQ}gqjvW8^dru80Ad}9QeVDa3MC}H6sCsesN%;f8vsNdceJ_A~lJd;p z;nP0}9@?WioMyw`OHhDE&55kIZ_d*bN8x$MjK4MV2<^e08^5hzg;wnFv6k;2WzZqy zQ2)kjmz8_E(6ZW<_TLV9kDFIg&GLs1?cf;e+M&aS5BBuFX3`lFIHCIaq{zn>LD-pL z3xa<9Ax03#Wr!S$Wo!rUP+AaMctPwY1VKDe zIc0axdG;ZKPWpnQta3H%-LmeRuh(wcb?|7@x6|$g>7?3*=b+(=c#I)OVTH?Zpk& z&{>8Y4RZoktzfSgUo(2btT~UKo)^gRW9&heBa+!BL5Z)9X=Y-bKLR(9bc7p9)XVVd zp_j%Fw&F%|js|EGZsTTiju9Gm(ybdMQv(IX(W`BK8@7{%z-; z|A2HZ^z^&^fnJhyOx21jX2UvUibsusoy@A0%APEs0HbC?PB_k~;IoTxidnB$964uC z8_}=wDrlZxDa1&_3sb#P>m8hPEaqXi=3SNcxJ0LUVoe6%3E&RTu@nu*==?ZuL7FF+73IF+y%#2py1h=V zO?h>{w-p)Ut?O6RuUfx(=l*3={@fS5bIjCe8ETHBC(?;<;(%?3V_O;T7&l#scf|A6 ztW)3h?yzCQ|5Pz>>}_RYgTwTiAkhw2$>BP63g7ca%MacOM9j2t^n~Lbtw$LjT3B_m z?)8YLUQn@mkH7D{DtJAK|K?K*bFYQY$WFXNIUu?D8iSJ6y01#|4n?kbr^UyL{+uJ( z#TN8zCEh`Z7`qK$Jxk!Z;em&q`QU+Gxdfdcc840#_0lS+0Ug@5;?T+Dyz@uUj&lj? z0Q9q~jjv1?%8|pqn2_CYjvRU$;7Ce<9dIY=31a0b%6aX(FH9PJ2auEe!tNGo(|=jB zefNq2<;$Iv>0cJi=A{O+#SSWA0_&<61iWfP=HxO+JY)@5a9+%)A3wb-Sn zTKT9VWNU-^t8lzS6$`C7kn^aG{&yOehSNG)oQHQQ;9F;MpMi9;q@Di}JHhJ4@cs@;Rw~C1-lXLQMAK`8 zoop$RWyR9ao#XikcBqhEEeYUJFE!bZbI^3MFaY>OIqTkeY4WH$0iL8McQ!%oY+U=z z;+1PRY*{q%&OVHEj0uG#9aV_AC}$EDezqQJ?a_vG=qEkVr+VI2*m z)6KWPw>>U_sU68Wyk?P1KAK(B7CTEoI*X8_cg_d2L(oCc+TGnlojqJiRu1Rbr17F%kv z1|gXB>4d3pVa)CtH1qlarwvo<3O9(th544aNkrtc#3FfOnY|orIMW{IC?@O}q$f`Fo+=?OLT-g^z{ZOXm#J?DMzd&^`J5M_VgKmNDu_%E>VqhjPnpPMeb*WtJF%+_7;@dVD_j)#si_9Xx2@lba6i&Ckoo z$lbK;nFl+n01{a&je1Bl2ehJKtHa5n%JNGA>MRv?X6UGg71mF$7>FcK$9tZ6F-4O- zYM(RnT87LrA9WTr2`$>vdcpEMx4!yZkAL)(Q=6?)OIvsY ztgJ$A%RoK#c(86R=^rE zpM52Fy;jvxhlg|)QFpbA3HKxG`3Sy z^++v|3{nGfIn4}@Gzck!wgbrtZ*RHTH{ z1pTl~570xN%h#T3wOC@BV_UBfJ)C_=HQRxn#z4=bdi3OeKcd@xJ^MWI{A-_o)ju%~ z;DJ_PcgreS;4AiG(|%q79v@`CW%c+$;~PLe9XNK>OW(LAufvX50NbX=evyH&C} z0UtV7?qcwXjlc7QFJB-3JhGs@;&%&tp8tb z8IS;h`pxC4%A&K!{P;k*Nvo|` zPh|)zrXyZ=9f-78B5U#vc`XOZ4RIVh4hK^8X!G8)vQL+;-TOQ_VcM5-x;I8@4Hw5K zV^S4S$!=9^*Jw1Sm8k7UrM=)c7&`pa8t%Vy=&&X46l|g4oOvud_(fMR-Egxw4jqnL z%3+mOyVVuu0(2w>9Y=IjqdR8Jn>PN*A$@!I=)O1uFK@wPL)rm3vYJ7!>9pjQfytqk zkbj;puPnzYTR+TY@SzG9(>%0Ffrct@U*y>7jROY_9{7(tN50v!1s{I*?zNO$j}Xn8 z=%Mj0XFUgYzjExDROaCmg0do-ZxYO-h-MLQiCCS99)_M4-Df`D{a>hUHO^xTJE=Bv z?l{{Pl!L@DZN1?aCdwP|zIZTC)k|QWCf=EcidC@+dhAu@_{R>d>Tyq(d+&eh`DtH% zd{2VR92SDyNN0p2+>Vf!;uaW2Ip{##(~@6;;98;T!sWE3~vLv3-Oo(Pu1 zCF3ys2(QI&*t>xr*(QaRSu3nkn55u`ZZbv2-9B^P^a)Q6>eZwBy$gO%PyhPS!2};l zM!OIZh@lE<Z?tc3dIbk#f}~wm<-~%^PdBzKGx0vp4yyN z&0wA9c`y@bejUVPszE(^#q16-h04}@Yw=qwSD2X8=ApM9=yE5zF&<<+@w6fca}_je zn@4_&CGlz1T1hDH;{o-^=bBn9wqzw%C$}X6E+?yWa_}rdk+8Jr(y=u?x^=my&)A7G z=6!fq0(b{SA>103a3{G^33=&KGTt_l{rotca;;T4%tHbD{{%WX-X0ou73jF(wFo*g zyp}!G5o))}fDg%L7sQ(!9T9iy8}nz3e{vwu)AfsW>0gf-)K)HOno7 zk}v?%?NVh$+4&QP_W06Pm~3|cgy2JxnVMKo96fP-5#ZC~A3ess`VUXd!^YeVe#=ub zQ?f^pkHC-HKt4vv?A>+6D&5RX_t5iBd11og0(_g`lvr}oUMGCHZbO*F?nw{gvPo*9ntk-9HSul^A z!N+N>46O`x0zTY(QPC?RIyU9?`739z_aU%`m=;EzfJ(tWp7j>a> z@^OQFJT)_A3hVG(p1S9*H=pVCZ_MMwuVl9ZRNX_f6s#Z)xrRA3UvaA*;3@4WTg-`G zxQC-B2Iv_xabaae$(7TqAOX7ed3xeo3*Nk~Q4At<4jxx{g$>~@zyl4coI4ie(?Y#q zh}tbr7G5v+)Po+Gn)gS2T^2wJ#PoO1ILl0%qsZmmMT<(^pMA_m$yr8n8^gPAt4H@-hAlxGA z=_D!?dk>%3^E9aEKmQ&yZA@DM9%HaB!Y$eA%ll7*gQ%m2B(t7*s?D##Z^?D=j@!ch zR#HvBrKEb8>S;OnozdOz9wMhU%I8xQs_J3wTUppcNu$WVs35XcEr5=^7SM^IodpKs z;Zt0WMp3rlphuoxSYBFqX2t!z?(5d?nMrRgnASNCz#)%?-~^GbJ~8ZaYDZN zMc*`e!JE%N)&Cy3OT!tX8FXkJGWS{>I-l{y;mB#J zI<12zj(i5*x$ll%6JEZ>Q}e)S!DX^7KWd(*reYSnQ>8#hV;!j>ieKL96C&EuLUlcK z+CM#G_`MipZ}iwn8Uxfx9xV4u%b;bWdykyeBG;F3p2OB9+Q7EoH44ZGm-~$d-U-i$Kz6kM7@@zqx)M_H%l1StouOFlcbUJGwnS zvpa9eP+~3SvUG8}>asMw3|K(#aOgP5Wr1~GGf6dghxD=>X!90q$`;!R+Ui7(gaQ@l&qy4MH4u-V`s?K6Smw2E z5bsdsPCMDN>eX?z;D_>qax{KsB-p(XGcVm^pFWFu9BS z?)t5*VbKbFsAq}b!)K61v=!Pi*=DgcK3-W~egSeBYPr5nF6({PmZ1X&5BksDBiuAtF@A6~g!j^%IfB6!1y7&J1&1nuibQ>*4bX z!H4?Z8&NlyE>b7>uwFe%;X*FE!(_n61^Bpwoxu)^%L78zsFq_Fyffv^XS;N{`|dlU zquL`o&3u>WdK2Tv6mdx{O!2ZMa8_w~MIj$q$*aegu##fdd#?Sj!E<%LbHL;mQurlj zB^kx>bIqQM=*P|I$K{27L~XsTmMP@3ql)iR@xyK)C$@fY)|j4MA$wx-wPX*gaOLG> zq@jfrV{rj2Q^*sA;Ggn#2rm?qK)UlwVyzGKf z->Qf00np5z5!cag;J*6a+54Hd?)IX5v@~-K_vI;?t5p1W@=u-a3#ZMQ`%<+J_~+*F z(?@jg0r-qQ&YLq(;yQbbMksQrM1yF3PXJoF#RebAZCWW?>P08F@Ni$Wy@xsl<+xDX z*?j1!iG-d9$G!Ca!pB=sFCN#+gdPVXU1z8RkqV(l&`$^YZGwKZ;dMlEofe9xSQg5ow>G=3{=y+;QyOxg&W$yzx(& zF^_lX$SusxV}PC2a9suBZi$bQ=>dE)I?~87%M>16KVabCfp_2c$h$*Ys@ViZ)bn6n z^IZWt-=*c5HR&TW?r}2iaj?D~Pu(nhmmh^(%y+ReMGf%$bNWj|y7!e+qh~7Z8K`kl zXAhc_r~?@TDuL|gEI*SW13dkZX2x_ANgq+(BI=>JT*6KWuruNTa$66LoBZK74>u?1 zP=W^ueL%-)Eeow?L9PZJPCRXO(BUN%9mAJ@u{QF@oH1vom5q-FBYARcT2bWirm$1b* zo1vP`df809%t#X+-#QY0>)v~Z&v>SNZP-CyhS!LTWHZpA)F`UV0y{N%r#8REn!;)l zPxD^yj~~<>rS+)ql`DQqo)Bl6GN}hS-yh++vTT-Qv;XmEi^ZBqW0f2`6msdYV*z&h z-`}f8k5S`Z{%FC2NwNoYoS{`AQivl|V$9=Kndc_XJgjd-=pG(+-9WEpyh|Qwjgpg_ zda;d8^>FmK8G2m7&Y+4Qr-~k)bEax(Ky1=2Jx9Q0wQqtR6cRl|Jp>-UnU~krDa{;) z23||Vo{IAFOW3-_bId>w_gXmStyH-7AKmu`yjHKSgI;?5HuV=`U{y&I%F#9@UN?9x zeX2)e9*HrJ1I%MrTj7OjmID*?K^KeImA)|6*Q1NNnkBX#^}!SU?t|)y%w}U0c8prH zhGvX;W{}qkqJ=AJzz*X15X6H}NFT2Y@KCE@a9D8geZbD>aZ^72I<*er?3GqZZMKyFzl=V??_uXSW=-43hDEMQ|K9etvQ9F{xOZMCTmOQ)7~XRSMo zpEDV@yR;7xQhg;X-jElchOJJ1DYOET&lfg3q4C^pg- z)oZ{z6JMS4W#1-*8%^Z!%t!??YxI#ND}r4c_g2I>Ru9~u-ZK4e4Wn8tQwO15H74FnUA8z?N5i%+qhpns<9| zQfeLJJdJ0YYP0-{oRMWH2n^*xbaifO-(j1 zHjYRHcSjunr;%g#@vLIzh!IF~X$PuJ-vrgj}#W5ysZUl1f zP}an#M|E-XyB6fA$z&drlWmA|2sy4mS3p^SOUF7KIh5wCi5#Om2J0lp$`;3{>P$B}-QK8i-1k z9jxPE$f;6T$5kJ}Ix9u+R3J5-3X#Jq=q#PXjict<6y&5#etXP-zEY}nmsUY%6_wnq z(6lUgE4I`?OXiG4Ocj^RaKojs9yflmogP`RZrOOW=|JAdtm-Kt^GcqIG9dO~JMtd{ z9K^I%1Sqx!f)Lv&8s~q4n_C%fj90yryfcmwH{_}ibttfL29y9cL^#}8X|Tbc?m;-7 zu%Ys2$UjTVN=wgZz6zLOs9|HFtl4z`q4a)mRy})htFR`jUr>712FwsG7f{`;-hNA*Vu%leqeAuD0krd%s#f;X_n z3*L9ZoK?fJHWo{86Gi1{F%>_&?2c_1pV+!x>t=BT9Q1QBi9^8QSyxwZMGz<+-x*;E z^H#c_C!k}PU8N-Qji4L`9sNOg-0^OqhmKM|7ZEQ@(NY>v4;?Ac5nu|i``c^42Mwvv zZ@iaQ@2?0xnnsRjo`~|Nbz^yH*+n**!kYy-d<-2hH>a^R8@L>&Ka=y4TEYcv5U~cA1-V%4O0aP&`Zz_1 z99?CE4juBlbTfs<1pB0u0Y8ib5}r)$_+=wVB=rm?+B0#tb@wB z(o{k%*fn9p2P9m{wm2*-nOI&{R&dBOE4CXdvjGJkOgQebOKqpDv>=FBB!Q6HiD+*uumtB=nsJ$@_7+&Geu~H zHszgL!!~3iAje%-Ui4(6HHgQb$FGW|4qK(+0#C>Q8c0Isq-c%+Qc+3MOGva<1)2g0 zIAD5(Z*CRZouzSf;#h~9@as?F4E1)H8@&KnEktLDn5*LFOL3XIl{KO!aFlwvr}~7e zasxO{G~t!`J9WUJc#)Ums2hpg6*XXEkp>#D`K|_$%K>nj1P5E%Tq-RsIjcD^>S5?iphG0|ERq=paC>(!H8_UtY zJm#guF`t|BZPxaQkH-xk0BvkpA>t}jtgvg@wuQzS5mp_ZPyt`^)N!&LJ@6K-VS zM)EJMfg4UZ!D&iN#j90T>{`l9&)I}x z;Hitnnv2>H8XO$j)H`ZqxG0TnjHr=WxtCRswjt}IjQR;8+)hn zj#mSXb}Jbtw`&KDr*t4EMO@t3IO~tx`pG zP8XZSsxntG$|2+k%BkH`k^Br1I-&-25^tOS_TxhbNvT0wSc8sIstUtQ8L1nZ@25FF zyD|f6dQ}dtM_NE59JIVC>PCYOCmh~JhwsVqWmRae2D>vkK+cLtrzU*FZVqwe5*p`! z0w0{(27H>;5IIalc*4iTT$K#?IQ=X9oGN&b7-Zm~43%h|70${Vcrbe&9MbAySxL#+ zL&_0YUg8wOm~~ei%zL2!z=8exk9z&Be~YyWN*;$MA!OPT#|q?HBBvH_MWn-_Q)VC? zN!fh?upu7TL{8n%N$T?6^f5z+NU4E)w1E6%1P))~?qOygoE6URlCx5ZRgOF5V4t`o zKt~J5jnJVnTbh*=tRtY~2&_V?RYq!CMkS5Q<6F4OQ8#n^9{@+()$UX)a6(nf2yeiB zl?33J{K{46&>yDp4#p;wSq~ZQ`m(y(gU3}=BX=i^+1=|#538qF1G>Y^l| ziBf?X*k{KoR(lR?oj_Wr|AQ}o*fUw(2Bgl#E9fy)tW@;qT^5(fm5g}GOqCd=(c&r| zmUFFxx4~+ihPaBx4n+4j7ds7-`+PEW%rJoGQRM(@1)}oE6Nh$h+nAG{wGjm?>MEsz z6_+~4Vjy)I*9sny#Ubzz?@%z#^YqTZiU2punc>^(eq0JWc|l@_2UkevD5VEpBEM0* zlTD)@hve9!N5~`Rj(ymRiR7;2ruAiIpVWd#tfHI%`csmr3U;aOE?V?=Oetz*@R4> zR=1MfrX_$*ShL!AheJmUN>b}C@eWV7mIcTx@gbliTW=*P#!4gqH^|YS&HnSqksx?v zKgrMK>+q8lzon56_gmDmPlIOO(BsA-RZ{}6)9zAfNy!;4Hm4BFjZAVQh8w_$ETO2zjI=AIr@mw7{Z65!8 z@*{+ucQ45}bb`$n#Sxd!qBWLXS>23NQ#1{s3ZBsrJkiaPYVlcm>~PxQKFf_%eQ5x` zHuGBCqbk_ZHQVz`JG`rl2KdllaYI=LH))G;<9Y|;;@4)*2s9#nLDS8Xg#;b7$uk?5oP#iqT=-WkHe$M{G*llH^HLz(cJ$dch;s8EHOC5RVjy zbUlkmhtukD5mQ8^ANT_V65SzBHZ4!Q+x}8@o2}Xm(M-LxRW6u;cP8_XYF# z14oLMBgq5v8GM$O+A)Uc=4O$gotH|Bi?1BpyF&!%BzUCsc-){88Nq$48FGd`{`U0S z64{O>Wd~W~8psi4&stm-(GG`BvEs5^YO@99k-e#9J#>7K6Xe@TD)eRiuCG0wZV=O6hsl!RfBSBO=aIztFSbR<`It)0b*}#ppsS!7{KMj10ypDz&&0CSukpk@j4$Kzvv@0ha>R5D# z#V9RAx}@O$3Oo8M>bQS>2hP@b^H`$i&Z9$|9G2|w@+0iHfE}V8&0&#LriMqO!}1K$ z%}ErY$LuaCE;(=1IO=eD}R)M?WB?Hu#O!6*!}5At2JpNbTgL%H@dpR8Y-}nquYqRhXOWiRl#2pI(1VHPOZUL6|rlU zxOx5WYlRIDUFbP8o#R_-pd3+OxhB{&4U>Z{^Wm#5Q&ZF?1m_~JV*=qIGADt&H}9!_ z{Ra#lKIWCrMzr(>8;`~_s^%L-jtH*EQi+SpXGQ@w_0wtOGluVx#OUGnP1#r_y<0Sr3W?KE4sH;OY;QB2qw-ETdPgM#Hx>RS zmao4ma+F(wytC`NkyG8NqT^MOb3h;m=dQ1Y9JO=G6FDUq^Vgi!wIj!!Xl@z>!Wmgs zTvT|R^#!t7VNyA+baO^#jG~YCYEOWH-bncP_-0o@4y}PO zBF7m}4&*qP7BHqO>$9AWj&uG#Lr;6sIdV99MNx&I4`h_{q-Q*28 zk=#|WX)t5biDvb*sN7MHNQWcmiq2QnhMWK{LUk&~fSl%oKY#P-M}Qok&DFSA$gdOf zd-0i>8@BV#E=AT zq082|kyV$%`CDM4pMMBXq^YK`jFO__^9NZTP*ks6>Gde43d6k2mK}SxeF$wlXxOOn zpG@w=q7i<}Lg<^iK%<4@RJ3i}wWMplk>tpOZGv9pcHa#r|)eCD}mz$z}MM4*Ic|&Do4jK}V z{~v)yJ!dUIqh4v%ZO9Tsw-o5s3@nJfn0$yQKpEm8qT!-gpTgnl zhKpj3nF1x85^*@_NEwy!45!50wzltxvI)LTT0b)Hji(<4WK8+-)yUxRRkZ|}y!7nN zq#Nm)E)S-B-1d9qAfJdPbX9Z6-H3|A_5~a@&(3=H&P4C1 z@l#PlE%ioCtOeo3G)0VQE_=8qqbAm>Rocw0h8k)w@@>-Q@p;o2YLd1opednw&fU0j zkOM)i6snjYmfe?H$U&xPx__mQp)j_n1m7BD;M`f6feJdM{sJ-_%Crje|JXCBCu7;Y z>g#|EM6j<5^V#-mh76Ct2{KYskVH^OhqJ|n#iwy>o~FmqSiuEN0~UI3un}Gs_ko}p zKI)lwKklAHJ6R~f>TaZG8U3iBh8ILds+xnJR9|7x0OM|IZqf*d ziP%(prRcn;1a8O?vpFn(=k}$9m|+h;J#$WLsQ&A*n5H6fV{G=7|fi zIdf#H%;17@0&UR-Ty|~AN#C%YlrJCK1jCr!F9R)>_`jE5LOip2f31*E)v28`>1FUmlSGQbES{4y*nfgEm}etvt)+e38{%s(*!HP@_2FKl`BUODhb(3 zRRli{7OcVv-LaCuGVIZ3-u&vpR@Vj=@VCk?T)%LCRH=f+=#RMSH6~_i1B;Y^WqTbb z5m+9SQWJOBsq`eUvN=0r#P$m|5L26OW4NK(>1Ze7npl6i?)GUWMiDZZdLE{!jmUfj8PKz|56ik;|O@7 zyDt}BDLk<}l?xt@NFN}HpxQfB=%@QKsJt=ZDU%T^=fEqQvokjt!Xsd%CPNIR6O6dU#PPS~{ zzB-uWLp zHEi7E<`)*cF~Q6@WqY;8DF=6L&dS`piy|TsMgu3Oli+|N8`l97k>RZiCRB{1;OgVA>I%tIE8RRp&nQ6BE#!V+mf^A<1OaK6bnUU7hNg5 za6k#3c`PKQ2XdSs-Idw`1G3 z)xG-k^#w%6O`kvMW-dyooQv2=$=dQ@hn{22=ve4iULLy05ONmIrdrLX7!ksoU_24R z^KZOw*#`)zzu=9D&pafhCS-UbWGf=$%OyYvMaFP7rnyp}4-jGmh|I1L@HRWGlt?8Z zDkbugkcL+efOzQ+r-AM3oJt`Qxpsi?ThNU>0fK>O!;Ugtp^kUGcn3&bf`kClFy0y% z7}UQ2_&CN^VCnG@q~Ig}r(TF~{D%H_+_d>GbZo-J$hG2wxJ?rym1cntqm$vHRm3-x zpVja|%f#Unbg`MaamNNPE_nN;38R6J-^w%wIRpmD0X`54E6Fy(#}p~h9P0%hSQD%i ze@JPIyezLYYYlb0yT#CnX@G||^LCwE(g+?8c+snL+b9huMvVNyk3FmK5LevAffP~x z(ZK^Q7H$QlX3{B;7Xkd@ll0t!0&wClC!1d^8%L5QYZ30RyTXlc5ypy0}xy~gB7h>DFBz3%VRFLi9g2{YzTN#WSgP6LaJG4z>* zXW`f&pNGm6s*Wn4-3WJYp1AmfS0+7*0`k%#*%gn( z2-S}{H1_cv8k=4NG^z&y8o{wtUGN4CEr8*|gEz&|$J3%*F*%|F!^^1bb~o zp#m72mjW1lQ^!7E|BVH&bZ$b=@7i&pR~(f(TyVv~HEC^};SCq21b0Hi_Tv_R^y;L? z0gP|1$gU^>j9r^Ea=Ff;U zD$VB@X`E6?Lkn2wH}l-PCO5R-Omc&Mvpe1&yXo6LvFMYjll}{A%)Y2#gRZ`FY|z#_ zfeqi{TX6n4B(7Fy(3GM`jZp)(6U_{sT0`GS3uvg@JpO0UsBvOhg@&$kK#pcDKwfq` z@qshh&!G$r(RUU@LnP}w{RziLy@dE^n8flCpn-4}8C0eEOV9{Yp|OCVG5lHFz4DpT zxe0NzP@1<{dDTK4nr=CcUWKdQYoSgZ|#mkgnFD$UNnWBPX;b@)m~&xYY$TJ7m?23Bdmfi zL@G?AOtmsE$3%ESOh7O#?B3aeLqdx8OK3H6;hfiBe46ku?hv*%0}ph6 z>F{nilIdhU}-vxMhmr&Rkj+2eDpC%Q*{OJ zb?u9{rywK&9{M(mjvV{aa&$~pm0dY^4AUp*FjayQ6%XPjGH%*3*;!lWi;Y5H`-9q) zMtHy`4!<&GJj|0LI2UVId$BY$-WD4KJUmcv>GG9hJ6VrC%VrQ9!UY`iKJ5uOJT&o@ z_ZGd>3ELKsIM+LmKLdv|j3G{dAxK&1qY+Ao8sVUk8dschoT(9|&ixWv4qGsH#^mQl z01(4>RuLdD&2#BA0FkK&1X_vAN0a3MpU^lJ58j4%_=LN}Mosxpov89Ke!!TrDmH8G zNBB#4=x}vBh#SXC#EoNql?X*qWqXA&4iVFM+>O))*MgGPQZeHCBs5pGh6}- z?s#)7Vc}nAfQ3`LjNA|@u#o*0Vd0TUuYR=n+4czum}>Xn25}3Hs|U?hNFXXrSXM(= zaxffIz(ARBDwa^xQ5QFGFqq;@FsvN!o80HCh3~ySc@*HVu8hM0qs2$|Zpl*M!1CY( zhu!f6hggEHq}JxSaNu#MSbgCNEN81PXk?OzfjZZ2^AHZ=#;smZ{v|kcy$Unv&dC1o z%98{Kk>2#UR~A-dc}g%7LrhX)X_Lb+NzCI=9%>k+gHL>{1!(AW;_{^{XLcLW5GBx% z@d}~g(TP((S@c9(@Dn)-YJK1}D3X%ohk0s3(+$urDj0ZbqSAbdF~c#F&<%BiK_6vc ze-c~P;oGeHoFyMkdl@;axTQr-Vuo_;oIJXBYgSJFeyk@z!W%ux1chxeazKNS7~00D zheFMXa@vAIyO;P-38hp$fuL8AV!z~d9fT#xK)lfJ+JS(3!d3$iL~P-qA$ekmrY9-J zqctccHD-b}{V4PTeN}U82r$rk|K&>sXFV_wtzcmD`e%CfzQ6C|lU|$s?U>f&qi}go z2{lDLQ5Oib{8Xj+Bm==wRV{c20iS;7xf9+=BFC6wsY?x1AMe}rKeLv8GW`{#A>ux} zsKB7$+_Am++1dFlJ;h)^EneH=D42-B{aeNdv@4PTOM8^4-XZwFftB^x7KsgR#0SDX zxNW!8T!o`7rC^Z+{KKC;(Ags@uC>4cLWw%1BW^4TseseKz(EU*5EQK-VhLrro|=Dv zgW%n;GFJcbj(ZVYdTyj3=RmbEa|{8Y`5pk_+#Vwt2$`^H^+*7r-;*!CK4;;`R=E9j zH55Sov0-EK3mOV46cij$QNW{0Prsl?fu6afMt<>)Z=Jeq&Ks|e1q7y^uoDx|nxy0V z@^iAbvgCESGOb|V0jE&U5-oT@4*{NMAcY{|Y5`^Z`C1ZfnU*%K8(L!<5<9Ya9k-zg z0@W$ioyt4esp54t2x1qAeecJlPO3x>6nsG(eGZlatM4;y%Lj}i+c4Fm-A zQ6x!&6O0HB8+0PXgNHQW5YX#dQw*i5iMfz->M&v1+_$FU;%sW%=si^e1t<1z&&}LI zC_onlq#_Z)ZYV{c;AqAJTqg2;YP@HU7Ml|YO0mU}Z;c`jkgd1Zq6yS3jwBJUivtJ% zWt|)yZ%(`h0PstPIMd4jASe5Zs<{51m**}%{_*)ZG2dR`jRC~AVL8qm8;bXzunE?` zuy?B=u_UaYx3EXgUiS~0`0C7gUk_?-eE!#FdppZF9#?EnN;JQp-m16Hy+R4?iW2ZW8Z#>cb$~Y@d zd^eYqn~MN}A_R|R)9Tzc#%IOrce5SkRB)jc_q-WG|N8Msa5&5z$LYUO4l}Hr`qNc@kJk?hA3 z0DM~xU$o%8=~Ese`>!f;Iz=gB$A`x~R z_%b|N!YKunvu)A*h0x1)hu!9FkD~6-AbK6H@99^jI69Sda(9$F-BcFgZokFD-H{R>EFxeBu51B1LX|pE&0Fqth>4x_n`u(e_GIxGC!$ zvi$>-r+v6&PWNU!8E1+Ww&!6$UBoYJUt#99KdAVACu^Y7KYmhRe7c(+zp%Y2nmW(r zSP8`Mo78vycOSp`+M{Iq+2T|n!>2D6mR7?16YU>wC;9tC#;B&}q|X;V zQ#XSv*cDWXHR1F&`2VSX^C~+r3Hi?(`66tdtE(djoBuI| zY(9F*^iP(~`cKn%CGhh>iw$je(}#X=(_WlCw>dfcqwKvOQ1u?EeqnRo@5xm+{ZOr9 zN*yg+n!x5wyUt$z+1oS5lFgq#R7Eyd5`^g+b{;x);R=uaVDt00NdBe>NqOv=#rgU| zy1~hI?W%l8ZB5kC8|8JyH_H;o!OypBbsa`;)Ve&y1)~qG-RS)O&0h7O@tRkkt6_A7 z>yZ~!SFj7NrwEL$`8Ao{v2-_T z-uU)6fBbUR8_y3*O&vOPb2-K{s>+b~Il31$f*rK)y@b>q1^Y#JN&fZ1Ar5Ficg?Nt zbV33rf>>n71?BBExLtYU%5v`OH+NZz1ao)1nz{GTMMv7+VP&q~YnP7qnSiyGHRHCM;j@ z;mj!ylEGIM;)zpw2XQ^pJ4pOO&XZ5aHe zc;Ct;9Copsle*5EGa=u)NrdfB9e?c+)u>HLiW?U1eoYovkH3aR(?Mio#hBC_TU%{Z z^5TKR;@I}g*MyTV7dIy9*o?SU<+|})Eilkf)ak>lkZriBU z!%M&W^quLCkh$MGZKrG=9U$7jjmPki@NnbI+|?stZfmrT()HIq9Kn^Uu}QfRnb$Nn zb{NBhYtp@SlgQeQ9hE^tj=GNIlkbivV|Ok|F~Qn(2scjW?0qw9)5X@X7`a76ZBCrs z!V^2t_(vx`M=}b299an#lyE-R9yq`C;S(Df2y-{tc=5vJi+h>5m2oOz?z{~dACS3m zC-J=ni-x!0&l}W0Qd&)hQTFy~=03!p_g?10NwU{&ZsEdtYZ*OnGIyJ#{@*O0``%k) z$=Z+Xs$>}(>Sw2b4ejig3QH+#hh2S=^rGZ%4k2PNkh!=&=EN7FTekE~Wb40ph+doT zRs~y~=8mq-++^>RE1d>i+v{eRR;R+=SRJW}HZ6OvByA0ZPS2YH5IGRZ2Stg;8S$2wRzL9 zKVgg~=h$#LS_qv8&d6~eR4h$I?%mQ{D~nJ zHZEy%mtCioBWtm;+_^MGPATeCM?9{7)nw)0ao&%9*nqhBl$U>6H2eK&qsYvk zowM7ksH2Ap_UU<~&d6DF_Lf$L!OQ{S+8Ijn)%+}+3uh>icr%=#RH*xAE#YeP(-7j< zWoB1rXz`SiPWN5?G3&0FHiMa4*6yp-RfJ)zIhSHe9Aw22As$m|yiGSu$xS<>O*WYL zUxzMSynJpqTld1xqDbkKW`~Khzv&JW-~a3zv%dK8&D$H}%Dq?Bb{>;8g7H(0gja6NbpSxTHx~?YY zEaf%w_xJO&MMX=X8FAQ{q?m;JwB^Aj-F;f}%+&DMxyC6aqib$cmv64^89O^yq&QN_ zI{oKr_QhhFOLQwR|*hTL+$PwsZbWJ99L3Qx^ZT#$? zIVub`?tc8j#e#FYHi_7p=81SNEidhTvT^^HW`4L}`GgMfWMZgb@E~arZA)93~Bo&L|-h7gG&|>93>k$i&o0qnMA} zB>DM-MJY7RPiFCZpiWB_maOmt#N-diz_;mWS`^WdFxO>ITD86|1KT@SrBtOxxYM5#vL~8oln18`fw|5TM{!A??mX_aBa5b`g$L;?ar&(mOi`5 zMp+X&6bh9-P*t{R~f?ZG&>BM<3Ocwt7*4y4GW!d{Y}IfR6{ z`gpl*?erZi#LbjJBHPMBR(ri>A5Zr>!OhoY+p5m?lnT^DQW9foD~OQ~)}LR*)y`I7 zQ6T3QNQ+;?g>rhlvc-v|66FTlY7bYA_KCEh0u}u1h4U8+PHkuLlb8hLt(4hI2a|Ef zyftg?@^AVlk@v;thH)`~6+sV|dtXiz-n_4!X{^1>xI4TWmoF(Nfxx{l{XTwA)Cq2u zWBuaVJ-u?-+z)3y4%7a3R~ea>1lF!i=^J(&Ji)2iPRwi{EBVz63Xg(mC3fjfVj;3K zq|5@4gSW(!B~FguoE%FB8eRi$r>`W;`-ZS-27&aT{5y|V;>UQ~* zjyUZ^v5R8a;3@=yTuso`dH!mN@Z8b1h#)_I|Dc%{!O17K*~-C)`K zpL_emc|U!4R}-oiiyWdLWGWa?P+Xf`E6kc*tI!PTRHG!?vdt5nWLNxNY>egUZGN9x zv24=7Z-1Kq$@|Zzf{<5VsfKcJ17*K@{3x0ozW z<-L+>yIpXxu0vjngL%^9`V3pvSxPBL>3J>BRXuvyhFi5pXvA_|#KjHB*+!r}gEj_H zdj@ea0s+QB#KYQKg+;>y{QUf_3ocx^RB&`F*UD^a7bi0^!l0zG*S^y2zWaI%e0A0* z->!T)CElqk12DnEYCt5U>N4pb_EfhkPqn5=MO9U{`dA?X6-OaK=(%G2V;kS~!J2PB z`)K+@u;`4V6%ffqm(L!fHia!XS7e^V)9rDb%az|Od(`W{X3-t z9G%3uI$oLZ@U7QHz$KmCuxID1+EagwvOVaxRbBk+j`9`(az*g!(~Rfz$+phS7E&o{zzzrM*F5$6Ulz^% zbjol%$*<2o@d^T0yGxeLWe>uT0X81f@HgoSEeRnxL{vm_D8@jq9)2@H z=%KdP6U`KLc6TmJ=~d@@G?)>G8gH`Ed(_+}+nm5ViIuEG04G?s#hRXr3n5yC!HWDj z!io_gu;RT3&r@oV?er31DtnLFzf2}8_M7tl>~Gh+`|ku)W|zdSiG<1Ul-d>!fHC}X5CB5 z_38IN`FhoNsm+A}`Aejp3@)bhDu+hQsG1|Oq;C~G;|}%`x0uRV(wD0oY&C`f#c3h< zReW!X8HBKQ!E0AX`!(x5@7EX8go`r7Ven#b|7ez>!nu@ec7xpjyv$1D^)k z)m`*g$snBVS)WP+dup0Rxm@um5w3gn4+8M#Op4Xeu zrkc<|sH|4UOo*?7oR%rqh9M`N`Qv}dg8g6r z`13_Se{^?a7khx*e$=OAvI=E`XT zM3&xDiZM#9RR|mMSVVKoeo);G_;@5ilQYX24B#8ju%#`SX(^6!SHIVA|~Ew+h*7KDjx7U zO;?62K%dS@SAToVcDSTBbK>owPi8y46I6QM_z0~W-B3|8L~>+2S4gqWa1!8XwgI%k zLykkmT-vvhF{g4>k%px+f0;st>;1x~a~J)xB(=G)8+ks_AjoNx%g~xu%V$>G=+$a` zBFkhU;?$lU+0BLE&@bVx57w<%_{GOh!fr!WUMPp#WBVkr-D@}A9qCZJjH7@jyZZV0 z`r_~_e|8RQX{cMV8-H?~GTpHqi84h|OsRCM(&ai0SI{}ayVY=8kg92$j92Vnw4~O; z>G`RQi4B@Op-wSANf$9eMxl`$QVJF!Ac9rGT@fat%AjeW$}8t~ZeUdDWEC)Sc4>CUNnGh2LNv~uL!m`YK)QFJkbA@+lhqi04IbBB~ccX57%FOM)$ zq!7P?EOs(KkC7v{7~WXsuWxmQ#qN9R6Tc?i=l;I(+pj)(N*?MS z61n(H2||Q3$M)~on4XK1qR(JLhy4n9-SkDBLsw#Xf753wth=t9jU zJQUy0;y;dJI0WO_Bp)-l$=n$sYv1ikCVS+=&%a)=_La_!h!MHT=!H>S;U?kEIzA|w z!Wj{7NHy7J_QG-$lWF2#HJRFj#6>MPnIp5_XyyNk@LqECt(**N2!73b-9TfVxKM;VflI=5vbzn& z3McksPijYQG9zWx zW+Y|MnCB2VXk0LoD=MH#k1sQR`TpB4C#4RRheS@_TfnGq?>4-oExQgJgSaTFARX_V zV`aXIsILfVY8Q~Fy(FT&5Kr2Zlbb4T>c-fqjcOMDn!+y+oXMY5xYMDpW)LzGyfZs`uo%^Ovk${bbu%mxrPBZ;7U% zDczxGybX$(%9)cQ#^aiT7|$I@YfJQRiGbsZup?j9I=21TU($YByx@Z|>@6)jSy*u4 z%&`MI@s>7h-+TDPnG07+F^=kV9k|QoYqr2Axx$LAsO%_aqB$lx+E);soY1bZt}#`o zCfYUoyX8b(cSKzRghuT4S2qMGH)&R*j zxY?R>=RtQnbD3Xqu*Vddw)*vZ$VLx+^wqa3f1lgEi3Afl)wcu}z^1QByb%J^;BxAUhAC$f7u z_hR8CXb5^pIPJUt$jNgT3oB%t*K>Sq!$a~9B@2}>`|wU`$|2G->MWiSqdP^O>parm zZ=hQh1F6Sf=)ROKlD#8UqAOVpT_mg#9@o@(N7m}lYGxugy(5=z@PGqQdsmKu?~u93 z;3f)N_f>B)QLiaqEm-#J+UGjNMn^lDiQqYyauBb`2UjIUEJb3^rJ5+0nJB}HiKGA% zn?VxqhzEGia3|hTKvauSD>GIv`R3CniR=cyy$>^|r;qL5xj6^dPXLI8Hsr%rS_tWeCZ;AI0wm} z5oOgWeO3qyIc+}SkmJ6Ak+Uf`cyVtY-jK`;t^0BD z!kHuGA@0H9OOIbxo)BG+B$7K{SmAP-zl?g}RYE2R1|=&&Z61`FmK4*N=;hqAjb6@a6zu8c*g>|(nY=}plhG$3%*^xe(m@Uu}*_w_`9KqmJZk${SP-xHZx3`ViHq^^2*Xw!y>G&s{!$>ga)8TW~#X%g%j=PoBM4QY|^nXNSZ01ccft z_(S=I@+$gAbBo4oEV<5RBJ{4OeY2>D>!^{`5z4BjIet#PRMZ!yX1^MWm9Zgz_kp7*N0vKanYArpnILO1YBFRM@m`3^bXLKjiif`;ef{@arJZ;%!YT!y zz6h%{)2zZJwvuDuXLtmeQ67&cN+q1(DTW7?ZRRkG%Qx_!dFPP|JGXNdRhC6iTnuZ8gIR8XU7BikQSa|?yC_bEIv#5>nTUP( zbAf1Ox&~GW^_P78t#6*C$8va6w#=+jFYVVaddXb^@98$-t8bV6mho|ygs5uR1UibP zA&>w?(g5yTr7)Kwp}9pe**jTpDpS;%@GU0gU?*9GH*S$d9LyrEBb$$0k-Ki?_X}Sc zM)nx^!_o63&UV1@=Wd2;Iez*=som*tI(K)IabpVdtQ^g)o=?RcXW^M{oo`7r_?Ex_ ztuUL2J0_Gbz^$7>^j5UTA}2@ilz|6@Dei?H3q@_Furkmx8YF`8R_;cd%;m!K(9W5e z65fi>`Xx_ET>|bI@$olHR%fhyxCP#cQ?Usp8z{9+Hjyy@$x}H-t7I^%tTR}JG&8LW z6zoN9NKU+0r>z?7l^B~cIW2qb^6$SK$KJ@W^(W4qK6Y@=wvAaCd0XLCPMo=1Av@eo zpJhqVe&)c?D)hckx`TWQI+%0wS@BR9>i+@~~Hskg0|ZU$-AtA}J=}edbgGap9R%Lm?+7bp13Z^XKJDKY5J3 zl4o;IojZAC|4y8|%-WE@YyaUB=L)N3^p}=Q33fF!2jjOxQmXz$ivDM9yv5=dmi~l4 zX^-vKf3KUrU9pI|Y9EJO^cL}y$GnuzvjKdQ7|oBksLp^m(-CG44RrbX4cK}9B6}lp zrVG-ze%h~}b-!Eg;@|b@`HO$}HGA=(L}#QU!oePw(IhMgsbP{dW|Ch$Ok(n*95q%d zvf!V!>oJqqZIwWJKxFe_%QmL3S^oXoBjv%7g9c9Bdiu->Vy;}cl5M*YSe`GjOAhnF zfzF0z3m6X}6ni7o635>Noe9I{v;@5*P9oaUT*=>Wl4hPJ!ReG#{z%mPjGXMR5f^@+ zDAqCJ;;+PsMxf#_vo#2umGm9z;8(63-UQBaASYv8zvz)JUGDDEWyHsem#)cNKdED^ z#0)~&UMd&~M?&jJC>NtqRwZ2fAIuzUnK`Nu=5t44Qb~)ZBDpyncp-LMMR;O#hjHsR z{;_KLcdrd6FEa4m?I)pwcW>L64L7oV&w(SSE@EGRIjys+VLiVPE3}pyw%}@uwoAHW zLp8oqG_ah^Y=Po{!dHL4Eil7poGQkhk`cDZrgB?9oep*T;gUkUxO_n ziC!93&ua0-Doy{uXOAOpEIPX*N6xIsK*ac>)FtTd`=>2l`qLlTv+qrajI74XAVZM% z&>I3*o@!T45ok|MzKx23?eIPP$E-Q<7Fhq-ab7mZ~dy}3twPVHQ=*dr%oQ; zziaD;O!DY^4jw&SP$@Zls=sRLYUtx1if5sjLVFgpB;4KjCW;hQ<;w~+iY@3=;onPD zcQ9KRuY!;*+UXp+!F%YrN_iNZtW37@uzI2X4PlPJyRwL?3Jz?*(||eB*1YZN5^(Qx z3%*~uE_cPq=FAul)fhlEbLEu$GI`KcnRz`k#?LSY1tQ#YxP5W%LviN(U2tPKVT`Kq z#Ds32ZOmP_>c{!x*|Qk%&E6Bo!BJasGcxnG?AUwo*qNeg$x**#W(57(`Y?wLQ(^pN z2v1HdMdr9!6;~v9^^T)m`@i2DiJs794ms>p9h4Fi0e zen~`CcycRzd1Xeu^tE%kySn&~{`~vpYqQfPr^GrU;B6t3>1kjbhFQa<<0#?9%gpPT zE!OC4;Y3lBo&~K|(=1_!va5pBO^Qew{N3i9b*oo=F_ug*p#OLKP8>bBXFJ?Q7B|H? zau+@qCqQ)g1cZ{xH4s#NMo>m)k*qok77w<^8iK$1RR}ZSxBL z%)ng*I0pKbTm{J_?kpTkPL-K|V}@AG48fg+)X>CCK?;|AH>NYeP);zEBdh|NC@HG- znAKa!6tf>AUooKnlD)@|?BBg@Qx4P=dllzV{&M&neGJac6kxU@u}vchSQW=k@_BO= z%n~|R@%LK-3wYrx5EJ1}R~c=Jkrr}G$ZeacmZ+Pcr~wV2B4r3uSey+5dv8FrQFP_- zMiy<@GkyN}?s3;WLHED@{qi;G8 zTi9WXQX9GL_4(Pqty=NHXvGqHjvd~&D<5uKvBZUP*-_u_I6MY9(fYoDRvUX0p48Nl zQxEfE{O~GnUV#Dd!lF}KvydXmbZ7ab{V?8jPr!YX7XPs7kB#fb zb%?HDhJd40xCtzSN8y6gHu+MagxIMH$&oViT4soqEICpIPvL4{YDi5N+*8n6TVaT5 z7^2LU7?UzNV{6v0KmGXbC`L~Gm+U@zc<;`w8?w`wAr2hBgpjYH-EnAipf6lb{eUp^ zeL@N1NsxLHK0+}BwyJpX5$c<8&}D?b*AQYa?&2wr*&>@TL+I43JE=~3B11?vpRiDW z*rD-<=Pshh^}?ntpq1Wq36ngs=mV6MqnNOHel0 z;TL9y6{?pYCF@kYgk}W?YBP3FQ)0~RGjg_M{sE1h zzPB+yd;QNV-&G7Tf7_vhkWCx1*mKy8=TPZz*zJzJ<_G;@3BS+?PD!%YID*+h?;JXi zpML&}3S2oUp&bhBM#x{XLo#|HxpxqDSo#Xtq5YrcBokR7z~vicdFlY!pzs)S*6`A< zta{m*zsz!W4R~nIiq-3KHh(ub36Vq)^zS!&t7-u(LfyTeEFfbr{=gFavKtSL_+b_WY#i#P&5~NHi%bo3$^~?LPz_1U=0$W#)X&ohnS3p=f z(DOzkKZ1QtrOK}SH3N#y3TFa2pYaZUX`|Pb`gr8=O zBAL{`-@6+Q9N2?r0Qa1?dE2gi$LJZr3TI!A#udaa7L1I?)ShY5$8V|y%IK8f`ICqD zZ2OBAaHap7Jpr8ouqT0f8g)aTlYw^W_pm$cR`ZYU$J=}6BzCUEX^8Ja0#0y~RNB#b**!N$C?_c3VO4WoSpHq1Q z+V^*$HM0WWKgpKRjeY&KYd#vozJA}SnfsKlpP9Qkf9JlV7c1TP`aZ=UBs=}?3baMn z{^^lXQj&a#)fo6kO!&Nn)+e4jegGG2^H7?(e(<}}qm@su-%n4UzI{7yZotq(M@0&C zw;+n&0mR-oSCoIb0H6NiZn$C8C-CXrIX>CHejs&q-y1OCjpeI;&D@$XIVGkHU%y)S z^~n`;^h*uhjDf1)1Io=S+1FocDn;;Ig)US#M3F$hLq)#>ZI&Be)40O4pG*RzDIf37&V$m&5nmdnXn-VK#8wYnw;Xk)CyS4-ZH9lAe|()Dr3z7vV3{Y9xE}S1u)>uE1PtGd zv$Z9qm-gn04_`kAlk@M(`0#<<2EMss&2O1oa%S8fQ(?2?%cGH)@eU-Vf_o>EK*IN~ zVBh_F<-1GuW%k`k1d;D`GS+cnzQ!I}3g6p=P@lhRWBPAvzj~T~_d!dy?Slr|n46KF z0}<3<_rbHJc86s5SvLqv4`hFE(TSa)w*M zdw6d4&u^n;3eCI&-&pbUy6pUo@7>v`$_9-B#A6Qt20Tf8f;|+E%QziD0P+2g?8`4< zU%s*)@U9@<w_KssOCpi5>0>WeYUXVJ!dQ4>Mvmc)?xPa>S{#}gY{~XhhQWXk`W~~0BfnC{x z|H?SySJ!n$d1HC(>xl@Z;{)|9qqklOyaKFW-kX<^j?n~S8NZy|+^p5p@X_UN;F%Ra zug}@G<3tpDc&UuE=E;n#PYx1wYoPG7h3d@`7Q~H{-yi>)y6L_x< zy=0Axx#Nuud$wf#{@b#tsU&jx_IWLB_nw{GHs@xg1!Q7?bjQBqSE?AxlzsajWXc0> zu|&u7RV=jxyB#_t#Y7Gn`@!jRXHFi0yV$ykal3Tw(XJhu6xWnU5wWSn2z+tR-Sd$V z337WA$lYH{J;=#1qG(`90>wl}MOd7E4WcF)xfdy)+pd0Wm%oFNivzRl_K>R3 z0&7fk=a;kgZOcnvzk23K{;@|b-?nEL{?4H6^bByz_T7gsGCfn@vGp+MfdOUwY6J?;bsQ{P2OjJM;0qh*7TjOXH+nMe(Imqf z29q}=HyUjVbo%)wy?v&zsJN^=s9?YPopbP=>t+5h4xc%w`>(!SxdLAq z(n6tsYvj z4~zHySpUtWL7)xr#-v}jTX*ls2XUll=5E}web3PX#v2VBJ0>&^z&DnId}5j;%E^AJ zAd%a~qT~xTNT0ahm>IkF?cKFw+ZGkZ)B;~udQADk6vJXk98@F|GS2in#240Ww8j^1 zf0O1IYoqA6s1VBW1_kt4Ra8`5T3&vBS9XR4)C{V~0Ws(0uK%o;j4vE?-=U~fh@FZ*BoMnA$n_=V6MxS>@i*)fqurN**n#-RwM19{yvyj;A+}f`RYQUW#no8d=N0Rt8%M6OCG5*CFqJ@CyXrYr@an&;1K=$|WD^>9*E?Gd?cSV~ zzHat^*@unlbN`FKZQlh?1@LAdiLq_Z@hjCh-~p*|>C0{wDyB4#Y1W)V7*UC(&zc+) z+54eaH*e41x_Q$EWse1sFRezcJ*i8mee#8+Rpr=h$Qq4U2F#h>!t=9YPjll){#iX_ zbdcue;-hgePx24_$L#YZ_^1^nC${3$EAZ;hjv>6}WiOwA@zn13-Ph;E?|=Ipi%2%S zaYxK0_D!8CTAd&Sj#i2aIpr>9-*i4hE9d}dbut~HeN+4YqwYPRuGzVxQ8dH6Z;y8S!dk;<-zLRn{lP+ zCrhusI`^t8ue{>&*UKxANszW~z=UOAHGFP>Qi<567cWS_0y_XH&oMP68&!1tz8TEVIfr(LpGBdWmTjoKP@m4rOa;L zpmZnn_PbpNx8Yr2bmJy<^YHR5TfTa82?$j#iCgsZe}2BUeD{G356{eYqV|9fTIxp- z3&aT*D;V`jKHp|O-()`37%%InpJ(5J5ojnL7lys zZQr(a%VtsZ2DBn zD@VF}divb`C-!ev)(&NZ-@JKP`IgQ9`z13Of9a|hKluXAwC0P|)3Q2K+@KOEs!kzL9=-LSKR}u^+0bq>N0>pZm;?hUz_AHm=Km_u(b% zNw2v4sW12J+XIgVgWt4e`>skvD%UsB`AsFD`iJ@aogds@mdGU?GqcMkokq^`vg?1eQL=~tbP6=4 z!LV<==gp%n*psW2eZ=J=(Ilpk>#9;QzhDT3b0v+Y6=$STW6DZ$z=0Z z-BF9PAj~0AxOK~CzgEGZdTIQ%kN*9ub>+LO_q}=LsI(qjD$ZKc z>Mfg09HOTz`AN_Ar{<+nMH4k8B{eUL2;5+(q5q_6Nc`P&*K1AnwMeXX%DhUf^Nb_@ zP`k9QxvdNJ{(_-(kKH#eGk@|_isDAN88a$}_B9F<7yRx>A93gHJ-lZl{2{r+&1lWC zb<>CUTzs*5iE?S&%`bhncEk3{x*gBV$?H$)26ui7cbYq-)W_}Uw*Qg2`yJHJ=LoU- zQGoGF_47gfyb0dKE=*JdDUR&Z?;ibGL*s$nSPgh<&9zef?){iOB6BCq_=H;t4ELc< zW#5ta@0o$!dtB0qU2^-Q8_Si=L+EBXnJ?Xb9V|o>Z>#QjrLG#Z?bI&W{pio_< z+Gcr47raf#F!6?nGImrJG(RCWK4JE+4k~@QV9niLy=C23q;eFLw`|+;>5CMTFNMxs z`QSTWtwZ17gJ0f%MwUON6D5fJi9VCg5pMzLoDW$!>D(Wfx8H&{zat2p6J{%T^TKTX z;LVfR%{S~(swaKsD5zaa!~R`cHh=!|9h&7n_^+J=4yFqaSiWuhp6Vk#+_$O^Hgf1M z_nx0l)FnLh_^Z0-Ba=NDb*Z54`rCg^iTuv(rj~um+7f1NXGKjD9pr$?Zg~9u2_}u3 zFt#uyh`U3HNf$m>+uzsk_ISNrjo6G{o5;!rL*2IS?OVW_a;fdI_*KvUZ~dli`|7IR zSvCek?MQYrZPZE$(UkKUGF2aT;8dpVO{VQt&=zp`rMmf9-Td%&KG5a?ZK95ZntFO_ zTK1G%|9-Hgt^%D0|NYF3WUb`!9{vyV=-p5XN?yqbwjVgw2jZY}iaXu8_L(JPQ&Zpn z#}_*dL)BOl8;84mZe!a!r55|1H-otx0X^KXSZTja=NzX35?6NB!e0$`&ja&9q zH|%(3Za(gJ5YT`8bz+0D;kGDE+T)yL>CMZV0ttLhK8xu9f$ z&5z%A8rV8*Vp&!)mU7g@n6lg6b1LrP9eUan zyi}fw3qY#rg_&cn`dvk9Q_Vh1%HDf)g+|w%A8xOx+_!hHvPa!pTv1tdpr-z?vmXWL zKv*E)>p5{~kAYi{qRbZV`yM{Q{ydDWB{w}IQ)-&~$;qEQ(6fhY6H;aM&5y61nvt2p z=VN11FMM)G$TP<4^ZWac?nl6c`@*aSK7aexwSTxyDAmHnKl=zZclOi_Ikfkc%Zk&2 zh?zZL%8Q<6W~NB1`eRfu(_?>)nR?0AWhdq|z4EhOc}IGoS8gzcDIXUG6J^+PbEm9& zuZ~ItApd>$r^^LbSA1vLAGTD5YKGMwJlN3K)Z83u$!u-M(J4h$yv~FBpde&T1X;`3 zcqtK!FL2*)3^nC~7F5xW>uI3{!uDOb@{UrRsCT^MSC5|=0!KrV zX5RPlai8KH?}PpK9;vi&v~9z?->~rgCnwndVv>rWnyzRt^w&TZ+wjMsxdh8fYmuSUBI%+vR;En)D4k}PYmYq(^ zi$DBMT1RSoDk_{@f6KF5*i<=|>J(8_q&+Dr-O%0J@WF@IBH>A&egAu{*eS_}-uk;+ z_Tl~pJ55%i?Hk{}mkCl9#^3hq&o^(`wZEYSN>qX^I8fw=9(h2KAA01K6bXy#k3m5r zQ1n}-=mq3nHYUl-{)zO+H^Mv813l`)go;k1QnfQGx+;ntp>06XIcq*|rafOQi2UuT zo36fExhiyJ+1>xBJ%&9$tX+1wIy;=s6UUFXwlp=+x*xokY)EL-jon07*Q?Q$fILmd zJFndCOl?b5*TlUh=^;ZC{N!-l--1&EbnmVWyITj3-;^?T*{?Qs2XT!>4d!^9^?OiR z3N{8i-n?bo_U)Vh_5izWWnt3wPyMSLRg&sj4*vbtDcNbbKPhTWdeG{?k2cZB)!~r* za7aRf{Eh(Vd6nsT9t+co)FD6Ix1h%(=?QRxE@}&FIz+|0l5<8~@Z+_I+m6&9*tcib z|6aQ5n!we{HL*{Zw|4a^eQIx3Pj{EAqrL6uVQX$F9gC=sOeYzs>M1;nZ|{!hiJgSE zU;9r4JL)?0eIpCQao~pLBS+h?c3g27;Xw^f2?hN# zv-h`b-BD53+`Q>$=M~^&Aq65j;O|aygB_n_C&2ES*nzu2ve|8ah1q!yRWVRjS6Y}4 z?D!Gf++fEGCxm?#lu4snhnn)BC=L#Jq+^@AWcEW}w4khAZROtG8{ho#@@uXMU8^oq z7stF+<#H>YOm}}@Z@0_Y#&Z{ue3KgraRNmp7HPUvQPXgkx(~s}ZgAeC+@stb`a%C) zN#DP9-?rUhG>LXQP&sUaRn^uXYCe3T*F!M@b%ApOeQouXuz2j3fF-;d`m_Eow^P(t z7N%Uj_>sSE*}el+7FsKQch#6oQ8o+LJwX#z%oE*A6EepUM3WCmlNWBt<4{1;%S_X= z=&=>hZOk{+$2LYZd5~-3*bUbv6a5&pl8ag5EI{e3`~K5J)r_mK7WDCRcPv^IS{z*B z_*1n@!TE4^A2>SBlVqBVQ{H2;uX6S%C}4q-Jw8lP`Y=Pc1=XN}*y}^S<#D_H9@U%V zcA>nW?v%8NI+X1z0I(F#4_ncWk7jZ<5C{d`= zi^|QucrTg)TIuP7CcVhyJZseuO7cLH}6u7i-QfLWeVI9DuNltE=Qf=sdq4&4-XRLw$U@`gq}z z`W!ZUkNpK^=qa1u?uM=PA>a11`uGvg`bYL-f+85AdV+!>Q6-bggA@yEE8ttf*fE?i z@4-)6z{uf-ngjbQKKuPoZ}KipzI|7BPltJllsF1 zOqycvwLj0KJ!uQt`=wfGqLphanpYdQq3>S|~! zYgZCa6XB5Y6f2RhDrrCKkVs4^L!gKdTpLes183y9ckB%88oLuq;M=yAuYK>4dGju0 z$`)R}_=j(7+`Sh?%#NOD`QnGOOCw9`smKP2vk;uR7o53ah=^!#>LT{_Izr&-Ip*x= zHbg!XXI{iU!I@|jrX)F%k|Pw2@1F}(6je0%ob`lrZ~bFcM^ER8*5>-!+M3-TKYQo0 zrFXS?`dlaUog+HlMNpG8;&$!^a|dc_y$9p#YOAY27-v}<)V1*&z!=;T{<*rgE_l#Z zuN+LOWloJ%1!1P@y5Y%5|1F*_xnYhPoDy+2^7V2dSCE`3I`jD1u zUAw6$wWe-!G<6d$tN<=dRv*C~CTup3KkdSM-m7&{;m*T{cK`nBtC!y0h651jI!YUw z`q2sIO_&vXqFT98I=Z8rMwqOYQ*Nlc08 zm8w-dntH+QZ&h^k_x<;Ru~#g6!WDqFA28Obc3+E#b$TPv4*Q9KH2nSxf&;B&?_NdK< ziE@urHt$fOY`uK6gm^>sH>qkyFi1ASC2W+gFDj&K#--k==PdsD)Z*N$?|h{%K!X-jpvHt*4;I_`LmQNm>H$j|G<03dxRW;bJk$vLWD%aG&W)M#B-LU3$H;#04n~sEOoW&DH-cZ=K>BD>dz^Kk2N#?Ww z0dL{uSEyGyuEIsm?`ZGS}E4CmFzHr?}zwAMl#44eq{NxTC3sPW5agwgfkR4p9 zUaelEU{V!W>|3HNPWmcrOHz<^p+VNx_b$3<;k|EetEsK6Z*E2R-j1q2-g@qYG1y1r z5@om=XcSn=mI<2HW{>)U5LrRkqaX`P1J&}fYV~54_;X2C5M+@(5?LNrE%yiylZCoh zTw2?(NZB~_EH+3z)zICTcAkK?YjGWbbt_=Gnk2YV*Np&IwBb^|<*z>Q6o28oxyTAG zx$N>QuDl8~sh}yeIDmPAvLxv@+D14X>%vC3AZoTo6#V^%3on{=#hVp}so9gO_Px6= zJdL+)!-+B*A%#gB>QF(gxY{nAK=j7-jr2gR45oUqyry8WOS#-xGdD5?48&|kAo|1Gw^QQ$1u6TXh{+=r3fb&3l<(CgH zUGhxWnF~S84DwAxE%McW-E#3cqtE=TzoX(0w_h-owqi}aYxr_0G)S|z@Xj?H!uT4H zKdu+{=7V?gN)_tG^w4I1OcLX>bxIWy#CSoBpNpZW366wBX>S*X_mP$}AWk22_oN-4 z5En|wI|aOboyVHATZSfPqz1in^@4Nf{k_$N;%*uBznHpo>8sWwKH?lcR<70+i70>| zu=C3Yt~)=wVA7(qr)s-{#EddJH_{VH(-Im(<+MeyU%FWC*EL2XriX};v^;9_fEaSy zo>(7j%QMW29D#^YQBoUKniHv8gr+mnwonFE>+E37s|>$QH*E$Y25G$RhCaIOvYDmR z>s_i-&G>Lq(b7Bq5_YtV_nw1mQFw4krG*;SpEel{eH7B^@?cFMHaxYD@r&+{~W;mnCFDXPao zp=qkLqThv#R2LF`vJuSwb@%dfvkRuWmOGbcjLpT_rSLP2ObhgE-E>e%v>>yu-1g}A zE{o(Pnv0PQPX#YVUlBT2j)ejE7w7@Z$OBJIw1jk8`q+$mW8Av7VA+9B8loMdMOQK@ z$m?yojTUvvXcTEOyO-$K*M*~CQh1UEgZTHo*PWM@KhbncH~cg$?H7mE&Z7i$Gf!u* z47Km)cV3>6T_z7AYE@1_3hFvr-HUESX=qzTxer?1aG77ai0%O`q%9svOAlxX>a_G& zXd!LEeidj@EyFkz`{sCniGS7v0F8oXHDt|`r7UNjq`_Q%vY9vKR(D1?P@;)T=& z?gQ#Vy!drqx=g&dhq{sF2wrSd6VaqF7od#0IUebYDk5%EPN+NGf%PRwjaW<*womV0 zH9MRb>(v5rzyQ^8$cV6Pi89qTFT3ogc1S7H{FMMu4mUeMGn4JsdGvrz{k2@=x6&a-H4mWyb6fz-hiG2e0#q|9V(!Sq(FZytU5fu-q^6j9|=>!vKKql+m7&sHOv-a}isz%N~r z^D-?S))w-)opz5-O9!;2+tI_$g|vlEnp4MA?(P8RLP_2n-G;%~XL0`aq2=jWCDuqZpmUK% zBz%ith5B6tuw;aM1ipoAsF!W1UuUIVXT>|jjQ~xTsHi@*BQ9RrkftuNY(q*m`uB+V zEZ04RZ!!7Ylks9&n%w%xcP|{Am%v)#Shk|(5{mt|b#`~Z@x$wNQiR7HLsJ6bap74C zIHBX{tlN*~SSTH%Lc>8O#lxhynUqd@pH9jNSddT^?~s11Yy?q+1$DkqHDcKX}p;IijvI@#n`X#931{ubOZ=uR~9L~g_Ithl;e_=ez+AkND-a)1S!JX zlBPtE!i)Tr{73qg=!zo32{#TjZGcq%{H}{mffP}SZ2Rs?-s$f5`u_A|)Rr-k!uK$& zsT|*Pq1huFP-?2CD*(lHDRChMqyX{|O;fsbQjVHP>F2Y*)Q*rsv!*A)*Un<&33n>y zd81g97`Q4f_mHL|ezYmiTWHn4xclN$pyX1qH;G@h9Pgwf5~9e9)Dw~2iYzW7VKJFc za&l4<<}oM)E$R*9lKt?0XbN%wk8zu}`58MB8P# z(tJd6Yjr8yPC#p-GFVwhVg<%y+Il_s^gXA-${cE^xD_?F8(Z7?7}h%v-_AF?O*#Kb zoQh^VkTjD*wK9Xcru4*gBm8veq_jv<$b3AwBSNI8C}1A0E9X(NVkEalt`hEN2UZoj zWJ4~+v|r!w%X=?51znjz`3=sAh$DTd2!zrb8Y_{mR$tgtvXj|*D78&V(Nsn2BN#+t z>t;m}oV4qlG~1l;v)wWMP!w!agA>%+MTtxDvr58(#3bxj;Giriiiwga9!0v@lTl(h z;L-TZYK@ZX26VI7eFr7tT&+AG`oSY+O3Zn!?q%uX96JbT@Jt-&Vb3uom)j2uuWSr2Ax0Vy!cs=wH zmqjo~9!$hc^JTHZ0!}oKV%8E0A#~*>gncd2lm1xJlMefFos$O1Ngr$nH9(jXMQX`> zLrV<9k={hEIT?u?t^1yg5aeIx<7BHZm3DK-;Dm^u;er}Byhfb}t!NOfIqBIfT&zC# zF=Z%**(4x6iHozLKs7b12v`U?suOZhC&b5us8AB_Dk8%U`PcKp%qGHq6}1k9f*4^~@Bx#tEE^cvnx4U)0v{-u)(T+OL#(%d9X|f~ z(|d>yJ=*9gY?u=XHyF|n%voSARO1voAut!gM~lu!HTZDBh4kUL3fiWD4;xCDYkXX2 zH5eIwjhT*-rwOlmDs)6U0)5lhp#y~uBpv23qfh?A{D*EXLOT#dxk+3I3;Z6*htuAy z^HIfobRo=8qqq<%Bb)i4be`;GR;nrTMmP{-}=JL-+?oGor z?Mc(LCF{rxO}G!_tgsf%oeJ&XZ~^@Y;Q*n~k1mJPen{t|Qu5)}`9PUgcBg8>JWV^S zG1ufgEZ+3nA|tXoK!Gx829puyOEKG{)e=*@HIoq+HDSBu^~k+B8Trbj z(YF0BF3wWs!85t*J zOa`+NHTPi8@lAE(WPX(6vvw2w-#=XqG6r&^7QYc@Cvotiq!?6RF95~pV#TP{sn{i{ zpsKhiyEM#(LZOBiog2kY$Z5!>=rAYxO{utTaGxQ{4ro;T_opa3kUvpt79b*u#f3_j z!C9%a5}_8z9V8P$HW3$0q*`ZU2bkz|bfLhMB29$SbR}-SPzlb_$z2%s0e7LT4w>D> zH*3o6oN=l&XqVRu)AIxkl%4CIQ!EWxoCRA4O>A}RK%gY+paxWKs00yFr4zBuc7g+| zAVNj?P*iEseZ?G73Bx)plYL4vq^l6;556fCx1OR#FcqKvbTz1$z#1WQP)o`s<|&k7 zSZ#w$gHtFN2lZXmn5fj5*a9XxvBpeHC_~j@4lu!UH(vQ*CWs1iM2*NWWWx2WGa+w@ zOC~JIr%1L8FJXzMnog)A93y~^nefKC;3nGb`*bEYGZTHN|3$`OL!~jzOL7rja#BYOyiW!W-T2nUII1S#iGwe|feRd(4h@~wxVYW1gh$Ne; zPMcQBkw<-NEa0xVt_tfPyKlVCLNuqKr`M6@AdCUUSFsM<2@XWxQ{v!LaL|R?Lm}va z!2!)Q=0-CI>lTV>yY1VcV1ZoL(<#{a`2FM4a>mhWO_Zb|GE#ERAoKw14QvS^>`)T} zn}J>Y_X!y2b_7@pY$zT{!9jD27Z|n>nN5c|gm0MvUc^&2KYsrt$-pVN1GWTOtD;l^ zmVm$qhc_gIn?}UJ2AzZd*pA}}5OJWQX1E$=3Fk*z!T@RXx52^1QVZ(jLZ(vw#Qjs! za>iOGRuSGn1V>)yHasG6fQ~ZYfSSt^2cl6HX~I9D2Yui`k?E2a7Ut-7fJN>o3AEgH z7AF+G4Fcwa09x>;su8?!xs?dW76e!vLG-w2vI1a|_(P~{;BvItMH3{#|99vB6>=gS z(88kdg|ow~ATn##ClKETeu@Vc{M&wh|J1bXG2vbyd}1x~W!(lSA`*UK0e(g=8r=~3 zkAU9C(uW0bx-8^B7yDr%Eud7{*yD&E5Q{VZ?{k6+P4N4X9)@;2dH?jZEP`*i07LzG znT57V_1qBZuXzAUiB#CXAFH!%vWW(v{{Xr#(AyY2&7_47ydWxiam+0|5ElJ^fqvJM z4*>mWV~Sv%J%uxOM05(xiakrJY=2W;PlqMla&cYdVy4-f^v4g8c5 zlJeJ5$rvB*p6+={;6LRENdAB1$Pqj};`qk+`y9t*fqcUM4pt8WQu}GDD0F|0)P1pd z5E%fCGziJyw*h`0Z2&X)<5XWE6x#RHnsZVie3Ry5vj&E5Ob_*mG7R6O`M^XO9ts0e z4WTx>D9cUQ|BOvvw3ueUPmpr-41Q%#7WzdR*g6*Jp%U z&?C9iEC6}!P{+_Akb4j}jE~Er*o6HpoN)~}Lcs2b9in?Z^7=i6@x}!s^XhPc~0-_d)KWP%mMBlZ(;>Q6kxlT^V@+ zX}vxL(pHqM^FTgmhBK_+26UV+qdjl~`hj1rIX^YCG(zXGs2-m3hU>iW_9%J@ygZ8L9v0v)_va@_jX^6T(8Td1lS*)C@Cnlg86_g0==? z)_CFRVD0eaC_4`9?RHVBlCb|4#Rr10b{k{Yd>v_gbnNT9KKxMAB;nUROYlpgOm)ngDPp!~QF-+00en;ir;=${9Tin23H~d%Cr_e} zgs;ZWl3Gs&FZWTRYJI^V@U!`(&yKx%=TBL0X$HVMr)QTAw7sUR#bF;@+1-hP3Gxg_ z{c{h_P0bi(Wx+iH{}S%O2N}E~^r1gZ` ztn(#N?cJ*L%IK^yW4|u$OR`Rm`w|`ZG0_aZ>G_8)Oi2gsLAL{VQzSy&g{`B7w_TJR zBit`CYKm@F)I!>{#-*LmvCL?UwB{S4J_C9_ptLUtN8R%LLl>o_7c**F+!HP?ikc^L zLK811^OVp~SR+yQ*s3O<2{wt_FYDrj z!=|-cF=G*{6{F-Lz81!GJva6{(V;#68^Ko2=sG>~jOdykkRc4>K6F$#v=cA?@QUQL zLbE$FyYYyrijl4(Eo0ayx+N>z5bR$;+98L6+KScyc3y;a>!%=$Lm`y2ek0VUJ5SHR zG4LqiE3j6?E&;ihDw;Z9(I7|JsL=DZ6gsIKq2MaYV3UFe?7!CCStMkdo06o@9mueC z1!s@;^&#hucby{S4u;(Mn;${S`DD|UwFt2iBT`h8Zp+EIuxWxE0%U&}9Qa0Ok zvK2CHTFD+8dDSEDYwI>a_MhHAO&wU$=aWt2v@(=i!0vkWM~evdfR{S7{c5ps&%4z; z6@|e{)B#zbh;;ioRFjF0T8%&3YSLlKE#q}wTJqO);6OdiIW1#UR&?FI(2N*mi$XoW z1>#gftjk#s(?Ye`iCI;fCf_1CA;lI2nZofJE=(CYYhYW}6r0Z}z zU_Ev3dyU~5@(o*N;T6X4nU_#&3eW^sR96yk$#ubTg}E*@E}Bx0(Ue*)HI$YO1~=NI zvqlq^6H7fJm*#$5ZDzFnQv;_d0}B|}fa%(aF&Xu}`S6OQ)Le69 z(o;@tDIq*GY4&T2386}8;FK_{@kz!ClGrm)vPYYAnnnDLFrVf;Eu%Oyy2Bb1j@OUo z=}9TM#x-Z*uEO;>N+`xc_@H>r9_w6-#}bQ$7L68XC%!J+i!*Y@xCGqvsJRC&9kO^u zYi#)EAexjXrQ~R*L`?3=q|XDGFR3nhEK%AlT%`%FHkDH2&Nd9#bb3ltX}BzkNQ1%U z`4D2M?rO10LU2#(n&O<2QIr`S?<@;m*$NzZ&A~{UK(RKPqEYy)QNRt_f2Ai{ngxsL zGQrgr1yds7DmcVqY=Y3ynB0`F7mhAY&mQd>4DDzWTD{vgp*3I6$i=#Mn!K>09fi^t z{l&sJd8=q>DIAfGhc6Cj!sVlJ11a-2LEAk=o!l`wbIL&CovQ=ZdilQdliQL~vbEW< zvBzQ2W{dG^&WhqJIcT$Z2Li0dpJ{ehCJ$}YvKW<VrbD2VM3)-HyU1C6eY9DlU4x;O zt>aBiYCm{{(Q1o5yp*qG=ZEQXv_vC1T3XjMt1`lM+*xMB4OeA(3Oaib!A5mc=~<&E zcTI9m%D~=7RLPzzBx}Non`ep1Sy;XmrJ%IJ3DMM8oA}du2jE~1L{8Z%SOL}Qk~OH( zYAs64X*0w+7}RJP)x~L9Wv;=HmPR1`n30AF6&rJA6_y5THdpmu(&Rkn3QFbs=VQ0WKwLebo#(ppB@~nwrHt= zRpV#sU^&#vWZ6iiii!sV8&!h=c2d_w=fsSHs2Z%SU0_CQ>aLrZlxePJCY=)}%CvZe zOgYkCfrynjC<}m!%z~C^BUj_;LVA*Z0#%;NR{X|K{Z6+}^EU9{RPh}Nbk@Q7-s1oj!88Cb!Rb2?KxC$q)MtWn0DqA;xc z&GMu5Fy7n-gk1S znjbc1cWQj9Fj#WL(m9b>iwG)vCmkwRV6EpS>ZpQ0Ak>ReGm2dTYD!cuTp~2s3KjRD z05xCEasbsRM4$;(vsLXJC#8tAG?)^g2&ppE zvCgrOYILaK3d~*eKKt3~?1U60U(Hih&>wU>V5w$k`b(7v;g?XsnF_71=T^y0~Iil~h8RVMb{PRLPztl{X_%TB&ThT}6%2WuH?l?r#e1DO3CYkP zliw9-lBfkSTvuGfMrpA)x{a!O4h-Q-#T`(jq`5Ql1k5))3VPIdNO2EVaX&pI5bL;C z7MzO2i3KvDx<#(h&e0h;1K^|%X4D=O=S(Z>T0~#Q;Mzx5ml95bsbm+56e(PsreI12 zN;q+b))HU*=u0M0TFsL(eNCDp4QawaxoUA93zJb&G1PW+yxFhSL?>6Y9*w9mzowRc z5+!z-Pl^(0q<)UR&+88a*FCzrEIv6$kxod>bU>C=ao8yA;Q&aH3TpOAC&~r}DXdc* z9S^UsWzN;HaK&UUz&8}j}ETyMCBRzp2dKIWE)qHmzYp!REY?u%vS~TybG9|pgsX;7rmSyCm zSgmpgcfk-jG8$XaNjW+oidtb_zkkDH_l}8A%4S_fUy{tB!X%{_Q9A<_!RT@*LDX&l zh<$d^TY;u&14E21Mrz5V=1k8`(-8uqmz#Ff*X)N)vY$n}mQ7oCRn?0^EY$dIL2_Dw ztIS;%C=HcmVx7(6d(e#tAqYuSo(#8q9`IO454EM-_~1Hmq7&=JZF~841$^nDX9Tk+g0@c zq8nId!`DG6FCZBK%y%t=^o`A zm2JX@79Mq+0Frh>J+UT)SV57r0e!%nhu7YN*1u!0hRe5WvgC%}1)RUT*HN*bU1AFt@jXP-j z54!0?t+@G#DS0kn%fX~u7@oHu6H(00b{NeT3n+T-t*UQssr;kpXgn@0y;Sc^py?%s z6J~UDag44J*wD)^5?F`@M+Z#_7)3xsa6&IdD@4-EA=$HX%dWoOzijNs$9(W90iPF5 z#yY7n1vyW^+On7Gw)MKbC<@4^ik-z{F})V3WNl|o2}mcA`*8AuXi~ZFvxk%`lhHGG z;Wg(LOgd9bMe%WjJW;us^pWaQS>u5^2rQwGRI`iHZYumIiWCcd6m2lotf5!mb>Fk^ z{O*4LGRKpZeM+zh-o)K2a2-Su-HjV|R>2>jnjJ8LiHc{^B5$RhdVnQ# zF?ao@&0qYMT320u`NC@-`QvLpz4z`jWkN=v$U&NAC45MT6Ea-x2m|#rB02pnTnRN< z2_>WmAV7`GI`4&lfBMzB_5b+AD*v*Q|F!wh50+7Nv?B=A?AyM!9HK&P*WTKv?gpkD zSCO-5G-g*MDNbxUjy2a&l1iX9p)KkLG6<2cE@Ae+tzq5S97r(nZ zux!-Qm+Jb_DAWr{b)n7Op_;v0)}jS3wW&DpHN~GSdww8Ld zF$FBNZdEqtZd(7}mlleqSyw#t-ujJO_tw;{T{9!kgi0u%CeY#=u&ixIwAK!9X zu31b5phz((0{}8B9u;je6wl~hrDiCZ30ZklZ~eHofduv0%Xb8qsY~;I-{@wG>S{mQ zSham!`JMx4xw8AwJLX6@`34-H8%^gZNvY)CdF$RP|DSQ6d|p;s&dyC z&jc@4FG^he^Z#tvyrZ(d{*xa}FF?L6n*ErpP1MG1wI6aE0?M~KD8m;bCdG%X`< zKu!OI=T>0Ox09GfjVK^3Og(F z@Do4i;f=X-Gbp8`a`8) z=<;*4;oB@4L=|nxIhg?{umik3BLq7@^ULDdk8N(K+qZ4w`oBGX{o+N}Tz$pDD_{E` zGLa2`yKC8*afunOTxaf()cCkNfB2yi%ntO{z6^}lUUT(Tx4!f_9BNfV&4;U|SIfW@a=%BA-;~h&DW6;+u{_(ryHftNVKQq5H zC&(klJ6X-6jaVZ(h!(ZJFg>wBQw&ojqQgflhz?~0GlNTT-QHNcXY0oGfBoUr z3opG0O%|{I&7Z%wWJX*9k9Gu)_PwS*FG0hu#6{QM^sE2DB=3975V8j0Ho7R8w%yJs% zyt(t1Tr)i`AI$-Ll`ABZ6*H= z0kR690yjpf5gG_1lt!sSbE$w0C8<<6l==XW2PYK>Arb*Mk207MfaWG-k6!qjz2x~e ztbOy&`O3VZbLY*QLR?~u4sfYpfC-CMKK<|Yo3>ZfH++8I%zPy)kQtQY6WtfZ_(H6r z8jC?#RsiDGdI&yh6QdL276l54Luv~{c13*z#pr@*!SrB;AD%fqf98E()Yn&R+qC|l zKf7Yy+`03nBtR*%oLP>PghXcUo;SYQ0H4)R`R27_b9@+A5WIzS=@M_oxHR7UQO6}% zGh`dm#}xu=p;Q`I0OLx}9&_y$D&O$ctGCXZJ3TEGYh2x#&dikbl=MZ5u7CXF zbsM+B5pDSKxdr~r0EQIgA(1G_nyF6=gu*30N#Tg9$RR1xGKeZsK-!>+1c`Rg7?K}D z3S=e~ocr*GhPu65H*Ved*v)6<#1N#ipwy7j%C>&dxPzq?{WPAJo#5l9bUEI}wg z-l30$)QU<73gx$sg&Nz^STuUfV-f8i(e5=Rm>R%XJQ)c&6IQ%i-B7i^`B?c2Ke))1 z;mn9%^n=%{j@7|mY<+T0p*O>aAp|i5K?gOTB08u%u+VHlht1S~@===@1Qq2FRqM$9 zP`jRWhXz6IzXLo7Pr5&2WZ?x*ZavbkxVAlgE{$O1!q@kE0-ZG<-!eHTn1Lto{Q$mC z6qvscXsD4!_U}hKWTTa%_BGlf z^Zdu}|71aNMqj!Q-}PI*i#M#ZX)0OUGyeS_NN3=J!u{3J!u_j-RbVM z0KO4K2VM=E@eK`|YQaWbcta?7LIS3Wvc@+;jE%nGP4TDJrd6l;Q@#4T@vrDgBF2v* z)^hxj?+!9=H2xsJ8;uwwZ)l{M%oGSB!rWEqg}MBCpaZ*px) zb&5CHhbF+(-H=-0h<6Hp>75}9e(jx9x=xIf+TqYRLul0V-2B$d?3-2RGVC#?7{ocPaf~1aa!Mp z`%8LrPwjnPi5=x@_4ftwJ~Smy>PdDbwI}r__o79)A3ZSXodMH3eZX#gCpAI#VT=Mh zbsnHG`Z2~pyf49*Sd(-h$%kgj0W`N0;|nm}0PuRFzKg~e0FU%8YPRG@kJ~`JH^H5F z3~zEJx{}<9UcApQ$ELlH#)fkudVkJGZ8SD?(8buq`v`9U@AIRDx;vpRu?F3-{df<) zfDRnNVfZ5C;KR7A@1dT>Uc1-yo*=)+7w3!b!MHjS+JLkh-O2G6$N>M!?-Ces3)nO! zdY4DOD+r7jJ>KO*(`aveO~L_m>&E}$@o4WLTs}DeCv3dDz>f9*AO^Q6f| zzvJev3}%_${@#-8*tO_ZRf>H+}p&ca-1ZZ5XfUEAJcLKcZ@6<;Z?+zy}0qK1|>1 zx6@a&{}gM$5zqJX^VFNMe`wdR zgTrfwcX1CBYRu=x`xTundVc_gVDMM&Lf1QV&#;}tdbxvAA4(+knR-6bvwnV-I@WoH zbPwG>tYTOyGUnQZuw_X!npFRK%rTxkhtBdd`jK&<{1n727$aX=vlnjv-yBAKZiIjBb7OTtA-c zM%DF>*oq;0hjhet;+bx{*D|&~Jk#aqh-r_l8FFAqdu#{l5Opdf6?-_wi5^G2miN2RQ0|1IF{UZDF}5M59sk~K`S(tg#5(R+ zAM;gA8+yDLowVrPPBbPs>L`!d7;_ATb&Q5m^l$AbqjuP_GiF=NVfK(^SeRk-bM{TY4D#wwS=9mMHBlb4S?~d47>|Z)Q zbF|oxS^nN)J7nMBSm$W8w_5(*WUI4pbCf#{+FLAtZ?GM(?{(~Q9I!W8{$6LRuva^( z92NF@%ij;!cG{aAjgFmmqZB=jwZisy``_&QEzj<<{m1?|5=hS>E@ttr6$C=(qoW`|r zN2Z$c^o=UWyd{dvYi)b%2OZUpyt2 zs%`dm%lO;4O@kM{vvJ5l_)af;UVE4iI03)XjrVlM*1~so;9K3OTxInk?eI%I7)vK& zMGJg&Kc1sfmYw!a%lDk{Z@tKDI}v~Cht?wYbmBQ`Ol$R59q^NV{G5klgomH&!*f=j z*9m`1rC~eK+p245>#&w#U5I@y%wGH8o5Ou4yg8nAAx`!VJv6KyF;zV4hM%`S>q5Ms zXS?uhKf1sk9o~Z8bbWZf8}D`_1{tj#NmgC_d@!a5xX_twSkv%&^lj_M^F4UpgXgV& zz6&wigJtPne!ma-Kn*e>dcGGsi5|pE>+{`s9`gh|kCrsZ*LsJyj%XRtiyV*opwVx< z_>DEz^zd&&h~M5JeTd&~WZ11En~|BjOc%s!#rwaz5j?{c*?Q4VZu$qFb zGVJ&L__l&?2k`p6#Y+Y{rVCRmhx(|a%%vW&;g<57|0(i|Z$%*QLF zeyrcpEcr-MGtZ8xU3&lr7QEb0E6DE(VocT?&5d~uVH0x|dY6hBe1P8-OgxlSk5vZ0 zJ}w{Lg)d?*q4KyQ-xbu~6~x?yR&HrrfrMb9H>owbIoXSq5PDyLafjCLfRIb z9v+*@W5Z0%@;(yahi zW9j`itV#ycTGAV__#KS${(yXcfX5&CelL%oR<)>qq8PvNemX-G#6E^E{b)vSMnBg5 zeOUJorrNNuZQ!6oJ>lO8pKob6&=Ns@M`0TgIOsdrO-Ku1%j`&I6LydAzrwzQH8Fe# z9haFeYLQ0Gg0N5Oa03~y#z){!h9HeZAKw}f8VARB>6 z!MCW11APljg?)>-vwn*(;nyr1?OQ>7E0Ecr<;p&q?Z=*u_+E%Pr0)fx3xv%E4yol7 ztrQOaJ+Z<|*c7b7;n$Y$h44Mv#8a}5<+S9e*|ZyHV~paPBscL*!WiUl3XCD}89t}R zUnE9au@0g^UI^c`$#0VWg|I^#O2-#?i@7DI5#OZkRh4%Djc?K(5!Q80-_&r1e^cX? zaDowhQ{bePX4-);z8S(dZP}ijrFx%wL zK;*Xr__i;vE&oWqAKwq;*i7djLhJ`<*M+cS@5JJbhM*h+aR80L7*x4CLj2P~aNd12qxXbWNNm!51-xQ2vpErh*X0fd4CO4CJT8?vr&4sxF7*D)2LxZY>TLsf9s|N72VaXO>7ug>@bP((5|wuOFF|y@)6u9c`C+ZD-0DKDQ+qb72$u$ z@q{e0QdnPzA8`yrj7RW8Ivb)D@(6xtJlgrA&~V3yk#am@51z(j<;Rvw;|XCrN>QL# z8P!&Dq(mKs|Hb1{nWs>WRc@q1#_UH810}Xm_}8dor4u*`#}qMEvU}1o?VNzdVfb1v zJb{TrY6wdwa7d=ap?R#r<`mc*afq9+IGq_Pwv7suI7SsDhvMx?1+LPr(omVbFiA;p z#3vW}Fy4?HuT63*{FLyMp;QN|j+)0yIw_pCTR9#!K8P zJYKcbUXtTauw}c-Y-JszZQ1^W*qjnnU?YMR9xz?>C8IHvfsQOj8?Yc)C<7^JG=j;9 z#UX8lmDD)uM@9qH=b)k)P56L=B}336u(T*8ln^`Wy@Z4ex^xwrk&y7`;!uJ;r6^Qp zD-BvkuA0nUP_0;~#`jq@%v9r?yv4kNP-824JNg*9Q2Q7Wq%2UH}mON>Hzw01W5ujAcbB$gzfvde9(jn_~JFBgu2 z#9%LEg%6cD074mUFUt)k4qx8l3HALZDK)QqoQfO&!}C*{_K-h${R$vF#%`2fz0LTZXtT4o>ezP{2g#jXqRG6(m5gKhDl^RMM zIqF^9K~vvZosynUbqhx3r>CrVGIZkju|Gf>F{z`*=s?Jx4PgusS1!ny4OxVPfN$Z5 zgEQ_CCV?Ay06`jM1wrRUaVKB^eHsGag92@el!Rl<=)7QJ97KV;Tkao!4;`JUTuNL) zM(Uzlwz`}r+72uYCdTBIQQryDDy3uqdBpOqJ2R9a;)W>MhPV_XY{QBqq#L(}#6E)E zsHRl0bS>Xx8iw0vrP6??V^|ysquz0Q{kW#~!M(SqWfoEWq6AcGTD0={gB>nsyYnw4 zp~TqKk}(2Ks6;8Y7ZqwkQ8?Zznc+~h3xuRvqJ0+CR3i(ChDB2?JSkmlEZ>qOsaU~i z5kW1`rD89IdBltvJ32p@n7F)&umpU*x9+_qEwh+PY$c{9eBBc`!X{ac!4Sz>QZy(8?OOpEAbLoCPN;YVE zrk1IrW5M^RRJg6AQE&IrJvzlVwEwNuH>YP6QxUw8s0p`t8956U?_*DPa+*W9_5!alSYyWobh%?mhawUZ3Cl=Lc?0&n!lzJJfAVL6^`atDY*~ zRKBCe*^e8JtvArQPJ8}nWvrAHIfP+ad6qCt_7pw_DpXI(iORDG&BNJLi$5SMB23i0 zjmm*5!`X^7#j_`Kd{H?-vY04wGO1m$=;$)0B$bN8jd}}LGQECxzsKhf1m1b@_Kd6& zs;!!aQo&1a`sLR0@@>1SkN10ViTa~5CCOokDqI02s1fo;F6UTKoP-g=H5h^-bBY8d zYxYSeXA+dWegz+=V-kMB6l|0dQa!dM5>)!){q3$k9Dm2HGF<)+z6)5{B~%hP9k7<) z@+@xOZbeOlqy6-+$8QKFjYwp}qVnY?4HW64A~Z1B0LJC75@1wAMn)(gZC+^qg>Yn- zOE2oESX5jFSQO_Ve}|GQN+u)~hDxEvn9C3-YkOUUX0wY&0Y6MYa z^;?dg5H7>4$oV0&@%r$vfR$t}f@H>bhnK%`I>} z#JHySOb^URLvx%P?|ijx|DJ8-yAL$t-nR!mzZCn&kk|;=7@Q~-SyxKpb!b#^L&>50 z;PDns#F1mG9t!)?bddgkAukG68Zy>HakVjCh)Wj!5lT3mDs{=^VJPDookxb{Skc_C z^rp8}Q1cqPtgZpe${p>R;hd2UShw8$`k}i0yUVv%;6w#-ia$ z({V`y{(&JTnCS-!XK@QJQI4-8OIR5kJAG8!vo8H5W0 zQ;K6bfyI(YPO`}RO#L~-ghka56*xn)uoRQi5bYk4bv5Lc&F~qzZG~e}M?1!pq!6g< zT0_39-Xl2tkLzX)7&E*)8P`MK&CVO+I@5V(_L$u4+wc3+iK9(*`?l^lATCbh5e2yH zB(K=Sl+v+A{4!v1Kt_oR+zCmRwE(&Dq3#O@f+fP1rh{1{C=yHKGRX?Il|i_S+FB z&J(SNs&|#|J1B%oniy0QSY-KHk1>+iFqRnG*D$RX6Ow8a%@`)?_MlsZNe!b(%z&n; zAy==|1g2Y83?UPZ%1q6fjwKxQKALC!JuftP~cB%Zp+CZ z=Q=xZcF#FE=uRGpphtGg(Paa zsCca@Bzi&SCMUiAxeui>P-{V8qdFJIM7bKz8>?^3Ett@IZfKTsR^Ir6-0wg1J{6s4 zh2(Y};HQM-U~;jW|B{-Nql{126jRi?E`sbJJjDPgWhYyTXla!&xnS7oQt~BMgc%w_ zstYW#4=&=8Gg31-o-wLOr_`}3ChMi>7WBZAU;61vr$D%Q``+qCS&+y3`}=RqEu82A zzFCa#160*;wKY}m+EM}26poTT<(6MPoRyk~e%87KWifBFatfzHhBp$1$Hi0ukmf9d zn9ZE-TA{0{J22fezh+n;coztmQr#W1#R?c9yfmc#EFHO>ED0oL%Ph*65P9O69QdBt3Vid z>%p4|;rY(*xuB61HKGQ-NtjdO(ksdp(7+oH5WqbEC~6Hcz@o{n z+0NOe6G?y{(JgC~<2G{f}krJWERMg@UEj*YdD4h)Hs9}TT zKBEax11P*qy0Ae}o0}&9FhTY)=W@`aqWV^V5@CoD9y^2r6Pv>j<`+%ry1+KaIp_RI zMfpSqw6yC)bM2n;?V1!RM5v$sY;{pa{-nv1G%-?|X;xE_VyfvWniPejAt?$w92lbr z5(1;J!(5)_L<$iR0vYo(U4|1TPMS2iC^LhuE=!EnQ7{%yaRK2nfiOg6rcNBjwcM>N zY%)X=>Vs23SXm%k!se-YN1k32S%t$Pb$n%#P}4>UZf*UPuGMvR0>f{ zO4YHGprj0NN>LUgq#9ry$513GQi{c=x#o7y4bD4bN^!wmLlu1FV zLm0n&bah!~{^ThPQunA7?uSZU)x?-#h|z3|!kvb~!i5#&GOI0GrHDAM$3pfr8pbJ@ zVUrlCdQ?=9w-k(;>YC@AH=Q7&atP$z<2*vwl(%!_!W;(5LQ8LXMg>8t!y3h(c2rlQklpvB**LHl(PUEy9@!F;1B}DoZo~90cPu*M-jc zi%%QH7(qr)M{7gXu5#UMNmsvm>^@*TZ7PGDIFSWu*rTSbsB0r~HbYlMHcDMj$r__! zRC$F6z16t#SD_iB*4mvg>Z&?jvqcT!)KRj@;eZ$mOQyNzJLfMqFjCk!uzQP0%S8`w zW!>ZVjfWhk0_5b$R;NS7;|Zk9-n6`wN{dI>V<_ydj!G9-Eg032*J}1CRW&P17o+A< zWypZHnKI?HsnbdZ!|4CRnwtwtPIoQnSrE8r=G2lx(pI)zO7ylOiLGmH!{mb`x&HC{ zCS?^&oyIUV-%3+m($`W7kVwFDax_sI>Z(UaYC}V!v|eWtFv+o^*XhvZx*VCf>5`_bT3{3?PnW%DLs3QPedGR{ib|&kF6zJ7dGX3=B}EpP+sZkgrCc2_H$HJc zV4ik{2`8tkB7|@vke4UiD@!xdD#`JnDp43ro5i~pOPHEbatfdeliZF{GL!XHc-G02 zAKTO799C@G#Q%>b=*G8a=c767^E&r7KP^EtcYp;*6E@C+?q?T{vy}8K+x-lHQ7x zfc4gpr%>BS<5a?~5!xb*a|uuNb*-hskI?&>$nVC;%!i_huudsXU2DUPGaRNi zw<6PAVVEWd66ma1mh69^vQ~_zpD}#~K;CxWp9TQwe(iyk#Q=Gk^RiXb%UF~K$ntHw z_tzgj(d{OX+kSrk84%?Rfl~9eFiu@*4OwzDfh>7#L!_^yv%)l^gQT=aXzWs}##$vQ zV&xc0%b~FFJ`f~Cj#k?a@v%@teKJSdh&s@a*C#%$xy@W zll(3GkXfX9E*lX#tw`zeG9lGs%5@gS)tr!#8$hHMy=9;f>C7`B)9*g?4%{tQjnvIk zOe+a#$(XZU-|>E@|B4%Djw!LoR7cuRIs2Zc2f0}L&s{(@)OVStz9M|0hk+ET?uS@=X+FZ*3pWI)XJTdQyAQoP7}l}pxUO&xfRr+K zM!N5*HRt6PoqiUOMl)1Re`O5i*uu_8Q(q&rpcs&;QUVoa3Pt2Y*-&5Ma)mdNLgn~* zt`w?nrUVp7&mNbbds3v{E4)|wuI#(&`ZLFtM#@!3Tk-Uo^MUqk3tVZg!ud)arp!oK zs}O923R~-iJcIMrifK{g`Un-ah}Ft^a``~>zX~oA7yE7%23S*_nF#V zy@<=g@Km~AqAB)rku@Nol3yBFs1{Q_`#Y8(1J^jOx#8?_77Y%=TJy}B zdB8f$4Auxa0Bg3`fmN7NUK_5gy{NmUmvL>+2DG$|PfM3Km{ML5Ze)f;%jq&fBEeeB z6@Cd|XJOTDV6>D$l#M^H_nOeP&TDTzdt8~>UM1RQl!7P8);+uCLP86;R+Ba9v9wsu z38iSm(uh#3BgTR9WnHEw=C9&bq&U_`xf1tT8M(|9T*E|*#k~Qvc-AZ|;SG$o@74QO zj-GJ73s_f1V%oM)CRmR}GQsmUVY3!rtgTAhfVIQ^ zsxI2sa7&b`l#10bW$4NX?_?IO#W|VM2r}7oXPq}F+U}R{xqi%q*@0{O7paRn7vFO3 z_|b-Ro2nsQf!NhY(rtY1!AtT-opC-x)=gJxvleQ@#cT1$a%N+XK}|-d{dYRz-{ama zRW;R=S;&{x;TQ8XmE4pbW=+aGUP}>WkY&W@Pb|!jDqx3e z34`18{6h@)d{SrWs${~*>MT7KC;u}3XepEyZ8Zsp94G8==xE=v9VJ}`TCpXzDnh={ zWg9;cKi&x+kYr7=gmggV3EPvFD z*^sYczh;$|lR8cs*?cKGjwW9ldRT;TvH49M@}D4Jzr*2(F`Xa~3%pAr1gv>0n(45& zvP7X-fINHhV3>Pex&OK`lje3Uu`P8jy?)k&F(#Fkm}{G`D?!UHM_zpBiu_U2FCfs; zjxjBevjUMna;9tu+3K>)o4NtVar+;2#BT$!hea$7S*gQspty^C$_Pe6#>g94#?oP# zLy<7y^UuFva&bYVkQ-aYCSlKS9w5Ljz`bp7xJLoEpk&6J+2@;$I83QIBGJS^&om;Z zvvgR_54?ZY@%|Nf-N36I`PDYD)r6%$%=4ejOqnUOgk}1uDYb6F=Rm;c&z^HCi2IiY zmU))Bm)~&S#KDAo{3W0sHGK|Xvud9$l4nwFp8K)uqWO?j%ElByld=-)h>gMZ?Bk}= z3-8;GqkIcmeCr#CE2W&JV(Yfda+ZNfMqw?Dq##UseZd?oX`f8c^McFzmUk@=t+@I8 zNn?d>d$Bfy=5XY$u`e!l`^3vXycWWqJ144kYc4EI+Tk9Iw`|l{{D&*>$4zB3K4RP` zu^p?O2@+?x)P!ZM;hb5ryk-8u@|I3atj=JvAQc?I=VB3faO7hr&+{zzt#Gbb83i|; z2avd(uQ2X;25=Fppysp`hv-ae8mA&}HJ19@xq9}k<$N3tPl=4Ppnzr)lyF9sxD8T8*#P+Pk96e!loH34Umf|4bd-Zm;ILEU z6)RdwHi?|$7W*__#=-nh>iV2Hb59AncZK&l=XI-QPZ}4l>+%c;`SGq-f3&QyWcq~= zI$OE!%QfFd3p^aZG$Y5v!V}H-w=5}MDB^TN#H`&uNTgoe4E+G zc@D+FOU7&A+DxiGZ{F0BqQPZ8Zp!?g>y+!A*WYRa-YJcIX9XQ)WSRH;7Qjnqpnj}b z-Dz#WS3cM$5{W~!L;iNxMd+Xt-f%J7?ny6cgQvr!>*J&>6loXk~( zy3d_A{}jM4Z~^*l7fjY=&d_(3Z!tmdd+kTdiU57SN#SYMp$Blz!=njZ#50;X^ZG1J zCskB7Kz$8h|FK^>rjSZ!ijs8>hPPjvrAC;0R_)7jeHz0h@7Q6_qnL~Kdp2y z$s=_cf7*hs>uopm-QZh!)11lUHKmsXl=Hbs$R3+1?$>{OT~X=G1!2M`2H4lpLJ3=Z zDXnU17Ei)QXv5kqWvNo_6%@b_qW`ZB|8o?mBDL>Fu?Ye%lzydd?P;_=ty#NO@VcL~ zDE<5e*fbef?OiXeUOxV`i`+N(S2|bTJ~(vG8$Z4QvcE`Tr*wvLbm{GAO2YBYDtwxP zh40rx@ohLL?`Gkju>Vg-{}qJq2Kqjr$0=sUe~U@+rSP+P3lyOpR!@ub9N?y4)!OXs z*v~`piGbpP32;7t&+>`WE^)2wUKw0<$J{A{$=>(o!#5O_&AfO4)L;6%Sz;b4g-?Nw z5*wtiBz#^t5^E_!`1;u>%*j+-F7IdgpD-2BTBpn3PZwvI0Y3Fhr=zZuyN83RK&0Qh zaQ=de2BqM{^Y<*CIPKD&mC7pTs#^x4po8}k{ckC_lu?kBBRwJp4cQN zzYi5a9S)6xFLWi?018M6`ccQmPl^H~xXpZ)R$o=3jd0ciN^|s>$N3$*KN;;&J{wwa z@fl@iHK-BCIJ6US?JwNBWWuydU8@4CdT+e(rg^7Li1Y!~hmHvn0)Kq?=HjxMms|`} zKnZaz@C!evXFL`~;JK>d1#tLV-WWmMRjvipkJ;*4or6uxfv6$m8;Z0Z9Ncc^K<4&Q zT!9|{XkA!ygB16n2Nx3w-!oRk!$@%c`u?RL!MDnDqk3cKO?gpR*s)KtpoIP(&aN}C ziZW~8n}E`!N$-U8gb)Y`Rn%2_FDZbH1VYEUy1UlZwP6=~U&YFzQdC4iX-NpAlK`Q2 zNJ4tO_s-1sob%2*Gxz2O@cXL)GUq(!IrTkf{1=ZcL~C}^M5{d@1`vUt@PwX(U`9WB zAB)@pMfx@@Ja8Cb*kK4F)dGfkK*5Hmzh{l|!B+R>v zm)ATrH+1l1*MjQAlElSVk^|c7Yad_OFM#CGm>Df@k>MZ$f0~`pYpgmiuvg%hUbH)u zh_M!U*ky=euYm^#_A1duE$uhlLo#TL2AT2@8Vsk%QJ~3-6G#aCuPlVHA(P7z z>l15|5^ry85_DdSXJ#RUuO460FCb=86KEL1XGsGlcY4749VrWRb-#Ih33~aHAqy)_3SW6uM9A4TwY4urN_1O*c2h}d zq#Dx5Ky{XQvR0Rdt3|UGEg2Py7nG5rjtlo-iEyFkMa+~FCQXVC@LTf8mrlJ) z=v5q3%950%@`cO13qumCy6y=Q#uSnU)1|BkaMJ~T^9sl?f+i6)wS>AAUSKN>q}Z~c zGK+;lgh`9Xu#!q&PLM1`0Ta=C5ltY&yW<2hCZi3S{Lp`8uiv{Y>XYghmNX#?ale<^ z{p+7x30X{?JZX{}GKe&-QIv=w8gT_9gUj~BnzY=AmibCq>@$Foqsu}9gO-fZqK3t$ zET}W?7DWITls#E-A=(s-3*CcGoHS`NI%Vlat2{4sXmFraU&VJf>YU zI;iMx@g#DX67L&rt$bRw1{!B!(7lSCntzW@^><|3G|P#*rQ z!MjjO-gt0sc+@n zlO|7{Hau{^!bd)ngEt=Jdg-`HTj4|DufofdC}I!+_XWrN;Z}Hh*-qv1|t@6XBBt2OoI_MEtm5z z-y0thGqWtYHo0zb^0*<5c!dt5>Mun|GX4QWr{bCz{LWto4A&~DbU_OV#E~3nM^wHb zyc8ICIR?oP+tU6|ffw4j*#IlD-5}RRs2%SS-iHd++$jGmfSEe|ijq0^(!FycVrG>k zYmiL+lBDrX$VNOeQ8ztte^5ZwG|0vsHch!9x4d3Xk*e+J{WUG>q9u@G$tJ>dT{wpf z;T*?u;5sH5Ash)CK4GS>nNd3~fN-QWA-%mCY$&1O%#K-R+Vl}u!p*r??vIU#o>`aN zuvlGOw#0w@kb#~aiIJmAXY-Q}KsxI5(SIE}axw^3Me7G{xPjIr(2Wz7H--wfQ5Zdi zhJa351caTUyd70+Y^5!Uw4Ec_d|G7b)i!objp$~apqr`FrjHErZ`!afy!t@w!04ID zwTqogs+KsGE}9@Dq(6%|l(RpTj}GgPl+>S}d>}Yr$n+Wi9{_O%D2Rt%S(AA=c&)84 zFQQ`-&}I7(LqMlJ1Vjj;^`t6R(Q0jNyoAdlA~_>>jTjOE4Ma3!Wbl<_^x8vl1EXiD ziz}BnmsBoIHbsPo1Sbx9iU{w|!XcuW(**%}34A#v5?vy_S0eibI*O=v1Q^-q3t390 zotaWPW=QF5BPof+zqGJdX=`goKoT2-@NluqUE&FBlSCBVM3e(L&GarO{Tb;6$SERv zR>cx+Y01(=T}pU1gNLMe?1q&OR#W>`my$b@JaQ##O~qPb1d=Eurnk?8Bw8dX79@-1 zyrzs!7&1Dq%ZP}YOidz*WaJ`Kv&hI7bkvpJ(kAp0Q%z#dr%`ZBnepCqzWpkpVo(_vY;Z1=^oX`>o0BtdOb)Ihl7VE_soY z*quyrasW_1?K|jOZjy9KQNHz;Ff~bFYUZdADJs0s;wkDET!D@~mUlo{`{;7K{?cF@gcUe=#w?%;7gw!i8`0vh)OC&SjvQPtpUrRt$qPiq z0&iMSP79j}R1^!4u+AEwqC){DsKl~n0+rw>954f@XjvO=Ia+84OVqnP!zI1t)wsGx zc?aQY7G|ypSoHL=`0Oz}<)_Es9?~jbYFpN@tXh{AKL{^6d;Cyd#@>`vtF*TN`$0%+ zI#X&SrBp`Bd`XY(`U|_JsKE8 zf{RD8r58^X=4GUTkc^HAlUK}ab!qJ~WqAoOHZ)?{!{1cnp8HvBoyp#x<}R`wPd^v~ zjL|7xJ#3Io202zUY?x@bbHj;;OXP@!@i37X3@EdA-7YPP0#0%aJz;5L+KJfH=`X|FI#lG(zC zKds}_?k5iCX2>!!x7yCX@<806VRIbIYL}NUS5_>WG&ExA-@k&$&Ye7ZFfTJbb$8l+ z3ybY~<{>FFlk~0qDOobXL=GmfJaL8w6@?K(Xc{kvr89~GX`VtOE;A3PROq&83QZ!7 z4iSiD{7x+XmK)o&t_$HL#o`L<+@ZDj*r;`71gB)4vqy(QaG%ryYnKouk3%r#VX3Ms$W0zGpoRUmPUgZ+3d8OK ztFet<5pXwir;B=iMtm`A_8g2VF8uq))pV|2c*0b%6N(Xc^2Jqi29Jm@Tkc$5x#I3g zLkBIo|Fa8cPaZ2Q$jjQlHzkGTcBWW7UBfHHQGt=uaeLYtWf0&zqSi(gek#1cN`>Hj z330Sw6UPIL6AC{7kD*$}e9$a}4&k7vc~jLG;G<#0#rt4jz$E zw%oS7e1*DlA%wT^-jB|(?6Nb`X(1mOs}vp{H;xXBoEAsIGrWSemS>4&1;v@|L;3EJ z_AB~8dOn~zy5`^xJaLVJ#8=PGwA6Ajs1{d+gfq2@Ph36_z!TzgVjH1Y*sEX-*WJRI zHZgP}c@D#MJaoaZ(}T5Hb4YlJ4}NeNvO7_jpPiAmJ1xT^ych4A6*(fI3M^N>qG9Et z$90Z2(En-no;; z=N#yyHyxstR_iW2vRd;jQaxjj{Ay$2$rB-jJqK2s+q%d-%}K_d9>|Y}RxHgH2|go% zLKjZ2kLr$s1$fW>?_Roi=HwArbK7{$w1pz5S?8Mi1=c_#z2;vhDkG;BD*~c{OSI8f*B|3LS#FZEgdl=;3X{9{fC}M z%$_qR4pO{x#p}n97aly2lev#KjpiQ2{ymi8oytj;VnX=}+e*jEs#Qsl;T_3u9>~kd z&df;Po0ZM1m9~&(TQ4-rxaC4 zvD9)n%f(W}e?`DYCx)Hq8&i}l4zo~lFQuq;ZU7K9eMvlRG1dCssc&v*0*h1+(aZXt z<{URBEO6e^R}LR8$jgCmC5p?)p_G*0bm?NOS>ar%t}I)%5MrFa=ygaj3rHj}rb3MQ z^yXN;PaPXHXlgvL*pxrvxg1N#OyQq=T4F4kqgw_bEZozPVw87##62Cl+e5dW$fFP# z&D&q9E=EC$bQ?(AexZ9abWxnZNVkFLmW~7WX6Pn}TmUatU(KaC4QmJ53Py-gZ$VQq zBfSbtn#7o}c=dt&JcvfO(Hzhm7JLAXCtrR5Hl5&DQNL1KRkCW)6c!^%5tNvgvIk<^ zpMBuSX?-0C9=?tZiky-VPbMug5B4nM&C-e4oF-Z{ssRFyh8(eJ(Z)w@OhMA|9`Y`x zAf;<=03OZ5UK#|6gW|v=c^7eHNgnPYK?*#IqeMcG*pP{{B4U@m5M?|>>4`|ais@0I zlZ7X+i^5gvf_=(})Q0zk&!92OLt^lTOjF^w4y z@;Q9s92Q>IHB@Z+^3jsOs=&ISg)hDEogqcy#eG?M*sds^;U9kevB?8MZ;K_1oF7hyB)QzPmjanYAqSNF!AAAKl5*CF~ z+gOeojw@mFHy`}C$CM(QwJa7}Cv^2{u^2gWv+FrC#|`xJo4<5*CZL$krpf|3cN0{l+ zg5hDvq)Cq50T8+vMHjiGQH!f)-UZnJILeDrw9f#ynsuW#FPgbu<8mQECU$i4Wvn`w zw5=!I=MhUsaqq$}S~u&fAkyM#W=tC!)mz2sl|KFc{=`R_5DN2O39zjlhWT%@S{sr;qzZosNy6YF{LR~7oXIlBu3b{ygTx&O|e%S==3gBI>80Z z8$zw`t`a&KpT_e0A!r`{1%ytSFe(T-QE?NfPruK<`aNqu;Zq7VJMYlZljn*qvs(Z=i1AZV zy{F`cT@cT{NWfa=2o1o}(rK10?bF85Eu3=`vIVrbG6DbLCR=d|ku0A8D;L&3kF`!X zTnWI^nM(3P?&ssgSv3NzRkk>6hI=k_Fv*auTxV&_=j$U6Zn>h~ESm7Q=)QnE4nFnq z>woLA7jts*vmshtws6#$x%r2WojP}^q^t&VE!R}FNbTdQD?U~LaZ+5QJM^r)L&whW zR&os7sm)v&ugw}j;#7MLkGOTBwYo2T5kFrMRSJE6-)*@f?BCv#ueK>&9SAZdk&^wJ z;-rgwQk(?Ua(!nl?f9s31FEMm1&s<}io19Xu>OXg3WPy-ljxv{>K9HpC9mG-d9LN9 z3sLE~TZi^VIG_NffiX+p*;!JHbyH`KXX?U48k4#=JtI4>pzzqKvloC>&}oBKuhm^& zTT@eARasHqrmXaGanYrslFOxK+?-&ej88j(dO-w1N;!DbrMr zlrk=g0<^Sz;u&rdyod{E^#HAK`+^WC2Bn*Dbn}qzvBCN2pf%;}=;_3UVDk)->K7~| z4N>dwspO=N8*Fd8IjXM+ytH0n{U$%U{&-DoZC!l>7U>op&eT~UWjDAM(9JmjX`eiE z?!u*_VzopoR*PC+ym0Q!sT0Qv59Q}(wWs*Vm!<0ns@Idj%|uHV@+r%oO_!ubJ3 zwt^{u?b8=ZgvjeP-{bGc^{0bvT93fq(YKCu9|da!Yw~Ke*p7~Z(JcWRpPr*rh(hGz zv?UH5S%57?j@(G+;3{Kl7%g;hSa<>lF!iusoI&&yIb}}-ZAVX6FK2IiZ*VBx*y0`h zItjZyw--GcF>-m!m}q|$%U0DMkv;umU-`478uvQrN`#^~t1cWuhHfQ`^o*=rh#bN^ zedgSG^@4W3?YXmO40)rL*)B!M`v`vI?D-29FFA?^T)KGv?CBGzI^|_&>H#pKiTuLj zXCU$_oZ7%u6eoDcw|v8ja1y%GJuLF(zj?j{Lb`7}gCU=X%8Y<2n%FfDiWNTSkMpq+>1CQ^|%+AfrFUa4&ado0= zsyaoR+>%H9P(GYAxdkW67?zl&&Q|9*V#5+1Uw7bq5modLQ|$(w5M;pnguG9aXRWBN zsjH(qIrv9aMQL96#(0FjYB#NG-)<2jZ?ddwkWYMx$SGU~lf#mAYEk*lXgyLmg%db= zGgsmExVW(@ZrIX&UO_AkxF_qdzrgZ-4Hw&09p-f3Sr7}Q!B&_HE~i_v1ak-EO)z&r z-p;|cAMlkv2ohE=3&_I=&&Bt98kLY4t;1tiL0SKKHFJabR;KZe@13j zc6Ls#lGhVqu&BC7r0>hf%+AR>kpA}M$*w8tWNlI_4$ny7Q>I?e?eqyv}**z3Dx=L2`Y%^oSTS zN;CqDA|kz{r&fTQ#1(j5y6h^vr@Y`RyeD1Bv|hE9#6mF&dCb);@z-sY@TBBDDdZCf zm)=ueb)|6xK`a8{xMSOcE~*NNzoJr2f>LhJqD~gE6 zPvmKkmKbn=#OKV3jaB1n;sfLUS4BOVgEV` zDr+4$QUG4}J@fw5?kdV(y*l?EG|cRkN-C$Mko_mY+}78pZyy{>g&)(!PRE4hv1an1 zjm2&PodUv_SnRYtON1=qq_&_H^Ng)LlS*t(XM{DXROmv-vDUuz5IG558=(1X0quxa z2+UH{<-I#e{uEdmtKD57422!HP`FP8_qYw-gxE7 z`1sfBsxbj^>S#f(?mg*GL+<&W#NVd$a!GMfF~#vN7m}mvPQEjNde3U-9-aCRiq=Qi zO+L3uz8R9EJ~*2zB`+vOo~)LVm*=BJP)?F>K>pZ(8yRv>+ZtQB-R9#k08eL>#ffY> z4=Tb%33x# zu76w-Ies`VThIz?ihM!d&JUMNo%Z){vrkb_Q*`O#g$sy$PMPX1WNsec6^Fqk%Ehr}lC;vdp`U`ov4~uOay7sfs0OtWX%NADP-s7*rOBPT zPJR0*To*~%S$Fv)j9)Zu5Kurc2MP`r9?sqR()8&wW-M5jfBNL{BZm;@F+os_E(E>l zo=KAzd{KSuXO$C8!5rccvWaIBGvQf?Sz$3( z1I={rR$)Bbg4GZ;%s03nrsXk|<=ZWOZLwNE077=wmz^reK_L!8red-{bI#6>@8Zs| z2<`gLUQ<$Z0i9v)Yx0jV_2%UM_V;@xMvjk57C;(I`~ z18W!?qgoQRySU}OdBqSn-R`dOQy^>&;?_VP8V=<6h6elHNaI|yA?zX%^g8QGjvo+J zPZl;6O0u$cuU#tIpJ*b_p0nsbpa1$&B`q}b_w-c)zPeBXL1inU2T6|-(Wt2qz2(4FQ1`?PjVAF z5)hqL8Veo1j-Mb>W-sFr_(T-2-eRGDz%ZvxZXy6D^2RY+PI<(6bunfx#4c`Vlh_5! zN$f7bydGk2@OK5^5HQ5v3~jZZT=??2`Hhom-7Lu5QFE~{m*_-Rt%33MKi4ibMulS^ ze0S^N6DN@lmKHC#DSq+ibvW$Bp+*)p`@uhudj7$}o&Q=$Vy{}Mtg2e&xOb>2b(9-P z>LM^9W+ADkKXuQPLE{Rm5w)PIb>O?lW>18gm8qQ`+_;|xEZ`ov0(R)s<$6YY@q434 z>OSqd2dE+7M?>oMEOiB3?nGiw)B-s$m%B?{yo0dDCdB0`b|fm0`r9n^kD7qGpccX_ z#enkSy2=w2DEn}onyM*CdLVNZP_GT}2?z{y1vLxk)1fW;v_6qfA5iOJkxF}$c-pr2 z<1uV3V7~12%>}58;F4x#ZGH9AF=0y{rs-?M(wNYr(O9&;MEY_p^|9nBXlOUAs9RaF z%5`tllxSubepGr9cMe(T$d`1X?|XXT?4W^@KhG+zDlf*==;4A*FWlvv-eua*p#OSn6pjd#QLsa(#!sflM!OPyRkQc3%sjI}oQxp%c^_3mpP8_}s=t zEM$`GKs5w_74~;n=pXAsw>5Ket|_5TaSGmZGs83%yMQ`X#D&-!Aal`S=_p81HMORuX#aozNsIk(hXUue zXsGmPfsi~EM-Cr7aXS6UCDS1Jsuc<*GOAW7_x8dt0l%GdVvo8mdvc|MWz>u=|5-FU zDEziN?ppHv&&SIk{u8L>ZdrY|GP5hSA>Y}PYmCo;ZH^b!ko=pKeKe{)az~%GJ^a-m zd>D8}8-Q3r7ru)T?Ea;>e>>jfjb=N%H$a&Bivo;Z*Nbh(P!fJ z1uy?xPW+l?gt<47_~`%^jojnq&;GRCsp;JGIeF%M*1wmN_{%U5 zQ@u*NH@1=RMI6JyIfBNl=ac6Ih5zl2`Sa$^z31$p)}Hu`{8#S?B(^ zIn<{Rdv`z8#g9dQEPfOFR?5NOhXSscyriKm(Nq`MS3o%q7JprU5?Bl5`*n4+^%?Z+ z5w-SCT;i=SJ#oMkJp(dz+XrzI1@5OVU9&T&UrC8UKf8te0La`D;`%zWWvt_rK6PwVDqK5sTKAQ*Z@95rHe`~SRD%XaiNy$%>XFAp`mLe z2u%7kt3=I7VE~A2p#jCe0UD^pnejfh_RhA+H_rdLin*tu;!J^10mtm9kEf>n`Q;*> z{GT#q+R6`h7aTfr0xBpywC-Pb%;K<;wU7WCkkKM8;?Yw|8uLV(?d-*pvV!MV&BTPF zV|ncgCupd4)jW)axl<54G?f@RK}A*P<;4j>;kS|%V5W&??BbTZk#fES&oc^g(?7j` zHZ(C~`t*5U>!z?fEghYz!>7p?6c)7f)@WuN`3)RbA7`0Upbl%~vg~JH(Wq8WforAA0n;R5<%Y0o6JX$t$ z&XP5IFW@QG!MvP5UQeW7h2LA=oFde`lqw*0xipJGN9q7xfKwmyhLeLv$~4$&}e> ziKeFf`qmU(7fG*g&pmJugO8=Be|_f8Y2=%^dO+I1G*x`UO<`;k`U`AYk4}&GFqTH0 z=cB9dr@`m)<+c@d(1v5xU5&JnjsQxJTB*|Z_R711!f%E)638ZmHZWc_d+Ga`7ho7D zRjhw3R#4Q!A2O*JmyQP``;dqoJzt3lSBKAq)q$?IzHK}8g9CIxA8>|XClyUq7aDxR zJ4k(?^olGQkBt#jdD?{w?wMFfVRjO0yVvUaz`9p#$85?nO#fiA6AfMnjo5UJIH8gH zpqgNxfIhI}Zb8qTggy`&Rh})NsTDC>k+NsEnlf|8*UK@lPa|0I&uz)cE5Jx(@zEdt z89#|VHob}C@irQ`gtPF_2;S&o1M)!}t1iRI^y6X_y==L*oHQav(Jd?m``{c)hP1~| zeR$tJo*DrwVen;2?1SGPx^xcjdop*t2_xYFu8;QS=c8;v4Ra!^Q>923REJN^*JH3D zpsi1bz5^=ZGc?u;QX<_-s9WnYtVC!J~&m5_G^JAto0Wxo1S_Zbe}NlID~ zKEt#VQG*b6B1Znjd@E_i2PfIdPN+<;`a2P^Ho#7tAwIzYJsoZBgu(4;tW%PZ;fPEKm(@ z6CFN@d$*V_I`J~U5-3~l!aD)Pu{@q_sD_d@dQ?UONr-umoj7&o+-DCa1%}-`e;yl4 zEE@}WO1vnZGWV&iCoh~hgaXLd5A)pdjOnX)96DZ9%NDac4*t>J+g}Z= z3UFC;gS6G~By#qcs-;#2lL0Mx5-=3bUAc7Ke8#%@O7|rugHhT{yNoEDb!RZ|njw3k zQk)aD3P+G5xDJ}}@8)dVtlRSR>gsmYwe|ItXAVdPOI1^}Jqam$cCCL{S54BI9Y~>$ zp1pM9r^jN)-Hs6)jNr*ve$ugk%Ag#}!gM+SN2kD!oTf|QJgZDhR<_&$<*1lfUS?%7 zp&V2_Ft~>?C`7~;i@*H)lEAPr>{i48J=@1rvB_k@_$dqC+JE+RVP59`-(J2;7|+97 z^9t|+4$q%i$H&f7Wy#@i=G&Kbf~W80ALIzEWevf%qF_p#CN)H(dK%he6!Fq?Ey-!Z zdT>_2upY|mgpU!6`M);2y{ozHI$CNgN*iL|l-TPb)-hPU3`JZTO+R7+ioCsxb>xEe zID%Zk)geAXe)yfQ8~DmO>Y!dw%luz3rn|p`)2kZp1_g#%oV) ze>!gL-^47ru0CNy@PvQQ2a9KOC~(*J*$0W_QW1k^ zpb&#PZ&~9e@BoKSg$JzqCwl8f&p?qNEJ9SCq-FlPK3sk8=5pn)er|l zfzR2HzA@AUBjeq>L~_~{O$q;&t|oFlG|VGRiOQ@_sHrwY3H3o$+u5$gtzVZzQFZlI ztOF|#}Z-VaJ?k-p^D)LQX zT~#$$08k56X)BjavV_ZIP&!ZL7oIqS@VcUE-9J|bhK`!+5g8b&;_<2p3*O5*bD|(K zE#<2Rp)4}FuQD+gmqjC7P&-`bj_TYZbcC9-kY_F`s&{JL6 ziCmxk=`buU%?5=nAcgJx@t;CrQy%&nNkhSjbA{{fos8$~y2{*1&>GJ*QW>qdkZ0TJ z4OYakSSJ=-sLQLDJ67Dj67MM8Je1HGo_HYsE32%oTmR^);E<6*XVO7Y?4X+$jUfI_ zy>-BhM}IwbA|KEAe|$2YY;4B#PxeD=a8(pXAj3LUT&p^pIh-}04T92o45$uL107JB zZGeMYbb<<{(#-IVsL%|zg|m_tM$6j~GO&%UWgGjBm8Nm$$Yl^A7WV1RN`?^{C;t@O znHDC(2uXz0H*&Gc)KEv5PiSyoXS*A^ugqng)nEcqXiS5~lAy6Ye}1!+H8wH+gp~X#$eJ5L-_PYi5|?6;}S`#d&D%c_<; z>79CGm8ECq9XfudsI(GObQ>PKH#B5K0&-G|+mb4y4hX&d!V`y^$0x7NKXDMtDz?6K zry#};_8&UPPq^~H(_iv>u55g2r{h9D2+|5 zd{c}xNoeg$*4jFZBZ+jCl2zOF8i#*^8L41t?h_&hCQJ?QS9E5SdP9o_{cB=I1$uLa zsG$vETDVVGa35#8HUpkLU0DfwtU8~c0aH_9YD!8sQrxyr6Id-1lRn&qH?v1hAN*?Z z?dr&hqi8Nt+8d4i3f1uf3mJ68#WkfmL>vk~d4#!DE>)MQSp4B?q`F+PwsZClKUh@?}un?W8)qeZ*wm-{!rQapEwrvi;2kf+*kHf9TKwY{$S~3FS2_ zJaMVop*VdSz8fxlT5w$uyarc1;YC1{Qg>pS-PD~KeptO45hW2JmE2%q@M~YQ_Wozl z9@!jikfsn(1n(3glGVv1R}y72dasM{!_=Pa)(Y)uq0TTTX|ETw7y8Dfib{m=6{m73 z0@2bmXm2sJw|nc`tf*Bgf2mdgrmi z?6h6m-&r_^Df7LI!-o--(59ix>&W^pR+0W38^%!V7#LC?+@LGa22Upxh-y8;5>lWw zERm!sjL%A%IPJm;6z2C0EAV@Zr(*@S5ZkZK7~fQ2bFr1fWK9t~Dm$9oqP5jIDTZqedC73&}KQ_ zv;*ek*PSAm^ctaDoA%VDF6eLhipJ`rr6_piDIPN_Tb{UoQ1CF+r-(Mib0$wucPl?U zrZLTtBSwtBf79W^S*bg>eUK~^_;F_8VGL(Mfi1wtsDB9sx_-GC2G~2$72*hXK!Ywe zK|}^@f>sS)$pk3_Ao_&iPhCFTQZfFtQ2rbU|_fI=vfk(67n>TvsP}=s;lo@jF z=2nKfHa)ta$J*u7ysMF(-g5?_VAI>6;FvhQA}cC?B5C6V+0y&bCS<mV z@(*RD{Q3L)LXk7S$UcG!Zf3d$MIzHUA}w*#NGP&TU_*#A*r_YhHUMP@9?Wf8krcnU zo1#p%r5e9uHU4O*QRUK<+QQzV2_ls=Dsng?QB#AWIjyl7Dq#)b%0Qp+kUq}#ZT_|% z&rPaosxKYfzZZ6>rn*vAB9Ys*^-WUY_zAHuZQYrYQE)Wv#c44^XnCrK5=9(CZ(uy* z7!(s@ucpLV5ixU|OKO%npvHRMP~<_T#)=}o^NdY&5y3IBZbd|cOWiyn9Z4C^M-j%{ z^;z!0jNRLRheg7GXU+WXz)>i&4VfgTjHlQln>p4GZHpd=y>C!mh)Y)`20WokIb%&B zjbPR0^!B|A51GlN90rA<8nN;iQ;mFE!8A#6RcnJDi8{FOODQ=W6tJe`&1lso7k;rQ zqbmYYt4p+MQ`n;dQdPqo;SOjsv@dCMv(V;+d|jK)6x*Jadv^Z1hN2bL=AS8KgBQy0vWn!9A4Qm3Y;bmv)No-))CJWD|+Rl}r#{*MiGqlZ$>1m2Tn-Gfw( z!yHeYYQaLM&T!{IHNt0LXg_EB);9?otvZ*tk4@A8mbLBdrYm)P?CLGscV!$rylK@f zk%KUSj1lCSf5A>sf*C2UpxF-dF&|&Yrb$dtrO*LCWQ|KiT<($4(b<^jiN(n5&&{ zXaCSJS7<|s0>z51{go6ec14+aqgbp=l^HYtpq6E&eg|$7)avAR88vCB_)NBHYZSrC z{aS3TEjfUtMNw|lOVhI|6l;UAI>TK9oe}mhKRD3g-{P%bWliOo+xPe=A>@h^5ZjeNx_|Fy_A$FLy?c`w(Cv53b&5%a)p+a=@lO{Vj@b$(Hal+ic^L^ zxv3YV-J%(6w>1t6xGUIVyE5|CoJQ)^+qe}1=29jlGIVb%*j3k}~n40F2bKrO-s3!Zaj3-&B0pg4XlI<8+_zeGU{ zr7T;%{0a`2Ef_lo(Hy%4kYYP}S~k{Oqn_HAD;5Si{Z;b&wY6Gbp5o zt3&I+H;YQ~LJt(34i#6Y`0U*9Pi3raT&u}XZrTbP&Ru)wFlV?1BaZ(oMl9RySJ!X! zY$dsVu?t(jYhcA!il|t@SV%c6Xvj?WO3@^}>tU%B8S$}XXjX9ez+rcNoxOj@ubaQP zFSaXYS7s+|JBEjg`Po>(j$YsF0Kx+cE2cG3I!~+mOCj>WS}VZ{pU z(FrS7pyROKt`4nwK5_aop1oF{%}rNRt5SS-|NQ*z%2@k^2U~vk%kL?Ge-suo}sJQ!qP?= zmlmOkdIUmdlcm)NZJ-j~V&u{vv-fWQdE>j?7sZl_pUXH&Z&SH#&0|kR6%A1F&RbpW zeYyltu4t$jV&wQ)@oR3ruGZLw-BKc2iBA0#&@HZu;pm=hsEE+H%D$2HyQK;J+S}lA zfmxv-nl?8+S!3zRg;&H^u<2MZq=6&c$_0YM0(YyVmhGL7@p& z^us6uqJopLq%xJ3R6@JZjI~T*R(k31p(s=E(Lb_ZJaQ5Qtpcal4;=I0ubF$cZtnTx z>N{D%YY&||dGt^oYWi@+#L^{I4k-A$a94ZZULoNFg@zTKriBq(Ult3RZpw%o^E7p$ ziKjQQl7H1p!KM+5q}K4i769dpJ0#tYY86gMvCL z9a?pa-&b-OO1^L)y)32Kj<4?+d%HTe*`4oi-ttHD^sN6S4MVD+=sH#-XL;DLTV0r< zZ%a#thSWv``;*eHXu_4rD(-vKFR5QTr?HM{n>Y2d#TM7JXZ1y-tYaFxk)3I=O+wFk z-8ou~B>N=|YoX1{{G_8pnM7x`f4)-PP>2GSwST-|Qs^ zwpcQ1J0ZT2)85+KcklMiKYYAAjx_yx9_`Y^i@j9Le-+T;qjC{*C1J^!&y4}78<47P zp=8fA&Tdt;y)U;0h_R(P)98=d(M}g*$RXR?AWD{5vGB;06<67RVq@NFtLCnpFlO14 zqh6|vxhQcW!j{|3sUz2dw_nnRH`TAXc&aYkG1;=vvJF~R2Kz=1?2ES_t-?ONM4@%b z;eDy)DL#9Cf5$bp#pI`c{Q38k>>W?oZyQ*LV2!kFgGZi2TE0Rh3+8N8CdJ&=wOBLV zG9ooQm&RR1&0?+Vps7UI`Y@0&W`dkaHh0{O8HBAy*x-#dShF+49yPz;m-}}Ay5aj* z?_w?gbo|_DyrqXv24!Oi_Cj$*z3S2w`_3`&$~{8x-L8R1NARcdh|x{YhG&+v&C#`c z5=9nGzS*0i#aZm%EQ+S-A=$nYinj5o5>M8)8Z>dX#?LGzXREMDvSuaHHCP*Bj|^~i zY}MoO)5Rram8C~BQen?KzPZOWw&n7#HvYORGws#Mk=3ka`g2-DGqzlO zX=8G7_%(2LS+c@fR+i55s%0^Q#HHtq=l*_6pwO~d4Jatvh`Gp?Ma)H2XG>;`1fR9s z5Mm1p8M*40^gn<4{;Pjc1~%uZth2NqojfxRX&^_wbh#RJ7HoX^JP@?qKg=1Su$IZ1 zAxDcfQwnuG2iUx~u?g0uE+6hL8k~&@S2pHf*qDC@XFGlHUl3k5*0I*k2RCl1MXQ<7 zm%A-9V>jbR_`)v>9oq)Ez}VUlEy`zbXct$dMHDMXRq-o87A|3oX~<*_?mKz;Vy*O56Iwx9=>X7XWjfR-H@z+x9?c$ zP1EUFyuX(XI_HIlZx4u=q-)w+2<9z^qA~~yI?$9e#1*Ut4;UQ#N!p*A)_wi&xuoh< zd(YC7aGX%00meeI=*oIj#O((rx;psw35yuyh)`kDnun?tzcwPFGFFHh77e9X;xJ-u zSrf79`B%2+?S`IZO~lkQ9gfu6w~>)HAJR~}v!1zN&3cxkO>g6cb0#(0bTzx8?1O`# zH*HEMA0v9vHk_t93X zHhcMc@tPlJ@(cT`YC0UJ&=yrD*Fo2gB?(?sje^txTGh;|#*SfDHDy$~O`{@WQa2}5 zvSBC_D$+FBv<>AAN3asyGIYespZ5Iv!?z!=P~*D9&iT0TA~yUTK9IFHWj_Y-PhY^U zSX}m6XchBGK=-j58IMT@$1UG0 z=T^`)-Ds_Wu3byw<@H28f982otFH4|*AqPW8zaA#`nBFnG%F*}wNy253j&Xr_}Z>N zH?RM8^_{Tl*t>V1y97rK0#8Y!wac`^l?l9f6>?9XZXu}cYJ*&?ZCxhNc5}Ix!PB(e z0y1$uu4#q;#tQ%QstVU|b4P~VsDt?uf1|mnFR~=NZfR`Gfl&&xMou}{HpCUB4z))P zfMJjP4U3w}%iyS8dumd&RG(en-KmUgJL$1?KmM{aohUp!EDW)T6G^0tm2Sh|HAgpa zS~Tim;5_C?(V3)jG30o4oe!N^x2Pex8ah{&+#&CYdeJ$rVlP(T=(Ax(c_AZ{piRg+9OtwoxW!uy|uYeTw2vY zY@T|PtApKdpi9>}CFN`h!I}}Gsea9v(S@0--QD=ym(JeODLh#`ks+FC=)bexcX;R> z4J|Hm%Y4hzZL2-6mzM@qzZ>LEP2MMCQ92p95~U3Fi3;nabZpsc_4!N1W##8{QXPBh zQq)xY*464bZG79LPrl#0ZSS^!-AcQJN$sEu%nK?8Y0S1TyH{hk5<8W=uSM@JTrqbg zS3>jJlKEHD{Gpei`S9_Lh}}}@_Gaw*_b3>>Qt>@deE4n8?AZD9_usz0fHa?+hK+q7 z_q>eMv`iR0whIe`Z+N?x(!t&(!~xAKuy;?*gWW~U*237gte@<_l&bE?Q4DEP@6~pp z_nlYNJC##JZ^I<`E_%S$S1wZbr_HrN(3L&ZP4&XweWQm)_NCyyRa_3)eDR_5-MgK8 z(5FmombUA=`Qy~_EvG&6-S=Deq`osF%KS`Qa1~nFYDgPo?$~$+0EmHu38vwT8B4yw zAi{O3uy8s2n)KhW(6LBOE=M&jZpqcuU-&Yqf1E}A^t?kaqRHxtm;;i14yJlLp;-;C z52CqJHDth$xocClZ}{%>M=-Jw7yHHWlA?21sg|>E_r6^0HNH?%R>eWw*|`Yf`VSmD z*vaarYC6RSVpWDg_tNftdvR)ZgP0W(chNeux3w1qH4(^p+I_Ws8{7RZ*1zhDA{%!; zRDF6@*gfgLxd`N%^R;Ubek;;HpQxfLOB*-SH|bsj-7BDbHQFaC1bez$hksLqP_FD$ zW{OaM^VGD|-(QCITTNK<$+``{r~a^LM1=fIHMoM6A1{<|hIO9C&re7^NdH=FzZSYL zgXZVS>)M`-e_B7jarBi(CI^I(;<<&%1s565iBV{gqfz%m*2j5cQW)1u>VjPO5GABl z_|1>}zU!xTYhS%5UXAN~f7Yd9x|MVwGc7GMAA6R`?2(Y$*9T%hREJLR^H4pa;RvDn zX0*Nyp1v7-dSUq2OT(wgPM#=(p}DCYyM4IfCF#D}zFk*)H4mM5Q@e=YuhZjqF0VoD zZiG)>UJYs~=$@>TLU)8FP`V1GE73kMdgaD8UH*OofnE8<18I9m>kTk^-?TmJ7pUXg zOqlV)H|u}i`Nz{^BW3tY1tz#hJX6DbBdjHkH%z)yznJT^Ojo-x|McnCqWr3b$|4Qw zpSO72U~yaBL;HnN`^R5>WNJXz?PfGDGjuU7=FuI&{0TKTne!Tac3h;2%0< z<_Eie{ohxgJjkZM=^S=?oj!Ibmrb7^pI5W#mn6G7+WSSg2D^0qi+GX#KH>A3`CF6A zH>)zZGsIJZKDdbJ!$-Mg;f+!_0Rg;j;LyI>{s%)~HwtewcO)P{6;{#nY=(A;XqJdP z-Get@Q?!7`FW@xDE##W>Lq(r^+=>C*F>TcH_Oq5~anD6#AbnRAs}Gi3#=%Ei_)Sa8DmZ$YUOm-NZm0elu5@gEW60pBAw$%`3cP^m$p|k% zP>@u>NMIvyqdQ6AEZX11O_-j!te}|8EAhN@0(Qp zx>$LE&fw`sKU<3X#qIP=z&jdtFd9<4qQOl0Ter7VcCaO?dnZdkKr66iI4IL}D;$() zHO3wdUTA&OPL2i-V*die!N~#P-d&#o4lO4x{P64bzwZ8gZjALiMPIS?(- zoKl^>$&Gv+&5MLa-1P9T+kRO4=~Huw9KJkVcDabiAu|=PD39@el3E9@UMT9WC_JL? z9Eu1F4%ZD2tvOPlrQN(k+9O1yK!J`*T8lu|ih#)uPITgSG9FT|hzE)gTU!7DJkSXi zjSB**Uq=ZCK5W5Zyb&j8h!eD!PQzjb_q!3~(*55T5Gx=+q-BBXZe@>-h}5mms1sUE zochGtZ#Vw&`(w8a_Jo8z5G!n4SWzNoZ?q5s-gI|=0g})kW$A?iF~y2PAb}$0DwUy` zVMAw@Ep!1CwaN3mf+91o@YJO;t`VGPP~2)107ar;KApp}4{sD90z8dg=;K3(BGix@ znC_zDKl^jjSD(GPP>t^s_gKN@vJ$MnK9rlDl5v3cq~M)w1J=2#YVBjlvF-kYT_6d~ z4HP18V2^>Uv6bWq+0a4gfJ>Q_HHzR-<2_@do#T#(U5tpdt0KZ${O#7gvwjWOax_XL zjHD>4&o}3u8$w47`GOjw4fBZ($BL{rV|F8FC@(&UM}-m+-QhF#rmVk%Mv&*fwRYVv zyS}_*n4C$G-cesC7*Oj^vQ&fO*g2V5WMig~PtnDBr772ji5Y5A0?6GkKL4HGk0?)UxiiQ?gh-Nm;4{G5pBL4Q&@4v45{G*4J z_^xp~i_0$;ohPzLNzb8sWPJNcQB?b`K}tv8?gOKSx|l3f!+9V#RYR_qYep@&KsxDG zOVFD?f+$Q_h@66mVz&hrnkAs5FhV*GA_`w33Y4G`Mfl)Gw7*x!VPOhlbsZI2j55p~ z<*#(Qp~o|VC$hvA6%d6BuA@`h-n1Pb5Gp3$|H+r@f7|}_*ddX+m*fu>&I4n%pb8h( z+bIEajWQ*WAyZ7$6;VqTPdLR3T=W9P5hE@xToYN$a3<9(tOqb0O$3*ME*Ka^Z~ZfF zK*%i&47_VM*+Pt8S>G*iK!M~kjMu|blh%cmQJM~NA`H<U zLLS7G(uL?EZR_LIv7i0of4|!B=eh+WG5I2Wh)k@-vkn#SbyVz%Q34WlY;f&~OHW4o z5HBJ)+7!zWWbJ{2&1>)@GwPBW7S;k9t|p>Qg2u%%hDOQT1dW?zC&`2cja_;s9eU68l(UohVP{S$-7ZraNm`NW*7%OsLYSW#@;^V$!GVbT*ch5ja$4jgDBQn)>}bu*RgM z_rLgV%O9^z8EXAZ6CO0&Bvz%;nkO|No&ci%qgL*))+eM>A@Fga5fgaj4iw^y88u1H zh1I}^+C=!NI4}{6>UWZ;W`Sjk*kaROPfa{C6RU%v(LcgT3gcv-ffE`dp^Am4gE4W! zaVQSf_3rN$b?^ZVaX~}G9Mnlt5r(S6)ZzB1zF?7%AE{6Y7Eu5cjaj4{u}J#vj|eAI z9{J>p@3;MQ|IIuLOFTk!DQmMZH6D1h4XEUeMw$Q$km8L=#BDcmMVKnse+ej+N$SE% zs$?}Ce4GT45KzkB``5ey!DI9araO;1=luWpqOUPhr(a2I&ALX;&%8mB^gAw2vK)I2DLMai^ zmW~r~!wd-oPR*&^J8)%7*0j;glI09;*jA?#L?Il6G{Z|eDr*T> zW86i6t5GAH^U$A;l4ipZy+;tCBpfcn0w@rQiIdK}n)#3akiE}&@sqV1{`hR}aI%P& z=7*YvJk8%ez^|P5hG+qCjrc?csqAlzP=uS>e}PWQlFES*uO%)F{9((3Ku9Gc=kr}4@p3=oJ63#9Sd21H^G;_1C0Ey6!?!s_2QuKn<}g;;G6zXpp?u;=~s(fo{* zeR)V%$2sz3PGJilNDitL4$E{8T6 z@H-HGi^)vFv8s*}8&)lgl~fWZro&Mq28_OU^Dke0_||=dll$|_apvjL+2e=ca&oZZ zkP4&xD8a{p22iv(r8{%2ua;bIGgK0BO^x)>7{gTc}qG) zt>^R7Ehy$e}j_c*O{i%%`9 zt^ljR?d*fwIeu2eCmh4>iBN9z?Ke1@(L&RMM8_Q^9qYw1ar%o+XX33q&_YA&6vp~e z7%QqGa#YHbRa}Tp1YR=XcIXZg^;5jz#jS3tcE7#{HV~nk(huWsqH5YWpmc}J$l(K( z&aJxs^L%khY3cDy+OH>A1r8{+3j&n%UGI`-nDxvDpZ~D^L|YGPQT?u`8XApIQjBuF zj8U!x7398vN;*?ZmJy*`1u8ToMctss)j|l`)f`24p zDLS~%ij;71J!0F_P~znIuYS08lMffLQ?^N)Lo&LQcM~$beO7RrJtJwE%B`3hKO0*z`}Jk@5Ca|vX9Y{{a4Wi5JR~qpzAKN6n~8 zRFZ0v>KD$v8eW{AJ(lPfG-A5`@=fpC8Wj|ZYejd)N-X+WF$d)0*Q@lPMCuHh?2NPkkXgb_gtf?KNos`lI%rIWq?5Oo+*P39Jk zTRL!zq!;w~?kCsUaDKA)jU2X63y;e4z?!J0TnR4wb+}O6B1&yn^h1(d#G|Qx{rvoH zByCyUkQljY$w3RFMIGrgYGfq2p(iflLCxhO`_r&bjq+r554oXka6|jk*3ST5rv2mH zPrlvy#T}!tyMY~13+aeZb`~v55xC$_t3*9on;Jv9htm(1*j6E3?!BDu{z3zx9o2!vu1y zj>$xhSnpu#i^asW#hR}b&|9$C(mm=$eI)Nx)8_`DN8BsY=;%PdD~^TF3`2U9s8Qg% zu=kaLqbf09JT8F4VT|dV%$V088>u_$)WYg%AD^qQf_>QXjJMlU7^-~JC^c#cgQF(A z_{+B+zV-ASexpeKbV!W58(_Z#%Y%)e3bpe9^jmCG)@F?w5XnjkD{83iCS_| zeLGV;bFILkE$sxH45pl1J@mzY#So#^D535tQzcN2kxyfehy&j!4~4ORFd2v2w!;Q= z#_Gr0^NNcvmz{!(vV^`p*+=c)^A>ZH zTy|4tRD;{|R>qOQQT5|RS|7R;CqAdMQ7qsrP|rfaJ1qwfx%D5LzyJ8H=NBjm-F`2t ztEr;Y>2MB3IHx%n271V4Wk!N{0;7iu{2;=N>drM!Io-q+Li!yDKG%zIxTl^uX*^=! zHNb&S;!K+|r%W9_HJmw#dJNTdoAVZ(Hs~s$9Mj7ydN^&u`EP$S%{HS^eh)$^HnnO- z4ef>J{;lpk2ihq)l7Xu|B5~3X;e--;_V3^E9MCg0>Gk)%*!;t?oB2^C(4!L%*$T0& z9KVzRvh}Itn;di*n<|I1+<>gZN5(m328Bn$e+51bi8V=a3!6aCp_3ObSJ#u9`0DW` z{R4(kkkh2Ug7OgKFzq1ICfX5$q_q6HuD8bDVtF9nLT`c5P&Wm~H;97y=q2B8{B+Ig zWPoRVaV>kT(?=-Y0g`ErFs=|1crM2&oqYR74QKRd9PyCb;)<_iKDu*G;L-YBhk&OS zhsTt5Hvt|MldJ+fB0A1u@Z`BUtw!MKqJxJv$C}hbrCwhOjXUX096d7Cn|yG!a9GWO zosok9oz{ImDJGXyKv!BNcCf&iy8`?7Z+nEmv+~XN*Z%VPoug>lhazPCTcwMZNr)m+ zM_jq?t@L*Ea_PJI;yr2r+>a*Lg>sSMx_HuE^r9&sN1S{uo~sr)coP9nF5`#Guips# zSlyOqjNF)fpgXZ)sRkb-*MRE#6~vn_;kLw5s#f@(5%a&;{Mnk9R{%X9T&QEuMKMoG z=D`!^aq$Pq6`{w+^+H!X?C%;md<5`=ycYP;qPj@-u{bY(e?PyLe)=pdrB{CeKiQ0* z15M*c!-G|C_z{KRW*qT!rPhuNHS`fQb{XnO+bDIkedIu;OY1?q$Z=u$o{k?IN6S$Z z^Wdb~FUip5^he%&|LZMp%^WVCbc22L{S3OXnD{ZD-S@86S6HjuxtJ;VM-W8a)*92<*6e zHyCC>MB0oTF(zGF7>)}C80Ma+sF;~=|MdA=uRaL)tUgnR+ofel&I>YAGV+fhWUeCk zAn<9mHJ~$6rf@g_EZC*shnyFgBx+$ioF7WQix`lqrp!JR`rwf&Wn12pEqC^*u?zI% zbL7)FWTqt*TD!hp$cMmV)cdrMb^<)IkRMH9{s@h+<8#x9V1Q@BVI=0I$Fk_8E0K=? zPd^TOGWKnVg(_!0_QnU_{qmm)!|@71WV1kz8qtm;A9yYkJVNCBRIFD$Zr-WA=VOJW zdkNC`jr8!x9Y3N=dCmB#NOUF5zI{-rQ7g9M=LEbLv(Ne`R}y}>qd*zDCE3ywbT{%5 zzRNHKCspBk;aFO4V;L8fG_4Ly9~x;xt-P3tFaGr9+plus_2}{1I`}XgV?CUmO5rmf zF<=zgkBwG4U)L!p2J?ChBl2Qe)Q!?ItzN7($3XfNHr_-Mj6h&sa&}J`4u|_PS$dq@itN&sgCx&Y4ouEN|#nk&jCiohcj@Q z#Z1_PIsC~;|Bl>A+|zG-_`l5$-$orAS}S325b>?szz1dQw7#Eq+E(!$pJt3A)o&Kr zuJozayd7-^Dh|5UdafBnWr=Fi{40Y9J?0+>MA0$=qOO$b!PqVY2XXZn79k_oetl_I zjS6$H^;E12-3UWB8bOd~<1i1YQ7wl4?XgYYy!-0o^O1rrKUiB|N7?)7!rZ-kal-*Y zG$rqpf>kY0I$!4(jp;s#AxTAAL~9uv(C^YygwcH)C1H)rJ`zHdgHaHj%MdEi{g@|& zf}4O4nhyqqxb`2~)}uftn8*iFkb09nx(DK*?ypfCL@S@o+#TaIshtr-XJqbO3x!Ub z_xzh5{;+=eEwEcPy1NBM=GT(>>ai!iPFH)`db)ZlJ)DfBx%69Eq9Mbb>A{c=q%qc_ z;WY#4a^mcyE8vJvo~RpuBmZa_33>5lUbu*QM?PpZs=aD^(k)SaFCf2@VUrLxLDWh) z{0+oILxW(Ej2;Y+7O;`Rp|czg2`z2u63mwC0nI-z44y80p_i z>6npv%4rcDM!dL$cc%AL=}dbM+-Zak^p^chXn?Dl?Agr3UP9?+Oa1xUpfugJpgOT6 z@y^>k92@pW+cK{z&nrHxPC-`{`e6xxf)m1nwqgO(Q5=qX zxPWeg384`_1$iikMr!!=`q(P=aHB>$deJ(d>FIkA9Hmz^aBy_?SpNQ$EQ<2^z>5Hr zx}~4m+1_P{GEy7SomST~Ia=ACf0^D0(hyzijjkrJ)Vxh=+SNuKbTc)pu?r|2atn^k zvQVgmQhWAlO+yL#>VZ$>;7APS@^ucHa{!bg)Glqhj>srMbaXO@LTeLCNX;m;&Psa^ z`kcP#r8S>z`gGn+^sQ=iHwz~jKHNe{CYE~Gdej0-bmc(nonZ2ktT>2Y&4`jj^Xt}I z`7N5>`?`h{ZFgBnsqIKItO@?*AX44lp+z;xI`@+a{pGngSF*QwBG|Y?zyf z05q%v3eYn(F|8@^G-gyNbwuWzEGa3ye1yYo6Ho(1pp=#J#$>z=ShD)f|NivO>``RI zjf{uts%R9U(unduSr3I5HXQG>_vl`w-;L6G#~aRCE)R{rv_EAz~UY&}6MO!bEf@XC)^2)^$g&t(yjdKe%i>KI6=d zyTfwaQID5ep^h;k{*xa+eDygh9PI#_5HTU@M$sDW4jjv-nzfFmi{q8feL_cwGdG_6 zq&NSY3$~<|M>nb+HKHdmDA)u&M2PJV?|WH$_JepY`sB zk6(RmiINbst_Lf7V=&>SR(GYF)>Y{yR52H=J%geQ z?t}^iref$l9rt1XIzyE$P!^OYPQNOqHb3z|fM4VUJ#^xdfYsf35)^SkGY*`{IGo)b z-JFJbNKm0GLdI)M?hDRE_|%#Tt;46jw(+BvpIxdX^xaY+K!uy(IjQM+s0--TB?gu9 zAGJ&K&i!IW5vn?|;hM4*pwdDDjexEZs6;cLDC&kA+IUA*0aFyA%BA=6akUkVH3LIKvb|KAaTH4#V;|lZpz8B=2~{TZ_RH#$wwq${(Zo<0nOVD^ z0;py_^wOHO8y_FfPtONI4f&CMH}JQa?QjNJUJTMB|7?fj}=(vdjZhY{8lO| zmW(O&+g@syo;`-bf6$vR=?#Ra8B-yRd@))kdY@m`EIlwK6Fh2|)YuO)rjA%JMXxAi zf+w17L0oFGK#I!*UR2iEXif+wAf6gCtOqa^uoXmAdLqZb6jdzMl$)qsf|xve_Y+g5 zO`rAf>bJhy@W@#DR3nNqIoTVi#9~SXim-K6ySlo#_<-ts;}N0wC3UW{MpOT9T+Jw3 zK)9OL2v>Y#8}9GiyXT0x-%_)wZ6VH>6*lwd0lWVPp)7Z$d1&-V^7vW~j>KoePmWOy#vsCrUx_(-Kow;`k8m)%KASaO)CwQ@FU`R&{|>k7zn zfwLsCYI&wj6gN#|MK(fKS1OM;jjX7S#`|6c_u;--_G#Q$bo>C5Lg75$UgT-5eoj-n4m>RH1dL?m{P@)$a2IV~P0}9s7D^ zN^jYD64qat7br=b+XP(!RwaV2aHKNCZ{T>OezMnM1XfZm4p7OQP^A#6N+&5@d?JxYjqcFcio?NJVtC0N z^G%_OkAeug5|z#x`(dW5V}>Kt^rnlwC7!Df_Kqp+JVQL}#Sxb z^wUWGiVtUbu+{ApTkXsEKkD8D%F6o67Qa=Df`}R?1gZ+ec^;5?s49x7sCgCvWgb-! z6;Z@E4>(V8%+MN>X#VN$B>lS6=_H*_I>^z)YA zx4c;eRzIuZ%w`3w3IIn7^qU_)`M|Bn zQl|YDr4S9_QNq^hO2lyCq&wKExiNayS(oFtuPBSfhk9NtcEyF<5Q=}+B4c@7l(%5p zK@nMBGPb@p*rI_R5mrBmG|_D>HP6F}7z`&n&U3IuGE%o%r%C`s6~f`^LkU~c_8mHO zWZ&nZ*jl}2-6zZMMKf4@_oL7M{FgH_)T+26-L)&Hrr@F2!h>{Y)}IkOGpf)P>s}ft zh%DdZ!9`(i9dc^bQW1fxED>pK(WHeZJg?|=8H3A6ck^U|fzDtFCU^85sTC}%d{ z$Vm)w9${fWzRo3lv2%qFCF2Xx@L(>lU&jF%3xECA6ZhW&eD%`!IquN0?rOZ{ zZ11cyFC8>gBh2|xU*e?qv_UHc+maW}X-I7O0EXU=v$|9fHNb)u(R7AgxHII&kN`&e zBf)~G%Z+IGSidf8TuD7lA9|&CcG5YEy+a+3?A??QVUsQoa`VPr}N(g}++w@2iBj-syt z84KQj^YNvGuK~Y5F8oFKT2r|e!6=H=8GJ<_q?=wB4Wtf3M3*QL6b<;=ZvTpOixPy! z9Yvc+`0~2a8i6(*tdu8sZD#)3s`x7?xIFNeu|_qzdIn0PA6@-Uft=Bm5%aGrytBKU z^T=Vml(qZQj{~*wdT~bAeX`;~_zop^KJ?r#-kp{~;zT{NEMJ5YTq5OZj!zwxdk9xQ zv5T+cjOY)V@TJhrnejRRs7s{NE4m1SD%7iytzUH`gq5BUVR+aS2+OhvbA*@MCW^FC z90oB@x7$%0&uIEVg^|)3=UkY7EjCC(z5>w@z-FR{%{0JK^2;(tf zP6&tLofb@y&2!hXgm5slWnBK@YH--DgYsw}-d4S)*Ckmr)yd4HaWgMa8VN?cOhW}4 z5C*Sh95+6qRAl4f9*FPRZ`kUw@PXeHeg`J?L=eq2w{J&5riF7BSSUhF$jCV z2N2eKfH$;@`gi9#dEIqa(I8rAOwYu9e<%L8G{Qp6F6yM>r%>*JC zdYxw2C4gD?w+=(@Z~G)6%+@?lFkA4zQ*Zx#YK9gDMi+?7XG}iI{m0Vee6(r4^!E}w zy&m6-eN`>iy%@BsBC9l0z+dZ-849}!^<`!8UIX-)b56195Ptpq=u{ZY!UUNgW_V=Q zz)Z#Y;MSAmhumS7;4jZsOBvnayF2Sldg`S9^r-LC#G}m4g8b!@c1M7+*B-uSCZTL) zU2{`o3n*KC5j1n^fauUpP8I2?)CzNMJehgj&Z56ll}klt9H$|Wxsv~D1+rQm23buu zI0R(IT~$I_`WnfoqgS&a8{CPVRRY=2i@kHYbbp76<@UrNTl-pWenHWKA1?cscc+c8 zzb4ZBJf#p9j76CQbbTOG&r(2<;goG1e=8HzQiiJR{IidP7->g9ES+LC+*Oj~*JoUt z8fuRn*tI1LV%OzIryPeSi%&w};;fI$@XYP?y)MpFW*D0m(pMVMuR&%Dk=m{#j5VL$ zd|KqR=F{=Ip?L%+-wY+(C?ka;z|n4EfTZ!D5qG@zqX!pHC!DRR7o3SMTZ6K`pP~^+ zMnq#U#*#LpH|v_xAEOriD@S({>)V6>RPHWA*v#wJ#Q-hXTWVQG=0$Ci0BuKvfF@~V z&yi(bm+Q3nC+{Mp3NbxgPJt~4XM;~7pA|667 z&K#jWr#YEQcB}e5v4{~eqr)BQI3XXvhJ4{~CUROMe>1T&G}frYWciO06M{7&UM2pu zG&5MMho`jjtBuI`1*_(D`SnxkfwlOYL=bCubhlqx5Npz4;*%M1#DsDMw5ZQLYqit>UP8wGrJs`o2BClGmqhs&(rGgJ<0O@{IgW!Sr!}4$#b?6*DG}f<&`p7|&KPjo*q}hv zsC(ag@qxRi0C3a4YBYf3P4^(b?HT}gpnLz}j5zW)2K0~hyHxov`iJl6O6Lzo9sL1& z8*y!?RcqT6;(~>AXrPd)T??KiSwl+kg~M+^9CrjAsO8Ma9Cis1*ZU7g4in zG*S|5@L*{RM6Yo%rPp%i-u*rm(}R2HrSKI2z!l;y<*_N0D~wM(YlhQ+TlL7ofdV)+ z2uII@4@Y02Y79sTv0{^HB}EvN*v74;2p$)1#-p#%Q|W!*6JSp4G~V5`{Q)=*Uis)B z{_2JM@0<+G-MOPlVGe2NIFf7Q#l9JW&;l@r%CCxQ-vsGw{P-0qcb6ZDU%PpoRf9m< zO=eBCNdmcDTv92ys-2EA1CUcW9`X_oLmr(+|am zI+mLXb-GIs2?xi6-{_iq_j_PD441cTTEBWlb1w2RWMbxXJt+r!@}u!y5^CgD!>H^I(3wXrLJ7Y92YapI$?YX$BmfeohX9PyB` z5B=)dB?~73b`R}o7TEC|%3oXCA($9Dl!<_-h8>wS)Y-^1LpdNy%BfI>`jgd$A~|gS zmcc4Hs;%3Z>2~{St2NlXF8!#sy6G_`!cCpBs3YYdL`O2N9e6Ht_+^B;{|4#~f31j4 z$6LKhQ(8Cvxg4mQe9wcgym#kl_3MhSt@J5vLcmU%33c+AbdiKz@Mxd2dqqw9z7P9g-}}y`d!p#?xOc3eZ2Y8b*m~@#G|fhYRwdH%8|sq zgFzi0Yxbc|nQdZ&@VJv`+{ih!r%W8w^vPqZ_553MUr>OBs4?eTgwidXXlqt;k~YqH z?A<39FPPv}^nURmFvqh`=+xCnR-5vQxw^(&r|tuWr>puJvtP#vFc;pYx|pjqm2ySr3Z>st6a>bp9##RUk<;m*Z(2RQE_z_J{-(#s+6+?nlVmJV-+~L->>6`I2~Az=6(vkm2V=W+6UbqQSL-<*)$*l~{!rJpe~{Th zUOqh#K4;M{YpSr^g_r)&Kde|oyVFL`5z*C8t;b=-W0P-6py)nj$k8n+JRChF?V{m^ z=nUkHC35k_WLHzMqT!<9IZ2(Ox;CE@Jtd0I6^}Zb&}6l$z7jQy=8wqs8|9wzp8DBi zi*LKptGM#*qftg3XnZptV2no{rU^ZOI{7-T6BCpLwu?IJ;;27bJH2sDgj-*CFwyOa ztFP&%zB)~WZdu&{P#owaaRxmX%RD{fN`NlqcSi|y8`mWS-Ku*4y79N)_x$@0j3dvT zbVS@wOM^~~_b{RpN@&7y(&kgB7Trt)Eo;9bMG@X2+=&pixRW*ldO%wwIXPfD#@(Io zR^fmho)%rd=ELPH*VubAuzLx2HB+1DLgVB~E#OYxHpVm7>G8NzR-AOMs*!MX9dFZ9 ztvWRd*u}au@!QY=;L(FIS8D5*n+a-O^+t@znF`wtD|+dtkKKLic(3A$-&HH%AyF#_ zr?p#R=VuP<&QD11$7J;W-IR+kw9(}@2y4RgP;E^dOUP*=lo|IVM z7w8tN0Pw&aL>}Bo{9r`J)fiT${O0K4qetR_*H4W}H*EU&2>`GBw#CbS@n~MUp*z;w z+I*C~Tj`m|_~lzG?E4bi$wgd}KlBAPF)t|C(cCQnJDD3a?qBsVi!_ocumrnkSMQYOF3~Pt9PaplS*(Y?t9haFN&Qt;?P1UtGyH}(e)8~L zb8he|dj7RGO0%uw)SZ7qZ))IPn;Frg&bB|C3EZU)^wML)B12>B2}rz)cY77#3GTcOF?GW_#)l{RiL|4J(CuOAGsaa}gFAE+BTmn}7P#y2&e0`?%UC4ta{EarWd)`)9}Z6xuzh zP1?nb_l<)*8QQbH>#Fpf`TnSrjrF`xl`H}tep^zrMBZ88;f0;d)32v=#;eERoow5< zPEWe%vLr2}WUNrY+xQCruVmickN))KQjE8uC@|Iwr*$zIY@R(Hc*G6OiW?@&AI@zB zd3MxQkVmY3FQmFjlNyDm{1fge3X29@bpDL_Ki<7<%NL)1vUW9Zfzv5$NIWPu0bb#> zX~(A4PN_@ap?tLN)6JUmK6~=ck!cqWO~82|bO(4=;VIzJtG`WMVkbvVZUh&2T~B5% z(C;14x1yjYb5^#BxfE%SL8LcVqoJA8-hO4t{Hf??r+n4O*sD6UcN@;(u3U%h2U^=~ z!~=yfkY3U^1HE(F^&SE?7~an)AmM`m^nzm)>!P@!BoTR1Yj?*XPipN5Q)`XLb2az$d*H5k_FWJE_^pW};u%kULM`!B z%Z~5H5S|=06T@>^V?Kuiw0bL{?uDv-}cq#K;4=T zS1hkw#TVEu>@M$Hh?fkf#-`R`Kyh=t##^y`r2-zmU58iB69JEh`s_$ZH>+9;*b!%n z@yd2Yv`h5lNaslB=*dwAA3q(c-|pd(OW-qRiV9!}E%5O*O?wox7;($bpI?0IO#t7$ zyPE;N`WpC?TR)>mXoBF|bG>&?+de}wGSUZG`P~}uNnaZfdj7Unz_-t#Jpo^q0UrrH zmA9l0qr1$Q)I8InJr{iB7iVUT7>GUUF83cha`foV&kXv!<;fo`XV&A5sZTb2{?~G# zZ|cGyzW(;Kk@%2Ad+d$}>a7a)h<`_6OFC*rGS8yVgCc6c1AmRGFp-@yL8f^D+EZk0 zl^$lWWTl|5mHwir82Fn!_mwX{+qfQX_sYuUD}X=qrU=pA<$a5$Psg)~Q#~NCA*{O% zAP^6&1A#-rsLw^9)7%OIwI2r9ogD4l+&PBhk;Hxsz#*FbNK=SC?&L4DQ$Y8oq$A7VmN56(k?~ZM)h#r_Dt}Gc#fkeM40L=Lewra$NtB z|8|PYX#lG6zaM~mnEf;Wqv$l8x+{WjU{LUBTSd2u$e+nbmMR$a847j6aR_Xl z9-W5Q_~5WKCPd&yD!$Btc=3H~+69A8fIu)j^pom0l<4Cx5y9HX$xWRbJ4ajulDn_c z4hDfM0QJoTwmZ{g}!C6rG+4@_XBnaFeM}Z>^1-fpsX*rx}Kp-@v5jY}i#L!;dx}DN( z0vPbvp3i|mZS2ViLnH9hFFtt!2pm6e(bMnVF*eh8+>3`xuEr3<72l7{Y2zsn1`Bus zEYaCh-%>aV_56&&n|}4@&|qP4@t}*(pE%>WPu8tLo_R&(2calz1PU9cHUWiAVQvfY z;985qtxw;T-69Ivc}cxfI9gpHjW{2&a{plLq>Wmqp`iv%2&p7-QWAG&=u zI^S-8sTB~C)ra>2SD~-pbMP4L11b=%zYzV$6~l)RMM#lqB?zqsL}-}e0?8+JR4FKl z3)CjA~sb2q5NgNLc}`BoKJE=s2)@$3^sO-;!7g26zdv> zL2ELDz@-!q64OPOV)k5$ic1Dva>0$$o>?mpT)w>W!_{CydP-8aAgIOlz+f|;tZe`W zL$U)3gF6%xZhvM`>oKU>Uyz9^#RS3T&R(bHPEk~2DpOw9bYCyRJi&1s>4JSQv;iU+ zcMi`ee(BAn^QWT=-heI`V-EN)@cmYQ@DT`~cD(Q~2l;-{Si8UV?sm>OR}W1mE)>sM z&DNA@#1Uxik%PtcSVs5mphD~V`D^hv0TAkOZmd(RbEZxe2ehDSf$8Hh(`)~XCR7dv zGcUtG$iS1g0fYO#49DPVVDR(L{}mW4nYG}dpDrsfPtUX8tZK1JNLewcht?q&B)wD* zy(HBt41+T0AQel$9&P+N#h5b$1^AnaOM$`hQ=eM%5wRd>a0M{9F^IuhV9=Y|01P&_ z0)soBU6h-4{-BU*tfsocgCeTbtb;L#VyvGEZ0^(u47TNOClrJ1#Bi|+JH~{sNhA}3 zVH4hZW%0b5y^551+tHCAF+uI{7xWf)5QJ_2s|P?h;yS4Oa1i>EH{t<0)@7U^bjz`T z@L(JhvJvBT8E$5~c1Q}YM?YfyzXTW@aWyb_&F0R>jvhO(S=lgpvKy^T=etGgHhlKQ zU(kFOPg}6`%~#4tQqIHhpkMNusE5f-gg_8N{p4CD*?BC@9PV_)Jo3PA2mE~{ThERh z98P~QBo&=p^ze8>+T2@T2K-jii{XU7b#eHs0sdlmow;F3G*L$k(C*kLYH;^+i}KUX zAJ_u^)G7u2#t46q^i<1?hwF8Yc8Z-8Jt+zZ(vOTT+6SHj6Gz6k53XkeYWQKs@59rx zrvJ;ccg{vnlJew1YKjrsIkX246n%*2;OS~)Rc(Xj!8Y&X&q+F`pO-m2>>F~-a~8AY zB)RT+T)x1C;6CQTgONHDNtUK~j9ZM27syQSCT;{5n)gTughmnahqT+4YEucdNmP5M zNGIV!n{-t`q;!h`BIR+EB1AQYF_Sr>FWHxJ`jc_^(z5pjh996Q`EX4Thu0S$pYBbI zOsxYBy+mD!gTuYgw;G4^5&byiVn#5Gbc}ZNPV&^F>^>+$GV$^f`!npEiS&@}*u;;_ z-6zbcMlE>z@%b~+oTU7s3UB6^_ITxrk2lg4TnCEDFLdiRq}w?Ixn2dyf*X75X{x?T z$8)TnQ28n;$WacF)+PxM4;e0W3v!keWWMCaYh;2$t#9&!QmCx7tfecO-P(ZNQ|`tiThqy zRFK*#M&zP~nns_HMWMNO6~i7)Q%C&ww?U%rl7pNGCu7{wpFVKwbaW^w|EoF_ifVuQ z@rspeF-gRoC5q6CI80gu!(&8`!C^?0fFhfm?nF_LXgd`AoQzN7a^imG#KQ)PdLqna z*$(E|3J{-=NQJ*m-Dpx|j-bf1RYi%o*f(-W^xQT-sycS;q$Atmb#RZYZ^3(&ghX~} zzWm}{AhB%5{Kww8J171H89ViMttik1>n0Q~s$7Z@X+fCuds8Rxq*x~pXyib)b~-_d z0!IA#qAEhccwx70hp^EQy$DgbhWgq=JHGggu?SAAT)8SpiU8wG4`_@`i@~p{pE6-` zm|?vFZSt4f_Z_LGFwFiJ?=DF_e*ktjNQLNSM+uus{7RQ+1xEUi_=vJ$Pkkn8bH|2` z5g!zX>o!IDNc^1C(tz)9nYn!6aAHPA!BcN8nL9OF(QOk(j%3)NOWC|(P34E!(cHQ3 z2q97R%FUC!ZXx!h`3+%ICo>bY_m_4%cTE+}vB#pZ=2%m^#=2wQ ze8z7noKv|X9ELNaGitz!gu;+y%!&_uAUycew+5lKD7w$2M`fEk)`Jl7Q!^?t4u!re z4tl?XD{~+&mocK^wU-yo#^mJOyZ3URQYU@NM_Bj-4Cz9qwrnD`k!-J9=7qz9ICL_M zq@YxWu_ck{@fGM8ui!Rgn@C`I#PFe8nun@!vGHr9G`nqzntz3%F!K`c+;-!SRvoL_ z)8UIio1*xTTIDak`e-tok(=i%{?QBN?#qwnhekUPW>+;nXv@|pw7eWlfKLNI!#k-F zbRmQh!ih3DChdfVg~r{i6Dgs^i$z%@uS`Ankw4bg#(H~=N49)Sm6_O3;}E>2{F)-r zVHA8=J3YckY?v}Nc)I@MRg6T~JcEPfB9Vr8pRZrF97`=aI76iwBjkevy>5dp z&u9UO+V$)$(MH{_glI&!Fdt+-JQCNe_zE+dHX!_fM%11SPlqV;N zs)6VMh_RDum4x!TjPMs`0%1!capcwKrA@p2=QXu;HOCL*$$?G0^$AKmSHK84K@E!w z#(pJDGh;LArpEwAGH)jO!T99{2IDHnb3FQ^#W$q(X%!fI_N3y*qht+6SsA0l@{Jvu zTZSW*XAx2gj=FnR6EFGBq=t=I@Uw^JO-6dK#~^f*2kOO9>5 z9L#tPW)zt$E;vf;-#+HnQe1dxyR;3jKSr2RtVM9!Mk41#Q!?oB7b*f=Hdwnqpit6n8c_G=A61~7@q*Y)7yGoU|&{>z2`PgcA3XZa0wBDcl6j3tOU!=7Y8R5L4t)Ly>N+ z9-?YB+c{P-CTLv(3^{7BcW%d&{{|orZT)ORyI}7kfLyy_)8;MzQ&?0|Hf8P)|KI07g0~- zziB$o1)C~%C?q|GWFsI+G}#g)x2e%g^=tRskoN5$sSHLMQm95W+M%g^^xJ?^&018n zU%4MLX`y7mh~j5ox^p`An9>&RLF0^R3kgW5( z6DZ01a5B1vM8qZ4Wm`)R9{F*^8Y@ce<%SCh$iocEV@#6~ejH2s7^iM$h6zYJG}HaG z%I(qbjSt|br=h8P<#<)q(H);}T-SDuebFd}Q^k3vq5gX9Z1gdcX59VS)5WOU^0Hmr z2c&tD%D$tI(G9h8LBz5oNqq=?lr#;@kq$7=I!k9DxSb(;$|^{1!zkiUz?^mGFB{NN z^S2_v^eU54yuHdZ8JM32t9Nu3)$gY1Q2?_Mz?>Xjzn%O}?Hl(@OzU$!-*`DeZ>_nK zfJv>j027_H*CEor0f)<7y38c4V(9X0Ex1Jb%U5R$ICVCfEjh9>a?%@5&z}Z8nfeBs zjtv|N`+WUJl^?GCbh8-X+Ups$?A&v^r4CEEL$87gw5Mc@~*?QzQn>riU zd6Wu1`kFqyX5aN*BVD25A zWbR~GkmvrTUJFaCwepRnO<(Q&hCN6x8u23NbVhlzfXoXs6*4(4JCM&h!=vMtR3$CX zgE7Lg%kdyx>nB*ok1%6afia_aHoz{W(0DpKtc;UzmY_5GRpsG1344Rfk=Fp1BM*Tw zzu8P)cpC|d=|(44bR`;{Ex!RS%csnJ_@{HmYQ{|T`2spcIgn%(`w6qTV=WdOTEHbf z0&PWc#~r{W1r`aHi-1dH23m{D(niK*bb1qTiP%oC`PSN!`BL(>4R77+@a1>Gr6gWz zadJiTB^L+AC4PpW6Tziwc+|w&4c2oZSL14~<5}aD{`lS*laQL&Om$rOkx-Xd@&8Oa zLFjiV!ktk&8mPPy6F9DOzHd$cv}lB(Q%7ptt_(@ZkC_>bt>bk`g39A@?T%B&WyT>Z zM{KvccBI?wP+~%%(i`1%AW(Vf=Hpez4}AR@`QphCXx124sNAsWtF4vjcFHEry!Wm9 z^7QdVpIr>@NIVafPZ&gHwBzv(k$6<%OG3*=gBn4l%$OLJK6Oc`oU`aXI`$cY%Co}Q zvVZApfu#pnQW4Mefq2a>zwq3dhtWMy3CZ zlL`F^ov5Fqk1VsYil2G;_9^JXlO8$fMbA+=3dqY9v>NMog+}eU0;ude(xTF~1pZIJ z9r`W+B7T&)@_3--iFF*}RzF;zn`q}wxFO5o>WuOt|=ZT^n zqa7OCH=~aGt2liOn%VgJ@Gx;X=Gyan&A~Mg=8Cu~es(A>%VsNJ#-=wiU$zKL+I&W< z+x)Y8r=*?Nmwt{Ek#T@|O~N|v0uwVt8U;t%H??aD1E*f-5lc@-I4YAbze!_QauCY| z5JpXW{qZ@IP|17z2E#->*8U6%bLE;1;t|y&Vv)>QvyrP(fzCltV45@IzdSvHqRv2k zF3Q}hn4ChVzmV4@2{^0cC^P+}PMtf46mk|SGz8&|C0}&k!6t56jkpltTvl`Z_|ctT z(yr1f0w*4ET`r4O1tKs%{qpNA|ANk^V#=*gy?JxodpXkExk3d~Z8fA4r6SHbOBEU< z3N}4pvzApC=@HZToEVx)UycPd=i)Mwl(C?|JSQBQa|oMcq(^{FZ(0*bGbJ%;@>aeV z&3t>wl(atI0h_w@>DaMDhvxS6?V25AsyKqay8$Of_da1ua!BFQ7?{63mY7*tV{ZNN z(&;xwE4qJ7KOb_6Fy-E~Zq)}LVkEk4FDG%EG33I4G4gZo+#xA+B|zbljg)@<`ts#O zDs?i{2^E;3r5p`7TJmE|n$iYIgfgD9x7J2o<8|+H zBXC)@XY(exDH3sUX$0oBzW|qI6K6f}(*?N>X~um%YRLlvlYL8?aL3`&>rf3`(gzu9 zeqd-(1ISb}9jh?4Q#1z1>a*9Z*o}V>G<~{K0 z9XC@+ziqb{JqtfkQ8j!n&ot(3RSF}r*gJRRMVSImN)O5v3vC(c&fF?Z8;$f0tK_rj zkz<{LXH97TGuY6kMkjqdzHMqtI=)*@`kUi1a#CT;Ag}u=efLx!KfeEKJ@>XcvqZqT z;j^!{Z@jg*q;&k$yIy~|(7pymA5XV;RB`ya^%#b8XPyi~r4i)F#@z1bo_lpxC@`ho$p}&hjuSXW^htCF6a{To zF>Tf;+Oz|oBEvSSDkyuM%Q;Q(bTCNrx+eIluc3}fhoVURTlMkkL)*TPtmKMHUCq5p z0;VK`wrzO>z^s^b%QG)lxUY1E|L*MZ82$N-UhxC-X#2>Cf$4TY>UWiafzRl%*?qqQ zFrxq_nMRQr5d}@JHPHO!l9_4e{XNi(fHY(6Xd50+raM(#;CYgTCyjruAeqf0Si3>4 z%7&#)?0;sB95el`hh|PdUT6jKLaL_2HX^b4iE7Z>H8MJ*vGhGx0G$IyGCDcZYrj6r zD_r#0hE_)<$dzSV7T=w(Ki78VaYkpYVNGpk7Q3BLd{I~H@jkJM_8b>M^dXv&7o(Sd zwwA;uyGA@ei5an3Y{cgFKcNvSn=s>nAJ5EYwW$ciUaO4zd}QtkI&~u?vc;jz#`e*6 zjfoL@uD?e&Q4JXFEI4V?)gZK%m|J85b9<(f_426(m0@>_wJje5t{k! z$y1f}Si4BOdIY`%q2^7Pbn7Acj)J(AourwspH()?sGP-bE+S_$Y35EZdWKYXjKkJ` z_`!$JC0pqPMSFS%ksG41AEW@I!$!Fn_18WTp42b|oXr+1yT+(k?v_ERlgMwWvXd?7 z+g*{wHVuO4V)>Z9fanc1)yJ#$Zea_FM|_b=Pu)-~Ho|k~#<|6%r4^I!dgI>w1Qcon z7;3w_=PS`l)$#cmRGNeYEK1WL*GHm$U55UHhmdq8b93xC^T>RC^$|U%Y}t12U*4oJ zD&@Uts^>E}eF&u&v;?8QUOF%Bylc69&GOaVIG6j8H0ywJqS&JuDqo;MJs3 z_62Bz9{&VI%bvgG#&WOXoHwdGnpNVA>F%vx(B0fs)E8kxv4ftWM`Kwp;r7w_ndCZz za10tFao*#Ur@vok?}0vxrqF7p&^jN5l43I!=NPxZv+$INjw$f^z=&?w>676i@KC_> znq4UH`^iiCmzf%>^pJOJy z_Tbd!inA*l*iDjir|VW%R(`Z@6AdieVNXKKPj52Nc{S#M5`f?pTK)`u`P>yrXtn~y zZP9L$Tj14zOVo<2&ekPqbo$9N*0C^AfmdT8{%kxIq8MXev=#mXhhwvPqlNloZFTkG z9bc*y3A-*ywt<*AzwDS96&Q1t$J1 z6@jxuA^iDzhEC#B12ftf2Fx&{^Q!*ka~YYjqIYK?l(^_m&#)Gg)bQ5V?t-z_DZ9bK1A60jQPOsZl(zeHK7U;pA`d8rA zcHDy3@0?hM;y!JM7d_n;_f-&}+#Yqrz zv)(b4B5D4h~gUtME`y1f&>u7a4cc> zPH_)EM2`m`I>HChfc~T=A}-R%zf&bYM~^Oi?76w)0nxKw)AjuT8u$%3X!+rq4WEC# z^CZr*EB%?YI@Rlr35wj%l&J*Cn|SwNa#4M|pyUe}b}R#tpo$ zzRR+sH4UjYs+)=4*wY6AqFKk_dw%mZ&5G#y1@-T3Ree8Mg3m%Z*; z7iIarLOYW+-n^2aaYbIwGf@)QlAt0_9#bu|XhWRGL>*F&>X6(fUe|a>fl6;-8YDT^ zJ^~A3eKw-TAKXqgo)SsA#(R|&tUpoYH*edul8SukP4~S%HHQEyk4w{BPqzv7_a`1j zp#PK1H0e*1(jk1-0iRS40{C?2ndgzq;>*f8`cpr97LLy_0SXSC=b_L?U^GPxKpPU^ z6X#7o-@50J;?Vo%r}n=3d!>F|Jw7bQh#0XK_MUW76yLesbrAw-FAS&@BZ8WJaDO+@m`~YS8pgmqH^lF=i zWTVp>i(t6r0<%`F?=3Wc+PETAZIf)(ke8MLB2e zd^}~OS)+-Enx;u|KzvI&`hqebA6GY7VFiLik4^nEHx6ts^Tx z)V52+q;<@sjVEMMW7czaRT5~-LLp~T;3Z}c1WLEfiPkA#R*k;rP99LlLZ|H5ydAcBIVWsno7$1Y3FCG0}boo&C$j zOEL2n{~9Jsm>f-j(p%=~VlNn_Y0`|4SrSeb!SXgt`n&rU^yz&?2u3yk1S>snvI&!R z>O@T1zI{6gaByjxSaQ_Csl8EQ`X(z%)mJGo3fo%f&X-I#_6;Yz`oPV_5T!p@uV?Z5 zc3>8diVsutEw%)^>p|^~ur^KZMl0a+FWGS+{ic-E4l5lLfPd*RZfc*-e=Q%a1WD2Qv%3z*t{;xz`h zYoa$S`y}Slu*eAElz~b$KRPP{6N)xEgio)!#QuLKu@T`@1J(any5NFd;8S}lAx_UJ zRj!mN9ZFEj)P-tt+cs?)d{DJ6scN7&{6kRHsWg^8?i9w*DZL#)W0<1HpPXJ&;#Hjf zyE>0Dcl6fcmd{Z3@yb&d$Wuq1Mq^_dM**sX$f(gxM%;I4s)N7ms~tGjZlbnn-H5VH zbx9VgnojBa_0y>|P`s1L8-DyHQ}A3Cb#SUw#Hq|c`BjAM0YK{Hy124WNR6m%BihMC z&Di~Cl>L&@sgJyLW6n77p{zi2GCo`_blF!^P#Y->BJ~IuHD((q{N~6lB&70uiG5NX zZPNX{?w|P8q!y7HWWD^vs4vQLlh zJu^weIbs{D9wfHSRKnO%Djs^GKB|F9wKId^8E_=C>5Kf!5)ejHHu_K z6Boc(``q>&I(8%xW3WoYCh<$P7p2Gbde$UuR36^zwAf7)}$)KnCY3iI<*m0hu>58u?aO^5v$SAZ_VWn~{u_4LdrRDbce z{V+9B?R2zIihmT0YH{jk)SxA0O;dzsBvzt!k@U1%b%<0dvUA2 zn5T5VivoHhyc+=2fuLdX*zhWx9`nl0Cne(?d(n3MPA3)gr5c$}qj7v%5Z_3NtZ^EC zZA;PPAk0PfN`Cer;B;1fZT0az7~bQ&zuHcssC}d|rZz!v%5clhz3ZsqFPgaIm75Y! zsx=UO)q-QA&hSDR8Z>_Lz^L^g75Ir^jB1Q2?Vj?8LRx+j+MF%P$)jh)z7?YuUp?@K zW>kOiree&f36Z*Xl^_)_*&Gx`{p0-$uJ9vuklKt4_>S5^b#@A;l9iUz*-PtCQR+nTs+i&h_dhqiu*j?E`fq`jDh2`YF@;NU z-^b+kM!yHNUOJl1MyEekLN&1f;7}VmslJv<8~#m9tezoOGW^M*a*36`VV?k?U0x?M ztY+dW?}p&UxSX+$Tfn+rZ~B35W7W_>z{u}h|TidbkL7;`y3vO#_5QxJ3dt*6hUlra&r<;YYZ#h zTN%k}r>LP>b_x>(;~L{`d}&EVK0MXPS6;M}bXMEG{B+&wt}8#FcReI(T2E00Y&d03 z0bu)QTX$S$INT*0RTmTj)L6L}Dntla!D{j9(rb+Hs@I!*jTOyMjRoLbds7J;{aDGk z!NBX3y4srKd$)c`F?|RD&95R@kTVI_@BjmG}Uvw<^FhXNln&V*fK-Zxz`}3=7N3 zm{!fL!Ruchxc%B*mwXR+jV3n+@M@oppdQN(#yPto+5NESu#;}j&b{rW*@XpO#VIdI zFa@)!U04tL_;h}GFz8y1K5!)vn~|sw34E&|f*_P(o0(x_t!G%CsM@^}8UZNfsxRNIynwXDXtIJ2K z*P>Hvo7VjRJ}cgi`$Vln=`4Tb_g;@-myR}w<*fu62{?HMcOsy_)wo{EQmh3mQLGN~ zI}~fZD}S#QF9{q4o11+#>depUYio|}@(ow1*YYYOEAr*=9S!C-&qAwJP`2omoAOkz z<&42q{ZPL~ee1$Kb)n_ClCV}0P;2Z*ECe}mOACmVmJzl9jE!+7_tDZN9?YH$JlKB+k*=ohV@@9u~8&i)<~cTEMh%4K7LKWDmLA(V*TE^uQ6eP z#0x|;79jIHJ7@Zj7L?`#u!{~T7mKs~XRKYtkJW5|#KZatX#y4nkvU$E%z@bCQoK=6RpdsoZIc%#%Y*bNfJ->B8->}RD@*Q_TiC8*{t&_)WsmoYEPk+qL z20d6i41m1>8nzm1zUly{)&$YY$jV~b+(SZq@2^M`6i$2Yu7X_MbNMM&^v=Z>%fd5% zRe=$*masVQ#Gj2M!SQ6Uj8788;}zltp95x`Y@Qe!i_HOaTz>~%rRgGqrTb4OAlO|8 z1g^^;T6lf0OGfx)ye3#1h-d{|Dd!{XonUkx(D!Xd}6Hl2Z&*DK)?+L&f-foS*jo4M(EShD>%r(-29KeNbjn)+pE$r87w07sW zW9-b8cu12gp_TFhbkR#D1f|B$g5{&-E5`#Q*BLhKk>s&XdE`uZX>mn9?5rufh*~KS zh;+c28|le*+FhVYmXo#0{5Rx4FCQy-ZJ}V=ctE@uFm{%vR*$JQ5(!c(4G6|@-4HvA z?=nk(h1;z#Eud2WNGau94{Cj>uD15ro~>WPca>1Jw_LP9GQ?{U?M%S|`DX8H#H~d$ zU%Vw>i2-(%sSa`^j*iO3{S+;?CV(q~9LZ6x78vcQ*=wxRXdG^V9-zUTZ=A(r0@u;v zWVILs^u%vsJ%Q%JQChSB4YUZbImohLk!sI@HNb0W!T1NBC}(~h>sUF$uQFAZgaFk+m4ASf zqrDFsdlc;oQi1*2$R(o{c$KKN#jE-tgxCCnmhl>rY9al4+ikZhQ!9!HmauH=AX`gj z(5gok4g_Rra``PFO9xR-7PY5Y)=NGfCSbiTLrKQR57eE8D?CY;lT-He{pERRxFTD; zXnR;%6uLeOmoZo4g|c`}khvemW=d92CAA~-0!qsT0XvqL#Zly;AZMj+v*PREB5nQ9IAGu?2uZuGhz*R*-)q1>T*ig7u8MtZ*8|%#NmevGJ zuoRroU#l#`n|&NuPV=aX=VZ1txm63lP0LI0l}V)9G1F56x0Nx-iIc*YApFa zN|A?YSk`%d9#Y?GoTEjd0mAD8kw{W~K*J6VYqvz6I~FYSl5*OWp+yolFK3X~^OOhJ zf>rI7wP2%_ZD_z%KohR*dk-uJU`q-oJoZp&9-FYikH(!OeNUn7mJ3*wh7?1qDY-t$ zgGFE|Hh@^YZN=jcnHg9URwb|@Vv7d;9f+l-OUqblx?0o(JNFA>KYr9A)_U6Y zlV6%!kmpsL^u$rNw7{|FP>u;4%UV3(6O7t$2E zqzOVfHUf@)FcM2@Xbs1P_gx{XAm?gu?0=9d;J(W|Q%9;GTG^KKgLybrvE!Qqe*wo9 z7foDtZ?RPc5O1b@g#8w+1LAP3&m?F@G zC~(JIj@EM+R%|WcwQ%WUaeb>9TDuu>)Ye!xck7iyS%b71;w|&IEe_B>}8tECMH;=cH+%toskq%t0}oA z5nkiwvTDr5Swd&wg?+8>g4Y|Px5dGF zcE}a93B=d3@?3o`*CkN479?z5_60qAUI-hu_R!9_8CSHj9r5eB4Y?HTIrvB7*TRWU z-&v>?0XN6ym#FxaFE+LGxx|E}r898}jzhv)K`_pSv@KrM-E+b#4-J$L>zZ2M5wF^b zZ9QJ``m4h0r+)`tI}^cLydDl{SP(3?o-*u%yT=#c-L5ME!P1BeX{OwQyO&KOTdTw0 z@HQwUZ1uT^zoC@^B3L-F!O20!#$G*pTs%hG>+BkbcH0NU%SQJQVSg zG+gzBiv(<}%NXr`7`sk|USug-oFEl`)iQ_Zbzsk)DbLr})>i2Om+rX8)M^iUB~Pmz zt@doY-76cGUvkHDHx}ee%cUcA^s(agE6pO~Oju_gEAq8DxvB-U;=?%C)kLvL7Q(D) zDNF17Kr3ImVEx(xyIQn<_T-(TdR;h-=smWaLQ>empox`Tr}EeF`rQnTr} zsOS}P%S(woHyM(5;|q5b<$+um%0#xNyQE$~u4uSEQgXls3r9W#avf;pKz!8<#3Uic zgAJFTTg{+4@aU&8nTHgR_C^ZgD&}^Wru|8 zMqYmI)fo2uZ(UvOk=?L7+yw)oSVHV-{2n*AC5pYxD;tqteCM+_fMR{x+*dgqX|57z z!I87^v}h{Z`vB_e*2&Ay0L{*>udh2!2NUGdKh3&44r+Cz zu8X7F*}L{1`a>C5wqVjTw?f6{8OzSLUH%`V_#d#fWY!fl2}HyaW{)~7YcU&0Y7u5x zjuU3x!GQ{D6@Q))McCQPE(BiY*43>eW8KWe|>`CS-2K8M; zv#v5AwWp0Ohh@8)kh7!rjKl60(0R{J%E!iGyZ>gE?OA787Ht>Cvw@X^$P}<_dak2m z)lf*YtXS;6_9S3z`B}D+5&KA_*&sHAWu2s!^TB+_qqv*o)Ck!G1>-L2nQ{@gU09$r zH`*vpKr9Qy%5Kc|v3n2gT!`sxUh$nz-4N`%d_P4W%UWA2keY;jqq?pmVSpu7&LpeT zFYX?f0jy0H7MHe2vZ13c$O5GcC;{WLY^xEw_373iwhy1<6P6`f(z+msSiL19PC-tv z^D-n$O{h_PL6YTcAtHErdF9LQD#`=N&SjGA*#IwA83pLPAPm%v45}6+3`Xv{sAtdf zv;FmxFS#J+Y<_?4yo)+7|H^@1%UZ}%UW6_S3S?vSqKZ0xX-QV5T|sM08f*w2IjT<_ zn>V;;O3E`{U8gGO9NFYn3kL+*lMKo3&fS0bPaxUCf(cLGQmB+cz}s?2mQ3b2Ys;6E zuu}GLJZ61~Ep~J89ho?RnRThvLkevDeV8RLmM|N`zN`+xgtIJ$@zAnH8Ek)MQFgBj z2J7<@?3(ZrVqmddW<;b6{Frs^*ne;h4x0D%c6ENg$6^u#inKI;XT^%xpU*k<)XLulx#ef#`Sy;_u4)0oAR$i7@ zeETwCSxOm(37!@|7oRMZ4<=r0GwPxBwv;R|h;;*7gjmiK5MtG=i=0RLau~4}CY~LH zv+M+7S*>Lwj940Yi5=SlVmEHyp|tGIXBXwRj95FZrg()$Y*+~9ptFleVastY%Nm=V z{VfxW4b)Gk`vM!4J+Y{eSau$Q??f!y#E^Y7LjTjxvT;(@H$ZUK5RKpwc4A?W*B31Ndkhec?WKDeAFp2JI$WJJ z%i_$^=)->_md&qNc1w|~3__)>%6`~lNLyVh-J^bsc6<q6*rZ0yrc{LHOLr4$@Q0H;tfKM!`A7MhGg;kLBa70imaqbq0R@@MkD^Tw< zJ40Hv!`Yy1tHVE?SXR$cQ1hh$Qfm%P=y6?}K#G!7k^%6o$Tw74~xY!1_?f0T- zxcNp2E(#aGorTq*}n?_Di~HH);j@2IWuQ z>LXk53u|@VURpzhqs;2(7{4B@^#NwJiD1hT-DVCc!NnquK1+XlpHL4JN?U|&$c@6{ zYX(hNpj$DLwHmit*3JpXEgw+Xp>VtJg++yF7Yx)qWJP)RMAj+qG?L zfE!P@PA-N9ENZU6U$0BIep`r2P=3MeXKy53oBZb{09Vs3gdpi!>BT7BT|-aDQZJUi z6TR3)*#g{nm7ue-i43oJT}!UPBaGWvsIDE&4YwYcP^OZn3cTiJ=~j=TC7hO5P>=z- zy|=o){y6^**UD)P&9ZYrMtsGIgLkgnMwoFmIdbzf{ozYgGblI%0`qI=a)Ucpg5=#)aiFS zG)eS(RQ;H}c0<5z{0_hsH$?Jw_$Yb#m@c%;x8dW32@ABkZ8LA~T!>rOMMy-qA2Du^ zRFh$J@Fl|SK&_eF2d+b7v#39&tb(2NE=^lpFc!Dgy}B9eDDu|Nw|3=(fopsOM+WMM zOhMtCr^n}kZ22bt=xkrz9sJqDH)$#>&4QmhoKkXipxxS&HR0~uclhA*SuAho zK0CqD2{zVc36}>a34f2io=jldloa!+TLeVNN{Hv%KuX4rap5FqqUh1R{Y@ zyB)`X2(^b_UR-KW8y1}v)#UcxVsL_-6ly6N9bwc)k?rzd;56>nuy0GZA`;4$94@YtrZF_?YgQDD8P9DhZJy*86wX^#PE;FNjh>7aZ4c5tz;&yIY2$mc^u~$M2w8!a z+wpAW%OwNMxbe;`H=bz)v`_GwE$#f%g>}obA;MOT7}Tdy=L<|f#`>V3e@aT~Z)@u7 zj}p)Fu~>{4G|zT1Hp0HcN8T=rm1pD?OnY{sUmw_UpF2D8@hs-;#`{vq16jo+o~@4u zER9S8Jev@(dXQV%GGIfN7E1`QrXM38q4kLU=14Umw(3=j*n|-;|0Gvt48d-UA~Vfc zT&(dSR<0X~`NemR-K43$uu9@D&WsoJSF!BYf?R~Wo;Z(A8_^4SG_7C1W);~8D=7!X zmp4o|mi760DLt=HJS%p*{dTX>E7U4}p!WMhT?G1e>G%zW5g&^XWL@j4b(&Tu5}lYd z3BiJ*F@S9OQL?_mCb_3r!}j2@t&__}mlx+1FI`lk#ewO@_;MVZBMDg6vGfefQk0$c z6KbJp11uX4S~2Q>6=k!3NsFpzCE%jyw>cDtI%k2uVwQt-rF&?nK6Xjt82K;`loMmA^zusNu6&XUSv$-huH`wnYTL|fB z6Fp!my1t*Bd2-v7!tqbdD#!uD_IbTlLf;%oR1B;8FP!Ms_YSkZfdP79PNHwtulQPK zSo$zvRfg-6VAx19?WN-XmJb`XhGVtg#TOce+s}pV)KTErSx1OtgNL|ij@#98?15u@ zZZ9j(z;E`h`${1U^n_YBVD@Lo!8H;)u99^)R?nv?kx06rHHg()3g%i2KFari*ul^R z+BZmsZy<=(F75Qhh~1_TTleNYlX{)s4;1SpynF|cmH#LI9Og!+Qc3bs2hA5~yGAf; z8P=?V8MDhUtn0vE4cFTLtd59+qT3%T&Mm5_IKN_>+N;@5i;Ie4Nfr2Z7hxGRz6OdN zoNvC{ER+7$?U$lh9i;VTzeUJGsABy@FdMFLFeEa1(>!Grj|5v(rN zZs;;7iNtu4)gOx>TYX}Zm51Qvz>%9tlz}v9a!hf{hJ0(1708Nb@SPyr@YcPP(iCJv z4k4Ro%48o!7B?hGtF)}h0)i}k%ez6dKFI1Elw9dFG#lo=^O1efkrD+31w|-_`8gF8 z7gYRze3Xk`>)3|-8zN+hW@UX*?<;t*tmEk@x!H=3@GDeb?m+IW`G%Yg(zb?YHD-~g zO~!xxJWIZi>(cW!tX2tbhy1 z7>Dh{T%j~Qukf}a|71&lY1vC)Uta*{}_YJ*wY@ocI6*+EE3XGRu^dl zxdX5VsBJLUxnRz!@Lrshb%|DsK5&>NlpLZr3~(0;8O>D!-`I>ad+K%qNRSaKIw_bGDw3UWF4BNX^H(Ya+mES zy!@8}x%qYO9*G;FA{L4p$n ze%rCduqA2Ps_zN1F>=<7fPSvLL5c_1B3G;$VB zHC0oI74J)KR*0n?o3L>L&jnjG5CF&uG`#U7(E{tVia_Jcu{SIqd zhAjR5m}S8#K9-eOqMMZYULZ?y)@Er_6GHZjZF>P(ZYB&l)2V3K_%ndp4Envht~#*H|OO7CA-m{SVS zE-&nho7oM-L2s)VA(jw5AIlzT}^>UBG6>gx`(oDJ~oY1Dx!GvxS|3FR0ij3|BZ z_EP9s8}X7{qWluC^vx3Zm+11WGfL3TY;Dpp!?SJLwQt`cU>f*P%U==ntPRtCPpBoA zOSFNu4d`93Inz!AT71**ESZiTOx>@rZw$FFBwO2nA4=faZJaiU@EbgJc-*U@O+AYP zqFVS|Rvp-N6bh8IV!l~aJbhVNE=?2Gc+p;dpNpAx4IaJpMGms6=ccBljB-sO_xpu8 z>&%Ky%(O_70Jcvm*d`?>nkRs1`GG-w5832@q`8!4n|m;_W{Wbwv@ai~oQ$7oX)i2V zc^c*kcp`y+ja9#eI>;@^ob>c0pw^D|GEhH+TaXe)F$`5aR?jlA*dDAl>1Yd}^{wC9 z#ju2+y(n=6JfS+UPFDniwpF10c!OeEfcD)bGkcwXy@1x5v#!@=*N!wdxfZ;d2)0Mn zY}e3s4*(lr*+DI{tlsz2@0{t;W^vi0^9ph=!qE0vJn0Q-fQ1D<(1lq7saYE}&;jtQ z#?LNDNx90ftm(m2gRO-QHQ4%-SeEq-ZK4{j@1?(@w0Bfu+lpXwnDS2VntkpQdw4@MANgdjgpsj9us7AKR@*_e z6=tc3#+4qlEME5RJ*uezNu>3~Y&FC1zlcdBZfQxepXOqL6igPW-rE z?&X(-ng)8~&rIW`nWV0(0TlbRZ~O(_ppr3WVtXQnHAmQxf+`vghJ7oPVab_2U6L^f z{p>$-d=(fL+i@AorjjlwP|VBfoMmLgbvoh0ZOP#v{1TkXwSSzt34N8286QxhcEfh`cMcHEsbv2qKF zif>#tHGcuk65hj~DZQ8WxD>(qO|Dq1dB^3cDVOE3B%q2R%@>-<6MnUhWyhT)5iG&A zK53bPEA?LAhG5y?;*aGsxQg>GNKMVyQ}CVr$Q*sdDHxg{x8U$U5UxYuaOp^l53cmu*Ng=8DsVjnGZS$A_0oC0 z&hJa#?kHt&S+~I7dYMrIT{!S1`>7d~cI80Z<~CIfSa~ZU)_JgYE_u&Lzb0vXAZ@qH zhMe6^rG(JJ`wB0~!60D{mK035fb1>Huktv(EZ*WoSM}52*9>F1OW!4Zwf=4|*4GWp zck7sS^2=+_g9JL)paDyYfM473LsogRYJ-?oEHNxW zR{UmU?Yt%I^^>LolRn{kCj#gmqmC*|g#;acuRXS)rT*017P8gDBWYuej4HRY1r zV8FrM&(^VNAIIDJOAL*RqzzYA1@7J>7Yq9a~Y%}YZx1XPn+wO5U+@a?|z@#>&Z zUNvI_gtp>+ANJRa%a+`BX~DSCii*c^z1!btLAScGEzPULkH4Clnv!mKRd-tAXX$U% zjcuVR(ZNYREh~;P&1aL^I5_nO3bdO=7b{e?XpvLN0aEMK#lurm(|&nCIMtnV$<*Ks z?Pg(WP`&SNxLG+xi|!m=#xfw!$^b4EVSSe4kq4!XtXI?~9gO4D5TJ7C!`%$`aq9m+ zKuyf4pThv+k*4?Cr3-qUe;xiI+{0XUT~QAW^eY%n?F1W93P!cl$=ErGwr^|NcexYAIn z6MWW`I(m0iL){S$YboPZEP-g{8Op-qEjAi(<>r<@IeCz=1i1XG4}_D4s=+b=Gz<&$ z`8fVwg5ii}934II-I1!jjqekwdLoPJKQbh$wR|Ng_4BRjD+W^M_v&-)xFAwxyrl(e zOXZ)C3Y{0jD-q4@>)UPfu__+NmN|R8rqd3zO0y63mH*K6^VyW)sG z>?^~nYD$377flI;u2!jclX!VSE(edUIG_ZJ=1Zoj#vEz%~f{6tOqNGm2wuA z7uQtB=oAXq;2>7Dhi`n2oMzP%Vby=t$XEXVL0J97V)fte16Hqb9v`OdF7lp9s?xlj zx4^Y|CH0>MThd)=K9b|QP3>#j?E+St@uhkl@ydmnRwkIR>&}Y4Ryqf$as!zB6qnAw zV+kr?Ma677wL!6Mdf$@)$7v%azmK+R;??Fz;sxr|cunMb26k3D4 zs;00f;8hiMhE%;UHEr~+$oz*7oKLM})!>~Fn5w8NPd!%%F|Gs2?pYyIUZ(^G57_C*q zB!Jn4XREaf9!BgG1+6v!s(V=gXcJ(7q1Cu?kBKjFSLF`YsaBRwYO|~&kGiVAdC}hJ zs&ErVvV`cWM6AkpsuQqYY(&+sgjW5AWS|8Jh*g(X)x?KrRll(7Vl@W;SRw<8S%Y%{ zefC(ji*b!JCGbizh*|eFG#o$R-{c~&I(^ligH^SE^~&3g%dL1~LfKFPD+gd{E#8)SE#bniG zhP)kYwJln5TOl=9Pe^m+1PPU3<-zM7+~ky9ZwS`?qd~2C?pK?UPCOJGtS90jm3^S@ zN~raj$aAa%lH1T)uoeP1gC~u%YOgrdtK1FuW2r3?=OkcB{>7e*W1-C9PFC8G372Shzq>XPQCf>0Mr`CT4v{F(4h7~>B zq2nziS+Bk<93jPS71>93MHF)+8s`90Rk57-U} zEEmLL_4_otBDdszxdZx<(c@QnI(6=j1VrWOCab}~mEN~VZre_ESxm0#4xqnxWb2rZ zF*%FS&c;(o;iai*!?t1<=IB1U!9=%T9CAI|ZL(^9TV7r^E`P$KH4Hl&TuBwF9F`8eDo4OZ1e84D5eW~m_zl;SJGUWM zpt)mn2cp+wZJS_UY4zGq=vB=GjM1Zxk|uh-1UDY9EStZ$FdKc=-ADXRtMpl*S9Bzs z@DPimUXQ$&mYOnZA(G1 z$cCyn1HiD3kENyqied3X3}@KV!YfkK25dRhP=Cx^*D?(2Z?@_-c;&I&c4bf8TwYo- zh%+s2%^*eYh6aPpmfC?Kz`6vx=bwaNUA%HYAfb5u?CaeMuYb6I!DW4}94C(ryL!Mx zuw-ptTdv$}@v(9x2n4X?4a81r0$gjsueEI(9e%yu@@v>^GAIY=Jx^*qi?1pzzi)cp zSVRVYCZ6lDgIL(7B`2Vj<*N+RiC_7*2l+aZ`8C})Os7Do%daOap4jJs2M`BWH`3y3 zwq%>Y=VNK7a)6s!;!jmN8ua?y?uN!14nXR6>9vn_4v(_9**aWZ{Y%yZ(;kE#C?2FE zE#eKhA1P?MQfDCp57@|Y^!m>V*Qu?5>mTo5a3$a>PnS@lC7=hyb>$GH9%k{_6|97R z6taQ5uF23z5x7|%2)3bP6C<`Bh!uiW%LLc*=!c}9+eh=AqT)rRWwY-u z$}T{r1tMh(wQX=Hwy(c% zc9Xlgc>EH^kCA%nO1U#uZ(mw=%)sOfIv*v5)MiYp9`f z3i5fJS%EsF#S0S0>()aOjB8)^_@r_SVFxN#nSX@r5pc>?{MS%fE^q7V1eQqHx};tI zbdZ(n1Bv~tO<(U;kp1%yZ@&r>HaAWan5K(ITS1a_L;;Pvq zR@+*>0(zPAu9*zj_05~R5lg%Kmi+9Jii+oJWfn{4(pVR`EQ{=*!?M*oho_}pTEN0U zjV>{b)iPFCR+&I88|*aAB9?7P(x@d}U{Nbq3r9LK*7-HcI2PxY_&}IGjiR>pOZugz zU9xU(V}mn}C7zYOtDACR@zmOp>Y8^kjUAgibx8$uY|&tm=4NPMeu!$LC#3HR<=KBU zXzl8Yn6UcwX%;tr(?zS&N%)58jq z#!K@o9Cj^bhwXm@Jex&4D^X@W6KeVEaNDAW}A3*-e~S?5N{+xbF@qgY3d3vnwc- z)tARy;mUw-Eh!s^r(B|B-O8a^cIQ8sW%Z4h2#y-drq&5q)&cBaA6N*$(knvBDxeb+ zV#RWt;yOtX$a;m+vgE~rW_^f_F<_&en*rEHh=cm}2NlQmHyj)A*mXMFHYs%U#<{59 z8Gyav(ea#j`J)%TEnXNXCF|$ds_g^PQm-fsjD;-6(r0lwHZ;dfPna`ciDC(`S{Q`Q zxpXwkI$J!I#m_L5UA`3Vfak#o}omYNR_PFv#CytzAAUape;e-p6Bn3DeXpa!hW4ygH}K+_PbWnDK`&AJ4!EM^tQ#<~i}HgzVB zZG1A+iAOmL^$8%x3O;J}oVE zlue1mHP=oJ)!{qG-Ex|15d|8tBnnR0dZBR0ZaT7rIv=4{(0JNhntxte+O)5aHX;|n zvxC(r7?gPtz@96gh%+xWweLU@jLDmR?+v753;SbTD|;+Sf(*(L=$fI|3rP~Fj}vUY zXpv46?2dm@g1s@k^ZF2n*0*5p$9P@-(82*ASa}-2^j^%cB4l|stKC@HCt$;`yVtFg z16U7ujlz*_0>#D@UJomZ?U#sRIjF7Fp6eBG^cCOjowQtW^P?r%xzGgL<28ZUTl@y5 zPsSeo>e{qa=n3}P&E#E$2{LaX=B`6nx2-{>pyoj21W;35S**m3CJwpzp%VKAA(@k4dwLf>u)uV>~9;Z zAiQFjJJV|aOwQG8|EI#MBwy*SW&#E4!|RHN77m1hC1u2lfZZ)3SjQ}&`+uCGns>DpwI4oAsLjU9 zyyVI9ffwq$49#M!Nr@nCy__j6DOn$ElTKsUMh$G6APgGXA5lbmy%4RQ4*8lCIeBAr z0c8w14NGnHJ%rlwTNmVyNvsQSd_Y`TckFd=!zF2{{YunHO8-}EW<)16gyfo?D1&&^ z4lz?NoiUWp#pxbdP}dTjUJvqfZP{oqt?S!c8ym&r($9Vq*OD#U-5JxeHYgdJH~k)H z1Nub$c$J$xE|W0?u_XE-a;!j~l$6+H6tRMB|1@0ttx+3Y^~k~@#I+<20%VI{vF*RK zI$*M;Fq>(>gl*fwG{6ANgFqmY0FBkNlP32*`CG*O!H)e;=`4iY@?Ok zMIvAX4T*4Y5le*oAQ5;!W{{S&^nu)If|UqvV8TiS>M6CP{bz!$^$boZ5o!@Gh^~I* zj$wT+9}ACK*p?CoWE%v!u%JkY!)@&JWZ;%$LKAS?%(!jpNVq+!__nX&TfM6X4H&Rz zL%sJdyfi%if$;&AAfZE=DL^G?zD3Nyreyc8JU=aU5cpOPjZ8^320WM45HC}|IKoPh ztS-_BFGgN=G(xQXP)2Q{AEV=RsXVv(E$V}+<3P5LeO1+1BMD05bUDreNd!vB)+1xk znVf@(|ChS&4zIF4-%mgh5vn4nIFoY%BqXdbLm-Pl7KD{`GD!kqhZ(>-z^M@BKdS{oMEc zJP$M5@q^*Zh*B5p%{pTcL=i+^X{8AG@n{JDxD^%KGezwI2w-9edc!a3lDi{n&1%~+ zNdWNx_O08>?b)Q!0&M*TY%$W+1hD0DD_|=>rx-UdHCi*Kha?bb0xmUPilYcco_PyR z`2f=fusI&m2B6VmKL+KNEz!tCTAWJ~|7V|Nr zd7%VIEWywa$iPM1f~#%PgzzpG`8xx>^$~7SM?g!Aar><(w`>~qq0E79%4BF(YMLB5 z5Ht|B{N04G1(t9}KFp6umY^mQ&|1*tR&IlXuL$Dy%eR2dq!t+E7Jio$HsSjrHx-di zWX&AN@&qXvsUyg8%OONLKLZz|)j)z?5^HP7u+fCYK7#oGW5=I_ve&{7zG-R@vX_j^ zVzu?vUm-aH&Ws+p1vo<1grze|nA(mT1dmEMVaO5GTj;c-)V%im>;8UTpR4 zE?I0tpcYmE<5f(J+Rb;?rFZY01<^LFwxrZLk_70<404OhwXCoWbO{64B27TtdWj|= zZjmN5wfk1o+ksq~u-?*0zfCG)F#$)vXjVKS(G=@J2M4^fHzqBOSim!-j z%B0c99})af<8eBuFb%#2@9fh}85dkB*j`EDF60Rq3El&1H*<0d?f{;^^x@>WJ_db~vgfjXvlPPdy#;$_duzL;) zVaOHy3cEg_xM6@@KTzCbmYUl;*r->DemUW9d{*6bNV2F{P=)&&#GHbhS|qCA$Cbcv z^iu>(khw$64L|UlKO%WFG~kNjikd5<-@LOWS zgUqUg84j7$6b!a-HmM4t?s}>2hCzGAe8Dg3F3yJ!FeqUVUr@G#@<5s9-b5eQB2VS* zc{yV|o@t+vs(^d}Zw*ouf%t+5^x-7+30@Hs2ziWMEV1-wXgmmw56C;dkcCBAU_3na!3oFy%vXP< z$r!$S0Fnq<;}*`AL^pRJ7%5T=W5z&YSTJLtT_}?ONXCHeS!)F^4BOf#7J|UL^X|o2 zz!>rny@E54jH{_G+GViPKdVBQFf|L~1ULogd%BwpygfCNG2lxgq30&;& z5&-aq3EH5+>m$m03@9&_-gw#71lK5GL*OjG1$y#vCm|y#)&DI zT{TMYmz#S>L?jeAmtJOwN*NQ=t9DD@5xeZ3VK_X{o?11TZL`R^!aHNN4_`=bKSkj! zC>jTa_tss9o8{&P{El!!0citZSJQ^Z)iBMFnNxC0sjwl&jU9m4#dJ7&XJP>Ew6sAN z-c#Wpv>NF0(If`1Z`v&9%3BY;+IB@7KDcK|R*ybe@MJCE1>%657hY&|ew}0nQF}=r z0~hVwZkLF>!bLsIB7U2xWkZ{k@ay=fp}EodR6c|zl>3{wyD2KJylFxfNDYe) z5p|#owjy`SQUeB3#Pt@DV+;ho+q(!Qvf$!tZO&~i8+~dObqK&f4u=>U!ygKJSTF}{ z*g|=~4hyf+N~KvoW#4Fcskx zn!_I3kz1Ui;?i4-a|5aq>0L{8bxU7P8qF?F~a zsRLx9Ai4m0!=dY8+g$d<8>$h%)P#jKh%-?A88zFjhPs!ryu^BM<@F$QIm_P_;&0k-_y_=D7JVh%#0)d0OJzxXm zsRE2Uv0;ZM6y zHl0AJ7gx`S2)U0^3ggQQn@x%6d^m{ zkCFAaHR9I?$yP&XoHv4zrYC z6TwU&bP4VQ)rtosEo4zJh+yx(2PLgg^R2mdLKe(H+D!Y_hIL*w6JebVSLpQ38x@HLKZp;l2g6}={4@vQo#6%TtkSW4BMzZ3eBgnl6MFW^ z1PmJ>hC~kQXAU5yB$)!S-xY{xi!>r|d3&nD%p+tO#)O0B5x5Ji8J5?E(R4a;;eN6d zQ!i)d67B)7tf67nybb8TWAH9Fyqtz3BZon`Jr$iC<;mFp z7R~8|$cV_>wjFG4;FIYp1<6z*f~mxIII0aP$m72P*DW)5{&Z~RP!oi=axWrnDG4OyZL3jWdQS5C8`xR(Km_jktV_Wdm zqM8mdB7_%$Y)bU8xa9isv6--8;dQ^SBP|Nu{{a^;e|@ne6cCOyoeb#cKDZ6)@i?LV zQ~oum2Lkal=)vpN+F{CXMM{h~HW>xs*rIS-Sd!SUErxt#M<;xYB2Q{WWb}XbKn9(M z($xNCjbm(4S>678E?96`lWwh0lz41*f270)KSDJv)LZGmC|U=My|og=-Wkm;g7_05 zHGT0b0&(#VK{4LDktjY3-gQKA_@x5ISd2MtreVyB8JpX|RvUsb-~oD|-XT~86)x(5 z;QNbHh@2MaDIa-p$;^f0vS91NFHcEYjCXR8N|Gq-ug^2QWaVjmvZiN5L`tEk#)gUt z5iLq_hi>fnxx>q6L?9lvpqO=u9Loo$D_z1<6YSX6@k$$^b5j@zd}QEB`Ee1E6`Kz< zpVDy-N=Y)Mh!7SHPF6NFt%FB4I;Z&NG6`ZxKn$V?1b$jt{4tn-KtID?i+8nxTI`?e zJ3|m}13#Uus;_>%G#@H)af>LnrX@L>4vYfY27%(MuV@2`njb*i=2G}?!HXq|nNslj z5H7~eu#JJQS3Qr8ads)>w<$rBB|NNkCTFAShbD}dS|ULH^CuE+Zh=D5Yx zqQ^tSJgcA7i3K^9@1+X{F@YST=wjR1BxMTB;O}fj^%#-d3=LjrX1r|==9^GIJ@nu; zMLqjulzeX}1L=|#*>zb*+J@J*D-a7`x3i%n3$a*NWJ!;iS9sx?PLrz0fevx1dYNj4 zjQOzKrmd~cDpXKhGOs#kbe_laXJE&aP!ntP-}Bdd0LYXHCd1=H3V!3gHON*T*qRy{ zF{n^#tR%52ch*#>ur0C*#>6YySsJ6p@JFB|YkJJYBJA935v~+Aq-mjR#h8B;w0UCI z4ZbpYJt8BQZvMRa)Um^#i{OXBED*`GMjyB5Hhwazs3e%tzj?>TU zaG~JHT$a!3%CQMKlYwAndckGc3x{}pqAd5Z(hD5RP`eN4vCAEaf+WY#0VVtx7nf8o z8J7X(-7=Vtr%n5)w@Q*sWqG1-yI6Yzi5b9rWasUm3rtXDne7kM-sqFu7pKO0_E1ee z*D+WVEXIkz+u&YL@(T@S_+P}23hMx1HVFpoVCB%7=|01^#@_1{XGBE0U)$c$OzJTT zi9nXneP)^*Np|`+IF5`_koVwYIx4&521S!$p+n|CF&<@gpKVH_P~Joi1SAUd`B zw5qZkfU@kHUXu~uTW>7i5Bv2snD=As6w30^hp#P-?we6&M>EHNaC0dIC}_7HdeDY~ zjA({A&K_4HN;@q5^t|&rW7_@l%X~_=kilUdLq;s~u4q4;j`E&;ith9FH=>FvNC8s~ zS6*%Et+2*J`_M5o7{^d9zcoKA%j22B+jNduCpC~^2>Fe}!_vw7Xl2jHh*UA&fKOjN ze6!(me)!;nNGMB&!BE!n+gbFR0_SB4C|fe`lpMB*$TT@GNt35&KtyEjx{sQr5v{iF zHd6@5CFD1D@)}_;c`}Eq!0{ z_{d1t-J8E6j$yje8p~RO`|chHv}KH6S_Q72lwz_n2XL4e_m*I+U$SNDVl7!>=KiLV z+!(&Sm6YWG*dfT48)i%ih2)LfKv3tReEiYtuqanBlv%+5V~f1y^i~{0 zg%L!ATnF4Zj6hj1H;m9>J_y~t(%Cb{j-Ch$d*LHvBg}1At;E7SK}uH`Bo~FbVfQnU zkr6qfFjMP?L(4i7MjS)w$%j6-cGcxmUDVL2O?S>dYWA^N}8+4gW5lNRF z83s0ftqaP5nWtuiEXoFyPd;{CWeh+Wv0Pdr)HqIAkTn92*f98#kWFfe(YH@*1VVK2 zmkmGr^4d-pTmoD0pe(bhd@gr?Oqj*a29(-x#^%F8-`2MDEL(%04)b+!vX0*g)*ka#?#K?$YKs9MDg7r8{^GBj`D2~w< zT`?K9&{)P3t^G zg(I_yuPYP1ACw^IWc%jmSbW$n?P%bX-KF>vx+D zH8-djD&JLMlHq2;EJp2`UIfCNo?ST`(JZoW@N445XT~JVwpP|M+pO*C{~DSvrso2- zyJ+3^-?K1(z=*Pi{ssQ|zIo`8Fv~zVSGEA>eS&2)K7Kuv=FCdKbGb>HF+zl-Sq|Po zZ=})}D#O{=<-g$U^Kba-(0AXRdqdR)7hVbzAQ4ylrE%R^7iZk2Y9kup@KJHrfQ~bW zMhIn2g~mpW20&xC#0_BC((;^9aE9&eVA3pz#&}Y)*ytrK5?FKduD`n@BQi_~1l2RA zmWheRSsf72EXy)$el+Z{Al3};E_Q%8#AKsSV%Z-qkLMVX=m3#wfG}5_9O)XcYI}1~ z6ix$LM&V92p7>=^(b&&MTV@;T>?~Mzp&gj<| zzXe~-#_+BG9kOwHG>6wh7szn#9il$JzY*aK91@lieF6*o-GfN0#UnDJ~B!CrFAAdSInW1Q*& zwE=i|>%FeX$nj=56O%zwY389er2&|1<6Nuzi`4mdgl5S${BUFl3_$o%rlNuCVPqad zkqtIANzsu0U&&Y?8&7RK3}oZ*=e%oPlMP?JTQO(I#x-q%mBGNAZ-6$Cs1t3=>8sn!A7yzys5Y zZNQRKR+}Z+z~anAGZvmbe3ogUm6dE5c`~UscP9w|$Od(SWj7aQjDmsbk1V+ia)1Td z7$;jn(+AwWGBz?I4Fi%CTekRs8UkiYPC}p~p8BvUbP~>{Lf2N~`3$)ReQ=73i<2T< z3H6d|?9{RbbB!qaIh%2j=h5ShO|L>U1ITkNXsp!N;wo(Tnj)ZW8jU8;I=X7+iFg+z_e?&Geb+Mjw-I@Uu50t)4-(tUFl1 zIxbgMSCTmr*z>z8pdmH@`0E3!+E723tNKA8N3_8r5cp(6r7N;;A?kGU3oZF3YR;%Z zQczN<0a&30-8fqhk}wFGRDm`T9q15#UdIfF*#gS4qJJU>p=imcK{sL}UGvvUZG$Jm z!3y-RY9jvx5l!rweC?ADLqcP8?!0Ph2SKS}M5p&pOJ!%%p}Xa|E(f8G`9`Zjbeq~a zL^%B52F8SjG?=0S(kpJ52{qb3B}|m*K|y`t1k2{Ok$iG%s2fDMOMdqSTrfX&?D)y2 zyVliozUXpJ&{;5zqt)l5#ci$9aP1gLhacoRO*(oB(&3QD4+=FPq>YAfT20Ox?F!)|BWCWWC~GKqnYMPqR8DAb0tkU+?SOx z2^qA7LB%1Yp&=B94Q($d$LGNRQgR*c{e;uEKss6(qMM*dduI%UD&5D)-i9izA^pc2 z5z;kNr-(u=nRIVv(yT-aB28X5VLHLpwQHBlo`%7r6UV+i-q7&uWs7S%cez5OLJdsg z1rGnk0T@>ebZ!p<5r!SC!~==6Bp!hd(N@{c7%QScC^t|PYwiup)J0cVH(3F$;Br5RE-n{o0)q`;-Tym{1Jd@ zQaLpHYz%)a3^A>Vv<1`ZO|>O9>>`IjJVv~`6-K{c*EU{5mh*lrK}T7L^v)?oMd_JE zHwjG3Z_dbmvMbanZBv4lEJ|P+e~RQCn_CO-;40lTt8r$WGoas-fNntA@%)XmV*6#( z)J)Z7I^M#j_1FnmE12FGIWi?N^5U*tulghGGd%I_x5rPOYJ4_k@wCoeu9P`v8={#@ z%OdUXWZ@nDv%jOxu(y?WoQ_EMzztKPF$9&P{FZ`@(H_s7Psmb%;lGa*^*jshLC^)p zimFCOgK&E&;CcVLnXbs*1(v#|%3903BVds^@KfES@NDHBZQvz^t6iwt1^udE-XT@! zlEOIP9rYhVZUe?mU=xiI#S!V^j=j^a^o|Dj;ffCsm_`)`3jg5z+X8#)F@> zVrG1x1){k%EGaEpQkpdq!W-`qlV)*%R>o@DF&3#OOdRo51Vpqy@a^VjfKrULv{OOd zl%^f#P5~>TahaAC(P7}?w-;||M+|QOqS+?Y-&vv+Bds#mUm{{tkVJ- zzPm3Hpr=ps)wEZLX5MkBbimb`0azxRnK^32)&5I<7XA8%2M&LG@X%2hfoN)at_R}z zDqv{_pgCVhXTNysJa{YI8lu+0N{9dKV`>>nj3Cj1ZaSoPV3!1^c6z`uQ0@y^=$KiZ zlMeBX=Sk?G`|mP}BuO-)nXV<6`?Yqxm*9#_0-s+uhG$4P0_O!OcMRudTFD9DZ3E7o zR2E4&`5>$|SnGMTS0pe^F8P=yBIfrUZxT2-4H~ zGKt145_Gvd4yd|ZJBc<4M=OA{7hFPrZ2)Gee6vphiT2OxZNu|6j)=bZ{s!dGVz%g| zn`-0wXU>?8i1tqjR0pd1OT~jS&~joMX*A$DBk3wIOZvRKci-2CzxeX-weMXlJ>oX$S-!6`8nI%)HD_OL`pm8@<51DlrHeuD0 z+|dx?pgoOqhB2m+dq`h;j8a%VbGt0 zuQFC_a>W=0Ihu$kfN=>#xjY*9=<$!+NuEUoqc>(%$b1sm75mC#b@~8u1y$F zjxd8pqs7uw6llRX0MA*;S9ZJf()cy|_kH>GJ{Y$3pn}b6O~;#aa<`1C8Qyv@(DJJ0{S-7kIW3=(gD9 z2F_2DbVHCR3_in4>P$Bvnlc{f#_}~^H#g|d4T&5~H+s3iR<=u`T17cUr!3)BL#pqi4=E5#8U=q-BN9 z1EChg&75Scx5GAndf@ZVchhD}pl)98iavyA=r;(^QP6WBfj0SuQJ+cTAk_}mAOfDh zRfHp&N}1fqWzuJztz@PNcs8kKS;ck5nInrllQ*-oqPM|FJp1Z%WI@CADMH}bzH-Fr z_=YnAY;b1wY{D7Y^SO#WBb*&HJF%eDiEfmpfwA)ThGy8JA%_xpAEJh{j6Os9^-V}6 zrDc@QHUtiKiF(oGHZMfPcF^7mNEw>hv()Sw!&@DiTc8@dK9(C=U%nC0JZi?QSqjes z6op2Q1v8|OMx^B$6DEvJ0juP)v|XQl_T_=CKv=*dY-nr-G+(x4de@61#D*g&L{r=j z+rduO^6c;AKhFSj(^>wu%?i+g4n0`1@S8d6E=yjxi}xxArE zesyGMR5k^klA?H*YudkddSxt0?9=eCY9wO?3N&u`6bb0&XCRi8o-?D$B5>fCO&_!h z`5J>H(2;U24BJFnh1LYRDSSg~s?XlpC!jtLv$c)dA1O1?UwnOF!-g$9t_IO~?}`CSr+2+1f+wydgN6c4$MeL} zIpM1qgaaEwtj{pZ-PTJKIyMA_hD?L}I+Lv?5pDE@pxIT;&Pj){!6!kvXlgkA%@=ez znTEL~g$6`3<=`MRDI7;OtbngcZYatDbAy6%m_x8w*4ooT3Tt7Lh?W{OQ|NZ==p&?q zi4;=~)#&nP2UpGk<(LQ`x(8Rmat(V9x`~XH9wb3-6C0$D-&f?x96kQp$pX^CD;$-U z+D8~GN`W*R0*eT3Qs`C)>E78bK>BmBM*Gzp=L4i?&6#ZhbzcOv^uo~zCrnRB#=QQd z{a=20@W6&O>#3^*;)0MKija=PDMBP2*cBS2Luwp&y@BGRz&TV)$e3;>Ob6NtOo!yr zYSa!ZT2Gw0(q>_4S;h6^N5TByFEF8GZ43S6fBWjQZT>gU+?S!QEZh5`4b6$TM_HUk;Bn$Kr}7%$1xR4K8Zad%0inBt`zNBO_2tjV~%(B z$yt3vAbRbFExTY3ACu_UZd%YkK7Cegtqs!`X-s268mY&mWdD^HUorXfuf96;>4ud- zh`#tz7oO#nJeqP!s!GGU0_lEZM->v$IC|C7nMvz!w2Tf%tLae^Isnl(6^u@Y-7))} zI>RvfRA)n(mI-3H1ZnT;`7T!{fJ+QB7eM{zH0rlT*S}-s^eKsh5 zxRBiB9|02ax(oJE?8zH(6^y&qe)aX&hYxJ3hqa7mnZ9u8bO1GqouqbPokq2zD>a8f z)C0-%*_^YM(dDyDNaH6bHMuwL^=h#@REZAe z(yZIGGDtVh3e4`+0;c!MLjC$p3kCzGNyeTN08k^P_Sc-R>NK>7B?ZH;_Fr|$4F|tI z_|1XM@2#p|%VIW_dhd!W0MFfA`u+pTcStek4>Vv*;r|^u^u_EK&{CtsTY+BaT>L9fvxpz=+cp7tswYye?XaAfg%tg0^=beCO zRc%B!4@hvXXXU&{3V>(FF9SPHDw3HPLjqqQ6>Ai;z9{T2!&9IMVH6mJSCf*eT zmrlQ=TNFHg+Ud*!9uN`2<7< z%hAmO(bnGZ96_YD9333=CnC);QW58Xh)R;nmGkC0(C=VK5`zAq-AMfor&fBZ))3QH z4Ua-=ICAXbN{MLv+F*TR41G|mpp^3IM8 zU7HM^FdL0!+E?FG{1`e)+5F9I&>f~vyiw{M z6Gb)}0$0&GNNRmSO^byX6n=0dk#04Z#!=a0fagKZEPDNxoqInM75X1HFG!3ZIfrI! z1By!rfObSrgA^V}9+d_C!7J(U0^<4OP4DAz6qW!5Y4NSN5(@NXQK$ zH-a520$a}a?}~{4r7fSd}?S|RF@(@m{`1<--c zDHy!6yrlB#iCFuUNj@mkj`41n`^k4d6Vi?PF;bI`#@AErcy9i1uBRwDz3>`FG^ILN z??_3CBNN<7yD>%==;btdbgMwLZ*HL02UYs`?ASRuEkPPLlR!S{ZGiNEk+nX+v>y^7 zf!co1AA;qAyn`TJ*c-qZ`^Le8hY#-sK(EGgKO|}^L<8lx6cBCPu!O$Q!a0~l3kN&| zqFEV;X_-hHE=y8Oa*)`uuy|BTfoJmjoFj!KvDjqCu?_|_^->nvvHjnrF4y2<(4>uM z4<~zwcA(Q{$^*QTvjd7Y$erM0Z4zlKp!pruy+JC3?hHf&m6B0^so$CJXxS*2YslYM zHwA_6m`Ed_aVsP4ONEEIy26u}JgQ`l7Vt3DL2G6J&@DEG`lm=hV}9`c)<8QXpij&W z%!xY_M89*(!r_4EMGL(&pBMm4_feRxshN@=4cHvG>JR|>Lr6Hi2g9d!L?AKND&8TB4zz8CBanQEOh8&NX`Q(g@~!L*(Fu>iPjrSQ*)gqRbSliR zuyH6ibkK~UuF)3OK{m_&m3O&Z(fJ`*2Q~-L8Ca4^$Ud!*=3ocn03mJf4aGePh>;?s zaqWnWNo)B|_Xa>ZK)!QVy|uBq37Pa>2;Qw1yBQUvWp9Wr`rkaB@hKUTrvju^%$v0i ztkEHa8*A`Rn=Gvg(q5?14G8JlGr{z~Z(W!In6C3L3L{wip+^kVhR*@fBQT@w^r@4g z{O+rUZ-gR!=mWwu>?vKn24)2mllHAZP+tz9HtMuoY);OhNu}90G&~jtb(6SkidC&A zO-&mME#z0)-X022i@ZNTpsb>5W_B8!8eTyP9$gxi9Tih)UwsC5R6--5`IYb9dnMWx znH>a#mT?d`p9MTD(_$oxeHI3_ZVx+}O!`6uwF8sJDMOCPl7u6sS4#7Hx!iZX{h?P) zwe$E25)W(-qb==W)3ZgMoV4uOV20Cg!TA*-MveebpQb$w_E}m{o%YuHusxg;sO=RR z)jN1A8a&f?Z(Rhap5r4}sE%dk}8F2I1nqNX-=k^dqyr%HAt%Z9u1E!m2`%i=EkLctEV0z`x0n=%-n+Vf>!gLtstY`O_ zHV(w)sKQSU9s1_$T>xmH()BA5(U_Bw?xSx-KP=Ndz-1F>i8)ousx(R-AmP~%txOi) z5XXpSIvs7$X&Pd&i38Xl@@jhkG`ZnQ@+zyCd}CfZ^oKVeG~MvEYe31B)B^zxf(LBV z5^JQu4&U|861S^wk)|H3eAzStHD$;e!THc2DmIN2lrz#Mpt(I1fEJ6CQVdm^LMs+B zt$q;gQ7S1*b-6QNUF9{&G@0SdJYqz5D2&4|uJd?O)AMdLL_8c}q4-s-1hl;~2-O|7 zGC-f0<8PrrZ{DH6yy~_^BjZzNH`E1ycQBaGnp;~tJ;&EQa{3ns4;}e(2Mo3$kXNk) z-7fEe*HER{fyoY7*CG5BMl$}**k0+R?LtO!pzSF|I7}qVD6x%kf*XNNR4-cE zC~_UFbWC1cn4VPVnY~-O;HJ{yCx>OU2zD6rD_^c$4uZmXgK*%AdyHVpz*;bg?tGq! zWZt601?|bOrwpM(YB%R_pzs0|I!qERrdJe+27w(XCON58T0GF@p7Z)f(AH%~U?I^6 zWy3JsHr-R0oL*FiP{#2>xz+&3Wn(eeA%%{h?~LuGlyY>dsm)Eb4Rd@gLm3u3kj}B1 zpgijY)a7mq7c7`Rf8M;g(=&R2;dkBFpw)e`oq$Y2LH+r5Bm;FOB&(u~Atly0*eMhZ zp++*&G@_g#ksRc#1owlzX!KtzTqr`%DjAhD$y2eCB@P&sRT76}8KY&8ly+LssH|_z z>yVllRVJJj8uqYyg`B!G>^0cXVWx={b;eSLP`3AjIJbhsIKZ1wv$K6?fH+yGvs}ydNd!Pq%@9i(^b( zV4+rUMMfN7(G!+F*qT802Vp!`;#e5oENobC+yLBCi_cN;)LUo)={z-5WZDGIx`xap zO_`jLGS1_9nLTfo0%X_3Y#DIO@lj@&q-$*cN0r+(1oMQr+K%@PsgZA9VG!hbOB|bQ znOi`{v2Fo7Sz5qQ+B36dTyLhnF|d;%$K~q%*MA*_3-Eokml%KE%l5| z8C_Y8IOg3+?BC7cjJaddV4ocXjeV`K!jCEHo=UzJL;zQfy|07H3qNMJ3k#o&~|3I|sUq(C&#{ zYnJpFO?y;jl3nfzudK58^-xHB!VQcuv!XEbR^rJ@&8e*-t(i9G0)UAgjTqj;QNyrg zMGZHQ*-@(j@Zs9nxnl;mScFgF-m7(Y)Mdmc&p1+d(V_)Y1^}_`_bRAw-|X8Ajoo{z zef3?b022{2yE~}Bj9!CEC{k=~?+j_#R)OK!Q|buOD0QLb-k$OMnsA{hb)`;mPP7bPbgxbLT3R|w3KUwpUc;3*p%X?ovTEovD?Kp%P&XzWWesefBwf2?&M(Qkz&9a!faOKaboX>^F4(l(h3$S2s4{UeQo$Kgs_t+5!%^n zMG!tx>pu;IaYYW);LUf|<-{k|d|MYjuh19MangsN3?JOH@qI+F7c|z>B3N?>!GI&+ zsaq9dHCkd&h_JRNj0YZQ?>=1Xl639cN7 zu}TqIS25=Qgdr(gxK>kwk3b2Io!4Rw7B`xlLcU$;8J9G& zbc!Jh=ZLt_@L}CUWh;~h5!Ax93IKcO9)bU2ErFBSQz}(Lcw>K$%12Iu!%Edw9~-%xGKO1U*{gqszAi@IXx|+p%`2> ze@tqor}SCMQQ($2Tx3PkiR|GJzUZF#Ai_)b#IbDM#4Gy$F4_J{fG%o5AxOlis)tj#+X7+#vqYw(-hX)W zpf)rlAz~I0D_%&UM0i(B_GF~w%y&?NVMIW}m>7}#pj=A#v`llR6~g#isKNx}{tkA= z>NTPa6O4BgjH^%9wOKfIpg*Q#-{%p=2hhpDI_%XbW+%vOSgc=@vlOTXUzeAb3~7n4#iDV&4+Bw*-`|nJdfL9X ze(QF{Q%vk*l?BauA+{x0-nQAb?xR>bW@Vtdp4K6K9 zce%$r|IcPi`o{+!MFYiJk2v{osV9x}vQERvGt>l~pe_LP;?=Y8p`itag zn0Y*(fnr0FICO`{Ga_x$wbImJRTwjDD6jN&mL%YfH1uu$C1;)0wrv}5Wk?#ay`KKn~%4w7rI(A)G}urCoY|S z`Bl0aTgA?Kc#j36Aiq4!Zz(f?u!t?V{So8FAyKjGGE7&xa#bN$c4fH|+qrj4a zQE80K?_KOEOiV3UpuG*&hDlgUh_<3wuG%t%HKj|iG+f_0cyZX=6SZCf@sLo(n6s#u z_St(Mf_QQxC~E}(;)%PzKJ?AukD#?@aTq}iI6z`-E5;1sMDFcG08>PL?8LYw5c`N2 z<74lx+aZxCHq{CF0UjC$AU5PR7KkgSl#NWv^;G@CNnT@0k;W}O?*`*7h#Ov8;C2lH zF+glxmeKNHVvI^5e1?ApPPx_M(A}Lxu@ol|#b$R0C|2E_)!|^Vh15cRCnxrFcYpG= zPq4eg1^>EHl_*{V%{gt?!h;o?=6EJ0rWDPnnrwR?X`yEn^ez4S!mcpe3#r5j;zl}7 z+#KEtP}~dwiNM?jLUHW;vB5B2jbUIJsfM*!-hKBk0T@>_vA))6>i(|}9Xa&D=8eRR zef7<&_={|Zv3JD?s>R<2#wrz$EDYwBs1`Gf(W*ljpMgq2FxDa)Rj-Q5>M0q?*`CUm zQKjIeJz8YrUyw#38w|2xWDVVQf8e7xe&u$@7HE-;dwXWayoky&lqX?qgvoV(w><1= z5{b3V5oixLO>}>EG2)m9XQgTg90_D^?C)?%*ciHEh_R0>mpf_2>)+b<>>@Kpk{>Ht zRobc5>{~hAGj4cl$yA%oA=ptg;g~nisP+!%k;1WM#uO=jtHJRpz_D*$i#P_`3U_ce zHSd35Nq&4{g%^a1S)-sHU;8-#`RhGfG?2ZH^;iHoRscC(>}lcXWr%w00AxH;BcHqp z) z2B96bfdG!bKGY#roOi~8?4R3I+e|>t4Ox)sqjc=Vsivk+9#~uupIGh#AWt9Wk2$~B zFTeQe(9th9*bgv!twasN22x#WnCw zTBfdKmltPM+W2{IpB~9R zSQ^v>NDj>J)iRX%rpSQ@7U%a*Ec1ivR^11n-0!*1zdC&MbAYm}%AEW&Sh4}-X+H^+ zA-k&9SVY3-SR{$%fV}B=VGTnl+dF*lK(5J49q#e`{2&%(Ts5?Nt5T1B^hr(?9`ru( z1JDBb>vXqk7#=R=({-VBa z_x&&JG+RB~GbCF*f-=f(#FHR}S?x(r8B^!rfgn%nBbO!_M9D6@nSw>Df$}keai35y zUWaYM=Le5|ce3Hsr@vfW(0^EIUETaLU(5x={_)wDhmU-^Yb$VM>h&J?HL<``2d9M1^Z`A3 z=0>T4B8x|l6nXorcevgCJO)J;0o-9)a5XIuxV9PG>7nl8Z{rmp4$!<6Hm;%`qXQzA z&VmC%Ahu`OMB@tT3q?yy%f|I|$3FGar`YLPeLU{;5X3@t!xbbaADQe)Nf~#o6~z2Y zpl9u=v}5z9w4hhCl5+eVVYu&t+#&H6b^`t^^?9V&eERh_aDlJkvj^%5`wuIrtD73@ zkGUZ0{ZGF<{LTKI+qe{Cq*1>A0>tLJHw|KpWGYr+1+kp50}xXf-pVQ@i1D#U=?34X zSIDt`?2F=@8l#G;=|w4t6FqY_*|cMP37H-vh;8)v)4x5{-Q9D7q{kelP(yZx10r^_ zN)Q`;o|G#X#HQ$mAeM3k2c+#bp1ME6ZJvH5GhFWUr(ZeRtd?U*8&84Q6x|LlEA}L& zOk6@B76u3lFO2~;E5AEHtZR?gzthylx_)ljAF)jZN1!4?Ts6-oq7>D?SCOVKB zOAw=4fgrZ171l9+;d%)WV~A1KE;K-E}-;*l+(c;`n4zBu^J(Ql6(xNiZJVnA_vOw623AANE7 z>kqbX+h*_y|EiNptH33uJTDvq#cY6R6od7}C=L#_vHuYY#Zs!!PaTrDG*j6d_K`@f zRr?=R)s>@08?s{o7>_y<`=lVrb2GomCRVuQEj&+m~^q1G<4Qh~oDPUhOaq*itN z0?(vjN%_-Zxup3^I9Z%9xF`OUpk>cmbFoQotpdeOu$k=y)#AW{L7^E1=uZ1VTKne6 zk^T40E9#%%sjC|q6Z7QTI}U%o%fIbhsKwCRp#_2+g@iFw01aa}moropW6~+u0#Pug zVP`obDo)#3$Lp9*HW=kg6k}-aB$0IDkqBebDa>xDqN;jkW^#sS>Wk!npl<-v&hkUd zyf{U(Njapn?ypPS?jfZ{s6w$xr|&Sp*wM#xhVg|#It9bnY*tZsvHu)M1{L*lN8R_A z9XM`fZp7sd#aAE4-xaY?#kaQBGk#b~(NyK*@fO*1I&wW!!q{T0i(ML&lr~_@GDWCj zY&;8rBY=vSBlmb%~#ET6Svv~v-XtVd^?}pB+yz**X5r%3Tq8L*ZoN(hY z4?;1n*|ht3yt4tDqLbm+4oQi^WmGRC8e~!1dJjpkpja9pOU9&(^i;EM3_X#VGS(-0r@GG^@mU8rt!WjlEM#)J3GiobxnKhdpC4Ks1Ww}Z zC5o?g<1>Y^@r|VAxBsUwj%W$Sd-fjq>@aBzCl`#Era&<&6!;gTWGmWu zh+?LaJ%c0)C!GyS7l7FI2?mW7T)b!!f*z! z9r&T$oi4=v=2c1#b+PhJ*%L9LSbFq_@VLnlkZ+HF)Sh#{QCRq zFEE;;hNk2178MOB%#Vv33K-^T4@_yo+m0A+!NIc%6cWPt)ZN(93#r&l1zA)!f-p+O zcxM4GKBG-gF}Zs2#N=U~;yVu`gl*N!ORr$EdR$DFx2piAdlFy_KK9mDf zlZl@I!9E}pfw`yV!vCG`UvTv}CzTD?xJk#|4Y zhxWUg0R($r=M`m`G2B&uQ&dzQVr>$`EE$SV(;$vQR`A zRyQQQ-sfj{(ne%2L=4l!9gbefR0xRpgkk&mt4ZxG!L}cR;Z%tHD-0L>AO{+&u*7il zJU+YVw$B|7ozPiwA^A9=@D zIAn5V>CE{&@gcJE$hkl!mI_-7+60@=b_ffFO~}OZjW=ZC-jtu=V7X2mOs<-ipEPWe zXTf%dJ(&u^GGfe=vi`u@7oevb3O${ixl`$KVc1zzDTXkl+APIOND~ZUyTbM}`B4$p z%`j1iQJOFk#>NOCO?#9Ka!1|r$MwO|go3as6E`id@gybXUc(SBWbau(81s29nUkll zBUBdq`YM~i7NQI*%SJvFk!do@@J|9^FZFbRxs6bUPY>Z8dp_Lz@yB~V+$`cCK$sfprw<#Dwbi3 zO6(K?V+`9eVBptH^`s0N=b3|>=3(O#h*I0obf$ed+|fZ9ralOR)#9q&t{3l*a`!7D ztE1(P4j(*XIHWG&gy9Q}29@_>B8Efh5;(CW{JMfZ?(Pr%aTjnRTYf@fm@1GIiNAZW z$}=o!{1TC$5QBGGVd-HE?n9FzFl-fx^{7Y4GTb7DhXAR^5gaPRWBBv<1IsXCxN%)=_ z`s&RBe_{BH+xy)8*k5kRL=@CVrE4QV#_zhWJN*Z8W-Yo+MadR*+_{3?Z?Q=<|69!Bwy?t#Eh#OaWL6$fV zE7^w4+u`u>=db$;+RVJ;o`lE#dP|lP*HD&-VOgSumQKhLJn7+Ya~x!eUh?l{H-2%D-zH-vBtsst@{h5j_VhdblpKYR%gwq;9M9_p=H zYq-|i?Av!^asJTZ6K9&a2@zwWbw&VTo6R9MumuG&QCRbaze_FMPXXbi?;pr4hpPtu z`KRW2=bj=a5wS1`!J9BR0oRnE3~%1HW4C|LMZ0!vTQ(J_#3V%Uz=qj|f&Jf?GOX8;`LGqou=k9ubUOq6arY z@WP7#Td+DzGw*%0DIms$d5hqb8JWXJd1k&M5o|U>%!iYZ&2u9}9*5uWeQkN6+dUFn zI-a%^Hm%NLnu;nw*l?VU#SJX1wFF^KO`z%@VX1pmcX!dFe>o|S^Xi;G zQVCx@K$tVd%!zg{^-LT(BCp1pnjpWKtaA-v6^?Jg;%EuN@@Hsm1zdApCWloxnWzL* zVQ^4^6crZz2nhQK!u|zA7A^v*%#!^<2;)Jpwd*!)-nwJw?%lg~Y)1(98#;fL4?PLBO3=4? zv1i=Sq=KmoVj-{?8et68Ve@q~J}6LCq`?70qnN`BU4~ihlDijz&pJ)OibK6V#A zc3FohW5DBfhB`bDF>En7c-pS2`kLINB+t|*n^0P_dCdlf>D<9rG!p?_V&k7~jdBkv z3F_&vn-6M)E@liXT|yc)QdKoUe6h2%)-8cc7|IfAl@OtJuqefsKanFsz-M+p2R8w5hf)JD}&<)VR!)F zpujqu4jY=N4nu;e(9>caJ|hfY9l8t?hPU~4Tm<=^yCsC7pPPIKxEubh?YHO@F@|Pf z+>S5|$ltbm=kwqy zhA&_NjKpkO_qGFC1X(Cm45S zHnDZb_CHRTI4KWcy!@5ha?|>QC!o7JY1C;-tR!L;!UReT@kBAc?{9O=5GD}DR*6_n zKJ%vwZ2^Qarxs0L0KDdT6Gsd!D!t=tg7M+c@lKrdngxu5y1GyP@W^0y^f+bI>6C%k z1!Z1wL>RL$As@b+>A}>G7w81TSZalVb1n>0*Dg!A+{TV%i>l{E!LrHg?T-ERav15b z--Kdef?!NH9Qh#UKj#&X9!6fX?UxAGT)-GLmPl>X=^Yf}n_`8r{24977(OVyaao>( z@kkha#iJtxF*!tXfc-7|I z{mZ9bxo!N&)c#=45-qkQ;_=gkVPcj1f$y*i6Klg6Te}cAKHo~gP|U$UnZPl-b+Q}c z%*2d|!-wV--#~618qSDgI@N-$DXt(GfmKXP@)n8H82X3#PGV^NAZ z{1Xbuj;bU9+4SsG*r2kyCU3;hiJqmqu^_91jT|I3fNW4opa0a0zw@}ej{+bI&#onn z0)b5ZU64AZ3$m#c3m{u$HUzSi*+e=TntSrlWef!OE@$>|k9lat*C?}D-$(^y6pPeK zjhE+^rVPuNt$}PLCy??`C767eBD98%P z#Xp1`FCyQ$ao)*!KG2DwAh!tQ&0GE3x?pVhms5-T4bBZ&kYOVbkV{|vr3~avTQ@!p z`w}MA-uvrkUcG(ND2QGU!q?tp$QS|A%tCyQX(<$ckvYbu8S*hu+hU|%Ow1y*<)MKr zr+TEsT3J1%AZh40&th1*9W*VffoujCp(MZg#Ehu!sT#<9=|Tz>*8D{0ZbD{7judp) zkeS8lfP8tv6$oTu7Qn9=G?>ITc^eqUo)O6DJ)+8f_mUTZY-Rcq$QIwu`$BE$h{Ws# zPC&+PbzpZ`p@;Da1agbMT__-r0iJKhK)OMzYFRplKu+Xo1sdSb#jiH>t4VP&)>;Zy zDrD4ofloK-#^vUZ_wC9p$IY_HbfwIBOpWWV#8DLkDNI7zTZ6a+U=9T zH8gFvhb89O$5lQ3SHDez=r) z)NRK4<<~^H6U({NGtx6ktS}6(K({U-1h>-{WJQxSj+rNs@?vzY6rm_jj*6P|1ni;U zskLDO8Yo z5yhnZp8&`H1qr~APg9XO0l)tKDFEc0g$l@$@i*ZYlwkhSQ37N$UaN^F$QqYh} z6KNL1rFpATnVX-!E6P2fShPsS7ugn$$2u11cDXf5A!RpS)7KpSEHrzvBqIipTUfPY z=v*1fx^*Qe>ogF_ZslbO?x>rV!=RFbc8m${K0_Lla~(MLY$W*C=UY-+=MbtjsB>T+(6vov`~h2Z`;jQSN`|01r zx_jr@R4dW$i!O=CCB$+s!HsR!Sdi4;u$qOyvi-9>l;{OY$ST<;##Z#6tMa0FchtR4 zZFZKBeFDn7au3!69RY?oIC1=3YqAYfK_X^KRoOIjT6UvRe&gzL7F8EWR2WrRT}l;Q zE8ld0@`6w{!IDr0iuYC!TY5y@EwlDBN7p*yjQ;;dCG;V6x-{tAWU zClJXC2+4)n7zBh-+rAbJj_r_^Vw$AE$upxG$yfp+v63k}#BtuE546eT9^n>i9j5^# z*NjRWSu*eMXiFbI`qd}uzLJzK0LdU-Y}pAxW8q5gd*;F6?&w?x=|V|x(Q*SYA=z1i z3r6xK+6=Mohyf%U43mXq42kHs6235#db|7G|M+(Lx>$Y(o6=B}X+ypU>V37W$}=co z{LGL@j+VKKmQ88l=h=arYv_oUpn&{Nsu^f|ysbF-2hn5+WTeReWQtu{*|u<{(VUY& z{?*jt_<@-rf!r2$YXOe0R5*T|aQv%>SN#1Kg($qjd!Lfj*AU?-A=H9)VXUR_)A4U# zo1;STF@W4ccL60CKFP9-sc<8fe2}Y)v2f!*9p9dt@Py zZSe}dvrT$o0OU)95<;d1XVQxhK)&qqp)4h==*pHhAL_3wjA`-HJ;m|_6uh1rQorL`|$)B*!N@~9r^LHY&!Cb76pW8jj@&j`(?!PnWLq9L3^DauM!91|0jb^nu}pb%qj z=a!@C1ZQIkZ{IDId4q;c1W8%{5+y0(qK(jSwol=q#j}!pO6iP*pVOZ3Y!MW7T8OqS z;O7Md#bB5E{}|8M{m`ICcfj*+rWOwxm=PM!1m~+2oPUpSUi9ln|M>cy9$4rgD8`6B zrp;%i7*6(xg<{YeLdzcy;T+QHV~*L^fU}WP065o;O&nG_``IRdGX`$V^qaynWT^27 z9_1c^F~9R`sK+6mS;q(=EOT|%uVxqiE$8WV1sFzUJj+isD6&>z znf17=n5g_;K6fNoA!i*!;aM!X{qUyBiGzmag~oFfhc0@8P6|SX5xS6`r7@D{gONP+ z-5v29BK@Wv5?pa>IDI9_y?=-x$4uiCbbr1DfklD3D?@lB3eQmxuy_dYJYclM^SYq= zj7vNt6wi1J;avBdNB{Ktoy9axj2#BJeSM_eXN;Fpo<4X)+Qu}n`Gc)1mOoyLcm~T4 ztZM_$Y+ZBi2Fvrf#G$3rA3KS7wk6?M%}5MVGuA$RQs~8m>Rr%nH?D$x$OO0m=UC# zAPi?G9OAAni*khL#lQL8^KaZ)f)AdlGxYxPHZ`NWVV0ON469ipsj~#MjIS7gwt3h> z(CW*8wq!9F1XWXN$0ZIfp8Crp00i3JZ3wiDoj+*`3Hz-pAhKZ3WF#v5u zF}7Y`nLBtykpwhdwSfnuQgNpPv?Yq+Bf`Ow26i+AXa~atd><5Mpvc&rKM3ofzXUJw#26vzPYS5G`)g$`mIUMdICs{4?HgO*cT2W-e|paSiP=b7UZ z1{GB|3*C1qD`H)x8NBg8MtWEx8b^~oWV)OjAz-{N<5=N6F~*KrD&1qWUqpj zhVe`@Pe`DHwI)-Z5ypvw+WcR`a~9(H5yW%)+`37_223cqc@5%ui(HLGc!tC0Y?`cp z6ydz&q2K@cjb)|4G;@`oedv-T}|HA7bLUKCBT4wEScS&IxOut7m#T2iX8ha~2!2%!L5Or9X~AqgHn&jKjaR z3j+GlX(dAu(0RiKjxWA(^~O!UE&XVXH;kKr!U1rmxtp!)A3-=@^V`Q?c=N7u*zm`M z1ML$Kg!=1rhHMBU$v*{si^GyeUQVVnkZ>@AW;|p25oOwej^Yqz<`BK+A+i#8o^h z+ybCi1E9G;<9pc#euehA15Fe!9a=ag>T?jDen zdYx5wG2hL0=(qiQo~4 zwk&d0Ro4_G4jNx|<1WOr%ruLgqI_o@@Jy$?_Tz{N?ScF2Lse1Hm;|*7b~NN^9gn*d zs#+*JrA0hjeZeb+n8Z`y*~n1QKCp>>q7v`;jf2B2t26(MeP8eel(&~wrw>W3(r^|7 zCNj}%!ubsHb8EunmQ;Kz5zc`QW6b=Vob*#W1GHX8$$S+A^^}yR{2;*&cXFN*)j53O zB7aMYol%`1p8?f5Z8pFe#{F)2U%(l6azc5=5pB{o)<2A%;B}8a`Qlr5SBWzlsBfgF z(H|@!79xiX=b&y7BMy|HmGOMh4Yq)0-Fi5hs)%L|ACaR*76e8p0nJ4t2Ip2@zg42y zIE2H8BZjeDC)b}qH~8kmwNcS&VizFEbwJip8D%Q?x}{OK?c`I!93`Y9>g`2`s@z1pi}gMR<6+mwV4GjECmtBH?5%!Gqwfs zBPTTTyh%-Q(%_t`>ozc&X%C8=H<4(z_E3KRe;&Ces%KKUjMAxA z5N665p;^RsG@9YJ7%!$AoxvA#Y+TgXWsiNznGG{VWks{}gkE1fC1pr@4Wii?{?lmg zuc^kFWJ2E$GnbtO&IxaSF2dRNjWH<`r}QmJI^J9la8CVi!ud&p^DJGQ4LFPS8C%vp zgr)h0$CkeYXoiRb?r<`w21w6+X*m(VSx#f0X)B0c_xFZ#yrnqj!XJ*l&z03v%aR6X zRbRW-fb)7WKBeGnlj_zyd}~yXgi<9v!zYJepfk?2Yza_+a7L+4dnuR+)X5DWNYAmNkWtg8T4z~} z-|_w6ybj>3Z+W(b`eMLY{SI?e7zab;jxA^e5iqzI17^#AA~??s?GD03D`;|*oLfE< zs&mRr2RN^W;!FWFM)Qr2J^j)@@0n6s985Ka4(SC{!?6*>p(CsC3_=|iXH7L4RdL2I zn?rH#W{rpU6=>!Znhx&(nk$kAXI5Xk8qv&$$~N+c4cCR?FyJugYr#bi%1 z(KBjbkz-M_8Y#hOMrTl?*&F_xK=Tz+Lw6iLP-vzJDxuL>jls#8aZzP=J$o{E@BoXm z&p|FSIym@T8^U%yDgR`1-ID&h{h(0ns6XD-eV4+Y}98lV0958|74)9;^o`R)5^u>Y4-gJw@4 z;xKH;;65m82&#djCtRDUm`T}LUMs_jMzS-?8eV7v9np+`J435ATPHv>=0jDcQV&v1 ztxOp_ddfAB+86m9eRfZy8TN+J4pNq#H~i)o@$P>4LUxw(`BDwgV!+i`cCpvyAX_j9 z&0;3ZdSzmWmS|{<%3^a1S8#M(RMp*oQa^(hIVx3y&`djv$^{1dsmxUxVH}>E_3udF7w?O~Z9-4oqWkjAIw*C^}n9 z^C>4Vw-~AuV8%NmMnD*M+fS`Z9g<$X^lcud`eGli^CT1?n0@sL*wk*`p|^Q%dFU63 zQN1U!ShnuKv}4(_If1ZTJ~=(M`^{b_ z1e(hR@HR2s^ks*;tUR^v_wNF6e^Fq5!@LIA<>^~Mn#P%7`MKGM<>?a38vx7wL7{`C z6Hu6;16=zngz_ylX zokegTm?mI(%E%$9)r(;xV$fiq!ZHTx6x;NF@W`@JQE_MoO1;^zPb_xer5Hm)c_!q- z3C6Pa(Yg{0NY^s0dI@G@E>H|p$+fiQlT%~6&%f_=2ky^3U_WvJ3^cz`S2Jixb}gV; zHnSnnd$|KKPhx!bHl_^IYP8E zbGBFK6>~~c;*+OoL~q*6nlqfAT(fS|dkE->0O(iWzJF#VO0!6um4gDR22zbdy$!_~ z3^dsWS`}vsYy?q_Q$fVJ<&0?G{`g^&34V#_Qbcr3`jF%)i(hv{H1Y6)&Zm|Lm^s+w=2q%dv#xO|Jwr5=FM#@ zqU9ih_m7LF4jPiv5~8ic=OLCT5ZCa9ZwmX)sL#kX0v&Sont;NYbp0piOf=75@G4Y-FD0XcZ2;R!^NiYDm)5#jiOGyz+iF zg=ZRg1w4QA)LjKpakvzwm^c*poN7&`Wo7ME3eUI{#vv#y`#>G23&JyB%S1do1~&AY zS)Lfv{f2x0#dzj~sO7jERcK=;NYk?mrp6D+vF_49!!}iBw|hF`nfCM;+ie7%Hv^uz zLbK-F7BgYFtkS6wbg@Z63?bXNvs`Wj>l6skv7u$>(*fE~JMjI?Ia;jH3ebNdKu<+L zPbk0n{SD9#Vuc3!T)$?0{eAd%zU`?Me|zTv{)5Tu9nfvi$g3C=bSuiyU1UTZ?n2pQ zXQmtsXc>4xWg~Qf#?Ui%P%p5%=aq41RVQZh@mVoAnC|}EjCCm-a-CY(H zmpR$l62$ISY#Y4l3Z@((5*s+lAt{GLfi}BZ0qCH$iR#rXt0)~B9ecxFl&FK`<{tvDrhWIPFMMm*F#t3ZXn(u2`GE*PtBtI3 zb~hUL@CFlTxl;qKTtS8Yfq-tF=bLK*bc-Zf1?c`{YKxWejC@r+UED( zUv&>ih!byL{>Q%qoTpZ+Gek1&jwfb`a14kuv<+}kNDJDj~gB22?jgd1ZU-NTM`>W z68NETwlk-)isHf1eXqY$z}X@2Y=yJeck+q(Q~D3efq_BAplxt=o9?F7s@H2kdH0+z zd>g>oOAK0if`JZU=j9qood_Ut@h~6hZ`d(1_rLc_Ew=;EyzdNxdk)_r|F12WA2?65~x0aR2nHc z77dCXc>SIKLAGIw1#0$eE(C3OoX~8npp*BaWN{9OW^-OpqIo-^Sr+GZT%1AO7$db) zJRiexI&-}S(r4HRI#RB+l`hJE9nF6sG*^q_3~2Um>JR6D-&?u*-CyLu$NU%10GfX_ zcRK#PLa=9WQCw2rkizqsl8uveULaI)ww&Gx<{HL0clDIo>>-0{>Rw9& zac793`TTD@u%LTvs;X(Z@@kl{xcL|~iUJgL;6-!}oRiX_PSx2F&mrP;U()a-E*&*3z?O z6&=y%%8~tk0Np@^!#l5eu2&qRY$5iHqb_0qC{$tKPmH{K^S; zKJ)yW|Nhnd8Pm7`SlBbN4gNI8$7&}9*#>umO5RWlLQS^8?D=~Ex_4g-dCsx|ItKu~ z=ua@v4fR?q6{I0 zSmjkxR$ft=-Y@R^HiTshe>k9Do>x9Pet0DSdcgS78&%JSi$0P!t@ht@r5@Nze*un7A7|)J|n%w8+i07cZ^OZw_ z_r}84I+(-8q7A zbV59HTMHje84Q!m30KoO>UBt;t6Ic!SGg|GauK2o{S@!Krnyj|=|0+-*XLK}Bb+DK z$!I2y7m4I{nxKu_2w<0BaU14+@Ih2_pcYsngM)+>9dlbkv^j*oB&4Jfc}wW z3xl01#SL_Zt+9fn@x@Y7Jj<1=&{1hfDgUhq8ekkQ# zw`*(gUw7RQ8$GlHNK_~^i>w2oIaCCR6Llt<(T6~>4yu|xiDpH!E$W(2+d}gO#EicF zUdp-JrXG#zOq-~ATJZQo^Ctf=G&`t{zVO`^G_&~J2E^xFGCBEPA^Is~*h{qz^(Kyp znoc*Xbw3`?c(U@$;M^Iy!Pgd40Guo83KIVxbMFCF<(cjOt0|hI#u7_RLFFJIiWC6> z6;TkS2nxtiL=Z(m1sg_| z`<`Bv+i0m6X0|9+0S=>_jd!%^Oml5t_fMS;_G{1Xqootdmnwbbn)!z z2F>W(uzKpygA^Fd+bEFdCZr9rZQ%EFTjkJ{GE2c`rxKe8~`Kf>-tv%bqMojZRT&9^s#=22k*!|r-w6Vztw zPP&C=q0pRre&%?uG~=RBh^g05YO_b0w+WhIdJ7-Q7P2-I%_u#y(^Zw~(CLcmDFk3z zV?$A@EBM33**OEwua-GU+wh*cq4ds40Q0|Rk53AXA(&I`cmBL;^>5(X_;w+Fkw5z0 z$KNe|w!C!ORBoN|56?3P5}xD9z0a#vHr<4Tc4x1xv$SonPUj6~#keEOKo8P5RhX5m z4NUebBA8!An9my#b=)}<%wjGmZNl0wk1P!L2R|K`<_sDR$zXzTOxoc5W1l-bz-;*G zuAnsE#xT2E_f@m=$gsfVyPm{s_4;9!0So6}m|XxV#-1CED~EZz31%+MS3zk;nuUNa zqz&Uu>)jwqokro1ka}8YFRcc4&P+468c6f)-keDM5?rgTL!7^!Gk#cTOkR0*bXe+` zc}ss?1%|qB77T^o@uGJ>{vK#9({bjjkDMCBd5c1K4(Wq98;$dA@O08$Nb2<|i8F4# zVyAJQlnrZbt`}$6P#N=iPDUDN2+&=B@={W96d@`w5)&^=GjyYBC}H zNjPJ-NwrzTpnCA`quDtlG%)q9r*Pk~aX4RmX>LLApNI1f9cN7l8`q++0kX5JbqYRa z+QW%@Q>y{9EwqT%(`x(|JUhy?(k7*{eQrF{|0zeN#{tu!X}R;4u2{Kp`PcJd$vh2_ z{^i-ZGk|G+42r1(?Q_%mt2lpx#yTI0+|jf4Nv-qRJ+tZgk24Lo7TlRm=^Iio<0T8z zm{zAUy&jIs*1*yzFumrny9fA(WkZR!i|j=-BY7~1{y8PuE7J*yT%sukCqF$jaO7Q2 z@9~;VAl`!d`ICz;&z%q)ekCQ^dXUHz?zK}eT}S-}muR%sHEET`C0aLcP>Duyqrrw_ zV!{>I=-6=@JO`aPO(}H&(@yy$^b(DvcO6)#VX5l7x%tCGqI1i$`-P^Bo&PiJSA7LY z4@+D0-p4;IeeTX#!1UCTDXPFhh9vWguup*Op+T~x@u29T#U=+gY-Yi(QA`60mLA%i zxM9@k)Cgeug>&XQtuk$ycCUTn?s)$&G(Ni->`Zmq$DL_1KC5fc4ZH|tG&0v|{h|+y zA@~pq4z5N4)4AjFMWzF6wk^ zfZ9Cowj`DdN0NH&62ExzClpRhG@w3l*zoc4EeVf}hlJW$<|x%l0qq8%rVUqcYcSM5 z%*#&>i5`nkkH`h6mw!V{KSoT?n>BMrnes5yU3MJ7FJ+EC!8+6?6hbcZrZAK8uil3%dnoY3Li$Hu?j=oi-c&4p|_DxJ4>Ac>Qb-y&&w(V)a%y48NuqR zALma1sK+qW3w~Mo-2(Wqr9F;JKRbU8KwYXpOk?%OWXY9UBd#xMm2)zhT~WME2hOgL|BK0LY)@cGjqY>L;qJy z?=dlr%?BFA*f^Rd3N>x1$PGdiRB5pn0*u}B_-V8JV9| z$=*+U3LZ>@vQY1JgZjGbXpWELl{Bg0b(T^TD$*kH3;rq;0j)&l!n!i}N3l{D392a@ zh4$}xVVSA!>}ke=RL_K_8Vq+tHTEBkr+RJmvV{{yg!HpxsZJk%&-e3(4^K{i5}^Kh z@%(a~YMO!@1PCdQq6<*`q*5)k5A^ucH@181mp(LuJ5vLZN=S%66%cng?A^Xq+~q#-Y3YkR_+g_+7R>r z0JAe1y-|EW+b9>NBD>is6DvH!T9`wyCgXNqx) zDAf>PW$do#vv5x@#Uh}(H@4NJQ^KiqzA@bhs<8v9Ej6g_-iWpuE@|Gfe%-J4OiT~y zmxHx>RDNMfO6sVm-uvW7pxTL4qogOMF8a1C8*s@U&HfIfR12yx;@o|G#Zsy-co`w$ zuTY;?q5RPejv8Z8fCjD+R4Y+K=2C4k;O&2A!N|bS5vWs+7J>cl+bcK`m8IIUjrAv$ zYDu;Dc&3H*%AWJ&!N!zoinF`;k1Lh*q`kxA2=M^;?^yl-*_9HLZomeFM*HwL$)u6E zxmJs#DpIKCjagy%*WZdolas;-Yd#MmQzz@iI)+*hXs63Am)1hD)~E%EYY^+TaEuTy z9shR!q){RLMibWADXD3hPb1aO%y*Rg&vv7la7NFeyv*|e79 z=IDTrR^f3w3#i7|q6#(0*K@jhj`5cY2r#`-+thJm)n6t9)7db82~UII$gF1o>7SmN zS7#tyWO0^?*$Wx*DAWMt59+Cvh>m&-_5TghN#q%?JGSWHvWfl1DL9eX7W{8FQ z{{ZPjP^bav10H>NCZy}$STM17crqBv+%_0I`AQq|dK_{?`bMSwXxq-!KH1t-W1+@n zIehBCTDveWSwy{}$;HU@{Ex(2kuxV?FT=IGDQ4<-^7L2)rtz)lD!W95+Bu^MthBi1 z_%y`yM#rX`*F7{PD^) zoo;z4ZfU>q;gTFg+CDfjGsFIOCi-&Yh&IU{ zjqRn;@^L}zX1Q5Dti7~MZf(>Hk%(5##Ujzpib(XiC>a+=7SGEG0-!13;{T68ds}5O z1O49JCB4Fi8x`6Bx<4PK^XA5D?a3*9#00bk55!gkG;|&CCqXSQ6~`|4LezB+QKBi{ zz$noe44a*!^wL0dc<{9OA40~}$s=%_OnSiK0%rX++Df!9G}CTgCfJRI6gw8F*KOFe zd8@Xq-PT1V_K>K|^0C84jT`sw+aF<#zT|;uHb*qnN2@}fqIu}y1}INoInnhCc~bL0 zqW9|GYJAqu1JO^<9UT;AA(|?i(sTUpOLTmKqE6@Kr-k>*p7jJi4td#-wE^6j)cvJq zqTj!#q*o{rEw^%%)mb-xsk$}kiRhysdEhP!muO9l5w8bN9so@v7gvX59PUcPG+qpn z>)_}yJM*kF z7hVWQsLxYA7$?T7u4%pT@HiazrcNW&c+?G`J}jVCLgGZ3)^`97Jvk@4S6G^d{`3D5 z>Jj0+vt~T@J3(FJc^}*i^^$u5>S5r=$(K-z-N`?+L3>ODwcbdh;RD`= zDSF?*J|?=hF7#D7bTI|q@z7=Rl;Www`vy;&w**d!9@)PWq&(SpG^2x<9XvX8Y8-#k}=B?Xz?A*EQnbN#IQKQQ3u^|ul)&iPlOut|ir)B6JopyscqB3y_ zpx2?8BYHJY3&)2>L19>_F(~ZMgSv3uE3nv757dwoCX)~UpFwRL+i7r)n3td4H#n>G zkv$Bx=MWkRHMy9ykM1q)6`J%%pca`OrdPpnH>jIlcfAJIyz6i~1ACA59a3QC0_HNY z+k*16EYwWH}A*J#oS7a8cGP*J8zm^J)K&xb_uWPHJQ{yYtBOkr5G`KK&uO z8e_S#;nsmL*Z)$urp+_C7c7hQ6=l)Xn7DQ|ceW5*yIQr7Tz5$6B#qP*6-C2Dqgs2{ zJ&LDJOYYle>Ye{QU2|yPj?HBKz#gO?urmeNE^z5Nr@N*x+S-hMGiS|ekZkBd0PMZL zzc8zyPvpq*?681ew3Xq2c1-accr8k_4eLi1JgwOJLE9nGknISTwqPFxZCVvKIZrWe zOW8%_l3fQS`@cn7-1~zlkD}zT-bD-F_7H@}LE_MdNVL!4rMLgzp-slqk&%5yOnq=0 zmh7`Nhdk!snM?NP_mu^OBu-M}{lUSYtO&cKjm}9A84j2ib+$C-#ZVD9?!se5}q{6$NxhOr8Vk9?|XHt!G$JZHBKJJs@62 zF!XeU_DwV-=iyRTou|SrkBoWjveo?;h3?^Dy-MzWuMu>g{GZURUg7YtXj|W^fMTm2 z71bwo>I1l%h;;8E5zLb7LAGk?K-Ipye@;-JA%7O#r`+gn=Yj4{!{y^qoSQ`(2v2-5 z9@z-v#bGI%nK#kyqbw9=G_J|*RE9sPaxwoU7>&t8encds3ZQMh4eV7gn=dP>jpfPb0-+FS5OwBj=mXB~_T~Y3LB^jIK z8=D9h(BC#=Puky_uH$)>0XG4g5N0NEZGG$C7xsQ%o@H-OA_q6FH34MB% z-TCf;J=-@yXM!y^mT%WG7Yt=Qc%2yV8K7V@;84H?;OOIvs$cf2UcYJUj@^6q|9*_Q!vS#V>6Ld*jP~RtU54AgXhv4= zz9arLHTwzySMJWpbzFFTzfc?-CrKudtf29C!RAOt{_I; z(e#WCIDE$v;5VBAhc_k7XShG{>DHYsPachYFrlG?;TUIwM!qRn!AsJ6^zeW1kuUa8 z>&<{`0&owLbO1aTo|G=)yKWltjqM3PEBiHu@4fqfKm4}N_qh4nAewxCvNND*!EA@% zTkbM)bT=0}(|&GfpPs-sp7L}HPp|~{nk19DX2+GQz9Qt*OArVqYO34jX1XU8C584X zy%+sr*7Gf<^1W@JNKo1RaA{_6MEaG`?Il*-Y05bDo&&<$xgrckp*v|fZhdhM2o#v4 z$@i?L_%wAxN>R4uP6WRzzj>fMr1t>p-9x4Mrt>Y0Ie0+W>?x5q%;kubakF1{)Lp)GcoYCWewMSm2ec?2oqeX;0r0-;A=5#O7KN;RmgputCJx_w zqJq~otNG)A%W!gzrDnkY<*{?cI0aF@b-;H%G(9~yB14_7d-nA;(k{|K`Nl8wMnr>* zi3v?CTDZb3?$RkXj;*V@+IN4M8{VsbL6O(;jn}qh%8A@%gR5Z}4yUA2%K)l#7Qo?; zbzKvX1l!{DMtNZ3!zdExH%5zsMksv`UG(7kj9qC_CJ)nkwDf;++m^jsHmo%W*QiCQ zuYzmPg4a%~o7RLn6ec{zBjI?%#UPwo@VCl~A$4L75Exnph-c*WxTTzR4u%#w0tDC9B~ZBH9UqMGMLXp2j&5B zyd(hop=I}dt{^V&BYLjk+a8=c0wkk9&EzK$$IM0X#6)kLh}j@D&5Sr*U$Q2X<@OI7 zGHJn55rMgHI}Gul${7w^H^hJZ>z$FkV)BbHIgYeJiawzl&N)6_5XT644~U<4L%bQ( zaP5Y6D&o+jkUSVcLw9OY;E$s|GvlQ(Y9!x$p&T61q)bW#!~?wW1lV=m*&(vJJTzC26sUl}U&oMK3 zlg9fy(`du})j&zwr6DV;+o3sG#idMmQiv!>h81!AO&YJv1`wYFF>iD3|B?~sfrz-7 z=o#@%4@^ykDV7ECKfZI&7{omt8wVJaHf8+4@c6 zr6e*kczbNFyRSF}yke%^n*U~D%#CyRdrgs^ILF&#oB~W2s0Z~OSTF}p+pt}K2OFC` zaDISe`Lq>}EQk$?$^-8)Z9aiv0;GVXM4nUNn4PI%Ff;mBImjJ$eLva%@5$KBQrX zOy?YrD?rAXpD&zplG`>7~|(fvDxf!|1> z=Ymdg*Sz4l`q8`Mf+BMnbjku^(Df`J1N5#G+-*+Mw1Qsi1@sOI=;Gx`wyGgUU#>JQ z;^_$<6n1liHm)lx#RV|{dhpi>`W_v0hXCC}_6Qbq)KwrL3OIKV=iIiqW<=G)Ib2tS zF&}WgX)8|bcfUS!QdoErbN#a|Za2EJJx*WHpFfce&P%^0?l%1R@x$ zuE66{PxI4PfQ{f_wQqs&mS$(_Frarx`TgGz=j4j6GV;)^oa1bB z^*xi5LZdOuPp-AQU#$bF2sy{hShuTn)~zxt=ip7Uw&s#^{7KN?uUspWR|=*kM8*`% z!ea|yutUz*3DbrQydusy)}1-8er)03o)Kdu=lqdXGp`iReU#@X_vT7I5Im5Y)xkK< zb3yNDaE?wZTv7QbBKkb8TAPR43JQ>|0zj1~<(4+VwEM-v)-O*UKjM4Nsa0^?Xd(lSj^-J9`#X zZ4=^)%T+y=e12;O-?KOlSbpx$(?h2JKgT% z6W^^ne%*>72SaGVhX>AY`801TRKEr-5ES6U+a_GHXaF8A1=t5S=Q6R~kY(ADeOe;o7)g+=)>K@oR8NaqectRj*V z++QH8K>x2&(xlcR3VLgLY4A6bDCqRnLGzQn)%>3fC;hG#bjIyGVSMXn&|M*wow2hQDjXD^UL1scS9Ikx8*>_7_+hF~tc z7M=%zUuDX;J^*=4B|^SaXo(1Uokz&`JT{w~mL}A+Xwzz^BIMY#1eDE~F>_`;j6-SVa>t0<>uF>7es_5&H%(mPkn6vsZ*yZt|T5=)?IaaR-dktZMT z2+}V{V{@)-@N{Ich5SF@$>LY2+MU;eDa$w^kC0RJi&=+LdRp$z>A)7$ij*`c6%hF{ z4mMMZ#`g<~n)lFBFEKU>AY? z+)zeKk|V=%CoMihkc)&5@t8J2z6l|}fJb%qK6n3!z_3h)+*1MzbS?Tz!*c?Qv0Qh| zvh2W+-(rEByy0Rd6elV zd2AL!j!Fx5<_LM6sN{hC4Bv(!hwU`SrVg)8%a068K*qC+AK6`V5-2}&?!slw(aiZ3 z*u{MZ6^pz}{C0S8vqF$tQL!a9mBPu!B8Qm z7#In;ai<7!iSwd@Vi!DIVZ7b+o)*2RVy8!Oiho@`VPM}uC{TEMw;5maSCUIC?^LSi zN|nD3KLTz!$uc8d=w$KII}!K4o{3DFFueJ5IPbdH>pMm=(?blXolP$DtR~f zvxv+oFGJkp9wF~yf?OUJE+psZRlv$;7;*HQB?W1bVVQaN??=up4lR{)W$*vw zD-YTOLPrqi9y40-N)}WgKitF9IX5-12WkGm%rQ)n&h(L>mY+O}xTZZ%zMy`iNNnGaT5E9k(4+pfomsPK&3 zyLWgn3@f0+`m{W#?!55EU-JS&j96~=84Z<@0DZ%3ScDn|opW1GdIVjARBo+x2bFW) z(*&Kx*A~Q_%ii1w$P{f0npuRRI4R4f`L!Ii4>&)%6^)3{wKyy4;3^z)F5)3r_BC<+-s(O34;?*z^7Oe2Fbj2R zn%{+>FFi~bLkw0X9g>9 zxD*z3yNJr9#CFe-TO*_UrsdAt2$~|VR2$=dJ`mW_{9|a&JKp_UVL(Vdp*}YCh%5Fj zGO9}M*SEmtT*MQdQZPrqE!T6#yrUI!&{-hY$JQejbrvC<>w=;xvF&9*bn-@iw2UWs}KN1piQf{rtyKIpxL)gUMvG$iucyLez-yXq`d zb9sRC4ocNEbIy4MBGC@2xi`+U!vlxk^Ym8W+;Y^(%(<+C7hj*6*Ee!leVhwFAC+?q zE%NSn;y`*{-Rq=Wr_%SVJDNDh;05=UH`)uzj*UnjGiQyMg{mJ{
  • iZ2q)5wT~X1 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∋v)~w0^o-~R<-BA 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≫((upPFMCqI_-j*ZS9 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 z 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

      i%;rQOXChOfBP z+bCJOeACvlbV8>oKEnr~Z=J}=MJD?I^ku;)QMU@g>v`-b5^X{v}gI$zCAq9W%U(h zZwF&dwH)g)>byCJyXxpS?FK=c(F+9ZK1GrI3@>L(mEd)lX>5Ov@T%f~7pZGkA)l92o%9xRBCS@K9UjSI4uGlo$vtu2Z0b@XkRaa6|NSvKLejpa_W}H5cyyF(m zNdsS*AC@*s`qgXcq0I1)PtmTZ=Xx>|+RR)lG0r)Ty-# z39pv-VF6OXVfVma7p~!IJ^W_;2ha6r((#$MwIq{|VNt|kJ5CH3tGD_%K9$;&y)}xZ z3r@$ZX#ij(K}%4;p+uQw04UBC?R;9-G)fg|y$|9)>GXaIH!S`#qi``RX73{Ujdz*+ z>mPq^-#uqUPtiS)f(@#Ys(Z*|JDhEB^ROnR8;;Hu#6PtU{vpB+F~SmZL|EnQ5XK3I zrT_V0KzZ3Ta>P59O3)A!p{~wGmjeCY+OlW!nw4J;1;Ac9cpH-J#$~FL5hVYaz^G38 zY^)|q`j)8HT(o+WZKf^#31H@vsbH>d^v`YmqFIMgfR;7T$Rfl(9@F7|;B_16?dZjM z)0f1TArd}(t_SD~_)@K^Y4%+~oT$JZb9w}-GfjxF=I1dqNgeq8_|&O=hjC@r^|uw6 zQu|7RwQW|uq$pK*#5w4%>n9S3xZIqYxzLrW9~~35^&P@h&yQBD-n2LT%`g;24_JB4 z;?VE61~o*pJaLC>Gjx&QUYYA4<7!`yxT@rVE7caYeWg}lL5}cDc1WDGt+)#^tT1F) z&xuPTcdTFa>oe{F#aCWVMNj?;3gdoyrUJ|bUzwU=7y;*cmV`6*Z`eYn7Yr-nEh>uu zmOx=No^;hS>$&O+xY-WY1R@ic^pm}*F51z>6n?!&H3dGrPiS3RJTeDdMbZp#OnkzD zqj-v&c*_upgsYHe-p*PVhf@FD?t$_P7qz7 zlPIfgn+7FezydzKdi7fJ)gvmd&>j+Z)b{)~fRHtG{vT_%Ml6}syL&f0TH7T+^OYWV zAP32&onT#^!#e6ocqw}eSy+C^qb43;WX0!*tRPQhdDuw%;ztG51#t9yEfb9|&737V zx&SS+bHT2IKK*NN_}W!7p9W{mNW7VHi;LpHI6TrvoP~rejf!H%X8}eDzuL{RgOqzF{@$-eGm{qvv`9R_`#ZMT7N=j zQAtCu`u3<&K1%lX^4ldq!+(uw^8imfp0Z@7(!21W^=vW-Lwv-yLHt3)GLL(#xh zKLr%k4Qity!->Vax+a8`G8M2Yi>Nmi9Qx{$u_5sMbv?7$pmLKSYY^ z%zjz;G?X5Vj#xRIpw#c{6|2Jcu6?dAA*q}LNgm@c);NAunozO=F1|TnjRMIN<2kXD zz(PMM_C#i|5d-iVmbM+TbBT?-?BJ#!^Dt%{;;lW$*6HFnxloWHhlSk8wSdZ3e zM!CIR`G6)-KeL{w?`mK+0Ja)+R7KCCCp=w-=d9)ZCu{S7s~+#|L$81Q>A3sEQ%-W- z#?vW{r=y<`o~8j$Spx^@2UUy6dKN~P9=5!7VRzG?Ff2%cpeU#3pq{H<%X%e5$pWQb zxeOP0{lq>I=Z6tJfGAgI5n7hzxt_4%L`Qewc+R3u z6%{dXXsRT-JP<*bbZFf#hl-~$wVyE+n@Bu0kRE(;Ep*^Rsir%?l?b7E_^7_v?b&E>g-zN_3V}d$&`5NA;$rSDa#`4NI z2vod6BhlQ|Of-FnBfLfp8yXEV>KhGw8URh5_`isoA*7*{Jf~{M;R0VILI1~7MEx(} zbp9Hi)q{#U_UZHenubh$*HcE}bgi@AQ45Imx#TA*csfFP@(!mbj}iw{s9@DP(aN`Z zH9)CI)!(SnT|UfyPwH}-7JDROeZ=T znY0t{eZNR@N1=iZ={z)*_G6-ogbN>-wvLU>kBv_i`Jv(7PftJZ1pDB8KeP-ckH zk=ZG7>-x3d4i^K={(f7o+=AgdfBI-5J#l>E?1d{}C!A9DJ>Rc{QT&nGP+^LhNR&6c z141H73gz)App|?NNhZ%4r!oY43FR%;O!tkVyo=l^jiM8uK0lyohiUJzYT`L;N)c!v z(dt|G!F5d91JI|~B`YzE$Z=%U6^KbHIbftIsYRmzWI83gB%sJ8pG(w5j%FgvsC<#z zXLS^viiD2+W!1VJkxM7`L|Ooo-AQyT$Ky|SGXwvkI$Bo>yb`*Xj@QiC-8p)Oc~R0n z#!+-OI1+{O(Y&>I*x!Z`+dI|ELGTI1L<>)zl%$da>o)`wBHH99CC)$+9V>R9x-xe6 z=5@cnfzgQm{og&5bnC`dL{mgbiAPVJBN>i6M!uPI%NoUf$~6$p%%=H>jzlBTFs*^v z(ACInWHvT~JIdB9AFU!bqT=Q;Td2|kC6+XhTHQw+b#3uIRJZe2B^{mm?D+xBLZ-YY z|v5#ao)inj9Ju8L+ zMumEQv}*0AvYgyK6t;LqQ51AHKAVSF z5{1eWigM81N-R~Lepw(mWIr-)*IthL1k^Y<$Q215r+aIZ32wN(PSLsrZ{*)6RbW0)goLtVM04ZQ|t1 z;}G36j0`C#*`X1;iaYhp`e@_h4=o`7OpGyz7Cw#286^tW-E4@5GBvpS^em!zG}hjPJ?|ASkdN1STWM-6*r6 zyOFE02o7b<$s5+xw59_*xcLovO^suoG?fD}IE$r6O+Wnj)6ef0J-O8~i5{%bOZ1%k z;)OxYI!w0EL#Kb~c%Y-0^}}HcDrO|HH3xBVA^4c}(*Pf%!GE+Kl7*~Uo#J@!tnkp2 z;Gg8bQO2Sz`1nQbTHF);txi2YS^a1D-aRu1lSxAfBluKwz=y&HtBA?qTjogqjyE~! zA~p{(b9)7|q~g)SYP!$SU(xuv>m%_K;e{WA*Ch!*{#o!tlguoK%9gK8g$w|qI_Akh zp2kA7a-o!&ii3he`njXIV@43zI=Z~UYA z`BZHvnwY_6<2$HbBDk}%E3AT)miDY(Z1wFjh)=e7hwm8*VwrrvGV~5A)as{ zyKlwaT)*gvJf)}g=Aol2X*Re^kt>)dA2E+;3PaKSKaDCBhoPx7kA(E~;}jWXDCY5v zSoaD!;6js@tlh9Pde!uvojMte8)(mV6?B80fx}gjb1J#E;L)@#4_{j<;W<*DqS{ml+S;hFH^Ny6zs9MzJl@BUrCw=}$;E8jB=hBxif_Nr<0OnD>5_`EKOWl&p zLxsyiPs7^)j%ZZKDp^fy8^w#1=#fam`O*Pm90{BJkr6w7gvBk?sqa^7*Kdv7^TpuK zMn@B5L!b$=K_maOWwp|D!%tvTsT?3%ZE|uwi~GtAH8G5uJvpL=oV=eyH*< z6*^eWV^B`Qp{}l@<4ANXTDVZNT&)dIjse+IvHJ@fVt0pcSo!8a;+w(SFGDu}ed=gp zTtpo1AfLT(`TFg2D4q+W+KVaCV|OC~uIXlFBh(P!8(pN8b)}-a%RCn#uZcQ! z&ddp&THlvi&b?GIV$P{jb>*uUhX64jTD6L=@;GXh-3Fn&TJsGLTX36xW!| zd>WJkWXgPb1?vt;rxQpdXG9s14@5-nUNs4bDcI@x-`8#49lLUBcd!lsW41TjL0Pt` z$is;?8d)GqfulPem4p2GJ|8{WfVXa_ji%;H*l3A|^T`2p(@Wvp^@(Q0?DjwmEqKvV zHRXwfm|`A?;TZsws4DywligH1qnt zE7vcR!byNeK6vcZ-xseWrQ%^OpH20Fn5qqo;Pl4sU>68GR5#~rdU3>tbT~)0HMFjg zs`$Rql6!ITK+CnS2`v*fTF9o;8(IjXdES?=IH~GHKAofu?@OsDq7kg4Xy|Sr8XBzN z9waJlQWFmi7Y>OA#oWAth$lKa4V5Wh#NN%Hi4e16!9hQ+-LO4+_a_5G1)~L-2+&f= zMvIh9vMNy%12di&VV82aJeMVY8VQ0%bzSYKFgv)o5kE&UTz2IM7qh7O@Z;WaA!lv| zR@W!-l{K%fH*&e3VI^Emn^_!Vf@4Hmvt7Z?o|-66#=)Vh#0Np)DcCaG0Z z-n$|({KfrJ%sqidzL|bw_DcZGgpWwl(1ZwC@@KRqw?;%%xZ~s)g<~3?=yqFiq+O z`ibHN%g($EhDkn?5Gxd5b}s4(XWFsL8>`lZ?~PeHzH5j9a)D)SYqo)OY!&1+071_as#K(1&)2u?+q-q+n)e3v?=SilTXE*6FT>y*Oe zY&FdP3NLs{fL?XQP?RB(=e#tG@Iox(>`>VLiE5JSp;|0MGh+%cuEw`Hp%P7e8dk+$ zUc7KOYzrjayb8x19i2+IwsxWl;$m}p&}a*rhiTK)*$7_ zOfKrygxWwP{i3Q7(W-!gFNm~+PRyp=bbzX9g{7`tizqH8kIj=CO1V&v9lSE}KBY@; z(;Lw-bST)u$*pf*8s5CagpYMKdg%rDY_DoW%fvFKk;H<205$DIQ(t5#zQK(fr?MYJ zz*(ob;a9NY9Fi@`fA0sWq(tT0yZMt2fJv{J>o#nOh?+M%w1a4GaQQJ?o2{S^(N3B9233>h zh-;9v)ohN~SMz9@)VYKc5uBfJVgW_KArACgTYv)LT%8HoWVP%45)@QmTa*0G&9WCa`>>aR#Kk5$sd1 zyxXt9kb{a$2qXC;cP{8ciD;)6{@4({J8r`Z-P;2r@C-~O5+ju~MtF9JtB!+8^d0oF zrF7Zx)G4`vWDkR62S7s6uN<6~bw_dufkdv5TaEIPW~o{_e31^C!xyP+)%ul<5*;BJ zOedM3lb|-;UfQ%jYDf5nuZF=0_3Qg)?1jtc&m2FzKQ5AV%E_}AuHDWsGJTFcomtGc zWh>#KcLmwyp zu}2>gGGgKSO*>;EW(^9l@nN}G&$cK}3SgF^-^T9_1d3X|d`s%z`R+i5yu;dstk2UUI?U8ZI#&>SlPJlp6h*n7;CYo@S)l7gkI@VPJxvD1HFN=ieWNncpYUF^Yt zx;(a{AwoN9>WMpO)?R&dmC?qSCLp93QK{`0U*2z-$;0J1A(A%tl~K(@#(io*1m+mg zZMJoWXCdSzD{D)xsc+LJP3{KgZ(O%bF+iknm%UivznOGuA4nu6$~R)mEO$te&{tP) z+`4z)me+f>Yugqc005B;LPH}}9RQJ=8)Sto4zZGxK>sq7?mLu-8k}*Yv_vAb+)5;J z*Jl@#$W{-8cvqQ14k=QDC9911y-36=GZsWdg8~E*MI(ff%oaw=LLJ8~ONigIEqwX& z;1ILVK?DUoO(-gRBJA5I-@I@D9Fj^?4D-6ULkdp#bz}IhxTvoObs%^^{zIgS z=C!H7IN?FYmzER(4~|NhK;(;6RAP#H)))_^O6J!S9)B@Bw&V(rd;|~im@mflOusrB zAMzbwB(h{_^wm&#w#~u^*&57hLa$QJVK#F&&u9_UvdfHhiE(?jhyOB-`J>O$Bj^8y zq1hi76~pj2cLm*_Oy8@o2Dtrv%hYeGph4VWmlxSAgyD6l4?cz@57SVudFHIICU?F+ zjd~B{@%I&}Q8O33GOl_1v7eFtaGGA8fT3tj4-U(egjK4%(jkp1e*I<>H{?e(cd>${ zUpY&~<@&KWf#}s8?Yn#FP$1)}A2x>XjEP?|u9IjZEM!n+0XGL%Q?vV)`cNqvdl;q; zE-vI@9+A{xdtLD`WG1_qtk~Ge*a*)S8(M$3Fv*#pt4mEe%PFf1gM-t0kMe?WgdH#K zL=_-#FnbU>44@+u6{b+D9&c_x5Vw0<`1}c?Um))3EIV@U>`4fa*vJ?-$m6HaT}{cz z%*e<*J+-vk&sDZtgJyCfly7A6r8pE8TYHQeJ$8Kd+JnF``k$VuOj?}#KnoifOvDp7 zGO<QRkn_lYHrgdw`e9(r$qlk5gHax(=!b8^;FXBL5d6)~!y`f_V zqhm9pL%077OPz`$g{X0?3X1@7RLepfssm_UpmTtOHcx2g&1C8@nu=!W&1a+RN1xtHkNkc1#L(Zjl7~hCLUvzgY)b)+Eo3}+I?D?dBTSA4QP=Ry^(>$V4bxu9lv1rR8 z>xuL%Qjsdp;wQH?DSdYe4xN1n790qnAUL)&E;hMRIZl=1--HYB3rA#RYafuVrM_)! zS(ECLqFyPXF-v`^OVI|ITWXL~Q87Rp?xqHcO06~nW|-g~>)o1V6zOr({zsTqvEvJsCABU}fx}ivpHa5swz2xWlru zIyDBH?x z>TXuKd7G!ck4=o;wSCLijEvsBmmWHE`nZLRW2esF05U{|@3HZvjpCst0_wNc2BoX? zu$-zpLo|afDv3$n^!uf4~egiy8E*I!iHfa^iVYSj$iZq< zXpvz)VgeQ7vGRIh#33@|On{{_MD+)i2BpJGwAs%~jA&Y#jEZ#VjG(r|7A72w*}a26 zL3O0p!o<@6MWUjMW2epm6h?;YaK5o6X>2Q`WWCl_>gCWD)cemyTafUatucYOc=1}0 ze9h!v#6%jzg;@I9#O57F&-~0Xt}-Cy2A!RK*|x+gB8n?~o7OMm_A3(b+zGW8 z?MD5Qcqn%Fj_|LBOF(=Vf9mvcyg-Bc5ub=$lmH}Q z+E39DhJ}WdOuQF<;}Qn8`E8rr-k7~thB$U!hXt6M=D-AmCDE-7r~F7-$n@2D{NZtK6*pm|qVN9=3cnQsUwB=#!_8 z5gsCA@G#ralYd{on~`B=rft|r@+Foa!8F6n)RT!UEfjtHHn8& zGrqfnJ9EibFP?$-rMHg$Ej-Yp>|lo#79JeVl-q1-Br%tg(V}5_^wbKK9Jl{Q63}qv z2o!_>8uGMGT@?Ayp}4 zzr<8cH9HO`{jiylu-0KmZT+AtMSgCWh{qm~NDw7TJ9xoSDijp*5ftR%3S5N*Ge{`V z@K-t{M3JWLMiUVB?A-R<*nXlx4r&BYaEl(4yMkengLDz^UQm!%`t5uJ{SQLH$S-C( zEU2As@}d`=#8O>(%C1l(REMNtIZ?bwalevd5|WZ`-o8Vj1VG@9F=KsWwtoW@44Aoj z+h5TKqGk4o0CrffcP^4Q@639(U8ao9aLekR{lSWl4=a(7ujEx-+ItkA&?}shHj{Gg zRG*EEg4JFqaN5j=bO0e9D=F!~0|wOnD36!p&7cQ4y(AbEAU>cNg6~4OaIJuFAR1;i zazj0qYtnYqF9(k9i`cbe@pOrU{woqsz)d8?MMcHJXg+Z4^kt+|Mn>qiVSxmKfWVp| zeX!G@Cq;8oi{DJ^(r(1`**9*{4m>Fj20>I*WR8!}D}gXVpEe*%YQLI?|3lh~iQ6YZ zpkA|meR|9GBfemT;O#Bd7@#w&R0^SWy^^#t?Nf4OQ3Zk%y z27DgAV|UEKgoVS}HEWj6D1hRIG@w0wQO_4lAf9+op+HnGFCYK$LV?xWpa@C;1?HpB z{tsgUs|eKur#g@**uW@Ql`RUWCiu`Ao(C7?BM^vE57XD78=k5th@e6W1(Z18DH2r{ z40s4a0S!K;H_B`r*m~H4{YUpl?%KKRrG88WJ%5Y?1P&&|MME1rlz8aK$xF8h0v*r1 zSBC%q!fDZK5HGdBF35o!?>6XHvk3shr+sxL>Dpy#rm-Nv>xX#*V5kBBn@?>t`2R2~ z09L&=twp<`1OSB9*3>Z1f#x6yI(KSQSK#~S3!EIET$m^zi79}-{sVaKA!hSO0tZ40 z_5XbHj@_{b6Mq@iE~BY|INSN{alZiHzM}f}+_j*-r%eHD6ZqSU5{0Zh;XjZ1&;kM( z1y4aBTU)6<>-poabXZ5HAaE6tqrvp`$vjf~0_|Iy14Li}$LG&SpI=lhLZ9D*1x$Q@ z!QVfnk$;Op-^L%?AHC6UB z-}_nhmhFbj^il$Po|Ek22u~#t+NNfyQbx%KD!+d6=FM9L@1!K1AofS}98&604t zE&v91uE-e3#^#^=_5ZNGekRKRy8xKpzkC;LVnJIDin0$#qbP#Zx2N~k=(;TZ_T^<*tfOn&u zkH@3&hq5*WBEB=_NIJ+ zsTds?t>y3jJH9(M3^6vP;{h^+;0ay_@chjy%74VB{2V?!T}gD|d=K5naN|dx(ICBH z$wtk3eYoc&Ui90u^W8jPHd!Jq{Bu zB>P|DvsiM_pJo5I)4Q~LYW&A1&YnJb?8qUMdRivEm#;ohay`Y*H?LhheM}k#{d1=$ z!|B~iS?t%mHoZ-|r)SQ}t=i*K7N212)j2o-ce(M^+bl}LH&0EyapD2}%^#xQdR)Zv zkp}KS6(0HH_P-+H4=4UQx-Gsq?a7!pbRoaE0LweRc)6@!+$MS&rSucU^2uMiFMOX5 zjZ#tf{JOO!c>0~2_?^4)JI}1=u79_|ABu)Ppl{8;?fAHDGx<|@eRk>2U6D|?3x>7MY@E*PKJr5w>X(hm zShElbIQ5}LkXf;a$A=cB9*{j`>$god&Zj8EnEY*ff9O^Gp_lQ8PIu6`t02azxnZb( z+YhSWHuh(vhR;WYE&}tBiqk)C=cktUyY;6QPo~$)te@H7(H2krxc}7Agy@J}b0^W4 z?p3U3k5{)GJW9GNCNc`MrH76|#L=gI;`-u&cp;MLqFS|X6JA7!=LmKAJBN*YC*jb+ z1BnUyydKZUQW1t8hz%Fc~|Hg-@S7oF^WZ?8RHWhC*t!*uYD;Lzvm)ddcCpwuRYQGkHvpGs6}cc z%R)@~mgAz4uzY(gkNm z%>z0%&Wv#m7=r9{NFYt8k`uL(oy+U{6&oh&tmvC$Jsw+s@whB(5;YaIRigGAQS&c_ zttmAtt{z{nezmymV*5{dwA<8emLx^Bpq@jLvl~5g(h0^!N`qsz3`f)5o|VvZ!#)EM zwvQazy>;V;U$2@oW4b%7$$M?0K6md)axVrZP+?EA7ez8Ok>@l`Kc z^Rks+y+`wb8)ps15igwMX?4|I-<6h?l~-1lXxN>UGH3nY z{=H$_o~+F;%^VztiX*^l5LvBaa2&WX@j6Du2~@Guy1pNyoo4aDAWcVxFY3cW%8#R( zj#tF}S`_??K#Zn>F_lU-{t4N}kC}`q1(T5{P{B^iB%Le4k(Gj7nTv^WaaY?~!8S0P z3buPzfRs1r({JqZFSCy9$32*@-@I*t#_VOk-+5pkW38Eo-o-#EX7s-T1`T%$-KP>{4|>_42aIlKVbIPcSLisGJQ{ETG=tfaLVi*J_K%mKTW3=0qPPC_9Y(%o zfA{pX!TrKeEpk(+7A;$adm*&dRBZ#Q)>PeFVt`EoF}k|@nnc^httVA+WvXSN*7k+y z_A^hnOtr|rh|ne&bB~s;>t5m_%}z4GxQ1pOnYJ53s!i8*#dWFKX!l4Dt7in7P3hBj z*!*`hbF%mD*s`hBuUE|`M#Fd4f4zrnc^fc#>yFGl2agqoEz63wKlO{nJw&TKTQ=^_ zH7~rPwL0_0Rhywx<+C_2Wm+R%z-e#0=cBV{a4X^vV?U{RHLaQnoESWuK6=gzuYqq> z+m&CjeA!JISFyeUt@eC$TRBu(Syi657q1TA=ZsdkYdrcjP^D=Z_xaUOH z9L#L9ZSyy8-Hx4inI-k!rhP=^ZJRf2M)cj2b-W0gb)s&hRq-Dl9EO5yH`N?s!t(X6 zkz37N`1oegYp^}xd5P7<@YY+GzkfOp=a8|FCn=Y+X@>8uGT)LTk!%N3eU)Bc4(zNy zj7^gjw@tYkje4lp4!3?;Tu!A{6&=~B0__&0Njr9K|JR$&M0--|>~(+n&&F+g4(gsfhbPt0#bC1OBlh}8_=*6Gx&AsCAUJTj! z(=%#5*pw+ZeZFlU3mRJkI(4iNVr}cHoo~+Vp%lt{kNsz+kA^}wd5&uOOb$qdRu)*!<JwyB;%Tk=OrSmk zunUm%Sd$8=+~}f<8sH7fk*WU?jeewo*Opob9JCe}^`VzRl^SiN_8-)KmuS>M@=M<2 zUS%|Dfj41NSvS=ZRG-Q1*Kf%5r_#SYhK}@zqo1wBju5?c%00i&WM~zYDgZuP1^kVK zt12r_{(ki|b7=$@0v6uBZVPZ%$dYcx&Zdv&0bV-jjd%R?NOl&V!L)}Zk?x*@a)=aq zprXN-e)>-jI~C2K%&N25J2r0+wnf0*x&7-m zlrqz%J@UndjoWq~I)W%Vun)Ym655RRu(WsD5<(H5Fs#;T9}kCj1aGx>HlQ|rz;zne zA>alImMYT;)pI<=4a=U@FGZan1`yXxEvC9o8a?YdIHxFc&B_IRSto`vukJYer`eSim6&TAF3sJ&CE%Ak zH~eZb+|rrc;HKBVMu&y{N3yXbGKnxtqU*Fw zpdt;^4dN{QQYjJ?7Jlg?ZAIKKM3EnOiZq0XY7C{=QiF8$z5{XAS0e*w2uW+Gl~SXN zY=&NG!z-yqPJyNxBTyszh}SpQIr|UjJaEwP>8rlV!FdsQ$X74lZ1nipUw5&n1ZIRt zM0TwKgFKaI3_hD@kb70+a0$OYYE#9#B)qSjC zK#ACt=C~ofCDB3Br`*%%feV+!l+?+iXFmJ-tFOHD-0EfHx|yw>?zen;+^K9<6^=y8 zPwwBk$vESVojbSwWsPVs9=_NBHC)SC?7}y<=TVEhGXJ0hCcN>%KV~8~MJOX~f+6nM zm36WVV?f}LfY_?=@vjbMAKL3Vq8}wa6`m?AgGW_Y;k;X4p#lS`t5)G~xka0EvY>>H z`0eTy8KY;ef92`B(tF~Dk*KiCum`_9TLqE>{Z*VkxP7y@Am43g=8mu56#doBSp4QU zo3|xp9?UuV_3EjESpLU`SFFa$qC=n| zj>8UWgC4viGM0aS@HC3>d-r61`PB8=7pL6yo9+7#?%%i1*_*O&|AB*9hj3%Iuo9CI zEQ7<{EGSFB3md`<=ic&CtOivfv90*--h)R^oGB`;s0#o4 z$raZOAFU2=%O$by^IqR+S2YVqqS4AT2eE4p|HF(;s&D6iKABHm<7OmX_tc*N8G8>W z=I;As@#q11!`|%~?h)zkV2~+c6yy&u3fce-BIY3faIbLNxNMHl%Do(b){-g&?a(Cy zqr#vQLMin~N0l3@i1@Ln@LjD!yH2RCIu&lkR1FN2s@zhkP~{+mQa1plwy2NmMr^l;*p~{$8wLKu=ARp zJbkttv(;TEQka8)snC#cXfjH=Aa`Gm=H+8JRMZOSFNONM`9&!%Y-7HnX11{q+(y2I zx-w_up=P(`g(s)=RmW=Kg45RiB|qYXLnu&PQhw?HwqtzlWp4W7PNlu%Y4?AMlW2Rh zbB}#ncir@%IKS`osl#)*V5bqxYoz`_^R)ha4-D$hz0CFW2fl%_o&r&|1?vYw($n~) zL~O>{x-#&Q=s#^NOhw0F78XkiO% zUL>Bh@P&Wp<)6g$u>E`guztbx=?=!lwx9Ciw}+1B<()cp`V6kcoGr*dbNbZDQ>V_H zVHs{8HeVDY@wJCZE}%aknBXL3aKD_FRxTV;F!0R4v_V4_-uB84FKqg%yIj7)_A6}O zU0Qzle|~j`G_&qEcirz#VJpy$HnXB-C-$R+0npS=m$~`3_i+fUo6+E!rEmQk&&)cO zx9_v1<5C8j`8!aY4disXfyZgRG4xSy^gD%|;D6$G)%E7Ylw+0Nz$+!K2qm($fKx|7 z=ZB)VpJ~5y>x7^=*6ZkZhQcW5G~rKC7^68?Qy8T=+tZxYL21tEoGQnt)K&66m?Gp3 zXn~G2-Z+J6i(lV-O3peRJn+{SZ*itarzPF>Wfpqt78Tni&5DbP3eV=BIhBW-q13LS zk<@@H&0$~|l!g-Su~TOmz|Ma1`u+I>PYrY*uKRwVHefbgF6GBr*=O&z0vu$?KJ!q& z^yTkuF166dt!cO@hZ7ayV)RMiW9HT`S5j3MV?6Z27rxrLYY%3R=X|wl`tU&m5d!)p z>dRBCnj<6D$^v^6Wg&`)vS8G0s4TEO0ZF%oDHQ zaHswpE=GVnx1tD;)fE-hG0p`*x?Pj#V(c7!g&MwS9Bh0#`tr_P_V%_j*r>=keCW`> z-(G&LHQk<3XZ?RpmX6k71^=r=hRcu z|GxiKH9e`UqA`$k5AJy$JAoM##iiv3PJ#kKN3PvHT7LSlY=DyIQcb%uH-B-jnc_Y7 zso!Tp!AJA*w!eAfIGN0o0=E)H0Z(OngI`Gu&&fnV0>1PcahWs>(`?GsGc7DTJxQ zi9UP4PUy_gFXEZO1BZ{D%m=3cbJ)CYo%M9-I(wb{l)W~zrfO~d)sOAZ+*^z4E)tK# z0l2IqIk|Z!3vdeEvYR`$RgsSaDquY-KiLMg?cDgwrEo3|!)|ijn%`yaL5sY+(+59a zag7?OG;lzYQJm8QLzTMOT5ohP#P+L@F2TWU$;x5cF%IVI4U|upS%75?Vjau@Su|+) zp6KmO(HlDPcuwY{A(Mevy}7!~LcI|Ujow06Sb~ODdq-G^(=kQgHxMkmx;G~#>*?Gw z2%d8w**1Ot@}F%w#SOt@M~@!<+iQ2uvS(Ve5@vs}ugD2sj1o&(3C;$psW^bH_LD%$_uPat0uA%A6;E4NY^hPR?If%^9ah7onXake>WQ z{Ede}T=<*QDX2FaQOx)oq~@_lr8mVsl->x8KKsC=70`bsYPODI?~2}D7rogDb`5`H zBF-qL_y-dJ{CW+&*%};`-l9?-YY@11+M`FW&KS+WI*R9PXiuSgPS3kx(ehXSb)pzY z`15j)9ozGp^|v~+!n2#aytSY*T#4Pk0xAv1Mr11i9;V}$C=CJWz@Z#y4Yc2~^T9AJ zyV$B9DL<1HB#dVMPG<>XnNSrI3wYUy#`}= zulxO;{b=iSGC%L%FWflUw7Zw-8_9r1Q54!qP*1k#$?^Ql=!yOnt0xo~0|5-u_4HIT zfR)F+BU*Y*wB#hP(-pZ!EGqh3Bd8@C`wTY9CAQ~Xu6UPor3EcvH{@zpj%;(|2Yr_i zzxrYf%b>xehiDby55Z(##6`C*f9_A&#bxMKfAYlfrFaG)dE$Fm{D`eM9nX>5lzaUjSf;8aN=GPZbli_mOqu8~(fv+b{ zjK)xM_!D@R#z7l6NPjXo2s9ElkEjyRlZszK98~@ktsAQ2YJd8fXzCTA8lePi+-p9s zaM191LpFR(nfRq}kp9H@Wwo_*LhW=&R{kW4>P@1dK`<~i9vG-EPT|1h^3|X2C@9Ae zuQMm}@{Vu#bj_mZ9A|dJTep^!2e;FWuIx>Xm22$Tcks}Woa1?#`#S}0zI&!V_s2?MD|Ij zT4Ew-n8dQ64(V&>)}fDy)qO3BlE_a*gD;D(Rn_n`JJrN7lEv!!GoGgO=YW4ue@^>U z?;1X4ba(F$o~Xf4x!E|uLPjus?Tv@r@4ENV*Zz`SQc;ee#q?{(7tbxT=eV=eUOih` zT7*L{AOr+NDo`1SgVv55#;Lh|dm5^}UnpRQm zdBbRf!}$6%P~%=y*Bzc=rt=}ZgM=u>!Q2BN2};o1cRq+&NJve^IZ}_LqgnCgac_z0 zUV`fEco$4xIbYNxk2RHNV{^d9UXLy0(G{39%40A~(+3@OW3TRgy7y2JN&2BZkIf$0 zECmRu8^_AvgooFC@ZE`WkdETQeCJG)BY%JAk$JQ4I4###&ABw}&!Cn3hK&$)LydQc zOa~a5j#@d+QTIr4wj6gv^0sY@yD3e%96ynLH!N^=>DU;gXiqhOh5(1>l*&sHqprB=*UK>N0U(~&|pk^ywkoZ3{tu7VBC zA$&k{7U-j|Il3G*$08O;0%(7%<_vwbWK)NgWCk;8?oH9$3(%Y!@5K9VXJGSOnp3c8 zgFZ6AQFE5ie%2w~_VvZ>WJYU-O3s9Vh|}RRx{ME(yT>vvMR)wYpTh{(y!`pL(-pW| zT3TF~xBc@)bM8Ei`vFC#kDKG8K5V+18wkWPQtjJ+@L-mGh`}m_J2zkyV18S+rD11C zsWm4jSNyUO!L-^|o$_OlQuH55gxeuI+i7Pe?D+0iE3I^QygRPz`1HAJKHq)p7((gU zl9Cf&zq)+U4RZWgO;eH4U~J0BLA{80Y2c6qODc{h4p{^NITO99a0iKLsH{zIq$Mic zxn5qaJdRY6dV5{;_B`|!inp}Kk(l^;BYpJ4ovrDk8{=`7)*JV6QuH07j#OI)NC~hK zltlb(4kp+Ltm+QgIsi`&P9HbW- z+4dlWMG=@92)9tjp1@cd9ymn*IDR7UBtqet{Cq^hvlmM#ERTsgE}57;bEP;-I17(@ zLvh=``S4a}LKJH2KIMTAw;Vry0u@j&r|dsHzhbc(>4y2ryeEjuqUdv`=iv75hq+j( zF?heE7wt}t3RHrfC<#_q6 zU;OKho2JdZ{k3u{f`$*g;!ncw>CB3aMv*-YB^qs)gNRH5j-)YXMv*fAEN)yE6&Hs~ z8Wk6v&5t>;Vp2X!4)5X;4v!Ii_i}o4f}7rZ=E|Rco12$+^32(ivhso*pRQi6Fa5*G zs4bwQOe|7E9L2|a^>TZp`Ywjk5DaM+fDzRPgtS-(V@UIXk-CZvX$BZs4GATXjl3ed zT9326E{a#Nz*xJkR7g_}7SxrkPX*TFtReKy?u(5Tm|P{NGiD06YYS9Pjja`GeXx!XO_)sIP)K|r!!-fld6K$ zZzfEb`|R%zIcNHy%RDw=%1?av!McZWEsi5BaX;RhU`h2zW;Sw!7o-rP8Y=%`D@M80 zh_aLwqa4L62z3w~nkpz>;k%Dfj_*F<1UKGBe0oXLvn~{gv$XptsPp5KQV+`;Ht4*8 zI^#YLc!eXiU$;$)ryd-E%|LV#oMUVnJcQY@2Xh{aSK2}A3OV$y`zh+SHkj@f+X0I~ z#M!8P2lqmOOTVs!+oX&$Q%d18F7#r}jLxc@?aoSj!<>s&H`iiSGe&~j&M&7-xaF7I zPN4=|8Ll|J?emw{sF}yHs`0T618y)8363L$jUL?_aFn&o6A{g@UWlyJ^BT}DA$$G&4ahqZ6jn z2&k#>gFUV>0ZdclsSth8vhKbID7lJ097fq}Q z*>PcU5rtq(njGw70rimalET^89#L#SA((rqg`~-DNf+T!oD|W7RzwEE3oA;!dc!|h zP0};~=taWKS`tTWu(gX^XgzA=0D z8?l#u5F2}m02PVykf0ofLd>quQ^ZapfT#{*NGPr%?pe{n z>W~vx8PEY~bZt5yOc@|5K#ed)#^*N zs_~X~g;*815GUh@g8m(USduaI&X0-;Q6p-3;OQIZEd8jKYj%>~PEek}g5JJOPuw$c1+H z!{eQb3ur(t8E#7^zxwMv^QTRk_j=(U^8e8C;pyX-KKOYpcUwITu%gP^_l`BUUpHdn z^6DC>5f(I`LJ@A*P!$!#3%WLlRRFhWjr_rBJReY@I_LwzP_1x?K48aH#XTePUll6T z9$*5sk-if^A>RWWNhIx-a`0MrqToP>479yuh-UiOuRqM+MCc4%tC4nuIue-N(QA0D zTbEV?AZCu%CRW)bxMuG9+kFeB>+_l|aYp5im7mvgn;f!tHciBrwCuC8_pDns55ngq zQ?Fh6$_E00z$ddBf>cHiDl0@bMJ5O;}t2h))dfY)i!yXO$T6%zuK@Ewp?6#`tqk9&E2Gx+Pu_8C`oFow_6os}}pj*z$m z{pVFfe>3X>QTQDFgiY3t9Umk6J%7J{VKw19NF1y6a4^Eh!G+A-`;a3ZJM{cr*AJg? zmnVFV{djgZ!{jvC+;aNdfO8{VzU%bl-_~S+h?>7T0M9v;;x4{ zy11;91{HQ6H(~eOg6B~Yrecl!BG*42Ty(8A`xeUVotmvvcqx05vijXf&awNG`|>>t zhNmx6hm?i?nCp3WEHz1jVWKFBAjw9*%>hi{X!V^tHHr~@Yn(oIw9SKvh|N>*D&)or z9-^!l)wG9jA4amaMho5&!BcX);AB`JhPhE?O=wd`HqNP z&Z0x=*cUzZ+I@?R*g1o))&#)IoQ3}f?Y(1K(A*()?yP|I0poq46KJYiyHnr9SX*Lj zWt- zag5sDBxeV48&T~$ZdtWtwib9(4K9)?2Lx{8k~fZAh>c?|+Dp;VhAc0$_;Hh9S0f+fDMUTV+rxgzDm)sxK%YkIkRX zIV?(d$-ovbZQE?e?^u2Nbz0WvoYnyNSC_4EP!MNT@^QSg;=P9!4;#PK(3hA9s*62> zR9pox!iXtmEeyS(5EWz9 zxN}9+HV6Wd1W-FDXj>`-%BF2k&}D)k43)JD+P7+_Ndw(G1~$zwnSnUzn>2zX89C4c z=Sx&cKyRKdQDdMVRLPK}qqnEmI)5Z6W@#TO2e}9%;;a=I-w$d59xuHhW9AGG@hkWO(Xz+lqeh?J zWZf`j;BzWCH)r%f##+P#XNuT2WcWM48Nw38poo2Nj(8$2I){i2Vi-f_ZI=`yVq$X! z`JUJ@Q%k}HICg;R2{Nm)imGg>{VfE+b4`wINwkm~?ZFei+3S~^i-6|=W{u0Z{UA31 zqn3jX_e0su91>o`8@dk%g5ZtlQ7gMx+#(Uq0eX#+3fVPa`RWesuWT3;Fz3vPr!u`a3tPGiYV$>jDME4VG0=7gFXjtlVlMv$Q?{L<0kf*x5?pwactOA z28=5|DW3hxl}T=9P`cm(7b%2L+yed%_UxN)1l*$1lWsvkx)`+2t9+j}?tjumEx_upop@b7M|Akd24?1JP~C_z~wG0DGP*Q5TS` z+@!)yIMo^lUCf7glJ(L*X;;f~H_IIccA1C_)S*oqZQC>jx}IPuSKnj_2(`<#G_K5( z>#1sTWl)O(5Te4-7}R*bFoh-yu{LiGG{_)tP-x4X17N@`uO`^4ZG@O`wq*S9^Gj8F z`qsQCcp<6E*LXz~Q0x2#QXRdB_Ua|oYAXjtqyW@P4QUt|Fk>0&7=pCz+BOs<@Px`v zeiSN=72-%E4#1R#3{ves6$M%rXH~O0bUidO;h14k~2Ka$+ zFrf#CT`5EW@GoGi>djN#Oly~Dktfj;p%NXpDA9-@t8b<}#*}&yx+BV%HVV|ee3EaZ zUAw8gn7JA_*QCioP?aiwV5{r-?!a<6K#`9vZcjI168#(OB<;1`k;YEV4#JbICHCsGiaddxO$2fr}#XY{TlP^ z*a-xSE^qi1&*}w%RLVO3p_JRs=kcm%My+iYevmZL`+4xl8`ewkN7Bmx#S;!p5%l>J z1*5Fzh{Nmn#M%O)Q$q-o{*Fu9P1u}UD#VQX3PNd{D(c%pS}PMM%mPoCIRRlZ>Qk7; zHhHtgZItW_vqc6%zBWykCKXv_&Lv!msjcR!i*J*&Sn801lqGK)cOLXSPydk%$x?OH z)#wRX4jD1`86``Z&xO4wgd|qr6;I{X6TnlK4P8#nCSQRx4-9CeRcbS54);<~3HN0YYdAf(S21_4tXT*V+UNkpJV%D>r4 z78a>musC9nh|DQ4F9|s>nlXuUxwt zP)e0tn7!-@J@f41A5V%0!H{&PU$pffG3RNHKM!V2YF9$Rq^cYm$7be_r~_jp>rB(e zXoSdPeL+)H2pLA1P&sv;C&Mg}VFgMm_*c)V9clIFrm3OA3^&a#%|N)JB_hQ~;XB~b z+*&i}sLt%EB8m`r+28q*L|CJ9?(h+_)~Uo(M;cwFQsonajj9}|{JA5Vfzh2?w`y>? zxU(<8P{0ZaixK4VMuH`ACp-xrh>>8#gGDDbmBT9u(+Vqd2lBKhukLIR<_>_`b75|-aZuB7#*_bw^#1(V@{z-?T`SVl(S%zqx8AI(9)g0ZcBcZf6qOK6 z#P}}1EKQ6LQCSO*cP148BF2J$+X2(d@np9rAUi;$m>zHbtHG@p_)MnQG^3faJjJ_x z&-D^S?uo0^+XFv2%D(QIA5(N*XU)GnzI?>684#TgAnF`K4e0YYjpQ&L(3-Jr8?wU& zElIW!J(St8VGtuQLq|j;7pZFr?3KhF@g%nkk_*QZ_Nuhixq7r|{RYZsVRUY@Nn&)8 z1tM(tF6%=cNQ@j)7RdAI^?yZhe|voSm|@e`#Ka6mtqtHwp)KgJ3>lz;KOuWTzeyc+ zrC&d$esWhS3Jz$z)yOT|liSWvG4hj&1bVBoIJdr=oSLGsP7E%isb_E|REV##)^iS| zGd%j1F++b0#v(v>G|=;N%+P78S)fD#4IFxf;?M!!H!)qdjRtcogPy9x1kJ5QnliUb z1mx1v0zxxxS^?r*5|`x(ZF@DL@$9dgoDvjT2C5FUHN}|y@X9LAIq{9-=+-{{Uy&L5 zX^t5>b(ME$LTx11L^qvwC>L#iB}-zkwB`-O(tvG<3lJHbvN6}7ohf8fB0J!TY^#W@ z+_N)BM3$^X#*o^W5(BO&MuL#wdnYS2tb3gU*4D1O`A4%d=|HM#UT9c3cIXsHOz$%& zRxD)%;d8PRj6@B4lgN5|lFsRHKqG6OdMR@>8krIp`-(UKG{r)!I!a*sJb`V7zzArT z02&X^red&y$g3gaKnCkt&08=hL-|D!IC`bY$aqqO2XuTeyO;cp$6{|9Gvvo{O7!>i zoD%&Y#|@eCc#!@YC_{M=2Qf`9Hh7@%NrnK}S1Z`pr45N>;*v10ROw&to0pN+9#2{u zV$2JNVe6%cw7@uMTq3MX4c%qlrSexM41U_h^OM!c8iY0azaT91TO2ne<53U5Py`4N zHM!&<6)H_NxVvJQ26;wWGl`b;MJ+34S+uMwWC#@rVW8J8PgdW>SQgqh)Juk}2>3Lt z3@{8I?t^|vdg13*JowI{-d#AFA^U!-*Z#<&Qbql5pS&l1$mEB~X}NQ)aZBZBYArJHI@Me>YVePRR0pIJF}I2S133+zxRPX5o!eAN=EC{dKE@S2UN92!z=C_P z9^E8M*Ho2+D~)n8t_LykV4yOma?pn2xUHU){^6MuJF?N7>UoamUOdSIbkv3depfqV zSccnY9mvwmx1?fBfI8LfGEK7F=F|a=Q&{?wL4v!UJ--LGEFx%9?CT z__>f`3y6L6IstQ%1w_6EI`R>oAR|Y1AgaXW!jREsPexyfC6yuU*^rUTN%YBeQv{nb zgp4YV00uARGh~f&RIhf5p!XY|c=E>ohKM$;y=U^E3HLv_N~Mc(48f-dQ>ENPdcdN% zaL@pRBif}R-)Yo{(N0MS9f$>#lof68B=k2(C=6d?dsIrut(RncEu)d-hs~re!JRG@ z=)MmtxN+p5AK!?!ti5;gp!EBMK*=?wb1;JHj;3s=ahhUJupy#Ry?Sgs>f6wFo`n9a zC4^=GT0)8Sf!c^~83=G5Xver&?MwjIiA>pM;eSIw+txuqq$ttX#9YWcX3PfB7^lE4t<<2IUPu=?^=o{Omhb{xf-l!4<`1Rd;FiTvt#y%+fv|27;+1%9A(s*rExUrIWx zB+$Q#;=cBz^QB0qGJ(=b*3zMHGRTg^cvyM%ybGMWX29n?=Rg5r!H9wXC+GSB!m*v5 zPeV9k@8)j2x&o+>fSWa?2e!g}1aNwqsvOhA_{TE(FKO^Er!2mDC>w0r+y3^Wj% z*|+|_>HSCFUb{Onn3Fp*nD_F7IowGh@x>R_Hzq@*2|+H7Bw|HzYC1CI@=M4i8gGj? ziCiF%))U@PCqv{Yml1Ej~H#5n|#nL~~q==D@S} zP3u2;snpu^esxT(P3CP>Q7{?AXf2sPdcO22Bx6G|^ra+aF(Mea z5+GPpK$bmpl}L8}^x0pzs}bW$D<8Rj*m(`62~J94MlgmS5G-_`=uaS)(vO{w?2pe2 z!#MYAWP>>vwv+YT{WJQHyiIabbrLm@n@*M;1D_?UEM8SSL^h35G|-4QQ8ZQJOlsIB zjpk#B#))^tXhbyikh^E3qR!z(CqK;!hHfdK;Zj94XPS3@(bO{Kc;?!Qk0T#dd=&oB z{iyj}a!C>WM62CkQ5RTZMU(yf{WJTIT&$0f>N6wi7+!4gtX7BOa7tl*BAU8&>!71a zIKD7W%_^j5K0tm&(a>rV6NT2KWFT_KxRYVUJ$rkJ`h-|_64Hm7#=K$ue;CS)pSjll zsPx1951ZeaF&0-hFCdjO#bPi=UU=Zzej{#?T1HISXNL5)(ED>b^^~j%#r~EplrJ@E zl&k`iwimRF7JE^{!6=mXaHIUpAi6rNR2WIshev@~DRiD*TM`2?&-6SGiiTz$7d7!|$zKR@51ti*u zjYwS>_qm5IZ>y$Y3H9sLtt){VqqtJtvVKXZ9$sI^!qjCV5Q2i$tm%h=gFy zkbaAPP(@CkcJ23Ma^j^2X7?Gk(5nJ^$0YreKHS-6fRku!K#<7$;h$H%m;YY#+b54cpOs+hu`iL6uRJiP&(Qh02Z-8oou{%R6?=vc zjbXXkaS(gNaq20FXd^+-W$-vP4T2JRHDtv|q+W6c%EnSP)JT`gK0s z6`3>myb`Gycg9X%RrsFsUeUYF-n)HLtrD?ui;vfED3Dz3Hm6^Ga9-~rH%R9ow%)3F zJXvb$0dC8R6*D3TBu%I-CJiMeBmzjl)KExQt=}n+S41AJ%7##f3DwU4e~XF4Orkv; z89=_T&(>(CQ8jc{hG!4%b3O~HA&+^K$Ges9R=wlC+w}VhMA%LKYZS=!x;KF4`m<-M zMoQ{%Tx@}gF4J6*lSXL`lC;Z!wjsn@a zxh){TI&08*BR409g6CmeSPJ;UW4Y!hH)TWrZDuqEVVm@ zqOTWuSUF|1`wk`Y=hMLzMs%AtT@#$lCpSF z`$?k4j11<$F&OIC+F~vj$Q^Mxa;%Ps-Ff$n0lm&=7d5iHxud5%{MK8=Z|1+*baDEK zbJ>L_3Z9%tf>-gghZgo6Fq65Rj<2edqrRK$9heZvKpDxDA5qe~G8AMe%Sfsx zmf=B$Uuo2v`35rN0x*jJJo}&xf2c67 z8=0}P^0n}*`L8y;W!(1`MdarX-_*U|RCSp_-xOtB)qvq2nq;z~07J73seoXo9ifDx zpqDstsw*bV;spQ(BT2w4sA)t8pM>~QBxF7LS4nNj8z24cPlwWC|5YiEUNj3#!Q&S1td|!D&`EExZ?Su=klLx zx?t1=d@<3>$TUo7yfpkurDTu;_*F1+sD{11MHn$8 z)hdPtbE$h;A zyfl$hci7aO7u9S*Dmj75g^`42nj(o{OMy8t|^O9WeQaZS0JJ5Hd6Oh^paIQZX;DoJI?7F_+0V? zO(x_Vqlz2ek!zik2I+*ciHW_sR5OX~9IkWDgL$(Dk6l*rRAg7aB z>arm&Wq0Z}>PBS~YL}!o-!Syj+dEQQN9U1*O2AauK!J0TI!2}U(@dSh95YjrP%xqR zgz5?mtC-L;RuY`{6p%y>yqrB~>>X>1*5t2QGI#iZ^U9(672u9tM=XGA$ccPnrI2i1 zm{Dc#KprZ`flVckg}fgu2NgeAuknetpo9ca;Z>yCWSH6{(qrUsc>e|EFmTN6YpPa< zpDcKC>FVo-{V-8X`(hs7@`fExI>@sks6*s zOs3>MPS8KlIKa=qU=$=2W4m{vO|a{3Ndcy~@5$td9kB@=3S*CH%o;H2w!+8rA73(S zNWb$Lgm*7isKg&0Ti&(vpt&qNBj}X|Ob5qkf7`#&v}z)*xyZ zL*V?ECKI^ZgoIoUIuS1!MFSQAF)Y+#;MAIfYHAI{;4y+~V(33=arCkBNAn;3-hz<+ zNPl{4d5=y5ubYedrQ}?Q86cJbOK}WjpfP9NO;N%e-noDvoP;`(ZNMB*mf$v!hD&`q zSz&~^b&iAscxf_nbe2QPF>g$_j!F(P6DH@-J`TUq_Mn(iphAsPJ2+f&i}h&PBl(Xk znK`)c_b~`{vkO;!dvxqS$F~QSX|P$a>SiV&p)!3S{+Are7@ zm@-Ww=%}tr5OUK2NU0n{48p)eOiPxTeMj8nJXEqWf8~-H-$xAUKB?{C8gB2a`_7cO zDdB?fAbqTek^#36e5eMK=M=;9dZR^Zy=S z-m62OYiC_MgM-CLDh)t*Exptw$H0+Lb6B>1j3}JA7rl)RBMQdOP$CgRPJ|+22vkbx zQs*1I!O%@NWTr_-%$PV?h0oa|yL1rOK*XrREWO<91ABoH$~j;XTef1xd5kD8yJyB_(mc1OL2}7ogs*~D;)=;8Y+r0o-T{S zjg=&jM&kUY5d`Whu!(DX4_#PzU;cfKr}n?F5abe2*s|=uKe4=ThhEbVEa(ZRig-*1?SCxAyz74 zIlS{#N(cZ5%zHbPd&HZl2U>|#8p*;Tsmi0GpoB2L@ZQpU-FvKi8&B!qvo>o`$=W1+ z5dpWMD#B6A`p2r}{jTacWx93>p_6K;i!|H@fAGDc8lyz*_WKKBun8I7)hE^?n1{nJ zytdhb5fVJ%7>pXjI<;RQ*3eN;?l_h$k`Q~?2y-xkARnS2dJVbZo}v}`D;j6?t0{#* zqBa3XUFB3ghR|Eqzn)mpw|(~v2^HcIX0(A=gX9;18@+OB!p8nMenrlx_VOI z?m2rT_;SDKtZ2C%mkHGkwTe+v_~PUR#7tmk+27S z$f|ZZFjkCE=T|jC0vz742UINxX$~rI(kVD0@S3TEufCGj;5tqRn;2OFK^!}B z=)hi#+}yquImVV9yAS4^I$H*2EOO{E@VbgSBg+bwHNA6EpKhKI&g61_6dlRgG}QmPpCCjkWRN*o$|jq7JoHU@ojZQDy=Fy1S1u#<1>=GFjD8zaLuZ5~14h)qnK9Dqw8Al0Z4C;90 z+&i8>W4pG~o)Q2ooW(Ftj$Yk^(bt*E-o!AJNvtPZy9)Hm$8#1KmrVu6OcLbT)Q#=)#=8-fw{EDjf)Ei zfI)JI7J!C>pdVlxN1Fh-g69YV2#~ z-t6P-U>>p1(s)|8elwRWDZVZLwx;8Ibul7fm4e(`d4anzV*{xc8OE_w`Gtii{W#$o;+C(#b_TtIb(X8S^wO^FYvEJ7h-l2>P_-3DSrV0Z!;wDJOhL~R5} zvSrlopuu3#OfO*tlhOwdnQ6`GxN=JgcAAIp=U={^5RbSx)SO$7@c|Yh1q!91xIe23REb%HTL0pVnYS&7 z%(?1|ya-lLAE+oT=Dbvdg?*XZHtyI@&WquW=omh&OWzrVx8&c_d~6TBc+Sy1m2+r6 zQIo63@{`Fg5lav3{c5E>b?B69uDN01l({!@?E-#SJF{pt>qzz8f$F^&plGtjzohdm zo>x1#_~B~t0sst$h8r1L0ObP%)vQ2)0OSpN_4hyb$|ryR=m9K$?XGfLEgu89W%-Bp z@7l6uH&48kR#YB(=I*Io`b@j|=Hi?3Z)!Tadnf8%ra=|zECcIzwqR-+=07KH-n#9Z zcP3xsOmVLnI&1B3e)IN=&oAWi;rmp*o-)UYL!biEZPJ)Nn_QvPXvjd4rpP>L91DNy znRNFDflR`1D;XJN z_wU%W>)^4I`9&rBp1N~Nr(V~TEwmP#UEnTUGP0`?0GLAoh~xppi=7a`_H9`1KYli4 z-1u}zVA|t<*bW+TG-t~z^CyV<)%v|rU%FE>eV;XVIXWvG$i)Ao04Y9~0LJrjlPMo~ z4&b35Ea2P{7y9@8P@#W}1&|5~{(%I<%zB3j zfCr2nKWW~&f94#|-j}&!!#j6G=3Msf;R>Q4*PolU3-Rwz&WTf)V>9{c9+Pe;x<3E< z%Z7F7pw}L$EHBC@ZvFMJq-1ooG`+=h;_I-BOwDhqO@)-3I^OWj6 z+t=LzweExc4CF`;FZ?O)r>5D~SouVMql9T++l2-6zhQS3Ea=?xn*zU!~Vh(hRb6 z>_~Rj!QJ1yXiao6r1^z!useMyH}^j;EXV-j>tL@}&eqSea*cWh^`Uga9;ze0*-K?W z!Cvgr&0R+T19HJ}v8b;b(;?=2R&RhG?02Aw`y)p)@TX6>=EfKPlbd@8#O2#JZnfsP zvzvZ)w48}y?xEdVHY0!?`tFfi(>ruacdjd$lRu}~kWTHrrB{|07jWwP-ap#^J| zuirccIS#eXNGB}EOnL6cxlA1M#wj+^^P8=e16`_Ax`WdxiRdH%n|Eqiy}JJ!SiNMw zI^zM^X^CEO1bn)C%<@6|v3%|D>d8oqt`LP8$WjJ zXi_}2`u=oxF?y_?NXJ-Dt2bb;bT3#ZR1X_!YWX}9UtRfX`O5BZk^-sjW+siKasF91 zHwWCK0-)6|ArI?E-b1ga{vm*LSip6U{^{`X!w7y`KE7x6>{+bwulmQXUE9IkxBdB^ z1*5O*Ji2s-J^k!-cSh2H4(+&p+p%UxDo*@y-i#S!wX@g!W&4gjS;vm=d}qnj32OD! zJq#aUN1o#^UqU^W52{DgN2U|hK8Zd$`y|D2{mS@jU;iB}0{P}2#5{J(#{?Z2m{?5$ zWPRfNGy#f0{C~p4X-nSS2_x9EWBXs8zG0@+a;N?LpPRs6|G4~yQSCa7DxBs_E1Bv{ zOYDDDTL=K_k1sp$nlsa#;ZC2rPq7Tv{5BeDIB;7GCpujI+1K@rA252YnMIdG{ zZ_QUnbF<+G8{WNxyF5tKAO7vvn|^=yypioXjwqZGo>Fy`FPp%iRsSxaddoWf8=ngA2fGBKa|4B^MmVG-XAakP4_(iuUj|1 zF0bgudVmr@&;zi1A-pE&u`H}y01zOQCuaS9#RP^B1xC;Ylo593Qnaqt4XV z*$o%I_|I)Sb|bWHcxk~TEZG@5S(*5Vm_=)CckkM@v!0tQgB}^?)Chr~zI9=bk*+Qx zoig;=SFNCactG7=tTUFbOr7DblM44{*+Bfkuy#?oGqMgBj+MLPnoL^o;>O%#V0_!Y zdU^(wIBr;{F2mA`#^;Z()3;;iSy*=JJ)dmewsYU%+(W;8;M(!_*w7efbZC?_61Wac zYgJb_a-(d2l8@=x9B74S=uPd*CcwodK-;R%+kl|96~Or(eucPrVBMa+3G~hocW6Bt zJ6(O0Guj>Fj%_?{`u)Gl%00Yq=eCXSFC8~FeL%m_1-uUlB| z%-#0JqDioAEZQCAj&w)3!$;~>!@~8ljg6a0&5Uclx`T~fRe!q+FFYRS0=W4}QaiM| z#+x(?fLl=Iox2)S2f+6qfVETW&d|^>XLx9YJu)=P8r^8j#6@px%>}jDmbr1=-3!v^ zI%7&k7vS$R#@xQ-^W9r_?8(kO{O5hZs)*sZRnzKy=pF- zI(M;b7t6LsH5fbN;XlKI59Q_W{AB&@rK9YTg(IC&srRq{;!yt4{YQ>xzI)3AXOuM( zQW_3vVYLZdtup{eJo>8TDi{-wHq*GNV{cpy$5{}{%z}-QLv_etVwb#LUzK+g7{FDt zM+IkGvTEec5RSp2YSf~dw|!;%_8qiuQ_(>4-hF^-qG~Q0%C@m;d$@yDC#T>1PUh)K zrzG>e1%)H>N2D(M->fRD_{iU%xOU9Qk$_nTZ;zN%e6YZXo0I1#-u}NzTQWQlV)B*wZ($6VEQi|x?^WSG9tLF z*6A1O?+m~T4|1Vod#E!kGQ8fX87n{j`=4K5JfUz{{;+!2toZ1wzr4110+#3uvt)^m zEOA)>e*OB2I%SO{BG4!E5C$ehCaq8|l3uHWQ>;d9n6L#ta_%)M!0K(>)-z%4w?fP@ zb(d=-GZl@(b-OW4IlU67Q?*K0R%s0>7+Nx1dj zDny%346-y%0#M9i7-?yqL4Qm0;alkY>+e18sN%G98n8C*~9JLOO~QsNohuWNw@% z6ayWO&ihf%OdunOR@07IjnNL#vWI9#*;=f6Bn|fUBbX@)a=NSaxUwF*pVR;3fXe=7 z`xgyx`diQlRtfXsI-KtP%sPxtw28?8M1LXTF}h-{I6S*dQY)0d6SIcXr%B*}hF?OYNfnKV$u7IB6uYl2-y69?jfz1cTF1>^nC`qU#h&BY^ zh;W^p&LJ$q)r+uuIlUu&!hO&5Inc-HZTC_Oz`u6Ir#g2vE6}(MH>YFhA$0HzS%Pm) zPI5eUjf@uP)z!5S1w6ybypFo`_0EA6(3<=eU}SiV7KmR?#}L-wiX!apHWU%*Ro44# zuhYFMdPng7b`M(=fKPPBCp&gWTmj}1rxZ|mRwTY{RuBlLz81Iwdc?CHUOfZ60)lDp zM%UMRU29lTZ7WbpAZ9roLf#r|=)vwD?P2!}_d3%v)U&8ZRZq89q$mE;9sdFy*s=zE zqeG9_MJP4sX`r4S0;>op0*equ)V2&Z?lq=#Q9uy_yG<}q{8AYx4&)756BnXa;)*ux zu1>dT_mUok-OqF{?-A+l;O(ga{A)+Py?d40J|&=oR?g)u#1jIpphAZDf|Crx5MZJ+ z)O`P^C2WLZ6hTw+hK0}>F5!gZOC@xG%$XGcZ5ck=UFo!UWeIjix04NnigvZTRd&zs zcCuTfyVWg<*T-Kw+4}XJ_D$65OR&>kK=C`xn)rSo^7lw69YMW6+&0FHg72?1;M7Z? zAvvk7g@?-f2c5xRfYT-(3vk+n^a|Xoxq@hCr%PVfaF@a^gGg z-7DNSiQ0jkmWkSQoF;DLL~k%q0^dDW_(=a@JduD8sFz2PMEsaB+d;n}hc%JZ2Kw!t zi|eYlcbYZO2Ba;>X%o7_k=M7O0K0>Gwbjw-bg1*e&Q2$*BNhW&vE`MWw)kY51irF! zc>=A)X@-QB$vDjuC~`cQ2*j7R@zU;Sha4Y zT~rHN8A;%+9rk6>&7;+8TVf?OUplG<&G`t@U|YR(5?|Wbc?hnWL`kc+uEV#+YrBxO zEwAld73~ncI@0mX)p;-&{8tB@yumBm`jy?ExUJn*?&YD&oR&#^XG)sZ5yB|PB(gb* z+DWY=FHPrUtaU(7X&wGcuY;r&LK?$nl;Yed4$cc<%4j0rStOlAN%N(hmU!&tp;k_7 zS6+eGkPIk*=;3m|cuy3Il`3p`R@)|HpFAz{016fc|A{s3Mw3Tg5su?$Gl ze@T3^8B_#uVlFu5VY`hW2~3lMRPho>T)cOrWg@ePk>pbd8zE1YO52{eJjFORPp@2wQXkCXH^rm*PWVMFGd!i4d#T-Ay_1D^ zs%l;MlhW2_TbKN#O5O=?+R|xZLryk4!VbI><-~X5I3k9B^-d0K&4HBsH(EPYMC)>fi)c&xvV)iJzudkos^7rUvT!ldoo`@d zLH)Rx<3Y4FZxD)$#I5u6vj+P!_@CAfkWTc&Nqv~O7V{2vW4?nW?_jqGw>*5=q06e| z`FJbXhb1-}d_HHk1)on{*zvVLKO*+wKi`$-QyY|l4g28pou*MdKib@Ck=-(@rPU(R zoX>XfY>r(wlWuLX1N?%l-M0ff-i?dKJr%QdOV$o=hreJ>1#A=Fk}<9L74O+r<0#f1 z!Luuym$oQsp5MHpMMZP_QoIeGZQ~-a@aB^O(6lPG7g{S=z4nEF0@t>&f=XkPABt zK8vH}@GY4nj2Z5bt#eTn&x$k-H;FVYZ&uj!Ow-C{k*4^6cpm=cBF=v{)7~jhOFxfx zWYzjS%Uhd;`Q-ldD90*CgE7mS;rq46ccD89By`@^j!Tj>r$z5x2%$ z(-WakTo^ht^5Zk`4OtVX$~$<5jc3@GltO3ujZea2OYxjA))JBDa00U$9n7`(&w*B| zJ*Uch4nC!y!zs*sj@>YV=Y%hgTynH=cH`(JRrvid29HOv4o>DYv$Ea9s9py+RorTC z9jii>&`emYz`enHUYQJ8ge;xm>$M)il@auMiFy6hYQS_oC7iV7_xu^=i8rHw6W;;e96Z5NK#Ih#? z?;HyGzZ)C}9Kr8arCANj8dY3W*eJhIyTLWobtn9&T8chF_N7!oSEQD)UHjq2FD0jVO14zZp?33@*7n$m6X3xRnMwlksM9gm%2MOno^N$;rms3&QCZYitjry z-;c`oE9LuEVpUQlzF(dkPC1gAof=LlPmb2Fl<#v24xe8hXUBX$g6~J;`TfeeR$^sR zMZIYK;^dr^BPqrBZaKb-zv8=<@?9(DyWvn7?@f->FRND} z-;3gVQ9Lsm^Svs34=YKC)~Uev%92X!Rn$M8oReHpzqDQ%zE_UtVNw_x$3|klSBXaD z_%(d59N#NRI$Q5}{bThD>XjzpSL))gcve|lIOaR$cvd974BsiO8%Zoq+Fx&Pz2c-W zJ|Dq+jwq(xSH*n349|$fmnKB&6xR(W79{1?J6f**pD)4ZOVA~}EUqHv^Cj~6;)HOW zqPkUydy{tIvxWF9{(|2wkNIq|OrR}FsH$_eZbjmer0k@M#Itp)>fkT_Ap#q;Niup`F1_G4F zpTckLt-HH!c^&*0`dFWh`ON81L0nmUUP5V|qjj_Eme$EjD2qQEmml+)yik5zX?$+N z!8-fvi%@3V Z_P`_oe)xVm{~pO7;Kx{{REkIqd)d literal 0 HcmV?d00001 diff --git a/shared/icons/OpenJK_Icon_1024.png b/shared/icons/OpenJK_Icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..7113df00c4a4156db8f5139838d98b1141dece2b GIT binary patch literal 298812 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ȩXm?;99}kp;eJg( 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

      1D41U;; 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 O)&=&bvt-Glss*yS9`%1~^8)K{Z>y8h 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 acgWzsus{BBcl_V)jcV-w|Mfq)2mTk<-;*W) diff --git a/lib/SDL2/bin/x86_2015/SDL2.dll b/lib/SDL2/bin/x86_2015/SDL2.dll deleted file mode 100644 index c47c31d126277d8f70726d6bfa96ec224a30f0b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 740864 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

      XQkQ|pHI)|>d=RsJgR~#($kGPA7}o~ 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%0D(5h+o(6-X1ZO-!i1MMfY=V>>Z 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 CwbEYz diff --git a/lib/SDL2/include/SDL.h b/lib/SDL2/include/SDL.h index a9077095fe..7647b5111e 100644 --- a/lib/SDL2/include/SDL.h +++ b/lib/SDL2/include/SDL.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -25,41 +25,6 @@ * Main include header for the SDL library */ -/** - * \mainpage Simple DirectMedia Layer (SDL) - * - * http://www.libsdl.org/ - * - * \section intro_sec Introduction - * - * Simple DirectMedia Layer is a cross-platform development library designed - * to provide low level access to audio, keyboard, mouse, joystick, and - * graphics hardware via OpenGL and Direct3D. It is used by video playback - * software, emulators, and popular games including Valve's award winning - * catalog and many Humble Bundle games. - * - * SDL officially supports Windows, Mac OS X, Linux, iOS, and Android. - * Support for other platforms may be found in the source code. - * - * SDL is written in C, works natively with C++, and there are bindings - * available for several other languages, including C# and Python. - * - * This library is distributed under the zlib license, which can be found - * in the file "COPYING.txt". - * - * The best way to learn how to use SDL is to check out the header files in - * the "include" subdirectory and the programs in the "test" subdirectory. - * The header files and test programs are well commented and always up to date. - * More documentation and FAQs are available online at: - * http://wiki.libsdl.org/ - * - * If you need help with the library, or just want to discuss SDL related - * issues, you can join the developers mailing list: - * http://www.libsdl.org/mailing-list.php - * - * Enjoy! - * Sam Lantinga (slouken@libsdl.org) - */ #ifndef _SDL_H #define _SDL_H @@ -114,7 +79,7 @@ extern "C" { #define SDL_INIT_HAPTIC 0x00001000 #define SDL_INIT_GAMECONTROLLER 0x00002000 /**< SDL_INIT_GAMECONTROLLER implies SDL_INIT_JOYSTICK */ #define SDL_INIT_EVENTS 0x00004000 -#define SDL_INIT_NOPARACHUTE 0x00100000 /**< Don't catch fatal signals */ +#define SDL_INIT_NOPARACHUTE 0x00100000 /**< compatibility; this flag is ignored. */ #define SDL_INIT_EVERYTHING ( \ SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_EVENTS | \ SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC | SDL_INIT_GAMECONTROLLER \ @@ -123,13 +88,17 @@ extern "C" { /** * This function initializes the subsystems specified by \c flags - * Unless the ::SDL_INIT_NOPARACHUTE flag is set, it will install cleanup - * signal handlers for some commonly ignored fatal signals (like SIGSEGV). */ extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags); /** * This function initializes specific SDL subsystems + * + * Subsystem initialization is ref-counted, you must call + * SDL_QuitSubSystem for each SDL_InitSubSystem to correctly + * shutdown a subsystem manually (or call SDL_Quit to force shutdown). + * If a subsystem is already loaded then this call will + * increase the ref-count and return. */ extern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags); diff --git a/lib/SDL2/include/SDL_assert.h b/lib/SDL2/include/SDL_assert.h index 42348f7d13..402981f967 100644 --- a/lib/SDL2/include/SDL_assert.h +++ b/lib/SDL2/include/SDL_assert.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -51,7 +51,7 @@ assert can have unique static variables associated with it. /* Don't include intrin.h here because it contains C++ code */ extern void __cdecl __debugbreak(void); #define SDL_TriggerBreakpoint() __debugbreak() -#elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))) +#elif (!defined(__NACL__) && defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))) #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" ) #elif defined(HAVE_SIGNAL_H) #include @@ -86,8 +86,10 @@ This also solves the problem of... disable assertions. */ +/* "while (0,0)" fools Microsoft's compiler's /W4 warning level into thinking + this condition isn't constant. And looks like an owl's face! */ #ifdef _MSC_VER /* stupid /W4 warnings. */ -#define SDL_NULL_WHILE_LOOP_CONDITION (-1 == __LINE__) +#define SDL_NULL_WHILE_LOOP_CONDITION (0,0) #else #define SDL_NULL_WHILE_LOOP_CONDITION (0) #endif @@ -102,9 +104,9 @@ typedef enum SDL_ASSERTION_ABORT, /**< Terminate the program. */ SDL_ASSERTION_IGNORE, /**< Ignore the assert. */ SDL_ASSERTION_ALWAYS_IGNORE /**< Ignore the assert from now on. */ -} SDL_assert_state; +} SDL_AssertState; -typedef struct SDL_assert_data +typedef struct SDL_AssertData { int always_ignore; unsigned int trigger_count; @@ -112,13 +114,13 @@ typedef struct SDL_assert_data const char *filename; int linenum; const char *function; - const struct SDL_assert_data *next; -} SDL_assert_data; + const struct SDL_AssertData *next; +} SDL_AssertData; #if (SDL_ASSERT_LEVEL > 0) /* Never call this directly. Use the SDL_assert* macros. */ -extern DECLSPEC SDL_assert_state SDLCALL SDL_ReportAssertion(SDL_assert_data *, +extern DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *, const char *, const char *, int) #if defined(__clang__) @@ -141,16 +143,13 @@ extern DECLSPEC SDL_assert_state SDLCALL SDL_ReportAssertion(SDL_assert_data *, #define SDL_enabled_assert(condition) \ do { \ while ( !(condition) ) { \ - static struct SDL_assert_data assert_data = { \ + static struct SDL_AssertData sdl_assert_data = { \ 0, 0, #condition, 0, 0, 0, 0 \ }; \ - const SDL_assert_state state = SDL_ReportAssertion(&assert_data, \ - SDL_FUNCTION, \ - SDL_FILE, \ - SDL_LINE); \ - if (state == SDL_ASSERTION_RETRY) { \ + const SDL_AssertState sdl_assert_state = SDL_ReportAssertion(&sdl_assert_data, SDL_FUNCTION, SDL_FILE, SDL_LINE); \ + if (sdl_assert_state == SDL_ASSERTION_RETRY) { \ continue; /* go again. */ \ - } else if (state == SDL_ASSERTION_BREAK) { \ + } else if (sdl_assert_state == SDL_ASSERTION_BREAK) { \ SDL_TriggerBreakpoint(); \ } \ break; /* not retrying. */ \ @@ -184,8 +183,8 @@ extern DECLSPEC SDL_assert_state SDLCALL SDL_ReportAssertion(SDL_assert_data *, #define SDL_assert_always(condition) SDL_enabled_assert(condition) -typedef SDL_assert_state (SDLCALL *SDL_AssertionHandler)( - const SDL_assert_data* data, void* userdata); +typedef SDL_AssertState (SDLCALL *SDL_AssertionHandler)( + const SDL_AssertData* data, void* userdata); /** * \brief Set an application-defined assertion handler. @@ -202,7 +201,7 @@ typedef SDL_assert_state (SDLCALL *SDL_AssertionHandler)( * * This callback is NOT reset to SDL's internal handler upon SDL_Quit()! * - * \return SDL_assert_state value of how to handle the assertion failure. + * \return SDL_AssertState value of how to handle the assertion failure. * * \param handler Callback function, called when an assertion fails. * \param userdata A pointer passed to the callback as-is. @@ -249,7 +248,7 @@ extern DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetAssertionHandler(void **puse * The proper way to examine this data looks something like this: * * - * const SDL_assert_data *item = SDL_GetAssertionReport(); + * const SDL_AssertData *item = SDL_GetAssertionReport(); * while (item) { * printf("'%s', %s (%s:%d), triggered %u times, always ignore: %s.\n", * item->condition, item->function, item->filename, @@ -262,7 +261,7 @@ extern DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetAssertionHandler(void **puse * \return List of all assertions. * \sa SDL_ResetAssertionReport */ -extern DECLSPEC const SDL_assert_data * SDLCALL SDL_GetAssertionReport(void); +extern DECLSPEC const SDL_AssertData * SDLCALL SDL_GetAssertionReport(void); /** * \brief Reset the list of all assertion failures. @@ -273,6 +272,12 @@ extern DECLSPEC const SDL_assert_data * SDLCALL SDL_GetAssertionReport(void); */ extern DECLSPEC void SDLCALL SDL_ResetAssertionReport(void); + +/* these had wrong naming conventions until 2.0.4. Please update your app! */ +#define SDL_assert_state SDL_AssertState +#define SDL_assert_data SDL_AssertData + + /* Ends C function definitions when using C++ */ #ifdef __cplusplus } diff --git a/lib/SDL2/include/SDL_atomic.h b/lib/SDL2/include/SDL_atomic.h index bb3a9b657d..56aa81df98 100644 --- a/lib/SDL2/include/SDL_atomic.h +++ b/lib/SDL2/include/SDL_atomic.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -122,7 +122,8 @@ extern DECLSPEC void SDLCALL SDL_AtomicUnlock(SDL_SpinLock *lock); void _ReadWriteBarrier(void); #pragma intrinsic(_ReadWriteBarrier) #define SDL_CompilerBarrier() _ReadWriteBarrier() -#elif defined(__GNUC__) +#elif (defined(__GNUC__) && !defined(__EMSCRIPTEN__)) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120)) +/* This is correct for all CPUs when using GCC or Solaris Studio 12.1+. */ #define SDL_CompilerBarrier() __asm__ __volatile__ ("" : : : "memory") #else #define SDL_CompilerBarrier() \ @@ -169,10 +170,17 @@ extern DECLSPEC void SDLCALL SDL_MemoryBarrierAcquire(); #define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("" : : : "memory") #endif /* __GNUC__ && __arm__ */ #else +#if (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120)) +/* This is correct for all CPUs on Solaris when using Solaris Studio 12.1+. */ +#include +#define SDL_MemoryBarrierRelease() __machine_rel_barrier() +#define SDL_MemoryBarrierAcquire() __machine_acq_barrier() +#else /* This is correct for the x86 and x64 CPUs, and we'll expand this over time. */ #define SDL_MemoryBarrierRelease() SDL_CompilerBarrier() #define SDL_MemoryBarrierAcquire() SDL_CompilerBarrier() #endif +#endif /** * \brief A type representing an atomic integer value. It is a struct diff --git a/lib/SDL2/include/SDL_audio.h b/lib/SDL2/include/SDL_audio.h index 4c987d5110..4f65521468 100644 --- a/lib/SDL2/include/SDL_audio.h +++ b/lib/SDL2/include/SDL_audio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -155,6 +155,9 @@ typedef Uint16 SDL_AudioFormat; * * Once the callback returns, the buffer will no longer be valid. * Stereo samples are stored in a LRLRLR ordering. + * + * You can choose to avoid callbacks and use SDL_QueueAudio() instead, if + * you like. Just open your audio device with a NULL callback. */ typedef void (SDLCALL * SDL_AudioCallback) (void *userdata, Uint8 * stream, int len); @@ -171,8 +174,8 @@ typedef struct SDL_AudioSpec Uint16 samples; /**< Audio buffer size in samples (power of 2) */ Uint16 padding; /**< Necessary for some compile environments */ Uint32 size; /**< Audio buffer size in bytes (calculated) */ - SDL_AudioCallback callback; - void *userdata; + SDL_AudioCallback callback; /**< Callback that feeds the audio device (NULL to use SDL_QueueAudio()). */ + void *userdata; /**< Userdata passed to callback (ignored for NULL callbacks). */ } SDL_AudioSpec; @@ -273,9 +276,11 @@ extern DECLSPEC const char *SDLCALL SDL_GetCurrentAudioDriver(void); * to the audio buffer, and the length in bytes of the audio buffer. * This function usually runs in a separate thread, and so you should * protect data structures that it accesses by calling SDL_LockAudio() - * and SDL_UnlockAudio() in your code. + * and SDL_UnlockAudio() in your code. Alternately, you may pass a NULL + * pointer here, and call SDL_QueueAudio() with some frequency, to queue + * more audio samples to be played. * - \c desired->userdata is passed as the first parameter to your callback - * function. + * function. If you passed a NULL callback, this value is ignored. * * The audio device starts out playing silence when it's opened, and should * be enabled for playing by calling \c SDL_PauseAudio(0) when you are ready @@ -474,6 +479,100 @@ extern DECLSPEC void SDLCALL SDL_MixAudioFormat(Uint8 * dst, SDL_AudioFormat format, Uint32 len, int volume); +/** + * Queue more audio on non-callback devices. + * + * SDL offers two ways to feed audio to the device: you can either supply a + * callback that SDL triggers with some frequency to obtain more audio + * (pull method), or you can supply no callback, and then SDL will expect + * you to supply data at regular intervals (push method) with this function. + * + * There are no limits on the amount of data you can queue, short of + * exhaustion of address space. Queued data will drain to the device as + * necessary without further intervention from you. If the device needs + * audio but there is not enough queued, it will play silence to make up + * the difference. This means you will have skips in your audio playback + * if you aren't routinely queueing sufficient data. + * + * This function copies the supplied data, so you are safe to free it when + * the function returns. This function is thread-safe, but queueing to the + * same device from two threads at once does not promise which buffer will + * be queued first. + * + * You may not queue audio on a device that is using an application-supplied + * callback; doing so returns an error. You have to use the audio callback + * or queue audio with this function, but not both. + * + * You should not call SDL_LockAudio() on the device before queueing; SDL + * handles locking internally for this function. + * + * \param dev The device ID to which we will queue audio. + * \param data The data to queue to the device for later playback. + * \param len The number of bytes (not samples!) to which (data) points. + * \return zero on success, -1 on error. + * + * \sa SDL_GetQueuedAudioSize + * \sa SDL_ClearQueuedAudio + */ +extern DECLSPEC int SDLCALL SDL_QueueAudio(SDL_AudioDeviceID dev, const void *data, Uint32 len); + +/** + * Get the number of bytes of still-queued audio. + * + * This is the number of bytes that have been queued for playback with + * SDL_QueueAudio(), but have not yet been sent to the hardware. + * + * Once we've sent it to the hardware, this function can not decide the exact + * byte boundary of what has been played. It's possible that we just gave the + * hardware several kilobytes right before you called this function, but it + * hasn't played any of it yet, or maybe half of it, etc. + * + * You may not queue audio on a device that is using an application-supplied + * callback; calling this function on such a device always returns 0. + * You have to use the audio callback or queue audio with SDL_QueueAudio(), + * but not both. + * + * You should not call SDL_LockAudio() on the device before querying; SDL + * handles locking internally for this function. + * + * \param dev The device ID of which we will query queued audio size. + * \return Number of bytes (not samples!) of queued audio. + * + * \sa SDL_QueueAudio + * \sa SDL_ClearQueuedAudio + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetQueuedAudioSize(SDL_AudioDeviceID dev); + +/** + * Drop any queued audio data waiting to be sent to the hardware. + * + * Immediately after this call, SDL_GetQueuedAudioSize() will return 0 and + * the hardware will start playing silence if more audio isn't queued. + * + * This will not prevent playback of queued audio that's already been sent + * to the hardware, as we can not undo that, so expect there to be some + * fraction of a second of audio that might still be heard. This can be + * useful if you want to, say, drop any pending music during a level change + * in your game. + * + * You may not queue audio on a device that is using an application-supplied + * callback; calling this function on such a device is always a no-op. + * You have to use the audio callback or queue audio with SDL_QueueAudio(), + * but not both. + * + * You should not call SDL_LockAudio() on the device before clearing the + * queue; SDL handles locking internally for this function. + * + * This function always succeeds and thus returns void. + * + * \param dev The device ID of which to clear the audio queue. + * + * \sa SDL_QueueAudio + * \sa SDL_GetQueuedAudioSize + */ +extern DECLSPEC void SDLCALL SDL_ClearQueuedAudio(SDL_AudioDeviceID dev); + + /** * \name Audio lock functions * diff --git a/lib/SDL2/include/SDL_bits.h b/lib/SDL2/include/SDL_bits.h index 341524fd9f..528da2eac6 100644 --- a/lib/SDL2/include/SDL_bits.h +++ b/lib/SDL2/include/SDL_bits.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_blendmode.h b/lib/SDL2/include/SDL_blendmode.h index 8c257be9c0..56d8ad66ef 100644 --- a/lib/SDL2/include/SDL_blendmode.h +++ b/lib/SDL2/include/SDL_blendmode.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -58,6 +58,6 @@ typedef enum #endif #include "close_code.h" -#endif /* _SDL_video_h */ +#endif /* _SDL_blendmode_h */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_clipboard.h b/lib/SDL2/include/SDL_clipboard.h index 74e2b32fe7..a5556f21c4 100644 --- a/lib/SDL2/include/SDL_clipboard.h +++ b/lib/SDL2/include/SDL_clipboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_config.h b/lib/SDL2/include/SDL_config.h index 35eda4653e..890986cc4e 100644 --- a/lib/SDL2/include/SDL_config.h +++ b/lib/SDL2/include/SDL_config.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -76,6 +76,12 @@ typedef unsigned int uintptr_t; # define SIZEOF_VOIDP 4 #endif +#define HAVE_DDRAW_H 1 +#define HAVE_DINPUT_H 1 +#define HAVE_DSOUND_H 1 +#define HAVE_DXGI_H 1 +#define HAVE_XINPUT_H 1 + /* This is disabled by default to avoid C runtime dependencies and manifest requirements */ #ifdef HAVE_LIBC /* Useful headers */ @@ -130,6 +136,9 @@ typedef unsigned int uintptr_t; #define HAVE_SIN 1 #define HAVE_SINF 1 #define HAVE_SQRT 1 +#define HAVE_SQRTF 1 +#define HAVE_TAN 1 +#define HAVE_TANF 1 #if _MSC_VER >= 1800 #define HAVE_STRTOLL 1 #define HAVE_VSSCANF 1 @@ -153,7 +162,9 @@ typedef unsigned int uintptr_t; /* Enable various input drivers */ #define SDL_JOYSTICK_DINPUT 1 +#define SDL_JOYSTICK_XINPUT 1 #define SDL_HAPTIC_DINPUT 1 +#define SDL_HAPTIC_XINPUT 1 /* Enable various shared object loading systems */ #define SDL_LOADSO_WINDOWS 1 diff --git a/lib/SDL2/include/SDL_cpuinfo.h b/lib/SDL2/include/SDL_cpuinfo.h index 1f6efd384a..d0ba47bf7f 100644 --- a/lib/SDL2/include/SDL_cpuinfo.h +++ b/lib/SDL2/include/SDL_cpuinfo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -139,6 +139,11 @@ extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE42(void); */ extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX(void); +/** + * This function returns true if the CPU has AVX2 features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX2(void); + /** * This function returns the amount of RAM configured in the system, in MB. */ diff --git a/lib/SDL2/include/SDL_egl.h b/lib/SDL2/include/SDL_egl.h new file mode 100644 index 0000000000..bea2a6c0ec --- /dev/null +++ b/lib/SDL2/include/SDL_egl.h @@ -0,0 +1,1673 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2016 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_egl.h + * + * This is a simple file to encapsulate the EGL API headers. + */ +#ifndef _MSC_VER + +#include +#include + +#else /* _MSC_VER */ + +/* EGL headers for Visual Studio */ + +#ifndef __khrplatform_h_ +#define __khrplatform_h_ + +/* +** Copyright (c) 2008-2009 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +/* Khronos platform-specific types and definitions. +* +* $Revision: 23298 $ on $Date: 2013-09-30 17:07:13 -0700 (Mon, 30 Sep 2013) $ +* +* Adopters may modify this file to suit their platform. Adopters are +* encouraged to submit platform specific modifications to the Khronos +* group so that they can be included in future versions of this file. +* Please submit changes by sending them to the public Khronos Bugzilla +* (http://khronos.org/bugzilla) by filing a bug against product +* "Khronos (general)" component "Registry". +* +* A predefined template which fills in some of the bug fields can be +* reached using http://tinyurl.com/khrplatform-h-bugreport, but you +* must create a Bugzilla login first. +* +* +* See the Implementer's Guidelines for information about where this file +* should be located on your system and for more details of its use: +* http://www.khronos.org/registry/implementers_guide.pdf +* +* This file should be included as +* #include +* by Khronos client API header files that use its types and defines. +* +* The types in khrplatform.h should only be used to define API-specific types. +* +* Types defined in khrplatform.h: +* khronos_int8_t signed 8 bit +* khronos_uint8_t unsigned 8 bit +* khronos_int16_t signed 16 bit +* khronos_uint16_t unsigned 16 bit +* khronos_int32_t signed 32 bit +* khronos_uint32_t unsigned 32 bit +* khronos_int64_t signed 64 bit +* khronos_uint64_t unsigned 64 bit +* khronos_intptr_t signed same number of bits as a pointer +* khronos_uintptr_t unsigned same number of bits as a pointer +* khronos_ssize_t signed size +* khronos_usize_t unsigned size +* khronos_float_t signed 32 bit floating point +* khronos_time_ns_t unsigned 64 bit time in nanoseconds +* khronos_utime_nanoseconds_t unsigned time interval or absolute time in +* nanoseconds +* khronos_stime_nanoseconds_t signed time interval in nanoseconds +* khronos_boolean_enum_t enumerated boolean type. This should +* only be used as a base type when a client API's boolean type is +* an enum. Client APIs which use an integer or other type for +* booleans cannot use this as the base type for their boolean. +* +* Tokens defined in khrplatform.h: +* +* KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. +* +* KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. +* KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. +* +* Calling convention macros defined in this file: +* KHRONOS_APICALL +* KHRONOS_APIENTRY +* KHRONOS_APIATTRIBUTES +* +* These may be used in function prototypes as: +* +* KHRONOS_APICALL void KHRONOS_APIENTRY funcname( +* int arg1, +* int arg2) KHRONOS_APIATTRIBUTES; +*/ + +/*------------------------------------------------------------------------- +* Definition of KHRONOS_APICALL +*------------------------------------------------------------------------- +* This precedes the return type of the function in the function prototype. +*/ +#if defined(_WIN32) && !defined(__SCITECH_SNAP__) +# define KHRONOS_APICALL __declspec(dllimport) +#elif defined (__SYMBIAN32__) +# define KHRONOS_APICALL IMPORT_C +#else +# define KHRONOS_APICALL +#endif + +/*------------------------------------------------------------------------- +* Definition of KHRONOS_APIENTRY +*------------------------------------------------------------------------- +* This follows the return type of the function and precedes the function +* name in the function prototype. +*/ +#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) +/* Win32 but not WinCE */ +# define KHRONOS_APIENTRY __stdcall +#else +# define KHRONOS_APIENTRY +#endif + +/*------------------------------------------------------------------------- +* Definition of KHRONOS_APIATTRIBUTES +*------------------------------------------------------------------------- +* This follows the closing parenthesis of the function prototype arguments. +*/ +#if defined (__ARMCC_2__) +#define KHRONOS_APIATTRIBUTES __softfp +#else +#define KHRONOS_APIATTRIBUTES +#endif + +/*------------------------------------------------------------------------- +* basic type definitions +*-----------------------------------------------------------------------*/ +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) + + +/* +* Using +*/ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(__VMS ) || defined(__sgi) + +/* +* Using +*/ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(_WIN32) && !defined(__SCITECH_SNAP__) + +/* +* Win32 +*/ +typedef __int32 khronos_int32_t; +typedef unsigned __int32 khronos_uint32_t; +typedef __int64 khronos_int64_t; +typedef unsigned __int64 khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(__sun__) || defined(__digital__) + +/* +* Sun or Digital +*/ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#if defined(__arch64__) || defined(_LP64) +typedef long int khronos_int64_t; +typedef unsigned long int khronos_uint64_t; +#else +typedef long long int khronos_int64_t; +typedef unsigned long long int khronos_uint64_t; +#endif /* __arch64__ */ +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif 0 + +/* +* Hypothetical platform with no float or int64 support +*/ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#define KHRONOS_SUPPORT_INT64 0 +#define KHRONOS_SUPPORT_FLOAT 0 + +#else + +/* +* Generic fallback +*/ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#endif + + +/* +* Types that are (so far) the same on all platforms +*/ +typedef signed char khronos_int8_t; +typedef unsigned char khronos_uint8_t; +typedef signed short int khronos_int16_t; +typedef unsigned short int khronos_uint16_t; + +/* +* Types that differ between LLP64 and LP64 architectures - in LLP64, +* pointers are 64 bits, but 'long' is still 32 bits. Win64 appears +* to be the only LLP64 architecture in current use. +*/ +#ifdef _WIN64 +typedef signed long long int khronos_intptr_t; +typedef unsigned long long int khronos_uintptr_t; +typedef signed long long int khronos_ssize_t; +typedef unsigned long long int khronos_usize_t; +#else +typedef signed long int khronos_intptr_t; +typedef unsigned long int khronos_uintptr_t; +typedef signed long int khronos_ssize_t; +typedef unsigned long int khronos_usize_t; +#endif + +#if KHRONOS_SUPPORT_FLOAT +/* +* Float type +*/ +typedef float khronos_float_t; +#endif + +#if KHRONOS_SUPPORT_INT64 +/* Time types +* +* These types can be used to represent a time interval in nanoseconds or +* an absolute Unadjusted System Time. Unadjusted System Time is the number +* of nanoseconds since some arbitrary system event (e.g. since the last +* time the system booted). The Unadjusted System Time is an unsigned +* 64 bit value that wraps back to 0 every 584 years. Time intervals +* may be either signed or unsigned. +*/ +typedef khronos_uint64_t khronos_utime_nanoseconds_t; +typedef khronos_int64_t khronos_stime_nanoseconds_t; +#endif + +/* +* Dummy value used to pad enum types to 32 bits. +*/ +#ifndef KHRONOS_MAX_ENUM +#define KHRONOS_MAX_ENUM 0x7FFFFFFF +#endif + +/* +* Enumerated boolean type +* +* Values other than zero should be considered to be true. Therefore +* comparisons should not be made against KHRONOS_TRUE. +*/ +typedef enum { + KHRONOS_FALSE = 0, + KHRONOS_TRUE = 1, + KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM +} khronos_boolean_enum_t; + +#endif /* __khrplatform_h_ */ + + +#ifndef __eglplatform_h_ +#define __eglplatform_h_ + +/* +** Copyright (c) 2007-2009 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +/* Platform-specific types and definitions for egl.h +* $Revision: 12306 $ on $Date: 2010-08-25 09:51:28 -0700 (Wed, 25 Aug 2010) $ +* +* Adopters may modify khrplatform.h and this file to suit their platform. +* You are encouraged to submit all modifications to the Khronos group so that +* they can be included in future versions of this file. Please submit changes +* by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla) +* by filing a bug against product "EGL" component "Registry". +*/ + +/*#include */ + +/* Macros used in EGL function prototype declarations. +* +* EGL functions should be prototyped as: +* +* EGLAPI return-type EGLAPIENTRY eglFunction(arguments); +* typedef return-type (EXPAPIENTRYP PFNEGLFUNCTIONPROC) (arguments); +* +* KHRONOS_APICALL and KHRONOS_APIENTRY are defined in KHR/khrplatform.h +*/ + +#ifndef EGLAPI +#define EGLAPI KHRONOS_APICALL +#endif + +#ifndef EGLAPIENTRY +#define EGLAPIENTRY KHRONOS_APIENTRY +#endif +#define EGLAPIENTRYP EGLAPIENTRY* + +/* The types NativeDisplayType, NativeWindowType, and NativePixmapType +* are aliases of window-system-dependent types, such as X Display * or +* Windows Device Context. They must be defined in platform-specific +* code below. The EGL-prefixed versions of Native*Type are the same +* types, renamed in EGL 1.3 so all types in the API start with "EGL". +* +* Khronos STRONGLY RECOMMENDS that you use the default definitions +* provided below, since these changes affect both binary and source +* portability of applications using EGL running on different EGL +* implementations. +*/ + +#if defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include + +#if __WINRT__ +#include +typedef IUnknown * EGLNativeWindowType; +typedef IUnknown * EGLNativePixmapType; +typedef IUnknown * EGLNativeDisplayType; +#else +typedef HDC EGLNativeDisplayType; +typedef HBITMAP EGLNativePixmapType; +typedef HWND EGLNativeWindowType; +#endif + +#elif defined(__WINSCW__) || defined(__SYMBIAN32__) /* Symbian */ + +typedef int EGLNativeDisplayType; +typedef void *EGLNativeWindowType; +typedef void *EGLNativePixmapType; + +#elif defined(WL_EGL_PLATFORM) + +typedef struct wl_display *EGLNativeDisplayType; +typedef struct wl_egl_pixmap *EGLNativePixmapType; +typedef struct wl_egl_window *EGLNativeWindowType; + +#elif defined(__GBM__) + +typedef struct gbm_device *EGLNativeDisplayType; +typedef struct gbm_bo *EGLNativePixmapType; +typedef void *EGLNativeWindowType; + +#elif defined(__ANDROID__) /* Android */ + +struct ANativeWindow; +struct egl_native_pixmap_t; + +typedef struct ANativeWindow *EGLNativeWindowType; +typedef struct egl_native_pixmap_t *EGLNativePixmapType; +typedef void *EGLNativeDisplayType; + +#elif defined(MIR_EGL_PLATFORM) + +#include +typedef MirEGLNativeDisplayType EGLNativeDisplayType; +typedef void *EGLNativePixmapType; +typedef MirEGLNativeWindowType EGLNativeWindowType; + +#elif defined(__unix__) + +#ifdef MESA_EGL_NO_X11_HEADERS + +typedef void *EGLNativeDisplayType; +typedef khronos_uintptr_t EGLNativePixmapType; +typedef khronos_uintptr_t EGLNativeWindowType; + +#else + +/* X11 (tentative) */ +#include +#include + +typedef Display *EGLNativeDisplayType; +typedef Pixmap EGLNativePixmapType; +typedef Window EGLNativeWindowType; + +#endif /* MESA_EGL_NO_X11_HEADERS */ + +#else +#error "Platform not recognized" +#endif + +/* EGL 1.2 types, renamed for consistency in EGL 1.3 */ +typedef EGLNativeDisplayType NativeDisplayType; +typedef EGLNativePixmapType NativePixmapType; +typedef EGLNativeWindowType NativeWindowType; + + +/* Define EGLint. This must be a signed integral type large enough to contain +* all legal attribute names and values passed into and out of EGL, whether +* their type is boolean, bitmask, enumerant (symbolic constant), integer, +* handle, or other. While in general a 32-bit integer will suffice, if +* handles are 64 bit types, then EGLint should be defined as a signed 64-bit +* integer type. +*/ +typedef khronos_int32_t EGLint; + +#endif /* __eglplatform_h */ + +#ifndef __egl_h_ +#define __egl_h_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2013-2015 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ +/* +** This header is generated from the Khronos OpenGL / OpenGL ES XML +** API Registry. The current version of the Registry, generator scripts +** used to make the header, and the header can be found at +** http://www.opengl.org/registry/ +** +** Khronos $Revision: 31566 $ on $Date: 2015-06-23 08:48:48 -0700 (Tue, 23 Jun 2015) $ +*/ + +/*#include */ + +/* Generated on date 20150623 */ + +/* Generated C header for: + * API: egl + * Versions considered: .* + * Versions emitted: .* + * Default extensions included: None + * Additional extensions included: _nomatch_^ + * Extensions removed: _nomatch_^ + */ + +#ifndef EGL_VERSION_1_0 +#define EGL_VERSION_1_0 1 +typedef unsigned int EGLBoolean; +typedef void *EGLDisplay; +typedef void *EGLConfig; +typedef void *EGLSurface; +typedef void *EGLContext; +typedef void (*__eglMustCastToProperFunctionPointerType)(void); +#define EGL_ALPHA_SIZE 0x3021 +#define EGL_BAD_ACCESS 0x3002 +#define EGL_BAD_ALLOC 0x3003 +#define EGL_BAD_ATTRIBUTE 0x3004 +#define EGL_BAD_CONFIG 0x3005 +#define EGL_BAD_CONTEXT 0x3006 +#define EGL_BAD_CURRENT_SURFACE 0x3007 +#define EGL_BAD_DISPLAY 0x3008 +#define EGL_BAD_MATCH 0x3009 +#define EGL_BAD_NATIVE_PIXMAP 0x300A +#define EGL_BAD_NATIVE_WINDOW 0x300B +#define EGL_BAD_PARAMETER 0x300C +#define EGL_BAD_SURFACE 0x300D +#define EGL_BLUE_SIZE 0x3022 +#define EGL_BUFFER_SIZE 0x3020 +#define EGL_CONFIG_CAVEAT 0x3027 +#define EGL_CONFIG_ID 0x3028 +#define EGL_CORE_NATIVE_ENGINE 0x305B +#define EGL_DEPTH_SIZE 0x3025 +#define EGL_DONT_CARE ((EGLint)-1) +#define EGL_DRAW 0x3059 +#define EGL_EXTENSIONS 0x3055 +#define EGL_FALSE 0 +#define EGL_GREEN_SIZE 0x3023 +#define EGL_HEIGHT 0x3056 +#define EGL_LARGEST_PBUFFER 0x3058 +#define EGL_LEVEL 0x3029 +#define EGL_MAX_PBUFFER_HEIGHT 0x302A +#define EGL_MAX_PBUFFER_PIXELS 0x302B +#define EGL_MAX_PBUFFER_WIDTH 0x302C +#define EGL_NATIVE_RENDERABLE 0x302D +#define EGL_NATIVE_VISUAL_ID 0x302E +#define EGL_NATIVE_VISUAL_TYPE 0x302F +#define EGL_NONE 0x3038 +#define EGL_NON_CONFORMANT_CONFIG 0x3051 +#define EGL_NOT_INITIALIZED 0x3001 +#define EGL_NO_CONTEXT ((EGLContext)0) +#define EGL_NO_DISPLAY ((EGLDisplay)0) +#define EGL_NO_SURFACE ((EGLSurface)0) +#define EGL_PBUFFER_BIT 0x0001 +#define EGL_PIXMAP_BIT 0x0002 +#define EGL_READ 0x305A +#define EGL_RED_SIZE 0x3024 +#define EGL_SAMPLES 0x3031 +#define EGL_SAMPLE_BUFFERS 0x3032 +#define EGL_SLOW_CONFIG 0x3050 +#define EGL_STENCIL_SIZE 0x3026 +#define EGL_SUCCESS 0x3000 +#define EGL_SURFACE_TYPE 0x3033 +#define EGL_TRANSPARENT_BLUE_VALUE 0x3035 +#define EGL_TRANSPARENT_GREEN_VALUE 0x3036 +#define EGL_TRANSPARENT_RED_VALUE 0x3037 +#define EGL_TRANSPARENT_RGB 0x3052 +#define EGL_TRANSPARENT_TYPE 0x3034 +#define EGL_TRUE 1 +#define EGL_VENDOR 0x3053 +#define EGL_VERSION 0x3054 +#define EGL_WIDTH 0x3057 +#define EGL_WINDOW_BIT 0x0004 +EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config); +EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); +EGLAPI EGLContext EGLAPIENTRY eglCreateContext (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext (EGLDisplay dpy, EGLContext ctx); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface (EGLDisplay dpy, EGLSurface surface); +EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value); +EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs (EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config); +EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay (void); +EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface (EGLint readdraw); +EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay (EGLNativeDisplayType display_id); +EGLAPI EGLint EGLAPIENTRY eglGetError (void); +EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress (const char *procname); +EGLAPI EGLBoolean EGLAPIENTRY eglInitialize (EGLDisplay dpy, EGLint *major, EGLint *minor); +EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value); +EGLAPI const char *EGLAPIENTRY eglQueryString (EGLDisplay dpy, EGLint name); +EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value); +EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers (EGLDisplay dpy, EGLSurface surface); +EGLAPI EGLBoolean EGLAPIENTRY eglTerminate (EGLDisplay dpy); +EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL (void); +EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative (EGLint engine); +#endif /* EGL_VERSION_1_0 */ + +#ifndef EGL_VERSION_1_1 +#define EGL_VERSION_1_1 1 +#define EGL_BACK_BUFFER 0x3084 +#define EGL_BIND_TO_TEXTURE_RGB 0x3039 +#define EGL_BIND_TO_TEXTURE_RGBA 0x303A +#define EGL_CONTEXT_LOST 0x300E +#define EGL_MIN_SWAP_INTERVAL 0x303B +#define EGL_MAX_SWAP_INTERVAL 0x303C +#define EGL_MIPMAP_TEXTURE 0x3082 +#define EGL_MIPMAP_LEVEL 0x3083 +#define EGL_NO_TEXTURE 0x305C +#define EGL_TEXTURE_2D 0x305F +#define EGL_TEXTURE_FORMAT 0x3080 +#define EGL_TEXTURE_RGB 0x305D +#define EGL_TEXTURE_RGBA 0x305E +#define EGL_TEXTURE_TARGET 0x3081 +EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer); +EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer); +EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); +EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval (EGLDisplay dpy, EGLint interval); +#endif /* EGL_VERSION_1_1 */ + +#ifndef EGL_VERSION_1_2 +#define EGL_VERSION_1_2 1 +typedef unsigned int EGLenum; +typedef void *EGLClientBuffer; +#define EGL_ALPHA_FORMAT 0x3088 +#define EGL_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_ALPHA_FORMAT_PRE 0x308C +#define EGL_ALPHA_MASK_SIZE 0x303E +#define EGL_BUFFER_PRESERVED 0x3094 +#define EGL_BUFFER_DESTROYED 0x3095 +#define EGL_CLIENT_APIS 0x308D +#define EGL_COLORSPACE 0x3087 +#define EGL_COLORSPACE_sRGB 0x3089 +#define EGL_COLORSPACE_LINEAR 0x308A +#define EGL_COLOR_BUFFER_TYPE 0x303F +#define EGL_CONTEXT_CLIENT_TYPE 0x3097 +#define EGL_DISPLAY_SCALING 10000 +#define EGL_HORIZONTAL_RESOLUTION 0x3090 +#define EGL_LUMINANCE_BUFFER 0x308F +#define EGL_LUMINANCE_SIZE 0x303D +#define EGL_OPENGL_ES_BIT 0x0001 +#define EGL_OPENVG_BIT 0x0002 +#define EGL_OPENGL_ES_API 0x30A0 +#define EGL_OPENVG_API 0x30A1 +#define EGL_OPENVG_IMAGE 0x3096 +#define EGL_PIXEL_ASPECT_RATIO 0x3092 +#define EGL_RENDERABLE_TYPE 0x3040 +#define EGL_RENDER_BUFFER 0x3086 +#define EGL_RGB_BUFFER 0x308E +#define EGL_SINGLE_BUFFER 0x3085 +#define EGL_SWAP_BEHAVIOR 0x3093 +#define EGL_UNKNOWN ((EGLint)-1) +#define EGL_VERTICAL_RESOLUTION 0x3091 +EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI (EGLenum api); +EGLAPI EGLenum EGLAPIENTRY eglQueryAPI (void); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread (void); +EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient (void); +#endif /* EGL_VERSION_1_2 */ + +#ifndef EGL_VERSION_1_3 +#define EGL_VERSION_1_3 1 +#define EGL_CONFORMANT 0x3042 +#define EGL_CONTEXT_CLIENT_VERSION 0x3098 +#define EGL_MATCH_NATIVE_PIXMAP 0x3041 +#define EGL_OPENGL_ES2_BIT 0x0004 +#define EGL_VG_ALPHA_FORMAT 0x3088 +#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_VG_ALPHA_FORMAT_PRE 0x308C +#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 +#define EGL_VG_COLORSPACE 0x3087 +#define EGL_VG_COLORSPACE_sRGB 0x3089 +#define EGL_VG_COLORSPACE_LINEAR 0x308A +#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 +#endif /* EGL_VERSION_1_3 */ + +#ifndef EGL_VERSION_1_4 +#define EGL_VERSION_1_4 1 +#define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)0) +#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 +#define EGL_MULTISAMPLE_RESOLVE 0x3099 +#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A +#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B +#define EGL_OPENGL_API 0x30A2 +#define EGL_OPENGL_BIT 0x0008 +#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 +EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext (void); +#endif /* EGL_VERSION_1_4 */ + +#ifndef EGL_VERSION_1_5 +#define EGL_VERSION_1_5 1 +typedef void *EGLSync; +typedef intptr_t EGLAttrib; +typedef khronos_utime_nanoseconds_t EGLTime; +typedef void *EGLImage; +#define EGL_CONTEXT_MAJOR_VERSION 0x3098 +#define EGL_CONTEXT_MINOR_VERSION 0x30FB +#define EGL_CONTEXT_OPENGL_PROFILE_MASK 0x30FD +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD +#define EGL_NO_RESET_NOTIFICATION 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET 0x31BF +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001 +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define EGL_CONTEXT_OPENGL_DEBUG 0x31B0 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2 +#define EGL_OPENGL_ES3_BIT 0x00000040 +#define EGL_CL_EVENT_HANDLE 0x309C +#define EGL_SYNC_CL_EVENT 0x30FE +#define EGL_SYNC_CL_EVENT_COMPLETE 0x30FF +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0 +#define EGL_SYNC_TYPE 0x30F7 +#define EGL_SYNC_STATUS 0x30F1 +#define EGL_SYNC_CONDITION 0x30F8 +#define EGL_SIGNALED 0x30F2 +#define EGL_UNSIGNALED 0x30F3 +#define EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001 +#define EGL_FOREVER 0xFFFFFFFFFFFFFFFFull +#define EGL_TIMEOUT_EXPIRED 0x30F5 +#define EGL_CONDITION_SATISFIED 0x30F6 +#define EGL_NO_SYNC ((EGLSync)0) +#define EGL_SYNC_FENCE 0x30F9 +#define EGL_GL_COLORSPACE 0x309D +#define EGL_GL_COLORSPACE_SRGB 0x3089 +#define EGL_GL_COLORSPACE_LINEAR 0x308A +#define EGL_GL_RENDERBUFFER 0x30B9 +#define EGL_GL_TEXTURE_2D 0x30B1 +#define EGL_GL_TEXTURE_LEVEL 0x30BC +#define EGL_GL_TEXTURE_3D 0x30B2 +#define EGL_GL_TEXTURE_ZOFFSET 0x30BD +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8 +#define EGL_IMAGE_PRESERVED 0x30D2 +#define EGL_NO_IMAGE ((EGLImage)0) +EGLAPI EGLSync EGLAPIENTRY eglCreateSync (EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySync (EGLDisplay dpy, EGLSync sync); +EGLAPI EGLint EGLAPIENTRY eglClientWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout); +EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttrib (EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value); +EGLAPI EGLImage EGLAPIENTRY eglCreateImage (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImage (EGLDisplay dpy, EGLImage image); +EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplay (EGLenum platform, void *native_display, const EGLAttrib *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurface (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurface (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags); +#endif /* EGL_VERSION_1_5 */ + +#ifdef __cplusplus +} +#endif + +#endif /* __egl_h_ */ + + + +#ifndef __eglext_h_ +#define __eglext_h_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2013-2015 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ +/* +** This header is generated from the Khronos OpenGL / OpenGL ES XML +** API Registry. The current version of the Registry, generator scripts +** used to make the header, and the header can be found at +** http://www.opengl.org/registry/ +** +** Khronos $Revision: 31566 $ on $Date: 2015-06-23 08:48:48 -0700 (Tue, 23 Jun 2015) $ +*/ + +/*#include */ + +#define EGL_EGLEXT_VERSION 20150623 + +/* Generated C header for: + * API: egl + * Versions considered: .* + * Versions emitted: _nomatch_^ + * Default extensions included: egl + * Additional extensions included: _nomatch_^ + * Extensions removed: _nomatch_^ + */ + +#ifndef EGL_KHR_cl_event +#define EGL_KHR_cl_event 1 +#define EGL_CL_EVENT_HANDLE_KHR 0x309C +#define EGL_SYNC_CL_EVENT_KHR 0x30FE +#define EGL_SYNC_CL_EVENT_COMPLETE_KHR 0x30FF +#endif /* EGL_KHR_cl_event */ + +#ifndef EGL_KHR_cl_event2 +#define EGL_KHR_cl_event2 1 +typedef void *EGLSyncKHR; +typedef intptr_t EGLAttribKHR; +typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNC64KHRPROC) (EGLDisplay dpy, EGLenum type, const EGLAttribKHR *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSync64KHR (EGLDisplay dpy, EGLenum type, const EGLAttribKHR *attrib_list); +#endif +#endif /* EGL_KHR_cl_event2 */ + +#ifndef EGL_KHR_client_get_all_proc_addresses +#define EGL_KHR_client_get_all_proc_addresses 1 +#endif /* EGL_KHR_client_get_all_proc_addresses */ + +#ifndef EGL_KHR_config_attribs +#define EGL_KHR_config_attribs 1 +#define EGL_CONFORMANT_KHR 0x3042 +#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR 0x0020 +#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR 0x0040 +#endif /* EGL_KHR_config_attribs */ + +#ifndef EGL_KHR_create_context +#define EGL_KHR_create_context 1 +#define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098 +#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB +#define EGL_CONTEXT_FLAGS_KHR 0x30FC +#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31BD +#define EGL_NO_RESET_NOTIFICATION_KHR 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31BF +#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004 +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002 +#define EGL_OPENGL_ES3_BIT_KHR 0x00000040 +#endif /* EGL_KHR_create_context */ + +#ifndef EGL_KHR_create_context_no_error +#define EGL_KHR_create_context_no_error 1 +#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR 0x31B3 +#endif /* EGL_KHR_create_context_no_error */ + +#ifndef EGL_KHR_fence_sync +#define EGL_KHR_fence_sync 1 +typedef khronos_utime_nanoseconds_t EGLTimeKHR; +#ifdef KHRONOS_SUPPORT_INT64 +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0 +#define EGL_SYNC_CONDITION_KHR 0x30F8 +#define EGL_SYNC_FENCE_KHR 0x30F9 +typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync); +typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR (EGLDisplay dpy, EGLSyncKHR sync); +EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); +#endif +#endif /* KHRONOS_SUPPORT_INT64 */ +#endif /* EGL_KHR_fence_sync */ + +#ifndef EGL_KHR_get_all_proc_addresses +#define EGL_KHR_get_all_proc_addresses 1 +#endif /* EGL_KHR_get_all_proc_addresses */ + +#ifndef EGL_KHR_gl_colorspace +#define EGL_KHR_gl_colorspace 1 +#define EGL_GL_COLORSPACE_KHR 0x309D +#define EGL_GL_COLORSPACE_SRGB_KHR 0x3089 +#define EGL_GL_COLORSPACE_LINEAR_KHR 0x308A +#endif /* EGL_KHR_gl_colorspace */ + +#ifndef EGL_KHR_gl_renderbuffer_image +#define EGL_KHR_gl_renderbuffer_image 1 +#define EGL_GL_RENDERBUFFER_KHR 0x30B9 +#endif /* EGL_KHR_gl_renderbuffer_image */ + +#ifndef EGL_KHR_gl_texture_2D_image +#define EGL_KHR_gl_texture_2D_image 1 +#define EGL_GL_TEXTURE_2D_KHR 0x30B1 +#define EGL_GL_TEXTURE_LEVEL_KHR 0x30BC +#endif /* EGL_KHR_gl_texture_2D_image */ + +#ifndef EGL_KHR_gl_texture_3D_image +#define EGL_KHR_gl_texture_3D_image 1 +#define EGL_GL_TEXTURE_3D_KHR 0x30B2 +#define EGL_GL_TEXTURE_ZOFFSET_KHR 0x30BD +#endif /* EGL_KHR_gl_texture_3D_image */ + +#ifndef EGL_KHR_gl_texture_cubemap_image +#define EGL_KHR_gl_texture_cubemap_image 1 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR 0x30B3 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR 0x30B4 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR 0x30B5 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR 0x30B6 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR 0x30B7 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR 0x30B8 +#endif /* EGL_KHR_gl_texture_cubemap_image */ + +#ifndef EGL_KHR_image +#define EGL_KHR_image 1 +typedef void *EGLImageKHR; +#define EGL_NATIVE_PIXMAP_KHR 0x30B0 +#define EGL_NO_IMAGE_KHR ((EGLImageKHR)0) +typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR (EGLDisplay dpy, EGLImageKHR image); +#endif +#endif /* EGL_KHR_image */ + +#ifndef EGL_KHR_image_base +#define EGL_KHR_image_base 1 +#define EGL_IMAGE_PRESERVED_KHR 0x30D2 +#endif /* EGL_KHR_image_base */ + +#ifndef EGL_KHR_image_pixmap +#define EGL_KHR_image_pixmap 1 +#endif /* EGL_KHR_image_pixmap */ + +#ifndef EGL_KHR_lock_surface +#define EGL_KHR_lock_surface 1 +#define EGL_READ_SURFACE_BIT_KHR 0x0001 +#define EGL_WRITE_SURFACE_BIT_KHR 0x0002 +#define EGL_LOCK_SURFACE_BIT_KHR 0x0080 +#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100 +#define EGL_MATCH_FORMAT_KHR 0x3043 +#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0 +#define EGL_FORMAT_RGB_565_KHR 0x30C1 +#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2 +#define EGL_FORMAT_RGBA_8888_KHR 0x30C3 +#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4 +#define EGL_LOCK_USAGE_HINT_KHR 0x30C5 +#define EGL_BITMAP_POINTER_KHR 0x30C6 +#define EGL_BITMAP_PITCH_KHR 0x30C7 +#define EGL_BITMAP_ORIGIN_KHR 0x30C8 +#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9 +#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA +#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB +#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC +#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD +#define EGL_LOWER_LEFT_KHR 0x30CE +#define EGL_UPPER_LEFT_KHR 0x30CF +typedef EGLBoolean (EGLAPIENTRYP PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglLockSurfaceKHR (EGLDisplay dpy, EGLSurface surface, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglUnlockSurfaceKHR (EGLDisplay dpy, EGLSurface surface); +#endif +#endif /* EGL_KHR_lock_surface */ + +#ifndef EGL_KHR_lock_surface2 +#define EGL_KHR_lock_surface2 1 +#define EGL_BITMAP_PIXEL_SIZE_KHR 0x3110 +#endif /* EGL_KHR_lock_surface2 */ + +#ifndef EGL_KHR_lock_surface3 +#define EGL_KHR_lock_surface3 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACE64KHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface64KHR (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR *value); +#endif +#endif /* EGL_KHR_lock_surface3 */ + +#ifndef EGL_KHR_partial_update +#define EGL_KHR_partial_update 1 +#define EGL_BUFFER_AGE_KHR 0x313D +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETDAMAGEREGIONKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSetDamageRegionKHR (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects); +#endif +#endif /* EGL_KHR_partial_update */ + +#ifndef EGL_KHR_platform_android +#define EGL_KHR_platform_android 1 +#define EGL_PLATFORM_ANDROID_KHR 0x3141 +#endif /* EGL_KHR_platform_android */ + +#ifndef EGL_KHR_platform_gbm +#define EGL_KHR_platform_gbm 1 +#define EGL_PLATFORM_GBM_KHR 0x31D7 +#endif /* EGL_KHR_platform_gbm */ + +#ifndef EGL_KHR_platform_wayland +#define EGL_KHR_platform_wayland 1 +#define EGL_PLATFORM_WAYLAND_KHR 0x31D8 +#endif /* EGL_KHR_platform_wayland */ + +#ifndef EGL_KHR_platform_x11 +#define EGL_KHR_platform_x11 1 +#define EGL_PLATFORM_X11_KHR 0x31D5 +#define EGL_PLATFORM_X11_SCREEN_KHR 0x31D6 +#endif /* EGL_KHR_platform_x11 */ + +#ifndef EGL_KHR_reusable_sync +#define EGL_KHR_reusable_sync 1 +#ifdef KHRONOS_SUPPORT_INT64 +#define EGL_SYNC_STATUS_KHR 0x30F1 +#define EGL_SIGNALED_KHR 0x30F2 +#define EGL_UNSIGNALED_KHR 0x30F3 +#define EGL_TIMEOUT_EXPIRED_KHR 0x30F5 +#define EGL_CONDITION_SATISFIED_KHR 0x30F6 +#define EGL_SYNC_TYPE_KHR 0x30F7 +#define EGL_SYNC_REUSABLE_KHR 0x30FA +#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001 +#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFFull +#define EGL_NO_SYNC_KHR ((EGLSyncKHR)0) +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); +#endif +#endif /* KHRONOS_SUPPORT_INT64 */ +#endif /* EGL_KHR_reusable_sync */ + +#ifndef EGL_KHR_stream +#define EGL_KHR_stream 1 +typedef void *EGLStreamKHR; +typedef khronos_uint64_t EGLuint64KHR; +#ifdef KHRONOS_SUPPORT_INT64 +#define EGL_NO_STREAM_KHR ((EGLStreamKHR)0) +#define EGL_CONSUMER_LATENCY_USEC_KHR 0x3210 +#define EGL_PRODUCER_FRAME_KHR 0x3212 +#define EGL_CONSUMER_FRAME_KHR 0x3213 +#define EGL_STREAM_STATE_KHR 0x3214 +#define EGL_STREAM_STATE_CREATED_KHR 0x3215 +#define EGL_STREAM_STATE_CONNECTING_KHR 0x3216 +#define EGL_STREAM_STATE_EMPTY_KHR 0x3217 +#define EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR 0x3218 +#define EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR 0x3219 +#define EGL_STREAM_STATE_DISCONNECTED_KHR 0x321A +#define EGL_BAD_STREAM_KHR 0x321B +#define EGL_BAD_STATE_KHR 0x321C +typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMKHRPROC) (EGLDisplay dpy, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMU64KHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamKHR (EGLDisplay dpy, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyStreamKHR (EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamu64KHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value); +#endif +#endif /* KHRONOS_SUPPORT_INT64 */ +#endif /* EGL_KHR_stream */ + +#ifndef EGL_KHR_stream_consumer_gltexture +#define EGL_KHR_stream_consumer_gltexture 1 +#ifdef EGL_KHR_stream +#define EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR 0x321E +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERACQUIREKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERRELEASEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalKHR (EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireKHR (EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseKHR (EGLDisplay dpy, EGLStreamKHR stream); +#endif +#endif /* EGL_KHR_stream */ +#endif /* EGL_KHR_stream_consumer_gltexture */ + +#ifndef EGL_KHR_stream_cross_process_fd +#define EGL_KHR_stream_cross_process_fd 1 +typedef int EGLNativeFileDescriptorKHR; +#ifdef EGL_KHR_stream +#define EGL_NO_FILE_DESCRIPTOR_KHR ((EGLNativeFileDescriptorKHR)(-1)) +typedef EGLNativeFileDescriptorKHR (EGLAPIENTRYP PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLNativeFileDescriptorKHR EGLAPIENTRY eglGetStreamFileDescriptorKHR (EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamFromFileDescriptorKHR (EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor); +#endif +#endif /* EGL_KHR_stream */ +#endif /* EGL_KHR_stream_cross_process_fd */ + +#ifndef EGL_KHR_stream_fifo +#define EGL_KHR_stream_fifo 1 +#ifdef EGL_KHR_stream +#define EGL_STREAM_FIFO_LENGTH_KHR 0x31FC +#define EGL_STREAM_TIME_NOW_KHR 0x31FD +#define EGL_STREAM_TIME_CONSUMER_KHR 0x31FE +#define EGL_STREAM_TIME_PRODUCER_KHR 0x31FF +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMTIMEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamTimeKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value); +#endif +#endif /* EGL_KHR_stream */ +#endif /* EGL_KHR_stream_fifo */ + +#ifndef EGL_KHR_stream_producer_aldatalocator +#define EGL_KHR_stream_producer_aldatalocator 1 +#ifdef EGL_KHR_stream +#endif /* EGL_KHR_stream */ +#endif /* EGL_KHR_stream_producer_aldatalocator */ + +#ifndef EGL_KHR_stream_producer_eglsurface +#define EGL_KHR_stream_producer_eglsurface 1 +#ifdef EGL_KHR_stream +#define EGL_STREAM_BIT_KHR 0x0800 +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC) (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSurface EGLAPIENTRY eglCreateStreamProducerSurfaceKHR (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list); +#endif +#endif /* EGL_KHR_stream */ +#endif /* EGL_KHR_stream_producer_eglsurface */ + +#ifndef EGL_KHR_surfaceless_context +#define EGL_KHR_surfaceless_context 1 +#endif /* EGL_KHR_surfaceless_context */ + +#ifndef EGL_KHR_swap_buffers_with_damage +#define EGL_KHR_swap_buffers_with_damage 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageKHR (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects); +#endif +#endif /* EGL_KHR_swap_buffers_with_damage */ + +#ifndef EGL_KHR_vg_parent_image +#define EGL_KHR_vg_parent_image 1 +#define EGL_VG_PARENT_IMAGE_KHR 0x30BA +#endif /* EGL_KHR_vg_parent_image */ + +#ifndef EGL_KHR_wait_sync +#define EGL_KHR_wait_sync 1 +typedef EGLint (EGLAPIENTRYP PFNEGLWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLint EGLAPIENTRY eglWaitSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags); +#endif +#endif /* EGL_KHR_wait_sync */ + +#ifndef EGL_ANDROID_blob_cache +#define EGL_ANDROID_blob_cache 1 +typedef khronos_ssize_t EGLsizeiANDROID; +typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize); +typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize); +typedef void (EGLAPIENTRYP PFNEGLSETBLOBCACHEFUNCSANDROIDPROC) (EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI void EGLAPIENTRY eglSetBlobCacheFuncsANDROID (EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get); +#endif +#endif /* EGL_ANDROID_blob_cache */ + +#ifndef EGL_ANDROID_framebuffer_target +#define EGL_ANDROID_framebuffer_target 1 +#define EGL_FRAMEBUFFER_TARGET_ANDROID 0x3147 +#endif /* EGL_ANDROID_framebuffer_target */ + +#ifndef EGL_ANDROID_image_native_buffer +#define EGL_ANDROID_image_native_buffer 1 +#define EGL_NATIVE_BUFFER_ANDROID 0x3140 +#endif /* EGL_ANDROID_image_native_buffer */ + +#ifndef EGL_ANDROID_native_fence_sync +#define EGL_ANDROID_native_fence_sync 1 +#define EGL_SYNC_NATIVE_FENCE_ANDROID 0x3144 +#define EGL_SYNC_NATIVE_FENCE_FD_ANDROID 0x3145 +#define EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID 0x3146 +#define EGL_NO_NATIVE_FENCE_FD_ANDROID -1 +typedef EGLint (EGLAPIENTRYP PFNEGLDUPNATIVEFENCEFDANDROIDPROC) (EGLDisplay dpy, EGLSyncKHR sync); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLint EGLAPIENTRY eglDupNativeFenceFDANDROID (EGLDisplay dpy, EGLSyncKHR sync); +#endif +#endif /* EGL_ANDROID_native_fence_sync */ + +#ifndef EGL_ANDROID_recordable +#define EGL_ANDROID_recordable 1 +#define EGL_RECORDABLE_ANDROID 0x3142 +#endif /* EGL_ANDROID_recordable */ + +#ifndef EGL_ANGLE_d3d_share_handle_client_buffer +#define EGL_ANGLE_d3d_share_handle_client_buffer 1 +#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200 +#endif /* EGL_ANGLE_d3d_share_handle_client_buffer */ + +#ifndef EGL_ANGLE_device_d3d +#define EGL_ANGLE_device_d3d 1 +#define EGL_D3D9_DEVICE_ANGLE 0x33A0 +#define EGL_D3D11_DEVICE_ANGLE 0x33A1 +#endif /* EGL_ANGLE_device_d3d */ + +#ifndef EGL_ANGLE_query_surface_pointer +#define EGL_ANGLE_query_surface_pointer 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPOINTERANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurfacePointerANGLE (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value); +#endif +#endif /* EGL_ANGLE_query_surface_pointer */ + +#ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle +#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1 +#endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */ + +#ifndef EGL_ANGLE_window_fixed_size +#define EGL_ANGLE_window_fixed_size 1 +#define EGL_FIXED_SIZE_ANGLE 0x3201 +#endif /* EGL_ANGLE_window_fixed_size */ + +#ifndef EGL_ARM_pixmap_multisample_discard +#define EGL_ARM_pixmap_multisample_discard 1 +#define EGL_DISCARD_SAMPLES_ARM 0x3286 +#endif /* EGL_ARM_pixmap_multisample_discard */ + +#ifndef EGL_EXT_buffer_age +#define EGL_EXT_buffer_age 1 +#define EGL_BUFFER_AGE_EXT 0x313D +#endif /* EGL_EXT_buffer_age */ + +#ifndef EGL_EXT_client_extensions +#define EGL_EXT_client_extensions 1 +#endif /* EGL_EXT_client_extensions */ + +#ifndef EGL_EXT_create_context_robustness +#define EGL_EXT_create_context_robustness 1 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT 0x30BF +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT 0x3138 +#define EGL_NO_RESET_NOTIFICATION_EXT 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET_EXT 0x31BF +#endif /* EGL_EXT_create_context_robustness */ + +#ifndef EGL_EXT_device_base +#define EGL_EXT_device_base 1 +typedef void *EGLDeviceEXT; +#define EGL_NO_DEVICE_EXT ((EGLDeviceEXT)(0)) +#define EGL_BAD_DEVICE_EXT 0x322B +#define EGL_DEVICE_EXT 0x322C +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICEATTRIBEXTPROC) (EGLDeviceEXT device, EGLint attribute, EGLAttrib *value); +typedef const char *(EGLAPIENTRYP PFNEGLQUERYDEVICESTRINGEXTPROC) (EGLDeviceEXT device, EGLint name); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICESEXTPROC) (EGLint max_devices, EGLDeviceEXT *devices, EGLint *num_devices); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBEXTPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDeviceAttribEXT (EGLDeviceEXT device, EGLint attribute, EGLAttrib *value); +EGLAPI const char *EGLAPIENTRY eglQueryDeviceStringEXT (EGLDeviceEXT device, EGLint name); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDevicesEXT (EGLint max_devices, EGLDeviceEXT *devices, EGLint *num_devices); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribEXT (EGLDisplay dpy, EGLint attribute, EGLAttrib *value); +#endif +#endif /* EGL_EXT_device_base */ + +#ifndef EGL_EXT_device_drm +#define EGL_EXT_device_drm 1 +#define EGL_DRM_DEVICE_FILE_EXT 0x3233 +#endif /* EGL_EXT_device_drm */ + +#ifndef EGL_EXT_device_enumeration +#define EGL_EXT_device_enumeration 1 +#endif /* EGL_EXT_device_enumeration */ + +#ifndef EGL_EXT_device_openwf +#define EGL_EXT_device_openwf 1 +#define EGL_OPENWF_DEVICE_ID_EXT 0x3237 +#endif /* EGL_EXT_device_openwf */ + +#ifndef EGL_EXT_device_query +#define EGL_EXT_device_query 1 +#endif /* EGL_EXT_device_query */ + +#ifndef EGL_EXT_image_dma_buf_import +#define EGL_EXT_image_dma_buf_import 1 +#define EGL_LINUX_DMA_BUF_EXT 0x3270 +#define EGL_LINUX_DRM_FOURCC_EXT 0x3271 +#define EGL_DMA_BUF_PLANE0_FD_EXT 0x3272 +#define EGL_DMA_BUF_PLANE0_OFFSET_EXT 0x3273 +#define EGL_DMA_BUF_PLANE0_PITCH_EXT 0x3274 +#define EGL_DMA_BUF_PLANE1_FD_EXT 0x3275 +#define EGL_DMA_BUF_PLANE1_OFFSET_EXT 0x3276 +#define EGL_DMA_BUF_PLANE1_PITCH_EXT 0x3277 +#define EGL_DMA_BUF_PLANE2_FD_EXT 0x3278 +#define EGL_DMA_BUF_PLANE2_OFFSET_EXT 0x3279 +#define EGL_DMA_BUF_PLANE2_PITCH_EXT 0x327A +#define EGL_YUV_COLOR_SPACE_HINT_EXT 0x327B +#define EGL_SAMPLE_RANGE_HINT_EXT 0x327C +#define EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT 0x327D +#define EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT 0x327E +#define EGL_ITU_REC601_EXT 0x327F +#define EGL_ITU_REC709_EXT 0x3280 +#define EGL_ITU_REC2020_EXT 0x3281 +#define EGL_YUV_FULL_RANGE_EXT 0x3282 +#define EGL_YUV_NARROW_RANGE_EXT 0x3283 +#define EGL_YUV_CHROMA_SITING_0_EXT 0x3284 +#define EGL_YUV_CHROMA_SITING_0_5_EXT 0x3285 +#endif /* EGL_EXT_image_dma_buf_import */ + +#ifndef EGL_EXT_multiview_window +#define EGL_EXT_multiview_window 1 +#define EGL_MULTIVIEW_VIEW_COUNT_EXT 0x3134 +#endif /* EGL_EXT_multiview_window */ + +#ifndef EGL_EXT_output_base +#define EGL_EXT_output_base 1 +typedef void *EGLOutputLayerEXT; +typedef void *EGLOutputPortEXT; +#define EGL_NO_OUTPUT_LAYER_EXT ((EGLOutputLayerEXT)0) +#define EGL_NO_OUTPUT_PORT_EXT ((EGLOutputPortEXT)0) +#define EGL_BAD_OUTPUT_LAYER_EXT 0x322D +#define EGL_BAD_OUTPUT_PORT_EXT 0x322E +#define EGL_SWAP_INTERVAL_EXT 0x322F +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTLAYERSEXTPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputLayerEXT *layers, EGLint max_layers, EGLint *num_layers); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTPORTSEXTPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputPortEXT *ports, EGLint max_ports, EGLint *num_ports); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib *value); +typedef const char *(EGLAPIENTRYP PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib *value); +typedef const char *(EGLAPIENTRYP PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint name); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglGetOutputLayersEXT (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputLayerEXT *layers, EGLint max_layers, EGLint *num_layers); +EGLAPI EGLBoolean EGLAPIENTRY eglGetOutputPortsEXT (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputPortEXT *ports, EGLint max_ports, EGLint *num_ports); +EGLAPI EGLBoolean EGLAPIENTRY eglOutputLayerAttribEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryOutputLayerAttribEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib *value); +EGLAPI const char *EGLAPIENTRY eglQueryOutputLayerStringEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name); +EGLAPI EGLBoolean EGLAPIENTRY eglOutputPortAttribEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryOutputPortAttribEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib *value); +EGLAPI const char *EGLAPIENTRY eglQueryOutputPortStringEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint name); +#endif +#endif /* EGL_EXT_output_base */ + +#ifndef EGL_EXT_output_drm +#define EGL_EXT_output_drm 1 +#define EGL_DRM_CRTC_EXT 0x3234 +#define EGL_DRM_PLANE_EXT 0x3235 +#define EGL_DRM_CONNECTOR_EXT 0x3236 +#endif /* EGL_EXT_output_drm */ + +#ifndef EGL_EXT_output_openwf +#define EGL_EXT_output_openwf 1 +#define EGL_OPENWF_PIPELINE_ID_EXT 0x3238 +#define EGL_OPENWF_PORT_ID_EXT 0x3239 +#endif /* EGL_EXT_output_openwf */ + +#ifndef EGL_EXT_platform_base +#define EGL_EXT_platform_base 1 +typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLenum platform, void *native_display, const EGLint *attrib_list); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT (EGLenum platform, void *native_display, const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurfaceEXT (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list); +#endif +#endif /* EGL_EXT_platform_base */ + +#ifndef EGL_EXT_platform_device +#define EGL_EXT_platform_device 1 +#define EGL_PLATFORM_DEVICE_EXT 0x313F +#endif /* EGL_EXT_platform_device */ + +#ifndef EGL_EXT_platform_wayland +#define EGL_EXT_platform_wayland 1 +#define EGL_PLATFORM_WAYLAND_EXT 0x31D8 +#endif /* EGL_EXT_platform_wayland */ + +#ifndef EGL_EXT_platform_x11 +#define EGL_EXT_platform_x11 1 +#define EGL_PLATFORM_X11_EXT 0x31D5 +#define EGL_PLATFORM_X11_SCREEN_EXT 0x31D6 +#endif /* EGL_EXT_platform_x11 */ + +#ifndef EGL_EXT_protected_surface +#define EGL_EXT_protected_surface 1 +#define EGL_PROTECTED_CONTENT_EXT 0x32C0 +#endif /* EGL_EXT_protected_surface */ + +#ifndef EGL_EXT_stream_consumer_egloutput +#define EGL_EXT_stream_consumer_egloutput 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMEROUTPUTEXTPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerOutputEXT (EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer); +#endif +#endif /* EGL_EXT_stream_consumer_egloutput */ + +#ifndef EGL_EXT_swap_buffers_with_damage +#define EGL_EXT_swap_buffers_with_damage 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageEXT (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects); +#endif +#endif /* EGL_EXT_swap_buffers_with_damage */ + +#ifndef EGL_EXT_yuv_surface +#define EGL_EXT_yuv_surface 1 +#define EGL_YUV_ORDER_EXT 0x3301 +#define EGL_YUV_NUMBER_OF_PLANES_EXT 0x3311 +#define EGL_YUV_SUBSAMPLE_EXT 0x3312 +#define EGL_YUV_DEPTH_RANGE_EXT 0x3317 +#define EGL_YUV_CSC_STANDARD_EXT 0x330A +#define EGL_YUV_PLANE_BPP_EXT 0x331A +#define EGL_YUV_BUFFER_EXT 0x3300 +#define EGL_YUV_ORDER_YUV_EXT 0x3302 +#define EGL_YUV_ORDER_YVU_EXT 0x3303 +#define EGL_YUV_ORDER_YUYV_EXT 0x3304 +#define EGL_YUV_ORDER_UYVY_EXT 0x3305 +#define EGL_YUV_ORDER_YVYU_EXT 0x3306 +#define EGL_YUV_ORDER_VYUY_EXT 0x3307 +#define EGL_YUV_ORDER_AYUV_EXT 0x3308 +#define EGL_YUV_SUBSAMPLE_4_2_0_EXT 0x3313 +#define EGL_YUV_SUBSAMPLE_4_2_2_EXT 0x3314 +#define EGL_YUV_SUBSAMPLE_4_4_4_EXT 0x3315 +#define EGL_YUV_DEPTH_RANGE_LIMITED_EXT 0x3318 +#define EGL_YUV_DEPTH_RANGE_FULL_EXT 0x3319 +#define EGL_YUV_CSC_STANDARD_601_EXT 0x330B +#define EGL_YUV_CSC_STANDARD_709_EXT 0x330C +#define EGL_YUV_CSC_STANDARD_2020_EXT 0x330D +#define EGL_YUV_PLANE_BPP_0_EXT 0x331B +#define EGL_YUV_PLANE_BPP_8_EXT 0x331C +#define EGL_YUV_PLANE_BPP_10_EXT 0x331D +#endif /* EGL_EXT_yuv_surface */ + +#ifndef EGL_HI_clientpixmap +#define EGL_HI_clientpixmap 1 +struct EGLClientPixmapHI { + void *pData; + EGLint iWidth; + EGLint iHeight; + EGLint iStride; +}; +#define EGL_CLIENT_PIXMAP_POINTER_HI 0x8F74 +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEHIPROC) (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI *pixmap); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurfaceHI (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI *pixmap); +#endif +#endif /* EGL_HI_clientpixmap */ + +#ifndef EGL_HI_colorformats +#define EGL_HI_colorformats 1 +#define EGL_COLOR_FORMAT_HI 0x8F70 +#define EGL_COLOR_RGB_HI 0x8F71 +#define EGL_COLOR_RGBA_HI 0x8F72 +#define EGL_COLOR_ARGB_HI 0x8F73 +#endif /* EGL_HI_colorformats */ + +#ifndef EGL_IMG_context_priority +#define EGL_IMG_context_priority 1 +#define EGL_CONTEXT_PRIORITY_LEVEL_IMG 0x3100 +#define EGL_CONTEXT_PRIORITY_HIGH_IMG 0x3101 +#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG 0x3102 +#define EGL_CONTEXT_PRIORITY_LOW_IMG 0x3103 +#endif /* EGL_IMG_context_priority */ + +#ifndef EGL_MESA_drm_image +#define EGL_MESA_drm_image 1 +#define EGL_DRM_BUFFER_FORMAT_MESA 0x31D0 +#define EGL_DRM_BUFFER_USE_MESA 0x31D1 +#define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2 +#define EGL_DRM_BUFFER_MESA 0x31D3 +#define EGL_DRM_BUFFER_STRIDE_MESA 0x31D4 +#define EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x00000001 +#define EGL_DRM_BUFFER_USE_SHARE_MESA 0x00000002 +typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEDRMIMAGEMESAPROC) (EGLDisplay dpy, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDRMIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLImageKHR EGLAPIENTRY eglCreateDRMImageMESA (EGLDisplay dpy, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglExportDRMImageMESA (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride); +#endif +#endif /* EGL_MESA_drm_image */ + +#ifndef EGL_MESA_image_dma_buf_export +#define EGL_MESA_image_dma_buf_export 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int *fourcc, int *num_planes, EGLuint64KHR *modifiers); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDMABUFIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int *fds, EGLint *strides, EGLint *offsets); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglExportDMABUFImageQueryMESA (EGLDisplay dpy, EGLImageKHR image, int *fourcc, int *num_planes, EGLuint64KHR *modifiers); +EGLAPI EGLBoolean EGLAPIENTRY eglExportDMABUFImageMESA (EGLDisplay dpy, EGLImageKHR image, int *fds, EGLint *strides, EGLint *offsets); +#endif +#endif /* EGL_MESA_image_dma_buf_export */ + +#ifndef EGL_MESA_platform_gbm +#define EGL_MESA_platform_gbm 1 +#define EGL_PLATFORM_GBM_MESA 0x31D7 +#endif /* EGL_MESA_platform_gbm */ + +#ifndef EGL_NOK_swap_region +#define EGL_NOK_swap_region 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSREGIONNOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersRegionNOK (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects); +#endif +#endif /* EGL_NOK_swap_region */ + +#ifndef EGL_NOK_swap_region2 +#define EGL_NOK_swap_region2 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSREGION2NOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersRegion2NOK (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects); +#endif +#endif /* EGL_NOK_swap_region2 */ + +#ifndef EGL_NOK_texture_from_pixmap +#define EGL_NOK_texture_from_pixmap 1 +#define EGL_Y_INVERTED_NOK 0x307F +#endif /* EGL_NOK_texture_from_pixmap */ + +#ifndef EGL_NV_3dvision_surface +#define EGL_NV_3dvision_surface 1 +#define EGL_AUTO_STEREO_NV 0x3136 +#endif /* EGL_NV_3dvision_surface */ + +#ifndef EGL_NV_coverage_sample +#define EGL_NV_coverage_sample 1 +#define EGL_COVERAGE_BUFFERS_NV 0x30E0 +#define EGL_COVERAGE_SAMPLES_NV 0x30E1 +#endif /* EGL_NV_coverage_sample */ + +#ifndef EGL_NV_coverage_sample_resolve +#define EGL_NV_coverage_sample_resolve 1 +#define EGL_COVERAGE_SAMPLE_RESOLVE_NV 0x3131 +#define EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV 0x3132 +#define EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV 0x3133 +#endif /* EGL_NV_coverage_sample_resolve */ + +#ifndef EGL_NV_cuda_event +#define EGL_NV_cuda_event 1 +#define EGL_CUDA_EVENT_HANDLE_NV 0x323B +#define EGL_SYNC_CUDA_EVENT_NV 0x323C +#define EGL_SYNC_CUDA_EVENT_COMPLETE_NV 0x323D +#endif /* EGL_NV_cuda_event */ + +#ifndef EGL_NV_depth_nonlinear +#define EGL_NV_depth_nonlinear 1 +#define EGL_DEPTH_ENCODING_NV 0x30E2 +#define EGL_DEPTH_ENCODING_NONE_NV 0 +#define EGL_DEPTH_ENCODING_NONLINEAR_NV 0x30E3 +#endif /* EGL_NV_depth_nonlinear */ + +#ifndef EGL_NV_device_cuda +#define EGL_NV_device_cuda 1 +#define EGL_CUDA_DEVICE_NV 0x323A +#endif /* EGL_NV_device_cuda */ + +#ifndef EGL_NV_native_query +#define EGL_NV_native_query 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEDISPLAYNVPROC) (EGLDisplay dpy, EGLNativeDisplayType *display_id); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEWINDOWNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType *window); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEPIXMAPNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType *pixmap); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativeDisplayNV (EGLDisplay dpy, EGLNativeDisplayType *display_id); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativeWindowNV (EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType *window); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativePixmapNV (EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType *pixmap); +#endif +#endif /* EGL_NV_native_query */ + +#ifndef EGL_NV_post_convert_rounding +#define EGL_NV_post_convert_rounding 1 +#endif /* EGL_NV_post_convert_rounding */ + +#ifndef EGL_NV_post_sub_buffer +#define EGL_NV_post_sub_buffer 1 +#define EGL_POST_SUB_BUFFER_SUPPORTED_NV 0x30BE +typedef EGLBoolean (EGLAPIENTRYP PFNEGLPOSTSUBBUFFERNVPROC) (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglPostSubBufferNV (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height); +#endif +#endif /* EGL_NV_post_sub_buffer */ + +#ifndef EGL_NV_stream_sync +#define EGL_NV_stream_sync 1 +#define EGL_SYNC_NEW_FRAME_NV 0x321F +typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESTREAMSYNCNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateStreamSyncNV (EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint *attrib_list); +#endif +#endif /* EGL_NV_stream_sync */ + +#ifndef EGL_NV_sync +#define EGL_NV_sync 1 +typedef void *EGLSyncNV; +typedef khronos_utime_nanoseconds_t EGLTimeNV; +#ifdef KHRONOS_SUPPORT_INT64 +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV 0x30E6 +#define EGL_SYNC_STATUS_NV 0x30E7 +#define EGL_SIGNALED_NV 0x30E8 +#define EGL_UNSIGNALED_NV 0x30E9 +#define EGL_SYNC_FLUSH_COMMANDS_BIT_NV 0x0001 +#define EGL_FOREVER_NV 0xFFFFFFFFFFFFFFFFull +#define EGL_ALREADY_SIGNALED_NV 0x30EA +#define EGL_TIMEOUT_EXPIRED_NV 0x30EB +#define EGL_CONDITION_SATISFIED_NV 0x30EC +#define EGL_SYNC_TYPE_NV 0x30ED +#define EGL_SYNC_CONDITION_NV 0x30EE +#define EGL_SYNC_FENCE_NV 0x30EF +#define EGL_NO_SYNC_NV ((EGLSyncNV)0) +typedef EGLSyncNV (EGLAPIENTRYP PFNEGLCREATEFENCESYNCNVPROC) (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCNVPROC) (EGLSyncNV sync); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLFENCENVPROC) (EGLSyncNV sync); +typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCNVPROC) (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCNVPROC) (EGLSyncNV sync, EGLenum mode); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBNVPROC) (EGLSyncNV sync, EGLint attribute, EGLint *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncNV EGLAPIENTRY eglCreateFenceSyncNV (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncNV (EGLSyncNV sync); +EGLAPI EGLBoolean EGLAPIENTRY eglFenceNV (EGLSyncNV sync); +EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncNV (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout); +EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncNV (EGLSyncNV sync, EGLenum mode); +EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribNV (EGLSyncNV sync, EGLint attribute, EGLint *value); +#endif +#endif /* KHRONOS_SUPPORT_INT64 */ +#endif /* EGL_NV_sync */ + +#ifndef EGL_NV_system_time +#define EGL_NV_system_time 1 +typedef khronos_utime_nanoseconds_t EGLuint64NV; +#ifdef KHRONOS_SUPPORT_INT64 +typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC) (void); +typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMENVPROC) (void); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeFrequencyNV (void); +EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeNV (void); +#endif +#endif /* KHRONOS_SUPPORT_INT64 */ +#endif /* EGL_NV_system_time */ + +#ifndef EGL_TIZEN_image_native_buffer +#define EGL_TIZEN_image_native_buffer 1 +#define EGL_NATIVE_BUFFER_TIZEN 0x32A0 +#endif /* EGL_TIZEN_image_native_buffer */ + +#ifndef EGL_TIZEN_image_native_surface +#define EGL_TIZEN_image_native_surface 1 +#define EGL_NATIVE_SURFACE_TIZEN 0x32A1 +#endif /* EGL_TIZEN_image_native_surface */ + +#ifdef __cplusplus +} +#endif + +#endif /* __eglext_h_ */ + + +#endif /* _MSC_VER */ diff --git a/lib/SDL2/include/SDL_endian.h b/lib/SDL2/include/SDL_endian.h index 161c418de9..9100b103db 100644 --- a/lib/SDL2/include/SDL_endian.h +++ b/lib/SDL2/include/SDL_endian.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -42,7 +42,7 @@ #ifdef __linux__ #include #define SDL_BYTEORDER __BYTE_ORDER -#else /* __linux __ */ +#else /* __linux__ */ #if defined(__hppa__) || \ defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \ (defined(__MIPS__) && defined(__MISPEB__)) || \ @@ -52,7 +52,7 @@ #else #define SDL_BYTEORDER SDL_LIL_ENDIAN #endif -#endif /* __linux __ */ +#endif /* __linux__ */ #endif /* !SDL_BYTEORDER */ diff --git a/lib/SDL2/include/SDL_error.h b/lib/SDL2/include/SDL_error.h index 5776cfa260..2f3b4b5008 100644 --- a/lib/SDL2/include/SDL_error.h +++ b/lib/SDL2/include/SDL_error.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -38,7 +38,7 @@ extern "C" { /* Public functions */ /* SDL_SetError() unconditionally returns -1. */ -extern DECLSPEC int SDLCALL SDL_SetError(const char *fmt, ...); +extern DECLSPEC int SDLCALL SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); extern DECLSPEC const char *SDLCALL SDL_GetError(void); extern DECLSPEC void SDLCALL SDL_ClearError(void); diff --git a/lib/SDL2/include/SDL_events.h b/lib/SDL2/include/SDL_events.h index fc5a145e75..1437f4c705 100644 --- a/lib/SDL2/include/SDL_events.h +++ b/lib/SDL2/include/SDL_events.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -59,7 +59,7 @@ typedef enum /* Application events */ SDL_QUIT = 0x100, /**< User-requested quit */ - /* These application events have special meaning on iOS, see README-ios.txt for details */ + /* These application events have special meaning on iOS, see README-ios.md for details */ SDL_APP_TERMINATING, /**< The application is being terminated by the OS Called on iOS in applicationWillTerminate() Called on Android in onDestroy() @@ -94,6 +94,9 @@ typedef enum SDL_KEYUP, /**< Key released */ SDL_TEXTEDITING, /**< Keyboard text editing (composition) */ SDL_TEXTINPUT, /**< Keyboard text input */ + SDL_KEYMAPCHANGED, /**< Keymap changed due to a system event such as an + input language or keyboard layout change. + */ /* Mouse events */ SDL_MOUSEMOTION = 0x400, /**< Mouse moved */ @@ -134,8 +137,13 @@ typedef enum /* Drag and drop events */ SDL_DROPFILE = 0x1000, /**< The system requests a file open */ + /* Audio hotplug events */ + SDL_AUDIODEVICEADDED = 0x1100, /**< A new audio device is available */ + SDL_AUDIODEVICEREMOVED, /**< An audio device has been removed. */ + /* Render events */ - SDL_RENDER_TARGETS_RESET = 0x2000, /**< The render targets have been reset */ + SDL_RENDER_TARGETS_RESET = 0x2000, /**< The render targets have been reset and their contents need to be updated */ + SDL_RENDER_DEVICE_RESET, /**< The device has been reset and all textures need to be recreated */ /** Events ::SDL_USEREVENT through ::SDL_LASTEVENT are for your use, * and should be allocated with SDL_RegisterEvents() @@ -259,6 +267,7 @@ typedef struct SDL_MouseWheelEvent Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */ Sint32 x; /**< The amount scrolled horizontally, positive to the right and negative to the left */ Sint32 y; /**< The amount scrolled vertically, positive away from the user and negative toward the user */ + Uint32 direction; /**< Set to one of the SDL_MOUSEWHEEL_* defines. When FLIPPED the values in X and Y will be opposite. Multiply by -1 to change them back */ } SDL_MouseWheelEvent; /** @@ -380,6 +389,20 @@ typedef struct SDL_ControllerDeviceEvent Sint32 which; /**< The joystick device index for the ADDED event, instance id for the REMOVED or REMAPPED event */ } SDL_ControllerDeviceEvent; +/** + * \brief Audio device event structure (event.adevice.*) + */ +typedef struct SDL_AudioDeviceEvent +{ + Uint32 type; /**< ::SDL_AUDIODEVICEADDED, or ::SDL_AUDIODEVICEREMOVED */ + Uint32 timestamp; + Uint32 which; /**< The audio device index for the ADDED event (valid until next SDL_GetNumAudioDevices() call), SDL_AudioDeviceID for the REMOVED event */ + Uint8 iscapture; /**< zero if an output device, non-zero if a capture device. */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; +} SDL_AudioDeviceEvent; + /** * \brief Touch finger event structure (event.tfinger.*) @@ -392,8 +415,8 @@ typedef struct SDL_TouchFingerEvent SDL_FingerID fingerId; float x; /**< Normalized in the range 0...1 */ float y; /**< Normalized in the range 0...1 */ - float dx; /**< Normalized in the range 0...1 */ - float dy; /**< Normalized in the range 0...1 */ + float dx; /**< Normalized in the range -1...1 */ + float dy; /**< Normalized in the range -1...1 */ float pressure; /**< Normalized in the range 0...1 */ } SDL_TouchFingerEvent; @@ -420,7 +443,7 @@ typedef struct SDL_MultiGestureEvent */ typedef struct SDL_DollarGestureEvent { - Uint32 type; /**< ::SDL_DOLLARGESTURE */ + Uint32 type; /**< ::SDL_DOLLARGESTURE or ::SDL_DOLLARRECORD */ Uint32 timestamp; SDL_TouchID touchId; /**< The touch device id */ SDL_GestureID gestureId; @@ -433,8 +456,8 @@ typedef struct SDL_DollarGestureEvent /** * \brief An event used to request a file open by the system (event.drop.*) - * This event is disabled by default, you can enable it with SDL_EventState() - * \note If you enable this event, you must free the filename in the event. + * This event is enabled by default, you can disable it with SDL_EventState(). + * \note If this event is enabled, you must free the filename in the event. */ typedef struct SDL_DropEvent { @@ -514,6 +537,7 @@ typedef union SDL_Event SDL_ControllerAxisEvent caxis; /**< Game Controller axis event data */ SDL_ControllerButtonEvent cbutton; /**< Game Controller button event data */ SDL_ControllerDeviceEvent cdevice; /**< Game Controller device event data */ + SDL_AudioDeviceEvent adevice; /**< Audio device event data */ SDL_QuitEvent quit; /**< Quit request event data */ SDL_UserEvent user; /**< Custom event data */ SDL_SysWMEvent syswm; /**< System dependent window event data */ @@ -583,6 +607,9 @@ extern DECLSPEC SDL_bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxType); /** * This function clears events from the event queue + * This function only affects currently queued events. If you want to make + * sure that all pending OS events are flushed, you can call SDL_PumpEvents() + * on the main thread immediately before the flush call. */ extern DECLSPEC void SDLCALL SDL_FlushEvent(Uint32 type); extern DECLSPEC void SDLCALL SDL_FlushEvents(Uint32 minType, Uint32 maxType); diff --git a/lib/SDL2/include/SDL_filesystem.h b/lib/SDL2/include/SDL_filesystem.h index de3e227d42..02999ed270 100644 --- a/lib/SDL2/include/SDL_filesystem.h +++ b/lib/SDL2/include/SDL_filesystem.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -131,6 +131,6 @@ extern DECLSPEC char *SDLCALL SDL_GetPrefPath(const char *org, const char *app); #endif #include "close_code.h" -#endif /* _SDL_system_h */ +#endif /* _SDL_filesystem_h */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/lib/SDL2/include/SDL_gamecontroller.h b/lib/SDL2/include/SDL_gamecontroller.h index b00ad713d1..42087eea16 100644 --- a/lib/SDL2/include/SDL_gamecontroller.h +++ b/lib/SDL2/include/SDL_gamecontroller.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -43,7 +43,7 @@ extern "C" { * \file SDL_gamecontroller.h * * In order to use these functions, SDL_Init() must have been called - * with the ::SDL_INIT_JOYSTICK flag. This causes SDL to scan the system + * with the ::SDL_INIT_GAMECONTROLLER flag. This causes SDL to scan the system * for game controllers, and load appropriate drivers. * * If you would like to receive controller updates while the application @@ -163,13 +163,19 @@ extern DECLSPEC const char *SDLCALL SDL_GameControllerNameForIndex(int joystick_ /** * Open a game controller for use. * The index passed as an argument refers to the N'th game controller on the system. - * This index is the value which will identify this controller in future controller - * events. + * This index is not the value which will identify this controller in future + * controller events. The joystick's instance id (::SDL_JoystickID) will be + * used there instead. * * \return A controller identifier, or NULL if an error occurred. */ extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerOpen(int joystick_index); +/** + * Return the SDL_GameController associated with an instance id. + */ +extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerFromInstanceID(SDL_JoystickID joyid); + /** * Return the name for this currently opened controller */ @@ -241,7 +247,8 @@ SDL_GameControllerGetBindForAxis(SDL_GameController *gamecontroller, /** * Get the current state of an axis control on a game controller. * - * The state is a value ranging from -32768 to 32767. + * The state is a value ranging from -32768 to 32767 (except for the triggers, + * which range from 0 to 32767). * * The axis indices start at index 0. */ diff --git a/lib/SDL2/include/SDL_gesture.h b/lib/SDL2/include/SDL_gesture.h index dbc1692423..3c29ca7ac8 100644 --- a/lib/SDL2/include/SDL_gesture.h +++ b/lib/SDL2/include/SDL_gesture.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_haptic.h b/lib/SDL2/include/SDL_haptic.h index 234975abe3..b36d78b127 100644 --- a/lib/SDL2/include/SDL_haptic.h +++ b/lib/SDL2/include/SDL_haptic.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -102,11 +102,6 @@ * return 0; // Success * } * \endcode - * - * You can also find out more information on my blog: - * http://bobbens.dyndns.org/journal/2010/sdl_haptic/ - * - * \author Edgar Simo Serra */ #ifndef _SDL_haptic_h @@ -347,6 +342,9 @@ typedef struct _SDL_Haptic SDL_Haptic; /** * \brief Structure that represents a haptic direction. * + * This is the direction where the force comes from, + * instead of the direction in which the force is exerted. + * * Directions can be specified by: * - ::SDL_HAPTIC_POLAR : Specified by polar coordinates. * - ::SDL_HAPTIC_CARTESIAN : Specified by cartesian coordinates. @@ -370,7 +368,7 @@ typedef struct _SDL_Haptic SDL_Haptic; ^ | | - (1,0) West <----[ HAPTIC ]----> East (-1,0) + (-1,0) West <----[ HAPTIC ]----> East (1,0) | | v @@ -395,9 +393,9 @@ typedef struct _SDL_Haptic SDL_Haptic; * (X axis, Y axis and Z axis (with 3 axes)). ::SDL_HAPTIC_CARTESIAN uses * the first three \c dir parameters. The cardinal directions would be: * - North: 0,-1, 0 - * - East: -1, 0, 0 + * - East: 1, 0, 0 * - South: 0, 1, 0 - * - West: 1, 0, 0 + * - West: -1, 0, 0 * * The Z axis represents the height of the effect if supported, otherwise * it's unused. In cartesian encoding (1, 2) would be the same as (2, 4), you @@ -492,7 +490,7 @@ typedef struct SDL_HapticConstant * over time. The type determines the shape of the wave and the parameters * determine the dimensions of the wave. * - * Phase is given by hundredth of a cycle meaning that giving the phase a value + * Phase is given by hundredth of a degree meaning that giving the phase a value * of 9000 will displace it 25% of its period. Here are sample values: * - 0: No phase displacement. * - 9000: Displaced 25% of its period. @@ -553,9 +551,9 @@ typedef struct SDL_HapticPeriodic /* Periodic */ Uint16 period; /**< Period of the wave. */ - Sint16 magnitude; /**< Peak value. */ + Sint16 magnitude; /**< Peak value; if negative, equivalent to 180 degrees extra phase shift. */ Sint16 offset; /**< Mean value of the wave. */ - Uint16 phase; /**< Horizontal shift given by hundredth of a cycle. */ + Uint16 phase; /**< Positive phase shift given by hundredth of a degree. */ /* Envelope */ Uint16 attack_length; /**< Duration of the attack. */ @@ -604,11 +602,11 @@ typedef struct SDL_HapticCondition Uint16 interval; /**< How soon it can be triggered again after button. */ /* Condition */ - Uint16 right_sat[3]; /**< Level when joystick is to the positive side. */ - Uint16 left_sat[3]; /**< Level when joystick is to the negative side. */ + Uint16 right_sat[3]; /**< Level when joystick is to the positive side; max 0xFFFF. */ + Uint16 left_sat[3]; /**< Level when joystick is to the negative side; max 0xFFFF. */ Sint16 right_coeff[3]; /**< How fast to increase the force towards the positive side. */ Sint16 left_coeff[3]; /**< How fast to increase the force towards the negative side. */ - Uint16 deadband[3]; /**< Size of the dead zone. */ + Uint16 deadband[3]; /**< Size of the dead zone; max 0xFFFF: whole axis-range when 0-centered. */ Sint16 center[3]; /**< Position of the dead zone. */ } SDL_HapticCondition; @@ -897,7 +895,7 @@ extern DECLSPEC int SDLCALL SDL_JoystickIsHaptic(SDL_Joystick * joystick); /** * \brief Opens a Haptic device for usage from a Joystick device. * - * You must still close the haptic device seperately. It will not be closed + * You must still close the haptic device separately. It will not be closed * with the joystick. * * When opening from a joystick you should first close the haptic device before @@ -954,7 +952,7 @@ extern DECLSPEC int SDLCALL SDL_HapticNumEffects(SDL_Haptic * haptic); extern DECLSPEC int SDLCALL SDL_HapticNumEffectsPlaying(SDL_Haptic * haptic); /** - * \brief Gets the haptic devices supported features in bitwise matter. + * \brief Gets the haptic device's supported features in bitwise manner. * * Example: * \code @@ -1148,7 +1146,7 @@ extern DECLSPEC int SDLCALL SDL_HapticPause(SDL_Haptic * haptic); * * Call to unpause after SDL_HapticPause(). * - * \param haptic Haptic device to pause. + * \param haptic Haptic device to unpause. * \return 0 on success or -1 on error. * * \sa SDL_HapticPause diff --git a/lib/SDL2/include/SDL_hints.h b/lib/SDL2/include/SDL_hints.h index b98ce6834c..3bd5435fb0 100644 --- a/lib/SDL2/include/SDL_hints.h +++ b/lib/SDL2/include/SDL_hints.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -116,7 +116,7 @@ extern "C" { * * By default, SDL does not use Direct3D Debug Layer. */ -#define SDL_HINT_RENDER_DIRECT3D11_DEBUG "SDL_HINT_RENDER_DIRECT3D11_DEBUG" +#define SDL_HINT_RENDER_DIRECT3D11_DEBUG "SDL_RENDER_DIRECT3D11_DEBUG" /** * \brief A variable controlling the scaling quality @@ -185,6 +185,42 @@ extern "C" { */ #define SDL_HINT_VIDEO_X11_XRANDR "SDL_VIDEO_X11_XRANDR" +/** + * \brief A variable controlling whether the X11 _NET_WM_PING protocol should be supported. + * + * This variable can be set to the following values: + * "0" - Disable _NET_WM_PING + * "1" - Enable _NET_WM_PING + * + * By default SDL will use _NET_WM_PING, but for applications that know they + * will not always be able to respond to ping requests in a timely manner they can + * turn it off to avoid the window manager thinking the app is hung. + * The hint is checked in CreateWindow. + */ +#define SDL_HINT_VIDEO_X11_NET_WM_PING "SDL_VIDEO_X11_NET_WM_PING" + +/** + * \brief A variable controlling whether the window frame and title bar are interactive when the cursor is hidden + * + * This variable can be set to the following values: + * "0" - The window frame is not interactive when the cursor is hidden (no move, resize, etc) + * "1" - The window frame is interactive when the cursor is hidden + * + * By default SDL will allow interaction with the window frame when the cursor is hidden + */ +#define SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN "SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN" + +/** + * \brief A variable controlling whether the windows message loop is processed by SDL + * + * This variable can be set to the following values: + * "0" - The window message loop is not run + * "1" - The window message loop is processed in SDL_PumpEvents() + * + * By default SDL will process the windows message loop + */ +#define SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP "SDL_WINDOWS_ENABLE_MESSAGELOOP" + /** * \brief A variable controlling whether grabbing input grabs the keyboard * @@ -221,6 +257,9 @@ extern "C" { * this is problematic. This functionality can be disabled by setting this * hint. * + * As of SDL 2.0.4, SDL_EnableScreenSaver and SDL_DisableScreenSaver accomplish + * the same thing on iOS. They should be preferred over this hint. + * * This variable can be set to the following values: * "0" - Enable idle timer * "1" - Disable idle timer @@ -239,8 +278,9 @@ extern "C" { #define SDL_HINT_ORIENTATIONS "SDL_IOS_ORIENTATIONS" /** - * \brief A variable controlling whether an Android built-in accelerometer should be - * listed as a joystick device, rather than listing actual joysticks only. + * \brief A variable controlling whether the Android / iOS built-in + * accelerometer should be listed as a joystick device, rather than listing + * actual joysticks only. * * This variable can be set to the following values: * "0" - List only real joysticks and accept input from them @@ -259,6 +299,16 @@ extern "C" { #define SDL_HINT_XINPUT_ENABLED "SDL_XINPUT_ENABLED" +/** + * \brief A variable that causes SDL to use the old axis and button mapping for XInput devices. + * + * This hint is for backwards compatibility only and will be removed in SDL 2.1 + * + * The default value is "0". This hint must be set before SDL_Init() + */ +#define SDL_HINT_XINPUT_USE_OLD_JOYSTICK_MAPPING "SDL_XINPUT_USE_OLD_JOYSTICK_MAPPING" + + /** * \brief A variable that lets you manually hint extra gamecontroller db entries * @@ -285,7 +335,7 @@ extern "C" { /** - * \brief If set to 0 then never set the top most bit on a SDL Window, even if the video mode expects it. + * \brief If set to "0" then never set the top most bit on a SDL Window, even if the video mode expects it. * This is a debugging aid for developers and not expected to be used by end users. The default is "1" * * This variable can be set to the following values: @@ -312,14 +362,25 @@ extern "C" { #define SDL_HINT_TIMER_RESOLUTION "SDL_TIMER_RESOLUTION" + +/** +* \brief A string specifying SDL's threads stack size in bytes or "0" for the backend's default size +* +* Use this hint in case you need to set SDL's threads stack size to other than the default. +* This is specially useful if you build SDL against a non glibc libc library (such as musl) which +* provides a relatively small default thread stack size (a few kilobytes versus the default 8MB glibc uses). +* Support for this hint is currently available only in the pthread backend. +*/ +#define SDL_HINT_THREAD_STACK_SIZE "SDL_THREAD_STACK_SIZE" + /** - * \brief If set to 1, then do not allow high-DPI windows. ("Retina" on Mac) + * \brief If set to 1, then do not allow high-DPI windows. ("Retina" on Mac and iOS) */ #define SDL_HINT_VIDEO_HIGHDPI_DISABLED "SDL_VIDEO_HIGHDPI_DISABLED" /** * \brief A variable that determines whether ctrl+click should generate a right-click event on Mac - * + * * If present, holding ctrl while left clicking will generate a right click * event when on Mac. */ @@ -360,7 +421,7 @@ extern "C" { */ #define SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT "SDL_VIDEO_WINDOW_SHARE_PIXEL_FORMAT" -/* +/** * \brief A URL to a WinRT app's privacy policy * * All network-enabled WinRT apps must make a privacy policy available to its @@ -384,13 +445,13 @@ extern "C" { * will not get used on that platform. Network-enabled phone apps should display * their privacy policy through some other, in-app means. */ -#define SDL_HINT_WINRT_PRIVACY_POLICY_URL "SDL_HINT_WINRT_PRIVACY_POLICY_URL" +#define SDL_HINT_WINRT_PRIVACY_POLICY_URL "SDL_WINRT_PRIVACY_POLICY_URL" /** \brief Label text for a WinRT app's privacy policy link * * Network-enabled WinRT apps must include a privacy policy. On Windows 8, 8.1, and RT, * Microsoft mandates that this policy be available via the Windows Settings charm. - * SDL provides code to add a link there, with it's label text being set via the + * SDL provides code to add a link there, with its label text being set via the * optional hint, SDL_HINT_WINRT_PRIVACY_POLICY_LABEL. * * Please note that a privacy policy's contents are not set via this hint. A separate @@ -405,16 +466,59 @@ extern "C" { * For additional information on linking to a privacy policy, see the documentation for * SDL_HINT_WINRT_PRIVACY_POLICY_URL. */ -#define SDL_HINT_WINRT_PRIVACY_POLICY_LABEL "SDL_HINT_WINRT_PRIVACY_POLICY_LABEL" - -/** \brief If set to 1, back button press events on Windows Phone 8+ will be marked as handled. - * - * TODO, WinRT: document SDL_HINT_WINRT_HANDLE_BACK_BUTTON need and use - * For now, more details on why this is needed can be found at the - * beginning of the following web page: +#define SDL_HINT_WINRT_PRIVACY_POLICY_LABEL "SDL_WINRT_PRIVACY_POLICY_LABEL" + +/** \brief Allows back-button-press events on Windows Phone to be marked as handled + * + * Windows Phone devices typically feature a Back button. When pressed, + * the OS will emit back-button-press events, which apps are expected to + * handle in an appropriate manner. If apps do not explicitly mark these + * events as 'Handled', then the OS will invoke its default behavior for + * unhandled back-button-press events, which on Windows Phone 8 and 8.1 is to + * terminate the app (and attempt to switch to the previous app, or to the + * device's home screen). + * + * Setting the SDL_HINT_WINRT_HANDLE_BACK_BUTTON hint to "1" will cause SDL + * to mark back-button-press events as Handled, if and when one is sent to + * the app. + * + * Internally, Windows Phone sends back button events as parameters to + * special back-button-press callback functions. Apps that need to respond + * to back-button-press events are expected to register one or more + * callback functions for such, shortly after being launched (during the + * app's initialization phase). After the back button is pressed, the OS + * will invoke these callbacks. If the app's callback(s) do not explicitly + * mark the event as handled by the time they return, or if the app never + * registers one of these callback, the OS will consider the event + * un-handled, and it will apply its default back button behavior (terminate + * the app). + * + * SDL registers its own back-button-press callback with the Windows Phone + * OS. This callback will emit a pair of SDL key-press events (SDL_KEYDOWN + * and SDL_KEYUP), each with a scancode of SDL_SCANCODE_AC_BACK, after which + * it will check the contents of the hint, SDL_HINT_WINRT_HANDLE_BACK_BUTTON. + * If the hint's value is set to "1", the back button event's Handled + * property will get set to 'true'. If the hint's value is set to something + * else, or if it is unset, SDL will leave the event's Handled property + * alone. (By default, the OS sets this property to 'false', to note.) + * + * SDL apps can either set SDL_HINT_WINRT_HANDLE_BACK_BUTTON well before a + * back button is pressed, or can set it in direct-response to a back button + * being pressed. + * + * In order to get notified when a back button is pressed, SDL apps should + * register a callback function with SDL_AddEventWatch(), and have it listen + * for SDL_KEYDOWN events that have a scancode of SDL_SCANCODE_AC_BACK. + * (Alternatively, SDL_KEYUP events can be listened-for. Listening for + * either event type is suitable.) Any value of SDL_HINT_WINRT_HANDLE_BACK_BUTTON + * set by such a callback, will be applied to the OS' current + * back-button-press event. + * + * More details on back button behavior in Windows Phone apps can be found + * at the following page, on Microsoft's developer site: * http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj247550(v=vs.105).aspx */ -#define SDL_HINT_WINRT_HANDLE_BACK_BUTTON "SDL_HINT_WINRT_HANDLE_BACK_BUTTON" +#define SDL_HINT_WINRT_HANDLE_BACK_BUTTON "SDL_WINRT_HANDLE_BACK_BUTTON" /** * \brief A variable that dictates policy for fullscreen Spaces on Mac OS X. @@ -427,7 +531,7 @@ extern "C" { * button on their titlebars). * "1" - Enable Spaces support (FULLSCREEN_DESKTOP will use them and * SDL_WINDOW_RESIZABLE windows will offer the "fullscreen" - * button on their titlebars. + * button on their titlebars). * * The default value is "1". Spaces are disabled regardless of this hint if * the OS isn't at least Mac OS X Lion (10.7). This hint must be set before @@ -435,6 +539,96 @@ extern "C" { */ #define SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES "SDL_VIDEO_MAC_FULLSCREEN_SPACES" +/** +* \brief When set don't force the SDL app to become a foreground process +* +* This hint only applies to Mac OS X. +* +*/ +#define SDL_HINT_MAC_BACKGROUND_APP "SDL_MAC_BACKGROUND_APP" + +/** + * \brief Android APK expansion main file version. Should be a string number like "1", "2" etc. + * + * Must be set together with SDL_HINT_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION. + * + * If both hints were set then SDL_RWFromFile() will look into expansion files + * after a given relative path was not found in the internal storage and assets. + * + * By default this hint is not set and the APK expansion files are not searched. + */ +#define SDL_HINT_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION "SDL_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION" + +/** + * \brief Android APK expansion patch file version. Should be a string number like "1", "2" etc. + * + * Must be set together with SDL_HINT_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION. + * + * If both hints were set then SDL_RWFromFile() will look into expansion files + * after a given relative path was not found in the internal storage and assets. + * + * By default this hint is not set and the APK expansion files are not searched. + */ +#define SDL_HINT_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION "SDL_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION" + +/** + * \brief A variable to control whether certain IMEs should handle text editing internally instead of sending SDL_TEXTEDITING events. + * + * The variable can be set to the following values: + * "0" - SDL_TEXTEDITING events are sent, and it is the application's + * responsibility to render the text from these events and + * differentiate it somehow from committed text. (default) + * "1" - If supported by the IME then SDL_TEXTEDITING events are not sent, + * and text that is being composed will be rendered in its own UI. + */ +#define SDL_HINT_IME_INTERNAL_EDITING "SDL_IME_INTERNAL_EDITING" + + /** + * \brief A variable to control whether mouse and touch events are to be treated together or separately + * + * The variable can be set to the following values: + * "0" - Mouse events will be handled as touch events, and touch will raise fake mouse + * events. This is the behaviour of SDL <= 2.0.3. (default) + * "1" - Mouse events will be handled separately from pure touch events. + * + * The value of this hint is used at runtime, so it can be changed at any time. + */ +#define SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH "SDL_ANDROID_SEPARATE_MOUSE_AND_TOUCH" + +/** + * \brief override the binding element for keyboard inputs for Emscripten builds + * + * This hint only applies to the emscripten platform + * + * The variable can be one of + * "#window" - The javascript window object (this is the default) + * "#document" - The javascript document object + * "#screen" - the javascript window.screen object + * "#canvas" - the WebGL canvas element + * any other string without a leading # sign applies to the element on the page with that ID. + */ +#define SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT "SDL_EMSCRIPTEN_KEYBOARD_ELEMENT" + +/** + * \brief Tell SDL not to catch the SIGINT or SIGTERM signals. + * + * This hint only applies to Unix-like platforms. + * + * The variable can be set to the following values: + * "0" - SDL will install a SIGINT and SIGTERM handler, and when it + * catches a signal, convert it into an SDL_QUIT event. + * "1" - SDL will not install a signal handler at all. + */ +#define SDL_HINT_NO_SIGNAL_HANDLERS "SDL_NO_SIGNAL_HANDLERS" + +/** + * \brief Tell SDL not to generate window-close events for Alt+F4 on Windows. + * + * The variable can be set to the following values: + * "0" - SDL will generate a window-close event when it sees Alt+F4. + * "1" - SDL will only do normal key handling for Alt+F4. + */ +#define SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4 "SDL_WINDOWS_NO_CLOSE_ON_ALT_F4" /** * \brief An enumeration of hint priorities diff --git a/lib/SDL2/include/SDL_joystick.h b/lib/SDL2/include/SDL_joystick.h index b0b1c6673f..266f3b3871 100644 --- a/lib/SDL2/include/SDL_joystick.h +++ b/lib/SDL2/include/SDL_joystick.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -71,6 +71,16 @@ typedef struct { typedef Sint32 SDL_JoystickID; +typedef enum +{ + SDL_JOYSTICK_POWER_UNKNOWN = -1, + SDL_JOYSTICK_POWER_EMPTY, + SDL_JOYSTICK_POWER_LOW, + SDL_JOYSTICK_POWER_MEDIUM, + SDL_JOYSTICK_POWER_FULL, + SDL_JOYSTICK_POWER_WIRED, + SDL_JOYSTICK_POWER_MAX +} SDL_JoystickPowerLevel; /* Function prototypes */ /** @@ -87,14 +97,20 @@ extern DECLSPEC const char *SDLCALL SDL_JoystickNameForIndex(int device_index); /** * Open a joystick for use. - * The index passed as an argument refers tothe N'th joystick on the system. - * This index is the value which will identify this joystick in future joystick - * events. + * The index passed as an argument refers to the N'th joystick on the system. + * This index is not the value which will identify this joystick in future + * joystick events. The joystick's instance id (::SDL_JoystickID) will be used + * there instead. * * \return A joystick identifier, or NULL if an error occurred. */ extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickOpen(int device_index); +/** + * Return the SDL_Joystick associated with an instance id. + */ +extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickFromInstanceID(SDL_JoystickID joyid); + /** * Return the name for this currently opened joystick. * If no name can be found, this function returns NULL. @@ -189,7 +205,7 @@ extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick * joystick, */ /* @{ */ #define SDL_HAT_CENTERED 0x00 -#define SDL_HAT_UP 0x01 +#define SDL_HAT_UP 0x01 #define SDL_HAT_RIGHT 0x02 #define SDL_HAT_DOWN 0x04 #define SDL_HAT_LEFT 0x08 @@ -241,6 +257,10 @@ extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetButton(SDL_Joystick * joystick, */ extern DECLSPEC void SDLCALL SDL_JoystickClose(SDL_Joystick * joystick); +/** + * Return the battery level of this joystick + */ +extern DECLSPEC SDL_JoystickPowerLevel SDLCALL SDL_JoystickCurrentPowerLevel(SDL_Joystick * joystick); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/lib/SDL2/include/SDL_keyboard.h b/lib/SDL2/include/SDL_keyboard.h index 586a26cff2..bbba0f07bc 100644 --- a/lib/SDL2/include/SDL_keyboard.h +++ b/lib/SDL2/include/SDL_keyboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_keycode.h b/lib/SDL2/include/SDL_keycode.h index d5f5dd0aef..7be9635710 100644 --- a/lib/SDL2/include/SDL_keycode.h +++ b/lib/SDL2/include/SDL_keycode.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_loadso.h b/lib/SDL2/include/SDL_loadso.h index 0359eae17d..3d540bd7dd 100644 --- a/lib/SDL2/include/SDL_loadso.h +++ b/lib/SDL2/include/SDL_loadso.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_log.h b/lib/SDL2/include/SDL_log.h index 5c2bca5932..09be1104de 100644 --- a/lib/SDL2/include/SDL_log.h +++ b/lib/SDL2/include/SDL_log.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -137,44 +137,44 @@ extern DECLSPEC void SDLCALL SDL_LogResetPriorities(void); /** * \brief Log a message with SDL_LOG_CATEGORY_APPLICATION and SDL_LOG_PRIORITY_INFO */ -extern DECLSPEC void SDLCALL SDL_Log(const char *fmt, ...); +extern DECLSPEC void SDLCALL SDL_Log(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); /** * \brief Log a message with SDL_LOG_PRIORITY_VERBOSE */ -extern DECLSPEC void SDLCALL SDL_LogVerbose(int category, const char *fmt, ...); +extern DECLSPEC void SDLCALL SDL_LogVerbose(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); /** * \brief Log a message with SDL_LOG_PRIORITY_DEBUG */ -extern DECLSPEC void SDLCALL SDL_LogDebug(int category, const char *fmt, ...); +extern DECLSPEC void SDLCALL SDL_LogDebug(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); /** * \brief Log a message with SDL_LOG_PRIORITY_INFO */ -extern DECLSPEC void SDLCALL SDL_LogInfo(int category, const char *fmt, ...); +extern DECLSPEC void SDLCALL SDL_LogInfo(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); /** * \brief Log a message with SDL_LOG_PRIORITY_WARN */ -extern DECLSPEC void SDLCALL SDL_LogWarn(int category, const char *fmt, ...); +extern DECLSPEC void SDLCALL SDL_LogWarn(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); /** * \brief Log a message with SDL_LOG_PRIORITY_ERROR */ -extern DECLSPEC void SDLCALL SDL_LogError(int category, const char *fmt, ...); +extern DECLSPEC void SDLCALL SDL_LogError(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); /** * \brief Log a message with SDL_LOG_PRIORITY_CRITICAL */ -extern DECLSPEC void SDLCALL SDL_LogCritical(int category, const char *fmt, ...); +extern DECLSPEC void SDLCALL SDL_LogCritical(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); /** * \brief Log a message with the specified category and priority. */ extern DECLSPEC void SDLCALL SDL_LogMessage(int category, SDL_LogPriority priority, - const char *fmt, ...); + SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(3); /** * \brief Log a message with the specified category and priority. diff --git a/lib/SDL2/include/SDL_main.h b/lib/SDL2/include/SDL_main.h index 2e8fae95ea..9ce3754e93 100644 --- a/lib/SDL2/include/SDL_main.h +++ b/lib/SDL2/include/SDL_main.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -67,6 +67,15 @@ */ #define SDL_MAIN_NEEDED +#elif defined(__NACL__) +/* On NACL we use ppapi_simple to set up the application helper code, + then wait for the first PSE_INSTANCE_DIDCHANGEVIEW event before + starting the user main function. + All user code is run in a separate thread by ppapi_simple, thus + allowing for blocking io to take place via nacl_io +*/ +#define SDL_MAIN_NEEDED + #endif #endif /* SDL_MAIN_HANDLED */ @@ -133,14 +142,11 @@ extern DECLSPEC void SDLCALL SDL_UnregisterApp(void); * \brief Initializes and launches an SDL/WinRT application. * * \param mainFunction The SDL app's C-style main(). - * \param xamlBackgroundPanel An optional, XAML-based, background panel. - * For Non-XAML apps, this value must be set to NULL. For XAML apps, - * pass in a pointer to a SwapChainBackgroundPanel, casted to an - * IInspectable (via reinterpret_cast). - * \ret 0 on success, -1 on failure. On failure, use SDL_GetError to retrieve more + * \param reserved Reserved for future use; should be NULL + * \return 0 on success, -1 on failure. On failure, use SDL_GetError to retrieve more * information on the failure. */ -extern DECLSPEC int SDLCALL SDL_WinRTRunApp(int (*mainFunction)(int, char **), void * xamlBackgroundPanel); +extern DECLSPEC int SDLCALL SDL_WinRTRunApp(int (*mainFunction)(int, char **), void * reserved); #endif /* __WINRT__ */ diff --git a/lib/SDL2/include/SDL_messagebox.h b/lib/SDL2/include/SDL_messagebox.h index 6004da0f5f..ec370dbbe0 100644 --- a/lib/SDL2/include/SDL_messagebox.h +++ b/lib/SDL2/include/SDL_messagebox.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_mouse.h b/lib/SDL2/include/SDL_mouse.h index ebfd18fa74..ea9622f0f7 100644 --- a/lib/SDL2/include/SDL_mouse.h +++ b/lib/SDL2/include/SDL_mouse.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -60,6 +60,15 @@ typedef enum SDL_NUM_SYSTEM_CURSORS } SDL_SystemCursor; +/** + * \brief Scroll direction types for the Scroll event + */ +typedef enum +{ + SDL_MOUSEWHEEL_NORMAL, /**< The scroll direction is normal */ + SDL_MOUSEWHEEL_FLIPPED /**< The scroll direction is flipped / natural */ +} SDL_MouseWheelDirection; + /* Function prototypes */ /** @@ -77,6 +86,31 @@ extern DECLSPEC SDL_Window * SDLCALL SDL_GetMouseFocus(void); */ extern DECLSPEC Uint32 SDLCALL SDL_GetMouseState(int *x, int *y); +/** + * \brief Get the current state of the mouse, in relation to the desktop + * + * This works just like SDL_GetMouseState(), but the coordinates will be + * reported relative to the top-left of the desktop. This can be useful if + * you need to track the mouse outside of a specific window and + * SDL_CaptureMouse() doesn't fit your needs. For example, it could be + * useful if you need to track the mouse while dragging a window, where + * coordinates relative to a window might not be in sync at all times. + * + * \note SDL_GetMouseState() returns the mouse position as SDL understands + * it from the last pump of the event queue. This function, however, + * queries the OS for the current mouse position, and as such, might + * be a slightly less efficient function. Unless you know what you're + * doing and have a good reason to use this function, you probably want + * SDL_GetMouseState() instead. + * + * \param x Returns the current X coord, relative to the desktop. Can be NULL. + * \param y Returns the current Y coord, relative to the desktop. Can be NULL. + * \return The current button state as a bitmask, which can be tested using the SDL_BUTTON(X) macros. + * + * \sa SDL_GetMouseState + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetGlobalMouseState(int *x, int *y); + /** * \brief Retrieve the relative state of the mouse. * @@ -98,6 +132,17 @@ extern DECLSPEC Uint32 SDLCALL SDL_GetRelativeMouseState(int *x, int *y); extern DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_Window * window, int x, int y); +/** + * \brief Moves the mouse to the given position in global screen space. + * + * \param x The x coordinate + * \param y The y coordinate + * \return 0 on success, -1 on error (usually: unsupported by a platform). + * + * \note This function generates a mouse motion event + */ +extern DECLSPEC int SDLCALL SDL_WarpMouseGlobal(int x, int y); + /** * \brief Set relative mouse mode. * @@ -116,6 +161,37 @@ extern DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_Window * window, */ extern DECLSPEC int SDLCALL SDL_SetRelativeMouseMode(SDL_bool enabled); +/** + * \brief Capture the mouse, to track input outside an SDL window. + * + * \param enabled Whether or not to enable capturing + * + * Capturing enables your app to obtain mouse events globally, instead of + * just within your window. Not all video targets support this function. + * When capturing is enabled, the current window will get all mouse events, + * but unlike relative mode, no change is made to the cursor and it is + * not restrained to your window. + * + * This function may also deny mouse input to other windows--both those in + * your application and others on the system--so you should use this + * function sparingly, and in small bursts. For example, you might want to + * track the mouse while the user is dragging something, until the user + * releases a mouse button. It is not recommended that you capture the mouse + * for long periods of time, such as the entire time your app is running. + * + * While captured, mouse events still report coordinates relative to the + * current (foreground) window, but those coordinates may be outside the + * bounds of the window (including negative values). Capturing is only + * allowed for the foreground window. If the window loses focus while + * capturing, the capture will be disabled automatically. + * + * While capturing is enabled, the current window will have the + * SDL_WINDOW_MOUSE_CAPTURE flag set. + * + * \return 0 on success, or -1 if not supported. + */ +extern DECLSPEC int SDLCALL SDL_CaptureMouse(SDL_bool enabled); + /** * \brief Query whether relative mouse mode is enabled. * diff --git a/lib/SDL2/include/SDL_mutex.h b/lib/SDL2/include/SDL_mutex.h index 3e8b4dbed9..b7e39734e9 100644 --- a/lib/SDL2/include/SDL_mutex.h +++ b/lib/SDL2/include/SDL_mutex.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_name.h b/lib/SDL2/include/SDL_name.h index 719666ff1e..06cd4a5e25 100644 --- a/lib/SDL2/include/SDL_name.h +++ b/lib/SDL2/include/SDL_name.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_opengl.h b/lib/SDL2/include/SDL_opengl.h index b48ea7abe9..780919bc48 100644 --- a/lib/SDL2/include/SDL_opengl.h +++ b/lib/SDL2/include/SDL_opengl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -25,11099 +25,2149 @@ * This is a simple file to encapsulate the OpenGL API headers. */ +/** + * \def NO_SDL_GLEXT + * + * Define this if you have your own version of glext.h and want to disable the + * version included in SDL_opengl.h. + */ + #ifndef _SDL_opengl_h #define _SDL_opengl_h #include "SDL_config.h" -#ifndef __IPHONEOS__ - -#ifdef __WIN32__ -#define WIN32_LEAN_AND_MEAN -#ifndef NOMINMAX -#define NOMINMAX /* Don't defined min() and max() */ -#endif -#include -#endif - -#ifdef __glext_h_ -/* Someone has already included glext.h */ -#define NO_SDL_GLEXT -#endif -#ifndef NO_SDL_GLEXT -#define __glext_h_ /* Don't let gl.h include glext.h */ -#endif -#if defined(__MACOSX__) -#include /* Header File For The OpenGL Library */ -#define __X_GL_H -#else -#include /* Header File For The OpenGL Library */ -#endif -#ifndef NO_SDL_GLEXT -#undef __glext_h_ -#endif +#ifndef __IPHONEOS__ /* No OpenGL on iOS. */ -/** - * \file SDL_opengl.h +/* + * Mesa 3-D graphics library * - * This file is included because glext.h is not available on some systems. - * If you don't want this version included, simply define ::NO_SDL_GLEXT. + * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. + * Copyright (C) 2009 VMware, Inc. All Rights Reserved. * - * The latest version is available from: - * http://www.opengl.org/registry/ - */ - -/** - * \def NO_SDL_GLEXT + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: * - * Define this if you have your own version of glext.h and want to disable the - * version included in SDL_opengl.h. + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. */ -#if !defined(NO_SDL_GLEXT) && !defined(GL_GLEXT_LEGACY) -#ifndef __glext_h_ -#define __glext_h_ -#ifdef __cplusplus -extern "C" { +#ifndef __gl_h_ +#define __gl_h_ + +#if defined(USE_MGL_NAMESPACE) +#include "gl_mangle.h" #endif -/* -** Copyright (c) 2007-2010 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ -/* Header file version number, required by OpenGL ABI for Linux */ -/* glext.h last updated $Date: 2010-08-03 01:30:25 -0700 (Tue, 03 Aug 2010) $ */ -/* Current version at http://www.opengl.org/registry/ */ -#define GL_GLEXT_VERSION 64 -/* Function declaration macros - to move into glplatform.h */ +/********************************************************************** + * Begin system-specific stuff. + */ + +#if defined(_WIN32) && !defined(__WIN32__) && !defined(__CYGWIN__) +#define __WIN32__ +#endif + +#if defined(__WIN32__) && !defined(__CYGWIN__) +# if (defined(_MSC_VER) || defined(__MINGW32__)) && defined(BUILD_GL32) /* tag specify we're building mesa as a DLL */ +# define GLAPI __declspec(dllexport) +# elif (defined(_MSC_VER) || defined(__MINGW32__)) && defined(_DLL) /* tag specifying we're building for DLL runtime support */ +# define GLAPI __declspec(dllimport) +# else /* for use with static link lib build of Win32 edition only */ +# define GLAPI extern +# endif /* _STATIC_MESA support */ +# if defined(__MINGW32__) && defined(GL_NO_STDCALL) || defined(UNDER_CE) /* The generated DLLs by MingW with STDCALL are not compatible with the ones done by Microsoft's compilers */ +# define GLAPIENTRY +# else +# define GLAPIENTRY __stdcall +# endif +#elif defined(__CYGWIN__) && defined(USE_OPENGL32) /* use native windows opengl32 */ +# define GLAPI extern +# define GLAPIENTRY __stdcall +#elif (defined(__GNUC__) && __GNUC__ >= 4) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) +# define GLAPI __attribute__((visibility("default"))) +# define GLAPIENTRY +#endif /* WIN32 && !CYGWIN */ -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +/* + * WINDOWS: Include windows.h here to define APIENTRY. + * It is also useful when applications include this file by + * including only glut.h, since glut.h depends on windows.h. + * Applications needing to include windows.h with parms other + * than "WIN32_LEAN_AND_MEAN" may include windows.h before + * glut.h or gl.h. + */ +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) +#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN 1 -#include #endif - -#ifndef APIENTRY -#define APIENTRY +#ifndef NOMINMAX /* don't define min() and max(). */ +#define NOMINMAX #endif -#ifndef APIENTRYP -#define APIENTRYP APIENTRY * +#include #endif + #ifndef GLAPI #define GLAPI extern #endif -/*************************************************************/ - -#ifndef GL_VERSION_1_2 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#ifndef GLAPIENTRY +#define GLAPIENTRY #endif -#ifndef GL_VERSION_1_2_DEPRECATED -#define GL_RESCALE_NORMAL 0x803A -#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 -#define GL_SINGLE_COLOR 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR 0x81FA -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#ifndef APIENTRY +#define APIENTRY GLAPIENTRY #endif -#ifndef GL_ARB_imaging -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_FUNC_ADD 0x8006 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_BLEND_EQUATION 0x8009 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B +/* "P" suffix to be used for a pointer to a function */ +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * #endif -#ifndef GL_ARB_imaging_DEPRECATED -#define GL_CONVOLUTION_1D 0x8010 -#define GL_CONVOLUTION_2D 0x8011 -#define GL_SEPARABLE_2D 0x8012 -#define GL_CONVOLUTION_BORDER_MODE 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS 0x8015 -#define GL_REDUCE 0x8016 -#define GL_CONVOLUTION_FORMAT 0x8017 -#define GL_CONVOLUTION_WIDTH 0x8018 -#define GL_CONVOLUTION_HEIGHT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 -#define GL_HISTOGRAM 0x8024 -#define GL_PROXY_HISTOGRAM 0x8025 -#define GL_HISTOGRAM_WIDTH 0x8026 -#define GL_HISTOGRAM_FORMAT 0x8027 -#define GL_HISTOGRAM_RED_SIZE 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C -#define GL_HISTOGRAM_SINK 0x802D -#define GL_MINMAX 0x802E -#define GL_MINMAX_FORMAT 0x802F -#define GL_MINMAX_SINK 0x8030 -#define GL_TABLE_TOO_LARGE 0x8031 -#define GL_COLOR_MATRIX 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB -#define GL_COLOR_TABLE 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 -#define GL_PROXY_COLOR_TABLE 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 -#define GL_COLOR_TABLE_SCALE 0x80D6 -#define GL_COLOR_TABLE_BIAS 0x80D7 -#define GL_COLOR_TABLE_FORMAT 0x80D8 -#define GL_COLOR_TABLE_WIDTH 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_CONSTANT_BORDER 0x8151 -#define GL_REPLICATE_BORDER 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#ifndef GLAPIENTRYP +#define GLAPIENTRYP GLAPIENTRY * #endif -#ifndef GL_VERSION_1_3 -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_MULTISAMPLE 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_COMPRESSED_RGB 0x84ED -#define GL_COMPRESSED_RGBA 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 -#define GL_TEXTURE_COMPRESSED 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_CLAMP_TO_BORDER 0x812D +#if defined(PRAGMA_EXPORT_SUPPORTED) +#pragma export on #endif -#ifndef GL_VERSION_1_3_DEPRECATED -#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 -#define GL_MAX_TEXTURE_UNITS 0x84E2 -#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 -#define GL_MULTISAMPLE_BIT 0x20000000 -#define GL_NORMAL_MAP 0x8511 -#define GL_REFLECTION_MAP 0x8512 -#define GL_COMPRESSED_ALPHA 0x84E9 -#define GL_COMPRESSED_LUMINANCE 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB -#define GL_COMPRESSED_INTENSITY 0x84EC -#define GL_COMBINE 0x8570 -#define GL_COMBINE_RGB 0x8571 -#define GL_COMBINE_ALPHA 0x8572 -#define GL_SOURCE0_RGB 0x8580 -#define GL_SOURCE1_RGB 0x8581 -#define GL_SOURCE2_RGB 0x8582 -#define GL_SOURCE0_ALPHA 0x8588 -#define GL_SOURCE1_ALPHA 0x8589 -#define GL_SOURCE2_ALPHA 0x858A -#define GL_OPERAND0_RGB 0x8590 -#define GL_OPERAND1_RGB 0x8591 -#define GL_OPERAND2_RGB 0x8592 -#define GL_OPERAND0_ALPHA 0x8598 -#define GL_OPERAND1_ALPHA 0x8599 -#define GL_OPERAND2_ALPHA 0x859A -#define GL_RGB_SCALE 0x8573 -#define GL_ADD_SIGNED 0x8574 -#define GL_INTERPOLATE 0x8575 -#define GL_SUBTRACT 0x84E7 -#define GL_CONSTANT 0x8576 -#define GL_PRIMARY_COLOR 0x8577 -#define GL_PREVIOUS 0x8578 -#define GL_DOT3_RGB 0x86AE -#define GL_DOT3_RGBA 0x86AF -#endif +/* + * End system-specific stuff. + **********************************************************************/ -#ifndef GL_VERSION_1_4 -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_DEPTH_COMPONENT32 0x81A7 -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_TEXTURE_LOD_BIAS 0x8501 -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_TEXTURE_DEPTH_SIZE 0x884A -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#endif -#ifndef GL_VERSION_1_4_DEPRECATED -#define GL_POINT_SIZE_MIN 0x8126 -#define GL_POINT_SIZE_MAX 0x8127 -#define GL_POINT_DISTANCE_ATTENUATION 0x8129 -#define GL_GENERATE_MIPMAP 0x8191 -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_FOG_COORDINATE_SOURCE 0x8450 -#define GL_FOG_COORDINATE 0x8451 -#define GL_FRAGMENT_DEPTH 0x8452 -#define GL_CURRENT_FOG_COORDINATE 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 -#define GL_FOG_COORDINATE_ARRAY 0x8457 -#define GL_COLOR_SUM 0x8458 -#define GL_CURRENT_SECONDARY_COLOR 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D -#define GL_SECONDARY_COLOR_ARRAY 0x845E -#define GL_TEXTURE_FILTER_CONTROL 0x8500 -#define GL_DEPTH_TEXTURE_MODE 0x884B -#define GL_COMPARE_R_TO_TEXTURE 0x884E -#endif -#ifndef GL_VERSION_1_5 -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_QUERY_COUNTER_BITS 0x8864 -#define GL_CURRENT_QUERY 0x8865 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_READ_WRITE 0x88BA -#define GL_BUFFER_ACCESS 0x88BB -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_STREAM_COPY 0x88E2 -#define GL_STATIC_DRAW 0x88E4 -#define GL_STATIC_READ 0x88E5 -#define GL_STATIC_COPY 0x88E6 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_SAMPLES_PASSED 0x8914 +#ifdef __cplusplus +extern "C" { #endif -#ifndef GL_VERSION_1_5_DEPRECATED -#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E -#define GL_FOG_COORD_SRC 0x8450 -#define GL_FOG_COORD 0x8451 -#define GL_CURRENT_FOG_COORD 0x8453 -#define GL_FOG_COORD_ARRAY_TYPE 0x8454 -#define GL_FOG_COORD_ARRAY_STRIDE 0x8455 -#define GL_FOG_COORD_ARRAY_POINTER 0x8456 -#define GL_FOG_COORD_ARRAY 0x8457 -#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D -#define GL_SRC0_RGB 0x8580 -#define GL_SRC1_RGB 0x8581 -#define GL_SRC2_RGB 0x8582 -#define GL_SRC0_ALPHA 0x8588 -#define GL_SRC1_ALPHA 0x8589 -#define GL_SRC2_ALPHA 0x858A -#endif -#ifndef GL_VERSION_2_0 -#define GL_BLEND_EQUATION_RGB 0x8009 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_SHADER_TYPE 0x8B4F -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_DELETE_STATUS 0x8B80 -#define GL_COMPILE_STATUS 0x8B81 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -#endif -#ifndef GL_VERSION_2_0_DEPRECATED -#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 -#define GL_POINT_SPRITE 0x8861 -#define GL_COORD_REPLACE 0x8862 -#define GL_MAX_TEXTURE_COORDS 0x8871 -#endif +#define GL_VERSION_1_1 1 +#define GL_VERSION_1_2 1 +#define GL_VERSION_1_3 1 +#define GL_ARB_imaging 1 -#ifndef GL_VERSION_2_1 -#define GL_PIXEL_PACK_BUFFER 0x88EB -#define GL_PIXEL_UNPACK_BUFFER 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF -#define GL_FLOAT_MAT2x3 0x8B65 -#define GL_FLOAT_MAT2x4 0x8B66 -#define GL_FLOAT_MAT3x2 0x8B67 -#define GL_FLOAT_MAT3x4 0x8B68 -#define GL_FLOAT_MAT4x2 0x8B69 -#define GL_FLOAT_MAT4x3 0x8B6A -#define GL_SRGB 0x8C40 -#define GL_SRGB8 0x8C41 -#define GL_SRGB_ALPHA 0x8C42 -#define GL_SRGB8_ALPHA8 0x8C43 -#define GL_COMPRESSED_SRGB 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 -#endif -#ifndef GL_VERSION_2_1_DEPRECATED -#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F -#define GL_SLUMINANCE_ALPHA 0x8C44 -#define GL_SLUMINANCE8_ALPHA8 0x8C45 -#define GL_SLUMINANCE 0x8C46 -#define GL_SLUMINANCE8 0x8C47 -#define GL_COMPRESSED_SLUMINANCE 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B -#endif +/* + * Datatypes + */ +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef void GLvoid; +typedef signed char GLbyte; /* 1-byte signed */ +typedef short GLshort; /* 2-byte signed */ +typedef int GLint; /* 4-byte signed */ +typedef unsigned char GLubyte; /* 1-byte unsigned */ +typedef unsigned short GLushort; /* 2-byte unsigned */ +typedef unsigned int GLuint; /* 4-byte unsigned */ +typedef int GLsizei; /* 4-byte signed */ +typedef float GLfloat; /* single precision float */ +typedef float GLclampf; /* single precision float in [0,1] */ +typedef double GLdouble; /* double precision float */ +typedef double GLclampd; /* double precision float in [0,1] */ -#ifndef GL_VERSION_3_0 -#define GL_COMPARE_REF_TO_TEXTURE 0x884E -#define GL_CLIP_DISTANCE0 0x3000 -#define GL_CLIP_DISTANCE1 0x3001 -#define GL_CLIP_DISTANCE2 0x3002 -#define GL_CLIP_DISTANCE3 0x3003 -#define GL_CLIP_DISTANCE4 0x3004 -#define GL_CLIP_DISTANCE5 0x3005 -#define GL_CLIP_DISTANCE6 0x3006 -#define GL_CLIP_DISTANCE7 0x3007 -#define GL_MAX_CLIP_DISTANCES 0x0D32 -#define GL_MAJOR_VERSION 0x821B -#define GL_MINOR_VERSION 0x821C -#define GL_NUM_EXTENSIONS 0x821D -#define GL_CONTEXT_FLAGS 0x821E -#define GL_DEPTH_BUFFER 0x8223 -#define GL_STENCIL_BUFFER 0x8224 -#define GL_COMPRESSED_RED 0x8225 -#define GL_COMPRESSED_RG 0x8226 -#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 -#define GL_RGBA32F 0x8814 -#define GL_RGB32F 0x8815 -#define GL_RGBA16F 0x881A -#define GL_RGB16F 0x881B -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD -#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF -#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 -#define GL_CLAMP_READ_COLOR 0x891C -#define GL_FIXED_ONLY 0x891D -#define GL_MAX_VARYING_COMPONENTS 0x8B4B -#define GL_TEXTURE_1D_ARRAY 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D -#define GL_R11F_G11F_B10F 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B -#define GL_RGB9_E5 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E -#define GL_TEXTURE_SHARED_SIZE 0x8C3F -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 -#define GL_PRIMITIVES_GENERATED 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 -#define GL_RASTERIZER_DISCARD 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B -#define GL_INTERLEAVED_ATTRIBS 0x8C8C -#define GL_SEPARATE_ATTRIBS 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F -#define GL_RGBA32UI 0x8D70 -#define GL_RGB32UI 0x8D71 -#define GL_RGBA16UI 0x8D76 -#define GL_RGB16UI 0x8D77 -#define GL_RGBA8UI 0x8D7C -#define GL_RGB8UI 0x8D7D -#define GL_RGBA32I 0x8D82 -#define GL_RGB32I 0x8D83 -#define GL_RGBA16I 0x8D88 -#define GL_RGB16I 0x8D89 -#define GL_RGBA8I 0x8D8E -#define GL_RGB8I 0x8D8F -#define GL_RED_INTEGER 0x8D94 -#define GL_GREEN_INTEGER 0x8D95 -#define GL_BLUE_INTEGER 0x8D96 -#define GL_RGB_INTEGER 0x8D98 -#define GL_RGBA_INTEGER 0x8D99 -#define GL_BGR_INTEGER 0x8D9A -#define GL_BGRA_INTEGER 0x8D9B -#define GL_SAMPLER_1D_ARRAY 0x8DC0 -#define GL_SAMPLER_2D_ARRAY 0x8DC1 -#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 -#define GL_UNSIGNED_INT_VEC2 0x8DC6 -#define GL_UNSIGNED_INT_VEC3 0x8DC7 -#define GL_UNSIGNED_INT_VEC4 0x8DC8 -#define GL_INT_SAMPLER_1D 0x8DC9 -#define GL_INT_SAMPLER_2D 0x8DCA -#define GL_INT_SAMPLER_3D 0x8DCB -#define GL_INT_SAMPLER_CUBE 0x8DCC -#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF -#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 -#define GL_QUERY_WAIT 0x8E13 -#define GL_QUERY_NO_WAIT 0x8E14 -#define GL_QUERY_BY_REGION_WAIT 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 -#define GL_BUFFER_ACCESS_FLAGS 0x911F -#define GL_BUFFER_MAP_LENGTH 0x9120 -#define GL_BUFFER_MAP_OFFSET 0x9121 -/* Reuse tokens from ARB_depth_buffer_float */ -/* reuse GL_DEPTH_COMPONENT32F */ -/* reuse GL_DEPTH32F_STENCIL8 */ -/* reuse GL_FLOAT_32_UNSIGNED_INT_24_8_REV */ -/* Reuse tokens from ARB_framebuffer_object */ -/* reuse GL_INVALID_FRAMEBUFFER_OPERATION */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE */ -/* reuse GL_FRAMEBUFFER_DEFAULT */ -/* reuse GL_FRAMEBUFFER_UNDEFINED */ -/* reuse GL_DEPTH_STENCIL_ATTACHMENT */ -/* reuse GL_INDEX */ -/* reuse GL_MAX_RENDERBUFFER_SIZE */ -/* reuse GL_DEPTH_STENCIL */ -/* reuse GL_UNSIGNED_INT_24_8 */ -/* reuse GL_DEPTH24_STENCIL8 */ -/* reuse GL_TEXTURE_STENCIL_SIZE */ -/* reuse GL_TEXTURE_RED_TYPE */ -/* reuse GL_TEXTURE_GREEN_TYPE */ -/* reuse GL_TEXTURE_BLUE_TYPE */ -/* reuse GL_TEXTURE_ALPHA_TYPE */ -/* reuse GL_TEXTURE_DEPTH_TYPE */ -/* reuse GL_UNSIGNED_NORMALIZED */ -/* reuse GL_FRAMEBUFFER_BINDING */ -/* reuse GL_DRAW_FRAMEBUFFER_BINDING */ -/* reuse GL_RENDERBUFFER_BINDING */ -/* reuse GL_READ_FRAMEBUFFER */ -/* reuse GL_DRAW_FRAMEBUFFER */ -/* reuse GL_READ_FRAMEBUFFER_BINDING */ -/* reuse GL_RENDERBUFFER_SAMPLES */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */ -/* reuse GL_FRAMEBUFFER_COMPLETE */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER */ -/* reuse GL_FRAMEBUFFER_UNSUPPORTED */ -/* reuse GL_MAX_COLOR_ATTACHMENTS */ -/* reuse GL_COLOR_ATTACHMENT0 */ -/* reuse GL_COLOR_ATTACHMENT1 */ -/* reuse GL_COLOR_ATTACHMENT2 */ -/* reuse GL_COLOR_ATTACHMENT3 */ -/* reuse GL_COLOR_ATTACHMENT4 */ -/* reuse GL_COLOR_ATTACHMENT5 */ -/* reuse GL_COLOR_ATTACHMENT6 */ -/* reuse GL_COLOR_ATTACHMENT7 */ -/* reuse GL_COLOR_ATTACHMENT8 */ -/* reuse GL_COLOR_ATTACHMENT9 */ -/* reuse GL_COLOR_ATTACHMENT10 */ -/* reuse GL_COLOR_ATTACHMENT11 */ -/* reuse GL_COLOR_ATTACHMENT12 */ -/* reuse GL_COLOR_ATTACHMENT13 */ -/* reuse GL_COLOR_ATTACHMENT14 */ -/* reuse GL_COLOR_ATTACHMENT15 */ -/* reuse GL_DEPTH_ATTACHMENT */ -/* reuse GL_STENCIL_ATTACHMENT */ -/* reuse GL_FRAMEBUFFER */ -/* reuse GL_RENDERBUFFER */ -/* reuse GL_RENDERBUFFER_WIDTH */ -/* reuse GL_RENDERBUFFER_HEIGHT */ -/* reuse GL_RENDERBUFFER_INTERNAL_FORMAT */ -/* reuse GL_STENCIL_INDEX1 */ -/* reuse GL_STENCIL_INDEX4 */ -/* reuse GL_STENCIL_INDEX8 */ -/* reuse GL_STENCIL_INDEX16 */ -/* reuse GL_RENDERBUFFER_RED_SIZE */ -/* reuse GL_RENDERBUFFER_GREEN_SIZE */ -/* reuse GL_RENDERBUFFER_BLUE_SIZE */ -/* reuse GL_RENDERBUFFER_ALPHA_SIZE */ -/* reuse GL_RENDERBUFFER_DEPTH_SIZE */ -/* reuse GL_RENDERBUFFER_STENCIL_SIZE */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE */ -/* reuse GL_MAX_SAMPLES */ -/* Reuse tokens from ARB_framebuffer_sRGB */ -/* reuse GL_FRAMEBUFFER_SRGB */ -/* Reuse tokens from ARB_half_float_vertex */ -/* reuse GL_HALF_FLOAT */ -/* Reuse tokens from ARB_map_buffer_range */ -/* reuse GL_MAP_READ_BIT */ -/* reuse GL_MAP_WRITE_BIT */ -/* reuse GL_MAP_INVALIDATE_RANGE_BIT */ -/* reuse GL_MAP_INVALIDATE_BUFFER_BIT */ -/* reuse GL_MAP_FLUSH_EXPLICIT_BIT */ -/* reuse GL_MAP_UNSYNCHRONIZED_BIT */ -/* Reuse tokens from ARB_texture_compression_rgtc */ -/* reuse GL_COMPRESSED_RED_RGTC1 */ -/* reuse GL_COMPRESSED_SIGNED_RED_RGTC1 */ -/* reuse GL_COMPRESSED_RG_RGTC2 */ -/* reuse GL_COMPRESSED_SIGNED_RG_RGTC2 */ -/* Reuse tokens from ARB_texture_rg */ -/* reuse GL_RG */ -/* reuse GL_RG_INTEGER */ -/* reuse GL_R8 */ -/* reuse GL_R16 */ -/* reuse GL_RG8 */ -/* reuse GL_RG16 */ -/* reuse GL_R16F */ -/* reuse GL_R32F */ -/* reuse GL_RG16F */ -/* reuse GL_RG32F */ -/* reuse GL_R8I */ -/* reuse GL_R8UI */ -/* reuse GL_R16I */ -/* reuse GL_R16UI */ -/* reuse GL_R32I */ -/* reuse GL_R32UI */ -/* reuse GL_RG8I */ -/* reuse GL_RG8UI */ -/* reuse GL_RG16I */ -/* reuse GL_RG16UI */ -/* reuse GL_RG32I */ -/* reuse GL_RG32UI */ -/* Reuse tokens from ARB_vertex_array_object */ -/* reuse GL_VERTEX_ARRAY_BINDING */ -#endif -#ifndef GL_VERSION_3_0_DEPRECATED -#define GL_CLAMP_VERTEX_COLOR 0x891A -#define GL_CLAMP_FRAGMENT_COLOR 0x891B -#define GL_ALPHA_INTEGER 0x8D97 -/* Reuse tokens from ARB_framebuffer_object */ -/* reuse GL_TEXTURE_LUMINANCE_TYPE */ -/* reuse GL_TEXTURE_INTENSITY_TYPE */ -#endif -#ifndef GL_VERSION_3_1 -#define GL_SAMPLER_2D_RECT 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 -#define GL_SAMPLER_BUFFER 0x8DC2 -#define GL_INT_SAMPLER_2D_RECT 0x8DCD -#define GL_INT_SAMPLER_BUFFER 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 -#define GL_TEXTURE_BUFFER 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT 0x8C2E -#define GL_TEXTURE_RECTANGLE 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 -#define GL_RED_SNORM 0x8F90 -#define GL_RG_SNORM 0x8F91 -#define GL_RGB_SNORM 0x8F92 -#define GL_RGBA_SNORM 0x8F93 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM 0x8F98 -#define GL_RG16_SNORM 0x8F99 -#define GL_RGB16_SNORM 0x8F9A -#define GL_RGBA16_SNORM 0x8F9B -#define GL_SIGNED_NORMALIZED 0x8F9C -#define GL_PRIMITIVE_RESTART 0x8F9D -#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E -/* Reuse tokens from ARB_copy_buffer */ -/* reuse GL_COPY_READ_BUFFER */ -/* reuse GL_COPY_WRITE_BUFFER */ -/* Reuse tokens from ARB_draw_instanced (none) */ -/* Reuse tokens from ARB_uniform_buffer_object */ -/* reuse GL_UNIFORM_BUFFER */ -/* reuse GL_UNIFORM_BUFFER_BINDING */ -/* reuse GL_UNIFORM_BUFFER_START */ -/* reuse GL_UNIFORM_BUFFER_SIZE */ -/* reuse GL_MAX_VERTEX_UNIFORM_BLOCKS */ -/* reuse GL_MAX_FRAGMENT_UNIFORM_BLOCKS */ -/* reuse GL_MAX_COMBINED_UNIFORM_BLOCKS */ -/* reuse GL_MAX_UNIFORM_BUFFER_BINDINGS */ -/* reuse GL_MAX_UNIFORM_BLOCK_SIZE */ -/* reuse GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS */ -/* reuse GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT */ -/* reuse GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH */ -/* reuse GL_ACTIVE_UNIFORM_BLOCKS */ -/* reuse GL_UNIFORM_TYPE */ -/* reuse GL_UNIFORM_SIZE */ -/* reuse GL_UNIFORM_NAME_LENGTH */ -/* reuse GL_UNIFORM_BLOCK_INDEX */ -/* reuse GL_UNIFORM_OFFSET */ -/* reuse GL_UNIFORM_ARRAY_STRIDE */ -/* reuse GL_UNIFORM_MATRIX_STRIDE */ -/* reuse GL_UNIFORM_IS_ROW_MAJOR */ -/* reuse GL_UNIFORM_BLOCK_BINDING */ -/* reuse GL_UNIFORM_BLOCK_DATA_SIZE */ -/* reuse GL_UNIFORM_BLOCK_NAME_LENGTH */ -/* reuse GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS */ -/* reuse GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER */ -/* reuse GL_INVALID_INDEX */ -#endif +/* + * Constants + */ -#ifndef GL_VERSION_3_2 -#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 -#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 -#define GL_LINES_ADJACENCY 0x000A -#define GL_LINE_STRIP_ADJACENCY 0x000B -#define GL_TRIANGLES_ADJACENCY 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D -#define GL_PROGRAM_POINT_SIZE 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 -#define GL_GEOMETRY_SHADER 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT 0x8916 -#define GL_GEOMETRY_INPUT_TYPE 0x8917 -#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 -#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 -#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 -#define GL_CONTEXT_PROFILE_MASK 0x9126 -/* reuse GL_MAX_VARYING_COMPONENTS */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */ -/* Reuse tokens from ARB_depth_clamp */ -/* reuse GL_DEPTH_CLAMP */ -/* Reuse tokens from ARB_draw_elements_base_vertex (none) */ -/* Reuse tokens from ARB_fragment_coord_conventions (none) */ -/* Reuse tokens from ARB_provoking_vertex */ -/* reuse GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION */ -/* reuse GL_FIRST_VERTEX_CONVENTION */ -/* reuse GL_LAST_VERTEX_CONVENTION */ -/* reuse GL_PROVOKING_VERTEX */ -/* Reuse tokens from ARB_seamless_cube_map */ -/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS */ -/* Reuse tokens from ARB_sync */ -/* reuse GL_MAX_SERVER_WAIT_TIMEOUT */ -/* reuse GL_OBJECT_TYPE */ -/* reuse GL_SYNC_CONDITION */ -/* reuse GL_SYNC_STATUS */ -/* reuse GL_SYNC_FLAGS */ -/* reuse GL_SYNC_FENCE */ -/* reuse GL_SYNC_GPU_COMMANDS_COMPLETE */ -/* reuse GL_UNSIGNALED */ -/* reuse GL_SIGNALED */ -/* reuse GL_ALREADY_SIGNALED */ -/* reuse GL_TIMEOUT_EXPIRED */ -/* reuse GL_CONDITION_SATISFIED */ -/* reuse GL_WAIT_FAILED */ -/* reuse GL_TIMEOUT_IGNORED */ -/* reuse GL_SYNC_FLUSH_COMMANDS_BIT */ -/* reuse GL_TIMEOUT_IGNORED */ -/* Reuse tokens from ARB_texture_multisample */ -/* reuse GL_SAMPLE_POSITION */ -/* reuse GL_SAMPLE_MASK */ -/* reuse GL_SAMPLE_MASK_VALUE */ -/* reuse GL_MAX_SAMPLE_MASK_WORDS */ -/* reuse GL_TEXTURE_2D_MULTISAMPLE */ -/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE */ -/* reuse GL_TEXTURE_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE */ -/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_TEXTURE_SAMPLES */ -/* reuse GL_TEXTURE_FIXED_SAMPLE_LOCATIONS */ -/* reuse GL_SAMPLER_2D_MULTISAMPLE */ -/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE */ -/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE */ -/* reuse GL_SAMPLER_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_MAX_COLOR_TEXTURE_SAMPLES */ -/* reuse GL_MAX_DEPTH_TEXTURE_SAMPLES */ -/* reuse GL_MAX_INTEGER_SAMPLES */ -/* Don't need to reuse tokens from ARB_vertex_array_bgra since they're already in 1.2 core */ -#endif +/* Boolean values */ +#define GL_FALSE 0 +#define GL_TRUE 1 + +/* Data types */ +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_2_BYTES 0x1407 +#define GL_3_BYTES 0x1408 +#define GL_4_BYTES 0x1409 +#define GL_DOUBLE 0x140A + +/* Primitives */ +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_QUADS 0x0007 +#define GL_QUAD_STRIP 0x0008 +#define GL_POLYGON 0x0009 + +/* Vertex Arrays */ +#define GL_VERTEX_ARRAY 0x8074 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_COLOR_ARRAY 0x8076 +#define GL_INDEX_ARRAY 0x8077 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_C3F_V3F 0x2A24 +#define GL_N3F_V3F 0x2A25 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_V4F 0x2A28 +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T4F_C4F_N3F_V4F 0x2A2D + +/* Matrix Mode */ +#define GL_MATRIX_MODE 0x0BA0 +#define GL_MODELVIEW 0x1700 +#define GL_PROJECTION 0x1701 +#define GL_TEXTURE 0x1702 + +/* Points */ +#define GL_POINT_SMOOTH 0x0B10 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_POINT_SIZE_RANGE 0x0B12 + +/* Lines */ +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_WIDTH_RANGE 0x0B22 + +/* Polygons */ +#define GL_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_EDGE_FLAG 0x0B43 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_POLYGON_OFFSET_FILL 0x8037 + +/* Display Lists */ +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_INDEX 0x0B33 +#define GL_LIST_MODE 0x0B30 + +/* Depth buffer */ +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_BITS 0x0D56 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_COMPONENT 0x1902 + +/* Lighting */ +#define GL_LIGHTING 0x0B50 +#define GL_LIGHT0 0x4000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_QUADRATIC_ATTENUATION 0x1209 +#define GL_AMBIENT 0x1200 +#define GL_DIFFUSE 0x1201 +#define GL_SPECULAR 0x1202 +#define GL_SHININESS 0x1601 +#define GL_EMISSION 0x1600 +#define GL_POSITION 0x1203 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_COLOR_INDEXES 0x1603 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_SHADE_MODEL 0x0B54 +#define GL_FLAT 0x1D00 +#define GL_SMOOTH 0x1D01 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_NORMALIZE 0x0BA1 + +/* User clipping planes */ +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 + +/* Accumulation buffer */ +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_ACCUM 0x0100 +#define GL_ADD 0x0104 +#define GL_LOAD 0x0101 +#define GL_MULT 0x0103 +#define GL_RETURN 0x0102 + +/* Alpha testing */ +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_ALPHA_TEST_FUNC 0x0BC1 + +/* Blending */ +#define GL_BLEND 0x0BE2 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND_DST 0x0BE0 +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 + +/* Render Mode */ +#define GL_FEEDBACK 0x1C01 +#define GL_RENDER 0x1C00 +#define GL_SELECT 0x1C02 + +/* Feedback */ +#define GL_2D 0x0600 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_4D_COLOR_TEXTURE 0x0604 +#define GL_POINT_TOKEN 0x0701 +#define GL_LINE_TOKEN 0x0702 +#define GL_LINE_RESET_TOKEN 0x0707 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 + +/* Selection */ +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 + +/* Fog */ +#define GL_FOG 0x0B60 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_COLOR 0x0B66 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_START 0x0B63 +#define GL_FOG_END 0x0B64 +#define GL_LINEAR 0x2601 +#define GL_EXP 0x0800 +#define GL_EXP2 0x0801 + +/* Logic Ops */ +#define GL_LOGIC_OP 0x0BF1 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_CLEAR 0x1500 +#define GL_SET 0x150F +#define GL_COPY 0x1503 +#define GL_COPY_INVERTED 0x150C +#define GL_NOOP 0x1505 +#define GL_INVERT 0x150A +#define GL_AND 0x1501 +#define GL_NAND 0x150E +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_XOR 0x1506 +#define GL_EQUIV 0x1509 +#define GL_AND_REVERSE 0x1502 +#define GL_AND_INVERTED 0x1504 +#define GL_OR_REVERSE 0x150B +#define GL_OR_INVERTED 0x150D + +/* Stencil */ +#define GL_STENCIL_BITS 0x0D57 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_STENCIL_INDEX 0x1901 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 + +/* Buffers, Pixel Drawing/Reading */ +#define GL_NONE 0 +#define GL_LEFT 0x0406 +#define GL_RIGHT 0x0407 +/*GL_FRONT 0x0404 */ +/*GL_BACK 0x0405 */ +/*GL_FRONT_AND_BACK 0x0408 */ +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C +#define GL_COLOR_INDEX 0x1900 +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_ALPHA_BITS 0x0D55 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_INDEX_BITS 0x0D51 +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_AUX_BUFFERS 0x0C00 +#define GL_READ_BUFFER 0x0C02 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_STEREO 0x0C33 +#define GL_BITMAP 0x1A00 +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#define GL_DITHER 0x0BD0 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 + +/* Implementation limits */ +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B + +/* Gets */ +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_MODE 0x0C30 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_RENDER_MODE 0x0C40 +#define GL_RGBA_MODE 0x0C31 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_VIEWPORT 0x0BA2 + +/* Evaluators */ +#define GL_AUTO_NORMAL 0x0D80 +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_COEFF 0x0A00 +#define GL_ORDER 0x0A01 +#define GL_DOMAIN 0x0A02 + +/* Hints */ +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_FOG_HINT 0x0C54 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 + +/* Scissor box */ +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 + +/* Pixel Mode / Transfer */ +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_STENCIL 0x0D11 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_RED_SCALE 0x0D14 +#define GL_RED_BIAS 0x0D15 +#define GL_GREEN_SCALE 0x0D18 +#define GL_GREEN_BIAS 0x0D19 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BLUE_BIAS 0x0D1B +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_BIAS 0x0D1D +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_BIAS 0x0D1F +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 + +/* Texture mapping */ +#define GL_TEXTURE_ENV 0x2300 +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_ENV_COLOR 0x2201 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_Q 0x0C63 +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_BORDER 0x1005 +#define GL_TEXTURE_COMPONENTS 0x1003 +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_OBJECT_PLANE 0x2501 +#define GL_EYE_LINEAR 0x2400 +#define GL_EYE_PLANE 0x2502 +#define GL_SPHERE_MAP 0x2402 +#define GL_DECAL 0x2101 +#define GL_MODULATE 0x2100 +#define GL_NEAREST 0x2600 +#define GL_REPEAT 0x2901 +#define GL_CLAMP 0x2900 +#define GL_S 0x2000 +#define GL_T 0x2001 +#define GL_R 0x2002 +#define GL_Q 0x2003 + +/* Utility */ +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 + +/* Errors */ +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_OUT_OF_MEMORY 0x0505 + +/* glPush/PopAttrib bits */ +#define GL_CURRENT_BIT 0x00000001 +#define GL_POINT_BIT 0x00000002 +#define GL_LINE_BIT 0x00000004 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_FOG_BIT 0x00000080 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_ENABLE_BIT 0x00002000 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_HINT_BIT 0x00008000 +#define GL_EVAL_BIT 0x00010000 +#define GL_LIST_BIT 0x00020000 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_SCISSOR_BIT 0x00080000 +#define GL_ALL_ATTRIB_BITS 0x000FFFFF + + +/* OpenGL 1.1 */ +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D +#define GL_R3_G3_B2 0x2A10 +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB8 0x8051 +#define GL_RGB10 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGBA2 0x8055 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGBA8 0x8058 +#define GL_RGB10_A2 0x8059 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFFF +#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF -#ifndef GL_VERSION_3_3 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -/* Reuse tokens from ARB_blend_func_extended */ -/* reuse GL_SRC1_COLOR */ -/* reuse GL_ONE_MINUS_SRC1_COLOR */ -/* reuse GL_ONE_MINUS_SRC1_ALPHA */ -/* reuse GL_MAX_DUAL_SOURCE_DRAW_BUFFERS */ -/* Reuse tokens from ARB_explicit_attrib_location (none) */ -/* Reuse tokens from ARB_occlusion_query2 */ -/* reuse GL_ANY_SAMPLES_PASSED */ -/* Reuse tokens from ARB_sampler_objects */ -/* reuse GL_SAMPLER_BINDING */ -/* Reuse tokens from ARB_shader_bit_encoding (none) */ -/* Reuse tokens from ARB_texture_rgb10_a2ui */ -/* reuse GL_RGB10_A2UI */ -/* Reuse tokens from ARB_texture_swizzle */ -/* reuse GL_TEXTURE_SWIZZLE_R */ -/* reuse GL_TEXTURE_SWIZZLE_G */ -/* reuse GL_TEXTURE_SWIZZLE_B */ -/* reuse GL_TEXTURE_SWIZZLE_A */ -/* reuse GL_TEXTURE_SWIZZLE_RGBA */ -/* Reuse tokens from ARB_timer_query */ -/* reuse GL_TIME_ELAPSED */ -/* reuse GL_TIMESTAMP */ -/* Reuse tokens from ARB_vertex_type_2_10_10_10_rev */ -/* reuse GL_INT_2_10_10_10_REV */ -#endif -#ifndef GL_VERSION_4_0 -#define GL_SAMPLE_SHADING 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F -#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F -/* Reuse tokens from ARB_texture_query_lod (none) */ -/* Reuse tokens from ARB_draw_buffers_blend (none) */ -/* Reuse tokens from ARB_draw_indirect */ -/* reuse GL_DRAW_INDIRECT_BUFFER */ -/* reuse GL_DRAW_INDIRECT_BUFFER_BINDING */ -/* Reuse tokens from ARB_gpu_shader5 */ -/* reuse GL_GEOMETRY_SHADER_INVOCATIONS */ -/* reuse GL_MAX_GEOMETRY_SHADER_INVOCATIONS */ -/* reuse GL_MIN_FRAGMENT_INTERPOLATION_OFFSET */ -/* reuse GL_MAX_FRAGMENT_INTERPOLATION_OFFSET */ -/* reuse GL_FRAGMENT_INTERPOLATION_OFFSET_BITS */ -/* reuse GL_MAX_VERTEX_STREAMS */ -/* Reuse tokens from ARB_gpu_shader_fp64 */ -/* reuse GL_DOUBLE_VEC2 */ -/* reuse GL_DOUBLE_VEC3 */ -/* reuse GL_DOUBLE_VEC4 */ -/* reuse GL_DOUBLE_MAT2 */ -/* reuse GL_DOUBLE_MAT3 */ -/* reuse GL_DOUBLE_MAT4 */ -/* reuse GL_DOUBLE_MAT2x3 */ -/* reuse GL_DOUBLE_MAT2x4 */ -/* reuse GL_DOUBLE_MAT3x2 */ -/* reuse GL_DOUBLE_MAT3x4 */ -/* reuse GL_DOUBLE_MAT4x2 */ -/* reuse GL_DOUBLE_MAT4x3 */ -/* Reuse tokens from ARB_shader_subroutine */ -/* reuse GL_ACTIVE_SUBROUTINES */ -/* reuse GL_ACTIVE_SUBROUTINE_UNIFORMS */ -/* reuse GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS */ -/* reuse GL_ACTIVE_SUBROUTINE_MAX_LENGTH */ -/* reuse GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH */ -/* reuse GL_MAX_SUBROUTINES */ -/* reuse GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS */ -/* reuse GL_NUM_COMPATIBLE_SUBROUTINES */ -/* reuse GL_COMPATIBLE_SUBROUTINES */ -/* Reuse tokens from ARB_tessellation_shader */ -/* reuse GL_PATCHES */ -/* reuse GL_PATCH_VERTICES */ -/* reuse GL_PATCH_DEFAULT_INNER_LEVEL */ -/* reuse GL_PATCH_DEFAULT_OUTER_LEVEL */ -/* reuse GL_TESS_CONTROL_OUTPUT_VERTICES */ -/* reuse GL_TESS_GEN_MODE */ -/* reuse GL_TESS_GEN_SPACING */ -/* reuse GL_TESS_GEN_VERTEX_ORDER */ -/* reuse GL_TESS_GEN_POINT_MODE */ -/* reuse GL_ISOLINES */ -/* reuse GL_FRACTIONAL_ODD */ -/* reuse GL_FRACTIONAL_EVEN */ -/* reuse GL_MAX_PATCH_VERTICES */ -/* reuse GL_MAX_TESS_GEN_LEVEL */ -/* reuse GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS */ -/* reuse GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS */ -/* reuse GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS */ -/* reuse GL_MAX_TESS_PATCH_COMPONENTS */ -/* reuse GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS */ -/* reuse GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS */ -/* reuse GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS */ -/* reuse GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS */ -/* reuse GL_MAX_TESS_CONTROL_INPUT_COMPONENTS */ -/* reuse GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS */ -/* reuse GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER */ -/* reuse GL_TESS_EVALUATION_SHADER */ -/* reuse GL_TESS_CONTROL_SHADER */ -/* Reuse tokens from ARB_texture_buffer_object_rgb32 (none) */ -/* Reuse tokens from ARB_transform_feedback2 */ -/* reuse GL_TRANSFORM_FEEDBACK */ -/* reuse GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED */ -/* reuse GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE */ -/* reuse GL_TRANSFORM_FEEDBACK_BINDING */ -/* Reuse tokens from ARB_transform_feedback3 */ -/* reuse GL_MAX_TRANSFORM_FEEDBACK_BUFFERS */ -/* reuse GL_MAX_VERTEX_STREAMS */ -#endif -#ifndef GL_VERSION_4_1 -/* Reuse tokens from ARB_ES2_compatibility */ -/* reuse GL_FIXED */ -/* reuse GL_IMPLEMENTATION_COLOR_READ_TYPE */ -/* reuse GL_IMPLEMENTATION_COLOR_READ_FORMAT */ -/* reuse GL_LOW_FLOAT */ -/* reuse GL_MEDIUM_FLOAT */ -/* reuse GL_HIGH_FLOAT */ -/* reuse GL_LOW_INT */ -/* reuse GL_MEDIUM_INT */ -/* reuse GL_HIGH_INT */ -/* reuse GL_SHADER_COMPILER */ -/* reuse GL_NUM_SHADER_BINARY_FORMATS */ -/* reuse GL_MAX_VERTEX_UNIFORM_VECTORS */ -/* reuse GL_MAX_VARYING_VECTORS */ -/* reuse GL_MAX_FRAGMENT_UNIFORM_VECTORS */ -/* Reuse tokens from ARB_get_program_binary */ -/* reuse GL_PROGRAM_BINARY_RETRIEVABLE_HINT */ -/* reuse GL_PROGRAM_BINARY_LENGTH */ -/* reuse GL_NUM_PROGRAM_BINARY_FORMATS */ -/* reuse GL_PROGRAM_BINARY_FORMATS */ -/* Reuse tokens from ARB_separate_shader_objects */ -/* reuse GL_VERTEX_SHADER_BIT */ -/* reuse GL_FRAGMENT_SHADER_BIT */ -/* reuse GL_GEOMETRY_SHADER_BIT */ -/* reuse GL_TESS_CONTROL_SHADER_BIT */ -/* reuse GL_TESS_EVALUATION_SHADER_BIT */ -/* reuse GL_ALL_SHADER_BITS */ -/* reuse GL_PROGRAM_SEPARABLE */ -/* reuse GL_ACTIVE_PROGRAM */ -/* reuse GL_PROGRAM_PIPELINE_BINDING */ -/* Reuse tokens from ARB_shader_precision (none) */ -/* Reuse tokens from ARB_vertex_attrib_64bit - all are in GL 3.0 and 4.0 already */ -/* Reuse tokens from ARB_viewport_array - some are in GL 1.1 and ARB_provoking_vertex already */ -/* reuse GL_MAX_VIEWPORTS */ -/* reuse GL_VIEWPORT_SUBPIXEL_BITS */ -/* reuse GL_VIEWPORT_BOUNDS_RANGE */ -/* reuse GL_LAYER_PROVOKING_VERTEX */ -/* reuse GL_VIEWPORT_INDEX_PROVOKING_VERTEX */ -/* reuse GL_UNDEFINED_VERTEX */ -#endif +/* + * Miscellaneous + */ -#ifndef GL_ARB_multitexture -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_TEXTURE4_ARB 0x84C4 -#define GL_TEXTURE5_ARB 0x84C5 -#define GL_TEXTURE6_ARB 0x84C6 -#define GL_TEXTURE7_ARB 0x84C7 -#define GL_TEXTURE8_ARB 0x84C8 -#define GL_TEXTURE9_ARB 0x84C9 -#define GL_TEXTURE10_ARB 0x84CA -#define GL_TEXTURE11_ARB 0x84CB -#define GL_TEXTURE12_ARB 0x84CC -#define GL_TEXTURE13_ARB 0x84CD -#define GL_TEXTURE14_ARB 0x84CE -#define GL_TEXTURE15_ARB 0x84CF -#define GL_TEXTURE16_ARB 0x84D0 -#define GL_TEXTURE17_ARB 0x84D1 -#define GL_TEXTURE18_ARB 0x84D2 -#define GL_TEXTURE19_ARB 0x84D3 -#define GL_TEXTURE20_ARB 0x84D4 -#define GL_TEXTURE21_ARB 0x84D5 -#define GL_TEXTURE22_ARB 0x84D6 -#define GL_TEXTURE23_ARB 0x84D7 -#define GL_TEXTURE24_ARB 0x84D8 -#define GL_TEXTURE25_ARB 0x84D9 -#define GL_TEXTURE26_ARB 0x84DA -#define GL_TEXTURE27_ARB 0x84DB -#define GL_TEXTURE28_ARB 0x84DC -#define GL_TEXTURE29_ARB 0x84DD -#define GL_TEXTURE30_ARB 0x84DE -#define GL_TEXTURE31_ARB 0x84DF -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 -#endif +GLAPI void GLAPIENTRY glClearIndex( GLfloat c ); -#ifndef GL_ARB_transpose_matrix -#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 -#endif +GLAPI void GLAPIENTRY glClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); -#ifndef GL_ARB_multisample -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 -#endif +GLAPI void GLAPIENTRY glClear( GLbitfield mask ); -#ifndef GL_ARB_texture_env_add -#endif +GLAPI void GLAPIENTRY glIndexMask( GLuint mask ); -#ifndef GL_ARB_texture_cube_map -#define GL_NORMAL_MAP_ARB 0x8511 -#define GL_REFLECTION_MAP_ARB 0x8512 -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C -#endif +GLAPI void GLAPIENTRY glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ); -#ifndef GL_ARB_texture_compression -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 -#endif +GLAPI void GLAPIENTRY glAlphaFunc( GLenum func, GLclampf ref ); -#ifndef GL_ARB_texture_border_clamp -#define GL_CLAMP_TO_BORDER_ARB 0x812D -#endif +GLAPI void GLAPIENTRY glBlendFunc( GLenum sfactor, GLenum dfactor ); -#ifndef GL_ARB_point_parameters -#define GL_POINT_SIZE_MIN_ARB 0x8126 -#define GL_POINT_SIZE_MAX_ARB 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 -#endif +GLAPI void GLAPIENTRY glLogicOp( GLenum opcode ); -#ifndef GL_ARB_vertex_blend -#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 -#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 -#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 -#define GL_VERTEX_BLEND_ARB 0x86A7 -#define GL_CURRENT_WEIGHT_ARB 0x86A8 -#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 -#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA -#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB -#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC -#define GL_WEIGHT_ARRAY_ARB 0x86AD -#define GL_MODELVIEW0_ARB 0x1700 -#define GL_MODELVIEW1_ARB 0x850A -#define GL_MODELVIEW2_ARB 0x8722 -#define GL_MODELVIEW3_ARB 0x8723 -#define GL_MODELVIEW4_ARB 0x8724 -#define GL_MODELVIEW5_ARB 0x8725 -#define GL_MODELVIEW6_ARB 0x8726 -#define GL_MODELVIEW7_ARB 0x8727 -#define GL_MODELVIEW8_ARB 0x8728 -#define GL_MODELVIEW9_ARB 0x8729 -#define GL_MODELVIEW10_ARB 0x872A -#define GL_MODELVIEW11_ARB 0x872B -#define GL_MODELVIEW12_ARB 0x872C -#define GL_MODELVIEW13_ARB 0x872D -#define GL_MODELVIEW14_ARB 0x872E -#define GL_MODELVIEW15_ARB 0x872F -#define GL_MODELVIEW16_ARB 0x8730 -#define GL_MODELVIEW17_ARB 0x8731 -#define GL_MODELVIEW18_ARB 0x8732 -#define GL_MODELVIEW19_ARB 0x8733 -#define GL_MODELVIEW20_ARB 0x8734 -#define GL_MODELVIEW21_ARB 0x8735 -#define GL_MODELVIEW22_ARB 0x8736 -#define GL_MODELVIEW23_ARB 0x8737 -#define GL_MODELVIEW24_ARB 0x8738 -#define GL_MODELVIEW25_ARB 0x8739 -#define GL_MODELVIEW26_ARB 0x873A -#define GL_MODELVIEW27_ARB 0x873B -#define GL_MODELVIEW28_ARB 0x873C -#define GL_MODELVIEW29_ARB 0x873D -#define GL_MODELVIEW30_ARB 0x873E -#define GL_MODELVIEW31_ARB 0x873F -#endif +GLAPI void GLAPIENTRY glCullFace( GLenum mode ); -#ifndef GL_ARB_matrix_palette -#define GL_MATRIX_PALETTE_ARB 0x8840 -#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 -#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 -#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 -#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 -#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 -#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 -#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 -#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 -#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 -#endif +GLAPI void GLAPIENTRY glFrontFace( GLenum mode ); -#ifndef GL_ARB_texture_env_combine -#define GL_COMBINE_ARB 0x8570 -#define GL_COMBINE_RGB_ARB 0x8571 -#define GL_COMBINE_ALPHA_ARB 0x8572 -#define GL_SOURCE0_RGB_ARB 0x8580 -#define GL_SOURCE1_RGB_ARB 0x8581 -#define GL_SOURCE2_RGB_ARB 0x8582 -#define GL_SOURCE0_ALPHA_ARB 0x8588 -#define GL_SOURCE1_ALPHA_ARB 0x8589 -#define GL_SOURCE2_ALPHA_ARB 0x858A -#define GL_OPERAND0_RGB_ARB 0x8590 -#define GL_OPERAND1_RGB_ARB 0x8591 -#define GL_OPERAND2_RGB_ARB 0x8592 -#define GL_OPERAND0_ALPHA_ARB 0x8598 -#define GL_OPERAND1_ALPHA_ARB 0x8599 -#define GL_OPERAND2_ALPHA_ARB 0x859A -#define GL_RGB_SCALE_ARB 0x8573 -#define GL_ADD_SIGNED_ARB 0x8574 -#define GL_INTERPOLATE_ARB 0x8575 -#define GL_SUBTRACT_ARB 0x84E7 -#define GL_CONSTANT_ARB 0x8576 -#define GL_PRIMARY_COLOR_ARB 0x8577 -#define GL_PREVIOUS_ARB 0x8578 -#endif +GLAPI void GLAPIENTRY glPointSize( GLfloat size ); -#ifndef GL_ARB_texture_env_crossbar -#endif +GLAPI void GLAPIENTRY glLineWidth( GLfloat width ); -#ifndef GL_ARB_texture_env_dot3 -#define GL_DOT3_RGB_ARB 0x86AE -#define GL_DOT3_RGBA_ARB 0x86AF -#endif +GLAPI void GLAPIENTRY glLineStipple( GLint factor, GLushort pattern ); -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_MIRRORED_REPEAT_ARB 0x8370 -#endif +GLAPI void GLAPIENTRY glPolygonMode( GLenum face, GLenum mode ); -#ifndef GL_ARB_depth_texture -#define GL_DEPTH_COMPONENT16_ARB 0x81A5 -#define GL_DEPTH_COMPONENT24_ARB 0x81A6 -#define GL_DEPTH_COMPONENT32_ARB 0x81A7 -#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A -#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B -#endif +GLAPI void GLAPIENTRY glPolygonOffset( GLfloat factor, GLfloat units ); -#ifndef GL_ARB_shadow -#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C -#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D -#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E -#endif +GLAPI void GLAPIENTRY glPolygonStipple( const GLubyte *mask ); -#ifndef GL_ARB_shadow_ambient -#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF -#endif +GLAPI void GLAPIENTRY glGetPolygonStipple( GLubyte *mask ); -#ifndef GL_ARB_window_pos -#endif +GLAPI void GLAPIENTRY glEdgeFlag( GLboolean flag ); -#ifndef GL_ARB_vertex_program -#define GL_COLOR_SUM_ARB 0x8458 -#define GL_VERTEX_PROGRAM_ARB 0x8620 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 -#define GL_PROGRAM_LENGTH_ARB 0x8627 -#define GL_PROGRAM_STRING_ARB 0x8628 -#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E -#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F -#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 -#define GL_CURRENT_MATRIX_ARB 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 -#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B -#define GL_PROGRAM_BINDING_ARB 0x8677 -#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A -#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 -#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 -#define GL_PROGRAM_FORMAT_ARB 0x8876 -#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 -#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 -#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 -#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 -#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 -#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 -#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 -#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 -#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 -#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 -#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA -#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB -#define GL_PROGRAM_ATTRIBS_ARB 0x88AC -#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD -#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE -#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF -#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 -#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 -#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 -#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 -#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 -#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 -#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 -#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 -#define GL_MATRIX0_ARB 0x88C0 -#define GL_MATRIX1_ARB 0x88C1 -#define GL_MATRIX2_ARB 0x88C2 -#define GL_MATRIX3_ARB 0x88C3 -#define GL_MATRIX4_ARB 0x88C4 -#define GL_MATRIX5_ARB 0x88C5 -#define GL_MATRIX6_ARB 0x88C6 -#define GL_MATRIX7_ARB 0x88C7 -#define GL_MATRIX8_ARB 0x88C8 -#define GL_MATRIX9_ARB 0x88C9 -#define GL_MATRIX10_ARB 0x88CA -#define GL_MATRIX11_ARB 0x88CB -#define GL_MATRIX12_ARB 0x88CC -#define GL_MATRIX13_ARB 0x88CD -#define GL_MATRIX14_ARB 0x88CE -#define GL_MATRIX15_ARB 0x88CF -#define GL_MATRIX16_ARB 0x88D0 -#define GL_MATRIX17_ARB 0x88D1 -#define GL_MATRIX18_ARB 0x88D2 -#define GL_MATRIX19_ARB 0x88D3 -#define GL_MATRIX20_ARB 0x88D4 -#define GL_MATRIX21_ARB 0x88D5 -#define GL_MATRIX22_ARB 0x88D6 -#define GL_MATRIX23_ARB 0x88D7 -#define GL_MATRIX24_ARB 0x88D8 -#define GL_MATRIX25_ARB 0x88D9 -#define GL_MATRIX26_ARB 0x88DA -#define GL_MATRIX27_ARB 0x88DB -#define GL_MATRIX28_ARB 0x88DC -#define GL_MATRIX29_ARB 0x88DD -#define GL_MATRIX30_ARB 0x88DE -#define GL_MATRIX31_ARB 0x88DF -#endif +GLAPI void GLAPIENTRY glEdgeFlagv( const GLboolean *flag ); -#ifndef GL_ARB_fragment_program -#define GL_FRAGMENT_PROGRAM_ARB 0x8804 -#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 -#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 -#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 -#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 -#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 -#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A -#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B -#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C -#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D -#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E -#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F -#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 -#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 -#endif +GLAPI void GLAPIENTRY glScissor( GLint x, GLint y, GLsizei width, GLsizei height); -#ifndef GL_ARB_vertex_buffer_object -#define GL_BUFFER_SIZE_ARB 0x8764 -#define GL_BUFFER_USAGE_ARB 0x8765 -#define GL_ARRAY_BUFFER_ARB 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 -#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F -#define GL_READ_ONLY_ARB 0x88B8 -#define GL_WRITE_ONLY_ARB 0x88B9 -#define GL_READ_WRITE_ARB 0x88BA -#define GL_BUFFER_ACCESS_ARB 0x88BB -#define GL_BUFFER_MAPPED_ARB 0x88BC -#define GL_BUFFER_MAP_POINTER_ARB 0x88BD -#define GL_STREAM_DRAW_ARB 0x88E0 -#define GL_STREAM_READ_ARB 0x88E1 -#define GL_STREAM_COPY_ARB 0x88E2 -#define GL_STATIC_DRAW_ARB 0x88E4 -#define GL_STATIC_READ_ARB 0x88E5 -#define GL_STATIC_COPY_ARB 0x88E6 -#define GL_DYNAMIC_DRAW_ARB 0x88E8 -#define GL_DYNAMIC_READ_ARB 0x88E9 -#define GL_DYNAMIC_COPY_ARB 0x88EA -#endif +GLAPI void GLAPIENTRY glClipPlane( GLenum plane, const GLdouble *equation ); -#ifndef GL_ARB_occlusion_query -#define GL_QUERY_COUNTER_BITS_ARB 0x8864 -#define GL_CURRENT_QUERY_ARB 0x8865 -#define GL_QUERY_RESULT_ARB 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 -#define GL_SAMPLES_PASSED_ARB 0x8914 -#endif +GLAPI void GLAPIENTRY glGetClipPlane( GLenum plane, GLdouble *equation ); -#ifndef GL_ARB_shader_objects -#define GL_PROGRAM_OBJECT_ARB 0x8B40 -#define GL_SHADER_OBJECT_ARB 0x8B48 -#define GL_OBJECT_TYPE_ARB 0x8B4E -#define GL_OBJECT_SUBTYPE_ARB 0x8B4F -#define GL_FLOAT_VEC2_ARB 0x8B50 -#define GL_FLOAT_VEC3_ARB 0x8B51 -#define GL_FLOAT_VEC4_ARB 0x8B52 -#define GL_INT_VEC2_ARB 0x8B53 -#define GL_INT_VEC3_ARB 0x8B54 -#define GL_INT_VEC4_ARB 0x8B55 -#define GL_BOOL_ARB 0x8B56 -#define GL_BOOL_VEC2_ARB 0x8B57 -#define GL_BOOL_VEC3_ARB 0x8B58 -#define GL_BOOL_VEC4_ARB 0x8B59 -#define GL_FLOAT_MAT2_ARB 0x8B5A -#define GL_FLOAT_MAT3_ARB 0x8B5B -#define GL_FLOAT_MAT4_ARB 0x8B5C -#define GL_SAMPLER_1D_ARB 0x8B5D -#define GL_SAMPLER_2D_ARB 0x8B5E -#define GL_SAMPLER_3D_ARB 0x8B5F -#define GL_SAMPLER_CUBE_ARB 0x8B60 -#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 -#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 -#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 -#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 -#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 -#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 -#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 -#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 -#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 -#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 -#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 -#endif +GLAPI void GLAPIENTRY glDrawBuffer( GLenum mode ); -#ifndef GL_ARB_vertex_shader -#define GL_VERTEX_SHADER_ARB 0x8B31 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A -#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D -#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 -#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A -#endif +GLAPI void GLAPIENTRY glReadBuffer( GLenum mode ); -#ifndef GL_ARB_fragment_shader -#define GL_FRAGMENT_SHADER_ARB 0x8B30 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B -#endif +GLAPI void GLAPIENTRY glEnable( GLenum cap ); -#ifndef GL_ARB_shading_language_100 -#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C -#endif +GLAPI void GLAPIENTRY glDisable( GLenum cap ); -#ifndef GL_ARB_texture_non_power_of_two -#endif +GLAPI GLboolean GLAPIENTRY glIsEnabled( GLenum cap ); -#ifndef GL_ARB_point_sprite -#define GL_POINT_SPRITE_ARB 0x8861 -#define GL_COORD_REPLACE_ARB 0x8862 -#endif -#ifndef GL_ARB_fragment_program_shadow -#endif +GLAPI void GLAPIENTRY glEnableClientState( GLenum cap ); /* 1.1 */ -#ifndef GL_ARB_draw_buffers -#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 -#define GL_DRAW_BUFFER0_ARB 0x8825 -#define GL_DRAW_BUFFER1_ARB 0x8826 -#define GL_DRAW_BUFFER2_ARB 0x8827 -#define GL_DRAW_BUFFER3_ARB 0x8828 -#define GL_DRAW_BUFFER4_ARB 0x8829 -#define GL_DRAW_BUFFER5_ARB 0x882A -#define GL_DRAW_BUFFER6_ARB 0x882B -#define GL_DRAW_BUFFER7_ARB 0x882C -#define GL_DRAW_BUFFER8_ARB 0x882D -#define GL_DRAW_BUFFER9_ARB 0x882E -#define GL_DRAW_BUFFER10_ARB 0x882F -#define GL_DRAW_BUFFER11_ARB 0x8830 -#define GL_DRAW_BUFFER12_ARB 0x8831 -#define GL_DRAW_BUFFER13_ARB 0x8832 -#define GL_DRAW_BUFFER14_ARB 0x8833 -#define GL_DRAW_BUFFER15_ARB 0x8834 -#endif +GLAPI void GLAPIENTRY glDisableClientState( GLenum cap ); /* 1.1 */ -#ifndef GL_ARB_texture_rectangle -#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 -#endif -#ifndef GL_ARB_color_buffer_float -#define GL_RGBA_FLOAT_MODE_ARB 0x8820 -#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A -#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B -#define GL_CLAMP_READ_COLOR_ARB 0x891C -#define GL_FIXED_ONLY_ARB 0x891D -#endif +GLAPI void GLAPIENTRY glGetBooleanv( GLenum pname, GLboolean *params ); -#ifndef GL_ARB_half_float_pixel -#define GL_HALF_FLOAT_ARB 0x140B -#endif +GLAPI void GLAPIENTRY glGetDoublev( GLenum pname, GLdouble *params ); -#ifndef GL_ARB_texture_float -#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 -#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 -#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 -#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 -#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 -#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 -#define GL_RGBA32F_ARB 0x8814 -#define GL_RGB32F_ARB 0x8815 -#define GL_ALPHA32F_ARB 0x8816 -#define GL_INTENSITY32F_ARB 0x8817 -#define GL_LUMINANCE32F_ARB 0x8818 -#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 -#define GL_RGBA16F_ARB 0x881A -#define GL_RGB16F_ARB 0x881B -#define GL_ALPHA16F_ARB 0x881C -#define GL_INTENSITY16F_ARB 0x881D -#define GL_LUMINANCE16F_ARB 0x881E -#define GL_LUMINANCE_ALPHA16F_ARB 0x881F -#endif +GLAPI void GLAPIENTRY glGetFloatv( GLenum pname, GLfloat *params ); -#ifndef GL_ARB_pixel_buffer_object -#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF -#endif +GLAPI void GLAPIENTRY glGetIntegerv( GLenum pname, GLint *params ); -#ifndef GL_ARB_depth_buffer_float -#define GL_DEPTH_COMPONENT32F 0x8CAC -#define GL_DEPTH32F_STENCIL8 0x8CAD -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD -#endif -#ifndef GL_ARB_draw_instanced -#endif +GLAPI void GLAPIENTRY glPushAttrib( GLbitfield mask ); -#ifndef GL_ARB_framebuffer_object -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 -#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 -#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 -#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 -#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 -#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 -#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 -#define GL_FRAMEBUFFER_DEFAULT 0x8218 -#define GL_FRAMEBUFFER_UNDEFINED 0x8219 -#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 -#define GL_DEPTH_STENCIL 0x84F9 -#define GL_UNSIGNED_INT_24_8 0x84FA -#define GL_DEPTH24_STENCIL8 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE 0x88F1 -#define GL_TEXTURE_RED_TYPE 0x8C10 -#define GL_TEXTURE_GREEN_TYPE 0x8C11 -#define GL_TEXTURE_BLUE_TYPE 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE 0x8C13 -#define GL_TEXTURE_DEPTH_TYPE 0x8C16 -#define GL_UNSIGNED_NORMALIZED 0x8C17 -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_DRAW_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_READ_FRAMEBUFFER 0x8CA8 -#define GL_DRAW_FRAMEBUFFER 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA -#define GL_RENDERBUFFER_SAMPLES 0x8CAB -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_COLOR_ATTACHMENT1 0x8CE1 -#define GL_COLOR_ATTACHMENT2 0x8CE2 -#define GL_COLOR_ATTACHMENT3 0x8CE3 -#define GL_COLOR_ATTACHMENT4 0x8CE4 -#define GL_COLOR_ATTACHMENT5 0x8CE5 -#define GL_COLOR_ATTACHMENT6 0x8CE6 -#define GL_COLOR_ATTACHMENT7 0x8CE7 -#define GL_COLOR_ATTACHMENT8 0x8CE8 -#define GL_COLOR_ATTACHMENT9 0x8CE9 -#define GL_COLOR_ATTACHMENT10 0x8CEA -#define GL_COLOR_ATTACHMENT11 0x8CEB -#define GL_COLOR_ATTACHMENT12 0x8CEC -#define GL_COLOR_ATTACHMENT13 0x8CED -#define GL_COLOR_ATTACHMENT14 0x8CEE -#define GL_COLOR_ATTACHMENT15 0x8CEF -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_STENCIL_ATTACHMENT 0x8D20 -#define GL_FRAMEBUFFER 0x8D40 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_STENCIL_INDEX1 0x8D46 -#define GL_STENCIL_INDEX4 0x8D47 -#define GL_STENCIL_INDEX8 0x8D48 -#define GL_STENCIL_INDEX16 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 -#define GL_MAX_SAMPLES 0x8D57 -#endif +GLAPI void GLAPIENTRY glPopAttrib( void ); -#ifndef GL_ARB_framebuffer_object_DEPRECATED -#define GL_INDEX 0x8222 -#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 -#endif -#ifndef GL_ARB_framebuffer_sRGB -#define GL_FRAMEBUFFER_SRGB 0x8DB9 -#endif +GLAPI void GLAPIENTRY glPushClientAttrib( GLbitfield mask ); /* 1.1 */ -#ifndef GL_ARB_geometry_shader4 -#define GL_LINES_ADJACENCY_ARB 0x000A -#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B -#define GL_TRIANGLES_ADJACENCY_ARB 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D -#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 -#define GL_GEOMETRY_SHADER_ARB 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 -/* reuse GL_MAX_VARYING_COMPONENTS */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */ -#endif +GLAPI void GLAPIENTRY glPopClientAttrib( void ); /* 1.1 */ -#ifndef GL_ARB_half_float_vertex -#define GL_HALF_FLOAT 0x140B -#endif -#ifndef GL_ARB_instanced_arrays -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE -#endif +GLAPI GLint GLAPIENTRY glRenderMode( GLenum mode ); -#ifndef GL_ARB_map_buffer_range -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 -#endif +GLAPI GLenum GLAPIENTRY glGetError( void ); -#ifndef GL_ARB_texture_buffer_object -#define GL_TEXTURE_BUFFER_ARB 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E -#endif +GLAPI const GLubyte * GLAPIENTRY glGetString( GLenum name ); -#ifndef GL_ARB_texture_compression_rgtc -#define GL_COMPRESSED_RED_RGTC1 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC -#define GL_COMPRESSED_RG_RGTC2 0x8DBD -#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE -#endif +GLAPI void GLAPIENTRY glFinish( void ); -#ifndef GL_ARB_texture_rg -#define GL_RG 0x8227 -#define GL_RG_INTEGER 0x8228 -#define GL_R8 0x8229 -#define GL_R16 0x822A -#define GL_RG8 0x822B -#define GL_RG16 0x822C -#define GL_R16F 0x822D -#define GL_R32F 0x822E -#define GL_RG16F 0x822F -#define GL_RG32F 0x8230 -#define GL_R8I 0x8231 -#define GL_R8UI 0x8232 -#define GL_R16I 0x8233 -#define GL_R16UI 0x8234 -#define GL_R32I 0x8235 -#define GL_R32UI 0x8236 -#define GL_RG8I 0x8237 -#define GL_RG8UI 0x8238 -#define GL_RG16I 0x8239 -#define GL_RG16UI 0x823A -#define GL_RG32I 0x823B -#define GL_RG32UI 0x823C -#endif +GLAPI void GLAPIENTRY glFlush( void ); -#ifndef GL_ARB_vertex_array_object -#define GL_VERTEX_ARRAY_BINDING 0x85B5 -#endif +GLAPI void GLAPIENTRY glHint( GLenum target, GLenum mode ); -#ifndef GL_ARB_uniform_buffer_object -#define GL_UNIFORM_BUFFER 0x8A11 -#define GL_UNIFORM_BUFFER_BINDING 0x8A28 -#define GL_UNIFORM_BUFFER_START 0x8A29 -#define GL_UNIFORM_BUFFER_SIZE 0x8A2A -#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C -#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D -#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E -#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F -#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 -#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 -#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 -#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 -#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 -#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 -#define GL_UNIFORM_TYPE 0x8A37 -#define GL_UNIFORM_SIZE 0x8A38 -#define GL_UNIFORM_NAME_LENGTH 0x8A39 -#define GL_UNIFORM_BLOCK_INDEX 0x8A3A -#define GL_UNIFORM_OFFSET 0x8A3B -#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C -#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D -#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E -#define GL_UNIFORM_BLOCK_BINDING 0x8A3F -#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 -#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 -#define GL_INVALID_INDEX 0xFFFFFFFFu -#endif -#ifndef GL_ARB_compatibility -/* ARB_compatibility just defines tokens from core 3.0 */ -#endif +/* + * Depth Buffer + */ -#ifndef GL_ARB_copy_buffer -#define GL_COPY_READ_BUFFER 0x8F36 -#define GL_COPY_WRITE_BUFFER 0x8F37 -#endif +GLAPI void GLAPIENTRY glClearDepth( GLclampd depth ); -#ifndef GL_ARB_shader_texture_lod -#endif +GLAPI void GLAPIENTRY glDepthFunc( GLenum func ); -#ifndef GL_ARB_depth_clamp -#define GL_DEPTH_CLAMP 0x864F -#endif +GLAPI void GLAPIENTRY glDepthMask( GLboolean flag ); -#ifndef GL_ARB_draw_elements_base_vertex -#endif +GLAPI void GLAPIENTRY glDepthRange( GLclampd near_val, GLclampd far_val ); -#ifndef GL_ARB_fragment_coord_conventions -#endif -#ifndef GL_ARB_provoking_vertex -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION 0x8E4D -#define GL_LAST_VERTEX_CONVENTION 0x8E4E -#define GL_PROVOKING_VERTEX 0x8E4F -#endif +/* + * Accumulation Buffer + */ -#ifndef GL_ARB_seamless_cube_map -#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F -#endif +GLAPI void GLAPIENTRY glClearAccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ); -#ifndef GL_ARB_sync -#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 -#define GL_OBJECT_TYPE 0x9112 -#define GL_SYNC_CONDITION 0x9113 -#define GL_SYNC_STATUS 0x9114 -#define GL_SYNC_FLAGS 0x9115 -#define GL_SYNC_FENCE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 -#define GL_UNSIGNALED 0x9118 -#define GL_SIGNALED 0x9119 -#define GL_ALREADY_SIGNALED 0x911A -#define GL_TIMEOUT_EXPIRED 0x911B -#define GL_CONDITION_SATISFIED 0x911C -#define GL_WAIT_FAILED 0x911D -#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 -#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull -#endif +GLAPI void GLAPIENTRY glAccum( GLenum op, GLfloat value ); -#ifndef GL_ARB_texture_multisample -#define GL_SAMPLE_POSITION 0x8E50 -#define GL_SAMPLE_MASK 0x8E51 -#define GL_SAMPLE_MASK_VALUE 0x8E52 -#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 -#define GL_TEXTURE_SAMPLES 0x9106 -#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 -#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 -#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A -#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B -#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D -#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E -#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F -#define GL_MAX_INTEGER_SAMPLES 0x9110 -#endif -#ifndef GL_ARB_vertex_array_bgra -/* reuse GL_BGRA */ -#endif +/* + * Transformation + */ -#ifndef GL_ARB_draw_buffers_blend -#endif +GLAPI void GLAPIENTRY glMatrixMode( GLenum mode ); -#ifndef GL_ARB_sample_shading -#define GL_SAMPLE_SHADING_ARB 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 -#endif +GLAPI void GLAPIENTRY glOrtho( GLdouble left, GLdouble right, + GLdouble bottom, GLdouble top, + GLdouble near_val, GLdouble far_val ); -#ifndef GL_ARB_texture_cube_map_array -#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F -#endif +GLAPI void GLAPIENTRY glFrustum( GLdouble left, GLdouble right, + GLdouble bottom, GLdouble top, + GLdouble near_val, GLdouble far_val ); -#ifndef GL_ARB_texture_gather -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F -#endif +GLAPI void GLAPIENTRY glViewport( GLint x, GLint y, + GLsizei width, GLsizei height ); -#ifndef GL_ARB_texture_query_lod -#endif +GLAPI void GLAPIENTRY glPushMatrix( void ); -#ifndef GL_ARB_shading_language_include -#define GL_SHADER_INCLUDE_ARB 0x8DAE -#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 -#define GL_NAMED_STRING_TYPE_ARB 0x8DEA -#endif +GLAPI void GLAPIENTRY glPopMatrix( void ); -#ifndef GL_ARB_texture_compression_bptc -#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F -#endif +GLAPI void GLAPIENTRY glLoadIdentity( void ); -#ifndef GL_ARB_blend_func_extended -#define GL_SRC1_COLOR 0x88F9 -/* reuse GL_SRC1_ALPHA */ -#define GL_ONE_MINUS_SRC1_COLOR 0x88FA -#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB -#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC -#endif +GLAPI void GLAPIENTRY glLoadMatrixd( const GLdouble *m ); +GLAPI void GLAPIENTRY glLoadMatrixf( const GLfloat *m ); -#ifndef GL_ARB_explicit_attrib_location -#endif +GLAPI void GLAPIENTRY glMultMatrixd( const GLdouble *m ); +GLAPI void GLAPIENTRY glMultMatrixf( const GLfloat *m ); -#ifndef GL_ARB_occlusion_query2 -#define GL_ANY_SAMPLES_PASSED 0x8C2F -#endif +GLAPI void GLAPIENTRY glRotated( GLdouble angle, + GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glRotatef( GLfloat angle, + GLfloat x, GLfloat y, GLfloat z ); -#ifndef GL_ARB_sampler_objects -#define GL_SAMPLER_BINDING 0x8919 -#endif +GLAPI void GLAPIENTRY glScaled( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glScalef( GLfloat x, GLfloat y, GLfloat z ); -#ifndef GL_ARB_shader_bit_encoding -#endif +GLAPI void GLAPIENTRY glTranslated( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glTranslatef( GLfloat x, GLfloat y, GLfloat z ); -#ifndef GL_ARB_texture_rgb10_a2ui -#define GL_RGB10_A2UI 0x906F -#endif -#ifndef GL_ARB_texture_swizzle -#define GL_TEXTURE_SWIZZLE_R 0x8E42 -#define GL_TEXTURE_SWIZZLE_G 0x8E43 -#define GL_TEXTURE_SWIZZLE_B 0x8E44 -#define GL_TEXTURE_SWIZZLE_A 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 -#endif +/* + * Display Lists + */ -#ifndef GL_ARB_timer_query -#define GL_TIME_ELAPSED 0x88BF -#define GL_TIMESTAMP 0x8E28 -#endif +GLAPI GLboolean GLAPIENTRY glIsList( GLuint list ); -#ifndef GL_ARB_vertex_type_2_10_10_10_rev -/* reuse GL_UNSIGNED_INT_2_10_10_10_REV */ -#define GL_INT_2_10_10_10_REV 0x8D9F -#endif +GLAPI void GLAPIENTRY glDeleteLists( GLuint list, GLsizei range ); -#ifndef GL_ARB_draw_indirect -#define GL_DRAW_INDIRECT_BUFFER 0x8F3F -#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 -#endif +GLAPI GLuint GLAPIENTRY glGenLists( GLsizei range ); -#ifndef GL_ARB_gpu_shader5 -#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C -#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D -/* reuse GL_MAX_VERTEX_STREAMS */ -#endif +GLAPI void GLAPIENTRY glNewList( GLuint list, GLenum mode ); -#ifndef GL_ARB_gpu_shader_fp64 -/* reuse GL_DOUBLE */ -#define GL_DOUBLE_VEC2 0x8FFC -#define GL_DOUBLE_VEC3 0x8FFD -#define GL_DOUBLE_VEC4 0x8FFE -#define GL_DOUBLE_MAT2 0x8F46 -#define GL_DOUBLE_MAT3 0x8F47 -#define GL_DOUBLE_MAT4 0x8F48 -#define GL_DOUBLE_MAT2x3 0x8F49 -#define GL_DOUBLE_MAT2x4 0x8F4A -#define GL_DOUBLE_MAT3x2 0x8F4B -#define GL_DOUBLE_MAT3x4 0x8F4C -#define GL_DOUBLE_MAT4x2 0x8F4D -#define GL_DOUBLE_MAT4x3 0x8F4E -#endif +GLAPI void GLAPIENTRY glEndList( void ); -#ifndef GL_ARB_shader_subroutine -#define GL_ACTIVE_SUBROUTINES 0x8DE5 -#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 -#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 -#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 -#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 -#define GL_MAX_SUBROUTINES 0x8DE7 -#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 -#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A -#define GL_COMPATIBLE_SUBROUTINES 0x8E4B -/* reuse GL_UNIFORM_SIZE */ -/* reuse GL_UNIFORM_NAME_LENGTH */ -#endif +GLAPI void GLAPIENTRY glCallList( GLuint list ); -#ifndef GL_ARB_tessellation_shader -#define GL_PATCHES 0x000E -#define GL_PATCH_VERTICES 0x8E72 -#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 -#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 -#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 -#define GL_TESS_GEN_MODE 0x8E76 -#define GL_TESS_GEN_SPACING 0x8E77 -#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 -#define GL_TESS_GEN_POINT_MODE 0x8E79 -/* reuse GL_TRIANGLES */ -/* reuse GL_QUADS */ -#define GL_ISOLINES 0x8E7A -/* reuse GL_EQUAL */ -#define GL_FRACTIONAL_ODD 0x8E7B -#define GL_FRACTIONAL_EVEN 0x8E7C -/* reuse GL_CCW */ -/* reuse GL_CW */ -#define GL_MAX_PATCH_VERTICES 0x8E7D -#define GL_MAX_TESS_GEN_LEVEL 0x8E7E -#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F -#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 -#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 -#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 -#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 -#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 -#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 -#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 -#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 -#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A -#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C -#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D -#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E -#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 -#define GL_TESS_EVALUATION_SHADER 0x8E87 -#define GL_TESS_CONTROL_SHADER 0x8E88 -#endif +GLAPI void GLAPIENTRY glCallLists( GLsizei n, GLenum type, + const GLvoid *lists ); -#ifndef GL_ARB_texture_buffer_object_rgb32 -/* reuse GL_RGB32F */ -/* reuse GL_RGB32UI */ -/* reuse GL_RGB32I */ -#endif +GLAPI void GLAPIENTRY glListBase( GLuint base ); -#ifndef GL_ARB_transform_feedback2 -#define GL_TRANSFORM_FEEDBACK 0x8E22 -#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 -#endif -#ifndef GL_ARB_transform_feedback3 -#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 -#define GL_MAX_VERTEX_STREAMS 0x8E71 -#endif +/* + * Drawing Functions + */ -#ifndef GL_ARB_ES2_compatibility -#define GL_FIXED 0x140C -#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B -#define GL_LOW_FLOAT 0x8DF0 -#define GL_MEDIUM_FLOAT 0x8DF1 -#define GL_HIGH_FLOAT 0x8DF2 -#define GL_LOW_INT 0x8DF3 -#define GL_MEDIUM_INT 0x8DF4 -#define GL_HIGH_INT 0x8DF5 -#define GL_SHADER_COMPILER 0x8DFA -#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 -#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB -#define GL_MAX_VARYING_VECTORS 0x8DFC -#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD -#endif +GLAPI void GLAPIENTRY glBegin( GLenum mode ); + +GLAPI void GLAPIENTRY glEnd( void ); + + +GLAPI void GLAPIENTRY glVertex2d( GLdouble x, GLdouble y ); +GLAPI void GLAPIENTRY glVertex2f( GLfloat x, GLfloat y ); +GLAPI void GLAPIENTRY glVertex2i( GLint x, GLint y ); +GLAPI void GLAPIENTRY glVertex2s( GLshort x, GLshort y ); + +GLAPI void GLAPIENTRY glVertex3d( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glVertex3f( GLfloat x, GLfloat y, GLfloat z ); +GLAPI void GLAPIENTRY glVertex3i( GLint x, GLint y, GLint z ); +GLAPI void GLAPIENTRY glVertex3s( GLshort x, GLshort y, GLshort z ); + +GLAPI void GLAPIENTRY glVertex4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); +GLAPI void GLAPIENTRY glVertex4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); +GLAPI void GLAPIENTRY glVertex4i( GLint x, GLint y, GLint z, GLint w ); +GLAPI void GLAPIENTRY glVertex4s( GLshort x, GLshort y, GLshort z, GLshort w ); + +GLAPI void GLAPIENTRY glVertex2dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glVertex2fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glVertex2iv( const GLint *v ); +GLAPI void GLAPIENTRY glVertex2sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glVertex3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glVertex3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glVertex3iv( const GLint *v ); +GLAPI void GLAPIENTRY glVertex3sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glVertex4dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glVertex4fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glVertex4iv( const GLint *v ); +GLAPI void GLAPIENTRY glVertex4sv( const GLshort *v ); + + +GLAPI void GLAPIENTRY glNormal3b( GLbyte nx, GLbyte ny, GLbyte nz ); +GLAPI void GLAPIENTRY glNormal3d( GLdouble nx, GLdouble ny, GLdouble nz ); +GLAPI void GLAPIENTRY glNormal3f( GLfloat nx, GLfloat ny, GLfloat nz ); +GLAPI void GLAPIENTRY glNormal3i( GLint nx, GLint ny, GLint nz ); +GLAPI void GLAPIENTRY glNormal3s( GLshort nx, GLshort ny, GLshort nz ); + +GLAPI void GLAPIENTRY glNormal3bv( const GLbyte *v ); +GLAPI void GLAPIENTRY glNormal3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glNormal3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glNormal3iv( const GLint *v ); +GLAPI void GLAPIENTRY glNormal3sv( const GLshort *v ); + + +GLAPI void GLAPIENTRY glIndexd( GLdouble c ); +GLAPI void GLAPIENTRY glIndexf( GLfloat c ); +GLAPI void GLAPIENTRY glIndexi( GLint c ); +GLAPI void GLAPIENTRY glIndexs( GLshort c ); +GLAPI void GLAPIENTRY glIndexub( GLubyte c ); /* 1.1 */ + +GLAPI void GLAPIENTRY glIndexdv( const GLdouble *c ); +GLAPI void GLAPIENTRY glIndexfv( const GLfloat *c ); +GLAPI void GLAPIENTRY glIndexiv( const GLint *c ); +GLAPI void GLAPIENTRY glIndexsv( const GLshort *c ); +GLAPI void GLAPIENTRY glIndexubv( const GLubyte *c ); /* 1.1 */ + +GLAPI void GLAPIENTRY glColor3b( GLbyte red, GLbyte green, GLbyte blue ); +GLAPI void GLAPIENTRY glColor3d( GLdouble red, GLdouble green, GLdouble blue ); +GLAPI void GLAPIENTRY glColor3f( GLfloat red, GLfloat green, GLfloat blue ); +GLAPI void GLAPIENTRY glColor3i( GLint red, GLint green, GLint blue ); +GLAPI void GLAPIENTRY glColor3s( GLshort red, GLshort green, GLshort blue ); +GLAPI void GLAPIENTRY glColor3ub( GLubyte red, GLubyte green, GLubyte blue ); +GLAPI void GLAPIENTRY glColor3ui( GLuint red, GLuint green, GLuint blue ); +GLAPI void GLAPIENTRY glColor3us( GLushort red, GLushort green, GLushort blue ); + +GLAPI void GLAPIENTRY glColor4b( GLbyte red, GLbyte green, + GLbyte blue, GLbyte alpha ); +GLAPI void GLAPIENTRY glColor4d( GLdouble red, GLdouble green, + GLdouble blue, GLdouble alpha ); +GLAPI void GLAPIENTRY glColor4f( GLfloat red, GLfloat green, + GLfloat blue, GLfloat alpha ); +GLAPI void GLAPIENTRY glColor4i( GLint red, GLint green, + GLint blue, GLint alpha ); +GLAPI void GLAPIENTRY glColor4s( GLshort red, GLshort green, + GLshort blue, GLshort alpha ); +GLAPI void GLAPIENTRY glColor4ub( GLubyte red, GLubyte green, + GLubyte blue, GLubyte alpha ); +GLAPI void GLAPIENTRY glColor4ui( GLuint red, GLuint green, + GLuint blue, GLuint alpha ); +GLAPI void GLAPIENTRY glColor4us( GLushort red, GLushort green, + GLushort blue, GLushort alpha ); + + +GLAPI void GLAPIENTRY glColor3bv( const GLbyte *v ); +GLAPI void GLAPIENTRY glColor3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glColor3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glColor3iv( const GLint *v ); +GLAPI void GLAPIENTRY glColor3sv( const GLshort *v ); +GLAPI void GLAPIENTRY glColor3ubv( const GLubyte *v ); +GLAPI void GLAPIENTRY glColor3uiv( const GLuint *v ); +GLAPI void GLAPIENTRY glColor3usv( const GLushort *v ); + +GLAPI void GLAPIENTRY glColor4bv( const GLbyte *v ); +GLAPI void GLAPIENTRY glColor4dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glColor4fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glColor4iv( const GLint *v ); +GLAPI void GLAPIENTRY glColor4sv( const GLshort *v ); +GLAPI void GLAPIENTRY glColor4ubv( const GLubyte *v ); +GLAPI void GLAPIENTRY glColor4uiv( const GLuint *v ); +GLAPI void GLAPIENTRY glColor4usv( const GLushort *v ); + + +GLAPI void GLAPIENTRY glTexCoord1d( GLdouble s ); +GLAPI void GLAPIENTRY glTexCoord1f( GLfloat s ); +GLAPI void GLAPIENTRY glTexCoord1i( GLint s ); +GLAPI void GLAPIENTRY glTexCoord1s( GLshort s ); + +GLAPI void GLAPIENTRY glTexCoord2d( GLdouble s, GLdouble t ); +GLAPI void GLAPIENTRY glTexCoord2f( GLfloat s, GLfloat t ); +GLAPI void GLAPIENTRY glTexCoord2i( GLint s, GLint t ); +GLAPI void GLAPIENTRY glTexCoord2s( GLshort s, GLshort t ); + +GLAPI void GLAPIENTRY glTexCoord3d( GLdouble s, GLdouble t, GLdouble r ); +GLAPI void GLAPIENTRY glTexCoord3f( GLfloat s, GLfloat t, GLfloat r ); +GLAPI void GLAPIENTRY glTexCoord3i( GLint s, GLint t, GLint r ); +GLAPI void GLAPIENTRY glTexCoord3s( GLshort s, GLshort t, GLshort r ); + +GLAPI void GLAPIENTRY glTexCoord4d( GLdouble s, GLdouble t, GLdouble r, GLdouble q ); +GLAPI void GLAPIENTRY glTexCoord4f( GLfloat s, GLfloat t, GLfloat r, GLfloat q ); +GLAPI void GLAPIENTRY glTexCoord4i( GLint s, GLint t, GLint r, GLint q ); +GLAPI void GLAPIENTRY glTexCoord4s( GLshort s, GLshort t, GLshort r, GLshort q ); + +GLAPI void GLAPIENTRY glTexCoord1dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glTexCoord1fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glTexCoord1iv( const GLint *v ); +GLAPI void GLAPIENTRY glTexCoord1sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glTexCoord2dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glTexCoord2fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glTexCoord2iv( const GLint *v ); +GLAPI void GLAPIENTRY glTexCoord2sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glTexCoord3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glTexCoord3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glTexCoord3iv( const GLint *v ); +GLAPI void GLAPIENTRY glTexCoord3sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glTexCoord4dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glTexCoord4fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glTexCoord4iv( const GLint *v ); +GLAPI void GLAPIENTRY glTexCoord4sv( const GLshort *v ); + + +GLAPI void GLAPIENTRY glRasterPos2d( GLdouble x, GLdouble y ); +GLAPI void GLAPIENTRY glRasterPos2f( GLfloat x, GLfloat y ); +GLAPI void GLAPIENTRY glRasterPos2i( GLint x, GLint y ); +GLAPI void GLAPIENTRY glRasterPos2s( GLshort x, GLshort y ); + +GLAPI void GLAPIENTRY glRasterPos3d( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glRasterPos3f( GLfloat x, GLfloat y, GLfloat z ); +GLAPI void GLAPIENTRY glRasterPos3i( GLint x, GLint y, GLint z ); +GLAPI void GLAPIENTRY glRasterPos3s( GLshort x, GLshort y, GLshort z ); + +GLAPI void GLAPIENTRY glRasterPos4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); +GLAPI void GLAPIENTRY glRasterPos4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); +GLAPI void GLAPIENTRY glRasterPos4i( GLint x, GLint y, GLint z, GLint w ); +GLAPI void GLAPIENTRY glRasterPos4s( GLshort x, GLshort y, GLshort z, GLshort w ); + +GLAPI void GLAPIENTRY glRasterPos2dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glRasterPos2fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glRasterPos2iv( const GLint *v ); +GLAPI void GLAPIENTRY glRasterPos2sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glRasterPos3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glRasterPos3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glRasterPos3iv( const GLint *v ); +GLAPI void GLAPIENTRY glRasterPos3sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glRasterPos4dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glRasterPos4fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glRasterPos4iv( const GLint *v ); +GLAPI void GLAPIENTRY glRasterPos4sv( const GLshort *v ); + + +GLAPI void GLAPIENTRY glRectd( GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2 ); +GLAPI void GLAPIENTRY glRectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ); +GLAPI void GLAPIENTRY glRecti( GLint x1, GLint y1, GLint x2, GLint y2 ); +GLAPI void GLAPIENTRY glRects( GLshort x1, GLshort y1, GLshort x2, GLshort y2 ); + + +GLAPI void GLAPIENTRY glRectdv( const GLdouble *v1, const GLdouble *v2 ); +GLAPI void GLAPIENTRY glRectfv( const GLfloat *v1, const GLfloat *v2 ); +GLAPI void GLAPIENTRY glRectiv( const GLint *v1, const GLint *v2 ); +GLAPI void GLAPIENTRY glRectsv( const GLshort *v1, const GLshort *v2 ); -#ifndef GL_ARB_get_program_binary -#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 -#define GL_PROGRAM_BINARY_LENGTH 0x8741 -#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE -#define GL_PROGRAM_BINARY_FORMATS 0x87FF -#endif -#ifndef GL_ARB_separate_shader_objects -#define GL_VERTEX_SHADER_BIT 0x00000001 -#define GL_FRAGMENT_SHADER_BIT 0x00000002 -#define GL_GEOMETRY_SHADER_BIT 0x00000004 -#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 -#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 -#define GL_ALL_SHADER_BITS 0xFFFFFFFF -#define GL_PROGRAM_SEPARABLE 0x8258 -#define GL_ACTIVE_PROGRAM 0x8259 -#define GL_PROGRAM_PIPELINE_BINDING 0x825A -#endif +/* + * Vertex Arrays (1.1) + */ -#ifndef GL_ARB_shader_precision -#endif +GLAPI void GLAPIENTRY glVertexPointer( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); -#ifndef GL_ARB_vertex_attrib_64bit -/* reuse GL_RGB32I */ -/* reuse GL_DOUBLE_VEC2 */ -/* reuse GL_DOUBLE_VEC3 */ -/* reuse GL_DOUBLE_VEC4 */ -/* reuse GL_DOUBLE_MAT2 */ -/* reuse GL_DOUBLE_MAT3 */ -/* reuse GL_DOUBLE_MAT4 */ -/* reuse GL_DOUBLE_MAT2x3 */ -/* reuse GL_DOUBLE_MAT2x4 */ -/* reuse GL_DOUBLE_MAT3x2 */ -/* reuse GL_DOUBLE_MAT3x4 */ -/* reuse GL_DOUBLE_MAT4x2 */ -/* reuse GL_DOUBLE_MAT4x3 */ -#endif +GLAPI void GLAPIENTRY glNormalPointer( GLenum type, GLsizei stride, + const GLvoid *ptr ); -#ifndef GL_ARB_viewport_array -/* reuse GL_SCISSOR_BOX */ -/* reuse GL_VIEWPORT */ -/* reuse GL_DEPTH_RANGE */ -/* reuse GL_SCISSOR_TEST */ -#define GL_MAX_VIEWPORTS 0x825B -#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C -#define GL_VIEWPORT_BOUNDS_RANGE 0x825D -#define GL_LAYER_PROVOKING_VERTEX 0x825E -#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F -#define GL_UNDEFINED_VERTEX 0x8260 -/* reuse GL_FIRST_VERTEX_CONVENTION */ -/* reuse GL_LAST_VERTEX_CONVENTION */ -/* reuse GL_PROVOKING_VERTEX */ -#endif +GLAPI void GLAPIENTRY glColorPointer( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); -#ifndef GL_ARB_cl_event -#define GL_SYNC_CL_EVENT_ARB 0x8240 -#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 -#endif +GLAPI void GLAPIENTRY glIndexPointer( GLenum type, GLsizei stride, + const GLvoid *ptr ); -#ifndef GL_ARB_debug_output -#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 -#define GL_DEBUG_SOURCE_API_ARB 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A -#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B -#define GL_DEBUG_TYPE_ERROR_ARB 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E -#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 -#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 -#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 -#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 -#endif +GLAPI void GLAPIENTRY glTexCoordPointer( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); -#ifndef GL_ARB_robustness -/* reuse GL_NO_ERROR */ -#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 -#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 -#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 -#endif +GLAPI void GLAPIENTRY glEdgeFlagPointer( GLsizei stride, const GLvoid *ptr ); -#ifndef GL_ARB_shader_stencil_export -#endif +GLAPI void GLAPIENTRY glGetPointerv( GLenum pname, GLvoid **params ); -#ifndef GL_EXT_abgr -#define GL_ABGR_EXT 0x8000 -#endif +GLAPI void GLAPIENTRY glArrayElement( GLint i ); -#ifndef GL_EXT_blend_color -#define GL_CONSTANT_COLOR_EXT 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 -#define GL_CONSTANT_ALPHA_EXT 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 -#define GL_BLEND_COLOR_EXT 0x8005 -#endif +GLAPI void GLAPIENTRY glDrawArrays( GLenum mode, GLint first, GLsizei count ); -#ifndef GL_EXT_polygon_offset -#define GL_POLYGON_OFFSET_EXT 0x8037 -#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 -#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 -#endif +GLAPI void GLAPIENTRY glDrawElements( GLenum mode, GLsizei count, + GLenum type, const GLvoid *indices ); -#ifndef GL_EXT_texture -#define GL_ALPHA4_EXT 0x803B -#define GL_ALPHA8_EXT 0x803C -#define GL_ALPHA12_EXT 0x803D -#define GL_ALPHA16_EXT 0x803E -#define GL_LUMINANCE4_EXT 0x803F -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE12_EXT 0x8041 -#define GL_LUMINANCE16_EXT 0x8042 -#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 -#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 -#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 -#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 -#define GL_INTENSITY_EXT 0x8049 -#define GL_INTENSITY4_EXT 0x804A -#define GL_INTENSITY8_EXT 0x804B -#define GL_INTENSITY12_EXT 0x804C -#define GL_INTENSITY16_EXT 0x804D -#define GL_RGB2_EXT 0x804E -#define GL_RGB4_EXT 0x804F -#define GL_RGB5_EXT 0x8050 -#define GL_RGB8_EXT 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB12_EXT 0x8053 -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA2_EXT 0x8055 -#define GL_RGBA4_EXT 0x8056 -#define GL_RGB5_A1_EXT 0x8057 -#define GL_RGBA8_EXT 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGBA12_EXT 0x805A -#define GL_RGBA16_EXT 0x805B -#define GL_TEXTURE_RED_SIZE_EXT 0x805C -#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D -#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E -#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 -#define GL_REPLACE_EXT 0x8062 -#define GL_PROXY_TEXTURE_1D_EXT 0x8063 -#define GL_PROXY_TEXTURE_2D_EXT 0x8064 -#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 -#endif +GLAPI void GLAPIENTRY glInterleavedArrays( GLenum format, GLsizei stride, + const GLvoid *pointer ); -#ifndef GL_EXT_texture3D -#define GL_PACK_SKIP_IMAGES_EXT 0x806B -#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C -#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D -#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_TEXTURE_DEPTH_EXT 0x8071 -#define GL_TEXTURE_WRAP_R_EXT 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 -#endif +/* + * Lighting + */ -#ifndef GL_SGIS_texture_filter4 -#define GL_FILTER4_SGIS 0x8146 -#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 -#endif +GLAPI void GLAPIENTRY glShadeModel( GLenum mode ); -#ifndef GL_EXT_subtexture -#endif +GLAPI void GLAPIENTRY glLightf( GLenum light, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glLighti( GLenum light, GLenum pname, GLint param ); +GLAPI void GLAPIENTRY glLightfv( GLenum light, GLenum pname, + const GLfloat *params ); +GLAPI void GLAPIENTRY glLightiv( GLenum light, GLenum pname, + const GLint *params ); -#ifndef GL_EXT_copy_texture -#endif +GLAPI void GLAPIENTRY glGetLightfv( GLenum light, GLenum pname, + GLfloat *params ); +GLAPI void GLAPIENTRY glGetLightiv( GLenum light, GLenum pname, + GLint *params ); -#ifndef GL_EXT_histogram -#define GL_HISTOGRAM_EXT 0x8024 -#define GL_PROXY_HISTOGRAM_EXT 0x8025 -#define GL_HISTOGRAM_WIDTH_EXT 0x8026 -#define GL_HISTOGRAM_FORMAT_EXT 0x8027 -#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C -#define GL_HISTOGRAM_SINK_EXT 0x802D -#define GL_MINMAX_EXT 0x802E -#define GL_MINMAX_FORMAT_EXT 0x802F -#define GL_MINMAX_SINK_EXT 0x8030 -#define GL_TABLE_TOO_LARGE_EXT 0x8031 -#endif +GLAPI void GLAPIENTRY glLightModelf( GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glLightModeli( GLenum pname, GLint param ); +GLAPI void GLAPIENTRY glLightModelfv( GLenum pname, const GLfloat *params ); +GLAPI void GLAPIENTRY glLightModeliv( GLenum pname, const GLint *params ); -#ifndef GL_EXT_convolution -#define GL_CONVOLUTION_1D_EXT 0x8010 -#define GL_CONVOLUTION_2D_EXT 0x8011 -#define GL_SEPARABLE_2D_EXT 0x8012 -#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 -#define GL_REDUCE_EXT 0x8016 -#define GL_CONVOLUTION_FORMAT_EXT 0x8017 -#define GL_CONVOLUTION_WIDTH_EXT 0x8018 -#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 -#endif +GLAPI void GLAPIENTRY glMaterialf( GLenum face, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glMateriali( GLenum face, GLenum pname, GLint param ); +GLAPI void GLAPIENTRY glMaterialfv( GLenum face, GLenum pname, const GLfloat *params ); +GLAPI void GLAPIENTRY glMaterialiv( GLenum face, GLenum pname, const GLint *params ); -#ifndef GL_SGI_color_matrix -#define GL_COLOR_MATRIX_SGI 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB -#endif +GLAPI void GLAPIENTRY glGetMaterialfv( GLenum face, GLenum pname, GLfloat *params ); +GLAPI void GLAPIENTRY glGetMaterialiv( GLenum face, GLenum pname, GLint *params ); -#ifndef GL_SGI_color_table -#define GL_COLOR_TABLE_SGI 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 -#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 -#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 -#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 -#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 -#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF -#endif +GLAPI void GLAPIENTRY glColorMaterial( GLenum face, GLenum mode ); -#ifndef GL_SGIS_pixel_texture -#define GL_PIXEL_TEXTURE_SGIS 0x8353 -#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 -#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 -#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 -#endif -#ifndef GL_SGIX_pixel_texture -#define GL_PIXEL_TEX_GEN_SGIX 0x8139 -#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B -#endif +/* + * Raster functions + */ -#ifndef GL_SGIS_texture4D -#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 -#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 -#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 -#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 -#define GL_TEXTURE_4D_SGIS 0x8134 -#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 -#define GL_TEXTURE_4DSIZE_SGIS 0x8136 -#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 -#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 -#define GL_TEXTURE_4D_BINDING_SGIS 0x814F -#endif +GLAPI void GLAPIENTRY glPixelZoom( GLfloat xfactor, GLfloat yfactor ); -#ifndef GL_SGI_texture_color_table -#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC -#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD -#endif +GLAPI void GLAPIENTRY glPixelStoref( GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glPixelStorei( GLenum pname, GLint param ); -#ifndef GL_EXT_cmyka -#define GL_CMYK_EXT 0x800C -#define GL_CMYKA_EXT 0x800D -#define GL_PACK_CMYK_HINT_EXT 0x800E -#define GL_UNPACK_CMYK_HINT_EXT 0x800F -#endif +GLAPI void GLAPIENTRY glPixelTransferf( GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glPixelTransferi( GLenum pname, GLint param ); -#ifndef GL_EXT_texture_object -#define GL_TEXTURE_PRIORITY_EXT 0x8066 -#define GL_TEXTURE_RESIDENT_EXT 0x8067 -#define GL_TEXTURE_1D_BINDING_EXT 0x8068 -#define GL_TEXTURE_2D_BINDING_EXT 0x8069 -#define GL_TEXTURE_3D_BINDING_EXT 0x806A -#endif +GLAPI void GLAPIENTRY glPixelMapfv( GLenum map, GLsizei mapsize, + const GLfloat *values ); +GLAPI void GLAPIENTRY glPixelMapuiv( GLenum map, GLsizei mapsize, + const GLuint *values ); +GLAPI void GLAPIENTRY glPixelMapusv( GLenum map, GLsizei mapsize, + const GLushort *values ); -#ifndef GL_SGIS_detail_texture -#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 -#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 -#define GL_LINEAR_DETAIL_SGIS 0x8097 -#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 -#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 -#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A -#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B -#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C -#endif +GLAPI void GLAPIENTRY glGetPixelMapfv( GLenum map, GLfloat *values ); +GLAPI void GLAPIENTRY glGetPixelMapuiv( GLenum map, GLuint *values ); +GLAPI void GLAPIENTRY glGetPixelMapusv( GLenum map, GLushort *values ); -#ifndef GL_SGIS_sharpen_texture -#define GL_LINEAR_SHARPEN_SGIS 0x80AD -#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE -#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF -#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 -#endif +GLAPI void GLAPIENTRY glBitmap( GLsizei width, GLsizei height, + GLfloat xorig, GLfloat yorig, + GLfloat xmove, GLfloat ymove, + const GLubyte *bitmap ); -#ifndef GL_EXT_packed_pixels -#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 -#endif +GLAPI void GLAPIENTRY glReadPixels( GLint x, GLint y, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + GLvoid *pixels ); -#ifndef GL_SGIS_texture_lod -#define GL_TEXTURE_MIN_LOD_SGIS 0x813A -#define GL_TEXTURE_MAX_LOD_SGIS 0x813B -#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C -#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D -#endif +GLAPI void GLAPIENTRY glDrawPixels( GLsizei width, GLsizei height, + GLenum format, GLenum type, + const GLvoid *pixels ); -#ifndef GL_SGIS_multisample -#define GL_MULTISAMPLE_SGIS 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F -#define GL_SAMPLE_MASK_SGIS 0x80A0 -#define GL_1PASS_SGIS 0x80A1 -#define GL_2PASS_0_SGIS 0x80A2 -#define GL_2PASS_1_SGIS 0x80A3 -#define GL_4PASS_0_SGIS 0x80A4 -#define GL_4PASS_1_SGIS 0x80A5 -#define GL_4PASS_2_SGIS 0x80A6 -#define GL_4PASS_3_SGIS 0x80A7 -#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 -#define GL_SAMPLES_SGIS 0x80A9 -#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA -#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB -#define GL_SAMPLE_PATTERN_SGIS 0x80AC -#endif +GLAPI void GLAPIENTRY glCopyPixels( GLint x, GLint y, + GLsizei width, GLsizei height, + GLenum type ); -#ifndef GL_EXT_rescale_normal -#define GL_RESCALE_NORMAL_EXT 0x803A -#endif +/* + * Stenciling + */ -#ifndef GL_EXT_vertex_array -#define GL_VERTEX_ARRAY_EXT 0x8074 -#define GL_NORMAL_ARRAY_EXT 0x8075 -#define GL_COLOR_ARRAY_EXT 0x8076 -#define GL_INDEX_ARRAY_EXT 0x8077 -#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 -#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 -#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A -#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B -#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C -#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D -#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E -#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F -#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 -#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 -#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 -#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 -#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 -#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 -#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 -#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 -#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A -#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B -#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C -#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D -#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E -#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F -#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 -#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 -#endif +GLAPI void GLAPIENTRY glStencilFunc( GLenum func, GLint ref, GLuint mask ); -#ifndef GL_EXT_misc_attribute -#endif +GLAPI void GLAPIENTRY glStencilMask( GLuint mask ); -#ifndef GL_SGIS_generate_mipmap -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 -#endif +GLAPI void GLAPIENTRY glStencilOp( GLenum fail, GLenum zfail, GLenum zpass ); -#ifndef GL_SGIX_clipmap -#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 -#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 -#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 -#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 -#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 -#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 -#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 -#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 -#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 -#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D -#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E -#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F -#endif +GLAPI void GLAPIENTRY glClearStencil( GLint s ); -#ifndef GL_SGIX_shadow -#define GL_TEXTURE_COMPARE_SGIX 0x819A -#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B -#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C -#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D -#endif -#ifndef GL_SGIS_texture_edge_clamp -#define GL_CLAMP_TO_EDGE_SGIS 0x812F -#endif -#ifndef GL_SGIS_texture_border_clamp -#define GL_CLAMP_TO_BORDER_SGIS 0x812D -#endif +/* + * Texture mapping + */ -#ifndef GL_EXT_blend_minmax -#define GL_FUNC_ADD_EXT 0x8006 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#define GL_BLEND_EQUATION_EXT 0x8009 -#endif +GLAPI void GLAPIENTRY glTexGend( GLenum coord, GLenum pname, GLdouble param ); +GLAPI void GLAPIENTRY glTexGenf( GLenum coord, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glTexGeni( GLenum coord, GLenum pname, GLint param ); -#ifndef GL_EXT_blend_subtract -#define GL_FUNC_SUBTRACT_EXT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B -#endif +GLAPI void GLAPIENTRY glTexGendv( GLenum coord, GLenum pname, const GLdouble *params ); +GLAPI void GLAPIENTRY glTexGenfv( GLenum coord, GLenum pname, const GLfloat *params ); +GLAPI void GLAPIENTRY glTexGeniv( GLenum coord, GLenum pname, const GLint *params ); -#ifndef GL_EXT_blend_logic_op -#endif +GLAPI void GLAPIENTRY glGetTexGendv( GLenum coord, GLenum pname, GLdouble *params ); +GLAPI void GLAPIENTRY glGetTexGenfv( GLenum coord, GLenum pname, GLfloat *params ); +GLAPI void GLAPIENTRY glGetTexGeniv( GLenum coord, GLenum pname, GLint *params ); -#ifndef GL_SGIX_interlace -#define GL_INTERLACE_SGIX 0x8094 -#endif -#ifndef GL_SGIX_pixel_tiles -#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E -#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F -#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 -#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 -#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 -#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 -#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 -#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 -#endif +GLAPI void GLAPIENTRY glTexEnvf( GLenum target, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glTexEnvi( GLenum target, GLenum pname, GLint param ); -#ifndef GL_SGIS_texture_select -#define GL_DUAL_ALPHA4_SGIS 0x8110 -#define GL_DUAL_ALPHA8_SGIS 0x8111 -#define GL_DUAL_ALPHA12_SGIS 0x8112 -#define GL_DUAL_ALPHA16_SGIS 0x8113 -#define GL_DUAL_LUMINANCE4_SGIS 0x8114 -#define GL_DUAL_LUMINANCE8_SGIS 0x8115 -#define GL_DUAL_LUMINANCE12_SGIS 0x8116 -#define GL_DUAL_LUMINANCE16_SGIS 0x8117 -#define GL_DUAL_INTENSITY4_SGIS 0x8118 -#define GL_DUAL_INTENSITY8_SGIS 0x8119 -#define GL_DUAL_INTENSITY12_SGIS 0x811A -#define GL_DUAL_INTENSITY16_SGIS 0x811B -#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C -#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D -#define GL_QUAD_ALPHA4_SGIS 0x811E -#define GL_QUAD_ALPHA8_SGIS 0x811F -#define GL_QUAD_LUMINANCE4_SGIS 0x8120 -#define GL_QUAD_LUMINANCE8_SGIS 0x8121 -#define GL_QUAD_INTENSITY4_SGIS 0x8122 -#define GL_QUAD_INTENSITY8_SGIS 0x8123 -#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 -#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 -#endif +GLAPI void GLAPIENTRY glTexEnvfv( GLenum target, GLenum pname, const GLfloat *params ); +GLAPI void GLAPIENTRY glTexEnviv( GLenum target, GLenum pname, const GLint *params ); -#ifndef GL_SGIX_sprite -#define GL_SPRITE_SGIX 0x8148 -#define GL_SPRITE_MODE_SGIX 0x8149 -#define GL_SPRITE_AXIS_SGIX 0x814A -#define GL_SPRITE_TRANSLATION_SGIX 0x814B -#define GL_SPRITE_AXIAL_SGIX 0x814C -#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D -#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E -#endif +GLAPI void GLAPIENTRY glGetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ); +GLAPI void GLAPIENTRY glGetTexEnviv( GLenum target, GLenum pname, GLint *params ); -#ifndef GL_SGIX_texture_multi_buffer -#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E -#endif -#ifndef GL_EXT_point_parameters -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 -#endif +GLAPI void GLAPIENTRY glTexParameterf( GLenum target, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glTexParameteri( GLenum target, GLenum pname, GLint param ); -#ifndef GL_SGIS_point_parameters -#define GL_POINT_SIZE_MIN_SGIS 0x8126 -#define GL_POINT_SIZE_MAX_SGIS 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 -#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 -#endif +GLAPI void GLAPIENTRY glTexParameterfv( GLenum target, GLenum pname, + const GLfloat *params ); +GLAPI void GLAPIENTRY glTexParameteriv( GLenum target, GLenum pname, + const GLint *params ); -#ifndef GL_SGIX_instruments -#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 -#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 -#endif +GLAPI void GLAPIENTRY glGetTexParameterfv( GLenum target, + GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexParameteriv( GLenum target, + GLenum pname, GLint *params ); -#ifndef GL_SGIX_texture_scale_bias -#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 -#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A -#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B -#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C -#endif +GLAPI void GLAPIENTRY glGetTexLevelParameterfv( GLenum target, GLint level, + GLenum pname, GLfloat *params ); +GLAPI void GLAPIENTRY glGetTexLevelParameteriv( GLenum target, GLint level, + GLenum pname, GLint *params ); -#ifndef GL_SGIX_framezoom -#define GL_FRAMEZOOM_SGIX 0x818B -#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C -#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D -#endif -#ifndef GL_SGIX_tag_sample_buffer -#endif +GLAPI void GLAPIENTRY glTexImage1D( GLenum target, GLint level, + GLint internalFormat, + GLsizei width, GLint border, + GLenum format, GLenum type, + const GLvoid *pixels ); -#ifndef GL_FfdMaskSGIX -#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 -#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 -#endif +GLAPI void GLAPIENTRY glTexImage2D( GLenum target, GLint level, + GLint internalFormat, + GLsizei width, GLsizei height, + GLint border, GLenum format, GLenum type, + const GLvoid *pixels ); -#ifndef GL_SGIX_polynomial_ffd -#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 -#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 -#define GL_DEFORMATIONS_MASK_SGIX 0x8196 -#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 -#endif +GLAPI void GLAPIENTRY glGetTexImage( GLenum target, GLint level, + GLenum format, GLenum type, + GLvoid *pixels ); -#ifndef GL_SGIX_reference_plane -#define GL_REFERENCE_PLANE_SGIX 0x817D -#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E -#endif -#ifndef GL_SGIX_flush_raster -#endif +/* 1.1 functions */ -#ifndef GL_SGIX_depth_texture -#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 -#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 -#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 -#endif +GLAPI void GLAPIENTRY glGenTextures( GLsizei n, GLuint *textures ); -#ifndef GL_SGIS_fog_function -#define GL_FOG_FUNC_SGIS 0x812A -#define GL_FOG_FUNC_POINTS_SGIS 0x812B -#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C -#endif +GLAPI void GLAPIENTRY glDeleteTextures( GLsizei n, const GLuint *textures); -#ifndef GL_SGIX_fog_offset -#define GL_FOG_OFFSET_SGIX 0x8198 -#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 -#endif +GLAPI void GLAPIENTRY glBindTexture( GLenum target, GLuint texture ); -#ifndef GL_HP_image_transform -#define GL_IMAGE_SCALE_X_HP 0x8155 -#define GL_IMAGE_SCALE_Y_HP 0x8156 -#define GL_IMAGE_TRANSLATE_X_HP 0x8157 -#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 -#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 -#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A -#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B -#define GL_IMAGE_MAG_FILTER_HP 0x815C -#define GL_IMAGE_MIN_FILTER_HP 0x815D -#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E -#define GL_CUBIC_HP 0x815F -#define GL_AVERAGE_HP 0x8160 -#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 -#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 -#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 -#endif +GLAPI void GLAPIENTRY glPrioritizeTextures( GLsizei n, + const GLuint *textures, + const GLclampf *priorities ); -#ifndef GL_HP_convolution_border_modes -#define GL_IGNORE_BORDER_HP 0x8150 -#define GL_CONSTANT_BORDER_HP 0x8151 -#define GL_REPLICATE_BORDER_HP 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 -#endif +GLAPI GLboolean GLAPIENTRY glAreTexturesResident( GLsizei n, + const GLuint *textures, + GLboolean *residences ); -#ifndef GL_INGR_palette_buffer -#endif +GLAPI GLboolean GLAPIENTRY glIsTexture( GLuint texture ); -#ifndef GL_SGIX_texture_add_env -#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE -#endif -#ifndef GL_EXT_color_subtable -#endif +GLAPI void GLAPIENTRY glTexSubImage1D( GLenum target, GLint level, + GLint xoffset, + GLsizei width, GLenum format, + GLenum type, const GLvoid *pixels ); -#ifndef GL_PGI_vertex_hints -#define GL_VERTEX_DATA_HINT_PGI 0x1A22A -#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B -#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C -#define GL_MAX_VERTEX_HINT_PGI 0x1A22D -#define GL_COLOR3_BIT_PGI 0x00010000 -#define GL_COLOR4_BIT_PGI 0x00020000 -#define GL_EDGEFLAG_BIT_PGI 0x00040000 -#define GL_INDEX_BIT_PGI 0x00080000 -#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 -#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 -#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 -#define GL_MAT_EMISSION_BIT_PGI 0x00800000 -#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 -#define GL_MAT_SHININESS_BIT_PGI 0x02000000 -#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 -#define GL_NORMAL_BIT_PGI 0x08000000 -#define GL_TEXCOORD1_BIT_PGI 0x10000000 -#define GL_TEXCOORD2_BIT_PGI 0x20000000 -#define GL_TEXCOORD3_BIT_PGI 0x40000000 -#define GL_TEXCOORD4_BIT_PGI 0x80000000 -#define GL_VERTEX23_BIT_PGI 0x00000004 -#define GL_VERTEX4_BIT_PGI 0x00000008 -#endif -#ifndef GL_PGI_misc_hints -#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 -#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD -#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE -#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 -#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 -#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 -#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C -#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D -#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E -#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F -#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 -#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 -#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 -#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 -#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 -#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 -#define GL_CLIP_NEAR_HINT_PGI 0x1A220 -#define GL_CLIP_FAR_HINT_PGI 0x1A221 -#define GL_WIDE_LINE_HINT_PGI 0x1A222 -#define GL_BACK_NORMALS_HINT_PGI 0x1A223 -#endif +GLAPI void GLAPIENTRY glTexSubImage2D( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + const GLvoid *pixels ); -#ifndef GL_EXT_paletted_texture -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -#endif -#ifndef GL_EXT_clip_volume_hint -#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 -#endif +GLAPI void GLAPIENTRY glCopyTexImage1D( GLenum target, GLint level, + GLenum internalformat, + GLint x, GLint y, + GLsizei width, GLint border ); -#ifndef GL_SGIX_list_priority -#define GL_LIST_PRIORITY_SGIX 0x8182 -#endif -#ifndef GL_SGIX_ir_instrument1 -#define GL_IR_INSTRUMENT1_SGIX 0x817F -#endif +GLAPI void GLAPIENTRY glCopyTexImage2D( GLenum target, GLint level, + GLenum internalformat, + GLint x, GLint y, + GLsizei width, GLsizei height, + GLint border ); -#ifndef GL_SGIX_calligraphic_fragment -#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 -#endif -#ifndef GL_SGIX_texture_lod_bias -#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E -#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F -#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 -#endif +GLAPI void GLAPIENTRY glCopyTexSubImage1D( GLenum target, GLint level, + GLint xoffset, GLint x, GLint y, + GLsizei width ); -#ifndef GL_SGIX_shadow_ambient -#define GL_SHADOW_AMBIENT_SGIX 0x80BF -#endif -#ifndef GL_EXT_index_texture -#endif +GLAPI void GLAPIENTRY glCopyTexSubImage2D( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLint x, GLint y, + GLsizei width, GLsizei height ); -#ifndef GL_EXT_index_material -#define GL_INDEX_MATERIAL_EXT 0x81B8 -#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 -#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA -#endif -#ifndef GL_EXT_index_func -#define GL_INDEX_TEST_EXT 0x81B5 -#define GL_INDEX_TEST_FUNC_EXT 0x81B6 -#define GL_INDEX_TEST_REF_EXT 0x81B7 -#endif +/* + * Evaluators + */ -#ifndef GL_EXT_index_array_formats -#define GL_IUI_V2F_EXT 0x81AD -#define GL_IUI_V3F_EXT 0x81AE -#define GL_IUI_N3F_V2F_EXT 0x81AF -#define GL_IUI_N3F_V3F_EXT 0x81B0 -#define GL_T2F_IUI_V2F_EXT 0x81B1 -#define GL_T2F_IUI_V3F_EXT 0x81B2 -#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 -#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 -#endif - -#ifndef GL_EXT_compiled_vertex_array -#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 -#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 -#endif - -#ifndef GL_EXT_cull_vertex -#define GL_CULL_VERTEX_EXT 0x81AA -#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB -#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC -#endif - -#ifndef GL_SGIX_ycrcb -#define GL_YCRCB_422_SGIX 0x81BB -#define GL_YCRCB_444_SGIX 0x81BC -#endif - -#ifndef GL_SGIX_fragment_lighting -#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 -#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 -#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 -#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 -#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 -#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 -#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 -#define GL_LIGHT_ENV_MODE_SGIX 0x8407 -#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 -#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 -#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A -#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B -#define GL_FRAGMENT_LIGHT0_SGIX 0x840C -#define GL_FRAGMENT_LIGHT1_SGIX 0x840D -#define GL_FRAGMENT_LIGHT2_SGIX 0x840E -#define GL_FRAGMENT_LIGHT3_SGIX 0x840F -#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 -#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 -#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 -#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 -#endif - -#ifndef GL_IBM_rasterpos_clip -#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 -#endif - -#ifndef GL_HP_texture_lighting -#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 -#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 -#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 -#endif - -#ifndef GL_EXT_draw_range_elements -#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 -#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 -#endif - -#ifndef GL_WIN_phong_shading -#define GL_PHONG_WIN 0x80EA -#define GL_PHONG_HINT_WIN 0x80EB -#endif - -#ifndef GL_WIN_specular_fog -#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC -#endif - -#ifndef GL_EXT_light_texture -#define GL_FRAGMENT_MATERIAL_EXT 0x8349 -#define GL_FRAGMENT_NORMAL_EXT 0x834A -#define GL_FRAGMENT_COLOR_EXT 0x834C -#define GL_ATTENUATION_EXT 0x834D -#define GL_SHADOW_ATTENUATION_EXT 0x834E -#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F -#define GL_TEXTURE_LIGHT_EXT 0x8350 -#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 -#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 -/* reuse GL_FRAGMENT_DEPTH_EXT */ -#endif - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_ALPHA_MIN_SGIX 0x8320 -#define GL_ALPHA_MAX_SGIX 0x8321 -#endif - -#ifndef GL_SGIX_impact_pixel_texture -#define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX 0x8184 -#define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX 0x8185 -#define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX 0x8186 -#define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX 0x8187 -#define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX 0x8188 -#define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX 0x8189 -#define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX 0x818A -#endif - -#ifndef GL_EXT_bgra -#define GL_BGR_EXT 0x80E0 -#define GL_BGRA_EXT 0x80E1 -#endif - -#ifndef GL_SGIX_async -#define GL_ASYNC_MARKER_SGIX 0x8329 -#endif - -#ifndef GL_SGIX_async_pixel -#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C -#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D -#define GL_ASYNC_READ_PIXELS_SGIX 0x835E -#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F -#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 -#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 -#endif - -#ifndef GL_SGIX_async_histogram -#define GL_ASYNC_HISTOGRAM_SGIX 0x832C -#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D -#endif - -#ifndef GL_INTEL_texture_scissor -#endif - -#ifndef GL_INTEL_parallel_arrays -#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 -#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 -#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 -#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 -#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 -#endif - -#ifndef GL_HP_occlusion_test -#define GL_OCCLUSION_TEST_HP 0x8165 -#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 -#endif - -#ifndef GL_EXT_pixel_transform -#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 -#define GL_PIXEL_MAG_FILTER_EXT 0x8331 -#define GL_PIXEL_MIN_FILTER_EXT 0x8332 -#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 -#define GL_CUBIC_EXT 0x8334 -#define GL_AVERAGE_EXT 0x8335 -#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 -#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 -#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 -#endif - -#ifndef GL_EXT_pixel_transform_color_table -#endif - -#ifndef GL_EXT_shared_texture_palette -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB -#endif - -#ifndef GL_EXT_separate_specular_color -#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 -#define GL_SINGLE_COLOR_EXT 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA -#endif - -#ifndef GL_EXT_secondary_color -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E -#endif - -#ifndef GL_EXT_texture_perturb_normal -#define GL_PERTURB_EXT 0x85AE -#define GL_TEXTURE_NORMAL_EXT 0x85AF -#endif +GLAPI void GLAPIENTRY glMap1d( GLenum target, GLdouble u1, GLdouble u2, + GLint stride, + GLint order, const GLdouble *points ); +GLAPI void GLAPIENTRY glMap1f( GLenum target, GLfloat u1, GLfloat u2, + GLint stride, + GLint order, const GLfloat *points ); -#ifndef GL_EXT_multi_draw_arrays -#endif +GLAPI void GLAPIENTRY glMap2d( GLenum target, + GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, + GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, + const GLdouble *points ); +GLAPI void GLAPIENTRY glMap2f( GLenum target, + GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, + GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, + const GLfloat *points ); -#ifndef GL_EXT_fog_coord -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 -#endif +GLAPI void GLAPIENTRY glGetMapdv( GLenum target, GLenum query, GLdouble *v ); +GLAPI void GLAPIENTRY glGetMapfv( GLenum target, GLenum query, GLfloat *v ); +GLAPI void GLAPIENTRY glGetMapiv( GLenum target, GLenum query, GLint *v ); -#ifndef GL_REND_screen_coordinates -#define GL_SCREEN_COORDINATES_REND 0x8490 -#define GL_INVERTED_SCREEN_W_REND 0x8491 -#endif +GLAPI void GLAPIENTRY glEvalCoord1d( GLdouble u ); +GLAPI void GLAPIENTRY glEvalCoord1f( GLfloat u ); -#ifndef GL_EXT_coordinate_frame -#define GL_TANGENT_ARRAY_EXT 0x8439 -#define GL_BINORMAL_ARRAY_EXT 0x843A -#define GL_CURRENT_TANGENT_EXT 0x843B -#define GL_CURRENT_BINORMAL_EXT 0x843C -#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E -#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F -#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 -#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 -#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 -#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 -#define GL_MAP1_TANGENT_EXT 0x8444 -#define GL_MAP2_TANGENT_EXT 0x8445 -#define GL_MAP1_BINORMAL_EXT 0x8446 -#define GL_MAP2_BINORMAL_EXT 0x8447 -#endif +GLAPI void GLAPIENTRY glEvalCoord1dv( const GLdouble *u ); +GLAPI void GLAPIENTRY glEvalCoord1fv( const GLfloat *u ); -#ifndef GL_EXT_texture_env_combine -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A -#endif +GLAPI void GLAPIENTRY glEvalCoord2d( GLdouble u, GLdouble v ); +GLAPI void GLAPIENTRY glEvalCoord2f( GLfloat u, GLfloat v ); -#ifndef GL_APPLE_specular_vector -#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 -#endif +GLAPI void GLAPIENTRY glEvalCoord2dv( const GLdouble *u ); +GLAPI void GLAPIENTRY glEvalCoord2fv( const GLfloat *u ); -#ifndef GL_APPLE_transform_hint -#define GL_TRANSFORM_HINT_APPLE 0x85B1 -#endif +GLAPI void GLAPIENTRY glMapGrid1d( GLint un, GLdouble u1, GLdouble u2 ); +GLAPI void GLAPIENTRY glMapGrid1f( GLint un, GLfloat u1, GLfloat u2 ); -#ifndef GL_SGIX_fog_scale -#define GL_FOG_SCALE_SGIX 0x81FC -#define GL_FOG_SCALE_VALUE_SGIX 0x81FD -#endif +GLAPI void GLAPIENTRY glMapGrid2d( GLint un, GLdouble u1, GLdouble u2, + GLint vn, GLdouble v1, GLdouble v2 ); +GLAPI void GLAPIENTRY glMapGrid2f( GLint un, GLfloat u1, GLfloat u2, + GLint vn, GLfloat v1, GLfloat v2 ); -#ifndef GL_SUNX_constant_data -#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 -#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 -#endif +GLAPI void GLAPIENTRY glEvalPoint1( GLint i ); -#ifndef GL_SUN_global_alpha -#define GL_GLOBAL_ALPHA_SUN 0x81D9 -#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA -#endif +GLAPI void GLAPIENTRY glEvalPoint2( GLint i, GLint j ); -#ifndef GL_SUN_triangle_list -#define GL_RESTART_SUN 0x0001 -#define GL_REPLACE_MIDDLE_SUN 0x0002 -#define GL_REPLACE_OLDEST_SUN 0x0003 -#define GL_TRIANGLE_LIST_SUN 0x81D7 -#define GL_REPLACEMENT_CODE_SUN 0x81D8 -#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 -#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 -#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 -#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 -#define GL_R1UI_V3F_SUN 0x85C4 -#define GL_R1UI_C4UB_V3F_SUN 0x85C5 -#define GL_R1UI_C3F_V3F_SUN 0x85C6 -#define GL_R1UI_N3F_V3F_SUN 0x85C7 -#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 -#define GL_R1UI_T2F_V3F_SUN 0x85C9 -#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA -#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB -#endif +GLAPI void GLAPIENTRY glEvalMesh1( GLenum mode, GLint i1, GLint i2 ); -#ifndef GL_SUN_vertex -#endif +GLAPI void GLAPIENTRY glEvalMesh2( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ); -#ifndef GL_EXT_blend_func_separate -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB -#endif -#ifndef GL_INGR_color_clamp -#define GL_RED_MIN_CLAMP_INGR 0x8560 -#define GL_GREEN_MIN_CLAMP_INGR 0x8561 -#define GL_BLUE_MIN_CLAMP_INGR 0x8562 -#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 -#define GL_RED_MAX_CLAMP_INGR 0x8564 -#define GL_GREEN_MAX_CLAMP_INGR 0x8565 -#define GL_BLUE_MAX_CLAMP_INGR 0x8566 -#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 -#endif +/* + * Fog + */ -#ifndef GL_INGR_interlace_read -#define GL_INTERLACE_READ_INGR 0x8568 -#endif +GLAPI void GLAPIENTRY glFogf( GLenum pname, GLfloat param ); -#ifndef GL_EXT_stencil_wrap -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 -#endif +GLAPI void GLAPIENTRY glFogi( GLenum pname, GLint param ); -#ifndef GL_EXT_422_pixels -#define GL_422_EXT 0x80CC -#define GL_422_REV_EXT 0x80CD -#define GL_422_AVERAGE_EXT 0x80CE -#define GL_422_REV_AVERAGE_EXT 0x80CF -#endif +GLAPI void GLAPIENTRY glFogfv( GLenum pname, const GLfloat *params ); -#ifndef GL_NV_texgen_reflection -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 -#endif +GLAPI void GLAPIENTRY glFogiv( GLenum pname, const GLint *params ); -#ifndef GL_EXT_texture_cube_map -#define GL_NORMAL_MAP_EXT 0x8511 -#define GL_REFLECTION_MAP_EXT 0x8512 -#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C -#endif -#ifndef GL_SUN_convolution_border_modes -#define GL_WRAP_BORDER_SUN 0x81D4 -#endif +/* + * Selection and Feedback + */ -#ifndef GL_EXT_texture_env_add -#endif +GLAPI void GLAPIENTRY glFeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer ); -#ifndef GL_EXT_texture_lod_bias -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 -#endif +GLAPI void GLAPIENTRY glPassThrough( GLfloat token ); -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#endif +GLAPI void GLAPIENTRY glSelectBuffer( GLsizei size, GLuint *buffer ); -#ifndef GL_EXT_vertex_weighting -#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH -#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 -#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX -#define GL_MODELVIEW1_MATRIX_EXT 0x8506 -#define GL_VERTEX_WEIGHTING_EXT 0x8509 -#define GL_MODELVIEW0_EXT GL_MODELVIEW -#define GL_MODELVIEW1_EXT 0x850A -#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B -#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C -#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D -#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E -#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F -#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 -#endif +GLAPI void GLAPIENTRY glInitNames( void ); -#ifndef GL_NV_light_max_exponent -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 -#endif +GLAPI void GLAPIENTRY glLoadName( GLuint name ); -#ifndef GL_NV_vertex_array_range -#define GL_VERTEX_ARRAY_RANGE_NV 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E -#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 -#endif +GLAPI void GLAPIENTRY glPushName( GLuint name ); -#ifndef GL_NV_register_combiners -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 -/* reuse GL_TEXTURE0_ARB */ -/* reuse GL_TEXTURE1_ARB */ -/* reuse GL_ZERO */ -/* reuse GL_NONE */ -/* reuse GL_FOG */ -#endif +GLAPI void GLAPIENTRY glPopName( void ); -#ifndef GL_NV_fog_distance -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C -/* reuse GL_EYE_PLANE */ -#endif -#ifndef GL_NV_texgen_emboss -#define GL_EMBOSS_LIGHT_NV 0x855D -#define GL_EMBOSS_CONSTANT_NV 0x855E -#define GL_EMBOSS_MAP_NV 0x855F -#endif -#ifndef GL_NV_blend_square -#endif +/* + * OpenGL 1.2 + */ -#ifndef GL_NV_texture_env_combine4 -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B -#endif +#define GL_RESCALE_NORMAL 0x803A +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_TEXTURE_BINDING_3D 0x806A + +GLAPI void GLAPIENTRY glDrawRangeElements( GLenum mode, GLuint start, + GLuint end, GLsizei count, GLenum type, const GLvoid *indices ); + +GLAPI void GLAPIENTRY glTexImage3D( GLenum target, GLint level, + GLint internalFormat, + GLsizei width, GLsizei height, + GLsizei depth, GLint border, + GLenum format, GLenum type, + const GLvoid *pixels ); + +GLAPI void GLAPIENTRY glTexSubImage3D( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLint zoffset, GLsizei width, + GLsizei height, GLsizei depth, + GLenum format, + GLenum type, const GLvoid *pixels); + +GLAPI void GLAPIENTRY glCopyTexSubImage3D( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLint zoffset, GLint x, + GLint y, GLsizei width, + GLsizei height ); -#ifndef GL_MESA_resize_buffers -#endif +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#ifndef GL_MESA_window_pos -#endif -#ifndef GL_EXT_texture_compression_s3tc -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#endif +/* + * GL_ARB_imaging + */ -#ifndef GL_IBM_cull_vertex -#define GL_CULL_VERTEX_IBM 103050 -#endif +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_BLEND_EQUATION 0x8009 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_BLEND_COLOR 0x8005 + + +GLAPI void GLAPIENTRY glColorTable( GLenum target, GLenum internalformat, + GLsizei width, GLenum format, + GLenum type, const GLvoid *table ); + +GLAPI void GLAPIENTRY glColorSubTable( GLenum target, + GLsizei start, GLsizei count, + GLenum format, GLenum type, + const GLvoid *data ); + +GLAPI void GLAPIENTRY glColorTableParameteriv(GLenum target, GLenum pname, + const GLint *params); + +GLAPI void GLAPIENTRY glColorTableParameterfv(GLenum target, GLenum pname, + const GLfloat *params); + +GLAPI void GLAPIENTRY glCopyColorSubTable( GLenum target, GLsizei start, + GLint x, GLint y, GLsizei width ); + +GLAPI void GLAPIENTRY glCopyColorTable( GLenum target, GLenum internalformat, + GLint x, GLint y, GLsizei width ); + +GLAPI void GLAPIENTRY glGetColorTable( GLenum target, GLenum format, + GLenum type, GLvoid *table ); + +GLAPI void GLAPIENTRY glGetColorTableParameterfv( GLenum target, GLenum pname, + GLfloat *params ); + +GLAPI void GLAPIENTRY glGetColorTableParameteriv( GLenum target, GLenum pname, + GLint *params ); + +GLAPI void GLAPIENTRY glBlendEquation( GLenum mode ); + +GLAPI void GLAPIENTRY glBlendColor( GLclampf red, GLclampf green, + GLclampf blue, GLclampf alpha ); + +GLAPI void GLAPIENTRY glHistogram( GLenum target, GLsizei width, + GLenum internalformat, GLboolean sink ); + +GLAPI void GLAPIENTRY glResetHistogram( GLenum target ); + +GLAPI void GLAPIENTRY glGetHistogram( GLenum target, GLboolean reset, + GLenum format, GLenum type, + GLvoid *values ); + +GLAPI void GLAPIENTRY glGetHistogramParameterfv( GLenum target, GLenum pname, + GLfloat *params ); + +GLAPI void GLAPIENTRY glGetHistogramParameteriv( GLenum target, GLenum pname, + GLint *params ); + +GLAPI void GLAPIENTRY glMinmax( GLenum target, GLenum internalformat, + GLboolean sink ); -#ifndef GL_IBM_multimode_draw_arrays -#endif +GLAPI void GLAPIENTRY glResetMinmax( GLenum target ); -#ifndef GL_IBM_vertex_array_lists -#define GL_VERTEX_ARRAY_LIST_IBM 103070 -#define GL_NORMAL_ARRAY_LIST_IBM 103071 -#define GL_COLOR_ARRAY_LIST_IBM 103072 -#define GL_INDEX_ARRAY_LIST_IBM 103073 -#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 -#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 -#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 -#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 -#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 -#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 -#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 -#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 -#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 -#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 -#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 -#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 -#endif +GLAPI void GLAPIENTRY glGetMinmax( GLenum target, GLboolean reset, + GLenum format, GLenum types, + GLvoid *values ); -#ifndef GL_SGIX_subsample -#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 -#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 -#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 -#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 -#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 -#endif +GLAPI void GLAPIENTRY glGetMinmaxParameterfv( GLenum target, GLenum pname, + GLfloat *params ); -#ifndef GL_SGIX_ycrcb_subsample -#endif +GLAPI void GLAPIENTRY glGetMinmaxParameteriv( GLenum target, GLenum pname, + GLint *params ); -#ifndef GL_SGIX_ycrcba -#define GL_YCRCB_SGIX 0x8318 -#define GL_YCRCBA_SGIX 0x8319 -#endif +GLAPI void GLAPIENTRY glConvolutionFilter1D( GLenum target, + GLenum internalformat, GLsizei width, GLenum format, GLenum type, + const GLvoid *image ); -#ifndef GL_SGI_depth_pass_instrument -#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 -#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 -#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 -#endif +GLAPI void GLAPIENTRY glConvolutionFilter2D( GLenum target, + GLenum internalformat, GLsizei width, GLsizei height, GLenum format, + GLenum type, const GLvoid *image ); -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 -#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 -#endif +GLAPI void GLAPIENTRY glConvolutionParameterf( GLenum target, GLenum pname, + GLfloat params ); -#ifndef GL_3DFX_multisample -#define GL_MULTISAMPLE_3DFX 0x86B2 -#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 -#define GL_SAMPLES_3DFX 0x86B4 -#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 -#endif +GLAPI void GLAPIENTRY glConvolutionParameterfv( GLenum target, GLenum pname, + const GLfloat *params ); -#ifndef GL_3DFX_tbuffer -#endif +GLAPI void GLAPIENTRY glConvolutionParameteri( GLenum target, GLenum pname, + GLint params ); -#ifndef GL_EXT_multisample -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F -#define GL_SAMPLE_MASK_EXT 0x80A0 -#define GL_1PASS_EXT 0x80A1 -#define GL_2PASS_0_EXT 0x80A2 -#define GL_2PASS_1_EXT 0x80A3 -#define GL_4PASS_0_EXT 0x80A4 -#define GL_4PASS_1_EXT 0x80A5 -#define GL_4PASS_2_EXT 0x80A6 -#define GL_4PASS_3_EXT 0x80A7 -#define GL_SAMPLE_BUFFERS_EXT 0x80A8 -#define GL_SAMPLES_EXT 0x80A9 -#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA -#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB -#define GL_SAMPLE_PATTERN_EXT 0x80AC -#define GL_MULTISAMPLE_BIT_EXT 0x20000000 -#endif +GLAPI void GLAPIENTRY glConvolutionParameteriv( GLenum target, GLenum pname, + const GLint *params ); -#ifndef GL_SGIX_vertex_preclip -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF -#endif +GLAPI void GLAPIENTRY glCopyConvolutionFilter1D( GLenum target, + GLenum internalformat, GLint x, GLint y, GLsizei width ); -#ifndef GL_SGIX_convolution_accuracy -#define GL_CONVOLUTION_HINT_SGIX 0x8316 -#endif +GLAPI void GLAPIENTRY glCopyConvolutionFilter2D( GLenum target, + GLenum internalformat, GLint x, GLint y, GLsizei width, + GLsizei height); -#ifndef GL_SGIX_resample -#define GL_PACK_RESAMPLE_SGIX 0x842C -#define GL_UNPACK_RESAMPLE_SGIX 0x842D -#define GL_RESAMPLE_REPLICATE_SGIX 0x842E -#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F -#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 -#endif +GLAPI void GLAPIENTRY glGetConvolutionFilter( GLenum target, GLenum format, + GLenum type, GLvoid *image ); -#ifndef GL_SGIS_point_line_texgen -#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 -#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 -#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 -#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 -#define GL_EYE_POINT_SGIS 0x81F4 -#define GL_OBJECT_POINT_SGIS 0x81F5 -#define GL_EYE_LINE_SGIS 0x81F6 -#define GL_OBJECT_LINE_SGIS 0x81F7 -#endif +GLAPI void GLAPIENTRY glGetConvolutionParameterfv( GLenum target, GLenum pname, + GLfloat *params ); -#ifndef GL_SGIS_texture_color_mask -#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF -#endif +GLAPI void GLAPIENTRY glGetConvolutionParameteriv( GLenum target, GLenum pname, + GLint *params ); -#ifndef GL_EXT_texture_env_dot3 -#define GL_DOT3_RGB_EXT 0x8740 -#define GL_DOT3_RGBA_EXT 0x8741 -#endif +GLAPI void GLAPIENTRY glSeparableFilter2D( GLenum target, + GLenum internalformat, GLsizei width, GLsizei height, GLenum format, + GLenum type, const GLvoid *row, const GLvoid *column ); -#ifndef GL_ATI_texture_mirror_once -#define GL_MIRROR_CLAMP_ATI 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 -#endif +GLAPI void GLAPIENTRY glGetSeparableFilter( GLenum target, GLenum format, + GLenum type, GLvoid *row, GLvoid *column, GLvoid *span ); -#ifndef GL_NV_fence -#define GL_ALL_COMPLETED_NV 0x84F2 -#define GL_FENCE_STATUS_NV 0x84F3 -#define GL_FENCE_CONDITION_NV 0x84F4 -#endif -#ifndef GL_IBM_texture_mirrored_repeat -#define GL_MIRRORED_REPEAT_IBM 0x8370 -#endif -#ifndef GL_NV_evaluators -#define GL_EVAL_2D_NV 0x86C0 -#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 -#define GL_MAP_TESSELLATION_NV 0x86C2 -#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 -#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 -#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 -#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 -#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 -#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 -#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 -#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA -#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB -#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC -#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD -#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE -#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF -#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 -#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 -#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 -#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 -#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 -#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 -#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 -#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 -#endif -#ifndef GL_NV_packed_depth_stencil -#define GL_DEPTH_STENCIL_NV 0x84F9 -#define GL_UNSIGNED_INT_24_8_NV 0x84FA -#endif +/* + * OpenGL 1.3 + */ -#ifndef GL_NV_register_combiners2 -#define GL_PER_STAGE_CONSTANTS_NV 0x8535 -#endif +/* multitexture */ +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +/* texture_cube_map */ +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +/* texture_compression */ +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +/* multisample */ +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_MULTISAMPLE_BIT 0x20000000 +/* transpose_matrix */ +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +/* texture_env_combine */ +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +/* texture_env_dot3 */ +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +/* texture_border_clamp */ +#define GL_CLAMP_TO_BORDER 0x812D -#ifndef GL_NV_texture_compression_vtc -#endif +GLAPI void GLAPIENTRY glActiveTexture( GLenum texture ); -#ifndef GL_NV_texture_rectangle -#define GL_TEXTURE_RECTANGLE_NV 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 -#endif +GLAPI void GLAPIENTRY glClientActiveTexture( GLenum texture ); -#ifndef GL_NV_texture_shader -#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C -#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D -#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E -#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_SHADER_CONSISTENT_NV 0x86DD -#define GL_TEXTURE_SHADER_NV 0x86DE -#define GL_SHADER_OPERATION_NV 0x86DF -#define GL_CULL_MODES_NV 0x86E0 -#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 -#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV -#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV -#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV -#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 -#define GL_CONST_EYE_NV 0x86E5 -#define GL_PASS_THROUGH_NV 0x86E6 -#define GL_CULL_FRAGMENT_NV 0x86E7 -#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 -#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 -#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA -#define GL_DOT_PRODUCT_NV 0x86EC -#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED -#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE -#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 -#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 -#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 -#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D -#define GL_HI_SCALE_NV 0x870E -#define GL_LO_SCALE_NV 0x870F -#define GL_DS_SCALE_NV 0x8710 -#define GL_DT_SCALE_NV 0x8711 -#define GL_MAGNITUDE_SCALE_NV 0x8712 -#define GL_VIBRANCE_SCALE_NV 0x8713 -#define GL_HI_BIAS_NV 0x8714 -#define GL_LO_BIAS_NV 0x8715 -#define GL_DS_BIAS_NV 0x8716 -#define GL_DT_BIAS_NV 0x8717 -#define GL_MAGNITUDE_BIAS_NV 0x8718 -#define GL_VIBRANCE_BIAS_NV 0x8719 -#define GL_TEXTURE_BORDER_VALUES_NV 0x871A -#define GL_TEXTURE_HI_SIZE_NV 0x871B -#define GL_TEXTURE_LO_SIZE_NV 0x871C -#define GL_TEXTURE_DS_SIZE_NV 0x871D -#define GL_TEXTURE_DT_SIZE_NV 0x871E -#define GL_TEXTURE_MAG_SIZE_NV 0x871F -#endif +GLAPI void GLAPIENTRY glCompressedTexImage1D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data ); -#ifndef GL_NV_texture_shader2 -#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF -#endif +GLAPI void GLAPIENTRY glCompressedTexImage2D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data ); -#ifndef GL_NV_vertex_array_range2 -#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 -#endif +GLAPI void GLAPIENTRY glCompressedTexImage3D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data ); -#ifndef GL_NV_vertex_program -#define GL_VERTEX_PROGRAM_NV 0x8620 -#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 -#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 -#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 -#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 -#define GL_CURRENT_ATTRIB_NV 0x8626 -#define GL_PROGRAM_LENGTH_NV 0x8627 -#define GL_PROGRAM_STRING_NV 0x8628 -#define GL_MODELVIEW_PROJECTION_NV 0x8629 -#define GL_IDENTITY_NV 0x862A -#define GL_INVERSE_NV 0x862B -#define GL_TRANSPOSE_NV 0x862C -#define GL_INVERSE_TRANSPOSE_NV 0x862D -#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E -#define GL_MAX_TRACK_MATRICES_NV 0x862F -#define GL_MATRIX0_NV 0x8630 -#define GL_MATRIX1_NV 0x8631 -#define GL_MATRIX2_NV 0x8632 -#define GL_MATRIX3_NV 0x8633 -#define GL_MATRIX4_NV 0x8634 -#define GL_MATRIX5_NV 0x8635 -#define GL_MATRIX6_NV 0x8636 -#define GL_MATRIX7_NV 0x8637 -#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 -#define GL_CURRENT_MATRIX_NV 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 -#define GL_PROGRAM_PARAMETER_NV 0x8644 -#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 -#define GL_PROGRAM_TARGET_NV 0x8646 -#define GL_PROGRAM_RESIDENT_NV 0x8647 -#define GL_TRACK_MATRIX_NV 0x8648 -#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 -#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A -#define GL_PROGRAM_ERROR_POSITION_NV 0x864B -#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 -#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 -#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 -#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 -#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 -#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 -#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 -#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 -#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 -#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 -#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A -#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B -#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C -#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D -#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E -#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F -#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 -#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 -#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 -#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 -#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 -#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 -#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 -#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 -#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 -#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 -#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A -#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B -#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C -#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D -#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E -#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F -#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 -#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 -#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 -#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 -#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 -#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 -#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 -#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 -#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 -#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 -#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A -#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B -#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C -#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D -#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E -#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F -#endif +GLAPI void GLAPIENTRY glCompressedTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data ); -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 -#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A -#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B -#endif +GLAPI void GLAPIENTRY glCompressedTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data ); -#ifndef GL_SGIX_scalebias_hint -#define GL_SCALEBIAS_HINT_SGIX 0x8322 -#endif +GLAPI void GLAPIENTRY glCompressedTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data ); -#ifndef GL_OML_interlace -#define GL_INTERLACE_OML 0x8980 -#define GL_INTERLACE_READ_OML 0x8981 -#endif +GLAPI void GLAPIENTRY glGetCompressedTexImage( GLenum target, GLint lod, GLvoid *img ); -#ifndef GL_OML_subsample -#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 -#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord1d( GLenum target, GLdouble s ); -#ifndef GL_OML_resample -#define GL_PACK_RESAMPLE_OML 0x8984 -#define GL_UNPACK_RESAMPLE_OML 0x8985 -#define GL_RESAMPLE_REPLICATE_OML 0x8986 -#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 -#define GL_RESAMPLE_AVERAGE_OML 0x8988 -#define GL_RESAMPLE_DECIMATE_OML 0x8989 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord1dv( GLenum target, const GLdouble *v ); -#ifndef GL_NV_copy_depth_to_color -#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E -#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F -#endif +GLAPI void GLAPIENTRY glMultiTexCoord1f( GLenum target, GLfloat s ); -#ifndef GL_ATI_envmap_bumpmap -#define GL_BUMP_ROT_MATRIX_ATI 0x8775 -#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 -#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 -#define GL_BUMP_TEX_UNITS_ATI 0x8778 -#define GL_DUDV_ATI 0x8779 -#define GL_DU8DV8_ATI 0x877A -#define GL_BUMP_ENVMAP_ATI 0x877B -#define GL_BUMP_TARGET_ATI 0x877C -#endif +GLAPI void GLAPIENTRY glMultiTexCoord1fv( GLenum target, const GLfloat *v ); -#ifndef GL_ATI_fragment_shader -#define GL_FRAGMENT_SHADER_ATI 0x8920 -#define GL_REG_0_ATI 0x8921 -#define GL_REG_1_ATI 0x8922 -#define GL_REG_2_ATI 0x8923 -#define GL_REG_3_ATI 0x8924 -#define GL_REG_4_ATI 0x8925 -#define GL_REG_5_ATI 0x8926 -#define GL_REG_6_ATI 0x8927 -#define GL_REG_7_ATI 0x8928 -#define GL_REG_8_ATI 0x8929 -#define GL_REG_9_ATI 0x892A -#define GL_REG_10_ATI 0x892B -#define GL_REG_11_ATI 0x892C -#define GL_REG_12_ATI 0x892D -#define GL_REG_13_ATI 0x892E -#define GL_REG_14_ATI 0x892F -#define GL_REG_15_ATI 0x8930 -#define GL_REG_16_ATI 0x8931 -#define GL_REG_17_ATI 0x8932 -#define GL_REG_18_ATI 0x8933 -#define GL_REG_19_ATI 0x8934 -#define GL_REG_20_ATI 0x8935 -#define GL_REG_21_ATI 0x8936 -#define GL_REG_22_ATI 0x8937 -#define GL_REG_23_ATI 0x8938 -#define GL_REG_24_ATI 0x8939 -#define GL_REG_25_ATI 0x893A -#define GL_REG_26_ATI 0x893B -#define GL_REG_27_ATI 0x893C -#define GL_REG_28_ATI 0x893D -#define GL_REG_29_ATI 0x893E -#define GL_REG_30_ATI 0x893F -#define GL_REG_31_ATI 0x8940 -#define GL_CON_0_ATI 0x8941 -#define GL_CON_1_ATI 0x8942 -#define GL_CON_2_ATI 0x8943 -#define GL_CON_3_ATI 0x8944 -#define GL_CON_4_ATI 0x8945 -#define GL_CON_5_ATI 0x8946 -#define GL_CON_6_ATI 0x8947 -#define GL_CON_7_ATI 0x8948 -#define GL_CON_8_ATI 0x8949 -#define GL_CON_9_ATI 0x894A -#define GL_CON_10_ATI 0x894B -#define GL_CON_11_ATI 0x894C -#define GL_CON_12_ATI 0x894D -#define GL_CON_13_ATI 0x894E -#define GL_CON_14_ATI 0x894F -#define GL_CON_15_ATI 0x8950 -#define GL_CON_16_ATI 0x8951 -#define GL_CON_17_ATI 0x8952 -#define GL_CON_18_ATI 0x8953 -#define GL_CON_19_ATI 0x8954 -#define GL_CON_20_ATI 0x8955 -#define GL_CON_21_ATI 0x8956 -#define GL_CON_22_ATI 0x8957 -#define GL_CON_23_ATI 0x8958 -#define GL_CON_24_ATI 0x8959 -#define GL_CON_25_ATI 0x895A -#define GL_CON_26_ATI 0x895B -#define GL_CON_27_ATI 0x895C -#define GL_CON_28_ATI 0x895D -#define GL_CON_29_ATI 0x895E -#define GL_CON_30_ATI 0x895F -#define GL_CON_31_ATI 0x8960 -#define GL_MOV_ATI 0x8961 -#define GL_ADD_ATI 0x8963 -#define GL_MUL_ATI 0x8964 -#define GL_SUB_ATI 0x8965 -#define GL_DOT3_ATI 0x8966 -#define GL_DOT4_ATI 0x8967 -#define GL_MAD_ATI 0x8968 -#define GL_LERP_ATI 0x8969 -#define GL_CND_ATI 0x896A -#define GL_CND0_ATI 0x896B -#define GL_DOT2_ADD_ATI 0x896C -#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D -#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E -#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F -#define GL_NUM_PASSES_ATI 0x8970 -#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 -#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 -#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 -#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 -#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 -#define GL_SWIZZLE_STR_ATI 0x8976 -#define GL_SWIZZLE_STQ_ATI 0x8977 -#define GL_SWIZZLE_STR_DR_ATI 0x8978 -#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 -#define GL_SWIZZLE_STRQ_ATI 0x897A -#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B -#define GL_RED_BIT_ATI 0x00000001 -#define GL_GREEN_BIT_ATI 0x00000002 -#define GL_BLUE_BIT_ATI 0x00000004 -#define GL_2X_BIT_ATI 0x00000001 -#define GL_4X_BIT_ATI 0x00000002 -#define GL_8X_BIT_ATI 0x00000004 -#define GL_HALF_BIT_ATI 0x00000008 -#define GL_QUARTER_BIT_ATI 0x00000010 -#define GL_EIGHTH_BIT_ATI 0x00000020 -#define GL_SATURATE_BIT_ATI 0x00000040 -#define GL_COMP_BIT_ATI 0x00000002 -#define GL_NEGATE_BIT_ATI 0x00000004 -#define GL_BIAS_BIT_ATI 0x00000008 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord1i( GLenum target, GLint s ); -#ifndef GL_ATI_pn_triangles -#define GL_PN_TRIANGLES_ATI 0x87F0 -#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 -#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 -#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 -#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 -#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 -#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 -#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 -#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord1iv( GLenum target, const GLint *v ); -#ifndef GL_ATI_vertex_array_object -#define GL_STATIC_ATI 0x8760 -#define GL_DYNAMIC_ATI 0x8761 -#define GL_PRESERVE_ATI 0x8762 -#define GL_DISCARD_ATI 0x8763 -#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 -#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 -#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 -#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord1s( GLenum target, GLshort s ); -#ifndef GL_EXT_vertex_shader -#define GL_VERTEX_SHADER_EXT 0x8780 -#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 -#define GL_OP_INDEX_EXT 0x8782 -#define GL_OP_NEGATE_EXT 0x8783 -#define GL_OP_DOT3_EXT 0x8784 -#define GL_OP_DOT4_EXT 0x8785 -#define GL_OP_MUL_EXT 0x8786 -#define GL_OP_ADD_EXT 0x8787 -#define GL_OP_MADD_EXT 0x8788 -#define GL_OP_FRAC_EXT 0x8789 -#define GL_OP_MAX_EXT 0x878A -#define GL_OP_MIN_EXT 0x878B -#define GL_OP_SET_GE_EXT 0x878C -#define GL_OP_SET_LT_EXT 0x878D -#define GL_OP_CLAMP_EXT 0x878E -#define GL_OP_FLOOR_EXT 0x878F -#define GL_OP_ROUND_EXT 0x8790 -#define GL_OP_EXP_BASE_2_EXT 0x8791 -#define GL_OP_LOG_BASE_2_EXT 0x8792 -#define GL_OP_POWER_EXT 0x8793 -#define GL_OP_RECIP_EXT 0x8794 -#define GL_OP_RECIP_SQRT_EXT 0x8795 -#define GL_OP_SUB_EXT 0x8796 -#define GL_OP_CROSS_PRODUCT_EXT 0x8797 -#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 -#define GL_OP_MOV_EXT 0x8799 -#define GL_OUTPUT_VERTEX_EXT 0x879A -#define GL_OUTPUT_COLOR0_EXT 0x879B -#define GL_OUTPUT_COLOR1_EXT 0x879C -#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D -#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E -#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F -#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 -#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 -#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 -#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 -#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 -#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 -#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 -#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 -#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 -#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 -#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA -#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB -#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC -#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD -#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE -#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF -#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 -#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 -#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 -#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 -#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 -#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 -#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 -#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 -#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 -#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 -#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA -#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB -#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC -#define GL_OUTPUT_FOG_EXT 0x87BD -#define GL_SCALAR_EXT 0x87BE -#define GL_VECTOR_EXT 0x87BF -#define GL_MATRIX_EXT 0x87C0 -#define GL_VARIANT_EXT 0x87C1 -#define GL_INVARIANT_EXT 0x87C2 -#define GL_LOCAL_CONSTANT_EXT 0x87C3 -#define GL_LOCAL_EXT 0x87C4 -#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 -#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 -#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 -#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 -#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE -#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF -#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 -#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 -#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 -#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 -#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 -#define GL_X_EXT 0x87D5 -#define GL_Y_EXT 0x87D6 -#define GL_Z_EXT 0x87D7 -#define GL_W_EXT 0x87D8 -#define GL_NEGATIVE_X_EXT 0x87D9 -#define GL_NEGATIVE_Y_EXT 0x87DA -#define GL_NEGATIVE_Z_EXT 0x87DB -#define GL_NEGATIVE_W_EXT 0x87DC -#define GL_ZERO_EXT 0x87DD -#define GL_ONE_EXT 0x87DE -#define GL_NEGATIVE_ONE_EXT 0x87DF -#define GL_NORMALIZED_RANGE_EXT 0x87E0 -#define GL_FULL_RANGE_EXT 0x87E1 -#define GL_CURRENT_VERTEX_EXT 0x87E2 -#define GL_MVP_MATRIX_EXT 0x87E3 -#define GL_VARIANT_VALUE_EXT 0x87E4 -#define GL_VARIANT_DATATYPE_EXT 0x87E5 -#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 -#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 -#define GL_VARIANT_ARRAY_EXT 0x87E8 -#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 -#define GL_INVARIANT_VALUE_EXT 0x87EA -#define GL_INVARIANT_DATATYPE_EXT 0x87EB -#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC -#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED -#endif +GLAPI void GLAPIENTRY glMultiTexCoord1sv( GLenum target, const GLshort *v ); -#ifndef GL_ATI_vertex_streams -#define GL_MAX_VERTEX_STREAMS_ATI 0x876B -#define GL_VERTEX_STREAM0_ATI 0x876C -#define GL_VERTEX_STREAM1_ATI 0x876D -#define GL_VERTEX_STREAM2_ATI 0x876E -#define GL_VERTEX_STREAM3_ATI 0x876F -#define GL_VERTEX_STREAM4_ATI 0x8770 -#define GL_VERTEX_STREAM5_ATI 0x8771 -#define GL_VERTEX_STREAM6_ATI 0x8772 -#define GL_VERTEX_STREAM7_ATI 0x8773 -#define GL_VERTEX_SOURCE_ATI 0x8774 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord2d( GLenum target, GLdouble s, GLdouble t ); -#ifndef GL_ATI_element_array -#define GL_ELEMENT_ARRAY_ATI 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A -#endif +GLAPI void GLAPIENTRY glMultiTexCoord2dv( GLenum target, const GLdouble *v ); -#ifndef GL_SUN_mesh_array -#define GL_QUAD_MESH_SUN 0x8614 -#define GL_TRIANGLE_MESH_SUN 0x8615 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord2f( GLenum target, GLfloat s, GLfloat t ); -#ifndef GL_SUN_slice_accum -#define GL_SLICE_ACCUM_SUN 0x85CC -#endif +GLAPI void GLAPIENTRY glMultiTexCoord2fv( GLenum target, const GLfloat *v ); -#ifndef GL_NV_multisample_filter_hint -#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord2i( GLenum target, GLint s, GLint t ); -#ifndef GL_NV_depth_clamp -#define GL_DEPTH_CLAMP_NV 0x864F -#endif +GLAPI void GLAPIENTRY glMultiTexCoord2iv( GLenum target, const GLint *v ); -#ifndef GL_NV_occlusion_query -#define GL_PIXEL_COUNTER_BITS_NV 0x8864 -#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 -#define GL_PIXEL_COUNT_NV 0x8866 -#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord2s( GLenum target, GLshort s, GLshort t ); -#ifndef GL_NV_point_sprite -#define GL_POINT_SPRITE_NV 0x8861 -#define GL_COORD_REPLACE_NV 0x8862 -#define GL_POINT_SPRITE_R_MODE_NV 0x8863 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord2sv( GLenum target, const GLshort *v ); -#ifndef GL_NV_texture_shader3 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 -#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 -#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 -#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 -#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 -#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A -#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B -#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C -#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D -#define GL_HILO8_NV 0x885E -#define GL_SIGNED_HILO8_NV 0x885F -#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord3d( GLenum target, GLdouble s, GLdouble t, GLdouble r ); -#ifndef GL_NV_vertex_program1_1 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord3dv( GLenum target, const GLdouble *v ); -#ifndef GL_EXT_shadow_funcs -#endif +GLAPI void GLAPIENTRY glMultiTexCoord3f( GLenum target, GLfloat s, GLfloat t, GLfloat r ); -#ifndef GL_EXT_stencil_two_side -#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 -#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord3fv( GLenum target, const GLfloat *v ); -#ifndef GL_ATI_text_fragment_shader -#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord3i( GLenum target, GLint s, GLint t, GLint r ); -#ifndef GL_APPLE_client_storage -#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord3iv( GLenum target, const GLint *v ); -#ifndef GL_APPLE_element_array -#define GL_ELEMENT_ARRAY_APPLE 0x8A0C -#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D -#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E -#endif +GLAPI void GLAPIENTRY glMultiTexCoord3s( GLenum target, GLshort s, GLshort t, GLshort r ); -#ifndef GL_APPLE_fence -#define GL_DRAW_PIXELS_APPLE 0x8A0A -#define GL_FENCE_APPLE 0x8A0B -#endif +GLAPI void GLAPIENTRY glMultiTexCoord3sv( GLenum target, const GLshort *v ); -#ifndef GL_APPLE_vertex_array_object -#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord4d( GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q ); -#ifndef GL_APPLE_vertex_array_range -#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E -#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F -#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 -#define GL_STORAGE_CLIENT_APPLE 0x85B4 -#define GL_STORAGE_CACHED_APPLE 0x85BE -#define GL_STORAGE_SHARED_APPLE 0x85BF -#endif +GLAPI void GLAPIENTRY glMultiTexCoord4dv( GLenum target, const GLdouble *v ); -#ifndef GL_APPLE_ycbcr_422 -#define GL_YCBCR_422_APPLE 0x85B9 -#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB -#endif +GLAPI void GLAPIENTRY glMultiTexCoord4f( GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q ); -#ifndef GL_S3_s3tc -#define GL_RGB_S3TC 0x83A0 -#define GL_RGB4_S3TC 0x83A1 -#define GL_RGBA_S3TC 0x83A2 -#define GL_RGBA4_S3TC 0x83A3 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord4fv( GLenum target, const GLfloat *v ); -#ifndef GL_ATI_draw_buffers -#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 -#define GL_DRAW_BUFFER0_ATI 0x8825 -#define GL_DRAW_BUFFER1_ATI 0x8826 -#define GL_DRAW_BUFFER2_ATI 0x8827 -#define GL_DRAW_BUFFER3_ATI 0x8828 -#define GL_DRAW_BUFFER4_ATI 0x8829 -#define GL_DRAW_BUFFER5_ATI 0x882A -#define GL_DRAW_BUFFER6_ATI 0x882B -#define GL_DRAW_BUFFER7_ATI 0x882C -#define GL_DRAW_BUFFER8_ATI 0x882D -#define GL_DRAW_BUFFER9_ATI 0x882E -#define GL_DRAW_BUFFER10_ATI 0x882F -#define GL_DRAW_BUFFER11_ATI 0x8830 -#define GL_DRAW_BUFFER12_ATI 0x8831 -#define GL_DRAW_BUFFER13_ATI 0x8832 -#define GL_DRAW_BUFFER14_ATI 0x8833 -#define GL_DRAW_BUFFER15_ATI 0x8834 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord4i( GLenum target, GLint s, GLint t, GLint r, GLint q ); -#ifndef GL_ATI_pixel_format_float -#define GL_TYPE_RGBA_FLOAT_ATI 0x8820 -#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord4iv( GLenum target, const GLint *v ); -#ifndef GL_ATI_texture_env_combine3 -#define GL_MODULATE_ADD_ATI 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 -#define GL_MODULATE_SUBTRACT_ATI 0x8746 -#endif +GLAPI void GLAPIENTRY glMultiTexCoord4s( GLenum target, GLshort s, GLshort t, GLshort r, GLshort q ); -#ifndef GL_ATI_texture_float -#define GL_RGBA_FLOAT32_ATI 0x8814 -#define GL_RGB_FLOAT32_ATI 0x8815 -#define GL_ALPHA_FLOAT32_ATI 0x8816 -#define GL_INTENSITY_FLOAT32_ATI 0x8817 -#define GL_LUMINANCE_FLOAT32_ATI 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 -#define GL_RGBA_FLOAT16_ATI 0x881A -#define GL_RGB_FLOAT16_ATI 0x881B -#define GL_ALPHA_FLOAT16_ATI 0x881C -#define GL_INTENSITY_FLOAT16_ATI 0x881D -#define GL_LUMINANCE_FLOAT16_ATI 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F -#endif +GLAPI void GLAPIENTRY glMultiTexCoord4sv( GLenum target, const GLshort *v ); -#ifndef GL_NV_float_buffer -#define GL_FLOAT_R_NV 0x8880 -#define GL_FLOAT_RG_NV 0x8881 -#define GL_FLOAT_RGB_NV 0x8882 -#define GL_FLOAT_RGBA_NV 0x8883 -#define GL_FLOAT_R16_NV 0x8884 -#define GL_FLOAT_R32_NV 0x8885 -#define GL_FLOAT_RG16_NV 0x8886 -#define GL_FLOAT_RG32_NV 0x8887 -#define GL_FLOAT_RGB16_NV 0x8888 -#define GL_FLOAT_RGB32_NV 0x8889 -#define GL_FLOAT_RGBA16_NV 0x888A -#define GL_FLOAT_RGBA32_NV 0x888B -#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C -#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D -#define GL_FLOAT_RGBA_MODE_NV 0x888E -#endif -#ifndef GL_NV_fragment_program -#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 -#define GL_FRAGMENT_PROGRAM_NV 0x8870 -#define GL_MAX_TEXTURE_COORDS_NV 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 -#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 -#define GL_PROGRAM_ERROR_STRING_NV 0x8874 -#endif +GLAPI void GLAPIENTRY glLoadTransposeMatrixd( const GLdouble m[16] ); -#ifndef GL_NV_half_float -#define GL_HALF_FLOAT_NV 0x140B -#endif +GLAPI void GLAPIENTRY glLoadTransposeMatrixf( const GLfloat m[16] ); -#ifndef GL_NV_pixel_data_range -#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 -#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 -#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A -#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B -#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C -#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D -#endif +GLAPI void GLAPIENTRY glMultTransposeMatrixd( const GLdouble m[16] ); -#ifndef GL_NV_primitive_restart -#define GL_PRIMITIVE_RESTART_NV 0x8558 -#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 -#endif +GLAPI void GLAPIENTRY glMultTransposeMatrixf( const GLfloat m[16] ); -#ifndef GL_NV_texture_expand_normal -#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F -#endif +GLAPI void GLAPIENTRY glSampleCoverage( GLclampf value, GLboolean invert ); -#ifndef GL_NV_vertex_program2 -#endif -#ifndef GL_ATI_map_object_buffer -#endif +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); -#ifndef GL_ATI_separate_stencil -#define GL_STENCIL_BACK_FUNC_ATI 0x8800 -#define GL_STENCIL_BACK_FAIL_ATI 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 -#endif -#ifndef GL_ATI_vertex_attrib_array_object -#endif -#ifndef GL_OES_read_format -#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B -#endif +/* + * GL_ARB_multitexture (ARB extension 1 and OpenGL 1.2.1) + */ +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 -#ifndef GL_EXT_depth_bounds_test -#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 -#define GL_DEPTH_BOUNDS_EXT 0x8891 -#endif +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 + +GLAPI void GLAPIENTRY glActiveTextureARB(GLenum texture); +GLAPI void GLAPIENTRY glClientActiveTextureARB(GLenum texture); +GLAPI void GLAPIENTRY glMultiTexCoord1dARB(GLenum target, GLdouble s); +GLAPI void GLAPIENTRY glMultiTexCoord1dvARB(GLenum target, const GLdouble *v); +GLAPI void GLAPIENTRY glMultiTexCoord1fARB(GLenum target, GLfloat s); +GLAPI void GLAPIENTRY glMultiTexCoord1fvARB(GLenum target, const GLfloat *v); +GLAPI void GLAPIENTRY glMultiTexCoord1iARB(GLenum target, GLint s); +GLAPI void GLAPIENTRY glMultiTexCoord1ivARB(GLenum target, const GLint *v); +GLAPI void GLAPIENTRY glMultiTexCoord1sARB(GLenum target, GLshort s); +GLAPI void GLAPIENTRY glMultiTexCoord1svARB(GLenum target, const GLshort *v); +GLAPI void GLAPIENTRY glMultiTexCoord2dARB(GLenum target, GLdouble s, GLdouble t); +GLAPI void GLAPIENTRY glMultiTexCoord2dvARB(GLenum target, const GLdouble *v); +GLAPI void GLAPIENTRY glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t); +GLAPI void GLAPIENTRY glMultiTexCoord2fvARB(GLenum target, const GLfloat *v); +GLAPI void GLAPIENTRY glMultiTexCoord2iARB(GLenum target, GLint s, GLint t); +GLAPI void GLAPIENTRY glMultiTexCoord2ivARB(GLenum target, const GLint *v); +GLAPI void GLAPIENTRY glMultiTexCoord2sARB(GLenum target, GLshort s, GLshort t); +GLAPI void GLAPIENTRY glMultiTexCoord2svARB(GLenum target, const GLshort *v); +GLAPI void GLAPIENTRY glMultiTexCoord3dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void GLAPIENTRY glMultiTexCoord3dvARB(GLenum target, const GLdouble *v); +GLAPI void GLAPIENTRY glMultiTexCoord3fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void GLAPIENTRY glMultiTexCoord3fvARB(GLenum target, const GLfloat *v); +GLAPI void GLAPIENTRY glMultiTexCoord3iARB(GLenum target, GLint s, GLint t, GLint r); +GLAPI void GLAPIENTRY glMultiTexCoord3ivARB(GLenum target, const GLint *v); +GLAPI void GLAPIENTRY glMultiTexCoord3sARB(GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void GLAPIENTRY glMultiTexCoord3svARB(GLenum target, const GLshort *v); +GLAPI void GLAPIENTRY glMultiTexCoord4dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void GLAPIENTRY glMultiTexCoord4dvARB(GLenum target, const GLdouble *v); +GLAPI void GLAPIENTRY glMultiTexCoord4fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void GLAPIENTRY glMultiTexCoord4fvARB(GLenum target, const GLfloat *v); +GLAPI void GLAPIENTRY glMultiTexCoord4iARB(GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void GLAPIENTRY glMultiTexCoord4ivARB(GLenum target, const GLint *v); +GLAPI void GLAPIENTRY glMultiTexCoord4sARB(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void GLAPIENTRY glMultiTexCoord4svARB(GLenum target, const GLshort *v); -#ifndef GL_EXT_texture_mirror_clamp -#define GL_MIRROR_CLAMP_EXT 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 -#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 -#endif +typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); -#ifndef GL_EXT_blend_equation_separate -#define GL_BLEND_EQUATION_RGB_EXT 0x8009 -#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D -#endif +#endif /* GL_ARB_multitexture */ -#ifndef GL_MESA_pack_invert -#define GL_PACK_INVERT_MESA 0x8758 -#endif -#ifndef GL_MESA_ycbcr_texture -#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB -#define GL_YCBCR_MESA 0x8757 -#endif -#ifndef GL_EXT_pixel_buffer_object -#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF -#endif +/* + * Define this token if you want "old-style" header file behaviour (extensions + * defined in gl.h). Otherwise, extensions will be included from glext.h. + */ +#if !defined(NO_SDL_GLEXT) && !defined(GL_GLEXT_LEGACY) +#include "SDL_opengl_glext.h" +#endif /* GL_GLEXT_LEGACY */ -#ifndef GL_NV_fragment_program_option -#endif -#ifndef GL_NV_fragment_program2 -#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 -#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 -#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 -#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 -#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 -#endif -#ifndef GL_NV_vertex_program2_option -/* reuse GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */ -/* reuse GL_MAX_PROGRAM_CALL_DEPTH_NV */ -#endif +/* + * ???. GL_MESA_packed_depth_stencil + * XXX obsolete + */ +#ifndef GL_MESA_packed_depth_stencil +#define GL_MESA_packed_depth_stencil 1 -#ifndef GL_NV_vertex_program3 -/* reuse GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */ -#endif +#define GL_DEPTH_STENCIL_MESA 0x8750 +#define GL_UNSIGNED_INT_24_8_MESA 0x8751 +#define GL_UNSIGNED_INT_8_24_REV_MESA 0x8752 +#define GL_UNSIGNED_SHORT_15_1_MESA 0x8753 +#define GL_UNSIGNED_SHORT_1_15_REV_MESA 0x8754 -#ifndef GL_EXT_framebuffer_object -#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 -#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 -#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 -#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF -#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 -#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 -#define GL_FRAMEBUFFER_EXT 0x8D40 -#define GL_RENDERBUFFER_EXT 0x8D41 -#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 -#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 -#define GL_STENCIL_INDEX1_EXT 0x8D46 -#define GL_STENCIL_INDEX4_EXT 0x8D47 -#define GL_STENCIL_INDEX8_EXT 0x8D48 -#define GL_STENCIL_INDEX16_EXT 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 -#endif +#endif /* GL_MESA_packed_depth_stencil */ -#ifndef GL_GREMEDY_string_marker -#endif -#ifndef GL_EXT_packed_depth_stencil -#define GL_DEPTH_STENCIL_EXT 0x84F9 -#define GL_UNSIGNED_INT_24_8_EXT 0x84FA -#define GL_DEPTH24_STENCIL8_EXT 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 -#endif +#ifndef GL_ATI_blend_equation_separate +#define GL_ATI_blend_equation_separate 1 -#ifndef GL_EXT_stencil_clear_tag -#define GL_STENCIL_TAG_BITS_EXT 0x88F2 -#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 -#endif +#define GL_ALPHA_BLEND_EQUATION_ATI 0x883D -#ifndef GL_EXT_texture_sRGB -#define GL_SRGB_EXT 0x8C40 -#define GL_SRGB8_EXT 0x8C41 -#define GL_SRGB_ALPHA_EXT 0x8C42 -#define GL_SRGB8_ALPHA8_EXT 0x8C43 -#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 -#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 -#define GL_SLUMINANCE_EXT 0x8C46 -#define GL_SLUMINANCE8_EXT 0x8C47 -#define GL_COMPRESSED_SRGB_EXT 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 -#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B -#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F -#endif +GLAPI void GLAPIENTRY glBlendEquationSeparateATI( GLenum modeRGB, GLenum modeA ); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEATIPROC) (GLenum modeRGB, GLenum modeA); -#ifndef GL_EXT_framebuffer_blit -#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_EXT GL_FRAMEBUFFER_BINDING_EXT -#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA -#endif +#endif /* GL_ATI_blend_equation_separate */ -#ifndef GL_EXT_framebuffer_multisample -#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 -#define GL_MAX_SAMPLES_EXT 0x8D57 -#endif -#ifndef GL_MESAX_texture_stack -#define GL_TEXTURE_1D_STACK_MESAX 0x8759 -#define GL_TEXTURE_2D_STACK_MESAX 0x875A -#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B -#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C -#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D -#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E +/* GL_OES_EGL_image */ +#ifndef GL_OES_EGL_image +typedef void* GLeglImageOES; #endif -#ifndef GL_EXT_timer_query -#define GL_TIME_ELAPSED_EXT 0x88BF +#ifndef GL_OES_EGL_image +#define GL_OES_EGL_image 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image); +GLAPI void APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image); #endif - -#ifndef GL_EXT_gpu_program_parameters +typedef void (APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image); +typedef void (APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image); #endif -#ifndef GL_APPLE_flush_buffer_range -#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 -#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 -#endif -#ifndef GL_NV_gpu_program4 -#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 -#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 -#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 -#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 -#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 -#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 -#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 -#endif +/** + ** NOTE!!!!! If you add new functions to this file, or update + ** glext.h be sure to regenerate the gl_mangle.h file. See comments + ** in that file for details. + **/ -#ifndef GL_NV_geometry_program4 -#define GL_LINES_ADJACENCY_EXT 0x000A -#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B -#define GL_TRIANGLES_ADJACENCY_EXT 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D -#define GL_GEOMETRY_PROGRAM_NV 0x8C26 -#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 -#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 -#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 -#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 -#endif -#ifndef GL_EXT_geometry_shader4 -#define GL_GEOMETRY_SHADER_EXT 0x8DD9 -/* reuse GL_GEOMETRY_VERTICES_OUT_EXT */ -/* reuse GL_GEOMETRY_INPUT_TYPE_EXT */ -/* reuse GL_GEOMETRY_OUTPUT_TYPE_EXT */ -/* reuse GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT */ -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE -#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 -/* reuse GL_LINES_ADJACENCY_EXT */ -/* reuse GL_LINE_STRIP_ADJACENCY_EXT */ -/* reuse GL_TRIANGLES_ADJACENCY_EXT */ -/* reuse GL_TRIANGLE_STRIP_ADJACENCY_EXT */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT */ -/* reuse GL_PROGRAM_POINT_SIZE_EXT */ -#endif -#ifndef GL_NV_vertex_program4 -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD +/********************************************************************** + * Begin system-specific stuff + */ +#if defined(PRAGMA_EXPORT_SUPPORTED) +#pragma export off #endif -#ifndef GL_EXT_gpu_shader4 -#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 -#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 -#define GL_SAMPLER_BUFFER_EXT 0x8DC2 -#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 -#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 -#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 -#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 -#define GL_INT_SAMPLER_1D_EXT 0x8DC9 -#define GL_INT_SAMPLER_2D_EXT 0x8DCA -#define GL_INT_SAMPLER_3D_EXT 0x8DCB -#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC -#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD -#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF -#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 -#endif +/* + * End system-specific stuff + **********************************************************************/ -#ifndef GL_EXT_draw_instanced -#endif -#ifndef GL_EXT_packed_float -#define GL_R11F_G11F_B10F_EXT 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B -#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C +#ifdef __cplusplus +} #endif -#ifndef GL_EXT_texture_array -#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 -#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D -#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF -#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT */ -#endif - -#ifndef GL_EXT_texture_buffer_object -#define GL_TEXTURE_BUFFER_EXT 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E -#endif - -#ifndef GL_EXT_texture_compression_latc -#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 -#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 -#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 -#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 -#endif - -#ifndef GL_EXT_texture_compression_rgtc -#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC -#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD -#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE -#endif - -#ifndef GL_EXT_texture_shared_exponent -#define GL_RGB9_E5_EXT 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E -#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F -#endif - -#ifndef GL_NV_depth_buffer_float -#define GL_DEPTH_COMPONENT32F_NV 0x8DAB -#define GL_DEPTH32F_STENCIL8_NV 0x8DAC -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD -#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF -#endif - -#ifndef GL_NV_fragment_program4 -#endif - -#ifndef GL_NV_framebuffer_multisample_coverage -#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB -#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 -#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 -#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 -#endif - -#ifndef GL_EXT_framebuffer_sRGB -#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 -#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA -#endif - -#ifndef GL_NV_geometry_shader4 -#endif - -#ifndef GL_NV_parameter_buffer_object -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 -#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 -#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 -#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 -#endif - -#ifndef GL_EXT_draw_buffers2 -#endif - -#ifndef GL_NV_transform_feedback -#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 -#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 -#define GL_TEXTURE_COORD_NV 0x8C79 -#define GL_CLIP_DISTANCE_NV 0x8C7A -#define GL_VERTEX_ID_NV 0x8C7B -#define GL_PRIMITIVE_ID_NV 0x8C7C -#define GL_GENERIC_ATTRIB_NV 0x8C7D -#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 -#define GL_ACTIVE_VARYINGS_NV 0x8C81 -#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 -#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 -#define GL_PRIMITIVES_GENERATED_NV 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 -#define GL_RASTERIZER_DISCARD_NV 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_ATTRIBS_NV 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B -#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C -#define GL_SEPARATE_ATTRIBS_NV 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F -#define GL_LAYER_NV 0x8DAA -#define GL_NEXT_BUFFER_NV -2 -#define GL_SKIP_COMPONENTS4_NV -3 -#define GL_SKIP_COMPONENTS3_NV -4 -#define GL_SKIP_COMPONENTS2_NV -5 -#define GL_SKIP_COMPONENTS1_NV -6 -#endif - -#ifndef GL_EXT_bindable_uniform -#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 -#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 -#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 -#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED -#define GL_UNIFORM_BUFFER_EXT 0x8DEE -#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF -#endif - -#ifndef GL_EXT_texture_integer -#define GL_RGBA32UI_EXT 0x8D70 -#define GL_RGB32UI_EXT 0x8D71 -#define GL_ALPHA32UI_EXT 0x8D72 -#define GL_INTENSITY32UI_EXT 0x8D73 -#define GL_LUMINANCE32UI_EXT 0x8D74 -#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 -#define GL_RGBA16UI_EXT 0x8D76 -#define GL_RGB16UI_EXT 0x8D77 -#define GL_ALPHA16UI_EXT 0x8D78 -#define GL_INTENSITY16UI_EXT 0x8D79 -#define GL_LUMINANCE16UI_EXT 0x8D7A -#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B -#define GL_RGBA8UI_EXT 0x8D7C -#define GL_RGB8UI_EXT 0x8D7D -#define GL_ALPHA8UI_EXT 0x8D7E -#define GL_INTENSITY8UI_EXT 0x8D7F -#define GL_LUMINANCE8UI_EXT 0x8D80 -#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 -#define GL_RGBA32I_EXT 0x8D82 -#define GL_RGB32I_EXT 0x8D83 -#define GL_ALPHA32I_EXT 0x8D84 -#define GL_INTENSITY32I_EXT 0x8D85 -#define GL_LUMINANCE32I_EXT 0x8D86 -#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 -#define GL_RGBA16I_EXT 0x8D88 -#define GL_RGB16I_EXT 0x8D89 -#define GL_ALPHA16I_EXT 0x8D8A -#define GL_INTENSITY16I_EXT 0x8D8B -#define GL_LUMINANCE16I_EXT 0x8D8C -#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D -#define GL_RGBA8I_EXT 0x8D8E -#define GL_RGB8I_EXT 0x8D8F -#define GL_ALPHA8I_EXT 0x8D90 -#define GL_INTENSITY8I_EXT 0x8D91 -#define GL_LUMINANCE8I_EXT 0x8D92 -#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 -#define GL_RED_INTEGER_EXT 0x8D94 -#define GL_GREEN_INTEGER_EXT 0x8D95 -#define GL_BLUE_INTEGER_EXT 0x8D96 -#define GL_ALPHA_INTEGER_EXT 0x8D97 -#define GL_RGB_INTEGER_EXT 0x8D98 -#define GL_RGBA_INTEGER_EXT 0x8D99 -#define GL_BGR_INTEGER_EXT 0x8D9A -#define GL_BGRA_INTEGER_EXT 0x8D9B -#define GL_LUMINANCE_INTEGER_EXT 0x8D9C -#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D -#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E -#endif - -#ifndef GL_GREMEDY_frame_terminator -#endif - -#ifndef GL_NV_conditional_render -#define GL_QUERY_WAIT_NV 0x8E13 -#define GL_QUERY_NO_WAIT_NV 0x8E14 -#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 -#endif - -#ifndef GL_NV_present_video -#define GL_FRAME_NV 0x8E26 -#define GL_FIELDS_NV 0x8E27 -#define GL_CURRENT_TIME_NV 0x8E28 -#define GL_NUM_FILL_STREAMS_NV 0x8E29 -#define GL_PRESENT_TIME_NV 0x8E2A -#define GL_PRESENT_DURATION_NV 0x8E2B -#endif - -#ifndef GL_EXT_transform_feedback -#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F -#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C -#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D -#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 -#define GL_RASTERIZER_DISCARD_EXT 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 -#endif - -#ifndef GL_EXT_direct_state_access -#define GL_PROGRAM_MATRIX_EXT 0x8E2D -#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E -#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F -#endif - -#ifndef GL_EXT_vertex_array_bgra -/* reuse GL_BGRA */ -#endif - -#ifndef GL_EXT_texture_swizzle -#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 -#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 -#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 -#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 -#endif - -#ifndef GL_NV_explicit_multisample -#define GL_SAMPLE_POSITION_NV 0x8E50 -#define GL_SAMPLE_MASK_NV 0x8E51 -#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 -#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 -#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 -#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 -#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 -#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 -#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 -#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 -#endif - -#ifndef GL_NV_transform_feedback2 -#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 -#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 -#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 -#endif - -#ifndef GL_ATI_meminfo -#define GL_VBO_FREE_MEMORY_ATI 0x87FB -#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC -#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD -#endif - -#ifndef GL_AMD_performance_monitor -#define GL_COUNTER_TYPE_AMD 0x8BC0 -#define GL_COUNTER_RANGE_AMD 0x8BC1 -#define GL_UNSIGNED_INT64_AMD 0x8BC2 -#define GL_PERCENTAGE_AMD 0x8BC3 -#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 -#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 -#define GL_PERFMON_RESULT_AMD 0x8BC6 -#endif - -#ifndef GL_AMD_texture_texture4 -#endif - -#ifndef GL_AMD_vertex_shader_tesselator -#define GL_SAMPLER_BUFFER_AMD 0x9001 -#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 -#define GL_TESSELLATION_MODE_AMD 0x9004 -#define GL_TESSELLATION_FACTOR_AMD 0x9005 -#define GL_DISCRETE_AMD 0x9006 -#define GL_CONTINUOUS_AMD 0x9007 -#endif - -#ifndef GL_EXT_provoking_vertex -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D -#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E -#define GL_PROVOKING_VERTEX_EXT 0x8E4F -#endif - -#ifndef GL_EXT_texture_snorm -#define GL_ALPHA_SNORM 0x9010 -#define GL_LUMINANCE_SNORM 0x9011 -#define GL_LUMINANCE_ALPHA_SNORM 0x9012 -#define GL_INTENSITY_SNORM 0x9013 -#define GL_ALPHA8_SNORM 0x9014 -#define GL_LUMINANCE8_SNORM 0x9015 -#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 -#define GL_INTENSITY8_SNORM 0x9017 -#define GL_ALPHA16_SNORM 0x9018 -#define GL_LUMINANCE16_SNORM 0x9019 -#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A -#define GL_INTENSITY16_SNORM 0x901B -/* reuse GL_RED_SNORM */ -/* reuse GL_RG_SNORM */ -/* reuse GL_RGB_SNORM */ -/* reuse GL_RGBA_SNORM */ -/* reuse GL_R8_SNORM */ -/* reuse GL_RG8_SNORM */ -/* reuse GL_RGB8_SNORM */ -/* reuse GL_RGBA8_SNORM */ -/* reuse GL_R16_SNORM */ -/* reuse GL_RG16_SNORM */ -/* reuse GL_RGB16_SNORM */ -/* reuse GL_RGBA16_SNORM */ -/* reuse GL_SIGNED_NORMALIZED */ -#endif - -#ifndef GL_AMD_draw_buffers_blend -#endif - -#ifndef GL_APPLE_texture_range -#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 -#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 -#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC -#define GL_STORAGE_PRIVATE_APPLE 0x85BD -/* reuse GL_STORAGE_CACHED_APPLE */ -/* reuse GL_STORAGE_SHARED_APPLE */ -#endif - -#ifndef GL_APPLE_float_pixels -#define GL_HALF_APPLE 0x140B -#define GL_RGBA_FLOAT32_APPLE 0x8814 -#define GL_RGB_FLOAT32_APPLE 0x8815 -#define GL_ALPHA_FLOAT32_APPLE 0x8816 -#define GL_INTENSITY_FLOAT32_APPLE 0x8817 -#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 -#define GL_RGBA_FLOAT16_APPLE 0x881A -#define GL_RGB_FLOAT16_APPLE 0x881B -#define GL_ALPHA_FLOAT16_APPLE 0x881C -#define GL_INTENSITY_FLOAT16_APPLE 0x881D -#define GL_LUMINANCE_FLOAT16_APPLE 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F -#define GL_COLOR_FLOAT_APPLE 0x8A0F -#endif - -#ifndef GL_APPLE_vertex_program_evaluators -#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 -#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 -#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 -#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 -#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 -#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 -#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 -#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 -#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 -#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 -#endif - -#ifndef GL_APPLE_aux_depth_stencil -#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 -#endif - -#ifndef GL_APPLE_object_purgeable -#define GL_BUFFER_OBJECT_APPLE 0x85B3 -#define GL_RELEASED_APPLE 0x8A19 -#define GL_VOLATILE_APPLE 0x8A1A -#define GL_RETAINED_APPLE 0x8A1B -#define GL_UNDEFINED_APPLE 0x8A1C -#define GL_PURGEABLE_APPLE 0x8A1D -#endif - -#ifndef GL_APPLE_row_bytes -#define GL_PACK_ROW_BYTES_APPLE 0x8A15 -#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 -#endif - -#ifndef GL_APPLE_rgb_422 -#define GL_RGB_422_APPLE 0x8A1F -/* reuse GL_UNSIGNED_SHORT_8_8_APPLE */ -/* reuse GL_UNSIGNED_SHORT_8_8_REV_APPLE */ -#endif - -#ifndef GL_NV_video_capture -#define GL_VIDEO_BUFFER_NV 0x9020 -#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 -#define GL_FIELD_UPPER_NV 0x9022 -#define GL_FIELD_LOWER_NV 0x9023 -#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 -#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 -#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 -#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 -#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 -#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 -#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A -#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B -#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C -#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D -#define GL_PARTIAL_SUCCESS_NV 0x902E -#define GL_SUCCESS_NV 0x902F -#define GL_FAILURE_NV 0x9030 -#define GL_YCBYCR8_422_NV 0x9031 -#define GL_YCBAYCR8A_4224_NV 0x9032 -#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 -#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 -#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 -#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 -#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 -#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 -#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 -#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A -#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B -#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C -#endif - -#ifndef GL_NV_copy_image -#endif - -#ifndef GL_EXT_separate_shader_objects -#define GL_ACTIVE_PROGRAM_EXT 0x8B8D -#endif - -#ifndef GL_NV_parameter_buffer_object2 -#endif - -#ifndef GL_NV_shader_buffer_load -#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D -#define GL_GPU_ADDRESS_NV 0x8F34 -#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 -#endif - -#ifndef GL_NV_vertex_buffer_unified_memory -#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E -#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F -#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 -#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 -#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 -#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 -#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 -#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 -#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 -#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 -#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 -#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 -#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A -#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B -#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C -#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D -#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E -#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F -#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 -#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 -#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 -#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 -#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 -#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 -#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 -#endif - -#ifndef GL_NV_texture_barrier -#endif - -#ifndef GL_AMD_shader_stencil_export -#endif - -#ifndef GL_AMD_seamless_cubemap_per_texture -/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS_ARB */ -#endif - -#ifndef GL_AMD_conservative_depth -#endif - -#ifndef GL_EXT_shader_image_load_store -#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 -#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 -#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A -#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B -#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C -#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D -#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E -#define GL_IMAGE_1D_EXT 0x904C -#define GL_IMAGE_2D_EXT 0x904D -#define GL_IMAGE_3D_EXT 0x904E -#define GL_IMAGE_2D_RECT_EXT 0x904F -#define GL_IMAGE_CUBE_EXT 0x9050 -#define GL_IMAGE_BUFFER_EXT 0x9051 -#define GL_IMAGE_1D_ARRAY_EXT 0x9052 -#define GL_IMAGE_2D_ARRAY_EXT 0x9053 -#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 -#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 -#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 -#define GL_INT_IMAGE_1D_EXT 0x9057 -#define GL_INT_IMAGE_2D_EXT 0x9058 -#define GL_INT_IMAGE_3D_EXT 0x9059 -#define GL_INT_IMAGE_2D_RECT_EXT 0x905A -#define GL_INT_IMAGE_CUBE_EXT 0x905B -#define GL_INT_IMAGE_BUFFER_EXT 0x905C -#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D -#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E -#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F -#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 -#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 -#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 -#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 -#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 -#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 -#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 -#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 -#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 -#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C -#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D -#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E -#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 -#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 -#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 -#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 -#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 -#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 -#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 -#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 -#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 -#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 -#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 -#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 -#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF -#endif - -#ifndef GL_EXT_vertex_attrib_64bit -/* reuse GL_DOUBLE */ -#define GL_DOUBLE_VEC2_EXT 0x8FFC -#define GL_DOUBLE_VEC3_EXT 0x8FFD -#define GL_DOUBLE_VEC4_EXT 0x8FFE -#define GL_DOUBLE_MAT2_EXT 0x8F46 -#define GL_DOUBLE_MAT3_EXT 0x8F47 -#define GL_DOUBLE_MAT4_EXT 0x8F48 -#define GL_DOUBLE_MAT2x3_EXT 0x8F49 -#define GL_DOUBLE_MAT2x4_EXT 0x8F4A -#define GL_DOUBLE_MAT3x2_EXT 0x8F4B -#define GL_DOUBLE_MAT3x4_EXT 0x8F4C -#define GL_DOUBLE_MAT4x2_EXT 0x8F4D -#define GL_DOUBLE_MAT4x3_EXT 0x8F4E -#endif - -#ifndef GL_NV_gpu_program5 -#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C -#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D -#define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44 -#define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV 0x8F45 -#endif - -#ifndef GL_NV_gpu_shader5 -#define GL_INT64_NV 0x140E -#define GL_UNSIGNED_INT64_NV 0x140F -#define GL_INT8_NV 0x8FE0 -#define GL_INT8_VEC2_NV 0x8FE1 -#define GL_INT8_VEC3_NV 0x8FE2 -#define GL_INT8_VEC4_NV 0x8FE3 -#define GL_INT16_NV 0x8FE4 -#define GL_INT16_VEC2_NV 0x8FE5 -#define GL_INT16_VEC3_NV 0x8FE6 -#define GL_INT16_VEC4_NV 0x8FE7 -#define GL_INT64_VEC2_NV 0x8FE9 -#define GL_INT64_VEC3_NV 0x8FEA -#define GL_INT64_VEC4_NV 0x8FEB -#define GL_UNSIGNED_INT8_NV 0x8FEC -#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED -#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE -#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF -#define GL_UNSIGNED_INT16_NV 0x8FF0 -#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 -#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 -#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 -#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 -#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 -#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 -#define GL_FLOAT16_NV 0x8FF8 -#define GL_FLOAT16_VEC2_NV 0x8FF9 -#define GL_FLOAT16_VEC3_NV 0x8FFA -#define GL_FLOAT16_VEC4_NV 0x8FFB -/* reuse GL_PATCHES */ -#endif - -#ifndef GL_NV_shader_buffer_store -#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010 -/* reuse GL_READ_WRITE */ -/* reuse GL_WRITE_ONLY */ -#endif - -#ifndef GL_NV_tessellation_program5 -#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 -#define GL_TESS_CONTROL_PROGRAM_NV 0x891E -#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F -#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 -#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 -#endif - -#ifndef GL_NV_vertex_attrib_integer_64bit -/* reuse GL_INT64_NV */ -/* reuse GL_UNSIGNED_INT64_NV */ -#endif - -#ifndef GL_NV_multisample_coverage -#define GL_COVERAGE_SAMPLES_NV 0x80A9 -#define GL_COLOR_SAMPLES_NV 0x8E20 -#endif - -#ifndef GL_AMD_name_gen_delete -#define GL_DATA_BUFFER_AMD 0x9151 -#define GL_PERFORMANCE_MONITOR_AMD 0x9152 -#define GL_QUERY_OBJECT_AMD 0x9153 -#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 -#define GL_SAMPLER_OBJECT_AMD 0x9155 -#endif - -#ifndef GL_AMD_debug_output -#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 -#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 -#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 -#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A -#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B -#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C -#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D -#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E -#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F -#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 -#endif - -#ifndef GL_NV_vdpau_interop -#define GL_SURFACE_STATE_NV 0x86EB -#define GL_SURFACE_REGISTERED_NV 0x86FD -#define GL_SURFACE_MAPPED_NV 0x8700 -#define GL_WRITE_DISCARD_NV 0x88BE -#endif - -#ifndef GL_AMD_transform_feedback3_lines_triangles -#endif - - -/*************************************************************/ - -#include -#ifndef GL_VERSION_2_0 -/* GL type for program/shader text */ -typedef char GLchar; -#endif - -#ifndef GL_VERSION_1_5 -/* GL types for handling large vertex buffer objects */ -#if defined(__APPLE__) -typedef long GLintptr; -typedef long GLsizeiptr; -#else -typedef ptrdiff_t GLintptr; -typedef ptrdiff_t GLsizeiptr; -#endif -#endif - -#ifndef GL_ARB_vertex_buffer_object -/* GL types for handling large vertex buffer objects */ -#if defined(__APPLE__) -typedef long GLintptrARB; -typedef long GLsizeiptrARB; -#else -typedef ptrdiff_t GLintptrARB; -typedef ptrdiff_t GLsizeiptrARB; -#endif -#endif - -#ifndef GL_ARB_shader_objects -/* GL types for program/shader text and shader object handles */ -typedef char GLcharARB; -#if defined(__APPLE__) -typedef void *GLhandleARB; -#else -typedef unsigned int GLhandleARB; -#endif -#endif - -/* GL type for "half" precision (s10e5) float data in host memory */ -#ifndef GL_ARB_half_float_pixel -typedef unsigned short GLhalfARB; -#endif - -#ifndef GL_NV_half_float -typedef unsigned short GLhalfNV; -#endif - -#ifndef GLEXT_64_TYPES_DEFINED -/* This code block is duplicated in glxext.h, so must be protected */ -#define GLEXT_64_TYPES_DEFINED -/* Define int32_t, int64_t, and uint64_t types for UST/MSC */ -/* (as used in the GL_EXT_timer_query extension). */ -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -#include -#elif defined(__sun__) || defined(__digital__) -#include -#if defined(__STDC__) -#if defined(__arch64__) || defined(_LP64) -typedef long int int64_t; -typedef unsigned long int uint64_t; -#else -typedef long long int int64_t; -typedef unsigned long long int uint64_t; -#endif /* __arch64__ */ -#endif /* __STDC__ */ -#elif defined( __VMS ) || defined(__sgi) -#include -#elif defined(__SCO__) || defined(__USLC__) -#include -#elif defined(__UNIXOS2__) || defined(__SOL64__) -typedef long int int32_t; -typedef long long int int64_t; -typedef unsigned long long int uint64_t; -#elif defined(_WIN32) && defined(__GNUC__) -#include -#elif defined(_WIN32) -typedef __int32 int32_t; -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -#else -/* Fallback if nothing above works */ -#include -#endif -#endif - -#ifndef GL_EXT_timer_query -typedef int64_t GLint64EXT; -typedef uint64_t GLuint64EXT; -#endif - -#ifndef GL_ARB_sync -typedef int64_t GLint64; -typedef uint64_t GLuint64; -typedef struct __GLsync *GLsync; -#endif - -#ifndef GL_ARB_cl_event -/* These incomplete types let us declare types compatible with OpenCL's cl_context and cl_event */ -struct _cl_context; -struct _cl_event; -#endif - -#ifndef GL_ARB_debug_output -typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam); -#endif - -#ifndef GL_AMD_debug_output -typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam); -#endif - -#ifndef GL_NV_vdpau_interop -typedef GLintptr GLvdpauSurfaceNV; -#endif - -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -GLAPI void APIENTRY glBlendEquation (GLenum mode); -GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_VERSION_1_2_DEPRECATED -#define GL_VERSION_1_2_DEPRECATED 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -GLAPI void APIENTRY glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glGetColorTable (GLenum target, GLenum format, GLenum type, GLvoid *table); -GLAPI void APIENTRY glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -GLAPI void APIENTRY glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -GLAPI void APIENTRY glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -GLAPI void APIENTRY glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params); -GLAPI void APIENTRY glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glConvolutionParameteri (GLenum target, GLenum pname, GLint params); -GLAPI void APIENTRY glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, GLvoid *image); -GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSeparableFilter (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -GLAPI void APIENTRY glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -GLAPI void APIENTRY glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -GLAPI void APIENTRY glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -GLAPI void APIENTRY glMinmax (GLenum target, GLenum internalformat, GLboolean sink); -GLAPI void APIENTRY glResetHistogram (GLenum target); -GLAPI void APIENTRY glResetMinmax (GLenum target); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); -typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); -#endif - -#ifndef GL_VERSION_1_3 -#define GL_VERSION_1_3 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveTexture (GLenum texture); -GLAPI void APIENTRY glSampleCoverage (GLclampf value, GLboolean invert); -GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, GLvoid *img); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); -#endif - -#ifndef GL_VERSION_1_3_DEPRECATED -#define GL_VERSION_1_3_DEPRECATED 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClientActiveTexture (GLenum texture); -GLAPI void APIENTRY glMultiTexCoord1d (GLenum target, GLdouble s); -GLAPI void APIENTRY glMultiTexCoord1dv (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord1f (GLenum target, GLfloat s); -GLAPI void APIENTRY glMultiTexCoord1fv (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord1i (GLenum target, GLint s); -GLAPI void APIENTRY glMultiTexCoord1iv (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord1s (GLenum target, GLshort s); -GLAPI void APIENTRY glMultiTexCoord1sv (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t); -GLAPI void APIENTRY glMultiTexCoord2dv (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t); -GLAPI void APIENTRY glMultiTexCoord2fv (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord2i (GLenum target, GLint s, GLint t); -GLAPI void APIENTRY glMultiTexCoord2iv (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord2s (GLenum target, GLshort s, GLshort t); -GLAPI void APIENTRY glMultiTexCoord2sv (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r); -GLAPI void APIENTRY glMultiTexCoord3dv (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r); -GLAPI void APIENTRY glMultiTexCoord3fv (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r); -GLAPI void APIENTRY glMultiTexCoord3iv (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r); -GLAPI void APIENTRY glMultiTexCoord3sv (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -GLAPI void APIENTRY glMultiTexCoord4dv (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -GLAPI void APIENTRY glMultiTexCoord4fv (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q); -GLAPI void APIENTRY glMultiTexCoord4iv (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -GLAPI void APIENTRY glMultiTexCoord4sv (GLenum target, const GLshort *v); -GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *m); -GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *m); -GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *m); -GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *m); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); -#endif - -#ifndef GL_VERSION_1_4 -#define GL_VERSION_1_4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param); -GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); -#endif - -#ifndef GL_VERSION_1_4_DEPRECATED -#define GL_VERSION_1_4_DEPRECATED 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFogCoordf (GLfloat coord); -GLAPI void APIENTRY glFogCoordfv (const GLfloat *coord); -GLAPI void APIENTRY glFogCoordd (GLdouble coord); -GLAPI void APIENTRY glFogCoorddv (const GLdouble *coord); -GLAPI void APIENTRY glFogCoordPointer (GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue); -GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *v); -GLAPI void APIENTRY glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue); -GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *v); -GLAPI void APIENTRY glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue); -GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *v); -GLAPI void APIENTRY glSecondaryColor3i (GLint red, GLint green, GLint blue); -GLAPI void APIENTRY glSecondaryColor3iv (const GLint *v); -GLAPI void APIENTRY glSecondaryColor3s (GLshort red, GLshort green, GLshort blue); -GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *v); -GLAPI void APIENTRY glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue); -GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *v); -GLAPI void APIENTRY glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue); -GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *v); -GLAPI void APIENTRY glSecondaryColor3us (GLushort red, GLushort green, GLushort blue); -GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *v); -GLAPI void APIENTRY glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glWindowPos2d (GLdouble x, GLdouble y); -GLAPI void APIENTRY glWindowPos2dv (const GLdouble *v); -GLAPI void APIENTRY glWindowPos2f (GLfloat x, GLfloat y); -GLAPI void APIENTRY glWindowPos2fv (const GLfloat *v); -GLAPI void APIENTRY glWindowPos2i (GLint x, GLint y); -GLAPI void APIENTRY glWindowPos2iv (const GLint *v); -GLAPI void APIENTRY glWindowPos2s (GLshort x, GLshort y); -GLAPI void APIENTRY glWindowPos2sv (const GLshort *v); -GLAPI void APIENTRY glWindowPos3d (GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glWindowPos3dv (const GLdouble *v); -GLAPI void APIENTRY glWindowPos3f (GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glWindowPos3fv (const GLfloat *v); -GLAPI void APIENTRY glWindowPos3i (GLint x, GLint y, GLint z); -GLAPI void APIENTRY glWindowPos3iv (const GLint *v); -GLAPI void APIENTRY glWindowPos3s (GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glWindowPos3sv (const GLshort *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); -typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); -typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); -typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); -#endif - -#ifndef GL_VERSION_1_5 -#define GL_VERSION_1_5 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids); -GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); -GLAPI GLboolean APIENTRY glIsQuery (GLuint id); -GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id); -GLAPI void APIENTRY glEndQuery (GLenum target); -GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); -GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); -GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); -GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); -GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer); -GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); -GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); -GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); -GLAPI GLvoid* APIENTRY glMapBuffer (GLenum target, GLenum access); -GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target); -GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, GLvoid* *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); -typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); -typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); -typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); -typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params); -#endif - -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); -GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); -GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); -GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); -GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); -GLAPI void APIENTRY glCompileShader (GLuint shader); -GLAPI GLuint APIENTRY glCreateProgram (void); -GLAPI GLuint APIENTRY glCreateShader (GLenum type); -GLAPI void APIENTRY glDeleteProgram (GLuint program); -GLAPI void APIENTRY glDeleteShader (GLuint shader); -GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); -GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); -GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); -GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); -GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); -GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); -GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, GLvoid* *pointer); -GLAPI GLboolean APIENTRY glIsProgram (GLuint program); -GLAPI GLboolean APIENTRY glIsShader (GLuint shader); -GLAPI void APIENTRY glLinkProgram (GLuint program); -GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); -GLAPI void APIENTRY glUseProgram (GLuint program); -GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0); -GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); -GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glValidateProgram (GLuint program); -GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); -GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x); -GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); -typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); -typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); -typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); -typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); -typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); -typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); -typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); -typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); -typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); -typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); -typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); -typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); -typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_VERSION_2_1 -#define GL_VERSION_2_1 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif - -#ifndef GL_VERSION_3_0 -#define GL_VERSION_3_0 1 -/* OpenGL 3.0 also reuses entry points from these extensions: */ -/* ARB_framebuffer_object */ -/* ARB_map_buffer_range */ -/* ARB_vertex_array_object */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data); -GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); -GLAPI void APIENTRY glEnablei (GLenum target, GLuint index); -GLAPI void APIENTRY glDisablei (GLenum target, GLuint index); -GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index); -GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode); -GLAPI void APIENTRY glEndTransformFeedback (void); -GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); -GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); -GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp); -GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode); -GLAPI void APIENTRY glEndConditionalRender (void); -GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); -GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x); -GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y); -GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z); -GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x); -GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y); -GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z); -GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); -GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name); -GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0); -GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); -GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); -GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); -GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -GLAPI const GLubyte * APIENTRY glGetStringi (GLenum name, GLuint index); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); -typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); -typedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index); -typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); -typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); -typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); -typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); -#endif - -#ifndef GL_VERSION_3_1 -#define GL_VERSION_3_1 1 -/* OpenGL 3.1 also reuses entry points from these extensions: */ -/* ARB_copy_buffer */ -/* ARB_uniform_buffer_object */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index); -#endif - -#ifndef GL_VERSION_3_2 -#define GL_VERSION_3_2 1 -/* OpenGL 3.2 also reuses entry points from these extensions: */ -/* ARB_draw_elements_base_vertex */ -/* ARB_provoking_vertex */ -/* ARB_sync */ -/* ARB_texture_multisample */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); -GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); -GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -#endif - -#ifndef GL_VERSION_3_3 -#define GL_VERSION_3_3 1 -/* OpenGL 3.3 also reuses entry points from these extensions: */ -/* ARB_blend_func_extended */ -/* ARB_sampler_objects */ -/* ARB_explicit_attrib_location, but it has none */ -/* ARB_occlusion_query2 (no entry points) */ -/* ARB_shader_bit_encoding (no entry points) */ -/* ARB_texture_rgb10_a2ui (no entry points) */ -/* ARB_texture_swizzle (no entry points) */ -/* ARB_timer_query */ -/* ARB_vertex_type_2_10_10_10_rev */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); -#endif - -#ifndef GL_VERSION_4_0 -#define GL_VERSION_4_0 1 -/* OpenGL 4.0 also reuses entry points from these extensions: */ -/* ARB_texture_query_lod (no entry points) */ -/* ARB_draw_indirect */ -/* ARB_gpu_shader5 (no entry points) */ -/* ARB_gpu_shader_fp64 */ -/* ARB_shader_subroutine */ -/* ARB_tessellation_shader */ -/* ARB_texture_buffer_object_rgb32 (no entry points) */ -/* ARB_texture_cube_map_array (no entry points) */ -/* ARB_texture_gather (no entry points) */ -/* ARB_transform_feedback2 */ -/* ARB_transform_feedback3 */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMinSampleShading (GLclampf value); -GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode); -GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst); -GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLclampf value); -typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif - -#ifndef GL_VERSION_4_1 -#define GL_VERSION_4_1 1 -/* OpenGL 4.1 also reuses entry points from these extensions: */ -/* ARB_ES2_compatibility */ -/* ARB_get_program_binary */ -/* ARB_separate_shader_objects */ -/* ARB_shader_precision (no entry points) */ -/* ARB_vertex_attrib_64bit */ -/* ARB_viewport_array */ -#endif - -#ifndef GL_ARB_multitexture -#define GL_ARB_multitexture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveTextureARB (GLenum texture); -GLAPI void APIENTRY glClientActiveTextureARB (GLenum texture); -GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum target, GLdouble s); -GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum target, GLfloat s); -GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum target, GLint s); -GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum target, GLshort s); -GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t); -GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t); -GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum target, GLint s, GLint t); -GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t); -GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r); -GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r); -GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r); -GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r); -GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q); -GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum target, const GLshort *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); -#endif - -#ifndef GL_ARB_transpose_matrix -#define GL_ARB_transpose_matrix 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *m); -GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *m); -GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *m); -GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *m); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -#endif - -#ifndef GL_ARB_multisample -#define GL_ARB_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleCoverageARB (GLclampf value, GLboolean invert); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); -#endif - -#ifndef GL_ARB_texture_env_add -#define GL_ARB_texture_env_add 1 -#endif - -#ifndef GL_ARB_texture_cube_map -#define GL_ARB_texture_cube_map 1 -#endif - -#ifndef GL_ARB_texture_compression -#define GL_ARB_texture_compression 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum target, GLint level, GLvoid *img); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid *img); -#endif - -#ifndef GL_ARB_texture_border_clamp -#define GL_ARB_texture_border_clamp 1 -#endif - -#ifndef GL_ARB_point_parameters -#define GL_ARB_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfARB (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPointParameterfvARB (GLenum pname, const GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_ARB_vertex_blend -#define GL_ARB_vertex_blend 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWeightbvARB (GLint size, const GLbyte *weights); -GLAPI void APIENTRY glWeightsvARB (GLint size, const GLshort *weights); -GLAPI void APIENTRY glWeightivARB (GLint size, const GLint *weights); -GLAPI void APIENTRY glWeightfvARB (GLint size, const GLfloat *weights); -GLAPI void APIENTRY glWeightdvARB (GLint size, const GLdouble *weights); -GLAPI void APIENTRY glWeightubvARB (GLint size, const GLubyte *weights); -GLAPI void APIENTRY glWeightusvARB (GLint size, const GLushort *weights); -GLAPI void APIENTRY glWeightuivARB (GLint size, const GLuint *weights); -GLAPI void APIENTRY glWeightPointerARB (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glVertexBlendARB (GLint count); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); -typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); -typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); -typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); -typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); -typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); -typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); -typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); -typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); -#endif - -#ifndef GL_ARB_matrix_palette -#define GL_ARB_matrix_palette 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint index); -GLAPI void APIENTRY glMatrixIndexubvARB (GLint size, const GLubyte *indices); -GLAPI void APIENTRY glMatrixIndexusvARB (GLint size, const GLushort *indices); -GLAPI void APIENTRY glMatrixIndexuivARB (GLint size, const GLuint *indices); -GLAPI void APIENTRY glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); -typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_ARB_texture_env_combine -#define GL_ARB_texture_env_combine 1 -#endif - -#ifndef GL_ARB_texture_env_crossbar -#define GL_ARB_texture_env_crossbar 1 -#endif - -#ifndef GL_ARB_texture_env_dot3 -#define GL_ARB_texture_env_dot3 1 -#endif - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_ARB_texture_mirrored_repeat 1 -#endif - -#ifndef GL_ARB_depth_texture -#define GL_ARB_depth_texture 1 -#endif - -#ifndef GL_ARB_shadow -#define GL_ARB_shadow 1 -#endif - -#ifndef GL_ARB_shadow_ambient -#define GL_ARB_shadow_ambient 1 -#endif - -#ifndef GL_ARB_window_pos -#define GL_ARB_window_pos 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWindowPos2dARB (GLdouble x, GLdouble y); -GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *v); -GLAPI void APIENTRY glWindowPos2fARB (GLfloat x, GLfloat y); -GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *v); -GLAPI void APIENTRY glWindowPos2iARB (GLint x, GLint y); -GLAPI void APIENTRY glWindowPos2ivARB (const GLint *v); -GLAPI void APIENTRY glWindowPos2sARB (GLshort x, GLshort y); -GLAPI void APIENTRY glWindowPos2svARB (const GLshort *v); -GLAPI void APIENTRY glWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *v); -GLAPI void APIENTRY glWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *v); -GLAPI void APIENTRY glWindowPos3iARB (GLint x, GLint y, GLint z); -GLAPI void APIENTRY glWindowPos3ivARB (const GLint *v); -GLAPI void APIENTRY glWindowPos3sARB (GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glWindowPos3svARB (const GLshort *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); -#endif - -#ifndef GL_ARB_vertex_program -#define GL_ARB_vertex_program 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttrib1dARB (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib1fARB (GLuint index, GLfloat x); -GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib1sARB (GLuint index, GLshort x); -GLAPI void APIENTRY glVertexAttrib1svARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib2sARB (GLuint index, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexAttrib2svARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexAttrib3svARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexAttrib4svARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint index); -GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint index); -GLAPI void APIENTRY glProgramStringARB (GLenum target, GLenum format, GLsizei len, const GLvoid *string); -GLAPI void APIENTRY glBindProgramARB (GLenum target, GLuint program); -GLAPI void APIENTRY glDeleteProgramsARB (GLsizei n, const GLuint *programs); -GLAPI void APIENTRY glGenProgramsARB (GLsizei n, GLuint *programs); -GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); -GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); -GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); -GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); -GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble *params); -GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat *params); -GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble *params); -GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat *params); -GLAPI void APIENTRY glGetProgramivARB (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetProgramStringARB (GLenum target, GLenum pname, GLvoid *string); -GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint index, GLenum pname, GLvoid* *pointer); -GLAPI GLboolean APIENTRY glIsProgramARB (GLuint program); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); -typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); -typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); -#endif - -#ifndef GL_ARB_fragment_program -#define GL_ARB_fragment_program 1 -/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ -#endif - -#ifndef GL_ARB_vertex_buffer_object -#define GL_ARB_vertex_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindBufferARB (GLenum target, GLuint buffer); -GLAPI void APIENTRY glDeleteBuffersARB (GLsizei n, const GLuint *buffers); -GLAPI void APIENTRY glGenBuffersARB (GLsizei n, GLuint *buffers); -GLAPI GLboolean APIENTRY glIsBufferARB (GLuint buffer); -GLAPI void APIENTRY glBufferDataARB (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); -GLAPI void APIENTRY glBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); -GLAPI void APIENTRY glGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); -GLAPI GLvoid* APIENTRY glMapBufferARB (GLenum target, GLenum access); -GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum target); -GLAPI void APIENTRY glGetBufferParameterivARB (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetBufferPointervARB (GLenum target, GLenum pname, GLvoid* *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); -typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); -typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); -typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); -typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params); -#endif - -#ifndef GL_ARB_occlusion_query -#define GL_ARB_occlusion_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenQueriesARB (GLsizei n, GLuint *ids); -GLAPI void APIENTRY glDeleteQueriesARB (GLsizei n, const GLuint *ids); -GLAPI GLboolean APIENTRY glIsQueryARB (GLuint id); -GLAPI void APIENTRY glBeginQueryARB (GLenum target, GLuint id); -GLAPI void APIENTRY glEndQueryARB (GLenum target); -GLAPI void APIENTRY glGetQueryivARB (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectivARB (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); -#endif - -#ifndef GL_ARB_shader_objects -#define GL_ARB_shader_objects 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB obj); -GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum pname); -GLAPI void APIENTRY glDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj); -GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum shaderType); -GLAPI void APIENTRY glShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); -GLAPI void APIENTRY glCompileShaderARB (GLhandleARB shaderObj); -GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); -GLAPI void APIENTRY glAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj); -GLAPI void APIENTRY glLinkProgramARB (GLhandleARB programObj); -GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB programObj); -GLAPI void APIENTRY glValidateProgramARB (GLhandleARB programObj); -GLAPI void APIENTRY glUniform1fARB (GLint location, GLfloat v0); -GLAPI void APIENTRY glUniform2fARB (GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glUniform1iARB (GLint location, GLint v0); -GLAPI void APIENTRY glUniform2iARB (GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glUniform1fvARB (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform2fvARB (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform3fvARB (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform4fvARB (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform1ivARB (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform2ivARB (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform3ivARB (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform4ivARB (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); -GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); -GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name); -GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params); -GLAPI void APIENTRY glGetUniformivARB (GLhandleARB programObj, GLint location, GLint *params); -GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); -typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); -typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); -typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); -typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); -typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); -typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); -typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); -typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); -typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); -typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); -typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); -typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); -typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); -#endif - -#ifndef GL_ARB_vertex_shader -#define GL_ARB_vertex_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name); -GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); -typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -#endif - -#ifndef GL_ARB_fragment_shader -#define GL_ARB_fragment_shader 1 -#endif - -#ifndef GL_ARB_shading_language_100 -#define GL_ARB_shading_language_100 1 -#endif - -#ifndef GL_ARB_texture_non_power_of_two -#define GL_ARB_texture_non_power_of_two 1 -#endif - -#ifndef GL_ARB_point_sprite -#define GL_ARB_point_sprite 1 -#endif - -#ifndef GL_ARB_fragment_program_shadow -#define GL_ARB_fragment_program_shadow 1 -#endif - -#ifndef GL_ARB_draw_buffers -#define GL_ARB_draw_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawBuffersARB (GLsizei n, const GLenum *bufs); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); -#endif - -#ifndef GL_ARB_texture_rectangle -#define GL_ARB_texture_rectangle 1 -#endif - -#ifndef GL_ARB_color_buffer_float -#define GL_ARB_color_buffer_float 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClampColorARB (GLenum target, GLenum clamp); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); -#endif - -#ifndef GL_ARB_half_float_pixel -#define GL_ARB_half_float_pixel 1 -#endif - -#ifndef GL_ARB_texture_float -#define GL_ARB_texture_float 1 -#endif - -#ifndef GL_ARB_pixel_buffer_object -#define GL_ARB_pixel_buffer_object 1 -#endif - -#ifndef GL_ARB_depth_buffer_float -#define GL_ARB_depth_buffer_float 1 -#endif - -#ifndef GL_ARB_draw_instanced -#define GL_ARB_draw_instanced 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -GLAPI void APIENTRY glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -#endif - -#ifndef GL_ARB_framebuffer_object -#define GL_ARB_framebuffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer); -GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); -GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); -GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer); -GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); -GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); -GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); -GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target); -GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); -GLAPI void APIENTRY glGenerateMipmap (GLenum target); -GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); -typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); -typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); -typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); -typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); -typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); -typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -#endif - -#ifndef GL_ARB_framebuffer_sRGB -#define GL_ARB_framebuffer_sRGB 1 -#endif - -#ifndef GL_ARB_geometry_shader4 -#define GL_ARB_geometry_shader4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramParameteriARB (GLuint program, GLenum pname, GLint value); -GLAPI void APIENTRY glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void APIENTRY glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#endif - -#ifndef GL_ARB_half_float_vertex -#define GL_ARB_half_float_vertex 1 -#endif - -#ifndef GL_ARB_instanced_arrays -#define GL_ARB_instanced_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribDivisorARB (GLuint index, GLuint divisor); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); -#endif - -#ifndef GL_ARB_map_buffer_range -#define GL_ARB_map_buffer_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLvoid* APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -#endif - -#ifndef GL_ARB_texture_buffer_object -#define GL_ARB_texture_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); -#endif - -#ifndef GL_ARB_texture_compression_rgtc -#define GL_ARB_texture_compression_rgtc 1 -#endif - -#ifndef GL_ARB_texture_rg -#define GL_ARB_texture_rg 1 -#endif - -#ifndef GL_ARB_vertex_array_object -#define GL_ARB_vertex_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindVertexArray (GLuint array); -GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); -GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); -GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); -typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); -typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); -typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); -#endif - -#ifndef GL_ARB_uniform_buffer_object -#define GL_ARB_uniform_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar* *uniformNames, GLuint *uniformIndices); -GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); -GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); -GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); -GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* *uniformNames, GLuint *uniformIndices); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); -typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); -typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -#endif - -#ifndef GL_ARB_compatibility -#define GL_ARB_compatibility 1 -#endif - -#ifndef GL_ARB_copy_buffer -#define GL_ARB_copy_buffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -#endif - -#ifndef GL_ARB_shader_texture_lod -#define GL_ARB_shader_texture_lod 1 -#endif - -#ifndef GL_ARB_depth_clamp -#define GL_ARB_depth_clamp 1 -#endif - -#ifndef GL_ARB_draw_elements_base_vertex -#define GL_ARB_draw_elements_base_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); -GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); -GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex); -GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount, const GLint *basevertex); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount, const GLint *basevertex); -#endif - -#ifndef GL_ARB_fragment_coord_conventions -#define GL_ARB_fragment_coord_conventions 1 -#endif - -#ifndef GL_ARB_provoking_vertex -#define GL_ARB_provoking_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProvokingVertex (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode); -#endif - -#ifndef GL_ARB_seamless_cube_map -#define GL_ARB_seamless_cube_map 1 -#endif - -#ifndef GL_ARB_sync -#define GL_ARB_sync 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags); -GLAPI GLboolean APIENTRY glIsSync (GLsync sync); -GLAPI void APIENTRY glDeleteSync (GLsync sync); -GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); -GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); -GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *params); -GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); -typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync); -typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); -typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -#endif - -#ifndef GL_ARB_texture_multisample -#define GL_ARB_texture_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); -GLAPI void APIENTRY glSampleMaski (GLuint index, GLbitfield mask); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); -typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); -#endif - -#ifndef GL_ARB_vertex_array_bgra -#define GL_ARB_vertex_array_bgra 1 -#endif - -#ifndef GL_ARB_draw_buffers_blend -#define GL_ARB_draw_buffers_blend 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode); -GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst); -GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif - -#ifndef GL_ARB_sample_shading -#define GL_ARB_sample_shading 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMinSampleShadingARB (GLclampf value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value); -#endif - -#ifndef GL_ARB_texture_cube_map_array -#define GL_ARB_texture_cube_map_array 1 -#endif - -#ifndef GL_ARB_texture_gather -#define GL_ARB_texture_gather 1 -#endif - -#ifndef GL_ARB_texture_query_lod -#define GL_ARB_texture_query_lod 1 -#endif - -#ifndef GL_ARB_shading_language_include -#define GL_ARB_shading_language_include 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); -GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name); -GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar* *path, const GLint *length); -GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name); -GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); -GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); -typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); -typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* *path, const GLint *length); -typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); -typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); -typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); -#endif - -#ifndef GL_ARB_texture_compression_bptc -#define GL_ARB_texture_compression_bptc 1 -#endif - -#ifndef GL_ARB_blend_func_extended -#define GL_ARB_blend_func_extended 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); -GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); -#endif - -#ifndef GL_ARB_explicit_attrib_location -#define GL_ARB_explicit_attrib_location 1 -#endif - -#ifndef GL_ARB_occlusion_query2 -#define GL_ARB_occlusion_query2 1 -#endif - -#ifndef GL_ARB_sampler_objects -#define GL_ARB_sampler_objects 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); -GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); -GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler); -GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); -GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); -GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); -GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); -GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); -GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param); -GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param); -GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); -typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); -typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); -typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); -#endif - -#ifndef GL_ARB_texture_rgb10_a2ui -#define GL_ARB_texture_rgb10_a2ui 1 -#endif - -#ifndef GL_ARB_texture_swizzle -#define GL_ARB_texture_swizzle 1 -#endif - -#ifndef GL_ARB_timer_query -#define GL_ARB_timer_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target); -GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params); -GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params); -#endif - -#ifndef GL_ARB_vertex_type_2_10_10_10_rev -#define GL_ARB_vertex_type_2_10_10_10_rev 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value); -GLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value); -GLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value); -GLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value); -GLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value); -GLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value); -GLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color); -GLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color); -GLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color); -GLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color); -GLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color); -GLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color); -GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color); -typedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color); -typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -#endif - -#ifndef GL_ARB_draw_indirect -#define GL_ARB_draw_indirect 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const GLvoid *indirect); -GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const GLvoid *indirect); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const GLvoid *indirect); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const GLvoid *indirect); -#endif - -#ifndef GL_ARB_gpu_shader5 -#define GL_ARB_gpu_shader5 1 -#endif - -#ifndef GL_ARB_gpu_shader_fp64 -#define GL_ARB_gpu_shader_fp64 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x); -GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y); -GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); -typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params); -#endif - -#ifndef GL_ARB_shader_subroutine -#define GL_ARB_shader_subroutine 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name); -GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name); -GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); -GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices); -GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params); -GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name); -typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices); -typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); -#endif - -#ifndef GL_ARB_tessellation_shader -#define GL_ARB_tessellation_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value); -GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values); -#endif - -#ifndef GL_ARB_texture_buffer_object_rgb32 -#define GL_ARB_texture_buffer_object_rgb32 1 -#endif - -#ifndef GL_ARB_transform_feedback2 -#define GL_ARB_transform_feedback2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id); -GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); -GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); -GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id); -GLAPI void APIENTRY glPauseTransformFeedback (void); -GLAPI void APIENTRY glResumeTransformFeedback (void); -GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); -typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); -typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); -#endif - -#ifndef GL_ARB_transform_feedback3 -#define GL_ARB_transform_feedback3 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream); -GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id); -GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index); -GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); -typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); -#endif - -#ifndef GL_ARB_ES2_compatibility -#define GL_ARB_ES2_compatibility 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReleaseShaderCompiler (void); -GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length); -GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -GLAPI void APIENTRY glDepthRangef (GLclampf n, GLclampf f); -GLAPI void APIENTRY glClearDepthf (GLclampf d); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); -typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length); -typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f); -typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLclampf d); -#endif - -#ifndef GL_ARB_get_program_binary -#define GL_ARB_get_program_binary 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); -GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length); -GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); -typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); -#endif - -#ifndef GL_ARB_separate_shader_objects -#define GL_ARB_separate_shader_objects 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program); -GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program); -GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar* *strings); -GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines); -GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines); -GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params); -GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0); -GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0); -GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0); -GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0); -GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1); -GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); -GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); -GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); -typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar* *strings); -typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); -typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -#endif - -#ifndef GL_ARB_vertex_attrib_64bit -#define GL_ARB_vertex_attrib_64bit 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params); -#endif - -#ifndef GL_ARB_viewport_array -#define GL_ARB_viewport_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v); -GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v); -GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLclampd *v); -GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLclampd n, GLclampd f); -GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data); -GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v); -typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLclampd *v); -typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLclampd n, GLclampd f); -typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); -typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); -#endif - -#ifndef GL_ARB_cl_event -#define GL_ARB_cl_event 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context * context, struct _cl_event * event, GLbitfield flags); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context * context, struct _cl_event * event, GLbitfield flags); -#endif - -#ifndef GL_ARB_debug_output -#define GL_ARB_debug_output 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const GLvoid *userParam); -GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const GLvoid *userParam); -typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -#endif - -#ifndef GL_ARB_robustness -#define GL_ARB_robustness 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void); -GLAPI void APIENTRY glGetnMapdvARB (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); -GLAPI void APIENTRY glGetnMapfvARB (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); -GLAPI void APIENTRY glGetnMapivARB (GLenum target, GLenum query, GLsizei bufSize, GLint *v); -GLAPI void APIENTRY glGetnPixelMapfvARB (GLenum map, GLsizei bufSize, GLfloat *values); -GLAPI void APIENTRY glGetnPixelMapuivARB (GLenum map, GLsizei bufSize, GLuint *values); -GLAPI void APIENTRY glGetnPixelMapusvARB (GLenum map, GLsizei bufSize, GLushort *values); -GLAPI void APIENTRY glGetnPolygonStippleARB (GLsizei bufSize, GLubyte *pattern); -GLAPI void APIENTRY glGetnColorTableARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *table); -GLAPI void APIENTRY glGetnConvolutionFilterARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *image); -GLAPI void APIENTRY glGetnSeparableFilterARB (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, GLvoid *row, GLsizei columnBufSize, GLvoid *column, GLvoid *span); -GLAPI void APIENTRY glGetnHistogramARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); -GLAPI void APIENTRY glGetnMinmaxARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); -GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *img); -GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data); -GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, GLvoid *img); -GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params); -GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); -typedef void (APIENTRYP PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); -typedef void (APIENTRYP PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); -typedef void (APIENTRYP PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); -typedef void (APIENTRYP PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat *values); -typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint *values); -typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort *values); -typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte *pattern); -typedef void (APIENTRYP PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *table); -typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *image); -typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, GLvoid *row, GLsizei columnBufSize, GLvoid *column, GLvoid *span); -typedef void (APIENTRYP PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); -typedef void (APIENTRYP PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); -typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *img); -typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data); -typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *img); -typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); -#endif - -#ifndef GL_ARB_shader_stencil_export -#define GL_ARB_shader_stencil_export 1 -#endif - -#ifndef GL_EXT_abgr -#define GL_EXT_abgr 1 -#endif - -#ifndef GL_EXT_blend_color -#define GL_EXT_blend_color 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendColorEXT (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -#endif - -#ifndef GL_EXT_polygon_offset -#define GL_EXT_polygon_offset 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat factor, GLfloat bias); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); -#endif - -#ifndef GL_EXT_texture -#define GL_EXT_texture 1 -#endif - -#ifndef GL_EXT_texture3D -#define GL_EXT_texture3D 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_SGIS_texture_filter4 -#define GL_SGIS_texture_filter4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat *weights); -GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); -typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); -#endif - -#ifndef GL_EXT_subtexture -#define GL_EXT_subtexture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_EXT_copy_texture -#define GL_EXT_copy_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_EXT_histogram -#define GL_EXT_histogram 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -GLAPI void APIENTRY glMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink); -GLAPI void APIENTRY glResetHistogramEXT (GLenum target); -GLAPI void APIENTRY glResetMinmaxEXT (GLenum target); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); -typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); -#endif - -#ifndef GL_EXT_convolution -#define GL_EXT_convolution 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat params); -GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum target, GLenum pname, GLint params); -GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, GLvoid *image); -GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -#endif - -#ifndef GL_SGI_color_matrix -#define GL_SGI_color_matrix 1 -#endif - -#ifndef GL_SGI_color_table -#define GL_SGI_color_table 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glColorTableParameterivSGI (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glGetColorTableSGI (GLenum target, GLenum format, GLenum type, GLvoid *table); -GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); -#endif - -#ifndef GL_SGIX_pixel_texture -#define GL_SGIX_pixel_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTexGenSGIX (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); -#endif - -#ifndef GL_SGIS_pixel_texture -#define GL_SGIS_pixel_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum pname, GLint param); -GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum pname, const GLint *params); -GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum pname, GLint *params); -GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum pname, GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); -#endif - -#ifndef GL_SGIS_texture4D -#define GL_SGIS_texture4D 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage4DSGIS (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_SGI_texture_color_table -#define GL_SGI_texture_color_table 1 -#endif - -#ifndef GL_EXT_cmyka -#define GL_EXT_cmyka 1 -#endif - -#ifndef GL_EXT_texture_object -#define GL_EXT_texture_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei n, const GLuint *textures, GLboolean *residences); -GLAPI void APIENTRY glBindTextureEXT (GLenum target, GLuint texture); -GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei n, const GLuint *textures); -GLAPI void APIENTRY glGenTexturesEXT (GLsizei n, GLuint *textures); -GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint texture); -GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei n, const GLuint *textures, const GLclampf *priorities); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); -typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); -typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); -typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); -typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); -typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); -#endif - -#ifndef GL_SGIS_detail_texture -#define GL_SGIS_detail_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); -GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum target, GLfloat *points); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#endif - -#ifndef GL_SGIS_sharpen_texture -#define GL_SGIS_sharpen_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); -GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum target, GLfloat *points); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#endif - -#ifndef GL_EXT_packed_pixels -#define GL_EXT_packed_pixels 1 -#endif - -#ifndef GL_SGIS_texture_lod -#define GL_SGIS_texture_lod 1 -#endif - -#ifndef GL_SGIS_multisample -#define GL_SGIS_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleMaskSGIS (GLclampf value, GLboolean invert); -GLAPI void APIENTRY glSamplePatternSGIS (GLenum pattern); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); -#endif - -#ifndef GL_EXT_rescale_normal -#define GL_EXT_rescale_normal 1 -#endif - -#ifndef GL_EXT_vertex_array -#define GL_EXT_vertex_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glArrayElementEXT (GLint i); -GLAPI void APIENTRY glColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -GLAPI void APIENTRY glDrawArraysEXT (GLenum mode, GLint first, GLsizei count); -GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean *pointer); -GLAPI void APIENTRY glGetPointervEXT (GLenum pname, GLvoid* *params); -GLAPI void APIENTRY glIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -GLAPI void APIENTRY glNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -GLAPI void APIENTRY glTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -GLAPI void APIENTRY glVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); -typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); -typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); -typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_misc_attribute -#define GL_EXT_misc_attribute 1 -#endif - -#ifndef GL_SGIS_generate_mipmap -#define GL_SGIS_generate_mipmap 1 -#endif - -#ifndef GL_SGIX_clipmap -#define GL_SGIX_clipmap 1 -#endif - -#ifndef GL_SGIX_shadow -#define GL_SGIX_shadow 1 -#endif - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_SGIS_texture_edge_clamp 1 -#endif - -#ifndef GL_SGIS_texture_border_clamp -#define GL_SGIS_texture_border_clamp 1 -#endif - -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationEXT (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_blend_subtract -#define GL_EXT_blend_subtract 1 -#endif - -#ifndef GL_EXT_blend_logic_op -#define GL_EXT_blend_logic_op 1 -#endif - -#ifndef GL_SGIX_interlace -#define GL_SGIX_interlace 1 -#endif - -#ifndef GL_SGIX_pixel_tiles -#define GL_SGIX_pixel_tiles 1 -#endif - -#ifndef GL_SGIX_texture_select -#define GL_SGIX_texture_select 1 -#endif - -#ifndef GL_SGIX_sprite -#define GL_SGIX_sprite 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum pname, GLfloat param); -GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum pname, GLint param); -GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum pname, const GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); -#endif - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_SGIX_texture_multi_buffer 1 -#endif - -#ifndef GL_EXT_point_parameters -#define GL_EXT_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfEXT (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPointParameterfvEXT (GLenum pname, const GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_SGIS_point_parameters -#define GL_SGIS_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfSGIS (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPointParameterfvSGIS (GLenum pname, const GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_SGIX_instruments -#define GL_SGIX_instruments 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); -GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei size, GLint *buffer); -GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *marker_p); -GLAPI void APIENTRY glReadInstrumentsSGIX (GLint marker); -GLAPI void APIENTRY glStartInstrumentsSGIX (void); -GLAPI void APIENTRY glStopInstrumentsSGIX (GLint marker); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); -typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); -typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); -typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); -#endif - -#ifndef GL_SGIX_texture_scale_bias -#define GL_SGIX_texture_scale_bias 1 -#endif - -#ifndef GL_SGIX_framezoom -#define GL_SGIX_framezoom 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFrameZoomSGIX (GLint factor); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); -#endif - -#ifndef GL_SGIX_tag_sample_buffer -#define GL_SGIX_tag_sample_buffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTagSampleBufferSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); -#endif - -#ifndef GL_SGIX_polynomial_ffd -#define GL_SGIX_polynomial_ffd 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); -GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); -GLAPI void APIENTRY glDeformSGIX (GLbitfield mask); -GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield mask); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); -typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); -typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); -#endif - -#ifndef GL_SGIX_reference_plane -#define GL_SGIX_reference_plane 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *equation); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); -#endif - -#ifndef GL_SGIX_flush_raster -#define GL_SGIX_flush_raster 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFlushRasterSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); -#endif - -#ifndef GL_SGIX_depth_texture -#define GL_SGIX_depth_texture 1 -#endif - -#ifndef GL_SGIS_fog_function -#define GL_SGIS_fog_function 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFogFuncSGIS (GLsizei n, const GLfloat *points); -GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *points); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); -#endif - -#ifndef GL_SGIX_fog_offset -#define GL_SGIX_fog_offset 1 -#endif - -#ifndef GL_HP_image_transform -#define GL_HP_image_transform 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glImageTransformParameteriHP (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glImageTransformParameterfHP (GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glImageTransformParameterivHP (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum target, GLenum pname, GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_HP_convolution_border_modes -#define GL_HP_convolution_border_modes 1 -#endif - -#ifndef GL_SGIX_texture_add_env -#define GL_SGIX_texture_add_env 1 -#endif - -#ifndef GL_EXT_color_subtable -#define GL_EXT_color_subtable 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -#endif - -#ifndef GL_PGI_vertex_hints -#define GL_PGI_vertex_hints 1 -#endif - -#ifndef GL_PGI_misc_hints -#define GL_PGI_misc_hints 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glHintPGI (GLenum target, GLint mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); -#endif - -#ifndef GL_EXT_paletted_texture -#define GL_EXT_paletted_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -GLAPI void APIENTRY glGetColorTableEXT (GLenum target, GLenum format, GLenum type, GLvoid *data); -GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_EXT_clip_volume_hint -#define GL_EXT_clip_volume_hint 1 -#endif - -#ifndef GL_SGIX_list_priority -#define GL_SGIX_list_priority 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint list, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetListParameterivSGIX (GLuint list, GLenum pname, GLint *params); -GLAPI void APIENTRY glListParameterfSGIX (GLuint list, GLenum pname, GLfloat param); -GLAPI void APIENTRY glListParameterfvSGIX (GLuint list, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glListParameteriSGIX (GLuint list, GLenum pname, GLint param); -GLAPI void APIENTRY glListParameterivSGIX (GLuint list, GLenum pname, const GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); -#endif - -#ifndef GL_SGIX_ir_instrument1 -#define GL_SGIX_ir_instrument1 1 -#endif - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_SGIX_calligraphic_fragment 1 -#endif - -#ifndef GL_SGIX_texture_lod_bias -#define GL_SGIX_texture_lod_bias 1 -#endif - -#ifndef GL_SGIX_shadow_ambient -#define GL_SGIX_shadow_ambient 1 -#endif - -#ifndef GL_EXT_index_texture -#define GL_EXT_index_texture 1 -#endif - -#ifndef GL_EXT_index_material -#define GL_EXT_index_material 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIndexMaterialEXT (GLenum face, GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); -#endif - -#ifndef GL_EXT_index_func -#define GL_EXT_index_func 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIndexFuncEXT (GLenum func, GLclampf ref); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); -#endif - -#ifndef GL_EXT_index_array_formats -#define GL_EXT_index_array_formats 1 -#endif - -#ifndef GL_EXT_compiled_vertex_array -#define GL_EXT_compiled_vertex_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glLockArraysEXT (GLint first, GLsizei count); -GLAPI void APIENTRY glUnlockArraysEXT (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); -#endif - -#ifndef GL_EXT_cull_vertex -#define GL_EXT_cull_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCullParameterdvEXT (GLenum pname, GLdouble *params); -GLAPI void APIENTRY glCullParameterfvEXT (GLenum pname, GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); -#endif - -#ifndef GL_SGIX_ycrcb -#define GL_SGIX_ycrcb 1 -#endif - -#ifndef GL_SGIX_fragment_lighting -#define GL_SGIX_fragment_lighting 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum face, GLenum mode); -GLAPI void APIENTRY glFragmentLightfSGIX (GLenum light, GLenum pname, GLfloat param); -GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum light, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glFragmentLightiSGIX (GLenum light, GLenum pname, GLint param); -GLAPI void APIENTRY glFragmentLightivSGIX (GLenum light, GLenum pname, const GLint *params); -GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum pname, GLfloat param); -GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum pname, GLint param); -GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum pname, const GLint *params); -GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum face, GLenum pname, GLfloat param); -GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum face, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum face, GLenum pname, GLint param); -GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum face, GLenum pname, const GLint *params); -GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum light, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum light, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum face, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum face, GLenum pname, GLint *params); -GLAPI void APIENTRY glLightEnviSGIX (GLenum pname, GLint param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); -#endif - -#ifndef GL_IBM_rasterpos_clip -#define GL_IBM_rasterpos_clip 1 -#endif - -#ifndef GL_HP_texture_lighting -#define GL_HP_texture_lighting 1 -#endif - -#ifndef GL_EXT_draw_range_elements -#define GL_EXT_draw_range_elements 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -#endif - -#ifndef GL_WIN_phong_shading -#define GL_WIN_phong_shading 1 -#endif - -#ifndef GL_WIN_specular_fog -#define GL_WIN_specular_fog 1 -#endif - -#ifndef GL_EXT_light_texture -#define GL_EXT_light_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glApplyTextureEXT (GLenum mode); -GLAPI void APIENTRY glTextureLightEXT (GLenum pname); -GLAPI void APIENTRY glTextureMaterialEXT (GLenum face, GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); -typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); -#endif - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_SGIX_blend_alpha_minmax 1 -#endif - -#ifndef GL_EXT_bgra -#define GL_EXT_bgra 1 -#endif - -#ifndef GL_SGIX_async -#define GL_SGIX_async 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint marker); -GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *markerp); -GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *markerp); -GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei range); -GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range); -GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint marker); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); -typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); -typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); -typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); -typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); -typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); -#endif - -#ifndef GL_SGIX_async_pixel -#define GL_SGIX_async_pixel 1 -#endif - -#ifndef GL_SGIX_async_histogram -#define GL_SGIX_async_histogram 1 -#endif - -#ifndef GL_INTEL_parallel_arrays -#define GL_INTEL_parallel_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer); -GLAPI void APIENTRY glNormalPointervINTEL (GLenum type, const GLvoid* *pointer); -GLAPI void APIENTRY glColorPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer); -GLAPI void APIENTRY glTexCoordPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); -typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -#endif - -#ifndef GL_HP_occlusion_test -#define GL_HP_occlusion_test 1 -#endif - -#ifndef GL_EXT_pixel_transform -#define GL_EXT_pixel_transform 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_EXT_pixel_transform_color_table -#define GL_EXT_pixel_transform_color_table 1 -#endif - -#ifndef GL_EXT_shared_texture_palette -#define GL_EXT_shared_texture_palette 1 -#endif - -#ifndef GL_EXT_separate_specular_color -#define GL_EXT_separate_specular_color 1 -#endif - -#ifndef GL_EXT_secondary_color -#define GL_EXT_secondary_color 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue); -GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *v); -GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue); -GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *v); -GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue); -GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *v); -GLAPI void APIENTRY glSecondaryColor3iEXT (GLint red, GLint green, GLint blue); -GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *v); -GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue); -GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *v); -GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue); -GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *v); -GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue); -GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *v); -GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue); -GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *v); -GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_texture_perturb_normal -#define GL_EXT_texture_perturb_normal 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureNormalEXT (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -#endif - -#ifndef GL_EXT_fog_coord -#define GL_EXT_fog_coord 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFogCoordfEXT (GLfloat coord); -GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *coord); -GLAPI void APIENTRY glFogCoorddEXT (GLdouble coord); -GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *coord); -GLAPI void APIENTRY glFogCoordPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); -typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); -typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); -typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_REND_screen_coordinates -#define GL_REND_screen_coordinates 1 -#endif - -#ifndef GL_EXT_coordinate_frame -#define GL_EXT_coordinate_frame 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTangent3bEXT (GLbyte tx, GLbyte ty, GLbyte tz); -GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *v); -GLAPI void APIENTRY glTangent3dEXT (GLdouble tx, GLdouble ty, GLdouble tz); -GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *v); -GLAPI void APIENTRY glTangent3fEXT (GLfloat tx, GLfloat ty, GLfloat tz); -GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *v); -GLAPI void APIENTRY glTangent3iEXT (GLint tx, GLint ty, GLint tz); -GLAPI void APIENTRY glTangent3ivEXT (const GLint *v); -GLAPI void APIENTRY glTangent3sEXT (GLshort tx, GLshort ty, GLshort tz); -GLAPI void APIENTRY glTangent3svEXT (const GLshort *v); -GLAPI void APIENTRY glBinormal3bEXT (GLbyte bx, GLbyte by, GLbyte bz); -GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *v); -GLAPI void APIENTRY glBinormal3dEXT (GLdouble bx, GLdouble by, GLdouble bz); -GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *v); -GLAPI void APIENTRY glBinormal3fEXT (GLfloat bx, GLfloat by, GLfloat bz); -GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *v); -GLAPI void APIENTRY glBinormal3iEXT (GLint bx, GLint by, GLint bz); -GLAPI void APIENTRY glBinormal3ivEXT (const GLint *v); -GLAPI void APIENTRY glBinormal3sEXT (GLshort bx, GLshort by, GLshort bz); -GLAPI void APIENTRY glBinormal3svEXT (const GLshort *v); -GLAPI void APIENTRY glTangentPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glBinormalPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); -typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); -typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); -typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); -typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); -typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); -typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); -typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); -typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); -typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); -typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_texture_env_combine -#define GL_EXT_texture_env_combine 1 -#endif - -#ifndef GL_APPLE_specular_vector -#define GL_APPLE_specular_vector 1 -#endif - -#ifndef GL_APPLE_transform_hint -#define GL_APPLE_transform_hint 1 -#endif - -#ifndef GL_SGIX_fog_scale -#define GL_SGIX_fog_scale 1 -#endif - -#ifndef GL_SUNX_constant_data -#define GL_SUNX_constant_data 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFinishTextureSUNX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); -#endif - -#ifndef GL_SUN_global_alpha -#define GL_SUN_global_alpha 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte factor); -GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort factor); -GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint factor); -GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat factor); -GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble factor); -GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte factor); -GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort factor); -GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint factor); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); -#endif - -#ifndef GL_SUN_triangle_list -#define GL_SUN_triangle_list 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint code); -GLAPI void APIENTRY glReplacementCodeusSUN (GLushort code); -GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte code); -GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *code); -GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *code); -GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *code); -GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum type, GLsizei stride, const GLvoid* *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); -#endif - -#ifndef GL_SUN_vertex -#define GL_SUN_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *c, const GLfloat *v); -GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *c, const GLfloat *v); -GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *c, const GLfloat *v); -GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *c, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *tc, const GLfloat *v); -GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *tc, const GLfloat *v); -GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *tc, const GLubyte *c, const GLfloat *v); -GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *v); -GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint rc, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *rc, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *rc, const GLubyte *c, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -#endif - -#ifndef GL_EXT_blend_func_separate -#define GL_EXT_blend_func_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif - -#ifndef GL_INGR_blend_func_separate -#define GL_INGR_blend_func_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif - -#ifndef GL_INGR_color_clamp -#define GL_INGR_color_clamp 1 -#endif - -#ifndef GL_INGR_interlace_read -#define GL_INGR_interlace_read 1 -#endif - -#ifndef GL_EXT_stencil_wrap -#define GL_EXT_stencil_wrap 1 -#endif - -#ifndef GL_EXT_422_pixels -#define GL_EXT_422_pixels 1 -#endif - -#ifndef GL_NV_texgen_reflection -#define GL_NV_texgen_reflection 1 -#endif - -#ifndef GL_SUN_convolution_border_modes -#define GL_SUN_convolution_border_modes 1 -#endif - -#ifndef GL_EXT_texture_env_add -#define GL_EXT_texture_env_add 1 -#endif - -#ifndef GL_EXT_texture_lod_bias -#define GL_EXT_texture_lod_bias 1 -#endif - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 -#endif - -#ifndef GL_EXT_vertex_weighting -#define GL_EXT_vertex_weighting 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexWeightfEXT (GLfloat weight); -GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *weight); -GLAPI void APIENTRY glVertexWeightPointerEXT (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_NV_light_max_exponent -#define GL_NV_light_max_exponent 1 -#endif - -#ifndef GL_NV_vertex_array_range -#define GL_NV_vertex_array_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); -GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei length, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); -typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid *pointer); -#endif - -#ifndef GL_NV_register_combiners -#define GL_NV_register_combiners 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCombinerParameterfvNV (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glCombinerParameterfNV (GLenum pname, GLfloat param); -GLAPI void APIENTRY glCombinerParameterivNV (GLenum pname, const GLint *params); -GLAPI void APIENTRY glCombinerParameteriNV (GLenum pname, GLint param); -GLAPI void APIENTRY glCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -GLAPI void APIENTRY glCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -GLAPI void APIENTRY glFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); -#endif - -#ifndef GL_NV_fog_distance -#define GL_NV_fog_distance 1 -#endif - -#ifndef GL_NV_texgen_emboss -#define GL_NV_texgen_emboss 1 -#endif - -#ifndef GL_NV_blend_square -#define GL_NV_blend_square 1 -#endif - -#ifndef GL_NV_texture_env_combine4 -#define GL_NV_texture_env_combine4 1 -#endif - -#ifndef GL_MESA_resize_buffers -#define GL_MESA_resize_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glResizeBuffersMESA (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); -#endif - -#ifndef GL_MESA_window_pos -#define GL_MESA_window_pos 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWindowPos2dMESA (GLdouble x, GLdouble y); -GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *v); -GLAPI void APIENTRY glWindowPos2fMESA (GLfloat x, GLfloat y); -GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *v); -GLAPI void APIENTRY glWindowPos2iMESA (GLint x, GLint y); -GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *v); -GLAPI void APIENTRY glWindowPos2sMESA (GLshort x, GLshort y); -GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *v); -GLAPI void APIENTRY glWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *v); -GLAPI void APIENTRY glWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *v); -GLAPI void APIENTRY glWindowPos3iMESA (GLint x, GLint y, GLint z); -GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *v); -GLAPI void APIENTRY glWindowPos3sMESA (GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *v); -GLAPI void APIENTRY glWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *v); -GLAPI void APIENTRY glWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *v); -GLAPI void APIENTRY glWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *v); -GLAPI void APIENTRY glWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); -#endif - -#ifndef GL_IBM_cull_vertex -#define GL_IBM_cull_vertex 1 -#endif - -#ifndef GL_IBM_multimode_draw_arrays -#define GL_IBM_multimode_draw_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); -#endif - -#ifndef GL_IBM_vertex_array_lists -#define GL_IBM_vertex_array_lists 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint stride, const GLboolean* *pointer, GLint ptrstride); -GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glIndexPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glNormalPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glVertexPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -#endif - -#ifndef GL_SGIX_subsample -#define GL_SGIX_subsample 1 -#endif - -#ifndef GL_SGIX_ycrcba -#define GL_SGIX_ycrcba 1 -#endif - -#ifndef GL_SGIX_ycrcb_subsample -#define GL_SGIX_ycrcb_subsample 1 -#endif - -#ifndef GL_SGIX_depth_pass_instrument -#define GL_SGIX_depth_pass_instrument 1 -#endif - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_3DFX_texture_compression_FXT1 1 -#endif - -#ifndef GL_3DFX_multisample -#define GL_3DFX_multisample 1 -#endif - -#ifndef GL_3DFX_tbuffer -#define GL_3DFX_tbuffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTbufferMask3DFX (GLuint mask); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); -#endif - -#ifndef GL_EXT_multisample -#define GL_EXT_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleMaskEXT (GLclampf value, GLboolean invert); -GLAPI void APIENTRY glSamplePatternEXT (GLenum pattern); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); -#endif - -#ifndef GL_SGIX_vertex_preclip -#define GL_SGIX_vertex_preclip 1 -#endif - -#ifndef GL_SGIX_convolution_accuracy -#define GL_SGIX_convolution_accuracy 1 -#endif - -#ifndef GL_SGIX_resample -#define GL_SGIX_resample 1 -#endif - -#ifndef GL_SGIS_point_line_texgen -#define GL_SGIS_point_line_texgen 1 -#endif - -#ifndef GL_SGIS_texture_color_mask -#define GL_SGIS_texture_color_mask 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -#endif - -#ifndef GL_SGIX_igloo_interface -#define GL_SGIX_igloo_interface 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum pname, const GLvoid *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); -#endif - -#ifndef GL_EXT_texture_env_dot3 -#define GL_EXT_texture_env_dot3 1 -#endif - -#ifndef GL_ATI_texture_mirror_once -#define GL_ATI_texture_mirror_once 1 -#endif - -#ifndef GL_NV_fence -#define GL_NV_fence 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); -GLAPI void APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); -GLAPI GLboolean APIENTRY glIsFenceNV (GLuint fence); -GLAPI GLboolean APIENTRY glTestFenceNV (GLuint fence); -GLAPI void APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); -GLAPI void APIENTRY glFinishFenceNV (GLuint fence); -GLAPI void APIENTRY glSetFenceNV (GLuint fence, GLenum condition); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); -typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); -typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); -#endif - -#ifndef GL_NV_evaluators -#define GL_NV_evaluators 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); -GLAPI void APIENTRY glMapParameterivNV (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMapParameterfvNV (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); -GLAPI void APIENTRY glGetMapParameterivNV (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glEvalMapsNV (GLenum target, GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); -typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); -typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); -#endif - -#ifndef GL_NV_packed_depth_stencil -#define GL_NV_packed_depth_stencil 1 -#endif - -#ifndef GL_NV_register_combiners2 -#define GL_NV_register_combiners2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_NV_texture_compression_vtc -#define GL_NV_texture_compression_vtc 1 -#endif - -#ifndef GL_NV_texture_rectangle -#define GL_NV_texture_rectangle 1 -#endif - -#ifndef GL_NV_texture_shader -#define GL_NV_texture_shader 1 -#endif - -#ifndef GL_NV_texture_shader2 -#define GL_NV_texture_shader2 1 -#endif - -#ifndef GL_NV_vertex_array_range2 -#define GL_NV_vertex_array_range2 1 -#endif - -#ifndef GL_NV_vertex_program -#define GL_NV_vertex_program 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei n, const GLuint *programs, GLboolean *residences); -GLAPI void APIENTRY glBindProgramNV (GLenum target, GLuint id); -GLAPI void APIENTRY glDeleteProgramsNV (GLsizei n, const GLuint *programs); -GLAPI void APIENTRY glExecuteProgramNV (GLenum target, GLuint id, const GLfloat *params); -GLAPI void APIENTRY glGenProgramsNV (GLsizei n, GLuint *programs); -GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetProgramivNV (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetProgramStringNV (GLuint id, GLenum pname, GLubyte *program); -GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribivNV (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint index, GLenum pname, GLvoid* *pointer); -GLAPI GLboolean APIENTRY glIsProgramNV (GLuint id); -GLAPI void APIENTRY glLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte *program); -GLAPI void APIENTRY glProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v); -GLAPI void APIENTRY glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v); -GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLuint count, const GLdouble *v); -GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLuint count, const GLfloat *v); -GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei n, const GLuint *programs); -GLAPI void APIENTRY glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform); -GLAPI void APIENTRY glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glVertexAttrib1dNV (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib1fNV (GLuint index, GLfloat x); -GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib1sNV (GLuint index, GLshort x); -GLAPI void APIENTRY glVertexAttrib1svNV (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib2sNV (GLuint index, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexAttrib2svNV (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexAttrib3svNV (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexAttrib4svNV (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glVertexAttribs1svNV (GLuint index, GLsizei count, const GLshort *v); -GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glVertexAttribs2svNV (GLuint index, GLsizei count, const GLshort *v); -GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glVertexAttribs3svNV (GLuint index, GLsizei count, const GLshort *v); -GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glVertexAttribs4svNV (GLuint index, GLsizei count, const GLshort *v); -GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint index, GLsizei count, const GLubyte *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); -typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); -typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); -typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); -typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v); -typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); -#endif - -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_SGIX_texture_coordinate_clamp 1 -#endif - -#ifndef GL_SGIX_scalebias_hint -#define GL_SGIX_scalebias_hint 1 -#endif - -#ifndef GL_OML_interlace -#define GL_OML_interlace 1 -#endif - -#ifndef GL_OML_subsample -#define GL_OML_subsample 1 -#endif - -#ifndef GL_OML_resample -#define GL_OML_resample 1 -#endif - -#ifndef GL_NV_copy_depth_to_color -#define GL_NV_copy_depth_to_color 1 -#endif - -#ifndef GL_ATI_envmap_bumpmap -#define GL_ATI_envmap_bumpmap 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBumpParameterivATI (GLenum pname, const GLint *param); -GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum pname, const GLfloat *param); -GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum pname, GLint *param); -GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); -typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); -#endif - -#ifndef GL_ATI_fragment_shader -#define GL_ATI_fragment_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint range); -GLAPI void APIENTRY glBindFragmentShaderATI (GLuint id); -GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint id); -GLAPI void APIENTRY glBeginFragmentShaderATI (void); -GLAPI void APIENTRY glEndFragmentShaderATI (void); -GLAPI void APIENTRY glPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle); -GLAPI void APIENTRY glSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle); -GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint dst, const GLfloat *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); -typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); -typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); -typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); -typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); -#endif - -#ifndef GL_ATI_pn_triangles -#define GL_ATI_pn_triangles 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPNTrianglesiATI (GLenum pname, GLint param); -GLAPI void APIENTRY glPNTrianglesfATI (GLenum pname, GLfloat param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); -#endif - -#ifndef GL_ATI_vertex_array_object -#define GL_ATI_vertex_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei size, const GLvoid *pointer, GLenum usage); -GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint buffer); -GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); -GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glFreeObjectBufferATI (GLuint buffer); -GLAPI void APIENTRY glArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetArrayObjectivATI (GLenum array, GLenum pname, GLint *params); -GLAPI void APIENTRY glVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); -typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); -typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); -#endif - -#ifndef GL_EXT_vertex_shader -#define GL_EXT_vertex_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginVertexShaderEXT (void); -GLAPI void APIENTRY glEndVertexShaderEXT (void); -GLAPI void APIENTRY glBindVertexShaderEXT (GLuint id); -GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint range); -GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint id); -GLAPI void APIENTRY glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1); -GLAPI void APIENTRY glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2); -GLAPI void APIENTRY glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); -GLAPI void APIENTRY glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -GLAPI void APIENTRY glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -GLAPI void APIENTRY glInsertComponentEXT (GLuint res, GLuint src, GLuint num); -GLAPI void APIENTRY glExtractComponentEXT (GLuint res, GLuint src, GLuint num); -GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); -GLAPI void APIENTRY glSetInvariantEXT (GLuint id, GLenum type, const GLvoid *addr); -GLAPI void APIENTRY glSetLocalConstantEXT (GLuint id, GLenum type, const GLvoid *addr); -GLAPI void APIENTRY glVariantbvEXT (GLuint id, const GLbyte *addr); -GLAPI void APIENTRY glVariantsvEXT (GLuint id, const GLshort *addr); -GLAPI void APIENTRY glVariantivEXT (GLuint id, const GLint *addr); -GLAPI void APIENTRY glVariantfvEXT (GLuint id, const GLfloat *addr); -GLAPI void APIENTRY glVariantdvEXT (GLuint id, const GLdouble *addr); -GLAPI void APIENTRY glVariantubvEXT (GLuint id, const GLubyte *addr); -GLAPI void APIENTRY glVariantusvEXT (GLuint id, const GLushort *addr); -GLAPI void APIENTRY glVariantuivEXT (GLuint id, const GLuint *addr); -GLAPI void APIENTRY glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); -GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint id); -GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint id); -GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum light, GLenum value); -GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum face, GLenum value); -GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value); -GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum unit, GLenum value); -GLAPI GLuint APIENTRY glBindParameterEXT (GLenum value); -GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint id, GLenum cap); -GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); -GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data); -GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); -GLAPI void APIENTRY glGetVariantPointervEXT (GLuint id, GLenum value, GLvoid* *data); -GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); -GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data); -GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); -GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); -GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data); -GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); -typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); -typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); -typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); -typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); -typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); -typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); -typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); -typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); -typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); -typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); -typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); -typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); -typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); -typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); -typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); -typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); -typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); -typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); -typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); -typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); -typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); -typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* *data); -typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -#endif - -#ifndef GL_ATI_vertex_streams -#define GL_ATI_vertex_streams 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexStream1sATI (GLenum stream, GLshort x); -GLAPI void APIENTRY glVertexStream1svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glVertexStream1iATI (GLenum stream, GLint x); -GLAPI void APIENTRY glVertexStream1ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glVertexStream1fATI (GLenum stream, GLfloat x); -GLAPI void APIENTRY glVertexStream1fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glVertexStream1dATI (GLenum stream, GLdouble x); -GLAPI void APIENTRY glVertexStream1dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glVertexStream2sATI (GLenum stream, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexStream2svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glVertexStream2iATI (GLenum stream, GLint x, GLint y); -GLAPI void APIENTRY glVertexStream2ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexStream2fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexStream2dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexStream3svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z); -GLAPI void APIENTRY glVertexStream3ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexStream3fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexStream3dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexStream4svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glVertexStream4ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexStream4fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexStream4dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glNormalStream3bATI (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); -GLAPI void APIENTRY glNormalStream3bvATI (GLenum stream, const GLbyte *coords); -GLAPI void APIENTRY glNormalStream3sATI (GLenum stream, GLshort nx, GLshort ny, GLshort nz); -GLAPI void APIENTRY glNormalStream3svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glNormalStream3iATI (GLenum stream, GLint nx, GLint ny, GLint nz); -GLAPI void APIENTRY glNormalStream3ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glNormalStream3fATI (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); -GLAPI void APIENTRY glNormalStream3fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glNormalStream3dATI (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); -GLAPI void APIENTRY glNormalStream3dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum stream); -GLAPI void APIENTRY glVertexBlendEnviATI (GLenum pname, GLint param); -GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum pname, GLfloat param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); -typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); -#endif - -#ifndef GL_ATI_element_array -#define GL_ATI_element_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glElementPointerATI (GLenum type, const GLvoid *pointer); -GLAPI void APIENTRY glDrawElementArrayATI (GLenum mode, GLsizei count); -GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); -#endif - -#ifndef GL_SUN_mesh_array -#define GL_SUN_mesh_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); -#endif - -#ifndef GL_SUN_slice_accum -#define GL_SUN_slice_accum 1 -#endif - -#ifndef GL_NV_multisample_filter_hint -#define GL_NV_multisample_filter_hint 1 -#endif - -#ifndef GL_NV_depth_clamp -#define GL_NV_depth_clamp 1 -#endif - -#ifndef GL_NV_occlusion_query -#define GL_NV_occlusion_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei n, GLuint *ids); -GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei n, const GLuint *ids); -GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint id); -GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint id); -GLAPI void APIENTRY glEndOcclusionQueryNV (void); -GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); -typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); -#endif - -#ifndef GL_NV_point_sprite -#define GL_NV_point_sprite 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameteriNV (GLenum pname, GLint param); -GLAPI void APIENTRY glPointParameterivNV (GLenum pname, const GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -#endif - -#ifndef GL_NV_texture_shader3 -#define GL_NV_texture_shader3 1 -#endif - -#ifndef GL_NV_vertex_program1_1 -#define GL_NV_vertex_program1_1 1 -#endif - -#ifndef GL_EXT_shadow_funcs -#define GL_EXT_shadow_funcs 1 -#endif - -#ifndef GL_EXT_stencil_two_side -#define GL_EXT_stencil_two_side 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum face); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); -#endif - -#ifndef GL_ATI_text_fragment_shader -#define GL_ATI_text_fragment_shader 1 -#endif - -#ifndef GL_APPLE_client_storage -#define GL_APPLE_client_storage 1 -#endif - -#ifndef GL_APPLE_element_array -#define GL_APPLE_element_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glElementPointerAPPLE (GLenum type, const GLvoid *pointer); -GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count); -GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); -GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); -#endif - -#ifndef GL_APPLE_fence -#define GL_APPLE_fence 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenFencesAPPLE (GLsizei n, GLuint *fences); -GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei n, const GLuint *fences); -GLAPI void APIENTRY glSetFenceAPPLE (GLuint fence); -GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint fence); -GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint fence); -GLAPI void APIENTRY glFinishFenceAPPLE (GLuint fence); -GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum object, GLuint name); -GLAPI void APIENTRY glFinishObjectAPPLE (GLenum object, GLint name); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); -typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); -typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); -typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); -#endif - -#ifndef GL_APPLE_vertex_array_object -#define GL_APPLE_vertex_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint array); -GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei n, const GLuint *arrays); -GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei n, GLuint *arrays); -GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint array); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); -typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); -typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint *arrays); -typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); -#endif - -#ifndef GL_APPLE_vertex_array_range -#define GL_APPLE_vertex_array_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei length, GLvoid *pointer); -GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei length, GLvoid *pointer); -GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum pname, GLint param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); -typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); -#endif - -#ifndef GL_APPLE_ycbcr_422 -#define GL_APPLE_ycbcr_422 1 -#endif - -#ifndef GL_S3_s3tc -#define GL_S3_s3tc 1 -#endif - -#ifndef GL_ATI_draw_buffers -#define GL_ATI_draw_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawBuffersATI (GLsizei n, const GLenum *bufs); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); -#endif - -#ifndef GL_ATI_pixel_format_float -#define GL_ATI_pixel_format_float 1 -/* This is really a WGL extension, but defines some associated GL enums. - * ATI does not export "GL_ATI_pixel_format_float" in the GL_EXTENSIONS string. - */ -#endif - -#ifndef GL_ATI_texture_env_combine3 -#define GL_ATI_texture_env_combine3 1 -#endif - -#ifndef GL_ATI_texture_float -#define GL_ATI_texture_float 1 -#endif - -#ifndef GL_NV_float_buffer -#define GL_NV_float_buffer 1 -#endif - -#ifndef GL_NV_fragment_program -#define GL_NV_fragment_program 1 -/* Some NV_fragment_program entry points are shared with ARB_vertex_program. */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); -GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); -GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); -GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); -typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); -#endif - -#ifndef GL_NV_half_float -#define GL_NV_half_float 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertex2hNV (GLhalfNV x, GLhalfNV y); -GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glVertex3hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z); -GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glVertex4hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glNormal3hNV (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); -GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glColor4hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); -GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV s); -GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV s, GLhalfNV t); -GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r); -GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum target, GLhalfNV s); -GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum target, const GLhalfNV *v); -GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum target, GLhalfNV s, GLhalfNV t); -GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum target, const GLhalfNV *v); -GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); -GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum target, const GLhalfNV *v); -GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum target, const GLhalfNV *v); -GLAPI void APIENTRY glFogCoordhNV (GLhalfNV fog); -GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *fog); -GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV weight); -GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *weight); -GLAPI void APIENTRY glVertexAttrib1hNV (GLuint index, GLhalfNV x); -GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint index, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttrib2hNV (GLuint index, GLhalfNV x, GLhalfNV y); -GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint index, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttrib3hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); -GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint index, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttrib4hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint index, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalfNV *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); -typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); -typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); -typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); -typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); -typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); -typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); -typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); -typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -#endif - -#ifndef GL_NV_pixel_data_range -#define GL_NV_pixel_data_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelDataRangeNV (GLenum target, GLsizei length, GLvoid *pointer); -GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum target); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid *pointer); -typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); -#endif - -#ifndef GL_NV_primitive_restart -#define GL_NV_primitive_restart 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPrimitiveRestartNV (void); -GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint index); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); -#endif - -#ifndef GL_NV_texture_expand_normal -#define GL_NV_texture_expand_normal 1 -#endif - -#ifndef GL_NV_vertex_program2 -#define GL_NV_vertex_program2 1 -#endif - -#ifndef GL_ATI_map_object_buffer -#define GL_ATI_map_object_buffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLvoid* APIENTRY glMapObjectBufferATI (GLuint buffer); -GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint buffer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLvoid* (APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); -#endif - -#ifndef GL_ATI_separate_stencil -#define GL_ATI_separate_stencil 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -#endif - -#ifndef GL_ATI_vertex_attrib_array_object -#define GL_ATI_vertex_attrib_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); -GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); -#endif - -#ifndef GL_OES_read_format -#define GL_OES_read_format 1 -#endif - -#ifndef GL_EXT_depth_bounds_test -#define GL_EXT_depth_bounds_test 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDepthBoundsEXT (GLclampd zmin, GLclampd zmax); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); -#endif - -#ifndef GL_EXT_texture_mirror_clamp -#define GL_EXT_texture_mirror_clamp 1 -#endif - -#ifndef GL_EXT_blend_equation_separate -#define GL_EXT_blend_equation_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); -#endif - -#ifndef GL_MESA_pack_invert -#define GL_MESA_pack_invert 1 -#endif - -#ifndef GL_MESA_ycbcr_texture -#define GL_MESA_ycbcr_texture 1 -#endif - -#ifndef GL_EXT_pixel_buffer_object -#define GL_EXT_pixel_buffer_object 1 -#endif - -#ifndef GL_NV_fragment_program_option -#define GL_NV_fragment_program_option 1 -#endif - -#ifndef GL_NV_fragment_program2 -#define GL_NV_fragment_program2 1 -#endif - -#ifndef GL_NV_vertex_program2_option -#define GL_NV_vertex_program2_option 1 -#endif - -#ifndef GL_NV_vertex_program3 -#define GL_NV_vertex_program3 1 -#endif - -#ifndef GL_EXT_framebuffer_object -#define GL_EXT_framebuffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint renderbuffer); -GLAPI void APIENTRY glBindRenderbufferEXT (GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers); -GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers); -GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint framebuffer); -GLAPI void APIENTRY glBindFramebufferEXT (GLenum target, GLuint framebuffer); -GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers); -GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei n, GLuint *framebuffers); -GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum target); -GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum attachment, GLenum pname, GLint *params); -GLAPI void APIENTRY glGenerateMipmapEXT (GLenum target); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); -typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); -typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); -typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); -typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); -typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); -#endif - -#ifndef GL_GREMEDY_string_marker -#define GL_GREMEDY_string_marker 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei len, const GLvoid *string); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid *string); -#endif - -#ifndef GL_EXT_packed_depth_stencil -#define GL_EXT_packed_depth_stencil 1 -#endif - -#ifndef GL_EXT_stencil_clear_tag -#define GL_EXT_stencil_clear_tag 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStencilClearTagEXT (GLsizei stencilTagBits, GLuint stencilClearTag); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag); -#endif - -#ifndef GL_EXT_texture_sRGB -#define GL_EXT_texture_sRGB 1 -#endif - -#ifndef GL_EXT_framebuffer_blit -#define GL_EXT_framebuffer_blit 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif - -#ifndef GL_EXT_framebuffer_multisample -#define GL_EXT_framebuffer_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#endif - -#ifndef GL_MESAX_texture_stack -#define GL_MESAX_texture_stack 1 -#endif - -#ifndef GL_EXT_timer_query -#define GL_EXT_timer_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64EXT *params); -GLAPI void APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64EXT *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); -#endif - -#ifndef GL_EXT_gpu_program_parameters -#define GL_EXT_gpu_program_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); -GLAPI void APIENTRY glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); -#endif - -#ifndef GL_APPLE_flush_buffer_range -#define GL_APPLE_flush_buffer_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBufferParameteriAPPLE (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glFlushMappedBufferRangeAPPLE (GLenum target, GLintptr offset, GLsizeiptr size); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); -#endif - -#ifndef GL_NV_gpu_program4 -#define GL_NV_gpu_program4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params); -GLAPI void APIENTRY glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); -GLAPI void APIENTRY glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); -GLAPI void APIENTRY glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); -GLAPI void APIENTRY glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params); -GLAPI void APIENTRY glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); -GLAPI void APIENTRY glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); -GLAPI void APIENTRY glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); -GLAPI void APIENTRY glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params); -GLAPI void APIENTRY glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params); -GLAPI void APIENTRY glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params); -GLAPI void APIENTRY glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); -#endif - -#ifndef GL_NV_geometry_program4 -#define GL_NV_geometry_program4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramVertexLimitNV (GLenum target, GLint limit); -GLAPI void APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void APIENTRY glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#endif - -#ifndef GL_EXT_geometry_shader4 -#define GL_EXT_geometry_shader4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); -#endif - -#ifndef GL_NV_vertex_program4 -#define GL_NV_vertex_program4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribI1iEXT (GLuint index, GLint x); -GLAPI void APIENTRY glVertexAttribI2iEXT (GLuint index, GLint x, GLint y); -GLAPI void APIENTRY glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z); -GLAPI void APIENTRY glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glVertexAttribI1uiEXT (GLuint index, GLuint x); -GLAPI void APIENTRY glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y); -GLAPI void APIENTRY glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z); -GLAPI void APIENTRY glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glVertexAttribI1ivEXT (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI2ivEXT (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI3ivEXT (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI4ivEXT (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI1uivEXT (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI2uivEXT (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI3uivEXT (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4uivEXT (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4bvEXT (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttribI4svEXT (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttribI4usvEXT (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); -#endif - -#ifndef GL_EXT_gpu_shader4 -#define GL_EXT_gpu_shader4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetUniformuivEXT (GLuint program, GLint location, GLuint *params); -GLAPI void APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); -GLAPI GLint APIENTRY glGetFragDataLocationEXT (GLuint program, const GLchar *name); -GLAPI void APIENTRY glUniform1uiEXT (GLint location, GLuint v0); -GLAPI void APIENTRY glUniform2uiEXT (GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -#endif - -#ifndef GL_EXT_draw_instanced -#define GL_EXT_draw_instanced 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -GLAPI void APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -#endif - -#ifndef GL_EXT_packed_float -#define GL_EXT_packed_float 1 -#endif - -#ifndef GL_EXT_texture_array -#define GL_EXT_texture_array 1 -#endif - -#ifndef GL_EXT_texture_buffer_object -#define GL_EXT_texture_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); -#endif - -#ifndef GL_EXT_texture_compression_latc -#define GL_EXT_texture_compression_latc 1 -#endif - -#ifndef GL_EXT_texture_compression_rgtc -#define GL_EXT_texture_compression_rgtc 1 -#endif - -#ifndef GL_EXT_texture_shared_exponent -#define GL_EXT_texture_shared_exponent 1 -#endif - -#ifndef GL_NV_depth_buffer_float -#define GL_NV_depth_buffer_float 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDepthRangedNV (GLdouble zNear, GLdouble zFar); -GLAPI void APIENTRY glClearDepthdNV (GLdouble depth); -GLAPI void APIENTRY glDepthBoundsdNV (GLdouble zmin, GLdouble zmax); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); -typedef void (APIENTRYP PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); -typedef void (APIENTRYP PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); -#endif - -#ifndef GL_NV_fragment_program4 -#define GL_NV_fragment_program4 1 -#endif - -#ifndef GL_NV_framebuffer_multisample_coverage -#define GL_NV_framebuffer_multisample_coverage 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -#endif - -#ifndef GL_EXT_framebuffer_sRGB -#define GL_EXT_framebuffer_sRGB 1 -#endif - -#ifndef GL_NV_geometry_shader4 -#define GL_NV_geometry_shader4 1 -#endif - -#ifndef GL_NV_parameter_buffer_object -#define GL_NV_parameter_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramBufferParametersfvNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); -GLAPI void APIENTRY glProgramBufferParametersIivNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); -GLAPI void APIENTRY glProgramBufferParametersIuivNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); -typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); -#endif - -#ifndef GL_EXT_draw_buffers2 -#define GL_EXT_draw_buffers2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -GLAPI void APIENTRY glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data); -GLAPI void APIENTRY glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data); -GLAPI void APIENTRY glEnableIndexedEXT (GLenum target, GLuint index); -GLAPI void APIENTRY glDisableIndexedEXT (GLenum target, GLuint index); -GLAPI GLboolean APIENTRY glIsEnabledIndexedEXT (GLenum target, GLuint index); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (APIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); -typedef void (APIENTRYP PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); -typedef void (APIENTRYP PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef GLboolean (APIENTRYP PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); -#endif - -#ifndef GL_NV_transform_feedback -#define GL_NV_transform_feedback 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginTransformFeedbackNV (GLenum primitiveMode); -GLAPI void APIENTRY glEndTransformFeedbackNV (void); -GLAPI void APIENTRY glTransformFeedbackAttribsNV (GLuint count, const GLint *attribs, GLenum bufferMode); -GLAPI void APIENTRY glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -GLAPI void APIENTRY glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer); -GLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); -GLAPI void APIENTRY glActiveVaryingNV (GLuint program, const GLchar *name); -GLAPI GLint APIENTRY glGetVaryingLocationNV (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location); -GLAPI void APIENTRY glTransformFeedbackStreamAttribsNV (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); -typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); -typedef void (APIENTRYP PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -typedef void (APIENTRYP PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); -typedef void (APIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); -#endif - -#ifndef GL_EXT_bindable_uniform -#define GL_EXT_bindable_uniform 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniformBufferEXT (GLuint program, GLint location, GLuint buffer); -GLAPI GLint APIENTRY glGetUniformBufferSizeEXT (GLuint program, GLint location); -GLAPI GLintptr APIENTRY glGetUniformOffsetEXT (GLuint program, GLint location); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); -typedef GLint (APIENTRYP PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); -typedef GLintptr (APIENTRYP PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); -#endif - -#ifndef GL_EXT_texture_integer -#define GL_EXT_texture_integer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha); -GLAPI void APIENTRY glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); -typedef void (APIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); -#endif - -#ifndef GL_GREMEDY_frame_terminator -#define GL_GREMEDY_frame_terminator 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFrameTerminatorGREMEDY (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFRAMETERMINATORGREMEDYPROC) (void); -#endif - -#ifndef GL_NV_conditional_render -#define GL_NV_conditional_render 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode); -GLAPI void APIENTRY glEndConditionalRenderNV (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); -typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void); -#endif - -#ifndef GL_NV_present_video -#define GL_NV_present_video 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPresentFrameKeyedNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); -GLAPI void APIENTRY glPresentFrameDualFillNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); -GLAPI void APIENTRY glGetVideoivNV (GLuint video_slot, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVideouivNV (GLuint video_slot, GLenum pname, GLuint *params); -GLAPI void APIENTRY glGetVideoi64vNV (GLuint video_slot, GLenum pname, GLint64EXT *params); -GLAPI void APIENTRY glGetVideoui64vNV (GLuint video_slot, GLenum pname, GLuint64EXT *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); -typedef void (APIENTRYP PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); -typedef void (APIENTRYP PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT *params); -typedef void (APIENTRYP PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT *params); -#endif - -#ifndef GL_EXT_transform_feedback -#define GL_EXT_transform_feedback 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginTransformFeedbackEXT (GLenum primitiveMode); -GLAPI void APIENTRY glEndTransformFeedbackEXT (void); -GLAPI void APIENTRY glBindBufferRangeEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glBindBufferOffsetEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -GLAPI void APIENTRY glBindBufferBaseEXT (GLenum target, GLuint index, GLuint buffer); -GLAPI void APIENTRY glTransformFeedbackVaryingsEXT (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); -GLAPI void APIENTRY glGetTransformFeedbackVaryingEXT (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); -typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); -typedef void (APIENTRYP PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -typedef void (APIENTRYP PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -#endif - -#ifndef GL_EXT_direct_state_access -#define GL_EXT_direct_state_access 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClientAttribDefaultEXT (GLbitfield mask); -GLAPI void APIENTRY glPushClientAttribDefaultEXT (GLbitfield mask); -GLAPI void APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glMatrixLoadIdentityEXT (GLenum mode); -GLAPI void APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI void APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI void APIENTRY glMatrixPopEXT (GLenum mode); -GLAPI void APIENTRY glMatrixPushEXT (GLenum mode); -GLAPI void APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glTextureParameterfEXT (GLuint texture, GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glTextureParameteriEXT (GLuint texture, GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void APIENTRY glCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void APIENTRY glCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetTextureImageEXT (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -GLAPI void APIENTRY glGetTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTextureLevelParameterfvEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTextureLevelParameterivEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI void APIENTRY glTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void APIENTRY glCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void APIENTRY glCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -GLAPI void APIENTRY glGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI void APIENTRY glMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture); -GLAPI void APIENTRY glEnableClientStateIndexedEXT (GLenum array, GLuint index); -GLAPI void APIENTRY glDisableClientStateIndexedEXT (GLenum array, GLuint index); -GLAPI void APIENTRY glMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); -GLAPI void APIENTRY glMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); -GLAPI void APIENTRY glMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); -GLAPI void APIENTRY glMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param); -GLAPI void APIENTRY glMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); -GLAPI void APIENTRY glGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat *data); -GLAPI void APIENTRY glGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble *data); -GLAPI void APIENTRY glGetPointerIndexedvEXT (GLenum target, GLuint index, GLvoid* *data); -GLAPI void APIENTRY glCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glGetCompressedTextureImageEXT (GLuint texture, GLenum target, GLint lod, GLvoid *img); -GLAPI void APIENTRY glCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint lod, GLvoid *img); -GLAPI void APIENTRY glNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid *string); -GLAPI void APIENTRY glNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble *params); -GLAPI void APIENTRY glNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat *params); -GLAPI void APIENTRY glGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, GLvoid *string); -GLAPI void APIENTRY glNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); -GLAPI void APIENTRY glNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint *params); -GLAPI void APIENTRY glNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); -GLAPI void APIENTRY glNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint *params); -GLAPI void APIENTRY glNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint *params); -GLAPI void APIENTRY glTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); -GLAPI void APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); -GLAPI void APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); -GLAPI void APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glNamedBufferDataEXT (GLuint buffer, GLsizeiptr size, const GLvoid *data, GLenum usage); -GLAPI void APIENTRY glNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid *data); -GLAPI GLvoid* APIENTRY glMapNamedBufferEXT (GLuint buffer, GLenum access); -GLAPI GLboolean APIENTRY glUnmapNamedBufferEXT (GLuint buffer); -GLAPI GLvoid* APIENTRY glMapNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -GLAPI void APIENTRY glFlushMappedNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length); -GLAPI void APIENTRY glNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -GLAPI void APIENTRY glGetNamedBufferParameterivEXT (GLuint buffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetNamedBufferPointervEXT (GLuint buffer, GLenum pname, GLvoid* *params); -GLAPI void APIENTRY glGetNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid *data); -GLAPI void APIENTRY glTextureBufferEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glNamedRenderbufferStorageEXT (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetNamedRenderbufferParameterivEXT (GLuint renderbuffer, GLenum pname, GLint *params); -GLAPI GLenum APIENTRY glCheckNamedFramebufferStatusEXT (GLuint framebuffer, GLenum target); -GLAPI void APIENTRY glNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -GLAPI void APIENTRY glNamedFramebufferRenderbufferEXT (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameterivEXT (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); -GLAPI void APIENTRY glGenerateTextureMipmapEXT (GLuint texture, GLenum target); -GLAPI void APIENTRY glGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target); -GLAPI void APIENTRY glFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode); -GLAPI void APIENTRY glFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum *bufs); -GLAPI void APIENTRY glFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode); -GLAPI void APIENTRY glGetFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleEXT (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glNamedFramebufferTextureEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glNamedFramebufferTextureLayerEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void APIENTRY glNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); -GLAPI void APIENTRY glTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glProgramUniform1dEXT (GLuint program, GLint location, GLdouble x); -GLAPI void APIENTRY glProgramUniform2dEXT (GLuint program, GLint location, GLdouble x, GLdouble y); -GLAPI void APIENTRY glProgramUniform3dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glProgramUniform4dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramUniform1dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform2dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform3dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform4dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -typedef void (APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -typedef void (APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); -typedef void (APIENTRYP PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); -typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); -typedef void (APIENTRYP PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); -typedef void (APIENTRYP PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); -typedef void (APIENTRYP PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat *data); -typedef void (APIENTRYP PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble *data); -typedef void (APIENTRYP PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLvoid* *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, GLvoid *img); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, GLvoid *img); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid *string); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, GLvoid *string); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint *params); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const GLvoid *data, GLenum usage); -typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid *data); -typedef GLvoid* (APIENTRYP PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); -typedef GLvoid* (APIENTRYP PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (APIENTRYP PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, GLvoid* *params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid *data); -typedef void (APIENTRYP PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint *params); -typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); -typedef void (APIENTRYP PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); -typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); -typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); -typedef void (APIENTRYP PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); -typedef void (APIENTRYP PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -#endif - -#ifndef GL_EXT_vertex_array_bgra -#define GL_EXT_vertex_array_bgra 1 -#endif - -#ifndef GL_EXT_texture_swizzle -#define GL_EXT_texture_swizzle 1 -#endif - -#ifndef GL_NV_explicit_multisample -#define GL_NV_explicit_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetMultisamplefvNV (GLenum pname, GLuint index, GLfloat *val); -GLAPI void APIENTRY glSampleMaskIndexedNV (GLuint index, GLbitfield mask); -GLAPI void APIENTRY glTexRenderbufferNV (GLenum target, GLuint renderbuffer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat *val); -typedef void (APIENTRYP PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); -typedef void (APIENTRYP PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); -#endif - -#ifndef GL_NV_transform_feedback2 -#define GL_NV_transform_feedback2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindTransformFeedbackNV (GLenum target, GLuint id); -GLAPI void APIENTRY glDeleteTransformFeedbacksNV (GLsizei n, const GLuint *ids); -GLAPI void APIENTRY glGenTransformFeedbacksNV (GLsizei n, GLuint *ids); -GLAPI GLboolean APIENTRY glIsTransformFeedbackNV (GLuint id); -GLAPI void APIENTRY glPauseTransformFeedbackNV (void); -GLAPI void APIENTRY glResumeTransformFeedbackNV (void); -GLAPI void APIENTRY glDrawTransformFeedbackNV (GLenum mode, GLuint id); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint *ids); -typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); -typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); -#endif - -#ifndef GL_ATI_meminfo -#define GL_ATI_meminfo 1 -#endif - -#ifndef GL_AMD_performance_monitor -#define GL_AMD_performance_monitor 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); -GLAPI void APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); -GLAPI void APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); -GLAPI void APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); -GLAPI void APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, GLvoid *data); -GLAPI void APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); -GLAPI void APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); -GLAPI void APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); -GLAPI void APIENTRY glBeginPerfMonitorAMD (GLuint monitor); -GLAPI void APIENTRY glEndPerfMonitorAMD (GLuint monitor); -GLAPI void APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); -typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, GLvoid *data); -typedef void (APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); -typedef void (APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); -typedef void (APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); -typedef void (APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); -typedef void (APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#endif - -#ifndef GL_AMD_texture_texture4 -#define GL_AMD_texture_texture4 1 -#endif - -#ifndef GL_AMD_vertex_shader_tesselator -#define GL_AMD_vertex_shader_tesselator 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTessellationFactorAMD (GLfloat factor); -GLAPI void APIENTRY glTessellationModeAMD (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); -typedef void (APIENTRYP PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_provoking_vertex -#define GL_EXT_provoking_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProvokingVertexEXT (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_texture_snorm -#define GL_EXT_texture_snorm 1 -#endif - -#ifndef GL_AMD_draw_buffers_blend -#define GL_AMD_draw_buffers_blend 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncIndexedAMD (GLuint buf, GLenum src, GLenum dst); -GLAPI void APIENTRY glBlendFuncSeparateIndexedAMD (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -GLAPI void APIENTRY glBlendEquationIndexedAMD (GLuint buf, GLenum mode); -GLAPI void APIENTRY glBlendEquationSeparateIndexedAMD (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (APIENTRYP PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -#endif - -#ifndef GL_APPLE_texture_range -#define GL_APPLE_texture_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureRangeAPPLE (GLenum target, GLsizei length, const GLvoid *pointer); -GLAPI void APIENTRY glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, GLvoid* *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, GLvoid* *params); -#endif - -#ifndef GL_APPLE_float_pixels -#define GL_APPLE_float_pixels 1 -#endif - -#ifndef GL_APPLE_vertex_program_evaluators -#define GL_APPLE_vertex_program_evaluators 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glEnableVertexAttribAPPLE (GLuint index, GLenum pname); -GLAPI void APIENTRY glDisableVertexAttribAPPLE (GLuint index, GLenum pname); -GLAPI GLboolean APIENTRY glIsVertexAttribEnabledAPPLE (GLuint index, GLenum pname); -GLAPI void APIENTRY glMapVertexAttrib1dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -GLAPI void APIENTRY glMapVertexAttrib1fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -GLAPI void APIENTRY glMapVertexAttrib2dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -GLAPI void APIENTRY glMapVertexAttrib2fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); -typedef GLboolean (APIENTRYP PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); -typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -#endif - -#ifndef GL_APPLE_aux_depth_stencil -#define GL_APPLE_aux_depth_stencil 1 -#endif - -#ifndef GL_APPLE_object_purgeable -#define GL_APPLE_object_purgeable 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLenum APIENTRY glObjectPurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); -GLAPI GLenum APIENTRY glObjectUnpurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); -GLAPI void APIENTRY glGetObjectParameterivAPPLE (GLenum objectType, GLuint name, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLenum (APIENTRYP PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); -typedef GLenum (APIENTRYP PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); -typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint *params); -#endif - -#ifndef GL_APPLE_row_bytes -#define GL_APPLE_row_bytes 1 -#endif - -#ifndef GL_APPLE_rgb_422 -#define GL_APPLE_rgb_422 1 -#endif - -#ifndef GL_NV_video_capture -#define GL_NV_video_capture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginVideoCaptureNV (GLuint video_capture_slot); -GLAPI void APIENTRY glBindVideoCaptureStreamBufferNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); -GLAPI void APIENTRY glBindVideoCaptureStreamTextureNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); -GLAPI void APIENTRY glEndVideoCaptureNV (GLuint video_capture_slot); -GLAPI void APIENTRY glGetVideoCaptureivNV (GLuint video_capture_slot, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVideoCaptureStreamivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVideoCaptureStreamfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVideoCaptureStreamdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); -GLAPI GLenum APIENTRY glVideoCaptureNV (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); -GLAPI void APIENTRY glVideoCaptureStreamParameterivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); -GLAPI void APIENTRY glVideoCaptureStreamParameterfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glVideoCaptureStreamParameterdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); -typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); -typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); -typedef void (APIENTRYP PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); -typedef void (APIENTRYP PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); -typedef GLenum (APIENTRYP PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); -typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); -#endif - -#ifndef GL_NV_copy_image -#define GL_NV_copy_image 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCopyImageSubDataNV (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); -#endif - -#ifndef GL_EXT_separate_shader_objects -#define GL_EXT_separate_shader_objects 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUseShaderProgramEXT (GLenum type, GLuint program); -GLAPI void APIENTRY glActiveProgramEXT (GLuint program); -GLAPI GLuint APIENTRY glCreateShaderProgramEXT (GLenum type, const GLchar *string); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); -typedef void (APIENTRYP PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar *string); -#endif - -#ifndef GL_NV_parameter_buffer_object2 -#define GL_NV_parameter_buffer_object2 1 -#endif - -#ifndef GL_NV_shader_buffer_load -#define GL_NV_shader_buffer_load 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMakeBufferResidentNV (GLenum target, GLenum access); -GLAPI void APIENTRY glMakeBufferNonResidentNV (GLenum target); -GLAPI GLboolean APIENTRY glIsBufferResidentNV (GLenum target); -GLAPI void APIENTRY glMakeNamedBufferResidentNV (GLuint buffer, GLenum access); -GLAPI void APIENTRY glMakeNamedBufferNonResidentNV (GLuint buffer); -GLAPI GLboolean APIENTRY glIsNamedBufferResidentNV (GLuint buffer); -GLAPI void APIENTRY glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT *params); -GLAPI void APIENTRY glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT *params); -GLAPI void APIENTRY glGetIntegerui64vNV (GLenum value, GLuint64EXT *result); -GLAPI void APIENTRY glUniformui64NV (GLint location, GLuint64EXT value); -GLAPI void APIENTRY glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT *params); -GLAPI void APIENTRY glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value); -GLAPI void APIENTRY glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); -typedef void (APIENTRYP PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); -typedef GLboolean (APIENTRYP PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); -typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); -typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); -typedef GLboolean (APIENTRYP PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT *result); -typedef void (APIENTRYP PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); -typedef void (APIENTRYP PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#endif - -#ifndef GL_NV_vertex_buffer_unified_memory -#define GL_NV_vertex_buffer_unified_memory 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); -GLAPI void APIENTRY glVertexFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glNormalFormatNV (GLenum type, GLsizei stride); -GLAPI void APIENTRY glColorFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glIndexFormatNV (GLenum type, GLsizei stride); -GLAPI void APIENTRY glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glEdgeFlagFormatNV (GLsizei stride); -GLAPI void APIENTRY glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glFogCoordFormatNV (GLenum type, GLsizei stride); -GLAPI void APIENTRY glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); -GLAPI void APIENTRY glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT *result); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); -typedef void (APIENTRYP PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); -typedef void (APIENTRYP PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result); -#endif - -#ifndef GL_NV_texture_barrier -#define GL_NV_texture_barrier 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureBarrierNV (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTUREBARRIERNVPROC) (void); -#endif - -#ifndef GL_AMD_shader_stencil_export -#define GL_AMD_shader_stencil_export 1 -#endif - -#ifndef GL_AMD_seamless_cubemap_per_texture -#define GL_AMD_seamless_cubemap_per_texture 1 -#endif - -#ifndef GL_AMD_conservative_depth -#define GL_AMD_conservative_depth 1 -#endif - -#ifndef GL_EXT_shader_image_load_store -#define GL_EXT_shader_image_load_store 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindImageTextureEXT (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); -GLAPI void APIENTRY glMemoryBarrierEXT (GLbitfield barriers); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); -typedef void (APIENTRYP PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); -#endif - -#ifndef GL_EXT_vertex_attrib_64bit -#define GL_EXT_vertex_attrib_64bit 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribL1dEXT (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttribL2dEXT (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttribL3dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttribL4dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttribL1dvEXT (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL2dvEXT (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL3dvEXT (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL4dvEXT (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribLPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glGetVertexAttribLdvEXT (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glVertexArrayVertexAttribLOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -#endif - -#ifndef GL_NV_gpu_program5 -#define GL_NV_gpu_program5 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramSubroutineParametersuivNV (GLenum target, GLsizei count, const GLuint *params); -GLAPI void APIENTRY glGetProgramSubroutineParameteruivNV (GLenum target, GLuint index, GLuint *param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC) (GLenum target, GLsizei count, const GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC) (GLenum target, GLuint index, GLuint *param); -#endif - -#ifndef GL_NV_gpu_shader5 -#define GL_NV_gpu_shader5 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniform1i64NV (GLint location, GLint64EXT x); -GLAPI void APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y); -GLAPI void APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -GLAPI void APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -GLAPI void APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x); -GLAPI void APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y); -GLAPI void APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -GLAPI void APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -GLAPI void APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params); -GLAPI void APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x); -GLAPI void APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); -GLAPI void APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -GLAPI void APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -GLAPI void APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x); -GLAPI void APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); -GLAPI void APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -GLAPI void APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -GLAPI void APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); -typedef void (APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); -typedef void (APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); -typedef void (APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#endif - -#ifndef GL_NV_shader_buffer_store -#define GL_NV_shader_buffer_store 1 -#endif - -#ifndef GL_NV_tessellation_program5 -#define GL_NV_tessellation_program5 1 -#endif - -#ifndef GL_NV_vertex_attrib_integer_64bit -#define GL_NV_vertex_attrib_integer_64bit 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribL1i64NV (GLuint index, GLint64EXT x); -GLAPI void APIENTRY glVertexAttribL2i64NV (GLuint index, GLint64EXT x, GLint64EXT y); -GLAPI void APIENTRY glVertexAttribL3i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); -GLAPI void APIENTRY glVertexAttribL4i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -GLAPI void APIENTRY glVertexAttribL1i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL2i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL3i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL4i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL1ui64NV (GLuint index, GLuint64EXT x); -GLAPI void APIENTRY glVertexAttribL2ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y); -GLAPI void APIENTRY glVertexAttribL3ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -GLAPI void APIENTRY glVertexAttribL4ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -GLAPI void APIENTRY glVertexAttribL1ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glVertexAttribL2ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glVertexAttribL3ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glVertexAttribL4ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glGetVertexAttribLi64vNV (GLuint index, GLenum pname, GLint64EXT *params); -GLAPI void APIENTRY glGetVertexAttribLui64vNV (GLuint index, GLenum pname, GLuint64EXT *params); -GLAPI void APIENTRY glVertexAttribLFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); -#endif - -#ifndef GL_NV_multisample_coverage -#define GL_NV_multisample_coverage 1 -#endif - -#ifndef GL_AMD_name_gen_delete -#define GL_AMD_name_gen_delete 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenNamesAMD (GLenum identifier, GLuint num, GLuint *names); -GLAPI void APIENTRY glDeleteNamesAMD (GLenum identifier, GLuint num, const GLuint *names); -GLAPI GLboolean APIENTRY glIsNameAMD (GLenum identifier, GLuint name); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint *names); -typedef void (APIENTRYP PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint *names); -typedef GLboolean (APIENTRYP PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); -#endif - -#ifndef GL_AMD_debug_output -#define GL_AMD_debug_output 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDebugMessageEnableAMD (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GLAPI void APIENTRY glDebugMessageInsertAMD (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); -GLAPI void APIENTRY glDebugMessageCallbackAMD (GLDEBUGPROCAMD callback, GLvoid *userParam); -GLAPI GLuint APIENTRY glGetDebugMessageLogAMD (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); -typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, GLvoid *userParam); -typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); -#endif - -#ifndef GL_NV_vdpau_interop -#define GL_NV_vdpau_interop 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVDPAUInitNV (const GLvoid *vdpDevice, const GLvoid *getProcAddress); -GLAPI void APIENTRY glVDPAUFiniNV (void); -GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceNV (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterOutputSurfaceNV (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -GLAPI void APIENTRY glVDPAUIsSurfaceNV (GLvdpauSurfaceNV surface); -GLAPI void APIENTRY glVDPAUUnregisterSurfaceNV (GLvdpauSurfaceNV surface); -GLAPI void APIENTRY glVDPAUGetSurfaceivNV (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -GLAPI void APIENTRY glVDPAUSurfaceAccessNV (GLvdpauSurfaceNV surface, GLenum access); -GLAPI void APIENTRY glVDPAUMapSurfacesNV (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); -GLAPI void APIENTRY glVDPAUUnmapSurfacesNV (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVDPAUINITNVPROC) (const GLvoid *vdpDevice, const GLvoid *getProcAddress); -typedef void (APIENTRYP PFNGLVDPAUFININVPROC) (void); -typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -typedef void (APIENTRYP PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); -typedef void (APIENTRYP PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); -typedef void (APIENTRYP PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -typedef void (APIENTRYP PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); -typedef void (APIENTRYP PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); -typedef void (APIENTRYP PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); -#endif - -#ifndef GL_AMD_transform_feedback3_lines_triangles -#define GL_AMD_transform_feedback3_lines_triangles 1 -#endif - - -#ifdef __cplusplus -} -#endif - -#endif -#endif /* NO_SDL_GLEXT */ +#endif /* __gl_h_ */ #endif /* !__IPHONEOS__ */ diff --git a/lib/SDL2/include/SDL_opengl_glext.h b/lib/SDL2/include/SDL_opengl_glext.h new file mode 100644 index 0000000000..cd3869fe7f --- /dev/null +++ b/lib/SDL2/include/SDL_opengl_glext.h @@ -0,0 +1,11177 @@ +#ifndef __glext_h_ +#define __glext_h_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2013-2014 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ +/* +** This header is generated from the Khronos OpenGL / OpenGL ES XML +** API Registry. The current version of the Registry, generator scripts +** used to make the header, and the header can be found at +** http://www.opengl.org/registry/ +** +** Khronos $Revision: 26745 $ on $Date: 2014-05-21 03:12:26 -0700 (Wed, 21 May 2014) $ +*/ + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +#define GL_GLEXT_VERSION 20140521 + +/* Generated C header for: + * API: gl + * Profile: compatibility + * Versions considered: .* + * Versions emitted: 1\.[2-9]|[234]\.[0-9] + * Default extensions included: gl + * Additional extensions included: _nomatch_^ + * Extensions removed: _nomatch_^ + */ + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_RESCALE_NORMAL 0x803A +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif +#endif /* GL_VERSION_1_2 */ + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTexture (GLenum texture); +GLAPI void APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); +GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, void *img); +GLAPI void APIENTRY glClientActiveTexture (GLenum texture); +GLAPI void APIENTRY glMultiTexCoord1d (GLenum target, GLdouble s); +GLAPI void APIENTRY glMultiTexCoord1dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord1f (GLenum target, GLfloat s); +GLAPI void APIENTRY glMultiTexCoord1fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord1i (GLenum target, GLint s); +GLAPI void APIENTRY glMultiTexCoord1iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord1s (GLenum target, GLshort s); +GLAPI void APIENTRY glMultiTexCoord1sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t); +GLAPI void APIENTRY glMultiTexCoord2dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t); +GLAPI void APIENTRY glMultiTexCoord2fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord2i (GLenum target, GLint s, GLint t); +GLAPI void APIENTRY glMultiTexCoord2iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord2s (GLenum target, GLshort s, GLshort t); +GLAPI void APIENTRY glMultiTexCoord2sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void APIENTRY glMultiTexCoord3dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void APIENTRY glMultiTexCoord3fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r); +GLAPI void APIENTRY glMultiTexCoord3iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void APIENTRY glMultiTexCoord3sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void APIENTRY glMultiTexCoord4dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void APIENTRY glMultiTexCoord4fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void APIENTRY glMultiTexCoord4iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void APIENTRY glMultiTexCoord4sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *m); +GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *m); +GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *m); +GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *m); +#endif +#endif /* GL_VERSION_1_3 */ + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); +GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param); +GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params); +GLAPI void APIENTRY glFogCoordf (GLfloat coord); +GLAPI void APIENTRY glFogCoordfv (const GLfloat *coord); +GLAPI void APIENTRY glFogCoordd (GLdouble coord); +GLAPI void APIENTRY glFogCoorddv (const GLdouble *coord); +GLAPI void APIENTRY glFogCoordPointer (GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *v); +GLAPI void APIENTRY glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *v); +GLAPI void APIENTRY glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *v); +GLAPI void APIENTRY glSecondaryColor3i (GLint red, GLint green, GLint blue); +GLAPI void APIENTRY glSecondaryColor3iv (const GLint *v); +GLAPI void APIENTRY glSecondaryColor3s (GLshort red, GLshort green, GLshort blue); +GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *v); +GLAPI void APIENTRY glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *v); +GLAPI void APIENTRY glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue); +GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *v); +GLAPI void APIENTRY glSecondaryColor3us (GLushort red, GLushort green, GLushort blue); +GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *v); +GLAPI void APIENTRY glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glWindowPos2d (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dv (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2f (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fv (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2i (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2iv (const GLint *v); +GLAPI void APIENTRY glWindowPos2s (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2sv (const GLshort *v); +GLAPI void APIENTRY glWindowPos3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dv (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fv (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3i (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3iv (const GLint *v); +GLAPI void APIENTRY glWindowPos3s (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3sv (const GLshort *v); +GLAPI void APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void APIENTRY glBlendEquation (GLenum mode); +#endif +#endif /* GL_VERSION_1_4 */ + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 +#include +#ifdef __MACOSX__ +typedef long GLsizeiptr; +typedef long GLintptr; +#else +typedef ptrdiff_t GLsizeiptr; +typedef ptrdiff_t GLintptr; +#endif +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 +#define GL_SRC1_ALPHA 0x8589 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_FOG_COORD_SRC 0x8450 +#define GL_FOG_COORD 0x8451 +#define GL_CURRENT_FOG_COORD 0x8453 +#define GL_FOG_COORD_ARRAY_TYPE 0x8454 +#define GL_FOG_COORD_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORD_ARRAY_POINTER 0x8456 +#define GL_FOG_COORD_ARRAY 0x8457 +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D +#define GL_SRC0_RGB 0x8580 +#define GL_SRC1_RGB 0x8581 +#define GL_SRC2_RGB 0x8582 +#define GL_SRC0_ALPHA 0x8588 +#define GL_SRC2_ALPHA 0x858A +typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void *data); +typedef void *(APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsQuery (GLuint id); +GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id); +GLAPI void APIENTRY glEndQuery (GLenum target); +GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); +GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); +GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); +GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer); +GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, void *data); +GLAPI void *APIENTRY glMapBuffer (GLenum target, GLenum access); +GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target); +GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params); +#endif +#endif /* GL_VERSION_1_5 */ + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 +typedef char GLchar; +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_TEXTURE_COORDS 0x8871 +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); +GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); +GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); +GLAPI void APIENTRY glCompileShader (GLuint shader); +GLAPI GLuint APIENTRY glCreateProgram (void); +GLAPI GLuint APIENTRY glCreateShader (GLenum type); +GLAPI void APIENTRY glDeleteProgram (GLuint program); +GLAPI void APIENTRY glDeleteShader (GLuint shader); +GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); +GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); +GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); +GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); +GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); +GLAPI GLboolean APIENTRY glIsProgram (GLuint program); +GLAPI GLboolean APIENTRY glIsShader (GLuint shader); +GLAPI void APIENTRY glLinkProgram (GLuint program); +GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +GLAPI void APIENTRY glUseProgram (GLuint program); +GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0); +GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); +GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glValidateProgram (GLuint program); +GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +#endif +#endif /* GL_VERSION_2_0 */ + +#ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#endif +#endif /* GL_VERSION_2_1 */ + +#ifndef GL_VERSION_3_0 +#define GL_VERSION_3_0 1 +typedef unsigned short GLhalf; +#define GL_COMPARE_REF_TO_TEXTURE 0x884E +#define GL_CLIP_DISTANCE0 0x3000 +#define GL_CLIP_DISTANCE1 0x3001 +#define GL_CLIP_DISTANCE2 0x3002 +#define GL_CLIP_DISTANCE3 0x3003 +#define GL_CLIP_DISTANCE4 0x3004 +#define GL_CLIP_DISTANCE5 0x3005 +#define GL_CLIP_DISTANCE6 0x3006 +#define GL_CLIP_DISTANCE7 0x3007 +#define GL_MAX_CLIP_DISTANCES 0x0D32 +#define GL_MAJOR_VERSION 0x821B +#define GL_MINOR_VERSION 0x821C +#define GL_NUM_EXTENSIONS 0x821D +#define GL_CONTEXT_FLAGS 0x821E +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RG 0x8226 +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 +#define GL_RGBA32F 0x8814 +#define GL_RGB32F 0x8815 +#define GL_RGBA16F 0x881A +#define GL_RGB16F 0x881B +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_FIXED_ONLY 0x891D +#define GL_MAX_VARYING_COMPONENTS 0x8B4B +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_RGB9_E5 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_RGBA32UI 0x8D70 +#define GL_RGB32UI 0x8D71 +#define GL_RGBA16UI 0x8D76 +#define GL_RGB16UI 0x8D77 +#define GL_RGBA8UI 0x8D7C +#define GL_RGB8UI 0x8D7D +#define GL_RGBA32I 0x8D82 +#define GL_RGB32I 0x8D83 +#define GL_RGBA16I 0x8D88 +#define GL_RGB16I 0x8D89 +#define GL_RGBA8I 0x8D8E +#define GL_RGB8I 0x8D8F +#define GL_RED_INTEGER 0x8D94 +#define GL_GREEN_INTEGER 0x8D95 +#define GL_BLUE_INTEGER 0x8D96 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_BGR_INTEGER 0x8D9A +#define GL_BGRA_INTEGER 0x8D9B +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_QUERY_WAIT 0x8E13 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT9 0x8CE9 +#define GL_COLOR_ATTACHMENT10 0x8CEA +#define GL_COLOR_ATTACHMENT11 0x8CEB +#define GL_COLOR_ATTACHMENT12 0x8CEC +#define GL_COLOR_ATTACHMENT13 0x8CED +#define GL_COLOR_ATTACHMENT14 0x8CEE +#define GL_COLOR_ATTACHMENT15 0x8CEF +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_STENCIL_INDEX1 0x8D46 +#define GL_STENCIL_INDEX4 0x8D47 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_INDEX16 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_MAX_SAMPLES 0x8D57 +#define GL_INDEX 0x8222 +#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 +#define GL_FRAMEBUFFER_SRGB 0x8DB9 +#define GL_HALF_FLOAT 0x140B +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE +#define GL_RG 0x8227 +#define GL_RG_INTEGER 0x8228 +#define GL_R8 0x8229 +#define GL_R16 0x822A +#define GL_RG8 0x822B +#define GL_RG16 0x822C +#define GL_R16F 0x822D +#define GL_R32F 0x822E +#define GL_RG16F 0x822F +#define GL_RG32F 0x8230 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C +#define GL_VERTEX_ARRAY_BINDING 0x85B5 +#define GL_CLAMP_VERTEX_COLOR 0x891A +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_ALPHA_INTEGER 0x8D97 +typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); +typedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); +typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void *(APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data); +GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); +GLAPI void APIENTRY glEnablei (GLenum target, GLuint index); +GLAPI void APIENTRY glDisablei (GLenum target, GLuint index); +GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index); +GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedback (void); +GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp); +GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode); +GLAPI void APIENTRY glEndConditionalRender (void); +GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); +GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x); +GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y); +GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x); +GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y); +GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); +GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0); +GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); +GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); +GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); +GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +GLAPI const GLubyte *APIENTRY glGetStringi (GLenum name, GLuint index); +GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer); +GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); +GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer); +GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); +GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); +GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); +GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target); +GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateMipmap (GLenum target); +GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void *APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glBindVertexArray (GLuint array); +GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); +GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); +GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array); +#endif +#endif /* GL_VERSION_3_0 */ + +#ifndef GL_VERSION_3_1 +#define GL_VERSION_3_1 1 +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_INVALID_INDEX 0xFFFFFFFFu +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); +typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index); +typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); +GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index); +GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); +GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +#endif +#endif /* GL_VERSION_3_1 */ + +#ifndef GL_VERSION_3_2 +#define GL_VERSION_3_2 1 +typedef struct __GLsync *GLsync; +#ifndef GLEXT_64_TYPES_DEFINED +/* This code block is duplicated in glxext.h, so must be protected */ +#define GLEXT_64_TYPES_DEFINED +/* Define int32_t, int64_t, and uint64_t types for UST/MSC */ +/* (as used in the GL_EXT_timer_query extension). */ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +#elif defined(__sun__) || defined(__digital__) +#include +#if defined(__STDC__) +#if defined(__arch64__) || defined(_LP64) +typedef long int int64_t; +typedef unsigned long int uint64_t; +#else +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +#endif /* __arch64__ */ +#endif /* __STDC__ */ +#elif defined( __VMS ) || defined(__sgi) +#include +#elif defined(__SCO__) || defined(__USLC__) +#include +#elif defined(__UNIXOS2__) || defined(__SOL64__) +typedef long int int32_t; +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +#elif defined(_WIN32) && defined(__GNUC__) +#include +#elif defined(_WIN32) +typedef __int32 int32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else +/* Fallback if nothing above works */ +#include +#endif +#endif +typedef uint64_t GLuint64; +typedef int64_t GLint64; +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_CONTEXT_PROFILE_MASK 0x9126 +#define GL_DEPTH_CLAMP 0x864F +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_PROVOKING_VERTEX 0x8E4F +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_OBJECT_TYPE 0x9112 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_STATUS 0x9114 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_UNSIGNALED 0x9118 +#define GL_SIGNALED 0x9119 +#define GL_ALREADY_SIGNALED 0x911A +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_CONDITION_SATISFIED 0x911C +#define GL_WAIT_FAILED 0x911D +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_INTEGER_SAMPLES 0x9110 +typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode); +typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); +typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync); +typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); +typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data); +typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +GLAPI void APIENTRY glProvokingVertex (GLenum mode); +GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags); +GLAPI GLboolean APIENTRY glIsSync (GLsync sync); +GLAPI void APIENTRY glDeleteSync (GLsync sync); +GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *data); +GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); +GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); +GLAPI void APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask); +#endif +#endif /* GL_VERSION_3_2 */ + +#ifndef GL_VERSION_3_3 +#define GL_VERSION_3_3 1 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +#define GL_SRC1_COLOR 0x88F9 +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC +#define GL_ANY_SAMPLES_PASSED 0x8C2F +#define GL_SAMPLER_BINDING 0x8919 +#define GL_RGB10_A2UI 0x906F +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 +#define GL_TIME_ELAPSED 0x88BF +#define GL_TIMESTAMP 0x8E28 +#define GL_INT_2_10_10_10_REV 0x8D9F +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); +typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); +typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); +typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); +GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); +GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler); +GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); +GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); +GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); +GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); +GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param); +GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param); +GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params); +GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target); +GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params); +GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); +GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color); +GLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color); +GLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color); +GLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color); +#endif +#endif /* GL_VERSION_3_3 */ + +#ifndef GL_VERSION_4_0 +#define GL_VERSION_4_0 1 +#define GL_SAMPLE_SHADING 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D +#define GL_MAX_VERTEX_STREAMS 0x8E71 +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_MAT2x3 0x8F49 +#define GL_DOUBLE_MAT2x4 0x8F4A +#define GL_DOUBLE_MAT3x2 0x8F4B +#define GL_DOUBLE_MAT3x4 0x8F4C +#define GL_DOUBLE_MAT4x2 0x8F4D +#define GL_DOUBLE_MAT4x3 0x8F4E +#define GL_ACTIVE_SUBROUTINES 0x8DE5 +#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 +#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 +#define GL_MAX_SUBROUTINES 0x8DE7 +#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 +#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A +#define GL_COMPATIBLE_SUBROUTINES 0x8E4B +#define GL_PATCHES 0x000E +#define GL_PATCH_VERTICES 0x8E72 +#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 +#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 +#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 +#define GL_TESS_GEN_MODE 0x8E76 +#define GL_TESS_GEN_SPACING 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 +#define GL_TESS_GEN_POINT_MODE 0x8E79 +#define GL_ISOLINES 0x8E7A +#define GL_FRACTIONAL_ODD 0x8E7B +#define GL_FRACTIONAL_EVEN 0x8E7C +#define GL_MAX_PATCH_VERTICES 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 +#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 +typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value); +typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); +typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); +typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params); +typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices); +typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); +typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values); +typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); +typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); +typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); +typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMinSampleShading (GLfloat value); +GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect); +GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect); +GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x); +GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y); +GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params); +GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name); +GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name); +GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices); +GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params); +GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values); +GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value); +GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values); +GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); +GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); +GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id); +GLAPI void APIENTRY glPauseTransformFeedback (void); +GLAPI void APIENTRY glResumeTransformFeedback (void); +GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id); +GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream); +GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id); +GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index); +GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params); +#endif +#endif /* GL_VERSION_4_0 */ + +#ifndef GL_VERSION_4_1 +#define GL_VERSION_4_1 1 +#define GL_FIXED 0x140C +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_RGB565 0x8D62 +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_PROGRAM_BINARY_FORMATS 0x87FF +#define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT 0x00000002 +#define GL_GEOMETRY_SHADER_BIT 0x00000004 +#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 +#define GL_ALL_SHADER_BITS 0xFFFFFFFF +#define GL_PROGRAM_SEPARABLE 0x8258 +#define GL_ACTIVE_PROGRAM 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING 0x825A +#define GL_MAX_VIEWPORTS 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE 0x825D +#define GL_LAYER_PROVOKING_VERTEX 0x825E +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F +#define GL_UNDEFINED_VERTEX 0x8260 +typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); +typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); +typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); +typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d); +typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings); +typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); +typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v); +typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLdouble n, GLdouble f); +typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReleaseShaderCompiler (void); +GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); +GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +GLAPI void APIENTRY glDepthRangef (GLfloat n, GLfloat f); +GLAPI void APIENTRY glClearDepthf (GLfloat d); +GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); +GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program); +GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program); +GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings); +GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines); +GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines); +GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params); +GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0); +GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0); +GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0); +GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0); +GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1); +GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v); +GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v); +GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f); +GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data); +GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data); +#endif +#endif /* GL_VERSION_4_1 */ + +#ifndef GL_VERSION_4_2 +#define GL_VERSION_4_2 1 +#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 +#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 +#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 +#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A +#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B +#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C +#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D +#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E +#define GL_NUM_SAMPLE_COUNTS 0x9380 +#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC +#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 +#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 +#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 +#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 +#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB +#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF +#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 +#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 +#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 +#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 +#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC +#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 +#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA +#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 +#define GL_COMMAND_BARRIER_BIT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 +#define GL_ALL_BARRIER_BITS 0xFFFFFFFF +#define GL_MAX_IMAGE_UNITS 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 +#define GL_IMAGE_BINDING_NAME 0x8F3A +#define GL_IMAGE_BINDING_LEVEL 0x8F3B +#define GL_IMAGE_BINDING_LAYERED 0x8F3C +#define GL_IMAGE_BINDING_LAYER 0x8F3D +#define GL_IMAGE_BINDING_ACCESS 0x8F3E +#define GL_IMAGE_1D 0x904C +#define GL_IMAGE_2D 0x904D +#define GL_IMAGE_3D 0x904E +#define GL_IMAGE_2D_RECT 0x904F +#define GL_IMAGE_CUBE 0x9050 +#define GL_IMAGE_BUFFER 0x9051 +#define GL_IMAGE_1D_ARRAY 0x9052 +#define GL_IMAGE_2D_ARRAY 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 +#define GL_INT_IMAGE_1D 0x9057 +#define GL_INT_IMAGE_2D 0x9058 +#define GL_INT_IMAGE_3D 0x9059 +#define GL_INT_IMAGE_2D_RECT 0x905A +#define GL_INT_IMAGE_CUBE 0x905B +#define GL_INT_IMAGE_BUFFER 0x905C +#define GL_INT_IMAGE_1D_ARRAY 0x905D +#define GL_INT_IMAGE_2D_ARRAY 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C +#define GL_MAX_IMAGE_SAMPLES 0x906D +#define GL_IMAGE_BINDING_FORMAT 0x906E +#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 +#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD +#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE +#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF +#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F +#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); +typedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei instancecount); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +GLAPI void APIENTRY glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +GLAPI void APIENTRY glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +GLAPI void APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); +GLAPI void APIENTRY glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); +GLAPI void APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +GLAPI void APIENTRY glMemoryBarrier (GLbitfield barriers); +GLAPI void APIENTRY glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount); +GLAPI void APIENTRY glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); +#endif +#endif /* GL_VERSION_4_2 */ + +#ifndef GL_VERSION_4_3 +#define GL_VERSION_4_3 1 +typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 +#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E +#define GL_COMPRESSED_RGB8_ETC2 0x9274 +#define GL_COMPRESSED_SRGB8_ETC2 0x9275 +#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 +#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 +#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 +#define GL_COMPRESSED_R11_EAC 0x9270 +#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 +#define GL_COMPRESSED_RG11_EAC 0x9272 +#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A +#define GL_MAX_ELEMENT_INDEX 0x8D6B +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB +#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC +#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD +#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 +#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 +#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 +#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 +#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF +#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED +#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE +#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 +#define GL_DEBUG_SOURCE_API 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION 0x824A +#define GL_DEBUG_SOURCE_OTHER 0x824B +#define GL_DEBUG_TYPE_ERROR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_LOW 0x9148 +#define GL_DEBUG_TYPE_MARKER 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D +#define GL_BUFFER 0x82E0 +#define GL_SHADER 0x82E1 +#define GL_PROGRAM 0x82E2 +#define GL_QUERY 0x82E3 +#define GL_PROGRAM_PIPELINE 0x82E4 +#define GL_SAMPLER 0x82E6 +#define GL_MAX_LABEL_LENGTH 0x82E8 +#define GL_DEBUG_OUTPUT 0x92E0 +#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 +#define GL_MAX_UNIFORM_LOCATIONS 0x826E +#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 +#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 +#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 +#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 +#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 +#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 +#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 +#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 +#define GL_INTERNALFORMAT_SUPPORTED 0x826F +#define GL_INTERNALFORMAT_PREFERRED 0x8270 +#define GL_INTERNALFORMAT_RED_SIZE 0x8271 +#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 +#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 +#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 +#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 +#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 +#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 +#define GL_INTERNALFORMAT_RED_TYPE 0x8278 +#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 +#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A +#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B +#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C +#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D +#define GL_MAX_WIDTH 0x827E +#define GL_MAX_HEIGHT 0x827F +#define GL_MAX_DEPTH 0x8280 +#define GL_MAX_LAYERS 0x8281 +#define GL_MAX_COMBINED_DIMENSIONS 0x8282 +#define GL_COLOR_COMPONENTS 0x8283 +#define GL_DEPTH_COMPONENTS 0x8284 +#define GL_STENCIL_COMPONENTS 0x8285 +#define GL_COLOR_RENDERABLE 0x8286 +#define GL_DEPTH_RENDERABLE 0x8287 +#define GL_STENCIL_RENDERABLE 0x8288 +#define GL_FRAMEBUFFER_RENDERABLE 0x8289 +#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A +#define GL_FRAMEBUFFER_BLEND 0x828B +#define GL_READ_PIXELS 0x828C +#define GL_READ_PIXELS_FORMAT 0x828D +#define GL_READ_PIXELS_TYPE 0x828E +#define GL_TEXTURE_IMAGE_FORMAT 0x828F +#define GL_TEXTURE_IMAGE_TYPE 0x8290 +#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 +#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 +#define GL_MIPMAP 0x8293 +#define GL_MANUAL_GENERATE_MIPMAP 0x8294 +#define GL_AUTO_GENERATE_MIPMAP 0x8295 +#define GL_COLOR_ENCODING 0x8296 +#define GL_SRGB_READ 0x8297 +#define GL_SRGB_WRITE 0x8298 +#define GL_FILTER 0x829A +#define GL_VERTEX_TEXTURE 0x829B +#define GL_TESS_CONTROL_TEXTURE 0x829C +#define GL_TESS_EVALUATION_TEXTURE 0x829D +#define GL_GEOMETRY_TEXTURE 0x829E +#define GL_FRAGMENT_TEXTURE 0x829F +#define GL_COMPUTE_TEXTURE 0x82A0 +#define GL_TEXTURE_SHADOW 0x82A1 +#define GL_TEXTURE_GATHER 0x82A2 +#define GL_TEXTURE_GATHER_SHADOW 0x82A3 +#define GL_SHADER_IMAGE_LOAD 0x82A4 +#define GL_SHADER_IMAGE_STORE 0x82A5 +#define GL_SHADER_IMAGE_ATOMIC 0x82A6 +#define GL_IMAGE_TEXEL_SIZE 0x82A7 +#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 +#define GL_IMAGE_PIXEL_FORMAT 0x82A9 +#define GL_IMAGE_PIXEL_TYPE 0x82AA +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF +#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 +#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 +#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 +#define GL_CLEAR_BUFFER 0x82B4 +#define GL_TEXTURE_VIEW 0x82B5 +#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 +#define GL_FULL_SUPPORT 0x82B7 +#define GL_CAVEAT_SUPPORT 0x82B8 +#define GL_IMAGE_CLASS_4_X_32 0x82B9 +#define GL_IMAGE_CLASS_2_X_32 0x82BA +#define GL_IMAGE_CLASS_1_X_32 0x82BB +#define GL_IMAGE_CLASS_4_X_16 0x82BC +#define GL_IMAGE_CLASS_2_X_16 0x82BD +#define GL_IMAGE_CLASS_1_X_16 0x82BE +#define GL_IMAGE_CLASS_4_X_8 0x82BF +#define GL_IMAGE_CLASS_2_X_8 0x82C0 +#define GL_IMAGE_CLASS_1_X_8 0x82C1 +#define GL_IMAGE_CLASS_11_11_10 0x82C2 +#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 +#define GL_VIEW_CLASS_128_BITS 0x82C4 +#define GL_VIEW_CLASS_96_BITS 0x82C5 +#define GL_VIEW_CLASS_64_BITS 0x82C6 +#define GL_VIEW_CLASS_48_BITS 0x82C7 +#define GL_VIEW_CLASS_32_BITS 0x82C8 +#define GL_VIEW_CLASS_24_BITS 0x82C9 +#define GL_VIEW_CLASS_16_BITS 0x82CA +#define GL_VIEW_CLASS_8_BITS 0x82CB +#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC +#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD +#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE +#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF +#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 +#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 +#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 +#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 +#define GL_UNIFORM 0x92E1 +#define GL_UNIFORM_BLOCK 0x92E2 +#define GL_PROGRAM_INPUT 0x92E3 +#define GL_PROGRAM_OUTPUT 0x92E4 +#define GL_BUFFER_VARIABLE 0x92E5 +#define GL_SHADER_STORAGE_BLOCK 0x92E6 +#define GL_VERTEX_SUBROUTINE 0x92E8 +#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 +#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA +#define GL_GEOMETRY_SUBROUTINE 0x92EB +#define GL_FRAGMENT_SUBROUTINE 0x92EC +#define GL_COMPUTE_SUBROUTINE 0x92ED +#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE +#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF +#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 +#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 +#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 +#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 +#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 +#define GL_ACTIVE_RESOURCES 0x92F5 +#define GL_MAX_NAME_LENGTH 0x92F6 +#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 +#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 +#define GL_NAME_LENGTH 0x92F9 +#define GL_TYPE 0x92FA +#define GL_ARRAY_SIZE 0x92FB +#define GL_OFFSET 0x92FC +#define GL_BLOCK_INDEX 0x92FD +#define GL_ARRAY_STRIDE 0x92FE +#define GL_MATRIX_STRIDE 0x92FF +#define GL_IS_ROW_MAJOR 0x9300 +#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 +#define GL_BUFFER_BINDING 0x9302 +#define GL_BUFFER_DATA_SIZE 0x9303 +#define GL_NUM_ACTIVE_VARIABLES 0x9304 +#define GL_ACTIVE_VARIABLES 0x9305 +#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 +#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 +#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A +#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B +#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C +#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D +#define GL_LOCATION 0x930E +#define GL_LOCATION_INDEX 0x930F +#define GL_IS_PER_PATCH 0x92E7 +#define GL_SHADER_STORAGE_BUFFER 0x90D2 +#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 +#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 +#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 +#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 +#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA +#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB +#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC +#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD +#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE +#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF +#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 +#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 +#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA +#define GL_TEXTURE_BUFFER_OFFSET 0x919D +#define GL_TEXTURE_BUFFER_SIZE 0x919E +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F +#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF +#define GL_VERTEX_ATTRIB_BINDING 0x82D4 +#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 +#define GL_VERTEX_BINDING_DIVISOR 0x82D6 +#define GL_VERTEX_BINDING_OFFSET 0x82D7 +#define GL_VERTEX_BINDING_STRIDE 0x82D8 +#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 +#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_VERTEX_BINDING_BUFFER 0x8F4F +#define GL_DISPLAY_LIST 0x82E7 +typedef void (APIENTRYP PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); +typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); +typedef void (APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); +typedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); +typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); +typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +typedef void (APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +typedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); +typedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void); +typedef void (APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +GLAPI void APIENTRY glDispatchComputeIndirect (GLintptr indirect); +GLAPI void APIENTRY glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +GLAPI void APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); +GLAPI void APIENTRY glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glInvalidateTexImage (GLuint texture, GLint level); +GLAPI void APIENTRY glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glInvalidateBufferData (GLuint buffer); +GLAPI void APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments); +GLAPI void APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +GLAPI void APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params); +GLAPI GLuint APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI void APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); +GLAPI GLint APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI GLint APIENTRY glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI void APIENTRY glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +GLAPI void APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +GLAPI void APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI void APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex); +GLAPI void APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor); +GLAPI void APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +GLAPI void APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message); +GLAPI void APIENTRY glPopDebugGroup (void); +GLAPI void APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +GLAPI void APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +#endif +#endif /* GL_VERSION_4_3 */ + +#ifndef GL_VERSION_4_4 +#define GL_VERSION_4_4 1 +#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 +#define GL_TEXTURE_BUFFER_BINDING 0x8C2A +#define GL_MAP_PERSISTENT_BIT 0x0040 +#define GL_MAP_COHERENT_BIT 0x0080 +#define GL_DYNAMIC_STORAGE_BIT 0x0100 +#define GL_CLIENT_STORAGE_BIT 0x0200 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 +#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F +#define GL_BUFFER_STORAGE_FLAGS 0x8220 +#define GL_CLEAR_TEXTURE 0x9365 +#define GL_LOCATION_COMPONENT 0x934A +#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B +#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C +#define GL_QUERY_BUFFER 0x9192 +#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 +#define GL_QUERY_BUFFER_BINDING 0x9193 +#define GL_QUERY_RESULT_NO_WAIT 0x9194 +#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 +typedef void (APIENTRYP PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); +typedef void (APIENTRYP PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +typedef void (APIENTRYP PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); +typedef void (APIENTRYP PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint *samplers); +typedef void (APIENTRYP PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); +typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferStorage (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +GLAPI void APIENTRY glClearTexImage (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glBindBuffersBase (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); +GLAPI void APIENTRY glBindBuffersRange (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +GLAPI void APIENTRY glBindTextures (GLuint first, GLsizei count, const GLuint *textures); +GLAPI void APIENTRY glBindSamplers (GLuint first, GLsizei count, const GLuint *samplers); +GLAPI void APIENTRY glBindImageTextures (GLuint first, GLsizei count, const GLuint *textures); +GLAPI void APIENTRY glBindVertexBuffers (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +#endif +#endif /* GL_VERSION_4_4 */ + +#ifndef GL_ARB_ES2_compatibility +#define GL_ARB_ES2_compatibility 1 +#endif /* GL_ARB_ES2_compatibility */ + +#ifndef GL_ARB_ES3_compatibility +#define GL_ARB_ES3_compatibility 1 +#endif /* GL_ARB_ES3_compatibility */ + +#ifndef GL_ARB_arrays_of_arrays +#define GL_ARB_arrays_of_arrays 1 +#endif /* GL_ARB_arrays_of_arrays */ + +#ifndef GL_ARB_base_instance +#define GL_ARB_base_instance 1 +#endif /* GL_ARB_base_instance */ + +#ifndef GL_ARB_bindless_texture +#define GL_ARB_bindless_texture 1 +typedef uint64_t GLuint64EXT; +#define GL_UNSIGNED_INT64_ARB 0x140F +typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); +typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint64 APIENTRY glGetTextureHandleARB (GLuint texture); +GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleARB (GLuint texture, GLuint sampler); +GLAPI void APIENTRY glMakeTextureHandleResidentARB (GLuint64 handle); +GLAPI void APIENTRY glMakeTextureHandleNonResidentARB (GLuint64 handle); +GLAPI GLuint64 APIENTRY glGetImageHandleARB (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +GLAPI void APIENTRY glMakeImageHandleResidentARB (GLuint64 handle, GLenum access); +GLAPI void APIENTRY glMakeImageHandleNonResidentARB (GLuint64 handle); +GLAPI void APIENTRY glUniformHandleui64ARB (GLint location, GLuint64 value); +GLAPI void APIENTRY glUniformHandleui64vARB (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniformHandleui64ARB (GLuint program, GLint location, GLuint64 value); +GLAPI void APIENTRY glProgramUniformHandleui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +GLAPI GLboolean APIENTRY glIsTextureHandleResidentARB (GLuint64 handle); +GLAPI GLboolean APIENTRY glIsImageHandleResidentARB (GLuint64 handle); +GLAPI void APIENTRY glVertexAttribL1ui64ARB (GLuint index, GLuint64EXT x); +GLAPI void APIENTRY glVertexAttribL1ui64vARB (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glGetVertexAttribLui64vARB (GLuint index, GLenum pname, GLuint64EXT *params); +#endif +#endif /* GL_ARB_bindless_texture */ + +#ifndef GL_ARB_blend_func_extended +#define GL_ARB_blend_func_extended 1 +#endif /* GL_ARB_blend_func_extended */ + +#ifndef GL_ARB_buffer_storage +#define GL_ARB_buffer_storage 1 +#endif /* GL_ARB_buffer_storage */ + +#ifndef GL_ARB_cl_event +#define GL_ARB_cl_event 1 +struct _cl_context; +struct _cl_event; +#define GL_SYNC_CL_EVENT_ARB 0x8240 +#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 +typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); +#endif +#endif /* GL_ARB_cl_event */ + +#ifndef GL_ARB_clear_buffer_object +#define GL_ARB_clear_buffer_object 1 +#endif /* GL_ARB_clear_buffer_object */ + +#ifndef GL_ARB_clear_texture +#define GL_ARB_clear_texture 1 +#endif /* GL_ARB_clear_texture */ + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D +typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClampColorARB (GLenum target, GLenum clamp); +#endif +#endif /* GL_ARB_color_buffer_float */ + +#ifndef GL_ARB_compatibility +#define GL_ARB_compatibility 1 +#endif /* GL_ARB_compatibility */ + +#ifndef GL_ARB_compressed_texture_pixel_storage +#define GL_ARB_compressed_texture_pixel_storage 1 +#endif /* GL_ARB_compressed_texture_pixel_storage */ + +#ifndef GL_ARB_compute_shader +#define GL_ARB_compute_shader 1 +#define GL_COMPUTE_SHADER_BIT 0x00000020 +#endif /* GL_ARB_compute_shader */ + +#ifndef GL_ARB_compute_variable_group_size +#define GL_ARB_compute_variable_group_size 1 +#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 +#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB +#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 +#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDispatchComputeGroupSizeARB (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); +#endif +#endif /* GL_ARB_compute_variable_group_size */ + +#ifndef GL_ARB_conservative_depth +#define GL_ARB_conservative_depth 1 +#endif /* GL_ARB_conservative_depth */ + +#ifndef GL_ARB_copy_buffer +#define GL_ARB_copy_buffer 1 +#define GL_COPY_READ_BUFFER_BINDING 0x8F36 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 +#endif /* GL_ARB_copy_buffer */ + +#ifndef GL_ARB_copy_image +#define GL_ARB_copy_image 1 +#endif /* GL_ARB_copy_image */ + +#ifndef GL_ARB_debug_output +#define GL_ARB_debug_output 1 +typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 +#define GL_DEBUG_SOURCE_API_ARB 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A +#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B +#define GL_DEBUG_TYPE_ERROR_ARB 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 +#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 +#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 +typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +#endif +#endif /* GL_ARB_debug_output */ + +#ifndef GL_ARB_depth_buffer_float +#define GL_ARB_depth_buffer_float 1 +#endif /* GL_ARB_depth_buffer_float */ + +#ifndef GL_ARB_depth_clamp +#define GL_ARB_depth_clamp 1 +#endif /* GL_ARB_depth_clamp */ + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B +#endif /* GL_ARB_depth_texture */ + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 +typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersARB (GLsizei n, const GLenum *bufs); +#endif +#endif /* GL_ARB_draw_buffers */ + +#ifndef GL_ARB_draw_buffers_blend +#define GL_ARB_draw_buffers_blend 1 +typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#endif +#endif /* GL_ARB_draw_buffers_blend */ + +#ifndef GL_ARB_draw_elements_base_vertex +#define GL_ARB_draw_elements_base_vertex 1 +#endif /* GL_ARB_draw_elements_base_vertex */ + +#ifndef GL_ARB_draw_indirect +#define GL_ARB_draw_indirect 1 +#endif /* GL_ARB_draw_indirect */ + +#ifndef GL_ARB_draw_instanced +#define GL_ARB_draw_instanced 1 +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#endif +#endif /* GL_ARB_draw_instanced */ + +#ifndef GL_ARB_enhanced_layouts +#define GL_ARB_enhanced_layouts 1 +#endif /* GL_ARB_enhanced_layouts */ + +#ifndef GL_ARB_explicit_attrib_location +#define GL_ARB_explicit_attrib_location 1 +#endif /* GL_ARB_explicit_attrib_location */ + +#ifndef GL_ARB_explicit_uniform_location +#define GL_ARB_explicit_uniform_location 1 +#endif /* GL_ARB_explicit_uniform_location */ + +#ifndef GL_ARB_fragment_coord_conventions +#define GL_ARB_fragment_coord_conventions 1 +#endif /* GL_ARB_fragment_coord_conventions */ + +#ifndef GL_ARB_fragment_layer_viewport +#define GL_ARB_fragment_layer_viewport 1 +#endif /* GL_ARB_fragment_layer_viewport */ + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramStringARB (GLenum target, GLenum format, GLsizei len, const void *string); +GLAPI void APIENTRY glBindProgramARB (GLenum target, GLuint program); +GLAPI void APIENTRY glDeleteProgramsARB (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glGenProgramsARB (GLsizei n, GLuint *programs); +GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetProgramivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramStringARB (GLenum target, GLenum pname, void *string); +GLAPI GLboolean APIENTRY glIsProgramARB (GLuint program); +#endif +#endif /* GL_ARB_fragment_program */ + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 +#endif /* GL_ARB_fragment_program_shadow */ + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B +#endif /* GL_ARB_fragment_shader */ + +#ifndef GL_ARB_framebuffer_no_attachments +#define GL_ARB_framebuffer_no_attachments 1 +#endif /* GL_ARB_framebuffer_no_attachments */ + +#ifndef GL_ARB_framebuffer_object +#define GL_ARB_framebuffer_object 1 +#endif /* GL_ARB_framebuffer_object */ + +#ifndef GL_ARB_framebuffer_sRGB +#define GL_ARB_framebuffer_sRGB 1 +#endif /* GL_ARB_framebuffer_sRGB */ + +#ifndef GL_KHR_context_flush_control +#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC +#endif /* GL_KHR_context_flush_control */ + +#ifndef GL_ARB_geometry_shader4 +#define GL_ARB_geometry_shader4 1 +#define GL_LINES_ADJACENCY_ARB 0x000A +#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B +#define GL_TRIANGLES_ADJACENCY_ARB 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D +#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 +#define GL_GEOMETRY_SHADER_ARB 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramParameteriARB (GLuint program, GLenum pname, GLint value); +GLAPI void APIENTRY glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#endif +#endif /* GL_ARB_geometry_shader4 */ + +#ifndef GL_ARB_get_program_binary +#define GL_ARB_get_program_binary 1 +#endif /* GL_ARB_get_program_binary */ + +#ifndef GL_ARB_gpu_shader5 +#define GL_ARB_gpu_shader5 1 +#endif /* GL_ARB_gpu_shader5 */ + +#ifndef GL_ARB_gpu_shader_fp64 +#define GL_ARB_gpu_shader_fp64 1 +#endif /* GL_ARB_gpu_shader_fp64 */ + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 +typedef unsigned short GLhalfARB; +#define GL_HALF_FLOAT_ARB 0x140B +#endif /* GL_ARB_half_float_pixel */ + +#ifndef GL_ARB_half_float_vertex +#define GL_ARB_half_float_vertex 1 +#endif /* GL_ARB_half_float_vertex */ + +#ifndef GL_ARB_imaging +#define GL_ARB_imaging 1 +#define GL_BLEND_COLOR 0x8005 +#define GL_BLEND_EQUATION 0x8009 +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glGetColorTable (GLenum target, GLenum format, GLenum type, void *table); +GLAPI void APIENTRY glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params); +GLAPI void APIENTRY glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glConvolutionParameteri (GLenum target, GLenum pname, GLint params); +GLAPI void APIENTRY glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, void *image); +GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSeparableFilter (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +GLAPI void APIENTRY glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +GLAPI void APIENTRY glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glMinmax (GLenum target, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glResetHistogram (GLenum target); +GLAPI void APIENTRY glResetMinmax (GLenum target); +#endif +#endif /* GL_ARB_imaging */ + +#ifndef GL_ARB_indirect_parameters +#define GL_ARB_indirect_parameters 1 +#define GL_PARAMETER_BUFFER_ARB 0x80EE +#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectCountARB (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirectCountARB (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#endif +#endif /* GL_ARB_indirect_parameters */ + +#ifndef GL_ARB_instanced_arrays +#define GL_ARB_instanced_arrays 1 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribDivisorARB (GLuint index, GLuint divisor); +#endif +#endif /* GL_ARB_instanced_arrays */ + +#ifndef GL_ARB_internalformat_query +#define GL_ARB_internalformat_query 1 +#endif /* GL_ARB_internalformat_query */ + +#ifndef GL_ARB_internalformat_query2 +#define GL_ARB_internalformat_query2 1 +#define GL_SRGB_DECODE_ARB 0x8299 +#endif /* GL_ARB_internalformat_query2 */ + +#ifndef GL_ARB_invalidate_subdata +#define GL_ARB_invalidate_subdata 1 +#endif /* GL_ARB_invalidate_subdata */ + +#ifndef GL_ARB_map_buffer_alignment +#define GL_ARB_map_buffer_alignment 1 +#endif /* GL_ARB_map_buffer_alignment */ + +#ifndef GL_ARB_map_buffer_range +#define GL_ARB_map_buffer_range 1 +#endif /* GL_ARB_map_buffer_range */ + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 +typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint index); +GLAPI void APIENTRY glMatrixIndexubvARB (GLint size, const GLubyte *indices); +GLAPI void APIENTRY glMatrixIndexusvARB (GLint size, const GLushort *indices); +GLAPI void APIENTRY glMatrixIndexuivARB (GLint size, const GLuint *indices); +GLAPI void APIENTRY glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_ARB_matrix_palette */ + +#ifndef GL_ARB_multi_bind +#define GL_ARB_multi_bind 1 +#endif /* GL_ARB_multi_bind */ + +#ifndef GL_ARB_multi_draw_indirect +#define GL_ARB_multi_draw_indirect 1 +#endif /* GL_ARB_multi_draw_indirect */ + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLfloat value, GLboolean invert); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleCoverageARB (GLfloat value, GLboolean invert); +#endif +#endif /* GL_ARB_multisample */ + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTextureARB (GLenum texture); +GLAPI void APIENTRY glClientActiveTextureARB (GLenum texture); +GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum target, GLdouble s); +GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum target, GLfloat s); +GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum target, GLint s); +GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum target, GLshort s); +GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t); +GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t); +GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum target, GLint s, GLint t); +GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t); +GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r); +GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum target, const GLshort *v); +#endif +#endif /* GL_ARB_multitexture */ + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 +typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueriesARB (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteQueriesARB (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsQueryARB (GLuint id); +GLAPI void APIENTRY glBeginQueryARB (GLenum target, GLuint id); +GLAPI void APIENTRY glEndQueryARB (GLenum target); +GLAPI void APIENTRY glGetQueryivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectivARB (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint *params); +#endif +#endif /* GL_ARB_occlusion_query */ + +#ifndef GL_ARB_occlusion_query2 +#define GL_ARB_occlusion_query2 1 +#endif /* GL_ARB_occlusion_query2 */ + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF +#endif /* GL_ARB_pixel_buffer_object */ + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfARB (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvARB (GLenum pname, const GLfloat *params); +#endif +#endif /* GL_ARB_point_parameters */ + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 +#endif /* GL_ARB_point_sprite */ + +#ifndef GL_ARB_program_interface_query +#define GL_ARB_program_interface_query 1 +#endif /* GL_ARB_program_interface_query */ + +#ifndef GL_ARB_provoking_vertex +#define GL_ARB_provoking_vertex 1 +#endif /* GL_ARB_provoking_vertex */ + +#ifndef GL_ARB_query_buffer_object +#define GL_ARB_query_buffer_object 1 +#endif /* GL_ARB_query_buffer_object */ + +#ifndef GL_ARB_robust_buffer_access_behavior +#define GL_ARB_robust_buffer_access_behavior 1 +#endif /* GL_ARB_robust_buffer_access_behavior */ + +#ifndef GL_ARB_robustness +#define GL_ARB_robustness 1 +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 +typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); +typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); +typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void *img); +typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +typedef void (APIENTRYP PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +typedef void (APIENTRYP PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +typedef void (APIENTRYP PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort *values); +typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte *pattern); +typedef void (APIENTRYP PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +typedef void (APIENTRYP PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void); +GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); +GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, void *img); +GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params); +GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +GLAPI void APIENTRY glGetnMapdvARB (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +GLAPI void APIENTRY glGetnMapfvARB (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +GLAPI void APIENTRY glGetnMapivARB (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +GLAPI void APIENTRY glGetnPixelMapfvARB (GLenum map, GLsizei bufSize, GLfloat *values); +GLAPI void APIENTRY glGetnPixelMapuivARB (GLenum map, GLsizei bufSize, GLuint *values); +GLAPI void APIENTRY glGetnPixelMapusvARB (GLenum map, GLsizei bufSize, GLushort *values); +GLAPI void APIENTRY glGetnPolygonStippleARB (GLsizei bufSize, GLubyte *pattern); +GLAPI void APIENTRY glGetnColorTableARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +GLAPI void APIENTRY glGetnConvolutionFilterARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +GLAPI void APIENTRY glGetnSeparableFilterARB (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +GLAPI void APIENTRY glGetnHistogramARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +GLAPI void APIENTRY glGetnMinmaxARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +#endif +#endif /* GL_ARB_robustness */ + +#ifndef GL_ARB_robustness_isolation +#define GL_ARB_robustness_isolation 1 +#endif /* GL_ARB_robustness_isolation */ + +#ifndef GL_ARB_sample_shading +#define GL_ARB_sample_shading 1 +#define GL_SAMPLE_SHADING_ARB 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 +typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLfloat value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMinSampleShadingARB (GLfloat value); +#endif +#endif /* GL_ARB_sample_shading */ + +#ifndef GL_ARB_sampler_objects +#define GL_ARB_sampler_objects 1 +#endif /* GL_ARB_sampler_objects */ + +#ifndef GL_ARB_seamless_cube_map +#define GL_ARB_seamless_cube_map 1 +#endif /* GL_ARB_seamless_cube_map */ + +#ifndef GL_ARB_seamless_cubemap_per_texture +#define GL_ARB_seamless_cubemap_per_texture 1 +#endif /* GL_ARB_seamless_cubemap_per_texture */ + +#ifndef GL_ARB_separate_shader_objects +#define GL_ARB_separate_shader_objects 1 +#endif /* GL_ARB_separate_shader_objects */ + +#ifndef GL_ARB_shader_atomic_counters +#define GL_ARB_shader_atomic_counters 1 +#endif /* GL_ARB_shader_atomic_counters */ + +#ifndef GL_ARB_shader_bit_encoding +#define GL_ARB_shader_bit_encoding 1 +#endif /* GL_ARB_shader_bit_encoding */ + +#ifndef GL_ARB_shader_draw_parameters +#define GL_ARB_shader_draw_parameters 1 +#endif /* GL_ARB_shader_draw_parameters */ + +#ifndef GL_ARB_shader_group_vote +#define GL_ARB_shader_group_vote 1 +#endif /* GL_ARB_shader_group_vote */ + +#ifndef GL_ARB_shader_image_load_store +#define GL_ARB_shader_image_load_store 1 +#endif /* GL_ARB_shader_image_load_store */ + +#ifndef GL_ARB_shader_image_size +#define GL_ARB_shader_image_size 1 +#endif /* GL_ARB_shader_image_size */ + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 +#ifdef __APPLE__ +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif +typedef char GLcharARB; +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); +typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB obj); +GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum pname); +GLAPI void APIENTRY glDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj); +GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum shaderType); +GLAPI void APIENTRY glShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); +GLAPI void APIENTRY glCompileShaderARB (GLhandleARB shaderObj); +GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); +GLAPI void APIENTRY glAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj); +GLAPI void APIENTRY glLinkProgramARB (GLhandleARB programObj); +GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB programObj); +GLAPI void APIENTRY glValidateProgramARB (GLhandleARB programObj); +GLAPI void APIENTRY glUniform1fARB (GLint location, GLfloat v0); +GLAPI void APIENTRY glUniform2fARB (GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glUniform1iARB (GLint location, GLint v0); +GLAPI void APIENTRY glUniform2iARB (GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glUniform1fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform2fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform3fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform4fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform1ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform2ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform3ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform4ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name); +GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params); +GLAPI void APIENTRY glGetUniformivARB (GLhandleARB programObj, GLint location, GLint *params); +GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#endif +#endif /* GL_ARB_shader_objects */ + +#ifndef GL_ARB_shader_precision +#define GL_ARB_shader_precision 1 +#endif /* GL_ARB_shader_precision */ + +#ifndef GL_ARB_shader_stencil_export +#define GL_ARB_shader_stencil_export 1 +#endif /* GL_ARB_shader_stencil_export */ + +#ifndef GL_ARB_shader_storage_buffer_object +#define GL_ARB_shader_storage_buffer_object 1 +#endif /* GL_ARB_shader_storage_buffer_object */ + +#ifndef GL_ARB_shader_subroutine +#define GL_ARB_shader_subroutine 1 +#endif /* GL_ARB_shader_subroutine */ + +#ifndef GL_ARB_shader_texture_lod +#define GL_ARB_shader_texture_lod 1 +#endif /* GL_ARB_shader_texture_lod */ + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C +#endif /* GL_ARB_shading_language_100 */ + +#ifndef GL_ARB_shading_language_420pack +#define GL_ARB_shading_language_420pack 1 +#endif /* GL_ARB_shading_language_420pack */ + +#ifndef GL_ARB_shading_language_include +#define GL_ARB_shading_language_include 1 +#define GL_SHADER_INCLUDE_ARB 0x8DAE +#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 +#define GL_NAMED_STRING_TYPE_ARB 0x8DEA +typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); +typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); +typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); +typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); +GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name); +GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); +GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name); +GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); +GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params); +#endif +#endif /* GL_ARB_shading_language_include */ + +#ifndef GL_ARB_shading_language_packing +#define GL_ARB_shading_language_packing 1 +#endif /* GL_ARB_shading_language_packing */ + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E +#endif /* GL_ARB_shadow */ + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF +#endif /* GL_ARB_shadow_ambient */ + +#ifndef GL_ARB_sparse_texture +#define GL_ARB_sparse_texture 1 +#define GL_TEXTURE_SPARSE_ARB 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 +#define GL_MIN_SPARSE_LEVEL_ARB 0x919B +#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 +#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 +typedef void (APIENTRYP PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexPageCommitmentARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +#endif +#endif /* GL_ARB_sparse_texture */ + +#ifndef GL_ARB_stencil_texturing +#define GL_ARB_stencil_texturing 1 +#endif /* GL_ARB_stencil_texturing */ + +#ifndef GL_ARB_sync +#define GL_ARB_sync 1 +#endif /* GL_ARB_sync */ + +#ifndef GL_ARB_tessellation_shader +#define GL_ARB_tessellation_shader 1 +#endif /* GL_ARB_tessellation_shader */ + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 +#define GL_CLAMP_TO_BORDER_ARB 0x812D +#endif /* GL_ARB_texture_border_clamp */ + +#ifndef GL_ARB_texture_buffer_object +#define GL_ARB_texture_buffer_object 1 +#define GL_TEXTURE_BUFFER_ARB 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E +typedef void (APIENTRYP PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer); +#endif +#endif /* GL_ARB_texture_buffer_object */ + +#ifndef GL_ARB_texture_buffer_object_rgb32 +#define GL_ARB_texture_buffer_object_rgb32 1 +#endif /* GL_ARB_texture_buffer_object_rgb32 */ + +#ifndef GL_ARB_texture_buffer_range +#define GL_ARB_texture_buffer_range 1 +#endif /* GL_ARB_texture_buffer_range */ + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *img); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum target, GLint level, void *img); +#endif +#endif /* GL_ARB_texture_compression */ + +#ifndef GL_ARB_texture_compression_bptc +#define GL_ARB_texture_compression_bptc 1 +#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F +#endif /* GL_ARB_texture_compression_bptc */ + +#ifndef GL_ARB_texture_compression_rgtc +#define GL_ARB_texture_compression_rgtc 1 +#endif /* GL_ARB_texture_compression_rgtc */ + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C +#endif /* GL_ARB_texture_cube_map */ + +#ifndef GL_ARB_texture_cube_map_array +#define GL_ARB_texture_cube_map_array 1 +#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F +#endif /* GL_ARB_texture_cube_map_array */ + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 +#endif /* GL_ARB_texture_env_add */ + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#endif /* GL_ARB_texture_env_combine */ + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 +#endif /* GL_ARB_texture_env_crossbar */ + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF +#endif /* GL_ARB_texture_env_dot3 */ + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#endif /* GL_ARB_texture_float */ + +#ifndef GL_ARB_texture_gather +#define GL_ARB_texture_gather 1 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F +#endif /* GL_ARB_texture_gather */ + +#ifndef GL_ARB_texture_mirror_clamp_to_edge +#define GL_ARB_texture_mirror_clamp_to_edge 1 +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#endif /* GL_ARB_texture_mirrored_repeat */ + +#ifndef GL_ARB_texture_multisample +#define GL_ARB_texture_multisample 1 +#endif /* GL_ARB_texture_multisample */ + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 +#endif /* GL_ARB_texture_non_power_of_two */ + +#ifndef GL_ARB_texture_query_levels +#define GL_ARB_texture_query_levels 1 +#endif /* GL_ARB_texture_query_levels */ + +#ifndef GL_ARB_texture_query_lod +#define GL_ARB_texture_query_lod 1 +#endif /* GL_ARB_texture_query_lod */ + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#endif /* GL_ARB_texture_rectangle */ + +#ifndef GL_ARB_texture_rg +#define GL_ARB_texture_rg 1 +#endif /* GL_ARB_texture_rg */ + +#ifndef GL_ARB_texture_rgb10_a2ui +#define GL_ARB_texture_rgb10_a2ui 1 +#endif /* GL_ARB_texture_rgb10_a2ui */ + +#ifndef GL_ARB_texture_stencil8 +#define GL_ARB_texture_stencil8 1 +#endif /* GL_ARB_texture_stencil8 */ + +#ifndef GL_ARB_texture_storage +#define GL_ARB_texture_storage 1 +#endif /* GL_ARB_texture_storage */ + +#ifndef GL_ARB_texture_storage_multisample +#define GL_ARB_texture_storage_multisample 1 +#endif /* GL_ARB_texture_storage_multisample */ + +#ifndef GL_ARB_texture_swizzle +#define GL_ARB_texture_swizzle 1 +#endif /* GL_ARB_texture_swizzle */ + +#ifndef GL_ARB_texture_view +#define GL_ARB_texture_view 1 +#endif /* GL_ARB_texture_view */ + +#ifndef GL_ARB_timer_query +#define GL_ARB_timer_query 1 +#endif /* GL_ARB_timer_query */ + +#ifndef GL_ARB_transform_feedback2 +#define GL_ARB_transform_feedback2 1 +#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 +#endif /* GL_ARB_transform_feedback2 */ + +#ifndef GL_ARB_transform_feedback3 +#define GL_ARB_transform_feedback3 1 +#endif /* GL_ARB_transform_feedback3 */ + +#ifndef GL_ARB_transform_feedback_instanced +#define GL_ARB_transform_feedback_instanced 1 +#endif /* GL_ARB_transform_feedback_instanced */ + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *m); +GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *m); +GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *m); +GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *m); +#endif +#endif /* GL_ARB_transpose_matrix */ + +#ifndef GL_ARB_uniform_buffer_object +#define GL_ARB_uniform_buffer_object 1 +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#endif /* GL_ARB_uniform_buffer_object */ + +#ifndef GL_ARB_vertex_array_bgra +#define GL_ARB_vertex_array_bgra 1 +#endif /* GL_ARB_vertex_array_bgra */ + +#ifndef GL_ARB_vertex_array_object +#define GL_ARB_vertex_array_object 1 +#endif /* GL_ARB_vertex_array_object */ + +#ifndef GL_ARB_vertex_attrib_64bit +#define GL_ARB_vertex_attrib_64bit 1 +#endif /* GL_ARB_vertex_attrib_64bit */ + +#ifndef GL_ARB_vertex_attrib_binding +#define GL_ARB_vertex_attrib_binding 1 +#endif /* GL_ARB_vertex_attrib_binding */ + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F +typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); +typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); +typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); +typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); +typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); +typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); +typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWeightbvARB (GLint size, const GLbyte *weights); +GLAPI void APIENTRY glWeightsvARB (GLint size, const GLshort *weights); +GLAPI void APIENTRY glWeightivARB (GLint size, const GLint *weights); +GLAPI void APIENTRY glWeightfvARB (GLint size, const GLfloat *weights); +GLAPI void APIENTRY glWeightdvARB (GLint size, const GLdouble *weights); +GLAPI void APIENTRY glWeightubvARB (GLint size, const GLubyte *weights); +GLAPI void APIENTRY glWeightusvARB (GLint size, const GLushort *weights); +GLAPI void APIENTRY glWeightuivARB (GLint size, const GLuint *weights); +GLAPI void APIENTRY glWeightPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glVertexBlendARB (GLint count); +#endif +#endif /* GL_ARB_vertex_blend */ + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 +#ifdef __MACOSX__ /* The OS X headers haven't caught up with Khronos yet */ +typedef long GLsizeiptrARB; +typedef long GLintptrARB; +#else +typedef ptrdiff_t GLsizeiptrARB; +typedef ptrdiff_t GLintptrARB; +#endif +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA +typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); +typedef void *(APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindBufferARB (GLenum target, GLuint buffer); +GLAPI void APIENTRY glDeleteBuffersARB (GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glGenBuffersARB (GLsizei n, GLuint *buffers); +GLAPI GLboolean APIENTRY glIsBufferARB (GLuint buffer); +GLAPI void APIENTRY glBufferDataARB (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); +GLAPI void APIENTRY glBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); +GLAPI void APIENTRY glGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); +GLAPI void *APIENTRY glMapBufferARB (GLenum target, GLenum access); +GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum target); +GLAPI void APIENTRY glGetBufferParameterivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetBufferPointervARB (GLenum target, GLenum pname, void **params); +#endif +#endif /* GL_ARB_vertex_buffer_object */ + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void **pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttrib1dARB (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1fARB (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1sARB (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2sARB (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint index); +GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint index); +GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint index, GLenum pname, void **pointer); +#endif +#endif /* GL_ARB_vertex_program */ + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name); +GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name); +#endif +#endif /* GL_ARB_vertex_shader */ + +#ifndef GL_ARB_vertex_type_10f_11f_11f_rev +#define GL_ARB_vertex_type_10f_11f_11f_rev 1 +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ + +#ifndef GL_ARB_vertex_type_2_10_10_10_rev +#define GL_ARB_vertex_type_2_10_10_10_rev 1 +#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ + +#ifndef GL_ARB_viewport_array +#define GL_ARB_viewport_array 1 +#endif /* GL_ARB_viewport_array */ + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 +typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dARB (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2fARB (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2iARB (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2ivARB (const GLint *v); +GLAPI void APIENTRY glWindowPos2sARB (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2svARB (const GLshort *v); +GLAPI void APIENTRY glWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3iARB (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3ivARB (const GLint *v); +GLAPI void APIENTRY glWindowPos3sARB (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3svARB (const GLshort *v); +#endif +#endif /* GL_ARB_window_pos */ + +#ifndef GL_KHR_debug +#define GL_KHR_debug 1 +#endif /* GL_KHR_debug */ + +#ifndef GL_KHR_texture_compression_astc_hdr +#define GL_KHR_texture_compression_astc_hdr 1 +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD +#endif /* GL_KHR_texture_compression_astc_hdr */ + +#ifndef GL_KHR_texture_compression_astc_ldr +#define GL_KHR_texture_compression_astc_ldr 1 +#endif /* GL_KHR_texture_compression_astc_ldr */ + +#ifndef GL_OES_byte_coordinates +#define GL_OES_byte_coordinates 1 +typedef void (APIENTRYP PFNGLMULTITEXCOORD1BOESPROC) (GLenum texture, GLbyte s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2BOESPROC) (GLenum texture, GLbyte s, GLbyte t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD1BOESPROC) (GLbyte s); +typedef void (APIENTRYP PFNGLTEXCOORD1BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD2BOESPROC) (GLbyte s, GLbyte t); +typedef void (APIENTRYP PFNGLTEXCOORD2BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD3BOESPROC) (GLbyte s, GLbyte t, GLbyte r); +typedef void (APIENTRYP PFNGLTEXCOORD3BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD4BOESPROC) (GLbyte s, GLbyte t, GLbyte r, GLbyte q); +typedef void (APIENTRYP PFNGLTEXCOORD4BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX2BOESPROC) (GLbyte x); +typedef void (APIENTRYP PFNGLVERTEX2BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX3BOESPROC) (GLbyte x, GLbyte y); +typedef void (APIENTRYP PFNGLVERTEX3BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX4BOESPROC) (GLbyte x, GLbyte y, GLbyte z); +typedef void (APIENTRYP PFNGLVERTEX4BVOESPROC) (const GLbyte *coords); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiTexCoord1bOES (GLenum texture, GLbyte s); +GLAPI void APIENTRY glMultiTexCoord1bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord2bOES (GLenum texture, GLbyte s, GLbyte t); +GLAPI void APIENTRY glMultiTexCoord2bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord3bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r); +GLAPI void APIENTRY glMultiTexCoord3bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord4bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); +GLAPI void APIENTRY glMultiTexCoord4bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glTexCoord1bOES (GLbyte s); +GLAPI void APIENTRY glTexCoord1bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord2bOES (GLbyte s, GLbyte t); +GLAPI void APIENTRY glTexCoord2bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord3bOES (GLbyte s, GLbyte t, GLbyte r); +GLAPI void APIENTRY glTexCoord3bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord4bOES (GLbyte s, GLbyte t, GLbyte r, GLbyte q); +GLAPI void APIENTRY glTexCoord4bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex2bOES (GLbyte x); +GLAPI void APIENTRY glVertex2bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex3bOES (GLbyte x, GLbyte y); +GLAPI void APIENTRY glVertex3bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex4bOES (GLbyte x, GLbyte y, GLbyte z); +GLAPI void APIENTRY glVertex4bvOES (const GLbyte *coords); +#endif +#endif /* GL_OES_byte_coordinates */ + +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 +#endif /* GL_OES_compressed_paletted_texture */ + +#ifndef GL_OES_fixed_point +#define GL_OES_fixed_point 1 +typedef GLint GLfixed; +#define GL_FIXED_OES 0x140C +typedef void (APIENTRYP PFNGLALPHAFUNCXOESPROC) (GLenum func, GLfixed ref); +typedef void (APIENTRYP PFNGLCLEARCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCLEARDEPTHXOESPROC) (GLfixed depth); +typedef void (APIENTRYP PFNGLCLIPPLANEXOESPROC) (GLenum plane, const GLfixed *equation); +typedef void (APIENTRYP PFNGLCOLOR4XOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLDEPTHRANGEXOESPROC) (GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLFOGXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLFOGXVOESPROC) (GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLFRUSTUMXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLGETCLIPPLANEXOESPROC) (GLenum plane, GLfixed *equation); +typedef void (APIENTRYP PFNGLGETFIXEDVOESPROC) (GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXENVXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLLIGHTMODELXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLLIGHTMODELXVOESPROC) (GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLLIGHTXVOESPROC) (GLenum light, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLLINEWIDTHXOESPROC) (GLfixed width); +typedef void (APIENTRYP PFNGLLOADMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLMATERIALXVOESPROC) (GLenum face, GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLMULTMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (APIENTRYP PFNGLNORMAL3XOESPROC) (GLfixed nx, GLfixed ny, GLfixed nz); +typedef void (APIENTRYP PFNGLORTHOXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLPOINTPARAMETERXVOESPROC) (GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLPOINTSIZEXOESPROC) (GLfixed size); +typedef void (APIENTRYP PFNGLPOLYGONOFFSETXOESPROC) (GLfixed factor, GLfixed units); +typedef void (APIENTRYP PFNGLROTATEXOESPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEOESPROC) (GLfixed value, GLboolean invert); +typedef void (APIENTRYP PFNGLSCALEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLTEXENVXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXENVXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLTRANSLATEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLACCUMXOESPROC) (GLenum op, GLfixed value); +typedef void (APIENTRYP PFNGLBITMAPXOESPROC) (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); +typedef void (APIENTRYP PFNGLBLENDCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCLEARACCUMXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCOLOR3XOESPROC) (GLfixed red, GLfixed green, GLfixed blue); +typedef void (APIENTRYP PFNGLCOLOR3XVOESPROC) (const GLfixed *components); +typedef void (APIENTRYP PFNGLCOLOR4XVOESPROC) (const GLfixed *components); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLEVALCOORD1XOESPROC) (GLfixed u); +typedef void (APIENTRYP PFNGLEVALCOORD1XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLEVALCOORD2XOESPROC) (GLfixed u, GLfixed v); +typedef void (APIENTRYP PFNGLEVALCOORD2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLFEEDBACKBUFFERXOESPROC) (GLsizei n, GLenum type, const GLfixed *buffer); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETMAPXVOESPROC) (GLenum target, GLenum query, GLfixed *v); +typedef void (APIENTRYP PFNGLGETMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLGETPIXELMAPXVPROC) (GLenum map, GLint size, GLfixed *values); +typedef void (APIENTRYP PFNGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERXVOESPROC) (GLenum target, GLint level, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLINDEXXOESPROC) (GLfixed component); +typedef void (APIENTRYP PFNGLINDEXXVOESPROC) (const GLfixed *component); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMAP1XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); +typedef void (APIENTRYP PFNGLMAP2XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); +typedef void (APIENTRYP PFNGLMAPGRID1XOESPROC) (GLint n, GLfixed u1, GLfixed u2); +typedef void (APIENTRYP PFNGLMAPGRID2XOESPROC) (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1XOESPROC) (GLenum texture, GLfixed s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2XOESPROC) (GLenum texture, GLfixed s, GLfixed t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLNORMAL3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLPASSTHROUGHXOESPROC) (GLfixed token); +typedef void (APIENTRYP PFNGLPIXELMAPXPROC) (GLenum map, GLint size, const GLfixed *values); +typedef void (APIENTRYP PFNGLPIXELSTOREXPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLPIXELTRANSFERXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLPIXELZOOMXOESPROC) (GLfixed xfactor, GLfixed yfactor); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESXOESPROC) (GLsizei n, const GLuint *textures, const GLfixed *priorities); +typedef void (APIENTRYP PFNGLRASTERPOS2XOESPROC) (GLfixed x, GLfixed y); +typedef void (APIENTRYP PFNGLRASTERPOS2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRASTERPOS3XOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLRASTERPOS3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRASTERPOS4XOESPROC) (GLfixed x, GLfixed y, GLfixed z, GLfixed w); +typedef void (APIENTRYP PFNGLRASTERPOS4XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRECTXOESPROC) (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); +typedef void (APIENTRYP PFNGLRECTXVOESPROC) (const GLfixed *v1, const GLfixed *v2); +typedef void (APIENTRYP PFNGLTEXCOORD1XOESPROC) (GLfixed s); +typedef void (APIENTRYP PFNGLTEXCOORD1XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD2XOESPROC) (GLfixed s, GLfixed t); +typedef void (APIENTRYP PFNGLTEXCOORD2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD3XOESPROC) (GLfixed s, GLfixed t, GLfixed r); +typedef void (APIENTRYP PFNGLTEXCOORD3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD4XOESPROC) (GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (APIENTRYP PFNGLTEXCOORD4XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLVERTEX2XOESPROC) (GLfixed x); +typedef void (APIENTRYP PFNGLVERTEX2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLVERTEX3XOESPROC) (GLfixed x, GLfixed y); +typedef void (APIENTRYP PFNGLVERTEX3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLVERTEX4XOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLVERTEX4XVOESPROC) (const GLfixed *coords); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAlphaFuncxOES (GLenum func, GLfixed ref); +GLAPI void APIENTRY glClearColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glClearDepthxOES (GLfixed depth); +GLAPI void APIENTRY glClipPlanexOES (GLenum plane, const GLfixed *equation); +GLAPI void APIENTRY glColor4xOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glDepthRangexOES (GLfixed n, GLfixed f); +GLAPI void APIENTRY glFogxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glFogxvOES (GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glFrustumxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +GLAPI void APIENTRY glGetClipPlanexOES (GLenum plane, GLfixed *equation); +GLAPI void APIENTRY glGetFixedvOES (GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexEnvxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glLightModelxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glLightModelxvOES (GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glLightxOES (GLenum light, GLenum pname, GLfixed param); +GLAPI void APIENTRY glLightxvOES (GLenum light, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glLineWidthxOES (GLfixed width); +GLAPI void APIENTRY glLoadMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMaterialxOES (GLenum face, GLenum pname, GLfixed param); +GLAPI void APIENTRY glMaterialxvOES (GLenum face, GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glMultMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMultiTexCoord4xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +GLAPI void APIENTRY glNormal3xOES (GLfixed nx, GLfixed ny, GLfixed nz); +GLAPI void APIENTRY glOrthoxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +GLAPI void APIENTRY glPointParameterxvOES (GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glPointSizexOES (GLfixed size); +GLAPI void APIENTRY glPolygonOffsetxOES (GLfixed factor, GLfixed units); +GLAPI void APIENTRY glRotatexOES (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glSampleCoverageOES (GLfixed value, GLboolean invert); +GLAPI void APIENTRY glScalexOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glTexEnvxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexEnvxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glTexParameterxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glTranslatexOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glAccumxOES (GLenum op, GLfixed value); +GLAPI void APIENTRY glBitmapxOES (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); +GLAPI void APIENTRY glBlendColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glClearAccumxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glColor3xOES (GLfixed red, GLfixed green, GLfixed blue); +GLAPI void APIENTRY glColor3xvOES (const GLfixed *components); +GLAPI void APIENTRY glColor4xvOES (const GLfixed *components); +GLAPI void APIENTRY glConvolutionParameterxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glConvolutionParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glEvalCoord1xOES (GLfixed u); +GLAPI void APIENTRY glEvalCoord1xvOES (const GLfixed *coords); +GLAPI void APIENTRY glEvalCoord2xOES (GLfixed u, GLfixed v); +GLAPI void APIENTRY glEvalCoord2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glFeedbackBufferxOES (GLsizei n, GLenum type, const GLfixed *buffer); +GLAPI void APIENTRY glGetConvolutionParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetHistogramParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetLightxOES (GLenum light, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetMapxvOES (GLenum target, GLenum query, GLfixed *v); +GLAPI void APIENTRY glGetMaterialxOES (GLenum face, GLenum pname, GLfixed param); +GLAPI void APIENTRY glGetPixelMapxv (GLenum map, GLint size, GLfixed *values); +GLAPI void APIENTRY glGetTexGenxvOES (GLenum coord, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexLevelParameterxvOES (GLenum target, GLint level, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glIndexxOES (GLfixed component); +GLAPI void APIENTRY glIndexxvOES (const GLfixed *component); +GLAPI void APIENTRY glLoadTransposeMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMap1xOES (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); +GLAPI void APIENTRY glMap2xOES (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); +GLAPI void APIENTRY glMapGrid1xOES (GLint n, GLfixed u1, GLfixed u2); +GLAPI void APIENTRY glMapGrid2xOES (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); +GLAPI void APIENTRY glMultTransposeMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMultiTexCoord1xOES (GLenum texture, GLfixed s); +GLAPI void APIENTRY glMultiTexCoord1xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord2xOES (GLenum texture, GLfixed s, GLfixed t); +GLAPI void APIENTRY glMultiTexCoord2xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord3xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r); +GLAPI void APIENTRY glMultiTexCoord3xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord4xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glNormal3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glPassThroughxOES (GLfixed token); +GLAPI void APIENTRY glPixelMapx (GLenum map, GLint size, const GLfixed *values); +GLAPI void APIENTRY glPixelStorex (GLenum pname, GLfixed param); +GLAPI void APIENTRY glPixelTransferxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glPixelZoomxOES (GLfixed xfactor, GLfixed yfactor); +GLAPI void APIENTRY glPrioritizeTexturesxOES (GLsizei n, const GLuint *textures, const GLfixed *priorities); +GLAPI void APIENTRY glRasterPos2xOES (GLfixed x, GLfixed y); +GLAPI void APIENTRY glRasterPos2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRasterPos3xOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glRasterPos3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRasterPos4xOES (GLfixed x, GLfixed y, GLfixed z, GLfixed w); +GLAPI void APIENTRY glRasterPos4xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRectxOES (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); +GLAPI void APIENTRY glRectxvOES (const GLfixed *v1, const GLfixed *v2); +GLAPI void APIENTRY glTexCoord1xOES (GLfixed s); +GLAPI void APIENTRY glTexCoord1xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord2xOES (GLfixed s, GLfixed t); +GLAPI void APIENTRY glTexCoord2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord3xOES (GLfixed s, GLfixed t, GLfixed r); +GLAPI void APIENTRY glTexCoord3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord4xOES (GLfixed s, GLfixed t, GLfixed r, GLfixed q); +GLAPI void APIENTRY glTexCoord4xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexGenxOES (GLenum coord, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexGenxvOES (GLenum coord, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glVertex2xOES (GLfixed x); +GLAPI void APIENTRY glVertex2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glVertex3xOES (GLfixed x, GLfixed y); +GLAPI void APIENTRY glVertex3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glVertex4xOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glVertex4xvOES (const GLfixed *coords); +#endif +#endif /* GL_OES_fixed_point */ + +#ifndef GL_OES_query_matrix +#define GL_OES_query_matrix 1 +typedef GLbitfield (APIENTRYP PFNGLQUERYMATRIXXOESPROC) (GLfixed *mantissa, GLint *exponent); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLbitfield APIENTRY glQueryMatrixxOES (GLfixed *mantissa, GLint *exponent); +#endif +#endif /* GL_OES_query_matrix */ + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B +#endif /* GL_OES_read_format */ + +#ifndef GL_OES_single_precision +#define GL_OES_single_precision 1 +typedef void (APIENTRYP PFNGLCLEARDEPTHFOESPROC) (GLclampf depth); +typedef void (APIENTRYP PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat *equation); +typedef void (APIENTRYP PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); +typedef void (APIENTRYP PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +typedef void (APIENTRYP PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat *equation); +typedef void (APIENTRYP PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClearDepthfOES (GLclampf depth); +GLAPI void APIENTRY glClipPlanefOES (GLenum plane, const GLfloat *equation); +GLAPI void APIENTRY glDepthRangefOES (GLclampf n, GLclampf f); +GLAPI void APIENTRY glFrustumfOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +GLAPI void APIENTRY glGetClipPlanefOES (GLenum plane, GLfloat *equation); +GLAPI void APIENTRY glOrthofOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +#endif +#endif /* GL_OES_single_precision */ + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 +#endif /* GL_3DFX_multisample */ + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 +typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTbufferMask3DFX (GLuint mask); +#endif +#endif /* GL_3DFX_tbuffer */ + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 +#endif /* GL_3DFX_texture_compression_FXT1 */ + +#ifndef GL_AMD_blend_minmax_factor +#define GL_AMD_blend_minmax_factor 1 +#define GL_FACTOR_MIN_AMD 0x901C +#define GL_FACTOR_MAX_AMD 0x901D +#endif /* GL_AMD_blend_minmax_factor */ + +#ifndef GL_AMD_conservative_depth +#define GL_AMD_conservative_depth 1 +#endif /* GL_AMD_conservative_depth */ + +#ifndef GL_AMD_debug_output +#define GL_AMD_debug_output 1 +typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); +#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 +#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 +#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 +#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A +#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B +#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C +#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D +#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E +#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F +#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 +typedef void (APIENTRYP PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDebugMessageEnableAMD (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsertAMD (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallbackAMD (GLDEBUGPROCAMD callback, void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLogAMD (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); +#endif +#endif /* GL_AMD_debug_output */ + +#ifndef GL_AMD_depth_clamp_separate +#define GL_AMD_depth_clamp_separate 1 +#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E +#define GL_DEPTH_CLAMP_FAR_AMD 0x901F +#endif /* GL_AMD_depth_clamp_separate */ + +#ifndef GL_AMD_draw_buffers_blend +#define GL_AMD_draw_buffers_blend 1 +typedef void (APIENTRYP PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncIndexedAMD (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparateIndexedAMD (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GLAPI void APIENTRY glBlendEquationIndexedAMD (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparateIndexedAMD (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +#endif +#endif /* GL_AMD_draw_buffers_blend */ + +#ifndef GL_AMD_gcn_shader +#define GL_AMD_gcn_shader 1 +#endif /* GL_AMD_gcn_shader */ + +#ifndef GL_AMD_gpu_shader_int64 +#define GL_AMD_gpu_shader_int64 1 +typedef int64_t GLint64EXT; +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F +#define GL_INT8_NV 0x8FE0 +#define GL_INT8_VEC2_NV 0x8FE1 +#define GL_INT8_VEC3_NV 0x8FE2 +#define GL_INT8_VEC4_NV 0x8FE3 +#define GL_INT16_NV 0x8FE4 +#define GL_INT16_VEC2_NV 0x8FE5 +#define GL_INT16_VEC3_NV 0x8FE6 +#define GL_INT16_VEC4_NV 0x8FE7 +#define GL_INT64_VEC2_NV 0x8FE9 +#define GL_INT64_VEC3_NV 0x8FEA +#define GL_INT64_VEC4_NV 0x8FEB +#define GL_UNSIGNED_INT8_NV 0x8FEC +#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED +#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE +#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF +#define GL_UNSIGNED_INT16_NV 0x8FF0 +#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 +#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 +#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 +#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB +typedef void (APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); +typedef void (APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); +typedef void (APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniform1i64NV (GLint location, GLint64EXT x); +GLAPI void APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x); +GLAPI void APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params); +GLAPI void APIENTRY glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT *params); +GLAPI void APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x); +GLAPI void APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x); +GLAPI void APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif +#endif /* GL_AMD_gpu_shader_int64 */ + +#ifndef GL_AMD_interleaved_elements +#define GL_AMD_interleaved_elements 1 +#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 +#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 +typedef void (APIENTRYP PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribParameteriAMD (GLuint index, GLenum pname, GLint param); +#endif +#endif /* GL_AMD_interleaved_elements */ + +#ifndef GL_AMD_multi_draw_indirect +#define GL_AMD_multi_draw_indirect 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectAMD (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirectAMD (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); +#endif +#endif /* GL_AMD_multi_draw_indirect */ + +#ifndef GL_AMD_name_gen_delete +#define GL_AMD_name_gen_delete 1 +#define GL_DATA_BUFFER_AMD 0x9151 +#define GL_PERFORMANCE_MONITOR_AMD 0x9152 +#define GL_QUERY_OBJECT_AMD 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 +#define GL_SAMPLER_OBJECT_AMD 0x9155 +typedef void (APIENTRYP PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint *names); +typedef void (APIENTRYP PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint *names); +typedef GLboolean (APIENTRYP PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenNamesAMD (GLenum identifier, GLuint num, GLuint *names); +GLAPI void APIENTRY glDeleteNamesAMD (GLenum identifier, GLuint num, const GLuint *names); +GLAPI GLboolean APIENTRY glIsNameAMD (GLenum identifier, GLuint name); +#endif +#endif /* GL_AMD_name_gen_delete */ + +#ifndef GL_AMD_occlusion_query_event +#define GL_AMD_occlusion_query_event 1 +#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F +#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 +#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 +#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 +#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 +#define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF +typedef void (APIENTRYP PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glQueryObjectParameteruiAMD (GLenum target, GLuint id, GLenum pname, GLuint param); +#endif +#endif /* GL_AMD_occlusion_query_event */ + +#ifndef GL_AMD_performance_monitor +#define GL_AMD_performance_monitor 1 +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFMON_RESULT_AMD 0x8BC6 +typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); +typedef void (APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +typedef void (APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); +typedef void (APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +GLAPI void APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +GLAPI void APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +GLAPI void APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +GLAPI void APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data); +GLAPI void APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); +GLAPI void APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); +GLAPI void APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +GLAPI void APIENTRY glBeginPerfMonitorAMD (GLuint monitor); +GLAPI void APIENTRY glEndPerfMonitorAMD (GLuint monitor); +GLAPI void APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#endif +#endif /* GL_AMD_performance_monitor */ + +#ifndef GL_AMD_pinned_memory +#define GL_AMD_pinned_memory 1 +#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 +#endif /* GL_AMD_pinned_memory */ + +#ifndef GL_AMD_query_buffer_object +#define GL_AMD_query_buffer_object 1 +#define GL_QUERY_BUFFER_AMD 0x9192 +#define GL_QUERY_BUFFER_BINDING_AMD 0x9193 +#define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 +#endif /* GL_AMD_query_buffer_object */ + +#ifndef GL_AMD_sample_positions +#define GL_AMD_sample_positions 1 +#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F +typedef void (APIENTRYP PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat *val); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSetMultisamplefvAMD (GLenum pname, GLuint index, const GLfloat *val); +#endif +#endif /* GL_AMD_sample_positions */ + +#ifndef GL_AMD_seamless_cubemap_per_texture +#define GL_AMD_seamless_cubemap_per_texture 1 +#endif /* GL_AMD_seamless_cubemap_per_texture */ + +#ifndef GL_AMD_shader_atomic_counter_ops +#define GL_AMD_shader_atomic_counter_ops 1 +#endif /* GL_AMD_shader_atomic_counter_ops */ + +#ifndef GL_AMD_shader_stencil_export +#define GL_AMD_shader_stencil_export 1 +#endif /* GL_AMD_shader_stencil_export */ + +#ifndef GL_AMD_shader_trinary_minmax +#define GL_AMD_shader_trinary_minmax 1 +#endif /* GL_AMD_shader_trinary_minmax */ + +#ifndef GL_AMD_sparse_texture +#define GL_AMD_sparse_texture 1 +#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A +#define GL_MIN_SPARSE_LEVEL_AMD 0x919B +#define GL_MIN_LOD_WARNING_AMD 0x919C +#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 +typedef void (APIENTRYP PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +typedef void (APIENTRYP PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexStorageSparseAMD (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +GLAPI void APIENTRY glTextureStorageSparseAMD (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +#endif +#endif /* GL_AMD_sparse_texture */ + +#ifndef GL_AMD_stencil_operation_extended +#define GL_AMD_stencil_operation_extended 1 +#define GL_SET_AMD 0x874A +#define GL_REPLACE_VALUE_AMD 0x874B +#define GL_STENCIL_OP_VALUE_AMD 0x874C +#define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D +typedef void (APIENTRYP PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpValueAMD (GLenum face, GLuint value); +#endif +#endif /* GL_AMD_stencil_operation_extended */ + +#ifndef GL_AMD_texture_texture4 +#define GL_AMD_texture_texture4 1 +#endif /* GL_AMD_texture_texture4 */ + +#ifndef GL_AMD_transform_feedback3_lines_triangles +#define GL_AMD_transform_feedback3_lines_triangles 1 +#endif /* GL_AMD_transform_feedback3_lines_triangles */ + +#ifndef GL_AMD_transform_feedback4 +#define GL_AMD_transform_feedback4 1 +#define GL_STREAM_RASTERIZATION_AMD 0x91A0 +#endif /* GL_AMD_transform_feedback4 */ + +#ifndef GL_AMD_vertex_shader_layer +#define GL_AMD_vertex_shader_layer 1 +#endif /* GL_AMD_vertex_shader_layer */ + +#ifndef GL_AMD_vertex_shader_tessellator +#define GL_AMD_vertex_shader_tessellator 1 +#define GL_SAMPLER_BUFFER_AMD 0x9001 +#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 +#define GL_TESSELLATION_MODE_AMD 0x9004 +#define GL_TESSELLATION_FACTOR_AMD 0x9005 +#define GL_DISCRETE_AMD 0x9006 +#define GL_CONTINUOUS_AMD 0x9007 +typedef void (APIENTRYP PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTessellationFactorAMD (GLfloat factor); +GLAPI void APIENTRY glTessellationModeAMD (GLenum mode); +#endif +#endif /* GL_AMD_vertex_shader_tessellator */ + +#ifndef GL_AMD_vertex_shader_viewport_index +#define GL_AMD_vertex_shader_viewport_index 1 +#endif /* GL_AMD_vertex_shader_viewport_index */ + +#ifndef GL_APPLE_aux_depth_stencil +#define GL_APPLE_aux_depth_stencil 1 +#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 +#endif /* GL_APPLE_aux_depth_stencil */ + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 +#endif /* GL_APPLE_client_storage */ + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 +#define GL_ELEMENT_ARRAY_APPLE 0x8A0C +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E +typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerAPPLE (GLenum type, const void *pointer); +GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count); +GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#endif +#endif /* GL_APPLE_element_array */ + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B +typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); +typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); +typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenFencesAPPLE (GLsizei n, GLuint *fences); +GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei n, const GLuint *fences); +GLAPI void APIENTRY glSetFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint fence); +GLAPI void APIENTRY glFinishFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum object, GLuint name); +GLAPI void APIENTRY glFinishObjectAPPLE (GLenum object, GLint name); +#endif +#endif /* GL_APPLE_fence */ + +#ifndef GL_APPLE_float_pixels +#define GL_APPLE_float_pixels 1 +#define GL_HALF_APPLE 0x140B +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_RGBA_FLOAT16_APPLE 0x881A +#define GL_RGB_FLOAT16_APPLE 0x881B +#define GL_ALPHA_FLOAT16_APPLE 0x881C +#define GL_INTENSITY_FLOAT16_APPLE 0x881D +#define GL_LUMINANCE_FLOAT16_APPLE 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F +#define GL_COLOR_FLOAT_APPLE 0x8A0F +#endif /* GL_APPLE_float_pixels */ + +#ifndef GL_APPLE_flush_buffer_range +#define GL_APPLE_flush_buffer_range 1 +#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 +#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 +typedef void (APIENTRYP PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferParameteriAPPLE (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glFlushMappedBufferRangeAPPLE (GLenum target, GLintptr offset, GLsizeiptr size); +#endif +#endif /* GL_APPLE_flush_buffer_range */ + +#ifndef GL_APPLE_object_purgeable +#define GL_APPLE_object_purgeable 1 +#define GL_BUFFER_OBJECT_APPLE 0x85B3 +#define GL_RELEASED_APPLE 0x8A19 +#define GL_VOLATILE_APPLE 0x8A1A +#define GL_RETAINED_APPLE 0x8A1B +#define GL_UNDEFINED_APPLE 0x8A1C +#define GL_PURGEABLE_APPLE 0x8A1D +typedef GLenum (APIENTRYP PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef GLenum (APIENTRYP PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLenum APIENTRY glObjectPurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); +GLAPI GLenum APIENTRY glObjectUnpurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); +GLAPI void APIENTRY glGetObjectParameterivAPPLE (GLenum objectType, GLuint name, GLenum pname, GLint *params); +#endif +#endif /* GL_APPLE_object_purgeable */ + +#ifndef GL_APPLE_rgb_422 +#define GL_APPLE_rgb_422 1 +#define GL_RGB_422_APPLE 0x8A1F +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#define GL_RGB_RAW_422_APPLE 0x8A51 +#endif /* GL_APPLE_rgb_422 */ + +#ifndef GL_APPLE_row_bytes +#define GL_APPLE_row_bytes 1 +#define GL_PACK_ROW_BYTES_APPLE 0x8A15 +#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 +#endif /* GL_APPLE_row_bytes */ + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 +#endif /* GL_APPLE_specular_vector */ + +#ifndef GL_APPLE_texture_range +#define GL_APPLE_texture_range 1 +#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 +#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#define GL_STORAGE_PRIVATE_APPLE 0x85BD +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF +typedef void (APIENTRYP PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, const void *pointer); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureRangeAPPLE (GLenum target, GLsizei length, const void *pointer); +GLAPI void APIENTRY glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, void **params); +#endif +#endif /* GL_APPLE_texture_range */ + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 +#define GL_TRANSFORM_HINT_APPLE 0x85B1 +#endif /* GL_APPLE_transform_hint */ + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint array); +GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei n, const GLuint *arrays); +GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei n, GLuint *arrays); +GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint array); +#endif +#endif /* GL_APPLE_vertex_array_object */ + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CLIENT_APPLE 0x85B4 +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); +typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei length, void *pointer); +GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei length, void *pointer); +GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum pname, GLint param); +#endif +#endif /* GL_APPLE_vertex_array_range */ + +#ifndef GL_APPLE_vertex_program_evaluators +#define GL_APPLE_vertex_program_evaluators 1 +#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 +#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 +#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 +#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 +#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 +#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 +#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 +#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 +#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 +#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef GLboolean (APIENTRYP PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glEnableVertexAttribAPPLE (GLuint index, GLenum pname); +GLAPI void APIENTRY glDisableVertexAttribAPPLE (GLuint index, GLenum pname); +GLAPI GLboolean APIENTRY glIsVertexAttribEnabledAPPLE (GLuint index, GLenum pname); +GLAPI void APIENTRY glMapVertexAttrib1dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +GLAPI void APIENTRY glMapVertexAttrib1fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +GLAPI void APIENTRY glMapVertexAttrib2dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +GLAPI void APIENTRY glMapVertexAttrib2fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +#endif +#endif /* GL_APPLE_vertex_program_evaluators */ + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 +#define GL_YCBCR_422_APPLE 0x85B9 +#endif /* GL_APPLE_ycbcr_422 */ + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 +typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersATI (GLsizei n, const GLenum *bufs); +#endif +#endif /* GL_ATI_draw_buffers */ + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerATI (GLenum type, const void *pointer); +GLAPI void APIENTRY glDrawElementArrayATI (GLenum mode, GLsizei count); +GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count); +#endif +#endif /* GL_ATI_element_array */ + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBumpParameterivATI (GLenum pname, const GLint *param); +GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum pname, GLint *param); +GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param); +#endif +#endif /* GL_ATI_envmap_bumpmap */ + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_REG_6_ATI 0x8927 +#define GL_REG_7_ATI 0x8928 +#define GL_REG_8_ATI 0x8929 +#define GL_REG_9_ATI 0x892A +#define GL_REG_10_ATI 0x892B +#define GL_REG_11_ATI 0x892C +#define GL_REG_12_ATI 0x892D +#define GL_REG_13_ATI 0x892E +#define GL_REG_14_ATI 0x892F +#define GL_REG_15_ATI 0x8930 +#define GL_REG_16_ATI 0x8931 +#define GL_REG_17_ATI 0x8932 +#define GL_REG_18_ATI 0x8933 +#define GL_REG_19_ATI 0x8934 +#define GL_REG_20_ATI 0x8935 +#define GL_REG_21_ATI 0x8936 +#define GL_REG_22_ATI 0x8937 +#define GL_REG_23_ATI 0x8938 +#define GL_REG_24_ATI 0x8939 +#define GL_REG_25_ATI 0x893A +#define GL_REG_26_ATI 0x893B +#define GL_REG_27_ATI 0x893C +#define GL_REG_28_ATI 0x893D +#define GL_REG_29_ATI 0x893E +#define GL_REG_30_ATI 0x893F +#define GL_REG_31_ATI 0x8940 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_CON_8_ATI 0x8949 +#define GL_CON_9_ATI 0x894A +#define GL_CON_10_ATI 0x894B +#define GL_CON_11_ATI 0x894C +#define GL_CON_12_ATI 0x894D +#define GL_CON_13_ATI 0x894E +#define GL_CON_14_ATI 0x894F +#define GL_CON_15_ATI 0x8950 +#define GL_CON_16_ATI 0x8951 +#define GL_CON_17_ATI 0x8952 +#define GL_CON_18_ATI 0x8953 +#define GL_CON_19_ATI 0x8954 +#define GL_CON_20_ATI 0x8955 +#define GL_CON_21_ATI 0x8956 +#define GL_CON_22_ATI 0x8957 +#define GL_CON_23_ATI 0x8958 +#define GL_CON_24_ATI 0x8959 +#define GL_CON_25_ATI 0x895A +#define GL_CON_26_ATI 0x895B +#define GL_CON_27_ATI 0x895C +#define GL_CON_28_ATI 0x895D +#define GL_CON_29_ATI 0x895E +#define GL_CON_30_ATI 0x895F +#define GL_CON_31_ATI 0x8960 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B +#define GL_RED_BIT_ATI 0x00000001 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint range); +GLAPI void APIENTRY glBindFragmentShaderATI (GLuint id); +GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint id); +GLAPI void APIENTRY glBeginFragmentShaderATI (void); +GLAPI void APIENTRY glEndFragmentShaderATI (void); +GLAPI void APIENTRY glPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle); +GLAPI void APIENTRY glSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle); +GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint dst, const GLfloat *value); +#endif +#endif /* GL_ATI_fragment_shader */ + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 +typedef void *(APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void *APIENTRY glMapObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint buffer); +#endif +#endif /* GL_ATI_map_object_buffer */ + +#ifndef GL_ATI_meminfo +#define GL_ATI_meminfo 1 +#define GL_VBO_FREE_MEMORY_ATI 0x87FB +#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC +#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD +#endif /* GL_ATI_meminfo */ + +#ifndef GL_ATI_pixel_format_float +#define GL_ATI_pixel_format_float 1 +#define GL_RGBA_FLOAT_MODE_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 +#endif /* GL_ATI_pixel_format_float */ + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 +typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPNTrianglesiATI (GLenum pname, GLint param); +GLAPI void APIENTRY glPNTrianglesfATI (GLenum pname, GLfloat param); +#endif +#endif /* GL_ATI_pn_triangles */ + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#endif +#endif /* GL_ATI_separate_stencil */ + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 +#endif /* GL_ATI_text_fragment_shader */ + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +#endif /* GL_ATI_texture_env_combine3 */ + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F +#endif /* GL_ATI_texture_float */ + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#endif /* GL_ATI_texture_mirror_once */ + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 +typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage); +typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei size, const void *pointer, GLenum usage); +GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); +GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glFreeObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetArrayObjectivATI (GLenum array, GLenum pname, GLint *params); +GLAPI void APIENTRY glVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint *params); +#endif +#endif /* GL_ATI_vertex_array_object */ + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 +typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint *params); +#endif +#endif /* GL_ATI_vertex_attrib_array_object */ + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_STREAM0_ATI 0x876C +#define GL_VERTEX_STREAM1_ATI 0x876D +#define GL_VERTEX_STREAM2_ATI 0x876E +#define GL_VERTEX_STREAM3_ATI 0x876F +#define GL_VERTEX_STREAM4_ATI 0x8770 +#define GL_VERTEX_STREAM5_ATI 0x8771 +#define GL_VERTEX_STREAM6_ATI 0x8772 +#define GL_VERTEX_STREAM7_ATI 0x8773 +#define GL_VERTEX_SOURCE_ATI 0x8774 +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexStream1sATI (GLenum stream, GLshort x); +GLAPI void APIENTRY glVertexStream1svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream1iATI (GLenum stream, GLint x); +GLAPI void APIENTRY glVertexStream1ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream1fATI (GLenum stream, GLfloat x); +GLAPI void APIENTRY glVertexStream1fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream1dATI (GLenum stream, GLdouble x); +GLAPI void APIENTRY glVertexStream1dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream2sATI (GLenum stream, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexStream2svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream2iATI (GLenum stream, GLint x, GLint y); +GLAPI void APIENTRY glVertexStream2ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexStream2fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexStream2dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexStream3svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexStream3ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexStream3fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexStream3dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexStream4svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexStream4ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexStream4fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexStream4dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glNormalStream3bATI (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +GLAPI void APIENTRY glNormalStream3bvATI (GLenum stream, const GLbyte *coords); +GLAPI void APIENTRY glNormalStream3sATI (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +GLAPI void APIENTRY glNormalStream3svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glNormalStream3iATI (GLenum stream, GLint nx, GLint ny, GLint nz); +GLAPI void APIENTRY glNormalStream3ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glNormalStream3fATI (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI void APIENTRY glNormalStream3fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glNormalStream3dATI (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +GLAPI void APIENTRY glNormalStream3dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum stream); +GLAPI void APIENTRY glVertexBlendEnviATI (GLenum pname, GLint param); +GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum pname, GLfloat param); +#endif +#endif /* GL_ATI_vertex_streams */ + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF +#endif /* GL_EXT_422_pixels */ + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 +#define GL_ABGR_EXT 0x8000 +#endif /* GL_EXT_abgr */ + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 +#endif /* GL_EXT_bgra */ + +#ifndef GL_EXT_bindable_uniform +#define GL_EXT_bindable_uniform 1 +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF +typedef void (APIENTRYP PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); +typedef GLint (APIENTRYP PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); +typedef GLintptr (APIENTRYP PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniformBufferEXT (GLuint program, GLint location, GLuint buffer); +GLAPI GLint APIENTRY glGetUniformBufferSizeEXT (GLuint program, GLint location); +GLAPI GLintptr APIENTRY glGetUniformOffsetEXT (GLuint program, GLint location); +#endif +#endif /* GL_EXT_bindable_uniform */ + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 +typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColorEXT (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +#endif +#endif /* GL_EXT_blend_color */ + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha); +#endif +#endif /* GL_EXT_blend_equation_separate */ + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif +#endif /* GL_EXT_blend_func_separate */ + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 +#endif /* GL_EXT_blend_logic_op */ + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_BLEND_EQUATION_EXT 0x8009 +typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationEXT (GLenum mode); +#endif +#endif /* GL_EXT_blend_minmax */ + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B +#endif /* GL_EXT_blend_subtract */ + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 +#endif /* GL_EXT_clip_volume_hint */ + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F +#endif /* GL_EXT_cmyka */ + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 +typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#endif +#endif /* GL_EXT_color_subtable */ + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 +typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLockArraysEXT (GLint first, GLsizei count); +GLAPI void APIENTRY glUnlockArraysEXT (void); +#endif +#endif /* GL_EXT_compiled_vertex_array */ + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat params); +GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum target, GLenum pname, GLint params); +GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, void *image); +GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +#endif +#endif /* GL_EXT_convolution */ + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 +typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); +typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); +typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); +typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); +typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); +typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); +typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); +typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); +typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); +typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); +typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTangent3bEXT (GLbyte tx, GLbyte ty, GLbyte tz); +GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glTangent3dEXT (GLdouble tx, GLdouble ty, GLdouble tz); +GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glTangent3fEXT (GLfloat tx, GLfloat ty, GLfloat tz); +GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glTangent3iEXT (GLint tx, GLint ty, GLint tz); +GLAPI void APIENTRY glTangent3ivEXT (const GLint *v); +GLAPI void APIENTRY glTangent3sEXT (GLshort tx, GLshort ty, GLshort tz); +GLAPI void APIENTRY glTangent3svEXT (const GLshort *v); +GLAPI void APIENTRY glBinormal3bEXT (GLbyte bx, GLbyte by, GLbyte bz); +GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glBinormal3dEXT (GLdouble bx, GLdouble by, GLdouble bz); +GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glBinormal3fEXT (GLfloat bx, GLfloat by, GLfloat bz); +GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glBinormal3iEXT (GLint bx, GLint by, GLint bz); +GLAPI void APIENTRY glBinormal3ivEXT (const GLint *v); +GLAPI void APIENTRY glBinormal3sEXT (GLshort bx, GLshort by, GLshort bz); +GLAPI void APIENTRY glBinormal3svEXT (const GLshort *v); +GLAPI void APIENTRY glTangentPointerEXT (GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glBinormalPointerEXT (GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_coordinate_frame */ + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif +#endif /* GL_EXT_copy_texture */ + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC +typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCullParameterdvEXT (GLenum pname, GLdouble *params); +GLAPI void APIENTRY glCullParameterfvEXT (GLenum pname, GLfloat *params); +#endif +#endif /* GL_EXT_cull_vertex */ + +#ifndef GL_EXT_debug_label +#define GL_EXT_debug_label 1 +#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F +#define GL_PROGRAM_OBJECT_EXT 0x8B40 +#define GL_SHADER_OBJECT_EXT 0x8B48 +#define GL_BUFFER_OBJECT_EXT 0x9151 +#define GL_QUERY_OBJECT_EXT 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 +typedef void (APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#endif +#endif /* GL_EXT_debug_label */ + +#ifndef GL_EXT_debug_marker +#define GL_EXT_debug_marker 1 +typedef void (APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); +GLAPI void APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); +GLAPI void APIENTRY glPopGroupMarkerEXT (void); +#endif +#endif /* GL_EXT_debug_marker */ + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthBoundsEXT (GLclampd zmin, GLclampd zmax); +#endif +#endif /* GL_EXT_depth_bounds_test */ + +#ifndef GL_EXT_direct_state_access +#define GL_EXT_direct_state_access 1 +#define GL_PROGRAM_MATRIX_EXT 0x8E2D +#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E +#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F +typedef void (APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +typedef void (APIENTRYP PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); +typedef void (APIENTRYP PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble *data); +typedef void (APIENTRYP PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void **data); +typedef void (APIENTRYP PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); +typedef void (APIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, void *img); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, void *img); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void **params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint *params); +typedef void (APIENTRYP PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void **params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); +typedef void (APIENTRYP PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (APIENTRYP PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void **param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void **param); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixLoadIdentityEXT (GLenum mode); +GLAPI void APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glMatrixPopEXT (GLenum mode); +GLAPI void APIENTRY glMatrixPushEXT (GLenum mode); +GLAPI void APIENTRY glClientAttribDefaultEXT (GLbitfield mask); +GLAPI void APIENTRY glPushClientAttribDefaultEXT (GLbitfield mask); +GLAPI void APIENTRY glTextureParameterfEXT (GLuint texture, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glTextureParameteriEXT (GLuint texture, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetTextureImageEXT (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +GLAPI void APIENTRY glGetTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureLevelParameterfvEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureLevelParameterivEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture); +GLAPI void APIENTRY glMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +GLAPI void APIENTRY glMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); +GLAPI void APIENTRY glMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint *params); +GLAPI void APIENTRY glMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +GLAPI void APIENTRY glGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glEnableClientStateIndexedEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glDisableClientStateIndexedEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat *data); +GLAPI void APIENTRY glGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble *data); +GLAPI void APIENTRY glGetPointerIndexedvEXT (GLenum target, GLuint index, void **data); +GLAPI void APIENTRY glEnableIndexedEXT (GLenum target, GLuint index); +GLAPI void APIENTRY glDisableIndexedEXT (GLenum target, GLuint index); +GLAPI GLboolean APIENTRY glIsEnabledIndexedEXT (GLenum target, GLuint index); +GLAPI void APIENTRY glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data); +GLAPI void APIENTRY glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data); +GLAPI void APIENTRY glCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glGetCompressedTextureImageEXT (GLuint texture, GLenum target, GLint lod, void *img); +GLAPI void APIENTRY glCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint lod, void *img); +GLAPI void APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glNamedBufferDataEXT (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +GLAPI void APIENTRY glNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void *APIENTRY glMapNamedBufferEXT (GLuint buffer, GLenum access); +GLAPI GLboolean APIENTRY glUnmapNamedBufferEXT (GLuint buffer); +GLAPI void APIENTRY glGetNamedBufferParameterivEXT (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedBufferPointervEXT (GLuint buffer, GLenum pname, void **params); +GLAPI void APIENTRY glGetNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +GLAPI void APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); +GLAPI void APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); +GLAPI void APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glTextureBufferEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); +GLAPI void APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint *params); +GLAPI void APIENTRY glEnableClientStateiEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glDisableClientStateiEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glGetFloati_vEXT (GLenum pname, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetDoublei_vEXT (GLenum pname, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetPointeri_vEXT (GLenum pname, GLuint index, void **params); +GLAPI void APIENTRY glNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); +GLAPI void APIENTRY glNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, void *string); +GLAPI void APIENTRY glNamedRenderbufferStorageEXT (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetNamedRenderbufferParameterivEXT (GLuint renderbuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleEXT (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI GLenum APIENTRY glCheckNamedFramebufferStatusEXT (GLuint framebuffer, GLenum target); +GLAPI void APIENTRY glNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glNamedFramebufferRenderbufferEXT (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameterivEXT (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateTextureMipmapEXT (GLuint texture, GLenum target); +GLAPI void APIENTRY glGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target); +GLAPI void APIENTRY glFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode); +GLAPI void APIENTRY glFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode); +GLAPI void APIENTRY glGetFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glNamedFramebufferTextureEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTextureLayerEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +GLAPI void APIENTRY glTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glVertexArrayVertexOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayEdgeFlagOffsetEXT (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayIndexOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayNormalOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayMultiTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayFogCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArraySecondaryColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayVertexAttribOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayVertexAttribIOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glEnableVertexArrayEXT (GLuint vaobj, GLenum array); +GLAPI void APIENTRY glDisableVertexArrayEXT (GLuint vaobj, GLenum array); +GLAPI void APIENTRY glEnableVertexArrayAttribEXT (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glDisableVertexArrayAttribEXT (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glGetVertexArrayIntegervEXT (GLuint vaobj, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayPointervEXT (GLuint vaobj, GLenum pname, void **param); +GLAPI void APIENTRY glGetVertexArrayIntegeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayPointeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, void **param); +GLAPI void *APIENTRY glMapNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI void APIENTRY glFlushMappedNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glNamedBufferStorageEXT (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +GLAPI void APIENTRY glClearNamedBufferDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearNamedBufferSubDataEXT (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glNamedFramebufferParameteriEXT (GLuint framebuffer, GLenum pname, GLint param); +GLAPI void APIENTRY glGetNamedFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glProgramUniform1dEXT (GLuint program, GLint location, GLdouble x); +GLAPI void APIENTRY glProgramUniform2dEXT (GLuint program, GLint location, GLdouble x, GLdouble y); +GLAPI void APIENTRY glProgramUniform3dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glProgramUniform4dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramUniform1dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform2dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform3dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform4dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glTextureBufferRangeEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glTextureStorage2DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureStorage3DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glVertexArrayBindVertexBufferEXT (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI void APIENTRY glVertexArrayVertexAttribFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribIFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribLFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribBindingEXT (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +GLAPI void APIENTRY glVertexArrayVertexBindingDivisorEXT (GLuint vaobj, GLuint bindingindex, GLuint divisor); +GLAPI void APIENTRY glVertexArrayVertexAttribLOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glTexturePageCommitmentEXT (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +GLAPI void APIENTRY glVertexArrayVertexAttribDivisorEXT (GLuint vaobj, GLuint index, GLuint divisor); +#endif +#endif /* GL_EXT_direct_state_access */ + +#ifndef GL_EXT_draw_buffers2 +#define GL_EXT_draw_buffers2 1 +typedef void (APIENTRYP PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +#endif +#endif /* GL_EXT_draw_buffers2 */ + +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#endif +#endif /* GL_EXT_draw_instanced */ + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +#endif +#endif /* GL_EXT_draw_range_elements */ + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogCoordfEXT (GLfloat coord); +GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *coord); +GLAPI void APIENTRY glFogCoorddEXT (GLdouble coord); +GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *coord); +GLAPI void APIENTRY glFogCoordPointerEXT (GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_fog_coord */ + +#ifndef GL_EXT_framebuffer_blit +#define GL_EXT_framebuffer_blit 1 +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA +typedef void (APIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif +#endif /* GL_EXT_framebuffer_blit */ + +#ifndef GL_EXT_framebuffer_multisample +#define GL_EXT_framebuffer_multisample 1 +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_EXT_framebuffer_multisample */ + +#ifndef GL_EXT_framebuffer_multisample_blit_scaled +#define GL_EXT_framebuffer_multisample_blit_scaled 1 +#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA +#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB +#endif /* GL_EXT_framebuffer_multisample_blit_scaled */ + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint renderbuffer); +GLAPI void APIENTRY glBindRenderbufferEXT (GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers); +GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint framebuffer); +GLAPI void APIENTRY glBindFramebufferEXT (GLenum target, GLuint framebuffer); +GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers); +GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei n, GLuint *framebuffers); +GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum target); +GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateMipmapEXT (GLenum target); +#endif +#endif /* GL_EXT_framebuffer_object */ + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_EXT_framebuffer_sRGB 1 +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA +#endif /* GL_EXT_framebuffer_sRGB */ + +#ifndef GL_EXT_geometry_shader4 +#define GL_EXT_geometry_shader4 1 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_LINES_ADJACENCY_EXT 0x000A +#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B +#define GL_TRIANGLES_ADJACENCY_EXT 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); +#endif +#endif /* GL_EXT_geometry_shader4 */ + +#ifndef GL_EXT_gpu_program_parameters +#define GL_EXT_gpu_program_parameters 1 +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +#endif +#endif /* GL_EXT_gpu_program_parameters */ + +#ifndef GL_EXT_gpu_shader4 +#define GL_EXT_gpu_shader4 1 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT 0x8905 +typedef void (APIENTRYP PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetUniformuivEXT (GLuint program, GLint location, GLuint *params); +GLAPI void APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataLocationEXT (GLuint program, const GLchar *name); +GLAPI void APIENTRY glUniform1uiEXT (GLint location, GLuint v0); +GLAPI void APIENTRY glUniform2uiEXT (GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value); +#endif +#endif /* GL_EXT_gpu_shader4 */ + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 +#define GL_TABLE_TOO_LARGE_EXT 0x8031 +typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glResetHistogramEXT (GLenum target); +GLAPI void APIENTRY glResetMinmaxEXT (GLenum target); +#endif +#endif /* GL_EXT_histogram */ + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 +#define GL_IUI_V2F_EXT 0x81AD +#define GL_IUI_V3F_EXT 0x81AE +#define GL_IUI_N3F_V2F_EXT 0x81AF +#define GL_IUI_N3F_V3F_EXT 0x81B0 +#define GL_T2F_IUI_V2F_EXT 0x81B1 +#define GL_T2F_IUI_V3F_EXT 0x81B2 +#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 +#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 +#endif /* GL_EXT_index_array_formats */ + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 +#define GL_INDEX_TEST_EXT 0x81B5 +#define GL_INDEX_TEST_FUNC_EXT 0x81B6 +#define GL_INDEX_TEST_REF_EXT 0x81B7 +typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexFuncEXT (GLenum func, GLclampf ref); +#endif +#endif /* GL_EXT_index_func */ + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 +#define GL_INDEX_MATERIAL_EXT 0x81B8 +#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 +#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA +typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexMaterialEXT (GLenum face, GLenum mode); +#endif +#endif /* GL_EXT_index_material */ + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 +#endif /* GL_EXT_index_texture */ + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glApplyTextureEXT (GLenum mode); +GLAPI void APIENTRY glTextureLightEXT (GLenum pname); +GLAPI void APIENTRY glTextureMaterialEXT (GLenum face, GLenum mode); +#endif +#endif /* GL_EXT_light_texture */ + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 +#endif /* GL_EXT_misc_attribute */ + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); +#endif +#endif /* GL_EXT_multi_draw_arrays */ + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 +typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskEXT (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glSamplePatternEXT (GLenum pattern); +#endif +#endif /* GL_EXT_multisample */ + +#ifndef GL_EXT_packed_depth_stencil +#define GL_EXT_packed_depth_stencil 1 +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 +#endif /* GL_EXT_packed_depth_stencil */ + +#ifndef GL_EXT_packed_float +#define GL_EXT_packed_float 1 +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C +#endif /* GL_EXT_packed_float */ + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 +#endif /* GL_EXT_packed_pixels */ + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glGetColorTableEXT (GLenum target, GLenum format, GLenum type, void *data); +GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +#endif +#endif /* GL_EXT_paletted_texture */ + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF +#endif /* GL_EXT_pixel_buffer_object */ + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetPixelTransformParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetPixelTransformParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +#endif +#endif /* GL_EXT_pixel_transform */ + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 +#endif /* GL_EXT_pixel_transform_color_table */ + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfEXT (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvEXT (GLenum pname, const GLfloat *params); +#endif +#endif /* GL_EXT_point_parameters */ + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat factor, GLfloat bias); +#endif +#endif /* GL_EXT_polygon_offset */ + +#ifndef GL_EXT_provoking_vertex +#define GL_EXT_provoking_vertex 1 +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_PROVOKING_VERTEX_EXT 0x8E4F +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProvokingVertexEXT (GLenum mode); +#endif +#endif /* GL_EXT_provoking_vertex */ + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 +#define GL_RESCALE_NORMAL_EXT 0x803A +#endif /* GL_EXT_rescale_normal */ + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glSecondaryColor3iEXT (GLint red, GLint green, GLint blue); +GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *v); +GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue); +GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *v); +GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *v); +GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue); +GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *v); +GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue); +GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *v); +GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_secondary_color */ + +#ifndef GL_EXT_separate_shader_objects +#define GL_EXT_separate_shader_objects 1 +#define GL_ACTIVE_PROGRAM_EXT 0x8B8D +typedef void (APIENTRYP PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); +typedef void (APIENTRYP PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar *string); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUseShaderProgramEXT (GLenum type, GLuint program); +GLAPI void APIENTRY glActiveProgramEXT (GLuint program); +GLAPI GLuint APIENTRY glCreateShaderProgramEXT (GLenum type, const GLchar *string); +#endif +#endif /* GL_EXT_separate_shader_objects */ + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA +#endif /* GL_EXT_separate_specular_color */ + +#ifndef GL_EXT_shader_image_load_formatted +#define GL_EXT_shader_image_load_formatted 1 +#endif /* GL_EXT_shader_image_load_formatted */ + +#ifndef GL_EXT_shader_image_load_store +#define GL_EXT_shader_image_load_store 1 +#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 +#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A +#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B +#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C +#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D +#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E +#define GL_IMAGE_1D_EXT 0x904C +#define GL_IMAGE_2D_EXT 0x904D +#define GL_IMAGE_3D_EXT 0x904E +#define GL_IMAGE_2D_RECT_EXT 0x904F +#define GL_IMAGE_CUBE_EXT 0x9050 +#define GL_IMAGE_BUFFER_EXT 0x9051 +#define GL_IMAGE_1D_ARRAY_EXT 0x9052 +#define GL_IMAGE_2D_ARRAY_EXT 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 +#define GL_INT_IMAGE_1D_EXT 0x9057 +#define GL_INT_IMAGE_2D_EXT 0x9058 +#define GL_INT_IMAGE_3D_EXT 0x9059 +#define GL_INT_IMAGE_2D_RECT_EXT 0x905A +#define GL_INT_IMAGE_CUBE_EXT 0x905B +#define GL_INT_IMAGE_BUFFER_EXT 0x905C +#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D +#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C +#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D +#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 +#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 +#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF +typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +typedef void (APIENTRYP PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindImageTextureEXT (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +GLAPI void APIENTRY glMemoryBarrierEXT (GLbitfield barriers); +#endif +#endif /* GL_EXT_shader_image_load_store */ + +#ifndef GL_EXT_shader_integer_mix +#define GL_EXT_shader_integer_mix 1 +#endif /* GL_EXT_shader_integer_mix */ + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 +#endif /* GL_EXT_shadow_funcs */ + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB +#endif /* GL_EXT_shared_texture_palette */ + +#ifndef GL_EXT_stencil_clear_tag +#define GL_EXT_stencil_clear_tag 1 +#define GL_STENCIL_TAG_BITS_EXT 0x88F2 +#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 +typedef void (APIENTRYP PFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilClearTagEXT (GLsizei stencilTagBits, GLuint stencilClearTag); +#endif +#endif /* GL_EXT_stencil_clear_tag */ + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum face); +#endif +#endif /* GL_EXT_stencil_two_side */ + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 +#endif /* GL_EXT_stencil_wrap */ + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 +typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +#endif +#endif /* GL_EXT_subtexture */ + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 +#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#endif /* GL_EXT_texture */ + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +#endif +#endif /* GL_EXT_texture3D */ + +#ifndef GL_EXT_texture_array +#define GL_EXT_texture_array 1 +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +#endif /* GL_EXT_texture_array */ + +#ifndef GL_EXT_texture_buffer_object +#define GL_EXT_texture_buffer_object 1 +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E +typedef void (APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); +#endif +#endif /* GL_EXT_texture_buffer_object */ + +#ifndef GL_EXT_texture_compression_latc +#define GL_EXT_texture_compression_latc 1 +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 +#endif /* GL_EXT_texture_compression_latc */ + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE +#endif /* GL_EXT_texture_compression_rgtc */ + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif /* GL_EXT_texture_compression_s3tc */ + +#ifndef GL_EXT_texture_cube_map +#define GL_EXT_texture_cube_map 1 +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C +#endif /* GL_EXT_texture_cube_map */ + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 +#endif /* GL_EXT_texture_env_add */ + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A +#endif /* GL_EXT_texture_env_combine */ + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 +#endif /* GL_EXT_texture_env_dot3 */ + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif /* GL_EXT_texture_filter_anisotropic */ + +#ifndef GL_EXT_texture_integer +#define GL_EXT_texture_integer 1 +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGB8UI_EXT 0x8D7D +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGB32I_EXT 0x8D83 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGB16I_EXT 0x8D89 +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGB8I_EXT 0x8D8F +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E +typedef void (APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); +typedef void (APIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha); +GLAPI void APIENTRY glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha); +#endif +#endif /* GL_EXT_texture_integer */ + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif /* GL_EXT_texture_lod_bias */ + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 +#endif /* GL_EXT_texture_mirror_clamp */ + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A +typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); +typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei n, const GLuint *textures, GLboolean *residences); +GLAPI void APIENTRY glBindTextureEXT (GLenum target, GLuint texture); +GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei n, const GLuint *textures); +GLAPI void APIENTRY glGenTexturesEXT (GLsizei n, GLuint *textures); +GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint texture); +GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei n, const GLuint *textures, const GLclampf *priorities); +#endif +#endif /* GL_EXT_texture_object */ + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF +typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureNormalEXT (GLenum mode); +#endif +#endif /* GL_EXT_texture_perturb_normal */ + +#ifndef GL_EXT_texture_sRGB +#define GL_EXT_texture_sRGB 1 +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB8_EXT 0x8C41 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 +#define GL_SLUMINANCE_EXT 0x8C46 +#define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_COMPRESSED_SRGB_EXT 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F +#endif /* GL_EXT_texture_sRGB */ + +#ifndef GL_EXT_texture_sRGB_decode +#define GL_EXT_texture_sRGB_decode 1 +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#define GL_DECODE_EXT 0x8A49 +#define GL_SKIP_DECODE_EXT 0x8A4A +#endif /* GL_EXT_texture_sRGB_decode */ + +#ifndef GL_EXT_texture_shared_exponent +#define GL_EXT_texture_shared_exponent 1 +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F +#endif /* GL_EXT_texture_shared_exponent */ + +#ifndef GL_EXT_texture_snorm +#define GL_EXT_texture_snorm 1 +#define GL_ALPHA_SNORM 0x9010 +#define GL_LUMINANCE_SNORM 0x9011 +#define GL_LUMINANCE_ALPHA_SNORM 0x9012 +#define GL_INTENSITY_SNORM 0x9013 +#define GL_ALPHA8_SNORM 0x9014 +#define GL_LUMINANCE8_SNORM 0x9015 +#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 +#define GL_INTENSITY8_SNORM 0x9017 +#define GL_ALPHA16_SNORM 0x9018 +#define GL_LUMINANCE16_SNORM 0x9019 +#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A +#define GL_INTENSITY16_SNORM 0x901B +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 +#endif /* GL_EXT_texture_snorm */ + +#ifndef GL_EXT_texture_swizzle +#define GL_EXT_texture_swizzle 1 +#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 +#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 +#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 +#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 +#endif /* GL_EXT_texture_swizzle */ + +#ifndef GL_EXT_timer_query +#define GL_EXT_timer_query 1 +#define GL_TIME_ELAPSED_EXT 0x88BF +typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params); +#endif +#endif /* GL_EXT_timer_query */ + +#ifndef GL_EXT_transform_feedback +#define GL_EXT_transform_feedback 1 +#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F +#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C +#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 +#define GL_RASTERIZER_DISCARD_EXT 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (APIENTRYP PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginTransformFeedbackEXT (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedbackEXT (void); +GLAPI void APIENTRY glBindBufferRangeEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferOffsetEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +GLAPI void APIENTRY glBindBufferBaseEXT (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryingsEXT (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +GLAPI void APIENTRY glGetTransformFeedbackVaryingEXT (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +#endif +#endif /* GL_EXT_transform_feedback */ + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 +typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); +typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, void **params); +typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glArrayElementEXT (GLint i); +GLAPI void APIENTRY glColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glDrawArraysEXT (GLenum mode, GLint first, GLsizei count); +GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean *pointer); +GLAPI void APIENTRY glGetPointervEXT (GLenum pname, void **params); +GLAPI void APIENTRY glIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +#endif +#endif /* GL_EXT_vertex_array */ + +#ifndef GL_EXT_vertex_array_bgra +#define GL_EXT_vertex_array_bgra 1 +#endif /* GL_EXT_vertex_array_bgra */ + +#ifndef GL_EXT_vertex_attrib_64bit +#define GL_EXT_vertex_attrib_64bit 1 +#define GL_DOUBLE_VEC2_EXT 0x8FFC +#define GL_DOUBLE_VEC3_EXT 0x8FFD +#define GL_DOUBLE_VEC4_EXT 0x8FFE +#define GL_DOUBLE_MAT2_EXT 0x8F46 +#define GL_DOUBLE_MAT3_EXT 0x8F47 +#define GL_DOUBLE_MAT4_EXT 0x8F48 +#define GL_DOUBLE_MAT2x3_EXT 0x8F49 +#define GL_DOUBLE_MAT2x4_EXT 0x8F4A +#define GL_DOUBLE_MAT3x2_EXT 0x8F4B +#define GL_DOUBLE_MAT3x4_EXT 0x8F4C +#define GL_DOUBLE_MAT4x2_EXT 0x8F4D +#define GL_DOUBLE_MAT4x3_EXT 0x8F4E +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribL1dEXT (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttribL2dEXT (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttribL3dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttribL4dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttribL1dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL2dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL3dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL4dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribLPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribLdvEXT (GLuint index, GLenum pname, GLdouble *params); +#endif +#endif /* GL_EXT_vertex_attrib_64bit */ + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED +typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const void *addr); +typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const void *addr); +typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); +typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); +typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); +typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); +typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); +typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); +typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); +typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); +typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const void *addr); +typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data); +typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVertexShaderEXT (void); +GLAPI void APIENTRY glEndVertexShaderEXT (void); +GLAPI void APIENTRY glBindVertexShaderEXT (GLuint id); +GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint range); +GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint id); +GLAPI void APIENTRY glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1); +GLAPI void APIENTRY glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +GLAPI void APIENTRY glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +GLAPI void APIENTRY glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +GLAPI void APIENTRY glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +GLAPI void APIENTRY glInsertComponentEXT (GLuint res, GLuint src, GLuint num); +GLAPI void APIENTRY glExtractComponentEXT (GLuint res, GLuint src, GLuint num); +GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +GLAPI void APIENTRY glSetInvariantEXT (GLuint id, GLenum type, const void *addr); +GLAPI void APIENTRY glSetLocalConstantEXT (GLuint id, GLenum type, const void *addr); +GLAPI void APIENTRY glVariantbvEXT (GLuint id, const GLbyte *addr); +GLAPI void APIENTRY glVariantsvEXT (GLuint id, const GLshort *addr); +GLAPI void APIENTRY glVariantivEXT (GLuint id, const GLint *addr); +GLAPI void APIENTRY glVariantfvEXT (GLuint id, const GLfloat *addr); +GLAPI void APIENTRY glVariantdvEXT (GLuint id, const GLdouble *addr); +GLAPI void APIENTRY glVariantubvEXT (GLuint id, const GLubyte *addr); +GLAPI void APIENTRY glVariantusvEXT (GLuint id, const GLushort *addr); +GLAPI void APIENTRY glVariantuivEXT (GLuint id, const GLuint *addr); +GLAPI void APIENTRY glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, const void *addr); +GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint id); +GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint id); +GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum light, GLenum value); +GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum face, GLenum value); +GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value); +GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum unit, GLenum value); +GLAPI GLuint APIENTRY glBindParameterEXT (GLenum value); +GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint id, GLenum cap); +GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +GLAPI void APIENTRY glGetVariantPointervEXT (GLuint id, GLenum value, void **data); +GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +#endif +#endif /* GL_EXT_vertex_shader */ + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 +#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW0_EXT 0x1700 +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexWeightfEXT (GLfloat weight); +GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *weight); +GLAPI void APIENTRY glVertexWeightPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_vertex_weighting */ + +#ifndef GL_EXT_x11_sync_object +#define GL_EXT_x11_sync_object 1 +#define GL_SYNC_X11_FENCE_EXT 0x90E1 +typedef GLsync (APIENTRYP PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLsync APIENTRY glImportSyncEXT (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); +#endif +#endif /* GL_EXT_x11_sync_object */ + +#ifndef GL_GREMEDY_frame_terminator +#define GL_GREMEDY_frame_terminator 1 +typedef void (APIENTRYP PFNGLFRAMETERMINATORGREMEDYPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFrameTerminatorGREMEDY (void); +#endif +#endif /* GL_GREMEDY_frame_terminator */ + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 +typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei len, const void *string); +#endif +#endif /* GL_GREMEDY_string_marker */ + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 +#define GL_IGNORE_BORDER_HP 0x8150 +#define GL_CONSTANT_BORDER_HP 0x8151 +#define GL_REPLICATE_BORDER_HP 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 +#endif /* GL_HP_convolution_border_modes */ + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 +#define GL_IMAGE_SCALE_X_HP 0x8155 +#define GL_IMAGE_SCALE_Y_HP 0x8156 +#define GL_IMAGE_TRANSLATE_X_HP 0x8157 +#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 +#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 +#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A +#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B +#define GL_IMAGE_MAG_FILTER_HP 0x815C +#define GL_IMAGE_MIN_FILTER_HP 0x815D +#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E +#define GL_CUBIC_HP 0x815F +#define GL_AVERAGE_HP 0x8160 +#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 +#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 +#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImageTransformParameteriHP (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glImageTransformParameterfHP (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glImageTransformParameterivHP (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum target, GLenum pname, GLfloat *params); +#endif +#endif /* GL_HP_image_transform */ + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 +#endif /* GL_HP_occlusion_test */ + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 +#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 +#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 +#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 +#endif /* GL_HP_texture_lighting */ + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 +#define GL_CULL_VERTEX_IBM 103050 +#endif /* GL_IBM_cull_vertex */ + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 +typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride); +#endif +#endif /* GL_IBM_multimode_draw_arrays */ + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 +#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 +#endif /* GL_IBM_rasterpos_clip */ + +#ifndef GL_IBM_static_data +#define GL_IBM_static_data 1 +#define GL_ALL_STATIC_DATA_IBM 103060 +#define GL_STATIC_VERTEX_ARRAY_IBM 103061 +typedef void (APIENTRYP PFNGLFLUSHSTATICDATAIBMPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushStaticDataIBM (GLenum target); +#endif +#endif /* GL_IBM_static_data */ + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_IBM_texture_mirrored_repeat 1 +#define GL_MIRRORED_REPEAT_IBM 0x8370 +#endif /* GL_IBM_texture_mirrored_repeat */ + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 +typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint stride, const GLboolean **pointer, GLint ptrstride); +GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glIndexPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glNormalPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glVertexPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +#endif +#endif /* GL_IBM_vertex_array_lists */ + +#ifndef GL_INGR_blend_func_separate +#define GL_INGR_blend_func_separate 1 +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif +#endif /* GL_INGR_blend_func_separate */ + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 +#endif /* GL_INGR_color_clamp */ + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 +#define GL_INTERLACE_READ_INGR 0x8568 +#endif /* GL_INGR_interlace_read */ + +#ifndef GL_INTEL_fragment_shader_ordering +#define GL_INTEL_fragment_shader_ordering 1 +#endif /* GL_INTEL_fragment_shader_ordering */ + +#ifndef GL_INTEL_map_texture +#define GL_INTEL_map_texture 1 +#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF +#define GL_LAYOUT_DEFAULT_INTEL 0 +#define GL_LAYOUT_LINEAR_INTEL 1 +#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 +typedef void (APIENTRYP PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); +typedef void *(APIENTRYP PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSyncTextureINTEL (GLuint texture); +GLAPI void APIENTRY glUnmapTexture2DINTEL (GLuint texture, GLint level); +GLAPI void *APIENTRY glMapTexture2DINTEL (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout); +#endif +#endif /* GL_INTEL_map_texture */ + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 +typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexPointervINTEL (GLint size, GLenum type, const void **pointer); +GLAPI void APIENTRY glNormalPointervINTEL (GLenum type, const void **pointer); +GLAPI void APIENTRY glColorPointervINTEL (GLint size, GLenum type, const void **pointer); +GLAPI void APIENTRY glTexCoordPointervINTEL (GLint size, GLenum type, const void **pointer); +#endif +#endif /* GL_INTEL_parallel_arrays */ + +#ifndef GL_INTEL_performance_query +#define GL_INTEL_performance_query 1 +#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000 +#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001 +#define GL_PERFQUERY_WAIT_INTEL 0x83FB +#define GL_PERFQUERY_FLUSH_INTEL 0x83FA +#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 +#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 +#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 +#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 +#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 +#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 +#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 +#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 +#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 +#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA +#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB +#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC +#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD +#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE +#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF +#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 +typedef void (APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle); +typedef void (APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId); +typedef void (APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId); +typedef void (APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +typedef void (APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); +typedef void (APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId); +typedef void (APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle); +GLAPI void APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glEndPerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId); +GLAPI void APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId); +GLAPI void APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +GLAPI void APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); +GLAPI void APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId); +GLAPI void APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); +#endif +#endif /* GL_INTEL_performance_query */ + +#ifndef GL_MESAX_texture_stack +#define GL_MESAX_texture_stack 1 +#define GL_TEXTURE_1D_STACK_MESAX 0x8759 +#define GL_TEXTURE_2D_STACK_MESAX 0x875A +#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B +#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C +#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D +#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E +#endif /* GL_MESAX_texture_stack */ + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 +#define GL_PACK_INVERT_MESA 0x8758 +#endif /* GL_MESA_pack_invert */ + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 +typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glResizeBuffersMESA (void); +#endif +#endif /* GL_MESA_resize_buffers */ + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 +typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dMESA (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2fMESA (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2iMESA (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos2sMESA (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *v); +GLAPI void APIENTRY glWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3iMESA (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos3sMESA (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *v); +GLAPI void APIENTRY glWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *v); +#endif +#endif /* GL_MESA_window_pos */ + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 +#endif /* GL_MESA_ycbcr_texture */ + +#ifndef GL_NVX_conditional_render +#define GL_NVX_conditional_render 1 +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginConditionalRenderNVX (GLuint id); +GLAPI void APIENTRY glEndConditionalRenderNVX (void); +#endif +#endif /* GL_NVX_conditional_render */ + +#ifndef GL_NVX_gpu_memory_info +#define GL_NVX_gpu_memory_info 1 +#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 +#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 +#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 +#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A +#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B +#endif /* GL_NVX_gpu_memory_info */ + +#ifndef GL_NV_bindless_multi_draw_indirect +#define GL_NV_bindless_multi_draw_indirect 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +#endif +#endif /* GL_NV_bindless_multi_draw_indirect */ + +#ifndef GL_NV_bindless_texture +#define GL_NV_bindless_texture 1 +typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); +typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint64 APIENTRY glGetTextureHandleNV (GLuint texture); +GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler); +GLAPI void APIENTRY glMakeTextureHandleResidentNV (GLuint64 handle); +GLAPI void APIENTRY glMakeTextureHandleNonResidentNV (GLuint64 handle); +GLAPI GLuint64 APIENTRY glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +GLAPI void APIENTRY glMakeImageHandleResidentNV (GLuint64 handle, GLenum access); +GLAPI void APIENTRY glMakeImageHandleNonResidentNV (GLuint64 handle); +GLAPI void APIENTRY glUniformHandleui64NV (GLint location, GLuint64 value); +GLAPI void APIENTRY glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value); +GLAPI void APIENTRY glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +GLAPI GLboolean APIENTRY glIsTextureHandleResidentNV (GLuint64 handle); +GLAPI GLboolean APIENTRY glIsImageHandleResidentNV (GLuint64 handle); +#endif +#endif /* GL_NV_bindless_texture */ + +#ifndef GL_NV_blend_equation_advanced +#define GL_NV_blend_equation_advanced 1 +#define GL_BLEND_OVERLAP_NV 0x9281 +#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 +#define GL_BLUE_NV 0x1905 +#define GL_COLORBURN_NV 0x929A +#define GL_COLORDODGE_NV 0x9299 +#define GL_CONJOINT_NV 0x9284 +#define GL_CONTRAST_NV 0x92A1 +#define GL_DARKEN_NV 0x9297 +#define GL_DIFFERENCE_NV 0x929E +#define GL_DISJOINT_NV 0x9283 +#define GL_DST_ATOP_NV 0x928F +#define GL_DST_IN_NV 0x928B +#define GL_DST_NV 0x9287 +#define GL_DST_OUT_NV 0x928D +#define GL_DST_OVER_NV 0x9289 +#define GL_EXCLUSION_NV 0x92A0 +#define GL_GREEN_NV 0x1904 +#define GL_HARDLIGHT_NV 0x929B +#define GL_HARDMIX_NV 0x92A9 +#define GL_HSL_COLOR_NV 0x92AF +#define GL_HSL_HUE_NV 0x92AD +#define GL_HSL_LUMINOSITY_NV 0x92B0 +#define GL_HSL_SATURATION_NV 0x92AE +#define GL_INVERT_OVG_NV 0x92B4 +#define GL_INVERT_RGB_NV 0x92A3 +#define GL_LIGHTEN_NV 0x9298 +#define GL_LINEARBURN_NV 0x92A5 +#define GL_LINEARDODGE_NV 0x92A4 +#define GL_LINEARLIGHT_NV 0x92A7 +#define GL_MINUS_CLAMPED_NV 0x92B3 +#define GL_MINUS_NV 0x929F +#define GL_MULTIPLY_NV 0x9294 +#define GL_OVERLAY_NV 0x9296 +#define GL_PINLIGHT_NV 0x92A8 +#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 +#define GL_PLUS_CLAMPED_NV 0x92B1 +#define GL_PLUS_DARKER_NV 0x9292 +#define GL_PLUS_NV 0x9291 +#define GL_RED_NV 0x1903 +#define GL_SCREEN_NV 0x9295 +#define GL_SOFTLIGHT_NV 0x929C +#define GL_SRC_ATOP_NV 0x928E +#define GL_SRC_IN_NV 0x928A +#define GL_SRC_NV 0x9286 +#define GL_SRC_OUT_NV 0x928C +#define GL_SRC_OVER_NV 0x9288 +#define GL_UNCORRELATED_NV 0x9282 +#define GL_VIVIDLIGHT_NV 0x92A6 +#define GL_XOR_NV 0x1506 +typedef void (APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLBLENDBARRIERNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendParameteriNV (GLenum pname, GLint value); +GLAPI void APIENTRY glBlendBarrierNV (void); +#endif +#endif /* GL_NV_blend_equation_advanced */ + +#ifndef GL_NV_blend_equation_advanced_coherent +#define GL_NV_blend_equation_advanced_coherent 1 +#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 +#endif /* GL_NV_blend_equation_advanced_coherent */ + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 +#endif /* GL_NV_blend_square */ + +#ifndef GL_NV_compute_program5 +#define GL_NV_compute_program5 1 +#define GL_COMPUTE_PROGRAM_NV 0x90FB +#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC +#endif /* GL_NV_compute_program5 */ + +#ifndef GL_NV_conditional_render +#define GL_NV_conditional_render 1 +#define GL_QUERY_WAIT_NV 0x8E13 +#define GL_QUERY_NO_WAIT_NV 0x8E14 +#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode); +GLAPI void APIENTRY glEndConditionalRenderNV (void); +#endif +#endif /* GL_NV_conditional_render */ + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F +#endif /* GL_NV_copy_depth_to_color */ + +#ifndef GL_NV_copy_image +#define GL_NV_copy_image 1 +typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyImageSubDataNV (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +#endif +#endif /* GL_NV_copy_image */ + +#ifndef GL_NV_deep_texture3D +#define GL_NV_deep_texture3D 1 +#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 +#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 +#endif /* GL_NV_deep_texture3D */ + +#ifndef GL_NV_depth_buffer_float +#define GL_NV_depth_buffer_float 1 +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF +typedef void (APIENTRYP PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); +typedef void (APIENTRYP PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthRangedNV (GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glClearDepthdNV (GLdouble depth); +GLAPI void APIENTRY glDepthBoundsdNV (GLdouble zmin, GLdouble zmax); +#endif +#endif /* GL_NV_depth_buffer_float */ + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 +#define GL_DEPTH_CLAMP_NV 0x864F +#endif /* GL_NV_depth_clamp */ + +#ifndef GL_NV_draw_texture +#define GL_NV_draw_texture 1 +typedef void (APIENTRYP PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawTextureNV (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +#endif +#endif /* GL_NV_draw_texture */ + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); +typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); +GLAPI void APIENTRY glMapParameterivNV (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMapParameterfvNV (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); +GLAPI void APIENTRY glGetMapParameterivNV (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glEvalMapsNV (GLenum target, GLenum mode); +#endif +#endif /* GL_NV_evaluators */ + +#ifndef GL_NV_explicit_multisample +#define GL_NV_explicit_multisample 1 +#define GL_SAMPLE_POSITION_NV 0x8E50 +#define GL_SAMPLE_MASK_NV 0x8E51 +#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 +#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 +#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 +#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 +#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 +#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 +#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 +#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 +typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (APIENTRYP PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); +typedef void (APIENTRYP PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetMultisamplefvNV (GLenum pname, GLuint index, GLfloat *val); +GLAPI void APIENTRY glSampleMaskIndexedNV (GLuint index, GLbitfield mask); +GLAPI void APIENTRY glTexRenderbufferNV (GLenum target, GLuint renderbuffer); +#endif +#endif /* GL_NV_explicit_multisample */ + +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); +GLAPI void APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); +GLAPI GLboolean APIENTRY glIsFenceNV (GLuint fence); +GLAPI GLboolean APIENTRY glTestFenceNV (GLuint fence); +GLAPI void APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); +GLAPI void APIENTRY glFinishFenceNV (GLuint fence); +GLAPI void APIENTRY glSetFenceNV (GLuint fence, GLenum condition); +#endif +#endif /* GL_NV_fence */ + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E +#endif /* GL_NV_float_buffer */ + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +#endif /* GL_NV_fog_distance */ + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#endif +#endif /* GL_NV_fragment_program */ + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 +#endif /* GL_NV_fragment_program2 */ + +#ifndef GL_NV_fragment_program4 +#define GL_NV_fragment_program4 1 +#endif /* GL_NV_fragment_program4 */ + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 +#endif /* GL_NV_fragment_program_option */ + +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_NV_framebuffer_multisample_coverage 1 +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_NV_framebuffer_multisample_coverage */ + +#ifndef GL_NV_geometry_program4 +#define GL_NV_geometry_program4 1 +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 +typedef void (APIENTRYP PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramVertexLimitNV (GLenum target, GLint limit); +GLAPI void APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#endif +#endif /* GL_NV_geometry_program4 */ + +#ifndef GL_NV_geometry_shader4 +#define GL_NV_geometry_shader4 1 +#endif /* GL_NV_geometry_shader4 */ + +#ifndef GL_NV_gpu_program4 +#define GL_NV_gpu_program4 1 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 +#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 +#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 +#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 +#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 +#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 +#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params); +GLAPI void APIENTRY glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params); +#endif +#endif /* GL_NV_gpu_program4 */ + +#ifndef GL_NV_gpu_program5 +#define GL_NV_gpu_program5 1 +#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C +#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F +#define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44 +#define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV 0x8F45 +typedef void (APIENTRYP PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC) (GLenum target, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC) (GLenum target, GLuint index, GLuint *param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramSubroutineParametersuivNV (GLenum target, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetProgramSubroutineParameteruivNV (GLenum target, GLuint index, GLuint *param); +#endif +#endif /* GL_NV_gpu_program5 */ + +#ifndef GL_NV_gpu_program5_mem_extended +#define GL_NV_gpu_program5_mem_extended 1 +#endif /* GL_NV_gpu_program5_mem_extended */ + +#ifndef GL_NV_gpu_shader5 +#define GL_NV_gpu_shader5 1 +#endif /* GL_NV_gpu_shader5 */ + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 +typedef unsigned short GLhalfNV; +#define GL_HALF_FLOAT_NV 0x140B +typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); +typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); +typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertex2hNV (GLhalfNV x, GLhalfNV y); +GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertex3hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z); +GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertex4hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glNormal3hNV (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glColor4hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV s); +GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV s, GLhalfNV t); +GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r); +GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum target, GLhalfNV s); +GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum target, GLhalfNV s, GLhalfNV t); +GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glFogCoordhNV (GLhalfNV fog); +GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *fog); +GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV weight); +GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *weight); +GLAPI void APIENTRY glVertexAttrib1hNV (GLuint index, GLhalfNV x); +GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib2hNV (GLuint index, GLhalfNV x, GLhalfNV y); +GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib3hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib4hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +#endif +#endif /* GL_NV_half_float */ + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 +#endif /* GL_NV_light_max_exponent */ + +#ifndef GL_NV_multisample_coverage +#define GL_NV_multisample_coverage 1 +#define GL_COLOR_SAMPLES_NV 0x8E20 +#endif /* GL_NV_multisample_coverage */ + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#endif /* GL_NV_multisample_filter_hint */ + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint id); +GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint id); +GLAPI void APIENTRY glEndOcclusionQueryNV (void); +GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint *params); +#endif +#endif /* GL_NV_occlusion_query */ + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA +#endif /* GL_NV_packed_depth_stencil */ + +#ifndef GL_NV_parameter_buffer_object +#define GL_NV_parameter_buffer_object 1 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 +#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 +#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 +#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramBufferParametersfvNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glProgramBufferParametersIivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramBufferParametersIuivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); +#endif +#endif /* GL_NV_parameter_buffer_object */ + +#ifndef GL_NV_parameter_buffer_object2 +#define GL_NV_parameter_buffer_object2 1 +#endif /* GL_NV_parameter_buffer_object2 */ + +#ifndef GL_NV_path_rendering +#define GL_NV_path_rendering 1 +#define GL_PATH_FORMAT_SVG_NV 0x9070 +#define GL_PATH_FORMAT_PS_NV 0x9071 +#define GL_STANDARD_FONT_NAME_NV 0x9072 +#define GL_SYSTEM_FONT_NAME_NV 0x9073 +#define GL_FILE_NAME_NV 0x9074 +#define GL_PATH_STROKE_WIDTH_NV 0x9075 +#define GL_PATH_END_CAPS_NV 0x9076 +#define GL_PATH_INITIAL_END_CAP_NV 0x9077 +#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 +#define GL_PATH_JOIN_STYLE_NV 0x9079 +#define GL_PATH_MITER_LIMIT_NV 0x907A +#define GL_PATH_DASH_CAPS_NV 0x907B +#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C +#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D +#define GL_PATH_DASH_OFFSET_NV 0x907E +#define GL_PATH_CLIENT_LENGTH_NV 0x907F +#define GL_PATH_FILL_MODE_NV 0x9080 +#define GL_PATH_FILL_MASK_NV 0x9081 +#define GL_PATH_FILL_COVER_MODE_NV 0x9082 +#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 +#define GL_PATH_STROKE_MASK_NV 0x9084 +#define GL_COUNT_UP_NV 0x9088 +#define GL_COUNT_DOWN_NV 0x9089 +#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A +#define GL_CONVEX_HULL_NV 0x908B +#define GL_BOUNDING_BOX_NV 0x908D +#define GL_TRANSLATE_X_NV 0x908E +#define GL_TRANSLATE_Y_NV 0x908F +#define GL_TRANSLATE_2D_NV 0x9090 +#define GL_TRANSLATE_3D_NV 0x9091 +#define GL_AFFINE_2D_NV 0x9092 +#define GL_AFFINE_3D_NV 0x9094 +#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 +#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 +#define GL_UTF8_NV 0x909A +#define GL_UTF16_NV 0x909B +#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C +#define GL_PATH_COMMAND_COUNT_NV 0x909D +#define GL_PATH_COORD_COUNT_NV 0x909E +#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F +#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 +#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 +#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 +#define GL_SQUARE_NV 0x90A3 +#define GL_ROUND_NV 0x90A4 +#define GL_TRIANGULAR_NV 0x90A5 +#define GL_BEVEL_NV 0x90A6 +#define GL_MITER_REVERT_NV 0x90A7 +#define GL_MITER_TRUNCATE_NV 0x90A8 +#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 +#define GL_USE_MISSING_GLYPH_NV 0x90AA +#define GL_PATH_ERROR_POSITION_NV 0x90AB +#define GL_PATH_FOG_GEN_MODE_NV 0x90AC +#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD +#define GL_ADJACENT_PAIRS_NV 0x90AE +#define GL_FIRST_TO_REST_NV 0x90AF +#define GL_PATH_GEN_MODE_NV 0x90B0 +#define GL_PATH_GEN_COEFF_NV 0x90B1 +#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 +#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 +#define GL_PATH_STENCIL_FUNC_NV 0x90B7 +#define GL_PATH_STENCIL_REF_NV 0x90B8 +#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 +#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD +#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE +#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF +#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 +#define GL_MOVE_TO_RESETS_NV 0x90B5 +#define GL_MOVE_TO_CONTINUES_NV 0x90B6 +#define GL_CLOSE_PATH_NV 0x00 +#define GL_MOVE_TO_NV 0x02 +#define GL_RELATIVE_MOVE_TO_NV 0x03 +#define GL_LINE_TO_NV 0x04 +#define GL_RELATIVE_LINE_TO_NV 0x05 +#define GL_HORIZONTAL_LINE_TO_NV 0x06 +#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 +#define GL_VERTICAL_LINE_TO_NV 0x08 +#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 +#define GL_QUADRATIC_CURVE_TO_NV 0x0A +#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B +#define GL_CUBIC_CURVE_TO_NV 0x0C +#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D +#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E +#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F +#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 +#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 +#define GL_SMALL_CCW_ARC_TO_NV 0x12 +#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 +#define GL_SMALL_CW_ARC_TO_NV 0x14 +#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 +#define GL_LARGE_CCW_ARC_TO_NV 0x16 +#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 +#define GL_LARGE_CW_ARC_TO_NV 0x18 +#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 +#define GL_RESTART_PATH_NV 0xF0 +#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 +#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 +#define GL_RECT_NV 0xF6 +#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 +#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA +#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC +#define GL_ARC_TO_NV 0xFE +#define GL_RELATIVE_ARC_TO_NV 0xFF +#define GL_BOLD_BIT_NV 0x01 +#define GL_ITALIC_BIT_NV 0x02 +#define GL_GLYPH_WIDTH_BIT_NV 0x01 +#define GL_GLYPH_HEIGHT_BIT_NV 0x02 +#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 +#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 +#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 +#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 +#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 +#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 +#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 +#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 +#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 +#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 +#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 +#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 +#define GL_FONT_ASCENDER_BIT_NV 0x00200000 +#define GL_FONT_DESCENDER_BIT_NV 0x00400000 +#define GL_FONT_HEIGHT_BIT_NV 0x00800000 +#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 +#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 +#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 +#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 +#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +typedef GLuint (APIENTRYP PFNGLGENPATHSNVPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISPATHNVPROC) (GLuint path); +typedef void (APIENTRYP PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); +typedef void (APIENTRYP PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); +typedef void (APIENTRYP PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); +typedef void (APIENTRYP PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +typedef void (APIENTRYP PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value); +typedef void (APIENTRYP PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value); +typedef void (APIENTRYP PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); +typedef void (APIENTRYP PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray); +typedef void (APIENTRYP PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); +typedef void (APIENTRYP PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func); +typedef void (APIENTRYP PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); +typedef void (APIENTRYP PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); +typedef void (APIENTRYP PFNGLPATHFOGGENNVPROC) (GLenum genMode); +typedef void (APIENTRYP PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (APIENTRYP PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value); +typedef void (APIENTRYP PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands); +typedef void (APIENTRYP PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords); +typedef void (APIENTRYP PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray); +typedef void (APIENTRYP PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +typedef void (APIENTRYP PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); +typedef void (APIENTRYP PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +typedef void (APIENTRYP PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat *value); +typedef void (APIENTRYP PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat *value); +typedef GLboolean (APIENTRYP PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); +typedef GLboolean (APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); +typedef GLfloat (APIENTRYP PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); +typedef GLboolean (APIENTRYP PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenPathsNV (GLsizei range); +GLAPI void APIENTRY glDeletePathsNV (GLuint path, GLsizei range); +GLAPI GLboolean APIENTRY glIsPathNV (GLuint path); +GLAPI void APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString); +GLAPI void APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI void APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI void APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); +GLAPI void APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath); +GLAPI void APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +GLAPI void APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value); +GLAPI void APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value); +GLAPI void APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value); +GLAPI void APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value); +GLAPI void APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray); +GLAPI void APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask); +GLAPI void APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units); +GLAPI void APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask); +GLAPI void APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask); +GLAPI void APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glPathCoverDepthFuncNV (GLenum func); +GLAPI void APIENTRY glPathColorGenNV (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); +GLAPI void APIENTRY glPathTexGenNV (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); +GLAPI void APIENTRY glPathFogGenNV (GLenum genMode); +GLAPI void APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode); +GLAPI void APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode); +GLAPI void APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value); +GLAPI void APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands); +GLAPI void APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords); +GLAPI void APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray); +GLAPI void APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +GLAPI void APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); +GLAPI void APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +GLAPI void APIENTRY glGetPathColorGenivNV (GLenum color, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathColorGenfvNV (GLenum color, GLenum pname, GLfloat *value); +GLAPI void APIENTRY glGetPathTexGenivNV (GLenum texCoordSet, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathTexGenfvNV (GLenum texCoordSet, GLenum pname, GLfloat *value); +GLAPI GLboolean APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y); +GLAPI GLboolean APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y); +GLAPI GLfloat APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments); +GLAPI GLboolean APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +#endif +#endif /* GL_NV_path_rendering */ + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D +typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, const void *pointer); +typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelDataRangeNV (GLenum target, GLsizei length, const void *pointer); +GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum target); +#endif +#endif /* GL_NV_pixel_data_range */ + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameteriNV (GLenum pname, GLint param); +GLAPI void APIENTRY glPointParameterivNV (GLenum pname, const GLint *params); +#endif +#endif /* GL_NV_point_sprite */ + +#ifndef GL_NV_present_video +#define GL_NV_present_video 1 +#define GL_FRAME_NV 0x8E26 +#define GL_FIELDS_NV 0x8E27 +#define GL_CURRENT_TIME_NV 0x8E28 +#define GL_NUM_FILL_STREAMS_NV 0x8E29 +#define GL_PRESENT_TIME_NV 0x8E2A +#define GL_PRESENT_DURATION_NV 0x8E2B +typedef void (APIENTRYP PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +typedef void (APIENTRYP PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +typedef void (APIENTRYP PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPresentFrameKeyedNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +GLAPI void APIENTRY glPresentFrameDualFillNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +GLAPI void APIENTRY glGetVideoivNV (GLuint video_slot, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideouivNV (GLuint video_slot, GLenum pname, GLuint *params); +GLAPI void APIENTRY glGetVideoi64vNV (GLuint video_slot, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetVideoui64vNV (GLuint video_slot, GLenum pname, GLuint64EXT *params); +#endif +#endif /* GL_NV_present_video */ + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPrimitiveRestartNV (void); +GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint index); +#endif +#endif /* GL_NV_primitive_restart */ + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerParameterfvNV (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glCombinerParameterfNV (GLenum pname, GLfloat param); +GLAPI void APIENTRY glCombinerParameterivNV (GLenum pname, const GLint *params); +GLAPI void APIENTRY glCombinerParameteriNV (GLenum pname, GLint param); +GLAPI void APIENTRY glCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +GLAPI void APIENTRY glCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +GLAPI void APIENTRY glFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint *params); +#endif +#endif /* GL_NV_register_combiners */ + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat *params); +#endif +#endif /* GL_NV_register_combiners2 */ + +#ifndef GL_NV_shader_atomic_counters +#define GL_NV_shader_atomic_counters 1 +#endif /* GL_NV_shader_atomic_counters */ + +#ifndef GL_NV_shader_atomic_float +#define GL_NV_shader_atomic_float 1 +#endif /* GL_NV_shader_atomic_float */ + +#ifndef GL_NV_shader_buffer_load +#define GL_NV_shader_buffer_load 1 +#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D +#define GL_GPU_ADDRESS_NV 0x8F34 +#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 +typedef void (APIENTRYP PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); +typedef void (APIENTRYP PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); +typedef GLboolean (APIENTRYP PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); +typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); +typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); +typedef GLboolean (APIENTRYP PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT *result); +typedef void (APIENTRYP PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); +typedef void (APIENTRYP PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMakeBufferResidentNV (GLenum target, GLenum access); +GLAPI void APIENTRY glMakeBufferNonResidentNV (GLenum target); +GLAPI GLboolean APIENTRY glIsBufferResidentNV (GLenum target); +GLAPI void APIENTRY glMakeNamedBufferResidentNV (GLuint buffer, GLenum access); +GLAPI void APIENTRY glMakeNamedBufferNonResidentNV (GLuint buffer); +GLAPI GLboolean APIENTRY glIsNamedBufferResidentNV (GLuint buffer); +GLAPI void APIENTRY glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glGetIntegerui64vNV (GLenum value, GLuint64EXT *result); +GLAPI void APIENTRY glUniformui64NV (GLint location, GLuint64EXT value); +GLAPI void APIENTRY glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value); +GLAPI void APIENTRY glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif +#endif /* GL_NV_shader_buffer_load */ + +#ifndef GL_NV_shader_buffer_store +#define GL_NV_shader_buffer_store 1 +#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010 +#endif /* GL_NV_shader_buffer_store */ + +#ifndef GL_NV_shader_storage_buffer_object +#define GL_NV_shader_storage_buffer_object 1 +#endif /* GL_NV_shader_storage_buffer_object */ + +#ifndef GL_NV_shader_thread_group +#define GL_NV_shader_thread_group 1 +#define GL_WARP_SIZE_NV 0x9339 +#define GL_WARPS_PER_SM_NV 0x933A +#define GL_SM_COUNT_NV 0x933B +#endif /* GL_NV_shader_thread_group */ + +#ifndef GL_NV_shader_thread_shuffle +#define GL_NV_shader_thread_shuffle 1 +#endif /* GL_NV_shader_thread_shuffle */ + +#ifndef GL_NV_tessellation_program5 +#define GL_NV_tessellation_program5 1 +#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 +#define GL_TESS_CONTROL_PROGRAM_NV 0x891E +#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F +#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 +#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 +#endif /* GL_NV_tessellation_program5 */ + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F +#endif /* GL_NV_texgen_emboss */ + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 +#endif /* GL_NV_texgen_reflection */ + +#ifndef GL_NV_texture_barrier +#define GL_NV_texture_barrier 1 +typedef void (APIENTRYP PFNGLTEXTUREBARRIERNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureBarrierNV (void); +#endif +#endif /* GL_NV_texture_barrier */ + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 +#endif /* GL_NV_texture_compression_vtc */ + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B +#endif /* GL_NV_texture_env_combine4 */ + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F +#endif /* GL_NV_texture_expand_normal */ + +#ifndef GL_NV_texture_multisample +#define GL_NV_texture_multisample 1 +#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 +#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 +typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage2DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTexImage3DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage2DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage3DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage2DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage3DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +#endif +#endif /* GL_NV_texture_multisample */ + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 +#endif /* GL_NV_texture_rectangle */ + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#endif /* GL_NV_texture_shader */ + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#endif /* GL_NV_texture_shader2 */ + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#endif /* GL_NV_texture_shader3 */ + +#ifndef GL_NV_transform_feedback +#define GL_NV_transform_feedback 1 +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F +#define GL_LAYER_NV 0x8DAA +#define GL_NEXT_BUFFER_NV -2 +#define GL_SKIP_COMPONENTS4_NV -3 +#define GL_SKIP_COMPONENTS3_NV -4 +#define GL_SKIP_COMPONENTS2_NV -5 +#define GL_SKIP_COMPONENTS1_NV -6 +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (APIENTRYP PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); +typedef void (APIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginTransformFeedbackNV (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedbackNV (void); +GLAPI void APIENTRY glTransformFeedbackAttribsNV (GLuint count, const GLint *attribs, GLenum bufferMode); +GLAPI void APIENTRY glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +GLAPI void APIENTRY glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); +GLAPI void APIENTRY glActiveVaryingNV (GLuint program, const GLchar *name); +GLAPI GLint APIENTRY glGetVaryingLocationNV (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location); +GLAPI void APIENTRY glTransformFeedbackStreamAttribsNV (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); +#endif +#endif /* GL_NV_transform_feedback */ + +#ifndef GL_NV_transform_feedback2 +#define GL_NV_transform_feedback2 1 +#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 +typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint *ids); +typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindTransformFeedbackNV (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteTransformFeedbacksNV (GLsizei n, const GLuint *ids); +GLAPI void APIENTRY glGenTransformFeedbacksNV (GLsizei n, GLuint *ids); +GLAPI GLboolean APIENTRY glIsTransformFeedbackNV (GLuint id); +GLAPI void APIENTRY glPauseTransformFeedbackNV (void); +GLAPI void APIENTRY glResumeTransformFeedbackNV (void); +GLAPI void APIENTRY glDrawTransformFeedbackNV (GLenum mode, GLuint id); +#endif +#endif /* GL_NV_transform_feedback2 */ + +#ifndef GL_NV_vdpau_interop +#define GL_NV_vdpau_interop 1 +typedef GLintptr GLvdpauSurfaceNV; +#define GL_SURFACE_STATE_NV 0x86EB +#define GL_SURFACE_REGISTERED_NV 0x86FD +#define GL_SURFACE_MAPPED_NV 0x8700 +#define GL_WRITE_DISCARD_NV 0x88BE +typedef void (APIENTRYP PFNGLVDPAUINITNVPROC) (const void *vdpDevice, const void *getProcAddress); +typedef void (APIENTRYP PFNGLVDPAUFININVPROC) (void); +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLboolean (APIENTRYP PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (APIENTRYP PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (APIENTRYP PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +typedef void (APIENTRYP PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); +typedef void (APIENTRYP PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); +typedef void (APIENTRYP PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVDPAUInitNV (const void *vdpDevice, const void *getProcAddress); +GLAPI void APIENTRY glVDPAUFiniNV (void); +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterOutputSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +GLAPI GLboolean APIENTRY glVDPAUIsSurfaceNV (GLvdpauSurfaceNV surface); +GLAPI void APIENTRY glVDPAUUnregisterSurfaceNV (GLvdpauSurfaceNV surface); +GLAPI void APIENTRY glVDPAUGetSurfaceivNV (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +GLAPI void APIENTRY glVDPAUSurfaceAccessNV (GLvdpauSurfaceNV surface, GLenum access); +GLAPI void APIENTRY glVDPAUMapSurfacesNV (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); +GLAPI void APIENTRY glVDPAUUnmapSurfacesNV (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); +#endif +#endif /* GL_NV_vdpau_interop */ + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); +GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei length, const void *pointer); +#endif +#endif /* GL_NV_vertex_array_range */ + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 +#endif /* GL_NV_vertex_array_range2 */ + +#ifndef GL_NV_vertex_attrib_integer_64bit +#define GL_NV_vertex_attrib_integer_64bit 1 +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribL1i64NV (GLuint index, GLint64EXT x); +GLAPI void APIENTRY glVertexAttribL2i64NV (GLuint index, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glVertexAttribL3i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glVertexAttribL4i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glVertexAttribL1i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL2i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL3i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL4i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL1ui64NV (GLuint index, GLuint64EXT x); +GLAPI void APIENTRY glVertexAttribL2ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glVertexAttribL3ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glVertexAttribL4ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glVertexAttribL1ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL2ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL3ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL4ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glGetVertexAttribLi64vNV (GLuint index, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetVertexAttribLui64vNV (GLuint index, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glVertexAttribLFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); +#endif +#endif /* GL_NV_vertex_attrib_integer_64bit */ + +#ifndef GL_NV_vertex_buffer_unified_memory +#define GL_NV_vertex_buffer_unified_memory 1 +#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E +#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F +#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 +#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 +#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 +#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 +#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 +#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 +#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 +#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 +#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 +#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 +#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A +#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B +#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C +#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D +#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E +#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F +#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 +#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 +#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 +#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 +#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 +#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 +#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 +typedef void (APIENTRYP PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +typedef void (APIENTRYP PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +GLAPI void APIENTRY glVertexFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glNormalFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glColorFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glIndexFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glEdgeFlagFormatNV (GLsizei stride); +GLAPI void APIENTRY glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glFogCoordFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +GLAPI void APIENTRY glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT *result); +#endif +#endif /* GL_NV_vertex_buffer_unified_memory */ + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); +typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); +typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void **pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei n, const GLuint *programs, GLboolean *residences); +GLAPI void APIENTRY glBindProgramNV (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteProgramsNV (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glExecuteProgramNV (GLenum target, GLuint id, const GLfloat *params); +GLAPI void APIENTRY glGenProgramsNV (GLsizei n, GLuint *programs); +GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetProgramivNV (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramStringNV (GLuint id, GLenum pname, GLubyte *program); +GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribivNV (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint index, GLenum pname, void **pointer); +GLAPI GLboolean APIENTRY glIsProgramNV (GLuint id); +GLAPI void APIENTRY glLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +GLAPI void APIENTRY glProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v); +GLAPI void APIENTRY glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v); +GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform); +GLAPI void APIENTRY glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glVertexAttrib1dNV (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1fNV (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1sNV (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2sNV (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs1svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs2svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs3svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs4svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint index, GLsizei count, const GLubyte *v); +#endif +#endif /* GL_NV_vertex_program */ + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 +#endif /* GL_NV_vertex_program1_1 */ + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 +#endif /* GL_NV_vertex_program2 */ + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 +#endif /* GL_NV_vertex_program2_option */ + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 +#endif /* GL_NV_vertex_program3 */ + +#ifndef GL_NV_vertex_program4 +#define GL_NV_vertex_program4 1 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribI1iEXT (GLuint index, GLint x); +GLAPI void APIENTRY glVertexAttribI2iEXT (GLuint index, GLint x, GLint y); +GLAPI void APIENTRY glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexAttribI1uiEXT (GLuint index, GLuint x); +GLAPI void APIENTRY glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y); +GLAPI void APIENTRY glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI void APIENTRY glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glVertexAttribI1ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI2ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI3ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI4ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI1uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI2uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI3uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4bvEXT (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttribI4svEXT (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribI4usvEXT (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params); +#endif +#endif /* GL_NV_vertex_program4 */ + +#ifndef GL_NV_video_capture +#define GL_NV_video_capture 1 +#define GL_VIDEO_BUFFER_NV 0x9020 +#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 +#define GL_FIELD_UPPER_NV 0x9022 +#define GL_FIELD_LOWER_NV 0x9023 +#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 +#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 +#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 +#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 +#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 +#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 +#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A +#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B +#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C +#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D +#define GL_PARTIAL_SUCCESS_NV 0x902E +#define GL_SUCCESS_NV 0x902F +#define GL_FAILURE_NV 0x9030 +#define GL_YCBYCR8_422_NV 0x9031 +#define GL_YCBAYCR8A_4224_NV 0x9032 +#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 +#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 +#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 +#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 +#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 +#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 +#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 +#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A +#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B +#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C +typedef void (APIENTRYP PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); +typedef GLenum (APIENTRYP PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVideoCaptureNV (GLuint video_capture_slot); +GLAPI void APIENTRY glBindVideoCaptureStreamBufferNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +GLAPI void APIENTRY glBindVideoCaptureStreamTextureNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +GLAPI void APIENTRY glEndVideoCaptureNV (GLuint video_capture_slot); +GLAPI void APIENTRY glGetVideoCaptureivNV (GLuint video_capture_slot, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideoCaptureStreamivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideoCaptureStreamfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVideoCaptureStreamdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); +GLAPI GLenum APIENTRY glVideoCaptureNV (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); +GLAPI void APIENTRY glVideoCaptureStreamParameterivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); +GLAPI void APIENTRY glVideoCaptureStreamParameterfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glVideoCaptureStreamParameterdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); +#endif +#endif /* GL_NV_video_capture */ + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 +#endif /* GL_OML_interlace */ + +#ifndef GL_OML_resample +#define GL_OML_resample 1 +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 +#endif /* GL_OML_resample */ + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 +#endif /* GL_OML_subsample */ + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 +#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD +#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 +#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C +#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E +#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F +#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 +#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 +#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 +#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 +#define GL_CLIP_NEAR_HINT_PGI 0x1A220 +#define GL_CLIP_FAR_HINT_PGI 0x1A221 +#define GL_WIDE_LINE_HINT_PGI 0x1A222 +#define GL_BACK_NORMALS_HINT_PGI 0x1A223 +typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glHintPGI (GLenum target, GLint mode); +#endif +#endif /* GL_PGI_misc_hints */ + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 +#define GL_VERTEX_DATA_HINT_PGI 0x1A22A +#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B +#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C +#define GL_MAX_VERTEX_HINT_PGI 0x1A22D +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#endif /* GL_PGI_vertex_hints */ + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 +#endif /* GL_REND_screen_coordinates */ + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#define GL_RGBA_DXT5_S3TC 0x83A4 +#define GL_RGBA4_DXT5_S3TC 0x83A5 +#endif /* GL_S3_s3tc */ + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 +#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 +#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 +#define GL_LINEAR_DETAIL_SGIS 0x8097 +#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 +#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 +#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A +#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B +#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C +typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum target, GLfloat *points); +#endif +#endif /* GL_SGIS_detail_texture */ + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 +#define GL_FOG_FUNC_SGIS 0x812A +#define GL_FOG_FUNC_POINTS_SGIS 0x812B +#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C +typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogFuncSGIS (GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *points); +#endif +#endif /* GL_SGIS_fog_function */ + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 +#endif /* GL_SGIS_generate_mipmap */ + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskSGIS (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glSamplePatternSGIS (GLenum pattern); +#endif +#endif /* GL_SGIS_multisample */ + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 +#define GL_PIXEL_TEXTURE_SGIS 0x8353 +#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 +#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 +#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum pname, GLint param); +GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum pname, const GLint *params); +GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum pname, GLint *params); +GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum pname, GLfloat *params); +#endif +#endif /* GL_SGIS_pixel_texture */ + +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 +#endif /* GL_SGIS_point_line_texgen */ + +#ifndef GL_SGIS_point_parameters +#define GL_SGIS_point_parameters 1 +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfSGIS (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvSGIS (GLenum pname, const GLfloat *params); +#endif +#endif /* GL_SGIS_point_parameters */ + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 +#define GL_LINEAR_SHARPEN_SGIS 0x80AD +#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE +#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF +#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 +typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum target, GLfloat *points); +#endif +#endif /* GL_SGIS_sharpen_texture */ + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 +#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 +#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 +#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 +#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 +#define GL_TEXTURE_4D_SGIS 0x8134 +#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 +#define GL_TEXTURE_4DSIZE_SGIS 0x8136 +#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 +#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 +#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage4DSGIS (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels); +#endif +#endif /* GL_SGIS_texture4D */ + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 +#define GL_CLAMP_TO_BORDER_SGIS 0x812D +#endif /* GL_SGIS_texture_border_clamp */ + +#ifndef GL_SGIS_texture_color_mask +#define GL_SGIS_texture_color_mask 1 +#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +#endif +#endif /* GL_SGIS_texture_color_mask */ + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 +#define GL_CLAMP_TO_EDGE_SGIS 0x812F +#endif /* GL_SGIS_texture_edge_clamp */ + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 +#define GL_FILTER4_SGIS 0x8146 +#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); +typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat *weights); +GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); +#endif +#endif /* GL_SGIS_texture_filter4 */ + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D +#endif /* GL_SGIS_texture_lod */ + +#ifndef GL_SGIS_texture_select +#define GL_SGIS_texture_select 1 +#define GL_DUAL_ALPHA4_SGIS 0x8110 +#define GL_DUAL_ALPHA8_SGIS 0x8111 +#define GL_DUAL_ALPHA12_SGIS 0x8112 +#define GL_DUAL_ALPHA16_SGIS 0x8113 +#define GL_DUAL_LUMINANCE4_SGIS 0x8114 +#define GL_DUAL_LUMINANCE8_SGIS 0x8115 +#define GL_DUAL_LUMINANCE12_SGIS 0x8116 +#define GL_DUAL_LUMINANCE16_SGIS 0x8117 +#define GL_DUAL_INTENSITY4_SGIS 0x8118 +#define GL_DUAL_INTENSITY8_SGIS 0x8119 +#define GL_DUAL_INTENSITY12_SGIS 0x811A +#define GL_DUAL_INTENSITY16_SGIS 0x811B +#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C +#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D +#define GL_QUAD_ALPHA4_SGIS 0x811E +#define GL_QUAD_ALPHA8_SGIS 0x811F +#define GL_QUAD_LUMINANCE4_SGIS 0x8120 +#define GL_QUAD_LUMINANCE8_SGIS 0x8121 +#define GL_QUAD_INTENSITY4_SGIS 0x8122 +#define GL_QUAD_INTENSITY8_SGIS 0x8123 +#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 +#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 +#endif /* GL_SGIS_texture_select */ + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 +#define GL_ASYNC_MARKER_SGIX 0x8329 +typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); +typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); +typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint marker); +GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *markerp); +GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *markerp); +GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei range); +GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range); +GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint marker); +#endif +#endif /* GL_SGIX_async */ + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D +#endif /* GL_SGIX_async_histogram */ + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 +#endif /* GL_SGIX_async_pixel */ + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 +#endif /* GL_SGIX_blend_alpha_minmax */ + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_SGIX_calligraphic_fragment 1 +#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 +#endif /* GL_SGIX_calligraphic_fragment */ + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 +#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 +#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 +#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 +#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 +#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 +#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 +#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 +#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 +#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 +#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D +#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E +#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F +#endif /* GL_SGIX_clipmap */ + +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 +#define GL_CONVOLUTION_HINT_SGIX 0x8316 +#endif /* GL_SGIX_convolution_accuracy */ + +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 +#endif /* GL_SGIX_depth_pass_instrument */ + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 +#endif /* GL_SGIX_depth_texture */ + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 +typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushRasterSGIX (void); +#endif +#endif /* GL_SGIX_flush_raster */ + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 +#endif /* GL_SGIX_fog_offset */ + +#ifndef GL_SGIX_fragment_lighting +#define GL_SGIX_fragment_lighting 1 +#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 +#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 +#define GL_LIGHT_ENV_MODE_SGIX 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B +#define GL_FRAGMENT_LIGHT0_SGIX 0x840C +#define GL_FRAGMENT_LIGHT1_SGIX 0x840D +#define GL_FRAGMENT_LIGHT2_SGIX 0x840E +#define GL_FRAGMENT_LIGHT3_SGIX 0x840F +#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 +#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 +#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 +#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 +typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum face, GLenum mode); +GLAPI void APIENTRY glFragmentLightfSGIX (GLenum light, GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum light, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentLightiSGIX (GLenum light, GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentLightivSGIX (GLenum light, GLenum pname, const GLint *params); +GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum pname, const GLint *params); +GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum face, GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum face, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum face, GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum face, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum light, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum light, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum face, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum face, GLenum pname, GLint *params); +GLAPI void APIENTRY glLightEnviSGIX (GLenum pname, GLint param); +#endif +#endif /* GL_SGIX_fragment_lighting */ + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 +#define GL_FRAMEZOOM_SGIX 0x818B +#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C +#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D +typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFrameZoomSGIX (GLint factor); +#endif +#endif /* GL_SGIX_framezoom */ + +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 +typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const void *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum pname, const void *params); +#endif +#endif /* GL_SGIX_igloo_interface */ + +#ifndef GL_SGIX_instruments +#define GL_SGIX_instruments 1 +#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 +#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 +typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); +typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); +typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); +typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); +GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei size, GLint *buffer); +GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *marker_p); +GLAPI void APIENTRY glReadInstrumentsSGIX (GLint marker); +GLAPI void APIENTRY glStartInstrumentsSGIX (void); +GLAPI void APIENTRY glStopInstrumentsSGIX (GLint marker); +#endif +#endif /* GL_SGIX_instruments */ + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 +#define GL_INTERLACE_SGIX 0x8094 +#endif /* GL_SGIX_interlace */ + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 +#define GL_IR_INSTRUMENT1_SGIX 0x817F +#endif /* GL_SGIX_ir_instrument1 */ + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 +#define GL_LIST_PRIORITY_SGIX 0x8182 +typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint list, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetListParameterivSGIX (GLuint list, GLenum pname, GLint *params); +GLAPI void APIENTRY glListParameterfSGIX (GLuint list, GLenum pname, GLfloat param); +GLAPI void APIENTRY glListParameterfvSGIX (GLuint list, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glListParameteriSGIX (GLuint list, GLenum pname, GLint param); +GLAPI void APIENTRY glListParameterivSGIX (GLuint list, GLenum pname, const GLint *params); +#endif +#endif /* GL_SGIX_list_priority */ + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 +#define GL_PIXEL_TEX_GEN_SGIX 0x8139 +#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenSGIX (GLenum mode); +#endif +#endif /* GL_SGIX_pixel_texture */ + +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 +#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E +#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F +#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 +#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 +#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 +#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 +#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 +#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 +#endif /* GL_SGIX_pixel_tiles */ + +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 +#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 +#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 +#define GL_DEFORMATIONS_MASK_SGIX 0x8196 +#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +GLAPI void APIENTRY glDeformSGIX (GLbitfield mask); +GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield mask); +#endif +#endif /* GL_SGIX_polynomial_ffd */ + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 +#define GL_REFERENCE_PLANE_SGIX 0x817D +#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E +typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *equation); +#endif +#endif /* GL_SGIX_reference_plane */ + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 +#define GL_PACK_RESAMPLE_SGIX 0x842C +#define GL_UNPACK_RESAMPLE_SGIX 0x842D +#define GL_RESAMPLE_REPLICATE_SGIX 0x842E +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#endif /* GL_SGIX_resample */ + +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 +#define GL_SCALEBIAS_HINT_SGIX 0x8322 +#endif /* GL_SGIX_scalebias_hint */ + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D +#endif /* GL_SGIX_shadow */ + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 +#define GL_SHADOW_AMBIENT_SGIX 0x80BF +#endif /* GL_SGIX_shadow_ambient */ + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 +#define GL_SPRITE_SGIX 0x8148 +#define GL_SPRITE_MODE_SGIX 0x8149 +#define GL_SPRITE_AXIS_SGIX 0x814A +#define GL_SPRITE_TRANSLATION_SGIX 0x814B +#define GL_SPRITE_AXIAL_SGIX 0x814C +#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D +#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum pname, GLfloat param); +GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum pname, GLint param); +GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum pname, const GLint *params); +#endif +#endif /* GL_SGIX_sprite */ + +#ifndef GL_SGIX_subsample +#define GL_SGIX_subsample 1 +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 +#endif /* GL_SGIX_subsample */ + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 +typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTagSampleBufferSGIX (void); +#endif +#endif /* GL_SGIX_tag_sample_buffer */ + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 +#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE +#endif /* GL_SGIX_texture_add_env */ + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B +#endif /* GL_SGIX_texture_coordinate_clamp */ + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 +#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E +#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F +#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 +#endif /* GL_SGIX_texture_lod_bias */ + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E +#endif /* GL_SGIX_texture_multi_buffer */ + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C +#endif /* GL_SGIX_texture_scale_bias */ + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF +#endif /* GL_SGIX_vertex_preclip */ + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 +#define GL_YCRCB_422_SGIX 0x81BB +#define GL_YCRCB_444_SGIX 0x81BC +#endif /* GL_SGIX_ycrcb */ + +#ifndef GL_SGIX_ycrcb_subsample +#define GL_SGIX_ycrcb_subsample 1 +#endif /* GL_SGIX_ycrcb_subsample */ + +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 +#endif /* GL_SGIX_ycrcba */ + +#ifndef GL_SGI_color_matrix +#define GL_SGI_color_matrix 1 +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB +#endif /* GL_SGI_color_matrix */ + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glColorTableParameterivSGI (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glGetColorTableSGI (GLenum target, GLenum format, GLenum type, void *table); +GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint *params); +#endif +#endif /* GL_SGI_color_table */ + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#endif /* GL_SGI_texture_color_table */ + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 +typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFinishTextureSUNX (void); +#endif +#endif /* GL_SUNX_constant_data */ + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 +#define GL_WRAP_BORDER_SUN 0x81D4 +#endif /* GL_SUN_convolution_border_modes */ + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte factor); +GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort factor); +GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint factor); +GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat factor); +GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble factor); +GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte factor); +GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort factor); +GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint factor); +#endif +#endif /* GL_SUN_global_alpha */ + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 +typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width); +#endif +#endif /* GL_SUN_mesh_array */ + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 +#define GL_SLICE_ACCUM_SUN 0x85CC +#endif /* GL_SUN_slice_accum */ + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 +#define GL_RESTART_SUN 0x0001 +#define GL_REPLACE_MIDDLE_SUN 0x0002 +#define GL_REPLACE_OLDEST_SUN 0x0003 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void **pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint code); +GLAPI void APIENTRY glReplacementCodeusSUN (GLushort code); +GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte code); +GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *code); +GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *code); +GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *code); +GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum type, GLsizei stride, const void **pointer); +#endif +#endif /* GL_SUN_triangle_list */ + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *rc, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *rc, const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +#endif +#endif /* GL_SUN_vertex */ + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB +#endif /* GL_WIN_phong_shading */ + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC +#endif /* GL_WIN_specular_fog */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/SDL2/include/SDL_opengles.h b/lib/SDL2/include/SDL_opengles.h index d88e1573f9..bcc127779d 100644 --- a/lib/SDL2/include/SDL_opengles.h +++ b/lib/SDL2/include/SDL_opengles.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_opengles2.h b/lib/SDL2/include/SDL_opengles2.h index 2c05479231..edcd1a24ae 100644 --- a/lib/SDL2/include/SDL_opengles2.h +++ b/lib/SDL2/include/SDL_opengles2.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -20,15 +20,17 @@ */ /** - * \file SDL_opengles.h + * \file SDL_opengles2.h * * This is a simple file to encapsulate the OpenGL ES 2.0 API headers. */ #ifndef _MSC_VER + #ifdef __IPHONEOS__ #include #include #else +#include #include #include #endif @@ -36,2752 +38,10 @@ #else /* _MSC_VER */ /* OpenGL ES2 headers for Visual Studio */ - -#ifndef __khrplatform_h_ -#define __khrplatform_h_ - -/* -** Copyright (c) 2008-2009 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -/* Khronos platform-specific types and definitions. -* -* $Revision: 23298 $ on $Date: 2013-09-30 17:07:13 -0700 (Mon, 30 Sep 2013) $ -* -* Adopters may modify this file to suit their platform. Adopters are -* encouraged to submit platform specific modifications to the Khronos -* group so that they can be included in future versions of this file. -* Please submit changes by sending them to the public Khronos Bugzilla -* (http://khronos.org/bugzilla) by filing a bug against product -* "Khronos (general)" component "Registry". -* -* A predefined template which fills in some of the bug fields can be -* reached using http://tinyurl.com/khrplatform-h-bugreport, but you -* must create a Bugzilla login first. -* -* -* See the Implementer's Guidelines for information about where this file -* should be located on your system and for more details of its use: -* http://www.khronos.org/registry/implementers_guide.pdf -* -* This file should be included as -* #include -* by Khronos client API header files that use its types and defines. -* -* The types in khrplatform.h should only be used to define API-specific types. -* -* Types defined in khrplatform.h: -* khronos_int8_t signed 8 bit -* khronos_uint8_t unsigned 8 bit -* khronos_int16_t signed 16 bit -* khronos_uint16_t unsigned 16 bit -* khronos_int32_t signed 32 bit -* khronos_uint32_t unsigned 32 bit -* khronos_int64_t signed 64 bit -* khronos_uint64_t unsigned 64 bit -* khronos_intptr_t signed same number of bits as a pointer -* khronos_uintptr_t unsigned same number of bits as a pointer -* khronos_ssize_t signed size -* khronos_usize_t unsigned size -* khronos_float_t signed 32 bit floating point -* khronos_time_ns_t unsigned 64 bit time in nanoseconds -* khronos_utime_nanoseconds_t unsigned time interval or absolute time in -* nanoseconds -* khronos_stime_nanoseconds_t signed time interval in nanoseconds -* khronos_boolean_enum_t enumerated boolean type. This should -* only be used as a base type when a client API's boolean type is -* an enum. Client APIs which use an integer or other type for -* booleans cannot use this as the base type for their boolean. -* -* Tokens defined in khrplatform.h: -* -* KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. -* -* KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. -* KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. -* -* Calling convention macros defined in this file: -* KHRONOS_APICALL -* KHRONOS_APIENTRY -* KHRONOS_APIATTRIBUTES -* -* These may be used in function prototypes as: -* -* KHRONOS_APICALL void KHRONOS_APIENTRY funcname( -* int arg1, -* int arg2) KHRONOS_APIATTRIBUTES; -*/ - -/*------------------------------------------------------------------------- -* Definition of KHRONOS_APICALL -*------------------------------------------------------------------------- -* This precedes the return type of the function in the function prototype. -*/ -#if defined(_WIN32) && !defined(__SCITECH_SNAP__) -# define KHRONOS_APICALL __declspec(dllimport) -#elif defined (__SYMBIAN32__) -# define KHRONOS_APICALL IMPORT_C -#else -# define KHRONOS_APICALL -#endif - -/*------------------------------------------------------------------------- -* Definition of KHRONOS_APIENTRY -*------------------------------------------------------------------------- -* This follows the return type of the function and precedes the function -* name in the function prototype. -*/ -#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) -/* Win32 but not WinCE */ -# define KHRONOS_APIENTRY __stdcall -#else -# define KHRONOS_APIENTRY -#endif - -/*------------------------------------------------------------------------- -* Definition of KHRONOS_APIATTRIBUTES -*------------------------------------------------------------------------- -* This follows the closing parenthesis of the function prototype arguments. -*/ -#if defined (__ARMCC_2__) -#define KHRONOS_APIATTRIBUTES __softfp -#else -#define KHRONOS_APIATTRIBUTES -#endif - -/*------------------------------------------------------------------------- -* basic type definitions -*-----------------------------------------------------------------------*/ -#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) - - -/* -* Using -*/ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif defined(__VMS ) || defined(__sgi) - -/* -* Using -*/ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif defined(_WIN32) && !defined(__SCITECH_SNAP__) - -/* -* Win32 -*/ -typedef __int32 khronos_int32_t; -typedef unsigned __int32 khronos_uint32_t; -typedef __int64 khronos_int64_t; -typedef unsigned __int64 khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif defined(__sun__) || defined(__digital__) - -/* -* Sun or Digital -*/ -typedef int khronos_int32_t; -typedef unsigned int khronos_uint32_t; -#if defined(__arch64__) || defined(_LP64) -typedef long int khronos_int64_t; -typedef unsigned long int khronos_uint64_t; -#else -typedef long long int khronos_int64_t; -typedef unsigned long long int khronos_uint64_t; -#endif /* __arch64__ */ -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif 0 - -/* -* Hypothetical platform with no float or int64 support -*/ -typedef int khronos_int32_t; -typedef unsigned int khronos_uint32_t; -#define KHRONOS_SUPPORT_INT64 0 -#define KHRONOS_SUPPORT_FLOAT 0 - -#else - -/* -* Generic fallback -*/ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#endif - - -/* -* Types that are (so far) the same on all platforms -*/ -typedef signed char khronos_int8_t; -typedef unsigned char khronos_uint8_t; -typedef signed short int khronos_int16_t; -typedef unsigned short int khronos_uint16_t; - -/* -* Types that differ between LLP64 and LP64 architectures - in LLP64, -* pointers are 64 bits, but 'long' is still 32 bits. Win64 appears -* to be the only LLP64 architecture in current use. -*/ -#ifdef _WIN64 -typedef signed long long int khronos_intptr_t; -typedef unsigned long long int khronos_uintptr_t; -typedef signed long long int khronos_ssize_t; -typedef unsigned long long int khronos_usize_t; -#else -typedef signed long int khronos_intptr_t; -typedef unsigned long int khronos_uintptr_t; -typedef signed long int khronos_ssize_t; -typedef unsigned long int khronos_usize_t; -#endif - -#if KHRONOS_SUPPORT_FLOAT -/* -* Float type -*/ -typedef float khronos_float_t; -#endif - -#if KHRONOS_SUPPORT_INT64 -/* Time types -* -* These types can be used to represent a time interval in nanoseconds or -* an absolute Unadjusted System Time. Unadjusted System Time is the number -* of nanoseconds since some arbitrary system event (e.g. since the last -* time the system booted). The Unadjusted System Time is an unsigned -* 64 bit value that wraps back to 0 every 584 years. Time intervals -* may be either signed or unsigned. -*/ -typedef khronos_uint64_t khronos_utime_nanoseconds_t; -typedef khronos_int64_t khronos_stime_nanoseconds_t; -#endif - -/* -* Dummy value used to pad enum types to 32 bits. -*/ -#ifndef KHRONOS_MAX_ENUM -#define KHRONOS_MAX_ENUM 0x7FFFFFFF -#endif - -/* -* Enumerated boolean type -* -* Values other than zero should be considered to be true. Therefore -* comparisons should not be made against KHRONOS_TRUE. -*/ -typedef enum { - KHRONOS_FALSE = 0, - KHRONOS_TRUE = 1, - KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM -} khronos_boolean_enum_t; - -#endif /* __khrplatform_h_ */ - - -#ifndef __gl2platform_h_ -#define __gl2platform_h_ - -/* $Revision: 10602 $ on $Date:: 2010-03-04 22:35:34 -0800 #$ */ - -/* - * This document is licensed under the SGI Free Software B License Version - * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . - */ - -/* Platform-specific types and definitions for OpenGL ES 2.X gl2.h - * - * Adopters may modify khrplatform.h and this file to suit their platform. - * You are encouraged to submit all modifications to the Khronos group so that - * they can be included in future versions of this file. Please submit changes - * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla) - * by filing a bug against product "OpenGL-ES" component "Registry". - */ - -/*#include */ - -#ifndef GL_APICALL -#define GL_APICALL KHRONOS_APICALL -#endif - -#ifndef GL_APIENTRY -#define GL_APIENTRY KHRONOS_APIENTRY -#endif - -#endif /* __gl2platform_h_ */ - -#ifndef __gl2_h_ -#define __gl2_h_ - -/* $Revision: 16803 $ on $Date:: 2012-02-02 09:49:18 -0800 #$ */ - -/*#include */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * This document is licensed under the SGI Free Software B License Version - * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . - */ - -/*------------------------------------------------------------------------- - * Data type definitions - *-----------------------------------------------------------------------*/ - -typedef void GLvoid; -typedef char GLchar; -typedef unsigned int GLenum; -typedef unsigned char GLboolean; -typedef unsigned int GLbitfield; -typedef khronos_int8_t GLbyte; -typedef short GLshort; -typedef int GLint; -typedef int GLsizei; -typedef khronos_uint8_t GLubyte; -typedef unsigned short GLushort; -typedef unsigned int GLuint; -typedef khronos_float_t GLfloat; -typedef khronos_float_t GLclampf; -typedef khronos_int32_t GLfixed; - -/* GL types for handling large vertex buffer objects */ -typedef khronos_intptr_t GLintptr; -typedef khronos_ssize_t GLsizeiptr; - -/* OpenGL ES core versions */ -#define GL_ES_VERSION_2_0 1 - -/* ClearBufferMask */ -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_COLOR_BUFFER_BIT 0x00004000 - -/* Boolean */ -#define GL_FALSE 0 -#define GL_TRUE 1 - -/* BeginMode */ -#define GL_POINTS 0x0000 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_LINE_STRIP 0x0003 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 - -/* AlphaFunction (not supported in ES20) */ -/* GL_NEVER */ -/* GL_LESS */ -/* GL_EQUAL */ -/* GL_LEQUAL */ -/* GL_GREATER */ -/* GL_NOTEQUAL */ -/* GL_GEQUAL */ -/* GL_ALWAYS */ - -/* BlendingFactorDest */ -#define GL_ZERO 0 -#define GL_ONE 1 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 - -/* BlendingFactorSrc */ -/* GL_ZERO */ -/* GL_ONE */ -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA_SATURATE 0x0308 -/* GL_SRC_ALPHA */ -/* GL_ONE_MINUS_SRC_ALPHA */ -/* GL_DST_ALPHA */ -/* GL_ONE_MINUS_DST_ALPHA */ - -/* BlendEquationSeparate */ -#define GL_FUNC_ADD 0x8006 -#define GL_BLEND_EQUATION 0x8009 -#define GL_BLEND_EQUATION_RGB 0x8009 /* same as BLEND_EQUATION */ -#define GL_BLEND_EQUATION_ALPHA 0x883D - -/* BlendSubtract */ -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B - -/* Separate Blend Functions */ -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 - -/* Buffer Objects */ -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 - -#define GL_STREAM_DRAW 0x88E0 -#define GL_STATIC_DRAW 0x88E4 -#define GL_DYNAMIC_DRAW 0x88E8 - -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 - -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 - -/* CullFaceMode */ -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_FRONT_AND_BACK 0x0408 - -/* DepthFunction */ -/* GL_NEVER */ -/* GL_LESS */ -/* GL_EQUAL */ -/* GL_LEQUAL */ -/* GL_GREATER */ -/* GL_NOTEQUAL */ -/* GL_GEQUAL */ -/* GL_ALWAYS */ - -/* EnableCap */ -#define GL_TEXTURE_2D 0x0DE1 -#define GL_CULL_FACE 0x0B44 -#define GL_BLEND 0x0BE2 -#define GL_DITHER 0x0BD0 -#define GL_STENCIL_TEST 0x0B90 -#define GL_DEPTH_TEST 0x0B71 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_COVERAGE 0x80A0 - -/* ErrorCode */ -#define GL_NO_ERROR 0 -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_OPERATION 0x0502 -#define GL_OUT_OF_MEMORY 0x0505 - -/* FrontFaceDirection */ -#define GL_CW 0x0900 -#define GL_CCW 0x0901 - -/* GetPName */ -#define GL_LINE_WIDTH 0x0B21 -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -#define GL_VIEWPORT 0x0BA2 -#define GL_SCISSOR_BOX 0x0C10 -/* GL_SCISSOR_TEST */ -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_RED_BITS 0x0D52 -#define GL_GREEN_BITS 0x0D53 -#define GL_BLUE_BITS 0x0D54 -#define GL_ALPHA_BITS 0x0D55 -#define GL_DEPTH_BITS 0x0D56 -#define GL_STENCIL_BITS 0x0D57 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -/* GL_POLYGON_OFFSET_FILL */ -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB - -/* GetTextureParameter */ -/* GL_TEXTURE_MAG_FILTER */ -/* GL_TEXTURE_MIN_FILTER */ -/* GL_TEXTURE_WRAP_S */ -/* GL_TEXTURE_WRAP_T */ - -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 - -/* HintMode */ -#define GL_DONT_CARE 0x1100 -#define GL_FASTEST 0x1101 -#define GL_NICEST 0x1102 - -/* HintTarget */ -#define GL_GENERATE_MIPMAP_HINT 0x8192 - -/* DataType */ -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#define GL_FLOAT 0x1406 -#define GL_FIXED 0x140C - -/* PixelFormat */ -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_ALPHA 0x1906 -#define GL_RGB 0x1907 -#define GL_RGBA 0x1908 -#define GL_LUMINANCE 0x1909 -#define GL_LUMINANCE_ALPHA 0x190A - -/* PixelType */ -/* GL_UNSIGNED_BYTE */ -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 - -/* Shaders */ -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB -#define GL_MAX_VARYING_VECTORS 0x8DFC -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD -#define GL_SHADER_TYPE 0x8B4F -#define GL_DELETE_STATUS 0x8B80 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D - -/* StencilFunction */ -#define GL_NEVER 0x0200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 - -/* StencilOp */ -/* GL_ZERO */ -#define GL_KEEP 0x1E00 -#define GL_REPLACE 0x1E01 -#define GL_INCR 0x1E02 -#define GL_DECR 0x1E03 -#define GL_INVERT 0x150A -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 - -/* StringName */ -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 - -/* TextureMagFilter */ -#define GL_NEAREST 0x2600 -#define GL_LINEAR 0x2601 - -/* TextureMinFilter */ -/* GL_NEAREST */ -/* GL_LINEAR */ -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 - -/* TextureParameterName */ -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 - -/* TextureTarget */ -/* GL_TEXTURE_2D */ -#define GL_TEXTURE 0x1702 - -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C - -/* TextureUnit */ -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 - -/* TextureWrapMode */ -#define GL_REPEAT 0x2901 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_MIRRORED_REPEAT 0x8370 - -/* Uniform Types */ -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_CUBE 0x8B60 - -/* Vertex Arrays */ -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F - -/* Read Format */ -#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B - -/* Shader Source */ -#define GL_COMPILE_STATUS 0x8B81 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_SHADER_COMPILER 0x8DFA - -/* Shader Binary */ -#define GL_SHADER_BINARY_FORMATS 0x8DF8 -#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 - -/* Shader Precision-Specified Types */ -#define GL_LOW_FLOAT 0x8DF0 -#define GL_MEDIUM_FLOAT 0x8DF1 -#define GL_HIGH_FLOAT 0x8DF2 -#define GL_LOW_INT 0x8DF3 -#define GL_MEDIUM_INT 0x8DF4 -#define GL_HIGH_INT 0x8DF5 - -/* Framebuffer Object. */ -#define GL_FRAMEBUFFER 0x8D40 -#define GL_RENDERBUFFER 0x8D41 - -#define GL_RGBA4 0x8056 -#define GL_RGB5_A1 0x8057 -#define GL_RGB565 0x8D62 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_STENCIL_INDEX8 0x8D48 - -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 - -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 - -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_STENCIL_ATTACHMENT 0x8D20 - -#define GL_NONE 0 - -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD - -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 - -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 - -/*------------------------------------------------------------------------- - * GL core functions. - *-----------------------------------------------------------------------*/ - -GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture); -GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader); -GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar* name); -GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer); -GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); -GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); -GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture); -GL_APICALL void GL_APIENTRY glBlendColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -GL_APICALL void GL_APIENTRY glBlendEquation ( GLenum mode ); -GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); -GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); -GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage); -GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data); -GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target); -GL_APICALL void GL_APIENTRY glClear (GLbitfield mask); -GL_APICALL void GL_APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -GL_APICALL void GL_APIENTRY glClearDepthf (GLclampf depth); -GL_APICALL void GL_APIENTRY glClearStencil (GLint s); -GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader); -GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data); -GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data); -GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GL_APICALL GLuint GL_APIENTRY glCreateProgram (void); -GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type); -GL_APICALL void GL_APIENTRY glCullFace (GLenum mode); -GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint* buffers); -GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint* framebuffers); -GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program); -GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint* renderbuffers); -GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader); -GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint* textures); -GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func); -GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag); -GL_APICALL void GL_APIENTRY glDepthRangef (GLclampf zNear, GLclampf zFar); -GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader); -GL_APICALL void GL_APIENTRY glDisable (GLenum cap); -GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index); -GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); -GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices); -GL_APICALL void GL_APIENTRY glEnable (GLenum cap); -GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index); -GL_APICALL void GL_APIENTRY glFinish (void); -GL_APICALL void GL_APIENTRY glFlush (void); -GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode); -GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint* buffers); -GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target); -GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint* framebuffers); -GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint* renderbuffers); -GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint* textures); -GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name); -GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name); -GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders); -GL_APICALL int GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar* name); -GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean* params); -GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint* params); -GL_APICALL GLenum GL_APIENTRY glGetError (void); -GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat* params); -GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint* params); -GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint* params); -GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint* params); -GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog); -GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint* params); -GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint* params); -GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog); -GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision); -GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source); -GL_APICALL const GLubyte* GL_APIENTRY glGetString (GLenum name); -GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat* params); -GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint* params); -GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat* params); -GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint* params); -GL_APICALL int GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar* name); -GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat* params); -GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint* params); -GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, GLvoid** pointer); -GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode); -GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer); -GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap); -GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer); -GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program); -GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer); -GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader); -GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture); -GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width); -GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program); -GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param); -GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); -GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels); -GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void); -GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glSampleCoverage (GLclampf value, GLboolean invert); -GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length); -GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length); -GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); -GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); -GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask); -GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); -GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); -GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass); -GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels); -GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); -GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat* params); -GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); -GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint* params); -GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels); -GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat x); -GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat* v); -GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint x); -GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint* v); -GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat x, GLfloat y); -GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat* v); -GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint x, GLint y); -GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint* v); -GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat x, GLfloat y, GLfloat z); -GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat* v); -GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint x, GLint y, GLint z); -GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint* v); -GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat* v); -GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint x, GLint y, GLint z, GLint w); -GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint* v); -GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -GL_APICALL void GL_APIENTRY glUseProgram (GLuint program); -GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program); -GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint indx, GLfloat x); -GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint indx, const GLfloat* values); -GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint indx, GLfloat x, GLfloat y); -GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint indx, const GLfloat* values); -GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint indx, GLfloat x, GLfloat y, GLfloat z); -GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint indx, const GLfloat* values); -GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint indx, const GLfloat* values); -GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr); -GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); - -#ifdef __cplusplus -} -#endif - -#endif /* __gl2_h_ */ - - -#ifndef __gl2ext_h_ -#define __gl2ext_h_ - -/* $Revision: 19436 $ on $Date:: 2012-10-10 10:37:04 -0700 #$ */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * This document is licensed under the SGI Free Software B License Version - * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . - */ - -#ifndef GL_APIENTRYP -# define GL_APIENTRYP GL_APIENTRY* -#endif - -/*------------------------------------------------------------------------* - * OES extension tokens - *------------------------------------------------------------------------*/ - -/* GL_OES_compressed_ETC1_RGB8_texture */ -#ifndef GL_OES_compressed_ETC1_RGB8_texture -#define GL_ETC1_RGB8_OES 0x8D64 -#endif - -/* GL_OES_compressed_paletted_texture */ -#ifndef GL_OES_compressed_paletted_texture -#define GL_PALETTE4_RGB8_OES 0x8B90 -#define GL_PALETTE4_RGBA8_OES 0x8B91 -#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 -#define GL_PALETTE4_RGBA4_OES 0x8B93 -#define GL_PALETTE4_RGB5_A1_OES 0x8B94 -#define GL_PALETTE8_RGB8_OES 0x8B95 -#define GL_PALETTE8_RGBA8_OES 0x8B96 -#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 -#define GL_PALETTE8_RGBA4_OES 0x8B98 -#define GL_PALETTE8_RGB5_A1_OES 0x8B99 -#endif - -/* GL_OES_depth24 */ -#ifndef GL_OES_depth24 -#define GL_DEPTH_COMPONENT24_OES 0x81A6 -#endif - -/* GL_OES_depth32 */ -#ifndef GL_OES_depth32 -#define GL_DEPTH_COMPONENT32_OES 0x81A7 -#endif - -/* GL_OES_depth_texture */ -/* No new tokens introduced by this extension. */ - -/* GL_OES_EGL_image */ -#ifndef GL_OES_EGL_image -typedef void* GLeglImageOES; -#endif - -/* GL_OES_EGL_image_external */ -#ifndef GL_OES_EGL_image_external -/* GLeglImageOES defined in GL_OES_EGL_image already. */ -#define GL_TEXTURE_EXTERNAL_OES 0x8D65 -#define GL_SAMPLER_EXTERNAL_OES 0x8D66 -#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 -#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 -#endif - -/* GL_OES_element_index_uint */ -#ifndef GL_OES_element_index_uint -#define GL_UNSIGNED_INT 0x1405 -#endif - -/* GL_OES_get_program_binary */ -#ifndef GL_OES_get_program_binary -#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741 -#define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE -#define GL_PROGRAM_BINARY_FORMATS_OES 0x87FF -#endif - -/* GL_OES_mapbuffer */ -#ifndef GL_OES_mapbuffer -#define GL_WRITE_ONLY_OES 0x88B9 -#define GL_BUFFER_ACCESS_OES 0x88BB -#define GL_BUFFER_MAPPED_OES 0x88BC -#define GL_BUFFER_MAP_POINTER_OES 0x88BD -#endif - -/* GL_OES_packed_depth_stencil */ -#ifndef GL_OES_packed_depth_stencil -#define GL_DEPTH_STENCIL_OES 0x84F9 -#define GL_UNSIGNED_INT_24_8_OES 0x84FA -#define GL_DEPTH24_STENCIL8_OES 0x88F0 -#endif - -/* GL_OES_required_internalformat */ -#ifndef GL_OES_required_internalformat -#define GL_ALPHA8_OES 0x803C -#define GL_DEPTH_COMPONENT16_OES 0x81A5 -/* reuse GL_DEPTH_COMPONENT24_OES */ -/* reuse GL_DEPTH24_STENCIL8_OES */ -/* reuse GL_DEPTH_COMPONENT32_OES */ -#define GL_LUMINANCE4_ALPHA4_OES 0x8043 -#define GL_LUMINANCE8_ALPHA8_OES 0x8045 -#define GL_LUMINANCE8_OES 0x8040 -#define GL_RGBA4_OES 0x8056 -#define GL_RGB5_A1_OES 0x8057 -#define GL_RGB565_OES 0x8D62 -/* reuse GL_RGB8_OES */ -/* reuse GL_RGBA8_OES */ -/* reuse GL_RGB10_EXT */ -/* reuse GL_RGB10_A2_EXT */ -#endif - -/* GL_OES_rgb8_rgba8 */ -#ifndef GL_OES_rgb8_rgba8 -#define GL_RGB8_OES 0x8051 -#define GL_RGBA8_OES 0x8058 -#endif - -/* GL_OES_standard_derivatives */ -#ifndef GL_OES_standard_derivatives -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B -#endif - -/* GL_OES_stencil1 */ -#ifndef GL_OES_stencil1 -#define GL_STENCIL_INDEX1_OES 0x8D46 -#endif - -/* GL_OES_stencil4 */ -#ifndef GL_OES_stencil4 -#define GL_STENCIL_INDEX4_OES 0x8D47 -#endif - -#ifndef GL_OES_surfaceless_context -#define GL_FRAMEBUFFER_UNDEFINED_OES 0x8219 -#endif - -/* GL_OES_texture_3D */ -#ifndef GL_OES_texture_3D -#define GL_TEXTURE_WRAP_R_OES 0x8072 -#define GL_TEXTURE_3D_OES 0x806F -#define GL_TEXTURE_BINDING_3D_OES 0x806A -#define GL_MAX_3D_TEXTURE_SIZE_OES 0x8073 -#define GL_SAMPLER_3D_OES 0x8B5F -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES 0x8CD4 -#endif - -/* GL_OES_texture_float */ -/* No new tokens introduced by this extension. */ - -/* GL_OES_texture_float_linear */ -/* No new tokens introduced by this extension. */ - -/* GL_OES_texture_half_float */ -#ifndef GL_OES_texture_half_float -#define GL_HALF_FLOAT_OES 0x8D61 -#endif - -/* GL_OES_texture_half_float_linear */ -/* No new tokens introduced by this extension. */ - -/* GL_OES_texture_npot */ -/* No new tokens introduced by this extension. */ - -/* GL_OES_vertex_array_object */ -#ifndef GL_OES_vertex_array_object -#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5 -#endif - -/* GL_OES_vertex_half_float */ -/* GL_HALF_FLOAT_OES defined in GL_OES_texture_half_float already. */ - -/* GL_OES_vertex_type_10_10_10_2 */ -#ifndef GL_OES_vertex_type_10_10_10_2 -#define GL_UNSIGNED_INT_10_10_10_2_OES 0x8DF6 -#define GL_INT_10_10_10_2_OES 0x8DF7 -#endif - -/*------------------------------------------------------------------------* - * KHR extension tokens - *------------------------------------------------------------------------*/ - -#ifndef GL_KHR_debug -typedef void (GL_APIENTRYP GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam); -#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 -#define GL_DEBUG_SOURCE_API 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION 0x824A -#define GL_DEBUG_SOURCE_OTHER 0x824B -#define GL_DEBUG_TYPE_ERROR 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E -#define GL_DEBUG_TYPE_PORTABILITY 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 -#define GL_DEBUG_TYPE_OTHER 0x8251 -#define GL_DEBUG_TYPE_MARKER 0x8268 -#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 -#define GL_DEBUG_TYPE_POP_GROUP 0x826A -#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B -#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C -#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D -#define GL_BUFFER 0x82E0 -#define GL_SHADER 0x82E1 -#define GL_PROGRAM 0x82E2 -#define GL_QUERY 0x82E3 -/* PROGRAM_PIPELINE only in GL */ -#define GL_SAMPLER 0x82E6 -/* DISPLAY_LIST only in GL */ -#define GL_MAX_LABEL_LENGTH 0x82E8 -#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES 0x9145 -#define GL_DEBUG_SEVERITY_HIGH 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 -#define GL_DEBUG_SEVERITY_LOW 0x9148 -#define GL_DEBUG_OUTPUT 0x92E0 -#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 -#define GL_STACK_OVERFLOW 0x0503 -#define GL_STACK_UNDERFLOW 0x0504 -#endif - -#ifndef GL_KHR_texture_compression_astc_ldr -#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD -#endif - -/*------------------------------------------------------------------------* - * AMD extension tokens - *------------------------------------------------------------------------*/ - -/* GL_AMD_compressed_3DC_texture */ -#ifndef GL_AMD_compressed_3DC_texture -#define GL_3DC_X_AMD 0x87F9 -#define GL_3DC_XY_AMD 0x87FA -#endif - -/* GL_AMD_compressed_ATC_texture */ -#ifndef GL_AMD_compressed_ATC_texture -#define GL_ATC_RGB_AMD 0x8C92 -#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 -#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE -#endif - -/* GL_AMD_performance_monitor */ -#ifndef GL_AMD_performance_monitor -#define GL_COUNTER_TYPE_AMD 0x8BC0 -#define GL_COUNTER_RANGE_AMD 0x8BC1 -#define GL_UNSIGNED_INT64_AMD 0x8BC2 -#define GL_PERCENTAGE_AMD 0x8BC3 -#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 -#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 -#define GL_PERFMON_RESULT_AMD 0x8BC6 -#endif - -/* GL_AMD_program_binary_Z400 */ -#ifndef GL_AMD_program_binary_Z400 -#define GL_Z400_BINARY_AMD 0x8740 -#endif - -/*------------------------------------------------------------------------* - * ANGLE extension tokens - *------------------------------------------------------------------------*/ - -/* GL_ANGLE_framebuffer_blit */ -#ifndef GL_ANGLE_framebuffer_blit -#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 -#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA -#endif - -/* GL_ANGLE_framebuffer_multisample */ -#ifndef GL_ANGLE_framebuffer_multisample -#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 -#define GL_MAX_SAMPLES_ANGLE 0x8D57 -#endif - -/* GL_ANGLE_instanced_arrays */ -#ifndef GL_ANGLE_instanced_arrays -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE -#endif - -/* GL_ANGLE_pack_reverse_row_order */ -#ifndef GL_ANGLE_pack_reverse_row_order -#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 -#endif - -/* GL_ANGLE_texture_compression_dxt3 */ -#ifndef GL_ANGLE_texture_compression_dxt3 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 -#endif - -/* GL_ANGLE_texture_compression_dxt5 */ -#ifndef GL_ANGLE_texture_compression_dxt5 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 -#endif - -/* GL_ANGLE_texture_usage */ -#ifndef GL_ANGLE_texture_usage -#define GL_TEXTURE_USAGE_ANGLE 0x93A2 -#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 -#endif - -/* GL_ANGLE_translated_shader_source */ -#ifndef GL_ANGLE_translated_shader_source -#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 -#endif - -/*------------------------------------------------------------------------* - * APPLE extension tokens - *------------------------------------------------------------------------*/ - -/* GL_APPLE_copy_texture_levels */ -/* No new tokens introduced by this extension. */ - -/* GL_APPLE_framebuffer_multisample */ -#ifndef GL_APPLE_framebuffer_multisample -#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 -#define GL_MAX_SAMPLES_APPLE 0x8D57 -#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 -#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA -#endif - -/* GL_APPLE_rgb_422 */ -#ifndef GL_APPLE_rgb_422 -#define GL_RGB_422_APPLE 0x8A1F -#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB -#endif - -/* GL_APPLE_sync */ -#ifndef GL_APPLE_sync - -#ifndef __gl3_h_ -/* These types are defined with reference to - * in the Apple extension spec, but here we use the Khronos - * portable types in khrplatform.h, and assume those types - * are always defined. - * If any other extensions using these types are defined, - * the typedefs must move out of this block and be shared. - */ -typedef khronos_int64_t GLint64; -typedef khronos_uint64_t GLuint64; -typedef struct __GLsync *GLsync; -#endif - -#define GL_SYNC_OBJECT_APPLE 0x8A53 -#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE 0x9111 -#define GL_OBJECT_TYPE_APPLE 0x9112 -#define GL_SYNC_CONDITION_APPLE 0x9113 -#define GL_SYNC_STATUS_APPLE 0x9114 -#define GL_SYNC_FLAGS_APPLE 0x9115 -#define GL_SYNC_FENCE_APPLE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117 -#define GL_UNSIGNALED_APPLE 0x9118 -#define GL_SIGNALED_APPLE 0x9119 -#define GL_ALREADY_SIGNALED_APPLE 0x911A -#define GL_TIMEOUT_EXPIRED_APPLE 0x911B -#define GL_CONDITION_SATISFIED_APPLE 0x911C -#define GL_WAIT_FAILED_APPLE 0x911D -#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001 -#define GL_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFFull -#endif - -/* GL_APPLE_texture_format_BGRA8888 */ -#ifndef GL_APPLE_texture_format_BGRA8888 -#define GL_BGRA_EXT 0x80E1 -#endif - -/* GL_APPLE_texture_max_level */ -#ifndef GL_APPLE_texture_max_level -#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D -#endif - -/*------------------------------------------------------------------------* - * ARM extension tokens - *------------------------------------------------------------------------*/ - -/* GL_ARM_mali_program_binary */ -#ifndef GL_ARM_mali_program_binary -#define GL_MALI_PROGRAM_BINARY_ARM 0x8F61 -#endif - -/* GL_ARM_mali_shader_binary */ -#ifndef GL_ARM_mali_shader_binary -#define GL_MALI_SHADER_BINARY_ARM 0x8F60 -#endif - -/* GL_ARM_rgba8 */ -/* No new tokens introduced by this extension. */ - -/*------------------------------------------------------------------------* - * EXT extension tokens - *------------------------------------------------------------------------*/ - -/* GL_EXT_blend_minmax */ -#ifndef GL_EXT_blend_minmax -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#endif - -/* GL_EXT_color_buffer_half_float */ -#ifndef GL_EXT_color_buffer_half_float -#define GL_RGBA16F_EXT 0x881A -#define GL_RGB16F_EXT 0x881B -#define GL_RG16F_EXT 0x822F -#define GL_R16F_EXT 0x822D -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 -#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 -#endif - -/* GL_EXT_debug_label */ -#ifndef GL_EXT_debug_label -#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F -#define GL_PROGRAM_OBJECT_EXT 0x8B40 -#define GL_SHADER_OBJECT_EXT 0x8B48 -#define GL_BUFFER_OBJECT_EXT 0x9151 -#define GL_QUERY_OBJECT_EXT 0x9153 -#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 -#endif - -/* GL_EXT_debug_marker */ -/* No new tokens introduced by this extension. */ - -/* GL_EXT_discard_framebuffer */ -#ifndef GL_EXT_discard_framebuffer -#define GL_COLOR_EXT 0x1800 -#define GL_DEPTH_EXT 0x1801 -#define GL_STENCIL_EXT 0x1802 -#endif - -/* GL_EXT_map_buffer_range */ -#ifndef GL_EXT_map_buffer_range -#define GL_MAP_READ_BIT_EXT 0x0001 -#define GL_MAP_WRITE_BIT_EXT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 -#endif - -/* GL_EXT_multisampled_render_to_texture */ -#ifndef GL_EXT_multisampled_render_to_texture -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C -/* reuse values from GL_EXT_framebuffer_multisample (desktop extension) */ -#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 -#define GL_MAX_SAMPLES_EXT 0x8D57 -#endif - -/* GL_EXT_multiview_draw_buffers */ -#ifndef GL_EXT_multiview_draw_buffers -#define GL_COLOR_ATTACHMENT_EXT 0x90F0 -#define GL_MULTIVIEW_EXT 0x90F1 -#define GL_DRAW_BUFFER_EXT 0x0C01 -#define GL_READ_BUFFER_EXT 0x0C02 -#define GL_MAX_MULTIVIEW_BUFFERS_EXT 0x90F2 -#endif - -/* GL_EXT_multi_draw_arrays */ -/* No new tokens introduced by this extension. */ - -/* GL_EXT_occlusion_query_boolean */ -#ifndef GL_EXT_occlusion_query_boolean -#define GL_ANY_SAMPLES_PASSED_EXT 0x8C2F -#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 0x8D6A -#define GL_CURRENT_QUERY_EXT 0x8865 -#define GL_QUERY_RESULT_EXT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867 -#endif - -/* GL_EXT_read_format_bgra */ -#ifndef GL_EXT_read_format_bgra -#define GL_BGRA_EXT 0x80E1 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 -#endif - -/* GL_EXT_robustness */ -#ifndef GL_EXT_robustness -/* reuse GL_NO_ERROR */ -#define GL_GUILTY_CONTEXT_RESET_EXT 0x8253 -#define GL_INNOCENT_CONTEXT_RESET_EXT 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET_EXT 0x8255 -#define GL_CONTEXT_ROBUST_ACCESS_EXT 0x90F3 -#define GL_RESET_NOTIFICATION_STRATEGY_EXT 0x8256 -#define GL_LOSE_CONTEXT_ON_RESET_EXT 0x8252 -#define GL_NO_RESET_NOTIFICATION_EXT 0x8261 -#endif - -/* GL_EXT_separate_shader_objects */ -#ifndef GL_EXT_separate_shader_objects -#define GL_VERTEX_SHADER_BIT_EXT 0x00000001 -#define GL_FRAGMENT_SHADER_BIT_EXT 0x00000002 -#define GL_ALL_SHADER_BITS_EXT 0xFFFFFFFF -#define GL_PROGRAM_SEPARABLE_EXT 0x8258 -#define GL_ACTIVE_PROGRAM_EXT 0x8259 -#define GL_PROGRAM_PIPELINE_BINDING_EXT 0x825A -#endif - -/* GL_EXT_shader_framebuffer_fetch */ -#ifndef GL_EXT_shader_framebuffer_fetch -#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 -#endif - -/* GL_EXT_shader_texture_lod */ -/* No new tokens introduced by this extension. */ - -/* GL_EXT_shadow_samplers */ -#ifndef GL_EXT_shadow_samplers -#define GL_TEXTURE_COMPARE_MODE_EXT 0x884C -#define GL_TEXTURE_COMPARE_FUNC_EXT 0x884D -#define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E -#define GL_SAMPLER_2D_SHADOW_EXT 0x8B62 -#endif - -/* GL_EXT_sRGB */ -#ifndef GL_EXT_sRGB -#define GL_SRGB_EXT 0x8C40 -#define GL_SRGB_ALPHA_EXT 0x8C42 -#define GL_SRGB8_ALPHA8_EXT 0x8C43 -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 -#endif - -/* GL_EXT_texture_compression_dxt1 */ -#ifndef GL_EXT_texture_compression_dxt1 -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#endif - -/* GL_EXT_texture_filter_anisotropic */ -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#endif - -/* GL_EXT_texture_format_BGRA8888 */ -#ifndef GL_EXT_texture_format_BGRA8888 -#define GL_BGRA_EXT 0x80E1 -#endif - -/* GL_EXT_texture_rg */ -#ifndef GL_EXT_texture_rg -#define GL_RED_EXT 0x1903 -#define GL_RG_EXT 0x8227 -#define GL_R8_EXT 0x8229 -#define GL_RG8_EXT 0x822B -#endif - -/* GL_EXT_texture_storage */ -#ifndef GL_EXT_texture_storage -#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F -#define GL_ALPHA8_EXT 0x803C -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_RGBA32F_EXT 0x8814 -#define GL_RGB32F_EXT 0x8815 -#define GL_ALPHA32F_EXT 0x8816 -#define GL_LUMINANCE32F_EXT 0x8818 -#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 -/* reuse GL_RGBA16F_EXT */ -/* reuse GL_RGB16F_EXT */ -#define GL_ALPHA16F_EXT 0x881C -#define GL_LUMINANCE16F_EXT 0x881E -#define GL_LUMINANCE_ALPHA16F_EXT 0x881F -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGB10_EXT 0x8052 -#define GL_BGRA8_EXT 0x93A1 -#define GL_R8_EXT 0x8229 -#define GL_RG8_EXT 0x822B -#define GL_R32F_EXT 0x822E -#define GL_RG32F_EXT 0x8230 -#define GL_R16F_EXT 0x822D -#define GL_RG16F_EXT 0x822F -#endif - -/* GL_EXT_texture_type_2_10_10_10_REV */ -#ifndef GL_EXT_texture_type_2_10_10_10_REV -#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 -#endif - -/* GL_EXT_unpack_subimage */ -#ifndef GL_EXT_unpack_subimage -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#define GL_UNPACK_SKIP_ROWS 0x0CF3 -#define GL_UNPACK_SKIP_PIXELS 0x0CF4 -#endif - -/*------------------------------------------------------------------------* - * DMP extension tokens - *------------------------------------------------------------------------*/ - -/* GL_DMP_shader_binary */ -#ifndef GL_DMP_shader_binary -#define GL_SHADER_BINARY_DMP 0x9250 -#endif - -/*------------------------------------------------------------------------* - * FJ extension tokens - *------------------------------------------------------------------------*/ - -/* GL_FJ_shader_binary_GCCSO */ -#ifndef GL_FJ_shader_binary_GCCSO -#define GCCSO_SHADER_BINARY_FJ 0x9260 -#endif - -/*------------------------------------------------------------------------* - * IMG extension tokens - *------------------------------------------------------------------------*/ - -/* GL_IMG_program_binary */ -#ifndef GL_IMG_program_binary -#define GL_SGX_PROGRAM_BINARY_IMG 0x9130 -#endif - -/* GL_IMG_read_format */ -#ifndef GL_IMG_read_format -#define GL_BGRA_IMG 0x80E1 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG 0x8365 -#endif - -/* GL_IMG_shader_binary */ -#ifndef GL_IMG_shader_binary -#define GL_SGX_BINARY_IMG 0x8C0A -#endif - -/* GL_IMG_texture_compression_pvrtc */ -#ifndef GL_IMG_texture_compression_pvrtc -#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 -#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 -#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 -#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 -#endif - -/* GL_IMG_multisampled_render_to_texture */ -#ifndef GL_IMG_multisampled_render_to_texture -#define GL_RENDERBUFFER_SAMPLES_IMG 0x9133 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134 -#define GL_MAX_SAMPLES_IMG 0x9135 -#define GL_TEXTURE_SAMPLES_IMG 0x9136 -#endif - -/*------------------------------------------------------------------------* - * NV extension tokens - *------------------------------------------------------------------------*/ - -/* GL_NV_coverage_sample */ -#ifndef GL_NV_coverage_sample -#define GL_COVERAGE_COMPONENT_NV 0x8ED0 -#define GL_COVERAGE_COMPONENT4_NV 0x8ED1 -#define GL_COVERAGE_ATTACHMENT_NV 0x8ED2 -#define GL_COVERAGE_BUFFERS_NV 0x8ED3 -#define GL_COVERAGE_SAMPLES_NV 0x8ED4 -#define GL_COVERAGE_ALL_FRAGMENTS_NV 0x8ED5 -#define GL_COVERAGE_EDGE_FRAGMENTS_NV 0x8ED6 -#define GL_COVERAGE_AUTOMATIC_NV 0x8ED7 -#define GL_COVERAGE_BUFFER_BIT_NV 0x8000 -#endif - -/* GL_NV_depth_nonlinear */ -#ifndef GL_NV_depth_nonlinear -#define GL_DEPTH_COMPONENT16_NONLINEAR_NV 0x8E2C -#endif - -/* GL_NV_draw_buffers */ -#ifndef GL_NV_draw_buffers -#define GL_MAX_DRAW_BUFFERS_NV 0x8824 -#define GL_DRAW_BUFFER0_NV 0x8825 -#define GL_DRAW_BUFFER1_NV 0x8826 -#define GL_DRAW_BUFFER2_NV 0x8827 -#define GL_DRAW_BUFFER3_NV 0x8828 -#define GL_DRAW_BUFFER4_NV 0x8829 -#define GL_DRAW_BUFFER5_NV 0x882A -#define GL_DRAW_BUFFER6_NV 0x882B -#define GL_DRAW_BUFFER7_NV 0x882C -#define GL_DRAW_BUFFER8_NV 0x882D -#define GL_DRAW_BUFFER9_NV 0x882E -#define GL_DRAW_BUFFER10_NV 0x882F -#define GL_DRAW_BUFFER11_NV 0x8830 -#define GL_DRAW_BUFFER12_NV 0x8831 -#define GL_DRAW_BUFFER13_NV 0x8832 -#define GL_DRAW_BUFFER14_NV 0x8833 -#define GL_DRAW_BUFFER15_NV 0x8834 -#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 -#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 -#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 -#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 -#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 -#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 -#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 -#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 -#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 -#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 -#define GL_COLOR_ATTACHMENT10_NV 0x8CEA -#define GL_COLOR_ATTACHMENT11_NV 0x8CEB -#define GL_COLOR_ATTACHMENT12_NV 0x8CEC -#define GL_COLOR_ATTACHMENT13_NV 0x8CED -#define GL_COLOR_ATTACHMENT14_NV 0x8CEE -#define GL_COLOR_ATTACHMENT15_NV 0x8CEF -#endif - -/* GL_NV_fbo_color_attachments */ -#ifndef GL_NV_fbo_color_attachments -#define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF -/* GL_COLOR_ATTACHMENT{0-15}_NV defined in GL_NV_draw_buffers already. */ -#endif - -/* GL_NV_fence */ -#ifndef GL_NV_fence -#define GL_ALL_COMPLETED_NV 0x84F2 -#define GL_FENCE_STATUS_NV 0x84F3 -#define GL_FENCE_CONDITION_NV 0x84F4 -#endif - -/* GL_NV_read_buffer */ -#ifndef GL_NV_read_buffer -#define GL_READ_BUFFER_NV 0x0C02 -#endif - -/* GL_NV_read_buffer_front */ -/* No new tokens introduced by this extension. */ - -/* GL_NV_read_depth */ -/* No new tokens introduced by this extension. */ - -/* GL_NV_read_depth_stencil */ -/* No new tokens introduced by this extension. */ - -/* GL_NV_read_stencil */ -/* No new tokens introduced by this extension. */ - -/* GL_NV_texture_compression_s3tc_update */ -/* No new tokens introduced by this extension. */ - -/* GL_NV_texture_npot_2D_mipmap */ -/* No new tokens introduced by this extension. */ - -/*------------------------------------------------------------------------* - * QCOM extension tokens - *------------------------------------------------------------------------*/ - -/* GL_QCOM_alpha_test */ -#ifndef GL_QCOM_alpha_test -#define GL_ALPHA_TEST_QCOM 0x0BC0 -#define GL_ALPHA_TEST_FUNC_QCOM 0x0BC1 -#define GL_ALPHA_TEST_REF_QCOM 0x0BC2 -#endif - -/* GL_QCOM_binning_control */ -#ifndef GL_QCOM_binning_control -#define GL_BINNING_CONTROL_HINT_QCOM 0x8FB0 -#define GL_CPU_OPTIMIZED_QCOM 0x8FB1 -#define GL_GPU_OPTIMIZED_QCOM 0x8FB2 -#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM 0x8FB3 -#endif - -/* GL_QCOM_driver_control */ -/* No new tokens introduced by this extension. */ - -/* GL_QCOM_extended_get */ -#ifndef GL_QCOM_extended_get -#define GL_TEXTURE_WIDTH_QCOM 0x8BD2 -#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3 -#define GL_TEXTURE_DEPTH_QCOM 0x8BD4 -#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5 -#define GL_TEXTURE_FORMAT_QCOM 0x8BD6 -#define GL_TEXTURE_TYPE_QCOM 0x8BD7 -#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8 -#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9 -#define GL_TEXTURE_TARGET_QCOM 0x8BDA -#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB -#define GL_STATE_RESTORE 0x8BDC -#endif - -/* GL_QCOM_extended_get2 */ -/* No new tokens introduced by this extension. */ - -/* GL_QCOM_perfmon_global_mode */ -#ifndef GL_QCOM_perfmon_global_mode -#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 -#endif - -/* GL_QCOM_writeonly_rendering */ -#ifndef GL_QCOM_writeonly_rendering -#define GL_WRITEONLY_RENDERING_QCOM 0x8823 -#endif - -/* GL_QCOM_tiled_rendering */ -#ifndef GL_QCOM_tiled_rendering -#define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 -#define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002 -#define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004 -#define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008 -#define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010 -#define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020 -#define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040 -#define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080 -#define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100 -#define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200 -#define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400 -#define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800 -#define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000 -#define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000 -#define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000 -#define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000 -#define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000 -#define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000 -#define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000 -#define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000 -#define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000 -#define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000 -#define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000 -#define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000 -#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000 -#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000 -#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000 -#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000 -#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000 -#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000 -#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000 -#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000 -#endif - -/*------------------------------------------------------------------------* - * VIV extension tokens - *------------------------------------------------------------------------*/ - -/* GL_VIV_shader_binary */ -#ifndef GL_VIV_shader_binary -#define GL_SHADER_BINARY_VIV 0x8FC4 -#endif - -/*------------------------------------------------------------------------* - * End of extension tokens, start of corresponding extension functions - *------------------------------------------------------------------------*/ - -/*------------------------------------------------------------------------* - * OES extension functions - *------------------------------------------------------------------------*/ - -/* GL_OES_compressed_ETC1_RGB8_texture */ -#ifndef GL_OES_compressed_ETC1_RGB8_texture -#define GL_OES_compressed_ETC1_RGB8_texture 1 -#endif - -/* GL_OES_compressed_paletted_texture */ -#ifndef GL_OES_compressed_paletted_texture -#define GL_OES_compressed_paletted_texture 1 -#endif - -/* GL_OES_depth24 */ -#ifndef GL_OES_depth24 -#define GL_OES_depth24 1 -#endif - -/* GL_OES_depth32 */ -#ifndef GL_OES_depth32 -#define GL_OES_depth32 1 -#endif - -/* GL_OES_depth_texture */ -#ifndef GL_OES_depth_texture -#define GL_OES_depth_texture 1 -#endif - -/* GL_OES_EGL_image */ -#ifndef GL_OES_EGL_image -#define GL_OES_EGL_image 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image); -GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image); -#endif -typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image); -typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image); -#endif - -/* GL_OES_EGL_image_external */ -#ifndef GL_OES_EGL_image_external -#define GL_OES_EGL_image_external 1 -/* glEGLImageTargetTexture2DOES defined in GL_OES_EGL_image already. */ -#endif - -/* GL_OES_element_index_uint */ -#ifndef GL_OES_element_index_uint -#define GL_OES_element_index_uint 1 -#endif - -/* GL_OES_fbo_render_mipmap */ -#ifndef GL_OES_fbo_render_mipmap -#define GL_OES_fbo_render_mipmap 1 -#endif - -/* GL_OES_fragment_precision_high */ -#ifndef GL_OES_fragment_precision_high -#define GL_OES_fragment_precision_high 1 -#endif - -/* GL_OES_get_program_binary */ -#ifndef GL_OES_get_program_binary -#define GL_OES_get_program_binary 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glGetProgramBinaryOES (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); -GL_APICALL void GL_APIENTRY glProgramBinaryOES (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLint length); -#endif -typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); -typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLint length); -#endif - -/* GL_OES_mapbuffer */ -#ifndef GL_OES_mapbuffer -#define GL_OES_mapbuffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void* GL_APIENTRY glMapBufferOES (GLenum target, GLenum access); -GL_APICALL GLboolean GL_APIENTRY glUnmapBufferOES (GLenum target); -GL_APICALL void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, GLvoid** params); -#endif -typedef void* (GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access); -typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target); -typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, GLvoid** params); -#endif - -/* GL_OES_packed_depth_stencil */ -#ifndef GL_OES_packed_depth_stencil -#define GL_OES_packed_depth_stencil 1 -#endif - -/* GL_OES_required_internalformat */ -#ifndef GL_OES_required_internalformat -#define GL_OES_required_internalformat 1 -#endif - -/* GL_OES_rgb8_rgba8 */ -#ifndef GL_OES_rgb8_rgba8 -#define GL_OES_rgb8_rgba8 1 -#endif - -/* GL_OES_standard_derivatives */ -#ifndef GL_OES_standard_derivatives -#define GL_OES_standard_derivatives 1 -#endif - -/* GL_OES_stencil1 */ -#ifndef GL_OES_stencil1 -#define GL_OES_stencil1 1 -#endif - -/* GL_OES_stencil4 */ -#ifndef GL_OES_stencil4 -#define GL_OES_stencil4 1 -#endif - -#ifndef GL_OES_surfaceless_context -#define GL_OES_surfaceless_context 1 -#endif - -/* GL_OES_texture_3D */ -#ifndef GL_OES_texture_3D -#define GL_OES_texture_3D 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels); -GL_APICALL void GL_APIENTRY glTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels); -GL_APICALL void GL_APIENTRY glCopyTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glCompressedTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data); -GL_APICALL void GL_APIENTRY glCompressedTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data); -GL_APICALL void GL_APIENTRY glFramebufferTexture3DOES (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -#endif -typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels); -typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels); -typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data); -typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data); -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOES) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -#endif - -/* GL_OES_texture_float */ -#ifndef GL_OES_texture_float -#define GL_OES_texture_float 1 -#endif - -/* GL_OES_texture_float_linear */ -#ifndef GL_OES_texture_float_linear -#define GL_OES_texture_float_linear 1 -#endif - -/* GL_OES_texture_half_float */ -#ifndef GL_OES_texture_half_float -#define GL_OES_texture_half_float 1 -#endif - -/* GL_OES_texture_half_float_linear */ -#ifndef GL_OES_texture_half_float_linear -#define GL_OES_texture_half_float_linear 1 -#endif - -/* GL_OES_texture_npot */ -#ifndef GL_OES_texture_npot -#define GL_OES_texture_npot 1 -#endif - -/* GL_OES_vertex_array_object */ -#ifndef GL_OES_vertex_array_object -#define GL_OES_vertex_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glBindVertexArrayOES (GLuint array); -GL_APICALL void GL_APIENTRY glDeleteVertexArraysOES (GLsizei n, const GLuint *arrays); -GL_APICALL void GL_APIENTRY glGenVertexArraysOES (GLsizei n, GLuint *arrays); -GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOES (GLuint array); -#endif -typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESPROC) (GLuint array); -typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays); -typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays); -typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESPROC) (GLuint array); -#endif - -/* GL_OES_vertex_half_float */ -#ifndef GL_OES_vertex_half_float -#define GL_OES_vertex_half_float 1 -#endif - -/* GL_OES_vertex_type_10_10_10_2 */ -#ifndef GL_OES_vertex_type_10_10_10_2 -#define GL_OES_vertex_type_10_10_10_2 1 -#endif - -/*------------------------------------------------------------------------* - * KHR extension functions - *------------------------------------------------------------------------*/ - -#ifndef GL_KHR_debug -#define GL_KHR_debug 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GL_APICALL void GL_APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -GL_APICALL void GL_APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam); -GL_APICALL GLuint GL_APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -GL_APICALL void GL_APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message); -GL_APICALL void GL_APIENTRY glPopDebugGroup (void); -GL_APICALL void GL_APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -GL_APICALL void GL_APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -GL_APICALL void GL_APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label); -GL_APICALL void GL_APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -GL_APICALL void GL_APIENTRY glGetPointerv (GLenum pname, void **params); -#endif -typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); -typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); -typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void); -typedef void (GL_APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); -typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -typedef void (GL_APIENTRYP PFNGLGETPOINTERVPROC) (GLenum pname, void **params); -#endif - -#ifndef GL_KHR_texture_compression_astc_ldr -#define GL_KHR_texture_compression_astc_ldr 1 -#endif - - -/*------------------------------------------------------------------------* - * AMD extension functions - *------------------------------------------------------------------------*/ - -/* GL_AMD_compressed_3DC_texture */ -#ifndef GL_AMD_compressed_3DC_texture -#define GL_AMD_compressed_3DC_texture 1 -#endif - -/* GL_AMD_compressed_ATC_texture */ -#ifndef GL_AMD_compressed_ATC_texture -#define GL_AMD_compressed_ATC_texture 1 -#endif - -/* AMD_performance_monitor */ -#ifndef GL_AMD_performance_monitor -#define GL_AMD_performance_monitor 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); -GL_APICALL void GL_APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); -GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); -GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); -GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, GLvoid *data); -GL_APICALL void GL_APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); -GL_APICALL void GL_APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); -GL_APICALL void GL_APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList); -GL_APICALL void GL_APIENTRY glBeginPerfMonitorAMD (GLuint monitor); -GL_APICALL void GL_APIENTRY glEndPerfMonitorAMD (GLuint monitor); -GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#endif -typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); -typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); -typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); -typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); -typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, GLvoid *data); -typedef void (GL_APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); -typedef void (GL_APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); -typedef void (GL_APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList); -typedef void (GL_APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); -typedef void (GL_APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); -typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#endif - -/* GL_AMD_program_binary_Z400 */ -#ifndef GL_AMD_program_binary_Z400 -#define GL_AMD_program_binary_Z400 1 -#endif - -/*------------------------------------------------------------------------* - * ANGLE extension functions - *------------------------------------------------------------------------*/ - -/* GL_ANGLE_framebuffer_blit */ -#ifndef GL_ANGLE_framebuffer_blit -#define GL_ANGLE_framebuffer_blit 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glBlitFramebufferANGLE (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif -typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif - -/* GL_ANGLE_framebuffer_multisample */ -#ifndef GL_ANGLE_framebuffer_multisample -#define GL_ANGLE_framebuffer_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleANGLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#endif -typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#endif - -#ifndef GL_ANGLE_instanced_arrays -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLE (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLE (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLE (GLuint index, GLuint divisor); -#endif -typedef void (GL_APIENTRYP PFLGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (GL_APIENTRYP PFLGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -typedef void (GL_APIENTRYP PFLGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); -#endif - -/* GL_ANGLE_pack_reverse_row_order */ -#ifndef GL_ANGLE_pack_reverse_row_order -#define GL_ANGLE_pack_reverse_row_order 1 -#endif - -/* GL_ANGLE_texture_compression_dxt3 */ -#ifndef GL_ANGLE_texture_compression_dxt3 -#define GL_ANGLE_texture_compression_dxt3 1 -#endif - -/* GL_ANGLE_texture_compression_dxt5 */ -#ifndef GL_ANGLE_texture_compression_dxt5 -#define GL_ANGLE_texture_compression_dxt5 1 -#endif - -/* GL_ANGLE_texture_usage */ -#ifndef GL_ANGLE_texture_usage -#define GL_ANGLE_texture_usage 1 -#endif - -#ifndef GL_ANGLE_translated_shader_source -#define GL_ANGLE_translated_shader_source 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLE (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source); -#endif -typedef void (GL_APIENTRYP PFLGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source); -#endif - -/*------------------------------------------------------------------------* - * APPLE extension functions - *------------------------------------------------------------------------*/ - -/* GL_APPLE_copy_texture_levels */ -#ifndef GL_APPLE_copy_texture_levels -#define GL_APPLE_copy_texture_levels 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glCopyTextureLevelsAPPLE (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); -#endif -typedef void (GL_APIENTRYP PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); -#endif - -/* GL_APPLE_framebuffer_multisample */ -#ifndef GL_APPLE_framebuffer_multisample -#define GL_APPLE_framebuffer_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleAPPLE (GLenum, GLsizei, GLenum, GLsizei, GLsizei); -GL_APICALL void GL_APIENTRY glResolveMultisampleFramebufferAPPLE (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void); -#endif - -/* GL_APPLE_rgb_422 */ -#ifndef GL_APPLE_rgb_422 -#define GL_APPLE_rgb_422 1 -#endif - -/* GL_APPLE_sync */ -#ifndef GL_APPLE_sync -#define GL_APPLE_sync 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL GLsync GL_APIENTRY glFenceSyncAPPLE (GLenum condition, GLbitfield flags); -GL_APICALL GLboolean GL_APIENTRY glIsSyncAPPLE (GLsync sync); -GL_APICALL void GL_APIENTRY glDeleteSyncAPPLE (GLsync sync); -GL_APICALL GLenum GL_APIENTRY glClientWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); -GL_APICALL void GL_APIENTRY glWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); -GL_APICALL void GL_APIENTRY glGetInteger64vAPPLE (GLenum pname, GLint64 *params); -GL_APICALL void GL_APIENTRY glGetSyncivAPPLE (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -#endif -typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags); -typedef GLboolean (GL_APIENTRYP PFNGLISSYNCAPPLEPROC) (GLsync sync); -typedef void (GL_APIENTRYP PFNGLDELETESYNCAPPLEPROC) (GLsync sync); -typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (GL_APIENTRYP PFNGLWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (GL_APIENTRYP PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64 *params); -typedef void (GL_APIENTRYP PFNGLGETSYNCIVAPPLEPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -#endif - -/* GL_APPLE_texture_format_BGRA8888 */ -#ifndef GL_APPLE_texture_format_BGRA8888 -#define GL_APPLE_texture_format_BGRA8888 1 -#endif - -/* GL_APPLE_texture_max_level */ -#ifndef GL_APPLE_texture_max_level -#define GL_APPLE_texture_max_level 1 -#endif - -/*------------------------------------------------------------------------* - * ARM extension functions - *------------------------------------------------------------------------*/ - -/* GL_ARM_mali_program_binary */ -#ifndef GL_ARM_mali_program_binary -#define GL_ARM_mali_program_binary 1 -#endif - -/* GL_ARM_mali_shader_binary */ -#ifndef GL_ARM_mali_shader_binary -#define GL_ARM_mali_shader_binary 1 -#endif - -/* GL_ARM_rgba8 */ -#ifndef GL_ARM_rgba8 -#define GL_ARM_rgba8 1 -#endif - -/*------------------------------------------------------------------------* - * EXT extension functions - *------------------------------------------------------------------------*/ - -/* GL_EXT_blend_minmax */ -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 -#endif - -/* GL_EXT_color_buffer_half_float */ -#ifndef GL_EXT_color_buffer_half_float -#define GL_EXT_color_buffer_half_float 1 -#endif - -/* GL_EXT_debug_label */ -#ifndef GL_EXT_debug_label -#define GL_EXT_debug_label 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label); -GL_APICALL void GL_APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); -#endif -typedef void (GL_APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); -typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); -#endif - -/* GL_EXT_debug_marker */ -#ifndef GL_EXT_debug_marker -#define GL_EXT_debug_marker 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); -GL_APICALL void GL_APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); -GL_APICALL void GL_APIENTRY glPopGroupMarkerEXT (void); -#endif -typedef void (GL_APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); -typedef void (GL_APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); -typedef void (GL_APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); -#endif - -/* GL_EXT_discard_framebuffer */ -#ifndef GL_EXT_discard_framebuffer -#define GL_EXT_discard_framebuffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numAttachments, const GLenum *attachments); -#endif -typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); -#endif - -/* GL_EXT_map_buffer_range */ -#ifndef GL_EXT_map_buffer_range -#define GL_EXT_map_buffer_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void* GL_APIENTRY glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -GL_APICALL void GL_APIENTRY glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length); -#endif -typedef void* (GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -#endif - -/* GL_EXT_multisampled_render_to_texture */ -#ifndef GL_EXT_multisampled_render_to_texture -#define GL_EXT_multisampled_render_to_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleEXT (GLenum, GLsizei, GLenum, GLsizei, GLsizei); -GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleEXT (GLenum, GLenum, GLenum, GLuint, GLint, GLsizei); -#endif -typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); -#endif - -/* GL_EXT_multiview_draw_buffers */ -#ifndef GL_EXT_multiview_draw_buffers -#define GL_EXT_multiview_draw_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glReadBufferIndexedEXT (GLenum src, GLint index); -GL_APICALL void GL_APIENTRY glDrawBuffersIndexedEXT (GLint n, const GLenum *location, const GLint *indices); -GL_APICALL void GL_APIENTRY glGetIntegeri_vEXT (GLenum target, GLuint index, GLint *data); -#endif -typedef void (GL_APIENTRYP PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index); -typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum *location, const GLint *indices); -typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint *data); -#endif - -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); -GL_APICALL void GL_APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); -typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -#endif - -/* GL_EXT_occlusion_query_boolean */ -#ifndef GL_EXT_occlusion_query_boolean -#define GL_EXT_occlusion_query_boolean 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glGenQueriesEXT (GLsizei n, GLuint *ids); -GL_APICALL void GL_APIENTRY glDeleteQueriesEXT (GLsizei n, const GLuint *ids); -GL_APICALL GLboolean GL_APIENTRY glIsQueryEXT (GLuint id); -GL_APICALL void GL_APIENTRY glBeginQueryEXT (GLenum target, GLuint id); -GL_APICALL void GL_APIENTRY glEndQueryEXT (GLenum target); -GL_APICALL void GL_APIENTRY glGetQueryivEXT (GLenum target, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetQueryObjectuivEXT (GLuint id, GLenum pname, GLuint *params); -#endif -typedef void (GL_APIENTRYP PFNGLGENQUERIESEXTPROC) (GLsizei n, GLuint *ids); -typedef void (GL_APIENTRYP PFNGLDELETEQUERIESEXTPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (GL_APIENTRYP PFNGLISQUERYEXTPROC) (GLuint id); -typedef void (GL_APIENTRYP PFNGLBEGINQUERYEXTPROC) (GLenum target, GLuint id); -typedef void (GL_APIENTRYP PFNGLENDQUERYEXTPROC) (GLenum target); -typedef void (GL_APIENTRYP PFNGLGETQUERYIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVEXTPROC) (GLuint id, GLenum pname, GLuint *params); -#endif - -/* GL_EXT_read_format_bgra */ -#ifndef GL_EXT_read_format_bgra -#define GL_EXT_read_format_bgra 1 -#endif - -/* GL_EXT_robustness */ -#ifndef GL_EXT_robustness -#define GL_EXT_robustness 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXT (void); -GL_APICALL void GL_APIENTRY glReadnPixelsEXT (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -GL_APICALL void GL_APIENTRY glGetnUniformfvEXT (GLuint program, GLint location, GLsizei bufSize, float *params); -GL_APICALL void GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, GLsizei bufSize, GLint *params); -#endif -typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTPROC) (void); -typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, float *params); -typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); -#endif - -/* GL_EXT_separate_shader_objects */ -#ifndef GL_EXT_separate_shader_objects -#define GL_EXT_separate_shader_objects 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glUseProgramStagesEXT (GLuint pipeline, GLbitfield stages, GLuint program); -GL_APICALL void GL_APIENTRY glActiveShaderProgramEXT (GLuint pipeline, GLuint program); -GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramvEXT (GLenum type, GLsizei count, const GLchar **strings); -GL_APICALL void GL_APIENTRY glBindProgramPipelineEXT (GLuint pipeline); -GL_APICALL void GL_APIENTRY glDeleteProgramPipelinesEXT (GLsizei n, const GLuint *pipelines); -GL_APICALL void GL_APIENTRY glGenProgramPipelinesEXT (GLsizei n, GLuint *pipelines); -GL_APICALL GLboolean GL_APIENTRY glIsProgramPipelineEXT (GLuint pipeline); -GL_APICALL void GL_APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); -GL_APICALL void GL_APIENTRY glGetProgramPipelineivEXT (GLuint pipeline, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint x); -GL_APICALL void GL_APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint x, GLint y); -GL_APICALL void GL_APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint x, GLint y, GLint z); -GL_APICALL void GL_APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w); -GL_APICALL void GL_APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat x); -GL_APICALL void GL_APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat x, GLfloat y); -GL_APICALL void GL_APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z); -GL_APICALL void GL_APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GL_APICALL void GL_APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glValidateProgramPipelineEXT (GLuint pipeline); -GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLogEXT (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -#endif -typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESEXTPROC) (GLuint pipeline, GLbitfield stages, GLuint program); -typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMEXTPROC) (GLuint pipeline, GLuint program); -typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVEXTPROC) (GLenum type, GLsizei count, const GLchar **strings); -typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEEXTPROC) (GLuint pipeline); -typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESEXTPROC) (GLsizei n, const GLuint *pipelines); -typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESEXTPROC) (GLsizei n, GLuint *pipelines); -typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEEXTPROC) (GLuint pipeline); -typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); -typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVEXTPROC) (GLuint pipeline, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint x); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint x, GLint y); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat x); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEEXTPROC) (GLuint pipeline); -typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGEXTPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -#endif - -/* GL_EXT_shader_framebuffer_fetch */ -#ifndef GL_EXT_shader_framebuffer_fetch -#define GL_EXT_shader_framebuffer_fetch 1 -#endif - -/* GL_EXT_shader_texture_lod */ -#ifndef GL_EXT_shader_texture_lod -#define GL_EXT_shader_texture_lod 1 -#endif - -/* GL_EXT_shadow_samplers */ -#ifndef GL_EXT_shadow_samplers -#define GL_EXT_shadow_samplers 1 -#endif - -/* GL_EXT_sRGB */ -#ifndef GL_EXT_sRGB -#define GL_EXT_sRGB 1 -#endif - -/* GL_EXT_texture_compression_dxt1 */ -#ifndef GL_EXT_texture_compression_dxt1 -#define GL_EXT_texture_compression_dxt1 1 -#endif - -/* GL_EXT_texture_filter_anisotropic */ -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 -#endif - -/* GL_EXT_texture_format_BGRA8888 */ -#ifndef GL_EXT_texture_format_BGRA8888 -#define GL_EXT_texture_format_BGRA8888 1 -#endif - -/* GL_EXT_texture_rg */ -#ifndef GL_EXT_texture_rg -#define GL_EXT_texture_rg 1 -#endif - -/* GL_EXT_texture_storage */ -#ifndef GL_EXT_texture_storage -#define GL_EXT_texture_storage 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -GL_APICALL void GL_APIENTRY glTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glTexStorage3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -GL_APICALL void GL_APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -GL_APICALL void GL_APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -#endif -typedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -#endif - -/* GL_EXT_texture_type_2_10_10_10_REV */ -#ifndef GL_EXT_texture_type_2_10_10_10_REV -#define GL_EXT_texture_type_2_10_10_10_REV 1 -#endif - -/* GL_EXT_unpack_subimage */ -#ifndef GL_EXT_unpack_subimage -#define GL_EXT_unpack_subimage 1 -#endif - -/*------------------------------------------------------------------------* - * DMP extension functions - *------------------------------------------------------------------------*/ - -/* GL_DMP_shader_binary */ -#ifndef GL_DMP_shader_binary -#define GL_DMP_shader_binary 1 -#endif - -/*------------------------------------------------------------------------* - * FJ extension functions - *------------------------------------------------------------------------*/ - -/* GL_FJ_shader_binary_GCCSO */ -#ifndef GL_FJ_shader_binary_GCCSO -#define GL_FJ_shader_binary_GCCSO 1 -#endif - -/*------------------------------------------------------------------------* - * IMG extension functions - *------------------------------------------------------------------------*/ - -/* GL_IMG_program_binary */ -#ifndef GL_IMG_program_binary -#define GL_IMG_program_binary 1 -#endif - -/* GL_IMG_read_format */ -#ifndef GL_IMG_read_format -#define GL_IMG_read_format 1 -#endif - -/* GL_IMG_shader_binary */ -#ifndef GL_IMG_shader_binary -#define GL_IMG_shader_binary 1 -#endif - -/* GL_IMG_texture_compression_pvrtc */ -#ifndef GL_IMG_texture_compression_pvrtc -#define GL_IMG_texture_compression_pvrtc 1 -#endif - -/* GL_IMG_multisampled_render_to_texture */ -#ifndef GL_IMG_multisampled_render_to_texture -#define GL_IMG_multisampled_render_to_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleIMG (GLenum, GLsizei, GLenum, GLsizei, GLsizei); -GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum, GLenum, GLenum, GLuint, GLint, GLsizei); -#endif -typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); -#endif - -/*------------------------------------------------------------------------* - * NV extension functions - *------------------------------------------------------------------------*/ - -/* GL_NV_coverage_sample */ -#ifndef GL_NV_coverage_sample -#define GL_NV_coverage_sample 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glCoverageMaskNV (GLboolean mask); -GL_APICALL void GL_APIENTRY glCoverageOperationNV (GLenum operation); -#endif -typedef void (GL_APIENTRYP PFNGLCOVERAGEMASKNVPROC) (GLboolean mask); -typedef void (GL_APIENTRYP PFNGLCOVERAGEOPERATIONNVPROC) (GLenum operation); -#endif - -/* GL_NV_depth_nonlinear */ -#ifndef GL_NV_depth_nonlinear -#define GL_NV_depth_nonlinear 1 -#endif - -/* GL_NV_draw_buffers */ -#ifndef GL_NV_draw_buffers -#define GL_NV_draw_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDrawBuffersNV (GLsizei n, const GLenum *bufs); -#endif -typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum *bufs); -#endif - -/* GL_NV_fbo_color_attachments */ -#ifndef GL_NV_fbo_color_attachments -#define GL_NV_fbo_color_attachments 1 -#endif - -/* GL_NV_fence */ -#ifndef GL_NV_fence -#define GL_NV_fence 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDeleteFencesNV (GLsizei, const GLuint *); -GL_APICALL void GL_APIENTRY glGenFencesNV (GLsizei, GLuint *); -GL_APICALL GLboolean GL_APIENTRY glIsFenceNV (GLuint); -GL_APICALL GLboolean GL_APIENTRY glTestFenceNV (GLuint); -GL_APICALL void GL_APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *); -GL_APICALL void GL_APIENTRY glFinishFenceNV (GLuint); -GL_APICALL void GL_APIENTRY glSetFenceNV (GLuint, GLenum); -#endif -typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); -typedef void (GL_APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); -typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); -typedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); -typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); -typedef void (GL_APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); -#endif - -/* GL_NV_read_buffer */ -#ifndef GL_NV_read_buffer -#define GL_NV_read_buffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glReadBufferNV (GLenum mode); -#endif -typedef void (GL_APIENTRYP PFNGLREADBUFFERNVPROC) (GLenum mode); -#endif - -/* GL_NV_read_buffer_front */ -#ifndef GL_NV_read_buffer_front -#define GL_NV_read_buffer_front 1 -#endif - -/* GL_NV_read_depth */ -#ifndef GL_NV_read_depth -#define GL_NV_read_depth 1 -#endif - -/* GL_NV_read_depth_stencil */ -#ifndef GL_NV_read_depth_stencil -#define GL_NV_read_depth_stencil 1 -#endif - -/* GL_NV_read_stencil */ -#ifndef GL_NV_read_stencil -#define GL_NV_read_stencil 1 -#endif - -/* GL_NV_texture_compression_s3tc_update */ -#ifndef GL_NV_texture_compression_s3tc_update -#define GL_NV_texture_compression_s3tc_update 1 -#endif - -/* GL_NV_texture_npot_2D_mipmap */ -#ifndef GL_NV_texture_npot_2D_mipmap -#define GL_NV_texture_npot_2D_mipmap 1 -#endif - -/*------------------------------------------------------------------------* - * QCOM extension functions - *------------------------------------------------------------------------*/ - -/* GL_QCOM_alpha_test */ -#ifndef GL_QCOM_alpha_test -#define GL_QCOM_alpha_test 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glAlphaFuncQCOM (GLenum func, GLclampf ref); -#endif -typedef void (GL_APIENTRYP PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref); -#endif - -/* GL_QCOM_binning_control */ -#ifndef GL_QCOM_binning_control -#define GL_QCOM_binning_control 1 -#endif - -/* GL_QCOM_driver_control */ -#ifndef GL_QCOM_driver_control -#define GL_QCOM_driver_control 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glGetDriverControlsQCOM (GLint *num, GLsizei size, GLuint *driverControls); -GL_APICALL void GL_APIENTRY glGetDriverControlStringQCOM (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); -GL_APICALL void GL_APIENTRY glEnableDriverControlQCOM (GLuint driverControl); -GL_APICALL void GL_APIENTRY glDisableDriverControlQCOM (GLuint driverControl); -#endif -typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint *num, GLsizei size, GLuint *driverControls); -typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); -typedef void (GL_APIENTRYP PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); -typedef void (GL_APIENTRYP PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); -#endif - -/* GL_QCOM_extended_get */ -#ifndef GL_QCOM_extended_get -#define GL_QCOM_extended_get 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glExtGetTexturesQCOM (GLuint *textures, GLint maxTextures, GLint *numTextures); -GL_APICALL void GL_APIENTRY glExtGetBuffersQCOM (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); -GL_APICALL void GL_APIENTRY glExtGetRenderbuffersQCOM (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); -GL_APICALL void GL_APIENTRY glExtGetFramebuffersQCOM (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); -GL_APICALL void GL_APIENTRY glExtGetTexLevelParameterivQCOM (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glExtTexObjectStateOverrideiQCOM (GLenum target, GLenum pname, GLint param); -GL_APICALL void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels); -GL_APICALL void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, GLvoid **params); -#endif -typedef void (GL_APIENTRYP PFNGLEXTGETTEXTURESQCOMPROC) (GLuint *textures, GLint maxTextures, GLint *numTextures); -typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERSQCOMPROC) (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); -typedef void (GL_APIENTRYP PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); -typedef void (GL_APIENTRYP PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); -typedef void (GL_APIENTRYP PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GL_APIENTRYP PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels); -typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, GLvoid **params); -#endif - -/* GL_QCOM_extended_get2 */ -#ifndef GL_QCOM_extended_get2 -#define GL_QCOM_extended_get2 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glExtGetShadersQCOM (GLuint *shaders, GLint maxShaders, GLint *numShaders); -GL_APICALL void GL_APIENTRY glExtGetProgramsQCOM (GLuint *programs, GLint maxPrograms, GLint *numPrograms); -GL_APICALL GLboolean GL_APIENTRY glExtIsProgramBinaryQCOM (GLuint program); -GL_APICALL void GL_APIENTRY glExtGetProgramBinarySourceQCOM (GLuint program, GLenum shadertype, GLchar *source, GLint *length); -#endif -typedef void (GL_APIENTRYP PFNGLEXTGETSHADERSQCOMPROC) (GLuint *shaders, GLint maxShaders, GLint *numShaders); -typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint *programs, GLint maxPrograms, GLint *numPrograms); -typedef GLboolean (GL_APIENTRYP PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program); -typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar *source, GLint *length); -#endif - -/* GL_QCOM_perfmon_global_mode */ -#ifndef GL_QCOM_perfmon_global_mode -#define GL_QCOM_perfmon_global_mode 1 -#endif - -/* GL_QCOM_writeonly_rendering */ -#ifndef GL_QCOM_writeonly_rendering -#define GL_QCOM_writeonly_rendering 1 -#endif - -/* GL_QCOM_tiled_rendering */ -#ifndef GL_QCOM_tiled_rendering -#define GL_QCOM_tiled_rendering 1 -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glStartTilingQCOM (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); -GL_APICALL void GL_APIENTRY glEndTilingQCOM (GLbitfield preserveMask); -#endif -typedef void (GL_APIENTRYP PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); -typedef void (GL_APIENTRYP PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask); -#endif - -/*------------------------------------------------------------------------* - * VIV extension tokens - *------------------------------------------------------------------------*/ - -/* GL_VIV_shader_binary */ -#ifndef GL_VIV_shader_binary -#define GL_VIV_shader_binary 1 -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* __gl2ext_h_ */ +#include "SDL_opengles2_khrplatform.h" +#include "SDL_opengles2_gl2platform.h" +#include "SDL_opengles2_gl2.h" +#include "SDL_opengles2_gl2ext.h" #endif /* _MSC_VER */ diff --git a/lib/SDL2/include/SDL_opengles2_gl2.h b/lib/SDL2/include/SDL_opengles2_gl2.h new file mode 100644 index 0000000000..c62fb0a547 --- /dev/null +++ b/lib/SDL2/include/SDL_opengles2_gl2.h @@ -0,0 +1,621 @@ +#ifndef __gl2_h_ +#define __gl2_h_ + +/* $Revision: 20555 $ on $Date:: 2013-02-12 14:32:47 -0800 #$ */ + +/*#include */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * This document is licensed under the SGI Free Software B License Version + * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . + */ + +/*------------------------------------------------------------------------- + * Data type definitions + *-----------------------------------------------------------------------*/ + +typedef void GLvoid; +typedef char GLchar; +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef khronos_int8_t GLbyte; +typedef short GLshort; +typedef int GLint; +typedef int GLsizei; +typedef khronos_uint8_t GLubyte; +typedef unsigned short GLushort; +typedef unsigned int GLuint; +typedef khronos_float_t GLfloat; +typedef khronos_float_t GLclampf; +typedef khronos_int32_t GLfixed; + +/* GL types for handling large vertex buffer objects */ +typedef khronos_intptr_t GLintptr; +typedef khronos_ssize_t GLsizeiptr; + +/* OpenGL ES core versions */ +#define GL_ES_VERSION_2_0 1 + +/* ClearBufferMask */ +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_COLOR_BUFFER_BIT 0x00004000 + +/* Boolean */ +#define GL_FALSE 0 +#define GL_TRUE 1 + +/* BeginMode */ +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 + +/* AlphaFunction (not supported in ES20) */ +/* GL_NEVER */ +/* GL_LESS */ +/* GL_EQUAL */ +/* GL_LEQUAL */ +/* GL_GREATER */ +/* GL_NOTEQUAL */ +/* GL_GEQUAL */ +/* GL_ALWAYS */ + +/* BlendingFactorDest */ +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 + +/* BlendingFactorSrc */ +/* GL_ZERO */ +/* GL_ONE */ +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +/* GL_SRC_ALPHA */ +/* GL_ONE_MINUS_SRC_ALPHA */ +/* GL_DST_ALPHA */ +/* GL_ONE_MINUS_DST_ALPHA */ + +/* BlendEquationSeparate */ +#define GL_FUNC_ADD 0x8006 +#define GL_BLEND_EQUATION 0x8009 +#define GL_BLEND_EQUATION_RGB 0x8009 /* same as BLEND_EQUATION */ +#define GL_BLEND_EQUATION_ALPHA 0x883D + +/* BlendSubtract */ +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B + +/* Separate Blend Functions */ +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 + +/* Buffer Objects */ +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 + +#define GL_STREAM_DRAW 0x88E0 +#define GL_STATIC_DRAW 0x88E4 +#define GL_DYNAMIC_DRAW 0x88E8 + +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 + +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 + +/* CullFaceMode */ +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_FRONT_AND_BACK 0x0408 + +/* DepthFunction */ +/* GL_NEVER */ +/* GL_LESS */ +/* GL_EQUAL */ +/* GL_LEQUAL */ +/* GL_GREATER */ +/* GL_NOTEQUAL */ +/* GL_GEQUAL */ +/* GL_ALWAYS */ + +/* EnableCap */ +#define GL_TEXTURE_2D 0x0DE1 +#define GL_CULL_FACE 0x0B44 +#define GL_BLEND 0x0BE2 +#define GL_DITHER 0x0BD0 +#define GL_STENCIL_TEST 0x0B90 +#define GL_DEPTH_TEST 0x0B71 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_COVERAGE 0x80A0 + +/* ErrorCode */ +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_OUT_OF_MEMORY 0x0505 + +/* FrontFaceDirection */ +#define GL_CW 0x0900 +#define GL_CCW 0x0901 + +/* GetPName */ +#define GL_LINE_WIDTH 0x0B21 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_VIEWPORT 0x0BA2 +#define GL_SCISSOR_BOX 0x0C10 +/* GL_SCISSOR_TEST */ +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +/* GL_POLYGON_OFFSET_FILL */ +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB + +/* GetTextureParameter */ +/* GL_TEXTURE_MAG_FILTER */ +/* GL_TEXTURE_MIN_FILTER */ +/* GL_TEXTURE_WRAP_S */ +/* GL_TEXTURE_WRAP_T */ + +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 + +/* HintMode */ +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 + +/* HintTarget */ +#define GL_GENERATE_MIPMAP_HINT 0x8192 + +/* DataType */ +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_FIXED 0x140C + +/* PixelFormat */ +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A + +/* PixelType */ +/* GL_UNSIGNED_BYTE */ +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 + +/* Shaders */ +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_SHADER_TYPE 0x8B4F +#define GL_DELETE_STATUS 0x8B80 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D + +/* StencilFunction */ +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 + +/* StencilOp */ +/* GL_ZERO */ +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_INVERT 0x150A +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 + +/* StringName */ +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 + +/* TextureMagFilter */ +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 + +/* TextureMinFilter */ +/* GL_NEAREST */ +/* GL_LINEAR */ +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 + +/* TextureParameterName */ +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 + +/* TextureTarget */ +/* GL_TEXTURE_2D */ +#define GL_TEXTURE 0x1702 + +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C + +/* TextureUnit */ +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 + +/* TextureWrapMode */ +#define GL_REPEAT 0x2901 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_MIRRORED_REPEAT 0x8370 + +/* Uniform Types */ +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_CUBE 0x8B60 + +/* Vertex Arrays */ +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F + +/* Read Format */ +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B + +/* Shader Source */ +#define GL_COMPILE_STATUS 0x8B81 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_SHADER_COMPILER 0x8DFA + +/* Shader Binary */ +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 + +/* Shader Precision-Specified Types */ +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 + +/* Framebuffer Object. */ +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 + +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGB565 0x8D62 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_STENCIL_INDEX8 0x8D48 + +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 + +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 + +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 + +#define GL_NONE 0 + +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD + +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 + +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 + +/*------------------------------------------------------------------------- + * GL core functions. + *-----------------------------------------------------------------------*/ + +GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture); +GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader); +GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar* name); +GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer); +GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); +GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); +GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture); +GL_APICALL void GL_APIENTRY glBlendColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GL_APICALL void GL_APIENTRY glBlendEquation ( GLenum mode ); +GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); +GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); +GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage); +GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data); +GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target); +GL_APICALL void GL_APIENTRY glClear (GLbitfield mask); +GL_APICALL void GL_APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GL_APICALL void GL_APIENTRY glClearDepthf (GLclampf depth); +GL_APICALL void GL_APIENTRY glClearStencil (GLint s); +GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader); +GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data); +GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data); +GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GL_APICALL GLuint GL_APIENTRY glCreateProgram (void); +GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type); +GL_APICALL void GL_APIENTRY glCullFace (GLenum mode); +GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint* buffers); +GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint* framebuffers); +GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program); +GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint* renderbuffers); +GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader); +GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint* textures); +GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func); +GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag); +GL_APICALL void GL_APIENTRY glDepthRangef (GLclampf zNear, GLclampf zFar); +GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader); +GL_APICALL void GL_APIENTRY glDisable (GLenum cap); +GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index); +GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); +GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices); +GL_APICALL void GL_APIENTRY glEnable (GLenum cap); +GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index); +GL_APICALL void GL_APIENTRY glFinish (void); +GL_APICALL void GL_APIENTRY glFlush (void); +GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode); +GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint* buffers); +GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target); +GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint* framebuffers); +GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint* renderbuffers); +GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint* textures); +GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders); +GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar* name); +GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean* params); +GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint* params); +GL_APICALL GLenum GL_APIENTRY glGetError (void); +GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat* params); +GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog); +GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog); +GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision); +GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source); +GL_APICALL const GLubyte* GL_APIENTRY glGetString (GLenum name); +GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat* params); +GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat* params); +GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint* params); +GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar* name); +GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat* params); +GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, GLvoid** pointer); +GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode); +GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer); +GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap); +GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer); +GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program); +GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer); +GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader); +GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture); +GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width); +GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program); +GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param); +GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); +GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels); +GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void); +GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glSampleCoverage (GLclampf value, GLboolean invert); +GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length); +GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length); +GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask); +GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); +GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass); +GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels); +GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); +GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat* params); +GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); +GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint* params); +GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels); +GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat x); +GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat* v); +GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint x); +GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint* v); +GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat x, GLfloat y); +GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat* v); +GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint x, GLint y); +GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint* v); +GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat x, GLfloat y, GLfloat z); +GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat* v); +GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint x, GLint y, GLint z); +GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint* v); +GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat* v); +GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint x, GLint y, GLint z, GLint w); +GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint* v); +GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +GL_APICALL void GL_APIENTRY glUseProgram (GLuint program); +GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program); +GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint indx, GLfloat x); +GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint indx, const GLfloat* values); +GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint indx, GLfloat x, GLfloat y); +GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint indx, const GLfloat* values); +GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint indx, GLfloat x, GLfloat y, GLfloat z); +GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint indx, const GLfloat* values); +GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint indx, const GLfloat* values); +GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr); +GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); + +#ifdef __cplusplus +} +#endif + +#endif /* __gl2_h_ */ + diff --git a/lib/SDL2/include/SDL_opengles2_gl2ext.h b/lib/SDL2/include/SDL_opengles2_gl2ext.h new file mode 100644 index 0000000000..e8ca8b13f1 --- /dev/null +++ b/lib/SDL2/include/SDL_opengles2_gl2ext.h @@ -0,0 +1,2050 @@ +#ifndef __gl2ext_h_ +#define __gl2ext_h_ + +/* $Revision: 22801 $ on $Date:: 2013-08-21 03:20:48 -0700 #$ */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * This document is licensed under the SGI Free Software B License Version + * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . + */ + +#ifndef GL_APIENTRYP +# define GL_APIENTRYP GL_APIENTRY* +#endif + +/* New types shared by several extensions */ + +#ifndef __gl3_h_ +/* These are defined with respect to in the + * Apple extension spec, but they are also used by non-APPLE + * extensions, and in the Khronos header we use the Khronos + * portable types in khrplatform.h, which must be defined. + */ +typedef khronos_int64_t GLint64; +typedef khronos_uint64_t GLuint64; +typedef struct __GLsync *GLsync; +#endif + + +/*------------------------------------------------------------------------* + * OES extension tokens + *------------------------------------------------------------------------*/ + +/* GL_OES_compressed_ETC1_RGB8_texture */ +#ifndef GL_OES_compressed_ETC1_RGB8_texture +#define GL_ETC1_RGB8_OES 0x8D64 +#endif + +/* GL_OES_compressed_paletted_texture */ +#ifndef GL_OES_compressed_paletted_texture +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 +#endif + +/* GL_OES_depth24 */ +#ifndef GL_OES_depth24 +#define GL_DEPTH_COMPONENT24_OES 0x81A6 +#endif + +/* GL_OES_depth32 */ +#ifndef GL_OES_depth32 +#define GL_DEPTH_COMPONENT32_OES 0x81A7 +#endif + +/* GL_OES_depth_texture */ +/* No new tokens introduced by this extension. */ + +/* GL_OES_EGL_image */ +#ifndef GL_OES_EGL_image +typedef void* GLeglImageOES; +#endif + +/* GL_OES_EGL_image_external */ +#ifndef GL_OES_EGL_image_external +/* GLeglImageOES defined in GL_OES_EGL_image already. */ +#define GL_TEXTURE_EXTERNAL_OES 0x8D65 +#define GL_SAMPLER_EXTERNAL_OES 0x8D66 +#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 +#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 +#endif + +/* GL_OES_element_index_uint */ +#ifndef GL_OES_element_index_uint +#define GL_UNSIGNED_INT 0x1405 +#endif + +/* GL_OES_get_program_binary */ +#ifndef GL_OES_get_program_binary +#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE +#define GL_PROGRAM_BINARY_FORMATS_OES 0x87FF +#endif + +/* GL_OES_mapbuffer */ +#ifndef GL_OES_mapbuffer +#define GL_WRITE_ONLY_OES 0x88B9 +#define GL_BUFFER_ACCESS_OES 0x88BB +#define GL_BUFFER_MAPPED_OES 0x88BC +#define GL_BUFFER_MAP_POINTER_OES 0x88BD +#endif + +/* GL_OES_packed_depth_stencil */ +#ifndef GL_OES_packed_depth_stencil +#define GL_DEPTH_STENCIL_OES 0x84F9 +#define GL_UNSIGNED_INT_24_8_OES 0x84FA +#define GL_DEPTH24_STENCIL8_OES 0x88F0 +#endif + +/* GL_OES_required_internalformat */ +#ifndef GL_OES_required_internalformat +#define GL_ALPHA8_OES 0x803C +#define GL_DEPTH_COMPONENT16_OES 0x81A5 +/* reuse GL_DEPTH_COMPONENT24_OES */ +/* reuse GL_DEPTH24_STENCIL8_OES */ +/* reuse GL_DEPTH_COMPONENT32_OES */ +#define GL_LUMINANCE4_ALPHA4_OES 0x8043 +#define GL_LUMINANCE8_ALPHA8_OES 0x8045 +#define GL_LUMINANCE8_OES 0x8040 +#define GL_RGBA4_OES 0x8056 +#define GL_RGB5_A1_OES 0x8057 +#define GL_RGB565_OES 0x8D62 +/* reuse GL_RGB8_OES */ +/* reuse GL_RGBA8_OES */ +/* reuse GL_RGB10_EXT */ +/* reuse GL_RGB10_A2_EXT */ +#endif + +/* GL_OES_rgb8_rgba8 */ +#ifndef GL_OES_rgb8_rgba8 +#define GL_RGB8_OES 0x8051 +#define GL_RGBA8_OES 0x8058 +#endif + +/* GL_OES_standard_derivatives */ +#ifndef GL_OES_standard_derivatives +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B +#endif + +/* GL_OES_stencil1 */ +#ifndef GL_OES_stencil1 +#define GL_STENCIL_INDEX1_OES 0x8D46 +#endif + +/* GL_OES_stencil4 */ +#ifndef GL_OES_stencil4 +#define GL_STENCIL_INDEX4_OES 0x8D47 +#endif + +#ifndef GL_OES_surfaceless_context +#define GL_FRAMEBUFFER_UNDEFINED_OES 0x8219 +#endif + +/* GL_OES_texture_3D */ +#ifndef GL_OES_texture_3D +#define GL_TEXTURE_WRAP_R_OES 0x8072 +#define GL_TEXTURE_3D_OES 0x806F +#define GL_TEXTURE_BINDING_3D_OES 0x806A +#define GL_MAX_3D_TEXTURE_SIZE_OES 0x8073 +#define GL_SAMPLER_3D_OES 0x8B5F +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES 0x8CD4 +#endif + +/* GL_OES_texture_float */ +/* No new tokens introduced by this extension. */ + +/* GL_OES_texture_float_linear */ +/* No new tokens introduced by this extension. */ + +/* GL_OES_texture_half_float */ +#ifndef GL_OES_texture_half_float +#define GL_HALF_FLOAT_OES 0x8D61 +#endif + +/* GL_OES_texture_half_float_linear */ +/* No new tokens introduced by this extension. */ + +/* GL_OES_texture_npot */ +/* No new tokens introduced by this extension. */ + +/* GL_OES_vertex_array_object */ +#ifndef GL_OES_vertex_array_object +#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5 +#endif + +/* GL_OES_vertex_half_float */ +/* GL_HALF_FLOAT_OES defined in GL_OES_texture_half_float already. */ + +/* GL_OES_vertex_type_10_10_10_2 */ +#ifndef GL_OES_vertex_type_10_10_10_2 +#define GL_UNSIGNED_INT_10_10_10_2_OES 0x8DF6 +#define GL_INT_10_10_10_2_OES 0x8DF7 +#endif + +/*------------------------------------------------------------------------* + * KHR extension tokens + *------------------------------------------------------------------------*/ + +#ifndef GL_KHR_debug +typedef void (GL_APIENTRYP GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_KHR 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_KHR 0x8245 +#define GL_DEBUG_SOURCE_API_KHR 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_KHR 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_KHR 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_KHR 0x824A +#define GL_DEBUG_SOURCE_OTHER_KHR 0x824B +#define GL_DEBUG_TYPE_ERROR_KHR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_KHR 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_KHR 0x8250 +#define GL_DEBUG_TYPE_OTHER_KHR 0x8251 +#define GL_DEBUG_TYPE_MARKER_KHR 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP_KHR 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP_KHR 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION_KHR 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH_KHR 0x826D +#define GL_BUFFER_KHR 0x82E0 +#define GL_SHADER_KHR 0x82E1 +#define GL_PROGRAM_KHR 0x82E2 +#define GL_QUERY_KHR 0x82E3 +/* PROGRAM_PIPELINE only in GL */ +#define GL_SAMPLER_KHR 0x82E6 +/* DISPLAY_LIST only in GL */ +#define GL_MAX_LABEL_LENGTH_KHR 0x82E8 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_KHR 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_KHR 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_KHR 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_KHR 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_KHR 0x9147 +#define GL_DEBUG_SEVERITY_LOW_KHR 0x9148 +#define GL_DEBUG_OUTPUT_KHR 0x92E0 +#define GL_CONTEXT_FLAG_DEBUG_BIT_KHR 0x00000002 +#define GL_STACK_OVERFLOW_KHR 0x0503 +#define GL_STACK_UNDERFLOW_KHR 0x0504 +#endif + +#ifndef GL_KHR_texture_compression_astc_ldr +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD +#endif + +/*------------------------------------------------------------------------* + * AMD extension tokens + *------------------------------------------------------------------------*/ + +/* GL_AMD_compressed_3DC_texture */ +#ifndef GL_AMD_compressed_3DC_texture +#define GL_3DC_X_AMD 0x87F9 +#define GL_3DC_XY_AMD 0x87FA +#endif + +/* GL_AMD_compressed_ATC_texture */ +#ifndef GL_AMD_compressed_ATC_texture +#define GL_ATC_RGB_AMD 0x8C92 +#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 +#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE +#endif + +/* GL_AMD_performance_monitor */ +#ifndef GL_AMD_performance_monitor +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFMON_RESULT_AMD 0x8BC6 +#endif + +/* GL_AMD_program_binary_Z400 */ +#ifndef GL_AMD_program_binary_Z400 +#define GL_Z400_BINARY_AMD 0x8740 +#endif + +/*------------------------------------------------------------------------* + * ANGLE extension tokens + *------------------------------------------------------------------------*/ + +/* GL_ANGLE_depth_texture */ +#ifndef GL_ANGLE_depth_texture +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_DEPTH_STENCIL_OES 0x84F9 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_UNSIGNED_INT 0x1405 +#define GL_UNSIGNED_INT_24_8_OES 0x84FA +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT32_OES 0x81A7 +#define GL_DEPTH24_STENCIL8_OES 0x88F0 +#endif + +/* GL_ANGLE_framebuffer_blit */ +#ifndef GL_ANGLE_framebuffer_blit +#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA +#endif + +/* GL_ANGLE_framebuffer_multisample */ +#ifndef GL_ANGLE_framebuffer_multisample +#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 +#define GL_MAX_SAMPLES_ANGLE 0x8D57 +#endif + +/* GL_ANGLE_instanced_arrays */ +#ifndef GL_ANGLE_instanced_arrays +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE +#endif + +/* GL_ANGLE_pack_reverse_row_order */ +#ifndef GL_ANGLE_pack_reverse_row_order +#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 +#endif + +/* GL_ANGLE_program_binary */ +#ifndef GL_ANGLE_program_binary +#define GL_PROGRAM_BINARY_ANGLE 0x93A6 +#endif + +/* GL_ANGLE_texture_compression_dxt3 */ +#ifndef GL_ANGLE_texture_compression_dxt3 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#endif + +/* GL_ANGLE_texture_compression_dxt5 */ +#ifndef GL_ANGLE_texture_compression_dxt5 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 +#endif + +/* GL_ANGLE_texture_usage */ +#ifndef GL_ANGLE_texture_usage +#define GL_TEXTURE_USAGE_ANGLE 0x93A2 +#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 +#endif + +/* GL_ANGLE_translated_shader_source */ +#ifndef GL_ANGLE_translated_shader_source +#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 +#endif + +/*------------------------------------------------------------------------* + * APPLE extension tokens + *------------------------------------------------------------------------*/ + +/* GL_APPLE_copy_texture_levels */ +/* No new tokens introduced by this extension. */ + +/* GL_APPLE_framebuffer_multisample */ +#ifndef GL_APPLE_framebuffer_multisample +#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 +#define GL_MAX_SAMPLES_APPLE 0x8D57 +#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA +#endif + +/* GL_APPLE_rgb_422 */ +#ifndef GL_APPLE_rgb_422 +#define GL_RGB_422_APPLE 0x8A1F +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#endif + +/* GL_APPLE_sync */ +#ifndef GL_APPLE_sync + +#define GL_SYNC_OBJECT_APPLE 0x8A53 +#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE 0x9111 +#define GL_OBJECT_TYPE_APPLE 0x9112 +#define GL_SYNC_CONDITION_APPLE 0x9113 +#define GL_SYNC_STATUS_APPLE 0x9114 +#define GL_SYNC_FLAGS_APPLE 0x9115 +#define GL_SYNC_FENCE_APPLE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117 +#define GL_UNSIGNALED_APPLE 0x9118 +#define GL_SIGNALED_APPLE 0x9119 +#define GL_ALREADY_SIGNALED_APPLE 0x911A +#define GL_TIMEOUT_EXPIRED_APPLE 0x911B +#define GL_CONDITION_SATISFIED_APPLE 0x911C +#define GL_WAIT_FAILED_APPLE 0x911D +#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001 +#define GL_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFFull +#endif + +/* GL_APPLE_texture_format_BGRA8888 */ +#ifndef GL_APPLE_texture_format_BGRA8888 +#define GL_BGRA_EXT 0x80E1 +#endif + +/* GL_APPLE_texture_max_level */ +#ifndef GL_APPLE_texture_max_level +#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D +#endif + +/*------------------------------------------------------------------------* + * ARM extension tokens + *------------------------------------------------------------------------*/ + +/* GL_ARM_mali_program_binary */ +#ifndef GL_ARM_mali_program_binary +#define GL_MALI_PROGRAM_BINARY_ARM 0x8F61 +#endif + +/* GL_ARM_mali_shader_binary */ +#ifndef GL_ARM_mali_shader_binary +#define GL_MALI_SHADER_BINARY_ARM 0x8F60 +#endif + +/* GL_ARM_rgba8 */ +/* No new tokens introduced by this extension. */ + +/*------------------------------------------------------------------------* + * EXT extension tokens + *------------------------------------------------------------------------*/ + +/* GL_EXT_blend_minmax */ +#ifndef GL_EXT_blend_minmax +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#endif + +/* GL_EXT_color_buffer_half_float */ +#ifndef GL_EXT_color_buffer_half_float +#define GL_RGBA16F_EXT 0x881A +#define GL_RGB16F_EXT 0x881B +#define GL_RG16F_EXT 0x822F +#define GL_R16F_EXT 0x822D +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 +#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 +#endif + +/* GL_EXT_debug_label */ +#ifndef GL_EXT_debug_label +#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F +#define GL_PROGRAM_OBJECT_EXT 0x8B40 +#define GL_SHADER_OBJECT_EXT 0x8B48 +#define GL_BUFFER_OBJECT_EXT 0x9151 +#define GL_QUERY_OBJECT_EXT 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 +#endif + +/* GL_EXT_debug_marker */ +/* No new tokens introduced by this extension. */ + +/* GL_EXT_discard_framebuffer */ +#ifndef GL_EXT_discard_framebuffer +#define GL_COLOR_EXT 0x1800 +#define GL_DEPTH_EXT 0x1801 +#define GL_STENCIL_EXT 0x1802 +#endif + +#ifndef GL_EXT_disjoint_timer_query +#define GL_QUERY_COUNTER_BITS_EXT 0x8864 +#define GL_CURRENT_QUERY_EXT 0x8865 +#define GL_QUERY_RESULT_EXT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867 +#define GL_TIME_ELAPSED_EXT 0x88BF +#define GL_TIMESTAMP_EXT 0x8E28 +#define GL_GPU_DISJOINT_EXT 0x8FBB +#endif + +#ifndef GL_EXT_draw_buffers +#define GL_EXT_draw_buffers 1 +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_MAX_DRAW_BUFFERS_EXT 0x8824 +#define GL_DRAW_BUFFER0_EXT 0x8825 +#define GL_DRAW_BUFFER1_EXT 0x8826 +#define GL_DRAW_BUFFER2_EXT 0x8827 +#define GL_DRAW_BUFFER3_EXT 0x8828 +#define GL_DRAW_BUFFER4_EXT 0x8829 +#define GL_DRAW_BUFFER5_EXT 0x882A +#define GL_DRAW_BUFFER6_EXT 0x882B +#define GL_DRAW_BUFFER7_EXT 0x882C +#define GL_DRAW_BUFFER8_EXT 0x882D +#define GL_DRAW_BUFFER9_EXT 0x882E +#define GL_DRAW_BUFFER10_EXT 0x882F +#define GL_DRAW_BUFFER11_EXT 0x8830 +#define GL_DRAW_BUFFER12_EXT 0x8831 +#define GL_DRAW_BUFFER13_EXT 0x8832 +#define GL_DRAW_BUFFER14_EXT 0x8833 +#define GL_DRAW_BUFFER15_EXT 0x8834 +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#endif + +/* GL_EXT_map_buffer_range */ +#ifndef GL_EXT_map_buffer_range +#define GL_MAP_READ_BIT_EXT 0x0001 +#define GL_MAP_WRITE_BIT_EXT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 +#endif + +/* GL_EXT_multisampled_render_to_texture */ +#ifndef GL_EXT_multisampled_render_to_texture +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C +/* reuse values from GL_EXT_framebuffer_multisample (desktop extension) */ +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 +#endif + +/* GL_EXT_multiview_draw_buffers */ +#ifndef GL_EXT_multiview_draw_buffers +#define GL_COLOR_ATTACHMENT_EXT 0x90F0 +#define GL_MULTIVIEW_EXT 0x90F1 +#define GL_DRAW_BUFFER_EXT 0x0C01 +#define GL_READ_BUFFER_EXT 0x0C02 +#define GL_MAX_MULTIVIEW_BUFFERS_EXT 0x90F2 +#endif + +/* GL_EXT_multi_draw_arrays */ +/* No new tokens introduced by this extension. */ + +/* GL_EXT_occlusion_query_boolean */ +#ifndef GL_EXT_occlusion_query_boolean +#define GL_ANY_SAMPLES_PASSED_EXT 0x8C2F +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 0x8D6A +#define GL_CURRENT_QUERY_EXT 0x8865 +#define GL_QUERY_RESULT_EXT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867 +#endif + +/* GL_EXT_read_format_bgra */ +#ifndef GL_EXT_read_format_bgra +#define GL_BGRA_EXT 0x80E1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 +#endif + +/* GL_EXT_robustness */ +#ifndef GL_EXT_robustness +/* reuse GL_NO_ERROR */ +#define GL_GUILTY_CONTEXT_RESET_EXT 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_EXT 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_EXT 0x8255 +#define GL_CONTEXT_ROBUST_ACCESS_EXT 0x90F3 +#define GL_RESET_NOTIFICATION_STRATEGY_EXT 0x8256 +#define GL_LOSE_CONTEXT_ON_RESET_EXT 0x8252 +#define GL_NO_RESET_NOTIFICATION_EXT 0x8261 +#endif + +/* GL_EXT_separate_shader_objects */ +#ifndef GL_EXT_separate_shader_objects +#define GL_VERTEX_SHADER_BIT_EXT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT_EXT 0x00000002 +#define GL_ALL_SHADER_BITS_EXT 0xFFFFFFFF +#define GL_PROGRAM_SEPARABLE_EXT 0x8258 +#define GL_ACTIVE_PROGRAM_EXT 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING_EXT 0x825A +#endif + +/* GL_EXT_shader_framebuffer_fetch */ +#ifndef GL_EXT_shader_framebuffer_fetch +#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 +#endif + +/* GL_EXT_shader_texture_lod */ +/* No new tokens introduced by this extension. */ + +/* GL_EXT_shadow_samplers */ +#ifndef GL_EXT_shadow_samplers +#define GL_TEXTURE_COMPARE_MODE_EXT 0x884C +#define GL_TEXTURE_COMPARE_FUNC_EXT 0x884D +#define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E +#define GL_SAMPLER_2D_SHADOW_EXT 0x8B62 +#endif + +/* GL_EXT_sRGB */ +#ifndef GL_EXT_sRGB +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 +#endif + +/* GL_EXT_sRGB_write_control */ +#ifndef GL_EXT_sRGB_write_control +#define GL_EXT_sRGB_write_control 1 +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#endif + +/* GL_EXT_texture_compression_dxt1 */ +#ifndef GL_EXT_texture_compression_dxt1 +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#endif + +/* GL_EXT_texture_filter_anisotropic */ +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif + +/* GL_EXT_texture_format_BGRA8888 */ +#ifndef GL_EXT_texture_format_BGRA8888 +#define GL_BGRA_EXT 0x80E1 +#endif + +/* GL_EXT_texture_rg */ +#ifndef GL_EXT_texture_rg +#define GL_RED_EXT 0x1903 +#define GL_RG_EXT 0x8227 +#define GL_R8_EXT 0x8229 +#define GL_RG8_EXT 0x822B +#endif + +/* GL_EXT_texture_sRGB_decode */ +#ifndef GL_EXT_texture_sRGB_decode +#define GL_EXT_texture_sRGB_decode 1 +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#define GL_DECODE_EXT 0x8A49 +#define GL_SKIP_DECODE_EXT 0x8A4A +#endif + +/* GL_EXT_texture_storage */ +#ifndef GL_EXT_texture_storage +#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F +#define GL_ALPHA8_EXT 0x803C +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_RGBA32F_EXT 0x8814 +#define GL_RGB32F_EXT 0x8815 +#define GL_ALPHA32F_EXT 0x8816 +#define GL_LUMINANCE32F_EXT 0x8818 +#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 +/* reuse GL_RGBA16F_EXT */ +/* reuse GL_RGB16F_EXT */ +#define GL_ALPHA16F_EXT 0x881C +#define GL_LUMINANCE16F_EXT 0x881E +#define GL_LUMINANCE_ALPHA16F_EXT 0x881F +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGB10_EXT 0x8052 +#define GL_BGRA8_EXT 0x93A1 +#define GL_R8_EXT 0x8229 +#define GL_RG8_EXT 0x822B +#define GL_R32F_EXT 0x822E +#define GL_RG32F_EXT 0x8230 +#define GL_R16F_EXT 0x822D +#define GL_RG16F_EXT 0x822F +#endif + +/* GL_EXT_texture_type_2_10_10_10_REV */ +#ifndef GL_EXT_texture_type_2_10_10_10_REV +#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 +#endif + +/* GL_EXT_unpack_subimage */ +#ifndef GL_EXT_unpack_subimage +#define GL_UNPACK_ROW_LENGTH_EXT 0x0CF2 +#define GL_UNPACK_SKIP_ROWS_EXT 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS_EXT 0x0CF4 +#endif + +/*------------------------------------------------------------------------* + * DMP extension tokens + *------------------------------------------------------------------------*/ + +/* GL_DMP_shader_binary */ +#ifndef GL_DMP_shader_binary +#define GL_SHADER_BINARY_DMP 0x9250 +#endif + +/*------------------------------------------------------------------------* + * FJ extension tokens + *------------------------------------------------------------------------*/ + +/* GL_FJ_shader_binary_GCCSO */ +#ifndef GL_FJ_shader_binary_GCCSO +#define GL_GCCSO_SHADER_BINARY_FJ 0x9260 +#endif + +/*------------------------------------------------------------------------* + * IMG extension tokens + *------------------------------------------------------------------------*/ + +/* GL_IMG_program_binary */ +#ifndef GL_IMG_program_binary +#define GL_SGX_PROGRAM_BINARY_IMG 0x9130 +#endif + +/* GL_IMG_read_format */ +#ifndef GL_IMG_read_format +#define GL_BGRA_IMG 0x80E1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG 0x8365 +#endif + +/* GL_IMG_shader_binary */ +#ifndef GL_IMG_shader_binary +#define GL_SGX_BINARY_IMG 0x8C0A +#endif + +/* GL_IMG_texture_compression_pvrtc */ +#ifndef GL_IMG_texture_compression_pvrtc +#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 +#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 +#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 +#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 +#endif + +/* GL_IMG_texture_compression_pvrtc2 */ +#ifndef GL_IMG_texture_compression_pvrtc2 +#define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG 0x9137 +#define GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG 0x9138 +#endif + +/* GL_IMG_multisampled_render_to_texture */ +#ifndef GL_IMG_multisampled_render_to_texture +#define GL_RENDERBUFFER_SAMPLES_IMG 0x9133 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134 +#define GL_MAX_SAMPLES_IMG 0x9135 +#define GL_TEXTURE_SAMPLES_IMG 0x9136 +#endif + +/*------------------------------------------------------------------------* + * NV extension tokens + *------------------------------------------------------------------------*/ + +/* GL_NV_coverage_sample */ +#ifndef GL_NV_coverage_sample +#define GL_COVERAGE_COMPONENT_NV 0x8ED0 +#define GL_COVERAGE_COMPONENT4_NV 0x8ED1 +#define GL_COVERAGE_ATTACHMENT_NV 0x8ED2 +#define GL_COVERAGE_BUFFERS_NV 0x8ED3 +#define GL_COVERAGE_SAMPLES_NV 0x8ED4 +#define GL_COVERAGE_ALL_FRAGMENTS_NV 0x8ED5 +#define GL_COVERAGE_EDGE_FRAGMENTS_NV 0x8ED6 +#define GL_COVERAGE_AUTOMATIC_NV 0x8ED7 +#define GL_COVERAGE_BUFFER_BIT_NV 0x00008000 +#endif + +/* GL_NV_depth_nonlinear */ +#ifndef GL_NV_depth_nonlinear +#define GL_DEPTH_COMPONENT16_NONLINEAR_NV 0x8E2C +#endif + +/* GL_NV_draw_buffers */ +#ifndef GL_NV_draw_buffers +#define GL_MAX_DRAW_BUFFERS_NV 0x8824 +#define GL_DRAW_BUFFER0_NV 0x8825 +#define GL_DRAW_BUFFER1_NV 0x8826 +#define GL_DRAW_BUFFER2_NV 0x8827 +#define GL_DRAW_BUFFER3_NV 0x8828 +#define GL_DRAW_BUFFER4_NV 0x8829 +#define GL_DRAW_BUFFER5_NV 0x882A +#define GL_DRAW_BUFFER6_NV 0x882B +#define GL_DRAW_BUFFER7_NV 0x882C +#define GL_DRAW_BUFFER8_NV 0x882D +#define GL_DRAW_BUFFER9_NV 0x882E +#define GL_DRAW_BUFFER10_NV 0x882F +#define GL_DRAW_BUFFER11_NV 0x8830 +#define GL_DRAW_BUFFER12_NV 0x8831 +#define GL_DRAW_BUFFER13_NV 0x8832 +#define GL_DRAW_BUFFER14_NV 0x8833 +#define GL_DRAW_BUFFER15_NV 0x8834 +#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 +#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 +#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 +#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 +#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 +#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 +#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 +#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 +#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 +#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 +#define GL_COLOR_ATTACHMENT10_NV 0x8CEA +#define GL_COLOR_ATTACHMENT11_NV 0x8CEB +#define GL_COLOR_ATTACHMENT12_NV 0x8CEC +#define GL_COLOR_ATTACHMENT13_NV 0x8CED +#define GL_COLOR_ATTACHMENT14_NV 0x8CEE +#define GL_COLOR_ATTACHMENT15_NV 0x8CEF +#endif + +/* GL_NV_draw_instanced */ +/* No new tokens introduced by this extension. */ + +/* GL_NV_fbo_color_attachments */ +#ifndef GL_NV_fbo_color_attachments +#define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF +/* GL_COLOR_ATTACHMENT{0-15}_NV defined in GL_NV_draw_buffers already. */ +#endif + +/* GL_NV_fence */ +#ifndef GL_NV_fence +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +#endif + +/* GL_NV_framebuffer_blit */ +#ifndef GL_NV_framebuffer_blit +#define GL_READ_FRAMEBUFFER_NV 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_NV 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_NV 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_NV 0x8CAA +#endif + +/* GL_NV_framebuffer_multisample */ +#ifndef GL_NV_framebuffer_multisample +#define GL_RENDERBUFFER_SAMPLES_NV 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV 0x8D56 +#define GL_MAX_SAMPLES_NV 0x8D57 +#endif + +/* GL_NV_generate_mipmap_sRGB */ +/* No new tokens introduced by this extension. */ + +/* GL_NV_instanced_arrays */ +#ifndef GL_NV_instanced_arrays +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE +#endif + +/* GL_NV_read_buffer */ +#ifndef GL_NV_read_buffer +#define GL_READ_BUFFER_NV 0x0C02 +#endif + +/* GL_NV_read_buffer_front */ +/* No new tokens introduced by this extension. */ + +/* GL_NV_read_depth */ +/* No new tokens introduced by this extension. */ + +/* GL_NV_read_depth_stencil */ +/* No new tokens introduced by this extension. */ + +/* GL_NV_read_stencil */ +/* No new tokens introduced by this extension. */ + +/* GL_NV_shadow_samplers_array */ +#ifndef GL_NV_shadow_samplers_array +#define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4 +#endif + +/* GL_NV_shadow_samplers_cube */ +#ifndef GL_NV_shadow_samplers_cube +#define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5 +#endif + +/* GL_NV_sRGB_formats */ +#ifndef GL_NV_sRGB_formats +#define GL_SLUMINANCE_NV 0x8C46 +#define GL_SLUMINANCE_ALPHA_NV 0x8C44 +#define GL_SRGB8_NV 0x8C41 +#define GL_SLUMINANCE8_NV 0x8C47 +#define GL_SLUMINANCE8_ALPHA8_NV 0x8C45 +#define GL_COMPRESSED_SRGB_S3TC_DXT1_NV 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV 0x8C4F +#define GL_ETC1_SRGB8_NV 0x88EE +#endif + +/* GL_NV_texture_border_clamp */ +#ifndef GL_NV_texture_border_clamp +#define GL_TEXTURE_BORDER_COLOR_NV 0x1004 +#define GL_CLAMP_TO_BORDER_NV 0x812D +#endif + +/* GL_NV_texture_compression_s3tc_update */ +/* No new tokens introduced by this extension. */ + +/* GL_NV_texture_npot_2D_mipmap */ +/* No new tokens introduced by this extension. */ + +/*------------------------------------------------------------------------* + * QCOM extension tokens + *------------------------------------------------------------------------*/ + +/* GL_QCOM_alpha_test */ +#ifndef GL_QCOM_alpha_test +#define GL_ALPHA_TEST_QCOM 0x0BC0 +#define GL_ALPHA_TEST_FUNC_QCOM 0x0BC1 +#define GL_ALPHA_TEST_REF_QCOM 0x0BC2 +#endif + +/* GL_QCOM_binning_control */ +#ifndef GL_QCOM_binning_control +#define GL_BINNING_CONTROL_HINT_QCOM 0x8FB0 +#define GL_CPU_OPTIMIZED_QCOM 0x8FB1 +#define GL_GPU_OPTIMIZED_QCOM 0x8FB2 +#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM 0x8FB3 +#endif + +/* GL_QCOM_driver_control */ +/* No new tokens introduced by this extension. */ + +/* GL_QCOM_extended_get */ +#ifndef GL_QCOM_extended_get +#define GL_TEXTURE_WIDTH_QCOM 0x8BD2 +#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3 +#define GL_TEXTURE_DEPTH_QCOM 0x8BD4 +#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5 +#define GL_TEXTURE_FORMAT_QCOM 0x8BD6 +#define GL_TEXTURE_TYPE_QCOM 0x8BD7 +#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8 +#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9 +#define GL_TEXTURE_TARGET_QCOM 0x8BDA +#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB +#define GL_STATE_RESTORE 0x8BDC +#endif + +/* GL_QCOM_extended_get2 */ +/* No new tokens introduced by this extension. */ + +/* GL_QCOM_perfmon_global_mode */ +#ifndef GL_QCOM_perfmon_global_mode +#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 +#endif + +/* GL_QCOM_writeonly_rendering */ +#ifndef GL_QCOM_writeonly_rendering +#define GL_WRITEONLY_RENDERING_QCOM 0x8823 +#endif + +/* GL_QCOM_tiled_rendering */ +#ifndef GL_QCOM_tiled_rendering +#define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 +#define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002 +#define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004 +#define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008 +#define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010 +#define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020 +#define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040 +#define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080 +#define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100 +#define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200 +#define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400 +#define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800 +#define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000 +#define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000 +#define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000 +#define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000 +#define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000 +#define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000 +#define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000 +#define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000 +#define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000 +#define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000 +#define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000 +#define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000 +#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000 +#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000 +#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000 +#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000 +#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000 +#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000 +#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000 +#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000 +#endif + +/*------------------------------------------------------------------------* + * VIV extension tokens + *------------------------------------------------------------------------*/ + +/* GL_VIV_shader_binary */ +#ifndef GL_VIV_shader_binary +#define GL_SHADER_BINARY_VIV 0x8FC4 +#endif + +/*------------------------------------------------------------------------* + * End of extension tokens, start of corresponding extension functions + *------------------------------------------------------------------------*/ + +/*------------------------------------------------------------------------* + * OES extension functions + *------------------------------------------------------------------------*/ + +/* GL_OES_compressed_ETC1_RGB8_texture */ +#ifndef GL_OES_compressed_ETC1_RGB8_texture +#define GL_OES_compressed_ETC1_RGB8_texture 1 +#endif + +/* GL_OES_compressed_paletted_texture */ +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 +#endif + +/* GL_OES_depth24 */ +#ifndef GL_OES_depth24 +#define GL_OES_depth24 1 +#endif + +/* GL_OES_depth32 */ +#ifndef GL_OES_depth32 +#define GL_OES_depth32 1 +#endif + +/* GL_OES_depth_texture */ +#ifndef GL_OES_depth_texture +#define GL_OES_depth_texture 1 +#endif + +/* GL_OES_EGL_image */ +#ifndef GL_OES_EGL_image +#define GL_OES_EGL_image 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image); +GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image); +#endif +typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image); +typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image); +#endif + +/* GL_OES_EGL_image_external */ +#ifndef GL_OES_EGL_image_external +#define GL_OES_EGL_image_external 1 +/* glEGLImageTargetTexture2DOES defined in GL_OES_EGL_image already. */ +#endif + +/* GL_OES_element_index_uint */ +#ifndef GL_OES_element_index_uint +#define GL_OES_element_index_uint 1 +#endif + +/* GL_OES_fbo_render_mipmap */ +#ifndef GL_OES_fbo_render_mipmap +#define GL_OES_fbo_render_mipmap 1 +#endif + +/* GL_OES_fragment_precision_high */ +#ifndef GL_OES_fragment_precision_high +#define GL_OES_fragment_precision_high 1 +#endif + +/* GL_OES_get_program_binary */ +#ifndef GL_OES_get_program_binary +#define GL_OES_get_program_binary 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetProgramBinaryOES (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); +GL_APICALL void GL_APIENTRY glProgramBinaryOES (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLint length); +#endif +typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); +typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLint length); +#endif + +/* GL_OES_mapbuffer */ +#ifndef GL_OES_mapbuffer +#define GL_OES_mapbuffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void* GL_APIENTRY glMapBufferOES (GLenum target, GLenum access); +GL_APICALL GLboolean GL_APIENTRY glUnmapBufferOES (GLenum target); +GL_APICALL void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, GLvoid **params); +#endif +typedef void* (GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access); +typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target); +typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, GLvoid **params); +#endif + +/* GL_OES_packed_depth_stencil */ +#ifndef GL_OES_packed_depth_stencil +#define GL_OES_packed_depth_stencil 1 +#endif + +/* GL_OES_required_internalformat */ +#ifndef GL_OES_required_internalformat +#define GL_OES_required_internalformat 1 +#endif + +/* GL_OES_rgb8_rgba8 */ +#ifndef GL_OES_rgb8_rgba8 +#define GL_OES_rgb8_rgba8 1 +#endif + +/* GL_OES_standard_derivatives */ +#ifndef GL_OES_standard_derivatives +#define GL_OES_standard_derivatives 1 +#endif + +/* GL_OES_stencil1 */ +#ifndef GL_OES_stencil1 +#define GL_OES_stencil1 1 +#endif + +/* GL_OES_stencil4 */ +#ifndef GL_OES_stencil4 +#define GL_OES_stencil4 1 +#endif + +#ifndef GL_OES_surfaceless_context +#define GL_OES_surfaceless_context 1 +#endif + +/* GL_OES_texture_3D */ +#ifndef GL_OES_texture_3D +#define GL_OES_texture_3D 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels); +GL_APICALL void GL_APIENTRY glTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels); +GL_APICALL void GL_APIENTRY glCopyTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glCompressedTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data); +GL_APICALL void GL_APIENTRY glCompressedTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data); +GL_APICALL void GL_APIENTRY glFramebufferTexture3DOES (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +#endif +typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels); +typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels); +typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data); +typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +#endif + +/* GL_OES_texture_float */ +#ifndef GL_OES_texture_float +#define GL_OES_texture_float 1 +#endif + +/* GL_OES_texture_float_linear */ +#ifndef GL_OES_texture_float_linear +#define GL_OES_texture_float_linear 1 +#endif + +/* GL_OES_texture_half_float */ +#ifndef GL_OES_texture_half_float +#define GL_OES_texture_half_float 1 +#endif + +/* GL_OES_texture_half_float_linear */ +#ifndef GL_OES_texture_half_float_linear +#define GL_OES_texture_half_float_linear 1 +#endif + +/* GL_OES_texture_npot */ +#ifndef GL_OES_texture_npot +#define GL_OES_texture_npot 1 +#endif + +/* GL_OES_vertex_array_object */ +#ifndef GL_OES_vertex_array_object +#define GL_OES_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBindVertexArrayOES (GLuint array); +GL_APICALL void GL_APIENTRY glDeleteVertexArraysOES (GLsizei n, const GLuint *arrays); +GL_APICALL void GL_APIENTRY glGenVertexArraysOES (GLsizei n, GLuint *arrays); +GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOES (GLuint array); +#endif +typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESPROC) (GLuint array); +typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays); +typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESPROC) (GLuint array); +#endif + +/* GL_OES_vertex_half_float */ +#ifndef GL_OES_vertex_half_float +#define GL_OES_vertex_half_float 1 +#endif + +/* GL_OES_vertex_type_10_10_10_2 */ +#ifndef GL_OES_vertex_type_10_10_10_2 +#define GL_OES_vertex_type_10_10_10_2 1 +#endif + +/*------------------------------------------------------------------------* + * KHR extension functions + *------------------------------------------------------------------------*/ + +#ifndef GL_KHR_debug +#define GL_KHR_debug 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDebugMessageControlKHR (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GL_APICALL void GL_APIENTRY glDebugMessageInsertKHR (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GL_APICALL void GL_APIENTRY glDebugMessageCallbackKHR (GLDEBUGPROCKHR callback, const void *userParam); +GL_APICALL GLuint GL_APIENTRY glGetDebugMessageLogKHR (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +GL_APICALL void GL_APIENTRY glPushDebugGroupKHR (GLenum source, GLuint id, GLsizei length, const GLchar *message); +GL_APICALL void GL_APIENTRY glPopDebugGroupKHR (void); +GL_APICALL void GL_APIENTRY glObjectLabelKHR (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +GL_APICALL void GL_APIENTRY glGetObjectLabelKHR (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +GL_APICALL void GL_APIENTRY glObjectPtrLabelKHR (const void *ptr, GLsizei length, const GLchar *label); +GL_APICALL void GL_APIENTRY glGetObjectPtrLabelKHR (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +GL_APICALL void GL_APIENTRY glGetPointervKHR (GLenum pname, GLvoid **params); +#endif +typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLKHRPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTKHRPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKKHRPROC) (GLDEBUGPROCKHR callback, const void *userParam); +typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGKHRPROC) (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPKHRPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); +typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPKHRPROC) (void); +typedef void (GL_APIENTRYP PFNGLOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETPOINTERVKHRPROC) (GLenum pname, GLvoid **params); +#endif + +#ifndef GL_KHR_texture_compression_astc_ldr +#define GL_KHR_texture_compression_astc_ldr 1 +#endif + + +/*------------------------------------------------------------------------* + * AMD extension functions + *------------------------------------------------------------------------*/ + +/* GL_AMD_compressed_3DC_texture */ +#ifndef GL_AMD_compressed_3DC_texture +#define GL_AMD_compressed_3DC_texture 1 +#endif + +/* GL_AMD_compressed_ATC_texture */ +#ifndef GL_AMD_compressed_ATC_texture +#define GL_AMD_compressed_ATC_texture 1 +#endif + +/* AMD_performance_monitor */ +#ifndef GL_AMD_performance_monitor +#define GL_AMD_performance_monitor 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, GLvoid *data); +GL_APICALL void GL_APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); +GL_APICALL void GL_APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); +GL_APICALL void GL_APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList); +GL_APICALL void GL_APIENTRY glBeginPerfMonitorAMD (GLuint monitor); +GL_APICALL void GL_APIENTRY glEndPerfMonitorAMD (GLuint monitor); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#endif +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, GLvoid *data); +typedef void (GL_APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (GL_APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (GL_APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList); +typedef void (GL_APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GL_APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#endif + +/* GL_AMD_program_binary_Z400 */ +#ifndef GL_AMD_program_binary_Z400 +#define GL_AMD_program_binary_Z400 1 +#endif + +/*------------------------------------------------------------------------* + * ANGLE extension functions + *------------------------------------------------------------------------*/ + +/* GL_ANGLE_depth_texture */ +#ifndef GL_ANGLE_depth_texture +#define GL_ANGLE_depth_texture 1 +#endif + +/* GL_ANGLE_framebuffer_blit */ +#ifndef GL_ANGLE_framebuffer_blit +#define GL_ANGLE_framebuffer_blit 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBlitFramebufferANGLE (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif +typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif + +/* GL_ANGLE_framebuffer_multisample */ +#ifndef GL_ANGLE_framebuffer_multisample +#define GL_ANGLE_framebuffer_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleANGLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif + +#ifndef GL_ANGLE_instanced_arrays +#define GL_ANGLE_instanced_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLE (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLE (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLE (GLuint index, GLuint divisor); +#endif +typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); +#endif + +/* GL_ANGLE_pack_reverse_row_order */ +#ifndef GL_ANGLE_pack_reverse_row_order +#define GL_ANGLE_pack_reverse_row_order 1 +#endif + +/* GL_ANGLE_program_binary */ +#ifndef GL_ANGLE_program_binary +#define GL_ANGLE_program_binary 1 +#endif + +/* GL_ANGLE_texture_compression_dxt3 */ +#ifndef GL_ANGLE_texture_compression_dxt3 +#define GL_ANGLE_texture_compression_dxt3 1 +#endif + +/* GL_ANGLE_texture_compression_dxt5 */ +#ifndef GL_ANGLE_texture_compression_dxt5 +#define GL_ANGLE_texture_compression_dxt5 1 +#endif + +/* GL_ANGLE_texture_usage */ +#ifndef GL_ANGLE_texture_usage +#define GL_ANGLE_texture_usage 1 +#endif + +#ifndef GL_ANGLE_translated_shader_source +#define GL_ANGLE_translated_shader_source 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLE (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source); +#endif +typedef void (GL_APIENTRYP PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source); +#endif + +/*------------------------------------------------------------------------* + * APPLE extension functions + *------------------------------------------------------------------------*/ + +/* GL_APPLE_copy_texture_levels */ +#ifndef GL_APPLE_copy_texture_levels +#define GL_APPLE_copy_texture_levels 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCopyTextureLevelsAPPLE (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); +#endif +typedef void (GL_APIENTRYP PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); +#endif + +/* GL_APPLE_framebuffer_multisample */ +#ifndef GL_APPLE_framebuffer_multisample +#define GL_APPLE_framebuffer_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleAPPLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glResolveMultisampleFramebufferAPPLE (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void); +#endif + +/* GL_APPLE_rgb_422 */ +#ifndef GL_APPLE_rgb_422 +#define GL_APPLE_rgb_422 1 +#endif + +/* GL_APPLE_sync */ +#ifndef GL_APPLE_sync +#define GL_APPLE_sync 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLsync GL_APIENTRY glFenceSyncAPPLE (GLenum condition, GLbitfield flags); +GL_APICALL GLboolean GL_APIENTRY glIsSyncAPPLE (GLsync sync); +GL_APICALL void GL_APIENTRY glDeleteSyncAPPLE (GLsync sync); +GL_APICALL GLenum GL_APIENTRY glClientWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); +GL_APICALL void GL_APIENTRY glWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); +GL_APICALL void GL_APIENTRY glGetInteger64vAPPLE (GLenum pname, GLint64 *params); +GL_APICALL void GL_APIENTRY glGetSyncivAPPLE (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +#endif +typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags); +typedef GLboolean (GL_APIENTRYP PFNGLISSYNCAPPLEPROC) (GLsync sync); +typedef void (GL_APIENTRYP PFNGLDELETESYNCAPPLEPROC) (GLsync sync); +typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GL_APIENTRYP PFNGLWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GL_APIENTRYP PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64 *params); +typedef void (GL_APIENTRYP PFNGLGETSYNCIVAPPLEPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +#endif + +/* GL_APPLE_texture_format_BGRA8888 */ +#ifndef GL_APPLE_texture_format_BGRA8888 +#define GL_APPLE_texture_format_BGRA8888 1 +#endif + +/* GL_APPLE_texture_max_level */ +#ifndef GL_APPLE_texture_max_level +#define GL_APPLE_texture_max_level 1 +#endif + +/*------------------------------------------------------------------------* + * ARM extension functions + *------------------------------------------------------------------------*/ + +/* GL_ARM_mali_program_binary */ +#ifndef GL_ARM_mali_program_binary +#define GL_ARM_mali_program_binary 1 +#endif + +/* GL_ARM_mali_shader_binary */ +#ifndef GL_ARM_mali_shader_binary +#define GL_ARM_mali_shader_binary 1 +#endif + +/* GL_ARM_rgba8 */ +#ifndef GL_ARM_rgba8 +#define GL_ARM_rgba8 1 +#endif + +/*------------------------------------------------------------------------* + * EXT extension functions + *------------------------------------------------------------------------*/ + +/* GL_EXT_blend_minmax */ +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#endif + +/* GL_EXT_color_buffer_half_float */ +#ifndef GL_EXT_color_buffer_half_float +#define GL_EXT_color_buffer_half_float 1 +#endif + +/* GL_EXT_debug_label */ +#ifndef GL_EXT_debug_label +#define GL_EXT_debug_label 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label); +GL_APICALL void GL_APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#endif +typedef void (GL_APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#endif + +/* GL_EXT_debug_marker */ +#ifndef GL_EXT_debug_marker +#define GL_EXT_debug_marker 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); +GL_APICALL void GL_APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); +GL_APICALL void GL_APIENTRY glPopGroupMarkerEXT (void); +#endif +typedef void (GL_APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (GL_APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (GL_APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); +#endif + +/* GL_EXT_discard_framebuffer */ +#ifndef GL_EXT_discard_framebuffer +#define GL_EXT_discard_framebuffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numAttachments, const GLenum *attachments); +#endif +typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); +#endif + +#ifndef GL_EXT_disjoint_timer_query +#define GL_EXT_disjoint_timer_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGenQueriesEXT (GLsizei n, GLuint *ids); +GL_APICALL void GL_APIENTRY glDeleteQueriesEXT (GLsizei n, const GLuint *ids); +GL_APICALL GLboolean GL_APIENTRY glIsQueryEXT (GLuint id); +GL_APICALL void GL_APIENTRY glBeginQueryEXT (GLenum target, GLuint id); +GL_APICALL void GL_APIENTRY glEndQueryEXT (GLenum target); +GL_APICALL void GL_APIENTRY glQueryCounterEXT (GLuint id, GLenum target); +GL_APICALL void GL_APIENTRY glGetQueryivEXT (GLenum target, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetQueryObjectivEXT (GLuint id, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetQueryObjectuivEXT (GLuint id, GLenum pname, GLuint *params); +GL_APICALL void GL_APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params); +GL_APICALL void GL_APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params); +#endif +typedef void (GL_APIENTRYP PFNGLGENQUERIESEXTPROC) (GLsizei n, GLuint *ids); +typedef void (GL_APIENTRYP PFNGLDELETEQUERIESEXTPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (GL_APIENTRYP PFNGLISQUERYEXTPROC) (GLuint id); +typedef void (GL_APIENTRYP PFNGLBEGINQUERYEXTPROC) (GLenum target, GLuint id); +typedef void (GL_APIENTRYP PFNGLENDQUERYEXTPROC) (GLenum target); +typedef void (GL_APIENTRYP PFNGLQUERYCOUNTEREXTPROC) (GLuint id, GLenum target); +typedef void (GL_APIENTRYP PFNGLGETQUERYIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTIVEXTPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVEXTPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params); +#endif /* GL_EXT_disjoint_timer_query */ + +#ifndef GL_EXT_draw_buffers +#define GL_EXT_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawBuffersEXT (GLsizei n, const GLenum *bufs); +#endif +typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum *bufs); +#endif /* GL_EXT_draw_buffers */ + +/* GL_EXT_map_buffer_range */ +#ifndef GL_EXT_map_buffer_range +#define GL_EXT_map_buffer_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void* GL_APIENTRY glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +GL_APICALL void GL_APIENTRY glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length); +#endif +typedef void* (GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +#endif + +/* GL_EXT_multisampled_render_to_texture */ +#ifndef GL_EXT_multisampled_render_to_texture +#define GL_EXT_multisampled_render_to_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +#endif +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +#endif + +/* GL_EXT_multiview_draw_buffers */ +#ifndef GL_EXT_multiview_draw_buffers +#define GL_EXT_multiview_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glReadBufferIndexedEXT (GLenum src, GLint index); +GL_APICALL void GL_APIENTRY glDrawBuffersIndexedEXT (GLint n, const GLenum *location, const GLint *indices); +GL_APICALL void GL_APIENTRY glGetIntegeri_vEXT (GLenum target, GLuint index, GLint *data); +#endif +typedef void (GL_APIENTRYP PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index); +typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum *location, const GLint *indices); +typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint *data); +#endif + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GL_APICALL void GL_APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount); +#endif + +/* GL_EXT_occlusion_query_boolean */ +#ifndef GL_EXT_occlusion_query_boolean +#define GL_EXT_occlusion_query_boolean 1 +/* All entry points also exist in GL_EXT_disjoint_timer_query */ +#endif + +/* GL_EXT_read_format_bgra */ +#ifndef GL_EXT_read_format_bgra +#define GL_EXT_read_format_bgra 1 +#endif + +/* GL_EXT_robustness */ +#ifndef GL_EXT_robustness +#define GL_EXT_robustness 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXT (void); +GL_APICALL void GL_APIENTRY glReadnPixelsEXT (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data); +GL_APICALL void GL_APIENTRY glGetnUniformfvEXT (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GL_APICALL void GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, GLsizei bufSize, GLint *params); +#endif +typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTPROC) (void); +typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data); +typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +#endif + +/* GL_EXT_separate_shader_objects */ +#ifndef GL_EXT_separate_shader_objects +#define GL_EXT_separate_shader_objects 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glUseProgramStagesEXT (GLuint pipeline, GLbitfield stages, GLuint program); +GL_APICALL void GL_APIENTRY glActiveShaderProgramEXT (GLuint pipeline, GLuint program); +GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramvEXT (GLenum type, GLsizei count, const GLchar **strings); +GL_APICALL void GL_APIENTRY glBindProgramPipelineEXT (GLuint pipeline); +GL_APICALL void GL_APIENTRY glDeleteProgramPipelinesEXT (GLsizei n, const GLuint *pipelines); +GL_APICALL void GL_APIENTRY glGenProgramPipelinesEXT (GLsizei n, GLuint *pipelines); +GL_APICALL GLboolean GL_APIENTRY glIsProgramPipelineEXT (GLuint pipeline); +GL_APICALL void GL_APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); +GL_APICALL void GL_APIENTRY glGetProgramPipelineivEXT (GLuint pipeline, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint x); +GL_APICALL void GL_APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint x, GLint y); +GL_APICALL void GL_APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint x, GLint y, GLint z); +GL_APICALL void GL_APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w); +GL_APICALL void GL_APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat x); +GL_APICALL void GL_APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat x, GLfloat y); +GL_APICALL void GL_APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z); +GL_APICALL void GL_APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GL_APICALL void GL_APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glValidateProgramPipelineEXT (GLuint pipeline); +GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLogEXT (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +#endif +typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESEXTPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMEXTPROC) (GLuint pipeline, GLuint program); +typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVEXTPROC) (GLenum type, GLsizei count, const GLchar **strings); +typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESEXTPROC) (GLsizei n, const GLuint *pipelines); +typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESEXTPROC) (GLsizei n, GLuint *pipelines); +typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVEXTPROC) (GLuint pipeline, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint x); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint x, GLint y); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat x); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGEXTPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +#endif + +/* GL_EXT_shader_framebuffer_fetch */ +#ifndef GL_EXT_shader_framebuffer_fetch +#define GL_EXT_shader_framebuffer_fetch 1 +#endif + +/* GL_EXT_shader_texture_lod */ +#ifndef GL_EXT_shader_texture_lod +#define GL_EXT_shader_texture_lod 1 +#endif + +/* GL_EXT_shadow_samplers */ +#ifndef GL_EXT_shadow_samplers +#define GL_EXT_shadow_samplers 1 +#endif + +/* GL_EXT_sRGB */ +#ifndef GL_EXT_sRGB +#define GL_EXT_sRGB 1 +#endif + +/* GL_EXT_texture_compression_dxt1 */ +#ifndef GL_EXT_texture_compression_dxt1 +#define GL_EXT_texture_compression_dxt1 1 +#endif + +/* GL_EXT_texture_filter_anisotropic */ +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#endif + +/* GL_EXT_texture_format_BGRA8888 */ +#ifndef GL_EXT_texture_format_BGRA8888 +#define GL_EXT_texture_format_BGRA8888 1 +#endif + +/* GL_EXT_texture_rg */ +#ifndef GL_EXT_texture_rg +#define GL_EXT_texture_rg 1 +#endif + +/* GL_EXT_texture_storage */ +#ifndef GL_EXT_texture_storage +#define GL_EXT_texture_storage 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GL_APICALL void GL_APIENTRY glTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glTexStorage3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GL_APICALL void GL_APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GL_APICALL void GL_APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +#endif +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +#endif + +/* GL_EXT_texture_type_2_10_10_10_REV */ +#ifndef GL_EXT_texture_type_2_10_10_10_REV +#define GL_EXT_texture_type_2_10_10_10_REV 1 +#endif + +/* GL_EXT_unpack_subimage */ +#ifndef GL_EXT_unpack_subimage +#define GL_EXT_unpack_subimage 1 +#endif + +/*------------------------------------------------------------------------* + * DMP extension functions + *------------------------------------------------------------------------*/ + +/* GL_DMP_shader_binary */ +#ifndef GL_DMP_shader_binary +#define GL_DMP_shader_binary 1 +#endif + +/*------------------------------------------------------------------------* + * FJ extension functions + *------------------------------------------------------------------------*/ + +/* GL_FJ_shader_binary_GCCSO */ +#ifndef GL_FJ_shader_binary_GCCSO +#define GL_FJ_shader_binary_GCCSO 1 +#endif + +/*------------------------------------------------------------------------* + * IMG extension functions + *------------------------------------------------------------------------*/ + +/* GL_IMG_program_binary */ +#ifndef GL_IMG_program_binary +#define GL_IMG_program_binary 1 +#endif + +/* GL_IMG_read_format */ +#ifndef GL_IMG_read_format +#define GL_IMG_read_format 1 +#endif + +/* GL_IMG_shader_binary */ +#ifndef GL_IMG_shader_binary +#define GL_IMG_shader_binary 1 +#endif + +/* GL_IMG_texture_compression_pvrtc */ +#ifndef GL_IMG_texture_compression_pvrtc +#define GL_IMG_texture_compression_pvrtc 1 +#endif + +/* GL_IMG_texture_compression_pvrtc2 */ +#ifndef GL_IMG_texture_compression_pvrtc2 +#define GL_IMG_texture_compression_pvrtc2 1 +#endif + +/* GL_IMG_multisampled_render_to_texture */ +#ifndef GL_IMG_multisampled_render_to_texture +#define GL_IMG_multisampled_render_to_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleIMG (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +#endif +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +#endif + +/*------------------------------------------------------------------------* + * NV extension functions + *------------------------------------------------------------------------*/ + +/* GL_NV_coverage_sample */ +#ifndef GL_NV_coverage_sample +#define GL_NV_coverage_sample 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCoverageMaskNV (GLboolean mask); +GL_APICALL void GL_APIENTRY glCoverageOperationNV (GLenum operation); +#endif +typedef void (GL_APIENTRYP PFNGLCOVERAGEMASKNVPROC) (GLboolean mask); +typedef void (GL_APIENTRYP PFNGLCOVERAGEOPERATIONNVPROC) (GLenum operation); +#endif + +/* GL_NV_depth_nonlinear */ +#ifndef GL_NV_depth_nonlinear +#define GL_NV_depth_nonlinear 1 +#endif + +/* GL_NV_draw_buffers */ +#ifndef GL_NV_draw_buffers +#define GL_NV_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawBuffersNV (GLsizei n, const GLenum *bufs); +#endif +typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum *bufs); +#endif + +/* GL_NV_draw_instanced */ +#ifndef GL_NV_draw_instanced +#define GL_NV_draw_instanced 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawArraysInstancedNV (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +GL_APICALL void GL_APIENTRY glDrawElementsInstancedNV (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); +#endif +typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDNVPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDNVPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); +#endif + +/* GL_NV_fbo_color_attachments */ +#ifndef GL_NV_fbo_color_attachments +#define GL_NV_fbo_color_attachments 1 +#endif + +/* GL_NV_fence */ +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); +GL_APICALL void GL_APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); +GL_APICALL GLboolean GL_APIENTRY glIsFenceNV (GLuint fence); +GL_APICALL GLboolean GL_APIENTRY glTestFenceNV (GLuint fence); +GL_APICALL void GL_APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glFinishFenceNV (GLuint fence); +GL_APICALL void GL_APIENTRY glSetFenceNV (GLuint fence, GLenum condition); +#endif +typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (GL_APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (GL_APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#endif + +/* GL_NV_framebuffer_blit */ +#ifndef GL_NV_framebuffer_blit +#define GL_NV_framebuffer_blit 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBlitFramebufferNV (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif +typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERNVPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif + +/* GL_NV_framebuffer_multisample */ +#ifndef GL_NV_framebuffer_multisample +#define GL_NV_framebuffer_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleNV ( GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC) ( GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif + +/* GL_NV_generate_mipmap_sRGB */ +#ifndef GL_NV_generate_mipmap_sRGB +#define GL_NV_generate_mipmap_sRGB 1 +#endif + +/* GL_NV_instanced_arrays */ +#ifndef GL_NV_instanced_arrays +#define GL_NV_instanced_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glVertexAttribDivisorNV (GLuint index, GLuint divisor); +#endif +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORNVPROC) (GLuint index, GLuint divisor); +#endif + +/* GL_NV_read_buffer */ +#ifndef GL_NV_read_buffer +#define GL_NV_read_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glReadBufferNV (GLenum mode); +#endif +typedef void (GL_APIENTRYP PFNGLREADBUFFERNVPROC) (GLenum mode); +#endif + +/* GL_NV_read_buffer_front */ +#ifndef GL_NV_read_buffer_front +#define GL_NV_read_buffer_front 1 +#endif + +/* GL_NV_read_depth */ +#ifndef GL_NV_read_depth +#define GL_NV_read_depth 1 +#endif + +/* GL_NV_read_depth_stencil */ +#ifndef GL_NV_read_depth_stencil +#define GL_NV_read_depth_stencil 1 +#endif + +/* GL_NV_read_stencil */ +#ifndef GL_NV_read_stencil +#define GL_NV_read_stencil 1 +#endif + +/* GL_NV_shadow_samplers_array */ +#ifndef GL_NV_shadow_samplers_array +#define GL_NV_shadow_samplers_array 1 +#endif + +/* GL_NV_shadow_samplers_cube */ +#ifndef GL_NV_shadow_samplers_cube +#define GL_NV_shadow_samplers_cube 1 +#endif + +/* GL_NV_sRGB_formats */ +#ifndef GL_NV_sRGB_formats +#define GL_NV_sRGB_formats 1 +#endif + +/* GL_NV_texture_border_clamp */ +#ifndef GL_NV_texture_border_clamp +#define GL_NV_texture_border_clamp 1 +#endif + +/* GL_NV_texture_compression_s3tc_update */ +#ifndef GL_NV_texture_compression_s3tc_update +#define GL_NV_texture_compression_s3tc_update 1 +#endif + +/* GL_NV_texture_npot_2D_mipmap */ +#ifndef GL_NV_texture_npot_2D_mipmap +#define GL_NV_texture_npot_2D_mipmap 1 +#endif + +/*------------------------------------------------------------------------* + * QCOM extension functions + *------------------------------------------------------------------------*/ + +/* GL_QCOM_alpha_test */ +#ifndef GL_QCOM_alpha_test +#define GL_QCOM_alpha_test 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glAlphaFuncQCOM (GLenum func, GLclampf ref); +#endif +typedef void (GL_APIENTRYP PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref); +#endif + +/* GL_QCOM_binning_control */ +#ifndef GL_QCOM_binning_control +#define GL_QCOM_binning_control 1 +#endif + +/* GL_QCOM_driver_control */ +#ifndef GL_QCOM_driver_control +#define GL_QCOM_driver_control 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetDriverControlsQCOM (GLint *num, GLsizei size, GLuint *driverControls); +GL_APICALL void GL_APIENTRY glGetDriverControlStringQCOM (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); +GL_APICALL void GL_APIENTRY glEnableDriverControlQCOM (GLuint driverControl); +GL_APICALL void GL_APIENTRY glDisableDriverControlQCOM (GLuint driverControl); +#endif +typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint *num, GLsizei size, GLuint *driverControls); +typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); +typedef void (GL_APIENTRYP PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +typedef void (GL_APIENTRYP PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +#endif + +/* GL_QCOM_extended_get */ +#ifndef GL_QCOM_extended_get +#define GL_QCOM_extended_get 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glExtGetTexturesQCOM (GLuint *textures, GLint maxTextures, GLint *numTextures); +GL_APICALL void GL_APIENTRY glExtGetBuffersQCOM (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); +GL_APICALL void GL_APIENTRY glExtGetRenderbuffersQCOM (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); +GL_APICALL void GL_APIENTRY glExtGetFramebuffersQCOM (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); +GL_APICALL void GL_APIENTRY glExtGetTexLevelParameterivQCOM (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glExtTexObjectStateOverrideiQCOM (GLenum target, GLenum pname, GLint param); +GL_APICALL void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels); +GL_APICALL void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, GLvoid **params); +#endif +typedef void (GL_APIENTRYP PFNGLEXTGETTEXTURESQCOMPROC) (GLuint *textures, GLint maxTextures, GLint *numTextures); +typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERSQCOMPROC) (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GL_APIENTRYP PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels); +typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, GLvoid **params); +#endif + +/* GL_QCOM_extended_get2 */ +#ifndef GL_QCOM_extended_get2 +#define GL_QCOM_extended_get2 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glExtGetShadersQCOM (GLuint *shaders, GLint maxShaders, GLint *numShaders); +GL_APICALL void GL_APIENTRY glExtGetProgramsQCOM (GLuint *programs, GLint maxPrograms, GLint *numPrograms); +GL_APICALL GLboolean GL_APIENTRY glExtIsProgramBinaryQCOM (GLuint program); +GL_APICALL void GL_APIENTRY glExtGetProgramBinarySourceQCOM (GLuint program, GLenum shadertype, GLchar *source, GLint *length); +#endif +typedef void (GL_APIENTRYP PFNGLEXTGETSHADERSQCOMPROC) (GLuint *shaders, GLint maxShaders, GLint *numShaders); +typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint *programs, GLint maxPrograms, GLint *numPrograms); +typedef GLboolean (GL_APIENTRYP PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program); +typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar *source, GLint *length); +#endif + +/* GL_QCOM_perfmon_global_mode */ +#ifndef GL_QCOM_perfmon_global_mode +#define GL_QCOM_perfmon_global_mode 1 +#endif + +/* GL_QCOM_writeonly_rendering */ +#ifndef GL_QCOM_writeonly_rendering +#define GL_QCOM_writeonly_rendering 1 +#endif + +/* GL_QCOM_tiled_rendering */ +#ifndef GL_QCOM_tiled_rendering +#define GL_QCOM_tiled_rendering 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glStartTilingQCOM (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); +GL_APICALL void GL_APIENTRY glEndTilingQCOM (GLbitfield preserveMask); +#endif +typedef void (GL_APIENTRYP PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); +typedef void (GL_APIENTRYP PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask); +#endif + +/*------------------------------------------------------------------------* + * VIV extension tokens + *------------------------------------------------------------------------*/ + +/* GL_VIV_shader_binary */ +#ifndef GL_VIV_shader_binary +#define GL_VIV_shader_binary 1 +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __gl2ext_h_ */ diff --git a/lib/SDL2/include/SDL_opengles2_gl2platform.h b/lib/SDL2/include/SDL_opengles2_gl2platform.h new file mode 100644 index 0000000000..c325686f01 --- /dev/null +++ b/lib/SDL2/include/SDL_opengles2_gl2platform.h @@ -0,0 +1,30 @@ +#ifndef __gl2platform_h_ +#define __gl2platform_h_ + +/* $Revision: 10602 $ on $Date:: 2010-03-04 22:35:34 -0800 #$ */ + +/* + * This document is licensed under the SGI Free Software B License Version + * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . + */ + +/* Platform-specific types and definitions for OpenGL ES 2.X gl2.h + * + * Adopters may modify khrplatform.h and this file to suit their platform. + * You are encouraged to submit all modifications to the Khronos group so that + * they can be included in future versions of this file. Please submit changes + * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla) + * by filing a bug against product "OpenGL-ES" component "Registry". + */ + +/*#include */ + +#ifndef GL_APICALL +#define GL_APICALL KHRONOS_APICALL +#endif + +#ifndef GL_APIENTRY +#define GL_APIENTRY KHRONOS_APIENTRY +#endif + +#endif /* __gl2platform_h_ */ diff --git a/lib/SDL2/include/SDL_opengles2_khrplatform.h b/lib/SDL2/include/SDL_opengles2_khrplatform.h new file mode 100644 index 0000000000..c9e6f17d34 --- /dev/null +++ b/lib/SDL2/include/SDL_opengles2_khrplatform.h @@ -0,0 +1,282 @@ +#ifndef __khrplatform_h_ +#define __khrplatform_h_ + +/* +** Copyright (c) 2008-2009 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +/* Khronos platform-specific types and definitions. + * + * $Revision: 23298 $ on $Date: 2013-09-30 17:07:13 -0700 (Mon, 30 Sep 2013) $ + * + * Adopters may modify this file to suit their platform. Adopters are + * encouraged to submit platform specific modifications to the Khronos + * group so that they can be included in future versions of this file. + * Please submit changes by sending them to the public Khronos Bugzilla + * (http://khronos.org/bugzilla) by filing a bug against product + * "Khronos (general)" component "Registry". + * + * A predefined template which fills in some of the bug fields can be + * reached using http://tinyurl.com/khrplatform-h-bugreport, but you + * must create a Bugzilla login first. + * + * + * See the Implementer's Guidelines for information about where this file + * should be located on your system and for more details of its use: + * http://www.khronos.org/registry/implementers_guide.pdf + * + * This file should be included as + * #include + * by Khronos client API header files that use its types and defines. + * + * The types in khrplatform.h should only be used to define API-specific types. + * + * Types defined in khrplatform.h: + * khronos_int8_t signed 8 bit + * khronos_uint8_t unsigned 8 bit + * khronos_int16_t signed 16 bit + * khronos_uint16_t unsigned 16 bit + * khronos_int32_t signed 32 bit + * khronos_uint32_t unsigned 32 bit + * khronos_int64_t signed 64 bit + * khronos_uint64_t unsigned 64 bit + * khronos_intptr_t signed same number of bits as a pointer + * khronos_uintptr_t unsigned same number of bits as a pointer + * khronos_ssize_t signed size + * khronos_usize_t unsigned size + * khronos_float_t signed 32 bit floating point + * khronos_time_ns_t unsigned 64 bit time in nanoseconds + * khronos_utime_nanoseconds_t unsigned time interval or absolute time in + * nanoseconds + * khronos_stime_nanoseconds_t signed time interval in nanoseconds + * khronos_boolean_enum_t enumerated boolean type. This should + * only be used as a base type when a client API's boolean type is + * an enum. Client APIs which use an integer or other type for + * booleans cannot use this as the base type for their boolean. + * + * Tokens defined in khrplatform.h: + * + * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. + * + * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. + * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. + * + * Calling convention macros defined in this file: + * KHRONOS_APICALL + * KHRONOS_APIENTRY + * KHRONOS_APIATTRIBUTES + * + * These may be used in function prototypes as: + * + * KHRONOS_APICALL void KHRONOS_APIENTRY funcname( + * int arg1, + * int arg2) KHRONOS_APIATTRIBUTES; + */ + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APICALL + *------------------------------------------------------------------------- + * This precedes the return type of the function in the function prototype. + */ +#if defined(_WIN32) && !defined(__SCITECH_SNAP__) +# define KHRONOS_APICALL __declspec(dllimport) +#elif defined (__SYMBIAN32__) +# define KHRONOS_APICALL IMPORT_C +#else +# define KHRONOS_APICALL +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APIENTRY + *------------------------------------------------------------------------- + * This follows the return type of the function and precedes the function + * name in the function prototype. + */ +#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) + /* Win32 but not WinCE */ +# define KHRONOS_APIENTRY __stdcall +#else +# define KHRONOS_APIENTRY +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APIATTRIBUTES + *------------------------------------------------------------------------- + * This follows the closing parenthesis of the function prototype arguments. + */ +#if defined (__ARMCC_2__) +#define KHRONOS_APIATTRIBUTES __softfp +#else +#define KHRONOS_APIATTRIBUTES +#endif + +/*------------------------------------------------------------------------- + * basic type definitions + *-----------------------------------------------------------------------*/ +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) + + +/* + * Using + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(__VMS ) || defined(__sgi) + +/* + * Using + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(_WIN32) && !defined(__SCITECH_SNAP__) + +/* + * Win32 + */ +typedef __int32 khronos_int32_t; +typedef unsigned __int32 khronos_uint32_t; +typedef __int64 khronos_int64_t; +typedef unsigned __int64 khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(__sun__) || defined(__digital__) + +/* + * Sun or Digital + */ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#if defined(__arch64__) || defined(_LP64) +typedef long int khronos_int64_t; +typedef unsigned long int khronos_uint64_t; +#else +typedef long long int khronos_int64_t; +typedef unsigned long long int khronos_uint64_t; +#endif /* __arch64__ */ +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif 0 + +/* + * Hypothetical platform with no float or int64 support + */ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#define KHRONOS_SUPPORT_INT64 0 +#define KHRONOS_SUPPORT_FLOAT 0 + +#else + +/* + * Generic fallback + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#endif + + +/* + * Types that are (so far) the same on all platforms + */ +typedef signed char khronos_int8_t; +typedef unsigned char khronos_uint8_t; +typedef signed short int khronos_int16_t; +typedef unsigned short int khronos_uint16_t; + +/* + * Types that differ between LLP64 and LP64 architectures - in LLP64, + * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears + * to be the only LLP64 architecture in current use. + */ +#ifdef _WIN64 +typedef signed long long int khronos_intptr_t; +typedef unsigned long long int khronos_uintptr_t; +typedef signed long long int khronos_ssize_t; +typedef unsigned long long int khronos_usize_t; +#else +typedef signed long int khronos_intptr_t; +typedef unsigned long int khronos_uintptr_t; +typedef signed long int khronos_ssize_t; +typedef unsigned long int khronos_usize_t; +#endif + +#if KHRONOS_SUPPORT_FLOAT +/* + * Float type + */ +typedef float khronos_float_t; +#endif + +#if KHRONOS_SUPPORT_INT64 +/* Time types + * + * These types can be used to represent a time interval in nanoseconds or + * an absolute Unadjusted System Time. Unadjusted System Time is the number + * of nanoseconds since some arbitrary system event (e.g. since the last + * time the system booted). The Unadjusted System Time is an unsigned + * 64 bit value that wraps back to 0 every 584 years. Time intervals + * may be either signed or unsigned. + */ +typedef khronos_uint64_t khronos_utime_nanoseconds_t; +typedef khronos_int64_t khronos_stime_nanoseconds_t; +#endif + +/* + * Dummy value used to pad enum types to 32 bits. + */ +#ifndef KHRONOS_MAX_ENUM +#define KHRONOS_MAX_ENUM 0x7FFFFFFF +#endif + +/* + * Enumerated boolean type + * + * Values other than zero should be considered to be true. Therefore + * comparisons should not be made against KHRONOS_TRUE. + */ +typedef enum { + KHRONOS_FALSE = 0, + KHRONOS_TRUE = 1, + KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM +} khronos_boolean_enum_t; + +#endif /* __khrplatform_h_ */ diff --git a/lib/SDL2/include/SDL_pixels.h b/lib/SDL2/include/SDL_pixels.h index 3131af7b74..8499c32896 100644 --- a/lib/SDL2/include/SDL_pixels.h +++ b/lib/SDL2/include/SDL_pixels.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -86,6 +86,8 @@ enum }; /** Array component order, low byte -> high byte. */ +/* !!! FIXME: in 2.1, make these not overlap differently with + !!! FIXME: SDL_PACKEDORDER_*, so we can simplify SDL_ISPIXELFORMAT_ALPHA */ enum { SDL_ARRAYORDER_NONE, @@ -134,12 +136,31 @@ enum (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX4) || \ (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX8))) -#define SDL_ISPIXELFORMAT_ALPHA(format) \ +#define SDL_ISPIXELFORMAT_PACKED(format) \ + (!SDL_ISPIXELFORMAT_FOURCC(format) && \ + ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED8) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED16) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED32))) + +#define SDL_ISPIXELFORMAT_ARRAY(format) \ (!SDL_ISPIXELFORMAT_FOURCC(format) && \ + ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU8) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU16) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU32) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF16) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF32))) + +#define SDL_ISPIXELFORMAT_ALPHA(format) \ + ((SDL_ISPIXELFORMAT_PACKED(format) && \ ((SDL_PIXELORDER(format) == SDL_PACKEDORDER_ARGB) || \ (SDL_PIXELORDER(format) == SDL_PACKEDORDER_RGBA) || \ (SDL_PIXELORDER(format) == SDL_PACKEDORDER_ABGR) || \ - (SDL_PIXELORDER(format) == SDL_PACKEDORDER_BGRA))) + (SDL_PIXELORDER(format) == SDL_PACKEDORDER_BGRA))) || \ + (SDL_ISPIXELFORMAT_ARRAY(format) && \ + ((SDL_PIXELORDER(format) == SDL_ARRAYORDER_ARGB) || \ + (SDL_PIXELORDER(format) == SDL_ARRAYORDER_RGBA) || \ + (SDL_PIXELORDER(format) == SDL_ARRAYORDER_ABGR) || \ + (SDL_PIXELORDER(format) == SDL_ARRAYORDER_BGRA)))) /* The flag is set to 1 because 0x1? is not in the printable ASCII range */ #define SDL_ISPIXELFORMAT_FOURCC(format) \ @@ -248,7 +269,11 @@ enum SDL_PIXELFORMAT_UYVY = /**< Packed mode: U0+Y0+V0+Y1 (1 plane) */ SDL_DEFINE_PIXELFOURCC('U', 'Y', 'V', 'Y'), SDL_PIXELFORMAT_YVYU = /**< Packed mode: Y0+V0+Y1+U0 (1 plane) */ - SDL_DEFINE_PIXELFOURCC('Y', 'V', 'Y', 'U') + SDL_DEFINE_PIXELFOURCC('Y', 'V', 'Y', 'U'), + SDL_PIXELFORMAT_NV12 = /**< Planar mode: Y + U/V interleaved (2 planes) */ + SDL_DEFINE_PIXELFOURCC('N', 'V', '1', '2'), + SDL_PIXELFORMAT_NV21 = /**< Planar mode: Y + V/U interleaved (2 planes) */ + SDL_DEFINE_PIXELFOURCC('N', 'V', '2', '1') }; typedef struct SDL_Color diff --git a/lib/SDL2/include/SDL_platform.h b/lib/SDL2/include/SDL_platform.h index c43f4b54a0..c6c21398b2 100644 --- a/lib/SDL2/include/SDL_platform.h +++ b/lib/SDL2/include/SDL_platform.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -56,7 +56,7 @@ #undef __IRIX__ #define __IRIX__ 1 #endif -#if defined(linux) || defined(__linux) || defined(__linux__) +#if (defined(linux) || defined(__linux) || defined(__linux__)) #undef __LINUX__ #define __LINUX__ 1 #endif @@ -109,15 +109,15 @@ #undef __RISCOS__ #define __RISCOS__ 1 #endif -#if defined(__SVR4) +#if defined(__sun) && defined(__SVR4) #undef __SOLARIS__ #define __SOLARIS__ 1 #endif -#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) +#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) /* Try to find out if we're compiling for WinRT or non-WinRT */ /* If _USING_V110_SDK71_ is defined it means we are using the v110_xp or v120_xp toolset. */ -#if defined(__MINGW32__) || (defined(_MSC_VER) && (_MSC_VER >= 1700) && !_USING_V110_SDK71_) /* _MSC_VER==1700 for MSVC 2012 */ +#if (defined(_MSC_VER) && (_MSC_VER >= 1700) && !_USING_V110_SDK71_) /* _MSC_VER==1700 for MSVC 2012 */ #include #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #undef __WINDOWS__ @@ -142,6 +142,23 @@ #define __PSP__ 1 #endif +/* The NACL compiler defines __native_client__ and __pnacl__ + * Ref: http://www.chromium.org/nativeclient/pnacl/stability-of-the-pnacl-bitcode-abi + */ +#if defined(__native_client__) +#undef __LINUX__ +#undef __NACL__ +#define __NACL__ 1 +#endif +#if defined(__pnacl__) +#undef __LINUX__ +#undef __PNACL__ +#define __PNACL__ 1 +/* PNACL with newlib supports static linking only */ +#define __SDL_NOGETPROCADDR__ +#endif + + #include "begin_code.h" /* Set up for C function definitions, even when using C++ */ #ifdef __cplusplus diff --git a/lib/SDL2/include/SDL_power.h b/lib/SDL2/include/SDL_power.h index cf71c98249..24c0501149 100644 --- a/lib/SDL2/include/SDL_power.h +++ b/lib/SDL2/include/SDL_power.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_quit.h b/lib/SDL2/include/SDL_quit.h index 8a786445d1..cc06f28d89 100644 --- a/lib/SDL2/include/SDL_quit.h +++ b/lib/SDL2/include/SDL_quit.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_rect.h b/lib/SDL2/include/SDL_rect.h index 0a95a33449..bbcb9a3b8a 100644 --- a/lib/SDL2/include/SDL_rect.h +++ b/lib/SDL2/include/SDL_rect.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -43,6 +43,7 @@ extern "C" { * \brief The structure that defines a point * * \sa SDL_EnclosePoints + * \sa SDL_PointInRect */ typedef struct SDL_Point { @@ -66,6 +67,15 @@ typedef struct SDL_Rect int w, h; } SDL_Rect; +/** + * \brief Returns true if point resides inside a rectangle. + */ +SDL_FORCE_INLINE SDL_bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r) +{ + return ( (p->x >= r->x) && (p->x < (r->x + r->w)) && + (p->y >= r->y) && (p->y < (r->y + r->h)) ) ? SDL_TRUE : SDL_FALSE; +} + /** * \brief Returns true if the rectangle has no area. */ diff --git a/lib/SDL2/include/SDL_render.h b/lib/SDL2/include/SDL_render.h index 77f706a9b2..e4ed2af693 100644 --- a/lib/SDL2/include/SDL_render.h +++ b/lib/SDL2/include/SDL_render.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -81,8 +81,8 @@ typedef struct SDL_RendererInfo Uint32 flags; /**< Supported ::SDL_RendererFlags */ Uint32 num_texture_formats; /**< The number of available texture formats */ Uint32 texture_formats[16]; /**< The available texture formats */ - int max_texture_width; /**< The maximimum texture width */ - int max_texture_height; /**< The maximimum texture height */ + int max_texture_width; /**< The maximum texture width */ + int max_texture_height; /**< The maximum texture height */ } SDL_RendererInfo; /** @@ -215,7 +215,7 @@ extern DECLSPEC int SDLCALL SDL_GetRendererInfo(SDL_Renderer * renderer, SDL_RendererInfo * info); /** - * \brief Get the output size of a rendering context. + * \brief Get the output size in pixels of a rendering context. */ extern DECLSPEC int SDLCALL SDL_GetRendererOutputSize(SDL_Renderer * renderer, int *w, int *h); @@ -229,7 +229,7 @@ extern DECLSPEC int SDLCALL SDL_GetRendererOutputSize(SDL_Renderer * renderer, * \param w The width of the texture in pixels. * \param h The height of the texture in pixels. * - * \return The created texture is returned, or 0 if no rendering context was + * \return The created texture is returned, or NULL if no rendering context was * active, the format was unsupported, or the width or height were out * of range. * @@ -248,7 +248,7 @@ extern DECLSPEC SDL_Texture * SDLCALL SDL_CreateTexture(SDL_Renderer * renderer, * \param renderer The renderer. * \param surface The surface containing pixel data used to fill the texture. * - * \return The created texture is returned, or 0 on error. + * \return The created texture is returned, or NULL on error. * * \note The surface is not modified or freed by this function. * @@ -371,7 +371,7 @@ extern DECLSPEC int SDLCALL SDL_GetTextureBlendMode(SDL_Texture * texture, * \param rect A pointer to the rectangle of pixels to update, or NULL to * update the entire texture. * \param pixels The raw pixel data. - * \param pitch The number of bytes between rows of pixel data. + * \param pitch The number of bytes in a row of pixel data, including padding between lines. * * \return 0 on success, or -1 if the texture is not valid. * @@ -551,6 +551,16 @@ extern DECLSPEC int SDLCALL SDL_RenderSetClipRect(SDL_Renderer * renderer, extern DECLSPEC void SDLCALL SDL_RenderGetClipRect(SDL_Renderer * renderer, SDL_Rect * rect); +/** + * \brief Get whether clipping is enabled on the given renderer. + * + * \param renderer The renderer from which clip state should be queried. + * + * \sa SDL_RenderGetClipRect() + */ +extern DECLSPEC SDL_bool SDLCALL SDL_RenderIsClipEnabled(SDL_Renderer * renderer); + + /** * \brief Set the drawing scale for rendering on the current target. * @@ -782,7 +792,7 @@ extern DECLSPEC int SDLCALL SDL_RenderCopy(SDL_Renderer * renderer, * \param dstrect A pointer to the destination rectangle, or NULL for the * entire rendering target. * \param angle An angle in degrees that indicates the rotation that will be applied to dstrect - * \param center A pointer to a point indicating the point around which dstrect will be rotated (if NULL, rotation will be done aroud dstrect.w/2, dstrect.h/2) + * \param center A pointer to a point indicating the point around which dstrect will be rotated (if NULL, rotation will be done around dstrect.w/2, dstrect.h/2). * \param flip An SDL_RendererFlip value stating which flipping actions should be performed on the texture * * \return 0 on success, or -1 on error diff --git a/lib/SDL2/include/SDL_revision.h b/lib/SDL2/include/SDL_revision.h index a75dc33097..6d7163d4d4 100644 --- a/lib/SDL2/include/SDL_revision.h +++ b/lib/SDL2/include/SDL_revision.h @@ -1,2 +1,2 @@ -#define SDL_REVISION "hg-8628:b558f99d48f0" -#define SDL_REVISION_NUMBER 8628 +#define SDL_REVISION "hg-10001:e12c38730512" +#define SDL_REVISION_NUMBER 10001 diff --git a/lib/SDL2/include/SDL_rwops.h b/lib/SDL2/include/SDL_rwops.h index 4bdd7876a3..f460ae7d40 100644 --- a/lib/SDL2/include/SDL_rwops.h +++ b/lib/SDL2/include/SDL_rwops.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -93,7 +93,7 @@ typedef struct SDL_RWops Uint32 type; union { -#if defined(ANDROID) +#if defined(__ANDROID__) struct { void *fileNameRef; @@ -220,7 +220,6 @@ extern DECLSPEC size_t SDLCALL SDL_WriteLE64(SDL_RWops * dst, Uint64 value); extern DECLSPEC size_t SDLCALL SDL_WriteBE64(SDL_RWops * dst, Uint64 value); /* @} *//* Write endian functions */ - /* Ends C function definitions when using C++ */ #ifdef __cplusplus } diff --git a/lib/SDL2/include/SDL_scancode.h b/lib/SDL2/include/SDL_scancode.h index 4b3be28fb4..0af1dd59f8 100644 --- a/lib/SDL2/include/SDL_scancode.h +++ b/lib/SDL2/include/SDL_scancode.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_shape.h b/lib/SDL2/include/SDL_shape.h index 53029306e3..db10a8f010 100644 --- a/lib/SDL2/include/SDL_shape.h +++ b/lib/SDL2/include/SDL_shape.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_stdinc.h b/lib/SDL2/include/SDL_stdinc.h index 31b343d303..887bcd2d46 100644 --- a/lib/SDL2/include/SDL_stdinc.h +++ b/lib/SDL2/include/SDL_stdinc.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -165,6 +165,97 @@ typedef uint64_t Uint64; /* @} *//* Basic data types */ +/* Make sure we have macros for printing 64 bit values. + * should define these but this is not true all platforms. + * (for example win32) */ +#ifndef SDL_PRIs64 +#ifdef PRIs64 +#define SDL_PRIs64 PRIs64 +#elif defined(__WIN32__) +#define SDL_PRIs64 "I64d" +#elif defined(__LINUX__) && defined(__LP64__) +#define SDL_PRIs64 "ld" +#else +#define SDL_PRIs64 "lld" +#endif +#endif +#ifndef SDL_PRIu64 +#ifdef PRIu64 +#define SDL_PRIu64 PRIu64 +#elif defined(__WIN32__) +#define SDL_PRIu64 "I64u" +#elif defined(__LINUX__) && defined(__LP64__) +#define SDL_PRIu64 "lu" +#else +#define SDL_PRIu64 "llu" +#endif +#endif +#ifndef SDL_PRIx64 +#ifdef PRIx64 +#define SDL_PRIx64 PRIx64 +#elif defined(__WIN32__) +#define SDL_PRIx64 "I64x" +#elif defined(__LINUX__) && defined(__LP64__) +#define SDL_PRIx64 "lx" +#else +#define SDL_PRIx64 "llx" +#endif +#endif +#ifndef SDL_PRIX64 +#ifdef PRIX64 +#define SDL_PRIX64 PRIX64 +#elif defined(__WIN32__) +#define SDL_PRIX64 "I64X" +#elif defined(__LINUX__) && defined(__LP64__) +#define SDL_PRIX64 "lX" +#else +#define SDL_PRIX64 "llX" +#endif +#endif + +/* Annotations to help code analysis tools */ +#ifdef SDL_DISABLE_ANALYZE_MACROS +#define SDL_IN_BYTECAP(x) +#define SDL_INOUT_Z_CAP(x) +#define SDL_OUT_Z_CAP(x) +#define SDL_OUT_CAP(x) +#define SDL_OUT_BYTECAP(x) +#define SDL_OUT_Z_BYTECAP(x) +#define SDL_PRINTF_FORMAT_STRING +#define SDL_SCANF_FORMAT_STRING +#define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) +#define SDL_SCANF_VARARG_FUNC( fmtargnumber ) +#else +#if defined(_MSC_VER) && (_MSC_VER >= 1600) /* VS 2010 and above */ +#include + +#define SDL_IN_BYTECAP(x) _In_bytecount_(x) +#define SDL_INOUT_Z_CAP(x) _Inout_z_cap_(x) +#define SDL_OUT_Z_CAP(x) _Out_z_cap_(x) +#define SDL_OUT_CAP(x) _Out_cap_(x) +#define SDL_OUT_BYTECAP(x) _Out_bytecap_(x) +#define SDL_OUT_Z_BYTECAP(x) _Out_z_bytecap_(x) + +#define SDL_PRINTF_FORMAT_STRING _Printf_format_string_ +#define SDL_SCANF_FORMAT_STRING _Scanf_format_string_impl_ +#else +#define SDL_IN_BYTECAP(x) +#define SDL_INOUT_Z_CAP(x) +#define SDL_OUT_Z_CAP(x) +#define SDL_OUT_CAP(x) +#define SDL_OUT_BYTECAP(x) +#define SDL_OUT_Z_BYTECAP(x) +#define SDL_PRINTF_FORMAT_STRING +#define SDL_SCANF_FORMAT_STRING +#endif +#if defined(__GNUC__) +#define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __printf__, fmtargnumber, fmtargnumber+1 ))) +#define SDL_SCANF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __scanf__, fmtargnumber, fmtargnumber+1 ))) +#else +#define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) +#define SDL_SCANF_VARARG_FUNC( fmtargnumber ) +#endif +#endif /* SDL_DISABLE_ANALYZE_MACROS */ #define SDL_COMPILE_TIME_ASSERT(name, x) \ typedef int SDL_dummy_ ## name[(x) * 2 - 1] @@ -259,7 +350,7 @@ extern DECLSPEC int SDLCALL SDL_isspace(int x); extern DECLSPEC int SDLCALL SDL_toupper(int x); extern DECLSPEC int SDLCALL SDL_tolower(int x); -extern DECLSPEC void *SDLCALL SDL_memset(void *dst, int c, size_t len); +extern DECLSPEC void *SDLCALL SDL_memset(SDL_OUT_BYTECAP(len) void *dst, int c, size_t len); #define SDL_zero(x) SDL_memset(&(x), 0, sizeof((x))) #define SDL_zerop(x) SDL_memset((x), 0, sizeof(*(x))) @@ -294,24 +385,19 @@ SDL_FORCE_INLINE void SDL_memset4(void *dst, Uint32 val, size_t dwords) } -extern DECLSPEC void *SDLCALL SDL_memcpy(void *dst, const void *src, size_t len); - -SDL_FORCE_INLINE void *SDL_memcpy4(void *dst, const void *src, size_t dwords) -{ - return SDL_memcpy(dst, src, dwords * 4); -} +extern DECLSPEC void *SDLCALL SDL_memcpy(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len); -extern DECLSPEC void *SDLCALL SDL_memmove(void *dst, const void *src, size_t len); +extern DECLSPEC void *SDLCALL SDL_memmove(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len); extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); extern DECLSPEC size_t SDLCALL SDL_wcslen(const wchar_t *wstr); -extern DECLSPEC size_t SDLCALL SDL_wcslcpy(wchar_t *dst, const wchar_t *src, size_t maxlen); -extern DECLSPEC size_t SDLCALL SDL_wcslcat(wchar_t *dst, const wchar_t *src, size_t maxlen); +extern DECLSPEC size_t SDLCALL SDL_wcslcpy(SDL_OUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen); +extern DECLSPEC size_t SDLCALL SDL_wcslcat(SDL_INOUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen); extern DECLSPEC size_t SDLCALL SDL_strlen(const char *str); -extern DECLSPEC size_t SDLCALL SDL_strlcpy(char *dst, const char *src, size_t maxlen); -extern DECLSPEC size_t SDLCALL SDL_utf8strlcpy(char *dst, const char *src, size_t dst_bytes); -extern DECLSPEC size_t SDLCALL SDL_strlcat(char *dst, const char *src, size_t maxlen); +extern DECLSPEC size_t SDLCALL SDL_strlcpy(SDL_OUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen); +extern DECLSPEC size_t SDLCALL SDL_utf8strlcpy(SDL_OUT_Z_CAP(dst_bytes) char *dst, const char *src, size_t dst_bytes); +extern DECLSPEC size_t SDLCALL SDL_strlcat(SDL_INOUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen); extern DECLSPEC char *SDLCALL SDL_strdup(const char *str); extern DECLSPEC char *SDLCALL SDL_strrev(char *str); extern DECLSPEC char *SDLCALL SDL_strupr(char *str); @@ -340,10 +426,10 @@ extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t len); -extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, const char *fmt, ...); +extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, SDL_SCANF_FORMAT_STRING const char *fmt, ...) SDL_SCANF_VARARG_FUNC(2); extern DECLSPEC int SDLCALL SDL_vsscanf(const char *text, const char *fmt, va_list ap); -extern DECLSPEC int SDLCALL SDL_snprintf(char *text, size_t maxlen, const char *fmt, ...); -extern DECLSPEC int SDLCALL SDL_vsnprintf(char *text, size_t maxlen, const char *fmt, va_list ap); +extern DECLSPEC int SDLCALL SDL_snprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const char *fmt, ... ) SDL_PRINTF_VARARG_FUNC(3); +extern DECLSPEC int SDLCALL SDL_vsnprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, const char *fmt, va_list ap); #ifndef HAVE_M_PI #ifndef M_PI @@ -367,6 +453,9 @@ extern DECLSPEC double SDLCALL SDL_scalbn(double x, int n); extern DECLSPEC double SDLCALL SDL_sin(double x); extern DECLSPEC float SDLCALL SDL_sinf(float x); extern DECLSPEC double SDLCALL SDL_sqrt(double x); +extern DECLSPEC float SDLCALL SDL_sqrtf(float x); +extern DECLSPEC double SDLCALL SDL_tan(double x); +extern DECLSPEC float SDLCALL SDL_tanf(float x); /* The SDL implementation of iconv() returns these error codes */ #define SDL_ICONV_ERROR (size_t)-1 @@ -394,6 +483,39 @@ extern DECLSPEC char *SDLCALL SDL_iconv_string(const char *tocode, #define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2-INTERNAL", "UTF-8", S, SDL_strlen(S)+1) #define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4-INTERNAL", "UTF-8", S, SDL_strlen(S)+1) +/* force builds using Clang's static analysis tools to use literal C runtime + here, since there are possibly tests that are ineffective otherwise. */ +#if defined(__clang_analyzer__) && !defined(SDL_DISABLE_ANALYZE_MACROS) +#define SDL_malloc malloc +#define SDL_calloc calloc +#define SDL_realloc realloc +#define SDL_free free +#define SDL_memset memset +#define SDL_memcpy memcpy +#define SDL_memmove memmove +#define SDL_memcmp memcmp +#define SDL_strlen strlen +#define SDL_strlcpy strlcpy +#define SDL_strlcat strlcat +#define SDL_strdup strdup +#define SDL_strchr strchr +#define SDL_strrchr strrchr +#define SDL_strstr strstr +#define SDL_strcmp strcmp +#define SDL_strncmp strncmp +#define SDL_strcasecmp strcasecmp +#define SDL_strncasecmp strncasecmp +#define SDL_sscanf sscanf +#define SDL_vsscanf vsscanf +#define SDL_snprintf snprintf +#define SDL_vsnprintf vsnprintf +#endif + +SDL_FORCE_INLINE void *SDL_memcpy4(SDL_OUT_BYTECAP(dwords*4) void *dst, SDL_IN_BYTECAP(dwords*4) const void *src, size_t dwords) +{ + return SDL_memcpy(dst, src, dwords * 4); +} + /* Ends C function definitions when using C++ */ #ifdef __cplusplus } diff --git a/lib/SDL2/include/SDL_surface.h b/lib/SDL2/include/SDL_surface.h index aa8d821741..e63ca89038 100644 --- a/lib/SDL2/include/SDL_surface.h +++ b/lib/SDL2/include/SDL_surface.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_system.h b/lib/SDL2/include/SDL_system.h index fd929f7f98..5da9adb459 100644 --- a/lib/SDL2/include/SDL_system.h +++ b/lib/SDL2/include/SDL_system.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -42,24 +42,36 @@ extern "C" { /* Platform specific functions for Windows */ #ifdef __WIN32__ + +/** + \brief Set a function that is called for every windows message, before TranslateMessage() +*/ +typedef void (SDLCALL * SDL_WindowsMessageHook)(void *userdata, void *hWnd, unsigned int message, Uint64 wParam, Sint64 lParam); +extern DECLSPEC void SDLCALL SDL_SetWindowsMessageHook(SDL_WindowsMessageHook callback, void *userdata); + +/** + \brief Returns the D3D9 adapter index that matches the specified display index. -/* Returns the D3D9 adapter index that matches the specified display index. This adapter index can be passed to IDirect3D9::CreateDevice and controls on which monitor a full screen application will appear. */ extern DECLSPEC int SDLCALL SDL_Direct3D9GetAdapterIndex( int displayIndex ); -/* Returns the D3D device associated with a renderer, or NULL if it's not a D3D renderer. +typedef struct IDirect3DDevice9 IDirect3DDevice9; +/** + \brief Returns the D3D device associated with a renderer, or NULL if it's not a D3D renderer. + Once you are done using the device, you should release it to avoid a resource leak. */ -typedef struct IDirect3DDevice9 IDirect3DDevice9; extern DECLSPEC IDirect3DDevice9* SDLCALL SDL_RenderGetD3D9Device(SDL_Renderer * renderer); -/* Returns the DXGI Adapter and Output indices for the specified display index. +/** + \brief Returns the DXGI Adapter and Output indices for the specified display index. + These can be passed to EnumAdapters and EnumOutputs respectively to get the objects required to create a DX10 or DX11 device and swap chain. */ -extern DECLSPEC void SDLCALL SDL_DXGIGetOutputInfo( int displayIndex, int *adapterIndex, int *outputIndex ); +extern DECLSPEC SDL_bool SDLCALL SDL_DXGIGetOutputInfo( int displayIndex, int *adapterIndex, int *outputIndex ); #endif /* __WIN32__ */ @@ -67,7 +79,10 @@ extern DECLSPEC void SDLCALL SDL_DXGIGetOutputInfo( int displayIndex, int *adapt /* Platform specific functions for iOS */ #if defined(__IPHONEOS__) && __IPHONEOS__ +#define SDL_iOSSetAnimationCallback(window, interval, callback, callbackParam) SDL_iPhoneSetAnimationCallback(window, interval, callback, callbackParam) extern DECLSPEC int SDLCALL SDL_iPhoneSetAnimationCallback(SDL_Window * window, int interval, void (*callback)(void*), void *callbackParam); + +#define SDL_iOSSetEventPump(enabled) SDL_iPhoneSetEventPump(enabled) extern DECLSPEC void SDLCALL SDL_iPhoneSetEventPump(SDL_bool enabled); #endif /* __IPHONEOS__ */ @@ -76,12 +91,16 @@ extern DECLSPEC void SDLCALL SDL_iPhoneSetEventPump(SDL_bool enabled); /* Platform specific functions for Android */ #if defined(__ANDROID__) && __ANDROID__ -/* Get the JNI environment for the current thread +/** + \brief Get the JNI environment for the current thread + This returns JNIEnv*, but the prototype is void* so we don't need jni.h */ extern DECLSPEC void * SDLCALL SDL_AndroidGetJNIEnv(); -/* Get the SDL Activity object for the application +/** + \brief Get the SDL Activity object for the application + This returns jobject, but the prototype is void* so we don't need jni.h The jobject returned by SDL_AndroidGetActivity is a local reference. It is the caller's responsibility to properly release it @@ -89,26 +108,33 @@ extern DECLSPEC void * SDLCALL SDL_AndroidGetJNIEnv(); */ extern DECLSPEC void * SDLCALL SDL_AndroidGetActivity(); -/* See the official Android developer guide for more information: +/** + See the official Android developer guide for more information: http://developer.android.com/guide/topics/data/data-storage.html */ #define SDL_ANDROID_EXTERNAL_STORAGE_READ 0x01 #define SDL_ANDROID_EXTERNAL_STORAGE_WRITE 0x02 -/* Get the path used for internal storage for this application. +/** + \brief Get the path used for internal storage for this application. + This path is unique to your application and cannot be written to by other applications. */ extern DECLSPEC const char * SDLCALL SDL_AndroidGetInternalStoragePath(); -/* Get the current state of external storage, a bitmask of these values: +/** + \brief Get the current state of external storage, a bitmask of these values: SDL_ANDROID_EXTERNAL_STORAGE_READ SDL_ANDROID_EXTERNAL_STORAGE_WRITE + If external storage is currently unavailable, this will return 0. */ extern DECLSPEC int SDLCALL SDL_AndroidGetExternalStorageState(); -/* Get the path used for external storage for this application. +/** + \brief Get the path used for external storage for this application. + This path is unique to your application, but is public and can be written to by other applications. */ @@ -151,7 +177,7 @@ typedef enum * http://msdn.microsoft.com/en-us/library/windows/apps/hh464917.aspx * * \param pathType The type of path to retrieve. - * \ret A UCS-2 string (16-bit, wide-char) containing the path, or NULL + * \return A UCS-2 string (16-bit, wide-char) containing the path, or NULL * if the path is not available for any reason. Not all paths are * available on all versions of Windows. This is especially true on * Windows Phone. Check the documentation for the given @@ -168,7 +194,7 @@ extern DECLSPEC const wchar_t * SDLCALL SDL_WinRTGetFSPathUNICODE(SDL_WinRT_Path * http://msdn.microsoft.com/en-us/library/windows/apps/hh464917.aspx * * \param pathType The type of path to retrieve. - * \ret A UTF-8 string (8-bit, multi-byte) containing the path, or NULL + * \return A UTF-8 string (8-bit, multi-byte) containing the path, or NULL * if the path is not available for any reason. Not all paths are * available on all versions of Windows. This is especially true on * Windows Phone. Check the documentation for the given @@ -179,7 +205,6 @@ extern DECLSPEC const char * SDLCALL SDL_WinRTGetFSPathUTF8(SDL_WinRT_Path pathT #endif /* __WINRT__ */ - /* Ends C function definitions when using C++ */ #ifdef __cplusplus } diff --git a/lib/SDL2/include/SDL_syswm.h b/lib/SDL2/include/SDL_syswm.h index a3fe73861c..1056e526bc 100644 --- a/lib/SDL2/include/SDL_syswm.h +++ b/lib/SDL2/include/SDL_syswm.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -52,7 +52,9 @@ struct SDL_SysWMinfo; #else #if defined(SDL_VIDEO_DRIVER_WINDOWS) +#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN +#endif #include #endif @@ -83,7 +85,7 @@ struct SDL_SysWMinfo; #if defined(SDL_VIDEO_DRIVER_COCOA) #ifdef __OBJC__ -#include +@class NSWindow; #else typedef struct _NSWindow NSWindow; #endif @@ -96,13 +98,14 @@ typedef struct _NSWindow NSWindow; typedef struct _UIWindow UIWindow; typedef struct _UIViewController UIViewController; #endif +typedef Uint32 GLuint; #endif -#if defined(SDL_VIDEO_DRIVER_MIR) -#include +#if defined(SDL_VIDEO_DRIVER_ANDROID) +typedef struct ANativeWindow ANativeWindow; +typedef void *EGLSurface; #endif - /** * These are the various supported windowing subsystems */ @@ -117,6 +120,7 @@ typedef enum SDL_SYSWM_WAYLAND, SDL_SYSWM_MIR, SDL_SYSWM_WINRT, + SDL_SYSWM_ANDROID } SDL_SYSWM_TYPE; /** @@ -149,12 +153,17 @@ struct SDL_SysWMmsg #if defined(SDL_VIDEO_DRIVER_COCOA) struct { + /* Latest version of Xcode clang complains about empty structs in C v. C++: + error: empty struct has size 0 in C, size 1 in C++ + */ + int dummy; /* No Cocoa window events yet */ } cocoa; #endif #if defined(SDL_VIDEO_DRIVER_UIKIT) struct { + int dummy; /* No UIKit window events yet */ } uikit; #endif @@ -179,6 +188,7 @@ struct SDL_SysWMinfo struct { HWND window; /**< The window handle */ + HDC hdc; /**< The window device context */ } win; #endif #if defined(SDL_VIDEO_DRIVER_WINRT) @@ -205,13 +215,24 @@ struct SDL_SysWMinfo #if defined(SDL_VIDEO_DRIVER_COCOA) struct { - NSWindow *window; /* The Cocoa window */ +#if defined(__OBJC__) && defined(__has_feature) && __has_feature(objc_arc) + NSWindow __unsafe_unretained *window; /* The Cocoa window */ +#else + NSWindow *window; /* The Cocoa window */ +#endif } cocoa; #endif #if defined(SDL_VIDEO_DRIVER_UIKIT) struct { - UIWindow *window; /* The UIKit window */ +#if defined(__OBJC__) && defined(__has_feature) && __has_feature(objc_arc) + UIWindow __unsafe_unretained *window; /* The UIKit window */ +#else + UIWindow *window; /* The UIKit window */ +#endif + GLuint framebuffer; /* The GL view's Framebuffer Object. It must be bound when rendering to the screen using GL. */ + GLuint colorbuffer; /* The GL view's color Renderbuffer Object. It must be bound when SDL_GL_SwapWindow is called. */ + GLuint resolveFramebuffer; /* The Framebuffer Object which holds the resolve color Renderbuffer, when MSAA is used. */ } uikit; #endif #if defined(SDL_VIDEO_DRIVER_WAYLAND) @@ -225,11 +246,19 @@ struct SDL_SysWMinfo #if defined(SDL_VIDEO_DRIVER_MIR) struct { - MirConnection *connection; /**< Mir display server connection */ - MirSurface *surface; /**< Mir surface */ + struct MirConnection *connection; /**< Mir display server connection */ + struct MirSurface *surface; /**< Mir surface */ } mir; #endif +#if defined(SDL_VIDEO_DRIVER_ANDROID) + struct + { + ANativeWindow *window; + EGLSurface surface; + } android; +#endif + /* Can't have an empty union */ int dummy; } info; diff --git a/lib/SDL2/include/SDL_test.h b/lib/SDL2/include/SDL_test.h index ae649a420f..217847bfc9 100644 --- a/lib/SDL2/include/SDL_test.h +++ b/lib/SDL2/include/SDL_test.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -52,7 +52,7 @@ extern "C" { /* Global definitions */ /* - * Note: Maximum size of SDLTest log message is less than SDLs limit + * Note: Maximum size of SDLTest log message is less than SDL's limit * to ensure we can fit additional information such as the timestamp. */ #define SDLTEST_MAX_LOGMESSAGE_LENGTH 3584 diff --git a/lib/SDL2/include/SDL_test_assert.h b/lib/SDL2/include/SDL_test_assert.h index 79c84d6064..29277e1221 100644 --- a/lib/SDL2/include/SDL_test_assert.h +++ b/lib/SDL2/include/SDL_test_assert.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -58,7 +58,7 @@ extern "C" { * \param assertCondition Evaluated condition or variable to assert; fail (==0) or pass (!=0). * \param assertDescription Message to log with the assert describing it. */ -void SDLTest_Assert(int assertCondition, const char *assertDescription, ...); +void SDLTest_Assert(int assertCondition, SDL_PRINTF_FORMAT_STRING const char *assertDescription, ...) SDL_PRINTF_VARARG_FUNC(2); /** * \brief Assert for test cases that logs but does not break execution flow on failures. Updates assertion counters. @@ -68,14 +68,14 @@ void SDLTest_Assert(int assertCondition, const char *assertDescription, ...); * * \returns Returns the assertCondition so it can be used to externally to break execution flow if desired. */ -int SDLTest_AssertCheck(int assertCondition, const char *assertDescription, ...); +int SDLTest_AssertCheck(int assertCondition, SDL_PRINTF_FORMAT_STRING const char *assertDescription, ...) SDL_PRINTF_VARARG_FUNC(2); /** - * \brief Explicitely pass without checking an assertion condition. Updates assertion counter. + * \brief Explicitly pass without checking an assertion condition. Updates assertion counter. * * \param assertDescription Message to log with the assert describing it. */ -void SDLTest_AssertPass(const char *assertDescription, ...); +void SDLTest_AssertPass(SDL_PRINTF_FORMAT_STRING const char *assertDescription, ...) SDL_PRINTF_VARARG_FUNC(1); /** * \brief Resets the assert summary counters to zero. diff --git a/lib/SDL2/include/SDL_test_common.h b/lib/SDL2/include/SDL_test_common.h index 45c9edafd2..0ebf31cb67 100644 --- a/lib/SDL2/include/SDL_test_common.h +++ b/lib/SDL2/include/SDL_test_common.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_test_compare.h b/lib/SDL2/include/SDL_test_compare.h index f1353a8d25..772cf9fbd7 100644 --- a/lib/SDL2/include/SDL_test_compare.h +++ b/lib/SDL2/include/SDL_test_compare.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -51,9 +51,9 @@ extern "C" { * * \param surface Surface used in comparison * \param referenceSurface Test Surface used in comparison - * \param allowable_error Allowable difference (squared) in blending accuracy. + * \param allowable_error Allowable difference (=sum of squared difference for each RGB component) in blending accuracy. * - * \returns 0 if comparison succeeded, >0 (=number of pixels where comparison failed) if comparison failed, -1 if any of the surfaces were NULL, -2 if the surface sizes differ. + * \returns 0 if comparison succeeded, >0 (=number of pixels for which the comparison failed) if comparison failed, -1 if any of the surfaces were NULL, -2 if the surface sizes differ. */ int SDLTest_CompareSurfaces(SDL_Surface *surface, SDL_Surface *referenceSurface, int allowable_error); diff --git a/lib/SDL2/include/SDL_test_crc32.h b/lib/SDL2/include/SDL_test_crc32.h index a180fe3bbc..572a3d9551 100644 --- a/lib/SDL2/include/SDL_test_crc32.h +++ b/lib/SDL2/include/SDL_test_crc32.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -70,27 +70,27 @@ extern "C" { /* ---------- Function Prototypes ------------- */ /** - * /brief Initialize the CRC context + * \brief Initialize the CRC context * * Note: The function initializes the crc table required for all crc calculations. * - * /param crcContext pointer to context variable + * \param crcContext pointer to context variable * - * /returns 0 for OK, -1 on error + * \returns 0 for OK, -1 on error * */ int SDLTest_Crc32Init(SDLTest_Crc32Context * crcContext); /** - * /brief calculate a crc32 from a data block + * \brief calculate a crc32 from a data block * - * /param crcContext pointer to context variable - * /param inBuf input buffer to checksum - * /param inLen length of input buffer - * /param crc32 pointer to Uint32 to store the final CRC into + * \param crcContext pointer to context variable + * \param inBuf input buffer to checksum + * \param inLen length of input buffer + * \param crc32 pointer to Uint32 to store the final CRC into * - * /returns 0 for OK, -1 on error + * \returns 0 for OK, -1 on error * */ int SDLTest_crc32Calc(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32); @@ -102,11 +102,11 @@ int SDLTest_Crc32CalcBuffer(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, /** - * /brief clean up CRC context + * \brief clean up CRC context * - * /param crcContext pointer to context variable + * \param crcContext pointer to context variable * - * /returns 0 for OK, -1 on error + * \returns 0 for OK, -1 on error * */ diff --git a/lib/SDL2/include/SDL_test_font.h b/lib/SDL2/include/SDL_test_font.h index 8d51d4a9b5..3378ea85b2 100644 --- a/lib/SDL2/include/SDL_test_font.h +++ b/lib/SDL2/include/SDL_test_font.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_test_fuzzer.h b/lib/SDL2/include/SDL_test_fuzzer.h index 640180397c..9603652b28 100644 --- a/lib/SDL2/include/SDL_test_fuzzer.h +++ b/lib/SDL2/include/SDL_test_fuzzer.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -57,7 +57,7 @@ extern "C" { /** * Initializes the fuzzer for a test * - * /param execKey Execution "Key" that initializes the random number generator uniquely for the test. + * \param execKey Execution "Key" that initializes the random number generator uniquely for the test. * */ void SDLTest_FuzzerInit(Uint64 execKey); @@ -318,7 +318,7 @@ Sint64 SDLTest_RandomSint64BoundaryValue(Sint64 boundary1, Sint64 boundary2, SDL /** * Returns integer in range [min, max] (inclusive). * Min and max values can be negative values. - * If Max in smaller tham min, then the values are swapped. + * If Max in smaller than min, then the values are swapped. * Min and max are the same value, that value will be returned. * * \param min Minimum inclusive value of returned random number diff --git a/lib/SDL2/include/SDL_test_harness.h b/lib/SDL2/include/SDL_test_harness.h index 2c1e2ade84..74c0950cda 100644 --- a/lib/SDL2/include/SDL_test_harness.h +++ b/lib/SDL2/include/SDL_test_harness.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_test_images.h b/lib/SDL2/include/SDL_test_images.h index 0562799618..8c64b4feb4 100644 --- a/lib/SDL2/include/SDL_test_images.h +++ b/lib/SDL2/include/SDL_test_images.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_test_log.h b/lib/SDL2/include/SDL_test_log.h index 76ce105835..73a5c016fb 100644 --- a/lib/SDL2/include/SDL_test_log.h +++ b/lib/SDL2/include/SDL_test_log.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -47,14 +47,14 @@ extern "C" { * * \param fmt Message to be logged */ -void SDLTest_Log(const char *fmt, ...); +void SDLTest_Log(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); /** * \brief Prints given message with a timestamp in the TEST category and the ERROR priority. * * \param fmt Message to be logged */ -void SDLTest_LogError(const char *fmt, ...); +void SDLTest_LogError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/lib/SDL2/include/SDL_test_md5.h b/lib/SDL2/include/SDL_test_md5.h index 029e164bf8..f2d9a7d7e3 100644 --- a/lib/SDL2/include/SDL_test_md5.h +++ b/lib/SDL2/include/SDL_test_md5.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -78,9 +78,9 @@ extern "C" { /* ---------- Function Prototypes ------------- */ /** - * /brief initialize the context + * \brief initialize the context * - * /param mdContext pointer to context variable + * \param mdContext pointer to context variable * * Note: The function initializes the message-digest context * mdContext. Call before each new use of the context - @@ -90,11 +90,11 @@ extern "C" { /** - * /brief update digest from variable length data + * \brief update digest from variable length data * - * /param mdContext pointer to context variable - * /param inBuf pointer to data array/string - * /param inLen length of data array/string + * \param mdContext pointer to context variable + * \param inBuf pointer to data array/string + * \param inLen length of data array/string * * Note: The function updates the message-digest context to account * for the presence of each of the characters inBuf[0..inLen-1] @@ -105,10 +105,10 @@ extern "C" { unsigned int inLen); -/* - * /brief complete digest computation +/** + * \brief complete digest computation * - * /param mdContext pointer to context variable + * \param mdContext pointer to context variable * * Note: The function terminates the message-digest computation and * ends with the desired message digest in mdContext.digest[0..15]. diff --git a/lib/SDL2/include/SDL_test_random.h b/lib/SDL2/include/SDL_test_random.h index 6c5660d80d..91c36526cb 100644 --- a/lib/SDL2/include/SDL_test_random.h +++ b/lib/SDL2/include/SDL_test_random.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_thread.h b/lib/SDL2/include/SDL_thread.h index 4e48cc34c1..377e6c73d1 100644 --- a/lib/SDL2/include/SDL_thread.h +++ b/lib/SDL2/include/SDL_thread.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -233,9 +233,9 @@ extern DECLSPEC void SDLCALL SDL_DetachThread(SDL_Thread * thread); * if (!thread_local_storage) { * thread_local_storage = SDL_TLSCreate(); * } - * SDL_AtomicUnLock(&tls_lock); + * SDL_AtomicUnlock(&tls_lock); * } - * SDL_TLSSet(thread_local_storage, value); + * SDL_TLSSet(thread_local_storage, value, 0); * } * * void *GetMyThreadData(void) diff --git a/lib/SDL2/include/SDL_timer.h b/lib/SDL2/include/SDL_timer.h index a48e0466e1..e0d3785ee8 100644 --- a/lib/SDL2/include/SDL_timer.h +++ b/lib/SDL2/include/SDL_timer.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -88,7 +88,7 @@ typedef int SDL_TimerID; /** * \brief Add a new timer to the pool of timers already running. * - * \return A timer ID, or NULL when an error occurs. + * \return A timer ID, or 0 when an error occurs. */ extern DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, diff --git a/lib/SDL2/include/SDL_touch.h b/lib/SDL2/include/SDL_touch.h index 017deb28b8..2643e36796 100644 --- a/lib/SDL2/include/SDL_touch.h +++ b/lib/SDL2/include/SDL_touch.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_types.h b/lib/SDL2/include/SDL_types.h index cd3ba33cd3..5118af2191 100644 --- a/lib/SDL2/include/SDL_types.h +++ b/lib/SDL2/include/SDL_types.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/include/SDL_version.h b/lib/SDL2/include/SDL_version.h index d02898bbba..de1f160565 100644 --- a/lib/SDL2/include/SDL_version.h +++ b/lib/SDL2/include/SDL_version.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -59,7 +59,7 @@ typedef struct SDL_version */ #define SDL_MAJOR_VERSION 2 #define SDL_MINOR_VERSION 0 -#define SDL_PATCHLEVEL 3 +#define SDL_PATCHLEVEL 4 /** * \brief Macro to determine SDL version program was compiled against. diff --git a/lib/SDL2/include/SDL_video.h b/lib/SDL2/include/SDL_video.h index 49ea37ad00..52dbbc765d 100644 --- a/lib/SDL2/include/SDL_video.h +++ b/lib/SDL2/include/SDL_video.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -53,8 +53,8 @@ extern "C" { typedef struct { Uint32 format; /**< pixel format */ - int w; /**< width */ - int h; /**< height */ + int w; /**< width, in screen coordinates */ + int h; /**< height, in screen coordinates */ int refresh_rate; /**< refresh rate (or zero for unspecified) */ void *driverdata; /**< driver-specific data, initialize to 0 */ } SDL_DisplayMode; @@ -108,7 +108,8 @@ typedef enum SDL_WINDOW_MOUSE_FOCUS = 0x00000400, /**< window has mouse focus */ SDL_WINDOW_FULLSCREEN_DESKTOP = ( SDL_WINDOW_FULLSCREEN | 0x00001000 ), SDL_WINDOW_FOREIGN = 0x00000800, /**< window not created by SDL */ - SDL_WINDOW_ALLOW_HIGHDPI = 0x00002000 /**< window should be created in high-DPI mode if supported */ + SDL_WINDOW_ALLOW_HIGHDPI = 0x00002000, /**< window should be created in high-DPI mode if supported */ + SDL_WINDOW_MOUSE_CAPTURE = 0x00004000 /**< window has mouse captured (unrelated to INPUT_GRABBED) */ } SDL_WindowFlags; /** @@ -142,7 +143,9 @@ typedef enum SDL_WINDOWEVENT_MOVED, /**< Window has been moved to data1, data2 */ SDL_WINDOWEVENT_RESIZED, /**< Window has been resized to data1xdata2 */ - SDL_WINDOWEVENT_SIZE_CHANGED, /**< The window size has changed, either as a result of an API call or through the system or user changing the window size. */ + SDL_WINDOWEVENT_SIZE_CHANGED, /**< The window size has changed, either as + a result of an API call or through the + system or user changing the window size. */ SDL_WINDOWEVENT_MINIMIZED, /**< Window has been minimized */ SDL_WINDOWEVENT_MAXIMIZED, /**< Window has been maximized */ SDL_WINDOWEVENT_RESTORED, /**< Window has been restored to normal size @@ -188,7 +191,8 @@ typedef enum SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_SHARE_WITH_CURRENT_CONTEXT, - SDL_GL_FRAMEBUFFER_SRGB_CAPABLE + SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, + SDL_GL_CONTEXT_RELEASE_BEHAVIOR } SDL_GLattr; typedef enum @@ -206,6 +210,12 @@ typedef enum SDL_GL_CONTEXT_RESET_ISOLATION_FLAG = 0x0008 } SDL_GLcontextFlag; +typedef enum +{ + SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE = 0x0000, + SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH = 0x0001 +} SDL_GLcontextReleaseFlag; + /* Function prototypes */ @@ -288,6 +298,18 @@ extern DECLSPEC const char * SDLCALL SDL_GetDisplayName(int displayIndex); */ extern DECLSPEC int SDLCALL SDL_GetDisplayBounds(int displayIndex, SDL_Rect * rect); +/** + * \brief Get the dots/pixels-per-inch for a display + * + * \note Diagonal, horizontal and vertical DPI can all be optionally + * returned if the parameter is non-NULL. + * + * \return 0 on success, or -1 if no DPI information is available or the index is out of range. + * + * \sa SDL_GetNumVideoDisplays() + */ +extern DECLSPEC int SDLCALL SDL_GetDisplayDPI(int displayIndex, float * ddpi, float * hdpi, float * vdpi); + /** * \brief Returns the number of available display modes. * @@ -392,8 +414,8 @@ extern DECLSPEC Uint32 SDLCALL SDL_GetWindowPixelFormat(SDL_Window * window); * ::SDL_WINDOWPOS_UNDEFINED. * \param y The y position of the window, ::SDL_WINDOWPOS_CENTERED, or * ::SDL_WINDOWPOS_UNDEFINED. - * \param w The width of the window. - * \param h The height of the window. + * \param w The width of the window, in screen coordinates. + * \param h The height of the window, in screen coordinates. * \param flags The flags for the window, a mask of any of the following: * ::SDL_WINDOW_FULLSCREEN, ::SDL_WINDOW_OPENGL, * ::SDL_WINDOW_HIDDEN, ::SDL_WINDOW_BORDERLESS, @@ -403,6 +425,12 @@ extern DECLSPEC Uint32 SDLCALL SDL_GetWindowPixelFormat(SDL_Window * window); * * \return The id of the window created, or zero if window creation failed. * + * If the window is created with the SDL_WINDOW_ALLOW_HIGHDPI flag, its size + * in pixels may differ from its size in screen coordinates on platforms with + * high-DPI support (e.g. iOS and Mac OS X). Use SDL_GetWindowSize() to query + * the client area's size in screen coordinates, and SDL_GL_GetDrawableSize() + * or SDL_GetRendererOutputSize() to query the drawable size in pixels. + * * \sa SDL_DestroyWindow() */ extern DECLSPEC SDL_Window * SDLCALL SDL_CreateWindow(const char *title, @@ -493,10 +521,10 @@ extern DECLSPEC void *SDLCALL SDL_GetWindowData(SDL_Window * window, * \brief Set the position of a window. * * \param window The window to reposition. - * \param x The x coordinate of the window, ::SDL_WINDOWPOS_CENTERED, or - ::SDL_WINDOWPOS_UNDEFINED. - * \param y The y coordinate of the window, ::SDL_WINDOWPOS_CENTERED, or - ::SDL_WINDOWPOS_UNDEFINED. + * \param x The x coordinate of the window in screen coordinates, or + * ::SDL_WINDOWPOS_CENTERED or ::SDL_WINDOWPOS_UNDEFINED. + * \param y The y coordinate of the window in screen coordinates, or + * ::SDL_WINDOWPOS_CENTERED or ::SDL_WINDOWPOS_UNDEFINED. * * \note The window coordinate origin is the upper left of the display. * @@ -509,8 +537,10 @@ extern DECLSPEC void SDLCALL SDL_SetWindowPosition(SDL_Window * window, * \brief Get the position of a window. * * \param window The window to query. - * \param x Pointer to variable for storing the x position, may be NULL - * \param y Pointer to variable for storing the y position, may be NULL + * \param x Pointer to variable for storing the x position, in screen + * coordinates. May be NULL. + * \param y Pointer to variable for storing the y position, in screen + * coordinates. May be NULL. * * \sa SDL_SetWindowPosition() */ @@ -521,12 +551,17 @@ extern DECLSPEC void SDLCALL SDL_GetWindowPosition(SDL_Window * window, * \brief Set the size of a window's client area. * * \param window The window to resize. - * \param w The width of the window, must be >0 - * \param h The height of the window, must be >0 + * \param w The width of the window, in screen coordinates. Must be >0. + * \param h The height of the window, in screen coordinates. Must be >0. * * \note You can't change the size of a fullscreen window, it automatically * matches the size of the display mode. * + * The window size in screen coordinates may differ from the size in pixels, if + * the window was created with SDL_WINDOW_ALLOW_HIGHDPI on a platform with + * high-dpi support (e.g. iOS or OS X). Use SDL_GL_GetDrawableSize() or + * SDL_GetRendererOutputSize() to get the real client area size in pixels. + * * \sa SDL_GetWindowSize() */ extern DECLSPEC void SDLCALL SDL_SetWindowSize(SDL_Window * window, int w, @@ -536,8 +571,15 @@ extern DECLSPEC void SDLCALL SDL_SetWindowSize(SDL_Window * window, int w, * \brief Get the size of a window's client area. * * \param window The window to query. - * \param w Pointer to variable for storing the width, may be NULL - * \param h Pointer to variable for storing the height, may be NULL + * \param w Pointer to variable for storing the width, in screen + * coordinates. May be NULL. + * \param h Pointer to variable for storing the height, in screen + * coordinates. May be NULL. + * + * The window size in screen coordinates may differ from the size in pixels, if + * the window was created with SDL_WINDOW_ALLOW_HIGHDPI on a platform with + * high-dpi support (e.g. iOS or OS X). Use SDL_GL_GetDrawableSize() or + * SDL_GetRendererOutputSize() to get the real client area size in pixels. * * \sa SDL_SetWindowSize() */ @@ -714,6 +756,9 @@ extern DECLSPEC int SDLCALL SDL_UpdateWindowSurfaceRects(SDL_Window * window, * \param window The window for which the input grab mode should be set. * \param grabbed This is SDL_TRUE to grab input, and SDL_FALSE to release input. * + * If the caller enables a grab while another window is currently grabbed, + * the other window loses its grab in favor of the caller's window. + * * \sa SDL_GetWindowGrab() */ extern DECLSPEC void SDLCALL SDL_SetWindowGrab(SDL_Window * window, @@ -728,6 +773,15 @@ extern DECLSPEC void SDLCALL SDL_SetWindowGrab(SDL_Window * window, */ extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowGrab(SDL_Window * window); +/** + * \brief Get the window that currently has an input grab enabled. + * + * \return This returns the window if input is grabbed, and NULL otherwise. + * + * \sa SDL_SetWindowGrab() + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_GetGrabbedWindow(void); + /** * \brief Set the brightness (gamma correction) for a window. * @@ -790,6 +844,75 @@ extern DECLSPEC int SDLCALL SDL_GetWindowGammaRamp(SDL_Window * window, Uint16 * green, Uint16 * blue); +/** + * \brief Possible return values from the SDL_HitTest callback. + * + * \sa SDL_HitTest + */ +typedef enum +{ + SDL_HITTEST_NORMAL, /**< Region is normal. No special properties. */ + SDL_HITTEST_DRAGGABLE, /**< Region can drag entire window. */ + SDL_HITTEST_RESIZE_TOPLEFT, + SDL_HITTEST_RESIZE_TOP, + SDL_HITTEST_RESIZE_TOPRIGHT, + SDL_HITTEST_RESIZE_RIGHT, + SDL_HITTEST_RESIZE_BOTTOMRIGHT, + SDL_HITTEST_RESIZE_BOTTOM, + SDL_HITTEST_RESIZE_BOTTOMLEFT, + SDL_HITTEST_RESIZE_LEFT +} SDL_HitTestResult; + +/** + * \brief Callback used for hit-testing. + * + * \sa SDL_SetWindowHitTest + */ +typedef SDL_HitTestResult (SDLCALL *SDL_HitTest)(SDL_Window *win, + const SDL_Point *area, + void *data); + +/** + * \brief Provide a callback that decides if a window region has special properties. + * + * Normally windows are dragged and resized by decorations provided by the + * system window manager (a title bar, borders, etc), but for some apps, it + * makes sense to drag them from somewhere else inside the window itself; for + * example, one might have a borderless window that wants to be draggable + * from any part, or simulate its own title bar, etc. + * + * This function lets the app provide a callback that designates pieces of + * a given window as special. This callback is run during event processing + * if we need to tell the OS to treat a region of the window specially; the + * use of this callback is known as "hit testing." + * + * Mouse input may not be delivered to your application if it is within + * a special area; the OS will often apply that input to moving the window or + * resizing the window and not deliver it to the application. + * + * Specifying NULL for a callback disables hit-testing. Hit-testing is + * disabled by default. + * + * Platforms that don't support this functionality will return -1 + * unconditionally, even if you're attempting to disable hit-testing. + * + * Your callback may fire at any time, and its firing does not indicate any + * specific behavior (for example, on Windows, this certainly might fire + * when the OS is deciding whether to drag your window, but it fires for lots + * of other reasons, too, some unrelated to anything you probably care about + * _and when the mouse isn't actually at the location it is testing_). + * Since this can fire at any time, you should try to keep your callback + * efficient, devoid of allocations, etc. + * + * \param window The window to set hit-testing on. + * \param callback The callback to call when doing a hit-test. + * \param callback_data An app-defined void pointer passed to the callback. + * \return 0 on success, -1 on error (including unsupported). + */ +extern DECLSPEC int SDLCALL SDL_SetWindowHitTest(SDL_Window * window, + SDL_HitTest callback, + void *callback_data); + /** * \brief Destroy a window. */ @@ -908,13 +1031,14 @@ extern DECLSPEC SDL_Window* SDLCALL SDL_GL_GetCurrentWindow(void); extern DECLSPEC SDL_GLContext SDLCALL SDL_GL_GetCurrentContext(void); /** - * \brief Get the size of a window's underlying drawable (for use with glViewport). + * \brief Get the size of a window's underlying drawable in pixels (for use + * with glViewport). * * \param window Window from which the drawable size should be queried - * \param w Pointer to variable for storing the width, may be NULL - * \param h Pointer to variable for storing the height, may be NULL + * \param w Pointer to variable for storing the width in pixels, may be NULL + * \param h Pointer to variable for storing the height in pixels, may be NULL * - * This may differ from SDL_GetWindowSize if we're rendering to a high-DPI + * This may differ from SDL_GetWindowSize() if we're rendering to a high-DPI * drawable, i.e. the window was created with SDL_WINDOW_ALLOW_HIGHDPI on a * platform with high-DPI support (Apple calls this "Retina"), and not disabled * by the SDL_HINT_VIDEO_HIGHDPI_DISABLED hint. diff --git a/lib/SDL2/include/begin_code.h b/lib/SDL2/include/begin_code.h index f37ee3696e..04e78c64d4 100644 --- a/lib/SDL2/include/begin_code.h +++ b/lib/SDL2/include/begin_code.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -41,6 +41,14 @@ # endif #endif +#ifndef SDL_UNUSED +# ifdef __GNUC__ +# define SDL_UNUSED __attribute__((unused)) +# else +# define SDL_UNUSED +# endif +#endif + /* Some compilers use a special export keyword */ #ifndef DECLSPEC # if defined(__WIN32__) || defined(__WINRT__) @@ -56,8 +64,6 @@ # else # if defined(__GNUC__) && __GNUC__ >= 4 # define DECLSPEC __attribute__ ((visibility("default"))) -# elif defined(__GNUC__) && __GNUC__ >= 2 -# define DECLSPEC __declspec(dllexport) # else # define DECLSPEC # endif diff --git a/lib/SDL2/include/close_code.h b/lib/SDL2/include/close_code.h index 9826f14786..d908b00eb6 100644 --- a/lib/SDL2/include/close_code.h +++ b/lib/SDL2/include/close_code.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2014 Sam Lantinga + Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/SDL2/lib/x64/SDL2.lib b/lib/SDL2/lib/x64/SDL2.lib index 6faf131fb97eed99ed0d78923112618dee1f2fb5..fd67b32fd6769f519de04ee5db7f81c400a64697 100644 GIT binary patch literal 117610 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 literal 113700 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 diff --git a/lib/SDL2/lib/x64/SDL2main.lib b/lib/SDL2/lib/x64/SDL2main.lib index 699f8f6d80e4daad791121146d4234eda4fabc9d..a001767a42b98e7cf99b94d9ad4220446343eab8 100644 GIT binary patch delta 12498 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�!eC(MqH5EE1TJNp=n{ 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�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 diff --git a/lib/SDL2/lib/x64/SDL2test.lib b/lib/SDL2/lib/x64/SDL2test.lib index e4d409b4cc2bd9ba2c3f23678d08f04028f5b94d..ef4eaad8cf90eb92197bb50e3c12a810cdffcd13 100644 GIT binary patch delta 170828 zcmeFa2VfM{`Zhjiwr>Jtf%K39p-V{UAdn5IkO~AuL19UONFbdinniOJ3ql;>C?F8A zV1*bph)S_w0V%eN4Z*93iVBK)y%zq@duDbwVS+#Pf4_VEeIEmx=gfP`oH;XdX6AX$ zduH>K1D72curky(XmG;NAp?dF8l(h_4XzzNbZC4uEi>$r#5POPnvvcg3tBCCe;bVw zYvU((uamsL*FKhH?Pr)jQu6-3?;#o5{?(o@!fQ9JD3<=GpLxr>(x3a){@INGrhK)3 zy5{GvfMwO|((nD%{@#TDu5{K*OC|Apzg)7uUtUXpTK#M}k4oqL9k5Eaf9tRI-(BDz zEU)(8x;KAtlFBX!5$fAF=^@BB60VovevmztfF zm6ws6>r5P+I6QH9RZ&qPLb1tdRjQ%5q_n!IQZp%R`XVLV^`LUrHGp4pn`Lm*xK33} zIotVSYg+o)%&he6Y|hqNdKt$K8C0Xh1!lyLapsLnNlC^QoEfglc|}zywq#y;O?Ben z>axVal||*1fMQokX-#EORpP*=(!d+#_)O=RoUvol@=`OLljgZ*mKLe0U8SXE1+HqW z6}Sp!1B%N~Gh}Z1B6tXkPj=?zWhdpNj7fH;p+MRZ+J-OJ%$nk2+82?nXrZ!h;Y-Sq z&{6!KcUrnB*6VsTZ3y$T)FviQPj*g^PaWe-OHEA~myws}OfH*S?y4-QDw~%$xU4vF zaCynXqEhV1f|Bal>IN3LoRXF?ZH#kF=Gfe{?3_GjT1jOUcD1mmx~QOl`x>`%h+gR`;?^QjJ(ubCpCRhq0(W}-}o2({3DwVPx^uJFH-y?`Q8-&X#Plw ze^k>YQ)V;e!%L%-CH-PLX67VkAZL=Zs-~a-XG>9G(~5oznG$+=p*1BlXcB85(lSFPR+?r97re8yh1vx zg+=pAs9kX)6;&&@mge?Pa^_{HrKP6i=A0)>wX1SgQ8kXF$kX(}h)hdeT<8kdxw zmgY7LGm6ew>$Rha$PMO4(U{b<^6BbJ?u1&aBMzl#J}Wb8@DXm6p1& z%igS&MFnM*g}zPVEXW*}l$Vz=ru8Ou8O5pD6j^lxYpP3pTUJ($xyC-mnL93LTvAqU zk`gl}L|HN>q^V=_(=2RkW=3*WO5Ql?D`L~Kvd2uy&(F<4Fh|*ua!J^@oTPD?8CjWH zbe1og?@jRUqr|6L(z4JWBxR-Krg;jP;7ir&oXvKQ!=^HFQj)derVQ|Yx-zBT^FD6u-<+Kao$h zD)nPSm80XV%C1bSl9L(4Y)V09H%mJa+fIoY*F`xs&TP@jK^^`A0jQZnuzMQ!|3>p8f&WE2|Ynk5v4|P11RZTm~uay5&eU1`Y^=jN7 zyv@H~b&c_l-{yBGO>VkxVK2)czNITSk6DI;{0HymzQ=(7Q@yBoV2Svxu2lKy+QH$! z(SbI_TxauZ-FYg#Z~eSg-x<_2V8w9RXX54SEkU6J6NU~QsCB4?*PA7&`?ASh7fDhV z-msPhn+@n=jZE29-_=n!Op+{2l5QRj8{-CZ6Pl$uc$-7htxAi7_6N_4;UiT$GcrIi)%ik}SqSpjeO$>22SCr9_YtW>F3 z9nC2JU_Qg&=8wqT2jsI6W0OZr!$a_uxQSIwt1K!la#a;gE16eNT2olW$3JO_ZeQt| zS6DVTu0Sd;oQb-i$bsB>oz1Fz`${yshSz^#2~jS3HQFCL5iB_z)S%_clvgvETe;`e zg6_1Vcj7lv3J^Prpjf8iFE#2V_$^gSdB$v0BKC!QN^&BmTuI)SZlbhqWyQX3Q@bLR zft8DZV}Ur5(l}rWFcV0nWdUicGx6&qb!fHKP}pdzo$*@`fIsR|T{5?b2aL9b2S>xu z5xWr&?1b|xmrc*7$VWc61oxucD`BM5j7|_*uE*A>#2bKA>N22W+aJr>XO>QibAMOQ z?nEQ9T$#6@8fN?ci5;klW#N((DOns31V}vQJ8P&Z1}pdSrN0^?&0P?@KY%YCX%97t z@G6%vlHI?`Z45I}p8I)22n#nwQBXO$CPEGIV|SS%wD{=trf`w<5q@yJDNGA4l~Di{ z$obX{rbx#5q5B!Zsr#8H;;6x!=1{F6jBnh`j7Z^#@TPDyXa#biBqvEdmfA8^clk zQz$1yY%rn3KhV@w1UJgYZdCuIL_6ikyPtIhtlWTRtK*I<{lh#B6ysDID9LFLGKq@u zV{gmBTF`N;)f0?wFolZ}le`I!&hbYD_{z>UPokKm2C|GV6%i~D5p=56arX*qG$I;S zSg9T}9%Lb+W!9i&jBX~K?SP%mDU;O1$5vP)M0=>w0cv!%YthUitvzBQSx{Ifl&q$Z zm?+@VqAE3BN!aK)PUC~baXN$y>XB1eLr`!4vaZ9n86A}gMXo}v++#sDPsXKDo*aB* zy_H)3*gSuNmBFIK)555*yG2y6Et1u(4zbbRFO6oRS?Ua3aCqwP#>(p57CK@TkBFGl zw^4Zt+eFFA)u>}?luNOa(RH6VP)qMK;gsTs{$`-VcKUCI?tq3z8LjPpl%aUO^aGi| zb-R@|u=08X!R`uwREHm}@TW#+m7?BT!$j>8x-lyA;1)(H$FCCk+&74Pjg|gX*y-mj zy#bC7<(`0;D*tYPgk^>v*pUbut*or_j|DU=Gtk=U4`o`5e$hg?x2j2;)#4mD6(P1- z(OvAh`$lnoY*piCbP;jKy3?NAwi$b+L~o|bCG|kxQm44YO2aXkHj)%+!}j^En?xg& zH?dw=JNA%hC-yM9BvjyGvF3c(BpTr*OEjIZY`mSyY**PIHQ)?{Wzl* ztythMV2zbFl<)*2V6RxHnPXnDVBeJThmc;We~9YX_z;!nT5F|DNipJDbUrDL#7EZzv%8NCfR9|75gky)e6meXp)_ZEpMcj z;9J*=9atG_6Fr4%vYpzeehcl@v8O~EG`=SCH!ks~20ir}PU3mowVibW+;Ys^O@1PP zHy$&GD9g4+vNhb*WC~v^SbndtXms?iy^sy;Y7s={a zg*7GVU=aWM8D?VZcv2h-Wb2e&je&z7L)3I4%}R@=SL0>X>L`W9^U|z0L?A^ak2z!s z<)c0}2k;rsGGj1xxwy2Gs;evW1z&=jx7E?0Y2| zt}A_g-k4ju)UA5&{4IJKQj;d!~ES z5BoDG*QPvwWNJ@Inj|9L+%==5^OR$S?=MJa@2x6;eUY$lTlLUC9j5YzQ$OF4e_+AB z9+I?9*n{&P{5Wmddy9L|kUxAsDn1>LzrtRZ{^Z+{@fXjGU!8l^%Fj+WNz!p)zxde8 zuJ^VK`e$Z*sr=cZ!}m&3Z6}#(TKLT)*_E$3PxQHR(Zzm)Yi^UIA;Ml+nE7n;b6?NT z9k^q4BVW~3lJbQ;qORlO(7Td{hNT`j&MtZr?O!YG!$P8Oy6=k8e@$mG-;Mhu5Y2gy zuqSVM)E*v{IRD6}+mEifX!+}s^pdd8P`-V_F`y%!{Q}sez2CfVO6>GY@b{*pxAafE z3y-(L-sA2ld0O!uFY$qgpX$=>UObVy4BQ!M43akkxglu4*CO5F!5`(-#Xj@nxJSmX zb53|-D;`MkQV_uIGwvG5?z;F8o=&#qL|*<1P9-CsvDOe&TPxx_4lQ>-RW#_%+3|;W z`uAUgN83%p9=>egS0~)X?UK6A3(WM3UnEH{3wwt1(`T2y6E-sRpNWg#3%esul1>Y| zG2*k!_`7dby9>8nxALWbxg;snMB8`0y4h5g%I0)BUjEFqJ@xnCVMo}nto__^X4plS z)>|LkHu!{YD-Sl?YjcEY%8T8ux{i(gY3RcnZ<_zZr#R!Qg#GK;;o+g_hcmv~KdJKI zS6#M12^aRWCuiK-ZCTFpfh&KxW}DxFhb3vJuz&QW?YMbv?(TtWYmI#i-_6ApBJ9_E zlzi>bpT^ysJ?89|FE%9?N|K+2s`6{?E#KYuMA54~k4$}V?!4NQ$&xfsMC>g2I(+oc zr=EPtF#4zLE*tQAGDX-|KJA$D#cb)SxQRst%=G9tlJqxW-~8g~XDZ&i;i99T&L4X= z@W*;d+9K@VzQ66uX+=xeiL29A)x}LkId2Mkzqq+ISx}m@#PP z(;|Lhzn2C*-R_D^Yt!BSCz)v}j=Zps-d}y}3;F(DHx8&P?)}J~19-dgqwSdv4naq?DN$Mx;|5{o(>%|3^4qra|y?|`k%P@o$ni?*PVVQJ?$q+vitL`tFepY{rUb+%|Y^Ne`WplpaCD?^(=th?ml$# z%T1>?zjxVi!w=ofMR-?lM|NBMcXGccsx!tux!BZY&7Ikj)Vm$u7;X#-s}k{7^)R

      F?fCIC=I*?B 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 vewnt^kRR9~FtrNu_;x;xn zFP|5A#c3niLm5!@RQ$@1AlC{;mh@|wowOySj{b+5p3ip+d{R;oew`Cd$Kl1u#Cvw?QT@&*#|JO9LeO9a#M`J z(p{Vy=#tzdJrpSq=|c?TDs7!ec}O7`Ny9nLB2pgGVF&HFgGP%fJ;8C)M9M>Q!Jwql z+(gPlnuSzx2M(NzB&9s0<055}esIvDFhX_YxK1MFA-(6IEpyPkFn-{^4l?2^QXW#S zgEq!N`vECWjyv_VNP6(Wrx7Q@3#=eT&a^-Z;}R6M5h)KT6{#kimf^wXE>eoIs==f( zCCDcWGU@Y%L|W3{N~hhd$Yi#xOffg@xNr8pDfg3S?(YV~H-{Sttag#&|G&`_CR^FA zGG(A2-Mgu$j9Grcv`=_Kx5u14v2ssXWF^+ig> z4Ma*+lZ%v!qaTZ?d8hv%sha6mOoUS_2)EZ9;UJ}`6H{2AMtnb_PC5)}b%lO4g$~1S z4yu3eXv4X#{wPguzacC`Txn%`DyO4C=pt%E{-jX#Y`xH zE&m87hu*B>BgMx(NidVynU9ok&)!se2(<2;o;B`i3}Q{!C~cZM(K$jdWdWzeI2_nFRDX0`=#o?el&8yMSowdH z59IMI_OQ}Xeu14YmBS+@z-Rnb$+7Gg9oJp1(38(ie_srLT$VN?#KhU+HV2y3*G~zS0*isSA#B2rcv_=QFQ&<>~)VJea^D8tHuC zD=p?F7veHW?kAR#GSJf{%Z`dlINF#V8Brf8+v$G^5o>%>iD2#DlU)O%a7dH14_{nH zT~35+Ed4z>JlrA|W@CtG{Ka74kKy>$}Go3k?~mGB-!i2|ntu~D)=txo`j)KfRd z2^|5eSn?yB>;z>xiwM&N$sVlg2gU3||JA18fel_Gtmb^S`L4SwyEV(`-~TfK!GshL zJe8+jE)3H{c?$H8kt_Oi*ZDAJwPRPMJ(FI z-N%m}zd48h=p`!FvSO`KGSRqjUdyE0hUz9`QYo9w@%{1@d7`F{Wp CSA}Z; delta 177293 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

      eL!yvY9ssTj%Xu|=&v-#yjBs-XeCz%2UBrU zSmX1D4;nFk@VLRl$4tu0A2ew2aJ>p*9l4nAnr-gphJ$~lnMb>^`WAer8y6G&wVT^q zut|3!66?D!CL&3RI9|Fq+EBBN#bw>C&wD_%%(^6+nJ6WN@dQE)=)REhx;(wU!OU5?wg18!&dr zkiny@vY`g^bPu-?!F)t$Sz>By4AG4qGkEyGd{Cm43xn1y?GepLkV^TfIishWg~yAy zw7{*_wX>&NFC>O(J;{7i&sS$03FzKni z(L^>>a|)Z>B371~8%@-DS!k;DakDv2rZW)2!W893n3 zyTQXp3>!R*u~t&rN0RS=+#(~#=8xg^l_v`RG%!Ks5MjxFR6 zTI(sKGP$g_Ir0Mwi|w!xV@D4jHeyWvh~cbyz=yf-B)3tBz*t@#t<$((Jd{f7@p*#> z7wDbw(X}VL4b-;t{AlfFa|}0DiEqpNXhXe;HF6vY(pr3EzCW32|B*@UPjwbm=LOLwQbv-r9+H6lw*?y{Nui5F4j6=J=9OLCngD<>nxp}4)dvK769v{e$dzt?JsIs9H?eaT6ur){YeKFzKe z3CZ7WCEBz}k-D1j`r+hih{;)zy0_-RvIVrt9Sq-~N6qDKFWNm1wWI8M%(_Ct{KHUHv3mhltDDlJzIX zvL!37Fgu5bYU`C1&H6|n!|XeqXRJTd%vsx$>g&#}C8qO7_A<|ZCdrN^#JFf%FvDb? z!BAgZJF5h`cD=V%OD<4uyFeYSfqzo%?yMiL)t%QT)X|X(;`w(r^3&sQ*Al-YA7bnx z_4)^5cx`dCLEQJ2?!h`d_FBcai=$a_|FWekK^3O|Ah%iEe)p7!-f>sXP0sMt(?so+ zcvg>KT~B<)Ah%^mqFZuav~j$eY`#ygnAv?-uwIgMGh(nF1MTj9FoD4g!@RJHiX&19 zc72?fUfnZw!m(gVEwgKgTPM=JyEdj|Zs~0abv^&54yL>O!OR=%HjQUQ_my$KB&D^c zK89lf=kFBiRn{ayFx@r^Y)vK5G;y;+&JU6qt z3|wq5;mjUpeZE_#8Wz1+CuYN0eW5qH`N5>+Q*?3p+ai~)_y==+zS}&W<1M!*XpVQ^ zo{+9xj}%GP62^~St9a!D4Y_i;Bi)9!=r#rGnt8o!OWyg>fVMYRb__I;syYABfYzwp zy@JvLuARJDTdDcaC)M-A&LwQUb-9B^d4cY{mp~`?wt;4C4M>bT_b0ZNFtWC^kf5*J z%C@y7=I>FiI7VWy#I8@wxJsCVn}rmo&;ik5puR5o{@`*~P{^!NVI98fmW9 zKb4#j@3z)<{#7 zqa&7>&0i)q6X()d5wYGe-llxKt46!o$tT*Z{y|McZvUV}vF-yVk zRP-c!3NaqJCZxrlFG#ip^A}qr$=eyWoU#V;X%;T=A-)~6 z#LPRxhURbHL-xQKZbLoDp}IU&oXVrrn6aaV>p)eO6E?8Y!J`M}77o?{ut+nlbaY|v zz)E3zD;$*D=l{!B)Ct1&f zM~=-csElKZl}_=4EVhDTUog!Irul+7RxrmGEUL3(I6b;fyJZShv=YJ&0XvnxzX_yVK*%q|`CB5aeMdBhu05EgU~= z&cbQrDmkqd<5&?6Lq`&T$r>816`^0M;!ITM8D{b%w_~8SSu@G4 zQ%^cF`jm+!3x}5uD>`pV3FGwSv=L_eB)5LU5tS(!u&Au8bgoT_oJBg!q)g`F!9w5H zz1$5eU9_-dSZNvGDy}sBugW@vbE;W4*{#ds&#jZ)HeH7j;k>fxvUG6Hl;Rn4&o0&E z4Dr$-9~aD@J8w~0Wr++iwTs-=fosgkMQ(ciYj~8CQjULWFkeED~9z33&20z)0o^L5HJZ}zsMrNu?FOD3J*OOMB$WLus1I8nfvG^2FNqO)mDl4b0nQI0Mynp<2t)qado zzU3n6h<_fkj#)U>tzWOZmz|M|W_Z_B?x61Gj;U_99xXg2#XhC9Xu(u_(WS1RSR-C# zbiX9IcHJ@YD^m5FlW*&G;5u)6xrg6SkKRj-JD{&j2B*h}vx2$NIy~M|T&r;GR^9)i3B?}gmF3^(kZ+cq|!)DFd zZatX~TXRXY_GwbjWNt|O3@s?4Dbl3Y^@?R^K`~#t=8hOLyJ*^pOI|{dNlXcWQkHO({A2uittGdtww99iQ@!AF7fqc}I(lA7vEKH_ zOLd$2-b8t-kll=bzH-;B6(?PEzYt{r_ZZdT{^9 zjU)5#xM2J8Hsclyt9Z_F9^i%1iMFQ87wIUEj%^>c@Qs)gAzS{0{YxG@Rpis0VrR z$!Ac@KVEr$v(UBGF35W9wcA@1v+Twm0Db%x_0j4fzD2$AGpKgQ`SCl{Z&Lf?cc|}F zd3=X@dF6Ldzf;BWThwc^GV!<*qgi9pQ{~6+P@kgmhwA>gWmBIQXH|X%^h1R-dQx<9DlHt@7g!kA70+C)ln2sVa`&tsZ5udurhL-RfObe*A9r@hU%l zxB7)DKf!MGJH6fN->SihKZ#mTmVx{~v0L5s-#Y*A+^n9mw$Dqw&6#fps(D{P{lDq! zs3vu6FhTA-1pK3>SyotmisNiOy3&1!XCDln}m?SN{TAquK-p3O3?Vu+=I{ zr}JK=tOd+!XTdI2*?GQfC+rfHz2VD}=}wm+BmTNj>-h{=ObxGs*+?FT$zC0b-?!^b zmndtj!%lyg^()=vc`AFtleiYYxk$mvT5b#sGW2m*6v4`wX0q|&bn78{+Vhx5TP|p;QU%^*w|sUtSPO{aFum}S-&%2r^=<}!^*yJ2h8UEAS_S4{N`)> z^9VRtWy4@Ln2TToRJO{OJqhctvR8cBpRj%^b8E%@_N_(y((Httd|!AzOcu9>ofW?9 zF<4iXz2M7!g>_O{V(oZ{U=fo zpc$Y1S7dFn9xPuEwcQ^t%ysVPzm+}cG1ocZ%f9tx*|eqBu9e4JXOb@~_GLHtvRi!F zTbAVz@m^m@$d2rqi~pX6*iHDBaStqt@y4juue&CR=mJ6F&SpgOmbUrwtYpCJ5WDj z@GMeWPQvWj_Esj1pp`-700jT{F3e`ZGReZrDvN({Ve4<9=&r!lp`qxqU>`k=e{|l` zL#Z^BdB+?rldO`8>`ZWFPV%ySnHTR!sR(e3$)PcsrtfX;XMs%91+Nw1uJjD$Gx{RODnqEm1|!_`WV&49%*9rA6Lw6sW`owt4UqmXJa-y@E6G3x_5)SD$I2&xyQY?i!IE7lQ}lW5g*$X zlFKqZmg2KikC}m++`g&eZ)MI@j`lgjChGD{ZoTRvEx2^Tyh@Q87F>GW3X)hUZDI|t zTN9V!FK^l6c}`hPYm{=Y+a~a^>2t5!(AK4#>AeSK7o@D-MUAi~v+s4&%O#v)EAu&C zNNNf#SQs@Y=X4_9dX*10$=#;Hl~-#$&RaPu^B4mSOf%C-4=s|Kt zCC};Q@y5=|!fwX|SFmz#UU5Noff|^s``p@;bdUSo9_33Vk6!4@77ub3)u?pkacv8% zw^d#;^KBvGY0%1?ytwJg!a=93tY&YixNOuQzDTNztH z(5Ji*md1v2u;N!-eZ;g{zYu;=bzXXxZL1Jx%EfYEO_fY6b{5r*J6GmVtU(&tiw9uz z!l3Nw@^zHBmK-m3Qi2uNo8--I$5Ab+PpBT7|Vykn6|Y0l;fOg|Vr zxCNfab(y}X{omT{<*j@%Z`sbt1$sR$+3aTPC6eo}(VDHB-DVlKN@$h~E^YW?Wp>Tc z&2H{VqF%Omj8ir!p44TFCpcw2{!ybZl_HB-3Qzj;5sMoRQK&u9P1T48wQuYCkefr`^l9BfR86z#A$L$Y<*Qv|<*{4Rcb@)lX}B*Tgs>b~ zpuI+ zXN-xw0NeO%fX`<8>|&p7@Y(A=`x90^UGpR-lG(gxz^19J3C!mGRM=FNjq&Yf!eopZ zcINqZ7sDp2>{^(NWy8)*FdOnN*jXxj2WCV5N}iujS78&X^J&W3!X_%~2D6@L!X~I} z9?W{a#@B9wjaBUyU%S=Uz6Kkm+C9EjChjF<;y(nH3K4dG@YO-?0UNPAq|3&ou+tc3 zBW?-HS6MILZU`(-Wd*+7cwbur8?0J+z_+2?4jW)^lMkRa?_a@e-VeiU669Pr_7IVT zZZPY4BFt(_VY1sP%m=9A+6#Q`l`ytkp*6ntW?#EGiRVYTLBh_XzFNNFXoLO`)?Kxq z`r5-V_Qc`iKfYb9WIl_fvJ99_U`Lqj_X|7SVK%%%SbLR?i`$hu=Rn)2aJg@I4Xm}w zZj2i`xBJ>HFuBvi&Q@Rh6|9-ceuT+w8+MWz1y5FXJxq?02|G{v>~m%0pNDiep2D`U zEH&&5vpKmO)>vihU=5V*gw!*;6C z{?%66n%Rw7$}WY~RCWbSTDh?E8mxx0cVIS>Phd8Z!?5bA{TXH>X~YP=HSI;%83l7y zI|&w1b{8 z!9uES39~*ff;lR?8uque|6%71s5~r$ov&cl^G~opRQ3nVdd{Rz`c-A^VfGpq!+uej z9QTfi2nww?b*)0itZC)1W zVLC;4h&XBnN8Gbg7jdWZlZo;j;5DX?>(;OR3XSmD++O@7EP41DZuUpq2C1pkT7F_L z7Ib2gO=hiQ z-NB2&Q^8BXG2n8La~7Qy;3Du+@O@+_z<`XlpAL?_!f8t_#bc$NM(1f3{v5w zwYVCAw2s$;qd@~o2XH+oBaa)wE5TdAJHd6})8Kk=FL)bx1iT$|xo&rW&A<&{Kk!a) zEO-|<7u*Pv3Fq!011{4(mcmuc%yc=ZJKlV6CrHZ`?J_UXaK3fhs3V9Cv1AGCL&pGmPAl3|g2^<2x z43>eff|r6Eg&C81cZNf;_rYD@L6F49nsFK50n5O5!L{IC@DcDm@LlkI@Mp061BgQf z{Sa&l?gKl5`@tUIr(hxY88{aF94rOD0IveS1n&aB2Ic$9hrnLk1mA+=!SBKIz$4&| z;89Q};eQ05O`^g31@a|=-$3~+@?YQ|;NM^)Zi!&XiFE}-;Avn2I0@vXNlb2;D0mTA z4V1Uu)j>H|y#}}*OaY$&IY=`0K9~j`1Z#r7CYRICKz>J150tmx>0mxs9~=ob07rw3 zz|+CT;F(}1SOR8&)4*n6DVPn;2U~#Wfvv$6Ag5f$?gcx6d%&*X@8ytgkOti1-NEi) z53nED3zS>GFDS=)odn(ia;$0WPOv}t95@J+?;8&W2ZEgQ8=DU1fu-On;7X8VP-EM{ zVc=eHI9MK`k1T|=2Sm91p$?P6U4kIZrhfpcOh3l-B4hur)Xd z>;_H-$ALv)F<1gF0jGi2gVRIY|BpZzqQ|}m=YYR}b3tjuxTRvX!1-VoZ~-_FECVNl zi@@pNIp9o?7i6*7;CbLV;Dz8#;1ck5a4C2Y{1=!=b664L{%;Gp7(o|sIXE0#0ak$A z%dwll%RqUbu?m!S^a}8Aa1EGEC&>G_SZDBRum@tY4?91xY zT3Wlt9&??+zAWFDE%asQ3giAG654UkGcC3k2`!o@d&`$$tY>@)%5MeH+xc+IxQm@n z`3pH2O+pL;pK%g9i5;y4O%pZN`Ha7iGq7~g?5T5GmSvW1eJdfF7~UFs*xeT>=brG! z2wAXA1RmB`D0Ym{-q#L-ZB*?kFsm)}wP(RLsCKHam0r+}K3;^$!*keq-Pg)w{^o!V z{=V@IWoUP+8vf-QhH=|qWZZp|YGr(GlQ7cP%CqM6sx9%gGCF%!WnyhZxg2K4Wmm&m z*fNww`3pPm^51IdV;pluDmxZjHvZRi8=F0;Zo_I^qWByBtIQv%Zdv(0yrg6N zDu41DN_$RY=bQqz1q;C8;4pAHI2@b@jsVwyh2X6qa|C*_^eAu}?$O|zApLpl18^Mp zCCITOv9H02U{DJ4bVzd&!D-U5Jn&3V9&FD7W%^+_JcKI(vP)zH&2ILx>Ks1m!1ETWc+oTDw+d`W9!3W8RBIXPBdp zxEG$)6rH_RQjulM6V}&>_F|muYYSl8RXYl1wWs;oIk3l6yU^F_h3s3CS60SMuIct? zdF#5G>>k)>cGYxGohUh`PI@^O=IYydE0YUkWe|ONE+{{d+RRxdnR`@af#iUbOy+Xk zXw!20o#;con6uQ$_@x(SX9iOj)=60|kA1$Y;wr{O>Z(=~-BJScT@~A@bmDTtsWs2- z6K5$Et&lGhc}m3&FEC#5rKMCzeO9wTc_z+JaUST-Ajo>nteH|#-3v01?9@uBkd{nz zf#kH>DHR=Y9Z2-dgQ;EXoO_Zeg{4$5E>lxB9^#TIUaPBv>pS1o1sB!JIZ*yI#jh4A zqmgy-Eym*d*mo_!HAd{$c;>RdFJ*a!R}AW^Uk%z&I()y+Iw+?)5jrV0O=W=gR8l3ehDrHD9(YuJki8)6UW+Ug{4%y z?8!svIrT_{7tF+Qox7w|Fp|+gC$<_p5hwk>bAS#=W%(1wj!UWN?YYJhSV~24$Yeg| zHr?9nG56L`d3(aL_d;J-Hh*C!m;bi5)1G+R(_mSu6x z2CBWq*WPWl@@&qy-bq*WlfIgvx)-sOSsm3fn)V|8%Gdq`tEt*Qd~G7xwOOhSOHnQ3 zPS3BDy45mPbjqcXWnGi6X58ng8MrwS)lTrW#lDu&lar|0bA2r%AkQyD7$>CKYklo{ zUn|Ry9o0U_6N_VdpJh`-!jp7WTVpkNR4vHa1VysBgchwkFJ8#6~cy z$ zU%O4T;Se0=^A5Qz|LR+NPiX^33dZ#f!)D5 zU{7#4*bBTA>;v8o(w@i4H$YB;JPn=`%49?$jOSr~ zQh(w$*L-4E|tQzIZVra5mp`QBfwAx0tbY zT|SpYz%pKz2{-x8rU)c+^FVnNnGee3+yZbC$b(g^7(54*QQl(k3h)9@Cgm;!r3kr} zUJ(j&9no3Ybsp0qEZ60rNc1NLwhS$kGL-QUYp1Bi?x@60{v*}w(xR!E%@_9J&vh0| zVa>>(?DV`#$7HAKa-?zNS&t;Qu4fwOeGf^fa%wmii~ z)OF_dr#R7So%!Y|PPDQn-urEDsfE1!&XGVp|0^VKFNAk#9$BD(ZdLX=bMn(}M!7Y~ znHSd|OgQkdd~fPEu0TBHDO+>WoA1E4lo+4Znn1EhwsSD*IV51B6FC<{-_1)oioa$1 zLY}WPs`?U#{A6W`aJ=ctlDN0#T={r(ldF0Zhy3s-6n|sl$>b|!TsLWD1xB$7EP%U@zrFs~Q`Gh>I_B(h$d*l#pf?r=NTTZhp~T}hO) zq_3=EuqABX+u=57DayQ+$6kelcOPg>5IiWbo+00c)L^GOIQ1o_3as=jE1kE~JuNsX z(Y(5o?Z|8R@VeVjud5eb%IdSFlK4?-T)LnlZ&|+=scHjM?O)e|X9#B9wf}Y-jL%~s zgEU-umtM_-1W0ZLowC*vwa{gYlbwqiRJy7;7s)lAE>`^X8jC|NIKEYG);;4+(kNQw zRmpnSH~rN<2hNvDbSrm)&FL_EgHh<~2uETQOnFMKaXnd5v(Aip)@@cUQZ+pwlhW4j zWGy9$FY8t$3p8kz)l?kvBPyZC*dKVG%BFFZmldBV zvdwsu$ON6T9Punv6G~cS)_@!dG>`F*Jf$3Cb5PqE-^+nn@%YNxYZzXF=LI`eNiprP z{)kMd8XoB4`|P9%HUD|mZB(wo@4(s`{fxOSx;ZDx&5IaHZUmjO!IDy;>X+Q?f|DD8 zW%~l;B~7kt6`O-KAD7BdDKojx(>!f7`=4`1C#PBsZ?B$r>-3WQx$0$;NF;8JtZbNs zAv7NMVK{LgcFcdC=h(O#pLZJ#J8%uL+3b{`C_BG;K?*u$EbLj8Ei@jaQ~`n%Shg?K zJpQzsU9%!PEYhnL)PrgClAE6K&(t!Zz~WO@?3m#%xoyee`7gPR`l?l7vJ6VS0$&c3 zq-`d*FW5SF?un9`YTkUw?Nv7upPD=gJ5}OX&An(cUv}${trA50yw%&YTM=a5%7?XI zdMulGj^2^C`XrF0iVv$cE+s7OU!G$4hSkhQR`fL}#Q82`O0LTFeQt6Z$?A&e@NF}~Kd zIbnIV;`~cxI*kAe$=eZmZwTuNv!O6q?L5z4*xBjJK848?PuTe#c99K*w&W6d8V@@s zL9Kc!%&O0YF^WNZAxsL9MM5x{Kn^?dHq0&yNMg`u{kDUZsrD}zBO~mZ(5ze59mePh z+37I3dD(=J$oSg^GZWz)70!cM*%H`Hm0b_BxswIT(^Yl=HceRqJ&M&fhn1)-A0}N` z*qHz;RyG4xq)b+%Ocqw|+y}LuUxS^c>I1$kk{l1PJxn@fW;@hqFwU7Ah zb>Hqg->yEx%rkfsN`M`d3Ofa61Dpx7IgxeLGPx3V-uAVJU^1`>J4az-mHh`cN}0UY z`dn*(ywI|&2xdbrg$+}?^IV?4EM4XcWu=LgT?3OxJQgXy?3$COU_({*BFskjE6n<+ z$6UU=&<{JUU`+i|G26jLDC-0puB;nuiL&xuP$rKt><1gEEC*JoOqR1q6%9Fgu+xbyfW>iv%u2Xa7v8w{f0 z`{pnY2Ei3UU1?B*njtF<v!kAyRkO=KjJotT@3+NhZ*#Y%$!X`-FlV)MQ_V%~+?qME6hTH7!{|=< zmS$NIhi!;V+TQWRJR(q{r{Tyu0ckSJ$l8d&)Y7>n9GzJ$?R9f)y4y8%2N~m63!^-6 z6!~%+4%$w|tcf3f@`=j{pd6DhB5>}Evgrdk7-K={Y|cGMOOq#~N=@$UGQv(vD-@~e zo#8e~ZA;DLC*e;9ZTPkGp^sE*rmH5mp_^_tXSm_Oo92-W_vBPpE{pZM*tbZ?g|;-A z_1!)RMbxfm%%u8mmqs$c+i&e9!)q{-mw+Pz#j|J3Gi@8V8P&Q`0Q^L~&J;Fqo2IU| z5=q=fG+yG0p}$pXHmgPwmzo1@$TjCDCB4nO-@t8|Dx+Y263PxxL&;42s8af(N(rGM zN7cZs?_J`%S#8PtNGp{P_Tn66#FlRipViRqPg+lA${?)Y37p#ZsXd$Fny^q5b4`(nY58< zq_N!D{N%Dr_xy&|u{rj{5{*>)=~1SrvD>(OoxK$5LGGV@sIJ6ywI}~Q?8M}r`U~s_ z{tZf{2qxG!PE6CqcHpKziMdjwWXdGQY?Mw(q5hM?5^#-KEJtO1QlpPC771Dk?Ur<;R0U<;6! z{7y@dSLRMD@G_Z5VgfP7n_;IdD9cY+cpc+Su){i`m{fh{YGN`^-xYil><)ej_5fvq zwl^4}wEBW_Bb)>_0Z#^7f;nI=mnD2q}jf?@D9uo-wJSl$XU z3DO>9UNk26UNM*pP6cH-O9?2eP|pUZfzv=~q-KD!n`0Ju3COHfOzu?XQezvydEjPn zKKL!j8k^V;;5ne&w~G^4(vZgOcOC+{UC#$Qffs-|;Dz8Ya0xg9ya<$ys{aCuzzT3W zcnNq7xB|QZybP3^eHAD>pjLydpK&e+cY{}g?|^HWCyvSee+`14z-vLd^9@)Vybf#% zGV2?Yov$~5vcBdi?cnWw6C~X6mAvObC50-(qfh$1f?PAx0cYqtf4d7kio#hbO zinS4xg*SJD(uQmTWdY8;;1}S1piE=j56Zfm2f)VQW-t@n0(Jo(1$%!1ec^2FcJ_iP9PhJ2M!I!}5AQddu1bh|D z244qd1?(GO4!9c}4DJC(gKvS-F6{;9fbWBwWFYeamSNK#Sx;|DPME73kC&=!30h%xd!V!hQGE+5%+;ONGA4;S20LM{a|iM3h$iZ6L?~k$ z*Legc1C^-mgBRvH&m)sTNz{4SW3KZqOolO0N8YRpbM;9`1~gIU5Hew|BO4H8XcKj0 zIiE0B7uCwpCR(m*bA`G(R6A1*o6znFbDefD89y

      oM2i8x=bCit5U48HKsdaAYzH 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 brf}E diff --git a/lib/SDL2/lib/x64_2015/SDL2.lib b/lib/SDL2/lib/x64_2015/SDL2.lib deleted file mode 100644 index 696c34e7eb997017e29513e4d5b72a65560827b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113700 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 EKc)!NfdBvi diff --git a/lib/SDL2/lib/x64_2015/SDL2main.lib b/lib/SDL2/lib/x64_2015/SDL2main.lib deleted file mode 100644 index 55906544f33eb00e5685fcc1cdb0322852795484..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47376 zcmeHwd0<^dz5m=KT}Zd2KxvUBEdg0<$<`%hNp5a#a?{=So;eF}=WYZVYw5Lr}kd2Yy4pZaWFfZy{czt3m3bLO0zP{2Qbr@fhT zzT13f<~uXrnKNf*`Pl;#gS*ZxKeNicY8x7AYin1pUR~qD&0~GTT8-FRE`-3Z^sR^U zYii2InzJ>lRtG_4-Vjf_p~14Coe>Va)z6NRDCoeozgnA*BKHnb$0 z+Xe~)!%eH>6BA<-4o#}LBi0)4?r807?u})d8ta-GJGy$}>8@x}(`CEI3qxb0`AlJK zVqj;kxv3VqXNSiI2Zpox!uFxD?D)jcXkkZoOwlzrH#RqlzM;|1fuT_`6Q$UpIK>Dl zUwOIIueRk9LBYJWR2Ghi6#4i6%iD+K`AfM~cv?jBA zhDNuK?a60Z%B#kNK3FBqh#sz_}O#(Ov5p8`$xW>N`JhF^09;tj}K z0kggiG#`7LB$IT-P^5THULGxBk2Q`YyyAcuH2Ab1v2LY}M z{EEqYJ>cKI9qGl7*L3AE4ta|{BE%KUAY6;_lk)a%N4qXT^3Qzyt-r&2=3R3|P4lYp zFkKVqHfmbNE9nCASWZKrxjaZ$MBWEL^RGd=BJv&t%`-u|BJ!RGP3fIXfy$R+`Z2xB zHH{?1pXt)O5_FA+A+PT+}BLJ|84@!M}l-k()%^gd?!d3$iJnK_gm0J?oz2O zoguv^g651MT|ge~vI8_*f^eTdURrGL2hAudlA~w4A3yG_hnnnieN%{4>Sz z@vffq7IC5``ca6erK2kf0u#%RLj>Kio@i23X#qb8;alS|4ti{^{4_+7h;NP>s@G{b zKX<8;v7U5N9H)`L2p}_wjp z{Zal`0LLhes*#9eN1ZSxTNEWOF527L(cKl_++zt!ix8yJ@lBSXtO!A-r#oc{W)&ew zC8M4>%q~LE+1nEr%XMDQaS1x(tsT)!JQ+tVSf)wlx+HyleKz?=xTwx(hi6FTE-n^L z#(I;{p6;|Y#d!gW?#>icOWV}Vck$6!HiP;QONisOW(z_DiSEw0MK27YTcWXz*3uV+ z&~4r6zG%AD3aAKC$lNzor80z0$J^5JOu|rEyzv2;A%CCⅅ7dhnY)@{YH=mp69N0TFGC2ZgdrsxW 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 diff --git a/lib/SDL2/lib/x86/SDL2.lib b/lib/SDL2/lib/x86/SDL2.lib index 88452a90421a005628600f2f5f4e79b488ab5762..d24f27202cd84142790b407413ce70ad1ae46c08 100644 GIT binary patch literal 120400 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 literal 116400 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 Y4Yjvik7>66rBcacYV!*?O3-8af8qy7ivR!s diff --git a/lib/SDL2/lib/x86/SDL2main.lib b/lib/SDL2/lib/x86/SDL2main.lib index ad65ae091bf2f64ce9fd634cc34324f3a5cbfc4d..5993374cef6c4f11c239bc37bada917490e0cc2b 100644 GIT binary patch delta 11370 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 literal 40536 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 diff --git a/lib/SDL2/lib/x86/SDL2test.lib b/lib/SDL2/lib/x86/SDL2test.lib index 09e11c655d5c67191098e01037eda8e5363aae84..d9f3614ce889b8f31758c5b8b9b9f7c692acb9b7 100644 GIT binary patch delta 168844 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 Ts&=pW=qvv0@IviRqU-+vAW{S% delta 166301 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%0DPq?FKZ?FXd{C;RhRUwp(pu!@F`V*3qAu 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�Xe{Wv zplE%~kD#!0tVzH`Z45dDv?=H)&}N|1K+!8T6`(1gi$GIB&jU>Z#g9uzx)blzb|8=i z#{Hn#poc+oLH`Vj?yPwS6z?f(J_W@ZS#uJ!Ip|+O3qhT@GvaZkCI+-6Xd}>8pvjZ3Q|Kv@a;;LCtv3(0Bxb2uuL21f2wWDd=R- zn?R?6?gc#u^!K3CLEi`i73aaLE;MoBJ5FT~MV z%PJNuox9BO)hY7&h%tZjr5Jtd?|GxQxGUF;%j&OlHFg-7@|XpP^Y+W)R*7ZfyQ1Vtua;f&o`e5 zoCBtHGt~j;W+e`?jKVH04U}k2qLwT?WHk|#oNDD7k!r9HuOfe+JpBdW$E8JkQ{CaPa z$X#f7#F#>}L+h24uAzF>uhoc0v>A?7THCqe!LQB9*sl`*joDxHYhlKDt)$hept&u~ zLEexSuMx9S{V5IVrv@R$afudLr?Tx{j`{j?3)7Rv#;|CP9EadiEqIv}H2R9-mgeNv zwd6)s_)48iHQ#V-(z!N^(F=|KSz8e0j~7nRtq6M@0EP90trJaJnJtZa(Y=+~KaYxd zDO&STDReouX@%Q`Xl1tbUaO7I(BZGrV_dso#hfTbt(? zcZ;@d%z0_|f@^)a_C89~aIl^62gDt1%(ktGQQ;*T@vO?~iB+gn|nQY5v@+g@3idirL1W0_ow>tu%x+vP@Q@UE{MKZWKXetqHI_!RH zUIae7aCuU)R~*klE65<#=GoA<4t4-CIg) z;|`{$J%1Z0t&yeBn(%6vosQ#L?Yk=9iVo(Kp4=10R(+!LTT_Ml9>Q6G@*@4^a(t%c zKUX@^JDOExsy?a*n2++-6o^$&~pr7)`>bvS+9uhSjP_s?->?bn{NC~ti94( z5X)-ytbgs7A;!j->9Kh0poYVU&xJy3E}9AA z3Bx(S=}iy|3}al2zoWo7$Ks0M{PLx97FWti_X~K<$y+c-#+?b`xMAGrj7bnVE@!`f zZs>m2QB_e*bBV9jUC0C8^WZIBQeG9!I}F~cD4s7t7%n5-=}!<@E~B6DjWX9b8z+eV zk2>?ku6)lFXFN)AJ9~ALMn+K|#b!MEqu7kcIVO}Zzz>}{dTD`G$660|cowTqWEZPX zWEaa%WEZPXWEZPXWEZPXWEZPXWEZPXWEaa%WYffC`E~AeqnO{wb~c3(oN2T1X90{&ay$#2g$W1Cn;I(&XG`=) zo~MP;1rI7&qDiu|R|20SfF)L6peInVn3n8p>1>-IHYFMZ(yXP4GuL{eVR)}NoM`kl z4vEG|1|ENVV0`KCA?IM`EVHpud>A_MBeh`-ipFW~}%6bro!w0Y_!-EbVdX}3# z#oOg(Q?b3=OfC#E7Y_bJ<&%*7y(g)|k*hg-#gTF|4bBa`ZgCQsLI-swY@2~dwDmcb zK$MB!I}*YCqWgkV_ImN5(`CfqLg%&3BjTVIzi>3iDx5#m)M0Uw@Z;e$7JfFI#_1)> zXPaq8BXQwu+#QCCWff*l@4i}S;F8Xlv*zl+1F}3YzM6Npl@#uRN2EIOc!lW}U+nOE zL~4cExEWuh^1yo|o$~`Jm(9_38GJF!I5j#D4<|Ij(TRVYo4N+n^^rcpvC_AS^l%IxV(RYrS(abHMR2_KfWz}Yon6<~B zCgSIs?vVxH^0=^n4BlE;oia}6;hPb~+oU;>X?VSjbC=X>q>580*ZD|{_-v;?JCq~! z1ds!^=ONn}gD@N7BK;g3JFnJ+E)aaGu^H8B*qb{I{;9^l*ppg)@(I*&%YT z@c^saz(!$FeUvHIR+<@0MrnaeB@p#Juq<#~h6|mLkI+k=v6tFw!}mrmgYGVPz46Ej z*XA;E?dF0`2*pPg2(Ofg5#WXFz%A!6vuF{;y!0mU7@;&}kF>`_GPUY3lLNhzmRaOTtXV#2FD^+>eOr^E8ly!){fLej$GCsq9irjbk6Svw2sI`>YZA7l0 zR^b8qRBLV}+tNWieIxGlgXW_~rbm2nBPK8}Q65!A(#bgkChPS9KCTiRNMy~+$}|Jdrwlvi&~7#hGKn1)?$?Zj!*cO znJwb~Hf-dvNV(tp#Amml+|7&8hMs!O=x@_eBA$SbvCFhTiA^8?j?1tvn9t8WihGB3 z!91dKQKn(l28gyx%#4h0wZH(Iz(7$Bfw9B%(lF2_Fi4hb-8sJA=zc3w?)5qsWg3=S zDqf)4FSJ0ZO<=H8%UR0f-MPL|5w(fDJK~^BL$yOh&!y<;35~?5+tH`hOU>lOIxRg^ zN;BW#MrzG_@eV9LUqQzCW+U;%9scaHTqfgKJ7xxm0%gql`N0kg8F(5E{XxZ=*+F`5R=l#3RtskA9a4cIl^>JBg2PdpF{~A+&T}F$8pPp~N zVR!>2Lq?R14h%1=zbC1cYw_Y$^;Jy=9_)Fcxzs6+Uu0gC+NpDH)M4|x)v35^kxb`T zM@yyOtpoSsRer?p)|)=*ck4CGGJXiDn)3-qjQI9qvws4vVaE=zzSV5E^la2K)4;1> zOstWdJ2<$Ooarl}ynI5C*{J0VmHkby>%m&4JNazcTS9IRWS-S>G0dLP^(0xGUO0X& z>)#-g#|ec)XDvfCZ-`?3TGsK9S*_)C)*H#+FD zaE02kE-L$rV0|=N=00ooO-N1~gI8TRc_@cmJpsKr9tNx5IK@6&>HOJK z1({Lux(#RFjU{q6SkB46o}Fl47sxEta(Z(1f!6cEIxyuQXa5i~xx7YjL}hOS*4$}| zeYVQ8^lKpVl9r3g{w7$d(|?*^5e?)d}g zy6?cceYRqsEj!2SO~|yXP;$ETDbU&ttj%-&arQ%yiLY#seLAwIgLUrQU(e3Tb}MAQ z({j3WW_Qd3;xqr(vvXE$hRiW77nS`}um&&u_3W*Xd_H7$YdO_*{-am1wfTpShYT3z*z zi)spyHIUn^W%b~&?$>~|c)3z>wuw0a$vYu)%#u@{_}ZbSO;=z=S*dF3PKR98O6k(h z^dWo&5~Pp7T12h}jGt4D01oY7a4{5Af_21l<#+5R_|$WqtDM~3*$2O4xw$>+C~?FO zz@4|_lJcbs=HdJF0z_UzPQ;J67bbN_Rk-0gHZ90M9SxvT%_+RO&uRmuF%adbCkz1iNFBJ$FV9DV`1 z$teuWTll?Ahiv2FHEMrzvzhdwR;N7J)hQ2lb;^TXo$_E;r##rzNe^~)%7a~<^k7$~ zJlNGK4|a9RgI%5UU?;t`-63l7o$1nnT^&jbJFu&h4(zl@c?WN{afjGX2X(oqSDkWS zS0~-q$;#a!4%1B?z1P)A?{(O}WG37pPHv3NlwQ~Br1Lt>O}HX9Q~Iu}lfLV;2BV`l zL;5p=`di_9tWLSEt5dG)z@+QCI$^+dovhb>_-TT7HFi{;I1bNsn!Ef8RFf{X>XhR; zbO9aL)hWkyb<%O2u~%%lA~qY$u;049^~d*S8++^aDTjgR($?@!g|33rI;nZDSo<8D z>(TWVx_C>h#Z4$QkWU0wx~xR{tkYR$MYz&sU7d7UrxVAPc&seaV;vd?k9E?0+1(;< zuaT+>lMd@pA3Ch76Jxf;tdm9F zBDPu%>FNai)yb~EMI5h<%`t8f20l`)M?iY3tE0C%Es}So6bV?)=+FhLUFps`<*QB$ z&59_XtGZaas=Gz(DRgFQwbD@?veHo<2CXiZL^`UgQ;zB|Pw1!)qg@Y2UPz;(Iy8=s z>cFHkIt(No)zv9Sbr7MWI%HRA(or3HiH_=!kB;h49v#)yDMxk4M@Myaa8y?aUi>z+ zt4=whlUIP{hz^*DIy)dVJ6V4 zTb*?HhH~ie4TZOsT_YX7)z#DC8*R#uzST*GZ%{~wZ@6;l@C|d|ev>tj4&UmO z!#Aufbohpzp~E+b(BT`F13G-e=+NO?opShwy3*krMCkAhxb*e%GLsJ9>ZHRrEKhX! zR;L`kVeZr68|C5f4TKKg&fezp5l*2c)r<<&$bof@M9KL}`hi`S#;T!sd4&RWihnzdo;T!sk4&UmO!?!vi z9loLJmcuvn0Uf?!u7n-FfklUJ&`pPL7&JP3!+Jx9Z>Sm_zG1e~;Tt-BHypm9U^;w* z2pztGNr!J>!r|LULbxULrZ%#&dj7IG*vM%nkmvA#H>P|AZoO*nq?yo()Z&KbCDseF~(6nY85#?(Z-8uCKDO^n$Xn=P;8--u3F z&c%tx%+mBj5FN8@Wp$t$UO;BAg7s)7oSqQ{mp^N?W$+4srs@}|5-+nv2#B>8ryZZ}K5-9y?R z4Uy0+CfS+b6nP~^@~|mRmS=bVwodZxe%@}8e7i@s=bh3+m@^q@8C`?T!sFkWJiu*m zN!MY{Kf#||e`c8Q#xBDo2PV#4l-mYC;;MyK{ zVctV8+|;7tb9g3{33eZEnQm6p?&B>W`QO=Gym3S0nOwYGA^Dbzx47T6*>c5`FSf#u znETzz?ch&R!0ziU$5d_y=VJE98+PYrwUTf5>c$QK@rK>28#gkZ$*bEBl5h9kmhYkb z8N9cRmI)ufoLv-5i_dxSk^>#Tub({tZ`dTi+UC`5w@3O4>->>Sx15=Mx$n>MRj+?E z48M1Q6vP`JwR7D1LARf`xBNQx&2bk$aRuIsd6n0<>t(v#|Kk&qf71_*hkxfDF*WA5 z+rNH4cE@I*Cz5aX`j&uSi}8lt>st@WpBvnAeB|?g_GE>!j=sGAspbyH49TAqx-NUc zTys>{;nz&h_}#3rZL!~6CfL2T-6{EvN~x*tq`T_)RozWo%3%^@+#od;ogfEUQ6PZh@fzJ2B7g@1nS`RUvM zxk&QuKH;`B5^L!mw2>Iw*GP6|G!}cH#`iT=^!FO$pL7*BPrNh1=hMEq#EV0WD93Mc zU|Zj6Dieo4xBGw7j^CtEZW-LeO7ClTml4&=y0Z=M)_n11%e*6-bIMeWyU`xEba$OwGr%oI%?h;1Z3eZ}nUDqp#> z{^W}zkbu%N#qQJ?cH`LlV_PX%l0C<5L6y0a1AO zOA)hPHt9sKXrd2Qlbo5Ooa8`HR(;J&F)AY~j3!oyonN^*DWu-edmcB!`yYr!d+WCz zQC{CfhnYU~0zJO95_dmGUwrj0%mC?3F!x!*k2LKD&QqW9Qh%{!kaOVnK~6kqJ!9mG z9k2G&6AM3|{VKI!-aa~-_(;Khr6Z<#akJf;l&5~WWpCcC8Z&ec^@!|$E7d1V(0X4mV?zjfSM!`XMDlp){*$Jn0V6Akp{&=3jenNE&MSU1A z17*h!)Ai$a8dX1rRQ(w8Iqt-N#k)s`BK3o1^G)yrZDzEKR1-^=u5bcEs@ItxPmt(! z%8AjJ%SPX6YwS)}oP1$xhd5l6mS#Mx0HPks4l>Ls^ z+p>Q#6LkFZ7d0LXsrE3W+M{@EkK$SLh2sHc!}f?y|89e-F2?{}$N}nw zvAKJrnR>>t!Tt+5Hh@xOTgr7?X6v@JK#f#e7*cIvNVP@r*cQe6^|s7<+w_d&#Ngz0 zV*{!cI@@IX781>IS_dah^nvlZ+$?BBHs@CX&NXTXw`|1ENZIU6xeTyWYdX%=O`fNl zya1G07wRUrMOZbNA=PAtRFf5tO;)^LZSo8(0d1^S{^RzF=dO?!7h5Ho)MC%d zrAedJqS2$)8lhCVFYojwovWL4o^H|wx=E{blepJJHHjhBB!*Oz6pu|(JTwV@cAhEy z0UXQ2$EMOBHp073BZoNrw%N8F*ElsXIiFMrV<-Cr?#03(wqES2l>>FC78ltZak5rk zWc@dpedKIo<`Fn~T#WjHGzS*fDaX0r{h{c|>(HF7jq=wh5acAyfh{0*S-pgTcX`5Qs=L9qhYbO5~> zlzqDwbSUUP&@rI5fKCLx9TZEX<2RriLGJ=(Ic%sJEr$F#((NLHKIu49GV%1U1bvQ! z@4aKbZKOT`#&8HF(g0Q7@O0~jTqRpK|0=ZZoQMNY@p?y3iul7-W(LeOrJXWo+*on) zDzgN30YzKz3^Y|N++vo>4&Z$50>wQ3fQqsM4uhtG9sz9*`Vwd-(3e3wgB}It=)D3u z4D>b7QJ}Ab@=53o(D|T$0bL3D4k)Iu;}|GL-tjKzot*XWA#ebU_d!vZ;{#9>;`k60 zVd(|#3($`dk3}Uv0c{NWDQFAO&p1TLKFWIle!@6e%m7s4JeLD~>Havf{kXRK*!m6=z6QT=7_O#S;U6z2e3?)zgQrHrt}YpI`m2 zR~WkpWQB8dg$s3sF->KKr-dubkg704s=|uL3M-yi_paHeaS_s^rbg{HIW_LwhN-cE z_m%AWE!!H)UiRQpmku3;vBgXhCELyPUzsZC@!U`!C_jC=w9$>gMguuraBWF1jCcbq z8xcev)$0tYMlhrrp?GYB;>r8!(Av_>-lfggG!MZCS!(Z*x#y^#P;{EODhFOtyul|>;B)RP6MJ;=@OI@;H>7??- ztCVj`#2qt4NLXuOig;C+d1Ap9m>tJmV;0-iL^}H8nm7TJYvM#uR$>xpCr~Uea!tgh zA-N{fPaek%+j!)fI0KYx;!IGkiLjiJYhnc`*F>xma!s5ID%Zq$2yjiD56U%h0VvnR zg`iv$7lCq3#9j`$CN2Txnz$5{Ya-S;xh7VDa!p(g$~AE%DA&YQpr{nRp4K4jI1iL> z>{o+c#WnFl1a1Li4d~sV0E21{f?fjpBFGTDd0ruQR*h zrgmb7nUZW9Yp#nk#Iozm=5kbHp|A^19#^8y9M#RBTo6?PSO5)Mf-KQOzWrBx+6@I3Fo9?$a|Wz*_=T^%n@Tq{@3 zS=ax==4IYs7KFG^^IDE>qCgYaL^|SN6R!hh6K?=z6L*5LiA!;+CNiX&$dJ#$hACdI z4(VGNhYfujvYII7e}F+7h)hv~ma{_+8k*P9sAbEBU}b%9$3N4cmbUT2Jz6$qFDM(c z50s6ea}Zu_cY(4oD{-pEFr*s8kZO$Lu`!Al885U3jZtkniAVTH*`OiF7}cQjZm=3u zARf5^6TGfC6Jdgcs~l&P+fcrW+KG|djE@PL zeKB$~cbQr8F71L~bDTULL!DUX$3e+^0+e;U2&bweL#mDp`J@L}#k*C@`9OJ`42a?n z&Afch;mtS`fS;3RL%$}-(X`wtMvty$xiRZT(W_ubm z3-ouol9wW^D#?(lBtz;)qT=0*xZ)uIe?KRNs5v7$bid!~*Nqc@g7dqLrK09Tvkkwv zB!7D)$`_Ieh^ZHqTM^P-ylA&MNjru6wd**pU?jV5jh3$a&g9QS=rlg zs+(5*$Qx71k;iILeIrJCi)?9qsNOH0xzWrto$3W|{mC1Xrky@(-$8Xbi*bjQ%{;EF z&l#zPoFP?xhSZQN9*11Ip$ zb;tkvWhe&!zs1=cr*#ZKfP9`jR*OM5p>^}D)@6y?Zj!gJ-`!*mkV`qQh(S^ozwyuz z=KL6x*ZwD<9KTONb3wlV<&Vr0p!|_}5|nESyH+)vA=Pk(e2zDDs^4);hkTCkt{5@z zGqir)M`rD?Mo4`Kr}|ccYJCdgs`YIUdH`plV+Q`Swuy2LRkOPWaTQ|S#qgWu^}G1y z=yvMA`1fkX?h5$2Vw)8}zTbJ%0nuM*K%mURghbb^-kbv==De{mb^l zrc=(}7|_LF$AT^e#q6oU`!5GvQ`M{orE{jsKnP0|A7d$tevRv@=jJV)QtcIlJ>%g)#S1x(_(j`xCuXK(BnvDt8@ zr0sxiUhEj|_+03-R*aqEal<*#*e&K8#`wakA$7WMl-3{hPeq4P&1GEx6^K%iV@?>%n6i z-FF+t?UHAC?`Rb5z2i=9?Q14N*`AM$yTqQWy_XsHNNKSt$vM=x_u#Ci#!ACDAj*Ze zKzyC&x!ibA9KQx(`d%>}7TIoR?>xD=GRpM|xl(;g{SZg^7q48vl z7~I-3v3M%RjyJ0xC#=HLx`9x%qX#~syRem6{oq6dRf-k2xAx2kMH_Ncfy>}Mo(e9g z{cxRK6`u@Xri%Ym%EKKF%~K3;a&a?^*33Jx%V>%JTzkMO~YW#Mf~@CMOt;TO?9fwwF&?6Q^ApR^gc{33P(@9G%2$lY$T$59I0W|L$vBtsX7?M zr^HrNE|Ef#6Ma$fEr4>u!@>sK_jz-BVcc)wGIm42n&uIQCY2~lmY*(Fvye?-spIsE zickD5gU`7XDbKlTxxFy{@^l$}AYc`i84g{eHD@{+XlD6*sE(-q%|=h5U3HF4b#_?w z!&-HAL)FNU+d%V)*Y0@rbj>I~&!##ztokjjI@hL}kCbRD{!`?}-4FFWUA20=XxJb5 zVa;-au>bRIsxgdE{XX<^TtDmZ#y57==px9_Zr1AR=HXBQv*BoN)7%1FmoWzaS?R_P z-#Y~DXE1txa+P)&Q^2-Vw+M&m9+yW8o9b5JMpOsdEPvFlxwVv;9;LZeD6AR|Q039e zrkX$WT*fH;M^49#E?p1XRkxKg(W={oHE-6M+t@U>?+braIzM zWxrP4&ZfG9%*9@z$Ut*Oon14K#O5geCoW5AALr%YU9`qtbZ04pjtrMq6b?1fnu}DUqTI0*({o6yC}`)&o>7dv z4a@B!bq?WwoXD|0u$=Bv$8`MX z1Iy1O8~&pE`QcAf-r-ahy>`UKSx z)0bjXLOvX}xy&Vo}ouS0K^ zG_>{3y)M0ht#|r=l&yE3A69rBDjZdFW;-HQ-|g6zzu?g<%Mq7wVZ1e3Fh-jIYy99~ zzt7hyy3ppb^*Xq;szz9M2M9+ZaSs1FUrgAqgV z714&`L1ie8Ceu(ns0_tXc^Zlb!-nD&5kv7{#8A9K8H!g#48_q`ZJii_u%UQ`kcQ$F zB5Wv*E})@!Fv?K8LWB*)(OSz;ydq*K9u(4099d~7jzOcLI2zqvj`ov^DGkLj+B6hL z8V$wKI2wwBNn>zSj)vmsGc7_xai~^l(oh_|L_=}pqoFv;qoFwJROZP8k%rehm z(P(xxF3ghC40KnE@~pUI$Vxl%pt2*E7l>s?4&AgP2caD~3Zxx*P}z~AB-)Xq_Ov4p zN;~qPvLnZk(2g90cH}`J?Z{Di+K~s99XSS%cH~H-9XT3JJMy5iBS#wT$ZP2y z&XacJ$ktJ|SlW@J>Xscj`ha%iXkgfm94y+ALpSZnF=(_S#~{#-995$oIVLmh$kFk% zBS%rRBZmm>$ibu?Ihe2`&o7eq4;nH@jKj%`G7ca6Dr}4{-98ESR2NA@YwSvy)ytV= zTq5nbN#1p?C=4MN^$c9Lc-aboiJpXp99lSEB+7d`lSa1JqT?zns^Rk1lhADRG=atD4&I}YJz10K81XeQW7jG=knGEo&DlLBw^HH`fzb|V&=hD`B>-InuW$+z18 zV($y&?PlKq#=*Cndw;9sZRXzi=nCYMLk|yieR$;l7vs;p<;UN>vAGPGr%bThb1#&9 zyNTpgl5e;3en9f=_S?rL|HZ%GP_(1#*W<+v2{FDJJ{7&p|JALr-qJHmnyBu$g z@c?-yqwMxE%1FIBMj5F;BIWEx+8;>1-ALPuNAY;WZlv8lRvMj$R>^d`(fPHKZ#O!B zO!8;iY`8y^e7g;IW6aVs*>D$2{&(ltjJPMugjb7dUhnhi(-q}A3)+nCJRk3N*GRr) z#2vBWzD4rww%dP%8{b4&_a~at3g0=?l-Bm4Tktb4-njU?M;(>pKD>Q*liP0F{rFFv z@S{oc?Y7)sOTOKfI}N|D&t%KpSMu%F@3SSp`keKXH@$lQbyqKJJs`AJq~e{%l``Rh zC-T<3Fz3-bjz4tu-!`=JCse7jBdO_Fc7$$nPy?Ka#woecWs1!5i{91+6wm+{RbIe!_YL!hBw+M7B;o8!IieL zb~Ehy<$t1e@78aeg&;7+Z4RQ1uPrm{cyZzHQA+&F2JLU74X#ll{hxqu*ABDZ{NIqd1iQxthy!aRI1Pi{m==3s&<%QGJB5oA{`wXA-^#)~}am zxbfP-D|&g>8J!8P@**`IQ*=n}fg;Z*A9fh>^P6o_4)!g5&-1KkJWNaL&F78!;5Wqc zqC+3leukLY$J4`B`%cCb@p2zeQHoW&$qVLG&qs&)6Sz-$ipc2e>4vXKj_d1LS;T5( z;#AdQNL7m=pQ8`DRq;x6$ak=4j?wpD`Z`+H#hyX7un zLqlWx8$Gv|!LwNpky{p9YqS=77GTRkFL9_Wwx!W~`y%)$=v(7y*R31J8B?Y&D0lL3 zuZgdQ;f7l~O2T|+yemem{n6L21$S*x*7_XSAjGMU+fKTG@=Yx4pY|+rCzo4%%wHUa z{Ky&0lRLd?B46{N4!+%sKB=!-=8JU_LyI}6LUHfMDatJium7KXo-rjxCzu{ya> z5mDuo`?;uU+-a&<1N7OR<$qHy^YdHk8;g<5yEu|RxYi;t*w z7h4y43yg)L-IeZv#v)O5rTcpWpI2Lid9XyR+2k%h;})1@QCnb^t1U1q)fSi$+q_+1 zV7Yc1w4N(wEyo-?@8Is`u@@R}Wgs`iB;4+qZ>-@an1b!sc>5R^i@w)*Z!*?$i%c=B zuMSto=Hy+1I!EtqVLW*c42@H>`UYmD{$5)q844Xxn);Mmx^sf1KeZ1qi4B`rwK70-cJRa{Wf~71M7j!hnfJav3da(P!3KV0c zcP#GKDGFH0ZHTNSr*-bxt++T0tu&F)%GN62!Vzd?v3T-gvmjvy(8zXbsZfQBBi9%y zW(^|Gc5#S`N4emKsS zy*bie>!Hf*n2Ah3Awy~}ndhvTS|WK^FP(|oL6#%KMq++A&Q?+l(jMupGhK;Hz5Bqv zh>#zSvt{D#{I7jgrqDNt_<{EQLc|Y8I8ziHM*b{xZ;^(j80S&)e-$pY1CuAv5EmM7 zT}A_3DC0i|7wYr^TnL>!=<(wTgN}f6##Jt^#77LLpIZU<%7ls}*!4a(0TK2Y5`le& zM_`|Tf_(xC_6aE1C!k=TfP#Gj67~rw*e4)ipMZjW0t)sCDA*?ufqmf0$?^{z0E`g! z4;+ZVK4l8_DT}~90R{U6BCrpfPFene0};v_LeF6&h z2`JbHOu{|^5r%z6M_`{o1ojynfqeoB_CXgA_6aE1C!k=TfeQ8sL|~tR680Hr!9M6x z!anFK3-%cpfql@$7VI-n!9D{cun(GQ!9IA?Y54~ZDA*?ufqe!>V4r}3eb6`y_8A$0 zeF75pL464O1R}7{NQ_t5KX5?7K4>ywpMZjWP?%#dKIkRFKFCMd2jvm=L7fQuAm19iDh`BU zpRu@mpAP$sRj^M$!9D>6`^XE#f_eF6&h!9*dp z6OgbE$|3B7!U_A}N>E9JeUNJ{`$54z0SWs+Az>d}*o1vBMF{)gf+p+}P_Pdc9>PB8 z8NxmgA?$=RJ154w`DPe8&xSiK1Q1QhIpOM|cvJh~5tX2L$mP1py$K-dRL2>YNtbRQg0 zuunk2K422|2}sxneL~m=*$Dd}M%V}aMfbtTM%X8y+y|rT7VLvQAnbz%hG8GD2>U=c zVIK?{VIK?vVINeDun#6PVIOonVILGl*asqneZVB_1LnT~`y|s;Wz34oh&x~HrxxyZ z@yl1DK$8>-1oEykSDbhizcagu{;zvdW0fospMnMej}7sm;8^Kv_sn3;a0S-jlCgs| zL*PU=176TQ39{579U7o9e8~AP7_E>U`%Tb##BiV#SX??EBSUX=5filgE1dTz8#EdEU^ze7*j0yX8>cS z$OJnWbCKlR!I+yR-www7LGtZj%-52C1~4W?f+Th@rjO*?!I%Y-ZwF)QCEpIl+^@ly zzsqzx7?Z2Pn0XRhv4b%iB;O9k+$#BJ24lMY7mWEI0b}w#D=LaRW0T_l(_jow+*;T__g zhgsV8M^IQ#7S_jBPO{ki2%i3569*pg43vej0je;DRACG$U%85R7;(iD=biAhRE5E> zY^rGTC|)JLAW|Q-ip;?4K2Oe>%WWcFeZw0c%hzqMiDw_x6<}|v3NWN9z>p8drK&Ie zFez0b^!zO+JT-chlSR&Bo;VcW?y+$9*8eHb6c<0{k&gBv!;LN;BtCgeB0jl~dsYtR z*m1;E$qcEI8B(tQ6fYic_7sm!MlSL=R>iJ+_Lt9`#fOwzO}Lcc03Uc9HPDmo$Hz~f zY%QPgv_hYcdBRgHp{9ax!3?Q_8S*&};J@NMs6+n-)YS1i&rkqw=YQwP$x_Hp1(%3m zb@^<3v;M17*q@(-W;wfx1K)W@x93)`RhT~!gv06R0Uptoo}@Jq;06HJ_nwT_y>&A8 zWHH&YB&Vu~8pF{~10^LIC>fxEl0i{G$zTnX43)eyq8!5_D2G^gnY+2TDgjPB_g!u@ zKlog_cZ^|-A);|1+zAlO5RYVf*BBEOj4@fk7?V)3Xc&X>Xc%LXf-%M`7-NcpF{UUO zV~T_^rYIO=ih?nwC>Udkf-$Bj7-NcpF(xS(V~T_^rYacYf4=-A7I`|1F-5@`)1zSw zH(%dl@%ZIhe6Jc~DUT=HjmMgYNn#-g*kr^WB!Uoa>fw@at*tatmqX$XQKk`mukAAU zV&8@H+f@tZ+chf~WN1E0q&Sb*a41DF5Ql0}UK7_W)LgSxZ9AN2*TyBjp)GU-A8Dg= zYJ4QBo_LBxF0M{I_V@YZ44Qc(fXOILTCI9|!=V8(BaNI-?*cq_AzO`3pHosk(Ozk; zNG^j&f~DCX4iPNp;n$i&*p;a`5+zrLNMwkM{<6icn#h#P_y+$i)s4cT<;;eoky0In zJ@EG8GKfAjJl3O_%>~|dX~jKyo*h6+NiFKprF$4Z0=Qq?bbOEV9gaeY9|1$#|Ea5G z!WLj?b8u(=ri&`XDQ;`-?Vr#cQ^f0ee`D`;|skp#w#MP zQCxvLA98VhMZZ1n7S0ZRMTZ+fi~6e1D83IwXMzT2q(c1r{{ch!XH9FC{%^9aiI~>x zM$Zg99YSd;=C$y~8@b}}ZSHQqtp6wor9j-%+G{~5DQAXIUJ^&!ds|53nGF#XWn%kGVWf2r5q)?Pl1VywMcEWVQ9=T|g8iq)?QQLQ&Q#6eScvQPxTnWvzvxpi7COpsOqt zWo-mSK^I#n%36h@tc{>3XsU&xtc{>3A%&uZA}Gq*2#OL?C<+>9p(wQx6eT246x4?( zN+^P&)JCHyA%&u#$wW~?3PnNXiK2wUD9XABiV}*TDC-o8vMz$6ps$Fcgu*DwI)$RF zi=Zgz0-`9PC=_K~1Vuq>Efi&41Vsrc6a`rcm|)O|qM*@4QIMvX5=Fsi6CyzxQ4}TFN>DkXDCjdSLKFqrRhmRm&`U&7kdG(|$|H(`IuS)dKB6e0Fp5%-hlkTqlzN4t zgcOPrQYebNKr9pmx{0EI5Jf?OL{UNtML|hKQBZrLC?ScWgcOQ`At8zaLKG#WP!v?2 zC`w47C>T7VC`coUf<_ZX2`Ll>X+%+QITJ-e8c`IKLlh;XP!voQLM0)IqM#h2C@7pL z3a$i|L=*+Nh@xP|(0C>!Q4}a7ih>K9C<>+sQ50OzL{UNtMZv;D6a_s)6a^wgQLtJN zMZwG`iV{*N3hGJ}1tLUILJCDeR}w`DNfZUE7g3auLQ!yO5JjOpP!tfNDCh;EC?SQS zptp&lAdM(WNTDbpiJ~AkQ55iqqChiI6yzp~f?gns0wqLI&>o^FA%&uZ6p8{SQIwEG zQP3wuQIL%&3SvZ2&|gGRkc}uxNTDdGx`m>k4~U|mfngK{ETSmTO%w%#Mid2uKokX4 zBZ`8_OcVtjPZR}35k-LrQ4}zVqJa4?peV*pX*{z{8qaw4@WB|LNEFi^H`66Xa-Bj@ zKww8xwjAl>VX882^0KOx(vHT?5n3iwP|WcUPQ?dZ;nwfa^G_%C2iH3 zqU~n3{)*kqMg_&-y0b$u8GP}$A!CmfqIKFV&Ur?i{t)Bvf$GZ-F<{)^T8 z7ptjkzvRAAU9%>^FC>2P#s3$psre_dnki5Jap$)ePIW&V_wu6ctwt2W5$aj6n(xkn z)nwwQ>zS~c63Mq?HISCE-;UKhC;4`)=3B`>16GqJF%&yi z(@*m4Sj{5Iw_`QiB;StJ9Mo9NFEZVZ)#PieW&vIpoXK$JGRe1NHMdLtnX#H4|HW$l zN3fc<(iG+YS&Nw-mXVC#afmN?@Vp_t*RTD&1h2jJ@Wo8=?>3g6np4v_1 z^d1`5WYd-6f*Ia+KHB%zPW04nI3(_#;cXFOdXu}y#@Cj{)ecQ`{jql2d>Dr`xqBOx zyZ*Rw(=0?cZFmu}F`G8cLuBlxZO$8Yx;9a4qx_FF)}qM+BY$c8WRnMEm1N{dle?dCNqrmTf26V2kY`=m9!3dK@vd#3 zZF2V!*EXqG{;!qldykC282$MgvdI2q;FAsfHy-~)qZ!^*F*4{)2rR8^fJ(u=aLHy6fndn#)4lTz#$&tKW z;m|a^rX&=U=$LDTLXKq!dcbr$&JTyK2#2;HlqFMlB9tyO--;0NEw_WN-LM-73ZFzM zNrwK2kkWS;p+qV7HbN@z#|Wvs-yoFC`IG1{a4D(GDF`LVESU)Lt#6{EBSQHy#JBg~ z;bMp|D-*t0JqoCQo?0oMhM5a%Vq)B$rGsUs2R%()OXT(G2kUgh8giz}CwFX30@{RzBebI~c$ z#Zv>Xb7~08k;U=Sk_yGAZM`k=HOHpyyrm)etx)!|b+Ff8!-)sP@OQpiIUF_Y)h?i% zd3gCVW8iE4hPLbrAC0#CFLm4^Fc?0;!_^-qo4PHjzb*&`W+~=#)(-s0kjBoGAJEt z0h_294vNaui~&6dbRy^s&~nh3n4~pJ5GV&-13DXYBWMNaUeGz9&w^HhegKNr)OgT4 z^FRwg7lLB0@#?JMeBnZ&U|WV1ddiT`(FM5`uZIr#9OGAsk>%ct4tAbn^!b+z_PWgX z_5g}1jr6)GBfW0YNUv)HBR$yf(MYccjr7`|4F~OoNkurdH))LuccsoeWdznw8G&_C zMqvGw5m<>b0>k!L8i5TE?c)92MW4mqxIBWomKWzztuh;a&xxX~!Z}zhSnSR54$-9! z6a+Kk98j*K7&H-N}T;fT@M{M8p z`7=b|5_n*qEaLtCjKXrQY_?VwX-lM_Ibw|8KhT&fs^a_|MdmWE$0!od`~5j-^N`Eq zn7wK)78b|XU!Cd(d>r%5IbY0J=3NAvJmfeB#(2-i`MVd=D?2{Wv|#C+W#_G2u*}g2 zqWl^-zG(#~u3w#Ee2G|F<)!12l1BcH0dC>Nsz>8knK}dU7{|)W%0((Z3vmzDr1Ci` zUV(U=3C37*RcYWUAj_@+V17v zhDmX{tgA|?@*xrbqdtqAwm5c6sZ3{ zUw#scJRQ{Ep+NoJ(V%`TaaAY%hUbX7o!)Mvc*{w}xPSIwQ5!oz9E%i}L3EWN9xzZ; z0r}*iI7GF16gx!u9yrVFu*>TfKkxJ=8>J%qdVh}Svdf#?;$kVoC7N@R$3gj@|11s9 zXboG+O}E<#2u089pSaTql%_ffo?Fycy^GT?^p-ffne7o02*#wPiNWBpYX5m}BW# zE%xm8rls+L5H5LfpKW+-6EE-fb{4tI&9wR#*7mF)n%`NRx5pb2t8ercl?8*rm6a8% zaIszxtXQ^e(Sk}xNi=JIWyK<$P}0TW>)569uNhsY7j^B@wMaU=q(4iiLD2l&&kV=y zE-`D7E7^Srb(_%HO<~BMls%8$6IOILG!yn2X*z(v^VtZM!cWa&GLps zg-7XfCTcoM%P-P0tV^{Fw{Tt@#k*AVwrF}yRN8JGX8UiC3O}UFcvjPwby;s~8P@G1 z8E)bHQuA2;cRGyA+Tqxx`iRf+@w-I!t!P`J=25ouF4bRsG##MRsC%g9jn;IcrsqV- zlxyC6O_%Oc{aqa;bAD8LpaKc;qH9qK=aIl9Ff#=u9fYFPYlC z4#%VSDZ#_Cywnk3zxjy6(dv(i{RD{g&ANM!JJGrGi0aLz;2zZB76||0h);Zv=-F~3M)}@X@Vh}T@mXs0_yhLb*YI@z7bwKh7N;D&G5aujsc)%kz3W@5 zMLl$U{9CHzNjg3als&@Ho1wxcTT}IxE`2c~HE-c-#5j3)Rq5QrHu!B+>>b7CuVz*H zwML?I`Z2MTb7Rgic@?^;3Ae@b%xSS$CtRw??Ji6&1c; z>v>eu-)Z_MO<#?YJr))IC@TDARQTJd@J~9-b;|XfswcyZqQWUr;XD~`;cEMx?%CB4 zF2>K&-|(j?4v*~F4s^Zpcd&Z?pxC_opXt7n41WC&a?ZGJ`$6k`91jzBBI7~>T5wEN zqqW-)F9|UQJ_4lJK_tnsue#Zt=<1bdhdjAh5Y>1s(Qs_xuWcMxsA_D%r1=IL9@n>4?D0sF z)i`z|s_|4iLtKSwxL!s;7Ej%uTM-Jo+Z&?jX=ffhYP(}xQxSXOCS;h7K>vLRlrzAJ zw}R-_{$cUTcTBs$(e;@VcCc$P>3hq$ZksyA|Pte1#$`{!Ii< z>_*_Y#rf2dry_-}1dGdxry&x$5wb%qE|;cx zR)jaEO^C2p%+ZLvXhlXLlHEzCbVFn@BC>PX1vgreX^0%P#2D#Nr2F{Tt?1*+5tEs? zfZuCHxPt%5imH9$W%^D#rtw^@5J z-x9k+3x_xrfn^-XLIh+X9FC&sNDoBh81}aUr7F45IlQ~7!<(#Fcf--KhpI!qszVJH z{dGMJhl|%Wj+QuChwWJNT^sxA0y$5vj*je9kwVw4nkx?9jN!NkFjMX!bsLjIp2LL^1MFZUP18m!9>vvq|Yv7F}^FL}UZF}vAq<-zL z#72B;f1*3l3p3$___C=l*Ek`XH1p+w6gBhZx=tiG#K|VkbTgL{h{VS`GqMs9`3!T` za10+gdQfo0_@QNkCnzNl=@jow?_`NMmB=_H(oAP8(HRF$7&ihh@SsiXZ|X~IO{ES) zDGiL603<*aOdZ7RlYjLmY>SN@L)qG)4m zx|uG+4)J8IktE_1eKD>dQOPTtI@3faD|URUnQCTf!N8S9Byy~&Gu5POX8NhAGgI7y zOm4*BMNRC_^dyNxdp%xRI!b&y5q;+uP1Ak(AYIdaIW1Y2Z)In3W7XucQG-TLE}c|5 zYC>@Q(9x4e$!$aGz@%==`ruer>-84@|E zQ2RO`jOA9aA=unjIw&~4Y+5N^?;u6wruZ_9*F~QcUwSXfxh%QBh%rM0N-{(1h_TWJ zOdLG8beu}elxnu5__CnpE@;c48q*RTKcRHgz%pz?W0CBH*F~dLRQGk!J{8^jx)_~` ziTb*zLM)9ryl##z1uD9z3CwFeoM6Qh*JP{qj66UUd196h0I^e8xML>6&zHYVdyu_N1;kxr$q zh}`6%rKKa})ITbYARS^~Wc$*)OEEXq4I4dmz{Cj?M)T4h6>djN!!*>67X^Mr=lC+A zZmZsUxD0Xz4+529q8aSeC%z)8>af2p~85EdM8g78I2IwKu(O2V2C;6~s z$*ZwCLA-cnY_=2h#FeqBq^ANNNw@C97xJpb+GpKqWER47mu6`xDR8E{RfWWp)4k$)&RE-jWF z^bz{U$E12=Uz%Lx*-houMw-0oF;Y_NQJo2)+g% zxi8id+WN9HDOL)JPn-J+G<*9{bzSVa6XU8?h-nl3c~+CtQq##=IG+f(#G7 z=f#3NJ>&|8F5P_>8<_i|JFS6SLZUb|(cerQo9K^;l?ue2g}z*?kS#;i$Q^0tOwq|l zqLPo-$0j$56zgmTRCl&uy&hidhhoJ2+Xao#apS^}wM!>e1G|eBIov zHog`v)-8LgzrbpD!Zx+q6m5%5ZNmpsHPBNh6?NuXJ*I3*>4?Fj$Bhh32$CmnZ*uj7 z-Hp5?F$GTDlffx)#GT3YWNeE#xvo^Th?DEi))sMcDwp4Ds;fO=jgcY7T^^#lO0^Zpk+k!RO-!d*+ zc6=_nGp5FH{L%znI%=8hnriXnOL#F#vHMK9Q0BIRsYkUadfA;5RiUX9r`mf0JUJl9 z{RFImsO3~Ar)+-t0W&)_9vzvFLh&J$KyVz$n(Hc57EW$X1K}U440KCEeypb<4X} zLj92gxvbc-Yt?()nd&5$KHE~S5fp~!@DQRNzQH{37jN^8oKn}1f+&uLQ{&A zKmtVRgr?#-n4n+)LCS!FR1p*e6bUHRUI0N+0Z~D*Am9V&BO<8Zeb4Mpk`tfr-}k!S z@7wD-=f3y;{bqJ{c6N4lc6RnNZ$&58a`mn9-s(syyw0zRs4jP-mpTvPdPm8lSRZc{ zQBUoS57q(e)lx?_wN|vMN_$5!^OjEDBUfXejgSYu!Lt!n=x)}ICN4GeWEQV~HlmVD zXS+GLJh0Hi=c(E<-`9QNO-A~TeBtFDUHC#?bC+JvQ}OIE<>q&;j*z*0d^O%w%M!uU zD$91(iI(OidrWC=w?>}qOE2t|m2_HPRW-D!s}euL!8s0|?;9mkZT7>PR9WK08L!-@ z3;Sfj9nnvPUf;|kGjv2fTtJcTAl^G7uCM1@K(oZ*v)CjqvXqL8pL+)g|{i+}yIq#80s$z;y>N}w$S?yZmUL#9fKj$sWU2kob z4ctWaUyOGv-EmXZe?Z?}vTaMXj8aqjb!eBGBHPSVla<;pwOxmNv5pdZcI`EwA4al8 z#?iCB66Mp`p<)zzsLl+ia~|Qu+*N*CRiskxCt@1CCO{C@qXp!Wb=#SHgHL zOi{uVElig}yW!Kd@{n?QNZ#c0qHbNtjX*!8G5KL4TE86V)oyVhMh%J;U$A`_{m zOwX8*^)Cv)L-ey)-^QxeteX>Sw~4blW=zijf*f^9R9s(?+7_MJ$s*X+icexKi0Wui#?)RDd#24AnSmyKR9q)?c(h$<`_V4W zUy)Plbrk=!#jS;cmhU+G({tjqsTn;dW@S#Cppwbi_x`6b9>(@!aXTvkgUDWJXVoly z4^lBHYb=KxjUPEGbHeC}G8wH)7%P@Lsc^U`-QFr`E)aFwTct`bz!7D3_RW}(jv<&+ zx-uX)-BOHbk5o!1C6+Tt3vmPx!5o&fLwGZ6RK!+AzXwi%s5rfvgd4}GxF$~i6g=b7{u`I=E z+`XJ*M81!lm^LL{Ik0U1yM;m7GU8qp{tj3-`5mwtN1a3ze4jB?WAvp&Y9}iRSJ4ML z;qsX%o&*0UeZg7 zKD{}et%SPlddojr3}SQyy>MN8)%Y1l{HJV&AbsQzPie4T&Idj?@QCxaj#$4^X` z<*zf!S?Pi$u8UP67^)Qh0cI(t>{MbKwOyRKGAPh<%ZsAjV< z85QSn+)GBq$z2#?gR%T|>e?d(-x7(6<9Cm_v#2cFV_^M2}$J`=&BQ0 zhl%6IyLGA5Mak|~%Myj&kCg>OjOcFFO#2MMoca@|v8+G2JMEp=+D%K(oY-$t#wb}A z6jkMmw%5FDn(`H{q}+y?sjp2waAZ+T-1WhS{z@DF)1`9XVOW9Ge;-`rOLZHhq3D6!BmUbcx^y5rr1 zfSSUz==bU#$54z|v*`Egwn@F(;TP&GI&|&Lgt3j*wA?Uw0ls@D^`fuc{#WW*MLt(o z0pn9*%{?88e6OyDG-MTd?N+^3TlBTtH=NgQJ$R7)Z{Mq{CH11O-KI*t=oG25q+WE2 z)OAuXIz{R`Qva9NZhw}BqOaY?U{Fo0S@gBrrcy8Z+AS_B@Gtt>?Odt<%WJn=rJ?9+ zx5uSk^tIdDQZM@2ZB@KN5^ENH?Y1+Xg7ABFPf2^x*KS{NUc0>|?M0_ZO~i{Qv1ZZN zZts@*zrS|-K5YLteXnlJ(h(<%;R|VVdh?;`HBTh?`tJCg6~4pQT>PK?W?dC=d!Q99 z-tXXP>CK#2ckKVSr%TNn^su$oj7M3^BW`Zza2lXF%kbtqtA;{JFGQagyeVhyz(tO zt4-3cE|}8#fvuO?NUc2qh7mOZY-EKN`H8(}rQ?TM`w!Sksr{|BTF8&(Qsc*; z)JDdDsSQupS`OIL@beohz?R4meCwHACw`#oU!F0JGmn105qBCxNL5|D;)3qfzV? zs{)oT{ThKOzXRI(v1UJlrAfcvwOKweGpZI9dLdq#{rs+2OA>& z_;Fa}w*zb-G{5m4*nQIaxwiUnMypsVf^is^*QgJs!j5vS0pnrNKGOW8HtzuICAEWE z`wpzT)NW`k5fw-msZ|40QFjMRk=kIbJqFfZYD=`X53CK}V)h#EYwP|49Vu2S?rx+bSWT(* z)7mt!>Qc+m+GemSQhQBn-+)z=+AmtGh#F4qQVTFva$chg*vnvkBQR5&7lD9 z6|9uh_G;||Fb?4K8mGZ>_m*LoNoCebOI&h6>Gns=kBhd;*t)j(HEBzy}3U*RMP2TN)L>F+x{~Ti27Rx}MB3PB~Uv z*7{1bu_@&j<1ov>NJdA)=tIdYW0uxtYmM(AtFXHjOTb1hYVjx6F>ly8>rGQ!T41&B zSrut`3qP;SfWwlpKpc?lZv4M4*}r8Q%PDpKxC|Hl&*EZuTxHSfv%ZSF8s=xw2WN3L zye6)k^>vUFJm(>ddPSK`xsCBQ zIcKrx5}th_IVLClgQT4^b<>;raFJ4@3H2|DjZgnyL$*Z~oeM;TFLG6yIF|r>jWn^`g zn=R$etq?wcZtdIH&H?@#S+#PPlVCy%q-|jCfNQzoOZ21+xeIHHMZ)Tq!~wCG9V2_z z{l>Hy&biUPZ1#Ci%-sFrxa4VqYMwy4-Ps=zU~bB_+~~*Llt(jE zx3Ng${O~0*y<^3n%dMJY`GPpsvuCz7vg*oYb~Li8%58L1F|}3u$FK$VFZyyTc%Nz4 zoGwr*aDO&|`_Bqp5GR_P#R;*iL`Mpuu=fkr)i0jW~GDi@}kZntGw?4x%Y>& zQpNRWtj19bS=KN+hSDktuF){5mkO2!my(95X^3{HsQ=OhEhB&l@;<423VoEO00 z>oi_t1lWU;jn-CPqLr2Hr?JwCCYKX-i?;G?$bi)^&(CyIHp+PVs*N1ej$eSK$!PdS zkFx%#t$0<$U@rL$5B`Tr7KQ)&@$(wR@vlOZ0#nIq2sQ{mzrmsE1M%}3_uxOE9J_!j zM@BIKKflZY#d5T^QnPKE9oCHJf(pT^O0hed#iA@Kt%_#N1Df{GY=mZ6nl00e6N{*5 zIGciE=QQK{R!Z~ZL|3c@SbrqLZ=`^+h3qxDgK^isE(_MI)nROz??thaQ0+Hv$6 z{CuPG+XmJ{`f;Y8?vkAX>n1~-1yi|t5ln^n4Xm^D^P{rmRlqO5CY%zGv<1YDGH@F( z6}T&y3Oojk!|lDscx|1bt=V8al3ruJwl39HHdk9p>+{;WLtBr8qfx>F;WggV=9AjY zc5M?_{l+g~jiujj+V5}eXQMiAAgys=D*0u=RPuX*@dm|jj0aQuJ_{^`TEJKVT1N(6 z4WYAo z&27NSBe37-1;%%p(0tc^!?fQNFup6{Hy#5^l792F-_zRfMX&_vw-+p4`W^J*{8#CE zUpsyRRzjLjgDLB`+8TqVIvW;#qdeG5$?AjkkSraHXTR5Y5UiMFFN3je@Eh-H_O)h# zzd<9VV>nt*YIDWGR3;4o3zyc>V5W>F8;pJWe&aQ;f3V^=PJ^jx=xeaQp?QsqU@E>} zz*KxS(e%G9LktJ|6XzcSKLUD7if@4ZAp;))`>$kIz^uu&v&T;2wiFkGJ8+*Xm-QYF$gQ>9Zf~l~df}N4pGurx{V@3UEqp>_z9^*JL z6}SwT3S1rRbGecFVCmA2-#k)&ZM9!FFm=I7)z-nFN(>!VGU0%KNY7QUuZ(6Ku_D&y3_!bsUhUM|jkn2_Q|i@46x1@DR>gN*VX4D_Q|u+z9$P>uv;# zL+tFQ;^NvlnHCo}{I?YKOMu@|mkOL%(Bxl_X|4fK|Q;7Zj5IZ~4uwZU5CkObXkc+#4UqT{4 zSuA9?oOL&Rr4W1V5PRPc`~7kq$KQ?M@el{TAI-(J?+>xR8)E-F#C|@+?op?(-a+>0 zVgK_tz$tLKxH)jeS$7j~2-j9FrE&7J%<$P97uP@9S$F-r;<8rI-p^Tg?R=ue?du3$ z4RPqC>IQ93b=KVoUJtRq9b*3?#C{>f9#c$hUvD4@H7*x-1C5<^cMtCgvG)qG4-Byf zLhSQH?AwYpQyX+QuqVXfn~(@DxpvX#J74JlFBR8tsvkrwY}0ZHdW;}1G3a&=Rt3%l zHU>TpWMASF!1lm-z`;PwL>C+m#H5YE8NgiN65s-$04@aX06qmg1;mt&L0X?|zUE9t5x&a21ek|7U@`V_FLw1zZQ50bCEv1#SSY1#Ses3fu&I4~S<3 z!7qWEf&T%%01QLp4Yzs0MBr8rPF_BQco9My;7h=Mz-_=W!0o_?fiDBG*TzmD5@Wmq z+yQ(Q_y%w{@M9nzMFhVC<^lf$+zY%7d>zPV4)6_@VQvF!0^i0hYOn#wJ3u~mcn{bX zh}+NL{lE`^4*@Z!WpE?#DDYL_G2mOk zvw&g1Rlo=!A4p(&!{An+4crBc2Ic{a0Y3&72c87R051V!fnjL;!~qk4C4f~UQF)XE zsSW{8f`WXiQ3^N_SQj2*X)(3J<^G3kSjIc4tU%)27cvP58ft+Y*cvz;UWq42%Xz1<3~X1#SYO=@5J$ z*dKTjh)#^)S>S!Zo4`T9c+}K`fn|Y1fmMOSfOi9j1Nro21aLSo4LAXq0n7%D0WJlO z4a51r5o8>M_krVq9|I=<&jBX^F9Ih6{{~J0#-WDK0@eaf12zCo2Q~uE1U3QU!CbI4 z@Dbqsz}Z0gs0R2H)*k~t2h0h>`M)1zE`+y$PXIpy&IA4loDVF9D*s7fQy{u-g6)7$ z0S5sW1E&F(0CRxLfb)R@xDvP$_yTYha0d{LuHb9HXMx9ntI;bI`~+kT@Mj=io)3nj zhF%M_fa`#KaI*o}8HhR{*cG@5mV*nj=>c`^dbe<178Ln0`3By0=@#g z0Yn`V{2ds`1L0l5ULdwFKNzXH-QUNW>UJly~SBY8XFv}Q-O4UiA z!z^B|91RyH$t+gjj!qbfpDYRvkx_Qpa(=))s0FMac0(S#kWfYHhpL_G#^a);`eMF|D1E z4Et{zUup4@cD$;!TUz@|Yd%~VR4x>Am}Mkst(?|sXswRc*dOWSU^wc3Qp;e6q!N2- z$3a>fsNtCVPv^G?0nOYkU7Eswg zON+C$<9w|x)Y>YotxZKCK26Ypb-jh79K) zj{8 zXsw0TT5FACK~#J_wKhm=L$#LaYUrZY;w)D*W@~M}))s1QmDbj1ZL8L{Yi*y_4ruKI ztsRpL`)?U%wD^^Fyri|OTDzsSzqICya`(8H!%zsdR!(a*v{pxJ9ixm`C%d}1V&0T* zt@!Y~LC;znOnL9etDhGythil`d}caMYPG=@O4d+Yd3&a;9l@TI)^6I`Ut3p!Jt3`Y zwRNkuz6Q3O&ky}Fc{$SYxOP0P9e)IyBdu4p^`^E~g5^gIE0IPi(X%?>Rb4`opsmVCB)u0#J(oP{z8cTs9F!`4e;KVi@Sl# zYE|3$Y=Vnx=dCaocL(Y_>#m(o9ShpoPtC=(^A?$x8XWfE+FuDP&0DAyC0DA(50DA#P0(%1=0;U3=0QLbs4eZNX-IXA?zYgvM zVuJhNe&D^pcYtWp1>XY>0)7J=0_4M<`+;SUprOEuz+phle`bsT_5h{EjsDUA=kl%HQ~rLYb^N6 zuQ8jtDsXcxcGOxIt@YR1K&_=~ZLHR^w8mKZLlanQ^R&iBGp)GPt<>TshoLdAwcT3V ztF^ba_P*9mY3;PuE^6&3t^KC8Kgep~&oaVsUd{x=3sDZUjIvrwc9@v^gY|&$t+B=p zOG57RFnZh*XIpgy;NqT5&D5$snc6w)u6;m=eYk5E_g}>rv1?-HRbO{G_=~5Z zDv)HVK$2O;HiS_c&lIKcTv6I#t?}ek+6k?l)7p8hUD4V##cE(9ceKbSu4*HGhuKCc zhl#5{Sd{}9S=9%_X6C2dnKSzirpJ$ud4j>+m7JcaEw~b0B7Vk9hs5OY6BSr7!edL! zXzGxdoPQ8=Hq@9L9#_hk_ai3fWp^bRD+jT1iS26{DmhRhCg%rb=iD7JIlsFrasHSb zFE(?D&38C^VjIQJXyK5UoK-3Xo|uyHF*&82mDqT!>~mKdVx>7_-~$W>jOho(=b8s# zyK4X|A9$t%id}@&o7T4EWW%I7BwbH@@w~)bq;pa7YxYUWoJW(fB z0@$C@%5zs)t7&T^u$$7_LR&j%D=rKMs|GJ?ekUyIawq2TVAs{qrK#FHTbt3vZ2Tev zFV@y)w3YdFSz3ADuabqXSSRYY!B{(a*_-NEPiZUPk^5d+e*|-eE-}m19-~{*_*R<3 zkyk2ebTK+s^bs20NGo~+9V_!xg+)i6aZXy%b>~>oIpxdreyNwDpL#a?JfJ(t3(RmsH@d zwfQpG4r#s)rmVNMm3`#fq?H4flr> zPlMa&iBra>WyuG3tQxqu7s*Jta&a$$rJZ%xUM0ldEX3X}#NMClI0$+JX!Xg(-N59K z2p$fxFAA}*46)-$k6hdY@+A^3Zv5|Ko!i$5z>^iZxDI##A{RFTKJMY-+C4Z`xVZLc zXWg||2(i})vA06!c%cY7g*XffiC|QS9i8HZ!Usd_OGE7JR^;L)a3?y)<>Kza>md&8 zOXT9(zX-Aa9Af`1#2)DsPd9v=v+gFKN+86cZiqv>5PSC!`>+uE*bw`}A@;c;_CYH{ z95#eFycS|V6k`7*#D31TW9l4VVu1aET-+V@;nd^eW=KhA-L+Q^vDXQ)w+^v)4zUj@ zY!Ad`6mZ~uAQs*VvYq5EtQL4H*cJlsskwY-;voePjsD;ts0h$93&z6sBQPF#30MdC zGq54>3J|xA##JD04-Gtu<w+%< zYXf%z>jK{g)&sJGx&iQeAhJLBGq5qxgG1Q_7!E}J8w`{MLCZJD*U9b%HU+i>HV3u_ zrULH)_64>D^3s5IoV=T6&yBiwAyfA*WO(F)lA*L+4zuKdbfq29+A&ryN<67W4mniX z1+B4bNol-xky*xHS~Ib(v|GjLCTnfB*5+t!q1Kj=v5jLHYqYrDVaP(Q?b6x-tsT+YF|D1{+E-e;ptY-7yRNmr zI6RsAZu4|;v(RD4Lam|9I(`+k#3k#=9|9 zj*2-9IjFUATI1b;@~gwkyOV`lY^@#JX^nT*%CC>shH5QMYvZ-X3QTQew$|ooZK2iz zOSHH~i|e(vU2D6vc0g-Kw02BuC$;vK)-Gu6s@AS67T|fTMH97@N_8=ZAq%xuPHPpl zR!3_Mw8mQtm0Rt!##;*~2emd7th*A^v^ZWnvg%cd;Z26}o1-;03zW9n)kM;d)+I4$ zqxDe#NK{R@j^J_{3&vh9zx?1Vo5+6oO5{+Sb$))O)L_qr*IFl$^Z2=W#ioK;O>MijmEcDrEmuWahF5L95r!*Y^yg%1YF!^ zMSHa>n;mZN?+8aDu=kdie2nyvFT7I2Ra##1Cjl#CeKJQ*u^Vm*gziAxtOt7orvup? zJQFw-h<15!I`9!-G!U0$=ej|rt{Y^QvD>lQ#$Jb6#@kwZUu*2&LI`}});RBq!u-i9 z%}%O0SJojT*F%@D|79UB?!C`_-zzE$@3KYr{fXA>x5N1{>8SY&$Ki{$a}My|z)sI- zkk4asS|T!M9V{m2Ask$19cj)geJML%2ro+yz9n&K0{*b2C)-EQn>!W}2M>%DV>Veg zJegiG7{{Zp~|ib&J=m?u8Q)i-w`Z83Y6a2Nim zvYc>fPlUMfyfwnpKSK21Z1wa+M2L->t$v=J;o^_YRt-!cAr@@1D)@hZv&;&-k9Q}# z)e@xkxVZNPt5u!3pJbKFo_*MOv_$sow~a@m-Z= z*-NvKVcD~<7+Gy)p3YC%otv^d=3vy^53>BZ19tZnhqqW20x7%m-^Q!!hG?GKGa9ec z>4PypWoP#6okmu2Zpu#We)Dvh!`X*TyiB;$eH$_A(q-hl+-MJEac+D4`RnlcDciDV zZ!@wQ=l0y@x2cCn{@n_Qe5}GMcmhA&t7NXfc9Lc-RGyQ&KJ_^}%&+Vxle=f54QEY!#t& zMqT2Fn(W!vjI5#&ugspk(#S#? z^W+Po^9pPuCwD*&-p{;wwoJk&H_y%=5X?;p;;?I%C^2N4RW|Ywl)Bu7kBCRNSrafZ z%GGUFjl@YPs%}hWbC=JAOW%caCy6@St%gwxSp)E;%wO`X>f(GKvuYrw;9_#cQ&0(u zi3yMJ<|~o;^nbG`A8eMi+x(BluNZ#CF=)+s1N1Ji`%qQ_e)-CJUr@h%RjZF=U6Em_ zl1%{PU6NnkhvBgrt_!$d;Da`>`uJC2QKNF)8vIsjjlCGRupz%}*L264-}q5m*>ib| z<;!nW0#)WFU|ryX%Mch#v)^bB)=_HgrsU&DFGrp^QL_iJo%CyoYZGn^5Q6tEij4!q zO#`&Yz*@^#=7FhLo@UP)?lll0ucAt12OT?v{Ki2rwRfL_;bsLIN2B8Q11e0L{#zN3qQhdP`js0LM!q33i!|yk~*X$qd z$0;+EUmY;z*H*Lpz~n}ZaoTT@wyu{9`|mg2(2ggx;|;Lta>LQMe5hzDg5g#Wxm69U zl4NzjSRVXFS1`8R{6>am9GR-ZJ_W{ZI84l<83s%Q9Fap(m6>BFaN`Qc*TGB_KfiGT z3^%vXz5r93`wdKmh=_7ua*743DgFFld>G(0N`aM;jH6h2#z7RgA%@liEKV{M zp2FRu9U<_mc5ElGLBfUoqnM%6pfm3=593g@2zjT9VM@Wq`Akl#Nem|a?z5^g9(RF@ zyTFUDS+V*l^qN(brkr{>BF^!v(xX?C=Al9paT;%IiOg^-*3+nkxa%fXa@QrJ}RK=a?CC=RRl{eoJf86vnh~2COdN;FFzmQ%1@v~~vQQ@MxZetB{l;dF&MNfo z)=+GYhYkxj`IEcJ^0ABa)r(R+aod*=Q5%k1gzuK`?$~eg9Zu&vG=#%VG2xc4X~YH4 zhs4%fzPf&nL*Y#f7Pf!)!oQBVe9Kohwk;$+#KS_%Zn5Z3Uveymxnp6HcDhL_?e77} z>3^eTo8D?H+vR-K7z?v?i|BL5SJ7VutCN&U|4sQZ^@L?@zGa<`DWVB1c_Q+*ueLuG zl*8Y#F!)N>sdRJ<4hI%)YMI*9AguBrVWID0*Eb=y9i%b&{tJ|UC#bLH`_I$`^x(3!!aC177I7Y%d9Fbfec8ql!c{&7u$DHc*m=m zRi*b#ddm{T54sz?rQnb6_qcu5?)yHEt7D}Nm3%&rv zQ=j1Lz+~XZK)g2*lHZ;0WMwUf+!cp zEFdd^z(XK7e#XN<91r6WU^C!sAfMYk3QPe$2J8mR0j2^U2O^QiJm3SsCxO^FU*!$L zmyM7hY{nwsGT;*6D&SHeYm?=`T{!-n!XTIjK>*(ct^^(j!Z~;jh_@DlUjv^7UIDHF zUI#u0ya`+f^q~$|4`f}l0m$hIHUg^wHvt<1p9eMtZU%M+ZUJ`nqP4OWgw@eYz%<}C zAS;e4)`Lo0>+CF*_yNs4iF-<_?$?#L~S|Dgl$sGsEB`+{cJF+?B{Ki()wwQ z^`+9bY3*~Zoz)sUgJSu9h;8t`Nk!PwVK!gBaPL>1};Uad7$E{?{kNkxd$(9u}^DDAe^D&mAzT2+Tx#t5yYYmK)}@Vg(`&v{N5 z#4w%u z{ADXSz?Q~22NZhRx*RUAI?&8yI&FFg(IRV&dm%M@*QTZ!e^(8FHE9O@Ix1jg*? z67BXbg{R6uiT+E~==5*Ka`C@0HUDY~ya`jmoC?3RQ#sFR&eA!}_g=~s2*%||hsbHt z?#jLr^%Z7C8xVD-eHDkNM4f4y>~Kz{R;u zR1&PDWXr%}!TfUMF^AB3*-fEDUgrMB z&&#LSj>b#CpHl0uwXtBoOKrT?=78Oh+T&Vd+51ImYqho$>}RR5uPvZ9{4VGZQv3-2 zN;?Pkt#%P&q!K z9a&9$DjnHnry@KEc0y_#wVlHra+_KSLXFTn{0;5Qa*v1CE8g_6w$Q~R_YY`)ac z1a`DH!FU6PDa^En=ApsT;x*3W_Q-Mk4dQGm-qMZ=Eac2z4@qkyFtxcZVC-l0 z%gf(%Y0c2qhqRSfzbVqnMzspN32Y*@fP8gKiElxCP&)GB$TE(8V^k{{l2zeFPbCIy zq|_Q|ts~fQsj*K{`3(ZQUuwg&#%A;$sd0keC)qsm8d;z`X}ktslRqNaBVY$43xds% zEC+0=WPEM@G07HyJu2B^uyK+t0~;h6yYc);wAV-li;=8981G%Z#=t0?|Ga|Ylz_-9 zs@E6+_Kysl4t86zv0yymyv8^%UWdHKB(VQTmIZcMvYBA)E%zFafPE)f5bPVta=>;; zHVnAIF_J+uq6hKTE7)~Y6r z`MtD)eUyz_gbJaZmW`T;#GAfkPs3*7<#4N_IM1%ik`dNCQ6bvuCsHjdS?s^*vugH2 zLNesX#0t*)v>1uGqxPUAx|#S4yOX#UVI>4OAdLg4-GxcNhV^s^wH^IZn0hzqXCR)! z8W^w~tO)!Mkk@kzIFKDRsPcl(V*NMZI^gfX-N2i`eZX5lj;Z+*_zCcDPEf$H>iA+m$Q@t64wyM0OCaO`(dS{z1-=5rHBffM%m<=N!B_x9 z&j2rovLj|OkS7_sr-Bhc0ptWHD}il*tATt>v<5gCxE{!fO*Q~G0yhD7vIFLMkk=r* z46KC{b_b9TfsnnyyMeC)TLCc|RrY_Nzbn`m>wAGb!QTL~o8mr{6V**Yrn)J}EIBVf zuer9d8h&J!{2%~YBz!^rC5UXCSjHYOHu7va@iUoayaSDOj4dazBU3Nbv011luO_pM zZ{Wwu+%~>*m?h^=WVLR~Ss2MI`2dO)ylq6_j0=!ja?(mx^|qYnlFTwH^MsUIb%$AU z9#K~Rww!sC%#w3~@8TW$ml3*Ky9cCG0z<6=6*#p80F`h5upO+-_F)lKTb1=zf1Uh;gW?{Z0lz+AqY~v9A$t=!+B-;$OY|^sz zU~&2)xp9mMa+t-bh-7=iHm*4g@4SJrm0_dkC}tTo!PFVSK5%tL40N?<+1ys*0FiXf zDkGl$*=m$G>$0`W1CRfM41NGu8F(026LxnPqGQV@BArrXo|*(J)JFIX^s^B|B7^Ikxd0 zLXcT<5*lO^v@f8MS+Y`Me%Z#4(8$ow2-b{QhmJ;2GS#)pOjKQ~WR}6lMk>{OH=E2_ zal>jWlJ;8XWMK$G3M~w?rN+X*aa3OUNrq{XwS_iWG8TsMlCdzbgAsE|gR#>Q&0erH z$wq+Tp+emg8I`Qj(^5Clx_hgpQ8XAj%E$1I6 zvy7h5SRibpkHaiE>n@9iEvEn`v*fb{77|-ds!wJavk`*D#g;QtkXiEj+${{x;cYqO zfn`XIxMvx%jr9mZhMr|GmDNWbW{Ea8tjT$|_FARQKxyp!N;vur76&0&DwrC{doS1u zXzGLEp7i5DFcmeQ2C1lHz*N-o{CTOEJb#WB!}+sW+$m-? zk4D721H)aG(OtAHZutY8{&#w2#*9f5r)0^YA?^s{sne#6P8*dWpY#ugKNok9ak^U7 z?>23A)?NF~5IgHvF0S1~Lb(KEQF=KvK)ss8lf+$0!-W?oB+uZ<#N`m$y7Ya^Y4g4f z#0@8BpqF=qc=j9YiuI3y9IkuXynuWOyaGH2 zw2*+WfC<3!K%TjCksx*ElBqM7%rZW4thSu;T4~>E?FWac$9XC&ALq>t>&L(zY(j}% zhp9HP(wG1hVI}RyE^4K<(ppq3 zj8~Jj*b%?M3hX(_Sam6@EKLu`$kMbr2BqnUI2vO$L~Z;}jMbq8i_nyeQCV`l2#Ze_ z(LWZ`3h?k1LnK-Fak+?G=$k2v3*`@GV3nK%B+iyL)LwwMwj)Evyyo>a%2$C z#ttF~tIV=^tnS8-%P)8c%_yz|O9F2I%L0D|GON%t8SDc5FOVa&@K8=p*7^sKS@kCn z*C+#z=z`0DcYqs#e*yOb{{g-Z#3>m309Ctzhe>i4*D&B2=(x8HUZfp(2^aVOCy)bhCB%(lOuG7c0s|`o+94zE);!akz6t zWie@tFI;#tO}{ufJE}gu!E^0KWEt^y`N&wap@^vv+1+d`Qg2y_6&s<{HNg*E0jQ&* zVpS=NFq%TcDHYpn>4`J_@R{{Yis5eeZmgr$biPe|<2togBK1!z z(QLhR=h zxPwP*oy4*`RxQBcJ4jfkywi8A`^@;R2sscV`ZykIs-e=}Np$?%syB$^ztWAV4`xmp zKE?S4y}@1U0evjaQT18+sZ#3=Z5%!oK4nZsmW~G6BqNQVXHK7zIXz>F6Mbsl(Z8+x zJZ2wJ#kAiu`-v;2U27;mB%Yu1rZE8P-1B>hPA+sT!1*Ez_2PzE0!828I)C|bc#OgH zK^*9-9Oo-3YSxR4%@ZEGtZ9x^p8&sf(ez{bQL_Zn8hR#ob7eh>WmDG zNC_l{37Cy_#>XXpm%@xkomc{5WrV%foFkfh?OHy1bIBIntD%5D;kEml^Tau?T>;1Y zj@NEuJ}Fv7+C$7-u`<%W57XDk3<-;}$C}H;;!JO6a|Mf28*}A~t`QYXA(FdBoa{N%~j%X*NE!oGb;*E+uBZa6o~ z*Tcpztc{rE8=Np3oiJ{0(2qXOHYzy*!i?vg0Gpiv3CKQHaqGo7%Py0&#W8O!Vve=# zGF4x4%-bAuen#gfy7J8 zjR>3_hUXPAbfWJ;b2mc_G53h0(RQ<{ufiGq4(dG1oG4G4*Q7Q+W4v=> z(YBafuiYkTotpVjh9PT|7qA{~OwGu6P_4g+^(dT%Y3XWxJJzF(8B;Q|GGy#K#Li+k z{`6gZZ|Yw7`24V~Vdoh+^}us2yuJgH2Xxhw?n7%@4$! z<#7K{jF^nF_K{dOIii-R7iULRWU1lNorYijVF)vhIY~J#2FBSHd~V84%9JIQLdxi^ z5^fq39q&`Bd>@Ll{pKfmr{e5SJ;iDok@4{Na4V<9Ilo=K+!<%1`5W{YXPqd%6q84y z&N$mQ+TZRgNBf!>RC!aw;corIXwO3{7}o_S+_yZ%DvGV~b~W>&xIf-*B*GGK>Rl4! z672ixu%hKf^RnZ9g^0}*+_MPB_KS1oCfZe!zK52-xiI5~6eK5r+1PaC7LCo z655z(*Ka?+P!NytmlNb~A~xxsn695&7os&LON1FG8hC8KcyXk!c#SZgX*g@c9U~tD zx!J>ugv)!25vA2CfSKeB^-0fBIdR*H;H%5369x4&PDgaW0Z1ylf;4~ zyG)CVNPvlRnj0@05}b)E2Q5DnJVtpZcm;7D!2_xSH4XQIQR!czpbw)^$H!w-aiXZ| z_`1iju%BsEcl_=O@nf=__;3@2)Yo(zYiUPMEXyg6se6zZsNgx<9qT+ub)B&FoUpDx z?eym_fB(ab29AG2>5uIf4A2(N{1pt)*a^_Y*?@a&xB<81awDwgnmNAB9bX=lRQPd6 z+;Dfp#-H4V+zAA1=>%*g=9RIl`|fd8+lako?4@Q~(W9(g%WNlRmbDw1cjs*@YxgtF zPAkgWEzQn(t;*X^dCaa@ix(G??V9Laimr&ONYA{~igvwlal5KrI`6Bh_KT(mAJ9BG z!%hhFM*L`3OdLNR@8aTW!j@L5)YL`8)%r;7!HikXMWe4=&q&YAQkQ{#ay=_!rnBB( zu8*IXm6;#!0I7|fmX)QofN`%BXN=9r7$>hE_sR7K(q?9=Cf-1`J~C~bvJX=0V=>K- zOzdFCu3}X?FhptT8PhXy^RKk~r8Y{(J5;U*Mmfn*PQ#Q_p@74sHhG%6rz7P0w5hoI z$^@jz^{KO_&KNIuV5D5n8l5>|jBb05lG^w&8B?>SO>r))>C{>o>4n4$>6kuc;v^OM zXt_QqEj=C4VNa?V-uNWcGGm}O7xgRJW#XOl2a)C12$^Da4SP(2dwrS&Zx+DG#9-d8 zZV^wG_Dqdiy6c}RomC?=3l>J?hM4Arm@Y%8(DYHoH!OYc z(o^hO?Ye}-_Lvh}wvJ70wR?!)T*vQmaU#X8(I|g2&~d?4EpDD|?iJ6ihjN{O3q;vY zcB7%HDvL4}Ir3A)AV%aOiU_2dQPjeZ)jO{yg=>ZgV~G>)X(yapF)-dW;=*KK$-pwl zWx3;0+{jNYGDbEJ)D^)r+>7W+?Hd)Vt}OW#-ZR>!_L5=UtB_l#tai4!CXUY>us?2f z%MlCt#lSSyI*#j{NVOj#E$Fww@!J^U$NVYi_q^k`S^EXl0c0l9Q8gt@V~gXs)p0C% z%v@i0Z(eeIw`t#~SYCg*xb3Z%wJkq){mk7|r!X*^xbghddW>C8#INYU`3ZEdFS{L^ zn==hW+b(wHp=v+!x4$pnO&&3Ic{Sz!lDqAG9x0wW{4q&Pj@r*~-cLnrs$Jb|vGnvmojqT~Ew5;f_MC}ZKHqHUIUBe9fZ5b@E>1jU zdJ;;1jo6%m9h;0@aho&eJ zm-Xh~3+~ zlDB$@ec9vrMTHSB4YRl56Waraqr&vuP-5Q4BkYT&`CH!Zk@ii$=Xb~T;~Dlm&mVDO z&`i6bxgzhv5}z=OH^iojJDd75PV{-m9__gkC-yyLZ}9vbCx$+3pEV89{1KEWPu{sl zY)m*EE|zq`bK(D#jw&lUJZf(;y?H-9YQJiFqDsj95Ql>HV$%}4x>)fdV~+iy87=BR zX8+?UUP4S>?0wu5TS8o~5cPnkLtkPVBVWH z&N*&ek1~2q!}VTXU%4J_^iRv2kd=|{T+Az#5Obo;US=b4BFanzoLq%F*hVXSW(BMy z`^+JL>#H%DZ6h(~8JfgSpII5OSa@3kVl6Y#lZ>5v##*4H=hG9< zJx(=xPMez5VQj{z2W4q)B-TBHL{>wREwiq;IwmYZ#3Xp`j$;=h1~p~Pa!!LrVsL_| zI{HwqEV3t>wZ#2Tp`qAVEPl%F;Hg_e+_TbGP27IU-icnxZHw)X&>=Z;CC70B9dRk5@k+!#Qmk8M zw-wt~qK<5jXmNYx>5LfMrIe^&86m5$Lc!}Q#;&r*n}84;rPGj@v+b>$8zk;X9dS`0>e zfIWTjqhE_g#k;>SGsnWnITZ*|x{)^3O0rB0o?;s!ZM|JeRCqYTE1rGEE-yMf98pS~ zB>Qcxuat;<7A&$(R4LJ#?75MVrNmUSMyu^)vFlkoL1dEsNH%>GtnsU1{cJTN?N0VB zwK-(%)2n=WN#Ei&9@f6kG&%yg0vbkip$r_J_ zXM^X!u2UOBR(&nl8nBY3v7a8J?v(VjtTeUDWyJC4?8@T#wMc5*S|s)5F^HheT5PJE z7`E1~Y?c>~0Yv9@h~xltF>)+CekFUAT8(vxxMGorD~ZAD5Uc_-aXDPXW0?r{5!o7Q z=6bMC$(n(g)x^E)v9apnAwWq!L@AukyTncy#1k73;4*{0`v9V=xB)?HinbeID*j-k zS7bsE4IhMQEm+CgMdGO=PSE)|y4V{Lx~{0X5gV>2dI4UV2a z*NORVBRM2Vt<3fu0p4KJL%H{K8L`#wAION%m-FdVRA9aLF0y4<5$tz0={P9l5@ygP}zw!p2k7>2dz z&e9EkxNyq)!R#W+jf*Vf^P^hf(nWj-Kk@NPwpaYR#V#MsCyMGo&UHd`6HT`w;%;K_ zR@CC%#Rjf*7w>MxW_pM_TH>m^QMO*Gq%ERJ~zCAYVz`;uK@ zIKLCu7F)qkAmmA7FwWPJuQY+eLG<|wYde08PAkn>Dx;C>RKgffbNVDx5!+tERs-9y zL!V)*Vk5V2Z^QQch??7wyuP9rAi6ICc<@8LRZL|~Ke2-Le&TgPfAKXytbG~5leQzG z&&Ya%mAqF5Em$kvCxYAI+-?V4-hhiaP@JW3Xa|xJ_AGJYX$wA7N!T_{jhJODY&+VtxQs1-k9@^&^=N^B6UwSSm*X;78)ZGh4GcBKbEZ;gZUOWY> z*vJh8oDE>#LN+j2ZorMA+fT8mDOHwX)Iq$s%_w4a+Xd*wy1}pM=K6H;d^6310SNW|~s59{^Toh(O2{WhQa=?=Q*Tg<(6NIMy zA?dRdSAjWTTxRLCZ*tN;%aCcWq00h>xx+EcbT2eNw|g7K(@p!q1d+HGY5(pur2R~S z=!umEu4{V9W1aI|e{;4l8_^XmD36M6d+aivm_)IUan0R>xN0Vf|6rvQhhT7dac(@$ zZFjRNiK6O0yPCMQ$1d&}n<$20B{rhW)3@_oo=6l+sCI6gay?(&oG9Mghixp)!#3VY z6o1j>mC_?~^Ia|`ibk&^?#R7}+bktAUx$B_z3?xO<_A_9@G{D!bf71wo2I+*aEZ%2 z{0i^ie6e~j_U~R)uy0_OP({ln{Tc6({NPhdiFUNI=yA#G@!Y*7*k2CSmPKBQwu zDX|?Z6PGB|mP@k7A?~3O?fS0Xtsj zPrYJ;kLSAulEl>m*wU}qQuEbLm}Nz_v|MhZc)n)csk-Xn7Q*Ef@@hoCdB~3VrfiOyW!3nZjJcJ;DJjY?R z3{voVu|_6^(^Cxs%dS-gM=CVA94i`TuCwuW7#No|I=M%knAgZnqdn2IIqaMOgE2d8 zwW?_hgb`r)g_-WPt6r6VFsju(S1yzm=9|d;m;)%9G0r7o9ReVGM^0tUESL47?E$;Y z{lguH^$=wOG2MYN#E9ArY`jiz%4%z+y-*U>|;Dbf{0!5Uk3n@rA z-tWWi;MOERp3Q}PxV?Ra6oitE`kgU_f*mcZGJlg;cNm%fxf5m+!WYi`=b?m|?(O}b z^**1SpZO8xxIGMz!%vm229Bb0v2jz_G74?Fb0HswABOv4_6%Tb>x*yNW&G0|kIg#X zmy|=`1t?*rQ=J;CUu%lu>Xz#xPAK}wqR@l|vo4w_Yk;yTk2&1rx3vr8-|a%FL2hB< zH}$HE4%LFiB^D>{8nzAPNzkGZSSlr{;Lj*tp8s5uog`H(qBJd{bStD3tS`18rZAJQ zQ9cP)>(st|7@=;07VOK}DxDUiDE9;7vPD-I!=0$NAVD(G4Ov?G&K#qb`N3T^_zs#< z@*APJ=ED+Z#?b-GgrsFXkgIMbI<>qI@8Eiwq^!onE9S4yKM?E7i(|C9b>-mqvp>kU zo-HrJ-nAQhVk?Li!~qq=L|~Z-6;xz90P0?p>wKYZi#YhMUB@%Og1Ab@Hyy`at|N<> z!B_LPh*s~}b;@9W6 z#{t(d6;p%yV0?>ki|9s&KOKiX+JRa6igb9I4y`I;9ZMd5s(#`@SRx(H!ol-sMdAAZ zX*uFJ;wU?gEMk1qaf=xE0b=^vad=%juvqfd$Sqgmop8=Ooxe%!y)a!Eam&4 zTSU}Ha9HR#9CjTVGDrCa=@yX+hdP@bha=j7Im%Z~b*XK}Abibxi+GW7zU2gYQwL$r z@U7J?;szW%7b=O0N0G->DnrNeHhwY#8Zra;`s)@k>8M?&+epXZ9qqsj;QO*gPmp(E zQC&qKhHw3Mk1|rVtg9@3#0EWIRu<)s0ZUgA{fL9Ai220TRm36U=_=yCz-lF{s&Huc zIC1oHl>FLcR8?6=iZRFSvYx3`#oXiAqg{?0+G=W#8gY+)Mmn~LQ^%1vR~?6swFCEv zuPAR3Wj}^Pt!h}uasoe@CyjVW`BL*1kxqw9$Kj-Q;34H(&|AbdI=tvOeBwGZ=J9!2 zI{Ze5i;lym+JT3Z?^)x7JpqSG)v=D{6n-)d@`^P=I^@tH&2jilJMiS_EFF&0VV&df zxprU?NR|%%lW_Rjarir#t=yCf=Tx8~Yi`-p3q}@H zn7WmP6efogKd4XzFD2&~kNF7x`Id(9{p(+%3cwZ%T}r-^POBlugK;^hFC}p`TqPL^ zDtMXr8ip_vCx~1|k68Z=vrjEmolx{~8x=?&mv2P*Ptok??06uM%5+waMo;{hw$Nu83{4G7`#B=`tDelU{qByqw^bE5%Iw%Y~&ftQIY~q3%;*1~yf`Z@@ zCBg_86(iyn;3kT>Sp-dj(Ijp$pYO&!am%J8F`8YXiN^K)PIV89 zRazQ|DBjs_N>Rs?$i38Zpr%;cA~xBe3!t72EZR(aTvbGgE?Oc>w$X zQG4dETbKcrY2HOkb{F?GIUl0o`A`dkONYNw;u~O9f`$lK@~1|x{KGOcC2(f4uY&qX zdnLXFR%Qltf24JEixS_;`4A1yhgt>yn!y)r_GzOp`{YwB!`zptF1e{lO9c&nk~Eql zQxD6NF|c{7rJC=6RS85HimSdl(cZo_UFI~UsGBfA6uxV2O~C=Z-6+cg&FKmoeA*Zo z7%LN80Ua*|Zx^d67glk`=!u><5x`M`roO&BCoag;<#FT&vm(&_tnz z-I7A&HOgPzY%~lhCJ`I1wzYSaEjkNH56di9LBN&c^P_BHVJAqE1|WrH*P`yVNSY|K zH6cY}qlQl1zP+U1nBg2oiUl&uZ_O;!B$ED;_gOnsL+J@w{h44?XMk}++2^9^9Jt3w|5eFhh!9pa|Vv*9ME z`4ng`Y7Z1{G2Yd6Mpi>E=1aF;O3wKv^zrK8nxEa@XqJP3Eq8jbLST3&&TnJCv)?Q zi;JcgDr~J$v;jm;u=Q&YuNu23U4|ZkuA|ulT$2$0+C9K!OzrB*$+5ViBI8|mbGo=z zOdQ;>@0#(Lial`~|2MyW(^%DEMB%*g{1iyiOvht$*+YLC|JiWx7S1HGUv3-y48v^6 zBU6SCOHN24$5?voVhcr~E#LsmBQT_TyTUv#f*g>%aqhkg}N3-Z6m9JmSfY>;moM%WA%!Iv#JrK-w$95JjEoh0^Hxly@SRB1P}K3dwSnNuY#AT>gp$uz7@ zLjw6;T%GX{IK>|XSmEI8#?@e-JQ!~oLlkW7d-`BCwe%on^%T2uuq%PyEd4!wN3WGg z>irN-LE@sIm$FDk79HZTXYOGs3wH5kjfZME?uNXlw|e=5a?QgyjEReaQqubifV+XJ zqTw2WI?rF}Jq7r~py_P`fMAr^MF`zsL(SPa_CK=IaCQbXd>a5@NxGBRu_s4iO?ZG^ z+FHX~JEi1d9M6(zBuZ$hFb#vjqaJt6nm!fVp9>0S(+R#=`A-fGrJZ>3Vc2IL+c(TI z%kemF(x>OoDV|$AbzbDSghA1f31hOuEKZ!^n~QDa@nM4^qa*vqMEC6*85d@mJ*PMy zKHiJx*yrR=!|9`Z+FBhSwlHo0(&kT@IX!=5;gi|LMTKCDnVKIrC3eanM@(T%Tw&~# zuuw}>;_xK<*tG1llwpHI)3e4w)C0)TX^Erk>BF;pLoH~C{Id&msCbw{S{s_cto}k5 zR^LIi3Kn+aRm}iHkSg9wk^e-2f~SSB(nCrQX16G4}zz5l>nol8UALJ;xNzEOg8*%mJ!E7I{Ae2Q9PS(S^9y zzi4t@+}xMVDptud?!Tt_w=z3{Ra=x6rt2hn;?Hi<(^dA8w$ZY;% zn7|`n=JXfGsjUjF*C>{;LLH(G0XT+5uTTeaFqs`&jq`cQ?3dMQe?(X9I*Q6()ly^+ z6A)E}h;%c14N91QK<&qKZ`>yM$k>vVP&1TcttXUS!BW3gZ9x?Cx;7NiOBS&UHfvnnrwe5V z+?l1i8n=W9sq3}|$dzsHrKHMs^ioRFQd!x@$^f}6vn$kYtXFpde9S&qnSA_v96NWnB$ZZNSEae$<}GCG8z>oRdG|2&diIN#u`_ln$wuD8Wxli zW5RJ_FWFTBMrws=%t}o!joDYDY9*4{i&O#1WD~21H2BCwc`X@KtW%qLJ4$0U-IXCS z&wlVgyV+euiW=9cDH0;Mt@lgF%I(?^ATwQ3g?!2jU6QN|CS*5}svzbKfttfbnIuwT zm(psaw2bFCdr71~46{>oWXg&Z9ktnuOH{b4TB@@8cS6}F;1On1WZ84m3+GKMF2M2w zaLf@bnn7z?&l_O$dUddhcaO!gfl%R5T#J%a9VwI1LnO6}dx&I(iXOaxLKSJ@s;MWj zL#rf{L~}OBNX}*p6RBYPqm;c6eN}~{wlH3pNR8I!RP{iV$<%b$rKi}9(wr)~`+%wG zF0)=Bc3}f2Io^|3k9`A|+PIU7?nvj2XJ{{;R4*lEzQwu9s2-TLOa=8^^>6WNkCnRh z^E|_*x3#1}%_v=WL>Hb{_e6Ac6t7IvXdN*$^+sR9SP?E#EmX!*dt;-+McxQU>qyt8 zegfTf+{pW2^hPx@tLh_CmSz0~qNv`;#hvWOdt6gLC6%oyLq~bpmT@ifmXVgMWPm_? zO}n%tZu=%R3gXJ#MI}9%$xFIDf@@Otu9nJZ+sxa6V<2w_d1E+9%>b@tZX~x=sT9@l zs49yKwPxu^Wk(!uTGl9DdBQGUH@Q)~#Lg(rT^%I`@L>makj-l(I$Iaa>h@?okb&1l zB~?<*AkO*0OT3u%iFzu7?L94(J!Y`LEm=*~!mKge^!3YmX)_y@R7~q`At+Qj6@f=o zZjwDMYdE%`XuSw0C;NufPN99?ygAcxtf~->C3IdBS>+0q54I`g z4OaRHkFv~hIv#zE=hLreb+)R91P^Spatu-Wa3>s;JHtG+w=_HomK+S`XdD^HQWg=P{q{~o_Qc(AX}w}pGB=IpP*bZiD^ zI6Bqq`mEz4$1eOX_WK>aU%UX9Jscl?cUQ@qdDB+DnC7*wr+1)P^4(_=en@_F<+h#< z^-_)g;~R&M;uWTm(;vUPIc8J;YgufwmxsYg&c;kaXwmz7s>QVK=eiwPzu=3=G_2op zd_`3F_FWYdqWeVnuX(=z#(c?Nm`SJTM^znb9?y(^}*;%pAegUce?@KSMy+AojuITc^=Ga6U?b_Hwn72zxZ}t zntHKEVZ`G*NA(XLht*+@pLXP{4LkkU&p#g*Ut<1Rcmw%jx@{6p*IC}}?_qnUW@FzK zzJ9K`$XCrOhr$~3d3xBSA%pfjJxP1x>S$%{$!Eq(f1#U%ydOgjj*c8sw_2BY?WOTy zr{I^4(@*|t)uOJdDsi#(-J>t}$o~mz794-dymQ;~t(U{v;Ui_rc%5Lm$WgG3nCm&+gkFophpGR8IEc)0^QTkSCmtDLwzt4uYYau;iA%vpjDq~R(%V{ zcN*sKM#Xt+S&3aRD<^AN4Ps|4-g`_!L#GRu{2L3SOZOyuPu|f7ixHPYr@$)7v8^7l4+b=vfqt`HJ8S`6$Z`AOF zclKJB94&b7wZ?a!yS1iA_xIsgRAM-|wfxfPnCBNnZJp5=l>RB2Gsj=cKcz0*wtRMft+VmBUUpmfsvm))v+@w1@`ptJehq0xj zf%5mX{b>8L!v2rXdv1-q)W4ep&i^=msx!BuG5yFHU9dCw(@*LTbi>9Oo-po(km*yk zqxz5BkP~<)FB7k8PjP>#!2xI~BG=D;LKmEXl^J^A?U@vq=5ij~zEgzWu>-bI&jB z_!TV5@rxU4{qydTt$CVYXb&nOC^u?lBJjYM7PrvS6__XWJ&#^bx_uM@e0}jW3mp`@mqyO6YyZH33 z#XlZMd=~!AIsVSawMEP0pK5yJjiqtr)n_pfy<=oCULNLvdpy1WEAMOH%p14mWWOGd zl-K+>Uc;>-vp+1D$4nDRkAIvwxFk7#z`8Lj(kCwnocbY7XmI?{e%05mtUsYMX#cU+ zbNmU^@%7aRJuE{<(a5i%&zE|OwpqoG*cReVYpG$V2R2W5(5qfZD1AfOQv#~UcI z>@v=PnKq~h&P-GGM8s7zrE_H{xoSMTjX;STnjmI*Ovfq5>$xUl@g`>>h(iCN!tNLRq!pX6EtHCiB$E4>)<}0W!LxHu9(+9cs9iftxq+$Zb^`V^W z|G+eqr}sew(cx^>HD#P8f6hE);<|b~4d~3bF%5JV=PflUY5#*4p{7wsm5n;IdPGix zaqaJ5mddMzB2+h$p@T2W`$X#r3@`J(;k-_fM-c1yjv58!B$G!ei3FLEE-_;bq!}^{ zc9otounT9jaqL32fhxBC9d%E3>xym=+xN8&>bNRT1_Qmn2y-}Y#h|L0x{?&~NQzUG zg&P0_wIz{4esdU(Zg@DS!b|S zG&4o)<4nJakH}KOs!NX^L~m9E;?nT{sW8H0Dwc>}T3+(zPB}4X0YcVo-L>Ps0GAHR zVu+x@pc(J#BnEW=ias!T6VBA=1CwVuVctEE z-RXqajv*|dv)JEBqTs2LFBm5RrVy==yoBL@0si@JEaLHR=M6+W66sjED;}$J$0@PY0>o1fESSV7{b-lEA#xsf4hV4WxD zg&ABaNf?2cDkB+j6yg-bWJo+*xFORKliBdNEPV`d2I8j?!^ow}5N9KHA;!a{^i9N| zEhViVL5!xUuwuq3TOJ^+oFgG&d9t^JGs%!akwIfpfg;I)uhADMcspp{42H6Wsbcu_ zztN|lrEJPao1rOyFb9XBi}5Sjlp2I&Q!1m|rmU%#zOxMoQiVDig$Fwx6+Z5Pj<*sx zs^lfO;#qYk(T^?h5iPWtxmDkT9LYmp>+aW!{pur%PRfByN8LRQ7lm9@E#->-$xT;? zm`pbnF_{i#;-;H{*n#^Z#H7JY#AK34TvA^oNU{h)k~?(?cU_{>0ZArNu)0*y-w!ij zxf(kHlKK_Z2ODX|JMS?#E)t_~%4(BYw83-Zmu9SWoMSi5Vt8MYi?KqMOOPa&AcNu+ zIn~Jbh)6hgB2}E?Y>{XLjU>^#847NOx&fj((I}`UNIQ)JW0Y)68z6}{36MmW2}q*D zy8zZ)|8l@3QPfVTknV7dCHnGWM*maraji`6z?d(V0hDZ~uhzy zR9=E4hlLVuAMPa_vyBwPc@0aNV%jHb%4;~>kJoUTA4DffO$n>QT35(gPqxiZ45W8Y z?&kD2@a5rhhj0Mr*hN1vD~60igh zhP6}G-U1Ht)vwWat-Y{ZBM9jY7guPu3pl7pIJY+d&(_`mGHETOGjoRMuCUqweK)q& zODGV=a)ySF1N1nSKb|?5ezEWf3(+XMvOPiiB|;8s+@OyYCbJXs)LpEPLc7+-@#((x zar{SF<3@N{o5)Ia!e|^`;|K6_r33i6`~ZHgbO1kBI)I-m9l+0(4&diX2k>+G0eq|m zd2PfQ{aiYKkCSgFw8G;52l+l!#0SsY=koLRIAmA-q`FW(X|AR}C3Wn?eq|T7&?(-D zEr4mM?>Ig@wN_e4YQ005MpTtRe>u_^LqUtv=FgOhcBgbp{fR;_NTgr^ruBc3dZ1MT zJzYECy4drwt-Tlnr&--fjJ{c5oSd^>K{-<(|J4e1+JUp+byKt&=3S&Ucc$em3N!*r zWDD3y2mad;ndf8Lz{2HnI(6^13ep2#CD1d3RBb#s1v3>QZe0(gx=NrwKHc@;*$mOb z7zIy-g>BD=QcstOW+!beq(Gx*TY0b)@}g-h>1pe~BcZ)KFHZ9Xe%|%-M3pcFzeX~TI-gc#h`M!AXkf=qJfPiKcWQ>N%2{`6mo<&?DuIScQhHF@nMv() z_Gy*#aKH%O%~=~HqX5ITZuPgT8FVUv{&;O0B9sbO>C#k|{D1asECM&h%ZD$R76B{S=M!TS=V)4msLbWL_|bHMEreEJx^8LTTIWL{QlbcM^DSkm;c}mkw zx1l^hUwcT?%{QZ5L0?B+DMH-84*K%NhEPsl23>!LrY|ELqW9dYY4Z+35`FR;n%;r< z620qDO?x6vL@z)*6>Y>X=p85*ka*xsO}{=u2%-lb(DbWIg&_L%wVLifMF^r_9c1Wf z{DL0XNz?szLw>iA7wn|zCA$g<62I-y^z@sAAo_zQS=&n}y5b}uiLTtNNIbcXQ1r*$ zg&=zJ=ZfUJpigvOpQd-6i+j*Jkyk|L-K0o7a-LB1m&=79`rV$I9=cu#qTfNT=wbYV z{&a^TIR|kk`uO9T=HR&^`rzT3t~o_Wka+3^ajm9N*bu$!R!uK>0QCkm z227&eUZ-i-6A=z*?0iFy;uo~$9!*;<5fUUG+(*;HZxR9|PyMK-5u}^wWaufn9>1VZ zT%qa8?NBeaLmm3DriYG1IUXtG`G`N!3xQ2^4C*t{?&lerfnU(FJ2f4HJRw@PR@2dE z3Q4pad7lz`6_B%{d^9Mo_or3s-#4jIJB<0nDNZg0? zg5>+Q*7V*>ge241JALE^!S6v@8FgregR527m&Cy@BtBZ}kz z^g-ee-`Di$JRv}`2jxI?(Pf%y$RDCBfkkxEftudAJ)R@b2aw-H?><7)9{44?XkSgU z<{DZ^u38{9#SIKZ0^V9DhH@&{g;aJ&fmo=u^mkUIjkrMSE&`A@qn2Lpc*&@`R?tK976Q>kd>T9zR4V`ZM0`AbI#tHNECS zAr;NUFX$tvqeQPqT!}8dMbjnkMYy0>|3K4aI|)hjx+^tZ_Au^2uLqCl!=!4g3`q&KQ8>k=mM4gj0opLMcDd^M#HJuB4q7RK|di|Ne0bPZ%Ao|qS znl9}}d_jkgX}V+fT#q>1Q5_h@>}Q%LVqLj3hsMRE{%4ibMm+t7~q-BHNxcGt8m z>L}53_SUpD?1{E}Ow+U12}$&H0^yq@IWtvEzv81OLPt5O!U6Znhv-L?Z8cVr{Nh=gm>yA zpvT4($#)}viS|S}DMFZgg5=?vK5{4O9cXm1rZ>(MlIYFABs%d%O{*^zlIZyD4LyQi zBE*AejPxs7fM3wS9h!EzT1cW9duiHb7VbgM1wPSEKhU%Tg$bH*k)|C_ z5|Zfoy_$CX8SX*PeNfX*eXs*P|8`B!J6=ddKgKU;hx0YP{5&Cv=3b-eC>Ro zfJbz}W=$_S3;nLMgt+&5O;4O81kvB0)b#Xi=!e~gKI2AByCEJ#`=7081bIPpcU7kNr_B;rOiGOnptfDbwm`AM|!0!>Gt&Jis*+z>DpfEF#$H2;S}620MSP4iF2 zJ?QA|H64Zc5iLDP(;H?%4|L@2nwG2*lIW=WH1*ztcz~8(p=rtOkb{ou(X{9W;DQ$K zZRleBg5J}o>4N)_f1sB|96w0?u8 z;ZuYpTDP;NwI>QmwEoAMhV~VbX!s|ZHXMof9cbu6O>1v~KB#_#p=m+KGB8HCpr-MK=eM8 zE72=aKZs5THql#9Mv71lZvmZgp`oYn3p#U&p_}jvdh0%hF2*nD^qV!Eu{ZQVXQK=h z&A~7FJb&%i^kfU)F)j3kzo=>Z8}L550pAjrDw1c7BOT-DL!6^X&P6#8y#jGmbUS`; z$2ZMkntpi!>gNS`hVRof?;Nx{po0)D(ZPFaIu2=9v>Csk7Rr+7GrgKldjRG70O|tj z2uQAg9nodTf1*R~(R2jrE=c_OQKB_#mM-f*c3{Pt-bI582bT7)ICfyoU~k_nv1ZNk zm3@7wRJ@JETDW4#%H_wb>7Bn~z96GDN7Xz1Bel-DW@{AojnVNnDVy|0Ya=7gA+BOM zBpphmmP683JrO$=$=9{&bsn<5C&~JHr#`lk%Pfba?L=xhBt5O&Y<0M)VUVo0w#_B# zmiUeKaASQVuyQOdZ;#i8g2*=7hDGvDb7FkF-r`|9mX?n+H^p+pBKc^26iMLbmSdzt z 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 Date: Sun, 20 Mar 2016 21:55:45 +0000 Subject: [PATCH 155/445] Add issue template --- github/ISSUE_TEMPLATE.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 github/ISSUE_TEMPLATE.md diff --git a/github/ISSUE_TEMPLATE.md b/github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..45b6856453 --- /dev/null +++ b/github/ISSUE_TEMPLATE.md @@ -0,0 +1,12 @@ +Reporting a bug? Please make sure you've given the following information - thanks! + +**Operating system and version:** + + +**Is this for single player or multiplayer?** + + +**Description of the bug (and if possible, steps to reproduce the bug):** + + +**What did you expect to happen instead?** From 1ae6467c7f67d0d09395fca6db0ab5441d89c705 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sun, 20 Mar 2016 21:58:30 +0000 Subject: [PATCH 156/445] Correct .github folder name --- {github => .github}/ISSUE_TEMPLATE.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {github => .github}/ISSUE_TEMPLATE.md (100%) diff --git a/github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md similarity index 100% rename from github/ISSUE_TEMPLATE.md rename to .github/ISSUE_TEMPLATE.md From 6d6465c225d2a754b8caf62229c6ac22cbe980ed Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 21 Mar 2016 20:54:29 -0500 Subject: [PATCH 157/445] Shared: Don't block input of tilde keys. This will never be reached under English anyway as it is never sent from the SDL/char input code. --- code/client/cl_keys.cpp | 4 ---- codemp/client/cl_keys.cpp | 14 +++++--------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/code/client/cl_keys.cpp b/code/client/cl_keys.cpp index 7f9d42b9de..87a2943b43 100644 --- a/code/client/cl_keys.cpp +++ b/code/client/cl_keys.cpp @@ -1339,10 +1339,6 @@ Normal keyboard characters, already shifted / capslocked / etc =================== */ void CL_CharEvent( int key ) { - // the console key should never be used as a char - if ( key == '`' || key == '~' ) - return; - // delete is not a printable character and is otherwise handled by Field_KeyDownEvent if ( key == 127 ) return; diff --git a/codemp/client/cl_keys.cpp b/codemp/client/cl_keys.cpp index cf2248fa16..16151eba7f 100644 --- a/codemp/client/cl_keys.cpp +++ b/codemp/client/cl_keys.cpp @@ -1175,7 +1175,7 @@ static void Key_CompleteBind( char *args, int argNum ) { p = Com_SkipTokens( args, 2, " " ); if ( p > args ) - Field_CompleteCommand( p, qtrue, qtrue ); + Field_CompleteCommand( p, qtrue, qtrue, qtrue ); } } @@ -1186,12 +1186,12 @@ CL_InitKeyCommands */ void CL_InitKeyCommands( void ) { // register our functions - Cmd_AddCommand( "bind", Key_Bind_f ); + Cmd_AddCommand( "bind", Key_Bind_f, "Bind a key to a console command" ); Cmd_SetCommandCompletionFunc( "bind", Key_CompleteBind ); - Cmd_AddCommand( "unbind", Key_Unbind_f ); + Cmd_AddCommand( "unbind", Key_Unbind_f, "Unbind a key" ); Cmd_SetCommandCompletionFunc( "unbind", Key_CompleteUnbind ); - Cmd_AddCommand( "unbindall", Key_Unbindall_f ); - Cmd_AddCommand( "bindlist", Key_Bindlist_f ); + Cmd_AddCommand( "unbindall", Key_Unbindall_f, "Delete all key bindings" ); + Cmd_AddCommand( "bindlist", Key_Bindlist_f, "Show all bindings in the console" ); } /* @@ -1447,10 +1447,6 @@ Normal keyboard characters, already shifted / capslocked / etc =================== */ void CL_CharEvent( int key ) { - // the console key should never be used as a char - if ( key == '`' || key == '~' ) - return; - // delete is not a printable character and is otherwise handled by Field_KeyDownEvent if ( key == 127 ) return; From 55d9184d89f7a5d260af5a486f02fe1afd3f6c16 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 21 Mar 2016 21:15:32 -0500 Subject: [PATCH 158/445] MP: Add WIP support for CVar and Cmd Descriptions. Also adds the following commands: `help`, `cvarAdd`, `cvarSub`, `cvarMult`, `cvarDiv`, and `cvarMod`. Refs #747 --- codemp/client/cl_cin.cpp | 9 +- codemp/client/cl_console.cpp | 24 +-- codemp/client/cl_input.cpp | 348 +++++++++++-------------------- codemp/client/cl_keys.cpp | 2 +- codemp/client/cl_main.cpp | 114 +++++----- codemp/client/cl_uiapi.cpp | 10 + codemp/client/client.h | 5 - codemp/client/snd_dma.cpp | 22 +- codemp/qcommon/cmd.cpp | 167 +++++++++++++-- codemp/qcommon/cvar.cpp | 159 +++++++++++--- codemp/qcommon/files.cpp | 22 +- codemp/qcommon/net_ip.cpp | 2 +- codemp/qcommon/q_shared.h | 1 + codemp/qcommon/qcommon.h | 17 +- codemp/qcommon/z_memman_pc.cpp | 4 +- codemp/rd-common/tr_public.h | 6 +- codemp/rd-dedicated/G2_misc.cpp | 4 +- codemp/rd-dedicated/tr_init.cpp | 258 +++++++++++------------ codemp/rd-dedicated/tr_model.cpp | 2 +- codemp/rd-vanilla/G2_misc.cpp | 4 +- codemp/rd-vanilla/tr_init.cpp | 250 +++++++++++----------- codemp/rd-vanilla/tr_model.cpp | 2 +- codemp/server/sv_ccmds.cpp | 58 +++--- codemp/server/sv_init.cpp | 28 +-- shared/sys/sys_main.cpp | 6 +- 25 files changed, 830 insertions(+), 694 deletions(-) diff --git a/codemp/client/cl_cin.cpp b/codemp/client/cl_cin.cpp index 343dc0d87a..2d65b44d57 100644 --- a/codemp/client/cl_cin.cpp +++ b/codemp/client/cl_cin.cpp @@ -1617,17 +1617,15 @@ void CIN_DrawCinematic (int handle) { } void CL_PlayCinematic_f(void) { - char *arg, *s; - int bits = CIN_system; - Com_DPrintf("CL_PlayCinematic_f\n"); if (cls.state == CA_CINEMATIC) { SCR_StopCinematic(); } - arg = Cmd_Argv(1); - s = Cmd_Argv(2); + const char *arg = Cmd_Argv(1); + const char *s = Cmd_Argv(2); + int bits = CIN_system; if ((s && s[0] == '1') || Q_stricmp(arg,"demoend.roq")==0 || Q_stricmp(arg,"end.roq")==0) { bits |= CIN_hold; } @@ -1714,4 +1712,3 @@ void CIN_UploadCinematic(int handle) { } } } - diff --git a/codemp/client/cl_console.cpp b/codemp/client/cl_console.cpp index fad2bf9fc9..9002bcef46 100644 --- a/codemp/client/cl_console.cpp +++ b/codemp/client/cl_console.cpp @@ -358,12 +358,12 @@ Con_Init void Con_Init (void) { int i; - con_notifytime = Cvar_Get ("con_notifytime", "3", 0); - con_conspeed = Cvar_Get ("scr_conspeed", "3", 0); + con_notifytime = Cvar_Get ("con_notifytime", "3", 0, "How many seconds notify messages should be shown before they fade away"); + con_conspeed = Cvar_Get ("scr_conspeed", "3", 0, "Console open/close speed"); Cvar_CheckRange (con_conspeed, 1.0f, 100.0f, qfalse); - con_opacity = Cvar_Get ("con_opacity", "1.0", CVAR_ARCHIVE); - con_autoclear = Cvar_Get ("con_autoclear", "1", CVAR_ARCHIVE); + con_opacity = Cvar_Get ("con_opacity", "1.0", CVAR_ARCHIVE, "Opacity of console background"); + con_autoclear = Cvar_Get ("con_autoclear", "1", CVAR_ARCHIVE, "Automatically clear console input on close"); Field_Clear( &g_consoleField ); g_consoleField.widthInChars = g_console_field_width; @@ -372,14 +372,14 @@ void Con_Init (void) { historyEditLines[i].widthInChars = g_console_field_width; } - Cmd_AddCommand( "toggleconsole", Con_ToggleConsole_f ); - Cmd_AddCommand( "togglemenu", Con_ToggleMenu_f ); - Cmd_AddCommand( "messagemode", Con_MessageMode_f ); - Cmd_AddCommand( "messagemode2", Con_MessageMode2_f ); - Cmd_AddCommand( "messagemode3", Con_MessageMode3_f ); - Cmd_AddCommand( "messagemode4", Con_MessageMode4_f ); - Cmd_AddCommand( "clear", Con_Clear_f ); - Cmd_AddCommand( "condump", Con_Dump_f ); + Cmd_AddCommand( "toggleconsole", Con_ToggleConsole_f, "Show/hide console" ); + Cmd_AddCommand( "togglemenu", Con_ToggleMenu_f, "Show/hide the menu" ); + Cmd_AddCommand( "messagemode", Con_MessageMode_f, "Global Chat" ); + Cmd_AddCommand( "messagemode2", Con_MessageMode2_f, "Team Chat" ); + Cmd_AddCommand( "messagemode3", Con_MessageMode3_f, "Private Chat with Target Player" ); + Cmd_AddCommand( "messagemode4", Con_MessageMode4_f, "Private Chat with Last Attacker" ); + Cmd_AddCommand( "clear", Con_Clear_f, "Clear console text" ); + Cmd_AddCommand( "condump", Con_Dump_f, "Dump console text to file" ); Cmd_SetCommandCompletionFunc( "condump", Cmd_CompleteTxtName ); } diff --git a/codemp/client/cl_input.cpp b/codemp/client/cl_input.cpp index 3c98abff7d..07c4c95088 100644 --- a/codemp/client/cl_input.cpp +++ b/codemp/client/cl_input.cpp @@ -155,6 +155,7 @@ void IN_MLookDown( void ) { in_mlooking = qtrue; } +void IN_CenterView( void ); void IN_MLookUp( void ) { in_mlooking = qfalse; if ( !cl_freelook->integer ) { @@ -1635,6 +1636,118 @@ void CL_SendCmd( void ) { CL_WritePacket(); } +static const cmdList_t inputCmds[] = +{ + { "centerview", "Centers view on screen", IN_CenterView, NULL }, + { "+moveup", "Jump", IN_UpDown, NULL }, + { "-moveup", NULL, IN_UpUp, NULL }, + { "+movedown", "Crouch", IN_DownDown, NULL }, + { "-movedown", NULL, IN_DownUp, NULL }, + { "+left", "Rotate camera left", IN_LeftDown, NULL }, + { "-left", NULL, IN_LeftUp, NULL }, + { "+right", "Rotate camera right", IN_RightDown, NULL }, + { "-right", NULL, IN_RightUp, NULL }, + { "+forward", "Move forward", IN_ForwardDown, NULL }, + { "-forward", NULL, IN_ForwardUp, NULL }, + { "+back", "Move backward", IN_BackDown, NULL }, + { "-back", NULL, IN_BackUp, NULL }, + { "+lookup", "Tilt camera up", IN_LookupDown, NULL }, + { "-lookup", NULL, IN_LookupUp, NULL }, + { "+lookdown", "Tilt camera down", IN_LookdownDown, NULL }, + { "-lookdown", NULL, IN_LookdownUp, NULL }, + { "+strafe", "Hold to strafe", IN_StrafeDown, NULL }, + { "-strafe", NULL, IN_StrafeUp, NULL }, + { "+moveleft", "Strafe left", IN_MoveleftDown, NULL }, + { "-moveleft", NULL, IN_MoveleftUp, NULL }, + { "+moveright", "Strafe right", IN_MoverightDown, NULL }, + { "-moveright", NULL, IN_MoverightUp, NULL }, + { "+speed", "Walk or run", IN_SpeedDown, NULL }, + { "-speed", NULL, IN_SpeedUp, NULL }, + { "+attack", "Primary Attack", IN_Button0Down, NULL }, + { "-attack", NULL, IN_Button0Up, NULL }, + { "+use", "Use item", IN_Button5Down, NULL }, + { "-use", NULL, IN_Button5Up, NULL }, + { "+force_grip", "Hold to use grip force power", IN_Button6Down, NULL }, + { "-force_grip", NULL, IN_Button6Up, NULL }, + { "+altattack", "Alternate Attack", IN_Button7Down, NULL }, + { "-altattack", NULL, IN_Button7Up, NULL }, + { "+useforce", "Use selected force power", IN_Button9Down, NULL }, + { "-useforce", NULL, IN_Button9Up, NULL }, + { "+force_lightning", "Hold to use lightning force power", IN_Button10Down, NULL }, + { "-force_lightning", NULL, IN_Button10Up, NULL }, + { "+force_drain", "Hold to use drain force power", IN_Button11Down, NULL }, + { "-force_drain", NULL, IN_Button11Up, NULL }, + { "+button0", "Button 0", IN_Button0Down, NULL }, + { "-button0", NULL, IN_Button0Up, NULL }, + { "+button1", "Button 1", IN_Button1Down, NULL }, + { "-button1", NULL, IN_Button1Up, NULL }, + { "+button2", "Button 2", IN_Button2Down, NULL }, + { "-button2", NULL, IN_Button2Up, NULL }, + { "+button3", "Button 3", IN_Button3Down, NULL }, + { "-button3", NULL, IN_Button3Up, NULL }, + { "+button4", "Button 4", IN_Button4Down, NULL }, + { "-button4", NULL, IN_Button4Up, NULL }, + { "+button5", "Button 5", IN_Button5Down, NULL }, + { "-button5", NULL, IN_Button5Up, NULL }, + { "+button6", "Button 6", IN_Button6Down, NULL }, + { "-button6", NULL, IN_Button6Up, NULL }, + { "+button7", "Button 7", IN_Button7Down, NULL }, + { "-button7", NULL, IN_Button7Up, NULL }, + { "+button8", "Button 8", IN_Button8Down, NULL }, + { "-button8", NULL, IN_Button8Up, NULL }, + { "+button9", "Button 9", IN_Button9Down, NULL }, + { "-button9", NULL, IN_Button9Up, NULL }, + { "+button10", "Button 10", IN_Button10Down, NULL }, + { "-button10", NULL, IN_Button10Up, NULL }, + { "+button11", "Button 11", IN_Button11Down, NULL }, + { "-button11", NULL, IN_Button11Up, NULL }, + { "+button12", "Button 12", IN_Button12Down, NULL }, + { "-button12", NULL, IN_Button12Up, NULL }, + { "+button13", "Button 13", IN_Button13Down, NULL }, + { "-button13", NULL, IN_Button13Up, NULL }, + { "+button14", "Button 14", IN_Button14Down, NULL }, + { "-button14", NULL, IN_Button14Up, NULL }, + { "+button15", "Button 15", IN_Button15Down, NULL }, + { "-button15", NULL, IN_Button15Up, NULL }, + { "+mlook", "Hold to use mouse look", IN_MLookDown, NULL }, + { "-mlook", NULL, IN_MLookUp, NULL }, + { "sv_saberswitch", "Holster/activate lightsaber", IN_GenCMD1, NULL }, + { "engage_duel", "Engage private duel", IN_GenCMD2, NULL }, + { "force_heal", "Use heal force power", IN_GenCMD3, NULL }, + { "force_speed", "Activate speed force power", IN_GenCMD4, NULL }, + { "force_pull", "Use pull force power", IN_GenCMD5, NULL }, + { "force_distract", "Activate mind trick force power", IN_GenCMD6, NULL }, + { "force_rage", "Activate rage force power", IN_GenCMD7, NULL }, + { "force_protect", "Activate protect force power", IN_GenCMD8, NULL }, + { "force_absorb", "Activate absorb force power", IN_GenCMD9, NULL }, + { "force_healother", "Use team heal force power", IN_GenCMD10, NULL }, + { "force_forcepowerother", "Use team energize force power", IN_GenCMD11, NULL }, + { "force_seeing", "Activate seeing force power", IN_GenCMD12, NULL }, + { "use_seeker", "Use seeker drone item", IN_GenCMD13, NULL }, + { "use_field", "Use forcefield item", IN_GenCMD14, NULL }, + { "use_bacta", "Use bacta item", IN_GenCMD15, NULL }, + { "use_electrobinoculars", "Use electro binoculars item", IN_GenCMD16, NULL }, + { "zoom", "Use binoculars item", IN_GenCMD17, NULL }, + { "use_sentry", "Use sentry gun item", IN_GenCMD18, NULL }, + { "saberAttackCycle", "Switch lightsaber attack styles", IN_GenCMD19, NULL }, + { "force_throw", "Use push force power", IN_GenCMD20, NULL }, + { "use_jetpack", "Use jetpack item", IN_GenCMD21, NULL }, + { "use_bactabig", "Use big bacta item", IN_GenCMD22, NULL }, + { "use_healthdisp", "Use health dispenser item", IN_GenCMD23, NULL }, + { "use_ammodisp", "Use ammo dispenser item", IN_GenCMD24, NULL }, + { "use_eweb", "Use e-web item", IN_GenCMD25, NULL }, + { "use_cloak", "Use cloaking item", IN_GenCMD26, NULL }, + { "taunt", "Taunt", IN_GenCMD27, NULL }, + { "bow", "Bow", IN_GenCMD28, NULL }, + { "meditate", "Meditate", IN_GenCMD29, NULL }, + { "flourish", "Flourish", IN_GenCMD30, NULL }, + { "gloat", "Gloat", IN_GenCMD31, NULL }, + { "useGivenForce", "Use specified force power", IN_UseGivenForce, NULL }, + { "automap_button", "Show/hide automap", IN_AutoMapButton, NULL }, + { "automap_toggle", "Show/hide radar", IN_AutoMapToggle, NULL }, + { "voicechat", "Open voice chat menu", IN_VoiceChatButton, NULL }, + { NULL, NULL, NULL, NULL } +}; /* ============ @@ -1642,123 +1755,7 @@ CL_InitInput ============ */ void CL_InitInput( void ) { - Cmd_AddCommand ("centerview",IN_CenterView); - - //Cmd_AddCommand ("+taunt", IN_Button3Down);//gesture - //Cmd_AddCommand ("-taunt", IN_Button3Up); - Cmd_AddCommand ("+moveup",IN_UpDown); - Cmd_AddCommand ("-moveup",IN_UpUp); - Cmd_AddCommand ("+movedown",IN_DownDown); - Cmd_AddCommand ("-movedown",IN_DownUp); - Cmd_AddCommand ("+left",IN_LeftDown); - Cmd_AddCommand ("-left",IN_LeftUp); - Cmd_AddCommand ("+right",IN_RightDown); - Cmd_AddCommand ("-right",IN_RightUp); - Cmd_AddCommand ("+forward",IN_ForwardDown); - Cmd_AddCommand ("-forward",IN_ForwardUp); - Cmd_AddCommand ("+back",IN_BackDown); - Cmd_AddCommand ("-back",IN_BackUp); - Cmd_AddCommand ("+lookup", IN_LookupDown); - Cmd_AddCommand ("-lookup", IN_LookupUp); - Cmd_AddCommand ("+lookdown", IN_LookdownDown); - Cmd_AddCommand ("-lookdown", IN_LookdownUp); - Cmd_AddCommand ("+strafe", IN_StrafeDown); - Cmd_AddCommand ("-strafe", IN_StrafeUp); - Cmd_AddCommand ("+moveleft", IN_MoveleftDown); - Cmd_AddCommand ("-moveleft", IN_MoveleftUp); - Cmd_AddCommand ("+moveright", IN_MoverightDown); - Cmd_AddCommand ("-moveright", IN_MoverightUp); - Cmd_AddCommand ("+speed", IN_SpeedDown); - Cmd_AddCommand ("-speed", IN_SpeedUp); - Cmd_AddCommand ("+attack", IN_Button0Down); - Cmd_AddCommand ("-attack", IN_Button0Up); - //Cmd_AddCommand ("+force_jump", IN_Button1Down);//force jump - //Cmd_AddCommand ("-force_jump", IN_Button1Up); - Cmd_AddCommand ("+use", IN_Button5Down); - Cmd_AddCommand ("-use", IN_Button5Up); - Cmd_AddCommand ("+force_grip", IN_Button6Down);//force grip - Cmd_AddCommand ("-force_grip", IN_Button6Up); - Cmd_AddCommand ("+altattack", IN_Button7Down);//altattack - Cmd_AddCommand ("-altattack", IN_Button7Up); - Cmd_AddCommand ("+useforce", IN_Button9Down);//active force power - Cmd_AddCommand ("-useforce", IN_Button9Up); - Cmd_AddCommand ("+force_lightning", IN_Button10Down);//active force power - Cmd_AddCommand ("-force_lightning", IN_Button10Up); - Cmd_AddCommand ("+force_drain", IN_Button11Down);//active force power - Cmd_AddCommand ("-force_drain", IN_Button11Up); - //buttons - Cmd_AddCommand ("+button0", IN_Button0Down);//attack - Cmd_AddCommand ("-button0", IN_Button0Up); - Cmd_AddCommand ("+button1", IN_Button1Down);//force jump - Cmd_AddCommand ("-button1", IN_Button1Up); - Cmd_AddCommand ("+button2", IN_Button2Down);//use holdable (not used - change to use jedi power?) - Cmd_AddCommand ("-button2", IN_Button2Up); - Cmd_AddCommand ("+button3", IN_Button3Down);//gesture - Cmd_AddCommand ("-button3", IN_Button3Up); - Cmd_AddCommand ("+button4", IN_Button4Down);//walking - Cmd_AddCommand ("-button4", IN_Button4Up); - Cmd_AddCommand ("+button5", IN_Button5Down);//use object - Cmd_AddCommand ("-button5", IN_Button5Up); - Cmd_AddCommand ("+button6", IN_Button6Down);//force grip - Cmd_AddCommand ("-button6", IN_Button6Up); - Cmd_AddCommand ("+button7", IN_Button7Down);//altattack - Cmd_AddCommand ("-button7", IN_Button7Up); - Cmd_AddCommand ("+button8", IN_Button8Down); - Cmd_AddCommand ("-button8", IN_Button8Up); - Cmd_AddCommand ("+button9", IN_Button9Down);//active force power - Cmd_AddCommand ("-button9", IN_Button9Up); - Cmd_AddCommand ("+button10", IN_Button10Down);//force lightning - Cmd_AddCommand ("-button10", IN_Button10Up); - Cmd_AddCommand ("+button11", IN_Button11Down);//force drain - Cmd_AddCommand ("-button11", IN_Button11Up); - Cmd_AddCommand ("+button12", IN_Button12Down); - Cmd_AddCommand ("-button12", IN_Button12Up); - Cmd_AddCommand ("+button13", IN_Button13Down); - Cmd_AddCommand ("-button13", IN_Button13Up); - Cmd_AddCommand ("+button14", IN_Button14Down); - Cmd_AddCommand ("-button14", IN_Button14Up); - Cmd_AddCommand ("+button15", IN_Button15Down); - Cmd_AddCommand ("-button15", IN_Button15Up); - Cmd_AddCommand ("+mlook", IN_MLookDown); - Cmd_AddCommand ("-mlook", IN_MLookUp); - - Cmd_AddCommand ("sv_saberswitch", IN_GenCMD1); - Cmd_AddCommand ("engage_duel", IN_GenCMD2); - Cmd_AddCommand ("force_heal", IN_GenCMD3); - Cmd_AddCommand ("force_speed", IN_GenCMD4); - Cmd_AddCommand ("force_pull", IN_GenCMD5); - Cmd_AddCommand ("force_distract", IN_GenCMD6); - Cmd_AddCommand ("force_rage", IN_GenCMD7); - Cmd_AddCommand ("force_protect", IN_GenCMD8); - Cmd_AddCommand ("force_absorb", IN_GenCMD9); - Cmd_AddCommand ("force_healother", IN_GenCMD10); - Cmd_AddCommand ("force_forcepowerother", IN_GenCMD11); - Cmd_AddCommand ("force_seeing", IN_GenCMD12); - Cmd_AddCommand ("use_seeker", IN_GenCMD13); - Cmd_AddCommand ("use_field", IN_GenCMD14); - Cmd_AddCommand ("use_bacta", IN_GenCMD15); - Cmd_AddCommand ("use_electrobinoculars", IN_GenCMD16); - Cmd_AddCommand ("zoom", IN_GenCMD17); - Cmd_AddCommand ("use_sentry", IN_GenCMD18); - Cmd_AddCommand ("use_jetpack", IN_GenCMD21); - Cmd_AddCommand ("use_bactabig", IN_GenCMD22); - Cmd_AddCommand ("use_healthdisp", IN_GenCMD23); - Cmd_AddCommand ("use_ammodisp", IN_GenCMD24); - Cmd_AddCommand ("use_eweb", IN_GenCMD25); - Cmd_AddCommand ("use_cloak", IN_GenCMD26); - Cmd_AddCommand ("taunt", IN_GenCMD27); - Cmd_AddCommand ("bow", IN_GenCMD28); - Cmd_AddCommand ("meditate", IN_GenCMD29); - Cmd_AddCommand ("flourish", IN_GenCMD30); - Cmd_AddCommand ("gloat", IN_GenCMD31); - Cmd_AddCommand ("saberAttackCycle", IN_GenCMD19); - Cmd_AddCommand ("force_throw", IN_GenCMD20); - Cmd_AddCommand ("useGivenForce", IN_UseGivenForce); - - - Cmd_AddCommand("automap_button", IN_AutoMapButton); - Cmd_AddCommand("automap_toggle", IN_AutoMapToggle); - Cmd_AddCommand("voicechat", IN_VoiceChatButton); + Cmd_AddCommandList( inputCmds ); cl_nodelta = Cvar_Get ("cl_nodelta", "0", 0); cl_debugMove = Cvar_Get ("cl_debugMove", "0", 0); @@ -1769,119 +1766,6 @@ void CL_InitInput( void ) { CL_ShutdownInput ============ */ -void CL_ShutdownInput(void) -{ - Cmd_RemoveCommand ("centerview"); - - Cmd_RemoveCommand ("+moveup"); - Cmd_RemoveCommand ("-moveup"); - Cmd_RemoveCommand ("+movedown"); - Cmd_RemoveCommand ("-movedown"); - Cmd_RemoveCommand ("+left"); - Cmd_RemoveCommand ("-left"); - Cmd_RemoveCommand ("+right"); - Cmd_RemoveCommand ("-right"); - Cmd_RemoveCommand ("+forward"); - Cmd_RemoveCommand ("-forward"); - Cmd_RemoveCommand ("+back"); - Cmd_RemoveCommand ("-back"); - Cmd_RemoveCommand ("+lookup"); - Cmd_RemoveCommand ("-lookup"); - Cmd_RemoveCommand ("+lookdown"); - Cmd_RemoveCommand ("-lookdown"); - Cmd_RemoveCommand ("+strafe"); - Cmd_RemoveCommand ("-strafe"); - Cmd_RemoveCommand ("+moveleft"); - Cmd_RemoveCommand ("-moveleft"); - Cmd_RemoveCommand ("+moveright"); - Cmd_RemoveCommand ("-moveright"); - Cmd_RemoveCommand ("+speed"); - Cmd_RemoveCommand ("-speed"); - Cmd_RemoveCommand ("+attack"); - Cmd_RemoveCommand ("-attack"); - Cmd_RemoveCommand ("+use"); - Cmd_RemoveCommand ("-use"); - Cmd_RemoveCommand ("+force_grip");//force grip - Cmd_RemoveCommand ("-force_grip"); - Cmd_RemoveCommand ("+altattack");//altattack - Cmd_RemoveCommand ("-altattack"); - Cmd_RemoveCommand ("+useforce");//active force power - Cmd_RemoveCommand ("-useforce"); - Cmd_RemoveCommand ("+force_lightning");//active force power - Cmd_RemoveCommand ("-force_lightning"); - Cmd_RemoveCommand ("+force_drain");//active force power - Cmd_RemoveCommand ("-force_drain"); - //buttons - Cmd_RemoveCommand ("+button0");//attack - Cmd_RemoveCommand ("-button0"); - Cmd_RemoveCommand ("+button1");//force jump - Cmd_RemoveCommand ("-button1"); - Cmd_RemoveCommand ("+button2");//use holdable (not used - change to use jedi power?) - Cmd_RemoveCommand ("-button2"); - Cmd_RemoveCommand ("+button3");//gesture - Cmd_RemoveCommand ("-button3"); - Cmd_RemoveCommand ("+button4");//walking - Cmd_RemoveCommand ("-button4"); - Cmd_RemoveCommand ("+button5");//use object - Cmd_RemoveCommand ("-button5"); - Cmd_RemoveCommand ("+button6");//force grip - Cmd_RemoveCommand ("-button6"); - Cmd_RemoveCommand ("+button7");//altattack - Cmd_RemoveCommand ("-button7"); - Cmd_RemoveCommand ("+button8"); - Cmd_RemoveCommand ("-button8"); - Cmd_RemoveCommand ("+button9");//active force power - Cmd_RemoveCommand ("-button9"); - Cmd_RemoveCommand ("+button10");//force lightning - Cmd_RemoveCommand ("-button10"); - Cmd_RemoveCommand ("+button11");//force drain - Cmd_RemoveCommand ("-button11"); - Cmd_RemoveCommand ("+button12"); - Cmd_RemoveCommand ("-button12"); - Cmd_RemoveCommand ("+button13"); - Cmd_RemoveCommand ("-button13"); - Cmd_RemoveCommand ("+button14"); - Cmd_RemoveCommand ("-button14"); - Cmd_RemoveCommand ("+button15"); - Cmd_RemoveCommand ("-button15"); - Cmd_RemoveCommand ("+mlook"); - Cmd_RemoveCommand ("-mlook"); - - Cmd_RemoveCommand ("sv_saberswitch"); - Cmd_RemoveCommand ("engage_duel"); - Cmd_RemoveCommand ("force_heal"); - Cmd_RemoveCommand ("force_speed"); - Cmd_RemoveCommand ("force_pull"); - Cmd_RemoveCommand ("force_distract"); - Cmd_RemoveCommand ("force_rage"); - Cmd_RemoveCommand ("force_protect"); - Cmd_RemoveCommand ("force_absorb"); - Cmd_RemoveCommand ("force_healother"); - Cmd_RemoveCommand ("force_forcepowerother"); - Cmd_RemoveCommand ("force_seeing"); - Cmd_RemoveCommand ("use_seeker"); - Cmd_RemoveCommand ("use_field"); - Cmd_RemoveCommand ("use_bacta"); - Cmd_RemoveCommand ("use_electrobinoculars"); - Cmd_RemoveCommand ("zoom"); - Cmd_RemoveCommand ("use_sentry"); - Cmd_RemoveCommand ("use_jetpack"); - Cmd_RemoveCommand ("use_bactabig"); - Cmd_RemoveCommand ("use_healthdisp"); - Cmd_RemoveCommand ("use_ammodisp"); - Cmd_RemoveCommand ("use_eweb"); - Cmd_RemoveCommand ("use_cloak"); - Cmd_RemoveCommand ("taunt"); - Cmd_RemoveCommand ("bow"); - Cmd_RemoveCommand ("meditate"); - Cmd_RemoveCommand ("flourish"); - Cmd_RemoveCommand ("gloat"); - Cmd_RemoveCommand ("saberAttackCycle"); - Cmd_RemoveCommand ("force_throw"); - Cmd_RemoveCommand ("useGivenForce"); - - - Cmd_RemoveCommand("automap_button"); - Cmd_RemoveCommand("automap_toggle"); - Cmd_RemoveCommand("voicechat"); +void CL_ShutdownInput( void ) { + Cmd_RemoveCommandList( inputCmds ); } diff --git a/codemp/client/cl_keys.cpp b/codemp/client/cl_keys.cpp index 16151eba7f..02966bdf28 100644 --- a/codemp/client/cl_keys.cpp +++ b/codemp/client/cl_keys.cpp @@ -1175,7 +1175,7 @@ static void Key_CompleteBind( char *args, int argNum ) { p = Com_SkipTokens( args, 2, " " ); if ( p > args ) - Field_CompleteCommand( p, qtrue, qtrue, qtrue ); + Field_CompleteCommand( p, qtrue, qtrue ); } } diff --git a/codemp/client/cl_main.cpp b/codemp/client/cl_main.cpp index 74258aee2e..beea5f3af3 100644 --- a/codemp/client/cl_main.cpp +++ b/codemp/client/cl_main.cpp @@ -736,7 +736,7 @@ static void CL_UpdateGUID( const char *prefix, int prefix_len ) // initialize the cvar here in case it's unset or was user-created // while tracking was disabled (removes CVAR_USER_CREATED) - Cvar_Get( "ja_guid", "", CVAR_USERINFO | CVAR_ROM ); + Cvar_Get( "ja_guid", "", CVAR_USERINFO | CVAR_ROM, "Client GUID" ); if( len != QKEY_SIZE ) { Cvar_Set( "ja_guid", "" ); @@ -749,7 +749,7 @@ static void CL_UpdateGUID( const char *prefix, int prefix_len ) uint32_t flags = Cvar_Flags("ja_guid"); // keep the cvar if it's user-created, but destroy it otherwise if (flags != CVAR_NONEXISTENT && !(flags & CVAR_USER_CREATED)) { - cvar_t *ja_guid = Cvar_Get("ja_guid", "", 0); + cvar_t *ja_guid = Cvar_Get("ja_guid", "", 0, "Client GUID" ); Cvar_Unset(ja_guid); } } @@ -2363,7 +2363,7 @@ void CL_InitRef( void ) { Com_Printf( "----- Initializing Renderer ----\n" ); - cl_renderer = Cvar_Get( "cl_renderer", DEFAULT_RENDER_LIBRARY, CVAR_ARCHIVE|CVAR_LATCH ); + cl_renderer = Cvar_Get( "cl_renderer", DEFAULT_RENDER_LIBRARY, CVAR_ARCHIVE|CVAR_LATCH, "Which renderer library to use" ); Com_sprintf( dllName, sizeof( dllName ), "%s_" ARCH_STRING DLL_EXT, cl_renderer->string ); @@ -2679,7 +2679,7 @@ void CL_Init( void ) { // register our variables // cl_noprint = Cvar_Get( "cl_noprint", "0", 0 ); - cl_motd = Cvar_Get ("cl_motd", "1", CVAR_ARCHIVE ); + cl_motd = Cvar_Get ("cl_motd", "1", CVAR_ARCHIVE, "Display welcome message from master server on the bottom of connection screen" ); cl_motdServer[0] = Cvar_Get( "cl_motdServer1", UPDATE_SERVER_NAME, 0 ); cl_motdServer[1] = Cvar_Get( "cl_motdServer2", JKHUB_UPDATE_SERVER_NAME, 0 ); for ( int index = 2; index < MAX_MASTER_SERVERS; index++ ) @@ -2692,7 +2692,7 @@ void CL_Init( void ) { cl_showSend = Cvar_Get ("cl_showSend", "0", CVAR_TEMP ); cl_showTimeDelta = Cvar_Get ("cl_showTimeDelta", "0", CVAR_TEMP ); cl_freezeDemo = Cvar_Get ("cl_freezeDemo", "0", CVAR_TEMP ); - rcon_client_password = Cvar_Get ("rconPassword", "", CVAR_TEMP ); + rcon_client_password = Cvar_Get ("rconPassword", "", CVAR_TEMP, "Password for remote console access" ); cl_activeAction = Cvar_Get( "activeAction", "", CVAR_TEMP ); cl_timedemo = Cvar_Get ("timedemo", "0", 0); @@ -2701,7 +2701,7 @@ void CL_Init( void ) { cl_avi2GBLimit = Cvar_Get ("cl_avi2GBLimit", "1", CVAR_ARCHIVE ); cl_forceavidemo = Cvar_Get ("cl_forceavidemo", "0", 0); - rconAddress = Cvar_Get ("rconAddress", "", 0); + rconAddress = Cvar_Get ("rconAddress", "", 0, "Alternate server address to remotely access via rcon protocol"); cl_yawspeed = Cvar_Get ("cl_yawspeed", "140", CVAR_ARCHIVE); cl_pitchspeed = Cvar_Get ("cl_pitchspeed", "140", CVAR_ARCHIVE); @@ -2710,22 +2710,22 @@ void CL_Init( void ) { cl_maxpackets = Cvar_Get ("cl_maxpackets", "63", CVAR_ARCHIVE ); cl_packetdup = Cvar_Get ("cl_packetdup", "1", CVAR_ARCHIVE ); - cl_run = Cvar_Get ("cl_run", "1", CVAR_ARCHIVE); - cl_sensitivity = Cvar_Get ("sensitivity", "5", CVAR_ARCHIVE); - cl_mouseAccel = Cvar_Get ("cl_mouseAccel", "0", CVAR_ARCHIVE); - cl_freelook = Cvar_Get( "cl_freelook", "1", CVAR_ARCHIVE ); + cl_run = Cvar_Get ("cl_run", "1", CVAR_ARCHIVE, "Always run"); + cl_sensitivity = Cvar_Get ("sensitivity", "5", CVAR_ARCHIVE, "Mouse sensitivity value"); + cl_mouseAccel = Cvar_Get ("cl_mouseAccel", "0", CVAR_ARCHIVE, "Mouse acceleration value"); + cl_freelook = Cvar_Get( "cl_freelook", "1", CVAR_ARCHIVE, "Mouse look" ); // 0: legacy mouse acceleration // 1: new implementation - cl_mouseAccelStyle = Cvar_Get( "cl_mouseAccelStyle", "0", CVAR_ARCHIVE ); + cl_mouseAccelStyle = Cvar_Get( "cl_mouseAccelStyle", "0", CVAR_ARCHIVE, "Mouse accelration style (0:legacy, 1:QuakeLive)" ); // offset for the power function (for style 1, ignored otherwise) // this should be set to the max rate value - cl_mouseAccelOffset = Cvar_Get( "cl_mouseAccelOffset", "5", CVAR_ARCHIVE ); + cl_mouseAccelOffset = Cvar_Get( "cl_mouseAccelOffset", "5", CVAR_ARCHIVE, "Mouse acceleration offset for style 1" ); cl_showMouseRate = Cvar_Get ("cl_showmouserate", "0", 0); cl_framerate = Cvar_Get ("cl_framerate", "0", CVAR_TEMP); - cl_allowDownload = Cvar_Get ("cl_allowDownload", "0", CVAR_ARCHIVE); - cl_allowAltEnter = Cvar_Get ("cl_allowAltEnter", "1", CVAR_ARCHIVE); + cl_allowDownload = Cvar_Get ("cl_allowDownload", "0", CVAR_ARCHIVE, "Allow downloading custom paks from server"); + cl_allowAltEnter = Cvar_Get ("cl_allowAltEnter", "1", CVAR_ARCHIVE, "Enables use of ALT+ENTER keyboard combo to toggle fullscreen" ); cl_autolodscale = Cvar_Get( "cl_autolodscale", "1", CVAR_ARCHIVE ); @@ -2752,40 +2752,40 @@ void CL_Init( void ) { cl_motdString = Cvar_Get( "cl_motdString", "", CVAR_ROM ); - Cvar_Get( "cl_maxPing", "800", CVAR_ARCHIVE ); + Cvar_Get( "cl_maxPing", "800", CVAR_ARCHIVE, "Max. ping for servers when searching the serverlist" ); cl_lanForcePackets = Cvar_Get ("cl_lanForcePackets", "1", CVAR_ARCHIVE); // enable the ja_guid player identifier in userinfo by default in OpenJK - cl_enableGuid = Cvar_Get("cl_enableGuid", "1", CVAR_ARCHIVE); - cl_guidServerUniq = Cvar_Get ("cl_guidServerUniq", "1", CVAR_ARCHIVE); + cl_enableGuid = Cvar_Get("cl_enableGuid", "1", CVAR_ARCHIVE, "Enable GUID userinfo identifier" ); + cl_guidServerUniq = Cvar_Get ("cl_guidServerUniq", "1", CVAR_ARCHIVE, "Use a unique guid value per server" ); // ~ and `, as keys and characters - cl_consoleKeys = Cvar_Get( "cl_consoleKeys", "~ ` 0x7e 0x60", CVAR_ARCHIVE); + cl_consoleKeys = Cvar_Get( "cl_consoleKeys", "~ ` 0x7e 0x60", CVAR_ARCHIVE, "Which keys are used to toggle the console"); // userinfo - Cvar_Get ("name", "Padawan", CVAR_USERINFO | CVAR_ARCHIVE ); - Cvar_Get ("rate", "25000", CVAR_USERINFO | CVAR_ARCHIVE ); - Cvar_Get ("snaps", "40", CVAR_USERINFO | CVAR_ARCHIVE ); - Cvar_Get ("model", DEFAULT_MODEL"/default", CVAR_USERINFO | CVAR_ARCHIVE ); - Cvar_Get ("forcepowers", "7-1-032330000000001333", CVAR_USERINFO | CVAR_ARCHIVE ); + Cvar_Get ("name", "Padawan", CVAR_USERINFO | CVAR_ARCHIVE, "Player name" ); + Cvar_Get ("rate", "25000", CVAR_USERINFO | CVAR_ARCHIVE, "Data rate" ); + Cvar_Get ("snaps", "40", CVAR_USERINFO | CVAR_ARCHIVE, "Client snapshots per second" ); + Cvar_Get ("model", DEFAULT_MODEL"/default", CVAR_USERINFO | CVAR_ARCHIVE, "Player model" ); + Cvar_Get ("forcepowers", "7-1-032330000000001333", CVAR_USERINFO | CVAR_ARCHIVE, "Player forcepowers" ); // Cvar_Get ("g_redTeam", DEFAULT_REDTEAM_NAME, CVAR_SERVERINFO | CVAR_ARCHIVE); // Cvar_Get ("g_blueTeam", DEFAULT_BLUETEAM_NAME, CVAR_SERVERINFO | CVAR_ARCHIVE); - Cvar_Get ("color1", "4", CVAR_USERINFO | CVAR_ARCHIVE ); - Cvar_Get ("color2", "4", CVAR_USERINFO | CVAR_ARCHIVE ); - Cvar_Get ("handicap", "100", CVAR_USERINFO | CVAR_ARCHIVE ); - Cvar_Get ("sex", "male", CVAR_USERINFO | CVAR_ARCHIVE ); - Cvar_Get ("password", "", CVAR_USERINFO); + Cvar_Get ("color1", "4", CVAR_USERINFO | CVAR_ARCHIVE, "Player saber1 color" ); + Cvar_Get ("color2", "4", CVAR_USERINFO | CVAR_ARCHIVE, "Player saber2 color" ); + Cvar_Get ("handicap", "100", CVAR_USERINFO | CVAR_ARCHIVE, "Player handicap" ); + Cvar_Get ("sex", "male", CVAR_USERINFO | CVAR_ARCHIVE, "Player sex" ); + Cvar_Get ("password", "", CVAR_USERINFO, "Password to join server" ); Cvar_Get ("cg_predictItems", "1", CVAR_USERINFO | CVAR_ARCHIVE ); //default sabers - Cvar_Get ("saber1", DEFAULT_SABER, CVAR_USERINFO | CVAR_ARCHIVE ); - Cvar_Get ("saber2", "none", CVAR_USERINFO | CVAR_ARCHIVE ); + Cvar_Get ("saber1", DEFAULT_SABER, CVAR_USERINFO | CVAR_ARCHIVE, "Player default right hand saber" ); + Cvar_Get ("saber2", "none", CVAR_USERINFO | CVAR_ARCHIVE, "Player left hand saber" ); //skin color - Cvar_Get ("char_color_red", "255", CVAR_USERINFO | CVAR_ARCHIVE ); - Cvar_Get ("char_color_green", "255", CVAR_USERINFO | CVAR_ARCHIVE ); - Cvar_Get ("char_color_blue", "255", CVAR_USERINFO | CVAR_ARCHIVE ); + Cvar_Get ("char_color_red", "255", CVAR_USERINFO | CVAR_ARCHIVE, "Player tint (Red)" ); + Cvar_Get ("char_color_green", "255", CVAR_USERINFO | CVAR_ARCHIVE, "Player tint (Green)" ); + Cvar_Get ("char_color_blue", "255", CVAR_USERINFO | CVAR_ARCHIVE, "Player tint (Blue)" ); // cgame might not be initialized before menu is used Cvar_Get ("cg_viewsize", "100", CVAR_ARCHIVE ); @@ -2793,33 +2793,33 @@ void CL_Init( void ) { // // register our commands // - Cmd_AddCommand ("cmd", CL_ForwardToServer_f); - Cmd_AddCommand ("globalservers", CL_GlobalServers_f); - Cmd_AddCommand( "addFavorite", CL_AddFavorite_f ); - Cmd_AddCommand ("record", CL_Record_f); - Cmd_AddCommand ("demo", CL_PlayDemo_f); + Cmd_AddCommand ("cmd", CL_ForwardToServer_f, "Forward command to server" ); + Cmd_AddCommand ("globalservers", CL_GlobalServers_f, "Query the masterserver for serverlist" ); + Cmd_AddCommand( "addFavorite", CL_AddFavorite_f, "Add server to favorites" ); + Cmd_AddCommand ("record", CL_Record_f, "Record a demo" ); + Cmd_AddCommand ("demo", CL_PlayDemo_f, "Playback a demo" ); Cmd_SetCommandCompletionFunc( "demo", CL_CompleteDemoName ); - Cmd_AddCommand ("stoprecord", CL_StopRecord_f); - Cmd_AddCommand ("configstrings", CL_Configstrings_f); - Cmd_AddCommand ("clientinfo", CL_Clientinfo_f); - Cmd_AddCommand ("snd_restart", CL_Snd_Restart_f); - Cmd_AddCommand ("vid_restart", CL_Vid_Restart_f); - Cmd_AddCommand ("disconnect", CL_Disconnect_f); - Cmd_AddCommand ("cinematic", CL_PlayCinematic_f); - Cmd_AddCommand ("connect", CL_Connect_f); - Cmd_AddCommand ("reconnect", CL_Reconnect_f); - Cmd_AddCommand ("localservers", CL_LocalServers_f); - Cmd_AddCommand ("rcon", CL_Rcon_f); + Cmd_AddCommand ("stoprecord", CL_StopRecord_f, "Stop recording a demo" ); + Cmd_AddCommand ("configstrings", CL_Configstrings_f, "Prints the configstrings list" ); + Cmd_AddCommand ("clientinfo", CL_Clientinfo_f, "Prints the userinfo variables" ); + Cmd_AddCommand ("snd_restart", CL_Snd_Restart_f, "Restart sound" ); + Cmd_AddCommand ("vid_restart", CL_Vid_Restart_f, "Restart the renderer - or change the resolution" ); + Cmd_AddCommand ("disconnect", CL_Disconnect_f, "Disconnect from current server" ); + Cmd_AddCommand ("cinematic", CL_PlayCinematic_f, "Play a cinematic video" ); + Cmd_AddCommand ("connect", CL_Connect_f, "Connect to a server" ); + Cmd_AddCommand ("reconnect", CL_Reconnect_f, "Reconnect to current server" ); + Cmd_AddCommand ("localservers", CL_LocalServers_f, "Query LAN for local servers" ); + Cmd_AddCommand ("rcon", CL_Rcon_f, "Execute commands remotely to a server" ); Cmd_SetCommandCompletionFunc( "rcon", CL_CompleteRcon ); - Cmd_AddCommand ("ping", CL_Ping_f ); - Cmd_AddCommand ("serverstatus", CL_ServerStatus_f ); - Cmd_AddCommand ("showip", CL_ShowIP_f ); - Cmd_AddCommand ("fs_openedList", CL_OpenedPK3List_f ); - Cmd_AddCommand ("fs_referencedList", CL_ReferencedPK3List_f ); - Cmd_AddCommand ("model", CL_SetModel_f ); + Cmd_AddCommand ("ping", CL_Ping_f, "Ping a server for info response" ); + Cmd_AddCommand ("serverstatus", CL_ServerStatus_f, "Retrieve current or specified server's status" ); + Cmd_AddCommand ("showip", CL_ShowIP_f, "Shows local IP" ); + Cmd_AddCommand ("fs_openedList", CL_OpenedPK3List_f, "Lists open pak files" ); + Cmd_AddCommand ("fs_referencedList", CL_ReferencedPK3List_f, "Lists referenced pak files" ); + Cmd_AddCommand ("model", CL_SetModel_f, "Set the player model" ); Cmd_AddCommand ("forcepowers", CL_SetForcePowers_f ); - Cmd_AddCommand ("video", CL_Video_f ); - Cmd_AddCommand ("stopvideo", CL_StopVideo_f ); + Cmd_AddCommand ("video", CL_Video_f, "Record demo to avi" ); + Cmd_AddCommand ("stopvideo", CL_StopVideo_f, "Stop avi recording" ); CL_InitRef(); diff --git a/codemp/client/cl_uiapi.cpp b/codemp/client/cl_uiapi.cpp index 70cfab4aad..1389707166 100644 --- a/codemp/client/cl_uiapi.cpp +++ b/codemp/client/cl_uiapi.cpp @@ -454,6 +454,14 @@ static void UIVM_Cvar_SetValue( const char *var_name, float value ) { Cvar_VM_SetValue( var_name, value, VM_UI ); } +static void CL_AddUICommand( const char *cmdName ) { + Cmd_AddCommand( cmdName, NULL ); +} + +static void UIVM_Cmd_RemoveCommand( const char *cmd_name ) { + Cmd_VM_RemoveCommand( cmd_name, VM_UI ); +} + // legacy syscall intptr_t CL_UISystemCalls( intptr_t *args ) { @@ -1195,6 +1203,8 @@ void CL_BindUI( void ) { uii.G2API_AttachG2Model = CL_G2API_AttachG2Model; uii.ext.R_Font_StrLenPixels = re->ext.Font_StrLenPixels; + uii.ext.AddCommand = CL_AddUICommand; + uii.ext.RemoveCommand = UIVM_Cmd_RemoveCommand; GetUIAPI = (GetUIAPI_t)uivm->GetModuleAPI; ret = GetUIAPI( UI_API_VERSION, &uii ); diff --git a/codemp/client/client.h b/codemp/client/client.h index 58b5b2e48a..bf3e325902 100644 --- a/codemp/client/client.h +++ b/codemp/client/client.h @@ -464,17 +464,12 @@ typedef struct kbutton_s { qboolean wasPressed; // set when down, not cleared when up } kbutton_t; -extern kbutton_t in_mlook, in_klook; -extern kbutton_t in_strafe; -extern kbutton_t in_speed; - void CL_InitInput (void); void CL_ShutdownInput(void); void CL_SendCmd (void); void CL_ClearState (void); void CL_WritePacket( void ); -void IN_CenterView (void); float CL_KeyState (kbutton_t *key); const char *Key_KeynumToString( int keynum/*, qboolean bTranslate */ ); //note: translate is only called for menu display not configs diff --git a/codemp/client/snd_dma.cpp b/codemp/client/snd_dma.cpp index 344a620be5..077487c366 100644 --- a/codemp/client/snd_dma.cpp +++ b/codemp/client/snd_dma.cpp @@ -449,9 +449,9 @@ void S_Init( void ) { Com_Printf("\n------- sound initialization -------\n"); - s_volume = Cvar_Get ("s_volume", "0.5", CVAR_ARCHIVE); - s_volumeVoice= Cvar_Get ("s_volumeVoice", "1.0", CVAR_ARCHIVE); - s_musicVolume = Cvar_Get ("s_musicvolume", "0.25", CVAR_ARCHIVE); + s_volume = Cvar_Get ("s_volume", "0.5", CVAR_ARCHIVE, "Volume" ); + s_volumeVoice= Cvar_Get ("s_volumeVoice", "1.0", CVAR_ARCHIVE, "Volume for voice channels" ); + s_musicVolume = Cvar_Get ("s_musicvolume", "0.25", CVAR_ARCHIVE, "Music Volume" ); s_separation = Cvar_Get ("s_separation", "0.5", CVAR_ARCHIVE); s_khz = Cvar_Get ("s_khz", "44", CVAR_ARCHIVE|CVAR_LATCH); s_allowDynamicMusic = Cvar_Get ("s_allowDynamicMusic", "1", CVAR_ARCHIVE); @@ -466,7 +466,7 @@ void S_Init( void ) { s_lip_threshold_3 = Cvar_Get("s_threshold3" , "7.0",0); s_lip_threshold_4 = Cvar_Get("s_threshold4" , "8.0",0); - s_language = Cvar_Get("s_language","english",CVAR_ARCHIVE | CVAR_NORESTART); + s_language = Cvar_Get("s_language","english",CVAR_ARCHIVE | CVAR_NORESTART, "Sound language" ); s_doppler = Cvar_Get("s_doppler", "1", CVAR_ARCHIVE); @@ -480,14 +480,14 @@ void S_Init( void ) { return; } - Cmd_AddCommand("play", S_Play_f); - Cmd_AddCommand("music", S_Music_f); - Cmd_AddCommand("stopmusic", S_StopMusic_f); - Cmd_AddCommand("soundlist", S_SoundList_f); - Cmd_AddCommand("soundinfo", S_SoundInfo_f); - Cmd_AddCommand("soundstop", S_StopAllSounds); + Cmd_AddCommand("play", S_Play_f, "Plays a sound fx file" ); + Cmd_AddCommand("music", S_Music_f, "Plays a music file" ); + Cmd_AddCommand("stopmusic", S_StopMusic_f, "Stops all music" ); + Cmd_AddCommand("soundlist", S_SoundList_f, "Lists all cached sound and music files" ); + Cmd_AddCommand("soundinfo", S_SoundInfo_f, "Display information about the sound backend" ); + Cmd_AddCommand("soundstop", S_StopAllSounds, "Stops all sounds including music" ); Cmd_AddCommand("mp3_calcvols", S_MP3_CalcVols_f); - Cmd_AddCommand("s_dynamic", S_SetDynamicMusic_f); + Cmd_AddCommand("s_dynamic", S_SetDynamicMusic_f, "Change dynamic music state" ); #ifdef USE_OPENAL cv = Cvar_Get("s_UseOpenAL" , "0",CVAR_ARCHIVE|CVAR_LATCH); diff --git a/codemp/qcommon/cmd.cpp b/codemp/qcommon/cmd.cpp index 0cfd50f4a9..e22f739200 100644 --- a/codemp/qcommon/cmd.cpp +++ b/codemp/qcommon/cmd.cpp @@ -26,6 +26,9 @@ along with this program; if not, see . #include "qcommon/qcommon.h" +#include +#include + #define MAX_CMD_BUFFER 128*1024 #define MAX_CMD_LINE 1024 @@ -50,7 +53,7 @@ next frame. This allows commands like: bind g "cmd use rocket ; +attack ; wait ; -attack ; cmd use blaster" ============ */ -void Cmd_Wait_f( void ) { +static void Cmd_Wait_f( void ) { if ( Cmd_Argc() == 2 ) { cmd_wait = atoi( Cmd_Argv( 1 ) ); if ( cmd_wait < 0 ) @@ -266,7 +269,7 @@ void Cbuf_Execute (void) Cmd_Exec_f =============== */ -void Cmd_Exec_f( void ) { +static void Cmd_Exec_f( void ) { bool quiet; fileBuffer_t f; char filename[MAX_QPATH]; @@ -302,7 +305,7 @@ Cmd_Vstr_f Inserts the current value of a variable as command text =============== */ -void Cmd_Vstr_f( void ) { +static void Cmd_Vstr_f( void ) { char *v; if (Cmd_Argc () != 2) { @@ -322,7 +325,7 @@ Cmd_Echo_f Just prints the rest of the line to the console =============== */ -void Cmd_Echo_f (void) +static void Cmd_Echo_f (void) { Com_Printf ("%s\n", Cmd_Args()); } @@ -340,11 +343,13 @@ typedef struct cmd_function_s { struct cmd_function_s *next; char *name; + char *description; xcommand_t function; completionFunc_t complete; } cmd_function_t; + static int cmd_argc; static char *cmd_argv[MAX_STRING_TOKENS]; // points into cmd_tokenized static char cmd_tokenized[BIG_INFO_STRING+MAX_STRING_TOKENS]; // will have 0 bytes inserted @@ -466,7 +471,7 @@ char *Cmd_Cmd(void) https://bugzilla.icculus.org/show_bug.cgi?id=4769 */ -void Cmd_Args_Sanitize( void ) { +/*void Cmd_Args_Sanitize( void ) { for ( int i=1; i 0 && strlen( c ) >= length ) + c[length - 1] = '\0'; + + if ( VALIDSTRING( strip ) && VALIDSTRING( repl ) ) + Q_strstrip( c, strip, repl ); + } } /* @@ -632,7 +651,7 @@ cmd_function_t *Cmd_FindCommand( const char *cmd_name ) Cmd_AddCommand ============ */ -void Cmd_AddCommand( const char *cmd_name, xcommand_t function ) { +void Cmd_AddCommand( const char *cmd_name, xcommand_t function, const char *cmd_desc ) { cmd_function_t *cmd; // fail if the command already exists @@ -648,12 +667,34 @@ void Cmd_AddCommand( const char *cmd_name, xcommand_t function ) { // use a small malloc to avoid zone fragmentation cmd = (struct cmd_function_s *)S_Malloc (sizeof(cmd_function_t)); cmd->name = CopyString( cmd_name ); + if ( VALIDSTRING( cmd_desc ) ) + cmd->description = CopyString( cmd_desc ); + else + cmd->description = NULL; cmd->function = function; cmd->complete = NULL; cmd->next = cmd_functions; cmd_functions = cmd; } +void Cmd_AddCommandList( const cmdList_t *cmdList ) +{ + for ( const cmdList_t *cmd = cmdList; cmd && cmd->name; cmd++ ) + { + Cmd_AddCommand( cmd->name, cmd->func, cmd->description ); + if ( cmd->complete ) + Cmd_SetCommandCompletionFunc( cmd->name, cmd->complete ); + } +} + +void Cmd_RemoveCommandList( const cmdList_t *cmdList ) +{ + for ( const cmdList_t *cmd = cmdList; cmd && cmd->name; cmd++ ) + { + Cmd_RemoveCommand( cmd->name ); + } +} + /* ============ Cmd_SetCommandCompletionFunc @@ -683,9 +724,8 @@ void Cmd_RemoveCommand( const char *cmd_name ) { } if ( !strcmp( cmd_name, cmd->name ) ) { *back = cmd->next; - if (cmd->name) { - Z_Free(cmd->name); - } + Z_Free(cmd->name); + Z_Free(cmd->description); Z_Free (cmd); return; } @@ -715,6 +755,38 @@ void Cmd_VM_RemoveCommand( const char *cmd_name, vmSlots_t vmslot ) { Cmd_RemoveCommand( cmd_name ); } +/* +============ +Cmd_DescriptionString +============ +*/ +char *Cmd_DescriptionString( const char *cmd_name ) +{ + const cmd_function_t *cmd = Cmd_FindCommand( cmd_name ); + + if ( !cmd || !VALIDSTRING( cmd->description ) ) + return ""; + return cmd->description; +} + +/* +============ +Cmd_Print + +============ +*/ +void Cmd_Print( const cmd_function_t *cmd ) +{ + Com_Printf( S_COLOR_GREY "Cmd " S_COLOR_WHITE "%s", cmd->name ); + + if ( VALIDSTRING( cmd->description ) ) + { + Com_Printf( S_COLOR_GREEN " - %s" S_COLOR_WHITE, cmd->description ); + } + + Com_Printf( "\n" ); +} + /* ============ Cmd_CommandCompletion @@ -803,16 +875,24 @@ void Cmd_ExecuteString( const char *text ) { CL_ForwardCommandToServer ( text ); } +typedef std::vector CmdFuncVector; + +bool CmdSort( const cmd_function_t *cmd1, const cmd_function_t *cmd2 ) +{ + return Q_stricmp( cmd1->name, cmd2->name ) < 0; +} + /* ============ Cmd_List_f ============ */ -void Cmd_List_f (void) +static void Cmd_List_f (void) { - cmd_function_t *cmd = NULL; + const cmd_function_t *cmd = NULL; int i, j; char *match = NULL; + CmdFuncVector cmds; if ( Cmd_Argc() > 1 ) { match = Cmd_Argv( 1 ); @@ -825,15 +905,64 @@ void Cmd_List_f (void) if ( !cmd->name || (match && !Com_Filter( match, cmd->name, qfalse )) ) continue; - Com_Printf (" %s\n", cmd->name); + cmds.push_back( cmd ); j++; } + // sort list alphabetically + std::sort( cmds.begin(), cmds.end(), CmdSort ); + + CmdFuncVector::const_iterator itr; + for ( itr = cmds.begin(); + itr != cmds.end(); + ++itr ) + { + cmd = (*itr); + if ( VALIDSTRING( cmd->description ) ) + Com_Printf( " %s" S_COLOR_GREEN " - %s" S_COLOR_WHITE "\n", cmd->name, cmd->description ); + else + Com_Printf( " %s\n", cmd->name ); + } + Com_Printf ("\n%i total commands\n", i); if ( i != j ) Com_Printf( "%i matching commands\n", j ); } +static void Cmd_PrintHelp_f( void ) +{ + if ( Cmd_Argc() != 2 ) + { + Com_Printf( "usage: help \n" ); + return; + } + + const char *name = Cmd_Argv( 1 ); + const cmd_function_t *cmd = Cmd_FindCommand( name ); + + if ( cmd ) + Cmd_Print( cmd ); + else + Com_Printf( "Command %s does not exist.\n", name ); +} + +/* +================== +Cmd_CompleteCmdName +================== +*/ +void Cmd_CompleteCmdName( char *args, int argNum ) +{ + if ( argNum == 2 ) + { + // Skip " " + char *p = Com_SkipTokens( args, 1, " " ); + + if ( p > args ) + Field_CompleteCommand( p, qtrue, qtrue, qfalse ); + } +} + /* ================== Cmd_CompleteCfgName @@ -851,14 +980,16 @@ Cmd_Init ============ */ void Cmd_Init (void) { - Cmd_AddCommand ("cmdlist",Cmd_List_f); - Cmd_AddCommand ("exec",Cmd_Exec_f); - Cmd_AddCommand ("execq",Cmd_Exec_f); + Cmd_AddCommand( "cmdlist", Cmd_List_f, "List all commands to console" ); + Cmd_AddCommand( "help", Cmd_PrintHelp_f, "Print command help" ); + Cmd_SetCommandCompletionFunc( "help", Cmd_CompleteCmdName ); + Cmd_AddCommand( "echo", Cmd_Echo_f, "Print message to console" ); + Cmd_AddCommand( "exec", Cmd_Exec_f, "Execute a script file" ); + Cmd_AddCommand( "execq", Cmd_Exec_f, "Execute a script file without displaying a message" ); Cmd_SetCommandCompletionFunc( "exec", Cmd_CompleteCfgName ); Cmd_SetCommandCompletionFunc( "execq", Cmd_CompleteCfgName ); - Cmd_AddCommand ("vstr",Cmd_Vstr_f); + Cmd_AddCommand( "vstr", Cmd_Vstr_f, "Execute the value of a cvar" ); Cmd_SetCommandCompletionFunc( "vstr", Cvar_CompleteCvarName ); - Cmd_AddCommand ("echo",Cmd_Echo_f); - Cmd_AddCommand ("wait", Cmd_Wait_f); + Cmd_AddCommand( "wait", Cmd_Wait_f, "Pause command buffer execution" ); } diff --git a/codemp/qcommon/cvar.cpp b/codemp/qcommon/cvar.cpp index 0326f06fea..10fe02c6af 100644 --- a/codemp/qcommon/cvar.cpp +++ b/codemp/qcommon/cvar.cpp @@ -28,7 +28,7 @@ along with this program; if not, see . #include #include "qcommon/qcommon.h" -typedef std::vector cvarvec_t; +typedef std::vector CvarPtrVector; cvar_t *cvar_vars = NULL; cvar_t *cvar_cheats; @@ -176,6 +176,21 @@ void Cvar_VariableStringBuffer( const char *var_name, char *buffer, int bufsize } } +/* +============ +Cvar_DescriptionString +============ +*/ +char *Cvar_DescriptionString( const char *var_name ) +{ + cvar_t *var; + + var = Cvar_FindVar( var_name ); + if ( !var || !VALIDSTRING( var->description ) ) + return ""; + return var->description; +} + /* ============ Cvar_Flags @@ -203,7 +218,7 @@ void Cvar_CommandCompletion( callbackFunc_t callback ) { cvar_t *cvar; for ( cvar = cvar_vars ; cvar ; cvar = cvar->next ) { - // Dont show internal cvars + // Don't show internal cvars if ( cvar->flags & CVAR_INTERNAL ) { continue; @@ -322,7 +337,7 @@ If the variable already exists, the value will not be set unless CVAR_ROM The flags will be or'ed in if the variable exists. ============ */ -cvar_t *Cvar_Get( const char *var_name, const char *var_value, uint32_t flags ) { +cvar_t *Cvar_Get( const char *var_name, const char *var_value, uint32_t flags, const char *var_desc ) { cvar_t *var; long hash; int index; @@ -412,6 +427,13 @@ cvar_t *Cvar_Get( const char *var_name, const char *var_value, uint32_t flags ) Cvar_FreeString( s ); } + if ( var_desc && var_desc[0] != '\0' ) + { + if(var->description ) + Cvar_FreeString( var->description ); + var->description = CopyString( var_desc ); + } + // ZOID--needs to be set so that cvars the game sets as // SERVERINFO get sent to clients cvar_modifiedFlags |= flags; @@ -445,6 +467,10 @@ cvar_t *Cvar_Get( const char *var_name, const char *var_value, uint32_t flags ) var->name = CopyString (var_name); var->string = CopyString (var_value); + if ( var_desc && var_desc[0] != '\0' ) + var->description = CopyString( var_desc ); + else + var->description = NULL; var->modified = qtrue; var->modificationCount = 1; var->value = atof (var->string); @@ -498,6 +524,9 @@ void Cvar_Print( cvar_t *v ) { if ( v->latchedString ) Com_Printf( " latched = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"\n", v->latchedString ); + + if ( v->description ) + Com_Printf( "%s\n", v->description ); } /* @@ -995,6 +1024,51 @@ void Cvar_Set_f( void ) { } } +/* +============ +Cvar_Math_f +============ +*/ +void Cvar_Math_f( void ) +{ + int c; + char *cmd; + + c = Cmd_Argc(); + cmd = Cmd_Argv( 0 ); + + if ( c != 3 ) + { + Com_Printf( "usage: %s \n", cmd ); + return; + } + + if ( !Q_stricmp( cmd, "cvarAdd" ) ) + { + Cvar_User_SetValue( Cmd_Argv( 1 ), Cvar_VariableValue( Cmd_Argv( 1 ) ) + atof( Cmd_Argv( 2 ) ) ); + } + else if ( !Q_stricmp( cmd, "cvarSub" ) ) + { + Cvar_User_SetValue( Cmd_Argv( 1 ), Cvar_VariableValue( Cmd_Argv( 1 ) ) - atof( Cmd_Argv( 2 ) ) ); + } + else if ( !Q_stricmp( cmd, "cvarMult" ) ) + { + Cvar_User_SetValue( Cmd_Argv( 1 ), Cvar_VariableValue( Cmd_Argv( 1 ) ) * atof( Cmd_Argv( 2 ) ) ); + } + else if ( !Q_stricmp( cmd, "cvarDiv" ) ) + { + float value = atof( Cmd_Argv( 2 ) ); + if ( value != 0 ) + Cvar_User_SetValue( Cmd_Argv( 1 ), Cvar_VariableValue( Cmd_Argv( 1 ) ) / value ); + else + Com_Printf( "Cannot divide by zero!\n" ); + } + else if ( !Q_stricmp( cmd, "cvarMod" ) ) + { + Cvar_User_SetValue( Cmd_Argv( 1 ), Cvar_VariableIntegerValue( Cmd_Argv( 1 ) ) % atoi( Cmd_Argv( 2 ) ) ); + } +} + /* ============ Cvar_Reset_f @@ -1022,21 +1096,21 @@ with the archive flag set to qtrue. ============ */ void Cvar_WriteVariables( fileHandle_t f ) { - cvarvec_t cvar_vec; + CvarPtrVector cvars; for (cvar_t *var = cvar_vars ; var ; var = var->next) { if( !var->name ) continue; if( var->flags & CVAR_ARCHIVE ) { - cvar_vec.push_back(var); + cvars.push_back( var ); } } - std::sort(cvar_vec.begin(), cvar_vec.end(), CvarSort); + std::sort( cvars.begin(), cvars.end(), CvarSort ); - cvarvec_t::const_iterator itr; + CvarPtrVector::const_iterator itr; char buffer[1024]; - for (itr = cvar_vec.begin(); itr != cvar_vec.end(); ++itr) + for ( itr = cvars.begin(); itr != cvars.end(); ++itr ) { // write the latched value, even if it hasn't taken effect yet if ( (*itr)->latchedString ) { @@ -1067,6 +1141,7 @@ void Cvar_List_f( void ) { cvar_t *var = NULL; int i = 0; char *match = NULL; + CvarPtrVector cvars; if ( Cmd_Argc() > 1 ) match = Cmd_Argv( 1 ); @@ -1078,6 +1153,19 @@ void Cvar_List_f( void ) { if ( !var->name || (match && !Com_Filter( match, var->name, qfalse )) ) continue; + cvars.push_back( var ); + } + + + // sort list alphabetically + std::sort( cvars.begin(), cvars.end(), CvarSort ); + + CvarPtrVector::const_iterator itr; + for ( itr = cvars.begin(); + itr != cvars.end(); + ++itr ) + { + var = (*itr); if (var->flags & CVAR_SERVERINFO) Com_Printf( "S" ); else Com_Printf( " " ); if (var->flags & CVAR_SYSTEMINFO) Com_Printf( "s" ); else Com_Printf( " " ); if (var->flags & CVAR_USERINFO) Com_Printf( "U" ); else Com_Printf( " " ); @@ -1102,7 +1190,7 @@ void Cvar_List_f( void ) { void Cvar_ListModified_f( void ) { cvar_t *var = NULL; int i = 0; - cvarvec_t cvar_vec; + CvarPtrVector cvars; // build a list of cvars that are modified for ( var=cvar_vars, i=0; @@ -1113,16 +1201,16 @@ void Cvar_ListModified_f( void ) { if ( !var->name || !var->modificationCount || !strcmp( value, var->resetString ) ) continue; - cvar_vec.push_back( var ); + cvars.push_back( var ); } // sort list alphabetically - std::sort( cvar_vec.begin(), cvar_vec.end(), CvarSort ); + std::sort( cvars.begin(), cvars.end(), CvarSort ); // print them - cvarvec_t::const_iterator itr; - for ( itr = cvar_vec.begin(); - itr != cvar_vec.end(); + CvarPtrVector::const_iterator itr; + for ( itr = cvars.begin(); + itr != cvars.end(); ++itr ) { char *value = (*itr)->latchedString ? (*itr)->latchedString : (*itr)->string; @@ -1151,6 +1239,8 @@ cvar_t *Cvar_Unset(cvar_t *cv) if(cv->name) Cvar_FreeString(cv->name); + if(cv->description) + Cvar_FreeString(cv->description); if(cv->string) Cvar_FreeString(cv->string); if(cv->latchedString) @@ -1397,7 +1487,7 @@ void Cvar_CompleteCvarName( char *args, int argNum ) char *p = Com_SkipTokens( args, 1, " " ); if( p > args ) - Field_CompleteCommand( p, qfalse, qtrue ); + Field_CompleteCommand( p, qfalse, qfalse, qtrue ); } } @@ -1412,30 +1502,39 @@ void Cvar_Init (void) { memset( cvar_indexes, 0, sizeof( cvar_indexes ) ); memset( hashTable, 0, sizeof( hashTable ) ); - cvar_cheats = Cvar_Get( "sv_cheats", "1", CVAR_ROM|CVAR_SYSTEMINFO ); + cvar_cheats = Cvar_Get( "sv_cheats", "1", CVAR_ROM|CVAR_SYSTEMINFO, "Allow cheats on server if set to 1" ); - Cmd_AddCommand( "print", Cvar_Print_f ); + Cmd_AddCommand( "print", Cvar_Print_f, "Print cvar help" ); Cmd_SetCommandCompletionFunc( "print", Cvar_CompleteCvarName ); - Cmd_AddCommand( "toggle", Cvar_Toggle_f ); + Cmd_AddCommand( "toggle", Cvar_Toggle_f, "Toggle a cvar between values" ); Cmd_SetCommandCompletionFunc( "toggle", Cvar_CompleteCvarName ); - Cmd_AddCommand( "set", Cvar_Set_f ); + Cmd_AddCommand( "set", Cvar_Set_f, "Set a cvar" ); Cmd_SetCommandCompletionFunc( "set", Cvar_CompleteCvarName ); - Cmd_AddCommand( "sets", Cvar_Set_f ); + Cmd_AddCommand( "sets", Cvar_Set_f, "Set a cvar and apply serverinfo flag" ); Cmd_SetCommandCompletionFunc( "sets", Cvar_CompleteCvarName ); - Cmd_AddCommand( "setu", Cvar_Set_f ); + Cmd_AddCommand( "setu", Cvar_Set_f, "Set a cvar and apply userinfo flag" ); Cmd_SetCommandCompletionFunc( "setu", Cvar_CompleteCvarName ); - Cmd_AddCommand( "seta", Cvar_Set_f ); + Cmd_AddCommand( "seta", Cvar_Set_f, "Set a cvar and apply archive flag" ); Cmd_SetCommandCompletionFunc( "seta", Cvar_CompleteCvarName ); - Cmd_AddCommand( "reset", Cvar_Reset_f ); + Cmd_AddCommand( "cvarAdd", Cvar_Math_f, "Add a value to a cvar" ); + Cmd_SetCommandCompletionFunc( "cvarAdd", Cvar_CompleteCvarName ); + Cmd_AddCommand( "cvarSub", Cvar_Math_f, "Subtract a value from a cvar" ); + Cmd_SetCommandCompletionFunc( "cvarSub", Cvar_CompleteCvarName ); + Cmd_AddCommand( "cvarMult", Cvar_Math_f, "Multiply a value to a cvar" ); + Cmd_SetCommandCompletionFunc( "cvarMult", Cvar_CompleteCvarName ); + Cmd_AddCommand( "cvarDiv", Cvar_Math_f, "Divide a value from a cvar" ); + Cmd_SetCommandCompletionFunc( "cvarDiv", Cvar_CompleteCvarName ); + Cmd_AddCommand( "cvarMod", Cvar_Math_f, "Apply a modulo on a cvar" ); + Cmd_SetCommandCompletionFunc( "cvarMod", Cvar_CompleteCvarName ); + Cmd_AddCommand( "reset", Cvar_Reset_f, "Reset a cvar to default" ); Cmd_SetCommandCompletionFunc( "reset", Cvar_CompleteCvarName ); - Cmd_AddCommand( "unset", Cvar_Unset_f ); + Cmd_AddCommand( "unset", Cvar_Unset_f, "Unset a user generated cvar" ); Cmd_SetCommandCompletionFunc( "unset", Cvar_CompleteCvarName ); - Cmd_AddCommand( "cvarlist", Cvar_List_f ); - Cmd_AddCommand( "cvar_modified", Cvar_ListModified_f ); - Cmd_AddCommand( "cvar_restart", Cvar_Restart_f ); + Cmd_AddCommand( "cvarlist", Cvar_List_f, "Show all cvars" ); + Cmd_AddCommand( "cvar_modified", Cvar_ListModified_f, "Show all modified cvars" ); + Cmd_AddCommand( "cvar_restart", Cvar_Restart_f, "Resetart the cvar sub-system" ); } - static void Cvar_Realloc(char **string, char *memPool, int &memPoolUsed) { if(string && *string) @@ -1461,6 +1560,9 @@ void Cvar_Defrag(void) if (var->name) { totalMem += strlen(var->name) + 1; } + if (var->description) { + totalMem += strlen(var->description) + 1; + } if (var->string) { totalMem += strlen(var->string) + 1; } @@ -1482,6 +1584,7 @@ void Cvar_Defrag(void) Cvar_Realloc(&var->string, mem, totalMem); Cvar_Realloc(&var->resetString, mem, totalMem); Cvar_Realloc(&var->latchedString, mem, totalMem); + Cvar_Realloc(&var->description, mem, totalMem); } if(lastMemPool) { diff --git a/codemp/qcommon/files.cpp b/codemp/qcommon/files.cpp index 8269f5f65d..6bdb1f0ecb 100644 --- a/codemp/qcommon/files.cpp +++ b/codemp/qcommon/files.cpp @@ -3384,17 +3384,17 @@ void FS_Startup( const char *gameName ) { fs_debug = Cvar_Get( "fs_debug", "0", 0 ); fs_copyfiles = Cvar_Get( "fs_copyfiles", "0", CVAR_INIT ); - fs_cdpath = Cvar_Get ("fs_cdpath", "", CVAR_INIT|CVAR_PROTECTED ); - fs_basepath = Cvar_Get ("fs_basepath", Sys_DefaultInstallPath(), CVAR_INIT|CVAR_PROTECTED ); + fs_cdpath = Cvar_Get ("fs_cdpath", "", CVAR_INIT|CVAR_PROTECTED, "(Read Only) Location for development files" ); + fs_basepath = Cvar_Get ("fs_basepath", Sys_DefaultInstallPath(), CVAR_INIT|CVAR_PROTECTED, "(Read Only) Location for game files" ); fs_basegame = Cvar_Get ("fs_basegame", "", CVAR_INIT ); homePath = Sys_DefaultHomePath(); if (!homePath || !homePath[0]) { homePath = fs_basepath->string; } - fs_homepath = Cvar_Get ("fs_homepath", homePath, CVAR_INIT|CVAR_PROTECTED ); - fs_gamedirvar = Cvar_Get ("fs_game", "", CVAR_INIT|CVAR_SYSTEMINFO ); + fs_homepath = Cvar_Get ("fs_homepath", homePath, CVAR_INIT|CVAR_PROTECTED, "(Read/Write) Location for user generated files" ); + fs_gamedirvar = Cvar_Get ("fs_game", "", CVAR_INIT|CVAR_SYSTEMINFO, "Mod directory" ); - fs_dirbeforepak = Cvar_Get("fs_dirbeforepak", "0", CVAR_INIT|CVAR_PROTECTED); + fs_dirbeforepak = Cvar_Get("fs_dirbeforepak", "0", CVAR_INIT|CVAR_PROTECTED, "Prioritize directories before paks if not pure" ); // add search path elements in reverse priority order (lowest priority first) if (fs_cdpath->string[0]) { @@ -3405,7 +3405,7 @@ void FS_Startup( const char *gameName ) { } #ifdef MACOS_X - fs_apppath = Cvar_Get ("fs_apppath", Sys_DefaultAppPath(), CVAR_INIT|CVAR_PROTECTED ); + fs_apppath = Cvar_Get ("fs_apppath", Sys_DefaultAppPath(), CVAR_INIT|CVAR_PROTECTED, "(Read Only) Location of OSX .app bundle" ); // Make MacOSX also include the base path included with the .app bundle if (fs_apppath->string[0]) { FS_AddGameDirectory( fs_apppath->string, gameName ); @@ -3446,11 +3446,11 @@ void FS_Startup( const char *gameName ) { } // add our commands - Cmd_AddCommand ("path", FS_Path_f); - Cmd_AddCommand ("dir", FS_Dir_f ); - Cmd_AddCommand ("fdir", FS_NewDir_f ); - Cmd_AddCommand ("touchFile", FS_TouchFile_f ); - Cmd_AddCommand ("which", FS_Which_f ); + Cmd_AddCommand ("path", FS_Path_f, "Lists search paths" ); + Cmd_AddCommand ("dir", FS_Dir_f, "Lists a folder" ); + Cmd_AddCommand ("fdir", FS_NewDir_f, "Lists a folder with filters" ); + Cmd_AddCommand ("touchFile", FS_TouchFile_f, "Touches a file" ); + Cmd_AddCommand ("which", FS_Which_f, "Determines which search path a file was loaded from" ); // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=506 // reorder the pure pk3 files according to server order diff --git a/codemp/qcommon/net_ip.cpp b/codemp/qcommon/net_ip.cpp index 30f7be5023..6dcb46dba8 100644 --- a/codemp/qcommon/net_ip.cpp +++ b/codemp/qcommon/net_ip.cpp @@ -975,7 +975,7 @@ void NET_Init( void ) { NET_Config( qtrue ); - Cmd_AddCommand ("net_restart", NET_Restart_f ); + Cmd_AddCommand ("net_restart", NET_Restart_f, "Restart the networking sub-system" ); } /* diff --git a/codemp/qcommon/q_shared.h b/codemp/qcommon/q_shared.h index 4b6e1da82e..835887d705 100644 --- a/codemp/qcommon/q_shared.h +++ b/codemp/qcommon/q_shared.h @@ -1204,6 +1204,7 @@ Many variables can be used for cheating purposes, so when cheats is zero, // nothing outside the Cvar_*() functions should modify these fields! typedef struct cvar_s { char *name; + char *description; char *string; char *resetString; // cvar_restart will reset to this value char *latchedString; // for CVAR_LATCH vars diff --git a/codemp/qcommon/qcommon.h b/codemp/qcommon/qcommon.h index 4748781599..3acb5378f5 100644 --- a/codemp/qcommon/qcommon.h +++ b/codemp/qcommon/qcommon.h @@ -384,7 +384,7 @@ typedef void ( *callbackFunc_t )( const char *s ); void Cmd_Init (void); -void Cmd_AddCommand( const char *cmd_name, xcommand_t function ); +void Cmd_AddCommand( const char *cmd_name, xcommand_t function, const char *cmd_desc=NULL ); // called by the init functions of other parts of the program to // register commands and functions to call for them. // The cmd_name is referenced later, so it should not be in temp memory @@ -395,6 +395,17 @@ void Cmd_RemoveCommand( const char *cmd_name ); void Cmd_VM_RemoveCommand( const char *cmd_name, vmSlots_t vmslot ); typedef void (*completionFunc_t)( char *args, int argNum ); +typedef struct cmdList_s +{ + const char *name; + const char *description; + xcommand_t func; + completionFunc_t complete; +} cmdList_t; + +void Cmd_AddCommandList( const cmdList_t *cmdList ); +void Cmd_RemoveCommandList( const cmdList_t *cmdList ); + void Cmd_CommandCompletion( callbackFunc_t callback ); // callback with each valid string void Cmd_SetCommandCompletionFunc( const char *command, completionFunc_t complete ); @@ -409,7 +420,7 @@ char *Cmd_ArgsFrom( int arg ); void Cmd_ArgsBuffer( char *buffer, int bufferLength ); void Cmd_ArgsFromBuffer( int arg, char *buffer, int bufferLength ); char *Cmd_Cmd (void); -void Cmd_Args_Sanitize( void ); +void Cmd_Args_Sanitize( size_t length = MAX_CVAR_VALUE_STRING, const char *strip = "\n\r;", const char *repl = " " ); // The functions that execute commands get their parameters with these // functions. Cmd_Argv () will return an empty string, not a NULL // if arg > argc, so string operations are allways safe. @@ -451,7 +462,7 @@ modules of the program. */ -cvar_t *Cvar_Get( const char *var_name, const char *value, uint32_t flags ); +cvar_t *Cvar_Get( const char *var_name, const char *value, uint32_t flags, const char *var_desc=NULL ); // creates the variable if it doesn't exist, or returns the existing one // if it exists, the value will not be changed, but flags will be ORed in // that allows variables to be unarchived without needing bitflags diff --git a/codemp/qcommon/z_memman_pc.cpp b/codemp/qcommon/z_memman_pc.cpp index ad2702d546..25f92d4fa7 100644 --- a/codemp/qcommon/z_memman_pc.cpp +++ b/codemp/qcommon/z_memman_pc.cpp @@ -616,8 +616,8 @@ void Com_InitZoneMemoryVars( void ) { com_validateZone = Cvar_Get("com_validateZone", "0", 0); //#endif - Cmd_AddCommand("zone_stats", Z_Stats_f); - Cmd_AddCommand("zone_details", Z_Details_f); + Cmd_AddCommand("zone_stats", Z_Stats_f, "Prints out zone memory stats" ); + Cmd_AddCommand("zone_details", Z_Details_f, "Prints out full detailed zone memory info" ); #ifdef _DEBUG Cmd_AddCommand("zone_memrecovertest", Z_MemRecoverTest_f); diff --git a/codemp/rd-common/tr_public.h b/codemp/rd-common/tr_public.h index 91339ab694..b2bfe34fdb 100644 --- a/codemp/rd-common/tr_public.h +++ b/codemp/rd-common/tr_public.h @@ -272,10 +272,12 @@ typedef struct refimport_s { int (*Cmd_Argc) ( void ); char * (*Cmd_Argv) ( int arg ); void (*Cmd_ArgsBuffer) ( char *buffer, int bufferLength ); - void (*Cmd_AddCommand) ( const char *cmd_name, xcommand_t function ); + void (*Cmd_AddCommand) ( const char *cmd_name, xcommand_t function, const char *cmd_desc ); + void (*Cmd_AddCommandList) ( const cmdList_t *cmdList ); void (*Cmd_RemoveCommand) ( const char *cmd_name ); + void (*Cmd_RemoveCommandList) ( const cmdList_t *cmdList ); cvar_t * (*Cvar_Set) ( const char *var_name, const char *value ); - cvar_t * (*Cvar_Get) ( const char *var_name, const char *value, uint32_t flags ); + cvar_t * (*Cvar_Get) ( const char *var_name, const char *value, uint32_t flags, const char *var_desc ); cvar_t * (*Cvar_SetValue) ( const char *name, float value ); void (*Cvar_CheckRange) ( cvar_t *cv, float minVal, float maxVal, qboolean shouldBeIntegral ); void (*Cvar_VariableStringBuffer) ( const char *var_name, char *buffer, int bufsize ); diff --git a/codemp/rd-dedicated/G2_misc.cpp b/codemp/rd-dedicated/G2_misc.cpp index 4a06c54317..3f612faa38 100644 --- a/codemp/rd-dedicated/G2_misc.cpp +++ b/codemp/rd-dedicated/G2_misc.cpp @@ -551,7 +551,7 @@ void G2_TransformModel(CGhoul2Info_v &ghoul2, const int frameNum, vec3_t scale, if ( cg_g2MarksAllModels == NULL ) { - cg_g2MarksAllModels = ri->Cvar_Get( "cg_g2MarksAllModels", "0", 0 ); + cg_g2MarksAllModels = ri->Cvar_Get( "cg_g2MarksAllModels", "0", 0, "" ); } if (cg_g2MarksAllModels == NULL @@ -1499,7 +1499,7 @@ void G2_TraceModels(CGhoul2Info_v &ghoul2, vec3_t rayStart, vec3_t rayEnd, Colli if ( cg_g2MarksAllModels == NULL ) { - cg_g2MarksAllModels = ri->Cvar_Get( "cg_g2MarksAllModels", "0", 0 ); + cg_g2MarksAllModels = ri->Cvar_Get( "cg_g2MarksAllModels", "0", 0, "" ); } if (cg_g2MarksAllModels == NULL diff --git a/codemp/rd-dedicated/tr_init.cpp b/codemp/rd-dedicated/tr_init.cpp index e36f136c90..f44131a202 100644 --- a/codemp/rd-dedicated/tr_init.cpp +++ b/codemp/rd-dedicated/tr_init.cpp @@ -313,152 +313,152 @@ void R_Register( void ) // // latched and archived variables // - r_allowExtensions = ri->Cvar_Get( "r_allowExtensions", "1", CVAR_ARCHIVE|CVAR_LATCH ); - r_ext_compressed_textures = ri->Cvar_Get( "r_ext_compress_textures", "1", CVAR_ARCHIVE|CVAR_LATCH ); - r_ext_compressed_lightmaps = ri->Cvar_Get( "r_ext_compress_lightmaps", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_ext_preferred_tc_method = ri->Cvar_Get( "r_ext_preferred_tc_method", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_ext_gamma_control = ri->Cvar_Get( "r_ext_gamma_control", "1", CVAR_ARCHIVE|CVAR_LATCH ); - r_ext_multitexture = ri->Cvar_Get( "r_ext_multitexture", "1", CVAR_ARCHIVE|CVAR_LATCH ); - r_ext_compiled_vertex_array = ri->Cvar_Get( "r_ext_compiled_vertex_array", "1", CVAR_ARCHIVE|CVAR_LATCH ); - r_ext_texture_env_add = ri->Cvar_Get( "r_ext_texture_env_add", "1", CVAR_ARCHIVE|CVAR_LATCH ); - r_ext_texture_filter_anisotropic = ri->Cvar_Get( "r_ext_texture_filter_anisotropic", "16", CVAR_ARCHIVE ); - r_DynamicGlow = ri->Cvar_Get( "r_DynamicGlow", "0", CVAR_ARCHIVE ); - r_DynamicGlowPasses = ri->Cvar_Get( "r_DynamicGlowPasses", "5", CVAR_ARCHIVE ); - r_DynamicGlowDelta = ri->Cvar_Get( "r_DynamicGlowDelta", "0.8f", CVAR_ARCHIVE ); - r_DynamicGlowIntensity = ri->Cvar_Get( "r_DynamicGlowIntensity", "1.13f", CVAR_ARCHIVE ); - r_DynamicGlowSoft = ri->Cvar_Get( "r_DynamicGlowSoft", "1", CVAR_ARCHIVE ); - r_DynamicGlowWidth = ri->Cvar_Get( "r_DynamicGlowWidth", "320", CVAR_ARCHIVE|CVAR_LATCH ); - r_DynamicGlowHeight = ri->Cvar_Get( "r_DynamicGlowHeight", "240", CVAR_ARCHIVE|CVAR_LATCH ); - r_picmip = ri->Cvar_Get( "r_picmip", "1", CVAR_ARCHIVE|CVAR_LATCH ); + r_allowExtensions = ri->Cvar_Get( "r_allowExtensions", "1", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_ext_compressed_textures = ri->Cvar_Get( "r_ext_compress_textures", "1", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_ext_compressed_lightmaps = ri->Cvar_Get( "r_ext_compress_lightmaps", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_ext_preferred_tc_method = ri->Cvar_Get( "r_ext_preferred_tc_method", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_ext_gamma_control = ri->Cvar_Get( "r_ext_gamma_control", "1", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_ext_multitexture = ri->Cvar_Get( "r_ext_multitexture", "1", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_ext_compiled_vertex_array = ri->Cvar_Get( "r_ext_compiled_vertex_array", "1", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_ext_texture_env_add = ri->Cvar_Get( "r_ext_texture_env_add", "1", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_ext_texture_filter_anisotropic = ri->Cvar_Get( "r_ext_texture_filter_anisotropic", "16", CVAR_ARCHIVE, "" ); + r_DynamicGlow = ri->Cvar_Get( "r_DynamicGlow", "0", CVAR_ARCHIVE, "" ); + r_DynamicGlowPasses = ri->Cvar_Get( "r_DynamicGlowPasses", "5", CVAR_ARCHIVE, "" ); + r_DynamicGlowDelta = ri->Cvar_Get( "r_DynamicGlowDelta", "0.8f", CVAR_ARCHIVE, "" ); + r_DynamicGlowIntensity = ri->Cvar_Get( "r_DynamicGlowIntensity", "1.13f", CVAR_ARCHIVE, "" ); + r_DynamicGlowSoft = ri->Cvar_Get( "r_DynamicGlowSoft", "1", CVAR_ARCHIVE, "" ); + r_DynamicGlowWidth = ri->Cvar_Get( "r_DynamicGlowWidth", "320", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_DynamicGlowHeight = ri->Cvar_Get( "r_DynamicGlowHeight", "240", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_picmip = ri->Cvar_Get( "r_picmip", "1", CVAR_ARCHIVE|CVAR_LATCH, "" ); ri->Cvar_CheckRange( r_picmip, 0, 16, qtrue ); - r_colorMipLevels = ri->Cvar_Get( "r_colorMipLevels", "0", CVAR_LATCH ); - r_detailTextures = ri->Cvar_Get( "r_detailtextures", "1", CVAR_ARCHIVE|CVAR_LATCH ); - r_texturebits = ri->Cvar_Get( "r_texturebits", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_texturebitslm = ri->Cvar_Get( "r_texturebitslm", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_colorbits = ri->Cvar_Get( "r_colorbits", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_stereo = ri->Cvar_Get( "r_stereo", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_stencilbits = ri->Cvar_Get( "r_stencilbits", "8", CVAR_ARCHIVE|CVAR_LATCH ); - r_depthbits = ri->Cvar_Get( "r_depthbits", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_overBrightBits = ri->Cvar_Get( "r_overBrightBits", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_ignorehwgamma = ri->Cvar_Get( "r_ignorehwgamma", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_mode = ri->Cvar_Get( "r_mode", "4", CVAR_ARCHIVE|CVAR_LATCH ); - r_fullscreen = ri->Cvar_Get( "r_fullscreen", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_noborder = ri->Cvar_Get( "r_noborder", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_centerWindow = ri->Cvar_Get( "r_centerWindow", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_customwidth = ri->Cvar_Get( "r_customwidth", "1600", CVAR_ARCHIVE|CVAR_LATCH ); - r_customheight = ri->Cvar_Get( "r_customheight", "1024", CVAR_ARCHIVE|CVAR_LATCH ); - r_simpleMipMaps = ri->Cvar_Get( "r_simpleMipMaps", "1", CVAR_ARCHIVE|CVAR_LATCH ); - r_vertexLight = ri->Cvar_Get( "r_vertexLight", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_uiFullScreen = ri->Cvar_Get( "r_uifullscreen", "0", CVAR_NONE ); - r_subdivisions = ri->Cvar_Get( "r_subdivisions", "4", CVAR_ARCHIVE|CVAR_LATCH ); - r_displayRefresh = ri->Cvar_Get( "r_displayRefresh", "0", CVAR_LATCH ); + r_colorMipLevels = ri->Cvar_Get( "r_colorMipLevels", "0", CVAR_LATCH, "" ); + r_detailTextures = ri->Cvar_Get( "r_detailtextures", "1", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_texturebits = ri->Cvar_Get( "r_texturebits", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_texturebitslm = ri->Cvar_Get( "r_texturebitslm", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_colorbits = ri->Cvar_Get( "r_colorbits", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_stereo = ri->Cvar_Get( "r_stereo", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_stencilbits = ri->Cvar_Get( "r_stencilbits", "8", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_depthbits = ri->Cvar_Get( "r_depthbits", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_overBrightBits = ri->Cvar_Get( "r_overBrightBits", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_ignorehwgamma = ri->Cvar_Get( "r_ignorehwgamma", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_mode = ri->Cvar_Get( "r_mode", "4", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_fullscreen = ri->Cvar_Get( "r_fullscreen", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_noborder = ri->Cvar_Get( "r_noborder", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_centerWindow = ri->Cvar_Get( "r_centerWindow", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_customwidth = ri->Cvar_Get( "r_customwidth", "1600", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_customheight = ri->Cvar_Get( "r_customheight", "1024", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_simpleMipMaps = ri->Cvar_Get( "r_simpleMipMaps", "1", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_vertexLight = ri->Cvar_Get( "r_vertexLight", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_uiFullScreen = ri->Cvar_Get( "r_uifullscreen", "0", CVAR_NONE, "" ); + r_subdivisions = ri->Cvar_Get( "r_subdivisions", "4", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_displayRefresh = ri->Cvar_Get( "r_displayRefresh", "0", CVAR_LATCH, "" ); ri->Cvar_CheckRange( r_displayRefresh, 0, 200, qtrue ); - r_fullbright = ri->Cvar_Get( "r_fullbright", "0", CVAR_CHEAT ); - r_intensity = ri->Cvar_Get( "r_intensity", "1", CVAR_LATCH ); - r_singleShader = ri->Cvar_Get( "r_singleShader", "0", CVAR_CHEAT|CVAR_LATCH ); - r_lodCurveError = ri->Cvar_Get( "r_lodCurveError", "250", CVAR_ARCHIVE ); - r_lodbias = ri->Cvar_Get( "r_lodbias", "0", CVAR_ARCHIVE ); - r_autolodscalevalue = ri->Cvar_Get( "r_autolodscalevalue", "0", CVAR_ROM ); - r_flares = ri->Cvar_Get( "r_flares", "1", CVAR_ARCHIVE ); - r_znear = ri->Cvar_Get( "r_znear", "4", CVAR_ARCHIVE ); + r_fullbright = ri->Cvar_Get( "r_fullbright", "0", CVAR_CHEAT, "" ); + r_intensity = ri->Cvar_Get( "r_intensity", "1", CVAR_LATCH, "" ); + r_singleShader = ri->Cvar_Get( "r_singleShader", "0", CVAR_CHEAT|CVAR_LATCH, "" ); + r_lodCurveError = ri->Cvar_Get( "r_lodCurveError", "250", CVAR_ARCHIVE, "" ); + r_lodbias = ri->Cvar_Get( "r_lodbias", "0", CVAR_ARCHIVE, "" ); + r_autolodscalevalue = ri->Cvar_Get( "r_autolodscalevalue", "0", CVAR_ROM, "" ); + r_flares = ri->Cvar_Get( "r_flares", "1", CVAR_ARCHIVE, "" ); + r_znear = ri->Cvar_Get( "r_znear", "4", CVAR_ARCHIVE, "" ); ri->Cvar_CheckRange( r_znear, 0.001f, 10, qfalse ); - r_ignoreGLErrors = ri->Cvar_Get( "r_ignoreGLErrors", "1", CVAR_ARCHIVE ); - r_fastsky = ri->Cvar_Get( "r_fastsky", "0", CVAR_ARCHIVE ); - r_inGameVideo = ri->Cvar_Get( "r_inGameVideo", "1", CVAR_ARCHIVE ); - r_drawSun = ri->Cvar_Get( "r_drawSun", "0", CVAR_ARCHIVE ); - r_dynamiclight = ri->Cvar_Get( "r_dynamiclight", "1", CVAR_ARCHIVE ); + r_ignoreGLErrors = ri->Cvar_Get( "r_ignoreGLErrors", "1", CVAR_ARCHIVE, "" ); + r_fastsky = ri->Cvar_Get( "r_fastsky", "0", CVAR_ARCHIVE, "" ); + r_inGameVideo = ri->Cvar_Get( "r_inGameVideo", "1", CVAR_ARCHIVE, "" ); + r_drawSun = ri->Cvar_Get( "r_drawSun", "0", CVAR_ARCHIVE, "" ); + r_dynamiclight = ri->Cvar_Get( "r_dynamiclight", "1", CVAR_ARCHIVE, "" ); // rjr - removed for hacking -// r_dlightBacks = ri->Cvar_Get( "r_dlightBacks", "1", CVAR_CHEAT ); - r_finish = ri->Cvar_Get( "r_finish", "0", CVAR_ARCHIVE ); - r_textureMode = ri->Cvar_Get( "r_textureMode", "GL_LINEAR_MIPMAP_NEAREST", CVAR_ARCHIVE ); - r_swapInterval = ri->Cvar_Get( "r_swapInterval", "0", SWAPINTERVAL_FLAGS ); - r_markcount = ri->Cvar_Get( "r_markcount", "100", CVAR_ARCHIVE ); - r_gamma = ri->Cvar_Get( "r_gamma", "1", CVAR_ARCHIVE ); - r_facePlaneCull = ri->Cvar_Get( "r_facePlaneCull", "1", CVAR_ARCHIVE ); - r_cullRoofFaces = ri->Cvar_Get( "r_cullRoofFaces", "0", CVAR_CHEAT ); //attempted smart method of culling out upwards facing surfaces on roofs for automap shots -rww - r_roofCullCeilDist = ri->Cvar_Get( "r_roofCullCeilDist", "256", CVAR_CHEAT ); //attempted smart method of culling out upwards facing surfaces on roofs for automap shots -rww - r_roofCullFloorDist = ri->Cvar_Get( "r_roofCeilFloorDist", "128", CVAR_CHEAT ); //attempted smart method of culling out upwards facing surfaces on roofs for automap shots -rww - r_primitives = ri->Cvar_Get( "r_primitives", "0", CVAR_ARCHIVE ); +// r_dlightBacks = ri->Cvar_Get( "r_dlightBacks", "1", CVAR_CHEAT, "" ); + r_finish = ri->Cvar_Get( "r_finish", "0", CVAR_ARCHIVE, "" ); + r_textureMode = ri->Cvar_Get( "r_textureMode", "GL_LINEAR_MIPMAP_NEAREST", CVAR_ARCHIVE, "" ); + r_swapInterval = ri->Cvar_Get( "r_swapInterval", "0", SWAPINTERVAL_FLAGS, "" ); + r_markcount = ri->Cvar_Get( "r_markcount", "100", CVAR_ARCHIVE, "" ); + r_gamma = ri->Cvar_Get( "r_gamma", "1", CVAR_ARCHIVE, "" ); + r_facePlaneCull = ri->Cvar_Get( "r_facePlaneCull", "1", CVAR_ARCHIVE, "" ); + r_cullRoofFaces = ri->Cvar_Get( "r_cullRoofFaces", "0", CVAR_CHEAT, "" ); //attempted smart method of culling out upwards facing surfaces on roofs for automap shots -rww + r_roofCullCeilDist = ri->Cvar_Get( "r_roofCullCeilDist", "256", CVAR_CHEAT, "" ); //attempted smart method of culling out upwards facing surfaces on roofs for automap shots -rww + r_roofCullFloorDist = ri->Cvar_Get( "r_roofCeilFloorDist", "128", CVAR_CHEAT, "" ); //attempted smart method of culling out upwards facing surfaces on roofs for automap shots -rww + r_primitives = ri->Cvar_Get( "r_primitives", "0", CVAR_ARCHIVE, "" ); ri->Cvar_CheckRange( r_primitives, MIN_PRIMITIVES, MAX_PRIMITIVES, qtrue ); - r_ambientScale = ri->Cvar_Get( "r_ambientScale", "0.6", CVAR_CHEAT ); - r_directedScale = ri->Cvar_Get( "r_directedScale", "1", CVAR_CHEAT ); - r_autoMap = ri->Cvar_Get( "r_autoMap", "0", CVAR_ARCHIVE ); //automap renderside toggle for debugging -rww - r_autoMapBackAlpha = ri->Cvar_Get( "r_autoMapBackAlpha", "0", CVAR_NONE ); //alpha of automap bg -rww - r_autoMapDisable = ri->Cvar_Get( "r_autoMapDisable", "1", CVAR_NONE ); - r_showImages = ri->Cvar_Get( "r_showImages", "0", CVAR_CHEAT ); - r_debugLight = ri->Cvar_Get( "r_debuglight", "0", CVAR_TEMP ); - r_debugSort = ri->Cvar_Get( "r_debugSort", "0", CVAR_CHEAT ); - r_dlightStyle = ri->Cvar_Get( "r_dlightStyle", "1", CVAR_TEMP ); - r_surfaceSprites = ri->Cvar_Get( "r_surfaceSprites", "1", CVAR_TEMP ); - r_surfaceWeather = ri->Cvar_Get( "r_surfaceWeather", "0", CVAR_TEMP ); - r_windSpeed = ri->Cvar_Get( "r_windSpeed", "0", CVAR_NONE ); - r_windAngle = ri->Cvar_Get( "r_windAngle", "0", CVAR_NONE ); - r_windGust = ri->Cvar_Get( "r_windGust", "0", CVAR_NONE ); - r_windDampFactor = ri->Cvar_Get( "r_windDampFactor", "0.1", CVAR_NONE ); - r_windPointForce = ri->Cvar_Get( "r_windPointForce", "0", CVAR_NONE ); - r_windPointX = ri->Cvar_Get( "r_windPointX", "0", CVAR_NONE ); - r_windPointY = ri->Cvar_Get( "r_windPointY", "0", CVAR_NONE ); - r_nocurves = ri->Cvar_Get( "r_nocurves", "0", CVAR_CHEAT ); - r_drawworld = ri->Cvar_Get( "r_drawworld", "1", CVAR_CHEAT ); - r_drawfog = ri->Cvar_Get( "r_drawfog", "2", CVAR_CHEAT ); - r_lightmap = ri->Cvar_Get( "r_lightmap", "0", CVAR_CHEAT ); - r_portalOnly = ri->Cvar_Get( "r_portalOnly", "0", CVAR_CHEAT ); - r_skipBackEnd = ri->Cvar_Get( "r_skipBackEnd", "0", CVAR_CHEAT ); - r_measureOverdraw = ri->Cvar_Get( "r_measureOverdraw", "0", CVAR_CHEAT ); - r_lodscale = ri->Cvar_Get( "r_lodscale", "5", CVAR_NONE ); - r_norefresh = ri->Cvar_Get( "r_norefresh", "0", CVAR_CHEAT ); - r_drawentities = ri->Cvar_Get( "r_drawentities", "1", CVAR_CHEAT ); - r_ignore = ri->Cvar_Get( "r_ignore", "1", CVAR_CHEAT ); - r_nocull = ri->Cvar_Get( "r_nocull", "0", CVAR_CHEAT ); - r_novis = ri->Cvar_Get( "r_novis", "0", CVAR_CHEAT ); - r_showcluster = ri->Cvar_Get( "r_showcluster", "0", CVAR_CHEAT ); - r_speeds = ri->Cvar_Get( "r_speeds", "0", CVAR_CHEAT ); - r_verbose = ri->Cvar_Get( "r_verbose", "0", CVAR_CHEAT ); - r_logFile = ri->Cvar_Get( "r_logFile", "0", CVAR_CHEAT ); - r_debugSurface = ri->Cvar_Get( "r_debugSurface", "0", CVAR_CHEAT ); - r_nobind = ri->Cvar_Get( "r_nobind", "0", CVAR_CHEAT ); - r_showtris = ri->Cvar_Get( "r_showtris", "0", CVAR_CHEAT ); - r_showsky = ri->Cvar_Get( "r_showsky", "0", CVAR_CHEAT ); - r_shownormals = ri->Cvar_Get( "r_shownormals", "0", CVAR_CHEAT ); - r_clear = ri->Cvar_Get( "r_clear", "0", CVAR_CHEAT ); - r_offsetFactor = ri->Cvar_Get( "r_offsetfactor", "-1", CVAR_CHEAT ); - r_offsetUnits = ri->Cvar_Get( "r_offsetunits", "-2", CVAR_CHEAT ); - r_lockpvs = ri->Cvar_Get( "r_lockpvs", "0", CVAR_CHEAT ); - r_noportals = ri->Cvar_Get( "r_noportals", "0", CVAR_CHEAT ); - r_shadows = ri->Cvar_Get( "cg_shadows", "1", CVAR_NONE ); - r_shadowRange = ri->Cvar_Get( "r_shadowRange", "1000", CVAR_NONE ); - r_maxpolys = ri->Cvar_Get( "r_maxpolys", XSTRING( DEFAULT_MAX_POLYS ), CVAR_NONE ); - r_maxpolyverts = ri->Cvar_Get( "r_maxpolyverts", XSTRING( DEFAULT_MAX_POLYVERTS ), CVAR_NONE ); + r_ambientScale = ri->Cvar_Get( "r_ambientScale", "0.6", CVAR_CHEAT, "" ); + r_directedScale = ri->Cvar_Get( "r_directedScale", "1", CVAR_CHEAT, "" ); + r_autoMap = ri->Cvar_Get( "r_autoMap", "0", CVAR_ARCHIVE, "" ); //automap renderside toggle for debugging -rww + r_autoMapBackAlpha = ri->Cvar_Get( "r_autoMapBackAlpha", "0", CVAR_NONE, "" ); //alpha of automap bg -rww + r_autoMapDisable = ri->Cvar_Get( "r_autoMapDisable", "1", CVAR_NONE, "" ); + r_showImages = ri->Cvar_Get( "r_showImages", "0", CVAR_CHEAT, "" ); + r_debugLight = ri->Cvar_Get( "r_debuglight", "0", CVAR_TEMP, "" ); + r_debugSort = ri->Cvar_Get( "r_debugSort", "0", CVAR_CHEAT, "" ); + r_dlightStyle = ri->Cvar_Get( "r_dlightStyle", "1", CVAR_TEMP, "" ); + r_surfaceSprites = ri->Cvar_Get( "r_surfaceSprites", "1", CVAR_TEMP, "" ); + r_surfaceWeather = ri->Cvar_Get( "r_surfaceWeather", "0", CVAR_TEMP, "" ); + r_windSpeed = ri->Cvar_Get( "r_windSpeed", "0", CVAR_NONE, "" ); + r_windAngle = ri->Cvar_Get( "r_windAngle", "0", CVAR_NONE, "" ); + r_windGust = ri->Cvar_Get( "r_windGust", "0", CVAR_NONE, "" ); + r_windDampFactor = ri->Cvar_Get( "r_windDampFactor", "0.1", CVAR_NONE, "" ); + r_windPointForce = ri->Cvar_Get( "r_windPointForce", "0", CVAR_NONE, "" ); + r_windPointX = ri->Cvar_Get( "r_windPointX", "0", CVAR_NONE, "" ); + r_windPointY = ri->Cvar_Get( "r_windPointY", "0", CVAR_NONE, "" ); + r_nocurves = ri->Cvar_Get( "r_nocurves", "0", CVAR_CHEAT, "" ); + r_drawworld = ri->Cvar_Get( "r_drawworld", "1", CVAR_CHEAT, "" ); + r_drawfog = ri->Cvar_Get( "r_drawfog", "2", CVAR_CHEAT, "" ); + r_lightmap = ri->Cvar_Get( "r_lightmap", "0", CVAR_CHEAT, "" ); + r_portalOnly = ri->Cvar_Get( "r_portalOnly", "0", CVAR_CHEAT, "" ); + r_skipBackEnd = ri->Cvar_Get( "r_skipBackEnd", "0", CVAR_CHEAT, "" ); + r_measureOverdraw = ri->Cvar_Get( "r_measureOverdraw", "0", CVAR_CHEAT, "" ); + r_lodscale = ri->Cvar_Get( "r_lodscale", "5", CVAR_NONE, "" ); + r_norefresh = ri->Cvar_Get( "r_norefresh", "0", CVAR_CHEAT, "" ); + r_drawentities = ri->Cvar_Get( "r_drawentities", "1", CVAR_CHEAT, "" ); + r_ignore = ri->Cvar_Get( "r_ignore", "1", CVAR_CHEAT, "" ); + r_nocull = ri->Cvar_Get( "r_nocull", "0", CVAR_CHEAT, "" ); + r_novis = ri->Cvar_Get( "r_novis", "0", CVAR_CHEAT, "" ); + r_showcluster = ri->Cvar_Get( "r_showcluster", "0", CVAR_CHEAT, "" ); + r_speeds = ri->Cvar_Get( "r_speeds", "0", CVAR_CHEAT, "" ); + r_verbose = ri->Cvar_Get( "r_verbose", "0", CVAR_CHEAT, "" ); + r_logFile = ri->Cvar_Get( "r_logFile", "0", CVAR_CHEAT, "" ); + r_debugSurface = ri->Cvar_Get( "r_debugSurface", "0", CVAR_CHEAT, "" ); + r_nobind = ri->Cvar_Get( "r_nobind", "0", CVAR_CHEAT, "" ); + r_showtris = ri->Cvar_Get( "r_showtris", "0", CVAR_CHEAT, "" ); + r_showsky = ri->Cvar_Get( "r_showsky", "0", CVAR_CHEAT, "" ); + r_shownormals = ri->Cvar_Get( "r_shownormals", "0", CVAR_CHEAT, "" ); + r_clear = ri->Cvar_Get( "r_clear", "0", CVAR_CHEAT, "" ); + r_offsetFactor = ri->Cvar_Get( "r_offsetfactor", "-1", CVAR_CHEAT, "" ); + r_offsetUnits = ri->Cvar_Get( "r_offsetunits", "-2", CVAR_CHEAT, "" ); + r_lockpvs = ri->Cvar_Get( "r_lockpvs", "0", CVAR_CHEAT, "" ); + r_noportals = ri->Cvar_Get( "r_noportals", "0", CVAR_CHEAT, "" ); + r_shadows = ri->Cvar_Get( "cg_shadows", "1", CVAR_NONE, "" ); + r_shadowRange = ri->Cvar_Get( "r_shadowRange", "1000", CVAR_NONE, "" ); + r_maxpolys = ri->Cvar_Get( "r_maxpolys", XSTRING( DEFAULT_MAX_POLYS ), CVAR_NONE, "" ); + r_maxpolyverts = ri->Cvar_Get( "r_maxpolyverts", XSTRING( DEFAULT_MAX_POLYVERTS ), CVAR_NONE, "" ); /* Ghoul2 Insert Start */ #ifdef _DEBUG - r_noPrecacheGLA = ri->Cvar_Get( "r_noPrecacheGLA", "0", CVAR_CHEAT ); + r_noPrecacheGLA = ri->Cvar_Get( "r_noPrecacheGLA", "0", CVAR_CHEAT, "" ); #endif - r_noServerGhoul2 = ri->Cvar_Get( "r_noserverghoul2", "0", CVAR_CHEAT ); - r_Ghoul2AnimSmooth = ri->Cvar_Get( "r_ghoul2animsmooth", "0.3", CVAR_NONE ); - r_Ghoul2UnSqashAfterSmooth = ri->Cvar_Get( "r_ghoul2unsqashaftersmooth", "1", CVAR_NONE ); - broadsword = ri->Cvar_Get( "broadsword", "0", CVAR_NONE ); - broadsword_kickbones = ri->Cvar_Get( "broadsword_kickbones", "1", CVAR_NONE ); - broadsword_kickorigin = ri->Cvar_Get( "broadsword_kickorigin", "1", CVAR_NONE ); - broadsword_dontstopanim = ri->Cvar_Get( "broadsword_dontstopanim", "0", CVAR_NONE ); - broadsword_waitforshot = ri->Cvar_Get( "broadsword_waitforshot", "0", CVAR_NONE ); - broadsword_playflop = ri->Cvar_Get( "broadsword_playflop", "1", CVAR_NONE ); - broadsword_smallbbox = ri->Cvar_Get( "broadsword_smallbbox", "0", CVAR_NONE ); - broadsword_extra1 = ri->Cvar_Get( "broadsword_extra1", "0", CVAR_NONE ); - broadsword_extra2 = ri->Cvar_Get( "broadsword_extra2", "0", CVAR_NONE ); - broadsword_effcorr = ri->Cvar_Get( "broadsword_effcorr", "1", CVAR_NONE ); - broadsword_ragtobase = ri->Cvar_Get( "broadsword_ragtobase", "2", CVAR_NONE ); - broadsword_dircap = ri->Cvar_Get( "broadsword_dircap", "64", CVAR_NONE ); + r_noServerGhoul2 = ri->Cvar_Get( "r_noserverghoul2", "0", CVAR_CHEAT, "" ); + r_Ghoul2AnimSmooth = ri->Cvar_Get( "r_ghoul2animsmooth", "0.3", CVAR_NONE, "" ); + r_Ghoul2UnSqashAfterSmooth = ri->Cvar_Get( "r_ghoul2unsqashaftersmooth", "1", CVAR_NONE, "" ); + broadsword = ri->Cvar_Get( "broadsword", "0", CVAR_NONE, "" ); + broadsword_kickbones = ri->Cvar_Get( "broadsword_kickbones", "1", CVAR_NONE, "" ); + broadsword_kickorigin = ri->Cvar_Get( "broadsword_kickorigin", "1", CVAR_NONE, "" ); + broadsword_dontstopanim = ri->Cvar_Get( "broadsword_dontstopanim", "0", CVAR_NONE, "" ); + broadsword_waitforshot = ri->Cvar_Get( "broadsword_waitforshot", "0", CVAR_NONE, "" ); + broadsword_playflop = ri->Cvar_Get( "broadsword_playflop", "1", CVAR_NONE, "" ); + broadsword_smallbbox = ri->Cvar_Get( "broadsword_smallbbox", "0", CVAR_NONE, "" ); + broadsword_extra1 = ri->Cvar_Get( "broadsword_extra1", "0", CVAR_NONE, "" ); + broadsword_extra2 = ri->Cvar_Get( "broadsword_extra2", "0", CVAR_NONE, "" ); + broadsword_effcorr = ri->Cvar_Get( "broadsword_effcorr", "1", CVAR_NONE, "" ); + broadsword_ragtobase = ri->Cvar_Get( "broadsword_ragtobase", "2", CVAR_NONE, "" ); + broadsword_dircap = ri->Cvar_Get( "broadsword_dircap", "64", CVAR_NONE, "" ); /* Ghoul2 Insert End */ - r_modelpoolmegs = ri->Cvar_Get("r_modelpoolmegs", "20", CVAR_ARCHIVE); + r_modelpoolmegs = ri->Cvar_Get("r_modelpoolmegs", "20", CVAR_ARCHIVE, "" ); if (ri->Sys_LowPhysicalMemory() ) ri->Cvar_Set("r_modelpoolmegs", "0"); for ( size_t i = 0; i < numCommands; i++ ) - ri->Cmd_AddCommand( commands[i].cmd, commands[i].func ); + ri->Cmd_AddCommand( commands[i].cmd, commands[i].func, "" ); } diff --git a/codemp/rd-dedicated/tr_model.cpp b/codemp/rd-dedicated/tr_model.cpp index f048d79a6b..af13ebf912 100644 --- a/codemp/rd-dedicated/tr_model.cpp +++ b/codemp/rd-dedicated/tr_model.cpp @@ -973,7 +973,7 @@ Ghoul2 Insert End if (!r_noServerGhoul2) { //keep it from choking when it gets to these checks in the g2 code. Registering all r_ cvars for the server would be a Bad Thing though. - r_noServerGhoul2 = ri->Cvar_Get( "r_noserverghoul2", "0", 0); + r_noServerGhoul2 = ri->Cvar_Get( "r_noserverghoul2", "0", 0, ""); } if ( !name || !name[0] ) { diff --git a/codemp/rd-vanilla/G2_misc.cpp b/codemp/rd-vanilla/G2_misc.cpp index 3a84d7162f..b7dd9c217f 100644 --- a/codemp/rd-vanilla/G2_misc.cpp +++ b/codemp/rd-vanilla/G2_misc.cpp @@ -551,7 +551,7 @@ void G2_TransformModel(CGhoul2Info_v &ghoul2, const int frameNum, vec3_t scale, if ( cg_g2MarksAllModels == NULL ) { - cg_g2MarksAllModels = ri->Cvar_Get( "cg_g2MarksAllModels", "0", 0 ); + cg_g2MarksAllModels = ri->Cvar_Get( "cg_g2MarksAllModels", "0", 0, "" ); } if (cg_g2MarksAllModels == NULL @@ -1500,7 +1500,7 @@ void G2_TraceModels(CGhoul2Info_v &ghoul2, vec3_t rayStart, vec3_t rayEnd, Colli if ( cg_g2MarksAllModels == NULL ) { - cg_g2MarksAllModels = ri->Cvar_Get( "cg_g2MarksAllModels", "0", 0 ); + cg_g2MarksAllModels = ri->Cvar_Get( "cg_g2MarksAllModels", "0", 0, "" ); } if (cg_g2MarksAllModels == NULL diff --git a/codemp/rd-vanilla/tr_init.cpp b/codemp/rd-vanilla/tr_init.cpp index a9aeb5aa54..b06abc9a15 100644 --- a/codemp/rd-vanilla/tr_init.cpp +++ b/codemp/rd-vanilla/tr_init.cpp @@ -211,7 +211,6 @@ cvar_t *broadsword_dircap=0; Ghoul2 Insert End */ -//FIXME: renderer has a copy of this now because stringed is common code and we use it for fonts cvar_t *se_language; cvar_t *r_aviMotionJpegQuality; @@ -881,7 +880,6 @@ void GL_CheckErrors( void ) { /* ================== - RB_ReadPixels Reads an image but takes care of alignment issues for reading RGB images. @@ -1537,156 +1535,156 @@ R_Register void R_Register( void ) { //FIXME: lol badness - se_language = ri->Cvar_Get("se_language", "english", CVAR_ARCHIVE | CVAR_NORESTART); + se_language = ri->Cvar_Get("se_language", "english", CVAR_ARCHIVE | CVAR_NORESTART, ""); // // latched and archived variables // - r_allowExtensions = ri->Cvar_Get( "r_allowExtensions", "1", CVAR_ARCHIVE|CVAR_LATCH ); - r_ext_compressed_textures = ri->Cvar_Get( "r_ext_compress_textures", "1", CVAR_ARCHIVE|CVAR_LATCH ); - r_ext_compressed_lightmaps = ri->Cvar_Get( "r_ext_compress_lightmaps", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_ext_preferred_tc_method = ri->Cvar_Get( "r_ext_preferred_tc_method", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_ext_gamma_control = ri->Cvar_Get( "r_ext_gamma_control", "1", CVAR_ARCHIVE|CVAR_LATCH ); - r_ext_multitexture = ri->Cvar_Get( "r_ext_multitexture", "1", CVAR_ARCHIVE|CVAR_LATCH ); - r_ext_compiled_vertex_array = ri->Cvar_Get( "r_ext_compiled_vertex_array", "1", CVAR_ARCHIVE|CVAR_LATCH ); - r_ext_texture_env_add = ri->Cvar_Get( "r_ext_texture_env_add", "1", CVAR_ARCHIVE|CVAR_LATCH ); - r_ext_texture_filter_anisotropic = ri->Cvar_Get( "r_ext_texture_filter_anisotropic", "16", CVAR_ARCHIVE ); - r_gammaShaders = ri->Cvar_Get( "r_gammaShaders", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_environmentMapping = ri->Cvar_Get( "r_environmentMapping", "1", CVAR_ARCHIVE ); - r_DynamicGlow = ri->Cvar_Get( "r_DynamicGlow", "0", CVAR_ARCHIVE ); - r_DynamicGlowPasses = ri->Cvar_Get( "r_DynamicGlowPasses", "5", CVAR_ARCHIVE ); - r_DynamicGlowDelta = ri->Cvar_Get( "r_DynamicGlowDelta", "0.8f", CVAR_ARCHIVE ); - r_DynamicGlowIntensity = ri->Cvar_Get( "r_DynamicGlowIntensity", "1.13f", CVAR_ARCHIVE ); - r_DynamicGlowSoft = ri->Cvar_Get( "r_DynamicGlowSoft", "1", CVAR_ARCHIVE ); - r_DynamicGlowWidth = ri->Cvar_Get( "r_DynamicGlowWidth", "320", CVAR_ARCHIVE|CVAR_LATCH ); - r_DynamicGlowHeight = ri->Cvar_Get( "r_DynamicGlowHeight", "240", CVAR_ARCHIVE|CVAR_LATCH ); - r_picmip = ri->Cvar_Get( "r_picmip", "0", CVAR_ARCHIVE|CVAR_LATCH ); + r_allowExtensions = ri->Cvar_Get( "r_allowExtensions", "1", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_ext_compressed_textures = ri->Cvar_Get( "r_ext_compress_textures", "1", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_ext_compressed_lightmaps = ri->Cvar_Get( "r_ext_compress_lightmaps", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_ext_preferred_tc_method = ri->Cvar_Get( "r_ext_preferred_tc_method", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_ext_gamma_control = ri->Cvar_Get( "r_ext_gamma_control", "1", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_ext_multitexture = ri->Cvar_Get( "r_ext_multitexture", "1", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_ext_compiled_vertex_array = ri->Cvar_Get( "r_ext_compiled_vertex_array", "1", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_ext_texture_env_add = ri->Cvar_Get( "r_ext_texture_env_add", "1", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_ext_texture_filter_anisotropic = ri->Cvar_Get( "r_ext_texture_filter_anisotropic", "16", CVAR_ARCHIVE, "" ); + r_gammaShaders = ri->Cvar_Get( "r_gammaShaders", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_environmentMapping = ri->Cvar_Get( "r_environmentMapping", "1", CVAR_ARCHIVE, "" ); + r_DynamicGlow = ri->Cvar_Get( "r_DynamicGlow", "0", CVAR_ARCHIVE, "" ); + r_DynamicGlowPasses = ri->Cvar_Get( "r_DynamicGlowPasses", "5", CVAR_ARCHIVE, "" ); + r_DynamicGlowDelta = ri->Cvar_Get( "r_DynamicGlowDelta", "0.8f", CVAR_ARCHIVE, "" ); + r_DynamicGlowIntensity = ri->Cvar_Get( "r_DynamicGlowIntensity", "1.13f", CVAR_ARCHIVE, "" ); + r_DynamicGlowSoft = ri->Cvar_Get( "r_DynamicGlowSoft", "1", CVAR_ARCHIVE, "" ); + r_DynamicGlowWidth = ri->Cvar_Get( "r_DynamicGlowWidth", "320", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_DynamicGlowHeight = ri->Cvar_Get( "r_DynamicGlowHeight", "240", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_picmip = ri->Cvar_Get( "r_picmip", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); ri->Cvar_CheckRange( r_picmip, 0, 16, qtrue ); - r_colorMipLevels = ri->Cvar_Get( "r_colorMipLevels", "0", CVAR_LATCH ); - r_detailTextures = ri->Cvar_Get( "r_detailtextures", "1", CVAR_ARCHIVE|CVAR_LATCH ); - r_texturebits = ri->Cvar_Get( "r_texturebits", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_texturebitslm = ri->Cvar_Get( "r_texturebitslm", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_overBrightBits = ri->Cvar_Get( "r_overBrightBits", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_mapOverBrightBits = ri->Cvar_Get( "r_mapOverBrightBits", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_simpleMipMaps = ri->Cvar_Get( "r_simpleMipMaps", "1", CVAR_ARCHIVE|CVAR_LATCH ); - r_vertexLight = ri->Cvar_Get( "r_vertexLight", "0", CVAR_ARCHIVE|CVAR_LATCH ); - r_uiFullScreen = ri->Cvar_Get( "r_uifullscreen", "0", CVAR_NONE ); - r_subdivisions = ri->Cvar_Get( "r_subdivisions", "4", CVAR_ARCHIVE|CVAR_LATCH ); + r_colorMipLevels = ri->Cvar_Get( "r_colorMipLevels", "0", CVAR_LATCH, "" ); + r_detailTextures = ri->Cvar_Get( "r_detailtextures", "1", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_texturebits = ri->Cvar_Get( "r_texturebits", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_texturebitslm = ri->Cvar_Get( "r_texturebitslm", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_overBrightBits = ri->Cvar_Get( "r_overBrightBits", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_mapOverBrightBits = ri->Cvar_Get( "r_mapOverBrightBits", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_simpleMipMaps = ri->Cvar_Get( "r_simpleMipMaps", "1", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_vertexLight = ri->Cvar_Get( "r_vertexLight", "0", CVAR_ARCHIVE|CVAR_LATCH, "" ); + r_uiFullScreen = ri->Cvar_Get( "r_uifullscreen", "0", CVAR_NONE, "" ); + r_subdivisions = ri->Cvar_Get( "r_subdivisions", "4", CVAR_ARCHIVE|CVAR_LATCH, "" ); ri->Cvar_CheckRange( r_subdivisions, 4, 80, qfalse ); - r_fullbright = ri->Cvar_Get( "r_fullbright", "0", CVAR_CHEAT ); - r_intensity = ri->Cvar_Get( "r_intensity", "1", CVAR_LATCH ); - r_singleShader = ri->Cvar_Get( "r_singleShader", "0", CVAR_CHEAT|CVAR_LATCH ); - r_lodCurveError = ri->Cvar_Get( "r_lodCurveError", "250", CVAR_ARCHIVE ); - r_lodbias = ri->Cvar_Get( "r_lodbias", "0", CVAR_ARCHIVE ); - r_autolodscalevalue = ri->Cvar_Get( "r_autolodscalevalue", "0", CVAR_ROM ); - r_flares = ri->Cvar_Get( "r_flares", "1", CVAR_ARCHIVE ); + r_fullbright = ri->Cvar_Get( "r_fullbright", "0", CVAR_CHEAT, "" ); + r_intensity = ri->Cvar_Get( "r_intensity", "1", CVAR_LATCH, "" ); + r_singleShader = ri->Cvar_Get( "r_singleShader", "0", CVAR_CHEAT|CVAR_LATCH, "" ); + r_lodCurveError = ri->Cvar_Get( "r_lodCurveError", "250", CVAR_ARCHIVE, "" ); + r_lodbias = ri->Cvar_Get( "r_lodbias", "0", CVAR_ARCHIVE, "" ); + r_autolodscalevalue = ri->Cvar_Get( "r_autolodscalevalue", "0", CVAR_ROM, "" ); + r_flares = ri->Cvar_Get( "r_flares", "1", CVAR_ARCHIVE, "" ); - r_znear = ri->Cvar_Get( "r_znear", "4", CVAR_ARCHIVE ); + r_znear = ri->Cvar_Get( "r_znear", "4", CVAR_ARCHIVE, "" ); ri->Cvar_CheckRange( r_znear, 0.001f, 10, qfalse ); - r_ignoreGLErrors = ri->Cvar_Get( "r_ignoreGLErrors", "1", CVAR_ARCHIVE ); - r_fastsky = ri->Cvar_Get( "r_fastsky", "0", CVAR_ARCHIVE ); - r_inGameVideo = ri->Cvar_Get( "r_inGameVideo", "1", CVAR_ARCHIVE ); - r_drawSun = ri->Cvar_Get( "r_drawSun", "0", CVAR_ARCHIVE ); - r_dynamiclight = ri->Cvar_Get( "r_dynamiclight", "1", CVAR_ARCHIVE ); + r_ignoreGLErrors = ri->Cvar_Get( "r_ignoreGLErrors", "1", CVAR_ARCHIVE, "" ); + r_fastsky = ri->Cvar_Get( "r_fastsky", "0", CVAR_ARCHIVE, "" ); + r_inGameVideo = ri->Cvar_Get( "r_inGameVideo", "1", CVAR_ARCHIVE, "" ); + r_drawSun = ri->Cvar_Get( "r_drawSun", "0", CVAR_ARCHIVE, "" ); + r_dynamiclight = ri->Cvar_Get( "r_dynamiclight", "1", CVAR_ARCHIVE, "" ); // rjr - removed for hacking -// r_dlightBacks = ri->Cvar_Get( "r_dlightBacks", "1", CVAR_CHEAT ); - r_finish = ri->Cvar_Get( "r_finish", "0", CVAR_ARCHIVE ); - r_textureMode = ri->Cvar_Get( "r_textureMode", "GL_LINEAR_MIPMAP_NEAREST", CVAR_ARCHIVE ); - r_markcount = ri->Cvar_Get( "r_markcount", "100", CVAR_ARCHIVE ); - r_gamma = ri->Cvar_Get( "r_gamma", "1", CVAR_ARCHIVE ); - r_facePlaneCull = ri->Cvar_Get( "r_facePlaneCull", "1", CVAR_ARCHIVE ); - r_cullRoofFaces = ri->Cvar_Get( "r_cullRoofFaces", "0", CVAR_CHEAT ); //attempted smart method of culling out upwards facing surfaces on roofs for automap shots -rww - r_roofCullCeilDist = ri->Cvar_Get( "r_roofCullCeilDist", "256", CVAR_CHEAT ); //attempted smart method of culling out upwards facing surfaces on roofs for automap shots -rww - r_roofCullFloorDist = ri->Cvar_Get( "r_roofCeilFloorDist", "128", CVAR_CHEAT ); //attempted smart method of culling out upwards facing surfaces on roofs for automap shots -rww - r_primitives = ri->Cvar_Get( "r_primitives", "0", CVAR_ARCHIVE ); +// r_dlightBacks = ri->Cvar_Get( "r_dlightBacks", "1", CVAR_CHEAT, "" ); + r_finish = ri->Cvar_Get( "r_finish", "0", CVAR_ARCHIVE, "" ); + r_textureMode = ri->Cvar_Get( "r_textureMode", "GL_LINEAR_MIPMAP_NEAREST", CVAR_ARCHIVE, "" ); + r_markcount = ri->Cvar_Get( "r_markcount", "100", CVAR_ARCHIVE, "" ); + r_gamma = ri->Cvar_Get( "r_gamma", "1", CVAR_ARCHIVE, "" ); + r_facePlaneCull = ri->Cvar_Get( "r_facePlaneCull", "1", CVAR_ARCHIVE, "" ); + r_cullRoofFaces = ri->Cvar_Get( "r_cullRoofFaces", "0", CVAR_CHEAT, "" ); //attempted smart method of culling out upwards facing surfaces on roofs for automap shots -rww + r_roofCullCeilDist = ri->Cvar_Get( "r_roofCullCeilDist", "256", CVAR_CHEAT, "" ); //attempted smart method of culling out upwards facing surfaces on roofs for automap shots -rww + r_roofCullFloorDist = ri->Cvar_Get( "r_roofCeilFloorDist", "128", CVAR_CHEAT, "" ); //attempted smart method of culling out upwards facing surfaces on roofs for automap shots -rww + r_primitives = ri->Cvar_Get( "r_primitives", "0", CVAR_ARCHIVE, "" ); ri->Cvar_CheckRange( r_primitives, MIN_PRIMITIVES, MAX_PRIMITIVES, qtrue ); - r_ambientScale = ri->Cvar_Get( "r_ambientScale", "0.6", CVAR_CHEAT ); - r_directedScale = ri->Cvar_Get( "r_directedScale", "1", CVAR_CHEAT ); - r_autoMap = ri->Cvar_Get( "r_autoMap", "0", CVAR_ARCHIVE ); //automap renderside toggle for debugging -rww - r_autoMapBackAlpha = ri->Cvar_Get( "r_autoMapBackAlpha", "0", CVAR_NONE ); //alpha of automap bg -rww - r_autoMapDisable = ri->Cvar_Get( "r_autoMapDisable", "1", CVAR_NONE ); - r_showImages = ri->Cvar_Get( "r_showImages", "0", CVAR_CHEAT ); - r_debugLight = ri->Cvar_Get( "r_debuglight", "0", CVAR_TEMP ); - r_debugSort = ri->Cvar_Get( "r_debugSort", "0", CVAR_CHEAT ); - r_dlightStyle = ri->Cvar_Get( "r_dlightStyle", "1", CVAR_TEMP ); - r_surfaceSprites = ri->Cvar_Get( "r_surfaceSprites", "1", CVAR_ARCHIVE ); - r_surfaceWeather = ri->Cvar_Get( "r_surfaceWeather", "0", CVAR_TEMP ); - r_windSpeed = ri->Cvar_Get( "r_windSpeed", "0", CVAR_NONE ); - r_windAngle = ri->Cvar_Get( "r_windAngle", "0", CVAR_NONE ); - r_windGust = ri->Cvar_Get( "r_windGust", "0", CVAR_NONE ); - r_windDampFactor = ri->Cvar_Get( "r_windDampFactor", "0.1", CVAR_NONE ); - r_windPointForce = ri->Cvar_Get( "r_windPointForce", "0", CVAR_NONE ); - r_windPointX = ri->Cvar_Get( "r_windPointX", "0", CVAR_NONE ); - r_windPointY = ri->Cvar_Get( "r_windPointY", "0", CVAR_NONE ); - r_nocurves = ri->Cvar_Get( "r_nocurves", "0", CVAR_CHEAT ); - r_drawworld = ri->Cvar_Get( "r_drawworld", "1", CVAR_CHEAT ); - r_drawfog = ri->Cvar_Get( "r_drawfog", "2", CVAR_CHEAT ); - r_lightmap = ri->Cvar_Get( "r_lightmap", "0", CVAR_CHEAT ); - r_portalOnly = ri->Cvar_Get( "r_portalOnly", "0", CVAR_CHEAT ); - r_skipBackEnd = ri->Cvar_Get( "r_skipBackEnd", "0", CVAR_CHEAT ); - r_measureOverdraw = ri->Cvar_Get( "r_measureOverdraw", "0", CVAR_CHEAT ); - r_lodscale = ri->Cvar_Get( "r_lodscale", "5", CVAR_NONE ); - r_norefresh = ri->Cvar_Get( "r_norefresh", "0", CVAR_CHEAT ); - r_drawentities = ri->Cvar_Get( "r_drawentities", "1", CVAR_CHEAT ); - r_ignore = ri->Cvar_Get( "r_ignore", "1", CVAR_CHEAT ); - r_nocull = ri->Cvar_Get( "r_nocull", "0", CVAR_CHEAT ); - r_novis = ri->Cvar_Get( "r_novis", "0", CVAR_CHEAT ); - r_showcluster = ri->Cvar_Get( "r_showcluster", "0", CVAR_CHEAT ); - r_speeds = ri->Cvar_Get( "r_speeds", "0", CVAR_CHEAT ); - r_verbose = ri->Cvar_Get( "r_verbose", "0", CVAR_CHEAT ); - r_logFile = ri->Cvar_Get( "r_logFile", "0", CVAR_CHEAT ); - r_debugSurface = ri->Cvar_Get( "r_debugSurface", "0", CVAR_CHEAT ); - r_nobind = ri->Cvar_Get( "r_nobind", "0", CVAR_CHEAT ); - r_showtris = ri->Cvar_Get( "r_showtris", "0", CVAR_CHEAT ); - r_showsky = ri->Cvar_Get( "r_showsky", "0", CVAR_CHEAT ); - r_shownormals = ri->Cvar_Get( "r_shownormals", "0", CVAR_CHEAT ); - r_clear = ri->Cvar_Get( "r_clear", "0", CVAR_CHEAT ); - r_offsetFactor = ri->Cvar_Get( "r_offsetfactor", "-1", CVAR_CHEAT ); - r_offsetUnits = ri->Cvar_Get( "r_offsetunits", "-2", CVAR_CHEAT ); - r_lockpvs = ri->Cvar_Get( "r_lockpvs", "0", CVAR_CHEAT ); - r_noportals = ri->Cvar_Get( "r_noportals", "0", CVAR_CHEAT ); - r_shadows = ri->Cvar_Get( "cg_shadows", "1", CVAR_NONE ); - r_shadowRange = ri->Cvar_Get( "r_shadowRange", "1000", CVAR_NONE ); - r_marksOnTriangleMeshes = ri->Cvar_Get( "r_marksOnTriangleMeshes", "0", CVAR_ARCHIVE ); - r_aspectCorrectFonts = ri->Cvar_Get( "r_aspectCorrectFonts", "0", CVAR_ARCHIVE ); - r_maxpolys = ri->Cvar_Get( "r_maxpolys", XSTRING( DEFAULT_MAX_POLYS ), CVAR_NONE ); - r_maxpolyverts = ri->Cvar_Get( "r_maxpolyverts", XSTRING( DEFAULT_MAX_POLYVERTS ), CVAR_NONE ); + r_ambientScale = ri->Cvar_Get( "r_ambientScale", "0.6", CVAR_CHEAT, "" ); + r_directedScale = ri->Cvar_Get( "r_directedScale", "1", CVAR_CHEAT, "" ); + r_autoMap = ri->Cvar_Get( "r_autoMap", "0", CVAR_ARCHIVE, "" ); //automap renderside toggle for debugging -rww + r_autoMapBackAlpha = ri->Cvar_Get( "r_autoMapBackAlpha", "0", CVAR_NONE, "" ); //alpha of automap bg -rww + r_autoMapDisable = ri->Cvar_Get( "r_autoMapDisable", "1", CVAR_NONE, "" ); + r_showImages = ri->Cvar_Get( "r_showImages", "0", CVAR_CHEAT, "" ); + r_debugLight = ri->Cvar_Get( "r_debuglight", "0", CVAR_TEMP, "" ); + r_debugSort = ri->Cvar_Get( "r_debugSort", "0", CVAR_CHEAT, "" ); + r_dlightStyle = ri->Cvar_Get( "r_dlightStyle", "1", CVAR_TEMP, "" ); + r_surfaceSprites = ri->Cvar_Get( "r_surfaceSprites", "1", CVAR_ARCHIVE, "" ); + r_surfaceWeather = ri->Cvar_Get( "r_surfaceWeather", "0", CVAR_TEMP, "" ); + r_windSpeed = ri->Cvar_Get( "r_windSpeed", "0", CVAR_NONE, "" ); + r_windAngle = ri->Cvar_Get( "r_windAngle", "0", CVAR_NONE, "" ); + r_windGust = ri->Cvar_Get( "r_windGust", "0", CVAR_NONE, "" ); + r_windDampFactor = ri->Cvar_Get( "r_windDampFactor", "0.1", CVAR_NONE, "" ); + r_windPointForce = ri->Cvar_Get( "r_windPointForce", "0", CVAR_NONE, "" ); + r_windPointX = ri->Cvar_Get( "r_windPointX", "0", CVAR_NONE, "" ); + r_windPointY = ri->Cvar_Get( "r_windPointY", "0", CVAR_NONE, "" ); + r_nocurves = ri->Cvar_Get( "r_nocurves", "0", CVAR_CHEAT, "" ); + r_drawworld = ri->Cvar_Get( "r_drawworld", "1", CVAR_CHEAT, "" ); + r_drawfog = ri->Cvar_Get( "r_drawfog", "2", CVAR_CHEAT, "" ); + r_lightmap = ri->Cvar_Get( "r_lightmap", "0", CVAR_CHEAT, "" ); + r_portalOnly = ri->Cvar_Get( "r_portalOnly", "0", CVAR_CHEAT, "" ); + r_skipBackEnd = ri->Cvar_Get( "r_skipBackEnd", "0", CVAR_CHEAT, "" ); + r_measureOverdraw = ri->Cvar_Get( "r_measureOverdraw", "0", CVAR_CHEAT, "" ); + r_lodscale = ri->Cvar_Get( "r_lodscale", "5", CVAR_NONE, "" ); + r_norefresh = ri->Cvar_Get( "r_norefresh", "0", CVAR_CHEAT, "" ); + r_drawentities = ri->Cvar_Get( "r_drawentities", "1", CVAR_CHEAT, "" ); + r_ignore = ri->Cvar_Get( "r_ignore", "1", CVAR_CHEAT, "" ); + r_nocull = ri->Cvar_Get( "r_nocull", "0", CVAR_CHEAT, "" ); + r_novis = ri->Cvar_Get( "r_novis", "0", CVAR_CHEAT, "" ); + r_showcluster = ri->Cvar_Get( "r_showcluster", "0", CVAR_CHEAT, "" ); + r_speeds = ri->Cvar_Get( "r_speeds", "0", CVAR_CHEAT, "" ); + r_verbose = ri->Cvar_Get( "r_verbose", "0", CVAR_CHEAT, "" ); + r_logFile = ri->Cvar_Get( "r_logFile", "0", CVAR_CHEAT, "" ); + r_debugSurface = ri->Cvar_Get( "r_debugSurface", "0", CVAR_CHEAT, "" ); + r_nobind = ri->Cvar_Get( "r_nobind", "0", CVAR_CHEAT, "" ); + r_showtris = ri->Cvar_Get( "r_showtris", "0", CVAR_CHEAT, "" ); + r_showsky = ri->Cvar_Get( "r_showsky", "0", CVAR_CHEAT, "" ); + r_shownormals = ri->Cvar_Get( "r_shownormals", "0", CVAR_CHEAT, "" ); + r_clear = ri->Cvar_Get( "r_clear", "0", CVAR_CHEAT, "" ); + r_offsetFactor = ri->Cvar_Get( "r_offsetfactor", "-1", CVAR_CHEAT, "" ); + r_offsetUnits = ri->Cvar_Get( "r_offsetunits", "-2", CVAR_CHEAT, "" ); + r_lockpvs = ri->Cvar_Get( "r_lockpvs", "0", CVAR_CHEAT, "" ); + r_noportals = ri->Cvar_Get( "r_noportals", "0", CVAR_CHEAT, "" ); + r_shadows = ri->Cvar_Get( "cg_shadows", "1", CVAR_NONE, "" ); + r_shadowRange = ri->Cvar_Get( "r_shadowRange", "1000", CVAR_NONE, "" ); + r_marksOnTriangleMeshes = ri->Cvar_Get( "r_marksOnTriangleMeshes", "0", CVAR_ARCHIVE, "" ); + r_aspectCorrectFonts = ri->Cvar_Get( "r_aspectCorrectFonts", "0", CVAR_ARCHIVE, "" ); + r_maxpolys = ri->Cvar_Get( "r_maxpolys", XSTRING( DEFAULT_MAX_POLYS ), CVAR_NONE, "" ); + r_maxpolyverts = ri->Cvar_Get( "r_maxpolyverts", XSTRING( DEFAULT_MAX_POLYVERTS ), CVAR_NONE, "" ); /* Ghoul2 Insert Start */ #ifdef _DEBUG - r_noPrecacheGLA = ri->Cvar_Get( "r_noPrecacheGLA", "0", CVAR_CHEAT ); + r_noPrecacheGLA = ri->Cvar_Get( "r_noPrecacheGLA", "0", CVAR_CHEAT, "" ); #endif - r_noServerGhoul2 = ri->Cvar_Get( "r_noserverghoul2", "0", CVAR_CHEAT ); - r_Ghoul2AnimSmooth = ri->Cvar_Get( "r_ghoul2animsmooth", "0.3", CVAR_NONE ); - r_Ghoul2UnSqashAfterSmooth = ri->Cvar_Get( "r_ghoul2unsqashaftersmooth", "1", CVAR_NONE ); - broadsword = ri->Cvar_Get( "broadsword", "0", CVAR_ARCHIVE ); - broadsword_kickbones = ri->Cvar_Get( "broadsword_kickbones", "1", CVAR_NONE ); - broadsword_kickorigin = ri->Cvar_Get( "broadsword_kickorigin", "1", CVAR_NONE ); - broadsword_dontstopanim = ri->Cvar_Get( "broadsword_dontstopanim", "0", CVAR_NONE ); - broadsword_waitforshot = ri->Cvar_Get( "broadsword_waitforshot", "0", CVAR_NONE ); - broadsword_playflop = ri->Cvar_Get( "broadsword_playflop", "1", CVAR_NONE ); - broadsword_smallbbox = ri->Cvar_Get( "broadsword_smallbbox", "0", CVAR_NONE ); - broadsword_extra1 = ri->Cvar_Get( "broadsword_extra1", "0", CVAR_NONE ); - broadsword_extra2 = ri->Cvar_Get( "broadsword_extra2", "0", CVAR_NONE ); - broadsword_effcorr = ri->Cvar_Get( "broadsword_effcorr", "1", CVAR_NONE ); - broadsword_ragtobase = ri->Cvar_Get( "broadsword_ragtobase", "2", CVAR_NONE ); - broadsword_dircap = ri->Cvar_Get( "broadsword_dircap", "64", CVAR_NONE ); + r_noServerGhoul2 = ri->Cvar_Get( "r_noserverghoul2", "0", CVAR_CHEAT, "" ); + r_Ghoul2AnimSmooth = ri->Cvar_Get( "r_ghoul2animsmooth", "0.3", CVAR_NONE, "" ); + r_Ghoul2UnSqashAfterSmooth = ri->Cvar_Get( "r_ghoul2unsqashaftersmooth", "1", CVAR_NONE, "" ); + broadsword = ri->Cvar_Get( "broadsword", "0", CVAR_ARCHIVE, "" ); + broadsword_kickbones = ri->Cvar_Get( "broadsword_kickbones", "1", CVAR_NONE, "" ); + broadsword_kickorigin = ri->Cvar_Get( "broadsword_kickorigin", "1", CVAR_NONE, "" ); + broadsword_dontstopanim = ri->Cvar_Get( "broadsword_dontstopanim", "0", CVAR_NONE, "" ); + broadsword_waitforshot = ri->Cvar_Get( "broadsword_waitforshot", "0", CVAR_NONE, "" ); + broadsword_playflop = ri->Cvar_Get( "broadsword_playflop", "1", CVAR_NONE, "" ); + broadsword_smallbbox = ri->Cvar_Get( "broadsword_smallbbox", "0", CVAR_NONE, "" ); + broadsword_extra1 = ri->Cvar_Get( "broadsword_extra1", "0", CVAR_NONE, "" ); + broadsword_extra2 = ri->Cvar_Get( "broadsword_extra2", "0", CVAR_NONE, "" ); + broadsword_effcorr = ri->Cvar_Get( "broadsword_effcorr", "1", CVAR_NONE, "" ); + broadsword_ragtobase = ri->Cvar_Get( "broadsword_ragtobase", "2", CVAR_NONE, "" ); + broadsword_dircap = ri->Cvar_Get( "broadsword_dircap", "64", CVAR_NONE, "" ); /* Ghoul2 Insert End */ - r_modelpoolmegs = ri->Cvar_Get("r_modelpoolmegs", "20", CVAR_ARCHIVE); + r_modelpoolmegs = ri->Cvar_Get("r_modelpoolmegs", "20", CVAR_ARCHIVE, "" ); if (ri->Sys_LowPhysicalMemory() ) ri->Cvar_Set("r_modelpoolmegs", "0"); - r_aviMotionJpegQuality = ri->Cvar_Get( "r_aviMotionJpegQuality", "90", CVAR_ARCHIVE ); - r_screenshotJpegQuality = ri->Cvar_Get( "r_screenshotJpegQuality", "95", CVAR_ARCHIVE ); + r_aviMotionJpegQuality = ri->Cvar_Get( "r_aviMotionJpegQuality", "90", CVAR_ARCHIVE, "" ); + r_screenshotJpegQuality = ri->Cvar_Get( "r_screenshotJpegQuality", "95", CVAR_ARCHIVE, "" ); ri->Cvar_CheckRange( r_aviMotionJpegQuality, 10, 100, qtrue ); ri->Cvar_CheckRange( r_screenshotJpegQuality, 10, 100, qtrue ); for ( size_t i = 0; i < numCommands; i++ ) - ri->Cmd_AddCommand( commands[i].cmd, commands[i].func ); + ri->Cmd_AddCommand( commands[i].cmd, commands[i].func, "" ); } diff --git a/codemp/rd-vanilla/tr_model.cpp b/codemp/rd-vanilla/tr_model.cpp index 582373a1ae..fe8218b783 100644 --- a/codemp/rd-vanilla/tr_model.cpp +++ b/codemp/rd-vanilla/tr_model.cpp @@ -1034,7 +1034,7 @@ Ghoul2 Insert End if (!r_noServerGhoul2) { //keep it from choking when it gets to these checks in the g2 code. Registering all r_ cvars for the server would be a Bad Thing though. - r_noServerGhoul2 = ri->Cvar_Get( "r_noserverghoul2", "0", 0); + r_noServerGhoul2 = ri->Cvar_Get( "r_noserverghoul2", "0", 0, ""); } if ( !name || !name[0] ) { diff --git a/codemp/server/sv_ccmds.cpp b/codemp/server/sv_ccmds.cpp index 29b3abe070..b351d2fbff 100644 --- a/codemp/server/sv_ccmds.cpp +++ b/codemp/server/sv_ccmds.cpp @@ -1931,41 +1931,41 @@ void SV_AddOperatorCommands( void ) { } initialized = qtrue; - Cmd_AddCommand ("heartbeat", SV_Heartbeat_f); - Cmd_AddCommand ("kick", SV_Kick_f); - Cmd_AddCommand ("kickbots", SV_KickBots_f); - Cmd_AddCommand ("kickall", SV_KickAll_f); - Cmd_AddCommand ("kicknum", SV_KickNum_f); - Cmd_AddCommand ("clientkick", SV_KickNum_f); - Cmd_AddCommand ("status", SV_Status_f); - Cmd_AddCommand ("serverinfo", SV_Serverinfo_f); - Cmd_AddCommand ("systeminfo", SV_Systeminfo_f); - Cmd_AddCommand ("dumpuser", SV_DumpUser_f); - Cmd_AddCommand ("map_restart", SV_MapRestart_f); + Cmd_AddCommand ("heartbeat", SV_Heartbeat_f, "Sends a heartbeat to the masterserver" ); + Cmd_AddCommand ("kick", SV_Kick_f, "Kick a user from the server" ); + Cmd_AddCommand ("kickbots", SV_KickBots_f, "Kick all bots from the server" ); + Cmd_AddCommand ("kickall", SV_KickAll_f, "Kick all users from the server" ); + Cmd_AddCommand ("kicknum", SV_KickNum_f, "Kick a user from the server by userid" ); + Cmd_AddCommand ("clientkick", SV_KickNum_f, "Kick a user from the server by userid" ); + Cmd_AddCommand ("status", SV_Status_f, "Prints status of server and connected clients" ); + Cmd_AddCommand ("serverinfo", SV_Serverinfo_f, "Prints the serverinfo that is visible in the server browsers" ); + Cmd_AddCommand ("systeminfo", SV_Systeminfo_f, "Prints the systeminfo variables that are replicated to clients" ); + Cmd_AddCommand ("dumpuser", SV_DumpUser_f, "Prints the userinfo for a given userid" ); + Cmd_AddCommand ("map_restart", SV_MapRestart_f, "Restart the current map" ); Cmd_AddCommand ("sectorlist", SV_SectorList_f); - Cmd_AddCommand ("map", SV_Map_f); + Cmd_AddCommand ("map", SV_Map_f, "Load a new map with cheats disabled" ); Cmd_SetCommandCompletionFunc( "map", SV_CompleteMapName ); - Cmd_AddCommand ("devmap", SV_Map_f); + Cmd_AddCommand ("devmap", SV_Map_f, "Load a new map with cheats enabled" ); Cmd_SetCommandCompletionFunc( "devmap", SV_CompleteMapName ); // Cmd_AddCommand ("devmapbsp", SV_Map_f); // not used in MP codebase, no server BSP_cacheing - Cmd_AddCommand ("devmapmdl", SV_Map_f); + Cmd_AddCommand ("devmapmdl", SV_Map_f, "Load a new map with cheats enabled" ); Cmd_SetCommandCompletionFunc( "devmapmdl", SV_CompleteMapName ); - Cmd_AddCommand ("devmapall", SV_Map_f); + Cmd_AddCommand ("devmapall", SV_Map_f, "Load a new map with cheats enabled" ); Cmd_SetCommandCompletionFunc( "devmapall", SV_CompleteMapName ); - Cmd_AddCommand ("killserver", SV_KillServer_f); - Cmd_AddCommand ("svsay", SV_ConSay_f); - Cmd_AddCommand ("svtell", SV_ConTell_f); - Cmd_AddCommand ("forcetoggle", SV_ForceToggle_f); - Cmd_AddCommand ("weapontoggle", SV_WeaponToggle_f); - Cmd_AddCommand ("svrecord", SV_Record_f); - Cmd_AddCommand ("svstoprecord", SV_StopRecord_f); - Cmd_AddCommand ("sv_rehashbans", SV_RehashBans_f); - Cmd_AddCommand ("sv_listbans", SV_ListBans_f); - Cmd_AddCommand ("sv_banaddr", SV_BanAddr_f); - Cmd_AddCommand ("sv_exceptaddr", SV_ExceptAddr_f); - Cmd_AddCommand ("sv_bandel", SV_BanDel_f); - Cmd_AddCommand ("sv_exceptdel", SV_ExceptDel_f); - Cmd_AddCommand ("sv_flushbans", SV_FlushBans_f); + Cmd_AddCommand ("killserver", SV_KillServer_f, "Shuts the server down and disconnects all clients" ); + Cmd_AddCommand ("svsay", SV_ConSay_f, "Broadcast server messages to clients" ); + Cmd_AddCommand ("svtell", SV_ConTell_f, "Private message from the server to a user" ); + Cmd_AddCommand ("forcetoggle", SV_ForceToggle_f, "Toggle g_forcePowerDisable bits" ); + Cmd_AddCommand ("weapontoggle", SV_WeaponToggle_f, "Toggle g_weaponDisable bits" ); + Cmd_AddCommand ("svrecord", SV_Record_f, "Record a server-side demo" ); + Cmd_AddCommand ("svstoprecord", SV_StopRecord_f, "Stop recording a server-side demo" ); + Cmd_AddCommand ("sv_rehashbans", SV_RehashBans_f, "Reloads banlist from file" ); + Cmd_AddCommand ("sv_listbans", SV_ListBans_f, "Lists bans" ); + Cmd_AddCommand ("sv_banaddr", SV_BanAddr_f, "Bans a user" ); + Cmd_AddCommand ("sv_exceptaddr", SV_ExceptAddr_f, "Adds a ban exception for a user" ); + Cmd_AddCommand ("sv_bandel", SV_BanDel_f, "Removes a ban" ); + Cmd_AddCommand ("sv_exceptdel", SV_ExceptDel_f, "Removes a ban exception" ); + Cmd_AddCommand ("sv_flushbans", SV_FlushBans_f, "Removes all bans and exceptions" ); } /* diff --git a/codemp/server/sv_init.cpp b/codemp/server/sv_init.cpp index d59b32e0a6..11891204b3 100644 --- a/codemp/server/sv_init.cpp +++ b/codemp/server/sv_init.cpp @@ -941,23 +941,23 @@ void SV_Init (void) { Cvar_Get ("g_forceBasedTeams", "0", CVAR_SERVERINFO); Cvar_Get ("g_duelWeaponDisable", "1", CVAR_SERVERINFO); - sv_gametype = Cvar_Get ("g_gametype", "0", CVAR_SERVERINFO | CVAR_LATCH ); - sv_needpass = Cvar_Get ("g_needpass", "0", CVAR_SERVERINFO | CVAR_ROM ); + sv_gametype = Cvar_Get ("g_gametype", "0", CVAR_SERVERINFO | CVAR_LATCH, "Server gametype value" ); + sv_needpass = Cvar_Get ("g_needpass", "0", CVAR_SERVERINFO | CVAR_ROM, "Server needs password to join" ); Cvar_Get ("sv_keywords", "", CVAR_SERVERINFO); Cvar_Get ("protocol", va("%i", PROTOCOL_VERSION), CVAR_SERVERINFO | CVAR_ROM); sv_mapname = Cvar_Get ("mapname", "nomap", CVAR_SERVERINFO | CVAR_ROM); - sv_privateClients = Cvar_Get ("sv_privateClients", "0", CVAR_SERVERINFO); + sv_privateClients = Cvar_Get ("sv_privateClients", "0", CVAR_SERVERINFO, "Number of reserved client slots available with password" ); Cvar_CheckRange( sv_privateClients, 0, MAX_CLIENTS, qtrue ); - sv_hostname = Cvar_Get ("sv_hostname", "*Jedi*", CVAR_SERVERINFO | CVAR_ARCHIVE ); - sv_maxclients = Cvar_Get ("sv_maxclients", "8", CVAR_SERVERINFO | CVAR_LATCH); - sv_maxRate = Cvar_Get ("sv_maxRate", "0", CVAR_ARCHIVE | CVAR_SERVERINFO ); + sv_hostname = Cvar_Get ("sv_hostname", "*Jedi*", CVAR_SERVERINFO | CVAR_ARCHIVE, "The name of the server that is displayed in the serverlist" ); + sv_maxclients = Cvar_Get ("sv_maxclients", "8", CVAR_SERVERINFO | CVAR_LATCH, "Max. connected clients" ); + sv_maxRate = Cvar_Get ("sv_maxRate", "0", CVAR_ARCHIVE | CVAR_SERVERINFO, "Max bandwidth rate allowed on server. Use 0 for unlimited." ); sv_minPing = Cvar_Get ("sv_minPing", "0", CVAR_ARCHIVE | CVAR_SERVERINFO ); sv_maxPing = Cvar_Get ("sv_maxPing", "0", CVAR_ARCHIVE | CVAR_SERVERINFO ); - sv_floodProtect = Cvar_Get ("sv_floodProtect", "1", CVAR_ARCHIVE | CVAR_SERVERINFO ); + sv_floodProtect = Cvar_Get ("sv_floodProtect", "1", CVAR_ARCHIVE | CVAR_SERVERINFO, "Protect against flooding of server commands" ); // systeminfo - Cvar_Get ("sv_cheats", "1", CVAR_SYSTEMINFO | CVAR_ROM ); + Cvar_Get ("sv_cheats", "1", CVAR_SYSTEMINFO | CVAR_ROM, "Allow cheats on server if set to 1" ); sv_serverid = Cvar_Get ("sv_serverid", "0", CVAR_SYSTEMINFO | CVAR_ROM ); - sv_pure = Cvar_Get ("sv_pure", "0", CVAR_SYSTEMINFO ); + sv_pure = Cvar_Get ("sv_pure", "0", CVAR_SYSTEMINFO, "Pure server" ); Cvar_Get ("sv_paks", "", CVAR_SYSTEMINFO | CVAR_ROM ); Cvar_Get ("sv_pakNames", "", CVAR_SYSTEMINFO | CVAR_ROM ); Cvar_Get ("sv_referencedPaks", "", CVAR_SYSTEMINFO | CVAR_ROM ); @@ -968,12 +968,12 @@ void SV_Init (void) { sv_privatePassword = Cvar_Get ("sv_privatePassword", "", CVAR_TEMP ); sv_snapsMin = Cvar_Get ("sv_snapsMin", "10", CVAR_ARCHIVE ); // 1 <=> sv_snapsMax sv_snapsMax = Cvar_Get ("sv_snapsMax", "40", CVAR_ARCHIVE ); // sv_snapsMin <=> sv_fps - sv_fps = Cvar_Get ("sv_fps", "40", CVAR_SERVERINFO ); + sv_fps = Cvar_Get ("sv_fps", "40", CVAR_SERVERINFO, "Server frames per second" ); sv_timeout = Cvar_Get ("sv_timeout", "200", CVAR_TEMP ); sv_zombietime = Cvar_Get ("sv_zombietime", "2", CVAR_TEMP ); Cvar_Get ("nextmap", "", CVAR_TEMP ); - sv_allowDownload = Cvar_Get ("sv_allowDownload", "0", CVAR_SERVERINFO); + sv_allowDownload = Cvar_Get ("sv_allowDownload", "0", CVAR_SERVERINFO, "Allow clients to download mod files via UDP from the server"); sv_master[0] = Cvar_Get ("sv_master1", MASTER_SERVER_NAME, CVAR_PROTECTED ); sv_master[1] = Cvar_Get ("sv_master2", JKHUB_MASTER_SERVER_NAME, CVAR_PROTECTED); for(int index = 2; index < MAX_MASTER_SERVERS; index++) @@ -990,13 +990,13 @@ void SV_Init (void) { // sv_debugserver = Cvar_Get ("sv_debugserver", "0", 0); - sv_autoDemo = Cvar_Get( "sv_autoDemo", "0", CVAR_ARCHIVE | CVAR_SERVERINFO ); - sv_autoDemoBots = Cvar_Get( "sv_autoDemoBots", "0", CVAR_ARCHIVE ); + sv_autoDemo = Cvar_Get( "sv_autoDemo", "0", CVAR_ARCHIVE | CVAR_SERVERINFO, "Automatically take server-side demos" ); + sv_autoDemoBots = Cvar_Get( "sv_autoDemoBots", "0", CVAR_ARCHIVE, "Record server-side demos for bots" ); sv_autoDemoMaxMaps = Cvar_Get( "sv_autoDemoMaxMaps", "0", CVAR_ARCHIVE ); sv_legacyFixForceSelect = Cvar_Get( "sv_legacyFixForceSelect", "1", CVAR_ARCHIVE ); - sv_banFile = Cvar_Get( "sv_banFile", "serverbans.dat", CVAR_ARCHIVE ); + sv_banFile = Cvar_Get( "sv_banFile", "serverbans.dat", CVAR_ARCHIVE, "File to use to store bans and exceptions" ); // initialize bot cvars so they are listed and can be set before loading the botlib SV_BotInitCvars(); diff --git a/shared/sys/sys_main.cpp b/shared/sys/sys_main.cpp index 27280f30ae..f949551b89 100644 --- a/shared/sys/sys_main.cpp +++ b/shared/sys/sys_main.cpp @@ -157,7 +157,11 @@ void Sys_Init( void ) { com_unfocused = Cvar_Get( "com_unfocused", "0", CVAR_ROM ); com_minimized = Cvar_Get( "com_minimized", "0", CVAR_ROM ); - com_maxfps = Cvar_Get ("com_maxfps", "125", CVAR_ARCHIVE); +#ifdef _JK2EXE + com_maxfps = Cvar_Get ("com_maxfps", "125", CVAR_ARCHIVE ); +#else + com_maxfps = Cvar_Get( "com_maxfps", "125", CVAR_ARCHIVE, "Maximum frames per second" ); +#endif com_maxfpsUnfocused = Cvar_Get( "com_maxfpsUnfocused", "0", CVAR_ARCHIVE ); com_maxfpsMinimized = Cvar_Get( "com_maxfpsMinimized", "50", CVAR_ARCHIVE ); } From aeeac427ea1f962b493ebc8a4db159ab1bc70b5d Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 21 Mar 2016 21:17:43 -0500 Subject: [PATCH 159/445] MP: Fix compilation issue with cmd descriptions. --- codemp/qcommon/cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codemp/qcommon/cmd.cpp b/codemp/qcommon/cmd.cpp index e22f739200..102adf3139 100644 --- a/codemp/qcommon/cmd.cpp +++ b/codemp/qcommon/cmd.cpp @@ -959,7 +959,7 @@ void Cmd_CompleteCmdName( char *args, int argNum ) char *p = Com_SkipTokens( args, 1, " " ); if ( p > args ) - Field_CompleteCommand( p, qtrue, qtrue, qfalse ); + Field_CompleteCommand( p, qtrue, qfalse ); } } From fe62047457249b0eeacbf1252e64ae7d4ac550d9 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 21 Mar 2016 21:20:48 -0500 Subject: [PATCH 160/445] MP: Extra descriptions and hopefully last compile fix. --- codemp/qcommon/common.cpp | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/codemp/qcommon/common.cpp b/codemp/qcommon/common.cpp index 92b1b46f80..9035e343a4 100644 --- a/codemp/qcommon/common.cpp +++ b/codemp/qcommon/common.cpp @@ -1157,7 +1157,7 @@ void Com_Init( char *commandLine ) { Rand_Init(Sys_Milliseconds(true)); // get the developer cvar set as early as possible - com_developer = Cvar_Get("developer", "0", CVAR_TEMP); + com_developer = Cvar_Get("developer", "0", CVAR_TEMP, "Developer mode" ); // done early so bind command exists CL_InitKeyCommands(); @@ -1174,11 +1174,11 @@ void Com_Init( char *commandLine ) { Cmd_AddCommand ("crash", Com_Crash_f ); Cmd_AddCommand ("freeze", Com_Freeze_f); } - Cmd_AddCommand ("quit", Com_Quit_f ); + Cmd_AddCommand ("quit", Com_Quit_f, "Quits the game" ); #ifndef FINAL_BUILD Cmd_AddCommand ("changeVectors", MSG_ReportChangeVectors_f ); #endif - Cmd_AddCommand ("writeconfig", Com_WriteConfig_f ); + Cmd_AddCommand ("writeconfig", Com_WriteConfig_f, "Write the configuration to file" ); Cmd_SetCommandCompletionFunc( "writeconfig", Cmd_CompleteCfgName ); Com_ExecuteCfg(); @@ -1224,8 +1224,8 @@ void Com_Init( char *commandLine ) { cl_paused = Cvar_Get ("cl_paused", "0", CVAR_ROM); sv_paused = Cvar_Get ("sv_paused", "0", CVAR_ROM); - com_sv_running = Cvar_Get ("sv_running", "0", CVAR_ROM); - com_cl_running = Cvar_Get ("cl_running", "0", CVAR_ROM); + com_sv_running = Cvar_Get ("sv_running", "0", CVAR_ROM, "Is a server running?" ); + com_cl_running = Cvar_Get ("cl_running", "0", CVAR_ROM, "Is the client running?" ); com_buildScript = Cvar_Get( "com_buildScript", "0", 0 ); #ifndef _WIN32 com_ansiColor = Cvar_Get( "com_ansiColor", "0", CVAR_ARCHIVE ); @@ -1238,7 +1238,7 @@ void Com_Init( char *commandLine ) { com_affinity = Cvar_Get( "com_affinity", "0", CVAR_ARCHIVE ); com_busyWait = Cvar_Get( "com_busyWait", "0", CVAR_ARCHIVE ); - com_bootlogo = Cvar_Get( "com_bootlogo", "1", CVAR_ARCHIVE); + com_bootlogo = Cvar_Get( "com_bootlogo", "1", CVAR_ARCHIVE, "Show intro movies" ); s = va("%s %s %s", JK_VERSION_OLD, PLATFORM_STRING, __DATE__ ); com_version = Cvar_Get ("version", s, CVAR_ROM | CVAR_SERVERINFO ); @@ -1742,9 +1742,15 @@ PrintMatches =============== */ +char *Cmd_DescriptionString( const char *cmd_name ); static void PrintMatches( const char *s ) { - if ( !Q_stricmpn( s, shortestMatch, strlen( shortestMatch ) ) ) { - Com_Printf( S_COLOR_GREY "Cmd " S_COLOR_WHITE "%s\n", s ); + if ( !Q_stricmpn( s, shortestMatch, (int)strlen( shortestMatch ) ) ) { + const char *description = Cmd_DescriptionString( s ); + Com_Printf( S_COLOR_GREY "Cmd " S_COLOR_WHITE "%s\n", s ); + if ( VALIDSTRING( description ) ) + Com_Printf( S_COLOR_GREEN " %s" S_COLOR_WHITE "\n", description ); + } +} } } @@ -1795,12 +1801,15 @@ PrintCvarMatches =============== */ +char *Cvar_DescriptionString( const char *var_name ); static void PrintCvarMatches( const char *s ) { - char value[TRUNCATE_LENGTH] = {0}; - if ( !Q_stricmpn( s, shortestMatch, (int)strlen( shortestMatch ) ) ) { + char value[TRUNCATE_LENGTH] = {0}; + const char *description = Cvar_DescriptionString( s ); Com_TruncateLongString( value, Cvar_VariableString( s ) ); - Com_Printf( S_COLOR_GREY "Cvar " S_COLOR_WHITE "%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", s, value ); + Com_Printf( S_COLOR_GREY "Cvar " S_COLOR_WHITE "%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", s, value ); + if ( VALIDSTRING( description ) ) + Com_Printf( S_COLOR_GREEN " %s" S_COLOR_WHITE "\n", description ); } } From 06b4f83d3277f3fb9f3f106dcbd54fea0e4c715a Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 21 Mar 2016 21:23:04 -0500 Subject: [PATCH 161/445] Weird staging issue by lines added extra braces... --- codemp/qcommon/common.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/codemp/qcommon/common.cpp b/codemp/qcommon/common.cpp index 9035e343a4..e3c273cfa3 100644 --- a/codemp/qcommon/common.cpp +++ b/codemp/qcommon/common.cpp @@ -1751,8 +1751,6 @@ static void PrintMatches( const char *s ) { Com_Printf( S_COLOR_GREEN " %s" S_COLOR_WHITE "\n", description ); } } - } -} /* =============== From c635d2e10100cd680f514f0d688b3326e3cd254b Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 21 Mar 2016 21:26:52 -0500 Subject: [PATCH 162/445] MP: Sorry for the spam, builders not really reporting all the errors and I'm cherry picking changes. --- codemp/qcommon/cvar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codemp/qcommon/cvar.cpp b/codemp/qcommon/cvar.cpp index 10fe02c6af..f3bafa4465 100644 --- a/codemp/qcommon/cvar.cpp +++ b/codemp/qcommon/cvar.cpp @@ -1487,7 +1487,7 @@ void Cvar_CompleteCvarName( char *args, int argNum ) char *p = Com_SkipTokens( args, 1, " " ); if( p > args ) - Field_CompleteCommand( p, qfalse, qfalse, qtrue ); + Field_CompleteCommand( p, qfalse, qtrue ); } } From d84ff1bc5076a93d7d19c35d6adf16d77066d694 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 21 Mar 2016 21:28:26 -0500 Subject: [PATCH 163/445] MP: Adds Add/RemoveCommand support to UI module under new API. --- codemp/ui/ui_public.h | 4 +++- codemp/ui/ui_syscalls.c | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/codemp/ui/ui_public.h b/codemp/ui/ui_public.h index 4a1f2d747b..782c9e59ab 100644 --- a/codemp/ui/ui_public.h +++ b/codemp/ui/ui_public.h @@ -23,7 +23,7 @@ along with this program; if not, see . #pragma once -#define UI_API_VERSION 2 +#define UI_API_VERSION 3 #define UI_LEGACY_API_VERSION 7 typedef struct uiClientState_s { @@ -373,6 +373,8 @@ typedef struct uiImport_s { struct { float (*R_Font_StrLenPixels) ( const char *text, const int iFontIndex, const float scale ); + void (*AddCommand) ( const char *cmd_name ); + void (*RemoveCommand) ( const char *cmd_name ); } ext; } uiImport_t; diff --git a/codemp/ui/ui_syscalls.c b/codemp/ui/ui_syscalls.c index 3841266b40..97d0746f04 100644 --- a/codemp/ui/ui_syscalls.c +++ b/codemp/ui/ui_syscalls.c @@ -457,6 +457,18 @@ int UISyscall_FS_Write( const void *buffer, int len, fileHandle_t f ) { trap_FS_ void UISyscall_R_AddPolysToScene( qhandle_t hShader, int numVerts, const polyVert_t *verts, int num ) { trap_R_AddPolyToScene( hShader, numVerts, verts ); } void UISyscall_G2API_CollisionDetect( CollisionRecord_t *collRecMap, void* ghoul2, const vec3_t angles, const vec3_t position, int frameNumber, int entNum, vec3_t rayStart, vec3_t rayEnd, vec3_t scale, int traceFlags, int useLod, float fRadius ) { trap_G2API_CollisionDetect( collRecMap, ghoul2, angles, position, frameNumber, entNum, rayStart, rayEnd, scale, traceFlags, useLod, fRadius ); } +void UISyscall_AddCommand( const char *cmd_name ) +{ + // TODO warn developer only + Com_Printf( S_COLOR_YELLOW "WARNING: trap->ext.AddCommand() is only supported with OpenJK mod API!\n" ); +} + +void UISyscall_RemoveCommand( const char *cmd_name ) +{ + // TODO warn developer only + Com_Printf( S_COLOR_YELLOW "WARNING: trap->ext.RemoveCommand() is only supported with OpenJK mod API!\n" ); +} + void QDECL UI_Error( int level, const char *error, ... ) { va_list argptr; char text[4096] = {0}; @@ -637,4 +649,6 @@ static void TranslateSyscalls( void ) { trap->G2API_AttachG2Model = trap_G2API_AttachG2Model; trap->ext.R_Font_StrLenPixels = trap_R_Font_StrLenPixelsFloat; + trap->ext.AddCommand = UISyscall_AddCommand; + trap->ext.RemoveCommand = UISyscall_RemoveCommand; } From 81b90ae12b74f10a119d9bcfd83a9e064e76362f Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Thu, 24 Mar 2016 19:15:42 +0000 Subject: [PATCH 164/445] Shared: Fix game library loading from cwd Looks like a typo meant that the game libraries were never loaded from the current directory as intended. --- shared/sys/sys_main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/sys/sys_main.cpp b/shared/sys/sys_main.cpp index f949551b89..2970ab9ae7 100644 --- a/shared/sys/sys_main.cpp +++ b/shared/sys/sys_main.cpp @@ -546,7 +546,7 @@ void *Sys_LoadSPGameDll( const char *name, GetGameAPIProc **GetGameAPI ) #if defined(MACOS_X) && !defined(_JK2EXE) //First, look for the old-style mac .bundle that's inside a pk3 //It's actually zipped, and the zipfile has the same name as 'name' - libHandle = Sys_LoadMachOBundle( name ); + libHandle = Sys_LoadMachOBundle( filename ); #endif if (!libHandle) { @@ -593,7 +593,7 @@ void *Sys_LoadGameDll( const char *name, GetModuleAPIProc **moduleAPI ) Com_sprintf (filename, sizeof(filename), "%s" ARCH_STRING DLL_EXT, name); #if defined(_DEBUG) - libHandle = Sys_LoadLibrary( name ); + libHandle = Sys_LoadLibrary( filename ); if ( !libHandle ) #endif { From dca1ea616311c1d5d26516743f12a176e8850725 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Fri, 25 Mar 2016 15:08:51 +0100 Subject: [PATCH 165/445] add SDL 2.0.4 DLLs stupid .gitignore --- lib/SDL2/bin/x64/SDL2.dll | Bin 1190400 -> 1230336 bytes lib/SDL2/bin/x86/SDL2.dll | Bin 1007104 -> 1047552 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/SDL2/bin/x64/SDL2.dll b/lib/SDL2/bin/x64/SDL2.dll index a65b22ce9d2857e1369997d3772b3a496d4795a8..0f653f5a04b452292ab4691a220fb7c7d4470afd 100644 GIT binary patch delta 453993 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

      R;qLkW-QOt@6aVU*vH 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

      InD&K{g-j|TeQug4^tkojncq&a5fLpUa*x} zo)sDFUAW*OxeJHGNB{OUCN2Soq6_0#st3fWP#0IrrBmWaC@g)*+=tguzNrsm;K2v! zL?hkYg;^C+7nXkR*oD(mas6lXVG_K}5=W;piT^UP*!pm7GWDT78p1`twU{YP$DvS| z%2Fes8v@G_hnx-4j1+I&f2>S4D{O2i5w}YDo2$@=b5QMVOKIUZlETWZjtXBNZy%(S z;A|E+6Sgwd^0AS{rtsikNudT8y*XDn8;3$+HcL%FDikK-y3?6L>j-qAyMw^)h7c}L z4V(rS-iNDD?QIH+k4XyMjpmA2v1y!L;aoVI6)uGhpBruw=fo!P;)6DUs(7drK6>v( ztPfY)M z6|RP}S>YDg5Dh<*75WQ>4p&Zx;iivV$V8Un5F$ep@cHjnmYj=ZsO-x6QMz<09|nc- z51JR68HN%O4dKBRo*QJFo~CGc#4M0SL(yCo4YB@Ns>d*abm_DY&Srt9U_&$%IqVBf zG-`4Z4L3u|jDInOl{n-I3w%zo)FPxZfe2h?fhyZ}S3L}cX@krPml#S!G=v9N=w+mv zm(mbfVH#>QM?;gq3tu}3RP~#qnZnK@hh1UvKxYaYFfB_KFoo_o6bf$^BefK%P`C`S z$gGeF^kf2a2bu+LM)4So*#DBkt3!ptwq#(B)7twm7Ol2NL-b)TYBVW~g$SbyeH<0) z&A7lJB73nhG8sKM=I1U$EkL<&_ts7dQp;j8Xiaa ze7eyz3^oJ~Fw$A9P>uKMrW`ga#HO@plbBRu8jcucpN3IzHjmPtu;JR!$YEP(=089S zjl(n?0yq8mt4w74Ce_x5y;!n4smx;mLz;$(L!hwq0dpT-NAX-CbzuxV_#mBVq?@}i z>npQBbYba62xReJ>`Jpn+WT-IoXrBqz=mr>mIE2=eYkFb;~?dC^E2V5|2dBdd<=)^ zMfR!MSeDufveAnl;{1_3m9BmH$7&f5L1EhxE9$euZ)GPYdK1d4>NeU}J z6@!#MRVz%f3w#p3Od#~r)$a>1mRZ(|996cD)ea>Jg|--$A<$h2q|cnx?sg^Y>USDkxWZMamn$^yXo?S-6=IOO8|@W?bkhj?Ae{?m zb002+4bkuu(T6lhRb2gEOrTL}Q@9a6dhY_(fh%w*6fS3}=}3jbIE)Wx3Rez>!tg}% zG#qIN5z!DHT;Oihnvkb%cl-iE#Q{lSxY1sr@SEXwg{$FgR=5Q=M8gdZ3L(&67I+LU z`q;S;s9JX6SST!E$+MBn6xOn5D}N9Q;}gsZXK*DDLJBv+gDX7O-$@r%?{^TWA{-j+ z6$-Bnvn$*SZ?nRau;EUrk;AsobVOB-pBt`+lv#M!biPH$p%8eQrLI6K1g^vINXSud z|C&tIASg`hZ&tX(P(lii!GkOGGSbb1G{jLM?v$cdzHA7AjZ6a7pZ7T`yzwwo*vZIZ zQ#iOEDRfv$8!$af<}j7+IE2bjtTZ=2MrtWip|Sugjl7b2GJ(1MxIk50{cc9_rls`i zK%ua$k#1f}W6@^EXowok(GVJJ(NNOYjO!aBGE}Lydo)w}$_q^l)A6~Lsf)m&=)*9U zsv{NZ4&hWgn}(5SzFySV+=a(cyjU^$=Y~R{8aTi(nENnguUR3BhU*;raKupiAdP~v zd64#m4bjlZVe7*A@wa!O>N5m>`tjLJWjqc=ANFFY?xb=VTTbO@m;{BT@uZM$U|dJ> zrY?+u2Op#pjdXJtX6+$?s_p8xbge@lW(~3T;XpW>1&)CY(NJVCMZ^2$E}RA*{njf? zTsjU#7pAh*2uQ{cA6ORD5-c(vfWpfA&3)L|u7uwyg$GwS2ld_-D++f@U0C^%V;8>u z5EQE7+iH{GZI(C_M%*ejve^3Y;C&8#NRQFLOK-wO=HU<``BOA3wJ%aJPU}FUxdVB) zw+?_n)m+(mPZr)ZMxU048Lv%Y1p;ZEs? z*njb*$rkS~#fd(2SZLON2r=DXX8l-%LorB~vD7rALZY)lx-t<8!|yW>(vgM`5~!(g z;R<)7-rE#b?2;6Qqejz0Q!&`Ca1DIT3b(?B&kffIfwpxfz(Jt;b0~fGdl-)T$ULU7 z6o*3LR+gHJR4DueSJ(11EKh*K_&Bq|8HNy2xDg&);JH3d1XinMlEQe=VB=QlgLZ}c z;A>WR3N~CDiVXH?7>$}7KUKTB8Zu_(GI2T%#WXyPLsegaWT^A3Wg1rXhr+Zz=4rUZ zu7pj)WANY#y^M78N*dxI5G!dKYPCm0wZPJdOQi1s{k+pr;tg~gqM?z+HVp^gOViM{ zWebLj{$>tS=z&9_(3Pd`LMjBZ`wX|o3S9qtGKIPKniXzF@nSGCg;)Ctg>8*=v%*-k z*&Yp{F!uwq!U9V-h%oN5c}oJ-rd;7eMi!gGr}5h<4m+9{xagn1#1uy0P$&#zsX9`j zFxjcX0-s1UUoYxy7I++`bAhV3I5ZRvFbrmeDPKwoi&i-*9D(J-P#6Vg^C;~J8=|3+ z!zOTkFD4M5|J(X-IDGVPvzfvK914YTEY*V)me+Fin~1j)>!rQS3a_JhQy0d-gAdY) zMmh;p=~rd4N+pG*D;*V1PqHgag0orSXxMP4)W~5|xVER%h11}o-+GY=OvfP;$nJlq zvg8QpMjxi&=E3cww7@3=FGtoZdzuwCHk42o4u=OoFd+#w09T)_q6^9Qjj zef0#EOM*(;IV@xj2MMwkdsqrN$!_BJ=EL^Om4SGWq*ioP{P!!OJVSu_;Q6)S1+0H#koQwm?wC%%8M3`T^* z_eH1Mg2kooOrZG|%|`g>z46!@t_^W02I+E^nobY1W!H9Xcpn6Y_b_+i$R4Uq30r71 zxNwELQSWViSW#kDh=nHHXs>Z?h>kI);c7UWyKoC^xHf!GC^WhdKRm@H+CDhsJDRWI zrjMG%M1F}wh-5pO&sl07QqhHDA@a5zO?ey?#&;)$)P*w)AtD;Wg9|(tO9EAg+ica_ z%?ib*^Ml-QI@e8|XRjMBiTV`!nV#fliX z=$}8&6h`1sC=6q%I#Qvq0+H6)N*amg>qRj_AU*$k9L1Xy1{(?o80lt(DW6LUi{5cm zIHI3jVHBLrqqHY%h=xXvL>13q@JBG_-ySo&{Ah12`m6(+&itZ+1Jh=xWETNkeFN&+2X z#j`5>^y^tnWf~5lk_C$~EHxb3(T@e#K+4j70T_g zqHv2LP!+!-SGinFLwY{HFrEpdVDTiJ%>rM54R=aK2K%=AP#1X`YVgsUb8)kAD7rA4 zr6wR1;yhK14`+R7?FohMLLuEM?QU1XV#PFgaD}T-FIQ;p!s5>ig-jq~g}c#SF%37} z&%03N?`oL~Z?nXuFydC}+oIQPeR#36G)OnXMejYGb>9jc3WdvAYC2M(uo{P^zND zJ{YMFuXYm(+ZyTScpr;4+XbQvbC)@EVXO)f#zNyG32ep%4iP!*eK@6~=tDF*8hO~) zviw@a<3Z+pOQghM5{F2v21p5>61z%Vz0tA4OA=Q}d|KiPM^-I|91|?%5|>C^Eb%&t zS4zBG;z9>j^DPS;67nrpiL)inl6Z>584{;ToML7beU@xa04GWuCvmLA(Go{W942vy ziSJ>9Ccu=y*i&LxiK{==S}jxBsNZ}_V_^b&U1^J4d@{<%V7W*(#$<`a#o)ev8@JQf z3GqpcWM3)qa)}ECt40M2BnPX+*%D_-JVoLRiBly`Ay#d(E?II&lsHb}Sc#)0j+8h| z;tav!lK8a56^vEWx^qZ!D3`cI;$n%{NxV|x z8(n%y;wrGiBseWOR7iYC;&O>gBrcYCoy05GV*_WNh07&}LWvhhY?U}$;w*`$NSv`A zHxSGXNR=E?BuVtM@k$fafrkL5_?MQDzRF<*0Iko zNn9oIX^AT&J|uCu#3hcbT8bSLEbAm*De-cN3ngA4u~p)12gc=3mO}#W3`?9LajL{A z5+_TXC~=&bA4c4dH79_hC61IhOyUrU1J-JNS1Fy;vma5{&PSQ2#jz1dDXG@$V@f3+OK9Z((s^pL&ak9jT630m#3-0#{^5E#0w<0+F2XBN(oV)6bWnuXV{JWB0E*$6p521PLw!K;#i5JKa@sr zq~s7LafrkL5_?MQDslB1seji4!mrGnI@dAmh z5@$=CC9yh1O2`0X&e^6=D&viIPLViS%AY84oW!w?tXiTS6D*Muhe;eFae&0061z%V zz1lnm5S%VKB;Y+N5}%g1LgGUbmrGnCaj}`%y}5Pf1n^3UmrGnI@dAmh5@$=CWnx@f zAsm|$7-vYFDshU$$r2|@94B$Co$=iOR2XefpgYVGhe;eFae&0061z%V{edwCRJx^o z$(BG|CGlyADA1oGfvo#BmbG zN*ujPj{lNFn8YCx2T1HGv8%+@D~)+Cru|Ae{!0$0C9aV8ki_K@mq=VJ@j6vXSSj&x zi3=rOAhA{AY>BfZR;Ne_84{;ToFZ|u#EBBeNgV6Qi2sfWmPm=iBo2`{Kw?jcT_vtw zVIBi4{yQWf{!4sX;tGimNn9>*iNwWb=JDU0z~aBe%Ox(9c!9)LiL)inGBL$}Qv#3w z5~oU>B5|_Bi4w<29BXG0|LqAB|0NESI7H$Ai9IEDmALwSV+$T4RpJzhlO;}+I8NeNVpIH= z93mwSlQ=};0Es;%c9ppLJvIi+@t-G{;=jbFC9aV8ki_K@mq=X9*dhK)4l5;IE^(p6 z3naEmoGoz{m_3CT0Crh08p7z)lWkCI{Z$oK;&*OpYF&6y(*qTLJ z$rdHj&Fx+7XZCma+gk8erIY2^CG}k9Yrkw!+PL*!qD|Y1A46`uL@U~=w0ApKsC~`; zZZ6c^KgZuWg<2Q(cVwZKhQBS^79uPEh;%;w;b+X!H{+?tnqn7EyjE;XV{P5%N;9{4 zLE6F3m6jbs8spc}zUt|k>0v#HJmW|0z%w~z@!_E^{_y_b4LpiNzttHZ9-;RP((c-( zw7Pr2I}l;r)9Y4^i;Lf@ZSVvUmg?78V%~PY+!)S-(-W+Lx$kIocPPC_WR6Y94~*ds zU-{)OV9zaB?}LM-B`<04_=K`P>FjX^Jlgf|dM-KJU9Fbiaggux3;w@}J))E!_!ACe z56$w<53InEHSpNK>uLHnrT2jMfC+hD`Q_o=n|Qj@GLNy<@+$jN)@M8`*C@XVZ_25$ z-#E(;9LAgqeBKGbgGZCQYU8&nLF$AE{s59+UdgSRn&|CS_`*yL4Gi1!usO_sR(JLw zlh4)VthyZudF7cF{ai30??jp9EK=FOOn;nE{n6#_cnHcbZx}x}J||h0yz;4*^8xG; zsQi?4J&u2?>BQ7u@s4DleYe~1vf1-}K9$W8x?(cFb-THef1`+%UeIjzR9{H$n*D;W zOPS?<__BWqc-&1Ks(8xFo*H96>|#HRwjZ_^hsM;Ymyol=L(gOtmfe4immPa~>Q6XP z{-}|irKSn_aX2d$7qI>SbIkYoeI~a}txU)t=(B=Nk}}KIOkZjn%cEZoLSnwpT-fyC z?6}M_6UV#){;=GR{6Ljvmxn)k=h1s_)Ko3JrCltwgs4yBsa|HY?#bIewMpN+?c30& zHGX-6@N0qAYZ&-X%q2b|rO<+CrVLlGoPhR4O zN@4ZOv!Vo)=a)AgU5i0D?{_5RoO6w?NhokX!dq8zMy-<&`9(rOW`l0$CtxNVeT&tA znNXJv2bu|Aur#ZACM-n?p9u?bkndA~|BIRMG7f1bOvjNm@HzY+XT6(iSwie(zue9E zF~fYz7$k}r`f^jGV2VD@{MZ!zlrx{AL*8Ojw2ylf&WCn!n{v-X2i~OC%S5|!`SeJLNU-{BU#7iRs@&uGBC}a7S-hakEHFFa2bTtL zVP{i6-r)wOKb_RPem9Xn-_z$cIO&(_*VEqoQfU0M%}xDRG56)yNACPIPFKvq|7 z2krQmO0$*^vqrSTNsi;4xEV@O+34_&RYk01t54KYt?^E!i4t>{yVh-|(&>TSZ=i4Y zVZ1g)qw?yZtnb^i24S?~SNz6}!LN4m9hy%e9NB>N(O(TDggfiZ`t4@L(Bc7H>QDpNYBuFPh&Tt`5{ z_>4H8%T5;hwipR|LsV$JXloIq=Tg}PJ_TNAacR37HE7UV+u3IpM!SnU!bdL-b$6-4 zE4?v(`nbdmeONpKjPGipVC%j(>(`JTlF+NbCzO@+JWAr)+3PFCOpRe};=BGU9CKcU@dkzp_JY37L*4~^2i%9SQV`nQ14Cm~e)vNdAd z>&VGgB0rpy&{5{+etarm)4%p*a;Bcfus#h&3o~aVV^yJVJ?%=l(kb2>N$l69 zQJXh)kZo91X=q8M4{r&UWy>WnKUXjDa}~(!Xw*4Po3vX=xHp%fbp%?o1FadDx83S9 z1xZssNU{cIvaHs?sobU6bBywR`m;ZLOjIrPsi$4ut%UnGL>lHddng$-j(b9Dvqy=1 zpvx01IBd^+Jm3Gy7w(xaz!V~q8nGm|%=TrL&t9v?pJk>AvSV{7TFIXU*4xonqS2Q> zOw``kqjdDX#G~bQq%w|@lg0;-Vx2P76e%^x~4>k`H)WYA#MzQIUQ#;5`Hu% zTA=A{G5Cf~W*-;^=2a#|S$|3N>-#%gW4J3kCc#6jT4k0%q_TgQC07<{|?o(nsdo!EW60=B)*{?+R_<12)pFd>zdo=rr1K;lDTh0KsAwRsE z9mR2i_5SpH%UT@qMf&}P+B^G|mVqB4p(-1TH4~Eo&`Uk*X(#q8kv*am=zg^IjhgcZ zV7z}ks_o0X$Kj-7bVajceBY;r)|UYxn0B9|AS}z3vEcnrxf69Z-{4qN7^I>3TzOn7hzrtO&PxU{4 z7p<7uhx?UA4ac(NGRp(_!~UTMqW-0|J*Z3zI=q0DjUH%k?}2R#s0U^-o7FOH0q+4d z3h0;nCd=QWSsM=7yfDjM0HX(jcqY~Z7w3x}_z4G9U*m)sJ2{_nr0C&wu|izKNok&Q z&DAfrH5_uTVe52|B3=-f2clvx)S~z6-2kP00vr3~k{4WXzBaT(k8NjzlXux-Rt@dc z1GCvNUe6-BY)O#2cJ`1GG45CYdM@z=;Sos%lfpywLk~LXw&&AK-PQpEj(1zo2gXR& z?;gN9@4~CR^ID=Yt7`BZbo3S7t)({kDx>&uHfV%Uhe0Hnk4Hl34VRA zVzK!W30Tmk`koKv=SJK174|c4GPg2IKK`(O=&ebwYUjREo)7Zl1)#T*?7j8pJni|z zN;l8qdAzqio~La&jQz~xK)>A2SpFW(9^t^d4*NGi+~+8OO_;$v7wfLJIN}o~3k$M3o5`Mx;a z)-#b`u>I@L@TR^@LoZZWfjD_fZ=#07p*L#ctUJ#y5nZ{y01kL_2b+CwvEx`Fm&%3ZxeQ6{=I z9(Erbvd;3<6@~X`4}6VJf4qvzzc?4g?$8sN<;1K&W?2@Xr5;h5-?i=r+O4<1es9P5 zJ#42zjmfvHMjrHD@px_d5v4)=>r2ocYqRC!@rTDG({F*Zg$Ukynj5eA5Sl-QEtx;Dw$jE;S7@}$69>`%VW0sPV1y4BOB z9#uLgY#7HH!6JF47b;m?$k2@iv|g{n!EN1LF5`MX@ahC#m-83+EEd}^Yyc0Ss5j@Z z_8-BC_scCpReFI7I|Y7u8ml+I*=x+6cVcS5`Ke;_qisK?#3np|^vqO@=mG2?0d*$w zlA7Je|FCh~6h|1x33*qn7JnR1)llD`R+J~UiB*GK>S=M`C_%0NK1{GS+SVB(2^_rI%ajliGljN>jJileP4dN{7Hd@Qa8O;{777P4J7@ z`CDJVlxzAUPim`AD%0Gu{?J;TQpS4yj`6fOm<6cU-l{i3J9|p$>-MinTGY47BW`0m zX!F0t4W)-Owc>A;^q{tUOyve+jq#gzH(UD(S{<0L#eAo9a?5G2J@FlUXFRJd`VPLa zy#|f-#m$~>IFVJZ_+NCno)oOr|6XaA&_D!#I1#8gY0peJn;VnYgNs|jS_OM_3={|ZO_@^nvlKI9es|gmN?ha9&fS2W`3D( zIe@;7%lXnZF?(l6B*n#kIdguz^?PH;#*JpG zGMgHwBaF^RMa>X8AB*glZfxSFKu2P5bPO(jm4tOU~I6J|BNwrUxfk&*7Bou7B3l^g_amIYYyvT+VOKxBNPi z4GF(_=a8CI(Dn7Xn*R?JLiu`W^9; zw$a-+TLSq8fL(=Z^L|hgy9J`eocQnvbSY*fI~B1Yzq#!(Dv=)LTD1v7Gv^v&;&o)2 zbw2t;^c9Re&971kiw=J&$$CZ~7AY$GH#`Ov6ouYEP>kEeIwsNj3hN~ZO0u5T2Ts;f zE0u0e@+C^J^Tv}Vf1w>nm zwC=5SYrQeR`aGZCA3t6%a%VYn=FFKhXU?3NJ2%A7brK-x)~_#N+;5gB z`4lDZK{A|FvCvE5*2R0Qs8U@f*gX;&U*c9!Za-XhWJ}2RavK15l@vs)n{rOZk?nb1GxAq^ES$WVOj^k)@cJa*^orYChf}Ku=dWDQ4$_>z z%uig%?YU-l1q}96+^izYoQyo>gfvFC7yzG1Z2u@dbB#4!V2GF=o z$CR+45b@+t$$@nox*DTaN39>|8SVZh?&dX)5@)%ZX-zJ!`~#-6V+qP+B$ed;DMfo4 z7VT|Vw6|f=YQyZ93%o6h_O>kA+p=hH%Ya9184yv+NFea=t{a8MLi_yDzFb-OsBlZ~ zO(}FjxF;3itcaUZ{mDiPezT34DwV1I9B{h7hKWOPgKlw=w!R#WmZHGm0Q{gpd0HqM zL@6_kndNC=fJUVL)Nr^q@tn0*J-jIPpT8D6yDk;R;?J!R=Kg9=Z88lkB|2!NcexTTVXNIQEpzW zX=Dyn^$3H6Z@;K*ZU<|!Eym3M(TH7uk<-G!f)}FjGuN0>4fadRcY@(whFPT03~(0@ z;7FCCkK?}*z~cg>t(8d5{v!v=ubWcLE{YsM&d6X?bqD{~r0Ab-O7_eHf^V=4z)Rv` zTClX#imIu=N&2ZWOVPXWzaRQ2Yd8IX-I=9QScx>MMCm&o)*zq;2jn1yLTSM{(x_`F zP>TP31Yb%&`+N%NQAh>1OJk1!{EnxNDiBr%Bx8T3qIi~5(TbZeT154v6SGQyiDKEH zp+b;RL6mGC!~CR?6;h|`FV>M9#dS!dgCZ&W5h^GtcNpJ;3~8ueB3&AFTZyJ*fDa(> zYhLgQrFaZqeno51+#AF1T-HWLZpHUXP%$U~bbX7_Nc4DD6TH(EZR4i@;4@eMuDM*) zJZ=mhcSUPx>ZPo}i&GLnO^(z_M{v^8uh3^`{bXa5)M>KOC@rN8I3&z8CKAUx zz6&T|)#2HK+9{2qF3Fl{j7B>v&}wjJFY1_SjN>b=YI`)DH(G7%qz437LWVdRb6z<$ znxDR^4QsN`lRr%D1~t1%i671N*R=iZZy=k58T&LO%VU2k$YyqHq0(eCG(h(5NI*Eo@j1A+w z%|dNx8<-kR?P|;)T+=pf+7=(X0_M=i8@GIv+PL|i{Kp!1CQEHxIPxj_V+O8{e&iIY;~^oDv&gqeN>GA z;51So4&xp`TA?RA`r`|sQ9SyCw&@%~;V9S6LWA7-hiba3Y`R3wF+bO*h)dCTp-EkH zu_U!lBGsN2VCAJZw7t{z;`2?!w|vZwkP1?bnECvRyx+P``t1V%L&>2A3A5ot5Y z@gHgw);q8}^A<$H9{mG5uviYbu`IR&yo`kdnQk7CS>$f7i*>ZQXiZdg_0IfzEuYsT z@5(6*w5@E&Kb1MHb?GRho;L8u6lZqs$#Loukf!WAS6#2Vmw)cdFpnai2;s~B);1n# z!IHWgtoR&@6Y^k-kxc;^P8V7gtsMKKy4piz0dB*qhW$6b)?mRp+I_f2?r}R0eezIk zt*g^m{@!h^(O#Gidtg$9{TFw%Kfw3O+(KHNGMh3lBYl%H}S9p5|-qXut9? z`o>X`I}v5!T>8g~orSg@_+Y|>lL1R=i%^N@)Dn+x3@HaXs6J5aqZiMI4kI5CaFzW@4S+lV;7easwnEyYsG{54U=F#OqnNCJ7F38U1(kIeUr3mM1X{@z#DLGj zod=QiS#v*)jirOmUu-#!3fug=yZ*Uja8#to5QAdhlMS7>KobNT`L(?k`J*MoV^g6` z6J*DfS>!MZNx9Q<-uT523D!2ldGw#7IjvLvP7CqNai(0sL&ytOgD;+`hJ@JWsXh{K zXQNN@z$!mc=T?A=>TD;zCjr9@>V8FCqky8M-|G3P)ks^z?0s`zGcSIS1ahRUDKDd- zZ6V^r5YL_Lypwk;6rwo?$?iN40_?FM3S|<724LgAaHg@N6SEEpr;t+T0tjh3gj6_r zgqSw|{of9r8me>J7YE+UaT+9`bVY!%ImJ|I6e@ktA4!2of)H=PTU=bZr%lwKrpD*u zEQs!d{vo{MeQo=o92i&R%N+X~AAet)-0TlB87jb{dKTwC&w#*z1zi&q*m7SRA9R?$ zii!e1o#fZ=YX{n2PlZh5wh-@pP47r;j*&uJv8!)IMk?*XK9b%|iJLK<)-i>~F`nb?Y)A3N2-M_DH<3@u9 z3(WKq0Ng|awms1HNP6aJF(~D*eL&WliWOAB2fquAC3q8bk->FLU~}W4=z$H8caQPt zhuSDj*wg%phuSupXP)76A8Ny-wJPWf1iJR#eZKmkw!Qw{sVJ}3F!C7R|4?h4KD{4Y zTmAPbU7$rV!htapDeli|B&*`6sPh0G%H_MF&f}CsWMN;!kPf<0YA>a!6uYKTpNl5e z=6`&YFL;DyYeNu8jei zLiHX3D#?)#vQ_m9&HJs`uR7fxAo(d9kx$C;I-XX^qCZ1VX#F7B@E3v@7ELkG`iayM zTPKe{LcBg;!Yn64>E(B*fHf`yWN88D}%%w z;t)r|k|XN^OmcKYSJ13*9i3&74NZ|~kvpEl9F$52++IYs*?G&-q0KcUIUjcDcnME< zAOjW2aUHF*$ojJa7!LbB0G4%I5tR-9Au#{b{uePVoOBvKMbxQ#8^55UA7(Pg2LQ%e zxk|vbk@4{F=)^A;&bDamDIkdRYR##E2$H|M0ob)xgez=ysw-)9sx!YI!#p*ETQ|CSBHCF|4)S+AC#iwor^a6|3w&1C}V+r)bYOR-Z zZ|UV0{@HsGHXV8h;(NjHF_&Iy0pGFt(1WBa)F@MKpe5-71{)+EeUR=vg-u#i3J&~? zIYRg{2O*y7JWamD>(!Mm+M@%LPa~U;*Fc_|cq)|jJCRm2gj{?k_$GS6#gw!kd@?Nz za2h^Dp7Rj7X19Y%*}xG`szi>ih;nF?&v^w?f4S}j#OcrV2coiJ6rwO?&{WKHQD#ge zBzunuuG0IkmNC7XxCH8Y%2h!5kR@Fxd$JOoS|~$Bt&6LrdhC$jbJJ^ijvXX z&6xj0bEyNWE1}cW5srQO21u!im+OuIQqV`c4#hYase8d&wl^T-E2=Bq`)emRFY7FF z%1Xc~*;vPuxUI*Nx&Tdbp?wzTJ@8kVMb_X7WYtudAty{gxq$_@B?oTet9A{fN=jT^ zz#S5Aep<%{n+*UlLtd-DLvLa1{rSr|OTkTBg{=Dpv!5lojUNEe7v0d*3Z#&g9xWBU z31G1DLTU(~Q-`&P_z$vhW)3*a(w0%d>d?{9(E0FJ{&^kNBzz_yWWz-KraK`A8OCS~ zeWk&D{#zZ^xotYq%|$k&ztwq9xfKXqPE9?7T4Y0e}KO;`O|3#V;|#Rq zct)kqmMQDH0NAPPgp3V2Zh;dh0f`AKGJp!LY_9o55KNx$g1yp)%avtoUW`rTM zKFr4dOfX>%DjF~ARv^!5u^T7j;y@9^3i#5G)PF$p?k-nXPyjifAW;0DoPIM!<+Q9f z0Z>(>L!d}Ayoz)PDN-X<07W{#lWd4USXH785E`Uv(WPipx$cq4qotk~dIBvh*Zt*5 zbC*#UWXLIpkT9?SPKaBiSTaB*_$q<>s$!W{C(OQC3>oN7?7f?vM=dmJ4q#oi$7aSX zoZCw^7nVTCt;s3R0iUfs`4}d^%Pkv5BVNmON>BGyZL)4U0KlRGn&@Z*?gz)s&cDsh zQymieBCmrzGLdjx3p^${Xk%5@byJHtszfXZG1(A+U;ktNH&PuKg!lWPfbKeeVMe5x zF$5Dpovdp|K#^yV?w{}nej%A5vhGh2k{tCxfzRlxI;f65qvWs(+H9EZ-vO*sw+_EB zu0;4f`t^=JAx9QD;RPhZKAMMz+5eQ;|8G}k!O}cX4Aq>FMfuK-BScyEW{dNp1=D+1 z0Rs{9$_Lo>UxRUMvMM5G=Uy|Wce6iD??cRo9$K9CnZ^vWv(#MbLUO73&|OQCo6d?4 zv5m17RHr*1Nsjl`artU*F)k%XJou98+y?^GseLvC01F4*1TVlJs@xtIag5BL5y!~f zheyrGv?LwOea9JDU8P13tG`>fZ-=ZBP7HH=IcFj?_E=sw36@-$QjWGF6+WDL5}1 zG7(pY>mbSzHqU4=T6-c+f36Hfi!tT5M1q*|PtnMH0tCwj9nyp)bk{Scl$+!`#A^z@ zK&>6Nm7^v4$JY|lMu_=63?*R+RRE6uFq+k~cotmqNk~cAEk}lII0z83>GKE-T|<~D zm%6;V61=NR1j@P>kx?T$Bxb$r=%z%a>kU=swg=htEMDqJdkK(#A? z6hRHk%XQs7w7HI=Ce-sM>Hz`2Bzp+3QZh^{*9#z|*!=GU81pge^!0%OR?GF|goeFB zc%_~-*WOMJ;n(%d+U#YZkqry+iw$x0{MrxxWY)x7=fgu-`;d{yvMnB1aM>A|fkJW! zYp&_KpMM_0qB=Ao8YWdbccX=|*p*|-PHdG4w$Mp9*>I~T0HAVuhVa`VtY@#caI`l) z=@0bGdgSDu#u$xt>fS`y^&y&3Y;r)=;S=t(4>%dAFmmxrTlEdD@tG29r)>#TYb2Iv zzmg>6AApJ)vMK}is@|R5F0y-z&EJCtKi5YH3k9T%{v`+)|DFinqxPu)=WaScwv^^~uZ++jjO;S-(n6W6By&TD)v{iPEGksljIFnC<~)=TpEo6KTD0%I+za z8w1_r>LF@#pklON_XL%2jsa{cVy2`Jo*&9A_UFL>S0Y%GbN~nFV10-BisnC!A7A#u z8Tl>1mEVzr)$f-GlX3bNp^#G5Ct<-7^eocE+H)}ofSB|o7$|f`BI3LgcrCYH{D=~) z_r*En-Kt{OQim@t7fZmiC^QI#Ftnp6oeED=HBz*!y3K8$kj5lj6`Q&g1qF6i5z=LrkB>Z;g(`8g7lR!;6>^fD@c3qaLh7WCukwvTk3G z5MEuMh1=iu&0Q^WadkAF^jEH1Makih z@(`Zsh(l=Fsv=kGsG`$W;GxL@t11&R0AIIazsPqsWG%Ga6GHfzhOBX23koZen^!kP zKexd_0o4S}Pw^vKY>nWL+W8Z_dN2M3uO2ZxFEP#*TCQu0Z0au885;S{MTdVeOTZt*WE@g{kgs-_*5qr@$kfAeY)CXgHP)g(uf7Nm9y;ZwT7=wj6lX{$DTg+kan zvputTfXUC~aTDV0Bf>vfRZ1iYg&wf9#gk0cJ84#d7!sK9$>{t42*;mDa4rAC>;DzG z7ND$h7Yc#&KzwoLe)TqRsM`G+c*}dErP^P+gz(V@mi*Lhf3XdMuC`6Y3qCJ*ArUQi zp1^9vTz$yXp!(q0Ly@C}qPr_5c`*|f!BNJDy>z;)X< zo@k=?8xtvnW)l}wj?{JwDu~~Y3U2)-Dm+GdYP2;;AB-}#7HGhI6*JD9<7ll3!vtyT4;*EL!-|~^DOIN>KpHHM z03aJGkwv!BHN?Q;rx1mDrL*JM-m(MZk4RBl5xHGtp0wFSJPF6uy4w1{&-XQfI6hV} ztoC4NVNLoaw}Fcs!>VGy_bDUjM3AgO^|{x8daeMyZ8KV(H{BboGGs~vCZFvjD75{K zlPAY9&T;rfEN;<{A;{k2$<{zHWPNjigWeC$z5sg$uk#_>yp2w%#8-Lb{w#e#hOq1I zAk+P}at3ypYbXW+&`nX%Nsb7_Y32pe<4AJ_S6AC9!C*s7>~g;fh2R;6uBEDS@YN4M z_8CBH{N{+S^o^^2bXtTSutAvggqLZtPL z9Q1}5VWysa0+;C%#0NKOz! zNU3;&tD&eb7}nV*NGGp!I4JK#FbK1Feyk}A8Pv!Vzl07^)O`idFKtwT?|+wJ%)Lj0 zyo$<^04eXM;^b%*z1*^T7act;AS5(wIcvsR;%(@mNT5Gg@b{1F+MdXQoYc7qewr}Z zL7vNXExqu+?Z8~%^M{=cbVaQ#F6$Zq)JG|RNN^=OS${7!#BX5~TIkXvgl%lA%=SSC z@cN0YVI6A3;fMy|H|vPVBc!YTlr5d*c467Cf+TI zwb#tP#K%RkHk!gRzBGz;(i9%%TcVg*W7xv)MzI5$*T3dvE!k7r^tK_qc`MdL+XjK2 ztyq`3Lv{kKe272SiYc0}H}Ns8S)Rtef&bB(#Y$O5A^D3YqpMSmA-t)PO_0prd*@cP z#r89Q#mKsMe(R*xFKJw`9j65bhbqevBahHhJY`*BYhtG11w7#Ga_Z){4&hggtWQvP zk)dygcw!sYLF`H3h`_&oXR@}z=XMDtJY z49)|9ILz*K2T=neFo!+`0An92K7hzygQz-Lt!dAC+8eB=m4-=rx7;;eAkHHuT9PKk zN(Emc!A0{>asKIl^7n~0KAQj>k;s5Ly$zjC`wz>%fNtN2gjB#%!a_=T7YWRhFq0CN z*Q!3?H%bNN532(`w76d4yV|ohbrZHh*!=eMEA3f_*7mm{Eam+Y!7vEl0F%<{2nkz1 z6Ol+g*5C;56$1ytjl(=UhE3E=e}|XEu$Gz&@9=Xmtf!{lJG?~))Bq44dYE>*&@x*xA+^eEK=JR3EN{?isr^zekYc-*3_@yksVn#t!!j`ctb?M^WU*?DEO8-fGekYb(7uWXt zDc$z+Z#%I#Q>Qm*#<0R!6Gi@8btOpeN**Gp^LsGLCRKXVYu5)w`ty{(dLobM%tmMy zY~@Qjv)9C_&=4 z`{&UN8~NVrc<1gHEK{6&l_70leH0nCeS?>{i>!FfM865abmui?#7BHx9E;JPS|c1M zFt?T2Kl4B0m@T5>Ya(fvYQcWnLG2TI#qzyq#%IT~4w`Qc^0(qykJK!*3+9|N935Hg z-b{zHkpkxvzQ0)Qyh?8;PK8LN%Y#kIz=NQ-NIx9N)63ILz>2QEp&TjY;aymZx(QV2 z#!}w93yaqjZRT^ku!%`0H$n>*>A%H8(U%H>ey?F3YD?NJ(kjrzS5?pz1bViF2X|#% zHQ#UI=B_|fPtCiy0eLAU|BYsv+Ezld3oxj0CxJF7;lFidEj0d{_`|NOZD=6C+<$rw zF1echxV39HR;9_lAP2$F02>BXihhr-o%vmBmj(IxOhUp;DyVQCm~T+>kd?H1VX()p za#38Ffge;q`3oGF*`*Zi;1hbVW+5gOv=`>g!=c#E>%n@2-bbx~y!E+&jNHKw0a7~$ z*;jjDcCSFXvgbPDEMnOyIbH?~ovY3hWlNQB z8!^A~ez9V#<1H=Jx=&!6KO4=_OPDYE;Vm9#qy|B}JU(At%&DtP6E*RJ^=OLiThVR# zO7bhB-QAD~4vi7XvEo<`KskXvA=1SA#}JVPJE))#NUFQ2jF%>{2)m8;abFBUm9X)L9bE7q%6OYvj_XYHM0Ay{6&dMa?n$)-(Dy)7#44vRH3YW;)qHu?mA6-nKDt^^ z3EO^ucr~gJntVQ`XweW#SdKS<(E-PCdCh!Jn_X#CQY7m#P__GWp9*2vDpQH9a$T%G zgm+Gc#tlVaa56-2+B#sKyp6w-%vxzT28Zwslu8%ZDa?~P1gTOlq<;1(Qa{?tpXdeH zYxP3-Y)Vb1RLfQsLorf+rc~D_NIk!W2c@uBZCj)!rND(EQ|i(!{OJ_dzV2v>jM&0o zPhn}jKSsoBCc6B#+{fE2seT3h!^Mkp8+|j+{pUVj58sa-#6b>)213h19@!ftz1@)U zzP(v%?LUDb{Ar{_Reg*q#-M<3YWN69I%Qb?!`Js_U7xH*#LGx6fYGZ^zSNt4zDz@I z{+CwmO9A-gpcpI|9e0%<8_*kXUWBwl#}Wq%r8G!T9BS{}hjob3P$fm1Yik$Y2#kOi zK0=0VGk>uUYuh3lb(G#|L5&v+8DCWI1$al~kRK0|1(EpFB?|y)cTi@_|CKea= zBrt;wMf&3ar?$8@e#3j4VPETjXq1`78bYWIXO;>jgrSDj-{$6wuQjuHe3`U{aMiy> zBNLyiryAHdKCKpxE00qJUkdlsHF~V;)Yqal?P^ngM2hd)LUqQGUY82VR#jeFOuAhv z+N~Z!*9F%J;lui}u20PS$fGFXe=Px|ucCZH4@KEuD9Xa-Bz#%G0Yyw8 zldeoyp~HHmFEePLM?mSzA|kgrzHS!d7jyc?GeR_Fk*~r)T!^kLR z7?%B5hbg=AYZ&eOl0CW&*HbCKZt!9CWBIsgOzl>{0R2jD{5^_$q#sLHogb>_;@;U4bA&F3~_4V!t3$30fOSPM!mq(E?0m2&kyjyUy!9We;P=e=NH0VY0PRru*l1Cuj{i3mH+7TT2_k;Z}W=ucX8>H z;`qPwr&0c799H{kW^UYtjsWR5K;d7;Gpy2mpvM}GK-&lrLQ@6vjVzcGZx^3I9U5zULQYOZv1VSof%Z7xzEg6qs#WShFU7e;`c4zlwcPDLd;hK7JHy)ZvplDnhfh{V^27mY0%Wi?6wuh9SqL%D_kb z{ZY)IS^5FrHj1^1?&~QSMPvy2l+KrvpNoDD@=hrFx?O06xf@_c5VWK@8Au47>%@Z^aKQQ2`VP$aCM^|)}|c! z9FV)W)+$3ea)Mf&ZKwM^8c~L!qSSF^f?6tffBeZH_fqfF!7J0D)|xKkx6)a3dLIT~ z&+WbbQUM%D6bgXP1EKss;X7$aNnIA{O}ES8iYXVM5Qc$kJm4H>TYKqIDNkNjM4d3=LtS)) z5z!>P-R;jG0Lp&LEm(=eoFv9x$S_wofz;%MZX*h=Ed;^Dc$bUT!orO+C_s6g+$5O7 z9a<#H{na;2Xvch59q`|R7otYYgDd7wXw712%b?)AyISdGI=^9+?U6Pw0kk9OLx2TQ zb@?F3O%S<01gNvM$q%PR;2X!05vp)FDpW4Q3Fe~XxhhkNm@ID-hqJ1s!f()kqO=Fn z)_I}unLi)e#(6CVFZKJElQCk=IML2&GW_g+dY+i zx6#>z@cVnjnPy=vsnA*!lD8#-)i?}U_yO-Sgmtu&kpAnM7u?!XkxqNnjR2@>)&+Nj zikBS2kd)z7{kxUn1tLA&xko)^m+m~4LEeK>rRg=~6dC?0!10_i79o7lWlXraE+P#s zY52YVg9JOtNF1~$?vUEjl7_d<7-yC7wimgrE$?Vm5^!>l?f^1baVEp6T>eMYD-KAA z(|$$s)j5D>-%2$TJ`Ni6AXc4LK6BL4Iu1FWsl^UrXJ5rUS!U^0T~n8`%!}lCLQ*ru zuzeDSlgq4 zRw>K(FlLwfo=^r{oz@KO1egjg!zgVB$}*f2Lo=Myfz%L=s6E3Ol;M0b0M3LcTZ@8| zc%uXU{5O&7K96SnyEdf$j#T$CVb>e}&d2mqqDC#1BkiQSs)p=pE-ln#~%y_JA~1%0@%VaCAl7ed3X{6C^&Z zuJVW+*1`T~6Jo_(B?Tf6r+z3IT=8l+-0EMZw4rd(%sSW#cPWW^p7xd5y27~>o>8QG ze=#|x@4^BCR`GTPGJpkBf#QM>5vx{6!F-a?-RP6H=q#8b7FeJqlx`Op>cocQTjVim zCoZIxhr$-eWFatFaT+{YanqD3j%s-jxUc&z=T-Y^Jnq!~c7+hbh9C_tF26JMHZWRA zH(_5O15F-q2NmUB0SoO4fRqm)DWX?*+jMz}ez{K}XZcMCVpaS}VXrC0xH8t=8XfZ~ zj(hoD9fhO%<@T+Lwc-3%os02W>9J@^HBs;lGxwJ^@ zH%4fka$J={O7c4w@wd8+_3*QGw>lrWsTLA3=P9K#Q4ZgtEmFKIM}4>hBBYXyZ4ShP z2?Tw4o@@PFJt0Z_{RGy~u3W%LE20@MiJ3ydK_6E)_Fu2~GLaT~%2pK~7u&>RWwU^1^1@V^+;!l#d74TKZO02+rZsT6~MK2kCA0Fg2cCtK{$Y~H7EP! z{+Zt|0DPb`K*GLN#R4!%YV}x3sAFtDYPv{v3FK`Y&D-p9g^NB!Z2PpHQrdU}EBL;G? z$1dD4`d4V#;-wYozf$@QAC{A1hMO5N~8Of@PUElFmGgxQ; z4*ba(tb>0GzGw!s`fuUoGuV^<`Ml{&>{)CI;>k1FQ@A)#cl|eFBrf`dWel@8&>blP z5Ii|g%kadz@eul+q zuD;4!%wiFmz>_>>7HbxH>4fMmn+*&p?+4KZC+O1zAmGpmo;!*xNY7{fYB zRS>$xD5PW{8S!wX9|bTnl0`z~WEErX&)`w`Wg0_Z8ZJ3rHkCSHl^~s5)y0DAbx=rL z6AS#JAAkvmZrV`|7gr)LhDXoF^5fa3dB$wkO|xt=Uox8w(OjI$f1S;G`1|wVIc$>u zKt5*R;Jv`^r;JrI5&>xvkOOo1+-F&s{T6a9a#|FQ`z*p|1?frZwO#r&m$PnX_-(YcgxepqlcjZQ`#UAt$kWy z#1C=yM7Y#y7QxDaMxw)FVS1v&1}^49pTm*V^_XEWif86yUnMOQ?>EGk;JSs8nbL}G zH1{N@d~;Zj7PX@Y>DgvLffqShSm3J z_ZL=~Lb~w7yt$1viWGJmF-#{kKBTihtS!ZyM@9L{WY)Mz0Dbv^rUM$Pl-UrOWQXyU zo%CT5C<}-vFN8wY%sKmiL&SL@wh_dp{{dn0LKG52zApq`->}7kj-<*(p_up~pjC8# ziMPNs6hH^{MG>KW1+Co(OJ|XUlYTz#H;*S6_@X@cAm3He7FN^Dt}4D8i@f+^sqyE@ zkorTU{ZE7=Wpf-5cH>j$K_Q~RaTLHA19B<7h+;k@U=M_XAgdD;3fJIO&^90v1r_IAqO zjC_?u<=-UY%xV=WsS;bGq=4Ky?y#f)Iz?#`vU{_b<{X-Dy#67tZ#WR$hiy|;oJLX& zPYMd$?i~HUD&W_ihxcLoA-$jNx^knj7(<&7!%>o&F(i(H)^|_vt`)FHI^f?UXh49{ z-AN+|Q&2}W5Um*1K%&x24Oo>16!2`Qx^#%Bwx(?Frw*H~nAd37bOizK^)*9QJ$NZc zMi5L(!pnF^Pfkm}KkB z@|xFbv!EBar-8#zPF&BT8l!gAlA9xK*_BM+f59~f(w2J*Q>^|_ZFj6%b9jy=$7L%e>Ntun4#lxiGFrvCF(ARI0Bt|CBpH|G_JLw^jmD3VDf+$}vRrh{jz`Em9C6|h z&OvF*?qqY+!esD7Wk<9n(a#o(S8y8rOx&ol#ajwJ%+S;@W7L>hW(=)mh6le7N9xb+ z`Z!DaN4vjLIbwLxmm{f;65A>FCNdWI$`@H=!_HYg4Rse##+sLKY$oX-Pk0G#p=Yys z_Dd`}>h(-tIJG~Nh7b@8?6peF3;d&(u>Nya+QwiD!avtajMbtk(w1M6N0=5SN?Wjz zgtHJMtd>NLt-Y*!_9s1T4O?$Zp#~0wxNpHZxUk4cu?=kX3W3SD-B{-lS_ZW4PgMio zhYJ&)xj(E%FgjYbi>#>7{k~jBxPS_AeVV1vVoVX;`^iY(*1V(EYo71Jshy%3+ueEm z>w4OzcH9OX`SFjQ(Ypuc5mvFZoW!L*FJZt(E=Ha*vjI+R49mu8c1Iz^6)RU5Ps=|+ zF#fhX8W%N{Y$sXEacV?sl^qZ=I`Oy%<`sak97`%&_@YVLas|ZAa%QxQkGb`;S0rQpp`i z}2xfZ(&|VHJGz z+~dVx{TY5c5?k_4MrSzdWjKcgxJ$`s@G+hE_{A(%Q~CVX<%?N_HoS^hvzJyyp^$EC z{-2M?1sMDz-{oMZ`Z$MFbWx;(ga4#~#t`(kA zO90_|M&wd~VFLXa#NDgBan~RZZ11@|s*t5?x`LKMHczvA4nJ4Oj3FP-p<1#^@vnb> z4mUVi=jMe-vlJ~^>b{GC5`A|2&~0@9ler5>^|m>DqLZ~7K1?ll0O|U{KH&jsShOHb z4dW)!OkF>paG%=nK54lVTm|Mx*KGc~ll5qyH=8ILtDA!-dN&-!LnBuqg4+yn!!8It zL9KJn<|(hRt_^w#@a*GA$91Av9lOouOI~4ZLzqZc)BI-hEw5m6Wz#G$Y>41U%rQc; z3kfKMDzYMfn6>rJD=f%gbFU?5%h)rT1JCg1ma(Clyk~gXGQ2dfW+vZQgm(~rnaNKU zv1yThGckfn7FU4&sEojUAnqU4XIiBDX$GILoY}`QfZV_>yhPm|bf&0u=L}IP*qL<- zg>DdgHmPX{XCXaP_jwIWrtVXp@P|I(cW3ZEE7;Sm28y&yeE&{b%hp8eW>l*REu(x=a;$#K~;kq?&N1Zd^?`TQ|BUoT(c* zjbB~Knriw@FMsG%9=VEjj=PhCHhc@#`eBNpF%sEns;K=Rgbgtw z9NMvg`fQ__$``C+&6{dOJnIOkfRJRt)fxR8p1K=3eDf;SrSVu`g=|q@srQ8fna-TU zAFg7PqJoi$QC8~ea0i>0sGIqTZ^^m-16Qo_s434|&4z~34ReyXS`20N`ltDs)oi4O zJ$)VD!=|3v-IC7Dh$=r)AcqauU3mGpW_vA!tuEZW01u&3qvPU z|E>tfVpxXiXXNmg*5Fh_$z=Y{8l3!|l*13KVZB4#Q-rcO4H(0PDZDXfsUh2th6baH zvLZK6;nO*b3w{D=wjqScI)#72*`Odl0TrtEo3iy0XY(~P9!(U*Af8#jpnAh?HI8t$ z;YLk3({QCGoNc&R6V5dJRTIuCm7;CNP!&;Vo5O0xIUuS81-hb%{LGsyqVMx+dQFA1 zYY=1`X4Hf;4O45v*@j6q;Y`E0iM-ERxIXJoH#*G z#`AaHW>f0FP#?A=Zhqc}0iLy2X&SmU>>c*HR#U0xU%iiOs5Zdf0~*8C(bP?yc1cS# zI4^+|{o&Ev^*-y`bRTkXZ;6r#NL(CKNM1!MQ8=1+|A2K!m67jMsCIoJg7H;?yaEJ? zJbF_7rx59wrzW=XJR?0%L*D4EpM1a^{u<3F9{Ulyr3udBtv-fQ+n&jDKV~;Hdq?tV zpRk*n()+l z*?Xuq(5#DBW9f<~eWRNGJ8)t|l6K2V_*Kn2gfO_D zN&5I8p8N6q^@be@(uyTeo+`&KBSftWMT+c0<3?L}b z>^;_&m10gqmH^0xcFMX45TTh$hKrWdjP(=#$%vrYWtUxai|CS^VhoQMrSx8N6grWA zRwG=Qo^H!J(H@+PDM1-DVl35&nKB#NBJ(_+=!LAk0*i7KyE;H1%!&b`*0H7TH-sq) z(sWiNp+C`=Blo$29@QfYKYEu7tBh)X|_%Qy>XDmjO zIExuMN&8qB}!zh6%q|SSfE`5>v7MsV8~T=d4-K(e;C%t1RZ}kP69Ms4YZ#0w_f593B-5#Rm-yXs@et|=LQ-<*LFIg9jc?e(l zC3{{|GML}~5;NZ0gL#v$*l^9r!F={tEKQShj&J)4$EdI2TLM(CGDviLDK7ghCbDTK zXwTnR4iV+t{5fkFv<^`M-8hIh-vAO?ix;P!lzgW*A{L^^FdKTG#9n5pghh#Se+|p)pj)cT>2#W)8)x9j|K`5QD}W_v%iCJIw_Z1E;MQv!*oZos z5u97MupfffU^|jB2KDEmTiNz5!&bl@8jUYjlq>s|V>zX+=}aIXz6#&9QZ~IN;Po?7 z#a;2b=TiCot?ZqYd;ojO-J$)7$IG2tt=99oh04{(^_AjnJXEbOwD2R_*s6?8DCa>D z?L~nq&D+%4m4*TZ6(xcX_Y;V0MqE(}?n)!C3AEiP@3VgVKigTp#+Jr=e#@o>yZYAi z`xZmr&vmss-|#K#nV{W?yCw=su;p%bVrTd~@-TM30UYh69bPPQrGf_{UH?1MmC9t^ z{5$L#??)v5B)-J;bbq9NnCv+wu-DcqUGDW8d=FN6WPsvcM~5}lLl)xXaQ=OkdkR~q z4Q}E7-65ftmKV)Q_*xQe(jhhb->C;N=^(ZHzf`Nf`))tRhZogd)0&I&FJ zKv{?uw)#;Bj#FoT9Ke*TFM=sa$x;En;0WUK*YRsVux53pp~MC!->`$VZM8KDInEPG zi$?GW$@!H8SY-GV__o8Df)AzkEAPF-MJL`s4KtsJxgk_s1HRJc{@%jpw^HFfzsbf=q#)MlJP z`R@O2b62Hko~O;O-nDJMTifO$@Wh(bRVtWIRe9RnLNoAXUVkTRoB9-8*iOeZPAT6u z^lfrqkfb)biy87ETq?BN=sl4Is>59w-}6;ZRdLTq6O>xR3bNop@t^=~W?EEiWcrlpO5^y}ByjG|#7( zzw%8h6@96@7bYZ1ExTNFo4zaswVFYUOI%7>q(4Ckag?wV^MO^C1^=-LFjyJ2I3U_j zT>+B?8M!>5GxJa*6+j~8Ze_4Vz1y)l2o;ZG@ge_~Ab6KN~#@)7wIBl;uu%Yrl zq?E7R!3+(ZTIvXD9~{p(I&JvO!T(drMh*MP9^mKRj;eb00&aU}u<>iedQ)sJ#SRGP zQLQzPva^ygqpgNyi;Z`6BMzS@5**My%;yt#v6XcP0Z93%6Ti2MwQ6e4hhQc7=i)P% zi@j8IMm5p-y!&pJW*i3r^=wPlxO0m1U-bkE*2&{n;wvjy!#ncWLXJQDm60gx}oFOm$ljmdPD?&pmKDxfgGJZVxm0*L^pU zaChL}?q$0)r|o=E8Sb2Tw+AK0@Ndglcg;*Yzfs1n*PY!RiJRN=i{rJV^Ya>!E)KOzmodkBiXLOh345`49pvYC!c zA(X9XAcuJSrHFrj0DByN%%L*Zm3Ejf#T_m<5<=Gshd{6_v}x&sO;nU2PcvEMxkKa^ ztf>Vh^0W-N;7|#^BUgGcBL5y16m+P;y!cMmQ(0Xk$1yeXRMvv8@Qma>O<$xp1a{UHsmB3=LaqEn=T%ZLx8$!s;sVAoG_+$RXEjvQe~ zk)OmRA{3!R`f~qZf{Y;mc>wM_nG`3QLhd=-?ySE1p(H=8wqyh*<@}d|{pDey@_;a~ zd_2JTh=VwxHX4}CkoW*XcS@8lF_$V4>QdwK1mQ0~zFBN8|JN(59zX;p3fv zYtn`r`DNPtzaB^%4&uTXB~ZmJ&a{2y&(|JgF?RoFh)vf8n{X598O0B{>99wD!2K9j z?@l=8icaWjM@x?~c?=ACu5M>2lOp|J1U3d>k3q;oLusTG*>MM`kKn7rXt*(x29OJP zLC}r|8fSLytL+N%B`?0KN6yIeGjp2EtYi)5I82QIKBkvHnN^wA0i~R;O`!S zUvZL+e|HF)vCmXKyNWqNTE(h->_B{M&i#L3QwDqygUI#B8s1;ZQ#&3Xo+vUn07>nn z0zUx;irkwGjZtFC9<{P0}e&iR{t5qrjIS0~F+eM6Jefkf{CumMCENQNbV+6?U~3$UnhDi6rFTi98iKx+J|h zf9f!soh4?_ptRM{m!JR`&CMdU~Relx+^7K;)VbUpEPe>?POs=uba3qgW zDNjNXaS;c~+o4KxGah+_b?YV2V`JKR9alG!oZLkLIW1Hk8CJg3f|}^Be5ti2RAT}! zE#^f>SbP7E`PL(N3H|-(di<{=EP0T;)IkI~*DS!pxwMcX@=_{hbuL|vhrE-eOjtj`#nW(0uMxoRerSw+y!d{K>@PbhKhlq!(( z38$+Br9C!A?YSDv{=rbqZDy(Sr36MiYy%T!SQCE#DDFl%{0#4T43{Dh9`U`t5~bNJ zEgS-|CHOR9e|A&K5=Ot8=gcSGD0iQ!g}{fkvIG@g2;!NN<^zF`ZT%ZZ20^s(KsfV< zAj%IPV+|(;f-+@Xc+J45xo}XmoXQv1^vq&!&v5KB*-5{6o!8?cHJ zI*1ysNd;>}(#mxJ5K|i6ehoxHGx@FKEVb3T)<&*cA-MxsY~U@G~#DYU_m;6I?p-D+D7EjwLG-0=nbl| zZrw!vg(Fl574vm~z-vNcbu|TJEMz*rc9LcIPvI%Qv1I$SmO!{O%)?dJD2Rzr%Kyt^ z77Ea3mY|{z6m`=H*dl#%irWx(JtV4YE&2rIoyp*7TTtg~lGX=&8^uBe!bv)d^jD&Q zp(`cqAPhzNtCY|xj7R*=qV=`~DRjH2y1wQ^f5(YY`H29f>&O7uSYrIZl(L<*CM~6I z$~`U*3+u3kgaYpo(3dowh>Jn%r1)4d{BBCI`1D##3GyhZ7|=+<193C5+D|8cHHtB&NL#eFaA#})vT4sf{WSyyu8;+d}mAn9c~ z!a(}A3P{)CRmB9v%a_Ihfc^x3sLn~qw#ds#Aqev*go>$+k_zZs+%*le|Nm;4+%E!0 zprqvuQ317Gc#?b>0_$t=E@!_8I#NM^Bzyk?^suRNj0ZBxHB+dUcT}-IX$zvaf3GVq z-NyMHd5zi<+~+8+k&*j{(gon~Ji!z@0n}uU;yy0$(whGRVL%s?!OKVd!J=`n5NG4u zBo4GRzOLwi({&PYm2(8{`VmoltOUP;Ot1)nn%=Agl~%MT%Jq?eVv_QKI{AwlrK zMYzsVYf#tryVaelT{u1_y6wSmbQ^968wV_|Hlo4HNiYQc%B%?x@uvKzKUkN5NR%Mk zhKHPHjhnwdg|tt+RPYsO#ksCPh^bVt7!lzE=yw`xt-e$Eg44Jf;C2KAJ|mQWbDFhk zR0uQ0XVv!u<%Navi>H}&Fwy*PuM4J9yda{EUJRXa1pSeOvDBOBuN{p+%E56UwH2kp z&qH7fCBFC!YuvrfWS@zk8BGKzPmUB&JsPgCl`5xVgsKIH>D!9VVt()pn`Hlv+Eb(} zm?Thm{5s&M&|K&i4HW%iDqp^sCMhD{qx?!I)lL}yHKj}jpz^K{#D7gGPZPxD))Q-y z{MVc^lRyqkR6|20kl1T2a#H;@r%WN6}Uds{}1kkN->KGX)XI^onxcyG!LJdpdx4n3b!`_g%S`vw)&R^ z_o#NynHSG--*zbfzFI!Fnb7@CwX^E4q|xdrV4^u>ETP^U?9+I>*-`gAtKao04*_Hd zbOe+uA5fnD2U9~u|6y9uVEty(Q$jHxaGteIdN5v4p4&FQq;Ta%)MqJN{Iz&EY5&kt zxN_5DM0^!aJrK;-pJ(l|-a_$=r24u2Nzm%y%$5g71F9zoQNm>|3>^qgQG8(K%FSLv0QFmAKy|6d7yQYhS{)jvwn35? z6O2>iK?t}v3GP}D|KU$;P^=usPyGo8NN-A99mJddg)1N1jN?!I#Uk71qTi)Xf=@3> zxq1YN`;z=6q-i@HBeG!e6RUK3$cz7C&4a0naQq6Kl#BVdf3buPk&W=;Ma>&a;Ju*2 z=k+C!)4LJX9LSqqVC|w_df@SPm8nN$2Vtz?Z7*z|0WFL#KH&muWKcDBeG{u5HXoYJ zxm(FMX!)`WXiwjI{EG{CacAWie(D12-0)|x?y)BDD7@#O$-B>cE39P$B3fFt3-h70 zszi{!b*{ql{k7o@wfr9!GieI$@}!GUU_$cnYRak-ys&^GftA*xRm=F?i>#ghYW~JW zW-FQ4fR-Nils@y}(DhS?vExf6dLJVm+t(Y1-rpad1V}a zh1WxTDG5B#ectfDdV$z3ldO9LDFYv^gfvAf<8JeDmsyYcDg$Cl%u_9six2a(zLdTrVfDX= z1}!hVoHeLI1JuRPp{r{2nE^tv*YyUU{vlSE^G*HYN8XBb*m==U4 zBLfbKNtudiMrvkhNj4~@InoU3K3kOXvb$&J)SI0;WyidrS>O#V%S&0BUCb=^NSc>4 z#dQAP?^=5g(6RS--p`-UhuLebXI-9kd)Bj_^{i*v`-oP_9S>9qdh3*ZO8D!i^tPw% zT_QPr^U9Yk(X&q5``8xfkDtEsfL(?q@bnc1EOvvpoVmh)MR@TUSjP*sspI-A4ic07 z6a$vK&)_oIU>vi9qu5}9x5&XjkrGs3b`-kli$Chj?cvjZ9=y5D0e>Ixz;uA*=-kXw z%wp})Vt8(rCF_a5!SMROFW2e)ezT`UgxwLN7yV|Rlw^;-axeVCahQqzG&Y^k|M<<` z$7=sg?rQKSHoR2N_RKzOFZqx5-+9)4f5gEi5qj@)_U>l;Z8Q{B-QEU$ z`10@ej$V@*W+hoId;phaGZeJ&$-sCpc5Goz-K5M0?G+(HTn+k(orXy629dHj?D5c7 z!&q235tLsa%iA(5R)pQvFd8->h*nS^t)-+$45tJ&vY%7|}WwBPS~`>5z;oI#~I{9gi1ROeI70Yni4*0~OPO3Zl~ zQKR}t8kz+ZN30JR*Rd}z(C_-go){%Nchs^4`jdayufE#!evOy~XktVY7>>fYc<&E; zyooU8p1$i3SRC$%XNv>0q=F_seYOrSx&_kV12%Kb#x>^;Ykc)3dq!lNaMbM1Gj;ks zm+ZYFz8e^$KXb{R9)9X4{nJbKHf>~a*N4ku>3ym3Tt6SOBu>Yi@q zJ}_vX-1hEEX6|^KmEyygg_n@?k&~EMLHn3?#X%@gLn#3U$DTM@hYFjXf1R#dIzYKK z;*=|9saI*;`70OKs;eAjR5ixkhGgD0#Ph!~=a}7vU+b2xQMz~Au&XJK6R2dJ>?wAq z-(sE`mdA|z0~fNX^=Yj5wN7tpQ?3ht`!l_lO>riFcM%!%{?#O5=E{n8n1g~y;&u@p zhg2`vl(q?GOJY`12+R4z$}XzVciNOftDWHO6Rvdknr6LAe_4sF9M`>{G)H_tNUFfs z<+#qDv>c9!j$fUOvKd7fIWy`L0|u>m=Ze41^d1210{@)*a#N00EIY z{JJ&2@M@7-rX3tn4NRn@K#A(Kqb00Pxv-^U=M>%KNWKJg9B~I6aX9}-u5z^A>}dTx zRIwb_;W>Mh0ZrfwvI|=Z;&^?PekekT^9FTRJMb|k9o1*5pz_Loy5XeL@d7v-*KR-d zloJ5WWxqirP;H#OhzJF>rpvUJ(HlSc45V7E>=RA{a$gwKg zxW{&e=L`2(kTAA+k1Avg=b_pSmPL9!Qcu;U_=VA5oOI;(J7fsWpLX z-YKaFKw_ zU5;ASu9F8lQV2BSQz&qiGS5G~E#}tVP7-;D*C+UH=(cS2Q`{_vkPo}rSNaLm9c9^e zT&1HVp(6m$h{aR8IJf(QXQWsY_`c}Eo1hTFZ+G6ZS)2$QT$(QlABtP38MCNbM6L4R zRo<Iez%FoH11V5bh-_Fz zbp|ZU&xm$G;lD?u($UK>ZSf)GNHTFPeCekl3*><$v_t2%X27Z=06Y9eA`p^7n+P;S z;AjyD-JxILO<%=dhd)OI+NE8c^i?NCV5$gIq+BI^74OW0K(!a45JPgKnZD}02yH3? zA%o8tD_V5bOZ=D9C@6(>K=+(bZg zPk#EUXc6#F5fJU^pS~*Ah7NN0pA#W?K_q=uoQNVUY@Ki6>5#rEK?Lxe)OX(DiB4bD zUIa`;fb2>>&&#HxL8J69Csx3^6M9=T9#2Cwjg6On3J(N`U^HK65zOXGKjn4!qeVDc zu$c%K?TF}Stu{P^h?>SWWG*mofXvZ~--uwgB7a}dvx18*OgwD2ePjsyVA?@Kz6Bc%L7>z zZXrc>I^NwXrj)NL!guHob)XvoFmP}51}h?q%`7gU4E#(T_aqe{9`4cJ(8;#*-p$&3 zhfp@(9s2@g9mMH}GazwGkAOj`s@+2_=7v)U@XG*H1Usbz!C?td##n)iw6*W3r>X-9 zz8@UEfZcZ?d`1`gai{<#{e=?g^oE?{PIY4_GAY3jRRpOJ`zKXJ(-l<+bW zPH*lDC`dFt0&gI5td?MX@QJ&6So3`L+72XgQ1{GE-{kPSkg?lWZO==`^2-ZPTB)d5 zmFHWh8qz%|{stZ|j=vL}zC#YD&#{U(hFV zveFV@cg&-_+No}q45zcY7Pwl_`HEU{DzKZpccV-=Rb$d zg;OcZvWjd-8xD`KwWfgY%M!?5sK@)&6+60ww%)1tSjQ;9-8vXUv zVRm337SRy&D1)}hpi7s$C`Vpuc@yA?6%upvZ3`Dh@TNd4aDn=uXAr|=f7sXf!EQJq4PwX9x63Eu6>X{apeaRNoTh38hd);8MXy8iy z98ZNH11tld-)t^I>GX3Eioh(x#mh*VUcoV9A_u}O0JUX;l)Q5Y!Hmb1&36nJIZx)5 zk6C7~ZHp%wUFo}|-5|HG3IhW#@BR(3T-qEa%JxE>c`#c%G>i4^g01-LY;}{f`WU+R zFowo442`<*869OHIu(KCcV2+9(DW66Lem5;Tw8_)Q37DTV@-W^_8ET@0dWW@A9Pua z_!9KB@0fzvj(HElO{B`Ez~RLc#9%C4u+fDWE|fQ?ECbBLim7cA`;4T8bZy-!B0I4OUoe{pL+Z!XeE+5yJ&rEqSo>f+BFW)3#A` zi&2?Shd4MHN+Sn(D^FF@nagQI|5pp8O~3S2hzD>61E&O3|V$ za1-JvdkLsfKLd(_eQ-;)eZ?||688WR&Qmw#r8n~&!kF3h3&u!GgmB@hlU*-KKGD>;OqK|PG?IEZbxV4wb3DMqA2Wa z0w5P{K#PBLYvSyTXD8rI;~zWLOqfjSmZT@NRBpt9wY#O#XZ&wK8+u=ir5Jbi=GX%h zntqH-D8|*-!KH$ML`QT*m^eXot7Sx?w$daPY{7u>bG5~UO1m4#FeR_N!_Zza`k|Ie z&&YU`Z`}QDogUvx$%(t;d+gJMlBA5MRHeq~Q(Gb4+yLTz0+W}owNh@5*!x}G+HYGa zC)$PE4(OlWp!Ddl3YXKvVmbJ-VvXs-mn3`%#-vqiTi>V*wDs+@o0h}J?V9L#WL8pd zT>9wQQ-;*Q-8EIXr{E^g)P9O^CwGwWP*MwkA7)b&n790XHcJ`n-qNNzsf6#tP|3G+vR80wZT1 zW}r5>(C9}8TD1%i5YVw3_59w-#}NY(BJ>V@l!qhswu#Wo`zY^5B*M}EW~DZwSL+D< z!*r#!o^^{dDdIhF7Vq4mEQsg=N53>>W5l?)2>nu;@?pfQI3z&C_nU0RZsgqiddaQI zz^-IaaVjc^@4jqxYqq+xI0<8?HzFAo@7D$K=;L`k_0?u^UhEQ_)h9q8VH4K>0ho2D zLQ0P0b?K3;%CqpK22C|d&M#k$&6WNLnCTSo{_b*r(j1gYdQwDkQ$lj%adA*VqRyKU zv*=1R${rOI#owYS$oZ_Kq82S23nSo$B0!=`eME1cp|o$|A;BNS5)Xm}&_Bvh;ydhe zejdzL*M;F$2!vW9#x;m>ZWFkx{`#p5rAybNCfwEh1A$F_^b%&c1&F2|)YqYe307{H z5Xen{*8(hZqhxFYhI|<9eqyq}}Y zOG-m20+ec%GDv^8uhPwX)ak3X_82IO?4MfE zC6`41EU9*uUJ{+NWK-nF#m(rWI^U8_{=M$=7sQ4|Q`GN|4NE}i-ic1f)aW*-C?+8$;Vi{^8d4tJ>OX_7Y7_)U3^6@VxXTCGfoo*8=5Qi|lKF0ERM46T4PI=`kkT=)8-C525G-p_Mj2h6 zmXkT8+#N9lH##BOVnHsg)!4}Aeh-2f)J7zts(8mx(VIJ!Bro@EfTCi1|<3jRR{|_0vDbHKTp#e z_kYv+)=|vc#4IpbFnv18-W%WU>j0CC_L~jrmlW+fYQEURg(i3CI7HuBgpZOZ`VucM5|v0^isdN6PiZWH1tn-5Rwj#}ftr{XIg1T*GOngeWM*d2^G=4z1( z+U20}X_&mT@J+$Dgw!8jj|$OmqH$~+MmU$HoB~JL7?k=Ec&uPx`0s*;`|peIRbRX; zSv~9mIvntBZGjl*C^*wZgb0;*O^iGOBRMePOf=s3%)+VAQT73L^Fl#i5Ps*JOW`1= zf$r#T(Z^E8B>LG=b~WOXDtjIS<&_k9Q-~s0Mec4uk*oYwUcQyBXy22k%)x@FBpwmY z6hYX_KEvJ|<94g>e1xYbcb#Q;P75ri@;ELlnkh~kl_>(RGP1y}s`h^n=k-IOI8Xd! z#(5HPNW+8ZBGPc~%fkXis0n>=3kuH`OWlhQLEP~jlPMun2npOPqZjfOVI~t(tOo-B z`+AFN7k?V`TD7=!pTtnsn^UoIy|*C*b^6C%5sfWXa!{rSyv4{3>izDnP#phPW}JD5 z)4+<1#htqQ;yvChx0V}ge7)M_*Y-$9qOn~%3XG|nF&4_X%6- zfzcpzcxS?vR}TBzTE#lV!SPc+d*aQlA!&wh#y$PQW8>p1VJald6V=b2(7N?|t&8u` zvZC`qqSBm#X!FER8wS;zQ@s3?iKv{CDg2U-xgbPv1|dc(!2*zlm3>%Zpu1>Oxlnt& zO$7-nZd%z3NoxNAg8z!SrK^l*$kUp%)HP`rKUHRx}t7P$Ac7kfQb|+RcqJ zVLS8^XxBQF9IX99u7zuN4^rBMdtZmpvnFQ(a^vYrAsb!7ox?-Nlg|>URT5LYKb);@ z8KQpb)?N|8!YU*IFdW8>3TAjPzYtx$)iJ-V2p<|tfZJTo{7DN$ZV)bwWzS2PUU1g#MB>MHcbF(a44 zss=H=c*UsRxHwzVN-$F#r`k))SQ z@*rq`pOw$0-aW9@1R{AFAJA7?qGIS3h&A z`^4m1Uxh9){#b)VWM4Kr{LQfwTfY(|2)OZs1%lAdz!ncmHIY0@-SKTC1_g|fiZI1{ zJ;X?2OrY?*^4F4RX@*x_5*U@7)dvtPhR@G4&IZ4`|>!{B5)(1}LyCso0LX!&q1m(IK3 zd<{-VS$ixkh`${kGbx*we+XrR@elVPxfb9(9IPvECmlji+p4ahnO z@{x9$QZ7iU(vOc+lCItlWC4jy-OHvbkaPy|=O59#7l2&;3OEP~ zlpcr?L`)}8Cn`NGhnETQoQ7M?PGpc6MQS#tt6v^utJx`Zv*i#6Q(rb5+?jNB0OogruQRps*Vso9bgPBarvFRB@_3y{S)QqR4apq;Q1dwX1cy zGD=DIPQ~pABrIVdj3YYcEo9!MTSy;5l(Y1xEf#EBkiQQ9UM%;>eGVd;y$DyBx!m_c zMvi$07{Dcey;$;N#FGE-){e4603a=w9d!xX1N;#BlBfkk zXtkcKK_FS=E18+py@9syqF|G`0qsnFowPGxB=TDxqrQzj==;wK8TcY(yPn)c;73sa z;XeV6MST-qzX^;(UL?QXpI#G!&<~#%$wrCDbC3=hAHd3$XV^i&FhTN=L6OYhDP#cA zdr!o*B7Kjw#*B2gjC7BT6p2W(vACF_z|~xp%44z^>$Gu8QyJ~B{_tpJn!O1`rTUMf zmAmXMa6w4VfZ@j|m)4rb8~wlOzl>3C@D2px!^sD2nd8>(F2v10Oe7qBY|8_CQFbs7 z7vZ3$fKG5}qkBLhXli73*}*doug0z{F2<$;+$N-01xTee;bh6fx?YY&9#Qb`%O+7z7iYziXXli$*>8W=rS9!@m6T3WhkJZ%9;OF3>yR*Z@iR{FR zMpMM(p5FlX{13@CzldS=s;txiSWd#*n48xDJxDb;P|IWP0Spf;S_)MCIWqZ&lOnI2 zQ`SS87*^_+;(FHq04HD|9${ z)-PwWq2#qpw&_PSHyWkv4K&KNpcx1kgUZu>PFjkm4R~80KwNhog!(X~wQcwMHie4? zhGrPTaa|DOH!iPybb>l8SsM|Xr$xEdv4xoq?~)opW94Q|9cFidtx{)3X@W7juciGZHSqJG^0 z`oGkV2&1XRGUD4@1l0%>DY2}=okL)07S0p$PB!l*G)7I9!B*N+2Ru)zGk;Tu{i0@_ zH`l%lf#F%e{{lnmLtY6(_mz7#( zi|h;2r1Tt=jPueRfgn~{YptXIQ<0aPr%o~91K)@!E-{Yp5JejUP%^X)9O@~+YUf)S z2n}E{76Pfy-~_Z00BcLjT6qNnKrLEYM5K%%`~y(LZUkfq|J>Tz<>*6LV!=ZRyG6is z&=Dx~ZidoN80V+MAH^B2jV)|IzghqR2g=5%nuVFvCgCV8|71+#s1-n_h$`Aw*ItMo|D3S~AHr4Nqjl zRLnsh6a+cuXS3ScE6eqJ$0=RC7mRZhQfi}7`GdtjbB5%VizdY3I1>^pa!8$yG1^*^ zM5JCJJ_}`UJQ8bmfNY$(p*E(Ff=V68zECU%`{2Of}Y^(31@D~G>IR1*uY z8VFXL7x+5nk3tGdW;Hm0%!bHbpvI2IK$)+IB5o(&uGK@65sKyS9%__bMFBO~6lroK z5rq6v+)4(0^VW+4gwQ~~YZMQLEwCHoKeei~ZW82sp06-I-+UE>z8Qtm4H6;zErf$9 zJc%-D7rV7=P(iAL{7E?W5s;lRT~Lb#!m*Y@I(FsN90}MK5S@Xql9amSiI6~y54?(r z0SuZ;48{S2KsW{fP6b;puof^$ zD9GL*VU$c*_ahQg)QO;u%h4*88aNqMU}PC`cT-OB@p$F&!JQC8NDz6OAP-5o*<1p- z7{qiHrfvyV+vmj4Qa^*t8rD>EwP6!@>#ev&XbnPb^@S6li?ttkTK%3{Rg*PAw3M|} zSy%GW?L&DUf(>snxl>#tzkpXhKlxhd-X!xGVKple>}L-(E6Gz(`jgoBT;eZZGrkM& zejeH#hMN?{k8E(iM9-@$x0@g=JPFV zf~PR?FhEOcvI+?i2Whx549Fx28H-6DD@HnV2sA?kELm&B&GRs?8fh}WI*};;l>al4kbkBLNF{XinZ!9tLXV#RN z6zaH7j0@Njvh7|KEwf6tjIVL;_^jUXy+?gwHqka38CW}ZvXX6!TA`!J)5gEQ*596@ z^!A44C4}SZS4K~YFSS*Y`u{)4K6Lr=P=s5%SCaiF;c;nK@!^`AO~UW#8KV1TVh}c> z`>K~G7Kux7VlnoAr~X2|KW!Nz;@QG0EdjXj0y0t(+klMBL4oAlhaj0199VFGHMEHL z&3~fauOP)=9Busf#2dnI^E87*8jN!zCh7`@8UI0-1zCpRfHyplUeacBs)MN#jqy>t z#W?MtqytqvxCGRB`W$P=_KTSK`d5!A-P^G*jd;j#IdJZwj98nE?n2*X=^dsj+2Mnh z>Jz3a=OXw1OiLX@ll51oD_w3*mbdLp?jRW)k~R>84qJRvHMGvyw_j$uQFQygJs>{N zHxwz|Z4c;2i=e=lthaeo>48saiPE|m663giXtFC^f3-xpW~5nw*lG*n7b*kKM1mfc zk4%wgG{#OGloI*(*_{$p;1t)7jrUB@a|DsA`$j+VsM3EN9*!LhK0)M51$!h{SIdR0 z{WF3%b;Oyjc;YrhJ<*ImKP_P4gw2=HyCKM^o&{D|($q&0Ox|37d79#uje7^45+#1L z&lzgmS9IHBO1to?r}d7HDOZOtd3x=wk13OEO;-X_7{5AoN3qh{c1rJ7tQ@?mc^XHrDQZL&b5%o+o38u~jm%z4 z|1WxN9ZsofpF4d&hr^oDCkX2L?gG72iPAeV*_AQ4C{O!`-tkeT>;M08@Xl_DITz(W zjf2G|=mmg;VZQJ64v*u~Qm-qFgLPo|(AO9LCi?o)r|4^W@G2KofVN4{VS=uc!=MR* zj8}_8!=RNp46wr)+2|c}2)PC%Le6yvnB;oZFL8F8t?t5G@JZZe;=?|tXhC~1iOg@_ z_}7FIh{Jyurcs_2>%x9LKil>zF4f&-JCVAV{sMT$Q2s{7HW8_WkiQTz2WRjZvf=E| z6Z~Ryc#LS zRcDB582{c2vB!8w_n;}6XZsOPGpGMrd?;7DJ<*&?%gwTu;p?nv0*tY~fwq=df@SAe z+}}{ooA(F2{^_7kr9mN^Yg-x=vbmPuE= z3{H~#TTCf+q;s7(!G06RqqVO&*NMYxO5whd$UpfBNA}~JB#C+VvVP-7F>SptU{@I0 z1AmpLZWa`d`#Mm7-nsjp6svzw_Nj$z6mrp`L$y%1Z zJ_zr)Mv9n;#>Xbp_f*4@3mBnM=~V!mr9=C`Iz_Qc=S2tajYU`Bh(1qy zRq#n%cIKi}a&c%Ki^-ZP2G4)d9c!^SVs{KcVwX0(2W|~9uP*H1tZ0`P>V$da(+fnt zc$6C*waKa0uo0ZLO=x_`!h=rAt+0nNTYbp*pwm``UKnEg)u~>Bz$*_Jr8%pQcM_vH zTiuULY?qkFo=XtjUFE{*d#3Cqr@F@p8J^R&$60!D)Cg~CuRNNC&;Al!V!#TJKvqW+ z5IZe9QXnSMJKjBy+eYOhBfwU;>u}!)nQR7z)xmH#Fxqo5*M>*@#t_X-CPHQ<>}Ca$ zr9=)0g>b=@C=(gjxlQer>&QL_L^zI1!L>K&Qzs7D1>KR|YM@((`q8b&rdr*)k0<4g z=`?nt6kdNN6&K)>oFu2R68@*_C+3a8`8AJq|@vwZSfMiFg4*z24OS)4LL;pK$wXo z8QfVPN=G#xQ#sY&IaTt?9|P7D+)PG8Ze}wBkMnG5AG1U|12ql-bng(`QQniqKoOO} zg<15;Z)k1joz|bT)xJof zi{M@ZJeib)L+b98D{-G8S$gR@G>#jRe0|_7rAO1ppTeN*{jmPTETwz+=hgZfvy|sr zG-4i7^k^?mI^R!Xue-H%q%WQ^cwRnn2=-JErhx_jnimvg443+vuw~#jkK|EpT8T2Z zyt%={IGgyN(q^!|e^S_vZwwE-^>`g#poZjOXaYsp(vpy?yvS=CGX6wv^-mEv=Qif~ z#YqU&+moqd)WdTPZaw1w49|S4r*1Ewf+rk??GDE@u_EN+P|ZZyQ8q}d$nl;38jHE$ zt!3j`I$K_$v;}po%9ha_Tz<3yWQp14b#vc_6$l9PxU|KTmuQ*`zY&Wk@mHIGUzes8 ziH~mzKEY)L_!V3V1XG)X%a$W?$lFkCgxBT!;&ksWZ&Hu$BJ1uVQ!_iW9J2(Gwd=Z% zW$v{rWeq~RX{mSS)|5dXMPtSI1a`SSQtwX4*0BoB0T$SmR*Jef{CAS! zf|W2HITU?BMQ34i@C()+d{c+9xCaJ176tg!-UE4)O+m`?_(J%_q1GfgTr*nq3zOmL z@D@MLWgluXVP&xAQLem)Fc90r{E%okD_hu+2}v8s+D9lhXk_D!wo)azcMKwVUPb{o z!ZB@Wzf?2;e7zYw501;Tv74QV6tX1|^4n~EYpK$$briENkAD~uP*@^-EJwFJrNlqf z4Rl_VXDom)En{}?X!KYt(O1Z^L$(^-9k~*A;ZgV71_pr4)Bfjeg(P0k%yX<>uj?wtXkK%UG{0$%INTnSER9FwOSCH1VNW-n8Q}g%R&RXLL3R@i?NN{)oZtHRt;s1wBT<%<2r`FB1kl&w z;5Mj>b%+VQo*J0D@7o|4-pmGGyb)YqU#or=$uS1Ahu8QhTEkX0=E$68w1~1FL6ob( z32U!D${uN`15OIxV8aB4_O7qOch4DpS3rr=#WkARXluyAb|ko&AEY|YV0+M|uS8keV7qozaAbivy01Kog(av* zqJLDQ@-#fpIe!nTn`988=8<(v-79VEVDA&Fzx<8Tu5dmQxU`wQ$)J@j2T^uulhbH@ zq>QibAYD*j&U#^Q&%RHs(jJQ>OV9a^DIA@84wKkXRts-%@pk-@TcNQ@|470U0hrx^R1g%f5dmEAP{Tnv`yqX|rd;E-6H!Z1Up*!|A8e@Y*q%Ds z`;K=XiPnboWoM40!ZRG$qq@f*=XNC5c7prlCSrVG|DR@y!&wg&#b(f01zT)x!?*{_ ziKbG7&@+%b)?|nY)QK`6b+6p!1a%H6VWdDb`IQhtPPCx$Y_4sav-HVGc^U62B>PV+ z<&FvX>4O(2N#mfV{pa$pRJ<$zceXGZ-J7bDhr(3v>gz&Mq*% zRhSTYxMs)cWPEo<&)=^kq`7VvTq_4xCf*Lg6yVX|7;<~Khj+^G_khwLvI(nHVmKE` z381r;rxz`x5eV?Inc3QqX!LCI13uBii9gJNx&?NS_IT@D)EH?tOvFDwxlJK+M*YAtyO$~F;T*oE(a zfE_l@LHRw;b}r9$(RbWd{0XBE1E!F8?dCmTH?YcduEQy?-tlWCb=*APZ82oYj8+! z6#VSy91=@G5qlJXBF+@6tQcJ%p+nFg9AafcpA>tsOk*PMw+T`i;HfWk4f|ja1jz6= zm}Qs6TRysTkCM=l0~K0s#$afZLYxTe4BGU<%FJ?BImfN9eOl=klS~AC!YJT9BX!#| z*sbOt(QkN0>3oNrdOOAOkvza1Dd=5j#ivjZQsTCV2^v>Z714Y?4*i=1;rtI-O-AhOu-x{U|MkwP4It5e+$KMl;e z)nkD^Xt(;U(8|f?BwYtb{UlZ4E2a)CcS5@{ZP2H-M2S)_e&kl@6y~1jN(@2c`QiGO z#kf2?ky*ZhD$Ivt+RN7DD`zlH`r}8!Q9BRX0p;;`!5MfQ2ubeVVH6w@W6-F$4?|b| z0X-zlm2lAx%t9Cr*W~i}E9aOO+k@QMiK*vkj{prmkh>dDw&)ay5+jW~B*?f|><)%v zcOa4vjIJ4IPSk;7qH@FNr=5Kw6!RhwGQQZt?ZZguyAMr-!I2NiEmLBOH3V$iC~mB9 zK@0O^EU0Yi6~`=hAs2DCMrk1*JxIR+}nJS#I09+QAQp8P~GdNB} zC~wk~oDj}TI6wU<=w&dk(rki;Kb-k+9tF*ZlUHflL!%GQLOAab*KWmCnr+ZpMraX2 zGkSAGX7MIXSSp=TSGipIx44=kw3z{myH3E!mco~lBzzP|dEwnIingxOJS1|ouF~v; zE-^A)DHC26n8~X&`whPA!qNH!3R9bGWWKb2egcm|cn^q7PRlU{8`&B=H8K^+L_Pe5V_P~h-C zCIP((Xc__(I{aYnnc`XkyeF!xye2vPkf;&Tg^+zAKoJUQDgZ4B_#gx*arnQNDHHoJz z0*3cJnb1L4{}8N1!0wf>Fv6}0!R82X^c}G~TKSvXt+nl!15Lw>2fo&C zdr4_m@HHqF`O;0;XPv{=30LOU!da6OiG0`&`ON+cWY1XNkTEKc8P2dO8Rq|&h|bXg zHs%q?S0GY(ANHeORT8o4#N5ZYPnhZd4kQrfVc5_4^4eb%u3|X++W|4g-w3ce_ayQH zi3V>rV;q@AWs>;Bk3=$Y7?S76t}=4KF5|@^Mh^1~^?g_cNBHa<&BvR6>ZTh1;zOi5 z+;hV?488EtbV_-CxaqrH!0fPgsV-)!8o!T`ZXeN$HiQ3|04%FFu;!kJ;ctTCYjSvE z5oXk_M<15QL?Q?XZ%3GMR0hS!pxq4eej&r+WY~U&Rm-5(GUyP4-eHhB*MQr+7zlBx z8^vH@6KkK5_Z4FtaA#oAqBT>a_Au0bA4MnE*G5zrI(wW-nUr=H~Y%lo`}FPpjNKk%s?YwdIY1)rxAxY^Zk%xG`>Q1coE`eA(1w~reT~GUnS0xLh>_+&N3-Va0x!sxD$gGK9gZ}NuSBD-VC4M zFO5Im!IfO<(bQ){p?4XIz@F~AL3Q3>?GkXYc`zIn2~|F@)`4t%jU|Hw(vM4|7osvm z`Vluafw`zuNQ@8B6I*MPsDldHC>+ZW^5fkUD(*0|_@4_Y*i8((gNu?^uJRR1P!3C2=%z^w?nxen3L z++)QjrsY^}<6q8I)oIslJW@1(U24^dS(OyzmYrKU%L4E%&>-#!B z?5VOG^i&}>QHCbr??`x=3BRB4Ou{Ei_=^&LzX{Lo#R!RvFjz*IFC%1|5xNpiOR1>G zA7fCD-fQ#@e^*kx(+;4G_Eipeisv*dQPIE`7euUa7(~XBHIi1-UTT1EqMGY~u>l=` zYQ)J>RwGANV`(-@DMDq97bM&!;Y&?;G2!`y&y?_Aynq0uVl%>UMo3|V(K5o95ba86kxc zM#~I(N%(LR-iPp5!ZRfN1_|$D!s7|Y6Aowr3BOvx<4yS4EWmdYei3cu_Cf$9Bb>e4 zYyn1C$p{A-p*;R9Qlg9Ynef$wR}j8I!VgRMY7@Sc@FK!rknoQse5na9COn_;nSgsy zz&aVB*o-io5mFdow9Mc&2_J64`w$*Wc!q>mNO&I;9#8m5j8&tZgg+_a@h1H20Kj(> ze$iFuWeq3G2xmu`Ex-sX8Q~xr6Yv5F-)F*C6JA011_{rW@YN=KDd9zgzaZf~C48v~ zFD5*n@R=^JD4>muP;5pR&Il=tFj{6{lknjtybs~Agl9;2Evkkt>SMy=2|sxr@OBcu zU&7-}_*q=Uri?H}MkqET3}=KCMi?#O9tj_A!ut>&OL&Ha=Sp}V6CO|a zNnBzu+DUk(gvXokvzdVJ23(Kb92GAWO>h+?7ss=s4?rOZLe8X?PxxVhjefC$K*2$FZPFy-j`JY-&}1Y>i`un@)`d|2!z3@$I0&>0Y(%;m&n8mSP}A2#^_j6t-X_(o8*TPZXf#>gJ2YPkHY}A9C-Bu6YhZJb5gCj)`YVbKLuflFc3_<5dq6^RV ztqay8Q$`(gmwMiJ9(aF^ygA?G9e3Cpg)mI$VmthWbYffPO@*Wu^9XKE^T*-Lm9?ks zsvOiG6y@O zbE*1nZF+Xx0c`N7b$l%x(-v5po|EuFqUc3Tz}CPgt`Cyl^-A^JV!V2`39*?brvE0~ zew`1*8=i6nycu=D(hI_B0LUcw!NogB5Y1EYNl`cjCqd*lunA~mj3{V66nC>Id>j}U z)Ia_%`kopNpM~6T0nb7R!0m|JEpUUgwlX-EPwc;w5#mJpJq^;wi}W8!@Ik~4tZJNo zjYz-nQcx`YU(okdDcD;Jfqeo#Rj|tOFEE4ga03BuBrqYE+rpC=LwE%(^|-l8O`@3E4mf@#q2SxBn~WLaj9H+aj2+d znE1r3!pB)zt-tpUPTfXDsNXy244B22mHYCBg9=@9FSPVm~me~pX26$;(QV*xEpEz#%M08CD(KWF2 zK89B4f_dthAuvrMk6b^wUDP03(3Y6P@R6wKomMKX$IfFQ`^6ZNRu^>f%(ZfeT+Q4X z@)E6{t;usvKd%EJa#6N**mgB)<>U}S%R>0x4YldnLcq_4`cxVt0IJV4+4(ta{ zWJxDr>4I-|`zLVxF8oCa({1l5ty`B55sh#vkDr*=;B!_EjnHr0qQpNkNKha)LhLP} z(^Ih`i0VU+azrH0YfobfCXV_b0m8ht^e7J^cy<@+QJM#=jddy8XEi+QYmp^%DZS4k zk%h7#*-i*bVo7{YU{J#%b)Y>TtMDI!Puj2b_rWS;nxMX3IH3$CcrLIrh-KTW4oid@ z{#{9NFuNT%jv#YrQzNh@D-A20IoTw(qSyWQ^R^XZ6|^wyp0(Q=bp@f5*N=*Mx$~4 z{$F)QKTeXB&Q?ze#sl|OFs3Jj>hH7#y;$&4tol0l;Pnp7t27pxXjWIM9gQFl#7v;N z*RZW+kmQ5@FX#~uB8XQ6PMJAR3E^eoLsW>LynbgP#L==GjVwlMpd+>sp#4AOVySo! zW(;vg9{&YB#u*OmOfC#t==bBy)bzhk{{$p-bZVN3s~6`3&+0#|Qo6v@HLYDa)$P(+ z&32lq8D9k}RpeMwiyu_CV+h%*asOrf4!7-NxzSiY*xYDjC1AE=a1*iUz^2m;B!5)v zAOVRZ8w&#-RmII~Gu>Jyot|4V(u&VyOtKeyPvBtK9e5ro1zY5)sC~(tIwtotPOLpH z5MaJAUrAbQ?CC1X_dxq4KT=IoC)r6z3j}iDSbz|$r^D18!rUs2n&r4_brrI2ZmsAgKQTUGa6ciHm?;x=>lrl;-bEGyFIvgB~qAd!1buJmXk(~;53>YV6Am< zSb;V*0TOyYtp-9XcHlMmPjsvq+6AT$pc!~Lw)&@psC|w#BRjW@`cz!@`61F3^=ZcB zzMfus=?6;u&}g74wVR>YEZ$ljwKKSQJ_=SR_tmDh&zPL)8R@$OD$RRSj)kN|zDwa1 z*x|zOyJRoEd3{(Hu2`}0JM)_9_iR$y>dUK@R^G{(E^RChdJcMUS6h>(H9I_Qd^6J` zJT2FQ3&treZe@aK(=CMKFnbCURbqv4X(OO_ySMm(25Ao>ZMbKj(C08FBQ0%)qyY^o zGs(0V5LiC(=kw0&i`_yy3}v9!p&8ah++lVkf8t2qEbCX3)fd2E;5-(5FoC7sNNyL* z;_%85vn7Kw9+6Nmo{<{`*Lp09VaBhm1>$rEvJi^&JSd5RlMS(aaI-KyZ?@8Yz~s!p z56Hi=8dwDviw!h-ZbV;noz$QgVS!^<$U~@CZmN$wB2!eqjhE($9*ZPVBr${iWGTOj7_q zLOJ^C)yhL&8fj9$#C-thySwF0fjsRYSVH&!yIYDg-cKsT*NESS>7y-TRe6)IHFy9F z+W8Sc!Fg_*?M${Kwm*Mnz?}Tu=({s6bkA~7&1^^VQ3CEtisV)EY{$qS;T`jp!_R0P z2%3@<&7c#2eFqB<;CFA2l}Llj!{(@&nE>qnqIueIqH0H zaUu|7pgoDdc}e=mYnArl+ugdcR$1zW?kDEmax|A|BB{ZS@hnoBJH~c!iVdURNnWex zY=A0+O17{X^M6C?J3v-v&7Nx8M1Zd&XH9 zXo7>qp7A4$v7m8x_l8@>oj^x!8NW5Rj5OBdnCn4QYj<@uvhys%iq#j6Y30_Y$O)gr zKNArFYU+hAFclurD>(y2uYAR(pCEgM&3_cl|GA^=e=s!I5$LyC#uy_z=R08()Z$P# zvz7~KLxj3wp&?FXG1T*0f(`kH0^iU3)gA8op^(F&rc2PqH z)-%FnUOz&?l6i$jE49ZDN(Ht0>obqT@Ls)s+GO}@a`dvN6i2iAg+cFpPx!D=4R^>w z541m8={GS0akhEBc0r@{gKa5L3OouIXnh<$^;w2A;7WhluJ2y0^qce-Gs~D+-DoDw z!cxMS)Cc6U(cq6{>&GQkk{Zd5u%r8~uZqYP5cC{FrzGi#8S8_3yy_6cIP}WhyP^60zSJkL=!v(pRD{9M*l%fOgZ{bbiLx}$9f65mKQs? zR1^{r@4i{|2ux^ujzP=cXt>gXjU29WA#{bAuM;GiR35|AX!aolaE>+eq&=c}E74kx zHH&y(%B60TjKSL;vd65yv?(B99~2hCPG#bnm5 zAal;31({s->esjy(U}3R?}QB&ur%D+s@SBo!=0_SHz{`twFunuk(*=QER^)6>`OSs z1UQ+--s^b`pW1s_jx`Ag5R>3M9QBi62YjJxmb-5glfaoSM!+7~+=(3>a9!su3q2`sz^DQ?toN3qHAVdm1sJ{&s2S~gRB*Y$oZQf`^w?v%OAl2Xsq`TM#{#I?9`oRr$*OzYIdTYzD?=TB?_@5&4Qx=&0?^iS$*_* z+msRE!3_QTZOWkd7y2;s_+W2Q#=qfnR_+u%F=hX)EKu}Brz`Y?3L7k@2)rX2N-{M5 z2so`ip&{eHxHH?Md&5rY*j;o=%k6^D`O%6PwB_-y_11r?QBuNdZq?gtS8k9dl>UAm zow6f1BEKv+JKguI4KuFK>|6E1?aF9V^#~UPufqLV|1{p8eTP}e*CUPa=c%etGSv-> zCVZ7#xerl{KmN_tQQpg$8Hq79l=ttr-MCxaoXwow4Wzc7=!t7AHC+CsUdY?mp(+ps z9(6b2HPn}{(^GdSS7pfuE6wdhKzplc=pLWvaOlRxFSTEaO^R{wP3VjOZQiwYqS*pt z@uPqFu`)ekjw4(j`iauIQw^p`t{T9#6seU4qX&t`w4QYkVE$k{pRD^oQF?l-P+z&_ zzpuA-w&;OSIVK!5!PvNfE#T=6zl;8V34d`8x2dVHs%2evw+sV_>nbrvQLyoph$?w# zBv+8UCaXx$&Ie?!>k;g=Gux3e;GYPHrGKFGV=0Y^r~ek|$9>Y6_VmxtQ2X+jc5u7Z z2xF4;b`;*MNTWddJ4=78;gd_Ye`94Cf^2Oo8(r=}d$3PU*~qbD(s(;p{7%!)E5g zohpM1;Or)yg>bf`6RPOtJrBFs(BBDJ1I~;;1#!UjnJMCfLFMqD1W$_RpNr#26ZPPy zO8ee0d^IegGF8KVKF1Rr1`A0;&Vx7&$JkJFN~qO-z<5#Y(Td&f@|kYrU!mXrnbJOK z1~NnMK7;IyI5Z4J56>VhaJ%4q=U~K!=|!I@36Z@;de5_Z#b-)VtJNUPc${!OG_`q) z#n}FLecNYBkAz+%F~KIqcz|&K#EQU9BtlyUKG&P=Qc`SgJ!6;Bqvg`1@URO0Io1q_ zc5CW7y<``}>px7vI*-5NV{WZ<1sv|+AyW`NpfFo2uxD#wnj5xS^J8)O7&cQ5&~(c| zPYSO`id)9rG)BHS4)^$C@gLmm!whpJ&^htAboWUaQ(7^=qG0 zI(pNr%l?|u7Z|yv*@q}=`oT(z9~lax7MQNL1(!WbR4sEB{r+2X7756t_MebBBXuZm z+=`hTvVVHO7-C%JBccBnI~L3~a0hxpw47y&Lt1Nv!2uX4off(%mZDGHqukb-T&GXm z6YJBuPNvfq@76c(fz`it`pG>?V)GSjLQr$1#;v#8i?_!j!}WjcRl1JdGCdq)rkIcV z__j=fVGc`Dule{+Rjzu9k1a7ZdM>!Q04{KO1j(06AU(j->V?M6X(oY_d5E&A2I}2D zSMKW#YdP{>zoy*!V5md>S34Z1^^N=R#3{=O^Wg06fWcW~s?Z8P&$C>t|D&+W!=xLA zPwk!k!nr9akADO{PYa9DDu%E4ese<;$QH}~6Czp6%lyb?pZcm|K@PEU3$Ma$=-{&5 zKmp^VH+i}8_z0$OxV{zqqvx#|<<=SV*I*JoFCaz&V$?nZHXb~>VA?EGBk+q$Q@jG3 zXS{mkvi{*yN>Y20`2Zh>mQ%%tho3by8G%OZa&g!Ed7{05uTi&9tj0Y+&0*6RtMP+~ZBQMQ)&h`*W;Aia?r9cWEGt+HjnG%9whRjp z#Y$~kw|Yiv9voTZ)(Rg>WCyJ1$R+PwG339moHye&tL-eYmXRl+gT%Z?^vBKUN308n zwBGK9Q5BICWcv{OdF5Tl^=qb|_)bX>wKUCyR4{6Jhu+{;Ylq_O+U(Zbxi<`T>u~sr z3(aoLmHX7Y$={a8%;raS>uwfDJ`3GyJl3*7hu$DN)Bqm{?VWG*vhS6a4}JunXE}QD z5*)QUL}bL*SkxgL_6(2bsqfP3iG)QS@kAQxX56%#%h96!jQ0TI@dnbp;v29yc5ydw zun4;tm?*kh_kOOlZ*||DZ0{=1Xbq>dv!`hK7y7?GSFW+`*Y|v`baFY*0>7-kmXXw4ZP`bs8OE&oxJTeunKk$W; z)=Bnt6=xUT&`~EP_~so#9q?kA;a1-@^be7)1IKFG`cf=RxNeQ-NYOF0J_Mofj^Y>e z;1@7yKGr>cyWtEE@k6)gs@1S`1hUsxq%lNi#=OM+Gy0&Z18O-KANRJyHDBb35e9ST zcfbcjtCWvI9r_ydQ)*R(W&3juk{Y{O)CFrlGoQbZT&y6DUQ8FuYKXM$GIxA*n5VZn ziQF}FLzCjTSRYF;DNOS&V-VA5iZNjl7IUwGNny@rU? z8*0bttg>b=?nM(Z|&{|7@3dR{Rd7%)Gd5&MqoAx<$0!G0kd7IAR5<)SoqtB zSpa(ix5P}Sum1@zuhs^L!PuuK(ph6qqCOVx^Lm=rWTUck`iC%vH7p@^QNOFLY=Ch6 znTokY&>9?U3gE2)+UePNABo&N4k1Yt8}?@+@%2`f0AX|}ZgVP&5Z$;{Ap8-VQs{C3 zVLe3S(5}5O4CUF_h!QO;39H|2T2?YX*FoPS*7ziWbNGOTGKTbVpF#Px0 z6*%5aHnV71Qo94*BrC_-_ZO#jOz?*6tIIY&QpkFYXmGfWaF++vHfYxFtT2`MgYF555a2*m11+u&0pvIMytqEQlvehZ3S-F=z2rT(}); zKFQ_@C(MX5tW~)F)7MIJ_}mq`HJ&KUk&?*6IWe$^}7zyWu z1q4{0s6G_#cy~M2k31as8um*zl54IfnGSywRFDgLfwXCXA>+dP8lZb)oZW}pL&hug zm-Z{y$<<9-rr-(*a}@Vj2fOC#)&k;z`qeESzT$D_>UJH-yI9Y#Cm;apQ#2TU5dL2D zad~rA-U!8;57DGS+^qzF!>Ba*xXF@)!x85I`C@+AEfKyB!)k3XPfhVQtj zzkWdJlR9l8XMkm}VS?~k1{+4e_a}o5tK#(LUn?%}#`ahUg>i=QaaT6Zp#C1%A+{xw zeuL7tZ3e22ZTcLv$zS*T7qHtT`&k{sem(RxPY1Q|N^`Kcp@yPvW7wN_9QlKo=N<-YWnFHA{r; zL-_#ElIp0Bh5i9L{KcDa60`;iHth)(s*_8qqBbGO3#A+5o9064)zg{EuIw3L5(D*P1Onj`{77DmXVE4vR%iUEPa$R2yMg(?f{-b2)Gn)MX|$~N+~O_;qpxKp65IKpHudy)**YRG^~PM5w%Brn;jUKg zsCr)VL`uU7oQ1D=yorC*EjZz_rW+wZBfXcXOe;|tG2QM(WtCqa|6M z#S;ECW05u8#?ViLFVDkKyTlUni#wKY;Iv4dK95Myh9zrWsJM(sfm%$qdeT(4NkcWw z0I6(a1~k%tY8)o@pBTm=7K_wUk*T4YO(V-mmfDTe8?r^rlyOjjGA$T|3??m0VY6H9 zJe0G_Q8p3P2raISd*WWQG!FlBW>1W?c=`u#Y}gM)@Ub8MKjOXxJc=sWKRro$GBMZz z6O0lekpU7ON)~Vvh?<5TGJy%8fJ70D8wgQRSPT*s?O-NoI}T!#Rx`{V+JqF6vLa zZ>A9Jj^zFnRr2NEH~o>xT+hEYPh-sj+uRujz8Dt^&;S7FTnWeBaC+l3a3A`p8k{Wy z?Fw)<*f=8~nG8?+*ZZNCH|BW)-0c~9e-Q<)#Y1ZanKpx3aVRS=j;6F@1gQ1*20IvF z2~+!F{DVE1jsnddJQ|QD7FkO~M<$?NV~vff#<{rQ}Xv&lDaJD{VY8 z+nN6qngroPPK2O7X!ib7P=vS-5wUzb*g^=$SHTS0m;Ogs{y%3mAz|M^cEsl~vt*A7 zrhj>kZ!Ua7$5ipCVDGR_{g*MS_XLPEFs6%AfnAd*U%;CwZr@_1DZSIg`3euM6@?Y7agkVr`}cu+6k?NLtF*Ef2FFBPQ4YI3 zIta_7v!J0^BJc7LcUsTrB)W=Et5NCm`YmnFWlo`%@3>u!H3eIHjfll<6ts53f(vGB zOe=O-BJ9o~40QuuxXLHm%!e>-cC!}P;-d0zbpdJIJ#U>At zKLYC*$(MjcJ1R0BbLDCT3G&xQiAwjL)CEG2<`(Etdsw(B=P`9BYVRzIq*Is?MQfk zpX7l12ynFtNRr&=IN%-vTr3LYNRiwEVaeNRG64>l07OxV;(&3zQNQnV6Ot~uXW^h9 zvW%uI@0)-u$$gqvGL!%>nE(XV`;h}~Aix3>Fivtu@Jf0SpvVN|nZbw>380QOA^C{< z%CmGK$W0~yk+81e02=|WGXXe^lf(h-y#Rig0JKEr@Uu%K@#~+9Y z$!&x~dWV1`Od!p3DG&|muLSF3!e||8_V5LQU17qi8O-S6(*!$O80h_a1~WQ1k6?|e z32b0MqlbkAtTJJwZcA>Xhj|41g9&S4Fe4h$Xo3aH^fB12d?YnJ}7*l6x$Nbtc%!>4DzU%)~A|hgk@=V>$x< zvAMXACaT%PV|D;nn;B`^O76)#<9>p@Y{H1)NNywE({_TDnJ`+$!f?p*ts~eB6Gr+M zj?P^{^WWQPH33JPz$^xQfM;Auup3R7lfjI5PcIYfDib!2!QSWjo+sFuX@TD7G1xo~ zTS%~Gf~mxb7UnacF^2O9_?elph{24&RKF$IUrpF-2CL(R<`e8`6IQ}tPjlEE1be`Q zl``E)f{#!!Oj;1dcT6f znt7SOCfFVhgWt)**BS6-4oo3notg1n1~X!IT|={gc+RY!A(?2$y%7ecUS8?BFo5&$kVX43^?65ol|ifb9+* zWDAg0gXn-dz9J!%c*=@J{Ww7M`QJy5QcJKXz>?kxgEII2KZ7$HoWOUo1|7u80t*l4 zsy3Wh)|P&Sj}Sk+q|*8J?66`Ss{Yt+^g7Q7QUXN+&uoJ#J^Jf z%fZd;E5*OO^BeY@ z*0Kx+WVV2ygCq|h4P7><2_QKN3x;r1*CGQ&2P6AI@!Rtj1q=tP0Vw_>Qk=y@>te&0 z;Tv}REc}|{>!4|Yi%iE41vrXF@l1n;TB^NsK4=V~#Xtfu2vy&R1V-xtm0iJuZO1H{ zP!o74u;IU9p}-79dN6-8^yuDrf^C$bni4c~_$CgIG~gc+dP$rHS4B$!AEvZ#Q`9DXH-mmBaQ1WzLPFb=Dss;_&GPJf7fT1n27z)$(ksvrW$Bj0%-3m7=a6ZA3? zZ1bUjYJxX&_(vQbX}~`u_zHrr=5Q~EABZi0;{0!y6l zJdgzpjNl1+840!#yqe(694>Kqqyhhs;428en!|U2I50#9;tUKBycF;b9vce|k&@=Z zMM89Sq7%nYo!Sz1?XDB|gR~G#TT54kwBa$wL%xgyGHF}?HK+#0wth~CFJlE1cIZnP zIq+rl@B*;4e-3fBe6MaLrOC|-HSXzC5Qq}@cQWM(3pdiyPxG*wi`t-hBdjfs9~_nz zwUQd18{wIVcuJE7QX#Yu_LSg|f>eG4z$~e<9nrr$QxWx`Fa}!CG;EJkR1;5kycD5K zyp(vRMBwhnj8E9*!MFyc6oqJiw7cxTldnwvpY2}yXKJsXj={^Dr%LwRAh~fI= zXlH?&<#ypZCPGPCvkOs4a8&;Teo1jbySCe@)xqb`#jemmXwDqrVvg{QFA6bBl#K7@ z!pD-Qh0-vMqNU{F&ZOt;Zt6eXE6HvQ#I4_oy#!59$8QnEXQ8-P1JUtPB*SBp+^%QQ zh(Xinf#d6nXL=$FG8-8V#PBvsD@Vq_C>!o(EhV)N4x$`&3rdVTan4Zki77y?N~mR* zi@Y7c4K;TUS0hMRzp zV4ATxfiFcK5g&>IA9!y(j)*Ov*h{JZ7!$06XbCng16v$0l3{GM8e>TOJIo=0J*oi& zh?6g)=4+UXo^ZD9qLbS^qFvXhO-H@U(OzDKe5 zlyPzH0X`t8AIPCD)1Z{FL7~PVxCR@NA|;6ZbUYFof&+sVUotAs9TP$a!kb4|1?B7v zj6ltKTcXxkT?4%1deVOb z@zh6jhwvXnd;?klzXECH=QJ7SY&S6v6JZVpg(kyz1N9hUpx(Tk8`y`ND5r6bePf*f zZv!?2ZEOgBbm4xQvsvb(zzv>c!9o*CSPUUH0EA?7Qd~L$Y^=Nr++pJLGf_pW_l`G)@z4*?h0nt8Dk>UeYBbAh#0*GK6C9kQ*$L+kI@(kZQ4 zPy2IpoEqGCHSY;`M?j%4t_i={xF&oEzb3qR01uw=9R#jRYxn;izky9Y?O5w_&%^*} z`6Hm0vAf{>t5~7{$$}>k`v3(J2f?+{M3`V~j2>}!RfjnrBt=|J+>sRXJmLuNU_0>% zS*vH9MDPJg(}*!-e84yj7=XcyCHHcSjCNL9xtYlBc%wmf*y4oE+6NeB{6J>`=S4Kn zi*PqC5uZU?$7DuZr<_8oZwXwOWX$jVL{3Fuv86QBTSL4!Sok0|zv%=So6O`ejUYd0 zUQ#M#s=MAAWXK=!~tH6DE+j>IeBtboEM3^G(yo~c!ODU%|gvG zIVa-{=Q77Edmx&E0@YxNuTTqdw;Rp7%b}8@{{Wdk!K42XWW=KRw!LTDEBr3Z3cM(I zp#{Hx3_dS@kJD!i=Tg9MA5l|Gm~!YQtZXV z^ojQq$0yOM8nP9)>_yR}3W!q0p3kLie(=jQCT&B+?`#i5?R?OdVxNzJ%^&8r$D(!E zc_euQ!iW1T&AZ!RePl*XHtlq37svqS)rXyGfyO3mQ>OE~JQA4($NG}nu$6cQw?2xC}KcQGkhMUV(C z)jpp{YZ^^a>IY4-5_Yp7UJPorr{E(UHVI4vsA9e^!99W#?K0R6VNU-9xyEKc3jbHI z8^*93-x0f~H-}<3mw+6*Q=A3QapkgLnmzwgB z;eb=P=qt$}e4hL%K2b|C-O}GVB#D zyq_eZ&F4f*>L1=_dqn&#@_@;s0g`(IaH5?JXcnzsn8<*-cRS=JIQ&h-;Yk@F4xg7( z@B?tcH{YG=Wf=W4=?0^xVGn53E_<=b*@1vWM#k z+zDJqQ=lW<2}_6A`k!~eMK}=5%$p=s)Yx5PmDWP5q32N zRfOXFfO?Qi<%c-$4WRes&Z`iC8&4tLdr%RMi4mbHLaz3szZ{G|MC5O#!FPc%XL0t= z=MT^_AFW|?h>(FqBt24q1mX*Da24;Wah4#MmWexiRd2$<1@j>AITBDP$Udm~G1IL5oxSrAv@6dKxFJ_SWWX>iavE5C2h zIYmrjYo(Z@&h3UIFLq#AjYYm;yKL!4RG)&*0^E*MtZ`EmIqY%G>V=+qi-lG%>N-h zVR04ae~X^b<}m-C@l^5gyLjY#Zk?f8qvcpx;i6u2GDn*lm7_fp>(Cy;k_DbGo~y8W z&_sGp%JFoSJy){Fw5{+3OtT`k0{=h`t^@GO9PdKD+36dhKIB`1HCj(@hldTmk@U~} z_$dz(z=fv;2|>%56kCi`Z%nv$(Wqky*IW^!#`vO*OrShWpM~yje(fLf^*i%xO32q; z{A(9k8<`mLd5ajWzuX>~Jy!ON>CYRD@}0mXKBVxT86VQN;uFhDU>w%X^^VCm`aXs= zD-Yi(ki$7^^b1#s!&H+*Mgx$8tyOf@rM;KEy~1nARnhNAjjn?f}3P+toOF|as;`a7%MFT52nwE+TG#vy>y3+Cko}# z*cAl|aC%CqdZ*_ZYD^C5qhfvYS_I}tMK8{Er39mYav4}T$`|}}84Tv=jkp>E7aoH~ z7nK7}u3KY0cfe^=#U|+;NjL`i5t4)SaoEu_YfOSu8!Fu`+W`#3B*kNZyS5#VIzT*sy!)&CJK!^pnf?#!4CZ?r#wG5W{imC#0Q z^;d$nou2WmX1%jTOj3FAB!B|NU%`sUL0J^i(tX}FG`weu>HSBd{pgYUl!OGb*A2%Cv-gka?5Xb&eX!kED zHLQ4q(VLJ0-wZ8qAE<;7p*oFrhoK*=2IGBZ$M@EELtk%?k z=wXi9k{cn8!{KO959&S+ z_C1s=RX*9182>e%tSF;(T>vwhPZvQUSz!|XJaRp@_lbEsq{=UF+V68kDyUp1Yn$-C zU9Q=mAXSdMTdKTc3Qh&$Y#<#1yyG7BcWTYPC|iS~ZNz8AR;$={IkZOPK!~Va84bmw z5R9*H3;o$ee-MhY?*`A9B#JAL7apzOA1Pj!r94x3xAM$GQKU!lqEe)5uS~qorA;%WfFJeV_$v^RgMzF z{Nw3~3E>>dinT9qsN_yZPNT7O(>7xJ(%Vg4adgZ(;da4KWvE65d}hUAWbl>e`a8zy zG_hF9M?}7)wyak0@5d+Ry5eub6XpLDg}3{!M?VaQ*3c823l4pRW*Ub$DH3H0h90+l zATWnZTc_e&GKHlah>zTnV#W2eO5TXR{p5@v?jjt;7Rdw5Gu(5K+IQV5SfxB~5tny( zrZDG;(1kG!wPe(u1U^lZZyt(XMW~}N!dQK?NVPnq@ClG|P8j4o1;LbJbHh$Zcf0LL zD3{_;PKv;{DN!e-ye5SEcG<_VzxjnyTs59xc4vQ!3Z=W~9fwBQUnl#ku)kSUj1>jc z;1!b_&Q*}jcv^wxum_?U_E5ndVjZY6uK`~a`vms)Zv0(hf14*;Vt*y@@W;Tz5}t8l zjFEAIeHyY%u+J<`z%Q=VV1Ieri%zQ4kvxj!$-p?h$`bRsX5tx|x6@O`1Ss5!vK(m} zDLiXt|WMvf(R>PIjWp}j*UmCc|_a!s(0LzX~I9nyy+ zCmuA-PO(M%-ffTbT~1^0t`{T9Bm;3P?>ZIB)V zuEh_n^h)vFbhWtwAA_zoL-1zCC`tX%M#q|lvfQ1f(hoH(PhJ%l^tIXb8O=H0n2lKJ z1&(PMF-q!AA%}UUDI`Y8O8~GKB|GsDj8UTh_RA|n7kfE~$NU@2Y^LY5HddGddBGvx zVYa*p%wQN}a9DpL78LP|yVJ}a3zlfkTvKWCopuCft^@sPf@y0SlKZ3&`P5Z0V3)CJ z8B=!@401GeFCZ1>U^b3dGXi5nsL-eqVX`+&x;)%@gO^x|Q!1W_2=XAWK5k8#j*k78@IF-eT^Ac+7YLXgk5{$<)YP*9|+enkzFxx_?4R0tB6xg>q zFsTfhQlX6qA&t6-)x~vfUw9}gwH{;d;xDJS>AV!k>yJ)f2U9BhuSW$`Vzv2 znIK>?=T!N(bw8!bo|NHoRC(?MQ6)A);?t2NNS2pG^RCO$4*PdQHgU4ts|%k-B&yI5 zS#SW)Dhf;qk-}w2TQ{Oa3W8u#V&I%OZi&U#D>jsQ*a#xTjY#dA%R<#L83JPy3you( zPM&*u*psBhv}@?5?kn#H@i%%;U!(lLLdysI+}4&Ea(;WAQi4|0);Rv@}4Ru;f@V zDdK*7S{f@}r{>^+Uy0%$2UcT-7Rh%SR&Rtl(HarM+(-AfP~RRwqiApaH58_J9q>4q zY0t{3X^9x)ofaO8X&4TlRgxrl939~-tD|p|+t|#F9e)8+bSF(yK9N;>79)3sPhw+c zU>3NX*d|T^>~1?9ZcC!3v&k?Hf8plGAT)I$%Pu!PbebNnjQvtMh0r%bo0!ob3|0? zL%WEXmbIt!o8$4j?3Dg^yx0@Y6y-D)dQ%q+wuvYNKqMKBZ3RLTXdZ`J@G#1&^lrmw ziP8;W(zAQEJ_AwBy!`?wZ=4Z|v^KAjBHfm@x7^S*14f?>GdVTRyd z_)%LY1kdK*f)7FbI`C%Vw+S2q_#MS^c6x|@IDYpL`yzv$$%CfWgy44?KkeIiD2U$< z=pFnfAWSs+@DSiZ-bw8;p$KZbfe(KwNQN;W5QKhXoY=>5`lOy0C#I_gI&l~cR!mci zFr@^eUyfyP1e~`D!LmP>rrHD}7S2GI=g(AYaBv0mgyvTUzItPB#eRyjX0OFJ6kMYm zj-hqZqTh$<(edK7*AQ;Y+QX%VtMQykyUG*bawen^@vV3@9&X0NoWGZyv*7u? z;rRGpY1L)taF{Q?0B@L%wRJqlS2BPaQeA=Xb4qy*6(1${Y@i~LYXH8mT!9Ah+)J}; zWQEBlp5u+&kcDhd4aEyDCWGGHeM5@*{#K)y!U|r%9q1(P`{DTs1JYCHKsP-9S@c+P zAH;j08L#0BYepb{*IS2CnsrEn2IQc4>8X#+0#>oo-wY{W2EG^tq*d2d^-K^S5-hDR zRV}_oTx_x2v8*a3Q5V-OKIis2qkqboeynrdTvW9Z}yHxuOgnp`WZPL-f^O$)xw4Aa9M45 zmI_xc*giJMl5=a#0XQG+jkWzqh7h@|B^)s)+E5Qf2c;?dTKkp`kt~ zsXNPR!l`FcPSYrFOgTVdW#5Iv`3E1t4RCcP7*NEj1*N5>Wfv_9Jl}!Y=V+l@b}_tI zD!Yi=tI6c#KaQLgipSzCt3{v@=<#)^pbb01v2u+MMxs4=4c-TmP)|ILJncG!-mqni*?wJ<=zUXU;R4tY**lx2S8f5#E+R@!jwgr! zX-d^xwB*zruzXA;NYhEyP82_^(sU}0XH%)1EGqs=&>vS7JW-fM5wK8Vh8&kFzmaQN zV;AfNn5J#B1Ce4eC}%)myYT-+PEBhcY2`OWc9_I4R32AsO|sTZaDs7zWs~N-5L&MK zpDmb^&@X7T`Y*Sd(a3qMqC=biZ?_)vj~Q|aFaAaU9t}X*{8wp!SQn!K6+|#Mlm>be z4SXD=0dSlzWoCb$>|mE|(;SXha%#T30{Wq#=}hbwsPWABspoL`v?x zZ6Os<0!q6lP;fDvSJO7zo5&W}bSJ_Jf&T%V$^Yz6;LdP% zSJ8!N6mcFR3ospfWgT^FPK4F(C=ceS8)knyx#{tpm zh?6R(^a3}1qA&i;?WY}g6?`ctSIdn)C9WH)><1+24fl2ABL}=JWJbnD#WOL{Rq!2>M+j1-%bp-7*CGodjDZ1fOz-JPk{b^q z;r^T&KNT9+8NNAo{72EB>#^P#2)?Qb^Nqy`+;?>c?_UQLb75iP4#VZV{%dWpRRlM>4 zxUL;j#fRFs?Aik#Nz6l8 z$~guZP86_mPJ|O$YU( z(N16@WU-0xJiECaTKOY*fCHbMCPFbyglsku=B5z2t9HZv(+Ta9j zJ3-K-U=P%qcq*wfGmUVJoQcV6LHUhGK(PDN+=Bhcb5^Px%)m*=e2$IwJ|`69aNGb1 zFj^8JD4M_VsMdrzJun>8zwvtomuEo70lcQMmC8If)YJX#3iq5JW9R7oCiuW6zynk!O_d1gr!0~b~S?|<%z`Pb%YcG9Lz0f zg(9~XC}Yqhu!4OICkJzC4)syOv6I7b79kMr9tt8wZv2*GFhqu6JQ~c?+2$E_<0ccsb}~h&^cGZd366c zVUVRD{G4F;IY$ct1&AR0K+Hr4D&ww4w6kzc9f;Wm41EU)2!t{WF+u@?I954=h*Ho9 z13?#q2m)%2ndPt@3E*d~Lz{g8EHn!865I#p&7|j_;apV#SM36>1-7byt-6SYp)7zoo+UmB9tg(RoXZr31Te=0i>WA(;y}HT zD$kL^kcgL9nHdL&QKsNZYcNXa2C!dT8)0Y+7CZnA3B)Mp6QgXj=triDH{d1`XbAXZ z&n?)YBp-uf07ejD@k~r`6>I`miBXbI=xH;=xX9zgu=HU?;M!wx8Cc_b3v(3IA#ZPlQ(RyBXr_?n$`? zykKg+R5>w~8n10ZM?jSJf3I{|uPYMMg(Uq#k(e+jhN#abRp$21DcHqkB&Ih4j5)pX*KJUJ;UNRCoq?BQyEOFu zRp`A^k8YG8ktJAgB9MT;7wbds7oV`i=jf~M7atWy>4P2+|74l}fxh(t@#bEg-U1PK zhv6|`(S%FXeQ(*qd>_n!Yg!}#zH?vbgJ+7v?RWeGNvp7;sPJ7;kH@#o#Rc*-y@@=^ z4E?2<;+xUF&&j9_OXQ9EmY2JP5w*n$_2 zoP;YQ?p$r;jIG1ovE*oB9y9?zS8u1(H>jHFXqp2}qXOn*!^hj}x3BB(JR~MqUwa+! zF4L<%e@K)>%kOTf`leVsAXwhatXlI3**J#|s~TJ)z9d+dXH+#jD!y*9{BTp%WAnvr zg5|m)RkuAU-Yr-@8&tJY73T@zBYzcLmAXJI5yCeOjIMg+DRE(V`0xSIRRb1^$b(>SK-h1h^}f`ERGYxGrLDu z4SGSGC4_HGjIMfhsW?&yU(gL#Wa#3z;V)eqt#4Z@jnSy_4RK%i0$X&| zkvGH%LU`Y(=qkrs;zA+(&ti1d=C{QuLbx0mt>5rB)Oc4!v>v}w+!g)={JT!96wih) zupr~R;!%s``F4HJ`{F6fvWxom4@AG^ogb@eJ{0>zS=^_p4*o;@RIsc$S@q^;;$*=x z<3yFUM*N##sXA6wRV(7Qh~gtv=hldu1l-P2xYUT#<0m1Tu zuc~RIxGmiB>9`psXEpq;8Z`*DD%)x9e)o;VSv_Y7ZGZys0>#v`a~=RZ@4!8E^ohy&cAd z6A=oC8Mgn**fH$dLlIQRp>38^k0{!)nl@x#E2pm2)~6nOF|8rBLC#n!c{j#~g=Kp) zZ}R2|fH?%5M*9{HWQukUEzAV*x3{O(vVAE<&47d7@_L6frX^#uG-ju?oJ^MxW7XN- znFHFrN?1GQdloP<4&A|7=qtcnGSQAkuyHz>5JtVkeri58s^|bRz2jPPY@UZ_dn0}Y&tl10D>;wj z2Nr=EK^f+K9BE)ckP3bii#{a?eF6iYEqK8AO5qNf7MmwCjtadMVmYI7O0uhO+S<^WM@L zYivs6KK$)%YtVMF_rC1C58h9(_kNB0Yz?xObwMsW*FN`eep|cBOfGyo3Y5pKoRwSg zTg@y0M2bLZGyXT?e;sreGJS5v|5`F}xH3#uK!5&L1TNlO)evuFh73e<1Qg&y_ zeFk=BMt(1LrU%@U#RuGzr6x%3ZG;-^LV$1<4FJjE)_Xc9#VDX)8)$(@29?8>88VB3%$fFd zb9)fDQhO0bcgZja{S$0*>;qtxSiY?Ihcy|jZ^7QaAK zged0U?w%!As5QE`frNcP^nwmk4{8ly9XF=crq&YYpgknKD_{|+)fu&t*N@=_^MG>% z?Mt?=bK6VNEPdoYaiEHREMc$G@;cyPEYg4>dhhPmjvx(`41_crYy^kyR^SZ;$(V?n z?bQYO$d&NHC-Ma=5zxEjHT9#(juSAhpVDT35`n<9{z_!B#wv?dw4-GEgODBAqvrQuTuxzea)11(VPh^mSZr z0pF^SDkr5lg*s2Twgr#0UL*g2bUgRLZ@y=e5|>=dtW#@IP()|XSh99S*pq9tjii*N z=VG!k_-1m?CgYV8#}hN<e&c`$N0Y!DdXKpbs-I=m59JeK0o8zX`#&JO>8p;`9EMF8*|0E*D2gulYwCd*-2 zaaM!pDUx%a4BuO2*b*LFqMWXg@~6S}QW3yCj)^omwK@zNP9rjlI4)47% z?rgvi9oTLQlNq0JX!~)87>u{v01Q0Q@@|%0E^8H}%6Viu$nMATd$O@0oJC9I8HCDo z&!jk5-hg{2a1T6ZB021dUl4jnd1C5h?KHk%JTnN*lW@Y8>~s-!T0Unb*J9Pk(rpT$ znc*;iW{g5D&^+)Pv3od*)@L0QhpSjbGpwdF1QTK%S~ghfd1%PT2pexf%MC?_!Q0&6 za~*k`a#`jE{hM>QtH3uxxEt}dN82UU?V|FR0e|DS0e}CXWe?e@9CV5jctD`zY(kg{ z`3UpZtX|MevSHBL;q=5cYRA!U&>_Q-lDw0+9u`}Z613ytKuR(M2e8Jlfg3I*t z?jeK?A!7xsC|eX;i=utgco>V7leE}o<|KT_0(pz=n9R3Xko60>?1*3>JQHNB*w)Kh zmMRh<*Dv8*D{Rt@B27N!zM%zQUCm;;{yK z6K~Qt?}0)1m8C6Wf|_?aIJD4IFa~!t+Q1Ot6B!`nSj{{#49+5I#|>fyTMgRI?oHeCM52_WAJdE!&nz{L6bKq*Mf=2F%1g+G zy{y%M*U=AVBPs|~jAL4g*cz?UhEr(f1 z%Pb)(f5FXfoj3A8%D23{jZAT3ANIuL>idF+_2#6t_6W=({oec>3 z6?oVRpa6W1SRM%o*&9Qgjkq7NHR9vmI1y~`6+8hzUS^80lWqrb!s_X)2CLg!hGU-s z^mpQi88|1VO65a|-Xc^8qZw$;zc1t7Im10 zj96AjE@P;m888T4s)D|9ne{b7V2$x+Vu77bv6uM*J1~Ct!btJwLogh$0epQ!K!xWc zxSvK4C(-EEVa%J$Xz{_>_X`#H4*Gll|F8mYB~0dXCH^=O|IAic4!oJr8>R{h*0!IJ zK%)!w@VV}(oD$D+50vTz|Emf9dxlbDBefL0#}%_pbs zFmAQ>ch<+Wiv4eDHiWIIpEd>(ghA)vc%_Q4WMj2(L8SL+6>o^Xie^>8HaXR=A8Zwq zVg_SXh6Cf~m+P*IsPHew;(-@)31Aw!a48^3Z3GYHUw>+#NIlLiGG(7I5`tN0d=imO zSyQ`z3l`(QEC*fE@{=5D_2nyxV3jmelg*2%evovo z3)w0fQjgxTk9}>Fqe^Fg2^msHH7g@VIxUIiebcJjL9hkUob~AAEWs(g1Wp02Hh6!?VJ`vFWjv>ypgPHwq2mDH{@0a7n(km#i( zH#GXN{cRW|Tm@^HMPe(r;~+2r%wYWugG2+C8&~%wrQcPs5vF@u=VE@4-|kp_FIt*8 z_7Zyp&V~`+J?@#8gdO5TjfYWFZowYXr8X$Z+ikwaBPaldZdwFno)CLo&veojYy%+J ziwipfFgW}eFgWbn56)AeH=Gc=4I;8KNQpS0BDor1-g0>dKP#1&LX_kb)aH5zFZ7q- z8C-ybv%dL+*wYSVx*A;G%x6Osrsu#nS%%D~{cb$#`6tB$eZWcaD&Y%VJ}G9XanA-# z!LEQQn2!0C(oj-eaZmY6@C@x3iwN4G@UOr&YshON)(;`CSE4f^ugk&ADpEIV$0_GJ zxCqb~2HwvlVeJ_DAs)9JguWlDy5l+H(OYtLz=ad{_HK3W<|>MMUiIhD3qm# z8vlRx}n`{RrNoLe~cRZhb}C`?9K4beyG14!1MUuYl-o>9-n6o z8A)%_xeIt6a90;w)eEBaoru0Kb)v6SE-L(-{;Z+I53|p+26*`Ib&EUMs%Bnc?HR4F z9C1aIzT?Bln^YGTv2M132XpU0nifm=Hr@v;@C_XoA+CW#BzgGp7PXiCh#kEg=JvG} z>)F$^iK4~P(zaduF{|`cyPUC8a??ReN5)3n|ALebZJR?|FM=3$u~H`iK*xhE7q=81#9!JSDp-zU_37X^zL0(Q{3 zvjp1?#kR+Gru7Pg;z9FCS6kyd#SQlk9?19X>CT#i7TX!;nO$Z3!j+7T zU>RGWW{Yq|hSfoOdVP0{#yLStcX_iSP};@f(K!F4mEdxgtSG$ySUjxkT)0*eh4&b| zUnuT}qg+}^4Blh$e!jR{**Q@wiN$*y-p|dw0#6CDSIs%AmBh&zTO>D~iIr2g$T*^; zZK`RtVCR#WTj)xTo3u>(C~sUvTD37XX4i*7A;DRa*g{Diek`MI-Z9!NOl@*xG+}eB zRB}^n5%gS3$9+h6EITW}FApbjZlP+>QvVP9F!~auQuzmwH!4nZQ0M{ql5A;6^p2dgodz?~Yn|_i+$mO`|~)iRty4co~&?sxHxI?25sgu@yc%^n1&N`&U_ zga%2KMf|AOkJQHJ-@J~dU40I=gP;hq$+FVtEI8~Gwo!A@syDqwv_(gge5_ANt%Em~ ztbI+o#Tsae-^yOaj`nT^f;iE+3hL2d97_&uuxc#cP>`145^BoY+UK71FGnUt`%+2W zff%`%?(0(5(co6Iz50xGlJ^_n7-E6XaYtG^=4h-p?$%WJUT#mV^+w#9hB2;Zs~4K? z(wO!vY56*I4390~XskcWtFxqR8u@DP{9DrQ4QZ2FBc&d?+RfTsO+q9ED9kmGs>h_tujLwlY%g$~c90Q#20>UG z@DyX0R^p^8$cawYdV;uoQ&M>zX1ad_yqDmN6v9e6GLfFZA!8zZcugj9 znlq6fy6N{PS~JFFf;K!jw3KOQ%02W*92A1n9L}m4XN9DdyU{gxFRvt5!FA}+IsB)6 z^ICGdwVkE@pfj{zZfnwyCR%%D{#zxCxz1|;_e%KNzg@z>KGv(%J3P+V%OHfX0i^tk z2*J5MoTaL9c;$1NGZvT6#L<*;e~*Q$BNet_u){BE4qFUA5W3BqWGm<~R%Oi4>CLRb z1Kx=`V;PHt<6xmQ`!IBZ*{2Z;0YB|b7paF<5P9Tm6nojswG(Mp`~~^~jiiC;C0l~p ziQS6LPvl`L#n**W^F}0_(-?)E&ASR!X;u@o4wn9hji_WpRH5|49y~PT;WvQI+Js;H zzrPuP_4vP2TD$2Rd`DSxzCs(D_u*lS6@MBN@aH7{v~EHjvzn4z3+ z?bpFnXbGy7)EFy-W-K&{rztp;wiEnU$=C#Dw?J~+;oRrx{1HulOa@GGgqXl?H)ww) zVs-gr7wn^{&L_hL5I?N@E59UX5ygg-yIlISNmhG$HFnfIw?+Ko?7Eg@?LJ&4chcJ+ z#qMRrM4_0CkkPyqo7j|Otsn|S^$~WoV?CP0nG2FO>5gRU^-&_S(+XXGce*uBg-EhN z$1p@vs6-;)F5;DRAga8P@6QHh68ujfmB!-$aArCBj+k4t=J52lW6Oo<(WUg&)0wpp zdv!Qt=8MIqlK_`%@C(7my;}8C$>5#rm=yGmCUW=DcCmQ{=^0-+$Mt&vmL1jT}!u}1Qy#4@=6b5Sg5f7s=LWQZH#jk6=ItZhrJ9pQx^Rob`U z+nE9J;E=|CC#zgOkYffyUw)?`fHdnkRD*0156BQpUS8$j5^5nP5)3D=Bql22AS#}N z#mW#B17R$~WE_li=`uSK?9f`_*_5ehXGmtGP}u5NAhtEmFzBej6m6H%N39k*!$_~4 zd9@&-1ZjTGWjVqc=A0^fBJ2nm%;L-OW5YN#ENfp#D6oT1_6wR!39?;A3$QLge{EB~@Xo_^`84&66DwRmrp`8rKbnp#Q z4cSl(_x5K)0riIug;S_^VlkfNnF6&5I>&A(8&YK*urZL1QId;t3L6V-Uj#h2Ym5_= zJB<^RkmpI*@IOvy2dY(>uh{X)&*Z&s9c;5nxhmI2eFIZ(TiOjuaqvJV~C7bIG*Pw5T!CQky> z1PEEOhE)@ev$gYC-6Wi$S?v(o^n>Z*wOzFH5czaEw2czu{9`Ri{;QJ~U_d;1*zfzL zxgqrvlCER9qkegANc@B(x=-7aha+~sv~DKt@ATxwYI|6pkJcOoBWqH;$`H1CPy~eT zqkeWcDQor|A|7+7W&v~ACqXZb+(BCVmQaEJXWG8Iyuj~8M2yp25K|9j;(oeI1->H9 z{t~kOAtv@`#qT^86(aO!uLWq+Q-a5{*(qZqyyR)5bmM1_!MQe`7eKuBLj*rj;m zn2ya(W;lei3(m1gEoC4Kf4_31&WQAkX!rc`LS!Fmh|~W;~CbCC{B8 zQ(gy%JW$84LFOA+@qEDlN$Hr>j4DEkHzoKVSOrnAYk+fL7S$Y#bqICBMd%gb5Lf1* z>YcptvaOk)yq2<$VHqXcPV&A;BWs~Q%Ch%uWj2k+B|PnwFN4($kM( z!_yPZlp;PPv^qeK_SX0zP*h*6wDJpL3s^ftARWN}daMm-`jw1=aqj zjY4>uQCKh|o-*nM8@hbGfof6zzuVn#)O$f26@_|Z5NL)N*eEcte_n5(TGanPMRO$T zJ+F<5LA|ka=Xpk9o%1;#T0a}wLm1g_FtXobfWc2m+dvoz934fKG}5%@bD{of46Kia z+8Z&9#u7nFNXd`|#3ng}kwwf2;*CBG#tera87)Rf0Mp|VeVmTpu?PN zvXv8f)x+D82)2WggPB5oBbG~ym$O(bGJd2-uv9#rB3rLLf|f{lBM!C&>ld>A8fzl; zi@>7j03N=MqGaEK@qy|7cdH|^EMZwe;^cm%ma7CXocmdn>zvF6Y2Wm4_{u_X3!G_AD z`_cR#u#ozpMQ<5k?W(f18Y_on062ZH9AmL2{Ws+V*I{THmWgvtk`$nF)fmL8tB#dv zIp+S!a%=+3_8yh5$B6aN@&fCzl^`fTJV_9B2J?!-S^;4}Nq9%;zye%^8(@*6kJL$7XjTLYJWT~C!aA6TnJv+_LwhvJe;j**6{g{G zG0gN3SjO52h*Yr)Y#1=HG9nwMRNf9lXb00}V3~+1%9e@Dj>Lw{y%@#QfjNN|eK4HC zXoe2>Xb9P&W+%EqV@Vyv|HITR;ItNv--!PQN7AZ>dLgvo6-P7<6N3R)VFQP9NTg$c z5$-^MX^l8dwT93Zd)cB=^T)CJv-J0-TdzvRGI$=WLkUN zY&c!Lg`Fo)qCH@F^$2B0(GiSDC0O)Vq#82|AUZ*#gh)>-H{r;R9-Rh*#0ca?@4XIe zTnz4#dJz5>UD%nUz@`O@?3?QQ2b7?8|2=Hy32PGXBmt@9&*&>Re1@gAk-Noqtv>Z! zTJ>iTPGSCkm`-!DcY>WfD6lq$*8ZuHEzYaPg(;~mlyMtYNSR9NzO-uj6PCGw+#t*y z-=D7#>z-hZJuoBLq6tQ0@N4KA@RT4O1D+BxEXHw&D*{)EY}ip)3iYQ+B6yPNSjGHI zAx4VTKt`~E|2*xtXcvzB!bD9|pA9H$n95qlP48vR?S3KX|8=?Km!!Uc!812|{)P05 zVT13OUcIC}msBthmgiuGfO%d%!|n5v*|ypm^c-Z>LSZL`uZ(?!zhDs^FwE12DGdQS z592%{od(SF4(|k&?DK2rDt0pR+p(@lWXoJe**V&t|M9H+`AG>GADomoTskYcsYmmt zp-nhmL0e!Yd{2V*6m@y9wg0bvt~1n^#=V$}{q4?zc6I{BS@XRGTebSjgRR}KCeC3@ zK5&Xn_+JM`(x`V$v-arDEB-J4y(r)^6?YzDy-uGx*eZ?rnc7`cd$?J<{4uQzc=i9x z{H1$_Sna0ai=E2qX!yb@tH1cYE!fC{1rZjwRiHViR^wj`c@U(21NbGmLjm{+Jbe&L z1V;$V=ab{Jw#DBF+gUI@RycG5zPvvgoTI7L{-^N(iHP-qw}dDMj>tH82HlGYN^-Rs zGz9kd6fGBgkj2h|bz~J~SDsh!yozCM2`z&PARW%t<|uEc{8ITY%!5Ggt$0?!0eJzu zT7!s<17Iw3fQYH`w`f16pq5qsS3EO@6KDY64(0n&!O~b6KJ1S2225rYU(ZSyzYj+O z(EzM|9Ntla|2i-p+T9Pl*YD~09&POY2jBy+-lFudiOM+n<-ft-@jaU`8v?%wqkibS zrLA3m>(|y9_Dvv|1tt8*wfjm;SRCAPc?UGUWE{DE^GWzdq^DbNuD8Enbj3rzp!ur@l5J>Z@hz@RsB*jzJ2K6 zs&~i_%Z%)s=A#D5fm_Ys6bM!uMlwKJr0D&ITHg_t>P%Sdl?JvBgFCS*TRhXsk9%fBYmySW9P{@mnF2#WgS(lvN>+YY%y7bpH zs#mFF_4-eOxLCt(?zhuuSZyV1*gBqos1Lr3)PJ<#$S$`jwCR)qKmWiStG3J>J($Zz@22=31Y$4v-}?MV;MWyP$}`h z8JYupx?I@f55Fx*=KBxP+Gf}pX~P-@$>T8d9-|#;1fG^EPtg}yI0!v9HV8O_a6q(f z0}SWf5LXAfP_C2;6B5ZN4l(!sp%vI$jxB| z5Qlx}*XidI`@8rd$CQuoTUydNLMmU1CmwB@_P0myVZo*q{m7L9;eaXGtX_sv$*ijrO4p<++hdvJ5K^9ZO ziBr`39du_)9CqI@9n%BTQJyN_Q@1Jt?YQ)-f63Erj1vS#9xZc{%l>SLFFJvlp9236 zl@3dl^rF^6{=+FB@xff4PH#-Jh2<9PMzdkNjzGHJ26a$l6-<7`(*;SR5RS!>+yHkm zoDFFLiW3nwB`blBhD6{yq~SLdQHX*4sOX4ib|O+m-~=LNPTsDlJ;%XDy%MozT3Li8 zO4UD&5Qt-iIQJHV)*tzlcEli0cjNzBa*6;_P&07CRun9p7^@R-9A;|K&N^&$a0Xz} z$|7oTlQXn-xOGOvQj8M70|8;8WYty&Tsv$i?^^#Wn3jyYg`jL)Dtb>C1By;!<~UMu z+7TGTpZtD6SzkgOd5{8a@x=v%Hik3c3rVti)06_zQWUt?<7oZ&uq4DOU^37=fNqa^ ztpXMnODF|C6CKGrfvp@*%q~w}0$Lm+@ad=|BaF<-4VX&n1EH!=D#nU70+JeAfqq1B znudZ9h3Ohk9vu5zs3*Bu>6u6PJsU`JV6-P&cJCS?6-1t31IIS)P9IwD4FA!pfpDT-X*pBit;~c{A#{G2Q zf}Qb9kZpU|;n^=0ZK!`RyAy{5N(jnJXzOz}o!tW^+JA%7fWUPx!WY~NgN%xiAW1!YJV=n?*EFdemULM!0##ws^aD*FY{Z(u%o5ed7 z&Eju^>qMcRaGQ0V@Sxsun>9Z5Onp>X=&bfHENwF^tsOo~diUF{S+?EK10Yjo)ax^D zw>~fQ*3aB-9ogj`_}F(y{i!~7y!B5}Sy-w;BHvl{!+2|VL3mcbYN9pyULR89>lUaO z<);yD<(U6{%m6OnQTB$~DB>!n=qFy|w?DzT%7Vv@;44FFX@%>46gmA<@CWiPiOai; zTK$EI5LG$js)pQQJuF)8%BiwXu|6AR*}c9B+rmwP_2jz{i5KtJD`r@4vD`9NZx!P1L&pUKK;`oYpvzET>Yv0tgl(i{)UfJi}Zo_TOYA6#fyLMj5gdG zMSRfT_5J|f(1$w-xMoJx#`~?Yg5^Y!{`CXae#z6{;kfqCFNAjE?G%ak)*}$arH{pk z2yXt7o-)(=fbfyNWTrJu-GLi4%yVX13OGGoFBj==|3@TZl^5clxsGMw(NmnBIr+Fi z!E<{eT-3-f%~ISI_ss#9DU+xAUw?>-bEBzri3Ht4_s9d0VV?1c!6fA@31$VAryc^M z9^TU^lqvq{4aHaDnmbT*1J=C={(;-!0>y89FfuIIAYMUNR3KH3?-@+>3R01p*rCBv z;O(an7;+a%p7{!OjSKQX2 z(eAhJ5KdLlr7&e{k|z82%+{p`tqDU2;?$u0M-e8kQan$&@dc}fxmTub^*xQ=Gbxu+ z=Uh-bjY=uTr^TN;uf28w%j#iQYDiA+@8~8DEJ=K~Jfv4VXjLr_*65udvL;!Y=jnqU zvL;_qGA}aBKOOW42dbAJvJSL7k)&^V$eJPiUB6H9{Nd$zToWh~ujf=v*~y#zEMRhH2uA&Aq@F6iA0R+Elz zbpHn)2jY>g62T+LpzK}#nB;pC$Fy<$8PqfI0sZ0}>%?>_1mohNjQC}_q{_vVBL^2= zMxlfx-?V{|R1*wgyfR;1XWjF#bQYWn}m?wehbX4k&UlbH9u^9 z&?0=G=R9J)@jmt zG}g4x`kYMwp95(O1ePZvV8KTit#*GhR$fczStm!#1gF$z&$Et7d+KgX>*9A=t6lIcNP#OT>UMhckMvthtk>YC zGJN!HE}+J;8zosPgFNr|JWVZTX+WXFK%uX&lp;?>T^Wl;fR7Zf0I_7>*=F=%0=_ar zrh69XqC2NoXKkMrlE3xS!d@o-z~yJHD?|8+adAWuUCg3iD6wK!+lwerd5>DJE8Oui zW6wpz@BR1Z0XJqbZ z-au$3=_Kb;u(^?>c*1kFExx*$dh?^!Uw3=+Zwz@9?MHEen4FUPHHN{ZAL#=gvt9=b z;v?l&d^_$XG_u=Zg6R!hPW3G0xD2EQLi+-te`R^BtZ0@AGe;_)3vt4!VIVNc@VAtY zJx?AiethefOmTC1tgZDS_%pBG$TF_(b!wY&y%lb!bHcO2Nv>`i(2pD(qtEv&R4~k* zrA|hk#l?EUl4GtmSAs**)cc-(QK=%hqIZ z`Dg&BKHcp&Uf}HX9kj9LV}l#-N}JPWW`-zcDR~A9Z?{QvZ0asC;vbSWaVj?hOu4 z3PvU+ZL8|reGes_f+>m`&<=(xHY!s2auWK{jQ07!yce3dbqiM|SPoof;-7`&R8;Fn z9fT&Iu^6FMoSSTRdU~Lu;(1c#!l?#VTSz<*Tx}7*F=;7rHSl82)MEM&D;S;S@{9+& zWdp=0nqnxW`?{k|ILXGxE%|%|X5j=ou25?7MckuDKViK=o%R;PVexRMXDM%j)v09% zFn5=MIo~@|O{5w4>df&4RM|nqUIwS88|aA#X8dy*>6T((P%+2SG@h_^8zJS`MU`lq zCE(K7x9v^V9ws`@qN5*I;}5&z$v0{yiZL#gK20DpxpUBs9E1xN2{#&gI2(JqL!8j= zz?v4oW`~PU4$_9bZSW$Hfgi=Rg44Xj9)4pUiWPLz=EUrxU<_JZC<>wvd@lTfCF*uRytZ zfG+2i9^J_*osC5OSzjJ50&oGeJE!I$L?K%X{dhZl4(Wi(>RFD5OOWhY>ZsHJZ&^d%f0x6^41kQs=*JUZ#4_@G z5NY}^hS`h0=dtgL$ry#V+xc4*e{=CSa=rs>B!5d_Z)vc{g zkB8{eH*P8tfN-7o#qG$+6WSnO;MfwXf`+oZ|Hs;!fJJd^edBb)Fg+t<6BWg{;Tlj; zh+>=w%IKgoFr&DGOX8B4#4K*0#u!H(5If@}n46@M+~g*?H~YRiY8C+_i$+CA;*!lh z-J-du5pm`Fo$49H-1~m-_dNeUk4{&e+N(~TI_K1>suwo1*6WOMtv>`S8N!-#B1>Io z{L~ZVLGp6tO+`BYfmh29;aMpnb%5RAKZ?xg;|P`+Ts zn6*y@c@mzJyon)~t}U689yCK$&XiCM)V3#?ugEyaJRFVoUc;kDDXg-{Xv0!&UT?e? zpM~p<2@iz7sZZO{w2)KRDd7%fR5Kq!3L7lAMD$cgE=^tiv1pwSxkX>qF?DBQ>c%77 zg50XkW?c4e;Jaj z|7l1TxNi)}Ts@!v7?PVGvW;i2&X)#w>~g|OT$v2V>)cWn41+`2?^bp=^p~n#zCmtW z3S6+1Sbg8!f8iSN`T@|59)ZMapM!^H`{QM;zGawF%L!nk<-Y{JmBb9#B%E%46ta6ckAqt4sq{zq)X9+s5%xn|O?yv`qp1(7Fe=o=*^S7j)Nec5rWbhWXw z2U*9d$H5u%*$&C$Dpk|3-xh<(ir3kcGOn9epB!%>F1+AJ%ENo|s!ErAx=R3R4z;CJ~q@Q!gQr<@=yATr}Iv9J|PH|Z8Uh%R)B-T{-HM&%Za zL>W19Blxh%{kPMAX}2PrSWw?YsEa{p4yqf8;iI*`;OMh$3$ajmBB^8-&0@ULSOf>i!PM!Xs~dRl zQ6EtEQirO$$6?wucb`Y^zf0=HDX6RU3Rw{syi9BuDz_b6CUt1xvjCuw_mLiU32);= z%-$>qxc!BAH#u#^Qxcv_j{dw?F*?o#4*p| z`m6McCKl70Cy{|&j^4lHh?4^3E(Nd}DKDIp zb5%sl-37;=xWp!xpw|#3_W)&jgk0Z}YYzfv9HpO~h@aC4SI%~rh{b;oSKs68HLr1k z=Oc8^JbA!5{i#4M79q-jee${(*q$I=|5A;_-;81RMq!H<3>2Lyqj?&qyCcZmju|hSCIj#KeKWv?6(GJ%i3w3 z5J_*KJfKuw7YXk?O!)y7$ly*rg9;>k9SMV26Pg;pe>cel2qk<+D4`a7GzrvyU=kq) zW{Wxsyt>vAwRHKGNTB>KWsqFBg1E{XQrIl@mlruHplRcoB^Qtld9y5W6H{^m*|(6y zW~uEk;e*n0aMF=ZOfEP?wQ3fYXMs<79DK@2H!X^TcuZ7=7NDT4ak>$*hVL@p?Ou(v z)TKL?n$d+jv@4k3#c-8qbP-FChk?ITd#!~Zh*72$1EBLPgeWCiNwdFMcxh1u?a>>; z4Q>Y2&ZA#EA>Afb&Z(4ZU{XPD&Z<`-GV6TRNkl^{v{V}JW~D_?6^VN+l|6DnYv5`N zxksLkehbPyDtfnt-1Fx&9wZl#VUfe{v9$Y{3Jl3VQ(&6|db0Ny0%k$*u?+r=oLtIz zfJ6Vb8U4jYA;0A!CHBR{R+0$9g`H=4c3cFy^H-jdq@2A!kuxawa7pMIL3}ZulNCHE zNjq0~q%4wws(DFV%E{LYJ)jpl3xR*rMW)a7lqBqo=XMoYBm$k(rKja6?Jy$=hBQnWf9I_-4KJ8P$x7CJ~Mg3&-6tlB=;0kUHz6vd6hq- zNrB|L_!E+Q5_!7+lzX~xcu?+nD5it%4GKQD=)R!f(@OX0f=`S=_qC9FLXu8THG(=bjGFvbUZx&hngq zk`>52<2+H&!#t=4AovCxUOFBA3bjo4BNVi>j_9if>(KZe>O0L5NAid-G)JW3e4$Wz z-5_vLJjSwMjQYB6yr}y;p(J(x(({}WiUG17-Fs*e>YgD_{f`lX9` zp1p!8U=@o}+Xq7r$VE?L72`0mIR>xx`M>GyJ0P!}lvZsEV|lnk;ZtBaaftkgqKPCVkfcJqmfJi@0 zz1NFb<}=1lF-6Tm5AY=iL3zb&1qDqF1|87;xW-eJtM+2{?lX{g`h-&H&F!FjsY8Aa z6?kibj=09LTNuvvJ`#m>qNza;95}dA zD1)Nmu2t-hW=F5S9EYcVK~7d*mgE9lCI%6V-W{=R#*Z$uZHYr4!F-uMP3otOP!U7c z;HwhkA^PG?SEWpi$MddE+B!&=AaO$;FpOR;;ZgR{qQ}PbNUj10-^lNQA=R@lyEFXt za3=Y(WATZHnFn&tL5>iY;?x5qW5cx&tPS2^^5Zn{PpMhHpVTTj}v=7tAPfsQF|k zluftol%A07N|+s&e8l=}II!~@Owa9Tkt<<`E#VMdWP=-p6H09f*mF6AMCmRvrkK=g z7E~X^YSSO`P+uL6on^?9E<5U!jg_CIT#5kWl~VWI5_KD>p#y^2LSJS(@W)RcM3`eP z?z<)FZI&kk$DwhAh)&t0JC$1M)NG~k;sL4(?&iUz5jNplI5HHRSSYs%r}6&ADE~t# zv<(a42HHo5a$wc`(EZ_DEWXAE{uzEr5kH>3lE!Uc=_MQ(85h0uwhX1rR(csHh^Dsl zEWH&Kof_+yTSdES;Zt!X)}|=)dMU$~6^$b%f^g0zG@>UC+O1V9zq0wV@D|jJUfEtW zKoBm_Mc^*nZf`{g$s6Wl7Ex1kTJ#aROPgWViq{rXka z>eJ{@o=GS~%^pDzJ(|nEq1Ssz?1J1zWQG(#?@(r6q6`NtSr$_N>rCJ!wE;k&Ee!|h z4emqM6if-Y65_qE;XH(EAt*c5fD}6V)}hZ_!@dg6CZKv=8?=SSCtYpgvJYG=?nRg> z>vBhiZ)$X~lXot?Jww@HE4_w3UeInStkgbQfS0{-jw4|wb@SXa?(hY1qhN^?6Q*}H zDQN!M+aGeOjLZvAGg58nmC<^DtROym#DO{%R(bMsxGZ^Ngp&#Hn@9PFrQI|9ZkSG1 zWhCrFRmQ=btI8cdjt{lze;DddwF{uF&26$<_bnNb;ai4WgYCMoWFWtg-Fqrk$Vm7D zEkoAJkTsgu;0|9#&5LRuYTasT!GE;yHEkn1{&! zlo;fLr1iJRjZuhGvmvO)^bhmc1FU1X84k1ogG0nkd{ zXk5Ski^I1x4k{5_!Y{CJ#tjVB(3^nT$e7Fb`(EN#g^k4hg0xwi3?c|p`Q&rJd>G+l zf{@mM{#>}e-Lo1F2OL=P!<2tt{0+{RxDzIA*OkjSg=F)mw#C$X2q7f?0RE#b;fGQF z)c$~M;K?s?EPyE}MZmnrc6d5`6bPqFe)4DVI9M&R0l>-{L@Q*P?jZsO`gK3eQbH687+py2oeY-)jb4qs$xIW-N*UR4 z3pnaZmt%(GmRQ`u

      `Yhpgyk9y}3(BzVdYAE&jOQ>uW$a+MbX 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 K68-+zV);)*9<>Aj delta 421962 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 z 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�j>Cn0T7; zb;ezchZw(NJjVDNW8>#!2ATt_(ayV^b$6gqwh=b8-c2#uc?)^_i_KPj#L&iNGz)uI zh}^FHq}(|Fer<9y@1v4v{gouT*nX5m+hg4J;2%o?Y?;obZ8DvMjO6`VVP+UgwDx*C?VWo~Jc?H()VJTttAvK$OXEd27%I3AS`{j# zfe+Gnj@b5zl~)Ok9ZloezUp(uqaC0G@c{&owV{Qp`p4o-Y)Wwspkwi zWRfK@rJ?R4_B38a;4tx~x{qX8`G$lxP2)M7s%CzxLZvj3oyN0=a2qSHiZswJjc0pL zN9O7LH`RT#GxL5{sFWtUSUsq^Pjt2NDxu--X*@^l>TTs!LSucbykFJ5&t+Dm>b|PK zl~)Ok4M^iT;@BW7uM!#>lEzDWObp~(6)L6Sk!ifj*%%XVs(W9dl~)N3j7#G=oT?(? zasJ7^c@P#r$zS*~s|VFVdA(L%CDb!JjpqpTV#TB1H`RUkIuq|Vo%hialY)2-D0+jH zR|yR)OygC~mRfn0Q19|I9`@A#*b+CJ6{)&+t+Mi}NWJQ;p(`5t36)UqYOB3UsJqq*ZUE@ydRel~)O^+MUL;z2Cjh ztVq>;;5{p^iZpy6jpu;E?^}75P|u+>p6#Qb2;MITmS{vOrGZba9#q}yUzm7P-FsqI zz9FGsr|~M{Z_T_vRrita%?j}B!CPnLRYE<#rSWX9pHcieOWlVv0&=K_@gKDbkx;7t zs69=gQkrSyRgnhHO5@o+rdfHF&`^ssp6#8j19GZ_Mx^HJy|=B|1I}-1p!kK_rSTk4 zsDqVP33Yc$x)|lQ#rT#@JLTM;OD5cQOVUD;PISt+v0Qb+-E> zBiD#lvxm{mWO%el!#8_A$K6mqP z45E)oL)#M)-J4g_ExG^cNisoIjG;!ii3Eok$4!xX52LS})XU`BY!6SD`ezv<{jK`Q zP$@?ls~BSv{Wg8LG)S-_%ow>!RzZ&$GJ-ygZnjqm2>e;!utizWcx7d;XEH zZuW|n+uX0pqzV@1q^UA_Esa-YvNetOamwCI<5iJF()f_H_uF=*DWV+EzJJ3XNaIxo zqG`O!z(;Ak%D^Xr{}+||d71~6gIF5RIk0_~#;Xj({|*16nWw9S%0a@cz_H4~uW7u> z!KpOf$0hfB8m}@y3;Hcp4Excrwb70}W`)W@*1zGKr|}uaTV;6j18?T&_I)jkyCT}m zma#VLMCU-^i(igm-=TfEX{WZN!{9*|4jwvt;K0H2h76fIVDLPbZEDHFxr>%9u~k>@ z)aGEJ>1&B(^(+6+od5r7fA|isw3KIVVmoDss-5wP3;QS#xeMdcLbYZM^@kc72DD zi^>+vU3hM(bI#)8S*69!8%vfKFLo|i1f%BfYR+yVpi#w3d(5>JE?hcmK?wq*u$^;@ zmzK;ab{38@eET(LhRvwluPwQId82klq(;j$GT+la?{2$V<}1vXhX7+_y5wU(OxNXA zI}d2S46HMkOP;B>M*|m*vKl*+;(0JYv@K>U6D^$Vi6=kwbDDU%qNrcMp0X!i*@rR& z?-$dH*a@xS7s^a|AYOU!HcIgnx%xTJvhvEl%E5df6$bfnH!<_*iIj&>R!U*caj2=4 zSN2g;K;|5~ny2i|Id(To@eLWKp3t3RRj3H`>=bX#aa6bR%HFFIk&Ng!$N7^(fM7yvVUw@#r z65pXxVLIEhNx+)Psyr*N>}@9AoJU*dl)X8R?oKJ5^C-&57VctIs0gY|0hu#d)iq^r z&SSut;?1?{>2Bp!__1z&R-l>`i9)pb&av`J7wM7WEjjLK<(0kj+!SxFRsB5X{fOAy zkfWx6%sGzsP6cGnvHScKZ_csTW#v_ZynUGu$qdW#M~?OWRz-t{3sbx~$Ke51UfD-X z;h1w=H7I3o%CO(&8<_1`k3Z zd2^0q?o>eLR_!wJ<{Sq`r0h*OwuSOjeB*}lM->D{nG}#!g1jSByd}qDt-P`ijb@(f z7(t1jv(USLJK8t<|rqjGAmE^B8O=_l`>@{ zy3}ls`X>*haGDgVhzRxNDGwy82)xUzJXA7*6;@t_A2EfaO4Ls0U*wjQ2U4gA0ykTE z6+w8Fl~)l&SEhJX1(e{xYAdh8kKp1b&VMRW<$)4Vwf2u5h}X+gys9#aAXH)HRRr$! zRvxCJg!DTbcsWK@IS2(=5lGcLMG)R-BPkE&I@X`G@+yL=$F01IApD$_R~c|VEqRQ4s1!u| z6Gh~H(V}Q5qN*3Hyo$j0l9g8xL`>mO$>T@aL zUt4+dAR_qI%Bu`SP2rFo{V2TH-%|F(tMCKg5s%YTM~;;T!dU!|9*9qTpW@AR9ILhR zDuP6fl}8XF9z9{=se4d4@cxuinCsZ~tCd#~gpXT!6+yVp%B%1b|71Rts$xGCk@I(} zLPZez&C06?yr-?ailE9A4uwlU!m2YVdy-Z7iPL<0pd&@f0~NK`wp5;$%&Q2z$y7k9 z%E+J3p0X!iMWAO`d8kAc1RRR*F9{VvppjCfPD_d)kY(bHYhvg)RTH52BF#-|$SOEn z(-d#6(XejiReC)+Rvtl#^t#(vdDzR2Gt^QloPku8QhKY}S$P$KD~(qX#M=MSo-*b# z@v4Fd^^X3O2O?Ai-VRn?MG(ld@?=jDggd5qlIcg`xjI{U6~5ky`Rf8Q0P;W{L(V^X z5CL{c@v6#1PR_RSDgtj;D{nIneWSI?Xl&g0jp=GhAw+wnEU9u;2+?z`JX9iuk-k=5 z6@mAB=1r$1g&%WSdD#0!*?7_vDgx()fAAn8_Vr8gBJ1!#=<9FgRR*d|;V645N`0WJ z^t98`IUp5~xe{#`S$P#fWT2H-8Hf(C@~VVvgPHduVsj;ihNV0ZuOf&Jwel*0fZNJ9 zL~u!pH=n1jQC41DEvZNn`BsIBAW~@MRRsDN=2u(KQ+JV-R~ZP8xAGjm-xix-Rj3GJ zrhrtP5qd96*^{gy2u!r{Dg)8Wt-K1~=^-9hE9dIec_$*cGUb8lUPTbP!pf@%Y}2j0 ziXbvM#ha^GzsAI?tEGteDwBdj$Bz;an`7lw1p2ip-dx9l5-YDV5G%Iw6h3_)(iUE9 zRj3GD3z#>}*ib_CrB+@=;3>266aj^wSZ3u__|c`jl#eD###W>}kgOtzEVuGx zFG^^ol~)lYZcg!JM?VVB6;M3NpA;&B#H~spdGbK|sLMPR!v#hdFm`X?)|!Vj&t z^0w0J-ROF8)RpIWZ!E_Pcx+Wz1|?NCNY$fQRz7UTwB;6AoCY( zkY$3L)k;sdG-#|TSr|CCHt0o!;RabI$hl4FWrC_wG7^OPcWrMlpcL7nEbBbS=X*oy zAqPkwdRxgdLAIR@vPh6OC5r?_8f2Lu*E`A{38M4ADn*DQa_?#|5DAJYnM)|JoAm*i zAn&_M7V+Cc2O4BSBvP_SkoTa{I|CHIEs`RHf&2Xi1CgLeN)`$7e875LR#_q?2PiyW zROw}c5-C~eJ%<|fbp1mD8VD|;!^%L`StKQk1bIGe(2E2mlpK-?3Vp=-kSrnnVmJ+aQYs=-(+>mQW}qiv%T7vPh8kZ*0#c6lK}(?&772>| z+8_%9-^m79B*=D3$udEKlq~cKA*1~}SJUMOJzpJr*eDYeNy#EYZ@tpX1lfLTkcB>+ zl7)f$_XfR)FxDV*f=)x<1ra+p$~v_18Vksx$O4eDh{!eXc zugME6#Q0>u-O8`a0c8u zxH7oeaF@YFulc{~{Qok*w-8CitY4G&!95MP4Q@Z&r*JiJ%i*%T|2JH>|2dFT*P;~M zC$wHh{p6Mds!yHJ+BM$jYF4eE*0QsVeh$5(;c@6&4Oe5`HOTA#HED-?6poIaa1lOE z07HRalbhjmI2W7;&KIcO)L7r2nHPHK*W>`WSr4Opf#jSx_5clUGu?+JJO`WU=QLhk zvd~vnYD{jfUri0fCRPYJv2tk999kf>#5ZeBv9olMbK#;=8-81M-iGvx3G7e+RXB^8ofpIG1Y{o^5w=&+wSiu-#Z0UYa~pLgzc zi?D2}c=6EdTzy@=7ZlGcT~b;y=Z2xP`&p!m3};7uNK<7zdl0rO*E<=DI_lm0vj+5D zK6JLL_llvj`}ellWU2R_)_;)8Idaj$(#4AwEGS;wdzJ`tHvaqdrj=V*wAXvC4=eQ+ zg2E9+J#_YkI9gmX|2iD@$6=X|0-j%1GPf9317!Ld5;0iF#^E-4u6@=3;{qfmV~CO6 zR?oA~8fe_qQEz4VI_OQV6Y1-BAtkUMrO^DV+Ad4=J}$kgx23%AFA_hAFz%3;*eTJr zOQOD8VqlMW*SOl5r@I?(Ia{yJG(I?2f2MPzxO4;xXhhk(dBw(0=j)SEGJ32ljUMarNc@>PLp_ z^D-Jiu73Su{rn8$vXOe%jjqP$`@WX>OfU}qM#`rcl^puE+<0T8-oprt(zh6~k@_^8 zy%&wr$GGM%xT1L0Tn|?9Em(q5nZE$pn^ZQt@Wxs5i!U4{nEW}VB}TOzo;yjVum3Jcf9q?DU%&sSro5tz48_$o^51q~V{~BMv&T5bQ zm)1-Kmb&@KW(3CTPJe8`iDUxKHSk1oHk=p7VK`;w3Szr<{Q74|#*24MG);oW;=%+RW@EeC3_{Cz-pkJZ%zgqSER08S7jeh?meRZ2F^)1c)Pi#Gze0ST) z1zWZcy7#tB_?>d<*f}`Uc;OFlkFu0X)O5P3IC-$C9 zegszvM{*|c9{8c-6~MW0ZTBG~;C}_T25$1CKKYYI78cqD4<0zAPd{7Xq|5pY9&GHN zr62Lf`0Z@20o$*?%Mw)bX_i$1W}cRMC2K6J_gYr6y^>qAK2sFG&DOyx`)ysBkSD6m z)+k~8bJm=pk41B#MItNR1^|@6{Fy*;=GSN$7lrems zFv#;C7+9Bl5$=AtHE@gIu7Vp4=YsqDAmBxH$$@Z>;n)pa0dxXAz~MvclBWjOCEtV# zz>R{-f;#|x2=3OQb;&4P3~mHm0ykUJsY?!-QI~xAs=8#a>2=A9sddR8Cf6nF zya4-Jp-~f15ydj-xn$HlPmYgsVD+EE4_#d$0L};JB^kO1u>1sy5H184 zhO2^$zXTl$9&j!=H=GCV9q4?(sJ%XU!CCdmI~&(0|KX@lUJmziW__{++)a)A z^~u+o)h8S2^~vkB`sBeJ7{lF}4ddo8hI6*BPwH?UI5(V^yt*;`s7p2`sCg&^~oW#URs}g?-C>oZrO0;dR%>SAeytz0)+f8nsZTbY4bNT#R*J~VkgKIgESz^4ayxjnt55D+i-fPKPkvL55(%M{;5Nfm!A0Pra3k-mzc!g5;VuMtH&O|V!6o2qke6&k z#6a7<$Q_&mPKR^Cx!@j$&I61zlkY7?no0~X#+n%07wYHOZJEY53-!K^gbmwy7#USs zmyNFGnX#^`s8buJ4muf+F4DW$0}mKG7wLWN(Fcv63H7s#Za%$l6W4umFOaj~=UnBd z!LzgaJD)z^X%ub54g36!`sEv4Svhn2&z-aAMqdf;Ij(;ouNCcWB2RdH!>0r>3D0+IQfu1 z+&_2z@5zs@`#l*4b_b4vn+vxb?jE?;;M~xi1dc5EJ(&RNz`p`rz$nlQ{QAb!OnW__|z@q~VXvE>Pr(bJpt@23&w*YPi zToK$bxZZGiaLwU<*G?yYg!>%s0Nk5!&%-?kw-WAlxXa;Yzzv7%4c8p*LHM1&0QbS8 z7cXA4*y!@K-XU}J#K{wkyr=cS-j%K36E3gC>EtzV3*g>_I{^1N+>da-!!>US8@S$Z z!{CbGX27k4dl2qTxXJ(xtv_c}KBIRO<8|YyXY>umfM@mm zre1#aD?Hu!)3f@`8(o>S!Ihyur&k%DJ*RhQJ8E=M{&eyF+Ni=wEsi4rkp!XHtTvrH}ikclkJuNK|cukiFj?WWQlRCT7Q6UT*S|H z&*|i@yH6)q!+CH_7=??$CE#q}bT~Jh^PcLrx9SHojAyp%%Zx51dSk=+hF)MC+Kx%9 z@;CG+jCN1R2ozmR}|k=hS_Yq zD9LX%Vs6tpZ&BI8xi%wzm)<^i*{r3-mz9;$o0XVC>9J&}6Mx1dAK)xM`WJME$-n4b zt2;*Y>+E?$o&P>GW7$sqUG6M~zoXCXG-sBNrldI9CC;*iOUit{MT?P?zBXg#JDA~l z;~jlnlfr4@JCQ0wRPAi<~ znSAB7%|=hmA5k=V6eg?-jnCf0JZqyp`UUwY$U>RmLYmheI<#WN4( zrXJ^%I!jmhiun-qs=JA&q_q&|)?n(7PH{`}B53^?Ujaji|bN9MDHKUpQ;_ z0x`W_=9_D12T>`_59&F_g$MP%#>|8IZAP;X^eYYT2f9joXY?hxJ+h1uM=ZH!YX0h>ss;yxpXG5y!n*ZVvpB{ZullF#eb5 z7m?54Ksq!2wCqgsO}N!?6yOX-Iv!>^PLJ$IQ-YQ5_p($56_-N4R6e+rBLaR7_a;28 zgwxG9H;>FG})OZd(-4_np|a(5r4!&V2MYX>^1EmLWu}GXiab;O%Cyi ztP&jkhWEv0B6hxfP%1>kZwoAtGY`r`WV76kM#$XxJKotD99Hc)+Unst9EKHrFX@`1*e7U&W6NNvr`RqE-*ygVqSW zXIte^d%4pr$7l1lvdXr3X^ni3@ZS)>Ei~QQaa4J&ax|@D3GkLlD#FN(R(p3-Ylht4 zT2I47AF85M{5IFqRu6%+I*+6kaVXE4!$evMhFhlTr&trHUxyMg#cy+FSrZT`w0ekM zZ>U}s%%<Y$#wFrI7tpSGCrpakV?)up3 z-+6>TC8Fxkc8;}CMW3+-=y~2MyWCcL?@6mZyk9O4RN+TES*s*;rQce_uK89uFy1Q1 zJXSd|*D6<~$*y9nK03}SyZrO4ge}d$JK3tQnvf<>Oq0_h45Wqc?QAUpzdJ35fg7zw znpk9&BP*=3bEQ>wEw{?dY+!=Y5nK2Y^{Z3MUpudl5i-}GKZS9tlJbx)}ct^4n=F( z&X$#yITl*WT!fa)u}l&j%e0m`mTAcx%Oq|4zki7Cyk4K@^ZEXMzq|YWzQ5n^p65x= zQ~J%Ci$5EZb?+C+PPNxcW^>I0LauIyim}@5W39F0N{`x!NOa%*fV{I*>o$njJz@28 zwNF_7eC;?_w?0|-X}wVQl~u0(E35eDYWFbHT01VZ)sCx;wc|wH_NlsYxl`@-mAyY3 zfAr3puba|j-8fNq#PN?mEAD!~3dsXMd%|d8rf2QA(xG<7DlMOmKYnMg++BAO)qRqy z&a1r!%6spA4!z(bwJ(^PTl;*)rL~W*Jg{s0$!C^C-4`;keQKXD|4!|=RIME+>Sm<; zx7zio=W55XwV#Z4{m=2_b946JxvhS7v3zuhg?^u2 zJRgmVz3awx?;ojsYS-s_)Q%IokE6>Wc1-OC$$_=wO844v=uU+4!T&v3%5L3!+2J9Z);Y*M0gg58QnULr4y(9hU~xjth0`D<^%r{^Q#r@!5ip zrZ|4;ryG1UPS-!-DYfg9b>qT-+V#29YsZOi?izpm`XN)d1F6)m4L*8(|Ll70xOztI zIGj~Gjt#3F=j*nQf8&$&pS*r3)$L*OwAv>~)IC9Q*AslQf2Fz|P7SVoeBs5K+b*Ox ze>~px`XRlxc7t5qXUX&nwO^!`{#ZLsm1^(%+zYkOms(RhuKeYr@u#mJ!Yj2K#9yl& zCtt4}m)6&g(-+oWwCUE`uhPR2wd*sTqqp=q-}*bKABwm!NDD!VT*j@P|lp>BPy?ga`nc6&mPPmQdd z^29%Duh;5spYcDs2$Q=l@OXbjTYG&~ht+-w5dZWKOFr5El0s{ZLBOZV>AJ{Hj{F zzIu4=_NgOl$FaKg)qmEWlH9JZ%s+X3zi^~>gUXWHar}I<0 z?G7eCxoCI2eu$q`dl4n-F0#tN+9$}JT{}+HT_gFrad@uwB250`qXYWvhcyc8Yd1*M zjmwqV^_8`g=bZJ=*df_?-5-7?j;lSA$TBzAp3CIxwd<1;cKn9Nd9`+&*zeP;f6nLLiS3oG)ZKsOx^o)F z)ZV}Ow`$L6@wVD8-3#+;$GN)oiQ4skD|+1q#jk$4htUCtYTY*{Ea#>%NIgmv=v4S7)*AyR=f>_ax~PYj5|$ zfwkk(-nHXo-M1{U6KdC|2kbWf=@1T~zx7>ALUgl6Bu`huW_hL$PjL{?6`ih%Uv?#vi?YNQ|o8 zAbET3-4(Cq~h&-d}`hjiUnM2VMnzes$^_tV-LDgU{4 zeXQ;q@zl|^+ZSH0-M&)&&;-K1bp>7mds zcYVp|pBmZi^+TcV0mZs;^^MvciY=)f=Xccp&!F@Jwd>Q5){ZmxUsd~mlX7(%BG0Zdxo(^|tZseX3zmDY z)lF%pZk(vQsPf607YOC!YR8GbyN}&}`MPsdsGFix-4utqaiwm`OM`3we$B4G)w=5< z-}Mh1d^C>k|5CTw&t8SPPd3R|?fPWh_Nh<)>7ZRN5c^-<=Zd;<;=iA*|LFZE9%^48 z)=)RDTVL4z*%L%Bn)^@fIQCBMI9a#8@b;(cKYss9?fi7XM+Z@^8>j1@AXWDQ)k(FF z&s1v1u~%!y`L4ST@Z;AHm3?+C_;?b_m)AZZvsdl<{1mE>d1jUDI*H`LxAXE2z@lTKV;{yy|`S|sAy?!Wls@;Lq7wX2H>&Erl z?>eGSosL&wJ*4`ZimXz-__Xd z^~0*Vzr3-&Zd|Dw$H&#}V4-%0TIKpPgwlquZZs2CU;fs5tZiD zj_2eWIwj}C8au`3H|v>tzZuG3?W+y2#dUAlDp_PQObp6_(~6(MYI zelIcR-3g_(-&6-(+xv@?j-9&v`l0)rcj7d zY01Knd+KWw?_4$Rxl?bLVElSC&Q82@*emC(Z2imgor-Oauyx;mUs(49xw`Qg|GRkE zKEGW2jR)3lUi-$#+n>1bj^~%0{^XS>UHg~cy|MnLi9?TWTl?&{A5NV7*yXwRmya1f z?Y@hK|7+2M51x9{_~r|H4mt1kiS3U+uK%jx10OkHZv55kn|D3Az4M|=?wzpz$@gCI zlSgj5=E76nnK1bWd(J;JIsX@5n$$mg(xg(uJ%vtp{qMv@6M;pblZ#fK;V zsKdCsA6a?&J#G7Z{n@rZUDN65cGI7_`^%^P_{vnz?0Yv{)N$pTe;l-Z$o~c{yKw&4 zdry4x_6@&3xcsAz15f?=i|@?nzyJ7Ii{^dh+}9fJJ9*me2OfO<;X_WIc-E3bzMnbl zgu+uVJ@unv&v}>b_2d6e`9o>YBa1&b^5XMXfB5^lQ#7t_1`A&rG4YQR%bgzjZ^#y& z-s9{If2e!F;g`If7{0#a;Kkj4+cf@iRTYpjA6Q0|==11A4=R4hXl#6iEanFyh zTmPG*&w1{zZc~C5b3*p+HA5cw-OZmH^SdjrT^HZ#3738Rgjdx);Er2n9q`|`{@Cf3 z--p=7Wa_TOnJ=ei?smje>$bnTZai&r?&AHfUfU_x?c*7~=HvAje)>j|{>9EC$E>u$ zw+0M6%U>XRdFq{)^xEx>Y1+5@pOxAALZ@4r?ckMvz3+_Y{?g;e<1ZaN^Wq1G9DMq! zBkmuz&uJ6hS=(vGGoe!_fBQD}*v7jOV_xW#-`DoPJ>#v1i{9=UA1*a_iZ#s1wRFnQ ziMMtt$8WrQ&yCs3JnS^@Pv7`j_u>1l{oxz8Uq5i>A6~n6<(O5E%qbQ3NIaZw>s0JE zCvjk>??(S{&1nd!P9eoV-_tM8&;@Su3pBdv7>`14o#u zZ^iwhnrJy6v|k7_qUC(~{=U@KIljZM2Pxt#&0nYBa%2_`h(?{ocD+WZ%`F?+0Kc!3jHqy~@KKC#$uG9Q0WOR|+4)>*mj&T)J zb>y~eAJY}B;De3`VYW{2seTZupi_LIx1q&4!$0twK9=b`|LSNnp^Ln#pa18e%lzkK z`~jk_aPWU~w(7`xpsHj19cp17oT}S>a`sfNDdYqZi3C92=!ekxi{V-K0`0L2&B%gq3I>l#T zhEDT$F-vFoa^!W6AHr;1;(uel4#^N+Jt2ez+CPMDs!w#G8Kn4ESgDJA%t;}v(MdiT z>!NM=GOX7*o`H=z&szqVc3tH^`Gr7Rb%ie&>Y~#b{v$e`WjXg6W~Q?S2{8@bbe>;B zPhI7GzGd2VoQI&VPVqJ9uXDT@NnPZt&UR{|<@}$Eof;j!ZySt`w&8O#PKQo&_P|M| z-5|jeE_Xya!wWGhdH}zQysmQc3R9{hhg(dkj(ow-Tt_;?Kbq@y)p`E?tu9Vo=0$gy zQC;N67n;ShI{Cu@@#SBIu*r%zH{WmSbc~0hb*Me%7tm2x`0NM#|DtF){}G*|<@~*+ zZeyL{chOCU2Sd0Hah>P=A97La1V8bR^WW2;Y|!~(Z?QVgvyspR-gB8#5H07Qp>MRD zzwle9AX?6MBB_gf;Bu!xC-?~r(q;bMBTk{t@bup~H9DUaA3W~1F$hnDa3;p;G(U{- zy2Shc-fg23d=Dn-A|Jle>C;Jm0aJB_FMZNoqjP-D)2=U_<{Q>Hl{(L_Av@ooD$ab? z8&0$lKa2&s#D_oUTF^;eip9}#9=O(fxK8nFSgNc1y|U{-XZSU&h?esy&$}j~?fHJJ z)TQU$|NFn-0x?MN{a6#N;1mDo9ZjeBHLTNBzHXfhN9VcmMYo@h@pY&~%lTbw(&108 z6>QdNega!{nFqY&-EgS)|CIOxwnZ!Wd+Xh=I>U{B4q>N`@u?eK@xyG-JzjA!>ICOr zb#5n%lUOAb(PP|zHUzp()>aL&XgR;P!}(un z5I*!Cf;GCpN9=UIb&_AgMqS}a|8ZV*j<;j04*v~d3bsYd`9+1L;gI>+ao`yI`wjBZHr%JJAuQBMeiBP{nWuMX2&HHnKH_r?VNEvLNF3y!?p?1F-1dJBVY80$ zv7c`U+oNsx+&vt@*>;E@_w%=LUFJS}HiW)9$(xYURlfWS4Pm6t@e!RH!q{jVejO8| zZ8-bqy&8P7FctjUFFFEU;%I-4=Wy@;1#xBE5m=Gqd-rPygQAW2<^3IjuJFm- z8$w2>_@N#RVTLa8`3Klho#DL>YzT{WoZrJT9eOr|r?66&xy`ThTc@L6>v#0Q&i^KZ zrxTxGwQ6eOw>9z!w~0 zr*(#Zb)=crMgH?qW?EOWV#3jmAliuk)6Z1vaEzVlZ>pm{wjuoMI8z<<@eN@vw(A1- zNSf*qt{YyDn6B{j6YR9k^OYx>YMtYAPBPOv%~ua_{s%=X#7zTDb@Tv!=VW`W!zm5n zdxK21&hTER+EE?n2eDX}c=}*dt@C`&H%zro^ACoY>S#INf0~(&w&!C{cK|whx_`Lu zzLcx_+opxjJF_9gb%wt>)Sl`D{|zZ!;~T!;5c=ypKbpP7kr|ZuKNB0mcpWC$ z2s5IM_zRcYQyu50FkhGXtSjuaPV?s{H-w^&@xv(T5*14 zhF`*vXd8a(78kOv@|>T!4s?NEo#Wg`%emoJr&h;qb!2~Pkk0Vmu|ijQPSJ&_3*2XkTT3VTp!@BpPVh=pb(!CJpdswkVQE8n z4xQ7M^U#Ovv`%yO(1-1{L4qG&W@WSyH!OFKb&RiF;T-EcKmMq59BsqDf6O_Kn#Vlu z9P135)b=>yGEz^Z`h`*{Jp2_T-y78Ms!}~7W%H~;-4X=3w+AcK2PfuZ$eL9 zT!pJ@mKbdK*><8IPLzUEo)2hnoww6-Bk)p33svvrlPeLid24f4-BvKQPo zy3Czkbm2u0;4}VYN_CpgTJQ71_cXuvXBVjs8yw}!b}m}Z|Ng5Pjh4UC5U$4{o##C( zc239nNetKJtT^*k=iDI8UwX~7M;q}fOpP|;r~l@{iJB*Gir$zU89)EJPrbUrZ~fi1 zqO1J;X7_!xoZtF~uP37A{QR4yJzCDg-g5pspXY@|Q?()V)-k^M9aE|c{O-TpPC9J! zg~NNMTUYt!54>we+wk-c?S#(r7k1hS9p^i-QWyDK|8afjG{1)Ry80jY|2_Y8^+p@< z@c)_WXd^x+G=`l~b8ACm=s4QW@pl^=Ll>RltNp&EgwF9L&5dC|)O=I>#xPRn`I6Sg zkcpP_du@$jh7KJX!;+4T-oCT0QgOoP8^bayQhal)F_d+Ir|;PqHtRee_Ql2!#<=CU zM;AMx6Z}ggbdmS}a%1QlE$4Me>Ix6-+8BoDG`D=kSjYI*tPi6N3Vc;Jd#ZEXws&L5 zMH}&c`!t4GI>8@efe!oHxwxIydH(i(c3P+To&6ibrf8e5dTe*Is1tni0ga*a`Cf}3 zKd>?M*4eUn;viFJQ06lZHg!79OTN|^Ch8KOkgyXv#ec*CUE%K?))*G+40k@fF)Y<_ zz7r)~<0w0K zq2|Ay=f!k|H;!oxt|8 zxGwXSD;h&uSNXxoUO<<4!xOSAX?6^U+ok`%Q=y23=7A3|BqtF zwT{e+a9v~g_4LM2(M6tqV`GS2WQO>enf6?l`KLFT4PD^Jf6^ExN6Y!Aw|LTMIX`}@ z=Zu!~tlQiLI?q2_;53c54WGNv`5$SJUf3Ak{H+ajm3J&}3@debq%r(rwd*5#0N;hp zy2u}3YqZTXjp3vk_|#O}ff^bTTVC#z$ehPVy); zP3RQTd^I}i9N&)4y1PUrYG%+dvZ60>!g-}-{{UofZ|?9tg2=@=h^qE7HIEYoSuVx`XU zZCIlV{3zDx62Fa&y2|_R<$BU_J{H?_k}tqco!KkfF5G0$nsJW#KE!m9*P@Fq^ZSVF z@WpoF81&Xjz6yPHjvv7QUE&Xsinjlf?J+Xip0C2#XnS6QiP`7@;`lD6E82)BV7AWi z9VqA`zl6oQ!YyAmD>}wUVWm#;7?gE}=U}5Q@Ke~V%lx^nW#-58)E$jITgU z=lDK!(?xy}J#~dUeZ{q+<2(>ao#F`?qBA@PLv?|V=;jX6Nq!6yb%{U3j7z-#hrQc{ zQ!v|#6i+}wXLt@4>Hvfucj!nA2Ph*=d^9Kl*dhEU) zyRY-#(I8=PHoE9E{{Y=}o}WQNm-z!Eb%;B!7^0JWAx7#9--@xiz)xeMF7xO1bBcA0 zPrxjl%8Dy6*C5ABut1mi4HR{izqEh5utLZA46M>=z8ULufuBc3SGdzx+l8&s_Iy0H z>m-jtxXfeuW@K9p3gUTm))n5PyQ^Kt_;~czNuGedI>WbPfG+S;Na-@ahmkt;Xcu~5 ztWNOhn5a`c0aJCRhx`A>2Gb1kd>>}%BEO2+y2|?<;F{10{w@~l4F4F*beUE&YXR|mf^^e_z2NgjoiPVHr8lBCHhp^tD#DB*oUF9$J_Q^)a`FQNqNgjo! zNuG$a=%{miJ38wEKZb6)#IK;cuJHfRTZcnjABQ;qeGC!?!;sWzz7a!op6|nOUF27h z)>S^@Yd#(8B>xtZb%{U3EFBIt?U);F!xvzI&hQ;5>f)hUZ>t6?3@Y3y;nvb|J`d}n z2k;%JL=WIsur=DA|A*~59A>H!E_X0I3>|fv??D$`ux6<^y24}m;3M5NI>8sBo6hjV=&eiq2Krv%{l6-{ zew5q8iX>lxl+N)z7^#cA7Grgp-$q7PdEdUyy^iyFn5Hv)3-Y?aZ(x43Js)(myF(}V zyGJ|!OQQ!E+<}rV@=I8wE8No0-JxTAAU5d)kHS`+=0~wzm$>;DUr$W7J)eWlI?cDD zyDsow&_`FYqNTrcA3cB%!4RF`(=k-1_+pII8D4_Xy2N`QYbJD@k3~)=`4Y^~Ilc$8 zb&=Pipv(L=vI`BWVvpn85<13*Vwq0x=_u(GPr@plk86p}NfPBdx;;?ZVL*f2H^Tq__Z+qX+XGOp6}OPaz*Ym|ISC5$PBof`vN4XQ8Om zd^J|+9N&YLy2xu$)@6Ph>vfg)$e!fZGKldZ*sK$LI;uLw7h}85@J$F)+Ki433vaf2eK&Sae6m^~-#0p*FSFlP~_&+G? zaEhJ7dL8GZP|-=g1edd7e|U_F|A}G>GvD=&Vyb0dbw-U!kWi@>=xK zWqup|b(Qxx)ti`(@u3)^6MQ;`>J(4HNS))mFg9yY6fa_;u5j~UQ>SBm1ZL?ZPrzKA z;oGr57x*a@b(!DC3LU=TmcuF?=i^blG-OZ*D9>k7Y* zFx3kT@$~^(b)1h!OegtVbkS+P8gZTD+t5=N_+ccbdjBtpH_+FLDu3xT)2QQoJW@Kz zqcB{jIg7N;@m(0Ji~K4k>MH-=H_f7s@u8TZ6Fdxgo#var>HN<(C>T77g}TJApr|YS zA1u@1bW@6wj`Q(YrIS1gWu4}$v0mr+HdJ(hAH`-};#W}Bm8|%D%Jdq<_)s)mZBO}Z zbku3S0$p^DZ$n%c`1k0k%ltn2=x~NlR7mOspN%0p%{OAW&hx{_jy5QXSCG*aZa&j} ztYdsArs)Kqj#)azmtnTf@ogyR0{Jq< z>%&5WJU@t~y2P)bq$}J!+;r&}ACGl9$)ixwY0hG^&hhQ2>HHzl`y^ z!d<@Y{7;S^@a=YC1g7aU&qqFb0B?-O(F3^KNV64f&m*xk+Meg56m8ENu_oG{_deJ4 z6m8EpprZ3U>^r_N(dqBF|9gz`iNPSj?_sC*mwv*NXv#TCzU8~7OBZ;|_k51f89w4X zJEfD{JlYo~I>s-ex32JAV_bB)$dk_Z`9kM-;0503vIZ%!*I4(cj`Qmns;m6qg^pC0 zc=|YB_vt(jyT~-^H1`^qkmTk| zOs|gdi&&~FeAlI>R~LEGWu{l>c;G}AqfYT&lT5FU^Xu5EtNh^QW>=SZ`W0qZ=Xuy< zpF6Jg{+|{-t~90BIs$$V-E^4Z2+&=Z`If6psV?xCsistC_=u}bsZMh9HKtU@_(i02 zh40FmMP1}cIk&OS@xW^>m}ro?))8E1>U5l6#|&NN2d_6>y2R6`x!81`hfVh>Sf{zi z4Zfw)34RYtb-2+1prp%u%M7=%F7TKim^q!viX&#aY7LUy{6qJ#j`54wrYn5cEcfnp zj({iKSfI@u^lPxp}Uc(=mP#d0pYVZuP~BF7l*#W=`kk zx&H_L+|(JQc(3`UPRIFmtk6|{@HSsc>k?1@g$q#UdD!iyQKz{_!3C%j{2n&zaEAjx zRhRjeJG~p~0+0En+xvR=dPW?vz?5F^2)Ow!Q>tV9BD(1c-*vZ(Q5ShRdg~IeMnac) z1NubU^A_~gRo;RAI^5%v8In52U9&z6Fo<(64AKeihao!2gOSoH9)Y1c&Eqg!XLt%m z>KxBRTIYElM(YAE!dPA8=3wN;>u{_kUM|l?HL{g;hGiXJL&_^Ei}shNobi&hd}1Ugvop zHtGT|LPZyOIX3AMuf}Fw<_*}IHK>R!sOl>3z&0Hg*;8!SG46_;I?lZirrA;MhbEom z!D!Vf9)XTJ&EpW$8J>d9I>*_WK6Ek2^E`CZ1zv=>F7k48*Ck$!p1RB%&|6n{3lh4@ zJJ3gmUpoNw)iLgh{yNURkeufIKOy>IfE7s|j6piZBQQj#c^pzY!&5L+=XfTD>paiH zNL}DXNb4dm$7o&R)flVGyy4f*|9FFn!4_n6m3LsG4vQTDChHh?#Z(>VUdZVL_ro-u z1mqI>S>?);XSob-KWduu&IzIV!rutFcL!c>^}< z3U9$yUF999>hK#oifuaf8~1-#gY5=!?uDH?!Tk`Xn^GQ(CY|CDXw_*RhmJbKQxMZR zo{7#n&-2hl7kCl6=^`&je7g7ll30!IR+M=Idg=;qL2q5<9Z2YKpCdpY9pkR(tK-}Y z{dI!-A*qu*7z1>QM_`an^SG=JLku!J1u325nHZ|`JP*Tlffr$NxkpGM(UlSfP_V7$u$J5m>3yJPxaLhNobS z&hbo?b)M&8oi6Yqtk=aQ?*HWm8x2al8WmmU4cMeByak(em3LsP4)>czRCSEIVw;Y0 zFKpKd?uVT^$%7GYZ~#04O<9Aq7>8D!;VI~-b379;Vl@etGol_by(^YAfsd46%%!w zdttIpa6e4dNgj-xPVtDP&i^!nw81#c&>5bBSvtovk=J>ihuONoi!fIgc{%3m60b%< zmw5vg=n8MaLS5w@Sgb?#K}Ue1L5#a%sg83mEYk_@hZQ=>gHh5c9)XoQ&Ev32XLt(M z=p4^PS?75k*69K-LUz4DQ7p$sUECSBnz*sQC(16y@?$N`|LW84+nbewx( zyH0RF?9@pfhH#^ue#rfQjX{$^j%T7(=XoAF>H;r9Oc!}MI_nazMi*V?4d|vTyajPx z_O*ANuGd4@O^|;t}Yt(>xAIo#81MpmRJEgLIzf zVTdm9BBXSYmt&|d@#?G(!wt&(I!5X$??76IW&R`+qjikCVyupHFO1g-?uU#{@?cEV zDIS5zI?dxSRcCk#aypw6GcnB|&+{-t7kCk7=^`&jUYB?^X6rIZyaio!m3N?<4v#nh z#C43jqPvcBFZ9$2&i3=6w?UEzBcW4#F8b&+UyQyw!&jrf&hbnnb)M&8fG+SN4AMnj zjv>0ltC7-W-hiPqy#H6k77Vwd$~!PphZT+hX&vLP7_H;n3uASH`(eCJ@?d0iibr6g zPV+cS))}6HsXE6qS2+JUgS^2!Ow$Ekgc-WX%P~urcs266%o{LUS9lBN>MHNRd>tNj z04V4fcf|r7=U!N-6Isy@iw%-I7)71p5m>6zJPylrhNobK&hbo?be`v7r7rLytkOkZ zjy1Z(t5Mcv-hk{ngNoRK^}5PCuu+HKIRaF4jJsl!j&m<;)(P&1tvbnrQPn9Pfo(d? zTgwCW-+M@L=a)rjdbZ$M{V;VtN*tGol1G zAg*KF72S25d!gqKy#FUeKlHXD$%B#5DIS47I?dzIS7&$%`s*CeL{jH@9tP+FFTx;Q zUFHp0ABGxKcngN>D(}EZ9ZHS>X&vLP7_H;n3uASH`(eCJ@?d0iibr6g zPV+cS))}6HsXChzGm$gM^E^z`1zv<1y2#5hOP6>x^193$Fk4r63+C!7H$Uz!&@t|c zf{ybcSfCT!?{VjUp+VAMFc#|+k3dnUc^sDN3{Sx_o#UBUq4PWsC0*b}SgDJ=9IJGR zS7VJX^9Gc4hPokzsOUKN!X};Ie%P#&JQ!PbibtTT(>xB_ zbcUy3yUzU~djB`rX^`i62tRZLya-LY$ji~HOS~E#b(uFHrYpP!opqIWpo7(5n!Z_aaW{uoO@xkPH;br)kz+V@jAsLkkM%# zhlx7FYcN@7%i>>{W)Plk7xuv{9p|$!TcH$k?zq}Ts$<+AD|C{_ zW2MgUe5}z0uB>+c*BOZL^=CX;^Z=f@#>J)c{Nb}MC>@@&Loc{+bedQE(KRv4l=9bJ zbiQ?h_xh7lspH)IlGCSSJYc<@(kZ?b19V}%`~SqhI3Ljpe)DD1tE>EM#dPU1&w3R) z&$qnh{?-Lvg9Xtxe8k_}#yZJA#L{SczHpP(AdA<`{b&+2|Raf|**cNTi+aq*n*AzBjXS5B!(Y`4( z{m3>vsii4&`H}bkoao%z6uMgx=lzh-2|fvZbc%FJX|b@S$x@ zVTev}0Yi1ogZJT1Wn7cL%IfJQmrEK}NjPqbW?( z72b@TuJU$F)8PQiFhfWF7xK~a1DirS%+)dOg!wwoy-?5z{yG-uB%gwXI(1-EHvH6J zu|a{q*t01t)o~t;6*|N3qNKw?P6t-$A}{D=N~7jK9?}#ly22sh!i=`(PKTMryyxVr z4mW!`$G=41=r5TR#UIh%iVC;;x@puge)5Q>FhH02&lnnQ!|!9b4o5bHlabab9)qzu z!>1h86f)6rUVxk~^4Iz{g;_emGqOjUI)gliex^l7{ymDi%tsyL!qZ7U_&7766MPER z>lE*Kyrb7~ehpi7l@Cffh0*qW1j5aphsU8wXES0xIvN!Cd34s5XxRx(p_`8JapSFZ(fJ=~P%wBhTB*yt9piO4sVRI3 z6Lp+>V5&~=Mabz4zk(UM!bc8pVd^BGg}FK%83kS7)dS76E)UE)+EZL~25~+bC7tA- zVO8`1{x`}x4DzH{uhaYxD!Rm9Jk_0}}CS0Ft`Isg!p;9l3;5w44t*!$qnSd;`)t&ws~Q zUFGb*&UBR;gtMAL`(dV6$GD6cI`XKIrc|f-w^*P{eDt|4Qk~@aSfLC2Fjhs|aJTPx zXVq~&3hSfo`GRy)*!UCg{~7V-7}I4%l}|t4bp6!P@M?6_W$ti+cR(HEsTZ3eo#Qtq zxQ}&}U%teJrYrorOI=U8#IIvwv<;^wdc2PO>_q2(hC$ijoJrpEb(%Y0;bPHo?t#TR z!MCEQ3*2+E+cH|tC!wTMd>&Tn3}25`I?v5lnh71_hp}Flvf_j(KHVCm_~5JDyE?(Q zVw)~-*QsV@wjJUX=%`ElS9H-8KJaSOtrL6%y6Yrgg`PUc`{#Uijke)5vi%LB_$dbH z0{;<1bcMfgt@~BS`7Df#w&yZN>&VIL+^#zElb9GS=j8RKI$F-xV4BYH1DK^t*Sr6# z2D1$!&za^z(gnU?x(iKb`0yK?0-fY=qiNTXAH+&s;+to91JVUv@I$wyF7n7(t}UJB zN!Y1#yba+N@BeD2{3aJFgG2|j3!X^fh0EVuxp?YVJ* z7t}HCf4AFAC;5eYn!;pV;jcbmCUk;d&-$>!pvq@HgGa3JwS`V|!xIinXJg_S42m}5U;f^Op^JRY zN_(wy{LLrbDLTdb{K4C)j`IOns1v*di*<<`R=ZPljE6t#H0d-S_M9tUCwa(o&VR)q zWzc@Dqlq5C6>Qa!hnAfyo#wGGI5M5#b!eJn8~(vMr%&g36FTcEU-Y6oLT7j-y6Z9@ z@{&(rI`NYGfAyc8zi0*j^ksXc3w-{oWMU;T#*Tqn5QRA*E>U5PCeCP^~mh-^S z9FjW4uQoM@;n6mHaa(g3uQU8;hvqOtm-wWP&0%)5J)iUW=1|aSekax(7VFTdIgH%1 zIjo%P{XZ?{VVxBP9{Gjlus(VK&-ik4*rfA(W4Gq8J!)RFcXMdH)zR>%eVRiTo#wwH zt}FcA{hC8ho#A76T)z~4BsIfQwhhkw%74(S4)*{?YybehjeHitn`^Cg(5b6K(U zq~momUMsq0YG9Peeb6BMlJP2i-;vb)7Ms=S5iHfdr z$8R-geqgV4l2>A?F7vjTt`!}A*c|qpOA+j*=f=VzAfuR#h}2gei!*x9pf>#IvqO0Zyj>|L}G-}0On)&+jIY^Q$VD4%Z*2d^`Y zI>C3Nw=VMKFE)q%I>#^msW}YM75?c<%^|G|{C|IOjp!J6#|)j|i~i#L&oamu{2Ft0 zkq_P29Og$G@jX}=E$0(nb{FUrZ@@BL;VWKo06NF{S52>ue9voUR~Pv!o0>ya$N9>? zyIpU${omdHi{Ef$21S1FAFgm6wls&6k<=-E?@d!0E#GSSe@tn#oLBtUlGm2v@Y@f-P?yuw4A?nNc%8Rr+NL6 z?ZXUR;p{EPwGRb@0uMjAeOMN4#EVC_4`p5CV=r$XHtQtcF}c0JR&6=|aZ3BpMOS$7 z96J{+=lS=x4})}pcmBS;3(-!mbRd=XVX}^Mx6l&ucXdpygoRe*c=1UsVUsTM zcLuhEE_d1?K7UY4=&dunc5q7=pvye)w3d+4DL(4-mM~H$`NT6?!q{jzUpTxaOw<|f za&AkQrQ>|&sBBAEV2~cw5^nu&OIW50eAC#LP}X_=e5NIA)-gWnvX&5j=>_=AiJnZS z`KZfVLicDnw_ec_`s*0)J-H<$bv!bLMBDI0q;xJTuEkJ;JTJ#^UE-%PQkVH}Nb4$h zy0RsV)^Ywm#_J5>q4-!(h8Xl^YIe4Lfy=ul`zV=zNa{@RNtOhVHt|Jq|OyI>C<~ z?ge#;pTx*$8$SQYRzITQg?TB)N89jUkEm)xQ9Pj58=*SbWLTC7wDCr{q4Qq6jzj%yUjJD_OSRXb<58yrfd+}%m zA9}25)Cv9_w(1hEJ z;Iq$kQR_5chl0-Yecy5Z7aA15I(nnyRD(= zSDuICV;r%LyaRC^&Ub1qX!Ua?W}2rXsqBZfy0;M>MI zdR^d!7dc8@j6B{wt#f?j1V^ls{7=l+Rem+&F;VlMFEM*1gNj&ksiW5=zWFlOgf8&S z6CH8XeD);gTc`P$%N_9|FTexPS*Lg?y67}tj&3@~*CVd;-0|=3CLQ~``@iiAZGKwC zfM@L07A8j<@i)HO=7&-|DZkXcEiBX(KDcL_A4G8qxaUD_VSUuR7MpaL=l5#!gD7^I zPdm8H528fx2W{cJ-ff|y&hWv9w1sZJ_Wqv`AE37t;cIQ7>FaHwzmD;~ecQrN9q0B( zw}tW1a$bySy2x+zv*WtTgZj6H**e9)J+3V*&?P=5*%p@SBtLahTUe#b{O#;OM_`cV ziw3oY%{s$xo!S<*>ndM;PFrYQY#O<7Qkx$>u@gKEeRZB&ud&n7a{l6tc3Q{znxENe zo#TtWKGZK3nMc7k)SnNb~i=<97^fKKxbo7=*0o##Ki*_I7s4a#pig14P}9pls9 zZ40w>iVuFT%@>kR6SsWmI*7L6H$sQ7LRa~Nb{+iiiPP8AA+)u0@WUsz;cvHf@WUrw zm{;u6!4ID}FkZi3htNe=_RDq%S0B+KbT`QHJx6y4{dJK?p3xx;)oH%ytPWwk&hVu3 zJA|px_S|rFhcH{mc;3toVX-doL32BVl{&#!&Fc_0M%(i<^E-sCy3Aj>y@S91V-Odm zJ354p_t`ss=FSd&n8ZeW*n$pzn8dX6@Vh&N0Xof_@3n)v%Cql_@WMR!emkL4Jm*0> z5iRHE9}*9vzK=WO+`=2%bw^Ey6F<1x6;w;40nCX(d#&0u)0H-7A@!N zp6L+g>pUOztQXcvzGkf#);a#*B`>VQdei=A)4s&C^P-IoY>D^(|1a)Lz?-TPzkSjc zXq%+HxfCdy1OX{p#%P?{siNc*`frqJSL1$B!n9B6198olNHUI5-&o zf1hL(2gxGY%3Ck3{AvZ`27hU{io{nqFkaNy%5PI}Lipiy_D}ZXo10rj0om;%L@u$4 z*(^wZ(#k59kz@Fa)>g4rW;~~@RqQ4QaYm+993>lgUq`EGv6d#qlMJiqM)u-mU9DmO zIfOs%W)-=z4nBC5RTRpMr(I*^{a-8u2q$i^ic)e6&%M#gZ!B;y-03E(s399Tx1W_? zQs4mik()UYvL7!SU=>;95PtR+E5De)ws@GwD)Px5+;=qlC%bWKo|WG-pr!MyKCvL* zDyroMc*j_pksQIh$6NX30y4h;KC4J4`*HacE5A^{!SEf09DwY>Up;K)cL=xu-1af6 zm`^sa$7khV(W!$+PNVx|#+Dhh#(M7m8liBuReZ||KW_iDRb*DOF@8N@71`u4PMF6I z$QmB=9Q{Z3;&~?BM-JlY3up~;08d_N6`RO@Ja)BJoRRhM^=qsmt%|{m-}bHJU@S!N zx%C{3EGns7WfenZ-e47rU$yd?eXbbSykQkZvV5CWEZI&o%5r@D4qB1y!Uel%MY111 zyPLtdfs?}v-=P&{#y9Mx70Es~VMn!9iAbDH%p*(h zPOynmneqJ%Y<&8i6T;Q0K#t;>4jZ3rr>SwPG@HmEJMrKqHa^VGfpJl~O$?QF@a$$b zkuNju+|tGe*lDenKARZc&L-x|4RF2ooCsONFLkhq6XYP?mucez=^Pk;+0iD_$uXQ} zaA2|%$93hvWDS?~;lSh&UeK5QlY{u~n{9lioMYhw18ri5kA*1VA-9bWl5>@Kz(|{@ zA-nN6xm@LD`a91i-Wkim$PwIa90w!2@MAE5?8n<+u&jf}jkk%BWG{|EK3RIt{Wd;F zP95yqTVNA2Scu}uQ*2@(*^iGxsoVhH_-D?V?8Xyd6WNQWLzo=E$6=eSkFP1D70E6< z8V<_(c;*vaq^yq*&a;U#o4Nl-39je4ve(!EA6vjOIflEu$eGG=+-$K;6p)>G<8u0s z9LATG($8cAzgxx_B1iDTavPr`r`d7O3Y%C#cHwuSO4h-BSJ404Sa7f4Y9T@n;U7Z` zG%|0A7dJxU>(s#qz($VZU2ANj1v!HEzG4%ZvK$w$<$&Z6-muOlvdLjw0|Urny-nN+ zgUKErq0g)I6ANx!2?cTk+%IesQ)M}Bu!TWH)^Pi+HnEIs;HGcTHDo7#emhr24&wg1 zm_=kap0JzlBzy5E5yk>JhW&f#|HLr;O?V#C$U)p{F z?8eDQY{Emb2=9lrtNd#Ol$el7>#h`OGc*L z0DlmpiO5mh>|ZvKu!WYu9?;0rk3%{+fQO!<#bh~dU&GWS8~C~(Xf3h}^GjS}09nI> zAy?MNulnNbe6pQp!TsXxVg}ibm)5h3B60`^>jPQ(!v=Of+0Mz~V-P0CaB`wuY$Izp z3wDrQI0qtRH{P9O7yHN&yg%74j*@**f@Zbz>3259Q=o?I$Hzcy z7inYz?}Q9;1h>-c3`$xHmqAZiA7A6Ji)^wBFNXoL9OtFkePS>R-ZVC7W*7N#1%9NZ zosY*~LP#aN0!yl*;<}P+MAv9K}XET8Jz?8Ft7zI0C!L zk#;`2@Lfi;$QAfII7k-l?ZSkkQQg(zV|7n((GfLnBBkdU4DGz=w+Zgw#eJY*048ggZM zce|Jg6UYJlB@~cjc+gdLQAl>W_KA%GukVQWR zBDlzIJf$D~pUr}wg;yYl9LE2G0dj+z?P5E)$r0SMKUYe2VLy1t(j^1w4sr;W4q{5n zjH7P4gDgE`FkL_n;5+VMP?J4A!ly%MY8GPnsbO}pOjg2=45xX?eq1t=K}8PX6&^;f z%y@Y&14(B54~UUtxJ@2SO*U`|i0#zDZSJ9K$p-#2_-rir30K@pQ_B_juh4=Vz~`VX zS>)Tr6Obv(aR|DRr8CFUGGqha4%uW6ejIXSef$OtAV+ZGcv_UKjc5KBO`sWNCA=95 z$YHz%rpgU)THoKo^h$c%_dY8Ve!(J*1OG0rzuok~RF0!R7ERIfVTt1CuPh#-#rf-lBG^H zh8)7jKbg&&5VWIz7;Q|=99@tIxB{fZ0Q zDewP;q_4SUvO>eRz*Mpu&xRs$0E-%~LT-#-gi>-4XP;qU%KA70JIK=4on@Kq!b6~% z?7)r%{T?k{OSK9I_Wb2?NLh{6ymv z{=lE=V*}%Oou*@iJ8Gq$y59FR49IXKA%o&{~m0ld!FE=6Rr5XN7CiyXr(E~AOb zPP`(MW+aF3aq!4G(j93nvh-S)4?~dbixTeb znj)65;Kl1>UhJS&mmi+B?+8hasID#jzo@7+Koa@J{9~3r_saa0Vk; zj7Slef{Se6!H`Y%;Kw0{9Kh%9W=_lco)pm>Mv|TQz-R_1If|3>Xi>6;o5MU=2QL^) z3%w)n|Aec@(L}6p;m2SF*^jr3r-{fBd~hNyL5^bUeGEpjhTFq#vVm`h2-$-tz&^4U ze>91?PLAR|lexK(Be0?kpj$!8u9Gooeh8bjOKg=dee-86xeSFzM zT8wPqc~D9Y;)F#^#fbd(AHsuBB{#;4AxsWo$BUdT*@*{0gzUys;h?OKJG?~8kqz7# zYRE2pGn|q2@$(?|a$x*6B$6ZeV;?^>7NYo}AoG>%$2*~gtb_{|Gw5VF-U*qq9N(~n z0Z4Y^e?m`k3@=^E6eWl7jmsF!vJTz}9&!ZxmUCkw`}~CWz{^4uR~Iv1Wyar>(5z%p z$_YRb*}y#@Kz89HFpnI=qso}ZWG|i$Yst=4YztLn19yW>WEXyZ75yJ(A;`j>5c8NE z!3SR9aZHZlMr&zOvJ)48c#oFA3&BPX;_>TfMY0!^u~C&5%%A5RBAIe_=U4004d zwwabA`*9fNk)_W;(8q#!Ek!&HE64%79jeF?-1c=gA{+P}*e%QPtS|#m*2i<7PnkOdEJ7MIFzuy8eaG{neWoFAVmYGlSALc#|e0MAKC z6*h7ZzX>hK5&T`fRMD0!>Zgi=2B{*8?8kpiOcgog0Nw|aMzRnkG)+zw9zcWFqa)qie}$fAp1e}GncEvucGs&8o5S8f*ez+IzERJU;Ei|3h0V`;>8;FO z9jIWxR!^+0`Wv-Yb<~@f-=$J(WoK%Yed(}Ow%p`6+Mso61Cd&25y|TpO#6O^%{+93vR*Q+{HG(MvgJpP z6&CYsHH9au9hv4`M;%VH*T-DcqaU*e`$0!$<)ZzL>V!&`Z3*ViBdkCBcSj3z&nJ#t zbKuA9w^ubsID4GxD-BM$cEhuB7b_1sGR&1n9c?S^M;$%m&8M!@6Dx-ucO=A_j$;mY z-PY_P!#sP8-7Y#Pk1bDa(N%hex%nTCo^oex%{_80irS3}X=cZ27TLWfH%qIl*RopfK%Vej=Nww)T_+tq6DyB==P0z8qfR*{m;-mRYX2!m z#}3`Z=o4MVu<9V;x1C!c5UT{|eF2GT!V|3|{O7ngluP?HgQxf%t=HhyKx@kGZCFRBIX~Sx#hyIJ{!C;nWvsIm0a($8f z?9Y>@cHK{dK2fAvCW=I(fv3K=o;x8N7x{U;`LUrlsb}K@$J5PO=N--K$+q5V{^>Zq zL7Umk2kYxOrd>|3J@xhMCco+mPU1pm1=IA_=9c}O@825eS>~sQ*!0r|Y<0w-3!Z8~ zx3o;uUFO~!Sp4p+tjFTj{hNyZduL@%F-gxfTQ=k%_EU7>Qy=kTLlTQ0#IsiZ zuuM05BzaO{UoNcrWs{kY?Qt}3n35<`Cja_u z%-CCwrskGp`s;=(_|fY$qi^v6POYPrj=kZCqebOJt6pG>wt-tlyBQ@idq zpL&gEvb@FZp=CR+V6$B>HJ_71uh$s{;mf_54GgQ=p|v(eA7+l~s<$wk9(CBdy3?6w z8uKibd6vRF<6q;7Y|Jw&^DLQp)<)P2t0&o;~ zsdPmK1aN zX%5y-He6YTZkS0`jqEor(6fWA% zMcd>>n}>HhF0Y)^LC=Zf%|gPAUZLmJ-UTj^bN|`8xqo5M%67HX9_AMF@F_<#^W{uE z*KFNUFEB^R5xR0Cov@)J!{dA+#I_YE0j%i%or(e=9W%3@j=tnlHy*(Z3 zr2EZ!8|j?dK{d_LJ#FN1CjWdK%WvEsOj|F#rP-@9bMDhC88wSKv-oCby}3-9?EJRo zM0tTb8_F?7zqe{5n=+lIY(i6Z{omtfUKhQC`Q2NNw936*7#HT2D$dr?P0wwXDsM3r zzrMxPHtb5%m%-g~eK);T?VV+M?VW`omE2wLZ{;q3p)btPtBywIqum*tcO`LtUw7B% zn|Ud;2@kCn=Ju=fbgOLf(RD3uev!-=t-Zb1w#uUVY}4{;x-ai)wmI~@!}xc%s^@#r zCzdRR8Gj>5yIkGCEOKUl^Xr*iJ3f9IBa_T$lJ&-x(PnX$-pOof&`F)IVfY`ap%G8= zG_kZYU+SSZGar(F$LW5Jo^`3*_hhcIwt1fUjpmtKw?)}C`p|Z@?bYFbwYsJDhJ4}9 zWM1Bb9vsDuj}Nzsx_(bHzv|5#NxDi;YbpzyC5dK*jfI}yNF-aX6zX}G(nD`mJ0(25 zx&Eiland~hZS`vJg=Tpt?o0fw!`A#)hhuMY-rT14G4d=Ex@DCdir4CGJIhty{Kk}$ zCy`u_g9p^XS(atOeCJyI3bSdoLyNzS2fXKdN29JkJ=dv_R8J(0u4mN!1(0RgepIY& zf?w1#b9(9>T3%TBixadY@`@cax_}Z5q3*H|r-@YnJd1qh=?;FGN3o#5F!t#qUoMib88}iFEJY+8z zWt6e4{6YkS{qdC#eAtOXKW|RcSE}=*Khz_VU{Jl5?H=R zTE0ouLpI3r-NN#n!ty&w<-=Zkro+!T*!3`epvaNgtw87QMchPz{IVTt4C41#Qzy%%% zLI6VGlrKArfChe9z*)L+7^1R_9T?cffi>32?-`I^av;9|!A;h{0QtQH^7{xp5M`Yc zd%-X3K^TG%0ztWa5t_dwUid<#YyfVEfRhRa{o@2LS1GWY=94e8^t0YYmM<%GbH%P5 z91t6n32=gZU!nZ+i?D1hn%T>n)t%r0`Pz8-x_CjB?>Oh(=KN!)+$m^s2Q;&j9k}F9 zAOP~!j`Ed`A(~gd>^ckvC+Wul5S)N~F}j!c6uZG-AM#DjUhIbec-fC13=ZrD7swau z8uDeAZmv=T`Sl$d8yXN}BR2;%AS}(sZty@*!k93&v&>2RAqo+YZ{zbrm@MBj7?6mavn3%5P#Y@2!aM4 za6_wiX3Cu4m0xz@rN9ja1upP_TbeR24l?j!jM$hw z7-&qZfV@9Q=zBlwJ#?9TJD+@;o_qtJe8ZlHF=2pw3!ewvWEW`Q1t<7-(*N?+d{H?D z=o6Q04Tvz<1Xrekw~UJ5rpX1kII#c&HViQktaH+oVYcyN4T5r6jv-pifDqF-T+DVj z2r*hz&}vQ}KU@%_P{Rg9Wo52detVKeGiz^f0*q{pawmky^7Y*TkgxZSKonviSTCeG zsC+NEQ?A1<$_?8~!HV|?pL})sX zoO(1Zrn$PR_v$s5!KKUW_BFJ)2oTnA20P6Gi3_$dp3d~dar zeFUj1u%Ijk5xEY+5MrGNJHZ!b!A*$ZsN85L8{i0iD&Hq9-WGzh?QsDw9f^6BDz!f~j9J5Jb9B)RGNB&~hw<No6Vt=zK-^urXbPPm2S&g+m;y6kzKLU07YQJ8VJL?a0tGHQ;>8wR|_2=3vPlTFb2HvD9i$%$&Y2Q8n(b* zI11lFf=3q(p)Fhu{o!sXfG6PvSOr_58e)(%iUUIz$cAAs35wtaco}xVVW=5J|0j>u zMLXyQ{oziy2Oa<)JPYNp5#EKva1wq1`xu%RIzw-`4eo_$umIMW;0ovtF1Q(nLp~IMe|!Qri}96H?$Em=RPG+8yDetN5qhi2Q6qGF{mN%X z>7jVDNgn?eotvj;R&LJI|8A*VeXpKbzw-D*eX+$Xo}@Rate&K=NvQl=0so>}d3uU| zd4iesh(4?G;3K*-u2OqUZyslM_vqc2YU0F`;p*K;O zP2s{{R6H|}15jq;gf9F^dyX4D(=RF`f`!VZ%2mqmC`XlRl#{2|9k{XbWy)QYbCicG zk5j(TE`_zr{LlKQ)rw-}t;+8ypHQw*wmtrHo0NwtPf&hX`Dx`Br8&M> zuL|B#KB)Yq@)>1qM%{rgQ|_VcRvxGPu<|VBpz>Pf9m)r=Jiho$75t#AKT&s}Oy!=+ z1C)m==PUb_1IjCu_bH!H7BlPit0_BYa{rKjE>{IECP2HJZsPN_gSU#tgwOMubE>Sj=FKm~smWL}( zP%ctlpj@iFvDS>geX8IyAWrC>JOfDKAtmR$i+dR(?>QzyjA%_H6j#@sdeC~g&*8+71zEru3vP*f8 zPleISQc}-m3he@=@h8%8mJ}$1nf<(c|5Bk)Q8>^mzA)i~D^4qsKe*@1j26 z>5JceyvzB2F`w^pEd1W%T^^sWcdi>W7vcFXcmI2j_uAw0y|i^F@ZW#F*X{S;Ki<{+ zzi7{Q^*H{wkM|4D|BLl}|D(sd?;=0n|LF1V6BqaS{zs2@#@|JKzBBrN_wg>r|HXX1 z%jx%fkN4X7cM+fO^7!I+9`AMY|KdI0>*oKzf4r;tf6<=r>aqN9AMY3bLh%3ae6L*n ztiB11IG^I3e$*u@mwJjhdKuXXPi)>!af)PeY+zGx3axilOzem4;18XbGx*62{FXH=e z?(9F<7i0Cmcr`!mtAC%{2K5>6Q=^HVwAybX`~Npr{DEn-y#SL+6P>`0W$^$a2%UN>6L@%Nj|1 zEr|T*(xGA9?7vFCF^T^_E%sO|Ri+2=9imQvG#V3jrOEmM*SNN3XidXcJsnN0% zWwElFGEtsbu9frg{Iz=bX1obslyW@JvixP?WjmHRmuD<5TE1g>VzFsd>1`9jPtMnIqu9BP*cgfHaPf31>x1_MdUlJ@UEen-Zm4(Z8lts$w4y6uM z?kvwJH_EfhUFA9Dp7Q*1Z+T(4zr3hCP#!EVEf1B;V?@fU%cJEd%46j<<$S+jg;wFL z$f|HxnU=_SsRj1r?Ht0c54vMRPpTWzd%uNJY?+N&@RZqc*&TZSeE zP+KfbT&gWiUz)$nyR2}Te_83W(6TBzCZpIW&MI~l=NEg63yb~5bdI;gsAvjFptEDJ z>!|UyN=3hQeWI`wU(iydfUk+bXkkI=|M$ByNmB~A?ykFj-+$S)bMCqK zo_p@O=bU@)VN#-u5oyjKCA=zZgGMO@*$aLVp zdf-f+A_1FCCJRy${^L{pD?=e9KEBlP`#n8VN@UYBV}P%eO}Rao?=U$Net$|QtHWW+ zDE|E^-K>@d+2jHyapP9mv=@2ZIu7+*w#0+7S=-ST+uW)BPU<=G+hG9Ndk0knPx>?q|NP=ULERnT8B1sn6{pGUuItXMG14j2u zi|||_uRCZ?k-9c)OExJMw^AKmba}EVuxHJZ>wHCPJlFZOzLvqRTwhV3QeM>`{QAO@ z+9Q1%GEKQY?Fvi3^ra{n&aO!|`S#lbmBnwAmjK~AWS0GZMFTY!cP~7`Q@3dqmfq&{ zZQ35oz;i^MEof7(^J?ZEqn0H5+oKhcLX-aYQMWnEf~>%v;-rR^JxHN^bz7e{)!O?E z@F#6Vo+)_Qp}7}bxW#VDtc+weH8lk{0BI^`XVAOwUklNLsV{?~vF?2-N3@T{@2K04bJyzE=0cJ4(NUsxTUb$PN@mzdq@s;hKT$~?D) zWR5IK*4#;b65hh|k|bxsYvMUP;ch(dOv+BU2+uc?@)In0cDMCRNH6qhqiqAcr(KzB zQfIjB``#&=seE!_bkLkv0hsbjulgD&pjalRkF!G}9d5LJO z(TNT*GHVQ?OlMY>eCF_^fSti2*CUfn!kLx6t(LjfVdvol(X+=<%P6*Q54*UhOwZ7e zA-cRbfd$ybNC&7!xSPf1Mb#yXjLt?}z;dkcFTCl4cFel~dF)(^yp9(@)hd^qfjo9j z^YvhjQGB;z;d_~Vyxyz%S*_l}>v zuQ}IuTXG6*s^s-tm{lMdgVc_U4P}k8_+JA3UP+11nv>IG*5frsBNNp@d8?6 zJD_w+EY2$VEY~vxX{xZl($jl1riKPoRg-gp3G9#qA0g$%d?XB+j$v*!3v~t`YKkbd zOAgqOVi}U%_c-(4Zb4)_Qp^{6e?7F6MLM-0VKqny^&e*xsnw~l|Kw$hL53ZV*ilA! zD$*hY&FmaD$_bmP#mvAWFX^-lQWZuKVL^AINcghd38wJ;BM*Z{aD6|JHHGgzn#6ov$a3IgWJT_X%ijY9MSgVr2D1JcaryU7 z7mg=7mYk49Od4b%0mHooMv%apKQuEiYJ|u~|Fuc-xlkhQ9(gpS2r-$$t2W!4 zYkT^QmOO2vvhz5?3kSy0_SiUVYzNIzoKOU7J-^+0ca7JsxyIu0^;urM@6Sfu2+?cqDWOfo4R zw*@`#-2o)thE@X}K=^l41-WX^U(SIkvgzAjf-tN) ztX0u3E7cwcqtCwgwKF{;2}h|->(t$RYn66Qr$HS_#N*Ba!E7t)hC6<&J>Ds`pZ|$= zBJfK^W1y!Xu)UZb?B&cBV*}*1QO9I)Zs_7e#}Twjz{d4IyQVo4pKQ--R0C(4#U$ zf3pyo+0+YdklF(3&VcT8*F^x~BK>|;iRMg2PB}9um$CVb%9muQspA+Zo`#@D8D}Xg zpO1XNzC+R)fLfDN_z9)QLe?AS+V{usv zAb4m>DM9e5cG{#1!_yOfgbftM7}^7}SV<@itXh6Kn@gpRSWan5u^?>0;s$Go$9+dF zg2&>`H3?KgCbT^%y{4i9gL8&<%f_&Rsi&t%_S3P0!74~{^Yi$#sRDn(4<8Yn?InCS zV0Do4^~Oy|L1_bDytui;a_#KS!}|b14#E-mQgyBitDrxDR-2BfH4?STAr$TY&i#9! zZ8W0`7sBjF0e2eD)dr-bebl)x<1QtIovPlK+#F>CB8_-E7BsWE45pL*RhI#DQi`LT z{i$xQhhd+MasT*`Z~y3R))F=!zH5JyNp*l-C!+hj;2g_l;-Nh*vbL!Sf|oZWz$14H zG~V2KbYIU9U$x}>QYuXX+E*j_D~mr>4h0&6Gfr!gCvL$a2P>P6{YXTtZsZNqrQjrK zTb?_$Z*Xkw=r&N)9*f#Xz5?|!&F#vN<(0pMHpm-xHM#GwcU-Pr?CPBcC8l{Rqut^9 zurSzF!%#@78L%zV4}iAXcuF#Xr&^leOwnR$^Zi3Ik8rP)Oi+pV}3M8<|RzNl5?CcAy8a)}T zjI))4Y>^^}|2p-OiR;I+e(_&LbFiJ_w|N6%4dzl!p9zQNm*o1(lu1gK^lBeXac z<9J)yBfsyHc~E9@3ci$@;x_v-RKeANIIdpN4)nzApk~2)Q z|4IOXCfQ$xXOt3pIIFpblbUI%FY7&2$6;yf8J@XgUpuwHhHmy(s+8JM*~MRD8SWTW zU?~m)@?%!H*6U4#x<+?00snfcL<_h!RGgvhfo0FJ;H7>VL}B1A=L?wp1F zdg(2Cz)E?~a67~8U)1jFUd)kwS=GBDcJv1 z9dB1Y$3QC=*r^VE#>ENorQ-JcE)$LGl03h;_c!X*KLgc#jImh>d(Kqyyt+-2bz#BS zKzPTu)g^oZG&jSko5bL*cpCV~w7)eq6_zRCeO2l>%f1(k_?M+mMX7zYfCi)An7;&_ z$T#`~K~(rtz}PSu9L;OD%>#{@ZjY26Z3;d8X+lb(O*agCT3_?MJG4{NMw!p>XbaPX zqymkebIQ~Sjy05&ny6q{+M~WY!9p-WfEe3i%f1fEZgq~0*e|Yw*!C2EMOl3aSREl0 zuCchnhjsr&)!Y=Jo86yUUP`KCzQ+`Xki-8F_*KU{RD0m#6wDA_yIVPTfB5wZ@LR2p zcaruNB!ZpQ=-+X||h-!XEBJ=cJsIDjoP3eUP zXJ>{>qs~S4HZ*{-*l+QTAzzZ$a{-%4Ll;QGg(qCMK2Rvhe<}0C)(>WS*?$+fud#}n zge>lFMTzyCpG6lzd5s^0Bi)bz%1tQ?vGo|7*?przz%+rO$fBcOL2dML^5$|nu(+2VCo7ju8(zM=j6*xa%^)ZlURx=!sJS+1 zN~4nE60^2b{B>{!M!whw6LrKs7+g~i?LhB-gXYl$JrVi|#YG}1EVPDylmZ(SN=zzj zPRr}l-wSfS!)AHBm5o%F+xfSwJlcveC82+UKTz%|99IDqR}rMcUoA}1xd*eK)(AR@ zVra>*ML;AcB6ln4!y&=)EMk%1)VC4UWE(O9J3RdbV@LZ8moCsU-EL=ot*%VhtQW3j zRQWC7`wDmWPAE<#>ww06TOD(&!Lk-|XA-Z@bEgIxW&iDHN08g&9td)Yecj$`Uk5qp z=soL%nA!yknu7MuB{^+9b4i)8xCnU3qS!U%b|qP3r4iTYZCzCDJ7N=(lKo3C`hh({ zUb6oxB+A)q-;t<9BePjx*EY%Ixj&ev{i$!y7>6){I1YPihx*#3^97gJy{2<{?=vUo zl5uz|E=T_6U%+Lu_UC>bPt0jQyEI4V6jL%qbMMn9=ahrrn$xR)eop(_rP(^CuNa)J zJvpaT*w&n4K}jw9r$+uqWSVZ5X6c+F2oN%T>g1eqz1W)5tA2h?2iT>VI;WVh1*cD* zoKw1k)|_7Xui? zL8#B8k(iOA!tg5$wl0oYxu+y%;ny99(L&f8fq4StZ9CijD6NX)z@Nsss_WZD!T3Ut!|K(~8!yH~r&tlgg za_Z+|F)~vGG7h!K?M5Hc5i$=BG`;V%S2DGb<_b5Nde zP})sV3^)jxS;F-XLuPtWl#m(}0ZZQu_%runM)^?PYbq{Recam$G${eLp$69CuOe{D z9|#xwRFMN|^bpsp5BQ0*|8}|3%AVLN=z#>6m?Ns40v&${eR zGKHt1A!Q|5f{8Sxl#NGJm7fX{F7<(1fWbV2%zZEU!sjDSCnE@`3?4 z7+hIKLKqe{?j>9Vo5I|j`XGcBE4xaREk!;A-A*SR_#Kit4=@t+Tq1b63%m&6b^tMM z{IolPerUWG!Q0l<%t{egsw;JZ#UoTfC2|Q0LW}K&T?2G9)kYQriy=Zv1jU{aIGODf zCApeSR!4g2HC+n&b?Ui>XqYGV@V2V?SsXVtKW8xd2G9~d14Xg*Lj^a7$ zos16xyNWMW@1*Jivg~sz@2dAup`n`L`?+r0Q@mfjlZxCr|7IhfPWoEFzO7yxCNXuw zU^aCLn=;z)`~hWfY>WQZtYEYJx35$j$QnC5dC((MXKXp0{}6oZwqR}>5_$X_IyUTb zF0K*%^lg)Zx!gg~53o_5r3zuH<$nQjFH>F7jTdetO`+?8>ATIbMp!WC}f5|7Gv4Vd>LGUU2ZzPY$@cPPc1+RgN zkr(tD0cJKBXF-aYqZ7VgOr=2C*+HnUa~teY3Sa!21XH9htDd0dlgF=V3ioBr522QE zyL5S8wHTYUc5G9mx;=}-x4}e}8e=FwnJ9*Gn`aglmBHDPk{Fy|gY%6}J>iES&{&^m z_ces0%S4%AX(^TwLU0i2DinlpiWhS+=;Z|k9MZ?P`hb;fA7 zS#3rL#X`GX^maW;{D63=J!dS`N91ZltQY{4vBi%`_<}$1+-1BCc^r)Bz?5Q8!mnX5 z6J6Qr%SCErdmGRbyJTdIVtpzTQKZ)$EzJ}}-Z#~h7 zSKbG^O&~`sE(9@EzoE2sqs5*MRgc@DqDxfwJNsY{z0osH zXgStz?%43|MNav8aEIPIeB6gkU&Bk~xxLt%ODFjfQ<^Tj zz!$Q=j)fQ=RSTPI}lq_dCQ_n%!X`Y>-a=zr+SxQu8du%DIv^%$aU3- z?lGn4V}TmV%Ev`~z)>PU@Y$Tu4yfw{6@(0X&W8(XEZ)yiX5Hv0zxe^$*1NOj7_GLU zHK(pQi+ic5y4LLRIG5e1YfLX*pW&C6SQXvVT{Lr4lHxp?mYin{m`HA`=<(K8Ev!ce{YDfOBa954Q>S-~{_)vO?W{u70d zFM;iIbO{KPtA-pL9AlA+?B9!N05@uqa3-=DWVEJJdw5H`;IZ8}gZylEGf2Z+`7ArZ6pD|#UcnT$i59mRdiX{qW6`c(LY#j!FEqm0rZc)7S* zO`+|p-VvM$5$e9HrqJW_fRUGeGMh3R_qD?$i;eSlJiQUMnAHp5K8p9#q?e+EarvpyZ8D9KGQO?{ zTdaO2>foms%mlt`Q%2196T-pXP~p>wko+R^gMIhQomqrQdBM>?Qt z87ES7%?sP`a1zzcKCb`KUVXfqPR3GwvIf}0xCWj^m1qOa^jWAC{Ru^3ztMm&Z~8%3 zaAA}0C}z-CAOJP>&te2H?YzjOZ#DilhaWY*TacE-qT~xs_lR#NhMctuLnQbLnHwWJG-jD?mm}k3bkTJ~F_65k}lx+Km%Sn!cbLxd*o#@GNrP~N}GSMUAN_)Sd zq{p=Xji@zW4=y?Zk~d{+d(f@@)jLk%OKo$#Nqh>7YFj(qvgB?=#R~X zK8OQitgw1&(BUMG@wXsb==0)snE!5o@&@nJ#FD=yE|$eD@;B=rnN@t@BU155v{l*# zZKa?sv}8n1hL4v6pWrwhMTDRI<}YL?!UY9T9@aXuCrqHyBf~?4-+Um+c|wYu1R8gegeT+v$E;)_TQ-S z-*y)R=(l4xodeqzN``@j8%qn%!26t!5^*~ zJ|Vq_1U+#_$Q#bavIeS^C>|CQ*eElhULhK+ zs4Y|`;6(K_w4kN@PL#7$F!O7RU*1#YVvs#pB$sPeW|4YeztAru$c{W_6zxWvJv~FDM!?$Znqw*sR`h;OAt3Qcv}YEU{JZPOw(b4>Rhh{UUsjFN>Hpc zNUM2Sa2*;cuNCx*?P!hK<#$^It1qBnc-lyzIW@9B3|gpfBN|VXf%8RMYgOC>7$>R8 zl^~-esfmFdO1_0RBJyo2Hkk75UUh<9$#>w|gp%)6Cpc@wt}Yd(Mr797c1P)35Tvsv1RTk^xbTMU*9QL%y7F)r{JpF6ie0L;MaG`8*p(U z9e^^$PSu`6)n6>mukR)}HA~HRe{~~r~HtyNU{&nD@`~?bl zv=OAhqhdo;zkWeSgVa3t3=U9tmwt&X7eo+JDS1|`|5t6$-k9DAhYMo24~m#^hNmd} z=!<%Lt5LN0K{bgytoTk$asxmmeE3zNsKtjw5Z2n?2Iz8H`CB>AmgrXQHgLcTH_+^F zqpm-&m*|+kjk^B8OGNAbR`!Pu!-GV#{0dT$hv`)EEzkg$ydl3Wo=%*c*zk1VY7X>7 z-awUtNaPBrBNWBUa}e~=If7BGT>3KYLmaD!!=KC@kxQ`)BH{#bolb`iqc^&tDId^^ zASWnZZ=Raj2)~xD98nG`+d!0CSK-$($t%{ZDi<0x zVpk6UAPchjPbn3P60s1$_0pV!#nobz(rfa?29e@*MV`Y*fnsGBFZjI0i9K;RkjQFq ziV4^lon-c*;a*O(5P5Wj?tQ!v{A9R#Vf0kaNw}kFC}krhDEt_GN3BR1E3&rxx*0mT z+t{T;RR^zk^1w*neAL%varq6niU5f{asKbS*)CJIOBW=pe_a2^<(C=xR3krNjtS?BjWxnW zocc}FiGJ$EY;wHL^Rlwh`8*Jaywse|VtVljgqDX$)u?A@IbQBQ9{usG59f@FyOu6= zuk_AGLXe4Y%*Ab=rDu&i2<12IyJxi2TPXD`-=Q`P-G5Vap}uqi>qUVwFk(3QdCdg| zvw#+BNA~)+!bciSoXX6_&6(nQnUQxo^XA6o-O^m|4Cb8~mzT?4>r>BI=Jko?p<`+6 z*iM)QOR)cEqloDL4|j5Qievm?qZA4ikj`EdP(`Oa&l>b+6Th_?UvA*%690G%F9$w^ z6MQyp8QPu-s=9BQu6pO;da;?^OCuo<@+uvOr?lLETXe6NEu53*?$2O z`hr#VU+87(a)W*vmPSUjB>Vd?p~pzFzaJC&LR9t-KtdfN;vuk+&eRwY27!(KNTIJ{ zljOXu#-6ut>wNuS2ytLk5Z|s7BJ(P*!xA<^Uz+ySMNfsqO4Nzks3@}HkCiYo;?lhG zb>^<9x5=yoSqz9NeDi)m_IB(P&zCn;&ONxBC%(v?Nc*p>Hrk5tS}t|K3w9Bgaq=T! zv17v*HLx+b053mbwSai%24pjYHp%{B01-VOyJ3@y4V$iLMQqs2MJp{hM~2vwdC(5G zW$ej}TqX8oI*j9{%s6h!+{{gxSr)BwVy3r}+B*@&m2KtQjnNr^`5e3a&D$#2ReBh^ zN}PJfAR=pCk;cN%ZK%?`B8_cMJVmswVeuOucM&ag4J*>PO_*iG3$1H`zLMzH+bUes zMOUYBL`D-W6tV@8zC_1%RUYwU9B?A)^|vQJwyhG4#Qg_hlg(lNT2UNVZR?3H5^@6L zvF`66Iu_=~y8jH(t#?)KC0dX2z46`m6R(H)@#w38&io>?F}ggp@g(;Vu#M3cOVg$O zIW`KGrWZqLs9nb{P2XJ#4dd}4uC*uOMFcEMaU%uGQZJUu`F6a9!DZ<!+r)9Dme-I>@U$OJZ2?< ztChl>aTbrI5LZyR_ROA?=t(G@l*k)kg`>vVJlS%^bW3LAi}2}K2aK~7`VM2E`CTFW zc{dzfr^*{V?rvOUrdA!rdb6Q)dXoIq*UEKv%>8^@(360hP3lxf&USgMSYl4>2dR0n zvews_OCV)+v6J_yiy>Pz`33ZmGQ%ofKcdIGZFGcP#Jh*W?hT_y?96Js{2tr1P|b)z zhJ-1nFFgIq@bU=ku}cv5ENJwIbS^04pm}BgJ0yBF-hwOMlleug{^O`0X%C9c%Mr0V z_K;1C^-Hp!QvltPu|F1W3xdzVi3>Bm30){urduL+VDjXu7`h^M!xo78`WthHl%&~I zoCGd26A}xu`kdUR$~3PG*+-53kssgEQid-dDMDbC~mm| z`liVa3{{d!@^Lou^_ZN?CiN+?koZCl9Hok$ASQnbl};A3-fHA4qrL914+#t^+B1b$ zVyGi45WV2a1r(pS$Ppx|4M;=ZOp$%fX&8(tvd2gpOJmOqQ6cq2hQ0>!kECfC%ip`i z^7riBV)g5-I?{6aTOHVQ^VrNrUH!zm*VCH{fOT)^gzMfiTN_W*a1c{RUkE7A}pcl?!j7slgLbH48cP zP+2aEnK>PqoGDkJ*UyPnaUMztiPAbFkHzRY`yeJVMefxR$5j+VPnJJ^te#Z<5U(fC zj6}Y^;H(G9<^|_-Or1baZbGG#>B)sgzR;8Nkk|<0Y>JHHZh^5!0-+)dGeut3cMzy0 z?U;VPInBu+@>p{^ndy6xX5scstTGaKTi+B}hJ?Nd=R(L>(BLwcK4GAQDKZpX7%QI_ zMquURVETAgCiXm`JS~=sIgcGH%EjNui}DJPRIf>e*T&slu_m280_V1Bg)qHFyolL) z1$!b1_XMqzN%$ytIgL$-ZvfK}89nxUHflw+SWrDHQBTFWLgXIqqP1oq@;RKU!S16V z6nVvPvSP&trTjB|G$!n}&xys}qwq^qS+UYXZV0*0aiK?j4jP$U;ZdJ&P?EgJ#bSxM z3yoYZ@0fd`AdHg?j2209Wk>vYf%j1DEnLwNmuZxJ->?|2=7{fV;OAo?S)MC7;t{Lp zOnb#jt`UaGY_W<%_FqdmaTt8n8JS$YvFK!MPhS^Dy6OxinXJ-NEH{TT5k-!#%)UOWv!qKY@Pq4k&nw(;RlEF zj)9fDk}sdQ5Y~KyZtDhd9gLU3THk^emxT158yBZ%f^uXYMy0$&1bni84<>=xvoafT z%hDcq??Sj4-)gj2t2#azZi#>ERc zFoLNQT)y}d_e4)}`9d-Bl~hc0Hz5&!`C^;oJL$@psJvz=c+8LzPSX{4)`&2bnMs}2NjkVr@PF8=CJA5=lCs1SEAFKMY0X3y;1Qd(? z-aKd*QT#&EhpvitEN+fLxMra?e}3mP2|l)v7v1f=L&6yjT(-J2vJMf7abx6av@bq_ za{%|6v|Hx8`aUWwIQYH62PPjRq*3_ z9`_(F0lV-};Wi$uDR~M9(pYgIn8{xO3YEpRCu*$X8t6d68g>(_6ZpbXKx_QGfz&kJ zh7q|fJfhKVTJsm6%b7=iR1F5yA!2=jRnc2ajVWUuSp9&h5w|l1yNxi_<1VJa<^iUX z?_&zP7~;Z7%4(*ti;+Z~8}blSpxJ@$R~_>RlOWoinIj%&3Pk%d)nhGFAUcexWU35_ z<}f8jmPE%P)l|!iWgIbltm8^}!H5R~q@R3>K5Sf@>%q77*f~OIK7iTI%lJd@R*jWi zt;7vs@DezM$}2ipV`Zl^h;NhwU4&Azt2I`3KbLrHMkf<5I$dLBZUOPwmQEmEbic+* zk<2F^+ogY_`V4u9<6mQ?bQUrLOnt=+A(9#^ z>V;Ks;8&Q7)G?`6C?t6LGX#Gkl{*`6W|lipFsf}-zH%oJ)H{6M&qX3$MsuLKR#Hdo zw*b*toPQ#Uhl)V49)(&^{1^y>VweO#kQWs|u*Y7e_nesEAB!;kme(Fj@h{C3cN-LW zfdLegmomNM#1v)SIxjEGD5|^oizeN72-uAu_a7*i8FO^W4I*A3Z8hcDMYy6O7!H+EZI^xpKeeb>~Cw|$6;#({g} z>^m`_<824yP$PlTMTQI~>P5@;(94dFL$$qATYvMf6J7xOJ-uDcB_&#pcYt}JS6kp6 z!iVO~;NvClKt8_q_T|G>A|7YzkHV77&I`Tpnt8s7e5!eFyhZhVIto5f;&IlZHO><= zF)hgzHzsbZL|Y@4y_o`06>Y-}I&-iwZQcVJF%p@fZ^Y+@@HYX!>( znen)3c_trgmk;D)@A7_pSbX9!*ykQtx!6;*cSrGXjqygyYhlBufJoZhoV((OpOdj)LyoG1jJFKb43OvGLf-V>+ioS;l*)D+7|!llxoNu z(yfUT`(w9iodOrNpO3oX3AZB5+ujt}rA-a=PP&Dt&bO|6BydYYo9q$Gi+1-NJz}{w zMhPS!weBUQETJ9Ib*XnMTZ-$os+FCz>w*iJx#rVgLP9PIN6OL?SjqnTE16z*{qMW# z8F$?NTY+eE#}FNnb5~zc@{+qQ6B#@1I#;G6p_$Q^G_Pc=Vxb#k1GLr3sUnez;gXd;d?sf^?C#_A#fn`G4joF;QnZOMCLM z&f4fdE=VXq;WdA}UOam}QZI;@|8#?RdjC`=h;)4PCh@%O(O@&N(;mBAARm0}2EFp* zH}Sddfye#ke%r9sXi*FJwy7;RwjK|MQd<@7CDp!h2#M4^_;2qNZQheThXIl*m1`LtE)h${{S3Bfs)_@tFV zOk4C!dY`z`xh(yMUOlRxbz3MR;BbmWzUxTw`Pw zfQ{e`*Wu{s*be8sBYQVYwBm+SfxKa&1_4oV&$ z`tyCBm@wHrzx0B{(y{o$CncKIrgUsuf*GY_+whrIIu>tRV~|S6;@WGD$GyN?h+Db% zgx4Nl7+0<^Clm~t>|P)pl{YN0yzwPm5IFI;a|I$nAi$Exogom~`%iaIUnogOMFx1v zkPf`DF9(N=@{02q(&3U5d=NTXpiB*YI8qwy)%R^?9#6^_3Mo@noj8kh1cj6r7`Gb- z?EHshJfAYQ<5H3(|hGXqZxo)GaItL&?SZ1I`D9r{e7 zZTR!9&{rcRt9ISGuA!2Sl1RC|S;EXOXnsbuYjjXs&N}&QL1(%cv1&&hF_HN7_-dw%L zXcR{#!PIOjiShx2hC>Kf&LQYWK~$ylpB-pFf_B&yTH!kHv)}%#o}~VTe}gBfeDP=Y zB+qU7=RAqM^8ZIqvI(AKlkg;);ylTwm?r_2o@CRKs3!q}o@CP!ZRq9}o@CSiT~Cr& z{qOK3E4KdZp5*myQzfS!huGue5U2Ltc6Tqlwg=}VHHsj_7R<{y8eH1xXbx5q^5TJ+ zyR?Pd=Z4aznUl5mws(|8c(E`VUI+qR7`jYnU{NJkoQ_Gsu54#ep$*Mu^3@q#LFar*_GcT~qZ4h)sZ2Gz6-+!7RA_Zs+~!HMppwhiw*p z!oY;wJX;{bM(8jap@a7HoGwE~BTzUUfx>8gmf+V85v^IvtUH4RCD@CY;m*Tcf{8?Vx9U&=vh~1f(%%tSaf(6= zp^kMZ@5&V}X^YnL)pb($+ulmi4zKNU+%O3-V>OqKMz9oImWvnwM4BU|Hx9?eN`i|Y zi;kLU?$++)UPU;uO^07^GF z7&eVY+*GmTs9XVWCul^&rivvtBWwa;I=hM`iALB21f5;Q60QB~-TN#w$HJzHIA_N% z*JVETu;nUwOb_Uk-DfXA8 zYB{4~Vxsac=%+%CId};LF=-)oe03S?;ulhf_~&pyG)HZ9!VLF(%@J{FZ@=0{>-vUc zIHUe~i2AF8%T4HLT@-QlPF)kgMQH7Ji7BU4JtU$gi+Z1UDpkQ59r)@v z?YTj&xS+jO{>IqEZ^bCDYk0#UN!>K*&6LoQspcM9`kUQcG-)|l%GO1E6>U+Q`sTm^ zXr}IQH_ue|+~+RA1F7HPfmWGft9(k;+8^H>*vsfB6>bi6pr9?)EDeeFyc3e4?SJ!d z;_aeB=x9iCX3|Kl#R?5%&$Wlnzk=W&_C-uXFPX3FlL)n&?c|2~&_#=HM@ znei@jGhF6o;W9U4WofK5H^*EikaU@wV=fa2y3Eap5BIiknVbJly3CCC{?jhg@xg!8 zW!gV%?J_5R)VbU7qD%x$&b?E$Binmw!H;ZR5ovN;Y-xw1j5XzoUMoJxsaiZ7k>=Wu z^0lY7r)mSA>@disZ|8_jBeA!I*Vy9swswMuQ&2velm{~ion{1~4DCb^Dr(!5h80_L zc3zi_eKPEDA*9gC{_0DwX51LtqtmyxjuV+qVr0t5k?{>T+88WjHk;Ssd$uB1jM6Uq zxF~c@1wy;eKF;ZX+`x26tH4ylj-2a6@u>FOPp;8kU)x!0{AA3pt6K2MT?}j?#RsMH zAcc9@yg;aX0r#^m(D$?EAUvIe{j7O-UVt!lUNlUdq3>i&?!v7|PRAl#UH7|Bb0jY# ziD*n64NPYkf$2^?F#Rdbkz4@-)14A7_1P50fr%?#MUOZQi;xeo-$cubw^zIhEjZMJ z^D#m<#)iIan81~)OuP+?n2jqs|OCY2r5Y|#WZ-B6tV)IX|6VL$DYZ=}mvR$YgU@Bw92MBRH>xuay zfe!*PCwIjM1<2~Cr_w~0Lr*wFqP=ne!LR`B2!1{Ct#?9*jDO>TUypKR#Rqc55fS0q zw2St4?q;}g^uU8PKwP#(Tebfb=R&h`fK?6{fiOCfp`G_t3O+3Q<>$FtH(ZYP=_4^S zwlm02OIXC_VJyh?7(0YUkh}D!4Fz>+Ay-(2Ew^7f-5(-_1*wuo?uJgb;G_A`Vh4iI9^ii+YQAiakOR z=wc~tYmh6>X|Fx~#mx4XHxD^H(7Fy^-Xm#`ZtS29`l4M+t1A=ncBOK=Acq(@7XAJs zjIy)Mj50+=g$SH@#gn6C*K!(WCI1@yaqCei<+{}kOC@c_%URk#@6*5eclq=K|5Bg+ z?Z4cofA=5o>5ad9pML1SKK-BY=|*&}`}EB*pZEFkE`sS8Cz3CU_ z(~tZw^XW%_$v*wht0mp1d+|xmbcRg`RXM4O=-TNH7F3FTNE;4i<+E$64x2GIxG_h& z_1F@3PiDA#Z@_$r5Dj5c8p0(vp1pBf#a;E0S$PK;F7-S|&~y6t!FlHIbG}jAExt0d z3Gq-WA{{4xCoR?Yr6sh{EM1qBB3Ix;(ih?gd!Y9u+@z8l?201z@l^1{vwNqy#Da%I_FaYfU)h$4w>A=%hT0}dH-{z{np3sZ zw`6aIp%L+1MMDw92#iB03-)s`lwzL@T06BVJ@vX zNCIOmn9Fky)HNhs^+uVq8_d})Y8R-aU5wmp3&xRsXGG*uXY=7yXEW0wclK3Ma7SyR ztgY`y4l62cl3DU{6J1CRhX+Q$TY}4mpas=4E*`*|#D02~Sb${d!aLsAC$hjCzdn&A z79jetI=BGwWQT)GZQ+~-eBH!glLA*}428A}KGSrrQ`OlVB$wKSU65CP4^F}OU~&v? z#O|kLmqL?dDZ`tskNJr^kZwfmWS{%eSrG1zGVgVef3=Iz1Kx!Jha6_R(jalsX@jKU zL_%M;lX@oq4SWgFlEaE#cB!4ztd+UP)k;WLxGHF6FQJuIkc*zpU>STmweoabE3<0bZVtFPAlu7mG#t0e(c@&Li}KSAs(r8HB_4{_33mbLSslUOGr>3`VH+RpR}N* ztwg!XAXmK7Vg-$sT;;h>*VQpwS4VP1btG4IYfK#nLtIfoh2FzRCG&!?5E7ZF=;e?m z2_f~=Uftf_n?@mBDEt=o`SIIDx$q;pGlztlop~xoFLkdtRp>?ub<-u}0s}5El8R?H zIP=utXnwdCKN9Jn^9bgdzo$!AZSszsZy;##v6#jAnN11&!HDg?P}`2uI2+E`)NuvM zq|nTc(is=UOU7Wu@Z|A+{Kq{T#6&+{t;&$4UD+)i0uwc%4?9ZFv|KeAhiDEuP{U^% zu0U*zwD42tC!N$_JO`q`gXz#Yd8KmlnrA+Q-X6lWa%DmB(#}$!4p1g}C9lzER-$RQQWIL;SqgIlFLbs=>ega@Yv$n}ch=~= z+C}sojv4kLKzKV_R37#?dAQ_Iwo8gg&d_MFT)zx|t^$8XbVdmXyhhO%+5Q#kBU zS$Anv+YV6=G`M1KcWJD2+uC;Cf0K8HZyzVY0_0O2i8k_Kw7zq&#teWdn1qW2@vi|B1S^g#3i_vqM6Mzk56+pE_*sy5SZ9ht^=@ezf_}@LGtC*=E89B{=AekC@P=FLm>ad4HwTYtF0`?) z)Nx?dr(!P*8gYRGzew(mAZ!N`b+6n z5r1lzJkg_1aG4Q=+FAvnEtCNtn_*zwUcHfFn%I;iy zT=M1Jxwg3E&fU3|xa4cQO(A)J)TPZk@`_owJMiA_(3qi8ckRQEI&*5uKi=&OEQpQc zCWgY|HnoD|CIs)nyD3HS%}zZ6)@3(E*YH_U*->z#b8&yW>a&D8Q!oo-Xvt|1BC|t? zxSR{&Ic48w4kk8Pb>T^W^KEfqzdq-He5;C_y4UI)5K3JreW3KH4Yw~CS=<=vkszHB z>OM$ncS@YH(wp%l2+E2O*a$XVA=?ni9hyH#N&80j z#^SFH7E))HSMqhXx>xb5svQhh^1vWzZUUT3#SeodNx$OS3(AZ3Vlk~~W>}}H&#WYk zUQ%g6J7;$&e~5GyYlr?kMB1$ldNL)ndZ?7>hB;H9u`A^Ec-QBG({Syb8frg8>Y2_@ zAGPp!YG*O4Bj8z_7qu^Jpx-%6^7V~5_*Ne8Fhmnix6M+}okmv|+B{6^E?9hTm^Atr z?}qp-G&e(P*O!tO-`|M3Ih+hOySX%QoVIsT=$1^W=THykr5lBJo2Pp>{0grzlXo&$ zcP(BJWj$1zAzh~(UO#j|bQcExj@uOC)D8FS=`C6~ytL4YOv#N7q#-mByP z5~>+4ohBNPPL(!FuFxB!rIgSg5~V(&hEpY3+qot_%h)S-G5I;JoOw)QL`c2X~&-i4Fmzs}t=4aH$iql0lYRooEq&Q!H)X0SX}( ze=|F3pkNjr%mHtPnK)H`S-D^^fOG=s09*vz>JaRM5lREfNgx$K8UYuaUC#URt>Odm zbG{$&HC$cj=xI_{X-?>(ky2;#9D67uTT1CV$A;pxPJ|e{vD6U$%&pF`gi0X$E^Med zH|>48#z(t?|fSbU#0GtF40Z1e8y*eBZ?8q4s zNUf_fW`tDrS_`r+Y|cv;(n(jZwY8|?5@?rtt-S?0D$8pfEznMV%22N*AD+5qo^Js<@w~dnKN)`qb6<>{(UTGAz zx#?7MnE=kqGT%IO9-_g0W=x@GUl{sosjIB3-u?3Ksygd@7ME-AQnBAdkMw#D>mi~x9Mb;Se zU`e39JIg#Ebjum$qk=&2O!HzvASu^;nJ9TpuGuF_R-j}*9qKvG{0F^u$=T)+6$kRn z6D3jotV_)kLjDQn3k8kS7MSxw>G|gIg3!WzbFx`LsC2eo{grbJNnA6@e7~UJm~1}9 zc_KM>3C){qUM|@FaI*Pf0VwC1YXvZGig}kHkvY{o>g2*45UQGLzDLx$sKER=fr?4z znR9ifR?jqdu6SsgxsTqbozu-lEo52&nd-u;K+$PZBB~ed>vreG=57@oXPY%$Mvu%f zm+J&3UtnI}LZ%_e^ookV%r#%C7d`z#^K&|M@FH`DE~9~$n4RXROb3lSy{BWkubVx*dByU)=4z zIzhSOy(`Q&m=h|Yn->(BZ|jF2@tm$y`#x@1wtp>FY4V0#i=3X^kd2m?x+foaSWdT^ za+ZfWUTuCgLA?p&g*0wQ+Uax9#7XXlh2+$ z!_#rhuP$5S@w6Lr&de#37JC&l12soS^#Cf>KwY4tdI8nbK+V%p z-cx`}GjJE_xIRGjHc<0*R9~QQ_D4R~{7Ogl2dbZeTA-r_0F`c_3U$;VpavSK%XQQc zps*DyXkD43i zHiy?n&T0=)+VK4jd`L@PLHj})KS`tMiNN>y$2-Kgnlkr9)kq)O zND5p9>pj~6t!C~iRFX|lAQl2E81SeSo2gd161AR^Q8>5lj=Eo7HQ+=DKChObCvHa4>rN$00X#yi9}mJ5}MP`}8vK*<$WvH*Vr zI#{3Ff^RKgh~k`=22;6TlhxuK;;jTm|t{Hy7v>vmhP3%ig)F9wy$nwZvl`f)_M| z7Of#csErv7XOyP6kSa|qC$j30&4-n*xfE3cBby0XQQAUEzdDvwDr!Mxv+(xxtVGg7 zBEwRel18Ev%;n4n)zS(0lBku!!tb03DG9L*mRCKDZop(RHnV;7AuBXyk$ISOPw47J zW|y=qv|^EYxRe!oc9FT4*O1%*NKQy^l|rq$i9fO-zIVB*lhqWNjc=5YBMUh(N32kM zG6Igl=M-IMYhEY8zr>CR=Mi7)C9@bnuz|xEotlu%i zIFxOrDGSMje_iP5#b#H+wG(`yR~DO3N$>z@Ag~C4bBVdPm*s+%zzjBv%f9l4q~_FQ zuz`XY%tCpSbul4~V?}-<1_GG;Bz+V>ltVTVgJNO9Vo}hFf)+Sj7PR8WpFm59NSBW< zY=(#el?n2y5uuG>#P%|@gRx<#eu+7wEt@S=Qpj(&>&gh63wJlQEX>9SqIC(d_hs929oS576oFt3I@~ z*|p~$XU>$O$>kV0-Qy8JJP+e*~4Cc`w#p8pV9|ki_|^l6ntDB{x?15;aA)S z7nH4IX}96=qRx`q$YBzK6J|&gb;P&RYfWbrE2?11D_|YtHw`04lC7q)=6~h4gLiy| zr#F6Y4i}Ar(_-xrr(Dm^RYnY3l3&f9CB<{fX#TManIzWXUUTW^$rUZE=Iq-lf z^xG11XRnB7(Pa@JKZ+JJE2n4fkRMdupQ|(|2VlhyE<+8tsY8wjmm84lK_8)7<^~MN z@!$$V_yUCOLB)U^r73=ZRfk=r$)yDT=JM|;?LihwQ&!^dgWlf}PFC^PlR=Tpftf&x zED}C)38(Pl)7DBcmJY}pYTzDyTOIfe56av4{Yus=h^yCWn$@)LnKGg;i$gySa>|yC zC8&X~C%v%IYBH4!j#36ic|#S5QoWi| z144+?F^tBKG;#x%hJ~ zFu*oGjxSHEtFd#c+>=sr+DSSm*``;kmOd| zMHFONJP-1!XW-6T^6?RBSgHg7!8L%J$gs0kw+Dt&NBwOfl@IX|n$bV1-aiUa_q)gbUe1eZ|+ZVhnia zk^z1S`?w5@MMet-GJ$AjfOUHvw=Q~~hzzO<3;}ax`e~nwv#GM=~x4L zBTN&DjjtHqr&|q?VL^8xBWgjn0B%`r=5edRf=0)xIU?Q+B>sOeAP9D=O*bLT05M7Z zrwu5y-DmDU5Q-6JJ6OxTaI!h4o6sCgJZE#_>GO}xIjfuPgl2O_bMlvFHqmL(FdMI7 zMPJ9yJ5^zGYr9!{Tm!(&6N(u?8b5d#`}$$j1=BB1Ic{ZGk9S0@wj(kCa7>qkv0?-E z7+(xy?_^IbjAeuct zXQNe>tlVnqc@)?dQx9cpm=3$@)uYFM=e(md#!WkIM97v@6;9y1lkSd2YWT?K$*l&* zya;y;tLZ@-vJHX`#R9XxBUtO!W`;g%{jaqiVN95Gj|kU@RLmE?>wD}pLhEG=qwd) zHhq6IP;2vFi}~3CwKl&D~Ga^rSm$&3gkv&42nLCoWuzy7Fka#zWPgbCL6R zT3Ni^9On%5nBBCt|FxT+&2HNMBJHM~Za1yYKu>Bnu`^J8W9@&R@#wSKkFAVa*iLjg z77f+7ozZ%Spxu8B=w~yacE1<{D#Ilp-v0^hxW}B<|1Y@QBrY`-w=ZXodhYi-f|q=M zpjsVYsm|OgKVIux1ANGFuep!+3{>XZ^MU z%FQ6O9griF&?|(76RIV2Dxtp+$|AIz&NNZdR?tA9giKA;kj zy8zJIi;26OQ0>{oEo3>7>j7k%MBEZUtIr{{l#sxceB=eM0`vnp-@gdirGOf4 zBXkR(v>>aL0jj-)(CvT<_`6`%y8t=7EO#HvO(t$NpawzjAwVSp_XwZ@0X+_=>}r-< z3urBIUh8^*l};~^8v*5}5PAX7Y5`ROGHGmNE1&`aZ3k3#J8`c7s=SL(Eue<`2>k_6 zS~;QJfC?Tav=>mxp9s|hTKfc{j{(&`E%*-ubZj7UKcLlH2sJRfA9?*2P=kOD0W$R` z?t4JFk1Pgc`YV{ZpO6L6>IVtg0M)M{WCxV{Fd+w^wErRG1XLpGy8gP%Ta@+~k*Pqg zeS%OLpt7}u+<6 z%9ufE1yHF-w;ZTj@Kyj-)l$z&pyXGGs(_jVS_M?IiM-X6+E~gOpbUX(fL!^*$y^6m zDwrFAS_P^FNym&!)5qsOcP{-9YwOqGq5Xf%XFV1ZoAc z#ZlVk0?Zds11cR#W*1P-FrsdtR)LNJ6~&X+L!LmrK&9uBXKDjaG|&Q6lt5lIP?JD0 zK*=M>vjLR~6iX=(;$J-BNQx7HTJ1!3pd#Vv4xpMu`g|hOT|krslzbskGEhbmQ7Vv6 zpfsTTt5`}pP?10xKs5qo0#*Es(k!4R*BruZ!2Fwua>x`Y7pOaryg5YI5#<5dMdo}U zUp9FKkDRnZPsBHmIsgRbmA^tT9SW2;|#0^v>&=Me@sBS4x z@*8xd3Lw)?qUAt#fmTo|P$f{QKvh6KfmQ)^3$&W)b}{c7peiC)WDQ{J+hnc-YKq{@ zwh<`bOjHY0A&?Kqu8>y`lq1kKpi+Svfo#Pb+f6_|fp!CBJV0JEkm(|tX)jQ+K&?O( z7x4p>k!^sjf~f)7(#Y##LNQ}?1LX^Jl19C>f|m zpj06HXOyNL8o|r~O1_&}a)I)HNi+wjRq*nF ziUi6Bvi*wE0!l@?`IO#6ULlbEUZNuM1abm(3$y?z|32uCPzYF2#Dt|lrI(WD1}eIY zXbF&QD$!D)*2{@1h-MHi2P&OOv;xR}B~c|%jX+gE$ywyB0M2C4bd7Pmo1yH z2C!S8bwD+<$lFLXg1%5oRL()w&6f6Kx~9k*JaBZX#*|s`xq4ZlI!N%-al9 zD$rgapFpiHK+|Isw*h4=C(?lIj}vu~Cr~#~g+NDvir%5Lhtj=7y+HX-5SiN1GXhzF zOn)LT8mLI17$D!D$+H33{vzUEEMO@hoDe9ZiYS4+RYZ26CLwiD`XqUYK>4eQl7K1% zN(Qq3le|@q?;YKpEfw~3C0m^uhyj-ACf#v|2 zULr3Ks6wE8peBI|fNU>QIv*%sphBS5TJnm3DmD>0nQk-Df_B6|dp%(Z6E+Z)0@)jh z+(0>R5G?`9f0Jk_P(~9`1=GDvv>d2(H_-|ppFovBO&^d~1!Ve=XcbVEK&ydjqQG-S zt^w>8tNj|FiXSoII-ukjqK!aB0@VVQ3giRw2~-bc8p3qjfHDMXWIBPGm`S98Hx|vR(qd+-#(!YDi6Q~!cqL@5W2O9GL zkp-yK`w&nxP{luqVt`C*h-@857hl@q68rOt3-C7jQ5EgKsf>>0u>3A z1XLkVGEj{`sX(R=nInzpAW=GyO`r^*rZ)0inSdFG2(y6l1AR^*_W;S^(%1%o3oA!%SF8aVL=* z$ks))1jzIe(Nd-pr~)YG6Y`b=C3h380ICtF5~xX_DxmyNDP09*J3_P?$WK3S$yw551ktg=B^+3tZrKO11TV8#Mf{Wnb#4^;6Nq68q{V?=hK8euR8P>z?pM4&2xl7R9f$x8-m zI+G|B$W%g<29zUEI#9(z@-l#YE&($sUPNXVP>n#@KsFb7IY1c#5!WO7nnx z0_77eC$E4~(fs*9O`?H?Kt*FIEg~crR-h_@+Q|DWHP*-zs0+w`jJ$55qeMr6d_vj-WLr&MFHn_0CO=gA zJ9!o$+Zv*1pc;W<{OEeyvt-)H6et!b=Q;A?fqVib0A;*Lo*k%a1Cax$=p~{=pqwv> zl7Nzr5G4b(3TY~NFO!!BR3uP3kWV0224H?I#hGLZlttbv03SV{tHVNhep#0YlV}}KMK{q#AlrvTwLr-N`GAT9st2kOXd8J4n6441RiGxIf?)KwUsh0(ArB_fdKjs8ygIpkx!bBfU%~km)eW z>tWQh0ClHxdXEMwJ>+8iivi4diDy1GpdxYV7fZ1~@sw_6feAo9u{5&-)rcL81E^aB z*+d|ln0k|d>;feNnZ#BmmC`7dk_OZ*c0}nwMXpV(ID-jiaH*XMlyN0d7LZS%Y@kwM zu^dV#v6x(-CNZ$)043i_o$`Q+#34*RP|nX56gp$^qJ(HZ-pRvUyzNsPdq$+GtRC+! zo?G`a9=7Xq1&DbSctG~XS!G=@4HicwpDEpY``3NdE5yOF^PC_v>JGdW=gywFx870* zmJ`p6Y6Xv5@a(Dc7V%tdSMccBv(vbcEkkklCG@fg(bLK%3%_HZAOqbp?6c&Ly zU;CQMeG6jXx2TqM=aR)=nd%-WbaoBo2+5$`kj{pIC+%k8 z@%dd|KOD?(R2IM*>9Q8<^y`wd56_se_$Ri@SMZykmt>bQO{72dswY~*PJ|> zmu#|>U!-+0M9Y6AHjRmSYHe%VZ9()EiPN215CPThdMChqpD zw`@cWcqvD9mtXzeM)TOw#Eb&QQuRhXLD62nsQhx`W+|CLx9cfqtU11zODJmcs}r}Q z6~x>8>a}kH<7FPz^?u#@e9uR9jbE*N*?gH0tnsTQ&zmodx{-p_e)WH!r@cw6@~iJX zZypsTl2t*Yqv#vFQ=^)3*I2#WH?>T(!moEM@p9-!Hzcm`s~OfxTON3;x~By10mrunsuTU{ z&JE_VQ6i&5x6bANMj>{oPD7_|raVEC>rMX~Me(Tr7~GaP7F~ACJoXx5o0P>+WD4am zlKeP3F;O(^^g2e`QD6&{>oAYHp4cR14z!0NuDReJ2x*3pp?N9d!VFwItf{AefXpsU z{perlOJYq^pL~(7Ok%gDHoRzdI3h@J;fPolgRZpQ`is6+OcJxaw?u1gM<8s}RO?IT zVNqL2)T4|Y=nrC_rrz|DdBpSuB)D$9MdZ}xlje#Rv^JLn7rJ`WEAa`8q^J3sHwwVG3S_zyVbj2F;9rl z)W`7?l|Wg6rVpe~fb%smPq;Rd$dg)SaGh$(=bTu+nDX2c%WtDR=Y;Y^?Q$l_4wr!Q zRE##7@+?i=vdMgLRL934GBve#lX-INGax)Y*7ZG}ZtHsde@}IWre5```6o%YFg_)BwdRQ* zscU`ai(!;QKJyLczjmpUHwzoxx!If?b!8Wl+Fq+!>=(BbLiJlI%VT*ZUly(@z z(GK;iE#{=C7f5t>sL$4$#|$Fw>QLXSN8}~eI@GAw0=TV1FE@gM)!t}~w>RY+oYKr)F$laP!VMBLb+-c*NzHQ;R>>hFTMzC*qAHLNloq`=pq z?yWVas`hQ>NONrmeRu2x3V1?d9FMY3)oyg#ru$ctUS&TWj{PY&bFuI@zwI`Wo zO@}&jE9Tom601AZ2e)F*Nhh(YLw$xs42dcp=MqJRLuNjE*JM?8} zHip)^hhkDD4;C~2g@6cCZ z8%QMRP8U@|B0f;=jU-|_#OS^vg+z?hZ^nM7JX(_L{d%kwB8w01-i=xm`W*rg>b{?)@Nkx2x8-V2O1knm};=eu6|} zyY558+uHTD0dal1I^<=Th1l1wFPMpI+w}$WKH!b*w8N;|hdvXwFg|AL{+=`V3Rq`JY=7`wh0lsUESVfzUth6>K=9RF459I?J|#7^WQ;yDGd6<`$#yyT^}=lBT*pwbmXMPB=V(t4Bl}Y<$01^ z^=&qfGEaP8ee7*f;osjjUt-?ZqJH?cc_Mnsy4yTDYH15H=Ag>m=9H*h64~wQy}Qln zuCqvFNktl}{InVJ%oEFZQl4>Q`C7`;CHX*K57BqUOPMOIU5~QFse$gfghVo2@dGRd ziIb$F0weo9h!Www+{ibOu(zwd@0jPB?|e_a`CUx-?W&mYqbQ4S=O+Im*UooA#7YGk zbYDxk?ZooOD31vz*9Yr;lt)93g%VtiA7hB&K|)}AuD-v?d|uS0Ok_c8xxV`R9eI6a zYFAs{GtV?X`Hnie8TLJ-wtQwD6N_}!yd-M$;D95%qdul5q~}F-?MBM(Lt^E5{$>)q z&T7o2_u$_s(hlkSEaJ99`T)!$(RxT9fFpLR)h(hGlbg-w$9?!VWW3aCEKjXyGTS5G zR?m80B)s5#EOYK+!p1}TP)s7R?T~uuJD7cT0oNZ=@7ix3JC~RjosFd#%|SUYPaEah zU&!4EZeZ7glM^1e@NMoqJt?7h-68eLJ?4zzlR$(E+ck&O>OJOZ=6yTW5BG>xi$Sz( zr<$@CgXoa@i@oM?v6t?YjkD^I`lr3-^r(&|R8o0Jc-8r9Nvx2Xsdw@d6fHl*;5*V> zaYzrmK!|e>=@STX zPN2FsfU^VD5oZRfBhJvPyM#DhuR_}3K15L(L;+KaGroCbrXC6`I!M?L=?fU*ghT2x zt+4z%jp2JTUi9Rs5!zpnpgLA6`w=p2!Tu!?qxbKm6cW)=M;LtdEXpmCT+M$TThG@a z>1`9fGJ7ov-d|&MX+trOQO>3&JP3e5`gtJ>86ZN~trL>u_KqD}p%-F)uPd5@N{@R`h55w>v? zC|cT|-q7P`QR3D!^`HFehT8^7scyI{){-cZk{OD5jPeDNT<_)wC~~6BJdq(TY|{q~ z@%%tv5Eq~?H0YNf=!XXI^3V_9rOeTb4()TC=tnd5X@5jg#JN}xzR8Fqvc9<7HZ`W* zJSycjmXV|9O~7)cAks}WuoTc&0)-SOw{hisp(rt_EpRMEL89)&6J7&$=*9ONNiM08 ziR^*geX;022*=bf9zQDl(cMmg{CJc0aj%6T{F3FJwmnSeKr8WYGJ(OZW^T?Yf35fa)# zu^G9XxJ}A!Xx?JVdH<@hblr*PQMC79AnKB6KB#vg@$Q3q7ZNue)VpvCaN|MUQ;4@6 z6rM7Zn0MNuj!D&wv zZx|kMM_ekwrJ7ibqv-<#v%7f~VF7wFquP3pB6&TJ> z^`5$fqU8t03RWbm(A&}Px4aIAx?;5>J~3(&^iiw7$ytovrN|MubcZWMda+xPxO$1+ zhl7aS2gUyQhQ%aGPgKVpC#s_)OdXf7s0C;`FPsoN59-nRRp3I@$5jLI{DXRQCN4Or zuNsK+59<3&;=F@;#3P=AZsR_aI9D(K65<@a*^(c8wF#nZh>Uh`Co>EFgyZrQ;!H_p z?VsdkNZFnsGab#sV#Y(rbO+K;wEap!-vHXfpUqOPz6DQb7xkHlc z=3h^dT{rppkC8|So9+RM;saez92>}!Lc$g{&rphDU}_$~*8)d}P4+HD7Fhl>9Iw`@ zA9iEidQcpl-ZYOQK0tB&c)NxoK6w!s)Kf_Fk&OU7fixfWFdBO(nd=Uy*M4fgc+kth zD-NiSd}_`Rc=-Xf@l*2zfh!KEUw>+z9`UkzIa+ltiov*FMXxq32bESyJC4n)T88AN9G0sTVcM&K-|3VBATWunXj z;!@sd;tVN+-dPV&lzu>5mz+SHCMA>0O=6Fccr7BtfcOZQX?BG$ru|^o8yvBy0!tfJGbwpW(7`J#h2^Jzx=A-~mCt z>3|-v$nX77-}DxeIQpTut{F?r$JC6Dq3^YatXD7p93J$cdh_Sz^UTdJs1JN@c0_cj zfBD>e?oU>{fOll_b^N$2FIHo`T8Z!AdH7Ot6RxAfH|qjl@hI!EY4cxD+nK#h{ZWtk zTyx?J>bRZ(Qd_6aGmxv-sedz&^Vg~E1~PG-I_?WY-sjbM26FZD>fdzo^)JjL%mvS@ zhrcji$h#Avq6N2SJdPVV`r>#S$>Mq&-l;mbjwklU8%BEL25uNRH+aLy_@Q9(W*hyk zk-pa8Z6k}a#BC$D3(bwUjpP_^8*%l;8Sfjp?F4s$h}%Za8n_Ll^I`FF>A<}s9Vf`8 z6;_7aJ92d&_VOY3j&!Q$-yRv~>c1r>CY*+slF7TAWDOs^@_T6bJrtaaJ2w794NLy= z9U7{mZ;u>0pkP957!zJerZ0?wPt82-3NHQg$tjq0P8bDmB9qUy$QFEd#%Wiu@=qtH zVEWl%6ugT}KC&n)xGD3rE4XIG$tjq9Ru}~zB(n%h5?R4Fr=NBOYt@reFb^*$4&Hay zA4Y#iCLctV72JQtX;-lEiIY>X&>BWTl}tw%1wX$0v@5vx@sm@q3a

      )qC^&8EX;(1mv6EA|Fbdv9W?mQtH%&V2 z3a;^-oPycrFbY0MCg0#A2bnihPrHJ(OHNL~JUpUv{C<#3zP3nKaR0@pUBSlReV2l_ z{o69k6@xo{gQtY^O#?cP3NrslW({=2ExdtGkN36Cs|X$-w*5qCnlBw7HaM>{93UE_ z%~ofD;Uv%{9*IL?{m-3Q2M!SZzrk7H;%~&GXMRH_V;*hyBO!XuL>6)Eh;Jv_ua$hV%GPUB;RCp;SNb%$tr{L!#mZj;#>-)M+K+!2i%Kq=EgpjXepfS+9uCp;J6*Q%%K>xtEBHB?eBM}A@VbdV zjDn|dF(ZBP$tk$^i!cgCQ9)mrF?nm!X;(12^t%*1ZcJ)D13LDP$#bYUUl9;~OcqQy z&0{jx6{6?&9+SPFQ(1XTj%OF}y#%t$F1qlCvFIs`$-+e;nttb)j1d}2LFZC3`Bo2E z!ACFnVH7-tFpq0XVLkehOy`$$=r>TyYTa7+nCdA(cKS*==r@ZTGAcPqR)_1U*nMd*qV<9%p06$T-tl&@-^SG5C7Qyf8xWT+p%vyLP&6i*!KJQ@W!qI zCHv=@gJdS3(1%k;osvaQeTVJ1KSa-y^5Jcr;e7Z=Cp2Dg!o^_b$Wzkz)O|ShzrMG| zAwInK@PK&-d^n2QCWVQ^w~jdNKAe4Dh^AqDIQ0I(F8}cwYQw1Z-Y~1(dlG&a1y5ly zm{)Xi3ifJY6dX^jO<^p!=)BXeVBx*rrQmUEqiBPU{ZZ&*GWj0B@H44<_$iIaQ;$N< zdqVU)sVEfR5iSZ%?|{aR6UN=;=bn~dutrx!-WS1%p3G!m!^_CKg`VYaqRyG zAO80B@80<#nuhV=(6vL!hsSHEJwxWUFbn)|&iP>!JcYGG*InPG;BkX=N$Y@){e$#* zGD}Z5wOVvdPva(aUWlIGHb_HUw(+0Z<7#{bEvJ(&&7 z(py6`4Kr#(7lTRfh0*XPGTUHI`Ly@h!9R?Gr?42TyyfH+On*0wf_IT=3v>6)rs&hI z;F`RXQ!x9TFbY0MCck?iTky@O)2?9c+>=uf6!@Hu<_?7r(ogR zVH8x!jzW|6Jo0O`#^%mj-p@u0G*8QLJ)GHV)PJKUo@B zPC?_nE%f-4n5p;^?&;%^vpB%#_w(8ki}5#n*-YRFNQkE z6qc$7DJ(jyXR|3vqLof&c#sU8(}p3oXq?%yYA~uKa7H>uoz0u z{VoNM3&hQh13LBxVud=|_zs$|&qL()DSY1S^abL~Ss{9UTObZ`*{;{Atb8&yj9pM0 z#-jIpBlP^CpNBY^ld-%TLNxtOm+jp#V9x$QIi6~-3UjQm=<6Rw!BcSA!s|~?!I*Fg zUP|UV+!829okx35yMiS--=*MjV={jGfD!x0ciMB~JpY%7D=ZcpY2@-9WXoo~6N_3J$Crfl{DD4vO^E0+6Jv4!M zEuc}JDao@WI$NT1Bsw>QcA4Of~TRah3T_Gh|9!gs`;LY@SC14C*VoBx1)AdFjt3uO@htrMn z)slP-XqPcTjg(-WL~oSnT8Z{abiG7xljz0+i(MgBYLXJ{mgr`Q-Ye0q65S@znnZUU zz?XfEJ?=;muSAc)tKHc(R>N4 zQO=jf8fh0_Gizkudy}KeC@4~PM2u?y}1LylyBEHrq2qcU4i%W4rIs)O@P<@ zh88eKqVps=U!n^ndVUC)ji2>RbTTp%SVk?2y1c1tv$vM^Sle>-BJ3o9h~@-}HsTp=Z> zl;|pnUM111C3=lS*GTlbHfc`WC?%+sXrDyaOY}C0Zj|UIiQY~78@sGoqW4O4t3s8N1}Trns;>@8_dtQ7-@d)#Yo3Uv@Mi&1wJP;;3V;(3Gi{6&;soe z%^Q-974iWtBh3d1j5Hq{8KAMeP7Pt00^iOVXb?ZMGmycAPw<4&nG((Wg^lU6B|67Q zV|u_hfI>6Ok!XHO$XH;$L>EXjZ+|qVFO=va11+XUr-8xQil0O>7EmJ5r4sFy=p_=p zRH7>e=u5@)xO{*i=oJ!ODbZDj)RjL|F2pyd-u#)8<`PnUU$I6?StHTwBzmJn*GjZc zqU$Ak8|aW2+9)MxlIYzM-7L|2CAw9j+ay{$wD@Ns#_Ez1bW8M6iSCi;-b3oF>y-;# zINre<=GTp*L4tFrMKJq^hIKuzT=2#1;`?pbrSUUwM#tf2;fyptBWI-JB|2e%*4It; z0ful4z6!`#K%zwR!*@n`vP7p!becr-8+>~HEPb8CkM(;6woNomS}uVuNc4P(E|lmZiFSexaZ!Gw(O5x=M3+jmTcVeQ(zEd`NnDUP zga-x!d;3s19|;fL`mT@?R7!M}M6Z(Q)e^l%qH832UAsKZO9^Tv+9%QV61`2L8$;>Y z_>icvM`l;Mc84$q22Qic$>R=vAnldtRzZu8of=K133mTL#D`NuP1-HduA>s8N1}Tr znjd{NR%nrEemmAE=eK5!G_O$^XiW2=41BgWBmur@8%oslI$6+31EDfiN{}Ye>6-e-pJV+a*wXqZ zGc@f$7|#-d>g-T?b&f>mO7t9w&Ksch5tBc_5F@5QqUTF=p+px+v{RxNNOVa*9T+jC z{S19QwIU0_R4nBzm<(uaW4QPON zhS1^$c=}WSxsfllfa-dQ-WE#Fu5Ju1uqjkty<4K2C3>$;4~&>rDM6b=YZBch(cKb# zRHAz%x>wMyfe~ZEZE(gRW|8P0wmgrQ8 zPLt?#&><`43@JgTL}y8KwnXPhbgo3tk?1_Xv|`Se5)?@Ee2FfU=pu=BN;KasVKi}x zUs^GjN(tN&y+opyN_2%pFPG>Q5?$$%7*!IzN}^Xw^csn-k?3_2y-}iFwGzW8(e)C& zO`;nmx=EsUOLTK6?W*1z%BXIY=r)PgB)UtYyCwRlME8WySTXm8Fih3_8k^BcEE3I+ zni=JM^ukErnk(i6BLlQuq8$>QDA7q0oh;F*5}jtC#fq6X<{Mj_A<>x< z&0D06>G|GJBb_7Bxe`5RfF361`@8{$pz{x_V{TW{&*ma7^ec4geYYz~5r@^MZdWeF zxAoq=UAYKX9R}SYelF2}=IK9A=s#QapJV#ZxB`*##sXywK2Z7F0%b(RW%^>;p}&_Ehe1x*zmEwXuM%syChESDNsg@S%M}`{ie@kvi@N>?)mh_tpKBZm(`s_ z>WbWzD-Nrd-KosY`C0XHN_@_TJUO|ZI1-*KavHA46`HY_GGD|>{(6V-??&E1>Wy0p zICpzWX^3=#$0j&!_)e`hY!+`owU*~VqiQy@+*cgk8OI7e z&E7e=?9S(TfAyZ?PpU=t9WVc5P+l35-^BvrS-}0l1XUpk`sK3%@`gzE0UMWshO&2w z8zR{*9kB~_#J1>&wd#n)6X`wbGI=de`ta^bHsMp;G2Nh(Oi@-Bfe#Ks=i)upzN^dF zNeS~RygBSCPaHYgtH=?M6}O9?Y>2EvY0Qq~qgd*M9fM6mMB>rygV9!Yxu~Ju1xKi+ z60pkdpiy6Xthdkq1Pmw6qwrNm-q+UFQ`VJLO~at~&-315dle?_E8k-+k5Hh^oku-A z{03@WMbM!91f}*f)JN0Zgf!l3ZROjo<=4@#XUD+BAFWgnCh!vTl)jW>oxku3pQh_u zk;DVn7e1bo(~$8W_;^G^+17}%y0j_9F;;gqzAsr#y9Gwt-K1$9+#Y9jSAz0#Op)U~ z$7A!(vUqYV-dWL}oM`W?7*9@&cb3hQ1AeS0C)PVF-jfsWot5CpN$}3HdvfgFSq@K* z!#gX{lauJ3mE_4u^3F>3m1=jKr=r5G%J;Rfg=DphD$x8QL?TYqf zWq7ZS@nmIsueN!zvb;B-itJ@MX{LH! z4|k664xz7g4w_ft+3acZ=EQrl;>&jxf3}kBhDhO(QE&tAh>F8%_1#Ls;JeW8u&DbN z>ejoJ-<-pAEcF+(SXR6T<*7IPQb~?t)|HiqRnIS#@h&#Y>OO>mri`G$tnPmSi{AB& zV2^sH=Zd~B)AaD; zYAMUM-009A+B(?ifXF3+P=TL8$Xb3g5+ekihach4kSDV0qYsO!=icgR@btiQz0-3< z_xdk~q138hDMQD-i9DVm)X;AO6FC#0oA#xqnEZc&7AbxHc}TmqU5Rs9#Nfb3z2h-J z5|C8rSAMaP6930EmBfCBtF+9Zx`RQx=2x*{z9jluSWyExztEUfRzLaCM8q9Mn zU`UgCXQ7fbPVW2?qA(F%Fj&p=TiEjAgMnGcd9Qbph)E6JiI|qR-lL>V6SM04 zT+eG|{)qBj9x?S6`@ESBi)Sh=9rl(VzIg(ruDYzykX>-ofqjdHFB9!d{C+mU$(H=L7~IR)P5wM^IC~q>gz?y zq%#^hiTYNuiZkw0F1366=|boKcx`?w2ATHAtAkCRE#dNXXO2RZt*_0NgipT8qAyZ7XRZ{n@sZTmFZm=t>t}ZS-%XHH5z4A zXxCi*D^wV;(9od2-&n$E6!?fp{~AUN=m}^(!_M36OuAxu-!i8oMjzJJ8J|kFW)Y_e9?a?m1ha_XXAs;3&pBvnJMd{qFmf z3;Kiey8D$B5uBZ~^}y_$CW7*dv`lDZ_PpI6n?FZX(}#R;(B%FWs{u1=4aUdLjiP7u zxY)T8=@=9}xsGUUL91f&0{F)wJz}n_UIg8B;wq?NAt6jr`{j3;bq6c}!$)e1|4vi< z^U5%mSpS<7TEbg9LpMdk2~ANvsPmj~;WgAKDaFd7pQ9}%OtYf<5EHKUyp7e28*k7J z%tQnB>V0{z$qUl6je}}4@|E>OSlu6@Ys-52tmR(L96tX}{D_`Z8}C=ny;h$`;e7q` z=o7%-!(@1W1>R64hOl#y(G^_AKgenEm+FgVE3j_XP}%H&@af16R01Oguv!`Ji%^>lI8z$_(C(9Ic(z^Iaw%^^btb z-~Ahgh?p+5uQCVh9-MJf_GlI~m`jJ|ftVSbaavx~4gc>5)Aas9m^Uy8KY#&;bPf*; z!SD_+NzAYMsQmOnd^eoSlEsY~ux#)i7U^k^}V%NE9%tnRbWu0=y(JMCAPpE+tTK+v^5`i1Tj z!b#TF!%3bnI7zD$o3=WCm#&k(TuL5rlXFAd#G*w+>{0jqMj7Gy3=^qmrlp#j6ZFJ6 z-nfGMvFUN5`(hpZ7P<3w?+CHU+2cHiY%akeImbIU8r!;$0s+{0MQ~ve!`(&F1~EOR zdAhax4#QXVKupPhQL<;zIr#j#HtuYb%OrNgV&1L8-;HQz-`rd4g1&$BeyY{^roPP4 zS8~RkRPk_3s0l0CW`OvWR0Gq@fa9^wr`LE|f^JnCA5s!+>|eB6?9{nyR4pY+T80gKb##TkqwGAa&zgbd z9$g+Q+5~SQmwQ&X2c=Whm=}bq3&qx9L5XsyKGED1m}q_)e)V5|OdL-XuRd-e)VYq! z)xZMm0aGvnb#BljfPOg9SslE2S~pV+MxWif{%dc-D?T$;6sZf9ha%okYZfZ0G0~rk z0|?72J_x!OV$HYeuxeYR#Eo7Bl>+NS~Q&_VsN?k3H?P zuJ_edsGlrSE>N_~9#+qDDKnM7jIpQ%F6B9;3!I^)%5>$R-J<4|DtXHC(H8aPQe~9# z8Nj|$<=k`M#T&NwWjeCp25~UkOJi1upF?n-4`s?2Pc2^<)&k>iL5S8`!c(66_{Z z1O^%w<%wd9l}&Ah?;>bT!%S{{^eX&CSKH7q{>Jhbfef3HK{jPl;r(UmZ`_K*?CMsZ zb}Pxswc{=7F1J#0-sDIYWBtQWjDG(Ih+!Bo%&WcdOZDz@Wz5)$Ut$jYUtKVt{rTK{ zFe=GFYZx^A-fz^1*OYTcpn35a7I2vbMPAXo^1eksFZX%lSpUv)@i}b6%OU2b=ij z&8>r%#japWGEgdhqoeVwJZ?uy8YI_Y>ANWgJ!xI;!{Lz&t{1U&%9AXpWQ(Y^44oD+ z8GlOtyR1GousaMLRdy(rj@G3@xir`~L1e^X9`s#wPc_?ynnjm`WkYJ4w??$}*rGJ= z61K&=m}X3I^$gaW*Drg_Lc-S>SK-;Ycnb;dpM?CY!JW>Zz$+$q7au~yVrlXC#VC)x zfJVj^uS89$OJRqydOQ8V|I)nPK3F*cQSX>@45T4F;o)qY>gc;s?}HmT_5wNeQOdZn zxGSAasC3NXkK2*UpQVl*{FLv3Mu}E;97Zt4?vgAXTE)>?oEOJ{qWbEg-ziDvPt58$ zOO({>A7=J!*mC=VbJ6~UWx0+ttreqxs>x(3Ez5N{Or2{3U1)vuYcSDj=!aZ%)WW-S z9d_y)@fpmQfO8bJY>ARMEU8PJUAW(Y{~(GdEUS#~#WbwG@q1hqf+ZJ^~ose($5<$RK-6n=0_!pkRK2tO zL(q!gn7#ha-o8%G;OtCoIw+CXU&GOAafso2%N;@PpIHdnkI)^zxSlQ`0*ek)Ts}b| z+eVK1@yKRK1ol&8+axx6i*@_)%>XRL^i9r9H{!dDq9O3pc#NY2c=+8uni%R@#Q5=G z23;-=r<~W{E&MB*@|AS1Y0H#h>389U^t$8Sy@ispEfGp2y~UI4S%9-7kH}P3A9L$3 z>d^o3XauHDQ2vPp>SN24eDmCo)FaE3(XOdxobXwfZ=PxrzZlx??Py2Fl59s>aa3uE zBi-bD5W5=h5D}CXMtd`&%eQ-7F&IlZNSL)KTLiR199Uj#PWfW+X6H?dMVnH#caHSD ztz+-M_I@C`H|yeun}Jfk8NAh*Qnoq5H3h{Kw{%ADYu5i4+%bzub7}+{<$O5E^Sq6Q zEG}_mklm6I-;(EWv}7dU$8L2mhKguz8qQIV=@2bnYu!*5Z#S8aSZx?+_=}|I?s*=; zwQlgamgV$eSj^dz>6im;#Ba;==;j>_(}mL>v7R+69)IR0G)#|$JDZx}BF&$+%#Ci@ z-h53ADEod;F~KH!%Q$xDmHm^oMsP*+8FDRK?x;fE1|bA6Et_uBOrN4hems?PKtNvJ zXLa9aVJy@N{tcn%a_k`=y#q{r+IaL2%19T!tj>*QONPBA!{MDCI~8xGz@)bb?0~*d zp=ElEbwkrUY%GKNwbVC%+FXaGH-FW<8Ev*cavyxY<@IJv$ooHpK3K!;KhWZ9-rlku zeVW#?xp_y+4xse?o4FLo!W(`;<;AsRI`ROr@at&4BN{*U<~!7k3MIB6M^9=CBo!&) zB=}83ufeHC>M-WxB+lGR--pP%N^W%Q|U^_MuF763MJkptUM2?d|)nf3nOrB zb@?$*UxskGtc^}MBvvPc;`G!=lN1Q{4wnFJTsRc zvpzZ!XPd!}ykysw@A z8MYAc`e)b`1iFuaPz)qP-(1mUoJATfFbcB)7~L={O;e3g7c6j zuO-&OIBGM{0{Y`uYNrc?=7iu>x3@(?2#t zVo!5HNQ@~6#2EiF`yJdmpkavpk%#OII_XT&ByB9|6_S zW%E5H4qlHf!ZsuyBLE%Y)VkU+3h;99J`s6aT73Qr%v0#x4E)Q2#>-;sT5gDk!pk!2 zdRlHsK#0hX=bwa@={BT+M>TKbKYh@5;gz)D3eQ1c%qcq;A+u$!4W`S$zpR$+{`0?r znJ{uyb-8lE;H%gGUjN_x8TNSIfQ_{oona4er6E@aoT- z=8cJTAR$JS1xj-XzzdV;idav>ypKis`v$F3VE7B-p}kzBAb zD$2PI^=GN6f5PJCzudc=3rfF?D89S&<#EVndey|4^6^ZE)f@99J2l0(=Jc4KYBIbKvq+yM=u>tc?q4e_%DmUm~1j-ST~3YoWEWC#VnA;w|lxvkJ@yn?DUAW z5buSx!r|hVU?qcjC2aIx$IT;zG|z)xyd$oH%3P@YgThAm83ID;k0ytIj!m= zNHP2dq)6F?zKFp!-{c5%EF4|Q1jhjkzY6ba;?_oIP)0X_6vTycvDiinxo7hy6zc(%i9DW@lt z;p$XiiB3Cbz&eN!SK&u1nWb)dQW>KlnW{ahTyP;r+QvH|!nSY57Uq<*44&27#}w+6 zr<6$-GdpeozF3*$kq2=uUD^Yg@cc{{7z$&{rK8lpEs^3z*O&jS{Z$HVQ7*xk)$A$ zIYuzMLz!oSiGKIS%@3CM{?p2p!+(V3NLi2B>W)H3^YULjysu6>YO|{FBfs#vbovXH_nMAfSxM|jPQWO59~GrU9Cmh$bz!>Y4%)ZaqQb;3lj4YYgRTQLE4Do`r}GE&?!zw(n8x5Oz_sF51^Cv2omi6OmxP;)m_gQo^JmONK_$eM0mn)5?Ww^ ziJ(dn!>3RQzuM|gqS%p1o-LaXyGBJcA)Nzs^3D?cW}~mb*V&0+B~E@*sDl`fgvrIx zlN+q=5$He|2{$HK-Otg4xzLJzbqkFIQ({Vp7G>eU3%>~-_P@V{J0A8)e+ykaaA3c{ z401!+bKiWdx79mBI0;fM%i<|XGUpszX`0-^M&Tm#5X!}ct|iYxNw4sq$=eo2trSMt zj9skfSybN;Nt*rPe;T9%x2wg`eN(o3nlZVF;eQwg7p7kzh)eWhlL`@p_O*@H4f{n={Y9OL`Z0ElQBC{v zyZRc)>MmmIoM`DWXO^gNCEF#`UMbqv6x<(FlSIoSX2evNx`-D>N6d)!XV7S~V{qW( z$NR!@tH?MW{)l3{Gh##`D8kcZSlR``55o`xVIT}8LT9#Agd;8Muo&8jo~@fd9;Ki7 z?)(N$m*{EO{K+U+M8nR$DaFwklS$4SgR$muC=-Y^xK)gCr35!I@EWa%FTWWubhhXv zoK}P7jax+uBk?^@9$wD%zX3F5VNCH~^|*`^OA(p5!I-fZW7Yp9{sfkAVtfc)1GC7d&|RNJQjyP&d|7CCHiuVmCP@#@ zBpKCC_CI8qq9@^&Pwu2aQUB9h{3&PwBRvChe-{TU4C!P#^g&JUXRip6IBrDsN$}r9 zhR+=+A_?JBj785*Tq8*I3MX_;ZVJXuUUT;>f@+4?d9NUYVXU)}UB-YYuEHS3;M3WC z{@G|JVhlG#kO%L)z?veTL*$lN95-Sobe?mDx7b#Gtauu{N?&OF#*FLXqP)p7qOrf7 zA#O5S!z0NV>~|5dF}0!b76`T5Q5){)s}K#amY+kHpJC(J+{R%h-24M?ar^}{;wOv{ z({S^TX2e_FPf;2ik&ILNh@2gdnHu0m;aieV>W3KUU9Sc&++KM8&75nNA`M=*n< znd!L%^Iyj9UpEfg@fxr_;4=waH0Wn^yM>b`G|uNW~!>7@xm{Lj)FRR=1zysDEVc0i}=3 zoj{X|UGZYMUHmjU*CT8u`UCFt5euQOi6#d|mxJ|*V~|9|BrHtQ>Da-6l^h&csljlc z#$vH{6FmZzGv6E-UiYGcWjJ<`yNX@&T!iXq2;Vs*5RwiS{0Q_q*M4=>)vY71~2&B!|ftwZFsiO5UW5_{R7_n^(@ z$&d+;F)XeQptK5jOf$6YUu5NgXqYZsDWRPH`w0Hfq~*%2Zci`I8(R52^6U1Xw{k zdxz-jr|ZOBVVlqrlYb@Z(7srT`=jcrxp7ryMqkj3TLXS3hSh{Y%=h~v3hyCwO%Wwd zn8|xhwBi7BobJEY^)q8Uw?=!;^g6`yJiX6zouzo>CN#Lu|5H?=4^yNV#8TAy8s!Sn z?^Iu3t0cJexR8kMuu+2>x1lp}hQx_i+$iH6BIXM`C4w)r zB7UJACY5I}M0IBYO?5FRX%-WI2(K@HT(e__p?i%#75FJx46O?e*SI_sC+y~7LY6Fy^!HAj++ufec_1yS(Ej}rtfQZbFepLX z?-~>PK0!IX zOqc)sGMq$WNcMGB!Q+I(#b6w&SG}N|qhz2re({2mIpl(8#o_SODb)U$B6fc3dKoYU+|o+GK;r@p&h@tQmTN4;Z%GCDmI6~b{Y#Bhz~2y6l|%o``_ zx2@z4GztuEo@QFuib_`W%_P;g0ghRPG+2xX+xK_pG#cHG+I77vpA|ktU zitf~S>;gl%f7!Sn)d$tEmNyAXG;h1}4EEtpk=f-HR)p`}IIm)Io%dqr#3>^7fh~m4##y(Gy3qT$d87P@EqxUP47;{W3JAjIzH!zbmgYb_W`Zm zIKkW%h#+FB2A^9Om!>_ZaOWFcgzAFb2J2;@7;Wz-m^$fJbzVi7xw9I1v`7p+Kku9m zh9;}~5>Uv6GE9BDM9cg<4-c|}BgX3H4T6DD{LF=f6asi4w(x4Cjx* z4T&?Xk8iQA-!=JdPaN&-oa7xspVNDL`#`K72dkXlAEo1iT_O7TSADxsE8n$>yhx}em=P0GxaMK5s0i)TVcFgbMMrHPeHyew&j z*1B9Vd1l~|F6tJ$0$gZj2l8EZcJFZD~Ga-R97 z|5k@>#sl~h)y&PxrRJ2E)Pa+@mnp*!j=GMJEE^VEL}ZktCD#(Mdf>Nr-IY5x!p{u zdiPdk1P&uynkE@dtpgg{t)9-Sp_L9i+&ACd*?HC@HSaGPRx%|u3QvOLqp z?rM4hLZ^1!z9^G;h=-MCSj+nmw{X|WwhYhoWXf-)d@9SHo_ws{VlCf~1f`9ZfcRdD zM-GVH+zpkseH9RwQp_Tm+f{G2mRE`F=79V@%3A|+h~0}t_OAot+xJ7fSr@M^wU*xj zSl0S#Oey64zk|@H1GF6Lo|&K>KMmyExEDEp2M)pmwyD@hV!<(GJ03;O@pPvTT8539 z^By3J^G0q1d!8LQe7Fv|u=|`mJ;7T3EU>>3QM9b}^RjJ0rFZN>;e#O()w3+F+c0)~ z-#l2T#jHip{YQXf?*r${8gNzwIF4>6(#U#5k3yodSZnzj)WemYKTkF9P#jSUIG8^? zU!Ax^`SG~?*DyM#C!nYM7@MZs={tE(!FQ(HVRLaM@Y<);#XImA!^Ef5>K)2m=J>7Z z8L#6$a*es7Onvh$B|YLp^+!$0`=-^+n8DR!#}coC(T%is0P=t68l*Ro%&d&OG8@-(VP z_P^qX_ih)r?UnmP3UM75tBKfB)xJ|1Zz~i^CBUUTGrF}0RrRKwisR;-s0G-o zHB7g3M=pR7qiZbuiD@$P$CfXC#GR$alS9;7MD26W6Hl-OwnALFOn`EXJU{g9UW_j@Di#Z7qM;c7YY-fh0br64|lc_^SOq0SNTa9^v zI`VC0XuA1Y(PJ8mYCKmg#ygbx);@^UCM}*w_M+=;tbIm zQSl~Je6_LSB&p)A;o&Q`1S;m*2#rZ%cV)QLk-L?V!>W*{vom;VTRWb8>3?YXhFQCn zXBF2&R}99Q1)Y6elc%Y!!hha$yj@^mlZFDLv3#?Y?^!TZ>qFYfbqj}Jjbo`@?V4w^}fBee|XXbc}w%Y`+!R78HtZ5qU)w zp6T-g>k$@m8})5HTbSRgeV!58=M6&O=W!j1J!~2R4IidO;#Qa` zR-EYDhl%~lw~4R<)Q8rQ`TU8?j)_!ca0cdDnC+KqV?bW+Su{brPD5^yML+wFf^(yI zz8w=4d=-H0#EFdt;5jXAkve8kbJP)t3RvI2Q%=EG{7aB+WjJ|=T@}A+cQqKwI16Vx zd8r1c<$x-C)P|s+*_xqCo1k8se7e@a{h$dt%qCBVpvo~ze?8qgMW!CJ#BsVyj#+vS z;M`P&I+TqYI@`jM_qnpUnsR>*75ZL9?m1=|mUxKkM%VXxBOV4Xnk6Z_O}nslQ#zXS1I!ioL@E8CN=HUHpiGrvQ1r^1iY^S!B2kR_- z9M0RRNsu)o&h)L?i82(<6y zl+gzR=Uby*dDchp{3du^Ynl4BrI+o?Bofm~(Izxv7MKryZ5iY~w2YO8eTugdaKyAy zE6113E<{m(EE!a0V(VyQV_|m^d;dg25POBZzX0sZ@nk}<-9#=ma}j0_=l9xjZ#=)( zk$bb+5G?j510N-@f|WcHM1oMX3L5Y$WRDY;8z9|JO01bfzT{>}@UysD8 z>CSnZx#5J1vapHt!!2H!CneW7PV{8mD|D3g{zIiWX)VRqk@B%dm0K=l}hW{h@ zTa1;>@`B~5Tzb;dvu!-G2_>9wmCv2Dbn2SN@kL-B;x|V!2Dg(IXE)}DvzZK00b3gG zOA&#OM?^~7H)z(>ng@Sl>1um@M5Kvtv*Ad4TQ$od_ctNQD`tg zw_HB#xAd`?vew9LeoLo*`?&zR@SBO4O_!2VBfy*%i|Gy?R%E^3()~teSZClFo!eTW zjdu7-A0}I5l%AF~aM2?B1T4Kfx^8M}E+OK}Eb?vywdPkLwQjXw)`%Z1z09@>Ip;@9 z-(gk_(>0j;lJjpdxrUWEvarXqCfI?eTG;uItI%vyvFjE`^jK1&fq(v)jQhzl%mTQa z`;*1lr|)m$Y@Kp#oavv*?Gy)a`PEOBqPe~5sevM(!N`y^L ztYOlEZLgszDTM!&fnT&DjQU{ZA-UqL<)x^uhhQ|o}PxoGLvW=~Vp$@0mImN$}G0IqsY zn*%2?6E&u*F3SFkOP3o1PeNwUN(w5nn1JP%F3VMyEd2(&^}a5j`!%SQMX6yVUp}43 zVza{46Upe?g8&^>B9C0MbhS9HT$VpvvfMZzlVidXJ*6lw45b#Ng429_pq^w(zbd2# zZcUmeM_;zs7w_H;{#ETuAKIwfYk3)fh2CE-Uk*vlxqNv6wO+Kyrc{ytf%lluzL?9k z1i!9>6=RBrVI{EiUHQRfs2}xcohL6_hMD)4$SzkfwO-)eJ>rVx1B>YJn#Cj&E?Vs7 z%R4uB5Fd;FJ41l>J2zhur`*h>X=lMX6CLzHol@ff_n4(A6!0yq?S>fTWsz77d#&gq zAha3czyB?48sR`_C4B{nViAmduk@9?bnBp724y)pO5oaqr zU&9vEAC4inN1rc)St&0ZXk|dVLTF_`!)ZE`=Qz-|$twW}EUF9VXkmck5SR*604v%Y zoh@Wd(F0?FYSfRG$vdEa{X=H*vD&$+AnQ z#GDyI2_SYe01RIQK9|um^BJyivX2*>Ban9wzldBU(=s7SBUjy7h|SJn6(25^c)2 zZl#_K^2K2zY<=Z?HT_%~wL-FVMir)Gn>I+LF20g71~#a*2kI{CnTK7U`MU@RmDi0{ z@Vl8)%cf*PnHM4wwTh;~{w8x%%gkpQnTzW)zqv)`$lLw9nV)*}+RQEg&&<7fElU0w zgfOu^OxvWh{Su9}sOcaALM2D$Xe)Bw4;C?p>zZ561A5L)b^Q)vTwm8@9c+>S(UdW< zdxMdwxIWXRa`F$BjxF-I{0K*B%H!7mR~}E}Rx!?_qmhU8`aIfl9#fjjQFvV*br^pB zujRNgl*cZ@EJ;AeB4JW0|I%RT8phqUqq{9qrIxr>PmOzLs3Fo8F*`LzY8d3`6Ka*) zar`JS1yR6y?olOF=>gn|buA>gX<@OxNoAOZBdN5D!T~a0x#JeX3<8+DnG_n}oq&;M8iz0K@QlaTfp3C8?_VKuo}e*jQCL&N zc&Gm^4ph8#xatS0BQrFgy;CabImNm{)k{J?fw{eCL(QJ$)HT30^IaZij;d? zn`T3KqEx%nKjvQWV47Xcb=$~03|@7WT}62={(uGpEYIFyJOrX+(cVh`w#l4xxqhD+ zFr27Wn`(wD4y%)61RU||7*gF5)CX;oPw4RaLkrkO^#N1jaFUa^bX{*(K(hr-6VV!aF>C5^O4(U-qOs96R6No&u;VWJN zWz@w$HL&6c>oH&jXwpwjVbp@#QE)wtP851SLWA#6Q11l@f%erE-%wgTkXG<7`VeTC zUiB6}54>>sch+B)9}Cgde9!Ijj1bQ0InF%PM+EAi5jPAYv1k6kiEX83bkhEb_x{q7ha>X@1YzN-)v$Q5`A7KM+k?N zse10zWjQ}W+|V`s9*zuisa_J~H;?km0m8-zF`Vlj8l5e`S6Px4tawXh9pc9R;{|S) z)yO;xYjIscpS>sO10goqu9b*QTG|CZ@NG9R)qNUnZ$KY-2_BqzNaIfZ7kG+tA}my( zA1CN6aV5z4twcBXyF|!`|E3)xDaLI`p_&}bTum|7X7nj4w)}wr=+u3*Eb1g$mJQ>K z(6a3K;OZ0-4pDwm`!MaRz+QylFGf?~ldscC_7nH%I_<<7x=ze}CcQG8nm)BdeSS*h ze@N0+{H1;_&1-W{gQBuKLFWU3%lh7)@cblG?o6sHiic~+g>&bSyd0Wb_zx_{0#SdX zwNRZb!p1n71)#+uMieWwFctgjVH$U1g6rRI#cA=1m7hVaH3~~K-1$85)0pzTFdiPV zUy_Wiq~H!%+4eQ=6E~Y&Bh{<8s93jBpphXTwa#xr5n#S{btfw6DnaTngV2n8n5N`b zk+1$jqq~u+u4FE5Qzp9?aR4hDkWG}uYYj|zw3dpcmFAsU!Jk^Pv;}?vQwO7kL!YDG~o3+%A*6PboTy8ze9R)29x(?SlQejzbE$t1Ho1S8FwC9Y&gS z{hl5e z`9oXL-~9Jkva2Gx3?c>vk8)k{QkqeLt{lyRRahz?F)I;~i6r?4MGSBcnuVLJcWP-d zf2Yo72#L-B8X}@CoYYq$2t;Npnvx$5)tb@0{9Be#zs806Xs6mnDwA5wzleEgCfe`> zYQuU*(757|=HEet$nn22Q?|2-_^`?H7Mn;mf3rwFY!egBl}lu$O^ghiB`xj5im>+b z(RN~p`K!h9)pnw{`wR#H$NtV=-0v7g?TJcAlr@aQ>a1`&=An+mj$h_&YN@E)H$NgN zk=Ne;_@~z9bxaSgop>AMH3rXy?7)EmN38#KVN*ev``VSw&#Wf@#lu!=b>omJw>q_k zS{*pZeMnQboG?b;h<0_R+iAT}hbgcc#uzhQvo&a=-JW z#fR1j=T^{EB?YDRyGC=TLRXujtA|zshpLCF`x7jHvoZ&9@)Xh{8$I2HPibfBe(wXI zfpGWz1-N5{Hr9$w_R(Rb1Z$5R)Ui?8SnRT0-G(5h(RiCc9c$Od#sJi|te*Q|FqQCP zwXu#6UNu9UdTMR7xluHF*{Haa@!G-aHrfn39gVvRg0&SfzVm?0jU}8j1exs6ah!zn zB|&CH!6@GeR6+auPX`fg{&BNB)DrAu}Ki9>L>#H8&UtLc7B$@=xYApf3B^+N2{s+cs*h+3`><`xdR0@KoWrYpvUBo zLltXd<=8liiE?yE{sLm)f#gcp zJ+w}lgwgD*HkQ@gaxDC4V|l@1H#>Q(ewm$oRAL)Dom3Z3!AV&>fiDDAF(&zyZi77S zOO|D;XyT93k4Xyt72m%T9l_0fDJpA|nAOs9xuB5*CCi~+lV3$q2|^YXeH(x=oyE(ynIl5)n_Uxu2dYr=y{?V$dl^6{Y9{BWFRsbp_wXIf_-+_!|4Rf? zu%l358%hzUjkDtQmo{1|Ry;)(`f3HOGlRy*i3M&X!TSoDm~uZuf}dZrQgBUrHcoGT zD)wCo6u2qD7b(HPze%v$^$GH>c96)^VQn^!1JS{WQr9GHSxoZhs}rlO5GLkJsY;$~JjbXH)-dJW|@MEP7q zzm^q~02u@wt|c#6I{~r0^mM;24LSFo99@RhS~}bfDGihe4c)J~de0sWkr!yGz;G7^ zg#s~dfWb2&*fH6L?ary_EL7&)A8F7$+jLvXS-A~a$ffJLDT$n$aQuc`cE=3B?!{6mKD9MshbIxiXFB zASPFUD8Ko4DDRN`CGRA!a^-|bK5LL1!xS;e(QbA#&1QBo&A(ups--c_XW*nfP7)|Y zhz|yyMt?hGOCm58BJjgXl9J*syb!_#+T2ti?b-r`?B?`Tj2#sYVz$r&4c77*zrsIm8Da~gc^)`cW2RMT+ z9Od770D_s;@bK7?WkQsCF!)w62h7k-T2VfCY3{cRJy%VuGZDUUWTJX-<)$D^>zF-} zDq*9n$lgmfjF^ylFBX$KoK^h#VX%hFCz1To5Y;hE0%9#)^^VuV%}SV@0Cbr=g=1A1cpFb!Pi42 zKCzEWoXRCen#SV`bWobaVT;1Kzr3qu;hys^MneW?c7sYVCim5#+EVabQ&XX~@4Wz} zNypM2O+wdDxkLKh2O&Pv5{L_Yq$3RiPI&@X^_%c;Qvz#qxI=ZJ8rGsJxgoDWBcf|6 zejtq~%}P6(_N{tI{ZV=ANOJkA25mxA*e78}7J8CRt`kOw$bBo+%3;FwfBqpV01kAN zXkIkfOm<5EEO?jcNbs@Bv;Ic$z^lRW()5D!(?t8FnNeRM&;5euLCi2a;wgdtOg= zJ#3;n*-ntXPFH}_Fhna)j09<5WB+21(}I886_S}8*L2KTm=vXmuE5pFIlTIeHo>lw z@%6SdLs^{UzSEM7XZBvly;)6U*g?j6nePyBk)D~b*FKDNWuZej+Rh>`-P^}R%GVsC zzq=Q~>Y!v{`Di?|fdQ|D`gTwXB?_cLe`4@PesL zlb!*GF4K~4lsx_Af_0(@2(nz=WrS=%s6 zYffVtr_n7UxQixdvbL8@+!EbVm}M@?5{g$d@LT@|-_jC4yf8}?Wku+=c3d7l+u7zf5s+0gJ*^6} zB8sxCig$pKLDX;X!&~A<7G_zCvRW(N%jjH`e)MnfBSQFYDsY>^tky+YSU&s6h|u;o z5n6>J5Po!F7LIA)64_@AeC0RzxaYsQ07_w2+oCKiEt6@T2(mTdyF)CEY#E_lVHT>O zy>45l2<@68gz#Ip#P3j;)xIbT3sG&14BGz&zfDX0j)htFqO4Aew+0X6F-0AI6CtW) zgc}O8Iu&K%vW*=EzWq1&(Jk>i7iPs2Wp#0J^>+LXZrdhYxxSBxwdt)&X@wcHrG$JEz|`*8t%_zU>L$IV|OZE@n>)GUB%`^4Zk zK(^>()yM9(8bTs)xx2~4SDq{0!~Pjt2* zE1A?!^zY3X4CD;x0*ksI(YI}MDerLyQpY#4yY%%FgL}q-2F2S8ILE5^u==s^BqGa3 zknjYgceJ0l%`y*;p8dsK%K|t&{l$RjMZlt~nQNn$0rXCP(aYk6qrSiBkyglIwc*9a zcZ>1eif`S)W8vEk|4!puLhu81WvgdbSNJ}uiq1zuV+M#D-LnyZ8ymp@+^<`W`Fz!Z zW8rxe>tNMDU?EoSg1P|TYJ%zV>SN(d)>$>BC4&XISQVg_@ zst;C`)g7un$Ysc>tEfI$7huHGD1B9ZRnMEUkw<_}U!zKEAViI*O$CpP7w61#yUE6Q z;juK#U$fgcPz(vPTtErl9who$lI~d}zaAu(#?~XHA}@?^Rue9mJ`T+{sk*$XylNDo z-alAO7@c|#m8&*%bT5b3ua?u^t6;%guiE%~Mq3ZBu$mrr=F>0_2 zfnX9xsy>9WAFMlG8=X&4$`M%{Ed?bgO42cL^f20s`A?7lrUY&jrs(%>OgIuo%%Pt#PF9I{{8sY9jH2u0)uf? zeGZfVB76ty%Il8T9j_V)CgkAy=LG1k!@~BD!qDD!h|W;CX^6;9rf^&Z9&JTT^e9UA zAmV?7vPZ|jS3A%_X&%D$;REByg}SYcPC#M$3>8kUj)_A>4AqdlZ>T6Rix_!&sF5s4Bb|aX-FE^yxw=R~@K3&FKUI#QAZtvX&C ztp2F(I43XH4;O=nZ=s-rwE>joc-;wV##;fQ%g}KF`hfu1&I&GH?s@T6GzA2>GIZL{ z4Hsh~n<(9V>&@ctX7^#vrZ&7v|Msaj{C>mVVE8Za7xfu!x|eS3MoT-0o6pg0ss`>y z*Z~%Z)up3`4E^+0>W2SY!r`^yNLel%A$kv?WT?U@19V7A9|b>zyii8UNnZo04lgCd z@V$ul&IplYvEI98_xTZ`N0=q{-Ze5NMWk9BaNLz5`aAAZa0hlNE+S8_igqGhs+kkG zI@ojBR23bEh%cmwtrqh?+Q_k~!r8l^4PA|n*eGF5Kv{$HzVs%=tm;x|Qz=!^l))3J zVoK*WK!oT|hr(O94XvYSB5slnr{GJeqOW@#QYe~Qk%U;oipGV(%0~+k)!_+%*N)#` z6&?eJ;(Z)Iq~IkLzB+suV4lliwc`)hmAPD)tGbp}hbJ-6TsyuBz`3}f)HSO*JcWUl z+VS-Oj`v)!xH784QyC~~$NTG|%Um~kE(ljbb$B{RdU>?yZOMY;lhI<1B_5?7I!0J6 zw`L;-+EJf*`Zs)$;a_I>^YC@`#YOzlg>a!~lKevpt2+UKf#e>^5MAAHptc~LD~d4( z(;py;(I&+l%dj5HuvH&Gx8)7m>R~$Ue7?l@LW<85Sl(de*9tisb-QV%ppFWuNxHEI*`#bqn*0~Mog-1N<@t8awO zxo`r4Y6os%YHJ5>#TWAL`(U&&epep|n(-(%rb
        LydGaSIs68o!T4UlmqkptX(6H3mDiGBt6=7p*G5|b1z}}XW$r94 z((`Bl#3;;{ctr%4&|49K3;7%Pp{mm)bs^mjRDI-zNTJ-ys0#Q3BSFm*v z1Bt!gVaRhkhIl)DSuTEbpsKv?GP>9abg{3IP-)%iIvPsRKWNfiHHuOV{;Rqk{K9`= zJH#5M-B3lUgIkPq^7u@X+cLxi%e;kao{XImAm6){#yGIUGpuU_8Nq5E)G>4$oc-8gCu_C6+vlI!w z>#>IYAQz7ld6s(Q^36E$FgxboCi=0X=r-|!#gCwy#*49*3vjr{iZm?%$zz7cQ$gfOQqdia2?mV>~xj^bE_CrDKKtUKAaz%<3=2UFvV6E7C(> zPEUOpu_mk(p4finuqUvlnZglod5OXKvs@ zDPyOKk;A9u;O-cD;3x%GgC!{5qdJ-x2sBy&d|?<}Kco1L6C8^_0QmsvO~8y+|IODsH%A`?-Rgp8J!_3~LsyecERI8KA?- z5VobL4k%kO+ZGXsvBJ@BAdq9WZT}^N^$D;*K`~J<{VAC=O$=_8P9Dco@_}ihoAXB) zanv{7B|<&1RKuqHTPr;d!$pPZ5iehzCStmV3isW>R;GfH6i@N}1NfRJL9WjgougcT zC`f8x@V`uQb~eh2oKs)R!>Ug&vV|=ICq={}-bMwRmWdmp^Y3!}ba88|H;JgLn`H5H z(S7v$H{(qF0%|qFxsL+=y$L&{U=gBSmi*#YM-xiz!`2SP+YfS&bvg)AJ#6ba`NMS4 z#k}&vNdywFqQuiT$?-G9O%5(#iqpS2k!lZH{d`?@?s5IC z-y;7yL&S}ux-#y7YJ@e7DEJVCskAUB-}$ecM8XIAwcsTDTLv_9lCFsgaZ+Yw<554b zQqIU0{Zfd7ao8UAUpV;ht+ZGWdRq-*7UiNUPCW1b2h;tJJ&B!S&mfRm zpg&e(6$gioQ3*EJ5G{5ymkVX`jV=oR2;rgH>4^G|pC!7P=lv`v%!1f3{VbQz z7wtovC3i>0$Kc<8b$2qne`N8Y?I9F@3hz5Mbn5#Nzx+^ZEcwV$|p7L1_A z({;9(Fd$+GWkd_^G!QX|JFMq5cs718l!^cK3AtgmxSkmF?n#FxX(cX2G`5tAiDBaYL7xQFV|Ahn7UDq z$vftYM2_p5FM8Vu-4zH0f3C`s`69UoC!$ayw1w`vG*+w9c8^HmG$!98hID@CkC;6e z24KCRW>bGUS16ypM=aLK^AyT9e-JOZIX}7$j>$Q&4n|iaX0hi{Ygq1&+JrdmPfmKs z`B`)XSf;VdFbgeX9DFp?Of4{IX}62ftcQk%Aok( zlQj#((8#v;@dT)_NZxR-m@w+4GZCC_d-SuwF#ITQ?I%k}U<&d;v6(a9_|OyA06;g3 z&<;Laq?i>K2$z4oSDbOr<3&o|wvvnit6-#_-#{9?_?BO9IXPF+eZt;ha1zZE2{ax1 zerVqc-?)*YNQ#mNFcRMRLU(i9G10+*r?5%xx|sk5MzH%^c#29W`y{^qH=XqwqV8 zuhvw2^$6uY`aa^D0!Q$p8})s325y+*6|)dPSu5TbDGLC#$pY=c_aw4W-a4SXdc;$1 z@qB$nd6hJ=1TfEU!WH%q!n_ItqSUOc+{n4|};yDEhK3DBd|NH=nNo+eL zK0tNDOganSVHhH2BZC;EngG8I{%jSGL}6Ex089X8)zadq0D~8xsCX@s=t7hzY_0)4 zR>JaEpyg5+Wpy9u0VT$^&`>wpu!g&lF0gPR3>z{~W#UC$nRuMKV~&n=mpg<&Yu_$s zD*6vlQ&ADrz0&E6tf|vXQ7pZ=A?GA8Mvf@1e zI6uf9xCz)qgRcb*fr878*1#@=fTeQsBGJ?RICdzAzP^7CN&`(|;YFXjkYN_JNQA`_F>>N!F{sOf-=fbWlP^IkGTDfPxGDmw z+_YE>U_n{FSUhXKeU6;BM0nelwP49?xBO{INQj%5eyAAk?mImXSP|f~Oz1 z2!9vh`l7!s!La77yn4}7Y4LoE2KoiHn!ri2!EEs>B)sqxZs`9{;6(x z@P5(T+;~?0aKA{3^vyx_48sXjnec$H_ubzji7P9S#4}VUMixf3?OH7tKOpX#NkciQ z`Damg)cIb5-%vt^YReqSb*^+!6>|kidgxk^xq;h|B7p>A7@!E^t$s~`F(Nrv%Kl45 z|E`q0F|0Hmq4r0b54Oi?Gi);P5z(cC`cysAsa)Hn5v_H|XP1g@Vf*FVOR?4%_eadb zV@SrY{S1iOQ#55z*PbNz+A932PsPc`rDA4u45iHJsB4{a<}wl6j&AGMo6z6js>B3h z?K0u$Km(KN;p9AiN@Al!?pY>g&Y&bz58Y~n_b}Pbc?%GP5nkP>`C?>j3b%9EptPixTVE()U3MOqPB)gvRphb$W z6lEkXk-Q_8ns9X$CbF7olwQqrKtZUQJIt+F|cT09#iESYTQ=Ey0S$pRh9ie1AFKB{H1f z!Sq2+&3gl*(KG3a z6;|WCzz_b1_4=mLFLTNF9}@BIUN^L&$1r08N2w(nGs=O8z}J);DKNic0A$REkah^u z5&{lDwW1=8T}}EH0bDApSw@*qUHbczqfF@AikA*352X9bVSv8qoN zz8;A?=IMc%*Qn+&qxdShfF`B5W_*f$zy|JJX)!9?1>8;HMi&8(ZB?(u%IG}N+5H+d zcF-JkR*A=Gfh+!k>x|S#Q|dUdtGz{OVyCrlG06ZrqLxZK3Zq%ZlFmmr-YRdUMWtYU ze=yQZ!9D_d^NIGl+<_vcv{Jl#;rIBh0IlndWJpvxB3rpl+i_x>mij2&%KTE~M1KJj zK&)ID#Jp(*F(mIFRruzhw*AQvy5!@dO-~UkP=E9PSG{r8v<>3(AZ<#=MG2t2N zC#E0*Mo1gma1F*?lLmCu$>q4Q3FtyX;Lq>%nz1IOCQ zX+qFhsT5_E`6nr1{8i?Y$fZBv*;RMJ8QmG97Bs*`JILK=xRi*Y)B87_!z5s_0o3aW ziJAg40750>_jgK-I;1y2scq?{9tT!A0=+p7-HNTpLHTu7QBP(8`kP3xf#-nk|KI|s zn1fWQ`FtJG%0xF$9)+X{yoWTQ>X3>|@2Ze}o$MNMT0XZBFmp-=NYqozaDc(M%6#e| z_>{j)%ASvkn|l#Q z$V``5+H9x`KE~pS#g%=jeB@ElE&FIY6fOmf2??8%4?vFnjrXXdJiO-9VrV2anTJLX zF1gtQRLqZORlL4eRex}>K?e%TTu1%Sv^BB2j+D*gUzhteX?IV7!T0*8tBMop=Y zvzS!uflV8RVHYEAWBvbB+UlHZOG`;NmG*;G;;wli{h@uRGVVYW-S(j6lVSpocLYr%l((pd!$wfJeYu#;uf~WVHxspqHTPQmACRKUBd(e4YbL?RJK?a zxkUnNR=Kq6K1wZ40&0`3hBIEiSRQi=M=#E}y~Y@5mQkwhTD-xFWsiK(o$RYJHDC1B zO~ohwC>Q68p$y%cFK%eZEcVkw)sJ+@?ON?|$o=`ESMS$9W*gr=#Y^I?nr+-L5b{Fn@ef-dZ4>M(T^?VtCwbjo7YnO>tN=tfos^^)xgdEVF6f9d#fSlVrVU zoRR{0q*nMxo-~8^Hsey`V&FJ|LLjj0?m+zFkczIqimD&prR5Zdwo*o~5jHNOV~x1+ zcZ!(3M)dC5^FLg~5A{u7MiDQngn7!W zo^q?M>Q>LXP&4{UmFAE)dxRtA&98~*&`r#tHviQ^xzr;%_L>ddpQIDf|L#JbbvX1g z>9D*-@=$szTrWh_Z`fyOtA;NT%mfJp$e_Zup7L|CgVvcP&W8rLcaQyw5=6( z^M!k5-?gGI*U{v)VnE9}>XOT(X=_Ei`I`fB&syv&ij`;9ia3ziah>=Bmj{i7o+pV% zdE&S{@zt1WZCEGn)Jw479(j75=#H3?g*YMUkhd0!JI#+ClN$?>?y*W)Rwz10bL-E( zP?O1Z_-&!+*-so}TZ+-}P=|%6HvgdcP)!eF@B)D9%>UgzGEv1Wp1RjuRm^T#g3jnj z>m2fsDtej!wNEyvqCe>9`WTlW{V_2czHN_*E}#kocb8v2CZ?Fb`jRTk9!XZVKZ)vf zv2vougnzJJ43axF(Mm5^@f`WSCLHef_v%)7#Y?M6V8g_!^;{g{cvjVVqkq9O)d8-k6heyZyif=&rY{JEP-=@pA+hk}=pn7EvmNj)Ly)}hanXIqx@w(o4b;9# zrZJle=7Mh$d;>#BlzozTpk^Iu235Ob`vL97v$274KOZR$R zWjjJJNJ05xvFLPj)={%5K$mQXSUCAEuy85>`qZDU05h0blX(6bX7-XDH;8Vnc2R@v zI8!EXFxuyR8$@C^@d39N9L}WU0JDTei^dXEjTFgdFbvrjbTtCod*PU7dp zlOjFln@?IwdX$=TRc6RrH$rIEv(VIq{+a14G_M&5wr9(SHi{vGb)k6*S&+(o9^a6K z{50I!pB%V)v;z_+%a4D>bos?bk=T9L+6YoT-TLAYtjs7^h=921vhOAlXMW!&vo?td z=}gtj)2>ygfXuq%rt9FwO+*`47@MbZ3-ZUr9 ziD-96DgDrQ$yUD_I5acag|Ds?DZcFlL*YIkm|^~Z18%)=_E6!9r*eI9H`G!mQYtUX z{hP&r;bmS}B+F?rz_kbVehQHkKf_*Q!udlC3h_0mxFsP9t|Yw(M0CHWME{gTAXXpH zCONce4lPouZfiC-1y281bU8 zhVB0d0fFJjtLQD6B1Pvu6>#ef$dwUFd?S!Z)-^Nn5h?mA@qy{od%1BCXG^6>4g0IK zZ4t3u^agy18f#h>RZSa>SoS->^I7{6CA%?I>9n%~5pScw?5-{w#)d=LNU+0NbhkLdnG;&D*kY z2<1?s1A$x_IeLGR=j( zi073jzQs*+&_u>z$>)h0`LCx%CwIECemOAEfmRR5NLzo-B#=4L zWl@)n(;i)>zCj=@&F!L{zV%`wuY#uQb7d0SRu&+DARuU{jXQ2L^s2g`TAo*tIgN0=F*F3~R0^h*s zU?Ry{%|lEiu!+H7BW*y@Jj6u;W4R6)f{*-iHoxLQV2n-xTOleLn>b0}cg$E3^)yE6 zyZ1B?GavBh8NIdZe$7KHCDaWJYU7%vdA1s$)eMSqjnzEFR>E4splH`H%|m=8kk0(J zuAZ8QI7^@m#!~RGpT|wiB^W=!O3jrwsnN1mIv7nYI2B)N*KES^FNPSTmh4o#UBCiu z`b69lkVWl!%s4G;96Zyx;@jRi?rk>7D~x)CSL9 zCl58n+7cJ~u`dC+pz{qSS-EEd&Gv(}&D$>kd>%kV3f*BtD|2+K5|o68UnALJzf9|8 z!GEZJZ>j4|5(zP$dd1@p!yaK}-3f#u`H73y;AH(QPCtN?rDRlUMiq=&0{#%pj_5^M z7d^P$a2-_>FGK>L+8`aD!yFaY2dV#tQNW>1^|&zp`Y3MVf#iSdE(jq9$u5jWcD~w? z3WRGXz+HgolzuT4_t1DMZr}{k)a|WQDZDw2g$vMyKdHAaPU3KMk&JH*f%kx}OG=O5 zLI-)*&ZdB-a<{^U=M{ZaKa(9Q%~j7OH!$f)qQ@W3vFPMv;(EBKXn5R5PQ6-&(SnXWMaV13y&f{nt; zt7!S2Qj4elikg`~zH!DVz?|Qp8znO174Or;frdaPKD=o*xEF}1ag)DRufljjfE@z- z@vAVDQXdN30AP#3%ngR}X!bDrL1;9)A8s<~rBesX6c~-j%4O2>VyLzK6`|UaWm+0~ z3et{o^+mfwDxp@l5V&Y{m~bn;1tj(mMtYKl@d%tm6dT=vs+&ya6T#4L1i(@L&7cyU z8{6tCD3eT)oTPZSQW|7}#SngS0qMG=hi?P|2(xm0v`G}y|Ke`w5@@QG{&yDv5455r zviNV<2Ys$4EZU*`)3L$ z*H_|P^vntC<3q>ds<>R=pcoEnw=rn9p6`X{s(FQ@sU5Gr zNCUciExrEe`QAdUckS)hL}=x?ipHO0z_{_RzRFraUyh@<_!zhY9r3fU_Ofb%c2OC8`06 zl0&Tuw!^|{mJ`d~>bMx_{4>msB(V~EXqJ&&VUym<4xic z5&*dwEC8?%Lzewr^tgl7*e;+pmWuCTD_Y=YAcZ6sh7s_Fx6KxRa)lc7(xbp?k{kphWX|nDGG2HA=mz`b|i-#thEyz)pmMKTWFW_-v z_idZ>}|@&*f1K(gWcf7A{mWd*d zDGH((77A?Ud&3liJT{tQ0fFU0rQ;U3+Xrvj5sAhfrDdMua??kmqumbyVTAWY_;%dA zJ50X!k?3&)LfYhj(w9s+4mOr3-oqBz<0H|{L2?CD6KF3q1d6r~U$W?!f{{3YG7pJo z0Lw^1$4_N4fS1^)f`YKHkB|6sf8Ij_xO%ML#ZP}#`y*Axy4gr|sYSm35e9Eu9I5tK z1D*^My>2La;npXx zE*Drv>1g+_UOKn09i>8vj*Bl^ZYi3HOUF5dKmS5cZqnYqMT++x#MK_Ls+WHGvPfj1 zLpUf3bjw)WM~2=&S<^09D}rd7#1l$;#(ZR*qM_!>E|+>2Zifkn2Eut7Y!ImQ&g zmH_OkhUkHk3z*`Y1Asel8AsHNp3c~Z1DS#)k4Hs@~GD6Qaxuzf# z)2oU4rxx(U1JG{*&jB#%wwcqWD_%OI!JC^EAI<$y4EG`}JHBW_Ska%%fwkyy+MU*Z zhe4jsUu;GG|KqQ|g#+@}Me_Hh7&;TBsMDZ|1zJ;8691^a!`wwPEdja)&;V)6hH2Re zfh)j7>@5`ge#9nrRy0d*imWY5(6WaGJ^^M}=}6pWtoUw*neKr+eYGhRZ)W}G-Q@mi~=&58x>wx2-9f|hi=U=TXbuM_$M5Ym8P zfOr1PVB4iUcTOOl^0=My$U4;`j|((}HRn-!21!gsWq^PbcQj!gK9QGAXu&_zOp7nk!v-$w4oNp|w%t<< z6;HqX`d{pfQPE8P&Q2C}iwe+U(s*3D8%{{#C=XrRmtQRZ^O=YVOOfAxh6Vf-Iru0p zZP>XKXZVkb2Q0hbXgn$s<<`%|t^Ky<;IMnUf=hj^4;Aj&1CQc6h$0!{oMuhA_d^bx zZ!fK1h{3kbgubWXQY@hl%~>PIej)ny7C>=%3N9@sXa{)oH(Y`vfM^Ej?)%rs;xB~V zT?LtukxU`T!-y)h@@zO5of=l-iq=6H9myo<{Zn_9S;AQxA z0``1LetL+_@Q)?`uwZ38z@Jva?5ZlXGHI1iHLU z{dl^%Z;JY<=S-YtMjIcjjlq-{H-6rU8)tEwW?RgQX(Z&ul{;4A`d|q2!Y@%pmCzR; z&8OJ42)6UUAO+OMVp^s&&@>=4pZvg8juAx@>{{wsQG*%G_lah6EeCbHc?e$t!@a|VF4Xws zNhGFus_jluoKuxD&J-ko19{$V!XyI=OJ74c~gTeUE4W|X#EsH?VX58KqcpI29H)k>K1 zxp}nswTZ~L6iwUD_7Ir9vl1}hr#kOXA!B8Et++LnSdPnzwMj2)w5veB(w&Ny4;s1h zaiw|T4TKd@G^s?*D6zmYm{Cer`;2!jnKJ#Dh;svl6@rZY+TA;~NxO=&g4iW?$-JVK zCN^(bisRF(wjy<1#{(l+-mZ7=x{%mkL-hYgx7QLjV$*g%_e9U2T;b6tFN zp_vM+W+4(d3-waTcSh9ShreUl>u)umrC}s=hOT`}eNr^+?}2 zc%UJN>kZFK4N%AP|4qk$C3h}Di&$Z%;`x*RP6w zM4wdCQ2L~2CDLbH@d)}%T$V|nter9RnQ9wMpX~g;^qJkz<>8#OFSxb$hy#_WIk0e; z)GgHXi+lq5Aq%+_=RWqB_xZvBGwt(5;3NE#PGW$A$;<~UB))jlz-Q9qSc`mDkRZkO zx7q)eYn5_Rs+>oLA(&5$g z#C-e&m7ax<%>9bbgLy=yZyem97_J1k;D9UJaB03Xvh69+vpp4%`oqs;c)|C(ZF2M} zackdUXhWUPtD7m@bE@9|avLbu`^G@rcObN1kASGn4f4fPV$75)G&4)H78P9pvfjz5 z$xx2KMej01d>G9deFhSl`zes-o(v<=ai065QYhreZ^dh2=j3s5Lw1>5&`xo>)s;(4JmJ9 z`fYNxYZ_JFg_j0f&F4TG>gF4Xk1F#pFbvMhv@GH;Z?UHGzeh&+_fyZxvwj?N-hd$O zy>qf}0JmA{$xv7EjLQ*$pAftFn$e^+k0t?9H!zNj#;2J0T;)c;M2|U)FS?Ztwc;0o zEy}dorjIpzDH;S+c}XFKd+|<$&ZWSgfkRHWUdfuC3JAk?f^beH4;ZSCJ34nq%5(u8 zm17u^oI*(sL6Wd*Pxu|=n_D8^L&)Jea(5s%-f3k@V(E=lO1d?$)t^e16J8x|U_qk4 z$hD`%=7{0cNY3x>85C|z_HZuLbF!gv`4!STrcb%Ub7nRTMh^=NO3SV4-G{W>Y}(v( zEuZ?NI%&VJ1`{Y;gHJ87lR9OAHeIMw7U96KIweP&jzb;Gv?&f)Js#4gu!VmBqS0_u zrDjy|a8u92O|1okM8-+CMwjwL6-_#fc8o@ZEHH32wP~De$(ranL)(rDY0tlw@tL;j zklISiIIOMOuePEQxnU-m8fom%7f{n?qw74PO_-<65ZWA}4Od>RhSJne{X#!|>grK& ziI)VE3ocC~V~;Bl09q34$Jew3`Qpr1KSxGkpN3UYX8Tph>xRVArkvhJ=}o~eIYZPO z4Fi4`Zj}kJ%8#q>)8;9!jN;6G>Wf!Z78cV9+{7U`$aj%!6uGT*_3PQh zPl8*x8w59?%%xQ3HMj%^Yw&wn%?bPo?GR;pmO}Ply<}`Yy!)z5=oEf~8>3;AHYc6b znVldHlNi)fdqXX-R;Jmh0BF2W46hAf<&pzn<7ycLg4>7zQ(4OZHp6j@sZ9ZH^pMK5 zsZCL`n?g7syD4Bc)zls=(2_KG4d2SlbP6d%3zXD%&i0j|L&fi8Z%i+RQBt6m-i^N^tST(U%ZJIj3UD8Ef;MKk<~C)hV&) zUeJ+NTg~d6bnSMVwmM3k)}T%EW9F}BoGDn)L# zi_+|h+j}2cg|co9h(k1LMwJ;SSq|GN8MGw$J0Vo@(QX_Jk+E9F$xzFpR)sJcFm=tI z3>g_`Sk0sX#!ia9t#MjCw;=XgJss=A%oU zK>@4!9&Ngq}hZL1{3Gzz4h;fgEN6V2V6roy{j+$pc87Rfr?9N zHc|}rd+g1Jn`;O`w0BRhr54jfWAde__tDr=UgD-1lmGc|sRt|S6ae*JOheDYYlqBE zd#F|dN2q^ioTM@YKE}8T)8_jCvCsmXXJfkoCn1ImIQ?`Z{jUKJK3AE+^CoTtZmbW@ zxN<3E61-06*goJaJ3%PwI(1@WAQB$Fq$My8*?z$J{Tw17l;LNm^a3qGK!A^W?&?bv z&%o^;Ry@qrxWX9e+*p4)v&b0ND%Ff#TB-{@vSX7(8cW?7+bMUEBpI7`jl39}M`0B3 zPCRPN*N7+1=xCPao=6)Z4pX4piiLaH>87nn$Ew^l@iXlZ2zmmUBThljxozHC(?1g#P zLlbexsWVBh+_P8?;2Ftovbj-!JNH}g7V}m0qNmKoNj4As=wVN8LGF0@^GuZA895}*F&`F^lne0w+z&bUPlbW$C_C%XEjVHhV$piWMQNO{Ae;=gx1E6D`d(u+u z6&m&cgCivAcIpa3F4zVJ2Iw9E(9@deNe4ZFu*M-M!6(6Iu2HkU*R_VVKqaG%zYC#$ zfw*L$nCz0z{3N6lBkAXsYg}pK?;~FJqo;Hy|$LYsSg)_ksJPi zBPeI`=&m6TPZBbU@sMB@-+n{f^nglDOTsUDbE&mxMwWjCCN9(tY_jbBD7&24Dm+U5 z2l@7*V~&Y1`Fn=JQFbb(tlk#64_-P8$&Q=kFF%WmeKLr)U+S8ANkwx#fpW4Y`m5_? z$6rK`c%7s(>IFY7yAeTWk(jog2r8PMRg`JM$)_)Zf%`k=ym$;MnY>6r>(}o+G19dnFlhdztRjUpPI*AJeeBvI=L;t9jZ^A zFq7kV=~hu$6&}=diPJo=B_oQlQjlgZx?LaG$T~wUjJ+M?AKQf6+&cg>1|ohMvDNP^ z6?_jIW!;nb4GlcaBI_AI|Lfqx%Lt*_1TP)X;DfaSNK;UZBEsaDc^sIw(d;I*BDH_iq11Yc_by~RyeD}s>4gLP8YZ;PPgg@Jy*+&m0vdU8Q!Il z;T>gZrket?2|QZT@FC9h&8Y z`bCB-ZIDnl;7BW3wh0R#pa(ir0H3XAP&D1iyRrQRpX-^>on2&~o1VG{daudl@D`(_w(PJwSkf0fNjb3MeTw_95f%{^pA7UV0@rcgqVL5 zpztgZ(k5@**H|^olc6ePh*6Nn*Vz!?nM*Dib8Y3aEf+iujpX9%1O!w+T z^WNc=j1_v`4&3CZ=WSDivq2a=r^d+J5ts9xo>OP!yyM!g=hb7v%-KsDmb6uw&mVC2 z(bUpYY}OH@Xt!Fj43E4es=~;7PhDLN164XRT!+t#;*7j)L#x$m@O6it_a3g7?3Z@L z@V|#!f3Q7kvAZW!|7>hbT>iGWqU!X*9fb!BY|LaNwNlJ;g}SYlt`Ha8`YWnpP-D@T zVp%Pe#d5vLI(iYj9sITAl(2U7Tyjdp(CdtM7`rI2v6dVMgmP3_xU@&>T`~sW)BW4j z5*SEb(FocE@YW2vkC zal2=@BeN1ctF^)P95kfNH$3}i=yE4Z?agbk8T z{mBM{3NkDpPpV;=_X34C$7@&o8k2k(h&agWyr^qW5{~&^1k1xK!XidYaj?S~T{Img zl*6H}D22oIBTxnjF~ZQiBor|kzjSTM!Y>AQf@NNSVG(P6j5+7K5TerjAmDCHc9B=% zaFv95gL zx%&Rf@A|lY*m;sGqA@6-@>rkZ_jt2%{uZf49I}V;xriSwKkbKFuf<4`4nZ5of}E2; z+Nsv+Tv8y{m?K2t+a&F1H|RMHxZoy1UYb45Kw3%Jcd-~CW$E;0OirQJkL@zPz;rgr z2m8xEFaRpQ?c)l8q&|=oRwtB!j8k{Q9R+sWIKDC%q%`URtv{wK0F&{*zg|U3RT*(G zR0(QVqI$VIkJEo`b6Ivq@m8Py6HU!&zs1=?|4%qWG|(u(NsCE5L!==J7$ZHxq*x%& zu%ht(Vx@@lZupi8Jdb`Dsl4!rr@MZr(NY$v$g>sqA)MywV~BrwqHJ6o_IgL}M2+-Q zye{2Sc_LQdi7W@Y!lI)3FRp)Zu0=k`D|e@MYUeKkV2p8Fjo4Dz(8ooe)});$rFlm6 zGqNNIPTxNGB#Y|F-bqG>qXA^m6#UY)DJe7-6%-6GL@+?P?CvI;19}~_IbdIzCScsG&hBV>XhiMX~x3Y#>AO0e;S!H^sRJT@F%FNkAf!{+>hzR7(NBMhT-?Q)gBL4S)oTQ)%JHR^lDt@i%FP| zxY-V=PJma+61u@@^_xDJ8}yy7<97cevz*4A%{z-48OpSes|hw@-Ct*9&fZy6XUua8 z=FqphHXE5U^}_m{C(7pf^g^x1Vw#=DmlV~LNy;)aptGv}twv!Z6;`|cSorQmMR8QQ z4lLm|@^+ISa_Tu?@!b=uJtjF_?2Bd2F<>w*+Kc*@d|Y;SoI2)k<*8WLQD$0HAFZf7vDYCMGOl53BP=_wnG#)z-OVG@ynKp(5X37l{maO~aq%+qGYDz4b6!`qpQ`AqmM zV$D(>tDNhm+GVbeRZ=vuApCm)GStgv<8SC^dR>c0V+D_yP)aPI6Y*RjZ*JgY3Gt6q zx@u!;Gu&|P!Zv$trBN~mUyBdM;#LT1W(DFJn%SQHU#LN1NI0&xn4J)Xo7coCKgNDu zYi7BXi@e*AL5)jyGwQxOv}T04$gTA0Qh~g1AH${F@GAhPGR-w^WvzLeqUfEpjuHyuD5)TB+9q3k0hP_{ z6mxnzWms1P3W5{Pji*OmB z#QVMU9riJNU3<8W_f?s$BFo{*fHBGLK0zfk#3@D#@`a9;D|+0yvHg>*$=l2J?z zT1*1PKeP5+f(pZdbOFP=TN)MOL>M#KPo80UG70~%GXIavr%X&T z!qOYa0*fsdMN#*Q7UlnOfGBN%a5%fLy5ZsIa&cHE<=l4Y>H>JNnKyJ&y7R1ACuQ*9 zdX$gS(JU9XhniPDDBj)8D@*YptsQ9FXk&RD-qGsehLLLSN6HT60yC8vCU;hnwO#1i zhAG(YaY0;dXvA9}al-FG za}KsIA;QS|cnldIW1vsQh6*-6LEy#dF`ITHD>duDm2t>7aPhncuT+%ZpoGpq53Jg7 zC4TOH;>xte_>{{}WgGh8r{R7{j|~InEH&#pD+30%Su*Bw)WXf?pawb;hQ8c+qB(t0 z!hM_B*vu|UM(1mDVq^H_8=js7V~)u&S9DPZ$G$Pb{Gf|63c(pF3XkhG;V~GgX?wz# zp}Dj-M*@X%!^mT-5%!t*bcH>G!=#|7WD;Q>Mz+twuZU9!Z6EN$O!hrX%+L-f!^V>$ zaVA-BB$P7tQt`rsn82m8$`@%#SQTQ^*1d)cLu8bWQ0(b*SziRE$NK=hS7m~cLGnyk zlLZqp42Sf5Xr71$zzcyttasse4F^JheGx|HZbPfFatSQetHTr6C~5nU%Gk!pWvQAq zdZ1BYFWF<o~QN$53aRwd$t2_&=A_4<0w-`h^ z$FMQ)?5ZRUAb~BW1!tXNl26zCH_yVH~d|56uct3LC6|k?d zA4dI7ItN^Z-zwWVKyGVWLjY}v!C6lvLy@4{)-v2Kj@qGg3sjcL+C;x;#K)J0r)*2s zI~TBrtv*SFM1#>)NV8B9>IR!QjjgkE|B(a!BehB$#v||5g0_HD)WTkF!9*k>T#Z^x zYqj$mq8SQHt@zg6e+0KA!Xa`p{B6WB#SAoI@@R8YH|4zPf@_6F4kCq$$jMkbpm!im zg(oE`Z+#I|#ycB|_WlHZZC*+1nc+{0Hu>6HEp-ZtUqjn7X2KVMaUXSWB7f{KiAyUOG%t1(q@8heWLm^*y&QwfkR|=ks>o8A~H>H4<&KHwU&%r4b94y zk(5$vA)Y`PAtw_*fSjBdFvsACW$oSBDvJk!iY#F&IZH$}9?V5Z zGU9FoF0u~W-3eDZ>r_i{CLiSqwrlZNUFHQ;7pc*9^B=n1`y6^7mQ{~2#SakQuj z{DzJpJCU<2wvF{W7*vxCgmLYIj4$~;YGGVGnCs40Q5C!7w%Lm6Q5$S^r(i1xXf-&E zoORpTI7=%iyp40P=p$5;zC+&87NZ$wVYJ+Bg3%zx9?_fZWfG=fdj@_b+Ri_jOC;bJ>WHbQEz2j0vQ6_5dJeVH&c2kNv_Atp~$@ZXu%Ld?%R9;vqqB? zb{F?nt{y3PNfuw03pq-b8ojylSZo|LM}H#B8cPMZ%}eUxOe^rq)O4nz{gvia$dP(L_8};#8ZwDQ7%V>z6nGG6aa>6D!g`RsY#3#Qc*ns- zc&$%uR#)$j%dZK&jgzbB6k-BmJC_E=>4%KMnxnNeMG0#R)=LajEKXpwTZ}Z^XuxS4 z+J}y6u@@rm5G^xA0ewRCkg{=w^>O)oi~msPD%?mgYWwb$=Iwoz5!!YArHB2N(3~rg zS&c0~qRM$e_;PZTSm2TzYVb$AZ(=jlhlClOsx5~u`or5+KiN{l>MJo@jjV*!SeT$; zy0V#t?2(164Sx-5cyL&(wG+gt%Tk`ehb%a>dvj#9y2YA`^iz-{B5sI7w~uI9&<3Cg z3WXr_8N8<9zcd$aL|u*S40H>!%_y_x1}x^x88;~dGP!Dmi?Ri4Ue194W%SBV9>g-| zB6z&jfcLE99=R1KBC%>B36Rmme#&s|$tU8us(dd&s`IFmm?}k>N1>ErEzeCfUik_& zmvrDR4!jFt#3=cNkIQ(j3Hqk!_9w5zm+sVOK1CIcQG>~?Tkt45$rzmgZwz)mYJy~@ z*QdnyJw{a648$r2V;3IOP=gDNYdmjraRrs&a-VX(=Cj7xA;&ng`_H)uYqtsgcZ1M2 ztUTe+iYk?iXLUynW)D7l1s47OCTzrw8f zPmR{6&ir&tlU-OhAwK2>Oe4Dk-r}Nqcc4RYQ3%eF$J+}j?FK5R4i*tADH5l0+?=pA zd=y#VWqkzG5K-ivk8kj_D&7{$5-n-ae-2XntBHpumkzKB$iN4rb_+@u z1RFXuGQf2L)i5>=TqR^{<$W(t0Ocphf{s!Vx=s#sVfgwG^-@3%qP zBy>b7jDZKPgJ59+P)oxwa)Sov-vt)DbO9)vv$v!|(?<+ZgGWgww{HSL=Mt0$kUnx4 zqEt%A3_@IXB7H=L8f=GiTu4(u$k+2DX|iyoii9jCyl4i+bj083K zp-gr$fmxAcOJS%15ET(;7Oo)lf@o6O7}a2nOge_Z4$-8T^8nl@fs+aRw$N_f5*i=X z;J+mB1_G-I6zsH=8lxKgS^^6Qe4`N3LlS1m;{w_!p$iCI$)ts3ko%t!z(W!kB=DYS zzN-ZAhy*@D;IwFso)f^668I+quZpI8fiBt@FdYRezf9>;5C2z(@(Z-oH%mcT{= z0|ZL)z9)eFB=9(aQ=-|@(GHhYN?_bv0Iv`!#rRvgLqNw#sF%=Q(L$>Q&?|u{1ja;x zT#_Ivs|2PJ_{H2vjcNq2rvzR};8p@98TJaGcC&cwOSy_o$jtq)t7SCPm|!%-ZT?e=}kkL@>{z}{q_Ja;Rn9a#%R4SVY$Y4S`0HQDZQGOZ2FUN59 zTVHleez}ofz7k)4mR}a~%Wm<7TO-J)oL@GJFQB&;gFeD${9bAJ#GzxPiwW&QP?U7U z;++O_2mFj@!m}L59SEw*?k|4^a)E~Y?gATNa|Zf2Ub37oF>UOe$mz1inD3@q_7lgy zG0wA5D!yv45_K%b%1y`Ow-)6rnh1kE4H7iib5+yL(u!#yv{#>)Yfsync=iow#q+5Z z+a*pBcE=zx#YQBRwN;`lQCQ%vMagMLsHjB>u*lH<%D!YArw z)FVP6@u?A?sFsOOpNLPp`E2QB&(4Cn7&$_@g$1rTEP4oOVnQ=f$%du4K&Yq@QD1&R zh({=KG&aSA#~*V`dZ-mGb{RX6(#a2JdU>MHR5>ame4(*ENu>)jhz&K?KSLHKFF1;a8wEI zfJ0Jw_;vgRmLS6>94rXmB0oHa5wC?7-6`Zu@LsTkkSQs6u%*Z`@Jo0j(4|d_e*Pk+ z`{xuE!8_1XQkXU(i5etgnYduAYDoxRL`JA43jY@}Y97A;@+bT_usGlrQ$lFr*YL{D z>b?(K+w`BGRUUd0BxL)jD>~b^YYp1>D%KRCdn^p9j82T#i18pXrdSwM9i12t6NC4h zg)Rk##$u>LI#K>W6rQ-pN3mjh>JOr&RU=qs3X!a(AW@aRt+*nQEC{z}5Q49c{RcmA zgg>;1l7U2X#@$oU{27`qrSM3?wcOc|9N`PVGQfC+WNkuW6#NWMD&hpenh-M3v#csr zS0F~l*p}6(DybH_&BCAt>%{moG43PAC<}v{tc{^@plU?9jwrvjP^i+{D8$Go#t>q} zSr}ApofzrF=mreQw4ptqAuCKp*NNAKc;BJVLvIlS<-4iyI#CY23KX(#$h0z{;_Jlt zh!`&sqtL>j0_?>SuP=$74lmSBv&nC(x777(M(xD7 zfEcmF_@{+Iwc5haAU-@Hg(!8{R|@^jLZNc)%;bx|0b?UEbPIzTwiBb07*7%7RttlQ zv=ie`#JHCjehVXRuGSKzh$vHu($7MnPVLO(dSYBg43~vLmE4Ijlo*M`IDlr6B2=!O z7~P3+_$V;m&9G3YojXx}dI>1iM0wJ}pc3xH*hP$2kD6bPBym07MEhlMbdoB< zJg5kk9q^E)B3zijN-kt2qe@A4x&P~p?Ee-ZG7L~?edIOmVw3K2OF67WGtmI)G2_ro z${EN{Smqw!AwOxHWb>MH=dj8Vi)=Pczd^Bef+IrMp*GyuENO1I{tRwB8rCS%kLPY- z6Wv7J*fxyXwc6sS70LTD6mfK@(3y_DfSO5P9xgyFN~A%XE}!>MR9g!Ck5rbPbXY|n zhE)_?+)#=>{%u-d5Ea+s8x(Y;rx7LS{se0$A-o)gU@mRpt-lk!FE-r#HSMwAhTi8- z*oC<_TC5u6?t&;L1#bU;~h0uOO9f#K$j=}Ka(S#4f35?)`;A`4^(6sSgY1;(LeJC*>> z2pc&yc;%8m-$A5Zg28VE#Y5ub_(x4Ml*Zthu#;4Rm9 z(s0S9TB6+!LJNip1T1Fy1XNa+-TCi_)qHDMNhY@TzilS&f_zc$$gbZ$2NQSsi^ar+ z4{8<o;bn=aO?Zrq#k2~sIf6jQ%;y@oOQI9=pQD-jjH z>nXwPEl9)}$Vj0|&W%{EO|9XZo50&!9-0l#5{I2!6+<^`C$I;x=RC`q-pe`Sp~*lH zr`TNY58VcYoa#OPYV)b#N)N3bnqfIt{A%z@(0tM4v?D0Zx#G8**+QtdvEpC$ti9ro zv{Ft!Uqbb;mi*VE!LqPwd|cEkO*b7=jbRfZv!J#`Qbl~Hi%uw;0qW*Y=eQbW5EZ& z9b!k^rWhM=RjURJ!aJ~AwP75R8fl_4Davra9AvScw|ftc*88h#ulJyjYOhZS`_V1v zl5F}#slm_9{TXnhvOA^40BWOC>i>+!$<0YiV9Cab9m?Q+Al}=eX=0WQehP^|veNo9 z1F%KC;gTY@yCaOx_KoX>oph&{=~caiU8d#MT?#Uw=wZ9WbRNcF=K&C2!2?S_-ee%( z;6EsRcqBp%ZV-<+yeHTdyT8CfCa#YWCrDkL>(zIL_u`WVf)q8v;}Dxo7!txHgK3J7 z%~R$GLCq1>j7f(cc5bebt*PbzVAjD@LeV>DNsM`MrlQ7Sj%hL3VCuku4+g}^*$rHA zE{!ouQc$fJ3$*hXKD2PL!Mm7+P)CtH-EQy=grIN`E{JB!>1PU!ec@i<3rPgc3X{NA zMyb%+{qp~qGCF7Lwx(oGx_vVdH$+aldQqb}ek5dzH3#FUJ1$J>qkn|dIB%A>8^>^D z0G|}LQ35~2B<=bXktKGXiV#H1(mSBWB|#4$Z3Im?AxpYIt!XZoq=84KFWSij`d5G6)v%Vw()EojZ@ac8W>4@J79w%(Qvu z3D-{4(eByM{r$vBATvn~j*-&=mIC2VVQOTp7I+QB&xgL30bhv1_6_jq!1>?6(Dc+< z<%K__FK`!rhsYY?bwDo{Gk!pOyy4H5Pl=@%+zpW+#Bz8pp1@IF)GyQ=%W?yo^;9TR zWw{=Gfg5@rddIF=^Ge#qjmbFRSEplYf@YUJxZ%;apmxWE>0n(B?NLaZaZn@zW26wR z)70PvpwyxsX-A?HkC+F#x0(m=&R`-foD0GYpt@zD1TehUeiaRXYuFsLG~)j)5#dF- zE&LfQu;tXy@})<7DSC&K?*k~s8N&&O?3X=#qPaFy<=;*D5`Gehd=oqH;a8aKDAi)Z z#A$iFZ4+<1j=^27^42&UeEn?lM7q`|)8pLo3!iOd!^KkgxV#7w8QJJCwd5u~#tT-q z@P--V5e?y2)V1UKl=>U-np~Q9NL@?WQ_0@;2M?HDhT#z~gLYgauQ{mWSHce1^bRuam>cCb1 z;$FqX*=EHArMo#$RnF14P(hA*=0Ia|Dh_p|8O3tfC(x^Sp)W4boiYI8pQpb<46q45 z1inH~vhK|jR4lwZlI}~SiwztAK9iz0F`=bMmsWw4e6uyI^5TX4dD*1WY?l5`>8DMC zYXeyowF&bUH^EIyG&h&=GIQLViB@u%dK2*$`f#D*R6Ma9OrxTTC%cI%@>Rt3WCzCq z2gCrHC&ts{Cwk0zK!bg}ALy}M&_{C+XaW^;?Q?N$VtS0f5$ zx>=Ztxw(S0&Z7+wnsR1rnYJ<*^ZUs0hyPXnj6*9ZL~`U&bzbNLF&So!?W5Rck9`O4 z7to!r;X#1SDnAQXbnq&^&SVJDc5nDkXv101!9+g6KNk8`Y_bUac?^L+^=*~|P;ui7 zBh46(&=j71(6)~1g}Wgy_vLScSD`T)2d$HhKMCtiUI?)fXu~;X+?%BrRpSb{b8xcG zSSE}T2!TVxEt*@p84QSXUPt`(E)CHuMz}Gts3nhqxoRtMHZZ>qXCv?M032JJ504uG zsHnLkp*Fw1wt@&XhO0LJO+?nK&0lZiRqw%ZGk@bAe`C#|xDlS(kscm-z!$hE)#ks0 z@B29f^DFkiqeSAKHg&?eXZ@=ij!E@HYiK1>8eUZk{-#)?W?QL5`>ra(t&Y z(N~+ltyx?C9^km#*k6x7InWk7Kd7C+0Qidw&P0qEWRK6X{0fn-y4g;a$7Jx%6v>b| zlCgMhl-DAZ1d`b$ZWHykO1q^7$^L-SG!{2gq#GDX7cH*ZnW&J7imb8%BF!)>4GL#4P?z;7Ef}lh}+oBn-B4xv_c8be-FJLF`-)J2(>DNgf2p7GS_gh6G;< z{;Ub#if@sX$Mb06+xQ=|Xez>ihy}spxJL=q^;*@}5?a*1jpaz?a(g+lj_ru9MFLmL zbqM0uR|M{mYmmU@i+ZMsrH{4frVP1CZMpOqgm-KSi=_vAd8FH5t0*f{9eV&0N2*`k z$vhSbbURCE0YV9A*eYt&u<5h|O2SQbG|!Xd;B2~Ay3fKx875w10i+Z>jw_orXka*> zYDG&8&4Ow`3DH|fh(-e9g@gdj^S9x$dkpXVM$kNeN6iSxgV3IlJc+)?--Mx`?WrAQ z4gDr)4Co?!mqWjL&q!|+FQIl+f*kiv+)LpIg=mQ&?-s+gJ~CYEYW;h~u&a^7uGYUJ zGO+4v{o4d=uRZ8EgymSR7J$0QSoJs7`jM-EV$@-+wR|u3vN2Gx^sxpi@~d%D09k^KhWL)?}!y;6UZ6;^LEL+betF@)XL^tt^5W2FY{KV)mbX5o0{Qtu>vuFz%I4M7&^ za|fCm#w%BxO;^1ri;C*pfe}rU8mdcbsK`R-JE;jm-!UgnP%cVrt@qAAV)Ky+O7FHy z!R`+cLKBp}Z6HuN>PrObr(Z=VZ2QwAsxiCToIX*xvhy0$259L;-og*8@2^f&dY?y^ zpN6x}ROTaNaGdZ_i}CkDZ)D5ILe8NmozWB z7;z}lnyva*xr(=VYBOyf$P_%V(&hmSxzCy>7ntu%wPLauarT+||3S85mA~vAK0&i7 zA5XWN1=A21W0-ZG{@pjQ;t=Z*7`&huWr*`wfosHh`b$nbiFI)tn(R1C-y82@SC3+7 zG>teoJ|l{Q{#ndZ_0z-YH^o~=f9p9d$`eH2HGF2t@Q^VBo=05}+ASEMzFHj~ZSJ~G zdBfFcF1ud2yk`mq0$3a-@tDxz74*E^!M0SnV$GWCm0xQ?005^%3|*2Sx3B~K@nt;{ zhAK0KpXGUY?=T@pY(p<(cyL`FfFf#m1@T+r#&B#XE0?ZQyHyc%`?gvH-8Yj9^JzUiISZcjDED z*NgdjK)jM<8GNl4uLJQqj<1#CH5IQn@bz`P@;E=j!>hsdr>K!G6q}Q;fYA}zj6RgU!M?Wbh>_^M-^G|(CuM*}xoO-lvTgK2th56= zHG%m(cvKBsnD8)aO&x0p z(5(INoADU>;yzFcGYQJQgj4cC6ryI;irGKVbN=IU=@Q1*z;hc?k)q*gLDvn(S(``5 z!C^Q$^2mrX%sBM#UWcYpvC`3ee5TSZcH=~I%}gcH)nxu-rqVZ; zTR3SSrzb2ATvfc;m7W(W{K1kJ=|y!#=i+R0!&XSB#pKGD?l}>S{m* e#aGd~FEP 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�BjXz19&Sw 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

        #WWbUn6fS7^r(e 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⋘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]WBL(Sc9Y^E5-jl6OC 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

      1. +s$D9=^+$YRNZkx|eMM~}P2_2XZ{Yo3E>3U4UIFK~fIVR;>dLp0ldY+wp1>t*(a zKK3;-lJE`7Oy;OcUe5NIA(jGFVmW|^X$f3XDe`kipus_(9Z12qsYN|*i3sc2HYfG` zyVdzA>81LqyH)!xJvadim7&O#Kqx4W!|B|`5UwI*qxsEnJ0gRqpm^de zHKuJG#h#5En~3O8B}x%oZ<(boOZjtwJ~a!7i5BQi_W*O}mg>TLRL_)03$&llmG|k_ z?g7*EE6|_bgLF6Dr(^f15&k5x7fOqBXU0ST3R!a4H6xS>GF;E*-2l82b)j2PWh|o( z$b=D$d;vi;C2+F;;n>drY__D@g@VlMaK@NtHRMKMbF>N%N$J1&-WJ9u#TCi>`&a+| zgx>mlbwSGgv-RJ953)EiRJXYoz_p#N^Y6v?lS6eWzMD=S05ZlQ_ zPu-KU%BNrUsf$zk4ABRC;P*kkbsb7n=VX7LDwDky01o3)2Re?kv5XwTwPZSA47>6$ z8#l)w$iDUBAaOvHO$oGPJWf{3`wn;@olEa2>8KcLxsD#qK-BIfwDt zgmK3E^Jg5M*oZr1#*%FqJ;Q7E;`gls#A0X*UW<(-Ss2NSjc_}v4%ixVmRVyN14$<| zVktQ{amhjWcgNw^z?E|d1y~Pvlo5C{E~AXRc{xI~f1bL)Z-#;>DzJg|!4M1K@RyBS z`EbmmoOR^mG%z$DyeRuF-J_uk@#%7OwK4lA4;CcE0^RkXycy)ReT03_GBQ{q1S#d}qmbvOB4z9k1j&$(7c^{^kim z95@B=M44@uD|%yLmqspsMwPHHtcW#)h3pjju3~<7pY%h0pyV1|sX1uk!QY&-gBSZ4-gD@-B=Ip(;Jnud;fIEu4VlSi~)nwujk$=zb`m_E`{F zmee0Tpt7^j1g0^aG_;H3X%RccMn9$#AJZ6)1GQtdCz8)G>I-bx1sGF(9dUZ-L%dm(OlDC<$7muk#?#LsH2;n+$3{j-;|TYqt-= z^gpR&GlKn@6I#{2Wm7@zU-3lm*S^Hr_*qPn8=LShF+0wvo_}~c7zI}LXj!qb#^#C* z!WBRydk~#UzoZR0BkfGi5C@~+jTT9kD_fW&f}_nS(6?9n=3#fm<_#2vH5r)_%GA&Z zuS6P~A#EmMbxa|mu8O#}Stj%j-r+r{ArT&+HZbTcB9!Z8>=Id)LwtVR>>_+=(@C5L zxYc+!!VLLsienm_A(Axz|0vEA><%T`p}KcTGeUZ4B)xY@cOLH=b_C>G9vWhO zb^+&KxW@!bHm`yh*(^rLi9`$mzk>;?O)rsx_BrkXL?!wS()$lMO&AW5AIWQT%TyLj zKw}yGM65!9z&8nU*rLWjt^^~3vBqNHk~;o|kMQ@IM)zpI)50Krh2!3( zG{v4jB%`q2yA;2kAkU%UruaAI;RtcKf5vA+`F-C3$nNnsLUupncVV;wNn1DIuxVTu zEI<@6K8h*gHiK_9L%eWe^dKuGW24dusC1-VDcxSYOSX;<;2Qyo=JJi*8s#}x>Cxx~ zeBJcTCFg}hD-mnGa6&f?s_fQ@;!EB&!^{T@!mF4|=LJ=# z;aF>b+(Jp1*eD=j8<1cvPO10sX&kq5(6hCFUE%V*W*41%G(m@8Y^ov`-mYH{st%VV z>hc7+*xe8=UmUKtaS|k18W7l;T)SSUg;WREfSXRn^sGygGxXIVSRJO_q^E>bzm!j> z@R_MshE#US(^K^Bkm@y&7fa;shj_<@tbJjg={D!()n35!9a(`B$-X=;72>vEYfmT6 zCVg$N`)2%Le2#|v8z(jp(#ixIL8;h@r%WX;>Inmvy?WO|mEr$u?dS2W37Uz|!Zr|$ zdh^g?F*n9jQ7#e#>;S2ZOm)h(SwZo=167UQItV<1sb^;xMGEG{b)+p>`j1|l1oQj! z(DX^TGX85>cN3i_i!#d<%K_SK@lLB9<*YNGwS%WuF2bJttL5rkf8N|cX%6;HTqRA+ zysoIdDY9IDBi%AohrJf&%b22YG-ly)K2Qv^-Ta10H<&S&aY*C=Y^&oLfdH)k!ywrW zS6z}M3rP%oPCkY3?a}wUgMUFn;ok3bAr_E<>2XhW6`X+Nxt3d)CRl49=JtW_yoSej z^#ca<@41uoi-yX&;5*0x=rOqOgzL-1B}kA3#xh>%qQ5rO!qoJnBYMU|m@uAqi+=SX zb$#mEjFb8tQ?>Ohod!;bC!g3wUt&U8o;FQSGSx^>z`krt#dFTkv_*TX6|Wz@y`=7&|Qj>H36>Xc(0{m+kB zL9IO?qwXu{QLA9Se(GV>cc^o=!`C03Kw9Bw%MOP4=c*89?@|(VTl#V(Nm&n|G;`Fc z?d-eaiYFhzwgXcMA;iN`+Yws@O&rfbSGld{%CXCtRM#1rex55y9`346{7S2kM|!qA zGSj-rWI$9!R7`lR^RdjwZtz`75b5pKX`r9|U}Fk|0I_-HQ`l6_n2Iov0(@0&j}BzT zb}v|!r+x$RP?8hs#^x73sAkW?2L(+_Z92MW#~0dZ6`{E%h*bscV+2p5dPTHUra#{ zFV51lD^zcPZ?qheFxBwB<5|0yc4%gROSz`WKH?Olyl5+8=og{fySaSSmgG$-CexJ{ zZ8I0A<7KONH~y=rQyaT33NU48x4D=&^%QI}O`3j{dpCL32D159v@>O~yo~yw+&le! zGtdK}$veuuA13cA_wFzQupvYGkIX=(yzBz>T#uwL?c{^F%Fjug`URKvsP|kF`p!gJZqmNI#Zq{ zYRf~sb`AosTYkB<`w8_yeqWRif>e>z zA=$uYHLk=uWiITO2p!rWl#a*jv@h0&J~>clE>Yg(fqKdkj8=zo)-7G4&P`28@1$2O zRryW6r$m@LTmO5h>eOTlKeB(&?f#&8_;+t&aYkS&I>i(0hQh;vsrV(?5>?VO;FIrf z0H1(_dnXA`A|}aNYfpM3hIFYXD8>b=SQ1mVos8utET3d=Mk&LU`8N9<0gUU3II9UF z{KoLKGh(h}%s)3VOZpiRqZ#oxiO4)7VhSVPk%%mFF)J~Dui%Wloq0nV&NrNIUY!p1 zN;Ai1LVbm+nt*tetp*rbGbdky!BM`Wwg38&4a`Er9H+C<6+a-zmE&dwr@lX7`bLWO(v=N*?{u zA62X76iBNrAGb-gh?x4~?imWl$v3oshA0?@qn#4~rVwAk%S?hhJeAG7cQSuFB z4~A%;MctKI;AQq7R+ol7BEu zR+sy|JIzI8ljKe1-Ve-0WRK*J%SS=-d}J=7tdZ$N-<)!91CcZ7Y>~6b79eMcoXrrv zo?v?vVM;WuGejh1+TR$NA})VU1-dfcV^}+eKxU#{7!jO8UG`=dX*3%>gWi9Mz25}X zPtyX~+K{9i+?b#~;SnZ0c)guau7`3GQu+&67C2L1<~m`x$t#d@ zBau5n$ru2i!K`6eww(a6pPdmaTR6jVTG)*;N5Cw_*W4`33GLR0pM~*|AoHGyg3J&h zsV#O!b3#wsKLSncQ5je-3AqaOGGkmhg4PrQUDy9dpDKG0KsSb~-yOvj1p6nuTDUg{ z#*?CRk%`3~BLyBb&=@}oCkVvIB)f26B-6%-!1g@&N-&Zp7{T^R?G9TVVg)}m#LGE= zGLDy$HiVlY<|0QV#4;+KW$$5KB6NJj#Kj z+WCZrVAi+9A8$%@2((wmv)Ak66VYGWO9(EK%&$cM1<~f@7135GrD46O_7@zNH^C;7 zX_!!66Yay{_rEb{3nzJBB#$RdFz9da=SQ$uk6z9UlUMw9o+z(Nx1-^?nxHm>Rm8|b z6htv{O`=`DAx0*%#%p6SKkOk^)0i`1I^(wfJsGmT+G;xmj|k_4Fje!qt!8!j#zv~! zEF(*TEJkAV>q!;N95>e-Yl{t7v~t493HCx#P{y5<5AiELtS3>n=-;(=L2bx+8-xgu z<8J0y{T)>64`9$;wH$n!KR591NRWdIo52`vJi!jgVJ<90P{jKR0q5clPe=sb%|l>{ z|6Efta3SeV1egm&fE2A3spcq<9NN02#v_Tb&sl8IN{V&!nz`mxZcdE~GjEdSc!Dz% zB>~J;05dM+jm@6mO61M0dh;9r6P~yJ$Cu58ge2l!|5!F3RgdEV<=b3XfMCPB#gseq z2=_($-RD%RmLm`j`Q(Wdgw{WS#HM$JKL0POo1dUl_l*l=HtL%MD1%t zS15^h(VSIg#f$uZR3cS=5FpR{vl5dbgjHcXMgWe#B*YX>KC&O+A zokh7ZVlBD>9OQk4%L&o;XoOCC0qc~!X&MO9r2R*4m(eu0D(-Nyx&l$c76pfXjLF^G z2>6g`FF}AgZ)H@jB|9FaCk>VyPoK{8CmNKUiU8PnJj`@r9BEIh^~x9Eg;qEk*BybY zFA)WkPW@@)6B}!Dw5+!9c;RG#r=w}tU(cTP?YH&g+INtIP&-NHeDkBd zh;rr{3d|VLq2}YIDWj5-N-r|U!l2c6IV*+PHnyXZea%r$tD6?g+#bChwa~YNZN7Ci zERIS(LZpRCwnwv2K0eqD+oN9|(vPlC=Qk0y&+DOIU7;?xJkgwtEEx-3IL$u0elaH@ z(g0FDw{5T1A77Swe)d2J!SLjrvj^vdLCzk?{{aa z39^uBIToETwKa>jaZj46CTF5xkPOal!P_90C2%o%1a>}LA9n5)p;f9fd7+38w+_E8 z5)eMw7S9EN$t>eRnN?I%IVpSKG&K9^B=EGppvM3SeAcCWBY{`R8wq^YAcm2^dk^7T zCEixb8|gcHD8oqKdGbd3o{BdBoCUx$rNZd=I(@}Ukjtg0G)lGy8VRf$z@`J(Ob1wV z*j!JLAQ8g%?upPqm^6HuoIa2eT@Xzg)`jJ)0qz;Ym( z!ob;q(>5pQ_AjeWeajb~X8+;p8u-aSiFv*(``Hw0qBGg+C<1TMo=7S@q)T7M5wy>O z__Rk+Nbv&=5^i9O&1??oi+L)KB*+CS=B&Ba{WvjVyl4Fx57T7-LUKoZlX%?-W>^p| zRu@!guqB%724#LD2$r!IU+xq6L9RrXACa&_n*z5@`%pj83cDW*?@6guxE zm7YHhtqfJ&U%npw7^_|7v;pO3_W;v5rA5`3;NAuj1H1_#Gaf0dO;Nq!6*VbkPmXT; zs>(ihrM*|i0Rp>``l?q|*OY6H>U&>RUD7W+dLkB>lb&qkXWGh(F~z4}dsSVOGX6sS z`K#)l+j2iV4O0_2X-flav4Dp(uwL8>EEd%nbO4V5TJ{I?AeXJQ2s6|XAsEGInCpV? zKK7HnmU{#XJkH{>?YbPqs#m_IdbReML*Wn1H`>HF>1)PH9{vDjjq~Yauc_QjR|j-P zL5>RW&K?^(!kD`9b@cb(kga<*yx6F_hng2PUivEqM6MjztpZO3%xZ4OV*U{2a2uep zGvb~g4nGDNvv=LT!OZq2gb|)QUPZ!Tia~1-WIGbE#v{}ZFCq+%)CXTFiPIzbuF7k` zv3n!=?pb(&FOIa1e557i@R2@?kHAWRl>Gtx@Z@La-NNv!sYQHbmrdX!r%oPSt0wZR z$FA%7=vQ+C9|O~FEMvyJyc_vhP&kQ?5f$xrSC07Kv%yzM&5w<^3<9LL*;z#hETyu`r0cw6}j-?&p-`6}On=-l4GzVMGo z=-)SnF5;{lf4cui@+pT>J!W^amVOr`XPUW+Bw@`Ag6@W4Q1pp??H4aYw-I6?MYKmL zwt&J-BGL2k#cQXST~WwZ?1LP^(|Q3Hp7SHlAnBJ3w)wIgRg$+ziCLcXcKfuzYp4)s1Kp}r1Cl?}vT1!OY@ zQ9x_JNKH0FeOYpv#_Wj+Mp`YV0}9`^VBk29qwHw%K@^i)W!tsX?t(zp8&|>VMJk^2 zqEsAOid|Pvkb8s;0cdUmaBczs)?Lj>IP0KZ_VP)Qs^H15oRF(v(Tj0I=&a^ z%n6$u0!@g}#&^*Ute_a!lCqtQSEH;C>?DkT7V&6B79g<}dd$mXs5_fTx-u^6?&>9g5H*;NQ)MbAs9Z{%B%4oOLGzE;39 zazzKiMSCOOy@!kMnNw_xI=Iza^VhB3ui9+&e!YFG_nX(YdJpy4>is*uzx`&b_q*HU z+RZMRHm> zW%N`0=)85Rbu&9ONKH?#1gsYxhSm0eqvw$a^x?HCGiAZGy74-d-L?+)52iPWU1Zco z)t@(o07y@8gr2faT`=J|=WPNp>E$IR7x+<72{1dfFZni0k_DxeQUyoUq^uf+$%(lAbNj1KUO zHY^K{(&D!+l(c~%x#aR8mswP!-Bs}UBzG+!?I;U2*oLNoL7j5LG(zQDZc{2RL1zPD(%ZBO$Q?7fdP%P<}Qc!7e`-M5X}6XKoGhNR#nC zn?G3A4f`TB@WfgS?=GWgkM&3+Q9dBb3ebLd;W4JTpe;ex$Tp!lYM1d~W@MObJs8*a zfUbcw?50_B9LDqn@4#1o z9PgfHhrY$l0?Yq5%xL39(g!eP6R`(c;6p0d7O%i#!rp(>9(vjY{)f;-WI#4k1$N}I6AIx;@>amuA97(U;!N)@GmrPsiu#6S0a<$|HUKw)LknRK zP~-TAjk|yolOcFQhd;e6zsv~gSK~3T`~-6(ki)y=s5dc*aHvRf1-?EhOAqz}+pu($ zpA@~5D*#w2=)c(`n~_nI0kef}3NwunSYQUwcy*L7#@bHD`YAnoSqK}NNV!Kmtm?@oZ>F+Un3%04CwoKiFQ(~=a^=?8m()vUYvLH1z^M6`Yc z)Br9S`g78{ozxf37(TzVXNb z*AjbEFR!;O&zI5&C@Lh_tiU?>H)(XWuN@Q#TW}mlYhk4V)HzEmPn|ds%iX`;4M1x5 zHN3e|ne$}90#hQ0t>Mb=d40G$>7`%pa$3%r)q{99-?T$n(Bx6XQY5zSdRnIRLh zflg{`wTZ*1!%44%!}^PSQvFP>l7J@=5T|5>S}x~1o3-Kl$U}ZR0lp>RR=WfOh4@W1 zDN@X}PPTZeE6@7wb=G&gv%b&8H`*Gi3eSr9x|7(=;o^)3+vD5cRfF0op_Vil+=3=y zFbzKH_%mprq@bkR8*Rbhv1u=YE9bsPsvm3i-6^Ffz&`_+2sM%6c^qKp1;BaGI4 zU36*{=DSBa>z-BEde7FQt5o-1BI1W-vn35gyuJ7&ivbOay#A{HRpd>ZRCoV>D-sj| zRhnJU2sJjC3!jn}yKOIy@mpPK%oI;g2>*9_fb4<)(t0#RhyO2_Kid31V3rvLZO`Vy z2+J8i*#eP}Zvx^!x(#f817$#Bh?x!4X0Ky+~{XEsta7yF?5$LYACyZ#unAdRuC|xf!XF!N9e|d zztn5ex}8X!lO7o+$^mFxhNQW2elD|b6Yv6*1(Lq$t)XiL5oy2P&&A~K-$L0r*}#Bg z{wRs)- ziYrmJn1hL&y@3jm-G%}~4)4fziOgZ+>t?Q;rVzi@6L9;INQIj1IrQJ0Zj0CX$j?%z z|2OMAVp~N0&pO+)PS&*R-Yb%QnYgDD>+#0k*1K_;=lsp7=n(5Mx>0jfRwO&RCE2&>=$4d{b86o* zdEb(6dU)O;cA8w8 zw))u}s?&&gI$nt3^gum_gFoPx*YQz%H%43GEyu)j7wIqG*{STKTfeW`4s^6t+wyaJ z)c4O5q9etvLTT~Pz$&x|(f0g|o^17P@2d(oNuQ3H^?%-1-fL;e2hw$OKz49S5U}ho zL11rNR7}W<8!Mqe5r$M%a11Mik+%W;ewB2v7`CDQ+$U4 z8)ZkpcQ2Sl%#w%iWzzfKH*cIP{p-?$x zqZ>Vm3$&oG;JQBq$E&=!MxZkWHwc>p?L4q8CN5$z#GxsDg*v^YlzK*mfVGWCP}vBX zFh=DhkkdazcAHcP((RgPqp z<2Q1*%ZVaI*V6{KD<(R9Vtep5GY;dV;?*Cji*r+R;Gi`V0Kjv3DGD+s*HG#5?ulh= zk)ESN_TuGrRSRa8oQD}@C;ifgs%Y9?b~E~ySrSDjx_UW^pNZXG2UAGEbf5*>X*a&p zrvc`P`LL(px`vIql}KY1FpO@GMPm86?8eqKfLnyyZkV*Tk!>Z%HV2)SA8EvTnY=hK zh!7_=aP7lxJR1;XYM;9uGOgHX&h+9+y)Qv~4IVuat|VkUL!KF`lXt0{l)Sn6B0T*{ z+Tw~^@7fy%GIs~MGtCmWIc2Uj@@j}5@xURs1)Ji+CbSR`nx%R06E*ATu-p{i{pPF! zo&$Ic;o%Yd;7zCSR)N4t`~>lt+5r?flBB#6#9e9T)QUn2$A5cr~ij z&39vib0h{OestfhdNi31^z&m%!;i;ytMnT#$CL>%Xcab9B6*7K!+Kn6p_V*58-g4| z5g^mV60I*&q6_PznGFN3=m3W>UBLFCj_p=$lPh)GPt*n7uwRo@`?)A5qL0Z;1_;B6 z=1Syrc9Sy-I_sN1kzDgWQQ1vqvVz5x`ngZw)0(=tdvK8{mN5zO6qUaFa%17i zm9gpd|kZT%wbU4h=WZp1-HvgBM)D+oP=M|}3j6r5PC z$3Y;_{L4s=a{Y$)=~xklji;G?9-JZcKUSjS6i@-;ivv@81~6X`n8Jp@6#N31k2?HM zV0yH#hvp1OjvP7>t6c(vm|dT!uIE;wqBt^7b<&OZs6PHP!vqoAH>cxjK=?1_A=P{2 zkm`hSV{q;cO0_wJ%cxs%Vhyuf6Eolt9dW>symanosYh@MhgKcWL!CAyj_Walku#11 zPw;-kg~Jx)eeO|zv9Vz-N-#b$p5cKU*uizQ`ClB_;qXgvw+t(`1#kZ!JquT%6$!LK zMG&T}M_VK;=X}@?S7rY;=IlfTestyXccm*IA%6Psb=1L%yUO zg3?Hr)^i`qoL%_N6TFNu4#|=xkwR8Z9)wY@&6{9(uKY&w2J%rhr*X<`*Vg>TDP}4r zv4yFg5u4%U-@WNL&QZ^68mLMQ)Idn*!{Kds%{D)v0O9v9h6L?fJU^CJh6~%EOL!Ir z@QZ+K1T1h~=X-+p;nnJkZk7XgRX!YF%B!ru5NDu%N3r4Bru{4U~X^0Mo zwjqYhW1|;o)UIwbvFAuJC#?-s*`j(Rn1I)6WYWXnO(eTjm3s827%C<~aB&TCRVC1X z$$@z-c40lioK>*9P;FY6lc$vHScNmTrrxO4afY;w!nCt`kxykF%Ljl*H}d_q(G z27Gb`ll%ueVK#f%tP-Usr{X}&?FkuxxY#)n-J)UlV2NdR=1GVd|2UUt?KO>!UB#V} zl5rk1xph^b<}_#;J_JZzp0%6JmU#aZ?{ILG>Un(=j?C}Cm$76ge$h&<1!Marw1>&p z;nI%H2uwp5sX<0Ku4@~iU5K|On4>qr+$iK{cavUAF2n&JbS=F^asm2@&CcGWC$t1f z#63|ggLGV71qh40M(WAJe8%p|0+8j_Fjme2iD+X`d3(~ z;tWm_+9QB*HVQ5yu3*jd7_dx!r zMsp(qE31x{@+>ZjsX#GE_cx|v6Hg5W7hp>|$wrt&2v+|q+PbiE!5h|^qOfg=JC%@&d!Q|+i*0PBe)V&e zzj)Rwjoi@59KCNpys=j5Ui($+%u1j;LX^j~GS>lHE4yjGYM+|D310m7tIGlSc=(M}#N zsSD3LjD@s@neI5Ku1a~~R=wt+x(u})J_xrVc!nCTPjlfVi}rXn}u`g4a>F&&|nk0aGsYBUK7TJzm`8# z1;^b^3AXQ9cRaIQK72EgrZ(Tt8kVyt9G@WwXzWSEpf{|d2kh^2Z^MOagwfb405h)t z1AaR)hmiz3R27f(jknq&E6ODZzOgvAc5NiJ3f(0=3WKqld6;kJr|t6bq3TNc$Sjn= z^t}7{m6ct>N7u?Zv}uCnWVICmtWu)v5*GMTv6Zvp$JqZ3iQ<5_5nDtI3KCE*`-9^m z$Y~GpvF8Pt0K6s>O0L+XLj;mqzQCb+bi_E!8i6BoEH9-`$F-m1cyS~JwefwVe>AfwswB8;eFmw)v%liL!qaPqNfq~ zoUNQ0-b$+jz@u>{Odz~LD9BhgVTA-Y-u5CO6Ek?v|3}-mz&BNF?u1+tT%Efk>` zp9 zGJDCcJn$hw8%y?>0%j9^`nqI4?kvIymsY!d4ZU`VIH=zowH6Ge{RAvIhbKI^l@b_@ zvG|P7U`D=Q!C{R|5Ocy4?t+mOo)DqoOn5?#I`J!OUzwll(emZGOr$<(sm#d4@v+Bu zCf>kXoAyn|tB#wo6lf1#iN1xE0ODbJsZ6(qJUHQJT=L{C;TffdU8RLmQ@vA4YN&zR-5#Z26qXi|bCgjE zvJG_|r)U(GbD7G78rUr8rpKe9X#S3R=e9%2VkB;JSL9UTk>-a{X4qT{jZJepjSTd^ z9agP7(3Xo;-#6B2{i2i_?i_UV%?hq}q5ef*PG+lC4qD*6Gm6g|TB`}tlVs~YW_U+ zWWqZ5Y{rU9JMix2m@H)(X5ZE7h-SPLel<=5DO2~;1{_+!JDRP-{=$#iLJJxzrUp3_ z57-q9N5vu?3n70V_;y+F0UeBNC>tWw{NUP@wBtK!{@3pM`$ zU%2EH@{UaoER}4O$tt;_tmZAH#qT|R)yi+JMK?w6q~68it|7w_sV2i(8YCmf#cWxw zD)c-!bzaoNgC}%FZWwIqO&e*^LAAspD1m~yf(q)ZkJ0i!V*zOvk)n^O7qwV>&O$$e z`2)%TB?tCNvcOPB3^&4$NE@uGfCH14|0W)^;D%#8_L>fAxCIwav6pxsB?0!}Aq0YN zDy^dc*))Rk)k>WPnvS>0F-%Uh{t<)?M?b9*TH}0!s7oqP5NIMxLm2XihKrUsKf~OS zrX?sn5jt9otQdGB8_*4hF+z;!G%i%A#J5kf<*}#X1=6wL2kErd$sS0~b9=Ge$pT$^ zS43TR%zA$R!;~nFNA*NOLS;gJ;@9=mlrx1W;hTf(il4H|W3$j2VeVqDXXoz|ZzaGt z)q&+DgoenW2w}wpZE0vXR0Hk5EGMb-?Q2o*Zn2&(AERzjOW+^qxrDln>OmB|mezU} z{~^`CCm*Z?kf#gasgN!q+YE(Tve{V?=1944imy~cXqf3sJM$~@Mu7%BDX8*Q|Ri)^Ine4^{CXq)H_tkCKx?Dp#E>FUehS-Z&p zYJ~&d^NbKVbPo8b|HJwy1SJ|~BlXy0Xe8Fk@ir)NDa)+%ZlW9F%Q2ct`p;!Ujw_a2 zN@J9We-Im_T%6d6mpjpGR(t`URO~jKVs&;G6{{N`=E}?H|8~-CVHNMO_f5+~K1)J@ zN6k-+KPq)BU^I#t>a!KY%P@h#yAdhXm63GwS9K%}%8$ebB0B&GWoc2*d;sMlGhv~q zuA>xU-&tkL8{<%)*jf@eaDX#YIST|fR09Doh~XM33YkVNEFG$L&{tV4t=KF%Mkg18 zQtAD(=7!egF#_QEeL6PB{xpU|9Pi z5*EUk5j;fPZ0Re!j+MZ~=b$xPwwa3u7BQGv)%4vf7QeuiFs|}0}ISY_Le<}F8Bg+V|Cxqa-)D1QvnzW4$%N>0J4(Mh8va7IA2y8OrD-3hnxT43CV!( zFFpjftKoJf1{GR>PjSD@eF(X`$S+qW#N84U-~^JJ1vffuR=+=KeLbTGw(4G|VpJZ= zEN^h9(T_FLz7K{iQ>{H|z4aXGL_=R~9teY`N7!MdRTV3`T(#gQT=~}qmF1chE`9R6Q728ylvSS$E!&=^sYT!3%>ZXp;G@1DjQc}C)wAJ(y>S%cO zlW#8ifrsyeG-LRe;r_kN?{)^UT(yk%fslShU_7A2XuEzn8$PmFOvD zH23UfOc{1t;g4`vBo^{s|IQHW3zkA-5)@wN#}ie2h_pZ{ zdcTDZL0hrZ&rib-seX;J-rqUIAGl{?#fC%G?-qYoCb{J`tv^Z0R@hUg3=hJsSXs+7 zLXNgz*qlnHi5_YRDE&}nTC;PodQ2r@SYE5lt_s01Y_dZ)oQh*C+QEm!zt7S>KOm|- zD?1KN0F|SBUXGd{G6wkB)kr-{9;JU`2l}IwCiBQ4V;OX%s5NHHUy*vG2!Lj4z8ree z!41qmF>OK_CdCrl?$XSeNXn# zNl5J#dm2mVE_b-^Cohd9hlm?5Cy;P{KwmMb1AoS4wRpu- z```pE;u`fk%JmCP-IbVkTvM^a4&6vO2x`6v$#3*0C*JOe3(M_O#?{J=TnZF|)^P#AM~;HP*rH3r=X)2Y7m8?G*_ zK41OmH|u2=lNt?iM~6K_(=h!(FkB)Rv6=?GN{}LeuWq`O;9zz3@7CVzH4av&v6ju& zV&BFMtr${%$a#mjuzLzoSY5U%chcu|LTl)^b{2FE4Z^S5@H=!k@woc!@3?;91Dtt- zY=jct>_Vidiu@fC(Q32iv>Fv14MiA+7|SQlx`#pxRndG$yW^Zmpwc;>LPU!aE@BG+ z=i{Vc?NPMeyQ{o#Y295_3d2lS$yb%(X~G6_R9KFP!c8MfYLkwA2fw6tV}@wQLb)s& zRTQIU3n?8e#xK~dl-lZJtvE+>IWJGcI#ss~O`Atw$ zdDROisK3uW6WjZd!q?%6wUvUx7ZzL#{>vouY z;g%pW5<9;>**eUO3kgc1%7aw9l>oIa-R~w!u>*s9QTqLRlsG$j!#A*XiBjIEIvz6?;gD6*iw4W&SO(2D6!`t!C zlda7wpj$0v8K|!+thv#%0n25N7oNl=M=cYyYGH_7=K>ZxluRDI3?4l)5?_DCqBoc~ zeLLX2@F~}qrDh}|$a-<*5KZc9U)ar&y=u;V)**Bq#gTsmI85qlDXW{Tb$!5y5 z{nW!uSPzBPP?q|~vHqZO4JkwgtmYn4X!jb?F|ZyXw1zV6%+`N6m3`iyHCLf6qByQDR+OQKRhBPB`M7V2ma&lRL^o#4QXG|3Si;gc zY5|Q=it@vF0kJWw(M_8~rrm+@@B^|lA17W5=yCe7kY}JWJsI*0R;Hf_d4?&|PlY^g zwaFr7w}(J#WYl98sj%x>5{Ub|uF7X^4r?Nc<<;tC8B(sijfaM7_HlAr!L}1A*bxEH z)&$By>oxdjx)plWbkjIFkL5{>y_kCeUly+Ef!NV>AgyYLMPX}8^+y>*{p#+(MEEd=OZK30X5t34O))AT zA`!Av?YLbIzKpn4{!U%o(y@@UJ8(65#Zzb{ULcu5W zMnh$~xFL0#iEYWAEZJwSc%|ia3Z6pVMGXTI14hEV0z2CO&|GB8LW5IZI2mQZ3yDvB zwz4gqv_q3J{aFm1it>pCoCPHO=yHsY7NRK?1J|fQd?PvHm3h3=fn<(VmBh>v(z*Eo z8vV`QteDk@+esJ8{<(P9H4m4B(K|IF219PvV=$fM(8NtRE;Be@PL8__j!A?=qSC;WicK z{?nHY-&*aP?q5d|?VE5x#>A}4v&{ZJv=)SPrE@Qdx0cf@Uz*BXVV-WNMnfMZ{a4-+ zw#*C{uW^URSTJp@l24oM!AntEs+L)LEd2;kz*i;KBLnah*p@-5g?oJ|v^@K|9Tebe z_Du&M&KT^uEB_EI4{gPL#)6Jy-yN91Djq#io|*d_843?H=RpeE%mU5#zPMeEiWi2I3 za448ex#Nx~uU> zUB?cXO0XDw)KvdO#Wzg8LZ3GVhrt8^>k9eG-&yHDX}|kT5HRoWqFC3iY?^RkADI?V4p5p=FH|!LYKC#lT)wMj3LdH3w{HqiA40t*&KPG7 zzlS<18oAmp4dmFw^Q|@<>KN7kMLaTl-+c)inz=ki2OTpL2P=NU=Fqf`>eb!RsbAMavO1q9(sq8K7>b3)o0+(mv)ULd z+aaUL7)>Y^kjth~?bJKEOSzfF+}2)w95(q}CT$vRWDOW?!6#gTzd`7;X!PD9(_#;X z$;3v|R5BeHnA?MN+3T}Td+7VkDZtx(AZgyJ_mBs+l4E!jNEP${4ZSr@l&i~%G26mK6#=c2z z%YPQ}^CUHJgPC!M+A`CYr0DW!)TuQ}{OTX=C2>0M9axT$OaY2G=Dd9Zn`vBY@}Eb^ zm;VdmPi3DEar~K>Cz*E_6`J{x7|}zPVSvv@GXCzYo%d(Kk21yu5m@8sm$>E>4m@lo zn()zsS>R2ZB9MfZeTjb9tZcbQiy&L1FCF@u(;$cd74P&F)A02_gILfXwcQX#(RkXn=cUR#r_ z`1;QmBl%q~I}|s7%S-AjJ8_fXu^dbW92jFJUb+p3T5-=1Y5wCEG;Ow5 ze+$k;2|VJ3GPK4uKfumqQ2L-cJ4joY)~qL0)=J`QUwi*w8#q%G0J*o$#~m{Krdzm&9~^#{^o10`@`Xfu|eC{;<; z5hjbWnccc$$8rQ)d%y}h)@_dCM&QN_k_|RfV$zQkJ$s1SP%*FQEh9ysCYyqN;XU5E zcW2_^Z!oyUkUO{-jJp5kGFZzap^{${V^F1)l3%HnbLsv`X5vvUqi?E_NbMIEgOf&@ zi8~kz$ua$g;h84r)-wc6Wn65dSY0&5nmO>VoFPur=?p5lEK-l+RM7@Xj^?kZVa53Z zjP4Z#qew^=H8)$jvSi%AP^L0&a0mnVal@2r+@Uddy0|v*fSa z_)D#rTr)#kbvnbHZ4|O)r9XAIBC4r{quA?OxZ~S|%MNF;Nk&mlSiRLLMXle+JaH`c z>TEUlJhUC#_hYG5ylKPkG!s{pB+3?~w(OY$QaE}GnvWGX;;0x;A+&$3*Erd}1)5-O zkjR;lc5z*$`q4jCVqvDl~4I|ZgwRD~|XjLi;j+xY+ z=Skgjq_^4OA69(Lnlp;;(`x0_QrEQ4_NfnFEuC}86XzqxM_~w&qxgEzf%vsl1aQSs zc;z0bo%t)Njo_R_9+sEbaZ>&IYRM@FVz|lq$Zx0ulXF6&a+GoO8Ku2`+#S!aoMSi6 z@mJH=t)*oz)>|WUAjg#W5eZ=AQ7Z_1E?50&thg^@jo zD;sgp{Px%Vp4-N+bs_w|0Kdj8q#IWA2MruV-kGG2`qHBlop2Wz=xh8oWwA3c_Yy4M z><*q>b*{$O`Fu4zUdp)<`Ej@~hTo5IWgeCqDRPuK_Dx0EREjBsumhFZ@>*mvwf}6j zUcnLglOuD|{k=|(>|yrzP)20ol%sMjZkepIpo6SBm4<5%?T^uYm@{#BB)mzr=1G0i zo?osG%#)mHHG9-)dD0a7Kt!o(R~Eew)!gNV5CKN|lA%NwXea(Al{z1gd(Fr1o z1j$b1-Emr`CKekwk81q`(Tzc;A!z&di9Kn9Gq7N> zNLxci1MR`F(4guni@UKX4_*)We8$E*w9dTmi}y#k%!#|WAd zWx-z3B;>I`fxhU?5u&|@UgcS^kF;fqlgdn2=Ao5)u!ff5)wZf#J@{3k!%a9^!B!jY zq%>oqW0=*pcZ8sYvNpS_WD_$p}ID~Mf>E#`Ci68jF5QopQ;R7k;(g?8*tS0odzl`(X{t{e5h3}-} zvjU-m_WFXWH?xfR&M^{k`{}#Q6h-s<4ZqpStA<@|vX4oG3Ka5;BQW-tA!ta$ihT-w z9f5R34k2flqD8I+qtw!irQD)3b0n1^4n(YNhU6nd3iJ%=i&-sH?$0x1^q*zOMOuc0 zMq@y>g_Lccl$!Hu(Vw@JYJj~uj!CaF)ui@tNxfuVq=Sbs1w^W&XqXb`F+M7+4}+7E zoXBrbdKgRW>7Bg9rV8tKdMQOoc80p@E`Kb>c!7(`ahYC_DUko7Ag7XTB9v>JY`u_d zef4B(KuJQf<^6|poG+5?OT?e8{cDqWv{UxrU=(gq6i-*M<^zecmnU|7HE8vt@_9ZplU``vUk2$E=+y4)r8 z%$V3egfbd%N!>CgxpPwW|*iWK{KK`RyVpT1|+)cheU@(ryv#K}J9bZDiO znlyX;yF4F$YUXV3HT(>Y*6rlgKIUEUTpF6-FtC}=;Hbi2!Hm;9_Uh+Q7VO*8CSF0> z^=KcOngdk}NU5%{^nm3OW|2cvosbLs=deQ)px!Fv!~c$r+JeCbwm(xbEi|Ek-xq98 z-#*bTRCGbBi-d{;VHqe?guqp(Eqd6jdD9|qAG3!gS7^d8up#{a9h)0$m;VR0(1c>@ z4_Jl2*%j`{3q?_Z)-uYtJ;u#rk7LjRBeexo#Cea-IIecH2 zb*s(iU?Hjv&v=amFDe6R!s=zcNb_3_@Gj2%NBCi1F&muPayb~$Jj{0 z=q@L|$19Pfz?TS?4b#~>#_Tn|;@Sr>%)${~bWxWnxe-{fPGfB;RvxKFy~gpEL4mCS zJeexKqgH7=9@#M(tV|`?^-UG;V>HU5#rj`u2EfJQ4bxpA^+;c-=Q%sHL2&^@K@dq~ zgW^tasAr##o!BLam{PL8j~NwVIQ`gzH)zBE8Ze`s1kIG#@K;vPaZ&GMu!bLC2N<(( zz%`brp`G`sF%o_&nhN;10|u>sr;agxbsh6vMX~TNG{#4!rMC8OV(L{jg@Qv=NmF)` z9Yx~1H*hNAE=rsjRwN&!q^YfeHIz$43_LfGO&gZ)46$@<`4lQZhAFXq2FBfAQV1ng z+BJ&JYpDCgc>rw!gQE@>luGuB(0OW)eC+YDj9I~MGgv8d#=p4mWQz?iK0*PgG7sM& z+$r*>ITas%ygqRP(ZS-ydrB2G(O@5G-!wRQlKb`-hwdaPLs$%O0IWw|)rAxZbKxJhb$hmC3VD! zI07=2A-KEA9o6_+x-lB&53JOO?qp@?GFB*d-$}}wYaS!j5t~axb)+{hAuOT(P(o0p z^RX_{rs{+SvBccNi;ZkbES-jO^AA>`v0jW5Nh~?3?KBUMmtFZ^L0lu?v zFAjda7upfn!jm#{@WZ4J7Qt7GRIJ*??`EC3Q(3K*3AcSyPH-=0@fUkpE&ePn(V5vjBxBCs!UT0~Zx4Cdt~}39e*kurhAOAc8!-D!{Hb3jQr;7IM~Tlzw0Ym zWgJu{rf~Sl6e|@9oPlB|gU(Xcku%=fOT#uPtzmoU1<~NiWfPTkEdd)_(ZJ z4LY>kpW1Lpm6G0=CvBngYdC$>(o=iH=}4Ahe0}*_R?~ML$Jz-#h@ow|EpjooTCkFVs1f(&ld}AswB>us-|7SY9{4;s zZ4M6}k&QztaHB~&eO`~;6>~UTiVhO*>EM?tS7VT}1Wz*U)`%lzxLX;0)v`(Gt9hQW zeV8*`2ZV!llr2b4ya7g1QKQ*>2^Ia|>(m(1fvQyU@nmeblNY&l+1vOk1*!{<_-`vb5`K*mrbSY=Q$fcm6p)_^k50Y&!un@K^w?(B z{vSr>&^+2ylf$E-&C5N z)y)>NPF~f_#4B#L&a|g9_=|E{-k^N}N-|dJL7_7L>>oNJZKv(o*JxnlAFR5^O1SpF`ilf(u{bcZp(R=%tdU($C}M9 z6R=dd1uhYmNiDUBCo!L-Qk8AsN{$ED{oqR6skzQDxE>(aCFD9EuHvHzseP|}uu|)i zc%Jy=iNr_;bSRKz1~GS$vkR_TxfCO#G1OpISe4oMQbi8c6n_cbcBw2WMky~3O~cG+ zaz~g~P|>T$p$_7A=O`X0R>gvpNm_0A1#X2>s$YqOS8h|!>x}m>vtL1_!K=4FW2hAN zpD6RMUts?Dgr&b;Ves-Hh|E=-d(x ztZ*rlo!ZohD8FMdN15!>)^AZlyOvk3+-%B}{WpEMmMb+_l!{&$9{a5WCMlG6slUrXG=E;E;vY8H+DdVi6shhDvoA8l3Q#Ut`l+n*n zn674;SWvb+Xvmgt$D#I=9JSYXr$C31r;<+^`FE0t(w|X|;k`hTg5sG|UiphD6Swl_ z(PmpGibKgU76QIr01rPe5%-9flRh4+OmRI5YU3!bNyV|2w?r`#r67mCRD#B|0&~~) zm_oYk)s@H_`_`!t?N5^y(iUzt| zTsMWEvf8Kc#2nyBfc8Z6de?e$(TFPX&GUEjyEj7MB4l%(BEdo{gV zBb2HB3%tXH#IxJ-5HU=sD`CZx6E3v-Xs@R29(-t?7KFyof)E_0Fo#n}?3P#9_#w2? z5vs7_{V1*PYFZi}fjNi-?*7${UQ5syWy; z!M(MnO#ijS9))A0R&R>(h;lchuzI7_l@*|{5k=#uVwQr-NE2eVXM^NDSjwrtz8{aZ$`K!JrKo^fuFnxHxrVHPp~h7YmI1cXiOE}%`QUCvf#@MH&VId zy?ZyD5rbmXwu0EE&QnMj`r!cXPao?6feYWpKmlo`Z!lZ;P%e~YQa>OHf_!q6*w<06 z$_Y(4miRaJUX%&P>@Tmfm`{a9I4O8s1#!9+*Z%Vsb`j)3EQ+V8nU*2MumXiYb-ncD zNpuN8H+t=qCzHPvktp0-cmUUdCGe@eZzZGYswr31_KP^_Y zW%bix3=6KE$-WqgUOfE^;@z@J&>B zb|zbE?U|GU-lNwvlR8vLuh7=L9JifWMt{GRD26h64lASf>M;CL>^=oU+j9E$t*2#> zj0N>|V&Y}=k4I5?lHr<<35T&!`!NZ9sQsU$*ijI*4{af8Z3+ewu;qSMwhvL+9(NIG zU2;e-+|83IJCR@~3<wmNc!@OP1|#u>kw{J!18s}-&#IDEkN)x} z_2?7JpA?GoGgvj6_#di~I5t9qNLKu3u$dLBL?2PyW*am=H3F4rr@C*N)ZMJAUr&=> zlrhK6f#2|>bY>I$nRHNuUc}Z~+Scs*@s2BN1F;;pqv~5THZ7{QO(phO_%h5KZ0Jp% z+KL+KQkM;4EP|FU4 z><2?)`&++box0^{Xh+LSXrR=BYo!tLF?I_vyPWF;X^P>Bl>+ed#WRu&{}c}9`)FpZ ziSTGPXu#^&Ve)_>!4bS{gBG5Z)<5wu3mzbsZ#X{=KeaOuXegLKl+|O`N~1eXft}KJ zk8ibl#b2b}m;UW$L}AbrdRrJ|WCdHn!~Gy=(D_$Is=UML1yXyk0l&hp`WNZEv?({M zTmB-QBSV;%*8SK8#qf#e#I9%lL)sy3d862Pl66UZ@XkWU#)HcLA9yj!oJGb^XCc!>2C zF#SqNb=NT5-Pj|q@JQmz`D(#zDYq+q--Cbp7?I%#u($c8`D*EGsUQvC(YPB-1M_dC zCFNiDHlG@*t$-!%4Mlhnid7Mj9VMAv1YgroB8mS2aHK7a6G(tKD`K0d$vxY~4`)Q5$a_&aRBT_=r9!-pzHTrcHbQ6jV`xg3eb z$BnvbE)Xg0XzAa98y{xS94v81IjdiZC*D)nUoTzS@p8>R_dWF!*wdb$q-K>$m!-Q} z0_wz4so$*RxBB!OsY`_k_q-!9l?hml%t5O=!qW0Kl?_~6422SwA!z4f>?&JU@^(Rw zmb&uDak2QNE#%i$_fZd)N(C1OAdDJ4R(>3;{80Jpprtw_m1N#2qFVQcdeI!IN9SVj zVTFjQDizc5ebkwAq`orcGApe7g?e5-tA?BIsr0t`&#QfsEeKTfswD#Rn8(X24!%uzii}Jg#0dPkO@0_u_!#YFfFJ-}_m_VaRU34Xx}IxTS6o z*(=V|)}E*Vo%D=4p&X}h2J#z-gbU@@U`}e;CxEBe&_xMg$NQAa8;dC?wL$biU8ISmgo>t^q4xkb!+2oF;icVZx z5-;;BF|7YXaET76Ff0y;IB!HLJgzcq7IY)Jk2a%CSG%6|ERP1wFBwe5cJ6}qdigIyGc4HOHe|fpkK(Tbsb!- zw%#NS9!M?Iv9NSCC;le+m9X~H>fh;4b9^^sVs^zT(l4&zXVk~^%gdhSAL@o?sK z>Nd)6H}q#~I3@dO8IeVH7`!V}xA7D4L8|qs<@9PO`tCxhTR#$^6lYrCH&Yo+<4MnL z&sMN&_hVh_Dc{dR?m z^Uke`CpS=Vn-h<$_FhOoRj1n9?|uRdRi`@H@1BPQswFbU$?Tv|?J>==1}w_(By3wx z5D8~mhl6=5G2==)WSKqK83n#-r?v7IA};nQos`9D%OYu5uQ*i3t#PDBVgVf$()NCt zZ^o{U^+~S2Cwf(Kqb?Njl|5jN_|}IOJki{D~hl}OXcT6lk!Mw6QhK2i7Ku}&L&s%_svzitQccr6vsP6$F-GS zTqxwv!yb{nHS1B>%e+-BX0%ro^jXm4?>H&n3*SFL4VbwTX^6inj0#^-FT*!zSV!JGAII)NHqF{ z1U~Q3SMBDPdS`Mkhx@3-e(C)5;=QZYg?{Ohi-;Ubr>mQbkR&9rmIQ`!*)Iw_8{eip zzvGws_lIYsBhBt5F*9Sk?1+#-v1~|CdsRri^q|LANV(mFEY`cUe1yx4uE|9Df_Zg? zlsAurLvk5w6!-3|)$DWG1FB!e*NquOqx4M$NRw)4+Okh$$6hL9qKwf5u?Z0mdw-w$ zPD`Zn^zc3rD(=UtVgVy710GZ7~`QY#HDT|fN^smz>S0MeTqq{5B^ z!Trg=e=LLj=MB=-bSEArJt_6d%7a78C0gnEsNwL1aH(JOq*P(<3eVn8aYDV)OP4Ua z(?5zG?&E^Lv!9lxQ5dTCX{ld2DD@9MEj^!>o`a{7=cF=AI)v80@S;>;?tuWQaI?yy z%*w+qXmQ?k8?7H@fJHs=k~A(In$?eZSsI?+jZ^`z2i-_3!jke~Kb!$A>eatX*Qce8 z>8qaFD7kHAs2}$FlgeO>FHu29y(V4O2@lk%^r$WCTVL~nP#^XEP0|%x)#fQ>RxLF$8!;Ad4mq1mBK{X?Rm|qp=<&($>(a;bIDbQ9`8 zHTBjvrT%@Q2n`+7B7B=-I8!WSd5vflCBjEG+RWIS(uL`8R+Dc^c>@L_)wh#Mp&t%@ z6Sln39gq03U+Ck?Z==YEhSTZh9hIkPgK6o*Vav`9;8#a)m--E50ic7U075;uakjr3 zU)-YQ4_f+K+6hUs5ieY^_KlLK6)M#KZM*bvT6zFwbj%LPcM%g+u>tqlhJF%B4K^Bu z9i^5~5xsyVI1Bab>mAbczVJ-W=qd8G$l8PSrD_N4pZ2g(Gh>?hf@aofW=&u9g}0?qU0* z_F3VaL~yIxVZYSflAKZLRoA~O<=y8@-}S&dQf6AbpuXcf(k8PU&sge>0;PZxh+AL> zN&zPjPhaY-1AKrJFab?zOTEdnK!+Ite1HdV0S+?Z)?|h|;2sOR6?}O10Up2!n1Hxx zsqBrJ;0X8t58wuzfC+GAL(p(Awl49;fGFSr>IT3KrUOX+4muD396<6nxC5ntFAGZK zgSQ>z4~5cDBybtRfSdDtMDj`*!rcgP2#Ecmy%WR>@jPg$H`WCn!Ps;Gc;Ftp6iST) zVEQ_N7jDT8p#KU5fB;YmxB(|%0^+|waUco=fKtE>H~|w7mro-Apbm%t0iYCc15UsM z#D9hmAPNM4x{gp1rWRrT0TI9lxB&-HcQz6ZX8cF^ z1)_ita0AXCm&o4a4^R}S10sMA@Bl7?9jOg7nFJ3I0enCb#iJCa8wiX+F2Xbc@$V4` z5CsB2DNyG?P9gVvol)EhP}D$k0S+MfFBt;6qpbZ4j6eiPB2W)Z7vLZhS)Ke2?trs5 zguwIxZnD#J2?96 z0fBxfd*329Kokf79>4`OHNy^+0&c(wn1EOU!l9rKrUQt510KKyH~|w7{~8ei0)QKk zlV5=uHLVF|0Pp}Vq5;XH5CZrB4`2f7{s}wa2AqHih<^zs0Vfdu0=$C}JD5=*Kz6_h zn1Fa3GJz=Ii6j4=MED#+0T18;96F2DiAKLsxk0X#tb6FdXHfhYr)AkbWt z3)tO&6EFesBk(^8SqQ}N90dYEDd0XLgAorVpy^{c0zSY4xBwH-^bu%)2XF!=AbuE% z08t=v1@alD2XFw%58(%>10sMAa03n?{sHJf1SkbuGJYID{Czk80iYCc15UsM#1A1b zAPV>ZH{bx`2SEc$0XN_Tk_W&GM1WGj1vr5Cd!PdmzymmeWE1i~hMx#f3b+6h(DW_@ z13thFIDq&&P!I?J9>4`SfY?7k15AK#KlsqPdSJQ$=S8T#M0*>2Km_msP9VMy^7bMB zBY5xu9>4`SfcRcG0xrM=#P%Q%zzvvySR?E}Dc}Z@2*?T31jKhk`O9HP>mI{%1c;4B z7QyrZbr++0!gK=hZs-O~^zarO0QWEypkAosJwZodih$-L*ie8_z&z&yu)6>U5Z?vi zKosx+9>4`SfaFdD4)_2M-~t>#atBfvr~?8reo6rsU;>&NAPn#UZomP=V+aKB6r!4< zpNgIX<$lcDMzAQosc`faG@g0ir-D-~{UOkSg8KF-mA7G9d%BDe*Vq&>l$z zGYSNNQov2-NO&kh9^yIq2Kb7h0L(aOQJ4WBi5@mO0s`^u0i1xk;;__5ed@4u!CIF^ zerRi@_YvSx;BlZ9*Z@2QJOexj{0(>!co}#FcoldJs0UsLwgPVe+kpmPC-4@~22Y^R_CxB;w7lFS6n}DrA1F#!-8#n||xOBdW z{e2EX0=Tbp`WV;Gcu0E_X$?4lE&%0A514&{{=mh+aG(f)rviB_9wr0V0k;CHfqQ_* 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 b4 Date: Fri, 25 Mar 2016 21:30:58 +0100 Subject: [PATCH 166/445] Shared: abort if opengl context can't be created --- shared/sdl/sdl_window.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/shared/sdl/sdl_window.cpp b/shared/sdl/sdl_window.cpp index d617583577..011ead6103 100644 --- a/shared/sdl/sdl_window.cpp +++ b/shared/sdl/sdl_window.cpp @@ -619,6 +619,11 @@ static rserr_t GLimp_SetMode(glconfig_t *glConfig, const windowDesc_t *windowDes glConfig->colorBits, glConfig->depthBits, glConfig->stencilBits ); break; } + + if (opengl_context == NULL) { + SDL_FreeSurface(icon); + return RSERR_UNKNOWN; + } } else { From a54eb3f2a1adec69f62377858124d7205b8ce4f4 Mon Sep 17 00:00:00 2001 From: ouned Date: Fri, 25 Mar 2016 21:47:48 +0100 Subject: [PATCH 167/445] Shared: option to use software GL renderer --- shared/sdl/sdl_window.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/shared/sdl/sdl_window.cpp b/shared/sdl/sdl_window.cpp index 011ead6103..f784c338e7 100644 --- a/shared/sdl/sdl_window.cpp +++ b/shared/sdl/sdl_window.cpp @@ -41,6 +41,7 @@ static SDL_GLContext opengl_context; static float displayAspect; cvar_t *r_sdlDriver; +cvar_t *r_allowSoftwareGL; // Window cvars cvar_t *r_fullscreen = 0; @@ -564,7 +565,7 @@ static rserr_t GLimp_SetMode(glconfig_t *glConfig, const windowDesc_t *windowDes } SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); - SDL_GL_SetAttribute( SDL_GL_ACCELERATED_VISUAL, 1 ); + SDL_GL_SetAttribute( SDL_GL_ACCELERATED_VISUAL, !r_allowSoftwareGL->integer ); if( ( screen = SDL_CreateWindow( windowTitle, x, y, glConfig->vidWidth, glConfig->vidHeight, flags ) ) == NULL ) @@ -728,6 +729,7 @@ window_t WIN_Init( const windowDesc_t *windowDesc, glconfig_t *glConfig ) Cmd_AddCommand("minimize", GLimp_Minimize); r_sdlDriver = Cvar_Get( "r_sdlDriver", "", CVAR_ROM ); + r_allowSoftwareGL = Cvar_Get( "r_allowSoftwareGL", "0", CVAR_ARCHIVE|CVAR_LATCH ); // Window cvars r_fullscreen = Cvar_Get( "r_fullscreen", "0", CVAR_ARCHIVE|CVAR_LATCH ); From 022ffc734b1ad89d44da06c8e68f7015dd7134d6 Mon Sep 17 00:00:00 2001 From: Alessandro Date: Tue, 15 Mar 2016 07:46:26 -0700 Subject: [PATCH 168/445] move CBezier::DrawSegment() inline declaration to header. fixes #780 --- code/cgame/FxPrimitives.cpp | 2 +- code/cgame/FxPrimitives.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/cgame/FxPrimitives.cpp b/code/cgame/FxPrimitives.cpp index 24cdc6568c..c784e308ff 100644 --- a/code/cgame/FxPrimitives.cpp +++ b/code/cgame/FxPrimitives.cpp @@ -2102,7 +2102,7 @@ bool CBezier::Update( void ) } //---------------------------- -inline void CBezier::DrawSegment( vec3_t start, vec3_t end, float texcoord1, float texcoord2 ) +void CBezier::DrawSegment( vec3_t start, vec3_t end, float texcoord1, float texcoord2 ) { vec3_t lineDir, cross, viewDir; static vec3_t lastEnd[2]; diff --git a/code/cgame/FxPrimitives.h b/code/cgame/FxPrimitives.h index 49ad1bb37d..d84185dabc 100644 --- a/code/cgame/FxPrimitives.h +++ b/code/cgame/FxPrimitives.h @@ -388,7 +388,7 @@ class CBezier : public CLine virtual bool Update(); - void DrawSegment( vec3_t start, vec3_t end, float texcoord1, float texcoord2 ); + inline void DrawSegment( vec3_t start, vec3_t end, float texcoord1, float texcoord2 ); inline void SetControlPoints( const vec3_t ctrl1, const vec3_t ctrl2 ) { VectorCopy( ctrl1, mControl1 ); VectorCopy( ctrl2, mControl2 ); } inline void SetControlVel( const vec3_t ctrl1v, const vec3_t ctrl2v ) { VectorCopy( ctrl1v, mControl1Vel ); VectorCopy( ctrl2v, mControl2Vel ); } @@ -590,4 +590,4 @@ class CPoly : public CParticle }; -#endif //FX_PRIMITIVES_H_INC \ No newline at end of file +#endif //FX_PRIMITIVES_H_INC From e0b2a4278e049633eeea654e225e498e1622e1f3 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Thu, 31 Mar 2016 09:51:46 -0500 Subject: [PATCH 169/445] MP: Fix aiming issue when FPS is too high caused by div-by-0 errors. --- codemp/client/cl_input.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/codemp/client/cl_input.cpp b/codemp/client/cl_input.cpp index 07c4c95088..fbbf624281 100644 --- a/codemp/client/cl_input.cpp +++ b/codemp/client/cl_input.cpp @@ -1385,23 +1385,27 @@ void CL_CreateNewCommands( void ) { int cmdNum; // no need to create usercmds until we have a gamestate - if ( cls.state < CA_PRIMED ) { + if ( cls.state < CA_PRIMED ) return; - } frame_msec = com_frameTime - old_com_frameTime; + // if running over 1000fps, act as if each frame is 1ms + // prevents divisions by zero + if ( frame_msec < 1 ) + frame_msec = 1; + // if running less than 5fps, truncate the extra time to prevent // unexpected moves after a hitch - if ( frame_msec > 200 ) { + if ( frame_msec > 200 ) frame_msec = 200; - } + old_com_frameTime = com_frameTime; // generate a command for this frame cl.cmdNumber++; cmdNum = cl.cmdNumber & CMD_MASK; - cl.cmds[cmdNum] = CL_CreateCmd (); + cl.cmds[cmdNum] = CL_CreateCmd(); } /* From 165377a9851ececfe9a622250a2d8b94ef82e9ef Mon Sep 17 00:00:00 2001 From: Ensiform Date: Thu, 31 Mar 2016 09:52:12 -0500 Subject: [PATCH 170/445] SP: Fix aiming issue when FPS is too high caused by div-by-0 errors. --- code/client/cl_input.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/code/client/cl_input.cpp b/code/client/cl_input.cpp index 575c1db121..1c6f6596f6 100644 --- a/code/client/cl_input.cpp +++ b/code/client/cl_input.cpp @@ -140,6 +140,7 @@ void IN_MLookDown( void ) { in_mlooking = qtrue; } +void IN_CenterView( void ); void IN_MLookUp( void ) { in_mlooking = qfalse; if ( !cl_freelook->integer ) { @@ -733,23 +734,27 @@ void CL_CreateNewCommands( void ) { int cmdNum; // no need to create usercmds until we have a gamestate -// if ( cls.state < CA_PRIMED ) { +// if ( cls.state < CA_PRIMED ) // return; -// } frame_msec = com_frameTime - old_com_frameTime; + // if running over 1000fps, act as if each frame is 1ms + // prevents divisions by zero + if ( frame_msec < 1 ) + frame_msec = 1; + // if running less than 5fps, truncate the extra time to prevent // unexpected moves after a hitch - if ( frame_msec > 200 ) { + if ( frame_msec > 200 ) frame_msec = 200; - } + old_com_frameTime = com_frameTime; // generate a command for this frame cl.cmdNumber++; cmdNum = cl.cmdNumber & CMD_MASK; - cl.cmds[cmdNum] = CL_CreateCmd (); + cl.cmds[cmdNum] = CL_CreateCmd(); } /* From a597551a744388c7c50fdfd69e1c4a7282ea68b7 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Thu, 31 Mar 2016 10:36:31 -0500 Subject: [PATCH 171/445] MP: Fixed saber flash flare with uninitialized alpha channel color. --- codemp/cgame/cg_draw.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/codemp/cgame/cg_draw.c b/codemp/cgame/cg_draw.c index cc801c778a..d346c5694a 100644 --- a/codemp/cgame/cg_draw.c +++ b/codemp/cgame/cg_draw.c @@ -5340,7 +5340,7 @@ void CG_SaberClashFlare( void ) { int t, maxTime = 150; vec3_t dif; - vec3_t color; + vec4_t color; int x,y; float v, len; trace_t tr; @@ -5389,7 +5389,7 @@ void CG_SaberClashFlare( void ) CG_WorldCoordToScreenCoord( cg_saberFlashPos, &x, &y ); - VectorSet( color, 0.8f, 0.8f, 0.8f ); + VectorSet4( color, 0.8f, 0.8f, 0.8f, 1.0f ); trap->R_SetColor( color ); CG_DrawPic( x - ( v * 300 ), y - ( v * 300 ), From 2cca2dc93428d5226a1acdf717f65acc79d7772b Mon Sep 17 00:00:00 2001 From: Ensiform Date: Thu, 31 Mar 2016 10:38:23 -0500 Subject: [PATCH 172/445] MP Gamecode: Remove some unused team arena gametype scoring code. --- codemp/game/g_team.c | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/codemp/game/g_team.c b/codemp/game/g_team.c index ece5c3ccf6..80032eaef0 100644 --- a/codemp/game/g_team.c +++ b/codemp/game/g_team.c @@ -354,7 +354,6 @@ void Team_FragBonuses(gentity_t *targ, gentity_t *inflictor, gentity_t *attacker gentity_t *ent; int flag_pw, enemy_flag_pw; int otherteam; - int tokens; gentity_t *flag, *carrier = NULL; char *c; vec3_t v1, v2; @@ -379,7 +378,6 @@ void Team_FragBonuses(gentity_t *targ, gentity_t *inflictor, gentity_t *attacker } // did the attacker frag the flag carrier? - tokens = 0; if (targ->client->ps.powerups[enemy_flag_pw]) { attacker->client->pers.teamState.lastfraggedcarrier = level.time; AddScore(attacker, targ->r.currentOrigin, CTF_FRAG_CARRIER_BONUS); @@ -398,24 +396,6 @@ void Team_FragBonuses(gentity_t *targ, gentity_t *inflictor, gentity_t *attacker return; } - // did the attacker frag a head carrier? other->client->ps.generic1 - if (tokens) { - attacker->client->pers.teamState.lastfraggedcarrier = level.time; - AddScore(attacker, targ->r.currentOrigin, CTF_FRAG_CARRIER_BONUS * tokens * tokens); - attacker->client->pers.teamState.fragcarrier++; - //PrintMsg(NULL, "%s" S_COLOR_WHITE " fragged %s's skull carrier!\n", - // attacker->client->pers.netname, TeamName(team)); - - // the target had the flag, clear the hurt carrier - // field on the other team - for (i = 0; i < sv_maxclients.integer; i++) { - ent = g_entities + i; - if (ent->inuse && ent->client->sess.sessionTeam == otherteam) - ent->client->pers.teamState.lasthurtcarrier = 0; - } - return; - } - if (targ->client->pers.teamState.lasthurtcarrier && level.time - targ->client->pers.teamState.lasthurtcarrier < CTF_CARRIER_DANGER_PROTECT_TIMEOUT && !attacker->client->ps.powerups[flag_pw]) { From 31a714c73e31c2a5385243cff099b88a2a55ea4b Mon Sep 17 00:00:00 2001 From: Ensiform Date: Thu, 31 Mar 2016 10:40:49 -0500 Subject: [PATCH 173/445] MP: Minor adjustments to BSP loading error messages. --- codemp/qcommon/cm_load.cpp | 42 +++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/codemp/qcommon/cm_load.cpp b/codemp/qcommon/cm_load.cpp index 4a722e617e..b83eb21622 100644 --- a/codemp/qcommon/cm_load.cpp +++ b/codemp/qcommon/cm_load.cpp @@ -93,7 +93,7 @@ int NumSubBSP, TotalSubModels; CMod_LoadShaders ================= */ -static void CMod_LoadShaders( lump_t *l, clipMap_t &cm ) +static void CMod_LoadShaders( const lump_t *l, clipMap_t &cm ) { dshader_t *in; int i, count; @@ -126,7 +126,7 @@ static void CMod_LoadShaders( lump_t *l, clipMap_t &cm ) CMod_LoadSubmodels ================= */ -void CMod_LoadSubmodels( lump_t *l, clipMap_t &cm ) { +static void CMod_LoadSubmodels( const lump_t *l, clipMap_t &cm ) { dmodel_t *in; cmodel_t *out; int i, j, count; @@ -192,7 +192,7 @@ CMod_LoadNodes ================= */ -void CMod_LoadNodes( lump_t *l, clipMap_t &cm ) { +static void CMod_LoadNodes( const lump_t *l, clipMap_t &cm ) { dnode_t *in; int child; cNode_t *out; @@ -200,7 +200,7 @@ void CMod_LoadNodes( lump_t *l, clipMap_t &cm ) { in = (dnode_t *)(cmod_base + l->fileofs); if (l->filelen % sizeof(*in)) - Com_Error (ERR_DROP, "MOD_LoadBmodel: funny lump size"); + Com_Error (ERR_DROP, "CMod_LoadNodes: funny lump size"); count = l->filelen / sizeof(*in); if (count < 1) @@ -246,14 +246,14 @@ CMod_LoadBrushes ================= */ -void CMod_LoadBrushes( lump_t *l, clipMap_t &cm ) { +void CMod_LoadBrushes( const lump_t *l, clipMap_t &cm ) { dbrush_t *in; cbrush_t *out; int i, count; in = (dbrush_t *)(cmod_base + l->fileofs); if (l->filelen % sizeof(*in)) { - Com_Error (ERR_DROP, "MOD_LoadBmodel: funny lump size"); + Com_Error (ERR_DROP, "CMod_LoadBrushes: funny lump size"); } count = l->filelen / sizeof(*in); @@ -282,7 +282,7 @@ void CMod_LoadBrushes( lump_t *l, clipMap_t &cm ) { CMod_LoadLeafs ================= */ -void CMod_LoadLeafs (lump_t *l, clipMap_t &cm) +static void CMod_LoadLeafs (const lump_t *l, clipMap_t &cm) { int i; cLeaf_t *out; @@ -291,7 +291,7 @@ void CMod_LoadLeafs (lump_t *l, clipMap_t &cm) in = (dleaf_t *)(cmod_base + l->fileofs); if (l->filelen % sizeof(*in)) - Com_Error (ERR_DROP, "MOD_LoadBmodel: funny lump size"); + Com_Error (ERR_DROP, "CMod_LoadLeafs: funny lump size"); count = l->filelen / sizeof(*in); if (count < 1) @@ -325,7 +325,7 @@ void CMod_LoadLeafs (lump_t *l, clipMap_t &cm) CMod_LoadPlanes ================= */ -void CMod_LoadPlanes (lump_t *l, clipMap_t &cm) +static void CMod_LoadPlanes (const lump_t *l, clipMap_t &cm) { int i, j; cplane_t *out; @@ -335,7 +335,7 @@ void CMod_LoadPlanes (lump_t *l, clipMap_t &cm) in = (dplane_t *)(cmod_base + l->fileofs); if (l->filelen % sizeof(*in)) - Com_Error (ERR_DROP, "MOD_LoadBmodel: funny lump size"); + Com_Error (ERR_DROP, "CMod_LoadPlanes: funny lump size"); count = l->filelen / sizeof(*in); if (count < 1) @@ -366,7 +366,7 @@ void CMod_LoadPlanes (lump_t *l, clipMap_t &cm) CMod_LoadLeafBrushes ================= */ -void CMod_LoadLeafBrushes (lump_t *l, clipMap_t &cm) +static void CMod_LoadLeafBrushes (const lump_t *l, clipMap_t &cm) { int i; int *out; @@ -375,7 +375,7 @@ void CMod_LoadLeafBrushes (lump_t *l, clipMap_t &cm) in = (int *)(cmod_base + l->fileofs); if (l->filelen % sizeof(*in)) - Com_Error (ERR_DROP, "MOD_LoadBmodel: funny lump size"); + Com_Error (ERR_DROP, "CMod_LoadLeafBrushes: funny lump size"); count = l->filelen / sizeof(*in); cm.leafbrushes = (int *)Hunk_Alloc( (count + BOX_BRUSHES) * sizeof( *cm.leafbrushes ), h_high ); @@ -393,7 +393,7 @@ void CMod_LoadLeafBrushes (lump_t *l, clipMap_t &cm) CMod_LoadLeafSurfaces ================= */ -void CMod_LoadLeafSurfaces( lump_t *l, clipMap_t &cm ) +static void CMod_LoadLeafSurfaces( const lump_t *l, clipMap_t &cm ) { int i; int *out; @@ -402,7 +402,7 @@ void CMod_LoadLeafSurfaces( lump_t *l, clipMap_t &cm ) in = (int *)(cmod_base + l->fileofs); if (l->filelen % sizeof(*in)) - Com_Error (ERR_DROP, "MOD_LoadBmodel: funny lump size"); + Com_Error (ERR_DROP, "CMod_LoadLeafSurfaces: funny lump size"); count = l->filelen / sizeof(*in); cm.leafsurfaces = (int *)Hunk_Alloc( count * sizeof( *cm.leafsurfaces ), h_high ); @@ -420,7 +420,7 @@ void CMod_LoadLeafSurfaces( lump_t *l, clipMap_t &cm ) CMod_LoadBrushSides ================= */ -void CMod_LoadBrushSides (lump_t *l, clipMap_t &cm) +static void CMod_LoadBrushSides (const lump_t *l, clipMap_t &cm) { int i; cbrushside_t *out; @@ -430,7 +430,7 @@ void CMod_LoadBrushSides (lump_t *l, clipMap_t &cm) in = (dbrushside_t *)(cmod_base + l->fileofs); if ( l->filelen % sizeof(*in) ) { - Com_Error (ERR_DROP, "MOD_LoadBmodel: funny lump size"); + Com_Error (ERR_DROP, "CMod_LoadBrushSides: funny lump size"); } count = l->filelen / sizeof(*in); @@ -455,13 +455,13 @@ void CMod_LoadBrushSides (lump_t *l, clipMap_t &cm) CMod_LoadEntityString ================= */ -void CMod_LoadEntityString( lump_t *l, clipMap_t &cm, const char* name ) { +static void CMod_LoadEntityString( const lump_t *l, clipMap_t &cm, const char* name ) { fileHandle_t h; char entName[MAX_QPATH]; // Attempt to load entities from an external .ent file if available Q_strncpyz(entName, name, sizeof(entName)); - const int entNameLen = strlen(entName); + const size_t entNameLen = strlen(entName); entName[entNameLen - 3] = 'e'; entName[entNameLen - 2] = 'n'; entName[entNameLen - 1] = 't'; @@ -488,7 +488,7 @@ CMod_LoadVisibility ================= */ #define VIS_HEADER 8 -void CMod_LoadVisibility( lump_t *l, clipMap_t &cm ) { +static void CMod_LoadVisibility( const lump_t *l, clipMap_t &cm ) { int len; byte *buf; @@ -517,7 +517,7 @@ CMod_LoadPatches ================= */ #define MAX_PATCH_VERTS 1024 -void CMod_LoadPatches( lump_t *surfs, lump_t *verts, clipMap_t &cm ) { +static void CMod_LoadPatches( const lump_t *surfs, const lump_t *verts, clipMap_t &cm ) { drawVert_t *dv, *dv_p; dsurface_t *in; int count; @@ -862,7 +862,7 @@ cmodel_t *CM_ClipHandleToModel( clipHandle_t handle, clipMap_t **clipMap ) { if ( handle < MAX_SUBMODELS ) { - Com_Error( ERR_DROP, "CM_ClipHandleToModel: bad handle %i < %i < %i", + Com_Error( ERR_DROP, "CM_ClipHandleToModel: bad handle (count: %i) < (handle: %i) < (max: %i)", cmg.numSubModels, handle, MAX_SUBMODELS ); } Com_Error( ERR_DROP, "CM_ClipHandleToModel: bad handle %i", handle + MAX_SUBMODELS ); From b07dd032a3c613d280f59964d55a6dd72ac5d63d Mon Sep 17 00:00:00 2001 From: Ensiform Date: Thu, 31 Mar 2016 10:41:43 -0500 Subject: [PATCH 174/445] MP Gamecode: Fix maximum message size of buffers for these commands: telltarget and tellattacker. --- codemp/cgame/cg_consolecmds.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/codemp/cgame/cg_consolecmds.c b/codemp/cgame/cg_consolecmds.c index 98576adeb7..8a66433906 100644 --- a/codemp/cgame/cg_consolecmds.c +++ b/codemp/cgame/cg_consolecmds.c @@ -166,31 +166,31 @@ void CG_ClientList_f( void ) static void CG_TellTarget_f( void ) { int clientNum; - char command[128]; - char message[128]; + char command[MAX_SAY_TEXT+10]; + char message[MAX_SAY_TEXT]; clientNum = CG_CrosshairPlayer(); if ( clientNum == -1 ) { return; } - trap->Cmd_Args( message, 128 ); - Com_sprintf( command, 128, "tell %i %s", clientNum, message ); + trap->Cmd_Args( message, sizeof(message) ); + Com_sprintf( command, sizeof(command), "tell %i %s", clientNum, message ); trap->SendClientCommand( command ); } static void CG_TellAttacker_f( void ) { int clientNum; - char command[128]; - char message[128]; + char command[MAX_SAY_TEXT + 10]; + char message[MAX_SAY_TEXT]; clientNum = CG_LastAttacker(); if ( clientNum == -1 ) { return; } - trap->Cmd_Args( message, 128 ); - Com_sprintf( command, 128, "tell %i %s", clientNum, message ); + trap->Cmd_Args( message, sizeof(message) ); + Com_sprintf( command, sizeof(command), "tell %i %s", clientNum, message ); trap->SendClientCommand( command ); } From 0bbbccf228a04168decdf219ec3008f76b64f9f4 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Thu, 31 Mar 2016 10:42:19 -0500 Subject: [PATCH 175/445] MP Gamecode: Range limit cg_viewSize immediately on sizeUp and sizeDown --- codemp/cgame/cg_consolecmds.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/codemp/cgame/cg_consolecmds.c b/codemp/cgame/cg_consolecmds.c index 8a66433906..2f2c8b28ec 100644 --- a/codemp/cgame/cg_consolecmds.c +++ b/codemp/cgame/cg_consolecmds.c @@ -55,7 +55,7 @@ Keybinding command ================= */ static void CG_SizeUp_f (void) { - trap->Cvar_Set( "cg_viewsize", va( "%i", cg_viewsize.integer + 10 ) ); + trap->Cvar_Set( "cg_viewsize", va( "%i", Q_min( cg_viewsize.integer + 10, 100 ) ) ); } /* @@ -66,7 +66,7 @@ Keybinding command ================= */ static void CG_SizeDown_f (void) { - trap->Cvar_Set( "cg_viewsize", va( "%i", cg_viewsize.integer - 10 ) ); + trap->Cvar_Set( "cg_viewsize", va( "%i", Q_max( cg_viewsize.integer - 10, 30 ) ) ); } /* From ebf6856daa94ff1574cd8a2f5fc722551a695f47 Mon Sep 17 00:00:00 2001 From: dusty22 Date: Fri, 1 Apr 2016 11:28:01 -0400 Subject: [PATCH 176/445] things to test changes, need testing: - Grenadiers, do they try to punch too often and from too far away? - Do melee cultists jump too much? Can they do lean dodges? - Attack chain amounts should not be randomized now - Force jump increased heights should be tied to g_forcenewpowers - Kick damage is a little less random - Test player, npcs staggering from punches (NPCs should have an immune timer), tweak - Test g_saberDamageGlobal, should override savegame version, check g_AIsurrender is default 1 - test NPCs surrendering - test NPC punch range - test differences in knockaway recovery speed, minimum 1 BP to knockaway, transitions decreasing attack power by -2, saber droids having reasonable power, offense 1 fast having a power level - test improved blocking during returns for player - test saber defense 0 vs. non-autoblocking behavior - test lightning block effect for duals, staff --- CHANGELOG.txt | 115 ++++++++++++++------ code/cgame/cg_main.cpp | 11 ++ code/game/AI_Civilian.cpp | 2 +- code/game/AI_Grenadier.cpp | 13 ++- code/game/AI_Jedi.cpp | 120 +++++++++++++-------- code/game/NPC.cpp | 27 ++--- code/game/NPC_behavior.cpp | 205 +++++++++++++++++++++++++++--------- code/game/NPC_combat.cpp | 188 ++++++++++++++++++++++++++++++--- code/game/NPC_reactions.cpp | 12 ++- code/game/b_public.h | 1 + code/game/bg_panimate.cpp | 25 +++-- code/game/bg_pmove.cpp | 98 +++++++++++++---- code/game/g_active.cpp | 23 ++-- code/game/g_combat.cpp | 2 +- code/game/g_main.cpp | 6 +- code/game/weapons.h | 3 + code/game/wp_melee.cpp | 2 +- code/game/wp_saber.cpp | 128 +++++++++++----------- 18 files changed, 716 insertions(+), 265 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 93107a84b2..99e62f3b23 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -3,11 +3,13 @@ new cvars: g_autoRoll - been there for a while, now works 100% correctly, if 1 default JA behavior, if 0 you have to be holding USE to roll -g_char_forcePowerMax - requires level restart -g_char_forceRegen - requires level restart -g_char_parryBonus - -g_char_breakParryBonus - +g_char_forcePowerMax - requires level restart, like the NPC setting but for the player +g_char_forceRegen - requires level restart, like NPC setting but for player +g_char_parryBonus - like the .sab file setting but applied on game load for player +g_char_breakParryBonus - like the .sab file setting but applied on game load for player all these affect the player's stats +g_handicap - goes up to 200 now +g_saberDamageScale - this scales saber damage, and is saved with your savegame g_saberForceDrains - if 1 special moves drain the amount of FP from the next cvar, katas not affected g_saberForceDrainAmount - if g_saberForceDrains is 1, special moves @@ -15,50 +17,103 @@ drain this amount of FP, katas not affected g_saberLockSuperBreaks - if 1 default JA behavior of saber locks, if 0 no super breaks (1-hit KOs) ever happen after saber locks g_saberLockStyle - dummy cvar. Later maybe make it so superbreaks happen -under certain conditions. +under certain conditions +g_saberMoreRealistic - no longer write-protected +g_weaponVelocity, g_weaponAltVelocity - use this to multiply the speed of most projectiles + +cvars to-do: +separate cvars into global and savegame versions, have global take priority? +camera cvars? +cvars for force push blur effects? + +increased modability: +- separate lightning block effect into own .efx file +- external file for controlling force push/pull effects +- Class_Wookiee, Class_Cultist +- weapons.dat stuff (NPCDamageMult, NPCFireTimeMult) +- alt-fire field works for NPCs? -Melee changes: -- Player gets a weaker version of melee katas now based on saber offense level (1 - punches and kicks, 2 - katas, 3 - spin kicks) -- Player melee katas have less range, must be aimed more precisely, and do not work on certain types of enemies unless g_debugmelee is on -- Spin kicks and the like are enabled for Saber Offense 3 -- Can do spin kicks on demand by holding Use and pressing the kick button, however this costs Force power -other changes: -- QMax bugs and crashes fixed (wasn't ported properly from OpenJK) -- melee force users push back and dodge explosives better now, still -don't dodge saber throws yet... -- All sabers kick by default for their alternate attack, +forcefocus must be held to use Saber Throw ----------------------------------------------------------------------- Only larger/more important changes recorded here: Gameplay mechanics - +Force powers -- (with g_forceNewPowers 1) - Force Jump height for all levels increased by 25% +- Force Pull level 1 pulls weapons only, level 2 can knockdown, level 3 can pull toward you somewhat +- Force Sense gives limited snipershot dodging ability +- Force Speed decreases cost of sniper shot dodging at Level 3 +- Force Protect 1/2/3 gives only 10/20/40% damage reduction against saber attacks instead of 25/50/75% + +NPC AI -- +- Improvements to NPC AI pertaining to the use of JA-exclusive abilities; +NPCs only use Force Rage if close to the player and if have > 25% HP, only kick if close to the player, +only use katas if close to the player +- NPC Jedi will try very hard to dodge your attacks if you knock their saber throw to the ground +- NPC Jedi get up much more quickly on higher difficulties (no easy marios for the win) +- NPC Jedi will activate their saber very quickly after being gripped or drained based on difficulty and rank +- Force Cultists react properly to explosives, sniper shots, and saber throws now +- Non-saber wielding NPCs with Class_Reborn try extra hard to dodge saber attacks and throws (because they can't block) +- Light Jedi with non-dark Jedi AI (class_reborn, class_desann, etc.) classes don't attack surrendered or unarmed enemies now +- Grenadier Grans will alternate punches/thermal detonators even if your saber is out if you are really close to +them. +- NPCs surrender better... (to-do) +NPC other -- - Allied NPCs receive 150%/125%/100% HP for Padawan/Jedi/Jedi Knight difficulties now instead of 100/125/150 like enemy npcs +- Assassin Droids now fire even with their shields up +- Class_Rodian with E11 and Class_Imperial at commander rank use alt-fire now always + +Saber System: *(with g_saberNewCombat 1) +* saber offense and defense increase your offense and defensive strength in parries: + - offense controls your power level (+2/4/6), and is modified by saber style (-2/0/+2/-1/+1/-1/+1 for fast/med/strong/duals + /staff/tavion/desann), defense controls your defense strength (+2/4/6, not affected by saber style) + - if an attack powerlevel is greater than defense strength, you can still block it but you lose some block points + - if you lose enough block points, your guard is crushed; block points regenerate while walking/standing still and not attacking + - special attacks don't drain block points but either break through completely or are blocked partially +* red/strong can be blocked now, but is faster and less unwieldy (and more realistic I think) +* staff and duals cannot chain -NPC AI - -- Improvements to NPC AI pertaining to the use of JA-exclusive abilities; -NPCs only use Force Rage if close to the player, if have > 25% HP, they only kick if close to the player +- at higher difficulties, blaster bolts are deflected in the direction of the crosshair instead of being auto-aimed +- your ability to parry saber attacks (TO DO) and deflect blaster fire is slightly improved while walking/standing still +- you do a full slash even if starting with your saber off -- TO DO +- Desann style is full strength if you are CLASS_DESANN, otherwise it is a cross between medium/strong +(it has the same power level as staff, and can knock down enemies but is unlikely to) +- attack chain amounts tweaked slightly, not random now (not completely), can only chain 2 slashes if running, +staff and duals cannot chain infinitely (5 slash maximum now) +- staff power is nerfed so it is not as strong as strong style now, but slightly more powerful than medium +- staff sabers are now thrown double-bladed +Melee changes: +- Player gets a weaker version of melee katas now based on saber offense level (1 - punches and kicks, 2 - katas, 3 - spin kicks) +- Player melee katas have less range, must be aimed more precisely, and do not work on certain types of enemies +- Spin kicks and the like are enabled for Saber Offense 3 and do slightly more damage +- Can do spin kicks on demand by holding Use and pressing the kick button, however this costs Force power +- kicks knocking down an enemy jedi depends on your saber offense vs. their saber defense +- Player punches do 7/5 damage now instead of 6/3 and aren't randomized now +- Force Speed punching is more consistent now and less cheap -- test +- Heavy melee is specifically associated with Chewbacca, Class_Gran, and Class_Trandoshan, other NPC types will punch +more quickly but weaker if given WP_MELEE -- test & fix -Game additions - -- Save games allow for screenshots now like JK2 +Other additions - +- Save games allow for screenshots now like JK2 -- fix - Visual effect for blocking Force Lightning with your lightsaber -- A modified saber system is available with the g_saberNewCombat command; with slightly rebalanced saber styles and adjustments to how Saber Offense, Defense, and .sab parry and breakparry bonuses affect saber combat -- g_saberDeflectAutoAim (0/1) cvar added, if 0 deflected shots go in the direction of the player's crosshair as opposed to being auto-aimed with the likelihood of the shots being deflected toward the crosshair increasing with Saber Defense level -- g_saberDamageScale cvar added for more precise control over saber damage (fully compatible with g_saberMoreRealistic) +- handicap can go up to 200 +- r_dynamicglowintensity cvar is saved and written to jaconfig now +- rolls and acrobatics are possible in 1st person view Things to do - -- Kick-Saber Throw alternate and Kata switch button - partial done -- Saber Offense controlling melee and kicking abilities - done -- Savegame screenshots working in the loading screen +- Savegame screenshots working in the loading screen - got broken - handicap cvar going past 100, separate cvar for player HP and Shields - partial done -- g_autoRoll cvar, g_charForcePoints cvar, g_charForceRegen cvar - done -- have r_dynamicglowintensity cvar be archived - done -- NPCs surrender bettur -- Jedi saber throw evasion +- Reborn masters with constant saber throwing + lightning +- NPCs avoid cliffs? -- not able +- NPCDamageMult, NPCAltDamageMult, saber ignition/deignition time fields in weapons.dat +- Force push strong version, mindtrick changes - not done +- Doing a full slash when starting saber off - not done +- camera controls (1st, 2nd, 3rd, 4th person) +- Fix NPCs surrendering ------------------------------------------------------------------------------------------------------------------------- (OpenJK changelog) diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index fb03e500b3..8a0ee5df61 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -337,6 +337,17 @@ vmCvar_t cg_speedTrail; vmCvar_t cg_fovViewmodel; vmCvar_t cg_fovViewmodelAdjust; +//new cvars - Dusty +/* +vmCvar_t cg_lightningBolts; +vmCvar_t cg_lightningWideBolts; +vmCvar_t cg_pushBlurSpeed; +vmCvar_t cg_pushBlurSize; +vmCvar_t cg_pullBlurSpeed; +vmCvar_t cg_pullBlurSize; +*/ + + typedef struct { vmCvar_t *vmCvar; const char *cvarName; diff --git a/code/game/AI_Civilian.cpp b/code/game/AI_Civilian.cpp index 81eb42d276..f8666b9f57 100644 --- a/code/game/AI_Civilian.cpp +++ b/code/game/AI_Civilian.cpp @@ -24,7 +24,7 @@ along with this program; if not, see . #include "b_local.h" #include "Q3_Interface.h" -extern qboolean NPC_CheckSurrender( void ); +extern qboolean NPC_CheckSurrender( qboolean noEscape = qfalse ); extern void NPC_BehaviorSet_Default( int bState ); void NPC_BSCivilian_Default( int bState ) diff --git a/code/game/AI_Grenadier.cpp b/code/game/AI_Grenadier.cpp index 988946f8c3..8d8047f306 100644 --- a/code/game/AI_Grenadier.cpp +++ b/code/game/AI_Grenadier.cpp @@ -525,11 +525,14 @@ void NPC_BSGrenadier_Attack( void ) if ( !trace.allsolid && !trace.startsolid && (trace.fraction == 1.0 || trace.entityNum == NPC->enemy->s.number ) ) {//I can get right to him //reset fire-timing variables - NPC_ChangeWeapon( WP_MELEE ); - if ( !(NPCInfo->scriptFlags&SCF_CHASE_ENEMIES) )//NPCInfo->behaviorState == BS_STAND_AND_SHOOT ) - {//FIXME: should we be overriding scriptFlags? - NPCInfo->scriptFlags |= SCF_CHASE_ENEMIES;//NPCInfo->behaviorState = BS_HUNT_AND_KILL; - } + if (NPCInfo->aiFlags&NPCAI_HEAVY_MELEE) + { + NPC_ChangeWeapon(WP_MELEE); + if (!(NPCInfo->scriptFlags&SCF_CHASE_ENEMIES))//NPCInfo->behaviorState == BS_STAND_AND_SHOOT ) + {//FIXME: should we be overriding scriptFlags? + NPCInfo->scriptFlags |= SCF_CHASE_ENEMIES;//NPCInfo->behaviorState = BS_HUNT_AND_KILL; + } + } } } } diff --git a/code/game/AI_Jedi.cpp b/code/game/AI_Jedi.cpp index fb6cef3440..7ddc1452cf 100644 --- a/code/game/AI_Jedi.cpp +++ b/code/game/AI_Jedi.cpp @@ -3934,11 +3934,6 @@ static qboolean Jedi_SaberBlock( void ) } */ - if (NPC->s.weapon != WP_SABER) - {//we are not a saber wielder - return qfalse; - } - if ( !TIMER_Done( NPC, "parryReCalcTime" ) ) {//can't do our own re-think of which parry to use yet return qfalse; @@ -4203,21 +4198,27 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en { vec3_t dirEnemy2Me; int evasionChance = 30;//only step aside 30% if he's moving at me but not attacking + if (NPC->s.weapon != WP_SABER) + {//be more wary of approaching enemy even if he's not attacking + evasionChance = 40; + } + qboolean enemy_attacking = qfalse; qboolean throwing_saber = qfalse; qboolean shooting_lightning = qfalse; + if ( !NPC->enemy->client ) { return; } - else if ( NPC->enemy->client - && NPC->enemy->s.weapon == WP_SABER + else if ( NPC->enemy->client + && NPC->enemy->s.weapon == WP_SABER && NPC->enemy->client->ps.saberLockTime > level.time ) {//don't try to block/evade an enemy who is in a saberLock return; } - else if ( (NPC->client->ps.saberEventFlags&SEF_LOCK_WON) + else if ( (NPC->client->ps.saberEventFlags&SEF_LOCK_WON) && NPC->enemy->painDebounceTime > level.time ) {//pressing the advantage of winning a saber lock return; @@ -4252,8 +4253,7 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en else if ( Jedi_CheckEvadeSpecialAttacks() != EVASION_NONE ) { return; - } - + } VectorSubtract( NPC->currentOrigin, NPC->enemy->currentOrigin, dirEnemy2Me ); VectorNormalize( dirEnemy2Me ); @@ -4271,16 +4271,16 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en evasionChance = 50; } - if ( NPC->enemy->client->ps.saberInFlight - && NPC->enemy->client->ps.saberEntityNum != ENTITYNUM_NONE + if ( NPC->enemy->client->ps.saberInFlight + && NPC->enemy->client->ps.saberEntityNum != ENTITYNUM_NONE && NPC->enemy->client->ps.saberEntityState != SES_RETURNING ) {//enemy is saber throwing enemy_attacking = qtrue; throwing_saber = qtrue; - if (NPC->s.weapon == WP_MELEE) - {//melee users are more aware they need to evade - evasionChance += 5; - } + if (NPC->s.weapon != WP_SABER) + {//I can't block it so have to dodge + evasionChance = 90; + } } //FIXME: this needs to take skill and rank(reborn type) into account much more @@ -4297,9 +4297,9 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en {//he's moving facingAmt = DotProduct( enemy_movedir, dirEnemy2Me ); } - + if ( Q_flrand( 0.25, 1 ) < facingAmt ) - {//coming at/facing me! + {//coming at/facing me! int whichDefense = 0; /*if ( NPC->client->NPC_class == CLASS_SABOTEUR ) { @@ -4321,13 +4321,13 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en return; } } - else */if ( NPC->client->ps.weaponTime - || NPC->client->ps.saberInFlight - || NPC->client->NPC_class == CLASS_BOBAFETT + else */if ( NPC->client->ps.weaponTime + || NPC->client->ps.saberInFlight + || NPC->client->NPC_class == CLASS_BOBAFETT || (NPC->client->NPC_class == CLASS_REBORN && NPC->s.weapon != WP_SABER) || NPC->client->NPC_class == CLASS_ROCKETTROOPER ) {//I'm attacking or recovering from a parry, can only try to strafe/jump right now - if ( Q_irand( 0, 10 ) < NPCInfo->stats.aggression ) + if ( (Q_irand( 0, 10 ) < NPCInfo->stats.aggression && NPC->s.weapon == WP_SABER)) { return; } @@ -4404,7 +4404,7 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en if ( whichDefense >= 4 && whichDefense <= 12 ) {//would try to block - if ( NPC->client->ps.saberInFlight || NPC->s.weapon != WP_SABER ) + if ( NPC->client->ps.saberInFlight ) {//can't, saber in not in hand, so fall back to strafe/jump whichDefense = 100; } @@ -4419,8 +4419,10 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en //use jedi force push? or kick? //FIXME: try to do this if health low or enemy back to a cliff? if ( Jedi_DecideKick(enemy_dist)//let's try a kick - && ( G_PickAutoMultiKick( NPC, qfalse, qtrue ) != LS_NONE - || (G_CanKickEntity(NPC, NPC->enemy )&&G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE))) + && ( G_PickAutoMultiKick( NPC, qfalse, qtrue ) != LS_NONE + || (G_CanKickEntity(NPC, NPC->enemy )&&G_PickAutoKick( NPC, NPC->enemy, qtrue )!=LS_NONE) + ) + ) {//kicked TIMER_Set( NPC, "kickDebounce", Q_irand( 3000, 10000 ) ); } @@ -4448,23 +4450,25 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en if ( !Q_irand( 0, 5 ) || !Jedi_Strafe( 300, 1000, 0, 1000, qfalse ) ) {//certain chance they will pick an alternative evasion //if couldn't strafe, try a different kind of evasion... - if ( Jedi_DecideKick(enemy_dist) && G_CanKickEntity(NPC, NPC->enemy ) && G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE ) + if (NPC->s.weapon == WP_SABER && Jedi_DecideKick(enemy_dist) && G_CanKickEntity(NPC, NPC->enemy) && G_PickAutoKick(NPC, NPC->enemy, qtrue) != LS_NONE) {//kicked! TIMER_Set( NPC, "kickDebounce", Q_irand( 3000, 10000 ) ); } else if ( shooting_lightning || throwing_saber || enemy_dist < 80 ) { //FIXME: force-jump+forward - jump over the guy! - if ( shooting_lightning || (!Q_irand( 0, 2 ) && NPCInfo->stats.aggression < 4 && TIMER_Done( NPC, "parryTime" ) ) ) - { + if ( shooting_lightning || (!Q_irand( 0, 2 ) + && (NPCInfo->stats.aggression < 4 || NPC->s.weapon != WP_SABER || NPC->client->ps.saberInFlight) + && TIMER_Done( NPC, "parryTime" ) ) ) + { if ( (NPCInfo->rank == RANK_ENSIGN || NPCInfo->rank > RANK_LT_JG) && !shooting_lightning && Q_irand( 0, 2 ) ) {//FIXME: check forcePushRadius[NPC->client->ps.forcePowerLevel[FP_PUSH]] ForceThrow( NPC, qfalse ); } - else if ( (NPCInfo->rank==RANK_CREWMAN||NPCInfo->rank>RANK_LT_JG) - && !(NPCInfo->scriptFlags&SCF_NO_ACROBATICS) + else if ( (NPCInfo->rank==RANK_CREWMAN||NPCInfo->rank>RANK_LT_JG) + && !(NPCInfo->scriptFlags&SCF_NO_ACROBATICS) && NPC->client->ps.forceRageRecoveryTime < level.time - && !(NPC->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1<client->ps ) ) {//FIXME: make this a function call? //FIXME: check for clearance, safety of landing spot? @@ -4492,19 +4496,24 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en } } } - else if ( enemy_attacking ) + else if (enemy_attacking || (enemy_approaching && (NPC->s.weapon != WP_SABER || NPC->client->ps.saberInFlight))) { - if (NPC->s.weapon == WP_MELEE) - {//melee users try to kick as a last resort + if (!enemy_attacking && enemy_approaching && (NPC->s.weapon != WP_SABER || NPC->client->ps.saberInFlight)) + { + /* if (Jedi_DecideKick(enemy_dist) && G_CanKickEntity(NPC, NPC->enemy) && G_PickAutoKick(NPC, NPC->enemy, qtrue) != LS_NONE) {//kicked! TIMER_Set(NPC, "kickDebounce", Q_irand(3000, 10000)); - } + }*/ + + //if enemy hasn't slashed yet try just backing away + Jedi_StartBackOff(); } else { Jedi_SaberBlock(); - } + } + } } } @@ -4514,15 +4523,15 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en { gi.Printf( "def strafe\n" ); } - if ( !(NPCInfo->scriptFlags&SCF_NO_ACROBATICS) + if ( !(NPCInfo->scriptFlags&SCF_NO_ACROBATICS) && NPC->client->ps.forceRageRecoveryTime < level.time - && !(NPC->client->ps.forcePowersActive&(1<rank == RANK_CREWMAN || NPCInfo->rank > RANK_LT_JG ) + && !(NPC->client->ps.forcePowersActive&(1<rank == RANK_CREWMAN || NPCInfo->rank > RANK_LT_JG ) && !PM_InKnockDown( &NPC->client->ps ) && !Q_irand( 0, 5 ) ) {//FIXME: make this a function call? //FIXME: check for clearance, safety of landing spot? - if ( NPC->client->NPC_class == CLASS_BOBAFETT + if ( NPC->client->NPC_class == CLASS_BOBAFETT || (NPC->client->NPC_class == CLASS_REBORN && NPC->s.weapon != WP_SABER) || NPC->client->NPC_class == CLASS_ROCKETTROOPER ) { @@ -4538,7 +4547,7 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en } break; } - + //turn off slow walking no matter what TIMER_Set( NPC, "walking", -level.time ); TIMER_Set( NPC, "taunting", -level.time ); @@ -5452,8 +5461,29 @@ static qboolean Jedi_AttackDecide( int enemy_dist ) } if ( (NPCInfo->scriptFlags&SCF_DONT_FIRE) ) - {//not allowed to attack - return qfalse; + {//melee cultists punch rarely + if (NPC->s.weapon == WP_MELEE + && enemy_dist <= 0 + && (NPC->client->ps.groundEntityNum != ENTITYNUM_NONE + && NPC->enemy->client->ps.groundEntityNum != ENTITYNUM_NONE)) //both on ground + { + if (!(NPC->client->ps.forcePowerDebounce[FP_PUSH] > level.time || NPC->client->ps.forcePowerDebounce[FP_PULL] > level.time + || NPC->client->ps.forcePowerDebounce[FP_DRAIN] > level.time || NPC->client->ps.forcePowerDebounce[FP_LIGHTNING] > level.time)) + {//not in the middle of pushing, pulling, draining, or zapping + if ((level.time - NPC->client->ps.forcePowerDebounce[FP_PUSH] < 1500 + || level.time - NPC->client->ps.forcePowerDebounce[FP_PUSH] < 1500)) //we tried pushing/pulling the last 1.5 seconds + {//we already tried to push/pull and aren't using another force power + if (!Q_irand(0, 10) - NPCInfo->stats.aggression) + { + TIMER_Set(NPC, "attackDelay", Q_irand(500, 2000)); //don't try a punch again for a while + } + } + } + } + else { + return qfalse; + } + } if ( !(ucmd.buttons&BUTTON_ATTACK) @@ -7031,8 +7061,8 @@ static void Jedi_Attack( void ) } } - if( (NPCInfo->scriptFlags&SCF_DONT_FIRE) //not allowed to attack - || ((NPC->client->ps.forcePowersActive&(1<client->ps.forcePowerLevel[FP_HEAL]scriptFlags&SCF_DONT_FIRE) //not allowed to attack... well maybe rarely + ((NPC->client->ps.forcePowersActive&(1<client->ps.forcePowerLevel[FP_HEAL]client->ps.saberEventFlags&SEF_INWATER)&&!NPC->client->ps.saberInFlight) )//saber in water { ucmd.buttons &= ~(BUTTON_ATTACK|BUTTON_ALT_ATTACK|BUTTON_FORCE_FOCUS); diff --git a/code/game/NPC.cpp b/code/game/NPC.cpp index a575c756c2..2233e379fe 100644 --- a/code/game/NPC.cpp +++ b/code/game/NPC.cpp @@ -1217,8 +1217,7 @@ void NPC_HandleAIFlags (void) } void NPC_AvoidWallsAndCliffs (void) -{ -/* +{/* vec3_t forward, right, testPos, angles, mins; trace_t trace; float fwdDist, rtDist; @@ -1249,7 +1248,7 @@ void NPC_AvoidWallsAndCliffs (void) // straight into a wall or off a cliff unless we really wanted to? return; } - + VectorCopy( NPC->mins, mins ); mins[2] += STEPSIZE; angles[YAW] = NPC->client->ps.viewangles[YAW];//Add ucmd.angles[YAW]? @@ -1265,6 +1264,7 @@ void NPC_AvoidWallsAndCliffs (void) ucmd.rightmove = 0; return; } + VectorCopy(trace.endpos, testPos); testPos[2] -= 128; @@ -1279,7 +1279,7 @@ void NPC_AvoidWallsAndCliffs (void) ucmd.forwardmove = 0; ucmd.rightmove = 0; return; -*/ + */ } void NPC_CheckAttackScript(void) @@ -1913,7 +1913,7 @@ NPC_RunBehavior ------------------------- */ extern void NPC_BSEmplaced( void ); -extern qboolean NPC_CheckSurrender( void ); +extern qboolean NPC_CheckSurrender( qboolean noEscape = qfalse ); extern void NPC_BSRT_Default( void ); extern void NPC_BSCivilian_Default( int bState ); extern void NPC_BSSD_Default( void ); @@ -2300,16 +2300,10 @@ void NPC_ExecuteBState ( gentity_t *self)//, int msec ) && (NPC->client->playerTeam != TEAM_FREE || (NPC->client->NPC_class == CLASS_TUSKEN && Q_irand( 0, 4 )))//not a rampaging creature or I'm a tusken and I feel generous (temporarily) && NPC->enemy->NPC && (NPC->enemy->NPC->surrenderTime > level.time || (NPC->enemy->NPC->scriptFlags&SCF_FORCED_MARCH) - || (NPC_JediClassGood(NPC) && (NPC->enemy->s.weapon == WP_NONE || (NPC->enemy->s.weapon == WP_MELEE && !NPC->enemy)))) - ) + || (NPC_JediClassGood(NPC) && (NPC->enemy->s.weapon == WP_NONE || (NPC->enemy->s.weapon == WP_MELEE && !NPC->enemy))))) {//don't shoot someone who's surrendering if you're a good guy, especially if you're a Jedi ucmd.buttons &= ~BUTTON_ATTACK; ucmd.buttons &= ~BUTTON_ALT_ATTACK; - - if (NPC_JediClassGood(NPC)) - { - NPC_CheckEnemy(qtrue, qfalse); - } } if(client->ps.weaponstate == WEAPON_IDLE) @@ -2370,6 +2364,15 @@ void NPC_ExecuteBState ( gentity_t *self)//, int msec ) NPC_ApplyRoff(); } + if (NPC->client->playerTeam != TEAM_PLAYER //not an enemy + && NPC_JediClassGood(NPC) + && NPC->enemy->NPC + && (NPC->enemy->NPC->surrenderTime > level.time || (NPC->enemy->NPC->scriptFlags&SCF_FORCED_MARCH) || NPC->enemy->s.weapon == WP_NONE || (NPC->enemy->s.weapon == WP_MELEE && !NPC->enemy))) + {//redundancy for Jedi because they like to attack anyway + ucmd.buttons &= ~BUTTON_ATTACK; + ucmd.buttons &= ~BUTTON_ALT_ATTACK; + } + // end of thinking cleanup NPCInfo->touchedByPlayer = NULL; diff --git a/code/game/NPC_behavior.cpp b/code/game/NPC_behavior.cpp index a02fc4c223..27f182a86b 100644 --- a/code/game/NPC_behavior.cpp +++ b/code/game/NPC_behavior.cpp @@ -1518,7 +1518,7 @@ void NPC_Surrender( void ) WP_DropWeapon( NPC, NULL ); } if ( NPCInfo->surrenderTime < level.time - 5000 ) - {//haven't surrendered for at least 6 seconds, tell them what you're doing + {//haven't surrendered for at least 5 seconds, tell them what you're doing //FIXME: need real dialogue EV_SURRENDER NPCInfo->blockedSpeechDebounceTime = 0;//make sure we say this G_AddVoiceEvent( NPC, Q_irand( EV_PUSHED1, EV_PUSHED3 ), 3000 ); @@ -1541,8 +1541,8 @@ void NPC_Surrender( void ) else { NPC_SetAnim(NPC, SETANIM_TORSO, TORSO_SURRENDER_START, SETANIM_FLAG_HOLD | SETANIM_FLAG_OVERRIDE); - NPC->client->ps.torsoAnimTimer = 1000; - NPCInfo->surrenderTime = level.time + 1000;//stay surrendered for at least 1 second + NPC->client->ps.torsoAnimTimer = 1500; + NPCInfo->surrenderTime = level.time + NPC->client->ps.torsoAnimTimer + 1000;//stay surrendered for at least 1 second //FIXME: while surrendering, make a big sight/sound alert? Or G_AlertTeam? } } @@ -1570,14 +1570,108 @@ void NPC_Surrender( void ) else { NPC_SetAnim(NPC, SETANIM_TORSO, TORSO_SURRENDER_START, SETANIM_FLAG_HOLD | SETANIM_FLAG_OVERRIDE); - NPC->client->ps.torsoAnimTimer = 1000; + NPC->client->ps.torsoAnimTimer = 1500; } } NPCInfo->surrenderTime = level.time + NPC->client->ps.torsoAnimTimer + 1000; } } -qboolean NPC_CheckSurrender( void ) +extern int NPC_CheckMultipleEnemies(gentity_t *closestTo, int enemyTeam, qboolean checkVis); + +qboolean NPC_CheckSurrender(qboolean noEscape = qfalse) +{ + if (!g_AIsurrender->integer + && NPC->client->NPC_class != CLASS_UGNAUGHT + && NPC->client->NPC_class != CLASS_JAWA) + {//not enabled + return qfalse; + } + if (!Q3_TaskIDPending(NPC, TID_MOVE_NAV) //not scripted to go somewhere + && NPC->client->ps.groundEntityNum != ENTITYNUM_NONE //not in the air + && !NPC->client->ps.weaponTime && !PM_InKnockDown(&NPC->client->ps)//not firing and not on the ground + && NPC->enemy && NPC->enemy->client && NPC->enemy->enemy == NPC && NPC->enemy->s.weapon != WP_NONE && (NPC->enemy->s.weapon != WP_MELEE || (NPC->enemy->client->NPC_class == CLASS_RANCOR || NPC->enemy->client->NPC_class == CLASS_WAMPA))//enemy is using a weapon or is a Rancor or Wampa + && NPC->enemy->health > 20 && NPC->enemy->painDebounceTime < level.time - 3000 && NPC->enemy->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] < level.time - 1000) + {//don't surrender if scripted to run somewhere or if we're in the air or if we're busy or if we don't have an enemy or if the enemy is not mad at me or is hurt or not a threat or busy being attacked + //FIXME: even if not in a group, don't surrender if there are other enemies in the PVS and within a certain range? + + //we "might" surrender, check number of enemies + int numEnemies = NPC_CheckMultipleEnemies(NPC, NPC->client->enemyTeam, 0); + int relNumEnemies = numEnemies - NPCInfo->group->numGroup; + //0 means there is a 1-1 ratio, < 0 means my group is bigger by x, > 0 means my group is smaller by x + + if (numEnemies == 1 && (NPC->enemy->s.weapon == WP_MELEE || NPC->enemy->s.weapon == WP_NONE)) + {//maybe we should try to melee fight? Or at least don't officially surrender... just kind of stand there + //FIXME: If the enemy is attacking me with melee I should fight back or run... + return qfalse; + } + + if (noEscape) + {//I was fleeing but I got cornered, I don't have other options so have to give up... + //NPC_FaceEnemy(); + NPC_Surrender(); + NPC_UpdateAngles(qtrue, qtrue); + return qtrue; + } + + if ((NPCInfo->group && NPCInfo->group->numGroup > 1) + || (NPCInfo->group && NPCInfo->group->numGroup > numEnemies)) + { + //FIXME: I'm not alone... maybe less likely to surrender? + } + + if (NPC->s.weapon == WP_NONE + //NPC has a weapon + || NPC->enemy == player + || (NPC->enemy->s.weapon == WP_SABER&&NPC->enemy->client&&NPC->enemy->client->ps.SaberActive()) + || (NPC->enemy->NPC && NPC->enemy->NPC->group && NPC->enemy->NPC->group->numGroup > 2)) + {//surrender only if have no weapon or fighting a player or jedi or if we are outnumbered at least 3 to 1 + if (NPC->enemy == player) + {//player is the guy I'm running from + if ((g_crosshairEntNum == NPC->s.number && InFOV(player, NPC, 60, 30)) + || DistanceSquared(NPC->currentOrigin, player->currentOrigin) < 200 * 200 + || ((DistanceSquared(NPC->currentOrigin, player->currentOrigin) < 512 * 512) + && (InFOV(NPC, player, 60, 30) || numEnemies > 1))) + {//give up if I see player aiming at me, player is very close, or player is near and watching me/has buddies + //NPC_FaceEnemy(); + NPC_Surrender(); + NPC_UpdateAngles(qtrue, qtrue); + return qtrue; + } + } + else if (NPC->enemy) + {//running from another NPC + if (InFOV(NPC, NPC->enemy, 30, 30) || relNumEnemies > 1) + {//they're looking at me or have friends + //float maxDist = (128+(NPC->maxs[0]*1.5)+(NPC->enemy->maxs[0]*1.5)); //64 + float maxDist = 128; + float maxDistMultEnemies = 256; + maxDist *= maxDist; + maxDistMultEnemies *= maxDistMultEnemies; + if (DistanceSquared(NPC->currentOrigin, NPC->enemy->currentOrigin) < maxDist + || (numEnemies > 1 && DistanceSquared(NPC->currentOrigin, NPC->enemy->currentOrigin) < maxDistMultEnemies) + || NPC->painDebounceTime > level.time) + {//they're very close, or somewhat close and multiple enemies, or they just hit me + if (gi.inPVS(NPC->currentOrigin, NPC->enemy->currentOrigin)) + {//they're in the same room + //FIXME: should player-team NPCs not fire on surrendered NPCs? + //NPC_FaceEnemy(); + NPC_Surrender(); + NPC_UpdateAngles(qtrue, qtrue); + return qtrue; + } + } + } + } + } + } + + return qfalse; +} + + +/* +qboolean NPC_CheckSurrender( qboolean noEscape = qfalse ) { if ( !g_AIsurrender->integer && NPC->client->NPC_class != CLASS_UGNAUGHT @@ -1616,7 +1710,7 @@ qboolean NPC_CheckSurrender( void ) {//I'm not looking at them return qfalse; } - else if ( DistanceSquared( NPC->currentOrigin, player->currentOrigin ) < 65536/*256*256*/ ) + else if ( DistanceSquared( NPC->currentOrigin, player->currentOrigin ) < 512*512 ) {//they're not close return qfalse; } @@ -1624,55 +1718,69 @@ qboolean NPC_CheckSurrender( void ) {//they're not in the same room return qfalse; } - } + } + } + + //we "might" surrender, check number of enemies + int numEnemies = NPC_CheckMultipleEnemies(NPC, NPC->client->enemyTeam, 0); + int relNumEnemies = numEnemies - NPCInfo->group->numGroup; + //0 means there is a 1-1 ratio, < 0 means my group is bigger by x, > 0 means my group is smaller by x + + if (noEscape && ((NPC->enemy->s.weapon != WP_MELEE && NPC->enemy->s.weapon != WP_NONE) + || numEnemies > 1)) + {//I was fleeing but I got cornered, have to give up + //FIXME: Some enemies will try to melee fight? I dunno, might be kind of silly... + //NPC_FaceEnemy(); + NPC_Surrender(); + NPC_UpdateAngles(qtrue, qtrue); + return qtrue; } - if ( !NPCInfo->group || (NPCInfo->group && NPCInfo->group->numGroup <= 1) ) - {//I'm alone but I was in a group//FIXME: surrender anyway if just melee or no weap? + else if (NPC->enemy->s.weapon == WP_MELEE || NPC->enemy->s.weapon == WP_NONE) + { + //maybe we should try to melee fight? + return qfalse; + } + + if ( !NPCInfo->group || (NPCInfo->group && NPCInfo->group->numGroup <= 1) + || (NPCInfo->group && NPCInfo->group->numGroup < numEnemies) + || NPCInfo->group->) + {//I'm alone but I was in a group or my group is smaller than enemy group//FIXME: surrender anyway if just melee or no weap? if ( NPC->s.weapon == WP_NONE - //NPC has a weapon + //NPC has a weapon || NPC->enemy == player || (NPC->enemy->s.weapon == WP_SABER&&NPC->enemy->client&&NPC->enemy->client->ps.SaberActive()) - || (NPC->enemy->NPC && NPC->enemy->NPC->group && NPC->enemy->NPC->group->numGroup > 2) ) + || (NPC->enemy->NPC && NPC->enemy->NPC->group && NPC->enemy->NPC->group->numGroup > 2)) {//surrender only if have no weapon or fighting a player or jedi or if we are outnumbered at least 3 to 1 - if ( NPC->enemy == player ) - {//player is the guy I'm running from - if ( g_crosshairEntNum == NPC->s.number ) - {//give up if player is aiming at me - NPC_FaceEnemy(); + if (NPC->enemy == player) + {//player is the guy I'm running from + if ((g_crosshairEntNum == NPC->s.number && InFOV(player, NPC, 60, 30)) + || DistanceSquared(NPC->currentOrigin, player->currentOrigin) < 200 * 200 + || ((DistanceSquared(NPC->currentOrigin, player->currentOrigin) < 512 * 512) + && (InFOV(NPC, player, 60, 30) || relNumEnemies > 1))) + {//give up if I see player aiming at me, player is very close, or player is near and watching me/has buddies + //NPC_FaceEnemy(); NPC_Surrender(); - NPC_UpdateAngles( qtrue, qtrue ); + NPC_UpdateAngles(qtrue, qtrue); return qtrue; - } - else if ( player->s.weapon == WP_SABER ) - {//player is using saber - if ( InFOV( NPC, player, 60, 30 ) ) - {//they're looking at me - if ( DistanceSquared( NPC->currentOrigin, player->currentOrigin ) < 16384/*128*128*/ ) - {//they're close - if ( gi.inPVS( NPC->currentOrigin, player->currentOrigin ) ) - {//they're in the same room - NPC_FaceEnemy(); - NPC_Surrender(); - NPC_UpdateAngles( qtrue, qtrue ); - return qtrue; - } - } - } - } - } + } + } else if ( NPC->enemy ) - {//??? - //should NPC's surrender to others? - if ( InFOV( NPC, NPC->enemy, 30, 30 ) ) - {//they're looking at me - float maxDist = (64+(NPC->maxs[0]*1.5)+(NPC->enemy->maxs[0]*1.5)); + {//running from another NPC + if (InFOV(NPC, NPC->enemy, 30, 30) || relNumEnemies > 1) + {//they're looking at me or have friends + //float maxDist = (128+(NPC->maxs[0]*1.5)+(NPC->enemy->maxs[0]*1.5)); //64 + float maxDist = 128; + float maxDistMultEnemies = 256; maxDist *= maxDist; - if ( DistanceSquared( NPC->currentOrigin, NPC->enemy->currentOrigin ) < maxDist ) - {//they're close + maxDistMultEnemies *= maxDistMultEnemies; + if ( DistanceSquared( NPC->currentOrigin, NPC->enemy->currentOrigin ) < maxDist + || (numEnemies > 1 && DistanceSquared(NPC->currentOrigin, NPC->enemy->currentOrigin) < maxDistMultEnemies) + || NPC->painDebounceTime > level.time) + {//they're very close, or somewhat close and multiple enemies, or they just hit me if ( gi.inPVS( NPC->currentOrigin, NPC->enemy->currentOrigin ) ) {//they're in the same room //FIXME: should player-team NPCs not fire on surrendered NPCs? - NPC_FaceEnemy(); + //NPC_FaceEnemy(); NPC_Surrender(); NPC_UpdateAngles( qtrue, qtrue ); return qtrue; @@ -1686,6 +1794,7 @@ qboolean NPC_CheckSurrender( void ) } return qfalse; } +*/ void NPC_JawaFleeSound( void ) { @@ -1713,7 +1822,7 @@ qboolean NPC_BSFlee( void ) bool moveSuccess = false; bool inSurrender = (level.timesurrenderTime); - if (NPC_CheckSurrender()) + if (TIMER_Done(NPC, "panic") && NPC_CheckSurrender()) { return qfalse; } @@ -1722,7 +1831,7 @@ qboolean NPC_BSFlee( void ) //------------------------------------ NPC_CheckEnemy(qtrue, qfalse); NPC_CheckAlertEvents(qtrue, qtrue, -1, qfalse, AEL_DANGER, qfalse); - if (NPC->enemy && G_ClearLOS(NPC, NPC->enemy)) + if (NPC->enemy) { NPCInfo->enemyLastSeenTime = level.time; } @@ -1867,11 +1976,9 @@ qboolean NPC_BSFlee( void ) if ( TIMER_Done( NPC, "panic" ) ) { //done panicking, time to realize we're dogmeat, if we haven't been able to flee for a few seconds - if ((level.time-NPC->lastMoveTime)>3000 - /*&& (level.time-NPCInfo->surrenderTime) > 2000*/)//and haven't just finished surrendering + if ((level.time - NPC->lastMoveTime)>3000) { - NPC_FaceEnemy(); - NPC_Surrender(); + NPC_CheckSurrender(true); } } diff --git a/code/game/NPC_combat.cpp b/code/game/NPC_combat.cpp index 77d71cd605..1ff68bfc25 100644 --- a/code/game/NPC_combat.cpp +++ b/code/game/NPC_combat.cpp @@ -940,8 +940,8 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) break; case WP_MELEE: - case WP_TUSKEN_STAFF: ent->NPC->aiFlags &= ~NPCAI_BURST_WEAPON; + ent->NPC->burstSpacing = 1000;//attackdebounce if (ent->NPC->aiFlags & NPCAI_HEAVY_MELEE) { //heavy melee guys punch a bit slower ent->NPC->burstSpacing = 1000;//attackdebounce @@ -951,6 +951,10 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) ent->NPC->burstSpacing = 500;//attackdebounce } break; + case WP_TUSKEN_STAFF: + ent->NPC->aiFlags &= ~NPCAI_BURST_WEAPON; + ent->NPC->burstSpacing = 1000;//attackdebounce + break; case WP_ATST_MAIN: case WP_ATST_SIDE: @@ -1593,7 +1597,7 @@ You can mix and match any of those options (example: find closest visible player FIXME: this should go through the snapshot and find the closest enemy */ -gentity_t *NPC_PickEnemy( gentity_t *closestTo, int enemyTeam, qboolean checkVis, qboolean findPlayersFirst, qboolean findClosest ) +gentity_t *NPC_PickEnemy(gentity_t *closestTo, int enemyTeam, qboolean checkVis, qboolean findPlayersFirst, qboolean findClosest) { int num_choices = 0; int choice[128];//FIXME: need a different way to determine how many choices? @@ -1886,6 +1890,151 @@ gentity_t *NPC_PickEnemy( gentity_t *closestTo, int enemyTeam, qboolean checkVis return &g_entities[ choice[rand() % num_choices] ]; } +//returns the number of enemies around an NPC + +int NPC_CheckMultipleEnemies(gentity_t *closestTo, int enemyTeam, qboolean checkVis) +{ + int num_choices = 0; + int choice[128];//FIXME: need a different way to determine how many choices? + gentity_t *newenemy = NULL; + gentity_t *closestEnemy = NULL; + int entNum; + vec3_t diff; + float relDist; + float bestDist = Q3_INFINITE; + qboolean failed = qfalse; + int visChecks = (CHECK_360 | CHECK_FOV | CHECK_VISRANGE); + int minVis = VIS_FOV; + + if (enemyTeam == TEAM_NEUTRAL) + { + return NULL; + } + + if (NPCInfo->behaviorState == BS_STAND_AND_SHOOT || + NPCInfo->behaviorState == BS_HUNT_AND_KILL) + {//Formations guys don't require inFov to pick up a target + //These other behavior states are active battle states and should not + //use FOV. FOV checks are for enemies who are patrolling, guarding, etc. + visChecks &= ~CHECK_FOV; + minVis = VIS_360; + } + + /* + //FIXME: used to have an option to look *only* for the player... now...? Still need it? + if ( enemyTeam == TEAM_PLAYER ) + {//couldn't find the player + return NULL; + } + */ + + num_choices = 0; + bestDist = Q3_INFINITE; + closestEnemy = NULL; + + for (entNum = 0; entNum < globals.num_entities; entNum++) + { + newenemy = &g_entities[entNum]; + + if (newenemy != NPC && (newenemy->client || newenemy->svFlags & SVF_NONNPC_ENEMY) && !(newenemy->flags & FL_NOTARGET) && !(newenemy->s.eFlags & EF_NODRAW)) + { + if (newenemy->health > 0) + { + if ((newenemy->client && NPC_ValidEnemy(newenemy)) + || (!newenemy->client && newenemy->noDamageTeam == enemyTeam)) + {//FIXME: check for range and FOV or vis? + if (NPC->client->playerTeam == TEAM_PLAYER && enemyTeam == TEAM_PLAYER) + {//player allies turning on ourselves? How? + if (newenemy->s.number) + {//only turn on the player, not other player allies + continue; + } + } + + if (newenemy != NPC->lastEnemy) + {//Make sure we're not just going back and forth here + if (!gi.inPVS(newenemy->currentOrigin, NPC->currentOrigin)) + { + continue; + } + + if (NPCInfo->behaviorState == BS_INVESTIGATE || NPCInfo->behaviorState == BS_PATROL) + { + if (!NPC->enemy) + { + if (!InVisrange(newenemy)) + { + continue; + } + else if (NPC_CheckVisibility(newenemy, CHECK_360 | CHECK_FOV | CHECK_VISRANGE) != VIS_FOV) + { + continue; + } + } + } + + VectorSubtract(closestTo->currentOrigin, newenemy->currentOrigin, diff); + relDist = VectorLengthSquared(diff); + if (newenemy->client && newenemy->client->hiddenDist > 0) + { + if (relDist > newenemy->client->hiddenDist*newenemy->client->hiddenDist) + { + //out of hidden range + if (VectorLengthSquared(newenemy->client->hiddenDir)) + {//They're only hidden from a certain direction, check + float dot; + + VectorNormalize(diff); + dot = DotProduct(newenemy->client->hiddenDir, diff); + if (dot > 0.5) + {//I'm not looking in the right dir toward them to see them + continue; + } + else + { + Debug_Printf(debugNPCAI, DEBUG_LEVEL_INFO, "%s saw %s trying to hide - hiddenDir %s targetDir %s dot %f\n", NPC->targetname, newenemy->targetname, vtos(newenemy->client->hiddenDir), vtos(diff), dot); + } + } + else + { + continue; + } + } + else + { + Debug_Printf(debugNPCAI, DEBUG_LEVEL_INFO, "%s saw %s trying to hide - hiddenDist %f\n", NPC->targetname, newenemy->targetname, newenemy->client->hiddenDist); + } + } + + if (!NPC_EnemyTooFar(newenemy, 0, qfalse)) + { + if (checkVis) + { + //if( NPC_CheckVisibility ( newenemy, CHECK_360|CHECK_FOV|CHECK_VISRANGE ) == VIS_FOV ) + if (NPC_CheckVisibility(newenemy, CHECK_360 | CHECK_VISRANGE) >= VIS_360) + { + choice[num_choices++] = newenemy->s.number; + } + } + else + { + choice[num_choices++] = newenemy->s.number; + } + } + } + } + } + } + } + + if (!num_choices) + { + return 0; + } + + return num_choices; +} + /* gentity_t *NPC_PickAlly ( void ) @@ -1995,6 +2144,21 @@ qboolean NPC_JediClassGoodGuy(class_t npc_class) { } } +qboolean NPC_CheckAttackSurrenderedEnemy(gentity_t *NPC) +{ + if (NPC->enemy + && NPC->enemy->NPC + && (NPC->enemy->NPC->surrenderTime > level.time || NPC->enemy->s.weapon == WP_NONE + || (NPC->enemy->s.weapon == WP_MELEE && !NPC->enemy)) + && NPC->client->playerTeam == TEAM_PLAYER + && NPC_JediClassGoodGuy(NPC->client->NPC_class)) + {//enemy is surrendering or not attacking and I'm a good guy Jedi + return qfalse; + } + + return qtrue; +} + gentity_t *NPC_CheckEnemy( qboolean findNew, qboolean tooFarOk, qboolean setEnemy ) { qboolean forcefindNew = qfalse; @@ -2031,19 +2195,6 @@ gentity_t *NPC_CheckEnemy( qboolean findNew, qboolean tooFarOk, qboolean setEnem return NULL; } - if (NPC->enemy - && NPC->enemy->NPC - && (NPC->enemy->NPC->surrenderTime > level.time || NPC->enemy->s.weapon == WP_NONE - || (NPC->enemy->s.weapon == WP_MELEE && !NPC->enemy)) - && NPC->client->playerTeam == TEAM_PLAYER - && NPC_JediClassGoodGuy(NPC->client->NPC_class)) - {//enemy is surrendering or not attacking and I'm a good guy Jedi - if (setEnemy) - { - G_ClearEnemy(NPC); - } - } - // Kyle does not get new enemies if not close to his leader if (NPC->client->NPC_class==CLASS_KYLE && NPC->client->leader && @@ -2227,6 +2378,13 @@ gentity_t *NPC_CheckEnemy( qboolean findNew, qboolean tooFarOk, qboolean setEnem } } } + + /*if (!NPC_CheckAttackSurrenderedEnemy(NPC)) + { + G_ClearEnemy(NPC); + return NULL; + }*/ + return newEnemy; } diff --git a/code/game/NPC_reactions.cpp b/code/game/NPC_reactions.cpp index c329d2a567..fc46fa2d41 100644 --- a/code/game/NPC_reactions.cpp +++ b/code/game/NPC_reactions.cpp @@ -228,6 +228,7 @@ void NPC_ChoosePainAnimation( gentity_t *self, gentity_t *other, const vec3_t po int pain_anim = -1; float pain_chance; + int punchImmuneTime = 0; if ( self->s.weapon == WP_THERMAL && self->client->fireDelay > 0 ) {//don't interrupt thermal throwing anim @@ -282,7 +283,16 @@ void NPC_ChoosePainAnimation( gentity_t *self, gentity_t *other, const vec3_t po } else if ( mod == MOD_MELEE ) {//higher in rank (skill) we are, less likely we are to be fazed by a punch - pain_chance = 1.0f - ((RANK_CAPTAIN-self->NPC->rank)/(float)RANK_CAPTAIN); + /*if (NPC->painDebounceTime < level.time - 350 * self->NPC->rank) + {//strong enemies are immune for a short time after being staggered by a punch + pain_chance = 0.0f; + } + else + { + pain_chance = 1.0f - ((self->NPC->rank) / (float)(RANK_CAPTAIN + 5)); + }*/ + + pain_chance = 1.0f - ((self->NPC->rank) / (float)(RANK_CAPTAIN + 2)); } else if ( self->client->NPC_class == CLASS_PROTOCOL ) { diff --git a/code/game/b_public.h b/code/game/b_public.h index 67916b99c5..fb94e2713d 100644 --- a/code/game/b_public.h +++ b/code/game/b_public.h @@ -91,6 +91,7 @@ along with this program; if not, see . #define SCF_NAV_CAN_JUMP 0x20000000 //Can attempt to jump when blocked #define SCF_FIRE_WEAPON_NO_ANIM 0x40000000 //Fire weapon but don't play weapon firing anim #define SCF_SAFE_REMOVE 0x80000000 //Remove NPC when it's safe (when player isn't looking) +//#define SCF_RESTRICT_FIRE 0x100000000 //NPC unlikely to fire except in special cases //#ifdef __DEBUG diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index 94bfe3dc8a..8cd260eae7 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -2637,12 +2637,12 @@ qboolean PM_SaberKataDoneNew(int curmove = LS_NONE, int newmove = LS_NONE) } } - if (pm->ps->saberAnimLevel == SS_DESANN && pm->ps->saberAttackChainCount > Q_irand(2, 3)) + if (pm->ps->saberAnimLevel == SS_DESANN && pm->ps->saberAttackChainCount > 3) { return qtrue; } - if (pm->ps->saberAnimLevel == SS_TAVION && pm->ps->saberAttackChainCount > Q_irand(4, 5)) + if (pm->ps->saberAnimLevel == SS_TAVION && pm->ps->saberAttackChainCount > 5) {//desann and tavion can link up as many attacks as they want return qtrue; } @@ -2650,11 +2650,11 @@ qboolean PM_SaberKataDoneNew(int curmove = LS_NONE, int newmove = LS_NONE) // not you can chain? Like if you were completely missed, you can't chain as much, or...? // And/Or based on FP_SABER_OFFENSE level? So number of attacks you can chain // increases with your FP_SABER_OFFENSE skill? - if (pm->ps->saberAnimLevel == SS_STAFF && pm->ps->saberAttackChainCount > Q_irand(4, 5)) + if (pm->ps->saberAnimLevel == SS_STAFF && pm->ps->saberAttackChainCount > 5) { return qtrue; } - else if (pm->ps->saberAnimLevel == SS_DUAL && pm->ps->saberAttackChainCount > Q_irand(4, 5)) + else if (pm->ps->saberAnimLevel == SS_DUAL && pm->ps->saberAttackChainCount > 5) { return qtrue; } @@ -2662,12 +2662,12 @@ qboolean PM_SaberKataDoneNew(int curmove = LS_NONE, int newmove = LS_NONE) { if (curmove == LS_NONE || newmove == LS_NONE) { - if (pm->ps->saberAnimLevel >= SS_STRONG && pm->ps->saberAttackChainCount > Q_irand(0, 1)) + if (pm->ps->saberAnimLevel >= SS_STRONG && pm->ps->saberAttackChainCount > 1) { return qtrue; } } - else if (pm->ps->saberAttackChainCount > Q_irand(2, 3)) + else if (pm->ps->saberAttackChainCount > 3) { return qtrue; } @@ -2696,7 +2696,7 @@ qboolean PM_SaberKataDoneNew(int curmove = LS_NONE, int newmove = LS_NONE) } else {//FIXME: have chainAngle influence fast and medium chains as well? - if (pm->ps->saberAnimLevel == SS_MEDIUM && pm->ps->saberAttackChainCount > Q_irand(4, 5)) + if (pm->ps->saberAnimLevel == SS_MEDIUM && pm->ps->saberAttackChainCount > 5) { return qtrue; } @@ -3179,6 +3179,10 @@ saberMoveName_t PM_SaberLungeAttackMove(qboolean fallbackToNormalLunge) return LS_SPINATTACK_DUAL; break; case SS_STAFF: + if ((pm->gent->s.number && !Q_irand(0, 3)) || pm->cmd.buttons&BUTTON_USE) + { + return LS_HILT_BASH; + } return LS_SPINATTACK; break; default://normal lunge @@ -5512,8 +5516,11 @@ void PM_SetAnimFinal(int *torsoAnim, int *legsAnim, - - + if ((*torsoAnim == BOTH_MELEE1 || *torsoAnim == BOTH_MELEE2) + && (pm->gent->s.number == 0 || !(pm->gent->NPC->aiFlags&NPCAI_HEAVY_MELEE))) + {//non-heavy punches are faster + animSpeed *= .1f; + } animSpeed *= (gent->resultspeed / moveSpeedOfAnim); if (animSpeed<0.01f) diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index f8bbac7a00..3dcfca8848 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -152,6 +152,7 @@ extern cvar_t *g_autoRoll; extern cvar_t *g_saberForceDrainAmount; extern cvar_t *g_saberLockSuperBreaks; extern cvar_t *g_saberNewCombat; +extern cvar_t *g_forceNewPowers; static void PM_SetWaterLevelAtPoint(vec3_t org, int *waterlevel, int *watertype); @@ -1103,6 +1104,17 @@ static qboolean PM_CheckJump(void) } */ + float jumpMultiplier; + + if (g_forceNewPowers->integer) + { + jumpMultiplier = 1.25; + } + else + { + jumpMultiplier = 1.0; + } + #if METROID_JUMP if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && pm->gent && pm->gent->client @@ -1248,9 +1260,9 @@ static qboolean PM_CheckJump(void) */ float curHeight = pm->ps->origin[2] - pm->ps->forceJumpZStart; //check for max force jump level and cap off & cut z vel - if ((curHeight <= forceJumpHeight[0] ||//still below minimum jump height + if ((curHeight <= forceJumpHeight[0] * jumpMultiplier ||//still below minimum jump height (pm->ps->forcePower&&pm->cmd.upmove >= 10)) &&////still have force power available and still trying to jump up - curHeight < forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]])//still below maximum jump height + curHeight < forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]] * jumpMultiplier)//still below maximum jump height {//can still go up //FIXME: after a certain amount of time of held jump, play force jump sound and flip if a dir is being held //FIXME: if hit a wall... should we cut velocity or allow them to slide up it? @@ -1408,12 +1420,12 @@ static qboolean PM_CheckJump(void) } //need to scale this down, start with height velocity (based on max force jump height) and scale down to regular jump vel - pm->ps->velocity[2] = (forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]] - curHeight) / forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]] * forceJumpStrength[pm->ps->forcePowerLevel[FP_LEVITATION]];//JUMP_VELOCITY; + pm->ps->velocity[2] = (forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]] * jumpMultiplier - curHeight) / forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]] * jumpMultiplier * forceJumpStrength[pm->ps->forcePowerLevel[FP_LEVITATION]];//JUMP_VELOCITY; pm->ps->velocity[2] /= 10; pm->ps->velocity[2] += JUMP_VELOCITY; pm->ps->pm_flags |= PMF_JUMP_HELD; } - else if (curHeight > forceJumpHeight[0] && curHeight < forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]] - forceJumpHeight[0]) + else if (curHeight > forceJumpHeight[0] && curHeight < forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]] * jumpMultiplier - forceJumpHeight[0]) {//still have some headroom, don't totally stop it if (pm->ps->velocity[2] > JUMP_VELOCITY) { @@ -2894,6 +2906,16 @@ static void PM_AirMove(void) { usercmd_t cmd; float gravMod = 1.0f; + float jumpMultiplier; + if (g_forceNewPowers->integer) + { + jumpMultiplier = 1.25; + } + else + { + jumpMultiplier = 1.0; + } + #if METROID_JUMP PM_CheckJump(); #endif @@ -3022,7 +3044,7 @@ static void PM_AirMove(void) { && pm->ps->velocity[2] > 0) {//I am force jumping and I'm not holding the button anymore float curHeight = pm->ps->origin[2] - pm->ps->forceJumpZStart + (pm->ps->velocity[2] * pml.frametime); - float maxJumpHeight = forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]]; + float maxJumpHeight = forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]] * jumpMultiplier; if (curHeight >= maxJumpHeight) {//reached top, cut velocity pm->ps->velocity[2] = 0; @@ -3972,6 +3994,16 @@ static void PM_CrashLand(void) float delta = 0; qboolean forceLanding = qfalse; + float jumpMultiplier; + if (g_forceNewPowers->integer) + { + jumpMultiplier = 1.25; + } + else + { + jumpMultiplier = 1.0; + } + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE) { if (pm->gent->m_pVehicle->m_pVehicleInfo->type != VH_ANIMAL) @@ -4045,12 +4077,12 @@ static void PM_CrashLand(void) else {//take off some of it, at least delta = (pm->ps->jumpZStart - pm->ps->origin[2]); - float dropAllow = forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]]; + float dropAllow = forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]] * jumpMultiplier; if (dropAllow < 128) {//always allow a drop from 128, at least dropAllow = 128; } - if (delta > forceJumpHeight[FORCE_LEVEL_1]) + if (delta > forceJumpHeight[FORCE_LEVEL_1] * jumpMultiplier) {//will have to use force jump ability to absorb some of it forceLanding = qtrue;//absorbed some - just to force the correct animation to play below } @@ -12500,7 +12532,7 @@ void PM_WeaponLightsaber(void) // Start with the current move, and cross index it with the current control states. if (pm->ps->saberMove > LS_NONE && pm->ps->saberMove < LS_MOVE_MAX) { - curmove = (saberMoveName_t)pm->ps->saberMove; + curmove = (saberMoveName_t)pm->ps->saberMove; //something here - Dusty } else { @@ -12681,7 +12713,7 @@ void PM_WeaponLightsaber(void) } else { - newmove = PM_SaberAttackForMovement(pm->cmd.forwardmove, pm->cmd.rightmove, curmove); + newmove = PM_SaberAttackForMovement(pm->cmd.forwardmove, pm->cmd.rightmove, curmove); //Dusty if ((PM_SaberInBounce(curmove) || PM_SaberInBrokenParry(curmove)) && saberMoveData[newmove].startQuad == saberMoveData[curmove].endQuad) {//this attack would be a repeat of the last (which was blocked), so don't actually use it, use the default chain attack for this bounce @@ -12756,13 +12788,13 @@ void PM_WeaponLightsaber(void) else { // Add randomness for prototype? - newmove = saberMoveData[curmove].chain_attack; + newmove = saberMoveData[curmove].chain_attack; //Dusty } if (newmove != LS_NONE) { if (PM_HasAnimation(pm->gent, saberMoveData[newmove].animToUse)) { - anim = saberMoveData[newmove].animToUse; + anim = saberMoveData[newmove].animToUse; //Dusty } } } @@ -12804,10 +12836,10 @@ void PM_WeaponLightsaber(void) if (!pm->ps->SaberActive()) {//turn on the saber if it's not on - pm->ps->SaberActivate(); + pm->ps->SaberActivate(); //Dusty } - PM_SetSaberMove((saberMoveName_t)newmove); + PM_SetSaberMove((saberMoveName_t)newmove); //Dusty if (both && pm->ps->legsAnim != pm->ps->torsoAnim) { @@ -13361,7 +13393,7 @@ Generates weapon events and modifes the weapon counter static void PM_Weapon(void) { int addTime, amount, trueCount = 1; - int punch = 0; + static int punch = 0; qboolean delayed_fire = qfalse; if ((pm->ps->eFlags&EF_HELD_BY_WAMPA)) @@ -13730,29 +13762,49 @@ static void PM_Weapon(void) { PM_TryGrab(); } - else if (!(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD) && pm->ps->forcePowerLevel[FP_SABER_OFFENSE] > 0) + else if (!(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD) /*&& pm->ps->forcePowerLevel[FP_SABER_OFFENSE] > 0*/) { PM_CheckKick(); } } else if (!(pm->ps->pm_flags&PMF_ATTACK_HELD)) { - anim = PM_PickAnim(pm->gent, BOTH_MELEE1, BOTH_MELEE2); + //anim = PM_PickAnim(pm->gent, BOTH_MELEE1, BOTH_MELEE2); + if (punch == 0) + { + anim = BOTH_MELEE1; + punch = 1; + } + else + { + anim = BOTH_MELEE2; + punch = 0; + } } } else { - anim = PM_PickAnim(pm->gent, BOTH_MELEE1, BOTH_MELEE2); + anim = PM_PickAnim(pm->gent, BOTH_MELEE1, BOTH_MELEE2); //is this even used? } if (anim != -1) { + int extraAnimFlag = 0; + if (pm->gent->NPC && pm->gent->NPC->aiFlags&NPCAI_HEAVY_MELEE) + {//heavy punchers hold it out there + extraAnimFlag = SETANIM_FLAG_HOLD; + } + else + {//fast punchers pull it back after finishing anim + extraAnimFlag = SETANIM_FLAG_HOLDLESS; + } + if (VectorCompare(pm->ps->velocity, vec3_origin) && pm->cmd.upmove >= 0) { - PM_SetAnim(pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_RESTART); + PM_SetAnim(pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | extraAnimFlag | SETANIM_FLAG_RESTART); } else { - PM_SetAnim(pm, SETANIM_TORSO, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_RESTART); + PM_SetAnim(pm, SETANIM_TORSO, anim, SETANIM_FLAG_OVERRIDE | extraAnimFlag | SETANIM_FLAG_RESTART); } } } @@ -14054,8 +14106,12 @@ static void PM_Weapon(void) break; case WP_MELEE: //addTime *= ((trueCount < 3) ? 0.35f : 1.0f);//slightly faster if high offense level, speed punching - if (pm->ps->forcePowerLevel[FP_SABER_OFFENSE] <= 1) addTime *= 1.2; - else if (pm->ps->forcePowerLevel[FP_SABER_OFFENSE] == 3) addTime *= 0.85; + //if (pm->ps->forcePowerLevel[FP_SABER_OFFENSE] <= 1) addTime *= 1.2; + //else if (pm->ps->forcePowerLevel[FP_SABER_OFFENSE] == 3) addTime *= 0.85; + if (pm->ps->clientNum >= MAX_CLIENTS && !(pm->gent->NPC->aiFlags&NPCAI_HEAVY_MELEE)) + {//so non-heavy melee NPCs punch faster + addTime *= 0.75; + } if (pm->ps->forcePowersActive&(1 << FP_SPEED) && pm->ps->forcePowerLevel[FP_SPEED] > 1) addTime *= 0.5; //speed punching bonus break; } diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index f89fcf5ab1..b4c95e23ef 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -3231,14 +3231,11 @@ qboolean G_CheckClampUcmd( gentity_t *ent, usercmd_t *ucmd ) { case FORCE_LEVEL_0: case FORCE_LEVEL_1: - kickDamage = Q_irand(3, 6); - kickDamage2 = Q_irand(3, 6); + kickDamage = Q_irand(4, 5); case FORCE_LEVEL_2: - kickDamage = Q_irand(4, 7); - kickDamage2 = Q_irand(4, 7); case FORCE_LEVEL_3: - kickDamage = Q_irand(5, 9); - kickDamage2 = Q_irand(5, 9); + kickDamage = Q_irand(5, 6); + kickDamage2 = Q_irand(5, 6); } int kickPush = Q_flrand( 100.0f, 200.0f );//Q_flrand( 50.0f, 100.0f ); @@ -3676,6 +3673,7 @@ qboolean G_CheckClampUcmd( gentity_t *ent, usercmd_t *ucmd ) break; case BOTH_A7_KICK_S: kickPush = Q_flrand( 150.0f, 250.0f );//Q_flrand( 75.0f, 125.0f ); + kickDamage += 4; if ( ent->footRBolt != -1 ) {//actually trace to a bolt if ( elapsedTime >= 550 @@ -3743,6 +3741,7 @@ qboolean G_CheckClampUcmd( gentity_t *ent, usercmd_t *ucmd ) break; case BOTH_A7_KICK_BF: kickPush = Q_flrand( 150.0f, 250.0f );//Q_flrand( 75.0f, 125.0f ); + kickDamage += 4; if ( elapsedTime < 1500 ) {//auto-aim! overridAngles = PM_AdjustAnglesForBFKick( ent, ucmd, fwdAngs, qboolean(elapsedTime<850) )?qtrue:overridAngles; @@ -3781,6 +3780,7 @@ qboolean G_CheckClampUcmd( gentity_t *ent, usercmd_t *ucmd ) case BOTH_A7_KICK_RL: kickSoundOnWalls = qtrue; kickPush = Q_flrand( 150.0f, 250.0f );//Q_flrand( 75.0f, 125.0f ); + kickDamage += 4; //FIXME: auto aim at enemies on the side of us? //overridAngles = PM_AdjustAnglesForRLKick( ent, ucmd, fwdAngs, qboolean(elapsedTime<850) )?qtrue:overridAngles; if ( elapsedTime >= 250 && elapsedTime < 350 ) @@ -5346,15 +5346,12 @@ extern cvar_t *g_skippingcin; { WP_SaberStartMissileBlockCheck(ent, ucmd); } + else if (ent->s.number) + {//we may be a non-saber force user + Jedi_MeleeEvasionDefense(ent, ucmd); + } } - if (ent->NPC && ent->client->ps.weapon == WP_MELEE) - {//we may be a melee force user, use a check for explosives and saber throws - Jedi_MeleeEvasionDefense(ent, ucmd); - } - - - // Update the position of the saber, and check to see if we're throwing it if ( client->ps.saberEntityNum != ENTITYNUM_NONE ) { diff --git a/code/game/g_combat.cpp b/code/game/g_combat.cpp index bd665815ce..7a38c315ea 100644 --- a/code/game/g_combat.cpp +++ b/code/game/g_combat.cpp @@ -4825,7 +4825,7 @@ void PlayerPain( gentity_t *self, gentity_t *inflictor, gentity_t *other, const } if ( damage != -1 && (mod==MOD_MELEE || damage==0/*fake damage*/ || (Q_irand( 0, 10 ) <= damage && self->client->damage_blood)) ) {//-1 == don't play pain anim - if ( ( ((mod==MOD_SABER||mod==MOD_MELEE)&&self->client->damage_blood) || mod == MOD_CRUSH ) && (self->s.weapon == WP_SABER||self->s.weapon==WP_MELEE||cg.renderingThirdPerson) )//FIXME: not only if using saber, but if in third person at all? But then 1st/third person functionality is different... + if ( ( ((mod==MOD_SABER||mod==MOD_MELEE)/*&&self->client->damage_blood*/) || mod == MOD_CRUSH ) && (self->s.weapon == WP_SABER||self->s.weapon==WP_MELEE||cg.renderingThirdPerson) )//FIXME: not only if using saber, but if in third person at all? But then 1st/third person functionality is different... {//FIXME: only strong-level saber attacks should make me play pain anim? if ( !G_CheckForStrongAttackMomentum( self ) && !PM_SpinningSaberAnim( self->client->ps.legsAnim ) && !PM_SaberInSpecialAttack( self->client->ps.torsoAnim ) diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 4a651a32ba..48eccf4a06 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -207,6 +207,7 @@ cvar_t *g_autoRoll; cvar_t *g_saberNewCombat; cvar_t *g_saberLocksEnabled; cvar_t *g_saberDamageScale; +cvar_t *g_saberDamageScaleGlobal; cvar_t *g_saberWalkAnims; cvar_t *g_saberForceDrains; cvar_t *g_saberForceDrainAmount; @@ -681,7 +682,7 @@ void G_InitCvars( void ) { g_debugMelee = gi.cvar( "g_debugMelee", "0", CVAR_CHEAT );//just for debugging/development, test kicks and grabs g_saberRestrictForce = gi.cvar( "g_saberRestrictForce", "0", CVAR_ARCHIVE );//restricts certain force powers when using a 2-handed saber or 2 sabers g_saberPickuppableDroppedSabers = gi.cvar( "g_saberPickuppableDroppedSabers", "0", CVAR_CHEAT );//lets you pick up sabers that are dropped - g_AIsurrender = gi.cvar( "g_AIsurrender", "0", CVAR_CHEAT ); + g_AIsurrender = gi.cvar( "g_AIsurrender", "1", CVAR_CHEAT ); g_numEntities = gi.cvar( "g_numEntities", "0", 0 ); gi.cvar( "newTotalSecrets", "0", CVAR_ROM ); @@ -721,7 +722,8 @@ void G_InitCvars( void ) { g_saberLockSuperBreaks = gi.cvar("g_saberLockSuperBreaks", "1", CVAR_ARCHIVE | CVAR_CHEAT); g_saberForceDrains = gi.cvar("g_saberForceDrains", "1", CVAR_ARCHIVE | CVAR_CHEAT); g_saberForceDrainAmount = gi.cvar("g_saberForceDrainAmount", "10", CVAR_ARCHIVE | CVAR_CHEAT); - g_saberDamageScale = gi.cvar("g_saberDamageScale", "1", CVAR_SAVEGAME | CVAR_CHEAT); + g_saberDamageScale = gi.cvar("g_saberDamageScale", "1.0", CVAR_SAVEGAME | CVAR_CHEAT); + g_saberDamageScaleGlobal = gi.cvar("g_saberDamageScaleGlobal", "1.0", CVAR_ARCHIVE | CVAR_CHEAT); g_forceNewPowers = gi.cvar("g_forceNewPowers", "1", CVAR_ARCHIVE | CVAR_CHEAT); g_char_forcePowerMax = gi.cvar("g_char_forcePowerMax", "100", CVAR_CHEAT | CVAR_SAVEGAME ); g_char_forceRegen = gi.cvar("g_char_forceRegen", "100", CVAR_CHEAT | CVAR_SAVEGAME); diff --git a/code/game/weapons.h b/code/game/weapons.h index 78ff506b4b..91848c18fc 100644 --- a/code/game/weapons.h +++ b/code/game/weapons.h @@ -158,6 +158,9 @@ typedef struct weaponData_s float altSplashRadius; int velocity; int altVelocity; + int npcDmgMult; + int npcAltDmgMult; + } weaponData_t; diff --git a/code/game/wp_melee.cpp b/code/game/wp_melee.cpp index 955b663b49..cba2d789c2 100644 --- a/code/game/wp_melee.cpp +++ b/code/game/wp_melee.cpp @@ -33,7 +33,7 @@ void WP_Melee( gentity_t *ent ) trace_t tr; vec3_t mins, maxs, end; int damage = 5; - float range = ent->s.number ? 64 : 32; + float range = ent->s.number ? 48 : 32; VectorMA( muzzle, range, forwardVec, end ); diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index edaf4dfd84..f54c7b355f 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -185,6 +185,7 @@ extern cvar_t *g_saberLockStyle; extern cvar_t *g_saberLockSuperBreaks; extern cvar_t *g_saberLocksEnabled; extern cvar_t *g_saberDamageScale; +extern cvar_t *g_saberDamageScaleGlobal; extern cvar_t *g_forceNewPowers; extern qboolean PM_DodgeAnim(int anim); extern int g_crosshairEntNum; @@ -478,8 +479,8 @@ float saberAnimSpeedMod[NUM_FORCE_POWER_LEVELS] = { //controls how fast you recover from having your attack knocked away 0.75f,//offense 0 1.0f, - 1.25f, - 1.5f + 1.35f, + 1.75f }; stringID_table_t SaberStyleTable[] = @@ -1476,9 +1477,18 @@ qboolean WP_SaberApplyDamage(gentity_t *ent, float baseDamage, int baseDFlags, gentity_t *victim; int dFlags = baseDFlags; float maxDmg; - float saberDmgMultiplier = g_saberDamageScale->value; + float saberDmgMultiplier; saberType_t saberType = ent->client->ps.saber[saberNum].type; + if (g_saberDamageScaleGlobal->value != 1.0) + { + saberDmgMultiplier = g_saberDamageScaleGlobal->value; + } + else + { + saberDmgMultiplier = g_saberDamageScale->value; + } + if (!numVictims) { return qfalse; @@ -6095,22 +6105,16 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) if (PM_SaberInTransitionAny(ent->client->ps.saberMove)) // if in a transition that still counts as attacking for stronger styles, but this is so you're not as strong quite as a regular slash { - stylePowerLevel -= 2; + stylePowerModifier -= 2; } - if (ent->client->NPC_class == CLASS_SABER_DROID) //FIXME D: saber droids do their own thing... they need to be incorporated into this system I suppose? + if (ent->client->NPC_class == CLASS_SABER_DROID) //FIXME: More intelligent calculation... { - entPowerLevel = SaberDroid_PowerLevelForSaberAnim(ent); + entPowerLevel = 3 * SaberDroid_PowerLevelForSaberAnim(ent); } else { - entPowerLevel = (2 * ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE]) + stylePowerModifier; - } - /* - if (PM_SaberInSpecialAttack(ent->client->ps.saberMove)) //now for special moves - { //special moves get a 2nd boost on top of the one in bg_panimate - entPowerLevel += 2; - } - */ + entPowerLevel = (2 * ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE]) + stylePowerModifier + 1; + } //now for modifiers based on any enhancement powers active if (!ent->s.number && (ent->client->ps.forcePowersActive&(1 << FP_SPEED))) @@ -6126,9 +6130,7 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) } else if (ent->client->ps.forcePowersActive & (1 << FP_RAGE)) { //min power bonus is +2, max is +4, slightly more than Speed 3 - entPowerLevel += ent->client->ps.forcePowerLevel[FP_RAGE] + 1; - } } @@ -6644,7 +6646,7 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) } if (hitOwner && hitOwner->client) { - hitOwnerPowerLevel = 2 * hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; + hitOwnerPowerLevel = 2 * hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1; hitOwner->breakLimit = 1 + hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; hitOwnerAnimLevel = PM_PowerLevelForSaberAnim(&hitOwner->client->ps, saberNum); } @@ -6910,14 +6912,14 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) if (!PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) { //special attacks just break, no counters hitOwner->breakCounter += (entPowerLevel - hitOwnerPowerLevel); - if (hitOwner->breakCounter > -2) + if (hitOwner->breakCounter > hitOwner->breakLimit + 2) { - hitOwner->breakCounter = -2; + hitOwner->breakCounter = hitOwner->breakLimit + 2; //maximum } hitOwner->breakRecoveryTime = level.time + HITOWNER_RECOVERY_INTERVAL; } } - //base parry breaks on animation (saber attack level), not FP_SABER_OFFENSE + //base parry breaks on combination of animation (saber attack level) and FP_SABER_OFFENSE if (entPowerLevel < hitOwnerPowerLevel //&& ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] < FORCE_LEVEL_3//if you have high saber offense, you cannot have your attack knocked away, regardless of what style you're using? //&& hitOwner->client->ps.saberAnimLevel != FORCE_LEVEL_5 @@ -6926,7 +6928,8 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) {//knockaways can make fast-attacker go into a broken parry anim if the ent is using fast or med (but not Tavion) //make me parry WP_SaberParryNew(hitOwner, ent, saberNum, bladeNum); - if (!PM_SaberInSpecialAttack(ent->client->ps.saberMove)) + if (hitOwner->breakLimit - hitOwner->breakCounter >= 1 //at least 1 BP + && !PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) {//special attacks can't be interrupted... just semi-blocked... //turn the parry into a knockaway hitOwner->client->ps.saberBounceMove = PM_KnockawayForParry(hitOwner->client->ps.saberBlocked); @@ -6964,7 +6967,7 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) else if (!activeDefense//they're not defending i.e. not holding +block with auto-blocking turned off? || (hitOwner->breakCounter > hitOwner->breakLimit //too tired to defend strong attacks && hitOwnerPowerLevel < entPowerLevel) - || PM_SaberInSpecialAttack(ent->client->ps.saberMove))//they are defending, but their defense strength is lower than my attack... + || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim))//they are defending, but their defense strength is lower than my attack... //or they are doing a special which has slightly //different rules /*|| (!deflected && Q_irand(0, Q_max(0, PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]PM_PowerLevelForSaberAnim( &hitOwner->client->ps ))) > 0))*/ @@ -9293,11 +9296,6 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) } //Reactions to Thrown Sabers - if (ent->s.weapon != WP_SABER) - {//only block shots coming from behind - if ((dot1 = DotProduct(dir, forward)) < SABER_REFLECT_MISSILE_CONE) - continue; - } else if (!self->s.number) {//player never auto-blocks thrown sabers continue; @@ -9338,27 +9336,7 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) //FIXME: if NPC, predict the intersection between my current velocity/path and the missile's, see if it intersects my bounding box (+/-saberLength?), don't try to deflect unless it does? closestDist = dist; incoming = ent; - } - - - if (incoming) - { - if (self->NPC && !G_ControlledByPlayer(self)) - { - if (Jedi_WaitingAmbush(self)) - { - Jedi_Ambush(self); - } - } - - if (incoming->owner && incoming->owner->client && (!self->enemy || self->enemy->s.weapon != WP_SABER))//keep enemy jedi over shooters - { - self->enemy = incoming->owner; - NPC_SetLookTarget(self, incoming->owner->s.number, level.time + 1000); - - NPC_EvasionSaber(); //Get out of the way! - } - } + } } } } @@ -9957,15 +9935,21 @@ void WP_SaberUpdate(gentity_t *self, usercmd_t *ucmd) } } + qboolean noInflate = qfalse; + if (self->s.number == 0) { - if (self->client->ps.saber[0].saberFlags&SFL_NOT_ACTIVE_BLOCKING || ucmd->buttons & BUTTON_USE) - {//so player can't take advantage of wide block angle - self->client->ps.saberBlocking = BLK_TIGHT; + if (self->client->ps.saber[0].saberFlags&SFL_NOT_ACTIVE_BLOCKING || ucmd->buttons & BUTTON_USE || self->client->ps.forcePowerLevel[FP_SABER_DEFENSE] == 0) + {//so player can't take advantage of wide block angle at idle + if (self->client->ps.saberMove == LS_READY) + { + self->client->ps.saberBlocking = BLK_TIGHT; + noInflate = qtrue; + } } - if (self->client->ps.forcePowerLevel[FP_SABER_DEFENSE] == 0) - {//sloppy fix for SD 0 blocking everything instead of nothing - noBlocking = qtrue; + else if (PM_SaberInReturn(self->client->ps.saberMove) && WP_SaberBlockCooldownDone(self)) + { + self->client->ps.saberBlocking = BLK_WIDE; } } @@ -10048,8 +10032,8 @@ void WP_SaberUpdate(gentity_t *self, usercmd_t *ucmd) && (self->client->ps.saber[0].saberFlags&SFL_NOT_ACTIVE_BLOCKING && PM_SaberInIdle(self->client->ps.saberMove) || ucmd->buttons & BUTTON_USE)) {//player with non-blocking saber doesn't get such a generous fudge factor for easy blocking animations - newSizeTip += (newSizeTip >= 0) ? -64 : 64; - newSizeBase += (newSizeBase >= 0) ? -64 : 64; + //newSizeTip += (newSizeTip >= 0) ? 0 : 8; + //newSizeBase += (newSizeBase >= 0) ? -8 : 8; } else { @@ -10076,7 +10060,7 @@ void WP_SaberUpdate(gentity_t *self, usercmd_t *ucmd) } } } - if (!forceBlock) + if (!forceBlock && !noInflate) {//not doing special "alwaysBlock" bbox if (self->client->ps.weaponTime > 0 || self->s.number @@ -11546,12 +11530,16 @@ void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) { if (self->client->ps.forcePowerLevel[FP_PULL] == FORCE_LEVEL_1) {//just barely move them - knockback /= 4; + knockback = 2; } else if (self->client->ps.forcePowerLevel[FP_PULL] == FORCE_LEVEL_2) - {//maybe just knock them down + {//pull them toward us just a little knockback /= 3; } + else if (self->client->ps.forcePowerLevel[FP_PULL] == FORCE_LEVEL_3) + {//pull them a small distance + knockback /= 2; + } } else { @@ -13278,7 +13266,27 @@ void ForceLightningDamage(gentity_t *self, gentity_t *traceEnt, vec3_t dir, floa VectorMA(fwd, random(), up, fwd); VectorNormalize(fwd); - VectorMA(traceEnt->client->ps.saber[0].blade[0].muzzlePoint, traceEnt->client->ps.saber[0].blade[0].length*Q_flrand(0, 1), traceEnt->client->ps.saber[0].blade[0].muzzleDir, end);//FIXME: pick a random blade? + int saberNo = Q_irand(0, 1); + int bladeNo = Q_irand(0, 1); + + if (traceEnt->client->ps.dualSabers) + { + saberNo = Q_irand(0, 1); + } + else + { + saberNo = 0; + } + if (traceEnt->client->ps.SaberStaff()) + { + bladeNo = Q_irand(0, 1); + } + else + { + bladeNo = 0; + } + + VectorMA(traceEnt->client->ps.saber[saberNo].blade[bladeNo].muzzlePoint, traceEnt->client->ps.saber[saberNo].blade[bladeNo].length*Q_flrand(0, 1), traceEnt->client->ps.saber[saberNo].blade[bladeNo].muzzleDir, end); G_PlayEffect(G_EffectIndex("force/lightning"), end, fwd); } else if (blockedWithHand) From 3e9099f4491cf222451a71508f8aa14be0378f5c Mon Sep 17 00:00:00 2001 From: Dusty Date: Mon, 4 Apr 2016 07:30:07 -0400 Subject: [PATCH 177/445] wip --- code/game/AI_Grenadier.cpp | 50 +++++++++++++++++++++++++++++--------- code/game/AI_Jedi.cpp | 4 +-- code/game/NPC_behavior.cpp | 27 +++++++++++--------- 3 files changed, 57 insertions(+), 24 deletions(-) diff --git a/code/game/AI_Grenadier.cpp b/code/game/AI_Grenadier.cpp index 8d8047f306..1a1022f9b1 100644 --- a/code/game/AI_Grenadier.cpp +++ b/code/game/AI_Grenadier.cpp @@ -510,12 +510,15 @@ void NPC_BSGrenadier_Attack( void ) shoot = qfalse; enemyDist = DistanceSquared( NPC->enemy->currentOrigin, NPC->currentOrigin ); + qboolean enemyUsingSaber = qfalse; + if ((NPC->enemy->client && NPC->enemy->client->ps.weapon == WP_SABER && NPC->enemy->client->ps.SaberActive())) + { + enemyUsingSaber = qtrue; + } + //See if we should switch to melee attack - if ( (enemyDist < 16384 - && (!NPC->enemy->client||NPC->enemy->client->ps.weapon != WP_SABER||(!NPC->enemy->client->ps.SaberActive()))) - || - (enemyDist < 4096 //64 squared - && Q_irand(0,1)))//50% chance to throw a punch if player is super close + if ( (enemyDist < 16384 && enemyUsingSaber) + || (enemyDist < 64*64 && !Q_irand(0,3))) //slight chance to throw a punch if player is super close // 50% chance if enemy very close to use melee on saber wielding enemy {//enemy is close and not using saber or very close and random chance if ( NPC->client->ps.weapon == WP_THERMAL ) @@ -527,21 +530,46 @@ void NPC_BSGrenadier_Attack( void ) //reset fire-timing variables if (NPCInfo->aiFlags&NPCAI_HEAVY_MELEE) { - NPC_ChangeWeapon(WP_MELEE); - if (!(NPCInfo->scriptFlags&SCF_CHASE_ENEMIES))//NPCInfo->behaviorState == BS_STAND_AND_SHOOT ) - {//FIXME: should we be overriding scriptFlags? - NPCInfo->scriptFlags |= SCF_CHASE_ENEMIES;//NPCInfo->behaviorState = BS_HUNT_AND_KILL; + if (enemyUsingSaber && NPC->attackDebounceTime < level.time) + {//don't try this again for a little while + NPC->attackDebounceTime = level.time + Q_irand(1000, 3000); + NPC_ChangeWeapon(WP_MELEE); + if (!(NPCInfo->scriptFlags&SCF_CHASE_ENEMIES))//NPCInfo->behaviorState == BS_STAND_AND_SHOOT ) + {//FIXME: should we be overriding scriptFlags? + NPCInfo->scriptFlags |= SCF_CHASE_ENEMIES;//NPCInfo->behaviorState = BS_HUNT_AND_KILL; + } + } + else + {//not using saber, just do it + NPC_ChangeWeapon(WP_MELEE); + if (!(NPCInfo->scriptFlags&SCF_CHASE_ENEMIES))//NPCInfo->behaviorState == BS_STAND_AND_SHOOT ) + {//FIXME: should we be overriding scriptFlags? + NPCInfo->scriptFlags |= SCF_CHASE_ENEMIES;//NPCInfo->behaviorState = BS_HUNT_AND_KILL; + } } + } } } } - else if ( enemyDist > 65536 || (NPC->enemy->client && NPC->enemy->client->ps.weapon == WP_SABER && NPC->enemy->client->ps.SaberActive()) )//256 + else if ( enemyDist > 65536 || enemyUsingSaber )//256 {//enemy is far or using saber if ( NPC->client->ps.weapon == WP_MELEE && (NPC->client->ps.stats[STAT_WEAPONS]&(1<attackDebounceTime > level.time) + { + NPC->attackDebounceTime = level.time + Q_irand(1500, 3500); + NPC_ChangeWeapon(WP_THERMAL); + } + } + else + { + NPC_ChangeWeapon(WP_THERMAL); + } + } } diff --git a/code/game/AI_Jedi.cpp b/code/game/AI_Jedi.cpp index 7ddc1452cf..a45b3897f3 100644 --- a/code/game/AI_Jedi.cpp +++ b/code/game/AI_Jedi.cpp @@ -5471,11 +5471,11 @@ static qboolean Jedi_AttackDecide( int enemy_dist ) || NPC->client->ps.forcePowerDebounce[FP_DRAIN] > level.time || NPC->client->ps.forcePowerDebounce[FP_LIGHTNING] > level.time)) {//not in the middle of pushing, pulling, draining, or zapping if ((level.time - NPC->client->ps.forcePowerDebounce[FP_PUSH] < 1500 - || level.time - NPC->client->ps.forcePowerDebounce[FP_PUSH] < 1500)) //we tried pushing/pulling the last 1.5 seconds + || level.time - NPC->client->ps.forcePowerDebounce[FP_PUSH] < 1500)) //we tried pushing/pulling in the last 1.5 seconds {//we already tried to push/pull and aren't using another force power if (!Q_irand(0, 10) - NPCInfo->stats.aggression) { - TIMER_Set(NPC, "attackDelay", Q_irand(500, 2000)); //don't try a punch again for a while + TIMER_Set(NPC, "attackDelay", Q_irand(2000, 3000)); //don't try a punch again for a while } } } diff --git a/code/game/NPC_behavior.cpp b/code/game/NPC_behavior.cpp index 27f182a86b..2b790bc920 100644 --- a/code/game/NPC_behavior.cpp +++ b/code/game/NPC_behavior.cpp @@ -1541,7 +1541,7 @@ void NPC_Surrender( void ) else { NPC_SetAnim(NPC, SETANIM_TORSO, TORSO_SURRENDER_START, SETANIM_FLAG_HOLD | SETANIM_FLAG_OVERRIDE); - NPC->client->ps.torsoAnimTimer = 1500; + NPC->client->ps.torsoAnimTimer = 2000; NPCInfo->surrenderTime = level.time + NPC->client->ps.torsoAnimTimer + 1000;//stay surrendered for at least 1 second //FIXME: while surrendering, make a big sight/sound alert? Or G_AlertTeam? } @@ -1570,7 +1570,7 @@ void NPC_Surrender( void ) else { NPC_SetAnim(NPC, SETANIM_TORSO, TORSO_SURRENDER_START, SETANIM_FLAG_HOLD | SETANIM_FLAG_OVERRIDE); - NPC->client->ps.torsoAnimTimer = 1500; + NPC->client->ps.torsoAnimTimer = 2000; } } NPCInfo->surrenderTime = level.time + NPC->client->ps.torsoAnimTimer + 1000; @@ -1587,6 +1587,10 @@ qboolean NPC_CheckSurrender(qboolean noEscape = qfalse) {//not enabled return qfalse; } + if (NPC->s.weapon != WP_NONE && NPC->s.weapon != WP_MELEE) + { + return qfalse; + } if (!Q3_TaskIDPending(NPC, TID_MOVE_NAV) //not scripted to go somewhere && NPC->client->ps.groundEntityNum != ENTITYNUM_NONE //not in the air && !NPC->client->ps.weaponTime && !PM_InKnockDown(&NPC->client->ps)//not firing and not on the ground @@ -1597,7 +1601,9 @@ qboolean NPC_CheckSurrender(qboolean noEscape = qfalse) //we "might" surrender, check number of enemies int numEnemies = NPC_CheckMultipleEnemies(NPC, NPC->client->enemyTeam, 0); - int relNumEnemies = numEnemies - NPCInfo->group->numGroup; + int numMyGroup = 0; + if (NPCInfo->group) numMyGroup = NPCInfo->group->numGroup; + int relNumEnemies = numEnemies - numMyGroup; //0 means there is a 1-1 ratio, < 0 means my group is bigger by x, > 0 means my group is smaller by x if (numEnemies == 1 && (NPC->enemy->s.weapon == WP_MELEE || NPC->enemy->s.weapon == WP_NONE)) @@ -1622,16 +1628,15 @@ qboolean NPC_CheckSurrender(qboolean noEscape = qfalse) if (NPC->s.weapon == WP_NONE //NPC has a weapon - || NPC->enemy == player + /*|| NPC->enemy == player || (NPC->enemy->s.weapon == WP_SABER&&NPC->enemy->client&&NPC->enemy->client->ps.SaberActive()) - || (NPC->enemy->NPC && NPC->enemy->NPC->group && NPC->enemy->NPC->group->numGroup > 2)) + || (NPC->enemy->NPC && NPC->enemy->NPC->group && NPC->enemy->NPC->group->numGroup > 2)*/) {//surrender only if have no weapon or fighting a player or jedi or if we are outnumbered at least 3 to 1 if (NPC->enemy == player) {//player is the guy I'm running from if ((g_crosshairEntNum == NPC->s.number && InFOV(player, NPC, 60, 30)) - || DistanceSquared(NPC->currentOrigin, player->currentOrigin) < 200 * 200 - || ((DistanceSquared(NPC->currentOrigin, player->currentOrigin) < 512 * 512) - && (InFOV(NPC, player, 60, 30) || numEnemies > 1))) + || DistanceSquared(NPC->currentOrigin, player->currentOrigin) < 256 * 256 + || ((DistanceSquared(NPC->currentOrigin, player->currentOrigin) < 512 * 512) && (InFOV(NPC, player, 60, 30) || numEnemies > 1))) {//give up if I see player aiming at me, player is very close, or player is near and watching me/has buddies //NPC_FaceEnemy(); NPC_Surrender(); @@ -1641,11 +1646,11 @@ qboolean NPC_CheckSurrender(qboolean noEscape = qfalse) } else if (NPC->enemy) {//running from another NPC - if (InFOV(NPC, NPC->enemy, 30, 30) || relNumEnemies > 1) + if (InFOV(NPC, NPC->enemy, 30, 30) || numEnemies > 1) {//they're looking at me or have friends //float maxDist = (128+(NPC->maxs[0]*1.5)+(NPC->enemy->maxs[0]*1.5)); //64 - float maxDist = 128; - float maxDistMultEnemies = 256; + float maxDist = 256; + float maxDistMultEnemies = 512; maxDist *= maxDist; maxDistMultEnemies *= maxDistMultEnemies; if (DistanceSquared(NPC->currentOrigin, NPC->enemy->currentOrigin) < maxDist From 9eb833e7ffc9e305515d4a10e7f0820f033320e2 Mon Sep 17 00:00:00 2001 From: dusty22 Date: Wed, 6 Apr 2016 11:09:55 -0400 Subject: [PATCH 178/445] changelog update --- CHANGELOG.txt | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 99e62f3b23..64a74ce70b 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,5 +1,28 @@ (Dusty's Patch changelog) -10/9/15 - +cvars to-do: +separate cvars into global and savegame versions, have global take priority? +camera cvars? +cvars for force push blur effects? + +increased modability: +- separate lightning block effect into own .efx file +- external file for controlling force push/pull/absorb/protect effects +- Class_Wookiee, Class_Cultist +- weapons.dat stuff (npcDamageMult, npcSpeedMult) +- alt-fire field works for .npc files? +- other .npc fields: +fastPunches, kicks, freeMovement, aggression = punching... +- + +other: +- kick knockdown based on hit location +- better Jedi AI +- NPCs avoid walls and cliffs +- better saber throws, strong force push + + +----------------------------------------------------------------------- +Only larger/more important changes recorded here: new cvars: g_autoRoll - been there for a while, now works 100% correctly, if 1 default JA behavior, if 0 you have to be holding USE to roll @@ -21,22 +44,6 @@ under certain conditions g_saberMoreRealistic - no longer write-protected g_weaponVelocity, g_weaponAltVelocity - use this to multiply the speed of most projectiles -cvars to-do: -separate cvars into global and savegame versions, have global take priority? -camera cvars? -cvars for force push blur effects? - -increased modability: -- separate lightning block effect into own .efx file -- external file for controlling force push/pull effects -- Class_Wookiee, Class_Cultist -- weapons.dat stuff (NPCDamageMult, NPCFireTimeMult) -- alt-fire field works for NPCs? - - - ------------------------------------------------------------------------ -Only larger/more important changes recorded here: Gameplay mechanics - Force powers -- (with g_forceNewPowers 1) - Force Jump height for all levels increased by 25% From 73f4e209e61b579e0289ef380344184430824893 Mon Sep 17 00:00:00 2001 From: dusty22 Date: Sat, 9 Apr 2016 22:00:45 -0400 Subject: [PATCH 179/445] testing --- CHANGELOG.txt | 7 +++++++ code/game/AI_Grenadier.cpp | 14 +++++++------- code/game/AI_Jedi.cpp | 5 +++++ code/game/bg_panimate.cpp | 16 +++++++--------- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 64a74ce70b..bfc07ae99b 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -20,6 +20,13 @@ other: - NPCs avoid walls and cliffs - better saber throws, strong force push +Test: +- cultist punch delay +- gran punch decisions vs. saber wielder +- npc surrender +- lightning block effect +- force protect saber damage +- faster non-heavy punches ----------------------------------------------------------------------- Only larger/more important changes recorded here: diff --git a/code/game/AI_Grenadier.cpp b/code/game/AI_Grenadier.cpp index 1a1022f9b1..daf07ba934 100644 --- a/code/game/AI_Grenadier.cpp +++ b/code/game/AI_Grenadier.cpp @@ -518,7 +518,7 @@ void NPC_BSGrenadier_Attack( void ) //See if we should switch to melee attack if ( (enemyDist < 16384 && enemyUsingSaber) - || (enemyDist < 64*64 && !Q_irand(0,3))) //slight chance to throw a punch if player is super close + || (enemyDist < 64*64 && !Q_irand(0,50))) //chance to try punching if player is super close // 50% chance if enemy very close to use melee on saber wielding enemy {//enemy is close and not using saber or very close and random chance if ( NPC->client->ps.weapon == WP_THERMAL ) @@ -530,9 +530,9 @@ void NPC_BSGrenadier_Attack( void ) //reset fire-timing variables if (NPCInfo->aiFlags&NPCAI_HEAVY_MELEE) { - if (enemyUsingSaber && NPC->attackDebounceTime < level.time) - {//don't try this again for a little while - NPC->attackDebounceTime = level.time + Q_irand(1000, 3000); + if (enemyUsingSaber && TIMER_Done(NPC, "sleepTime")) + { + TIMER_Set(NPC, "sleepTime", Q_irand(2000, 5000));//keep using melee for a short while NPC_ChangeWeapon(WP_MELEE); if (!(NPCInfo->scriptFlags&SCF_CHASE_ENEMIES))//NPCInfo->behaviorState == BS_STAND_AND_SHOOT ) {//FIXME: should we be overriding scriptFlags? @@ -540,7 +540,7 @@ void NPC_BSGrenadier_Attack( void ) } } else - {//not using saber, just do it + {//enemy not using saber, just go for it NPC_ChangeWeapon(WP_MELEE); if (!(NPCInfo->scriptFlags&SCF_CHASE_ENEMIES))//NPCInfo->behaviorState == BS_STAND_AND_SHOOT ) {//FIXME: should we be overriding scriptFlags? @@ -559,9 +559,9 @@ void NPC_BSGrenadier_Attack( void ) //reset fire-timing variables if (enemyUsingSaber && enemyDist < 64*64) {//if enemy is close and using saber, wait until we've at least had a short chance to use melee - if (NPC->attackDebounceTime > level.time) + if (TIMER_Done(NPC, "sleepTime")) { - NPC->attackDebounceTime = level.time + Q_irand(1500, 3500); + TIMER_Set(NPC, "sleepTime", Q_irand(1500, 3000)); NPC_ChangeWeapon(WP_THERMAL); } } diff --git a/code/game/AI_Jedi.cpp b/code/game/AI_Jedi.cpp index a45b3897f3..9fa92aa3a4 100644 --- a/code/game/AI_Jedi.cpp +++ b/code/game/AI_Jedi.cpp @@ -5366,6 +5366,11 @@ static qboolean Jedi_AttackDecide( int enemy_dist ) return qfalse; } + if (!TIMER_Done(NPC, "attackDelay") && NPC->s.weapon == WP_MELEE) + { + return qfalse; + } + if ( Jedi_CultistDestroyer( NPC ) ) {//destroyer if ( enemy_dist <= 32 ) diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index 8cd260eae7..0af62a66b0 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -5403,6 +5403,12 @@ void PM_SetAnimFinal(int *torsoAnim, int *legsAnim, //-------------------------------------------------------------------- PM_SaberStartTransAnim(gent->client->ps.saberAnimLevel, anim, &timeScaleMod, gent); + if (*torsoAnim == BOTH_MELEE1 || *torsoAnim == BOTH_MELEE2) + {//non-heavy punches are faster FIXME: Give player heavy punch cheat? + if (pm->gent->s.number == 0 || !(pm->gent->NPC->aiFlags&NPCAI_HEAVY_MELEE)) + timeScaleMod *= 2.0; + } + // SETUP VALUES FOR INCOMMING ANIMATION @@ -5512,15 +5518,7 @@ void PM_SetAnimFinal(int *torsoAnim, int *legsAnim, } } } - } - - - - if ((*torsoAnim == BOTH_MELEE1 || *torsoAnim == BOTH_MELEE2) - && (pm->gent->s.number == 0 || !(pm->gent->NPC->aiFlags&NPCAI_HEAVY_MELEE))) - {//non-heavy punches are faster - animSpeed *= .1f; - } + } animSpeed *= (gent->resultspeed / moveSpeedOfAnim); if (animSpeed<0.01f) From 84978e733f2e3139e4c6496fe63d4d733553b960 Mon Sep 17 00:00:00 2001 From: Dion Williams Date: Sat, 16 Apr 2016 16:10:15 +0100 Subject: [PATCH 180/445] Ensure R_PrintLongString doesn't split words between buffers CL_ConsolePrint treats text at the end of a message given to it as a complete word for purposes of word-wrapping. When one half of a word in the first buffer from R_PrintLongString is given to it and this can fit on the current line, the first half will be printed on that line. However, when the second half of the word in the second buffer from R_PrintLongString is given to it and it can't fit on the current line, this second half will be printed on the line underneath. By ensuring R_PrintLongString only passes complete words to be printed, the client console is able to word-wrap properly. This was originally brought to attention by @eternalcodes in PR #827. --- code/rd-vanilla/tr_init.cpp | 35 +++++++++++++++++++++++++---------- codemp/rd-vanilla/tr_init.cpp | 32 ++++++++++++++++++++++++-------- 2 files changed, 49 insertions(+), 18 deletions(-) diff --git a/code/rd-vanilla/tr_init.cpp b/code/rd-vanilla/tr_init.cpp index 2aaf6780a4..7d24ef5e45 100644 --- a/code/rd-vanilla/tr_init.cpp +++ b/code/rd-vanilla/tr_init.cpp @@ -1180,22 +1180,37 @@ void GL_SetDefaultState( void ) ================ R_PrintLongString -Workaround for ri.Printf's 1024 characters buffer limit. +Workaround for Com_Printf's 1024 characters buffer limit. ================ */ - -void R_PrintLongString(const char *string) { +void R_PrintLongString(const char *string) +{ char buffer[1024]; - const char *p; - int size = strlen(string); + const char *p = string; + int remainingLength = strlen(string); - p = string; - while(size > 0) + while (remainingLength > 0) { - Q_strncpyz(buffer, p, sizeof (buffer) ); + // Take as much characters as possible from the string without splitting words between buffers + // This avoids the client console splitting a word up when one half fits on the current line, + // but the second half would have to be written on a new line + int charsToTake = sizeof(buffer) - 1; + if (remainingLength > charsToTake) { + while (p[charsToTake - 1] > ' ' && p[charsToTake] > ' ') { + charsToTake--; + if (charsToTake == 0) { + charsToTake = sizeof(buffer) - 1; + break; + } + } + } else if (remainingLength < charsToTake) { + charsToTake = remainingLength; + } + + Q_strncpyz( buffer, p, charsToTake + 1 ); Com_Printf( "%s", buffer ); - p += 1023; - size -= 1023; + remainingLength -= charsToTake; + p += charsToTake; } } diff --git a/codemp/rd-vanilla/tr_init.cpp b/codemp/rd-vanilla/tr_init.cpp index b06abc9a15..f529141a44 100644 --- a/codemp/rd-vanilla/tr_init.cpp +++ b/codemp/rd-vanilla/tr_init.cpp @@ -1348,18 +1348,34 @@ R_PrintLongString Workaround for ri->Printf's 1024 characters buffer limit. ================ */ -void R_PrintLongString(const char *string) { +void R_PrintLongString(const char *string) +{ char buffer[1024]; - const char *p; - int size = strlen(string); + const char *p = string; + int remainingLength = strlen(string); - p = string; - while(size > 0) + while (remainingLength > 0) { - Q_strncpyz(buffer, p, sizeof (buffer) ); + // Take as much characters as possible from the string without splitting words between buffers + // This avoids the client console splitting a word up when one half fits on the current line, + // but the second half would have to be written on a new line + int charsToTake = sizeof(buffer) - 1; + if (remainingLength > charsToTake) { + while (p[charsToTake - 1] > ' ' && p[charsToTake] > ' ') { + charsToTake--; + if (charsToTake == 0) { + charsToTake = sizeof(buffer) - 1; + break; + } + } + } else if (remainingLength < charsToTake) { + charsToTake = remainingLength; + } + + Q_strncpyz( buffer, p, charsToTake + 1 ); ri->Printf( PRINT_ALL, "%s", buffer ); - p += 1023; - size -= 1023; + remainingLength -= charsToTake; + p += charsToTake; } } From 271c4dfc3bb43b455449df69fc0d891bcc5a6b1b Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sat, 7 May 2016 11:00:40 +0100 Subject: [PATCH 181/445] MP: Fix #833: GetMemory not returning aligned mem --- codemp/botlib/l_memory.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/codemp/botlib/l_memory.cpp b/codemp/botlib/l_memory.cpp index 1a71e98d1c..42ee7ec9b5 100644 --- a/codemp/botlib/l_memory.cpp +++ b/codemp/botlib/l_memory.cpp @@ -39,6 +39,7 @@ along with this program; if not, see . #include "l_log.h" #include "l_memory.h" #include "be_interface.h" +#include //#define MEMDEBUG //#define MEMORYMANEGER @@ -351,11 +352,11 @@ void *GetMemory(unsigned long size) void *ptr; unsigned long int *memid; - ptr = botimport.GetMemory(size + sizeof(unsigned long int)); + ptr = botimport.GetMemory(size + alignof(std::max_align_t)); if (!ptr) return NULL; memid = (unsigned long int *) ptr; *memid = MEM_ID; - return (unsigned long int *) ((char *) ptr + sizeof(unsigned long int)); + return (unsigned long int *) ((char *) ptr + alignof(std::max_align_t)); } //end of the function GetMemory //=========================================================================== // @@ -393,11 +394,11 @@ void *GetHunkMemory(unsigned long size) void *ptr; unsigned long int *memid; - ptr = botimport.HunkAlloc(size + sizeof(unsigned long int)); + ptr = botimport.HunkAlloc(size + alignof(std::max_align_t)); if (!ptr) return NULL; memid = (unsigned long int *) ptr; *memid = HUNK_ID; - return (unsigned long int *) ((char *) ptr + sizeof(unsigned long int)); + return (unsigned long int *) ((char *) ptr + alignof(std::max_align_t)); } //end of the function GetHunkMemory //=========================================================================== // @@ -430,7 +431,7 @@ void FreeMemory(void *ptr) { unsigned long int *memid; - memid = (unsigned long int *) ((char *) ptr - sizeof(unsigned long int)); + memid = (unsigned long int *) ((char *) ptr - alignof(std::max_align_t)); if (*memid == MEM_ID) { From 67d33de18f9b1b5875b62d34fe864608cfe50049 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sat, 7 May 2016 11:22:49 +0100 Subject: [PATCH 182/445] MP: Remove invalid assertions These two assertions are more runtime checks rather than actual program assertions. --- codemp/game/bg_panimate.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/codemp/game/bg_panimate.c b/codemp/game/bg_panimate.c index 48602c3c33..9e8c3682aa 100644 --- a/codemp/game/bg_panimate.c +++ b/codemp/game/bg_panimate.c @@ -2557,9 +2557,6 @@ static void BG_StartLegsAnim( playerState_t *ps, int anim ) { if ( ps->pm_type >= PM_DEAD ) { - assert(!BG_InDeathAnim(anim)); - //please let me know if this assert fires on you (ideally before you close/ignore it) -rww - //vehicles are allowed to do this.. IF it's a vehicle death anim if (ps->clientNum < MAX_CLIENTS || anim != BOTH_VT_DEATH1) { @@ -2633,8 +2630,6 @@ void BG_StartTorsoAnim( playerState_t *ps, int anim ) { if ( ps->pm_type >= PM_DEAD ) { - assert(!BG_InDeathAnim(anim)); - //please let me know if this assert fires on you (ideally before you close/ignore it) -rww return; } From 6f805a17b8d1fc8d5c0f14a068a70edc609c2f56 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sat, 7 May 2016 12:10:54 +0100 Subject: [PATCH 183/445] MP: Add 0xb2 to console keys for azerty keyboards 0xb2 is the key left of 1 on an AZERTY keyboard. --- codemp/client/cl_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codemp/client/cl_main.cpp b/codemp/client/cl_main.cpp index beea5f3af3..1ba46ad180 100644 --- a/codemp/client/cl_main.cpp +++ b/codemp/client/cl_main.cpp @@ -2761,7 +2761,7 @@ void CL_Init( void ) { cl_guidServerUniq = Cvar_Get ("cl_guidServerUniq", "1", CVAR_ARCHIVE, "Use a unique guid value per server" ); // ~ and `, as keys and characters - cl_consoleKeys = Cvar_Get( "cl_consoleKeys", "~ ` 0x7e 0x60", CVAR_ARCHIVE, "Which keys are used to toggle the console"); + cl_consoleKeys = Cvar_Get( "cl_consoleKeys", "~ ` 0x7e 0x60 0xb2", CVAR_ARCHIVE, "Which keys are used to toggle the console"); // userinfo Cvar_Get ("name", "Padawan", CVAR_USERINFO | CVAR_ARCHIVE, "Player name" ); From ddd179c59940caede9679e8b8cc48ae32701ae08 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sat, 7 May 2016 12:12:35 +0100 Subject: [PATCH 184/445] SP: Add 0xb2 to console keys for azerty keyboards. 0xb2 is the key left of 1 on AZERTY keyboards. --- code/client/cl_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/client/cl_main.cpp b/code/client/cl_main.cpp index 6ab334d913..95ab4c8c5e 100644 --- a/code/client/cl_main.cpp +++ b/code/client/cl_main.cpp @@ -1271,7 +1271,7 @@ void CL_Init( void ) { m_filter = Cvar_Get ("m_filter", "0", CVAR_ARCHIVE); // ~ and `, as keys and characters - cl_consoleKeys = Cvar_Get( "cl_consoleKeys", "~ ` 0x7e 0x60", CVAR_ARCHIVE); + cl_consoleKeys = Cvar_Get( "cl_consoleKeys", "~ ` 0x7e 0x60 0xb2", CVAR_ARCHIVE); // userinfo #ifdef JK2_MODE From 4def52d70a66e9d690de6de7135f09cc019e809a Mon Sep 17 00:00:00 2001 From: dusty22 Date: Sat, 7 May 2016 16:35:44 -0400 Subject: [PATCH 185/445] wip - fix gran behavior - test force cultist punching - test surrendering, figure out why NPCs don't surrender to player with back-turned that has allies --- code/game/AI_Grenadier.cpp | 4 ++-- code/game/AI_Jedi.cpp | 3 ++- code/game/NPC_behavior.cpp | 4 ++-- code/game/bg_panimate.cpp | 7 ++++--- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/code/game/AI_Grenadier.cpp b/code/game/AI_Grenadier.cpp index daf07ba934..889db9c021 100644 --- a/code/game/AI_Grenadier.cpp +++ b/code/game/AI_Grenadier.cpp @@ -530,7 +530,7 @@ void NPC_BSGrenadier_Attack( void ) //reset fire-timing variables if (NPCInfo->aiFlags&NPCAI_HEAVY_MELEE) { - if (enemyUsingSaber && TIMER_Done(NPC, "sleepTime")) + if (enemyUsingSaber && !Q_irand(0,999) /*&& TIMER_Done(NPC, "sleepTime")*/) { TIMER_Set(NPC, "sleepTime", Q_irand(2000, 5000));//keep using melee for a short while NPC_ChangeWeapon(WP_MELEE); @@ -559,7 +559,7 @@ void NPC_BSGrenadier_Attack( void ) //reset fire-timing variables if (enemyUsingSaber && enemyDist < 64*64) {//if enemy is close and using saber, wait until we've at least had a short chance to use melee - if (TIMER_Done(NPC, "sleepTime")) + if (!Q_irand(0,999)/*TIMER_Done(NPC, "sleepTime")*/) { TIMER_Set(NPC, "sleepTime", Q_irand(1500, 3000)); NPC_ChangeWeapon(WP_THERMAL); diff --git a/code/game/AI_Jedi.cpp b/code/game/AI_Jedi.cpp index 9fa92aa3a4..22f794ee64 100644 --- a/code/game/AI_Jedi.cpp +++ b/code/game/AI_Jedi.cpp @@ -5469,6 +5469,7 @@ static qboolean Jedi_AttackDecide( int enemy_dist ) {//melee cultists punch rarely if (NPC->s.weapon == WP_MELEE && enemy_dist <= 0 + && ucmd.forwardmove >= 0 //if moving backwards punch tends to miss && (NPC->client->ps.groundEntityNum != ENTITYNUM_NONE && NPC->enemy->client->ps.groundEntityNum != ENTITYNUM_NONE)) //both on ground { @@ -5480,7 +5481,7 @@ static qboolean Jedi_AttackDecide( int enemy_dist ) {//we already tried to push/pull and aren't using another force power if (!Q_irand(0, 10) - NPCInfo->stats.aggression) { - TIMER_Set(NPC, "attackDelay", Q_irand(2000, 3000)); //don't try a punch again for a while + TIMER_Set(NPC, "attackDelay", Q_irand(1000, 3000)); //single punches only, don't try again for a while } } } diff --git a/code/game/NPC_behavior.cpp b/code/game/NPC_behavior.cpp index 2b790bc920..6377162dde 100644 --- a/code/game/NPC_behavior.cpp +++ b/code/game/NPC_behavior.cpp @@ -1827,8 +1827,8 @@ qboolean NPC_BSFlee( void ) bool moveSuccess = false; bool inSurrender = (level.timesurrenderTime); - if (TIMER_Done(NPC, "panic") && NPC_CheckSurrender()) - { + if (NPCInfo->surrenderTime - level.time < 4000 && NPC_CheckSurrender()) + {//currently or just finished surrendering return qfalse; } diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index 0af62a66b0..776787ced6 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -5404,9 +5404,10 @@ void PM_SetAnimFinal(int *torsoAnim, int *legsAnim, PM_SaberStartTransAnim(gent->client->ps.saberAnimLevel, anim, &timeScaleMod, gent); if (*torsoAnim == BOTH_MELEE1 || *torsoAnim == BOTH_MELEE2) - {//non-heavy punches are faster FIXME: Give player heavy punch cheat? - if (pm->gent->s.number == 0 || !(pm->gent->NPC->aiFlags&NPCAI_HEAVY_MELEE)) - timeScaleMod *= 2.0; + {//non-heavy punches are faster FIXME: Give player heavy punch cheat? + if (gent->s.number == 0 || !(gent->NPC->aiFlags&NPCAI_HEAVY_MELEE)) { + timeScaleMod *= 1.25; + } } From 981e400489b3e2b65b997dca738fcc2b43636b42 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 8 May 2016 10:30:57 +0200 Subject: [PATCH 186/445] comment fixes --- code/game/genericparser2.h | 1 - shared/qcommon/safe/string.cpp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/genericparser2.h b/code/game/genericparser2.h index c2ddc3b289..9b2425f3c9 100644 --- a/code/game/genericparser2.h +++ b/code/game/genericparser2.h @@ -68,7 +68,6 @@ class CGPProperty { return mValues; } - // Copies the value into the textPool and adds a pointer to that copy to the end of the list. void AddValue( gsl::cstring_view newValue ); }; diff --git a/shared/qcommon/safe/string.cpp b/shared/qcommon/safe/string.cpp index 737f3b83a5..38b5242664 100644 --- a/shared/qcommon/safe/string.cpp +++ b/shared/qcommon/safe/string.cpp @@ -35,7 +35,7 @@ namespace Q // lhs == rhs return Ordering::EQ; } - // lhs is a prefix or rhs + // lhs is a prefix of rhs return Ordering::LT; } From e1627957f06e04fbefc8764772bc2a14a8ac3f23 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 8 May 2016 10:32:48 +0200 Subject: [PATCH 187/445] use czstring typedef in safe file code --- shared/qcommon/safe/files.cpp | 2 +- shared/qcommon/safe/files.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/shared/qcommon/safe/files.cpp b/shared/qcommon/safe/files.cpp index f699736450..a753b6ee1e 100644 --- a/shared/qcommon/safe/files.cpp +++ b/shared/qcommon/safe/files.cpp @@ -57,7 +57,7 @@ namespace FS return *this; } - FileBuffer ReadFile( const char* path ) + FileBuffer ReadFile( gsl::czstring path ) { void* buffer; #if defined( SP_GAME ) diff --git a/shared/qcommon/safe/files.h b/shared/qcommon/safe/files.h index 69580cdf47..7c354a43d8 100644 --- a/shared/qcommon/safe/files.h +++ b/shared/qcommon/safe/files.h @@ -14,7 +14,7 @@ namespace FS { class FileBuffer { - friend FileBuffer ReadFile( const char* ); + friend FileBuffer ReadFile( gsl::czstring ); // called by ReadFile() FileBuffer( void* buffer, const long size ) NOEXCEPT; public: @@ -55,7 +55,7 @@ namespace FS long _size = 0; }; - FileBuffer ReadFile( const char* path ); + FileBuffer ReadFile( gsl::czstring path ); // FileList only available in Client; Library exclusively uses FS_GetFileList(), which by supplying a buffer avoids dynamic allocations. // TODO: investigate making FS_ListFiles available in Library Code? From 8916e7da556c3c706d8a747e4ee23293a26b0dfa Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 8 May 2016 10:33:59 +0200 Subject: [PATCH 188/445] MP: use FS_AssertInitialised() in like in SP --- codemp/qcommon/files.cpp | 81 +++++++++++----------------------------- 1 file changed, 21 insertions(+), 60 deletions(-) diff --git a/codemp/qcommon/files.cpp b/codemp/qcommon/files.cpp index 6bdb1f0ecb..615a207f07 100644 --- a/codemp/qcommon/files.cpp +++ b/codemp/qcommon/files.cpp @@ -322,6 +322,12 @@ qboolean FS_Initialized( void ) { return (qboolean)(fs_searchpaths != NULL); } +static void FS_AssertInitialised( void ) { + if ( !fs_searchpaths ) { + Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); + } +} + /* ================= FS_PakIsPure @@ -780,9 +786,7 @@ fileHandle_t FS_SV_FOpenFileWrite( const char *filename ) { char *ospath; fileHandle_t f; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); ospath = FS_BuildOSPath( fs_homepath->string, filename, "" ); ospath[strlen(ospath)-1] = '\0'; @@ -823,9 +827,7 @@ int FS_SV_FOpenFileRead( const char *filename, fileHandle_t *fp ) { char *ospath; fileHandle_t f = 0; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); f = FS_HandleForFile(); fsh[f].zipFile = qfalse; @@ -906,9 +908,7 @@ FS_SV_Rename void FS_SV_Rename( const char *from, const char *to, qboolean safe ) { char *from_ospath, *to_ospath; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); // don't let sound stutter S_ClearSoundBuffer(); @@ -942,9 +942,7 @@ FS_Rename void FS_Rename( const char *from, const char *to ) { char *from_ospath, *to_ospath; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); // don't let sound stutter S_ClearSoundBuffer(); @@ -985,9 +983,7 @@ There are three cases handled: =========== */ void FS_FCloseFile( fileHandle_t f ) { - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if (fsh[f].zipFile == qtrue) { unzCloseCurrentFile( fsh[f].handleFiles.file.z ); @@ -1015,9 +1011,7 @@ fileHandle_t FS_FOpenFileWrite( const char *filename, qboolean safe ) { char *ospath; fileHandle_t f; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); f = FS_HandleForFile(); fsh[f].zipFile = qfalse; @@ -1060,9 +1054,7 @@ fileHandle_t FS_FOpenFileAppend( const char *filename ) { char *ospath; fileHandle_t f; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); f = FS_HandleForFile(); fsh[f].zipFile = qfalse; @@ -1278,9 +1270,7 @@ long FS_FOpenFileRead( const char *filename, fileHandle_t *file, qboolean unique hash = 0; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if ( file == NULL ) { Com_Error( ERR_FATAL, "FS_FOpenFileRead: NULL 'file' parameter passed\n" ); @@ -1620,9 +1610,7 @@ int FS_Read( void *buffer, int len, fileHandle_t f ) { byte *buf; int tries; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if ( !f ) { return 0; @@ -1674,9 +1662,7 @@ int FS_Write( const void *buffer, int len, fileHandle_t h ) { int tries; FILE *f; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if ( !h ) { return 0; @@ -1734,10 +1720,7 @@ FS_Seek int FS_Seek( fileHandle_t f, long offset, int origin ) { int _origin; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - return -1; - } + FS_AssertInitialised(); if (fsh[f].zipFile == qtrue) { //FIXME: this is really, really crappy @@ -1835,9 +1818,7 @@ int FS_FileIsInPAK(const char *filename, int *pChecksum ) { fileInPack_t *pakFile; long hash = 0; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if ( !filename ) { Com_Error( ERR_FATAL, "FS_FOpenFileRead: NULL 'filename' parameter passed\n" ); @@ -1903,9 +1884,7 @@ long FS_ReadFile( const char *qpath, void **buffer ) { qboolean isConfig; long len; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if ( !qpath || !qpath[0] ) { Com_Error( ERR_FATAL, "FS_ReadFile with empty name\n" ); @@ -1984,9 +1963,6 @@ long FS_ReadFile( const char *qpath, void **buffer ) { } fs_loadCount++; -/* - buf = (unsigned char *)Hunk_AllocateTempMemory(len+1); - *buffer = buf;*/ buf = (byte*)Z_Malloc( len+1, TAG_FILESYS, qfalse); buf[len]='\0'; // because we're not calling Z_Malloc with optional trailing 'bZeroIt' bool @@ -2016,20 +1992,7 @@ FS_FreeFile ============= */ void FS_FreeFile( void *buffer ) { - /* - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } - if ( !buffer ) { - Com_Error( ERR_FATAL, "FS_FreeFile( NULL )" ); - } - - Hunk_FreeTempMemory( buffer ); - */ - - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if ( !buffer ) { Com_Error( ERR_FATAL, "FS_FreeFile( NULL )" ); } @@ -2047,9 +2010,7 @@ Filename are reletive to the quake search path void FS_WriteFile( const char *qpath, const void *buffer, int size ) { fileHandle_t f; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if ( !qpath || !buffer ) { Com_Error( ERR_FATAL, "FS_WriteFile: NULL parameter" ); From 1ee49ccc6281ae4a773941aa13fb041a9997a87b Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 8 May 2016 12:52:29 +0200 Subject: [PATCH 189/445] add string view substr function --- shared/qcommon/safe/string.cpp | 11 +++++++++++ shared/qcommon/safe/string.h | 3 +++ tests/safe/string.cpp | 9 +++++++++ 3 files changed, 23 insertions(+) diff --git a/shared/qcommon/safe/string.cpp b/shared/qcommon/safe/string.cpp index 38b5242664..50dbda5c2e 100644 --- a/shared/qcommon/safe/string.cpp +++ b/shared/qcommon/safe/string.cpp @@ -39,6 +39,17 @@ namespace Q return Ordering::LT; } + gsl::cstring_view substr( const gsl::cstring_view& lhs, const std::string::size_type pos, const std::string::size_type count ) + { + if( pos > lhs.size() ) + { + throw std::out_of_range( "Q::substr called with out-of-bounds pos parameter!" ); + } + auto start = lhs.begin() + pos; + auto end = count == std::string::npos ? lhs.end() : std::min( start + count, lhs.end() ); + return{ start, end }; + } + int svtoi( const gsl::cstring_view& view ) { int result = 0; diff --git a/shared/qcommon/safe/string.h b/shared/qcommon/safe/string.h index 20f81b9fd9..ab368b934a 100644 --- a/shared/qcommon/safe/string.h +++ b/shared/qcommon/safe/string.h @@ -6,6 +6,7 @@ #include #include +#include namespace Q { @@ -25,6 +26,8 @@ namespace Q } }; + gsl::cstring_view substr( const gsl::cstring_view& lhs, const std::string::size_type pos = 0, const std::string::size_type count = std::string::npos ); + int svtoi( const gsl::cstring_view& view ); float svtof( const gsl::cstring_view& view ); } diff --git a/tests/safe/string.cpp b/tests/safe/string.cpp index b5f4eb6118..8d4f8f8c5b 100644 --- a/tests/safe/string.cpp +++ b/tests/safe/string.cpp @@ -35,6 +35,15 @@ BOOST_AUTO_TEST_CASE( stricmp ) BOOST_CHECK_EQUAL( Q::stricmp( CSTRING_VIEW( "a" ), CSTRING_VIEW( "" ) ), Q::Ordering::GT ); } +BOOST_AUTO_TEST_CASE( substr ) +{ + BOOST_CHECK_EQUAL( Q::substr( CSTRING_VIEW( "Hello World" ), 6 ), CSTRING_VIEW( "World" ) ); + BOOST_CHECK_EQUAL( Q::substr( CSTRING_VIEW( "Hello World" ), 6, 100 ), CSTRING_VIEW( "World" ) ); + BOOST_CHECK_EQUAL( Q::substr( CSTRING_VIEW( "Hello World" ), 0, 5 ), CSTRING_VIEW( "Hello" ) ); + BOOST_CHECK_EQUAL( Q::substr( CSTRING_VIEW( "Hello my World!" ), 6, 2 ), CSTRING_VIEW( "my" ) ); + BOOST_CHECK_THROW( Q::substr( CSTRING_VIEW( "Hello" ), 20 ), std::out_of_range ); +} + BOOST_AUTO_TEST_CASE( svtoi ) { BOOST_CHECK_EQUAL( Q::svtoi( CSTRING_VIEW( "" ) ), 0 ); From 329ddc6f5795dcec50899e0eb6b2a797501ab366 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 8 May 2016 12:52:46 +0200 Subject: [PATCH 190/445] add sstring string_view constructor --- code/qcommon/sstring.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/code/qcommon/sstring.h b/code/qcommon/sstring.h index 8a580b7d72..2243ecaf3a 100644 --- a/code/qcommon/sstring.h +++ b/code/qcommon/sstring.h @@ -30,6 +30,8 @@ along with this program; if not, see . #define SSTRING_H #include "../qcommon/q_shared.h" +#include "qcommon/safe/gsl.h" +#include template class sstring @@ -59,6 +61,15 @@ class sstring //strcpy(mStorage.data,s); Q_strncpyz(mStorage.data,s,sizeof(mStorage.data),qtrue); } + sstring( const gsl::cstring_view& v ) + { + if( v.size() + 1 > sizeof( mStorage.data ) ) + { + Com_Error( ERR_FATAL, "String dest buffer too small (%d) to hold string of length %d", sizeof( mStorage.data ), v.size() ); + } + std::copy( v.begin(), v.end(), mStorage.data ); + mStorage.data[ v.size() ] = '\0'; + } sstring() { mStorage.data[0]=0; From 1b968311ae91f6fbbfb06de0c1f10a8edfe3b99a Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 8 May 2016 12:57:04 +0200 Subject: [PATCH 191/445] Use new sstring string_view constructor in lieu of StringViewToSString function in snd_music also add some documentation and reintroduce a block that got deleted in b11d6dd --- code/client/snd_music.cpp | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/code/client/snd_music.cpp b/code/client/snd_music.cpp index 90c45782ad..3edb6f038f 100644 --- a/code/client/snd_music.cpp +++ b/code/client/snd_music.cpp @@ -204,18 +204,12 @@ const char *Music_BaseStateToString( MusicState_e eMusicState, qboolean bDebugPr return NULL; } -static sstring_t StringViewToSString( const gsl::cstring_view& view ) -{ - std::size_t len = std::min< std::size_t >( view.size(), MAX_QPATH - 1 ); - return sstring_t( std::string( view.begin(), view.begin() + len ).c_str() ); -} - static bool Music_ParseMusic( gsl::czstring filename, const CGenericParser2& Parser, MusicData_t* MusicData, const CGPGroup& pgMusicFiles, const gsl::cstring_view& psMusicName, const gsl::cstring_view& psMusicNameKey, MusicState_e eMusicState ) { bool bReturn = false; MusicFile_t MusicFile; - const CGPGroup* pgMusicFile = pgMusicFiles.FindSubGroup( psMusicName ); + const CGPGroup* const pgMusicFile = pgMusicFiles.FindSubGroup( psMusicName ); if( pgMusicFile ) { // read subgroups... @@ -233,8 +227,10 @@ static bool Music_ParseMusic( gsl::czstring filename, const CGenericParser2& Par for( auto& prop : pEntryGroup->GetProperties() ) { //if (!strncmp(psKey,sKEY_MARKER,strlen(sKEY_MARKER))) // for now, assume anything is a marker - MusicFile.MusicEntryTimes[ StringViewToSString( prop.GetName() ) ] = Q::svtoi( prop.GetTopValue() ); - bEntryFound = true; + { + MusicFile.MusicEntryTimes[ prop.GetName() ] = Q::svtoi( prop.GetTopValue() ); + bEntryFound = true; + } } } @@ -261,12 +257,12 @@ static bool Music_ParseMusic( gsl::czstring filename, const CGenericParser2& Par if( key == sKEY_NEXTFILE ) { - MusicExitPoint.sNextFile = StringViewToSString( value ); + MusicExitPoint.sNextFile = value; bExitFound = true; // harmless to keep setting } else if( key == sKEY_NEXTMARK ) { - MusicExitPoint.sNextMark = StringViewToSString( value ); + MusicExitPoint.sNextMark = value; } else if( key == sKEY_TIME ) { @@ -354,8 +350,8 @@ static bool Music_ParseMusic( gsl::czstring filename, const CGenericParser2& Par if( bReturn ) { - MusicFile.sFileNameBase = StringViewToSString( psMusicName ); - ( *MusicData )[ StringViewToSString( psMusicNameKey ) ] = MusicFile; + MusicFile.sFileNameBase = psMusicName; + ( *MusicData )[ psMusicNameKey ] = MusicFile; } return bReturn; @@ -391,6 +387,7 @@ static qboolean Music_ParseLeveldata( gsl::czstring psLevelName ) MusicData->clear(); + // shorten level name to MAX_QPATH so sstring's assignment assertion is satisfied. char sLevelName[MAX_QPATH]; Q_strncpyz(sLevelName,psLevelName,sizeof(sLevelName)); @@ -432,7 +429,7 @@ static qboolean Music_ParseLeveldata( gsl::czstring psLevelName ) const int sanityLimit = 10; while( !searchName.empty() && steps < sanityLimit ) { - gsLevelNameForLoad = StringViewToSString( searchName ); + gsLevelNameForLoad = searchName; gsLevelNameForBossLoad = gsLevelNameForLoad; pgThisLevelMusic = pgLevelMusic->FindSubGroup( searchName ); @@ -527,7 +524,7 @@ static qboolean Music_ParseLeveldata( gsl::czstring psLevelName ) else { psName_Boss = pValueBoss->GetTopValue(); - gsLevelNameForBossLoad = StringViewToSString( psName_UseBoss ); + gsLevelNameForBossLoad = psName_UseBoss; } } } @@ -553,7 +550,7 @@ static qboolean Music_ParseLeveldata( gsl::czstring psLevelName ) MusicFile_t m; m.sFileNameBase = "death_music"; - ( *MusicData )[ "death" ] = m; + ( *MusicData )[ sKEY_DEATH ] = m; } } } From 42f544f5feffebd725afa18c920b110c994e71f5 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 8 May 2016 12:58:57 +0200 Subject: [PATCH 192/445] fix #834 - compare snd_music prefix instead of whole string --- code/client/snd_music.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/client/snd_music.cpp b/code/client/snd_music.cpp index 3edb6f038f..4ecd45ee58 100644 --- a/code/client/snd_music.cpp +++ b/code/client/snd_music.cpp @@ -226,7 +226,7 @@ static bool Music_ParseMusic( gsl::czstring filename, const CGenericParser2& Par // for( auto& prop : pEntryGroup->GetProperties() ) { - //if (!strncmp(psKey,sKEY_MARKER,strlen(sKEY_MARKER))) // for now, assume anything is a marker + //if( Q::substr( prop.GetName(), 0, sKEY_MARKER.size() ) == sKEY_MARKER ) // for now, assume anything is a marker { MusicFile.MusicEntryTimes[ prop.GetName() ] = Q::svtoi( prop.GetTopValue() ); bEntryFound = true; @@ -264,7 +264,7 @@ static bool Music_ParseMusic( gsl::czstring filename, const CGenericParser2& Par { MusicExitPoint.sNextMark = value; } - else if( key == sKEY_TIME ) + else if( Q::substr( key, 0, sKEY_TIME.size() ) == sKEY_TIME ) { MusicExitTime_t MusicExitTime; MusicExitTime.fTime = Q::svtof( value ); From 4c2caa8355e3e2664e552224c19c67e93044c8ca Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sun, 8 May 2016 14:07:34 +0100 Subject: [PATCH 193/445] MP: Build fix for Linux and Windows hopefully --- codemp/botlib/l_memory.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/codemp/botlib/l_memory.cpp b/codemp/botlib/l_memory.cpp index 42ee7ec9b5..3dc9097df6 100644 --- a/codemp/botlib/l_memory.cpp +++ b/codemp/botlib/l_memory.cpp @@ -352,11 +352,11 @@ void *GetMemory(unsigned long size) void *ptr; unsigned long int *memid; - ptr = botimport.GetMemory(size + alignof(std::max_align_t)); + ptr = botimport.GetMemory(size + sizeof(max_align_t)); if (!ptr) return NULL; memid = (unsigned long int *) ptr; *memid = MEM_ID; - return (unsigned long int *) ((char *) ptr + alignof(std::max_align_t)); + return (unsigned long int *) ((char *) ptr + sizeof(max_align_t)); } //end of the function GetMemory //=========================================================================== // @@ -394,7 +394,7 @@ void *GetHunkMemory(unsigned long size) void *ptr; unsigned long int *memid; - ptr = botimport.HunkAlloc(size + alignof(std::max_align_t)); + ptr = botimport.HunkAlloc(size + sizeof(max_align_t)); if (!ptr) return NULL; memid = (unsigned long int *) ptr; *memid = HUNK_ID; From 5d3bcd678af84b6280ae352f8534311ce9e39809 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sun, 8 May 2016 16:18:14 +0100 Subject: [PATCH 194/445] MP: Fixed last few lines in build errors --- codemp/botlib/l_memory.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/codemp/botlib/l_memory.cpp b/codemp/botlib/l_memory.cpp index 3dc9097df6..e67349d940 100644 --- a/codemp/botlib/l_memory.cpp +++ b/codemp/botlib/l_memory.cpp @@ -398,7 +398,7 @@ void *GetHunkMemory(unsigned long size) if (!ptr) return NULL; memid = (unsigned long int *) ptr; *memid = HUNK_ID; - return (unsigned long int *) ((char *) ptr + alignof(std::max_align_t)); + return (unsigned long int *) ((char *) ptr + sizeof(max_align_t)); } //end of the function GetHunkMemory //=========================================================================== // @@ -431,7 +431,7 @@ void FreeMemory(void *ptr) { unsigned long int *memid; - memid = (unsigned long int *) ((char *) ptr - alignof(std::max_align_t)); + memid = (unsigned long int *) ((char *) ptr - sizeof(max_align_t)); if (*memid == MEM_ID) { From 60acb784ae751ca90b21cc01e8fcd3f85a5e35b6 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Mon, 9 May 2016 21:19:01 +0100 Subject: [PATCH 195/445] MP: Fix max_align_t compile errors Creates a new typedef qmax_align_t type which is aliased to either ::max_align_t or std::max_align_t depending on the compiler. --- codemp/botlib/l_memory.cpp | 10 +++++----- shared/qcommon/q_platform.h | 11 +++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/codemp/botlib/l_memory.cpp b/codemp/botlib/l_memory.cpp index e67349d940..569d398491 100644 --- a/codemp/botlib/l_memory.cpp +++ b/codemp/botlib/l_memory.cpp @@ -352,11 +352,11 @@ void *GetMemory(unsigned long size) void *ptr; unsigned long int *memid; - ptr = botimport.GetMemory(size + sizeof(max_align_t)); + ptr = botimport.GetMemory(size + sizeof(qmax_align_t)); if (!ptr) return NULL; memid = (unsigned long int *) ptr; *memid = MEM_ID; - return (unsigned long int *) ((char *) ptr + sizeof(max_align_t)); + return (unsigned long int *) ((char *) ptr + sizeof(qmax_align_t)); } //end of the function GetMemory //=========================================================================== // @@ -394,11 +394,11 @@ void *GetHunkMemory(unsigned long size) void *ptr; unsigned long int *memid; - ptr = botimport.HunkAlloc(size + sizeof(max_align_t)); + ptr = botimport.HunkAlloc(size + sizeof(qmax_align_t)); if (!ptr) return NULL; memid = (unsigned long int *) ptr; *memid = HUNK_ID; - return (unsigned long int *) ((char *) ptr + sizeof(max_align_t)); + return (unsigned long int *) ((char *) ptr + sizeof(qmax_align_t)); } //end of the function GetHunkMemory //=========================================================================== // @@ -431,7 +431,7 @@ void FreeMemory(void *ptr) { unsigned long int *memid; - memid = (unsigned long int *) ((char *) ptr - sizeof(max_align_t)); + memid = (unsigned long int *) ((char *) ptr - sizeof(qmax_align_t)); if (*memid == MEM_ID) { diff --git a/shared/qcommon/q_platform.h b/shared/qcommon/q_platform.h index 767ad1d696..b2f03d9623 100644 --- a/shared/qcommon/q_platform.h +++ b/shared/qcommon/q_platform.h @@ -197,6 +197,17 @@ along with this program; if not, see . #define IS_NOEXCEPT(x) noexcept(x) #endif +#if defined(__cplusplus) + #include + + // gcc versions < 4.9 did not add max_align_t to the std:: namespace, but instead + // put it in the global namespace. Need this to provide uniform access to max_align_t + #if defined(__GNUC__) && ((__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 9)) + typedef max_align_t qmax_align_t; + #else + typedef std::max_align_t qmax_align_t; + #endif +#endif // catch missing defines in above blocks #if !defined(OS_STRING) From ba25e504f2f9c879e91268795919f35182553d3b Mon Sep 17 00:00:00 2001 From: Razish Date: Fri, 13 May 2016 01:37:17 +1000 Subject: [PATCH 196/445] [Shared] Improve input responsiveness by moving sampling to other side of framerate limiter. Thanks to wareya and Juraj "youurayy" Vitko for pointing this out --- code/qcommon/common.cpp | 2 ++ codemp/qcommon/common.cpp | 2 ++ shared/sys/sys_main.cpp | 3 --- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/qcommon/common.cpp b/code/qcommon/common.cpp index 6c15818c69..0a23d628ee 100644 --- a/code/qcommon/common.cpp +++ b/code/qcommon/common.cpp @@ -29,6 +29,7 @@ along with this program; if not, see . #include "sstring.h" // to get Gil's string class, because MS's doesn't compile properly in here #include "stringed_ingame.h" #include "stv_version.h" +#include "../shared/sys/sys_local.h" #if defined(_WIN32) #define WIN32_LEAN_AND_MEAN #include @@ -1387,6 +1388,7 @@ void Com_Frame( void ) { else Sys_Sleep(timeVal - 1); } while( (timeVal = Com_TimeVal(minMsec)) != 0 ); + IN_Frame(); lastTime = com_frameTime; com_frameTime = Com_EventLoop(); diff --git a/codemp/qcommon/common.cpp b/codemp/qcommon/common.cpp index e3c273cfa3..525e3d44d3 100644 --- a/codemp/qcommon/common.cpp +++ b/codemp/qcommon/common.cpp @@ -28,6 +28,7 @@ along with this program; if not, see . #include "qcommon/cm_public.h" #include "qcommon/game_version.h" #include "../server/NPCNav/navigator.h" +#include "../shared/sys/sys_local.h" #if defined(_WIN32) #define WIN32_LEAN_AND_MEAN #include @@ -1516,6 +1517,7 @@ void Com_Frame( void ) { else NET_Sleep(timeVal - 1); } while( (timeVal = Com_TimeVal(minMsec)) != 0 ); + IN_Frame(); lastTime = com_frameTime; com_frameTime = Com_EventLoop(); diff --git a/shared/sys/sys_main.cpp b/shared/sys/sys_main.cpp index 2970ab9ae7..dafe319576 100644 --- a/shared/sys/sys_main.cpp +++ b/shared/sys/sys_main.cpp @@ -790,9 +790,6 @@ int main ( int argc, char* argv[] ) } } - // make sure mouse and joystick are only called once a frame - IN_Frame(); - // run the game Com_Frame(); } From d426ba5baa652852841f21ad1f458038cd4e59c1 Mon Sep 17 00:00:00 2001 From: Razish Date: Fri, 20 May 2016 20:11:30 +1000 Subject: [PATCH 197/445] [SP] Fix negative index offset on x64 systems --- code/qcommon/cm_load.cpp | 40 +++++++++++++--------------------------- code/qcommon/cm_local.h | 4 ++-- 2 files changed, 15 insertions(+), 29 deletions(-) diff --git a/code/qcommon/cm_load.cpp b/code/qcommon/cm_load.cpp index 6083306c00..49524f3406 100644 --- a/code/qcommon/cm_load.cpp +++ b/code/qcommon/cm_load.cpp @@ -1155,39 +1155,25 @@ void CM_GetWorldBounds ( vec3_t mins, vec3_t maxs ) int CM_ModelContents_Actual( clipHandle_t model, clipMap_t *cm ) { - cmodel_t *cmod; - int contents = 0; - int i; - - if (!cm) - { + if ( !cm ) { cm = &cmg; } - cmod = CM_ClipHandleToModel( model, &cm ); - - //MCG ADDED - return the contents, too - if( cmod->leaf.numLeafBrushes ) // check for brush - { - int brushNum; - for ( i = cmod->leaf.firstLeafBrush; i < cmod->leaf.firstLeafBrush+cmod->leaf.numLeafBrushes; i++ ) - { - brushNum = cm->leafbrushes[i]; - contents |= cm->brushes[brushNum].contents; - } + int contents = 0; + const cmodel_t *cmod = CM_ClipHandleToModel( model, &cm ); + for ( int i = 0; i < cmod->leaf.numLeafBrushes; i++ ) { + int brushNum = cm->leafbrushes[cmod->leaf.firstLeafBrush + i]; + contents |= cm->brushes[brushNum].contents; } - if( cmod->leaf.numLeafSurfaces ) // if not brush, check for patch - { - int surfaceNum; - for ( i = cmod->leaf.firstLeafSurface; i < cmod->leaf.firstLeafSurface+cmod->leaf.numLeafSurfaces; i++ ) - { - surfaceNum = cm->leafsurfaces[i]; - if ( cm->surfaces[surfaceNum] != NULL ) - {//HERNH? How could we have a null surf within our cmod->leaf.numLeafSurfaces? - contents |= cm->surfaces[surfaceNum]->contents; - } + + for ( int i = 0; i < cmod->leaf.numLeafSurfaces; i++ ) { + int surfaceNum = cm->leafsurfaces[cmod->leaf.firstLeafSurface + i]; + if ( cm->surfaces[surfaceNum] ) { + // HERNH? How could we have a null surf within our cmod->leaf.numLeafSurfaces? + contents |= cm->surfaces[surfaceNum]->contents; } } + return contents; } diff --git a/code/qcommon/cm_local.h b/code/qcommon/cm_local.h index 62e3e4fdfd..cfd9b106d0 100644 --- a/code/qcommon/cm_local.h +++ b/code/qcommon/cm_local.h @@ -44,10 +44,10 @@ typedef struct { int cluster; int area; - intptr_t firstLeafBrush; + ptrdiff_t firstLeafBrush; int numLeafBrushes; - intptr_t firstLeafSurface; + ptrdiff_t firstLeafSurface; int numLeafSurfaces; } cLeaf_t; From 321b4ba51b70d2a6eff53facf82e8b261d28222c Mon Sep 17 00:00:00 2001 From: Razish Date: Fri, 20 May 2016 20:12:35 +1000 Subject: [PATCH 198/445] [MP] gcc warning fixes Don't attempt to draw saber clash flare if it's offscreen --- codemp/cgame/cg_draw.c | 4 +++- codemp/qcommon/vm.cpp | 2 -- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/codemp/cgame/cg_draw.c b/codemp/cgame/cg_draw.c index d346c5694a..b5d4951d01 100644 --- a/codemp/cgame/cg_draw.c +++ b/codemp/cgame/cg_draw.c @@ -5387,7 +5387,9 @@ void CG_SaberClashFlare( void ) v = 0.001f; } - CG_WorldCoordToScreenCoord( cg_saberFlashPos, &x, &y ); + if ( !CG_WorldCoordToScreenCoord( cg_saberFlashPos, &x, &y ) ) { + return; + } VectorSet4( color, 0.8f, 0.8f, 0.8f, 1.0f ); trap->R_SetColor( color ); diff --git a/codemp/qcommon/vm.cpp b/codemp/qcommon/vm.cpp index 715a9de5a2..11aa3ee558 100644 --- a/codemp/qcommon/vm.cpp +++ b/codemp/qcommon/vm.cpp @@ -282,8 +282,6 @@ float _vmf( intptr_t x ) { } intptr_t QDECL VM_Call( vm_t *vm, int callnum, intptr_t arg0, intptr_t arg1, intptr_t arg2, intptr_t arg3, intptr_t arg4, intptr_t arg5, intptr_t arg6, intptr_t arg7, intptr_t arg8, intptr_t arg9, intptr_t arg10, intptr_t arg11 ) { - intptr_t args[16] = { 0 }; - if ( !vm || !vm->name[0] ) { Com_Error( ERR_FATAL, "VM_Call with NULL vm" ); return 0; From 425b33cd29f67bbf476611b65ef7101719a151ac Mon Sep 17 00:00:00 2001 From: Razish Date: Fri, 20 May 2016 20:13:03 +1000 Subject: [PATCH 199/445] [Shared] Use XP toolset for official builds --- tools/builds/make.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/builds/make.bat b/tools/builds/make.bat index 2e551b81ec..dbe38ac93f 100644 --- a/tools/builds/make.bat +++ b/tools/builds/make.bat @@ -1 +1 @@ -cmake -G "Visual Studio 12" -D CMAKE_INSTALL_PREFIX=install -D CMAKE_BUILD_TYPE=Release "--build build" . +cmake -G "Visual Studio 12" -D CMAKE_INSTALL_PREFIX=install -D CMAKE_BUILD_TYPE=Release -T v120_xp "--build build" . From 0b1bfdba2e48bc6606d064035a10a3b0e908596c Mon Sep 17 00:00:00 2001 From: Razish Date: Sat, 21 May 2016 19:07:57 +1000 Subject: [PATCH 200/445] [SP] Fix warning about uninitialised variables in savegames --- code/server/sv_savegame.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index d181b7cf53..57b7bd42ae 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -664,9 +664,9 @@ void SG_WriteCvars(void) void SG_ReadCvars(void) { - int iCount; - char *psName; - char *psValue; + int iCount = 0; + char *psName = nullptr; + char *psValue = nullptr; SG_Read(INT_ID('C','V','C','N'), &iCount, sizeof(iCount)); From ff3fc2515824960480c91770a7e151b170a43735 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Thu, 26 May 2016 07:21:05 +0200 Subject: [PATCH 201/445] maybe fix reportedly broken VS12 build --- shared/qcommon/safe/string.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shared/qcommon/safe/string.cpp b/shared/qcommon/safe/string.cpp index 50dbda5c2e..e94c688c50 100644 --- a/shared/qcommon/safe/string.cpp +++ b/shared/qcommon/safe/string.cpp @@ -47,7 +47,8 @@ namespace Q } auto start = lhs.begin() + pos; auto end = count == std::string::npos ? lhs.end() : std::min( start + count, lhs.end() ); - return{ start, end }; + gsl::cstring_view result{ start, end }; + return result; } int svtoi( const gsl::cstring_view& view ) From b8c8188bc147d899ad5477a8fafbcc512a5fc169 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 6 Jun 2016 13:48:50 -0500 Subject: [PATCH 202/445] [SP] Fixed cg_simpleItems 1 icons rendering through walls and in front of the local weapon view. Bumping SP game API and renderer API versions up 1 due to additional render flag being ported from MP which is now used. --- code/cgame/cg_ents.cpp | 2 ++ code/game/g_public.h | 2 +- code/rd-common/tr_public.h | 2 +- code/rd-common/tr_types.h | 2 ++ code/rd-vanilla/tr_backend.cpp | 7 ++----- code/rd-vanilla/tr_shade.cpp | 17 +++++++++++++++++ codeJK2/game/g_public.h | 2 +- 7 files changed, 26 insertions(+), 8 deletions(-) diff --git a/code/cgame/cg_ents.cpp b/code/cgame/cg_ents.cpp index 7af9ad1f67..a4c7d5f143 100644 --- a/code/cgame/cg_ents.cpp +++ b/code/cgame/cg_ents.cpp @@ -933,12 +933,14 @@ Ghoul2 Insert End memset( &ent, 0, sizeof( ent ) ); ent.reType = RT_SPRITE; VectorCopy( cent->lerpOrigin, ent.origin ); + ent.origin[2] += 16; ent.radius = 14; ent.customShader = cg_items[es->modelindex].icon; ent.shaderRGBA[0] = 255; ent.shaderRGBA[1] = 255; ent.shaderRGBA[2] = 255; ent.shaderRGBA[3] = 255; + ent.renderfx |= RF_FORCE_ENT_ALPHA; cgi_R_AddRefEntityToScene(&ent); return; } diff --git a/code/game/g_public.h b/code/game/g_public.h index 4d667bcc3d..16d2ec682b 100644 --- a/code/game/g_public.h +++ b/code/game/g_public.h @@ -25,7 +25,7 @@ along with this program; if not, see . #define __G_PUBLIC_H__ // g_public.h -- game module information visible to server -#define GAME_API_VERSION 8 +#define GAME_API_VERSION 9 // entity->svFlags // the server does not know how to interpret most of the values diff --git a/code/rd-common/tr_public.h b/code/rd-common/tr_public.h index 3db7b667dd..d0eded623d 100644 --- a/code/rd-common/tr_public.h +++ b/code/rd-common/tr_public.h @@ -30,7 +30,7 @@ along with this program; if not, see . #include "../ghoul2/G2.h" #include "../ghoul2/ghoul2_gore.h" -#define REF_API_VERSION 15 +#define REF_API_VERSION 16 typedef struct { void (QDECL *Printf) ( int printLevel, const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); diff --git a/code/rd-common/tr_types.h b/code/rd-common/tr_types.h index 133013e66e..c7d5df4e4d 100644 --- a/code/rd-common/tr_types.h +++ b/code/rd-common/tr_types.h @@ -74,6 +74,8 @@ along with this program; if not, see . #define RF_DISTORTION 0x400000 //area distortion effect -rww +#define RF_FORCE_ENT_ALPHA 0x800000 // override shader alpha settings + // refdef flags #define RDF_NOWORLDMODEL 1 // used for player configuration screen #define RDF_HYPERSPACE 4 // teleportation effect diff --git a/code/rd-vanilla/tr_backend.cpp b/code/rd-vanilla/tr_backend.cpp index 467548aba9..741bb95b17 100644 --- a/code/rd-vanilla/tr_backend.cpp +++ b/code/rd-vanilla/tr_backend.cpp @@ -568,8 +568,6 @@ static void RB_BeginDrawingView (void) { } } -#define MAC_EVENT_PUMP_MSEC 5 - //used by RF_DISTORTION static inline bool R_WorldCoordToScreenCoordFloat(vec3_t worldCoord, float *x, float *y) { @@ -707,9 +705,8 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { if (entityNum != REFENTITYNUM_WORLD && g_numPostRenders < MAX_POST_RENDERS) { - if ( (backEnd.refdef.entities[entityNum].e.renderfx & RF_DISTORTION)/* || - (backEnd.refdef.entities[entityNum].e.renderfx & RF_FORCE_ENT_ALPHA)*/) - //not sure if we need this alpha fix for sp or not, leaving it out for now -rww + if ( (backEnd.refdef.entities[entityNum].e.renderfx & RF_DISTORTION) || + (backEnd.refdef.entities[entityNum].e.renderfx & RF_FORCE_ENT_ALPHA)) { //must render last curEnt = &backEnd.refdef.entities[entityNum]; pRender = &g_postRenders[g_numPostRenders]; diff --git a/code/rd-vanilla/tr_shade.cpp b/code/rd-vanilla/tr_shade.cpp index d425ce36c2..48f3ed1332 100644 --- a/code/rd-vanilla/tr_shade.cpp +++ b/code/rd-vanilla/tr_shade.cpp @@ -1772,6 +1772,18 @@ static void ComputeTexCoords( shaderStage_t *pStage ) { } } +void ForceAlpha(unsigned char *dstColors, int TR_ForceEntAlpha) +{ + int i; + + dstColors += 3; + + for ( i = 0; i < tess.numVertexes; i++, dstColors += 4 ) + { + *dstColors = TR_ForceEntAlpha; + } +} + /* ** RB_IterateStagesGeneric */ @@ -2001,6 +2013,11 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input ) //don't depthmask, don't blend.. don't do anything GL_State(0); } + else if (backEnd.currentEntity && (backEnd.currentEntity->e.renderfx & RF_FORCE_ENT_ALPHA)) + { + ForceAlpha((unsigned char *) tess.svars.colors, backEnd.currentEntity->e.shaderRGBA[3]); + GL_State(GLS_SRCBLEND_SRC_ALPHA | GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA); + } else { GL_State( stateBits ); diff --git a/codeJK2/game/g_public.h b/codeJK2/game/g_public.h index a428f7ecc4..e54d45ddd1 100644 --- a/codeJK2/game/g_public.h +++ b/codeJK2/game/g_public.h @@ -25,7 +25,7 @@ along with this program; if not, see . #define __G_PUBLIC_H__ // g_public.h -- game module information visible to server -#define GAME_API_VERSION 8 // Bumped up to 8, since we support JA's engine now --eez +#define GAME_API_VERSION 9 // Bumped up to 8, since we support JA's engine now --eez // entity->svFlags // the server does not know how to interpret most of the values From b0ff42171f7d52e5516be81beeedccd4c1620200 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 6 Jun 2016 13:50:12 -0500 Subject: [PATCH 203/445] [SP] Increase mod list buffer size to match MP's --- code/ui/ui_main.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 7e8ad672ca..1b21a399ef 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -480,6 +480,8 @@ void _UI_Refresh( int realtime ) } } +#define MODSBUFSIZE (MAX_MODS * MAX_QPATH) + /* =============== UI_LoadMods @@ -487,13 +489,14 @@ UI_LoadMods */ static void UI_LoadMods() { int numdirs; - char dirlist[2048]; + char dirlist[MODSBUFSIZE]; char *dirptr; - char *descptr; + char *descptr; int i; int dirlen; uiInfo.modCount = 0; + numdirs = FS_GetFileList( "$modlist", "", dirlist, sizeof(dirlist) ); dirptr = dirlist; for( i = 0; i < numdirs; i++ ) { @@ -507,7 +510,6 @@ static void UI_LoadMods() { break; } } - } /* From ff91ff1e30c770bb711f2b018a2f6239aaf442b0 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 6 Jun 2016 13:52:22 -0500 Subject: [PATCH 204/445] [MP] Don't allow saberAttackCycle during intermission or while dead. --- codemp/game/g_cmds.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/codemp/game/g_cmds.c b/codemp/game/g_cmds.c index 13c71b45dd..9f2be21ab6 100644 --- a/codemp/game/g_cmds.c +++ b/codemp/game/g_cmds.c @@ -2755,6 +2755,22 @@ void Cmd_SaberAttackCycle_f(gentity_t *ent) { return; } + + if ( level.intermissionQueued || level.intermissiontime ) + { + trap->SendServerCommand( ent-g_entities, va( "print \"%s (saberAttackCycle)\n\"", G_GetStringEdString( "MP_SVGAME", "CANNOT_TASK_INTERMISSION" ) ) ); + return; + } + + if ( ent->health <= 0 + || ent->client->tempSpectate >= level.time + || ent->client->sess.sessionTeam == TEAM_SPECTATOR ) + { + trap->SendServerCommand( ent-g_entities, va( "print \"%s\n\"", G_GetStringEdString( "MP_SVGAME", "MUSTBEALIVE" ) ) ); + return; + } + + if ( ent->client->ps.weapon != WP_SABER ) { return; From f94bc6726222afbaaa52f87a411ae84a40515e7c Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 6 Jun 2016 14:07:03 -0500 Subject: [PATCH 205/445] [SP] Fixed an incorrect usage of strlen for a buffer size. --- code/game/g_client.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index 4fb143297b..738a794c62 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -2161,7 +2161,7 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded Q_stricmp( ent->NPC_type, "player" ) ) { // FIXME: game doesn't like it when you pass ent->NPC_type into this func. Insert all kinds of noises here --eez - char bleh[1024]; + char bleh[MAX_SPAWN_VARS_CHARS]; Q_strncpyz(bleh, ent->NPC_type, sizeof(bleh)); G_ChangePlayerModel( ent, bleh ); @@ -2360,9 +2360,8 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded Q_stricmp( ent->NPC_type, "player" ) ) { // FIXME: game doesn't like it when you pass ent->NPC_type into this func. Insert all kinds of noises here --eez - char bleh[1024]; - strncpy(bleh, ent->NPC_type, strlen(ent->NPC_type)); - bleh[strlen(ent->NPC_type)] = '\0'; + char bleh[MAX_SPAWN_VARS_CHARS]; + Q_strncpyz(bleh, ent->NPC_type, sizeof(bleh)); G_ChangePlayerModel( ent, bleh ); } From dcf5a6f997a9e0485f02bfdcaee85504d152d1c8 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 6 Jun 2016 14:08:24 -0500 Subject: [PATCH 206/445] [SP] Play punch effect when hitting walls like in MP. --- code/game/wp_melee.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/wp_melee.cpp b/code/game/wp_melee.cpp index 167b5ecde3..a010be95c6 100644 --- a/code/game/wp_melee.cpp +++ b/code/game/wp_melee.cpp @@ -44,6 +44,10 @@ void WP_Melee( gentity_t *ent ) if ( tr.entityNum >= ENTITYNUM_WORLD ) { + if ( tr.entityNum == ENTITYNUM_WORLD ) + { + G_PlayEffect( G_EffectIndex( "melee/punch_impact" ), tr.endpos, forwardVec ); + } return; } From a1d38813963567ef951d882a820283d9975212f3 Mon Sep 17 00:00:00 2001 From: dusty22 Date: Wed, 15 Jun 2016 12:28:36 -0400 Subject: [PATCH 207/445] quick fix - fixed a weird syntax error in files.cpp - reverted NPC surrendering to JK2 style behavior - made grans use a constant for random melee chance --- code/game/AI_Grenadier.cpp | 6 +- code/game/NPC_behavior.cpp | 3 +- code/game/g_missile.cpp | 382 +++++++++++++++++----------------- shared/qcommon/safe/files.cpp | 2 +- 4 files changed, 199 insertions(+), 194 deletions(-) diff --git a/code/game/AI_Grenadier.cpp b/code/game/AI_Grenadier.cpp index 50dae3e231..2454f599e5 100644 --- a/code/game/AI_Grenadier.cpp +++ b/code/game/AI_Grenadier.cpp @@ -48,6 +48,8 @@ extern qboolean FlyingCreature( gentity_t *ent ); #define REALIZE_THRESHOLD 0.6f #define CAUTIOUS_THRESHOLD ( REALIZE_THRESHOLD * 0.75 ) +#define MELEE_CHANCE 100000 + qboolean NPC_CheckPlayerTeamStealth( void ); static qboolean enemyLOS; @@ -530,7 +532,7 @@ void NPC_BSGrenadier_Attack( void ) //reset fire-timing variables if (NPCInfo->aiFlags&NPCAI_HEAVY_MELEE) { - if (enemyUsingSaber && !Q_irand(0,999) /*&& TIMER_Done(NPC, "sleepTime")*/) + if (enemyUsingSaber && !Q_irand(0,MELEE_CHANCE) /*&& TIMER_Done(NPC, "sleepTime")*/) { TIMER_Set(NPC, "sleepTime", Q_irand(2000, 5000));//keep using melee for a short while NPC_ChangeWeapon(WP_MELEE); @@ -559,7 +561,7 @@ void NPC_BSGrenadier_Attack( void ) //reset fire-timing variables if (enemyUsingSaber && enemyDist < 64*64) {//if enemy is close and using saber, wait until we've at least had a short chance to use melee - if (!Q_irand(0,999)/*TIMER_Done(NPC, "sleepTime")*/) + if (!Q_irand(0,MELEE_CHANCE)/*TIMER_Done(NPC, "sleepTime")*/) { TIMER_Set(NPC, "sleepTime", Q_irand(1500, 3000)); NPC_ChangeWeapon(WP_THERMAL); diff --git a/code/game/NPC_behavior.cpp b/code/game/NPC_behavior.cpp index 6377162dde..ee7a62b216 100644 --- a/code/game/NPC_behavior.cpp +++ b/code/game/NPC_behavior.cpp @@ -1983,7 +1983,8 @@ qboolean NPC_BSFlee( void ) //done panicking, time to realize we're dogmeat, if we haven't been able to flee for a few seconds if ((level.time - NPC->lastMoveTime)>3000) { - NPC_CheckSurrender(true); + //NPC_CheckSurrender(true); + NPC_Surrender(); } } diff --git a/code/game/g_missile.cpp b/code/game/g_missile.cpp index b11bf9ff2d..1026a3ed5d 100644 --- a/code/game/g_missile.cpp +++ b/code/game/g_missile.cpp @@ -146,7 +146,7 @@ G_ReflectMissile vec3_t g_crosshairWorldCoord = {0, 0, 0}; extern gentity_t *Jedi_FindEnemyInCone( gentity_t *self, gentity_t *fallback, float minDot ); extern cvar_t *g_saberAutoBlocking; -void G_ReflectMissile( gentity_t *ent, gentity_t *missile, vec3_t forward, forcePowers_t powerToUse ) +void G_ReflectMissile(gentity_t *ent, gentity_t *missile, vec3_t forward, forcePowers_t powerToUse) { vec3_t bounce_dir; int i; @@ -155,235 +155,237 @@ void G_ReflectMissile( gentity_t *ent, gentity_t *missile, vec3_t forward, force qboolean reflected = qfalse; gentity_t *owner = ent; - if ( ent->owner ) + if (ent->owner) { owner = ent->owner; } //save the original speed - speed = VectorNormalize( missile->s.pos.trDelta ); + speed = VectorNormalize(missile->s.pos.trDelta); - if ( ent && owner && owner->client && - (owner->client->ps.forcePowerLevel[powerToUse] > FORCE_LEVEL_2 || (owner->client->ps.forcePowerLevel[powerToUse]>FORCE_LEVEL_1&&!Q_irand( 0, 3 )) ) ) + if (ent && owner && owner->client && + (owner->client->ps.forcePowerLevel[powerToUse] > FORCE_LEVEL_2 || (owner->client->ps.forcePowerLevel[powerToUse] > FORCE_LEVEL_1&&!Q_irand(0, 3)))) //if high enough force skill (100% at level 3, 25% at level 2, 0% at level 1), reflections are perfectly deflected toward an enemy { perfectReflection = qtrue; } - - if ( powerToUse == FP_SABER_DEFENSE ) + + if (powerToUse == FP_SABER_DEFENSE) { - if ( owner->client->ps.saberInFlight ) + if (owner->client->ps.saberInFlight) {//but need saber in-hand for perfect reflection perfectReflection = qfalse; - if ( ent && owner && owner->client && !owner->client->ps.saberInFlight && - (owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2 || (owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]>FORCE_LEVEL_1&&!Q_irand( 0, 3 )) ) ) - {//if high enough defense skill and saber in-hand (100% at level 3, 25% at level 2, 0% at level 1), reflections are perfectly deflected toward an enemy - gentity_t *enemy; - if ( owner->enemy && Q_irand( 0, 3 ) ) - {//toward current enemy 75% of the time - enemy = owner->enemy; - } - - if ( g_spskill->integer >= 2 && !g_saberAutoBlocking->integer && owner->client->ps.saberBlockingTime < level.time ) - {//but need to be blocking for perfect reflection on higher difficulties - perfectReflection = qfalse; - } - } - - if ( perfectReflection ) - { - if (g_spskill->integer < 2 || owner->s.clientNum >= MAX_CLIENTS) //either by autoaim (lower difficulties) - { - gentity_t *enemy; - if ( owner->enemy && Q_irand( 0, 3 ) ) - {//toward current enemy 75% of the time - enemy = owner->enemy; - } - else - {//find another enemy - enemy = Jedi_FindEnemyInCone( owner, owner->enemy, 0.3f ); + if (ent && owner && owner->client && !owner->client->ps.saberInFlight && + (owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2 || (owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1&&!Q_irand(0, 3)))) + {//if high enough defense skill and saber in-hand (100% at level 3, 25% at level 2, 0% at level 1), reflections are perfectly deflected toward an enemy + gentity_t *enemy; + if (owner->enemy && Q_irand(0, 3)) + {//toward current enemy 75% of the time + enemy = owner->enemy; + } + + if (g_spskill->integer >= 2 && !g_saberAutoBlocking->integer && owner->client->ps.saberBlockingTime < level.time) + {//but need to be blocking for perfect reflection on higher difficulties + perfectReflection = qfalse; + } } - if ( enemy ) + + if (perfectReflection) { - vec3_t bullseye; - CalcEntitySpot( enemy, SPOT_HEAD, bullseye ); - bullseye[0] += Q_irand( -4, 4 ); - bullseye[1] += Q_irand( -4, 4 ); - bullseye[2] += Q_irand( -16, 4 ); - VectorSubtract( bullseye, missile->currentOrigin, bounce_dir ); - VectorNormalize( bounce_dir ); - if ( !PM_SaberInParry( owner->client->ps.saberMove ) - && !PM_SaberInReflect( owner->client->ps.saberMove ) - && !PM_SaberInIdle( owner->client->ps.saberMove ) ) - {//a bit more wild - if ( PM_SaberInAttack( owner->client->ps.saberMove ) - || PM_SaberInTransitionAny( owner->client->ps.saberMove ) - || PM_SaberInSpecialAttack( owner->client->ps.torsoAnim ) ) - {//moderately more wild - for ( i = 0; i < 3; i++ ) - { - bounce_dir[i] += Q_flrand( -0.2f, 0.2f ); - } + if (g_spskill->integer < 2 || owner->s.clientNum >= MAX_CLIENTS) //either by autoaim (lower difficulties) + { + gentity_t *enemy; + if (owner->enemy && Q_irand(0, 3)) + {//toward current enemy 75% of the time + enemy = owner->enemy; } else - {//mildly more wild - for ( i = 0; i < 3; i++ ) - { - bounce_dir[i] += Q_flrand( -0.1f, 0.1f ); - } + {//find another enemy + enemy = Jedi_FindEnemyInCone(owner, owner->enemy, 0.3f); } - } - VectorNormalize( bounce_dir ); - reflected = qtrue; - } - } - else //or by where the crosshair is (higher difficulties) - { - VectorSubtract( g_crosshairWorldCoord, missile->currentOrigin, bounce_dir ); - VectorNormalize( bounce_dir ); - if ( !PM_SaberInParry( owner->client->ps.saberMove ) - && !PM_SaberInReflect( owner->client->ps.saberMove ) - && !PM_SaberInIdle( owner->client->ps.saberMove ) ) - {//a bit more wild - if ( PM_SaberInAttack( owner->client->ps.saberMove ) - || PM_SaberInTransitionAny( owner->client->ps.saberMove ) - || PM_SaberInSpecialAttack( owner->client->ps.torsoAnim ) ) - {//moderately more wild - for ( i = 0; i < 3; i++ ) + if (enemy) { - bounce_dir[i] += Q_flrand( -0.2f, 0.2f ); + vec3_t bullseye; + CalcEntitySpot(enemy, SPOT_HEAD, bullseye); + bullseye[0] += Q_irand(-4, 4); + bullseye[1] += Q_irand(-4, 4); + bullseye[2] += Q_irand(-16, 4); + VectorSubtract(bullseye, missile->currentOrigin, bounce_dir); + VectorNormalize(bounce_dir); + if (!PM_SaberInParry(owner->client->ps.saberMove) + && !PM_SaberInReflect(owner->client->ps.saberMove) + && !PM_SaberInIdle(owner->client->ps.saberMove)) + {//a bit more wild + if (PM_SaberInAttack(owner->client->ps.saberMove) + || PM_SaberInTransitionAny(owner->client->ps.saberMove) + || PM_SaberInSpecialAttack(owner->client->ps.torsoAnim)) + {//moderately more wild + for (i = 0; i < 3; i++) + { + bounce_dir[i] += Q_flrand(-0.2f, 0.2f); + } + } + else + {//mildly more wild + for (i = 0; i < 3; i++) + { + bounce_dir[i] += Q_flrand(-0.1f, 0.1f); + } + } + } + VectorNormalize(bounce_dir); + reflected = qtrue; } } - else - {//mildly more wild - for ( i = 0; i < 3; i++ ) - { - bounce_dir[i] += Q_flrand( -0.1f, 0.1f ); + else //or by where the crosshair is (higher difficulties) + { + VectorSubtract(g_crosshairWorldCoord, missile->currentOrigin, bounce_dir); + VectorNormalize(bounce_dir); + if (!PM_SaberInParry(owner->client->ps.saberMove) + && !PM_SaberInReflect(owner->client->ps.saberMove) + && !PM_SaberInIdle(owner->client->ps.saberMove)) + {//a bit more wild + if (PM_SaberInAttack(owner->client->ps.saberMove) + || PM_SaberInTransitionAny(owner->client->ps.saberMove) + || PM_SaberInSpecialAttack(owner->client->ps.torsoAnim)) + {//moderately more wild + for (i = 0; i < 3; i++) + { + bounce_dir[i] += Q_flrand(-0.2f, 0.2f); + } + } + else + {//mildly more wild + for (i = 0; i < 3; i++) + { + bounce_dir[i] += Q_flrand(-0.1f, 0.1f); + } + } } + VectorNormalize(bounce_dir); + reflected = qtrue; } } - VectorNormalize( bounce_dir ); - reflected = qtrue; - } - } - if ( !reflected ) - { - if ( g_spskill->integer < 2 || owner->s.clientNum >= MAX_CLIENTS ) - { - if ( missile->owner && missile->s.weapon != WP_SABER) - {//bounce back at them if you can - VectorSubtract( missile->owner->currentOrigin, missile->currentOrigin, bounce_dir ); - VectorNormalize( bounce_dir ); - } - else - { - vec3_t missile_dir; - - VectorSubtract( ent->currentOrigin, missile->currentOrigin, missile_dir ); - VectorCopy( missile->s.pos.trDelta, bounce_dir ); - VectorScale( bounce_dir, DotProduct( forward, missile_dir ), bounce_dir ); - VectorNormalize( bounce_dir ); - } - } - else //deflect off at an angle. - { - vec3_t deflect_dir, missile_dir; - float forceFactor; - VectorSubtract( g_crosshairWorldCoord, missile->currentOrigin, deflect_dir ); - VectorCopy( missile->s.pos.trDelta, missile_dir ); - VectorNormalize( missile_dir ); - VectorNormalize( deflect_dir ); - - //bigger forceFactors make the reflected shots go closer to the crosshair - switch( owner->client->ps.forcePowerLevel[powerToUse] ) + if (!reflected) { - case FORCE_LEVEL_1: - forceFactor = 2.0f; - break; - case FORCE_LEVEL_2: - forceFactor = 3.0f; - break; - default: - forceFactor = 10.0f; - break; - } - - VectorMA(missile_dir, forceFactor, deflect_dir, bounce_dir ); - - VectorNormalize( bounce_dir ); - } - if ( owner->s.weapon == WP_SABER && owner->client && powerToUse == FP_SABER_DEFENSE) - {//saber - if ( owner->client->ps.saberInFlight ) - {//reflecting off a thrown saber is totally wild - for ( i = 0; i < 3; i++ ) + if (g_spskill->integer < 2 || owner->s.clientNum >= MAX_CLIENTS) { - bounce_dir[i] += Q_flrand( -0.8f, 0.8f ); + if (missile->owner && missile->s.weapon != WP_SABER) + {//bounce back at them if you can + VectorSubtract(missile->owner->currentOrigin, missile->currentOrigin, bounce_dir); + VectorNormalize(bounce_dir); + } + else + { + vec3_t missile_dir; + + VectorSubtract(ent->currentOrigin, missile->currentOrigin, missile_dir); + VectorCopy(missile->s.pos.trDelta, bounce_dir); + VectorScale(bounce_dir, DotProduct(forward, missile_dir), bounce_dir); + VectorNormalize(bounce_dir); + } } - } - else if ( owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] <= FORCE_LEVEL_1 ) - {// at level 1 or below - for ( i = 0; i < 3; i++ ) + else //deflect off at an angle. { - bounce_dir[i] += Q_flrand( -0.4f, 0.4f ); - } - } - else - {// at level 2 - for ( i = 0; i < 3; i++ ) - { - bounce_dir[i] += Q_flrand( -0.2f, 0.2f ); - } - } - if ( !PM_SaberInParry( owner->client->ps.saberMove ) - && !PM_SaberInReflect( owner->client->ps.saberMove ) - && !PM_SaberInIdle( owner->client->ps.saberMove ) ) - {//a bit more wild - if ( PM_SaberInAttack( owner->client->ps.saberMove ) - || PM_SaberInTransitionAny( owner->client->ps.saberMove ) - || PM_SaberInSpecialAttack( owner->client->ps.torsoAnim ) ) - {//really wild - for ( i = 0; i < 3; i++ ) + vec3_t deflect_dir, missile_dir; + float forceFactor; + VectorSubtract(g_crosshairWorldCoord, missile->currentOrigin, deflect_dir); + VectorCopy(missile->s.pos.trDelta, missile_dir); + VectorNormalize(missile_dir); + VectorNormalize(deflect_dir); + + //bigger forceFactors make the reflected shots go closer to the crosshair + switch (owner->client->ps.forcePowerLevel[powerToUse]) { - bounce_dir[i] += Q_flrand( -0.3f, 0.3f ); + case FORCE_LEVEL_1: + forceFactor = 2.0f; + break; + case FORCE_LEVEL_2: + forceFactor = 3.0f; + break; + default: + forceFactor = 10.0f; + break; + } + + VectorMA(missile_dir, forceFactor, deflect_dir, bounce_dir); + + VectorNormalize(bounce_dir); + } + if (owner->s.weapon == WP_SABER && owner->client && powerToUse == FP_SABER_DEFENSE) + {//saber + if (owner->client->ps.saberInFlight) + {//reflecting off a thrown saber is totally wild + for (i = 0; i < 3; i++) + { + bounce_dir[i] += Q_flrand(-0.8f, 0.8f); + } + } + else if (owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] <= FORCE_LEVEL_1) + {// at level 1 or below + for (i = 0; i < 3; i++) + { + bounce_dir[i] += Q_flrand(-0.4f, 0.4f); + } + } + else + {// at level 2 + for (i = 0; i < 3; i++) + { + bounce_dir[i] += Q_flrand(-0.2f, 0.2f); + } + } + if (!PM_SaberInParry(owner->client->ps.saberMove) + && !PM_SaberInReflect(owner->client->ps.saberMove) + && !PM_SaberInIdle(owner->client->ps.saberMove)) + {//a bit more wild + if (PM_SaberInAttack(owner->client->ps.saberMove) + || PM_SaberInTransitionAny(owner->client->ps.saberMove) + || PM_SaberInSpecialAttack(owner->client->ps.torsoAnim)) + {//really wild + for (i = 0; i < 3; i++) + { + bounce_dir[i] += Q_flrand(-0.3f, 0.3f); + } + } + else + {//mildly more wild + for (i = 0; i < 3; i++) + { + bounce_dir[i] += Q_flrand(-0.1f, 0.1f); + } + } } } else - {//mildly more wild - for ( i = 0; i < 3; i++ ) + {//some other kind of reflection + for (i = 0; i < 3; i++) { - bounce_dir[i] += Q_flrand( -0.1f, 0.1f ); + bounce_dir[i] += Q_flrand(-0.2f, 0.2f); } } } - } - else - {//some other kind of reflection - for ( i = 0; i < 3; i++ ) - { - bounce_dir[i] += Q_flrand( -0.2f, 0.2f ); - } - } - } - VectorNormalize( bounce_dir ); - VectorScale( bounce_dir, speed, missile->s.pos.trDelta ); + VectorNormalize(bounce_dir); + VectorScale(bounce_dir, speed, missile->s.pos.trDelta); #ifdef _DEBUG - assert( !Q_isnan(missile->s.pos.trDelta[0])&&!Q_isnan(missile->s.pos.trDelta[1])&&!Q_isnan(missile->s.pos.trDelta[2])); + assert(!Q_isnan(missile->s.pos.trDelta[0]) && !Q_isnan(missile->s.pos.trDelta[1]) && !Q_isnan(missile->s.pos.trDelta[2])); #endif// _DEBUG - missile->s.pos.trTime = level.time - 10; // move a bit on the very first frame - VectorCopy( missile->currentOrigin, missile->s.pos.trBase ); - if ( missile->s.weapon != WP_SABER ) - {//you are mine, now! - if ( !missile->lastEnemy ) - {//remember who originally shot this missile - missile->lastEnemy = missile->owner; + missile->s.pos.trTime = level.time - 10; // move a bit on the very first frame + VectorCopy(missile->currentOrigin, missile->s.pos.trBase); + if (missile->s.weapon != WP_SABER) + {//you are mine, now! + if (!missile->lastEnemy) + {//remember who originally shot this missile + missile->lastEnemy = missile->owner; + } + missile->owner = owner; + } + if (missile->s.weapon == WP_ROCKET_LAUNCHER) + {//stop homing + missile->e_ThinkFunc = thinkF_NULL; + } } - missile->owner = owner; - } - if ( missile->s.weapon == WP_ROCKET_LAUNCHER ) - {//stop homing - missile->e_ThinkFunc = thinkF_NULL; } } diff --git a/shared/qcommon/safe/files.cpp b/shared/qcommon/safe/files.cpp index a753b6ee1e..e12fba53fe 100644 --- a/shared/qcommon/safe/files.cpp +++ b/shared/qcommon/safe/files.cpp @@ -65,7 +65,7 @@ namespace FS #else const long size = FS_ReadFile( path, &buffer ); #endif - return size >= 0 ? FileBuffer{ buffer, size } : FileBuffer{}; + return size >= 0 ? FileBuffer( buffer, size ) : FileBuffer(); } #if !defined( SP_GAME ) From 81e1e28d01a615f15281d86fe3d10ce4dc249082 Mon Sep 17 00:00:00 2001 From: Razish Date: Sat, 18 Jun 2016 02:18:47 +1000 Subject: [PATCH 208/445] [Shared] Fix sound spam when alt-tabbing back into the game --- shared/sdl/sdl_sound.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/shared/sdl/sdl_sound.cpp b/shared/sdl/sdl_sound.cpp index ec89ab9445..be18c85597 100644 --- a/shared/sdl/sdl_sound.cpp +++ b/shared/sdl/sdl_sound.cpp @@ -307,4 +307,7 @@ void SNDDMA_Activate( qboolean activate ) #endif SDL_PauseAudio( !activate ); + if ( activate ) { + S_StopAllSounds(); + } } From 2764ebc9189f6d01da7fed39e4b588de2011561c Mon Sep 17 00:00:00 2001 From: Razish Date: Sat, 18 Jun 2016 04:00:08 +1000 Subject: [PATCH 209/445] [MP] Fix strict aliasing issues. From mvdevs/jk2mv@495f55f by @aufau --- codemp/qcommon/net_ip.cpp | 82 +++++++++++++++++++-------------------- shared/sys/sys_public.h | 4 +- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/codemp/qcommon/net_ip.cpp b/codemp/qcommon/net_ip.cpp index 6dcb46dba8..cdd589bf0e 100644 --- a/codemp/qcommon/net_ip.cpp +++ b/codemp/qcommon/net_ip.cpp @@ -97,7 +97,7 @@ static cvar_t *net_port; static cvar_t *net_dropsim; -static struct sockaddr socksRelayAddr; +static struct sockaddr_in socksRelayAddr; static SOCKET ip_socket = INVALID_SOCKET; static SOCKET socks_socket = INVALID_SOCKET; @@ -168,27 +168,26 @@ char *NET_ErrorString( void ) { #endif } -static void NetadrToSockadr( netadr_t *a, struct sockaddr *s ) { +static void NetadrToSockadr( netadr_t *a, struct sockaddr_in *s ) { memset( s, 0, sizeof(*s) ); if( a->type == NA_BROADCAST ) { - ((struct sockaddr_in *)s)->sin_family = AF_INET; - ((struct sockaddr_in *)s)->sin_port = a->port; - ((struct sockaddr_in *)s)->sin_addr.s_addr = INADDR_BROADCAST; + s->sin_family = AF_INET; + s->sin_port = a->port; + s->sin_addr.s_addr = INADDR_BROADCAST; } else if( a->type == NA_IP ) { - ((struct sockaddr_in *)s)->sin_family = AF_INET; - ((struct sockaddr_in *)s)->sin_addr.s_addr = *(int *)&a->ip; - ((struct sockaddr_in *)s)->sin_port = a->port; + s->sin_family = AF_INET; + memcpy( &s->sin_addr, a->ip, sizeof(s->sin_addr) ); + s->sin_port = a->port; } } -static void SockadrToNetadr( struct sockaddr *s, netadr_t *a ) { - if (s->sa_family == AF_INET) { - a->type = NA_IP; - *(int *)&a->ip = ((struct sockaddr_in *)s)->sin_addr.s_addr; - a->port = ((struct sockaddr_in *)s)->sin_port; - } +static void SockadrToNetadr( struct sockaddr_in *s, netadr_t *a ) { + assert(s->sin_family == AF_INET); + a->type = NA_IP; + memcpy( a->ip, &s->sin_addr, sizeof(a->ip) ); + a->port = s->sin_port; } /* @@ -196,24 +195,24 @@ static void SockadrToNetadr( struct sockaddr *s, netadr_t *a ) { Sys_StringToSockaddr ============= */ -static qboolean Sys_StringToSockaddr( const char *s, struct sockaddr *sadr ) +static qboolean Sys_StringToSockaddr( const char *s, struct sockaddr_in *sadr ) { struct hostent *h; memset( sadr, 0, sizeof( *sadr ) ); - ((struct sockaddr_in *)sadr)->sin_family = AF_INET; - ((struct sockaddr_in *)sadr)->sin_port = 0; + sadr->sin_family = AF_INET; + sadr->sin_port = 0; if( s[0] >= '0' && s[0] <= '9' ) { - *(int *)&((struct sockaddr_in *)sadr)->sin_addr = inet_addr(s); + sadr->sin_addr.s_addr = inet_addr(s); } else { if( ( h = gethostbyname( s ) ) == 0 ) return qfalse; - *(int *)&((struct sockaddr_in *)sadr)->sin_addr = *(int *)h->h_addr_list[0]; + sadr->sin_addr.s_addr = *(uint32_t *)h->h_addr_list[0]; } return qtrue; @@ -225,7 +224,7 @@ Sys_StringToAdr ============= */ qboolean Sys_StringToAdr( const char *s, netadr_t *a ) { - struct sockaddr sadr; + struct sockaddr_in sadr; if ( !Sys_StringToSockaddr( s, &sadr ) ) { return qfalse; @@ -251,7 +250,7 @@ int recvfromCount; qboolean NET_GetPacket( netadr_t *net_from, msg_t *net_message, fd_set *fdr ) { int ret, err; socklen_t fromlen; - struct sockaddr from; + struct sockaddr_in from; if ( ip_socket == INVALID_SOCKET || !FD_ISSET(ip_socket, fdr) ) { return qfalse; @@ -273,7 +272,7 @@ qboolean NET_GetPacket( netadr_t *net_from, msg_t *net_message, fd_set *fdr ) { return qfalse; } - memset( ((struct sockaddr_in *)&from)->sin_zero, 0, 8 ); + memset( from.sin_zero, 0, 8 ); if ( usingSocks && memcmp( &from, &socksRelayAddr, fromlen ) == 0 ) { if ( ret < 10 || net_message->data[0] != 0 || net_message->data[1] != 0 || net_message->data[2] != 0 || net_message->data[3] != 1 ) { @@ -284,7 +283,7 @@ qboolean NET_GetPacket( netadr_t *net_from, msg_t *net_message, fd_set *fdr ) { net_from->ip[1] = net_message->data[5]; net_from->ip[2] = net_message->data[6]; net_from->ip[3] = net_message->data[7]; - net_from->port = *(short *)&net_message->data[8]; + memcpy( &net_from->port, &net_message->data[8], 2 ); net_message->readcount = 10; } else { @@ -311,8 +310,8 @@ Sys_SendPacket ================== */ void Sys_SendPacket( int length, const void *data, netadr_t to ) { - int ret; - struct sockaddr addr; + int ret; + struct sockaddr_in addr; if ( to.type != NA_BROADCAST && to.type != NA_IP ) { Com_Error( ERR_FATAL, "Sys_SendPacket: bad address type" ); @@ -330,13 +329,13 @@ void Sys_SendPacket( int length, const void *data, netadr_t to ) { socksBuf[1] = 0; socksBuf[2] = 0; // fragment (not fragmented) socksBuf[3] = 1; // address type: IPV4 - *(int *)&socksBuf[4] = ((struct sockaddr_in *)&addr)->sin_addr.s_addr; - *(short *)&socksBuf[8] = ((struct sockaddr_in *)&addr)->sin_port; + memcpy( &socksBuf[4], &addr.sin_addr, 4 ); + memcpy( &socksBuf[8], &addr.sin_port, 2 ); memcpy( &socksBuf[10], data, length ); - ret = sendto( ip_socket, socksBuf, length+10, 0, &socksRelayAddr, sizeof(socksRelayAddr) ); + ret = sendto( ip_socket, socksBuf, length+10, 0, (sockaddr *)&socksRelayAddr, sizeof(socksRelayAddr) ); } else { - ret = sendto( ip_socket, (const char *)data, length, 0, &addr, sizeof(addr) ); + ret = sendto( ip_socket, (const char *)data, length, 0, (sockaddr *)&addr, sizeof(addr) ); } if( ret == SOCKET_ERROR ) { int err = socketError; @@ -459,7 +458,7 @@ SOCKET NET_IPSocket( char *net_interface, int port, int *err ) { address.sin_addr.s_addr = INADDR_ANY; } else { - if ( !Sys_StringToSockaddr( net_interface, (struct sockaddr *)&address ) ) { + if ( !Sys_StringToSockaddr( net_interface, &address ) ) { closesocket( newsocket ); return INVALID_SOCKET; } @@ -469,7 +468,7 @@ SOCKET NET_IPSocket( char *net_interface, int port, int *err ) { address.sin_port = 0; } else { - address.sin_port = htons( (short)port ); + address.sin_port = htons( port ); } if( bind( newsocket, (const struct sockaddr *)&address, sizeof(address) ) == SOCKET_ERROR ) { @@ -514,8 +513,8 @@ void NET_OpenSocks( int port ) { } memset( &address, 0, sizeof( address ) ); address.sin_family = AF_INET; - address.sin_addr.s_addr = *(int *)h->h_addr_list[0]; - address.sin_port = htons( (short)net_socksPort->integer ); + address.sin_addr.s_addr = *(uint32_t *)h->h_addr_list[0]; + address.sin_port = htons( net_socksPort->integer ); if ( connect( socks_socket, (struct sockaddr *)&address, sizeof( address ) ) == SOCKET_ERROR ) { Com_Printf( "NET_OpenSocks: connect: %s\n", NET_ErrorString() ); @@ -615,8 +614,10 @@ void NET_OpenSocks( int port ) { buf[1] = 3; // command: UDP associate buf[2] = 0; // reserved buf[3] = 1; // address type: IPV4 - *(int *)&buf[4] = INADDR_ANY; - *(short *)&buf[8] = htons( (short)port ); // port + const uint32_t innadr = INADDR_ANY; // 0.0.0.0 + memcpy( &buf[4], &innadr, 4 ); + uint16_t networkOrderPort = htons( port ); // port + memcpy( &buf[8], &networkOrderPort, 2 ); if ( send( socks_socket, (const char *)buf, 10, 0 ) == SOCKET_ERROR ) { Com_Printf( "NET_OpenSocks: send: %s\n", NET_ErrorString() ); return; @@ -641,11 +642,10 @@ void NET_OpenSocks( int port ) { Com_Printf( "NET_OpenSocks: relay address is not IPV4: %i\n", buf[3] ); return; } - memset( &socksRelayAddr, 0, sizeof( socksRelayAddr ) ); - ((struct sockaddr_in *)&socksRelayAddr)->sin_family = AF_INET; - ((struct sockaddr_in *)&socksRelayAddr)->sin_addr.s_addr = *(int *)&buf[4]; - ((struct sockaddr_in *)&socksRelayAddr)->sin_port = *(short *)&buf[8]; - memset( ((struct sockaddr_in *)&socksRelayAddr)->sin_zero, 0, 8 ); + socksRelayAddr.sin_family = AF_INET; + memcpy( &socksRelayAddr.sin_addr, &buf[4], 4 ); + memcpy( &socksRelayAddr.sin_port, &buf[8], 2 ); + memset( &socksRelayAddr.sin_zero, 0, 8 ); usingSocks = qtrue; } @@ -798,7 +798,7 @@ void NET_GetLocalAddress( void ) } while( ( p = hostInfo->h_addr_list[numIP] ) != NULL && numIP < MAX_IPS ) { - ip = ntohl( *(int *)p ); + ip = ntohl( *(uint32_t *)p ); localIP[ numIP ][0] = p[0]; localIP[ numIP ][1] = p[1]; localIP[ numIP ][2] = p[2]; diff --git a/shared/sys/sys_public.h b/shared/sys/sys_public.h index 837fe2fc96..d2a7325ac6 100644 --- a/shared/sys/sys_public.h +++ b/shared/sys/sys_public.h @@ -38,8 +38,8 @@ typedef struct netadr_s { netadrtype_t type; - byte ip[4]; - unsigned short port; + byte ip[4]; + uint16_t port; } netadr_t; /* From 4e6a765bc8936db50954650951218be566de2cad Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 18 Jun 2016 21:15:42 +0300 Subject: [PATCH 210/445] Add wrappers for reading saved games --- code/CMakeLists.txt | 4 +- code/cgame/FxScheduler.cpp | 4 +- code/cgame/FxScheduler.h | 39 + code/cgame/cg_main.cpp | 4 +- code/game/CMakeLists.txt | 1 + code/game/G_Timer.cpp | 6 +- code/game/Q3_Interface.cpp | 18 +- code/game/ai.h | 106 ++ code/game/b_public.h | 445 ++++++++ code/game/bg_public.h | 75 +- code/game/g_local.h | 162 +++ code/game/g_main.cpp | 4 +- code/game/g_objectives.cpp | 2 +- code/game/g_roff.cpp | 6 +- code/game/g_savegame.cpp | 47 +- code/game/g_shared.h | 1268 ++++++++++++++++++++++ code/game/g_vehicles.h | 245 +++++ code/game/ghoul2_shared.h | 441 ++++++++ code/icarus/IcarusImplementation.cpp | 6 +- code/qcommon/cm_load.cpp | 2 +- code/qcommon/md4.cpp | 4 +- code/qcommon/q_shared.h | 1107 ++++++++++++++++++- code/qcommon/qcommon.h | 2 +- code/rd-common/mdx_format.h | 29 + code/rd-vanilla/CMakeLists.txt | 1 + code/rd-vanilla/G2_misc.cpp | 36 +- code/server/sv_savegame.cpp | 52 +- codeJK2/cgame/cg_main.cpp | 4 +- codeJK2/game/CMakeLists.txt | 3 +- codeJK2/game/G_Timer.cpp | 8 +- codeJK2/game/Q3_Registers.cpp | 18 +- codeJK2/game/ai.h | 105 ++ codeJK2/game/anims.h | 36 + codeJK2/game/b_public.h | 394 +++++++ codeJK2/game/bg_public.h | 69 ++ codeJK2/game/g_ICARUS.cpp | 2 +- codeJK2/game/g_local.h | 120 +++ codeJK2/game/g_main.cpp | 4 +- codeJK2/game/g_objectives.cpp | 2 +- codeJK2/game/g_roff.cpp | 6 +- codeJK2/game/g_savegame.cpp | 53 +- codeJK2/game/g_shared.h | 1246 +++++++++++++++++++++ codeJK2/icarus/Instance.cpp | 16 +- codeJK2/icarus/Sequence.cpp | 26 +- codeJK2/icarus/Sequencer.cpp | 18 +- codeJK2/icarus/TaskManager.cpp | 42 +- codemp/icarus/GameInterface.cpp | 2 +- codemp/qcommon/md4.cpp | 4 +- codemp/qcommon/qcommon.h | 2 +- shared/qcommon/ojk_sg_wrappers.h | 1493 ++++++++++++++++++++++++++ 50 files changed, 7605 insertions(+), 184 deletions(-) create mode 100644 shared/qcommon/ojk_sg_wrappers.h diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 923b7003f3..6bda133870 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -173,7 +173,9 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SPDir}/qcommon/stv_version.h" "${SPDir}/qcommon/timing.h" "${SPDir}/qcommon/MiniHeap.h" - + + "${SharedDir}/qcommon/ojk_sg_wrappers.h" + ${SharedCommonFiles} ) source_group("common" FILES ${SPEngineCommonFiles}) diff --git a/code/cgame/FxScheduler.cpp b/code/cgame/FxScheduler.cpp index e09df30d68..020f29c6db 100644 --- a/code/cgame/FxScheduler.cpp +++ b/code/cgame/FxScheduler.cpp @@ -109,14 +109,14 @@ void CFxScheduler::LoadSave_Read() { Clean(); // need to get rid of old pre-cache handles, or it thinks it has some older effects when it doesn't g_vstrEffectsNeededPerSlot.clear(); // jic - gi.ReadFromSaveGame(INT_ID('F','X','L','E'), (void *) &gLoopedEffectArray, sizeof(gLoopedEffectArray), NULL); + ::sg_read_no_cast(::gi, INT_ID('F','X','L','E'), ::gLoopedEffectArray); // // now read in and re-register the effects we need for those structs... // for (int iFX = 0; iFX < MAX_LOOPED_FX; iFX++) { char sFX_Filename[MAX_QPATH]; - gi.ReadFromSaveGame(INT_ID('F','X','F','N'), sFX_Filename, sizeof(sFX_Filename), NULL); + ::sg_read_no_cast(::gi, INT_ID('F','X','F','N'), sFX_Filename); g_vstrEffectsNeededPerSlot.push_back( sFX_Filename ); } } diff --git a/code/cgame/FxScheduler.h b/code/cgame/FxScheduler.h index 5c3ff91d96..ac554da680 100644 --- a/code/cgame/FxScheduler.h +++ b/code/cgame/FxScheduler.h @@ -401,14 +401,53 @@ struct SEffectTemplate #define MAX_LOOPED_FX 32 // We hold a looped effect here +#pragma pack(push, 4) +class SgSLoopedEffect +{ +public: + int32_t mId; + int32_t mBoltInfo; + int32_t mNextTime; + int32_t mLoopStopTime; + uint8_t mPortalEffect; + uint8_t mIsRelative; +}; // SgSLoopedEffect +#pragma pack(pop) + struct SLoopedEffect { + using SgType = SgSLoopedEffect; + + int mId; // effect id int mBoltInfo; // used to determine which bolt on the ghoul2 model we should be attaching this effect to int mNextTime; //time to render again int mLoopStopTime; //time to die bool mPortalEffect; // rww - render this before skyportals, and not in the normal world view. bool mIsRelative; // bolt this puppy on keep it updated + + + void sg_export( + SgType& dst) const + { + ::sg_export(mId, dst.mId); + ::sg_export(mBoltInfo, dst.mBoltInfo); + ::sg_export(mNextTime, dst.mNextTime); + ::sg_export(mLoopStopTime, dst.mLoopStopTime); + ::sg_export(mPortalEffect, dst.mPortalEffect); + ::sg_export(mIsRelative, dst.mIsRelative); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.mId, mId); + ::sg_import(src.mBoltInfo, mBoltInfo); + ::sg_import(src.mNextTime, mNextTime); + ::sg_import(src.mLoopStopTime, mLoopStopTime); + ::sg_import(src.mPortalEffect, mPortalEffect); + ::sg_import(src.mIsRelative, mIsRelative); + } }; class CFxScheduler diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 92e9169536..732c9c785a 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -1911,8 +1911,8 @@ void CG_WriteTheEvilCGHackStuff(void) } void CG_ReadTheEvilCGHackStuff(void) { - gi.ReadFromSaveGame(INT_ID('F','P','S','L'), (void *)&gi_cg_forcepowerSelect, sizeof(gi_cg_forcepowerSelect), NULL); - gi.ReadFromSaveGame(INT_ID('I','V','S','L'), (void *)&gi_cg_inventorySelect, sizeof(gi_cg_inventorySelect), NULL); + ::sg_read(::gi, INT_ID('F','P','S','L'), ::gi_cg_forcepowerSelect); + ::sg_read(::gi, INT_ID('I','V','S','L'), ::gi_cg_inventorySelect); gbUseTheseValuesFromLoadSave = qtrue; } diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 4a7193a1d8..99d081dbc4 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -260,6 +260,7 @@ set(SPGameCommonFiles "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" + "${SharedDir}/qcommon/ojk_sg_wrappers.h" ${SharedCommonFiles} ) diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index 952471a4cb..6591847c34 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -209,7 +209,7 @@ void TIMER_Load( void ) { unsigned char numTimers; - gi.ReadFromSaveGame( INT_ID('T','I','M','E'), (void *)&numTimers, sizeof(numTimers), NULL ); + ::sg_read(::gi, INT_ID('T','I','M','E'), numTimers); //Read back all entries for ( int i = 0; i < numTimers; i++ ) @@ -220,8 +220,8 @@ void TIMER_Load( void ) assert (sizeof(g_timers[0]->time) == sizeof(time) );//make sure we're reading the same size as we wrote //Read the id string and time - gi.ReadFromSaveGame( INT_ID('T','M','I','D'), (char *) tempBuffer, 0, NULL ); - gi.ReadFromSaveGame( INT_ID('T','D','T','A'), (void *) &time, sizeof( time ), NULL ); + ::sg_read_no_cast(::gi, INT_ID('T','M','I','D'), tempBuffer, 0); + ::sg_read(::gi, INT_ID('T','D','T','A'), time); //this is odd, we saved all the timers in the autosave, but not all the ents are spawned yet from an auto load, so skip it if (ent->inuse) diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 7b12b23816..51b3e79ec4 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -7278,19 +7278,19 @@ void CQuake3GameInterface::VariableLoadFloats( varFloat_m &fmap ) int numFloats; char tempBuffer[1024]; - gi.ReadFromSaveGame( INT_ID('F','V','A','R'), &numFloats, sizeof( numFloats ), NULL ); + ::sg_read(::gi, INT_ID('F','V','A','R'), numFloats); for ( int i = 0; i < numFloats; i++ ) { int idSize; - gi.ReadFromSaveGame( INT_ID('F','I','D','L'), &idSize, sizeof( idSize ), NULL ); - gi.ReadFromSaveGame( INT_ID('F','I','D','S'), &tempBuffer, idSize, NULL ); + ::sg_read(::gi, INT_ID('F','I','D','L'), idSize); + ::sg_read_no_cast(::gi, INT_ID('F','I','D','S'), tempBuffer, idSize); tempBuffer[ idSize ] = 0; float val; - gi.ReadFromSaveGame( INT_ID('F','V','A','L'), &val, sizeof( float ), NULL ); + ::sg_read(::gi, INT_ID('F','V','A','L'), val); DeclareVariable( TK_FLOAT, (const char *) &tempBuffer ); SetFloatVariable( (const char *) &tempBuffer, val ); @@ -7309,18 +7309,18 @@ void CQuake3GameInterface::VariableLoadStrings( int type, varString_m &fmap ) char tempBuffer[1024]; char tempBuffer2[1024]; - gi.ReadFromSaveGame( INT_ID('S','V','A','R'), &numFloats, sizeof( numFloats ), NULL ); + ::sg_read(::gi, INT_ID('S','V','A','R'), numFloats); for ( int i = 0; i < numFloats; i++ ) { int idSize; - gi.ReadFromSaveGame( INT_ID('S','I','D','L'), &idSize, sizeof( idSize ), NULL ); - gi.ReadFromSaveGame( INT_ID('S','I','D','S'), &tempBuffer, idSize, NULL ); + ::sg_read(::gi, INT_ID('S','I','D','L'), idSize); + ::sg_read_no_cast(::gi, INT_ID('S','I','D','S'), tempBuffer, idSize); tempBuffer[ idSize ] = 0; - gi.ReadFromSaveGame( INT_ID('S','V','S','Z'), &idSize, sizeof( idSize ), NULL ); - gi.ReadFromSaveGame( INT_ID('S','V','A','L'), &tempBuffer2, idSize, NULL ); + ::sg_read(::gi, INT_ID('S','V','S','Z'), idSize); + ::sg_read_no_cast(::gi, INT_ID('S','V','A','L'), tempBuffer2, idSize); tempBuffer2[ idSize ] = 0; switch ( type ) diff --git a/code/game/ai.h b/code/game/ai.h index da79271682..5ab6e78171 100644 --- a/code/game/ai.h +++ b/code/game/ai.h @@ -115,18 +115,78 @@ void NPC_BSAnimal_Default( void ); //Group AI #define MAX_FRAME_GROUPS 32 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgAiGroupMember +{ +public: + int32_t number; + int32_t waypoint; + int32_t pathCostToEnemy; + int32_t closestBuddy; +}; // SgAiGroupMember +#pragma pack(pop) + typedef struct AIGroupMember_s { + using SgType = SgAiGroupMember; + + int number; int waypoint; int pathCostToEnemy; int closestBuddy; + + + void sg_export( + SgType& dst) const + { + ::sg_export(number, dst.number); + ::sg_export(waypoint, dst.waypoint); + ::sg_export(pathCostToEnemy, dst.pathCostToEnemy); + ::sg_export(closestBuddy, dst.closestBuddy); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.number, number); + ::sg_import(src.waypoint, waypoint); + ::sg_import(src.pathCostToEnemy, pathCostToEnemy); + ::sg_import(src.closestBuddy, closestBuddy); + } } AIGroupMember_t; #define MAX_GROUP_MEMBERS 32 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgAiGroupInfo +{ +public: + int32_t numGroup; + int32_t processed; + int32_t team; + int32_t enemy; + int32_t enemyWP; + int32_t speechDebounceTime; + int32_t lastClearShotTime; + int32_t lastSeenEnemyTime; + int32_t morale; + int32_t moraleAdjust; + int32_t moraleDebounce; + int32_t memberValidateTime; + int32_t activeMemberNum; + int32_t commander; + SgVec3 enemyLastSeenPos; + SgArray numState; + SgArray member; +}; // SgAiGroupInfo +#pragma pack(pop) + typedef struct AIGroupInfo_s { + using SgType = SgAiGroupInfo; + + int numGroup; qboolean processed; team_t team; @@ -144,8 +204,54 @@ typedef struct AIGroupInfo_s vec3_t enemyLastSeenPos; int numState[ NUM_SQUAD_STATES ]; AIGroupMember_t member[ MAX_GROUP_MEMBERS ]; + + + void sg_export( + SgType& dst) const + { + ::sg_export(numGroup, dst.numGroup); + ::sg_export(processed, dst.processed); + ::sg_export(team, dst.team); + ::sg_export(enemy, dst.enemy); + ::sg_export(enemyWP, dst.enemyWP); + ::sg_export(speechDebounceTime, dst.speechDebounceTime); + ::sg_export(lastClearShotTime, dst.lastClearShotTime); + ::sg_export(lastSeenEnemyTime, dst.lastSeenEnemyTime); + ::sg_export(morale, dst.morale); + ::sg_export(moraleAdjust, dst.moraleAdjust); + ::sg_export(moraleDebounce, dst.moraleDebounce); + ::sg_export(memberValidateTime, dst.memberValidateTime); + ::sg_export(activeMemberNum, dst.activeMemberNum); + ::sg_export(commander, dst.commander); + ::sg_export(enemyLastSeenPos, dst.enemyLastSeenPos); + ::sg_export(numState, dst.numState); + ::sg_export(member, dst.member); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.numGroup, numGroup); + ::sg_import(src.processed, processed); + ::sg_import(src.team, team); + ::sg_import(src.enemy, enemy); + ::sg_import(src.enemyWP, enemyWP); + ::sg_import(src.speechDebounceTime, speechDebounceTime); + ::sg_import(src.lastClearShotTime, lastClearShotTime); + ::sg_import(src.lastSeenEnemyTime, lastSeenEnemyTime); + ::sg_import(src.morale, morale); + ::sg_import(src.moraleAdjust, moraleAdjust); + ::sg_import(src.moraleDebounce, moraleDebounce); + ::sg_import(src.memberValidateTime, memberValidateTime); + ::sg_import(src.activeMemberNum, activeMemberNum); + ::sg_import(src.commander, commander); + ::sg_import(src.enemyLastSeenPos, enemyLastSeenPos); + ::sg_import(src.numState, numState); + ::sg_import(src.member, member); + } } AIGroupInfo_t; + int AI_GetGroupSize( vec3_t origin, int radius, team_t playerTeam, gentity_t *avoid = NULL ); int AI_GetGroupSize( gentity_t *ent, int radius ); diff --git a/code/game/b_public.h b/code/game/b_public.h index c2c9ddb622..8117edc91d 100644 --- a/code/game/b_public.h +++ b/code/game/b_public.h @@ -132,8 +132,36 @@ typedef enum } sexType_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgGNpcStats +{ +public: + int32_t aggression; + int32_t aim; + float earshot; + int32_t evasion; + int32_t hfov; + int32_t intelligence; + int32_t move; + int32_t reactions; + float shootDistance; + int32_t vfov; + float vigilance; + float visrange; + int32_t runSpeed; + int32_t walkSpeed; + float yawSpeed; + int32_t health; + int32_t acceleration; + int32_t sex; +}; // SgGNpcStats +#pragma pack(pop) + typedef struct gNPCstats_e {//Stats, loaded in, and can be set by scripts + using SgType = SgGNpcStats; + + //AI int aggression; // " int aim; // " @@ -155,6 +183,53 @@ typedef struct gNPCstats_e int acceleration; //sex sexType_t sex; //male, female, etc. + + + void sg_export( + SgType& dst) const + { + ::sg_export(aggression, dst.aggression); + ::sg_export(aim, dst.aim); + ::sg_export(earshot, dst.earshot); + ::sg_export(evasion, dst.evasion); + ::sg_export(hfov, dst.hfov); + ::sg_export(intelligence, dst.intelligence); + ::sg_export(move, dst.move); + ::sg_export(reactions, dst.reactions); + ::sg_export(shootDistance, dst.shootDistance); + ::sg_export(vfov, dst.vfov); + ::sg_export(vigilance, dst.vigilance); + ::sg_export(visrange, dst.visrange); + ::sg_export(runSpeed, dst.runSpeed); + ::sg_export(walkSpeed, dst.walkSpeed); + ::sg_export(yawSpeed, dst.yawSpeed); + ::sg_export(health, dst.health); + ::sg_export(acceleration, dst.acceleration); + ::sg_export(sex, dst.sex); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.aggression, aggression); + ::sg_import(src.aim, aim); + ::sg_import(src.earshot, earshot); + ::sg_import(src.evasion, evasion); + ::sg_import(src.hfov, hfov); + ::sg_import(src.intelligence, intelligence); + ::sg_import(src.move, move); + ::sg_import(src.reactions, reactions); + ::sg_import(src.shootDistance, shootDistance); + ::sg_import(src.vfov, vfov); + ::sg_import(src.vigilance, vigilance); + ::sg_import(src.visrange, visrange); + ::sg_import(src.runSpeed, runSpeed); + ::sg_import(src.walkSpeed, walkSpeed); + ::sg_import(src.yawSpeed, yawSpeed); + ::sg_import(src.health, health); + ::sg_import(src.acceleration, acceleration); + ::sg_import(src.sex, sex); + } } gNPCstats_t; @@ -163,8 +238,134 @@ typedef struct gNPCstats_e #define ENEMY_POS_LAG_STEPS (MAX_ENEMY_POS_LAG/ENEMY_POS_LAG_INTERVAL) // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgGNpc +{ +public: + int32_t timeOfDeath; + int32_t touchedByPlayer; + int32_t enemyLastVisibility; + int32_t aimTime; + float desiredYaw; + float desiredPitch; + float lockedDesiredYaw; + float lockedDesiredPitch; + int32_t aimingBeam; + SgVec3 enemyLastSeenLocation; + int32_t enemyLastSeenTime; + SgVec3 enemyLastHeardLocation; + int32_t enemyLastHeardTime; + int32_t lastAlertID; + int32_t eFlags; + int32_t aiFlags; + int32_t currentAmmo; + int32_t shotTime; + int32_t burstCount; + int32_t burstMin; + +#ifdef BASE_SAVE_COMPAT + int32_t burstMean; +#endif + + int32_t burstMax; + int32_t burstSpacing; + int32_t attackHold; + int32_t attackHoldTime; + SgVec3 shootAngles; + int32_t rank; + int32_t behaviorState; + int32_t defaultBehavior; + int32_t tempBehavior; + int32_t ignorePain; + int32_t duckDebounceTime; + int32_t walkDebounceTime; + int32_t enemyCheckDebounceTime; + int32_t investigateDebounceTime; + int32_t investigateCount; + SgVec3 investigateGoal; + int32_t investigateSoundDebounceTime; + int32_t greetingDebounceTime; + int32_t eventOwner; + int32_t coverTarg; + int32_t jumpState; + float followDist; + int32_t tempGoal; + int32_t goalEntity; + int32_t lastGoalEntity; + int32_t eventualGoal; + int32_t captureGoal; + int32_t defendEnt; + int32_t greetEnt; + int32_t goalTime; + int32_t straightToGoal; + float distToGoal; + int32_t navTime; + int32_t blockingEntNum; + int32_t blockedSpeechDebounceTime; + int32_t homeWp; + int32_t avoidSide; + int32_t leaderAvoidSide; + int32_t lastAvoidSteerSide; + int32_t lastAvoidSteerSideDebouncer; + int32_t group; + int32_t troop; + SgVec3 lastPathAngles; + SgGNpcStats stats; + int32_t aimErrorDebounceTime; + float lastAimErrorYaw; + float lastAimErrorPitch; + SgVec3 aimOfs; + int32_t currentAim; + int32_t currentAggression; + int32_t scriptFlags; + int32_t desiredSpeed; + int32_t currentSpeed; + int8_t last_forwardmove; + int8_t last_rightmove; + SgVec3 lastClearOrigin; + int32_t shoveCount; + int32_t blockedDebounceTime; + int32_t blockedEntity; + SgVec3 blockedTargetPosition; + int32_t blockedTargetEntity; + SgVec3 jumpDest; + int32_t jumpTarget; + float jumpMaxXYDist; + float jumpMazZDist; + int32_t jumpSide; + int32_t jumpTime; + int32_t jumpBackupTime; + int32_t jumpNextCheckTime; + int32_t combatPoint; + int32_t lastFailedCombatPoint; + int32_t movementSpeech; + float movementSpeechChance; + int32_t nextBStateThink; + SgUserCmd last_ucmd; + int32_t combatMove; + int32_t goalRadius; + int32_t pauseTime; + int32_t standTime; + int32_t localState; + int32_t squadState; + int32_t confusionTime; + int32_t charmedTime; + int32_t controlledTime; + int32_t surrenderTime; + int32_t kneelTime; + SgArray enemyLaggedPos; + int32_t watchTarget; + int32_t ffireCount; + int32_t ffireDebounce; + int32_t ffireFadeDebounce; +}; // SgGNpc +#pragma pack(pop) + typedef struct { + using SgType = SgGNpc; + + //FIXME: Put in playerInfo or something int timeOfDeath; //FIXME do we really need both of these gentity_t *touchedByPlayer; @@ -332,8 +533,252 @@ typedef struct int ffireCount; //sigh... you'd think I'd be able to find a way to do this without having to use 3 int fields, but... int ffireDebounce; int ffireFadeDebounce; + + + void sg_export( + SgType& dst) const + { + ::sg_export(timeOfDeath, dst.timeOfDeath); + ::sg_export(touchedByPlayer, dst.touchedByPlayer); + ::sg_export(enemyLastVisibility, dst.enemyLastVisibility); + ::sg_export(aimTime, dst.aimTime); + ::sg_export(desiredYaw, dst.desiredYaw); + ::sg_export(desiredPitch, dst.desiredPitch); + ::sg_export(lockedDesiredYaw, dst.lockedDesiredYaw); + ::sg_export(lockedDesiredPitch, dst.lockedDesiredPitch); + ::sg_export(aimingBeam, dst.aimingBeam); + ::sg_export(enemyLastSeenLocation, dst.enemyLastSeenLocation); + ::sg_export(enemyLastSeenTime, dst.enemyLastSeenTime); + ::sg_export(enemyLastHeardLocation, dst.enemyLastHeardLocation); + ::sg_export(enemyLastHeardTime, dst.enemyLastHeardTime); + ::sg_export(lastAlertID, dst.lastAlertID); + ::sg_export(eFlags, dst.eFlags); + ::sg_export(aiFlags, dst.aiFlags); + ::sg_export(currentAmmo, dst.currentAmmo); + ::sg_export(shotTime, dst.shotTime); + ::sg_export(burstCount, dst.burstCount); + ::sg_export(burstMin, dst.burstMin); + +#ifdef BASE_SAVE_COMPAT + ::sg_export(burstMean, dst.burstMean); +#endif + + ::sg_export(burstMax, dst.burstMax); + ::sg_export(burstSpacing, dst.burstSpacing); + ::sg_export(attackHold, dst.attackHold); + ::sg_export(attackHoldTime, dst.attackHoldTime); + ::sg_export(shootAngles, dst.shootAngles); + ::sg_export(rank, dst.rank); + ::sg_export(behaviorState, dst.behaviorState); + ::sg_export(defaultBehavior, dst.defaultBehavior); + ::sg_export(tempBehavior, dst.tempBehavior); + ::sg_export(ignorePain, dst.ignorePain); + ::sg_export(duckDebounceTime, dst.duckDebounceTime); + ::sg_export(walkDebounceTime, dst.walkDebounceTime); + ::sg_export(enemyCheckDebounceTime, dst.enemyCheckDebounceTime); + ::sg_export(investigateDebounceTime, dst.investigateDebounceTime); + ::sg_export(investigateCount, dst.investigateCount); + ::sg_export(investigateGoal, dst.investigateGoal); + ::sg_export(investigateSoundDebounceTime, dst.investigateSoundDebounceTime); + ::sg_export(greetingDebounceTime, dst.greetingDebounceTime); + ::sg_export(eventOwner, dst.eventOwner); + ::sg_export(coverTarg, dst.coverTarg); + ::sg_export(jumpState, dst.jumpState); + ::sg_export(followDist, dst.followDist); + ::sg_export(tempGoal, dst.tempGoal); + ::sg_export(goalEntity, dst.goalEntity); + ::sg_export(lastGoalEntity, dst.lastGoalEntity); + ::sg_export(eventualGoal, dst.eventualGoal); + ::sg_export(captureGoal, dst.captureGoal); + ::sg_export(defendEnt, dst.defendEnt); + ::sg_export(greetEnt, dst.greetEnt); + ::sg_export(goalTime, dst.goalTime); + ::sg_export(straightToGoal, dst.straightToGoal); + ::sg_export(distToGoal, dst.distToGoal); + ::sg_export(navTime, dst.navTime); + ::sg_export(blockingEntNum, dst.blockingEntNum); + ::sg_export(blockedSpeechDebounceTime, dst.blockedSpeechDebounceTime); + ::sg_export(homeWp, dst.homeWp); + ::sg_export(avoidSide, dst.avoidSide); + ::sg_export(leaderAvoidSide, dst.leaderAvoidSide); + ::sg_export(lastAvoidSteerSide, dst.lastAvoidSteerSide); + ::sg_export(lastAvoidSteerSideDebouncer, dst.lastAvoidSteerSideDebouncer); + ::sg_export(group, dst.group); + ::sg_export(troop, dst.troop); + ::sg_export(lastPathAngles, dst.lastPathAngles); + ::sg_export(stats, dst.stats); + ::sg_export(aimErrorDebounceTime, dst.aimErrorDebounceTime); + ::sg_export(lastAimErrorYaw, dst.lastAimErrorYaw); + ::sg_export(lastAimErrorPitch, dst.lastAimErrorPitch); + ::sg_export(aimOfs, dst.aimOfs); + ::sg_export(currentAim, dst.currentAim); + ::sg_export(currentAggression, dst.currentAggression); + ::sg_export(scriptFlags, dst.scriptFlags); + ::sg_export(desiredSpeed, dst.desiredSpeed); + ::sg_export(currentSpeed, dst.currentSpeed); + ::sg_export(last_forwardmove, dst.last_forwardmove); + ::sg_export(last_rightmove, dst.last_rightmove); + ::sg_export(lastClearOrigin, dst.lastClearOrigin); + ::sg_export(shoveCount, dst.shoveCount); + ::sg_export(blockedDebounceTime, dst.blockedDebounceTime); + ::sg_export(blockedEntity, dst.blockedEntity); + ::sg_export(blockedTargetPosition, dst.blockedTargetPosition); + ::sg_export(blockedTargetEntity, dst.blockedTargetEntity); + ::sg_export(jumpDest, dst.jumpDest); + ::sg_export(jumpTarget, dst.jumpTarget); + ::sg_export(jumpMaxXYDist, dst.jumpMaxXYDist); + ::sg_export(jumpMazZDist, dst.jumpMazZDist); + ::sg_export(jumpSide, dst.jumpSide); + ::sg_export(jumpTime, dst.jumpTime); + ::sg_export(jumpBackupTime, dst.jumpBackupTime); + ::sg_export(jumpNextCheckTime, dst.jumpNextCheckTime); + ::sg_export(combatPoint, dst.combatPoint); + ::sg_export(lastFailedCombatPoint, dst.lastFailedCombatPoint); + ::sg_export(movementSpeech, dst.movementSpeech); + ::sg_export(movementSpeechChance, dst.movementSpeechChance); + ::sg_export(nextBStateThink, dst.nextBStateThink); + ::sg_export(last_ucmd, dst.last_ucmd); + ::sg_export(combatMove, dst.combatMove); + ::sg_export(goalRadius, dst.goalRadius); + ::sg_export(pauseTime, dst.pauseTime); + ::sg_export(standTime, dst.standTime); + ::sg_export(localState, dst.localState); + ::sg_export(squadState, dst.squadState); + ::sg_export(confusionTime, dst.confusionTime); + ::sg_export(charmedTime, dst.charmedTime); + ::sg_export(controlledTime, dst.controlledTime); + ::sg_export(surrenderTime, dst.surrenderTime); + ::sg_export(kneelTime, dst.kneelTime); + ::sg_export(enemyLaggedPos, dst.enemyLaggedPos); + ::sg_export(watchTarget, dst.watchTarget); + ::sg_export(ffireCount, dst.ffireCount); + ::sg_export(ffireDebounce, dst.ffireDebounce); + ::sg_export(ffireFadeDebounce, dst.ffireFadeDebounce); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.timeOfDeath, timeOfDeath); + ::sg_import(src.touchedByPlayer, touchedByPlayer); + ::sg_import(src.enemyLastVisibility, enemyLastVisibility); + ::sg_import(src.aimTime, aimTime); + ::sg_import(src.desiredYaw, desiredYaw); + ::sg_import(src.desiredPitch, desiredPitch); + ::sg_import(src.lockedDesiredYaw, lockedDesiredYaw); + ::sg_import(src.lockedDesiredPitch, lockedDesiredPitch); + ::sg_import(src.aimingBeam, aimingBeam); + ::sg_import(src.enemyLastSeenLocation, enemyLastSeenLocation); + ::sg_import(src.enemyLastSeenTime, enemyLastSeenTime); + ::sg_import(src.enemyLastHeardLocation, enemyLastHeardLocation); + ::sg_import(src.enemyLastHeardTime, enemyLastHeardTime); + ::sg_import(src.lastAlertID, lastAlertID); + ::sg_import(src.eFlags, eFlags); + ::sg_import(src.aiFlags, aiFlags); + ::sg_import(src.currentAmmo, currentAmmo); + ::sg_import(src.shotTime, shotTime); + ::sg_import(src.burstCount, burstCount); + ::sg_import(src.burstMin, burstMin); + +#ifdef BASE_SAVE_COMPAT + ::sg_import(src.burstMean, burstMean); +#endif + + ::sg_import(src.burstMax, burstMax); + ::sg_import(src.burstSpacing, burstSpacing); + ::sg_import(src.attackHold, attackHold); + ::sg_import(src.attackHoldTime, attackHoldTime); + ::sg_import(src.shootAngles, shootAngles); + ::sg_import(src.rank, rank); + ::sg_import(src.behaviorState, behaviorState); + ::sg_import(src.defaultBehavior, defaultBehavior); + ::sg_import(src.tempBehavior, tempBehavior); + ::sg_import(src.ignorePain, ignorePain); + ::sg_import(src.duckDebounceTime, duckDebounceTime); + ::sg_import(src.walkDebounceTime, walkDebounceTime); + ::sg_import(src.enemyCheckDebounceTime, enemyCheckDebounceTime); + ::sg_import(src.investigateDebounceTime, investigateDebounceTime); + ::sg_import(src.investigateCount, investigateCount); + ::sg_import(src.investigateGoal, investigateGoal); + ::sg_import(src.investigateSoundDebounceTime, investigateSoundDebounceTime); + ::sg_import(src.greetingDebounceTime, greetingDebounceTime); + ::sg_import(src.eventOwner, eventOwner); + ::sg_import(src.coverTarg, coverTarg); + ::sg_import(src.jumpState, jumpState); + ::sg_import(src.followDist, followDist); + ::sg_import(src.tempGoal, tempGoal); + ::sg_import(src.goalEntity, goalEntity); + ::sg_import(src.lastGoalEntity, lastGoalEntity); + ::sg_import(src.eventualGoal, eventualGoal); + ::sg_import(src.captureGoal, captureGoal); + ::sg_import(src.defendEnt, defendEnt); + ::sg_import(src.greetEnt, greetEnt); + ::sg_import(src.goalTime, goalTime); + ::sg_import(src.straightToGoal, straightToGoal); + ::sg_import(src.distToGoal, distToGoal); + ::sg_import(src.navTime, navTime); + ::sg_import(src.blockingEntNum, blockingEntNum); + ::sg_import(src.blockedSpeechDebounceTime, blockedSpeechDebounceTime); + ::sg_import(src.homeWp, homeWp); + ::sg_import(src.avoidSide, avoidSide); + ::sg_import(src.leaderAvoidSide, leaderAvoidSide); + ::sg_import(src.lastAvoidSteerSide, lastAvoidSteerSide); + ::sg_import(src.lastAvoidSteerSideDebouncer, lastAvoidSteerSideDebouncer); + ::sg_import(src.group, group); + ::sg_import(src.troop, troop); + ::sg_import(src.lastPathAngles, lastPathAngles); + ::sg_import(src.stats, stats); + ::sg_import(src.aimErrorDebounceTime, aimErrorDebounceTime); + ::sg_import(src.lastAimErrorYaw, lastAimErrorYaw); + ::sg_import(src.lastAimErrorPitch, lastAimErrorPitch); + ::sg_import(src.aimOfs, aimOfs); + ::sg_import(src.currentAim, currentAim); + ::sg_import(src.currentAggression, currentAggression); + ::sg_import(src.scriptFlags, scriptFlags); + ::sg_import(src.desiredSpeed, desiredSpeed); + ::sg_import(src.currentSpeed, currentSpeed); + ::sg_import(src.last_forwardmove, last_forwardmove); + ::sg_import(src.last_rightmove, last_rightmove); + ::sg_import(src.lastClearOrigin, lastClearOrigin); + ::sg_import(src.shoveCount, shoveCount); + ::sg_import(src.blockedDebounceTime, blockedDebounceTime); + ::sg_import(src.blockedEntity, blockedEntity); + ::sg_import(src.blockedTargetPosition, blockedTargetPosition); + ::sg_import(src.blockedTargetEntity, blockedTargetEntity); + ::sg_import(src.jumpDest, jumpDest); + ::sg_import(src.jumpTarget, jumpTarget); + ::sg_import(src.jumpMaxXYDist, jumpMaxXYDist); + ::sg_import(src.jumpMazZDist, jumpMazZDist); + ::sg_import(src.jumpSide, jumpSide); + ::sg_import(src.jumpTime, jumpTime); + ::sg_import(src.jumpBackupTime, jumpBackupTime); + ::sg_import(src.jumpNextCheckTime, jumpNextCheckTime); + ::sg_import(src.combatPoint, combatPoint); + ::sg_import(src.lastFailedCombatPoint, lastFailedCombatPoint); + ::sg_import(src.movementSpeech, movementSpeech); + ::sg_import(src.movementSpeechChance, movementSpeechChance); + ::sg_import(src.nextBStateThink, nextBStateThink); + ::sg_import(src.last_ucmd, last_ucmd); + ::sg_import(src.combatMove, combatMove); + ::sg_import(src.goalRadius, goalRadius); + ::sg_import(src.pauseTime, pauseTime); + ::sg_import(src.standTime, standTime); + ::sg_import(src.localState, localState); + ::sg_import(src.squadState, squadState); + ::sg_import(src.confusionTime, confusionTime); + ::sg_import(src.charmedTime, charmedTime); + ::sg_import(src.controlledTime, controlledTime); + ::sg_import(src.surrenderTime, surrenderTime); + ::sg_import(src.kneelTime, kneelTime); + ::sg_import(src.enemyLaggedPos, enemyLaggedPos); + ::sg_import(src.watchTarget, watchTarget); + ::sg_import(src.ffireCount, ffireCount); + ::sg_import(src.ffireDebounce, ffireDebounce); + ::sg_import(src.ffireFadeDebounce, ffireFadeDebounce); + } } gNPC_t; + void G_SquadPathsInit(void); void NPC_InitGame( void ); void G_LoadBoltOns( void ); diff --git a/code/game/bg_public.h b/code/game/bg_public.h index becb74b25a..89ca1b2108 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -455,15 +455,49 @@ typedef enum { } entity_event_t; #pragma pack(push, 1) +class SgAnimation +{ +public: + uint16_t firstFrame; + uint16_t numFrames; + int16_t frameLerp; + int8_t loopFrames; + uint8_t glaIndex; +}; // SgAnimation +#pragma pack(pop) + typedef struct animation_s { + using SgType = SgAnimation; + + unsigned short firstFrame; unsigned short numFrames; short frameLerp; // msec between frames //initial lerp is abs(frameLerp) signed char loopFrames; // 0 to numFrames, -1 = no loop unsigned char glaIndex; + + + void sg_export( + SgType& dst) const + { + ::sg_export(firstFrame, dst.firstFrame); + ::sg_export(numFrames, dst.numFrames); + ::sg_export(frameLerp, dst.frameLerp); + ::sg_export(loopFrames, dst.loopFrames); + ::sg_export(glaIndex, dst.glaIndex); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.firstFrame, firstFrame); + ::sg_import(src.numFrames, numFrames); + ::sg_import(src.frameLerp, frameLerp); + ::sg_import(src.loopFrames, loopFrames); + ::sg_import(src.glaIndex, glaIndex); + } } animation_t; -#pragma pack(pop) #define MAX_ANIM_FILES 16 #define MAX_ANIM_EVENTS 300 @@ -516,14 +550,53 @@ typedef enum AEV_NUM_AEV } animEventType_t; +#pragma pack(push, 4) +class SgAnimEvent +{ +public: + int32_t eventType; + int16_t modelOnly; + uint16_t glaIndex; + uint16_t keyFrame; + SgArray eventData; + int32_t stringData; +}; // SgAnimEvent +#pragma pack(pop) + typedef struct animevent_s { + using SgType = SgAnimEvent; + + animEventType_t eventType; signed short modelOnly; //event is specific to a modelname to skeleton unsigned short glaIndex; unsigned short keyFrame; //Frame to play event on signed short eventData[AED_ARRAY_SIZE]; //Unique IDs, can be soundIndex of sound file to play OR effect index or footstep type, etc. char *stringData; //we allow storage of one string, temporarily (in case we have to look up an index later, then make sure to set stringData to NULL so we only do the look-up once) + + + void sg_export( + SgType& dst) const + { + ::sg_export(eventType, dst.eventType); + ::sg_export(modelOnly, dst.modelOnly); + ::sg_export(glaIndex, dst.glaIndex); + ::sg_export(keyFrame, dst.keyFrame); + ::sg_export(eventData, dst.eventData); + ::sg_export(stringData, dst.stringData); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.eventType, eventType); + ::sg_import(src.modelOnly, modelOnly); + ::sg_import(src.glaIndex, glaIndex); + ::sg_import(src.keyFrame, keyFrame); + ::sg_import(src.eventData, eventData); + ::sg_import(src.stringData, stringData); + } } animevent_t; typedef enum diff --git a/code/game/g_local.h b/code/game/g_local.h index 851dfe5711..7f068974a9 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -88,14 +88,53 @@ along with this program; if not, see . #define VALIDSTRING( a ) ( ( a != NULL ) && ( a[0] != '\0' ) ) //animations +#pragma pack(push, 4) +class SgAnimFileSet +{ +public: + SgArray filename; + SgArray animations; + SgArray torsoAnimEvents; + SgArray legsAnimEvents; + uint8_t torsoAnimEventCount; + uint8_t legsAnimEventCount; +}; // SgAnimFileSet +#pragma pack(pop) + typedef struct { + using SgType = SgAnimFileSet; + + char filename[MAX_QPATH]; animation_t animations[MAX_ANIMATIONS]; animevent_t torsoAnimEvents[MAX_ANIM_EVENTS]; animevent_t legsAnimEvents[MAX_ANIM_EVENTS]; unsigned char torsoAnimEventCount; unsigned char legsAnimEventCount; + + + void sg_export( + SgType& dst) const + { + ::sg_export(filename, dst.filename); + ::sg_export(animations, dst.animations); + ::sg_export(torsoAnimEvents, dst.torsoAnimEvents); + ::sg_export(legsAnimEvents, dst.legsAnimEvents); + ::sg_export(torsoAnimEventCount, dst.torsoAnimEventCount); + ::sg_export(legsAnimEventCount, dst.legsAnimEventCount); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.filename, filename); + ::sg_import(src.animations, animations); + ::sg_import(src.torsoAnimEvents, torsoAnimEvents); + ::sg_import(src.legsAnimEvents, legsAnimEvents); + ::sg_import(src.torsoAnimEventCount, torsoAnimEventCount); + ::sg_import(src.legsAnimEventCount, legsAnimEventCount); + } } animFileSet_t; extern stringID_table_t animTable [MAX_ANIMATIONS+1]; @@ -145,8 +184,28 @@ enum alertEventLevel_e }; // !!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! +#pragma pack(push, 4) +class SgAlertEvent +{ +public: + SgVec3 position; + float radius; + int32_t level; + int32_t type; + int32_t owner; + float light; + float addLight; + int32_t ID; + int32_t timestamp; + int32_t onGround; +}; // SgAlertEvent +#pragma pack(pop) + typedef struct alertEvent_s { + using SgType = SgAlertEvent; + + vec3_t position; //Where the event is located float radius; //Consideration radius alertEventLevel_e level; //Priority level of the event @@ -157,6 +216,37 @@ typedef struct alertEvent_s int ID; //unique... if get a ridiculous number, this will repeat, but should not be a problem as it's just comparing it to your lastAlertID int timestamp; //when it was created qboolean onGround; //alert is on the ground (only used for sounds) + + + void sg_export( + SgType& dst) const + { + ::sg_export(position, dst.position); + ::sg_export(radius, dst.radius); + ::sg_export(level, dst.level); + ::sg_export(type, dst.type); + ::sg_export(owner, dst.owner); + ::sg_export(light, dst.light); + ::sg_export(addLight, dst.addLight); + ::sg_export(ID, dst.ID); + ::sg_export(timestamp, dst.timestamp); + ::sg_export(onGround, dst.onGround); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.position, position); + ::sg_import(src.radius, radius); + ::sg_import(src.level, level); + ::sg_import(src.type, type); + ::sg_import(src.owner, owner); + ::sg_import(src.light, light); + ::sg_import(src.addLight, addLight); + ::sg_import(src.ID, ID); + ::sg_import(src.timestamp, timestamp); + ::sg_import(src.onGround, onGround); + } } alertEvent_t; // @@ -181,8 +271,35 @@ typedef struct #define WF_PUFFING 0x00000004 // puffing something // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgLevelLocals +{ +public: + int32_t clients; + int32_t maxclients; + int32_t framenum; + int32_t time; + int32_t previousTime; + int32_t globalTime; + SgArray mapname; + int32_t locationLinked; + int32_t locationHead; + SgArray alertEvents; + int32_t numAlertEvents; + int32_t curAlertID; + SgArray groups; + SgArray knownAnimFileSets; + int32_t numKnownAnimFileSets; + int32_t worldFlags; + int32_t dmState; +}; // SgLevelLocals +#pragma pack(pop) + typedef struct { + using SgType = SgLevelLocals; + + gclient_t *clients; // [maxclients] // store latched cvars here that we want to get at often @@ -240,6 +357,51 @@ typedef struct float mRotationAdjust; char *mTargetAdjust; qboolean hasBspInstances; + + + void sg_export( + SgType& dst) const + { + ::sg_export(clients, dst.clients); + ::sg_export(maxclients, dst.maxclients); + ::sg_export(framenum, dst.framenum); + ::sg_export(time, dst.time); + ::sg_export(previousTime, dst.previousTime); + ::sg_export(globalTime, dst.globalTime); + ::sg_export(mapname, dst.mapname); + ::sg_export(locationLinked, dst.locationLinked); + ::sg_export(locationHead, dst.locationHead); + ::sg_export(alertEvents, dst.alertEvents); + ::sg_export(numAlertEvents, dst.numAlertEvents); + ::sg_export(curAlertID, dst.curAlertID); + ::sg_export(groups, dst.groups); + ::sg_export(knownAnimFileSets, dst.knownAnimFileSets); + ::sg_export(numKnownAnimFileSets, dst.numKnownAnimFileSets); + ::sg_export(worldFlags, dst.worldFlags); + ::sg_export(dmState, dst.dmState); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.clients, clients); + ::sg_import(src.maxclients, maxclients); + ::sg_import(src.framenum, framenum); + ::sg_import(src.time, time); + ::sg_import(src.previousTime, previousTime); + ::sg_import(src.globalTime, globalTime); + ::sg_import(src.mapname, mapname); + ::sg_import(src.locationLinked, locationLinked); + ::sg_import(src.locationHead, locationHead); + ::sg_import(src.alertEvents, alertEvents); + ::sg_import(src.numAlertEvents, numAlertEvents); + ::sg_import(src.curAlertID, curAlertID); + ::sg_import(src.groups, groups); + ::sg_import(src.knownAnimFileSets, knownAnimFileSets); + ::sg_import(src.numKnownAnimFileSets, numKnownAnimFileSets); + ::sg_import(src.worldFlags, worldFlags); + ::sg_import(src.dmState, dmState); + } } level_locals_t; extern level_locals_t level; diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 7e106804a0..6ddf5c4018 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -110,7 +110,7 @@ void WriteInUseBits(void) void ReadInUseBits(void) { - gi.ReadFromSaveGame(INT_ID('I','N','U','S'), &g_entityInUseBits, sizeof(g_entityInUseBits), NULL); + ::sg_read(::gi, INT_ID('I','N','U','S'), ::g_entityInUseBits); // This is only temporary. Once I have converted all the ent->inuse refs, // it won;t be needed -MW. for(int i=0;i(::gi, INT_ID('L','C','K','D'), player_locked); } diff --git a/code/game/g_objectives.cpp b/code/game/g_objectives.cpp index 76b075d2e1..57d13fd044 100644 --- a/code/game/g_objectives.cpp +++ b/code/game/g_objectives.cpp @@ -84,7 +84,7 @@ OBJ_LoadMissionObjectives */ void OBJ_LoadMissionObjectives( gclient_t *client ) { - gi.ReadFromSaveGame(INT_ID('O','B','J','T'), (void *) &client->sess.mission_objectives, sizeof(client->sess.mission_objectives), NULL); + ::sg_read_no_cast(::gi, INT_ID('O','B','J','T'), client->sess.mission_objectives); } diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp index 41dfbc2d2d..01c671c868 100644 --- a/code/game/g_roff.cpp +++ b/code/game/g_roff.cpp @@ -675,13 +675,13 @@ void G_LoadCachedRoffs() char buffer[MAX_QPATH]; // Get the count of goodies we need to revive - gi.ReadFromSaveGame( INT_ID('R','O','F','F'), (void *)&count, sizeof(count), NULL ); + ::sg_read(::gi, INT_ID('R','O','F','F'), count); // Now bring 'em back to life for ( i = 0; i < count; i++ ) { - gi.ReadFromSaveGame( INT_ID('S','L','E','N'), (void *)&len, sizeof(len), NULL ); - gi.ReadFromSaveGame( INT_ID('R','S','T','R'), (void *)(buffer), len, NULL ); + ::sg_read(::gi, INT_ID('S','L','E','N'), len); + ::sg_read_no_cast(::gi, INT_ID('R','S','T','R'), buffer, len); G_LoadRoff( buffer ); } } diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index cbb44498a9..f469f6bd0b 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -187,7 +187,7 @@ static char *GetStringPtr(int iStrlen, char *psOriginal/*may be NULL*/) assert(iStrlen+1<=(int)sizeof(sString)); - gi.ReadFromSaveGame(INT_ID('S','T','R','G'), sString, iStrlen, NULL); + ::sg_read_no_cast(::gi, INT_ID('S','T','R','G'), sString, iStrlen); // TAG_G_ALLOC is always blown away, we can never recycle if (psOriginal && gi.bIsFromZone(psOriginal, TAG_G_ALLOC)) { @@ -724,9 +724,18 @@ static void SG_ConvertRetailSaberinfoToNewSaberinfo( void *sabData, saberInfo_t } } -static void EvaluateFields(const save_field_t *pFields, byte *pbData, byte *pbOriginalRefData, unsigned int ulChid, int iSize, qboolean bOkToSizeMisMatch) +template +static void EvaluateFields(const save_field_t *pFields, T *pbData, byte *pbOriginalRefData, unsigned int ulChid, int iSize, qboolean bOkToSizeMisMatch) { - int iReadSize = gi.ReadFromSaveGame(ulChid, pbData, bOkToSizeMisMatch?0:iSize, NULL); + using SgType = typename T::SgType; + + iSize = static_cast(sizeof(SgType)); + + auto& sg_buffer = ::sg_get_buffer(iSize); + + auto sg_object = reinterpret_cast(sg_buffer.data()); + + int iReadSize = ::gi.ReadFromSaveGame(ulChid, sg_object, bOkToSizeMisMatch?0:iSize, NULL); if (iReadSize != iSize) { @@ -761,11 +770,13 @@ static void EvaluateFields(const save_field_t *pFields, byte *pbData, byte *pbOr } } + ::sg_import(*sg_object, *pbData); + if (pFields) { for (const save_field_t *pField = pFields; pField->psName; pField++) { - EvaluateField(pField, pbData, pbOriginalRefData); + EvaluateField(pField, reinterpret_cast(pbData), pbOriginalRefData); } } } @@ -801,7 +812,7 @@ static void ReadLevelLocals () level_locals_t *temp = (level_locals_t *)gi.Malloc(sizeof(level_locals_t), TAG_TEMP_WORKSPACE, qfalse); *temp = level; // struct copy - EvaluateFields(savefields_LevelLocals, (byte *)temp, (byte *)&level, INT_ID('L','V','L','C'), LLOFS(LEVEL_LOCALS_T_SAVESTOP),qfalse); // sizeof(level_locals_t)); + EvaluateFields(savefields_LevelLocals, temp, (byte *)&level, INT_ID('L','V','L','C'), LLOFS(LEVEL_LOCALS_T_SAVESTOP),qfalse); // sizeof(level_locals_t)); level = *temp; // struct copy level.clients = pClients; // restore clients @@ -904,13 +915,13 @@ static void ReadGEntities(qboolean qbAutosave) int iCount; int i; - gi.ReadFromSaveGame(INT_ID('N','M','E','D'), (void *)&iCount, sizeof(iCount), NULL); + ::sg_read(::gi, INT_ID('N','M','E','D'), iCount); int iPreviousEntRead = -1; for (i=0; i(::gi, INT_ID('E','D','N','M'), iEntIndex); if (iEntIndex >= globals.num_entities) { @@ -945,7 +956,7 @@ static void ReadGEntities(qboolean qbAutosave) // gi.G2API_LoadSaveCodeDestructGhoul2Info(pEnt->ghoul2); pEnt->ghoul2.kill(); - EvaluateFields(savefields_gEntity, (byte *)pEnt, (byte *)pEntOriginal, INT_ID('G','E','N','T'), sizeof(*pEnt),qfalse); + EvaluateFields(savefields_gEntity, pEnt, (byte *)pEntOriginal, INT_ID('G','E','N','T'), sizeof(*pEnt),qfalse); pEnt->ghoul2.kill(); // now for any fiddly bits... @@ -954,7 +965,7 @@ static void ReadGEntities(qboolean qbAutosave) { gNPC_t tempNPC; - EvaluateFields(savefields_gNPC, (byte *)&tempNPC,(byte *)pEntOriginal->NPC, INT_ID('G','N','P','C'), sizeof (*pEnt->NPC),qfalse); + EvaluateFields(savefields_gNPC, &tempNPC,(byte *)pEntOriginal->NPC, INT_ID('G','N','P','C'), sizeof (*pEnt->NPC),qfalse); // so can we pinch the original's one or do we have to alloc a new one?... // @@ -990,7 +1001,7 @@ static void ReadGEntities(qboolean qbAutosave) { gclient_t tempGClient; - EvaluateFields(savefields_gClient, (byte *)&tempGClient, (byte *)pEntOriginal->client, INT_ID('G','C','L','I'), sizeof(*pEnt->client),qtrue);//qfalse); + EvaluateFields(savefields_gClient, &tempGClient, (byte *)pEntOriginal->client, INT_ID('G','C','L','I'), sizeof(*pEnt->client),qtrue);//qfalse); // can we pinch the original's client handle or do we have to alloc a new one?... // @@ -1023,7 +1034,7 @@ static void ReadGEntities(qboolean qbAutosave) { parms_t tempParms; - gi.ReadFromSaveGame(INT_ID('P','A','R','M'), &tempParms, sizeof(tempParms), NULL); + ::sg_read_no_cast(::gi, INT_ID('P','A','R','M'), tempParms); // so can we pinch the original's one or do we have to alloc a new one?... // @@ -1049,7 +1060,7 @@ static void ReadGEntities(qboolean qbAutosave) { Vehicle_t tempVehicle; - EvaluateFields(savefields_gVHIC, (byte *)&tempVehicle,(byte *)pEntOriginal->m_pVehicle, INT_ID('V','H','I','C'), sizeof (*pEnt->m_pVehicle),qfalse); + EvaluateFields(savefields_gVHIC, &tempVehicle,(byte *)pEntOriginal->m_pVehicle, INT_ID('V','H','I','C'), sizeof (*pEnt->m_pVehicle),qfalse); // so can we pinch the original's one or do we have to alloc a new one?... // @@ -1075,7 +1086,7 @@ static void ReadGEntities(qboolean qbAutosave) // { char *pGhoul2Data = NULL; - gi.ReadFromSaveGame(INT_ID('G','H','L','2'), 0, 0, (void**)&pGhoul2Data); + ::sg_read_allocate(::gi, INT_ID('G','H','L','2'), pGhoul2Data); gi.G2API_LoadGhoul2Models(pEnt->ghoul2, pGhoul2Data); // if it's going to crash anywhere... gi.Free(pGhoul2Data); } @@ -1140,7 +1151,7 @@ static void ReadGEntities(qboolean qbAutosave) // check that Icarus has loaded everything it saved out by having a marker chunk after it... // static int iBlah = 1234; - gi.ReadFromSaveGame(INT_ID('I','C','O','K'), &iBlah, sizeof(iBlah), NULL); + ::sg_read(::gi, INT_ID('I','C','O','K'), iBlah); } if (!qbAutosave) { @@ -1203,13 +1214,13 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) //Read & throw away gclient info gclient_t junkClient; - EvaluateFields(savefields_gClient, (byte *)&junkClient, (byte *)&level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qtrue);//qfalse); + EvaluateFields(savefields_gClient, &junkClient, (byte *)&level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qtrue);//qfalse); ReadLevelLocals(); // level_locals_t level //Read & throw away objective info objectives_t junkObj[MAX_MISSION_OBJ]; - gi.ReadFromSaveGame(INT_ID('O','B','J','T'), (void *) &junkObj, 0, NULL); + ::sg_read_no_cast(::gi, INT_ID('O','B','J','T'), junkObj); } else { @@ -1218,7 +1229,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way things work gclient_t GClient; - EvaluateFields(savefields_gClient, (byte *)&GClient, (byte *)&level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qtrue);//qfalse); + EvaluateFields(savefields_gClient, &GClient, (byte *)&level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qtrue);//qfalse); level.clients[0] = GClient; // struct copy ReadLevelLocals(); // level_locals_t level } @@ -1242,7 +1253,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) // check that the whole file content was loaded by specifically requesting an end-marker... // static int iDONE = 1234; - gi.ReadFromSaveGame(INT_ID('D','O','N','E'), &iDONE, sizeof(iDONE), NULL); + ::sg_read(::gi, INT_ID('D','O','N','E'), iDONE); } extern int killPlayerTimer; diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 0ea27be490..72f2d3ec5c 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -91,7 +91,34 @@ typedef enum //# material_e #define MAX_CUSTOM_JEDI_SOUNDS 22 #define MAX_CUSTOM_SOUNDS (MAX_CUSTOM_JEDI_SOUNDS + MAX_CUSTOM_EXTRA_SOUNDS + MAX_CUSTOM_COMBAT_SOUNDS + MAX_CUSTOM_BASIC_SOUNDS) // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgClientInfo +{ +public: + int32_t infoValid; + SgArray name; + int32_t team; + int32_t score; + int32_t handicap; + int32_t legsModel; + int32_t legsSkin; + int32_t torsoModel; + int32_t torsoSkin; + int32_t headModel; + int32_t headSkin; + int32_t animFileIndex; + SgArray sounds; + int32_t customBasicSoundDir; + int32_t customCombatSoundDir; + int32_t customExtraSoundDir; + int32_t customJediSoundDir; +}; // SgClientInfo +#pragma pack(pop) + typedef struct { + using SgType = SgClientInfo; + + qboolean infoValid; char name[MAX_QPATH]; @@ -118,6 +145,52 @@ typedef struct { char *customCombatSoundDir; char *customExtraSoundDir; char *customJediSoundDir; + + + void sg_export( + SgType& dst) const + { + ::sg_export(infoValid, dst.infoValid); + ::sg_export(name, dst.name); + ::sg_export(team, dst.team); + ::sg_export(score, dst.score); + ::sg_export(handicap, dst.handicap); + ::sg_export(legsModel, dst.legsModel); + ::sg_export(legsSkin, dst.legsSkin); + ::sg_export(torsoModel, dst.torsoModel); + ::sg_export(torsoSkin, dst.torsoSkin); + ::sg_export(headModel, dst.headModel); + ::sg_export(headSkin, dst.headSkin); + ::sg_export(animFileIndex, dst.animFileIndex); + ::sg_export(sounds, dst.sounds); + ::sg_export(customBasicSoundDir, dst.customBasicSoundDir); + ::sg_export(customCombatSoundDir, dst.customCombatSoundDir); + ::sg_export(customExtraSoundDir, dst.customExtraSoundDir); + ::sg_export(customJediSoundDir, dst.customJediSoundDir); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.infoValid, infoValid); + ::sg_import(src.name, name); + ::sg_import(src.team, team); + ::sg_import(src.score, score); + ::sg_import(src.handicap, handicap); + ::sg_import(src.legsModel, legsModel); + ::sg_import(src.legsSkin, legsSkin); + ::sg_import(src.torsoModel, torsoModel); + ::sg_import(src.torsoSkin, torsoSkin); + ::sg_import(src.headModel, headModel); + ::sg_import(src.headSkin, headSkin); + ::sg_import(src.animFileIndex, animFileIndex); + ::sg_import(src.sounds, sounds); + ::sg_import(src.customBasicSoundDir, customBasicSoundDir); + ::sg_import(src.customCombatSoundDir, customCombatSoundDir); + ::sg_import(src.customExtraSoundDir, customExtraSoundDir); + ::sg_import(src.customJediSoundDir, customJediSoundDir); + } + } clientInfo_t; @@ -150,8 +223,70 @@ typedef enum #define RF_LOCKEDANGLE 1 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgRenderInfo +{ +public: + SgArray legsModelName; + SgArray torsoModelName; + SgArray headModelName; + int32_t headYawRangeLeft; + int32_t headYawRangeRight; + int32_t headPitchRangeUp; + int32_t headPitchRangeDown; + int32_t torsoYawRangeLeft; + int32_t torsoYawRangeRight; + int32_t torsoPitchRangeUp; + int32_t torsoPitchRangeDown; + int32_t legsFrame; + int32_t torsoFrame; + float legsFpsMod; + float torsoFpsMod; + SgArray customRGBA; + int32_t boneIndex1; + int32_t boneIndex2; + int32_t boneIndex3; + int32_t boneIndex4; + int32_t boneOrient; + SgVec3 boneAngles1; + SgVec3 boneAngles2; + SgVec3 boneAngles3; + SgVec3 boneAngles4; + int32_t renderFlags; + SgVec3 muzzlePoint; + SgVec3 muzzleDir; + SgVec3 muzzlePointOld; + SgVec3 muzzleDirOld; + int32_t mPCalcTime; + float lockYaw; + SgVec3 headPoint; + SgVec3 headAngles; + SgVec3 handRPoint; + SgVec3 handLPoint; + SgVec3 crotchPoint; + SgVec3 footRPoint; + SgVec3 footLPoint; + SgVec3 torsoPoint; + SgVec3 torsoAngles; + SgVec3 eyePoint; + SgVec3 eyeAngles; + int32_t lookTarget; + int32_t lookMode; + int32_t lookTargetClearTime; + int32_t lastVoiceVolume; + SgVec3 lastHeadAngles; + SgVec3 headBobAngles; + SgVec3 targetHeadBobAngles; + int32_t lookingDebounceTime; + float legsYaw; +}; // SgRenderInfo +#pragma pack(pop) + typedef struct renderInfo_s { + using SgType = SgRenderInfo; + + // Legs model, or full model on one piece entities union @@ -239,6 +374,121 @@ typedef struct renderInfo_s vec3_t targetHeadBobAngles;//head bob angles will try to get to targetHeadBobAngles int lookingDebounceTime;//When we can stop using head looking angle behavior float legsYaw;//yaw angle your legs are actually rendering at + + + void sg_export( + SgType& dst) const + { + ::sg_export(legsModelName, dst.legsModelName); + ::sg_export(torsoModelName, dst.torsoModelName); + ::sg_export(headModelName, dst.headModelName); + ::sg_export(headYawRangeLeft, dst.headYawRangeLeft); + ::sg_export(headYawRangeRight, dst.headYawRangeRight); + ::sg_export(headPitchRangeUp, dst.headPitchRangeUp); + ::sg_export(headPitchRangeDown, dst.headPitchRangeDown); + ::sg_export(torsoYawRangeLeft, dst.torsoYawRangeLeft); + ::sg_export(torsoYawRangeRight, dst.torsoYawRangeRight); + ::sg_export(torsoPitchRangeUp, dst.torsoPitchRangeUp); + ::sg_export(torsoPitchRangeDown, dst.torsoPitchRangeDown); + ::sg_export(legsFrame, dst.legsFrame); + ::sg_export(torsoFrame, dst.torsoFrame); + ::sg_export(legsFpsMod, dst.legsFpsMod); + ::sg_export(torsoFpsMod, dst.torsoFpsMod); + ::sg_export(customRGBA, dst.customRGBA); + ::sg_export(boneIndex1, dst.boneIndex1); + ::sg_export(boneIndex2, dst.boneIndex2); + ::sg_export(boneIndex3, dst.boneIndex3); + ::sg_export(boneIndex4, dst.boneIndex4); + ::sg_export(boneOrient, dst.boneOrient); + ::sg_export(boneAngles1, dst.boneAngles1); + ::sg_export(boneAngles2, dst.boneAngles2); + ::sg_export(boneAngles3, dst.boneAngles3); + ::sg_export(boneAngles4, dst.boneAngles4); + ::sg_export(renderFlags, dst.renderFlags); + ::sg_export(muzzlePoint, dst.muzzlePoint); + ::sg_export(muzzleDir, dst.muzzleDir); + ::sg_export(muzzlePointOld, dst.muzzlePointOld); + ::sg_export(muzzleDirOld, dst.muzzleDirOld); + ::sg_export(mPCalcTime, dst.mPCalcTime); + ::sg_export(lockYaw, dst.lockYaw); + ::sg_export(headPoint, dst.headPoint); + ::sg_export(headAngles, dst.headAngles); + ::sg_export(handRPoint, dst.handRPoint); + ::sg_export(handLPoint, dst.handLPoint); + ::sg_export(crotchPoint, dst.crotchPoint); + ::sg_export(footRPoint, dst.footRPoint); + ::sg_export(footLPoint, dst.footLPoint); + ::sg_export(torsoPoint, dst.torsoPoint); + ::sg_export(torsoAngles, dst.torsoAngles); + ::sg_export(eyePoint, dst.eyePoint); + ::sg_export(eyeAngles, dst.eyeAngles); + ::sg_export(lookTarget, dst.lookTarget); + ::sg_export(lookMode, dst.lookMode); + ::sg_export(lookTargetClearTime, dst.lookTargetClearTime); + ::sg_export(lastVoiceVolume, dst.lastVoiceVolume); + ::sg_export(lastHeadAngles, dst.lastHeadAngles); + ::sg_export(headBobAngles, dst.headBobAngles); + ::sg_export(targetHeadBobAngles, dst.targetHeadBobAngles); + ::sg_export(lookingDebounceTime, dst.lookingDebounceTime); + ::sg_export(legsYaw, dst.legsYaw); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.legsModelName, legsModelName); + ::sg_import(src.torsoModelName, torsoModelName); + ::sg_import(src.headModelName, headModelName); + ::sg_import(src.headYawRangeLeft, headYawRangeLeft); + ::sg_import(src.headYawRangeRight, headYawRangeRight); + ::sg_import(src.headPitchRangeUp, headPitchRangeUp); + ::sg_import(src.headPitchRangeDown, headPitchRangeDown); + ::sg_import(src.torsoYawRangeLeft, torsoYawRangeLeft); + ::sg_import(src.torsoYawRangeRight, torsoYawRangeRight); + ::sg_import(src.torsoPitchRangeUp, torsoPitchRangeUp); + ::sg_import(src.torsoPitchRangeDown, torsoPitchRangeDown); + ::sg_import(src.legsFrame, legsFrame); + ::sg_import(src.torsoFrame, torsoFrame); + ::sg_import(src.legsFpsMod, legsFpsMod); + ::sg_import(src.torsoFpsMod, torsoFpsMod); + ::sg_import(src.customRGBA, customRGBA); + ::sg_import(src.boneIndex1, boneIndex1); + ::sg_import(src.boneIndex2, boneIndex2); + ::sg_import(src.boneIndex3, boneIndex3); + ::sg_import(src.boneIndex4, boneIndex4); + ::sg_import(src.boneOrient, boneOrient); + ::sg_import(src.boneAngles1, boneAngles1); + ::sg_import(src.boneAngles2, boneAngles2); + ::sg_import(src.boneAngles3, boneAngles3); + ::sg_import(src.boneAngles4, boneAngles4); + ::sg_import(src.renderFlags, renderFlags); + ::sg_import(src.muzzlePoint, muzzlePoint); + ::sg_import(src.muzzleDir, muzzleDir); + ::sg_import(src.muzzlePointOld, muzzlePointOld); + ::sg_import(src.muzzleDirOld, muzzleDirOld); + ::sg_import(src.mPCalcTime, mPCalcTime); + ::sg_import(src.lockYaw, lockYaw); + ::sg_import(src.headPoint, headPoint); + ::sg_import(src.headAngles, headAngles); + ::sg_import(src.handRPoint, handRPoint); + ::sg_import(src.handLPoint, handLPoint); + ::sg_import(src.crotchPoint, crotchPoint); + ::sg_import(src.footRPoint, footRPoint); + ::sg_import(src.footLPoint, footLPoint); + ::sg_import(src.torsoPoint, torsoPoint); + ::sg_import(src.torsoAngles, torsoAngles); + ::sg_import(src.eyePoint, eyePoint); + ::sg_import(src.eyeAngles, eyeAngles); + ::sg_import(src.lookTarget, lookTarget); + ::sg_import(src.lookMode, lookMode); + ::sg_import(src.lookTargetClearTime, lookTargetClearTime); + ::sg_import(src.lastVoiceVolume, lastVoiceVolume); + ::sg_import(src.lastHeadAngles, lastHeadAngles); + ::sg_import(src.headBobAngles, headBobAngles); + ::sg_import(src.targetHeadBobAngles, targetHeadBobAngles); + ::sg_import(src.lookingDebounceTime, lookingDebounceTime); + ::sg_import(src.legsYaw, legsYaw); + } } renderInfo_t; // Movement information structure @@ -267,7 +517,28 @@ typedef enum { } playerTeamStateState_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgPlayerTeamState +{ +public: + int32_t state; + int32_t captures; + int32_t basedefense; + int32_t carrierdefense; + int32_t flagrecovery; + int32_t fragcarrier; + int32_t assists; + float lasthurtcarrier; + float lastreturnedflag; + float flagsince; + float lastfraggedcarrier; +}; // SgPlayerTeamState +#pragma pack(pop) + typedef struct { + using SgType = SgPlayerTeamState; + + playerTeamStateState_t state; int captures; @@ -281,21 +552,105 @@ typedef struct { float lastreturnedflag; float flagsince; float lastfraggedcarrier; + + + void sg_export( + SgType& dst) const + { + ::sg_export(state, dst.state); + ::sg_export(captures, dst.captures); + ::sg_export(basedefense, dst.basedefense); + ::sg_export(carrierdefense, dst.carrierdefense); + ::sg_export(flagrecovery, dst.flagrecovery); + ::sg_export(fragcarrier, dst.fragcarrier); + ::sg_export(assists, dst.assists); + ::sg_export(lasthurtcarrier, dst.lasthurtcarrier); + ::sg_export(lastreturnedflag, dst.lastreturnedflag); + ::sg_export(flagsince, dst.flagsince); + ::sg_export(lastfraggedcarrier, dst.lastfraggedcarrier); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.state, state); + ::sg_import(src.captures, captures); + ::sg_import(src.basedefense, basedefense); + ::sg_import(src.carrierdefense, carrierdefense); + ::sg_import(src.flagrecovery, flagrecovery); + ::sg_import(src.fragcarrier, fragcarrier); + ::sg_import(src.assists, assists); + ::sg_import(src.lasthurtcarrier, lasthurtcarrier); + ::sg_import(src.lastreturnedflag, lastreturnedflag); + ::sg_import(src.flagsince, flagsince); + ::sg_import(src.lastfraggedcarrier, lastfraggedcarrier); + } } playerTeamState_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgObjectives +{ +public: + int32_t display; + int32_t status; +}; // SgObjectives +#pragma pack(pop) + typedef struct objectives_s { + using SgType = SgObjectives; + + qboolean display; // A displayable objective? int status; // Succeed or fail or pending + + + void sg_export( + SgType& dst) const + { + ::sg_export(display, dst.display); + ::sg_export(status, dst.status); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.display, display); + ::sg_import(src.status, status); + } } objectives_t; // NOTE: This is an arbitrary number greater than our current number of objectives with // some fluff just in case we add more in the future. #define MAX_MISSION_OBJ 100 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgMissionStats +{ +public: + int32_t secretsFound; + int32_t totalSecrets; + int32_t shotsFired; + int32_t hits; + int32_t enemiesSpawned; + int32_t enemiesKilled; + int32_t saberThrownCnt; + int32_t saberBlocksCnt; + int32_t legAttacksCnt; + int32_t armAttacksCnt; + int32_t torsoAttacksCnt; + int32_t otherAttacksCnt; + SgArray forceUsed; + SgArray weaponUsed; +}; // SgMissionStats +#pragma pack(pop) + typedef struct missionStats_s { + using SgType = SgMissionStats; + + int secretsFound; // # of secret areas found int totalSecrets; // # of secret areas that could have been found int shotsFired; // total number of shots fired @@ -310,6 +665,45 @@ typedef struct missionStats_s int otherAttacksCnt; // # of times anything else on a monster was hit with saber int forceUsed[NUM_FORCE_POWERS]; // # of times each force power was used int weaponUsed[WP_NUM_WEAPONS]; // # of times each weapon was used + + + void sg_export( + SgType& dst) const + { + ::sg_export(secretsFound, dst.secretsFound); + ::sg_export(totalSecrets, dst.totalSecrets); + ::sg_export(shotsFired, dst.shotsFired); + ::sg_export(hits, dst.hits); + ::sg_export(enemiesSpawned, dst.enemiesSpawned); + ::sg_export(enemiesKilled, dst.enemiesKilled); + ::sg_export(saberThrownCnt, dst.saberThrownCnt); + ::sg_export(saberBlocksCnt, dst.saberBlocksCnt); + ::sg_export(legAttacksCnt, dst.legAttacksCnt); + ::sg_export(armAttacksCnt, dst.armAttacksCnt); + ::sg_export(torsoAttacksCnt, dst.torsoAttacksCnt); + ::sg_export(otherAttacksCnt, dst.otherAttacksCnt); + ::sg_export(forceUsed, dst.forceUsed); + ::sg_export(weaponUsed, dst.weaponUsed); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.secretsFound, secretsFound); + ::sg_import(src.totalSecrets, totalSecrets); + ::sg_import(src.shotsFired, shotsFired); + ::sg_import(src.hits, hits); + ::sg_import(src.enemiesSpawned, enemiesSpawned); + ::sg_import(src.enemiesKilled, enemiesKilled); + ::sg_import(src.saberThrownCnt, saberThrownCnt); + ::sg_import(src.saberBlocksCnt, saberBlocksCnt); + ::sg_import(src.legAttacksCnt, legAttacksCnt); + ::sg_import(src.armAttacksCnt, armAttacksCnt); + ::sg_import(src.torsoAttacksCnt, torsoAttacksCnt); + ::sg_import(src.otherAttacksCnt, otherAttacksCnt); + ::sg_import(src.forceUsed, forceUsed); + ::sg_import(src.weaponUsed, weaponUsed); + } } missionStats_t; // the auto following clients don't follow a specific client @@ -323,17 +717,67 @@ typedef struct missionStats_s // MUST be dealt with in G_InitSessionData() / G_ReadSessionData() / G_WriteSessionData() // // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgClientSession +{ +public: + int32_t missionObjectivesShown; + int32_t sessionTeam; + SgArray mission_objectives; + SgMissionStats missionStats; +}; // SgClientSession +#pragma pack(pop) + typedef struct { + using SgType = SgClientSession; + + int missionObjectivesShown; // Number of times mission objectives have been updated team_t sessionTeam; objectives_t mission_objectives[MAX_MISSION_OBJ]; missionStats_t missionStats; // Various totals while on a mission + + + void sg_export( + SgType& dst) const + { + ::sg_export(missionObjectivesShown, dst.missionObjectivesShown); + ::sg_export(sessionTeam, dst.sessionTeam); + ::sg_export(mission_objectives, dst.mission_objectives); + ::sg_export(missionStats, dst.missionStats); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.missionObjectivesShown, missionObjectivesShown); + ::sg_import(src.sessionTeam, sessionTeam); + ::sg_import(src.mission_objectives, mission_objectives); + ::sg_import(src.missionStats, missionStats); + } } clientSession_t; // client data that stays across multiple respawns, but is cleared // on each level change or team change at ClientBegin() // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgClientPersistant +{ +public: + int32_t connected; + SgUserCmd lastCommand; + SgArray netname; + int32_t maxHealth; + int32_t enterTime; + SgArray cmd_angles; + SgPlayerTeamState teamState; +}; // SgClientPersistant +#pragma pack(pop) + typedef struct { + using SgType = SgClientPersistant; + + clientConnected_t connected; usercmd_t lastCommand; char netname[34]; @@ -342,6 +786,31 @@ typedef struct { short cmd_angles[3]; // angles sent over in the last command playerTeamState_t teamState; // status in teamplay games + + + void sg_export( + SgType& dst) const + { + ::sg_export(connected, dst.connected); + ::sg_export(lastCommand, dst.lastCommand); + ::sg_export(netname, dst.netname); + ::sg_export(maxHealth, dst.maxHealth); + ::sg_export(enterTime, dst.enterTime); + ::sg_export(cmd_angles, dst.cmd_angles); + ::sg_export(teamState, dst.teamState); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.connected, connected); + ::sg_import(src.lastCommand, lastCommand); + ::sg_import(src.netname, netname); + ::sg_import(src.maxHealth, maxHealth); + ::sg_import(src.enterTime, enterTime); + ::sg_import(src.cmd_angles, cmd_angles); + ::sg_import(src.teamState, teamState); + } } clientPersistant_t; typedef enum { @@ -379,7 +848,77 @@ typedef enum //# movetype_e // this structure is cleared on each ClientSpawn(), // except for 'client->pers' and 'client->sess' +#pragma pack(push, 4) +class SgGClient +{ +public: + SgPlayerState ps; + SgClientPersistant pers; + SgClientSession sess; + int32_t lastCmdTime; + SgUserCmd usercmd; + int32_t buttons; + int32_t oldbuttons; + int32_t latched_buttons; + int32_t damage_armor; + int32_t damage_blood; + SgVec3 damage_from; + int8_t damage_fromWorld; + int8_t noclip; + int8_t forced_forwardmove; + int8_t forced_rightmove; + int32_t respawnTime; + int32_t idleTime; + int32_t airOutTime; + int32_t timeResidual; + float facial_blink; + float facial_timer; + int32_t facial_anim; + SgClientInfo clientInfo; + int32_t moveType; + int32_t jetPackTime; + int32_t fireDelay; + int32_t breathPuffTime; + int32_t playerTeam; + int32_t enemyTeam; + int32_t leader; + int32_t NPC_class; + float hiddenDist; + SgVec3 hiddenDir; + SgRenderInfo renderInfo; + int8_t dismembered; + int8_t dismemberProbLegs; + int8_t dismemberProbHead; + int8_t dismemberProbArms; + int8_t dismemberProbHands; + int8_t dismemberProbWaist; + int32_t standheight; + int32_t crouchheight; + int32_t poisonDamage; + int32_t poisonTime; + int32_t slopeRecalcTime; + SgVec3 pushVec; + int32_t pushVecTime; + int32_t noRagTime; + int32_t isRagging; + int32_t overridingBones; + SgVec3 ragLastOrigin; + int32_t ragLastOriginTime; + int32_t pushEffectFadeTime; + SgVec3 pushEffectOrigin; + int32_t rocketLockIndex; + float rocketLastValidTime; + float rocketLockTime; + float rocketTargetTime; + int32_t inSpaceSuffocation; + int32_t inSpaceIndex; +}; // SgGClient +#pragma pack(pop) + struct gclient_s { + using SgType = SgGClient; + + // ps MUST be the first element, because the server expects it playerState_t ps; // communicated by server to clients @@ -480,13 +1019,169 @@ struct gclient_s { //for trigger_space brushes int inSpaceSuffocation; int inSpaceIndex; + + + void sg_export( + SgType& dst) const + { + ::sg_export(ps, dst.ps); + ::sg_export(pers, dst.pers); + ::sg_export(sess, dst.sess); + ::sg_export(lastCmdTime, dst.lastCmdTime); + ::sg_export(usercmd, dst.usercmd); + ::sg_export(buttons, dst.buttons); + ::sg_export(oldbuttons, dst.oldbuttons); + ::sg_export(latched_buttons, dst.latched_buttons); + ::sg_export(damage_armor, dst.damage_armor); + ::sg_export(damage_blood, dst.damage_blood); + ::sg_export(damage_from, dst.damage_from); + ::sg_export(damage_fromWorld, dst.damage_fromWorld); + ::sg_export(noclip, dst.noclip); + ::sg_export(forced_forwardmove, dst.forced_forwardmove); + ::sg_export(forced_rightmove, dst.forced_rightmove); + ::sg_export(respawnTime, dst.respawnTime); + ::sg_export(idleTime, dst.idleTime); + ::sg_export(airOutTime, dst.airOutTime); + ::sg_export(timeResidual, dst.timeResidual); + ::sg_export(facial_blink, dst.facial_blink); + ::sg_export(facial_timer, dst.facial_timer); + ::sg_export(facial_anim, dst.facial_anim); + ::sg_export(clientInfo, dst.clientInfo); + ::sg_export(moveType, dst.moveType); + ::sg_export(jetPackTime, dst.jetPackTime); + ::sg_export(fireDelay, dst.fireDelay); + ::sg_export(breathPuffTime, dst.breathPuffTime); + ::sg_export(playerTeam, dst.playerTeam); + ::sg_export(enemyTeam, dst.enemyTeam); + ::sg_export(leader, dst.leader); + ::sg_export(NPC_class, dst.NPC_class); + ::sg_export(hiddenDist, dst.hiddenDist); + ::sg_export(hiddenDir, dst.hiddenDir); + ::sg_export(renderInfo, dst.renderInfo); + ::sg_export(dismembered, dst.dismembered); + ::sg_export(dismemberProbLegs, dst.dismemberProbLegs); + ::sg_export(dismemberProbHead, dst.dismemberProbHead); + ::sg_export(dismemberProbArms, dst.dismemberProbArms); + ::sg_export(dismemberProbHands, dst.dismemberProbHands); + ::sg_export(dismemberProbWaist, dst.dismemberProbWaist); + ::sg_export(standheight, dst.standheight); + ::sg_export(crouchheight, dst.crouchheight); + ::sg_export(poisonDamage, dst.poisonDamage); + ::sg_export(poisonTime, dst.poisonTime); + ::sg_export(slopeRecalcTime, dst.slopeRecalcTime); + ::sg_export(pushVec, dst.pushVec); + ::sg_export(pushVecTime, dst.pushVecTime); + ::sg_export(noRagTime, dst.noRagTime); + ::sg_export(isRagging, dst.isRagging); + ::sg_export(overridingBones, dst.overridingBones); + ::sg_export(ragLastOrigin, dst.ragLastOrigin); + ::sg_export(ragLastOriginTime, dst.ragLastOriginTime); + ::sg_export(pushEffectFadeTime, dst.pushEffectFadeTime); + ::sg_export(pushEffectOrigin, dst.pushEffectOrigin); + ::sg_export(rocketLockIndex, dst.rocketLockIndex); + ::sg_export(rocketLastValidTime, dst.rocketLastValidTime); + ::sg_export(rocketLockTime, dst.rocketLockTime); + ::sg_export(rocketTargetTime, dst.rocketTargetTime); + ::sg_export(inSpaceSuffocation, dst.inSpaceSuffocation); + ::sg_export(inSpaceIndex, dst.inSpaceIndex); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.ps, ps); + ::sg_import(src.pers, pers); + ::sg_import(src.sess, sess); + ::sg_import(src.lastCmdTime, lastCmdTime); + ::sg_import(src.usercmd, usercmd); + ::sg_import(src.buttons, buttons); + ::sg_import(src.oldbuttons, oldbuttons); + ::sg_import(src.latched_buttons, latched_buttons); + ::sg_import(src.damage_armor, damage_armor); + ::sg_import(src.damage_blood, damage_blood); + ::sg_import(src.damage_from, damage_from); + ::sg_import(src.damage_fromWorld, damage_fromWorld); + ::sg_import(src.noclip, noclip); + ::sg_import(src.forced_forwardmove, forced_forwardmove); + ::sg_import(src.forced_rightmove, forced_rightmove); + ::sg_import(src.respawnTime, respawnTime); + ::sg_import(src.idleTime, idleTime); + ::sg_import(src.airOutTime, airOutTime); + ::sg_import(src.timeResidual, timeResidual); + ::sg_import(src.facial_blink, facial_blink); + ::sg_import(src.facial_timer, facial_timer); + ::sg_import(src.facial_anim, facial_anim); + ::sg_import(src.clientInfo, clientInfo); + ::sg_import(src.moveType, moveType); + ::sg_import(src.jetPackTime, jetPackTime); + ::sg_import(src.fireDelay, fireDelay); + ::sg_import(src.breathPuffTime, breathPuffTime); + ::sg_import(src.playerTeam, playerTeam); + ::sg_import(src.enemyTeam, enemyTeam); + ::sg_import(src.leader, leader); + ::sg_import(src.NPC_class, NPC_class); + ::sg_import(src.hiddenDist, hiddenDist); + ::sg_import(src.hiddenDir, hiddenDir); + ::sg_import(src.renderInfo, renderInfo); + ::sg_import(src.dismembered, dismembered); + ::sg_import(src.dismemberProbLegs, dismemberProbLegs); + ::sg_import(src.dismemberProbHead, dismemberProbHead); + ::sg_import(src.dismemberProbArms, dismemberProbArms); + ::sg_import(src.dismemberProbHands, dismemberProbHands); + ::sg_import(src.dismemberProbWaist, dismemberProbWaist); + ::sg_import(src.standheight, standheight); + ::sg_import(src.crouchheight, crouchheight); + ::sg_import(src.poisonDamage, poisonDamage); + ::sg_import(src.poisonTime, poisonTime); + ::sg_import(src.slopeRecalcTime, slopeRecalcTime); + ::sg_import(src.pushVec, pushVec); + ::sg_import(src.pushVecTime, pushVecTime); + ::sg_import(src.noRagTime, noRagTime); + ::sg_import(src.isRagging, isRagging); + ::sg_import(src.overridingBones, overridingBones); + ::sg_import(src.ragLastOrigin, ragLastOrigin); + ::sg_import(src.ragLastOriginTime, ragLastOriginTime); + ::sg_import(src.pushEffectFadeTime, pushEffectFadeTime); + ::sg_import(src.pushEffectOrigin, pushEffectOrigin); + ::sg_import(src.rocketLockIndex, rocketLockIndex); + ::sg_import(src.rocketLastValidTime, rocketLastValidTime); + ::sg_import(src.rocketLockTime, rocketLockTime); + ::sg_import(src.rocketTargetTime, rocketTargetTime); + ::sg_import(src.inSpaceSuffocation, inSpaceSuffocation); + ::sg_import(src.inSpaceIndex, inSpaceIndex); + } }; #define MAX_PARMS 16 #define MAX_PARM_STRING_LENGTH MAX_QPATH//was 16, had to lengthen it so they could take a valid file path + +#pragma pack(push, 4) +class SgParms +{ +public: + SgArray2d parm; +}; // SgParms +#pragma pack(pop) + typedef struct { + using SgType = SgParms; + + char parm[MAX_PARMS][MAX_PARM_STRING_LENGTH]; + + + void sg_export( + SgType& dst) const + { + ::sg_export(parm, dst.parm); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.parm, parm); + } } parms_t; #ifdef GAME_INCLUDE @@ -506,7 +1201,201 @@ typedef struct typedef struct centity_s centity_t; // !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!!!!! +#pragma pack(push, 4) +class SgGEntity +{ +public: + SgEntityState s; + int32_t client; + int32_t inuse; + int32_t linked; + int32_t svFlags; + int32_t bmodel; + SgVec3 mins; + SgVec3 maxs; + int32_t contents; + SgVec3 absmin; + SgVec3 absmax; + SgVec3 currentOrigin; + SgVec3 currentAngles; + int32_t owner; + SgCGhoul2InfoV ghoul2; + SgVec3 modelScale; + int32_t classname; + int32_t spawnflags; + int32_t flags; + int32_t model; + int32_t model2; + int32_t freetime; + int32_t eventTime; + int32_t freeAfterEvent; + float physicsBounce; + int32_t clipmask; + float speed; + float resultspeed; + int32_t lastMoveTime; + SgVec3 movedir; + SgVec3 lastOrigin; + SgVec3 lastAngles; + float mass; + int32_t lastImpact; + int32_t watertype; + int32_t waterlevel; + int16_t wupdate; + int16_t prev_waterlevel; + float angle; + int32_t target; + int32_t target2; + int32_t target3; + int32_t target4; + int32_t targetJump; + int32_t targetname; + int32_t team; + int32_t roff; + int32_t roff_ctr; + int32_t next_roff_time; + int32_t fx_time; + int32_t nextthink; + int32_t e_ThinkFunc; + int32_t e_clThinkFunc; + int32_t e_ReachedFunc; + int32_t e_BlockedFunc; + int32_t e_TouchFunc; + int32_t e_UseFunc; + int32_t e_PainFunc; + int32_t e_DieFunc; + int32_t health; + int32_t max_health; + int32_t takedamage; + int32_t material; + int32_t damage; + int32_t dflags; + int32_t splashDamage; + int32_t splashRadius; + int32_t methodOfDeath; + int32_t splashMethodOfDeath; + SgArray locationDamage; + int32_t chain; + int32_t enemy; + int32_t activator; + int32_t teamchain; + int32_t teammaster; + int32_t lastEnemy; + float wait; + float random; + int32_t delay; + int32_t alt_fire; + int32_t count; + int32_t bounceCount; + int32_t fly_sound_debounce_time; + int32_t painDebounceTime; + int32_t disconnectDebounceTime; + int32_t attackDebounceTime; + int32_t pushDebounceTime; + int32_t aimDebounceTime; + int32_t useDebounceTime; + int32_t trigger_formation; + int32_t spawnContents; + int32_t waypoint; + int32_t wayedge; + int32_t lastWaypoint; + int32_t lastInAirTime; + int32_t noWaypointTime; + int32_t combatPoint; + SgVec3 followPos; + int32_t followPosRecalcTime; + int32_t followPosWaypoint; + int32_t loopAnim; + int32_t startFrame; + int32_t endFrame; + int32_t m_iIcarusID; + SgArray taskID; + int32_t parms; + SgArray behaviorSet; + int32_t script_targetname; + int32_t delayScriptTime; + int32_t soundSet; + int32_t setTime; + int32_t cameraGroup; + int32_t noDamageTeam; + int16_t playerModel; + SgArray weaponModel; + int16_t handRBolt; + int16_t handLBolt; + int16_t headBolt; + int16_t cervicalBolt; + int16_t chestBolt; + int16_t gutBolt; + int16_t torsoBolt; + int16_t crotchBolt; + int16_t motionBolt; + int16_t kneeLBolt; + int16_t kneeRBolt; + int16_t elbowLBolt; + int16_t elbowRBolt; + int16_t footLBolt; + int16_t footRBolt; + int16_t faceBone; + int16_t craniumBone; + int16_t cervicalBone; + int16_t thoracicBone; + int16_t upperLumbarBone; + int16_t lowerLumbarBone; + int16_t hipsBone; + int16_t motionBone; + int16_t rootBone; + int16_t footLBone; + int16_t footRBone; + int16_t humerusRBone; + int16_t genericBone1; + int16_t genericBone2; + int16_t genericBone3; + int16_t genericBolt1; + int16_t genericBolt2; + int16_t genericBolt3; + int16_t genericBolt4; + int16_t genericBolt5; + int32_t cinematicModel; + int32_t m_pVehicle; + int32_t NPC; + int32_t ownername; + int32_t cantHitEnemyCounter; + int32_t NPC_type; + int32_t NPC_targetname; + int32_t NPC_target; + int32_t moverState; + int32_t soundPos1; + int32_t sound1to2; + int32_t sound2to1; + int32_t soundPos2; + int32_t soundLoop; + int32_t nextTrain; + int32_t prevTrain; + SgVec3 pos1; + SgVec3 pos2; + SgVec3 pos3; + int32_t sounds; + int32_t closetarget; + int32_t opentarget; + int32_t paintarget; + int32_t lockCount; + float radius; + int32_t wpIndex; + int32_t noise_index; + SgVec4 startRGBA; + SgVec4 finalRGBA; + int32_t item; + int32_t message; + float lightLevel; + int32_t forcePushTime; + int32_t forcePuller; +}; // SgGEntity +#pragma pack(pop) + struct gentity_s { + using SgType = SgGEntity; + + entityState_t s; // communicated by server to clients struct gclient_s *client; // NULL if not a player (unless it's NPC ( if (this->NPC != NULL) ) ... -slc) qboolean inuse; @@ -817,6 +1706,385 @@ Ghoul2 Insert End //Force effects int forcePushTime; int forcePuller; //who force-pulled me (so we don't damage them if we hit them) + + + void sg_export( + SgType& dst) const + { + ::sg_export(s, dst.s); + ::sg_export(client, dst.client); + ::sg_export(inuse, dst.inuse); + ::sg_export(linked, dst.linked); + ::sg_export(svFlags, dst.svFlags); + ::sg_export(bmodel, dst.bmodel); + ::sg_export(mins, dst.mins); + ::sg_export(maxs, dst.maxs); + ::sg_export(contents, dst.contents); + ::sg_export(absmin, dst.absmin); + ::sg_export(absmax, dst.absmax); + ::sg_export(currentOrigin, dst.currentOrigin); + ::sg_export(currentAngles, dst.currentAngles); + ::sg_export(owner, dst.owner); + ::sg_export(ghoul2, dst.ghoul2); + ::sg_export(modelScale, dst.modelScale); + ::sg_export(classname, dst.classname); + ::sg_export(spawnflags, dst.spawnflags); + ::sg_export(flags, dst.flags); + ::sg_export(model, dst.model); + ::sg_export(model2, dst.model2); + ::sg_export(freetime, dst.freetime); + ::sg_export(eventTime, dst.eventTime); + ::sg_export(freeAfterEvent, dst.freeAfterEvent); + ::sg_export(physicsBounce, dst.physicsBounce); + ::sg_export(clipmask, dst.clipmask); + ::sg_export(speed, dst.speed); + ::sg_export(resultspeed, dst.resultspeed); + ::sg_export(lastMoveTime, dst.lastMoveTime); + ::sg_export(movedir, dst.movedir); + ::sg_export(lastOrigin, dst.lastOrigin); + ::sg_export(lastAngles, dst.lastAngles); + ::sg_export(mass, dst.mass); + ::sg_export(lastImpact, dst.lastImpact); + ::sg_export(watertype, dst.watertype); + ::sg_export(waterlevel, dst.waterlevel); + ::sg_export(wupdate, dst.wupdate); + ::sg_export(prev_waterlevel, dst.prev_waterlevel); + ::sg_export(angle, dst.angle); + ::sg_export(target, dst.target); + ::sg_export(target2, dst.target2); + ::sg_export(target3, dst.target3); + ::sg_export(target4, dst.target4); + ::sg_export(targetJump, dst.targetJump); + ::sg_export(targetname, dst.targetname); + ::sg_export(team, dst.team); + ::sg_export(roff, dst.roff); + ::sg_export(roff_ctr, dst.roff_ctr); + ::sg_export(next_roff_time, dst.next_roff_time); + ::sg_export(fx_time, dst.fx_time); + ::sg_export(nextthink, dst.nextthink); + ::sg_export(e_ThinkFunc, dst.e_ThinkFunc); + ::sg_export(e_clThinkFunc, dst.e_clThinkFunc); + ::sg_export(e_ReachedFunc, dst.e_ReachedFunc); + ::sg_export(e_BlockedFunc, dst.e_BlockedFunc); + ::sg_export(e_TouchFunc, dst.e_TouchFunc); + ::sg_export(e_UseFunc, dst.e_UseFunc); + ::sg_export(e_PainFunc, dst.e_PainFunc); + ::sg_export(e_DieFunc, dst.e_DieFunc); + ::sg_export(health, dst.health); + ::sg_export(max_health, dst.max_health); + ::sg_export(takedamage, dst.takedamage); + ::sg_export(material, dst.material); + ::sg_export(damage, dst.damage); + ::sg_export(dflags, dst.dflags); + ::sg_export(splashDamage, dst.splashDamage); + ::sg_export(splashRadius, dst.splashRadius); + ::sg_export(methodOfDeath, dst.methodOfDeath); + ::sg_export(splashMethodOfDeath, dst.splashMethodOfDeath); + ::sg_export(locationDamage, dst.locationDamage); + ::sg_export(chain, dst.chain); + ::sg_export(enemy, dst.enemy); + ::sg_export(activator, dst.activator); + ::sg_export(teamchain, dst.teamchain); + ::sg_export(teammaster, dst.teammaster); + ::sg_export(lastEnemy, dst.lastEnemy); + ::sg_export(wait, dst.wait); + ::sg_export(random, dst.random); + ::sg_export(delay, dst.delay); + ::sg_export(alt_fire, dst.alt_fire); + ::sg_export(count, dst.count); + ::sg_export(bounceCount, dst.bounceCount); + ::sg_export(fly_sound_debounce_time, dst.fly_sound_debounce_time); + ::sg_export(painDebounceTime, dst.painDebounceTime); + ::sg_export(disconnectDebounceTime, dst.disconnectDebounceTime); + ::sg_export(attackDebounceTime, dst.attackDebounceTime); + ::sg_export(pushDebounceTime, dst.pushDebounceTime); + ::sg_export(aimDebounceTime, dst.aimDebounceTime); + ::sg_export(useDebounceTime, dst.useDebounceTime); + ::sg_export(trigger_formation, dst.trigger_formation); + ::sg_export(spawnContents, dst.spawnContents); + ::sg_export(waypoint, dst.waypoint); + ::sg_export(wayedge, dst.wayedge); + ::sg_export(lastWaypoint, dst.lastWaypoint); + ::sg_export(lastInAirTime, dst.lastInAirTime); + ::sg_export(noWaypointTime, dst.noWaypointTime); + ::sg_export(combatPoint, dst.combatPoint); + ::sg_export(followPos, dst.followPos); + ::sg_export(followPosRecalcTime, dst.followPosRecalcTime); + ::sg_export(followPosWaypoint, dst.followPosWaypoint); + ::sg_export(loopAnim, dst.loopAnim); + ::sg_export(startFrame, dst.startFrame); + ::sg_export(endFrame, dst.endFrame); + ::sg_export(m_iIcarusID, dst.m_iIcarusID); + ::sg_export(taskID, dst.taskID); + ::sg_export(parms, dst.parms); + ::sg_export(behaviorSet, dst.behaviorSet); + ::sg_export(script_targetname, dst.script_targetname); + ::sg_export(delayScriptTime, dst.delayScriptTime); + ::sg_export(soundSet, dst.soundSet); + ::sg_export(setTime, dst.setTime); + ::sg_export(cameraGroup, dst.cameraGroup); + ::sg_export(noDamageTeam, dst.noDamageTeam); + ::sg_export(playerModel, dst.playerModel); + ::sg_export(weaponModel, dst.weaponModel); + ::sg_export(handRBolt, dst.handRBolt); + ::sg_export(handLBolt, dst.handLBolt); + ::sg_export(headBolt, dst.headBolt); + ::sg_export(cervicalBolt, dst.cervicalBolt); + ::sg_export(chestBolt, dst.chestBolt); + ::sg_export(gutBolt, dst.gutBolt); + ::sg_export(torsoBolt, dst.torsoBolt); + ::sg_export(crotchBolt, dst.crotchBolt); + ::sg_export(motionBolt, dst.motionBolt); + ::sg_export(kneeLBolt, dst.kneeLBolt); + ::sg_export(kneeRBolt, dst.kneeRBolt); + ::sg_export(elbowLBolt, dst.elbowLBolt); + ::sg_export(elbowRBolt, dst.elbowRBolt); + ::sg_export(footLBolt, dst.footLBolt); + ::sg_export(footRBolt, dst.footRBolt); + ::sg_export(faceBone, dst.faceBone); + ::sg_export(craniumBone, dst.craniumBone); + ::sg_export(cervicalBone, dst.cervicalBone); + ::sg_export(thoracicBone, dst.thoracicBone); + ::sg_export(upperLumbarBone, dst.upperLumbarBone); + ::sg_export(lowerLumbarBone, dst.lowerLumbarBone); + ::sg_export(hipsBone, dst.hipsBone); + ::sg_export(motionBone, dst.motionBone); + ::sg_export(rootBone, dst.rootBone); + ::sg_export(footLBone, dst.footLBone); + ::sg_export(footRBone, dst.footRBone); + ::sg_export(humerusRBone, dst.humerusRBone); + ::sg_export(genericBone1, dst.genericBone1); + ::sg_export(genericBone2, dst.genericBone2); + ::sg_export(genericBone3, dst.genericBone3); + ::sg_export(genericBolt1, dst.genericBolt1); + ::sg_export(genericBolt2, dst.genericBolt2); + ::sg_export(genericBolt3, dst.genericBolt3); + ::sg_export(genericBolt4, dst.genericBolt4); + ::sg_export(genericBolt5, dst.genericBolt5); + ::sg_export(cinematicModel, dst.cinematicModel); + ::sg_export(m_pVehicle, dst.m_pVehicle); + ::sg_export(NPC, dst.NPC); + ::sg_export(ownername, dst.ownername); + ::sg_export(cantHitEnemyCounter, dst.cantHitEnemyCounter); + ::sg_export(NPC_type, dst.NPC_type); + ::sg_export(NPC_targetname, dst.NPC_targetname); + ::sg_export(NPC_target, dst.NPC_target); + ::sg_export(moverState, dst.moverState); + ::sg_export(soundPos1, dst.soundPos1); + ::sg_export(sound1to2, dst.sound1to2); + ::sg_export(sound2to1, dst.sound2to1); + ::sg_export(soundPos2, dst.soundPos2); + ::sg_export(soundLoop, dst.soundLoop); + ::sg_export(nextTrain, dst.nextTrain); + ::sg_export(prevTrain, dst.prevTrain); + ::sg_export(pos1, dst.pos1); + ::sg_export(pos2, dst.pos2); + ::sg_export(pos3, dst.pos3); + ::sg_export(sounds, dst.sounds); + ::sg_export(closetarget, dst.closetarget); + ::sg_export(opentarget, dst.opentarget); + ::sg_export(paintarget, dst.paintarget); + ::sg_export(lockCount, dst.lockCount); + ::sg_export(radius, dst.radius); + ::sg_export(wpIndex, dst.wpIndex); + ::sg_export(noise_index, dst.noise_index); + ::sg_export(startRGBA, dst.startRGBA); + ::sg_export(finalRGBA, dst.finalRGBA); + ::sg_export(item, dst.item); + ::sg_export(message, dst.message); + ::sg_export(lightLevel, dst.lightLevel); + ::sg_export(forcePushTime, dst.forcePushTime); + ::sg_export(forcePuller, dst.forcePuller); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.s, s); + ::sg_import(src.client, client); + ::sg_import(src.inuse, inuse); + ::sg_import(src.linked, linked); + ::sg_import(src.svFlags, svFlags); + ::sg_import(src.bmodel, bmodel); + ::sg_import(src.mins, mins); + ::sg_import(src.maxs, maxs); + ::sg_import(src.contents, contents); + ::sg_import(src.absmin, absmin); + ::sg_import(src.absmax, absmax); + ::sg_import(src.currentOrigin, currentOrigin); + ::sg_import(src.currentAngles, currentAngles); + ::sg_import(src.owner, owner); + ::sg_import(src.ghoul2, ghoul2); + ::sg_import(src.modelScale, modelScale); + ::sg_import(src.classname, classname); + ::sg_import(src.spawnflags, spawnflags); + ::sg_import(src.flags, flags); + ::sg_import(src.model, model); + ::sg_import(src.model2, model2); + ::sg_import(src.freetime, freetime); + ::sg_import(src.eventTime, eventTime); + ::sg_import(src.freeAfterEvent, freeAfterEvent); + ::sg_import(src.physicsBounce, physicsBounce); + ::sg_import(src.clipmask, clipmask); + ::sg_import(src.speed, speed); + ::sg_import(src.resultspeed, resultspeed); + ::sg_import(src.lastMoveTime, lastMoveTime); + ::sg_import(src.movedir, movedir); + ::sg_import(src.lastOrigin, lastOrigin); + ::sg_import(src.lastAngles, lastAngles); + ::sg_import(src.mass, mass); + ::sg_import(src.lastImpact, lastImpact); + ::sg_import(src.watertype, watertype); + ::sg_import(src.waterlevel, waterlevel); + ::sg_import(src.wupdate, wupdate); + ::sg_import(src.prev_waterlevel, prev_waterlevel); + ::sg_import(src.angle, angle); + ::sg_import(src.target, target); + ::sg_import(src.target2, target2); + ::sg_import(src.target3, target3); + ::sg_import(src.target4, target4); + ::sg_import(src.targetJump, targetJump); + ::sg_import(src.targetname, targetname); + ::sg_import(src.team, team); + ::sg_import(src.roff, roff); + ::sg_import(src.roff_ctr, roff_ctr); + ::sg_import(src.next_roff_time, next_roff_time); + ::sg_import(src.fx_time, fx_time); + ::sg_import(src.nextthink, nextthink); + ::sg_import(src.e_ThinkFunc, e_ThinkFunc); + ::sg_import(src.e_clThinkFunc, e_clThinkFunc); + ::sg_import(src.e_ReachedFunc, e_ReachedFunc); + ::sg_import(src.e_BlockedFunc, e_BlockedFunc); + ::sg_import(src.e_TouchFunc, e_TouchFunc); + ::sg_import(src.e_UseFunc, e_UseFunc); + ::sg_import(src.e_PainFunc, e_PainFunc); + ::sg_import(src.e_DieFunc, e_DieFunc); + ::sg_import(src.health, health); + ::sg_import(src.max_health, max_health); + ::sg_import(src.takedamage, takedamage); + ::sg_import(src.material, material); + ::sg_import(src.damage, damage); + ::sg_import(src.dflags, dflags); + ::sg_import(src.splashDamage, splashDamage); + ::sg_import(src.splashRadius, splashRadius); + ::sg_import(src.methodOfDeath, methodOfDeath); + ::sg_import(src.splashMethodOfDeath, splashMethodOfDeath); + ::sg_import(src.locationDamage, locationDamage); + ::sg_import(src.chain, chain); + ::sg_import(src.enemy, enemy); + ::sg_import(src.activator, activator); + ::sg_import(src.teamchain, teamchain); + ::sg_import(src.teammaster, teammaster); + ::sg_import(src.lastEnemy, lastEnemy); + ::sg_import(src.wait, wait); + ::sg_import(src.random, random); + ::sg_import(src.delay, delay); + ::sg_import(src.alt_fire, alt_fire); + ::sg_import(src.count, count); + ::sg_import(src.bounceCount, bounceCount); + ::sg_import(src.fly_sound_debounce_time, fly_sound_debounce_time); + ::sg_import(src.painDebounceTime, painDebounceTime); + ::sg_import(src.disconnectDebounceTime, disconnectDebounceTime); + ::sg_import(src.attackDebounceTime, attackDebounceTime); + ::sg_import(src.pushDebounceTime, pushDebounceTime); + ::sg_import(src.aimDebounceTime, aimDebounceTime); + ::sg_import(src.useDebounceTime, useDebounceTime); + ::sg_import(src.trigger_formation, trigger_formation); + ::sg_import(src.spawnContents, spawnContents); + ::sg_import(src.waypoint, waypoint); + ::sg_import(src.wayedge, wayedge); + ::sg_import(src.lastWaypoint, lastWaypoint); + ::sg_import(src.lastInAirTime, lastInAirTime); + ::sg_import(src.noWaypointTime, noWaypointTime); + ::sg_import(src.combatPoint, combatPoint); + ::sg_import(src.followPos, followPos); + ::sg_import(src.followPosRecalcTime, followPosRecalcTime); + ::sg_import(src.followPosWaypoint, followPosWaypoint); + ::sg_import(src.loopAnim, loopAnim); + ::sg_import(src.startFrame, startFrame); + ::sg_import(src.endFrame, endFrame); + ::sg_import(src.m_iIcarusID, m_iIcarusID); + ::sg_import(src.taskID, taskID); + ::sg_import(src.parms, parms); + ::sg_import(src.behaviorSet, behaviorSet); + ::sg_import(src.script_targetname, script_targetname); + ::sg_import(src.delayScriptTime, delayScriptTime); + ::sg_import(src.soundSet, soundSet); + ::sg_import(src.setTime, setTime); + ::sg_import(src.cameraGroup, cameraGroup); + ::sg_import(src.noDamageTeam, noDamageTeam); + ::sg_import(src.playerModel, playerModel); + ::sg_import(src.weaponModel, weaponModel); + ::sg_import(src.handRBolt, handRBolt); + ::sg_import(src.handLBolt, handLBolt); + ::sg_import(src.headBolt, headBolt); + ::sg_import(src.cervicalBolt, cervicalBolt); + ::sg_import(src.chestBolt, chestBolt); + ::sg_import(src.gutBolt, gutBolt); + ::sg_import(src.torsoBolt, torsoBolt); + ::sg_import(src.crotchBolt, crotchBolt); + ::sg_import(src.motionBolt, motionBolt); + ::sg_import(src.kneeLBolt, kneeLBolt); + ::sg_import(src.kneeRBolt, kneeRBolt); + ::sg_import(src.elbowLBolt, elbowLBolt); + ::sg_import(src.elbowRBolt, elbowRBolt); + ::sg_import(src.footLBolt, footLBolt); + ::sg_import(src.footRBolt, footRBolt); + ::sg_import(src.faceBone, faceBone); + ::sg_import(src.craniumBone, craniumBone); + ::sg_import(src.cervicalBone, cervicalBone); + ::sg_import(src.thoracicBone, thoracicBone); + ::sg_import(src.upperLumbarBone, upperLumbarBone); + ::sg_import(src.lowerLumbarBone, lowerLumbarBone); + ::sg_import(src.hipsBone, hipsBone); + ::sg_import(src.motionBone, motionBone); + ::sg_import(src.rootBone, rootBone); + ::sg_import(src.footLBone, footLBone); + ::sg_import(src.footRBone, footRBone); + ::sg_import(src.humerusRBone, humerusRBone); + ::sg_import(src.genericBone1, genericBone1); + ::sg_import(src.genericBone2, genericBone2); + ::sg_import(src.genericBone3, genericBone3); + ::sg_import(src.genericBolt1, genericBolt1); + ::sg_import(src.genericBolt2, genericBolt2); + ::sg_import(src.genericBolt3, genericBolt3); + ::sg_import(src.genericBolt4, genericBolt4); + ::sg_import(src.genericBolt5, genericBolt5); + ::sg_import(src.cinematicModel, cinematicModel); + ::sg_import(src.m_pVehicle, m_pVehicle); + ::sg_import(src.NPC, NPC); + ::sg_import(src.ownername, ownername); + ::sg_import(src.cantHitEnemyCounter, cantHitEnemyCounter); + ::sg_import(src.NPC_type, NPC_type); + ::sg_import(src.NPC_targetname, NPC_targetname); + ::sg_import(src.NPC_target, NPC_target); + ::sg_import(src.moverState, moverState); + ::sg_import(src.soundPos1, soundPos1); + ::sg_import(src.sound1to2, sound1to2); + ::sg_import(src.sound2to1, sound2to1); + ::sg_import(src.soundPos2, soundPos2); + ::sg_import(src.soundLoop, soundLoop); + ::sg_import(src.nextTrain, nextTrain); + ::sg_import(src.prevTrain, prevTrain); + ::sg_import(src.pos1, pos1); + ::sg_import(src.pos2, pos2); + ::sg_import(src.pos3, pos3); + ::sg_import(src.sounds, sounds); + ::sg_import(src.closetarget, closetarget); + ::sg_import(src.opentarget, opentarget); + ::sg_import(src.paintarget, paintarget); + ::sg_import(src.lockCount, lockCount); + ::sg_import(src.radius, radius); + ::sg_import(src.wpIndex, wpIndex); + ::sg_import(src.noise_index, noise_index); + ::sg_import(src.startRGBA, startRGBA); + ::sg_import(src.finalRGBA, finalRGBA); + ::sg_import(src.item, item); + ::sg_import(src.message, message); + ::sg_import(src.lightLevel, lightLevel); + ::sg_import(src.forcePushTime, forcePushTime); + ::sg_import(src.forcePuller, forcePuller); + } }; #endif //#ifdef GAME_INCLUDE diff --git a/code/game/g_vehicles.h b/code/game/g_vehicles.h index c2baeb5324..65f1d1fa7e 100644 --- a/code/game/g_vehicles.h +++ b/code/game/g_vehicles.h @@ -453,8 +453,22 @@ enum extern void G_VehicleSpawn( gentity_t *self ); // A vehicle weapon muzzle. +#pragma pack(push, 4) +class SgMuzzle +{ +public: + SgVec3 m_vMuzzlePos; + SgVec3 m_vMuzzleDir; + int32_t m_iMuzzleWait; + int8_t m_bFired; +}; // SgMuzzle +#pragma pack(pop) + struct Muzzle { + using SgType = SgMuzzle; + + // These are updated every frame and represent the current position and direction for the specific muzzle. vec3_t m_vMuzzlePos; vec3_t m_vMuzzleDir; @@ -466,6 +480,24 @@ struct Muzzle // whether this Muzzle was just fired or not (reset at muzzle flash code). bool m_bFired; + + void sg_export( + SgType& dst) const + { + ::sg_export(m_vMuzzlePos, dst.m_vMuzzlePos); + ::sg_export(m_vMuzzleDir, dst.m_vMuzzleDir); + ::sg_export(m_iMuzzleWait, dst.m_iMuzzleWait); + ::sg_export(m_bFired, dst.m_bFired); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.m_vMuzzlePos, m_vMuzzlePos); + ::sg_import(src.m_vMuzzleDir, m_vMuzzleDir); + ::sg_import(src.m_iMuzzleWait, m_iMuzzleWait); + ::sg_import(src.m_bFired, m_bFired); + } }; //defines for impact damage surface stuff @@ -491,8 +523,22 @@ struct Muzzle #define SHIPSURF_BROKEN_E (1<<4) //wing 3 #define SHIPSURF_BROKEN_F (1<<5) //wing 4 +#pragma pack(push, 4) +class SgVehWeaponStatus +{ +public: + int32_t linked; + int32_t ammo; + int32_t lastAmmoInc; + int32_t nextMuzzle; +}; // SgVehWeaponStatus +#pragma pack(pop) + typedef struct { + using SgType = SgVehWeaponStatus; + + //linked firing mode qboolean linked;//weapon 1's muzzles are in linked firing mode //current weapon ammo @@ -501,10 +547,44 @@ typedef struct int lastAmmoInc; //which muzzle will fire next int nextMuzzle; + + + void sg_export( + SgType& dst) const + { + ::sg_export(linked, dst.linked); + ::sg_export(ammo, dst.ammo); + ::sg_export(lastAmmoInc, dst.lastAmmoInc); + ::sg_export(nextMuzzle, dst.nextMuzzle); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.linked, linked); + ::sg_import(src.ammo, ammo); + ::sg_import(src.lastAmmoInc, lastAmmoInc); + ::sg_import(src.nextMuzzle, nextMuzzle); + } } vehWeaponStatus_t; +#pragma pack(push, 4) +class SgVehTurretStatus +{ +public: + int32_t ammo; + int32_t lastAmmoInc; + int32_t nextMuzzle; + int32_t enemyEntNum; + int32_t enemyHoldTime; +}; // SgVehTurretStatus +#pragma pack(pop) + typedef struct { + using SgType = SgVehTurretStatus; + + //current weapon ammo int ammo; //debouncer for ammo recharge @@ -515,13 +595,85 @@ typedef struct int enemyEntNum; //how long to hold on to our current enemy int enemyHoldTime; + + + void sg_export( + SgType& dst) const + { + ::sg_export(ammo, dst.ammo); + ::sg_export(lastAmmoInc, dst.lastAmmoInc); + ::sg_export(nextMuzzle, dst.nextMuzzle); + ::sg_export(enemyEntNum, dst.enemyEntNum); + ::sg_export(enemyHoldTime, dst.enemyHoldTime); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.ammo, ammo); + ::sg_import(src.lastAmmoInc, lastAmmoInc); + ::sg_import(src.nextMuzzle, nextMuzzle); + ::sg_import(src.enemyEntNum, enemyEntNum); + ::sg_import(src.enemyHoldTime, enemyHoldTime); + } } vehTurretStatus_t; // This is the implementation of the vehicle interface and any of the other variables needed. This // is what actually represents a vehicle. -AReis. // !!!!!!!!!!!!!!!!!! loadsave affecting structure !!!!!!!!!!!!!!!!!!!!!!! +#pragma pack(push, 4) +class SgVehicle +{ +public: + int32_t m_pPilot; + int32_t m_iPilotTime; + int32_t m_bHasHadPilot; + int32_t m_pDroidUnit; + int32_t m_pParentEntity; + int32_t m_iBoarding; + int8_t m_bWasBoarding; + SgVec3 m_vBoardingVelocity; + float m_fTimeModifier; + int32_t m_iLeftWingBone; + int32_t m_iRightWingBone; + SgArray m_iExhaustTag; + SgArray m_iMuzzleTag; + int32_t m_iDroidUnitTag; + SgArray m_iGunnerViewTag; + SgArray m_Muzzles; + SgUserCmd m_ucmd; + int32_t m_EjectDir; + uint32_t m_ulFlags; + SgVec3 m_vOrientation; + int32_t m_fStrafeTime; + SgVec3 m_vPrevOrientation; + float m_vAngularVelocity; + SgVec3 m_vFullAngleVelocity; + int32_t m_iArmor; + int32_t m_iShields; + int32_t m_iLastFXTime; + int32_t m_iDieTime; + int32_t m_pVehicleInfo; + SgTrace m_LandTrace; + int32_t m_iRemovedSurfaces; + int32_t m_iTurboTime; + int32_t m_iDropTime; + int32_t m_iSoundDebounceTimer; + int32_t lastShieldInc; + int32_t linkWeaponToggleHeld; + SgArray weaponStatus; + SgArray turretStatus; + int32_t m_pOldPilot; + int32_t m_safeJumpMountTime; + float m_safeJumpMountRightDot; +}; // SgVehicle +#pragma pack(pop) + struct Vehicle_t { + using SgType = SgVehicle; + + // The entity who pilots/drives this vehicle. // NOTE: This is redundant (since m_pParentEntity->owner _should_ be the pilot). This makes things clearer though. gentity_t *m_pPilot; @@ -631,6 +783,99 @@ struct Vehicle_t // don't need these in mp int m_safeJumpMountTime; float m_safeJumpMountRightDot; + + + void sg_export( + SgType& dst) const + { + ::sg_export(m_pPilot, dst.m_pPilot); + ::sg_export(m_iPilotTime, dst.m_iPilotTime); + ::sg_export(m_bHasHadPilot, dst.m_bHasHadPilot); + ::sg_export(m_pDroidUnit, dst.m_pDroidUnit); + ::sg_export(m_pParentEntity, dst.m_pParentEntity); + ::sg_export(m_iBoarding, dst.m_iBoarding); + ::sg_export(m_bWasBoarding, dst.m_bWasBoarding); + ::sg_export(m_vBoardingVelocity, dst.m_vBoardingVelocity); + ::sg_export(m_fTimeModifier, dst.m_fTimeModifier); + ::sg_export(m_iLeftWingBone, dst.m_iLeftWingBone); + ::sg_export(m_iRightWingBone, dst.m_iRightWingBone); + ::sg_export(m_iExhaustTag, dst.m_iExhaustTag); + ::sg_export(m_iMuzzleTag, dst.m_iMuzzleTag); + ::sg_export(m_iDroidUnitTag, dst.m_iDroidUnitTag); + ::sg_export(m_iGunnerViewTag, dst.m_iGunnerViewTag); + ::sg_export(m_Muzzles, dst.m_Muzzles); + ::sg_export(m_ucmd, dst.m_ucmd); + ::sg_export(m_EjectDir, dst.m_EjectDir); + ::sg_export(m_ulFlags, dst.m_ulFlags); + ::sg_export(m_vOrientation, dst.m_vOrientation); + ::sg_export(m_fStrafeTime, dst.m_fStrafeTime); + ::sg_export(m_vPrevOrientation, dst.m_vPrevOrientation); + ::sg_export(m_vAngularVelocity, dst.m_vAngularVelocity); + ::sg_export(m_vFullAngleVelocity, dst.m_vFullAngleVelocity); + ::sg_export(m_iArmor, dst.m_iArmor); + ::sg_export(m_iShields, dst.m_iShields); + ::sg_export(m_iLastFXTime, dst.m_iLastFXTime); + ::sg_export(m_iDieTime, dst.m_iDieTime); + ::sg_export(m_pVehicleInfo, dst.m_pVehicleInfo); + ::sg_export(m_LandTrace, dst.m_LandTrace); + ::sg_export(m_iRemovedSurfaces, dst.m_iRemovedSurfaces); + ::sg_export(m_iTurboTime, dst.m_iTurboTime); + ::sg_export(m_iDropTime, dst.m_iDropTime); + ::sg_export(m_iSoundDebounceTimer, dst.m_iSoundDebounceTimer); + ::sg_export(lastShieldInc, dst.lastShieldInc); + ::sg_export(linkWeaponToggleHeld, dst.linkWeaponToggleHeld); + ::sg_export(weaponStatus, dst.weaponStatus); + ::sg_export(turretStatus, dst.turretStatus); + ::sg_export(m_pOldPilot, dst.m_pOldPilot); + ::sg_export(m_safeJumpMountTime, dst.m_safeJumpMountTime); + ::sg_export(m_safeJumpMountRightDot, dst.m_safeJumpMountRightDot); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.m_pPilot, m_pPilot); + ::sg_import(src.m_iPilotTime, m_iPilotTime); + ::sg_import(src.m_bHasHadPilot, m_bHasHadPilot); + ::sg_import(src.m_pDroidUnit, m_pDroidUnit); + ::sg_import(src.m_pParentEntity, m_pParentEntity); + ::sg_import(src.m_iBoarding, m_iBoarding); + ::sg_import(src.m_bWasBoarding, m_bWasBoarding); + ::sg_import(src.m_vBoardingVelocity, m_vBoardingVelocity); + ::sg_import(src.m_fTimeModifier, m_fTimeModifier); + ::sg_import(src.m_iLeftWingBone, m_iLeftWingBone); + ::sg_import(src.m_iRightWingBone, m_iRightWingBone); + ::sg_import(src.m_iExhaustTag, m_iExhaustTag); + ::sg_import(src.m_iMuzzleTag, m_iMuzzleTag); + ::sg_import(src.m_iDroidUnitTag, m_iDroidUnitTag); + ::sg_import(src.m_iGunnerViewTag, m_iGunnerViewTag); + ::sg_import(src.m_Muzzles, m_Muzzles); + ::sg_import(src.m_ucmd, m_ucmd); + ::sg_import(src.m_EjectDir, m_EjectDir); + ::sg_import(src.m_ulFlags, m_ulFlags); + ::sg_import(src.m_vOrientation, m_vOrientation); + ::sg_import(src.m_fStrafeTime, m_fStrafeTime); + ::sg_import(src.m_vPrevOrientation, m_vPrevOrientation); + ::sg_import(src.m_vAngularVelocity, m_vAngularVelocity); + ::sg_import(src.m_vFullAngleVelocity, m_vFullAngleVelocity); + ::sg_import(src.m_iArmor, m_iArmor); + ::sg_import(src.m_iShields, m_iShields); + ::sg_import(src.m_iLastFXTime, m_iLastFXTime); + ::sg_import(src.m_iDieTime, m_iDieTime); + ::sg_import(src.m_pVehicleInfo, m_pVehicleInfo); + ::sg_import(src.m_LandTrace, m_LandTrace); + ::sg_import(src.m_iRemovedSurfaces, m_iRemovedSurfaces); + ::sg_import(src.m_iTurboTime, m_iTurboTime); + ::sg_import(src.m_iDropTime, m_iDropTime); + ::sg_import(src.m_iSoundDebounceTimer, m_iSoundDebounceTimer); + ::sg_import(src.lastShieldInc, lastShieldInc); + ::sg_import(src.linkWeaponToggleHeld, linkWeaponToggleHeld); + ::sg_import(src.weaponStatus, weaponStatus); + ::sg_import(src.turretStatus, turretStatus); + ::sg_import(src.m_pOldPilot, m_pOldPilot); + ::sg_import(src.m_safeJumpMountTime, m_safeJumpMountTime); + ::sg_import(src.m_safeJumpMountRightDot, m_safeJumpMountRightDot); + } }; extern int BG_VehicleGetIndex( const char *vehicleName ); diff --git a/code/game/ghoul2_shared.h b/code/game/ghoul2_shared.h index 9fcb6bb4dc..b6d0ee5eb8 100644 --- a/code/game/ghoul2_shared.h +++ b/code/game/ghoul2_shared.h @@ -40,8 +40,24 @@ int G2API_GetTime(int argTime); // this may or may not return arg depending on // G H O U L I I D E F I N E S // // we save the whole surfaceInfo_t struct +#pragma pack(push, 4) +class SgSurfaceInfo +{ +public: + int32_t offFlags; + int32_t surface; + float genBarycentricJ; + float genBarycentricI; + int32_t genPolySurfaceIndex; + int32_t genLod; +}; // SgSurfaceInfo +#pragma pack(pop) + struct surfaceInfo_t { + using SgType = SgSurfaceInfo; + + int offFlags; // what the flags are for this model int surface; // index into array held inside the model definition of pointers to the actual surface data loaded in - used by both client and game float genBarycentricJ; // point 0 barycentric coors @@ -58,6 +74,28 @@ surfaceInfo_t(): genLod(0) {} + + void sg_export( + SgType& dst) const + { + ::sg_export(offFlags, dst.offFlags); + ::sg_export(surface, dst.surface); + ::sg_export(genBarycentricJ, dst.genBarycentricJ); + ::sg_export(genBarycentricI, dst.genBarycentricI); + ::sg_export(genPolySurfaceIndex, dst.genPolySurfaceIndex); + ::sg_export(genLod, dst.genLod); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.offFlags, offFlags); + ::sg_import(src.surface, surface); + ::sg_import(src.genBarycentricJ, genBarycentricJ); + ::sg_import(src.genBarycentricI, genBarycentricI); + ::sg_import(src.genPolySurfaceIndex, genPolySurfaceIndex); + ::sg_import(src.genLod, genLod); + } }; #define BONE_ANGLES_PREMULT 0x0001 @@ -87,8 +125,84 @@ typedef struct { #include "../rd-common/mdx_format.h" // we save the whole structure here. +#pragma pack(push, 4) +class SgBoneInfo +{ +public: + int32_t boneNumber; + SgMdxaBone matrix; + int32_t flags; + int32_t startFrame; + int32_t endFrame; + int32_t startTime; + int32_t pauseTime; + float animSpeed; + float blendFrame; + int32_t blendLerpFrame; + int32_t blendTime; + int32_t blendStart; + int32_t boneBlendTime; + int32_t boneBlendStart; + SgMdxaBone newMatrix; + int32_t lastTimeUpdated; + int32_t lastContents; + SgVec3 lastPosition; + SgVec3 velocityEffector; + SgVec3 lastAngles; + SgVec3 minAngles; + SgVec3 maxAngles; + SgVec3 currentAngles; + SgVec3 anglesOffset; + SgVec3 positionOffset; + float radius; + float weight; + int32_t ragIndex; + SgVec3 velocityRoot; + int32_t ragStartTime; + int32_t firstTime; + int32_t firstCollisionTime; + int32_t restTime; + int32_t RagFlags; + int32_t DependentRagIndexMask; + SgMdxaBone originalTrueBoneMatrix; + SgMdxaBone parentTrueBoneMatrix; + SgMdxaBone parentOriginalTrueBoneMatrix; + SgVec3 originalOrigin; + SgVec3 originalAngles; + SgVec3 lastShotDir; + int32_t basepose; + int32_t baseposeInv; + int32_t baseposeParent; + int32_t baseposeInvParent; + int32_t parentRawBoneIndex; + SgMdxaBone ragOverrideMatrix; + SgMdxaBone extraMatrix; + SgVec3 extraVec1; + float extraFloat1; + int32_t extraInt1; + SgVec3 ikPosition; + float ikSpeed; + SgVec3 epVelocity; + float epGravFactor; + int32_t solidCount; + uint8_t physicsSettled; + uint8_t snapped; + int32_t parentBoneIndex; + float offsetRotation; + float overGradSpeed; + SgVec3 overGoalSpot; + uint8_t hasOverGoal; + SgMdxaBone animFrameMatrix; + int32_t hasAnimFrameMatrix; + int32_t airTime; +}; // SgBoneInfo +#pragma pack(pop) + struct boneInfo_t { + using SgType = SgBoneInfo; + + int boneNumber; // what bone are we overriding? mdxaBone_t matrix; // details of bone angle overrides - some are pre-done on the server, some in ghoul2 int flags; // flags for override @@ -190,9 +304,165 @@ boneInfo_t(): matrix.matrix[2][0] = matrix.matrix[2][1] = matrix.matrix[2][2] = matrix.matrix[2][3] = 0.0f; } + + void sg_export( + SgType& dst) const + { + ::sg_export(boneNumber, dst.boneNumber); + ::sg_export(matrix, dst.matrix); + ::sg_export(flags, dst.flags); + ::sg_export(startFrame, dst.startFrame); + ::sg_export(endFrame, dst.endFrame); + ::sg_export(startTime, dst.startTime); + ::sg_export(pauseTime, dst.pauseTime); + ::sg_export(animSpeed, dst.animSpeed); + ::sg_export(blendFrame, dst.blendFrame); + ::sg_export(blendLerpFrame, dst.blendLerpFrame); + ::sg_export(blendTime, dst.blendTime); + ::sg_export(blendStart, dst.blendStart); + ::sg_export(boneBlendTime, dst.boneBlendTime); + ::sg_export(boneBlendStart, dst.boneBlendStart); + ::sg_export(newMatrix, dst.newMatrix); + ::sg_export(lastTimeUpdated, dst.lastTimeUpdated); + ::sg_export(lastContents, dst.lastContents); + ::sg_export(lastPosition, dst.lastPosition); + ::sg_export(velocityEffector, dst.velocityEffector); + ::sg_export(lastAngles, dst.lastAngles); + ::sg_export(minAngles, dst.minAngles); + ::sg_export(maxAngles, dst.maxAngles); + ::sg_export(currentAngles, dst.currentAngles); + ::sg_export(anglesOffset, dst.anglesOffset); + ::sg_export(positionOffset, dst.positionOffset); + ::sg_export(radius, dst.radius); + ::sg_export(weight, dst.weight); + ::sg_export(ragIndex, dst.ragIndex); + ::sg_export(velocityRoot, dst.velocityRoot); + ::sg_export(ragStartTime, dst.ragStartTime); + ::sg_export(firstTime, dst.firstTime); + ::sg_export(firstCollisionTime, dst.firstCollisionTime); + ::sg_export(restTime, dst.restTime); + ::sg_export(RagFlags, dst.RagFlags); + ::sg_export(DependentRagIndexMask, dst.DependentRagIndexMask); + ::sg_export(originalTrueBoneMatrix, dst.originalTrueBoneMatrix); + ::sg_export(parentTrueBoneMatrix, dst.parentTrueBoneMatrix); + ::sg_export(parentOriginalTrueBoneMatrix, dst.parentOriginalTrueBoneMatrix); + ::sg_export(originalOrigin, dst.originalOrigin); + ::sg_export(originalAngles, dst.originalAngles); + ::sg_export(lastShotDir, dst.lastShotDir); + ::sg_export(basepose, dst.basepose); + ::sg_export(baseposeInv, dst.baseposeInv); + ::sg_export(baseposeParent, dst.baseposeParent); + ::sg_export(baseposeInvParent, dst.baseposeInvParent); + ::sg_export(parentRawBoneIndex, dst.parentRawBoneIndex); + ::sg_export(ragOverrideMatrix, dst.ragOverrideMatrix); + ::sg_export(extraMatrix, dst.extraMatrix); + ::sg_export(extraVec1, dst.extraVec1); + ::sg_export(extraFloat1, dst.extraFloat1); + ::sg_export(extraInt1, dst.extraInt1); + ::sg_export(ikPosition, dst.ikPosition); + ::sg_export(ikSpeed, dst.ikSpeed); + ::sg_export(epVelocity, dst.epVelocity); + ::sg_export(epGravFactor, dst.epGravFactor); + ::sg_export(solidCount, dst.solidCount); + ::sg_export(physicsSettled, dst.physicsSettled); + ::sg_export(snapped, dst.snapped); + ::sg_export(parentBoneIndex, dst.parentBoneIndex); + ::sg_export(offsetRotation, dst.offsetRotation); + ::sg_export(overGradSpeed, dst.overGradSpeed); + ::sg_export(overGoalSpot, dst.overGoalSpot); + ::sg_export(hasOverGoal, dst.hasOverGoal); + ::sg_export(animFrameMatrix, dst.animFrameMatrix); + ::sg_export(hasAnimFrameMatrix, dst.hasAnimFrameMatrix); + ::sg_export(airTime, dst.airTime); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.boneNumber, boneNumber); + ::sg_import(src.matrix, matrix); + ::sg_import(src.flags, flags); + ::sg_import(src.startFrame, startFrame); + ::sg_import(src.endFrame, endFrame); + ::sg_import(src.startTime, startTime); + ::sg_import(src.pauseTime, pauseTime); + ::sg_import(src.animSpeed, animSpeed); + ::sg_import(src.blendFrame, blendFrame); + ::sg_import(src.blendLerpFrame, blendLerpFrame); + ::sg_import(src.blendTime, blendTime); + ::sg_import(src.blendStart, blendStart); + ::sg_import(src.boneBlendTime, boneBlendTime); + ::sg_import(src.boneBlendStart, boneBlendStart); + ::sg_import(src.newMatrix, newMatrix); + ::sg_import(src.lastTimeUpdated, lastTimeUpdated); + ::sg_import(src.lastContents, lastContents); + ::sg_import(src.lastPosition, lastPosition); + ::sg_import(src.velocityEffector, velocityEffector); + ::sg_import(src.lastAngles, lastAngles); + ::sg_import(src.minAngles, minAngles); + ::sg_import(src.maxAngles, maxAngles); + ::sg_import(src.currentAngles, currentAngles); + ::sg_import(src.anglesOffset, anglesOffset); + ::sg_import(src.positionOffset, positionOffset); + ::sg_import(src.radius, radius); + ::sg_import(src.weight, weight); + ::sg_import(src.ragIndex, ragIndex); + ::sg_import(src.velocityRoot, velocityRoot); + ::sg_import(src.ragStartTime, ragStartTime); + ::sg_import(src.firstTime, firstTime); + ::sg_import(src.firstCollisionTime, firstCollisionTime); + ::sg_import(src.restTime, restTime); + ::sg_import(src.RagFlags, RagFlags); + ::sg_import(src.DependentRagIndexMask, DependentRagIndexMask); + ::sg_import(src.originalTrueBoneMatrix, originalTrueBoneMatrix); + ::sg_import(src.parentTrueBoneMatrix, parentTrueBoneMatrix); + ::sg_import(src.parentOriginalTrueBoneMatrix, parentOriginalTrueBoneMatrix); + ::sg_import(src.originalOrigin, originalOrigin); + ::sg_import(src.originalAngles, originalAngles); + ::sg_import(src.lastShotDir, lastShotDir); + ::sg_import(src.basepose, basepose); + ::sg_import(src.baseposeInv, baseposeInv); + ::sg_import(src.baseposeParent, baseposeParent); + ::sg_import(src.baseposeInvParent, baseposeInvParent); + ::sg_import(src.parentRawBoneIndex, parentRawBoneIndex); + ::sg_import(src.ragOverrideMatrix, ragOverrideMatrix); + ::sg_import(src.extraMatrix, extraMatrix); + ::sg_import(src.extraVec1, extraVec1); + ::sg_import(src.extraFloat1, extraFloat1); + ::sg_import(src.extraInt1, extraInt1); + ::sg_import(src.ikPosition, ikPosition); + ::sg_import(src.ikSpeed, ikSpeed); + ::sg_import(src.epVelocity, epVelocity); + ::sg_import(src.epGravFactor, epGravFactor); + ::sg_import(src.solidCount, solidCount); + ::sg_import(src.physicsSettled, physicsSettled); + ::sg_import(src.snapped, snapped); + ::sg_import(src.parentBoneIndex, parentBoneIndex); + ::sg_import(src.offsetRotation, offsetRotation); + ::sg_import(src.overGradSpeed, overGradSpeed); + ::sg_import(src.overGoalSpot, overGoalSpot); + ::sg_import(src.hasOverGoal, hasOverGoal); + ::sg_import(src.animFrameMatrix, animFrameMatrix); + ::sg_import(src.hasAnimFrameMatrix, hasAnimFrameMatrix); + ::sg_import(src.airTime, airTime); + } }; //we save from top to boltUsed here. Don't bother saving the position, it gets rebuilt every frame anyway +#pragma pack(push, 4) +class SgBoltInfo +{ +public: + int32_t boneNumber; + int32_t surfaceNumber; + int32_t surfaceType; + int32_t boltUsed; +}; // SgBoltInfo +#pragma pack(pop) + struct boltInfo_t{ + using SgType = SgBoltInfo; + + int boneNumber; // bone number bolt attaches to int surfaceNumber; // surface number bolt attaches to int surfaceType; // if we attach to a surface, this tells us if it is an original surface or a generated one - doesn't go across the network @@ -203,6 +473,25 @@ struct boltInfo_t{ surfaceType(0), boltUsed(0) {} + + + void sg_export( + SgType& dst) const + { + ::sg_export(boneNumber, dst.boneNumber); + ::sg_export(surfaceNumber, dst.surfaceNumber); + ::sg_export(surfaceType, dst.surfaceType); + ::sg_export(boltUsed, dst.boltUsed); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.boneNumber, boneNumber); + ::sg_import(src.surfaceNumber, surfaceNumber); + ::sg_import(src.surfaceType, surfaceType); + ::sg_import(src.boltUsed, boltUsed); + } }; @@ -247,9 +536,36 @@ CRenderableSurface(const CRenderableSurface& rs): }; #endif +#pragma pack(push, 4) +class SgCGhoul2Info +{ +public: + int32_t mModelindex; + int32_t animModelIndexOffset; + int32_t mCustomShader; + int32_t mCustomSkin; + int32_t mModelBoltLink; + int32_t mSurfaceRoot; + int32_t mLodBias; + int32_t mNewOrigin; +#ifdef _G2_GORE + int32_t mGoreSetTag; +#endif + int32_t mModel; + SgArray mFileName; + int32_t mAnimFrameDefault; + int32_t mSkelFrameNum; + int32_t mMeshFrameNum; + int32_t mFlags; +}; // SgCGhoul2Info +#pragma pack(pop) + class CGhoul2Info { public: + using SgType = SgCGhoul2Info; + + surfaceInfo_v mSlist; boltInfo_v mBltlist; boneInfo_v mBlist; @@ -316,6 +632,51 @@ class CGhoul2Info { mFileName[0] = 0; } + + + void sg_export( + SgType& dst) const + { + ::sg_export(mModelindex, dst.mModelindex); + ::sg_export(animModelIndexOffset, dst.animModelIndexOffset); + ::sg_export(mCustomShader, dst.mCustomShader); + ::sg_export(mCustomSkin, dst.mCustomSkin); + ::sg_export(mModelBoltLink, dst.mModelBoltLink); + ::sg_export(mSurfaceRoot, dst.mSurfaceRoot); + ::sg_export(mLodBias, dst.mLodBias); + ::sg_export(mNewOrigin, dst.mNewOrigin); +#ifdef _G2_GORE + ::sg_export(mGoreSetTag, dst.mGoreSetTag); +#endif + ::sg_export(mModel, dst.mModel); + ::sg_export(mFileName, dst.mFileName); + ::sg_export(mAnimFrameDefault, dst.mAnimFrameDefault); + ::sg_export(mSkelFrameNum, dst.mSkelFrameNum); + ::sg_export(mMeshFrameNum, dst.mMeshFrameNum); + ::sg_export(mFlags, dst.mFlags); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.mModelindex, mModelindex); + ::sg_import(src.animModelIndexOffset, animModelIndexOffset); + ::sg_import(src.mCustomShader, mCustomShader); + ::sg_import(src.mCustomSkin, mCustomSkin); + ::sg_import(src.mModelBoltLink, mModelBoltLink); + ::sg_import(src.mSurfaceRoot, mSurfaceRoot); + ::sg_import(src.mLodBias, mLodBias); + ::sg_import(src.mNewOrigin, mNewOrigin); +#ifdef _G2_GORE + ::sg_import(src.mGoreSetTag, mGoreSetTag); +#endif + ::sg_import(src.mModel, mModel); + ::sg_import(src.mFileName, mFileName); + ::sg_import(src.mAnimFrameDefault, mAnimFrameDefault); + ::sg_import(src.mSkelFrameNum, mSkelFrameNum); + ::sg_import(src.mMeshFrameNum, mMeshFrameNum); + ::sg_import(src.mFlags, mFlags); + } }; class CGhoul2Info_v; @@ -338,6 +699,14 @@ IGhoul2InfoArray &_TheGhoul2InfoArray(); IGhoul2InfoArray &TheGameGhoul2InfoArray(); #endif +#pragma pack(push, 4) +class SgCGhoul2InfoV +{ +public: + int32_t mItem; +}; // SgCGhoul2InfoV +#pragma pack(pop) + class CGhoul2Info_v { int mItem; @@ -379,6 +748,9 @@ class CGhoul2Info_v return InfoArray().Get(mItem); } public: + using SgType = SgCGhoul2InfoV; + + CGhoul2Info_v() { mItem=0; @@ -466,6 +838,19 @@ class CGhoul2Info_v // of making a deep copy mItem=0; } + + + void sg_export( + SgType& dst) const + { + ::sg_export(mItem, dst.mItem); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.mItem, mItem); + } }; @@ -474,10 +859,31 @@ class CGhoul2Info_v #define G2_FRONTFACE 1 #define G2_BACKFACE 0 +#pragma pack(push, 4) +class SgCCollisionRecord +{ +public: + float mDistance; + int32_t mEntityNum; + int32_t mModelIndex; + int32_t mPolyIndex; + int32_t mSurfaceIndex; + SgVec3 mCollisionPosition; + SgVec3 mCollisionNormal; + int32_t mFlags; + int32_t mMaterial; + int32_t mLocation; + float mBarycentricI; + float mBarycentricJ; +}; // SgCCollisionRecord +#pragma pack(pop) class CCollisionRecord { public: + using SgType = SgCCollisionRecord; + + float mDistance; int mEntityNum; int mModelIndex; @@ -495,6 +901,41 @@ class CCollisionRecord mDistance(100000), mEntityNum(-1) {} + + + void sg_export( + SgType& dst) const + { + ::sg_export(mDistance, dst.mDistance); + ::sg_export(mEntityNum, dst.mEntityNum); + ::sg_export(mModelIndex, dst.mModelIndex); + ::sg_export(mPolyIndex, dst.mPolyIndex); + ::sg_export(mSurfaceIndex, dst.mSurfaceIndex); + ::sg_export(mCollisionPosition, dst.mCollisionPosition); + ::sg_export(mCollisionNormal, dst.mCollisionNormal); + ::sg_export(mFlags, dst.mFlags); + ::sg_export(mMaterial, dst.mMaterial); + ::sg_export(mLocation, dst.mLocation); + ::sg_export(mBarycentricI, dst.mBarycentricI); + ::sg_export(mBarycentricJ, dst.mBarycentricJ); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.mDistance, mDistance); + ::sg_import(src.mEntityNum, mEntityNum); + ::sg_import(src.mModelIndex, mModelIndex); + ::sg_import(src.mPolyIndex, mPolyIndex); + ::sg_import(src.mSurfaceIndex, mSurfaceIndex); + ::sg_import(src.mCollisionPosition, mCollisionPosition); + ::sg_import(src.mCollisionNormal, mCollisionNormal); + ::sg_import(src.mFlags, mFlags); + ::sg_import(src.mMaterial, mMaterial); + ::sg_import(src.mLocation, mLocation); + ::sg_import(src.mBarycentricI, mBarycentricI); + ::sg_import(src.mBarycentricJ, mBarycentricJ); + } }; // calling defines for the trace function diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index 7eb5d95c04..b35870c7e7 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -683,7 +683,7 @@ int CIcarus::Load() //Check to make sure we're at the ICARUS save block double version; - game->ReadSaveData( INT_ID('I','C','A','R'), &version, sizeof( version ) ); + ::sg_read(game, INT_ID('I','C','A','R'), version); //Versions must match! if ( version != ICARUS_VERSION ) @@ -694,7 +694,7 @@ int CIcarus::Load() } // Read into the buffer all our data. - /*m_ulBytesAvailable = */game->ReadSaveData( INT_ID('I','S','E','Q'), m_byBuffer, 0 ); //fixme, use real buff size + /*m_ulBytesAvailable = */::sg_read_no_cast(game, INT_ID('I','S','E','Q'), m_byBuffer, 0 ); //fixme, use real buff size //Load all signals if ( LoadSignals() == false ) @@ -804,7 +804,7 @@ void CIcarus::BufferRead( void *pDstBuff, unsigned long ulNumBytesToRead ) {// We've tried to read past the buffer... IGameInterface::GetGame()->DebugPrint( IGameInterface::WL_ERROR, "BufferRead: Buffer underflow, Looking for new block." ); // Read in the next block. - /*m_ulBytesAvailable = */IGameInterface::GetGame()->ReadSaveData( INT_ID('I','S','E','Q'), m_byBuffer, 0 ); //FIXME, to actually check underflows, use real buff size + /*m_ulBytesAvailable = */::sg_read_no_cast(IGameInterface::GetGame(), INT_ID('I','S','E','Q'), m_byBuffer, 0 ); //FIXME, to actually check underflows, use real buff size m_ulBytesRead = 0; //reset buffer } diff --git a/code/qcommon/cm_load.cpp b/code/qcommon/cm_load.cpp index 6083306c00..f76f318b1d 100644 --- a/code/qcommon/cm_load.cpp +++ b/code/qcommon/cm_load.cpp @@ -1228,7 +1228,7 @@ and recalculates the area connections */ void CM_ReadPortalState () { - SG_Read(INT_ID('P','R','T','S'), (void *)cmg.areaPortals, cmg.numAreas * cmg.numAreas * sizeof( *cmg.areaPortals )); + ::sg_read(::SG_Read, INT_ID('P','R','T','S'), ::cmg.areaPortals, ::cmg.numAreas * ::cmg.numAreas); CM_FloodAreaConnections (cmg); } diff --git a/code/qcommon/md4.cpp b/code/qcommon/md4.cpp index 9cc543934e..23851d5867 100644 --- a/code/qcommon/md4.cpp +++ b/code/qcommon/md4.cpp @@ -200,10 +200,10 @@ static void mdfour( byte *out, byte *in, int n ) //=================================================================== -unsigned Com_BlockChecksum( const void *buffer, int length ) +uint32_t Com_BlockChecksum( const void *buffer, int length ) { int digest[4]; - unsigned val; + uint32_t val; mdfour( (byte *)digest, (byte *)buffer, length ); diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index e01f657b9e..a5b790debb 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -113,6 +113,7 @@ along with this program; if not, see . #include #endif + //Ignore __attribute__ on non-gcc platforms #if !defined(__GNUC__) && !defined(__attribute__) #define __attribute__(x) @@ -159,6 +160,8 @@ float FloatSwap( const float *f ); #include "qcommon/q_platform.h" +#include "qcommon/ojk_sg_wrappers.h" + // ================================================================ // TYPE DEFINITIONS @@ -1219,12 +1222,48 @@ COLLISION DETECTION // plane_t structure // !!! if this is changed, it must be changed in asm code too !!! +#pragma pack(push, 4) +class SgCPlane +{ +public: + SgVec3 normal; + float dist; + uint8_t type; + uint8_t signbits; + SgArray pad; +}; // SgCPlane +#pragma pack(pop) + typedef struct cplane_s { + using SgType = SgCPlane; + + vec3_t normal; float dist; byte type; // for fast side tests: 0,1,2 = axial, 3 = nonaxial byte signbits; // signx + (signy<<1) + (signz<<2), used as lookup during collision byte pad[2]; + + + void sg_export( + SgType& dst) const + { + ::sg_export(normal, dst.normal); + ::sg_export(dist, dst.dist); + ::sg_export(type, dst.type); + ::sg_export(signbits, dst.signbits); + ::sg_export(pad, dst.pad); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.normal, normal); + ::sg_import(src.dist, dist); + ::sg_import(src.type, type); + ::sg_import(src.signbits, signbits); + ::sg_import(src.pad, pad); + } } cplane_t; /* @@ -1241,7 +1280,26 @@ Ghoul2 Insert End #define MAX_G2_COLLISIONS 16 // a trace is returned when a box is swept through the world +#pragma pack(push, 4) +class SgTrace +{ +public: + int32_t allsolid; + int32_t startsolid; + float fraction; + SgVec3 endpos; + SgCPlane plane; + int32_t surfaceFlags; + int32_t contents; + int32_t entityNum; + SgArray G2CollisionMap; +}; // SgTrace +#pragma pack(pop) + typedef struct { + using SgType = SgTrace; + + qboolean allsolid; // if true, plane is not valid qboolean startsolid; // if true, the initial point was in a solid area float fraction; // time completed, 1.0 = didn't hit anything @@ -1257,6 +1315,35 @@ Ghoul2 Insert Start /* Ghoul2 Insert End */ + + + void sg_export( + SgType& dst) const + { + ::sg_export(allsolid, dst.allsolid); + ::sg_export(startsolid, dst.startsolid); + ::sg_export(fraction, dst.fraction); + ::sg_export(endpos, dst.endpos); + ::sg_export(plane, dst.plane); + ::sg_export(surfaceFlags, dst.surfaceFlags); + ::sg_export(contents, dst.contents); + ::sg_export(entityNum, dst.entityNum); + ::sg_export(G2CollisionMap, dst.G2CollisionMap); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.allsolid, allsolid); + ::sg_import(src.startsolid, startsolid); + ::sg_import(src.fraction, fraction); + ::sg_import(src.endpos, endpos); + ::sg_import(src.plane, plane); + ::sg_import(src.surfaceFlags, surfaceFlags); + ::sg_import(src.contents, contents); + ::sg_import(src.entityNum, entityNum); + ::sg_import(src.G2CollisionMap, G2CollisionMap); + } } trace_t; // trace->entityNum can also be 0 to (MAX_GENTITIES-1) @@ -1474,8 +1561,26 @@ typedef enum } waterHeightLevel_t; // !!!!!!! loadsave affecting struct !!!!!!! +#pragma pack(push, 4) +class SgSaberTrail +{ +public: + int32_t inAction; + int32_t duration; + int32_t lastTime; + SgVec3 base; + SgVec3 tip; + SgArray haveOldPos; + SgArray oldPos; + SgArray oldNormal; +}; // SgSaberTrail +#pragma pack(pop) + typedef struct { + using SgType = SgSaberTrail; + + // Actual trail stuff int inAction; // controls whether should we even consider starting one int duration; // how long each trail seg stays in existence @@ -1488,12 +1593,61 @@ typedef struct vec3_t oldPos[2]; vec3_t oldNormal[2]; // store this in case we don't have a connect-the-dots situation // ..then we'll need the normal to project a mark blob onto the impact point + + + void sg_export( + SgType& dst) const + { + ::sg_export(inAction, dst.inAction); + ::sg_export(duration, dst.duration); + ::sg_export(lastTime, dst.lastTime); + ::sg_export(base, dst.base); + ::sg_export(tip, dst.tip); + ::sg_export(haveOldPos, dst.haveOldPos); + ::sg_export(oldPos, dst.oldPos); + ::sg_export(oldNormal, dst.oldNormal); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.inAction, inAction); + ::sg_import(src.duration, duration); + ::sg_import(src.lastTime, lastTime); + ::sg_import(src.base, base); + ::sg_import(src.tip, tip); + ::sg_import(src.haveOldPos, haveOldPos); + ::sg_import(src.oldPos, oldPos); + ::sg_import(src.oldNormal, oldNormal); + } } saberTrail_t; + #define MAX_SABER_TRAIL_SEGS 8 // !!!!!!!!!!!!! loadsave affecting struct !!!!!!!!!!!!!!! +#pragma pack(push, 4) +class SgBladeInfo +{ +public: + int32_t active; + int32_t color; + float radius; + float length; + float lengthMax; + float lengthOld; + SgVec3 muzzlePoint; + SgVec3 muzzlePointOld; + SgVec3 muzzleDir; + SgVec3 muzzleDirOld; + SgSaberTrail trail; +}; // SgBladeInfo +#pragma pack(pop) + typedef struct { + using SgType = SgBladeInfo; + + qboolean active; saber_colors_t color; float radius; @@ -1515,7 +1669,41 @@ typedef struct trail.inAction = qfalse; trail.duration = duration; }; + + + void sg_export( + SgType& dst) const + { + ::sg_export(active, dst.active); + ::sg_export(color, dst.color); + ::sg_export(radius, dst.radius); + ::sg_export(length, dst.length); + ::sg_export(lengthMax, dst.lengthMax); + ::sg_export(lengthOld, dst.lengthOld); + ::sg_export(muzzlePoint, dst.muzzlePoint); + ::sg_export(muzzlePointOld, dst.muzzlePointOld); + ::sg_export(muzzleDir, dst.muzzleDir); + ::sg_export(muzzleDirOld, dst.muzzleDirOld); + ::sg_export(trail, dst.trail); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.active, active); + ::sg_import(src.color, color); + ::sg_import(src.radius, radius); + ::sg_import(src.length, length); + ::sg_import(src.lengthMax, lengthMax); + ::sg_import(src.lengthOld, lengthOld); + ::sg_import(src.muzzlePoint, muzzlePoint); + ::sg_import(src.muzzlePointOld, muzzlePointOld); + ::sg_import(src.muzzleDir, muzzleDir); + ::sg_import(src.muzzleDirOld, muzzleDirOld); + ::sg_import(src.trail, trail); + } } bladeInfo_t; + #define MAX_BLADES 8 typedef enum @@ -1582,8 +1770,94 @@ typedef enum #define SFL2_TRANSITION_DAMAGE2 (1<<17)//if set, the blade does damage in start, transition and return anims (like strong style does) // !!!!!!!!!!!! loadsave affecting struct !!!!!!!!!!!!!!!!!!!!!!!!!! +#pragma pack(push, 4) +class SgSaberInfo +{ +public: + int32_t name; + int32_t fullName; + int32_t type; + int32_t model; + int32_t skin; + int32_t soundOn; + int32_t soundLoop; + int32_t soundOff; + int32_t numBlades; + SgArray blade; + int32_t stylesLearned; + int32_t stylesForbidden; + int32_t maxChain; + int32_t forceRestrictions; + int32_t lockBonus; + int32_t parryBonus; + int32_t breakParryBonus; + int32_t breakParryBonus2; + int32_t disarmBonus; + int32_t disarmBonus2; + int32_t singleBladeStyle; + int32_t brokenSaber1; + int32_t brokenSaber2; + int32_t saberFlags; + int32_t saberFlags2; + int32_t spinSound; + SgArray swingSound; + SgArray fallSound; + float moveSpeedScale; + float animSpeedScale; + int32_t kataMove; + int32_t lungeAtkMove; + int32_t jumpAtkUpMove; + int32_t jumpAtkFwdMove; + int32_t jumpAtkBackMove; + int32_t jumpAtkRightMove; + int32_t jumpAtkLeftMove; + int32_t readyAnim; + int32_t drawAnim; + int32_t putawayAnim; + int32_t tauntAnim; + int32_t bowAnim; + int32_t meditateAnim; + int32_t flourishAnim; + int32_t gloatAnim; + int32_t bladeStyle2Start; + int32_t trailStyle; + SgArray g2MarksShader; + SgArray g2WeaponMarkShader; + SgArray hitSound; + SgArray blockSound; + SgArray bounceSound; + int32_t blockEffect; + int32_t hitPersonEffect; + int32_t hitOtherEffect; + int32_t bladeEffect; + float knockbackScale; + float damageScale; + float splashRadius; + int32_t splashDamage; + float splashKnockback; + int32_t trailStyle2; + SgArray g2MarksShader2; + SgArray g2WeaponMarkShader2; + SgArray hit2Sound; + SgArray block2Sound; + SgArray bounce2Sound; + int32_t blockEffect2; + int32_t hitPersonEffect2; + int32_t hitOtherEffect2; + int32_t bladeEffect2; + float knockbackScale2; + float damageScale2; + float splashRadius2; + int32_t splashDamage2; + float splashKnockback2; +}; // SgSaberInfo +#pragma pack(pop) + typedef struct { + using SgType = SgSaberInfo; + + char *name; //entry in sabers.cfg, if any char *fullName; //the "Proper Name" of the saber, shown in the UI saberType_t type; //none, single or staff @@ -1802,6 +2076,169 @@ typedef struct blade[i].DeactivateTrail( duration ); } }; + + + void sg_export( + SgType& dst) const + { + ::sg_export(name, dst.name); + ::sg_export(fullName, dst.fullName); + ::sg_export(type, dst.type); + ::sg_export(model, dst.model); + ::sg_export(skin, dst.skin); + ::sg_export(soundOn, dst.soundOn); + ::sg_export(soundLoop, dst.soundLoop); + ::sg_export(soundOff, dst.soundOff); + ::sg_export(numBlades, dst.numBlades); + ::sg_export(blade, dst.blade); + ::sg_export(stylesLearned, dst.stylesLearned); + ::sg_export(stylesForbidden, dst.stylesForbidden); + ::sg_export(maxChain, dst.maxChain); + ::sg_export(forceRestrictions, dst.forceRestrictions); + ::sg_export(lockBonus, dst.lockBonus); + ::sg_export(parryBonus, dst.parryBonus); + ::sg_export(breakParryBonus, dst.breakParryBonus); + ::sg_export(breakParryBonus2, dst.breakParryBonus2); + ::sg_export(disarmBonus, dst.disarmBonus); + ::sg_export(disarmBonus2, dst.disarmBonus2); + ::sg_export(singleBladeStyle, dst.singleBladeStyle); + ::sg_export(brokenSaber1, dst.brokenSaber1); + ::sg_export(brokenSaber2, dst.brokenSaber2); + ::sg_export(saberFlags, dst.saberFlags); + ::sg_export(saberFlags2, dst.saberFlags2); + ::sg_export(spinSound, dst.spinSound); + ::sg_export(swingSound, dst.swingSound); + ::sg_export(fallSound, dst.fallSound); + ::sg_export(moveSpeedScale, dst.moveSpeedScale); + ::sg_export(animSpeedScale, dst.animSpeedScale); + ::sg_export(kataMove, dst.kataMove); + ::sg_export(lungeAtkMove, dst.lungeAtkMove); + ::sg_export(jumpAtkUpMove, dst.jumpAtkUpMove); + ::sg_export(jumpAtkFwdMove, dst.jumpAtkFwdMove); + ::sg_export(jumpAtkBackMove, dst.jumpAtkBackMove); + ::sg_export(jumpAtkRightMove, dst.jumpAtkRightMove); + ::sg_export(jumpAtkLeftMove, dst.jumpAtkLeftMove); + ::sg_export(readyAnim, dst.readyAnim); + ::sg_export(drawAnim, dst.drawAnim); + ::sg_export(putawayAnim, dst.putawayAnim); + ::sg_export(tauntAnim, dst.tauntAnim); + ::sg_export(bowAnim, dst.bowAnim); + ::sg_export(meditateAnim, dst.meditateAnim); + ::sg_export(flourishAnim, dst.flourishAnim); + ::sg_export(gloatAnim, dst.gloatAnim); + ::sg_export(bladeStyle2Start, dst.bladeStyle2Start); + ::sg_export(trailStyle, dst.trailStyle); + ::sg_export(g2MarksShader, dst.g2MarksShader); + ::sg_export(g2WeaponMarkShader, dst.g2WeaponMarkShader); + ::sg_export(hitSound, dst.hitSound); + ::sg_export(blockSound, dst.blockSound); + ::sg_export(bounceSound, dst.bounceSound); + ::sg_export(blockEffect, dst.blockEffect); + ::sg_export(hitPersonEffect, dst.hitPersonEffect); + ::sg_export(hitOtherEffect, dst.hitOtherEffect); + ::sg_export(bladeEffect, dst.bladeEffect); + ::sg_export(knockbackScale, dst.knockbackScale); + ::sg_export(damageScale, dst.damageScale); + ::sg_export(splashRadius, dst.splashRadius); + ::sg_export(splashDamage, dst.splashDamage); + ::sg_export(splashKnockback, dst.splashKnockback); + ::sg_export(trailStyle2, dst.trailStyle2); + ::sg_export(g2MarksShader2, dst.g2MarksShader2); + ::sg_export(g2WeaponMarkShader2, dst.g2WeaponMarkShader2); + ::sg_export(hit2Sound, dst.hit2Sound); + ::sg_export(block2Sound, dst.block2Sound); + ::sg_export(bounce2Sound, dst.bounce2Sound); + ::sg_export(blockEffect2, dst.blockEffect2); + ::sg_export(hitPersonEffect2, dst.hitPersonEffect2); + ::sg_export(hitOtherEffect2, dst.hitOtherEffect2); + ::sg_export(bladeEffect2, dst.bladeEffect2); + ::sg_export(knockbackScale2, dst.knockbackScale2); + ::sg_export(damageScale2, dst.damageScale2); + ::sg_export(splashRadius2, dst.splashRadius2); + ::sg_export(splashDamage2, dst.splashDamage2); + ::sg_export(splashKnockback2, dst.splashKnockback2); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.name, name); + ::sg_import(src.fullName, fullName); + ::sg_import(src.type, type); + ::sg_import(src.model, model); + ::sg_import(src.skin, skin); + ::sg_import(src.soundOn, soundOn); + ::sg_import(src.soundLoop, soundLoop); + ::sg_import(src.soundOff, soundOff); + ::sg_import(src.numBlades, numBlades); + ::sg_import(src.blade, blade); + ::sg_import(src.stylesLearned, stylesLearned); + ::sg_import(src.stylesForbidden, stylesForbidden); + ::sg_import(src.maxChain, maxChain); + ::sg_import(src.forceRestrictions, forceRestrictions); + ::sg_import(src.lockBonus, lockBonus); + ::sg_import(src.parryBonus, parryBonus); + ::sg_import(src.breakParryBonus, breakParryBonus); + ::sg_import(src.breakParryBonus2, breakParryBonus2); + ::sg_import(src.disarmBonus, disarmBonus); + ::sg_import(src.disarmBonus2, disarmBonus2); + ::sg_import(src.singleBladeStyle, singleBladeStyle); + ::sg_import(src.brokenSaber1, brokenSaber1); + ::sg_import(src.brokenSaber2, brokenSaber2); + ::sg_import(src.saberFlags, saberFlags); + ::sg_import(src.saberFlags2, saberFlags2); + ::sg_import(src.spinSound, spinSound); + ::sg_import(src.swingSound, swingSound); + ::sg_import(src.fallSound, fallSound); + ::sg_import(src.moveSpeedScale, moveSpeedScale); + ::sg_import(src.animSpeedScale, animSpeedScale); + ::sg_import(src.kataMove, kataMove); + ::sg_import(src.lungeAtkMove, lungeAtkMove); + ::sg_import(src.jumpAtkUpMove, jumpAtkUpMove); + ::sg_import(src.jumpAtkFwdMove, jumpAtkFwdMove); + ::sg_import(src.jumpAtkBackMove, jumpAtkBackMove); + ::sg_import(src.jumpAtkRightMove, jumpAtkRightMove); + ::sg_import(src.jumpAtkLeftMove, jumpAtkLeftMove); + ::sg_import(src.readyAnim, readyAnim); + ::sg_import(src.drawAnim, drawAnim); + ::sg_import(src.putawayAnim, putawayAnim); + ::sg_import(src.tauntAnim, tauntAnim); + ::sg_import(src.bowAnim, bowAnim); + ::sg_import(src.meditateAnim, meditateAnim); + ::sg_import(src.flourishAnim, flourishAnim); + ::sg_import(src.gloatAnim, gloatAnim); + ::sg_import(src.bladeStyle2Start, bladeStyle2Start); + ::sg_import(src.trailStyle, trailStyle); + ::sg_import(src.g2MarksShader, g2MarksShader); + ::sg_import(src.g2WeaponMarkShader, g2WeaponMarkShader); + ::sg_import(src.hitSound, hitSound); + ::sg_import(src.blockSound, blockSound); + ::sg_import(src.bounceSound, bounceSound); + ::sg_import(src.blockEffect, blockEffect); + ::sg_import(src.hitPersonEffect, hitPersonEffect); + ::sg_import(src.hitOtherEffect, hitOtherEffect); + ::sg_import(src.bladeEffect, bladeEffect); + ::sg_import(src.knockbackScale, knockbackScale); + ::sg_import(src.damageScale, damageScale); + ::sg_import(src.splashRadius, splashRadius); + ::sg_import(src.splashDamage, splashDamage); + ::sg_import(src.splashKnockback, splashKnockback); + ::sg_import(src.trailStyle2, trailStyle2); + ::sg_import(src.g2MarksShader2, g2MarksShader2); + ::sg_import(src.g2WeaponMarkShader2, g2WeaponMarkShader2); + ::sg_import(src.hit2Sound, hit2Sound); + ::sg_import(src.block2Sound, block2Sound); + ::sg_import(src.bounce2Sound, bounce2Sound); + ::sg_import(src.blockEffect2, blockEffect2); + ::sg_import(src.hitPersonEffect2, hitPersonEffect2); + ::sg_import(src.hitOtherEffect2, hitOtherEffect2); + ::sg_import(src.bladeEffect2, bladeEffect2); + ::sg_import(src.knockbackScale2, knockbackScale2); + ::sg_import(src.damageScale2, damageScale2); + ::sg_import(src.splashRadius2, splashRadius2); + ::sg_import(src.splashDamage2, splashDamage2); + ::sg_import(src.splashKnockback2, splashKnockback2); + } } saberInfo_t; //NOTE: Below is the *retail* version of the saberInfo_t structure - it is ONLY used for loading retail-version savegames (we load the savegame into this smaller structure, then copy each field into the appropriate field in the new structure - see SG_ConvertRetailSaberinfoToNewSaberinfo() @@ -1935,7 +2372,154 @@ typedef struct // so if a playerState_t is transmitted, the entityState_t can be fully derived // from it. // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgPlayerState +{ +public: + int32_t commandTime; + int32_t pm_type; + int32_t bobCycle; + int32_t pm_flags; + int32_t pm_time; + SgVec3 origin; + SgVec3 velocity; + int32_t weaponTime; + int32_t weaponChargeTime; + int32_t rechargeTime; + int32_t gravity; + int32_t leanofs; + int32_t friction; + int32_t speed; + SgArray delta_angles; + int32_t groundEntityNum; + int32_t legsAnim; + int32_t legsAnimTimer; + int32_t torsoAnim; + int32_t torsoAnimTimer; + int32_t movementDir; + int32_t eFlags; + int32_t eventSequence; + SgArray events; + SgArray eventParms; + int32_t externalEvent; + int32_t externalEventParm; + int32_t externalEventTime; + int32_t clientNum; + int32_t weapon; + int32_t weaponstate; + int32_t batteryCharge; + SgVec3 viewangles; + float legsYaw; + int32_t viewheight; + int32_t damageEvent; + int32_t damageYaw; + int32_t damagePitch; + int32_t damageCount; + SgArray stats; + SgArray persistant; + SgArray powerups; + SgArray ammo; + SgArray inventory; + SgArray2d security_key_message; + SgVec3 serverViewOrg; + int32_t saberInFlight; + +#ifdef JK2_MODE + int32_t saberActive; + int32_t vehicleModel; + int32_t viewEntity; + int32_t saberColor; + float saberLength; + float saberLengthMax; + int32_t forcePowersActive; +#else + int32_t viewEntity; + int32_t forcePowersActive; +#endif + + int32_t useTime; + int32_t lastShotTime; + int32_t ping; + int32_t lastOnGround; + int32_t lastStationary; + int32_t weaponShotCount; + SgArray saber; + int32_t dualSabers; + int16_t saberMove; + int16_t saberMoveNext; + int16_t saberBounceMove; + int16_t saberBlocking; + int16_t saberBlocked; + int16_t leanStopDebounceTime; + +#ifdef JK2_MODE + float saberLengthOld; +#endif + + int32_t saberEntityNum; + float saberEntityDist; + int32_t saberThrowTime; + int32_t saberEntityState; + int32_t saberDamageDebounceTime; + int32_t saberHitWallSoundDebounceTime; + int32_t saberEventFlags; + int32_t saberBlockingTime; + int32_t saberAnimLevel; + int32_t saberAttackChainCount; + int32_t saberLockTime; + int32_t saberLockEnemy; + int32_t saberStylesKnown; + +#ifdef JK2_MODE + int32_t saberModel; +#endif + + int32_t forcePowersKnown; + SgArray forcePowerDuration; + SgArray forcePowerDebounce; + int32_t forcePower; + int32_t forcePowerMax; + int32_t forcePowerRegenDebounceTime; + int32_t forcePowerRegenRate; + int32_t forcePowerRegenAmount; + SgArray forcePowerLevel; + float forceJumpZStart; + float forceJumpCharge; + int32_t forceGripEntityNum; + SgVec3 forceGripOrg; + int32_t forceDrainEntityNum; + SgVec3 forceDrainOrg; + int32_t forceHealCount; + int32_t forceAllowDeactivateTime; + int32_t forceRageDrainTime; + int32_t forceRageRecoveryTime; + int32_t forceDrainEntNum; + float forceDrainTime; + int32_t forcePowersForced; + int32_t pullAttackEntNum; + int32_t pullAttackTime; + int32_t lastKickedEntNum; + int32_t taunting; + float jumpZStart; + SgVec3 moveDir; + float waterheight; + int32_t waterHeightLevel; + int32_t ikStatus; + int32_t heldClient; + int32_t heldByClient; + int32_t heldByBolt; + int32_t heldByBone; + int32_t vehTurnaroundIndex; + int32_t vehTurnaroundTime; + int32_t brokenLimbs; + int32_t electrifyTime; +}; // SgPlayerState +#pragma pack(pop) + typedef struct playerState_s { + using SgType = SgPlayerState; + + int commandTime; // cmd->serverTime of last executed command int pm_type; int bobCycle; // for view bobbing and footstep generation @@ -2236,9 +2820,293 @@ typedef struct playerState_s { //NOTE: not really used in SP, just for Fighter Vehicle damage stuff int brokenLimbs; int electrifyTime; -} playerState_t; + void sg_export( + SgType& dst) const + { + ::sg_export(commandTime, dst.commandTime); + ::sg_export(pm_type, dst.pm_type); + ::sg_export(bobCycle, dst.bobCycle); + ::sg_export(pm_flags, dst.pm_flags); + ::sg_export(pm_time, dst.pm_time); + ::sg_export(origin, dst.origin); + ::sg_export(velocity, dst.velocity); + ::sg_export(weaponTime, dst.weaponTime); + ::sg_export(weaponChargeTime, dst.weaponChargeTime); + ::sg_export(rechargeTime, dst.rechargeTime); + ::sg_export(gravity, dst.gravity); + ::sg_export(leanofs, dst.leanofs); + ::sg_export(friction, dst.friction); + ::sg_export(speed, dst.speed); + ::sg_export(delta_angles, dst.delta_angles); + ::sg_export(groundEntityNum, dst.groundEntityNum); + ::sg_export(legsAnim, dst.legsAnim); + ::sg_export(legsAnimTimer, dst.legsAnimTimer); + ::sg_export(torsoAnim, dst.torsoAnim); + ::sg_export(torsoAnimTimer, dst.torsoAnimTimer); + ::sg_export(movementDir, dst.movementDir); + ::sg_export(eFlags, dst.eFlags); + ::sg_export(eventSequence, dst.eventSequence); + ::sg_export(events, dst.events); + ::sg_export(eventParms, dst.eventParms); + ::sg_export(externalEvent, dst.externalEvent); + ::sg_export(externalEventParm, dst.externalEventParm); + ::sg_export(externalEventTime, dst.externalEventTime); + ::sg_export(clientNum, dst.clientNum); + ::sg_export(weapon, dst.weapon); + ::sg_export(weaponstate, dst.weaponstate); + ::sg_export(batteryCharge, dst.batteryCharge); + ::sg_export(viewangles, dst.viewangles); + ::sg_export(legsYaw, dst.legsYaw); + ::sg_export(viewheight, dst.viewheight); + ::sg_export(damageEvent, dst.damageEvent); + ::sg_export(damageYaw, dst.damageYaw); + ::sg_export(damagePitch, dst.damagePitch); + ::sg_export(damageCount, dst.damageCount); + ::sg_export(stats, dst.stats); + ::sg_export(persistant, dst.persistant); + ::sg_export(powerups, dst.powerups); + ::sg_export(ammo, dst.ammo); + ::sg_export(inventory, dst.inventory); + ::sg_export(security_key_message, dst.security_key_message); + ::sg_export(serverViewOrg, dst.serverViewOrg); + ::sg_export(saberInFlight, dst.saberInFlight); + +#ifdef JK2_MODE + ::sg_export(saberActive, dst.saberActive); + ::sg_export(vehicleModel, dst.vehicleModel); + ::sg_export(viewEntity, dst.viewEntity); + ::sg_export(saberColor, dst.saberColor); + ::sg_export(saberLength, dst.saberLength); + ::sg_export(saberLengthMax, dst.saberLengthMax); + ::sg_export(forcePowersActive, dst.forcePowersActive); +#else + ::sg_export(viewEntity, dst.viewEntity); + ::sg_export(forcePowersActive, dst.forcePowersActive); +#endif + + ::sg_export(useTime, dst.useTime); + ::sg_export(lastShotTime, dst.lastShotTime); + ::sg_export(ping, dst.ping); + ::sg_export(lastOnGround, dst.lastOnGround); + ::sg_export(lastStationary, dst.lastStationary); + ::sg_export(weaponShotCount, dst.weaponShotCount); + ::sg_export(saber, dst.saber); + ::sg_export(dualSabers, dst.dualSabers); + ::sg_export(saberMove, dst.saberMove); + ::sg_export(saberMoveNext, dst.saberMoveNext); + ::sg_export(saberBounceMove, dst.saberBounceMove); + ::sg_export(saberBlocking, dst.saberBlocking); + ::sg_export(saberBlocked, dst.saberBlocked); + ::sg_export(leanStopDebounceTime, dst.leanStopDebounceTime); + +#ifdef JK2_MODE + ::sg_export(saberLengthOld, dst.saberLengthOld); +#endif + + ::sg_export(saberEntityNum, dst.saberEntityNum); + ::sg_export(saberEntityDist, dst.saberEntityDist); + ::sg_export(saberThrowTime, dst.saberThrowTime); + ::sg_export(saberEntityState, dst.saberEntityState); + ::sg_export(saberDamageDebounceTime, dst.saberDamageDebounceTime); + ::sg_export(saberHitWallSoundDebounceTime, dst.saberHitWallSoundDebounceTime); + ::sg_export(saberEventFlags, dst.saberEventFlags); + ::sg_export(saberBlockingTime, dst.saberBlockingTime); + ::sg_export(saberAnimLevel, dst.saberAnimLevel); + ::sg_export(saberAttackChainCount, dst.saberAttackChainCount); + ::sg_export(saberLockTime, dst.saberLockTime); + ::sg_export(saberLockEnemy, dst.saberLockEnemy); + ::sg_export(saberStylesKnown, dst.saberStylesKnown); + +#ifdef JK2_MODE + ::sg_export(saberModel, dst.saberModel); +#endif + + ::sg_export(forcePowersKnown, dst.forcePowersKnown); + ::sg_export(forcePowerDuration, dst.forcePowerDuration); + ::sg_export(forcePowerDebounce, dst.forcePowerDebounce); + ::sg_export(forcePower, dst.forcePower); + ::sg_export(forcePowerMax, dst.forcePowerMax); + ::sg_export(forcePowerRegenDebounceTime, dst.forcePowerRegenDebounceTime); + ::sg_export(forcePowerRegenRate, dst.forcePowerRegenRate); + ::sg_export(forcePowerRegenAmount, dst.forcePowerRegenAmount); + ::sg_export(forcePowerLevel, dst.forcePowerLevel); + ::sg_export(forceJumpZStart, dst.forceJumpZStart); + ::sg_export(forceJumpCharge, dst.forceJumpCharge); + ::sg_export(forceGripEntityNum, dst.forceGripEntityNum); + ::sg_export(forceGripOrg, dst.forceGripOrg); + ::sg_export(forceDrainEntityNum, dst.forceDrainEntityNum); + ::sg_export(forceDrainOrg, dst.forceDrainOrg); + ::sg_export(forceHealCount, dst.forceHealCount); + ::sg_export(forceAllowDeactivateTime, dst.forceAllowDeactivateTime); + ::sg_export(forceRageDrainTime, dst.forceRageDrainTime); + ::sg_export(forceRageRecoveryTime, dst.forceRageRecoveryTime); + ::sg_export(forceDrainEntNum, dst.forceDrainEntNum); + ::sg_export(forceDrainTime, dst.forceDrainTime); + ::sg_export(forcePowersForced, dst.forcePowersForced); + ::sg_export(pullAttackEntNum, dst.pullAttackEntNum); + ::sg_export(pullAttackTime, dst.pullAttackTime); + ::sg_export(lastKickedEntNum, dst.lastKickedEntNum); + ::sg_export(taunting, dst.taunting); + ::sg_export(jumpZStart, dst.jumpZStart); + ::sg_export(moveDir, dst.moveDir); + ::sg_export(waterheight, dst.waterheight); + ::sg_export(waterHeightLevel, dst.waterHeightLevel); + ::sg_export(ikStatus, dst.ikStatus); + ::sg_export(heldClient, dst.heldClient); + ::sg_export(heldByClient, dst.heldByClient); + ::sg_export(heldByBolt, dst.heldByBolt); + ::sg_export(heldByBone, dst.heldByBone); + ::sg_export(vehTurnaroundIndex, dst.vehTurnaroundIndex); + ::sg_export(vehTurnaroundTime, dst.vehTurnaroundTime); + ::sg_export(brokenLimbs, dst.brokenLimbs); + ::sg_export(electrifyTime, dst.electrifyTime); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.commandTime, commandTime); + ::sg_import(src.pm_type, pm_type); + ::sg_import(src.bobCycle, bobCycle); + ::sg_import(src.pm_flags, pm_flags); + ::sg_import(src.pm_time, pm_time); + ::sg_import(src.origin, origin); + ::sg_import(src.velocity, velocity); + ::sg_import(src.weaponTime, weaponTime); + ::sg_import(src.weaponChargeTime, weaponChargeTime); + ::sg_import(src.rechargeTime, rechargeTime); + ::sg_import(src.gravity, gravity); + ::sg_import(src.leanofs, leanofs); + ::sg_import(src.friction, friction); + ::sg_import(src.speed, speed); + ::sg_import(src.delta_angles, delta_angles); + ::sg_import(src.groundEntityNum, groundEntityNum); + ::sg_import(src.legsAnim, legsAnim); + ::sg_import(src.legsAnimTimer, legsAnimTimer); + ::sg_import(src.torsoAnim, torsoAnim); + ::sg_import(src.torsoAnimTimer, torsoAnimTimer); + ::sg_import(src.movementDir, movementDir); + ::sg_import(src.eFlags, eFlags); + ::sg_import(src.eventSequence, eventSequence); + ::sg_import(src.events, events); + ::sg_import(src.eventParms, eventParms); + ::sg_import(src.externalEvent, externalEvent); + ::sg_import(src.externalEventParm, externalEventParm); + ::sg_import(src.externalEventTime, externalEventTime); + ::sg_import(src.clientNum, clientNum); + ::sg_import(src.weapon, weapon); + ::sg_import(src.weaponstate, weaponstate); + ::sg_import(src.batteryCharge, batteryCharge); + ::sg_import(src.viewangles, viewangles); + ::sg_import(src.legsYaw, legsYaw); + ::sg_import(src.viewheight, viewheight); + ::sg_import(src.damageEvent, damageEvent); + ::sg_import(src.damageYaw, damageYaw); + ::sg_import(src.damagePitch, damagePitch); + ::sg_import(src.damageCount, damageCount); + ::sg_import(src.stats, stats); + ::sg_import(src.persistant, persistant); + ::sg_import(src.powerups, powerups); + ::sg_import(src.ammo, ammo); + ::sg_import(src.inventory, inventory); + ::sg_import(src.security_key_message, security_key_message); + ::sg_import(src.serverViewOrg, serverViewOrg); + ::sg_import(src.saberInFlight, saberInFlight); + +#ifdef JK2_MODE + ::sg_import(src.saberActive, saberActive); + ::sg_import(src.vehicleModel, vehicleModel); + ::sg_import(src.viewEntity, viewEntity); + ::sg_import(src.saberColor, saberColor); + ::sg_import(src.saberLength, saberLength); + ::sg_import(src.saberLengthMax, saberLengthMax); + ::sg_import(src.forcePowersActive, forcePowersActive); +#else + ::sg_import(src.viewEntity, viewEntity); + ::sg_import(src.forcePowersActive, forcePowersActive); +#endif + + ::sg_import(src.useTime, useTime); + ::sg_import(src.lastShotTime, lastShotTime); + ::sg_import(src.ping, ping); + ::sg_import(src.lastOnGround, lastOnGround); + ::sg_import(src.lastStationary, lastStationary); + ::sg_import(src.weaponShotCount, weaponShotCount); + ::sg_import(src.saber, saber); + ::sg_import(src.dualSabers, dualSabers); + ::sg_import(src.saberMove, saberMove); + ::sg_import(src.saberMoveNext, saberMoveNext); + ::sg_import(src.saberBounceMove, saberBounceMove); + ::sg_import(src.saberBlocking, saberBlocking); + ::sg_import(src.saberBlocked, saberBlocked); + ::sg_import(src.leanStopDebounceTime, leanStopDebounceTime); + +#ifdef JK2_MODE + ::sg_import(src.saberLengthOld, saberLengthOld); +#endif + + ::sg_import(src.saberEntityNum, saberEntityNum); + ::sg_import(src.saberEntityDist, saberEntityDist); + ::sg_import(src.saberThrowTime, saberThrowTime); + ::sg_import(src.saberEntityState, saberEntityState); + ::sg_import(src.saberDamageDebounceTime, saberDamageDebounceTime); + ::sg_import(src.saberHitWallSoundDebounceTime, saberHitWallSoundDebounceTime); + ::sg_import(src.saberEventFlags, saberEventFlags); + ::sg_import(src.saberBlockingTime, saberBlockingTime); + ::sg_import(src.saberAnimLevel, saberAnimLevel); + ::sg_import(src.saberAttackChainCount, saberAttackChainCount); + ::sg_import(src.saberLockTime, saberLockTime); + ::sg_import(src.saberLockEnemy, saberLockEnemy); + ::sg_import(src.saberStylesKnown, saberStylesKnown); + +#ifdef JK2_MODE + ::sg_import(src.saberModel, saberModel); +#endif + + ::sg_import(src.forcePowersKnown, forcePowersKnown); + ::sg_import(src.forcePowerDuration, forcePowerDuration); + ::sg_import(src.forcePowerDebounce, forcePowerDebounce); + ::sg_import(src.forcePower, forcePower); + ::sg_import(src.forcePowerMax, forcePowerMax); + ::sg_import(src.forcePowerRegenDebounceTime, forcePowerRegenDebounceTime); + ::sg_import(src.forcePowerRegenRate, forcePowerRegenRate); + ::sg_import(src.forcePowerRegenAmount, forcePowerRegenAmount); + ::sg_import(src.forcePowerLevel, forcePowerLevel); + ::sg_import(src.forceJumpZStart, forceJumpZStart); + ::sg_import(src.forceJumpCharge, forceJumpCharge); + ::sg_import(src.forceGripEntityNum, forceGripEntityNum); + ::sg_import(src.forceGripOrg, forceGripOrg); + ::sg_import(src.forceDrainEntityNum, forceDrainEntityNum); + ::sg_import(src.forceDrainOrg, forceDrainOrg); + ::sg_import(src.forceHealCount, forceHealCount); + ::sg_import(src.forceAllowDeactivateTime, forceAllowDeactivateTime); + ::sg_import(src.forceRageDrainTime, forceRageDrainTime); + ::sg_import(src.forceRageRecoveryTime, forceRageRecoveryTime); + ::sg_import(src.forceDrainEntNum, forceDrainEntNum); + ::sg_import(src.forceDrainTime, forceDrainTime); + ::sg_import(src.forcePowersForced, forcePowersForced); + ::sg_import(src.pullAttackEntNum, pullAttackEntNum); + ::sg_import(src.pullAttackTime, pullAttackTime); + ::sg_import(src.lastKickedEntNum, lastKickedEntNum); + ::sg_import(src.taunting, taunting); + ::sg_import(src.jumpZStart, jumpZStart); + ::sg_import(src.moveDir, moveDir); + ::sg_import(src.waterheight, waterheight); + ::sg_import(src.waterHeightLevel, waterHeightLevel); + ::sg_import(src.ikStatus, ikStatus); + ::sg_import(src.heldClient, heldClient); + ::sg_import(src.heldByClient, heldByClient); + ::sg_import(src.heldByBolt, heldByBolt); + ::sg_import(src.heldByBone, heldByBone); + ::sg_import(src.vehTurnaroundIndex, vehTurnaroundIndex); + ::sg_import(src.vehTurnaroundTime, vehTurnaroundTime); + ::sg_import(src.brokenLimbs, brokenLimbs); + ::sg_import(src.electrifyTime, electrifyTime); + } +} playerState_t; + //==================================================================== @@ -2284,13 +3152,58 @@ typedef enum // usercmd_t is sent to the server each client frame // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgUserCmd +{ +public: + int32_t serverTime; + int32_t buttons; + uint8_t weapon; + SgArray angles; + uint8_t generic_cmd; + int8_t forwardmove; + int8_t rightmove; + int8_t upmove; +}; // SgUserCmd +#pragma pack(pop) + typedef struct usercmd_s { + using SgType = SgUserCmd; + + int serverTime; int buttons; byte weapon; int angles[3]; byte generic_cmd; signed char forwardmove, rightmove, upmove; + + + void sg_export( + SgType& dst) const + { + ::sg_export(serverTime, dst.serverTime); + ::sg_export(buttons, dst.buttons); + ::sg_export(weapon, dst.weapon); + ::sg_export(angles, dst.angles); + ::sg_export(generic_cmd, dst.generic_cmd); + ::sg_export(forwardmove, dst.forwardmove); + ::sg_export(rightmove, dst.rightmove); + ::sg_export(upmove, dst.upmove); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.serverTime, serverTime); + ::sg_import(src.buttons, buttons); + ::sg_import(src.weapon, weapon); + ::sg_import(src.angles, angles); + ::sg_import(src.generic_cmd, generic_cmd); + ::sg_import(src.forwardmove, forwardmove); + ::sg_import(src.rightmove, rightmove); + ::sg_import(src.upmove, upmove); + } } usercmd_t; //=================================================================== @@ -2308,12 +3221,48 @@ typedef enum {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! TR_GRAVITY } trType_t; +#pragma pack(push, 4) +class SgTrajectory +{ +public: + int32_t trType; + int32_t trTime; + int32_t trDuration; + SgVec3 trBase; + SgVec3 trDelta; +}; // SgTrajectory +#pragma pack(pop) + typedef struct {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! + using SgType = SgTrajectory; + + trType_t trType; int trTime; int trDuration; // if non 0, trTime + trDuration = stop time vec3_t trBase; vec3_t trDelta; // velocity, etc + + + void sg_export( + SgType& dst) const + { + ::sg_export(trType, dst.trType); + ::sg_export(trTime, dst.trTime); + ::sg_export(trDuration, dst.trDuration); + ::sg_export(trBase, dst.trBase); + ::sg_export(trDelta, dst.trDelta); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.trType, trType); + ::sg_import(src.trTime, trTime); + ::sg_import(src.trDuration, trDuration); + ::sg_import(src.trBase, trBase); + ::sg_import(src.trDelta, trDelta); + } } trajectory_t; @@ -2324,7 +3273,62 @@ typedef struct {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! // The messages are delta compressed, so it doesn't really matter if // the structure size is fairly large +#pragma pack(push, 4) +class SgEntityState +{ +public: + int32_t number; + int32_t eType; + int32_t eFlags; + SgTrajectory pos; + SgTrajectory apos; + int32_t time; + int32_t time2; + SgVec3 origin; + SgVec3 origin2; + SgVec3 angles; + SgVec3 angles2; + int32_t otherEntityNum; + int32_t otherEntityNum2; + int32_t groundEntityNum; + int32_t constantLight; + int32_t loopSound; + int32_t modelindex; + int32_t modelindex2; + int32_t modelindex3; + int32_t clientNum; + int32_t frame; + int32_t solid; + int32_t event; + int32_t eventParm; + int32_t powerups; + int32_t weapon; + int32_t legsAnim; + int32_t legsAnimTimer; + int32_t torsoAnim; + int32_t torsoAnimTimer; + int32_t scale; + int32_t saberInFlight; + int32_t saberActive; + +#ifdef JK2_MODE + int32_t vehicleModel; +#endif + + SgVec3 vehicleAngles; + int32_t vehicleArmor; + int32_t m_iVehicleNum; + SgVec3 modelScale; + int32_t radius; + int32_t boltInfo; + int32_t isPortalEnt; +}; // SgEntityState +#pragma pack(pop) + typedef struct entityState_s {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!!!!! + using SgType = SgEntityState; + + int number; // entity index int eType; // entityType_t int eFlags; @@ -2396,8 +3400,109 @@ Ghoul2 Insert End qboolean isPortalEnt; + + void sg_export( + SgType& dst) const + { + ::sg_export(number, dst.number); + ::sg_export(eType, dst.eType); + ::sg_export(eFlags, dst.eFlags); + ::sg_export(pos, dst.pos); + ::sg_export(apos, dst.apos); + ::sg_export(time, dst.time); + ::sg_export(time2, dst.time2); + ::sg_export(origin, dst.origin); + ::sg_export(origin2, dst.origin2); + ::sg_export(angles, dst.angles); + ::sg_export(angles2, dst.angles2); + ::sg_export(otherEntityNum, dst.otherEntityNum); + ::sg_export(otherEntityNum2, dst.otherEntityNum2); + ::sg_export(groundEntityNum, dst.groundEntityNum); + ::sg_export(constantLight, dst.constantLight); + ::sg_export(loopSound, dst.loopSound); + ::sg_export(modelindex, dst.modelindex); + ::sg_export(modelindex2, dst.modelindex2); + ::sg_export(modelindex3, dst.modelindex3); + ::sg_export(clientNum, dst.clientNum); + ::sg_export(frame, dst.frame); + ::sg_export(solid, dst.solid); + ::sg_export(event, dst.event); + ::sg_export(eventParm, dst.eventParm); + ::sg_export(powerups, dst.powerups); + ::sg_export(weapon, dst.weapon); + ::sg_export(legsAnim, dst.legsAnim); + ::sg_export(legsAnimTimer, dst.legsAnimTimer); + ::sg_export(torsoAnim, dst.torsoAnim); + ::sg_export(torsoAnimTimer, dst.torsoAnimTimer); + ::sg_export(scale, dst.scale); + ::sg_export(saberInFlight, dst.saberInFlight); + ::sg_export(saberActive, dst.saberActive); + +#ifdef JK2_MODE + ::sg_export(vehicleModel, dst.vehicleModel); +#endif + + ::sg_export(vehicleAngles, dst.vehicleAngles); + ::sg_export(vehicleArmor, dst.vehicleArmor); + ::sg_export(m_iVehicleNum, dst.m_iVehicleNum); + ::sg_export(modelScale, dst.modelScale); + ::sg_export(radius, dst.radius); + ::sg_export(boltInfo, dst.boltInfo); + ::sg_export(isPortalEnt, dst.isPortalEnt); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.number, number); + ::sg_import(src.eType, eType); + ::sg_import(src.eFlags, eFlags); + ::sg_import(src.pos, pos); + ::sg_import(src.apos, apos); + ::sg_import(src.time, time); + ::sg_import(src.time2, time2); + ::sg_import(src.origin, origin); + ::sg_import(src.origin2, origin2); + ::sg_import(src.angles, angles); + ::sg_import(src.angles2, angles2); + ::sg_import(src.otherEntityNum, otherEntityNum); + ::sg_import(src.otherEntityNum2, otherEntityNum2); + ::sg_import(src.groundEntityNum, groundEntityNum); + ::sg_import(src.constantLight, constantLight); + ::sg_import(src.loopSound, loopSound); + ::sg_import(src.modelindex, modelindex); + ::sg_import(src.modelindex2, modelindex2); + ::sg_import(src.modelindex3, modelindex3); + ::sg_import(src.clientNum, clientNum); + ::sg_import(src.frame, frame); + ::sg_import(src.solid, solid); + ::sg_import(src.event, event); + ::sg_import(src.eventParm, eventParm); + ::sg_import(src.powerups, powerups); + ::sg_import(src.weapon, weapon); + ::sg_import(src.legsAnim, legsAnim); + ::sg_import(src.legsAnimTimer, legsAnimTimer); + ::sg_import(src.torsoAnim, torsoAnim); + ::sg_import(src.torsoAnimTimer, torsoAnimTimer); + ::sg_import(src.scale, scale); + ::sg_import(src.saberInFlight, saberInFlight); + ::sg_import(src.saberActive, saberActive); + +#ifdef JK2_MODE + ::sg_import(src.vehicleModel, vehicleModel); +#endif + + ::sg_import(src.vehicleAngles, vehicleAngles); + ::sg_import(src.vehicleArmor, vehicleArmor); + ::sg_import(src.m_iVehicleNum, m_iVehicleNum); + ::sg_import(src.modelScale, modelScale); + ::sg_import(src.radius, radius); + ::sg_import(src.boltInfo, boltInfo); + ::sg_import(src.isPortalEnt, isPortalEnt); + } } entityState_t; + typedef enum { CA_UNINITIALIZED, CA_DISCONNECTED, // not talking to a server diff --git a/code/qcommon/qcommon.h b/code/qcommon/qcommon.h index 30e83125cc..bd79f4b51f 100644 --- a/code/qcommon/qcommon.h +++ b/code/qcommon/qcommon.h @@ -594,7 +594,7 @@ void NORETURN QDECL Com_Error( int code, const char *fmt, ... ); void NORETURN Com_Quit_f( void ); int Com_EventLoop( void ); int Com_Milliseconds( void ); // will be journaled properly -unsigned Com_BlockChecksum( const void *buffer, int length ); +uint32_t Com_BlockChecksum( const void *buffer, int length ); int Com_Filter(const char *filter, const char *name, int casesensitive); int Com_FilterPath(const char *filter, const char *name, int casesensitive); qboolean Com_SafeMode( void ); diff --git a/code/rd-common/mdx_format.h b/code/rd-common/mdx_format.h index fb65d56cbe..b569fc6a8d 100644 --- a/code/rd-common/mdx_format.h +++ b/code/rd-common/mdx_format.h @@ -158,8 +158,37 @@ mdxaCompQuatBone_t #ifndef MDXABONEDEF +#ifdef __cplusplus +#pragma pack(push, 4) +class SgMdxaBone +{ +public: + SgArray2d matrix; +}; // SgMdxaBone +#pragma pack(pop) +#endif // __cplusplus + typedef struct { +#ifdef __cplusplus + using SgType = SgMdxaBone; +#endif // __cplusplus + float matrix[3][4]; + + +#ifdef __cplusplus + void sg_export( + SgType& dst) const + { + ::sg_export(matrix, dst.matrix); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.matrix, matrix); + } +#endif // __cplusplus } mdxaBone_t; #endif diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index 72ee342398..da89b3f523 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -78,6 +78,7 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" + "${SharedDir}/qcommon/ojk_sg_wrappers.h" ${SharedCommonFiles} ) diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index 46c35289d9..b9cf1ef9b8 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -1760,9 +1760,15 @@ void *G2_FindSurface(const model_s *mod, int index, int lod) return (void *)current; } +#if 0 #define SURFACE_SAVE_BLOCK_SIZE sizeof(surfaceInfo_t) #define BOLT_SAVE_BLOCK_SIZE sizeof(boltInfo_t) #define BONE_SAVE_BLOCK_SIZE sizeof(boneInfo_t) +#else +const auto SURFACE_SAVE_BLOCK_SIZE = static_cast(sizeof(SgSurfaceInfo)); +const auto BOLT_SAVE_BLOCK_SIZE = static_cast(sizeof(SgBoltInfo)); +const auto BONE_SAVE_BLOCK_SIZE = static_cast(sizeof(SgBoneInfo)); +#endif void G2_SaveGhoul2Models(CGhoul2Info_v &ghoul2) { @@ -1854,7 +1860,7 @@ void G2_SaveGhoul2Models(CGhoul2Info_v &ghoul2) void G2_LoadGhoul2Model(CGhoul2Info_v &ghoul2, char *buffer) { // first thing, lets see how many ghoul2 models we have, and resize our buffers accordingly - int newSize = *(int*)buffer; + auto newSize = *(int32_t*)buffer; ghoul2.resize(newSize); buffer += 4; @@ -1866,7 +1872,7 @@ void G2_LoadGhoul2Model(CGhoul2Info_v &ghoul2, char *buffer) } // this one isn't a define since I couldn't work out how to figure it out at compile time - const int ghoul2BlockSize = (intptr_t)&ghoul2[0].mTransformedVertsArray - (intptr_t)&ghoul2[0].mModelindex; + constexpr auto ghoul2BlockSize = static_cast(sizeof(SgCGhoul2Info)); // now we have enough instances, lets go through each one and load up the relevant details for (int i=0; i(buffer), + ghoul2[i]); + buffer +=ghoul2BlockSize; if (ghoul2[i].mModelindex!=-1&&ghoul2[i].mFileName[0]) @@ -1886,35 +1895,44 @@ void G2_LoadGhoul2Model(CGhoul2Info_v &ghoul2, char *buffer) } // give us enough surfaces to load up the data - ghoul2[i].mSlist.resize(*(int*)buffer); + ghoul2[i].mSlist.resize(*(int32_t*)buffer); buffer +=4; // now load all the surfaces for (size_t x=0; x(buffer), + ghoul2[i].mSlist[x]); + buffer += SURFACE_SAVE_BLOCK_SIZE; } // give us enough bones to load up the data - ghoul2[i].mBlist.resize(*(int*)buffer); + ghoul2[i].mBlist.resize(*(int32_t*)buffer); buffer +=4; // now load all the bones for (size_t x = 0; x(buffer), + ghoul2[i].mBlist[x]); + buffer += BONE_SAVE_BLOCK_SIZE; } // give us enough bolts to load up the data - ghoul2[i].mBltlist.resize(*(int*)buffer); + ghoul2[i].mBltlist.resize(*(int32_t*)buffer); buffer +=4; // now load all the bolts for (size_t x = 0; x(buffer), + ghoul2[i].mBltlist[x]); + buffer += BOLT_SAVE_BLOCK_SIZE; } } diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index d181b7cf53..55614a00fa 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -257,7 +257,7 @@ qboolean SG_Open( const char *psPathlessBaseName ) return qfalse; } giSaveGameVersion=-1;//jic - SG_Read(INT_ID('_','V','E','R'), &giSaveGameVersion, sizeof(giSaveGameVersion)); + ::sg_read(::SG_Read, INT_ID('_','V','E','R'), ::giSaveGameVersion); if (giSaveGameVersion != iSAVEGAME_VERSION) { SG_Close(); @@ -579,7 +579,7 @@ static void WriteGame(qboolean autosave) static qboolean ReadGame (void) { qboolean qbAutoSave; - SG_Read(INT_ID('G','A','M','E'), (void *)&qbAutoSave, sizeof(qbAutoSave)); + ::sg_read(::SG_Read, INT_ID('G','A','M','E'), qbAutoSave); if (qbAutoSave) { @@ -588,25 +588,25 @@ static qboolean ReadGame (void) // read health/armour etc... // memset(s,0,sizeof(s)); - SG_Read(INT_ID('C','V','S','V'), (void *)&s, sizeof(s)); + ::sg_read_no_cast(::SG_Read, INT_ID('C','V','S','V'), s); Cvar_Set( sCVARNAME_PLAYERSAVE, s ); // read ammo... // memset(s,0,sizeof(s)); - SG_Read(INT_ID('A','M','M','O'), (void *)&s, sizeof(s)); + ::sg_read_no_cast(::SG_Read, INT_ID('A','M','M','O'), s); Cvar_Set( "playerammo", s); // read inventory... // memset(s,0,sizeof(s)); - SG_Read(INT_ID('I','V','T','Y'), (void *)&s, sizeof(s)); + ::sg_read_no_cast(::SG_Read, INT_ID('I','V','T','Y'), s); Cvar_Set( "playerinv", s); // read force powers... // memset(s,0,sizeof(s)); - SG_Read(INT_ID('F','P','L','V'), (void *)&s, sizeof(s)); + ::sg_read_no_cast(::SG_Read, INT_ID('F','P','L','V'), s); Cvar_Set( "playerfplvl", s ); } @@ -668,12 +668,12 @@ void SG_ReadCvars(void) char *psName; char *psValue; - SG_Read(INT_ID('C','V','C','N'), &iCount, sizeof(iCount)); + ::sg_read(::SG_Read, INT_ID('C','V','C','N'), iCount); for (int i = 0; i < iCount; i++) { - SG_Read(INT_ID('C','V','A','R'), NULL, 0, (void **)&psName); - SG_Read(INT_ID('V','A','L','U'), NULL, 0, (void **)&psValue); + ::sg_read_allocate(::SG_Read, INT_ID('C','V','A','R'), psName); + ::sg_read_allocate(::SG_Read, INT_ID('V','A','L','U'), psValue); Cvar_Set (psName, psValue); @@ -737,7 +737,7 @@ void SG_ReadServerConfigStrings( void ) // int iCount; - SG_Read(INT_ID('C','S','C','N'), &iCount, sizeof(iCount)); + ::sg_read(::SG_Read, INT_ID('C','S','C','N'), iCount); Com_DPrintf( "Reading %d configstrings...\n",iCount); @@ -746,8 +746,8 @@ void SG_ReadServerConfigStrings( void ) int iIndex; char *psName; - SG_Read(INT_ID('C','S','I','N'), &iIndex, sizeof(iIndex)); - SG_Read(INT_ID('C','S','D','A'), NULL, 0, (void **)&psName); + ::sg_read(::SG_Read, INT_ID('C','S','I','N'), iIndex); + ::sg_read_allocate(::SG_Read, INT_ID('C','S','D','A'), psName); Com_DPrintf( "Cfg str %d = %s\n",iIndex, psName); @@ -808,19 +808,19 @@ int SG_GetSaveGameComment(const char *psPathlessBaseName, char *sComment, char * return 0; } - if (SG_Read( INT_ID('C','O','M','M'), sComment, iSG_COMMENT_SIZE )) + if (::sg_read_no_cast(::SG_Read, INT_ID('C','O','M','M'), sComment, iSG_COMMENT_SIZE )) { unsigned int fileTime = 0; - if (SG_Read( INT_ID('C','M','T','M'), &fileTime, sizeof(fileTime))) //read + if (::sg_read(::SG_Read, INT_ID('C','M','T','M'), fileTime)) //read { tFileTime = SG_GetTime (fileTime); #ifdef JK2_MODE - if (SG_Read(INT_ID('S','H','L','N'), &iScreenShotLength, sizeof(iScreenShotLength))) + if (::sg_read(::SG_Read, INT_ID('S','H','L','N'), iScreenShotLength)) { - if (SG_Read(INT_ID('S','H','O','T'), NULL, iScreenShotLength, NULL)) + if (::sg_read_skip(::SG_Read, INT_ID('S','H','O','T'), iScreenShotLength)) { #endif - if (SG_Read(INT_ID('M','P','C','M'), sMapName, iSG_MAPCMD_SIZE )) // read + if (::sg_read_no_cast(::SG_Read, INT_ID('M','P','C','M'), sMapName, iSG_MAPCMD_SIZE)) // read { ret = tFileTime; } @@ -868,7 +868,7 @@ static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest) // get JPG screenshot data length... // size_t iScreenShotLength = 0; - SG_Read(INT_ID('S','H','L','N'), &iScreenShotLength, sizeof(iScreenShotLength)); + ::sg_read(::SG_Read, INT_ID('S','H','L','N'), iScreenShotLength); // // alloc enough space plus extra 4K for sloppy JPG-decode reader to not do memory access violation... // @@ -876,7 +876,7 @@ static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest) // // now read the JPG data... // - SG_Read(INT_ID('S','H','O','T'), pJPGData, iScreenShotLength, 0); + ::sg_read_no_cast(::SG_Read, INT_ID('S','H','O','T'), pJPGData, iScreenShotLength); // // decompress JPG data... // @@ -920,8 +920,8 @@ qboolean SG_GetSaveImage( const char *psPathlessBaseName, void *pvAddress ) return qfalse; } - SG_Read(INT_ID('C','O','M','M'), NULL, 0, NULL); // skip - SG_Read(INT_ID('C','M','T','M'), NULL, sizeof( unsigned int )); + ::sg_read_skip(::SG_Read, INT_ID('C','O','M','M'), 0); // skip + ::sg_read_skip(::SG_Read, INT_ID('C','M','T','M')); qboolean bGotSaveImage = SG_ReadScreenshot(qfalse, pvAddress); @@ -1116,14 +1116,14 @@ qboolean SG_ReadSavegame(const char *psPathlessBaseName) // Read in all the server data... // - SG_Read(INT_ID('C','O','M','M'), sComment, sizeof(sComment)); + ::sg_read_no_cast(::SG_Read, INT_ID('C','O','M','M'), sComment); Com_DPrintf("Reading: %s\n", sComment); - SG_Read( INT_ID('C','M','T','M'), NULL, sizeof( unsigned int )); + ::sg_read_skip(::SG_Read, INT_ID('C','M','T','M')); #ifdef JK2_MODE SG_ReadScreenshot(qtrue); // qboolean qbSetAsLoadingScreen #endif - SG_Read(INT_ID('M','P','C','M'), sMapCmd, sizeof(sMapCmd)); + ::sg_read_no_cast(::SG_Read, INT_ID('M','P','C','M'), sMapCmd); SG_ReadCvars(); // read game state @@ -1136,8 +1136,8 @@ qboolean SG_ReadSavegame(const char *psPathlessBaseName) // if (!qbAutosave) { - SG_Read(INT_ID('T','I','M','E'), (void *)&sv.time, sizeof(sv.time)); - SG_Read(INT_ID('T','I','M','R'), (void *)&sv.timeResidual, sizeof(sv.timeResidual)); + ::sg_read(::SG_Read, INT_ID('T','I','M','E'), ::sv.time); + ::sg_read(::SG_Read, INT_ID('T','I','M','R'), ::sv.timeResidual); CM_ReadPortalState(); SG_ReadServerConfigStrings(); } diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index 4023f36ac8..15f1ebcd64 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -1644,8 +1644,8 @@ void CG_WriteTheEvilCGHackStuff(void) } void CG_ReadTheEvilCGHackStuff(void) { - gi.ReadFromSaveGame(INT_ID('F','P','S','L'), (void *)&gi_cg_forcepowerSelect, sizeof(gi_cg_forcepowerSelect), NULL); - gi.ReadFromSaveGame(INT_ID('I','V','S','L'), (void *)&gi_cg_inventorySelect, sizeof(gi_cg_inventorySelect), NULL); + ::sg_read(::gi, INT_ID('F','P','S','L'), gi_cg_forcepowerSelect); + ::sg_read(::gi, INT_ID('I','V','S','L'), gi_cg_inventorySelect); gbUseTheseValuesFromLoadSave = qtrue; } diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index 669e2c1d90..a73dd0dafc 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -232,7 +232,8 @@ set(JK2SPGameCommonFiles "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SPDir}/qcommon/strippublic.h" - + "${SharedDir}/qcommon/ojk_sg_wrappers.h" + ${SharedCommonFiles} ) source_group("common" FILES ${JK2SPGameCommonFiles}) diff --git a/codeJK2/game/G_Timer.cpp b/codeJK2/game/G_Timer.cpp index 9550b00a9d..ef7f2d470f 100644 --- a/codeJK2/game/G_Timer.cpp +++ b/codeJK2/game/G_Timer.cpp @@ -216,7 +216,7 @@ void TIMER_Load( void ) { int numTimers; - gi.ReadFromSaveGame( INT_ID('T','I','M','E'), (void *)&numTimers, sizeof(numTimers), NULL ); + ::sg_read(::gi, INT_ID('T','I','M','E'), numTimers); //Make sure there's something to read if ( numTimers == 0 ) @@ -230,7 +230,7 @@ void TIMER_Load( void ) assert (sizeof(g_timers[0]->time) == sizeof(time) );//make sure we're reading the same size as we wrote - gi.ReadFromSaveGame( INT_ID('T','S','L','N'), (void *) &length, sizeof( length ), NULL ); + ::sg_read(::gi, INT_ID('T','S','L','N'), length); if ( length >= 1024 ) { assert( 0 ); @@ -238,8 +238,8 @@ void TIMER_Load( void ) } //Read the id and time - gi.ReadFromSaveGame( INT_ID('T','S','N','M'), (char *) tempBuffer, length, NULL ); - gi.ReadFromSaveGame( INT_ID('T','D','T','A'), (void *) &time, sizeof( time ), NULL ); + ::sg_read_no_cast(::gi, INT_ID('T','S','N','M'), tempBuffer, length); + ::sg_read(::gi, INT_ID('T','D','T','A'), time); //this is odd, we saved all the timers in the autosave, but not all the ents are spawned yet from an auto load, so skip it if (ent->inuse) diff --git a/codeJK2/game/Q3_Registers.cpp b/codeJK2/game/Q3_Registers.cpp index 16c209931f..310813843b 100644 --- a/codeJK2/game/Q3_Registers.cpp +++ b/codeJK2/game/Q3_Registers.cpp @@ -360,19 +360,19 @@ void Q3_VariableLoadFloats( varFloat_m &fmap ) int numFloats; char tempBuffer[1024]; - gi.ReadFromSaveGame( INT_ID('F','V','A','R'), &numFloats, sizeof( numFloats ), NULL ); + ::sg_read(::gi, INT_ID('F','V','A','R'), numFloats); for ( int i = 0; i < numFloats; i++ ) { int idSize; - gi.ReadFromSaveGame( INT_ID('F','I','D','L'), &idSize, sizeof( idSize ), NULL ); - gi.ReadFromSaveGame( INT_ID('F','I','D','S'), &tempBuffer, idSize, NULL ); + ::sg_read(::gi, INT_ID('F','I','D','L'), idSize); + ::sg_read_no_cast(::gi, INT_ID('F','I','D','S'), tempBuffer, idSize); tempBuffer[ idSize ] = 0; float val; - gi.ReadFromSaveGame( INT_ID('F','V','A','L'), &val, sizeof( float ), NULL ); + ::sg_read(::gi, INT_ID('F','V','A','L'), val); Q3_DeclareVariable( TK_FLOAT, (const char *) &tempBuffer ); Q3_SetFloatVariable( (const char *) &tempBuffer, val ); @@ -391,18 +391,18 @@ void Q3_VariableLoadStrings( int type, varString_m &fmap ) char tempBuffer[1024]; char tempBuffer2[1024]; - gi.ReadFromSaveGame( INT_ID('S','V','A','R'), &numFloats, sizeof( numFloats ), NULL ); + ::sg_read(::gi, INT_ID('S','V','A','R'), numFloats); for ( int i = 0; i < numFloats; i++ ) { int idSize; - gi.ReadFromSaveGame( INT_ID('S','I','D','L'), &idSize, sizeof( idSize ), NULL ); - gi.ReadFromSaveGame( INT_ID('S','I','D','S'), &tempBuffer, idSize, NULL ); + ::sg_read(::gi, INT_ID('S','I','D','L'), idSize); + ::sg_read_no_cast(::gi, INT_ID('S','I','D','S'), tempBuffer, idSize); tempBuffer[ idSize ] = 0; - gi.ReadFromSaveGame( INT_ID('S','V','S','Z'), &idSize, sizeof( idSize ), NULL ); - gi.ReadFromSaveGame( INT_ID('S','V','A','L'), &tempBuffer2, idSize, NULL ); + ::sg_read(::gi, INT_ID('S','V','S','Z'), idSize); + ::sg_read_no_cast(::gi, INT_ID('S','V','A','L'), tempBuffer2, idSize); tempBuffer2[ idSize ] = 0; switch ( type ) diff --git a/codeJK2/game/ai.h b/codeJK2/game/ai.h index de733501d8..48d3a5c407 100644 --- a/codeJK2/game/ai.h +++ b/codeJK2/game/ai.h @@ -105,18 +105,78 @@ void NPC_BSHowler_Default( void ); //Group AI #define MAX_FRAME_GROUPS 32 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgAiGroupMember +{ +public: + int32_t number; + int32_t waypoint; + int32_t pathCostToEnemy; + int32_t closestBuddy; +}; // SgAiGroupMember +#pragma pack(pop) + typedef struct AIGroupMember_s { + using SgType = SgAiGroupMember; + + int number; int waypoint; int pathCostToEnemy; int closestBuddy; + + + void sg_export( + SgType& dst) const + { + ::sg_export(number, dst.number); + ::sg_export(waypoint, dst.waypoint); + ::sg_export(pathCostToEnemy, dst.pathCostToEnemy); + ::sg_export(closestBuddy, dst.closestBuddy); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.number, number); + ::sg_import(src.waypoint, waypoint); + ::sg_import(src.pathCostToEnemy, pathCostToEnemy); + ::sg_import(src.closestBuddy, closestBuddy); + } } AIGroupMember_t; #define MAX_GROUP_MEMBERS 32 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgAiGroupInfo +{ +public: + int32_t numGroup; + int32_t processed; + int32_t team; + int32_t enemy; + int32_t enemyWP; + int32_t speechDebounceTime; + int32_t lastClearShotTime; + int32_t lastSeenEnemyTime; + int32_t morale; + int32_t moraleAdjust; + int32_t moraleDebounce; + int32_t memberValidateTime; + int32_t activeMemberNum; + int32_t commander; + SgVec3 enemyLastSeenPos; + SgArray numState; + SgArray member; +}; // SgAiGroupInfo +#pragma pack(pop) + typedef struct AIGroupInfo_s { + using SgType = SgAiGroupInfo; + + int numGroup; qboolean processed; team_t team; @@ -134,6 +194,51 @@ typedef struct AIGroupInfo_s vec3_t enemyLastSeenPos; int numState[ NUM_SQUAD_STATES ]; AIGroupMember_t member[ MAX_GROUP_MEMBERS ]; + + + void sg_export( + SgType& dst) const + { + ::sg_export(numGroup, dst.numGroup); + ::sg_export(processed, dst.processed); + ::sg_export(team, dst.team); + ::sg_export(enemy, dst.enemy); + ::sg_export(enemyWP, dst.enemyWP); + ::sg_export(speechDebounceTime, dst.speechDebounceTime); + ::sg_export(lastClearShotTime, dst.lastClearShotTime); + ::sg_export(lastSeenEnemyTime, dst.lastSeenEnemyTime); + ::sg_export(morale, dst.morale); + ::sg_export(moraleAdjust, dst.moraleAdjust); + ::sg_export(moraleDebounce, dst.moraleDebounce); + ::sg_export(memberValidateTime, dst.memberValidateTime); + ::sg_export(activeMemberNum, dst.activeMemberNum); + ::sg_export(commander, dst.commander); + ::sg_export(enemyLastSeenPos, dst.enemyLastSeenPos); + ::sg_export(numState, dst.numState); + ::sg_export(member, dst.member); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.numGroup, numGroup); + ::sg_import(src.processed, processed); + ::sg_import(src.team, team); + ::sg_import(src.enemy, enemy); + ::sg_import(src.enemyWP, enemyWP); + ::sg_import(src.speechDebounceTime, speechDebounceTime); + ::sg_import(src.lastClearShotTime, lastClearShotTime); + ::sg_import(src.lastSeenEnemyTime, lastSeenEnemyTime); + ::sg_import(src.morale, morale); + ::sg_import(src.moraleAdjust, moraleAdjust); + ::sg_import(src.moraleDebounce, moraleDebounce); + ::sg_import(src.memberValidateTime, memberValidateTime); + ::sg_import(src.activeMemberNum, activeMemberNum); + ::sg_import(src.commander, commander); + ::sg_import(src.enemyLastSeenPos, enemyLastSeenPos); + ::sg_import(src.numState, numState); + ::sg_import(src.member, member); + } } AIGroupInfo_t; int AI_GetGroupSize( vec3_t origin, int radius, team_t playerTeam, gentity_t *avoid = NULL ); diff --git a/codeJK2/game/anims.h b/codeJK2/game/anims.h index 5867ac25c0..b8675487c4 100644 --- a/codeJK2/game/anims.h +++ b/codeJK2/game/anims.h @@ -1399,13 +1399,49 @@ extern stringID_table_t animTable [MAX_ANIMATIONS+1]; #endif// #ifndef CG_PLAYER_CPP // !!!!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!!!! +#pragma pack(push, 4) +class SgAnimFileSet +{ +public: + SgArray filename; + SgArray animations; + SgArray torsoAnimSnds; + SgArray legsAnimSnds; + int32_t soundsCached; +}; // SgAnimFileSet +#pragma pack(pop) + typedef struct { + using SgType = SgAnimFileSet; + + char filename[MAX_QPATH]; animation_t animations[MAX_ANIMATIONS]; animsounds_t torsoAnimSnds[MAX_ANIM_SOUNDS]; animsounds_t legsAnimSnds[MAX_ANIM_SOUNDS]; qboolean soundsCached; + + + void sg_export( + SgType& dst) const + { + ::sg_export(filename, dst.filename); + ::sg_export(animations, dst.animations); + ::sg_export(torsoAnimSnds, dst.torsoAnimSnds); + ::sg_export(legsAnimSnds, dst.legsAnimSnds); + ::sg_export(soundsCached, dst.soundsCached); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.filename, filename); + ::sg_import(src.animations, animations); + ::sg_import(src.torsoAnimSnds, torsoAnimSnds); + ::sg_import(src.legsAnimSnds, legsAnimSnds); + ::sg_import(src.soundsCached, soundsCached); + } } animFileSet_t; #define MAX_ANIM_FILES 64 diff --git a/codeJK2/game/b_public.h b/codeJK2/game/b_public.h index add489e5c0..38ff023a3f 100644 --- a/codeJK2/game/b_public.h +++ b/codeJK2/game/b_public.h @@ -114,8 +114,36 @@ typedef enum //# movetype_e NUM_MOVETYPES } movetype_t; +#pragma pack(push, 4) +class SgGNpcStats +{ +public: + int32_t aggression; + int32_t aim; + float earshot; + int32_t evasion; + int32_t hfov; + int32_t intelligence; + int32_t move; + int32_t reactions; + float shootDistance; + int32_t vfov; + float vigilance; + float visrange; + int32_t moveType; + int32_t runSpeed; + int32_t walkSpeed; + float yawSpeed; + int32_t health; + int32_t acceleration; +}; // SgGNpcStats +#pragma pack(pop) + typedef struct gNPCstats_e {//Stats, loaded in, and can be set by scripts + using SgType = SgGNpcStats; + + //AI int aggression; // " int aim; // " @@ -136,6 +164,53 @@ typedef struct gNPCstats_e float yawSpeed; // 1 - whatever, default is 50 int health; int acceleration; + + + void sg_export( + SgType& dst) const + { + ::sg_export(aggression, dst.aggression); + ::sg_export(aim, dst.aim); + ::sg_export(earshot, dst.earshot); + ::sg_export(evasion, dst.evasion); + ::sg_export(hfov, dst.hfov); + ::sg_export(intelligence, dst.intelligence); + ::sg_export(move, dst.move); + ::sg_export(reactions, dst.reactions); + ::sg_export(shootDistance, dst.shootDistance); + ::sg_export(vfov, dst.vfov); + ::sg_export(vigilance, dst.vigilance); + ::sg_export(visrange, dst.visrange); + ::sg_export(moveType, dst.moveType); + ::sg_export(runSpeed, dst.runSpeed); + ::sg_export(walkSpeed, dst.walkSpeed); + ::sg_export(yawSpeed, dst.yawSpeed); + ::sg_export(health, dst.health); + ::sg_export(acceleration, dst.acceleration); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.aggression, aggression); + ::sg_import(src.aim, aim); + ::sg_import(src.earshot, earshot); + ::sg_import(src.evasion, evasion); + ::sg_import(src.hfov, hfov); + ::sg_import(src.intelligence, intelligence); + ::sg_import(src.move, move); + ::sg_import(src.reactions, reactions); + ::sg_import(src.shootDistance, shootDistance); + ::sg_import(src.vfov, vfov); + ::sg_import(src.vigilance, vigilance); + ::sg_import(src.visrange, visrange); + ::sg_import(src.moveType, moveType); + ::sg_import(src.runSpeed, runSpeed); + ::sg_import(src.walkSpeed, walkSpeed); + ::sg_import(src.yawSpeed, yawSpeed); + ::sg_import(src.health, health); + ::sg_import(src.acceleration, acceleration); + } } gNPCstats_t; // NOTE!!! If you add any ptr fields into this structure could you please tell me so I can update the load/save code? @@ -145,8 +220,118 @@ typedef struct gNPCstats_e #define MAX_ENEMY_POS_LAG 2400 #define ENEMY_POS_LAG_INTERVAL 100 #define ENEMY_POS_LAG_STEPS (MAX_ENEMY_POS_LAG/ENEMY_POS_LAG_INTERVAL) + +#pragma pack(push, 4) +class SgGNpc +{ +public: + int32_t timeOfDeath; + int32_t touchedByPlayer; + int32_t enemyLastVisibility; + int32_t aimTime; + float desiredYaw; + float desiredPitch; + float lockedDesiredYaw; + float lockedDesiredPitch; + int32_t aimingBeam; + SgVec3 enemyLastSeenLocation; + int32_t enemyLastSeenTime; + SgVec3 enemyLastHeardLocation; + int32_t enemyLastHeardTime; + int32_t lastAlertID; + int32_t eFlags; + int32_t aiFlags; + int32_t currentAmmo; + int32_t shotTime; + int32_t burstCount; + int32_t burstMin; + int32_t burstMean; + int32_t burstMax; + int32_t burstSpacing; + int32_t attackHold; + int32_t attackHoldTime; + SgVec3 shootAngles; + int32_t rank; + int32_t behaviorState; + int32_t defaultBehavior; + int32_t tempBehavior; + int32_t ignorePain; + int32_t duckDebounceTime; + int32_t walkDebounceTime; + int32_t enemyCheckDebounceTime; + int32_t investigateDebounceTime; + int32_t investigateCount; + SgVec3 investigateGoal; + int32_t investigateSoundDebounceTime; + int32_t greetingDebounceTime; + int32_t eventOwner; + int32_t coverTarg; + int32_t jumpState; + float followDist; + int32_t tempGoal; + int32_t goalEntity; + int32_t lastGoalEntity; + int32_t eventualGoal; + int32_t captureGoal; + int32_t defendEnt; + int32_t greetEnt; + int32_t goalTime; + int32_t straightToGoal; + float distToGoal; + int32_t navTime; + int32_t blockingEntNum; + int32_t blockedSpeechDebounceTime; + int32_t lastSideStepSide; + int32_t sideStepHoldTime; + int32_t homeWp; + int32_t group; + SgVec3 lastPathAngles; + SgGNpcStats stats; + int32_t aimErrorDebounceTime; + float lastAimErrorYaw; + float lastAimErrorPitch; + SgVec3 aimOfs; + int32_t currentAim; + int32_t currentAggression; + int32_t scriptFlags; + int32_t desiredSpeed; + int32_t currentSpeed; + int8_t last_forwardmove; + int8_t last_rightmove; + SgVec3 lastClearOrigin; + int32_t consecutiveBlockedMoves; + int32_t blockedDebounceTime; + int32_t shoveCount; + SgVec3 blockedDest; + int32_t combatPoint; + int32_t lastFailedCombatPoint; + int32_t movementSpeech; + float movementSpeechChance; + int32_t nextBStateThink; + SgUserCmd last_ucmd; + int32_t combatMove; + int32_t goalRadius; + int32_t pauseTime; + int32_t standTime; + int32_t localState; + int32_t squadState; + int32_t confusionTime; + int32_t charmedTime; + int32_t controlledTime; + int32_t surrenderTime; + SgArray enemyLaggedPos; + int32_t watchTarget; + int32_t ffireCount; + int32_t ffireDebounce; + int32_t ffireFadeDebounce; +}; // SgGNpc +#pragma pack(pop) + typedef struct { + using SgType = SgGNpc; + + //FIXME: Put in playerInfo or something int timeOfDeath; //FIXME do we really need both of these gentity_t *touchedByPlayer; @@ -293,6 +478,215 @@ typedef struct int ffireCount; //sigh... you'd think I'd be able to find a way to do this without having to use 3 int fields, but... int ffireDebounce; int ffireFadeDebounce; + + + void sg_export( + SgType& dst) const + { + ::sg_export(timeOfDeath, dst.timeOfDeath); + ::sg_export(touchedByPlayer, dst.touchedByPlayer); + ::sg_export(enemyLastVisibility, dst.enemyLastVisibility); + ::sg_export(aimTime, dst.aimTime); + ::sg_export(desiredYaw, dst.desiredYaw); + ::sg_export(desiredPitch, dst.desiredPitch); + ::sg_export(lockedDesiredYaw, dst.lockedDesiredYaw); + ::sg_export(lockedDesiredPitch, dst.lockedDesiredPitch); + ::sg_export(aimingBeam, dst.aimingBeam); + ::sg_export(enemyLastSeenLocation, dst.enemyLastSeenLocation); + ::sg_export(enemyLastSeenTime, dst.enemyLastSeenTime); + ::sg_export(enemyLastHeardLocation, dst.enemyLastHeardLocation); + ::sg_export(enemyLastHeardTime, dst.enemyLastHeardTime); + ::sg_export(lastAlertID, dst.lastAlertID); + ::sg_export(eFlags, dst.eFlags); + ::sg_export(aiFlags, dst.aiFlags); + ::sg_export(currentAmmo, dst.currentAmmo); + ::sg_export(shotTime, dst.shotTime); + ::sg_export(burstCount, dst.burstCount); + ::sg_export(burstMin, dst.burstMin); + ::sg_export(burstMean, dst.burstMean); + ::sg_export(burstMax, dst.burstMax); + ::sg_export(burstSpacing, dst.burstSpacing); + ::sg_export(attackHold, dst.attackHold); + ::sg_export(attackHoldTime, dst.attackHoldTime); + ::sg_export(shootAngles, dst.shootAngles); + ::sg_export(rank, dst.rank); + ::sg_export(behaviorState, dst.behaviorState); + ::sg_export(defaultBehavior, dst.defaultBehavior); + ::sg_export(tempBehavior, dst.tempBehavior); + ::sg_export(ignorePain, dst.ignorePain); + ::sg_export(duckDebounceTime, dst.duckDebounceTime); + ::sg_export(walkDebounceTime, dst.walkDebounceTime); + ::sg_export(enemyCheckDebounceTime, dst.enemyCheckDebounceTime); + ::sg_export(investigateDebounceTime, dst.investigateDebounceTime); + ::sg_export(investigateCount, dst.investigateCount); + ::sg_export(investigateGoal, dst.investigateGoal); + ::sg_export(investigateSoundDebounceTime, dst.investigateSoundDebounceTime); + ::sg_export(greetingDebounceTime, dst.greetingDebounceTime); + ::sg_export(eventOwner, dst.eventOwner); + ::sg_export(coverTarg, dst.coverTarg); + ::sg_export(jumpState, dst.jumpState); + ::sg_export(followDist, dst.followDist); + ::sg_export(tempGoal, dst.tempGoal); + ::sg_export(goalEntity, dst.goalEntity); + ::sg_export(lastGoalEntity, dst.lastGoalEntity); + ::sg_export(eventualGoal, dst.eventualGoal); + ::sg_export(captureGoal, dst.captureGoal); + ::sg_export(defendEnt, dst.defendEnt); + ::sg_export(greetEnt, dst.greetEnt); + ::sg_export(goalTime, dst.goalTime); + ::sg_export(straightToGoal, dst.straightToGoal); + ::sg_export(distToGoal, dst.distToGoal); + ::sg_export(navTime, dst.navTime); + ::sg_export(blockingEntNum, dst.blockingEntNum); + ::sg_export(blockedSpeechDebounceTime, dst.blockedSpeechDebounceTime); + ::sg_export(lastSideStepSide, dst.lastSideStepSide); + ::sg_export(sideStepHoldTime, dst.sideStepHoldTime); + ::sg_export(homeWp, dst.homeWp); + ::sg_export(group, dst.group); + ::sg_export(lastPathAngles, dst.lastPathAngles); + ::sg_export(stats, dst.stats); + ::sg_export(aimErrorDebounceTime, dst.aimErrorDebounceTime); + ::sg_export(lastAimErrorYaw, dst.lastAimErrorYaw); + ::sg_export(lastAimErrorPitch, dst.lastAimErrorPitch); + ::sg_export(aimOfs, dst.aimOfs); + ::sg_export(currentAim, dst.currentAim); + ::sg_export(currentAggression, dst.currentAggression); + ::sg_export(scriptFlags, dst.scriptFlags); + ::sg_export(desiredSpeed, dst.desiredSpeed); + ::sg_export(currentSpeed, dst.currentSpeed); + ::sg_export(last_forwardmove, dst.last_forwardmove); + ::sg_export(last_rightmove, dst.last_rightmove); + ::sg_export(lastClearOrigin, dst.lastClearOrigin); + ::sg_export(consecutiveBlockedMoves, dst.consecutiveBlockedMoves); + ::sg_export(blockedDebounceTime, dst.blockedDebounceTime); + ::sg_export(shoveCount, dst.shoveCount); + ::sg_export(blockedDest, dst.blockedDest); + ::sg_export(combatPoint, dst.combatPoint); + ::sg_export(lastFailedCombatPoint, dst.lastFailedCombatPoint); + ::sg_export(movementSpeech, dst.movementSpeech); + ::sg_export(movementSpeechChance, dst.movementSpeechChance); + ::sg_export(nextBStateThink, dst.nextBStateThink); + ::sg_export(last_ucmd, dst.last_ucmd); + ::sg_export(combatMove, dst.combatMove); + ::sg_export(goalRadius, dst.goalRadius); + ::sg_export(pauseTime, dst.pauseTime); + ::sg_export(standTime, dst.standTime); + ::sg_export(localState, dst.localState); + ::sg_export(squadState, dst.squadState); + ::sg_export(confusionTime, dst.confusionTime); + ::sg_export(charmedTime, dst.charmedTime); + ::sg_export(controlledTime, dst.controlledTime); + ::sg_export(surrenderTime, dst.surrenderTime); + ::sg_export(enemyLaggedPos, dst.enemyLaggedPos); + ::sg_export(watchTarget, dst.watchTarget); + ::sg_export(ffireCount, dst.ffireCount); + ::sg_export(ffireDebounce, dst.ffireDebounce); + ::sg_export(ffireFadeDebounce, dst.ffireFadeDebounce); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.timeOfDeath, timeOfDeath); + ::sg_import(src.touchedByPlayer, touchedByPlayer); + ::sg_import(src.enemyLastVisibility, enemyLastVisibility); + ::sg_import(src.aimTime, aimTime); + ::sg_import(src.desiredYaw, desiredYaw); + ::sg_import(src.desiredPitch, desiredPitch); + ::sg_import(src.lockedDesiredYaw, lockedDesiredYaw); + ::sg_import(src.lockedDesiredPitch, lockedDesiredPitch); + ::sg_import(src.aimingBeam, aimingBeam); + ::sg_import(src.enemyLastSeenLocation, enemyLastSeenLocation); + ::sg_import(src.enemyLastSeenTime, enemyLastSeenTime); + ::sg_import(src.enemyLastHeardLocation, enemyLastHeardLocation); + ::sg_import(src.enemyLastHeardTime, enemyLastHeardTime); + ::sg_import(src.lastAlertID, lastAlertID); + ::sg_import(src.eFlags, eFlags); + ::sg_import(src.aiFlags, aiFlags); + ::sg_import(src.currentAmmo, currentAmmo); + ::sg_import(src.shotTime, shotTime); + ::sg_import(src.burstCount, burstCount); + ::sg_import(src.burstMin, burstMin); + ::sg_import(src.burstMean, burstMean); + ::sg_import(src.burstMax, burstMax); + ::sg_import(src.burstSpacing, burstSpacing); + ::sg_import(src.attackHold, attackHold); + ::sg_import(src.attackHoldTime, attackHoldTime); + ::sg_import(src.shootAngles, shootAngles); + ::sg_import(src.rank, rank); + ::sg_import(src.behaviorState, behaviorState); + ::sg_import(src.defaultBehavior, defaultBehavior); + ::sg_import(src.tempBehavior, tempBehavior); + ::sg_import(src.ignorePain, ignorePain); + ::sg_import(src.duckDebounceTime, duckDebounceTime); + ::sg_import(src.walkDebounceTime, walkDebounceTime); + ::sg_import(src.enemyCheckDebounceTime, enemyCheckDebounceTime); + ::sg_import(src.investigateDebounceTime, investigateDebounceTime); + ::sg_import(src.investigateCount, investigateCount); + ::sg_import(src.investigateGoal, investigateGoal); + ::sg_import(src.investigateSoundDebounceTime, investigateSoundDebounceTime); + ::sg_import(src.greetingDebounceTime, greetingDebounceTime); + ::sg_import(src.eventOwner, eventOwner); + ::sg_import(src.coverTarg, coverTarg); + ::sg_import(src.jumpState, jumpState); + ::sg_import(src.followDist, followDist); + ::sg_import(src.tempGoal, tempGoal); + ::sg_import(src.goalEntity, goalEntity); + ::sg_import(src.lastGoalEntity, lastGoalEntity); + ::sg_import(src.eventualGoal, eventualGoal); + ::sg_import(src.captureGoal, captureGoal); + ::sg_import(src.defendEnt, defendEnt); + ::sg_import(src.greetEnt, greetEnt); + ::sg_import(src.goalTime, goalTime); + ::sg_import(src.straightToGoal, straightToGoal); + ::sg_import(src.distToGoal, distToGoal); + ::sg_import(src.navTime, navTime); + ::sg_import(src.blockingEntNum, blockingEntNum); + ::sg_import(src.blockedSpeechDebounceTime, blockedSpeechDebounceTime); + ::sg_import(src.lastSideStepSide, lastSideStepSide); + ::sg_import(src.sideStepHoldTime, sideStepHoldTime); + ::sg_import(src.homeWp, homeWp); + ::sg_import(src.group, group); + ::sg_import(src.lastPathAngles, lastPathAngles); + ::sg_import(src.stats, stats); + ::sg_import(src.aimErrorDebounceTime, aimErrorDebounceTime); + ::sg_import(src.lastAimErrorYaw, lastAimErrorYaw); + ::sg_import(src.lastAimErrorPitch, lastAimErrorPitch); + ::sg_import(src.aimOfs, aimOfs); + ::sg_import(src.currentAim, currentAim); + ::sg_import(src.currentAggression, currentAggression); + ::sg_import(src.scriptFlags, scriptFlags); + ::sg_import(src.desiredSpeed, desiredSpeed); + ::sg_import(src.currentSpeed, currentSpeed); + ::sg_import(src.last_forwardmove, last_forwardmove); + ::sg_import(src.last_rightmove, last_rightmove); + ::sg_import(src.lastClearOrigin, lastClearOrigin); + ::sg_import(src.consecutiveBlockedMoves, consecutiveBlockedMoves); + ::sg_import(src.blockedDebounceTime, blockedDebounceTime); + ::sg_import(src.shoveCount, shoveCount); + ::sg_import(src.blockedDest, blockedDest); + ::sg_import(src.combatPoint, combatPoint); + ::sg_import(src.lastFailedCombatPoint, lastFailedCombatPoint); + ::sg_import(src.movementSpeech, movementSpeech); + ::sg_import(src.movementSpeechChance, movementSpeechChance); + ::sg_import(src.nextBStateThink, nextBStateThink); + ::sg_import(src.last_ucmd, last_ucmd); + ::sg_import(src.combatMove, combatMove); + ::sg_import(src.goalRadius, goalRadius); + ::sg_import(src.pauseTime, pauseTime); + ::sg_import(src.standTime, standTime); + ::sg_import(src.localState, localState); + ::sg_import(src.squadState, squadState); + ::sg_import(src.confusionTime, confusionTime); + ::sg_import(src.charmedTime, charmedTime); + ::sg_import(src.controlledTime, controlledTime); + ::sg_import(src.surrenderTime, surrenderTime); + ::sg_import(src.enemyLaggedPos, enemyLaggedPos); + ::sg_import(src.watchTarget, watchTarget); + ::sg_import(src.ffireCount, ffireCount); + ::sg_import(src.ffireDebounce, ffireDebounce); + ::sg_import(src.ffireFadeDebounce, ffireFadeDebounce); + } } gNPC_t; void G_SquadPathsInit(void); diff --git a/codeJK2/game/bg_public.h b/codeJK2/game/bg_public.h index 2d9e3f3dac..9e8fe779ab 100644 --- a/codeJK2/game/bg_public.h +++ b/codeJK2/game/bg_public.h @@ -441,22 +441,91 @@ typedef enum { } entity_event_t; +#pragma pack(push, 4) +class SgAnimation +{ +public: + int32_t firstFrame; + int32_t numFrames; + int32_t loopFrames; + int32_t frameLerp; + int32_t initialLerp; +}; // SgAnimation +#pragma pack(pop) typedef struct animation_s { + using SgType = SgAnimation; + + int firstFrame; int numFrames; int loopFrames; // 0 to numFrames, -1 = no loop int frameLerp; // msec between frames int initialLerp; // msec to get to first frame + + + void sg_export( + SgType& dst) const + { + ::sg_export(firstFrame, dst.firstFrame); + ::sg_export(numFrames, dst.numFrames); + ::sg_export(loopFrames, dst.loopFrames); + ::sg_export(frameLerp, dst.frameLerp); + ::sg_export(initialLerp, dst.initialLerp); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.firstFrame, firstFrame); + ::sg_import(src.numFrames, numFrames); + ::sg_import(src.loopFrames, loopFrames); + ::sg_import(src.frameLerp, frameLerp); + ::sg_import(src.initialLerp, initialLerp); + } } animation_t; #define MAX_RANDOM_ANIMSOUNDS 8 + +#pragma pack(push, 4) +class SgAnimSounds +{ +public: + int32_t keyFrame; + SgArray soundIndex; + int32_t numRandomAnimSounds; + int32_t probability; +}; // SgAnimSounds +#pragma pack(pop) + typedef struct animsounds_s { + using SgType = SgAnimSounds; + + int keyFrame; //Frame to play sound on int soundIndex[MAX_RANDOM_ANIMSOUNDS]; //sound file to play - FIXME: should be an index, handle random some other way? int numRandomAnimSounds; //string variable min for va("...%d.wav", Q_irand(lowestVa, highestVa)) int probability; //chance sound will play, zero value will not run this test (0 = 100% basically) + + + void sg_export( + SgType& dst) const + { + ::sg_export(keyFrame, dst.keyFrame); + ::sg_export(soundIndex, dst.soundIndex); + ::sg_export(numRandomAnimSounds, dst.numRandomAnimSounds); + ::sg_export(probability, dst.probability); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.keyFrame, keyFrame); + ::sg_import(src.soundIndex, soundIndex); + ::sg_import(src.numRandomAnimSounds, numRandomAnimSounds); + ::sg_import(src.probability, probability); + } } animsounds_t; // means of death diff --git a/codeJK2/game/g_ICARUS.cpp b/codeJK2/game/g_ICARUS.cpp index 77c4c3136f..6adf2e0318 100644 --- a/codeJK2/game/g_ICARUS.cpp +++ b/codeJK2/game/g_ICARUS.cpp @@ -34,7 +34,7 @@ ICARUS_Instance *iICARUS; bufferlist_t ICARUS_BufferList; entlist_t ICARUS_EntList; -extern unsigned Com_BlockChecksum (const void *buffer, int length); +extern uint32_t Com_BlockChecksum (const void *buffer, int length); extern void Q3_DebugPrint( int level, const char *format, ... ); int ICARUS_entFilter = -1; diff --git a/codeJK2/game/g_local.h b/codeJK2/game/g_local.h index 15a9b1bf08..edcd945e53 100644 --- a/codeJK2/game/g_local.h +++ b/codeJK2/game/g_local.h @@ -129,8 +129,27 @@ enum alertEventLevel_e }; // !!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! +#pragma pack(push, 4) +class SgAlertEvent +{ +public: + SgVec3 position; + float radius; + int32_t level; + int32_t type; + int32_t owner; + float light; + float addLight; + int32_t ID; + int32_t timestamp; +}; // SgAlertEvent +#pragma pack(pop) + typedef struct alertEvent_s { + using SgType = SgAlertEvent; + + vec3_t position; //Where the event is located float radius; //Consideration radius alertEventLevel_e level; //Priority level of the event @@ -140,6 +159,35 @@ typedef struct alertEvent_s float addLight; //additional light- makes it more noticable, even in darkness int ID; //unique... if get a ridiculous number, this will repeat, but should not be a problem as it's just comparing it to your lastAlertID int timestamp; //when it was created + + + void sg_export( + SgType& dst) const + { + ::sg_export(position, dst.position); + ::sg_export(radius, dst.radius); + ::sg_export(level, dst.level); + ::sg_export(type, dst.type); + ::sg_export(owner, dst.owner); + ::sg_export(light, dst.light); + ::sg_export(addLight, dst.addLight); + ::sg_export(ID, dst.ID); + ::sg_export(timestamp, dst.timestamp); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.position, position); + ::sg_import(src.radius, radius); + ::sg_import(src.level, level); + ::sg_import(src.type, type); + ::sg_import(src.owner, owner); + ::sg_import(src.light, light); + ::sg_import(src.addLight, addLight); + ::sg_import(src.ID, ID); + ::sg_import(src.timestamp, timestamp); + } } alertEvent_t; // @@ -163,8 +211,35 @@ typedef struct #define WF_SNOWING 0x00000002 //snowing // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgLevelLocals +{ +public: + int32_t clients; + int32_t maxclients; + int32_t framenum; + int32_t time; + int32_t previousTime; + int32_t globalTime; + SgArray mapname; + int32_t locationLinked; + int32_t locationHead; + SgArray alertEvents; + int32_t numAlertEvents; + int32_t curAlertID; + SgArray groups; + SgArray knownAnimFileSets; + int32_t numKnownAnimFileSets; + int32_t worldFlags; + int32_t dmState; +}; // SgLevelLocals +#pragma pack(pop) + typedef struct { + using SgType = SgLevelLocals; + + gclient_t *clients; // [maxclients] // store latched cvars here that we want to get at often @@ -215,6 +290,51 @@ typedef struct int dmDebounceTime; int dmBeatTime; + + + void sg_export( + SgType& dst) const + { + ::sg_export(clients, dst.clients); + ::sg_export(maxclients, dst.maxclients); + ::sg_export(framenum, dst.framenum); + ::sg_export(time, dst.time); + ::sg_export(previousTime, dst.previousTime); + ::sg_export(globalTime, dst.globalTime); + ::sg_export(mapname, dst.mapname); + ::sg_export(locationLinked, dst.locationLinked); + ::sg_export(locationHead, dst.locationHead); + ::sg_export(alertEvents, dst.alertEvents); + ::sg_export(numAlertEvents, dst.numAlertEvents); + ::sg_export(curAlertID, dst.curAlertID); + ::sg_export(groups, dst.groups); + ::sg_export(knownAnimFileSets, dst.knownAnimFileSets); + ::sg_export(numKnownAnimFileSets, dst.numKnownAnimFileSets); + ::sg_export(worldFlags, dst.worldFlags); + ::sg_export(dmState, dst.dmState); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.clients, clients); + ::sg_import(src.maxclients, maxclients); + ::sg_import(src.framenum, framenum); + ::sg_import(src.time, time); + ::sg_import(src.previousTime, previousTime); + ::sg_import(src.globalTime, globalTime); + ::sg_import(src.mapname, mapname); + ::sg_import(src.locationLinked, locationLinked); + ::sg_import(src.locationHead, locationHead); + ::sg_import(src.alertEvents, alertEvents); + ::sg_import(src.numAlertEvents, numAlertEvents); + ::sg_import(src.curAlertID, curAlertID); + ::sg_import(src.groups, groups); + ::sg_import(src.knownAnimFileSets, knownAnimFileSets); + ::sg_import(src.numKnownAnimFileSets, numKnownAnimFileSets); + ::sg_import(src.worldFlags, worldFlags); + ::sg_import(src.dmState, dmState); + } } level_locals_t; extern level_locals_t level; diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp index 2fc693c00c..01e728b5b2 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -94,7 +94,7 @@ void WriteInUseBits(void) void ReadInUseBits(void) { - gi.ReadFromSaveGame(INT_ID('I','N','U','S'), &g_entityInUseBits, sizeof(g_entityInUseBits), NULL); + ::sg_read(::gi, INT_ID('I','N','U','S'), ::g_entityInUseBits); // This is only temporary. Once I have converted all the ent->inuse refs, // it won;t be needed -MW. for(int i=0;i(::gi, INT_ID('L','C','K','D'), player_locked); } diff --git a/codeJK2/game/g_objectives.cpp b/codeJK2/game/g_objectives.cpp index ecaf60c9fd..b78ca13b59 100644 --- a/codeJK2/game/g_objectives.cpp +++ b/codeJK2/game/g_objectives.cpp @@ -86,7 +86,7 @@ OBJ_LoadMissionObjectives */ void OBJ_LoadMissionObjectives( gclient_t *client ) { - gi.ReadFromSaveGame(INT_ID('O','B','J','T'), (void *) &client->sess.mission_objectives, sizeof(client->sess.mission_objectives), NULL); + ::sg_read_no_cast(::gi, INT_ID('O','B','J','T'), client->sess.mission_objectives); } diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp index 8175f19e6e..e0d3d107f8 100644 --- a/codeJK2/game/g_roff.cpp +++ b/codeJK2/game/g_roff.cpp @@ -650,13 +650,13 @@ void G_LoadCachedRoffs() char buffer[MAX_QPATH]; // Get the count of goodies we need to revive - gi.ReadFromSaveGame( INT_ID('R','O','F','F'), (void *)&count, sizeof(count), NULL ); + ::sg_read(::gi, INT_ID('R','O','F','F'), count); // Now bring 'em back to life for ( i = 0; i < count; i++ ) { - gi.ReadFromSaveGame( INT_ID('S','L','E','N'), (void *)&len, sizeof(len), NULL ); - gi.ReadFromSaveGame( INT_ID('R','S','T','R'), (void *)(buffer), len, NULL ); + ::sg_read(::gi, INT_ID('S','L','E','N'), len); + ::sg_read_no_cast(::gi, INT_ID('R','S','T','R'), buffer, len); G_LoadRoff( buffer ); } } diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index 02b578e497..cfd84ce286 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -183,7 +183,7 @@ char *GetStringPtr(int iStrlen, char *psOriginal/*may be NULL*/) assert(iStrlen+1<=(int)sizeof(sString)); - gi.ReadFromSaveGame(INT_ID('S','T','R','G'), sString, iStrlen, NULL); + ::sg_read_no_cast(::gi, INT_ID('S','T','R','G'), sString, iStrlen); // we can't do string recycling with the new g_alloc pool dumping, so just always alloc here... // @@ -480,7 +480,7 @@ static void EvaluateField(const field_t *pField, byte *pbBase, byte *pbOriginalR switch (pField->eFieldType) { case F_STRING: - *(char **)pv = GetStringPtr(*(int *)pv, pbOriginalRefData?*(char**)pvOriginal:NULL); + *(char **)pv = GetStringPtr(*(intptr_t *)pv, pbOriginalRefData?*(char**)pvOriginal:NULL); break; case F_GENTITY: @@ -488,7 +488,7 @@ static void EvaluateField(const field_t *pField, byte *pbBase, byte *pbOriginalR break; case F_GROUP: - *(AIGroupInfo_t **)pv = GetGroupPtr(*(int *)pv); + *(AIGroupInfo_t **)pv = GetGroupPtr(*(intptr_t *)pv); break; case F_GCLIENT: @@ -496,7 +496,7 @@ static void EvaluateField(const field_t *pField, byte *pbBase, byte *pbOriginalR break; case F_ITEM: - *(gitem_t **)pv = GetGItemPtr(*(int *)pv); + *(gitem_t **)pv = GetGItemPtr(*(intptr_t *)pv); break; case F_BEHAVIORSET: @@ -505,7 +505,7 @@ static void EvaluateField(const field_t *pField, byte *pbBase, byte *pbOriginalR char **pO= (char **) pvOriginal; for (int i=0; i +static void EvaluateFields(const field_t *pFields, T* pbData, T* pbOriginalRefData, unsigned int ulChid, int iSize, qboolean bOkToSizeMisMatch) { - int iReadSize = gi.ReadFromSaveGame(ulChid, pbData, bOkToSizeMisMatch?0:iSize, NULL); + using SgType = typename T::SgType; + + iSize = static_cast(sizeof(SgType)); + + auto& sg_buffer = ::sg_get_buffer(iSize); + + auto sg_object = reinterpret_cast(sg_buffer.data()); + + int iReadSize = ::gi.ReadFromSaveGame(ulChid, sg_object, bOkToSizeMisMatch?0:iSize, NULL); if (iReadSize != iSize) { @@ -598,11 +607,13 @@ static void EvaluateFields(const field_t *pFields, byte *pbData, byte *pbOrigina } } + ::sg_import(*sg_object, *pbData); + if (pFields) { for (const field_t *pField = pFields; pField->psName; pField++) { - EvaluateField(pField, pbData, pbOriginalRefData); + EvaluateField(pField, reinterpret_cast(pbData), reinterpret_cast(pbOriginalRefData)); } } } @@ -638,7 +649,7 @@ static void ReadLevelLocals () level_locals_t *temp = (level_locals_t *)gi.Malloc(sizeof(level_locals_t), TAG_TEMP_WORKSPACE, qfalse); *temp = level; - EvaluateFields(savefields_LevelLocals, (byte *)temp, (byte *)&level, INT_ID('L','V','L','C'), LLOFS(LEVEL_LOCALS_T_SAVESTOP),qfalse); // sizeof(level_locals_t)); + EvaluateFields(savefields_LevelLocals, temp, &level, INT_ID('L','V','L','C'), LLOFS(LEVEL_LOCALS_T_SAVESTOP),qfalse); // sizeof(level_locals_t)); level = *temp; // struct copy level.clients = pClients; // restore clients @@ -735,13 +746,13 @@ static void ReadGEntities(qboolean qbAutosave) int iCount; int i; - gi.ReadFromSaveGame(INT_ID('N','M','E','D'), (void *)&iCount, sizeof(iCount), NULL); + ::sg_read(::gi, INT_ID('N','M','E','D'), iCount); int iPreviousEntRead = -1; for (i=0; i(::gi, INT_ID('E','D','N','M'), iEntIndex); if (iEntIndex >= globals.num_entities) { @@ -776,7 +787,7 @@ static void ReadGEntities(qboolean qbAutosave) // gi.G2API_LoadSaveCodeDestructGhoul2Info(pEnt->ghoul2); pEnt->ghoul2.kill(); - EvaluateFields(savefields_gEntity, (byte *)pEnt, (byte *)pEntOriginal, INT_ID('G','E','N','T'), sizeof(*pEnt),qfalse); + EvaluateFields(savefields_gEntity, pEnt, pEntOriginal, INT_ID('G','E','N','T'), sizeof(*pEnt),qfalse); pEnt->ghoul2.kill(); // now for any fiddly bits... @@ -785,7 +796,7 @@ static void ReadGEntities(qboolean qbAutosave) { gNPC_t tempNPC; - EvaluateFields(savefields_gNPC, (byte *)&tempNPC,(byte *)pEntOriginal->NPC, INT_ID('G','N','P','C'), sizeof (*pEnt->NPC),qfalse); + EvaluateFields(savefields_gNPC, &tempNPC,pEntOriginal->NPC, INT_ID('G','N','P','C'), sizeof (*pEnt->NPC),qfalse); // so can we pinch the original's one or do we have to alloc a new one?... // @@ -813,7 +824,7 @@ static void ReadGEntities(qboolean qbAutosave) { gclient_t tempGClient; - EvaluateFields(savefields_gClient, (byte *)&tempGClient, (byte *)pEntOriginal->client, INT_ID('G','C','L','I'), sizeof(*pEnt->client),qfalse); + EvaluateFields(savefields_gClient, &tempGClient, pEntOriginal->client, INT_ID('G','C','L','I'), sizeof(*pEnt->client),qfalse); // can we pinch the original's client handle or do we have to alloc a new one?... // @@ -841,7 +852,7 @@ static void ReadGEntities(qboolean qbAutosave) { parms_t tempParms; - gi.ReadFromSaveGame(INT_ID('P','A','R','M'), &tempParms, sizeof(tempParms), NULL); + ::sg_read_no_cast(::gi, INT_ID('P','A','R','M'), tempParms); // so can we pinch the original's one or do we have to alloc a new one?... // @@ -867,7 +878,7 @@ static void ReadGEntities(qboolean qbAutosave) // { char *pGhoul2Data = NULL; - gi.ReadFromSaveGame(INT_ID('G','H','L','2'), 0, 0, (void**)&pGhoul2Data); + ::sg_read_allocate(::gi, INT_ID('G','H','L','2'), pGhoul2Data); gi.G2API_LoadGhoul2Models(pEnt->ghoul2, pGhoul2Data); // if it's going to crash anywhere... gi.Free(pGhoul2Data); } @@ -928,7 +939,7 @@ static void ReadGEntities(qboolean qbAutosave) // check that Icarus has loaded everything it saved out by having a marker chunk after it... // static int iBlah = 1234; - gi.ReadFromSaveGame(INT_ID('I','C','O','K'), &iBlah, sizeof(iBlah), NULL); + ::sg_read(::gi, INT_ID('I','C','O','K'), iBlah); } if (!qbAutosave) { @@ -984,11 +995,11 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) //Read & throw away gclient info gclient_t junkClient; - EvaluateFields(savefields_gClient, (byte *)&junkClient, (byte *)&level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qfalse); + EvaluateFields(savefields_gClient, &junkClient, &level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qfalse); //Read & throw away objective info objectives_t junkObj[MAX_MISSION_OBJ]; - gi.ReadFromSaveGame(INT_ID('O','B','J','T'), (void *) &junkObj, 0, NULL); + ::sg_read_no_cast(::gi, INT_ID('O','B','J','T'), junkObj); ReadLevelLocals(); // level_locals_t level } @@ -999,7 +1010,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way things work gclient_t GClient; - EvaluateFields(savefields_gClient, (byte *)&GClient, (byte *)&level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qfalse); + EvaluateFields(savefields_gClient, &GClient, &level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qfalse); level.clients[0] = GClient; // struct copy ReadLevelLocals(); // level_locals_t level } @@ -1021,7 +1032,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) // check that the whole file content was loaded by specifically requesting an end-marker... // static int iDONE = 1234; - gi.ReadFromSaveGame(INT_ID('D','O','N','E'), &iDONE, sizeof(iDONE), NULL); + ::sg_read(::gi, INT_ID('D','O','N','E'), iDONE); } extern int killPlayerTimer; diff --git a/codeJK2/game/g_shared.h b/codeJK2/game/g_shared.h index babf5c23db..b12eca2dc4 100644 --- a/codeJK2/game/g_shared.h +++ b/codeJK2/game/g_shared.h @@ -121,7 +121,35 @@ typedef enum //# material_e #define MAX_CUSTOM_JEDI_SOUNDS 22 #define MAX_CUSTOM_SOUNDS (MAX_CUSTOM_JEDI_SOUNDS + MAX_CUSTOM_EXTRA_SOUNDS + MAX_CUSTOM_COMBAT_SOUNDS + MAX_CUSTOM_BASIC_SOUNDS) // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgClientInfo +{ +public: + int32_t infoValid; + SgArray name; + int32_t team; + int32_t score; + int32_t handicap; + int32_t legsModel; + int32_t legsSkin; + int32_t torsoModel; + int32_t torsoSkin; + int32_t headModel; + int32_t headSkin; + int32_t extensions; + int32_t animFileIndex; + SgArray sounds; + int32_t customBasicSoundDir; + int32_t customCombatSoundDir; + int32_t customExtraSoundDir; + int32_t customJediSoundDir; +}; // SgClientInfo +#pragma pack(pop) + typedef struct { + using SgType = SgClientInfo; + + qboolean infoValid; char name[MAX_QPATH]; @@ -149,6 +177,53 @@ typedef struct { char *customCombatSoundDir; char *customExtraSoundDir; char *customJediSoundDir; + + + void sg_export( + SgType& dst) const + { + ::sg_export(infoValid, dst.infoValid); + ::sg_export(name, dst.name); + ::sg_export(team, dst.team); + ::sg_export(score, dst.score); + ::sg_export(handicap, dst.handicap); + ::sg_export(legsModel, dst.legsModel); + ::sg_export(legsSkin, dst.legsSkin); + ::sg_export(torsoModel, dst.torsoModel); + ::sg_export(torsoSkin, dst.torsoSkin); + ::sg_export(headModel, dst.headModel); + ::sg_export(headSkin, dst.headSkin); + ::sg_export(extensions, dst.extensions); + ::sg_export(animFileIndex, dst.animFileIndex); + ::sg_export(sounds, dst.sounds); + ::sg_export(customBasicSoundDir, dst.customBasicSoundDir); + ::sg_export(customCombatSoundDir, dst.customCombatSoundDir); + ::sg_export(customExtraSoundDir, dst.customExtraSoundDir); + ::sg_export(customJediSoundDir, dst.customJediSoundDir); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.infoValid, infoValid); + ::sg_import(src.name, name); + ::sg_import(src.team, team); + ::sg_import(src.score, score); + ::sg_import(src.handicap, handicap); + ::sg_import(src.legsModel, legsModel); + ::sg_import(src.legsSkin, legsSkin); + ::sg_import(src.torsoModel, torsoModel); + ::sg_import(src.torsoSkin, torsoSkin); + ::sg_import(src.headModel, headModel); + ::sg_import(src.headSkin, headSkin); + ::sg_import(src.extensions, extensions); + ::sg_import(src.animFileIndex, animFileIndex); + ::sg_import(src.sounds, sounds); + ::sg_import(src.customBasicSoundDir, customBasicSoundDir); + ::sg_import(src.customCombatSoundDir, customCombatSoundDir); + ::sg_import(src.customExtraSoundDir, customExtraSoundDir); + ::sg_import(src.customJediSoundDir, customJediSoundDir); + } } clientInfo_t; @@ -164,11 +239,41 @@ typedef enum // Rendering information structure // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgModelInfo +{ +public: + int32_t modelIndex; + SgVec3 customRGB; + int32_t customAlpha; +}; // SgModelInfo +#pragma pack(pop) + typedef struct modelInfo_s { + using SgType = SgModelInfo; + + int modelIndex; vec3_t customRGB;//Red Green Blue, 0 = don't apply int customAlpha;//Alpha to apply, 0 = none? + + + void sg_export( + SgType& dst) const + { + ::sg_export(modelIndex, dst.modelIndex); + ::sg_export(customRGB, dst.customRGB); + ::sg_export(customAlpha, dst.customAlpha); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.modelIndex, modelIndex); + ::sg_import(src.customRGB, customRGB); + ::sg_import(src.customAlpha, customAlpha); + } } modelInfo_t; typedef enum @@ -188,8 +293,65 @@ typedef enum #define RF_LOCKEDANGLE 1 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgRenderInfo +{ +public: + SgModelInfo legsModel; + SgArray legsModelName; + SgModelInfo torsoModel; + SgModelInfo headModel; + SgArray torsoModelName; + SgArray headModelName; + int32_t headYawRangeLeft; + int32_t headYawRangeRight; + int32_t headPitchRangeUp; + int32_t headPitchRangeDown; + int32_t torsoYawRangeLeft; + int32_t torsoYawRangeRight; + int32_t torsoPitchRangeUp; + int32_t torsoPitchRangeDown; + int32_t legsFrame; + int32_t torsoFrame; + float legsFpsMod; + float torsoFpsMod; + SgVec3 customRGB; + int32_t customAlpha; + int32_t renderFlags; + SgVec3 muzzlePoint; + SgVec3 muzzleDir; + SgVec3 muzzlePointOld; + SgVec3 muzzleDirOld; + int32_t mPCalcTime; + float lockYaw; + SgVec3 headPoint; + SgVec3 headAngles; + SgVec3 handRPoint; + SgVec3 handLPoint; + SgVec3 crotchPoint; + SgVec3 footRPoint; + SgVec3 footLPoint; + SgVec3 torsoPoint; + SgVec3 torsoAngles; + SgVec3 eyePoint; + SgVec3 eyeAngles; + int32_t lookTarget; + int32_t lookMode; + int32_t lookTargetClearTime; + int32_t lastVoiceVolume; + SgVec3 lastHeadAngles; + SgVec3 headBobAngles; + SgVec3 targetHeadBobAngles; + int32_t lookingDebounceTime; + float legsYaw; +}; // SgRenderInfo +#pragma pack(pop) + typedef struct renderInfo_s { + using SgType = SgRenderInfo; + + // Legs model, or full model on one piece entities union { @@ -266,6 +428,111 @@ typedef struct renderInfo_s vec3_t targetHeadBobAngles;//head bob angles will try to get to targetHeadBobAngles int lookingDebounceTime;//When we can stop using head looking angle behavior float legsYaw;//yaw angle your legs are actually rendering at + + + void sg_export( + SgType& dst) const + { + ::sg_export(legsModel, dst.legsModel); + ::sg_export(legsModelName, dst.legsModelName); + ::sg_export(torsoModel, dst.torsoModel); + ::sg_export(headModel, dst.headModel); + ::sg_export(torsoModelName, dst.torsoModelName); + ::sg_export(headModelName, dst.headModelName); + ::sg_export(headYawRangeLeft, dst.headYawRangeLeft); + ::sg_export(headYawRangeRight, dst.headYawRangeRight); + ::sg_export(headPitchRangeUp, dst.headPitchRangeUp); + ::sg_export(headPitchRangeDown, dst.headPitchRangeDown); + ::sg_export(torsoYawRangeLeft, dst.torsoYawRangeLeft); + ::sg_export(torsoYawRangeRight, dst.torsoYawRangeRight); + ::sg_export(torsoPitchRangeUp, dst.torsoPitchRangeUp); + ::sg_export(torsoPitchRangeDown, dst.torsoPitchRangeDown); + ::sg_export(legsFrame, dst.legsFrame); + ::sg_export(torsoFrame, dst.torsoFrame); + ::sg_export(legsFpsMod, dst.legsFpsMod); + ::sg_export(torsoFpsMod, dst.torsoFpsMod); + ::sg_export(customRGB, dst.customRGB); + ::sg_export(customAlpha, dst.customAlpha); + ::sg_export(renderFlags, dst.renderFlags); + ::sg_export(muzzlePoint, dst.muzzlePoint); + ::sg_export(muzzleDir, dst.muzzleDir); + ::sg_export(muzzlePointOld, dst.muzzlePointOld); + ::sg_export(muzzleDirOld, dst.muzzleDirOld); + ::sg_export(mPCalcTime, dst.mPCalcTime); + ::sg_export(lockYaw, dst.lockYaw); + ::sg_export(headPoint, dst.headPoint); + ::sg_export(headAngles, dst.headAngles); + ::sg_export(handRPoint, dst.handRPoint); + ::sg_export(handLPoint, dst.handLPoint); + ::sg_export(crotchPoint, dst.crotchPoint); + ::sg_export(footRPoint, dst.footRPoint); + ::sg_export(footLPoint, dst.footLPoint); + ::sg_export(torsoPoint, dst.torsoPoint); + ::sg_export(torsoAngles, dst.torsoAngles); + ::sg_export(eyePoint, dst.eyePoint); + ::sg_export(eyeAngles, dst.eyeAngles); + ::sg_export(lookTarget, dst.lookTarget); + ::sg_export(lookMode, dst.lookMode); + ::sg_export(lookTargetClearTime, dst.lookTargetClearTime); + ::sg_export(lastVoiceVolume, dst.lastVoiceVolume); + ::sg_export(lastHeadAngles, dst.lastHeadAngles); + ::sg_export(headBobAngles, dst.headBobAngles); + ::sg_export(targetHeadBobAngles, dst.targetHeadBobAngles); + ::sg_export(lookingDebounceTime, dst.lookingDebounceTime); + ::sg_export(legsYaw, dst.legsYaw); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.legsModel, legsModel); + ::sg_import(src.legsModelName, legsModelName); + ::sg_import(src.torsoModel, torsoModel); + ::sg_import(src.headModel, headModel); + ::sg_import(src.torsoModelName, torsoModelName); + ::sg_import(src.headModelName, headModelName); + ::sg_import(src.headYawRangeLeft, headYawRangeLeft); + ::sg_import(src.headYawRangeRight, headYawRangeRight); + ::sg_import(src.headPitchRangeUp, headPitchRangeUp); + ::sg_import(src.headPitchRangeDown, headPitchRangeDown); + ::sg_import(src.torsoYawRangeLeft, torsoYawRangeLeft); + ::sg_import(src.torsoYawRangeRight, torsoYawRangeRight); + ::sg_import(src.torsoPitchRangeUp, torsoPitchRangeUp); + ::sg_import(src.torsoPitchRangeDown, torsoPitchRangeDown); + ::sg_import(src.legsFrame, legsFrame); + ::sg_import(src.torsoFrame, torsoFrame); + ::sg_import(src.legsFpsMod, legsFpsMod); + ::sg_import(src.torsoFpsMod, torsoFpsMod); + ::sg_import(src.customRGB, customRGB); + ::sg_import(src.customAlpha, customAlpha); + ::sg_import(src.renderFlags, renderFlags); + ::sg_import(src.muzzlePoint, muzzlePoint); + ::sg_import(src.muzzleDir, muzzleDir); + ::sg_import(src.muzzlePointOld, muzzlePointOld); + ::sg_import(src.muzzleDirOld, muzzleDirOld); + ::sg_import(src.mPCalcTime, mPCalcTime); + ::sg_import(src.lockYaw, lockYaw); + ::sg_import(src.headPoint, headPoint); + ::sg_import(src.headAngles, headAngles); + ::sg_import(src.handRPoint, handRPoint); + ::sg_import(src.handLPoint, handLPoint); + ::sg_import(src.crotchPoint, crotchPoint); + ::sg_import(src.footRPoint, footRPoint); + ::sg_import(src.footLPoint, footLPoint); + ::sg_import(src.torsoPoint, torsoPoint); + ::sg_import(src.torsoAngles, torsoAngles); + ::sg_import(src.eyePoint, eyePoint); + ::sg_import(src.eyeAngles, eyeAngles); + ::sg_import(src.lookTarget, lookTarget); + ::sg_import(src.lookMode, lookMode); + ::sg_import(src.lookTargetClearTime, lookTargetClearTime); + ::sg_import(src.lastVoiceVolume, lastVoiceVolume); + ::sg_import(src.lastHeadAngles, lastHeadAngles); + ::sg_import(src.headBobAngles, headBobAngles); + ::sg_import(src.targetHeadBobAngles, targetHeadBobAngles); + ::sg_import(src.lookingDebounceTime, lookingDebounceTime); + ::sg_import(src.legsYaw, legsYaw); + } } renderInfo_t; // Movement information structure @@ -294,7 +561,28 @@ typedef enum { } playerTeamStateState_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgPlayerTeamState +{ +public: + int32_t state; + int32_t captures; + int32_t basedefense; + int32_t carrierdefense; + int32_t flagrecovery; + int32_t fragcarrier; + int32_t assists; + float lasthurtcarrier; + float lastreturnedflag; + float flagsince; + float lastfraggedcarrier; +}; // SgPlayerTeamState +#pragma pack(pop) + typedef struct { + using SgType = SgPlayerTeamState; + + playerTeamStateState_t state; int captures; @@ -308,19 +596,103 @@ typedef struct { float lastreturnedflag; float flagsince; float lastfraggedcarrier; + + + void sg_export( + SgType& dst) const + { + ::sg_export(state, dst.state); + ::sg_export(captures, dst.captures); + ::sg_export(basedefense, dst.basedefense); + ::sg_export(carrierdefense, dst.carrierdefense); + ::sg_export(flagrecovery, dst.flagrecovery); + ::sg_export(fragcarrier, dst.fragcarrier); + ::sg_export(assists, dst.assists); + ::sg_export(lasthurtcarrier, dst.lasthurtcarrier); + ::sg_export(lastreturnedflag, dst.lastreturnedflag); + ::sg_export(flagsince, dst.flagsince); + ::sg_export(lastfraggedcarrier, dst.lastfraggedcarrier); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.state, state); + ::sg_import(src.captures, captures); + ::sg_import(src.basedefense, basedefense); + ::sg_import(src.carrierdefense, carrierdefense); + ::sg_import(src.flagrecovery, flagrecovery); + ::sg_import(src.fragcarrier, fragcarrier); + ::sg_import(src.assists, assists); + ::sg_import(src.lasthurtcarrier, lasthurtcarrier); + ::sg_import(src.lastreturnedflag, lastreturnedflag); + ::sg_import(src.flagsince, flagsince); + ::sg_import(src.lastfraggedcarrier, lastfraggedcarrier); + } } playerTeamState_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgObjectives +{ +public: + int32_t display; + int32_t status; +}; // SgObjectives +#pragma pack(pop) + typedef struct objectives_s { + using SgType = SgObjectives; + + qboolean display; // A displayable objective? int status; // Succeed or fail or pending + + + void sg_export( + SgType& dst) const + { + ::sg_export(display, dst.display); + ::sg_export(status, dst.status); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.display, display); + ::sg_import(src.status, status); + } } objectives_t; #define MAX_MISSION_OBJ 80 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgMissionStats +{ +public: + int32_t secretsFound; + int32_t totalSecrets; + int32_t shotsFired; + int32_t hits; + int32_t enemiesSpawned; + int32_t enemiesKilled; + int32_t saberThrownCnt; + int32_t saberBlocksCnt; + int32_t legAttacksCnt; + int32_t armAttacksCnt; + int32_t torsoAttacksCnt; + int32_t otherAttacksCnt; + SgArray forceUsed; + SgArray weaponUsed; +}; // SgMissionStats +#pragma pack(pop) + typedef struct missionStats_s { + using SgType = SgMissionStats; + + int secretsFound; // # of secret areas found int totalSecrets; // # of secret areas that could have been found int shotsFired; // total number of shots fired @@ -335,6 +707,45 @@ typedef struct missionStats_s int otherAttacksCnt; // # of times anything else on a monster was hit with saber int forceUsed[NUM_FORCE_POWERS]; // # of times each force power was used int weaponUsed[WP_NUM_WEAPONS]; // # of times each weapon was used + + + void sg_export( + SgType& dst) const + { + ::sg_export(secretsFound, dst.secretsFound); + ::sg_export(totalSecrets, dst.totalSecrets); + ::sg_export(shotsFired, dst.shotsFired); + ::sg_export(hits, dst.hits); + ::sg_export(enemiesSpawned, dst.enemiesSpawned); + ::sg_export(enemiesKilled, dst.enemiesKilled); + ::sg_export(saberThrownCnt, dst.saberThrownCnt); + ::sg_export(saberBlocksCnt, dst.saberBlocksCnt); + ::sg_export(legAttacksCnt, dst.legAttacksCnt); + ::sg_export(armAttacksCnt, dst.armAttacksCnt); + ::sg_export(torsoAttacksCnt, dst.torsoAttacksCnt); + ::sg_export(otherAttacksCnt, dst.otherAttacksCnt); + ::sg_export(forceUsed, dst.forceUsed); + ::sg_export(weaponUsed, dst.weaponUsed); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.secretsFound, secretsFound); + ::sg_import(src.totalSecrets, totalSecrets); + ::sg_import(src.shotsFired, shotsFired); + ::sg_import(src.hits, hits); + ::sg_import(src.enemiesSpawned, enemiesSpawned); + ::sg_import(src.enemiesKilled, enemiesKilled); + ::sg_import(src.saberThrownCnt, saberThrownCnt); + ::sg_import(src.saberBlocksCnt, saberBlocksCnt); + ::sg_import(src.legAttacksCnt, legAttacksCnt); + ::sg_import(src.armAttacksCnt, armAttacksCnt); + ::sg_import(src.torsoAttacksCnt, torsoAttacksCnt); + ::sg_import(src.otherAttacksCnt, otherAttacksCnt); + ::sg_import(src.forceUsed, forceUsed); + ::sg_import(src.weaponUsed, weaponUsed); + } } missionStats_t; // the auto following clients don't follow a specific client @@ -348,17 +759,68 @@ typedef struct missionStats_s // MUST be dealt with in G_InitSessionData() / G_ReadSessionData() / G_WriteSessionData() // // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgClientSession +{ +public: + int32_t missionObjectivesShown; + int32_t sessionTeam; + SgArray mission_objectives; + SgMissionStats missionStats; +}; // SgClientSession +#pragma pack(pop) + typedef struct { + using SgType = SgClientSession; + + int missionObjectivesShown; // Number of times mission objectives have been updated team_t sessionTeam; objectives_t mission_objectives[MAX_MISSION_OBJ]; missionStats_t missionStats; // Various totals while on a mission + + + void sg_export( + SgType& dst) const + { + ::sg_export(missionObjectivesShown, dst.missionObjectivesShown); + ::sg_export(sessionTeam, dst.sessionTeam); + ::sg_export(mission_objectives, dst.mission_objectives); + ::sg_export(missionStats, dst.missionStats); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.missionObjectivesShown, missionObjectivesShown); + ::sg_import(src.sessionTeam, sessionTeam); + ::sg_import(src.mission_objectives, mission_objectives); + ::sg_import(src.missionStats, missionStats); + } } clientSession_t; // client data that stays across multiple respawns, but is cleared // on each level change or team change at ClientBegin() // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgClientPersistant +{ +public: + int32_t connected; + SgUserCmd lastCommand; + int32_t localClient; + SgArray netname; + int32_t maxHealth; + int32_t enterTime; + SgArray cmd_angles; + SgPlayerTeamState teamState; +}; // SgClientPersistant +#pragma pack(pop) + typedef struct { + using SgType = SgClientPersistant; + + clientConnected_t connected; usercmd_t lastCommand; qboolean localClient; // true if "ip" info key is "localhost" @@ -368,6 +830,33 @@ typedef struct { short cmd_angles[3]; // angles sent over in the last command playerTeamState_t teamState; // status in teamplay games + + + void sg_export( + SgType& dst) const + { + ::sg_export(connected, dst.connected); + ::sg_export(lastCommand, dst.lastCommand); + ::sg_export(localClient, dst.localClient); + ::sg_export(netname, dst.netname); + ::sg_export(maxHealth, dst.maxHealth); + ::sg_export(enterTime, dst.enterTime); + ::sg_export(cmd_angles, dst.cmd_angles); + ::sg_export(teamState, dst.teamState); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.connected, connected); + ::sg_import(src.lastCommand, lastCommand); + ::sg_import(src.localClient, localClient); + ::sg_import(src.netname, netname); + ::sg_import(src.maxHealth, maxHealth); + ::sg_import(src.enterTime, enterTime); + ::sg_import(src.cmd_angles, cmd_angles); + ::sg_import(src.teamState, teamState); + } } clientPersistant_t; typedef enum { @@ -393,10 +882,74 @@ typedef enum { } saberBlockedType_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! +#pragma pack(push, 4) +class SgGClient +{ +public: + SgPlayerState ps; + SgClientPersistant pers; + SgClientSession sess; + int32_t noclip; + int32_t lastCmdTime; + SgUserCmd usercmd; + int32_t buttons; + int32_t oldbuttons; + int32_t latched_buttons; + int32_t damage_armor; + int32_t damage_blood; + int32_t damage_knockback; + SgVec3 damage_from; + int32_t damage_fromWorld; + int32_t accurateCount; + int32_t respawnTime; + int32_t inactivityTime; + int32_t inactivityWarning; + int32_t idleTime; + int32_t airOutTime; + int32_t timeResidual; + float facial_blink; + float facial_frown; + float facial_aux; + SgClientInfo clientInfo; + int8_t forced_forwardmove; + int8_t forced_rightmove; + int32_t fireDelay; + int32_t playerTeam; + int32_t enemyTeam; + int32_t squadname; + int32_t team_leader; + int32_t leader; + int32_t follower; + int32_t numFollowers; + int32_t formationGoal; + int32_t nextFormGoal; + int32_t NPC_class; + float hiddenDist; + SgVec3 hiddenDir; + SgRenderInfo renderInfo; + SgSaberTrail saberTrail; + int32_t dismembered; + int8_t dismemberProbLegs; + int8_t dismemberProbHead; + int8_t dismemberProbArms; + int8_t dismemberProbHands; + int8_t dismemberProbWaist; + int32_t standheight; + int32_t crouchheight; + int32_t poisonDamage; + int32_t poisonTime; + int32_t slopeRecalcTime; + SgVec3 pushVec; + int32_t pushVecTime; +}; // SgGClient +#pragma pack(pop) // this structure is cleared on each ClientSpawn(), // except for 'client->pers' and 'client->sess' struct gclient_s { + using SgType = SgGClient; + + // ps MUST be the first element, because the server expects it playerState_t ps; // communicated by server to clients @@ -483,13 +1036,156 @@ struct gclient_s { vec3_t pushVec; int pushVecTime; + + + void sg_export( + SgType& dst) const + { + ::sg_export(ps, dst.ps); + ::sg_export(pers, dst.pers); + ::sg_export(sess, dst.sess); + ::sg_export(noclip, dst.noclip); + ::sg_export(lastCmdTime, dst.lastCmdTime); + ::sg_export(usercmd, dst.usercmd); + ::sg_export(buttons, dst.buttons); + ::sg_export(oldbuttons, dst.oldbuttons); + ::sg_export(latched_buttons, dst.latched_buttons); + ::sg_export(damage_armor, dst.damage_armor); + ::sg_export(damage_blood, dst.damage_blood); + ::sg_export(damage_knockback, dst.damage_knockback); + ::sg_export(damage_from, dst.damage_from); + ::sg_export(damage_fromWorld, dst.damage_fromWorld); + ::sg_export(accurateCount, dst.accurateCount); + ::sg_export(respawnTime, dst.respawnTime); + ::sg_export(inactivityTime, dst.inactivityTime); + ::sg_export(inactivityWarning, dst.inactivityWarning); + ::sg_export(idleTime, dst.idleTime); + ::sg_export(airOutTime, dst.airOutTime); + ::sg_export(timeResidual, dst.timeResidual); + ::sg_export(facial_blink, dst.facial_blink); + ::sg_export(facial_frown, dst.facial_frown); + ::sg_export(facial_aux, dst.facial_aux); + ::sg_export(clientInfo, dst.clientInfo); + ::sg_export(forced_forwardmove, dst.forced_forwardmove); + ::sg_export(forced_rightmove, dst.forced_rightmove); + ::sg_export(fireDelay, dst.fireDelay); + ::sg_export(playerTeam, dst.playerTeam); + ::sg_export(enemyTeam, dst.enemyTeam); + ::sg_export(squadname, dst.squadname); + ::sg_export(team_leader, dst.team_leader); + ::sg_export(leader, dst.leader); + ::sg_export(follower, dst.follower); + ::sg_export(numFollowers, dst.numFollowers); + ::sg_export(formationGoal, dst.formationGoal); + ::sg_export(nextFormGoal, dst.nextFormGoal); + ::sg_export(NPC_class, dst.NPC_class); + ::sg_export(hiddenDist, dst.hiddenDist); + ::sg_export(hiddenDir, dst.hiddenDir); + ::sg_export(renderInfo, dst.renderInfo); + ::sg_export(saberTrail, dst.saberTrail); + ::sg_export(dismembered, dst.dismembered); + ::sg_export(dismemberProbLegs, dst.dismemberProbLegs); + ::sg_export(dismemberProbHead, dst.dismemberProbHead); + ::sg_export(dismemberProbArms, dst.dismemberProbArms); + ::sg_export(dismemberProbHands, dst.dismemberProbHands); + ::sg_export(dismemberProbWaist, dst.dismemberProbWaist); + ::sg_export(standheight, dst.standheight); + ::sg_export(crouchheight, dst.crouchheight); + ::sg_export(poisonDamage, dst.poisonDamage); + ::sg_export(poisonTime, dst.poisonTime); + ::sg_export(slopeRecalcTime, dst.slopeRecalcTime); + ::sg_export(pushVec, dst.pushVec); + ::sg_export(pushVecTime, dst.pushVecTime); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.ps, ps); + ::sg_import(src.pers, pers); + ::sg_import(src.sess, sess); + ::sg_import(src.noclip, noclip); + ::sg_import(src.lastCmdTime, lastCmdTime); + ::sg_import(src.usercmd, usercmd); + ::sg_import(src.buttons, buttons); + ::sg_import(src.oldbuttons, oldbuttons); + ::sg_import(src.latched_buttons, latched_buttons); + ::sg_import(src.damage_armor, damage_armor); + ::sg_import(src.damage_blood, damage_blood); + ::sg_import(src.damage_knockback, damage_knockback); + ::sg_import(src.damage_from, damage_from); + ::sg_import(src.damage_fromWorld, damage_fromWorld); + ::sg_import(src.accurateCount, accurateCount); + ::sg_import(src.respawnTime, respawnTime); + ::sg_import(src.inactivityTime, inactivityTime); + ::sg_import(src.inactivityWarning, inactivityWarning); + ::sg_import(src.idleTime, idleTime); + ::sg_import(src.airOutTime, airOutTime); + ::sg_import(src.timeResidual, timeResidual); + ::sg_import(src.facial_blink, facial_blink); + ::sg_import(src.facial_frown, facial_frown); + ::sg_import(src.facial_aux, facial_aux); + ::sg_import(src.clientInfo, clientInfo); + ::sg_import(src.forced_forwardmove, forced_forwardmove); + ::sg_import(src.forced_rightmove, forced_rightmove); + ::sg_import(src.fireDelay, fireDelay); + ::sg_import(src.playerTeam, playerTeam); + ::sg_import(src.enemyTeam, enemyTeam); + ::sg_import(src.squadname, squadname); + ::sg_import(src.team_leader, team_leader); + ::sg_import(src.leader, leader); + ::sg_import(src.follower, follower); + ::sg_import(src.numFollowers, numFollowers); + ::sg_import(src.formationGoal, formationGoal); + ::sg_import(src.nextFormGoal, nextFormGoal); + ::sg_import(src.NPC_class, NPC_class); + ::sg_import(src.hiddenDist, hiddenDist); + ::sg_import(src.hiddenDir, hiddenDir); + ::sg_import(src.renderInfo, renderInfo); + ::sg_import(src.saberTrail, saberTrail); + ::sg_import(src.dismembered, dismembered); + ::sg_import(src.dismemberProbLegs, dismemberProbLegs); + ::sg_import(src.dismemberProbHead, dismemberProbHead); + ::sg_import(src.dismemberProbArms, dismemberProbArms); + ::sg_import(src.dismemberProbHands, dismemberProbHands); + ::sg_import(src.dismemberProbWaist, dismemberProbWaist); + ::sg_import(src.standheight, standheight); + ::sg_import(src.crouchheight, crouchheight); + ::sg_import(src.poisonDamage, poisonDamage); + ::sg_import(src.poisonTime, poisonTime); + ::sg_import(src.slopeRecalcTime, slopeRecalcTime); + ::sg_import(src.pushVec, pushVec); + ::sg_import(src.pushVecTime, pushVecTime); + } }; #define MAX_PARMS 16 #define MAX_PARM_STRING_LENGTH MAX_QPATH//was 16, had to lengthen it so they could take a valid file path +class SgParms +{ +public: + SgArray2d parm; +}; // SgParms + typedef struct { + using SgType = SgParms; + + char parm[MAX_PARMS][MAX_PARM_STRING_LENGTH]; + + + void sg_export( + SgType& dst) const + { + ::sg_export(parm, dst.parm); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.parm, parm); + } } parms_t; #define GAME_INCLUDE @@ -507,7 +1203,194 @@ typedef struct #define MAX_FAILED_NODES 8 typedef struct centity_s centity_t; + +#pragma pack(push, 4) +class SgGEntity +{ +public: + SgEntityState s; + int32_t client; + int32_t inuse; + int32_t linked; + int32_t svFlags; + int32_t bmodel; + SgVec3 mins; + SgVec3 maxs; + int32_t contents; + SgVec3 absmin; + SgVec3 absmax; + SgVec3 currentOrigin; + SgVec3 currentAngles; + int32_t owner; + SgCGhoul2InfoV ghoul2; + int32_t classname; + int32_t spawnflags; + int32_t flags; + int32_t model; + int32_t model2; + int32_t freetime; + int32_t eventTime; + int32_t freeAfterEvent; + int32_t unlinkAfterEvent; + float physicsBounce; + int32_t clipmask; + float speed; + SgVec3 movedir; + SgVec3 lastOrigin; + SgVec3 lastAngles; + float mass; + int32_t lastImpact; + int32_t watertype; + int32_t waterlevel; + float angle; + int32_t target; + int32_t target2; + int32_t target3; + int32_t target4; + int32_t targetname; + int32_t team; + int32_t roff; + int32_t roff_ctr; + int32_t next_roff_time; + int32_t fx_time; + int32_t nextthink; + int32_t e_ThinkFunc; + int32_t e_clThinkFunc; + int32_t e_ReachedFunc; + int32_t e_BlockedFunc; + int32_t e_TouchFunc; + int32_t e_UseFunc; + int32_t e_PainFunc; + int32_t e_DieFunc; + int32_t health; + int32_t max_health; + int32_t takedamage; + int32_t material; + int32_t damage; + int32_t dflags; + int32_t splashDamage; + int32_t splashRadius; + int32_t methodOfDeath; + int32_t splashMethodOfDeath; + SgArray locationDamage; + int32_t chain; + int32_t enemy; + int32_t activator; + int32_t teamchain; + int32_t teammaster; + int32_t lastEnemy; + float wait; + float random; + int32_t delay; + int32_t alt_fire; + int32_t count; + int32_t bounceCount; + int32_t fly_sound_debounce_time; + int32_t painDebounceTime; + int32_t disconnectDebounceTime; + int32_t attackDebounceTime; + int32_t pushDebounceTime; + int32_t aimDebounceTime; + int32_t useDebounceTime; + int32_t trigger_formation; + int32_t waypoint; + int32_t lastWaypoint; + int32_t lastValidWaypoint; + int32_t noWaypointTime; + int32_t combatPoint; + SgArray failedWaypoints; + int32_t failedWaypointCheckTime; + int32_t loopAnim; + int32_t startFrame; + int32_t endFrame; + int32_t sequencer; + int32_t taskManager; + SgArray taskID; + int32_t parms; + SgArray behaviorSet; + int32_t script_targetname; + int32_t delayScriptTime; + int32_t fullName; + int32_t soundSet; + int32_t setTime; + int32_t cameraGroup; + int32_t noDamageTeam; + int32_t playerModel; + int32_t weaponModel; + int32_t handRBolt; + int32_t handLBolt; + int32_t headBolt; + int32_t cervicalBolt; + int32_t chestBolt; + int32_t gutBolt; + int32_t torsoBolt; + int32_t crotchBolt; + int32_t motionBolt; + int32_t kneeLBolt; + int32_t kneeRBolt; + int32_t elbowLBolt; + int32_t elbowRBolt; + int32_t footLBolt; + int32_t footRBolt; + int32_t faceBone; + int32_t craniumBone; + int32_t cervicalBone; + int32_t thoracicBone; + int32_t upperLumbarBone; + int32_t lowerLumbarBone; + int32_t hipsBone; + int32_t motionBone; + int32_t rootBone; + int32_t footLBone; + int32_t footRBone; + int32_t genericBone1; + int32_t genericBone2; + int32_t genericBone3; + int32_t genericBolt1; + int32_t genericBolt2; + int32_t genericBolt3; + int32_t genericBolt4; + int32_t genericBolt5; + int32_t cinematicModel; + int32_t NPC; + int32_t ownername; + int32_t cantHitEnemyCounter; + int32_t NPC_type; + int32_t NPC_targetname; + int32_t NPC_target; + int32_t moverState; + int32_t soundPos1; + int32_t sound1to2; + int32_t sound2to1; + int32_t soundPos2; + int32_t soundLoop; + int32_t nextTrain; + int32_t prevTrain; + SgVec3 pos1; + SgVec3 pos2; + SgVec3 pos3; + int32_t sounds; + int32_t closetarget; + int32_t opentarget; + int32_t paintarget; + int32_t lockCount; + float radius; + int32_t wpIndex; + int32_t noise_index; + SgVec4 startRGBA; + SgVec4 finalRGBA; + int32_t item; + int32_t message; + float lightLevel; + int32_t forcePushTime; + int32_t forcePuller; +}; // SgGEntity +#pragma pack(pop) + struct gentity_s { + using SgType = SgGEntity; + + entityState_t s; // communicated by server to clients struct gclient_s *client; // NULL if not a player (unless it's NPC ( if (this->NPC != NULL) ) ... -slc) qboolean inuse; @@ -804,6 +1687,369 @@ Ghoul2 Insert End //Force effects int forcePushTime; int forcePuller; //who force-pulled me (so we don't damage them if we hit them) + + + void sg_export( + SgType& dst) const + { + ::sg_export(s, dst.s); + ::sg_export(client, dst.client); + ::sg_export(inuse, dst.inuse); + ::sg_export(linked, dst.linked); + ::sg_export(svFlags, dst.svFlags); + ::sg_export(bmodel, dst.bmodel); + ::sg_export(mins, dst.mins); + ::sg_export(maxs, dst.maxs); + ::sg_export(contents, dst.contents); + ::sg_export(absmin, dst.absmin); + ::sg_export(absmax, dst.absmax); + ::sg_export(currentOrigin, dst.currentOrigin); + ::sg_export(currentAngles, dst.currentAngles); + ::sg_export(owner, dst.owner); + ::sg_export(ghoul2, dst.ghoul2); + ::sg_export(classname, dst.classname); + ::sg_export(spawnflags, dst.spawnflags); + ::sg_export(flags, dst.flags); + ::sg_export(model, dst.model); + ::sg_export(model2, dst.model2); + ::sg_export(freetime, dst.freetime); + ::sg_export(eventTime, dst.eventTime); + ::sg_export(freeAfterEvent, dst.freeAfterEvent); + ::sg_export(unlinkAfterEvent, dst.unlinkAfterEvent); + ::sg_export(physicsBounce, dst.physicsBounce); + ::sg_export(clipmask, dst.clipmask); + ::sg_export(speed, dst.speed); + ::sg_export(movedir, dst.movedir); + ::sg_export(lastOrigin, dst.lastOrigin); + ::sg_export(lastAngles, dst.lastAngles); + ::sg_export(mass, dst.mass); + ::sg_export(lastImpact, dst.lastImpact); + ::sg_export(watertype, dst.watertype); + ::sg_export(waterlevel, dst.waterlevel); + ::sg_export(angle, dst.angle); + ::sg_export(target, dst.target); + ::sg_export(target2, dst.target2); + ::sg_export(target3, dst.target3); + ::sg_export(target4, dst.target4); + ::sg_export(targetname, dst.targetname); + ::sg_export(team, dst.team); + ::sg_export(roff, dst.roff); + ::sg_export(roff_ctr, dst.roff_ctr); + ::sg_export(next_roff_time, dst.next_roff_time); + ::sg_export(fx_time, dst.fx_time); + ::sg_export(nextthink, dst.nextthink); + ::sg_export(e_ThinkFunc, dst.e_ThinkFunc); + ::sg_export(e_clThinkFunc, dst.e_clThinkFunc); + ::sg_export(e_ReachedFunc, dst.e_ReachedFunc); + ::sg_export(e_BlockedFunc, dst.e_BlockedFunc); + ::sg_export(e_TouchFunc, dst.e_TouchFunc); + ::sg_export(e_UseFunc, dst.e_UseFunc); + ::sg_export(e_PainFunc, dst.e_PainFunc); + ::sg_export(e_DieFunc, dst.e_DieFunc); + ::sg_export(health, dst.health); + ::sg_export(max_health, dst.max_health); + ::sg_export(takedamage, dst.takedamage); + ::sg_export(material, dst.material); + ::sg_export(damage, dst.damage); + ::sg_export(dflags, dst.dflags); + ::sg_export(splashDamage, dst.splashDamage); + ::sg_export(splashRadius, dst.splashRadius); + ::sg_export(methodOfDeath, dst.methodOfDeath); + ::sg_export(splashMethodOfDeath, dst.splashMethodOfDeath); + ::sg_export(locationDamage, dst.locationDamage); + ::sg_export(chain, dst.chain); + ::sg_export(enemy, dst.enemy); + ::sg_export(activator, dst.activator); + ::sg_export(teamchain, dst.teamchain); + ::sg_export(teammaster, dst.teammaster); + ::sg_export(lastEnemy, dst.lastEnemy); + ::sg_export(wait, dst.wait); + ::sg_export(random, dst.random); + ::sg_export(delay, dst.delay); + ::sg_export(alt_fire, dst.alt_fire); + ::sg_export(count, dst.count); + ::sg_export(bounceCount, dst.bounceCount); + ::sg_export(fly_sound_debounce_time, dst.fly_sound_debounce_time); + ::sg_export(painDebounceTime, dst.painDebounceTime); + ::sg_export(disconnectDebounceTime, dst.disconnectDebounceTime); + ::sg_export(attackDebounceTime, dst.attackDebounceTime); + ::sg_export(pushDebounceTime, dst.pushDebounceTime); + ::sg_export(aimDebounceTime, dst.aimDebounceTime); + ::sg_export(useDebounceTime, dst.useDebounceTime); + ::sg_export(trigger_formation, dst.trigger_formation); + ::sg_export(waypoint, dst.waypoint); + ::sg_export(lastWaypoint, dst.lastWaypoint); + ::sg_export(lastValidWaypoint, dst.lastValidWaypoint); + ::sg_export(noWaypointTime, dst.noWaypointTime); + ::sg_export(combatPoint, dst.combatPoint); + ::sg_export(failedWaypoints, dst.failedWaypoints); + ::sg_export(failedWaypointCheckTime, dst.failedWaypointCheckTime); + ::sg_export(loopAnim, dst.loopAnim); + ::sg_export(startFrame, dst.startFrame); + ::sg_export(endFrame, dst.endFrame); + ::sg_export(sequencer, dst.sequencer); + ::sg_export(taskManager, dst.taskManager); + ::sg_export(taskID, dst.taskID); + ::sg_export(parms, dst.parms); + ::sg_export(behaviorSet, dst.behaviorSet); + ::sg_export(script_targetname, dst.script_targetname); + ::sg_export(delayScriptTime, dst.delayScriptTime); + ::sg_export(fullName, dst.fullName); + ::sg_export(soundSet, dst.soundSet); + ::sg_export(setTime, dst.setTime); + ::sg_export(cameraGroup, dst.cameraGroup); + ::sg_export(noDamageTeam, dst.noDamageTeam); + ::sg_export(playerModel, dst.playerModel); + ::sg_export(weaponModel, dst.weaponModel); + ::sg_export(handRBolt, dst.handRBolt); + ::sg_export(handLBolt, dst.handLBolt); + ::sg_export(headBolt, dst.headBolt); + ::sg_export(cervicalBolt, dst.cervicalBolt); + ::sg_export(chestBolt, dst.chestBolt); + ::sg_export(gutBolt, dst.gutBolt); + ::sg_export(torsoBolt, dst.torsoBolt); + ::sg_export(crotchBolt, dst.crotchBolt); + ::sg_export(motionBolt, dst.motionBolt); + ::sg_export(kneeLBolt, dst.kneeLBolt); + ::sg_export(kneeRBolt, dst.kneeRBolt); + ::sg_export(elbowLBolt, dst.elbowLBolt); + ::sg_export(elbowRBolt, dst.elbowRBolt); + ::sg_export(footLBolt, dst.footLBolt); + ::sg_export(footRBolt, dst.footRBolt); + ::sg_export(faceBone, dst.faceBone); + ::sg_export(craniumBone, dst.craniumBone); + ::sg_export(cervicalBone, dst.cervicalBone); + ::sg_export(thoracicBone, dst.thoracicBone); + ::sg_export(upperLumbarBone, dst.upperLumbarBone); + ::sg_export(lowerLumbarBone, dst.lowerLumbarBone); + ::sg_export(hipsBone, dst.hipsBone); + ::sg_export(motionBone, dst.motionBone); + ::sg_export(rootBone, dst.rootBone); + ::sg_export(footLBone, dst.footLBone); + ::sg_export(footRBone, dst.footRBone); + ::sg_export(genericBone1, dst.genericBone1); + ::sg_export(genericBone2, dst.genericBone2); + ::sg_export(genericBone3, dst.genericBone3); + ::sg_export(genericBolt1, dst.genericBolt1); + ::sg_export(genericBolt2, dst.genericBolt2); + ::sg_export(genericBolt3, dst.genericBolt3); + ::sg_export(genericBolt4, dst.genericBolt4); + ::sg_export(genericBolt5, dst.genericBolt5); + ::sg_export(cinematicModel, dst.cinematicModel); + ::sg_export(NPC, dst.NPC); + ::sg_export(ownername, dst.ownername); + ::sg_export(cantHitEnemyCounter, dst.cantHitEnemyCounter); + ::sg_export(NPC_type, dst.NPC_type); + ::sg_export(NPC_targetname, dst.NPC_targetname); + ::sg_export(NPC_target, dst.NPC_target); + ::sg_export(moverState, dst.moverState); + ::sg_export(soundPos1, dst.soundPos1); + ::sg_export(sound1to2, dst.sound1to2); + ::sg_export(sound2to1, dst.sound2to1); + ::sg_export(soundPos2, dst.soundPos2); + ::sg_export(soundLoop, dst.soundLoop); + ::sg_export(nextTrain, dst.nextTrain); + ::sg_export(prevTrain, dst.prevTrain); + ::sg_export(pos1, dst.pos1); + ::sg_export(pos2, dst.pos2); + ::sg_export(pos3, dst.pos3); + ::sg_export(sounds, dst.sounds); + ::sg_export(closetarget, dst.closetarget); + ::sg_export(opentarget, dst.opentarget); + ::sg_export(paintarget, dst.paintarget); + ::sg_export(lockCount, dst.lockCount); + ::sg_export(radius, dst.radius); + ::sg_export(wpIndex, dst.wpIndex); + ::sg_export(noise_index, dst.noise_index); + ::sg_export(startRGBA, dst.startRGBA); + ::sg_export(finalRGBA, dst.finalRGBA); + ::sg_export(item, dst.item); + ::sg_export(message, dst.message); + ::sg_export(lightLevel, dst.lightLevel); + ::sg_export(forcePushTime, dst.forcePushTime); + ::sg_export(forcePuller, dst.forcePuller); + } + + void sg_import( + const SgType& src) + { + ::sg_import(src.s, s); + ::sg_import(src.client, client); + ::sg_import(src.inuse, inuse); + ::sg_import(src.linked, linked); + ::sg_import(src.svFlags, svFlags); + ::sg_import(src.bmodel, bmodel); + ::sg_import(src.mins, mins); + ::sg_import(src.maxs, maxs); + ::sg_import(src.contents, contents); + ::sg_import(src.absmin, absmin); + ::sg_import(src.absmax, absmax); + ::sg_import(src.currentOrigin, currentOrigin); + ::sg_import(src.currentAngles, currentAngles); + ::sg_import(src.owner, owner); + ::sg_import(src.ghoul2, ghoul2); + ::sg_import(src.classname, classname); + ::sg_import(src.spawnflags, spawnflags); + ::sg_import(src.flags, flags); + ::sg_import(src.model, model); + ::sg_import(src.model2, model2); + ::sg_import(src.freetime, freetime); + ::sg_import(src.eventTime, eventTime); + ::sg_import(src.freeAfterEvent, freeAfterEvent); + ::sg_import(src.unlinkAfterEvent, unlinkAfterEvent); + ::sg_import(src.physicsBounce, physicsBounce); + ::sg_import(src.clipmask, clipmask); + ::sg_import(src.speed, speed); + ::sg_import(src.movedir, movedir); + ::sg_import(src.lastOrigin, lastOrigin); + ::sg_import(src.lastAngles, lastAngles); + ::sg_import(src.mass, mass); + ::sg_import(src.lastImpact, lastImpact); + ::sg_import(src.watertype, watertype); + ::sg_import(src.waterlevel, waterlevel); + ::sg_import(src.angle, angle); + ::sg_import(src.target, target); + ::sg_import(src.target2, target2); + ::sg_import(src.target3, target3); + ::sg_import(src.target4, target4); + ::sg_import(src.targetname, targetname); + ::sg_import(src.team, team); + ::sg_import(src.roff, roff); + ::sg_import(src.roff_ctr, roff_ctr); + ::sg_import(src.next_roff_time, next_roff_time); + ::sg_import(src.fx_time, fx_time); + ::sg_import(src.nextthink, nextthink); + ::sg_import(src.e_ThinkFunc, e_ThinkFunc); + ::sg_import(src.e_clThinkFunc, e_clThinkFunc); + ::sg_import(src.e_ReachedFunc, e_ReachedFunc); + ::sg_import(src.e_BlockedFunc, e_BlockedFunc); + ::sg_import(src.e_TouchFunc, e_TouchFunc); + ::sg_import(src.e_UseFunc, e_UseFunc); + ::sg_import(src.e_PainFunc, e_PainFunc); + ::sg_import(src.e_DieFunc, e_DieFunc); + ::sg_import(src.health, health); + ::sg_import(src.max_health, max_health); + ::sg_import(src.takedamage, takedamage); + ::sg_import(src.material, material); + ::sg_import(src.damage, damage); + ::sg_import(src.dflags, dflags); + ::sg_import(src.splashDamage, splashDamage); + ::sg_import(src.splashRadius, splashRadius); + ::sg_import(src.methodOfDeath, methodOfDeath); + ::sg_import(src.splashMethodOfDeath, splashMethodOfDeath); + ::sg_import(src.locationDamage, locationDamage); + ::sg_import(src.chain, chain); + ::sg_import(src.enemy, enemy); + ::sg_import(src.activator, activator); + ::sg_import(src.teamchain, teamchain); + ::sg_import(src.teammaster, teammaster); + ::sg_import(src.lastEnemy, lastEnemy); + ::sg_import(src.wait, wait); + ::sg_import(src.random, random); + ::sg_import(src.delay, delay); + ::sg_import(src.alt_fire, alt_fire); + ::sg_import(src.count, count); + ::sg_import(src.bounceCount, bounceCount); + ::sg_import(src.fly_sound_debounce_time, fly_sound_debounce_time); + ::sg_import(src.painDebounceTime, painDebounceTime); + ::sg_import(src.disconnectDebounceTime, disconnectDebounceTime); + ::sg_import(src.attackDebounceTime, attackDebounceTime); + ::sg_import(src.pushDebounceTime, pushDebounceTime); + ::sg_import(src.aimDebounceTime, aimDebounceTime); + ::sg_import(src.useDebounceTime, useDebounceTime); + ::sg_import(src.trigger_formation, trigger_formation); + ::sg_import(src.waypoint, waypoint); + ::sg_import(src.lastWaypoint, lastWaypoint); + ::sg_import(src.lastValidWaypoint, lastValidWaypoint); + ::sg_import(src.noWaypointTime, noWaypointTime); + ::sg_import(src.combatPoint, combatPoint); + ::sg_import(src.failedWaypoints, failedWaypoints); + ::sg_import(src.failedWaypointCheckTime, failedWaypointCheckTime); + ::sg_import(src.loopAnim, loopAnim); + ::sg_import(src.startFrame, startFrame); + ::sg_import(src.endFrame, endFrame); + ::sg_import(src.sequencer, sequencer); + ::sg_import(src.taskManager, taskManager); + ::sg_import(src.taskID, taskID); + ::sg_import(src.parms, parms); + ::sg_import(src.behaviorSet, behaviorSet); + ::sg_import(src.script_targetname, script_targetname); + ::sg_import(src.delayScriptTime, delayScriptTime); + ::sg_import(src.fullName, fullName); + ::sg_import(src.soundSet, soundSet); + ::sg_import(src.setTime, setTime); + ::sg_import(src.cameraGroup, cameraGroup); + ::sg_import(src.noDamageTeam, noDamageTeam); + ::sg_import(src.playerModel, playerModel); + ::sg_import(src.weaponModel, weaponModel); + ::sg_import(src.handRBolt, handRBolt); + ::sg_import(src.handLBolt, handLBolt); + ::sg_import(src.headBolt, headBolt); + ::sg_import(src.cervicalBolt, cervicalBolt); + ::sg_import(src.chestBolt, chestBolt); + ::sg_import(src.gutBolt, gutBolt); + ::sg_import(src.torsoBolt, torsoBolt); + ::sg_import(src.crotchBolt, crotchBolt); + ::sg_import(src.motionBolt, motionBolt); + ::sg_import(src.kneeLBolt, kneeLBolt); + ::sg_import(src.kneeRBolt, kneeRBolt); + ::sg_import(src.elbowLBolt, elbowLBolt); + ::sg_import(src.elbowRBolt, elbowRBolt); + ::sg_import(src.footLBolt, footLBolt); + ::sg_import(src.footRBolt, footRBolt); + ::sg_import(src.faceBone, faceBone); + ::sg_import(src.craniumBone, craniumBone); + ::sg_import(src.cervicalBone, cervicalBone); + ::sg_import(src.thoracicBone, thoracicBone); + ::sg_import(src.upperLumbarBone, upperLumbarBone); + ::sg_import(src.lowerLumbarBone, lowerLumbarBone); + ::sg_import(src.hipsBone, hipsBone); + ::sg_import(src.motionBone, motionBone); + ::sg_import(src.rootBone, rootBone); + ::sg_import(src.footLBone, footLBone); + ::sg_import(src.footRBone, footRBone); + ::sg_import(src.genericBone1, genericBone1); + ::sg_import(src.genericBone2, genericBone2); + ::sg_import(src.genericBone3, genericBone3); + ::sg_import(src.genericBolt1, genericBolt1); + ::sg_import(src.genericBolt2, genericBolt2); + ::sg_import(src.genericBolt3, genericBolt3); + ::sg_import(src.genericBolt4, genericBolt4); + ::sg_import(src.genericBolt5, genericBolt5); + ::sg_import(src.cinematicModel, cinematicModel); + ::sg_import(src.NPC, NPC); + ::sg_import(src.ownername, ownername); + ::sg_import(src.cantHitEnemyCounter, cantHitEnemyCounter); + ::sg_import(src.NPC_type, NPC_type); + ::sg_import(src.NPC_targetname, NPC_targetname); + ::sg_import(src.NPC_target, NPC_target); + ::sg_import(src.moverState, moverState); + ::sg_import(src.soundPos1, soundPos1); + ::sg_import(src.sound1to2, sound1to2); + ::sg_import(src.sound2to1, sound2to1); + ::sg_import(src.soundPos2, soundPos2); + ::sg_import(src.soundLoop, soundLoop); + ::sg_import(src.nextTrain, nextTrain); + ::sg_import(src.prevTrain, prevTrain); + ::sg_import(src.pos1, pos1); + ::sg_import(src.pos2, pos2); + ::sg_import(src.pos3, pos3); + ::sg_import(src.sounds, sounds); + ::sg_import(src.closetarget, closetarget); + ::sg_import(src.opentarget, opentarget); + ::sg_import(src.paintarget, paintarget); + ::sg_import(src.lockCount, lockCount); + ::sg_import(src.radius, radius); + ::sg_import(src.wpIndex, wpIndex); + ::sg_import(src.noise_index, noise_index); + ::sg_import(src.startRGBA, startRGBA); + ::sg_import(src.finalRGBA, finalRGBA); + ::sg_import(src.item, item); + ::sg_import(src.message, message); + ::sg_import(src.lightLevel, lightLevel); + ::sg_import(src.forcePushTime, forcePushTime); + ::sg_import(src.forcePuller, forcePuller); + } }; #endif //#ifdef GAME_INCLUDE diff --git a/codeJK2/icarus/Instance.cpp b/codeJK2/icarus/Instance.cpp index 568f7d6394..0eff61d816 100644 --- a/codeJK2/icarus/Instance.cpp +++ b/codeJK2/icarus/Instance.cpp @@ -441,7 +441,7 @@ int ICARUS_Instance::LoadSignals( void ) { int numSignals; - m_interface->I_ReadSaveData( INT_ID('I','S','I','G'), &numSignals, sizeof( numSignals ), NULL ); + ::sg_read(m_interface, INT_ID('I','S','I','G'), numSignals); for ( int i = 0; i < numSignals; i++ ) { @@ -449,12 +449,12 @@ int ICARUS_Instance::LoadSignals( void ) int length; //Get the size of the string - m_interface->I_ReadSaveData( INT_ID('S','I','G','#'), &length, sizeof( length ), NULL ); + ::sg_read(m_interface, INT_ID('S','I','G','#'), length); assert( length < (int)sizeof( buffer ) ); //Get the string - m_interface->I_ReadSaveData( INT_ID('S','I','G','N'), &buffer, length, NULL ); + ::sg_read_no_cast(m_interface, INT_ID('S','I','G','N'), buffer, length); //Turn it on and add it to the system Signal( (const char *) &buffer ); @@ -495,7 +495,7 @@ int ICARUS_Instance::LoadSequences( void ) int numSequences; //Get the number of sequences to read in - m_interface->I_ReadSaveData( INT_ID('#','S','E','Q'), &numSequences, sizeof( numSequences ), NULL ); + ::sg_read(m_interface, INT_ID('#','S','E','Q'), numSequences); int *idTable = new int[ numSequences ]; @@ -503,7 +503,7 @@ int ICARUS_Instance::LoadSequences( void ) return false; //Load the sequencer ID table - m_interface->I_ReadSaveData( INT_ID('S','Q','T','B'), idTable, sizeof( int ) * numSequences, NULL ); + ::sg_read(m_interface, INT_ID('S','Q','T','B'), idTable, numSequences); //First pass, allocate all container sequences and give them their proper IDs if ( AllocateSequences( numSequences, idTable ) == false ) @@ -539,7 +539,7 @@ int ICARUS_Instance::LoadSequencers( void ) int numSequencers; //Get the number of sequencers to load - m_interface->I_ReadSaveData( INT_ID('#','S','Q','R'), &numSequencers, sizeof( numSequencers ), NULL ); + ::sg_read(m_interface, INT_ID('#','S','Q','R'), numSequencers); //Load all sequencers for ( int i = 0; i < numSequencers; i++ ) @@ -568,7 +568,7 @@ int ICARUS_Instance::Load( void ) //Check to make sure we're at the ICARUS save block double version; - m_interface->I_ReadSaveData( INT_ID('I','C','A','R'), &version, sizeof( version ), NULL ); + ::sg_read(m_interface, INT_ID('I','C','A','R'), version); //Versions must match! if ( version != ICARUS_VERSION ) @@ -598,7 +598,7 @@ int ICARUS_Instance::Load( void ) return false; } - m_interface->I_ReadSaveData( INT_ID('I','E','N','D'), &version, sizeof( version ), NULL ); + ::sg_read(m_interface, INT_ID('I','E','N','D'), version); return true; } diff --git a/codeJK2/icarus/Sequence.cpp b/codeJK2/icarus/Sequence.cpp index 13ea05469d..c91712a846 100644 --- a/codeJK2/icarus/Sequence.cpp +++ b/codeJK2/icarus/Sequence.cpp @@ -439,21 +439,21 @@ int CSequence::Load( void ) void *bData; //Get the parent sequence - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('S','P','I','D'), &id, sizeof( id ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('S','P','I','D'), id); m_parent = ( id != -1 ) ? m_owner->GetSequence( id ) : NULL; //Get the return sequence - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('S','R','I','D'), &id, sizeof( id ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('S','R','I','D'), id); m_return = ( id != -1 ) ? m_owner->GetSequence( id ) : NULL; //Get the number of children - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('S','N','C','H'), &m_numChildren, sizeof( m_numChildren ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('S','N','C','H'), m_numChildren); //Reload all children for ( i = 0; i < m_numChildren; i++ ) { //Get the child sequence ID - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('S','C','H','D'), &id, sizeof( id ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('S','C','H','D'), id); //Get the desired sequence if ( ( sequence = m_owner->GetSequence( id ) ) == NULL ) @@ -468,46 +468,46 @@ int CSequence::Load( void ) //Get the sequence flags - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('S','F','L','G'), &m_flags, sizeof( m_flags ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('S','F','L','G'), m_flags); //Get the number of iterations - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('S','I','T','R'), &m_iterations, sizeof( m_iterations ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('S','I','T','R'), m_iterations); int numCommands; //Get the number of commands - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('S','N','M','C'), &numCommands, sizeof( m_numCommands ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('S','N','M','C'), numCommands); //Get all the commands for ( i = 0; i < numCommands; i++ ) { //Get the block ID and create a new container - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('B','L','I','D'), &id, sizeof( id ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('B','L','I','D'), id); block = new CBlock; block->Create( id ); //Read the block's flags - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('B','F','L','G'), &flags, sizeof( flags ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('B','F','L','G'), flags); block->SetFlags( flags ); //Get the number of block members - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('B','N','U','M'), &numMembers, sizeof( numMembers ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('B','N','U','M'), numMembers); for ( int j = 0; j < numMembers; j++ ) { //Get the member ID - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('B','M','I','D'), &bID, sizeof( bID ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('B','M','I','D'), bID); //Get the member size - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('B','S','I','Z'), &bSize, sizeof( bSize ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('B','S','I','Z'), bSize); //Get the member's data if ( ( bData = ICARUS_Malloc( bSize ) ) == NULL ) return false; //Get the actual raw data - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('B','M','E','M'), bData, bSize, NULL ); + ::sg_read_no_cast(m_owner->GetInterface(), INT_ID('B','M','E','M'), bData, bSize); //Write out the correct type switch ( bID ) diff --git a/codeJK2/icarus/Sequencer.cpp b/codeJK2/icarus/Sequencer.cpp index 24fb057482..3d5b051df5 100644 --- a/codeJK2/icarus/Sequencer.cpp +++ b/codeJK2/icarus/Sequencer.cpp @@ -2385,7 +2385,7 @@ int CSequencer::Load( void ) int i; //Get the owner of this sequencer - m_ie->I_ReadSaveData( INT_ID('S','Q','R','E'), &m_ownerID, sizeof( m_ownerID ), NULL ); + ::sg_read(m_ie, INT_ID('S','Q','R','E'), m_ownerID); //Link the entity back to the sequencer m_ie->I_LinkEntity( m_ownerID, this, m_taskManager ); @@ -2395,12 +2395,12 @@ int CSequencer::Load( void ) int numSequences, seqID, taskID, numTasks; //Get the number of sequences to read - m_ie->I_ReadSaveData( INT_ID('S','Q','R','#'), &numSequences, sizeof( numSequences ), NULL ); + ::sg_read(m_ie, INT_ID('S','Q','R','#'), numSequences); //Read in all the sequences for ( i = 0; i < numSequences; i++ ) { - m_ie->I_ReadSaveData( INT_ID('S','Q','R','I'), &seqID, sizeof( seqID ), NULL ); + ::sg_read(m_ie, INT_ID('S','Q','R','I'), seqID); seq = m_owner->GetSequence( seqID ); @@ -2417,16 +2417,16 @@ int CSequencer::Load( void ) m_taskManager->Load(); //Get the number of tasks in the map - m_ie->I_ReadSaveData( INT_ID('S','Q','T','#'), &numTasks, sizeof( numTasks ), NULL ); + ::sg_read(m_ie, INT_ID('S','Q','T','#'), numTasks); //Read in, and reassociate the tasks to the sequences for ( i = 0; i < numTasks; i++ ) { //Read in the task's ID - m_ie->I_ReadSaveData( INT_ID('S','T','I','D'), &taskID, sizeof( taskID ), NULL ); + ::sg_read(m_ie, INT_ID('S','T','I','D'), taskID); //Read in the sequence's ID - m_ie->I_ReadSaveData( INT_ID('S','S','I','D'), &seqID, sizeof( seqID ), NULL ); + ::sg_read(m_ie, INT_ID('S','S','I','D'), seqID); taskGroup = m_taskManager->GetTaskGroup( taskID ); @@ -2443,15 +2443,15 @@ int CSequencer::Load( void ) int curGroupID; //Get the current task group - m_ie->I_ReadSaveData( INT_ID('S','Q','C','T'), &curGroupID, sizeof( curGroupID ), NULL ); + ::sg_read(m_ie, INT_ID('S','Q','C','T'), curGroupID); m_curGroup = ( curGroupID == -1 ) ? NULL : m_taskManager->GetTaskGroup( curGroupID ); //Get the number of commands - m_ie->I_ReadSaveData( INT_ID('S','Q','#','C'), &m_numCommands, sizeof( m_numCommands ), NULL ); + ::sg_read(m_ie, INT_ID('S','Q','#','C'), m_numCommands); //Get the current sequence - m_ie->I_ReadSaveData( INT_ID('S','Q','C','S'), &seqID, sizeof( seqID ), NULL ); + ::sg_read(m_ie, INT_ID('S','Q','C','S'), seqID); m_curSequence = ( seqID != -1 ) ? m_owner->GetSequence( seqID ) : NULL; diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index 28c498855e..5123b00d7c 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -1815,10 +1815,10 @@ void CTaskManager::Load( void ) int i; //Get the GUID - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('T','M','I','D'), &m_GUID, sizeof( m_GUID ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('T','M','I','D'), m_GUID); //Get the number of tasks to follow - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('T','S','K','#'), &numTasks, sizeof( numTasks ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('T','S','K','#'), numTasks); //Reload all the tasks for ( i = 0; i < numTasks; i++ ) @@ -1828,11 +1828,11 @@ void CTaskManager::Load( void ) assert( task ); //Get the GUID - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('T','K','I','D'), &id, sizeof( id ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('T','K','I','D'), id); task->SetGUID( id ); //Get the time stamp - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('T','K','T','S'), &timeStamp, sizeof( timeStamp ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('T','K','T','S'), timeStamp); task->SetTimeStamp( timeStamp ); // @@ -1840,25 +1840,25 @@ void CTaskManager::Load( void ) // //Get the block ID and create a new container - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('B','L','I','D'), &id, sizeof( id ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('B','L','I','D'), id); block = new CBlock; block->Create( id ); //Read the block's flags - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('B','F','L','G'), &flags, sizeof( flags ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('B','F','L','G'), flags); block->SetFlags( flags ); //Get the number of block members - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('B','N','U','M'), &numMembers, sizeof( numMembers ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('B','N','U','M'), numMembers); for ( int j = 0; j < numMembers; j++ ) { //Get the member ID - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('B','M','I','D'), &bID, sizeof( bID ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('B','M','I','D'), bID); //Get the member size - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('B','S','I','Z'), &bSize, sizeof( bSize ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('B','S','I','Z'), bSize); //Get the member's data if ( ( bData = ICARUS_Malloc( bSize ) ) == NULL ) @@ -1868,7 +1868,7 @@ void CTaskManager::Load( void ) } //Get the actual raw data - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('B','M','E','M'), bData, bSize, NULL ); + ::sg_read_no_cast(m_owner->GetInterface(), INT_ID('B','M','E','M'), bData, bSize); //Write out the correct type switch ( bID ) @@ -1919,7 +1919,7 @@ void CTaskManager::Load( void ) //Load the task groups int numTaskGroups; - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('T','G','#','G'), &numTaskGroups, sizeof( numTaskGroups ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('T','G','#','G'), numTaskGroups); if ( numTaskGroups == 0 ) return; @@ -1934,7 +1934,7 @@ void CTaskManager::Load( void ) assert( taskGroup ); //Get this task group's ID - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('T','K','G','#'), &taskIDs[i], sizeof( taskIDs[i] ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('T','K','G','#'), taskIDs[i]); taskGroup->m_GUID = taskIDs[i]; m_taskGroupIDMap[ taskIDs[i] ] = taskGroup; @@ -1949,35 +1949,35 @@ void CTaskManager::Load( void ) assert( taskGroup ); //Load the parent ID - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('T','K','G','P'), &id, sizeof( id ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('T','K','G','P'), id); if ( id != -1 ) taskGroup->m_parent = ( GetTaskGroup( id ) != NULL ) ? GetTaskGroup( id ) : NULL; //Get the number of commands in this group - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('T','G','N','C'), &numMembers, sizeof( numMembers ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('T','G','N','C'), numMembers); //Get each command and its completion state for ( int j = 0; j < numMembers; j++ ) { //Get the ID - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('G','M','I','D'), &id, sizeof( id ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('G','M','I','D'), id); //Write out the state of completion - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('G','M','D','N'), &completed, sizeof( completed ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('G','M','D','N'), completed); //Save it out taskGroup->m_completedTasks[ id ] = completed; } //Get the number of completed tasks - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('T','G','D','N'), &taskGroup->m_numCompleted, sizeof( taskGroup->m_numCompleted ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('T','G','D','N'), taskGroup->m_numCompleted); } //Reload the currently active group int curGroupID; - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('T','G','C','G'), &curGroupID, sizeof( curGroupID ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('T','G','C','G'), curGroupID); //Reload the map entries for ( i = 0; i < numTaskGroups; i++ ) @@ -1986,13 +1986,13 @@ void CTaskManager::Load( void ) int length; //Get the size of the string - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('T','G','N','L'), &length, sizeof( length ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('T','G','N','L'), length); //Get the string - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('T','G','N','S'), &name, length, NULL ); + ::sg_read_no_cast(m_owner->GetInterface(), INT_ID('T','G','N','S'), name, length); //Get the id - (m_owner->GetInterface())->I_ReadSaveData( INT_ID('T','G','N','I'), &id, sizeof( id ), NULL ); + ::sg_read(m_owner->GetInterface(), INT_ID('T','G','N','I'), id); taskGroup = GetTaskGroup( id ); assert( taskGroup ); diff --git a/codemp/icarus/GameInterface.cpp b/codemp/icarus/GameInterface.cpp index f44c084e93..d32b2bb964 100644 --- a/codemp/icarus/GameInterface.cpp +++ b/codemp/icarus/GameInterface.cpp @@ -35,7 +35,7 @@ ICARUS_Instance *iICARUS; bufferlist_t ICARUS_BufferList; entlist_t ICARUS_EntList; -extern unsigned Com_BlockChecksum (const void *buffer, int length); +extern uint32_t Com_BlockChecksum (const void *buffer, int length); extern void Q3_DebugPrint( int level, const char *format, ... ); int ICARUS_entFilter = -1; diff --git a/codemp/qcommon/md4.cpp b/codemp/qcommon/md4.cpp index dd988ef643..0f34c8d6a5 100644 --- a/codemp/qcommon/md4.cpp +++ b/codemp/qcommon/md4.cpp @@ -195,10 +195,10 @@ static void mdfour(byte *out, byte *in, int n) //=================================================================== -unsigned Com_BlockChecksum (const void *buffer, int length) +uint32_t Com_BlockChecksum (const void *buffer, int length) { int digest[4]; - unsigned val; + uint32_t val; mdfour( (byte *)digest, (byte *)buffer, length ); diff --git a/codemp/qcommon/qcommon.h b/codemp/qcommon/qcommon.h index 3acb5378f5..d7c09abae8 100644 --- a/codemp/qcommon/qcommon.h +++ b/codemp/qcommon/qcommon.h @@ -755,7 +755,7 @@ void NORETURN QDECL Com_Error( int code, const char *fmt, ... ); void NORETURN Com_Quit_f( void ); int Com_EventLoop( void ); int Com_Milliseconds( void ); // will be journaled properly -unsigned Com_BlockChecksum( const void *buffer, int length ); +uint32_t Com_BlockChecksum( const void *buffer, int length ); char *Com_MD5File(const char *filename, int length, const char *prefix, int prefix_len); int Com_HashKey(char *string, int maxlen); int Com_Filter(char *filter, char *name, int casesensitive); diff --git a/shared/qcommon/ojk_sg_wrappers.h b/shared/qcommon/ojk_sg_wrappers.h new file mode 100644 index 0000000000..2babdc3492 --- /dev/null +++ b/shared/qcommon/ojk_sg_wrappers.h @@ -0,0 +1,1493 @@ +// +// Saved game wrappers. +// + + +#ifndef OJK_SG_WRAPPERS_INCLUDED +#define OJK_SG_WRAPPERS_INCLUDED + + +#ifdef __cplusplus + + +#include +#include +#include +#include +#include +#include + + +using SgReadFunc = std::function; + + +template +using SgArray = std::array; + +template +using SgArray2d = SgArray, TCount1>; + +using SgVec3 = SgArray; +using SgVec4 = SgArray; + +using SgBuffer = std::vector; + + +class SgException : + public std::runtime_error +{ +public: + explicit SgException( + const std::string& what_arg) : + std::runtime_error(what_arg) + { + } + + explicit SgException( + const char* what_arg) : + std::runtime_error(what_arg) + { + } + + virtual ~SgException() + { + } +}; // SgException + + +inline SgBuffer& sg_get_buffer( + int new_size) +{ + static SgBuffer buffer; + buffer.resize(new_size); + return buffer; +} + + +namespace detail { + + +template +class SgTraits +{ +private: + using yes = std::true_type; + using no = std::false_type; + + + // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + // ReadSaveData + + template + static auto test_read_save_data(int) -> decltype( + std::declval().ReadSaveData( + static_cast(0), + static_cast(nullptr), + static_cast(0), + static_cast(nullptr) + ) == 0, + + yes() + ); + + template + static no test_read_save_data(...); + + // ReadSaveData + // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + // I_ReadSaveData + + template + static auto test_i_read_save_data(int) -> decltype( + std::declval().I_ReadSaveData( + static_cast(0), + static_cast(nullptr), + static_cast(0), + static_cast(nullptr) + ) == 0, + + yes() + ); + + template + static no test_i_read_save_data(...); + + // I_ReadSaveData + // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + // ReadFromSaveGame + + template + static auto test_read_from_save_game(int) -> decltype( + std::declval().ReadFromSaveGame( + static_cast(0), + static_cast(nullptr), + static_cast(0), + static_cast(nullptr) + ) == 0, + + yes() + ); + + template + static no test_read_from_save_game(...); + + // ReadFromSaveGame + // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + // has_sg_export + + template + static auto test_sg_export(int) -> decltype( + std::declval().sg_export( + std::declval() + ), + + yes() + ); + + template + static no test_sg_export(...); + + // has_sg_export + // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + // has_sg_import + + template + static auto test_sg_import(int) -> decltype( + std::declval().sg_import( + std::declval() + ), + + yes() + ); + + template + static no test_sg_import(...); + + // has_sg_import + // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +public: + static constexpr bool is_numeric() + { + return std::is_arithmetic::value || std::is_enum::value; + } + + static constexpr bool is_any_char() + { + return + std::is_same::value || + std::is_same::value || + std::is_same::value; + } + + static constexpr bool is_array_1d() + { + return std::is_array::value && std::rank::value == 1; + } + + static constexpr bool is_array_2d() + { + return std::is_array::value && std::rank::value == 2; + } + + static constexpr bool has_read_save_data() + { + return std::is_same(0)), yes>::value; + } + + static constexpr bool has_i_read_save_data() + { + return std::is_same(0)), yes>::value; + } + + static constexpr bool has_read_from_save_game() + { + return std::is_same(0)), yes>::value; + } + + static constexpr bool has_sg_export() + { + return std::is_same(0)), yes>::value; + } + + static constexpr bool has_sg_import() + { + return std::is_same(0)), yes>::value; + } +}; // SgTraits + + +class SgVoidTag +{ +public: +}; //SgVoidTag + +class SgImportTag +{ +public: +}; //SgImportTag + +class SgExportTag +{ +public: +}; //SgExportTag + +class SgPointerTag +{ +public: +}; // SgPointerTag + +class SgArray1dTag +{ +public: +}; // SgArray1dTag + +class SgArray2dTag +{ +public: +}; // SgArray2dTag + +class SgClassTag +{ +public: +}; // SgClassTag + +class SgNumericTag +{ +public: +}; // SgNumericTag + +class SgBoolTag +{ +public: +}; // SgBoolTag + +class SgAnyCharTag +{ +public: +}; // SgAnyCharTag + +class SgFuncTag +{ +public: +}; // SgFuncTag + +class SgReadSaveDataFuncTag +{ +public: +}; // SgReadSaveDataFuncTag + +class SgIReadSaveDataFuncTag +{ +public: +}; // SgIReadSaveDataFuncTag + +class SgReadFromSaveGameFuncTag +{ +public: +}; // SgReadFromSaveGameFuncTag + + +} // detail + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// sg_get_read_func +// +// Returns a function wrapper for a function pointer, pointer to an object or +// a reference to an object. +// + +namespace detail { + + +template +inline SgReadFunc sg_get_read_func( + TFunc& func, + SgFuncTag) +{ + return func; +} + +template +inline SgReadFunc sg_get_read_func( + TInstance* instance, + SgPointerTag, + SgReadSaveDataFuncTag) +{ + return std::bind( + &TInstance::ReadSaveData, + instance, + std::placeholders::_1, + std::placeholders::_2, + std::placeholders::_3, + std::placeholders::_4); +} + +template +inline SgReadFunc sg_get_read_func( + TInstance* instance, + SgPointerTag, + SgIReadSaveDataFuncTag) +{ + return instance->I_ReadSaveData; +} + +template +inline SgReadFunc sg_get_read_func( + TInstance* instance, + SgPointerTag, + SgReadFromSaveGameFuncTag) +{ + return instance->ReadFromSaveGame; +} + +template +inline SgReadFunc sg_get_read_func( + TInstance* instance, + SgPointerTag) +{ + using Tag = typename std::conditional< + SgTraits::has_read_save_data(), + SgReadSaveDataFuncTag, + typename std::conditional< + SgTraits::has_i_read_save_data(), + SgIReadSaveDataFuncTag, + typename std::conditional< + SgTraits::has_read_from_save_game(), + SgReadFromSaveGameFuncTag, + void + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported instance type."); + + return sg_get_read_func( + instance, + SgPointerTag(), + Tag()); +} + +template +inline SgReadFunc sg_get_read_func( + TInstance& instance, + SgClassTag) +{ + return sg_get_read_func( + &instance, + SgPointerTag()); +} + +template +inline SgReadFunc sg_get_read_func( + TInstance& instance) +{ + using Tag = typename std::conditional< + std::is_function::value, + SgFuncTag, + typename std::conditional< + std::is_class::value, + SgClassTag, + typename std::conditional< + std::is_pointer::value, + SgPointerTag, + void + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported instance type."); + + return sg_get_read_func( + instance, + Tag()); +} + + +} // detail + +// sg_get_read_func +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// sg_export +// +// Exports a value or a fixed-array of values from a +// native type to a saved game one. +// + +namespace detail { + + +template +inline void sg_export( + const TSrc& src, + TDst& dst, + SgNumericTag) +{ + dst = static_cast(src); +} + +template +inline void sg_export( + const TSrc& src, + TDst& dst, + SgPointerTag) +{ + dst = static_cast(reinterpret_cast(src)); +} + +template +inline void sg_export( + const TSrc& src, + TDst& dst, + SgClassTag) +{ + src.sg_export(dst); +} + +template +inline void sg_export( + const TSrc (&src)[TCount], + SgArray& dst, + SgArray1dTag, + SgNumericTag) +{ + std::uninitialized_copy_n( + src, + TCount, + dst.begin()); +} + +template +inline void sg_export( + const TSrc (&src)[TCount], + SgArray& dst, + SgArray1dTag, + SgPointerTag) +{ + for (decltype(TCount) i = 0; i < TCount; ++i) { + dst[i] = static_cast(reinterpret_cast(src[i])); + } +} + +template +inline void sg_export( + const TSrc (&src)[TCount], + SgArray& dst, + SgArray1dTag, + SgClassTag) +{ + for (decltype(TCount) i = 0; i < TCount; ++i) { + sg_export( + src[i], + dst[i], + SgClassTag()); + } +} + +template +inline void sg_export( + const TSrc (&src)[TCount], + SgArray& dst, + SgArray1dTag) +{ + using Tag = typename std::conditional< + SgTraits::is_numeric() && SgTraits::is_numeric(), + SgNumericTag, + typename std::conditional< + std::is_pointer::value && SgTraits::is_numeric(), + SgPointerTag, + typename std::conditional< + SgTraits::has_sg_export() && std::is_class::value, + SgClassTag, + void + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + sg_export( + src, + dst, + SgArray1dTag(), + Tag()); +} + +template +inline void sg_export( + const TSrc (&src)[TCount1][TCount2], + SgArray2d& dst, + SgArray2dTag) +{ + static_assert( + detail::SgTraits::is_numeric() && + detail::SgTraits::is_numeric(), + "Unsupported types."); + + for (decltype(TCount1) i = 0; i < TCount1; ++i) { + std::uninitialized_copy_n( + src[i], + TCount2, + dst[i].begin()); + } +} + + +} // detail + + +template +inline void sg_export( + const TSrc& src, + TDst& dst) +{ + using Tag = typename std::conditional< + detail::SgTraits::is_numeric() && + detail::SgTraits::is_numeric(), + detail::SgNumericTag, + typename std::conditional< + std::is_pointer::value && + detail::SgTraits::is_numeric(), + detail::SgPointerTag, + typename std::conditional< + detail::SgTraits::has_sg_export() && + std::is_class::value, + detail::SgClassTag, + typename std::conditional< + detail::SgTraits::is_array_1d(), + detail::SgArray1dTag, + typename std::conditional< + detail::SgTraits::is_array_2d(), + detail::SgArray2dTag, + void + >::type + >::type + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + detail::sg_export( + src, + dst, + Tag()); +} + +// sg_export +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// sg_import +// +// Imports a value or a fixed-szie array of values from a +// saved game type to a native one. +// + +namespace detail { + + +template +inline void sg_import( + const TSrc& src, + TDst& dst, + SgNumericTag, + SgNumericTag) +{ + dst = static_cast(src); +} + +template +inline void sg_import( + const TSrc& src, + TDst& dst, + SgNumericTag, + SgBoolTag) +{ + dst = (src != 0); +} + +template +inline void sg_import( + const TSrc& src, + TDst& dst, + SgNumericTag) +{ + using Tag = typename std::conditional< + std::is_same::value, + SgBoolTag, + SgNumericTag + >::type; + + sg_import( + src, + dst, + SgNumericTag(), + Tag()); +} + +template +inline void sg_import( + const TSrc& src, + TDst& dst, + SgPointerTag) +{ + dst = reinterpret_cast(static_cast(src)); +} + +template +inline void sg_import( + const TSrc& src, + TDst& dst, + SgClassTag) +{ + dst.sg_import(src); +} + +template +inline void sg_import( + const SgArray& src, + TDst (&dst)[TCount], + SgArray1dTag, + SgNumericTag) +{ + std::uninitialized_copy( + src.cbegin(), + src.cend(), + dst); +} + +template +inline void sg_import( + const SgArray& src, + TDst (&dst)[TCount], + SgArray1dTag, + SgPointerTag) +{ + for (decltype(TCount) i = 0; i < TCount; ++i) { + dst[i] = reinterpret_cast(static_cast(src[i])); + } +} + +template +inline void sg_import( + const SgArray& src, + TDst (&dst)[TCount], + SgArray1dTag, + SgClassTag) +{ + for (decltype(TCount) i = 0; i < TCount; ++i) { + sg_import( + src[i], + dst[i], + SgClassTag()); + } +} + +template +inline void sg_import( + const SgArray& src, + TDst (&dst)[TCount], + SgArray1dTag) +{ + using Tag = typename std::conditional< + SgTraits::is_numeric() && SgTraits::is_numeric(), + SgNumericTag, + typename std::conditional< + SgTraits::is_numeric() && std::is_pointer::value, + SgPointerTag, + typename std::conditional< + std::is_class::value && SgTraits::has_sg_import(), + SgClassTag, + void + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + sg_import( + src, + dst, + SgArray1dTag(), + Tag()); +} + +template +inline void sg_import( + const SgArray2d& src, + TDst (&dst)[TCount1][TCount2], + SgArray2dTag) +{ + static_assert( + SgTraits::is_numeric() && SgTraits::is_numeric(), + "Unsupported types."); + + for (decltype(TCount1) i = 0; i < TCount1; ++i) { + std::uninitialized_copy( + src[i].cbegin(), + src[i].cend(), + dst[i]); + } +} + + +} // detail + + +template +inline void sg_import( + const TSrc& src, + TDst& dst) +{ + using Tag = typename std::conditional< + detail::SgTraits::is_numeric(), + detail::SgNumericTag, + typename std::conditional< + std::is_pointer::value, + detail::SgPointerTag, + typename std::conditional< + std::is_class::value && + detail::SgTraits::has_sg_import(), + detail::SgClassTag, + typename std::conditional< + detail::SgTraits::is_array_1d(), + detail::SgArray1dTag, + typename std::conditional< + detail::SgTraits::is_array_2d(), + detail::SgArray2dTag, + void + >::type + >::type + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + detail::sg_import( + src, + dst, + Tag()); +} + +// sg_import +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// sg_read_no_cast (fixed size) +// +// Reads a value or a fixed-size array of values from a +// saved game without conversion. +// + +namespace detail { + + +template +inline int sg_read_no_cast( + SgReadFunc& read_func, + unsigned int chunk_id, + TDst& dst_value, + SgNumericTag) +{ + constexpr auto dst_size = static_cast(sizeof(TDst)); + + return read_func( + chunk_id, + &dst_value, + dst_size, + nullptr); +} + +template +inline int sg_read_no_cast( + SgReadFunc& read_func, + unsigned int chunk_id, + TDst& dst_value, + SgClassTag) +{ + using SgType = typename TDst::SgType; + + constexpr auto src_size = static_cast(sizeof(SgType)); + + auto& buffer = sg_get_buffer( + src_size); + + auto read_result = read_func( + chunk_id, + buffer.data(), + src_size, + nullptr); + + auto& src_value = *reinterpret_cast(buffer.data()); + + ::sg_import(src_value, dst_value); + + return read_result; +} + +template +inline int sg_read_no_cast( + SgReadFunc& read_func, + unsigned int chunk_id, + TDst (&dst_values)[TCount], + SgArray1dTag, + SgNumericTag) +{ + constexpr auto dst_size = static_cast(TCount * sizeof(TDst)); + + return read_func( + chunk_id, + &dst_values[0], + dst_size, + nullptr); +} + +template +inline int sg_read_no_cast( + SgReadFunc& read_func, + unsigned int chunk_id, + TDst (&dst_values)[TCount], + SgArray1dTag, + SgClassTag) +{ + using SgType = typename TDst::SgType; + + constexpr auto src_size = static_cast(TCount * sizeof(SgType)); + + auto& buffer = sg_get_buffer( + src_size); + + auto read_result = read_func( + chunk_id, + buffer.data(), + src_size, + nullptr); + + auto src_values = reinterpret_cast(buffer.data()); + + for (decltype(TCount) i = 0; i < TCount; ++i) { + ::sg_import(src_values[i], dst_values[i]); + } + + return read_result; +} + +template +inline int sg_read_no_cast( + SgReadFunc& read_func, + unsigned int chunk_id, + TDst (&dst_values)[TCount], + SgArray1dTag) +{ + using Tag = typename std::conditional< + std::is_same::value, + void, + typename std::conditional< + detail::SgTraits::is_numeric(), + detail::SgNumericTag, + typename std::conditional< + detail::SgTraits::has_sg_import(), + detail::SgClassTag, + void + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + return sg_read_no_cast( + read_func, + chunk_id, + dst_values, + SgArray1dTag(), + Tag() + ); +} + + +} // detail + + +template +inline int sg_read_no_cast( + TInstance&& instance, + unsigned int chunk_id, + TDst& dst_value) +{ + using Tag = typename std::conditional< + std::is_same::value, + void, + typename std::conditional< + detail::SgTraits::is_numeric(), + detail::SgNumericTag, + typename std::conditional< + detail::SgTraits::has_sg_import(), + detail::SgClassTag, + typename std::conditional< + detail::SgTraits::is_array_1d(), + detail::SgArray1dTag, + void + >::type + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + auto read_func = detail::sg_get_read_func( + instance); + + return detail::sg_read_no_cast( + read_func, + chunk_id, + dst_value, + Tag()); +} + +// sg_read_no_cast (fixed size) +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// sg_read_no_cast (dynamic size) +// +// Reads a specified number of values from a +// saved game without conversion. +// + +namespace detail { + + +template +inline int sg_read_no_cast( + SgReadFunc& read_func, + unsigned int chunk_id, + TDst* dst_values, + int dst_count, + SgPointerTag, + SgNumericTag) +{ + const auto dst_size = static_cast(dst_count * sizeof(TDst)); + + return read_func( + chunk_id, + dst_values, + dst_size, + nullptr); +} + +inline int sg_read_no_cast( + SgReadFunc& read_func, + unsigned int chunk_id, + void* dst_values, + int dst_count, + SgPointerTag, + SgVoidTag) +{ + return read_func( + chunk_id, + dst_values, + dst_count, + nullptr); +} + +template +inline int sg_read_no_cast( + SgReadFunc& read_func, + unsigned int chunk_id, + TDst* dst_values, + int dst_count, + SgPointerTag) +{ + using Tag = typename std::conditional< + std::is_same::value, + void, + typename std::conditional< + SgTraits::is_numeric(), + SgNumericTag, + typename std::conditional< + std::is_same::value, + SgVoidTag, + void + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + if (!dst_values) { + throw SgException("Null pointer."); + } + + return sg_read_no_cast( + read_func, + chunk_id, + dst_values, + dst_count, + SgPointerTag(), + Tag()); +} + +template +inline int sg_read_no_cast( + SgReadFunc& read_func, + unsigned int chunk_id, + TDst (&dst_values)[TCount], + int dst_count, + SgArray1dTag) +{ + if (dst_count > TCount) { + throw SgException("Read overflow."); + } + + return sg_read_no_cast( + read_func, + chunk_id, + &dst_values[0], + dst_count, + SgPointerTag()); +} + + +} // detail + + +template +inline int sg_read_no_cast( + TInstance&& instance, + unsigned int chunk_id, + TDst& dst_value, + int dst_count) +{ + using Tag = typename std::conditional< + std::is_same::value, + void, + typename std::conditional< + std::is_pointer::value, + detail::SgPointerTag, + typename std::conditional< + detail::SgTraits::is_array_1d(), + detail::SgArray1dTag, + void + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + + auto read_func = detail::sg_get_read_func( + instance); + + return detail::sg_read_no_cast( + read_func, + chunk_id, + dst_value, + dst_count, + Tag()); +} + +// sg_read_no_cast (dynamic size) +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// sg_read (fixed size) +// +// Reads a value or a fixed-array of values from a +// saved game with conversion. +// + +namespace detail { + + +template +inline int sg_read( + SgReadFunc& read_func, + unsigned int chunk_id, + TDst& dst_value, + SgBoolTag) +{ + TSrc src_value; + constexpr auto src_size = static_cast(sizeof(TSrc)); + + auto read_result = read_func( + chunk_id, + &src_value, + src_size, + nullptr); + + dst_value = (src_value != 0); + + return read_result; +} + +template +inline int sg_read( + SgReadFunc& read_func, + unsigned int chunk_id, + TDst& dst_value, + SgNumericTag) +{ + TSrc src_value; + constexpr auto src_size = static_cast(sizeof(TSrc)); + + auto read_result = read_func( + chunk_id, + &src_value, + src_size, + nullptr); + + dst_value = static_cast(src_value); + + return read_result; +} + +template +inline int sg_read( + SgReadFunc& read_func, + unsigned int chunk_id, + TDst& dst_value, + SgPointerTag) +{ + TSrc src_value; + constexpr auto src_size = static_cast(sizeof(TSrc)); + + auto read_result = read_func( + chunk_id, + &src_value, + src_size, + nullptr); + + dst_value = reinterpret_cast(static_cast(src_value)); + + return read_result; +} + +template +inline int sg_read( + SgReadFunc& read_func, + unsigned int chunk_id, + TDst (&dst_values)[TCount], + SgArray1dTag, + SgNumericTag) +{ + constexpr auto src_size = static_cast(TCount * sizeof(TSrc)); + + auto& src_buffer = sg_get_buffer( + src_size); + + auto read_result = read_func( + chunk_id, + src_buffer.data(), + src_size, + nullptr); + + auto src_values = reinterpret_cast(src_buffer.data()); + + std::uninitialized_copy_n( + src_values, + TCount, + dst_values); + + return read_result; +} + +template +inline int sg_read( + SgReadFunc& read_func, + unsigned int chunk_id, + TDst (&dst_values)[TCount], + SgArray1dTag) +{ + using Tag = typename std::conditional< + std::is_same::value || std::is_same::value, + void, + typename std::conditional< + SgTraits::is_numeric() && SgTraits::is_numeric(), + SgNumericTag, + void + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + return sg_read( + read_func, + chunk_id, + dst_values, + SgArray1dTag(), + Tag()); +} + + +} // detail + + +template +inline int sg_read( + TInstance&& instance, + unsigned int chunk_id, + TDst& dst_value) +{ + using Tag = typename std::conditional< + detail::SgTraits::is_numeric() && + std::is_same::value, + detail::SgBoolTag, + typename std::conditional< + detail::SgTraits::is_numeric() && + detail::SgTraits::is_numeric(), + detail::SgNumericTag, + typename std::conditional< + detail::SgTraits::is_numeric() && + std::is_pointer::value, + detail::SgPointerTag, + typename std::conditional< + detail::SgTraits::is_array_1d(), + detail::SgArray1dTag, + void + >::type + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + auto read_func = detail::sg_get_read_func( + instance); + + return detail::sg_read( + read_func, + chunk_id, + dst_value, + Tag()); +} + +// sg_read (fixed size) +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// sg_read (dynamic size) +// +// Reads a spesified number of values from a +// saved game with conversion. +// + +namespace detail { + + +template +inline int sg_read( + SgReadFunc& read_func, + unsigned int chunk_id, + TDst* dst_values, + int dst_count, + SgPointerTag) +{ + if (!dst_values) { + throw SgException("Null destination poiner."); + } + + const auto src_size = static_cast(dst_count * sizeof(TSrc)); + + auto& buffer = sg_get_buffer( + src_size); + + auto read_result = read_func( + chunk_id, + buffer.data(), + src_size, + nullptr); + + auto src_values = reinterpret_cast(buffer.data()); + + std::uninitialized_copy_n( + src_values, + dst_count, + dst_values); + + return read_result; +} + +template +inline int sg_read( + SgReadFunc& read_func, + unsigned int chunk_id, + TDst (&dst_values)[TCount], + int dst_count, + SgArray1dTag) +{ + return sg_read( + read_func, + chunk_id, + &dst_values[0], + dst_count, + SgPointerTag()); +} + + +} // detail + + +template +inline int sg_read( + TInstance&& instance, + unsigned int chunk_id, + TDst& dst_value, + int dst_count) +{ + using Tag = typename std::conditional< + detail::SgTraits::is_numeric() && + std::is_pointer::value, + detail::SgPointerTag, + typename std::conditional< + detail::SgTraits::is_array_1d(), + detail::SgArray1dTag, + void + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + if (dst_count < 0) { + throw SgException("Negative destination count."); + } + + auto read_func = detail::sg_get_read_func( + instance); + + return detail::sg_read( + read_func, + chunk_id, + dst_value, + dst_count, + Tag()); +} + +// sg_read (dynamic size) +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// sg_read_skip +// +// Skips a specified number of bytes in a saved game. +// + +template +inline int sg_read_skip( + TInstance&& instance, + unsigned int chunk_id, + int count) +{ + if (count < 0) { + throw SgException("Negative count."); + } + + auto read_func = detail::sg_get_read_func( + instance); + + return read_func( + chunk_id, + nullptr, + count, + nullptr); +} + +template +inline int sg_read_skip( + TInstance&& instance, + unsigned int chunk_id) +{ + constexpr auto skip_size = static_cast(sizeof(TSkip)); + + return sg_read_skip( + instance, + chunk_id, + skip_size); +} + +// sg_read_skip +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// Reads a data from a saved game into an automatically allocated block. +template +inline int sg_read_allocate( + TInstance&& instance, + unsigned int chunk_id, + TValue*& value) +{ + auto read_func = detail::sg_get_read_func( + instance); + + void* void_ptr = nullptr; + + auto read_result = read_func( + chunk_id, + nullptr, + 0, + &void_ptr); + + value = static_cast(void_ptr); + + return read_result; +} + + +#endif // __cplusplus + + +#endif // OJK_SG_WRAPPERS_INCLUDED From 7d1b1e704fa5415b24f9bea8181c60d2a2f4d4a5 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Mon, 20 Jun 2016 17:06:28 +0300 Subject: [PATCH 211/445] Add wrappers for writing saved games --- code/cgame/FxScheduler.cpp | 4 +- code/cgame/cg_main.cpp | 4 +- code/game/G_Timer.cpp | 6 +- code/game/Q3_Interface.cpp | 20 +- code/game/Q3_Interface.h | 2 +- code/game/g_main.cpp | 4 +- code/game/g_objectives.cpp | 2 +- code/game/g_roff.cpp | 6 +- code/game/g_savegame.cpp | 14 +- code/icarus/IcarusImplementation.cpp | 6 +- code/icarus/IcarusInterface.h | 2 +- code/qcommon/cm_load.cpp | 2 +- code/rd-vanilla/G2_misc.cpp | 39 +- code/server/sv_savegame.cpp | 38 +- codeJK2/cgame/cg_main.cpp | 4 +- codeJK2/game/G_Timer.cpp | 8 +- codeJK2/game/Q3_Interface.cpp | 2 +- codeJK2/game/Q3_Registers.cpp | 20 +- codeJK2/game/g_main.cpp | 4 +- codeJK2/game/g_objectives.cpp | 2 +- codeJK2/game/g_roff.cpp | 6 +- codeJK2/game/g_savegame.cpp | 77 ++- codeJK2/icarus/Instance.cpp | 16 +- codeJK2/icarus/Sequence.cpp | 26 +- codeJK2/icarus/Sequencer.cpp | 18 +- codeJK2/icarus/TaskManager.cpp | 42 +- codeJK2/icarus/interface.h | 2 +- codemp/icarus/Q3_Interface.cpp | 2 +- codemp/icarus/interface.h | 2 +- shared/qcommon/ojk_sg_wrappers.h | 840 ++++++++++++++++++++++++++- 30 files changed, 1055 insertions(+), 165 deletions(-) diff --git a/code/cgame/FxScheduler.cpp b/code/cgame/FxScheduler.cpp index 020f29c6db..ae8800bce0 100644 --- a/code/cgame/FxScheduler.cpp +++ b/code/cgame/FxScheduler.cpp @@ -125,7 +125,7 @@ void CFxScheduler::LoadSave_Write() { // bsave the data we need... // - gi.AppendToSaveGame(INT_ID('F','X','L','E'), mLoopedEffectArray, sizeof(mLoopedEffectArray)); + ::sg_write_no_cast(::gi, INT_ID('F','X','L','E'), mLoopedEffectArray); // // then cope with the fact that the mID field in each struct of the array we've just saved will not // necessarily point at the same thing when reloading, so save out the actual fx filename strings they @@ -157,7 +157,7 @@ void CFxScheduler::LoadSave_Write() // write out this string... // - gi.AppendToSaveGame(INT_ID('F','X','F','N'), sFX_Filename, sizeof(sFX_Filename)); + ::sg_write_no_cast(::gi, INT_ID('F','X','F','N'), sFX_Filename); } } diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 732c9c785a..b9646d5d7a 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -1905,8 +1905,8 @@ static void CG_GameStateReceived( void ) { void CG_WriteTheEvilCGHackStuff(void) { - gi.AppendToSaveGame(INT_ID('F','P','S','L'), &cg.forcepowerSelect, sizeof(cg.forcepowerSelect)); - gi.AppendToSaveGame(INT_ID('I','V','S','L'), &cg.inventorySelect, sizeof(cg.inventorySelect)); + ::sg_write(::gi, INT_ID('F','P','S','L'), ::cg.forcepowerSelect); + ::sg_write(::gi, INT_ID('I','V','S','L'), ::cg.inventorySelect); } void CG_ReadTheEvilCGHackStuff(void) diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index 6591847c34..0835ddeda9 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -171,7 +171,7 @@ void TIMER_Save( void ) } //Write out the timer information - gi.AppendToSaveGame(INT_ID('T','I','M','E'), (void *)&numTimers, sizeof(numTimers)); + ::sg_write(::gi, INT_ID('T','I','M','E'), numTimers); gtimer_t *p = g_timers[j]; assert ((numTimers && p) || (!numTimers && !p)); @@ -185,10 +185,10 @@ void TIMER_Save( void ) assert( length < 1024 );//This will cause problems when loading the timer if longer //Write out the id string - gi.AppendToSaveGame(INT_ID('T','M','I','D'), (void *) timerID, length); + ::sg_write_no_cast(::gi, INT_ID('T','M','I','D'), timerID, length); //Write out the timer data - gi.AppendToSaveGame(INT_ID('T','D','T','A'), (void *) &time, sizeof( time ) ); + ::sg_write(::gi, INT_ID('T','D','T','A'), time); p = p->next; } } diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 51b3e79ec4..bb4e71d1d1 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -7206,7 +7206,7 @@ VariableSaveFloats void CQuake3GameInterface::VariableSaveFloats( varFloat_m &fmap ) { int numFloats = fmap.size(); - gi.AppendToSaveGame( INT_ID('F','V','A','R'), &numFloats, sizeof( numFloats ) ); + ::sg_write(::gi, INT_ID('F','V','A','R'), numFloats); varFloat_m::iterator vfi; STL_ITERATE( vfi, fmap ) @@ -7215,11 +7215,11 @@ void CQuake3GameInterface::VariableSaveFloats( varFloat_m &fmap ) int idSize = strlen( ((*vfi).first).c_str() ); //Save out the real data - gi.AppendToSaveGame( INT_ID('F','I','D','L'), &idSize, sizeof( idSize ) ); - gi.AppendToSaveGame( INT_ID('F','I','D','S'), (void *) ((*vfi).first).c_str(), idSize ); + ::sg_write(::gi, INT_ID('F','I','D','L'), idSize); + ::sg_write_no_cast(::gi, INT_ID('F','I','D','S'), ((*vfi).first).c_str(), idSize); //Save out the float value - gi.AppendToSaveGame( INT_ID('F','V','A','L'), &((*vfi).second), sizeof( float ) ); + ::sg_write_no_cast(::gi, INT_ID('F','V','A','L'), (*vfi).second); } } @@ -7232,7 +7232,7 @@ VariableSaveStrings void CQuake3GameInterface::VariableSaveStrings( varString_m &smap ) { int numStrings = smap.size(); - gi.AppendToSaveGame( INT_ID('S','V','A','R'), &numStrings, sizeof( numStrings ) ); + ::sg_write(::gi, INT_ID('S','V','A','R'), numStrings); varString_m::iterator vsi; STL_ITERATE( vsi, smap ) @@ -7241,14 +7241,14 @@ void CQuake3GameInterface::VariableSaveStrings( varString_m &smap ) int idSize = strlen( ((*vsi).first).c_str() ); //Save out the real data - gi.AppendToSaveGame( INT_ID('S','I','D','L'), &idSize, sizeof( idSize ) ); - gi.AppendToSaveGame( INT_ID('S','I','D','S'), (void *) ((*vsi).first).c_str(), idSize ); + ::sg_write(::gi, INT_ID('S','I','D','L'), idSize); + ::sg_write_no_cast(::gi, INT_ID('S','I','D','S'), ((*vsi).first).c_str(), idSize); //Save out the string value idSize = strlen( ((*vsi).second).c_str() ); - gi.AppendToSaveGame( INT_ID('S','V','S','Z'), &idSize, sizeof( idSize ) ); - gi.AppendToSaveGame( INT_ID('S','V','A','L'), (void *) ((*vsi).second).c_str(), idSize ); + ::sg_write(::gi, INT_ID('S','V','S','Z'), idSize); + ::sg_write_no_cast(::gi, INT_ID('S','V','A','L'), ((*vsi).second).c_str(), idSize); } } @@ -11100,7 +11100,7 @@ void CQuake3GameInterface::FreeVariable( const char *name ) } //Save / Load functions -int CQuake3GameInterface::WriteSaveData( unsigned int chid, void *data, int length ) +int CQuake3GameInterface::WriteSaveData( unsigned int chid, const void *data, int length ) { return gi.AppendToSaveGame( chid, data, length ); } diff --git a/code/game/Q3_Interface.h b/code/game/Q3_Interface.h index df15fdad8e..56bcb059e4 100644 --- a/code/game/Q3_Interface.h +++ b/code/game/Q3_Interface.h @@ -697,7 +697,7 @@ class CQuake3GameInterface : public IGameInterface void FreeVariable( const char *name ); //Save / Load functions - int WriteSaveData( unsigned int chid, void *data, int length ); + int WriteSaveData( unsigned int chid, const void *data, int length ); int ReadSaveData( unsigned int chid, void *address, int length, void **addressptr = NULL ); int LinkGame( int entID, int icarusID ); diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 6ddf5c4018..8b4154f5eb 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -105,7 +105,7 @@ qboolean PInUse(unsigned int entNum) void WriteInUseBits(void) { - gi.AppendToSaveGame(INT_ID('I','N','U','S'), &g_entityInUseBits, sizeof(g_entityInUseBits) ); + ::sg_write(::gi, INT_ID('I','N','U','S'), ::g_entityInUseBits); } void ReadInUseBits(void) @@ -2108,7 +2108,7 @@ extern qboolean player_locked; void G_LoadSave_WriteMiscData(void) { - gi.AppendToSaveGame(INT_ID('L','C','K','D'), &player_locked, sizeof(player_locked)); + ::sg_write(::gi, INT_ID('L','C','K','D'), player_locked); } diff --git a/code/game/g_objectives.cpp b/code/game/g_objectives.cpp index 57d13fd044..9805cbc5c4 100644 --- a/code/game/g_objectives.cpp +++ b/code/game/g_objectives.cpp @@ -59,7 +59,7 @@ OBJ_SaveMissionObjectives */ void OBJ_SaveMissionObjectives( gclient_t *client ) { - gi.AppendToSaveGame(INT_ID('O','B','J','T'), client->sess.mission_objectives, sizeof(client->sess.mission_objectives)); + ::sg_write_no_cast(::gi, INT_ID('O','B','J','T'), client->sess.mission_objectives); } diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp index 01c671c868..588dce0b29 100644 --- a/code/game/g_roff.cpp +++ b/code/game/g_roff.cpp @@ -650,15 +650,15 @@ void G_SaveCachedRoffs() int i, len; // Write out the number of cached ROFFs - gi.AppendToSaveGame( INT_ID('R','O','F','F'), (void *)&num_roffs, sizeof(num_roffs) ); + ::sg_write(::gi, INT_ID('R','O','F','F'), num_roffs); // Now dump out the cached ROFF file names in order so they can be loaded on the other end for ( i = 0; i < num_roffs; i++ ) { // Dump out the string length to make things a bit easier on the other end...heh heh. len = strlen( roffs[i].fileName ) + 1; - gi.AppendToSaveGame( INT_ID('S','L','E','N'), (void *)&len, sizeof(len) ); - gi.AppendToSaveGame( INT_ID('R','S','T','R'), (void *)roffs[i].fileName, len ); + ::sg_write(::gi, INT_ID('S','L','E','N'), len); + ::sg_write_no_cast(::gi, INT_ID('R','S','T','R'), roffs[i].fileName, len); } } diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index f469f6bd0b..ea612f97d1 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -517,14 +517,14 @@ static void EnumerateFields(const save_field_t *pFields, const byte *pbData, uns // save out raw data... // - gi.AppendToSaveGame(ulChid, pbData, iLen); + ::sg_write_no_cast(::gi, ulChid, pbData, static_cast(iLen)); // save out any associated strings.. // std::list::iterator it = strList->begin(); for (size_t i=0; isize(); i++, ++it) { - gi.AppendToSaveGame(INT_ID('S','T','R','G'), (void *)(*it).c_str(), (*it).length() + 1); + ::sg_write_no_cast(::gi, INT_ID('S','T','R','G'), (*it).c_str(), static_cast((*it).length() + 1)); } delete strList; @@ -834,7 +834,7 @@ static void WriteGEntities(qboolean qbAutosave) } } - gi.AppendToSaveGame(INT_ID('N','M','E','D'), &iCount, sizeof(iCount)); + ::sg_write(::gi, INT_ID('N','M','E','D'), iCount); for (i=0; i<(qbAutosave?1:globals.num_entities); i++) { @@ -842,7 +842,7 @@ static void WriteGEntities(qboolean qbAutosave) if ( ent->inuse) { - gi.AppendToSaveGame(INT_ID('E','D','N','M'), (void *)&i, sizeof(i)); + ::sg_write(::gi, INT_ID('E','D','N','M'), i); qboolean qbLinked = ent->linked; gi.unlinkentity( ent ); @@ -873,7 +873,7 @@ static void WriteGEntities(qboolean qbAutosave) if (tempEnt.parms) { - gi.AppendToSaveGame(INT_ID('P','A','R','M'), ent->parms, sizeof(*ent->parms)); + ::sg_write_no_cast(::gi, INT_ID('P','A','R','M'), *ent->parms); } if (tempEnt.m_pVehicle) @@ -902,7 +902,7 @@ static void WriteGEntities(qboolean qbAutosave) // This saves time debugging, and makes things easier to track. // static int iBlah = 1234; - gi.AppendToSaveGame(INT_ID('I','C','O','K'), &iBlah, sizeof(iBlah)); + ::sg_write(::gi, INT_ID('I','C','O','K'), iBlah); } if (!qbAutosave )//really shouldn't need to write these bits at all, just restore them from the ents... { @@ -1188,7 +1188,7 @@ void WriteLevel(qboolean qbAutosave) // put out an end-marker so that the load code can check everything was read in... // static int iDONE = 1234; - gi.AppendToSaveGame(INT_ID('D','O','N','E'), &iDONE, sizeof(iDONE)); + ::sg_write(::gi, INT_ID('D','O','N','E'), iDONE); } void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index b35870c7e7..71b4394ab6 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -540,7 +540,7 @@ int CIcarus::Save() //Save out a ICARUS save block header with the ICARUS version double version = ICARUS_VERSION; - game->WriteSaveData( INT_ID('I','C','A','R'), &version, sizeof( version ) ); + ::sg_write_no_cast(game, INT_ID('I','C','A','R'), version); //Save out the signals if ( SaveSignals() == false ) @@ -564,7 +564,7 @@ int CIcarus::Save() } // Write out the buffer with all our collected data. - game->WriteSaveData( INT_ID('I','S','E','Q'), m_byBuffer, m_ulBufferCurPos ); + ::sg_write_no_cast(game, INT_ID('I','S','E','Q'), m_byBuffer, static_cast(m_ulBufferCurPos)); // De-allocate the temporary buffer. DestroyBuffer(); @@ -782,7 +782,7 @@ void CIcarus::BufferWrite( void *pSrcData, unsigned long ulNumBytesToWrite ) if ( MAX_BUFFER_SIZE - m_ulBufferCurPos < ulNumBytesToWrite ) { // Write out the buffer with all our collected data so far... IGameInterface::GetGame()->DebugPrint( IGameInterface::WL_ERROR, "BufferWrite: Out of buffer space, Flushing." ); - IGameInterface::GetGame()->WriteSaveData( INT_ID('I','S','E','Q'), m_byBuffer, m_ulBufferCurPos ); + ::sg_write_no_cast(IGameInterface::GetGame(), INT_ID('I','S','E','Q'), m_byBuffer, static_cast(m_ulBufferCurPos)); m_ulBufferCurPos = 0; //reset buffer } diff --git a/code/icarus/IcarusInterface.h b/code/icarus/IcarusInterface.h index baa69814d2..9ba27ec35b 100644 --- a/code/icarus/IcarusInterface.h +++ b/code/icarus/IcarusInterface.h @@ -144,7 +144,7 @@ class IGameInterface // Save / Load functions - virtual int WriteSaveData( unsigned int chid, void *data, int length ) = 0; + virtual int WriteSaveData( unsigned int chid, const void *data, int length ) = 0; virtual int ReadSaveData( unsigned int chid, void *address, int length, void **addressptr = NULL ) = 0; virtual int LinkGame( int gameID, int icarusID ) = 0; diff --git a/code/qcommon/cm_load.cpp b/code/qcommon/cm_load.cpp index f76f318b1d..a1ff55f071 100644 --- a/code/qcommon/cm_load.cpp +++ b/code/qcommon/cm_load.cpp @@ -1215,7 +1215,7 @@ int SG_Read(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPt void CM_WritePortalState () { - SG_Append(INT_ID('P','R','T','S'), (void *)cmg.areaPortals, cmg.numAreas * cmg.numAreas * sizeof( *cmg.areaPortals )); + ::sg_write(::SG_Append, INT_ID('P','R','T','S'), ::cmg.areaPortals, ::cmg.numAreas * ::cmg.numAreas); } /* diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index b9cf1ef9b8..548fa18271 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -1778,12 +1778,13 @@ void G2_SaveGhoul2Models(CGhoul2Info_v &ghoul2) // is there anything to save? if (!ghoul2.IsValid()||!ghoul2.size()) { - ri.SG_Append(INT_ID('G','H','L','2'),&pGhoul2Data, 4); //write out a zero buffer + uint32_t empty_value = 0; + ::sg_write_no_cast(::ri, INT_ID('G','H','L','2'), empty_value); //write out a zero buffer return; } // this one isn't a define since I couldn't work out how to figure it out at compile time - const int ghoul2BlockSize = (intptr_t)&ghoul2[0].BSAVE_END_FIELD - (intptr_t)&ghoul2[0].BSAVE_START_FIELD; + constexpr auto ghoul2BlockSize = static_cast(sizeof(SgCGhoul2Info)); // add in count for number of ghoul2 models iGhoul2Size += 4; @@ -1809,51 +1810,75 @@ void G2_SaveGhoul2Models(CGhoul2Info_v &ghoul2) char *tempBuffer = pGhoul2Data; // save out how many ghoul2 models we have - *(int *)tempBuffer = ghoul2.size(); + *(int32_t*)tempBuffer = static_cast(ghoul2.size()); tempBuffer +=4; for (int i = 0; i(tempBuffer)); +#endif tempBuffer += ghoul2BlockSize; // save out how many surfaces we have - *(int*)tempBuffer = ghoul2[i].mSlist.size(); + *(int32_t*)tempBuffer = static_cast(ghoul2[i].mSlist.size()); tempBuffer +=4; // now save the all the surface list info for (size_t x=0; x(tempBuffer)); +#endif tempBuffer += SURFACE_SAVE_BLOCK_SIZE; } // save out how many bones we have - *(int*)tempBuffer = ghoul2[i].mBlist.size(); + *(int32_t*)tempBuffer = static_cast(ghoul2[i].mBlist.size()); tempBuffer +=4; // now save the all the bone list info for (size_t x = 0; x(tempBuffer)); +#endif tempBuffer += BONE_SAVE_BLOCK_SIZE; } // save out how many bolts we have - *(int*)tempBuffer = ghoul2[i].mBltlist.size(); + *(int32_t*)tempBuffer = static_cast(ghoul2[i].mBltlist.size()); tempBuffer +=4; // lastly save the all the bolt list info for (size_t x = 0; x(tempBuffer)); +#endif tempBuffer += BOLT_SAVE_BLOCK_SIZE; } } - ri.SG_Append(INT_ID('G','H','L','2'),pGhoul2Data, iGhoul2Size); + ::sg_write_no_cast(::ri, INT_ID('G','H','L','2'), pGhoul2Data, iGhoul2Size); R_Free(pGhoul2Data); } diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 55614a00fa..99a3a06d82 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -178,7 +178,7 @@ static qboolean SG_Create( const char *psPathlessBaseName ) } giSaveGameVersion = iSAVEGAME_VERSION; - SG_Append(INT_ID('_','V','E','R'), &giSaveGameVersion, sizeof(giSaveGameVersion)); + ::sg_write(::SG_Append, INT_ID('_','V','E','R'), ::giSaveGameVersion); return qtrue; } @@ -539,7 +539,7 @@ void SV_SaveGame_f(void) //--------------- static void WriteGame(qboolean autosave) { - SG_Append(INT_ID('G','A','M','E'), &autosave, sizeof(autosave)); + ::sg_write(::SG_Append, INT_ID('G','A','M','E'), autosave); if (autosave) { @@ -554,25 +554,25 @@ static void WriteGame(qboolean autosave) // memset(s,0,sizeof(s)); Cvar_VariableStringBuffer( sCVARNAME_PLAYERSAVE, s, sizeof(s) ); - SG_Append(INT_ID('C','V','S','V'), &s, sizeof(s)); + ::sg_write_no_cast(::SG_Append, INT_ID('C','V','S','V'), s); // write ammo... // memset(s,0,sizeof(s)); Cvar_VariableStringBuffer( "playerammo", s, sizeof(s) ); - SG_Append(INT_ID('A','M','M','O'), &s, sizeof(s)); + ::sg_write_no_cast(::SG_Append, INT_ID('A','M','M','O'), s); // write inventory... // memset(s,0,sizeof(s)); Cvar_VariableStringBuffer( "playerinv", s, sizeof(s) ); - SG_Append(INT_ID('I','V','T','Y'), &s, sizeof(s)); + ::sg_write_no_cast(::SG_Append, INT_ID('I','V','T','Y'), s); // the new JK2 stuff - force powers, etc... // memset(s,0,sizeof(s)); Cvar_VariableStringBuffer( "playerfplvl", s, sizeof(s) ); - SG_Append(INT_ID('F','P','L','V'), &s, sizeof(s)); + ::sg_write_no_cast(::SG_Append, INT_ID('F','P','L','V'), s); } } @@ -643,7 +643,7 @@ void SG_WriteCvars(void) // store count... // - SG_Append(INT_ID('C','V','C','N'), &iCount, sizeof(iCount)); + ::sg_write(::SG_Append, INT_ID('C','V','C','N'), iCount); // write 'em... // @@ -657,8 +657,8 @@ void SG_WriteCvars(void) { continue; } - SG_Append(INT_ID('C','V','A','R'), var->name, strlen(var->name) + 1); - SG_Append(INT_ID('V','A','L','U'), var->string, strlen(var->string) + 1); + ::sg_write_no_cast(::SG_Append, INT_ID('C','V','A','R'), var->name, static_cast(strlen(var->name) + 1)); + ::sg_write_no_cast(::SG_Append, INT_ID('V','A','L','U'), var->string, static_cast(strlen(var->string) + 1)); } } @@ -700,7 +700,7 @@ void SG_WriteServerConfigStrings( void ) } } - SG_Append(INT_ID('C','S','C','N'), &iCount, sizeof(iCount)); + ::sg_write(::SG_Append, INT_ID('C','S','C','N'), iCount); // now write 'em... // @@ -710,8 +710,8 @@ void SG_WriteServerConfigStrings( void ) { if (sv.configstrings[i] && strlen(sv.configstrings[i])) { - SG_Append(INT_ID('C','S','I','N'), &i, sizeof(i)); - SG_Append(INT_ID('C','S','D','A'), sv.configstrings[i], strlen(sv.configstrings[i])+1); + ::sg_write(::SG_Append, INT_ID('C','S','I','N'), i); + ::sg_write_no_cast(::SG_Append, INT_ID('C','S','D','A'), ::sv.configstrings[i], static_cast(strlen(::sv.configstrings[i])+1)); } } } @@ -775,11 +775,11 @@ static void SG_WriteComment(qboolean qbAutosave, const char *psMapName) Q_strncpyz(sComment,saveGameComment, sizeof(sComment)); } - SG_Append(INT_ID('C','O','M','M'), sComment, sizeof(sComment)); + ::sg_write_no_cast(::SG_Append, INT_ID('C','O','M','M'), sComment); // Add Date/Time/Map stamp unsigned int timestamp = SG_UnixTimestamp (time (NULL)); - SG_Append(INT_ID('C','M','T','M'), ×tamp, sizeof (timestamp)); + ::sg_write(::SG_Append, INT_ID('C','M','T','M'), timestamp); Com_DPrintf("Saving: current (%s)\n", sComment); } @@ -975,8 +975,8 @@ static void SG_WriteScreenshot(qboolean qbAutosave, const char *psMapName) iJPGDataSize = re.SaveJPGToBuffer(pJPGData, bufSize, JPEG_IMAGE_QUALITY, SG_SCR_WIDTH, SG_SCR_HEIGHT, pbRawScreenShot, 0 ); if ( qbAutosave ) delete[] byBlank; - SG_Append(INT_ID('S','H','L','N'), &iJPGDataSize, sizeof(iJPGDataSize)); - SG_Append(INT_ID('S','H','O','T'), pJPGData, iJPGDataSize); + ::sg_write(::SG_Append, INT_ID('S','H','L','N'), iJPGDataSize); + ::sg_write_no_cast(::SG_Append, INT_ID('S','H','O','T'), pJPGData, static_cast(iJPGDataSize)); Z_Free(pJPGData); SCR_TempRawImage_CleanUp(); } @@ -1056,7 +1056,7 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) #ifdef JK2_MODE SG_WriteScreenshot(qbAutosave, sMapCmd); #endif - SG_Append(INT_ID('M','P','C','M'), sMapCmd, sizeof(sMapCmd)); + ::sg_write_no_cast(::SG_Append, INT_ID('M','P','C','M'), sMapCmd); SG_WriteCvars(); WriteGame (qbAutosave); @@ -1065,8 +1065,8 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) // if (!qbAutosave) { - SG_Append(INT_ID('T','I','M','E'), (void *)&sv.time, sizeof(sv.time)); - SG_Append(INT_ID('T','I','M','R'), (void *)&sv.timeResidual, sizeof(sv.timeResidual)); + ::sg_write(::SG_Append, INT_ID('T','I','M','E'), ::sv.time); + ::sg_write(::SG_Append, INT_ID('T','I','M','R'), ::sv.timeResidual); CM_WritePortalState(); SG_WriteServerConfigStrings(); } diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index 15f1ebcd64..50f184049a 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -1638,8 +1638,8 @@ Ghoul2 Insert End void CG_WriteTheEvilCGHackStuff(void) { - gi.AppendToSaveGame(INT_ID('F','P','S','L'), &cg.forcepowerSelect, sizeof(cg.forcepowerSelect)); - gi.AppendToSaveGame(INT_ID('I','V','S','L'), &cg.inventorySelect, sizeof(cg.inventorySelect)); + ::sg_write(::gi, INT_ID('F','P','S','L'), ::cg.forcepowerSelect); + ::sg_write(::gi, INT_ID('I','V','S','L'), ::cg.inventorySelect); } void CG_ReadTheEvilCGHackStuff(void) diff --git a/codeJK2/game/G_Timer.cpp b/codeJK2/game/G_Timer.cpp index ef7f2d470f..ab1ed3cb48 100644 --- a/codeJK2/game/G_Timer.cpp +++ b/codeJK2/game/G_Timer.cpp @@ -177,7 +177,7 @@ void TIMER_Save( void ) } //Write out the timer information - gi.AppendToSaveGame(INT_ID('T','I','M','E'), (void *)&numTimers, sizeof(numTimers)); + ::sg_write(::gi, INT_ID('T','I','M','E'), numTimers); gtimer_t *p = g_timers[j]; assert ((numTimers && p) || (!numTimers && !p)); @@ -191,11 +191,11 @@ void TIMER_Save( void ) assert( length < 1024 );//This will cause problems when loading the timer if longer //Write out the string size and data - gi.AppendToSaveGame(INT_ID('T','S','L','N'), (void*)&length, sizeof(length)); - gi.AppendToSaveGame(INT_ID('T','S','N','M'), (void*)timerID, length); + ::sg_write(::gi, INT_ID('T','S','L','N'), length); + ::sg_write_no_cast(::gi, INT_ID('T','S','N','M'), timerID, length); //Write out the timer data - gi.AppendToSaveGame(INT_ID('T','D','T','A'), (void *) &time, sizeof( time ) ); + ::sg_write(::gi, INT_ID('T','D','T','A'), time); p = p->next; } } diff --git a/codeJK2/game/Q3_Interface.cpp b/codeJK2/game/Q3_Interface.cpp index 95415eed94..bd34699ef3 100644 --- a/codeJK2/game/Q3_Interface.cpp +++ b/codeJK2/game/Q3_Interface.cpp @@ -9262,7 +9262,7 @@ void Interface_Init( interface_export_t *pe ) pe->I_FreeVariable = Q3_FreeVariable; //Save / Load functions - pe->I_WriteSaveData = (int(*)(unsigned int, void *, int))gi.AppendToSaveGame; + pe->I_WriteSaveData = gi.AppendToSaveGame; pe->I_ReadSaveData = gi.ReadFromSaveGame; pe->I_LinkEntity = ICARUS_LinkEntity; diff --git a/codeJK2/game/Q3_Registers.cpp b/codeJK2/game/Q3_Registers.cpp index 310813843b..2264971d2c 100644 --- a/codeJK2/game/Q3_Registers.cpp +++ b/codeJK2/game/Q3_Registers.cpp @@ -288,7 +288,7 @@ Q3_VariableSaveFloats void Q3_VariableSaveFloats( varFloat_m &fmap ) { int numFloats = fmap.size(); - gi.AppendToSaveGame( INT_ID('F','V','A','R'), &numFloats, sizeof( numFloats ) ); + ::sg_write(::gi, INT_ID('F','V','A','R'), numFloats); varFloat_m::iterator vfi; STL_ITERATE( vfi, fmap ) @@ -297,11 +297,11 @@ void Q3_VariableSaveFloats( varFloat_m &fmap ) int idSize = strlen( ((*vfi).first).c_str() ); //Save out the real data - gi.AppendToSaveGame( INT_ID('F','I','D','L'), &idSize, sizeof( idSize ) ); - gi.AppendToSaveGame( INT_ID('F','I','D','S'), (void *) ((*vfi).first).c_str(), idSize ); + ::sg_write(::gi, INT_ID('F','I','D','L'), idSize); + ::sg_write_no_cast(::gi, INT_ID('F','I','D','S'), ((*vfi).first).c_str(), idSize); //Save out the float value - gi.AppendToSaveGame( INT_ID('F','V','A','L'), &((*vfi).second), sizeof( float ) ); + ::sg_write_no_cast(::gi, INT_ID('F','V','A','L'), (*vfi).second); } } @@ -314,7 +314,7 @@ Q3_VariableSaveStrings void Q3_VariableSaveStrings( varString_m &smap ) { int numStrings = smap.size(); - gi.AppendToSaveGame( INT_ID('S','V','A','R'), &numStrings, sizeof( numStrings ) ); + ::sg_write(::gi, INT_ID('S','V','A','R'), numStrings); varString_m::iterator vsi; STL_ITERATE( vsi, smap ) @@ -323,14 +323,14 @@ void Q3_VariableSaveStrings( varString_m &smap ) int idSize = strlen( ((*vsi).first).c_str() ); //Save out the real data - gi.AppendToSaveGame( INT_ID('S','I','D','L'), &idSize, sizeof( idSize ) ); - gi.AppendToSaveGame( INT_ID('S','I','D','S'), (void *) ((*vsi).first).c_str(), idSize ); + ::sg_write(::gi, INT_ID('S','I','D','L'), idSize); + ::sg_write_no_cast(::gi, INT_ID('S','I','D','S'), ((*vsi).first).c_str(), idSize); //Save out the string value idSize = strlen( ((*vsi).second).c_str() ); - gi.AppendToSaveGame( INT_ID('S','V','S','Z'), &idSize, sizeof( idSize ) ); - gi.AppendToSaveGame( INT_ID('S','V','A','L'), (void *) ((*vsi).second).c_str(), idSize ); + ::sg_write(::gi, INT_ID('S','V','S','Z'), idSize); + ::sg_write_no_cast(::gi, INT_ID('S','V','A','L'), ((*vsi).second).c_str(), idSize); } } @@ -372,7 +372,7 @@ void Q3_VariableLoadFloats( varFloat_m &fmap ) float val; - ::sg_read(::gi, INT_ID('F','V','A','L'), val); + ::sg_read_no_cast(::gi, INT_ID('F','V','A','L'), val); Q3_DeclareVariable( TK_FLOAT, (const char *) &tempBuffer ); Q3_SetFloatVariable( (const char *) &tempBuffer, val ); diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp index 01e728b5b2..17c1a1775e 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -89,7 +89,7 @@ qboolean PInUse2(gentity_t *ent) void WriteInUseBits(void) { - gi.AppendToSaveGame(INT_ID('I','N','U','S'), &g_entityInUseBits, sizeof(g_entityInUseBits) ); + ::sg_write(::gi, INT_ID('I','N','U','S'), ::g_entityInUseBits); } void ReadInUseBits(void) @@ -1477,7 +1477,7 @@ extern qboolean player_locked; void G_LoadSave_WriteMiscData(void) { - gi.AppendToSaveGame(INT_ID('L','C','K','D'), &player_locked, sizeof(player_locked)); + ::sg_write(::gi, INT_ID('L','C','K','D'), player_locked); } diff --git a/codeJK2/game/g_objectives.cpp b/codeJK2/game/g_objectives.cpp index b78ca13b59..e66a3393b4 100644 --- a/codeJK2/game/g_objectives.cpp +++ b/codeJK2/game/g_objectives.cpp @@ -61,7 +61,7 @@ OBJ_SaveMissionObjectives */ void OBJ_SaveMissionObjectives( gclient_t *client ) { - gi.AppendToSaveGame(INT_ID('O','B','J','T'), client->sess.mission_objectives, sizeof(client->sess.mission_objectives)); + ::sg_write_no_cast(::gi, INT_ID('O','B','J','T'), client->sess.mission_objectives); } diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp index e0d3d107f8..eb7ea81e6c 100644 --- a/codeJK2/game/g_roff.cpp +++ b/codeJK2/game/g_roff.cpp @@ -625,15 +625,15 @@ void G_SaveCachedRoffs() int i, len; // Write out the number of cached ROFFs - gi.AppendToSaveGame( INT_ID('R','O','F','F'), (void *)&num_roffs, sizeof(num_roffs) ); + ::sg_write(::gi, INT_ID('R','O','F','F'), num_roffs); // Now dump out the cached ROFF file names in order so they can be loaded on the other end for ( i = 0; i < num_roffs; i++ ) { // Dump out the string length to make things a bit easier on the other end...heh heh. len = strlen( roffs[i].fileName ) + 1; - gi.AppendToSaveGame( INT_ID('S','L','E','N'), (void *)&len, sizeof(len) ); - gi.AppendToSaveGame( INT_ID('R','S','T','R'), (void *)(roffs[i].fileName), len ); + ::sg_write(::gi, INT_ID('S','L','E','N'), len); + ::sg_write_no_cast(::gi, INT_ID('R','S','T','R'), roffs[i].fileName, len); } } diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index cfd84ce286..bc3028c71d 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -338,7 +338,7 @@ void EnumerateField(const field_t *pField, byte *pbBase) switch (pField->eFieldType) { case F_STRING: - *(int *)pv = GetStringNum(*(char **)pv); + *(intptr_t *)pv = GetStringNum(*(char **)pv); break; case F_GENTITY: @@ -346,7 +346,7 @@ void EnumerateField(const field_t *pField, byte *pbBase) break; case F_GROUP: - *(int *)pv = GetGroupNumber(*(AIGroupInfo_t **)pv); + *(intptr_t *)pv = GetGroupNumber(*(AIGroupInfo_t **)pv); break; case F_GCLIENT: @@ -373,7 +373,7 @@ void EnumerateField(const field_t *pField, byte *pbBase) break; case F_ITEM: - *(int *)pv = GetGItemNum(*(gitem_t **)pv); + *(intptr_t *)pv = GetGItemNum(*(gitem_t **)pv); break; case F_BEHAVIORSET: @@ -382,7 +382,7 @@ void EnumerateField(const field_t *pField, byte *pbBase) for (int i=0; i; @@ -458,19 +459,63 @@ static void EnumerateFields(const field_t *pFields, byte *pbData, unsigned int u // save out raw data... // - gi.AppendToSaveGame(ulChid, pbData, iLen); + ::sg_write_no_cast(::gi, ulChid, pbData, static_cast(iLen)); // save out any associated strings.. // for (std::list::iterator it = strList->begin(); it != strList->end(); ++it) { - gi.AppendToSaveGame(INT_ID('S','T','R','G'), (void*)it->c_str(), it->length()+1); + ::sg_write_no_cast(::gi, INT_ID('S','T','R','G'), it->c_str(), static_cast(it->length()+1)); } delete strList; strList = NULL; } +#else +template +static void EnumerateFields(const field_t *pFields, T* src_instance, unsigned int ulChid, size_t iLen) +{ + strList = new std::list; + + auto pbData = reinterpret_cast(src_instance); + + // enumerate all the fields... + // + if (pFields) + { + for (const field_t *pField = pFields; pField->psName; pField++) + { + assert(pField->iOffset < iLen); + EnumerateField(pField, pbData); + } + } + + // save out raw data... + // + using SgType = typename T::SgType; + + constexpr auto dst_size = static_cast(sizeof(SgType)); + + auto& dst_buffer = ::sg_get_buffer( + dst_size); + + auto dst_instance = reinterpret_cast(dst_buffer.data()); + ::sg_export(*src_instance, *dst_instance); + + ::sg_write_no_cast(::gi, ulChid, dst_buffer.data(), dst_size); + + // save out any associated strings.. + // + for (std::list::iterator it = strList->begin(); it != strList->end(); ++it) + { + ::sg_write_no_cast(::gi, INT_ID('S','T','R','G'), it->c_str(), static_cast(it->length()+1)); + } + + delete strList; + strList = NULL; +} +#endif static void EvaluateField(const field_t *pField, byte *pbBase, byte *pbOriginalRefData/* may be NULL*/) { @@ -630,7 +675,7 @@ static void WriteLevelLocals () level_locals_t *temp = (level_locals_t *)gi.Malloc(sizeof(level_locals_t), TAG_TEMP_WORKSPACE, qfalse); *temp = level; // copy out all data into a temp space - EnumerateFields(savefields_LevelLocals, (byte *)temp, INT_ID('L','V','L','C'), LLOFS(LEVEL_LOCALS_T_SAVESTOP)); + EnumerateFields(savefields_LevelLocals, temp, INT_ID('L','V','L','C'), LLOFS(LEVEL_LOCALS_T_SAVESTOP)); gi.Free(temp); } @@ -671,7 +716,7 @@ static void WriteGEntities(qboolean qbAutosave) } } - gi.AppendToSaveGame(INT_ID('N','M','E','D'), &iCount, sizeof(iCount)); + ::sg_write(::gi, INT_ID('N','M','E','D'), iCount); for (i=0; i<(qbAutosave?1:globals.num_entities); i++) { @@ -679,7 +724,7 @@ static void WriteGEntities(qboolean qbAutosave) if ( ent->inuse) { - gi.AppendToSaveGame(INT_ID('E','D','N','M'), (void *)&i, sizeof(i)); + ::sg_write(::gi, INT_ID('E','D','N','M'), i); qboolean qbLinked = ent->linked; gi.unlinkentity( ent ); @@ -691,7 +736,7 @@ static void WriteGEntities(qboolean qbAutosave) gi.linkentity( ent ); } - EnumerateFields(savefields_gEntity, (byte *)&tempEnt, INT_ID('G','E','N','T'), sizeof(tempEnt)); + EnumerateFields(savefields_gEntity, &tempEnt, INT_ID('G','E','N','T'), sizeof(tempEnt)); // now for any fiddly bits that would be rather awkward to build into the enumerator... // @@ -699,18 +744,18 @@ static void WriteGEntities(qboolean qbAutosave) { gNPC_t npc = *ent->NPC; // NOT *tempEnt.NPC; !! :-) - EnumerateFields(savefields_gNPC, (byte *)&npc, INT_ID('G','N','P','C'), sizeof(npc)); + EnumerateFields(savefields_gNPC, &npc, INT_ID('G','N','P','C'), sizeof(npc)); } if (tempEnt.client == (gclient_t *)-2) // I know, I know... { gclient_t client = *ent->client; // NOT *tempEnt.client!! - EnumerateFields(savefields_gClient, (byte *)&client, INT_ID('G','C','L','I'), sizeof(client)); + EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I'), sizeof(client)); } if (tempEnt.parms) { - gi.AppendToSaveGame(INT_ID('P','A','R','M'), ent->parms, sizeof(*ent->parms)); + ::sg_write_no_cast(::gi, INT_ID('P','A','R','M'), *ent->parms); } // the scary ghoul2 saver stuff... (fingers crossed) @@ -733,7 +778,7 @@ static void WriteGEntities(qboolean qbAutosave) // This saves time debugging, and makes things easier to track. // static int iBlah = 1234; - gi.AppendToSaveGame(INT_ID('I','C','O','K'), &iBlah, sizeof(iBlah)); + ::sg_write(::gi, INT_ID('I','C','O','K'), iBlah); } if (!qbAutosave )//really shouldn't need to write these bits at all, just restore them from the ents... { @@ -956,7 +1001,7 @@ void WriteLevel(qboolean qbAutosave) // assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way ReadGame works gclient_t client = level.clients[0]; - EnumerateFields(savefields_gClient, (byte *)&client, INT_ID('G','C','L','I'), sizeof(client)); + EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I'), sizeof(client)); WriteLevelLocals(); // level_locals_t level } @@ -975,7 +1020,7 @@ void WriteLevel(qboolean qbAutosave) // put out an end-marker so that the load code can check everything was read in... // static int iDONE = 1234; - gi.AppendToSaveGame(INT_ID('D','O','N','E'), &iDONE, sizeof(iDONE)); + ::sg_write(::gi, INT_ID('D','O','N','E'), iDONE); } void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) diff --git a/codeJK2/icarus/Instance.cpp b/codeJK2/icarus/Instance.cpp index 0eff61d816..299f774ad7 100644 --- a/codeJK2/icarus/Instance.cpp +++ b/codeJK2/icarus/Instance.cpp @@ -302,7 +302,7 @@ int ICARUS_Instance::SaveSequenceIDTable( void ) { //Save out the number of sequences to follow int numSequences = m_sequences.size(); - m_interface->I_WriteSaveData( INT_ID('#','S','E','Q'), &numSequences, sizeof( numSequences ) ); + ::sg_write(m_interface, INT_ID('#','S','E','Q'), numSequences); //Sequences are saved first, by ID and information sequence_l::iterator sqi; @@ -319,7 +319,7 @@ int ICARUS_Instance::SaveSequenceIDTable( void ) idTable[itr++] = (*sqi)->GetID(); } - m_interface->I_WriteSaveData( INT_ID('S','Q','T','B'), idTable, sizeof( int ) * numSequences ); + ::sg_write(m_interface, INT_ID('S','Q','T','B'), idTable, numSequences); delete[] idTable; @@ -357,7 +357,7 @@ int ICARUS_Instance::SaveSequencers( void ) { //Save out the number of sequences to follow int numSequencers = m_sequencers.size(); - m_interface->I_WriteSaveData( INT_ID('#','S','Q','R'), &numSequencers, sizeof( numSequencers ) ); + ::sg_write(m_interface, INT_ID('#','S','Q','R'), numSequencers); //The sequencers are then saved sequencer_l::iterator si; @@ -379,7 +379,7 @@ int ICARUS_Instance::SaveSignals( void ) { int numSignals = m_signals.size(); - m_interface->I_WriteSaveData( INT_ID('I','S','I','G'), &numSignals, sizeof( numSignals ) ); + ::sg_write(m_interface, INT_ID('I','S','I','G'), numSignals); signal_m::iterator si; STL_ITERATE( si, m_signals ) @@ -393,10 +393,10 @@ int ICARUS_Instance::SaveSignals( void ) int length = strlen( name ) + 1; //Save out the string size - m_interface->I_WriteSaveData( INT_ID('S','I','G','#'), &length, sizeof ( length ) ); + ::sg_write(m_interface, INT_ID('S','I','G','#'), length); //Write out the string - m_interface->I_WriteSaveData( INT_ID('S','I','G','N'), (void *) name, length ); + ::sg_write_no_cast(m_interface, INT_ID('S','I','G','N'), name, length ); } return true; @@ -412,7 +412,7 @@ int ICARUS_Instance::Save( void ) { //Save out a ICARUS save block header with the ICARUS version double version = ICARUS_VERSION; - m_interface->I_WriteSaveData( INT_ID('I','C','A','R'), &version, sizeof( version ) ); + ::sg_write_no_cast(m_interface, INT_ID('I','C','A','R'), version); //Save out the signals if ( SaveSignals() == false ) @@ -426,7 +426,7 @@ int ICARUS_Instance::Save( void ) if ( SaveSequencers() == false ) return false; - m_interface->I_WriteSaveData( INT_ID('I','E','N','D'), &version, sizeof( version ) ); + ::sg_write_no_cast(m_interface, INT_ID('I','E','N','D'), version); return true; } diff --git a/codeJK2/icarus/Sequence.cpp b/codeJK2/icarus/Sequence.cpp index c91712a846..012ff25513 100644 --- a/codeJK2/icarus/Sequence.cpp +++ b/codeJK2/icarus/Sequence.cpp @@ -344,15 +344,15 @@ int CSequence::SaveCommand( CBlock *block ) //Save out the block ID bID = block->GetBlockID(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('B','L','I','D'), &bID, sizeof ( bID ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('B','L','I','D'), bID); //Save out the block's flags flags = block->GetFlags(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('B','F','L','G'), &flags, sizeof ( flags ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('B','F','L','G'), flags); //Save out the number of members to read numMembers = block->GetNumMembers(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('B','N','U','M'), &numMembers, sizeof ( numMembers ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('B','N','U','M'), numMembers); for ( int i = 0; i < numMembers; i++ ) { @@ -360,14 +360,14 @@ int CSequence::SaveCommand( CBlock *block ) //Save the block id bID = bm->GetID(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('B','M','I','D'), &bID, sizeof ( bID ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('B','M','I','D'), bID); //Save out the data size size = bm->GetSize(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('B','S','I','Z'), &size, sizeof( size ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('B','S','I','Z'), size); //Save out the raw data - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('B','M','E','M'), bm->GetData(), size ); + ::sg_write_no_cast(m_owner->GetInterface(), INT_ID('B','M','E','M'), bm->GetData(), size); } return true; @@ -387,30 +387,30 @@ int CSequence::Save( void ) //Save the parent (by GUID) id = ( m_parent != NULL ) ? m_parent->GetID() : -1; - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('S','P','I','D'), &id, sizeof( id ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('S','P','I','D'), id); //Save the return (by GUID) id = ( m_return != NULL ) ? m_return->GetID() : -1; - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('S','R','I','D'), &id, sizeof( id ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('S','R','I','D'), id); //Save the number of children - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('S','N','C','H'), &m_numChildren, sizeof( m_numChildren ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('S','N','C','H'), m_numChildren); //Save out the children (only by GUID) STL_ITERATE( ci, m_children ) { id = (*ci)->GetID(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('S','C','H','D'), &id, sizeof( id ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('S','C','H','D'), id); } //Save flags - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('S','F','L','G'), &m_flags, sizeof( m_flags ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('S','F','L','G'), m_flags); //Save iterations - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('S','I','T','R'), &m_iterations, sizeof( m_iterations ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('S','I','T','R'), m_iterations); //Save the number of commands - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('S','N','M','C'), &m_numCommands, sizeof( m_numCommands ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('S','N','M','C'), m_numCommands); //Save the commands STL_ITERATE( bi, m_commands ) diff --git a/codeJK2/icarus/Sequencer.cpp b/codeJK2/icarus/Sequencer.cpp index 3d5b051df5..0d80d5f43e 100644 --- a/codeJK2/icarus/Sequencer.cpp +++ b/codeJK2/icarus/Sequencer.cpp @@ -2330,16 +2330,16 @@ int CSequencer::Save( void ) numSequences = m_sequences.size(); //Save out the owner sequence - m_ie->I_WriteSaveData( INT_ID('S','Q','R','E'), &m_ownerID, sizeof( m_ownerID ) ); + ::sg_write(m_ie, INT_ID('S','Q','R','E'), m_ownerID); //Write out the number of sequences we need to read - m_ie->I_WriteSaveData( INT_ID('S','Q','R','#'), &numSequences, sizeof( numSequences ) ); + ::sg_write(m_ie, INT_ID('S','Q','R','#'), numSequences); //Second pass, save out all sequences, in order STL_ITERATE( si, m_sequences ) { id = (*si)->GetID(); - m_ie->I_WriteSaveData( INT_ID('S','Q','R','I'), &id, sizeof( id ) ); + ::sg_write(m_ie, INT_ID('S','Q','R','I'), id); } //Save out the taskManager @@ -2347,29 +2347,29 @@ int CSequencer::Save( void ) //Save out the task sequences mapping the name to the GUIDs numTasks = m_taskSequences.size(); - m_ie->I_WriteSaveData( INT_ID('S','Q','T','#'), &numTasks, sizeof ( numTasks ) ); + ::sg_write(m_ie, INT_ID('S','Q','T','#'), numTasks); STL_ITERATE( ti, m_taskSequences ) { //Save the task group's ID id = ((*ti).first)->GetGUID(); - m_ie->I_WriteSaveData( INT_ID('S','T','I','D'), &id, sizeof( id ) ); + ::sg_write(m_ie, INT_ID('S','T','I','D'), id); //Save the sequence's ID id = ((*ti).second)->GetID(); - m_ie->I_WriteSaveData( INT_ID('S','S','I','D'), &id, sizeof( id ) ); + ::sg_write(m_ie, INT_ID('S','S','I','D'), id); } int curGroupID = ( m_curGroup == NULL ) ? -1 : m_curGroup->GetGUID(); - m_ie->I_WriteSaveData( INT_ID('S','Q','C','T'), &curGroupID, sizeof ( m_numCommands ) ); + ::sg_write(m_ie, INT_ID('S','Q','C','T'), curGroupID); //Output the number of commands - m_ie->I_WriteSaveData( INT_ID('S','Q','#','C'), &m_numCommands, sizeof ( m_numCommands ) ); //FIXME: This can be reconstructed + ::sg_write(m_ie, INT_ID('S','Q','#','C'), m_numCommands); //FIXME: This can be reconstructed //Output the ID of the current sequence id = ( m_curSequence != NULL ) ? m_curSequence->GetID() : -1; - m_ie->I_WriteSaveData( INT_ID('S','Q','C','S'), &id, sizeof ( id ) ); + ::sg_write(m_ie, INT_ID('S','Q','C','S'), id); return true; } diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index 5123b00d7c..f51b492863 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -1641,15 +1641,15 @@ int CTaskManager::SaveCommand( CBlock *block ) //Save out the block ID bID = block->GetBlockID(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('B','L','I','D'), &bID, sizeof ( bID ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('B','L','I','D'), bID); //Save out the block's flags flags = block->GetFlags(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('B','F','L','G'), &flags, sizeof ( flags ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('B','F','L','G'), flags); //Save out the number of members to read numMembers = block->GetNumMembers(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('B','N','U','M'), &numMembers, sizeof ( numMembers ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('B','N','U','M'), numMembers); for ( int i = 0; i < numMembers; i++ ) { @@ -1657,14 +1657,14 @@ int CTaskManager::SaveCommand( CBlock *block ) //Save the block id bID = bm->GetID(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('B','M','I','D'), &bID, sizeof ( bID ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('B','M','I','D'), bID); //Save out the data size size = bm->GetSize(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('B','S','I','Z'), &size, sizeof( size ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('B','S','I','Z'), size); //Save out the raw data - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('B','M','E','M'), bm->GetData(), size ); + ::sg_write_no_cast(m_owner->GetInterface(), INT_ID('B','M','E','M'), bm->GetData(), size); } return true; @@ -1687,11 +1687,11 @@ void CTaskManager::Save( void ) int numWritten; //Save the taskmanager's GUID - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('T','M','I','D'), &m_GUID, sizeof( m_GUID ) ); //FIXME: This can be reconstructed + ::sg_write(m_owner->GetInterface(), INT_ID('T','M','I','D'), m_GUID); //FIXME: This can be reconstructed //Save out the number of tasks that will follow int iNumTasks = m_tasks.size(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('T','S','K','#'), &iNumTasks, sizeof(iNumTasks) ); + ::sg_write(m_owner->GetInterface(), INT_ID('T','S','K','#'), iNumTasks); //Save out all the tasks tasks_l::iterator ti; @@ -1700,11 +1700,11 @@ void CTaskManager::Save( void ) { //Save the GUID id = (*ti)->GetGUID(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('T','K','I','D'), &id, sizeof ( id ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('T','K','I','D'), id); //Save the timeStamp (FIXME: Although, this is going to be worthless if time is not consistent...) timeStamp = (*ti)->GetTimeStamp(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('T','K','T','S'), &timeStamp, sizeof ( timeStamp ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('T','K','T','S'), timeStamp); //Save out the block block = (*ti)->GetBlock(); @@ -1713,14 +1713,14 @@ void CTaskManager::Save( void ) //Save out the number of task groups int numTaskGroups = m_taskGroups.size(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('T','G','#','G'), &numTaskGroups, sizeof( numTaskGroups ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('T','G','#','G'), numTaskGroups); //Save out the IDs of all the task groups numWritten = 0; taskGroup_v::iterator tgi; STL_ITERATE( tgi, m_taskGroups ) { id = (*tgi)->GetGUID(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('T','K','G','#'), &id, sizeof( id ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('T','K','G','#'), id); numWritten++; } assert (numWritten == numTaskGroups); @@ -1731,11 +1731,11 @@ void CTaskManager::Save( void ) { //Save out the parent id = ( (*tgi)->GetParent() == NULL ) ? -1 : ((*tgi)->GetParent())->GetGUID(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('T','K','G','P'), &id, sizeof( id ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('T','K','G','P'), id); //Save out the number of commands numCommands = (*tgi)->m_completedTasks.size(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('T','G','N','C'), &numCommands, sizeof( numCommands ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('T','G','N','C'), numCommands); //Save out the command map CTaskGroup::taskCallback_m::iterator tci; @@ -1744,16 +1744,16 @@ void CTaskManager::Save( void ) { //Write out the ID id = (*tci).first; - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('G','M','I','D'), &id, sizeof( id ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('G','M','I','D'), id); //Write out the state of completion completed = (*tci).second; - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('G','M','D','N'), &completed, sizeof( completed ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('G','M','D','N'), completed); } //Save out the number of completed commands id = (*tgi)->m_numCompleted; - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('T','G','D','N'), &id, sizeof( id ) ); //FIXME: This can be reconstructed + ::sg_write(m_owner->GetInterface(), INT_ID('T','G','D','N'), id); //FIXME: This can be reconstructed numWritten++; } assert (numWritten == numTaskGroups); @@ -1763,7 +1763,7 @@ void CTaskManager::Save( void ) { //Save out the currently active group int curGroupID = ( m_curGroup == NULL ) ? -1 : m_curGroup->GetGUID(); - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('T','G','C','G'), &curGroupID, sizeof( curGroupID ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('T','G','C','G'), curGroupID); } //Save out the task group name maps @@ -1779,17 +1779,17 @@ void CTaskManager::Save( void ) int length = strlen( name ) + 1; //Save out the string size - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('T','G','N','L'), &length, sizeof ( length ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('T','G','N','L'), length); //Write out the string - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('T','G','N','S'), (void *) name, length ); + ::sg_write_no_cast(m_owner->GetInterface(), INT_ID('T','G','N','S'), name, length); taskGroup = (*tmi).second; id = taskGroup->GetGUID(); //Write out the ID - (m_owner->GetInterface())->I_WriteSaveData( INT_ID('T','G','N','I'), &id, sizeof( id ) ); + ::sg_write(m_owner->GetInterface(), INT_ID('T','G','N','I'), id); numWritten++; } assert (numWritten == numTaskGroups); diff --git a/codeJK2/icarus/interface.h b/codeJK2/icarus/interface.h index aca6e3f8c6..051c8c9f24 100644 --- a/codeJK2/icarus/interface.h +++ b/codeJK2/icarus/interface.h @@ -81,7 +81,7 @@ typedef struct interface_export_s //Save / Load functions - int (*I_WriteSaveData)( unsigned int chid, void *data, int length ); + int (*I_WriteSaveData)( unsigned int chid, const void *data, int length ); int (*I_ReadSaveData)( unsigned int chid, void *address, int length, void **addressptr/* = NULL */); int (*I_LinkEntity)( int entID, CSequencer *sequencer, CTaskManager *taskManager ); diff --git a/codemp/icarus/Q3_Interface.cpp b/codemp/icarus/Q3_Interface.cpp index 667bafe394..059d65dc46 100644 --- a/codemp/icarus/Q3_Interface.cpp +++ b/codemp/icarus/Q3_Interface.cpp @@ -710,7 +710,7 @@ void CGCam_Anything( void ) } //These are useless for MP. Just taking it for now since I don't want to remove all calls to this in ICARUS. -int AppendToSaveGame(unsigned long chid, void *data, int length) +int AppendToSaveGame(unsigned long chid, const void *data, int length) { return 1; } diff --git a/codemp/icarus/interface.h b/codemp/icarus/interface.h index 6013e4570c..4bfbba5fde 100644 --- a/codemp/icarus/interface.h +++ b/codemp/icarus/interface.h @@ -77,7 +77,7 @@ typedef struct interface_export_s //Save / Load functions - int (*I_WriteSaveData)( unsigned long chid, void *data, int length ); + int (*I_WriteSaveData)( unsigned long chid, const void *data, int length ); // Below changed by BTO (VV). Visual C++ 7.1 compiler no longer allows default args on function pointers. Ack. int (*I_ReadSaveData)( unsigned long chid, void *address, int length /* , void **addressptr = NULL */ ); int (*I_LinkEntity)( int entID, CSequencer *sequencer, CTaskManager *taskManager ); diff --git a/shared/qcommon/ojk_sg_wrappers.h b/shared/qcommon/ojk_sg_wrappers.h index 2babdc3492..bb08838f1e 100644 --- a/shared/qcommon/ojk_sg_wrappers.h +++ b/shared/qcommon/ojk_sg_wrappers.h @@ -20,9 +20,14 @@ using SgReadFunc = std::function; + void** allocated_value)>; + +using SgWriteFunc = std::function; template @@ -145,6 +150,90 @@ class SgTraits // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + // WriteSaveData + + template + static auto test_write_save_data(int) -> decltype( + std::declval().WriteSaveData( + static_cast(0), + static_cast(nullptr), + static_cast(0) + ) == 0, + + yes() + ); + + template + static no test_write_save_data(...); + + // WriteSaveData + // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + // I_WriteSaveData + + template + static auto test_i_write_save_data(int) -> decltype( + std::declval().I_WriteSaveData( + static_cast(0), + static_cast(nullptr), + static_cast(0) + ) == 0, + + yes() + ); + + template + static no test_i_write_save_data(...); + + // I_WriteSaveData + // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + // AppendToSaveGame + + template + static auto test_append_to_save_game(int) -> decltype( + std::declval().AppendToSaveGame( + static_cast(0), + static_cast(nullptr), + static_cast(0) + ) == 0, + + yes() + ); + + template + static no test_append_to_save_game(...); + + // AppendToSaveGame + // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + // SG_Append + + template + static auto test_sg_append(int) -> decltype( + std::declval().SG_Append( + static_cast(0), + static_cast(nullptr), + static_cast(0) + ) == 0, + + yes() + ); + + template + static no test_sg_append(...); + + // SG_Append + // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // has_sg_export @@ -222,6 +311,26 @@ class SgTraits return std::is_same(0)), yes>::value; } + static constexpr bool has_write_save_data() + { + return std::is_same(0)), yes>::value; + } + + static constexpr bool has_i_write_save_data() + { + return std::is_same(0)), yes>::value; + } + + static constexpr bool has_append_to_save_game() + { + return std::is_same(0)), yes>::value; + } + + static constexpr bool has_sg_append() + { + return std::is_same(0)), yes>::value; + } + static constexpr bool has_sg_export() { return std::is_same(0)), yes>::value; @@ -304,6 +413,26 @@ class SgReadFromSaveGameFuncTag public: }; // SgReadFromSaveGameFuncTag +class SgSgAppendFuncTag +{ +public: +}; // SgSgAppendFuncTag + +class SgWriteSaveDataFuncTag +{ +public: +}; // SgWriteSaveDataFuncTag + +class SgIWriteSaveDataFuncTag +{ +public: +}; // SgIWriteSaveDataFuncTag + +class SgAppendToSaveGameFuncTag +{ +public: +}; // SgAppendToSaveGameFuncTag + } // detail @@ -311,8 +440,8 @@ class SgReadFromSaveGameFuncTag // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // sg_get_read_func // -// Returns a function wrapper for a function pointer, pointer to an object or -// a reference to an object. +// Returns a read function wrapper for a function pointer, +// pointer to an object or a reference to an object. // namespace detail { @@ -432,6 +561,142 @@ inline SgReadFunc sg_get_read_func( // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// sg_get_write_func +// +// Returns a write function wrapper for a function pointer, +// pointer to an object or a reference to an object. +// + +namespace detail { + + +template +inline SgWriteFunc sg_get_write_func( + TFunc& func, + SgFuncTag) +{ + return func; +} + +template +inline SgWriteFunc sg_get_write_func( + TInstance* instance, + SgPointerTag, + SgSgAppendFuncTag) +{ + return instance->SG_Append; +} + +template +inline SgWriteFunc sg_get_write_func( + TInstance* instance, + SgPointerTag, + SgWriteSaveDataFuncTag) +{ + return std::bind( + &TInstance::WriteSaveData, + instance, + std::placeholders::_1, + std::placeholders::_2, + std::placeholders::_3); +} + +template +inline SgWriteFunc sg_get_write_func( + TInstance* instance, + SgPointerTag, + SgIWriteSaveDataFuncTag) +{ + return instance->I_WriteSaveData; +} + +template +inline SgWriteFunc sg_get_write_func( + TInstance* instance, + SgPointerTag, + SgAppendToSaveGameFuncTag) +{ + return instance->AppendToSaveGame; +} + +template +inline SgWriteFunc sg_get_write_func( + TInstance* instance, + SgPointerTag) +{ + using Tag = typename std::conditional< + SgTraits::has_sg_append(), + SgSgAppendFuncTag, + typename std::conditional< + SgTraits::has_write_save_data(), + SgWriteSaveDataFuncTag, + typename std::conditional< + SgTraits::has_i_write_save_data(), + SgIWriteSaveDataFuncTag, + typename std::conditional< + SgTraits::has_append_to_save_game(), + SgAppendToSaveGameFuncTag, + void + >::type + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported instance type."); + + return sg_get_write_func( + instance, + SgPointerTag(), + Tag()); +} + +template +inline SgWriteFunc sg_get_write_func( + TInstance& instance, + SgClassTag) +{ + return sg_get_write_func( + &instance, + SgPointerTag()); +} + +template +inline SgWriteFunc sg_get_write_func( + TInstance& instance) +{ + using Tag = typename std::conditional< + std::is_function::value, + SgFuncTag, + typename std::conditional< + std::is_class::value, + SgClassTag, + typename std::conditional< + std::is_pointer::value, + SgPointerTag, + void + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported instance type."); + + return sg_get_write_func( + instance, + Tag()); +} + + +} // detail + +// sg_get_write_func +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // sg_export // @@ -1058,10 +1323,6 @@ inline int sg_read_no_cast( !std::is_same::value, "Unsupported types."); - if (!dst_values) { - throw SgException("Null pointer."); - } - return sg_read_no_cast( read_func, chunk_id, @@ -1335,7 +1596,7 @@ inline int sg_read( SgPointerTag) { if (!dst_values) { - throw SgException("Null destination poiner."); + throw SgException("Null pointer."); } const auto src_size = static_cast(dst_count * sizeof(TSrc)); @@ -1402,7 +1663,7 @@ inline int sg_read( "Unsupported types."); if (dst_count < 0) { - throw SgException("Negative destination count."); + throw SgException("Negative count."); } auto read_func = detail::sg_get_read_func( @@ -1487,6 +1748,565 @@ inline int sg_read_allocate( } +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// sg_write_no_cast (fixed size) +// +// Writes a value or a fixed-size array of values into a +// saved game without conversion. +// + +namespace detail { + + +template +inline int sg_write_no_cast( + SgWriteFunc& write_func, + unsigned int chunk_id, + const TSrc& src_value, + SgNumericTag) +{ + constexpr auto src_size = static_cast(sizeof(TSrc)); + + return write_func( + chunk_id, + const_cast(&src_value), + src_size); +} + +template +inline int sg_write_no_cast( + SgWriteFunc& write_func, + unsigned int chunk_id, + const TSrc& src_value, + SgClassTag) +{ + using SgType = typename TSrc::SgType; + + constexpr auto dst_size = static_cast(sizeof(SgType)); + + auto& dst_buffer = sg_get_buffer( + dst_size); + + auto& dst_value = *reinterpret_cast(dst_buffer.data()); + + ::sg_export(src_value, dst_value); + + return write_func( + chunk_id, + &dst_value, + dst_size); +} + +template +inline int sg_write_no_cast( + SgWriteFunc& write_func, + unsigned int chunk_id, + const TSrc (&src_values)[TCount], + SgArray1dTag, + SgNumericTag) +{ + constexpr auto src_size = static_cast(TCount * sizeof(TSrc)); + + return write_func( + chunk_id, + const_cast(&src_values[0]), + src_size); +} + +template +inline int sg_write_no_cast( + SgWriteFunc& write_func, + unsigned int chunk_id, + const TSrc (&src_values)[TCount], + SgArray1dTag, + SgClassTag) +{ + using SgType = typename TSrc::SgType; + + constexpr auto dst_size = static_cast(TCount * sizeof(SgType)); + + auto& dst_buffer = sg_get_buffer( + dst_size); + + auto dst_values = reinterpret_cast(dst_buffer.data()); + + for (decltype(TCount) i = 0; i < TCount; ++i) { + ::sg_export(src_values[i], dst_values[i]); + } + + return write_func( + chunk_id, + dst_values, + dst_size); +} + +template +inline int sg_write_no_cast( + SgWriteFunc& write_func, + unsigned int chunk_id, + const TSrc (&src_values)[TCount], + SgArray1dTag) +{ + using Tag = typename std::conditional< + std::is_same::value, + void, + typename std::conditional< + detail::SgTraits::is_numeric(), + detail::SgNumericTag, + typename std::conditional< + detail::SgTraits::has_sg_export(), + detail::SgClassTag, + void + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + return sg_write_no_cast( + write_func, + chunk_id, + src_values, + SgArray1dTag(), + Tag() + ); +} + + +} // detail + + +template +inline int sg_write_no_cast( + TInstance&& instance, + unsigned int chunk_id, + const TSrc& src_value) +{ + using Tag = typename std::conditional< + std::is_same::value, + void, + typename std::conditional< + detail::SgTraits::is_numeric(), + detail::SgNumericTag, + typename std::conditional< + detail::SgTraits::has_sg_export(), + detail::SgClassTag, + typename std::conditional< + detail::SgTraits::is_array_1d(), + detail::SgArray1dTag, + void + >::type + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + auto write_func = detail::sg_get_write_func( + instance); + + return detail::sg_write_no_cast( + write_func, + chunk_id, + src_value, + Tag()); +} + +// sg_write_no_cast (fixed size) +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// sg_write_no_cast (dynamic size) +// +// Writes a specified number of values into a +// saved game without conversion. +// + +namespace detail { + + +template +inline int sg_write_no_cast( + SgWriteFunc& write_func, + unsigned int chunk_id, + const TSrc* src_values, + int src_count, + SgPointerTag, + SgVoidTag) +{ + return write_func( + chunk_id, + const_cast(src_values), + src_count); +} + +template +inline int sg_write_no_cast( + SgWriteFunc& write_func, + unsigned int chunk_id, + const TSrc* src_values, + int src_count, + SgPointerTag, + SgNumericTag) +{ + const auto src_size = static_cast(src_count * sizeof(TSrc)); + + return write_func( + chunk_id, + const_cast(src_values), + src_size); +} + +template +inline int sg_write_no_cast( + SgWriteFunc& write_func, + unsigned int chunk_id, + const TSrc* src_values, + int src_count, + SgPointerTag) +{ + using Tag = typename std::conditional< + std::is_same::value, + void, + typename std::conditional< + SgTraits::is_numeric(), + SgNumericTag, + typename std::conditional< + std::is_same::value, + SgVoidTag, + void + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + if (!src_values) { + throw SgException("Null pointer."); + } + + return sg_write_no_cast( + write_func, + chunk_id, + src_values, + src_count, + SgPointerTag(), + Tag()); +} + +template +inline int sg_write_no_cast( + SgWriteFunc& write_func, + unsigned int chunk_id, + const TSrc (&src_values)[TCount], + int src_count, + SgArray1dTag) +{ + if (src_count > TCount) { + throw SgException("Write overflow."); + } + + return sg_write_no_cast( + write_func, + chunk_id, + &src_values[0], + src_count, + SgPointerTag()); +} + + +} // detail + + +template +inline int sg_write_no_cast( + TInstance&& instance, + unsigned int chunk_id, + TSrc&& src_value, + int src_count) +{ + using TSrcTag = typename std::remove_reference::type; + + using Tag = typename std::conditional< + std::is_same::value, + void, + typename std::conditional< + std::is_pointer::value, + detail::SgPointerTag, + typename std::conditional< + detail::SgTraits::is_array_1d(), + detail::SgArray1dTag, + void + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + + auto write_func = detail::sg_get_write_func( + instance); + + return detail::sg_write_no_cast( + write_func, + chunk_id, + src_value, + src_count, + Tag()); +} + +// sg_write_no_cast (dynamic size) +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// sg_write (fixed size) +// +// Writes a value or a fixed-array of values into a +// saved game with conversion. +// + +namespace detail { + + +template +inline int sg_write( + SgWriteFunc& write_func, + unsigned int chunk_id, + const TSrc& src_value, + SgNumericTag) +{ + auto dst_value = static_cast(src_value); + constexpr auto dst_size = static_cast(sizeof(TDst)); + + return write_func( + chunk_id, + &dst_value, + dst_size); +} + +template +inline int sg_write( + SgWriteFunc& write_func, + unsigned int chunk_id, + const TSrc& src_value, + SgPointerTag) +{ + auto dst_value = static_cast(reinterpret_cast(src_value)); + + constexpr auto dst_size = static_cast(sizeof(TDst)); + + return write_func( + chunk_id, + &dst_value, + dst_size); +} + +template +inline int sg_write( + SgWriteFunc& write_func, + unsigned int chunk_id, + const TSrc (&src_values)[TCount], + SgArray1dTag, + SgNumericTag) +{ + constexpr auto dst_size = static_cast(TCount * sizeof(TDst)); + + auto& dst_buffer = sg_get_buffer( + dst_size); + + auto dst_values = reinterpret_cast(dst_buffer.data()); + + std::uninitialized_copy_n( + src_values, + TCount, + dst_values); + + return write_func( + chunk_id, + dst_values, + dst_size); +} + +template +inline int sg_write( + SgWriteFunc& write_func, + unsigned int chunk_id, + const TSrc (&src_values)[TCount], + SgArray1dTag) +{ + using Tag = typename std::conditional< + SgTraits::is_numeric() && SgTraits::is_numeric(), + SgNumericTag, + void + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + return sg_write( + write_func, + chunk_id, + src_values, + SgArray1dTag(), + Tag()); +} + + +} // detail + + +template +inline int sg_write( + TInstance&& instance, + unsigned int chunk_id, + const TSrc& src_value) +{ + using Tag = typename std::conditional< + detail::SgTraits::is_numeric() && + detail::SgTraits::is_numeric(), + detail::SgNumericTag, + typename std::conditional< + std::is_pointer::value && + detail::SgTraits::is_numeric(), + detail::SgPointerTag, + typename std::conditional< + detail::SgTraits::is_array_1d(), + detail::SgArray1dTag, + void + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + auto write_func = detail::sg_get_write_func( + instance); + + return detail::sg_write( + write_func, + chunk_id, + src_value, + Tag()); +} + +// sg_write (fixed size) +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// sg_write (dynamic size) +// +// Reads a spesified number of values from a +// saved game with conversion. +// + +namespace detail { + + +template +inline int sg_write( + SgWriteFunc& write_func, + unsigned int chunk_id, + const TSrc* src_values, + int src_count, + SgPointerTag) +{ + if (!src_values) { + throw SgException("Null pointer."); + } + + const auto dst_size = static_cast(src_count * sizeof(TDst)); + + auto& dst_buffer = sg_get_buffer( + dst_size); + + auto dst_values = reinterpret_cast(dst_buffer.data()); + + std::uninitialized_copy_n( + src_values, + src_count, + dst_values); + + return write_func( + chunk_id, + dst_values, + dst_size); +} + +template +inline int sg_write( + SgWriteFunc& write_func, + unsigned int chunk_id, + const TSrc (&src_values)[TCount], + int src_count, + SgArray1dTag) +{ + return sg_write( + write_func, + chunk_id, + &src_values[0], + src_count, + SgPointerTag()); +} + + +} // detail + + +template +inline int sg_write( + TInstance&& instance, + unsigned int chunk_id, + const TSrc& src_value, + int src_count) +{ + using Tag = typename std::conditional< + std::is_pointer::value && + detail::SgTraits::is_numeric(), + detail::SgPointerTag, + typename std::conditional< + detail::SgTraits::is_array_1d(), + detail::SgArray1dTag, + void + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported types."); + + if (src_count < 0) { + throw SgException("Negative count."); + } + + auto write_func = detail::sg_get_write_func( + instance); + + return detail::sg_write( + write_func, + chunk_id, + src_value, + src_count, + Tag()); +} + +// sg_write (dynamic size) +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + #endif // __cplusplus From 8a647f20060cc0a30048218494cd95da4ac3a7f1 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Wed, 22 Jun 2016 22:05:35 +0300 Subject: [PATCH 212/445] Make forward declaration header --- code/CMakeLists.txt | 2 + code/cgame/FxScheduler.cpp | 2 +- code/cgame/cg_main.cpp | 2 + code/game/CMakeLists.txt | 2 + code/game/G_Timer.cpp | 1 + code/game/Q3_Interface.cpp | 1 + code/game/g_main.cpp | 2 + code/game/g_objectives.cpp | 1 + code/game/g_roff.cpp | 2 + code/game/g_savegame.cpp | 1 + code/icarus/IcarusImplementation.cpp | 1 + code/qcommon/cm_load.cpp | 1 + code/qcommon/q_shared.h | 2 +- code/rd-vanilla/CMakeLists.txt | 2 + code/rd-vanilla/G2_misc.cpp | 1 + code/server/sv_savegame.cpp | 2 + codeJK2/cgame/cg_main.cpp | 2 + codeJK2/game/CMakeLists.txt | 2 + codeJK2/game/G_Timer.cpp | 1 + codeJK2/game/Q3_Registers.cpp | 1 + codeJK2/game/g_main.cpp | 1 + codeJK2/game/g_objectives.cpp | 1 + codeJK2/game/g_roff.cpp | 2 + codeJK2/game/g_savegame.cpp | 1 + codeJK2/icarus/Instance.cpp | 1 + codeJK2/icarus/Sequence.cpp | 1 + codeJK2/icarus/Sequencer.cpp | 1 + codeJK2/icarus/TaskManager.cpp | 1 + shared/qcommon/ojk_sg_wrappers.h | 72 +++----------- shared/qcommon/ojk_sg_wrappers_fwd.h | 122 ++++++++++++++++++++++++ shared/qcommon/ojk_sg_wrappers_shared.h | 65 +++++++++++++ 31 files changed, 239 insertions(+), 60 deletions(-) create mode 100644 shared/qcommon/ojk_sg_wrappers_fwd.h create mode 100644 shared/qcommon/ojk_sg_wrappers_shared.h diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 6bda133870..c3f94c1c61 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -175,6 +175,8 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SPDir}/qcommon/MiniHeap.h" "${SharedDir}/qcommon/ojk_sg_wrappers.h" + "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" + "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" ${SharedCommonFiles} ) diff --git a/code/cgame/FxScheduler.cpp b/code/cgame/FxScheduler.cpp index ae8800bce0..62040c32c6 100644 --- a/code/cgame/FxScheduler.cpp +++ b/code/cgame/FxScheduler.cpp @@ -41,7 +41,7 @@ along with this program; if not, see . #include "qcommon/safe/string.h" #include - +#include "qcommon/ojk_sg_wrappers.h" CFxScheduler theFxScheduler; diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index b9646d5d7a..649ddf4529 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -28,6 +28,8 @@ along with this program; if not, see . #include "g_local.h" #include "../qcommon/sstring.h" +#include "qcommon/ojk_sg_wrappers.h" + //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char > namePrecache_m; extern namePrecache_m *as_preCacheMap; diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 99d081dbc4..6190bc9d13 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -261,6 +261,8 @@ set(SPGameCommonFiles "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SharedDir}/qcommon/ojk_sg_wrappers.h" + "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" + "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" ${SharedCommonFiles} ) diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index 0835ddeda9..c469fc1253 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -22,6 +22,7 @@ along with this program; if not, see . #include "g_local.h" #include "../Rufl/hstring.h" +#include "qcommon/ojk_sg_wrappers.h" #define MAX_GTIMERS 16384 diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index bb4e71d1d1..ea4d7fc6e3 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -40,6 +40,7 @@ along with this program; if not, see . #include "wp_saber.h" #include "g_vehicles.h" #include "g_navigator.h" +#include "qcommon/ojk_sg_wrappers.h" extern cvar_t *com_buildScript; diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 8b4154f5eb..4b94b70ca7 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -36,6 +36,8 @@ along with this program; if not, see . #include "../ghoul2/ghoul2_gore.h" //rww - RAGDOLL_END +#include "qcommon/ojk_sg_wrappers.h" + extern void WP_SaberLoadParms( void ); extern qboolean G_PlayerSpawned( void ); diff --git a/code/game/g_objectives.cpp b/code/game/g_objectives.cpp index 9805cbc5c4..6843a32c69 100644 --- a/code/game/g_objectives.cpp +++ b/code/game/g_objectives.cpp @@ -29,6 +29,7 @@ along with this program; if not, see . #define G_OBJECTIVES_CPP #include "objectives.h" +#include "qcommon/ojk_sg_wrappers.h" qboolean missionInfo_Updated; diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp index 588dce0b29..321b3df5fb 100644 --- a/code/game/g_roff.cpp +++ b/code/game/g_roff.cpp @@ -25,6 +25,8 @@ along with this program; if not, see . #include "Q3_Interface.h" #include "../cgame/cg_local.h" #include "g_functions.h" +#include "qcommon/ojk_sg_wrappers.h" + // The list of precached ROFFs roff_list_t roffs[MAX_ROFFS]; int num_roffs = 0; diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index ea612f97d1..31b796d252 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -30,6 +30,7 @@ along with this program; if not, see . #include "objectives.h" #include "../cgame/cg_camera.h" #include "../qcommon/sstring.h" +#include "qcommon/ojk_sg_wrappers.h" extern void OBJ_LoadTacticalInfo(void); diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index 71b4394ab6..6308115f31 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -33,6 +33,7 @@ along with this program; if not, see . #include "../qcommon/q_shared.h" #include "../qcommon/qcommon.h" +#include "qcommon/ojk_sg_wrappers.h" #define STL_ITERATE( a, b ) for ( a = b.begin(); a != b.end(); ++a ) #define STL_INSERT( a, b ) a.insert( a.end(), b ); diff --git a/code/qcommon/cm_load.cpp b/code/qcommon/cm_load.cpp index a1ff55f071..d3f4c8144d 100644 --- a/code/qcommon/cm_load.cpp +++ b/code/qcommon/cm_load.cpp @@ -24,6 +24,7 @@ along with this program; if not, see . // cmodel.c -- model loading #include "cm_local.h" +#include "qcommon/ojk_sg_wrappers.h" #ifdef BSPC void SetPlaneSignbits (cplane_t *out) { diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index a5b790debb..0373d5f66e 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -160,7 +160,7 @@ float FloatSwap( const float *f ); #include "qcommon/q_platform.h" -#include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_wrappers_fwd.h" // ================================================================ diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index da89b3f523..449e2e4794 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -79,6 +79,8 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SharedDir}/qcommon/ojk_sg_wrappers.h" + "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" + "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" ${SharedCommonFiles} ) diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index 548fa18271..d0a1a95e79 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -50,6 +50,7 @@ along with this program; if not, see . #ifdef _G2_GORE #include "../ghoul2/ghoul2_gore.h" +#include "qcommon/ojk_sg_wrappers.h" #define GORE_TAG_UPPER (256) #define GORE_TAG_MASK (~255) diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 99a3a06d82..2c01d393f0 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -37,6 +37,8 @@ along with this program; if not, see . #include +#include "qcommon/ojk_sg_wrappers.h" + static char saveGameComment[iSG_COMMENT_SIZE]; //#define SG_PROFILE // enable for debug save stats if you want diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index 50f184049a..f8f1ff13a2 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -28,6 +28,8 @@ along with this program; if not, see . #include "../../code/client/vmachine.h" #include "../../code/qcommon/sstring.h" +#include "qcommon/ojk_sg_wrappers.h" + //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char, std::less, std::allocator< unsigned char > > namePrecache_m; extern namePrecache_m *as_preCacheMap; diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index a73dd0dafc..6abe3ee303 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -233,6 +233,8 @@ set(JK2SPGameCommonFiles "${SPDir}/qcommon/q_shared.h" "${SPDir}/qcommon/strippublic.h" "${SharedDir}/qcommon/ojk_sg_wrappers.h" + "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" + "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" ${SharedCommonFiles} ) diff --git a/codeJK2/game/G_Timer.cpp b/codeJK2/game/G_Timer.cpp index ab1ed3cb48..737861efe9 100644 --- a/codeJK2/game/G_Timer.cpp +++ b/codeJK2/game/G_Timer.cpp @@ -23,6 +23,7 @@ along with this program; if not, see . #include "g_local.h" #include "../../code/Rufl/hstring.h" +#include "qcommon/ojk_sg_wrappers.h" #define MAX_GTIMERS 16384 diff --git a/codeJK2/game/Q3_Registers.cpp b/codeJK2/game/Q3_Registers.cpp index 2264971d2c..74a19b202a 100644 --- a/codeJK2/game/Q3_Registers.cpp +++ b/codeJK2/game/Q3_Registers.cpp @@ -24,6 +24,7 @@ along with this program; if not, see . #include "g_local.h" #include "Q3_Registers.h" +#include "qcommon/ojk_sg_wrappers.h" extern void Q3_DebugPrint( int level, const char *format, ... ); diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp index 17c1a1775e..4fb5a70a5f 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -35,6 +35,7 @@ along with this program; if not, see . #include "objectives.h" #include "../cgame/cg_local.h" // yeah I know this is naughty, but we're shipping soon... #include "time.h" +#include "qcommon/ojk_sg_wrappers.h" extern CNavigator navigator; diff --git a/codeJK2/game/g_objectives.cpp b/codeJK2/game/g_objectives.cpp index e66a3393b4..a0488ae7d3 100644 --- a/codeJK2/game/g_objectives.cpp +++ b/codeJK2/game/g_objectives.cpp @@ -31,6 +31,7 @@ along with this program; if not, see . #define G_OBJECTIVES_CPP #include "objectives.h" +#include "qcommon/ojk_sg_wrappers.h" qboolean missionInfo_Updated; diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp index eb7ea81e6c..409785b853 100644 --- a/codeJK2/game/g_roff.cpp +++ b/codeJK2/game/g_roff.cpp @@ -25,6 +25,8 @@ along with this program; if not, see . #include "g_local.h" #include "g_roff.h" #include "g_icarus.h" +#include "qcommon/ojk_sg_wrappers.h" + // The list of precached ROFFs roff_list_t roffs[MAX_ROFFS]; int num_roffs = 0; diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index bc3028c71d..54a0d7ebe0 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -33,6 +33,7 @@ along with this program; if not, see . #include "../cgame/cg_camera.h" #include "g_icarus.h" #include "../../code/qcommon/sstring.h" +#include "qcommon/ojk_sg_wrappers.h" extern void OBJ_LoadTacticalInfo(void); diff --git a/codeJK2/icarus/Instance.cpp b/codeJK2/icarus/Instance.cpp index 299f774ad7..d675291ff5 100644 --- a/codeJK2/icarus/Instance.cpp +++ b/codeJK2/icarus/Instance.cpp @@ -29,6 +29,7 @@ along with this program; if not, see . #include "instance.h" #include +#include "qcommon/ojk_sg_wrappers.h" // Instance diff --git a/codeJK2/icarus/Sequence.cpp b/codeJK2/icarus/Sequence.cpp index 012ff25513..a6193975c7 100644 --- a/codeJK2/icarus/Sequence.cpp +++ b/codeJK2/icarus/Sequence.cpp @@ -28,6 +28,7 @@ along with this program; if not, see . #include "icarus.h" #include +#include "qcommon/ojk_sg_wrappers.h" CSequence::CSequence( void ) { diff --git a/codeJK2/icarus/Sequencer.cpp b/codeJK2/icarus/Sequencer.cpp index 0d80d5f43e..b10032972e 100644 --- a/codeJK2/icarus/Sequencer.cpp +++ b/codeJK2/icarus/Sequencer.cpp @@ -30,6 +30,7 @@ along with this program; if not, see . #include "g_shared.h" #include "assert.h" +#include "qcommon/ojk_sg_wrappers.h" // Sequencer diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index f51b492863..2cf235ad86 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -31,6 +31,7 @@ along with this program; if not, see . #include +#include "qcommon/ojk_sg_wrappers.h" #define ICARUS_VALIDATE(a) if ( a == false ) return TASK_FAILED; diff --git a/shared/qcommon/ojk_sg_wrappers.h b/shared/qcommon/ojk_sg_wrappers.h index bb08838f1e..e735487daf 100644 --- a/shared/qcommon/ojk_sg_wrappers.h +++ b/shared/qcommon/ojk_sg_wrappers.h @@ -11,66 +11,9 @@ #include -#include #include -#include #include -#include - - -using SgReadFunc = std::function; - -using SgWriteFunc = std::function; - - -template -using SgArray = std::array; - -template -using SgArray2d = SgArray, TCount1>; - -using SgVec3 = SgArray; -using SgVec4 = SgArray; - -using SgBuffer = std::vector; - - -class SgException : - public std::runtime_error -{ -public: - explicit SgException( - const std::string& what_arg) : - std::runtime_error(what_arg) - { - } - - explicit SgException( - const char* what_arg) : - std::runtime_error(what_arg) - { - } - - virtual ~SgException() - { - } -}; // SgException - - -inline SgBuffer& sg_get_buffer( - int new_size) -{ - static SgBuffer buffer; - buffer.resize(new_size); - return buffer; -} +#include "ojk_sg_wrappers_shared.h" namespace detail { @@ -447,6 +390,13 @@ class SgAppendToSaveGameFuncTag namespace detail { +using SgReadFunc = std::function; + + template inline SgReadFunc sg_get_read_func( TFunc& func, @@ -571,6 +521,12 @@ inline SgReadFunc sg_get_read_func( namespace detail { +using SgWriteFunc = std::function; + + template inline SgWriteFunc sg_get_write_func( TFunc& func, diff --git a/shared/qcommon/ojk_sg_wrappers_fwd.h b/shared/qcommon/ojk_sg_wrappers_fwd.h new file mode 100644 index 0000000000..04e387648c --- /dev/null +++ b/shared/qcommon/ojk_sg_wrappers_fwd.h @@ -0,0 +1,122 @@ +// +// Forward declarartions of saved game wrappers. +// + + +#ifndef OJK_SG_WRAPPERS_FWD_INCLUDED +#define OJK_SG_WRAPPERS_FWD_INCLUDED + + +#include "ojk_sg_wrappers_shared.h" + + +#ifdef __cplusplus + + +// Exports a value or a fixed-array of values from a +// native type to a saved game one. +template +void sg_export( + const TSrc& src, + TDst& dst); + +// Imports a value or a fixed-szie array of values from a +// saved game type to a native one. +template +void sg_import( + const TSrc& src, + TDst& dst); + +// Reads a value or a fixed-size array of values from a +// saved game without conversion. +template +int sg_read_no_cast( + TInstance&& instance, + unsigned int chunk_id, + TDst& dst_value); + +// Reads a specified number of values from a +// saved game without conversion. +template +int sg_read_no_cast( + TInstance&& instance, + unsigned int chunk_id, + TDst& dst_value, + int dst_count); + +// Reads a value or a fixed-array of values from a +// saved game with conversion. +template +int sg_read( + TInstance&& instance, + unsigned int chunk_id, + TDst& dst_value); + +// Reads a spesified number of values from a +// saved game with conversion. +template +int sg_read( + TInstance&& instance, + unsigned int chunk_id, + TDst& dst_value, + int dst_count); + +// Skips a specified number of bytes in a saved game. +template +int sg_read_skip( + TInstance&& instance, + unsigned int chunk_id, + int count); + +// Skips a specified number (by a type size) of bytes in a saved game. +template +int sg_read_skip( + TInstance&& instance, + unsigned int chunk_id); + +// Reads a data from a saved game into an automatically allocated block. +template +int sg_read_allocate( + TInstance&& instance, + unsigned int chunk_id, + TValue*& value); + +// Writes a value or a fixed-size array of values into a +// saved game without conversion. +template +int sg_write_no_cast( + TInstance&& instance, + unsigned int chunk_id, + const TSrc& src_value); + +// Writes a specified number of values into a +// saved game without conversion. +template +int sg_write_no_cast( + TInstance&& instance, + unsigned int chunk_id, + TSrc&& src_value, + int src_count); + +// Writes a value or a fixed-array of values into a +// saved game with conversion. +template +int sg_write( + TInstance&& instance, + unsigned int chunk_id, + const TSrc& src_value); + +// Reads a spesified number of values from a +// saved game with conversion. +template +int sg_write( + TInstance&& instance, + unsigned int chunk_id, + const TSrc& src_value, + int src_count); + + +#endif // __cplusplus + + +#endif // OJK_SG_WRAPPERS_FWD_INCLUDED diff --git a/shared/qcommon/ojk_sg_wrappers_shared.h b/shared/qcommon/ojk_sg_wrappers_shared.h new file mode 100644 index 0000000000..195fc3cf0d --- /dev/null +++ b/shared/qcommon/ojk_sg_wrappers_shared.h @@ -0,0 +1,65 @@ +// +// Shared staff of saved game wrappers. +// + + +#ifndef OJK_SG_WRAPPERS_SHARED_INCLUDED +#define OJK_SG_WRAPPERS_SHARED_INCLUDED + + +#ifdef __cplusplus + + +#include +#include +#include +#include + + +template +using SgArray = std::array; + +template +using SgArray2d = SgArray, TCount1>; + +using SgVec3 = SgArray; +using SgVec4 = SgArray; + +using SgBuffer = std::vector; + + +class SgException : + public std::runtime_error +{ +public: + explicit SgException( + const std::string& what_arg) : + std::runtime_error(what_arg) + { + } + + explicit SgException( + const char* what_arg) : + std::runtime_error(what_arg) + { + } + + virtual ~SgException() + { + } +}; // SgException + + +inline SgBuffer& sg_get_buffer( + int new_size) +{ + static SgBuffer buffer; + buffer.resize(new_size); + return buffer; +} + + +#endif // __cplusplus + + +#endif // OJK_SG_WRAPPERS_SHARED_INCLUDED From db45a093dcfa583f27b8e512343e40ef18cc331c Mon Sep 17 00:00:00 2001 From: Dion Williams Date: Thu, 23 Jun 2016 19:04:09 +0100 Subject: [PATCH 213/445] [MP] Merge pull request #832 from dionrhys/stateless-challenge * Initial commit for stateless challenges on the server * Fix buffer over-read in SV_CreateChallenge * Fix error message typo in SV_CreateChallenge * Switch to varying HMAC message by time instead of revolving secret keys every interval * Replace mbedtls dependency with a home-brewed HMAC-MD5 implementation * Fix strict-aliasing issue spotted by gcc * Remove outbound bandwidth rate limit on getchallenge --- codemp/CMakeLists.txt | 2 + codemp/qcommon/md5.cpp | 136 ++++++++++++++++--------- codemp/qcommon/md5.h | 54 ++++++++++ codemp/server/server.h | 31 ++---- codemp/server/sv_challenge.cpp | 180 +++++++++++++++++++++++++++++++++ codemp/server/sv_client.cpp | 123 ++-------------------- codemp/server/sv_init.cpp | 2 + 7 files changed, 345 insertions(+), 183 deletions(-) create mode 100644 codemp/qcommon/md5.h create mode 100644 codemp/server/sv_challenge.cpp diff --git a/codemp/CMakeLists.txt b/codemp/CMakeLists.txt index 7597f21c9d..a839f261f8 100644 --- a/codemp/CMakeLists.txt +++ b/codemp/CMakeLists.txt @@ -233,6 +233,7 @@ if(BuildMPEngine OR BuildMPDed) "${MPDir}/qcommon/huffman.cpp" "${MPDir}/qcommon/md4.cpp" "${MPDir}/qcommon/md5.cpp" + "${MPDir}/qcommon/md5.h" "${MPDir}/qcommon/MiniHeap.h" "${MPDir}/qcommon/msg.cpp" "${MPDir}/qcommon/matcomp.h" @@ -312,6 +313,7 @@ if(BuildMPEngine OR BuildMPDed) "${MPDir}/server/server.h" "${MPDir}/server/sv_bot.cpp" "${MPDir}/server/sv_ccmds.cpp" + "${MPDir}/server/sv_challenge.cpp" "${MPDir}/server/sv_client.cpp" "${MPDir}/server/sv_game.cpp" "${MPDir}/server/sv_init.cpp" diff --git a/codemp/qcommon/md5.cpp b/codemp/qcommon/md5.cpp index 93db3339f2..9213213472 100644 --- a/codemp/qcommon/md5.cpp +++ b/codemp/qcommon/md5.cpp @@ -13,15 +13,13 @@ * MD5Context structure, pass it to MD5Init, call MD5Update as * needed on buffers full of bytes, and then call MD5Final, which * will fill a supplied 16-byte array with the digest. + * + * An implementation of HMAC-MD5 (originally for OpenJK) is also + * provided, and also released into the public domain. */ -#include "q_shared.h" -#include "qcommon.h" -typedef struct MD5Context { - uint32_t buf[4]; - uint32_t bits[2]; - unsigned char in[64]; -} MD5_CTX; +#include "md5.h" +#include "qcommon.h" #ifndef Q3_BIG_ENDIAN #define byteReverse(buf, len) /* Nothing */ @@ -35,11 +33,11 @@ typedef struct MD5Context { { uint32_t t; do { - t = (uint32_t) - ((unsigned) buf[3] << 8 | buf[2]) << 16 | - ((unsigned) buf[1] << 8 | buf[0]); - *(uint32_t *) buf = t; - buf += 4; + t = (uint32_t) + ((unsigned) buf[3] << 8 | buf[2]) << 16 | + ((unsigned) buf[1] << 8 | buf[0]); + *(uint32_t *) buf = t; + buf += 4; } while (--longs); } #endif // Q3_BIG_ENDIAN @@ -48,7 +46,7 @@ typedef struct MD5Context { * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious * initialization constants. */ -static void MD5Init(struct MD5Context *ctx) +void MD5Init(struct MD5Context *ctx) { ctx->buf[0] = 0x67452301; ctx->buf[1] = 0xefcdab89; @@ -58,6 +56,7 @@ static void MD5Init(struct MD5Context *ctx) ctx->bits[0] = 0; ctx->bits[1] = 0; } + /* The four core functions - F1 is optimized somewhat */ /* #define F1(x, y, z) (x & y | ~x & z) */ @@ -75,8 +74,7 @@ static void MD5Init(struct MD5Context *ctx) * reflect the addition of 16 longwords of new data. MD5Update blocks * the data and converts bytes into longwords for this routine. */ -static void MD5Transform(uint32_t buf[4], - uint32_t const in[16]) +static void MD5Transform(uint32_t buf[4], uint32_t const in[16]) { register uint32_t a, b, c, d; @@ -163,8 +161,7 @@ static void MD5Transform(uint32_t buf[4], * Update context to reflect the concatenation of another buffer full * of bytes. */ -static void MD5Update(struct MD5Context *ctx, unsigned char const *buf, - unsigned len) +void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len) { uint32_t t; @@ -172,7 +169,7 @@ static void MD5Update(struct MD5Context *ctx, unsigned char const *buf, t = ctx->bits[0]; if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t) - ctx->bits[1]++; /* Carry from low to high */ + ctx->bits[1]++; /* Carry from low to high */ ctx->bits[1] += len >> 29; t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ @@ -180,27 +177,27 @@ static void MD5Update(struct MD5Context *ctx, unsigned char const *buf, /* Handle any leading odd-sized chunks */ if (t) { - unsigned char *p = (unsigned char *) ctx->in + t; - - t = 64 - t; - if (len < t) { - memcpy(p, buf, len); - return; - } - memcpy(p, buf, t); - byteReverse(ctx->in, 16); - MD5Transform(ctx->buf, (uint32_t *) ctx->in); - buf += t; - len -= t; + unsigned char *p = (unsigned char *) ctx->in + t; + + t = 64 - t; + if (len < t) { + memcpy(p, buf, len); + return; + } + memcpy(p, buf, t); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (uint32_t *) ctx->in); + buf += t; + len -= t; } /* Process data in 64-byte chunks */ while (len >= 64) { - memcpy(ctx->in, buf, 64); - byteReverse(ctx->in, 16); - MD5Transform(ctx->buf, (uint32_t *) ctx->in); - buf += 64; - len -= 64; + memcpy(ctx->in, buf, 64); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (uint32_t *) ctx->in); + buf += 64; + len -= 64; } /* Handle any remaining bytes of data. */ @@ -208,12 +205,11 @@ static void MD5Update(struct MD5Context *ctx, unsigned char const *buf, memcpy(ctx->in, buf, len); } - /* * Final wrapup - pad to 64-byte boundary with the bit pattern * 1 0* (64-bit count of bits processed, MSB-first) */ -static void MD5Final(struct MD5Context *ctx, unsigned char *digest) +void MD5Final(struct MD5Context *ctx, unsigned char *digest) { unsigned count; unsigned char *p; @@ -231,16 +227,16 @@ static void MD5Final(struct MD5Context *ctx, unsigned char *digest) /* Pad out to 56 mod 64 */ if (count < 8) { - /* Two lots of padding: Pad the first block to 64 bytes */ - memset(p, 0, count); - byteReverse(ctx->in, 16); - MD5Transform(ctx->buf, (uint32_t *) ctx->in); + /* Two lots of padding: Pad the first block to 64 bytes */ + memset(p, 0, count); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (uint32_t *) ctx->in); - /* Now fill the next block with 56 bytes */ - memset(ctx->in, 0, 56); + /* Now fill the next block with 56 bytes */ + memset(ctx->in, 0, 56); } else { - /* Pad block to 56 bytes */ - memset(p, 0, count - 8); + /* Pad block to 56 bytes */ + memset(p, 0, count - 8); } byteReverse(ctx->in, 14); @@ -256,7 +252,6 @@ static void MD5Final(struct MD5Context *ctx, unsigned char *digest) memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ } - char *Com_MD5File( const char *fn, int length, const char *prefix, int prefix_len ) { static char final[33] = {""}; @@ -308,3 +303,52 @@ char *Com_MD5File( const char *fn, int length, const char *prefix, int prefix_le } return final; } + +/* + * The following code implements HMAC-MD5 using the public domain MD5 implementation above. + * This code (originally for OpenJK) is also released into the public domain. + */ + +void HMAC_MD5_Init(hmacMD5Context_t *ctx, unsigned char const *key, unsigned int keylen) +{ + unsigned char shortenedKey[MD5_DIGEST_SIZE]; + if (keylen > MD5_BLOCK_SIZE) { + MD5Init(&ctx->md5Context); + MD5Update(&ctx->md5Context, key, keylen); + MD5Final(&ctx->md5Context, shortenedKey); + key = shortenedKey; + keylen = MD5_DIGEST_SIZE; + } + + for (unsigned int i = 0; i < keylen; i++) { + ctx->iKeyPad[i] = 0x36 ^ key[i]; + ctx->oKeyPad[i] = 0x5C ^ key[i]; + } + memset(&ctx->iKeyPad[keylen], 0x36, sizeof(ctx->iKeyPad) - keylen); + memset(&ctx->oKeyPad[keylen], 0x5C, sizeof(ctx->oKeyPad) - keylen); + + MD5Init(&ctx->md5Context); + MD5Update(&ctx->md5Context, ctx->iKeyPad, sizeof(ctx->iKeyPad)); +} + +void HMAC_MD5_Update(hmacMD5Context_t *ctx, unsigned char const *buf, unsigned int len) +{ + MD5Update(&ctx->md5Context, buf, len); +} + +void HMAC_MD5_Final(hmacMD5Context_t *ctx, unsigned char *digest) +{ + unsigned char hashSum1[MD5_DIGEST_SIZE]; + MD5Final(&ctx->md5Context, hashSum1); + + MD5Init(&ctx->md5Context); + MD5Update(&ctx->md5Context, ctx->oKeyPad, sizeof(ctx->oKeyPad)); + MD5Update(&ctx->md5Context, hashSum1, sizeof(hashSum1)); + MD5Final(&ctx->md5Context, digest); +} + +void HMAC_MD5_Reset(hmacMD5Context_t *ctx) +{ + MD5Init(&ctx->md5Context); + MD5Update(&ctx->md5Context, ctx->iKeyPad, sizeof(ctx->iKeyPad)); +} \ No newline at end of file diff --git a/codemp/qcommon/md5.h b/codemp/qcommon/md5.h new file mode 100644 index 0000000000..ff2a84c202 --- /dev/null +++ b/codemp/qcommon/md5.h @@ -0,0 +1,54 @@ +/* + * This code implements the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + * + * An implementation of HMAC-MD5 (originally for OpenJK) is also + * provided, and also released into the public domain. + */ + +#pragma once + +#include "q_shared.h" + +typedef struct MD5Context { + uint32_t buf[4]; + uint32_t bits[2]; + unsigned char in[64]; +} MD5_CTX; + +void MD5Init(struct MD5Context *ctx); +void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len); +void MD5Final(struct MD5Context *ctx, unsigned char *digest); + +const size_t MD5_BLOCK_SIZE = 64; +const size_t MD5_DIGEST_SIZE = 16; +typedef struct { + struct MD5Context md5Context; + unsigned char iKeyPad[MD5_BLOCK_SIZE]; + unsigned char oKeyPad[MD5_BLOCK_SIZE]; +} hmacMD5Context_t; + +// Initialize a new HMAC-MD5 construct using the specified secret key. +void HMAC_MD5_Init(hmacMD5Context_t *ctx, unsigned char const *key, unsigned int keylen); + +// Update the HMAC message with len number of bytes from the given buffer. +void HMAC_MD5_Update(hmacMD5Context_t *ctx, unsigned char const *buf, unsigned int len); + +// Finalize the HMAC calculation and fill the given buffer with the digest bytes. +// 'digest' must point to a buffer that can hold MD5_DIGEST_SIZE bytes! +void HMAC_MD5_Final(hmacMD5Context_t *ctx, unsigned char *digest); + +// Reset the context to begin working on a new message, using the same secret key as previously initialised. +void HMAC_MD5_Reset(hmacMD5Context_t *ctx); \ No newline at end of file diff --git a/codemp/server/server.h b/codemp/server/server.h index 85177f4ab4..8077bde54d 100644 --- a/codemp/server/server.h +++ b/codemp/server/server.h @@ -195,28 +195,6 @@ typedef struct client_s { //============================================================================= -// MAX_CHALLENGES is made large to prevent a denial -// of service attack that could cycle all of them -// out before legitimate users connected -#define MAX_CHALLENGES 2048 -// Allow a certain amount of challenges to have the same IP address -// to make it a bit harder to DOS one single IP address from connecting -// while not allowing a single ip to grab all challenge resources -#define MAX_CHALLENGES_MULTI (MAX_CHALLENGES / 2) - -#define AUTHORIZE_TIMEOUT 5000 - -typedef struct challenge_s { - netadr_t adr; - int challenge; - int clientChallenge; // challenge number coming from the client - int time; // time the last packet was sent to the autherize server - int pingTime; // time the challenge response was sent to client - int firstTime; // time the adr was first used, for authorize timeout checks - qboolean wasrefused; - qboolean connected; -} challenge_t; - // this structure will be cleared only when the game dll changes typedef struct serverStatic_s { qboolean initialized; // sv_init has completed @@ -231,7 +209,6 @@ typedef struct serverStatic_s { int nextSnapshotEntities; // next snapshotEntities to use entityState_t *snapshotEntities; // [numSnapshotEntities] int nextHeartbeatTime; - challenge_t challenges[MAX_CHALLENGES]; // to prevent invalid IPs from connecting netadr_t redirectAddress; // for rcon return messages netadr_t authorizeAddress; // for rcon return messages @@ -349,6 +326,14 @@ void SV_SpawnServer( char *server, qboolean killBots, ForceReload_e eForceReload +// +// sv_challenge.cpp +// +void SV_ChallengeInit(); +void SV_ChallengeShutdown(); +int SV_CreateChallenge(netadr_t from); +qboolean SV_VerifyChallenge(int receivedChallenge, netadr_t from); + // // sv_client.c // diff --git a/codemp/server/sv_challenge.cpp b/codemp/server/sv_challenge.cpp new file mode 100644 index 0000000000..37530b117b --- /dev/null +++ b/codemp/server/sv_challenge.cpp @@ -0,0 +1,180 @@ +/* +=========================================================================== +Copyright (C) 2013 - 2016, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +// sv_challenge.cpp -- stateless challenge creation and verification functions + +#include "server.h" +#include "qcommon/md5.h" + +#define DEBUG_SV_CHALLENGE // Enable for Com_DPrintf debugging output + +static const size_t SECRET_KEY_LENGTH = MD5_DIGEST_SIZE; // Key length equal to digest length is adequate + +static qboolean challengerInitialized = qfalse; +static hmacMD5Context_t challenger; + +/* +==================== +BufferToHexString + +Format a byte buffer as a lower-case hex string. +==================== +*/ +static const char *BufferToHexString(byte *buffer, size_t bufferLen) +{ + static char hexString[1023]; + static const size_t maxBufferLen = (sizeof(hexString) - 1) / 2; + static const char *hex = "0123456789abcdef"; + if (bufferLen > maxBufferLen) { + bufferLen = maxBufferLen; + } + for (size_t i = 0; i < bufferLen; i++) { + hexString[i * 2] = hex[buffer[i] / 16]; + hexString[i * 2 + 1] = hex[buffer[i] % 16]; + } + hexString[bufferLen * 2] = '\0'; + return hexString; +} + +/* +==================== +SV_ChallengeInit + +Initialize the HMAC context for generating challenges. +==================== +*/ +void SV_ChallengeInit() +{ + if (challengerInitialized) { + SV_ChallengeShutdown(); + } + + // Generate a secret key from the OS RNG + byte secretKey[SECRET_KEY_LENGTH]; + if (!Sys_RandomBytes(secretKey, sizeof(secretKey))) { + Com_Error(ERR_FATAL, "SV_ChallengeInit: Sys_RandomBytes failed"); + } + +#ifdef DEBUG_SV_CHALLENGE + Com_DPrintf("Initialize challenger: %s\n", BufferToHexString(secretKey, sizeof(secretKey))); +#endif + + HMAC_MD5_Init(&challenger, secretKey, sizeof(secretKey)); + + challengerInitialized = qtrue; +} + +/* +==================== +SV_ChallengeShutdown + +Clear the HMAC context used to generate challenges. +==================== +*/ +void SV_ChallengeShutdown() +{ + if (challengerInitialized) { + memset(&challenger, 0, sizeof(challenger)); + challengerInitialized = qfalse; + } +} + +/* +==================== +SV_CreateChallenge (internal) + +Create a challenge for the given client address and timestamp. +==================== +*/ +static int SV_CreateChallenge(int timestamp, netadr_t from) +{ + const char *clientParams = NET_AdrToString(from); + size_t clientParamsLen = strlen(clientParams); + + // Create an unforgeable, temporal challenge for this client using HMAC(secretKey, clientParams + timestamp) + byte digest[MD5_DIGEST_SIZE]; + HMAC_MD5_Update(&challenger, (byte*)clientParams, clientParamsLen); + HMAC_MD5_Update(&challenger, (byte*)×tamp, sizeof(timestamp)); + HMAC_MD5_Final(&challenger, digest); + HMAC_MD5_Reset(&challenger); + + // Use first 4 bytes of the HMAC digest as an int (client only deals with numeric challenges) + // The most-significant bit stores whether the timestamp is odd or even. This lets later verification code handle the + // case where the engine timestamp has incremented between the time this challenge is sent and the client replies. + int challenge; + memcpy(&challenge, digest, sizeof(challenge)); + challenge &= 0x7FFFFFFF; + challenge |= (unsigned int)(timestamp & 0x1) << 31; + +#ifdef DEBUG_SV_CHALLENGE + Com_DPrintf("Generated challenge %d (timestamp = %d) for %s\n", challenge, timestamp, NET_AdrToString(from)); +#endif + + return challenge; +} + +/* +==================== +SV_CreateChallenge + +Create an unforgeable, temporal challenge for the given client address. +==================== +*/ +int SV_CreateChallenge(netadr_t from) +{ + if (!challengerInitialized) { + Com_Error(ERR_FATAL, "SV_CreateChallenge: The challenge subsystem has not been initialized"); + } + + // The current time gets 14 bits chopped off to create a challenge timestamp that changes every 16.384 seconds + // This allows clients at least ~16 seconds from now to reply to the challenge + int currentTimestamp = svs.time >> 14; + return SV_CreateChallenge(currentTimestamp, from); +} + +/* +==================== +SV_VerifyChallenge + +Verify a challenge received by the client matches the expected challenge. +==================== +*/ +qboolean SV_VerifyChallenge(int receivedChallenge, netadr_t from) +{ + if (!challengerInitialized) { + Com_Error(ERR_FATAL, "SV_VerifyChallenge: The challenge subsystem has not been initialized"); + } + + int currentTimestamp = svs.time >> 14; + int currentPeriod = currentTimestamp & 0x1; + + // Use the current timestamp for verification if the current period matches the client challenge's period. + // Otherwise, use the previous timestamp in case the current timestamp incremented in the time between the + // client being sent a challenge and the client's reply that's being verified now. + int challengePeriod = ((unsigned int)receivedChallenge >> 31) & 0x1; + int challengeTimestamp = currentTimestamp - (currentPeriod ^ challengePeriod); + +#ifdef DEBUG_SV_CHALLENGE + Com_DPrintf("Verifying challenge %d (timestamp = %d) for %s\n", receivedChallenge, challengeTimestamp, NET_AdrToString(from)); +#endif + + int expectedChallenge = SV_CreateChallenge(challengeTimestamp, from); + return (qboolean)(receivedChallenge == expectedChallenge); +} diff --git a/codemp/server/sv_client.cpp b/codemp/server/sv_client.cpp index 59491f33e7..105e82a2f3 100644 --- a/codemp/server/sv_client.cpp +++ b/codemp/server/sv_client.cpp @@ -60,13 +60,8 @@ to hi-jack client connections. ================= */ void SV_GetChallenge( netadr_t from ) { - int i; - int oldest; - int oldestTime; - int oldestClientTime; + int challenge; int clientChallenge; - challenge_t *challenge; - qboolean wasfound = qfalse; // ignore if we are in single player /* @@ -86,58 +81,13 @@ void SV_GetChallenge( netadr_t from ) { return; } - // Allow getchallenge to be DoSed relatively easily, but prevent - // excess outbound bandwidth usage when being flooded inbound - if ( SVC_RateLimit( &outboundLeakyBucket, 10, 100 ) ) { - Com_DPrintf( "SV_GetChallenge: rate limit exceeded, dropping request\n" ); - return; - } - - oldest = 0; - oldestClientTime = oldestTime = 0x7fffffff; + // Create a unique challenge for this client without storing state on the server + challenge = SV_CreateChallenge(from); - // see if we already have a challenge for this ip - challenge = &svs.challenges[0]; + // Grab the client's challenge to echo back (if given) clientChallenge = atoi(Cmd_Argv(1)); - for (i = 0 ; i < MAX_CHALLENGES ; i++, challenge++) - { - if(!challenge->connected && NET_CompareAdr(from, challenge->adr)) - { - wasfound = qtrue; - - if(challenge->time < oldestClientTime) - oldestClientTime = challenge->time; - } - - if(wasfound && i >= MAX_CHALLENGES_MULTI) - { - i = MAX_CHALLENGES; - break; - } - - if(challenge->time < oldestTime) - { - oldestTime = challenge->time; - oldest = i; - } - } - - if (i == MAX_CHALLENGES) { - // this is the first time this client has asked for a challenge - challenge = &svs.challenges[oldest]; - challenge->clientChallenge = clientChallenge; - challenge->adr = from; - challenge->firstTime = svs.time; - challenge->connected = qfalse; - } - - // always generate a new challenge number, so the client cannot circumvent sv_maxping - challenge->challenge = ( (rand() << 16) ^ rand() ) ^ svs.time; - challenge->wasrefused = qfalse; - challenge->time = svs.time; - challenge->pingTime = svs.time; - NET_OutOfBandPrint( NS_SERVER, challenge->adr, "challengeResponse %i %i", challenge->challenge, clientChallenge ); + NET_OutOfBandPrint( NS_SERVER, from, "challengeResponse %i %i", challenge, clientChallenge ); } /* @@ -261,55 +211,15 @@ void SV_DirectConnect( netadr_t from ) { } Info_SetValueForKey( userinfo, "ip", ip ); - // see if the challenge is valid (LAN clients don't need to challenge) + // see if the challenge is valid (localhost clients don't need to challenge) if (!NET_IsLocalAddress(from)) { - int ping; - challenge_t *challengeptr; - - for (i=0; iwasrefused) - { - // Return silently, so that error messages written by the server keep being displayed. + NET_OutOfBandPrint( NS_SERVER, from, "print\nIncorrect challenge for your address.\n" ); return; } - - ping = svs.time - challengeptr->pingTime; - - // never reject a LAN client based on ping - if ( !Sys_IsLANAddress( from ) ) { - if ( sv_minPing->value && ping < sv_minPing->value ) { - NET_OutOfBandPrint( NS_SERVER, from, va("print\n%s\n", SE_GetString("MP_SVGAME", "SERVER_FOR_HIGH_PING")));//Server is for high pings only\n" ); - Com_DPrintf (SE_GetString("MP_SVGAME", "CLIENT_REJECTED_LOW_PING"), i);//"Client %i rejected on a too low ping\n", i); - challengeptr->wasrefused = qtrue; - return; - } - if ( sv_maxPing->value && ping > sv_maxPing->value ) { - NET_OutOfBandPrint( NS_SERVER, from, va("print\n%s\n", SE_GetString("MP_SVGAME", "SERVER_FOR_LOW_PING")));//Server is for low pings only\n" ); - Com_DPrintf (SE_GetString("MP_SVGAME", "CLIENT_REJECTED_HIGH_PING"), i);//"Client %i rejected on a too high ping\n", i); - challengeptr->wasrefused = qtrue; - return; - } - } - - Com_Printf( SE_GetString("MP_SVGAME", "CLIENT_CONN_WITH_PING"), i, ping);//"Client %i connecting with %i challenge ping\n", i, ping ); - challengeptr->connected = qtrue; } newcl = &temp; @@ -465,27 +375,12 @@ or crashing -- SV_FinalMessage() will handle that */ void SV_DropClient( client_t *drop, const char *reason ) { int i; - challenge_t *challenge; const bool isBot = drop->netchan.remoteAddress.type == NA_BOT; if ( drop->state == CS_ZOMBIE ) { return; // already dropped } - if ( !isBot ) { - // see if we already have a challenge for this ip - challenge = &svs.challenges[0]; - - for (i = 0 ; i < MAX_CHALLENGES ; i++, challenge++) - { - if(NET_CompareAdr(drop->netchan.remoteAddress, challenge->adr)) - { - Com_Memset(challenge, 0, sizeof(*challenge)); - break; - } - } - } - // Kill any download SV_CloseDownload( drop ); diff --git a/codemp/server/sv_init.cpp b/codemp/server/sv_init.cpp index 11891204b3..d7df152eac 100644 --- a/codemp/server/sv_init.cpp +++ b/codemp/server/sv_init.cpp @@ -279,6 +279,7 @@ void SV_Startup( void ) { // we don't need nearly as many when playing locally svs.numSnapshotEntities = sv_maxclients->integer * 4 * MAX_SNAPSHOT_ENTITIES; } + SV_ChallengeInit(); svs.initialized = qtrue; // Don't respect sv_killserver unless a server is actually running @@ -1070,6 +1071,7 @@ void SV_Shutdown( char *finalmsg ) SV_RemoveOperatorCommands(); SV_MasterShutdown(); + SV_ChallengeShutdown(); SV_ShutdownGameProgs(); svs.gameStarted = qfalse; /* From 233a5a909703fb1729d5d8ddc3d4020015634507 Mon Sep 17 00:00:00 2001 From: Dion Williams Date: Thu, 23 Jun 2016 20:13:36 +0100 Subject: [PATCH 214/445] [MP] Disable sv_challenge debug output by default --- codemp/server/sv_challenge.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codemp/server/sv_challenge.cpp b/codemp/server/sv_challenge.cpp index 37530b117b..3bca98baad 100644 --- a/codemp/server/sv_challenge.cpp +++ b/codemp/server/sv_challenge.cpp @@ -23,7 +23,7 @@ along with this program; if not, see . #include "server.h" #include "qcommon/md5.h" -#define DEBUG_SV_CHALLENGE // Enable for Com_DPrintf debugging output +//#define DEBUG_SV_CHALLENGE // Enable for Com_DPrintf debugging output static const size_t SECRET_KEY_LENGTH = MD5_DIGEST_SIZE; // Key length equal to digest length is adequate From 86a2f9ce19b13c056904312a3703b3030d30af05 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Tue, 28 Jun 2016 17:27:12 +0300 Subject: [PATCH 215/445] Remove original code of EnumerateFields --- codeJK2/game/g_savegame.cpp | 36 ++---------------------------------- 1 file changed, 2 insertions(+), 34 deletions(-) diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index 54a0d7ebe0..aa07d287ce 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -442,37 +442,6 @@ void EnumerateField(const field_t *pField, byte *pbBase) } } -#if 0 -static void EnumerateFields(const field_t *pFields, byte *pbData, unsigned int ulChid, size_t iLen) -{ - strList = new std::list; - - // enumerate all the fields... - // - if (pFields) - { - for (const field_t *pField = pFields; pField->psName; pField++) - { - assert(pField->iOffset < iLen); - EnumerateField(pField, pbData); - } - } - - // save out raw data... - // - ::sg_write_no_cast(::gi, ulChid, pbData, static_cast(iLen)); - - // save out any associated strings.. - // - for (std::list::iterator it = strList->begin(); it != strList->end(); ++it) - { - ::sg_write_no_cast(::gi, INT_ID('S','T','R','G'), it->c_str(), static_cast(it->length()+1)); - } - - delete strList; - strList = NULL; -} -#else template static void EnumerateFields(const field_t *pFields, T* src_instance, unsigned int ulChid, size_t iLen) { @@ -508,15 +477,14 @@ static void EnumerateFields(const field_t *pFields, T* src_instance, unsigned in // save out any associated strings.. // - for (std::list::iterator it = strList->begin(); it != strList->end(); ++it) + for (const auto& it : *strList) { - ::sg_write_no_cast(::gi, INT_ID('S','T','R','G'), it->c_str(), static_cast(it->length()+1)); + ::sg_write_no_cast(::gi, INT_ID('S','T','R','G'), it.c_str(), static_cast(it.length()+1)); } delete strList; strList = NULL; } -#endif static void EvaluateField(const field_t *pField, byte *pbBase, byte *pbOriginalRefData/* may be NULL*/) { From bef68d78c39ba74c6e26b3b7f47c5df1a975957e Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Tue, 28 Jun 2016 17:28:05 +0300 Subject: [PATCH 216/445] Update function EnumerateFields --- code/game/g_savegame.cpp | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index 31b796d252..c5ecd4f53c 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -501,10 +501,13 @@ static void EnumerateField(const save_field_t *pField, const byte *pbBase) } } -static void EnumerateFields(const save_field_t *pFields, const byte *pbData, unsigned int ulChid, size_t iLen) +template +static void EnumerateFields(const save_field_t *pFields, const T* src_instance, unsigned int ulChid, size_t iLen) { strList = new std::list; + auto pbData = reinterpret_cast(src_instance); + // enumerate all the fields... // if (pFields) @@ -518,14 +521,24 @@ static void EnumerateFields(const save_field_t *pFields, const byte *pbData, uns // save out raw data... // - ::sg_write_no_cast(::gi, ulChid, pbData, static_cast(iLen)); + using SgType = typename T::SgType; + + constexpr auto dst_size = static_cast(sizeof(SgType)); + + auto& dst_buffer = ::sg_get_buffer( + dst_size); + + auto dst_instance = reinterpret_cast(dst_buffer.data()); + + ::sg_export(*src_instance, *dst_instance); + + ::sg_write_no_cast(::gi, ulChid, dst_buffer.data(), dst_size); // save out any associated strings.. // - std::list::iterator it = strList->begin(); - for (size_t i=0; isize(); i++, ++it) + for (const auto& it : *strList) { - ::sg_write_no_cast(::gi, INT_ID('S','T','R','G'), (*it).c_str(), static_cast((*it).length() + 1)); + ::sg_write_no_cast(::gi, INT_ID('S','T','R','G'), it.c_str(), static_cast(it.length() + 1)); } delete strList; @@ -794,7 +807,7 @@ static void WriteLevelLocals () level_locals_t *temp = (level_locals_t *)gi.Malloc(sizeof(level_locals_t), TAG_TEMP_WORKSPACE, qfalse); *temp = level; // copy out all data into a temp space - EnumerateFields(savefields_LevelLocals, (byte *)temp, INT_ID('L','V','L','C'), LLOFS(LEVEL_LOCALS_T_SAVESTOP)); // sizeof(temp)); + EnumerateFields(savefields_LevelLocals, temp, INT_ID('L','V','L','C'), LLOFS(LEVEL_LOCALS_T_SAVESTOP)); // sizeof(temp)); gi.Free(temp); } @@ -855,7 +868,7 @@ static void WriteGEntities(qboolean qbAutosave) gi.linkentity( ent ); } - EnumerateFields(savefields_gEntity, (byte *)&tempEnt, INT_ID('G','E','N','T'), sizeof(tempEnt)); + EnumerateFields(savefields_gEntity, &tempEnt, INT_ID('G','E','N','T'), sizeof(tempEnt)); // now for any fiddly bits that would be rather awkward to build into the enumerator... // @@ -863,13 +876,13 @@ static void WriteGEntities(qboolean qbAutosave) { gNPC_t npc = *ent->NPC; // NOT *tempEnt.NPC; !! :-) - EnumerateFields(savefields_gNPC, (byte *)&npc, INT_ID('G','N','P','C'), sizeof(npc)); + EnumerateFields(savefields_gNPC, &npc, INT_ID('G','N','P','C'), sizeof(npc)); } if (tempEnt.client == (gclient_t *)-2) // I know, I know... { gclient_t client = *ent->client; // NOT *tempEnt.client!! - EnumerateFields(savefields_gClient, (byte *)&client, INT_ID('G','C','L','I'), sizeof(client)); + EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I'), sizeof(client)); } if (tempEnt.parms) @@ -880,7 +893,7 @@ static void WriteGEntities(qboolean qbAutosave) if (tempEnt.m_pVehicle) { Vehicle_t vehicle = *ent->m_pVehicle; // NOT *tempEnt.m_pVehicle!! - EnumerateFields(savefields_gVHIC, (byte *)&vehicle, INT_ID('V','H','I','C'), sizeof(vehicle)); + EnumerateFields(savefields_gVHIC, &vehicle, INT_ID('V','H','I','C'), sizeof(vehicle)); } // the scary ghoul2 saver stuff... (fingers crossed) @@ -1169,7 +1182,7 @@ void WriteLevel(qboolean qbAutosave) // assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way ReadGame works gclient_t client = level.clients[0]; - EnumerateFields(savefields_gClient, (byte *)&client, INT_ID('G','C','L','I'), sizeof(client)); + EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I'), sizeof(client)); WriteLevelLocals(); // level_locals_t level } From 0f492b1ee686f063c9748f3020f4f3dcb83216cb Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Tue, 28 Jun 2016 17:28:45 +0300 Subject: [PATCH 217/445] Add saved game class for saberInfoRetail_t --- code/qcommon/q_shared.h | 102 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 0373d5f66e..5790a635a8 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -2242,8 +2242,45 @@ typedef struct } saberInfo_t; //NOTE: Below is the *retail* version of the saberInfo_t structure - it is ONLY used for loading retail-version savegames (we load the savegame into this smaller structure, then copy each field into the appropriate field in the new structure - see SG_ConvertRetailSaberinfoToNewSaberinfo() +#pragma pack(push, 4) +class SgSaberInfoRetail +{ +public: + int32_t name; + int32_t fullName; + int32_t type; + int32_t model; + int32_t skin; + int32_t soundOn; + int32_t soundLoop; + int32_t soundOff; + int32_t numBlades; + SgArray blade; + int32_t style; + int32_t maxChain; + int32_t lockable; + int32_t throwable; + int32_t disarmable; + int32_t activeBlocking; + int32_t twoHanded; + int32_t forceRestrictions; + int32_t lockBonus; + int32_t parryBonus; + int32_t breakParryBonus; + int32_t disarmBonus; + int32_t singleBladeStyle; + int32_t singleBladeThrowable; + int32_t brokenSaber1; + int32_t brokenSaber2; + int32_t returnDamage; +}; // SgSaberInfoRetail +#pragma pack(pop) + typedef struct { + using SgType = SgSaberInfoRetail; + + char *name; //entry in sabers.cfg, if any char *fullName; //the "Proper Name" of the saber, shown in the UI saberType_t type; //none, single or staff @@ -2357,6 +2394,71 @@ typedef struct blade[i].DeactivateTrail( duration ); } }; + + + void sg_export( + SgType& dst) const + { + ::sg_export(name, dst.name); + ::sg_export(fullName, dst.fullName); + ::sg_export(type, dst.type); + ::sg_export(model, dst.model); + ::sg_export(skin, dst.skin); + ::sg_export(soundOn, dst.soundOn); + ::sg_export(soundLoop, dst.soundLoop); + ::sg_export(soundOff, dst.soundOff); + ::sg_export(numBlades, dst.numBlades); + ::sg_export(blade, dst.blade); + ::sg_export(style, dst.style); + ::sg_export(maxChain, dst.maxChain); + ::sg_export(lockable, dst.lockable); + ::sg_export(throwable, dst.throwable); + ::sg_export(disarmable, dst.disarmable); + ::sg_export(activeBlocking, dst.activeBlocking); + ::sg_export(twoHanded, dst.twoHanded); + ::sg_export(forceRestrictions, dst.forceRestrictions); + ::sg_export(lockBonus, dst.lockBonus); + ::sg_export(parryBonus, dst.parryBonus); + ::sg_export(breakParryBonus, dst.breakParryBonus); + ::sg_export(disarmBonus, dst.disarmBonus); + ::sg_export(singleBladeStyle, dst.singleBladeStyle); + ::sg_export(singleBladeThrowable, dst.singleBladeThrowable); + ::sg_export(brokenSaber1, dst.brokenSaber1); + ::sg_export(brokenSaber2, dst.brokenSaber2); + ::sg_export(returnDamage, dst.returnDamage); + } + + void sg_import( + SgType& src) + { + ::sg_import(src.name, name); + ::sg_import(src.fullName, fullName); + ::sg_import(src.type, type); + ::sg_import(src.model, model); + ::sg_import(src.skin, skin); + ::sg_import(src.soundOn, soundOn); + ::sg_import(src.soundLoop, soundLoop); + ::sg_import(src.soundOff, soundOff); + ::sg_import(src.numBlades, numBlades); + ::sg_import(src.blade, blade); + ::sg_import(src.style, style); + ::sg_import(src.maxChain, maxChain); + ::sg_import(src.lockable, lockable); + ::sg_import(src.throwable, throwable); + ::sg_import(src.disarmable, disarmable); + ::sg_import(src.activeBlocking, activeBlocking); + ::sg_import(src.twoHanded, twoHanded); + ::sg_import(src.forceRestrictions, forceRestrictions); + ::sg_import(src.lockBonus, lockBonus); + ::sg_import(src.parryBonus, parryBonus); + ::sg_import(src.breakParryBonus, breakParryBonus); + ::sg_import(src.disarmBonus, disarmBonus); + ::sg_import(src.singleBladeStyle, singleBladeStyle); + ::sg_import(src.singleBladeThrowable, singleBladeThrowable); + ::sg_import(src.brokenSaber1, brokenSaber1); + ::sg_import(src.brokenSaber2, brokenSaber2); + ::sg_import(src.returnDamage, returnDamage); + } } saberInfoRetail_t; #define MAX_SABERS 2 // if this ever changes then update the table "static const save_field_t savefields_gClient[]"!!!!!!!!!!!! From bdaa3166d04314de324602de614afd0aaa2c41c6 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Tue, 28 Jun 2016 17:34:07 +0300 Subject: [PATCH 218/445] Remove dynamic allocation of strList --- code/game/g_savegame.cpp | 11 ++++------- codeJK2/game/g_savegame.cpp | 11 ++++------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index c5ecd4f53c..29515bbe49 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -157,7 +157,7 @@ static const save_field_t savefields_gClient[] = }; // TODO FIXME mrwonko: this has no business being a global variable. WTF Raven? -std::list *strList = NULL; +static std::list strList; /////////// char * ///////////// @@ -174,7 +174,7 @@ static int GetStringNum(const char *psString) return -1; } - strList->push_back( psString ); + strList.push_back( psString ); return strlen(psString) + 1; // this gives us the chunk length for the reader later } @@ -504,7 +504,7 @@ static void EnumerateField(const save_field_t *pField, const byte *pbBase) template static void EnumerateFields(const save_field_t *pFields, const T* src_instance, unsigned int ulChid, size_t iLen) { - strList = new std::list; + strList.clear(); auto pbData = reinterpret_cast(src_instance); @@ -536,13 +536,10 @@ static void EnumerateFields(const save_field_t *pFields, const T* src_instance, // save out any associated strings.. // - for (const auto& it : *strList) + for (const auto& it : strList) { ::sg_write_no_cast(::gi, INT_ID('S','T','R','G'), it.c_str(), static_cast(it.length() + 1)); } - - delete strList; - strList = NULL; } diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index aa07d287ce..c342535342 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -153,7 +153,7 @@ static const field_t savefields_gClient[] = }; -static std::list* strList = NULL; +static std::list strList; /////////// char * ///////////// @@ -170,7 +170,7 @@ int GetStringNum(const char *psString) return -1; } - strList->push_back( psString ); + strList.push_back( psString ); return strlen(psString) + 1; // this gives us the chunk length for the reader later } @@ -445,7 +445,7 @@ void EnumerateField(const field_t *pField, byte *pbBase) template static void EnumerateFields(const field_t *pFields, T* src_instance, unsigned int ulChid, size_t iLen) { - strList = new std::list; + strList.clear(); auto pbData = reinterpret_cast(src_instance); @@ -477,13 +477,10 @@ static void EnumerateFields(const field_t *pFields, T* src_instance, unsigned in // save out any associated strings.. // - for (const auto& it : *strList) + for (const auto& it : strList) { ::sg_write_no_cast(::gi, INT_ID('S','T','R','G'), it.c_str(), static_cast(it.length()+1)); } - - delete strList; - strList = NULL; } static void EvaluateField(const field_t *pField, byte *pbBase, byte *pbOriginalRefData/* may be NULL*/) From ea9c36eb6bf8eac66bcf827ad1e181d65a0fe356 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 3 Jul 2016 20:29:06 +0300 Subject: [PATCH 219/445] Add initial saved game archive class --- code/CMakeLists.txt | 7 + code/cgame/cg_main.cpp | 1 + code/game/CMakeLists.txt | 7 + code/game/G_Timer.cpp | 1 + code/game/Q3_Interface.cpp | 1 + code/game/g_main.cpp | 1 + code/game/g_objectives.cpp | 1 + code/game/g_roff.cpp | 1 + code/game/g_savegame.cpp | 1 + code/icarus/IcarusImplementation.cpp | 1 + code/qcommon/cm_load.cpp | 1 + code/qcommon/q_shared.h | 1 + code/rd-vanilla/CMakeLists.txt | 9 +- code/rd-vanilla/G2_misc.cpp | 1 + code/server/sv_savegame.cpp | 1 + codeJK2/cgame/cg_main.cpp | 1 + codeJK2/game/CMakeLists.txt | 7 + codeJK2/game/G_Timer.cpp | 1 + codeJK2/game/Q3_Registers.cpp | 1 + codeJK2/game/g_main.cpp | 1 + codeJK2/game/g_objectives.cpp | 1 + codeJK2/game/g_roff.cpp | 1 + codeJK2/game/g_savegame.cpp | 1 + codeJK2/icarus/Instance.cpp | 1 + codeJK2/icarus/Sequence.cpp | 1 + codeJK2/icarus/Sequencer.cpp | 1 + codeJK2/icarus/TaskManager.cpp | 1 + shared/qcommon/ojk_exception.cpp | 29 + shared/qcommon/ojk_exception.h | 35 ++ shared/qcommon/ojk_sg_archive.cpp | 80 +++ shared/qcommon/ojk_sg_archive.h | 587 ++++++++++++++++++++ shared/qcommon/ojk_sg_archive_exception.cpp | 31 ++ shared/qcommon/ojk_sg_archive_exception.h | 36 ++ shared/qcommon/ojk_sg_archive_fwd.h | 257 +++++++++ 34 files changed, 1107 insertions(+), 1 deletion(-) create mode 100644 shared/qcommon/ojk_exception.cpp create mode 100644 shared/qcommon/ojk_exception.h create mode 100644 shared/qcommon/ojk_sg_archive.cpp create mode 100644 shared/qcommon/ojk_sg_archive.h create mode 100644 shared/qcommon/ojk_sg_archive_exception.cpp create mode 100644 shared/qcommon/ojk_sg_archive_exception.h create mode 100644 shared/qcommon/ojk_sg_archive_fwd.h diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index c3f94c1c61..fcf9b47344 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -177,6 +177,13 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SharedDir}/qcommon/ojk_sg_wrappers.h" "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" + "${SharedDir}/qcommon/ojk_exception.h" + "${SharedDir}/qcommon/ojk_exception.cpp" + "${SharedDir}/qcommon/ojk_sg_archive.h" + "${SharedDir}/qcommon/ojk_sg_archive_fwd.h" + "${SharedDir}/qcommon/ojk_sg_archive.cpp" + "${SharedDir}/qcommon/ojk_sg_archive_exception.h" + "${SharedDir}/qcommon/ojk_sg_archive_exception.cpp" ${SharedCommonFiles} ) diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 649ddf4529..6360ce5a1e 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -29,6 +29,7 @@ along with this program; if not, see . #include "../qcommon/sstring.h" #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char > namePrecache_m; diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 6190bc9d13..d19b9f877d 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -263,6 +263,13 @@ set(SPGameCommonFiles "${SharedDir}/qcommon/ojk_sg_wrappers.h" "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" + "${SharedDir}/qcommon/ojk_exception.h" + "${SharedDir}/qcommon/ojk_exception.cpp" + "${SharedDir}/qcommon/ojk_sg_archive.h" + "${SharedDir}/qcommon/ojk_sg_archive_fwd.h" + "${SharedDir}/qcommon/ojk_sg_archive.cpp" + "${SharedDir}/qcommon/ojk_sg_archive_exception.h" + "${SharedDir}/qcommon/ojk_sg_archive_exception.cpp" ${SharedCommonFiles} ) diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index c469fc1253..4521e8b6a9 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -23,6 +23,7 @@ along with this program; if not, see . #include "g_local.h" #include "../Rufl/hstring.h" #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" #define MAX_GTIMERS 16384 diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index ea4d7fc6e3..b9eb56a876 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -41,6 +41,7 @@ along with this program; if not, see . #include "g_vehicles.h" #include "g_navigator.h" #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" extern cvar_t *com_buildScript; diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 4b94b70ca7..60c05bf6f5 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -37,6 +37,7 @@ along with this program; if not, see . //rww - RAGDOLL_END #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" extern void WP_SaberLoadParms( void ); extern qboolean G_PlayerSpawned( void ); diff --git a/code/game/g_objectives.cpp b/code/game/g_objectives.cpp index 6843a32c69..a55f3b6461 100644 --- a/code/game/g_objectives.cpp +++ b/code/game/g_objectives.cpp @@ -30,6 +30,7 @@ along with this program; if not, see . #include "objectives.h" #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" qboolean missionInfo_Updated; diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp index 321b3df5fb..47d42051b2 100644 --- a/code/game/g_roff.cpp +++ b/code/game/g_roff.cpp @@ -26,6 +26,7 @@ along with this program; if not, see . #include "../cgame/cg_local.h" #include "g_functions.h" #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" // The list of precached ROFFs roff_list_t roffs[MAX_ROFFS]; diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index 29515bbe49..c8e3dcff25 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -31,6 +31,7 @@ along with this program; if not, see . #include "../cgame/cg_camera.h" #include "../qcommon/sstring.h" #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" extern void OBJ_LoadTacticalInfo(void); diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index 6308115f31..076bd30992 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -34,6 +34,7 @@ along with this program; if not, see . #include "../qcommon/q_shared.h" #include "../qcommon/qcommon.h" #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" #define STL_ITERATE( a, b ) for ( a = b.begin(); a != b.end(); ++a ) #define STL_INSERT( a, b ) a.insert( a.end(), b ); diff --git a/code/qcommon/cm_load.cpp b/code/qcommon/cm_load.cpp index d3f4c8144d..4566854848 100644 --- a/code/qcommon/cm_load.cpp +++ b/code/qcommon/cm_load.cpp @@ -25,6 +25,7 @@ along with this program; if not, see . #include "cm_local.h" #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" #ifdef BSPC void SetPlaneSignbits (cplane_t *out) { diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 5790a635a8..c026a9bdb9 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -161,6 +161,7 @@ float FloatSwap( const float *f ); #include "qcommon/q_platform.h" #include "qcommon/ojk_sg_wrappers_fwd.h" +#include "qcommon/ojk_sg_archive_fwd.h" // ================================================================ diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index 449e2e4794..824050e756 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -81,7 +81,14 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) "${SharedDir}/qcommon/ojk_sg_wrappers.h" "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" - + "${SharedDir}/qcommon/ojk_exception.h" + "${SharedDir}/qcommon/ojk_exception.cpp" + "${SharedDir}/qcommon/ojk_sg_archive.h" + "${SharedDir}/qcommon/ojk_sg_archive_fwd.h" + "${SharedDir}/qcommon/ojk_sg_archive.cpp" + "${SharedDir}/qcommon/ojk_sg_archive_exception.h" + "${SharedDir}/qcommon/ojk_sg_archive_exception.cpp" + ${SharedCommonFiles} ) source_group("common" FILES ${SPRDVanillaCommonFiles}) diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index d0a1a95e79..7e319d023e 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -51,6 +51,7 @@ along with this program; if not, see . #ifdef _G2_GORE #include "../ghoul2/ghoul2_gore.h" #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" #define GORE_TAG_UPPER (256) #define GORE_TAG_MASK (~255) diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 2c01d393f0..e4069d64bf 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -38,6 +38,7 @@ along with this program; if not, see . #include #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" static char saveGameComment[iSG_COMMENT_SIZE]; diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index f8f1ff13a2..f6279e745e 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -29,6 +29,7 @@ along with this program; if not, see . #include "../../code/qcommon/sstring.h" #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char, std::less, std::allocator< unsigned char > > namePrecache_m; diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index 6abe3ee303..e38f6b9a14 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -235,6 +235,13 @@ set(JK2SPGameCommonFiles "${SharedDir}/qcommon/ojk_sg_wrappers.h" "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" + "${SharedDir}/qcommon/ojk_exception.h" + "${SharedDir}/qcommon/ojk_exception.cpp" + "${SharedDir}/qcommon/ojk_sg_archive.h" + "${SharedDir}/qcommon/ojk_sg_archive_fwd.h" + "${SharedDir}/qcommon/ojk_sg_archive.cpp" + "${SharedDir}/qcommon/ojk_sg_archive_exception.h" + "${SharedDir}/qcommon/ojk_sg_archive_exception.cpp" ${SharedCommonFiles} ) diff --git a/codeJK2/game/G_Timer.cpp b/codeJK2/game/G_Timer.cpp index 737861efe9..6b5de3a08d 100644 --- a/codeJK2/game/G_Timer.cpp +++ b/codeJK2/game/G_Timer.cpp @@ -24,6 +24,7 @@ along with this program; if not, see . #include "g_local.h" #include "../../code/Rufl/hstring.h" #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" #define MAX_GTIMERS 16384 diff --git a/codeJK2/game/Q3_Registers.cpp b/codeJK2/game/Q3_Registers.cpp index 74a19b202a..3ed08351e4 100644 --- a/codeJK2/game/Q3_Registers.cpp +++ b/codeJK2/game/Q3_Registers.cpp @@ -25,6 +25,7 @@ along with this program; if not, see . #include "g_local.h" #include "Q3_Registers.h" #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" extern void Q3_DebugPrint( int level, const char *format, ... ); diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp index 4fb5a70a5f..9bb12609ca 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -36,6 +36,7 @@ along with this program; if not, see . #include "../cgame/cg_local.h" // yeah I know this is naughty, but we're shipping soon... #include "time.h" #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" extern CNavigator navigator; diff --git a/codeJK2/game/g_objectives.cpp b/codeJK2/game/g_objectives.cpp index a0488ae7d3..c5e2ae82aa 100644 --- a/codeJK2/game/g_objectives.cpp +++ b/codeJK2/game/g_objectives.cpp @@ -32,6 +32,7 @@ along with this program; if not, see . #include "objectives.h" #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" qboolean missionInfo_Updated; diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp index 409785b853..60ceed6455 100644 --- a/codeJK2/game/g_roff.cpp +++ b/codeJK2/game/g_roff.cpp @@ -26,6 +26,7 @@ along with this program; if not, see . #include "g_roff.h" #include "g_icarus.h" #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" // The list of precached ROFFs roff_list_t roffs[MAX_ROFFS]; diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index c342535342..d3108fa04d 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -34,6 +34,7 @@ along with this program; if not, see . #include "g_icarus.h" #include "../../code/qcommon/sstring.h" #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" extern void OBJ_LoadTacticalInfo(void); diff --git a/codeJK2/icarus/Instance.cpp b/codeJK2/icarus/Instance.cpp index d675291ff5..7888ee732b 100644 --- a/codeJK2/icarus/Instance.cpp +++ b/codeJK2/icarus/Instance.cpp @@ -30,6 +30,7 @@ along with this program; if not, see . #include #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" // Instance diff --git a/codeJK2/icarus/Sequence.cpp b/codeJK2/icarus/Sequence.cpp index a6193975c7..2b9a56f5e8 100644 --- a/codeJK2/icarus/Sequence.cpp +++ b/codeJK2/icarus/Sequence.cpp @@ -29,6 +29,7 @@ along with this program; if not, see . #include #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" CSequence::CSequence( void ) { diff --git a/codeJK2/icarus/Sequencer.cpp b/codeJK2/icarus/Sequencer.cpp index b10032972e..8096d3fd50 100644 --- a/codeJK2/icarus/Sequencer.cpp +++ b/codeJK2/icarus/Sequencer.cpp @@ -31,6 +31,7 @@ along with this program; if not, see . #include "assert.h" #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" // Sequencer diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index 2cf235ad86..9fb06d0dd4 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -32,6 +32,7 @@ along with this program; if not, see . #include #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_sg_archive.h" #define ICARUS_VALIDATE(a) if ( a == false ) return TASK_FAILED; diff --git a/shared/qcommon/ojk_exception.cpp b/shared/qcommon/ojk_exception.cpp new file mode 100644 index 0000000000..82e4bc14ae --- /dev/null +++ b/shared/qcommon/ojk_exception.cpp @@ -0,0 +1,29 @@ +// +// Base exception. +// + + +#include "ojk_exception.h" + + +namespace ojk { + + +Exception::Exception( + const char* message) : + std::runtime_error(message) +{ +} + +Exception::Exception( + const std::string& message) : + std::runtime_error(message) +{ +} + +Exception::~Exception() +{ +} + + +} // ojk diff --git a/shared/qcommon/ojk_exception.h b/shared/qcommon/ojk_exception.h new file mode 100644 index 0000000000..8e4704ea05 --- /dev/null +++ b/shared/qcommon/ojk_exception.h @@ -0,0 +1,35 @@ +// +// Base exception. +// + + +#ifndef OJK_EXCEPTION_INCLUDED +#define OJK_EXCEPTION_INCLUDED + + +#include +#include + + +namespace ojk { + + +class Exception : + public std::runtime_error +{ +public: + explicit Exception( + const char* message); + + explicit Exception( + const std::string& message); + + virtual ~Exception(); +}; // Exception + + +} // ojk + + +#endif // OJK_EXCEPTION_INCLUDED + diff --git a/shared/qcommon/ojk_sg_archive.cpp b/shared/qcommon/ojk_sg_archive.cpp new file mode 100644 index 0000000000..d669e835fb --- /dev/null +++ b/shared/qcommon/ojk_sg_archive.cpp @@ -0,0 +1,80 @@ +#include "ojk_sg_archive.h" +#include +#include +#include "ojk_sg_archive_exception.h" + + +namespace ojk { +namespace sg { + + +Archive::Archive() : + file_handle_(), + io_buffer_(), + io_buffer_offset_() +{ +} + +Archive::~Archive() +{ + close(); +} + +bool Archive::open( + const std::string& file_path) +{ + throw ArchiveException( + "Not implemented."); +} + +bool Archive::create( + const std::string& file_path) +{ + throw ArchiveException( + "Not implemented."); +} + +void Archive::close() +{ + throw ArchiveException( + "Not implemented."); +} + +void Archive::read_chunk( + const Archive::ChunkId chunk_id) +{ + throw ArchiveException( + "Not implemented."); +} + +void Archive::write_chunk( + const Archive::ChunkId chunk_id) +{ + throw ArchiveException( + "Not implemented."); +} + +void Archive::rename( + const std::string& old_file_path, + const std::string& new_file_path) +{ + throw ArchiveException( + "Not implemented."); +} + +void Archive::remove( + const std::string& file_path) +{ + throw ArchiveException( + "Not implemented."); +} + +Archive& Archive::get_instance() +{ + static Archive result; + return result; +} + + +} // sg +} // ojk diff --git a/shared/qcommon/ojk_sg_archive.h b/shared/qcommon/ojk_sg_archive.h new file mode 100644 index 0000000000..64ec1fb01e --- /dev/null +++ b/shared/qcommon/ojk_sg_archive.h @@ -0,0 +1,587 @@ +// +// Saved game archive. +// (forward declaration) +// + + +#ifndef OJK_SG_ARCHIVE_INCLUDED +#define OJK_SG_ARCHIVE_INCLUDED + + +#include +#include +#include +#include "ojk_sg_archive_fwd.h" + + +namespace ojk { +namespace sg { + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// I/O buffer manipulation. + +template +void Archive::check_io_buffer( + int count) +{ + if (count <= 0) { + throw ArchiveException( + "Zero or negative count."); + } + + const auto data_size = sizeof(T) * count; + + if ((io_buffer_offset_ + data_size) > io_buffer_.size()) { + throw ArchiveException( + "Not enough data."); + } +} + +template +void Archive::accomodate_io_buffer( + int count) +{ + if (count <= 0) { + throw ArchiveException( + "Zero or negative count."); + } + + const auto data_size = sizeof(T) * count; + + const auto new_buffer_size = io_buffer_offset_ + data_size; + + io_buffer_.resize( + new_buffer_size); +} + +template +T Archive::cast_io_buffer() +{ + return reinterpret_cast(&io_buffer_[io_buffer_offset_]); +} + +template +void Archive::advance_io_buffer( + int count) +{ + if (count <= 0) { + throw ArchiveException( + "Zero or negative count."); + } + + const auto data_size = sizeof(T) * count; + io_buffer_offset_ += data_size; +} + +// I/O buffer manipulation. +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// read_chunk + +template +void Archive::read_chunk( + const ChunkId chunk_id, + TDst& dst_value) +{ + read_chunk( + chunk_id); + + read( + dst_value); +} + +template +void Archive::read_chunk( + const ChunkId chunk_id, + TDst* dst_values, + int dst_count) +{ + read_chunk( + chunk_id); + + read( + dst_values, + dst_count); +} + +// read_chunk +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// write_chunk + +template +void Archive::write_chunk( + const ChunkId chunk_id, + const TSrc& src_value) +{ + io_buffer_offset_ = 0; + + write( + src_value); + + write_chunk( + chunk_id); +} + +template +void Archive::write_chunk( + const ChunkId chunk_id, + const TSrc* src_values, + int src_count) +{ + io_buffer_offset_ = 0; + + write( + src_values, + src_count); + + write_chunk( + chunk_id); +} + +// write_chunk +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// read + +template +void Archive::read( + TDst& dst_value) +{ + using Tag = typename std::conditional< + std::is_same::value, + BooleanTag, + typename std::conditional< + std::is_arithmetic::value || std::is_enum::value, + NumericTag, + typename std::conditional< + std::is_pointer::value, + PointerTag, + typename std::conditional< + std::is_class::value, + ClassTag, + typename std::conditional< + std::rank::value == 1, + Array1dTag, + void + >::type + >::type + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported type."); + + read( + dst_value, + Tag()); +} + +template +void Archive::read( + TDst& dst_value, + BooleanTag) +{ + constexpr auto src_size = sizeof(TSrc); + + check_io_buffer(); + + dst_value = (cast_io_buffer() != 0); + + // FIXME Byte order + // + + advance_io_buffer(); +} + +template +void Archive::read( + TDst& dst_value, + NumericTag) +{ + check_io_buffer(); + + dst_value = static_cast(cast_io_buffer()); + + // FIXME Byte order + // + + advance_io_buffer(); +} + +template +void Archive::read( + TDst*& dst_value, + PointerTag) +{ + static_assert( + std::is_arithmetic::value && + !std::is_same::value, + "Unsupported types."); + + using DstNumeric = typename std::conditional< + std::is_signed::value, + std::intptr_t, + std::uintptr_t + >::type; + + auto dst_number = DstNumeric(); + + read( + dst_number, + NumericTag()); + + dst_value = reinterpret_cast(dst_number); +} + +template +void Archive::read( + TDst& dst_value, + ClassTag) +{ + throw ArchiveException( + "Not implemented."); +} + +template +void Archive::read( + TDst (&dst_values)[TCount], + Array1dTag) +{ + read( + &dst_values[0], + TCount); +} + +// read +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// read (C-array) + +template +void Archive::read( + TDst* dst_values, + int dst_count) +{ + static_assert( + (std::is_arithmetic::value && + !std::is_same::value && + !std::is_enum::value) || + std::is_class::value, + "Unsupported types."); + + if (!dst_values) { + throw ArchiveException( + "Null pointer."); + } + + if (dst_count < 0) { + throw ArchiveException( + "Negative count."); + } + + if (dst_count == 0) { + return; + } + + using Src = typename std::conditional< + std::is_same::value, + TDst, + TSrc>::type; + + constexpr auto is_src_pure_numeric = + std::is_arithmetic::value && + (!std::is_same::value) && + (!std::is_enum::value); + + constexpr auto is_dst_pure_numeric = + std::is_arithmetic::value && + (!std::is_same::value) && + (!std::is_enum::value); + + constexpr auto has_same_size = + (sizeof(Src) == sizeof(TDst)); + + constexpr auto use_inplace = + is_src_pure_numeric && + is_dst_pure_numeric && + has_same_size; + + using Tag = typename std::conditional< + use_inplace, + InplaceTag, + CastTag + >::type; + + read( + dst_values, + dst_count, + Tag()); +} + +template +void Archive::read( + TDst* dst_values, + int dst_count, + InplaceTag) +{ + check_io_buffer( + dst_count); + + std::uninitialized_copy_n( + cast_io_buffer(), + dst_count, + dst_values); + + // FIXME Byte order + // + + advance_io_buffer( + dst_count); +} + +template +void Archive::read( + TDst* dst_values, + int dst_count, + CastTag) +{ + using Tag = typename std::conditional< + std::is_arithmetic::value, + NumericTag, + typename std::conditional< + std::is_class::value, + ClassTag, + void + >::type + >::type; + + for (int i = 0; i < dst_count; ++i) { + read( + dst_values[i], + Tag()); + } +} + +// read (C-array) +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// write + +template +void Archive::write( + const TSrc& src_value) +{ + using Tag = typename std::conditional< + std::is_arithmetic::value || std::is_enum::value, + NumericTag, + typename std::conditional< + std::is_pointer::value, + PointerTag, + typename std::conditional< + std::is_class::value, + ClassTag, + typename std::conditional< + std::rank::value == 1, + Array1dTag, + void + >::type + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported type."); + + write( + src_value, + Tag()); +} + +template +void Archive::write( + const TSrc& src_value, + NumericTag) +{ + accomodate_io_buffer(); + + cast_io_buffer() = static_cast(src_value); + + // FIXME Byte order + // + + advance_io_buffer(); +} + +template +void Archive::write( + const TSrc*& src_value, + PointerTag) +{ + using DstNumeric = typename std::conditional< + std::is_signed::value, + std::intptr_t, + std::uintptr_t + >::type; + + auto dst_number = reinterpret_cast(src_value); + + write( + dst_number, + NumericTag()); +} + +template +void Archive::write( + const TSrc& src_value, + ClassTag) +{ + throw ArchiveException( + "Not implemented."); +} + +template +void Archive::write( + const TSrc (&src_values)[TCount], + Array1dTag) +{ + write( + &src_values[0], + TCount); +} + +// write +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// write (C-array) + +template +void Archive::write( + const TSrc* src_values, + int src_count) +{ + static_assert( + (std::is_arithmetic::value && + !std::is_same::value && + !std::is_enum::value) || + std::is_class::value, + "Unsupported types."); + + if (!src_values) { + throw ArchiveException( + "Null pointer."); + } + + if (src_count < 0) { + throw ArchiveException( + "Negative count."); + } + + if (src_count == 0) { + return; + } + + using Dst = typename std::conditional< + std::is_same::value, + TSrc, + TDst>::type; + + constexpr auto is_src_pure_numeric = + std::is_arithmetic::value && + (!std::is_same::value) && + (!std::is_enum::value); + + constexpr auto is_dst_pure_numeric = + std::is_arithmetic::value && + (!std::is_same::value) && + (!std::is_enum::value); + + constexpr auto has_same_size = + (sizeof(TSrc) == sizeof(Dst)); + + constexpr auto use_inplace = + is_src_pure_numeric && + is_dst_pure_numeric && + has_same_size; + + using Tag = typename std::conditional< + use_inplace, + InplaceTag, + CastTag + >::type; + + write( + src_values, + src_count, + Tag()); +} + +template +void Archive::write( + const TSrc* src_values, + int src_count, + InplaceTag) +{ + accomodate_io_buffer( + src_count); + + std::uninitialized_copy_n( + src_values, + src_count, + cast_io_buffer()); + + // FIXME Byte order + // + + advance_io_buffer( + src_count); +} + +template +void Archive::write( + const TSrc* src_values, + int src_count, + CastTag) +{ + using Tag = typename std::conditional< + std::is_arithmetic::value, + NumericTag, + typename std::conditional< + std::is_class::value, + ClassTag, + void + >::type + >::type; + + for (int i = 0; i < src_count; ++i) { + write( + src_values[i], + Tag()); + } +} + +// write (C-array) +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +} // sg +} // ojk + + +#endif // OJK_SG_ARCHIVE_INCLUDED diff --git a/shared/qcommon/ojk_sg_archive_exception.cpp b/shared/qcommon/ojk_sg_archive_exception.cpp new file mode 100644 index 0000000000..a582836e55 --- /dev/null +++ b/shared/qcommon/ojk_sg_archive_exception.cpp @@ -0,0 +1,31 @@ +// +// Saved game archive exception. +// + + +#include "ojk_sg_archive_exception.h" + + +namespace ojk { +namespace sg { + + +ArchiveException::ArchiveException( + const char* message) : + Exception(message) +{ +} + +ArchiveException::ArchiveException( + const std::string& message) : + Exception(message) +{ +} + +ArchiveException::~ArchiveException() +{ +} + + +} // sg +} // ojk diff --git a/shared/qcommon/ojk_sg_archive_exception.h b/shared/qcommon/ojk_sg_archive_exception.h new file mode 100644 index 0000000000..a709724821 --- /dev/null +++ b/shared/qcommon/ojk_sg_archive_exception.h @@ -0,0 +1,36 @@ +// +// Saved game archive exception. +// + + +#ifndef OJK_SG_ARCHIVE_EXCEPTION_INCLUDED +#define OJK_SG_ARCHIVE_EXCEPTION_INCLUDED + + +#include "ojk_exception.h" + + +namespace ojk { +namespace sg { + + +class ArchiveException : + public Exception +{ +public: + explicit ArchiveException( + const char* message); + + explicit ArchiveException( + const std::string& message); + + virtual ~ArchiveException(); +}; // ArchiveException + + +} // sg +} // ojk + + +#endif // OJK_SG_ARCHIVE_EXCEPTION_INCLUDED + diff --git a/shared/qcommon/ojk_sg_archive_fwd.h b/shared/qcommon/ojk_sg_archive_fwd.h new file mode 100644 index 0000000000..31eca737f1 --- /dev/null +++ b/shared/qcommon/ojk_sg_archive_fwd.h @@ -0,0 +1,257 @@ +// +// Saved game archive. +// (forward declaration) +// + + +#ifndef OJK_SG_ARCHIVE_FWD_INCLUDED +#define OJK_SG_ARCHIVE_FWD_INCLUDED + + +#include +#include +#include +#include "ojk_sg_archive_exception.h" + + +using fileHandle_t = int32_t; + + +namespace ojk { +namespace sg { + + +enum class ArchiveMode { + jedi_outcast, + jedi_academy, +}; // ArchiveMode + + +class Archive +{ +public: + using ChunkId = uint32_t; + + + Archive(); + + Archive( + const Archive& that) = delete; + + Archive& operator=( + const Archive& that) = delete; + + ~Archive(); + + + // Creates a new saved game file for writing. + bool create( + const std::string& file_path); + + // Opens an existing saved game file for reading. + bool open( + const std::string& file_path); + + // Closes the current saved game file. + void close(); + + + // Reads a chunk from the file into the internal buffer. + void read_chunk( + const ChunkId chunk_id); + + // Reads a value or an array of values from the file via + // the internal buffer. + template + void read_chunk( + const ChunkId chunk_id, + TDst& dst_value); + + // Reads an array of values with specified count from + // the file via the internal buffer. + template + void read_chunk( + const ChunkId chunk_id, + TDst* dst_values, + int dst_count); + + + // Writes a chunk into the file from the internal buffer. + void write_chunk( + const ChunkId chunk_id); + + // Writes a value or an array of values into the file via + // the internal buffer. + template + void write_chunk( + const ChunkId chunk_id, + const TSrc& src_value); + + // Writes an array of values with specified count into + // the file via the internal buffer. + template + void write_chunk( + const ChunkId chunk_id, + const TSrc* src_values, + int src_count); + + + // Reads a value or array of values from the internal buffer. + template + void read( + TDst& dst_value); + + // Reads an array of values with specificed count from the internal buffer. + template + void read( + TDst* dst_values, + int dst_count); + + + // Writes a value or array of values into the internal buffer. + template + void write( + const TSrc& src_value); + + // Writes an array of values with specificed count into the internal buffer. + template + void write( + const TSrc* src_values, + int src_count); + + + // Renames a saved game file. + static void rename( + const std::string& old_file_path, + const std::string& new_file_path); + + // Remove a saved game file. + static void remove( + const std::string& file_path); + + // Returns a default instance of the class. + static Archive& get_instance(); + + +private: + using Buffer = std::vector; + using BufferOffset = Buffer::size_type; + + // Tags for dispatching. + class BooleanTag { public: }; + class NumericTag { public: }; + class PointerTag { public: }; + class ClassTag { public: }; + class Array1dTag { public: }; + class InplaceTag { public: }; + class CastTag { public: }; + + // A handle to a file. + fileHandle_t file_handle_; + + // I/O buffer. + Buffer io_buffer_; + + // A current offset inside the I/O buffer. + BufferOffset io_buffer_offset_; + + + // Checks if there is enough data for reading in the I/O buffer. + template + void check_io_buffer( + int count = 1); + + // Resizes the I/O buffer according to desire size of data to write. + template + void accomodate_io_buffer( + int count = 1); + + // Casts I/O buffer data at the current offset. + template + T cast_io_buffer(); + + // Advances the current I/O buffer offset. + template + void advance_io_buffer( + int count = 1); + + + template + void read( + TDst& dst_value, + BooleanTag); + + template + void read( + TDst& dst_value, + NumericTag); + + template + void read( + TDst*& dst_value, + PointerTag); + + template + void read( + TDst& dst_value, + ClassTag); + + template + void read( + TDst (&dst_values)[TCount], + Array1dTag); + + + template + void read( + TDst* dst_values, + int dst_count, + InplaceTag); + + template + void read( + TDst* dst_values, + int dst_count, + CastTag); + + + template + void write( + const TSrc& src_value, + NumericTag); + + template + void write( + const TSrc*& src_value, + PointerTag); + + template + void write( + const TSrc& src_value, + ClassTag); + + template + void write( + const TSrc (&src_values)[TCount], + Array1dTag); + + + template + void write( + const TSrc* src_values, + int src_count, + InplaceTag); + + template + void write( + const TSrc* src_values, + int src_count, + CastTag); +}; // Archive + + +} // sg +} // ojk + + +#endif // OJK_SG_ARCHIVE_FWD_INCLUDED From 73b2f7f26a39530a312b9788e765886cd57c1443 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 3 Jul 2016 21:26:36 +0300 Subject: [PATCH 220/445] Add method add_path --- shared/qcommon/ojk_sg_archive.cpp | 53 ++++++++++++++++++++++++++--- shared/qcommon/ojk_sg_archive_fwd.h | 30 +++++++++++++--- 2 files changed, 75 insertions(+), 8 deletions(-) diff --git a/shared/qcommon/ojk_sg_archive.cpp b/shared/qcommon/ojk_sg_archive.cpp index d669e835fb..d31acc048e 100644 --- a/shared/qcommon/ojk_sg_archive.cpp +++ b/shared/qcommon/ojk_sg_archive.cpp @@ -1,7 +1,6 @@ #include "ojk_sg_archive.h" -#include -#include #include "ojk_sg_archive_exception.h" +#include "qcommon/qcommon.h" namespace ojk { @@ -9,6 +8,9 @@ namespace sg { Archive::Archive() : + archive_mode_(), + paths_(get_max_path_count()), + path_index_(), file_handle_(), io_buffer_(), io_buffer_offset_() @@ -21,6 +23,7 @@ Archive::~Archive() } bool Archive::open( + ArchiveMode archive_mode, const std::string& file_path) { throw ArchiveException( @@ -28,6 +31,7 @@ bool Archive::open( } bool Archive::create( + ArchiveMode archive_mode, const std::string& file_path) { throw ArchiveException( @@ -55,8 +59,8 @@ void Archive::write_chunk( } void Archive::rename( - const std::string& old_file_path, - const std::string& new_file_path) + const std::string& old_file_path, + const std::string& new_file_path) { throw ArchiveException( "Not implemented."); @@ -75,6 +79,47 @@ Archive& Archive::get_instance() return result; } +int Archive::get_max_path_count() +{ + return 8; +} + +void Archive::validate_archive_mode( + ArchiveMode archive_mode) +{ + switch (archive_mode) { + case ArchiveMode::jedi_academy: + case ArchiveMode::jedi_outcast: + break; + + default: + throw ArchiveException( + "Invalid mode."); + } +} + +const std::string& Archive::add_path( + const std::string& path) +{ + auto next_path_index = (path_index_ + 1) % get_max_path_count(); + + auto normalized_path = path; + + std::replace( + normalized_path.begin(), + normalized_path.end(), + '/', + '_'); + + auto new_path = "saves/" + normalized_path + ".sav"; + + paths_[path_index_] = new_path; + + path_index_ = next_path_index; + + return paths_[path_index_]; +} + } // sg } // ojk diff --git a/shared/qcommon/ojk_sg_archive_fwd.h b/shared/qcommon/ojk_sg_archive_fwd.h index 31eca737f1..6106f00651 100644 --- a/shared/qcommon/ojk_sg_archive_fwd.h +++ b/shared/qcommon/ojk_sg_archive_fwd.h @@ -14,14 +14,12 @@ #include "ojk_sg_archive_exception.h" -using fileHandle_t = int32_t; - - namespace ojk { namespace sg { enum class ArchiveMode { + none, jedi_outcast, jedi_academy, }; // ArchiveMode @@ -46,10 +44,12 @@ class Archive // Creates a new saved game file for writing. bool create( + ArchiveMode archive_mode, const std::string& file_path); // Opens an existing saved game file for reading. bool open( + ArchiveMode archive_mode, const std::string& file_path); // Closes the current saved game file. @@ -136,6 +136,8 @@ class Archive private: using Buffer = std::vector; using BufferOffset = Buffer::size_type; + using Paths = std::vector; + // Tags for dispatching. class BooleanTag { public: }; @@ -146,8 +148,18 @@ class Archive class InplaceTag { public: }; class CastTag { public: }; + + // An archive mode. + ArchiveMode archive_mode_; + + // Saved game paths. + Paths paths_; + + // Current path index. + int path_index_; + // A handle to a file. - fileHandle_t file_handle_; + int file_handle_; // I/O buffer. Buffer io_buffer_; @@ -156,6 +168,16 @@ class Archive BufferOffset io_buffer_offset_; + static constexpr int get_max_path_count(); + + + void validate_archive_mode( + ArchiveMode archive_mode); + + const std::string& add_path( + const std::string& path); + + // Checks if there is enough data for reading in the I/O buffer. template void check_io_buffer( From 587f856e6174e0d3c50cdc9d877482cf4b9573d8 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 3 Jul 2016 22:13:20 +0300 Subject: [PATCH 221/445] Implement method open --- shared/qcommon/ojk_sg_archive.cpp | 107 ++++++++++++++++++++++++---- shared/qcommon/ojk_sg_archive_fwd.h | 14 ++-- 2 files changed, 101 insertions(+), 20 deletions(-) diff --git a/shared/qcommon/ojk_sg_archive.cpp b/shared/qcommon/ojk_sg_archive.cpp index d31acc048e..224fc57ca1 100644 --- a/shared/qcommon/ojk_sg_archive.cpp +++ b/shared/qcommon/ojk_sg_archive.cpp @@ -1,6 +1,7 @@ #include "ojk_sg_archive.h" #include "ojk_sg_archive_exception.h" #include "qcommon/qcommon.h" +#include "server/server.h" namespace ojk { @@ -24,15 +25,66 @@ Archive::~Archive() bool Archive::open( ArchiveMode archive_mode, - const std::string& file_path) + const std::string& base_file_name) { - throw ArchiveException( - "Not implemented."); + validate_archive_mode( + archive_mode); + + auto&& file_path = generate_path( + base_file_name); + + auto is_succeed = true; + + if (is_succeed) { + ::FS_FOpenFileRead( + file_path.c_str(), + &file_handle_, + qtrue); + + if (file_handle_ == 0) { + is_succeed = false; + + auto error_message = get_failed_to_open_message( + file_path, + true); + + ::Com_DPrintf( + "%s\n", + error_message.c_str()); + } + } + + + int sg_version = -1; + + if (is_succeed) { + read_chunk( + INT_ID('_', 'V', 'E', 'R'), + sg_version); + + if (sg_version != iSAVEGAME_VERSION) { + is_succeed = false; + + ::Com_Printf( + S_COLOR_RED "File \"%s\" has version # %d (expecting %d)\n", + base_file_name.c_str(), + sg_version, + iSAVEGAME_VERSION); + } + } + + if (is_succeed) { + archive_mode_ = archive_mode; + } else { + close(); + } + + return is_succeed; } bool Archive::create( ArchiveMode archive_mode, - const std::string& file_path) + const std::string& base_file_name) { throw ArchiveException( "Not implemented."); @@ -98,26 +150,51 @@ void Archive::validate_archive_mode( } } -const std::string& Archive::add_path( - const std::string& path) +std::string Archive::generate_path( + const std::string& base_file_name) { - auto next_path_index = (path_index_ + 1) % get_max_path_count(); - - auto normalized_path = path; + auto normalized_file_name = base_file_name; std::replace( - normalized_path.begin(), - normalized_path.end(), + normalized_file_name.begin(), + normalized_file_name.end(), '/', '_'); - auto new_path = "saves/" + normalized_path + ".sav"; + auto path = "saves/" + normalized_file_name + ".sav"; - paths_[path_index_] = new_path; + return path; +} - path_index_ = next_path_index; +std::string Archive::get_failed_to_open_message( + const std::string& file_name, + bool is_open) +{ + constexpr int max_length = 256; + + auto message_id = + is_open ? +#ifdef JK2_MODE + "MENUS3_FAILED_TO_OPEN_SAVEGAME" : + "MENUS3_FAILED_TO_CREATE_SAVEGAME" +#else + "MENUS_FAILED_TO_OPEN_SAVEGAME" : + "MENUS3_FAILED_TO_CREATE_SAVEGAME" +#endif + ; + + std::string result( + S_COLOR_RED); + + result += ::va( + ::SE_GetString(message_id), + file_name.c_str()); + + if (result.length() > max_length) { + result.resize(max_length); + } - return paths_[path_index_]; + return result; } diff --git a/shared/qcommon/ojk_sg_archive_fwd.h b/shared/qcommon/ojk_sg_archive_fwd.h index 6106f00651..5cd35023f0 100644 --- a/shared/qcommon/ojk_sg_archive_fwd.h +++ b/shared/qcommon/ojk_sg_archive_fwd.h @@ -45,12 +45,12 @@ class Archive // Creates a new saved game file for writing. bool create( ArchiveMode archive_mode, - const std::string& file_path); + const std::string& base_file_name); // Opens an existing saved game file for reading. bool open( ArchiveMode archive_mode, - const std::string& file_path); + const std::string& base_file_name); // Closes the current saved game file. void close(); @@ -159,7 +159,7 @@ class Archive int path_index_; // A handle to a file. - int file_handle_; + int32_t file_handle_; // I/O buffer. Buffer io_buffer_; @@ -174,8 +174,12 @@ class Archive void validate_archive_mode( ArchiveMode archive_mode); - const std::string& add_path( - const std::string& path); + static std::string generate_path( + const std::string& base_file_name); + + static std::string get_failed_to_open_message( + const std::string& file_name, + bool is_open); // Checks if there is enough data for reading in the I/O buffer. From 605bb4b4df20ab4814a75263df8d2586d13dba93 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 3 Jul 2016 22:16:00 +0300 Subject: [PATCH 222/445] Implement close method --- shared/qcommon/ojk_sg_archive.cpp | 13 +++++++++---- shared/qcommon/ojk_sg_archive_fwd.h | 6 ------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/shared/qcommon/ojk_sg_archive.cpp b/shared/qcommon/ojk_sg_archive.cpp index 224fc57ca1..7bf9a5f22b 100644 --- a/shared/qcommon/ojk_sg_archive.cpp +++ b/shared/qcommon/ojk_sg_archive.cpp @@ -10,8 +10,6 @@ namespace sg { Archive::Archive() : archive_mode_(), - paths_(get_max_path_count()), - path_index_(), file_handle_(), io_buffer_(), io_buffer_offset_() @@ -92,8 +90,15 @@ bool Archive::create( void Archive::close() { - throw ArchiveException( - "Not implemented."); + archive_mode_ = ArchiveMode::none; + + if (file_handle_ != 0) { + ::FS_FCloseFile(file_handle_); + file_handle_ = 0; + } + + io_buffer_.clear(); + io_buffer_offset_ = 0; } void Archive::read_chunk( diff --git a/shared/qcommon/ojk_sg_archive_fwd.h b/shared/qcommon/ojk_sg_archive_fwd.h index 5cd35023f0..5c6a3f3dfe 100644 --- a/shared/qcommon/ojk_sg_archive_fwd.h +++ b/shared/qcommon/ojk_sg_archive_fwd.h @@ -152,12 +152,6 @@ class Archive // An archive mode. ArchiveMode archive_mode_; - // Saved game paths. - Paths paths_; - - // Current path index. - int path_index_; - // A handle to a file. int32_t file_handle_; From a25382f2119f79c2564db0e8eaf601cf3844c57c Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 3 Jul 2016 22:16:56 +0300 Subject: [PATCH 223/445] Remove get_max_path_count --- shared/qcommon/ojk_sg_archive.cpp | 5 ----- shared/qcommon/ojk_sg_archive_fwd.h | 3 --- 2 files changed, 8 deletions(-) diff --git a/shared/qcommon/ojk_sg_archive.cpp b/shared/qcommon/ojk_sg_archive.cpp index 7bf9a5f22b..24c32678a1 100644 --- a/shared/qcommon/ojk_sg_archive.cpp +++ b/shared/qcommon/ojk_sg_archive.cpp @@ -136,11 +136,6 @@ Archive& Archive::get_instance() return result; } -int Archive::get_max_path_count() -{ - return 8; -} - void Archive::validate_archive_mode( ArchiveMode archive_mode) { diff --git a/shared/qcommon/ojk_sg_archive_fwd.h b/shared/qcommon/ojk_sg_archive_fwd.h index 5c6a3f3dfe..cf7b11d65e 100644 --- a/shared/qcommon/ojk_sg_archive_fwd.h +++ b/shared/qcommon/ojk_sg_archive_fwd.h @@ -162,9 +162,6 @@ class Archive BufferOffset io_buffer_offset_; - static constexpr int get_max_path_count(); - - void validate_archive_mode( ArchiveMode archive_mode); From 4f9f1ceda1b23c9b0ddd3668ee165436e89fbd8e Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 3 Jul 2016 22:21:55 +0300 Subject: [PATCH 224/445] Revise method open --- shared/qcommon/ojk_sg_archive.cpp | 34 ++++++++++++++++++++--------- shared/qcommon/ojk_sg_archive_fwd.h | 1 + 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/shared/qcommon/ojk_sg_archive.cpp b/shared/qcommon/ojk_sg_archive.cpp index 24c32678a1..b2664905da 100644 --- a/shared/qcommon/ojk_sg_archive.cpp +++ b/shared/qcommon/ojk_sg_archive.cpp @@ -43,6 +43,7 @@ bool Archive::open( is_succeed = false; auto error_message = get_failed_to_open_message( + archive_mode, file_path, true); @@ -167,21 +168,34 @@ std::string Archive::generate_path( } std::string Archive::get_failed_to_open_message( + ArchiveMode archive_mode, const std::string& file_name, bool is_open) { constexpr int max_length = 256; - auto message_id = - is_open ? -#ifdef JK2_MODE - "MENUS3_FAILED_TO_OPEN_SAVEGAME" : - "MENUS3_FAILED_TO_CREATE_SAVEGAME" -#else - "MENUS_FAILED_TO_OPEN_SAVEGAME" : - "MENUS3_FAILED_TO_CREATE_SAVEGAME" -#endif - ; + const char* message_id = nullptr; + + switch (archive_mode) { + case ArchiveMode::jedi_outcast: + if (is_open) { + message_id = "MENUS3_FAILED_TO_OPEN_SAVEGAME"; + } else { + message_id = "MENUS3_FAILED_TO_CREATE_SAVEGAME"; + } + break; + + case ArchiveMode::jedi_academy: + if (is_open) { + message_id = "MENUS_FAILED_TO_OPEN_SAVEGAME"; + } else { + message_id = "MENUS3_FAILED_TO_CREATE_SAVEGAME"; + } + break; + + default: + break; + } std::string result( S_COLOR_RED); diff --git a/shared/qcommon/ojk_sg_archive_fwd.h b/shared/qcommon/ojk_sg_archive_fwd.h index cf7b11d65e..e23e553513 100644 --- a/shared/qcommon/ojk_sg_archive_fwd.h +++ b/shared/qcommon/ojk_sg_archive_fwd.h @@ -169,6 +169,7 @@ class Archive const std::string& base_file_name); static std::string get_failed_to_open_message( + ArchiveMode archive_mode, const std::string& file_name, bool is_open); From 83c056dacd2ad85bd15f63af6e53ed751263243a Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 3 Jul 2016 22:31:00 +0300 Subject: [PATCH 225/445] Implement method create --- shared/qcommon/ojk_sg_archive.cpp | 36 +++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/shared/qcommon/ojk_sg_archive.cpp b/shared/qcommon/ojk_sg_archive.cpp index b2664905da..0e6a07b03c 100644 --- a/shared/qcommon/ojk_sg_archive.cpp +++ b/shared/qcommon/ojk_sg_archive.cpp @@ -85,8 +85,40 @@ bool Archive::create( ArchiveMode archive_mode, const std::string& base_file_name) { - throw ArchiveException( - "Not implemented."); + validate_archive_mode( + archive_mode); + + remove( + base_file_name); + + auto path = generate_path( + base_file_name); + + file_handle_ = ::FS_FOpenFileWrite( + path.c_str()); + + if (file_handle_ == 0) { + auto error_message = get_failed_to_open_message( + archive_mode, + path, + false); + + ::Com_Printf( + "%s\n", + error_message.c_str()); + + return false; + } + + archive_mode_ = archive_mode; + + int sg_version = iSAVEGAME_VERSION; + + write_chunk( + INT_ID('_', 'V', 'E', 'R'), + sg_version); + + return true; } void Archive::close() From 92c27accf1ddd506043ab2bd7fe44f8ae853ebad Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 3 Jul 2016 22:58:48 +0300 Subject: [PATCH 226/445] Remove archive mode --- shared/qcommon/ojk_sg_archive.cpp | 66 +++++------------------------ shared/qcommon/ojk_sg_archive_fwd.h | 16 ------- 2 files changed, 11 insertions(+), 71 deletions(-) diff --git a/shared/qcommon/ojk_sg_archive.cpp b/shared/qcommon/ojk_sg_archive.cpp index 0e6a07b03c..6edbd9dabc 100644 --- a/shared/qcommon/ojk_sg_archive.cpp +++ b/shared/qcommon/ojk_sg_archive.cpp @@ -9,7 +9,6 @@ namespace sg { Archive::Archive() : - archive_mode_(), file_handle_(), io_buffer_(), io_buffer_offset_() @@ -22,12 +21,8 @@ Archive::~Archive() } bool Archive::open( - ArchiveMode archive_mode, const std::string& base_file_name) { - validate_archive_mode( - archive_mode); - auto&& file_path = generate_path( base_file_name); @@ -43,7 +38,6 @@ bool Archive::open( is_succeed = false; auto error_message = get_failed_to_open_message( - archive_mode, file_path, true); @@ -72,9 +66,7 @@ bool Archive::open( } } - if (is_succeed) { - archive_mode_ = archive_mode; - } else { + if (!is_succeed) { close(); } @@ -82,12 +74,8 @@ bool Archive::open( } bool Archive::create( - ArchiveMode archive_mode, const std::string& base_file_name) { - validate_archive_mode( - archive_mode); - remove( base_file_name); @@ -99,7 +87,6 @@ bool Archive::create( if (file_handle_ == 0) { auto error_message = get_failed_to_open_message( - archive_mode, path, false); @@ -110,8 +97,6 @@ bool Archive::create( return false; } - archive_mode_ = archive_mode; - int sg_version = iSAVEGAME_VERSION; write_chunk( @@ -123,8 +108,6 @@ bool Archive::create( void Archive::close() { - archive_mode_ = ArchiveMode::none; - if (file_handle_ != 0) { ::FS_FCloseFile(file_handle_); file_handle_ = 0; @@ -169,20 +152,6 @@ Archive& Archive::get_instance() return result; } -void Archive::validate_archive_mode( - ArchiveMode archive_mode) -{ - switch (archive_mode) { - case ArchiveMode::jedi_academy: - case ArchiveMode::jedi_outcast: - break; - - default: - throw ArchiveException( - "Invalid mode."); - } -} - std::string Archive::generate_path( const std::string& base_file_name) { @@ -200,34 +169,21 @@ std::string Archive::generate_path( } std::string Archive::get_failed_to_open_message( - ArchiveMode archive_mode, const std::string& file_name, bool is_open) { constexpr int max_length = 256; - const char* message_id = nullptr; - - switch (archive_mode) { - case ArchiveMode::jedi_outcast: - if (is_open) { - message_id = "MENUS3_FAILED_TO_OPEN_SAVEGAME"; - } else { - message_id = "MENUS3_FAILED_TO_CREATE_SAVEGAME"; - } - break; - - case ArchiveMode::jedi_academy: - if (is_open) { - message_id = "MENUS_FAILED_TO_OPEN_SAVEGAME"; - } else { - message_id = "MENUS3_FAILED_TO_CREATE_SAVEGAME"; - } - break; - - default: - break; - } + auto message_id = + is_open ? +#if JK2_MODE + "MENUS3_FAILED_TO_OPEN_SAVEGAME" : + "MENUS3_FAILED_TO_CREATE_SAVEGAME" +#else + "MENUS_FAILED_TO_OPEN_SAVEGAME" : + "MENUS3_FAILED_TO_CREATE_SAVEGAME" +#endif + ; std::string result( S_COLOR_RED); diff --git a/shared/qcommon/ojk_sg_archive_fwd.h b/shared/qcommon/ojk_sg_archive_fwd.h index e23e553513..94da627100 100644 --- a/shared/qcommon/ojk_sg_archive_fwd.h +++ b/shared/qcommon/ojk_sg_archive_fwd.h @@ -18,13 +18,6 @@ namespace ojk { namespace sg { -enum class ArchiveMode { - none, - jedi_outcast, - jedi_academy, -}; // ArchiveMode - - class Archive { public: @@ -44,12 +37,10 @@ class Archive // Creates a new saved game file for writing. bool create( - ArchiveMode archive_mode, const std::string& base_file_name); // Opens an existing saved game file for reading. bool open( - ArchiveMode archive_mode, const std::string& base_file_name); // Closes the current saved game file. @@ -149,9 +140,6 @@ class Archive class CastTag { public: }; - // An archive mode. - ArchiveMode archive_mode_; - // A handle to a file. int32_t file_handle_; @@ -162,14 +150,10 @@ class Archive BufferOffset io_buffer_offset_; - void validate_archive_mode( - ArchiveMode archive_mode); - static std::string generate_path( const std::string& base_file_name); static std::string get_failed_to_open_message( - ArchiveMode archive_mode, const std::string& file_name, bool is_open); From 95c4ceb7f5f0fa92114d9365fab5df7d961c1ab5 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 3 Jul 2016 23:26:34 +0300 Subject: [PATCH 227/445] Implement method remove --- shared/qcommon/ojk_sg_archive.cpp | 9 ++++++--- shared/qcommon/ojk_sg_archive_fwd.h | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/shared/qcommon/ojk_sg_archive.cpp b/shared/qcommon/ojk_sg_archive.cpp index 6edbd9dabc..b65a84ff8f 100644 --- a/shared/qcommon/ojk_sg_archive.cpp +++ b/shared/qcommon/ojk_sg_archive.cpp @@ -140,10 +140,13 @@ void Archive::rename( } void Archive::remove( - const std::string& file_path) + const std::string& base_file_name) { - throw ArchiveException( - "Not implemented."); + auto path = generate_path( + base_file_name); + + ::FS_DeleteUserGenFile( + path.c_str()); } Archive& Archive::get_instance() diff --git a/shared/qcommon/ojk_sg_archive_fwd.h b/shared/qcommon/ojk_sg_archive_fwd.h index 94da627100..98fe193785 100644 --- a/shared/qcommon/ojk_sg_archive_fwd.h +++ b/shared/qcommon/ojk_sg_archive_fwd.h @@ -118,7 +118,7 @@ class Archive // Remove a saved game file. static void remove( - const std::string& file_path); + const std::string& base_file_name); // Returns a default instance of the class. static Archive& get_instance(); From 6e49a952dc1ab27964b275b1ee9a1f3ca73499ba Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 3 Jul 2016 23:34:08 +0300 Subject: [PATCH 228/445] Implement method rename --- shared/qcommon/ojk_sg_archive.cpp | 21 +++++++++++++++++---- shared/qcommon/ojk_sg_archive_fwd.h | 4 ++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/shared/qcommon/ojk_sg_archive.cpp b/shared/qcommon/ojk_sg_archive.cpp index b65a84ff8f..6e33274756 100644 --- a/shared/qcommon/ojk_sg_archive.cpp +++ b/shared/qcommon/ojk_sg_archive.cpp @@ -132,11 +132,24 @@ void Archive::write_chunk( } void Archive::rename( - const std::string& old_file_path, - const std::string& new_file_path) + const std::string& old_base_file_name, + const std::string& new_base_file_name) { - throw ArchiveException( - "Not implemented."); + auto old_path = generate_path( + old_base_file_name); + + auto new_path = generate_path( + new_base_file_name); + + auto rename_result = ::FS_MoveUserGenFile( + old_path.c_str(), + new_path.c_str()); + + if (rename_result != 0) { + ::Com_Printf( + S_COLOR_RED "Error during savegame-rename. Check \"%s\" for write-protect or disk full!\n", + new_path.c_str()); + } } void Archive::remove( diff --git a/shared/qcommon/ojk_sg_archive_fwd.h b/shared/qcommon/ojk_sg_archive_fwd.h index 98fe193785..574bb63753 100644 --- a/shared/qcommon/ojk_sg_archive_fwd.h +++ b/shared/qcommon/ojk_sg_archive_fwd.h @@ -113,8 +113,8 @@ class Archive // Renames a saved game file. static void rename( - const std::string& old_file_path, - const std::string& new_file_path); + const std::string& old_base_file_name, + const std::string& new_base_file_name); // Remove a saved game file. static void remove( From 5ce400adcc221d589d39048c9223a98d15c510f6 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 3 Jul 2016 23:37:17 +0300 Subject: [PATCH 229/445] Fix cast_io_buffer usage --- shared/qcommon/ojk_sg_archive.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shared/qcommon/ojk_sg_archive.h b/shared/qcommon/ojk_sg_archive.h index 64ec1fb01e..d18ac036ef 100644 --- a/shared/qcommon/ojk_sg_archive.h +++ b/shared/qcommon/ojk_sg_archive.h @@ -58,7 +58,7 @@ void Archive::accomodate_io_buffer( template T Archive::cast_io_buffer() { - return reinterpret_cast(&io_buffer_[io_buffer_offset_]); + return reinterpret_cast(io_buffer_[io_buffer_offset_]); } template @@ -340,7 +340,7 @@ void Archive::read( dst_count); std::uninitialized_copy_n( - cast_io_buffer(), + &cast_io_buffer(), dst_count, dst_values); @@ -544,7 +544,7 @@ void Archive::write( std::uninitialized_copy_n( src_values, src_count, - cast_io_buffer()); + &cast_io_buffer()); // FIXME Byte order // From 118d42b863835270c2f6ad467a3775e14637d4bb Mon Sep 17 00:00:00 2001 From: dusty22 Date: Mon, 4 Jul 2016 08:39:45 -0400 Subject: [PATCH 230/445] test changes on other machine --- CHANGELOG.txt | 366 +++++++++---------------------- code/cgame/cg_players.cpp | 19 +- code/game/AI_BobaFett.cpp | 8 +- code/game/AI_Jedi.cpp | 119 +++++++--- code/game/AI_Seeker.cpp | 39 ++-- code/game/AI_Stormtrooper.cpp | 16 +- code/game/NPC.cpp | 4 +- code/game/NPC_combat.cpp | 5 +- code/game/NPC_move.cpp | 2 + code/game/NPC_reactions.cpp | 5 +- code/game/NPC_spawn.cpp | 175 +++++++++------ code/game/NPC_stats.cpp | 261 +++++++++++++++++++++- code/game/NPC_utils.cpp | 10 +- code/game/Q3_Interface.cpp | 2 +- code/game/b_public.h | 11 +- code/game/bg_pmove.cpp | 39 ++-- code/game/g_active.cpp | 32 ++- code/game/g_client.cpp | 9 +- code/game/g_combat.cpp | 51 ++++- code/game/g_local.h | 9 + code/game/g_missile.cpp | 11 +- code/game/g_shared.h | 14 +- code/game/g_trigger.cpp | 3 +- code/game/g_weaponLoad.cpp | 21 +- code/game/teams.h | 3 + code/game/weapons.h | 43 ++-- code/game/wp_atst.cpp | 4 + code/game/wp_blaster_pistol.cpp | 5 + code/game/wp_blaster_rifle.cpp | 12 +- code/game/wp_bowcaster.cpp | 6 +- code/game/wp_concussion.cpp | 6 +- code/game/wp_demp2.cpp | 2 + code/game/wp_disruptor.cpp | 9 +- code/game/wp_melee.cpp | 11 +- code/game/wp_noghri_stick.cpp | 13 +- code/game/wp_repeater.cpp | 10 +- code/game/wp_rocket_launcher.cpp | 6 +- code/game/wp_saber.cpp | 149 ++++++++----- code/game/wp_thermal.cpp | 14 +- code/game/wp_tusken.cpp | 5 + 40 files changed, 996 insertions(+), 533 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index bfc07ae99b..40c8892665 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,278 +1,114 @@ -(Dusty's Patch changelog) -cvars to-do: -separate cvars into global and savegame versions, have global take priority? -camera cvars? -cvars for force push blur effects? +New Cvars +------------------------------------------------------------------------------------------------------------------------------ +g_autoRoll* - default is 1, if 1 default JA behavior, if 0 you have to be holding USE to roll +g_char_forcePowerMax* - requires level restart, controls number of player force points +g_char_forceRegen* - requires level restart, controls force point regen rate of player +g_char_parryBonus* - same as .sab file setting but applied on savegame load for player +g_char_breakParryBonus* - same as .sab file setting but applied on game load for player +g_handicap* - can go up to 200 now +g_saberDamageScale* - this scales saber damage, and is saved with your savegame. This effect stacks on top of the effect caused by g_saberMoreRealistic. +g_saberDeflectAutoAim* - if 0, blaster deflections are not auto-aimed but go in the direction of the crosshair with randomness +based on Saber Defense level +g_saberForceDrains - if 1 special moves drain the amount of FP from the next cvar, katas not affected +g_saberForceDrainAmount - if g_saberForceDrains is 1, special moves drain this amount of FP, katas not affected +g_saberLockSuperBreaks* - if 1 default JA behavior of saber locks, if 0 no super breaks (1-hit KOs) ever happen after saber locks +g_saberMoreRealistic* - no longer write-protected +g_weaponVelocity*, g_weaponAltVelocity* - use this to multiply the speed of most projectiles -increased modability: -- separate lightning block effect into own .efx file -- external file for controlling force push/pull/absorb/protect effects -- Class_Wookiee, Class_Cultist -- weapons.dat stuff (npcDamageMult, npcSpeedMult) -- alt-fire field works for .npc files? -- other .npc fields: -fastPunches, kicks, freeMovement, aggression = punching... -- - -other: -- kick knockdown based on hit location -- better Jedi AI -- NPCs avoid walls and cliffs -- better saber throws, strong force push +Gameplay mechanics +------------------------------------------------------------------------------------------------------------------------------ +Force powers (activated with g_forceNewPowers 1) +------------------------------------------------------------------------------------------------------------------------------ +- Force Jump height for all levels increased by 25% +- Force Pull level 1 pulls weapons only, level 2 can knockdown, level 3 can pull toward you a little bit +- ***Force Sense gives limited snipershot dodging ability (you might need to hold down Use) +- Force Speed decreases FP cost of sniper shot dodging at Level 3 (for auto-dodging anyway) +- **Force Protect 1/2/3 gives only 10/20/40% damage reduction against saber attacks instead of 25/50/75% +- Force Heal costs slightly fewer force points at Level 3 if I remember correctly -Test: -- cultist punch delay -- gran punch decisions vs. saber wielder -- npc surrender -- lightning block effect -- force protect saber damage -- faster non-heavy punches +NPC AI +------------------------------------------------------------------------------------------------------------------------------ +Jedi AI changes... +- Improvements to AI governing use of JA-exclusive abilities and powers... +only use Force Rage if close to the player and if have > 25% HP, only kick if close to the player, +only use saber attack katas if close to the player +- NPC Jedi recover from knockdown very fast on high difficulties (no easy marios for the win) +- NPC Jedi re-activate their sabers faster after being gripped or drained based on difficulty and NPC rank +- NPC Jedi will try very hard to dodge your attacks if you knock their saber throw to the ground (before they were more apt to just stand there) +- Light Jedi with non-dark Jedi AI (class_reborn, class_desann, etc.) classes don't attack surrendered or unarmed enemies +- Force Cultists react properly to explosives/sniper shots/saber throws +- Force Cultists punch sometimes +- Non-saber NPCs with Class_Reborn try extra hard to dodge saber attacks +- Non-saber NPCs with Class_Reborn cannot cartwheel without Force Jump 1 ------------------------------------------------------------------------ -Only larger/more important changes recorded here: -new cvars: -g_autoRoll - been there for a while, now works 100% correctly, if 1 -default JA behavior, if 0 you have to be holding USE to roll -g_char_forcePowerMax - requires level restart, like the NPC setting but for the player -g_char_forceRegen - requires level restart, like NPC setting but for player -g_char_parryBonus - like the .sab file setting but applied on game load for player -g_char_breakParryBonus - like the .sab file setting but applied on game load for player -all these affect the player's stats -g_handicap - goes up to 200 now -g_saberDamageScale - this scales saber damage, and is saved with your savegame -g_saberForceDrains - if 1 special moves drain the amount of FP from the -next cvar, katas not affected -g_saberForceDrainAmount - if g_saberForceDrains is 1, special moves -drain this amount of FP, katas not affected -g_saberLockSuperBreaks - if 1 default JA behavior of saber locks, if 0 -no super breaks (1-hit KOs) ever happen after saber locks -g_saberLockStyle - dummy cvar. Later maybe make it so superbreaks happen -under certain conditions -g_saberMoreRealistic - no longer write-protected -g_weaponVelocity, g_weaponAltVelocity - use this to multiply the speed of most projectiles +General NPC AI changes... +- **Grenadier Grans will still try punching sometimes even if your saber is drawn +- **NPCs surrender more like JK2 (more consistent, once they decide to surrender they will usually stay surrendered) +- Allied NPCs receive 150%/125%/100% HP for Padawan/Jedi/Jedi Knight difficulties now instead of 100%/125%/150% like enemies +- Assassin Droids now fire while shielded +- Class_Rodian/Class Imperial at commander rank use alt-fire with WP_BLASTER -Gameplay mechanics - -Force powers -- (with g_forceNewPowers 1) -- Force Jump height for all levels increased by 25% -- Force Pull level 1 pulls weapons only, level 2 can knockdown, level 3 can pull toward you somewhat -- Force Sense gives limited snipershot dodging ability -- Force Speed decreases cost of sniper shot dodging at Level 3 -- Force Protect 1/2/3 gives only 10/20/40% damage reduction against saber attacks instead of 25/50/75% -NPC AI -- -- Improvements to NPC AI pertaining to the use of JA-exclusive abilities; -NPCs only use Force Rage if close to the player and if have > 25% HP, only kick if close to the player, -only use katas if close to the player -- NPC Jedi will try very hard to dodge your attacks if you knock their saber throw to the ground -- NPC Jedi get up much more quickly on higher difficulties (no easy marios for the win) -- NPC Jedi will activate their saber very quickly after being gripped or drained based on difficulty and rank -- Force Cultists react properly to explosives, sniper shots, and saber throws now -- Non-saber wielding NPCs with Class_Reborn try extra hard to dodge saber attacks and throws (because they can't block) -- Light Jedi with non-dark Jedi AI (class_reborn, class_desann, etc.) classes don't attack surrendered or unarmed enemies now -- Grenadier Grans will alternate punches/thermal detonators even if your saber is out if you are really close to -them. -- NPCs surrender better... (to-do) -NPC other -- -- Allied NPCs receive 150%/125%/100% HP for Padawan/Jedi/Jedi Knight difficulties now instead of 100/125/150 like enemy -npcs -- Assassin Droids now fire even with their shields up -- Class_Rodian with E11 and Class_Imperial at commander rank use alt-fire now always - +Saber System (activated with g_saberNewCombat 1) +------------------------------------------------------------------------------------------------------------------------------ +- Saber Offense gives a base "attack power" (AP) (+2/+4/+6) +- Saber Defense gives a base "defense power" (DP) (+2/+4/+6) and a number of block points (BP, is equal to 1 + your SD level IIRC) +- "attack power" is modified by saber style (-2/0/+2/-1/+1/-1/+1 for Fast/Med/Strong/Duals/Staff/Tavion/Desann) +- Desann style is as strong as Red if you are CLASS_DESANN, otherwise it does not cause knockdown as often as Red, and is slightly +weaker +- style attack chaining altered: +can only chain 2 slashes if running, staff and duals cannot chain infinitely (5 slash maximum now), chain counts are also not +random (Medium can always chain 5 slashes while walking for example) -Saber System: *(with g_saberNewCombat 1) -* saber offense and defense increase your offense and defensive strength in parries: - - offense controls your power level (+2/4/6), and is modified by saber style (-2/0/+2/-1/+1/-1/+1 for fast/med/strong/duals - /staff/tavion/desann), defense controls your defense strength (+2/4/6, not affected by saber style) - - if an attack powerlevel is greater than defense strength, you can still block it but you lose some block points - - if you lose enough block points, your guard is crushed; block points regenerate while walking/standing still and not attacking - - special attacks don't drain block points but either break through completely or are blocked partially -* red/strong can be blocked now, but is faster and less unwieldy (and more realistic I think) -* staff and duals cannot chain +How saber combat then works: +- AP > DP = attack blocked but lose a number of BP equivalent to AP - DP +- all BP lost = guard crushed +- BPs regenerate about 1 per second if walking/standing still (total BP = your Saber Def. level + 1 if I remember correctly) +- special attacks ignore BP: either crush guard or are blocked partially -- at higher difficulties, blaster bolts are deflected in the direction of the crosshair instead of being auto-aimed -- your ability to parry saber attacks (TO DO) and deflect blaster fire is slightly improved while walking/standing still -- you do a full slash even if starting with your saber off -- TO DO -- Desann style is full strength if you are CLASS_DESANN, otherwise it is a cross between medium/strong -(it has the same power level as staff, and can knock down enemies but is unlikely to) -- attack chain amounts tweaked slightly, not random now (not completely), can only chain 2 slashes if running, -staff and duals cannot chain infinitely (5 slash maximum now) -- staff power is nerfed so it is not as strong as strong style now, but slightly more powerful than medium -- staff sabers are now thrown double-bladed +Other saber-related changes +- player's ability to parry saber attacks and blaster fire is improved while walking or standing still for Medium and Strong +styles +- Saber Defense 0 cannot block blaster fire (or was it just a super narrow arc? can't remember...) +- A saber with autoblocking 0 now has a narrow blocking arc for the player (so you can't cheat and block super easy) +- Holding Use and standing still will let you try to manual block blaster bolts as it currently does in Base JA, however the arc is super narrow -Melee changes: -- Player gets a weaker version of melee katas now based on saber offense level (1 - punches and kicks, 2 - katas, 3 - spin kicks) -- Player melee katas have less range, must be aimed more precisely, and do not work on certain types of enemies -- Spin kicks and the like are enabled for Saber Offense 3 and do slightly more damage -- Can do spin kicks on demand by holding Use and pressing the kick button, however this costs Force power -- kicks knocking down an enemy jedi depends on your saber offense vs. their saber defense -- Player punches do 7/5 damage now instead of 6/3 and aren't randomized now -- Force Speed punching is more consistent now and less cheap -- test -- Heavy melee is specifically associated with Chewbacca, Class_Gran, and Class_Trandoshan, other NPC types will punch -more quickly but weaker if given WP_MELEE -- test & fix - -Other additions - -- Save games allow for screenshots now like JK2 -- fix -- Visual effect for blocking Force Lightning with your lightsaber -- handicap can go up to 200 -- r_dynamicglowintensity cvar is saved and written to jaconfig now -- rolls and acrobatics are possible in 1st person view +Melee changes +-------------------------------------------------------------------------------------------------------------------------------- +- Player can use kicks with any saber type by default, you must use +forcefocus to saberthrow (bind this to a key, maybe your mousewheel click-down) +- Player's melee abilities determined by Saber Offense level (1 = punches and kicks, 2 = katas, 3 = spin kicks) +- if you're not cheating (using g_debugMelee or iknowkungfu)... Player melee katas have less range, must be aimed more precisely, and do not work on certain types of enemies +- Spin/Flip kicks are only enabled for Saber Offense 3 but do slightly more damage +- Spin Kicks are possible on demand by holding Use and pressing the Alt Attack button, however costs 10 FP (the auto version doesn't cost any) +- **Knockdown to Jedi happens only if your Saber Offense >= their Saber Defense +- Player punches do 7/5 damage now instead of 6/3 and aren't randomized +- **Force Speed punching is more consistent now and less cheap (never did actually test) +- **Heavy/Slow Melee punching is specifically associated with Chewbacca, Class_Gran, and Class_Trandoshan, other NPC types will punch +more quickly but weakly if given WP_MELEE +Other additions +---------------------------------------------------------------------------------------------------------------------------- +- visual effect for blocking Force Lightning with your lightsaber (it's subtle but there, it just plays a reverse-direction version of the Lightning level 1 effect, will make this a separate file) +- rolls and acrobatics are possible in 1st Person now +Future ideas +---------------------------------------------------------------------------------------------------------------------------- Things to do - -- Savegame screenshots working in the loading screen - got broken -- handicap cvar going past 100, separate cvar for player HP and Shields - partial done -- Reborn masters with constant saber throwing + lightning -- NPCs avoid cliffs? -- not able -- NPCDamageMult, NPCAltDamageMult, saber ignition/deignition time fields in weapons.dat -- Force push strong version, mindtrick changes - not done -- Doing a full slash when starting saber off - not done -- camera controls (1st, 2nd, 3rd, 4th person) -- Fix NPCs surrendering +- *savegame screenshots +- *separate cvar for player HP and Shields +- reborn masters with debounce to limit constant saber throwing + lightning +- *NPCs avoid cliffs +- *extra fields in Weapons.dat such as NPCDamageMult, NPCAltDamageMult, saber ignition/deignition time +- force push strong version, mindtrick changes +- doing a full slash when starting saber off regardless of movement +- *camera controls (1st, 2nd, 3rd, 4th person) +- better AI for NPCs deciding to surrender + +- balance staff and duals blocking +- finish new NPC fields +- make sure saber stats save correctly -------------------------------------------------------------------------------------------------------------------------- -(OpenJK changelog) -This file will generally summarise the Github repo commit history -Key: - removed, + added, * modified -[SP/MP] * OpenJK now writes configs/screenshots/etc to fs_homepath directory. No longer have to run as administrator on Windows. (Multi-User support) -[SP] + Now searches for jagamex86.dll in the mod's folder, too, meaning SP Code mods are possible. -[SP/MP] * Increased Command Buffer from 16384 to 128*1024 -[SP/MP] * Increased max cvars from 1224 to 8192 -[MP] * Fixed several parsers that broke with characters which wrapped to being negative. -[SP/MP] + Added mouse-wheel to console -[MP] + Added misc security fixes to allow servers to deal with connectionless packets. -[MP] * Added security fixes to prevent servers from spoofing clients with connect packets. -[MP] * Added security fixes to prevent anyone from spoofing clients with print packets. -[MP] * Fixed clients being able to set IP via cvar. -[MP] * Drastically improved status (server) command -[MP] * Tweaked forcetoggle rcon command. -[SP/MP] + Add r_noborder option (windowed mode feature). -[SP/MP] + Add r_centerWindow option (windowed mode feature). -[SP/MP] + Add r_mode -2 option to use desktop resolution. -[MP] * Dedicated server binaries now correctly print sectioned prints without adding newlines erroneously. -[SP] * Fixed a nasty memory issue with clipboard pasting -[MP] * gamecode: Fixed very bad out of bounds access in G_LogWeaponFire with NPCs. -[MP] + gamecode: Added pmove_float cvar (default off) for no velocity snapping resulting in framerate-dependent jump heights. -[SP] * Fixed MiniHeapSize issue -[SP/MP] * Fixed incorrect alphagen enum usage. -[SP/MP] * Fixed widescreen resolution changes causing black screen when UI restarted. -[SP/MP] * Fixed crash when trying to run custom resolutions with a listen server. -[MP] * Fixed client crash related to ragnos NPC -[SP] * Fixed intro cinematic only displaying as white screen when on non 4:3 aspect ratio. -[MP] * gamecode: Fixes some voting issues relating to clients disconnecting and/or switching teams. -[MP] * gamecode: Fixed some voting issues relating to bad percentage calculation for passing/failing. -[MP] * Fixed some item prediction errors in team games. (Item prediction still sucks in general though) -[SP/MP] * Fixed potential out of bounds in sound code. -[SP] * Fixed buffer overflow in filesystem code which prevented use of some maps (atlantica). Raven made a Com_Error to prevent this from happening, we removed that as well. -[SP] * Rosh no longer randomly dies due to falling damage on the first level. -[SP/MP] * Fixed Gamma Clamp on WinXP+ -[SP/MP] * Fixed weather system incorrectly throwing up a warning with shader data if weather system was unable to parse a vector correctly. -[MP] * Fixed buffer overflow in client side rcon command. -[MP] * Fixes color code stacking in names where colors were supposed to be stripped. (This relates to engine and gamecode for full effect) -[SP/MP] * Windows now uses correct memory status code for > 2gb when checking if low on physical memory. -[MP] * Fixes names that contain * or ** at start incorrectly showing up in notify top box and chat box when sending messages. -[MP] * Server side / viewlog console now strips the [skipnotify] and * properly too. -[MP] + (Un)pausing the game in solo play now results in smoother transition. -[SP/MP] * Tweaks to the cvar code to make it more strict in terms of read only/cheats/init. Fixes a lot of broken rules with cvars. -[MP] + Cheats are now defaulted to 1 in menu. Do not be alarmed, starting normally will disable them or connecting to a non-cheat server. This allows cheats to work properly while playing back demos. -[SP/MP] * Fixed cvar commands that allow you to "cg_thirdPerson !" prevent you from typing out longer strings starting with a ! as the value. -[SP/MP] * FX Flashes now properly scale to fov and window aspect. -[MP] + Add sv_lanForceRate (Defaults to 1) Feature was already enabled, but not toggleable. -[MP] * Timescale frametime fixes. Frametime < 1 is no longer possible (bad things happen) -[MP] * globalservers master server command now supports multiple master servers with the sv_master1..5 cvars -[SP/MP] - MPlayer code removed. -[MP] * Tweaked serverbrowser client engine code. -[MP] * Pure server code cleanups client and server. -[SP/MP] * Fixed a lot of formatting security holes. -[SP/MP] * Several Out-of-bounds memory access and memory leaks fixed. -[MP] + Added fontlist command. Useful for when making mods with custom fonts. -[MP] + New serverside kick commands kickall kickbots and kicknum (alias to clientkick). -[SP/MP] * Improved command line parsing based off of ioquake3 patches. -[SP/MP] * Improved echo command by preserving colors based off of ioquake3 patches. -[SP/MP] * Improved GL_Extensions printing using ioquake3 fix to prevent crashes on newer cards. -[SP/MP] * Removed cheat protection from r_we cmd, r_dynamicGlow* cvars -[MP] * Fixed invalid r_textureBitsLM resulting in fullbright mode without cheats -[SP/MP] - Removed CD Check Code -[MP] - Removed demo restriction code. -[SP/MP] - Removed Anti-Tamper Code. -[SP/MP] - Removed force feedback code -[SP/MP] * Shift-Escape will now also open the console as an alternate (e.g.: keyboard doesn't support the normal console key) -[SP/MP] * Escape key will now close the console before anything else if the console is open -[SP/MP] * Removed shift key requirement to open console -[SP/MP] + Raw Mouse Input added to windows (in_mouse 2). An in_restart required if changed while game is running. -[MP] + gamecode: /clientlist displays clients by id/name and if they are a bot. (Shows real client id unlike serverstatus) -[SP/MP] + Updated the JPG library -[MP] * svsay command prints to dedicated console -[SP/MP] * Alt-tab works properly -[MP] * Cvars will be sorted alphabetically when saved to disk -[MP] + Added ja_guid userinfo field to uniquely track players for statistics -[MP] + gamecode: Added cg_fovAspectAdjust to correct field of view on non-4:3 aspect ratios -[MP] + gamecode: Added cg_fovViewmodel to adjust the field of view for first-person weapons -[SP/MP] * Drastically improved command/cvar tab-completion including auto-completion of arguments (e.g. map mp/ffa1) -[MP] + Added cvar_modified to show which cvars have been changed from default values -[SP] + NPCs support alternate saber colours -[MP] * gamecode: Fixed saber lock crash -[MP] * gamecode: Force updates of clients at a fixed interval to prevent certain exploits. -[MP] * gamecode: Prevent fast teamswitch exploit -[MP] * gamecode: Disable "scoreboard" team -[MP] * gamecode: Fix some looping sound issues -[MP] * gamecode: Fix spectators being stuck when they stop following dead/disintegrated players -[SP] * Fix force absorb capping to 100 instead of maximum force points -[MP] * gamecode: Precache weapons on map_restart if g_weaponDisable changes -[MP] * gamecode: Properly detect server settings (weapon/force disable) -[SP/MP] * Fix Windows issue where pressing alt key in windowed mode caused a temporary freeze -[MP] * gamecode: Optimised .sab parsing and fixed some potential memory corruption -[MP] * gamecode: Filter multiple '@' characters in a name resulting in a localised string lookup (translation) -[MP] + gamecode: Added cg_chatBeep and cg_teamChatBeep to toggle the chat message sound -[MP] * gamecode: Default/missing model+saber is now "kyle" -[MP] * gamecode: Fixed tournament queueing (for duel/power duel) -[MP] * gamecode: Fixed issues where spectators had trouble flying through doors close together -[MP] + gamecode: Added JK2 gametypes -[MP] + Added s_doppler sound effect for moving sound sources (rockets) -[MP] * gamecode: Fix cg_smoothClients affecting local player negatively -[MP] * gamecode: Rewrote callvote code to allow disabling specific votes, added more options (e.g. display map list) -[MP] + gamecode: Add server command toggleallowvote to easily adjust the bit values of g_allowVote -[MP] + gamecode: Add userinfo validation options (g_userinfoValidate) -[MP] + gamecode: Add server command toggleuserinfovalidation to easily adjust the bit values of g_userinfoValidate -[SP] + gamecode: Added cg_smoothCamera (default 1) -[SP] + gamecode: Added cg_dynamicCrosshair (default 1) -[MP] + Added support for surfaceSprites flattened in MP. (Fixes surface sprites on t2_trip) -[SP/MP] * Fixed never fading shadow in text -[SP] * MAX_SHADER_FILES bumped to 4096 from 1024 to match MP -[MP] + Added in-engine ban code from ioquake3. Cmds: sv_rehashbans, sv_listbans, sv_banaddr, sv_exceptaddr, sv_bandel, sv_exceptdel, sv_flushbans. CVar: sv_banFile -[SP/MP] * Fix up font renderer glyph positioning -[MP] + addFavorite -[SP/MP] * gamecode: Fixed overstrike mode when using any UI edit box -[SP/MP] * gamecode: Fix crash when standing on an NPC who has been knocked down -[MP] + gamecode: fx_wind entity -[MP] * gamecode: fx_rain entity supports most options from SP now. LIGHTNING/shaking not supported, acidrain doesn't actually hurt -[MP] * gamecode: more customRGBA options from SP on NPCs -[MP] + engine/gamecode: Force Sight surfaces (cgame modification required) -[MP] + gamecode: Human Merc NPC spawner -[SP/MP] * Fixed a hang with some weird music sample rates -[SP/MP] * Fixed a crash at startup when r_dynamicGlow was set to 2 -[SP] * Fix some invalid chunk length errors on x86_64 platforms -[SP/MP] + Clipboard paste support added to the platforms which use SDL2 -[MP] + Add ability to paste in text files in the UI -[SP/MP] * Refactor binds code in the UI -[SP/MP] * Fix Out-Of-Bounds access in CM_EdgePlaneNum -[SP/MP] * Clamp scr_conspeed to be in the range 1-100 -[MP] * gamecode: Make target_location entities logical (no gentity space used in most cases) -[SP/MP] - Removed RMG code -[SP] * Fallback location for jagame mod bin is now OpenJK instead of base -[MP] + Add cl_motdServer1..5 cvars. cl_motd points to which one is used or 0 to turn off -[MP] + Add QuakeLive style mouse accel option (cl_mouseAccelStyle, cl_mouseAccelOffset) -[MP] * gamecode: Fix 2d screen tints with some effects being too dark (protect/abosrb/rage/ysalamiri/inlava/inwater/inslime) -[MP] + gamecode: Filter out servers with invalid chars in their information from the browser (ui_browserFilterInvalidInfo) -[MP] + gamecode: UI now supports multiple master servers -[MP] + Server side demo recording per client (from their pov) support -[MP] * CVar code in engine is more robust. Protects against clients setting systeminfo cvars they should not etc. More accurate warning messages when servers/vms/clients set cvars they should not. -[SP] + Add modelscale and modelscale_vec support to misc_model_ghoul -[MP] * gamecode: Fix teamoverlay not making you look dead in siege when in limbo -[MP] + Add sv_blockJumpSelect cvar to help prevent use of modded clients using an exploit with FP_LEVITATION with old mods -[MP] * Fix exploit with usercmd bytes set to -128 -[SP/MP] + Add stopmusic command -[SP] * Fix external lightmap support -[MP] + Add external lightmap support from SP -[SP/MP] * General buffer safety cleanup -[SP/MP] * Fix stencil shadows not working if a model has more than 500 vertexes. +* would like to implement into OpenJK +** not completely tested but should work +*** incomplete/unfinished/not working completely \ No newline at end of file diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index d0514748e9..c1a300e466 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -977,6 +977,7 @@ static void CG_PlayerAnimEventDo( centity_t *cent, animevent_t *animEvent ) const int holdSnd = animEvent->eventData[ AED_SOUNDINDEX_START+Q_irand( 0, animEvent->eventData[AED_SOUND_NUMRANDOMSNDS] ) ]; if ( holdSnd > 0 ) { + if (cgs.sound_precache[holdSnd]) if ( cgs.sound_precache[ holdSnd ] ) { cgi_S_StartSound( NULL, cent->currentState.clientNum, channel, cgs.sound_precache[holdSnd ] ); @@ -984,6 +985,20 @@ static void CG_PlayerAnimEventDo( centity_t *cent, animevent_t *animEvent ) else {//try a custom sound const char *s = CG_ConfigString( CS_SOUNDS + holdSnd ); + + if (cent->gent && cent->gent->client) + { + if (cent->gent->client->ps.torsoAnim == BOTH_KYLE_PA_1 + || cent->gent->client->ps.torsoAnim == BOTH_KYLE_PA_2 + || cent->gent->client->ps.torsoAnim == BOTH_KYLE_PA_3) + { + if (Q_stristr(s, "force") && cent->gent && cent->gent->flags&FL_MELEEKATA_NOFORCEFX) + { + break; //don't play any force power sounds + } + } + } + CG_TryPlayCustomSound(NULL, cent->currentState.clientNum, channel, va("%s.wav",s), CS_TRY_ALL ); } } @@ -2775,12 +2790,12 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) { cent->gent->client->renderInfo.legsYaw = angles[YAW]; } - if ( ((cent->gent->client->ps.eFlags&EF_FORCE_GRIPPED)||((cent->gent->client->NPC_class == CLASS_BOBAFETT||cent->gent->client->NPC_class == CLASS_ROCKETTROOPER)&¢->gent->client->moveType==MT_FLYSWIM)) + if (((cent->gent->client->ps.eFlags&EF_FORCE_GRIPPED) || ((cent->gent->client->NPC_class == CLASS_BOBAFETT || cent->gent->client->NPC_class == CLASS_ROCKETTROOPER || cent->gent->client->NPC_class == CLASS_MANDA) && cent->gent->client->moveType == MT_FLYSWIM)) && cent->gent->client->ps.groundEntityNum == ENTITYNUM_NONE ) { vec3_t centFwd, centRt; float divFactor = 1.0f; - if ( (cent->gent->client->NPC_class == CLASS_BOBAFETT||cent->gent->client->NPC_class == CLASS_ROCKETTROOPER) + if ((cent->gent->client->NPC_class == CLASS_BOBAFETT || cent->gent->client->NPC_class == CLASS_ROCKETTROOPER || cent->gent->client->NPC_class == CLASS_MANDA) && cent->gent->client->moveType == MT_FLYSWIM ) { divFactor = 3.0f; diff --git a/code/game/AI_BobaFett.cpp b/code/game/AI_BobaFett.cpp index 0b50e99e4f..02287e0f9f 100644 --- a/code/game/AI_BobaFett.cpp +++ b/code/game/AI_BobaFett.cpp @@ -296,7 +296,7 @@ void Boba_ChangeWeapon( int wp ) //////////////////////////////////////////////////////////////////////////////////////// qboolean Boba_StopKnockdown( gentity_t *self, gentity_t *pusher, const vec3_t pushDir, qboolean forceKnockdown ) { - if ( self->client->NPC_class != CLASS_BOBAFETT ) + if (self->client->NPC_class != CLASS_BOBAFETT && self->client->NPC_class != CLASS_MANDA && self->client->NPC_class != CLASS_COMMANDO) { return qfalse; } @@ -369,7 +369,7 @@ qboolean Boba_StopKnockdown( gentity_t *self, gentity_t *pusher, const vec3_t pu //////////////////////////////////////////////////////////////////////////////////////// qboolean Boba_Flying( gentity_t *self ) { - assert(self && self->client && self->client->NPC_class==CLASS_BOBAFETT);//self->NPC && + assert(self && self->client && (self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA));//self->NPC && return ((qboolean)(self->client->moveType==MT_FLYSWIM)); } @@ -378,7 +378,7 @@ qboolean Boba_Flying( gentity_t *self ) //////////////////////////////////////////////////////////////////////////////////////// bool Boba_CanSeeEnemy( gentity_t *self ) { - assert(self && self->NPC && self->client && self->client->NPC_class==CLASS_BOBAFETT); + assert(self && self->NPC && self->client && (self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA || self->client->NPC_class == CLASS_COMMANDO)); return ((level.time - self->NPC->enemyLastSeenTime)<1000); } @@ -724,7 +724,7 @@ void Boba_FireDecide( void ) //-------------------------- if (!NPC || // Only NPCs !NPC->client || // Only Clients - NPC->client->NPC_class!=CLASS_BOBAFETT || // Only Boba + (NPC->client->NPC_class != CLASS_BOBAFETT || NPC->client->NPC_class != CLASS_MANDA || NPC->client->NPC_class != CLASS_COMMANDO) || // Only Boba !NPC->enemy || // Only If There Is An Enemy NPC->s.weapon==WP_NONE || // Only If Using A Valid Weapon !TIMER_Done(NPC, "nextAttackDelay") || // Only If Ready To Shoot Again diff --git a/code/game/AI_Jedi.cpp b/code/game/AI_Jedi.cpp index 22f794ee64..1f5bcb389b 100644 --- a/code/game/AI_Jedi.cpp +++ b/code/game/AI_Jedi.cpp @@ -1328,7 +1328,8 @@ void Kyle_TryGrab( void ) qboolean Kyle_CanDoGrab( void ) { - if ( NPC->client->NPC_class == CLASS_KYLE && (NPC->spawnflags&1) ) + if ( (NPC->client->NPC_class == CLASS_KYLE && (NPC->spawnflags&1)) + || NPCInfo->stats.saberMeleeKatas) {//Boss Kyle if ( NPC->enemy && NPC->enemy->client ) {//have a valid enemy @@ -1402,7 +1403,7 @@ static void Jedi_CombatDistance( int enemy_dist ) TIMER_Set( NPC, "attackDelay", Q_irand( 0, 1000 ) ); } - if ( NPC->client->NPC_class == CLASS_BOBAFETT ) + if ( NPC->client->NPC_class == CLASS_BOBAFETT || NPC->client->NPC_class == CLASS_MANDA ) { if ( !TIMER_Done( NPC, "flameTime" ) ) { @@ -2112,6 +2113,10 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in return qfalse; } + if (self->NPC && self->NPC->stats.restrictJediPowers && self->client->ps.forcePowerLevel[FP_SPEED] < 2) { + return qfalse; + } + if ( self->client->ps.groundEntityNum == ENTITYNUM_NONE ) {//can't dodge in mid-air return qfalse; @@ -2250,7 +2255,7 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in {//no fancy dodges when raging or recovering return qfalse; } - if ( self->client->NPC_class == CLASS_BOBAFETT && !Q_irand(0,1)) + if ((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA || self->client->NPC_class == CLASS_COMMANDO) && !Q_irand(0,1)) { return qfalse; // half the time he dodges } @@ -2258,7 +2263,8 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in if ( self->client->NPC_class == CLASS_BOBAFETT || (self->client->NPC_class == CLASS_REBORN && self->s.weapon != WP_SABER) - || self->client->NPC_class == CLASS_ROCKETTROOPER ) + || self->client->NPC_class == CLASS_ROCKETTROOPER + || self->client->NPC_class == CLASS_MANDA) { self->client->ps.forceJumpCharge = 280;//FIXME: calc this intelligently? } @@ -2394,7 +2400,9 @@ evasionType_t Jedi_CheckFlipEvasions( gentity_t *self, float rightdot, float zdi } if ( self->client ) { - if ( self->client->NPC_class == CLASS_BOBAFETT ) + if ((self->client->NPC_class == CLASS_BOBAFETT + || self->client->NPC_class == CLASS_MANDA + || self->client->NPC_class == CLASS_COMMANDO)) {//boba can't flip return EVASION_NONE; } @@ -2474,7 +2482,8 @@ evasionType_t Jedi_CheckFlipEvasions( gentity_t *self, float rightdot, float zdi && Q_irand( 0, 1 ) && !PM_InRoll( &self->client->ps ) && !PM_InKnockDown( &self->client->ps ) - && !PM_SaberInSpecialAttack( self->client->ps.torsoAnim ) ) + && !PM_SaberInSpecialAttack( self->client->ps.torsoAnim ) + && self->NPC->stats.move >= 3) { vec3_t fwd, right, traceto, mins = {self->mins[0],self->mins[1],self->mins[2]+STEPSIZE}, maxs = {self->maxs[0],self->maxs[1],24}, fwdAngles = {0, self->client->ps.viewangles[YAW], 0}; trace_t trace; @@ -2497,8 +2506,9 @@ evasionType_t Jedi_CheckFlipEvasions( gentity_t *self, float rightdot, float zdi allowCartWheels = qfalse; } } - if (self->client->ps.forcePowerLevel[FP_LEVITATION] < FORCE_LEVEL_1) - { //can't do no-handed cartwheels without a bit of force jumping ability + if (self->client->ps.forcePowerLevel[FP_LEVITATION] < FORCE_LEVEL_1 + || self->NPC->stats.move < 4) + { //can't do no-handed cartwheels without a bit of force jumping ability or teh moves allowCartWheels = qfalse; } @@ -2551,8 +2561,10 @@ evasionType_t Jedi_CheckFlipEvasions( gentity_t *self, float rightdot, float zdi self->client->ps.velocity[2] = 200; self->client->ps.forceJumpZStart = self->currentOrigin[2];//so we don't take damage if we land at same height self->client->ps.pm_flags |= PMF_JUMPING; - if ( self->client->NPC_class == CLASS_BOBAFETT - || (self->client->NPC_class == CLASS_REBORN && self->s.weapon != WP_SABER) ) + if (self->client->NPC_class == CLASS_BOBAFETT + || self->client->NPC_class == CLASS_MANDA + || self->client->NPC_class == CLASS_COMMANDO + || (self->client->NPC_class == CLASS_REBORN && self->s.weapon != WP_SABER) ) { G_AddEvent( self, EV_JUMP, 0 ); } @@ -2626,7 +2638,9 @@ evasionType_t Jedi_CheckFlipEvasions( gentity_t *self, float rightdot, float zdi NPC_SetAnim( self, parts, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); self->client->ps.forceJumpZStart = self->currentOrigin[2];//so we don't take damage if we land at same height self->client->ps.pm_flags |= (PMF_JUMPING|PMF_SLOW_MO_FALL); - if ( self->client->NPC_class == CLASS_BOBAFETT + if (self->client->NPC_class == CLASS_BOBAFETT + || self->client->NPC_class == CLASS_MANDA + || self->client->NPC_class == CLASS_COMMANDO || (self->client->NPC_class == CLASS_REBORN && self->s.weapon != WP_SABER)) { G_AddEvent( self, EV_JUMP, 0 ); @@ -2703,7 +2717,9 @@ evasionType_t Jedi_CheckFlipEvasions( gentity_t *self, float rightdot, float zdi NPC_SetAnim( self, parts, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); self->client->ps.forceJumpZStart = self->currentOrigin[2];//so we don't take damage if we land at same height self->client->ps.pm_flags |= (PMF_JUMPING|PMF_SLOW_MO_FALL); - if ( self->client->NPC_class == CLASS_BOBAFETT + if (self->client->NPC_class == CLASS_BOBAFETT + || self->client->NPC_class == CLASS_MANDA + || self->client->NPC_class == CLASS_COMMANDO || (self->client->NPC_class == CLASS_REBORN && self->s.weapon != WP_SABER)) { G_AddEvent( self, EV_JUMP, 0 ); @@ -3103,7 +3119,9 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc qboolean doDodge = qfalse; qboolean alwaysDodgeOrRoll = qfalse; - if ( self->client->NPC_class == CLASS_BOBAFETT ) + if (self->client->NPC_class == CLASS_BOBAFETT + || self->client->NPC_class == CLASS_MANDA + || self->client->NPC_class == CLASS_COMMANDO) { saberBusy = qtrue; doDodge = qtrue; @@ -3122,7 +3140,9 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc || !self->client->ps.SaberActive() || (self->client->NPC_class == CLASS_REBORN && self->s.weapon != WP_SABER) ) {//either it will miss by a bit (and 25% chance) OR our saber is not in-hand OR saber is off - if ( self->NPC && (self->NPC->rank == RANK_CREWMAN || self->NPC->rank >= RANK_LT_JG) ) + if ( self->NPC + && (self->NPC->rank == RANK_CREWMAN || self->NPC->rank >= RANK_LT_JG) + && self->NPC->stats.move >= 3) {//acrobat or fencer or above if ( self->client->ps.groundEntityNum != ENTITYNUM_NONE &&//on the ground !(self->client->ps.pm_flags&PMF_DUCKED)&&cmd->upmove>=0&&TIMER_Done( self, "duck" )//not ducking @@ -3144,9 +3164,10 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc } qboolean doRoll = qfalse; - if ( ( self->client->NPC_class == CLASS_BOBAFETT //boba fett + if ((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA || self->client->NPC_class == CLASS_COMMANDO //boba fett || (self->client->NPC_class == CLASS_REBORN && self->s.weapon != WP_SABER) //non-saber reborn (cultist) ) + && self->NPC->stats.move >= 3 && !Q_irand( 0, 2 ) ) { @@ -3456,7 +3477,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc && self->client->ps.forceRageRecoveryTime < level.time && !(self->client->ps.forcePowersActive&(1<client->NPC_class == CLASS_BOBAFETT + if ( (self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA || self->client->NPC_class == CLASS_COMMANDO || (self->client->NPC_class == CLASS_REBORN && self->s.weapon != WP_SABER) ) && !Q_irand( 0, 1 ) ) @@ -4323,7 +4344,9 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en } else */if ( NPC->client->ps.weaponTime || NPC->client->ps.saberInFlight - || NPC->client->NPC_class == CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_MANDA + || NPC->client->NPC_class == CLASS_COMMANDO || (NPC->client->NPC_class == CLASS_REBORN && NPC->s.weapon != WP_SABER) || NPC->client->NPC_class == CLASS_ROCKETTROOPER ) {//I'm attacking or recovering from a parry, can only try to strafe/jump right now @@ -4450,7 +4473,7 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en if ( !Q_irand( 0, 5 ) || !Jedi_Strafe( 300, 1000, 0, 1000, qfalse ) ) {//certain chance they will pick an alternative evasion //if couldn't strafe, try a different kind of evasion... - if (NPC->s.weapon == WP_SABER && Jedi_DecideKick(enemy_dist) && G_CanKickEntity(NPC, NPC->enemy) && G_PickAutoKick(NPC, NPC->enemy, qtrue) != LS_NONE) + if ((NPC->s.weapon == WP_SABER || NPCInfo->stats.meleeKicks) && Jedi_DecideKick(enemy_dist) && G_CanKickEntity(NPC, NPC->enemy) && G_PickAutoKick(NPC, NPC->enemy, qtrue) != LS_NONE) {//kicked! TIMER_Set( NPC, "kickDebounce", Q_irand( 3000, 10000 ) ); } @@ -4461,7 +4484,7 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en && (NPCInfo->stats.aggression < 4 || NPC->s.weapon != WP_SABER || NPC->client->ps.saberInFlight) && TIMER_Done( NPC, "parryTime" ) ) ) { - if ( (NPCInfo->rank == RANK_ENSIGN || NPCInfo->rank > RANK_LT_JG) && !shooting_lightning && Q_irand( 0, 2 ) ) + if ( (NPCInfo->rank == RANK_ENSIGN || NPCInfo->rank > RANK_LT_JG) && !shooting_lightning && Q_irand( 0, 2 ) && (NPC->client->ps.forcePowerLevel[FP_PUSH] > 0 || !(NPCInfo->stats.restrictJediPowers)) ) {//FIXME: check forcePushRadius[NPC->client->ps.forcePowerLevel[FP_PUSH]] ForceThrow( NPC, qfalse ); } @@ -4469,7 +4492,9 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en && !(NPCInfo->scriptFlags&SCF_NO_ACROBATICS) && NPC->client->ps.forceRageRecoveryTime < level.time && !(NPC->client->ps.forcePowersActive&(1<client->ps ) ) + && !PM_InKnockDown( &NPC->client->ps ) + && (NPC->client->ps.forcePowerLevel[FP_LEVITATION] > 0 + || !(NPCInfo->stats.restrictJediPowers))) {//FIXME: make this a function call? //FIXME: check for clearance, safety of landing spot? NPC->client->ps.forceJumpCharge = 480; @@ -4532,6 +4557,8 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en {//FIXME: make this a function call? //FIXME: check for clearance, safety of landing spot? if ( NPC->client->NPC_class == CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_MANDA + || NPC->client->NPC_class == CLASS_COMMANDO || (NPC->client->NPC_class == CLASS_REBORN && NPC->s.weapon != WP_SABER) || NPC->client->NPC_class == CLASS_ROCKETTROOPER ) { @@ -4767,7 +4794,7 @@ static void Jedi_FaceEnemy( qboolean doPitch ) CalcEntitySpot( NPC->enemy, SPOT_HEAD, enemy_eyes ); - if ( NPC->client->NPC_class == CLASS_BOBAFETT + if ((NPC->client->NPC_class == CLASS_BOBAFETT || NPC->client->NPC_class == CLASS_MANDA) && TIMER_Done( NPC, "flameTime" ) && NPC->s.weapon != WP_NONE && NPC->s.weapon != WP_DISRUPTOR @@ -5323,6 +5350,8 @@ static void Jedi_CombatIdle( int enemy_dist ) //FIXME: sometimes he turns it off, then turns it right back on again??? if ( enemy_dist > 200 && NPC->client->NPC_class != CLASS_BOBAFETT + && NPC->client->NPC_class != CLASS_MANDA + && NPC->client->NPC_class != CLASS_COMMANDO && (NPC->client->NPC_class != CLASS_REBORN || NPC->s.weapon == WP_SABER) && NPC->client->NPC_class != CLASS_ROCKETTROOPER && NPC->client->ps.SaberActive() @@ -5465,7 +5494,7 @@ static qboolean Jedi_AttackDecide( int enemy_dist ) return qfalse; } - if ( (NPCInfo->scriptFlags&SCF_DONT_FIRE) ) + if ( (NPCInfo->scriptFlags&SCF_DONT_FIRE && NPCInfo->stats.rareFire) ) {//melee cultists punch rarely if (NPC->s.weapon == WP_MELEE && enemy_dist <= 0 @@ -5476,10 +5505,10 @@ static qboolean Jedi_AttackDecide( int enemy_dist ) if (!(NPC->client->ps.forcePowerDebounce[FP_PUSH] > level.time || NPC->client->ps.forcePowerDebounce[FP_PULL] > level.time || NPC->client->ps.forcePowerDebounce[FP_DRAIN] > level.time || NPC->client->ps.forcePowerDebounce[FP_LIGHTNING] > level.time)) {//not in the middle of pushing, pulling, draining, or zapping - if ((level.time - NPC->client->ps.forcePowerDebounce[FP_PUSH] < 1500 - || level.time - NPC->client->ps.forcePowerDebounce[FP_PUSH] < 1500)) //we tried pushing/pulling in the last 1.5 seconds + if ((level.time - NPC->client->ps.forcePowerDebounce[FP_PUSH] < 1000 + || level.time - NPC->client->ps.forcePowerDebounce[FP_PUSH] < 1000)) {//we already tried to push/pull and aren't using another force power - if (!Q_irand(0, 10) - NPCInfo->stats.aggression) + if (!Q_irand(0, 6) - NPCInfo->stats.aggression) { TIMER_Set(NPC, "attackDelay", Q_irand(1000, 3000)); //single punches only, don't try again for a while } @@ -5987,7 +6016,10 @@ static void Jedi_Combat( void ) //for gravity with my size, see if it makes it... //this will also catch misacalculations that send you off ledges! //gi.Printf( "Considering Jump\n" ); - if (NPC->client && NPC->client->NPC_class==CLASS_BOBAFETT) + if (NPC->client && + (NPC->client->NPC_class==CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_MANDA + || NPC->client->NPC_class == CLASS_COMMANDO)) { Boba_FireDecide(); } @@ -6013,7 +6045,10 @@ static void Jedi_Combat( void ) G_AddVoiceEvent( NPC, Q_irand( EV_JLOST1, EV_JLOST3 ), 3000 ); jediSpeechDebounceTime[NPC->client->playerTeam] = NPCInfo->blockedSpeechDebounceTime = level.time + 3000; } - if (NPC->client && NPC->client->NPC_class==CLASS_BOBAFETT) + if (NPC->client && + (NPC->client->NPC_class==CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_MANDA + || NPC->client->NPC_class == CLASS_COMMANDO)) { Boba_FireDecide(); } @@ -6054,7 +6089,9 @@ static void Jedi_Combat( void ) } //if ( !enemy_lost ) - if (NPC->client->NPC_class != CLASS_BOBAFETT) + if (NPC->client->NPC_class != CLASS_BOBAFETT + && NPC->client->NPC_class != CLASS_MANDA + && NPC->client->NPC_class != CLASS_COMMANDO) { //Update our seen enemy position if ( !NPC->enemy->client || ( NPC->enemy->client->ps.groundEntityNum != ENTITYNUM_NONE && NPC->client->ps.groundEntityNum != ENTITYNUM_NONE ) ) @@ -6111,7 +6148,9 @@ static void Jedi_Combat( void ) else { } - if ( NPC->client->NPC_class == CLASS_BOBAFETT ) + if ( NPC->client->NPC_class == CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_MANDA + || NPC->client->NPC_class == CLASS_COMMANDO) { Boba_FireDecide(); } @@ -6387,7 +6426,9 @@ void Jedi_Ambush( gentity_t *self ) self->client->ps.pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; NPC_SetAnim( self, SETANIM_BOTH, BOTH_CEILING_DROP, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); self->client->ps.weaponTime = NPC->client->ps.torsoAnimTimer; - if ( self->client->NPC_class != CLASS_BOBAFETT + if ( self->client->NPC_class != CLASS_BOBAFETT + && self->client->NPC_class != CLASS_MANDA + && self->client->NPC_class != CLASS_COMMANDO && self->client->NPC_class != CLASS_ROCKETTROOPER ) { self->client->ps.SaberActivate(); @@ -6504,7 +6545,9 @@ static void Jedi_Patrol( void ) G_SetEnemy( NPC, best_enemy ); NPCInfo->stats.aggression = 3; } - else if ( NPC->client->NPC_class != CLASS_BOBAFETT ) + else if ( NPC->client->NPC_class != CLASS_BOBAFETT + && NPC->client->NPC_class != CLASS_MANDA + && NPC->client->NPC_class != CLASS_COMMANDO) {//the player, toy with him //get progressively more interested over time if ( TIMER_Done( NPC, "watchTime" ) ) @@ -6881,7 +6924,9 @@ static void Jedi_Attack( void ) {//my enemy is dead and I killed him NPCInfo->enemyCheckDebounceTime = 0;//keep looking for others - if ( NPC->client->NPC_class == CLASS_BOBAFETT + if ( NPC->client->NPC_class == CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_MANDA + || NPC->client->NPC_class == CLASS_COMMANDO || (NPC->client->NPC_class == CLASS_REBORN && NPC->s.weapon != WP_SABER) || NPC->client->NPC_class == CLASS_ROCKETTROOPER ) { @@ -7058,6 +7103,8 @@ static void Jedi_Attack( void ) } if ( NPC->client->NPC_class != CLASS_BOBAFETT + && NPC->client->NPC_class != CLASS_MANDA + && NPC->client->NPC_class != CLASS_COMMANDO && (NPC->client->NPC_class != CLASS_REBORN || NPC->s.weapon == WP_SABER) && NPC->client->NPC_class != CLASS_ROCKETTROOPER ) { @@ -7081,6 +7128,8 @@ static void Jedi_Attack( void ) } if ( NPC->client->NPC_class != CLASS_BOBAFETT + && NPC->client->NPC_class != CLASS_MANDA + && NPC->client->NPC_class != CLASS_COMMANDO && (NPC->client->NPC_class != CLASS_REBORN || NPC->s.weapon == WP_SABER) && NPC->client->NPC_class != CLASS_ROCKETTROOPER ) { @@ -7105,6 +7154,8 @@ static void Jedi_Attack( void ) else {//check other special combat behavior if ( NPC->client->NPC_class != CLASS_BOBAFETT + && NPC->client->NPC_class != CLASS_MANDA + && NPC->client->NPC_class != CLASS_COMMANDO && (NPC->client->NPC_class != CLASS_REBORN || NPC->s.weapon == WP_SABER) && NPC->client->NPC_class != CLASS_ROCKETTROOPER ) { @@ -7773,7 +7824,9 @@ void NPC_BSJedi_Default( void ) if( !NPC->enemy ) {//don't have an enemy, look for one - if ( NPC->client->NPC_class == CLASS_BOBAFETT + if ( NPC->client->NPC_class == CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_MANDA + || NPC->client->NPC_class == CLASS_COMMANDO || (NPC->client->NPC_class == CLASS_REBORN && NPC->s.weapon != WP_SABER) || NPC->client->NPC_class == CLASS_ROCKETTROOPER ) { diff --git a/code/game/AI_Seeker.cpp b/code/game/AI_Seeker.cpp index d6dd8bbb39..300e6392ea 100644 --- a/code/game/AI_Seeker.cpp +++ b/code/game/AI_Seeker.cpp @@ -90,7 +90,8 @@ void Seeker_MaintainHeight( void ) dif = (NPC->enemy->currentOrigin[2] + Q_flrand( NPC->enemy->maxs[2]/2, NPC->enemy->maxs[2]+8 )) - NPC->currentOrigin[2]; float difFactor = 1.0f; - if ( NPC->client->NPC_class == CLASS_BOBAFETT ) + if ( NPC->client->NPC_class == CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_MANDA) { if ( TIMER_Done( NPC, "flameTime" ) ) { @@ -108,7 +109,8 @@ void Seeker_MaintainHeight( void ) NPC->client->ps.velocity[2] = (NPC->client->ps.velocity[2]+dif)/2; } - if ( NPC->client->NPC_class == CLASS_BOBAFETT ) + if ( NPC->client->NPC_class == CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_MANDA) { NPC->client->ps.velocity[2] *= Q_flrand( 0.85f, 3.0f ); } @@ -195,7 +197,8 @@ void Seeker_Strafe( void ) { float vel = SEEKER_STRAFE_VEL; float upPush = SEEKER_UPWARD_PUSH; - if ( NPC->client->NPC_class != CLASS_BOBAFETT ) + if ( NPC->client->NPC_class != CLASS_BOBAFETT + && NPC->client->NPC_class != CLASS_MANDA) { G_Sound( NPC, G_SoundIndex( "sound/chars/seeker/misc/hiss" )); } @@ -219,7 +222,8 @@ void Seeker_Strafe( void ) // Pick a random side side = ( rand() & 1 ) ? -1 : 1; float stDis = SEEKER_STRAFE_DIS; - if ( NPC->client->NPC_class == CLASS_BOBAFETT ) + if ( NPC->client->NPC_class == CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_MANDA) { stDis *= 2.0f; } @@ -241,7 +245,8 @@ void Seeker_Strafe( void ) VectorMA( NPC->client->ps.velocity, dis, dir, NPC->client->ps.velocity ); float upPush = SEEKER_UPWARD_PUSH; - if ( NPC->client->NPC_class != CLASS_BOBAFETT ) + if ( NPC->client->NPC_class != CLASS_BOBAFETT + && NPC->client->NPC_class != CLASS_MANDA) { G_Sound( NPC, G_SoundIndex( "sound/chars/seeker/misc/hiss" )); } @@ -333,7 +338,8 @@ void Seeker_Fire( void ) //------------------------------------ void Seeker_Ranged( qboolean visible, qboolean advance ) { - if ( NPC->client->NPC_class != CLASS_BOBAFETT ) + if ( NPC->client->NPC_class != CLASS_BOBAFETT + && NPC->client->NPC_class != CLASS_MANDA) { if ( NPC->count > 0 ) { @@ -371,7 +377,8 @@ void Seeker_Attack( void ) qboolean visible = NPC_ClearLOS( NPC->enemy ); qboolean advance = (qboolean)(distance > MIN_DISTANCE_SQR); - if ( NPC->client->NPC_class == CLASS_BOBAFETT ) + if ( NPC->client->NPC_class == CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_MANDA) { advance = (qboolean)(distance>(200.0f*200.0f)); } @@ -450,7 +457,8 @@ void Seeker_FollowPlayer( void ) float minDistSqr = MIN_DISTANCE_SQR; - if ( NPC->client->NPC_class == CLASS_BOBAFETT ) + if ( NPC->client->NPC_class == CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_MANDA) { if ( TIMER_Done( NPC, "flameTime" ) ) { @@ -461,7 +469,8 @@ void Seeker_FollowPlayer( void ) if ( dis < minDistSqr ) { // generally circle the player closely till we take an enemy..this is our target point - if ( NPC->client->NPC_class == CLASS_BOBAFETT ) + if ( NPC->client->NPC_class == CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_MANDA) { pt[0] = g_entities[0].currentOrigin[0] + cos( level.time * 0.001f + NPC->random ) * 250; pt[1] = g_entities[0].currentOrigin[1] + sin( level.time * 0.001f + NPC->random ) * 250; @@ -486,7 +495,8 @@ void Seeker_FollowPlayer( void ) } else { - if ( NPC->client->NPC_class != CLASS_BOBAFETT ) + if ( NPC->client->NPC_class != CLASS_BOBAFETT + && NPC->client->NPC_class != CLASS_MANDA) { if ( TIMER_Done( NPC, "seekerhiss" )) { @@ -517,7 +527,8 @@ void NPC_BSSeeker_Default( void ) { if ( in_camera ) { - if ( NPC->client->NPC_class != CLASS_BOBAFETT ) + if ( NPC->client->NPC_class != CLASS_BOBAFETT + && NPC->client->NPC_class != CLASS_MANDA) { // cameras make me commit suicide.... G_Damage( NPC, NPC, NPC, NULL, NULL, 999, 0, MOD_UNKNOWN ); @@ -532,7 +543,7 @@ void NPC_BSSeeker_Default( void ) if ( NPC->enemy && NPC->enemy->health && NPC->enemy->inuse ) { - if ( NPC->client->NPC_class != CLASS_BOBAFETT + if (NPC->client->NPC_class != CLASS_BOBAFETT && NPC->client->NPC_class != CLASS_MANDA && ( NPC->enemy->s.number == 0 || ( NPC->enemy->client && NPC->enemy->client->NPC_class == CLASS_SEEKER )) ) { //hacked to never take the player as an enemy, even if the player shoots at it @@ -541,14 +552,14 @@ void NPC_BSSeeker_Default( void ) else { Seeker_Attack(); - if ( NPC->client->NPC_class == CLASS_BOBAFETT ) + if (NPC->client->NPC_class == CLASS_BOBAFETT || NPC->client->NPC_class == CLASS_MANDA) { Boba_FireDecide(); } return; } } - else if ( NPC->client->NPC_class == CLASS_BOBAFETT ) + else if (NPC->client->NPC_class == CLASS_BOBAFETT || NPC->client->NPC_class == CLASS_MANDA) { NPC_BSST_Patrol(); return; diff --git a/code/game/AI_Stormtrooper.cpp b/code/game/AI_Stormtrooper.cpp index 9ac277069f..22128abfc6 100644 --- a/code/game/AI_Stormtrooper.cpp +++ b/code/game/AI_Stormtrooper.cpp @@ -1267,7 +1267,9 @@ void NPC_BSST_Patrol( void ) ST_Speech( NPC, SPEECH_COVER, 0 ); return; } - else if (NPC->client->NPC_class==CLASS_BOBAFETT) + else if (NPC->client->NPC_class==CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_MANDA + || NPC->client->NPC_class == CLASS_COMMANDO) { //NPCInfo->lastAlertID = level.alertEvents[eventID].ID; if ( !level.alertEvents[alertEvent].owner || @@ -2379,10 +2381,16 @@ void NPC_BSST_Attack( void ) if ( (NPC->client->ps.weapon == WP_FLECHETTE || NPC->client->ps.weapon == WP_REPEATER) && (NPCInfo->scriptFlags & SCF_ALT_FIRE) ) {//shooting an explosive, but enemy too close, switch to primary fire - NPCInfo->scriptFlags &= ~SCF_ALT_FIRE; - //FIXME: we can never go back to alt-fire this way since, after this, we don't know if we were initially supposed to use alt-fire or not... + NPCInfo->scriptFlags &= ~SCF_ALT_FIRE; + } + } + else if (enemyDist >= MIN_ROCKET_DIST_SQUARED) + { + if ((NPC->client->ps.weapon == WP_FLECHETTE || NPC->client->ps.weapon == WP_REPEATER) && + (NPCInfo->stats.altFire)) + {//shooting an explosive, enemy was too close but not anymore + NPCInfo->scriptFlags |= SCF_ALT_FIRE; } - } else if ( enemyDist > 65536 )//256 squared { diff --git a/code/game/NPC.cpp b/code/game/NPC.cpp index 16cca4c83e..735dea8b0b 100644 --- a/code/game/NPC.cpp +++ b/code/game/NPC.cpp @@ -1904,7 +1904,9 @@ void NPC_RunBehavior( int team, int bState ) {//force-only reborn NPC_BehaviorSet_Jedi( bState ); } - else if ( NPC->client->NPC_class == CLASS_BOBAFETT ) + else if ( NPC->client->NPC_class == CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_MANDA + || NPC->client->NPC_class == CLASS_COMMANDO) { Boba_Update(); if (NPCInfo->surrenderTime) diff --git a/code/game/NPC_combat.cpp b/code/game/NPC_combat.cpp index 1429105e22..17762fb362 100644 --- a/code/game/NPC_combat.cpp +++ b/code/game/NPC_combat.cpp @@ -509,7 +509,10 @@ void G_SetEnemy( gentity_t *self, gentity_t *enemy ) // Basically, you're first one to notice enemies if ( self->forcePushTime < level.time ) // not currently being pushed { - if ( !G_TeamEnemy( self ) && self->client->NPC_class != CLASS_BOBAFETT) + if ( !G_TeamEnemy( self ) && + self->client->NPC_class != CLASS_BOBAFETT + && self->client->NPC_class != CLASS_MANDA + && self->client->NPC_class != CLASS_COMMANDO) {//team did not have an enemy previously if ( self->NPC && self->client->playerTeam == TEAM_PLAYER diff --git a/code/game/NPC_move.cpp b/code/game/NPC_move.cpp index da51cef715..442704ae44 100644 --- a/code/game/NPC_move.cpp +++ b/code/game/NPC_move.cpp @@ -345,6 +345,7 @@ void NPC_JumpAnimation() int jumpAnim = BOTH_JUMP1; if ( NPC->client->NPC_class == CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_MANDA || (NPC->client->NPC_class == CLASS_REBORN && NPC->s.weapon != WP_SABER) || NPC->client->NPC_class == CLASS_ROCKETTROOPER ||( NPCInfo->rank != RANK_CREWMAN && NPCInfo->rank <= RANK_LT_JG ) ) @@ -374,6 +375,7 @@ void NPC_JumpSound() //FIXME: can I delay the actual jump so that it matches the anim...? } else if ( NPC->client->NPC_class == CLASS_BOBAFETT + || NPC->client->NPC_class == CLASS_MANDA || NPC->client->NPC_class == CLASS_ROCKETTROOPER ) { // does this really need to be here? diff --git a/code/game/NPC_reactions.cpp b/code/game/NPC_reactions.cpp index f723a37bc8..de56f0901c 100644 --- a/code/game/NPC_reactions.cpp +++ b/code/game/NPC_reactions.cpp @@ -578,7 +578,10 @@ void NPC_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, const ve G_UseTargets2(self, other, self->paintarget); } - if (self->client && self->client->NPC_class==CLASS_BOBAFETT) + if (self->client && + (self->client->NPC_class==CLASS_BOBAFETT + || self->client->NPC_class == CLASS_MANDA + || self->client->NPC_class == CLASS_COMMANDO)) { Boba_Pain( self, inflictor, damage, mod); } diff --git a/code/game/NPC_spawn.cpp b/code/game/NPC_spawn.cpp index 15631a0d0a..2881fc7c90 100644 --- a/code/game/NPC_spawn.cpp +++ b/code/game/NPC_spawn.cpp @@ -214,6 +214,9 @@ void G_ClassSetDontFlee( gentity_t *self ) case CLASS_ASSASSIN_DROID: case CLASS_PLAYER: case CLASS_VEHICLE: + case CLASS_CULTIST: + case CLASS_MANDA: + case CLASS_COMMANDO: self->NPC->scriptFlags |= SCF_DONT_FLEE; break; default: @@ -240,15 +243,15 @@ void G_ClassSetDontFlee( gentity_t *self ) extern void Vehicle_Register(gentity_t *ent); extern void RT_FlyStart( gentity_t *self ); extern void SandCreature_ClearTimers( gentity_t *ent ); -void NPC_SetMiscDefaultData( gentity_t *ent ) +void NPC_SetMiscDefaultData(gentity_t *ent) { - if ( ent->spawnflags & SFB_CINEMATIC ) + if (ent->spawnflags & SFB_CINEMATIC) {//if a cinematic guy, default us to wait bState ent->NPC->behaviorState = BS_CINEMATIC; } - if ( ent->client->NPC_class == CLASS_RANCOR ) + if (ent->client->NPC_class == CLASS_RANCOR) { - if ( Q_stricmp( "mutant_rancor", ent->NPC_type ) == 0 ) + if (Q_stricmp("mutant_rancor", ent->NPC_type) == 0) { ent->spawnflags |= 1;//just so I know it's a mutant rancor as opposed to a normal one ent->NPC->aiFlags |= NPCAI_NAV_THROUGH_BREAKABLES; @@ -261,37 +264,38 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) } ent->flags |= FL_NO_KNOCKBACK; } - else if ( ent->client->NPC_class == CLASS_SAND_CREATURE ) + else if (ent->client->NPC_class == CLASS_SAND_CREATURE) {//??? - ent->clipmask = CONTENTS_SOLID|CONTENTS_MONSTERCLIP;//it can go through others + ent->clipmask = CONTENTS_SOLID | CONTENTS_MONSTERCLIP;//it can go through others ent->contents = 0;//can't be hit? ent->takedamage = qfalse;//can't be killed ent->flags |= FL_NO_KNOCKBACK; - SandCreature_ClearTimers( ent ); + SandCreature_ClearTimers(ent); } - else if ( ent->client->NPC_class == CLASS_BOBAFETT ) + else if (ent->client->NPC_class == CLASS_BOBAFETT + || ent->client->NPC_class == CLASS_MANDA) {//set some stuff, precache - ent->client->ps.forcePowersKnown |= ( 1 << FP_LEVITATION ); + ent->client->ps.forcePowersKnown |= (1 << FP_LEVITATION); ent->client->ps.forcePowerLevel[FP_LEVITATION] = FORCE_LEVEL_3; - ent->client->ps.forcePower = 100; - ent->NPC->scriptFlags |= (SCF_NAV_CAN_FLY|SCF_FLY_WITH_JET|SCF_NAV_CAN_JUMP); - NPC->flags |= FL_UNDYING; // Can't Kill Boba + ent->client->ps.forcePower = 100; + ent->NPC->scriptFlags |= (SCF_NAV_CAN_FLY | SCF_FLY_WITH_JET | SCF_NAV_CAN_JUMP); + NPC->flags |= FL_UNDYING; // Can't Kill Boba } - else if ( ent->client->NPC_class == CLASS_ROCKETTROOPER ) + else if (ent->client->NPC_class == CLASS_ROCKETTROOPER) {//set some stuff, precache - ent->client->ps.forcePowersKnown |= ( 1 << FP_LEVITATION ); + ent->client->ps.forcePowersKnown |= (1 << FP_LEVITATION); ent->client->ps.forcePowerLevel[FP_LEVITATION] = FORCE_LEVEL_3; ent->client->ps.forcePower = 100; - ent->NPC->scriptFlags |= (SCF_NAV_CAN_FLY|SCF_FLY_WITH_JET|SCF_NAV_CAN_JUMP);//no groups, no combat points! - if ( Q_stricmp( "rockettrooper2Officer", ent->NPC_type ) == 0 ) + ent->NPC->scriptFlags |= (SCF_NAV_CAN_FLY | SCF_FLY_WITH_JET | SCF_NAV_CAN_JUMP);//no groups, no combat points! + if (Q_stricmp("rockettrooper2Officer", ent->NPC_type) == 0) {//start in the air, use spotlight //ent->NPC->scriptFlags |= SCF_NO_GROUPS; ent->NPC->scriptFlags &= ~SCF_FLY_WITH_JET; - RT_FlyStart( ent ); - NPC_SetMoveGoal( ent, ent->currentOrigin, 16, qfalse, -1, NULL ); - VectorCopy( ent->currentOrigin, ent->pos1 ); + RT_FlyStart(ent); + NPC_SetMoveGoal(ent, ent->currentOrigin, 16, qfalse, -1, NULL); + VectorCopy(ent->currentOrigin, ent->pos1); } - if ( (ent->spawnflags&2) ) + if ((ent->spawnflags & 2)) {//spotlight ent->client->ps.eFlags |= EF_SPOTLIGHT; } @@ -300,129 +304,162 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) { ent->flags |= FL_NO_KNOCKBACK; } - else if ( ent->client->NPC_class == CLASS_SABOTEUR ) + else if (ent->client->NPC_class == CLASS_SABOTEUR) {//can cloak ent->NPC->aiFlags |= NPCAI_SHIELDS;//give them the ability to cloak - if ( (ent->spawnflags&16) ) + if ((ent->spawnflags & 16)) {//start cloaked - Saboteur_Cloak( ent ); + Saboteur_Cloak(ent); } } - else if ( ent->client->NPC_class == CLASS_ASSASSIN_DROID ) + else if (ent->client->NPC_class == CLASS_ASSASSIN_DROID) { ent->client->ps.stats[STAT_ARMOR] = 250; // start with full armor - if (ent->s.weapon==WP_BLASTER) + if (ent->s.weapon == WP_BLASTER) { ent->NPC->scriptFlags |= SCF_ALT_FIRE; } ent->flags |= (FL_NO_KNOCKBACK); } - if (ent->spawnflags&4096) + if (ent->spawnflags & 4096) { ent->NPC->scriptFlags |= SCF_NO_GROUPS;//don't use combat points or group AI } - if ( Q_stricmp( "DKothos", ent->NPC_type ) == 0 - || Q_stricmp( "VKothos", ent->NPC_type ) == 0 ) + if (Q_stricmp("DKothos", ent->NPC_type) == 0 + || Q_stricmp("VKothos", ent->NPC_type) == 0) { ent->NPC->scriptFlags |= SCF_DONT_FIRE; ent->NPC->aiFlags |= NPCAI_HEAL_ROSH; ent->count = 100; } - else if ( Q_stricmp( "rosh_dark", ent->NPC_type ) == 0 ) + else if (Q_stricmp("rosh_dark", ent->NPC_type) == 0) { ent->NPC->aiFlags |= NPCAI_ROSH; } - if ( Q_stricmpn( ent->NPC_type, "hazardtrooper", 13 ) == 0 ) + if (Q_stricmpn(ent->NPC_type, "hazardtrooper", 13) == 0) {//hazard trooper ent->NPC->scriptFlags |= SCF_NO_GROUPS;//don't use combat points or group AI - ent->flags |= (FL_SHIELDED|FL_NO_KNOCKBACK);//low-level shots bounce off, no knockback + ent->flags |= (FL_SHIELDED | FL_NO_KNOCKBACK);//low-level shots bounce off, no knockback } - if ( !Q_stricmp( "Yoda", ent->NPC_type ) ) + if (!Q_stricmp("Yoda", ent->NPC_type)) {//FIXME: extern this into NPC.cfg? ent->NPC->scriptFlags |= SCF_NO_FORCE;//force powers don't work on him ent->NPC->aiFlags |= NPCAI_BOSS_CHARACTER; } - if ( !Q_stricmp( "emperor", ent->NPC_type ) - || !Q_stricmp( "cultist_grip", ent->NPC_type ) - || !Q_stricmp( "cultist_drain", ent->NPC_type ) - || !Q_stricmp( "cultist_lightning", ent->NPC_type )) + if (!Q_stricmp("emperor", ent->NPC_type) + || !Q_stricmp("cultist_grip", ent->NPC_type) + || !Q_stricmp("cultist_drain", ent->NPC_type) + || !Q_stricmp("cultist_lightning", ent->NPC_type) + || ent->client->NPC_class == CLASS_CULTIST) {//FIXME: extern this into NPC.cfg? ent->NPC->scriptFlags |= SCF_DONT_FIRE;//so he uses only force powers } - if (!Q_stricmp( "Rax", ent->NPC_type ) ) + if (!Q_stricmp("Rax", ent->NPC_type)) { ent->NPC->scriptFlags |= SCF_DONT_FLEE; } - if ( !Q_stricmp( "cultist_destroyer", ent->NPC_type ) ) + if (!Q_stricmp("cultist_destroyer", ent->NPC_type)) { ent->splashDamage = 1000; ent->splashRadius = 384; //FIXME: precache these! - ent->fxID = G_EffectIndex( "force/destruction_exp" ); - ent->NPC->scriptFlags |= (SCF_DONT_FLEE|SCF_IGNORE_ALERTS); + ent->fxID = G_EffectIndex("force/destruction_exp"); + ent->NPC->scriptFlags |= (SCF_DONT_FLEE | SCF_IGNORE_ALERTS); ent->NPC->ignorePain = qtrue; } - if ( !Q_stricmp( "chewie", ent->NPC_type ) + if (!Q_stricmp("chewie", ent->NPC_type) + || ent->client->NPC_class == CLASS_WOOKIEE || ent->client->NPC_class == CLASS_GRAN - || ent->client->NPC_class == CLASS_TRANDOSHAN ) + || ent->client->NPC_class == CLASS_TRANDOSHAN) { //in case chewie ever loses his gun... //or if Trando or Gran want to get rough ent->NPC->aiFlags |= NPCAI_HEAVY_MELEE; } //================== - if ( ent->client->ps.saber[0].type != SABER_NONE - && (!(ent->NPC->aiFlags&NPCAI_MATCHPLAYERWEAPON)||!ent->weaponModel[0]) ) + if (ent->client->ps.saber[0].type != SABER_NONE + && (!(ent->NPC->aiFlags&NPCAI_MATCHPLAYERWEAPON) || !ent->weaponModel[0])) {//if I'm equipped with a saber, initialize it (them) ent->client->ps.SaberDeactivate(); - ent->client->ps.SetSaberLength( 0 ); - WP_SaberInitBladeData( ent ); - if ( ent->client->ps.weapon == WP_SABER ) + ent->client->ps.SetSaberLength(0); + WP_SaberInitBladeData(ent); + if (ent->client->ps.weapon == WP_SABER) {//this is our current weapon, add the models now - WP_SaberAddG2SaberModels( ent ); + WP_SaberAddG2SaberModels(ent); } - Jedi_ClearTimers( ent ); + Jedi_ClearTimers(ent); } - if ( ent->client->ps.forcePowersKnown != 0 ) + if (ent->client->ps.forcePowersKnown != 0) { - WP_InitForcePowers( ent ); + WP_InitForcePowers(ent); if (ent->client->ps.forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0) { ent->NPC->scriptFlags |= SCF_NAV_CAN_JUMP; // anyone who has any force jump can jump } } - if ( ent->client->NPC_class == CLASS_HOWLER ) + if (ent->client->NPC_class == CLASS_HOWLER) { - Howler_ClearTimers( ent ); + Howler_ClearTimers(ent); ent->NPC->scriptFlags |= SCF_NO_FALLTODEATH; ent->flags |= FL_NO_IMPACT_DMG; ent->NPC->scriptFlags |= SCF_NAV_CAN_JUMP; // These jokers can jump } - if ( ent->client->NPC_class == CLASS_DESANN + if (ent->client->NPC_class == CLASS_DESANN || ent->client->NPC_class == CLASS_TAVION || ent->client->NPC_class == CLASS_LUKE || ent->client->NPC_class == CLASS_KYLE - || Q_stricmp("tavion_scepter", ent->NPC_type ) == 0 - || Q_stricmp("alora_dual", ent->NPC_type ) == 0 ) + || Q_stricmp("tavion_scepter", ent->NPC_type) == 0 + || Q_stricmp("alora_dual", ent->NPC_type) == 0) { ent->NPC->aiFlags |= NPCAI_BOSS_CHARACTER; } - else if ( Q_stricmp( "alora", ent->NPC_type ) == 0 - || Q_stricmp( "rosh_dark", ent->NPC_type ) == 0 ) + else if (Q_stricmp("alora", ent->NPC_type) == 0 + || Q_stricmp("rosh_dark", ent->NPC_type) == 0) { ent->NPC->aiFlags |= NPCAI_SUBBOSS_CHARACTER; } - if ( ent->client->NPC_class == CLASS_TUSKEN ) + if (ent->client->NPC_class == CLASS_TUSKEN) { - if ( g_spskill->integer > 1 ) + if (g_spskill->integer > 1) {//on hard, tusken raiders are faster than you ent->NPC->stats.runSpeed = 280; ent->NPC->stats.walkSpeed = 65; } } + + //new checks - Dusty + /* + if (ent->NPC) + { + if (ent->NPC->stats.rareFire || ent->NPC->stats.dontFire) + { + ent->NPC->scriptFlags |= SCF_DONT_FIRE; + } + if (ent->NPC->stats.dontFlee) + { + ent->NPC->scriptFlags |= SCF_DONT_FLEE; + } + if (ent->NPC && ent->NPC->stats.altFire) + { + ent->NPC->scriptFlags |= SCF_ALT_FIRE; + } + if (ent->NPC->stats.heavyMelee > -1) + { + if (ent->NPC->stats.heavyMelee == 0) ent->NPC->aiFlags &= ~NPCAI_HEAVY_MELEE; + else ent->NPC->aiFlags |= NPCAI_HEAVY_MELEE; + } + if (ent->NPC->stats.undying) + { + ent->flags |= FL_UNDYING; + } + } + */ + + + //***I'm not sure whether I should leave this as a TEAM_ switch, I think NPC_class may be more appropriate - dmv switch(ent->client->playerTeam) { @@ -460,6 +497,12 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) { case WP_BRYAR_PISTOL://FIXME: new weapon: imp blaster pistol case WP_BLASTER_PISTOL: + if (ent->flags&FL_DUALPISTOLS + && (!(ent->NPC->aiFlags&NPCAI_MATCHPLAYERWEAPON) || !ent->weaponModel[0]))//they do this themselves + {//dual blaster pistols, so add the left-hand one, too + G_CreateG2AttachedWeaponModel(ent, weaponData[ent->client->ps.weapon].weaponMdl, ent->handLBolt, 1); + } + break; case WP_DISRUPTOR: case WP_BOWCASTER: case WP_REPEATER: @@ -569,6 +612,11 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) {//dual blaster pistols, so add the left-hand one, too G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].weaponMdl, ent->handLBolt, 1 ); } + else if (ent->flags&FL_DUALPISTOLS + && (!(ent->NPC->aiFlags&NPCAI_MATCHPLAYERWEAPON) || !ent->weaponModel[0]))//they do this themselves + {//dual blaster pistols, so add the left-hand one, too + G_CreateG2AttachedWeaponModel(ent, weaponData[ent->client->ps.weapon].weaponMdl, ent->handLBolt, 1); + } break; case WP_DISRUPTOR: //Sniper @@ -636,8 +684,7 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) } break; } - - + if ( ent->client->NPC_class == CLASS_ATST || ent->client->NPC_class == CLASS_MARK1 ) // chris/steve/kevin requested that the mark1 be shielded also { ent->flags |= (FL_SHIELDED|FL_NO_KNOCKBACK); @@ -652,6 +699,7 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) ent->client->NPC_class==CLASS_GLIDER || ent->client->NPC_class==CLASS_IMPWORKER || ent->client->NPC_class==CLASS_BOBAFETT || + ent->client->NPC_class == CLASS_MANDA || ent->client->NPC_class==CLASS_ROCKETTROOPER ) { @@ -1391,7 +1439,8 @@ void NPC_DefaultScriptFlags( gentity_t *ent ) return; } //Set up default script flags - ent->NPC->scriptFlags = (SCF_CHASE_ENEMIES|SCF_LOOK_FOR_ENEMIES); + ent->NPC->scriptFlags |= SCF_CHASE_ENEMIES; + ent->NPC->scriptFlags |= SCF_LOOK_FOR_ENEMIES; } #define MAX_SAFESPAWN_ENTS 4 diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index 19611d82ce..d7c90a985c 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -175,6 +175,9 @@ stringID_table_t ClassTable[] = ENUM2STRING(CLASS_ASSASSIN_DROID), ENUM2STRING(CLASS_HAZARD_TROOPER), ENUM2STRING(CLASS_VEHICLE), + ENUM2STRING(CLASS_CULTIST), + ENUM2STRING(CLASS_WOOKIEE), + ENUM2STRING(CLASS_MANDA), { "", -1 } }; @@ -1996,6 +1999,14 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) stats->walkSpeed = 90; stats->runSpeed = 300; stats->acceleration = 15;//Increase/descrease speed this much per frame (20fps) + + //new stats + stats->altFire = qfalse; + stats->rareFire = qfalse; + stats->restrictJediPowers = qfalse; + stats->meleeKicks = 0; + stats->meleeKatas = 0; + stats->saberMeleeKatas = qfalse; } else { @@ -3546,15 +3557,263 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) if ( NPC->NPC ) { if ( n != 0 ) + { + stats->altFire = qtrue; + } + } + if (NPC->NPC) + { + if (n != 0) { NPC->NPC->scriptFlags |= SCF_ALT_FIRE; } } continue; + continue; + } + + if (!Q_stricmp(token, "dontFire")) + { + if (COM_ParseInt(&p, &n)) + { + SkipRestOfLine(&p); + continue; + } + if (NPC->client) + { + if (n != 0) + { + NPC->NPC->scriptFlags |= SCF_DONT_FIRE; + } + } + continue; + } + + if (!Q_stricmp(token, "dontFlee")) + { + if (COM_ParseInt(&p, &n)) + { + SkipRestOfLine(&p); + continue; + } + if (NPC->client) + { + if (n != 0) + { + NPC->NPC->scriptFlags |= SCF_DONT_FLEE; + } + } + continue; + } + + if (!Q_stricmp(token, "rareFire")) + { + if (COM_ParseInt(&p, &n)) + { + SkipRestOfLine(&p); + continue; + } + if (NPC->client) + { + if (n != 0) + { + NPC->NPC->scriptFlags |= SCF_DONT_FIRE; + stats->rareFire = qtrue; + } + } + continue; } - //Other unique behaviors/numbers that are currently hardcoded? + + //special stats that force certain attributes regardless of class + if (!Q_stricmp(token, "dualPistols")) + { + if (COM_ParseInt(&p, &n)) + { + SkipRestOfLine(&p); + continue; + } + if (NPC->client && NPC->client->ps.weapon == WP_BLASTER_PISTOL) + { + if (n != 0) + { + NPC->flags |= FL_DUALPISTOLS; + } + } + + continue; + } + + //heavyMelee + if (!Q_stricmp(token, "heavyMelee")) + { + if (COM_ParseInt(&p, &n)) + { + SkipRestOfLine(&p); + continue; + } + if (NPC->client) + { + if (n != 0) + { + NPC->NPC->aiFlags |= NPCAI_HEAVY_MELEE; + } + } + + continue; + } + + //can they do melee katas with saber out like Boss_Kyle? + if (!Q_stricmp(token, "saberMeleeKatas")) + { + if (COM_ParseInt(&p, &n)) + { + SkipRestOfLine(&p); + continue; + } + + if (NPC->client) + { + if (n != 0) + { + stats->saberMeleeKatas = qtrue; + } + } + + continue; + } + + if (!Q_stricmp(token, "undying")) + { + if (COM_ParseInt(&p, &n)) + { + SkipRestOfLine(&p); + continue; + } + + if (NPC->client) + { + if (n != 0) + { + NPC->flags |= FL_UNDYING; + } + } + + continue; + } + } + + + //these stats can affect the player + if (!Q_stricmp(token, "cortosis")) + { + if (COM_ParseInt(&p, &n)) + { + SkipRestOfLine(&p); + continue; + } + if (NPC->client) + { + if (n != 0) + { + NPC->flags |= FL_CORTOSIS; + } + } + continue; + } + + if (!Q_stricmp(token, "magPlating")) + { + if (COM_ParseInt(&p, &n)) + { + SkipRestOfLine(&p); + continue; + } + if (NPC->client) + { + if (n != 0) + { + NPC->flags |= FL_MAGPLATING; + } + } + continue; + } + + if (!Q_stricmp(token, "blastArmor")) + { + if (COM_ParseInt(&p, &n)) + { + SkipRestOfLine(&p); + continue; + } + if (NPC->client) + { + if (n != 0) + { + NPC->flags |= FL_BLASTARMOR; + } + } + continue; } + //special melee characteristics + if (!Q_stricmp(token, "meleeKatas")) + { + if (COM_ParseInt(&p, &n)) + { + SkipRestOfLine(&p); + continue; + } + if (NPC->NPC) + { + if (n != 0) + { + stats->meleeKatas = n; + NPC->flags |= FL_MELEEKATAS; + } + } + continue; + } + + //can they do kicks in Melee? + if (!Q_stricmp(token, "meleeKicks")) + { + if (COM_ParseInt(&p, &n)) + { + SkipRestOfLine(&p); + continue; + } + if (NPC->NPC) + { + if (n != 0) + { + stats->meleeKicks = n; + NPC->flags |= FL_MELEEKICKS; + } + } + continue; + } + + if (!Q_stricmp(token, "meleeKatasForceFx")) + { + if (COM_ParseInt(&p, &n)) + { + SkipRestOfLine(&p); + continue; + } + if (NPC->client) + { + if (n == 0) + { + NPC->flags |= FL_MELEEKATA_NOFORCEFX; + } + } + continue; + } + + + + //Other unique behaviors/numbers that are currently hardcoded? + //force powers int fp = GetIDForString( FPTable, token ); if ( fp >= FP_FIRST && fp < NUM_FORCE_POWERS ) diff --git a/code/game/NPC_utils.cpp b/code/game/NPC_utils.cpp index d92cdd167d..58e9401e02 100644 --- a/code/game/NPC_utils.cpp +++ b/code/game/NPC_utils.cpp @@ -1624,13 +1624,13 @@ extern qboolean Boba_Flying( gentity_t *self ); extern void Boba_FlyStart( gentity_t *self ); extern void Boba_FlyStop( gentity_t *self ); -qboolean JET_Flying( gentity_t *self ) +qboolean JET_Flying(gentity_t *self) { - if ( !self || !self->client ) + if (!self || !self->client) { return qfalse; } - if ( self->client->NPC_class == CLASS_BOBAFETT ) + if (self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA) { return (Boba_Flying(self)); } @@ -1651,7 +1651,7 @@ void JET_FlyStart( gentity_t *self ) return; } self->lastInAirTime = level.time; - if ( self->client->NPC_class == CLASS_BOBAFETT ) + if (self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA) { Boba_FlyStart( self ); } @@ -1667,7 +1667,7 @@ void JET_FlyStop( gentity_t *self ) { return; } - if ( self->client->NPC_class == CLASS_BOBAFETT ) + if (self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA) { Boba_FlyStop( self ); } diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 7b12b23816..25ae4d2ee2 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -4635,7 +4635,7 @@ static void Q3_SetBobaJetPack(int entID, qboolean add) } // make sure we this is Boba Fett - if ( ent->client && ent->client->NPC_class != CLASS_BOBAFETT ) + if (ent->client && ent->client->NPC_class != CLASS_BOBAFETT && ent->client->NPC_class != CLASS_MANDA) { Quake3Game()->DebugPrint( IGameInterface::WL_WARNING, "Q3_SetBobaJetPack: '%s' is not Boba Fett!\n", ent->targetname ); return; diff --git a/code/game/b_public.h b/code/game/b_public.h index 99da0d8ae8..bf0158941f 100644 --- a/code/game/b_public.h +++ b/code/game/b_public.h @@ -91,7 +91,7 @@ along with this program; if not, see . #define SCF_NAV_CAN_JUMP 0x20000000 //Can attempt to jump when blocked #define SCF_FIRE_WEAPON_NO_ANIM 0x40000000 //Fire weapon but don't play weapon firing anim #define SCF_SAFE_REMOVE 0x80000000 //Remove NPC when it's safe (when player isn't looking) -//#define SCF_RESTRICT_FIRE 0x100000000 //NPC unlikely to fire except in special cases + //#ifdef __DEBUG @@ -156,6 +156,15 @@ typedef struct gNPCstats_e int acceleration; //sex sexType_t sex; //male, female, etc. + + //new fields + qboolean altFire; //NPC ONLY: forces to use altFire always, allows NPC to remember its native firing mode + qboolean restrictJediPowers; //NPC ONLY: keeps from *ever* using dodge and push abilities without possessing those force powers + int meleeKicks; //use kicks with WP_MELEE? If 1-5 controls frequency + int meleeKatas; //use melee katas with WP_MELEE? If 1-5 controls frequency + int saberMeleeKatas; //NPC ONLY: use melee katas with WP_SABER? kyle_boss ignores this + qboolean rareFire; + } gNPCstats_t; diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index f1437257bb..31bc5b2e96 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -687,7 +687,10 @@ static void PM_Friction(void) { else if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && pm->gent && pm->gent->client - && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) && pm->gent->client->moveType == MT_FLYSWIM) + && (pm->gent->client->NPC_class == CLASS_BOBAFETT + || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER + || pm->gent->client->NPC_class == CLASS_MANDA) + && pm->gent->client->moveType == MT_FLYSWIM) {//player as Boba drop += speed*pm_waterfriction*pml.frametime; } @@ -1118,7 +1121,7 @@ static qboolean PM_CheckJump(void) #if METROID_JUMP if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && pm->gent && pm->gent->client - && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER)) + && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER || pm->gent->client->NPC_class == CLASS_MANDA)) {//player playing as boba fett if (pm->cmd.upmove > 0) {//turn on/go up @@ -2815,7 +2818,8 @@ static void PM_FlyMove(void) if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && pm->gent && pm->gent->client - && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) && pm->gent->client->moveType == MT_FLYSWIM) + && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER || + NPC->client->NPC_class == CLASS_MANDA) && pm->gent->client->moveType == MT_FLYSWIM) {//jetpack accel accel = pm_flyaccelerate; jetPackMove = qtrue; @@ -3876,8 +3880,10 @@ static qboolean PM_TryRoll(void) {//only jedi/reborn NPCs should be able to do rolls (with a few exceptions) if (!pm->gent || !pm->gent->client - || (pm->gent->client->NPC_class != CLASS_BOBAFETT //boba can roll with it, baby - && pm->gent->client->NPC_class != CLASS_REBORN //reborn using weapons other than saber can still roll + || (pm->gent->client->NPC_class != CLASS_BOBAFETT + && pm->gent->client->NPC_class != CLASS_MANDA + && pm->gent->client->NPC_class != CLASS_COMMANDO//boba can roll with it, baby + && pm->gent->client->NPC_class != CLASS_REBORN //reborn using weapons other than saber can still roll )) {//can't roll return qfalse; @@ -4063,11 +4069,11 @@ static void PM_CrashLand(void) } else if (pm->gent && pm->gent->client - && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER)) + && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER || pm->gent->client->NPC_class == CLASS_MANDA)) { if (JET_Flying(pm->gent)) { - if (pm->gent->client->NPC_class == CLASS_BOBAFETT + if (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_MANDA || (pm->gent->client->NPC_class == CLASS_ROCKETTROOPER&&pm->gent->NPC&&pm->gent->NPC->rankgent); @@ -4455,11 +4461,11 @@ qboolean PM_RocketeersAvoidDangerousFalls(void) { if (pm->gent->NPC && pm->gent->client - && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER)) + && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_MANDA || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER)) {//fixme: fall through if jetpack broken? if (JET_Flying(pm->gent)) { - if (pm->gent->client->NPC_class == CLASS_BOBAFETT) + if (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_MANDA) { pm->gent->client->jetPackTime = level.time + 2000; //Wait, what if the effect is already playing, how do we know??? @@ -4908,7 +4914,7 @@ static void PM_GroundTraceMissed(void) { } else if (trace.entityNum < ENTITYNUM_NONE && pm->ps->weapon != WP_SABER - && (!pm->gent || !pm->gent->client || (pm->gent->client->NPC_class != CLASS_BOBAFETT&&pm->gent->client->NPC_class != CLASS_REBORN&&pm->gent->client->NPC_class != CLASS_ROCKETTROOPER))) + && (!pm->gent || !pm->gent->client || (pm->gent->client->NPC_class != CLASS_BOBAFETT&&pm->gent->client->NPC_class != CLASS_REBORN&&pm->gent->client->NPC_class != CLASS_ROCKETTROOPER && pm->gent->client->NPC_class != CLASS_MANDA))) {//Jedi don't scream and die if they're heading for a hard impact gentity_t *traceEnt = &g_entities[trace.entityNum]; if (trace.entityNum == ENTITYNUM_WORLD || (traceEnt && traceEnt->bmodel)) @@ -8168,7 +8174,7 @@ static void PM_Footsteps(void) { if (pm->gent && pm->gent->client - && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) + && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_MANDA || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) && pm->gent->client->moveType == MT_FLYSWIM) {//flying around with jetpack //do something else? @@ -8196,7 +8202,7 @@ static void PM_Footsteps(void) { if (pm->gent && pm->gent->client - && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) + && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_MANDA || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) && pm->gent->client->moveType == MT_FLYSWIM) {//flying around with jetpack //do something else? @@ -13772,15 +13778,18 @@ static void PM_Weapon(void) { int anim = -1; if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) - /*&& g_debugMelee->integer*/) + && !(g_debugMelee->integer < 0) ) {//saber offense if ((pm->cmd.buttons&BUTTON_ALT_ATTACK)) { - if ((pm->cmd.buttons&BUTTON_ATTACK) && pm->ps->forcePowerLevel[FP_SABER_OFFENSE] > 1) + if ((pm->cmd.buttons&BUTTON_ATTACK) && pm->ps->forcePowerLevel[FP_SABER_OFFENSE] > 1 + /*&& pm->gent->flags&FL_MELEEKATAS*/) { PM_TryGrab(); } - else if (!(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD) /*&& pm->ps->forcePowerLevel[FP_SABER_OFFENSE] > 0*/) + else if (!(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD) + //&& pm->gent->flags&FL_MELEEKICKS + /*&& pm->ps->forcePowerLevel[FP_SABER_OFFENSE] > 0*/) { PM_CheckKick(); } diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index d6ee183088..bca44d7304 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -1244,7 +1244,7 @@ void DoImpact( gentity_t *self, gentity_t *other, qboolean damageSelf, trace_t * || self->client->NPC_class == CLASS_VEHICLE || ( magnitude >= 700 ) )//health here is used to simulate structural integrity { - if ( (self->s.weapon == WP_SABER || self->s.numberclient&&(self->client->NPC_class==CLASS_BOBAFETT||self->client->NPC_class==CLASS_ROCKETTROOPER))) && self->client && self->client->ps.groundEntityNum < ENTITYNUM_NONE && magnitude < 1000 ) + if ((self->s.weapon == WP_SABER || self->s.numberclient && (self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_ROCKETTROOPER || self->client->NPC_class == CLASS_MANDA || self->client->NPC_class == CLASS_COMMANDO))) && self->client && self->client->ps.groundEntityNum < ENTITYNUM_NONE && magnitude < 1000) {//players and jedi take less impact damage //allow for some lenience on high falls magnitude /= 2; @@ -2335,7 +2335,8 @@ qboolean G_GrabClient( gentity_t *ent, usercmd_t *ucmd ) || radiusEnts[i]->client->NPC_class == CLASS_REBORN //melee force users? Should we allow kataing? || radiusEnts[i]->client->NPC_class == CLASS_BOBAFETT //he's too leet || radiusEnts[i]->NPC->aiFlags&NPCAI_BOSS_CHARACTER) - || !Q_stricmp("chewie", radiusEnts[i]->NPC_type) + || ((!Q_stricmp("chewie", radiusEnts[i]->NPC_type) || radiusEnts[i]->client->NPC_class == CLASS_WOOKIEE) + && ent->client->NPC_class != CLASS_WOOKIEE) //if you are a wook you can kata other wooks? && !(ent->NPC || (g_debugMelee->integer && ent->s.number < MAX_CLIENTS))) { //FIXME: Some kind of kata resist animation? continue; @@ -2371,6 +2372,7 @@ qboolean G_GrabClient( gentity_t *ent, usercmd_t *ucmd ) { lockType = LOCK_KYLE_GRAB2; } + WP_SabersCheckLock2( ent, bestEnt, (sabersLockMode_t)lockType ); return qtrue; } @@ -3227,16 +3229,35 @@ qboolean G_CheckClampUcmd( gentity_t *ent, usercmd_t *ucmd ) int kickDamage; //= Q_irand( 3, 8 ); int kickDamage2; //= Q_irand( 3, 8 ); + int kickDmgFlux = weaponData[WP_MELEE].velocity; + kickDamage = weaponData[WP_MELEE].splashDamage + Q_irand(-kickDmgFlux, kickDmgFlux); + kickDamage2 = weaponData[WP_MELEE].splashDamage + Q_irand(-kickDmgFlux, kickDmgFlux); + + /* switch (ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE]) { case FORCE_LEVEL_0: - case FORCE_LEVEL_1: - kickDamage = Q_irand(4, 5); + case FORCE_LEVEL_1: case FORCE_LEVEL_2: case FORCE_LEVEL_3: kickDamage = Q_irand(5, 6); kickDamage2 = Q_irand(5, 6); } + */ + + switch (ent->client->ps.legsAnim) + { + case BOTH_A7_KICK_S: + case BOTH_A7_KICK_BF: + case BOTH_A7_KICK_RL: + case BOTH_A7_KICK_F_AIR: + case BOTH_A7_KICK_R_AIR: + case BOTH_A7_KICK_L_AIR: + case BOTH_A7_KICK_B_AIR: + kickDamage = weaponData[WP_MELEE].altSplashDamage + Q_irand(-kickDmgFlux, kickDmgFlux); + kickDamage2 = weaponData[WP_MELEE].altSplashDamage + Q_irand(-kickDmgFlux, kickDmgFlux); + } + int kickPush = Q_flrand( 100.0f, 200.0f );//Q_flrand( 50.0f, 100.0f ); int kickPush2 = Q_flrand( 100.0f, 200.0f );//Q_flrand( 50.0f, 100.0f ); @@ -3673,7 +3694,6 @@ qboolean G_CheckClampUcmd( gentity_t *ent, usercmd_t *ucmd ) break; case BOTH_A7_KICK_S: kickPush = Q_flrand( 150.0f, 250.0f );//Q_flrand( 75.0f, 125.0f ); - kickDamage += 4; if ( ent->footRBolt != -1 ) {//actually trace to a bolt if ( elapsedTime >= 550 @@ -3741,7 +3761,6 @@ qboolean G_CheckClampUcmd( gentity_t *ent, usercmd_t *ucmd ) break; case BOTH_A7_KICK_BF: kickPush = Q_flrand( 150.0f, 250.0f );//Q_flrand( 75.0f, 125.0f ); - kickDamage += 4; if ( elapsedTime < 1500 ) {//auto-aim! overridAngles = PM_AdjustAnglesForBFKick( ent, ucmd, fwdAngs, qboolean(elapsedTime<850) )?qtrue:overridAngles; @@ -3780,7 +3799,6 @@ qboolean G_CheckClampUcmd( gentity_t *ent, usercmd_t *ucmd ) case BOTH_A7_KICK_RL: kickSoundOnWalls = qtrue; kickPush = Q_flrand( 150.0f, 250.0f );//Q_flrand( 75.0f, 125.0f ); - kickDamage += 4; //FIXME: auto aim at enemies on the side of us? //overridAngles = PM_AdjustAnglesForRLKick( ent, ucmd, fwdAngs, qboolean(elapsedTime<850) )?qtrue:overridAngles; if ( elapsedTime >= 250 && elapsedTime < 350 ) diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index fc695bd38f..ce8e41ad7d 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -1187,12 +1187,14 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch ent->footLBolt = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*l_leg_foot"); ent->footRBolt = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*r_leg_foot"); if ( ent->client->NPC_class == CLASS_BOBAFETT - || ent->client->NPC_class == CLASS_ROCKETTROOPER ) + || ent->client->NPC_class == CLASS_ROCKETTROOPER + || ent->client->NPC_class == CLASS_MANDA) {//get jet bolts ent->genericBolt1 = gi.G2API_AddBolt( &ent->ghoul2[ent->playerModel], "*jet1" ); ent->genericBolt2 = gi.G2API_AddBolt( &ent->ghoul2[ent->playerModel], "*jet2" ); } - if ( ent->client->NPC_class == CLASS_BOBAFETT ) + if ( ent->client->NPC_class == CLASS_BOBAFETT + || ent->client->NPC_class == CLASS_MANDA) {//get the flamethrower bolt ent->genericBolt3 = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*flamethrower"); } @@ -2024,7 +2026,8 @@ void G_ChangePlayerModel( gentity_t *ent, const char *newModel ) ClientUserinfoChanged( ent->s.number ); //Ugh, kind of a hack for now: if ( ent->client->NPC_class == CLASS_BOBAFETT - || ent->client->NPC_class == CLASS_ROCKETTROOPER ) + || ent->client->NPC_class == CLASS_ROCKETTROOPER + || ent->client->NPC_class == CLASS_MANDA) { //FIXME: remove saber, too? Boba_Precache(); // player as boba? diff --git a/code/game/g_combat.cpp b/code/game/g_combat.cpp index 2f10df06f9..08389d98cb 100644 --- a/code/game/g_combat.cpp +++ b/code/game/g_combat.cpp @@ -3812,7 +3812,8 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); //self->owner = old; } if ( self->client->NPC_class == CLASS_BOBAFETT - || self->client->NPC_class == CLASS_ROCKETTROOPER ) + || self->client->NPC_class == CLASS_ROCKETTROOPER + || self->client->NPC_class == CLASS_MANDA) { if ( self->client->moveType == MT_FLYSWIM ) { @@ -5448,6 +5449,7 @@ qboolean G_ImmuneToGas( gentity_t *ent ) || ent->client->NPC_class == CLASS_SWAMPTROOPER || ent->client->NPC_class == CLASS_TUSKEN || ent->client->NPC_class == CLASS_BOBAFETT + || ent->client->NPC_class == CLASS_MANDA || ent->client->NPC_class == CLASS_ROCKETTROOPER || ent->client->NPC_class == CLASS_SABER_DROID || ent->client->NPC_class == CLASS_ASSASSIN_DROID @@ -5776,6 +5778,12 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, const } } + //new client flags for damage reduction + if ((blasterDamage(mod) && targ->flags&FL_MAGPLATING) || (heavyDamage(mod) && targ->flags&FL_BLASTARMOR) || (mod == MOD_SABER && targ->flags&FL_CORTOSIS)) + { + damage /= 2; + } + if (targ && targ->client && !(dflags&DAMAGE_NO_PROTECTION) @@ -7036,3 +7044,44 @@ void G_RadiusDamage ( const vec3_t origin, gentity_t *attacker, float damage, fl } } } + +qboolean blasterDamage(int mod) { + switch (mod) { + case MOD_BRYAR: + case MOD_BRYAR_ALT: + case MOD_BLASTER: + case MOD_BLASTER_ALT: + case MOD_BOWCASTER: + case MOD_BOWCASTER_ALT: + case MOD_REPEATER: + //case MOD_DEMP2, + //case MOD_DEMP2_ALT, + //NEW for JKA weapons: + case MOD_CONC: + case MOD_CONC_ALT: + case MOD_SEEKER: + case MOD_EMPLACED: + return qtrue; + default: + return qfalse; + } +} + +qboolean heavyDamage(int mod) { + switch (mod) { + case MOD_REPEATER_ALT: + case MOD_FLECHETTE: + case MOD_FLECHETTE_ALT: + case MOD_ROCKET: + case MOD_ROCKET_ALT: + case MOD_THERMAL: + case MOD_THERMAL_ALT: + case MOD_DETPACK: + case MOD_LASERTRIP: + case MOD_LASERTRIP_ALT: + case MOD_MELEE: + return qtrue; + default: + return qfalse; + } +} diff --git a/code/game/g_local.h b/code/game/g_local.h index 661e2d42f9..9dae1815bb 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -76,6 +76,15 @@ along with this program; if not, see . #define FL_NO_ANGLES 0x00200000 // No bone angle overrides, no pitch or roll in full angles #define FL_RED_CROSSHAIR 0x00400000 // Crosshair red on me +//these can affect player and NPC abilities +#define FL_DUALPISTOLS 0x00800000 //gives dual pistols if WP_BLASTER_PISTOL +#define FL_MELEEKICKS 0x01000000 //allows melee kicks +#define FL_MELEEKATAS 0x02000000 //allows melee katas +#define FL_MELEEKATA_NOFORCEFX 0x04000000 //hack to stop melee katas from doing force power effects +#define FL_CORTOSIS 0x08000000 //halves damage from saber attacks +#define FL_MAGPLATING 0x10000000 //halves damage from blaster bolts +#define FL_BLASTARMOR 0x20000000 //halves damage from heavy weapons/explosives + //Pointer safety utilities #define VALID( a ) ( a != NULL ) diff --git a/code/game/g_missile.cpp b/code/game/g_missile.cpp index 1026a3ed5d..a5a14582de 100644 --- a/code/game/g_missile.cpp +++ b/code/game/g_missile.cpp @@ -40,6 +40,7 @@ extern qboolean PM_SaberInIdle( int move ); extern qboolean PM_SaberInAttack( int move ); extern qboolean PM_SaberInTransitionAny( int move ); extern qboolean PM_SaberInSpecialAttack( int anim ); +extern qboolean PM_WalkingOrIdle(gentity_t *self); //------------------------------------------------------------------------- void G_MissileBounceEffect( gentity_t *ent, vec3_t org, vec3_t dir, qboolean hitWorld ) @@ -185,10 +186,18 @@ void G_ReflectMissile(gentity_t *ent, gentity_t *missile, vec3_t forward, forceP enemy = owner->enemy; } - if (g_spskill->integer >= 2 && !g_saberAutoBlocking->integer && owner->client->ps.saberBlockingTime < level.time) + if (g_spskill->integer >= 2 + && !g_saberAutoBlocking->integer + && owner->client->ps.saberBlockingTime < level.time) {//but need to be blocking for perfect reflection on higher difficulties perfectReflection = qfalse; } + + if (!PM_WalkingOrIdle(ent) + || !PM_SaberInParry) + {//no perfect reflections for non-blockers + perfectReflection = qfalse; + } } if (perfectReflection) diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 4a9e0139c4..336559f1b4 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -480,6 +480,13 @@ struct gclient_s { //for trigger_space brushes int inSpaceSuffocation; int inSpaceIndex; + + //new fields + int saberReactivateTime; //time after something deactivates a saber for AI to turn it back on + int breakLimit; + int breakRecoveryTime; //how long left to recover a defense point + int breakCounter; //how many strong attacks have we blocked recently? + //qboolean saberDropped; //did we drop our saber throw? }; #define MAX_PARMS 16 @@ -658,12 +665,7 @@ Ghoul2 Insert End int pushDebounceTime; int aimDebounceTime; int useDebounceTime; - //new variables - int saberReactivateTime; //time after something deactivates a saber for AI to turn it back on - int breakLimit; - int breakRecoveryTime; //how long left to recover a defense point - int breakCounter; //keeping track of how many strong attacks the defender blocks in a short time period - qboolean saberDropped; //did we drop our saber throw? + //Unions for miscellaneous fields used under very specific circumstances union diff --git a/code/game/g_trigger.cpp b/code/game/g_trigger.cpp index 7af83e79e5..3f316c5ce9 100644 --- a/code/game/g_trigger.cpp +++ b/code/game/g_trigger.cpp @@ -1222,7 +1222,8 @@ void hurt_touch( gentity_t *self, gentity_t *other, trace_t *trace ) if ( self->spawnflags & 32 ) {//falling death if ( other->NPC && other->client && - (other->client->NPC_class == CLASS_BOBAFETT || other->client->NPC_class == CLASS_ROCKETTROOPER )) + (other->client->NPC_class == CLASS_BOBAFETT || other->client->NPC_class == CLASS_ROCKETTROOPER + || other->client->NPC_class == CLASS_MANDA)) {//boba never falls to his death! //FIXME: fall through if jetpack broken? JET_FlyStart(other); diff --git a/code/game/g_weaponLoad.cpp b/code/game/g_weaponLoad.cpp index fe0ada3091..15c6ff90ff 100644 --- a/code/game/g_weaponLoad.cpp +++ b/code/game/g_weaponLoad.cpp @@ -166,6 +166,9 @@ void WPN_AltSplashDamage(const char **holdBuf); void WPN_AltSplashRadius(const char **holdBuf); void WPN_Velocity(const char **holdBuf); void WPN_AltVelocity(const char **holdBuf); +void WPN_NPCDmgMult(const char **holdBuf); +void WPN_NPCDmgAltMult(const char **holdBuf); + // Legacy weapons.dat force fields void WPN_FuncSkip(const char **holdBuf); @@ -193,7 +196,7 @@ const int defaultDamage[] = { FLECHETTE_MINE_DAMAGE, // WP_DET_PACK // HACK, this is what the code sez. CONC_DAMAGE, // WP_CONCUSSION - 0, // WP_MELEE //right punch damage + RIGHT_PUNCH_DAMAGE, // WP_MELEE //right punch damage ATST_MAIN_DAMAGE, // WP_ATST_MAIN ATST_SIDE_MAIN_DAMAGE, // WP_ATST_SIDE @@ -230,7 +233,7 @@ const int defaultAltDamage[] = { FLECHETTE_MINE_DAMAGE, // WP_DET_PACK // HACK, this is what the code sez. CONC_ALT_DAMAGE, // WP_CONCUSION - 0, // WP_MELEE // handled by the melee attack function + LEFT_PUNCH_DAMAGE, // WP_MELEE // handled by the melee attack function ATST_MAIN_DAMAGE, // WP_ATST_MAIN ATST_SIDE_ALT_DAMAGE, // WP_ATST_SIDE @@ -267,7 +270,7 @@ const int defaultSplashDamage[] = { FLECHETTE_MINE_SPLASH_DAMAGE, // WP_DET_PACK // HACK, this is what the code sez. CONC_SPLASH_DAMAGE, // WP_CONCUSSION - 0, // WP_MELEE + KICK_DAMAGE, // WP_MELEE 0, // WP_ATST_MAIN ATST_SIDE_MAIN_SPLASH_DAMAGE, // WP_ATST_SIDE @@ -304,7 +307,7 @@ const float defaultSplashRadius[] = { FLECHETTE_MINE_SPLASH_RADIUS, // WP_DET_PACK // HACK, this is what the code sez. CONC_SPLASH_RADIUS, // WP_CONCUSSION - 0.0f, // WP_MELEE + HEAVY_MELEE_MULT, // WP_MELEE 0.0f, // WP_ATST_MAIN ATST_SIDE_MAIN_SPLASH_RADIUS, // WP_ATST_SIDE @@ -341,7 +344,7 @@ const int defaultAltSplashDamage[] = { FLECHETTE_MINE_SPLASH_DAMAGE, // WP_DET_PACK // HACK, this is what the code sez. 0, // WP_CONCUSSION - 0, // WP_MELEE // handled by the melee attack function + SPECIAL_KICK_DAMAGE, // WP_MELEE 0, // WP_ATST_MAIN ATST_SIDE_ALT_SPLASH_DAMAGE, // WP_ATST_SIDE @@ -378,7 +381,7 @@ const float defaultAltSplashRadius[] = { FLECHETTE_ALT_SPLASH_RAD, // WP_DET_PACK // HACK, this is what the code sez. 0.0f, // WP_CONCUSSION - 0.0f, // WP_MELEE // handled by the melee attack function + 0.0f, // WP_MELEE 0.0f, // WP_ATST_MAIN ATST_SIDE_ALT_SPLASH_RADIUS, // WP_ATST_SIDE @@ -415,7 +418,7 @@ const int defaultVelocity[WP_NUM_WEAPONS] = 0,//WP_TRIP_MINE, 0,//WP_DET_PACK, CONC_VELOCITY,//WP_CONCUSSION, - 0,//WP_MELEE, // Any ol' melee attack + KICK_DAMAGE_RANDOMNESS,//WP_MELEE, // Any ol' melee attack 0,//WP_STUN_BATON, BRYAR_PISTOL_VEL,//WP_BRYAR_PISTOL, EMPLACED_VEL,//WP_EMPLACED_GUN, @@ -448,7 +451,7 @@ const int defaultAltVelocity[WP_NUM_WEAPONS] = 0,//WP_TRIP_MINE, 0,//WP_DET_PACK, Q3_INFINITE,//WP_CONCUSSION, - 0,//WP_MELEE, // Any ol' melee attack + HEAVY_MELEE_RANDOMNESS,//WP_MELEE, // Any ol' melee attack 0,//WP_STUN_BATON, BRYAR_PISTOL_VEL,//WP_BRYAR_PISTOL, EMPLACED_VEL,//WP_EMPLACED_GUN, @@ -1590,6 +1593,8 @@ void WP_LoadWeaponParms (void) weaponData[i].altSplashRadius = defaultAltSplashRadius[i]; weaponData[i].velocity = defaultVelocity[i]; weaponData[i].altVelocity = defaultAltVelocity[i]; + weaponData[i].npcDmgMult = 1.0; + weaponData[i].npcAltDmgMult = 1.0; } WP_ParseParms(buffer); diff --git a/code/game/teams.h b/code/game/teams.h index 928f572e99..12914cafa4 100644 --- a/code/game/teams.h +++ b/code/game/teams.h @@ -106,6 +106,9 @@ typedef enum CLASS_HAZARD_TROOPER, CLASS_PLAYER, CLASS_VEHICLE, + CLASS_CULTIST, + CLASS_WOOKIEE, + CLASS_MANDA, CLASS_NUM_CLASSES } class_t; diff --git a/code/game/weapons.h b/code/game/weapons.h index c9f198016c..24a76fae60 100644 --- a/code/game/weapons.h +++ b/code/game/weapons.h @@ -120,8 +120,8 @@ typedef struct weaponData_s int ammoLow; // Count when ammo is low int energyPerShot; // Amount of energy used per shot - int fireTime; // Amount of time between firings - int range; // Range of weapon + int fireTime; // Amount of time between firings, saber ignition time (WP_SABER) + int range; // Range of weapon, saber deignition time (WP_SABER) int altEnergyPerShot; // Amount of energy used for alt-fire int altFireTime; // Amount of time between alt-firings @@ -150,16 +150,19 @@ typedef struct weaponData_s char mAltMuzzleEffect[64]; int mAltMuzzleEffectID; - int damage; - int altDamage; - int splashDamage; - int altSplashDamage; - float splashRadius; + //values are self-explanatory except for WP_MELEE + int damage; //MELEE: right punch dmg + int altDamage; //MELEE: left punch dmg + int splashDamage; //MELEE: regular kick dmg + int altSplashDamage; //MELEE: mid-air/special kick dmg + float splashRadius; //MELEE: how much to multiply punch dmg for heavy punches float altSplashRadius; - int velocity; - int altVelocity; - int npcDmgMult; - int npcAltDmgMult; + int velocity; //MELEE: dmg randomness is +/- this amount for all kicks + int altVelocity; //MELEE: dmg randomness is +/- this amount for heavy punches + float npcDmgMult; //scales the damage NPCs do with primary fire + float npcAltDmgMult; //scales the damage NPCs do with alt fire + int npcFireTime; + int npcAltFireTime; } weaponData_t; @@ -174,9 +177,13 @@ typedef struct ammoData_s // Melee //-------- #define RIGHT_PUNCH_DAMAGE 6 -#define LEFT_PUNCH_DAMAGE 3 -#define KICK_DAMAGE 14 -#define HEAVY_RIGHT_DAMAGE 24 +#define LEFT_PUNCH_DAMAGE 3 +#define HEAVY_MELEE_MULT 4.0 +#define HEAVY_MELEE_RANDOMNESS 0 +#define KICK_DAMAGE 5 +#define SPECIAL_KICK_DAMAGE 10 +#define KICK_DAMAGE_RANDOMNESS 1 + // Lightsaber //-------- @@ -400,5 +407,13 @@ typedef struct ammoData_s #define TUSKEN_RIFLE_DAMAGE_MEDIUM 30 // very damaging #define TUSKEN_RIFLE_DAMAGE_HARD 50 // extremely damaging +// Noghri Stick +//-------------- +#define NOGHRI_STICK_VEL 1200 +#define NOGHRI_STICK_DAMAGE 10 +#define NOGHRI_STICK_DAMAGE_EASY 1 +#define NOGHRI_STICK_DAMAGE_MEDIUM 5 +#define NOGHRI_STICK_DAMAGE_HARD 10 + #endif//#ifndef __WEAPONS_H__ diff --git a/code/game/wp_atst.cpp b/code/game/wp_atst.cpp index 2ec17bbbe4..f6ab553f74 100644 --- a/code/game/wp_atst.cpp +++ b/code/game/wp_atst.cpp @@ -97,6 +97,8 @@ void WP_ATSTSideAltFire( gentity_t *ent ) { damage = ATST_SIDE_ROCKET_NPC_DAMAGE_HARD; } + + damage *= weaponData[WP_ATST_SIDE].npcAltDmgMult; } VectorCopy( forwardVec, missile->movedir ); @@ -146,6 +148,8 @@ void WP_ATSTSideFire( gentity_t *ent ) { damage = ATST_SIDE_MAIN_NPC_DAMAGE_HARD; } + + damage *= weaponData[WP_ATST_SIDE].npcDmgMult; } VectorSet( missile->maxs, ATST_SIDE_MAIN_SIZE, ATST_SIDE_MAIN_SIZE, ATST_SIDE_MAIN_SIZE ); diff --git a/code/game/wp_blaster_pistol.cpp b/code/game/wp_blaster_pistol.cpp index 658de4a26e..3a79b2164f 100644 --- a/code/game/wp_blaster_pistol.cpp +++ b/code/game/wp_blaster_pistol.cpp @@ -38,6 +38,11 @@ void WP_FireBryarPistol( gentity_t *ent, qboolean alt_fire ) int damage = !alt_fire ? weaponData[WP_BRYAR_PISTOL].damage : weaponData[WP_BRYAR_PISTOL].altDamage; int velocity = !alt_fire ? weaponData[WP_BRYAR_PISTOL].velocity : weaponData[WP_BRYAR_PISTOL].altVelocity; + if (ent->s.number != 0 && ent->client->NPC_class != CLASS_BOBAFETT && ent->client->NPC_class != CLASS_MANDA) + { + damage *= weaponData[WP_BRYAR_PISTOL].npcDmgMult; + } + VectorCopy( muzzle, start ); WP_TraceSetStart( ent, start, vec3_origin, vec3_origin );//make sure our start point isn't on the other side of a wall diff --git a/code/game/wp_blaster_rifle.cpp b/code/game/wp_blaster_rifle.cpp index bd8361fefa..08ffab0a52 100644 --- a/code/game/wp_blaster_rifle.cpp +++ b/code/game/wp_blaster_rifle.cpp @@ -46,7 +46,8 @@ void WP_FireBlasterMissile( gentity_t *ent, vec3_t start, vec3_t dir, qboolean a else { // If an enemy is shooting at us, lower the velocity so you have a chance to evade - if ( ent->client && ent->client->ps.clientNum != 0 && ent->client->NPC_class != CLASS_BOBAFETT ) + if ( ent->client && ent->client->ps.clientNum != 0 && ent->client->NPC_class != CLASS_BOBAFETT + && ent->client->NPC_class != CLASS_MANDA && ent->client->NPC_class != CLASS_COMMANDO) { if ( g_spskill->integer < 2 ) { @@ -55,7 +56,7 @@ void WP_FireBlasterMissile( gentity_t *ent, vec3_t start, vec3_t dir, qboolean a else { velocity *= BLASTER_NPC_HARD_VEL_CUT; - } + } } } @@ -69,7 +70,10 @@ void WP_FireBlasterMissile( gentity_t *ent, vec3_t start, vec3_t dir, qboolean a missile->s.weapon = WP_BLASTER; // Do the damages - if ( ent->s.number != 0 && ent->client->NPC_class != CLASS_BOBAFETT ) + if (ent->s.number != 0 + && ent->client->NPC_class != CLASS_BOBAFETT + && ent->client->NPC_class != CLASS_MANDA + && ent->client->NPC_class == CLASS_COMMANDO) { if ( g_spskill->integer == 0 ) { @@ -83,6 +87,8 @@ void WP_FireBlasterMissile( gentity_t *ent, vec3_t start, vec3_t dir, qboolean a { damage = BLASTER_NPC_DAMAGE_HARD; } + + damage *= weaponData[WP_BLASTER].npcDmgMult; } // if ( ent->client ) diff --git a/code/game/wp_bowcaster.cpp b/code/game/wp_bowcaster.cpp index 24a6dba785..2e24a5a736 100644 --- a/code/game/wp_bowcaster.cpp +++ b/code/game/wp_bowcaster.cpp @@ -57,6 +57,8 @@ static void WP_BowcasterMainFire( gentity_t *ent ) { damage = BOWCASTER_NPC_DAMAGE_HARD; } + + damage *= weaponData[WP_BLASTER].npcDmgMult; } count = ( level.time - ent->client->ps.weaponChargeTime ) / BOWCASTER_CHARGE_UNIT; @@ -144,7 +146,7 @@ static void WP_BowcasterAltFire( gentity_t *ent ) WP_MissileTargetHint(ent, start, forwardVec); - gentity_t *missile = CreateMissile( start, forwardVec, WP_SpeedOfMissileForWeapon(WP_BOWCASTER, 1), 10000, ent, qtrue ); + gentity_t *missile = CreateMissile(start, forwardVec, weaponData[WP_BOWCASTER].altVelocity, 10000, ent, qtrue); missile->classname = "bowcaster_alt_proj"; missile->s.weapon = WP_BOWCASTER; @@ -164,6 +166,8 @@ static void WP_BowcasterAltFire( gentity_t *ent ) { damage = BOWCASTER_NPC_DAMAGE_HARD; } + + damage *= weaponData[WP_BLASTER].npcAltDmgMult; } VectorSet( missile->maxs, BOWCASTER_SIZE, BOWCASTER_SIZE, BOWCASTER_SIZE ); diff --git a/code/game/wp_concussion.cpp b/code/game/wp_concussion.cpp index 53ea7600bd..4efa3644ff 100644 --- a/code/game/wp_concussion.cpp +++ b/code/game/wp_concussion.cpp @@ -81,6 +81,8 @@ static void WP_FireConcussionAlt( gentity_t *ent ) damage = CONC_ALT_NPC_DAMAGE_HARD; break; } + + damage *= weaponData[WP_CONCUSSION].npcAltDmgMult; } VectorCopy( muzzle, start ); WP_TraceSetStart( ent, start, vec3_origin, vec3_origin ); @@ -141,7 +143,7 @@ static void WP_FireConcussionAlt( gentity_t *ent ) traceEnt = &g_entities[tr.entityNum]; if ( traceEnt //&& traceEnt->NPC - && ( traceEnt->s.weapon == WP_SABER || (traceEnt->client && (traceEnt->client->NPC_class == CLASS_BOBAFETT||traceEnt->client->NPC_class == CLASS_REBORN) ) ) ) + && (traceEnt->s.weapon == WP_SABER || (traceEnt->client && (traceEnt->client->NPC_class == CLASS_BOBAFETT || traceEnt->client->NPC_class == CLASS_MANDA || traceEnt->client->NPC_class == CLASS_COMMANDO||traceEnt->client->NPC_class == CLASS_REBORN)))) {//FIXME: need a more reliable way to know we hit a jedi? hitDodged = Jedi_DodgeEvasion( traceEnt, ent, &tr, HL_NONE ); //acts like we didn't even hit him @@ -301,6 +303,8 @@ static void WP_FireConcussion( gentity_t *ent ) { damage = CONC_NPC_DAMAGE_HARD; } + + damage *= weaponData[WP_BLASTER].npcDmgMult; } // Make it easier to hit things diff --git a/code/game/wp_demp2.cpp b/code/game/wp_demp2.cpp index 14743f137b..50e9f555ae 100644 --- a/code/game/wp_demp2.cpp +++ b/code/game/wp_demp2.cpp @@ -63,6 +63,8 @@ static void WP_DEMP2_MainFire( gentity_t *ent ) { damage = DEMP2_NPC_DAMAGE_HARD; } + + damage *= weaponData[WP_BLASTER].npcDmgMult; } VectorSet( missile->maxs, DEMP2_SIZE, DEMP2_SIZE, DEMP2_SIZE ); diff --git a/code/game/wp_disruptor.cpp b/code/game/wp_disruptor.cpp index 6cebd8de6f..7ef46b7304 100644 --- a/code/game/wp_disruptor.cpp +++ b/code/game/wp_disruptor.cpp @@ -56,6 +56,8 @@ static void WP_DisruptorMainFire( gentity_t *ent ) damage = DISRUPTOR_NPC_MAIN_DAMAGE_HARD; break; } + + damage *= weaponData[WP_DISRUPTOR].npcDmgMult; } VectorCopy( muzzle, start ); @@ -78,7 +80,7 @@ static void WP_DisruptorMainFire( gentity_t *ent ) traceEnt = &g_entities[tr.entityNum]; if ( traceEnt - && ( traceEnt->s.weapon == WP_SABER || (traceEnt->client && (traceEnt->client->NPC_class == CLASS_BOBAFETT||traceEnt->client->NPC_class == CLASS_REBORN) ) ) ) + && (traceEnt->s.weapon == WP_SABER || (traceEnt->client && (traceEnt->client->NPC_class == CLASS_BOBAFETT || traceEnt->client->NPC_class == CLASS_MANDA || traceEnt->client->NPC_class == CLASS_COMMANDO || traceEnt->client->NPC_class == CLASS_REBORN)))) {//FIXME: need a more reliable way to know we hit a jedi? if ( Jedi_DodgeEvasion( traceEnt, ent, &tr, HL_NONE ) ) {//act like we didn't even hit him @@ -173,6 +175,9 @@ void WP_DisruptorAltFire( gentity_t *ent ) damage = DISRUPTOR_NPC_ALT_DAMAGE_HARD; break; } + + damage *= weaponData[WP_DISRUPTOR].npcAltDmgMult; + VectorCopy( muzzle, start ); fullCharge = qtrue; @@ -260,7 +265,7 @@ void WP_DisruptorAltFire( gentity_t *ent ) traceEnt = &g_entities[tr.entityNum]; if ( traceEnt //&& traceEnt->NPC - && ( traceEnt->s.weapon == WP_SABER || (traceEnt->client && (traceEnt->client->NPC_class == CLASS_BOBAFETT||traceEnt->client->NPC_class == CLASS_REBORN) ) ) ) + && (traceEnt->s.weapon == WP_SABER || (traceEnt->client && (traceEnt->client->NPC_class == CLASS_BOBAFETT || traceEnt->client->NPC_class == CLASS_MANDA || traceEnt->client->NPC_class == CLASS_COMMANDO || traceEnt->client->NPC_class == CLASS_REBORN)))) {//FIXME: need a more reliable way to know we hit a jedi? hitDodged = Jedi_DodgeEvasion( traceEnt, ent, &tr, HL_NONE ); //acts like we didn't even hit him diff --git a/code/game/wp_melee.cpp b/code/game/wp_melee.cpp index de3184219b..0112d13ac7 100644 --- a/code/game/wp_melee.cpp +++ b/code/game/wp_melee.cpp @@ -32,7 +32,7 @@ void WP_Melee( gentity_t *ent ) gentity_t *tr_ent; trace_t tr; vec3_t mins, maxs, end; - int damage = 5; + int damage = weaponData[WP_MELEE].altDamage; float range = ent->s.number ? 48 : 32; VectorMA( muzzle, range, forwardVec, end ); @@ -57,9 +57,8 @@ void WP_Melee( gentity_t *ent ) { if (ent->client->ps.torsoAnim == BOTH_MELEE2) { - damage = 7; + damage = weaponData[WP_MELEE].damage; } - //else damage = 5 } if ( tr_ent && tr_ent->takedamage ) @@ -67,10 +66,10 @@ void WP_Melee( gentity_t *ent ) int dflags = DAMAGE_NO_KNOCKBACK; G_PlayEffect( G_EffectIndex( "melee/punch_impact" ), tr.endpos, forwardVec ); //G_Sound( tr_ent, G_SoundIndex( va("sound/weapons/melee/punch%d", Q_irand(1, 4)) ) ); - if ( ent->NPC && (ent->NPC->aiFlags&NPCAI_HEAVY_MELEE) ) + if ( (ent->NPC && (ent->NPC->aiFlags&NPCAI_HEAVY_MELEE))) { //4x damage for heavy melee class - damage = 5; - damage *= 4 + Q_irand(-3, 3); + damage *= weaponData[WP_MELEE].splashRadius; + damage += Q_irand(-1 * weaponData[WP_MELEE].altSplashRadius, weaponData[WP_MELEE].altSplashRadius); dflags &= ~DAMAGE_NO_KNOCKBACK; dflags |= DAMAGE_DISMEMBER; } diff --git a/code/game/wp_noghri_stick.cpp b/code/game/wp_noghri_stick.cpp index 35107713b0..bfbe47ad3c 100644 --- a/code/game/wp_noghri_stick.cpp +++ b/code/game/wp_noghri_stick.cpp @@ -45,7 +45,7 @@ void WP_FireNoghriStick( gentity_t *ent ) AngleVectors( angs, dir, NULL, NULL ); // FIXME: if temp_org does not have clear trace to inside the bbox, don't shoot! - int velocity = 1200; + int velocity = weaponData[WP_NOGHRI_STICK].velocity;//1200; WP_TraceSetStart( ent, muzzle, vec3_origin, vec3_origin );//make sure our start point isn't on the other side of a wall @@ -61,16 +61,21 @@ void WP_FireNoghriStick( gentity_t *ent ) { if ( g_spskill->integer == 0 ) { - missile->damage = 1; + missile->damage = NOGHRI_STICK_DAMAGE_EASY; } else if ( g_spskill->integer == 1 ) { - missile->damage = 5; + missile->damage = NOGHRI_STICK_DAMAGE_MEDIUM; } else { - missile->damage = 10; + missile->damage = NOGHRI_STICK_DAMAGE_HARD; } + + missile->damage *= weaponData[WP_NOGHRI_STICK].npcDmgMult; + } + else { + missile->damage = weaponData[WP_NOGHRI_STICK].damage; } // if ( ent->client ) diff --git a/code/game/wp_repeater.cpp b/code/game/wp_repeater.cpp index da737c1ecf..918a889ae2 100644 --- a/code/game/wp_repeater.cpp +++ b/code/game/wp_repeater.cpp @@ -36,13 +36,14 @@ static void WP_RepeaterMainFire( gentity_t *ent, vec3_t dir ) { vec3_t start; int damage = weaponData[WP_REPEATER].damage; + int vel = weaponData[WP_REPEATER].velocity; VectorCopy( muzzle, start ); WP_TraceSetStart( ent, start, vec3_origin, vec3_origin );//make sure our start point isn't on the other side of a wall WP_MissileTargetHint(ent, start, dir); - gentity_t *missile = CreateMissile( start, dir, REPEATER_VELOCITY, 10000, ent ); + gentity_t *missile = CreateMissile( start, dir, vel, 10000, ent ); missile->classname = "repeater_proj"; missile->s.weapon = WP_REPEATER; @@ -62,6 +63,8 @@ static void WP_RepeaterMainFire( gentity_t *ent, vec3_t dir ) { damage = REPEATER_NPC_DAMAGE_HARD; } + + damage = weaponData[WP_REPEATER].npcDmgMult; } // if ( ent->client && ent->client->ps.powerups[PW_WEAPON_OVERCHARGE] > 0 && ent->client->ps.powerups[PW_WEAPON_OVERCHARGE] > cg.time ) @@ -86,6 +89,7 @@ static void WP_RepeaterAltFire( gentity_t *ent ) { vec3_t start; int damage = weaponData[WP_REPEATER].altDamage; + int vel = weaponData[WP_REPEATER].altVelocity; gentity_t *missile = NULL; VectorCopy( muzzle, start ); @@ -98,7 +102,7 @@ static void WP_RepeaterAltFire( gentity_t *ent ) else { WP_MissileTargetHint(ent, start, forwardVec); - missile = CreateMissile( start, forwardVec, REPEATER_ALT_VELOCITY, 10000, ent, qtrue ); + missile = CreateMissile( start, forwardVec, vel, 10000, ent, qtrue ); } missile->classname = "repeater_alt_proj"; @@ -120,6 +124,8 @@ static void WP_RepeaterAltFire( gentity_t *ent ) { damage = REPEATER_ALT_NPC_DAMAGE_HARD; } + + weaponData[WP_REPEATER].npcAltDmgMult; } VectorSet( missile->maxs, REPEATER_ALT_SIZE, REPEATER_ALT_SIZE, REPEATER_ALT_SIZE ); diff --git a/code/game/wp_rocket_launcher.cpp b/code/game/wp_rocket_launcher.cpp index c4890a0b87..b0c8b241f6 100644 --- a/code/game/wp_rocket_launcher.cpp +++ b/code/game/wp_rocket_launcher.cpp @@ -175,7 +175,7 @@ void WP_FireRocket( gentity_t *ent, qboolean alt_fire ) { vec3_t start; int damage = weaponData[WP_ROCKET_LAUNCHER].damage; - float vel = ROCKET_VELOCITY; + float vel = weaponData[WP_ROCKET_LAUNCHER].velocity; if ( alt_fire ) { @@ -206,10 +206,12 @@ void WP_FireRocket( gentity_t *ent, qboolean alt_fire ) { damage = ROCKET_NPC_DAMAGE_HARD; } - if (ent->client && ent->client->NPC_class==CLASS_BOBAFETT) + if (ent->client && (ent->client->NPC_class == CLASS_BOBAFETT || ent->client->NPC_class == CLASS_MANDA)) { damage = damage/2; } + + damage = weaponData[WP_ROCKET_LAUNCHER].npcDmgMult; } if ( alt_fire ) diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 872bb5e19b..9efaa1d2e4 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -31,8 +31,16 @@ along with this program; if not, see . #include "../cgame/cg_local.h" #define JK2_RAGDOLL_GRIPNOHEALTH - #define MAX_SABER_VICTIMS 16 + +#define HITOWNER_RECOVERY_INTERVAL 1000 //interval at which defense points are recovered in ms +#define HITOWNER_BASE_DP 1 +#define HITOWNER_SD_DP_INCREASE 1 + +#define BLOCK_DELAY_MULT 5 //scales base debounce speed for Medium/Strong/Desann styles +#define SLOW_BLOCK_DELAY_MULT 1.75 //further scales debounce time after deflection for Strong/Desann style +//#define RUN_BLOCK_DELAY_MULT 1.5 //further scales debounce time after deflection while running + static int victimEntityNum[MAX_SABER_VICTIMS]; static float totalDmg[MAX_SABER_VICTIMS]; static vec3_t dmgDir[MAX_SABER_VICTIMS]; @@ -194,14 +202,6 @@ qboolean g_saberNoEffects = qfalse; qboolean g_noClashFlare = qfalse; int g_saberFlashTime = 0; -//new variables - Dusty -const int HITOWNER_RECOVERY_INTERVAL = 1000; //interval at which defense points are recovered, 1.5 seconds -const float BLOCK_SPEED = 5; //affects player's blocking speed -const float SLOW_BLOCK_FACTOR = 1.75; -const float RUN_BLOCK_FACTOR = 1.5; -/*extern int hitOwnerBreakLimit; -extern int hitOwnerRecoveryTime; //how long left to recover a defense point -extern int hitOwnerBreakCounter; //keeping track of how many strong attacks the defender blocks in a //a short time period*/ qboolean NPC_JediClass(gentity_t *self) { switch (self->client->NPC_class) { @@ -1801,7 +1801,9 @@ qboolean WP_SaberApplyDamage(gentity_t *ent, float baseDamage, int baseDFlags, { damage = ceil(totalDmg[i]); } + G_Damage(victim, inflictor, ent, dmgDir[i], dmgSpot[i], damage, dFlags, MOD_SABER, hitDismemberLoc[i]); + if (damage > 0 && cg.time) { float sizeTimeScale = 1.0f; @@ -2940,7 +2942,7 @@ qboolean WP_SaberDamageForTrace(int ignore, vec3_t start, vec3_t end, float dmg, if (attacker && attacker->client && attacker->client->ps.saberInFlight) {//thrown saber hit something - if ((hitEnt && hitEnt->client && hitEnt->health > 0 && (hitEnt->client->NPC_class == CLASS_DESANN || !Q_stricmp("Yoda", hitEnt->NPC_type) || hitEnt->client->NPC_class == CLASS_LUKE || hitEnt->client->NPC_class == CLASS_BOBAFETT || (hitEnt->client->ps.powerups[PW_GALAK_SHIELD] > 0))) || + if ((hitEnt && hitEnt->client && hitEnt->health > 0 && (hitEnt->client->NPC_class == CLASS_DESANN || !Q_stricmp("Yoda", hitEnt->NPC_type) || hitEnt->client->NPC_class == CLASS_LUKE || hitEnt->client->NPC_class == CLASS_BOBAFETT || hitEnt->client->NPC_class == CLASS_MANDA || (hitEnt->client->ps.powerups[PW_GALAK_SHIELD] > 0))) || (owner && owner->client && owner->health > 0 && (owner->client->NPC_class == CLASS_DESANN || !Q_stricmp("Yoda", owner->NPC_type) || owner->client->NPC_class == CLASS_LUKE || (owner->client->ps.powerups[PW_GALAK_SHIELD] > 0)))) {//Luke and Desann slap thrown sabers aside //FIXME: control the direction of the thrown saber... if hit Galak's shield, bounce directly away from his origin? @@ -3318,7 +3320,9 @@ qboolean WP_SabersCheckLock2(gentity_t *attacker, gentity_t *defender, sabersLoc case LOCK_KYLE_GRAB3: attAnim = BOTH_KYLE_PA_2; defAnim = BOTH_PLAYER_PA_2; - defender->forcePushTime = level.time + PM_AnimLength(defender->client->clientInfo.animFileIndex, BOTH_PLAYER_PA_2); + if (!(attacker->flags&FL_MELEEKATA_NOFORCEFX)) { + defender->forcePushTime = level.time + PM_AnimLength(defender->client->clientInfo.animFileIndex, BOTH_PLAYER_PA_2); + } numSpins = 3.0f; break; } @@ -6647,7 +6651,7 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) if (hitOwner && hitOwner->client) { hitOwnerPowerLevel = 2 * hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1; - hitOwner->breakLimit = 1 + hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; + hitOwner->client->breakLimit = HITOWNER_BASE_DP + hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]*HITOWNER_SD_DP_INCREASE; hitOwnerAnimLevel = PM_PowerLevelForSaberAnim(&hitOwner->client->ps, saberNum); } @@ -6676,7 +6680,7 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) inFlightSaberBlocked = qtrue; } - //hitOwner BreakCounter, BreakLimit, RecoveryInterval, RecoveryTime + //hitOwner client->breakCounter, client->breakLimit, RecoveryInterval, RecoveryTime //how many strong attacks (where saber offense + saber style modifier total power is greater than defender's defense strength) can be deflected before defender gets tired and his defense breaks, saber defense 1 is 1 hit, 2 is 2 hits, etc. //FIXME: based on strength, position and angle of attack & defense, decide if: @@ -6900,7 +6904,7 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) //Ended up not Saber Locking else if (saberHitFraction < 1.0f) {//an actual collision - if ((hitOwner->breakCounter <= hitOwner->breakLimit) && activeDefense) + if ((hitOwner->client->breakCounter <= hitOwner->client->breakLimit) && activeDefense) {//tired defenders cannot deflect //based on angle of attack & angle of defensive saber, see if I should deflect off in another dir rather than bounce back deflected = WP_GetSaberDeflectionAngle(ent, hitOwner); @@ -6911,12 +6915,12 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) { //if the attack was strong add to the stagger/break counter here if (!PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) { //special attacks just break, no counters - hitOwner->breakCounter += (entPowerLevel - hitOwnerPowerLevel); - if (hitOwner->breakCounter > hitOwner->breakLimit + 2) + hitOwner->client->breakCounter += (entPowerLevel - hitOwnerPowerLevel); + if (hitOwner->client->breakCounter > hitOwner->client->breakLimit + 2) { - hitOwner->breakCounter = hitOwner->breakLimit + 2; //maximum + hitOwner->client->breakCounter = hitOwner->client->breakLimit + 2; //maximum } - hitOwner->breakRecoveryTime = level.time + HITOWNER_RECOVERY_INTERVAL; + hitOwner->client->breakRecoveryTime = level.time + HITOWNER_RECOVERY_INTERVAL; } } //base parry breaks on combination of animation (saber attack level) and FP_SABER_OFFENSE @@ -6928,7 +6932,7 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) {//knockaways can make fast-attacker go into a broken parry anim if the ent is using fast or med (but not Tavion) //make me parry WP_SaberParryNew(hitOwner, ent, saberNum, bladeNum); - if (hitOwner->breakLimit - hitOwner->breakCounter >= 1 //at least 1 BP + if (hitOwner->client->breakLimit - hitOwner->client->breakCounter >= 1 //at least 1 BP && !PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) {//special attacks can't be interrupted... just semi-blocked... //turn the parry into a knockaway @@ -6965,7 +6969,7 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) #endif } else if (!activeDefense//they're not defending i.e. not holding +block with auto-blocking turned off? - || (hitOwner->breakCounter > hitOwner->breakLimit //too tired to defend strong attacks + || (hitOwner->client->breakCounter > hitOwner->client->breakLimit //too tired to defend strong attacks && hitOwnerPowerLevel < entPowerLevel) || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim))//they are defending, but their defense strength is lower than my attack... //or they are doing a special which has slightly @@ -7688,6 +7692,7 @@ void WP_SaberImpact(gentity_t *owner, gentity_t *saber, trace_t *trace) && ((other->NPC && (other->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) //|| other->client->NPC_class == CLASS_ALORA || other->client->NPC_class == CLASS_BOBAFETT + || other->client->NPC_class == CLASS_MANDA || (other->client->ps.powerups[PW_GALAK_SHIELD] > 0))) {//Luke, Desann and Tavion slap thrown sabers aside WP_SaberDrop(owner, saber); @@ -9381,7 +9386,7 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) return; } - if (self->client->NPC_class == CLASS_ROCKETTROOPER) + if (self->client->NPC_class == CLASS_ROCKETTROOPER || self->client->NPC_class == CLASS_MANDA) {//rockettrooper if (self->client->ps.groundEntityNum != ENTITYNUM_NONE) {//must be in air @@ -9406,13 +9411,14 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) if (self->client->NPC_class == CLASS_BOBAFETT) {//Boba doesn't dodge quite as much + //Manda does because saber throws don't bounce off him if (Q_irand(0, 2 - g_spskill->integer)) {//easier level guys do this less return; } } - if (self->client->NPC_class != CLASS_BOBAFETT + if (self->client->NPC_class != CLASS_BOBAFETT && self->client->NPC_class != CLASS_MANDA && (self->client->NPC_class != CLASS_REBORN || self->s.weapon == WP_SABER) && (self->client->NPC_class != CLASS_ROCKETTROOPER || !self->NPC || self->NPC->rankclient->ps.forceJumpCharge = 480; } else if (self->client->NPC_class != CLASS_BOBAFETT + && self->client->NPC_class != CLASS_MANDA && (self->client->NPC_class != CLASS_REBORN || self->s.weapon == WP_SABER) && self->client->NPC_class != CLASS_ROCKETTROOPER) {//FIXME: check forcePushRadius[NPC->client->ps.forcePowerLevel[FP_PUSH]] @@ -9624,7 +9631,8 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) else { if (self->client->NPC_class == CLASS_BOBAFETT - || self->client->NPC_class == CLASS_ROCKETTROOPER) + || self->client->NPC_class == CLASS_ROCKETTROOPER + || self->client->NPC_class == CLASS_MANDA) { /* if ( ent->s.pos.trType == TR_STATIONARY && (ent->s.eFlags&EF_MISSILE_STICK) ) @@ -9747,7 +9755,7 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) { Jedi_Ambush(self); } - if ((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_ROCKETTROOPER) + if ((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA || self->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->moveType == MT_FLYSWIM && incoming->methodOfDeath != MOD_ROCKET_ALT) {//a hovering Boba Fett, not a tracking rocket @@ -9766,6 +9774,7 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) && Jedi_SaberBlockGo(self, &self->NPC->last_ucmd, NULL, NULL, incoming) != EVASION_NONE) {//make sure to turn on your saber if it's not on if (self->client->NPC_class != CLASS_BOBAFETT + && self->client->NPC_class != CLASS_MANDA && (self->client->NPC_class != CLASS_REBORN || self->s.weapon == WP_SABER)) { self->client->ps.SaberActivate(); @@ -9952,6 +9961,16 @@ void WP_SaberUpdate(gentity_t *self, usercmd_t *ucmd) self->client->ps.saberBlocking = BLK_WIDE; } } + else if (self->s.number > 0) + { + if (self->client->ps.saber[0].saberFlags&SFL_NOT_ACTIVE_BLOCKING || self->client->ps.forcePowerLevel[FP_SABER_DEFENSE] == 0) + {//NPCs get a *slightly* smaller block angle if they aren't *really* blocking + if (self->client->ps.saberMove == LS_READY) + { + self->client->ps.saberBlocking = BLK_TIGHT; + } + } + } if (noBlocking) @@ -10970,16 +10989,18 @@ void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) if (self->health <= 0) { return; - }/* + } + if (!WP_ForcePowerUsable(self, FP_PUSH, 0) && !pull) {//don't know this power return; } + if (!WP_ForcePowerUsable(self, FP_PULL, 0) && pull) {//don't know this power return; } - */ + if (self->client->ps.leanofs) {//can't force-throw while leaning return; @@ -11506,6 +11527,8 @@ void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) && push_list[x]->client->NPC_class != CLASS_ROCKETTROOPER//rockettroopers never drop their weapon && push_list[x]->client->NPC_class != CLASS_VEHICLE && push_list[x]->client->NPC_class != CLASS_BOBAFETT + && push_list[x]->client->NPC_class != CLASS_MANDA + && push_list[x]->client->NPC_class != CLASS_COMMANDO && push_list[x]->client->NPC_class != CLASS_TUSKEN && push_list[x]->client->NPC_class != CLASS_HAZARD_TROOPER && push_list[x]->client->NPC_class != CLASS_ASSASSIN_DROID @@ -12477,6 +12500,8 @@ void ForceTelepathy(gentity_t *self) case CLASS_ASSASSIN_DROID: case CLASS_SABER_DROID: case CLASS_BOBAFETT: + case CLASS_MANDA: + case CLASS_COMMANDO: break; case CLASS_RANCOR: if (!(traceEnt->spawnflags & 1)) @@ -12892,11 +12917,15 @@ void ForceGrip(gentity_t *self) && traceEnt->client->NPC_class != CLASS_HAZARD_TROOPER && traceEnt->client->NPC_class != CLASS_TUSKEN && traceEnt->client->NPC_class != CLASS_BOBAFETT + && traceEnt->client->NPC_class != CLASS_MANDA + && traceEnt->client->NPC_class != CLASS_COMMANDO && traceEnt->client->NPC_class != CLASS_ASSASSIN_DROID && traceEnt->s.weapon != WP_CONCUSSION // so rax can't drop his ) { - if (traceEnt->client->NPC_class == CLASS_BOBAFETT) + if (traceEnt->client->NPC_class == CLASS_BOBAFETT + || traceEnt->client->NPC_class == CLASS_MANDA + || traceEnt->client->NPC_class == CLASS_COMMANDO) {//he doesn't drop them, just puts it away ChangeWeapon(traceEnt, WP_MELEE); } @@ -14599,6 +14628,7 @@ void ForceJump(gentity_t *self, usercmd_t *ucmd) } if (self->client->NPC_class == CLASS_BOBAFETT + || self->client->NPC_class == CLASS_MANDA || self->client->NPC_class == CLASS_ROCKETTROOPER) { if (self->client->ps.forceJumpCharge > 300) @@ -14623,7 +14653,7 @@ void ForceJump(gentity_t *self, usercmd_t *ucmd) switch (WP_GetVelocityForForceJump(self, jumpVel, ucmd)) { case FJ_FORWARD: - if (((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forceJumpCharge > 300) + if (((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA || self->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forceJumpCharge > 300) || (self->client->ps.saber[0].saberFlags&SFL_NO_FLIPS) || (self->client->ps.dualSabers && (self->client->ps.saber[1].saberFlags&SFL_NO_FLIPS)) || (self->NPC && @@ -14645,7 +14675,7 @@ void ForceJump(gentity_t *self, usercmd_t *ucmd) } break; case FJ_BACKWARD: - if (((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forceJumpCharge > 300) + if (((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA || self->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forceJumpCharge > 300) || (self->client->ps.saber[0].saberFlags&SFL_NO_FLIPS) || (self->client->ps.dualSabers && (self->client->ps.saber[1].saberFlags&SFL_NO_FLIPS)) || (self->NPC && @@ -14660,7 +14690,7 @@ void ForceJump(gentity_t *self, usercmd_t *ucmd) } break; case FJ_RIGHT: - if (((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forceJumpCharge > 300) + if (((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA || self->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forceJumpCharge > 300) || (self->client->ps.saber[0].saberFlags&SFL_NO_FLIPS) || (self->client->ps.dualSabers && (self->client->ps.saber[1].saberFlags&SFL_NO_FLIPS)) || (self->NPC && @@ -14675,7 +14705,7 @@ void ForceJump(gentity_t *self, usercmd_t *ucmd) } break; case FJ_LEFT: - if (((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forceJumpCharge > 300) + if (((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA || self->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forceJumpCharge > 300) || (self->client->ps.saber[0].saberFlags&SFL_NO_FLIPS) || (self->client->ps.dualSabers && (self->client->ps.saber[1].saberFlags&SFL_NO_FLIPS)) || (self->NPC && @@ -14774,24 +14804,24 @@ void WP_SaberBlockPointsRegenerate(gentity_t *self) } if (!canRegen) { - self->breakRecoveryTime = level.time + HITOWNER_RECOVERY_INTERVAL; + self->client->breakRecoveryTime = level.time + HITOWNER_RECOVERY_INTERVAL; return; } - if (self->breakCounter) //must have block points that need to be regained + if (self->client->breakCounter) //must have block points that need to be regained { - if (level.time >= self->breakRecoveryTime) + if (level.time >= self->client->breakRecoveryTime) { - self->breakCounter -= 1; - self->breakRecoveryTime = level.time + HITOWNER_RECOVERY_INTERVAL; + self->client->breakCounter -= 1; + self->client->breakRecoveryTime = level.time + HITOWNER_RECOVERY_INTERVAL; } } if (self->NPC) { - if (self->saberReactivateTime) //checking for stun after saber deactivation from Grip/Drain + if (self->client->saberReactivateTime) //checking for stun after saber deactivation from Grip/Drain { - if (level.time >= self->saberReactivateTime) + if (level.time >= self->client->saberReactivateTime) { self->client->ps.SaberActivate(); } @@ -14808,29 +14838,28 @@ qboolean WP_SaberBlockCooldownDone(gentity_t *self) if (!(self->client->ps.saberEventFlags&SEF_PARRIED) && !(self->client->ps.saberEventFlags&SEF_DEFLECTED)) - {//we weren't transitioning from a block - return qfalse; + {//we weren't returning from a previous block + return qfalse; //otherwise wouldn't be vulnerable after attacking } if (PM_SaberInReturn(self->client->ps.saberMove)) - {//we're in a return, probably triggered after a previous deflection - //FIXME: Make sure it's a return from a deflection, not a slash? - /*if (self->client->ps.saberAnimLevel == SS_FAST || self->client->ps.saberAnimLevel == SS_TAVION - //|| self->client->ps.saberAnimLevel == SS_DUAL - ) + { + /* + if (self->client->ps.saberAnimLevel == SS_FAST || self->client->ps.saberAnimLevel == SS_TAVION || self->client->ps.saberAnimLevel == SS_DUAL) { //only non-fast deflecting styles get a break return qfalse; } */ - int totalReboundTime = parryDebounce[self->client->ps.forcePowerLevel[FP_SABER_DEFENSE]] * BLOCK_SPEED; + //there is a delay, but much shorter than waiting for the animation + int totalReboundTime = parryDebounce[self->client->ps.forcePowerLevel[FP_SABER_DEFENSE]] * BLOCK_DELAY_MULT; int baseReboundTime = totalReboundTime; switch (self->client->ps.saberAnimLevel) { case SS_DESANN: case SS_STRONG: - totalReboundTime *= SLOW_BLOCK_FACTOR; + totalReboundTime *= SLOW_BLOCK_DELAY_MULT; break; } @@ -15550,7 +15579,7 @@ void WP_ForceForceThrow(gentity_t *thrower) { return; } - if (!NPC_JediClass(thrower)) + if (thrower->NPC->stats.restrictJediPowers) { return; } @@ -15818,7 +15847,7 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ } else if (gripEnt->client && gripEnt->health > 0 //dead dudes don't fly - && (gripEnt->client->NPC_class == CLASS_BOBAFETT || gripEnt->client->NPC_class == CLASS_ROCKETTROOPER) + && (gripEnt->client->NPC_class == CLASS_BOBAFETT || gripEnt->client->NPC_class == CLASS_MANDA || gripEnt->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forcePowerDebounce[FP_GRIP] < level.time && !Q_irand(0, 3) ) @@ -15839,20 +15868,21 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ && !Jedi_CultistDestroyer(gripEnt) && !Q_irand(0, 100 - (gripEnt->NPC->stats.evasion * 8) - (g_spskill->integer * 20))) {//a jedi who broke free FIXME: maybe have some minimum grip length- a reaction time? - WP_ForceForceThrow(gripEnt); + if (!(gripEnt->NPC->stats.restrictJediPowers)) WP_ForceForceThrow(gripEnt); + else ForceThrow(gripEnt, 0); if (gripEnt->NPC->rank >= RANK_COMMANDER //saber reactivation AI here. || (gripEnt->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) { //tough guys reactivate their saber faster after being gripped - gripEnt->saberReactivateTime = level.time; + gripEnt->client->saberReactivateTime = level.time; } else //if (gripEnt->NPC->rank >= RANK_LT_COMM) { //weaker/less skilled guys are stunned after a grip for longer - gripEnt->saberReactivateTime = level.time + 500; + gripEnt->client->saberReactivateTime = level.time + 500; } /*else { - gripEnt->saberReactivateTime = level.time + (2000 + Q_irand(0, 1000)); + gripEnt->client->saberReactivateTime = level.time + (2000 + Q_irand(0, 1000)); }*/ //FIXME: I need to go into some pushed back anim... @@ -16272,7 +16302,7 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ } else if (drainEnt->client && drainEnt->health > 0 //dead dudes don't fly - && (drainEnt->client->NPC_class == CLASS_BOBAFETT || drainEnt->client->NPC_class == CLASS_ROCKETTROOPER) + && (drainEnt->client->NPC_class == CLASS_BOBAFETT || drainEnt->client->NPC_class == CLASS_MANDA || drainEnt->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forcePowerDebounce[FP_DRAIN] < level.time && !Q_irand(0, 10)) {//boba fett - fly away! @@ -16293,22 +16323,23 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ && level.time - (self->client->ps.forcePowerDebounce[FP_DRAIN]>self->client->ps.forcePowerLevel[FP_DRAIN] * 500)//at level 1, I always get at least 500ms of drain, at level 3 I get 1500ms && !Q_irand(0, 100 - (drainEnt->NPC->stats.evasion * 8) - (g_spskill->integer * 15))) {//a jedi who broke free FIXME: maybe have some minimum grip length- a reaction time? - WP_ForceForceThrow(drainEnt); + if (!(drainEnt->NPC->stats.restrictJediPowers)) WP_ForceForceThrow(drainEnt); + else ForceThrow(drainEnt, 0); //FIXME: I need to go into some pushed back anim... //saber reactivate time - same rules as for Grip if (drainEnt->NPC->rank >= RANK_COMMANDER || (drainEnt->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) { //tough guys reactivate their saber faster after being gripped - drainEnt->saberReactivateTime = 0; + drainEnt->client->saberReactivateTime = 0; } else /*if (drainEnt->NPC->rank >= RANK_LT_COMM)*/ { //weaker/less skilled guys are stunned after a grip for longer - drainEnt->saberReactivateTime = level.time + 1000; + drainEnt->client->saberReactivateTime = level.time + 1000; } /*else { - drainEnt->saberReactivateTime = level.time + (2000 + Q_irand(0, 1000)); + drainEnt->client->saberReactivateTime = level.time + (2000 + Q_irand(0, 1000)); }*/ WP_ForcePowerStop(self, FP_DRAIN); @@ -16625,7 +16656,7 @@ void WP_ForcePowersUpdate(gentity_t *self, usercmd_t *ucmd) } if (!self->s.number - && self->client->NPC_class == CLASS_BOBAFETT) + && (self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA)) {//Boba Fett if (ucmd->buttons & BUTTON_FORCE_LIGHTNING) {//start flamethrower diff --git a/code/game/wp_thermal.cpp b/code/game/wp_thermal.cpp index e4cf9ac331..5eefa7cfd0 100644 --- a/code/game/wp_thermal.cpp +++ b/code/game/wp_thermal.cpp @@ -314,6 +314,12 @@ gentity_t *WP_FireThermalDetonator( gentity_t *ent, qboolean alt_fire ) { // If not the player, cut the damage a bit so we don't get pounded on so much damageScale = TD_NPC_DAMAGE_CUT; + if (alt_fire) { + damageScale *= weaponData[WP_THERMAL].npcAltDmgMult; + } + else { + damageScale *= weaponData[WP_THERMAL].npcDmgMult; + } } if ( !alt_fire && ent->s.number == 0 ) @@ -420,7 +426,13 @@ gentity_t *WP_FireThermalDetonator( gentity_t *ent, qboolean alt_fire ) bolt->s.loopSound = G_SoundIndex( "sound/weapons/thermal/thermloop.wav" ); - bolt->damage = weaponData[WP_THERMAL].damage * damageScale; + if (alt_fire) { + bolt->damage = weaponData[WP_THERMAL].damage * damageScale; + } + else { + bolt->damage = weaponData[WP_THERMAL].altDamage * damageScale; + } + bolt->dflags = 0; bolt->splashDamage = weaponData[WP_THERMAL].splashDamage * damageScale; bolt->splashRadius = weaponData[WP_THERMAL].splashRadius; diff --git a/code/game/wp_tusken.cpp b/code/game/wp_tusken.cpp index f4e75674f1..9aa290c6cc 100644 --- a/code/game/wp_tusken.cpp +++ b/code/game/wp_tusken.cpp @@ -79,6 +79,11 @@ void WP_FireTuskenRifle( gentity_t *ent ) { missile->damage = TUSKEN_RIFLE_DAMAGE_EASY; } + + if (ent->s.number >= MAX_CLIENTS) { + missile->damage *= weaponData[WP_TUSKEN_RIFLE].npcDmgMult; + } + missile->dflags = DAMAGE_DEATH_KNOCKBACK; missile->methodOfDeath = MOD_BRYAR;//??? From 15b09a2418cc14984e3e443b8563f058a112686a Mon Sep 17 00:00:00 2001 From: dusty22 Date: Mon, 4 Jul 2016 08:47:48 -0400 Subject: [PATCH 231/445] quick fix --- code/game/NPC_behavior.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/NPC_behavior.cpp b/code/game/NPC_behavior.cpp index ee7a62b216..f75b96bdd5 100644 --- a/code/game/NPC_behavior.cpp +++ b/code/game/NPC_behavior.cpp @@ -1983,8 +1983,7 @@ qboolean NPC_BSFlee( void ) //done panicking, time to realize we're dogmeat, if we haven't been able to flee for a few seconds if ((level.time - NPC->lastMoveTime)>3000) { - //NPC_CheckSurrender(true); - NPC_Surrender(); + NPC_CheckSurrender(qtrue); } } From 4c216f2b28bb097ca97272b698f5f586439b38ab Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Mon, 4 Jul 2016 20:17:51 +0300 Subject: [PATCH 232/445] Remove code files from non-engine projects --- code/game/CMakeLists.txt | 3 --- code/rd-vanilla/CMakeLists.txt | 3 --- codeJK2/game/CMakeLists.txt | 3 --- 3 files changed, 9 deletions(-) diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index d19b9f877d..10d04febe0 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -264,12 +264,9 @@ set(SPGameCommonFiles "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" "${SharedDir}/qcommon/ojk_exception.h" - "${SharedDir}/qcommon/ojk_exception.cpp" "${SharedDir}/qcommon/ojk_sg_archive.h" "${SharedDir}/qcommon/ojk_sg_archive_fwd.h" - "${SharedDir}/qcommon/ojk_sg_archive.cpp" "${SharedDir}/qcommon/ojk_sg_archive_exception.h" - "${SharedDir}/qcommon/ojk_sg_archive_exception.cpp" ${SharedCommonFiles} ) diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index 824050e756..77c3fef95d 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -82,12 +82,9 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" "${SharedDir}/qcommon/ojk_exception.h" - "${SharedDir}/qcommon/ojk_exception.cpp" "${SharedDir}/qcommon/ojk_sg_archive.h" "${SharedDir}/qcommon/ojk_sg_archive_fwd.h" - "${SharedDir}/qcommon/ojk_sg_archive.cpp" "${SharedDir}/qcommon/ojk_sg_archive_exception.h" - "${SharedDir}/qcommon/ojk_sg_archive_exception.cpp" ${SharedCommonFiles} ) diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index e38f6b9a14..9ca9ea715b 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -236,12 +236,9 @@ set(JK2SPGameCommonFiles "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" "${SharedDir}/qcommon/ojk_exception.h" - "${SharedDir}/qcommon/ojk_exception.cpp" "${SharedDir}/qcommon/ojk_sg_archive.h" "${SharedDir}/qcommon/ojk_sg_archive_fwd.h" - "${SharedDir}/qcommon/ojk_sg_archive.cpp" "${SharedDir}/qcommon/ojk_sg_archive_exception.h" - "${SharedDir}/qcommon/ojk_sg_archive_exception.cpp" ${SharedCommonFiles} ) From ae16dcf7c20dc13978b342d830527de1389fce99 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Mon, 4 Jul 2016 20:58:58 +0300 Subject: [PATCH 233/445] Add RLE compression --- shared/qcommon/ojk_sg_archive.cpp | 93 +++++++++++++++++++++++++++++ shared/qcommon/ojk_sg_archive_fwd.h | 12 ++++ 2 files changed, 105 insertions(+) diff --git a/shared/qcommon/ojk_sg_archive.cpp b/shared/qcommon/ojk_sg_archive.cpp index 6e33274756..0311e01f20 100644 --- a/shared/qcommon/ojk_sg_archive.cpp +++ b/shared/qcommon/ojk_sg_archive.cpp @@ -168,6 +168,99 @@ Archive& Archive::get_instance() return result; } +int Archive::compress() +{ + auto src_size = static_cast(io_buffer_.size()); + + rle_buffer_.resize(2 * src_size); + + int src_count = 0; + int dst_index = 0; + + while (src_count < src_size) { + auto src_index = src_count; + auto b = io_buffer_[src_index++]; + + while (src_index < src_size && + (src_index - src_count) < 127 && + io_buffer_[src_index] == b) + { + src_index += 1; + } + + if ((src_index - src_count) == 1) { + while (src_index < src_size && + (src_index - src_count) < 127 && ( + io_buffer_[src_index] != io_buffer_[src_index - 1] || ( + src_index > 1 && + io_buffer_[src_index] != io_buffer_[src_index - 2]))) + { + src_index += 1; + } + + while (src_index < src_size && + io_buffer_[src_index] == io_buffer_[src_index - 1]) + { + src_index -= 1; + } + + rle_buffer_[dst_index++] = + static_cast(src_count - src_index); + + for (auto i = src_count; i < src_index; ++i) { + rle_buffer_[dst_index++] = io_buffer_[i]; + } + } else { + rle_buffer_[dst_index++] = + static_cast(src_index - src_count); + + rle_buffer_[dst_index++] = b; + } + + src_count = src_index; + } + + rle_buffer_.resize( + dst_index); + + return dst_index; +} + +void Archive::decompress( + int dst_size) +{ + rle_buffer_.resize( + dst_size); + + int src_index = 0; + int dst_index = 0; + + while (dst_size > 0) { + auto count = static_cast(io_buffer_[src_index++]); + + if (count > 0) { + std::uninitialized_fill_n( + &rle_buffer_[dst_index], + count, + io_buffer_[src_index++]); + } else { + if (count < 0) { + count = -count; + + std::uninitialized_copy_n( + &io_buffer_[src_index], + count, + &rle_buffer_[dst_index]); + + src_index += count; + } + } + + dst_index += count; + dst_size -= count; + } +} + std::string Archive::generate_path( const std::string& base_file_name) { diff --git a/shared/qcommon/ojk_sg_archive_fwd.h b/shared/qcommon/ojk_sg_archive_fwd.h index 574bb63753..99ae628bcb 100644 --- a/shared/qcommon/ojk_sg_archive_fwd.h +++ b/shared/qcommon/ojk_sg_archive_fwd.h @@ -149,6 +149,18 @@ class Archive // A current offset inside the I/O buffer. BufferOffset io_buffer_offset_; + // RLE codec buffer. + Buffer rle_buffer_; + + + // Compresses I/O buffer into RLE one. + // Returns a size of compressed data. + int compress(); + + // Decompresses I/O buffer into RLE one. + void decompress( + int dst_size); + static std::string generate_path( const std::string& base_file_name); From 1911228834f22a40e0292d8a6282a46406f54df7 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Mon, 4 Jul 2016 23:09:02 +0300 Subject: [PATCH 234/445] Add return value to read_chunk and write_chunk --- shared/qcommon/ojk_sg_archive.cpp | 16 +++++++++------- shared/qcommon/ojk_sg_archive.h | 20 ++++++++++++-------- shared/qcommon/ojk_sg_archive_fwd.h | 15 +++++++++------ 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/shared/qcommon/ojk_sg_archive.cpp b/shared/qcommon/ojk_sg_archive.cpp index 0311e01f20..244671783a 100644 --- a/shared/qcommon/ojk_sg_archive.cpp +++ b/shared/qcommon/ojk_sg_archive.cpp @@ -11,7 +11,9 @@ namespace sg { Archive::Archive() : file_handle_(), io_buffer_(), - io_buffer_offset_() + io_buffer_offset_(), + rle_buffer_(), + is_testing_read_chunk_() { } @@ -51,9 +53,9 @@ bool Archive::open( int sg_version = -1; if (is_succeed) { - read_chunk( + static_cast(read_chunk( INT_ID('_', 'V', 'E', 'R'), - sg_version); + sg_version)); if (sg_version != iSAVEGAME_VERSION) { is_succeed = false; @@ -99,9 +101,9 @@ bool Archive::create( int sg_version = iSAVEGAME_VERSION; - write_chunk( + static_cast(write_chunk( INT_ID('_', 'V', 'E', 'R'), - sg_version); + sg_version)); return true; } @@ -117,14 +119,14 @@ void Archive::close() io_buffer_offset_ = 0; } -void Archive::read_chunk( +bool Archive::read_chunk( const Archive::ChunkId chunk_id) { throw ArchiveException( "Not implemented."); } -void Archive::write_chunk( +bool Archive::write_chunk( const Archive::ChunkId chunk_id) { throw ArchiveException( diff --git a/shared/qcommon/ojk_sg_archive.h b/shared/qcommon/ojk_sg_archive.h index d18ac036ef..a9aa96155a 100644 --- a/shared/qcommon/ojk_sg_archive.h +++ b/shared/qcommon/ojk_sg_archive.h @@ -82,29 +82,33 @@ void Archive::advance_io_buffer( // read_chunk template -void Archive::read_chunk( +bool Archive::read_chunk( const ChunkId chunk_id, TDst& dst_value) { - read_chunk( + auto result = read_chunk( chunk_id); read( dst_value); + + return result; } template -void Archive::read_chunk( +bool Archive::read_chunk( const ChunkId chunk_id, TDst* dst_values, int dst_count) { - read_chunk( + auto result = read_chunk( chunk_id); read( dst_values, dst_count); + + return result; } // read_chunk @@ -115,7 +119,7 @@ void Archive::read_chunk( // write_chunk template -void Archive::write_chunk( +bool Archive::write_chunk( const ChunkId chunk_id, const TSrc& src_value) { @@ -124,12 +128,12 @@ void Archive::write_chunk( write( src_value); - write_chunk( + return write_chunk( chunk_id); } template -void Archive::write_chunk( +bool Archive::write_chunk( const ChunkId chunk_id, const TSrc* src_values, int src_count) @@ -140,7 +144,7 @@ void Archive::write_chunk( src_values, src_count); - write_chunk( + return write_chunk( chunk_id); } diff --git a/shared/qcommon/ojk_sg_archive_fwd.h b/shared/qcommon/ojk_sg_archive_fwd.h index 99ae628bcb..03868fda0f 100644 --- a/shared/qcommon/ojk_sg_archive_fwd.h +++ b/shared/qcommon/ojk_sg_archive_fwd.h @@ -48,40 +48,40 @@ class Archive // Reads a chunk from the file into the internal buffer. - void read_chunk( + bool read_chunk( const ChunkId chunk_id); // Reads a value or an array of values from the file via // the internal buffer. template - void read_chunk( + bool read_chunk( const ChunkId chunk_id, TDst& dst_value); // Reads an array of values with specified count from // the file via the internal buffer. template - void read_chunk( + bool read_chunk( const ChunkId chunk_id, TDst* dst_values, int dst_count); // Writes a chunk into the file from the internal buffer. - void write_chunk( + bool write_chunk( const ChunkId chunk_id); // Writes a value or an array of values into the file via // the internal buffer. template - void write_chunk( + bool write_chunk( const ChunkId chunk_id, const TSrc& src_value); // Writes an array of values with specified count into // the file via the internal buffer. template - void write_chunk( + bool write_chunk( const ChunkId chunk_id, const TSrc* src_values, int src_count); @@ -152,6 +152,9 @@ class Archive // RLE codec buffer. Buffer rle_buffer_; + // Does not throws an exception on chunk reading if true. + bool is_testing_read_chunk_; + // Compresses I/O buffer into RLE one. // Returns a size of compressed data. From 0ce58cb6941481966601abeee14fa6ccb7b8863e Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Thu, 7 Jul 2016 21:06:26 +0300 Subject: [PATCH 235/445] Rename classes and remove sg namespace --- code/CMakeLists.txt | 10 +-- code/cgame/cg_main.cpp | 2 +- code/game/CMakeLists.txt | 6 +- code/game/G_Timer.cpp | 2 +- code/game/Q3_Interface.cpp | 2 +- code/game/g_main.cpp | 2 +- code/game/g_objectives.cpp | 2 +- code/game/g_roff.cpp | 2 +- code/game/g_savegame.cpp | 2 +- code/icarus/IcarusImplementation.cpp | 2 +- code/qcommon/cm_load.cpp | 2 +- code/qcommon/q_shared.h | 2 +- code/rd-vanilla/CMakeLists.txt | 7 +- code/rd-vanilla/G2_misc.cpp | 2 +- code/server/sv_savegame.cpp | 2 +- codeJK2/cgame/cg_main.cpp | 2 +- codeJK2/game/CMakeLists.txt | 6 +- codeJK2/game/G_Timer.cpp | 2 +- codeJK2/game/Q3_Registers.cpp | 2 +- codeJK2/game/g_main.cpp | 2 +- codeJK2/game/g_objectives.cpp | 2 +- codeJK2/game/g_roff.cpp | 2 +- codeJK2/game/g_savegame.cpp | 2 +- codeJK2/icarus/Instance.cpp | 2 +- codeJK2/icarus/Sequence.cpp | 2 +- codeJK2/icarus/TaskManager.cpp | 2 +- ...{ojk_sg_archive.cpp => ojk_saved_game.cpp} | 40 +++++---- .../{ojk_sg_archive.h => ojk_saved_game.h} | 81 +++++++++---------- ...ption.cpp => ojk_saved_game_exception.cpp} | 10 +-- shared/qcommon/ojk_saved_game_exception.h | 34 ++++++++ ..._sg_archive_fwd.h => ojk_saved_game_fwd.h} | 28 +++---- shared/qcommon/ojk_sg_archive_exception.h | 36 --------- 32 files changed, 145 insertions(+), 157 deletions(-) rename shared/qcommon/{ojk_sg_archive.cpp => ojk_saved_game.cpp} (91%) rename shared/qcommon/{ojk_sg_archive.h => ojk_saved_game.h} (91%) rename shared/qcommon/{ojk_sg_archive_exception.cpp => ojk_saved_game_exception.cpp} (55%) create mode 100644 shared/qcommon/ojk_saved_game_exception.h rename shared/qcommon/{ojk_sg_archive_fwd.h => ojk_saved_game_fwd.h} (94%) delete mode 100644 shared/qcommon/ojk_sg_archive_exception.h diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index fcf9b47344..709601a684 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -179,11 +179,11 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" "${SharedDir}/qcommon/ojk_exception.h" "${SharedDir}/qcommon/ojk_exception.cpp" - "${SharedDir}/qcommon/ojk_sg_archive.h" - "${SharedDir}/qcommon/ojk_sg_archive_fwd.h" - "${SharedDir}/qcommon/ojk_sg_archive.cpp" - "${SharedDir}/qcommon/ojk_sg_archive_exception.h" - "${SharedDir}/qcommon/ojk_sg_archive_exception.cpp" + "${SharedDir}/qcommon/ojk_saved_game.h" + "${SharedDir}/qcommon/ojk_saved_game_fwd.h" + "${SharedDir}/qcommon/ojk_saved_game.cpp" + "${SharedDir}/qcommon/ojk_saved_game_exception.h" + "${SharedDir}/qcommon/ojk_saved_game_exception.cpp" ${SharedCommonFiles} ) diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 6360ce5a1e..d93d4f7adb 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -29,7 +29,7 @@ along with this program; if not, see . #include "../qcommon/sstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char > namePrecache_m; diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 10d04febe0..029b176d0f 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -264,9 +264,9 @@ set(SPGameCommonFiles "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" "${SharedDir}/qcommon/ojk_exception.h" - "${SharedDir}/qcommon/ojk_sg_archive.h" - "${SharedDir}/qcommon/ojk_sg_archive_fwd.h" - "${SharedDir}/qcommon/ojk_sg_archive_exception.h" + "${SharedDir}/qcommon/ojk_saved_game.h" + "${SharedDir}/qcommon/ojk_saved_game_fwd.h" + "${SharedDir}/qcommon/ojk_saved_game_exception.h" ${SharedCommonFiles} ) diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index 4521e8b6a9..2e97b4038f 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -23,7 +23,7 @@ along with this program; if not, see . #include "g_local.h" #include "../Rufl/hstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" #define MAX_GTIMERS 16384 diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index b9eb56a876..e395e1fb0f 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -41,7 +41,7 @@ along with this program; if not, see . #include "g_vehicles.h" #include "g_navigator.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" extern cvar_t *com_buildScript; diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 60c05bf6f5..e01516cac7 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -37,7 +37,7 @@ along with this program; if not, see . //rww - RAGDOLL_END #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" extern void WP_SaberLoadParms( void ); extern qboolean G_PlayerSpawned( void ); diff --git a/code/game/g_objectives.cpp b/code/game/g_objectives.cpp index a55f3b6461..4f0dd85563 100644 --- a/code/game/g_objectives.cpp +++ b/code/game/g_objectives.cpp @@ -30,7 +30,7 @@ along with this program; if not, see . #include "objectives.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" qboolean missionInfo_Updated; diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp index 47d42051b2..3ed0d3dfab 100644 --- a/code/game/g_roff.cpp +++ b/code/game/g_roff.cpp @@ -26,7 +26,7 @@ along with this program; if not, see . #include "../cgame/cg_local.h" #include "g_functions.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" // The list of precached ROFFs roff_list_t roffs[MAX_ROFFS]; diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index c8e3dcff25..f62c7ffa87 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -31,7 +31,7 @@ along with this program; if not, see . #include "../cgame/cg_camera.h" #include "../qcommon/sstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" extern void OBJ_LoadTacticalInfo(void); diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index 076bd30992..f404f51a16 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -34,7 +34,7 @@ along with this program; if not, see . #include "../qcommon/q_shared.h" #include "../qcommon/qcommon.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" #define STL_ITERATE( a, b ) for ( a = b.begin(); a != b.end(); ++a ) #define STL_INSERT( a, b ) a.insert( a.end(), b ); diff --git a/code/qcommon/cm_load.cpp b/code/qcommon/cm_load.cpp index 4566854848..f2573e9afb 100644 --- a/code/qcommon/cm_load.cpp +++ b/code/qcommon/cm_load.cpp @@ -25,7 +25,7 @@ along with this program; if not, see . #include "cm_local.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" #ifdef BSPC void SetPlaneSignbits (cplane_t *out) { diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index c026a9bdb9..d5c5534b68 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -161,7 +161,7 @@ float FloatSwap( const float *f ); #include "qcommon/q_platform.h" #include "qcommon/ojk_sg_wrappers_fwd.h" -#include "qcommon/ojk_sg_archive_fwd.h" +#include "qcommon/ojk_saved_game_fwd.h" // ================================================================ diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index 77c3fef95d..0bbc8792cc 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -82,10 +82,9 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" "${SharedDir}/qcommon/ojk_exception.h" - "${SharedDir}/qcommon/ojk_sg_archive.h" - "${SharedDir}/qcommon/ojk_sg_archive_fwd.h" - "${SharedDir}/qcommon/ojk_sg_archive_exception.h" - + "${SharedDir}/qcommon/ojk_saved_game.h" + "${SharedDir}/qcommon/ojk_saved_game_fwd.h" + "${SharedDir}/qcommon/ojk_saved_game_exception.h" ${SharedCommonFiles} ) source_group("common" FILES ${SPRDVanillaCommonFiles}) diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index 7e319d023e..9ce7074ab0 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -51,7 +51,7 @@ along with this program; if not, see . #ifdef _G2_GORE #include "../ghoul2/ghoul2_gore.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" #define GORE_TAG_UPPER (256) #define GORE_TAG_MASK (~255) diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index e4069d64bf..305a06bee9 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -38,7 +38,7 @@ along with this program; if not, see . #include #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" static char saveGameComment[iSG_COMMENT_SIZE]; diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index f6279e745e..3ff00fb3b7 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -29,7 +29,7 @@ along with this program; if not, see . #include "../../code/qcommon/sstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char, std::less, std::allocator< unsigned char > > namePrecache_m; diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index 9ca9ea715b..9c8dc71daa 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -236,9 +236,9 @@ set(JK2SPGameCommonFiles "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" "${SharedDir}/qcommon/ojk_exception.h" - "${SharedDir}/qcommon/ojk_sg_archive.h" - "${SharedDir}/qcommon/ojk_sg_archive_fwd.h" - "${SharedDir}/qcommon/ojk_sg_archive_exception.h" + "${SharedDir}/qcommon/ojk_saved_game.h" + "${SharedDir}/qcommon/ojk_saved_game_fwd.h" + "${SharedDir}/qcommon/ojk_saved_game_exception.h" ${SharedCommonFiles} ) diff --git a/codeJK2/game/G_Timer.cpp b/codeJK2/game/G_Timer.cpp index 6b5de3a08d..26197b29c9 100644 --- a/codeJK2/game/G_Timer.cpp +++ b/codeJK2/game/G_Timer.cpp @@ -24,7 +24,7 @@ along with this program; if not, see . #include "g_local.h" #include "../../code/Rufl/hstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" #define MAX_GTIMERS 16384 diff --git a/codeJK2/game/Q3_Registers.cpp b/codeJK2/game/Q3_Registers.cpp index 3ed08351e4..87c21a5cae 100644 --- a/codeJK2/game/Q3_Registers.cpp +++ b/codeJK2/game/Q3_Registers.cpp @@ -25,7 +25,7 @@ along with this program; if not, see . #include "g_local.h" #include "Q3_Registers.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" extern void Q3_DebugPrint( int level, const char *format, ... ); diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp index 9bb12609ca..76f6f96271 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -36,7 +36,7 @@ along with this program; if not, see . #include "../cgame/cg_local.h" // yeah I know this is naughty, but we're shipping soon... #include "time.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" extern CNavigator navigator; diff --git a/codeJK2/game/g_objectives.cpp b/codeJK2/game/g_objectives.cpp index c5e2ae82aa..9fdbc4c956 100644 --- a/codeJK2/game/g_objectives.cpp +++ b/codeJK2/game/g_objectives.cpp @@ -32,7 +32,7 @@ along with this program; if not, see . #include "objectives.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" qboolean missionInfo_Updated; diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp index 60ceed6455..749c7e0cf8 100644 --- a/codeJK2/game/g_roff.cpp +++ b/codeJK2/game/g_roff.cpp @@ -26,7 +26,7 @@ along with this program; if not, see . #include "g_roff.h" #include "g_icarus.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" // The list of precached ROFFs roff_list_t roffs[MAX_ROFFS]; diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index d3108fa04d..799c9e913f 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -34,7 +34,7 @@ along with this program; if not, see . #include "g_icarus.h" #include "../../code/qcommon/sstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" extern void OBJ_LoadTacticalInfo(void); diff --git a/codeJK2/icarus/Instance.cpp b/codeJK2/icarus/Instance.cpp index 7888ee732b..6a833f5ed6 100644 --- a/codeJK2/icarus/Instance.cpp +++ b/codeJK2/icarus/Instance.cpp @@ -30,7 +30,7 @@ along with this program; if not, see . #include #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" // Instance diff --git a/codeJK2/icarus/Sequence.cpp b/codeJK2/icarus/Sequence.cpp index 2b9a56f5e8..7f2cbbace4 100644 --- a/codeJK2/icarus/Sequence.cpp +++ b/codeJK2/icarus/Sequence.cpp @@ -29,7 +29,7 @@ along with this program; if not, see . #include #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" CSequence::CSequence( void ) { diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index 9fb06d0dd4..3b32e5385e 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -32,7 +32,7 @@ along with this program; if not, see . #include #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game.h" #define ICARUS_VALIDATE(a) if ( a == false ) return TASK_FAILED; diff --git a/shared/qcommon/ojk_sg_archive.cpp b/shared/qcommon/ojk_saved_game.cpp similarity index 91% rename from shared/qcommon/ojk_sg_archive.cpp rename to shared/qcommon/ojk_saved_game.cpp index 244671783a..1ccca78342 100644 --- a/shared/qcommon/ojk_sg_archive.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -5,10 +5,9 @@ namespace ojk { -namespace sg { -Archive::Archive() : +SavedGame::SavedGame() : file_handle_(), io_buffer_(), io_buffer_offset_(), @@ -17,12 +16,12 @@ Archive::Archive() : { } -Archive::~Archive() +SavedGame::~SavedGame() { close(); } -bool Archive::open( +bool SavedGame::open( const std::string& base_file_name) { auto&& file_path = generate_path( @@ -75,7 +74,7 @@ bool Archive::open( return is_succeed; } -bool Archive::create( +bool SavedGame::create( const std::string& base_file_name) { remove( @@ -108,7 +107,7 @@ bool Archive::create( return true; } -void Archive::close() +void SavedGame::close() { if (file_handle_ != 0) { ::FS_FCloseFile(file_handle_); @@ -119,21 +118,21 @@ void Archive::close() io_buffer_offset_ = 0; } -bool Archive::read_chunk( - const Archive::ChunkId chunk_id) +bool SavedGame::read_chunk( + const SavedGame::ChunkId chunk_id) { - throw ArchiveException( + throw SavedGameException( "Not implemented."); } -bool Archive::write_chunk( - const Archive::ChunkId chunk_id) +bool SavedGame::write_chunk( + const SavedGame::ChunkId chunk_id) { - throw ArchiveException( + throw SavedGameException( "Not implemented."); } -void Archive::rename( +void SavedGame::rename( const std::string& old_base_file_name, const std::string& new_base_file_name) { @@ -154,7 +153,7 @@ void Archive::rename( } } -void Archive::remove( +void SavedGame::remove( const std::string& base_file_name) { auto path = generate_path( @@ -164,13 +163,13 @@ void Archive::remove( path.c_str()); } -Archive& Archive::get_instance() +SavedGame& SavedGame::get_instance() { - static Archive result; + static SavedGame result; return result; } -int Archive::compress() +int SavedGame::compress() { auto src_size = static_cast(io_buffer_.size()); @@ -228,7 +227,7 @@ int Archive::compress() return dst_index; } -void Archive::decompress( +void SavedGame::decompress( int dst_size) { rle_buffer_.resize( @@ -263,7 +262,7 @@ void Archive::decompress( } } -std::string Archive::generate_path( +std::string SavedGame::generate_path( const std::string& base_file_name) { auto normalized_file_name = base_file_name; @@ -279,7 +278,7 @@ std::string Archive::generate_path( return path; } -std::string Archive::get_failed_to_open_message( +std::string SavedGame::get_failed_to_open_message( const std::string& file_name, bool is_open) { @@ -311,5 +310,4 @@ std::string Archive::get_failed_to_open_message( } -} // sg } // ojk diff --git a/shared/qcommon/ojk_sg_archive.h b/shared/qcommon/ojk_saved_game.h similarity index 91% rename from shared/qcommon/ojk_sg_archive.h rename to shared/qcommon/ojk_saved_game.h index a9aa96155a..d6664f3b91 100644 --- a/shared/qcommon/ojk_sg_archive.h +++ b/shared/qcommon/ojk_saved_game.h @@ -1,11 +1,10 @@ // -// Saved game archive. -// (forward declaration) +// Saved game. // -#ifndef OJK_SG_ARCHIVE_INCLUDED -#define OJK_SG_ARCHIVE_INCLUDED +#ifndef OJK_SAVED_GAME_INCLUDED +#define OJK_SAVED_GAME_INCLUDED #include @@ -15,35 +14,34 @@ namespace ojk { -namespace sg { // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // I/O buffer manipulation. template -void Archive::check_io_buffer( +void SavedGame::check_io_buffer( int count) { if (count <= 0) { - throw ArchiveException( + throw SavedGameException( "Zero or negative count."); } const auto data_size = sizeof(T) * count; if ((io_buffer_offset_ + data_size) > io_buffer_.size()) { - throw ArchiveException( + throw SavedGameException( "Not enough data."); } } template -void Archive::accomodate_io_buffer( +void SavedGame::accomodate_io_buffer( int count) { if (count <= 0) { - throw ArchiveException( + throw SavedGameException( "Zero or negative count."); } @@ -56,17 +54,17 @@ void Archive::accomodate_io_buffer( } template -T Archive::cast_io_buffer() +T SavedGame::cast_io_buffer() { return reinterpret_cast(io_buffer_[io_buffer_offset_]); } template -void Archive::advance_io_buffer( +void SavedGame::advance_io_buffer( int count) { if (count <= 0) { - throw ArchiveException( + throw SavedGameException( "Zero or negative count."); } @@ -82,7 +80,7 @@ void Archive::advance_io_buffer( // read_chunk template -bool Archive::read_chunk( +bool SavedGame::read_chunk( const ChunkId chunk_id, TDst& dst_value) { @@ -96,7 +94,7 @@ bool Archive::read_chunk( } template -bool Archive::read_chunk( +bool SavedGame::read_chunk( const ChunkId chunk_id, TDst* dst_values, int dst_count) @@ -119,7 +117,7 @@ bool Archive::read_chunk( // write_chunk template -bool Archive::write_chunk( +bool SavedGame::write_chunk( const ChunkId chunk_id, const TSrc& src_value) { @@ -133,7 +131,7 @@ bool Archive::write_chunk( } template -bool Archive::write_chunk( +bool SavedGame::write_chunk( const ChunkId chunk_id, const TSrc* src_values, int src_count) @@ -156,7 +154,7 @@ bool Archive::write_chunk( // read template -void Archive::read( +void SavedGame::read( TDst& dst_value) { using Tag = typename std::conditional< @@ -191,7 +189,7 @@ void Archive::read( } template -void Archive::read( +void SavedGame::read( TDst& dst_value, BooleanTag) { @@ -208,7 +206,7 @@ void Archive::read( } template -void Archive::read( +void SavedGame::read( TDst& dst_value, NumericTag) { @@ -223,7 +221,7 @@ void Archive::read( } template -void Archive::read( +void SavedGame::read( TDst*& dst_value, PointerTag) { @@ -248,16 +246,16 @@ void Archive::read( } template -void Archive::read( +void SavedGame::read( TDst& dst_value, ClassTag) { - throw ArchiveException( + throw SavedGameException( "Not implemented."); } template -void Archive::read( +void SavedGame::read( TDst (&dst_values)[TCount], Array1dTag) { @@ -274,7 +272,7 @@ void Archive::read( // read (C-array) template -void Archive::read( +void SavedGame::read( TDst* dst_values, int dst_count) { @@ -286,12 +284,12 @@ void Archive::read( "Unsupported types."); if (!dst_values) { - throw ArchiveException( + throw SavedGameException( "Null pointer."); } if (dst_count < 0) { - throw ArchiveException( + throw SavedGameException( "Negative count."); } @@ -335,7 +333,7 @@ void Archive::read( } template -void Archive::read( +void SavedGame::read( TDst* dst_values, int dst_count, InplaceTag) @@ -356,7 +354,7 @@ void Archive::read( } template -void Archive::read( +void SavedGame::read( TDst* dst_values, int dst_count, CastTag) @@ -386,7 +384,7 @@ void Archive::read( // write template -void Archive::write( +void SavedGame::write( const TSrc& src_value) { using Tag = typename std::conditional< @@ -417,7 +415,7 @@ void Archive::write( } template -void Archive::write( +void SavedGame::write( const TSrc& src_value, NumericTag) { @@ -432,7 +430,7 @@ void Archive::write( } template -void Archive::write( +void SavedGame::write( const TSrc*& src_value, PointerTag) { @@ -450,16 +448,16 @@ void Archive::write( } template -void Archive::write( +void SavedGame::write( const TSrc& src_value, ClassTag) { - throw ArchiveException( + throw SavedGameException( "Not implemented."); } template -void Archive::write( +void SavedGame::write( const TSrc (&src_values)[TCount], Array1dTag) { @@ -476,7 +474,7 @@ void Archive::write( // write (C-array) template -void Archive::write( +void SavedGame::write( const TSrc* src_values, int src_count) { @@ -488,12 +486,12 @@ void Archive::write( "Unsupported types."); if (!src_values) { - throw ArchiveException( + throw SavedGameException( "Null pointer."); } if (src_count < 0) { - throw ArchiveException( + throw SavedGameException( "Negative count."); } @@ -537,7 +535,7 @@ void Archive::write( } template -void Archive::write( +void SavedGame::write( const TSrc* src_values, int src_count, InplaceTag) @@ -558,7 +556,7 @@ void Archive::write( } template -void Archive::write( +void SavedGame::write( const TSrc* src_values, int src_count, CastTag) @@ -584,8 +582,7 @@ void Archive::write( // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -} // sg } // ojk -#endif // OJK_SG_ARCHIVE_INCLUDED +#endif // OJK_SAVED_GAME_INCLUDED diff --git a/shared/qcommon/ojk_sg_archive_exception.cpp b/shared/qcommon/ojk_saved_game_exception.cpp similarity index 55% rename from shared/qcommon/ojk_sg_archive_exception.cpp rename to shared/qcommon/ojk_saved_game_exception.cpp index a582836e55..23e948edcc 100644 --- a/shared/qcommon/ojk_sg_archive_exception.cpp +++ b/shared/qcommon/ojk_saved_game_exception.cpp @@ -1,5 +1,5 @@ // -// Saved game archive exception. +// Saved game exception. // @@ -7,25 +7,23 @@ namespace ojk { -namespace sg { -ArchiveException::ArchiveException( +SavedGameException::SavedGameException( const char* message) : Exception(message) { } -ArchiveException::ArchiveException( +SavedGameException::SavedGameException( const std::string& message) : Exception(message) { } -ArchiveException::~ArchiveException() +SavedGameException::~SavedGameException() { } -} // sg } // ojk diff --git a/shared/qcommon/ojk_saved_game_exception.h b/shared/qcommon/ojk_saved_game_exception.h new file mode 100644 index 0000000000..45c67081d0 --- /dev/null +++ b/shared/qcommon/ojk_saved_game_exception.h @@ -0,0 +1,34 @@ +// +// Saved game exception. +// + + +#ifndef OJK_SAVED_GAME_EXCEPTION_INCLUDED +#define OJK_SAVED_GAME_EXCEPTION_INCLUDED + + +#include "ojk_exception.h" + + +namespace ojk { + + +class SavedGameException : + public Exception +{ +public: + explicit SavedGameException( + const char* message); + + explicit SavedGameException( + const std::string& message); + + virtual ~SavedGameException(); +}; // SavedGameException + + +} // ojk + + +#endif // OJK_SAVED_GAME_EXCEPTION_INCLUDED + diff --git a/shared/qcommon/ojk_sg_archive_fwd.h b/shared/qcommon/ojk_saved_game_fwd.h similarity index 94% rename from shared/qcommon/ojk_sg_archive_fwd.h rename to shared/qcommon/ojk_saved_game_fwd.h index 03868fda0f..1342ae5828 100644 --- a/shared/qcommon/ojk_sg_archive_fwd.h +++ b/shared/qcommon/ojk_saved_game_fwd.h @@ -1,11 +1,11 @@ // -// Saved game archive. +// Saved game. // (forward declaration) // -#ifndef OJK_SG_ARCHIVE_FWD_INCLUDED -#define OJK_SG_ARCHIVE_FWD_INCLUDED +#ifndef OJK_SAVED_GAME_FWD_INCLUDED +#define OJK_SAVED_GAME_FWD_INCLUDED #include @@ -15,24 +15,23 @@ namespace ojk { -namespace sg { -class Archive +class SavedGame { public: using ChunkId = uint32_t; - Archive(); + SavedGame(); - Archive( - const Archive& that) = delete; + SavedGame( + const SavedGame& that) = delete; - Archive& operator=( - const Archive& that) = delete; + SavedGame& operator=( + const SavedGame& that) = delete; - ~Archive(); + ~SavedGame(); // Creates a new saved game file for writing. @@ -121,7 +120,7 @@ class Archive const std::string& base_file_name); // Returns a default instance of the class. - static Archive& get_instance(); + static SavedGame& get_instance(); private: @@ -264,11 +263,10 @@ class Archive const TSrc* src_values, int src_count, CastTag); -}; // Archive +}; // SavedGame -} // sg } // ojk -#endif // OJK_SG_ARCHIVE_FWD_INCLUDED +#endif // OJK_SAVED_GAME_FWD_INCLUDED diff --git a/shared/qcommon/ojk_sg_archive_exception.h b/shared/qcommon/ojk_sg_archive_exception.h deleted file mode 100644 index a709724821..0000000000 --- a/shared/qcommon/ojk_sg_archive_exception.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// Saved game archive exception. -// - - -#ifndef OJK_SG_ARCHIVE_EXCEPTION_INCLUDED -#define OJK_SG_ARCHIVE_EXCEPTION_INCLUDED - - -#include "ojk_exception.h" - - -namespace ojk { -namespace sg { - - -class ArchiveException : - public Exception -{ -public: - explicit ArchiveException( - const char* message); - - explicit ArchiveException( - const std::string& message); - - virtual ~ArchiveException(); -}; // ArchiveException - - -} // sg -} // ojk - - -#endif // OJK_SG_ARCHIVE_EXCEPTION_INCLUDED - From b84f29d3c3894aec8434512c8ded00118617a6f8 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Thu, 7 Jul 2016 21:07:58 +0300 Subject: [PATCH 236/445] Fix header name --- shared/qcommon/ojk_saved_game.cpp | 4 ++-- shared/qcommon/ojk_saved_game.h | 2 +- shared/qcommon/ojk_saved_game_exception.cpp | 2 +- shared/qcommon/ojk_saved_game_fwd.h | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index 1ccca78342..dd3f384982 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -1,5 +1,5 @@ -#include "ojk_sg_archive.h" -#include "ojk_sg_archive_exception.h" +#include "ojk_saved_game.h" +#include "ojk_saved_game_exception.h" #include "qcommon/qcommon.h" #include "server/server.h" diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game.h index d6664f3b91..7df50d22c2 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game.h @@ -10,7 +10,7 @@ #include #include #include -#include "ojk_sg_archive_fwd.h" +#include "ojk_saved_game_fwd.h" namespace ojk { diff --git a/shared/qcommon/ojk_saved_game_exception.cpp b/shared/qcommon/ojk_saved_game_exception.cpp index 23e948edcc..6f9318696e 100644 --- a/shared/qcommon/ojk_saved_game_exception.cpp +++ b/shared/qcommon/ojk_saved_game_exception.cpp @@ -3,7 +3,7 @@ // -#include "ojk_sg_archive_exception.h" +#include "ojk_saved_game_exception.h" namespace ojk { diff --git a/shared/qcommon/ojk_saved_game_fwd.h b/shared/qcommon/ojk_saved_game_fwd.h index 1342ae5828..0c1886c905 100644 --- a/shared/qcommon/ojk_saved_game_fwd.h +++ b/shared/qcommon/ojk_saved_game_fwd.h @@ -11,7 +11,7 @@ #include #include #include -#include "ojk_sg_archive_exception.h" +#include "ojk_saved_game_exception.h" namespace ojk { From 3761dffdcbc65f01d43c01996e4b1bcc48fc62f6 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Thu, 7 Jul 2016 23:04:12 +0300 Subject: [PATCH 237/445] Implement method open --- code/cgame/cg_main.cpp | 2 +- code/game/G_Timer.cpp | 2 +- code/game/Q3_Interface.cpp | 2 +- code/game/g_main.cpp | 2 +- code/game/g_objectives.cpp | 2 +- code/game/g_roff.cpp | 2 +- code/game/g_savegame.cpp | 2 +- code/icarus/IcarusImplementation.cpp | 2 +- code/qcommon/cm_load.cpp | 2 +- code/rd-vanilla/G2_misc.cpp | 2 +- code/server/sv_savegame.cpp | 2 +- codeJK2/cgame/cg_main.cpp | 2 +- codeJK2/game/G_Timer.cpp | 2 +- codeJK2/game/Q3_Registers.cpp | 2 +- codeJK2/game/g_main.cpp | 2 +- codeJK2/game/g_objectives.cpp | 2 +- codeJK2/game/g_roff.cpp | 2 +- codeJK2/game/g_savegame.cpp | 2 +- codeJK2/icarus/Instance.cpp | 2 +- codeJK2/icarus/Sequence.cpp | 2 +- codeJK2/icarus/Sequencer.cpp | 2 +- codeJK2/icarus/TaskManager.cpp | 2 +- shared/qcommon/ojk_saved_game.cpp | 189 +++++++++++++++++++++++---- shared/qcommon/ojk_saved_game_fwd.h | 20 ++- 24 files changed, 195 insertions(+), 58 deletions(-) diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index d93d4f7adb..2ffa679b73 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -29,7 +29,7 @@ along with this program; if not, see . #include "../qcommon/sstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char > namePrecache_m; diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index 2e97b4038f..eb8cf38570 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -23,7 +23,7 @@ along with this program; if not, see . #include "g_local.h" #include "../Rufl/hstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" #define MAX_GTIMERS 16384 diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index e395e1fb0f..13e9c5dbe8 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -41,7 +41,7 @@ along with this program; if not, see . #include "g_vehicles.h" #include "g_navigator.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" extern cvar_t *com_buildScript; diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index e01516cac7..302d856cf2 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -37,7 +37,7 @@ along with this program; if not, see . //rww - RAGDOLL_END #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" extern void WP_SaberLoadParms( void ); extern qboolean G_PlayerSpawned( void ); diff --git a/code/game/g_objectives.cpp b/code/game/g_objectives.cpp index 4f0dd85563..e7a87d79f4 100644 --- a/code/game/g_objectives.cpp +++ b/code/game/g_objectives.cpp @@ -30,7 +30,7 @@ along with this program; if not, see . #include "objectives.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" qboolean missionInfo_Updated; diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp index 3ed0d3dfab..8fdecd1fa1 100644 --- a/code/game/g_roff.cpp +++ b/code/game/g_roff.cpp @@ -26,7 +26,7 @@ along with this program; if not, see . #include "../cgame/cg_local.h" #include "g_functions.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" // The list of precached ROFFs roff_list_t roffs[MAX_ROFFS]; diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index f62c7ffa87..dcc46aa4a5 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -31,7 +31,7 @@ along with this program; if not, see . #include "../cgame/cg_camera.h" #include "../qcommon/sstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" extern void OBJ_LoadTacticalInfo(void); diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index f404f51a16..bc2ecff90f 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -34,7 +34,7 @@ along with this program; if not, see . #include "../qcommon/q_shared.h" #include "../qcommon/qcommon.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" #define STL_ITERATE( a, b ) for ( a = b.begin(); a != b.end(); ++a ) #define STL_INSERT( a, b ) a.insert( a.end(), b ); diff --git a/code/qcommon/cm_load.cpp b/code/qcommon/cm_load.cpp index f2573e9afb..d809a7e1ab 100644 --- a/code/qcommon/cm_load.cpp +++ b/code/qcommon/cm_load.cpp @@ -25,7 +25,7 @@ along with this program; if not, see . #include "cm_local.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" #ifdef BSPC void SetPlaneSignbits (cplane_t *out) { diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index 9ce7074ab0..5b51819680 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -51,7 +51,7 @@ along with this program; if not, see . #ifdef _G2_GORE #include "../ghoul2/ghoul2_gore.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" #define GORE_TAG_UPPER (256) #define GORE_TAG_MASK (~255) diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 305a06bee9..03e62561d0 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -38,7 +38,7 @@ along with this program; if not, see . #include #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" static char saveGameComment[iSG_COMMENT_SIZE]; diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index 3ff00fb3b7..c4c84fc1ac 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -29,7 +29,7 @@ along with this program; if not, see . #include "../../code/qcommon/sstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char, std::less, std::allocator< unsigned char > > namePrecache_m; diff --git a/codeJK2/game/G_Timer.cpp b/codeJK2/game/G_Timer.cpp index 26197b29c9..80fb4be921 100644 --- a/codeJK2/game/G_Timer.cpp +++ b/codeJK2/game/G_Timer.cpp @@ -24,7 +24,7 @@ along with this program; if not, see . #include "g_local.h" #include "../../code/Rufl/hstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" #define MAX_GTIMERS 16384 diff --git a/codeJK2/game/Q3_Registers.cpp b/codeJK2/game/Q3_Registers.cpp index 87c21a5cae..269e4f6106 100644 --- a/codeJK2/game/Q3_Registers.cpp +++ b/codeJK2/game/Q3_Registers.cpp @@ -25,7 +25,7 @@ along with this program; if not, see . #include "g_local.h" #include "Q3_Registers.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" extern void Q3_DebugPrint( int level, const char *format, ... ); diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp index 76f6f96271..bc09a5dd77 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -36,7 +36,7 @@ along with this program; if not, see . #include "../cgame/cg_local.h" // yeah I know this is naughty, but we're shipping soon... #include "time.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" extern CNavigator navigator; diff --git a/codeJK2/game/g_objectives.cpp b/codeJK2/game/g_objectives.cpp index 9fdbc4c956..8420d2a006 100644 --- a/codeJK2/game/g_objectives.cpp +++ b/codeJK2/game/g_objectives.cpp @@ -32,7 +32,7 @@ along with this program; if not, see . #include "objectives.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" qboolean missionInfo_Updated; diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp index 749c7e0cf8..abdda306c5 100644 --- a/codeJK2/game/g_roff.cpp +++ b/codeJK2/game/g_roff.cpp @@ -26,7 +26,7 @@ along with this program; if not, see . #include "g_roff.h" #include "g_icarus.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" // The list of precached ROFFs roff_list_t roffs[MAX_ROFFS]; diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index 799c9e913f..e0e4333aac 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -34,7 +34,7 @@ along with this program; if not, see . #include "g_icarus.h" #include "../../code/qcommon/sstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" extern void OBJ_LoadTacticalInfo(void); diff --git a/codeJK2/icarus/Instance.cpp b/codeJK2/icarus/Instance.cpp index 6a833f5ed6..0d9693b9bd 100644 --- a/codeJK2/icarus/Instance.cpp +++ b/codeJK2/icarus/Instance.cpp @@ -30,7 +30,7 @@ along with this program; if not, see . #include #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" // Instance diff --git a/codeJK2/icarus/Sequence.cpp b/codeJK2/icarus/Sequence.cpp index 7f2cbbace4..5add77e5f4 100644 --- a/codeJK2/icarus/Sequence.cpp +++ b/codeJK2/icarus/Sequence.cpp @@ -29,7 +29,7 @@ along with this program; if not, see . #include #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" CSequence::CSequence( void ) { diff --git a/codeJK2/icarus/Sequencer.cpp b/codeJK2/icarus/Sequencer.cpp index 8096d3fd50..bbf71843be 100644 --- a/codeJK2/icarus/Sequencer.cpp +++ b/codeJK2/icarus/Sequencer.cpp @@ -31,7 +31,7 @@ along with this program; if not, see . #include "assert.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_sg_archive.h" +#include "qcommon/ojk_saved_game_fwd.h" // Sequencer diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index 3b32e5385e..f17bad72d3 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -32,7 +32,7 @@ along with this program; if not, see . #include #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_fwd.h" #define ICARUS_VALIDATE(a) if ( a == false ) return TASK_FAILED; diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index dd3f384982..343d559820 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -12,7 +12,7 @@ SavedGame::SavedGame() : io_buffer_(), io_buffer_offset_(), rle_buffer_(), - is_testing_read_chunk_() + is_preview_mode_() { } @@ -121,8 +121,126 @@ void SavedGame::close() bool SavedGame::read_chunk( const SavedGame::ChunkId chunk_id) { - throw SavedGameException( - "Not implemented."); + auto chunk_id_string = get_chunk_id_string( + chunk_id); + + ::Com_DPrintf( + "Attempting read of chunk %s\n", + chunk_id_string.c_str()); + + // Load in chid and length... + // + uint32_t ulLoadedChid = 0; + uint32_t uiLoadedLength = 0; + + auto uiLoaded = ::FS_Read( + &ulLoadedChid, + static_cast(sizeof(ulLoadedChid)), + file_handle_); + + uiLoaded += ::FS_Read( + &uiLoadedLength, + static_cast(sizeof(uiLoadedLength)), + file_handle_); + + auto bBlockIsCompressed = (static_cast(uiLoadedLength) < 0); + + if (bBlockIsCompressed) { + uiLoadedLength = -static_cast(uiLoadedLength); + } + + // Make sure we are loading the correct chunk... + // + if (ulLoadedChid != chunk_id) { + auto loaded_chunk_id_string = get_chunk_id_string(ulLoadedChid); + + if (!is_preview_mode_) { + ::Com_Error( + ERR_DROP, + "Loaded chunk ID (%s) does not match requested chunk ID (%s)", + loaded_chunk_id_string.c_str(), + chunk_id_string.c_str()); + } + + return false; + } + + // Load in data and magic number... + // + uint32_t uiCompressedLength = 0; + + if (bBlockIsCompressed) { + uiLoaded += ::FS_Read( + &uiCompressedLength, + static_cast(uiCompressedLength), + file_handle_); + + rle_buffer_.resize( + uiCompressedLength); + + uiLoaded += ::FS_Read( + rle_buffer_.data(), + uiCompressedLength, + file_handle_); + + decompress( + rle_buffer_, + io_buffer_); + } else { + io_buffer_.resize( + uiLoadedLength); + + uiLoaded += ::FS_Read( + io_buffer_.data(), + uiLoadedLength, + file_handle_); + } + + // Get checksum... + // + uint32_t uiLoadedCksum = 0; + + uiLoaded += ::FS_Read( + &uiLoadedCksum, + static_cast(sizeof(uiLoadedCksum)), + file_handle_); + + // Make sure the checksums match... + // + auto uiCksum = ::Com_BlockChecksum( + io_buffer_.data(), + static_cast(io_buffer_.size())); + + if (uiLoadedCksum != uiCksum) { + if (!is_preview_mode_) { + ::Com_Error( + ERR_DROP, + "Failed checksum check for chunk", + chunk_id_string.c_str()); + } + + return false; + } + + // Make sure we didn't encounter any read errors... + if (uiLoaded != + sizeof(ulLoadedChid) + + sizeof(uiLoadedLength) + + sizeof(uiLoadedCksum) + + (bBlockIsCompressed ? sizeof(uiCompressedLength) : 0) + + (bBlockIsCompressed ? uiCompressedLength : io_buffer_.size())) + { + if (!is_preview_mode_) { + ::Com_Error( + ERR_DROP, + "Error during loading chunk %s", + chunk_id_string.c_str()); + } + + return false; + } + + return true; } bool SavedGame::write_chunk( @@ -169,22 +287,24 @@ SavedGame& SavedGame::get_instance() return result; } -int SavedGame::compress() +void SavedGame::compress( + const Buffer& src_buffer, + Buffer& dst_buffer) { - auto src_size = static_cast(io_buffer_.size()); + auto src_size = static_cast(src_buffer.size()); - rle_buffer_.resize(2 * src_size); + dst_buffer.resize(2 * src_size); int src_count = 0; int dst_index = 0; while (src_count < src_size) { auto src_index = src_count; - auto b = io_buffer_[src_index++]; + auto b = src_buffer[src_index++]; while (src_index < src_size && (src_index - src_count) < 127 && - io_buffer_[src_index] == b) + src_buffer[src_index] == b) { src_index += 1; } @@ -192,73 +312,71 @@ int SavedGame::compress() if ((src_index - src_count) == 1) { while (src_index < src_size && (src_index - src_count) < 127 && ( - io_buffer_[src_index] != io_buffer_[src_index - 1] || ( + src_buffer[src_index] != src_buffer[src_index - 1] || ( src_index > 1 && - io_buffer_[src_index] != io_buffer_[src_index - 2]))) + src_buffer[src_index] != src_buffer[src_index - 2]))) { src_index += 1; } while (src_index < src_size && - io_buffer_[src_index] == io_buffer_[src_index - 1]) + src_buffer[src_index] == src_buffer[src_index - 1]) { src_index -= 1; } - rle_buffer_[dst_index++] = + dst_buffer[dst_index++] = static_cast(src_count - src_index); for (auto i = src_count; i < src_index; ++i) { - rle_buffer_[dst_index++] = io_buffer_[i]; + dst_buffer[dst_index++] = src_buffer[i]; } } else { - rle_buffer_[dst_index++] = + dst_buffer[dst_index++] = static_cast(src_index - src_count); - rle_buffer_[dst_index++] = b; + dst_buffer[dst_index++] = b; } src_count = src_index; } - rle_buffer_.resize( + dst_buffer.resize( dst_index); - - return dst_index; } void SavedGame::decompress( - int dst_size) + const Buffer& src_buffer, + Buffer& dst_buffer) { - rle_buffer_.resize( - dst_size); - int src_index = 0; int dst_index = 0; - while (dst_size > 0) { - auto count = static_cast(io_buffer_[src_index++]); + auto remain_size = static_cast(dst_buffer.size()); + + while (remain_size > 0) { + auto count = static_cast(src_buffer[src_index++]); if (count > 0) { std::uninitialized_fill_n( - &rle_buffer_[dst_index], + &dst_buffer[dst_index], count, - io_buffer_[src_index++]); + src_buffer[src_index++]); } else { if (count < 0) { count = -count; std::uninitialized_copy_n( - &io_buffer_[src_index], + &src_buffer[src_index], count, - &rle_buffer_[dst_index]); + &dst_buffer[dst_index]); src_index += count; } } dst_index += count; - dst_size -= count; + remain_size -= count; } } @@ -309,5 +427,18 @@ std::string SavedGame::get_failed_to_open_message( return result; } +std::string SavedGame::get_chunk_id_string( + uint32_t chunk_id) +{ + std::string result(4, '\0'); + + result[0] = static_cast((chunk_id >> 24) & 0xFF); + result[1] = static_cast((chunk_id >> 16) & 0xFF); + result[2] = static_cast((chunk_id >> 8) & 0xFF); + result[3] = static_cast((chunk_id >> 0) & 0xFF); + + return result; +} + } // ojk diff --git a/shared/qcommon/ojk_saved_game_fwd.h b/shared/qcommon/ojk_saved_game_fwd.h index 0c1886c905..55f932cf14 100644 --- a/shared/qcommon/ojk_saved_game_fwd.h +++ b/shared/qcommon/ojk_saved_game_fwd.h @@ -152,16 +152,18 @@ class SavedGame Buffer rle_buffer_; // Does not throws an exception on chunk reading if true. - bool is_testing_read_chunk_; + bool is_preview_mode_; - // Compresses I/O buffer into RLE one. - // Returns a size of compressed data. - int compress(); + // Compresses data. + static void compress( + const Buffer& src_buffer, + Buffer& dst_buffer); - // Decompresses I/O buffer into RLE one. - void decompress( - int dst_size); + // Decompresses data. + static void decompress( + const Buffer& src_buffer, + Buffer& dst_buffer); static std::string generate_path( @@ -172,6 +174,10 @@ class SavedGame bool is_open); + static std::string get_chunk_id_string( + uint32_t chunk_id); + + // Checks if there is enough data for reading in the I/O buffer. template void check_io_buffer( From b53bc1fb67163c36f0eb96da9735654039d9478e Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Fri, 8 Jul 2016 18:14:06 +0300 Subject: [PATCH 238/445] Implement write_chunk --- shared/qcommon/ojk_saved_game.cpp | 122 +++++++++++++++++++++++++++- shared/qcommon/ojk_saved_game_fwd.h | 2 + 2 files changed, 121 insertions(+), 3 deletions(-) diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index 343d559820..bd1209817c 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -12,7 +12,8 @@ SavedGame::SavedGame() : io_buffer_(), io_buffer_offset_(), rle_buffer_(), - is_preview_mode_() + is_preview_mode_(), + is_write_failed_() { } @@ -24,6 +25,9 @@ SavedGame::~SavedGame() bool SavedGame::open( const std::string& base_file_name) { + close(); + + auto&& file_path = generate_path( base_file_name); @@ -77,6 +81,9 @@ bool SavedGame::open( bool SavedGame::create( const std::string& base_file_name) { + close(); + + remove( base_file_name); @@ -116,6 +123,8 @@ void SavedGame::close() io_buffer_.clear(); io_buffer_offset_ = 0; + + is_write_failed_ = false; } bool SavedGame::read_chunk( @@ -246,8 +255,115 @@ bool SavedGame::read_chunk( bool SavedGame::write_chunk( const SavedGame::ChunkId chunk_id) { - throw SavedGameException( - "Not implemented."); + auto chunk_id_string = get_chunk_id_string( + chunk_id); + + ::Com_DPrintf( + "Attempting write of chunk %s\n", + chunk_id_string.c_str()); + + if (::sv_testsave->integer != 0) { + return true; + } + + auto src_size = static_cast(io_buffer_.size()); + + auto uiCksum = Com_BlockChecksum( + io_buffer_.data(), + src_size); + + uint32_t uiSaved = ::FS_Write( + &chunk_id, + static_cast(sizeof(chunk_id)), + file_handle_); + + int iCompressedLength = 0; + + if (::sv_compress_saved_games->integer == 0) { + iCompressedLength = -1; + } else { + compress( + io_buffer_, + rle_buffer_); + + if (rle_buffer_.size() < io_buffer_.size()) { + iCompressedLength = static_cast(rle_buffer_.size()); + } + } + + if (iCompressedLength >= 0) { + auto iLength = -static_cast(io_buffer_.size()); + + uiSaved += ::FS_Write( + &iLength, + static_cast(sizeof(iLength)), + file_handle_); + + uiSaved += ::FS_Write( + &iCompressedLength, + static_cast(sizeof(iCompressedLength)), + file_handle_); + + uiSaved += ::FS_Write( + rle_buffer_.data(), + iCompressedLength, + file_handle_); + + uiSaved += ::FS_Write( + &uiCksum, + static_cast(sizeof(uiCksum)), + file_handle_); + + if (uiSaved != + sizeof(chunk_id) + + sizeof(iLength) + + sizeof(uiCksum) + + sizeof(iCompressedLength) + + iCompressedLength) + { + is_write_failed_ = true; + + ::Com_Printf( + S_COLOR_RED "Failed to write %s chunk\n", + chunk_id_string.c_str()); + + return false; + } + } else { + auto iLength = static_cast(io_buffer_.size()); + + uiSaved += ::FS_Write( + &iLength, + static_cast(sizeof(iLength)), + file_handle_); + + uiSaved += ::FS_Write( + io_buffer_.data(), + iLength, + file_handle_); + + uiSaved += ::FS_Write( + &uiCksum, + static_cast(sizeof(uiCksum)), + file_handle_); + + if (uiSaved != + sizeof(chunk_id) + + sizeof(iLength) + + sizeof(uiCksum) + + iLength) + { + is_write_failed_ = true; + + ::Com_Printf( + S_COLOR_RED "Failed to write %s chunk\n", + chunk_id_string.c_str()); + + return false; + } + } + + return true; } void SavedGame::rename( diff --git a/shared/qcommon/ojk_saved_game_fwd.h b/shared/qcommon/ojk_saved_game_fwd.h index 55f932cf14..db2b818d44 100644 --- a/shared/qcommon/ojk_saved_game_fwd.h +++ b/shared/qcommon/ojk_saved_game_fwd.h @@ -154,6 +154,8 @@ class SavedGame // Does not throws an exception on chunk reading if true. bool is_preview_mode_; + bool is_write_failed_; + // Compresses data. static void compress( From 4ca3defc455b028c1fdd15688e26d698fb5d9175 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 9 Jul 2016 15:17:46 +0300 Subject: [PATCH 239/445] Move definitions of import and export methods to code file --- code/cgame/FxScheduler.h | 20 +- code/game/CMakeLists.txt | 5 + code/game/ai.cpp | 66 +++ code/game/ai.h | 58 +-- code/game/b_public.cpp | 293 +++++++++++ code/game/b_public.h | 284 +--------- code/game/bg_public.cpp | 45 ++ code/game/bg_public.h | 38 +- code/game/g_local.cpp | 101 ++++ code/game/g_local.h | 90 +--- code/game/g_shared.cpp | 829 ++++++++++++++++++++++++++++++ code/game/g_shared.h | 785 +--------------------------- code/game/g_vehicles.cpp | 155 ++++++ code/game/g_vehicles.h | 140 +---- code/game/ghoul2_shared.h | 228 +------- code/qcommon/q_shared.cpp | 775 ++++++++++++++++++++++++++++ code/qcommon/q_shared.h | 742 +------------------------- code/rd-common/ghoul2_shared.cpp | 246 +++++++++ code/rd-common/mdx_format.cpp | 16 + code/rd-common/mdx_format.h | 10 +- code/rd-vanilla/CMakeLists.txt | 2 + codeJK2/game/CMakeLists.txt | 5 + codeJK2/game/ai.cpp | 67 +++ codeJK2/game/ai.h | 58 +-- codeJK2/game/b_public.cpp | 259 ++++++++++ codeJK2/game/b_public.h | 250 +-------- codeJK2/game/bg_public.cpp | 42 ++ codeJK2/game/bg_public.h | 34 +- codeJK2/game/g_local.cpp | 76 +++ codeJK2/game/g_local.h | 68 +-- codeJK2/game/g_shared.cpp | 815 +++++++++++++++++++++++++++++ codeJK2/game/g_shared.h | 766 +-------------------------- shared/qcommon/ojk_saved_game.cpp | 2 - 33 files changed, 3915 insertions(+), 3455 deletions(-) create mode 100644 code/game/ai.cpp create mode 100644 code/game/b_public.cpp create mode 100644 code/game/bg_public.cpp create mode 100644 code/game/g_local.cpp create mode 100644 code/game/g_shared.cpp create mode 100644 code/rd-common/ghoul2_shared.cpp create mode 100644 code/rd-common/mdx_format.cpp create mode 100644 codeJK2/game/ai.cpp create mode 100644 codeJK2/game/b_public.cpp create mode 100644 codeJK2/game/bg_public.cpp create mode 100644 codeJK2/game/g_local.cpp create mode 100644 codeJK2/game/g_shared.cpp diff --git a/code/cgame/FxScheduler.h b/code/cgame/FxScheduler.h index ac554da680..cfae83f22a 100644 --- a/code/cgame/FxScheduler.h +++ b/code/cgame/FxScheduler.h @@ -428,26 +428,10 @@ struct SLoopedEffect void sg_export( - SgType& dst) const - { - ::sg_export(mId, dst.mId); - ::sg_export(mBoltInfo, dst.mBoltInfo); - ::sg_export(mNextTime, dst.mNextTime); - ::sg_export(mLoopStopTime, dst.mLoopStopTime); - ::sg_export(mPortalEffect, dst.mPortalEffect); - ::sg_export(mIsRelative, dst.mIsRelative); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.mId, mId); - ::sg_import(src.mBoltInfo, mBoltInfo); - ::sg_import(src.mNextTime, mNextTime); - ::sg_import(src.mLoopStopTime, mLoopStopTime); - ::sg_import(src.mPortalEffect, mPortalEffect); - ::sg_import(src.mIsRelative, mIsRelative); - } + const SgType& src); }; class CFxScheduler diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 029b176d0f..7464fc50a8 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -149,11 +149,14 @@ set(SPGameGameFiles "${SPDir}/game/SpeederNPC.cpp" "${SPDir}/game/WalkerNPC.cpp" "${SPDir}/game/ai.h" + "${SPDir}/game/ai.cpp" "${SPDir}/game/anims.h" "${SPDir}/game/b_local.h" "${SPDir}/game/b_public.h" + "${SPDir}/game/b_public.cpp" "${SPDir}/game/bg_local.h" "${SPDir}/game/bg_public.h" + "${SPDir}/game/bg_public.cpp" "${SPDir}/game/bset.h" "${SPDir}/game/bstate.h" "${SPDir}/game/channels.h" @@ -164,11 +167,13 @@ set(SPGameGameFiles "${SPDir}/game/g_functions.h" "${SPDir}/game/g_items.h" "${SPDir}/game/g_local.h" + "${SPDir}/game/g_local.cpp" "${SPDir}/game/g_nav.h" "${SPDir}/game/g_navigator.h" "${SPDir}/game/g_public.h" "${SPDir}/game/g_roff.h" "${SPDir}/game/g_shared.h" + "${SPDir}/game/g_shared.cpp" "${SPDir}/game/genericparser2.h" "${SPDir}/game/ghoul2_shared.h" "${SPDir}/game/hitlocs.h" diff --git a/code/game/ai.cpp b/code/game/ai.cpp new file mode 100644 index 0000000000..bb93bc5b70 --- /dev/null +++ b/code/game/ai.cpp @@ -0,0 +1,66 @@ +#include "../cgame/cg_local.h" +#include "ai.h" +#include "qcommon/ojk_sg_wrappers.h" + + +void AIGroupMember_t::sg_export( + SgType& dst) const +{ + ::sg_export(number, dst.number); + ::sg_export(waypoint, dst.waypoint); + ::sg_export(pathCostToEnemy, dst.pathCostToEnemy); + ::sg_export(closestBuddy, dst.closestBuddy); +} + +void AIGroupMember_t::sg_import( + const SgType& src) +{ + ::sg_import(src.number, number); + ::sg_import(src.waypoint, waypoint); + ::sg_import(src.pathCostToEnemy, pathCostToEnemy); + ::sg_import(src.closestBuddy, closestBuddy); +} + +void AIGroupInfo_t::sg_export( + SgType& dst) const +{ + ::sg_export(numGroup, dst.numGroup); + ::sg_export(processed, dst.processed); + ::sg_export(team, dst.team); + ::sg_export(enemy, dst.enemy); + ::sg_export(enemyWP, dst.enemyWP); + ::sg_export(speechDebounceTime, dst.speechDebounceTime); + ::sg_export(lastClearShotTime, dst.lastClearShotTime); + ::sg_export(lastSeenEnemyTime, dst.lastSeenEnemyTime); + ::sg_export(morale, dst.morale); + ::sg_export(moraleAdjust, dst.moraleAdjust); + ::sg_export(moraleDebounce, dst.moraleDebounce); + ::sg_export(memberValidateTime, dst.memberValidateTime); + ::sg_export(activeMemberNum, dst.activeMemberNum); + ::sg_export(commander, dst.commander); + ::sg_export(enemyLastSeenPos, dst.enemyLastSeenPos); + ::sg_export(numState, dst.numState); + ::sg_export(member, dst.member); +} + +void AIGroupInfo_t::sg_import( + const SgType& src) +{ + ::sg_import(src.numGroup, numGroup); + ::sg_import(src.processed, processed); + ::sg_import(src.team, team); + ::sg_import(src.enemy, enemy); + ::sg_import(src.enemyWP, enemyWP); + ::sg_import(src.speechDebounceTime, speechDebounceTime); + ::sg_import(src.lastClearShotTime, lastClearShotTime); + ::sg_import(src.lastSeenEnemyTime, lastSeenEnemyTime); + ::sg_import(src.morale, morale); + ::sg_import(src.moraleAdjust, moraleAdjust); + ::sg_import(src.moraleDebounce, moraleDebounce); + ::sg_import(src.memberValidateTime, memberValidateTime); + ::sg_import(src.activeMemberNum, activeMemberNum); + ::sg_import(src.commander, commander); + ::sg_import(src.enemyLastSeenPos, enemyLastSeenPos); + ::sg_import(src.numState, numState); + ::sg_import(src.member, member); +} diff --git a/code/game/ai.h b/code/game/ai.h index 5ab6e78171..0749bdbe62 100644 --- a/code/game/ai.h +++ b/code/game/ai.h @@ -138,22 +138,10 @@ typedef struct AIGroupMember_s void sg_export( - SgType& dst) const - { - ::sg_export(number, dst.number); - ::sg_export(waypoint, dst.waypoint); - ::sg_export(pathCostToEnemy, dst.pathCostToEnemy); - ::sg_export(closestBuddy, dst.closestBuddy); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.number, number); - ::sg_import(src.waypoint, waypoint); - ::sg_import(src.pathCostToEnemy, pathCostToEnemy); - ::sg_import(src.closestBuddy, closestBuddy); - } + const SgType& src); } AIGroupMember_t; #define MAX_GROUP_MEMBERS 32 @@ -207,48 +195,10 @@ typedef struct AIGroupInfo_s void sg_export( - SgType& dst) const - { - ::sg_export(numGroup, dst.numGroup); - ::sg_export(processed, dst.processed); - ::sg_export(team, dst.team); - ::sg_export(enemy, dst.enemy); - ::sg_export(enemyWP, dst.enemyWP); - ::sg_export(speechDebounceTime, dst.speechDebounceTime); - ::sg_export(lastClearShotTime, dst.lastClearShotTime); - ::sg_export(lastSeenEnemyTime, dst.lastSeenEnemyTime); - ::sg_export(morale, dst.morale); - ::sg_export(moraleAdjust, dst.moraleAdjust); - ::sg_export(moraleDebounce, dst.moraleDebounce); - ::sg_export(memberValidateTime, dst.memberValidateTime); - ::sg_export(activeMemberNum, dst.activeMemberNum); - ::sg_export(commander, dst.commander); - ::sg_export(enemyLastSeenPos, dst.enemyLastSeenPos); - ::sg_export(numState, dst.numState); - ::sg_export(member, dst.member); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.numGroup, numGroup); - ::sg_import(src.processed, processed); - ::sg_import(src.team, team); - ::sg_import(src.enemy, enemy); - ::sg_import(src.enemyWP, enemyWP); - ::sg_import(src.speechDebounceTime, speechDebounceTime); - ::sg_import(src.lastClearShotTime, lastClearShotTime); - ::sg_import(src.lastSeenEnemyTime, lastSeenEnemyTime); - ::sg_import(src.morale, morale); - ::sg_import(src.moraleAdjust, moraleAdjust); - ::sg_import(src.moraleDebounce, moraleDebounce); - ::sg_import(src.memberValidateTime, memberValidateTime); - ::sg_import(src.activeMemberNum, activeMemberNum); - ::sg_import(src.commander, commander); - ::sg_import(src.enemyLastSeenPos, enemyLastSeenPos); - ::sg_import(src.numState, numState); - ::sg_import(src.member, member); - } + const SgType& src); } AIGroupInfo_t; diff --git a/code/game/b_public.cpp b/code/game/b_public.cpp new file mode 100644 index 0000000000..a7cf63f414 --- /dev/null +++ b/code/game/b_public.cpp @@ -0,0 +1,293 @@ +#include "b_local.h" +#include "b_public.h" +#include "qcommon/ojk_sg_wrappers.h" + + +void gNPCstats_t::sg_export( + SgType& dst) const +{ + ::sg_export(aggression, dst.aggression); + ::sg_export(aim, dst.aim); + ::sg_export(earshot, dst.earshot); + ::sg_export(evasion, dst.evasion); + ::sg_export(hfov, dst.hfov); + ::sg_export(intelligence, dst.intelligence); + ::sg_export(move, dst.move); + ::sg_export(reactions, dst.reactions); + ::sg_export(shootDistance, dst.shootDistance); + ::sg_export(vfov, dst.vfov); + ::sg_export(vigilance, dst.vigilance); + ::sg_export(visrange, dst.visrange); + ::sg_export(runSpeed, dst.runSpeed); + ::sg_export(walkSpeed, dst.walkSpeed); + ::sg_export(yawSpeed, dst.yawSpeed); + ::sg_export(health, dst.health); + ::sg_export(acceleration, dst.acceleration); + ::sg_export(sex, dst.sex); +} + +void gNPCstats_t::sg_import( + const SgType& src) +{ + ::sg_import(src.aggression, aggression); + ::sg_import(src.aim, aim); + ::sg_import(src.earshot, earshot); + ::sg_import(src.evasion, evasion); + ::sg_import(src.hfov, hfov); + ::sg_import(src.intelligence, intelligence); + ::sg_import(src.move, move); + ::sg_import(src.reactions, reactions); + ::sg_import(src.shootDistance, shootDistance); + ::sg_import(src.vfov, vfov); + ::sg_import(src.vigilance, vigilance); + ::sg_import(src.visrange, visrange); + ::sg_import(src.runSpeed, runSpeed); + ::sg_import(src.walkSpeed, walkSpeed); + ::sg_import(src.yawSpeed, yawSpeed); + ::sg_import(src.health, health); + ::sg_import(src.acceleration, acceleration); + ::sg_import(src.sex, sex); +} + + +void gNPC_t::sg_export( + SgType& dst) const +{ + ::sg_export(timeOfDeath, dst.timeOfDeath); + ::sg_export(touchedByPlayer, dst.touchedByPlayer); + ::sg_export(enemyLastVisibility, dst.enemyLastVisibility); + ::sg_export(aimTime, dst.aimTime); + ::sg_export(desiredYaw, dst.desiredYaw); + ::sg_export(desiredPitch, dst.desiredPitch); + ::sg_export(lockedDesiredYaw, dst.lockedDesiredYaw); + ::sg_export(lockedDesiredPitch, dst.lockedDesiredPitch); + ::sg_export(aimingBeam, dst.aimingBeam); + ::sg_export(enemyLastSeenLocation, dst.enemyLastSeenLocation); + ::sg_export(enemyLastSeenTime, dst.enemyLastSeenTime); + ::sg_export(enemyLastHeardLocation, dst.enemyLastHeardLocation); + ::sg_export(enemyLastHeardTime, dst.enemyLastHeardTime); + ::sg_export(lastAlertID, dst.lastAlertID); + ::sg_export(eFlags, dst.eFlags); + ::sg_export(aiFlags, dst.aiFlags); + ::sg_export(currentAmmo, dst.currentAmmo); + ::sg_export(shotTime, dst.shotTime); + ::sg_export(burstCount, dst.burstCount); + ::sg_export(burstMin, dst.burstMin); + +#ifdef BASE_SAVE_COMPAT + ::sg_export(burstMean, dst.burstMean); +#endif + + ::sg_export(burstMax, dst.burstMax); + ::sg_export(burstSpacing, dst.burstSpacing); + ::sg_export(attackHold, dst.attackHold); + ::sg_export(attackHoldTime, dst.attackHoldTime); + ::sg_export(shootAngles, dst.shootAngles); + ::sg_export(rank, dst.rank); + ::sg_export(behaviorState, dst.behaviorState); + ::sg_export(defaultBehavior, dst.defaultBehavior); + ::sg_export(tempBehavior, dst.tempBehavior); + ::sg_export(ignorePain, dst.ignorePain); + ::sg_export(duckDebounceTime, dst.duckDebounceTime); + ::sg_export(walkDebounceTime, dst.walkDebounceTime); + ::sg_export(enemyCheckDebounceTime, dst.enemyCheckDebounceTime); + ::sg_export(investigateDebounceTime, dst.investigateDebounceTime); + ::sg_export(investigateCount, dst.investigateCount); + ::sg_export(investigateGoal, dst.investigateGoal); + ::sg_export(investigateSoundDebounceTime, dst.investigateSoundDebounceTime); + ::sg_export(greetingDebounceTime, dst.greetingDebounceTime); + ::sg_export(eventOwner, dst.eventOwner); + ::sg_export(coverTarg, dst.coverTarg); + ::sg_export(jumpState, dst.jumpState); + ::sg_export(followDist, dst.followDist); + ::sg_export(tempGoal, dst.tempGoal); + ::sg_export(goalEntity, dst.goalEntity); + ::sg_export(lastGoalEntity, dst.lastGoalEntity); + ::sg_export(eventualGoal, dst.eventualGoal); + ::sg_export(captureGoal, dst.captureGoal); + ::sg_export(defendEnt, dst.defendEnt); + ::sg_export(greetEnt, dst.greetEnt); + ::sg_export(goalTime, dst.goalTime); + ::sg_export(straightToGoal, dst.straightToGoal); + ::sg_export(distToGoal, dst.distToGoal); + ::sg_export(navTime, dst.navTime); + ::sg_export(blockingEntNum, dst.blockingEntNum); + ::sg_export(blockedSpeechDebounceTime, dst.blockedSpeechDebounceTime); + ::sg_export(homeWp, dst.homeWp); + ::sg_export(avoidSide, dst.avoidSide); + ::sg_export(leaderAvoidSide, dst.leaderAvoidSide); + ::sg_export(lastAvoidSteerSide, dst.lastAvoidSteerSide); + ::sg_export(lastAvoidSteerSideDebouncer, dst.lastAvoidSteerSideDebouncer); + ::sg_export(group, dst.group); + ::sg_export(troop, dst.troop); + ::sg_export(lastPathAngles, dst.lastPathAngles); + ::sg_export(stats, dst.stats); + ::sg_export(aimErrorDebounceTime, dst.aimErrorDebounceTime); + ::sg_export(lastAimErrorYaw, dst.lastAimErrorYaw); + ::sg_export(lastAimErrorPitch, dst.lastAimErrorPitch); + ::sg_export(aimOfs, dst.aimOfs); + ::sg_export(currentAim, dst.currentAim); + ::sg_export(currentAggression, dst.currentAggression); + ::sg_export(scriptFlags, dst.scriptFlags); + ::sg_export(desiredSpeed, dst.desiredSpeed); + ::sg_export(currentSpeed, dst.currentSpeed); + ::sg_export(last_forwardmove, dst.last_forwardmove); + ::sg_export(last_rightmove, dst.last_rightmove); + ::sg_export(lastClearOrigin, dst.lastClearOrigin); + ::sg_export(shoveCount, dst.shoveCount); + ::sg_export(blockedDebounceTime, dst.blockedDebounceTime); + ::sg_export(blockedEntity, dst.blockedEntity); + ::sg_export(blockedTargetPosition, dst.blockedTargetPosition); + ::sg_export(blockedTargetEntity, dst.blockedTargetEntity); + ::sg_export(jumpDest, dst.jumpDest); + ::sg_export(jumpTarget, dst.jumpTarget); + ::sg_export(jumpMaxXYDist, dst.jumpMaxXYDist); + ::sg_export(jumpMazZDist, dst.jumpMazZDist); + ::sg_export(jumpSide, dst.jumpSide); + ::sg_export(jumpTime, dst.jumpTime); + ::sg_export(jumpBackupTime, dst.jumpBackupTime); + ::sg_export(jumpNextCheckTime, dst.jumpNextCheckTime); + ::sg_export(combatPoint, dst.combatPoint); + ::sg_export(lastFailedCombatPoint, dst.lastFailedCombatPoint); + ::sg_export(movementSpeech, dst.movementSpeech); + ::sg_export(movementSpeechChance, dst.movementSpeechChance); + ::sg_export(nextBStateThink, dst.nextBStateThink); + ::sg_export(last_ucmd, dst.last_ucmd); + ::sg_export(combatMove, dst.combatMove); + ::sg_export(goalRadius, dst.goalRadius); + ::sg_export(pauseTime, dst.pauseTime); + ::sg_export(standTime, dst.standTime); + ::sg_export(localState, dst.localState); + ::sg_export(squadState, dst.squadState); + ::sg_export(confusionTime, dst.confusionTime); + ::sg_export(charmedTime, dst.charmedTime); + ::sg_export(controlledTime, dst.controlledTime); + ::sg_export(surrenderTime, dst.surrenderTime); + ::sg_export(kneelTime, dst.kneelTime); + ::sg_export(enemyLaggedPos, dst.enemyLaggedPos); + ::sg_export(watchTarget, dst.watchTarget); + ::sg_export(ffireCount, dst.ffireCount); + ::sg_export(ffireDebounce, dst.ffireDebounce); + ::sg_export(ffireFadeDebounce, dst.ffireFadeDebounce); +} + +void gNPC_t::sg_import( + const SgType& src) +{ + ::sg_import(src.timeOfDeath, timeOfDeath); + ::sg_import(src.touchedByPlayer, touchedByPlayer); + ::sg_import(src.enemyLastVisibility, enemyLastVisibility); + ::sg_import(src.aimTime, aimTime); + ::sg_import(src.desiredYaw, desiredYaw); + ::sg_import(src.desiredPitch, desiredPitch); + ::sg_import(src.lockedDesiredYaw, lockedDesiredYaw); + ::sg_import(src.lockedDesiredPitch, lockedDesiredPitch); + ::sg_import(src.aimingBeam, aimingBeam); + ::sg_import(src.enemyLastSeenLocation, enemyLastSeenLocation); + ::sg_import(src.enemyLastSeenTime, enemyLastSeenTime); + ::sg_import(src.enemyLastHeardLocation, enemyLastHeardLocation); + ::sg_import(src.enemyLastHeardTime, enemyLastHeardTime); + ::sg_import(src.lastAlertID, lastAlertID); + ::sg_import(src.eFlags, eFlags); + ::sg_import(src.aiFlags, aiFlags); + ::sg_import(src.currentAmmo, currentAmmo); + ::sg_import(src.shotTime, shotTime); + ::sg_import(src.burstCount, burstCount); + ::sg_import(src.burstMin, burstMin); + +#ifdef BASE_SAVE_COMPAT + ::sg_import(src.burstMean, burstMean); +#endif + + ::sg_import(src.burstMax, burstMax); + ::sg_import(src.burstSpacing, burstSpacing); + ::sg_import(src.attackHold, attackHold); + ::sg_import(src.attackHoldTime, attackHoldTime); + ::sg_import(src.shootAngles, shootAngles); + ::sg_import(src.rank, rank); + ::sg_import(src.behaviorState, behaviorState); + ::sg_import(src.defaultBehavior, defaultBehavior); + ::sg_import(src.tempBehavior, tempBehavior); + ::sg_import(src.ignorePain, ignorePain); + ::sg_import(src.duckDebounceTime, duckDebounceTime); + ::sg_import(src.walkDebounceTime, walkDebounceTime); + ::sg_import(src.enemyCheckDebounceTime, enemyCheckDebounceTime); + ::sg_import(src.investigateDebounceTime, investigateDebounceTime); + ::sg_import(src.investigateCount, investigateCount); + ::sg_import(src.investigateGoal, investigateGoal); + ::sg_import(src.investigateSoundDebounceTime, investigateSoundDebounceTime); + ::sg_import(src.greetingDebounceTime, greetingDebounceTime); + ::sg_import(src.eventOwner, eventOwner); + ::sg_import(src.coverTarg, coverTarg); + ::sg_import(src.jumpState, jumpState); + ::sg_import(src.followDist, followDist); + ::sg_import(src.tempGoal, tempGoal); + ::sg_import(src.goalEntity, goalEntity); + ::sg_import(src.lastGoalEntity, lastGoalEntity); + ::sg_import(src.eventualGoal, eventualGoal); + ::sg_import(src.captureGoal, captureGoal); + ::sg_import(src.defendEnt, defendEnt); + ::sg_import(src.greetEnt, greetEnt); + ::sg_import(src.goalTime, goalTime); + ::sg_import(src.straightToGoal, straightToGoal); + ::sg_import(src.distToGoal, distToGoal); + ::sg_import(src.navTime, navTime); + ::sg_import(src.blockingEntNum, blockingEntNum); + ::sg_import(src.blockedSpeechDebounceTime, blockedSpeechDebounceTime); + ::sg_import(src.homeWp, homeWp); + ::sg_import(src.avoidSide, avoidSide); + ::sg_import(src.leaderAvoidSide, leaderAvoidSide); + ::sg_import(src.lastAvoidSteerSide, lastAvoidSteerSide); + ::sg_import(src.lastAvoidSteerSideDebouncer, lastAvoidSteerSideDebouncer); + ::sg_import(src.group, group); + ::sg_import(src.troop, troop); + ::sg_import(src.lastPathAngles, lastPathAngles); + ::sg_import(src.stats, stats); + ::sg_import(src.aimErrorDebounceTime, aimErrorDebounceTime); + ::sg_import(src.lastAimErrorYaw, lastAimErrorYaw); + ::sg_import(src.lastAimErrorPitch, lastAimErrorPitch); + ::sg_import(src.aimOfs, aimOfs); + ::sg_import(src.currentAim, currentAim); + ::sg_import(src.currentAggression, currentAggression); + ::sg_import(src.scriptFlags, scriptFlags); + ::sg_import(src.desiredSpeed, desiredSpeed); + ::sg_import(src.currentSpeed, currentSpeed); + ::sg_import(src.last_forwardmove, last_forwardmove); + ::sg_import(src.last_rightmove, last_rightmove); + ::sg_import(src.lastClearOrigin, lastClearOrigin); + ::sg_import(src.shoveCount, shoveCount); + ::sg_import(src.blockedDebounceTime, blockedDebounceTime); + ::sg_import(src.blockedEntity, blockedEntity); + ::sg_import(src.blockedTargetPosition, blockedTargetPosition); + ::sg_import(src.blockedTargetEntity, blockedTargetEntity); + ::sg_import(src.jumpDest, jumpDest); + ::sg_import(src.jumpTarget, jumpTarget); + ::sg_import(src.jumpMaxXYDist, jumpMaxXYDist); + ::sg_import(src.jumpMazZDist, jumpMazZDist); + ::sg_import(src.jumpSide, jumpSide); + ::sg_import(src.jumpTime, jumpTime); + ::sg_import(src.jumpBackupTime, jumpBackupTime); + ::sg_import(src.jumpNextCheckTime, jumpNextCheckTime); + ::sg_import(src.combatPoint, combatPoint); + ::sg_import(src.lastFailedCombatPoint, lastFailedCombatPoint); + ::sg_import(src.movementSpeech, movementSpeech); + ::sg_import(src.movementSpeechChance, movementSpeechChance); + ::sg_import(src.nextBStateThink, nextBStateThink); + ::sg_import(src.last_ucmd, last_ucmd); + ::sg_import(src.combatMove, combatMove); + ::sg_import(src.goalRadius, goalRadius); + ::sg_import(src.pauseTime, pauseTime); + ::sg_import(src.standTime, standTime); + ::sg_import(src.localState, localState); + ::sg_import(src.squadState, squadState); + ::sg_import(src.confusionTime, confusionTime); + ::sg_import(src.charmedTime, charmedTime); + ::sg_import(src.controlledTime, controlledTime); + ::sg_import(src.surrenderTime, surrenderTime); + ::sg_import(src.kneelTime, kneelTime); + ::sg_import(src.enemyLaggedPos, enemyLaggedPos); + ::sg_import(src.watchTarget, watchTarget); + ::sg_import(src.ffireCount, ffireCount); + ::sg_import(src.ffireDebounce, ffireDebounce); + ::sg_import(src.ffireFadeDebounce, ffireFadeDebounce); +} diff --git a/code/game/b_public.h b/code/game/b_public.h index 8117edc91d..526ad24cce 100644 --- a/code/game/b_public.h +++ b/code/game/b_public.h @@ -186,50 +186,10 @@ typedef struct gNPCstats_e void sg_export( - SgType& dst) const - { - ::sg_export(aggression, dst.aggression); - ::sg_export(aim, dst.aim); - ::sg_export(earshot, dst.earshot); - ::sg_export(evasion, dst.evasion); - ::sg_export(hfov, dst.hfov); - ::sg_export(intelligence, dst.intelligence); - ::sg_export(move, dst.move); - ::sg_export(reactions, dst.reactions); - ::sg_export(shootDistance, dst.shootDistance); - ::sg_export(vfov, dst.vfov); - ::sg_export(vigilance, dst.vigilance); - ::sg_export(visrange, dst.visrange); - ::sg_export(runSpeed, dst.runSpeed); - ::sg_export(walkSpeed, dst.walkSpeed); - ::sg_export(yawSpeed, dst.yawSpeed); - ::sg_export(health, dst.health); - ::sg_export(acceleration, dst.acceleration); - ::sg_export(sex, dst.sex); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.aggression, aggression); - ::sg_import(src.aim, aim); - ::sg_import(src.earshot, earshot); - ::sg_import(src.evasion, evasion); - ::sg_import(src.hfov, hfov); - ::sg_import(src.intelligence, intelligence); - ::sg_import(src.move, move); - ::sg_import(src.reactions, reactions); - ::sg_import(src.shootDistance, shootDistance); - ::sg_import(src.vfov, vfov); - ::sg_import(src.vigilance, vigilance); - ::sg_import(src.visrange, visrange); - ::sg_import(src.runSpeed, runSpeed); - ::sg_import(src.walkSpeed, walkSpeed); - ::sg_import(src.yawSpeed, yawSpeed); - ::sg_import(src.health, health); - ::sg_import(src.acceleration, acceleration); - ::sg_import(src.sex, sex); - } + const SgType& src); } gNPCstats_t; @@ -536,246 +496,10 @@ typedef struct void sg_export( - SgType& dst) const - { - ::sg_export(timeOfDeath, dst.timeOfDeath); - ::sg_export(touchedByPlayer, dst.touchedByPlayer); - ::sg_export(enemyLastVisibility, dst.enemyLastVisibility); - ::sg_export(aimTime, dst.aimTime); - ::sg_export(desiredYaw, dst.desiredYaw); - ::sg_export(desiredPitch, dst.desiredPitch); - ::sg_export(lockedDesiredYaw, dst.lockedDesiredYaw); - ::sg_export(lockedDesiredPitch, dst.lockedDesiredPitch); - ::sg_export(aimingBeam, dst.aimingBeam); - ::sg_export(enemyLastSeenLocation, dst.enemyLastSeenLocation); - ::sg_export(enemyLastSeenTime, dst.enemyLastSeenTime); - ::sg_export(enemyLastHeardLocation, dst.enemyLastHeardLocation); - ::sg_export(enemyLastHeardTime, dst.enemyLastHeardTime); - ::sg_export(lastAlertID, dst.lastAlertID); - ::sg_export(eFlags, dst.eFlags); - ::sg_export(aiFlags, dst.aiFlags); - ::sg_export(currentAmmo, dst.currentAmmo); - ::sg_export(shotTime, dst.shotTime); - ::sg_export(burstCount, dst.burstCount); - ::sg_export(burstMin, dst.burstMin); - -#ifdef BASE_SAVE_COMPAT - ::sg_export(burstMean, dst.burstMean); -#endif - - ::sg_export(burstMax, dst.burstMax); - ::sg_export(burstSpacing, dst.burstSpacing); - ::sg_export(attackHold, dst.attackHold); - ::sg_export(attackHoldTime, dst.attackHoldTime); - ::sg_export(shootAngles, dst.shootAngles); - ::sg_export(rank, dst.rank); - ::sg_export(behaviorState, dst.behaviorState); - ::sg_export(defaultBehavior, dst.defaultBehavior); - ::sg_export(tempBehavior, dst.tempBehavior); - ::sg_export(ignorePain, dst.ignorePain); - ::sg_export(duckDebounceTime, dst.duckDebounceTime); - ::sg_export(walkDebounceTime, dst.walkDebounceTime); - ::sg_export(enemyCheckDebounceTime, dst.enemyCheckDebounceTime); - ::sg_export(investigateDebounceTime, dst.investigateDebounceTime); - ::sg_export(investigateCount, dst.investigateCount); - ::sg_export(investigateGoal, dst.investigateGoal); - ::sg_export(investigateSoundDebounceTime, dst.investigateSoundDebounceTime); - ::sg_export(greetingDebounceTime, dst.greetingDebounceTime); - ::sg_export(eventOwner, dst.eventOwner); - ::sg_export(coverTarg, dst.coverTarg); - ::sg_export(jumpState, dst.jumpState); - ::sg_export(followDist, dst.followDist); - ::sg_export(tempGoal, dst.tempGoal); - ::sg_export(goalEntity, dst.goalEntity); - ::sg_export(lastGoalEntity, dst.lastGoalEntity); - ::sg_export(eventualGoal, dst.eventualGoal); - ::sg_export(captureGoal, dst.captureGoal); - ::sg_export(defendEnt, dst.defendEnt); - ::sg_export(greetEnt, dst.greetEnt); - ::sg_export(goalTime, dst.goalTime); - ::sg_export(straightToGoal, dst.straightToGoal); - ::sg_export(distToGoal, dst.distToGoal); - ::sg_export(navTime, dst.navTime); - ::sg_export(blockingEntNum, dst.blockingEntNum); - ::sg_export(blockedSpeechDebounceTime, dst.blockedSpeechDebounceTime); - ::sg_export(homeWp, dst.homeWp); - ::sg_export(avoidSide, dst.avoidSide); - ::sg_export(leaderAvoidSide, dst.leaderAvoidSide); - ::sg_export(lastAvoidSteerSide, dst.lastAvoidSteerSide); - ::sg_export(lastAvoidSteerSideDebouncer, dst.lastAvoidSteerSideDebouncer); - ::sg_export(group, dst.group); - ::sg_export(troop, dst.troop); - ::sg_export(lastPathAngles, dst.lastPathAngles); - ::sg_export(stats, dst.stats); - ::sg_export(aimErrorDebounceTime, dst.aimErrorDebounceTime); - ::sg_export(lastAimErrorYaw, dst.lastAimErrorYaw); - ::sg_export(lastAimErrorPitch, dst.lastAimErrorPitch); - ::sg_export(aimOfs, dst.aimOfs); - ::sg_export(currentAim, dst.currentAim); - ::sg_export(currentAggression, dst.currentAggression); - ::sg_export(scriptFlags, dst.scriptFlags); - ::sg_export(desiredSpeed, dst.desiredSpeed); - ::sg_export(currentSpeed, dst.currentSpeed); - ::sg_export(last_forwardmove, dst.last_forwardmove); - ::sg_export(last_rightmove, dst.last_rightmove); - ::sg_export(lastClearOrigin, dst.lastClearOrigin); - ::sg_export(shoveCount, dst.shoveCount); - ::sg_export(blockedDebounceTime, dst.blockedDebounceTime); - ::sg_export(blockedEntity, dst.blockedEntity); - ::sg_export(blockedTargetPosition, dst.blockedTargetPosition); - ::sg_export(blockedTargetEntity, dst.blockedTargetEntity); - ::sg_export(jumpDest, dst.jumpDest); - ::sg_export(jumpTarget, dst.jumpTarget); - ::sg_export(jumpMaxXYDist, dst.jumpMaxXYDist); - ::sg_export(jumpMazZDist, dst.jumpMazZDist); - ::sg_export(jumpSide, dst.jumpSide); - ::sg_export(jumpTime, dst.jumpTime); - ::sg_export(jumpBackupTime, dst.jumpBackupTime); - ::sg_export(jumpNextCheckTime, dst.jumpNextCheckTime); - ::sg_export(combatPoint, dst.combatPoint); - ::sg_export(lastFailedCombatPoint, dst.lastFailedCombatPoint); - ::sg_export(movementSpeech, dst.movementSpeech); - ::sg_export(movementSpeechChance, dst.movementSpeechChance); - ::sg_export(nextBStateThink, dst.nextBStateThink); - ::sg_export(last_ucmd, dst.last_ucmd); - ::sg_export(combatMove, dst.combatMove); - ::sg_export(goalRadius, dst.goalRadius); - ::sg_export(pauseTime, dst.pauseTime); - ::sg_export(standTime, dst.standTime); - ::sg_export(localState, dst.localState); - ::sg_export(squadState, dst.squadState); - ::sg_export(confusionTime, dst.confusionTime); - ::sg_export(charmedTime, dst.charmedTime); - ::sg_export(controlledTime, dst.controlledTime); - ::sg_export(surrenderTime, dst.surrenderTime); - ::sg_export(kneelTime, dst.kneelTime); - ::sg_export(enemyLaggedPos, dst.enemyLaggedPos); - ::sg_export(watchTarget, dst.watchTarget); - ::sg_export(ffireCount, dst.ffireCount); - ::sg_export(ffireDebounce, dst.ffireDebounce); - ::sg_export(ffireFadeDebounce, dst.ffireFadeDebounce); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.timeOfDeath, timeOfDeath); - ::sg_import(src.touchedByPlayer, touchedByPlayer); - ::sg_import(src.enemyLastVisibility, enemyLastVisibility); - ::sg_import(src.aimTime, aimTime); - ::sg_import(src.desiredYaw, desiredYaw); - ::sg_import(src.desiredPitch, desiredPitch); - ::sg_import(src.lockedDesiredYaw, lockedDesiredYaw); - ::sg_import(src.lockedDesiredPitch, lockedDesiredPitch); - ::sg_import(src.aimingBeam, aimingBeam); - ::sg_import(src.enemyLastSeenLocation, enemyLastSeenLocation); - ::sg_import(src.enemyLastSeenTime, enemyLastSeenTime); - ::sg_import(src.enemyLastHeardLocation, enemyLastHeardLocation); - ::sg_import(src.enemyLastHeardTime, enemyLastHeardTime); - ::sg_import(src.lastAlertID, lastAlertID); - ::sg_import(src.eFlags, eFlags); - ::sg_import(src.aiFlags, aiFlags); - ::sg_import(src.currentAmmo, currentAmmo); - ::sg_import(src.shotTime, shotTime); - ::sg_import(src.burstCount, burstCount); - ::sg_import(src.burstMin, burstMin); - -#ifdef BASE_SAVE_COMPAT - ::sg_import(src.burstMean, burstMean); -#endif - - ::sg_import(src.burstMax, burstMax); - ::sg_import(src.burstSpacing, burstSpacing); - ::sg_import(src.attackHold, attackHold); - ::sg_import(src.attackHoldTime, attackHoldTime); - ::sg_import(src.shootAngles, shootAngles); - ::sg_import(src.rank, rank); - ::sg_import(src.behaviorState, behaviorState); - ::sg_import(src.defaultBehavior, defaultBehavior); - ::sg_import(src.tempBehavior, tempBehavior); - ::sg_import(src.ignorePain, ignorePain); - ::sg_import(src.duckDebounceTime, duckDebounceTime); - ::sg_import(src.walkDebounceTime, walkDebounceTime); - ::sg_import(src.enemyCheckDebounceTime, enemyCheckDebounceTime); - ::sg_import(src.investigateDebounceTime, investigateDebounceTime); - ::sg_import(src.investigateCount, investigateCount); - ::sg_import(src.investigateGoal, investigateGoal); - ::sg_import(src.investigateSoundDebounceTime, investigateSoundDebounceTime); - ::sg_import(src.greetingDebounceTime, greetingDebounceTime); - ::sg_import(src.eventOwner, eventOwner); - ::sg_import(src.coverTarg, coverTarg); - ::sg_import(src.jumpState, jumpState); - ::sg_import(src.followDist, followDist); - ::sg_import(src.tempGoal, tempGoal); - ::sg_import(src.goalEntity, goalEntity); - ::sg_import(src.lastGoalEntity, lastGoalEntity); - ::sg_import(src.eventualGoal, eventualGoal); - ::sg_import(src.captureGoal, captureGoal); - ::sg_import(src.defendEnt, defendEnt); - ::sg_import(src.greetEnt, greetEnt); - ::sg_import(src.goalTime, goalTime); - ::sg_import(src.straightToGoal, straightToGoal); - ::sg_import(src.distToGoal, distToGoal); - ::sg_import(src.navTime, navTime); - ::sg_import(src.blockingEntNum, blockingEntNum); - ::sg_import(src.blockedSpeechDebounceTime, blockedSpeechDebounceTime); - ::sg_import(src.homeWp, homeWp); - ::sg_import(src.avoidSide, avoidSide); - ::sg_import(src.leaderAvoidSide, leaderAvoidSide); - ::sg_import(src.lastAvoidSteerSide, lastAvoidSteerSide); - ::sg_import(src.lastAvoidSteerSideDebouncer, lastAvoidSteerSideDebouncer); - ::sg_import(src.group, group); - ::sg_import(src.troop, troop); - ::sg_import(src.lastPathAngles, lastPathAngles); - ::sg_import(src.stats, stats); - ::sg_import(src.aimErrorDebounceTime, aimErrorDebounceTime); - ::sg_import(src.lastAimErrorYaw, lastAimErrorYaw); - ::sg_import(src.lastAimErrorPitch, lastAimErrorPitch); - ::sg_import(src.aimOfs, aimOfs); - ::sg_import(src.currentAim, currentAim); - ::sg_import(src.currentAggression, currentAggression); - ::sg_import(src.scriptFlags, scriptFlags); - ::sg_import(src.desiredSpeed, desiredSpeed); - ::sg_import(src.currentSpeed, currentSpeed); - ::sg_import(src.last_forwardmove, last_forwardmove); - ::sg_import(src.last_rightmove, last_rightmove); - ::sg_import(src.lastClearOrigin, lastClearOrigin); - ::sg_import(src.shoveCount, shoveCount); - ::sg_import(src.blockedDebounceTime, blockedDebounceTime); - ::sg_import(src.blockedEntity, blockedEntity); - ::sg_import(src.blockedTargetPosition, blockedTargetPosition); - ::sg_import(src.blockedTargetEntity, blockedTargetEntity); - ::sg_import(src.jumpDest, jumpDest); - ::sg_import(src.jumpTarget, jumpTarget); - ::sg_import(src.jumpMaxXYDist, jumpMaxXYDist); - ::sg_import(src.jumpMazZDist, jumpMazZDist); - ::sg_import(src.jumpSide, jumpSide); - ::sg_import(src.jumpTime, jumpTime); - ::sg_import(src.jumpBackupTime, jumpBackupTime); - ::sg_import(src.jumpNextCheckTime, jumpNextCheckTime); - ::sg_import(src.combatPoint, combatPoint); - ::sg_import(src.lastFailedCombatPoint, lastFailedCombatPoint); - ::sg_import(src.movementSpeech, movementSpeech); - ::sg_import(src.movementSpeechChance, movementSpeechChance); - ::sg_import(src.nextBStateThink, nextBStateThink); - ::sg_import(src.last_ucmd, last_ucmd); - ::sg_import(src.combatMove, combatMove); - ::sg_import(src.goalRadius, goalRadius); - ::sg_import(src.pauseTime, pauseTime); - ::sg_import(src.standTime, standTime); - ::sg_import(src.localState, localState); - ::sg_import(src.squadState, squadState); - ::sg_import(src.confusionTime, confusionTime); - ::sg_import(src.charmedTime, charmedTime); - ::sg_import(src.controlledTime, controlledTime); - ::sg_import(src.surrenderTime, surrenderTime); - ::sg_import(src.kneelTime, kneelTime); - ::sg_import(src.enemyLaggedPos, enemyLaggedPos); - ::sg_import(src.watchTarget, watchTarget); - ::sg_import(src.ffireCount, ffireCount); - ::sg_import(src.ffireDebounce, ffireDebounce); - ::sg_import(src.ffireFadeDebounce, ffireFadeDebounce); - } + const SgType& src); } gNPC_t; diff --git a/code/game/bg_public.cpp b/code/game/bg_public.cpp new file mode 100644 index 0000000000..fce4cf63c4 --- /dev/null +++ b/code/game/bg_public.cpp @@ -0,0 +1,45 @@ +#include "bg_public.h" +#include "qcommon/ojk_sg_wrappers.h" + + +void animation_t::sg_export( + SgType& dst) const +{ + ::sg_export(firstFrame, dst.firstFrame); + ::sg_export(numFrames, dst.numFrames); + ::sg_export(frameLerp, dst.frameLerp); + ::sg_export(loopFrames, dst.loopFrames); + ::sg_export(glaIndex, dst.glaIndex); +} + +void animation_t::sg_import( + const SgType& src) +{ + ::sg_import(src.firstFrame, firstFrame); + ::sg_import(src.numFrames, numFrames); + ::sg_import(src.frameLerp, frameLerp); + ::sg_import(src.loopFrames, loopFrames); + ::sg_import(src.glaIndex, glaIndex); +} + +void animevent_t::sg_export( + SgType& dst) const +{ + ::sg_export(eventType, dst.eventType); + ::sg_export(modelOnly, dst.modelOnly); + ::sg_export(glaIndex, dst.glaIndex); + ::sg_export(keyFrame, dst.keyFrame); + ::sg_export(eventData, dst.eventData); + ::sg_export(stringData, dst.stringData); +} + +void animevent_t::sg_import( + const SgType& src) +{ + ::sg_import(src.eventType, eventType); + ::sg_import(src.modelOnly, modelOnly); + ::sg_import(src.glaIndex, glaIndex); + ::sg_import(src.keyFrame, keyFrame); + ::sg_import(src.eventData, eventData); + ::sg_import(src.stringData, stringData); +} diff --git a/code/game/bg_public.h b/code/game/bg_public.h index 89ca1b2108..d12856af8a 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -479,24 +479,10 @@ typedef struct animation_s { void sg_export( - SgType& dst) const - { - ::sg_export(firstFrame, dst.firstFrame); - ::sg_export(numFrames, dst.numFrames); - ::sg_export(frameLerp, dst.frameLerp); - ::sg_export(loopFrames, dst.loopFrames); - ::sg_export(glaIndex, dst.glaIndex); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.firstFrame, firstFrame); - ::sg_import(src.numFrames, numFrames); - ::sg_import(src.frameLerp, frameLerp); - ::sg_import(src.loopFrames, loopFrames); - ::sg_import(src.glaIndex, glaIndex); - } + const SgType& src); } animation_t; #define MAX_ANIM_FILES 16 @@ -577,26 +563,10 @@ typedef struct animevent_s void sg_export( - SgType& dst) const - { - ::sg_export(eventType, dst.eventType); - ::sg_export(modelOnly, dst.modelOnly); - ::sg_export(glaIndex, dst.glaIndex); - ::sg_export(keyFrame, dst.keyFrame); - ::sg_export(eventData, dst.eventData); - ::sg_export(stringData, dst.stringData); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.eventType, eventType); - ::sg_import(src.modelOnly, modelOnly); - ::sg_import(src.glaIndex, glaIndex); - ::sg_import(src.keyFrame, keyFrame); - ::sg_import(src.eventData, eventData); - ::sg_import(src.stringData, stringData); - } + const SgType& src); } animevent_t; typedef enum diff --git a/code/game/g_local.cpp b/code/game/g_local.cpp new file mode 100644 index 0000000000..cb43d81315 --- /dev/null +++ b/code/game/g_local.cpp @@ -0,0 +1,101 @@ +#include "g_local.h" +#include "qcommon/ojk_sg_wrappers.h" + + +void animFileSet_t::sg_export( + SgType& dst) const +{ + ::sg_export(filename, dst.filename); + ::sg_export(animations, dst.animations); + ::sg_export(torsoAnimEvents, dst.torsoAnimEvents); + ::sg_export(legsAnimEvents, dst.legsAnimEvents); + ::sg_export(torsoAnimEventCount, dst.torsoAnimEventCount); + ::sg_export(legsAnimEventCount, dst.legsAnimEventCount); +} + +void animFileSet_t::sg_import( + const SgType& src) +{ + ::sg_import(src.filename, filename); + ::sg_import(src.animations, animations); + ::sg_import(src.torsoAnimEvents, torsoAnimEvents); + ::sg_import(src.legsAnimEvents, legsAnimEvents); + ::sg_import(src.torsoAnimEventCount, torsoAnimEventCount); + ::sg_import(src.legsAnimEventCount, legsAnimEventCount); +} + + +void alertEvent_t::sg_export( + SgType& dst) const +{ + ::sg_export(position, dst.position); + ::sg_export(radius, dst.radius); + ::sg_export(level, dst.level); + ::sg_export(type, dst.type); + ::sg_export(owner, dst.owner); + ::sg_export(light, dst.light); + ::sg_export(addLight, dst.addLight); + ::sg_export(ID, dst.ID); + ::sg_export(timestamp, dst.timestamp); + ::sg_export(onGround, dst.onGround); +} + +void alertEvent_t::sg_import( + const SgType& src) +{ + ::sg_import(src.position, position); + ::sg_import(src.radius, radius); + ::sg_import(src.level, level); + ::sg_import(src.type, type); + ::sg_import(src.owner, owner); + ::sg_import(src.light, light); + ::sg_import(src.addLight, addLight); + ::sg_import(src.ID, ID); + ::sg_import(src.timestamp, timestamp); + ::sg_import(src.onGround, onGround); +} + + +void level_locals_t::sg_export( + SgType& dst) const +{ + ::sg_export(clients, dst.clients); + ::sg_export(maxclients, dst.maxclients); + ::sg_export(framenum, dst.framenum); + ::sg_export(time, dst.time); + ::sg_export(previousTime, dst.previousTime); + ::sg_export(globalTime, dst.globalTime); + ::sg_export(mapname, dst.mapname); + ::sg_export(locationLinked, dst.locationLinked); + ::sg_export(locationHead, dst.locationHead); + ::sg_export(alertEvents, dst.alertEvents); + ::sg_export(numAlertEvents, dst.numAlertEvents); + ::sg_export(curAlertID, dst.curAlertID); + ::sg_export(groups, dst.groups); + ::sg_export(knownAnimFileSets, dst.knownAnimFileSets); + ::sg_export(numKnownAnimFileSets, dst.numKnownAnimFileSets); + ::sg_export(worldFlags, dst.worldFlags); + ::sg_export(dmState, dst.dmState); +} + +void level_locals_t::sg_import( + const SgType& src) +{ + ::sg_import(src.clients, clients); + ::sg_import(src.maxclients, maxclients); + ::sg_import(src.framenum, framenum); + ::sg_import(src.time, time); + ::sg_import(src.previousTime, previousTime); + ::sg_import(src.globalTime, globalTime); + ::sg_import(src.mapname, mapname); + ::sg_import(src.locationLinked, locationLinked); + ::sg_import(src.locationHead, locationHead); + ::sg_import(src.alertEvents, alertEvents); + ::sg_import(src.numAlertEvents, numAlertEvents); + ::sg_import(src.curAlertID, curAlertID); + ::sg_import(src.groups, groups); + ::sg_import(src.knownAnimFileSets, knownAnimFileSets); + ::sg_import(src.numKnownAnimFileSets, numKnownAnimFileSets); + ::sg_import(src.worldFlags, worldFlags); + ::sg_import(src.dmState, dmState); +} diff --git a/code/game/g_local.h b/code/game/g_local.h index 7f068974a9..a3fa4ceba7 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -115,26 +115,10 @@ typedef struct void sg_export( - SgType& dst) const - { - ::sg_export(filename, dst.filename); - ::sg_export(animations, dst.animations); - ::sg_export(torsoAnimEvents, dst.torsoAnimEvents); - ::sg_export(legsAnimEvents, dst.legsAnimEvents); - ::sg_export(torsoAnimEventCount, dst.torsoAnimEventCount); - ::sg_export(legsAnimEventCount, dst.legsAnimEventCount); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.filename, filename); - ::sg_import(src.animations, animations); - ::sg_import(src.torsoAnimEvents, torsoAnimEvents); - ::sg_import(src.legsAnimEvents, legsAnimEvents); - ::sg_import(src.torsoAnimEventCount, torsoAnimEventCount); - ::sg_import(src.legsAnimEventCount, legsAnimEventCount); - } + const SgType& src); } animFileSet_t; extern stringID_table_t animTable [MAX_ANIMATIONS+1]; @@ -219,34 +203,10 @@ typedef struct alertEvent_s void sg_export( - SgType& dst) const - { - ::sg_export(position, dst.position); - ::sg_export(radius, dst.radius); - ::sg_export(level, dst.level); - ::sg_export(type, dst.type); - ::sg_export(owner, dst.owner); - ::sg_export(light, dst.light); - ::sg_export(addLight, dst.addLight); - ::sg_export(ID, dst.ID); - ::sg_export(timestamp, dst.timestamp); - ::sg_export(onGround, dst.onGround); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.position, position); - ::sg_import(src.radius, radius); - ::sg_import(src.level, level); - ::sg_import(src.type, type); - ::sg_import(src.owner, owner); - ::sg_import(src.light, light); - ::sg_import(src.addLight, addLight); - ::sg_import(src.ID, ID); - ::sg_import(src.timestamp, timestamp); - ::sg_import(src.onGround, onGround); - } + const SgType& src); } alertEvent_t; // @@ -360,48 +320,10 @@ typedef struct void sg_export( - SgType& dst) const - { - ::sg_export(clients, dst.clients); - ::sg_export(maxclients, dst.maxclients); - ::sg_export(framenum, dst.framenum); - ::sg_export(time, dst.time); - ::sg_export(previousTime, dst.previousTime); - ::sg_export(globalTime, dst.globalTime); - ::sg_export(mapname, dst.mapname); - ::sg_export(locationLinked, dst.locationLinked); - ::sg_export(locationHead, dst.locationHead); - ::sg_export(alertEvents, dst.alertEvents); - ::sg_export(numAlertEvents, dst.numAlertEvents); - ::sg_export(curAlertID, dst.curAlertID); - ::sg_export(groups, dst.groups); - ::sg_export(knownAnimFileSets, dst.knownAnimFileSets); - ::sg_export(numKnownAnimFileSets, dst.numKnownAnimFileSets); - ::sg_export(worldFlags, dst.worldFlags); - ::sg_export(dmState, dst.dmState); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.clients, clients); - ::sg_import(src.maxclients, maxclients); - ::sg_import(src.framenum, framenum); - ::sg_import(src.time, time); - ::sg_import(src.previousTime, previousTime); - ::sg_import(src.globalTime, globalTime); - ::sg_import(src.mapname, mapname); - ::sg_import(src.locationLinked, locationLinked); - ::sg_import(src.locationHead, locationHead); - ::sg_import(src.alertEvents, alertEvents); - ::sg_import(src.numAlertEvents, numAlertEvents); - ::sg_import(src.curAlertID, curAlertID); - ::sg_import(src.groups, groups); - ::sg_import(src.knownAnimFileSets, knownAnimFileSets); - ::sg_import(src.numKnownAnimFileSets, numKnownAnimFileSets); - ::sg_import(src.worldFlags, worldFlags); - ::sg_import(src.dmState, dmState); - } + const SgType& src); } level_locals_t; extern level_locals_t level; diff --git a/code/game/g_shared.cpp b/code/game/g_shared.cpp new file mode 100644 index 0000000000..6fd79a62e9 --- /dev/null +++ b/code/game/g_shared.cpp @@ -0,0 +1,829 @@ +#include "g_local.h" +#include "g_shared.h" +#include "qcommon/ojk_sg_wrappers.h" + + +void clientInfo_t::sg_export( + SgType& dst) const +{ + ::sg_export(infoValid, dst.infoValid); + ::sg_export(name, dst.name); + ::sg_export(team, dst.team); + ::sg_export(score, dst.score); + ::sg_export(handicap, dst.handicap); + ::sg_export(legsModel, dst.legsModel); + ::sg_export(legsSkin, dst.legsSkin); + ::sg_export(torsoModel, dst.torsoModel); + ::sg_export(torsoSkin, dst.torsoSkin); + ::sg_export(headModel, dst.headModel); + ::sg_export(headSkin, dst.headSkin); + ::sg_export(animFileIndex, dst.animFileIndex); + ::sg_export(sounds, dst.sounds); + ::sg_export(customBasicSoundDir, dst.customBasicSoundDir); + ::sg_export(customCombatSoundDir, dst.customCombatSoundDir); + ::sg_export(customExtraSoundDir, dst.customExtraSoundDir); + ::sg_export(customJediSoundDir, dst.customJediSoundDir); +} + +void clientInfo_t::sg_import( + const SgType& src) +{ + ::sg_import(src.infoValid, infoValid); + ::sg_import(src.name, name); + ::sg_import(src.team, team); + ::sg_import(src.score, score); + ::sg_import(src.handicap, handicap); + ::sg_import(src.legsModel, legsModel); + ::sg_import(src.legsSkin, legsSkin); + ::sg_import(src.torsoModel, torsoModel); + ::sg_import(src.torsoSkin, torsoSkin); + ::sg_import(src.headModel, headModel); + ::sg_import(src.headSkin, headSkin); + ::sg_import(src.animFileIndex, animFileIndex); + ::sg_import(src.sounds, sounds); + ::sg_import(src.customBasicSoundDir, customBasicSoundDir); + ::sg_import(src.customCombatSoundDir, customCombatSoundDir); + ::sg_import(src.customExtraSoundDir, customExtraSoundDir); + ::sg_import(src.customJediSoundDir, customJediSoundDir); +} + + +void renderInfo_t::sg_export( + SgType& dst) const +{ + ::sg_export(legsModelName, dst.legsModelName); + ::sg_export(torsoModelName, dst.torsoModelName); + ::sg_export(headModelName, dst.headModelName); + ::sg_export(headYawRangeLeft, dst.headYawRangeLeft); + ::sg_export(headYawRangeRight, dst.headYawRangeRight); + ::sg_export(headPitchRangeUp, dst.headPitchRangeUp); + ::sg_export(headPitchRangeDown, dst.headPitchRangeDown); + ::sg_export(torsoYawRangeLeft, dst.torsoYawRangeLeft); + ::sg_export(torsoYawRangeRight, dst.torsoYawRangeRight); + ::sg_export(torsoPitchRangeUp, dst.torsoPitchRangeUp); + ::sg_export(torsoPitchRangeDown, dst.torsoPitchRangeDown); + ::sg_export(legsFrame, dst.legsFrame); + ::sg_export(torsoFrame, dst.torsoFrame); + ::sg_export(legsFpsMod, dst.legsFpsMod); + ::sg_export(torsoFpsMod, dst.torsoFpsMod); + ::sg_export(customRGBA, dst.customRGBA); + ::sg_export(boneIndex1, dst.boneIndex1); + ::sg_export(boneIndex2, dst.boneIndex2); + ::sg_export(boneIndex3, dst.boneIndex3); + ::sg_export(boneIndex4, dst.boneIndex4); + ::sg_export(boneOrient, dst.boneOrient); + ::sg_export(boneAngles1, dst.boneAngles1); + ::sg_export(boneAngles2, dst.boneAngles2); + ::sg_export(boneAngles3, dst.boneAngles3); + ::sg_export(boneAngles4, dst.boneAngles4); + ::sg_export(renderFlags, dst.renderFlags); + ::sg_export(muzzlePoint, dst.muzzlePoint); + ::sg_export(muzzleDir, dst.muzzleDir); + ::sg_export(muzzlePointOld, dst.muzzlePointOld); + ::sg_export(muzzleDirOld, dst.muzzleDirOld); + ::sg_export(mPCalcTime, dst.mPCalcTime); + ::sg_export(lockYaw, dst.lockYaw); + ::sg_export(headPoint, dst.headPoint); + ::sg_export(headAngles, dst.headAngles); + ::sg_export(handRPoint, dst.handRPoint); + ::sg_export(handLPoint, dst.handLPoint); + ::sg_export(crotchPoint, dst.crotchPoint); + ::sg_export(footRPoint, dst.footRPoint); + ::sg_export(footLPoint, dst.footLPoint); + ::sg_export(torsoPoint, dst.torsoPoint); + ::sg_export(torsoAngles, dst.torsoAngles); + ::sg_export(eyePoint, dst.eyePoint); + ::sg_export(eyeAngles, dst.eyeAngles); + ::sg_export(lookTarget, dst.lookTarget); + ::sg_export(lookMode, dst.lookMode); + ::sg_export(lookTargetClearTime, dst.lookTargetClearTime); + ::sg_export(lastVoiceVolume, dst.lastVoiceVolume); + ::sg_export(lastHeadAngles, dst.lastHeadAngles); + ::sg_export(headBobAngles, dst.headBobAngles); + ::sg_export(targetHeadBobAngles, dst.targetHeadBobAngles); + ::sg_export(lookingDebounceTime, dst.lookingDebounceTime); + ::sg_export(legsYaw, dst.legsYaw); +} + +void renderInfo_t::sg_import( + const SgType& src) +{ + ::sg_import(src.legsModelName, legsModelName); + ::sg_import(src.torsoModelName, torsoModelName); + ::sg_import(src.headModelName, headModelName); + ::sg_import(src.headYawRangeLeft, headYawRangeLeft); + ::sg_import(src.headYawRangeRight, headYawRangeRight); + ::sg_import(src.headPitchRangeUp, headPitchRangeUp); + ::sg_import(src.headPitchRangeDown, headPitchRangeDown); + ::sg_import(src.torsoYawRangeLeft, torsoYawRangeLeft); + ::sg_import(src.torsoYawRangeRight, torsoYawRangeRight); + ::sg_import(src.torsoPitchRangeUp, torsoPitchRangeUp); + ::sg_import(src.torsoPitchRangeDown, torsoPitchRangeDown); + ::sg_import(src.legsFrame, legsFrame); + ::sg_import(src.torsoFrame, torsoFrame); + ::sg_import(src.legsFpsMod, legsFpsMod); + ::sg_import(src.torsoFpsMod, torsoFpsMod); + ::sg_import(src.customRGBA, customRGBA); + ::sg_import(src.boneIndex1, boneIndex1); + ::sg_import(src.boneIndex2, boneIndex2); + ::sg_import(src.boneIndex3, boneIndex3); + ::sg_import(src.boneIndex4, boneIndex4); + ::sg_import(src.boneOrient, boneOrient); + ::sg_import(src.boneAngles1, boneAngles1); + ::sg_import(src.boneAngles2, boneAngles2); + ::sg_import(src.boneAngles3, boneAngles3); + ::sg_import(src.boneAngles4, boneAngles4); + ::sg_import(src.renderFlags, renderFlags); + ::sg_import(src.muzzlePoint, muzzlePoint); + ::sg_import(src.muzzleDir, muzzleDir); + ::sg_import(src.muzzlePointOld, muzzlePointOld); + ::sg_import(src.muzzleDirOld, muzzleDirOld); + ::sg_import(src.mPCalcTime, mPCalcTime); + ::sg_import(src.lockYaw, lockYaw); + ::sg_import(src.headPoint, headPoint); + ::sg_import(src.headAngles, headAngles); + ::sg_import(src.handRPoint, handRPoint); + ::sg_import(src.handLPoint, handLPoint); + ::sg_import(src.crotchPoint, crotchPoint); + ::sg_import(src.footRPoint, footRPoint); + ::sg_import(src.footLPoint, footLPoint); + ::sg_import(src.torsoPoint, torsoPoint); + ::sg_import(src.torsoAngles, torsoAngles); + ::sg_import(src.eyePoint, eyePoint); + ::sg_import(src.eyeAngles, eyeAngles); + ::sg_import(src.lookTarget, lookTarget); + ::sg_import(src.lookMode, lookMode); + ::sg_import(src.lookTargetClearTime, lookTargetClearTime); + ::sg_import(src.lastVoiceVolume, lastVoiceVolume); + ::sg_import(src.lastHeadAngles, lastHeadAngles); + ::sg_import(src.headBobAngles, headBobAngles); + ::sg_import(src.targetHeadBobAngles, targetHeadBobAngles); + ::sg_import(src.lookingDebounceTime, lookingDebounceTime); + ::sg_import(src.legsYaw, legsYaw); +} + +void playerTeamState_t::sg_export( + SgType& dst) const +{ + ::sg_export(state, dst.state); + ::sg_export(captures, dst.captures); + ::sg_export(basedefense, dst.basedefense); + ::sg_export(carrierdefense, dst.carrierdefense); + ::sg_export(flagrecovery, dst.flagrecovery); + ::sg_export(fragcarrier, dst.fragcarrier); + ::sg_export(assists, dst.assists); + ::sg_export(lasthurtcarrier, dst.lasthurtcarrier); + ::sg_export(lastreturnedflag, dst.lastreturnedflag); + ::sg_export(flagsince, dst.flagsince); + ::sg_export(lastfraggedcarrier, dst.lastfraggedcarrier); +} + +void playerTeamState_t::sg_import( + const SgType& src) +{ + ::sg_import(src.state, state); + ::sg_import(src.captures, captures); + ::sg_import(src.basedefense, basedefense); + ::sg_import(src.carrierdefense, carrierdefense); + ::sg_import(src.flagrecovery, flagrecovery); + ::sg_import(src.fragcarrier, fragcarrier); + ::sg_import(src.assists, assists); + ::sg_import(src.lasthurtcarrier, lasthurtcarrier); + ::sg_import(src.lastreturnedflag, lastreturnedflag); + ::sg_import(src.flagsince, flagsince); + ::sg_import(src.lastfraggedcarrier, lastfraggedcarrier); +} + + +void objectives_t::sg_export( + SgType& dst) const +{ + ::sg_export(display, dst.display); + ::sg_export(status, dst.status); +} + +void objectives_t::sg_import( + const SgType& src) +{ + ::sg_import(src.display, display); + ::sg_import(src.status, status); +} + + +void missionStats_t::sg_export( + SgType& dst) const +{ + ::sg_export(secretsFound, dst.secretsFound); + ::sg_export(totalSecrets, dst.totalSecrets); + ::sg_export(shotsFired, dst.shotsFired); + ::sg_export(hits, dst.hits); + ::sg_export(enemiesSpawned, dst.enemiesSpawned); + ::sg_export(enemiesKilled, dst.enemiesKilled); + ::sg_export(saberThrownCnt, dst.saberThrownCnt); + ::sg_export(saberBlocksCnt, dst.saberBlocksCnt); + ::sg_export(legAttacksCnt, dst.legAttacksCnt); + ::sg_export(armAttacksCnt, dst.armAttacksCnt); + ::sg_export(torsoAttacksCnt, dst.torsoAttacksCnt); + ::sg_export(otherAttacksCnt, dst.otherAttacksCnt); + ::sg_export(forceUsed, dst.forceUsed); + ::sg_export(weaponUsed, dst.weaponUsed); +} + +void missionStats_t::sg_import( + const SgType& src) +{ + ::sg_import(src.secretsFound, secretsFound); + ::sg_import(src.totalSecrets, totalSecrets); + ::sg_import(src.shotsFired, shotsFired); + ::sg_import(src.hits, hits); + ::sg_import(src.enemiesSpawned, enemiesSpawned); + ::sg_import(src.enemiesKilled, enemiesKilled); + ::sg_import(src.saberThrownCnt, saberThrownCnt); + ::sg_import(src.saberBlocksCnt, saberBlocksCnt); + ::sg_import(src.legAttacksCnt, legAttacksCnt); + ::sg_import(src.armAttacksCnt, armAttacksCnt); + ::sg_import(src.torsoAttacksCnt, torsoAttacksCnt); + ::sg_import(src.otherAttacksCnt, otherAttacksCnt); + ::sg_import(src.forceUsed, forceUsed); + ::sg_import(src.weaponUsed, weaponUsed); +} + + +void clientSession_t::sg_export( + SgType& dst) const +{ + ::sg_export(missionObjectivesShown, dst.missionObjectivesShown); + ::sg_export(sessionTeam, dst.sessionTeam); + ::sg_export(mission_objectives, dst.mission_objectives); + ::sg_export(missionStats, dst.missionStats); +} + +void clientSession_t::sg_import( + const SgType& src) +{ + ::sg_import(src.missionObjectivesShown, missionObjectivesShown); + ::sg_import(src.sessionTeam, sessionTeam); + ::sg_import(src.mission_objectives, mission_objectives); + ::sg_import(src.missionStats, missionStats); +} + + +void clientPersistant_t::sg_export( + SgType& dst) const +{ + ::sg_export(connected, dst.connected); + ::sg_export(lastCommand, dst.lastCommand); + ::sg_export(netname, dst.netname); + ::sg_export(maxHealth, dst.maxHealth); + ::sg_export(enterTime, dst.enterTime); + ::sg_export(cmd_angles, dst.cmd_angles); + ::sg_export(teamState, dst.teamState); +} + +void clientPersistant_t::sg_import( + const SgType& src) +{ + ::sg_import(src.connected, connected); + ::sg_import(src.lastCommand, lastCommand); + ::sg_import(src.netname, netname); + ::sg_import(src.maxHealth, maxHealth); + ::sg_import(src.enterTime, enterTime); + ::sg_import(src.cmd_angles, cmd_angles); + ::sg_import(src.teamState, teamState); +} + + +void gclient_s::sg_export( + SgType& dst) const +{ + ::sg_export(ps, dst.ps); + ::sg_export(pers, dst.pers); + ::sg_export(sess, dst.sess); + ::sg_export(lastCmdTime, dst.lastCmdTime); + ::sg_export(usercmd, dst.usercmd); + ::sg_export(buttons, dst.buttons); + ::sg_export(oldbuttons, dst.oldbuttons); + ::sg_export(latched_buttons, dst.latched_buttons); + ::sg_export(damage_armor, dst.damage_armor); + ::sg_export(damage_blood, dst.damage_blood); + ::sg_export(damage_from, dst.damage_from); + ::sg_export(damage_fromWorld, dst.damage_fromWorld); + ::sg_export(noclip, dst.noclip); + ::sg_export(forced_forwardmove, dst.forced_forwardmove); + ::sg_export(forced_rightmove, dst.forced_rightmove); + ::sg_export(respawnTime, dst.respawnTime); + ::sg_export(idleTime, dst.idleTime); + ::sg_export(airOutTime, dst.airOutTime); + ::sg_export(timeResidual, dst.timeResidual); + ::sg_export(facial_blink, dst.facial_blink); + ::sg_export(facial_timer, dst.facial_timer); + ::sg_export(facial_anim, dst.facial_anim); + ::sg_export(clientInfo, dst.clientInfo); + ::sg_export(moveType, dst.moveType); + ::sg_export(jetPackTime, dst.jetPackTime); + ::sg_export(fireDelay, dst.fireDelay); + ::sg_export(breathPuffTime, dst.breathPuffTime); + ::sg_export(playerTeam, dst.playerTeam); + ::sg_export(enemyTeam, dst.enemyTeam); + ::sg_export(leader, dst.leader); + ::sg_export(NPC_class, dst.NPC_class); + ::sg_export(hiddenDist, dst.hiddenDist); + ::sg_export(hiddenDir, dst.hiddenDir); + ::sg_export(renderInfo, dst.renderInfo); + ::sg_export(dismembered, dst.dismembered); + ::sg_export(dismemberProbLegs, dst.dismemberProbLegs); + ::sg_export(dismemberProbHead, dst.dismemberProbHead); + ::sg_export(dismemberProbArms, dst.dismemberProbArms); + ::sg_export(dismemberProbHands, dst.dismemberProbHands); + ::sg_export(dismemberProbWaist, dst.dismemberProbWaist); + ::sg_export(standheight, dst.standheight); + ::sg_export(crouchheight, dst.crouchheight); + ::sg_export(poisonDamage, dst.poisonDamage); + ::sg_export(poisonTime, dst.poisonTime); + ::sg_export(slopeRecalcTime, dst.slopeRecalcTime); + ::sg_export(pushVec, dst.pushVec); + ::sg_export(pushVecTime, dst.pushVecTime); + ::sg_export(noRagTime, dst.noRagTime); + ::sg_export(isRagging, dst.isRagging); + ::sg_export(overridingBones, dst.overridingBones); + ::sg_export(ragLastOrigin, dst.ragLastOrigin); + ::sg_export(ragLastOriginTime, dst.ragLastOriginTime); + ::sg_export(pushEffectFadeTime, dst.pushEffectFadeTime); + ::sg_export(pushEffectOrigin, dst.pushEffectOrigin); + ::sg_export(rocketLockIndex, dst.rocketLockIndex); + ::sg_export(rocketLastValidTime, dst.rocketLastValidTime); + ::sg_export(rocketLockTime, dst.rocketLockTime); + ::sg_export(rocketTargetTime, dst.rocketTargetTime); + ::sg_export(inSpaceSuffocation, dst.inSpaceSuffocation); + ::sg_export(inSpaceIndex, dst.inSpaceIndex); +} + +void gclient_s::sg_import( + const SgType& src) +{ + ::sg_import(src.ps, ps); + ::sg_import(src.pers, pers); + ::sg_import(src.sess, sess); + ::sg_import(src.lastCmdTime, lastCmdTime); + ::sg_import(src.usercmd, usercmd); + ::sg_import(src.buttons, buttons); + ::sg_import(src.oldbuttons, oldbuttons); + ::sg_import(src.latched_buttons, latched_buttons); + ::sg_import(src.damage_armor, damage_armor); + ::sg_import(src.damage_blood, damage_blood); + ::sg_import(src.damage_from, damage_from); + ::sg_import(src.damage_fromWorld, damage_fromWorld); + ::sg_import(src.noclip, noclip); + ::sg_import(src.forced_forwardmove, forced_forwardmove); + ::sg_import(src.forced_rightmove, forced_rightmove); + ::sg_import(src.respawnTime, respawnTime); + ::sg_import(src.idleTime, idleTime); + ::sg_import(src.airOutTime, airOutTime); + ::sg_import(src.timeResidual, timeResidual); + ::sg_import(src.facial_blink, facial_blink); + ::sg_import(src.facial_timer, facial_timer); + ::sg_import(src.facial_anim, facial_anim); + ::sg_import(src.clientInfo, clientInfo); + ::sg_import(src.moveType, moveType); + ::sg_import(src.jetPackTime, jetPackTime); + ::sg_import(src.fireDelay, fireDelay); + ::sg_import(src.breathPuffTime, breathPuffTime); + ::sg_import(src.playerTeam, playerTeam); + ::sg_import(src.enemyTeam, enemyTeam); + ::sg_import(src.leader, leader); + ::sg_import(src.NPC_class, NPC_class); + ::sg_import(src.hiddenDist, hiddenDist); + ::sg_import(src.hiddenDir, hiddenDir); + ::sg_import(src.renderInfo, renderInfo); + ::sg_import(src.dismembered, dismembered); + ::sg_import(src.dismemberProbLegs, dismemberProbLegs); + ::sg_import(src.dismemberProbHead, dismemberProbHead); + ::sg_import(src.dismemberProbArms, dismemberProbArms); + ::sg_import(src.dismemberProbHands, dismemberProbHands); + ::sg_import(src.dismemberProbWaist, dismemberProbWaist); + ::sg_import(src.standheight, standheight); + ::sg_import(src.crouchheight, crouchheight); + ::sg_import(src.poisonDamage, poisonDamage); + ::sg_import(src.poisonTime, poisonTime); + ::sg_import(src.slopeRecalcTime, slopeRecalcTime); + ::sg_import(src.pushVec, pushVec); + ::sg_import(src.pushVecTime, pushVecTime); + ::sg_import(src.noRagTime, noRagTime); + ::sg_import(src.isRagging, isRagging); + ::sg_import(src.overridingBones, overridingBones); + ::sg_import(src.ragLastOrigin, ragLastOrigin); + ::sg_import(src.ragLastOriginTime, ragLastOriginTime); + ::sg_import(src.pushEffectFadeTime, pushEffectFadeTime); + ::sg_import(src.pushEffectOrigin, pushEffectOrigin); + ::sg_import(src.rocketLockIndex, rocketLockIndex); + ::sg_import(src.rocketLastValidTime, rocketLastValidTime); + ::sg_import(src.rocketLockTime, rocketLockTime); + ::sg_import(src.rocketTargetTime, rocketTargetTime); + ::sg_import(src.inSpaceSuffocation, inSpaceSuffocation); + ::sg_import(src.inSpaceIndex, inSpaceIndex); +} + + +void parms_t::sg_export( + SgType& dst) const +{ + ::sg_export(parm, dst.parm); +} + +void parms_t::sg_import( + const SgType& src) +{ + ::sg_import(src.parm, parm); +} + + +void gentity_t::sg_export( + SgType& dst) const +{ + ::sg_export(s, dst.s); + ::sg_export(client, dst.client); + ::sg_export(inuse, dst.inuse); + ::sg_export(linked, dst.linked); + ::sg_export(svFlags, dst.svFlags); + ::sg_export(bmodel, dst.bmodel); + ::sg_export(mins, dst.mins); + ::sg_export(maxs, dst.maxs); + ::sg_export(contents, dst.contents); + ::sg_export(absmin, dst.absmin); + ::sg_export(absmax, dst.absmax); + ::sg_export(currentOrigin, dst.currentOrigin); + ::sg_export(currentAngles, dst.currentAngles); + ::sg_export(owner, dst.owner); + ::sg_export(ghoul2, dst.ghoul2); + ::sg_export(modelScale, dst.modelScale); + ::sg_export(classname, dst.classname); + ::sg_export(spawnflags, dst.spawnflags); + ::sg_export(flags, dst.flags); + ::sg_export(model, dst.model); + ::sg_export(model2, dst.model2); + ::sg_export(freetime, dst.freetime); + ::sg_export(eventTime, dst.eventTime); + ::sg_export(freeAfterEvent, dst.freeAfterEvent); + ::sg_export(physicsBounce, dst.physicsBounce); + ::sg_export(clipmask, dst.clipmask); + ::sg_export(speed, dst.speed); + ::sg_export(resultspeed, dst.resultspeed); + ::sg_export(lastMoveTime, dst.lastMoveTime); + ::sg_export(movedir, dst.movedir); + ::sg_export(lastOrigin, dst.lastOrigin); + ::sg_export(lastAngles, dst.lastAngles); + ::sg_export(mass, dst.mass); + ::sg_export(lastImpact, dst.lastImpact); + ::sg_export(watertype, dst.watertype); + ::sg_export(waterlevel, dst.waterlevel); + ::sg_export(wupdate, dst.wupdate); + ::sg_export(prev_waterlevel, dst.prev_waterlevel); + ::sg_export(angle, dst.angle); + ::sg_export(target, dst.target); + ::sg_export(target2, dst.target2); + ::sg_export(target3, dst.target3); + ::sg_export(target4, dst.target4); + ::sg_export(targetJump, dst.targetJump); + ::sg_export(targetname, dst.targetname); + ::sg_export(team, dst.team); + ::sg_export(roff, dst.roff); + ::sg_export(roff_ctr, dst.roff_ctr); + ::sg_export(next_roff_time, dst.next_roff_time); + ::sg_export(fx_time, dst.fx_time); + ::sg_export(nextthink, dst.nextthink); + ::sg_export(e_ThinkFunc, dst.e_ThinkFunc); + ::sg_export(e_clThinkFunc, dst.e_clThinkFunc); + ::sg_export(e_ReachedFunc, dst.e_ReachedFunc); + ::sg_export(e_BlockedFunc, dst.e_BlockedFunc); + ::sg_export(e_TouchFunc, dst.e_TouchFunc); + ::sg_export(e_UseFunc, dst.e_UseFunc); + ::sg_export(e_PainFunc, dst.e_PainFunc); + ::sg_export(e_DieFunc, dst.e_DieFunc); + ::sg_export(health, dst.health); + ::sg_export(max_health, dst.max_health); + ::sg_export(takedamage, dst.takedamage); + ::sg_export(material, dst.material); + ::sg_export(damage, dst.damage); + ::sg_export(dflags, dst.dflags); + ::sg_export(splashDamage, dst.splashDamage); + ::sg_export(splashRadius, dst.splashRadius); + ::sg_export(methodOfDeath, dst.methodOfDeath); + ::sg_export(splashMethodOfDeath, dst.splashMethodOfDeath); + ::sg_export(locationDamage, dst.locationDamage); + ::sg_export(chain, dst.chain); + ::sg_export(enemy, dst.enemy); + ::sg_export(activator, dst.activator); + ::sg_export(teamchain, dst.teamchain); + ::sg_export(teammaster, dst.teammaster); + ::sg_export(lastEnemy, dst.lastEnemy); + ::sg_export(wait, dst.wait); + ::sg_export(random, dst.random); + ::sg_export(delay, dst.delay); + ::sg_export(alt_fire, dst.alt_fire); + ::sg_export(count, dst.count); + ::sg_export(bounceCount, dst.bounceCount); + ::sg_export(fly_sound_debounce_time, dst.fly_sound_debounce_time); + ::sg_export(painDebounceTime, dst.painDebounceTime); + ::sg_export(disconnectDebounceTime, dst.disconnectDebounceTime); + ::sg_export(attackDebounceTime, dst.attackDebounceTime); + ::sg_export(pushDebounceTime, dst.pushDebounceTime); + ::sg_export(aimDebounceTime, dst.aimDebounceTime); + ::sg_export(useDebounceTime, dst.useDebounceTime); + ::sg_export(trigger_formation, dst.trigger_formation); + ::sg_export(spawnContents, dst.spawnContents); + ::sg_export(waypoint, dst.waypoint); + ::sg_export(wayedge, dst.wayedge); + ::sg_export(lastWaypoint, dst.lastWaypoint); + ::sg_export(lastInAirTime, dst.lastInAirTime); + ::sg_export(noWaypointTime, dst.noWaypointTime); + ::sg_export(combatPoint, dst.combatPoint); + ::sg_export(followPos, dst.followPos); + ::sg_export(followPosRecalcTime, dst.followPosRecalcTime); + ::sg_export(followPosWaypoint, dst.followPosWaypoint); + ::sg_export(loopAnim, dst.loopAnim); + ::sg_export(startFrame, dst.startFrame); + ::sg_export(endFrame, dst.endFrame); + ::sg_export(m_iIcarusID, dst.m_iIcarusID); + ::sg_export(taskID, dst.taskID); + ::sg_export(parms, dst.parms); + ::sg_export(behaviorSet, dst.behaviorSet); + ::sg_export(script_targetname, dst.script_targetname); + ::sg_export(delayScriptTime, dst.delayScriptTime); + ::sg_export(soundSet, dst.soundSet); + ::sg_export(setTime, dst.setTime); + ::sg_export(cameraGroup, dst.cameraGroup); + ::sg_export(noDamageTeam, dst.noDamageTeam); + ::sg_export(playerModel, dst.playerModel); + ::sg_export(weaponModel, dst.weaponModel); + ::sg_export(handRBolt, dst.handRBolt); + ::sg_export(handLBolt, dst.handLBolt); + ::sg_export(headBolt, dst.headBolt); + ::sg_export(cervicalBolt, dst.cervicalBolt); + ::sg_export(chestBolt, dst.chestBolt); + ::sg_export(gutBolt, dst.gutBolt); + ::sg_export(torsoBolt, dst.torsoBolt); + ::sg_export(crotchBolt, dst.crotchBolt); + ::sg_export(motionBolt, dst.motionBolt); + ::sg_export(kneeLBolt, dst.kneeLBolt); + ::sg_export(kneeRBolt, dst.kneeRBolt); + ::sg_export(elbowLBolt, dst.elbowLBolt); + ::sg_export(elbowRBolt, dst.elbowRBolt); + ::sg_export(footLBolt, dst.footLBolt); + ::sg_export(footRBolt, dst.footRBolt); + ::sg_export(faceBone, dst.faceBone); + ::sg_export(craniumBone, dst.craniumBone); + ::sg_export(cervicalBone, dst.cervicalBone); + ::sg_export(thoracicBone, dst.thoracicBone); + ::sg_export(upperLumbarBone, dst.upperLumbarBone); + ::sg_export(lowerLumbarBone, dst.lowerLumbarBone); + ::sg_export(hipsBone, dst.hipsBone); + ::sg_export(motionBone, dst.motionBone); + ::sg_export(rootBone, dst.rootBone); + ::sg_export(footLBone, dst.footLBone); + ::sg_export(footRBone, dst.footRBone); + ::sg_export(humerusRBone, dst.humerusRBone); + ::sg_export(genericBone1, dst.genericBone1); + ::sg_export(genericBone2, dst.genericBone2); + ::sg_export(genericBone3, dst.genericBone3); + ::sg_export(genericBolt1, dst.genericBolt1); + ::sg_export(genericBolt2, dst.genericBolt2); + ::sg_export(genericBolt3, dst.genericBolt3); + ::sg_export(genericBolt4, dst.genericBolt4); + ::sg_export(genericBolt5, dst.genericBolt5); + ::sg_export(cinematicModel, dst.cinematicModel); + ::sg_export(m_pVehicle, dst.m_pVehicle); + ::sg_export(NPC, dst.NPC); + ::sg_export(ownername, dst.ownername); + ::sg_export(cantHitEnemyCounter, dst.cantHitEnemyCounter); + ::sg_export(NPC_type, dst.NPC_type); + ::sg_export(NPC_targetname, dst.NPC_targetname); + ::sg_export(NPC_target, dst.NPC_target); + ::sg_export(moverState, dst.moverState); + ::sg_export(soundPos1, dst.soundPos1); + ::sg_export(sound1to2, dst.sound1to2); + ::sg_export(sound2to1, dst.sound2to1); + ::sg_export(soundPos2, dst.soundPos2); + ::sg_export(soundLoop, dst.soundLoop); + ::sg_export(nextTrain, dst.nextTrain); + ::sg_export(prevTrain, dst.prevTrain); + ::sg_export(pos1, dst.pos1); + ::sg_export(pos2, dst.pos2); + ::sg_export(pos3, dst.pos3); + ::sg_export(sounds, dst.sounds); + ::sg_export(closetarget, dst.closetarget); + ::sg_export(opentarget, dst.opentarget); + ::sg_export(paintarget, dst.paintarget); + ::sg_export(lockCount, dst.lockCount); + ::sg_export(radius, dst.radius); + ::sg_export(wpIndex, dst.wpIndex); + ::sg_export(noise_index, dst.noise_index); + ::sg_export(startRGBA, dst.startRGBA); + ::sg_export(finalRGBA, dst.finalRGBA); + ::sg_export(item, dst.item); + ::sg_export(message, dst.message); + ::sg_export(lightLevel, dst.lightLevel); + ::sg_export(forcePushTime, dst.forcePushTime); + ::sg_export(forcePuller, dst.forcePuller); +} + +void gentity_t::sg_import( + const SgType& src) +{ + ::sg_import(src.s, s); + ::sg_import(src.client, client); + ::sg_import(src.inuse, inuse); + ::sg_import(src.linked, linked); + ::sg_import(src.svFlags, svFlags); + ::sg_import(src.bmodel, bmodel); + ::sg_import(src.mins, mins); + ::sg_import(src.maxs, maxs); + ::sg_import(src.contents, contents); + ::sg_import(src.absmin, absmin); + ::sg_import(src.absmax, absmax); + ::sg_import(src.currentOrigin, currentOrigin); + ::sg_import(src.currentAngles, currentAngles); + ::sg_import(src.owner, owner); + ::sg_import(src.ghoul2, ghoul2); + ::sg_import(src.modelScale, modelScale); + ::sg_import(src.classname, classname); + ::sg_import(src.spawnflags, spawnflags); + ::sg_import(src.flags, flags); + ::sg_import(src.model, model); + ::sg_import(src.model2, model2); + ::sg_import(src.freetime, freetime); + ::sg_import(src.eventTime, eventTime); + ::sg_import(src.freeAfterEvent, freeAfterEvent); + ::sg_import(src.physicsBounce, physicsBounce); + ::sg_import(src.clipmask, clipmask); + ::sg_import(src.speed, speed); + ::sg_import(src.resultspeed, resultspeed); + ::sg_import(src.lastMoveTime, lastMoveTime); + ::sg_import(src.movedir, movedir); + ::sg_import(src.lastOrigin, lastOrigin); + ::sg_import(src.lastAngles, lastAngles); + ::sg_import(src.mass, mass); + ::sg_import(src.lastImpact, lastImpact); + ::sg_import(src.watertype, watertype); + ::sg_import(src.waterlevel, waterlevel); + ::sg_import(src.wupdate, wupdate); + ::sg_import(src.prev_waterlevel, prev_waterlevel); + ::sg_import(src.angle, angle); + ::sg_import(src.target, target); + ::sg_import(src.target2, target2); + ::sg_import(src.target3, target3); + ::sg_import(src.target4, target4); + ::sg_import(src.targetJump, targetJump); + ::sg_import(src.targetname, targetname); + ::sg_import(src.team, team); + ::sg_import(src.roff, roff); + ::sg_import(src.roff_ctr, roff_ctr); + ::sg_import(src.next_roff_time, next_roff_time); + ::sg_import(src.fx_time, fx_time); + ::sg_import(src.nextthink, nextthink); + ::sg_import(src.e_ThinkFunc, e_ThinkFunc); + ::sg_import(src.e_clThinkFunc, e_clThinkFunc); + ::sg_import(src.e_ReachedFunc, e_ReachedFunc); + ::sg_import(src.e_BlockedFunc, e_BlockedFunc); + ::sg_import(src.e_TouchFunc, e_TouchFunc); + ::sg_import(src.e_UseFunc, e_UseFunc); + ::sg_import(src.e_PainFunc, e_PainFunc); + ::sg_import(src.e_DieFunc, e_DieFunc); + ::sg_import(src.health, health); + ::sg_import(src.max_health, max_health); + ::sg_import(src.takedamage, takedamage); + ::sg_import(src.material, material); + ::sg_import(src.damage, damage); + ::sg_import(src.dflags, dflags); + ::sg_import(src.splashDamage, splashDamage); + ::sg_import(src.splashRadius, splashRadius); + ::sg_import(src.methodOfDeath, methodOfDeath); + ::sg_import(src.splashMethodOfDeath, splashMethodOfDeath); + ::sg_import(src.locationDamage, locationDamage); + ::sg_import(src.chain, chain); + ::sg_import(src.enemy, enemy); + ::sg_import(src.activator, activator); + ::sg_import(src.teamchain, teamchain); + ::sg_import(src.teammaster, teammaster); + ::sg_import(src.lastEnemy, lastEnemy); + ::sg_import(src.wait, wait); + ::sg_import(src.random, random); + ::sg_import(src.delay, delay); + ::sg_import(src.alt_fire, alt_fire); + ::sg_import(src.count, count); + ::sg_import(src.bounceCount, bounceCount); + ::sg_import(src.fly_sound_debounce_time, fly_sound_debounce_time); + ::sg_import(src.painDebounceTime, painDebounceTime); + ::sg_import(src.disconnectDebounceTime, disconnectDebounceTime); + ::sg_import(src.attackDebounceTime, attackDebounceTime); + ::sg_import(src.pushDebounceTime, pushDebounceTime); + ::sg_import(src.aimDebounceTime, aimDebounceTime); + ::sg_import(src.useDebounceTime, useDebounceTime); + ::sg_import(src.trigger_formation, trigger_formation); + ::sg_import(src.spawnContents, spawnContents); + ::sg_import(src.waypoint, waypoint); + ::sg_import(src.wayedge, wayedge); + ::sg_import(src.lastWaypoint, lastWaypoint); + ::sg_import(src.lastInAirTime, lastInAirTime); + ::sg_import(src.noWaypointTime, noWaypointTime); + ::sg_import(src.combatPoint, combatPoint); + ::sg_import(src.followPos, followPos); + ::sg_import(src.followPosRecalcTime, followPosRecalcTime); + ::sg_import(src.followPosWaypoint, followPosWaypoint); + ::sg_import(src.loopAnim, loopAnim); + ::sg_import(src.startFrame, startFrame); + ::sg_import(src.endFrame, endFrame); + ::sg_import(src.m_iIcarusID, m_iIcarusID); + ::sg_import(src.taskID, taskID); + ::sg_import(src.parms, parms); + ::sg_import(src.behaviorSet, behaviorSet); + ::sg_import(src.script_targetname, script_targetname); + ::sg_import(src.delayScriptTime, delayScriptTime); + ::sg_import(src.soundSet, soundSet); + ::sg_import(src.setTime, setTime); + ::sg_import(src.cameraGroup, cameraGroup); + ::sg_import(src.noDamageTeam, noDamageTeam); + ::sg_import(src.playerModel, playerModel); + ::sg_import(src.weaponModel, weaponModel); + ::sg_import(src.handRBolt, handRBolt); + ::sg_import(src.handLBolt, handLBolt); + ::sg_import(src.headBolt, headBolt); + ::sg_import(src.cervicalBolt, cervicalBolt); + ::sg_import(src.chestBolt, chestBolt); + ::sg_import(src.gutBolt, gutBolt); + ::sg_import(src.torsoBolt, torsoBolt); + ::sg_import(src.crotchBolt, crotchBolt); + ::sg_import(src.motionBolt, motionBolt); + ::sg_import(src.kneeLBolt, kneeLBolt); + ::sg_import(src.kneeRBolt, kneeRBolt); + ::sg_import(src.elbowLBolt, elbowLBolt); + ::sg_import(src.elbowRBolt, elbowRBolt); + ::sg_import(src.footLBolt, footLBolt); + ::sg_import(src.footRBolt, footRBolt); + ::sg_import(src.faceBone, faceBone); + ::sg_import(src.craniumBone, craniumBone); + ::sg_import(src.cervicalBone, cervicalBone); + ::sg_import(src.thoracicBone, thoracicBone); + ::sg_import(src.upperLumbarBone, upperLumbarBone); + ::sg_import(src.lowerLumbarBone, lowerLumbarBone); + ::sg_import(src.hipsBone, hipsBone); + ::sg_import(src.motionBone, motionBone); + ::sg_import(src.rootBone, rootBone); + ::sg_import(src.footLBone, footLBone); + ::sg_import(src.footRBone, footRBone); + ::sg_import(src.humerusRBone, humerusRBone); + ::sg_import(src.genericBone1, genericBone1); + ::sg_import(src.genericBone2, genericBone2); + ::sg_import(src.genericBone3, genericBone3); + ::sg_import(src.genericBolt1, genericBolt1); + ::sg_import(src.genericBolt2, genericBolt2); + ::sg_import(src.genericBolt3, genericBolt3); + ::sg_import(src.genericBolt4, genericBolt4); + ::sg_import(src.genericBolt5, genericBolt5); + ::sg_import(src.cinematicModel, cinematicModel); + ::sg_import(src.m_pVehicle, m_pVehicle); + ::sg_import(src.NPC, NPC); + ::sg_import(src.ownername, ownername); + ::sg_import(src.cantHitEnemyCounter, cantHitEnemyCounter); + ::sg_import(src.NPC_type, NPC_type); + ::sg_import(src.NPC_targetname, NPC_targetname); + ::sg_import(src.NPC_target, NPC_target); + ::sg_import(src.moverState, moverState); + ::sg_import(src.soundPos1, soundPos1); + ::sg_import(src.sound1to2, sound1to2); + ::sg_import(src.sound2to1, sound2to1); + ::sg_import(src.soundPos2, soundPos2); + ::sg_import(src.soundLoop, soundLoop); + ::sg_import(src.nextTrain, nextTrain); + ::sg_import(src.prevTrain, prevTrain); + ::sg_import(src.pos1, pos1); + ::sg_import(src.pos2, pos2); + ::sg_import(src.pos3, pos3); + ::sg_import(src.sounds, sounds); + ::sg_import(src.closetarget, closetarget); + ::sg_import(src.opentarget, opentarget); + ::sg_import(src.paintarget, paintarget); + ::sg_import(src.lockCount, lockCount); + ::sg_import(src.radius, radius); + ::sg_import(src.wpIndex, wpIndex); + ::sg_import(src.noise_index, noise_index); + ::sg_import(src.startRGBA, startRGBA); + ::sg_import(src.finalRGBA, finalRGBA); + ::sg_import(src.item, item); + ::sg_import(src.message, message); + ::sg_import(src.lightLevel, lightLevel); + ::sg_import(src.forcePushTime, forcePushTime); + ::sg_import(src.forcePuller, forcePuller); +} + + +void CGhoul2Info_v::sg_export( + SgType& dst) const +{ + ::sg_export(mItem, dst.mItem); +} + +void CGhoul2Info_v::sg_import( + const SgType& src) +{ + ::sg_export(src.mItem, mItem); +} diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 72f2d3ec5c..c58113ceda 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -148,49 +148,10 @@ typedef struct { void sg_export( - SgType& dst) const - { - ::sg_export(infoValid, dst.infoValid); - ::sg_export(name, dst.name); - ::sg_export(team, dst.team); - ::sg_export(score, dst.score); - ::sg_export(handicap, dst.handicap); - ::sg_export(legsModel, dst.legsModel); - ::sg_export(legsSkin, dst.legsSkin); - ::sg_export(torsoModel, dst.torsoModel); - ::sg_export(torsoSkin, dst.torsoSkin); - ::sg_export(headModel, dst.headModel); - ::sg_export(headSkin, dst.headSkin); - ::sg_export(animFileIndex, dst.animFileIndex); - ::sg_export(sounds, dst.sounds); - ::sg_export(customBasicSoundDir, dst.customBasicSoundDir); - ::sg_export(customCombatSoundDir, dst.customCombatSoundDir); - ::sg_export(customExtraSoundDir, dst.customExtraSoundDir); - ::sg_export(customJediSoundDir, dst.customJediSoundDir); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.infoValid, infoValid); - ::sg_import(src.name, name); - ::sg_import(src.team, team); - ::sg_import(src.score, score); - ::sg_import(src.handicap, handicap); - ::sg_import(src.legsModel, legsModel); - ::sg_import(src.legsSkin, legsSkin); - ::sg_import(src.torsoModel, torsoModel); - ::sg_import(src.torsoSkin, torsoSkin); - ::sg_import(src.headModel, headModel); - ::sg_import(src.headSkin, headSkin); - ::sg_import(src.animFileIndex, animFileIndex); - ::sg_import(src.sounds, sounds); - ::sg_import(src.customBasicSoundDir, customBasicSoundDir); - ::sg_import(src.customCombatSoundDir, customCombatSoundDir); - ::sg_import(src.customExtraSoundDir, customExtraSoundDir); - ::sg_import(src.customJediSoundDir, customJediSoundDir); - } - + const SgType& src); } clientInfo_t; @@ -377,118 +338,10 @@ typedef struct renderInfo_s void sg_export( - SgType& dst) const - { - ::sg_export(legsModelName, dst.legsModelName); - ::sg_export(torsoModelName, dst.torsoModelName); - ::sg_export(headModelName, dst.headModelName); - ::sg_export(headYawRangeLeft, dst.headYawRangeLeft); - ::sg_export(headYawRangeRight, dst.headYawRangeRight); - ::sg_export(headPitchRangeUp, dst.headPitchRangeUp); - ::sg_export(headPitchRangeDown, dst.headPitchRangeDown); - ::sg_export(torsoYawRangeLeft, dst.torsoYawRangeLeft); - ::sg_export(torsoYawRangeRight, dst.torsoYawRangeRight); - ::sg_export(torsoPitchRangeUp, dst.torsoPitchRangeUp); - ::sg_export(torsoPitchRangeDown, dst.torsoPitchRangeDown); - ::sg_export(legsFrame, dst.legsFrame); - ::sg_export(torsoFrame, dst.torsoFrame); - ::sg_export(legsFpsMod, dst.legsFpsMod); - ::sg_export(torsoFpsMod, dst.torsoFpsMod); - ::sg_export(customRGBA, dst.customRGBA); - ::sg_export(boneIndex1, dst.boneIndex1); - ::sg_export(boneIndex2, dst.boneIndex2); - ::sg_export(boneIndex3, dst.boneIndex3); - ::sg_export(boneIndex4, dst.boneIndex4); - ::sg_export(boneOrient, dst.boneOrient); - ::sg_export(boneAngles1, dst.boneAngles1); - ::sg_export(boneAngles2, dst.boneAngles2); - ::sg_export(boneAngles3, dst.boneAngles3); - ::sg_export(boneAngles4, dst.boneAngles4); - ::sg_export(renderFlags, dst.renderFlags); - ::sg_export(muzzlePoint, dst.muzzlePoint); - ::sg_export(muzzleDir, dst.muzzleDir); - ::sg_export(muzzlePointOld, dst.muzzlePointOld); - ::sg_export(muzzleDirOld, dst.muzzleDirOld); - ::sg_export(mPCalcTime, dst.mPCalcTime); - ::sg_export(lockYaw, dst.lockYaw); - ::sg_export(headPoint, dst.headPoint); - ::sg_export(headAngles, dst.headAngles); - ::sg_export(handRPoint, dst.handRPoint); - ::sg_export(handLPoint, dst.handLPoint); - ::sg_export(crotchPoint, dst.crotchPoint); - ::sg_export(footRPoint, dst.footRPoint); - ::sg_export(footLPoint, dst.footLPoint); - ::sg_export(torsoPoint, dst.torsoPoint); - ::sg_export(torsoAngles, dst.torsoAngles); - ::sg_export(eyePoint, dst.eyePoint); - ::sg_export(eyeAngles, dst.eyeAngles); - ::sg_export(lookTarget, dst.lookTarget); - ::sg_export(lookMode, dst.lookMode); - ::sg_export(lookTargetClearTime, dst.lookTargetClearTime); - ::sg_export(lastVoiceVolume, dst.lastVoiceVolume); - ::sg_export(lastHeadAngles, dst.lastHeadAngles); - ::sg_export(headBobAngles, dst.headBobAngles); - ::sg_export(targetHeadBobAngles, dst.targetHeadBobAngles); - ::sg_export(lookingDebounceTime, dst.lookingDebounceTime); - ::sg_export(legsYaw, dst.legsYaw); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.legsModelName, legsModelName); - ::sg_import(src.torsoModelName, torsoModelName); - ::sg_import(src.headModelName, headModelName); - ::sg_import(src.headYawRangeLeft, headYawRangeLeft); - ::sg_import(src.headYawRangeRight, headYawRangeRight); - ::sg_import(src.headPitchRangeUp, headPitchRangeUp); - ::sg_import(src.headPitchRangeDown, headPitchRangeDown); - ::sg_import(src.torsoYawRangeLeft, torsoYawRangeLeft); - ::sg_import(src.torsoYawRangeRight, torsoYawRangeRight); - ::sg_import(src.torsoPitchRangeUp, torsoPitchRangeUp); - ::sg_import(src.torsoPitchRangeDown, torsoPitchRangeDown); - ::sg_import(src.legsFrame, legsFrame); - ::sg_import(src.torsoFrame, torsoFrame); - ::sg_import(src.legsFpsMod, legsFpsMod); - ::sg_import(src.torsoFpsMod, torsoFpsMod); - ::sg_import(src.customRGBA, customRGBA); - ::sg_import(src.boneIndex1, boneIndex1); - ::sg_import(src.boneIndex2, boneIndex2); - ::sg_import(src.boneIndex3, boneIndex3); - ::sg_import(src.boneIndex4, boneIndex4); - ::sg_import(src.boneOrient, boneOrient); - ::sg_import(src.boneAngles1, boneAngles1); - ::sg_import(src.boneAngles2, boneAngles2); - ::sg_import(src.boneAngles3, boneAngles3); - ::sg_import(src.boneAngles4, boneAngles4); - ::sg_import(src.renderFlags, renderFlags); - ::sg_import(src.muzzlePoint, muzzlePoint); - ::sg_import(src.muzzleDir, muzzleDir); - ::sg_import(src.muzzlePointOld, muzzlePointOld); - ::sg_import(src.muzzleDirOld, muzzleDirOld); - ::sg_import(src.mPCalcTime, mPCalcTime); - ::sg_import(src.lockYaw, lockYaw); - ::sg_import(src.headPoint, headPoint); - ::sg_import(src.headAngles, headAngles); - ::sg_import(src.handRPoint, handRPoint); - ::sg_import(src.handLPoint, handLPoint); - ::sg_import(src.crotchPoint, crotchPoint); - ::sg_import(src.footRPoint, footRPoint); - ::sg_import(src.footLPoint, footLPoint); - ::sg_import(src.torsoPoint, torsoPoint); - ::sg_import(src.torsoAngles, torsoAngles); - ::sg_import(src.eyePoint, eyePoint); - ::sg_import(src.eyeAngles, eyeAngles); - ::sg_import(src.lookTarget, lookTarget); - ::sg_import(src.lookMode, lookMode); - ::sg_import(src.lookTargetClearTime, lookTargetClearTime); - ::sg_import(src.lastVoiceVolume, lastVoiceVolume); - ::sg_import(src.lastHeadAngles, lastHeadAngles); - ::sg_import(src.headBobAngles, headBobAngles); - ::sg_import(src.targetHeadBobAngles, targetHeadBobAngles); - ::sg_import(src.lookingDebounceTime, lookingDebounceTime); - ::sg_import(src.legsYaw, legsYaw); - } + const SgType& src); } renderInfo_t; // Movement information structure @@ -555,36 +408,10 @@ typedef struct { void sg_export( - SgType& dst) const - { - ::sg_export(state, dst.state); - ::sg_export(captures, dst.captures); - ::sg_export(basedefense, dst.basedefense); - ::sg_export(carrierdefense, dst.carrierdefense); - ::sg_export(flagrecovery, dst.flagrecovery); - ::sg_export(fragcarrier, dst.fragcarrier); - ::sg_export(assists, dst.assists); - ::sg_export(lasthurtcarrier, dst.lasthurtcarrier); - ::sg_export(lastreturnedflag, dst.lastreturnedflag); - ::sg_export(flagsince, dst.flagsince); - ::sg_export(lastfraggedcarrier, dst.lastfraggedcarrier); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.state, state); - ::sg_import(src.captures, captures); - ::sg_import(src.basedefense, basedefense); - ::sg_import(src.carrierdefense, carrierdefense); - ::sg_import(src.flagrecovery, flagrecovery); - ::sg_import(src.fragcarrier, fragcarrier); - ::sg_import(src.assists, assists); - ::sg_import(src.lasthurtcarrier, lasthurtcarrier); - ::sg_import(src.lastreturnedflag, lastreturnedflag); - ::sg_import(src.flagsince, flagsince); - ::sg_import(src.lastfraggedcarrier, lastfraggedcarrier); - } + const SgType& src); } playerTeamState_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! @@ -607,18 +434,10 @@ typedef struct objectives_s void sg_export( - SgType& dst) const - { - ::sg_export(display, dst.display); - ::sg_export(status, dst.status); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.display, display); - ::sg_import(src.status, status); - } + const SgType& src); } objectives_t; // NOTE: This is an arbitrary number greater than our current number of objectives with // some fluff just in case we add more in the future. @@ -668,42 +487,10 @@ typedef struct missionStats_s void sg_export( - SgType& dst) const - { - ::sg_export(secretsFound, dst.secretsFound); - ::sg_export(totalSecrets, dst.totalSecrets); - ::sg_export(shotsFired, dst.shotsFired); - ::sg_export(hits, dst.hits); - ::sg_export(enemiesSpawned, dst.enemiesSpawned); - ::sg_export(enemiesKilled, dst.enemiesKilled); - ::sg_export(saberThrownCnt, dst.saberThrownCnt); - ::sg_export(saberBlocksCnt, dst.saberBlocksCnt); - ::sg_export(legAttacksCnt, dst.legAttacksCnt); - ::sg_export(armAttacksCnt, dst.armAttacksCnt); - ::sg_export(torsoAttacksCnt, dst.torsoAttacksCnt); - ::sg_export(otherAttacksCnt, dst.otherAttacksCnt); - ::sg_export(forceUsed, dst.forceUsed); - ::sg_export(weaponUsed, dst.weaponUsed); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.secretsFound, secretsFound); - ::sg_import(src.totalSecrets, totalSecrets); - ::sg_import(src.shotsFired, shotsFired); - ::sg_import(src.hits, hits); - ::sg_import(src.enemiesSpawned, enemiesSpawned); - ::sg_import(src.enemiesKilled, enemiesKilled); - ::sg_import(src.saberThrownCnt, saberThrownCnt); - ::sg_import(src.saberBlocksCnt, saberBlocksCnt); - ::sg_import(src.legAttacksCnt, legAttacksCnt); - ::sg_import(src.armAttacksCnt, armAttacksCnt); - ::sg_import(src.torsoAttacksCnt, torsoAttacksCnt); - ::sg_import(src.otherAttacksCnt, otherAttacksCnt); - ::sg_import(src.forceUsed, forceUsed); - ::sg_import(src.weaponUsed, weaponUsed); - } + const SgType& src); } missionStats_t; // the auto following clients don't follow a specific client @@ -739,22 +526,10 @@ typedef struct { void sg_export( - SgType& dst) const - { - ::sg_export(missionObjectivesShown, dst.missionObjectivesShown); - ::sg_export(sessionTeam, dst.sessionTeam); - ::sg_export(mission_objectives, dst.mission_objectives); - ::sg_export(missionStats, dst.missionStats); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.missionObjectivesShown, missionObjectivesShown); - ::sg_import(src.sessionTeam, sessionTeam); - ::sg_import(src.mission_objectives, mission_objectives); - ::sg_import(src.missionStats, missionStats); - } + const SgType& src); } clientSession_t; // client data that stays across multiple respawns, but is cleared @@ -789,28 +564,10 @@ typedef struct { void sg_export( - SgType& dst) const - { - ::sg_export(connected, dst.connected); - ::sg_export(lastCommand, dst.lastCommand); - ::sg_export(netname, dst.netname); - ::sg_export(maxHealth, dst.maxHealth); - ::sg_export(enterTime, dst.enterTime); - ::sg_export(cmd_angles, dst.cmd_angles); - ::sg_export(teamState, dst.teamState); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.connected, connected); - ::sg_import(src.lastCommand, lastCommand); - ::sg_import(src.netname, netname); - ::sg_import(src.maxHealth, maxHealth); - ::sg_import(src.enterTime, enterTime); - ::sg_import(src.cmd_angles, cmd_angles); - ::sg_import(src.teamState, teamState); - } + const SgType& src); } clientPersistant_t; typedef enum { @@ -1022,134 +779,10 @@ struct gclient_s { void sg_export( - SgType& dst) const - { - ::sg_export(ps, dst.ps); - ::sg_export(pers, dst.pers); - ::sg_export(sess, dst.sess); - ::sg_export(lastCmdTime, dst.lastCmdTime); - ::sg_export(usercmd, dst.usercmd); - ::sg_export(buttons, dst.buttons); - ::sg_export(oldbuttons, dst.oldbuttons); - ::sg_export(latched_buttons, dst.latched_buttons); - ::sg_export(damage_armor, dst.damage_armor); - ::sg_export(damage_blood, dst.damage_blood); - ::sg_export(damage_from, dst.damage_from); - ::sg_export(damage_fromWorld, dst.damage_fromWorld); - ::sg_export(noclip, dst.noclip); - ::sg_export(forced_forwardmove, dst.forced_forwardmove); - ::sg_export(forced_rightmove, dst.forced_rightmove); - ::sg_export(respawnTime, dst.respawnTime); - ::sg_export(idleTime, dst.idleTime); - ::sg_export(airOutTime, dst.airOutTime); - ::sg_export(timeResidual, dst.timeResidual); - ::sg_export(facial_blink, dst.facial_blink); - ::sg_export(facial_timer, dst.facial_timer); - ::sg_export(facial_anim, dst.facial_anim); - ::sg_export(clientInfo, dst.clientInfo); - ::sg_export(moveType, dst.moveType); - ::sg_export(jetPackTime, dst.jetPackTime); - ::sg_export(fireDelay, dst.fireDelay); - ::sg_export(breathPuffTime, dst.breathPuffTime); - ::sg_export(playerTeam, dst.playerTeam); - ::sg_export(enemyTeam, dst.enemyTeam); - ::sg_export(leader, dst.leader); - ::sg_export(NPC_class, dst.NPC_class); - ::sg_export(hiddenDist, dst.hiddenDist); - ::sg_export(hiddenDir, dst.hiddenDir); - ::sg_export(renderInfo, dst.renderInfo); - ::sg_export(dismembered, dst.dismembered); - ::sg_export(dismemberProbLegs, dst.dismemberProbLegs); - ::sg_export(dismemberProbHead, dst.dismemberProbHead); - ::sg_export(dismemberProbArms, dst.dismemberProbArms); - ::sg_export(dismemberProbHands, dst.dismemberProbHands); - ::sg_export(dismemberProbWaist, dst.dismemberProbWaist); - ::sg_export(standheight, dst.standheight); - ::sg_export(crouchheight, dst.crouchheight); - ::sg_export(poisonDamage, dst.poisonDamage); - ::sg_export(poisonTime, dst.poisonTime); - ::sg_export(slopeRecalcTime, dst.slopeRecalcTime); - ::sg_export(pushVec, dst.pushVec); - ::sg_export(pushVecTime, dst.pushVecTime); - ::sg_export(noRagTime, dst.noRagTime); - ::sg_export(isRagging, dst.isRagging); - ::sg_export(overridingBones, dst.overridingBones); - ::sg_export(ragLastOrigin, dst.ragLastOrigin); - ::sg_export(ragLastOriginTime, dst.ragLastOriginTime); - ::sg_export(pushEffectFadeTime, dst.pushEffectFadeTime); - ::sg_export(pushEffectOrigin, dst.pushEffectOrigin); - ::sg_export(rocketLockIndex, dst.rocketLockIndex); - ::sg_export(rocketLastValidTime, dst.rocketLastValidTime); - ::sg_export(rocketLockTime, dst.rocketLockTime); - ::sg_export(rocketTargetTime, dst.rocketTargetTime); - ::sg_export(inSpaceSuffocation, dst.inSpaceSuffocation); - ::sg_export(inSpaceIndex, dst.inSpaceIndex); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.ps, ps); - ::sg_import(src.pers, pers); - ::sg_import(src.sess, sess); - ::sg_import(src.lastCmdTime, lastCmdTime); - ::sg_import(src.usercmd, usercmd); - ::sg_import(src.buttons, buttons); - ::sg_import(src.oldbuttons, oldbuttons); - ::sg_import(src.latched_buttons, latched_buttons); - ::sg_import(src.damage_armor, damage_armor); - ::sg_import(src.damage_blood, damage_blood); - ::sg_import(src.damage_from, damage_from); - ::sg_import(src.damage_fromWorld, damage_fromWorld); - ::sg_import(src.noclip, noclip); - ::sg_import(src.forced_forwardmove, forced_forwardmove); - ::sg_import(src.forced_rightmove, forced_rightmove); - ::sg_import(src.respawnTime, respawnTime); - ::sg_import(src.idleTime, idleTime); - ::sg_import(src.airOutTime, airOutTime); - ::sg_import(src.timeResidual, timeResidual); - ::sg_import(src.facial_blink, facial_blink); - ::sg_import(src.facial_timer, facial_timer); - ::sg_import(src.facial_anim, facial_anim); - ::sg_import(src.clientInfo, clientInfo); - ::sg_import(src.moveType, moveType); - ::sg_import(src.jetPackTime, jetPackTime); - ::sg_import(src.fireDelay, fireDelay); - ::sg_import(src.breathPuffTime, breathPuffTime); - ::sg_import(src.playerTeam, playerTeam); - ::sg_import(src.enemyTeam, enemyTeam); - ::sg_import(src.leader, leader); - ::sg_import(src.NPC_class, NPC_class); - ::sg_import(src.hiddenDist, hiddenDist); - ::sg_import(src.hiddenDir, hiddenDir); - ::sg_import(src.renderInfo, renderInfo); - ::sg_import(src.dismembered, dismembered); - ::sg_import(src.dismemberProbLegs, dismemberProbLegs); - ::sg_import(src.dismemberProbHead, dismemberProbHead); - ::sg_import(src.dismemberProbArms, dismemberProbArms); - ::sg_import(src.dismemberProbHands, dismemberProbHands); - ::sg_import(src.dismemberProbWaist, dismemberProbWaist); - ::sg_import(src.standheight, standheight); - ::sg_import(src.crouchheight, crouchheight); - ::sg_import(src.poisonDamage, poisonDamage); - ::sg_import(src.poisonTime, poisonTime); - ::sg_import(src.slopeRecalcTime, slopeRecalcTime); - ::sg_import(src.pushVec, pushVec); - ::sg_import(src.pushVecTime, pushVecTime); - ::sg_import(src.noRagTime, noRagTime); - ::sg_import(src.isRagging, isRagging); - ::sg_import(src.overridingBones, overridingBones); - ::sg_import(src.ragLastOrigin, ragLastOrigin); - ::sg_import(src.ragLastOriginTime, ragLastOriginTime); - ::sg_import(src.pushEffectFadeTime, pushEffectFadeTime); - ::sg_import(src.pushEffectOrigin, pushEffectOrigin); - ::sg_import(src.rocketLockIndex, rocketLockIndex); - ::sg_import(src.rocketLastValidTime, rocketLastValidTime); - ::sg_import(src.rocketLockTime, rocketLockTime); - ::sg_import(src.rocketTargetTime, rocketTargetTime); - ::sg_import(src.inSpaceSuffocation, inSpaceSuffocation); - ::sg_import(src.inSpaceIndex, inSpaceIndex); - } + const SgType& src); }; #define MAX_PARMS 16 @@ -1172,16 +805,10 @@ typedef struct void sg_export( - SgType& dst) const - { - ::sg_export(parm, dst.parm); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.parm, parm); - } + const SgType& src); } parms_t; #ifdef GAME_INCLUDE @@ -1709,382 +1336,10 @@ Ghoul2 Insert End void sg_export( - SgType& dst) const - { - ::sg_export(s, dst.s); - ::sg_export(client, dst.client); - ::sg_export(inuse, dst.inuse); - ::sg_export(linked, dst.linked); - ::sg_export(svFlags, dst.svFlags); - ::sg_export(bmodel, dst.bmodel); - ::sg_export(mins, dst.mins); - ::sg_export(maxs, dst.maxs); - ::sg_export(contents, dst.contents); - ::sg_export(absmin, dst.absmin); - ::sg_export(absmax, dst.absmax); - ::sg_export(currentOrigin, dst.currentOrigin); - ::sg_export(currentAngles, dst.currentAngles); - ::sg_export(owner, dst.owner); - ::sg_export(ghoul2, dst.ghoul2); - ::sg_export(modelScale, dst.modelScale); - ::sg_export(classname, dst.classname); - ::sg_export(spawnflags, dst.spawnflags); - ::sg_export(flags, dst.flags); - ::sg_export(model, dst.model); - ::sg_export(model2, dst.model2); - ::sg_export(freetime, dst.freetime); - ::sg_export(eventTime, dst.eventTime); - ::sg_export(freeAfterEvent, dst.freeAfterEvent); - ::sg_export(physicsBounce, dst.physicsBounce); - ::sg_export(clipmask, dst.clipmask); - ::sg_export(speed, dst.speed); - ::sg_export(resultspeed, dst.resultspeed); - ::sg_export(lastMoveTime, dst.lastMoveTime); - ::sg_export(movedir, dst.movedir); - ::sg_export(lastOrigin, dst.lastOrigin); - ::sg_export(lastAngles, dst.lastAngles); - ::sg_export(mass, dst.mass); - ::sg_export(lastImpact, dst.lastImpact); - ::sg_export(watertype, dst.watertype); - ::sg_export(waterlevel, dst.waterlevel); - ::sg_export(wupdate, dst.wupdate); - ::sg_export(prev_waterlevel, dst.prev_waterlevel); - ::sg_export(angle, dst.angle); - ::sg_export(target, dst.target); - ::sg_export(target2, dst.target2); - ::sg_export(target3, dst.target3); - ::sg_export(target4, dst.target4); - ::sg_export(targetJump, dst.targetJump); - ::sg_export(targetname, dst.targetname); - ::sg_export(team, dst.team); - ::sg_export(roff, dst.roff); - ::sg_export(roff_ctr, dst.roff_ctr); - ::sg_export(next_roff_time, dst.next_roff_time); - ::sg_export(fx_time, dst.fx_time); - ::sg_export(nextthink, dst.nextthink); - ::sg_export(e_ThinkFunc, dst.e_ThinkFunc); - ::sg_export(e_clThinkFunc, dst.e_clThinkFunc); - ::sg_export(e_ReachedFunc, dst.e_ReachedFunc); - ::sg_export(e_BlockedFunc, dst.e_BlockedFunc); - ::sg_export(e_TouchFunc, dst.e_TouchFunc); - ::sg_export(e_UseFunc, dst.e_UseFunc); - ::sg_export(e_PainFunc, dst.e_PainFunc); - ::sg_export(e_DieFunc, dst.e_DieFunc); - ::sg_export(health, dst.health); - ::sg_export(max_health, dst.max_health); - ::sg_export(takedamage, dst.takedamage); - ::sg_export(material, dst.material); - ::sg_export(damage, dst.damage); - ::sg_export(dflags, dst.dflags); - ::sg_export(splashDamage, dst.splashDamage); - ::sg_export(splashRadius, dst.splashRadius); - ::sg_export(methodOfDeath, dst.methodOfDeath); - ::sg_export(splashMethodOfDeath, dst.splashMethodOfDeath); - ::sg_export(locationDamage, dst.locationDamage); - ::sg_export(chain, dst.chain); - ::sg_export(enemy, dst.enemy); - ::sg_export(activator, dst.activator); - ::sg_export(teamchain, dst.teamchain); - ::sg_export(teammaster, dst.teammaster); - ::sg_export(lastEnemy, dst.lastEnemy); - ::sg_export(wait, dst.wait); - ::sg_export(random, dst.random); - ::sg_export(delay, dst.delay); - ::sg_export(alt_fire, dst.alt_fire); - ::sg_export(count, dst.count); - ::sg_export(bounceCount, dst.bounceCount); - ::sg_export(fly_sound_debounce_time, dst.fly_sound_debounce_time); - ::sg_export(painDebounceTime, dst.painDebounceTime); - ::sg_export(disconnectDebounceTime, dst.disconnectDebounceTime); - ::sg_export(attackDebounceTime, dst.attackDebounceTime); - ::sg_export(pushDebounceTime, dst.pushDebounceTime); - ::sg_export(aimDebounceTime, dst.aimDebounceTime); - ::sg_export(useDebounceTime, dst.useDebounceTime); - ::sg_export(trigger_formation, dst.trigger_formation); - ::sg_export(spawnContents, dst.spawnContents); - ::sg_export(waypoint, dst.waypoint); - ::sg_export(wayedge, dst.wayedge); - ::sg_export(lastWaypoint, dst.lastWaypoint); - ::sg_export(lastInAirTime, dst.lastInAirTime); - ::sg_export(noWaypointTime, dst.noWaypointTime); - ::sg_export(combatPoint, dst.combatPoint); - ::sg_export(followPos, dst.followPos); - ::sg_export(followPosRecalcTime, dst.followPosRecalcTime); - ::sg_export(followPosWaypoint, dst.followPosWaypoint); - ::sg_export(loopAnim, dst.loopAnim); - ::sg_export(startFrame, dst.startFrame); - ::sg_export(endFrame, dst.endFrame); - ::sg_export(m_iIcarusID, dst.m_iIcarusID); - ::sg_export(taskID, dst.taskID); - ::sg_export(parms, dst.parms); - ::sg_export(behaviorSet, dst.behaviorSet); - ::sg_export(script_targetname, dst.script_targetname); - ::sg_export(delayScriptTime, dst.delayScriptTime); - ::sg_export(soundSet, dst.soundSet); - ::sg_export(setTime, dst.setTime); - ::sg_export(cameraGroup, dst.cameraGroup); - ::sg_export(noDamageTeam, dst.noDamageTeam); - ::sg_export(playerModel, dst.playerModel); - ::sg_export(weaponModel, dst.weaponModel); - ::sg_export(handRBolt, dst.handRBolt); - ::sg_export(handLBolt, dst.handLBolt); - ::sg_export(headBolt, dst.headBolt); - ::sg_export(cervicalBolt, dst.cervicalBolt); - ::sg_export(chestBolt, dst.chestBolt); - ::sg_export(gutBolt, dst.gutBolt); - ::sg_export(torsoBolt, dst.torsoBolt); - ::sg_export(crotchBolt, dst.crotchBolt); - ::sg_export(motionBolt, dst.motionBolt); - ::sg_export(kneeLBolt, dst.kneeLBolt); - ::sg_export(kneeRBolt, dst.kneeRBolt); - ::sg_export(elbowLBolt, dst.elbowLBolt); - ::sg_export(elbowRBolt, dst.elbowRBolt); - ::sg_export(footLBolt, dst.footLBolt); - ::sg_export(footRBolt, dst.footRBolt); - ::sg_export(faceBone, dst.faceBone); - ::sg_export(craniumBone, dst.craniumBone); - ::sg_export(cervicalBone, dst.cervicalBone); - ::sg_export(thoracicBone, dst.thoracicBone); - ::sg_export(upperLumbarBone, dst.upperLumbarBone); - ::sg_export(lowerLumbarBone, dst.lowerLumbarBone); - ::sg_export(hipsBone, dst.hipsBone); - ::sg_export(motionBone, dst.motionBone); - ::sg_export(rootBone, dst.rootBone); - ::sg_export(footLBone, dst.footLBone); - ::sg_export(footRBone, dst.footRBone); - ::sg_export(humerusRBone, dst.humerusRBone); - ::sg_export(genericBone1, dst.genericBone1); - ::sg_export(genericBone2, dst.genericBone2); - ::sg_export(genericBone3, dst.genericBone3); - ::sg_export(genericBolt1, dst.genericBolt1); - ::sg_export(genericBolt2, dst.genericBolt2); - ::sg_export(genericBolt3, dst.genericBolt3); - ::sg_export(genericBolt4, dst.genericBolt4); - ::sg_export(genericBolt5, dst.genericBolt5); - ::sg_export(cinematicModel, dst.cinematicModel); - ::sg_export(m_pVehicle, dst.m_pVehicle); - ::sg_export(NPC, dst.NPC); - ::sg_export(ownername, dst.ownername); - ::sg_export(cantHitEnemyCounter, dst.cantHitEnemyCounter); - ::sg_export(NPC_type, dst.NPC_type); - ::sg_export(NPC_targetname, dst.NPC_targetname); - ::sg_export(NPC_target, dst.NPC_target); - ::sg_export(moverState, dst.moverState); - ::sg_export(soundPos1, dst.soundPos1); - ::sg_export(sound1to2, dst.sound1to2); - ::sg_export(sound2to1, dst.sound2to1); - ::sg_export(soundPos2, dst.soundPos2); - ::sg_export(soundLoop, dst.soundLoop); - ::sg_export(nextTrain, dst.nextTrain); - ::sg_export(prevTrain, dst.prevTrain); - ::sg_export(pos1, dst.pos1); - ::sg_export(pos2, dst.pos2); - ::sg_export(pos3, dst.pos3); - ::sg_export(sounds, dst.sounds); - ::sg_export(closetarget, dst.closetarget); - ::sg_export(opentarget, dst.opentarget); - ::sg_export(paintarget, dst.paintarget); - ::sg_export(lockCount, dst.lockCount); - ::sg_export(radius, dst.radius); - ::sg_export(wpIndex, dst.wpIndex); - ::sg_export(noise_index, dst.noise_index); - ::sg_export(startRGBA, dst.startRGBA); - ::sg_export(finalRGBA, dst.finalRGBA); - ::sg_export(item, dst.item); - ::sg_export(message, dst.message); - ::sg_export(lightLevel, dst.lightLevel); - ::sg_export(forcePushTime, dst.forcePushTime); - ::sg_export(forcePuller, dst.forcePuller); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.s, s); - ::sg_import(src.client, client); - ::sg_import(src.inuse, inuse); - ::sg_import(src.linked, linked); - ::sg_import(src.svFlags, svFlags); - ::sg_import(src.bmodel, bmodel); - ::sg_import(src.mins, mins); - ::sg_import(src.maxs, maxs); - ::sg_import(src.contents, contents); - ::sg_import(src.absmin, absmin); - ::sg_import(src.absmax, absmax); - ::sg_import(src.currentOrigin, currentOrigin); - ::sg_import(src.currentAngles, currentAngles); - ::sg_import(src.owner, owner); - ::sg_import(src.ghoul2, ghoul2); - ::sg_import(src.modelScale, modelScale); - ::sg_import(src.classname, classname); - ::sg_import(src.spawnflags, spawnflags); - ::sg_import(src.flags, flags); - ::sg_import(src.model, model); - ::sg_import(src.model2, model2); - ::sg_import(src.freetime, freetime); - ::sg_import(src.eventTime, eventTime); - ::sg_import(src.freeAfterEvent, freeAfterEvent); - ::sg_import(src.physicsBounce, physicsBounce); - ::sg_import(src.clipmask, clipmask); - ::sg_import(src.speed, speed); - ::sg_import(src.resultspeed, resultspeed); - ::sg_import(src.lastMoveTime, lastMoveTime); - ::sg_import(src.movedir, movedir); - ::sg_import(src.lastOrigin, lastOrigin); - ::sg_import(src.lastAngles, lastAngles); - ::sg_import(src.mass, mass); - ::sg_import(src.lastImpact, lastImpact); - ::sg_import(src.watertype, watertype); - ::sg_import(src.waterlevel, waterlevel); - ::sg_import(src.wupdate, wupdate); - ::sg_import(src.prev_waterlevel, prev_waterlevel); - ::sg_import(src.angle, angle); - ::sg_import(src.target, target); - ::sg_import(src.target2, target2); - ::sg_import(src.target3, target3); - ::sg_import(src.target4, target4); - ::sg_import(src.targetJump, targetJump); - ::sg_import(src.targetname, targetname); - ::sg_import(src.team, team); - ::sg_import(src.roff, roff); - ::sg_import(src.roff_ctr, roff_ctr); - ::sg_import(src.next_roff_time, next_roff_time); - ::sg_import(src.fx_time, fx_time); - ::sg_import(src.nextthink, nextthink); - ::sg_import(src.e_ThinkFunc, e_ThinkFunc); - ::sg_import(src.e_clThinkFunc, e_clThinkFunc); - ::sg_import(src.e_ReachedFunc, e_ReachedFunc); - ::sg_import(src.e_BlockedFunc, e_BlockedFunc); - ::sg_import(src.e_TouchFunc, e_TouchFunc); - ::sg_import(src.e_UseFunc, e_UseFunc); - ::sg_import(src.e_PainFunc, e_PainFunc); - ::sg_import(src.e_DieFunc, e_DieFunc); - ::sg_import(src.health, health); - ::sg_import(src.max_health, max_health); - ::sg_import(src.takedamage, takedamage); - ::sg_import(src.material, material); - ::sg_import(src.damage, damage); - ::sg_import(src.dflags, dflags); - ::sg_import(src.splashDamage, splashDamage); - ::sg_import(src.splashRadius, splashRadius); - ::sg_import(src.methodOfDeath, methodOfDeath); - ::sg_import(src.splashMethodOfDeath, splashMethodOfDeath); - ::sg_import(src.locationDamage, locationDamage); - ::sg_import(src.chain, chain); - ::sg_import(src.enemy, enemy); - ::sg_import(src.activator, activator); - ::sg_import(src.teamchain, teamchain); - ::sg_import(src.teammaster, teammaster); - ::sg_import(src.lastEnemy, lastEnemy); - ::sg_import(src.wait, wait); - ::sg_import(src.random, random); - ::sg_import(src.delay, delay); - ::sg_import(src.alt_fire, alt_fire); - ::sg_import(src.count, count); - ::sg_import(src.bounceCount, bounceCount); - ::sg_import(src.fly_sound_debounce_time, fly_sound_debounce_time); - ::sg_import(src.painDebounceTime, painDebounceTime); - ::sg_import(src.disconnectDebounceTime, disconnectDebounceTime); - ::sg_import(src.attackDebounceTime, attackDebounceTime); - ::sg_import(src.pushDebounceTime, pushDebounceTime); - ::sg_import(src.aimDebounceTime, aimDebounceTime); - ::sg_import(src.useDebounceTime, useDebounceTime); - ::sg_import(src.trigger_formation, trigger_formation); - ::sg_import(src.spawnContents, spawnContents); - ::sg_import(src.waypoint, waypoint); - ::sg_import(src.wayedge, wayedge); - ::sg_import(src.lastWaypoint, lastWaypoint); - ::sg_import(src.lastInAirTime, lastInAirTime); - ::sg_import(src.noWaypointTime, noWaypointTime); - ::sg_import(src.combatPoint, combatPoint); - ::sg_import(src.followPos, followPos); - ::sg_import(src.followPosRecalcTime, followPosRecalcTime); - ::sg_import(src.followPosWaypoint, followPosWaypoint); - ::sg_import(src.loopAnim, loopAnim); - ::sg_import(src.startFrame, startFrame); - ::sg_import(src.endFrame, endFrame); - ::sg_import(src.m_iIcarusID, m_iIcarusID); - ::sg_import(src.taskID, taskID); - ::sg_import(src.parms, parms); - ::sg_import(src.behaviorSet, behaviorSet); - ::sg_import(src.script_targetname, script_targetname); - ::sg_import(src.delayScriptTime, delayScriptTime); - ::sg_import(src.soundSet, soundSet); - ::sg_import(src.setTime, setTime); - ::sg_import(src.cameraGroup, cameraGroup); - ::sg_import(src.noDamageTeam, noDamageTeam); - ::sg_import(src.playerModel, playerModel); - ::sg_import(src.weaponModel, weaponModel); - ::sg_import(src.handRBolt, handRBolt); - ::sg_import(src.handLBolt, handLBolt); - ::sg_import(src.headBolt, headBolt); - ::sg_import(src.cervicalBolt, cervicalBolt); - ::sg_import(src.chestBolt, chestBolt); - ::sg_import(src.gutBolt, gutBolt); - ::sg_import(src.torsoBolt, torsoBolt); - ::sg_import(src.crotchBolt, crotchBolt); - ::sg_import(src.motionBolt, motionBolt); - ::sg_import(src.kneeLBolt, kneeLBolt); - ::sg_import(src.kneeRBolt, kneeRBolt); - ::sg_import(src.elbowLBolt, elbowLBolt); - ::sg_import(src.elbowRBolt, elbowRBolt); - ::sg_import(src.footLBolt, footLBolt); - ::sg_import(src.footRBolt, footRBolt); - ::sg_import(src.faceBone, faceBone); - ::sg_import(src.craniumBone, craniumBone); - ::sg_import(src.cervicalBone, cervicalBone); - ::sg_import(src.thoracicBone, thoracicBone); - ::sg_import(src.upperLumbarBone, upperLumbarBone); - ::sg_import(src.lowerLumbarBone, lowerLumbarBone); - ::sg_import(src.hipsBone, hipsBone); - ::sg_import(src.motionBone, motionBone); - ::sg_import(src.rootBone, rootBone); - ::sg_import(src.footLBone, footLBone); - ::sg_import(src.footRBone, footRBone); - ::sg_import(src.humerusRBone, humerusRBone); - ::sg_import(src.genericBone1, genericBone1); - ::sg_import(src.genericBone2, genericBone2); - ::sg_import(src.genericBone3, genericBone3); - ::sg_import(src.genericBolt1, genericBolt1); - ::sg_import(src.genericBolt2, genericBolt2); - ::sg_import(src.genericBolt3, genericBolt3); - ::sg_import(src.genericBolt4, genericBolt4); - ::sg_import(src.genericBolt5, genericBolt5); - ::sg_import(src.cinematicModel, cinematicModel); - ::sg_import(src.m_pVehicle, m_pVehicle); - ::sg_import(src.NPC, NPC); - ::sg_import(src.ownername, ownername); - ::sg_import(src.cantHitEnemyCounter, cantHitEnemyCounter); - ::sg_import(src.NPC_type, NPC_type); - ::sg_import(src.NPC_targetname, NPC_targetname); - ::sg_import(src.NPC_target, NPC_target); - ::sg_import(src.moverState, moverState); - ::sg_import(src.soundPos1, soundPos1); - ::sg_import(src.sound1to2, sound1to2); - ::sg_import(src.sound2to1, sound2to1); - ::sg_import(src.soundPos2, soundPos2); - ::sg_import(src.soundLoop, soundLoop); - ::sg_import(src.nextTrain, nextTrain); - ::sg_import(src.prevTrain, prevTrain); - ::sg_import(src.pos1, pos1); - ::sg_import(src.pos2, pos2); - ::sg_import(src.pos3, pos3); - ::sg_import(src.sounds, sounds); - ::sg_import(src.closetarget, closetarget); - ::sg_import(src.opentarget, opentarget); - ::sg_import(src.paintarget, paintarget); - ::sg_import(src.lockCount, lockCount); - ::sg_import(src.radius, radius); - ::sg_import(src.wpIndex, wpIndex); - ::sg_import(src.noise_index, noise_index); - ::sg_import(src.startRGBA, startRGBA); - ::sg_import(src.finalRGBA, finalRGBA); - ::sg_import(src.item, item); - ::sg_import(src.message, message); - ::sg_import(src.lightLevel, lightLevel); - ::sg_import(src.forcePushTime, forcePushTime); - ::sg_import(src.forcePuller, forcePuller); - } + const SgType& src); }; #endif //#ifdef GAME_INCLUDE diff --git a/code/game/g_vehicles.cpp b/code/game/g_vehicles.cpp index d25f003bad..fb072daf9c 100644 --- a/code/game/g_vehicles.cpp +++ b/code/game/g_vehicles.cpp @@ -22,6 +22,8 @@ along with this program; if not, see . #include "../qcommon/q_shared.h" #include "g_local.h" +#include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_saved_game.h" #ifdef _JK2 //SP does not have this preprocessor for game like MP does #ifndef _JK2MP @@ -3207,3 +3209,156 @@ void G_SetSharedVehicleFunctions( vehicleInfo_t *pVehInfo ) #undef MOD_EXPLOSIVE #endif + + +void Muzzle::sg_export( + SgType& dst) const +{ + ::sg_export(m_vMuzzlePos, dst.m_vMuzzlePos); + ::sg_export(m_vMuzzleDir, dst.m_vMuzzleDir); + ::sg_export(m_iMuzzleWait, dst.m_iMuzzleWait); + ::sg_export(m_bFired, dst.m_bFired); +} + +void Muzzle::sg_import( + const SgType& src) +{ + ::sg_import(src.m_vMuzzlePos, m_vMuzzlePos); + ::sg_import(src.m_vMuzzleDir, m_vMuzzleDir); + ::sg_import(src.m_iMuzzleWait, m_iMuzzleWait); + ::sg_import(src.m_bFired, m_bFired); +} + + +void vehWeaponStatus_t::sg_export( + SgType& dst) const +{ + ::sg_export(linked, dst.linked); + ::sg_export(ammo, dst.ammo); + ::sg_export(lastAmmoInc, dst.lastAmmoInc); + ::sg_export(nextMuzzle, dst.nextMuzzle); +} + +void vehWeaponStatus_t::sg_import( + const SgType& src) +{ + ::sg_import(src.linked, linked); + ::sg_import(src.ammo, ammo); + ::sg_import(src.lastAmmoInc, lastAmmoInc); + ::sg_import(src.nextMuzzle, nextMuzzle); +} + + +void vehTurretStatus_t::sg_export( + SgType& dst) const +{ + ::sg_export(ammo, dst.ammo); + ::sg_export(lastAmmoInc, dst.lastAmmoInc); + ::sg_export(nextMuzzle, dst.nextMuzzle); + ::sg_export(enemyEntNum, dst.enemyEntNum); + ::sg_export(enemyHoldTime, dst.enemyHoldTime); +} + +void vehTurretStatus_t::sg_import( + const SgType& src) +{ + ::sg_import(src.ammo, ammo); + ::sg_import(src.lastAmmoInc, lastAmmoInc); + ::sg_import(src.nextMuzzle, nextMuzzle); + ::sg_import(src.enemyEntNum, enemyEntNum); + ::sg_import(src.enemyHoldTime, enemyHoldTime); +} + + +void Vehicle_t::sg_export( + SgType& dst) const +{ + ::sg_export(m_pPilot, dst.m_pPilot); + ::sg_export(m_iPilotTime, dst.m_iPilotTime); + ::sg_export(m_bHasHadPilot, dst.m_bHasHadPilot); + ::sg_export(m_pDroidUnit, dst.m_pDroidUnit); + ::sg_export(m_pParentEntity, dst.m_pParentEntity); + ::sg_export(m_iBoarding, dst.m_iBoarding); + ::sg_export(m_bWasBoarding, dst.m_bWasBoarding); + ::sg_export(m_vBoardingVelocity, dst.m_vBoardingVelocity); + ::sg_export(m_fTimeModifier, dst.m_fTimeModifier); + ::sg_export(m_iLeftWingBone, dst.m_iLeftWingBone); + ::sg_export(m_iRightWingBone, dst.m_iRightWingBone); + ::sg_export(m_iExhaustTag, dst.m_iExhaustTag); + ::sg_export(m_iMuzzleTag, dst.m_iMuzzleTag); + ::sg_export(m_iDroidUnitTag, dst.m_iDroidUnitTag); + ::sg_export(m_iGunnerViewTag, dst.m_iGunnerViewTag); + ::sg_export(m_Muzzles, dst.m_Muzzles); + ::sg_export(m_ucmd, dst.m_ucmd); + ::sg_export(m_EjectDir, dst.m_EjectDir); + ::sg_export(m_ulFlags, dst.m_ulFlags); + ::sg_export(m_vOrientation, dst.m_vOrientation); + ::sg_export(m_fStrafeTime, dst.m_fStrafeTime); + ::sg_export(m_vPrevOrientation, dst.m_vPrevOrientation); + ::sg_export(m_vAngularVelocity, dst.m_vAngularVelocity); + ::sg_export(m_vFullAngleVelocity, dst.m_vFullAngleVelocity); + ::sg_export(m_iArmor, dst.m_iArmor); + ::sg_export(m_iShields, dst.m_iShields); + ::sg_export(m_iLastFXTime, dst.m_iLastFXTime); + ::sg_export(m_iDieTime, dst.m_iDieTime); + ::sg_export(m_pVehicleInfo, dst.m_pVehicleInfo); + ::sg_export(m_LandTrace, dst.m_LandTrace); + ::sg_export(m_iRemovedSurfaces, dst.m_iRemovedSurfaces); + ::sg_export(m_iTurboTime, dst.m_iTurboTime); + ::sg_export(m_iDropTime, dst.m_iDropTime); + ::sg_export(m_iSoundDebounceTimer, dst.m_iSoundDebounceTimer); + ::sg_export(lastShieldInc, dst.lastShieldInc); + ::sg_export(linkWeaponToggleHeld, dst.linkWeaponToggleHeld); + ::sg_export(weaponStatus, dst.weaponStatus); + ::sg_export(turretStatus, dst.turretStatus); + ::sg_export(m_pOldPilot, dst.m_pOldPilot); + ::sg_export(m_safeJumpMountTime, dst.m_safeJumpMountTime); + ::sg_export(m_safeJumpMountRightDot, dst.m_safeJumpMountRightDot); +} + +void Vehicle_t::sg_import( + const SgType& src) +{ + ::sg_import(src.m_pPilot, m_pPilot); + ::sg_import(src.m_iPilotTime, m_iPilotTime); + ::sg_import(src.m_bHasHadPilot, m_bHasHadPilot); + ::sg_import(src.m_pDroidUnit, m_pDroidUnit); + ::sg_import(src.m_pParentEntity, m_pParentEntity); + ::sg_import(src.m_iBoarding, m_iBoarding); + ::sg_import(src.m_bWasBoarding, m_bWasBoarding); + ::sg_import(src.m_vBoardingVelocity, m_vBoardingVelocity); + ::sg_import(src.m_fTimeModifier, m_fTimeModifier); + ::sg_import(src.m_iLeftWingBone, m_iLeftWingBone); + ::sg_import(src.m_iRightWingBone, m_iRightWingBone); + ::sg_import(src.m_iExhaustTag, m_iExhaustTag); + ::sg_import(src.m_iMuzzleTag, m_iMuzzleTag); + ::sg_import(src.m_iDroidUnitTag, m_iDroidUnitTag); + ::sg_import(src.m_iGunnerViewTag, m_iGunnerViewTag); + ::sg_import(src.m_Muzzles, m_Muzzles); + ::sg_import(src.m_ucmd, m_ucmd); + ::sg_import(src.m_EjectDir, m_EjectDir); + ::sg_import(src.m_ulFlags, m_ulFlags); + ::sg_import(src.m_vOrientation, m_vOrientation); + ::sg_import(src.m_fStrafeTime, m_fStrafeTime); + ::sg_import(src.m_vPrevOrientation, m_vPrevOrientation); + ::sg_import(src.m_vAngularVelocity, m_vAngularVelocity); + ::sg_import(src.m_vFullAngleVelocity, m_vFullAngleVelocity); + ::sg_import(src.m_iArmor, m_iArmor); + ::sg_import(src.m_iShields, m_iShields); + ::sg_import(src.m_iLastFXTime, m_iLastFXTime); + ::sg_import(src.m_iDieTime, m_iDieTime); + ::sg_import(src.m_pVehicleInfo, m_pVehicleInfo); + ::sg_import(src.m_LandTrace, m_LandTrace); + ::sg_import(src.m_iRemovedSurfaces, m_iRemovedSurfaces); + ::sg_import(src.m_iTurboTime, m_iTurboTime); + ::sg_import(src.m_iDropTime, m_iDropTime); + ::sg_import(src.m_iSoundDebounceTimer, m_iSoundDebounceTimer); + ::sg_import(src.lastShieldInc, lastShieldInc); + ::sg_import(src.linkWeaponToggleHeld, linkWeaponToggleHeld); + ::sg_import(src.weaponStatus, weaponStatus); + ::sg_import(src.turretStatus, turretStatus); + ::sg_import(src.m_pOldPilot, m_pOldPilot); + ::sg_import(src.m_safeJumpMountTime, m_safeJumpMountTime); + ::sg_import(src.m_safeJumpMountRightDot, m_safeJumpMountRightDot); +} + diff --git a/code/game/g_vehicles.h b/code/game/g_vehicles.h index 65f1d1fa7e..85f97e851c 100644 --- a/code/game/g_vehicles.h +++ b/code/game/g_vehicles.h @@ -482,22 +482,10 @@ struct Muzzle void sg_export( - SgType& dst) const - { - ::sg_export(m_vMuzzlePos, dst.m_vMuzzlePos); - ::sg_export(m_vMuzzleDir, dst.m_vMuzzleDir); - ::sg_export(m_iMuzzleWait, dst.m_iMuzzleWait); - ::sg_export(m_bFired, dst.m_bFired); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.m_vMuzzlePos, m_vMuzzlePos); - ::sg_import(src.m_vMuzzleDir, m_vMuzzleDir); - ::sg_import(src.m_iMuzzleWait, m_iMuzzleWait); - ::sg_import(src.m_bFired, m_bFired); - } + const SgType& src); }; //defines for impact damage surface stuff @@ -550,22 +538,10 @@ typedef struct void sg_export( - SgType& dst) const - { - ::sg_export(linked, dst.linked); - ::sg_export(ammo, dst.ammo); - ::sg_export(lastAmmoInc, dst.lastAmmoInc); - ::sg_export(nextMuzzle, dst.nextMuzzle); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.linked, linked); - ::sg_import(src.ammo, ammo); - ::sg_import(src.lastAmmoInc, lastAmmoInc); - ::sg_import(src.nextMuzzle, nextMuzzle); - } + const SgType& src); } vehWeaponStatus_t; #pragma pack(push, 4) @@ -598,24 +574,10 @@ typedef struct void sg_export( - SgType& dst) const - { - ::sg_export(ammo, dst.ammo); - ::sg_export(lastAmmoInc, dst.lastAmmoInc); - ::sg_export(nextMuzzle, dst.nextMuzzle); - ::sg_export(enemyEntNum, dst.enemyEntNum); - ::sg_export(enemyHoldTime, dst.enemyHoldTime); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.ammo, ammo); - ::sg_import(src.lastAmmoInc, lastAmmoInc); - ::sg_import(src.nextMuzzle, nextMuzzle); - ::sg_import(src.enemyEntNum, enemyEntNum); - ::sg_import(src.enemyHoldTime, enemyHoldTime); - } + const SgType& src); } vehTurretStatus_t; // This is the implementation of the vehicle interface and any of the other variables needed. This @@ -786,96 +748,10 @@ struct Vehicle_t void sg_export( - SgType& dst) const - { - ::sg_export(m_pPilot, dst.m_pPilot); - ::sg_export(m_iPilotTime, dst.m_iPilotTime); - ::sg_export(m_bHasHadPilot, dst.m_bHasHadPilot); - ::sg_export(m_pDroidUnit, dst.m_pDroidUnit); - ::sg_export(m_pParentEntity, dst.m_pParentEntity); - ::sg_export(m_iBoarding, dst.m_iBoarding); - ::sg_export(m_bWasBoarding, dst.m_bWasBoarding); - ::sg_export(m_vBoardingVelocity, dst.m_vBoardingVelocity); - ::sg_export(m_fTimeModifier, dst.m_fTimeModifier); - ::sg_export(m_iLeftWingBone, dst.m_iLeftWingBone); - ::sg_export(m_iRightWingBone, dst.m_iRightWingBone); - ::sg_export(m_iExhaustTag, dst.m_iExhaustTag); - ::sg_export(m_iMuzzleTag, dst.m_iMuzzleTag); - ::sg_export(m_iDroidUnitTag, dst.m_iDroidUnitTag); - ::sg_export(m_iGunnerViewTag, dst.m_iGunnerViewTag); - ::sg_export(m_Muzzles, dst.m_Muzzles); - ::sg_export(m_ucmd, dst.m_ucmd); - ::sg_export(m_EjectDir, dst.m_EjectDir); - ::sg_export(m_ulFlags, dst.m_ulFlags); - ::sg_export(m_vOrientation, dst.m_vOrientation); - ::sg_export(m_fStrafeTime, dst.m_fStrafeTime); - ::sg_export(m_vPrevOrientation, dst.m_vPrevOrientation); - ::sg_export(m_vAngularVelocity, dst.m_vAngularVelocity); - ::sg_export(m_vFullAngleVelocity, dst.m_vFullAngleVelocity); - ::sg_export(m_iArmor, dst.m_iArmor); - ::sg_export(m_iShields, dst.m_iShields); - ::sg_export(m_iLastFXTime, dst.m_iLastFXTime); - ::sg_export(m_iDieTime, dst.m_iDieTime); - ::sg_export(m_pVehicleInfo, dst.m_pVehicleInfo); - ::sg_export(m_LandTrace, dst.m_LandTrace); - ::sg_export(m_iRemovedSurfaces, dst.m_iRemovedSurfaces); - ::sg_export(m_iTurboTime, dst.m_iTurboTime); - ::sg_export(m_iDropTime, dst.m_iDropTime); - ::sg_export(m_iSoundDebounceTimer, dst.m_iSoundDebounceTimer); - ::sg_export(lastShieldInc, dst.lastShieldInc); - ::sg_export(linkWeaponToggleHeld, dst.linkWeaponToggleHeld); - ::sg_export(weaponStatus, dst.weaponStatus); - ::sg_export(turretStatus, dst.turretStatus); - ::sg_export(m_pOldPilot, dst.m_pOldPilot); - ::sg_export(m_safeJumpMountTime, dst.m_safeJumpMountTime); - ::sg_export(m_safeJumpMountRightDot, dst.m_safeJumpMountRightDot); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.m_pPilot, m_pPilot); - ::sg_import(src.m_iPilotTime, m_iPilotTime); - ::sg_import(src.m_bHasHadPilot, m_bHasHadPilot); - ::sg_import(src.m_pDroidUnit, m_pDroidUnit); - ::sg_import(src.m_pParentEntity, m_pParentEntity); - ::sg_import(src.m_iBoarding, m_iBoarding); - ::sg_import(src.m_bWasBoarding, m_bWasBoarding); - ::sg_import(src.m_vBoardingVelocity, m_vBoardingVelocity); - ::sg_import(src.m_fTimeModifier, m_fTimeModifier); - ::sg_import(src.m_iLeftWingBone, m_iLeftWingBone); - ::sg_import(src.m_iRightWingBone, m_iRightWingBone); - ::sg_import(src.m_iExhaustTag, m_iExhaustTag); - ::sg_import(src.m_iMuzzleTag, m_iMuzzleTag); - ::sg_import(src.m_iDroidUnitTag, m_iDroidUnitTag); - ::sg_import(src.m_iGunnerViewTag, m_iGunnerViewTag); - ::sg_import(src.m_Muzzles, m_Muzzles); - ::sg_import(src.m_ucmd, m_ucmd); - ::sg_import(src.m_EjectDir, m_EjectDir); - ::sg_import(src.m_ulFlags, m_ulFlags); - ::sg_import(src.m_vOrientation, m_vOrientation); - ::sg_import(src.m_fStrafeTime, m_fStrafeTime); - ::sg_import(src.m_vPrevOrientation, m_vPrevOrientation); - ::sg_import(src.m_vAngularVelocity, m_vAngularVelocity); - ::sg_import(src.m_vFullAngleVelocity, m_vFullAngleVelocity); - ::sg_import(src.m_iArmor, m_iArmor); - ::sg_import(src.m_iShields, m_iShields); - ::sg_import(src.m_iLastFXTime, m_iLastFXTime); - ::sg_import(src.m_iDieTime, m_iDieTime); - ::sg_import(src.m_pVehicleInfo, m_pVehicleInfo); - ::sg_import(src.m_LandTrace, m_LandTrace); - ::sg_import(src.m_iRemovedSurfaces, m_iRemovedSurfaces); - ::sg_import(src.m_iTurboTime, m_iTurboTime); - ::sg_import(src.m_iDropTime, m_iDropTime); - ::sg_import(src.m_iSoundDebounceTimer, m_iSoundDebounceTimer); - ::sg_import(src.lastShieldInc, lastShieldInc); - ::sg_import(src.linkWeaponToggleHeld, linkWeaponToggleHeld); - ::sg_import(src.weaponStatus, weaponStatus); - ::sg_import(src.turretStatus, turretStatus); - ::sg_import(src.m_pOldPilot, m_pOldPilot); - ::sg_import(src.m_safeJumpMountTime, m_safeJumpMountTime); - ::sg_import(src.m_safeJumpMountRightDot, m_safeJumpMountRightDot); - } + const SgType& src); }; extern int BG_VehicleGetIndex( const char *vehicleName ); diff --git a/code/game/ghoul2_shared.h b/code/game/ghoul2_shared.h index b6d0ee5eb8..cdf0e70b87 100644 --- a/code/game/ghoul2_shared.h +++ b/code/game/ghoul2_shared.h @@ -76,26 +76,10 @@ surfaceInfo_t(): void sg_export( - SgType& dst) const - { - ::sg_export(offFlags, dst.offFlags); - ::sg_export(surface, dst.surface); - ::sg_export(genBarycentricJ, dst.genBarycentricJ); - ::sg_export(genBarycentricI, dst.genBarycentricI); - ::sg_export(genPolySurfaceIndex, dst.genPolySurfaceIndex); - ::sg_export(genLod, dst.genLod); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.offFlags, offFlags); - ::sg_import(src.surface, surface); - ::sg_import(src.genBarycentricJ, genBarycentricJ); - ::sg_import(src.genBarycentricI, genBarycentricI); - ::sg_import(src.genPolySurfaceIndex, genPolySurfaceIndex); - ::sg_import(src.genLod, genLod); - } + const SgType& src); }; #define BONE_ANGLES_PREMULT 0x0001 @@ -306,146 +290,10 @@ boneInfo_t(): void sg_export( - SgType& dst) const - { - ::sg_export(boneNumber, dst.boneNumber); - ::sg_export(matrix, dst.matrix); - ::sg_export(flags, dst.flags); - ::sg_export(startFrame, dst.startFrame); - ::sg_export(endFrame, dst.endFrame); - ::sg_export(startTime, dst.startTime); - ::sg_export(pauseTime, dst.pauseTime); - ::sg_export(animSpeed, dst.animSpeed); - ::sg_export(blendFrame, dst.blendFrame); - ::sg_export(blendLerpFrame, dst.blendLerpFrame); - ::sg_export(blendTime, dst.blendTime); - ::sg_export(blendStart, dst.blendStart); - ::sg_export(boneBlendTime, dst.boneBlendTime); - ::sg_export(boneBlendStart, dst.boneBlendStart); - ::sg_export(newMatrix, dst.newMatrix); - ::sg_export(lastTimeUpdated, dst.lastTimeUpdated); - ::sg_export(lastContents, dst.lastContents); - ::sg_export(lastPosition, dst.lastPosition); - ::sg_export(velocityEffector, dst.velocityEffector); - ::sg_export(lastAngles, dst.lastAngles); - ::sg_export(minAngles, dst.minAngles); - ::sg_export(maxAngles, dst.maxAngles); - ::sg_export(currentAngles, dst.currentAngles); - ::sg_export(anglesOffset, dst.anglesOffset); - ::sg_export(positionOffset, dst.positionOffset); - ::sg_export(radius, dst.radius); - ::sg_export(weight, dst.weight); - ::sg_export(ragIndex, dst.ragIndex); - ::sg_export(velocityRoot, dst.velocityRoot); - ::sg_export(ragStartTime, dst.ragStartTime); - ::sg_export(firstTime, dst.firstTime); - ::sg_export(firstCollisionTime, dst.firstCollisionTime); - ::sg_export(restTime, dst.restTime); - ::sg_export(RagFlags, dst.RagFlags); - ::sg_export(DependentRagIndexMask, dst.DependentRagIndexMask); - ::sg_export(originalTrueBoneMatrix, dst.originalTrueBoneMatrix); - ::sg_export(parentTrueBoneMatrix, dst.parentTrueBoneMatrix); - ::sg_export(parentOriginalTrueBoneMatrix, dst.parentOriginalTrueBoneMatrix); - ::sg_export(originalOrigin, dst.originalOrigin); - ::sg_export(originalAngles, dst.originalAngles); - ::sg_export(lastShotDir, dst.lastShotDir); - ::sg_export(basepose, dst.basepose); - ::sg_export(baseposeInv, dst.baseposeInv); - ::sg_export(baseposeParent, dst.baseposeParent); - ::sg_export(baseposeInvParent, dst.baseposeInvParent); - ::sg_export(parentRawBoneIndex, dst.parentRawBoneIndex); - ::sg_export(ragOverrideMatrix, dst.ragOverrideMatrix); - ::sg_export(extraMatrix, dst.extraMatrix); - ::sg_export(extraVec1, dst.extraVec1); - ::sg_export(extraFloat1, dst.extraFloat1); - ::sg_export(extraInt1, dst.extraInt1); - ::sg_export(ikPosition, dst.ikPosition); - ::sg_export(ikSpeed, dst.ikSpeed); - ::sg_export(epVelocity, dst.epVelocity); - ::sg_export(epGravFactor, dst.epGravFactor); - ::sg_export(solidCount, dst.solidCount); - ::sg_export(physicsSettled, dst.physicsSettled); - ::sg_export(snapped, dst.snapped); - ::sg_export(parentBoneIndex, dst.parentBoneIndex); - ::sg_export(offsetRotation, dst.offsetRotation); - ::sg_export(overGradSpeed, dst.overGradSpeed); - ::sg_export(overGoalSpot, dst.overGoalSpot); - ::sg_export(hasOverGoal, dst.hasOverGoal); - ::sg_export(animFrameMatrix, dst.animFrameMatrix); - ::sg_export(hasAnimFrameMatrix, dst.hasAnimFrameMatrix); - ::sg_export(airTime, dst.airTime); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.boneNumber, boneNumber); - ::sg_import(src.matrix, matrix); - ::sg_import(src.flags, flags); - ::sg_import(src.startFrame, startFrame); - ::sg_import(src.endFrame, endFrame); - ::sg_import(src.startTime, startTime); - ::sg_import(src.pauseTime, pauseTime); - ::sg_import(src.animSpeed, animSpeed); - ::sg_import(src.blendFrame, blendFrame); - ::sg_import(src.blendLerpFrame, blendLerpFrame); - ::sg_import(src.blendTime, blendTime); - ::sg_import(src.blendStart, blendStart); - ::sg_import(src.boneBlendTime, boneBlendTime); - ::sg_import(src.boneBlendStart, boneBlendStart); - ::sg_import(src.newMatrix, newMatrix); - ::sg_import(src.lastTimeUpdated, lastTimeUpdated); - ::sg_import(src.lastContents, lastContents); - ::sg_import(src.lastPosition, lastPosition); - ::sg_import(src.velocityEffector, velocityEffector); - ::sg_import(src.lastAngles, lastAngles); - ::sg_import(src.minAngles, minAngles); - ::sg_import(src.maxAngles, maxAngles); - ::sg_import(src.currentAngles, currentAngles); - ::sg_import(src.anglesOffset, anglesOffset); - ::sg_import(src.positionOffset, positionOffset); - ::sg_import(src.radius, radius); - ::sg_import(src.weight, weight); - ::sg_import(src.ragIndex, ragIndex); - ::sg_import(src.velocityRoot, velocityRoot); - ::sg_import(src.ragStartTime, ragStartTime); - ::sg_import(src.firstTime, firstTime); - ::sg_import(src.firstCollisionTime, firstCollisionTime); - ::sg_import(src.restTime, restTime); - ::sg_import(src.RagFlags, RagFlags); - ::sg_import(src.DependentRagIndexMask, DependentRagIndexMask); - ::sg_import(src.originalTrueBoneMatrix, originalTrueBoneMatrix); - ::sg_import(src.parentTrueBoneMatrix, parentTrueBoneMatrix); - ::sg_import(src.parentOriginalTrueBoneMatrix, parentOriginalTrueBoneMatrix); - ::sg_import(src.originalOrigin, originalOrigin); - ::sg_import(src.originalAngles, originalAngles); - ::sg_import(src.lastShotDir, lastShotDir); - ::sg_import(src.basepose, basepose); - ::sg_import(src.baseposeInv, baseposeInv); - ::sg_import(src.baseposeParent, baseposeParent); - ::sg_import(src.baseposeInvParent, baseposeInvParent); - ::sg_import(src.parentRawBoneIndex, parentRawBoneIndex); - ::sg_import(src.ragOverrideMatrix, ragOverrideMatrix); - ::sg_import(src.extraMatrix, extraMatrix); - ::sg_import(src.extraVec1, extraVec1); - ::sg_import(src.extraFloat1, extraFloat1); - ::sg_import(src.extraInt1, extraInt1); - ::sg_import(src.ikPosition, ikPosition); - ::sg_import(src.ikSpeed, ikSpeed); - ::sg_import(src.epVelocity, epVelocity); - ::sg_import(src.epGravFactor, epGravFactor); - ::sg_import(src.solidCount, solidCount); - ::sg_import(src.physicsSettled, physicsSettled); - ::sg_import(src.snapped, snapped); - ::sg_import(src.parentBoneIndex, parentBoneIndex); - ::sg_import(src.offsetRotation, offsetRotation); - ::sg_import(src.overGradSpeed, overGradSpeed); - ::sg_import(src.overGoalSpot, overGoalSpot); - ::sg_import(src.hasOverGoal, hasOverGoal); - ::sg_import(src.animFrameMatrix, animFrameMatrix); - ::sg_import(src.hasAnimFrameMatrix, hasAnimFrameMatrix); - ::sg_import(src.airTime, airTime); - } + const SgType& src); }; //we save from top to boltUsed here. Don't bother saving the position, it gets rebuilt every frame anyway #pragma pack(push, 4) @@ -476,22 +324,10 @@ struct boltInfo_t{ void sg_export( - SgType& dst) const - { - ::sg_export(boneNumber, dst.boneNumber); - ::sg_export(surfaceNumber, dst.surfaceNumber); - ::sg_export(surfaceType, dst.surfaceType); - ::sg_export(boltUsed, dst.boltUsed); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.boneNumber, boneNumber); - ::sg_import(src.surfaceNumber, surfaceNumber); - ::sg_import(src.surfaceType, surfaceType); - ::sg_import(src.boltUsed, boltUsed); - } + const SgType& src); }; @@ -635,48 +471,10 @@ class CGhoul2Info void sg_export( - SgType& dst) const - { - ::sg_export(mModelindex, dst.mModelindex); - ::sg_export(animModelIndexOffset, dst.animModelIndexOffset); - ::sg_export(mCustomShader, dst.mCustomShader); - ::sg_export(mCustomSkin, dst.mCustomSkin); - ::sg_export(mModelBoltLink, dst.mModelBoltLink); - ::sg_export(mSurfaceRoot, dst.mSurfaceRoot); - ::sg_export(mLodBias, dst.mLodBias); - ::sg_export(mNewOrigin, dst.mNewOrigin); -#ifdef _G2_GORE - ::sg_export(mGoreSetTag, dst.mGoreSetTag); -#endif - ::sg_export(mModel, dst.mModel); - ::sg_export(mFileName, dst.mFileName); - ::sg_export(mAnimFrameDefault, dst.mAnimFrameDefault); - ::sg_export(mSkelFrameNum, dst.mSkelFrameNum); - ::sg_export(mMeshFrameNum, dst.mMeshFrameNum); - ::sg_export(mFlags, dst.mFlags); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.mModelindex, mModelindex); - ::sg_import(src.animModelIndexOffset, animModelIndexOffset); - ::sg_import(src.mCustomShader, mCustomShader); - ::sg_import(src.mCustomSkin, mCustomSkin); - ::sg_import(src.mModelBoltLink, mModelBoltLink); - ::sg_import(src.mSurfaceRoot, mSurfaceRoot); - ::sg_import(src.mLodBias, mLodBias); - ::sg_import(src.mNewOrigin, mNewOrigin); -#ifdef _G2_GORE - ::sg_import(src.mGoreSetTag, mGoreSetTag); -#endif - ::sg_import(src.mModel, mModel); - ::sg_import(src.mFileName, mFileName); - ::sg_import(src.mAnimFrameDefault, mAnimFrameDefault); - ::sg_import(src.mSkelFrameNum, mSkelFrameNum); - ::sg_import(src.mMeshFrameNum, mMeshFrameNum); - ::sg_import(src.mFlags, mFlags); - } + const SgType& src); }; class CGhoul2Info_v; @@ -841,16 +639,10 @@ class CGhoul2Info_v void sg_export( - SgType& dst) const - { - ::sg_export(mItem, dst.mItem); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.mItem, mItem); - } + const SgType& src); }; diff --git a/code/qcommon/q_shared.cpp b/code/qcommon/q_shared.cpp index 134f3363e2..9cba502265 100644 --- a/code/qcommon/q_shared.cpp +++ b/code/qcommon/q_shared.cpp @@ -25,6 +25,8 @@ along with this program; if not, see . // q_shared.c -- stateless support routines that are included in each code dll #include "../game/common_headers.h" +#include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_saved_game.h" int Com_Clampi( int min, int max, int value ) { @@ -1611,5 +1613,778 @@ const char *GetStringForID( const stringID_table_t *table, int id ) return NULL; } + +void cplane_t::sg_export( + SgType& dst) const +{ + ::sg_export(normal, dst.normal); + ::sg_export(dist, dst.dist); + ::sg_export(type, dst.type); + ::sg_export(signbits, dst.signbits); + ::sg_export(pad, dst.pad); +} + +void cplane_t::sg_import( + const SgType& src) +{ + ::sg_import(src.normal, normal); + ::sg_import(src.dist, dist); + ::sg_import(src.type, type); + ::sg_import(src.signbits, signbits); + ::sg_import(src.pad, pad); +} + + +void trace_t::sg_export( + SgType& dst) const +{ + ::sg_export(allsolid, dst.allsolid); + ::sg_export(startsolid, dst.startsolid); + ::sg_export(fraction, dst.fraction); + ::sg_export(endpos, dst.endpos); + ::sg_export(plane, dst.plane); + ::sg_export(surfaceFlags, dst.surfaceFlags); + ::sg_export(contents, dst.contents); + ::sg_export(entityNum, dst.entityNum); + ::sg_export(G2CollisionMap, dst.G2CollisionMap); +} + +void trace_t::sg_import( + const SgType& src) +{ + ::sg_import(src.allsolid, allsolid); + ::sg_import(src.startsolid, startsolid); + ::sg_import(src.fraction, fraction); + ::sg_import(src.endpos, endpos); + ::sg_import(src.plane, plane); + ::sg_import(src.surfaceFlags, surfaceFlags); + ::sg_import(src.contents, contents); + ::sg_import(src.entityNum, entityNum); + ::sg_import(src.G2CollisionMap, G2CollisionMap); +} + + +void saberTrail_t::sg_export( + SgType& dst) const +{ + ::sg_export(inAction, dst.inAction); + ::sg_export(duration, dst.duration); + ::sg_export(lastTime, dst.lastTime); + ::sg_export(base, dst.base); + ::sg_export(tip, dst.tip); + ::sg_export(haveOldPos, dst.haveOldPos); + ::sg_export(oldPos, dst.oldPos); + ::sg_export(oldNormal, dst.oldNormal); +} + +void saberTrail_t::sg_import( + const SgType& src) +{ + ::sg_import(src.inAction, inAction); + ::sg_import(src.duration, duration); + ::sg_import(src.lastTime, lastTime); + ::sg_import(src.base, base); + ::sg_import(src.tip, tip); + ::sg_import(src.haveOldPos, haveOldPos); + ::sg_import(src.oldPos, oldPos); + ::sg_import(src.oldNormal, oldNormal); +} + + +void bladeInfo_t::sg_export( + SgType& dst) const +{ + ::sg_export(active, dst.active); + ::sg_export(color, dst.color); + ::sg_export(radius, dst.radius); + ::sg_export(length, dst.length); + ::sg_export(lengthMax, dst.lengthMax); + ::sg_export(lengthOld, dst.lengthOld); + ::sg_export(muzzlePoint, dst.muzzlePoint); + ::sg_export(muzzlePointOld, dst.muzzlePointOld); + ::sg_export(muzzleDir, dst.muzzleDir); + ::sg_export(muzzleDirOld, dst.muzzleDirOld); + ::sg_export(trail, dst.trail); +} + +void bladeInfo_t::sg_import( + const SgType& src) +{ + ::sg_import(src.active, active); + ::sg_import(src.color, color); + ::sg_import(src.radius, radius); + ::sg_import(src.length, length); + ::sg_import(src.lengthMax, lengthMax); + ::sg_import(src.lengthOld, lengthOld); + ::sg_import(src.muzzlePoint, muzzlePoint); + ::sg_import(src.muzzlePointOld, muzzlePointOld); + ::sg_import(src.muzzleDir, muzzleDir); + ::sg_import(src.muzzleDirOld, muzzleDirOld); + ::sg_import(src.trail, trail); +} + + +void saberInfo_t::sg_export( + SgType& dst) const +{ + ::sg_export(name, dst.name); + ::sg_export(fullName, dst.fullName); + ::sg_export(type, dst.type); + ::sg_export(model, dst.model); + ::sg_export(skin, dst.skin); + ::sg_export(soundOn, dst.soundOn); + ::sg_export(soundLoop, dst.soundLoop); + ::sg_export(soundOff, dst.soundOff); + ::sg_export(numBlades, dst.numBlades); + ::sg_export(blade, dst.blade); + ::sg_export(stylesLearned, dst.stylesLearned); + ::sg_export(stylesForbidden, dst.stylesForbidden); + ::sg_export(maxChain, dst.maxChain); + ::sg_export(forceRestrictions, dst.forceRestrictions); + ::sg_export(lockBonus, dst.lockBonus); + ::sg_export(parryBonus, dst.parryBonus); + ::sg_export(breakParryBonus, dst.breakParryBonus); + ::sg_export(breakParryBonus2, dst.breakParryBonus2); + ::sg_export(disarmBonus, dst.disarmBonus); + ::sg_export(disarmBonus2, dst.disarmBonus2); + ::sg_export(singleBladeStyle, dst.singleBladeStyle); + ::sg_export(brokenSaber1, dst.brokenSaber1); + ::sg_export(brokenSaber2, dst.brokenSaber2); + ::sg_export(saberFlags, dst.saberFlags); + ::sg_export(saberFlags2, dst.saberFlags2); + ::sg_export(spinSound, dst.spinSound); + ::sg_export(swingSound, dst.swingSound); + ::sg_export(fallSound, dst.fallSound); + ::sg_export(moveSpeedScale, dst.moveSpeedScale); + ::sg_export(animSpeedScale, dst.animSpeedScale); + ::sg_export(kataMove, dst.kataMove); + ::sg_export(lungeAtkMove, dst.lungeAtkMove); + ::sg_export(jumpAtkUpMove, dst.jumpAtkUpMove); + ::sg_export(jumpAtkFwdMove, dst.jumpAtkFwdMove); + ::sg_export(jumpAtkBackMove, dst.jumpAtkBackMove); + ::sg_export(jumpAtkRightMove, dst.jumpAtkRightMove); + ::sg_export(jumpAtkLeftMove, dst.jumpAtkLeftMove); + ::sg_export(readyAnim, dst.readyAnim); + ::sg_export(drawAnim, dst.drawAnim); + ::sg_export(putawayAnim, dst.putawayAnim); + ::sg_export(tauntAnim, dst.tauntAnim); + ::sg_export(bowAnim, dst.bowAnim); + ::sg_export(meditateAnim, dst.meditateAnim); + ::sg_export(flourishAnim, dst.flourishAnim); + ::sg_export(gloatAnim, dst.gloatAnim); + ::sg_export(bladeStyle2Start, dst.bladeStyle2Start); + ::sg_export(trailStyle, dst.trailStyle); + ::sg_export(g2MarksShader, dst.g2MarksShader); + ::sg_export(g2WeaponMarkShader, dst.g2WeaponMarkShader); + ::sg_export(hitSound, dst.hitSound); + ::sg_export(blockSound, dst.blockSound); + ::sg_export(bounceSound, dst.bounceSound); + ::sg_export(blockEffect, dst.blockEffect); + ::sg_export(hitPersonEffect, dst.hitPersonEffect); + ::sg_export(hitOtherEffect, dst.hitOtherEffect); + ::sg_export(bladeEffect, dst.bladeEffect); + ::sg_export(knockbackScale, dst.knockbackScale); + ::sg_export(damageScale, dst.damageScale); + ::sg_export(splashRadius, dst.splashRadius); + ::sg_export(splashDamage, dst.splashDamage); + ::sg_export(splashKnockback, dst.splashKnockback); + ::sg_export(trailStyle2, dst.trailStyle2); + ::sg_export(g2MarksShader2, dst.g2MarksShader2); + ::sg_export(g2WeaponMarkShader2, dst.g2WeaponMarkShader2); + ::sg_export(hit2Sound, dst.hit2Sound); + ::sg_export(block2Sound, dst.block2Sound); + ::sg_export(bounce2Sound, dst.bounce2Sound); + ::sg_export(blockEffect2, dst.blockEffect2); + ::sg_export(hitPersonEffect2, dst.hitPersonEffect2); + ::sg_export(hitOtherEffect2, dst.hitOtherEffect2); + ::sg_export(bladeEffect2, dst.bladeEffect2); + ::sg_export(knockbackScale2, dst.knockbackScale2); + ::sg_export(damageScale2, dst.damageScale2); + ::sg_export(splashRadius2, dst.splashRadius2); + ::sg_export(splashDamage2, dst.splashDamage2); + ::sg_export(splashKnockback2, dst.splashKnockback2); +} + +void saberInfo_t::sg_import( + const SgType& src) +{ + ::sg_import(src.name, name); + ::sg_import(src.fullName, fullName); + ::sg_import(src.type, type); + ::sg_import(src.model, model); + ::sg_import(src.skin, skin); + ::sg_import(src.soundOn, soundOn); + ::sg_import(src.soundLoop, soundLoop); + ::sg_import(src.soundOff, soundOff); + ::sg_import(src.numBlades, numBlades); + ::sg_import(src.blade, blade); + ::sg_import(src.stylesLearned, stylesLearned); + ::sg_import(src.stylesForbidden, stylesForbidden); + ::sg_import(src.maxChain, maxChain); + ::sg_import(src.forceRestrictions, forceRestrictions); + ::sg_import(src.lockBonus, lockBonus); + ::sg_import(src.parryBonus, parryBonus); + ::sg_import(src.breakParryBonus, breakParryBonus); + ::sg_import(src.breakParryBonus2, breakParryBonus2); + ::sg_import(src.disarmBonus, disarmBonus); + ::sg_import(src.disarmBonus2, disarmBonus2); + ::sg_import(src.singleBladeStyle, singleBladeStyle); + ::sg_import(src.brokenSaber1, brokenSaber1); + ::sg_import(src.brokenSaber2, brokenSaber2); + ::sg_import(src.saberFlags, saberFlags); + ::sg_import(src.saberFlags2, saberFlags2); + ::sg_import(src.spinSound, spinSound); + ::sg_import(src.swingSound, swingSound); + ::sg_import(src.fallSound, fallSound); + ::sg_import(src.moveSpeedScale, moveSpeedScale); + ::sg_import(src.animSpeedScale, animSpeedScale); + ::sg_import(src.kataMove, kataMove); + ::sg_import(src.lungeAtkMove, lungeAtkMove); + ::sg_import(src.jumpAtkUpMove, jumpAtkUpMove); + ::sg_import(src.jumpAtkFwdMove, jumpAtkFwdMove); + ::sg_import(src.jumpAtkBackMove, jumpAtkBackMove); + ::sg_import(src.jumpAtkRightMove, jumpAtkRightMove); + ::sg_import(src.jumpAtkLeftMove, jumpAtkLeftMove); + ::sg_import(src.readyAnim, readyAnim); + ::sg_import(src.drawAnim, drawAnim); + ::sg_import(src.putawayAnim, putawayAnim); + ::sg_import(src.tauntAnim, tauntAnim); + ::sg_import(src.bowAnim, bowAnim); + ::sg_import(src.meditateAnim, meditateAnim); + ::sg_import(src.flourishAnim, flourishAnim); + ::sg_import(src.gloatAnim, gloatAnim); + ::sg_import(src.bladeStyle2Start, bladeStyle2Start); + ::sg_import(src.trailStyle, trailStyle); + ::sg_import(src.g2MarksShader, g2MarksShader); + ::sg_import(src.g2WeaponMarkShader, g2WeaponMarkShader); + ::sg_import(src.hitSound, hitSound); + ::sg_import(src.blockSound, blockSound); + ::sg_import(src.bounceSound, bounceSound); + ::sg_import(src.blockEffect, blockEffect); + ::sg_import(src.hitPersonEffect, hitPersonEffect); + ::sg_import(src.hitOtherEffect, hitOtherEffect); + ::sg_import(src.bladeEffect, bladeEffect); + ::sg_import(src.knockbackScale, knockbackScale); + ::sg_import(src.damageScale, damageScale); + ::sg_import(src.splashRadius, splashRadius); + ::sg_import(src.splashDamage, splashDamage); + ::sg_import(src.splashKnockback, splashKnockback); + ::sg_import(src.trailStyle2, trailStyle2); + ::sg_import(src.g2MarksShader2, g2MarksShader2); + ::sg_import(src.g2WeaponMarkShader2, g2WeaponMarkShader2); + ::sg_import(src.hit2Sound, hit2Sound); + ::sg_import(src.block2Sound, block2Sound); + ::sg_import(src.bounce2Sound, bounce2Sound); + ::sg_import(src.blockEffect2, blockEffect2); + ::sg_import(src.hitPersonEffect2, hitPersonEffect2); + ::sg_import(src.hitOtherEffect2, hitOtherEffect2); + ::sg_import(src.bladeEffect2, bladeEffect2); + ::sg_import(src.knockbackScale2, knockbackScale2); + ::sg_import(src.damageScale2, damageScale2); + ::sg_import(src.splashRadius2, splashRadius2); + ::sg_import(src.splashDamage2, splashDamage2); + ::sg_import(src.splashKnockback2, splashKnockback2); +} + + +void saberInfoRetail_t::sg_export( + SgType& dst) const +{ + ::sg_export(name, dst.name); + ::sg_export(fullName, dst.fullName); + ::sg_export(type, dst.type); + ::sg_export(model, dst.model); + ::sg_export(skin, dst.skin); + ::sg_export(soundOn, dst.soundOn); + ::sg_export(soundLoop, dst.soundLoop); + ::sg_export(soundOff, dst.soundOff); + ::sg_export(numBlades, dst.numBlades); + ::sg_export(blade, dst.blade); + ::sg_export(style, dst.style); + ::sg_export(maxChain, dst.maxChain); + ::sg_export(lockable, dst.lockable); + ::sg_export(throwable, dst.throwable); + ::sg_export(disarmable, dst.disarmable); + ::sg_export(activeBlocking, dst.activeBlocking); + ::sg_export(twoHanded, dst.twoHanded); + ::sg_export(forceRestrictions, dst.forceRestrictions); + ::sg_export(lockBonus, dst.lockBonus); + ::sg_export(parryBonus, dst.parryBonus); + ::sg_export(breakParryBonus, dst.breakParryBonus); + ::sg_export(disarmBonus, dst.disarmBonus); + ::sg_export(singleBladeStyle, dst.singleBladeStyle); + ::sg_export(singleBladeThrowable, dst.singleBladeThrowable); + ::sg_export(brokenSaber1, dst.brokenSaber1); + ::sg_export(brokenSaber2, dst.brokenSaber2); + ::sg_export(returnDamage, dst.returnDamage); +} + +void saberInfoRetail_t::sg_import( + SgType& src) +{ + ::sg_import(src.name, name); + ::sg_import(src.fullName, fullName); + ::sg_import(src.type, type); + ::sg_import(src.model, model); + ::sg_import(src.skin, skin); + ::sg_import(src.soundOn, soundOn); + ::sg_import(src.soundLoop, soundLoop); + ::sg_import(src.soundOff, soundOff); + ::sg_import(src.numBlades, numBlades); + ::sg_import(src.blade, blade); + ::sg_import(src.style, style); + ::sg_import(src.maxChain, maxChain); + ::sg_import(src.lockable, lockable); + ::sg_import(src.throwable, throwable); + ::sg_import(src.disarmable, disarmable); + ::sg_import(src.activeBlocking, activeBlocking); + ::sg_import(src.twoHanded, twoHanded); + ::sg_import(src.forceRestrictions, forceRestrictions); + ::sg_import(src.lockBonus, lockBonus); + ::sg_import(src.parryBonus, parryBonus); + ::sg_import(src.breakParryBonus, breakParryBonus); + ::sg_import(src.disarmBonus, disarmBonus); + ::sg_import(src.singleBladeStyle, singleBladeStyle); + ::sg_import(src.singleBladeThrowable, singleBladeThrowable); + ::sg_import(src.brokenSaber1, brokenSaber1); + ::sg_import(src.brokenSaber2, brokenSaber2); + ::sg_import(src.returnDamage, returnDamage); +} + + +void playerState_t::sg_export( + SgType& dst) const +{ + ::sg_export(commandTime, dst.commandTime); + ::sg_export(pm_type, dst.pm_type); + ::sg_export(bobCycle, dst.bobCycle); + ::sg_export(pm_flags, dst.pm_flags); + ::sg_export(pm_time, dst.pm_time); + ::sg_export(origin, dst.origin); + ::sg_export(velocity, dst.velocity); + ::sg_export(weaponTime, dst.weaponTime); + ::sg_export(weaponChargeTime, dst.weaponChargeTime); + ::sg_export(rechargeTime, dst.rechargeTime); + ::sg_export(gravity, dst.gravity); + ::sg_export(leanofs, dst.leanofs); + ::sg_export(friction, dst.friction); + ::sg_export(speed, dst.speed); + ::sg_export(delta_angles, dst.delta_angles); + ::sg_export(groundEntityNum, dst.groundEntityNum); + ::sg_export(legsAnim, dst.legsAnim); + ::sg_export(legsAnimTimer, dst.legsAnimTimer); + ::sg_export(torsoAnim, dst.torsoAnim); + ::sg_export(torsoAnimTimer, dst.torsoAnimTimer); + ::sg_export(movementDir, dst.movementDir); + ::sg_export(eFlags, dst.eFlags); + ::sg_export(eventSequence, dst.eventSequence); + ::sg_export(events, dst.events); + ::sg_export(eventParms, dst.eventParms); + ::sg_export(externalEvent, dst.externalEvent); + ::sg_export(externalEventParm, dst.externalEventParm); + ::sg_export(externalEventTime, dst.externalEventTime); + ::sg_export(clientNum, dst.clientNum); + ::sg_export(weapon, dst.weapon); + ::sg_export(weaponstate, dst.weaponstate); + ::sg_export(batteryCharge, dst.batteryCharge); + ::sg_export(viewangles, dst.viewangles); + ::sg_export(legsYaw, dst.legsYaw); + ::sg_export(viewheight, dst.viewheight); + ::sg_export(damageEvent, dst.damageEvent); + ::sg_export(damageYaw, dst.damageYaw); + ::sg_export(damagePitch, dst.damagePitch); + ::sg_export(damageCount, dst.damageCount); + ::sg_export(stats, dst.stats); + ::sg_export(persistant, dst.persistant); + ::sg_export(powerups, dst.powerups); + ::sg_export(ammo, dst.ammo); + ::sg_export(inventory, dst.inventory); + ::sg_export(security_key_message, dst.security_key_message); + ::sg_export(serverViewOrg, dst.serverViewOrg); + ::sg_export(saberInFlight, dst.saberInFlight); + +#ifdef JK2_MODE + ::sg_export(saberActive, dst.saberActive); + ::sg_export(vehicleModel, dst.vehicleModel); + ::sg_export(viewEntity, dst.viewEntity); + ::sg_export(saberColor, dst.saberColor); + ::sg_export(saberLength, dst.saberLength); + ::sg_export(saberLengthMax, dst.saberLengthMax); + ::sg_export(forcePowersActive, dst.forcePowersActive); +#else + ::sg_export(viewEntity, dst.viewEntity); + ::sg_export(forcePowersActive, dst.forcePowersActive); +#endif + + ::sg_export(useTime, dst.useTime); + ::sg_export(lastShotTime, dst.lastShotTime); + ::sg_export(ping, dst.ping); + ::sg_export(lastOnGround, dst.lastOnGround); + ::sg_export(lastStationary, dst.lastStationary); + ::sg_export(weaponShotCount, dst.weaponShotCount); + ::sg_export(saber, dst.saber); + ::sg_export(dualSabers, dst.dualSabers); + ::sg_export(saberMove, dst.saberMove); + ::sg_export(saberMoveNext, dst.saberMoveNext); + ::sg_export(saberBounceMove, dst.saberBounceMove); + ::sg_export(saberBlocking, dst.saberBlocking); + ::sg_export(saberBlocked, dst.saberBlocked); + ::sg_export(leanStopDebounceTime, dst.leanStopDebounceTime); + +#ifdef JK2_MODE + ::sg_export(saberLengthOld, dst.saberLengthOld); +#endif + + ::sg_export(saberEntityNum, dst.saberEntityNum); + ::sg_export(saberEntityDist, dst.saberEntityDist); + ::sg_export(saberThrowTime, dst.saberThrowTime); + ::sg_export(saberEntityState, dst.saberEntityState); + ::sg_export(saberDamageDebounceTime, dst.saberDamageDebounceTime); + ::sg_export(saberHitWallSoundDebounceTime, dst.saberHitWallSoundDebounceTime); + ::sg_export(saberEventFlags, dst.saberEventFlags); + ::sg_export(saberBlockingTime, dst.saberBlockingTime); + ::sg_export(saberAnimLevel, dst.saberAnimLevel); + ::sg_export(saberAttackChainCount, dst.saberAttackChainCount); + ::sg_export(saberLockTime, dst.saberLockTime); + ::sg_export(saberLockEnemy, dst.saberLockEnemy); + ::sg_export(saberStylesKnown, dst.saberStylesKnown); + +#ifdef JK2_MODE + ::sg_export(saberModel, dst.saberModel); +#endif + + ::sg_export(forcePowersKnown, dst.forcePowersKnown); + ::sg_export(forcePowerDuration, dst.forcePowerDuration); + ::sg_export(forcePowerDebounce, dst.forcePowerDebounce); + ::sg_export(forcePower, dst.forcePower); + ::sg_export(forcePowerMax, dst.forcePowerMax); + ::sg_export(forcePowerRegenDebounceTime, dst.forcePowerRegenDebounceTime); + ::sg_export(forcePowerRegenRate, dst.forcePowerRegenRate); + ::sg_export(forcePowerRegenAmount, dst.forcePowerRegenAmount); + ::sg_export(forcePowerLevel, dst.forcePowerLevel); + ::sg_export(forceJumpZStart, dst.forceJumpZStart); + ::sg_export(forceJumpCharge, dst.forceJumpCharge); + ::sg_export(forceGripEntityNum, dst.forceGripEntityNum); + ::sg_export(forceGripOrg, dst.forceGripOrg); + ::sg_export(forceDrainEntityNum, dst.forceDrainEntityNum); + ::sg_export(forceDrainOrg, dst.forceDrainOrg); + ::sg_export(forceHealCount, dst.forceHealCount); + ::sg_export(forceAllowDeactivateTime, dst.forceAllowDeactivateTime); + ::sg_export(forceRageDrainTime, dst.forceRageDrainTime); + ::sg_export(forceRageRecoveryTime, dst.forceRageRecoveryTime); + ::sg_export(forceDrainEntNum, dst.forceDrainEntNum); + ::sg_export(forceDrainTime, dst.forceDrainTime); + ::sg_export(forcePowersForced, dst.forcePowersForced); + ::sg_export(pullAttackEntNum, dst.pullAttackEntNum); + ::sg_export(pullAttackTime, dst.pullAttackTime); + ::sg_export(lastKickedEntNum, dst.lastKickedEntNum); + ::sg_export(taunting, dst.taunting); + ::sg_export(jumpZStart, dst.jumpZStart); + ::sg_export(moveDir, dst.moveDir); + ::sg_export(waterheight, dst.waterheight); + ::sg_export(waterHeightLevel, dst.waterHeightLevel); + ::sg_export(ikStatus, dst.ikStatus); + ::sg_export(heldClient, dst.heldClient); + ::sg_export(heldByClient, dst.heldByClient); + ::sg_export(heldByBolt, dst.heldByBolt); + ::sg_export(heldByBone, dst.heldByBone); + ::sg_export(vehTurnaroundIndex, dst.vehTurnaroundIndex); + ::sg_export(vehTurnaroundTime, dst.vehTurnaroundTime); + ::sg_export(brokenLimbs, dst.brokenLimbs); + ::sg_export(electrifyTime, dst.electrifyTime); +} + +void playerState_t::sg_import( + const SgType& src) +{ + ::sg_import(src.commandTime, commandTime); + ::sg_import(src.pm_type, pm_type); + ::sg_import(src.bobCycle, bobCycle); + ::sg_import(src.pm_flags, pm_flags); + ::sg_import(src.pm_time, pm_time); + ::sg_import(src.origin, origin); + ::sg_import(src.velocity, velocity); + ::sg_import(src.weaponTime, weaponTime); + ::sg_import(src.weaponChargeTime, weaponChargeTime); + ::sg_import(src.rechargeTime, rechargeTime); + ::sg_import(src.gravity, gravity); + ::sg_import(src.leanofs, leanofs); + ::sg_import(src.friction, friction); + ::sg_import(src.speed, speed); + ::sg_import(src.delta_angles, delta_angles); + ::sg_import(src.groundEntityNum, groundEntityNum); + ::sg_import(src.legsAnim, legsAnim); + ::sg_import(src.legsAnimTimer, legsAnimTimer); + ::sg_import(src.torsoAnim, torsoAnim); + ::sg_import(src.torsoAnimTimer, torsoAnimTimer); + ::sg_import(src.movementDir, movementDir); + ::sg_import(src.eFlags, eFlags); + ::sg_import(src.eventSequence, eventSequence); + ::sg_import(src.events, events); + ::sg_import(src.eventParms, eventParms); + ::sg_import(src.externalEvent, externalEvent); + ::sg_import(src.externalEventParm, externalEventParm); + ::sg_import(src.externalEventTime, externalEventTime); + ::sg_import(src.clientNum, clientNum); + ::sg_import(src.weapon, weapon); + ::sg_import(src.weaponstate, weaponstate); + ::sg_import(src.batteryCharge, batteryCharge); + ::sg_import(src.viewangles, viewangles); + ::sg_import(src.legsYaw, legsYaw); + ::sg_import(src.viewheight, viewheight); + ::sg_import(src.damageEvent, damageEvent); + ::sg_import(src.damageYaw, damageYaw); + ::sg_import(src.damagePitch, damagePitch); + ::sg_import(src.damageCount, damageCount); + ::sg_import(src.stats, stats); + ::sg_import(src.persistant, persistant); + ::sg_import(src.powerups, powerups); + ::sg_import(src.ammo, ammo); + ::sg_import(src.inventory, inventory); + ::sg_import(src.security_key_message, security_key_message); + ::sg_import(src.serverViewOrg, serverViewOrg); + ::sg_import(src.saberInFlight, saberInFlight); + +#ifdef JK2_MODE + ::sg_import(src.saberActive, saberActive); + ::sg_import(src.vehicleModel, vehicleModel); + ::sg_import(src.viewEntity, viewEntity); + ::sg_import(src.saberColor, saberColor); + ::sg_import(src.saberLength, saberLength); + ::sg_import(src.saberLengthMax, saberLengthMax); + ::sg_import(src.forcePowersActive, forcePowersActive); +#else + ::sg_import(src.viewEntity, viewEntity); + ::sg_import(src.forcePowersActive, forcePowersActive); +#endif + + ::sg_import(src.useTime, useTime); + ::sg_import(src.lastShotTime, lastShotTime); + ::sg_import(src.ping, ping); + ::sg_import(src.lastOnGround, lastOnGround); + ::sg_import(src.lastStationary, lastStationary); + ::sg_import(src.weaponShotCount, weaponShotCount); + ::sg_import(src.saber, saber); + ::sg_import(src.dualSabers, dualSabers); + ::sg_import(src.saberMove, saberMove); + ::sg_import(src.saberMoveNext, saberMoveNext); + ::sg_import(src.saberBounceMove, saberBounceMove); + ::sg_import(src.saberBlocking, saberBlocking); + ::sg_import(src.saberBlocked, saberBlocked); + ::sg_import(src.leanStopDebounceTime, leanStopDebounceTime); + +#ifdef JK2_MODE + ::sg_import(src.saberLengthOld, saberLengthOld); +#endif + + ::sg_import(src.saberEntityNum, saberEntityNum); + ::sg_import(src.saberEntityDist, saberEntityDist); + ::sg_import(src.saberThrowTime, saberThrowTime); + ::sg_import(src.saberEntityState, saberEntityState); + ::sg_import(src.saberDamageDebounceTime, saberDamageDebounceTime); + ::sg_import(src.saberHitWallSoundDebounceTime, saberHitWallSoundDebounceTime); + ::sg_import(src.saberEventFlags, saberEventFlags); + ::sg_import(src.saberBlockingTime, saberBlockingTime); + ::sg_import(src.saberAnimLevel, saberAnimLevel); + ::sg_import(src.saberAttackChainCount, saberAttackChainCount); + ::sg_import(src.saberLockTime, saberLockTime); + ::sg_import(src.saberLockEnemy, saberLockEnemy); + ::sg_import(src.saberStylesKnown, saberStylesKnown); + +#ifdef JK2_MODE + ::sg_import(src.saberModel, saberModel); +#endif + + ::sg_import(src.forcePowersKnown, forcePowersKnown); + ::sg_import(src.forcePowerDuration, forcePowerDuration); + ::sg_import(src.forcePowerDebounce, forcePowerDebounce); + ::sg_import(src.forcePower, forcePower); + ::sg_import(src.forcePowerMax, forcePowerMax); + ::sg_import(src.forcePowerRegenDebounceTime, forcePowerRegenDebounceTime); + ::sg_import(src.forcePowerRegenRate, forcePowerRegenRate); + ::sg_import(src.forcePowerRegenAmount, forcePowerRegenAmount); + ::sg_import(src.forcePowerLevel, forcePowerLevel); + ::sg_import(src.forceJumpZStart, forceJumpZStart); + ::sg_import(src.forceJumpCharge, forceJumpCharge); + ::sg_import(src.forceGripEntityNum, forceGripEntityNum); + ::sg_import(src.forceGripOrg, forceGripOrg); + ::sg_import(src.forceDrainEntityNum, forceDrainEntityNum); + ::sg_import(src.forceDrainOrg, forceDrainOrg); + ::sg_import(src.forceHealCount, forceHealCount); + ::sg_import(src.forceAllowDeactivateTime, forceAllowDeactivateTime); + ::sg_import(src.forceRageDrainTime, forceRageDrainTime); + ::sg_import(src.forceRageRecoveryTime, forceRageRecoveryTime); + ::sg_import(src.forceDrainEntNum, forceDrainEntNum); + ::sg_import(src.forceDrainTime, forceDrainTime); + ::sg_import(src.forcePowersForced, forcePowersForced); + ::sg_import(src.pullAttackEntNum, pullAttackEntNum); + ::sg_import(src.pullAttackTime, pullAttackTime); + ::sg_import(src.lastKickedEntNum, lastKickedEntNum); + ::sg_import(src.taunting, taunting); + ::sg_import(src.jumpZStart, jumpZStart); + ::sg_import(src.moveDir, moveDir); + ::sg_import(src.waterheight, waterheight); + ::sg_import(src.waterHeightLevel, waterHeightLevel); + ::sg_import(src.ikStatus, ikStatus); + ::sg_import(src.heldClient, heldClient); + ::sg_import(src.heldByClient, heldByClient); + ::sg_import(src.heldByBolt, heldByBolt); + ::sg_import(src.heldByBone, heldByBone); + ::sg_import(src.vehTurnaroundIndex, vehTurnaroundIndex); + ::sg_import(src.vehTurnaroundTime, vehTurnaroundTime); + ::sg_import(src.brokenLimbs, brokenLimbs); + ::sg_import(src.electrifyTime, electrifyTime); +} + + +void usercmd_t::sg_export( + SgType& dst) const +{ + ::sg_export(serverTime, dst.serverTime); + ::sg_export(buttons, dst.buttons); + ::sg_export(weapon, dst.weapon); + ::sg_export(angles, dst.angles); + ::sg_export(generic_cmd, dst.generic_cmd); + ::sg_export(forwardmove, dst.forwardmove); + ::sg_export(rightmove, dst.rightmove); + ::sg_export(upmove, dst.upmove); +} + +void usercmd_t::sg_import( + const SgType& src) +{ + ::sg_import(src.serverTime, serverTime); + ::sg_import(src.buttons, buttons); + ::sg_import(src.weapon, weapon); + ::sg_import(src.angles, angles); + ::sg_import(src.generic_cmd, generic_cmd); + ::sg_import(src.forwardmove, forwardmove); + ::sg_import(src.rightmove, rightmove); + ::sg_import(src.upmove, upmove); +} + + +void trajectory_t::sg_export( + SgType& dst) const +{ + ::sg_export(trType, dst.trType); + ::sg_export(trTime, dst.trTime); + ::sg_export(trDuration, dst.trDuration); + ::sg_export(trBase, dst.trBase); + ::sg_export(trDelta, dst.trDelta); +} + +void trajectory_t::sg_import( + const SgType& src) +{ + ::sg_import(src.trType, trType); + ::sg_import(src.trTime, trTime); + ::sg_import(src.trDuration, trDuration); + ::sg_import(src.trBase, trBase); + ::sg_import(src.trDelta, trDelta); +} + + +void entityState_t::sg_export( + SgType& dst) const +{ + ::sg_export(number, dst.number); + ::sg_export(eType, dst.eType); + ::sg_export(eFlags, dst.eFlags); + ::sg_export(pos, dst.pos); + ::sg_export(apos, dst.apos); + ::sg_export(time, dst.time); + ::sg_export(time2, dst.time2); + ::sg_export(origin, dst.origin); + ::sg_export(origin2, dst.origin2); + ::sg_export(angles, dst.angles); + ::sg_export(angles2, dst.angles2); + ::sg_export(otherEntityNum, dst.otherEntityNum); + ::sg_export(otherEntityNum2, dst.otherEntityNum2); + ::sg_export(groundEntityNum, dst.groundEntityNum); + ::sg_export(constantLight, dst.constantLight); + ::sg_export(loopSound, dst.loopSound); + ::sg_export(modelindex, dst.modelindex); + ::sg_export(modelindex2, dst.modelindex2); + ::sg_export(modelindex3, dst.modelindex3); + ::sg_export(clientNum, dst.clientNum); + ::sg_export(frame, dst.frame); + ::sg_export(solid, dst.solid); + ::sg_export(event, dst.event); + ::sg_export(eventParm, dst.eventParm); + ::sg_export(powerups, dst.powerups); + ::sg_export(weapon, dst.weapon); + ::sg_export(legsAnim, dst.legsAnim); + ::sg_export(legsAnimTimer, dst.legsAnimTimer); + ::sg_export(torsoAnim, dst.torsoAnim); + ::sg_export(torsoAnimTimer, dst.torsoAnimTimer); + ::sg_export(scale, dst.scale); + ::sg_export(saberInFlight, dst.saberInFlight); + ::sg_export(saberActive, dst.saberActive); + +#ifdef JK2_MODE + ::sg_export(vehicleModel, dst.vehicleModel); +#endif + + ::sg_export(vehicleAngles, dst.vehicleAngles); + ::sg_export(vehicleArmor, dst.vehicleArmor); + ::sg_export(m_iVehicleNum, dst.m_iVehicleNum); + ::sg_export(modelScale, dst.modelScale); + ::sg_export(radius, dst.radius); + ::sg_export(boltInfo, dst.boltInfo); + ::sg_export(isPortalEnt, dst.isPortalEnt); +} + +void entityState_t::sg_import( + const SgType& src) +{ + ::sg_import(src.number, number); + ::sg_import(src.eType, eType); + ::sg_import(src.eFlags, eFlags); + ::sg_import(src.pos, pos); + ::sg_import(src.apos, apos); + ::sg_import(src.time, time); + ::sg_import(src.time2, time2); + ::sg_import(src.origin, origin); + ::sg_import(src.origin2, origin2); + ::sg_import(src.angles, angles); + ::sg_import(src.angles2, angles2); + ::sg_import(src.otherEntityNum, otherEntityNum); + ::sg_import(src.otherEntityNum2, otherEntityNum2); + ::sg_import(src.groundEntityNum, groundEntityNum); + ::sg_import(src.constantLight, constantLight); + ::sg_import(src.loopSound, loopSound); + ::sg_import(src.modelindex, modelindex); + ::sg_import(src.modelindex2, modelindex2); + ::sg_import(src.modelindex3, modelindex3); + ::sg_import(src.clientNum, clientNum); + ::sg_import(src.frame, frame); + ::sg_import(src.solid, solid); + ::sg_import(src.event, event); + ::sg_import(src.eventParm, eventParm); + ::sg_import(src.powerups, powerups); + ::sg_import(src.weapon, weapon); + ::sg_import(src.legsAnim, legsAnim); + ::sg_import(src.legsAnimTimer, legsAnimTimer); + ::sg_import(src.torsoAnim, torsoAnim); + ::sg_import(src.torsoAnimTimer, torsoAnimTimer); + ::sg_import(src.scale, scale); + ::sg_import(src.saberInFlight, saberInFlight); + ::sg_import(src.saberActive, saberActive); + +#ifdef JK2_MODE + ::sg_import(src.vehicleModel, vehicleModel); +#endif + + ::sg_import(src.vehicleAngles, vehicleAngles); + ::sg_import(src.vehicleArmor, vehicleArmor); + ::sg_import(src.m_iVehicleNum, m_iVehicleNum); + ::sg_import(src.modelScale, modelScale); + ::sg_import(src.radius, radius); + ::sg_import(src.boltInfo, boltInfo); + ::sg_import(src.isPortalEnt, isPortalEnt); +} + + // end diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index d5c5534b68..4f0cd7003c 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -1247,24 +1247,10 @@ typedef struct cplane_s { void sg_export( - SgType& dst) const - { - ::sg_export(normal, dst.normal); - ::sg_export(dist, dst.dist); - ::sg_export(type, dst.type); - ::sg_export(signbits, dst.signbits); - ::sg_export(pad, dst.pad); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.normal, normal); - ::sg_import(src.dist, dist); - ::sg_import(src.type, type); - ::sg_import(src.signbits, signbits); - ::sg_import(src.pad, pad); - } + const SgType& src); } cplane_t; /* @@ -1319,32 +1305,10 @@ Ghoul2 Insert End void sg_export( - SgType& dst) const - { - ::sg_export(allsolid, dst.allsolid); - ::sg_export(startsolid, dst.startsolid); - ::sg_export(fraction, dst.fraction); - ::sg_export(endpos, dst.endpos); - ::sg_export(plane, dst.plane); - ::sg_export(surfaceFlags, dst.surfaceFlags); - ::sg_export(contents, dst.contents); - ::sg_export(entityNum, dst.entityNum); - ::sg_export(G2CollisionMap, dst.G2CollisionMap); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.allsolid, allsolid); - ::sg_import(src.startsolid, startsolid); - ::sg_import(src.fraction, fraction); - ::sg_import(src.endpos, endpos); - ::sg_import(src.plane, plane); - ::sg_import(src.surfaceFlags, surfaceFlags); - ::sg_import(src.contents, contents); - ::sg_import(src.entityNum, entityNum); - ::sg_import(src.G2CollisionMap, G2CollisionMap); - } + const SgType& src); } trace_t; // trace->entityNum can also be 0 to (MAX_GENTITIES-1) @@ -1597,30 +1561,10 @@ typedef struct void sg_export( - SgType& dst) const - { - ::sg_export(inAction, dst.inAction); - ::sg_export(duration, dst.duration); - ::sg_export(lastTime, dst.lastTime); - ::sg_export(base, dst.base); - ::sg_export(tip, dst.tip); - ::sg_export(haveOldPos, dst.haveOldPos); - ::sg_export(oldPos, dst.oldPos); - ::sg_export(oldNormal, dst.oldNormal); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.inAction, inAction); - ::sg_import(src.duration, duration); - ::sg_import(src.lastTime, lastTime); - ::sg_import(src.base, base); - ::sg_import(src.tip, tip); - ::sg_import(src.haveOldPos, haveOldPos); - ::sg_import(src.oldPos, oldPos); - ::sg_import(src.oldNormal, oldNormal); - } + const SgType& src); } saberTrail_t; #define MAX_SABER_TRAIL_SEGS 8 @@ -1673,36 +1617,10 @@ typedef struct void sg_export( - SgType& dst) const - { - ::sg_export(active, dst.active); - ::sg_export(color, dst.color); - ::sg_export(radius, dst.radius); - ::sg_export(length, dst.length); - ::sg_export(lengthMax, dst.lengthMax); - ::sg_export(lengthOld, dst.lengthOld); - ::sg_export(muzzlePoint, dst.muzzlePoint); - ::sg_export(muzzlePointOld, dst.muzzlePointOld); - ::sg_export(muzzleDir, dst.muzzleDir); - ::sg_export(muzzleDirOld, dst.muzzleDirOld); - ::sg_export(trail, dst.trail); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.active, active); - ::sg_import(src.color, color); - ::sg_import(src.radius, radius); - ::sg_import(src.length, length); - ::sg_import(src.lengthMax, lengthMax); - ::sg_import(src.lengthOld, lengthOld); - ::sg_import(src.muzzlePoint, muzzlePoint); - ::sg_import(src.muzzlePointOld, muzzlePointOld); - ::sg_import(src.muzzleDir, muzzleDir); - ::sg_import(src.muzzleDirOld, muzzleDirOld); - ::sg_import(src.trail, trail); - } + const SgType& src); } bladeInfo_t; #define MAX_BLADES 8 @@ -2080,166 +1998,10 @@ typedef struct void sg_export( - SgType& dst) const - { - ::sg_export(name, dst.name); - ::sg_export(fullName, dst.fullName); - ::sg_export(type, dst.type); - ::sg_export(model, dst.model); - ::sg_export(skin, dst.skin); - ::sg_export(soundOn, dst.soundOn); - ::sg_export(soundLoop, dst.soundLoop); - ::sg_export(soundOff, dst.soundOff); - ::sg_export(numBlades, dst.numBlades); - ::sg_export(blade, dst.blade); - ::sg_export(stylesLearned, dst.stylesLearned); - ::sg_export(stylesForbidden, dst.stylesForbidden); - ::sg_export(maxChain, dst.maxChain); - ::sg_export(forceRestrictions, dst.forceRestrictions); - ::sg_export(lockBonus, dst.lockBonus); - ::sg_export(parryBonus, dst.parryBonus); - ::sg_export(breakParryBonus, dst.breakParryBonus); - ::sg_export(breakParryBonus2, dst.breakParryBonus2); - ::sg_export(disarmBonus, dst.disarmBonus); - ::sg_export(disarmBonus2, dst.disarmBonus2); - ::sg_export(singleBladeStyle, dst.singleBladeStyle); - ::sg_export(brokenSaber1, dst.brokenSaber1); - ::sg_export(brokenSaber2, dst.brokenSaber2); - ::sg_export(saberFlags, dst.saberFlags); - ::sg_export(saberFlags2, dst.saberFlags2); - ::sg_export(spinSound, dst.spinSound); - ::sg_export(swingSound, dst.swingSound); - ::sg_export(fallSound, dst.fallSound); - ::sg_export(moveSpeedScale, dst.moveSpeedScale); - ::sg_export(animSpeedScale, dst.animSpeedScale); - ::sg_export(kataMove, dst.kataMove); - ::sg_export(lungeAtkMove, dst.lungeAtkMove); - ::sg_export(jumpAtkUpMove, dst.jumpAtkUpMove); - ::sg_export(jumpAtkFwdMove, dst.jumpAtkFwdMove); - ::sg_export(jumpAtkBackMove, dst.jumpAtkBackMove); - ::sg_export(jumpAtkRightMove, dst.jumpAtkRightMove); - ::sg_export(jumpAtkLeftMove, dst.jumpAtkLeftMove); - ::sg_export(readyAnim, dst.readyAnim); - ::sg_export(drawAnim, dst.drawAnim); - ::sg_export(putawayAnim, dst.putawayAnim); - ::sg_export(tauntAnim, dst.tauntAnim); - ::sg_export(bowAnim, dst.bowAnim); - ::sg_export(meditateAnim, dst.meditateAnim); - ::sg_export(flourishAnim, dst.flourishAnim); - ::sg_export(gloatAnim, dst.gloatAnim); - ::sg_export(bladeStyle2Start, dst.bladeStyle2Start); - ::sg_export(trailStyle, dst.trailStyle); - ::sg_export(g2MarksShader, dst.g2MarksShader); - ::sg_export(g2WeaponMarkShader, dst.g2WeaponMarkShader); - ::sg_export(hitSound, dst.hitSound); - ::sg_export(blockSound, dst.blockSound); - ::sg_export(bounceSound, dst.bounceSound); - ::sg_export(blockEffect, dst.blockEffect); - ::sg_export(hitPersonEffect, dst.hitPersonEffect); - ::sg_export(hitOtherEffect, dst.hitOtherEffect); - ::sg_export(bladeEffect, dst.bladeEffect); - ::sg_export(knockbackScale, dst.knockbackScale); - ::sg_export(damageScale, dst.damageScale); - ::sg_export(splashRadius, dst.splashRadius); - ::sg_export(splashDamage, dst.splashDamage); - ::sg_export(splashKnockback, dst.splashKnockback); - ::sg_export(trailStyle2, dst.trailStyle2); - ::sg_export(g2MarksShader2, dst.g2MarksShader2); - ::sg_export(g2WeaponMarkShader2, dst.g2WeaponMarkShader2); - ::sg_export(hit2Sound, dst.hit2Sound); - ::sg_export(block2Sound, dst.block2Sound); - ::sg_export(bounce2Sound, dst.bounce2Sound); - ::sg_export(blockEffect2, dst.blockEffect2); - ::sg_export(hitPersonEffect2, dst.hitPersonEffect2); - ::sg_export(hitOtherEffect2, dst.hitOtherEffect2); - ::sg_export(bladeEffect2, dst.bladeEffect2); - ::sg_export(knockbackScale2, dst.knockbackScale2); - ::sg_export(damageScale2, dst.damageScale2); - ::sg_export(splashRadius2, dst.splashRadius2); - ::sg_export(splashDamage2, dst.splashDamage2); - ::sg_export(splashKnockback2, dst.splashKnockback2); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.name, name); - ::sg_import(src.fullName, fullName); - ::sg_import(src.type, type); - ::sg_import(src.model, model); - ::sg_import(src.skin, skin); - ::sg_import(src.soundOn, soundOn); - ::sg_import(src.soundLoop, soundLoop); - ::sg_import(src.soundOff, soundOff); - ::sg_import(src.numBlades, numBlades); - ::sg_import(src.blade, blade); - ::sg_import(src.stylesLearned, stylesLearned); - ::sg_import(src.stylesForbidden, stylesForbidden); - ::sg_import(src.maxChain, maxChain); - ::sg_import(src.forceRestrictions, forceRestrictions); - ::sg_import(src.lockBonus, lockBonus); - ::sg_import(src.parryBonus, parryBonus); - ::sg_import(src.breakParryBonus, breakParryBonus); - ::sg_import(src.breakParryBonus2, breakParryBonus2); - ::sg_import(src.disarmBonus, disarmBonus); - ::sg_import(src.disarmBonus2, disarmBonus2); - ::sg_import(src.singleBladeStyle, singleBladeStyle); - ::sg_import(src.brokenSaber1, brokenSaber1); - ::sg_import(src.brokenSaber2, brokenSaber2); - ::sg_import(src.saberFlags, saberFlags); - ::sg_import(src.saberFlags2, saberFlags2); - ::sg_import(src.spinSound, spinSound); - ::sg_import(src.swingSound, swingSound); - ::sg_import(src.fallSound, fallSound); - ::sg_import(src.moveSpeedScale, moveSpeedScale); - ::sg_import(src.animSpeedScale, animSpeedScale); - ::sg_import(src.kataMove, kataMove); - ::sg_import(src.lungeAtkMove, lungeAtkMove); - ::sg_import(src.jumpAtkUpMove, jumpAtkUpMove); - ::sg_import(src.jumpAtkFwdMove, jumpAtkFwdMove); - ::sg_import(src.jumpAtkBackMove, jumpAtkBackMove); - ::sg_import(src.jumpAtkRightMove, jumpAtkRightMove); - ::sg_import(src.jumpAtkLeftMove, jumpAtkLeftMove); - ::sg_import(src.readyAnim, readyAnim); - ::sg_import(src.drawAnim, drawAnim); - ::sg_import(src.putawayAnim, putawayAnim); - ::sg_import(src.tauntAnim, tauntAnim); - ::sg_import(src.bowAnim, bowAnim); - ::sg_import(src.meditateAnim, meditateAnim); - ::sg_import(src.flourishAnim, flourishAnim); - ::sg_import(src.gloatAnim, gloatAnim); - ::sg_import(src.bladeStyle2Start, bladeStyle2Start); - ::sg_import(src.trailStyle, trailStyle); - ::sg_import(src.g2MarksShader, g2MarksShader); - ::sg_import(src.g2WeaponMarkShader, g2WeaponMarkShader); - ::sg_import(src.hitSound, hitSound); - ::sg_import(src.blockSound, blockSound); - ::sg_import(src.bounceSound, bounceSound); - ::sg_import(src.blockEffect, blockEffect); - ::sg_import(src.hitPersonEffect, hitPersonEffect); - ::sg_import(src.hitOtherEffect, hitOtherEffect); - ::sg_import(src.bladeEffect, bladeEffect); - ::sg_import(src.knockbackScale, knockbackScale); - ::sg_import(src.damageScale, damageScale); - ::sg_import(src.splashRadius, splashRadius); - ::sg_import(src.splashDamage, splashDamage); - ::sg_import(src.splashKnockback, splashKnockback); - ::sg_import(src.trailStyle2, trailStyle2); - ::sg_import(src.g2MarksShader2, g2MarksShader2); - ::sg_import(src.g2WeaponMarkShader2, g2WeaponMarkShader2); - ::sg_import(src.hit2Sound, hit2Sound); - ::sg_import(src.block2Sound, block2Sound); - ::sg_import(src.bounce2Sound, bounce2Sound); - ::sg_import(src.blockEffect2, blockEffect2); - ::sg_import(src.hitPersonEffect2, hitPersonEffect2); - ::sg_import(src.hitOtherEffect2, hitOtherEffect2); - ::sg_import(src.bladeEffect2, bladeEffect2); - ::sg_import(src.knockbackScale2, knockbackScale2); - ::sg_import(src.damageScale2, damageScale2); - ::sg_import(src.splashRadius2, splashRadius2); - ::sg_import(src.splashDamage2, splashDamage2); - ::sg_import(src.splashKnockback2, splashKnockback2); - } + const SgType& src); } saberInfo_t; //NOTE: Below is the *retail* version of the saberInfo_t structure - it is ONLY used for loading retail-version savegames (we load the savegame into this smaller structure, then copy each field into the appropriate field in the new structure - see SG_ConvertRetailSaberinfoToNewSaberinfo() @@ -2398,68 +2160,10 @@ typedef struct void sg_export( - SgType& dst) const - { - ::sg_export(name, dst.name); - ::sg_export(fullName, dst.fullName); - ::sg_export(type, dst.type); - ::sg_export(model, dst.model); - ::sg_export(skin, dst.skin); - ::sg_export(soundOn, dst.soundOn); - ::sg_export(soundLoop, dst.soundLoop); - ::sg_export(soundOff, dst.soundOff); - ::sg_export(numBlades, dst.numBlades); - ::sg_export(blade, dst.blade); - ::sg_export(style, dst.style); - ::sg_export(maxChain, dst.maxChain); - ::sg_export(lockable, dst.lockable); - ::sg_export(throwable, dst.throwable); - ::sg_export(disarmable, dst.disarmable); - ::sg_export(activeBlocking, dst.activeBlocking); - ::sg_export(twoHanded, dst.twoHanded); - ::sg_export(forceRestrictions, dst.forceRestrictions); - ::sg_export(lockBonus, dst.lockBonus); - ::sg_export(parryBonus, dst.parryBonus); - ::sg_export(breakParryBonus, dst.breakParryBonus); - ::sg_export(disarmBonus, dst.disarmBonus); - ::sg_export(singleBladeStyle, dst.singleBladeStyle); - ::sg_export(singleBladeThrowable, dst.singleBladeThrowable); - ::sg_export(brokenSaber1, dst.brokenSaber1); - ::sg_export(brokenSaber2, dst.brokenSaber2); - ::sg_export(returnDamage, dst.returnDamage); - } + SgType& dst) const; void sg_import( - SgType& src) - { - ::sg_import(src.name, name); - ::sg_import(src.fullName, fullName); - ::sg_import(src.type, type); - ::sg_import(src.model, model); - ::sg_import(src.skin, skin); - ::sg_import(src.soundOn, soundOn); - ::sg_import(src.soundLoop, soundLoop); - ::sg_import(src.soundOff, soundOff); - ::sg_import(src.numBlades, numBlades); - ::sg_import(src.blade, blade); - ::sg_import(src.style, style); - ::sg_import(src.maxChain, maxChain); - ::sg_import(src.lockable, lockable); - ::sg_import(src.throwable, throwable); - ::sg_import(src.disarmable, disarmable); - ::sg_import(src.activeBlocking, activeBlocking); - ::sg_import(src.twoHanded, twoHanded); - ::sg_import(src.forceRestrictions, forceRestrictions); - ::sg_import(src.lockBonus, lockBonus); - ::sg_import(src.parryBonus, parryBonus); - ::sg_import(src.breakParryBonus, breakParryBonus); - ::sg_import(src.disarmBonus, disarmBonus); - ::sg_import(src.singleBladeStyle, singleBladeStyle); - ::sg_import(src.singleBladeThrowable, singleBladeThrowable); - ::sg_import(src.brokenSaber1, brokenSaber1); - ::sg_import(src.brokenSaber2, brokenSaber2); - ::sg_import(src.returnDamage, returnDamage); - } + SgType& src); } saberInfoRetail_t; #define MAX_SABERS 2 // if this ever changes then update the table "static const save_field_t savefields_gClient[]"!!!!!!!!!!!! @@ -2926,288 +2630,10 @@ typedef struct playerState_s { void sg_export( - SgType& dst) const - { - ::sg_export(commandTime, dst.commandTime); - ::sg_export(pm_type, dst.pm_type); - ::sg_export(bobCycle, dst.bobCycle); - ::sg_export(pm_flags, dst.pm_flags); - ::sg_export(pm_time, dst.pm_time); - ::sg_export(origin, dst.origin); - ::sg_export(velocity, dst.velocity); - ::sg_export(weaponTime, dst.weaponTime); - ::sg_export(weaponChargeTime, dst.weaponChargeTime); - ::sg_export(rechargeTime, dst.rechargeTime); - ::sg_export(gravity, dst.gravity); - ::sg_export(leanofs, dst.leanofs); - ::sg_export(friction, dst.friction); - ::sg_export(speed, dst.speed); - ::sg_export(delta_angles, dst.delta_angles); - ::sg_export(groundEntityNum, dst.groundEntityNum); - ::sg_export(legsAnim, dst.legsAnim); - ::sg_export(legsAnimTimer, dst.legsAnimTimer); - ::sg_export(torsoAnim, dst.torsoAnim); - ::sg_export(torsoAnimTimer, dst.torsoAnimTimer); - ::sg_export(movementDir, dst.movementDir); - ::sg_export(eFlags, dst.eFlags); - ::sg_export(eventSequence, dst.eventSequence); - ::sg_export(events, dst.events); - ::sg_export(eventParms, dst.eventParms); - ::sg_export(externalEvent, dst.externalEvent); - ::sg_export(externalEventParm, dst.externalEventParm); - ::sg_export(externalEventTime, dst.externalEventTime); - ::sg_export(clientNum, dst.clientNum); - ::sg_export(weapon, dst.weapon); - ::sg_export(weaponstate, dst.weaponstate); - ::sg_export(batteryCharge, dst.batteryCharge); - ::sg_export(viewangles, dst.viewangles); - ::sg_export(legsYaw, dst.legsYaw); - ::sg_export(viewheight, dst.viewheight); - ::sg_export(damageEvent, dst.damageEvent); - ::sg_export(damageYaw, dst.damageYaw); - ::sg_export(damagePitch, dst.damagePitch); - ::sg_export(damageCount, dst.damageCount); - ::sg_export(stats, dst.stats); - ::sg_export(persistant, dst.persistant); - ::sg_export(powerups, dst.powerups); - ::sg_export(ammo, dst.ammo); - ::sg_export(inventory, dst.inventory); - ::sg_export(security_key_message, dst.security_key_message); - ::sg_export(serverViewOrg, dst.serverViewOrg); - ::sg_export(saberInFlight, dst.saberInFlight); - -#ifdef JK2_MODE - ::sg_export(saberActive, dst.saberActive); - ::sg_export(vehicleModel, dst.vehicleModel); - ::sg_export(viewEntity, dst.viewEntity); - ::sg_export(saberColor, dst.saberColor); - ::sg_export(saberLength, dst.saberLength); - ::sg_export(saberLengthMax, dst.saberLengthMax); - ::sg_export(forcePowersActive, dst.forcePowersActive); -#else - ::sg_export(viewEntity, dst.viewEntity); - ::sg_export(forcePowersActive, dst.forcePowersActive); -#endif - - ::sg_export(useTime, dst.useTime); - ::sg_export(lastShotTime, dst.lastShotTime); - ::sg_export(ping, dst.ping); - ::sg_export(lastOnGround, dst.lastOnGround); - ::sg_export(lastStationary, dst.lastStationary); - ::sg_export(weaponShotCount, dst.weaponShotCount); - ::sg_export(saber, dst.saber); - ::sg_export(dualSabers, dst.dualSabers); - ::sg_export(saberMove, dst.saberMove); - ::sg_export(saberMoveNext, dst.saberMoveNext); - ::sg_export(saberBounceMove, dst.saberBounceMove); - ::sg_export(saberBlocking, dst.saberBlocking); - ::sg_export(saberBlocked, dst.saberBlocked); - ::sg_export(leanStopDebounceTime, dst.leanStopDebounceTime); - -#ifdef JK2_MODE - ::sg_export(saberLengthOld, dst.saberLengthOld); -#endif - - ::sg_export(saberEntityNum, dst.saberEntityNum); - ::sg_export(saberEntityDist, dst.saberEntityDist); - ::sg_export(saberThrowTime, dst.saberThrowTime); - ::sg_export(saberEntityState, dst.saberEntityState); - ::sg_export(saberDamageDebounceTime, dst.saberDamageDebounceTime); - ::sg_export(saberHitWallSoundDebounceTime, dst.saberHitWallSoundDebounceTime); - ::sg_export(saberEventFlags, dst.saberEventFlags); - ::sg_export(saberBlockingTime, dst.saberBlockingTime); - ::sg_export(saberAnimLevel, dst.saberAnimLevel); - ::sg_export(saberAttackChainCount, dst.saberAttackChainCount); - ::sg_export(saberLockTime, dst.saberLockTime); - ::sg_export(saberLockEnemy, dst.saberLockEnemy); - ::sg_export(saberStylesKnown, dst.saberStylesKnown); - -#ifdef JK2_MODE - ::sg_export(saberModel, dst.saberModel); -#endif - - ::sg_export(forcePowersKnown, dst.forcePowersKnown); - ::sg_export(forcePowerDuration, dst.forcePowerDuration); - ::sg_export(forcePowerDebounce, dst.forcePowerDebounce); - ::sg_export(forcePower, dst.forcePower); - ::sg_export(forcePowerMax, dst.forcePowerMax); - ::sg_export(forcePowerRegenDebounceTime, dst.forcePowerRegenDebounceTime); - ::sg_export(forcePowerRegenRate, dst.forcePowerRegenRate); - ::sg_export(forcePowerRegenAmount, dst.forcePowerRegenAmount); - ::sg_export(forcePowerLevel, dst.forcePowerLevel); - ::sg_export(forceJumpZStart, dst.forceJumpZStart); - ::sg_export(forceJumpCharge, dst.forceJumpCharge); - ::sg_export(forceGripEntityNum, dst.forceGripEntityNum); - ::sg_export(forceGripOrg, dst.forceGripOrg); - ::sg_export(forceDrainEntityNum, dst.forceDrainEntityNum); - ::sg_export(forceDrainOrg, dst.forceDrainOrg); - ::sg_export(forceHealCount, dst.forceHealCount); - ::sg_export(forceAllowDeactivateTime, dst.forceAllowDeactivateTime); - ::sg_export(forceRageDrainTime, dst.forceRageDrainTime); - ::sg_export(forceRageRecoveryTime, dst.forceRageRecoveryTime); - ::sg_export(forceDrainEntNum, dst.forceDrainEntNum); - ::sg_export(forceDrainTime, dst.forceDrainTime); - ::sg_export(forcePowersForced, dst.forcePowersForced); - ::sg_export(pullAttackEntNum, dst.pullAttackEntNum); - ::sg_export(pullAttackTime, dst.pullAttackTime); - ::sg_export(lastKickedEntNum, dst.lastKickedEntNum); - ::sg_export(taunting, dst.taunting); - ::sg_export(jumpZStart, dst.jumpZStart); - ::sg_export(moveDir, dst.moveDir); - ::sg_export(waterheight, dst.waterheight); - ::sg_export(waterHeightLevel, dst.waterHeightLevel); - ::sg_export(ikStatus, dst.ikStatus); - ::sg_export(heldClient, dst.heldClient); - ::sg_export(heldByClient, dst.heldByClient); - ::sg_export(heldByBolt, dst.heldByBolt); - ::sg_export(heldByBone, dst.heldByBone); - ::sg_export(vehTurnaroundIndex, dst.vehTurnaroundIndex); - ::sg_export(vehTurnaroundTime, dst.vehTurnaroundTime); - ::sg_export(brokenLimbs, dst.brokenLimbs); - ::sg_export(electrifyTime, dst.electrifyTime); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.commandTime, commandTime); - ::sg_import(src.pm_type, pm_type); - ::sg_import(src.bobCycle, bobCycle); - ::sg_import(src.pm_flags, pm_flags); - ::sg_import(src.pm_time, pm_time); - ::sg_import(src.origin, origin); - ::sg_import(src.velocity, velocity); - ::sg_import(src.weaponTime, weaponTime); - ::sg_import(src.weaponChargeTime, weaponChargeTime); - ::sg_import(src.rechargeTime, rechargeTime); - ::sg_import(src.gravity, gravity); - ::sg_import(src.leanofs, leanofs); - ::sg_import(src.friction, friction); - ::sg_import(src.speed, speed); - ::sg_import(src.delta_angles, delta_angles); - ::sg_import(src.groundEntityNum, groundEntityNum); - ::sg_import(src.legsAnim, legsAnim); - ::sg_import(src.legsAnimTimer, legsAnimTimer); - ::sg_import(src.torsoAnim, torsoAnim); - ::sg_import(src.torsoAnimTimer, torsoAnimTimer); - ::sg_import(src.movementDir, movementDir); - ::sg_import(src.eFlags, eFlags); - ::sg_import(src.eventSequence, eventSequence); - ::sg_import(src.events, events); - ::sg_import(src.eventParms, eventParms); - ::sg_import(src.externalEvent, externalEvent); - ::sg_import(src.externalEventParm, externalEventParm); - ::sg_import(src.externalEventTime, externalEventTime); - ::sg_import(src.clientNum, clientNum); - ::sg_import(src.weapon, weapon); - ::sg_import(src.weaponstate, weaponstate); - ::sg_import(src.batteryCharge, batteryCharge); - ::sg_import(src.viewangles, viewangles); - ::sg_import(src.legsYaw, legsYaw); - ::sg_import(src.viewheight, viewheight); - ::sg_import(src.damageEvent, damageEvent); - ::sg_import(src.damageYaw, damageYaw); - ::sg_import(src.damagePitch, damagePitch); - ::sg_import(src.damageCount, damageCount); - ::sg_import(src.stats, stats); - ::sg_import(src.persistant, persistant); - ::sg_import(src.powerups, powerups); - ::sg_import(src.ammo, ammo); - ::sg_import(src.inventory, inventory); - ::sg_import(src.security_key_message, security_key_message); - ::sg_import(src.serverViewOrg, serverViewOrg); - ::sg_import(src.saberInFlight, saberInFlight); - -#ifdef JK2_MODE - ::sg_import(src.saberActive, saberActive); - ::sg_import(src.vehicleModel, vehicleModel); - ::sg_import(src.viewEntity, viewEntity); - ::sg_import(src.saberColor, saberColor); - ::sg_import(src.saberLength, saberLength); - ::sg_import(src.saberLengthMax, saberLengthMax); - ::sg_import(src.forcePowersActive, forcePowersActive); -#else - ::sg_import(src.viewEntity, viewEntity); - ::sg_import(src.forcePowersActive, forcePowersActive); -#endif - - ::sg_import(src.useTime, useTime); - ::sg_import(src.lastShotTime, lastShotTime); - ::sg_import(src.ping, ping); - ::sg_import(src.lastOnGround, lastOnGround); - ::sg_import(src.lastStationary, lastStationary); - ::sg_import(src.weaponShotCount, weaponShotCount); - ::sg_import(src.saber, saber); - ::sg_import(src.dualSabers, dualSabers); - ::sg_import(src.saberMove, saberMove); - ::sg_import(src.saberMoveNext, saberMoveNext); - ::sg_import(src.saberBounceMove, saberBounceMove); - ::sg_import(src.saberBlocking, saberBlocking); - ::sg_import(src.saberBlocked, saberBlocked); - ::sg_import(src.leanStopDebounceTime, leanStopDebounceTime); - -#ifdef JK2_MODE - ::sg_import(src.saberLengthOld, saberLengthOld); -#endif - - ::sg_import(src.saberEntityNum, saberEntityNum); - ::sg_import(src.saberEntityDist, saberEntityDist); - ::sg_import(src.saberThrowTime, saberThrowTime); - ::sg_import(src.saberEntityState, saberEntityState); - ::sg_import(src.saberDamageDebounceTime, saberDamageDebounceTime); - ::sg_import(src.saberHitWallSoundDebounceTime, saberHitWallSoundDebounceTime); - ::sg_import(src.saberEventFlags, saberEventFlags); - ::sg_import(src.saberBlockingTime, saberBlockingTime); - ::sg_import(src.saberAnimLevel, saberAnimLevel); - ::sg_import(src.saberAttackChainCount, saberAttackChainCount); - ::sg_import(src.saberLockTime, saberLockTime); - ::sg_import(src.saberLockEnemy, saberLockEnemy); - ::sg_import(src.saberStylesKnown, saberStylesKnown); - -#ifdef JK2_MODE - ::sg_import(src.saberModel, saberModel); -#endif - - ::sg_import(src.forcePowersKnown, forcePowersKnown); - ::sg_import(src.forcePowerDuration, forcePowerDuration); - ::sg_import(src.forcePowerDebounce, forcePowerDebounce); - ::sg_import(src.forcePower, forcePower); - ::sg_import(src.forcePowerMax, forcePowerMax); - ::sg_import(src.forcePowerRegenDebounceTime, forcePowerRegenDebounceTime); - ::sg_import(src.forcePowerRegenRate, forcePowerRegenRate); - ::sg_import(src.forcePowerRegenAmount, forcePowerRegenAmount); - ::sg_import(src.forcePowerLevel, forcePowerLevel); - ::sg_import(src.forceJumpZStart, forceJumpZStart); - ::sg_import(src.forceJumpCharge, forceJumpCharge); - ::sg_import(src.forceGripEntityNum, forceGripEntityNum); - ::sg_import(src.forceGripOrg, forceGripOrg); - ::sg_import(src.forceDrainEntityNum, forceDrainEntityNum); - ::sg_import(src.forceDrainOrg, forceDrainOrg); - ::sg_import(src.forceHealCount, forceHealCount); - ::sg_import(src.forceAllowDeactivateTime, forceAllowDeactivateTime); - ::sg_import(src.forceRageDrainTime, forceRageDrainTime); - ::sg_import(src.forceRageRecoveryTime, forceRageRecoveryTime); - ::sg_import(src.forceDrainEntNum, forceDrainEntNum); - ::sg_import(src.forceDrainTime, forceDrainTime); - ::sg_import(src.forcePowersForced, forcePowersForced); - ::sg_import(src.pullAttackEntNum, pullAttackEntNum); - ::sg_import(src.pullAttackTime, pullAttackTime); - ::sg_import(src.lastKickedEntNum, lastKickedEntNum); - ::sg_import(src.taunting, taunting); - ::sg_import(src.jumpZStart, jumpZStart); - ::sg_import(src.moveDir, moveDir); - ::sg_import(src.waterheight, waterheight); - ::sg_import(src.waterHeightLevel, waterHeightLevel); - ::sg_import(src.ikStatus, ikStatus); - ::sg_import(src.heldClient, heldClient); - ::sg_import(src.heldByClient, heldByClient); - ::sg_import(src.heldByBolt, heldByBolt); - ::sg_import(src.heldByBone, heldByBone); - ::sg_import(src.vehTurnaroundIndex, vehTurnaroundIndex); - ::sg_import(src.vehTurnaroundTime, vehTurnaroundTime); - ::sg_import(src.brokenLimbs, brokenLimbs); - ::sg_import(src.electrifyTime, electrifyTime); - } + const SgType& src); } playerState_t; //==================================================================== @@ -3283,30 +2709,10 @@ typedef struct usercmd_s { void sg_export( - SgType& dst) const - { - ::sg_export(serverTime, dst.serverTime); - ::sg_export(buttons, dst.buttons); - ::sg_export(weapon, dst.weapon); - ::sg_export(angles, dst.angles); - ::sg_export(generic_cmd, dst.generic_cmd); - ::sg_export(forwardmove, dst.forwardmove); - ::sg_export(rightmove, dst.rightmove); - ::sg_export(upmove, dst.upmove); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.serverTime, serverTime); - ::sg_import(src.buttons, buttons); - ::sg_import(src.weapon, weapon); - ::sg_import(src.angles, angles); - ::sg_import(src.generic_cmd, generic_cmd); - ::sg_import(src.forwardmove, forwardmove); - ::sg_import(src.rightmove, rightmove); - ::sg_import(src.upmove, upmove); - } + const SgType& src); } usercmd_t; //=================================================================== @@ -3348,24 +2754,10 @@ typedef struct {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! void sg_export( - SgType& dst) const - { - ::sg_export(trType, dst.trType); - ::sg_export(trTime, dst.trTime); - ::sg_export(trDuration, dst.trDuration); - ::sg_export(trBase, dst.trBase); - ::sg_export(trDelta, dst.trDelta); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.trType, trType); - ::sg_import(src.trTime, trTime); - ::sg_import(src.trDuration, trDuration); - ::sg_import(src.trBase, trBase); - ::sg_import(src.trDelta, trDelta); - } + const SgType& src); } trajectory_t; @@ -3505,104 +2897,10 @@ Ghoul2 Insert End void sg_export( - SgType& dst) const - { - ::sg_export(number, dst.number); - ::sg_export(eType, dst.eType); - ::sg_export(eFlags, dst.eFlags); - ::sg_export(pos, dst.pos); - ::sg_export(apos, dst.apos); - ::sg_export(time, dst.time); - ::sg_export(time2, dst.time2); - ::sg_export(origin, dst.origin); - ::sg_export(origin2, dst.origin2); - ::sg_export(angles, dst.angles); - ::sg_export(angles2, dst.angles2); - ::sg_export(otherEntityNum, dst.otherEntityNum); - ::sg_export(otherEntityNum2, dst.otherEntityNum2); - ::sg_export(groundEntityNum, dst.groundEntityNum); - ::sg_export(constantLight, dst.constantLight); - ::sg_export(loopSound, dst.loopSound); - ::sg_export(modelindex, dst.modelindex); - ::sg_export(modelindex2, dst.modelindex2); - ::sg_export(modelindex3, dst.modelindex3); - ::sg_export(clientNum, dst.clientNum); - ::sg_export(frame, dst.frame); - ::sg_export(solid, dst.solid); - ::sg_export(event, dst.event); - ::sg_export(eventParm, dst.eventParm); - ::sg_export(powerups, dst.powerups); - ::sg_export(weapon, dst.weapon); - ::sg_export(legsAnim, dst.legsAnim); - ::sg_export(legsAnimTimer, dst.legsAnimTimer); - ::sg_export(torsoAnim, dst.torsoAnim); - ::sg_export(torsoAnimTimer, dst.torsoAnimTimer); - ::sg_export(scale, dst.scale); - ::sg_export(saberInFlight, dst.saberInFlight); - ::sg_export(saberActive, dst.saberActive); - -#ifdef JK2_MODE - ::sg_export(vehicleModel, dst.vehicleModel); -#endif - - ::sg_export(vehicleAngles, dst.vehicleAngles); - ::sg_export(vehicleArmor, dst.vehicleArmor); - ::sg_export(m_iVehicleNum, dst.m_iVehicleNum); - ::sg_export(modelScale, dst.modelScale); - ::sg_export(radius, dst.radius); - ::sg_export(boltInfo, dst.boltInfo); - ::sg_export(isPortalEnt, dst.isPortalEnt); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.number, number); - ::sg_import(src.eType, eType); - ::sg_import(src.eFlags, eFlags); - ::sg_import(src.pos, pos); - ::sg_import(src.apos, apos); - ::sg_import(src.time, time); - ::sg_import(src.time2, time2); - ::sg_import(src.origin, origin); - ::sg_import(src.origin2, origin2); - ::sg_import(src.angles, angles); - ::sg_import(src.angles2, angles2); - ::sg_import(src.otherEntityNum, otherEntityNum); - ::sg_import(src.otherEntityNum2, otherEntityNum2); - ::sg_import(src.groundEntityNum, groundEntityNum); - ::sg_import(src.constantLight, constantLight); - ::sg_import(src.loopSound, loopSound); - ::sg_import(src.modelindex, modelindex); - ::sg_import(src.modelindex2, modelindex2); - ::sg_import(src.modelindex3, modelindex3); - ::sg_import(src.clientNum, clientNum); - ::sg_import(src.frame, frame); - ::sg_import(src.solid, solid); - ::sg_import(src.event, event); - ::sg_import(src.eventParm, eventParm); - ::sg_import(src.powerups, powerups); - ::sg_import(src.weapon, weapon); - ::sg_import(src.legsAnim, legsAnim); - ::sg_import(src.legsAnimTimer, legsAnimTimer); - ::sg_import(src.torsoAnim, torsoAnim); - ::sg_import(src.torsoAnimTimer, torsoAnimTimer); - ::sg_import(src.scale, scale); - ::sg_import(src.saberInFlight, saberInFlight); - ::sg_import(src.saberActive, saberActive); - -#ifdef JK2_MODE - ::sg_import(src.vehicleModel, vehicleModel); -#endif - - ::sg_import(src.vehicleAngles, vehicleAngles); - ::sg_import(src.vehicleArmor, vehicleArmor); - ::sg_import(src.m_iVehicleNum, m_iVehicleNum); - ::sg_import(src.modelScale, modelScale); - ::sg_import(src.radius, radius); - ::sg_import(src.boltInfo, boltInfo); - ::sg_import(src.isPortalEnt, isPortalEnt); - } + const SgType& src); } entityState_t; diff --git a/code/rd-common/ghoul2_shared.cpp b/code/rd-common/ghoul2_shared.cpp new file mode 100644 index 0000000000..8ec2602b42 --- /dev/null +++ b/code/rd-common/ghoul2_shared.cpp @@ -0,0 +1,246 @@ +#include "qcommon/q_shared.h" +#include "../game/ghoul2_shared.h" +#include "qcommon/ojk_sg_wrappers.h" + + +void surfaceInfo_t::sg_export( + SgType& dst) const +{ + ::sg_export(offFlags, dst.offFlags); + ::sg_export(surface, dst.surface); + ::sg_export(genBarycentricJ, dst.genBarycentricJ); + ::sg_export(genBarycentricI, dst.genBarycentricI); + ::sg_export(genPolySurfaceIndex, dst.genPolySurfaceIndex); + ::sg_export(genLod, dst.genLod); +} + +void surfaceInfo_t::sg_import( + const SgType& src) +{ + ::sg_import(src.offFlags, offFlags); + ::sg_import(src.surface, surface); + ::sg_import(src.genBarycentricJ, genBarycentricJ); + ::sg_import(src.genBarycentricI, genBarycentricI); + ::sg_import(src.genPolySurfaceIndex, genPolySurfaceIndex); + ::sg_import(src.genLod, genLod); +} + + +void boneInfo_t::sg_export( + SgType& dst) const +{ + ::sg_export(boneNumber, dst.boneNumber); + ::sg_export(matrix, dst.matrix); + ::sg_export(flags, dst.flags); + ::sg_export(startFrame, dst.startFrame); + ::sg_export(endFrame, dst.endFrame); + ::sg_export(startTime, dst.startTime); + ::sg_export(pauseTime, dst.pauseTime); + ::sg_export(animSpeed, dst.animSpeed); + ::sg_export(blendFrame, dst.blendFrame); + ::sg_export(blendLerpFrame, dst.blendLerpFrame); + ::sg_export(blendTime, dst.blendTime); + ::sg_export(blendStart, dst.blendStart); + ::sg_export(boneBlendTime, dst.boneBlendTime); + ::sg_export(boneBlendStart, dst.boneBlendStart); + ::sg_export(newMatrix, dst.newMatrix); + ::sg_export(lastTimeUpdated, dst.lastTimeUpdated); + ::sg_export(lastContents, dst.lastContents); + ::sg_export(lastPosition, dst.lastPosition); + ::sg_export(velocityEffector, dst.velocityEffector); + ::sg_export(lastAngles, dst.lastAngles); + ::sg_export(minAngles, dst.minAngles); + ::sg_export(maxAngles, dst.maxAngles); + ::sg_export(currentAngles, dst.currentAngles); + ::sg_export(anglesOffset, dst.anglesOffset); + ::sg_export(positionOffset, dst.positionOffset); + ::sg_export(radius, dst.radius); + ::sg_export(weight, dst.weight); + ::sg_export(ragIndex, dst.ragIndex); + ::sg_export(velocityRoot, dst.velocityRoot); + ::sg_export(ragStartTime, dst.ragStartTime); + ::sg_export(firstTime, dst.firstTime); + ::sg_export(firstCollisionTime, dst.firstCollisionTime); + ::sg_export(restTime, dst.restTime); + ::sg_export(RagFlags, dst.RagFlags); + ::sg_export(DependentRagIndexMask, dst.DependentRagIndexMask); + ::sg_export(originalTrueBoneMatrix, dst.originalTrueBoneMatrix); + ::sg_export(parentTrueBoneMatrix, dst.parentTrueBoneMatrix); + ::sg_export(parentOriginalTrueBoneMatrix, dst.parentOriginalTrueBoneMatrix); + ::sg_export(originalOrigin, dst.originalOrigin); + ::sg_export(originalAngles, dst.originalAngles); + ::sg_export(lastShotDir, dst.lastShotDir); + ::sg_export(basepose, dst.basepose); + ::sg_export(baseposeInv, dst.baseposeInv); + ::sg_export(baseposeParent, dst.baseposeParent); + ::sg_export(baseposeInvParent, dst.baseposeInvParent); + ::sg_export(parentRawBoneIndex, dst.parentRawBoneIndex); + ::sg_export(ragOverrideMatrix, dst.ragOverrideMatrix); + ::sg_export(extraMatrix, dst.extraMatrix); + ::sg_export(extraVec1, dst.extraVec1); + ::sg_export(extraFloat1, dst.extraFloat1); + ::sg_export(extraInt1, dst.extraInt1); + ::sg_export(ikPosition, dst.ikPosition); + ::sg_export(ikSpeed, dst.ikSpeed); + ::sg_export(epVelocity, dst.epVelocity); + ::sg_export(epGravFactor, dst.epGravFactor); + ::sg_export(solidCount, dst.solidCount); + ::sg_export(physicsSettled, dst.physicsSettled); + ::sg_export(snapped, dst.snapped); + ::sg_export(parentBoneIndex, dst.parentBoneIndex); + ::sg_export(offsetRotation, dst.offsetRotation); + ::sg_export(overGradSpeed, dst.overGradSpeed); + ::sg_export(overGoalSpot, dst.overGoalSpot); + ::sg_export(hasOverGoal, dst.hasOverGoal); + ::sg_export(animFrameMatrix, dst.animFrameMatrix); + ::sg_export(hasAnimFrameMatrix, dst.hasAnimFrameMatrix); + ::sg_export(airTime, dst.airTime); +} + +void boneInfo_t::sg_import( + const SgType& src) +{ + ::sg_import(src.boneNumber, boneNumber); + ::sg_import(src.matrix, matrix); + ::sg_import(src.flags, flags); + ::sg_import(src.startFrame, startFrame); + ::sg_import(src.endFrame, endFrame); + ::sg_import(src.startTime, startTime); + ::sg_import(src.pauseTime, pauseTime); + ::sg_import(src.animSpeed, animSpeed); + ::sg_import(src.blendFrame, blendFrame); + ::sg_import(src.blendLerpFrame, blendLerpFrame); + ::sg_import(src.blendTime, blendTime); + ::sg_import(src.blendStart, blendStart); + ::sg_import(src.boneBlendTime, boneBlendTime); + ::sg_import(src.boneBlendStart, boneBlendStart); + ::sg_import(src.newMatrix, newMatrix); + ::sg_import(src.lastTimeUpdated, lastTimeUpdated); + ::sg_import(src.lastContents, lastContents); + ::sg_import(src.lastPosition, lastPosition); + ::sg_import(src.velocityEffector, velocityEffector); + ::sg_import(src.lastAngles, lastAngles); + ::sg_import(src.minAngles, minAngles); + ::sg_import(src.maxAngles, maxAngles); + ::sg_import(src.currentAngles, currentAngles); + ::sg_import(src.anglesOffset, anglesOffset); + ::sg_import(src.positionOffset, positionOffset); + ::sg_import(src.radius, radius); + ::sg_import(src.weight, weight); + ::sg_import(src.ragIndex, ragIndex); + ::sg_import(src.velocityRoot, velocityRoot); + ::sg_import(src.ragStartTime, ragStartTime); + ::sg_import(src.firstTime, firstTime); + ::sg_import(src.firstCollisionTime, firstCollisionTime); + ::sg_import(src.restTime, restTime); + ::sg_import(src.RagFlags, RagFlags); + ::sg_import(src.DependentRagIndexMask, DependentRagIndexMask); + ::sg_import(src.originalTrueBoneMatrix, originalTrueBoneMatrix); + ::sg_import(src.parentTrueBoneMatrix, parentTrueBoneMatrix); + ::sg_import(src.parentOriginalTrueBoneMatrix, parentOriginalTrueBoneMatrix); + ::sg_import(src.originalOrigin, originalOrigin); + ::sg_import(src.originalAngles, originalAngles); + ::sg_import(src.lastShotDir, lastShotDir); + ::sg_import(src.basepose, basepose); + ::sg_import(src.baseposeInv, baseposeInv); + ::sg_import(src.baseposeParent, baseposeParent); + ::sg_import(src.baseposeInvParent, baseposeInvParent); + ::sg_import(src.parentRawBoneIndex, parentRawBoneIndex); + ::sg_import(src.ragOverrideMatrix, ragOverrideMatrix); + ::sg_import(src.extraMatrix, extraMatrix); + ::sg_import(src.extraVec1, extraVec1); + ::sg_import(src.extraFloat1, extraFloat1); + ::sg_import(src.extraInt1, extraInt1); + ::sg_import(src.ikPosition, ikPosition); + ::sg_import(src.ikSpeed, ikSpeed); + ::sg_import(src.epVelocity, epVelocity); + ::sg_import(src.epGravFactor, epGravFactor); + ::sg_import(src.solidCount, solidCount); + ::sg_import(src.physicsSettled, physicsSettled); + ::sg_import(src.snapped, snapped); + ::sg_import(src.parentBoneIndex, parentBoneIndex); + ::sg_import(src.offsetRotation, offsetRotation); + ::sg_import(src.overGradSpeed, overGradSpeed); + ::sg_import(src.overGoalSpot, overGoalSpot); + ::sg_import(src.hasOverGoal, hasOverGoal); + ::sg_import(src.animFrameMatrix, animFrameMatrix); + ::sg_import(src.hasAnimFrameMatrix, hasAnimFrameMatrix); + ::sg_import(src.airTime, airTime); +} + + +void boltInfo_t::sg_export( + SgType& dst) const +{ + ::sg_export(boneNumber, dst.boneNumber); + ::sg_export(surfaceNumber, dst.surfaceNumber); + ::sg_export(surfaceType, dst.surfaceType); + ::sg_export(boltUsed, dst.boltUsed); +} + +void boltInfo_t::sg_import( + const SgType& src) +{ + ::sg_import(src.boneNumber, boneNumber); + ::sg_import(src.surfaceNumber, surfaceNumber); + ::sg_import(src.surfaceType, surfaceType); + ::sg_import(src.boltUsed, boltUsed); +} + + +void CGhoul2Info::sg_export( + SgType& dst) const +{ + ::sg_export(mModelindex, dst.mModelindex); + ::sg_export(animModelIndexOffset, dst.animModelIndexOffset); + ::sg_export(mCustomShader, dst.mCustomShader); + ::sg_export(mCustomSkin, dst.mCustomSkin); + ::sg_export(mModelBoltLink, dst.mModelBoltLink); + ::sg_export(mSurfaceRoot, dst.mSurfaceRoot); + ::sg_export(mLodBias, dst.mLodBias); + ::sg_export(mNewOrigin, dst.mNewOrigin); +#ifdef _G2_GORE + ::sg_export(mGoreSetTag, dst.mGoreSetTag); +#endif + ::sg_export(mModel, dst.mModel); + ::sg_export(mFileName, dst.mFileName); + ::sg_export(mAnimFrameDefault, dst.mAnimFrameDefault); + ::sg_export(mSkelFrameNum, dst.mSkelFrameNum); + ::sg_export(mMeshFrameNum, dst.mMeshFrameNum); + ::sg_export(mFlags, dst.mFlags); +} + +void CGhoul2Info::sg_import( + const SgType& src) +{ + ::sg_import(src.mModelindex, mModelindex); + ::sg_import(src.animModelIndexOffset, animModelIndexOffset); + ::sg_import(src.mCustomShader, mCustomShader); + ::sg_import(src.mCustomSkin, mCustomSkin); + ::sg_import(src.mModelBoltLink, mModelBoltLink); + ::sg_import(src.mSurfaceRoot, mSurfaceRoot); + ::sg_import(src.mLodBias, mLodBias); + ::sg_import(src.mNewOrigin, mNewOrigin); +#ifdef _G2_GORE + ::sg_import(src.mGoreSetTag, mGoreSetTag); +#endif + ::sg_import(src.mModel, mModel); + ::sg_import(src.mFileName, mFileName); + ::sg_import(src.mAnimFrameDefault, mAnimFrameDefault); + ::sg_import(src.mSkelFrameNum, mSkelFrameNum); + ::sg_import(src.mMeshFrameNum, mMeshFrameNum); + ::sg_import(src.mFlags, mFlags); +} + + +void CGhoul2Info_v::sg_export( + SgType& dst) const +{ + ::sg_export(mItem, dst.mItem); +} + +void CGhoul2Info_v::sg_import( + const SgType& src) +{ + ::sg_import(src.mItem, mItem); +} diff --git a/code/rd-common/mdx_format.cpp b/code/rd-common/mdx_format.cpp new file mode 100644 index 0000000000..8bfbc43ff0 --- /dev/null +++ b/code/rd-common/mdx_format.cpp @@ -0,0 +1,16 @@ +#include "qcommon/q_shared.h" +#include "mdx_format.h" +#include "qcommon/ojk_sg_wrappers.h" + + +void mdxaBone_t::sg_export( + SgType& dst) const +{ + ::sg_export(matrix, dst.matrix); +} + +void mdxaBone_t::sg_import( + const SgType& src) +{ + ::sg_import(src.matrix, matrix); +} diff --git a/code/rd-common/mdx_format.h b/code/rd-common/mdx_format.h index b569fc6a8d..d7c3736bba 100644 --- a/code/rd-common/mdx_format.h +++ b/code/rd-common/mdx_format.h @@ -178,16 +178,10 @@ typedef struct { #ifdef __cplusplus void sg_export( - SgType& dst) const - { - ::sg_export(matrix, dst.matrix); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.matrix, matrix); - } + const SgType& src); #endif // __cplusplus } mdxaBone_t; #endif diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index 0bbc8792cc..1de092be22 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -138,7 +138,9 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) set(SPRDVanillaFiles ${SPRDVanillaFiles} ${SPRDVanillaMainFiles}) set(SPRDVanillaRdCommonFiles + "${SPDir}/rd-common/ghoul2_shared.cpp" "${SPDir}/rd-common/mdx_format.h" + "${SPDir}/rd-common/mdx_format.cpp" "${SPDir}/rd-common/tr_common.h" "${SPDir}/rd-common/tr_font.cpp" "${SPDir}/rd-common/tr_font.h" diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index 9c8dc71daa..0ae0b1488d 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -129,11 +129,14 @@ set(JK2SPGameGameFiles "${JK2SPDir}/game/Q3_Interface.h" "${JK2SPDir}/game/Q3_Registers.h" "${JK2SPDir}/game/ai.h" + "${JK2SPDir}/game/ai.cpp" "${JK2SPDir}/game/anims.h" "${JK2SPDir}/game/b_local.h" "${JK2SPDir}/game/b_public.h" + "${JK2SPDir}/game/b_public.cpp" "${JK2SPDir}/game/bg_local.h" "${JK2SPDir}/game/bg_public.h" + "${JK2SPDir}/game/bg_public.cpp" "${JK2SPDir}/game/bset.h" "${JK2SPDir}/game/bstate.h" "${JK2SPDir}/game/channels.h" @@ -145,11 +148,13 @@ set(JK2SPGameGameFiles "${JK2SPDir}/game/g_icarus.h" "${JK2SPDir}/game/g_items.h" "${JK2SPDir}/game/g_local.h" + "${JK2SPDir}/game/g_local.cpp" "${JK2SPDir}/game/g_nav.h" "${JK2SPDir}/game/g_navigator.h" "${JK2SPDir}/game/g_public.h" "${JK2SPDir}/game/g_roff.h" "${JK2SPDir}/game/g_shared.h" + "${JK2SPDir}/game/g_shared.cpp" "${JK2SPDir}/game/genericparser2.h" "${JK2SPDir}/game/ghoul2_shared.h" "${JK2SPDir}/game/npc_headers.h" diff --git a/codeJK2/game/ai.cpp b/codeJK2/game/ai.cpp new file mode 100644 index 0000000000..aa46625336 --- /dev/null +++ b/codeJK2/game/ai.cpp @@ -0,0 +1,67 @@ +#include "../cgame/cg_local.h" +#include "ai.h" +#include "qcommon/ojk_sg_wrappers.h" + + +void AIGroupMember_t::sg_export( + SgType& dst) const +{ + ::sg_export(number, dst.number); + ::sg_export(waypoint, dst.waypoint); + ::sg_export(pathCostToEnemy, dst.pathCostToEnemy); + ::sg_export(closestBuddy, dst.closestBuddy); +} + +void AIGroupMember_t::sg_import( + const SgType& src) +{ + ::sg_import(src.number, number); + ::sg_import(src.waypoint, waypoint); + ::sg_import(src.pathCostToEnemy, pathCostToEnemy); + ::sg_import(src.closestBuddy, closestBuddy); +} + + +void AIGroupInfo_t::sg_export( + SgType& dst) const +{ + ::sg_export(numGroup, dst.numGroup); + ::sg_export(processed, dst.processed); + ::sg_export(team, dst.team); + ::sg_export(enemy, dst.enemy); + ::sg_export(enemyWP, dst.enemyWP); + ::sg_export(speechDebounceTime, dst.speechDebounceTime); + ::sg_export(lastClearShotTime, dst.lastClearShotTime); + ::sg_export(lastSeenEnemyTime, dst.lastSeenEnemyTime); + ::sg_export(morale, dst.morale); + ::sg_export(moraleAdjust, dst.moraleAdjust); + ::sg_export(moraleDebounce, dst.moraleDebounce); + ::sg_export(memberValidateTime, dst.memberValidateTime); + ::sg_export(activeMemberNum, dst.activeMemberNum); + ::sg_export(commander, dst.commander); + ::sg_export(enemyLastSeenPos, dst.enemyLastSeenPos); + ::sg_export(numState, dst.numState); + ::sg_export(member, dst.member); +} + +void AIGroupInfo_t::sg_import( + const SgType& src) +{ + ::sg_import(src.numGroup, numGroup); + ::sg_import(src.processed, processed); + ::sg_import(src.team, team); + ::sg_import(src.enemy, enemy); + ::sg_import(src.enemyWP, enemyWP); + ::sg_import(src.speechDebounceTime, speechDebounceTime); + ::sg_import(src.lastClearShotTime, lastClearShotTime); + ::sg_import(src.lastSeenEnemyTime, lastSeenEnemyTime); + ::sg_import(src.morale, morale); + ::sg_import(src.moraleAdjust, moraleAdjust); + ::sg_import(src.moraleDebounce, moraleDebounce); + ::sg_import(src.memberValidateTime, memberValidateTime); + ::sg_import(src.activeMemberNum, activeMemberNum); + ::sg_import(src.commander, commander); + ::sg_import(src.enemyLastSeenPos, enemyLastSeenPos); + ::sg_import(src.numState, numState); + ::sg_import(src.member, member); +} diff --git a/codeJK2/game/ai.h b/codeJK2/game/ai.h index 48d3a5c407..38c13cca3a 100644 --- a/codeJK2/game/ai.h +++ b/codeJK2/game/ai.h @@ -128,22 +128,10 @@ typedef struct AIGroupMember_s void sg_export( - SgType& dst) const - { - ::sg_export(number, dst.number); - ::sg_export(waypoint, dst.waypoint); - ::sg_export(pathCostToEnemy, dst.pathCostToEnemy); - ::sg_export(closestBuddy, dst.closestBuddy); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.number, number); - ::sg_import(src.waypoint, waypoint); - ::sg_import(src.pathCostToEnemy, pathCostToEnemy); - ::sg_import(src.closestBuddy, closestBuddy); - } + const SgType& src); } AIGroupMember_t; #define MAX_GROUP_MEMBERS 32 @@ -197,48 +185,10 @@ typedef struct AIGroupInfo_s void sg_export( - SgType& dst) const - { - ::sg_export(numGroup, dst.numGroup); - ::sg_export(processed, dst.processed); - ::sg_export(team, dst.team); - ::sg_export(enemy, dst.enemy); - ::sg_export(enemyWP, dst.enemyWP); - ::sg_export(speechDebounceTime, dst.speechDebounceTime); - ::sg_export(lastClearShotTime, dst.lastClearShotTime); - ::sg_export(lastSeenEnemyTime, dst.lastSeenEnemyTime); - ::sg_export(morale, dst.morale); - ::sg_export(moraleAdjust, dst.moraleAdjust); - ::sg_export(moraleDebounce, dst.moraleDebounce); - ::sg_export(memberValidateTime, dst.memberValidateTime); - ::sg_export(activeMemberNum, dst.activeMemberNum); - ::sg_export(commander, dst.commander); - ::sg_export(enemyLastSeenPos, dst.enemyLastSeenPos); - ::sg_export(numState, dst.numState); - ::sg_export(member, dst.member); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.numGroup, numGroup); - ::sg_import(src.processed, processed); - ::sg_import(src.team, team); - ::sg_import(src.enemy, enemy); - ::sg_import(src.enemyWP, enemyWP); - ::sg_import(src.speechDebounceTime, speechDebounceTime); - ::sg_import(src.lastClearShotTime, lastClearShotTime); - ::sg_import(src.lastSeenEnemyTime, lastSeenEnemyTime); - ::sg_import(src.morale, morale); - ::sg_import(src.moraleAdjust, moraleAdjust); - ::sg_import(src.moraleDebounce, moraleDebounce); - ::sg_import(src.memberValidateTime, memberValidateTime); - ::sg_import(src.activeMemberNum, activeMemberNum); - ::sg_import(src.commander, commander); - ::sg_import(src.enemyLastSeenPos, enemyLastSeenPos); - ::sg_import(src.numState, numState); - ::sg_import(src.member, member); - } + const SgType& src); } AIGroupInfo_t; int AI_GetGroupSize( vec3_t origin, int radius, team_t playerTeam, gentity_t *avoid = NULL ); diff --git a/codeJK2/game/b_public.cpp b/codeJK2/game/b_public.cpp new file mode 100644 index 0000000000..21a9cc1565 --- /dev/null +++ b/codeJK2/game/b_public.cpp @@ -0,0 +1,259 @@ +#include "b_local.h" +#include "b_public.h" +#include "qcommon/ojk_sg_wrappers.h" + + +void gNPCstats_t::sg_export( + SgType& dst) const +{ + ::sg_export(aggression, dst.aggression); + ::sg_export(aim, dst.aim); + ::sg_export(earshot, dst.earshot); + ::sg_export(evasion, dst.evasion); + ::sg_export(hfov, dst.hfov); + ::sg_export(intelligence, dst.intelligence); + ::sg_export(move, dst.move); + ::sg_export(reactions, dst.reactions); + ::sg_export(shootDistance, dst.shootDistance); + ::sg_export(vfov, dst.vfov); + ::sg_export(vigilance, dst.vigilance); + ::sg_export(visrange, dst.visrange); + ::sg_export(moveType, dst.moveType); + ::sg_export(runSpeed, dst.runSpeed); + ::sg_export(walkSpeed, dst.walkSpeed); + ::sg_export(yawSpeed, dst.yawSpeed); + ::sg_export(health, dst.health); + ::sg_export(acceleration, dst.acceleration); +} + +void gNPCstats_t::sg_import( + const SgType& src) +{ + ::sg_import(src.aggression, aggression); + ::sg_import(src.aim, aim); + ::sg_import(src.earshot, earshot); + ::sg_import(src.evasion, evasion); + ::sg_import(src.hfov, hfov); + ::sg_import(src.intelligence, intelligence); + ::sg_import(src.move, move); + ::sg_import(src.reactions, reactions); + ::sg_import(src.shootDistance, shootDistance); + ::sg_import(src.vfov, vfov); + ::sg_import(src.vigilance, vigilance); + ::sg_import(src.visrange, visrange); + ::sg_import(src.moveType, moveType); + ::sg_import(src.runSpeed, runSpeed); + ::sg_import(src.walkSpeed, walkSpeed); + ::sg_import(src.yawSpeed, yawSpeed); + ::sg_import(src.health, health); + ::sg_import(src.acceleration, acceleration); +} + + +void gNPC_t::sg_export( + SgType& dst) const +{ + ::sg_export(timeOfDeath, dst.timeOfDeath); + ::sg_export(touchedByPlayer, dst.touchedByPlayer); + ::sg_export(enemyLastVisibility, dst.enemyLastVisibility); + ::sg_export(aimTime, dst.aimTime); + ::sg_export(desiredYaw, dst.desiredYaw); + ::sg_export(desiredPitch, dst.desiredPitch); + ::sg_export(lockedDesiredYaw, dst.lockedDesiredYaw); + ::sg_export(lockedDesiredPitch, dst.lockedDesiredPitch); + ::sg_export(aimingBeam, dst.aimingBeam); + ::sg_export(enemyLastSeenLocation, dst.enemyLastSeenLocation); + ::sg_export(enemyLastSeenTime, dst.enemyLastSeenTime); + ::sg_export(enemyLastHeardLocation, dst.enemyLastHeardLocation); + ::sg_export(enemyLastHeardTime, dst.enemyLastHeardTime); + ::sg_export(lastAlertID, dst.lastAlertID); + ::sg_export(eFlags, dst.eFlags); + ::sg_export(aiFlags, dst.aiFlags); + ::sg_export(currentAmmo, dst.currentAmmo); + ::sg_export(shotTime, dst.shotTime); + ::sg_export(burstCount, dst.burstCount); + ::sg_export(burstMin, dst.burstMin); + ::sg_export(burstMean, dst.burstMean); + ::sg_export(burstMax, dst.burstMax); + ::sg_export(burstSpacing, dst.burstSpacing); + ::sg_export(attackHold, dst.attackHold); + ::sg_export(attackHoldTime, dst.attackHoldTime); + ::sg_export(shootAngles, dst.shootAngles); + ::sg_export(rank, dst.rank); + ::sg_export(behaviorState, dst.behaviorState); + ::sg_export(defaultBehavior, dst.defaultBehavior); + ::sg_export(tempBehavior, dst.tempBehavior); + ::sg_export(ignorePain, dst.ignorePain); + ::sg_export(duckDebounceTime, dst.duckDebounceTime); + ::sg_export(walkDebounceTime, dst.walkDebounceTime); + ::sg_export(enemyCheckDebounceTime, dst.enemyCheckDebounceTime); + ::sg_export(investigateDebounceTime, dst.investigateDebounceTime); + ::sg_export(investigateCount, dst.investigateCount); + ::sg_export(investigateGoal, dst.investigateGoal); + ::sg_export(investigateSoundDebounceTime, dst.investigateSoundDebounceTime); + ::sg_export(greetingDebounceTime, dst.greetingDebounceTime); + ::sg_export(eventOwner, dst.eventOwner); + ::sg_export(coverTarg, dst.coverTarg); + ::sg_export(jumpState, dst.jumpState); + ::sg_export(followDist, dst.followDist); + ::sg_export(tempGoal, dst.tempGoal); + ::sg_export(goalEntity, dst.goalEntity); + ::sg_export(lastGoalEntity, dst.lastGoalEntity); + ::sg_export(eventualGoal, dst.eventualGoal); + ::sg_export(captureGoal, dst.captureGoal); + ::sg_export(defendEnt, dst.defendEnt); + ::sg_export(greetEnt, dst.greetEnt); + ::sg_export(goalTime, dst.goalTime); + ::sg_export(straightToGoal, dst.straightToGoal); + ::sg_export(distToGoal, dst.distToGoal); + ::sg_export(navTime, dst.navTime); + ::sg_export(blockingEntNum, dst.blockingEntNum); + ::sg_export(blockedSpeechDebounceTime, dst.blockedSpeechDebounceTime); + ::sg_export(lastSideStepSide, dst.lastSideStepSide); + ::sg_export(sideStepHoldTime, dst.sideStepHoldTime); + ::sg_export(homeWp, dst.homeWp); + ::sg_export(group, dst.group); + ::sg_export(lastPathAngles, dst.lastPathAngles); + ::sg_export(stats, dst.stats); + ::sg_export(aimErrorDebounceTime, dst.aimErrorDebounceTime); + ::sg_export(lastAimErrorYaw, dst.lastAimErrorYaw); + ::sg_export(lastAimErrorPitch, dst.lastAimErrorPitch); + ::sg_export(aimOfs, dst.aimOfs); + ::sg_export(currentAim, dst.currentAim); + ::sg_export(currentAggression, dst.currentAggression); + ::sg_export(scriptFlags, dst.scriptFlags); + ::sg_export(desiredSpeed, dst.desiredSpeed); + ::sg_export(currentSpeed, dst.currentSpeed); + ::sg_export(last_forwardmove, dst.last_forwardmove); + ::sg_export(last_rightmove, dst.last_rightmove); + ::sg_export(lastClearOrigin, dst.lastClearOrigin); + ::sg_export(consecutiveBlockedMoves, dst.consecutiveBlockedMoves); + ::sg_export(blockedDebounceTime, dst.blockedDebounceTime); + ::sg_export(shoveCount, dst.shoveCount); + ::sg_export(blockedDest, dst.blockedDest); + ::sg_export(combatPoint, dst.combatPoint); + ::sg_export(lastFailedCombatPoint, dst.lastFailedCombatPoint); + ::sg_export(movementSpeech, dst.movementSpeech); + ::sg_export(movementSpeechChance, dst.movementSpeechChance); + ::sg_export(nextBStateThink, dst.nextBStateThink); + ::sg_export(last_ucmd, dst.last_ucmd); + ::sg_export(combatMove, dst.combatMove); + ::sg_export(goalRadius, dst.goalRadius); + ::sg_export(pauseTime, dst.pauseTime); + ::sg_export(standTime, dst.standTime); + ::sg_export(localState, dst.localState); + ::sg_export(squadState, dst.squadState); + ::sg_export(confusionTime, dst.confusionTime); + ::sg_export(charmedTime, dst.charmedTime); + ::sg_export(controlledTime, dst.controlledTime); + ::sg_export(surrenderTime, dst.surrenderTime); + ::sg_export(enemyLaggedPos, dst.enemyLaggedPos); + ::sg_export(watchTarget, dst.watchTarget); + ::sg_export(ffireCount, dst.ffireCount); + ::sg_export(ffireDebounce, dst.ffireDebounce); + ::sg_export(ffireFadeDebounce, dst.ffireFadeDebounce); +} + +void gNPC_t::sg_import( + const SgType& src) +{ + ::sg_import(src.timeOfDeath, timeOfDeath); + ::sg_import(src.touchedByPlayer, touchedByPlayer); + ::sg_import(src.enemyLastVisibility, enemyLastVisibility); + ::sg_import(src.aimTime, aimTime); + ::sg_import(src.desiredYaw, desiredYaw); + ::sg_import(src.desiredPitch, desiredPitch); + ::sg_import(src.lockedDesiredYaw, lockedDesiredYaw); + ::sg_import(src.lockedDesiredPitch, lockedDesiredPitch); + ::sg_import(src.aimingBeam, aimingBeam); + ::sg_import(src.enemyLastSeenLocation, enemyLastSeenLocation); + ::sg_import(src.enemyLastSeenTime, enemyLastSeenTime); + ::sg_import(src.enemyLastHeardLocation, enemyLastHeardLocation); + ::sg_import(src.enemyLastHeardTime, enemyLastHeardTime); + ::sg_import(src.lastAlertID, lastAlertID); + ::sg_import(src.eFlags, eFlags); + ::sg_import(src.aiFlags, aiFlags); + ::sg_import(src.currentAmmo, currentAmmo); + ::sg_import(src.shotTime, shotTime); + ::sg_import(src.burstCount, burstCount); + ::sg_import(src.burstMin, burstMin); + ::sg_import(src.burstMean, burstMean); + ::sg_import(src.burstMax, burstMax); + ::sg_import(src.burstSpacing, burstSpacing); + ::sg_import(src.attackHold, attackHold); + ::sg_import(src.attackHoldTime, attackHoldTime); + ::sg_import(src.shootAngles, shootAngles); + ::sg_import(src.rank, rank); + ::sg_import(src.behaviorState, behaviorState); + ::sg_import(src.defaultBehavior, defaultBehavior); + ::sg_import(src.tempBehavior, tempBehavior); + ::sg_import(src.ignorePain, ignorePain); + ::sg_import(src.duckDebounceTime, duckDebounceTime); + ::sg_import(src.walkDebounceTime, walkDebounceTime); + ::sg_import(src.enemyCheckDebounceTime, enemyCheckDebounceTime); + ::sg_import(src.investigateDebounceTime, investigateDebounceTime); + ::sg_import(src.investigateCount, investigateCount); + ::sg_import(src.investigateGoal, investigateGoal); + ::sg_import(src.investigateSoundDebounceTime, investigateSoundDebounceTime); + ::sg_import(src.greetingDebounceTime, greetingDebounceTime); + ::sg_import(src.eventOwner, eventOwner); + ::sg_import(src.coverTarg, coverTarg); + ::sg_import(src.jumpState, jumpState); + ::sg_import(src.followDist, followDist); + ::sg_import(src.tempGoal, tempGoal); + ::sg_import(src.goalEntity, goalEntity); + ::sg_import(src.lastGoalEntity, lastGoalEntity); + ::sg_import(src.eventualGoal, eventualGoal); + ::sg_import(src.captureGoal, captureGoal); + ::sg_import(src.defendEnt, defendEnt); + ::sg_import(src.greetEnt, greetEnt); + ::sg_import(src.goalTime, goalTime); + ::sg_import(src.straightToGoal, straightToGoal); + ::sg_import(src.distToGoal, distToGoal); + ::sg_import(src.navTime, navTime); + ::sg_import(src.blockingEntNum, blockingEntNum); + ::sg_import(src.blockedSpeechDebounceTime, blockedSpeechDebounceTime); + ::sg_import(src.lastSideStepSide, lastSideStepSide); + ::sg_import(src.sideStepHoldTime, sideStepHoldTime); + ::sg_import(src.homeWp, homeWp); + ::sg_import(src.group, group); + ::sg_import(src.lastPathAngles, lastPathAngles); + ::sg_import(src.stats, stats); + ::sg_import(src.aimErrorDebounceTime, aimErrorDebounceTime); + ::sg_import(src.lastAimErrorYaw, lastAimErrorYaw); + ::sg_import(src.lastAimErrorPitch, lastAimErrorPitch); + ::sg_import(src.aimOfs, aimOfs); + ::sg_import(src.currentAim, currentAim); + ::sg_import(src.currentAggression, currentAggression); + ::sg_import(src.scriptFlags, scriptFlags); + ::sg_import(src.desiredSpeed, desiredSpeed); + ::sg_import(src.currentSpeed, currentSpeed); + ::sg_import(src.last_forwardmove, last_forwardmove); + ::sg_import(src.last_rightmove, last_rightmove); + ::sg_import(src.lastClearOrigin, lastClearOrigin); + ::sg_import(src.consecutiveBlockedMoves, consecutiveBlockedMoves); + ::sg_import(src.blockedDebounceTime, blockedDebounceTime); + ::sg_import(src.shoveCount, shoveCount); + ::sg_import(src.blockedDest, blockedDest); + ::sg_import(src.combatPoint, combatPoint); + ::sg_import(src.lastFailedCombatPoint, lastFailedCombatPoint); + ::sg_import(src.movementSpeech, movementSpeech); + ::sg_import(src.movementSpeechChance, movementSpeechChance); + ::sg_import(src.nextBStateThink, nextBStateThink); + ::sg_import(src.last_ucmd, last_ucmd); + ::sg_import(src.combatMove, combatMove); + ::sg_import(src.goalRadius, goalRadius); + ::sg_import(src.pauseTime, pauseTime); + ::sg_import(src.standTime, standTime); + ::sg_import(src.localState, localState); + ::sg_import(src.squadState, squadState); + ::sg_import(src.confusionTime, confusionTime); + ::sg_import(src.charmedTime, charmedTime); + ::sg_import(src.controlledTime, controlledTime); + ::sg_import(src.surrenderTime, surrenderTime); + ::sg_import(src.enemyLaggedPos, enemyLaggedPos); + ::sg_import(src.watchTarget, watchTarget); + ::sg_import(src.ffireCount, ffireCount); + ::sg_import(src.ffireDebounce, ffireDebounce); + ::sg_import(src.ffireFadeDebounce, ffireFadeDebounce); +} diff --git a/codeJK2/game/b_public.h b/codeJK2/game/b_public.h index 38ff023a3f..0e2626a0ce 100644 --- a/codeJK2/game/b_public.h +++ b/codeJK2/game/b_public.h @@ -167,50 +167,10 @@ typedef struct gNPCstats_e void sg_export( - SgType& dst) const - { - ::sg_export(aggression, dst.aggression); - ::sg_export(aim, dst.aim); - ::sg_export(earshot, dst.earshot); - ::sg_export(evasion, dst.evasion); - ::sg_export(hfov, dst.hfov); - ::sg_export(intelligence, dst.intelligence); - ::sg_export(move, dst.move); - ::sg_export(reactions, dst.reactions); - ::sg_export(shootDistance, dst.shootDistance); - ::sg_export(vfov, dst.vfov); - ::sg_export(vigilance, dst.vigilance); - ::sg_export(visrange, dst.visrange); - ::sg_export(moveType, dst.moveType); - ::sg_export(runSpeed, dst.runSpeed); - ::sg_export(walkSpeed, dst.walkSpeed); - ::sg_export(yawSpeed, dst.yawSpeed); - ::sg_export(health, dst.health); - ::sg_export(acceleration, dst.acceleration); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.aggression, aggression); - ::sg_import(src.aim, aim); - ::sg_import(src.earshot, earshot); - ::sg_import(src.evasion, evasion); - ::sg_import(src.hfov, hfov); - ::sg_import(src.intelligence, intelligence); - ::sg_import(src.move, move); - ::sg_import(src.reactions, reactions); - ::sg_import(src.shootDistance, shootDistance); - ::sg_import(src.vfov, vfov); - ::sg_import(src.vigilance, vigilance); - ::sg_import(src.visrange, visrange); - ::sg_import(src.moveType, moveType); - ::sg_import(src.runSpeed, runSpeed); - ::sg_import(src.walkSpeed, walkSpeed); - ::sg_import(src.yawSpeed, yawSpeed); - ::sg_import(src.health, health); - ::sg_import(src.acceleration, acceleration); - } + const SgType& src); } gNPCstats_t; // NOTE!!! If you add any ptr fields into this structure could you please tell me so I can update the load/save code? @@ -481,212 +441,10 @@ typedef struct void sg_export( - SgType& dst) const - { - ::sg_export(timeOfDeath, dst.timeOfDeath); - ::sg_export(touchedByPlayer, dst.touchedByPlayer); - ::sg_export(enemyLastVisibility, dst.enemyLastVisibility); - ::sg_export(aimTime, dst.aimTime); - ::sg_export(desiredYaw, dst.desiredYaw); - ::sg_export(desiredPitch, dst.desiredPitch); - ::sg_export(lockedDesiredYaw, dst.lockedDesiredYaw); - ::sg_export(lockedDesiredPitch, dst.lockedDesiredPitch); - ::sg_export(aimingBeam, dst.aimingBeam); - ::sg_export(enemyLastSeenLocation, dst.enemyLastSeenLocation); - ::sg_export(enemyLastSeenTime, dst.enemyLastSeenTime); - ::sg_export(enemyLastHeardLocation, dst.enemyLastHeardLocation); - ::sg_export(enemyLastHeardTime, dst.enemyLastHeardTime); - ::sg_export(lastAlertID, dst.lastAlertID); - ::sg_export(eFlags, dst.eFlags); - ::sg_export(aiFlags, dst.aiFlags); - ::sg_export(currentAmmo, dst.currentAmmo); - ::sg_export(shotTime, dst.shotTime); - ::sg_export(burstCount, dst.burstCount); - ::sg_export(burstMin, dst.burstMin); - ::sg_export(burstMean, dst.burstMean); - ::sg_export(burstMax, dst.burstMax); - ::sg_export(burstSpacing, dst.burstSpacing); - ::sg_export(attackHold, dst.attackHold); - ::sg_export(attackHoldTime, dst.attackHoldTime); - ::sg_export(shootAngles, dst.shootAngles); - ::sg_export(rank, dst.rank); - ::sg_export(behaviorState, dst.behaviorState); - ::sg_export(defaultBehavior, dst.defaultBehavior); - ::sg_export(tempBehavior, dst.tempBehavior); - ::sg_export(ignorePain, dst.ignorePain); - ::sg_export(duckDebounceTime, dst.duckDebounceTime); - ::sg_export(walkDebounceTime, dst.walkDebounceTime); - ::sg_export(enemyCheckDebounceTime, dst.enemyCheckDebounceTime); - ::sg_export(investigateDebounceTime, dst.investigateDebounceTime); - ::sg_export(investigateCount, dst.investigateCount); - ::sg_export(investigateGoal, dst.investigateGoal); - ::sg_export(investigateSoundDebounceTime, dst.investigateSoundDebounceTime); - ::sg_export(greetingDebounceTime, dst.greetingDebounceTime); - ::sg_export(eventOwner, dst.eventOwner); - ::sg_export(coverTarg, dst.coverTarg); - ::sg_export(jumpState, dst.jumpState); - ::sg_export(followDist, dst.followDist); - ::sg_export(tempGoal, dst.tempGoal); - ::sg_export(goalEntity, dst.goalEntity); - ::sg_export(lastGoalEntity, dst.lastGoalEntity); - ::sg_export(eventualGoal, dst.eventualGoal); - ::sg_export(captureGoal, dst.captureGoal); - ::sg_export(defendEnt, dst.defendEnt); - ::sg_export(greetEnt, dst.greetEnt); - ::sg_export(goalTime, dst.goalTime); - ::sg_export(straightToGoal, dst.straightToGoal); - ::sg_export(distToGoal, dst.distToGoal); - ::sg_export(navTime, dst.navTime); - ::sg_export(blockingEntNum, dst.blockingEntNum); - ::sg_export(blockedSpeechDebounceTime, dst.blockedSpeechDebounceTime); - ::sg_export(lastSideStepSide, dst.lastSideStepSide); - ::sg_export(sideStepHoldTime, dst.sideStepHoldTime); - ::sg_export(homeWp, dst.homeWp); - ::sg_export(group, dst.group); - ::sg_export(lastPathAngles, dst.lastPathAngles); - ::sg_export(stats, dst.stats); - ::sg_export(aimErrorDebounceTime, dst.aimErrorDebounceTime); - ::sg_export(lastAimErrorYaw, dst.lastAimErrorYaw); - ::sg_export(lastAimErrorPitch, dst.lastAimErrorPitch); - ::sg_export(aimOfs, dst.aimOfs); - ::sg_export(currentAim, dst.currentAim); - ::sg_export(currentAggression, dst.currentAggression); - ::sg_export(scriptFlags, dst.scriptFlags); - ::sg_export(desiredSpeed, dst.desiredSpeed); - ::sg_export(currentSpeed, dst.currentSpeed); - ::sg_export(last_forwardmove, dst.last_forwardmove); - ::sg_export(last_rightmove, dst.last_rightmove); - ::sg_export(lastClearOrigin, dst.lastClearOrigin); - ::sg_export(consecutiveBlockedMoves, dst.consecutiveBlockedMoves); - ::sg_export(blockedDebounceTime, dst.blockedDebounceTime); - ::sg_export(shoveCount, dst.shoveCount); - ::sg_export(blockedDest, dst.blockedDest); - ::sg_export(combatPoint, dst.combatPoint); - ::sg_export(lastFailedCombatPoint, dst.lastFailedCombatPoint); - ::sg_export(movementSpeech, dst.movementSpeech); - ::sg_export(movementSpeechChance, dst.movementSpeechChance); - ::sg_export(nextBStateThink, dst.nextBStateThink); - ::sg_export(last_ucmd, dst.last_ucmd); - ::sg_export(combatMove, dst.combatMove); - ::sg_export(goalRadius, dst.goalRadius); - ::sg_export(pauseTime, dst.pauseTime); - ::sg_export(standTime, dst.standTime); - ::sg_export(localState, dst.localState); - ::sg_export(squadState, dst.squadState); - ::sg_export(confusionTime, dst.confusionTime); - ::sg_export(charmedTime, dst.charmedTime); - ::sg_export(controlledTime, dst.controlledTime); - ::sg_export(surrenderTime, dst.surrenderTime); - ::sg_export(enemyLaggedPos, dst.enemyLaggedPos); - ::sg_export(watchTarget, dst.watchTarget); - ::sg_export(ffireCount, dst.ffireCount); - ::sg_export(ffireDebounce, dst.ffireDebounce); - ::sg_export(ffireFadeDebounce, dst.ffireFadeDebounce); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.timeOfDeath, timeOfDeath); - ::sg_import(src.touchedByPlayer, touchedByPlayer); - ::sg_import(src.enemyLastVisibility, enemyLastVisibility); - ::sg_import(src.aimTime, aimTime); - ::sg_import(src.desiredYaw, desiredYaw); - ::sg_import(src.desiredPitch, desiredPitch); - ::sg_import(src.lockedDesiredYaw, lockedDesiredYaw); - ::sg_import(src.lockedDesiredPitch, lockedDesiredPitch); - ::sg_import(src.aimingBeam, aimingBeam); - ::sg_import(src.enemyLastSeenLocation, enemyLastSeenLocation); - ::sg_import(src.enemyLastSeenTime, enemyLastSeenTime); - ::sg_import(src.enemyLastHeardLocation, enemyLastHeardLocation); - ::sg_import(src.enemyLastHeardTime, enemyLastHeardTime); - ::sg_import(src.lastAlertID, lastAlertID); - ::sg_import(src.eFlags, eFlags); - ::sg_import(src.aiFlags, aiFlags); - ::sg_import(src.currentAmmo, currentAmmo); - ::sg_import(src.shotTime, shotTime); - ::sg_import(src.burstCount, burstCount); - ::sg_import(src.burstMin, burstMin); - ::sg_import(src.burstMean, burstMean); - ::sg_import(src.burstMax, burstMax); - ::sg_import(src.burstSpacing, burstSpacing); - ::sg_import(src.attackHold, attackHold); - ::sg_import(src.attackHoldTime, attackHoldTime); - ::sg_import(src.shootAngles, shootAngles); - ::sg_import(src.rank, rank); - ::sg_import(src.behaviorState, behaviorState); - ::sg_import(src.defaultBehavior, defaultBehavior); - ::sg_import(src.tempBehavior, tempBehavior); - ::sg_import(src.ignorePain, ignorePain); - ::sg_import(src.duckDebounceTime, duckDebounceTime); - ::sg_import(src.walkDebounceTime, walkDebounceTime); - ::sg_import(src.enemyCheckDebounceTime, enemyCheckDebounceTime); - ::sg_import(src.investigateDebounceTime, investigateDebounceTime); - ::sg_import(src.investigateCount, investigateCount); - ::sg_import(src.investigateGoal, investigateGoal); - ::sg_import(src.investigateSoundDebounceTime, investigateSoundDebounceTime); - ::sg_import(src.greetingDebounceTime, greetingDebounceTime); - ::sg_import(src.eventOwner, eventOwner); - ::sg_import(src.coverTarg, coverTarg); - ::sg_import(src.jumpState, jumpState); - ::sg_import(src.followDist, followDist); - ::sg_import(src.tempGoal, tempGoal); - ::sg_import(src.goalEntity, goalEntity); - ::sg_import(src.lastGoalEntity, lastGoalEntity); - ::sg_import(src.eventualGoal, eventualGoal); - ::sg_import(src.captureGoal, captureGoal); - ::sg_import(src.defendEnt, defendEnt); - ::sg_import(src.greetEnt, greetEnt); - ::sg_import(src.goalTime, goalTime); - ::sg_import(src.straightToGoal, straightToGoal); - ::sg_import(src.distToGoal, distToGoal); - ::sg_import(src.navTime, navTime); - ::sg_import(src.blockingEntNum, blockingEntNum); - ::sg_import(src.blockedSpeechDebounceTime, blockedSpeechDebounceTime); - ::sg_import(src.lastSideStepSide, lastSideStepSide); - ::sg_import(src.sideStepHoldTime, sideStepHoldTime); - ::sg_import(src.homeWp, homeWp); - ::sg_import(src.group, group); - ::sg_import(src.lastPathAngles, lastPathAngles); - ::sg_import(src.stats, stats); - ::sg_import(src.aimErrorDebounceTime, aimErrorDebounceTime); - ::sg_import(src.lastAimErrorYaw, lastAimErrorYaw); - ::sg_import(src.lastAimErrorPitch, lastAimErrorPitch); - ::sg_import(src.aimOfs, aimOfs); - ::sg_import(src.currentAim, currentAim); - ::sg_import(src.currentAggression, currentAggression); - ::sg_import(src.scriptFlags, scriptFlags); - ::sg_import(src.desiredSpeed, desiredSpeed); - ::sg_import(src.currentSpeed, currentSpeed); - ::sg_import(src.last_forwardmove, last_forwardmove); - ::sg_import(src.last_rightmove, last_rightmove); - ::sg_import(src.lastClearOrigin, lastClearOrigin); - ::sg_import(src.consecutiveBlockedMoves, consecutiveBlockedMoves); - ::sg_import(src.blockedDebounceTime, blockedDebounceTime); - ::sg_import(src.shoveCount, shoveCount); - ::sg_import(src.blockedDest, blockedDest); - ::sg_import(src.combatPoint, combatPoint); - ::sg_import(src.lastFailedCombatPoint, lastFailedCombatPoint); - ::sg_import(src.movementSpeech, movementSpeech); - ::sg_import(src.movementSpeechChance, movementSpeechChance); - ::sg_import(src.nextBStateThink, nextBStateThink); - ::sg_import(src.last_ucmd, last_ucmd); - ::sg_import(src.combatMove, combatMove); - ::sg_import(src.goalRadius, goalRadius); - ::sg_import(src.pauseTime, pauseTime); - ::sg_import(src.standTime, standTime); - ::sg_import(src.localState, localState); - ::sg_import(src.squadState, squadState); - ::sg_import(src.confusionTime, confusionTime); - ::sg_import(src.charmedTime, charmedTime); - ::sg_import(src.controlledTime, controlledTime); - ::sg_import(src.surrenderTime, surrenderTime); - ::sg_import(src.enemyLaggedPos, enemyLaggedPos); - ::sg_import(src.watchTarget, watchTarget); - ::sg_import(src.ffireCount, ffireCount); - ::sg_import(src.ffireDebounce, ffireDebounce); - ::sg_import(src.ffireFadeDebounce, ffireFadeDebounce); - } + const SgType& src); } gNPC_t; void G_SquadPathsInit(void); diff --git a/codeJK2/game/bg_public.cpp b/codeJK2/game/bg_public.cpp new file mode 100644 index 0000000000..6cbc584860 --- /dev/null +++ b/codeJK2/game/bg_public.cpp @@ -0,0 +1,42 @@ +#include "bg_public.h" +#include "qcommon/ojk_sg_wrappers.h" + + +void animation_t::sg_export( + SgType& dst) const +{ + ::sg_export(firstFrame, dst.firstFrame); + ::sg_export(numFrames, dst.numFrames); + ::sg_export(loopFrames, dst.loopFrames); + ::sg_export(frameLerp, dst.frameLerp); + ::sg_export(initialLerp, dst.initialLerp); +} + +void animation_t::sg_import( + const SgType& src) +{ + ::sg_import(src.firstFrame, firstFrame); + ::sg_import(src.numFrames, numFrames); + ::sg_import(src.loopFrames, loopFrames); + ::sg_import(src.frameLerp, frameLerp); + ::sg_import(src.initialLerp, initialLerp); +} + + +void animsounds_t::sg_export( + SgType& dst) const +{ + ::sg_export(keyFrame, dst.keyFrame); + ::sg_export(soundIndex, dst.soundIndex); + ::sg_export(numRandomAnimSounds, dst.numRandomAnimSounds); + ::sg_export(probability, dst.probability); +} + +void animsounds_t::sg_import( + const SgType& src) +{ + ::sg_import(src.keyFrame, keyFrame); + ::sg_import(src.soundIndex, soundIndex); + ::sg_import(src.numRandomAnimSounds, numRandomAnimSounds); + ::sg_import(src.probability, probability); +} diff --git a/codeJK2/game/bg_public.h b/codeJK2/game/bg_public.h index 9e8fe779ab..df0e84f413 100644 --- a/codeJK2/game/bg_public.h +++ b/codeJK2/game/bg_public.h @@ -465,24 +465,10 @@ typedef struct animation_s { void sg_export( - SgType& dst) const - { - ::sg_export(firstFrame, dst.firstFrame); - ::sg_export(numFrames, dst.numFrames); - ::sg_export(loopFrames, dst.loopFrames); - ::sg_export(frameLerp, dst.frameLerp); - ::sg_export(initialLerp, dst.initialLerp); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.firstFrame, firstFrame); - ::sg_import(src.numFrames, numFrames); - ::sg_import(src.loopFrames, loopFrames); - ::sg_import(src.frameLerp, frameLerp); - ::sg_import(src.initialLerp, initialLerp); - } + const SgType& src); } animation_t; #define MAX_RANDOM_ANIMSOUNDS 8 @@ -510,22 +496,10 @@ typedef struct animsounds_s void sg_export( - SgType& dst) const - { - ::sg_export(keyFrame, dst.keyFrame); - ::sg_export(soundIndex, dst.soundIndex); - ::sg_export(numRandomAnimSounds, dst.numRandomAnimSounds); - ::sg_export(probability, dst.probability); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.keyFrame, keyFrame); - ::sg_import(src.soundIndex, soundIndex); - ::sg_import(src.numRandomAnimSounds, numRandomAnimSounds); - ::sg_import(src.probability, probability); - } + const SgType& src); } animsounds_t; // means of death diff --git a/codeJK2/game/g_local.cpp b/codeJK2/game/g_local.cpp new file mode 100644 index 0000000000..960ab4912f --- /dev/null +++ b/codeJK2/game/g_local.cpp @@ -0,0 +1,76 @@ +#include "g_local.h" +#include "qcommon/ojk_sg_wrappers.h" + + +void alertEvent_t::sg_export( + SgType& dst) const +{ + ::sg_export(position, dst.position); + ::sg_export(radius, dst.radius); + ::sg_export(level, dst.level); + ::sg_export(type, dst.type); + ::sg_export(owner, dst.owner); + ::sg_export(light, dst.light); + ::sg_export(addLight, dst.addLight); + ::sg_export(ID, dst.ID); + ::sg_export(timestamp, dst.timestamp); +} + +void alertEvent_t::sg_import( + const SgType& src) +{ + ::sg_import(src.position, position); + ::sg_import(src.radius, radius); + ::sg_import(src.level, level); + ::sg_import(src.type, type); + ::sg_import(src.owner, owner); + ::sg_import(src.light, light); + ::sg_import(src.addLight, addLight); + ::sg_import(src.ID, ID); + ::sg_import(src.timestamp, timestamp); +} + + +void level_locals_t::sg_export( + SgType& dst) const +{ + ::sg_export(clients, dst.clients); + ::sg_export(maxclients, dst.maxclients); + ::sg_export(framenum, dst.framenum); + ::sg_export(time, dst.time); + ::sg_export(previousTime, dst.previousTime); + ::sg_export(globalTime, dst.globalTime); + ::sg_export(mapname, dst.mapname); + ::sg_export(locationLinked, dst.locationLinked); + ::sg_export(locationHead, dst.locationHead); + ::sg_export(alertEvents, dst.alertEvents); + ::sg_export(numAlertEvents, dst.numAlertEvents); + ::sg_export(curAlertID, dst.curAlertID); + ::sg_export(groups, dst.groups); + ::sg_export(knownAnimFileSets, dst.knownAnimFileSets); + ::sg_export(numKnownAnimFileSets, dst.numKnownAnimFileSets); + ::sg_export(worldFlags, dst.worldFlags); + ::sg_export(dmState, dst.dmState); +} + +void level_locals_t::sg_import( + const SgType& src) +{ + ::sg_import(src.clients, clients); + ::sg_import(src.maxclients, maxclients); + ::sg_import(src.framenum, framenum); + ::sg_import(src.time, time); + ::sg_import(src.previousTime, previousTime); + ::sg_import(src.globalTime, globalTime); + ::sg_import(src.mapname, mapname); + ::sg_import(src.locationLinked, locationLinked); + ::sg_import(src.locationHead, locationHead); + ::sg_import(src.alertEvents, alertEvents); + ::sg_import(src.numAlertEvents, numAlertEvents); + ::sg_import(src.curAlertID, curAlertID); + ::sg_import(src.groups, groups); + ::sg_import(src.knownAnimFileSets, knownAnimFileSets); + ::sg_import(src.numKnownAnimFileSets, numKnownAnimFileSets); + ::sg_import(src.worldFlags, worldFlags); + ::sg_import(src.dmState, dmState); +} diff --git a/codeJK2/game/g_local.h b/codeJK2/game/g_local.h index edcd945e53..b3fa51d586 100644 --- a/codeJK2/game/g_local.h +++ b/codeJK2/game/g_local.h @@ -162,32 +162,10 @@ typedef struct alertEvent_s void sg_export( - SgType& dst) const - { - ::sg_export(position, dst.position); - ::sg_export(radius, dst.radius); - ::sg_export(level, dst.level); - ::sg_export(type, dst.type); - ::sg_export(owner, dst.owner); - ::sg_export(light, dst.light); - ::sg_export(addLight, dst.addLight); - ::sg_export(ID, dst.ID); - ::sg_export(timestamp, dst.timestamp); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.position, position); - ::sg_import(src.radius, radius); - ::sg_import(src.level, level); - ::sg_import(src.type, type); - ::sg_import(src.owner, owner); - ::sg_import(src.light, light); - ::sg_import(src.addLight, addLight); - ::sg_import(src.ID, ID); - ::sg_import(src.timestamp, timestamp); - } + const SgType& src); } alertEvent_t; // @@ -293,48 +271,10 @@ typedef struct void sg_export( - SgType& dst) const - { - ::sg_export(clients, dst.clients); - ::sg_export(maxclients, dst.maxclients); - ::sg_export(framenum, dst.framenum); - ::sg_export(time, dst.time); - ::sg_export(previousTime, dst.previousTime); - ::sg_export(globalTime, dst.globalTime); - ::sg_export(mapname, dst.mapname); - ::sg_export(locationLinked, dst.locationLinked); - ::sg_export(locationHead, dst.locationHead); - ::sg_export(alertEvents, dst.alertEvents); - ::sg_export(numAlertEvents, dst.numAlertEvents); - ::sg_export(curAlertID, dst.curAlertID); - ::sg_export(groups, dst.groups); - ::sg_export(knownAnimFileSets, dst.knownAnimFileSets); - ::sg_export(numKnownAnimFileSets, dst.numKnownAnimFileSets); - ::sg_export(worldFlags, dst.worldFlags); - ::sg_export(dmState, dst.dmState); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.clients, clients); - ::sg_import(src.maxclients, maxclients); - ::sg_import(src.framenum, framenum); - ::sg_import(src.time, time); - ::sg_import(src.previousTime, previousTime); - ::sg_import(src.globalTime, globalTime); - ::sg_import(src.mapname, mapname); - ::sg_import(src.locationLinked, locationLinked); - ::sg_import(src.locationHead, locationHead); - ::sg_import(src.alertEvents, alertEvents); - ::sg_import(src.numAlertEvents, numAlertEvents); - ::sg_import(src.curAlertID, curAlertID); - ::sg_import(src.groups, groups); - ::sg_import(src.knownAnimFileSets, knownAnimFileSets); - ::sg_import(src.numKnownAnimFileSets, numKnownAnimFileSets); - ::sg_import(src.worldFlags, worldFlags); - ::sg_import(src.dmState, dmState); - } + const SgType& src); } level_locals_t; extern level_locals_t level; diff --git a/codeJK2/game/g_shared.cpp b/codeJK2/game/g_shared.cpp new file mode 100644 index 0000000000..42e7099a32 --- /dev/null +++ b/codeJK2/game/g_shared.cpp @@ -0,0 +1,815 @@ +#include "g_local.h" +#include "g_shared.h" +#include "qcommon/ojk_sg_wrappers.h" + + +void clientInfo_t::sg_export( + SgType& dst) const +{ + ::sg_export(infoValid, dst.infoValid); + ::sg_export(name, dst.name); + ::sg_export(team, dst.team); + ::sg_export(score, dst.score); + ::sg_export(handicap, dst.handicap); + ::sg_export(legsModel, dst.legsModel); + ::sg_export(legsSkin, dst.legsSkin); + ::sg_export(torsoModel, dst.torsoModel); + ::sg_export(torsoSkin, dst.torsoSkin); + ::sg_export(headModel, dst.headModel); + ::sg_export(headSkin, dst.headSkin); + ::sg_export(extensions, dst.extensions); + ::sg_export(animFileIndex, dst.animFileIndex); + ::sg_export(sounds, dst.sounds); + ::sg_export(customBasicSoundDir, dst.customBasicSoundDir); + ::sg_export(customCombatSoundDir, dst.customCombatSoundDir); + ::sg_export(customExtraSoundDir, dst.customExtraSoundDir); + ::sg_export(customJediSoundDir, dst.customJediSoundDir); +} + +void clientInfo_t::sg_import( + const SgType& src) +{ + ::sg_import(src.infoValid, infoValid); + ::sg_import(src.name, name); + ::sg_import(src.team, team); + ::sg_import(src.score, score); + ::sg_import(src.handicap, handicap); + ::sg_import(src.legsModel, legsModel); + ::sg_import(src.legsSkin, legsSkin); + ::sg_import(src.torsoModel, torsoModel); + ::sg_import(src.torsoSkin, torsoSkin); + ::sg_import(src.headModel, headModel); + ::sg_import(src.headSkin, headSkin); + ::sg_import(src.extensions, extensions); + ::sg_import(src.animFileIndex, animFileIndex); + ::sg_import(src.sounds, sounds); + ::sg_import(src.customBasicSoundDir, customBasicSoundDir); + ::sg_import(src.customCombatSoundDir, customCombatSoundDir); + ::sg_import(src.customExtraSoundDir, customExtraSoundDir); + ::sg_import(src.customJediSoundDir, customJediSoundDir); +} + + +void modelInfo_t::sg_export( + SgType& dst) const +{ + ::sg_export(modelIndex, dst.modelIndex); + ::sg_export(customRGB, dst.customRGB); + ::sg_export(customAlpha, dst.customAlpha); +} + +void modelInfo_t::sg_import( + const SgType& src) +{ + ::sg_import(src.modelIndex, modelIndex); + ::sg_import(src.customRGB, customRGB); + ::sg_import(src.customAlpha, customAlpha); +} + + +void renderInfo_t::sg_export( + SgType& dst) const +{ + ::sg_export(legsModel, dst.legsModel); + ::sg_export(legsModelName, dst.legsModelName); + ::sg_export(torsoModel, dst.torsoModel); + ::sg_export(headModel, dst.headModel); + ::sg_export(torsoModelName, dst.torsoModelName); + ::sg_export(headModelName, dst.headModelName); + ::sg_export(headYawRangeLeft, dst.headYawRangeLeft); + ::sg_export(headYawRangeRight, dst.headYawRangeRight); + ::sg_export(headPitchRangeUp, dst.headPitchRangeUp); + ::sg_export(headPitchRangeDown, dst.headPitchRangeDown); + ::sg_export(torsoYawRangeLeft, dst.torsoYawRangeLeft); + ::sg_export(torsoYawRangeRight, dst.torsoYawRangeRight); + ::sg_export(torsoPitchRangeUp, dst.torsoPitchRangeUp); + ::sg_export(torsoPitchRangeDown, dst.torsoPitchRangeDown); + ::sg_export(legsFrame, dst.legsFrame); + ::sg_export(torsoFrame, dst.torsoFrame); + ::sg_export(legsFpsMod, dst.legsFpsMod); + ::sg_export(torsoFpsMod, dst.torsoFpsMod); + ::sg_export(customRGB, dst.customRGB); + ::sg_export(customAlpha, dst.customAlpha); + ::sg_export(renderFlags, dst.renderFlags); + ::sg_export(muzzlePoint, dst.muzzlePoint); + ::sg_export(muzzleDir, dst.muzzleDir); + ::sg_export(muzzlePointOld, dst.muzzlePointOld); + ::sg_export(muzzleDirOld, dst.muzzleDirOld); + ::sg_export(mPCalcTime, dst.mPCalcTime); + ::sg_export(lockYaw, dst.lockYaw); + ::sg_export(headPoint, dst.headPoint); + ::sg_export(headAngles, dst.headAngles); + ::sg_export(handRPoint, dst.handRPoint); + ::sg_export(handLPoint, dst.handLPoint); + ::sg_export(crotchPoint, dst.crotchPoint); + ::sg_export(footRPoint, dst.footRPoint); + ::sg_export(footLPoint, dst.footLPoint); + ::sg_export(torsoPoint, dst.torsoPoint); + ::sg_export(torsoAngles, dst.torsoAngles); + ::sg_export(eyePoint, dst.eyePoint); + ::sg_export(eyeAngles, dst.eyeAngles); + ::sg_export(lookTarget, dst.lookTarget); + ::sg_export(lookMode, dst.lookMode); + ::sg_export(lookTargetClearTime, dst.lookTargetClearTime); + ::sg_export(lastVoiceVolume, dst.lastVoiceVolume); + ::sg_export(lastHeadAngles, dst.lastHeadAngles); + ::sg_export(headBobAngles, dst.headBobAngles); + ::sg_export(targetHeadBobAngles, dst.targetHeadBobAngles); + ::sg_export(lookingDebounceTime, dst.lookingDebounceTime); + ::sg_export(legsYaw, dst.legsYaw); +} + +void renderInfo_t::sg_import( + const SgType& src) +{ + ::sg_import(src.legsModel, legsModel); + ::sg_import(src.legsModelName, legsModelName); + ::sg_import(src.torsoModel, torsoModel); + ::sg_import(src.headModel, headModel); + ::sg_import(src.torsoModelName, torsoModelName); + ::sg_import(src.headModelName, headModelName); + ::sg_import(src.headYawRangeLeft, headYawRangeLeft); + ::sg_import(src.headYawRangeRight, headYawRangeRight); + ::sg_import(src.headPitchRangeUp, headPitchRangeUp); + ::sg_import(src.headPitchRangeDown, headPitchRangeDown); + ::sg_import(src.torsoYawRangeLeft, torsoYawRangeLeft); + ::sg_import(src.torsoYawRangeRight, torsoYawRangeRight); + ::sg_import(src.torsoPitchRangeUp, torsoPitchRangeUp); + ::sg_import(src.torsoPitchRangeDown, torsoPitchRangeDown); + ::sg_import(src.legsFrame, legsFrame); + ::sg_import(src.torsoFrame, torsoFrame); + ::sg_import(src.legsFpsMod, legsFpsMod); + ::sg_import(src.torsoFpsMod, torsoFpsMod); + ::sg_import(src.customRGB, customRGB); + ::sg_import(src.customAlpha, customAlpha); + ::sg_import(src.renderFlags, renderFlags); + ::sg_import(src.muzzlePoint, muzzlePoint); + ::sg_import(src.muzzleDir, muzzleDir); + ::sg_import(src.muzzlePointOld, muzzlePointOld); + ::sg_import(src.muzzleDirOld, muzzleDirOld); + ::sg_import(src.mPCalcTime, mPCalcTime); + ::sg_import(src.lockYaw, lockYaw); + ::sg_import(src.headPoint, headPoint); + ::sg_import(src.headAngles, headAngles); + ::sg_import(src.handRPoint, handRPoint); + ::sg_import(src.handLPoint, handLPoint); + ::sg_import(src.crotchPoint, crotchPoint); + ::sg_import(src.footRPoint, footRPoint); + ::sg_import(src.footLPoint, footLPoint); + ::sg_import(src.torsoPoint, torsoPoint); + ::sg_import(src.torsoAngles, torsoAngles); + ::sg_import(src.eyePoint, eyePoint); + ::sg_import(src.eyeAngles, eyeAngles); + ::sg_import(src.lookTarget, lookTarget); + ::sg_import(src.lookMode, lookMode); + ::sg_import(src.lookTargetClearTime, lookTargetClearTime); + ::sg_import(src.lastVoiceVolume, lastVoiceVolume); + ::sg_import(src.lastHeadAngles, lastHeadAngles); + ::sg_import(src.headBobAngles, headBobAngles); + ::sg_import(src.targetHeadBobAngles, targetHeadBobAngles); + ::sg_import(src.lookingDebounceTime, lookingDebounceTime); + ::sg_import(src.legsYaw, legsYaw); +} + + +void playerTeamState_t::sg_export( + SgType& dst) const +{ + ::sg_export(state, dst.state); + ::sg_export(captures, dst.captures); + ::sg_export(basedefense, dst.basedefense); + ::sg_export(carrierdefense, dst.carrierdefense); + ::sg_export(flagrecovery, dst.flagrecovery); + ::sg_export(fragcarrier, dst.fragcarrier); + ::sg_export(assists, dst.assists); + ::sg_export(lasthurtcarrier, dst.lasthurtcarrier); + ::sg_export(lastreturnedflag, dst.lastreturnedflag); + ::sg_export(flagsince, dst.flagsince); + ::sg_export(lastfraggedcarrier, dst.lastfraggedcarrier); +} + +void playerTeamState_t::sg_import( + const SgType& src) +{ + ::sg_import(src.state, state); + ::sg_import(src.captures, captures); + ::sg_import(src.basedefense, basedefense); + ::sg_import(src.carrierdefense, carrierdefense); + ::sg_import(src.flagrecovery, flagrecovery); + ::sg_import(src.fragcarrier, fragcarrier); + ::sg_import(src.assists, assists); + ::sg_import(src.lasthurtcarrier, lasthurtcarrier); + ::sg_import(src.lastreturnedflag, lastreturnedflag); + ::sg_import(src.flagsince, flagsince); + ::sg_import(src.lastfraggedcarrier, lastfraggedcarrier); +} + + +void objectives_t::sg_export( + SgType& dst) const +{ + ::sg_export(display, dst.display); + ::sg_export(status, dst.status); +} + +void objectives_t::sg_import( + const SgType& src) +{ + ::sg_import(src.display, display); + ::sg_import(src.status, status); +} + + +void missionStats_t::sg_export( + SgType& dst) const +{ + ::sg_export(secretsFound, dst.secretsFound); + ::sg_export(totalSecrets, dst.totalSecrets); + ::sg_export(shotsFired, dst.shotsFired); + ::sg_export(hits, dst.hits); + ::sg_export(enemiesSpawned, dst.enemiesSpawned); + ::sg_export(enemiesKilled, dst.enemiesKilled); + ::sg_export(saberThrownCnt, dst.saberThrownCnt); + ::sg_export(saberBlocksCnt, dst.saberBlocksCnt); + ::sg_export(legAttacksCnt, dst.legAttacksCnt); + ::sg_export(armAttacksCnt, dst.armAttacksCnt); + ::sg_export(torsoAttacksCnt, dst.torsoAttacksCnt); + ::sg_export(otherAttacksCnt, dst.otherAttacksCnt); + ::sg_export(forceUsed, dst.forceUsed); + ::sg_export(weaponUsed, dst.weaponUsed); +} + +void missionStats_t::sg_import( + const SgType& src) +{ + ::sg_import(src.secretsFound, secretsFound); + ::sg_import(src.totalSecrets, totalSecrets); + ::sg_import(src.shotsFired, shotsFired); + ::sg_import(src.hits, hits); + ::sg_import(src.enemiesSpawned, enemiesSpawned); + ::sg_import(src.enemiesKilled, enemiesKilled); + ::sg_import(src.saberThrownCnt, saberThrownCnt); + ::sg_import(src.saberBlocksCnt, saberBlocksCnt); + ::sg_import(src.legAttacksCnt, legAttacksCnt); + ::sg_import(src.armAttacksCnt, armAttacksCnt); + ::sg_import(src.torsoAttacksCnt, torsoAttacksCnt); + ::sg_import(src.otherAttacksCnt, otherAttacksCnt); + ::sg_import(src.forceUsed, forceUsed); + ::sg_import(src.weaponUsed, weaponUsed); +} + + +void clientSession_t::sg_export( + SgType& dst) const +{ + ::sg_export(missionObjectivesShown, dst.missionObjectivesShown); + ::sg_export(sessionTeam, dst.sessionTeam); + ::sg_export(mission_objectives, dst.mission_objectives); + ::sg_export(missionStats, dst.missionStats); +} + +void clientSession_t::sg_import( + const SgType& src) +{ + ::sg_import(src.missionObjectivesShown, missionObjectivesShown); + ::sg_import(src.sessionTeam, sessionTeam); + ::sg_import(src.mission_objectives, mission_objectives); + ::sg_import(src.missionStats, missionStats); +} + + +void clientPersistant_t::sg_export( + SgType& dst) const +{ + ::sg_export(connected, dst.connected); + ::sg_export(lastCommand, dst.lastCommand); + ::sg_export(localClient, dst.localClient); + ::sg_export(netname, dst.netname); + ::sg_export(maxHealth, dst.maxHealth); + ::sg_export(enterTime, dst.enterTime); + ::sg_export(cmd_angles, dst.cmd_angles); + ::sg_export(teamState, dst.teamState); +} + +void clientPersistant_t::sg_import( + const SgType& src) +{ + ::sg_import(src.connected, connected); + ::sg_import(src.lastCommand, lastCommand); + ::sg_import(src.localClient, localClient); + ::sg_import(src.netname, netname); + ::sg_import(src.maxHealth, maxHealth); + ::sg_import(src.enterTime, enterTime); + ::sg_import(src.cmd_angles, cmd_angles); + ::sg_import(src.teamState, teamState); +} + + +void gclient_t::sg_export( + SgType& dst) const +{ + ::sg_export(ps, dst.ps); + ::sg_export(pers, dst.pers); + ::sg_export(sess, dst.sess); + ::sg_export(noclip, dst.noclip); + ::sg_export(lastCmdTime, dst.lastCmdTime); + ::sg_export(usercmd, dst.usercmd); + ::sg_export(buttons, dst.buttons); + ::sg_export(oldbuttons, dst.oldbuttons); + ::sg_export(latched_buttons, dst.latched_buttons); + ::sg_export(damage_armor, dst.damage_armor); + ::sg_export(damage_blood, dst.damage_blood); + ::sg_export(damage_knockback, dst.damage_knockback); + ::sg_export(damage_from, dst.damage_from); + ::sg_export(damage_fromWorld, dst.damage_fromWorld); + ::sg_export(accurateCount, dst.accurateCount); + ::sg_export(respawnTime, dst.respawnTime); + ::sg_export(inactivityTime, dst.inactivityTime); + ::sg_export(inactivityWarning, dst.inactivityWarning); + ::sg_export(idleTime, dst.idleTime); + ::sg_export(airOutTime, dst.airOutTime); + ::sg_export(timeResidual, dst.timeResidual); + ::sg_export(facial_blink, dst.facial_blink); + ::sg_export(facial_frown, dst.facial_frown); + ::sg_export(facial_aux, dst.facial_aux); + ::sg_export(clientInfo, dst.clientInfo); + ::sg_export(forced_forwardmove, dst.forced_forwardmove); + ::sg_export(forced_rightmove, dst.forced_rightmove); + ::sg_export(fireDelay, dst.fireDelay); + ::sg_export(playerTeam, dst.playerTeam); + ::sg_export(enemyTeam, dst.enemyTeam); + ::sg_export(squadname, dst.squadname); + ::sg_export(team_leader, dst.team_leader); + ::sg_export(leader, dst.leader); + ::sg_export(follower, dst.follower); + ::sg_export(numFollowers, dst.numFollowers); + ::sg_export(formationGoal, dst.formationGoal); + ::sg_export(nextFormGoal, dst.nextFormGoal); + ::sg_export(NPC_class, dst.NPC_class); + ::sg_export(hiddenDist, dst.hiddenDist); + ::sg_export(hiddenDir, dst.hiddenDir); + ::sg_export(renderInfo, dst.renderInfo); + ::sg_export(saberTrail, dst.saberTrail); + ::sg_export(dismembered, dst.dismembered); + ::sg_export(dismemberProbLegs, dst.dismemberProbLegs); + ::sg_export(dismemberProbHead, dst.dismemberProbHead); + ::sg_export(dismemberProbArms, dst.dismemberProbArms); + ::sg_export(dismemberProbHands, dst.dismemberProbHands); + ::sg_export(dismemberProbWaist, dst.dismemberProbWaist); + ::sg_export(standheight, dst.standheight); + ::sg_export(crouchheight, dst.crouchheight); + ::sg_export(poisonDamage, dst.poisonDamage); + ::sg_export(poisonTime, dst.poisonTime); + ::sg_export(slopeRecalcTime, dst.slopeRecalcTime); + ::sg_export(pushVec, dst.pushVec); + ::sg_export(pushVecTime, dst.pushVecTime); +} + +void gclient_t::sg_import( + const SgType& src) +{ + ::sg_import(src.ps, ps); + ::sg_import(src.pers, pers); + ::sg_import(src.sess, sess); + ::sg_import(src.noclip, noclip); + ::sg_import(src.lastCmdTime, lastCmdTime); + ::sg_import(src.usercmd, usercmd); + ::sg_import(src.buttons, buttons); + ::sg_import(src.oldbuttons, oldbuttons); + ::sg_import(src.latched_buttons, latched_buttons); + ::sg_import(src.damage_armor, damage_armor); + ::sg_import(src.damage_blood, damage_blood); + ::sg_import(src.damage_knockback, damage_knockback); + ::sg_import(src.damage_from, damage_from); + ::sg_import(src.damage_fromWorld, damage_fromWorld); + ::sg_import(src.accurateCount, accurateCount); + ::sg_import(src.respawnTime, respawnTime); + ::sg_import(src.inactivityTime, inactivityTime); + ::sg_import(src.inactivityWarning, inactivityWarning); + ::sg_import(src.idleTime, idleTime); + ::sg_import(src.airOutTime, airOutTime); + ::sg_import(src.timeResidual, timeResidual); + ::sg_import(src.facial_blink, facial_blink); + ::sg_import(src.facial_frown, facial_frown); + ::sg_import(src.facial_aux, facial_aux); + ::sg_import(src.clientInfo, clientInfo); + ::sg_import(src.forced_forwardmove, forced_forwardmove); + ::sg_import(src.forced_rightmove, forced_rightmove); + ::sg_import(src.fireDelay, fireDelay); + ::sg_import(src.playerTeam, playerTeam); + ::sg_import(src.enemyTeam, enemyTeam); + ::sg_import(src.squadname, squadname); + ::sg_import(src.team_leader, team_leader); + ::sg_import(src.leader, leader); + ::sg_import(src.follower, follower); + ::sg_import(src.numFollowers, numFollowers); + ::sg_import(src.formationGoal, formationGoal); + ::sg_import(src.nextFormGoal, nextFormGoal); + ::sg_import(src.NPC_class, NPC_class); + ::sg_import(src.hiddenDist, hiddenDist); + ::sg_import(src.hiddenDir, hiddenDir); + ::sg_import(src.renderInfo, renderInfo); + ::sg_import(src.saberTrail, saberTrail); + ::sg_import(src.dismembered, dismembered); + ::sg_import(src.dismemberProbLegs, dismemberProbLegs); + ::sg_import(src.dismemberProbHead, dismemberProbHead); + ::sg_import(src.dismemberProbArms, dismemberProbArms); + ::sg_import(src.dismemberProbHands, dismemberProbHands); + ::sg_import(src.dismemberProbWaist, dismemberProbWaist); + ::sg_import(src.standheight, standheight); + ::sg_import(src.crouchheight, crouchheight); + ::sg_import(src.poisonDamage, poisonDamage); + ::sg_import(src.poisonTime, poisonTime); + ::sg_import(src.slopeRecalcTime, slopeRecalcTime); + ::sg_import(src.pushVec, pushVec); + ::sg_import(src.pushVecTime, pushVecTime); +} + + +void parms_t::sg_export( + SgType& dst) const +{ + ::sg_export(parm, dst.parm); +} + +void parms_t::sg_import( + const SgType& src) +{ + ::sg_import(src.parm, parm); +} + + +void gentity_s::sg_export( + SgType& dst) const +{ + ::sg_export(s, dst.s); + ::sg_export(client, dst.client); + ::sg_export(inuse, dst.inuse); + ::sg_export(linked, dst.linked); + ::sg_export(svFlags, dst.svFlags); + ::sg_export(bmodel, dst.bmodel); + ::sg_export(mins, dst.mins); + ::sg_export(maxs, dst.maxs); + ::sg_export(contents, dst.contents); + ::sg_export(absmin, dst.absmin); + ::sg_export(absmax, dst.absmax); + ::sg_export(currentOrigin, dst.currentOrigin); + ::sg_export(currentAngles, dst.currentAngles); + ::sg_export(owner, dst.owner); + ::sg_export(ghoul2, dst.ghoul2); + ::sg_export(classname, dst.classname); + ::sg_export(spawnflags, dst.spawnflags); + ::sg_export(flags, dst.flags); + ::sg_export(model, dst.model); + ::sg_export(model2, dst.model2); + ::sg_export(freetime, dst.freetime); + ::sg_export(eventTime, dst.eventTime); + ::sg_export(freeAfterEvent, dst.freeAfterEvent); + ::sg_export(unlinkAfterEvent, dst.unlinkAfterEvent); + ::sg_export(physicsBounce, dst.physicsBounce); + ::sg_export(clipmask, dst.clipmask); + ::sg_export(speed, dst.speed); + ::sg_export(movedir, dst.movedir); + ::sg_export(lastOrigin, dst.lastOrigin); + ::sg_export(lastAngles, dst.lastAngles); + ::sg_export(mass, dst.mass); + ::sg_export(lastImpact, dst.lastImpact); + ::sg_export(watertype, dst.watertype); + ::sg_export(waterlevel, dst.waterlevel); + ::sg_export(angle, dst.angle); + ::sg_export(target, dst.target); + ::sg_export(target2, dst.target2); + ::sg_export(target3, dst.target3); + ::sg_export(target4, dst.target4); + ::sg_export(targetname, dst.targetname); + ::sg_export(team, dst.team); + ::sg_export(roff, dst.roff); + ::sg_export(roff_ctr, dst.roff_ctr); + ::sg_export(next_roff_time, dst.next_roff_time); + ::sg_export(fx_time, dst.fx_time); + ::sg_export(nextthink, dst.nextthink); + ::sg_export(e_ThinkFunc, dst.e_ThinkFunc); + ::sg_export(e_clThinkFunc, dst.e_clThinkFunc); + ::sg_export(e_ReachedFunc, dst.e_ReachedFunc); + ::sg_export(e_BlockedFunc, dst.e_BlockedFunc); + ::sg_export(e_TouchFunc, dst.e_TouchFunc); + ::sg_export(e_UseFunc, dst.e_UseFunc); + ::sg_export(e_PainFunc, dst.e_PainFunc); + ::sg_export(e_DieFunc, dst.e_DieFunc); + ::sg_export(health, dst.health); + ::sg_export(max_health, dst.max_health); + ::sg_export(takedamage, dst.takedamage); + ::sg_export(material, dst.material); + ::sg_export(damage, dst.damage); + ::sg_export(dflags, dst.dflags); + ::sg_export(splashDamage, dst.splashDamage); + ::sg_export(splashRadius, dst.splashRadius); + ::sg_export(methodOfDeath, dst.methodOfDeath); + ::sg_export(splashMethodOfDeath, dst.splashMethodOfDeath); + ::sg_export(locationDamage, dst.locationDamage); + ::sg_export(chain, dst.chain); + ::sg_export(enemy, dst.enemy); + ::sg_export(activator, dst.activator); + ::sg_export(teamchain, dst.teamchain); + ::sg_export(teammaster, dst.teammaster); + ::sg_export(lastEnemy, dst.lastEnemy); + ::sg_export(wait, dst.wait); + ::sg_export(random, dst.random); + ::sg_export(delay, dst.delay); + ::sg_export(alt_fire, dst.alt_fire); + ::sg_export(count, dst.count); + ::sg_export(bounceCount, dst.bounceCount); + ::sg_export(fly_sound_debounce_time, dst.fly_sound_debounce_time); + ::sg_export(painDebounceTime, dst.painDebounceTime); + ::sg_export(disconnectDebounceTime, dst.disconnectDebounceTime); + ::sg_export(attackDebounceTime, dst.attackDebounceTime); + ::sg_export(pushDebounceTime, dst.pushDebounceTime); + ::sg_export(aimDebounceTime, dst.aimDebounceTime); + ::sg_export(useDebounceTime, dst.useDebounceTime); + ::sg_export(trigger_formation, dst.trigger_formation); + ::sg_export(waypoint, dst.waypoint); + ::sg_export(lastWaypoint, dst.lastWaypoint); + ::sg_export(lastValidWaypoint, dst.lastValidWaypoint); + ::sg_export(noWaypointTime, dst.noWaypointTime); + ::sg_export(combatPoint, dst.combatPoint); + ::sg_export(failedWaypoints, dst.failedWaypoints); + ::sg_export(failedWaypointCheckTime, dst.failedWaypointCheckTime); + ::sg_export(loopAnim, dst.loopAnim); + ::sg_export(startFrame, dst.startFrame); + ::sg_export(endFrame, dst.endFrame); + ::sg_export(sequencer, dst.sequencer); + ::sg_export(taskManager, dst.taskManager); + ::sg_export(taskID, dst.taskID); + ::sg_export(parms, dst.parms); + ::sg_export(behaviorSet, dst.behaviorSet); + ::sg_export(script_targetname, dst.script_targetname); + ::sg_export(delayScriptTime, dst.delayScriptTime); + ::sg_export(fullName, dst.fullName); + ::sg_export(soundSet, dst.soundSet); + ::sg_export(setTime, dst.setTime); + ::sg_export(cameraGroup, dst.cameraGroup); + ::sg_export(noDamageTeam, dst.noDamageTeam); + ::sg_export(playerModel, dst.playerModel); + ::sg_export(weaponModel, dst.weaponModel); + ::sg_export(handRBolt, dst.handRBolt); + ::sg_export(handLBolt, dst.handLBolt); + ::sg_export(headBolt, dst.headBolt); + ::sg_export(cervicalBolt, dst.cervicalBolt); + ::sg_export(chestBolt, dst.chestBolt); + ::sg_export(gutBolt, dst.gutBolt); + ::sg_export(torsoBolt, dst.torsoBolt); + ::sg_export(crotchBolt, dst.crotchBolt); + ::sg_export(motionBolt, dst.motionBolt); + ::sg_export(kneeLBolt, dst.kneeLBolt); + ::sg_export(kneeRBolt, dst.kneeRBolt); + ::sg_export(elbowLBolt, dst.elbowLBolt); + ::sg_export(elbowRBolt, dst.elbowRBolt); + ::sg_export(footLBolt, dst.footLBolt); + ::sg_export(footRBolt, dst.footRBolt); + ::sg_export(faceBone, dst.faceBone); + ::sg_export(craniumBone, dst.craniumBone); + ::sg_export(cervicalBone, dst.cervicalBone); + ::sg_export(thoracicBone, dst.thoracicBone); + ::sg_export(upperLumbarBone, dst.upperLumbarBone); + ::sg_export(lowerLumbarBone, dst.lowerLumbarBone); + ::sg_export(hipsBone, dst.hipsBone); + ::sg_export(motionBone, dst.motionBone); + ::sg_export(rootBone, dst.rootBone); + ::sg_export(footLBone, dst.footLBone); + ::sg_export(footRBone, dst.footRBone); + ::sg_export(genericBone1, dst.genericBone1); + ::sg_export(genericBone2, dst.genericBone2); + ::sg_export(genericBone3, dst.genericBone3); + ::sg_export(genericBolt1, dst.genericBolt1); + ::sg_export(genericBolt2, dst.genericBolt2); + ::sg_export(genericBolt3, dst.genericBolt3); + ::sg_export(genericBolt4, dst.genericBolt4); + ::sg_export(genericBolt5, dst.genericBolt5); + ::sg_export(cinematicModel, dst.cinematicModel); + ::sg_export(NPC, dst.NPC); + ::sg_export(ownername, dst.ownername); + ::sg_export(cantHitEnemyCounter, dst.cantHitEnemyCounter); + ::sg_export(NPC_type, dst.NPC_type); + ::sg_export(NPC_targetname, dst.NPC_targetname); + ::sg_export(NPC_target, dst.NPC_target); + ::sg_export(moverState, dst.moverState); + ::sg_export(soundPos1, dst.soundPos1); + ::sg_export(sound1to2, dst.sound1to2); + ::sg_export(sound2to1, dst.sound2to1); + ::sg_export(soundPos2, dst.soundPos2); + ::sg_export(soundLoop, dst.soundLoop); + ::sg_export(nextTrain, dst.nextTrain); + ::sg_export(prevTrain, dst.prevTrain); + ::sg_export(pos1, dst.pos1); + ::sg_export(pos2, dst.pos2); + ::sg_export(pos3, dst.pos3); + ::sg_export(sounds, dst.sounds); + ::sg_export(closetarget, dst.closetarget); + ::sg_export(opentarget, dst.opentarget); + ::sg_export(paintarget, dst.paintarget); + ::sg_export(lockCount, dst.lockCount); + ::sg_export(radius, dst.radius); + ::sg_export(wpIndex, dst.wpIndex); + ::sg_export(noise_index, dst.noise_index); + ::sg_export(startRGBA, dst.startRGBA); + ::sg_export(finalRGBA, dst.finalRGBA); + ::sg_export(item, dst.item); + ::sg_export(message, dst.message); + ::sg_export(lightLevel, dst.lightLevel); + ::sg_export(forcePushTime, dst.forcePushTime); + ::sg_export(forcePuller, dst.forcePuller); +} + +void gentity_s::sg_import( + const SgType& src) +{ + ::sg_import(src.s, s); + ::sg_import(src.client, client); + ::sg_import(src.inuse, inuse); + ::sg_import(src.linked, linked); + ::sg_import(src.svFlags, svFlags); + ::sg_import(src.bmodel, bmodel); + ::sg_import(src.mins, mins); + ::sg_import(src.maxs, maxs); + ::sg_import(src.contents, contents); + ::sg_import(src.absmin, absmin); + ::sg_import(src.absmax, absmax); + ::sg_import(src.currentOrigin, currentOrigin); + ::sg_import(src.currentAngles, currentAngles); + ::sg_import(src.owner, owner); + ::sg_import(src.ghoul2, ghoul2); + ::sg_import(src.classname, classname); + ::sg_import(src.spawnflags, spawnflags); + ::sg_import(src.flags, flags); + ::sg_import(src.model, model); + ::sg_import(src.model2, model2); + ::sg_import(src.freetime, freetime); + ::sg_import(src.eventTime, eventTime); + ::sg_import(src.freeAfterEvent, freeAfterEvent); + ::sg_import(src.unlinkAfterEvent, unlinkAfterEvent); + ::sg_import(src.physicsBounce, physicsBounce); + ::sg_import(src.clipmask, clipmask); + ::sg_import(src.speed, speed); + ::sg_import(src.movedir, movedir); + ::sg_import(src.lastOrigin, lastOrigin); + ::sg_import(src.lastAngles, lastAngles); + ::sg_import(src.mass, mass); + ::sg_import(src.lastImpact, lastImpact); + ::sg_import(src.watertype, watertype); + ::sg_import(src.waterlevel, waterlevel); + ::sg_import(src.angle, angle); + ::sg_import(src.target, target); + ::sg_import(src.target2, target2); + ::sg_import(src.target3, target3); + ::sg_import(src.target4, target4); + ::sg_import(src.targetname, targetname); + ::sg_import(src.team, team); + ::sg_import(src.roff, roff); + ::sg_import(src.roff_ctr, roff_ctr); + ::sg_import(src.next_roff_time, next_roff_time); + ::sg_import(src.fx_time, fx_time); + ::sg_import(src.nextthink, nextthink); + ::sg_import(src.e_ThinkFunc, e_ThinkFunc); + ::sg_import(src.e_clThinkFunc, e_clThinkFunc); + ::sg_import(src.e_ReachedFunc, e_ReachedFunc); + ::sg_import(src.e_BlockedFunc, e_BlockedFunc); + ::sg_import(src.e_TouchFunc, e_TouchFunc); + ::sg_import(src.e_UseFunc, e_UseFunc); + ::sg_import(src.e_PainFunc, e_PainFunc); + ::sg_import(src.e_DieFunc, e_DieFunc); + ::sg_import(src.health, health); + ::sg_import(src.max_health, max_health); + ::sg_import(src.takedamage, takedamage); + ::sg_import(src.material, material); + ::sg_import(src.damage, damage); + ::sg_import(src.dflags, dflags); + ::sg_import(src.splashDamage, splashDamage); + ::sg_import(src.splashRadius, splashRadius); + ::sg_import(src.methodOfDeath, methodOfDeath); + ::sg_import(src.splashMethodOfDeath, splashMethodOfDeath); + ::sg_import(src.locationDamage, locationDamage); + ::sg_import(src.chain, chain); + ::sg_import(src.enemy, enemy); + ::sg_import(src.activator, activator); + ::sg_import(src.teamchain, teamchain); + ::sg_import(src.teammaster, teammaster); + ::sg_import(src.lastEnemy, lastEnemy); + ::sg_import(src.wait, wait); + ::sg_import(src.random, random); + ::sg_import(src.delay, delay); + ::sg_import(src.alt_fire, alt_fire); + ::sg_import(src.count, count); + ::sg_import(src.bounceCount, bounceCount); + ::sg_import(src.fly_sound_debounce_time, fly_sound_debounce_time); + ::sg_import(src.painDebounceTime, painDebounceTime); + ::sg_import(src.disconnectDebounceTime, disconnectDebounceTime); + ::sg_import(src.attackDebounceTime, attackDebounceTime); + ::sg_import(src.pushDebounceTime, pushDebounceTime); + ::sg_import(src.aimDebounceTime, aimDebounceTime); + ::sg_import(src.useDebounceTime, useDebounceTime); + ::sg_import(src.trigger_formation, trigger_formation); + ::sg_import(src.waypoint, waypoint); + ::sg_import(src.lastWaypoint, lastWaypoint); + ::sg_import(src.lastValidWaypoint, lastValidWaypoint); + ::sg_import(src.noWaypointTime, noWaypointTime); + ::sg_import(src.combatPoint, combatPoint); + ::sg_import(src.failedWaypoints, failedWaypoints); + ::sg_import(src.failedWaypointCheckTime, failedWaypointCheckTime); + ::sg_import(src.loopAnim, loopAnim); + ::sg_import(src.startFrame, startFrame); + ::sg_import(src.endFrame, endFrame); + ::sg_import(src.sequencer, sequencer); + ::sg_import(src.taskManager, taskManager); + ::sg_import(src.taskID, taskID); + ::sg_import(src.parms, parms); + ::sg_import(src.behaviorSet, behaviorSet); + ::sg_import(src.script_targetname, script_targetname); + ::sg_import(src.delayScriptTime, delayScriptTime); + ::sg_import(src.fullName, fullName); + ::sg_import(src.soundSet, soundSet); + ::sg_import(src.setTime, setTime); + ::sg_import(src.cameraGroup, cameraGroup); + ::sg_import(src.noDamageTeam, noDamageTeam); + ::sg_import(src.playerModel, playerModel); + ::sg_import(src.weaponModel, weaponModel); + ::sg_import(src.handRBolt, handRBolt); + ::sg_import(src.handLBolt, handLBolt); + ::sg_import(src.headBolt, headBolt); + ::sg_import(src.cervicalBolt, cervicalBolt); + ::sg_import(src.chestBolt, chestBolt); + ::sg_import(src.gutBolt, gutBolt); + ::sg_import(src.torsoBolt, torsoBolt); + ::sg_import(src.crotchBolt, crotchBolt); + ::sg_import(src.motionBolt, motionBolt); + ::sg_import(src.kneeLBolt, kneeLBolt); + ::sg_import(src.kneeRBolt, kneeRBolt); + ::sg_import(src.elbowLBolt, elbowLBolt); + ::sg_import(src.elbowRBolt, elbowRBolt); + ::sg_import(src.footLBolt, footLBolt); + ::sg_import(src.footRBolt, footRBolt); + ::sg_import(src.faceBone, faceBone); + ::sg_import(src.craniumBone, craniumBone); + ::sg_import(src.cervicalBone, cervicalBone); + ::sg_import(src.thoracicBone, thoracicBone); + ::sg_import(src.upperLumbarBone, upperLumbarBone); + ::sg_import(src.lowerLumbarBone, lowerLumbarBone); + ::sg_import(src.hipsBone, hipsBone); + ::sg_import(src.motionBone, motionBone); + ::sg_import(src.rootBone, rootBone); + ::sg_import(src.footLBone, footLBone); + ::sg_import(src.footRBone, footRBone); + ::sg_import(src.genericBone1, genericBone1); + ::sg_import(src.genericBone2, genericBone2); + ::sg_import(src.genericBone3, genericBone3); + ::sg_import(src.genericBolt1, genericBolt1); + ::sg_import(src.genericBolt2, genericBolt2); + ::sg_import(src.genericBolt3, genericBolt3); + ::sg_import(src.genericBolt4, genericBolt4); + ::sg_import(src.genericBolt5, genericBolt5); + ::sg_import(src.cinematicModel, cinematicModel); + ::sg_import(src.NPC, NPC); + ::sg_import(src.ownername, ownername); + ::sg_import(src.cantHitEnemyCounter, cantHitEnemyCounter); + ::sg_import(src.NPC_type, NPC_type); + ::sg_import(src.NPC_targetname, NPC_targetname); + ::sg_import(src.NPC_target, NPC_target); + ::sg_import(src.moverState, moverState); + ::sg_import(src.soundPos1, soundPos1); + ::sg_import(src.sound1to2, sound1to2); + ::sg_import(src.sound2to1, sound2to1); + ::sg_import(src.soundPos2, soundPos2); + ::sg_import(src.soundLoop, soundLoop); + ::sg_import(src.nextTrain, nextTrain); + ::sg_import(src.prevTrain, prevTrain); + ::sg_import(src.pos1, pos1); + ::sg_import(src.pos2, pos2); + ::sg_import(src.pos3, pos3); + ::sg_import(src.sounds, sounds); + ::sg_import(src.closetarget, closetarget); + ::sg_import(src.opentarget, opentarget); + ::sg_import(src.paintarget, paintarget); + ::sg_import(src.lockCount, lockCount); + ::sg_import(src.radius, radius); + ::sg_import(src.wpIndex, wpIndex); + ::sg_import(src.noise_index, noise_index); + ::sg_import(src.startRGBA, startRGBA); + ::sg_import(src.finalRGBA, finalRGBA); + ::sg_import(src.item, item); + ::sg_import(src.message, message); + ::sg_import(src.lightLevel, lightLevel); + ::sg_import(src.forcePushTime, forcePushTime); + ::sg_import(src.forcePuller, forcePuller); +} + + +void CGhoul2Info_v::sg_export( + SgType& dst) const +{ + ::sg_export(mItem, dst.mItem); +} + +void CGhoul2Info_v::sg_import( + const SgType& src) +{ + ::sg_export(src.mItem, mItem); +} diff --git a/codeJK2/game/g_shared.h b/codeJK2/game/g_shared.h index b12eca2dc4..ff906d0da8 100644 --- a/codeJK2/game/g_shared.h +++ b/codeJK2/game/g_shared.h @@ -180,50 +180,10 @@ typedef struct { void sg_export( - SgType& dst) const - { - ::sg_export(infoValid, dst.infoValid); - ::sg_export(name, dst.name); - ::sg_export(team, dst.team); - ::sg_export(score, dst.score); - ::sg_export(handicap, dst.handicap); - ::sg_export(legsModel, dst.legsModel); - ::sg_export(legsSkin, dst.legsSkin); - ::sg_export(torsoModel, dst.torsoModel); - ::sg_export(torsoSkin, dst.torsoSkin); - ::sg_export(headModel, dst.headModel); - ::sg_export(headSkin, dst.headSkin); - ::sg_export(extensions, dst.extensions); - ::sg_export(animFileIndex, dst.animFileIndex); - ::sg_export(sounds, dst.sounds); - ::sg_export(customBasicSoundDir, dst.customBasicSoundDir); - ::sg_export(customCombatSoundDir, dst.customCombatSoundDir); - ::sg_export(customExtraSoundDir, dst.customExtraSoundDir); - ::sg_export(customJediSoundDir, dst.customJediSoundDir); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.infoValid, infoValid); - ::sg_import(src.name, name); - ::sg_import(src.team, team); - ::sg_import(src.score, score); - ::sg_import(src.handicap, handicap); - ::sg_import(src.legsModel, legsModel); - ::sg_import(src.legsSkin, legsSkin); - ::sg_import(src.torsoModel, torsoModel); - ::sg_import(src.torsoSkin, torsoSkin); - ::sg_import(src.headModel, headModel); - ::sg_import(src.headSkin, headSkin); - ::sg_import(src.extensions, extensions); - ::sg_import(src.animFileIndex, animFileIndex); - ::sg_import(src.sounds, sounds); - ::sg_import(src.customBasicSoundDir, customBasicSoundDir); - ::sg_import(src.customCombatSoundDir, customCombatSoundDir); - ::sg_import(src.customExtraSoundDir, customExtraSoundDir); - ::sg_import(src.customJediSoundDir, customJediSoundDir); - } + const SgType& src); } clientInfo_t; @@ -260,20 +220,10 @@ typedef struct modelInfo_s void sg_export( - SgType& dst) const - { - ::sg_export(modelIndex, dst.modelIndex); - ::sg_export(customRGB, dst.customRGB); - ::sg_export(customAlpha, dst.customAlpha); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.modelIndex, modelIndex); - ::sg_import(src.customRGB, customRGB); - ::sg_import(src.customAlpha, customAlpha); - } + const SgType& src); } modelInfo_t; typedef enum @@ -431,108 +381,10 @@ typedef struct renderInfo_s void sg_export( - SgType& dst) const - { - ::sg_export(legsModel, dst.legsModel); - ::sg_export(legsModelName, dst.legsModelName); - ::sg_export(torsoModel, dst.torsoModel); - ::sg_export(headModel, dst.headModel); - ::sg_export(torsoModelName, dst.torsoModelName); - ::sg_export(headModelName, dst.headModelName); - ::sg_export(headYawRangeLeft, dst.headYawRangeLeft); - ::sg_export(headYawRangeRight, dst.headYawRangeRight); - ::sg_export(headPitchRangeUp, dst.headPitchRangeUp); - ::sg_export(headPitchRangeDown, dst.headPitchRangeDown); - ::sg_export(torsoYawRangeLeft, dst.torsoYawRangeLeft); - ::sg_export(torsoYawRangeRight, dst.torsoYawRangeRight); - ::sg_export(torsoPitchRangeUp, dst.torsoPitchRangeUp); - ::sg_export(torsoPitchRangeDown, dst.torsoPitchRangeDown); - ::sg_export(legsFrame, dst.legsFrame); - ::sg_export(torsoFrame, dst.torsoFrame); - ::sg_export(legsFpsMod, dst.legsFpsMod); - ::sg_export(torsoFpsMod, dst.torsoFpsMod); - ::sg_export(customRGB, dst.customRGB); - ::sg_export(customAlpha, dst.customAlpha); - ::sg_export(renderFlags, dst.renderFlags); - ::sg_export(muzzlePoint, dst.muzzlePoint); - ::sg_export(muzzleDir, dst.muzzleDir); - ::sg_export(muzzlePointOld, dst.muzzlePointOld); - ::sg_export(muzzleDirOld, dst.muzzleDirOld); - ::sg_export(mPCalcTime, dst.mPCalcTime); - ::sg_export(lockYaw, dst.lockYaw); - ::sg_export(headPoint, dst.headPoint); - ::sg_export(headAngles, dst.headAngles); - ::sg_export(handRPoint, dst.handRPoint); - ::sg_export(handLPoint, dst.handLPoint); - ::sg_export(crotchPoint, dst.crotchPoint); - ::sg_export(footRPoint, dst.footRPoint); - ::sg_export(footLPoint, dst.footLPoint); - ::sg_export(torsoPoint, dst.torsoPoint); - ::sg_export(torsoAngles, dst.torsoAngles); - ::sg_export(eyePoint, dst.eyePoint); - ::sg_export(eyeAngles, dst.eyeAngles); - ::sg_export(lookTarget, dst.lookTarget); - ::sg_export(lookMode, dst.lookMode); - ::sg_export(lookTargetClearTime, dst.lookTargetClearTime); - ::sg_export(lastVoiceVolume, dst.lastVoiceVolume); - ::sg_export(lastHeadAngles, dst.lastHeadAngles); - ::sg_export(headBobAngles, dst.headBobAngles); - ::sg_export(targetHeadBobAngles, dst.targetHeadBobAngles); - ::sg_export(lookingDebounceTime, dst.lookingDebounceTime); - ::sg_export(legsYaw, dst.legsYaw); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.legsModel, legsModel); - ::sg_import(src.legsModelName, legsModelName); - ::sg_import(src.torsoModel, torsoModel); - ::sg_import(src.headModel, headModel); - ::sg_import(src.torsoModelName, torsoModelName); - ::sg_import(src.headModelName, headModelName); - ::sg_import(src.headYawRangeLeft, headYawRangeLeft); - ::sg_import(src.headYawRangeRight, headYawRangeRight); - ::sg_import(src.headPitchRangeUp, headPitchRangeUp); - ::sg_import(src.headPitchRangeDown, headPitchRangeDown); - ::sg_import(src.torsoYawRangeLeft, torsoYawRangeLeft); - ::sg_import(src.torsoYawRangeRight, torsoYawRangeRight); - ::sg_import(src.torsoPitchRangeUp, torsoPitchRangeUp); - ::sg_import(src.torsoPitchRangeDown, torsoPitchRangeDown); - ::sg_import(src.legsFrame, legsFrame); - ::sg_import(src.torsoFrame, torsoFrame); - ::sg_import(src.legsFpsMod, legsFpsMod); - ::sg_import(src.torsoFpsMod, torsoFpsMod); - ::sg_import(src.customRGB, customRGB); - ::sg_import(src.customAlpha, customAlpha); - ::sg_import(src.renderFlags, renderFlags); - ::sg_import(src.muzzlePoint, muzzlePoint); - ::sg_import(src.muzzleDir, muzzleDir); - ::sg_import(src.muzzlePointOld, muzzlePointOld); - ::sg_import(src.muzzleDirOld, muzzleDirOld); - ::sg_import(src.mPCalcTime, mPCalcTime); - ::sg_import(src.lockYaw, lockYaw); - ::sg_import(src.headPoint, headPoint); - ::sg_import(src.headAngles, headAngles); - ::sg_import(src.handRPoint, handRPoint); - ::sg_import(src.handLPoint, handLPoint); - ::sg_import(src.crotchPoint, crotchPoint); - ::sg_import(src.footRPoint, footRPoint); - ::sg_import(src.footLPoint, footLPoint); - ::sg_import(src.torsoPoint, torsoPoint); - ::sg_import(src.torsoAngles, torsoAngles); - ::sg_import(src.eyePoint, eyePoint); - ::sg_import(src.eyeAngles, eyeAngles); - ::sg_import(src.lookTarget, lookTarget); - ::sg_import(src.lookMode, lookMode); - ::sg_import(src.lookTargetClearTime, lookTargetClearTime); - ::sg_import(src.lastVoiceVolume, lastVoiceVolume); - ::sg_import(src.lastHeadAngles, lastHeadAngles); - ::sg_import(src.headBobAngles, headBobAngles); - ::sg_import(src.targetHeadBobAngles, targetHeadBobAngles); - ::sg_import(src.lookingDebounceTime, lookingDebounceTime); - ::sg_import(src.legsYaw, legsYaw); - } + const SgType& src); } renderInfo_t; // Movement information structure @@ -599,36 +451,10 @@ typedef struct { void sg_export( - SgType& dst) const - { - ::sg_export(state, dst.state); - ::sg_export(captures, dst.captures); - ::sg_export(basedefense, dst.basedefense); - ::sg_export(carrierdefense, dst.carrierdefense); - ::sg_export(flagrecovery, dst.flagrecovery); - ::sg_export(fragcarrier, dst.fragcarrier); - ::sg_export(assists, dst.assists); - ::sg_export(lasthurtcarrier, dst.lasthurtcarrier); - ::sg_export(lastreturnedflag, dst.lastreturnedflag); - ::sg_export(flagsince, dst.flagsince); - ::sg_export(lastfraggedcarrier, dst.lastfraggedcarrier); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.state, state); - ::sg_import(src.captures, captures); - ::sg_import(src.basedefense, basedefense); - ::sg_import(src.carrierdefense, carrierdefense); - ::sg_import(src.flagrecovery, flagrecovery); - ::sg_import(src.fragcarrier, fragcarrier); - ::sg_import(src.assists, assists); - ::sg_import(src.lasthurtcarrier, lasthurtcarrier); - ::sg_import(src.lastreturnedflag, lastreturnedflag); - ::sg_import(src.flagsince, flagsince); - ::sg_import(src.lastfraggedcarrier, lastfraggedcarrier); - } + const SgType& src); } playerTeamState_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! @@ -651,18 +477,10 @@ typedef struct objectives_s void sg_export( - SgType& dst) const - { - ::sg_export(display, dst.display); - ::sg_export(status, dst.status); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.display, display); - ::sg_import(src.status, status); - } + const SgType& src); } objectives_t; #define MAX_MISSION_OBJ 80 @@ -710,42 +528,10 @@ typedef struct missionStats_s void sg_export( - SgType& dst) const - { - ::sg_export(secretsFound, dst.secretsFound); - ::sg_export(totalSecrets, dst.totalSecrets); - ::sg_export(shotsFired, dst.shotsFired); - ::sg_export(hits, dst.hits); - ::sg_export(enemiesSpawned, dst.enemiesSpawned); - ::sg_export(enemiesKilled, dst.enemiesKilled); - ::sg_export(saberThrownCnt, dst.saberThrownCnt); - ::sg_export(saberBlocksCnt, dst.saberBlocksCnt); - ::sg_export(legAttacksCnt, dst.legAttacksCnt); - ::sg_export(armAttacksCnt, dst.armAttacksCnt); - ::sg_export(torsoAttacksCnt, dst.torsoAttacksCnt); - ::sg_export(otherAttacksCnt, dst.otherAttacksCnt); - ::sg_export(forceUsed, dst.forceUsed); - ::sg_export(weaponUsed, dst.weaponUsed); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.secretsFound, secretsFound); - ::sg_import(src.totalSecrets, totalSecrets); - ::sg_import(src.shotsFired, shotsFired); - ::sg_import(src.hits, hits); - ::sg_import(src.enemiesSpawned, enemiesSpawned); - ::sg_import(src.enemiesKilled, enemiesKilled); - ::sg_import(src.saberThrownCnt, saberThrownCnt); - ::sg_import(src.saberBlocksCnt, saberBlocksCnt); - ::sg_import(src.legAttacksCnt, legAttacksCnt); - ::sg_import(src.armAttacksCnt, armAttacksCnt); - ::sg_import(src.torsoAttacksCnt, torsoAttacksCnt); - ::sg_import(src.otherAttacksCnt, otherAttacksCnt); - ::sg_import(src.forceUsed, forceUsed); - ::sg_import(src.weaponUsed, weaponUsed); - } + const SgType& src); } missionStats_t; // the auto following clients don't follow a specific client @@ -781,22 +567,10 @@ typedef struct { void sg_export( - SgType& dst) const - { - ::sg_export(missionObjectivesShown, dst.missionObjectivesShown); - ::sg_export(sessionTeam, dst.sessionTeam); - ::sg_export(mission_objectives, dst.mission_objectives); - ::sg_export(missionStats, dst.missionStats); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.missionObjectivesShown, missionObjectivesShown); - ::sg_import(src.sessionTeam, sessionTeam); - ::sg_import(src.mission_objectives, mission_objectives); - ::sg_import(src.missionStats, missionStats); - } + const SgType& src); } clientSession_t; // client data that stays across multiple respawns, but is cleared @@ -833,30 +607,10 @@ typedef struct { void sg_export( - SgType& dst) const - { - ::sg_export(connected, dst.connected); - ::sg_export(lastCommand, dst.lastCommand); - ::sg_export(localClient, dst.localClient); - ::sg_export(netname, dst.netname); - ::sg_export(maxHealth, dst.maxHealth); - ::sg_export(enterTime, dst.enterTime); - ::sg_export(cmd_angles, dst.cmd_angles); - ::sg_export(teamState, dst.teamState); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.connected, connected); - ::sg_import(src.lastCommand, lastCommand); - ::sg_import(src.localClient, localClient); - ::sg_import(src.netname, netname); - ::sg_import(src.maxHealth, maxHealth); - ::sg_import(src.enterTime, enterTime); - ::sg_import(src.cmd_angles, cmd_angles); - ::sg_import(src.teamState, teamState); - } + const SgType& src); } clientPersistant_t; typedef enum { @@ -1039,124 +793,10 @@ struct gclient_s { void sg_export( - SgType& dst) const - { - ::sg_export(ps, dst.ps); - ::sg_export(pers, dst.pers); - ::sg_export(sess, dst.sess); - ::sg_export(noclip, dst.noclip); - ::sg_export(lastCmdTime, dst.lastCmdTime); - ::sg_export(usercmd, dst.usercmd); - ::sg_export(buttons, dst.buttons); - ::sg_export(oldbuttons, dst.oldbuttons); - ::sg_export(latched_buttons, dst.latched_buttons); - ::sg_export(damage_armor, dst.damage_armor); - ::sg_export(damage_blood, dst.damage_blood); - ::sg_export(damage_knockback, dst.damage_knockback); - ::sg_export(damage_from, dst.damage_from); - ::sg_export(damage_fromWorld, dst.damage_fromWorld); - ::sg_export(accurateCount, dst.accurateCount); - ::sg_export(respawnTime, dst.respawnTime); - ::sg_export(inactivityTime, dst.inactivityTime); - ::sg_export(inactivityWarning, dst.inactivityWarning); - ::sg_export(idleTime, dst.idleTime); - ::sg_export(airOutTime, dst.airOutTime); - ::sg_export(timeResidual, dst.timeResidual); - ::sg_export(facial_blink, dst.facial_blink); - ::sg_export(facial_frown, dst.facial_frown); - ::sg_export(facial_aux, dst.facial_aux); - ::sg_export(clientInfo, dst.clientInfo); - ::sg_export(forced_forwardmove, dst.forced_forwardmove); - ::sg_export(forced_rightmove, dst.forced_rightmove); - ::sg_export(fireDelay, dst.fireDelay); - ::sg_export(playerTeam, dst.playerTeam); - ::sg_export(enemyTeam, dst.enemyTeam); - ::sg_export(squadname, dst.squadname); - ::sg_export(team_leader, dst.team_leader); - ::sg_export(leader, dst.leader); - ::sg_export(follower, dst.follower); - ::sg_export(numFollowers, dst.numFollowers); - ::sg_export(formationGoal, dst.formationGoal); - ::sg_export(nextFormGoal, dst.nextFormGoal); - ::sg_export(NPC_class, dst.NPC_class); - ::sg_export(hiddenDist, dst.hiddenDist); - ::sg_export(hiddenDir, dst.hiddenDir); - ::sg_export(renderInfo, dst.renderInfo); - ::sg_export(saberTrail, dst.saberTrail); - ::sg_export(dismembered, dst.dismembered); - ::sg_export(dismemberProbLegs, dst.dismemberProbLegs); - ::sg_export(dismemberProbHead, dst.dismemberProbHead); - ::sg_export(dismemberProbArms, dst.dismemberProbArms); - ::sg_export(dismemberProbHands, dst.dismemberProbHands); - ::sg_export(dismemberProbWaist, dst.dismemberProbWaist); - ::sg_export(standheight, dst.standheight); - ::sg_export(crouchheight, dst.crouchheight); - ::sg_export(poisonDamage, dst.poisonDamage); - ::sg_export(poisonTime, dst.poisonTime); - ::sg_export(slopeRecalcTime, dst.slopeRecalcTime); - ::sg_export(pushVec, dst.pushVec); - ::sg_export(pushVecTime, dst.pushVecTime); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.ps, ps); - ::sg_import(src.pers, pers); - ::sg_import(src.sess, sess); - ::sg_import(src.noclip, noclip); - ::sg_import(src.lastCmdTime, lastCmdTime); - ::sg_import(src.usercmd, usercmd); - ::sg_import(src.buttons, buttons); - ::sg_import(src.oldbuttons, oldbuttons); - ::sg_import(src.latched_buttons, latched_buttons); - ::sg_import(src.damage_armor, damage_armor); - ::sg_import(src.damage_blood, damage_blood); - ::sg_import(src.damage_knockback, damage_knockback); - ::sg_import(src.damage_from, damage_from); - ::sg_import(src.damage_fromWorld, damage_fromWorld); - ::sg_import(src.accurateCount, accurateCount); - ::sg_import(src.respawnTime, respawnTime); - ::sg_import(src.inactivityTime, inactivityTime); - ::sg_import(src.inactivityWarning, inactivityWarning); - ::sg_import(src.idleTime, idleTime); - ::sg_import(src.airOutTime, airOutTime); - ::sg_import(src.timeResidual, timeResidual); - ::sg_import(src.facial_blink, facial_blink); - ::sg_import(src.facial_frown, facial_frown); - ::sg_import(src.facial_aux, facial_aux); - ::sg_import(src.clientInfo, clientInfo); - ::sg_import(src.forced_forwardmove, forced_forwardmove); - ::sg_import(src.forced_rightmove, forced_rightmove); - ::sg_import(src.fireDelay, fireDelay); - ::sg_import(src.playerTeam, playerTeam); - ::sg_import(src.enemyTeam, enemyTeam); - ::sg_import(src.squadname, squadname); - ::sg_import(src.team_leader, team_leader); - ::sg_import(src.leader, leader); - ::sg_import(src.follower, follower); - ::sg_import(src.numFollowers, numFollowers); - ::sg_import(src.formationGoal, formationGoal); - ::sg_import(src.nextFormGoal, nextFormGoal); - ::sg_import(src.NPC_class, NPC_class); - ::sg_import(src.hiddenDist, hiddenDist); - ::sg_import(src.hiddenDir, hiddenDir); - ::sg_import(src.renderInfo, renderInfo); - ::sg_import(src.saberTrail, saberTrail); - ::sg_import(src.dismembered, dismembered); - ::sg_import(src.dismemberProbLegs, dismemberProbLegs); - ::sg_import(src.dismemberProbHead, dismemberProbHead); - ::sg_import(src.dismemberProbArms, dismemberProbArms); - ::sg_import(src.dismemberProbHands, dismemberProbHands); - ::sg_import(src.dismemberProbWaist, dismemberProbWaist); - ::sg_import(src.standheight, standheight); - ::sg_import(src.crouchheight, crouchheight); - ::sg_import(src.poisonDamage, poisonDamage); - ::sg_import(src.poisonTime, poisonTime); - ::sg_import(src.slopeRecalcTime, slopeRecalcTime); - ::sg_import(src.pushVec, pushVec); - ::sg_import(src.pushVecTime, pushVecTime); - } + const SgType& src); }; #define MAX_PARMS 16 @@ -1176,16 +816,10 @@ typedef struct void sg_export( - SgType& dst) const - { - ::sg_export(parm, dst.parm); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.parm, parm); - } + const SgType& src); } parms_t; #define GAME_INCLUDE @@ -1690,366 +1324,10 @@ Ghoul2 Insert End void sg_export( - SgType& dst) const - { - ::sg_export(s, dst.s); - ::sg_export(client, dst.client); - ::sg_export(inuse, dst.inuse); - ::sg_export(linked, dst.linked); - ::sg_export(svFlags, dst.svFlags); - ::sg_export(bmodel, dst.bmodel); - ::sg_export(mins, dst.mins); - ::sg_export(maxs, dst.maxs); - ::sg_export(contents, dst.contents); - ::sg_export(absmin, dst.absmin); - ::sg_export(absmax, dst.absmax); - ::sg_export(currentOrigin, dst.currentOrigin); - ::sg_export(currentAngles, dst.currentAngles); - ::sg_export(owner, dst.owner); - ::sg_export(ghoul2, dst.ghoul2); - ::sg_export(classname, dst.classname); - ::sg_export(spawnflags, dst.spawnflags); - ::sg_export(flags, dst.flags); - ::sg_export(model, dst.model); - ::sg_export(model2, dst.model2); - ::sg_export(freetime, dst.freetime); - ::sg_export(eventTime, dst.eventTime); - ::sg_export(freeAfterEvent, dst.freeAfterEvent); - ::sg_export(unlinkAfterEvent, dst.unlinkAfterEvent); - ::sg_export(physicsBounce, dst.physicsBounce); - ::sg_export(clipmask, dst.clipmask); - ::sg_export(speed, dst.speed); - ::sg_export(movedir, dst.movedir); - ::sg_export(lastOrigin, dst.lastOrigin); - ::sg_export(lastAngles, dst.lastAngles); - ::sg_export(mass, dst.mass); - ::sg_export(lastImpact, dst.lastImpact); - ::sg_export(watertype, dst.watertype); - ::sg_export(waterlevel, dst.waterlevel); - ::sg_export(angle, dst.angle); - ::sg_export(target, dst.target); - ::sg_export(target2, dst.target2); - ::sg_export(target3, dst.target3); - ::sg_export(target4, dst.target4); - ::sg_export(targetname, dst.targetname); - ::sg_export(team, dst.team); - ::sg_export(roff, dst.roff); - ::sg_export(roff_ctr, dst.roff_ctr); - ::sg_export(next_roff_time, dst.next_roff_time); - ::sg_export(fx_time, dst.fx_time); - ::sg_export(nextthink, dst.nextthink); - ::sg_export(e_ThinkFunc, dst.e_ThinkFunc); - ::sg_export(e_clThinkFunc, dst.e_clThinkFunc); - ::sg_export(e_ReachedFunc, dst.e_ReachedFunc); - ::sg_export(e_BlockedFunc, dst.e_BlockedFunc); - ::sg_export(e_TouchFunc, dst.e_TouchFunc); - ::sg_export(e_UseFunc, dst.e_UseFunc); - ::sg_export(e_PainFunc, dst.e_PainFunc); - ::sg_export(e_DieFunc, dst.e_DieFunc); - ::sg_export(health, dst.health); - ::sg_export(max_health, dst.max_health); - ::sg_export(takedamage, dst.takedamage); - ::sg_export(material, dst.material); - ::sg_export(damage, dst.damage); - ::sg_export(dflags, dst.dflags); - ::sg_export(splashDamage, dst.splashDamage); - ::sg_export(splashRadius, dst.splashRadius); - ::sg_export(methodOfDeath, dst.methodOfDeath); - ::sg_export(splashMethodOfDeath, dst.splashMethodOfDeath); - ::sg_export(locationDamage, dst.locationDamage); - ::sg_export(chain, dst.chain); - ::sg_export(enemy, dst.enemy); - ::sg_export(activator, dst.activator); - ::sg_export(teamchain, dst.teamchain); - ::sg_export(teammaster, dst.teammaster); - ::sg_export(lastEnemy, dst.lastEnemy); - ::sg_export(wait, dst.wait); - ::sg_export(random, dst.random); - ::sg_export(delay, dst.delay); - ::sg_export(alt_fire, dst.alt_fire); - ::sg_export(count, dst.count); - ::sg_export(bounceCount, dst.bounceCount); - ::sg_export(fly_sound_debounce_time, dst.fly_sound_debounce_time); - ::sg_export(painDebounceTime, dst.painDebounceTime); - ::sg_export(disconnectDebounceTime, dst.disconnectDebounceTime); - ::sg_export(attackDebounceTime, dst.attackDebounceTime); - ::sg_export(pushDebounceTime, dst.pushDebounceTime); - ::sg_export(aimDebounceTime, dst.aimDebounceTime); - ::sg_export(useDebounceTime, dst.useDebounceTime); - ::sg_export(trigger_formation, dst.trigger_formation); - ::sg_export(waypoint, dst.waypoint); - ::sg_export(lastWaypoint, dst.lastWaypoint); - ::sg_export(lastValidWaypoint, dst.lastValidWaypoint); - ::sg_export(noWaypointTime, dst.noWaypointTime); - ::sg_export(combatPoint, dst.combatPoint); - ::sg_export(failedWaypoints, dst.failedWaypoints); - ::sg_export(failedWaypointCheckTime, dst.failedWaypointCheckTime); - ::sg_export(loopAnim, dst.loopAnim); - ::sg_export(startFrame, dst.startFrame); - ::sg_export(endFrame, dst.endFrame); - ::sg_export(sequencer, dst.sequencer); - ::sg_export(taskManager, dst.taskManager); - ::sg_export(taskID, dst.taskID); - ::sg_export(parms, dst.parms); - ::sg_export(behaviorSet, dst.behaviorSet); - ::sg_export(script_targetname, dst.script_targetname); - ::sg_export(delayScriptTime, dst.delayScriptTime); - ::sg_export(fullName, dst.fullName); - ::sg_export(soundSet, dst.soundSet); - ::sg_export(setTime, dst.setTime); - ::sg_export(cameraGroup, dst.cameraGroup); - ::sg_export(noDamageTeam, dst.noDamageTeam); - ::sg_export(playerModel, dst.playerModel); - ::sg_export(weaponModel, dst.weaponModel); - ::sg_export(handRBolt, dst.handRBolt); - ::sg_export(handLBolt, dst.handLBolt); - ::sg_export(headBolt, dst.headBolt); - ::sg_export(cervicalBolt, dst.cervicalBolt); - ::sg_export(chestBolt, dst.chestBolt); - ::sg_export(gutBolt, dst.gutBolt); - ::sg_export(torsoBolt, dst.torsoBolt); - ::sg_export(crotchBolt, dst.crotchBolt); - ::sg_export(motionBolt, dst.motionBolt); - ::sg_export(kneeLBolt, dst.kneeLBolt); - ::sg_export(kneeRBolt, dst.kneeRBolt); - ::sg_export(elbowLBolt, dst.elbowLBolt); - ::sg_export(elbowRBolt, dst.elbowRBolt); - ::sg_export(footLBolt, dst.footLBolt); - ::sg_export(footRBolt, dst.footRBolt); - ::sg_export(faceBone, dst.faceBone); - ::sg_export(craniumBone, dst.craniumBone); - ::sg_export(cervicalBone, dst.cervicalBone); - ::sg_export(thoracicBone, dst.thoracicBone); - ::sg_export(upperLumbarBone, dst.upperLumbarBone); - ::sg_export(lowerLumbarBone, dst.lowerLumbarBone); - ::sg_export(hipsBone, dst.hipsBone); - ::sg_export(motionBone, dst.motionBone); - ::sg_export(rootBone, dst.rootBone); - ::sg_export(footLBone, dst.footLBone); - ::sg_export(footRBone, dst.footRBone); - ::sg_export(genericBone1, dst.genericBone1); - ::sg_export(genericBone2, dst.genericBone2); - ::sg_export(genericBone3, dst.genericBone3); - ::sg_export(genericBolt1, dst.genericBolt1); - ::sg_export(genericBolt2, dst.genericBolt2); - ::sg_export(genericBolt3, dst.genericBolt3); - ::sg_export(genericBolt4, dst.genericBolt4); - ::sg_export(genericBolt5, dst.genericBolt5); - ::sg_export(cinematicModel, dst.cinematicModel); - ::sg_export(NPC, dst.NPC); - ::sg_export(ownername, dst.ownername); - ::sg_export(cantHitEnemyCounter, dst.cantHitEnemyCounter); - ::sg_export(NPC_type, dst.NPC_type); - ::sg_export(NPC_targetname, dst.NPC_targetname); - ::sg_export(NPC_target, dst.NPC_target); - ::sg_export(moverState, dst.moverState); - ::sg_export(soundPos1, dst.soundPos1); - ::sg_export(sound1to2, dst.sound1to2); - ::sg_export(sound2to1, dst.sound2to1); - ::sg_export(soundPos2, dst.soundPos2); - ::sg_export(soundLoop, dst.soundLoop); - ::sg_export(nextTrain, dst.nextTrain); - ::sg_export(prevTrain, dst.prevTrain); - ::sg_export(pos1, dst.pos1); - ::sg_export(pos2, dst.pos2); - ::sg_export(pos3, dst.pos3); - ::sg_export(sounds, dst.sounds); - ::sg_export(closetarget, dst.closetarget); - ::sg_export(opentarget, dst.opentarget); - ::sg_export(paintarget, dst.paintarget); - ::sg_export(lockCount, dst.lockCount); - ::sg_export(radius, dst.radius); - ::sg_export(wpIndex, dst.wpIndex); - ::sg_export(noise_index, dst.noise_index); - ::sg_export(startRGBA, dst.startRGBA); - ::sg_export(finalRGBA, dst.finalRGBA); - ::sg_export(item, dst.item); - ::sg_export(message, dst.message); - ::sg_export(lightLevel, dst.lightLevel); - ::sg_export(forcePushTime, dst.forcePushTime); - ::sg_export(forcePuller, dst.forcePuller); - } + SgType& dst) const; void sg_import( - const SgType& src) - { - ::sg_import(src.s, s); - ::sg_import(src.client, client); - ::sg_import(src.inuse, inuse); - ::sg_import(src.linked, linked); - ::sg_import(src.svFlags, svFlags); - ::sg_import(src.bmodel, bmodel); - ::sg_import(src.mins, mins); - ::sg_import(src.maxs, maxs); - ::sg_import(src.contents, contents); - ::sg_import(src.absmin, absmin); - ::sg_import(src.absmax, absmax); - ::sg_import(src.currentOrigin, currentOrigin); - ::sg_import(src.currentAngles, currentAngles); - ::sg_import(src.owner, owner); - ::sg_import(src.ghoul2, ghoul2); - ::sg_import(src.classname, classname); - ::sg_import(src.spawnflags, spawnflags); - ::sg_import(src.flags, flags); - ::sg_import(src.model, model); - ::sg_import(src.model2, model2); - ::sg_import(src.freetime, freetime); - ::sg_import(src.eventTime, eventTime); - ::sg_import(src.freeAfterEvent, freeAfterEvent); - ::sg_import(src.unlinkAfterEvent, unlinkAfterEvent); - ::sg_import(src.physicsBounce, physicsBounce); - ::sg_import(src.clipmask, clipmask); - ::sg_import(src.speed, speed); - ::sg_import(src.movedir, movedir); - ::sg_import(src.lastOrigin, lastOrigin); - ::sg_import(src.lastAngles, lastAngles); - ::sg_import(src.mass, mass); - ::sg_import(src.lastImpact, lastImpact); - ::sg_import(src.watertype, watertype); - ::sg_import(src.waterlevel, waterlevel); - ::sg_import(src.angle, angle); - ::sg_import(src.target, target); - ::sg_import(src.target2, target2); - ::sg_import(src.target3, target3); - ::sg_import(src.target4, target4); - ::sg_import(src.targetname, targetname); - ::sg_import(src.team, team); - ::sg_import(src.roff, roff); - ::sg_import(src.roff_ctr, roff_ctr); - ::sg_import(src.next_roff_time, next_roff_time); - ::sg_import(src.fx_time, fx_time); - ::sg_import(src.nextthink, nextthink); - ::sg_import(src.e_ThinkFunc, e_ThinkFunc); - ::sg_import(src.e_clThinkFunc, e_clThinkFunc); - ::sg_import(src.e_ReachedFunc, e_ReachedFunc); - ::sg_import(src.e_BlockedFunc, e_BlockedFunc); - ::sg_import(src.e_TouchFunc, e_TouchFunc); - ::sg_import(src.e_UseFunc, e_UseFunc); - ::sg_import(src.e_PainFunc, e_PainFunc); - ::sg_import(src.e_DieFunc, e_DieFunc); - ::sg_import(src.health, health); - ::sg_import(src.max_health, max_health); - ::sg_import(src.takedamage, takedamage); - ::sg_import(src.material, material); - ::sg_import(src.damage, damage); - ::sg_import(src.dflags, dflags); - ::sg_import(src.splashDamage, splashDamage); - ::sg_import(src.splashRadius, splashRadius); - ::sg_import(src.methodOfDeath, methodOfDeath); - ::sg_import(src.splashMethodOfDeath, splashMethodOfDeath); - ::sg_import(src.locationDamage, locationDamage); - ::sg_import(src.chain, chain); - ::sg_import(src.enemy, enemy); - ::sg_import(src.activator, activator); - ::sg_import(src.teamchain, teamchain); - ::sg_import(src.teammaster, teammaster); - ::sg_import(src.lastEnemy, lastEnemy); - ::sg_import(src.wait, wait); - ::sg_import(src.random, random); - ::sg_import(src.delay, delay); - ::sg_import(src.alt_fire, alt_fire); - ::sg_import(src.count, count); - ::sg_import(src.bounceCount, bounceCount); - ::sg_import(src.fly_sound_debounce_time, fly_sound_debounce_time); - ::sg_import(src.painDebounceTime, painDebounceTime); - ::sg_import(src.disconnectDebounceTime, disconnectDebounceTime); - ::sg_import(src.attackDebounceTime, attackDebounceTime); - ::sg_import(src.pushDebounceTime, pushDebounceTime); - ::sg_import(src.aimDebounceTime, aimDebounceTime); - ::sg_import(src.useDebounceTime, useDebounceTime); - ::sg_import(src.trigger_formation, trigger_formation); - ::sg_import(src.waypoint, waypoint); - ::sg_import(src.lastWaypoint, lastWaypoint); - ::sg_import(src.lastValidWaypoint, lastValidWaypoint); - ::sg_import(src.noWaypointTime, noWaypointTime); - ::sg_import(src.combatPoint, combatPoint); - ::sg_import(src.failedWaypoints, failedWaypoints); - ::sg_import(src.failedWaypointCheckTime, failedWaypointCheckTime); - ::sg_import(src.loopAnim, loopAnim); - ::sg_import(src.startFrame, startFrame); - ::sg_import(src.endFrame, endFrame); - ::sg_import(src.sequencer, sequencer); - ::sg_import(src.taskManager, taskManager); - ::sg_import(src.taskID, taskID); - ::sg_import(src.parms, parms); - ::sg_import(src.behaviorSet, behaviorSet); - ::sg_import(src.script_targetname, script_targetname); - ::sg_import(src.delayScriptTime, delayScriptTime); - ::sg_import(src.fullName, fullName); - ::sg_import(src.soundSet, soundSet); - ::sg_import(src.setTime, setTime); - ::sg_import(src.cameraGroup, cameraGroup); - ::sg_import(src.noDamageTeam, noDamageTeam); - ::sg_import(src.playerModel, playerModel); - ::sg_import(src.weaponModel, weaponModel); - ::sg_import(src.handRBolt, handRBolt); - ::sg_import(src.handLBolt, handLBolt); - ::sg_import(src.headBolt, headBolt); - ::sg_import(src.cervicalBolt, cervicalBolt); - ::sg_import(src.chestBolt, chestBolt); - ::sg_import(src.gutBolt, gutBolt); - ::sg_import(src.torsoBolt, torsoBolt); - ::sg_import(src.crotchBolt, crotchBolt); - ::sg_import(src.motionBolt, motionBolt); - ::sg_import(src.kneeLBolt, kneeLBolt); - ::sg_import(src.kneeRBolt, kneeRBolt); - ::sg_import(src.elbowLBolt, elbowLBolt); - ::sg_import(src.elbowRBolt, elbowRBolt); - ::sg_import(src.footLBolt, footLBolt); - ::sg_import(src.footRBolt, footRBolt); - ::sg_import(src.faceBone, faceBone); - ::sg_import(src.craniumBone, craniumBone); - ::sg_import(src.cervicalBone, cervicalBone); - ::sg_import(src.thoracicBone, thoracicBone); - ::sg_import(src.upperLumbarBone, upperLumbarBone); - ::sg_import(src.lowerLumbarBone, lowerLumbarBone); - ::sg_import(src.hipsBone, hipsBone); - ::sg_import(src.motionBone, motionBone); - ::sg_import(src.rootBone, rootBone); - ::sg_import(src.footLBone, footLBone); - ::sg_import(src.footRBone, footRBone); - ::sg_import(src.genericBone1, genericBone1); - ::sg_import(src.genericBone2, genericBone2); - ::sg_import(src.genericBone3, genericBone3); - ::sg_import(src.genericBolt1, genericBolt1); - ::sg_import(src.genericBolt2, genericBolt2); - ::sg_import(src.genericBolt3, genericBolt3); - ::sg_import(src.genericBolt4, genericBolt4); - ::sg_import(src.genericBolt5, genericBolt5); - ::sg_import(src.cinematicModel, cinematicModel); - ::sg_import(src.NPC, NPC); - ::sg_import(src.ownername, ownername); - ::sg_import(src.cantHitEnemyCounter, cantHitEnemyCounter); - ::sg_import(src.NPC_type, NPC_type); - ::sg_import(src.NPC_targetname, NPC_targetname); - ::sg_import(src.NPC_target, NPC_target); - ::sg_import(src.moverState, moverState); - ::sg_import(src.soundPos1, soundPos1); - ::sg_import(src.sound1to2, sound1to2); - ::sg_import(src.sound2to1, sound2to1); - ::sg_import(src.soundPos2, soundPos2); - ::sg_import(src.soundLoop, soundLoop); - ::sg_import(src.nextTrain, nextTrain); - ::sg_import(src.prevTrain, prevTrain); - ::sg_import(src.pos1, pos1); - ::sg_import(src.pos2, pos2); - ::sg_import(src.pos3, pos3); - ::sg_import(src.sounds, sounds); - ::sg_import(src.closetarget, closetarget); - ::sg_import(src.opentarget, opentarget); - ::sg_import(src.paintarget, paintarget); - ::sg_import(src.lockCount, lockCount); - ::sg_import(src.radius, radius); - ::sg_import(src.wpIndex, wpIndex); - ::sg_import(src.noise_index, noise_index); - ::sg_import(src.startRGBA, startRGBA); - ::sg_import(src.finalRGBA, finalRGBA); - ::sg_import(src.item, item); - ::sg_import(src.message, message); - ::sg_import(src.lightLevel, lightLevel); - ::sg_import(src.forcePushTime, forcePushTime); - ::sg_import(src.forcePuller, forcePuller); - } + const SgType& src); }; #endif //#ifdef GAME_INCLUDE diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index bd1209817c..341f8cbaf7 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -137,8 +137,6 @@ bool SavedGame::read_chunk( "Attempting read of chunk %s\n", chunk_id_string.c_str()); - // Load in chid and length... - // uint32_t ulLoadedChid = 0; uint32_t uiLoadedLength = 0; From 7cc517c4d6cc813b5fb9f78564b8543faef4ab18 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 9 Jul 2016 18:26:38 +0300 Subject: [PATCH 240/445] Add missing methods --- code/cgame/FxScheduler.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/code/cgame/FxScheduler.cpp b/code/cgame/FxScheduler.cpp index 62040c32c6..cf507097ae 100644 --- a/code/cgame/FxScheduler.cpp +++ b/code/cgame/FxScheduler.cpp @@ -1911,3 +1911,26 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, const vec3_t origin, ve } } } + + +void SLoopedEffect::sg_export( + SgType& dst) const +{ + ::sg_export(mId, dst.mId); + ::sg_export(mBoltInfo, dst.mBoltInfo); + ::sg_export(mNextTime, dst.mNextTime); + ::sg_export(mLoopStopTime, dst.mLoopStopTime); + ::sg_export(mPortalEffect, dst.mPortalEffect); + ::sg_export(mIsRelative, dst.mIsRelative); +} + +void SLoopedEffect::sg_import( + const SgType& src) +{ + ::sg_import(src.mId, mId); + ::sg_import(src.mBoltInfo, mBoltInfo); + ::sg_import(src.mNextTime, mNextTime); + ::sg_import(src.mLoopStopTime, mLoopStopTime); + ::sg_import(src.mPortalEffect, mPortalEffect); + ::sg_import(src.mIsRelative, mIsRelative); +} From f839070c8853b9d2027f4842cc4948da10fb7e0e Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 9 Jul 2016 18:27:12 +0300 Subject: [PATCH 241/445] Add pointer to saved game object for game interface --- code/game/g_public.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/g_public.h b/code/game/g_public.h index 4d667bcc3d..8c178f086c 100644 --- a/code/game/g_public.h +++ b/code/game/g_public.h @@ -25,6 +25,10 @@ along with this program; if not, see . #define __G_PUBLIC_H__ // g_public.h -- game module information visible to server + +#include "qcommon/ojk_sg_wrappers_fwd.h" + + #define GAME_API_VERSION 8 // entity->svFlags @@ -186,6 +190,8 @@ typedef struct { int (*ReadFromSaveGame)(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPtr ); int (*ReadFromSaveGameOptional)(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPtr ); + ojk::SavedGame* saved_game; + // add commands to the console as if they were typed in // for map changing, etc void (*SendConsoleCommand)( const char *text ); From cc7cc6cd4de08353446af3e55f9cff607ba17007 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 9 Jul 2016 18:28:07 +0300 Subject: [PATCH 242/445] Implement reading and writing of two-dimension arrays --- shared/qcommon/ojk_saved_game.h | 32 +++++++++++++++++++++++++++-- shared/qcommon/ojk_saved_game_fwd.h | 11 ++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game.h index 7df50d22c2..463573616a 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game.h @@ -172,7 +172,11 @@ void SavedGame::read( typename std::conditional< std::rank::value == 1, Array1dTag, - void + typename std::conditional< + std::rank::value == 2, + Array2dTag, + void + >::type >::type >::type >::type @@ -264,6 +268,16 @@ void SavedGame::read( TCount); } +template +void SavedGame::read( + TDst(&dst_values)[TCount1][TCount2], + Array2dTag) +{ + read( + &dst_values[0][0], + TCount1 * TCount2); +} + // read // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @@ -399,7 +413,11 @@ void SavedGame::write( typename std::conditional< std::rank::value == 1, Array1dTag, - void + typename std::conditional< + std::rank::value == 2, + Array2dTag, + void + >::type >::type >::type >::type @@ -466,6 +484,16 @@ void SavedGame::write( TCount); } +template +void SavedGame::write( + const TSrc(&src_values)[TCount1][TCount2], + Array2dTag) +{ + write( + &src_values[0][0], + TCount1 * TCount2); +} + // write // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> diff --git a/shared/qcommon/ojk_saved_game_fwd.h b/shared/qcommon/ojk_saved_game_fwd.h index db2b818d44..feef9311b2 100644 --- a/shared/qcommon/ojk_saved_game_fwd.h +++ b/shared/qcommon/ojk_saved_game_fwd.h @@ -135,6 +135,7 @@ class SavedGame class PointerTag { public: }; class ClassTag { public: }; class Array1dTag { public: }; + class Array2dTag { public: }; class InplaceTag { public: }; class CastTag { public: }; @@ -225,6 +226,11 @@ class SavedGame TDst (&dst_values)[TCount], Array1dTag); + template + void read( + TDst(&dst_values)[TCount1][TCount2], + Array2dTag); + template void read( @@ -259,6 +265,11 @@ class SavedGame const TSrc (&src_values)[TCount], Array1dTag); + template + void write( + const TSrc(&src_values)[TCount1][TCount2], + Array2dTag); + template void write( From 9e6541d35162193208761fe0cfe6d527a27229dd Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 9 Jul 2016 22:39:07 +0300 Subject: [PATCH 243/445] Access fields or throw exceptions in templated members via methods only --- shared/qcommon/ojk_saved_game.cpp | 106 +++++++++++++++++++++++++ shared/qcommon/ojk_saved_game.h | 117 +++++++++++----------------- shared/qcommon/ojk_saved_game_fwd.h | 44 ++++++++--- 3 files changed, 185 insertions(+), 82 deletions(-) diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index 341f8cbaf7..db70802430 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -364,6 +364,31 @@ bool SavedGame::write_chunk( return true; } +SavedGame::Buffer& SavedGame::get_buffer() +{ + return io_buffer_; +} + +const SavedGame::Buffer& SavedGame::get_buffer() const +{ + return io_buffer_; +} + +int SavedGame::get_buffer_offset() const +{ + return static_cast(io_buffer_offset_); +} + +uint8_t* SavedGame::get_current_data() +{ + return &io_buffer_[io_buffer_offset_]; +} + +const uint8_t* SavedGame::get_current_data() const +{ + return &io_buffer_[io_buffer_offset_]; +} + void SavedGame::rename( const std::string& old_base_file_name, const std::string& new_base_file_name) @@ -401,6 +426,20 @@ SavedGame& SavedGame::get_instance() return result; } +void SavedGame::throw_error( + const char* message) +{ + throw SavedGameException( + message); +} + +void SavedGame::throw_error( + const std::string& message) +{ + throw SavedGameException( + message); +} + void SavedGame::compress( const Buffer& src_buffer, Buffer& dst_buffer) @@ -554,5 +593,72 @@ std::string SavedGame::get_chunk_id_string( return result; } +void SavedGame::check_io_buffer( + int item_size, + int count) +{ + if (item_size <= 0) { + throw SavedGameException( + "Zero or negative item size."); + } + + if (count <= 0) { + throw SavedGameException( + "Zero or negative count."); + } + + const auto data_size = item_size * count; + + if ((io_buffer_offset_ + data_size) > io_buffer_.size()) { + throw SavedGameException( + "Not enough data."); + } +} + +void SavedGame::accomodate_io_buffer( + int item_size, + int count) +{ + if (item_size <= 0) { + throw SavedGameException( + "Zero or negative item size."); + } + + if (count <= 0) { + throw SavedGameException( + "Zero or negative count."); + } + + const auto data_size = item_size * count; + + const auto new_buffer_size = io_buffer_offset_ + data_size; + + io_buffer_.resize( + new_buffer_size); +} + +void SavedGame::advance_io_buffer( + int item_size, + int count) +{ + if (item_size <= 0) { + throw SavedGameException( + "Zero or negative item size."); + } + + if (count <= 0) { + throw SavedGameException( + "Zero or negative count."); + } + + const auto data_size = item_size * count; + io_buffer_offset_ += data_size; +} + +void SavedGame::reset_io_buffer_offset() +{ + io_buffer_offset_ = 0; +} + } // ojk diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game.h index 463573616a..d7c617a451 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game.h @@ -20,56 +20,9 @@ namespace ojk { // I/O buffer manipulation. template -void SavedGame::check_io_buffer( - int count) +T SavedGame::cast_buffer() { - if (count <= 0) { - throw SavedGameException( - "Zero or negative count."); - } - - const auto data_size = sizeof(T) * count; - - if ((io_buffer_offset_ + data_size) > io_buffer_.size()) { - throw SavedGameException( - "Not enough data."); - } -} - -template -void SavedGame::accomodate_io_buffer( - int count) -{ - if (count <= 0) { - throw SavedGameException( - "Zero or negative count."); - } - - const auto data_size = sizeof(T) * count; - - const auto new_buffer_size = io_buffer_offset_ + data_size; - - io_buffer_.resize( - new_buffer_size); -} - -template -T SavedGame::cast_io_buffer() -{ - return reinterpret_cast(io_buffer_[io_buffer_offset_]); -} - -template -void SavedGame::advance_io_buffer( - int count) -{ - if (count <= 0) { - throw SavedGameException( - "Zero or negative count."); - } - - const auto data_size = sizeof(T) * count; - io_buffer_offset_ += data_size; + return reinterpret_cast(*get_current_data()); } // I/O buffer manipulation. @@ -121,7 +74,7 @@ bool SavedGame::write_chunk( const ChunkId chunk_id, const TSrc& src_value) { - io_buffer_offset_ = 0; + reset_io_buffer_offset(); write( src_value); @@ -136,7 +89,7 @@ bool SavedGame::write_chunk( const TSrc* src_values, int src_count) { - io_buffer_offset_ = 0; + reset_io_buffer_offset(); write( src_values, @@ -197,16 +150,18 @@ void SavedGame::read( TDst& dst_value, BooleanTag) { - constexpr auto src_size = sizeof(TSrc); + constexpr auto src_size = static_cast(sizeof(TSrc)); - check_io_buffer(); + check_io_buffer( + src_size); - dst_value = (cast_io_buffer() != 0); + dst_value = (cast_buffer() != 0); // FIXME Byte order // - advance_io_buffer(); + advance_io_buffer( + src_size); } template @@ -214,14 +169,18 @@ void SavedGame::read( TDst& dst_value, NumericTag) { - check_io_buffer(); + constexpr auto src_size = static_cast(sizeof(TSrc)); + + check_io_buffer( + src_size); - dst_value = static_cast(cast_io_buffer()); + dst_value = static_cast(cast_buffer()); // FIXME Byte order // - advance_io_buffer(); + advance_io_buffer( + src_size); } template @@ -254,7 +213,7 @@ void SavedGame::read( TDst& dst_value, ClassTag) { - throw SavedGameException( + throw_error( "Not implemented."); } @@ -298,12 +257,12 @@ void SavedGame::read( "Unsupported types."); if (!dst_values) { - throw SavedGameException( + throw_error( "Null pointer."); } if (dst_count < 0) { - throw SavedGameException( + throw_error( "Negative count."); } @@ -352,18 +311,22 @@ void SavedGame::read( int dst_count, InplaceTag) { - check_io_buffer( + constexpr auto dst_size = static_cast(sizeof(TDst)); + + check_io_buffer( + dst_size, dst_count); std::uninitialized_copy_n( - &cast_io_buffer(), + &cast_buffer(), dst_count, dst_values); // FIXME Byte order // - advance_io_buffer( + advance_io_buffer( + dst_size, dst_count); } @@ -437,14 +400,18 @@ void SavedGame::write( const TSrc& src_value, NumericTag) { - accomodate_io_buffer(); + constexpr auto src_size = static_cast(sizeof(TSrc)); + + accomodate_io_buffer( + src_size); - cast_io_buffer() = static_cast(src_value); + cast_buffer() = static_cast(src_value); // FIXME Byte order // - advance_io_buffer(); + advance_io_buffer( + src_size); } template @@ -470,7 +437,7 @@ void SavedGame::write( const TSrc& src_value, ClassTag) { - throw SavedGameException( + throw_error( "Not implemented."); } @@ -514,12 +481,12 @@ void SavedGame::write( "Unsupported types."); if (!src_values) { - throw SavedGameException( + throw_error( "Null pointer."); } if (src_count < 0) { - throw SavedGameException( + throw_error( "Negative count."); } @@ -568,18 +535,22 @@ void SavedGame::write( int src_count, InplaceTag) { - accomodate_io_buffer( + constexpr auto src_size = static_cast(sizeof(TSrc)); + + accomodate_io_buffer( + src_size, src_count); std::uninitialized_copy_n( src_values, src_count, - &cast_io_buffer()); + &cast_buffer()); // FIXME Byte order // - advance_io_buffer( + advance_io_buffer( + src_size, src_count); } diff --git a/shared/qcommon/ojk_saved_game_fwd.h b/shared/qcommon/ojk_saved_game_fwd.h index feef9311b2..937b8c6cc6 100644 --- a/shared/qcommon/ojk_saved_game_fwd.h +++ b/shared/qcommon/ojk_saved_game_fwd.h @@ -11,7 +11,6 @@ #include #include #include -#include "ojk_saved_game_exception.h" namespace ojk { @@ -21,6 +20,7 @@ class SavedGame { public: using ChunkId = uint32_t; + using Buffer = std::vector; SavedGame(); @@ -110,6 +110,24 @@ class SavedGame int src_count); + // Returns an I/O buffer. + Buffer& get_buffer(); + + // Returns an I/O buffer. + const Buffer& get_buffer() const; + + // Returns an I/O buffer offset; + int get_buffer_offset() const; + + uint8_t* get_current_data(); + + const uint8_t* get_current_data() const; + + // Casts referenced data at current position into a specified type. + template + T cast_buffer(); + + // Renames a saved game file. static void rename( const std::string& old_base_file_name, @@ -124,7 +142,6 @@ class SavedGame private: - using Buffer = std::vector; using BufferOffset = Buffer::size_type; using Paths = std::vector; @@ -158,6 +175,15 @@ class SavedGame bool is_write_failed_; + // Throws an exception. + static void throw_error( + const char* message); + + // Throws an exception. + static void throw_error( + const std::string& message); + + // Compresses data. static void compress( const Buffer& src_buffer, @@ -177,29 +203,29 @@ class SavedGame bool is_open); + // Returns a string representation of a chunk id. static std::string get_chunk_id_string( uint32_t chunk_id); // Checks if there is enough data for reading in the I/O buffer. - template void check_io_buffer( + int item_size, int count = 1); // Resizes the I/O buffer according to desire size of data to write. - template void accomodate_io_buffer( + int item_size, int count = 1); - // Casts I/O buffer data at the current offset. - template - T cast_io_buffer(); - // Advances the current I/O buffer offset. - template void advance_io_buffer( + int item_size, int count = 1); + // Resets I/O buffer offset to zero. + void reset_io_buffer_offset(); + template void read( From c9122352e786fe14a88e24e69908966038c38bdf Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 10 Jul 2016 17:03:44 +0300 Subject: [PATCH 244/445] Split saved game class into the interface and the implementation --- code/CMakeLists.txt | 3 +- code/game/CMakeLists.txt | 6 +- code/rd-vanilla/CMakeLists.txt | 6 +- codeJK2/game/CMakeLists.txt | 6 +- shared/qcommon/ojk_i_saved_game.h | 540 +++++++++++++++ ...aved_game_fwd.h => ojk_i_saved_game_fwd.h} | 164 +---- shared/qcommon/ojk_saved_game.cpp | 170 ++--- shared/qcommon/ojk_saved_game.h | 624 +++--------------- 8 files changed, 775 insertions(+), 744 deletions(-) create mode 100644 shared/qcommon/ojk_i_saved_game.h rename shared/qcommon/{ojk_saved_game_fwd.h => ojk_i_saved_game_fwd.h} (56%) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 709601a684..a0757faf29 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -179,8 +179,9 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" "${SharedDir}/qcommon/ojk_exception.h" "${SharedDir}/qcommon/ojk_exception.cpp" + "${SharedDir}/qcommon/ojk_i_saved_game.h" + "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" "${SharedDir}/qcommon/ojk_saved_game.h" - "${SharedDir}/qcommon/ojk_saved_game_fwd.h" "${SharedDir}/qcommon/ojk_saved_game.cpp" "${SharedDir}/qcommon/ojk_saved_game_exception.h" "${SharedDir}/qcommon/ojk_saved_game_exception.cpp" diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 7464fc50a8..a1cf3bf2a2 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -268,10 +268,8 @@ set(SPGameCommonFiles "${SharedDir}/qcommon/ojk_sg_wrappers.h" "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" - "${SharedDir}/qcommon/ojk_exception.h" - "${SharedDir}/qcommon/ojk_saved_game.h" - "${SharedDir}/qcommon/ojk_saved_game_fwd.h" - "${SharedDir}/qcommon/ojk_saved_game_exception.h" + "${SharedDir}/qcommon/ojk_i_saved_game.h" + "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" ${SharedCommonFiles} ) diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index 1de092be22..02dbec00e5 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -81,10 +81,8 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) "${SharedDir}/qcommon/ojk_sg_wrappers.h" "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" - "${SharedDir}/qcommon/ojk_exception.h" - "${SharedDir}/qcommon/ojk_saved_game.h" - "${SharedDir}/qcommon/ojk_saved_game_fwd.h" - "${SharedDir}/qcommon/ojk_saved_game_exception.h" + "${SharedDir}/qcommon/ojk_i_saved_game.h" + "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" ${SharedCommonFiles} ) source_group("common" FILES ${SPRDVanillaCommonFiles}) diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index 0ae0b1488d..37d91ebdf0 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -240,10 +240,8 @@ set(JK2SPGameCommonFiles "${SharedDir}/qcommon/ojk_sg_wrappers.h" "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" - "${SharedDir}/qcommon/ojk_exception.h" - "${SharedDir}/qcommon/ojk_saved_game.h" - "${SharedDir}/qcommon/ojk_saved_game_fwd.h" - "${SharedDir}/qcommon/ojk_saved_game_exception.h" + "${SharedDir}/qcommon/ojk_i_saved_game.h" + "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" ${SharedCommonFiles} ) diff --git a/shared/qcommon/ojk_i_saved_game.h b/shared/qcommon/ojk_i_saved_game.h new file mode 100644 index 0000000000..368b7bd3d8 --- /dev/null +++ b/shared/qcommon/ojk_i_saved_game.h @@ -0,0 +1,540 @@ +// +// Saved game interface. +// + + +#ifndef OJK_I_SAVED_GAME_INCLUDED +#define OJK_I_SAVED_GAME_INCLUDED + + +#include +#include +#include "ojk_i_saved_game_fwd.h" + + +namespace ojk { + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// Class stuff + +ISavedGame::ISavedGame() +{ +} + +ISavedGame::~ISavedGame() +{ +} + +// Class stuff +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// read_chunk + +template +bool ISavedGame::read_chunk( + const ChunkId chunk_id, + TDst& dst_value) +{ + auto result = read_chunk( + chunk_id); + + read( + dst_value); + + return result; +} + +template +bool ISavedGame::read_chunk( + const ChunkId chunk_id, + TDst* dst_values, + int dst_count) +{ + auto result = read_chunk( + chunk_id); + + read( + dst_values, + dst_count); + + return result; +} + +// read_chunk +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// write_chunk + +template +bool ISavedGame::write_chunk( + const ChunkId chunk_id, + const TSrc& src_value) +{ + reset_buffer(); + + write( + src_value); + + return write_chunk( + chunk_id); +} + +template +bool ISavedGame::write_chunk( + const ChunkId chunk_id, + const TSrc* src_values, + int src_count) +{ + reset_buffer(); + + write( + src_values, + src_count); + + return write_chunk( + chunk_id); +} + +// write_chunk +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// read + +template +void ISavedGame::read( + TDst& dst_value) +{ + using Tag = typename std::conditional< + std::is_same::value, + BooleanTag, + typename std::conditional< + std::is_arithmetic::value || std::is_enum::value, + NumericTag, + typename std::conditional< + std::is_pointer::value, + PointerTag, + typename std::conditional< + std::is_class::value, + ClassTag, + typename std::conditional< + std::rank::value == 1, + Array1dTag, + typename std::conditional< + std::rank::value == 2, + Array2dTag, + void + >::type + >::type + >::type + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported type."); + + read( + dst_value, + Tag()); +} + +template +void ISavedGame::read( + TDst& dst_value, + BooleanTag) +{ + constexpr auto src_size = static_cast(sizeof(TSrc)); + + TSrc src_value; + + raw_read( + &src_value, + static_cast(sizeof(TSrc))); + + // FIXME Byte order + // + + dst_value = (src_value != 0); +} + +template +void ISavedGame::read( + TDst& dst_value, + NumericTag) +{ + constexpr auto src_size = static_cast(sizeof(TSrc)); + + TSrc src_value; + + raw_read( + &src_value, + src_size); + + // FIXME Byte order + // + + dst_value = static_cast(src_value); +} + +template +void ISavedGame::read( + TDst*& dst_value, + PointerTag) +{ + static_assert( + std::is_arithmetic::value && + !std::is_same::value, + "Unsupported types."); + + using DstNumeric = typename std::conditional< + std::is_signed::value, + std::intptr_t, + std::uintptr_t + >::type; + + auto dst_number = DstNumeric(); + + read( + dst_number, + NumericTag()); + + dst_value = reinterpret_cast(dst_number); +} + +template +void ISavedGame::read( + TDst& dst_value, + ClassTag) +{ + throw + "Not implemented."; +} + +template +void ISavedGame::read( + TDst (&dst_values)[TCount], + Array1dTag) +{ + read( + &dst_values[0], + TCount); +} + +template +void ISavedGame::read( + TDst(&dst_values)[TCount1][TCount2], + Array2dTag) +{ + read( + &dst_values[0][0], + TCount1 * TCount2); +} + +// read +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// read (C-array) + +template +void ISavedGame::read( + TDst* dst_values, + int dst_count) +{ + static_assert( + (std::is_arithmetic::value && + !std::is_same::value && + !std::is_enum::value) || + std::is_class::value, + "Unsupported types."); + + using Src = typename std::conditional< + std::is_same::value, + TDst, + TSrc>::type; + + constexpr auto is_src_pure_numeric = + std::is_arithmetic::value && + (!std::is_same::value) && + (!std::is_enum::value); + + constexpr auto is_dst_pure_numeric = + std::is_arithmetic::value && + (!std::is_same::value) && + (!std::is_enum::value); + + constexpr auto has_same_size = + (sizeof(Src) == sizeof(TDst)); + + constexpr auto use_inplace = + is_src_pure_numeric && + is_dst_pure_numeric && + has_same_size; + + using Tag = typename std::conditional< + use_inplace, + InplaceTag, + CastTag + >::type; + + read( + dst_values, + dst_count, + Tag()); +} + +template +void ISavedGame::read( + TDst* dst_values, + int dst_count, + InplaceTag) +{ + constexpr auto dst_size = dst_count * static_cast(sizeof(TDst)); + + raw_read( + dst_values, + dst_size); + + // FIXME Byte order + // +} + +template +void ISavedGame::read( + TDst* dst_values, + int dst_count, + CastTag) +{ + using Tag = typename std::conditional< + std::is_arithmetic::value, + NumericTag, + typename std::conditional< + std::is_class::value, + ClassTag, + void + >::type + >::type; + + for (int i = 0; i < dst_count; ++i) { + read( + dst_values[i], + Tag()); + } +} + +// read (C-array) +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// write + +template +void ISavedGame::write( + const TSrc& src_value) +{ + using Tag = typename std::conditional< + std::is_arithmetic::value || std::is_enum::value, + NumericTag, + typename std::conditional< + std::is_pointer::value, + PointerTag, + typename std::conditional< + std::is_class::value, + ClassTag, + typename std::conditional< + std::rank::value == 1, + Array1dTag, + typename std::conditional< + std::rank::value == 2, + Array2dTag, + void + >::type + >::type + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported type."); + + write( + src_value, + Tag()); +} + +template +void ISavedGame::write( + const TSrc& src_value, + NumericTag) +{ + constexpr auto dst_size = static_cast(sizeof(TDst)); + + auto dst_value = static_cast(src_value); + + // FIXME Byte order + // + + raw_write( + &dst_value, + dst_size); +} + +template +void ISavedGame::write( + const TSrc*& src_value, + PointerTag) +{ + using DstNumeric = typename std::conditional< + std::is_signed::value, + std::intptr_t, + std::uintptr_t + >::type; + + auto dst_number = reinterpret_cast(src_value); + + write( + dst_number, + NumericTag()); +} + +template +void ISavedGame::write( + const TSrc& src_value, + ClassTag) +{ + throw + "Not implemented."; +} + +template +void ISavedGame::write( + const TSrc (&src_values)[TCount], + Array1dTag) +{ + write( + &src_values[0], + TCount); +} + +template +void ISavedGame::write( + const TSrc(&src_values)[TCount1][TCount2], + Array2dTag) +{ + write( + &src_values[0][0], + TCount1 * TCount2); +} + +// write +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// write (C-array) + +template +void ISavedGame::write( + const TSrc* src_values, + int src_count) +{ + static_assert( + (std::is_arithmetic::value && + !std::is_same::value && + !std::is_enum::value) || + std::is_class::value, + "Unsupported types."); + + using Dst = typename std::conditional< + std::is_same::value, + TSrc, + TDst>::type; + + constexpr auto is_src_pure_numeric = + std::is_arithmetic::value && + (!std::is_same::value) && + (!std::is_enum::value); + + constexpr auto is_dst_pure_numeric = + std::is_arithmetic::value && + (!std::is_same::value) && + (!std::is_enum::value); + + constexpr auto has_same_size = + (sizeof(TSrc) == sizeof(Dst)); + + constexpr auto use_inplace = + is_src_pure_numeric && + is_dst_pure_numeric && + has_same_size; + + using Tag = typename std::conditional< + use_inplace, + InplaceTag, + CastTag + >::type; + + write( + src_values, + src_count, + Tag()); +} + +template +void ISavedGame::write( + const TSrc* src_values, + int src_count, + InplaceTag) +{ + constexpr auto src_size = src_count * static_cast(sizeof(TSrc)); + + raw_write( + src_values, + src_size); + + // FIXME Byte order + // +} + +template +void ISavedGame::write( + const TSrc* src_values, + int src_count, + CastTag) +{ + using Tag = typename std::conditional< + std::is_arithmetic::value, + NumericTag, + typename std::conditional< + std::is_class::value, + ClassTag, + void + >::type + >::type; + + for (int i = 0; i < src_count; ++i) { + write( + src_values[i], + Tag()); + } +} + +// write (C-array) +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +} // ojk + + +#endif // OJK_I_SAVED_GAME_INCLUDED diff --git a/shared/qcommon/ojk_saved_game_fwd.h b/shared/qcommon/ojk_i_saved_game_fwd.h similarity index 56% rename from shared/qcommon/ojk_saved_game_fwd.h rename to shared/qcommon/ojk_i_saved_game_fwd.h index 937b8c6cc6..35e59d9070 100644 --- a/shared/qcommon/ojk_saved_game_fwd.h +++ b/shared/qcommon/ojk_i_saved_game_fwd.h @@ -1,11 +1,11 @@ // -// Saved game. +// Saved game interface. // (forward declaration) // -#ifndef OJK_SAVED_GAME_FWD_INCLUDED -#define OJK_SAVED_GAME_FWD_INCLUDED +#ifndef OJK_I_SAVED_GAME_FWD_INCLUDED +#define OJK_I_SAVED_GAME_FWD_INCLUDED #include @@ -16,39 +16,34 @@ namespace ojk { -class SavedGame +class ISavedGame { public: using ChunkId = uint32_t; using Buffer = std::vector; - SavedGame(); + ISavedGame(); - SavedGame( - const SavedGame& that) = delete; + ISavedGame( + const ISavedGame& that) = delete; - SavedGame& operator=( - const SavedGame& that) = delete; + ISavedGame& operator=( + const ISavedGame& that) = delete; - ~SavedGame(); + virtual ~ISavedGame(); - // Creates a new saved game file for writing. - bool create( - const std::string& base_file_name); + // Returns true if the saved game opened for reading. + virtual bool is_readable() const = 0; - // Opens an existing saved game file for reading. - bool open( - const std::string& base_file_name); - - // Closes the current saved game file. - void close(); + // Returns true if the saved game opened for writing. + virtual bool is_writable() const = 0; // Reads a chunk from the file into the internal buffer. - bool read_chunk( - const ChunkId chunk_id); + virtual bool read_chunk( + const ChunkId chunk_id) = 0; // Reads a value or an array of values from the file via // the internal buffer. @@ -67,8 +62,8 @@ class SavedGame // Writes a chunk into the file from the internal buffer. - bool write_chunk( - const ChunkId chunk_id); + virtual bool write_chunk( + const ChunkId chunk_id) = 0; // Writes a value or an array of values into the file via // the internal buffer. @@ -86,6 +81,11 @@ class SavedGame int src_count); + // Reads a raw data from the internal buffer. + virtual void raw_read( + void* dst_data, + int dst_size) = 0; + // Reads a value or array of values from the internal buffer. template void read( @@ -98,6 +98,11 @@ class SavedGame int dst_count); + // Writes a raw data into the internal buffer. + virtual void raw_write( + const void* src_data, + int src_size) = 0; + // Writes a value or array of values into the internal buffer. template void write( @@ -111,41 +116,14 @@ class SavedGame // Returns an I/O buffer. - Buffer& get_buffer(); - - // Returns an I/O buffer. - const Buffer& get_buffer() const; - - // Returns an I/O buffer offset; - int get_buffer_offset() const; - - uint8_t* get_current_data(); - - const uint8_t* get_current_data() const; + virtual const Buffer& get_buffer() const = 0; - // Casts referenced data at current position into a specified type. - template - T cast_buffer(); - - // Renames a saved game file. - static void rename( - const std::string& old_base_file_name, - const std::string& new_base_file_name); - - // Remove a saved game file. - static void remove( - const std::string& base_file_name); - - // Returns a default instance of the class. - static SavedGame& get_instance(); - - -private: - using BufferOffset = Buffer::size_type; - using Paths = std::vector; + // Clears buffer and resets it's offset to the beginning. + virtual void reset_buffer() = 0; +protected: // Tags for dispatching. class BooleanTag { public: }; class NumericTag { public: }; @@ -157,76 +135,6 @@ class SavedGame class CastTag { public: }; - // A handle to a file. - int32_t file_handle_; - - // I/O buffer. - Buffer io_buffer_; - - // A current offset inside the I/O buffer. - BufferOffset io_buffer_offset_; - - // RLE codec buffer. - Buffer rle_buffer_; - - // Does not throws an exception on chunk reading if true. - bool is_preview_mode_; - - bool is_write_failed_; - - - // Throws an exception. - static void throw_error( - const char* message); - - // Throws an exception. - static void throw_error( - const std::string& message); - - - // Compresses data. - static void compress( - const Buffer& src_buffer, - Buffer& dst_buffer); - - // Decompresses data. - static void decompress( - const Buffer& src_buffer, - Buffer& dst_buffer); - - - static std::string generate_path( - const std::string& base_file_name); - - static std::string get_failed_to_open_message( - const std::string& file_name, - bool is_open); - - - // Returns a string representation of a chunk id. - static std::string get_chunk_id_string( - uint32_t chunk_id); - - - // Checks if there is enough data for reading in the I/O buffer. - void check_io_buffer( - int item_size, - int count = 1); - - // Resizes the I/O buffer according to desire size of data to write. - void accomodate_io_buffer( - int item_size, - int count = 1); - - // Advances the current I/O buffer offset. - void advance_io_buffer( - int item_size, - int count = 1); - - // Resets I/O buffer offset to zero. - void reset_io_buffer_offset(); - - template void read( TDst& dst_value, @@ -249,7 +157,7 @@ class SavedGame template void read( - TDst (&dst_values)[TCount], + TDst(&dst_values)[TCount], Array1dTag); template @@ -288,7 +196,7 @@ class SavedGame template void write( - const TSrc (&src_values)[TCount], + const TSrc(&src_values)[TCount], Array1dTag); template @@ -308,10 +216,10 @@ class SavedGame const TSrc* src_values, int src_count, CastTag); -}; // SavedGame +}; // ISavedGame } // ojk -#endif // OJK_SAVED_GAME_FWD_INCLUDED +#endif // OJK_I_SAVED_GAME_FWD_INCLUDED diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index db70802430..fa254a2b66 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -12,6 +12,8 @@ SavedGame::SavedGame() : io_buffer_(), io_buffer_offset_(), rle_buffer_(), + is_readable_(), + is_writable_(), is_preview_mode_(), is_write_failed_() { @@ -56,7 +58,7 @@ bool SavedGame::open( int sg_version = -1; if (is_succeed) { - static_cast(read_chunk( + static_cast(ISavedGame::read_chunk( INT_ID('_', 'V', 'E', 'R'), sg_version)); @@ -71,7 +73,9 @@ bool SavedGame::open( } } - if (!is_succeed) { + if (is_succeed) { + is_readable_ = true; + } else { close(); } @@ -107,10 +111,12 @@ bool SavedGame::create( int sg_version = iSAVEGAME_VERSION; - static_cast(write_chunk( + static_cast(ISavedGame::write_chunk( INT_ID('_', 'V', 'E', 'R'), sg_version)); + is_writable_ = false; + return true; } @@ -124,9 +130,22 @@ void SavedGame::close() io_buffer_.clear(); io_buffer_offset_ = 0; + is_readable_ = false; + is_writable_ = false; + is_preview_mode_ = false; is_write_failed_ = false; } +bool SavedGame::is_readable() const +{ + return is_readable_; +} + +bool SavedGame::is_writable() const +{ + return is_writable_; +} + bool SavedGame::read_chunk( const SavedGame::ChunkId chunk_id) { @@ -364,29 +383,81 @@ bool SavedGame::write_chunk( return true; } -SavedGame::Buffer& SavedGame::get_buffer() +void SavedGame::raw_read( + void* dst_data, + int dst_size) { - return io_buffer_; -} + if (!dst_data) { + throw_error( + "Null pointer."); + } -const SavedGame::Buffer& SavedGame::get_buffer() const -{ - return io_buffer_; -} + if (dst_size < 0) { + throw_error( + "Negative size."); + } -int SavedGame::get_buffer_offset() const -{ - return static_cast(io_buffer_offset_); + if (!is_readable_) { + throw_error( + "Not readable."); + } + + if (dst_size == 0) { + return; + } + + if ((io_buffer_offset_ + dst_size) > io_buffer_.size()) { + throw_error( + "Not enough data."); + } + + std::uninitialized_copy_n( + &io_buffer_[io_buffer_offset_], + dst_size, + static_cast(dst_data)); + + io_buffer_offset_ += dst_size; } -uint8_t* SavedGame::get_current_data() +void SavedGame::raw_write( + const void* src_data, + int src_size) { - return &io_buffer_[io_buffer_offset_]; + if (!src_data) { + throw_error( + "Null pointer."); + } + + if (src_size < 0) { + throw_error( + "Negative size."); + } + + if (!is_writable_) { + throw_error( + "Not writable."); + } + + if (src_size == 0) { + return; + } + + auto new_buffer_size = io_buffer_offset_ + src_size; + + io_buffer_.resize( + new_buffer_size); + + std::uninitialized_copy_n( + static_cast(src_data), + src_size, + &io_buffer_[io_buffer_offset_]); + + io_buffer_offset_ = new_buffer_size; } -const uint8_t* SavedGame::get_current_data() const +const SavedGame::Buffer& SavedGame::get_buffer() const { - return &io_buffer_[io_buffer_offset_]; + return io_buffer_; } void SavedGame::rename( @@ -593,70 +664,9 @@ std::string SavedGame::get_chunk_id_string( return result; } -void SavedGame::check_io_buffer( - int item_size, - int count) -{ - if (item_size <= 0) { - throw SavedGameException( - "Zero or negative item size."); - } - - if (count <= 0) { - throw SavedGameException( - "Zero or negative count."); - } - - const auto data_size = item_size * count; - - if ((io_buffer_offset_ + data_size) > io_buffer_.size()) { - throw SavedGameException( - "Not enough data."); - } -} - -void SavedGame::accomodate_io_buffer( - int item_size, - int count) -{ - if (item_size <= 0) { - throw SavedGameException( - "Zero or negative item size."); - } - - if (count <= 0) { - throw SavedGameException( - "Zero or negative count."); - } - - const auto data_size = item_size * count; - - const auto new_buffer_size = io_buffer_offset_ + data_size; - - io_buffer_.resize( - new_buffer_size); -} - -void SavedGame::advance_io_buffer( - int item_size, - int count) -{ - if (item_size <= 0) { - throw SavedGameException( - "Zero or negative item size."); - } - - if (count <= 0) { - throw SavedGameException( - "Zero or negative count."); - } - - const auto data_size = item_size * count; - io_buffer_offset_ += data_size; -} - -void SavedGame::reset_io_buffer_offset() +void SavedGame::reset_buffer() { + io_buffer_.clear(); io_buffer_offset_ = 0; } diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game.h index d7c617a451..e108a290cc 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game.h @@ -1,587 +1,165 @@ // // Saved game. +// (forward declaration) // -#ifndef OJK_SAVED_GAME_INCLUDED -#define OJK_SAVED_GAME_INCLUDED +#ifndef OJK_SAVED_GAME_FWD_INCLUDED +#define OJK_SAVED_GAME_FWD_INCLUDED #include -#include -#include -#include "ojk_saved_game_fwd.h" +#include +#include +#include "ojk_i_saved_game_fwd.h" namespace ojk { -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// I/O buffer manipulation. - -template -T SavedGame::cast_buffer() +class SavedGame : + public ISavedGame { - return reinterpret_cast(*get_current_data()); -} +public: + using ChunkId = uint32_t; + using Buffer = std::vector; -// I/O buffer manipulation. -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + SavedGame(); -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// read_chunk + SavedGame( + const SavedGame& that) = delete; -template -bool SavedGame::read_chunk( - const ChunkId chunk_id, - TDst& dst_value) -{ - auto result = read_chunk( - chunk_id); + SavedGame& operator=( + const SavedGame& that) = delete; - read( - dst_value); + virtual ~SavedGame(); - return result; -} -template -bool SavedGame::read_chunk( - const ChunkId chunk_id, - TDst* dst_values, - int dst_count) -{ - auto result = read_chunk( - chunk_id); + // Creates a new saved game file for writing. + bool create( + const std::string& base_file_name); - read( - dst_values, - dst_count); + // Opens an existing saved game file for reading. + bool open( + const std::string& base_file_name); - return result; -} + // Closes the current saved game file. + void close(); -// read_chunk -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + // Returns true if the saved game opened for reading. + bool is_readable() const override; -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// write_chunk + // Returns true if the saved game opened for writing. + bool is_writable() const override; -template -bool SavedGame::write_chunk( - const ChunkId chunk_id, - const TSrc& src_value) -{ - reset_io_buffer_offset(); - write( - src_value); + // Reads a chunk from the file into the internal buffer. + bool read_chunk( + const ChunkId chunk_id) override; - return write_chunk( - chunk_id); -} + // Writes a chunk into the file from the internal buffer. + bool write_chunk( + const ChunkId chunk_id) override; -template -bool SavedGame::write_chunk( - const ChunkId chunk_id, - const TSrc* src_values, - int src_count) -{ - reset_io_buffer_offset(); - write( - src_values, - src_count); + // Reads a raw data from the internal buffer. + void raw_read( + void* dst_data, + int dst_size) override; - return write_chunk( - chunk_id); -} + // Writes a raw data into the internal buffer. + void raw_write( + const void* src_data, + int src_size) override; -// write_chunk -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + // Returns an I/O buffer. + const Buffer& get_buffer() const override; -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// read + // Clears buffer and resets it's offset to the beginning. + void reset_buffer() override; -template -void SavedGame::read( - TDst& dst_value) -{ - using Tag = typename std::conditional< - std::is_same::value, - BooleanTag, - typename std::conditional< - std::is_arithmetic::value || std::is_enum::value, - NumericTag, - typename std::conditional< - std::is_pointer::value, - PointerTag, - typename std::conditional< - std::is_class::value, - ClassTag, - typename std::conditional< - std::rank::value == 1, - Array1dTag, - typename std::conditional< - std::rank::value == 2, - Array2dTag, - void - >::type - >::type - >::type - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported type."); - - read( - dst_value, - Tag()); -} - -template -void SavedGame::read( - TDst& dst_value, - BooleanTag) -{ - constexpr auto src_size = static_cast(sizeof(TSrc)); - check_io_buffer( - src_size); + // Renames a saved game file. + static void rename( + const std::string& old_base_file_name, + const std::string& new_base_file_name); - dst_value = (cast_buffer() != 0); + // Remove a saved game file. + static void remove( + const std::string& base_file_name); - // FIXME Byte order - // + // Returns a default instance of the class. + static SavedGame& get_instance(); - advance_io_buffer( - src_size); -} -template -void SavedGame::read( - TDst& dst_value, - NumericTag) -{ - constexpr auto src_size = static_cast(sizeof(TSrc)); +private: + using BufferOffset = Buffer::size_type; + using Paths = std::vector; - check_io_buffer( - src_size); - dst_value = static_cast(cast_buffer()); + // A handle to a file. + int32_t file_handle_; - // FIXME Byte order - // + // I/O buffer. + Buffer io_buffer_; - advance_io_buffer( - src_size); -} + // A current offset inside the I/O buffer. + BufferOffset io_buffer_offset_; -template -void SavedGame::read( - TDst*& dst_value, - PointerTag) -{ - static_assert( - std::is_arithmetic::value && - !std::is_same::value, - "Unsupported types."); - - using DstNumeric = typename std::conditional< - std::is_signed::value, - std::intptr_t, - std::uintptr_t - >::type; - - auto dst_number = DstNumeric(); - - read( - dst_number, - NumericTag()); - - dst_value = reinterpret_cast(dst_number); -} - -template -void SavedGame::read( - TDst& dst_value, - ClassTag) -{ - throw_error( - "Not implemented."); -} - -template -void SavedGame::read( - TDst (&dst_values)[TCount], - Array1dTag) -{ - read( - &dst_values[0], - TCount); -} - -template -void SavedGame::read( - TDst(&dst_values)[TCount1][TCount2], - Array2dTag) -{ - read( - &dst_values[0][0], - TCount1 * TCount2); -} + // RLE codec buffer. + Buffer rle_buffer_; -// read -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + // True if saved game opened for reading. + bool is_readable_; + // True if saved game opened for writing. + bool is_writable_; -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// read (C-array) + // Does not throws an exception on chunk reading if true. + bool is_preview_mode_; -template -void SavedGame::read( - TDst* dst_values, - int dst_count) -{ - static_assert( - (std::is_arithmetic::value && - !std::is_same::value && - !std::is_enum::value) || - std::is_class::value, - "Unsupported types."); - - if (!dst_values) { - throw_error( - "Null pointer."); - } - - if (dst_count < 0) { - throw_error( - "Negative count."); - } - - if (dst_count == 0) { - return; - } - - using Src = typename std::conditional< - std::is_same::value, - TDst, - TSrc>::type; - - constexpr auto is_src_pure_numeric = - std::is_arithmetic::value && - (!std::is_same::value) && - (!std::is_enum::value); - - constexpr auto is_dst_pure_numeric = - std::is_arithmetic::value && - (!std::is_same::value) && - (!std::is_enum::value); - - constexpr auto has_same_size = - (sizeof(Src) == sizeof(TDst)); - - constexpr auto use_inplace = - is_src_pure_numeric && - is_dst_pure_numeric && - has_same_size; - - using Tag = typename std::conditional< - use_inplace, - InplaceTag, - CastTag - >::type; - - read( - dst_values, - dst_count, - Tag()); -} - -template -void SavedGame::read( - TDst* dst_values, - int dst_count, - InplaceTag) -{ - constexpr auto dst_size = static_cast(sizeof(TDst)); - - check_io_buffer( - dst_size, - dst_count); - - std::uninitialized_copy_n( - &cast_buffer(), - dst_count, - dst_values); - - // FIXME Byte order - // - - advance_io_buffer( - dst_size, - dst_count); -} - -template -void SavedGame::read( - TDst* dst_values, - int dst_count, - CastTag) -{ - using Tag = typename std::conditional< - std::is_arithmetic::value, - NumericTag, - typename std::conditional< - std::is_class::value, - ClassTag, - void - >::type - >::type; - - for (int i = 0; i < dst_count; ++i) { - read( - dst_values[i], - Tag()); - } -} - -// read (C-array) -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// write - -template -void SavedGame::write( - const TSrc& src_value) -{ - using Tag = typename std::conditional< - std::is_arithmetic::value || std::is_enum::value, - NumericTag, - typename std::conditional< - std::is_pointer::value, - PointerTag, - typename std::conditional< - std::is_class::value, - ClassTag, - typename std::conditional< - std::rank::value == 1, - Array1dTag, - typename std::conditional< - std::rank::value == 2, - Array2dTag, - void - >::type - >::type - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported type."); - - write( - src_value, - Tag()); -} - -template -void SavedGame::write( - const TSrc& src_value, - NumericTag) -{ - constexpr auto src_size = static_cast(sizeof(TSrc)); + // True if any previous write operation failed. + bool is_write_failed_; - accomodate_io_buffer( - src_size); - cast_buffer() = static_cast(src_value); + // Throws an exception. + static void throw_error( + const char* message); - // FIXME Byte order - // + // Throws an exception. + static void throw_error( + const std::string& message); - advance_io_buffer( - src_size); -} -template -void SavedGame::write( - const TSrc*& src_value, - PointerTag) -{ - using DstNumeric = typename std::conditional< - std::is_signed::value, - std::intptr_t, - std::uintptr_t - >::type; - - auto dst_number = reinterpret_cast(src_value); - - write( - dst_number, - NumericTag()); -} - -template -void SavedGame::write( - const TSrc& src_value, - ClassTag) -{ - throw_error( - "Not implemented."); -} - -template -void SavedGame::write( - const TSrc (&src_values)[TCount], - Array1dTag) -{ - write( - &src_values[0], - TCount); -} - -template -void SavedGame::write( - const TSrc(&src_values)[TCount1][TCount2], - Array2dTag) -{ - write( - &src_values[0][0], - TCount1 * TCount2); -} + // Compresses data. + static void compress( + const Buffer& src_buffer, + Buffer& dst_buffer); -// write -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + // Decompresses data. + static void decompress( + const Buffer& src_buffer, + Buffer& dst_buffer); -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// write (C-array) + static std::string generate_path( + const std::string& base_file_name); -template -void SavedGame::write( - const TSrc* src_values, - int src_count) -{ - static_assert( - (std::is_arithmetic::value && - !std::is_same::value && - !std::is_enum::value) || - std::is_class::value, - "Unsupported types."); - - if (!src_values) { - throw_error( - "Null pointer."); - } - - if (src_count < 0) { - throw_error( - "Negative count."); - } - - if (src_count == 0) { - return; - } - - using Dst = typename std::conditional< - std::is_same::value, - TSrc, - TDst>::type; - - constexpr auto is_src_pure_numeric = - std::is_arithmetic::value && - (!std::is_same::value) && - (!std::is_enum::value); - - constexpr auto is_dst_pure_numeric = - std::is_arithmetic::value && - (!std::is_same::value) && - (!std::is_enum::value); - - constexpr auto has_same_size = - (sizeof(TSrc) == sizeof(Dst)); - - constexpr auto use_inplace = - is_src_pure_numeric && - is_dst_pure_numeric && - has_same_size; - - using Tag = typename std::conditional< - use_inplace, - InplaceTag, - CastTag - >::type; - - write( - src_values, - src_count, - Tag()); -} - -template -void SavedGame::write( - const TSrc* src_values, - int src_count, - InplaceTag) -{ - constexpr auto src_size = static_cast(sizeof(TSrc)); - - accomodate_io_buffer( - src_size, - src_count); - - std::uninitialized_copy_n( - src_values, - src_count, - &cast_buffer()); - - // FIXME Byte order - // - - advance_io_buffer( - src_size, - src_count); -} - -template -void SavedGame::write( - const TSrc* src_values, - int src_count, - CastTag) -{ - using Tag = typename std::conditional< - std::is_arithmetic::value, - NumericTag, - typename std::conditional< - std::is_class::value, - ClassTag, - void - >::type - >::type; - - for (int i = 0; i < src_count; ++i) { - write( - src_values[i], - Tag()); - } -} - -// write (C-array) -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + static std::string get_failed_to_open_message( + const std::string& file_name, + bool is_open); + + + // Returns a string representation of a chunk id. + static std::string get_chunk_id_string( + uint32_t chunk_id); +}; // SavedGame } // ojk -#endif // OJK_SAVED_GAME_INCLUDED +#endif // OJK_SAVED_GAME_FWD_INCLUDED From a467c5137c84d32a46249c6ef3edab3bd6c3da96 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 10 Jul 2016 20:57:46 +0300 Subject: [PATCH 245/445] Make ctor & dtor inline Add methods from interface into implementation's namespace --- shared/qcommon/ojk_i_saved_game.h | 6 +++--- shared/qcommon/ojk_saved_game.h | 12 +++++++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/shared/qcommon/ojk_i_saved_game.h b/shared/qcommon/ojk_i_saved_game.h index 368b7bd3d8..f7970f3d14 100644 --- a/shared/qcommon/ojk_i_saved_game.h +++ b/shared/qcommon/ojk_i_saved_game.h @@ -18,11 +18,11 @@ namespace ojk { // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // Class stuff -ISavedGame::ISavedGame() +inline ISavedGame::ISavedGame() { } -ISavedGame::~ISavedGame() +inline ISavedGame::~ISavedGame() { } @@ -298,7 +298,7 @@ void ISavedGame::read( int dst_count, InplaceTag) { - constexpr auto dst_size = dst_count * static_cast(sizeof(TDst)); + const auto dst_size = dst_count * static_cast(sizeof(TDst)); raw_read( dst_values, diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game.h index e108a290cc..c9085e16ec 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game.h @@ -11,7 +11,7 @@ #include #include #include -#include "ojk_i_saved_game_fwd.h" +#include "ojk_i_saved_game.h" namespace ojk { @@ -59,21 +59,31 @@ class SavedGame : bool read_chunk( const ChunkId chunk_id) override; + using ISavedGame::read_chunk; + + // Writes a chunk into the file from the internal buffer. bool write_chunk( const ChunkId chunk_id) override; + using ISavedGame::write_chunk; + // Reads a raw data from the internal buffer. void raw_read( void* dst_data, int dst_size) override; + using ISavedGame::read; + + // Writes a raw data into the internal buffer. void raw_write( const void* src_data, int src_size) override; + using ISavedGame::write; + // Returns an I/O buffer. const Buffer& get_buffer() const override; From cb022b2780e470a3240b87bb5e5a3e772b730320 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Mon, 11 Jul 2016 19:46:52 +0300 Subject: [PATCH 246/445] Replace reading wrappers --- code/cgame/FxScheduler.cpp | 13 +- code/cgame/cg_main.cpp | 12 +- code/game/G_Timer.cpp | 21 +++- code/game/Q3_Interface.cpp | 52 ++++++-- code/game/Q3_Interface.h | 2 + code/game/g_main.cpp | 11 +- code/game/g_objectives.cpp | 6 +- code/game/g_public.h | 3 +- code/game/g_roff.cpp | 17 ++- code/game/g_savegame.cpp | 43 +++++-- code/icarus/IcarusImplementation.cpp | 29 ++++- code/icarus/IcarusInterface.h | 1 + code/qcommon/cm_load.cpp | 12 +- code/qcommon/q_shared.h | 2 +- code/rd-vanilla/G2_misc.cpp | 2 +- code/server/sv_game.cpp | 3 + code/server/sv_savegame.cpp | 179 ++++++++++++++++++++------- codeJK2/cgame/cg_main.cpp | 12 +- codeJK2/game/G_Timer.cpp | 20 ++- codeJK2/game/Q3_Interface.cpp | 2 + codeJK2/game/Q3_Registers.cpp | 47 +++++-- codeJK2/game/g_main.cpp | 11 +- codeJK2/game/g_objectives.cpp | 6 +- codeJK2/game/g_public.h | 2 + codeJK2/game/g_roff.cpp | 17 ++- codeJK2/game/g_savegame.cpp | 42 +++++-- codeJK2/icarus/Instance.cpp | 37 ++++-- codeJK2/icarus/Sequence.cpp | 61 ++++++--- codeJK2/icarus/Sequencer.cpp | 38 ++++-- codeJK2/icarus/TaskManager.cpp | 95 ++++++++++---- codeJK2/icarus/interface.h | 1 + shared/qcommon/ojk_saved_game.cpp | 23 ++-- 32 files changed, 629 insertions(+), 193 deletions(-) diff --git a/code/cgame/FxScheduler.cpp b/code/cgame/FxScheduler.cpp index cf507097ae..34379ef482 100644 --- a/code/cgame/FxScheduler.cpp +++ b/code/cgame/FxScheduler.cpp @@ -42,6 +42,7 @@ along with this program; if not, see . #include "qcommon/safe/string.h" #include #include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_i_saved_game.h" CFxScheduler theFxScheduler; @@ -109,14 +110,22 @@ void CFxScheduler::LoadSave_Read() { Clean(); // need to get rid of old pre-cache handles, or it thinks it has some older effects when it doesn't g_vstrEffectsNeededPerSlot.clear(); // jic - ::sg_read_no_cast(::gi, INT_ID('F','X','L','E'), ::gLoopedEffectArray); + + ::gi.saved_game->read_chunk( + INT_ID('F','X','L','E'), + ::gLoopedEffectArray); + // // now read in and re-register the effects we need for those structs... // for (int iFX = 0; iFX < MAX_LOOPED_FX; iFX++) { char sFX_Filename[MAX_QPATH]; - ::sg_read_no_cast(::gi, INT_ID('F','X','F','N'), sFX_Filename); + + ::gi.saved_game->read_chunk( + INT_ID('F','X','F','N'), + sFX_Filename); + g_vstrEffectsNeededPerSlot.push_back( sFX_Filename ); } } diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 2ffa679b73..96fa0f03f0 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -29,7 +29,7 @@ along with this program; if not, see . #include "../qcommon/sstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char > namePrecache_m; @@ -1914,8 +1914,14 @@ void CG_WriteTheEvilCGHackStuff(void) } void CG_ReadTheEvilCGHackStuff(void) { - ::sg_read(::gi, INT_ID('F','P','S','L'), ::gi_cg_forcepowerSelect); - ::sg_read(::gi, INT_ID('I','V','S','L'), ::gi_cg_inventorySelect); + ::gi.saved_game->read_chunk( + INT_ID('F','P','S','L'), + ::gi_cg_forcepowerSelect); + + ::gi.saved_game->read_chunk( + INT_ID('I','V','S','L'), + ::gi_cg_inventorySelect); + gbUseTheseValuesFromLoadSave = qtrue; } diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index eb8cf38570..19d53b9cc8 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -23,7 +23,7 @@ along with this program; if not, see . #include "g_local.h" #include "../Rufl/hstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" #define MAX_GTIMERS 16384 @@ -211,7 +211,9 @@ void TIMER_Load( void ) { unsigned char numTimers; - ::sg_read(::gi, INT_ID('T','I','M','E'), numTimers); + ::gi.saved_game->read_chunk( + INT_ID('T','I','M','E'), + numTimers); //Read back all entries for ( int i = 0; i < numTimers; i++ ) @@ -222,8 +224,19 @@ void TIMER_Load( void ) assert (sizeof(g_timers[0]->time) == sizeof(time) );//make sure we're reading the same size as we wrote //Read the id string and time - ::sg_read_no_cast(::gi, INT_ID('T','M','I','D'), tempBuffer, 0); - ::sg_read(::gi, INT_ID('T','D','T','A'), time); + ::gi.saved_game->read_chunk( + INT_ID('T','M','I','D')); + + auto& sg_buffer = ::gi.saved_game->get_buffer(); + + std::uninitialized_copy( + sg_buffer.cbegin(), + sg_buffer.cend(), + tempBuffer); + + ::gi.saved_game->read_chunk( + INT_ID('T','D','T','A'), + time); //this is odd, we saved all the timers in the autosave, but not all the ents are spawned yet from an auto load, so skip it if (ent->inuse) diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 13e9c5dbe8..a01373611c 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -41,7 +41,7 @@ along with this program; if not, see . #include "g_vehicles.h" #include "g_navigator.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" extern cvar_t *com_buildScript; @@ -7280,19 +7280,30 @@ void CQuake3GameInterface::VariableLoadFloats( varFloat_m &fmap ) int numFloats; char tempBuffer[1024]; - ::sg_read(::gi, INT_ID('F','V','A','R'), numFloats); + ::gi.saved_game->read_chunk( + INT_ID('F','V','A','R'), + numFloats); for ( int i = 0; i < numFloats; i++ ) { int idSize; - ::sg_read(::gi, INT_ID('F','I','D','L'), idSize); - ::sg_read_no_cast(::gi, INT_ID('F','I','D','S'), tempBuffer, idSize); + ::gi.saved_game->read_chunk( + INT_ID('F','I','D','L'), + idSize); + + ::gi.saved_game->read_chunk( + INT_ID('F','I','D','S'), + tempBuffer, + idSize); + tempBuffer[ idSize ] = 0; float val; - ::sg_read(::gi, INT_ID('F','V','A','L'), val); + ::gi.saved_game->read_chunk( + INT_ID('F','V','A','L'), + val); DeclareVariable( TK_FLOAT, (const char *) &tempBuffer ); SetFloatVariable( (const char *) &tempBuffer, val ); @@ -7311,18 +7322,34 @@ void CQuake3GameInterface::VariableLoadStrings( int type, varString_m &fmap ) char tempBuffer[1024]; char tempBuffer2[1024]; - ::sg_read(::gi, INT_ID('S','V','A','R'), numFloats); + ::gi.saved_game->read_chunk( + INT_ID('S','V','A','R'), + numFloats); for ( int i = 0; i < numFloats; i++ ) { int idSize; - ::sg_read(::gi, INT_ID('S','I','D','L'), idSize); - ::sg_read_no_cast(::gi, INT_ID('S','I','D','S'), tempBuffer, idSize); + ::gi.saved_game->read_chunk( + INT_ID('S','I','D','L'), + idSize); + + ::gi.saved_game->read_chunk( + INT_ID('S','I','D','S'), + tempBuffer, + idSize); + tempBuffer[ idSize ] = 0; - ::sg_read(::gi, INT_ID('S','V','S','Z'), idSize); - ::sg_read_no_cast(::gi, INT_ID('S','V','A','L'), tempBuffer2, idSize); + ::gi.saved_game->read_chunk( + INT_ID('S','V','S','Z'), + idSize); + + ::gi.saved_game->read_chunk( + INT_ID('S','V','A','L'), + tempBuffer2, + idSize); + tempBuffer2[ idSize ] = 0; switch ( type ) @@ -11112,6 +11139,11 @@ int CQuake3GameInterface::ReadSaveData( unsigned int chid, void *address, int l return gi.ReadFromSaveGame( chid, address, length, addressptr ); } +ojk::ISavedGame* CQuake3GameInterface::get_saved_game() +{ + return ::gi.saved_game; +} + int CQuake3GameInterface::LinkGame( int entID, int icarusID ) { gentity_t *pEntity = &g_entities[entID]; diff --git a/code/game/Q3_Interface.h b/code/game/Q3_Interface.h index 56bcb059e4..3bc97b113d 100644 --- a/code/game/Q3_Interface.h +++ b/code/game/Q3_Interface.h @@ -701,6 +701,8 @@ class CQuake3GameInterface : public IGameInterface int ReadSaveData( unsigned int chid, void *address, int length, void **addressptr = NULL ); int LinkGame( int entID, int icarusID ); + ojk::ISavedGame* get_saved_game() override; + // Access functions int CreateIcarus( int entID); //Polls the engine for the sequencer of the entity matching the name passed diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 302d856cf2..288be0c925 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -37,7 +37,7 @@ along with this program; if not, see . //rww - RAGDOLL_END #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" extern void WP_SaberLoadParms( void ); extern qboolean G_PlayerSpawned( void ); @@ -113,7 +113,10 @@ void WriteInUseBits(void) void ReadInUseBits(void) { - ::sg_read(::gi, INT_ID('I','N','U','S'), ::g_entityInUseBits); + ::gi.saved_game->read_chunk( + INT_ID('I','N','U','S'), + ::g_entityInUseBits); + // This is only temporary. Once I have converted all the ent->inuse refs, // it won;t be needed -MW. for(int i=0;i(::gi, INT_ID('L','C','K','D'), player_locked); + ::gi.saved_game->read_chunk( + INT_ID('L','C','K','D'), + ::player_locked); } diff --git a/code/game/g_objectives.cpp b/code/game/g_objectives.cpp index e7a87d79f4..92afb4394a 100644 --- a/code/game/g_objectives.cpp +++ b/code/game/g_objectives.cpp @@ -30,7 +30,7 @@ along with this program; if not, see . #include "objectives.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" qboolean missionInfo_Updated; @@ -86,7 +86,9 @@ OBJ_LoadMissionObjectives */ void OBJ_LoadMissionObjectives( gclient_t *client ) { - ::sg_read_no_cast(::gi, INT_ID('O','B','J','T'), client->sess.mission_objectives); + ::gi.saved_game->read_chunk( + INT_ID('O','B','J','T'), + client->sess.mission_objectives); } diff --git a/code/game/g_public.h b/code/game/g_public.h index 8c178f086c..599c6151fa 100644 --- a/code/game/g_public.h +++ b/code/game/g_public.h @@ -27,6 +27,7 @@ along with this program; if not, see . #include "qcommon/ojk_sg_wrappers_fwd.h" +#include "qcommon/ojk_i_saved_game_fwd.h" #define GAME_API_VERSION 8 @@ -190,7 +191,7 @@ typedef struct { int (*ReadFromSaveGame)(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPtr ); int (*ReadFromSaveGameOptional)(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPtr ); - ojk::SavedGame* saved_game; + ojk::ISavedGame* saved_game; // add commands to the console as if they were typed in // for map changing, etc diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp index 8fdecd1fa1..5f3176eabc 100644 --- a/code/game/g_roff.cpp +++ b/code/game/g_roff.cpp @@ -26,7 +26,7 @@ along with this program; if not, see . #include "../cgame/cg_local.h" #include "g_functions.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" // The list of precached ROFFs roff_list_t roffs[MAX_ROFFS]; @@ -678,13 +678,22 @@ void G_LoadCachedRoffs() char buffer[MAX_QPATH]; // Get the count of goodies we need to revive - ::sg_read(::gi, INT_ID('R','O','F','F'), count); + ::gi.saved_game->read_chunk( + INT_ID('R','O','F','F'), + count); // Now bring 'em back to life for ( i = 0; i < count; i++ ) { - ::sg_read(::gi, INT_ID('S','L','E','N'), len); - ::sg_read_no_cast(::gi, INT_ID('R','S','T','R'), buffer, len); + ::gi.saved_game->read_chunk( + INT_ID('S','L','E','N'), + len); + + ::gi.saved_game->read_chunk( + INT_ID('R','S','T','R'), + buffer, + len); + G_LoadRoff( buffer ); } } diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index dcc46aa4a5..54e2d0285e 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -31,7 +31,7 @@ along with this program; if not, see . #include "../cgame/cg_camera.h" #include "../qcommon/sstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" extern void OBJ_LoadTacticalInfo(void); @@ -189,7 +189,10 @@ static char *GetStringPtr(int iStrlen, char *psOriginal/*may be NULL*/) assert(iStrlen+1<=(int)sizeof(sString)); - ::sg_read_no_cast(::gi, INT_ID('S','T','R','G'), sString, iStrlen); + ::gi.saved_game->read_chunk( + INT_ID('S','T','R','G'), + sString, + iStrlen); // TAG_G_ALLOC is always blown away, we can never recycle if (psOriginal && gi.bIsFromZone(psOriginal, TAG_G_ALLOC)) { @@ -927,13 +930,18 @@ static void ReadGEntities(qboolean qbAutosave) int iCount; int i; - ::sg_read(::gi, INT_ID('N','M','E','D'), iCount); + ::gi.saved_game->read_chunk( + INT_ID('N','M','E','D'), + iCount); int iPreviousEntRead = -1; for (i=0; i(::gi, INT_ID('E','D','N','M'), iEntIndex); + + ::gi.saved_game->read_chunk( + INT_ID('E','D','N','M'), + iEntIndex); if (iEntIndex >= globals.num_entities) { @@ -1046,7 +1054,9 @@ static void ReadGEntities(qboolean qbAutosave) { parms_t tempParms; - ::sg_read_no_cast(::gi, INT_ID('P','A','R','M'), tempParms); + ::gi.saved_game->read_chunk( + INT_ID('P','A','R','M'), + tempParms); // so can we pinch the original's one or do we have to alloc a new one?... // @@ -1097,10 +1107,13 @@ static void ReadGEntities(qboolean qbAutosave) // the scary ghoul2 stuff... (fingers crossed) // { - char *pGhoul2Data = NULL; - ::sg_read_allocate(::gi, INT_ID('G','H','L','2'), pGhoul2Data); + ::gi.saved_game->read_chunk( + INT_ID('G','H','L','2')); + + auto buffer = ::gi.saved_game->get_buffer(); + auto pGhoul2Data = reinterpret_cast(buffer.data()); + gi.G2API_LoadGhoul2Models(pEnt->ghoul2, pGhoul2Data); // if it's going to crash anywhere... - gi.Free(pGhoul2Data); } // gi.unlinkentity (pEntOriginal); @@ -1163,7 +1176,10 @@ static void ReadGEntities(qboolean qbAutosave) // check that Icarus has loaded everything it saved out by having a marker chunk after it... // static int iBlah = 1234; - ::sg_read(::gi, INT_ID('I','C','O','K'), iBlah); + + ::gi.saved_game->read_chunk( + INT_ID('I','C','O','K'), + iBlah); } if (!qbAutosave) { @@ -1231,8 +1247,8 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) ReadLevelLocals(); // level_locals_t level //Read & throw away objective info - objectives_t junkObj[MAX_MISSION_OBJ]; - ::sg_read_no_cast(::gi, INT_ID('O','B','J','T'), junkObj); + ::gi.saved_game->read_chunk( + INT_ID('O','B','J','T')); } else { @@ -1265,7 +1281,10 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) // check that the whole file content was loaded by specifically requesting an end-marker... // static int iDONE = 1234; - ::sg_read(::gi, INT_ID('D','O','N','E'), iDONE); + + ::gi.saved_game->read_chunk( + INT_ID('D','O','N','E'), + iDONE); } extern int killPlayerTimer; diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index bc2ecff90f..6b0385bd36 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -34,7 +34,7 @@ along with this program; if not, see . #include "../qcommon/q_shared.h" #include "../qcommon/qcommon.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" #define STL_ITERATE( a, b ) for ( a = b.begin(); a != b.end(); ++a ) #define STL_INSERT( a, b ) a.insert( a.end(), b ); @@ -679,13 +679,17 @@ int CIcarus::Load() CreateBuffer(); IGameInterface* game = IGameInterface::GetGame(m_flavor); + auto saved_game = game->get_saved_game(); //Clear out any old information Free(); //Check to make sure we're at the ICARUS save block double version; - ::sg_read(game, INT_ID('I','C','A','R'), version); + + saved_game->read_chunk( + INT_ID('I','C','A','R'), + version); //Versions must match! if ( version != ICARUS_VERSION ) @@ -696,7 +700,15 @@ int CIcarus::Load() } // Read into the buffer all our data. - /*m_ulBytesAvailable = */::sg_read_no_cast(game, INT_ID('I','S','E','Q'), m_byBuffer, 0 ); //fixme, use real buff size + saved_game->read_chunk( + INT_ID('I','S','E','Q')); + + auto& sg_buffer = saved_game->get_buffer(); + + std::uninitialized_copy( + sg_buffer.cbegin(), + sg_buffer.cend(), + m_byBuffer); //Load all signals if ( LoadSignals() == false ) @@ -806,7 +818,16 @@ void CIcarus::BufferRead( void *pDstBuff, unsigned long ulNumBytesToRead ) {// We've tried to read past the buffer... IGameInterface::GetGame()->DebugPrint( IGameInterface::WL_ERROR, "BufferRead: Buffer underflow, Looking for new block." ); // Read in the next block. - /*m_ulBytesAvailable = */::sg_read_no_cast(IGameInterface::GetGame(), INT_ID('I','S','E','Q'), m_byBuffer, 0 ); //FIXME, to actually check underflows, use real buff size + IGameInterface::GetGame()->get_saved_game()->read_chunk( + INT_ID('I','S','E','Q')); + + auto& sg_buffer = IGameInterface::GetGame()->get_saved_game()->get_buffer(); + + std::uninitialized_copy( + sg_buffer.cbegin(), + sg_buffer.cend(), + m_byBuffer); + m_ulBytesRead = 0; //reset buffer } diff --git a/code/icarus/IcarusInterface.h b/code/icarus/IcarusInterface.h index 9ba27ec35b..71acf2bb79 100644 --- a/code/icarus/IcarusInterface.h +++ b/code/icarus/IcarusInterface.h @@ -147,6 +147,7 @@ class IGameInterface virtual int WriteSaveData( unsigned int chid, const void *data, int length ) = 0; virtual int ReadSaveData( unsigned int chid, void *address, int length, void **addressptr = NULL ) = 0; virtual int LinkGame( int gameID, int icarusID ) = 0; + virtual ojk::ISavedGame* get_saved_game() = 0; // Access functions diff --git a/code/qcommon/cm_load.cpp b/code/qcommon/cm_load.cpp index d809a7e1ab..a7250cae4c 100644 --- a/code/qcommon/cm_load.cpp +++ b/code/qcommon/cm_load.cpp @@ -25,7 +25,7 @@ along with this program; if not, see . #include "cm_local.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_saved_game.h" #ifdef BSPC void SetPlaneSignbits (cplane_t *out) { @@ -1230,7 +1230,15 @@ and recalculates the area connections */ void CM_ReadPortalState () { - ::sg_read(::SG_Read, INT_ID('P','R','T','S'), ::cmg.areaPortals, ::cmg.numAreas * ::cmg.numAreas); + //auto saved_game = static_cast( + // &ojk::SavedGame::get_instance()); + auto saved_game = &ojk::SavedGame::get_instance(); + + saved_game->read_chunk( + INT_ID('P','R','T','S'), + ::cmg.areaPortals, + ::cmg.numAreas * ::cmg.numAreas); + CM_FloodAreaConnections (cmg); } diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 4f0cd7003c..b0be5d8826 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -161,7 +161,7 @@ float FloatSwap( const float *f ); #include "qcommon/q_platform.h" #include "qcommon/ojk_sg_wrappers_fwd.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game_fwd.h" // ================================================================ diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index 5b51819680..4ad50ac20d 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -51,7 +51,7 @@ along with this program; if not, see . #ifdef _G2_GORE #include "../ghoul2/ghoul2_gore.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game_fwd.h" #define GORE_TAG_UPPER (256) #define GORE_TAG_MASK (~255) diff --git a/code/server/sv_game.cpp b/code/server/sv_game.cpp index 0d5d9aa3d4..ec5296d892 100644 --- a/code/server/sv_game.cpp +++ b/code/server/sv_game.cpp @@ -30,6 +30,7 @@ along with this program; if not, see . #include "server.h" #include "../client/vmachine.h" #include "../client/client.h" +#include "qcommon/ojk_saved_game.h" /*#include "..\renderer\tr_local.h" #include "..\renderer\tr_WorldEffects.h"*/ /* @@ -933,6 +934,8 @@ void SV_InitGameProgs (void) { import.ReadFromSaveGame = SG_Read; import.ReadFromSaveGameOptional = SG_ReadOptional; + import.saved_game = &ojk::SavedGame::get_instance(); + import.AdjustAreaPortalState = SV_AdjustAreaPortalState; import.AreasConnected = CM_AreasConnected; diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 03e62561d0..bc8d1730c6 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -38,7 +38,7 @@ along with this program; if not, see . #include #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_saved_game.h" static char saveGameComment[iSG_COMMENT_SIZE]; @@ -260,7 +260,13 @@ qboolean SG_Open( const char *psPathlessBaseName ) return qfalse; } giSaveGameVersion=-1;//jic - ::sg_read(::SG_Read, INT_ID('_','V','E','R'), ::giSaveGameVersion); + + auto saved_game = &ojk::SavedGame::get_instance(); + + saved_game->read_chunk( + INT_ID('_','V','E','R'), + ::giSaveGameVersion); + if (giSaveGameVersion != iSAVEGAME_VERSION) { SG_Close(); @@ -582,7 +588,12 @@ static void WriteGame(qboolean autosave) static qboolean ReadGame (void) { qboolean qbAutoSave; - ::sg_read(::SG_Read, INT_ID('G','A','M','E'), qbAutoSave); + + auto saved_game = &ojk::SavedGame::get_instance(); + + saved_game->read_chunk( + INT_ID('G','A','M','E'), + qbAutoSave); if (qbAutoSave) { @@ -591,25 +602,41 @@ static qboolean ReadGame (void) // read health/armour etc... // memset(s,0,sizeof(s)); - ::sg_read_no_cast(::SG_Read, INT_ID('C','V','S','V'), s); + + saved_game->read_chunk( + INT_ID('C','V','S','V'), + s); + Cvar_Set( sCVARNAME_PLAYERSAVE, s ); // read ammo... // memset(s,0,sizeof(s)); - ::sg_read_no_cast(::SG_Read, INT_ID('A','M','M','O'), s); + + saved_game->read_chunk( + INT_ID('A','M','M','O'), + s); + Cvar_Set( "playerammo", s); // read inventory... // memset(s,0,sizeof(s)); - ::sg_read_no_cast(::SG_Read, INT_ID('I','V','T','Y'), s); + + saved_game->read_chunk( + INT_ID('I','V','T','Y'), + s); + Cvar_Set( "playerinv", s); // read force powers... // memset(s,0,sizeof(s)); - ::sg_read_no_cast(::SG_Read, INT_ID('F','P','L','V'), s); + + saved_game->read_chunk( + INT_ID('F','P','L','V'), + s); + Cvar_Set( "playerfplvl", s ); } @@ -667,22 +694,34 @@ void SG_WriteCvars(void) void SG_ReadCvars(void) { - int iCount; - char *psName; - char *psValue; + int iCount; + const char* psName; + const char* psValue; - ::sg_read(::SG_Read, INT_ID('C','V','C','N'), iCount); + auto saved_game = &ojk::SavedGame::get_instance(); - for (int i = 0; i < iCount; i++) - { - ::sg_read_allocate(::SG_Read, INT_ID('C','V','A','R'), psName); - ::sg_read_allocate(::SG_Read, INT_ID('V','A','L','U'), psValue); + saved_game->read_chunk( + INT_ID('C','V','C','N'), + iCount); - Cvar_Set (psName, psValue); + for (int i = 0; i < iCount; ++i) + { + saved_game->read_chunk( + INT_ID('C','V','A','R')); - Z_Free( psName ); - Z_Free( psValue ); - } + auto name_buffer = saved_game->get_buffer(); + psName = reinterpret_cast(name_buffer.data()); + + + saved_game->read_chunk( + INT_ID('V','A','L','U')); + + auto value_buffer = saved_game->get_buffer(); + psValue = reinterpret_cast(value_buffer.data()); + + + ::Cvar_Set(psName, psValue); + } } void SG_WriteServerConfigStrings( void ) @@ -740,23 +779,33 @@ void SG_ReadServerConfigStrings( void ) // int iCount; - ::sg_read(::SG_Read, INT_ID('C','S','C','N'), iCount); + auto saved_game = &ojk::SavedGame::get_instance(); + + saved_game->read_chunk( + INT_ID('C','S','C','N'), + iCount); Com_DPrintf( "Reading %d configstrings...\n",iCount); for (int i = 0; i(::SG_Read, INT_ID('C','S','I','N'), iIndex); - ::sg_read_allocate(::SG_Read, INT_ID('C','S','D','A'), psName); + saved_game->read_chunk( + INT_ID('C','S','I','N'), + iIndex); + + saved_game->read_chunk( + INT_ID('C','S','D','A')); + + auto& sg_buffer = saved_game->get_buffer(); + psName = reinterpret_cast(sg_buffer.data()); Com_DPrintf( "Cfg str %d = %s\n",iIndex, psName); //sv.configstrings[iIndex] = psName; SV_SetConfigstring(iIndex, psName); - Z_Free(psName); } } @@ -805,25 +854,39 @@ int SG_GetSaveGameComment(const char *psPathlessBaseName, char *sComment, char * qbSGReadIsTestOnly = qtrue; // do NOT leave this in this state - if ( !SG_Open( psPathlessBaseName )) + auto saved_game = &ojk::SavedGame::get_instance(); + + if (!saved_game->open( + psPathlessBaseName)) { qbSGReadIsTestOnly = qfalse; return 0; } - if (::sg_read_no_cast(::SG_Read, INT_ID('C','O','M','M'), sComment, iSG_COMMENT_SIZE )) + if (saved_game->read_chunk( + INT_ID('C','O','M','M'), + sComment, + iSG_COMMENT_SIZE)) { unsigned int fileTime = 0; - if (::sg_read(::SG_Read, INT_ID('C','M','T','M'), fileTime)) //read + + if (saved_game->read_chunk( + INT_ID('C','M','T','M'), + fileTime)) { tFileTime = SG_GetTime (fileTime); #ifdef JK2_MODE - if (::sg_read(::SG_Read, INT_ID('S','H','L','N'), iScreenShotLength)) + if (saved_game->read_chunk( + INT_ID('S','H','L','N'), + iScreenShotLength)) { - if (::sg_read_skip(::SG_Read, INT_ID('S','H','O','T'), iScreenShotLength)) + if (saved_game->read_chunk(INT_ID('S','H','O','T'))) { #endif - if (::sg_read_no_cast(::SG_Read, INT_ID('M','P','C','M'), sMapName, iSG_MAPCMD_SIZE)) // read + if (saved_game->read_chunk( + INT_ID('M','P','C','M'), + sMapName, + iSG_MAPCMD_SIZE)) { ret = tFileTime; } @@ -835,10 +898,8 @@ int SG_GetSaveGameComment(const char *psPathlessBaseName, char *sComment, char * } qbSGReadIsTestOnly = qfalse; - if (!SG_Close()) - { - return 0; - } + saved_game->close(); + return ret; } @@ -867,11 +928,16 @@ static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest = static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest) { qboolean bReturn = qfalse; + auto saved_game = &ojk::SavedGame::get_instance(); // get JPG screenshot data length... // size_t iScreenShotLength = 0; - ::sg_read(::SG_Read, INT_ID('S','H','L','N'), iScreenShotLength); + + saved_game->read_chunk( + INT_ID('S','H','L','N'), + iScreenShotLength); + // // alloc enough space plus extra 4K for sloppy JPG-decode reader to not do memory access violation... // @@ -879,7 +945,11 @@ static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest) // // now read the JPG data... // - ::sg_read_no_cast(::SG_Read, INT_ID('S','H','O','T'), pJPGData, iScreenShotLength); + saved_game->read_chunk( + INT_ID('S','H','O','T'), + pJPGData, + iScreenShotLength); + // // decompress JPG data... // @@ -923,8 +993,13 @@ qboolean SG_GetSaveImage( const char *psPathlessBaseName, void *pvAddress ) return qfalse; } - ::sg_read_skip(::SG_Read, INT_ID('C','O','M','M'), 0); // skip - ::sg_read_skip(::SG_Read, INT_ID('C','M','T','M')); + auto saved_game = &ojk::SavedGame::get_instance(); + + saved_game->read_chunk( + INT_ID('C','O','M','M')); + + saved_game->read_chunk( + INT_ID('C','M','T','M')); qboolean bGotSaveImage = SG_ReadScreenshot(qfalse, pvAddress); @@ -1119,14 +1194,24 @@ qboolean SG_ReadSavegame(const char *psPathlessBaseName) // Read in all the server data... // - ::sg_read_no_cast(::SG_Read, INT_ID('C','O','M','M'), sComment); + auto saved_game = &ojk::SavedGame::get_instance(); + + saved_game->read_chunk( + INT_ID('C','O','M','M'), + sComment); + Com_DPrintf("Reading: %s\n", sComment); - ::sg_read_skip(::SG_Read, INT_ID('C','M','T','M')); + + saved_game->read_chunk( + INT_ID('C','M','T','M')); #ifdef JK2_MODE SG_ReadScreenshot(qtrue); // qboolean qbSetAsLoadingScreen #endif - ::sg_read_no_cast(::SG_Read, INT_ID('M','P','C','M'), sMapCmd); + saved_game->read_chunk( + INT_ID('M','P','C','M'), + sMapCmd); + SG_ReadCvars(); // read game state @@ -1139,8 +1224,16 @@ qboolean SG_ReadSavegame(const char *psPathlessBaseName) // if (!qbAutosave) { - ::sg_read(::SG_Read, INT_ID('T','I','M','E'), ::sv.time); - ::sg_read(::SG_Read, INT_ID('T','I','M','R'), ::sv.timeResidual); + auto saved_game = &ojk::SavedGame::get_instance(); + + saved_game->read_chunk( + INT_ID('T','I','M','E'), + ::sv.time); + + saved_game->read_chunk( + INT_ID('T','I','M','R'), + ::sv.timeResidual); + CM_ReadPortalState(); SG_ReadServerConfigStrings(); } diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index c4c84fc1ac..1f2b76149e 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -29,7 +29,7 @@ along with this program; if not, see . #include "../../code/qcommon/sstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char, std::less, std::allocator< unsigned char > > namePrecache_m; @@ -1647,8 +1647,14 @@ void CG_WriteTheEvilCGHackStuff(void) } void CG_ReadTheEvilCGHackStuff(void) { - ::sg_read(::gi, INT_ID('F','P','S','L'), gi_cg_forcepowerSelect); - ::sg_read(::gi, INT_ID('I','V','S','L'), gi_cg_inventorySelect); + ::gi.saved_game->read_chunk( + INT_ID('F','P','S','L'), + ::gi_cg_forcepowerSelect); + + ::gi.saved_game->read_chunk( + INT_ID('I','V','S','L'), + ::gi_cg_inventorySelect); + gbUseTheseValuesFromLoadSave = qtrue; } diff --git a/codeJK2/game/G_Timer.cpp b/codeJK2/game/G_Timer.cpp index 80fb4be921..b767a6d0de 100644 --- a/codeJK2/game/G_Timer.cpp +++ b/codeJK2/game/G_Timer.cpp @@ -24,7 +24,7 @@ along with this program; if not, see . #include "g_local.h" #include "../../code/Rufl/hstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" #define MAX_GTIMERS 16384 @@ -218,7 +218,9 @@ void TIMER_Load( void ) { int numTimers; - ::sg_read(::gi, INT_ID('T','I','M','E'), numTimers); + ::gi.saved_game->read_chunk( + INT_ID('T','I','M','E'), + numTimers); //Make sure there's something to read if ( numTimers == 0 ) @@ -232,7 +234,9 @@ void TIMER_Load( void ) assert (sizeof(g_timers[0]->time) == sizeof(time) );//make sure we're reading the same size as we wrote - ::sg_read(::gi, INT_ID('T','S','L','N'), length); + ::gi.saved_game->read_chunk( + INT_ID('T','S','L','N'), + length); if ( length >= 1024 ) { assert( 0 ); @@ -240,8 +244,14 @@ void TIMER_Load( void ) } //Read the id and time - ::sg_read_no_cast(::gi, INT_ID('T','S','N','M'), tempBuffer, length); - ::sg_read(::gi, INT_ID('T','D','T','A'), time); + ::gi.saved_game->read_chunk( + INT_ID('T','S','N','M'), + tempBuffer, + length); + + ::gi.saved_game->read_chunk( + INT_ID('T','D','T','A'), + time); //this is odd, we saved all the timers in the autosave, but not all the ents are spawned yet from an auto load, so skip it if (ent->inuse) diff --git a/codeJK2/game/Q3_Interface.cpp b/codeJK2/game/Q3_Interface.cpp index bd34699ef3..7d2c82c192 100644 --- a/codeJK2/game/Q3_Interface.cpp +++ b/codeJK2/game/Q3_Interface.cpp @@ -9266,6 +9266,8 @@ void Interface_Init( interface_export_t *pe ) pe->I_ReadSaveData = gi.ReadFromSaveGame; pe->I_LinkEntity = ICARUS_LinkEntity; + pe->saved_game = gi.saved_game; + gclient_t *client; client = &level.clients[0]; memset(&client->sess,0,sizeof(client->sess)); diff --git a/codeJK2/game/Q3_Registers.cpp b/codeJK2/game/Q3_Registers.cpp index 269e4f6106..debb294632 100644 --- a/codeJK2/game/Q3_Registers.cpp +++ b/codeJK2/game/Q3_Registers.cpp @@ -25,7 +25,7 @@ along with this program; if not, see . #include "g_local.h" #include "Q3_Registers.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" extern void Q3_DebugPrint( int level, const char *format, ... ); @@ -362,19 +362,30 @@ void Q3_VariableLoadFloats( varFloat_m &fmap ) int numFloats; char tempBuffer[1024]; - ::sg_read(::gi, INT_ID('F','V','A','R'), numFloats); + ::gi.saved_game->read_chunk( + INT_ID('F','V','A','R'), + numFloats); for ( int i = 0; i < numFloats; i++ ) { int idSize; - ::sg_read(::gi, INT_ID('F','I','D','L'), idSize); - ::sg_read_no_cast(::gi, INT_ID('F','I','D','S'), tempBuffer, idSize); + ::gi.saved_game->read_chunk( + INT_ID('F','I','D','L'), + idSize); + + ::gi.saved_game->read_chunk( + INT_ID('F','I','D','S'), + tempBuffer, + idSize); + tempBuffer[ idSize ] = 0; float val; - ::sg_read_no_cast(::gi, INT_ID('F','V','A','L'), val); + ::gi.saved_game->read_chunk( + INT_ID('F','V','A','L'), + val); Q3_DeclareVariable( TK_FLOAT, (const char *) &tempBuffer ); Q3_SetFloatVariable( (const char *) &tempBuffer, val ); @@ -393,18 +404,34 @@ void Q3_VariableLoadStrings( int type, varString_m &fmap ) char tempBuffer[1024]; char tempBuffer2[1024]; - ::sg_read(::gi, INT_ID('S','V','A','R'), numFloats); + ::gi.saved_game->read_chunk( + INT_ID('S','V','A','R'), + numFloats); for ( int i = 0; i < numFloats; i++ ) { int idSize; - ::sg_read(::gi, INT_ID('S','I','D','L'), idSize); - ::sg_read_no_cast(::gi, INT_ID('S','I','D','S'), tempBuffer, idSize); + ::gi.saved_game->read_chunk( + INT_ID('S','I','D','L'), + idSize); + + ::gi.saved_game->read_chunk( + INT_ID('S','I','D','S'), + tempBuffer, + idSize); + tempBuffer[ idSize ] = 0; - ::sg_read(::gi, INT_ID('S','V','S','Z'), idSize); - ::sg_read_no_cast(::gi, INT_ID('S','V','A','L'), tempBuffer2, idSize); + ::gi.saved_game->read_chunk( + INT_ID('S','V','S','Z'), + idSize); + + ::gi.saved_game->read_chunk( + INT_ID('S','V','A','L'), + tempBuffer2, + idSize); + tempBuffer2[ idSize ] = 0; switch ( type ) diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp index bc09a5dd77..dd435f642e 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -36,7 +36,7 @@ along with this program; if not, see . #include "../cgame/cg_local.h" // yeah I know this is naughty, but we're shipping soon... #include "time.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" extern CNavigator navigator; @@ -96,7 +96,10 @@ void WriteInUseBits(void) void ReadInUseBits(void) { - ::sg_read(::gi, INT_ID('I','N','U','S'), ::g_entityInUseBits); + ::gi.saved_game->read_chunk( + INT_ID('I','N','U','S'), + ::g_entityInUseBits); + // This is only temporary. Once I have converted all the ent->inuse refs, // it won;t be needed -MW. for(int i=0;i(::gi, INT_ID('L','C','K','D'), player_locked); + ::gi.saved_game->read_chunk( + INT_ID('L','C','K','D'), + ::player_locked); } diff --git a/codeJK2/game/g_objectives.cpp b/codeJK2/game/g_objectives.cpp index 8420d2a006..3f35a57545 100644 --- a/codeJK2/game/g_objectives.cpp +++ b/codeJK2/game/g_objectives.cpp @@ -32,7 +32,7 @@ along with this program; if not, see . #include "objectives.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" qboolean missionInfo_Updated; @@ -88,7 +88,9 @@ OBJ_LoadMissionObjectives */ void OBJ_LoadMissionObjectives( gclient_t *client ) { - ::sg_read_no_cast(::gi, INT_ID('O','B','J','T'), client->sess.mission_objectives); + ::gi.saved_game->read_chunk( + INT_ID('O','B','J','T'), + client->sess.mission_objectives); } diff --git a/codeJK2/game/g_public.h b/codeJK2/game/g_public.h index a428f7ecc4..f09e3e0f27 100644 --- a/codeJK2/game/g_public.h +++ b/codeJK2/game/g_public.h @@ -179,6 +179,8 @@ typedef struct { int (*ReadFromSaveGame)(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPtr ); int (*ReadFromSaveGameOptional)(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPtr ); + ojk::ISavedGame* saved_game; + // add commands to the console as if they were typed in // for map changing, etc void (*SendConsoleCommand)( const char *text ); diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp index abdda306c5..97d8e65703 100644 --- a/codeJK2/game/g_roff.cpp +++ b/codeJK2/game/g_roff.cpp @@ -26,7 +26,7 @@ along with this program; if not, see . #include "g_roff.h" #include "g_icarus.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" // The list of precached ROFFs roff_list_t roffs[MAX_ROFFS]; @@ -653,13 +653,22 @@ void G_LoadCachedRoffs() char buffer[MAX_QPATH]; // Get the count of goodies we need to revive - ::sg_read(::gi, INT_ID('R','O','F','F'), count); + ::gi.saved_game->read_chunk( + INT_ID('R','O','F','F'), + count); // Now bring 'em back to life for ( i = 0; i < count; i++ ) { - ::sg_read(::gi, INT_ID('S','L','E','N'), len); - ::sg_read_no_cast(::gi, INT_ID('R','S','T','R'), buffer, len); + ::gi.saved_game->read_chunk( + INT_ID('S','L','E','N'), + len); + + ::gi.saved_game->read_chunk( + INT_ID('R','S','T','R'), + buffer, + len); + G_LoadRoff( buffer ); } } diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index e0e4333aac..2d4f6e4d31 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -34,7 +34,7 @@ along with this program; if not, see . #include "g_icarus.h" #include "../../code/qcommon/sstring.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" extern void OBJ_LoadTacticalInfo(void); @@ -185,7 +185,10 @@ char *GetStringPtr(int iStrlen, char *psOriginal/*may be NULL*/) assert(iStrlen+1<=(int)sizeof(sString)); - ::sg_read_no_cast(::gi, INT_ID('S','T','R','G'), sString, iStrlen); + ::gi.saved_game->read_chunk( + INT_ID('S','T','R','G'), + sString, + iStrlen); // we can't do string recycling with the new g_alloc pool dumping, so just always alloc here... // @@ -758,13 +761,17 @@ static void ReadGEntities(qboolean qbAutosave) int iCount; int i; - ::sg_read(::gi, INT_ID('N','M','E','D'), iCount); + ::gi.saved_game->read_chunk( + INT_ID('N','M','E','D'), + iCount); int iPreviousEntRead = -1; for (i=0; i(::gi, INT_ID('E','D','N','M'), iEntIndex); + ::gi.saved_game->read_chunk( + INT_ID('E','D','N','M'), + iEntIndex); if (iEntIndex >= globals.num_entities) { @@ -864,7 +871,9 @@ static void ReadGEntities(qboolean qbAutosave) { parms_t tempParms; - ::sg_read_no_cast(::gi, INT_ID('P','A','R','M'), tempParms); + ::gi.saved_game->read_chunk( + INT_ID('P','A','R','M'), + tempParms); // so can we pinch the original's one or do we have to alloc a new one?... // @@ -890,9 +899,14 @@ static void ReadGEntities(qboolean qbAutosave) // { char *pGhoul2Data = NULL; - ::sg_read_allocate(::gi, INT_ID('G','H','L','2'), pGhoul2Data); + + ::gi.saved_game->read_chunk( + INT_ID('G','H','L','2')); + + auto buffer = ::gi.saved_game->get_buffer(); + pGhoul2Data = reinterpret_cast(buffer.data()); + gi.G2API_LoadGhoul2Models(pEnt->ghoul2, pGhoul2Data); // if it's going to crash anywhere... - gi.Free(pGhoul2Data); } // gi.unlinkentity (pEntOriginal); @@ -951,7 +965,10 @@ static void ReadGEntities(qboolean qbAutosave) // check that Icarus has loaded everything it saved out by having a marker chunk after it... // static int iBlah = 1234; - ::sg_read(::gi, INT_ID('I','C','O','K'), iBlah); + + ::gi.saved_game->read_chunk( + INT_ID('I','C','O','K'), + iBlah); } if (!qbAutosave) { @@ -1010,8 +1027,8 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) EvaluateFields(savefields_gClient, &junkClient, &level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qfalse); //Read & throw away objective info - objectives_t junkObj[MAX_MISSION_OBJ]; - ::sg_read_no_cast(::gi, INT_ID('O','B','J','T'), junkObj); + ::gi.saved_game->read_chunk( + INT_ID('O','B','J','T')); ReadLevelLocals(); // level_locals_t level } @@ -1044,7 +1061,10 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) // check that the whole file content was loaded by specifically requesting an end-marker... // static int iDONE = 1234; - ::sg_read(::gi, INT_ID('D','O','N','E'), iDONE); + + ::gi.saved_game->read_chunk( + INT_ID('D','O','N','E'), + iDONE); } extern int killPlayerTimer; diff --git a/codeJK2/icarus/Instance.cpp b/codeJK2/icarus/Instance.cpp index 0d9693b9bd..3e3187362d 100644 --- a/codeJK2/icarus/Instance.cpp +++ b/codeJK2/icarus/Instance.cpp @@ -30,7 +30,7 @@ along with this program; if not, see . #include #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" // Instance @@ -443,7 +443,9 @@ int ICARUS_Instance::LoadSignals( void ) { int numSignals; - ::sg_read(m_interface, INT_ID('I','S','I','G'), numSignals); + m_interface->saved_game->read_chunk( + INT_ID('I','S','I','G'), + numSignals); for ( int i = 0; i < numSignals; i++ ) { @@ -451,12 +453,17 @@ int ICARUS_Instance::LoadSignals( void ) int length; //Get the size of the string - ::sg_read(m_interface, INT_ID('S','I','G','#'), length); + m_interface->saved_game->read_chunk( + INT_ID('S','I','G','#'), + length); assert( length < (int)sizeof( buffer ) ); //Get the string - ::sg_read_no_cast(m_interface, INT_ID('S','I','G','N'), buffer, length); + m_interface->saved_game->read_chunk( + INT_ID('S','I','G','N'), + buffer, + length); //Turn it on and add it to the system Signal( (const char *) &buffer ); @@ -497,7 +504,9 @@ int ICARUS_Instance::LoadSequences( void ) int numSequences; //Get the number of sequences to read in - ::sg_read(m_interface, INT_ID('#','S','E','Q'), numSequences); + m_interface->saved_game->read_chunk( + INT_ID('#','S','E','Q'), + numSequences); int *idTable = new int[ numSequences ]; @@ -505,7 +514,10 @@ int ICARUS_Instance::LoadSequences( void ) return false; //Load the sequencer ID table - ::sg_read(m_interface, INT_ID('S','Q','T','B'), idTable, numSequences); + m_interface->saved_game->read_chunk( + INT_ID('S','Q','T','B'), + idTable, + numSequences); //First pass, allocate all container sequences and give them their proper IDs if ( AllocateSequences( numSequences, idTable ) == false ) @@ -541,7 +553,9 @@ int ICARUS_Instance::LoadSequencers( void ) int numSequencers; //Get the number of sequencers to load - ::sg_read(m_interface, INT_ID('#','S','Q','R'), numSequencers); + m_interface->saved_game->read_chunk( + INT_ID('#','S','Q','R'), + numSequencers); //Load all sequencers for ( int i = 0; i < numSequencers; i++ ) @@ -570,7 +584,10 @@ int ICARUS_Instance::Load( void ) //Check to make sure we're at the ICARUS save block double version; - ::sg_read(m_interface, INT_ID('I','C','A','R'), version); + + m_interface->saved_game->read_chunk( + INT_ID('I','C','A','R'), + version); //Versions must match! if ( version != ICARUS_VERSION ) @@ -600,7 +617,9 @@ int ICARUS_Instance::Load( void ) return false; } - ::sg_read(m_interface, INT_ID('I','E','N','D'), version); + m_interface->saved_game->read_chunk( + INT_ID('I','E','N','D'), + version); return true; } diff --git a/codeJK2/icarus/Sequence.cpp b/codeJK2/icarus/Sequence.cpp index 5add77e5f4..721c145786 100644 --- a/codeJK2/icarus/Sequence.cpp +++ b/codeJK2/icarus/Sequence.cpp @@ -29,7 +29,7 @@ along with this program; if not, see . #include #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" CSequence::CSequence( void ) { @@ -440,22 +440,34 @@ int CSequence::Load( void ) int bID, bSize; void *bData; + auto saved_game = m_owner->GetInterface()->saved_game; + //Get the parent sequence - ::sg_read(m_owner->GetInterface(), INT_ID('S','P','I','D'), id); + saved_game->read_chunk( + INT_ID('S','P','I','D'), + id); + m_parent = ( id != -1 ) ? m_owner->GetSequence( id ) : NULL; //Get the return sequence - ::sg_read(m_owner->GetInterface(), INT_ID('S','R','I','D'), id); + saved_game->read_chunk( + INT_ID('S','R','I','D'), + id); + m_return = ( id != -1 ) ? m_owner->GetSequence( id ) : NULL; //Get the number of children - ::sg_read(m_owner->GetInterface(), INT_ID('S','N','C','H'), m_numChildren); + saved_game->read_chunk( + INT_ID('S','N','C','H'), + m_numChildren); //Reload all children for ( i = 0; i < m_numChildren; i++ ) { //Get the child sequence ID - ::sg_read(m_owner->GetInterface(), INT_ID('S','C','H','D'), id); + saved_game->read_chunk( + INT_ID('S','C','H','D'), + id); //Get the desired sequence if ( ( sequence = m_owner->GetSequence( id ) ) == NULL ) @@ -470,46 +482,67 @@ int CSequence::Load( void ) //Get the sequence flags - ::sg_read(m_owner->GetInterface(), INT_ID('S','F','L','G'), m_flags); + saved_game->read_chunk( + INT_ID('S','F','L','G'), + m_flags); //Get the number of iterations - ::sg_read(m_owner->GetInterface(), INT_ID('S','I','T','R'), m_iterations); + saved_game->read_chunk( + INT_ID('S','I','T','R'), + m_iterations); int numCommands; //Get the number of commands - ::sg_read(m_owner->GetInterface(), INT_ID('S','N','M','C'), numCommands); + saved_game->read_chunk( + INT_ID('S','N','M','C'), + numCommands); //Get all the commands for ( i = 0; i < numCommands; i++ ) { //Get the block ID and create a new container - ::sg_read(m_owner->GetInterface(), INT_ID('B','L','I','D'), id); + saved_game->read_chunk( + INT_ID('B','L','I','D'), + id); + block = new CBlock; block->Create( id ); //Read the block's flags - ::sg_read(m_owner->GetInterface(), INT_ID('B','F','L','G'), flags); + saved_game->read_chunk( + INT_ID('B','F','L','G'), + flags); + block->SetFlags( flags ); //Get the number of block members - ::sg_read(m_owner->GetInterface(), INT_ID('B','N','U','M'), numMembers); + saved_game->read_chunk( + INT_ID('B','N','U','M'), + numMembers); for ( int j = 0; j < numMembers; j++ ) { //Get the member ID - ::sg_read(m_owner->GetInterface(), INT_ID('B','M','I','D'), bID); + saved_game->read_chunk( + INT_ID('B','M','I','D'), + bID); //Get the member size - ::sg_read(m_owner->GetInterface(), INT_ID('B','S','I','Z'), bSize); + saved_game->read_chunk( + INT_ID('B','S','I','Z'), + bSize); //Get the member's data if ( ( bData = ICARUS_Malloc( bSize ) ) == NULL ) return false; //Get the actual raw data - ::sg_read_no_cast(m_owner->GetInterface(), INT_ID('B','M','E','M'), bData, bSize); + saved_game->read_chunk( + INT_ID('B','M','E','M'), + static_cast(bData), + bSize); //Write out the correct type switch ( bID ) diff --git a/codeJK2/icarus/Sequencer.cpp b/codeJK2/icarus/Sequencer.cpp index bbf71843be..457a12d655 100644 --- a/codeJK2/icarus/Sequencer.cpp +++ b/codeJK2/icarus/Sequencer.cpp @@ -31,7 +31,7 @@ along with this program; if not, see . #include "assert.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" // Sequencer @@ -2387,7 +2387,9 @@ int CSequencer::Load( void ) int i; //Get the owner of this sequencer - ::sg_read(m_ie, INT_ID('S','Q','R','E'), m_ownerID); + m_ie->saved_game->read_chunk( + INT_ID('S','Q','R','E'), + m_ownerID); //Link the entity back to the sequencer m_ie->I_LinkEntity( m_ownerID, this, m_taskManager ); @@ -2397,12 +2399,16 @@ int CSequencer::Load( void ) int numSequences, seqID, taskID, numTasks; //Get the number of sequences to read - ::sg_read(m_ie, INT_ID('S','Q','R','#'), numSequences); + m_ie->saved_game->read_chunk( + INT_ID('S','Q','R','#'), + numSequences); //Read in all the sequences for ( i = 0; i < numSequences; i++ ) { - ::sg_read(m_ie, INT_ID('S','Q','R','I'), seqID); + m_ie->saved_game->read_chunk( + INT_ID('S','Q','R','I'), + seqID); seq = m_owner->GetSequence( seqID ); @@ -2419,16 +2425,22 @@ int CSequencer::Load( void ) m_taskManager->Load(); //Get the number of tasks in the map - ::sg_read(m_ie, INT_ID('S','Q','T','#'), numTasks); + m_ie->saved_game->read_chunk( + INT_ID('S','Q','T','#'), + numTasks); //Read in, and reassociate the tasks to the sequences for ( i = 0; i < numTasks; i++ ) { //Read in the task's ID - ::sg_read(m_ie, INT_ID('S','T','I','D'), taskID); + m_ie->saved_game->read_chunk( + INT_ID('S','T','I','D'), + taskID); //Read in the sequence's ID - ::sg_read(m_ie, INT_ID('S','S','I','D'), seqID); + m_ie->saved_game->read_chunk( + INT_ID('S','S','I','D'), + seqID); taskGroup = m_taskManager->GetTaskGroup( taskID ); @@ -2445,15 +2457,21 @@ int CSequencer::Load( void ) int curGroupID; //Get the current task group - ::sg_read(m_ie, INT_ID('S','Q','C','T'), curGroupID); + m_ie->saved_game->read_chunk( + INT_ID('S','Q','C','T'), + curGroupID); m_curGroup = ( curGroupID == -1 ) ? NULL : m_taskManager->GetTaskGroup( curGroupID ); //Get the number of commands - ::sg_read(m_ie, INT_ID('S','Q','#','C'), m_numCommands); + m_ie->saved_game->read_chunk( + INT_ID('S','Q','#','C'), + m_numCommands); //Get the current sequence - ::sg_read(m_ie, INT_ID('S','Q','C','S'), seqID); + m_ie->saved_game->read_chunk( + INT_ID('S','Q','C','S'), + seqID); m_curSequence = ( seqID != -1 ) ? m_owner->GetSequence( seqID ) : NULL; diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index f17bad72d3..bd386f6f39 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -32,7 +32,7 @@ along with this program; if not, see . #include #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" #define ICARUS_VALIDATE(a) if ( a == false ) return TASK_FAILED; @@ -1816,11 +1816,17 @@ void CTaskManager::Load( void ) int bID, bSize; int i; + auto saved_game = m_owner->GetInterface()->saved_game; + //Get the GUID - ::sg_read(m_owner->GetInterface(), INT_ID('T','M','I','D'), m_GUID); + saved_game->read_chunk( + INT_ID('T','M','I','D'), + m_GUID); //Get the number of tasks to follow - ::sg_read(m_owner->GetInterface(), INT_ID('T','S','K','#'), numTasks); + saved_game->read_chunk( + INT_ID('T','S','K','#'), + numTasks); //Reload all the tasks for ( i = 0; i < numTasks; i++ ) @@ -1830,11 +1836,17 @@ void CTaskManager::Load( void ) assert( task ); //Get the GUID - ::sg_read(m_owner->GetInterface(), INT_ID('T','K','I','D'), id); + saved_game->read_chunk( + INT_ID('T','K','I','D'), + id); + task->SetGUID( id ); //Get the time stamp - ::sg_read(m_owner->GetInterface(), INT_ID('T','K','T','S'), timeStamp); + saved_game->read_chunk( + INT_ID('T','K','T','S'), + timeStamp); + task->SetTimeStamp( timeStamp ); // @@ -1842,25 +1854,37 @@ void CTaskManager::Load( void ) // //Get the block ID and create a new container - ::sg_read(m_owner->GetInterface(), INT_ID('B','L','I','D'), id); + saved_game->read_chunk( + INT_ID('B','L','I','D'), + id); + block = new CBlock; block->Create( id ); //Read the block's flags - ::sg_read(m_owner->GetInterface(), INT_ID('B','F','L','G'), flags); + saved_game->read_chunk( + INT_ID('B','F','L','G'), + flags); + block->SetFlags( flags ); //Get the number of block members - ::sg_read(m_owner->GetInterface(), INT_ID('B','N','U','M'), numMembers); + saved_game->read_chunk( + INT_ID('B','N','U','M'), + numMembers); for ( int j = 0; j < numMembers; j++ ) { //Get the member ID - ::sg_read(m_owner->GetInterface(), INT_ID('B','M','I','D'), bID); + saved_game->read_chunk( + INT_ID('B','M','I','D'), + bID); //Get the member size - ::sg_read(m_owner->GetInterface(), INT_ID('B','S','I','Z'), bSize); + saved_game->read_chunk( + INT_ID('B','S','I','Z'), + bSize); //Get the member's data if ( ( bData = ICARUS_Malloc( bSize ) ) == NULL ) @@ -1870,7 +1894,10 @@ void CTaskManager::Load( void ) } //Get the actual raw data - ::sg_read_no_cast(m_owner->GetInterface(), INT_ID('B','M','E','M'), bData, bSize); + saved_game->read_chunk( + INT_ID('B','M','E','M'), + static_cast(bData), + bSize); //Write out the correct type switch ( bID ) @@ -1921,7 +1948,9 @@ void CTaskManager::Load( void ) //Load the task groups int numTaskGroups; - ::sg_read(m_owner->GetInterface(), INT_ID('T','G','#','G'), numTaskGroups); + saved_game->read_chunk( + INT_ID('T','G','#','G'), + numTaskGroups); if ( numTaskGroups == 0 ) return; @@ -1936,7 +1965,10 @@ void CTaskManager::Load( void ) assert( taskGroup ); //Get this task group's ID - ::sg_read(m_owner->GetInterface(), INT_ID('T','K','G','#'), taskIDs[i]); + saved_game->read_chunk( + INT_ID('T','K','G','#'), + taskIDs[i]); + taskGroup->m_GUID = taskIDs[i]; m_taskGroupIDMap[ taskIDs[i] ] = taskGroup; @@ -1951,35 +1983,47 @@ void CTaskManager::Load( void ) assert( taskGroup ); //Load the parent ID - ::sg_read(m_owner->GetInterface(), INT_ID('T','K','G','P'), id); + saved_game->read_chunk( + INT_ID('T','K','G','P'), + id); if ( id != -1 ) taskGroup->m_parent = ( GetTaskGroup( id ) != NULL ) ? GetTaskGroup( id ) : NULL; //Get the number of commands in this group - ::sg_read(m_owner->GetInterface(), INT_ID('T','G','N','C'), numMembers); + saved_game->read_chunk( + INT_ID('T','G','N','C'), + numMembers); //Get each command and its completion state for ( int j = 0; j < numMembers; j++ ) { //Get the ID - ::sg_read(m_owner->GetInterface(), INT_ID('G','M','I','D'), id); + saved_game->read_chunk( + INT_ID('G','M','I','D'), + id); //Write out the state of completion - ::sg_read(m_owner->GetInterface(), INT_ID('G','M','D','N'), completed); + saved_game->read_chunk( + INT_ID('G','M','D','N'), + completed); //Save it out taskGroup->m_completedTasks[ id ] = completed; } //Get the number of completed tasks - ::sg_read(m_owner->GetInterface(), INT_ID('T','G','D','N'), taskGroup->m_numCompleted); + saved_game->read_chunk( + INT_ID('T','G','D','N'), + taskGroup->m_numCompleted); } //Reload the currently active group int curGroupID; - ::sg_read(m_owner->GetInterface(), INT_ID('T','G','C','G'), curGroupID); + saved_game->read_chunk( + INT_ID('T','G','C','G'), + curGroupID); //Reload the map entries for ( i = 0; i < numTaskGroups; i++ ) @@ -1988,13 +2032,20 @@ void CTaskManager::Load( void ) int length; //Get the size of the string - ::sg_read(m_owner->GetInterface(), INT_ID('T','G','N','L'), length); + saved_game->read_chunk( + INT_ID('T','G','N','L'), + length); //Get the string - ::sg_read_no_cast(m_owner->GetInterface(), INT_ID('T','G','N','S'), name, length); + saved_game->read_chunk( + INT_ID('T','G','N','S'), + name, + length); //Get the id - ::sg_read(m_owner->GetInterface(), INT_ID('T','G','N','I'), id); + saved_game->read_chunk( + INT_ID('T','G','N','I'), + id); taskGroup = GetTaskGroup( id ); assert( taskGroup ); diff --git a/codeJK2/icarus/interface.h b/codeJK2/icarus/interface.h index 051c8c9f24..39cc91567a 100644 --- a/codeJK2/icarus/interface.h +++ b/codeJK2/icarus/interface.h @@ -85,6 +85,7 @@ typedef struct interface_export_s int (*I_ReadSaveData)( unsigned int chid, void *address, int length, void **addressptr/* = NULL */); int (*I_LinkEntity)( int entID, CSequencer *sequencer, CTaskManager *taskManager ); + ojk::ISavedGame* saved_game; } interface_export_t; #endif //__INTERFACE__ diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index fa254a2b66..5ff9c8b47b 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -54,11 +54,14 @@ bool SavedGame::open( } } + if (is_succeed) { + is_readable_ = true; + } int sg_version = -1; if (is_succeed) { - static_cast(ISavedGame::read_chunk( + static_cast(read_chunk( INT_ID('_', 'V', 'E', 'R'), sg_version)); @@ -73,9 +76,7 @@ bool SavedGame::open( } } - if (is_succeed) { - is_readable_ = true; - } else { + if (!is_succeed) { close(); } @@ -109,14 +110,15 @@ bool SavedGame::create( return false; } + + is_writable_ = false; + int sg_version = iSAVEGAME_VERSION; - static_cast(ISavedGame::write_chunk( + static_cast(write_chunk( INT_ID('_', 'V', 'E', 'R'), sg_version)); - is_writable_ = false; - return true; } @@ -149,6 +151,8 @@ bool SavedGame::is_writable() const bool SavedGame::read_chunk( const SavedGame::ChunkId chunk_id) { + io_buffer_offset_ = 0; + auto chunk_id_string = get_chunk_id_string( chunk_id); @@ -198,7 +202,7 @@ bool SavedGame::read_chunk( if (bBlockIsCompressed) { uiLoaded += ::FS_Read( &uiCompressedLength, - static_cast(uiCompressedLength), + static_cast(sizeof(uiCompressedLength)), file_handle_); rle_buffer_.resize( @@ -209,6 +213,9 @@ bool SavedGame::read_chunk( uiCompressedLength, file_handle_); + io_buffer_.resize( + uiLoadedLength); + decompress( rle_buffer_, io_buffer_); From 0d153248e33d9f6788e524780b685de8a1bd39c9 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Mon, 11 Jul 2016 21:27:31 +0300 Subject: [PATCH 247/445] Replace writing wrappers --- code/cgame/FxScheduler.cpp | 9 ++- code/cgame/cg_main.cpp | 9 ++- code/client/cl_main.cpp | 3 + code/game/G_Timer.cpp | 14 +++- code/game/Q3_Interface.cpp | 44 ++++++++--- code/game/g_main.cpp | 8 +- code/game/g_objectives.cpp | 4 +- code/game/g_roff.cpp | 15 +++- code/game/g_savegame.cpp | 32 ++++++-- code/icarus/IcarusImplementation.cpp | 18 ++++- code/qcommon/cm_load.cpp | 7 +- code/rd-common/tr_public.h | 2 + code/rd-vanilla/G2_misc.cpp | 14 +++- code/server/sv_savegame.cpp | 110 +++++++++++++++++++++----- codeJK2/cgame/cg_main.cpp | 9 ++- codeJK2/game/G_Timer.cpp | 19 ++++- codeJK2/game/Q3_Registers.cpp | 44 ++++++++--- codeJK2/game/g_main.cpp | 8 +- codeJK2/game/g_objectives.cpp | 4 +- codeJK2/game/g_roff.cpp | 14 +++- codeJK2/game/g_savegame.cpp | 32 ++++++-- codeJK2/icarus/Instance.cpp | 45 +++++++++-- codeJK2/icarus/Sequence.cpp | 67 ++++++++++++---- codeJK2/icarus/Sequencer.cpp | 43 +++++++--- codeJK2/icarus/TaskManager.cpp | 113 +++++++++++++++++++++------ shared/qcommon/ojk_i_saved_game.h | 2 +- 26 files changed, 552 insertions(+), 137 deletions(-) diff --git a/code/cgame/FxScheduler.cpp b/code/cgame/FxScheduler.cpp index 34379ef482..a2835b1a88 100644 --- a/code/cgame/FxScheduler.cpp +++ b/code/cgame/FxScheduler.cpp @@ -134,7 +134,10 @@ void CFxScheduler::LoadSave_Write() { // bsave the data we need... // - ::sg_write_no_cast(::gi, INT_ID('F','X','L','E'), mLoopedEffectArray); + ::gi.saved_game->write_chunk( + INT_ID('F','X','L','E'), + mLoopedEffectArray); + // // then cope with the fact that the mID field in each struct of the array we've just saved will not // necessarily point at the same thing when reloading, so save out the actual fx filename strings they @@ -166,7 +169,9 @@ void CFxScheduler::LoadSave_Write() // write out this string... // - ::sg_write_no_cast(::gi, INT_ID('F','X','F','N'), sFX_Filename); + ::gi.saved_game->write_chunk( + INT_ID('F','X','F','N'), + sFX_Filename); } } diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 96fa0f03f0..74aae7a913 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -1908,8 +1908,13 @@ static void CG_GameStateReceived( void ) { void CG_WriteTheEvilCGHackStuff(void) { - ::sg_write(::gi, INT_ID('F','P','S','L'), ::cg.forcepowerSelect); - ::sg_write(::gi, INT_ID('I','V','S','L'), ::cg.inventorySelect); + ::gi.saved_game->write_chunk( + INT_ID('F','P','S','L'), + ::cg.forcepowerSelect); + + ::gi.saved_game->write_chunk( + INT_ID('I','V','S','L'), + ::cg.inventorySelect); } void CG_ReadTheEvilCGHackStuff(void) diff --git a/code/client/cl_main.cpp b/code/client/cl_main.cpp index 6ab334d913..b3ab567c76 100644 --- a/code/client/cl_main.cpp +++ b/code/client/cl_main.cpp @@ -32,6 +32,7 @@ along with this program; if not, see . #include "../ghoul2/G2.h" #include "qcommon/stringed_ingame.h" #include "sys/sys_loadlib.h" +#include "qcommon/ojk_saved_game.h" #define RETRANSMIT_TIMEOUT 3000 // time between connection packet retransmits @@ -1181,6 +1182,8 @@ void CL_InitRef( void ) { rit.SV_PointContents = SV_PointContents; + rit.saved_game = &ojk::SavedGame::get_instance(); + ret = GetRefAPI( REF_API_VERSION, &rit ); if ( !ret ) { diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index 19d53b9cc8..a35f13a4ce 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -173,7 +173,9 @@ void TIMER_Save( void ) } //Write out the timer information - ::sg_write(::gi, INT_ID('T','I','M','E'), numTimers); + ::gi.saved_game->write_chunk( + INT_ID('T','I','M','E'), + numTimers); gtimer_t *p = g_timers[j]; assert ((numTimers && p) || (!numTimers && !p)); @@ -187,10 +189,16 @@ void TIMER_Save( void ) assert( length < 1024 );//This will cause problems when loading the timer if longer //Write out the id string - ::sg_write_no_cast(::gi, INT_ID('T','M','I','D'), timerID, length); + ::gi.saved_game->write_chunk( + INT_ID('T','M','I','D'), + timerID, + length); //Write out the timer data - ::sg_write(::gi, INT_ID('T','D','T','A'), time); + ::gi.saved_game->write_chunk( + INT_ID('T','D','T','A'), + time); + p = p->next; } } diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index a01373611c..f109b105be 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -7208,7 +7208,10 @@ VariableSaveFloats void CQuake3GameInterface::VariableSaveFloats( varFloat_m &fmap ) { int numFloats = fmap.size(); - ::sg_write(::gi, INT_ID('F','V','A','R'), numFloats); + + ::gi.saved_game->write_chunk( + INT_ID('F','V','A','R'), + numFloats); varFloat_m::iterator vfi; STL_ITERATE( vfi, fmap ) @@ -7217,11 +7220,19 @@ void CQuake3GameInterface::VariableSaveFloats( varFloat_m &fmap ) int idSize = strlen( ((*vfi).first).c_str() ); //Save out the real data - ::sg_write(::gi, INT_ID('F','I','D','L'), idSize); - ::sg_write_no_cast(::gi, INT_ID('F','I','D','S'), ((*vfi).first).c_str(), idSize); + ::gi.saved_game->write_chunk( + INT_ID('F','I','D','L'), + idSize); + + ::gi.saved_game->write_chunk( + INT_ID('F','I','D','S'), + ((*vfi).first).c_str(), + idSize); //Save out the float value - ::sg_write_no_cast(::gi, INT_ID('F','V','A','L'), (*vfi).second); + ::gi.saved_game->write_chunk( + INT_ID('F','V','A','L'), + (*vfi).second); } } @@ -7234,7 +7245,10 @@ VariableSaveStrings void CQuake3GameInterface::VariableSaveStrings( varString_m &smap ) { int numStrings = smap.size(); - ::sg_write(::gi, INT_ID('S','V','A','R'), numStrings); + + ::gi.saved_game->write_chunk( + INT_ID('S','V','A','R'), + numStrings); varString_m::iterator vsi; STL_ITERATE( vsi, smap ) @@ -7243,14 +7257,26 @@ void CQuake3GameInterface::VariableSaveStrings( varString_m &smap ) int idSize = strlen( ((*vsi).first).c_str() ); //Save out the real data - ::sg_write(::gi, INT_ID('S','I','D','L'), idSize); - ::sg_write_no_cast(::gi, INT_ID('S','I','D','S'), ((*vsi).first).c_str(), idSize); + ::gi.saved_game->write_chunk( + INT_ID('S','I','D','L'), + idSize); + + ::gi.saved_game->write_chunk( + INT_ID('S','I','D','S'), + ((*vsi).first).c_str(), + idSize); //Save out the string value idSize = strlen( ((*vsi).second).c_str() ); - ::sg_write(::gi, INT_ID('S','V','S','Z'), idSize); - ::sg_write_no_cast(::gi, INT_ID('S','V','A','L'), ((*vsi).second).c_str(), idSize); + ::gi.saved_game->write_chunk( + INT_ID('S','V','S','Z'), + idSize); + + ::gi.saved_game->write_chunk( + INT_ID('S','V','A','L'), + ((*vsi).second).c_str(), + idSize); } } diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 288be0c925..9d29aba1f1 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -108,7 +108,9 @@ qboolean PInUse(unsigned int entNum) void WriteInUseBits(void) { - ::sg_write(::gi, INT_ID('I','N','U','S'), ::g_entityInUseBits); + ::gi.saved_game->write_chunk( + INT_ID('I','N','U','S'), + ::g_entityInUseBits); } void ReadInUseBits(void) @@ -2114,7 +2116,9 @@ extern qboolean player_locked; void G_LoadSave_WriteMiscData(void) { - ::sg_write(::gi, INT_ID('L','C','K','D'), player_locked); + ::gi.saved_game->write_chunk( + INT_ID('L','C','K','D'), + ::player_locked); } diff --git a/code/game/g_objectives.cpp b/code/game/g_objectives.cpp index 92afb4394a..ae3e45aa04 100644 --- a/code/game/g_objectives.cpp +++ b/code/game/g_objectives.cpp @@ -61,7 +61,9 @@ OBJ_SaveMissionObjectives */ void OBJ_SaveMissionObjectives( gclient_t *client ) { - ::sg_write_no_cast(::gi, INT_ID('O','B','J','T'), client->sess.mission_objectives); + ::gi.saved_game->write_chunk( + INT_ID('O','B','J','T'), + client->sess.mission_objectives); } diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp index 5f3176eabc..95b8494d26 100644 --- a/code/game/g_roff.cpp +++ b/code/game/g_roff.cpp @@ -653,15 +653,24 @@ void G_SaveCachedRoffs() int i, len; // Write out the number of cached ROFFs - ::sg_write(::gi, INT_ID('R','O','F','F'), num_roffs); + ::gi.saved_game->write_chunk( + INT_ID('R','O','F','F'), + ::num_roffs); // Now dump out the cached ROFF file names in order so they can be loaded on the other end for ( i = 0; i < num_roffs; i++ ) { // Dump out the string length to make things a bit easier on the other end...heh heh. len = strlen( roffs[i].fileName ) + 1; - ::sg_write(::gi, INT_ID('S','L','E','N'), len); - ::sg_write_no_cast(::gi, INT_ID('R','S','T','R'), roffs[i].fileName, len); + + ::gi.saved_game->write_chunk( + INT_ID('S','L','E','N'), + len); + + ::gi.saved_game->write_chunk( + INT_ID('R','S','T','R'), + roffs[i].fileName, + len); } } diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index 54e2d0285e..f3941c1d1e 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -536,13 +536,19 @@ static void EnumerateFields(const save_field_t *pFields, const T* src_instance, ::sg_export(*src_instance, *dst_instance); - ::sg_write_no_cast(::gi, ulChid, dst_buffer.data(), dst_size); + ::gi.saved_game->write_chunk( + ulChid, + dst_buffer.data(), + dst_size); // save out any associated strings.. // for (const auto& it : strList) { - ::sg_write_no_cast(::gi, INT_ID('S','T','R','G'), it.c_str(), static_cast(it.length() + 1)); + ::gi.saved_game->write_chunk( + INT_ID('S','T','R','G'), + it.c_str(), + static_cast(it.length() + 1)); } } @@ -849,7 +855,9 @@ static void WriteGEntities(qboolean qbAutosave) } } - ::sg_write(::gi, INT_ID('N','M','E','D'), iCount); + ::gi.saved_game->write_chunk( + INT_ID('N','M','E','D'), + iCount); for (i=0; i<(qbAutosave?1:globals.num_entities); i++) { @@ -857,7 +865,9 @@ static void WriteGEntities(qboolean qbAutosave) if ( ent->inuse) { - ::sg_write(::gi, INT_ID('E','D','N','M'), i); + ::gi.saved_game->write_chunk( + INT_ID('E','D','N','M'), + i); qboolean qbLinked = ent->linked; gi.unlinkentity( ent ); @@ -888,7 +898,9 @@ static void WriteGEntities(qboolean qbAutosave) if (tempEnt.parms) { - ::sg_write_no_cast(::gi, INT_ID('P','A','R','M'), *ent->parms); + ::gi.saved_game->write_chunk( + INT_ID('P','A','R','M'), + *ent->parms); } if (tempEnt.m_pVehicle) @@ -917,7 +929,10 @@ static void WriteGEntities(qboolean qbAutosave) // This saves time debugging, and makes things easier to track. // static int iBlah = 1234; - ::sg_write(::gi, INT_ID('I','C','O','K'), iBlah); + + ::gi.saved_game->write_chunk( + INT_ID('I','C','O','K'), + iBlah); } if (!qbAutosave )//really shouldn't need to write these bits at all, just restore them from the ents... { @@ -1216,7 +1231,10 @@ void WriteLevel(qboolean qbAutosave) // put out an end-marker so that the load code can check everything was read in... // static int iDONE = 1234; - ::sg_write(::gi, INT_ID('D','O','N','E'), iDONE); + + ::gi.saved_game->write_chunk( + INT_ID('D','O','N','E'), + iDONE); } void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index 6b0385bd36..77d7ce81d8 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -539,10 +539,14 @@ int CIcarus::Save() CreateBuffer(); IGameInterface* game = IGameInterface::GetGame(m_flavor); + auto saved_game = game->get_saved_game(); //Save out a ICARUS save block header with the ICARUS version double version = ICARUS_VERSION; - ::sg_write_no_cast(game, INT_ID('I','C','A','R'), version); + + saved_game->read_chunk( + INT_ID('I','C','A','R'), + version); //Save out the signals if ( SaveSignals() == false ) @@ -566,7 +570,10 @@ int CIcarus::Save() } // Write out the buffer with all our collected data. - ::sg_write_no_cast(game, INT_ID('I','S','E','Q'), m_byBuffer, static_cast(m_ulBufferCurPos)); + saved_game->read_chunk( + INT_ID('I','S','E','Q'), + m_byBuffer, + static_cast(m_ulBufferCurPos)); // De-allocate the temporary buffer. DestroyBuffer(); @@ -796,7 +803,12 @@ void CIcarus::BufferWrite( void *pSrcData, unsigned long ulNumBytesToWrite ) if ( MAX_BUFFER_SIZE - m_ulBufferCurPos < ulNumBytesToWrite ) { // Write out the buffer with all our collected data so far... IGameInterface::GetGame()->DebugPrint( IGameInterface::WL_ERROR, "BufferWrite: Out of buffer space, Flushing." ); - ::sg_write_no_cast(IGameInterface::GetGame(), INT_ID('I','S','E','Q'), m_byBuffer, static_cast(m_ulBufferCurPos)); + + IGameInterface::GetGame()->get_saved_game()->write_chunk( + INT_ID('I','S','E','Q'), + m_byBuffer, + static_cast(m_ulBufferCurPos)); + m_ulBufferCurPos = 0; //reset buffer } diff --git a/code/qcommon/cm_load.cpp b/code/qcommon/cm_load.cpp index a7250cae4c..bfe497517f 100644 --- a/code/qcommon/cm_load.cpp +++ b/code/qcommon/cm_load.cpp @@ -1217,7 +1217,12 @@ int SG_Read(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPt void CM_WritePortalState () { - ::sg_write(::SG_Append, INT_ID('P','R','T','S'), ::cmg.areaPortals, ::cmg.numAreas * ::cmg.numAreas); + auto saved_game = &ojk::SavedGame::get_instance(); + + saved_game->write_chunk( + INT_ID('P','R','T','S'), + ::cmg.areaPortals, + ::cmg.numAreas * ::cmg.numAreas); } /* diff --git a/code/rd-common/tr_public.h b/code/rd-common/tr_public.h index 3db7b667dd..9b4e2f27b5 100644 --- a/code/rd-common/tr_public.h +++ b/code/rd-common/tr_public.h @@ -114,6 +114,8 @@ typedef struct { qboolean (*SG_Append) ( unsigned int chid, const void *pvData, int iLength ); + ojk::ISavedGame* saved_game; + int (*SV_PointContents) ( const vec3_t p, clipHandle_t model ); qboolean (*CM_DeleteCachedMap) ( qboolean bGuaranteedOkToDelete ); // NOT IN MP diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index 4ad50ac20d..676ae4d026 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -51,7 +51,7 @@ along with this program; if not, see . #ifdef _G2_GORE #include "../ghoul2/ghoul2_gore.h" #include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_i_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game.h" #define GORE_TAG_UPPER (256) #define GORE_TAG_MASK (~255) @@ -1781,7 +1781,11 @@ void G2_SaveGhoul2Models(CGhoul2Info_v &ghoul2) if (!ghoul2.IsValid()||!ghoul2.size()) { uint32_t empty_value = 0; - ::sg_write_no_cast(::ri, INT_ID('G','H','L','2'), empty_value); //write out a zero buffer + + ::ri.saved_game->write_chunk( + INT_ID('G','H','L','2'), + empty_value); //write out a zero buffer + return; } @@ -1880,7 +1884,11 @@ void G2_SaveGhoul2Models(CGhoul2Info_v &ghoul2) } } - ::sg_write_no_cast(::ri, INT_ID('G','H','L','2'), pGhoul2Data, iGhoul2Size); + ::ri.saved_game->write_chunk( + INT_ID('G','H','L','2'), + pGhoul2Data, + iGhoul2Size); + R_Free(pGhoul2Data); } diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index bc8d1730c6..52d70841c2 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -180,8 +180,13 @@ static qboolean SG_Create( const char *psPathlessBaseName ) return qfalse; } + auto saved_game = &ojk::SavedGame::get_instance(); + giSaveGameVersion = iSAVEGAME_VERSION; - ::sg_write(::SG_Append, INT_ID('_','V','E','R'), ::giSaveGameVersion); + + saved_game->write_chunk( + INT_ID('_','V','E','R'), + ::giSaveGameVersion); return qtrue; } @@ -548,7 +553,11 @@ void SV_SaveGame_f(void) //--------------- static void WriteGame(qboolean autosave) { - ::sg_write(::SG_Append, INT_ID('G','A','M','E'), autosave); + auto saved_game = &ojk::SavedGame::get_instance(); + + saved_game->write_chunk( + INT_ID('G','A','M','E'), + autosave); if (autosave) { @@ -563,25 +572,37 @@ static void WriteGame(qboolean autosave) // memset(s,0,sizeof(s)); Cvar_VariableStringBuffer( sCVARNAME_PLAYERSAVE, s, sizeof(s) ); - ::sg_write_no_cast(::SG_Append, INT_ID('C','V','S','V'), s); + + saved_game->write_chunk( + INT_ID('C','V','S','V'), + s); // write ammo... // memset(s,0,sizeof(s)); Cvar_VariableStringBuffer( "playerammo", s, sizeof(s) ); - ::sg_write_no_cast(::SG_Append, INT_ID('A','M','M','O'), s); + + saved_game->write_chunk( + INT_ID('A','M','M','O'), + s); // write inventory... // memset(s,0,sizeof(s)); Cvar_VariableStringBuffer( "playerinv", s, sizeof(s) ); - ::sg_write_no_cast(::SG_Append, INT_ID('I','V','T','Y'), s); + + saved_game->write_chunk( + INT_ID('I','V','T','Y'), + s); // the new JK2 stuff - force powers, etc... // memset(s,0,sizeof(s)); Cvar_VariableStringBuffer( "playerfplvl", s, sizeof(s) ); - ::sg_write_no_cast(::SG_Append, INT_ID('F','P','L','V'), s); + + saved_game->write_chunk( + INT_ID('F','P','L','V'), + s); } } @@ -656,6 +677,8 @@ void SG_WriteCvars(void) cvar_t *var; int iCount = 0; + auto saved_game = &ojk::SavedGame::get_instance(); + // count the cvars... // for (var = cvar_vars; var; var = var->next) @@ -673,7 +696,9 @@ void SG_WriteCvars(void) // store count... // - ::sg_write(::SG_Append, INT_ID('C','V','C','N'), iCount); + saved_game->write_chunk( + INT_ID('C','V','C','N'), + iCount); // write 'em... // @@ -687,8 +712,16 @@ void SG_WriteCvars(void) { continue; } - ::sg_write_no_cast(::SG_Append, INT_ID('C','V','A','R'), var->name, static_cast(strlen(var->name) + 1)); - ::sg_write_no_cast(::SG_Append, INT_ID('V','A','L','U'), var->string, static_cast(strlen(var->string) + 1)); + + saved_game->write_chunk( + INT_ID('C','V','A','R'), + var->name, + static_cast(strlen(var->name) + 1)); + + saved_game->write_chunk( + INT_ID('V','A','L','U'), + var->string, + static_cast(strlen(var->string) + 1)); } } @@ -726,6 +759,8 @@ void SG_ReadCvars(void) void SG_WriteServerConfigStrings( void ) { + auto saved_game = &ojk::SavedGame::get_instance(); + int iCount = 0; int i; // not in FOR statement in case compiler goes weird by reg-optimising it then failing to get the address later @@ -742,7 +777,9 @@ void SG_WriteServerConfigStrings( void ) } } - ::sg_write(::SG_Append, INT_ID('C','S','C','N'), iCount); + saved_game->write_chunk( + INT_ID('C','S','C','N'), + iCount); // now write 'em... // @@ -752,8 +789,14 @@ void SG_WriteServerConfigStrings( void ) { if (sv.configstrings[i] && strlen(sv.configstrings[i])) { - ::sg_write(::SG_Append, INT_ID('C','S','I','N'), i); - ::sg_write_no_cast(::SG_Append, INT_ID('C','S','D','A'), ::sv.configstrings[i], static_cast(strlen(::sv.configstrings[i])+1)); + saved_game->write_chunk( + INT_ID('C','S','I','N'), + i); + + saved_game->write_chunk( + INT_ID('C','S','D','A'), + ::sv.configstrings[i], + static_cast(strlen(::sv.configstrings[i])+1)); } } } @@ -816,6 +859,8 @@ static unsigned int SG_UnixTimestamp ( const time_t& t ) static void SG_WriteComment(qboolean qbAutosave, const char *psMapName) { + auto saved_game = &ojk::SavedGame::get_instance(); + char sComment[iSG_COMMENT_SIZE]; if ( qbAutosave || !*saveGameComment) @@ -827,11 +872,16 @@ static void SG_WriteComment(qboolean qbAutosave, const char *psMapName) Q_strncpyz(sComment,saveGameComment, sizeof(sComment)); } - ::sg_write_no_cast(::SG_Append, INT_ID('C','O','M','M'), sComment); + saved_game->write_chunk( + INT_ID('C','O','M','M'), + sComment); // Add Date/Time/Map stamp unsigned int timestamp = SG_UnixTimestamp (time (NULL)); - ::sg_write(::SG_Append, INT_ID('C','M','T','M'), timestamp); + + saved_game->write_chunk( + INT_ID('C','M','T','M'), + timestamp); Com_DPrintf("Saving: current (%s)\n", sComment); } @@ -1010,6 +1060,8 @@ qboolean SG_GetSaveImage( const char *psPathlessBaseName, void *pvAddress ) static void SG_WriteScreenshot(qboolean qbAutosave, const char *psMapName) { + auto saved_game = &ojk::SavedGame::get_instance(); + byte *pbRawScreenShot = NULL; byte *byBlank = NULL; @@ -1053,8 +1105,16 @@ static void SG_WriteScreenshot(qboolean qbAutosave, const char *psMapName) iJPGDataSize = re.SaveJPGToBuffer(pJPGData, bufSize, JPEG_IMAGE_QUALITY, SG_SCR_WIDTH, SG_SCR_HEIGHT, pbRawScreenShot, 0 ); if ( qbAutosave ) delete[] byBlank; - ::sg_write(::SG_Append, INT_ID('S','H','L','N'), iJPGDataSize); - ::sg_write_no_cast(::SG_Append, INT_ID('S','H','O','T'), pJPGData, static_cast(iJPGDataSize)); + + saved_game->write_chunk( + INT_ID('S','H','L','N'), + iJPGDataSize); + + saved_game->write_chunk( + INT_ID('S','H','O','T'), + pJPGData, + static_cast(iJPGDataSize)); + Z_Free(pJPGData); SCR_TempRawImage_CleanUp(); } @@ -1134,7 +1194,13 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) #ifdef JK2_MODE SG_WriteScreenshot(qbAutosave, sMapCmd); #endif - ::sg_write_no_cast(::SG_Append, INT_ID('M','P','C','M'), sMapCmd); + + auto saved_game = &ojk::SavedGame::get_instance(); + + saved_game->write_chunk( + INT_ID('M','P','C','M'), + sMapCmd); + SG_WriteCvars(); WriteGame (qbAutosave); @@ -1143,8 +1209,14 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) // if (!qbAutosave) { - ::sg_write(::SG_Append, INT_ID('T','I','M','E'), ::sv.time); - ::sg_write(::SG_Append, INT_ID('T','I','M','R'), ::sv.timeResidual); + saved_game->write_chunk( + INT_ID('T','I','M','E'), + ::sv.time); + + saved_game->write_chunk( + INT_ID('T','I','M','R'), + ::sv.timeResidual); + CM_WritePortalState(); SG_WriteServerConfigStrings(); } diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index 1f2b76149e..2804a04676 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -1641,10 +1641,15 @@ Ghoul2 Insert End void CG_WriteTheEvilCGHackStuff(void) { - ::sg_write(::gi, INT_ID('F','P','S','L'), ::cg.forcepowerSelect); - ::sg_write(::gi, INT_ID('I','V','S','L'), ::cg.inventorySelect); + ::gi.saved_game->write_chunk( + INT_ID('F','P','S','L'), + ::cg.forcepowerSelect); + ::gi.saved_game->write_chunk( + INT_ID('I','V','S','L'), + ::cg.inventorySelect); } + void CG_ReadTheEvilCGHackStuff(void) { ::gi.saved_game->read_chunk( diff --git a/codeJK2/game/G_Timer.cpp b/codeJK2/game/G_Timer.cpp index b767a6d0de..c67eda9a98 100644 --- a/codeJK2/game/G_Timer.cpp +++ b/codeJK2/game/G_Timer.cpp @@ -179,7 +179,9 @@ void TIMER_Save( void ) } //Write out the timer information - ::sg_write(::gi, INT_ID('T','I','M','E'), numTimers); + ::gi.saved_game->write_chunk( + INT_ID('T','I','M','E'), + numTimers); gtimer_t *p = g_timers[j]; assert ((numTimers && p) || (!numTimers && !p)); @@ -193,11 +195,20 @@ void TIMER_Save( void ) assert( length < 1024 );//This will cause problems when loading the timer if longer //Write out the string size and data - ::sg_write(::gi, INT_ID('T','S','L','N'), length); - ::sg_write_no_cast(::gi, INT_ID('T','S','N','M'), timerID, length); + ::gi.saved_game->write_chunk( + INT_ID('T','S','L','N'), + length); + + ::gi.saved_game->write_chunk( + INT_ID('T','S','N','M'), + timerID, + length); //Write out the timer data - ::sg_write(::gi, INT_ID('T','D','T','A'), time); + ::gi.saved_game->write_chunk( + INT_ID('T','D','T','A'), + time); + p = p->next; } } diff --git a/codeJK2/game/Q3_Registers.cpp b/codeJK2/game/Q3_Registers.cpp index debb294632..3fb2e65dd9 100644 --- a/codeJK2/game/Q3_Registers.cpp +++ b/codeJK2/game/Q3_Registers.cpp @@ -290,7 +290,10 @@ Q3_VariableSaveFloats void Q3_VariableSaveFloats( varFloat_m &fmap ) { int numFloats = fmap.size(); - ::sg_write(::gi, INT_ID('F','V','A','R'), numFloats); + + ::gi.saved_game->write_chunk( + INT_ID('F','V','A','R'), + numFloats); varFloat_m::iterator vfi; STL_ITERATE( vfi, fmap ) @@ -299,11 +302,19 @@ void Q3_VariableSaveFloats( varFloat_m &fmap ) int idSize = strlen( ((*vfi).first).c_str() ); //Save out the real data - ::sg_write(::gi, INT_ID('F','I','D','L'), idSize); - ::sg_write_no_cast(::gi, INT_ID('F','I','D','S'), ((*vfi).first).c_str(), idSize); + ::gi.saved_game->write_chunk( + INT_ID('F','I','D','L'), + idSize); + + ::gi.saved_game->write_chunk( + INT_ID('F','I','D','S'), + ((*vfi).first).c_str(), + idSize); //Save out the float value - ::sg_write_no_cast(::gi, INT_ID('F','V','A','L'), (*vfi).second); + ::gi.saved_game->write_chunk( + INT_ID('F','V','A','L'), + (*vfi).second); } } @@ -316,7 +327,10 @@ Q3_VariableSaveStrings void Q3_VariableSaveStrings( varString_m &smap ) { int numStrings = smap.size(); - ::sg_write(::gi, INT_ID('S','V','A','R'), numStrings); + + ::gi.saved_game->write_chunk( + INT_ID('S','V','A','R'), + numStrings); varString_m::iterator vsi; STL_ITERATE( vsi, smap ) @@ -325,14 +339,26 @@ void Q3_VariableSaveStrings( varString_m &smap ) int idSize = strlen( ((*vsi).first).c_str() ); //Save out the real data - ::sg_write(::gi, INT_ID('S','I','D','L'), idSize); - ::sg_write_no_cast(::gi, INT_ID('S','I','D','S'), ((*vsi).first).c_str(), idSize); + ::gi.saved_game->write_chunk( + INT_ID('S','I','D','L'), + idSize); + + ::gi.saved_game->write_chunk( + INT_ID('S','I','D','S'), + ((*vsi).first).c_str(), + idSize); //Save out the string value idSize = strlen( ((*vsi).second).c_str() ); - ::sg_write(::gi, INT_ID('S','V','S','Z'), idSize); - ::sg_write_no_cast(::gi, INT_ID('S','V','A','L'), ((*vsi).second).c_str(), idSize); + ::gi.saved_game->write_chunk( + INT_ID('S','V','S','Z'), + idSize); + + ::gi.saved_game->write_chunk( + INT_ID('S','V','A','L'), + ((*vsi).second).c_str(), + idSize); } } diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp index dd435f642e..18b0355241 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -91,7 +91,9 @@ qboolean PInUse2(gentity_t *ent) void WriteInUseBits(void) { - ::sg_write(::gi, INT_ID('I','N','U','S'), ::g_entityInUseBits); + ::gi.saved_game->write_chunk( + INT_ID('I','N','U','S'), + ::g_entityInUseBits); } void ReadInUseBits(void) @@ -1482,7 +1484,9 @@ extern qboolean player_locked; void G_LoadSave_WriteMiscData(void) { - ::sg_write(::gi, INT_ID('L','C','K','D'), player_locked); + ::gi.saved_game->write_chunk( + INT_ID('L','C','K','D'), + ::player_locked); } diff --git a/codeJK2/game/g_objectives.cpp b/codeJK2/game/g_objectives.cpp index 3f35a57545..11c2b7f213 100644 --- a/codeJK2/game/g_objectives.cpp +++ b/codeJK2/game/g_objectives.cpp @@ -63,7 +63,9 @@ OBJ_SaveMissionObjectives */ void OBJ_SaveMissionObjectives( gclient_t *client ) { - ::sg_write_no_cast(::gi, INT_ID('O','B','J','T'), client->sess.mission_objectives); + ::gi.saved_game->write_chunk( + INT_ID('O','B','J','T'), + client->sess.mission_objectives); } diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp index 97d8e65703..8d3f388584 100644 --- a/codeJK2/game/g_roff.cpp +++ b/codeJK2/game/g_roff.cpp @@ -628,15 +628,23 @@ void G_SaveCachedRoffs() int i, len; // Write out the number of cached ROFFs - ::sg_write(::gi, INT_ID('R','O','F','F'), num_roffs); + ::gi.saved_game->write_chunk( + INT_ID('R','O','F','F'), + ::num_roffs); // Now dump out the cached ROFF file names in order so they can be loaded on the other end for ( i = 0; i < num_roffs; i++ ) { // Dump out the string length to make things a bit easier on the other end...heh heh. len = strlen( roffs[i].fileName ) + 1; - ::sg_write(::gi, INT_ID('S','L','E','N'), len); - ::sg_write_no_cast(::gi, INT_ID('R','S','T','R'), roffs[i].fileName, len); + ::gi.saved_game->write_chunk( + INT_ID('S','L','E','N'), + len); + + ::gi.saved_game->write_chunk( + INT_ID('R','S','T','R'), + ::roffs[i].fileName, + len); } } diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index 2d4f6e4d31..96349134b9 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -477,13 +477,19 @@ static void EnumerateFields(const field_t *pFields, T* src_instance, unsigned in ::sg_export(*src_instance, *dst_instance); - ::sg_write_no_cast(::gi, ulChid, dst_buffer.data(), dst_size); + ::gi.saved_game->write_chunk( + ulChid, + dst_buffer.data(), + dst_size); // save out any associated strings.. // for (const auto& it : strList) { - ::sg_write_no_cast(::gi, INT_ID('S','T','R','G'), it.c_str(), static_cast(it.length()+1)); + ::gi.saved_game->write_chunk( + INT_ID('S','T','R','G'), + it.c_str(), + static_cast(it.length() + 1)); } } @@ -686,7 +692,9 @@ static void WriteGEntities(qboolean qbAutosave) } } - ::sg_write(::gi, INT_ID('N','M','E','D'), iCount); + ::gi.saved_game->write_chunk( + INT_ID('N','M','E','D'), + iCount); for (i=0; i<(qbAutosave?1:globals.num_entities); i++) { @@ -694,7 +702,9 @@ static void WriteGEntities(qboolean qbAutosave) if ( ent->inuse) { - ::sg_write(::gi, INT_ID('E','D','N','M'), i); + ::gi.saved_game->write_chunk( + INT_ID('E','D','N','M'), + i); qboolean qbLinked = ent->linked; gi.unlinkentity( ent ); @@ -725,7 +735,9 @@ static void WriteGEntities(qboolean qbAutosave) if (tempEnt.parms) { - ::sg_write_no_cast(::gi, INT_ID('P','A','R','M'), *ent->parms); + ::gi.saved_game->write_chunk( + INT_ID('P','A','R','M'), + *ent->parms); } // the scary ghoul2 saver stuff... (fingers crossed) @@ -748,7 +760,10 @@ static void WriteGEntities(qboolean qbAutosave) // This saves time debugging, and makes things easier to track. // static int iBlah = 1234; - ::sg_write(::gi, INT_ID('I','C','O','K'), iBlah); + + ::gi.saved_game->write_chunk( + INT_ID('I','C','O','K'), + iBlah); } if (!qbAutosave )//really shouldn't need to write these bits at all, just restore them from the ents... { @@ -1004,7 +1019,10 @@ void WriteLevel(qboolean qbAutosave) // put out an end-marker so that the load code can check everything was read in... // static int iDONE = 1234; - ::sg_write(::gi, INT_ID('D','O','N','E'), iDONE); + + ::gi.saved_game->write_chunk( + INT_ID('D','O','N','E'), + iDONE); } void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) diff --git a/codeJK2/icarus/Instance.cpp b/codeJK2/icarus/Instance.cpp index 3e3187362d..78e4f9450c 100644 --- a/codeJK2/icarus/Instance.cpp +++ b/codeJK2/icarus/Instance.cpp @@ -304,7 +304,12 @@ int ICARUS_Instance::SaveSequenceIDTable( void ) { //Save out the number of sequences to follow int numSequences = m_sequences.size(); - ::sg_write(m_interface, INT_ID('#','S','E','Q'), numSequences); + + auto saved_game = m_interface->saved_game; + + saved_game->write_chunk( + INT_ID('#','S','E','Q'), + numSequences); //Sequences are saved first, by ID and information sequence_l::iterator sqi; @@ -321,7 +326,10 @@ int ICARUS_Instance::SaveSequenceIDTable( void ) idTable[itr++] = (*sqi)->GetID(); } - ::sg_write(m_interface, INT_ID('S','Q','T','B'), idTable, numSequences); + saved_game->write_chunk( + INT_ID('S','Q','T','B'), + idTable, + numSequences); delete[] idTable; @@ -359,7 +367,12 @@ int ICARUS_Instance::SaveSequencers( void ) { //Save out the number of sequences to follow int numSequencers = m_sequencers.size(); - ::sg_write(m_interface, INT_ID('#','S','Q','R'), numSequencers); + + auto saved_game = m_interface->saved_game; + + saved_game->write_chunk( + INT_ID('#','S','Q','R'), + numSequencers); //The sequencers are then saved sequencer_l::iterator si; @@ -381,7 +394,11 @@ int ICARUS_Instance::SaveSignals( void ) { int numSignals = m_signals.size(); - ::sg_write(m_interface, INT_ID('I','S','I','G'), numSignals); + auto saved_game = m_interface->saved_game; + + saved_game->write_chunk( + INT_ID('I','S','I','G'), + numSignals); signal_m::iterator si; STL_ITERATE( si, m_signals ) @@ -395,10 +412,15 @@ int ICARUS_Instance::SaveSignals( void ) int length = strlen( name ) + 1; //Save out the string size - ::sg_write(m_interface, INT_ID('S','I','G','#'), length); + saved_game->write_chunk( + INT_ID('S','I','G','#'), + length); //Write out the string - ::sg_write_no_cast(m_interface, INT_ID('S','I','G','N'), name, length ); + saved_game->write_chunk( + INT_ID('S','I','G','N'), + name, + length ); } return true; @@ -414,7 +436,12 @@ int ICARUS_Instance::Save( void ) { //Save out a ICARUS save block header with the ICARUS version double version = ICARUS_VERSION; - ::sg_write_no_cast(m_interface, INT_ID('I','C','A','R'), version); + + auto saved_game = m_interface->saved_game; + + saved_game->write_chunk( + INT_ID('I','C','A','R'), + version); //Save out the signals if ( SaveSignals() == false ) @@ -428,7 +455,9 @@ int ICARUS_Instance::Save( void ) if ( SaveSequencers() == false ) return false; - ::sg_write_no_cast(m_interface, INT_ID('I','E','N','D'), version); + saved_game->write_chunk( + INT_ID('I','E','N','D'), + version); return true; } diff --git a/codeJK2/icarus/Sequence.cpp b/codeJK2/icarus/Sequence.cpp index 721c145786..0d6a1e88c4 100644 --- a/codeJK2/icarus/Sequence.cpp +++ b/codeJK2/icarus/Sequence.cpp @@ -343,18 +343,27 @@ int CSequence::SaveCommand( CBlock *block ) unsigned char flags; int numMembers, bID, size; CBlockMember *bm; - + + auto saved_game = m_owner->GetInterface()->saved_game; + //Save out the block ID bID = block->GetBlockID(); - ::sg_write(m_owner->GetInterface(), INT_ID('B','L','I','D'), bID); + saved_game->write_chunk( + INT_ID('B','L','I','D'), + bID); //Save out the block's flags flags = block->GetFlags(); - ::sg_write(m_owner->GetInterface(), INT_ID('B','F','L','G'), flags); + saved_game->write_chunk( + INT_ID('B','F','L','G'), + flags); //Save out the number of members to read numMembers = block->GetNumMembers(); - ::sg_write(m_owner->GetInterface(), INT_ID('B','N','U','M'), numMembers); + + saved_game->write_chunk( + INT_ID('B','N','U','M'), + numMembers); for ( int i = 0; i < numMembers; i++ ) { @@ -362,14 +371,25 @@ int CSequence::SaveCommand( CBlock *block ) //Save the block id bID = bm->GetID(); - ::sg_write(m_owner->GetInterface(), INT_ID('B','M','I','D'), bID); + + saved_game->write_chunk( + INT_ID('B','M','I','D'), + bID); //Save out the data size size = bm->GetSize(); - ::sg_write(m_owner->GetInterface(), INT_ID('B','S','I','Z'), size); + + saved_game->write_chunk( + INT_ID('B','S','I','Z'), + size); //Save out the raw data - ::sg_write_no_cast(m_owner->GetInterface(), INT_ID('B','M','E','M'), bm->GetData(), size); + auto raw_data = static_cast(bm->GetData()); + + saved_game->write_chunk( + INT_ID('B','M','E','M'), + raw_data, + size); } return true; @@ -387,32 +407,51 @@ int CSequence::Save( void ) block_l::iterator bi; int id; + auto saved_game = m_owner->GetInterface()->saved_game; + //Save the parent (by GUID) id = ( m_parent != NULL ) ? m_parent->GetID() : -1; - ::sg_write(m_owner->GetInterface(), INT_ID('S','P','I','D'), id); + + saved_game->write_chunk( + INT_ID('S','P','I','D'), + id); //Save the return (by GUID) id = ( m_return != NULL ) ? m_return->GetID() : -1; - ::sg_write(m_owner->GetInterface(), INT_ID('S','R','I','D'), id); + + saved_game->write_chunk( + INT_ID('S','R','I','D'), + id); //Save the number of children - ::sg_write(m_owner->GetInterface(), INT_ID('S','N','C','H'), m_numChildren); + saved_game->write_chunk( + INT_ID('S','N','C','H'), + m_numChildren); //Save out the children (only by GUID) STL_ITERATE( ci, m_children ) { id = (*ci)->GetID(); - ::sg_write(m_owner->GetInterface(), INT_ID('S','C','H','D'), id); + + saved_game->write_chunk( + INT_ID('S','C','H','D'), + id); } //Save flags - ::sg_write(m_owner->GetInterface(), INT_ID('S','F','L','G'), m_flags); + saved_game->write_chunk( + INT_ID('S','F','L','G'), + m_flags); //Save iterations - ::sg_write(m_owner->GetInterface(), INT_ID('S','I','T','R'), m_iterations); + saved_game->write_chunk( + INT_ID('S','I','T','R'), + m_iterations); //Save the number of commands - ::sg_write(m_owner->GetInterface(), INT_ID('S','N','M','C'), m_numCommands); + saved_game->write_chunk( + INT_ID('S','N','M','C'), + m_numCommands); //Save the commands STL_ITERATE( bi, m_commands ) diff --git a/codeJK2/icarus/Sequencer.cpp b/codeJK2/icarus/Sequencer.cpp index 457a12d655..c41b06ca18 100644 --- a/codeJK2/icarus/Sequencer.cpp +++ b/codeJK2/icarus/Sequencer.cpp @@ -2328,20 +2328,29 @@ int CSequencer::Save( void ) taskSequence_m::iterator ti; int numSequences = 0, id, numTasks; + auto saved_game = m_ie->saved_game; + //Get the number of sequences to save out numSequences = m_sequences.size(); //Save out the owner sequence - ::sg_write(m_ie, INT_ID('S','Q','R','E'), m_ownerID); + saved_game->write_chunk( + INT_ID('S','Q','R','E'), + m_ownerID); //Write out the number of sequences we need to read - ::sg_write(m_ie, INT_ID('S','Q','R','#'), numSequences); + saved_game->write_chunk( + INT_ID('S','Q','R','#'), + numSequences); //Second pass, save out all sequences, in order STL_ITERATE( si, m_sequences ) { id = (*si)->GetID(); - ::sg_write(m_ie, INT_ID('S','Q','R','I'), id); + + saved_game->write_chunk( + INT_ID('S','Q','R','I'), + id); } //Save out the taskManager @@ -2349,29 +2358,45 @@ int CSequencer::Save( void ) //Save out the task sequences mapping the name to the GUIDs numTasks = m_taskSequences.size(); - ::sg_write(m_ie, INT_ID('S','Q','T','#'), numTasks); + + saved_game->write_chunk( + INT_ID('S','Q','T','#'), + numTasks); STL_ITERATE( ti, m_taskSequences ) { //Save the task group's ID id = ((*ti).first)->GetGUID(); - ::sg_write(m_ie, INT_ID('S','T','I','D'), id); + + saved_game->write_chunk( + INT_ID('S','T','I','D'), + id); //Save the sequence's ID id = ((*ti).second)->GetID(); - ::sg_write(m_ie, INT_ID('S','S','I','D'), id); + + saved_game->write_chunk( + INT_ID('S','S','I','D'), + id); } int curGroupID = ( m_curGroup == NULL ) ? -1 : m_curGroup->GetGUID(); - ::sg_write(m_ie, INT_ID('S','Q','C','T'), curGroupID); + saved_game->write_chunk( + INT_ID('S','Q','C','T'), + curGroupID); //Output the number of commands - ::sg_write(m_ie, INT_ID('S','Q','#','C'), m_numCommands); //FIXME: This can be reconstructed + saved_game->write_chunk( + INT_ID('S','Q','#','C'), + m_numCommands); //FIXME: This can be reconstructed //Output the ID of the current sequence id = ( m_curSequence != NULL ) ? m_curSequence->GetID() : -1; - ::sg_write(m_ie, INT_ID('S','Q','C','S'), id); + + saved_game->write_chunk( + INT_ID('S','Q','C','S'), + id); return true; } diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index bd386f6f39..3310505333 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -1640,18 +1640,29 @@ int CTaskManager::SaveCommand( CBlock *block ) unsigned char flags; int numMembers, bID, size; CBlockMember *bm; - + + auto saved_game = m_owner->GetInterface()->saved_game; + //Save out the block ID bID = block->GetBlockID(); - ::sg_write(m_owner->GetInterface(), INT_ID('B','L','I','D'), bID); + + saved_game->write_chunk( + INT_ID('B','L','I','D'), + bID); //Save out the block's flags flags = block->GetFlags(); - ::sg_write(m_owner->GetInterface(), INT_ID('B','F','L','G'), flags); + + saved_game->write_chunk( + INT_ID('B','F','L','G'), + flags); //Save out the number of members to read numMembers = block->GetNumMembers(); - ::sg_write(m_owner->GetInterface(), INT_ID('B','N','U','M'), numMembers); + + saved_game->write_chunk( + INT_ID('B','N','U','M'), + numMembers); for ( int i = 0; i < numMembers; i++ ) { @@ -1659,14 +1670,25 @@ int CTaskManager::SaveCommand( CBlock *block ) //Save the block id bID = bm->GetID(); - ::sg_write(m_owner->GetInterface(), INT_ID('B','M','I','D'), bID); + + saved_game->write_chunk( + INT_ID('B','M','I','D'), + bID); //Save out the data size size = bm->GetSize(); - ::sg_write(m_owner->GetInterface(), INT_ID('B','S','I','Z'), size); + + saved_game->write_chunk( + INT_ID('B','S','I','Z'), + size); //Save out the raw data - ::sg_write_no_cast(m_owner->GetInterface(), INT_ID('B','M','E','M'), bm->GetData(), size); + auto raw_data = static_cast(bm->GetData()); + + saved_game->write_chunk( + INT_ID('B','M','E','M'), + raw_data, + size); } return true; @@ -1688,12 +1710,19 @@ void CTaskManager::Save( void ) int id, numCommands; int numWritten; + auto saved_game = m_owner->GetInterface()->saved_game; + //Save the taskmanager's GUID - ::sg_write(m_owner->GetInterface(), INT_ID('T','M','I','D'), m_GUID); //FIXME: This can be reconstructed + saved_game->write_chunk( + INT_ID('T','M','I','D'), + m_GUID); //FIXME: This can be reconstructed //Save out the number of tasks that will follow int iNumTasks = m_tasks.size(); - ::sg_write(m_owner->GetInterface(), INT_ID('T','S','K','#'), iNumTasks); + + saved_game->write_chunk( + INT_ID('T','S','K','#'), + iNumTasks); //Save out all the tasks tasks_l::iterator ti; @@ -1702,11 +1731,17 @@ void CTaskManager::Save( void ) { //Save the GUID id = (*ti)->GetGUID(); - ::sg_write(m_owner->GetInterface(), INT_ID('T','K','I','D'), id); + + saved_game->write_chunk( + INT_ID('T','K','I','D'), + id); //Save the timeStamp (FIXME: Although, this is going to be worthless if time is not consistent...) timeStamp = (*ti)->GetTimeStamp(); - ::sg_write(m_owner->GetInterface(), INT_ID('T','K','T','S'), timeStamp); + + saved_game->write_chunk( + INT_ID('T','K','T','S'), + timeStamp); //Save out the block block = (*ti)->GetBlock(); @@ -1715,14 +1750,22 @@ void CTaskManager::Save( void ) //Save out the number of task groups int numTaskGroups = m_taskGroups.size(); - ::sg_write(m_owner->GetInterface(), INT_ID('T','G','#','G'), numTaskGroups); + + saved_game->write_chunk( + INT_ID('T','G','#','G'), + numTaskGroups); + //Save out the IDs of all the task groups numWritten = 0; taskGroup_v::iterator tgi; STL_ITERATE( tgi, m_taskGroups ) { id = (*tgi)->GetGUID(); - ::sg_write(m_owner->GetInterface(), INT_ID('T','K','G','#'), id); + + saved_game->write_chunk( + INT_ID('T','K','G','#'), + id); + numWritten++; } assert (numWritten == numTaskGroups); @@ -1733,11 +1776,17 @@ void CTaskManager::Save( void ) { //Save out the parent id = ( (*tgi)->GetParent() == NULL ) ? -1 : ((*tgi)->GetParent())->GetGUID(); - ::sg_write(m_owner->GetInterface(), INT_ID('T','K','G','P'), id); + + saved_game->write_chunk( + INT_ID('T','K','G','P'), + id); //Save out the number of commands numCommands = (*tgi)->m_completedTasks.size(); - ::sg_write(m_owner->GetInterface(), INT_ID('T','G','N','C'), numCommands); + + saved_game->write_chunk( + INT_ID('T','G','N','C'), + numCommands); //Save out the command map CTaskGroup::taskCallback_m::iterator tci; @@ -1746,16 +1795,25 @@ void CTaskManager::Save( void ) { //Write out the ID id = (*tci).first; - ::sg_write(m_owner->GetInterface(), INT_ID('G','M','I','D'), id); + + saved_game->write_chunk( + INT_ID('G','M','I','D'), + id); //Write out the state of completion completed = (*tci).second; - ::sg_write(m_owner->GetInterface(), INT_ID('G','M','D','N'), completed); + + saved_game->write_chunk( + INT_ID('G','M','D','N'), + completed); } //Save out the number of completed commands id = (*tgi)->m_numCompleted; - ::sg_write(m_owner->GetInterface(), INT_ID('T','G','D','N'), id); //FIXME: This can be reconstructed + + saved_game->write_chunk( + INT_ID('T','G','D','N'), + id); //FIXME: This can be reconstructed numWritten++; } assert (numWritten == numTaskGroups); @@ -1765,7 +1823,10 @@ void CTaskManager::Save( void ) { //Save out the currently active group int curGroupID = ( m_curGroup == NULL ) ? -1 : m_curGroup->GetGUID(); - ::sg_write(m_owner->GetInterface(), INT_ID('T','G','C','G'), curGroupID); + + saved_game->write_chunk( + INT_ID('T','G','C','G'), + curGroupID); } //Save out the task group name maps @@ -1781,17 +1842,25 @@ void CTaskManager::Save( void ) int length = strlen( name ) + 1; //Save out the string size - ::sg_write(m_owner->GetInterface(), INT_ID('T','G','N','L'), length); + saved_game->write_chunk( + INT_ID('T','G','N','L'), + length); //Write out the string - ::sg_write_no_cast(m_owner->GetInterface(), INT_ID('T','G','N','S'), name, length); + saved_game->write_chunk( + INT_ID('T','G','N','S'), + name, + length); taskGroup = (*tmi).second; id = taskGroup->GetGUID(); //Write out the ID - ::sg_write(m_owner->GetInterface(), INT_ID('T','G','N','I'), id); + saved_game->write_chunk( + INT_ID('T','G','N','I'), + id); + numWritten++; } assert (numWritten == numTaskGroups); diff --git a/shared/qcommon/ojk_i_saved_game.h b/shared/qcommon/ojk_i_saved_game.h index f7970f3d14..b100fc5755 100644 --- a/shared/qcommon/ojk_i_saved_game.h +++ b/shared/qcommon/ojk_i_saved_game.h @@ -497,7 +497,7 @@ void ISavedGame::write( int src_count, InplaceTag) { - constexpr auto src_size = src_count * static_cast(sizeof(TSrc)); + const auto src_size = src_count * static_cast(sizeof(TSrc)); raw_write( src_values, From 4d284f205ff348e6d12757a86913f6ab43d9146c Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Thu, 14 Jul 2016 21:44:30 +0300 Subject: [PATCH 248/445] Support C-array of pointers --- shared/qcommon/ojk_i_saved_game.h | 44 +++++++++++++++++++++------ shared/qcommon/ojk_i_saved_game_fwd.h | 12 ++++---- 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/shared/qcommon/ojk_i_saved_game.h b/shared/qcommon/ojk_i_saved_game.h index b100fc5755..79b7e5fd3f 100644 --- a/shared/qcommon/ojk_i_saved_game.h +++ b/shared/qcommon/ojk_i_saved_game.h @@ -186,7 +186,7 @@ void ISavedGame::read( template void ISavedGame::read( - TDst*& dst_value, + TDst* dst_value, PointerTag) { static_assert( @@ -254,6 +254,7 @@ void ISavedGame::read( (std::is_arithmetic::value && !std::is_same::value && !std::is_enum::value) || + std::is_pointer::value || std::is_class::value, "Unsupported types."); @@ -272,12 +273,20 @@ void ISavedGame::read( (!std::is_same::value) && (!std::is_enum::value); + constexpr auto is_src_float_point = + std::is_floating_point::value; + + constexpr auto is_dst_float_point = + std::is_floating_point::value; + constexpr auto has_same_size = (sizeof(Src) == sizeof(TDst)); constexpr auto use_inplace = is_src_pure_numeric && is_dst_pure_numeric && + ((!is_src_float_point && !is_dst_float_point) || + (is_src_float_point && is_dst_float_point)) && has_same_size; using Tag = typename std::conditional< @@ -318,9 +327,13 @@ void ISavedGame::read( std::is_arithmetic::value, NumericTag, typename std::conditional< - std::is_class::value, - ClassTag, - void + std::is_pointer::value, + PointerTag, + typename std::conditional< + std::is_class::value, + ClassTag, + void + >::type >::type >::type; @@ -392,7 +405,7 @@ void ISavedGame::write( template void ISavedGame::write( - const TSrc*& src_value, + const TSrc* src_value, PointerTag) { using DstNumeric = typename std::conditional< @@ -429,7 +442,7 @@ void ISavedGame::write( template void ISavedGame::write( - const TSrc(&src_values)[TCount1][TCount2], + const TSrc (&src_values)[TCount1][TCount2], Array2dTag) { write( @@ -453,6 +466,7 @@ void ISavedGame::write( (std::is_arithmetic::value && !std::is_same::value && !std::is_enum::value) || + std::is_pointer::value || std::is_class::value, "Unsupported types."); @@ -471,12 +485,20 @@ void ISavedGame::write( (!std::is_same::value) && (!std::is_enum::value); + constexpr auto is_src_float_point = + std::is_floating_point::value; + + constexpr auto is_dst_float_point = + std::is_floating_point::value; + constexpr auto has_same_size = (sizeof(TSrc) == sizeof(Dst)); constexpr auto use_inplace = is_src_pure_numeric && is_dst_pure_numeric && + ((!is_src_float_point && !is_dst_float_point) || + (is_src_float_point && is_dst_float_point)) && has_same_size; using Tag = typename std::conditional< @@ -517,9 +539,13 @@ void ISavedGame::write( std::is_arithmetic::value, NumericTag, typename std::conditional< - std::is_class::value, - ClassTag, - void + std::is_pointer::value, + PointerTag, + typename std::conditional< + std::is_class::value, + ClassTag, + void + >::type >::type >::type; diff --git a/shared/qcommon/ojk_i_saved_game_fwd.h b/shared/qcommon/ojk_i_saved_game_fwd.h index 35e59d9070..818ce7d1c5 100644 --- a/shared/qcommon/ojk_i_saved_game_fwd.h +++ b/shared/qcommon/ojk_i_saved_game_fwd.h @@ -147,7 +147,7 @@ class ISavedGame template void read( - TDst*& dst_value, + TDst* dst_value, PointerTag); template @@ -157,12 +157,12 @@ class ISavedGame template void read( - TDst(&dst_values)[TCount], + TDst (&dst_values)[TCount], Array1dTag); template void read( - TDst(&dst_values)[TCount1][TCount2], + TDst (&dst_values)[TCount1][TCount2], Array2dTag); @@ -186,7 +186,7 @@ class ISavedGame template void write( - const TSrc*& src_value, + const TSrc* src_value, PointerTag); template @@ -196,12 +196,12 @@ class ISavedGame template void write( - const TSrc(&src_values)[TCount], + const TSrc (&src_values)[TCount], Array1dTag); template void write( - const TSrc(&src_values)[TCount1][TCount2], + const TSrc (&src_values)[TCount1][TCount2], Array2dTag); From 553a9893908d8f9479d7dfb959b5021727edecb2 Mon Sep 17 00:00:00 2001 From: dusty22 Date: Fri, 15 Jul 2016 09:30:29 -0400 Subject: [PATCH 249/445] WIP on getting savegame screenshots working both in the UI and game code --- code/cgame/cg_info.cpp | 45 ++++++++++++++++++++++++++++++--- code/client/cl_scrn.cpp | 4 +-- code/client/cl_ui.cpp | 4 +-- code/qcommon/common.cpp | 4 +-- code/qcommon/qcommon.h | 4 +-- code/rd-common/tr_common.h | 4 +-- code/rd-common/tr_image_jpg.cpp | 4 +-- code/rd-common/tr_public.h | 4 +-- code/server/sv_ccmds.cpp | 16 ++++++------ code/ui/ui_main.cpp | 44 +++++++++++++++++++++++++++++--- 10 files changed, 103 insertions(+), 30 deletions(-) diff --git a/code/cgame/cg_info.cpp b/code/cgame/cg_info.cpp index 17abcfee02..a723792553 100644 --- a/code/cgame/cg_info.cpp +++ b/code/cgame/cg_info.cpp @@ -55,6 +55,8 @@ int obj_graphics[MAX_OBJ_GRAPHICS]; qboolean CG_ForcePower_Valid(int forceKnownBits, int index); +//extern vmCvar_t ui_loadScreen_iconScaling; + /* ==================== ObjectivePrint_Line @@ -468,6 +470,19 @@ static int CG_DrawLoadWeaponsPrintRow( const char *itemName, int weaponsBits,int iconSize = 60; pad = 12; + /* + if (ui_loadScreen_iconScaling.integer) + { + iconSize = height; + pad = width; + } + else + { + iconSize = 60; + pad = 12; + } + */ + // calculate placement of weapon icons holdX = x + (width - ((iconSize*rowIconCnt) + (pad * (rowIconCnt-1))))/2; @@ -714,7 +729,7 @@ CG_DrawLoadingScreen Load screen displays the map pic, the mission briefing and weapons/force powers ==================== */ -static void CG_DrawLoadingScreen( qhandle_t levelshot ,const char *mapName) +static void CG_DrawLoadingScreen( qhandle_t levelshot, qhandle_t savepic, const char *mapName) { int xPos,yPos,width,height; vec4_t color; @@ -768,6 +783,23 @@ static void CG_DrawLoadingScreen( qhandle_t levelshot ,const char *mapName) CG_DrawPic( xPos, yPos, width, height, levelshot ); } } + + // Print savegame pic + if (cgi_UI_GetMenuItemInfo( + "loadScreen", + "savepic", + &xPos, + &yPos, + &width, + &height, + color, + &background)) + { + { + cgi_R_SetColor(color); + CG_DrawPic(xPos, yPos, width, height, savepic); + } + } // Get player weapons and force power info CG_GetLoadScreenInfo(&weapons,&forcepowers); @@ -798,8 +830,11 @@ void CG_DrawInformation( void ) { // draw the dialog background const char *info = CG_ConfigString( CS_SERVERINFO ); const char *s = Info_ValueForKey( info, "mapname" ); - - qhandle_t levelshot; + char t[1024]; + gi.Cvar_VariableStringBuffer(sCVARNAME_PLAYERSAVE, t, sizeof(t)); //better way to get savegame name? + + qhandle_t levelshot; //the map picture + qhandle_t savepic; //the screenshot of the player's game extern SavedGameJustLoaded_e g_eSavedGameJustLoaded; // hack! (hey, it's the last week of coding, ok? // if ( g_eSavedGameJustLoaded == eFULL ) @@ -820,6 +855,8 @@ void CG_DrawInformation( void ) { } } + savepic = cgi_R_RegisterShaderNoMip(va("saves/screenshots/%s", t)); + if ( g_eSavedGameJustLoaded != eFULL && !strcmp(s,"yavin1") )//special case for first map! { char text[1024]={0}; @@ -835,7 +872,7 @@ void CG_DrawInformation( void ) { } else { - CG_DrawLoadingScreen(levelshot, s); + CG_DrawLoadingScreen(levelshot, savepic, s); cgi_UI_Menu_Paint( cgi_UI_GetMenuByName( "loadscreen" ), qtrue ); //cgi_UI_MenuPaintAll(); } diff --git a/code/client/cl_scrn.cpp b/code/client/cl_scrn.cpp index 6a797181c6..0e03a1f0b6 100644 --- a/code/client/cl_scrn.cpp +++ b/code/client/cl_scrn.cpp @@ -582,7 +582,7 @@ void SCR_SetScreenshot(const byte *pbData, int w, int h) } -#ifdef JK2_MODE +//#ifdef JK2_MODE // This is just a client-side wrapper for the function RE_TempRawImage_ReadFromFile() in the renderer code... // @@ -597,6 +597,6 @@ void SCR_TempRawImage_CleanUp() { re.TempRawImage_CleanUp(); } -#endif +//#endif diff --git a/code/client/cl_ui.cpp b/code/client/cl_ui.cpp index 83716d29bd..cfda98fd64 100644 --- a/code/client/cl_ui.cpp +++ b/code/client/cl_ui.cpp @@ -32,9 +32,9 @@ along with this program; if not, see . intptr_t CL_UISystemCalls( intptr_t *args ); //prototypes -#ifdef JK2_MODE +//#ifdef JK2_MODE extern qboolean SG_GetSaveImage( const char *psPathlessBaseName, void *pvAddress ); -#endif +//#endif extern int SG_GetSaveGameComment(const char *psPathlessBaseName, char *sComment, char *sMapName); extern qboolean SG_GameAllowedToSaveHere(qboolean inCamera); extern void SG_StoreSaveGameComment(const char *sComment); diff --git a/code/qcommon/common.cpp b/code/qcommon/common.cpp index 0a23d628ee..d77691f27c 100644 --- a/code/qcommon/common.cpp +++ b/code/qcommon/common.cpp @@ -247,9 +247,9 @@ do the apropriate things. ============= */ void SG_Shutdown(); -#ifdef JK2_MODE +//#ifdef JK2_MODE extern void SCR_UnprecacheScreenshot(); -#endif +//#endif void NORETURN QDECL Com_Error( int code, const char *fmt, ... ) { va_list argptr; static int lastErrorTime; diff --git a/code/qcommon/qcommon.h b/code/qcommon/qcommon.h index 30e83125cc..4513e64164 100644 --- a/code/qcommon/qcommon.h +++ b/code/qcommon/qcommon.h @@ -782,11 +782,11 @@ qboolean UI_GameCommand( void ); byte* SCR_GetScreenshot(qboolean *qValid); -#ifdef JK2_MODE +//#ifdef JK2_MODE void SCR_SetScreenshot(const byte *pbData, int w, int h); byte* SCR_TempRawImage_ReadFromFile(const char *psLocalFilename, int *piWidth, int *piHeight, byte *pbReSampleBuffer, qboolean qbVertFlip); void SCR_TempRawImage_CleanUp(); -#endif +//#endif inline int Round(float value) { diff --git a/code/rd-common/tr_common.h b/code/rd-common/tr_common.h index becdf10e08..3ec5ed8c31 100644 --- a/code/rd-common/tr_common.h +++ b/code/rd-common/tr_common.h @@ -68,10 +68,10 @@ void LoadJPG( const char *filename, byte **pic, int *width, int *height ); // Load raw image data from PNG image. void LoadPNG( const char *filename, byte **data, int *width, int *height ); -#ifdef JK2_MODE +//#ifdef JK2_MODE //Load raw image data from JPEG input. void LoadJPGFromBuffer( byte *inputBuffer, size_t len, byte **pic, int *width, int *height ); -#endif +//#endif /* ================================================================================ diff --git a/code/rd-common/tr_image_jpg.cpp b/code/rd-common/tr_image_jpg.cpp index 4bc19ed8ea..d01c0944b1 100644 --- a/code/rd-common/tr_image_jpg.cpp +++ b/code/rd-common/tr_image_jpg.cpp @@ -226,7 +226,7 @@ void LoadJPG( const char *filename, unsigned char **pic, int *width, int *height /* And we're done! */ } -#ifdef JK2_MODE +//#ifdef JK2_MODE void LoadJPGFromBuffer( byte *inputBuffer, size_t len, unsigned char **pic, int *width, int *height ) { /* This struct contains the JPEG decompression parameters and pointers to * working space (which is allocated as needed by the JPEG library). @@ -376,7 +376,7 @@ void LoadJPGFromBuffer( byte *inputBuffer, size_t len, unsigned char **pic, int /* And we're done! */ } -#endif +//#endif /* Expanded data destination object for stdio output */ diff --git a/code/rd-common/tr_public.h b/code/rd-common/tr_public.h index 6f353a18b1..9525a45412 100644 --- a/code/rd-common/tr_public.h +++ b/code/rd-common/tr_public.h @@ -208,10 +208,10 @@ typedef struct { // for use with save-games mainly... void (*GetScreenShot)(byte *data, int w, int h); -#ifdef JK2_MODE +//#ifdef JK2_MODE size_t (*SaveJPGToBuffer)(byte *buffer, size_t bufSize, int quality, int image_width, int image_height, byte *image_buffer, int padding ); void (*LoadJPGFromBuffer)( byte *inputBuffer, size_t len, byte **pic, int *width, int *height ); -#endif +//#endif // this is so you can get access to raw pixels from a graphics format (TGA/JPG/BMP etc), // currently only the save game uses it (to make raw shots for the autosaves) diff --git a/code/server/sv_ccmds.cpp b/code/server/sv_ccmds.cpp index 67b079ae02..90ca4d9788 100644 --- a/code/server/sv_ccmds.cpp +++ b/code/server/sv_ccmds.cpp @@ -227,9 +227,9 @@ static void SV_MapTransition_f(void) { const char *spawntarget; -#ifdef JK2_MODE +//#ifdef JK2_MODE SCR_PrecacheScreenshot(); -#endif +//#endif SV_Player_EndOfLevelSave(); spawntarget = Cmd_Argv(2); @@ -253,18 +253,18 @@ Restart the server on a different map, but clears a cvar so that typing "map bla player weapons/ammo/etc from the previous level that you haven't really exited (ie ignores KEEP_PREV on spawn points) ================== */ -#ifdef JK2_MODE +//#ifdef JK2_MODE extern void SCR_UnprecacheScreenshot(); -#endif +//#endif static void SV_Map_f( void ) { Cvar_Set( sCVARNAME_PLAYERSAVE, ""); Cvar_Set( "spawntarget", "" ); Cvar_Set("tier_storyinfo", "0"); Cvar_Set("tiers_complete", ""); -#ifdef JK2_MODE +//#ifdef JK2_MODE SCR_UnprecacheScreenshot(); -#endif +//#endif ForceReload_e eForceReload = eForceReload_NOTHING; // default for normal load @@ -312,9 +312,9 @@ void SV_LoadTransition_f(void) qbLoadTransition = qtrue; -#ifdef JK2_MODE +//#ifdef JK2_MODE SCR_PrecacheScreenshot(); -#endif +//#endif SV_Player_EndOfLevelSave(); //Save the full current state of the current map so we can return to it later diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 32c888bad5..5a42010501 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -378,6 +378,8 @@ vmCvar_t ui_char_color_green; vmCvar_t ui_char_color_blue; vmCvar_t ui_PrecacheModels; +vmCvar_t ui_saveGameUseScreenshot; + static cvarTable_t cvarTable[] = { { &ui_menuFiles, "ui_menuFiles", "ui/menus.txt", CVAR_ARCHIVE }, @@ -405,6 +407,7 @@ static cvarTable_t cvarTable[] = { &ui_char_color_blue, "ui_char_color_blue", "", 0}, { &ui_PrecacheModels, "ui_PrecacheModels", "1", CVAR_ARCHIVE}, + { &ui_PrecacheModels, "ui_saveGameUseScreenshot", "0", CVAR_ARCHIVE }, }; #define FP_UPDATED_NONE -1 @@ -3821,7 +3824,7 @@ static void UI_OwnerDraw(float x, float y, float w, float h, float text_x, float case UI_ALLMAPS_SELECTION://saved game thumbnail int levelshot; - levelshot = ui.R_RegisterShaderNoMip( va( "levelshots/%s", s_savedata[s_savegame.currentLine].currentSaveFileMap ) ); + #ifdef JK2_MODE if (screenShotBuf[0]) { @@ -3829,14 +3832,47 @@ static void UI_OwnerDraw(float x, float y, float w, float h, float text_x, float } else #endif - if (levelshot) + + if (ui_saveGameUseScreenshot.integer) { - ui.R_DrawStretchPic( x, y, w, h, 0, 0, 1, 1, levelshot ); + if (s_savedata[s_savegame.currentLine].currentSaveFileName) + { + //To avoid error messages when these screenshots are missing + fileHandle_t fp; + ui.FS_FOpenFile(va("saves/screenshots/%s.jpg", s_savedata[s_savegame.currentLine].currentSaveFileName), &fp, FS_READ); + if (fp) + { + ui.FS_FCloseFile(fp); + levelshot = ui.R_RegisterShaderNoMip(va("saves/screenshots/%s", s_savedata[s_savegame.currentLine].currentSaveFileName)); + } + } + if (!levelshot) //no screenshot, just use levelshot + { + levelshot = ui.R_RegisterShaderNoMip(va("levelshots/%s", s_savedata[s_savegame.currentLine].currentSaveFileMap)); + } + if (levelshot) + { + ui.R_DrawStretchPic(x, y, w, h, 0, 0, 1, 1, levelshot); + } + else + { + UI_DrawHandlePic(x, y, w, h, uis.menuBackShader); + } } else { - UI_DrawHandlePic(x, y, w, h, uis.menuBackShader); + levelshot = ui.R_RegisterShaderNoMip(va("levelshots/%s", s_savedata[s_savegame.currentLine].currentSaveFileMap)); + + if (levelshot) + { + ui.R_DrawStretchPic(x, y, w, h, 0, 0, 1, 1, levelshot); + } + else + { + UI_DrawHandlePic(x, y, w, h, uis.menuBackShader); + } } + ui.R_Font_DrawString( x, // int ox y+h, // int oy From 16c0d6d5058915605cd4d317c72acaf9cf087a02 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Fri, 15 Jul 2016 20:53:23 +0300 Subject: [PATCH 250/445] Remove saved game wrappers --- code/CMakeLists.txt | 3 - code/cgame/FxScheduler.cpp | 29 +- code/cgame/FxScheduler.h | 20 +- code/cgame/cg_main.cpp | 1 - code/game/CMakeLists.txt | 3 - code/game/G_Timer.cpp | 1 - code/game/Q3_Interface.cpp | 1 - code/game/ai.cpp | 94 +- code/game/ai.h | 49 +- code/game/b_public.cpp | 530 +++--- code/game/b_public.h | 162 +- code/game/bg_public.cpp | 54 +- code/game/bg_public.h | 39 +- code/game/g_local.cpp | 146 +- code/game/g_local.h | 75 +- code/game/g_main.cpp | 1 - code/game/g_objectives.cpp | 1 - code/game/g_public.h | 1 - code/game/g_roff.cpp | 1 - code/game/g_savegame.cpp | 99 +- code/game/g_shared.cpp | 1458 +++++++-------- code/game/g_shared.h | 491 +---- code/game/g_vehicles.cpp | 235 ++- code/game/g_vehicles.h | 81 +- code/game/ghoul2_shared.h | 220 +-- code/icarus/IcarusImplementation.cpp | 1 - code/qcommon/cm_load.cpp | 1 - code/qcommon/q_shared.cpp | 1315 +++++++------ code/qcommon/q_shared.h | 472 +---- code/rd-common/ghoul2_shared.cpp | 424 +++-- code/rd-common/mdx_format.cpp | 10 +- code/rd-common/mdx_format.h | 18 +- code/rd-vanilla/CMakeLists.txt | 3 - code/rd-vanilla/G2_misc.cpp | 162 +- code/server/sv_savegame.cpp | 1 - codeJK2/cgame/cg_main.cpp | 1 - codeJK2/game/CMakeLists.txt | 4 +- codeJK2/game/G_Timer.cpp | 1 - codeJK2/game/Q3_Registers.cpp | 1 - codeJK2/game/ai.cpp | 94 +- codeJK2/game/ai.h | 49 +- codeJK2/game/anims.cpp | 24 + codeJK2/game/anims.h | 33 +- codeJK2/game/b_public.cpp | 478 ++--- codeJK2/game/b_public.h | 145 +- codeJK2/game/bg_public.cpp | 46 +- codeJK2/game/bg_public.h | 37 +- codeJK2/game/g_local.cpp | 114 +- codeJK2/game/g_local.h | 54 +- codeJK2/game/g_main.cpp | 1 - codeJK2/game/g_objectives.cpp | 1 - codeJK2/game/g_roff.cpp | 1 - codeJK2/game/g_savegame.cpp | 96 +- codeJK2/game/g_shared.cpp | 1410 +++++++------- codeJK2/game/g_shared.h | 491 +---- codeJK2/icarus/Instance.cpp | 1 - codeJK2/icarus/Sequence.cpp | 1 - codeJK2/icarus/Sequencer.cpp | 1 - codeJK2/icarus/TaskManager.cpp | 1 - shared/qcommon/ojk_saved_game.cpp | 1 + shared/qcommon/ojk_sg_wrappers.h | 2269 ----------------------- shared/qcommon/ojk_sg_wrappers_fwd.h | 122 -- shared/qcommon/ojk_sg_wrappers_shared.h | 65 - 63 files changed, 3666 insertions(+), 8078 deletions(-) create mode 100644 codeJK2/game/anims.cpp delete mode 100644 shared/qcommon/ojk_sg_wrappers.h delete mode 100644 shared/qcommon/ojk_sg_wrappers_fwd.h delete mode 100644 shared/qcommon/ojk_sg_wrappers_shared.h diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index a0757faf29..99cea2dbf9 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -174,9 +174,6 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SPDir}/qcommon/timing.h" "${SPDir}/qcommon/MiniHeap.h" - "${SharedDir}/qcommon/ojk_sg_wrappers.h" - "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" - "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" "${SharedDir}/qcommon/ojk_exception.h" "${SharedDir}/qcommon/ojk_exception.cpp" "${SharedDir}/qcommon/ojk_i_saved_game.h" diff --git a/code/cgame/FxScheduler.cpp b/code/cgame/FxScheduler.cpp index a2835b1a88..ef4c0d441d 100644 --- a/code/cgame/FxScheduler.cpp +++ b/code/cgame/FxScheduler.cpp @@ -41,7 +41,6 @@ along with this program; if not, see . #include "qcommon/safe/string.h" #include -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" CFxScheduler theFxScheduler; @@ -1928,23 +1927,23 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, const vec3_t origin, ve void SLoopedEffect::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(mId, dst.mId); - ::sg_export(mBoltInfo, dst.mBoltInfo); - ::sg_export(mNextTime, dst.mNextTime); - ::sg_export(mLoopStopTime, dst.mLoopStopTime); - ::sg_export(mPortalEffect, dst.mPortalEffect); - ::sg_export(mIsRelative, dst.mIsRelative); + saved_game->write(mId); + saved_game->write(mBoltInfo); + saved_game->write(mNextTime); + saved_game->write(mLoopStopTime); + saved_game->write(mPortalEffect); + saved_game->write(mIsRelative); } void SLoopedEffect::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.mId, mId); - ::sg_import(src.mBoltInfo, mBoltInfo); - ::sg_import(src.mNextTime, mNextTime); - ::sg_import(src.mLoopStopTime, mLoopStopTime); - ::sg_import(src.mPortalEffect, mPortalEffect); - ::sg_import(src.mIsRelative, mIsRelative); + saved_game->read(mId); + saved_game->read(mBoltInfo); + saved_game->read(mNextTime); + saved_game->read(mLoopStopTime); + saved_game->read(mPortalEffect); + saved_game->read(mIsRelative); } diff --git a/code/cgame/FxScheduler.h b/code/cgame/FxScheduler.h index cfae83f22a..6a9349c001 100644 --- a/code/cgame/FxScheduler.h +++ b/code/cgame/FxScheduler.h @@ -401,24 +401,8 @@ struct SEffectTemplate #define MAX_LOOPED_FX 32 // We hold a looped effect here -#pragma pack(push, 4) -class SgSLoopedEffect -{ -public: - int32_t mId; - int32_t mBoltInfo; - int32_t mNextTime; - int32_t mLoopStopTime; - uint8_t mPortalEffect; - uint8_t mIsRelative; -}; // SgSLoopedEffect -#pragma pack(pop) - struct SLoopedEffect { - using SgType = SgSLoopedEffect; - - int mId; // effect id int mBoltInfo; // used to determine which bolt on the ghoul2 model we should be attaching this effect to int mNextTime; //time to render again @@ -428,10 +412,10 @@ struct SLoopedEffect void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); }; class CFxScheduler diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 74aae7a913..3c335baca1 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -28,7 +28,6 @@ along with this program; if not, see . #include "g_local.h" #include "../qcommon/sstring.h" -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index a1cf3bf2a2..475d3e81a4 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -265,9 +265,6 @@ set(SPGameCommonFiles "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" - "${SharedDir}/qcommon/ojk_sg_wrappers.h" - "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" - "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" "${SharedDir}/qcommon/ojk_i_saved_game.h" "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index a35f13a4ce..b835174fd0 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -22,7 +22,6 @@ along with this program; if not, see . #include "g_local.h" #include "../Rufl/hstring.h" -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" #define MAX_GTIMERS 16384 diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index f109b105be..4ec336fa94 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -40,7 +40,6 @@ along with this program; if not, see . #include "wp_saber.h" #include "g_vehicles.h" #include "g_navigator.h" -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" extern cvar_t *com_buildScript; diff --git a/code/game/ai.cpp b/code/game/ai.cpp index bb93bc5b70..ea5193cd1d 100644 --- a/code/game/ai.cpp +++ b/code/game/ai.cpp @@ -1,66 +1,66 @@ #include "../cgame/cg_local.h" #include "ai.h" -#include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_i_saved_game.h" void AIGroupMember_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(number, dst.number); - ::sg_export(waypoint, dst.waypoint); - ::sg_export(pathCostToEnemy, dst.pathCostToEnemy); - ::sg_export(closestBuddy, dst.closestBuddy); + saved_game->write(number); + saved_game->write(waypoint); + saved_game->write(pathCostToEnemy); + saved_game->write(closestBuddy); } void AIGroupMember_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.number, number); - ::sg_import(src.waypoint, waypoint); - ::sg_import(src.pathCostToEnemy, pathCostToEnemy); - ::sg_import(src.closestBuddy, closestBuddy); + saved_game->read(number); + saved_game->read(waypoint); + saved_game->read(pathCostToEnemy); + saved_game->read(closestBuddy); } void AIGroupInfo_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(numGroup, dst.numGroup); - ::sg_export(processed, dst.processed); - ::sg_export(team, dst.team); - ::sg_export(enemy, dst.enemy); - ::sg_export(enemyWP, dst.enemyWP); - ::sg_export(speechDebounceTime, dst.speechDebounceTime); - ::sg_export(lastClearShotTime, dst.lastClearShotTime); - ::sg_export(lastSeenEnemyTime, dst.lastSeenEnemyTime); - ::sg_export(morale, dst.morale); - ::sg_export(moraleAdjust, dst.moraleAdjust); - ::sg_export(moraleDebounce, dst.moraleDebounce); - ::sg_export(memberValidateTime, dst.memberValidateTime); - ::sg_export(activeMemberNum, dst.activeMemberNum); - ::sg_export(commander, dst.commander); - ::sg_export(enemyLastSeenPos, dst.enemyLastSeenPos); - ::sg_export(numState, dst.numState); - ::sg_export(member, dst.member); + saved_game->write(numGroup); + saved_game->write(processed); + saved_game->write(team); + saved_game->write(enemy); + saved_game->write(enemyWP); + saved_game->write(speechDebounceTime); + saved_game->write(lastClearShotTime); + saved_game->write(lastSeenEnemyTime); + saved_game->write(morale); + saved_game->write(moraleAdjust); + saved_game->write(moraleDebounce); + saved_game->write(memberValidateTime); + saved_game->write(activeMemberNum); + saved_game->write(commander); + saved_game->write(enemyLastSeenPos); + saved_game->write(numState); + saved_game->write<>(member); } void AIGroupInfo_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.numGroup, numGroup); - ::sg_import(src.processed, processed); - ::sg_import(src.team, team); - ::sg_import(src.enemy, enemy); - ::sg_import(src.enemyWP, enemyWP); - ::sg_import(src.speechDebounceTime, speechDebounceTime); - ::sg_import(src.lastClearShotTime, lastClearShotTime); - ::sg_import(src.lastSeenEnemyTime, lastSeenEnemyTime); - ::sg_import(src.morale, morale); - ::sg_import(src.moraleAdjust, moraleAdjust); - ::sg_import(src.moraleDebounce, moraleDebounce); - ::sg_import(src.memberValidateTime, memberValidateTime); - ::sg_import(src.activeMemberNum, activeMemberNum); - ::sg_import(src.commander, commander); - ::sg_import(src.enemyLastSeenPos, enemyLastSeenPos); - ::sg_import(src.numState, numState); - ::sg_import(src.member, member); + saved_game->read(numGroup); + saved_game->read(processed); + saved_game->read(team); + saved_game->read(enemy); + saved_game->read(enemyWP); + saved_game->read(speechDebounceTime); + saved_game->read(lastClearShotTime); + saved_game->read(lastSeenEnemyTime); + saved_game->read(morale); + saved_game->read(moraleAdjust); + saved_game->read(moraleDebounce); + saved_game->read(memberValidateTime); + saved_game->read(activeMemberNum); + saved_game->read(commander); + saved_game->read(enemyLastSeenPos); + saved_game->read(numState); + saved_game->read<>(member); } diff --git a/code/game/ai.h b/code/game/ai.h index 0749bdbe62..780feffc99 100644 --- a/code/game/ai.h +++ b/code/game/ai.h @@ -115,22 +115,8 @@ void NPC_BSAnimal_Default( void ); //Group AI #define MAX_FRAME_GROUPS 32 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgAiGroupMember -{ -public: - int32_t number; - int32_t waypoint; - int32_t pathCostToEnemy; - int32_t closestBuddy; -}; // SgAiGroupMember -#pragma pack(pop) - typedef struct AIGroupMember_s { - using SgType = SgAiGroupMember; - - int number; int waypoint; int pathCostToEnemy; @@ -138,43 +124,16 @@ typedef struct AIGroupMember_s void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } AIGroupMember_t; #define MAX_GROUP_MEMBERS 32 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgAiGroupInfo -{ -public: - int32_t numGroup; - int32_t processed; - int32_t team; - int32_t enemy; - int32_t enemyWP; - int32_t speechDebounceTime; - int32_t lastClearShotTime; - int32_t lastSeenEnemyTime; - int32_t morale; - int32_t moraleAdjust; - int32_t moraleDebounce; - int32_t memberValidateTime; - int32_t activeMemberNum; - int32_t commander; - SgVec3 enemyLastSeenPos; - SgArray numState; - SgArray member; -}; // SgAiGroupInfo -#pragma pack(pop) - typedef struct AIGroupInfo_s { - using SgType = SgAiGroupInfo; - - int numGroup; qboolean processed; team_t team; @@ -195,10 +154,10 @@ typedef struct AIGroupInfo_s void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } AIGroupInfo_t; diff --git a/code/game/b_public.cpp b/code/game/b_public.cpp index a7cf63f414..8a4a78a9b4 100644 --- a/code/game/b_public.cpp +++ b/code/game/b_public.cpp @@ -1,293 +1,293 @@ #include "b_local.h" #include "b_public.h" -#include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_i_saved_game.h" void gNPCstats_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(aggression, dst.aggression); - ::sg_export(aim, dst.aim); - ::sg_export(earshot, dst.earshot); - ::sg_export(evasion, dst.evasion); - ::sg_export(hfov, dst.hfov); - ::sg_export(intelligence, dst.intelligence); - ::sg_export(move, dst.move); - ::sg_export(reactions, dst.reactions); - ::sg_export(shootDistance, dst.shootDistance); - ::sg_export(vfov, dst.vfov); - ::sg_export(vigilance, dst.vigilance); - ::sg_export(visrange, dst.visrange); - ::sg_export(runSpeed, dst.runSpeed); - ::sg_export(walkSpeed, dst.walkSpeed); - ::sg_export(yawSpeed, dst.yawSpeed); - ::sg_export(health, dst.health); - ::sg_export(acceleration, dst.acceleration); - ::sg_export(sex, dst.sex); + saved_game->write(aggression); + saved_game->write(aim); + saved_game->write(earshot); + saved_game->write(evasion); + saved_game->write(hfov); + saved_game->write(intelligence); + saved_game->write(move); + saved_game->write(reactions); + saved_game->write(shootDistance); + saved_game->write(vfov); + saved_game->write(vigilance); + saved_game->write(visrange); + saved_game->write(runSpeed); + saved_game->write(walkSpeed); + saved_game->write(yawSpeed); + saved_game->write(health); + saved_game->write(acceleration); + saved_game->write(sex); } void gNPCstats_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.aggression, aggression); - ::sg_import(src.aim, aim); - ::sg_import(src.earshot, earshot); - ::sg_import(src.evasion, evasion); - ::sg_import(src.hfov, hfov); - ::sg_import(src.intelligence, intelligence); - ::sg_import(src.move, move); - ::sg_import(src.reactions, reactions); - ::sg_import(src.shootDistance, shootDistance); - ::sg_import(src.vfov, vfov); - ::sg_import(src.vigilance, vigilance); - ::sg_import(src.visrange, visrange); - ::sg_import(src.runSpeed, runSpeed); - ::sg_import(src.walkSpeed, walkSpeed); - ::sg_import(src.yawSpeed, yawSpeed); - ::sg_import(src.health, health); - ::sg_import(src.acceleration, acceleration); - ::sg_import(src.sex, sex); + saved_game->read(aggression); + saved_game->read(aim); + saved_game->read(earshot); + saved_game->read(evasion); + saved_game->read(hfov); + saved_game->read(intelligence); + saved_game->read(move); + saved_game->read(reactions); + saved_game->read(shootDistance); + saved_game->read(vfov); + saved_game->read(vigilance); + saved_game->read(visrange); + saved_game->read(runSpeed); + saved_game->read(walkSpeed); + saved_game->read(yawSpeed); + saved_game->read(health); + saved_game->read(acceleration); + saved_game->read(sex); } void gNPC_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(timeOfDeath, dst.timeOfDeath); - ::sg_export(touchedByPlayer, dst.touchedByPlayer); - ::sg_export(enemyLastVisibility, dst.enemyLastVisibility); - ::sg_export(aimTime, dst.aimTime); - ::sg_export(desiredYaw, dst.desiredYaw); - ::sg_export(desiredPitch, dst.desiredPitch); - ::sg_export(lockedDesiredYaw, dst.lockedDesiredYaw); - ::sg_export(lockedDesiredPitch, dst.lockedDesiredPitch); - ::sg_export(aimingBeam, dst.aimingBeam); - ::sg_export(enemyLastSeenLocation, dst.enemyLastSeenLocation); - ::sg_export(enemyLastSeenTime, dst.enemyLastSeenTime); - ::sg_export(enemyLastHeardLocation, dst.enemyLastHeardLocation); - ::sg_export(enemyLastHeardTime, dst.enemyLastHeardTime); - ::sg_export(lastAlertID, dst.lastAlertID); - ::sg_export(eFlags, dst.eFlags); - ::sg_export(aiFlags, dst.aiFlags); - ::sg_export(currentAmmo, dst.currentAmmo); - ::sg_export(shotTime, dst.shotTime); - ::sg_export(burstCount, dst.burstCount); - ::sg_export(burstMin, dst.burstMin); + saved_game->write(timeOfDeath); + saved_game->write(touchedByPlayer); + saved_game->write(enemyLastVisibility); + saved_game->write(aimTime); + saved_game->write(desiredYaw); + saved_game->write(desiredPitch); + saved_game->write(lockedDesiredYaw); + saved_game->write(lockedDesiredPitch); + saved_game->write(aimingBeam); + saved_game->write(enemyLastSeenLocation); + saved_game->write(enemyLastSeenTime); + saved_game->write(enemyLastHeardLocation); + saved_game->write(enemyLastHeardTime); + saved_game->write(lastAlertID); + saved_game->write(eFlags); + saved_game->write(aiFlags); + saved_game->write(currentAmmo); + saved_game->write(shotTime); + saved_game->write(burstCount); + saved_game->write(burstMin); #ifdef BASE_SAVE_COMPAT - ::sg_export(burstMean, dst.burstMean); + saved_game->write(burstMean); #endif - ::sg_export(burstMax, dst.burstMax); - ::sg_export(burstSpacing, dst.burstSpacing); - ::sg_export(attackHold, dst.attackHold); - ::sg_export(attackHoldTime, dst.attackHoldTime); - ::sg_export(shootAngles, dst.shootAngles); - ::sg_export(rank, dst.rank); - ::sg_export(behaviorState, dst.behaviorState); - ::sg_export(defaultBehavior, dst.defaultBehavior); - ::sg_export(tempBehavior, dst.tempBehavior); - ::sg_export(ignorePain, dst.ignorePain); - ::sg_export(duckDebounceTime, dst.duckDebounceTime); - ::sg_export(walkDebounceTime, dst.walkDebounceTime); - ::sg_export(enemyCheckDebounceTime, dst.enemyCheckDebounceTime); - ::sg_export(investigateDebounceTime, dst.investigateDebounceTime); - ::sg_export(investigateCount, dst.investigateCount); - ::sg_export(investigateGoal, dst.investigateGoal); - ::sg_export(investigateSoundDebounceTime, dst.investigateSoundDebounceTime); - ::sg_export(greetingDebounceTime, dst.greetingDebounceTime); - ::sg_export(eventOwner, dst.eventOwner); - ::sg_export(coverTarg, dst.coverTarg); - ::sg_export(jumpState, dst.jumpState); - ::sg_export(followDist, dst.followDist); - ::sg_export(tempGoal, dst.tempGoal); - ::sg_export(goalEntity, dst.goalEntity); - ::sg_export(lastGoalEntity, dst.lastGoalEntity); - ::sg_export(eventualGoal, dst.eventualGoal); - ::sg_export(captureGoal, dst.captureGoal); - ::sg_export(defendEnt, dst.defendEnt); - ::sg_export(greetEnt, dst.greetEnt); - ::sg_export(goalTime, dst.goalTime); - ::sg_export(straightToGoal, dst.straightToGoal); - ::sg_export(distToGoal, dst.distToGoal); - ::sg_export(navTime, dst.navTime); - ::sg_export(blockingEntNum, dst.blockingEntNum); - ::sg_export(blockedSpeechDebounceTime, dst.blockedSpeechDebounceTime); - ::sg_export(homeWp, dst.homeWp); - ::sg_export(avoidSide, dst.avoidSide); - ::sg_export(leaderAvoidSide, dst.leaderAvoidSide); - ::sg_export(lastAvoidSteerSide, dst.lastAvoidSteerSide); - ::sg_export(lastAvoidSteerSideDebouncer, dst.lastAvoidSteerSideDebouncer); - ::sg_export(group, dst.group); - ::sg_export(troop, dst.troop); - ::sg_export(lastPathAngles, dst.lastPathAngles); - ::sg_export(stats, dst.stats); - ::sg_export(aimErrorDebounceTime, dst.aimErrorDebounceTime); - ::sg_export(lastAimErrorYaw, dst.lastAimErrorYaw); - ::sg_export(lastAimErrorPitch, dst.lastAimErrorPitch); - ::sg_export(aimOfs, dst.aimOfs); - ::sg_export(currentAim, dst.currentAim); - ::sg_export(currentAggression, dst.currentAggression); - ::sg_export(scriptFlags, dst.scriptFlags); - ::sg_export(desiredSpeed, dst.desiredSpeed); - ::sg_export(currentSpeed, dst.currentSpeed); - ::sg_export(last_forwardmove, dst.last_forwardmove); - ::sg_export(last_rightmove, dst.last_rightmove); - ::sg_export(lastClearOrigin, dst.lastClearOrigin); - ::sg_export(shoveCount, dst.shoveCount); - ::sg_export(blockedDebounceTime, dst.blockedDebounceTime); - ::sg_export(blockedEntity, dst.blockedEntity); - ::sg_export(blockedTargetPosition, dst.blockedTargetPosition); - ::sg_export(blockedTargetEntity, dst.blockedTargetEntity); - ::sg_export(jumpDest, dst.jumpDest); - ::sg_export(jumpTarget, dst.jumpTarget); - ::sg_export(jumpMaxXYDist, dst.jumpMaxXYDist); - ::sg_export(jumpMazZDist, dst.jumpMazZDist); - ::sg_export(jumpSide, dst.jumpSide); - ::sg_export(jumpTime, dst.jumpTime); - ::sg_export(jumpBackupTime, dst.jumpBackupTime); - ::sg_export(jumpNextCheckTime, dst.jumpNextCheckTime); - ::sg_export(combatPoint, dst.combatPoint); - ::sg_export(lastFailedCombatPoint, dst.lastFailedCombatPoint); - ::sg_export(movementSpeech, dst.movementSpeech); - ::sg_export(movementSpeechChance, dst.movementSpeechChance); - ::sg_export(nextBStateThink, dst.nextBStateThink); - ::sg_export(last_ucmd, dst.last_ucmd); - ::sg_export(combatMove, dst.combatMove); - ::sg_export(goalRadius, dst.goalRadius); - ::sg_export(pauseTime, dst.pauseTime); - ::sg_export(standTime, dst.standTime); - ::sg_export(localState, dst.localState); - ::sg_export(squadState, dst.squadState); - ::sg_export(confusionTime, dst.confusionTime); - ::sg_export(charmedTime, dst.charmedTime); - ::sg_export(controlledTime, dst.controlledTime); - ::sg_export(surrenderTime, dst.surrenderTime); - ::sg_export(kneelTime, dst.kneelTime); - ::sg_export(enemyLaggedPos, dst.enemyLaggedPos); - ::sg_export(watchTarget, dst.watchTarget); - ::sg_export(ffireCount, dst.ffireCount); - ::sg_export(ffireDebounce, dst.ffireDebounce); - ::sg_export(ffireFadeDebounce, dst.ffireFadeDebounce); + saved_game->write(burstMax); + saved_game->write(burstSpacing); + saved_game->write(attackHold); + saved_game->write(attackHoldTime); + saved_game->write(shootAngles); + saved_game->write(rank); + saved_game->write(behaviorState); + saved_game->write(defaultBehavior); + saved_game->write(tempBehavior); + saved_game->write(ignorePain); + saved_game->write(duckDebounceTime); + saved_game->write(walkDebounceTime); + saved_game->write(enemyCheckDebounceTime); + saved_game->write(investigateDebounceTime); + saved_game->write(investigateCount); + saved_game->write(investigateGoal); + saved_game->write(investigateSoundDebounceTime); + saved_game->write(greetingDebounceTime); + saved_game->write(eventOwner); + saved_game->write(coverTarg); + saved_game->write(jumpState); + saved_game->write(followDist); + saved_game->write(tempGoal); + saved_game->write(goalEntity); + saved_game->write(lastGoalEntity); + saved_game->write(eventualGoal); + saved_game->write(captureGoal); + saved_game->write(defendEnt); + saved_game->write(greetEnt); + saved_game->write(goalTime); + saved_game->write(straightToGoal); + saved_game->write(distToGoal); + saved_game->write(navTime); + saved_game->write(blockingEntNum); + saved_game->write(blockedSpeechDebounceTime); + saved_game->write(homeWp); + saved_game->write(avoidSide); + saved_game->write(leaderAvoidSide); + saved_game->write(lastAvoidSteerSide); + saved_game->write(lastAvoidSteerSideDebouncer); + saved_game->write(group); + saved_game->write(troop); + saved_game->write(lastPathAngles); + saved_game->write<>(stats); + saved_game->write(aimErrorDebounceTime); + saved_game->write(lastAimErrorYaw); + saved_game->write(lastAimErrorPitch); + saved_game->write(aimOfs); + saved_game->write(currentAim); + saved_game->write(currentAggression); + saved_game->write(scriptFlags); + saved_game->write(desiredSpeed); + saved_game->write(currentSpeed); + saved_game->write(last_forwardmove); + saved_game->write(last_rightmove); + saved_game->write(lastClearOrigin); + saved_game->write(shoveCount); + saved_game->write(blockedDebounceTime); + saved_game->write(blockedEntity); + saved_game->write(blockedTargetPosition); + saved_game->write(blockedTargetEntity); + saved_game->write(jumpDest); + saved_game->write(jumpTarget); + saved_game->write(jumpMaxXYDist); + saved_game->write(jumpMazZDist); + saved_game->write(jumpSide); + saved_game->write(jumpTime); + saved_game->write(jumpBackupTime); + saved_game->write(jumpNextCheckTime); + saved_game->write(combatPoint); + saved_game->write(lastFailedCombatPoint); + saved_game->write(movementSpeech); + saved_game->write(movementSpeechChance); + saved_game->write(nextBStateThink); + saved_game->write<>(last_ucmd); + saved_game->write(combatMove); + saved_game->write(goalRadius); + saved_game->write(pauseTime); + saved_game->write(standTime); + saved_game->write(localState); + saved_game->write(squadState); + saved_game->write(confusionTime); + saved_game->write(charmedTime); + saved_game->write(controlledTime); + saved_game->write(surrenderTime); + saved_game->write(kneelTime); + saved_game->write(enemyLaggedPos); + saved_game->write(watchTarget); + saved_game->write(ffireCount); + saved_game->write(ffireDebounce); + saved_game->write(ffireFadeDebounce); } void gNPC_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.timeOfDeath, timeOfDeath); - ::sg_import(src.touchedByPlayer, touchedByPlayer); - ::sg_import(src.enemyLastVisibility, enemyLastVisibility); - ::sg_import(src.aimTime, aimTime); - ::sg_import(src.desiredYaw, desiredYaw); - ::sg_import(src.desiredPitch, desiredPitch); - ::sg_import(src.lockedDesiredYaw, lockedDesiredYaw); - ::sg_import(src.lockedDesiredPitch, lockedDesiredPitch); - ::sg_import(src.aimingBeam, aimingBeam); - ::sg_import(src.enemyLastSeenLocation, enemyLastSeenLocation); - ::sg_import(src.enemyLastSeenTime, enemyLastSeenTime); - ::sg_import(src.enemyLastHeardLocation, enemyLastHeardLocation); - ::sg_import(src.enemyLastHeardTime, enemyLastHeardTime); - ::sg_import(src.lastAlertID, lastAlertID); - ::sg_import(src.eFlags, eFlags); - ::sg_import(src.aiFlags, aiFlags); - ::sg_import(src.currentAmmo, currentAmmo); - ::sg_import(src.shotTime, shotTime); - ::sg_import(src.burstCount, burstCount); - ::sg_import(src.burstMin, burstMin); + saved_game->read(timeOfDeath); + saved_game->read(touchedByPlayer); + saved_game->read(enemyLastVisibility); + saved_game->read(aimTime); + saved_game->read(desiredYaw); + saved_game->read(desiredPitch); + saved_game->read(lockedDesiredYaw); + saved_game->read(lockedDesiredPitch); + saved_game->read(aimingBeam); + saved_game->read(enemyLastSeenLocation); + saved_game->read(enemyLastSeenTime); + saved_game->read(enemyLastHeardLocation); + saved_game->read(enemyLastHeardTime); + saved_game->read(lastAlertID); + saved_game->read(eFlags); + saved_game->read(aiFlags); + saved_game->read(currentAmmo); + saved_game->read(shotTime); + saved_game->read(burstCount); + saved_game->read(burstMin); #ifdef BASE_SAVE_COMPAT - ::sg_import(src.burstMean, burstMean); + saved_game->read(burstMean); #endif - ::sg_import(src.burstMax, burstMax); - ::sg_import(src.burstSpacing, burstSpacing); - ::sg_import(src.attackHold, attackHold); - ::sg_import(src.attackHoldTime, attackHoldTime); - ::sg_import(src.shootAngles, shootAngles); - ::sg_import(src.rank, rank); - ::sg_import(src.behaviorState, behaviorState); - ::sg_import(src.defaultBehavior, defaultBehavior); - ::sg_import(src.tempBehavior, tempBehavior); - ::sg_import(src.ignorePain, ignorePain); - ::sg_import(src.duckDebounceTime, duckDebounceTime); - ::sg_import(src.walkDebounceTime, walkDebounceTime); - ::sg_import(src.enemyCheckDebounceTime, enemyCheckDebounceTime); - ::sg_import(src.investigateDebounceTime, investigateDebounceTime); - ::sg_import(src.investigateCount, investigateCount); - ::sg_import(src.investigateGoal, investigateGoal); - ::sg_import(src.investigateSoundDebounceTime, investigateSoundDebounceTime); - ::sg_import(src.greetingDebounceTime, greetingDebounceTime); - ::sg_import(src.eventOwner, eventOwner); - ::sg_import(src.coverTarg, coverTarg); - ::sg_import(src.jumpState, jumpState); - ::sg_import(src.followDist, followDist); - ::sg_import(src.tempGoal, tempGoal); - ::sg_import(src.goalEntity, goalEntity); - ::sg_import(src.lastGoalEntity, lastGoalEntity); - ::sg_import(src.eventualGoal, eventualGoal); - ::sg_import(src.captureGoal, captureGoal); - ::sg_import(src.defendEnt, defendEnt); - ::sg_import(src.greetEnt, greetEnt); - ::sg_import(src.goalTime, goalTime); - ::sg_import(src.straightToGoal, straightToGoal); - ::sg_import(src.distToGoal, distToGoal); - ::sg_import(src.navTime, navTime); - ::sg_import(src.blockingEntNum, blockingEntNum); - ::sg_import(src.blockedSpeechDebounceTime, blockedSpeechDebounceTime); - ::sg_import(src.homeWp, homeWp); - ::sg_import(src.avoidSide, avoidSide); - ::sg_import(src.leaderAvoidSide, leaderAvoidSide); - ::sg_import(src.lastAvoidSteerSide, lastAvoidSteerSide); - ::sg_import(src.lastAvoidSteerSideDebouncer, lastAvoidSteerSideDebouncer); - ::sg_import(src.group, group); - ::sg_import(src.troop, troop); - ::sg_import(src.lastPathAngles, lastPathAngles); - ::sg_import(src.stats, stats); - ::sg_import(src.aimErrorDebounceTime, aimErrorDebounceTime); - ::sg_import(src.lastAimErrorYaw, lastAimErrorYaw); - ::sg_import(src.lastAimErrorPitch, lastAimErrorPitch); - ::sg_import(src.aimOfs, aimOfs); - ::sg_import(src.currentAim, currentAim); - ::sg_import(src.currentAggression, currentAggression); - ::sg_import(src.scriptFlags, scriptFlags); - ::sg_import(src.desiredSpeed, desiredSpeed); - ::sg_import(src.currentSpeed, currentSpeed); - ::sg_import(src.last_forwardmove, last_forwardmove); - ::sg_import(src.last_rightmove, last_rightmove); - ::sg_import(src.lastClearOrigin, lastClearOrigin); - ::sg_import(src.shoveCount, shoveCount); - ::sg_import(src.blockedDebounceTime, blockedDebounceTime); - ::sg_import(src.blockedEntity, blockedEntity); - ::sg_import(src.blockedTargetPosition, blockedTargetPosition); - ::sg_import(src.blockedTargetEntity, blockedTargetEntity); - ::sg_import(src.jumpDest, jumpDest); - ::sg_import(src.jumpTarget, jumpTarget); - ::sg_import(src.jumpMaxXYDist, jumpMaxXYDist); - ::sg_import(src.jumpMazZDist, jumpMazZDist); - ::sg_import(src.jumpSide, jumpSide); - ::sg_import(src.jumpTime, jumpTime); - ::sg_import(src.jumpBackupTime, jumpBackupTime); - ::sg_import(src.jumpNextCheckTime, jumpNextCheckTime); - ::sg_import(src.combatPoint, combatPoint); - ::sg_import(src.lastFailedCombatPoint, lastFailedCombatPoint); - ::sg_import(src.movementSpeech, movementSpeech); - ::sg_import(src.movementSpeechChance, movementSpeechChance); - ::sg_import(src.nextBStateThink, nextBStateThink); - ::sg_import(src.last_ucmd, last_ucmd); - ::sg_import(src.combatMove, combatMove); - ::sg_import(src.goalRadius, goalRadius); - ::sg_import(src.pauseTime, pauseTime); - ::sg_import(src.standTime, standTime); - ::sg_import(src.localState, localState); - ::sg_import(src.squadState, squadState); - ::sg_import(src.confusionTime, confusionTime); - ::sg_import(src.charmedTime, charmedTime); - ::sg_import(src.controlledTime, controlledTime); - ::sg_import(src.surrenderTime, surrenderTime); - ::sg_import(src.kneelTime, kneelTime); - ::sg_import(src.enemyLaggedPos, enemyLaggedPos); - ::sg_import(src.watchTarget, watchTarget); - ::sg_import(src.ffireCount, ffireCount); - ::sg_import(src.ffireDebounce, ffireDebounce); - ::sg_import(src.ffireFadeDebounce, ffireFadeDebounce); + saved_game->read(burstMax); + saved_game->read(burstSpacing); + saved_game->read(attackHold); + saved_game->read(attackHoldTime); + saved_game->read(shootAngles); + saved_game->read(rank); + saved_game->read(behaviorState); + saved_game->read(defaultBehavior); + saved_game->read(tempBehavior); + saved_game->read(ignorePain); + saved_game->read(duckDebounceTime); + saved_game->read(walkDebounceTime); + saved_game->read(enemyCheckDebounceTime); + saved_game->read(investigateDebounceTime); + saved_game->read(investigateCount); + saved_game->read(investigateGoal); + saved_game->read(investigateSoundDebounceTime); + saved_game->read(greetingDebounceTime); + saved_game->read(eventOwner); + saved_game->read(coverTarg); + saved_game->read(jumpState); + saved_game->read(followDist); + saved_game->read(tempGoal); + saved_game->read(goalEntity); + saved_game->read(lastGoalEntity); + saved_game->read(eventualGoal); + saved_game->read(captureGoal); + saved_game->read(defendEnt); + saved_game->read(greetEnt); + saved_game->read(goalTime); + saved_game->read(straightToGoal); + saved_game->read(distToGoal); + saved_game->read(navTime); + saved_game->read(blockingEntNum); + saved_game->read(blockedSpeechDebounceTime); + saved_game->read(homeWp); + saved_game->read(avoidSide); + saved_game->read(leaderAvoidSide); + saved_game->read(lastAvoidSteerSide); + saved_game->read(lastAvoidSteerSideDebouncer); + saved_game->read(group); + saved_game->read(troop); + saved_game->read(lastPathAngles); + saved_game->read<>(stats); + saved_game->read(aimErrorDebounceTime); + saved_game->read(lastAimErrorYaw); + saved_game->read(lastAimErrorPitch); + saved_game->read(aimOfs); + saved_game->read(currentAim); + saved_game->read(currentAggression); + saved_game->read(scriptFlags); + saved_game->read(desiredSpeed); + saved_game->read(currentSpeed); + saved_game->read(last_forwardmove); + saved_game->read(last_rightmove); + saved_game->read(lastClearOrigin); + saved_game->read(shoveCount); + saved_game->read(blockedDebounceTime); + saved_game->read(blockedEntity); + saved_game->read(blockedTargetPosition); + saved_game->read(blockedTargetEntity); + saved_game->read(jumpDest); + saved_game->read(jumpTarget); + saved_game->read(jumpMaxXYDist); + saved_game->read(jumpMazZDist); + saved_game->read(jumpSide); + saved_game->read(jumpTime); + saved_game->read(jumpBackupTime); + saved_game->read(jumpNextCheckTime); + saved_game->read(combatPoint); + saved_game->read(lastFailedCombatPoint); + saved_game->read(movementSpeech); + saved_game->read(movementSpeechChance); + saved_game->read(nextBStateThink); + saved_game->read<>(last_ucmd); + saved_game->read(combatMove); + saved_game->read(goalRadius); + saved_game->read(pauseTime); + saved_game->read(standTime); + saved_game->read(localState); + saved_game->read(squadState); + saved_game->read(confusionTime); + saved_game->read(charmedTime); + saved_game->read(controlledTime); + saved_game->read(surrenderTime); + saved_game->read(kneelTime); + saved_game->read(enemyLaggedPos); + saved_game->read(watchTarget); + saved_game->read(ffireCount); + saved_game->read(ffireDebounce); + saved_game->read(ffireFadeDebounce); } diff --git a/code/game/b_public.h b/code/game/b_public.h index 526ad24cce..95a33a7913 100644 --- a/code/game/b_public.h +++ b/code/game/b_public.h @@ -132,36 +132,8 @@ typedef enum } sexType_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgGNpcStats -{ -public: - int32_t aggression; - int32_t aim; - float earshot; - int32_t evasion; - int32_t hfov; - int32_t intelligence; - int32_t move; - int32_t reactions; - float shootDistance; - int32_t vfov; - float vigilance; - float visrange; - int32_t runSpeed; - int32_t walkSpeed; - float yawSpeed; - int32_t health; - int32_t acceleration; - int32_t sex; -}; // SgGNpcStats -#pragma pack(pop) - typedef struct gNPCstats_e {//Stats, loaded in, and can be set by scripts - using SgType = SgGNpcStats; - - //AI int aggression; // " int aim; // " @@ -186,10 +158,10 @@ typedef struct gNPCstats_e void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } gNPCstats_t; @@ -198,134 +170,8 @@ typedef struct gNPCstats_e #define ENEMY_POS_LAG_STEPS (MAX_ENEMY_POS_LAG/ENEMY_POS_LAG_INTERVAL) // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgGNpc -{ -public: - int32_t timeOfDeath; - int32_t touchedByPlayer; - int32_t enemyLastVisibility; - int32_t aimTime; - float desiredYaw; - float desiredPitch; - float lockedDesiredYaw; - float lockedDesiredPitch; - int32_t aimingBeam; - SgVec3 enemyLastSeenLocation; - int32_t enemyLastSeenTime; - SgVec3 enemyLastHeardLocation; - int32_t enemyLastHeardTime; - int32_t lastAlertID; - int32_t eFlags; - int32_t aiFlags; - int32_t currentAmmo; - int32_t shotTime; - int32_t burstCount; - int32_t burstMin; - -#ifdef BASE_SAVE_COMPAT - int32_t burstMean; -#endif - - int32_t burstMax; - int32_t burstSpacing; - int32_t attackHold; - int32_t attackHoldTime; - SgVec3 shootAngles; - int32_t rank; - int32_t behaviorState; - int32_t defaultBehavior; - int32_t tempBehavior; - int32_t ignorePain; - int32_t duckDebounceTime; - int32_t walkDebounceTime; - int32_t enemyCheckDebounceTime; - int32_t investigateDebounceTime; - int32_t investigateCount; - SgVec3 investigateGoal; - int32_t investigateSoundDebounceTime; - int32_t greetingDebounceTime; - int32_t eventOwner; - int32_t coverTarg; - int32_t jumpState; - float followDist; - int32_t tempGoal; - int32_t goalEntity; - int32_t lastGoalEntity; - int32_t eventualGoal; - int32_t captureGoal; - int32_t defendEnt; - int32_t greetEnt; - int32_t goalTime; - int32_t straightToGoal; - float distToGoal; - int32_t navTime; - int32_t blockingEntNum; - int32_t blockedSpeechDebounceTime; - int32_t homeWp; - int32_t avoidSide; - int32_t leaderAvoidSide; - int32_t lastAvoidSteerSide; - int32_t lastAvoidSteerSideDebouncer; - int32_t group; - int32_t troop; - SgVec3 lastPathAngles; - SgGNpcStats stats; - int32_t aimErrorDebounceTime; - float lastAimErrorYaw; - float lastAimErrorPitch; - SgVec3 aimOfs; - int32_t currentAim; - int32_t currentAggression; - int32_t scriptFlags; - int32_t desiredSpeed; - int32_t currentSpeed; - int8_t last_forwardmove; - int8_t last_rightmove; - SgVec3 lastClearOrigin; - int32_t shoveCount; - int32_t blockedDebounceTime; - int32_t blockedEntity; - SgVec3 blockedTargetPosition; - int32_t blockedTargetEntity; - SgVec3 jumpDest; - int32_t jumpTarget; - float jumpMaxXYDist; - float jumpMazZDist; - int32_t jumpSide; - int32_t jumpTime; - int32_t jumpBackupTime; - int32_t jumpNextCheckTime; - int32_t combatPoint; - int32_t lastFailedCombatPoint; - int32_t movementSpeech; - float movementSpeechChance; - int32_t nextBStateThink; - SgUserCmd last_ucmd; - int32_t combatMove; - int32_t goalRadius; - int32_t pauseTime; - int32_t standTime; - int32_t localState; - int32_t squadState; - int32_t confusionTime; - int32_t charmedTime; - int32_t controlledTime; - int32_t surrenderTime; - int32_t kneelTime; - SgArray enemyLaggedPos; - int32_t watchTarget; - int32_t ffireCount; - int32_t ffireDebounce; - int32_t ffireFadeDebounce; -}; // SgGNpc -#pragma pack(pop) - typedef struct { - using SgType = SgGNpc; - - //FIXME: Put in playerInfo or something int timeOfDeath; //FIXME do we really need both of these gentity_t *touchedByPlayer; @@ -496,10 +342,10 @@ typedef struct void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } gNPC_t; diff --git a/code/game/bg_public.cpp b/code/game/bg_public.cpp index fce4cf63c4..6eacc785e0 100644 --- a/code/game/bg_public.cpp +++ b/code/game/bg_public.cpp @@ -1,45 +1,45 @@ #include "bg_public.h" -#include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_i_saved_game.h" void animation_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(firstFrame, dst.firstFrame); - ::sg_export(numFrames, dst.numFrames); - ::sg_export(frameLerp, dst.frameLerp); - ::sg_export(loopFrames, dst.loopFrames); - ::sg_export(glaIndex, dst.glaIndex); + saved_game->write(firstFrame); + saved_game->write(numFrames); + saved_game->write(frameLerp); + saved_game->write(loopFrames); + saved_game->write(glaIndex); } void animation_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.firstFrame, firstFrame); - ::sg_import(src.numFrames, numFrames); - ::sg_import(src.frameLerp, frameLerp); - ::sg_import(src.loopFrames, loopFrames); - ::sg_import(src.glaIndex, glaIndex); + saved_game->read(firstFrame); + saved_game->read(numFrames); + saved_game->read(frameLerp); + saved_game->read(loopFrames); + saved_game->read(glaIndex); } void animevent_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(eventType, dst.eventType); - ::sg_export(modelOnly, dst.modelOnly); - ::sg_export(glaIndex, dst.glaIndex); - ::sg_export(keyFrame, dst.keyFrame); - ::sg_export(eventData, dst.eventData); - ::sg_export(stringData, dst.stringData); + saved_game->write(eventType); + saved_game->write(modelOnly); + saved_game->write(glaIndex); + saved_game->write(keyFrame); + saved_game->write(eventData); + saved_game->write(stringData); } void animevent_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.eventType, eventType); - ::sg_import(src.modelOnly, modelOnly); - ::sg_import(src.glaIndex, glaIndex); - ::sg_import(src.keyFrame, keyFrame); - ::sg_import(src.eventData, eventData); - ::sg_import(src.stringData, stringData); + saved_game->read(eventType); + saved_game->read(modelOnly); + saved_game->read(glaIndex); + saved_game->read(keyFrame); + saved_game->read(eventData); + saved_game->read(stringData); } diff --git a/code/game/bg_public.h b/code/game/bg_public.h index d12856af8a..dff6eb80de 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -454,22 +454,7 @@ typedef enum { } entity_event_t; -#pragma pack(push, 1) -class SgAnimation -{ -public: - uint16_t firstFrame; - uint16_t numFrames; - int16_t frameLerp; - int8_t loopFrames; - uint8_t glaIndex; -}; // SgAnimation -#pragma pack(pop) - typedef struct animation_s { - using SgType = SgAnimation; - - unsigned short firstFrame; unsigned short numFrames; short frameLerp; // msec between frames @@ -479,10 +464,10 @@ typedef struct animation_s { void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } animation_t; #define MAX_ANIM_FILES 16 @@ -536,24 +521,8 @@ typedef enum AEV_NUM_AEV } animEventType_t; -#pragma pack(push, 4) -class SgAnimEvent -{ -public: - int32_t eventType; - int16_t modelOnly; - uint16_t glaIndex; - uint16_t keyFrame; - SgArray eventData; - int32_t stringData; -}; // SgAnimEvent -#pragma pack(pop) - typedef struct animevent_s { - using SgType = SgAnimEvent; - - animEventType_t eventType; signed short modelOnly; //event is specific to a modelname to skeleton unsigned short glaIndex; @@ -563,10 +532,10 @@ typedef struct animevent_s void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } animevent_t; typedef enum diff --git a/code/game/g_local.cpp b/code/game/g_local.cpp index cb43d81315..7758a88cc8 100644 --- a/code/game/g_local.cpp +++ b/code/game/g_local.cpp @@ -1,101 +1,101 @@ #include "g_local.h" -#include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_i_saved_game.h" void animFileSet_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(filename, dst.filename); - ::sg_export(animations, dst.animations); - ::sg_export(torsoAnimEvents, dst.torsoAnimEvents); - ::sg_export(legsAnimEvents, dst.legsAnimEvents); - ::sg_export(torsoAnimEventCount, dst.torsoAnimEventCount); - ::sg_export(legsAnimEventCount, dst.legsAnimEventCount); + saved_game->write(filename); + saved_game->write<>(animations); + saved_game->write<>(torsoAnimEvents); + saved_game->write<>(legsAnimEvents); + saved_game->write(torsoAnimEventCount); + saved_game->write(legsAnimEventCount); } void animFileSet_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.filename, filename); - ::sg_import(src.animations, animations); - ::sg_import(src.torsoAnimEvents, torsoAnimEvents); - ::sg_import(src.legsAnimEvents, legsAnimEvents); - ::sg_import(src.torsoAnimEventCount, torsoAnimEventCount); - ::sg_import(src.legsAnimEventCount, legsAnimEventCount); + saved_game->read(filename); + saved_game->read<>(animations); + saved_game->read<>(torsoAnimEvents); + saved_game->read<>(legsAnimEvents); + saved_game->read(torsoAnimEventCount); + saved_game->read(legsAnimEventCount); } void alertEvent_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(position, dst.position); - ::sg_export(radius, dst.radius); - ::sg_export(level, dst.level); - ::sg_export(type, dst.type); - ::sg_export(owner, dst.owner); - ::sg_export(light, dst.light); - ::sg_export(addLight, dst.addLight); - ::sg_export(ID, dst.ID); - ::sg_export(timestamp, dst.timestamp); - ::sg_export(onGround, dst.onGround); + saved_game->write(position); + saved_game->write(radius); + saved_game->write(level); + saved_game->write(type); + saved_game->write(owner); + saved_game->write(light); + saved_game->write(addLight); + saved_game->write(ID); + saved_game->write(timestamp); + saved_game->write(onGround); } void alertEvent_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.position, position); - ::sg_import(src.radius, radius); - ::sg_import(src.level, level); - ::sg_import(src.type, type); - ::sg_import(src.owner, owner); - ::sg_import(src.light, light); - ::sg_import(src.addLight, addLight); - ::sg_import(src.ID, ID); - ::sg_import(src.timestamp, timestamp); - ::sg_import(src.onGround, onGround); + saved_game->read(position); + saved_game->read(radius); + saved_game->read(level); + saved_game->read(type); + saved_game->read(owner); + saved_game->read(light); + saved_game->read(addLight); + saved_game->read(ID); + saved_game->read(timestamp); + saved_game->read(onGround); } void level_locals_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(clients, dst.clients); - ::sg_export(maxclients, dst.maxclients); - ::sg_export(framenum, dst.framenum); - ::sg_export(time, dst.time); - ::sg_export(previousTime, dst.previousTime); - ::sg_export(globalTime, dst.globalTime); - ::sg_export(mapname, dst.mapname); - ::sg_export(locationLinked, dst.locationLinked); - ::sg_export(locationHead, dst.locationHead); - ::sg_export(alertEvents, dst.alertEvents); - ::sg_export(numAlertEvents, dst.numAlertEvents); - ::sg_export(curAlertID, dst.curAlertID); - ::sg_export(groups, dst.groups); - ::sg_export(knownAnimFileSets, dst.knownAnimFileSets); - ::sg_export(numKnownAnimFileSets, dst.numKnownAnimFileSets); - ::sg_export(worldFlags, dst.worldFlags); - ::sg_export(dmState, dst.dmState); + saved_game->write(clients); + saved_game->write(maxclients); + saved_game->write(framenum); + saved_game->write(time); + saved_game->write(previousTime); + saved_game->write(globalTime); + saved_game->write(mapname); + saved_game->write(locationLinked); + saved_game->write(locationHead); + saved_game->write<>(alertEvents); + saved_game->write(numAlertEvents); + saved_game->write(curAlertID); + saved_game->write<>(groups); + saved_game->write<>(knownAnimFileSets); + saved_game->write(numKnownAnimFileSets); + saved_game->write(worldFlags); + saved_game->write(dmState); } void level_locals_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.clients, clients); - ::sg_import(src.maxclients, maxclients); - ::sg_import(src.framenum, framenum); - ::sg_import(src.time, time); - ::sg_import(src.previousTime, previousTime); - ::sg_import(src.globalTime, globalTime); - ::sg_import(src.mapname, mapname); - ::sg_import(src.locationLinked, locationLinked); - ::sg_import(src.locationHead, locationHead); - ::sg_import(src.alertEvents, alertEvents); - ::sg_import(src.numAlertEvents, numAlertEvents); - ::sg_import(src.curAlertID, curAlertID); - ::sg_import(src.groups, groups); - ::sg_import(src.knownAnimFileSets, knownAnimFileSets); - ::sg_import(src.numKnownAnimFileSets, numKnownAnimFileSets); - ::sg_import(src.worldFlags, worldFlags); - ::sg_import(src.dmState, dmState); + saved_game->read(clients); + saved_game->read(maxclients); + saved_game->read(framenum); + saved_game->read(time); + saved_game->read(previousTime); + saved_game->read(globalTime); + saved_game->read(mapname); + saved_game->read(locationLinked); + saved_game->read(locationHead); + saved_game->read<>(alertEvents); + saved_game->read(numAlertEvents); + saved_game->read(curAlertID); + saved_game->read<>(groups); + saved_game->read<>(knownAnimFileSets); + saved_game->read(numKnownAnimFileSets); + saved_game->read(worldFlags); + saved_game->read(dmState); } diff --git a/code/game/g_local.h b/code/game/g_local.h index a3fa4ceba7..17c8b338d7 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -88,24 +88,8 @@ along with this program; if not, see . #define VALIDSTRING( a ) ( ( a != NULL ) && ( a[0] != '\0' ) ) //animations -#pragma pack(push, 4) -class SgAnimFileSet -{ -public: - SgArray filename; - SgArray animations; - SgArray torsoAnimEvents; - SgArray legsAnimEvents; - uint8_t torsoAnimEventCount; - uint8_t legsAnimEventCount; -}; // SgAnimFileSet -#pragma pack(pop) - typedef struct { - using SgType = SgAnimFileSet; - - char filename[MAX_QPATH]; animation_t animations[MAX_ANIMATIONS]; animevent_t torsoAnimEvents[MAX_ANIM_EVENTS]; @@ -115,10 +99,10 @@ typedef struct void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } animFileSet_t; extern stringID_table_t animTable [MAX_ANIMATIONS+1]; @@ -168,28 +152,8 @@ enum alertEventLevel_e }; // !!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! -#pragma pack(push, 4) -class SgAlertEvent -{ -public: - SgVec3 position; - float radius; - int32_t level; - int32_t type; - int32_t owner; - float light; - float addLight; - int32_t ID; - int32_t timestamp; - int32_t onGround; -}; // SgAlertEvent -#pragma pack(pop) - typedef struct alertEvent_s { - using SgType = SgAlertEvent; - - vec3_t position; //Where the event is located float radius; //Consideration radius alertEventLevel_e level; //Priority level of the event @@ -203,10 +167,10 @@ typedef struct alertEvent_s void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } alertEvent_t; // @@ -231,35 +195,8 @@ typedef struct #define WF_PUFFING 0x00000004 // puffing something // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgLevelLocals -{ -public: - int32_t clients; - int32_t maxclients; - int32_t framenum; - int32_t time; - int32_t previousTime; - int32_t globalTime; - SgArray mapname; - int32_t locationLinked; - int32_t locationHead; - SgArray alertEvents; - int32_t numAlertEvents; - int32_t curAlertID; - SgArray groups; - SgArray knownAnimFileSets; - int32_t numKnownAnimFileSets; - int32_t worldFlags; - int32_t dmState; -}; // SgLevelLocals -#pragma pack(pop) - typedef struct { - using SgType = SgLevelLocals; - - gclient_t *clients; // [maxclients] // store latched cvars here that we want to get at often @@ -320,10 +257,10 @@ typedef struct void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } level_locals_t; extern level_locals_t level; diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 9d29aba1f1..1ffb9aca5e 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -36,7 +36,6 @@ along with this program; if not, see . #include "../ghoul2/ghoul2_gore.h" //rww - RAGDOLL_END -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" extern void WP_SaberLoadParms( void ); diff --git a/code/game/g_objectives.cpp b/code/game/g_objectives.cpp index ae3e45aa04..b9ced077d0 100644 --- a/code/game/g_objectives.cpp +++ b/code/game/g_objectives.cpp @@ -29,7 +29,6 @@ along with this program; if not, see . #define G_OBJECTIVES_CPP #include "objectives.h" -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" qboolean missionInfo_Updated; diff --git a/code/game/g_public.h b/code/game/g_public.h index 599c6151fa..f0c21fa2df 100644 --- a/code/game/g_public.h +++ b/code/game/g_public.h @@ -26,7 +26,6 @@ along with this program; if not, see . // g_public.h -- game module information visible to server -#include "qcommon/ojk_sg_wrappers_fwd.h" #include "qcommon/ojk_i_saved_game_fwd.h" diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp index 95b8494d26..a8a41ef032 100644 --- a/code/game/g_roff.cpp +++ b/code/game/g_roff.cpp @@ -25,7 +25,6 @@ along with this program; if not, see . #include "Q3_Interface.h" #include "../cgame/cg_local.h" #include "g_functions.h" -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" // The list of precached ROFFs diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index f3941c1d1e..6bcfa0d672 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -30,7 +30,6 @@ along with this program; if not, see . #include "objectives.h" #include "../cgame/cg_camera.h" #include "../qcommon/sstring.h" -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" extern void OBJ_LoadTacticalInfo(void); @@ -506,50 +505,44 @@ static void EnumerateField(const save_field_t *pField, const byte *pbBase) } template -static void EnumerateFields(const save_field_t *pFields, const T* src_instance, unsigned int ulChid, size_t iLen) +static void EnumerateFields( + const save_field_t* pFields, + const T* src_instance, + unsigned int ulChid, + size_t iLen) { - strList.clear(); + strList.clear(); - auto pbData = reinterpret_cast(src_instance); + auto pbData = reinterpret_cast( + src_instance); - // enumerate all the fields... - // - if (pFields) - { - for (const save_field_t *pField = pFields; pField->psName; pField++) - { - assert(pField->iOffset < iLen); - EnumerateField(pField, pbData); - } - } - - // save out raw data... - // - using SgType = typename T::SgType; - - constexpr auto dst_size = static_cast(sizeof(SgType)); - - auto& dst_buffer = ::sg_get_buffer( - dst_size); + // enumerate all the fields... + // + if (pFields) { + for (auto pField = pFields; pField->psName; ++pField) { + assert(pField->iOffset < iLen); + ::EnumerateField(pField, pbData); + } + } - auto dst_instance = reinterpret_cast(dst_buffer.data()); + // save out raw data... + // + ::gi.saved_game->reset_buffer(); - ::sg_export(*src_instance, *dst_instance); + src_instance->sg_export( + ::gi.saved_game); ::gi.saved_game->write_chunk( - ulChid, - dst_buffer.data(), - dst_size); + ulChid); - // save out any associated strings.. - // - for (const auto& it : strList) - { + // save out any associated strings.. + // + for (const auto& it : strList) { ::gi.saved_game->write_chunk( - INT_ID('S','T','R','G'), + INT_ID('S', 'T', 'R', 'G'), it.c_str(), static_cast(it.length() + 1)); - } + } } @@ -745,6 +738,7 @@ static void SG_ConvertRetailSaberinfoToNewSaberinfo( void *sabData, saberInfo_t } } +#if 0 template static void EvaluateFields(const save_field_t *pFields, T *pbData, byte *pbOriginalRefData, unsigned int ulChid, int iSize, qboolean bOkToSizeMisMatch) { @@ -801,6 +795,36 @@ static void EvaluateFields(const save_field_t *pFields, T *pbData, byte *pbOrigi } } } +#else +// FIXME Retail saved game not supported. +// FIXME Is it really needed? +// FIXME Also remove iSize and bOkToSizeMisMatch in that case. +template +static void EvaluateFields( + const save_field_t* pFields, + T* pbData, + byte* pbOriginalRefData, + unsigned int ulChid, + int iSize, + qboolean bOkToSizeMisMatch) +{ + ::gi.saved_game->read_chunk( + ulChid); + + pbData->sg_import( + ::gi.saved_game); + + if (pFields) + { + for (const save_field_t* pField = pFields; pField->psName; ++pField) { + ::EvaluateField( + pField, + reinterpret_cast(pbData), + pbOriginalRefData); + } + } +} +#endif /* ============== @@ -1125,10 +1149,15 @@ static void ReadGEntities(qboolean qbAutosave) ::gi.saved_game->read_chunk( INT_ID('G','H','L','2')); +// FIXME Remove +#if 0 auto buffer = ::gi.saved_game->get_buffer(); auto pGhoul2Data = reinterpret_cast(buffer.data()); - gi.G2API_LoadGhoul2Models(pEnt->ghoul2, pGhoul2Data); // if it's going to crash anywhere... + gi.G2API_LoadGhoul2Models(pEnt->ghoul2, pGhoul2Data); // if it's going to crash anywhere... +#endif + + gi.G2API_LoadGhoul2Models(pEnt->ghoul2, nullptr); } // gi.unlinkentity (pEntOriginal); diff --git a/code/game/g_shared.cpp b/code/game/g_shared.cpp index 6fd79a62e9..aa60cf024d 100644 --- a/code/game/g_shared.cpp +++ b/code/game/g_shared.cpp @@ -1,829 +1,829 @@ #include "g_local.h" #include "g_shared.h" -#include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_i_saved_game.h" void clientInfo_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(infoValid, dst.infoValid); - ::sg_export(name, dst.name); - ::sg_export(team, dst.team); - ::sg_export(score, dst.score); - ::sg_export(handicap, dst.handicap); - ::sg_export(legsModel, dst.legsModel); - ::sg_export(legsSkin, dst.legsSkin); - ::sg_export(torsoModel, dst.torsoModel); - ::sg_export(torsoSkin, dst.torsoSkin); - ::sg_export(headModel, dst.headModel); - ::sg_export(headSkin, dst.headSkin); - ::sg_export(animFileIndex, dst.animFileIndex); - ::sg_export(sounds, dst.sounds); - ::sg_export(customBasicSoundDir, dst.customBasicSoundDir); - ::sg_export(customCombatSoundDir, dst.customCombatSoundDir); - ::sg_export(customExtraSoundDir, dst.customExtraSoundDir); - ::sg_export(customJediSoundDir, dst.customJediSoundDir); + saved_game->write(infoValid); + saved_game->write(name); + saved_game->write(team); + saved_game->write(score); + saved_game->write(handicap); + saved_game->write(legsModel); + saved_game->write(legsSkin); + saved_game->write(torsoModel); + saved_game->write(torsoSkin); + saved_game->write(headModel); + saved_game->write(headSkin); + saved_game->write(animFileIndex); + saved_game->write(sounds); + saved_game->write(customBasicSoundDir); + saved_game->write(customCombatSoundDir); + saved_game->write(customExtraSoundDir); + saved_game->write(customJediSoundDir); } void clientInfo_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.infoValid, infoValid); - ::sg_import(src.name, name); - ::sg_import(src.team, team); - ::sg_import(src.score, score); - ::sg_import(src.handicap, handicap); - ::sg_import(src.legsModel, legsModel); - ::sg_import(src.legsSkin, legsSkin); - ::sg_import(src.torsoModel, torsoModel); - ::sg_import(src.torsoSkin, torsoSkin); - ::sg_import(src.headModel, headModel); - ::sg_import(src.headSkin, headSkin); - ::sg_import(src.animFileIndex, animFileIndex); - ::sg_import(src.sounds, sounds); - ::sg_import(src.customBasicSoundDir, customBasicSoundDir); - ::sg_import(src.customCombatSoundDir, customCombatSoundDir); - ::sg_import(src.customExtraSoundDir, customExtraSoundDir); - ::sg_import(src.customJediSoundDir, customJediSoundDir); + saved_game->read(infoValid); + saved_game->read(name); + saved_game->read(team); + saved_game->read(score); + saved_game->read(handicap); + saved_game->read(legsModel); + saved_game->read(legsSkin); + saved_game->read(torsoModel); + saved_game->read(torsoSkin); + saved_game->read(headModel); + saved_game->read(headSkin); + saved_game->read(animFileIndex); + saved_game->read(sounds); + saved_game->read(customBasicSoundDir); + saved_game->read(customCombatSoundDir); + saved_game->read(customExtraSoundDir); + saved_game->read(customJediSoundDir); } void renderInfo_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(legsModelName, dst.legsModelName); - ::sg_export(torsoModelName, dst.torsoModelName); - ::sg_export(headModelName, dst.headModelName); - ::sg_export(headYawRangeLeft, dst.headYawRangeLeft); - ::sg_export(headYawRangeRight, dst.headYawRangeRight); - ::sg_export(headPitchRangeUp, dst.headPitchRangeUp); - ::sg_export(headPitchRangeDown, dst.headPitchRangeDown); - ::sg_export(torsoYawRangeLeft, dst.torsoYawRangeLeft); - ::sg_export(torsoYawRangeRight, dst.torsoYawRangeRight); - ::sg_export(torsoPitchRangeUp, dst.torsoPitchRangeUp); - ::sg_export(torsoPitchRangeDown, dst.torsoPitchRangeDown); - ::sg_export(legsFrame, dst.legsFrame); - ::sg_export(torsoFrame, dst.torsoFrame); - ::sg_export(legsFpsMod, dst.legsFpsMod); - ::sg_export(torsoFpsMod, dst.torsoFpsMod); - ::sg_export(customRGBA, dst.customRGBA); - ::sg_export(boneIndex1, dst.boneIndex1); - ::sg_export(boneIndex2, dst.boneIndex2); - ::sg_export(boneIndex3, dst.boneIndex3); - ::sg_export(boneIndex4, dst.boneIndex4); - ::sg_export(boneOrient, dst.boneOrient); - ::sg_export(boneAngles1, dst.boneAngles1); - ::sg_export(boneAngles2, dst.boneAngles2); - ::sg_export(boneAngles3, dst.boneAngles3); - ::sg_export(boneAngles4, dst.boneAngles4); - ::sg_export(renderFlags, dst.renderFlags); - ::sg_export(muzzlePoint, dst.muzzlePoint); - ::sg_export(muzzleDir, dst.muzzleDir); - ::sg_export(muzzlePointOld, dst.muzzlePointOld); - ::sg_export(muzzleDirOld, dst.muzzleDirOld); - ::sg_export(mPCalcTime, dst.mPCalcTime); - ::sg_export(lockYaw, dst.lockYaw); - ::sg_export(headPoint, dst.headPoint); - ::sg_export(headAngles, dst.headAngles); - ::sg_export(handRPoint, dst.handRPoint); - ::sg_export(handLPoint, dst.handLPoint); - ::sg_export(crotchPoint, dst.crotchPoint); - ::sg_export(footRPoint, dst.footRPoint); - ::sg_export(footLPoint, dst.footLPoint); - ::sg_export(torsoPoint, dst.torsoPoint); - ::sg_export(torsoAngles, dst.torsoAngles); - ::sg_export(eyePoint, dst.eyePoint); - ::sg_export(eyeAngles, dst.eyeAngles); - ::sg_export(lookTarget, dst.lookTarget); - ::sg_export(lookMode, dst.lookMode); - ::sg_export(lookTargetClearTime, dst.lookTargetClearTime); - ::sg_export(lastVoiceVolume, dst.lastVoiceVolume); - ::sg_export(lastHeadAngles, dst.lastHeadAngles); - ::sg_export(headBobAngles, dst.headBobAngles); - ::sg_export(targetHeadBobAngles, dst.targetHeadBobAngles); - ::sg_export(lookingDebounceTime, dst.lookingDebounceTime); - ::sg_export(legsYaw, dst.legsYaw); + saved_game->write(legsModelName); + saved_game->write(torsoModelName); + saved_game->write(headModelName); + saved_game->write(headYawRangeLeft); + saved_game->write(headYawRangeRight); + saved_game->write(headPitchRangeUp); + saved_game->write(headPitchRangeDown); + saved_game->write(torsoYawRangeLeft); + saved_game->write(torsoYawRangeRight); + saved_game->write(torsoPitchRangeUp); + saved_game->write(torsoPitchRangeDown); + saved_game->write(legsFrame); + saved_game->write(torsoFrame); + saved_game->write(legsFpsMod); + saved_game->write(torsoFpsMod); + saved_game->write(customRGBA); + saved_game->write(boneIndex1); + saved_game->write(boneIndex2); + saved_game->write(boneIndex3); + saved_game->write(boneIndex4); + saved_game->write(boneOrient); + saved_game->write(boneAngles1); + saved_game->write(boneAngles2); + saved_game->write(boneAngles3); + saved_game->write(boneAngles4); + saved_game->write(renderFlags); + saved_game->write(muzzlePoint); + saved_game->write(muzzleDir); + saved_game->write(muzzlePointOld); + saved_game->write(muzzleDirOld); + saved_game->write(mPCalcTime); + saved_game->write(lockYaw); + saved_game->write(headPoint); + saved_game->write(headAngles); + saved_game->write(handRPoint); + saved_game->write(handLPoint); + saved_game->write(crotchPoint); + saved_game->write(footRPoint); + saved_game->write(footLPoint); + saved_game->write(torsoPoint); + saved_game->write(torsoAngles); + saved_game->write(eyePoint); + saved_game->write(eyeAngles); + saved_game->write(lookTarget); + saved_game->write(lookMode); + saved_game->write(lookTargetClearTime); + saved_game->write(lastVoiceVolume); + saved_game->write(lastHeadAngles); + saved_game->write(headBobAngles); + saved_game->write(targetHeadBobAngles); + saved_game->write(lookingDebounceTime); + saved_game->write(legsYaw); } void renderInfo_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.legsModelName, legsModelName); - ::sg_import(src.torsoModelName, torsoModelName); - ::sg_import(src.headModelName, headModelName); - ::sg_import(src.headYawRangeLeft, headYawRangeLeft); - ::sg_import(src.headYawRangeRight, headYawRangeRight); - ::sg_import(src.headPitchRangeUp, headPitchRangeUp); - ::sg_import(src.headPitchRangeDown, headPitchRangeDown); - ::sg_import(src.torsoYawRangeLeft, torsoYawRangeLeft); - ::sg_import(src.torsoYawRangeRight, torsoYawRangeRight); - ::sg_import(src.torsoPitchRangeUp, torsoPitchRangeUp); - ::sg_import(src.torsoPitchRangeDown, torsoPitchRangeDown); - ::sg_import(src.legsFrame, legsFrame); - ::sg_import(src.torsoFrame, torsoFrame); - ::sg_import(src.legsFpsMod, legsFpsMod); - ::sg_import(src.torsoFpsMod, torsoFpsMod); - ::sg_import(src.customRGBA, customRGBA); - ::sg_import(src.boneIndex1, boneIndex1); - ::sg_import(src.boneIndex2, boneIndex2); - ::sg_import(src.boneIndex3, boneIndex3); - ::sg_import(src.boneIndex4, boneIndex4); - ::sg_import(src.boneOrient, boneOrient); - ::sg_import(src.boneAngles1, boneAngles1); - ::sg_import(src.boneAngles2, boneAngles2); - ::sg_import(src.boneAngles3, boneAngles3); - ::sg_import(src.boneAngles4, boneAngles4); - ::sg_import(src.renderFlags, renderFlags); - ::sg_import(src.muzzlePoint, muzzlePoint); - ::sg_import(src.muzzleDir, muzzleDir); - ::sg_import(src.muzzlePointOld, muzzlePointOld); - ::sg_import(src.muzzleDirOld, muzzleDirOld); - ::sg_import(src.mPCalcTime, mPCalcTime); - ::sg_import(src.lockYaw, lockYaw); - ::sg_import(src.headPoint, headPoint); - ::sg_import(src.headAngles, headAngles); - ::sg_import(src.handRPoint, handRPoint); - ::sg_import(src.handLPoint, handLPoint); - ::sg_import(src.crotchPoint, crotchPoint); - ::sg_import(src.footRPoint, footRPoint); - ::sg_import(src.footLPoint, footLPoint); - ::sg_import(src.torsoPoint, torsoPoint); - ::sg_import(src.torsoAngles, torsoAngles); - ::sg_import(src.eyePoint, eyePoint); - ::sg_import(src.eyeAngles, eyeAngles); - ::sg_import(src.lookTarget, lookTarget); - ::sg_import(src.lookMode, lookMode); - ::sg_import(src.lookTargetClearTime, lookTargetClearTime); - ::sg_import(src.lastVoiceVolume, lastVoiceVolume); - ::sg_import(src.lastHeadAngles, lastHeadAngles); - ::sg_import(src.headBobAngles, headBobAngles); - ::sg_import(src.targetHeadBobAngles, targetHeadBobAngles); - ::sg_import(src.lookingDebounceTime, lookingDebounceTime); - ::sg_import(src.legsYaw, legsYaw); + saved_game->read(legsModelName); + saved_game->read(torsoModelName); + saved_game->read(headModelName); + saved_game->read(headYawRangeLeft); + saved_game->read(headYawRangeRight); + saved_game->read(headPitchRangeUp); + saved_game->read(headPitchRangeDown); + saved_game->read(torsoYawRangeLeft); + saved_game->read(torsoYawRangeRight); + saved_game->read(torsoPitchRangeUp); + saved_game->read(torsoPitchRangeDown); + saved_game->read(legsFrame); + saved_game->read(torsoFrame); + saved_game->read(legsFpsMod); + saved_game->read(torsoFpsMod); + saved_game->read(customRGBA); + saved_game->read(boneIndex1); + saved_game->read(boneIndex2); + saved_game->read(boneIndex3); + saved_game->read(boneIndex4); + saved_game->read(boneOrient); + saved_game->read(boneAngles1); + saved_game->read(boneAngles2); + saved_game->read(boneAngles3); + saved_game->read(boneAngles4); + saved_game->read(renderFlags); + saved_game->read(muzzlePoint); + saved_game->read(muzzleDir); + saved_game->read(muzzlePointOld); + saved_game->read(muzzleDirOld); + saved_game->read(mPCalcTime); + saved_game->read(lockYaw); + saved_game->read(headPoint); + saved_game->read(headAngles); + saved_game->read(handRPoint); + saved_game->read(handLPoint); + saved_game->read(crotchPoint); + saved_game->read(footRPoint); + saved_game->read(footLPoint); + saved_game->read(torsoPoint); + saved_game->read(torsoAngles); + saved_game->read(eyePoint); + saved_game->read(eyeAngles); + saved_game->read(lookTarget); + saved_game->read(lookMode); + saved_game->read(lookTargetClearTime); + saved_game->read(lastVoiceVolume); + saved_game->read(lastHeadAngles); + saved_game->read(headBobAngles); + saved_game->read(targetHeadBobAngles); + saved_game->read(lookingDebounceTime); + saved_game->read(legsYaw); } void playerTeamState_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(state, dst.state); - ::sg_export(captures, dst.captures); - ::sg_export(basedefense, dst.basedefense); - ::sg_export(carrierdefense, dst.carrierdefense); - ::sg_export(flagrecovery, dst.flagrecovery); - ::sg_export(fragcarrier, dst.fragcarrier); - ::sg_export(assists, dst.assists); - ::sg_export(lasthurtcarrier, dst.lasthurtcarrier); - ::sg_export(lastreturnedflag, dst.lastreturnedflag); - ::sg_export(flagsince, dst.flagsince); - ::sg_export(lastfraggedcarrier, dst.lastfraggedcarrier); + saved_game->write(state); + saved_game->write(captures); + saved_game->write(basedefense); + saved_game->write(carrierdefense); + saved_game->write(flagrecovery); + saved_game->write(fragcarrier); + saved_game->write(assists); + saved_game->write(lasthurtcarrier); + saved_game->write(lastreturnedflag); + saved_game->write(flagsince); + saved_game->write(lastfraggedcarrier); } void playerTeamState_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.state, state); - ::sg_import(src.captures, captures); - ::sg_import(src.basedefense, basedefense); - ::sg_import(src.carrierdefense, carrierdefense); - ::sg_import(src.flagrecovery, flagrecovery); - ::sg_import(src.fragcarrier, fragcarrier); - ::sg_import(src.assists, assists); - ::sg_import(src.lasthurtcarrier, lasthurtcarrier); - ::sg_import(src.lastreturnedflag, lastreturnedflag); - ::sg_import(src.flagsince, flagsince); - ::sg_import(src.lastfraggedcarrier, lastfraggedcarrier); + saved_game->read(state); + saved_game->read(captures); + saved_game->read(basedefense); + saved_game->read(carrierdefense); + saved_game->read(flagrecovery); + saved_game->read(fragcarrier); + saved_game->read(assists); + saved_game->read(lasthurtcarrier); + saved_game->read(lastreturnedflag); + saved_game->read(flagsince); + saved_game->read(lastfraggedcarrier); } void objectives_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(display, dst.display); - ::sg_export(status, dst.status); + saved_game->write(display); + saved_game->write(status); } void objectives_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.display, display); - ::sg_import(src.status, status); + saved_game->read(display); + saved_game->read(status); } void missionStats_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(secretsFound, dst.secretsFound); - ::sg_export(totalSecrets, dst.totalSecrets); - ::sg_export(shotsFired, dst.shotsFired); - ::sg_export(hits, dst.hits); - ::sg_export(enemiesSpawned, dst.enemiesSpawned); - ::sg_export(enemiesKilled, dst.enemiesKilled); - ::sg_export(saberThrownCnt, dst.saberThrownCnt); - ::sg_export(saberBlocksCnt, dst.saberBlocksCnt); - ::sg_export(legAttacksCnt, dst.legAttacksCnt); - ::sg_export(armAttacksCnt, dst.armAttacksCnt); - ::sg_export(torsoAttacksCnt, dst.torsoAttacksCnt); - ::sg_export(otherAttacksCnt, dst.otherAttacksCnt); - ::sg_export(forceUsed, dst.forceUsed); - ::sg_export(weaponUsed, dst.weaponUsed); + saved_game->write(secretsFound); + saved_game->write(totalSecrets); + saved_game->write(shotsFired); + saved_game->write(hits); + saved_game->write(enemiesSpawned); + saved_game->write(enemiesKilled); + saved_game->write(saberThrownCnt); + saved_game->write(saberBlocksCnt); + saved_game->write(legAttacksCnt); + saved_game->write(armAttacksCnt); + saved_game->write(torsoAttacksCnt); + saved_game->write(otherAttacksCnt); + saved_game->write(forceUsed); + saved_game->write(weaponUsed); } void missionStats_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.secretsFound, secretsFound); - ::sg_import(src.totalSecrets, totalSecrets); - ::sg_import(src.shotsFired, shotsFired); - ::sg_import(src.hits, hits); - ::sg_import(src.enemiesSpawned, enemiesSpawned); - ::sg_import(src.enemiesKilled, enemiesKilled); - ::sg_import(src.saberThrownCnt, saberThrownCnt); - ::sg_import(src.saberBlocksCnt, saberBlocksCnt); - ::sg_import(src.legAttacksCnt, legAttacksCnt); - ::sg_import(src.armAttacksCnt, armAttacksCnt); - ::sg_import(src.torsoAttacksCnt, torsoAttacksCnt); - ::sg_import(src.otherAttacksCnt, otherAttacksCnt); - ::sg_import(src.forceUsed, forceUsed); - ::sg_import(src.weaponUsed, weaponUsed); + saved_game->read(secretsFound); + saved_game->read(totalSecrets); + saved_game->read(shotsFired); + saved_game->read(hits); + saved_game->read(enemiesSpawned); + saved_game->read(enemiesKilled); + saved_game->read(saberThrownCnt); + saved_game->read(saberBlocksCnt); + saved_game->read(legAttacksCnt); + saved_game->read(armAttacksCnt); + saved_game->read(torsoAttacksCnt); + saved_game->read(otherAttacksCnt); + saved_game->read(forceUsed); + saved_game->read(weaponUsed); } void clientSession_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(missionObjectivesShown, dst.missionObjectivesShown); - ::sg_export(sessionTeam, dst.sessionTeam); - ::sg_export(mission_objectives, dst.mission_objectives); - ::sg_export(missionStats, dst.missionStats); + saved_game->write(missionObjectivesShown); + saved_game->write(sessionTeam); + saved_game->write<>(mission_objectives); + saved_game->write<>(missionStats); } void clientSession_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.missionObjectivesShown, missionObjectivesShown); - ::sg_import(src.sessionTeam, sessionTeam); - ::sg_import(src.mission_objectives, mission_objectives); - ::sg_import(src.missionStats, missionStats); + saved_game->read(missionObjectivesShown); + saved_game->read(sessionTeam); + saved_game->read<>(mission_objectives); + saved_game->read<>(missionStats); } void clientPersistant_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(connected, dst.connected); - ::sg_export(lastCommand, dst.lastCommand); - ::sg_export(netname, dst.netname); - ::sg_export(maxHealth, dst.maxHealth); - ::sg_export(enterTime, dst.enterTime); - ::sg_export(cmd_angles, dst.cmd_angles); - ::sg_export(teamState, dst.teamState); + saved_game->write(connected); + saved_game->write(lastCommand); + saved_game->write(netname); + saved_game->write(maxHealth); + saved_game->write(enterTime); + saved_game->write(cmd_angles); + saved_game->write<>(teamState); } void clientPersistant_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.connected, connected); - ::sg_import(src.lastCommand, lastCommand); - ::sg_import(src.netname, netname); - ::sg_import(src.maxHealth, maxHealth); - ::sg_import(src.enterTime, enterTime); - ::sg_import(src.cmd_angles, cmd_angles); - ::sg_import(src.teamState, teamState); + saved_game->read(connected); + saved_game->read(lastCommand); + saved_game->read(netname); + saved_game->read(maxHealth); + saved_game->read(enterTime); + saved_game->read(cmd_angles); + saved_game->read<>(teamState); } void gclient_s::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(ps, dst.ps); - ::sg_export(pers, dst.pers); - ::sg_export(sess, dst.sess); - ::sg_export(lastCmdTime, dst.lastCmdTime); - ::sg_export(usercmd, dst.usercmd); - ::sg_export(buttons, dst.buttons); - ::sg_export(oldbuttons, dst.oldbuttons); - ::sg_export(latched_buttons, dst.latched_buttons); - ::sg_export(damage_armor, dst.damage_armor); - ::sg_export(damage_blood, dst.damage_blood); - ::sg_export(damage_from, dst.damage_from); - ::sg_export(damage_fromWorld, dst.damage_fromWorld); - ::sg_export(noclip, dst.noclip); - ::sg_export(forced_forwardmove, dst.forced_forwardmove); - ::sg_export(forced_rightmove, dst.forced_rightmove); - ::sg_export(respawnTime, dst.respawnTime); - ::sg_export(idleTime, dst.idleTime); - ::sg_export(airOutTime, dst.airOutTime); - ::sg_export(timeResidual, dst.timeResidual); - ::sg_export(facial_blink, dst.facial_blink); - ::sg_export(facial_timer, dst.facial_timer); - ::sg_export(facial_anim, dst.facial_anim); - ::sg_export(clientInfo, dst.clientInfo); - ::sg_export(moveType, dst.moveType); - ::sg_export(jetPackTime, dst.jetPackTime); - ::sg_export(fireDelay, dst.fireDelay); - ::sg_export(breathPuffTime, dst.breathPuffTime); - ::sg_export(playerTeam, dst.playerTeam); - ::sg_export(enemyTeam, dst.enemyTeam); - ::sg_export(leader, dst.leader); - ::sg_export(NPC_class, dst.NPC_class); - ::sg_export(hiddenDist, dst.hiddenDist); - ::sg_export(hiddenDir, dst.hiddenDir); - ::sg_export(renderInfo, dst.renderInfo); - ::sg_export(dismembered, dst.dismembered); - ::sg_export(dismemberProbLegs, dst.dismemberProbLegs); - ::sg_export(dismemberProbHead, dst.dismemberProbHead); - ::sg_export(dismemberProbArms, dst.dismemberProbArms); - ::sg_export(dismemberProbHands, dst.dismemberProbHands); - ::sg_export(dismemberProbWaist, dst.dismemberProbWaist); - ::sg_export(standheight, dst.standheight); - ::sg_export(crouchheight, dst.crouchheight); - ::sg_export(poisonDamage, dst.poisonDamage); - ::sg_export(poisonTime, dst.poisonTime); - ::sg_export(slopeRecalcTime, dst.slopeRecalcTime); - ::sg_export(pushVec, dst.pushVec); - ::sg_export(pushVecTime, dst.pushVecTime); - ::sg_export(noRagTime, dst.noRagTime); - ::sg_export(isRagging, dst.isRagging); - ::sg_export(overridingBones, dst.overridingBones); - ::sg_export(ragLastOrigin, dst.ragLastOrigin); - ::sg_export(ragLastOriginTime, dst.ragLastOriginTime); - ::sg_export(pushEffectFadeTime, dst.pushEffectFadeTime); - ::sg_export(pushEffectOrigin, dst.pushEffectOrigin); - ::sg_export(rocketLockIndex, dst.rocketLockIndex); - ::sg_export(rocketLastValidTime, dst.rocketLastValidTime); - ::sg_export(rocketLockTime, dst.rocketLockTime); - ::sg_export(rocketTargetTime, dst.rocketTargetTime); - ::sg_export(inSpaceSuffocation, dst.inSpaceSuffocation); - ::sg_export(inSpaceIndex, dst.inSpaceIndex); + saved_game->write<>(ps); + saved_game->write<>(pers); + saved_game->write<>(sess); + saved_game->write(lastCmdTime); + saved_game->write(usercmd); + saved_game->write(buttons); + saved_game->write(oldbuttons); + saved_game->write(latched_buttons); + saved_game->write(damage_armor); + saved_game->write(damage_blood); + saved_game->write(damage_from); + saved_game->write(damage_fromWorld); + saved_game->write(noclip); + saved_game->write(forced_forwardmove); + saved_game->write(forced_rightmove); + saved_game->write(respawnTime); + saved_game->write(idleTime); + saved_game->write(airOutTime); + saved_game->write(timeResidual); + saved_game->write(facial_blink); + saved_game->write(facial_timer); + saved_game->write(facial_anim); + saved_game->write<>(clientInfo); + saved_game->write(moveType); + saved_game->write(jetPackTime); + saved_game->write(fireDelay); + saved_game->write(breathPuffTime); + saved_game->write(playerTeam); + saved_game->write(enemyTeam); + saved_game->write(leader); + saved_game->write(NPC_class); + saved_game->write(hiddenDist); + saved_game->write(hiddenDir); + saved_game->write<>(renderInfo); + saved_game->write(dismembered); + saved_game->write(dismemberProbLegs); + saved_game->write(dismemberProbHead); + saved_game->write(dismemberProbArms); + saved_game->write(dismemberProbHands); + saved_game->write(dismemberProbWaist); + saved_game->write(standheight); + saved_game->write(crouchheight); + saved_game->write(poisonDamage); + saved_game->write(poisonTime); + saved_game->write(slopeRecalcTime); + saved_game->write(pushVec); + saved_game->write(pushVecTime); + saved_game->write(noRagTime); + saved_game->write(isRagging); + saved_game->write(overridingBones); + saved_game->write(ragLastOrigin); + saved_game->write(ragLastOriginTime); + saved_game->write(pushEffectFadeTime); + saved_game->write(pushEffectOrigin); + saved_game->write(rocketLockIndex); + saved_game->write(rocketLastValidTime); + saved_game->write(rocketLockTime); + saved_game->write(rocketTargetTime); + saved_game->write(inSpaceSuffocation); + saved_game->write(inSpaceIndex); } void gclient_s::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.ps, ps); - ::sg_import(src.pers, pers); - ::sg_import(src.sess, sess); - ::sg_import(src.lastCmdTime, lastCmdTime); - ::sg_import(src.usercmd, usercmd); - ::sg_import(src.buttons, buttons); - ::sg_import(src.oldbuttons, oldbuttons); - ::sg_import(src.latched_buttons, latched_buttons); - ::sg_import(src.damage_armor, damage_armor); - ::sg_import(src.damage_blood, damage_blood); - ::sg_import(src.damage_from, damage_from); - ::sg_import(src.damage_fromWorld, damage_fromWorld); - ::sg_import(src.noclip, noclip); - ::sg_import(src.forced_forwardmove, forced_forwardmove); - ::sg_import(src.forced_rightmove, forced_rightmove); - ::sg_import(src.respawnTime, respawnTime); - ::sg_import(src.idleTime, idleTime); - ::sg_import(src.airOutTime, airOutTime); - ::sg_import(src.timeResidual, timeResidual); - ::sg_import(src.facial_blink, facial_blink); - ::sg_import(src.facial_timer, facial_timer); - ::sg_import(src.facial_anim, facial_anim); - ::sg_import(src.clientInfo, clientInfo); - ::sg_import(src.moveType, moveType); - ::sg_import(src.jetPackTime, jetPackTime); - ::sg_import(src.fireDelay, fireDelay); - ::sg_import(src.breathPuffTime, breathPuffTime); - ::sg_import(src.playerTeam, playerTeam); - ::sg_import(src.enemyTeam, enemyTeam); - ::sg_import(src.leader, leader); - ::sg_import(src.NPC_class, NPC_class); - ::sg_import(src.hiddenDist, hiddenDist); - ::sg_import(src.hiddenDir, hiddenDir); - ::sg_import(src.renderInfo, renderInfo); - ::sg_import(src.dismembered, dismembered); - ::sg_import(src.dismemberProbLegs, dismemberProbLegs); - ::sg_import(src.dismemberProbHead, dismemberProbHead); - ::sg_import(src.dismemberProbArms, dismemberProbArms); - ::sg_import(src.dismemberProbHands, dismemberProbHands); - ::sg_import(src.dismemberProbWaist, dismemberProbWaist); - ::sg_import(src.standheight, standheight); - ::sg_import(src.crouchheight, crouchheight); - ::sg_import(src.poisonDamage, poisonDamage); - ::sg_import(src.poisonTime, poisonTime); - ::sg_import(src.slopeRecalcTime, slopeRecalcTime); - ::sg_import(src.pushVec, pushVec); - ::sg_import(src.pushVecTime, pushVecTime); - ::sg_import(src.noRagTime, noRagTime); - ::sg_import(src.isRagging, isRagging); - ::sg_import(src.overridingBones, overridingBones); - ::sg_import(src.ragLastOrigin, ragLastOrigin); - ::sg_import(src.ragLastOriginTime, ragLastOriginTime); - ::sg_import(src.pushEffectFadeTime, pushEffectFadeTime); - ::sg_import(src.pushEffectOrigin, pushEffectOrigin); - ::sg_import(src.rocketLockIndex, rocketLockIndex); - ::sg_import(src.rocketLastValidTime, rocketLastValidTime); - ::sg_import(src.rocketLockTime, rocketLockTime); - ::sg_import(src.rocketTargetTime, rocketTargetTime); - ::sg_import(src.inSpaceSuffocation, inSpaceSuffocation); - ::sg_import(src.inSpaceIndex, inSpaceIndex); + saved_game->read<>(ps); + saved_game->read<>(pers); + saved_game->read<>(sess); + saved_game->read(lastCmdTime); + saved_game->read(usercmd); + saved_game->read(buttons); + saved_game->read(oldbuttons); + saved_game->read(latched_buttons); + saved_game->read(damage_armor); + saved_game->read(damage_blood); + saved_game->read(damage_from); + saved_game->read(damage_fromWorld); + saved_game->read(noclip); + saved_game->read(forced_forwardmove); + saved_game->read(forced_rightmove); + saved_game->read(respawnTime); + saved_game->read(idleTime); + saved_game->read(airOutTime); + saved_game->read(timeResidual); + saved_game->read(facial_blink); + saved_game->read(facial_timer); + saved_game->read(facial_anim); + saved_game->read<>(clientInfo); + saved_game->read(moveType); + saved_game->read(jetPackTime); + saved_game->read(fireDelay); + saved_game->read(breathPuffTime); + saved_game->read(playerTeam); + saved_game->read(enemyTeam); + saved_game->read(leader); + saved_game->read(NPC_class); + saved_game->read(hiddenDist); + saved_game->read(hiddenDir); + saved_game->read<>(renderInfo); + saved_game->read(dismembered); + saved_game->read(dismemberProbLegs); + saved_game->read(dismemberProbHead); + saved_game->read(dismemberProbArms); + saved_game->read(dismemberProbHands); + saved_game->read(dismemberProbWaist); + saved_game->read(standheight); + saved_game->read(crouchheight); + saved_game->read(poisonDamage); + saved_game->read(poisonTime); + saved_game->read(slopeRecalcTime); + saved_game->read(pushVec); + saved_game->read(pushVecTime); + saved_game->read(noRagTime); + saved_game->read(isRagging); + saved_game->read(overridingBones); + saved_game->read(ragLastOrigin); + saved_game->read(ragLastOriginTime); + saved_game->read(pushEffectFadeTime); + saved_game->read(pushEffectOrigin); + saved_game->read(rocketLockIndex); + saved_game->read(rocketLastValidTime); + saved_game->read(rocketLockTime); + saved_game->read(rocketTargetTime); + saved_game->read(inSpaceSuffocation); + saved_game->read(inSpaceIndex); } void parms_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(parm, dst.parm); + saved_game->write(parm); } void parms_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.parm, parm); + saved_game->read(parm); } void gentity_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(s, dst.s); - ::sg_export(client, dst.client); - ::sg_export(inuse, dst.inuse); - ::sg_export(linked, dst.linked); - ::sg_export(svFlags, dst.svFlags); - ::sg_export(bmodel, dst.bmodel); - ::sg_export(mins, dst.mins); - ::sg_export(maxs, dst.maxs); - ::sg_export(contents, dst.contents); - ::sg_export(absmin, dst.absmin); - ::sg_export(absmax, dst.absmax); - ::sg_export(currentOrigin, dst.currentOrigin); - ::sg_export(currentAngles, dst.currentAngles); - ::sg_export(owner, dst.owner); - ::sg_export(ghoul2, dst.ghoul2); - ::sg_export(modelScale, dst.modelScale); - ::sg_export(classname, dst.classname); - ::sg_export(spawnflags, dst.spawnflags); - ::sg_export(flags, dst.flags); - ::sg_export(model, dst.model); - ::sg_export(model2, dst.model2); - ::sg_export(freetime, dst.freetime); - ::sg_export(eventTime, dst.eventTime); - ::sg_export(freeAfterEvent, dst.freeAfterEvent); - ::sg_export(physicsBounce, dst.physicsBounce); - ::sg_export(clipmask, dst.clipmask); - ::sg_export(speed, dst.speed); - ::sg_export(resultspeed, dst.resultspeed); - ::sg_export(lastMoveTime, dst.lastMoveTime); - ::sg_export(movedir, dst.movedir); - ::sg_export(lastOrigin, dst.lastOrigin); - ::sg_export(lastAngles, dst.lastAngles); - ::sg_export(mass, dst.mass); - ::sg_export(lastImpact, dst.lastImpact); - ::sg_export(watertype, dst.watertype); - ::sg_export(waterlevel, dst.waterlevel); - ::sg_export(wupdate, dst.wupdate); - ::sg_export(prev_waterlevel, dst.prev_waterlevel); - ::sg_export(angle, dst.angle); - ::sg_export(target, dst.target); - ::sg_export(target2, dst.target2); - ::sg_export(target3, dst.target3); - ::sg_export(target4, dst.target4); - ::sg_export(targetJump, dst.targetJump); - ::sg_export(targetname, dst.targetname); - ::sg_export(team, dst.team); - ::sg_export(roff, dst.roff); - ::sg_export(roff_ctr, dst.roff_ctr); - ::sg_export(next_roff_time, dst.next_roff_time); - ::sg_export(fx_time, dst.fx_time); - ::sg_export(nextthink, dst.nextthink); - ::sg_export(e_ThinkFunc, dst.e_ThinkFunc); - ::sg_export(e_clThinkFunc, dst.e_clThinkFunc); - ::sg_export(e_ReachedFunc, dst.e_ReachedFunc); - ::sg_export(e_BlockedFunc, dst.e_BlockedFunc); - ::sg_export(e_TouchFunc, dst.e_TouchFunc); - ::sg_export(e_UseFunc, dst.e_UseFunc); - ::sg_export(e_PainFunc, dst.e_PainFunc); - ::sg_export(e_DieFunc, dst.e_DieFunc); - ::sg_export(health, dst.health); - ::sg_export(max_health, dst.max_health); - ::sg_export(takedamage, dst.takedamage); - ::sg_export(material, dst.material); - ::sg_export(damage, dst.damage); - ::sg_export(dflags, dst.dflags); - ::sg_export(splashDamage, dst.splashDamage); - ::sg_export(splashRadius, dst.splashRadius); - ::sg_export(methodOfDeath, dst.methodOfDeath); - ::sg_export(splashMethodOfDeath, dst.splashMethodOfDeath); - ::sg_export(locationDamage, dst.locationDamage); - ::sg_export(chain, dst.chain); - ::sg_export(enemy, dst.enemy); - ::sg_export(activator, dst.activator); - ::sg_export(teamchain, dst.teamchain); - ::sg_export(teammaster, dst.teammaster); - ::sg_export(lastEnemy, dst.lastEnemy); - ::sg_export(wait, dst.wait); - ::sg_export(random, dst.random); - ::sg_export(delay, dst.delay); - ::sg_export(alt_fire, dst.alt_fire); - ::sg_export(count, dst.count); - ::sg_export(bounceCount, dst.bounceCount); - ::sg_export(fly_sound_debounce_time, dst.fly_sound_debounce_time); - ::sg_export(painDebounceTime, dst.painDebounceTime); - ::sg_export(disconnectDebounceTime, dst.disconnectDebounceTime); - ::sg_export(attackDebounceTime, dst.attackDebounceTime); - ::sg_export(pushDebounceTime, dst.pushDebounceTime); - ::sg_export(aimDebounceTime, dst.aimDebounceTime); - ::sg_export(useDebounceTime, dst.useDebounceTime); - ::sg_export(trigger_formation, dst.trigger_formation); - ::sg_export(spawnContents, dst.spawnContents); - ::sg_export(waypoint, dst.waypoint); - ::sg_export(wayedge, dst.wayedge); - ::sg_export(lastWaypoint, dst.lastWaypoint); - ::sg_export(lastInAirTime, dst.lastInAirTime); - ::sg_export(noWaypointTime, dst.noWaypointTime); - ::sg_export(combatPoint, dst.combatPoint); - ::sg_export(followPos, dst.followPos); - ::sg_export(followPosRecalcTime, dst.followPosRecalcTime); - ::sg_export(followPosWaypoint, dst.followPosWaypoint); - ::sg_export(loopAnim, dst.loopAnim); - ::sg_export(startFrame, dst.startFrame); - ::sg_export(endFrame, dst.endFrame); - ::sg_export(m_iIcarusID, dst.m_iIcarusID); - ::sg_export(taskID, dst.taskID); - ::sg_export(parms, dst.parms); - ::sg_export(behaviorSet, dst.behaviorSet); - ::sg_export(script_targetname, dst.script_targetname); - ::sg_export(delayScriptTime, dst.delayScriptTime); - ::sg_export(soundSet, dst.soundSet); - ::sg_export(setTime, dst.setTime); - ::sg_export(cameraGroup, dst.cameraGroup); - ::sg_export(noDamageTeam, dst.noDamageTeam); - ::sg_export(playerModel, dst.playerModel); - ::sg_export(weaponModel, dst.weaponModel); - ::sg_export(handRBolt, dst.handRBolt); - ::sg_export(handLBolt, dst.handLBolt); - ::sg_export(headBolt, dst.headBolt); - ::sg_export(cervicalBolt, dst.cervicalBolt); - ::sg_export(chestBolt, dst.chestBolt); - ::sg_export(gutBolt, dst.gutBolt); - ::sg_export(torsoBolt, dst.torsoBolt); - ::sg_export(crotchBolt, dst.crotchBolt); - ::sg_export(motionBolt, dst.motionBolt); - ::sg_export(kneeLBolt, dst.kneeLBolt); - ::sg_export(kneeRBolt, dst.kneeRBolt); - ::sg_export(elbowLBolt, dst.elbowLBolt); - ::sg_export(elbowRBolt, dst.elbowRBolt); - ::sg_export(footLBolt, dst.footLBolt); - ::sg_export(footRBolt, dst.footRBolt); - ::sg_export(faceBone, dst.faceBone); - ::sg_export(craniumBone, dst.craniumBone); - ::sg_export(cervicalBone, dst.cervicalBone); - ::sg_export(thoracicBone, dst.thoracicBone); - ::sg_export(upperLumbarBone, dst.upperLumbarBone); - ::sg_export(lowerLumbarBone, dst.lowerLumbarBone); - ::sg_export(hipsBone, dst.hipsBone); - ::sg_export(motionBone, dst.motionBone); - ::sg_export(rootBone, dst.rootBone); - ::sg_export(footLBone, dst.footLBone); - ::sg_export(footRBone, dst.footRBone); - ::sg_export(humerusRBone, dst.humerusRBone); - ::sg_export(genericBone1, dst.genericBone1); - ::sg_export(genericBone2, dst.genericBone2); - ::sg_export(genericBone3, dst.genericBone3); - ::sg_export(genericBolt1, dst.genericBolt1); - ::sg_export(genericBolt2, dst.genericBolt2); - ::sg_export(genericBolt3, dst.genericBolt3); - ::sg_export(genericBolt4, dst.genericBolt4); - ::sg_export(genericBolt5, dst.genericBolt5); - ::sg_export(cinematicModel, dst.cinematicModel); - ::sg_export(m_pVehicle, dst.m_pVehicle); - ::sg_export(NPC, dst.NPC); - ::sg_export(ownername, dst.ownername); - ::sg_export(cantHitEnemyCounter, dst.cantHitEnemyCounter); - ::sg_export(NPC_type, dst.NPC_type); - ::sg_export(NPC_targetname, dst.NPC_targetname); - ::sg_export(NPC_target, dst.NPC_target); - ::sg_export(moverState, dst.moverState); - ::sg_export(soundPos1, dst.soundPos1); - ::sg_export(sound1to2, dst.sound1to2); - ::sg_export(sound2to1, dst.sound2to1); - ::sg_export(soundPos2, dst.soundPos2); - ::sg_export(soundLoop, dst.soundLoop); - ::sg_export(nextTrain, dst.nextTrain); - ::sg_export(prevTrain, dst.prevTrain); - ::sg_export(pos1, dst.pos1); - ::sg_export(pos2, dst.pos2); - ::sg_export(pos3, dst.pos3); - ::sg_export(sounds, dst.sounds); - ::sg_export(closetarget, dst.closetarget); - ::sg_export(opentarget, dst.opentarget); - ::sg_export(paintarget, dst.paintarget); - ::sg_export(lockCount, dst.lockCount); - ::sg_export(radius, dst.radius); - ::sg_export(wpIndex, dst.wpIndex); - ::sg_export(noise_index, dst.noise_index); - ::sg_export(startRGBA, dst.startRGBA); - ::sg_export(finalRGBA, dst.finalRGBA); - ::sg_export(item, dst.item); - ::sg_export(message, dst.message); - ::sg_export(lightLevel, dst.lightLevel); - ::sg_export(forcePushTime, dst.forcePushTime); - ::sg_export(forcePuller, dst.forcePuller); + saved_game->write<>(s); + saved_game->write(client); + saved_game->write(inuse); + saved_game->write(linked); + saved_game->write(svFlags); + saved_game->write(bmodel); + saved_game->write(mins); + saved_game->write(maxs); + saved_game->write(contents); + saved_game->write(absmin); + saved_game->write(absmax); + saved_game->write(currentOrigin); + saved_game->write(currentAngles); + saved_game->write(owner); + saved_game->write<>(ghoul2); + saved_game->write(modelScale); + saved_game->write(classname); + saved_game->write(spawnflags); + saved_game->write(flags); + saved_game->write(model); + saved_game->write(model2); + saved_game->write(freetime); + saved_game->write(eventTime); + saved_game->write(freeAfterEvent); + saved_game->write(physicsBounce); + saved_game->write(clipmask); + saved_game->write(speed); + saved_game->write(resultspeed); + saved_game->write(lastMoveTime); + saved_game->write(movedir); + saved_game->write(lastOrigin); + saved_game->write(lastAngles); + saved_game->write(mass); + saved_game->write(lastImpact); + saved_game->write(watertype); + saved_game->write(waterlevel); + saved_game->write(wupdate); + saved_game->write(prev_waterlevel); + saved_game->write(angle); + saved_game->write(target); + saved_game->write(target2); + saved_game->write(target3); + saved_game->write(target4); + saved_game->write(targetJump); + saved_game->write(targetname); + saved_game->write(team); + saved_game->write(roff); + saved_game->write(roff_ctr); + saved_game->write(next_roff_time); + saved_game->write(fx_time); + saved_game->write(nextthink); + saved_game->write(e_ThinkFunc); + saved_game->write(e_clThinkFunc); + saved_game->write(e_ReachedFunc); + saved_game->write(e_BlockedFunc); + saved_game->write(e_TouchFunc); + saved_game->write(e_UseFunc); + saved_game->write(e_PainFunc); + saved_game->write(e_DieFunc); + saved_game->write(health); + saved_game->write(max_health); + saved_game->write(takedamage); + saved_game->write(material); + saved_game->write(damage); + saved_game->write(dflags); + saved_game->write(splashDamage); + saved_game->write(splashRadius); + saved_game->write(methodOfDeath); + saved_game->write(splashMethodOfDeath); + saved_game->write(locationDamage); + saved_game->write(chain); + saved_game->write(enemy); + saved_game->write(activator); + saved_game->write(teamchain); + saved_game->write(teammaster); + saved_game->write(lastEnemy); + saved_game->write(wait); + saved_game->write(random); + saved_game->write(delay); + saved_game->write(alt_fire); + saved_game->write(count); + saved_game->write(bounceCount); + saved_game->write(fly_sound_debounce_time); + saved_game->write(painDebounceTime); + saved_game->write(disconnectDebounceTime); + saved_game->write(attackDebounceTime); + saved_game->write(pushDebounceTime); + saved_game->write(aimDebounceTime); + saved_game->write(useDebounceTime); + saved_game->write(trigger_formation); + saved_game->write(spawnContents); + saved_game->write(waypoint); + saved_game->write(wayedge); + saved_game->write(lastWaypoint); + saved_game->write(lastInAirTime); + saved_game->write(noWaypointTime); + saved_game->write(combatPoint); + saved_game->write(followPos); + saved_game->write(followPosRecalcTime); + saved_game->write(followPosWaypoint); + saved_game->write(loopAnim); + saved_game->write(startFrame); + saved_game->write(endFrame); + saved_game->write(m_iIcarusID); + saved_game->write(taskID); + saved_game->write(parms); + saved_game->write(behaviorSet); + saved_game->write(script_targetname); + saved_game->write(delayScriptTime); + saved_game->write(soundSet); + saved_game->write(setTime); + saved_game->write(cameraGroup); + saved_game->write(noDamageTeam); + saved_game->write(playerModel); + saved_game->write(weaponModel); + saved_game->write(handRBolt); + saved_game->write(handLBolt); + saved_game->write(headBolt); + saved_game->write(cervicalBolt); + saved_game->write(chestBolt); + saved_game->write(gutBolt); + saved_game->write(torsoBolt); + saved_game->write(crotchBolt); + saved_game->write(motionBolt); + saved_game->write(kneeLBolt); + saved_game->write(kneeRBolt); + saved_game->write(elbowLBolt); + saved_game->write(elbowRBolt); + saved_game->write(footLBolt); + saved_game->write(footRBolt); + saved_game->write(faceBone); + saved_game->write(craniumBone); + saved_game->write(cervicalBone); + saved_game->write(thoracicBone); + saved_game->write(upperLumbarBone); + saved_game->write(lowerLumbarBone); + saved_game->write(hipsBone); + saved_game->write(motionBone); + saved_game->write(rootBone); + saved_game->write(footLBone); + saved_game->write(footRBone); + saved_game->write(humerusRBone); + saved_game->write(genericBone1); + saved_game->write(genericBone2); + saved_game->write(genericBone3); + saved_game->write(genericBolt1); + saved_game->write(genericBolt2); + saved_game->write(genericBolt3); + saved_game->write(genericBolt4); + saved_game->write(genericBolt5); + saved_game->write(cinematicModel); + saved_game->write(m_pVehicle); + saved_game->write(NPC); + saved_game->write(ownername); + saved_game->write(cantHitEnemyCounter); + saved_game->write(NPC_type); + saved_game->write(NPC_targetname); + saved_game->write(NPC_target); + saved_game->write(moverState); + saved_game->write(soundPos1); + saved_game->write(sound1to2); + saved_game->write(sound2to1); + saved_game->write(soundPos2); + saved_game->write(soundLoop); + saved_game->write(nextTrain); + saved_game->write(prevTrain); + saved_game->write(pos1); + saved_game->write(pos2); + saved_game->write(pos3); + saved_game->write(sounds); + saved_game->write(closetarget); + saved_game->write(opentarget); + saved_game->write(paintarget); + saved_game->write(lockCount); + saved_game->write(radius); + saved_game->write(wpIndex); + saved_game->write(noise_index); + saved_game->write(startRGBA); + saved_game->write(finalRGBA); + saved_game->write(item); + saved_game->write(message); + saved_game->write(lightLevel); + saved_game->write(forcePushTime); + saved_game->write(forcePuller); } void gentity_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.s, s); - ::sg_import(src.client, client); - ::sg_import(src.inuse, inuse); - ::sg_import(src.linked, linked); - ::sg_import(src.svFlags, svFlags); - ::sg_import(src.bmodel, bmodel); - ::sg_import(src.mins, mins); - ::sg_import(src.maxs, maxs); - ::sg_import(src.contents, contents); - ::sg_import(src.absmin, absmin); - ::sg_import(src.absmax, absmax); - ::sg_import(src.currentOrigin, currentOrigin); - ::sg_import(src.currentAngles, currentAngles); - ::sg_import(src.owner, owner); - ::sg_import(src.ghoul2, ghoul2); - ::sg_import(src.modelScale, modelScale); - ::sg_import(src.classname, classname); - ::sg_import(src.spawnflags, spawnflags); - ::sg_import(src.flags, flags); - ::sg_import(src.model, model); - ::sg_import(src.model2, model2); - ::sg_import(src.freetime, freetime); - ::sg_import(src.eventTime, eventTime); - ::sg_import(src.freeAfterEvent, freeAfterEvent); - ::sg_import(src.physicsBounce, physicsBounce); - ::sg_import(src.clipmask, clipmask); - ::sg_import(src.speed, speed); - ::sg_import(src.resultspeed, resultspeed); - ::sg_import(src.lastMoveTime, lastMoveTime); - ::sg_import(src.movedir, movedir); - ::sg_import(src.lastOrigin, lastOrigin); - ::sg_import(src.lastAngles, lastAngles); - ::sg_import(src.mass, mass); - ::sg_import(src.lastImpact, lastImpact); - ::sg_import(src.watertype, watertype); - ::sg_import(src.waterlevel, waterlevel); - ::sg_import(src.wupdate, wupdate); - ::sg_import(src.prev_waterlevel, prev_waterlevel); - ::sg_import(src.angle, angle); - ::sg_import(src.target, target); - ::sg_import(src.target2, target2); - ::sg_import(src.target3, target3); - ::sg_import(src.target4, target4); - ::sg_import(src.targetJump, targetJump); - ::sg_import(src.targetname, targetname); - ::sg_import(src.team, team); - ::sg_import(src.roff, roff); - ::sg_import(src.roff_ctr, roff_ctr); - ::sg_import(src.next_roff_time, next_roff_time); - ::sg_import(src.fx_time, fx_time); - ::sg_import(src.nextthink, nextthink); - ::sg_import(src.e_ThinkFunc, e_ThinkFunc); - ::sg_import(src.e_clThinkFunc, e_clThinkFunc); - ::sg_import(src.e_ReachedFunc, e_ReachedFunc); - ::sg_import(src.e_BlockedFunc, e_BlockedFunc); - ::sg_import(src.e_TouchFunc, e_TouchFunc); - ::sg_import(src.e_UseFunc, e_UseFunc); - ::sg_import(src.e_PainFunc, e_PainFunc); - ::sg_import(src.e_DieFunc, e_DieFunc); - ::sg_import(src.health, health); - ::sg_import(src.max_health, max_health); - ::sg_import(src.takedamage, takedamage); - ::sg_import(src.material, material); - ::sg_import(src.damage, damage); - ::sg_import(src.dflags, dflags); - ::sg_import(src.splashDamage, splashDamage); - ::sg_import(src.splashRadius, splashRadius); - ::sg_import(src.methodOfDeath, methodOfDeath); - ::sg_import(src.splashMethodOfDeath, splashMethodOfDeath); - ::sg_import(src.locationDamage, locationDamage); - ::sg_import(src.chain, chain); - ::sg_import(src.enemy, enemy); - ::sg_import(src.activator, activator); - ::sg_import(src.teamchain, teamchain); - ::sg_import(src.teammaster, teammaster); - ::sg_import(src.lastEnemy, lastEnemy); - ::sg_import(src.wait, wait); - ::sg_import(src.random, random); - ::sg_import(src.delay, delay); - ::sg_import(src.alt_fire, alt_fire); - ::sg_import(src.count, count); - ::sg_import(src.bounceCount, bounceCount); - ::sg_import(src.fly_sound_debounce_time, fly_sound_debounce_time); - ::sg_import(src.painDebounceTime, painDebounceTime); - ::sg_import(src.disconnectDebounceTime, disconnectDebounceTime); - ::sg_import(src.attackDebounceTime, attackDebounceTime); - ::sg_import(src.pushDebounceTime, pushDebounceTime); - ::sg_import(src.aimDebounceTime, aimDebounceTime); - ::sg_import(src.useDebounceTime, useDebounceTime); - ::sg_import(src.trigger_formation, trigger_formation); - ::sg_import(src.spawnContents, spawnContents); - ::sg_import(src.waypoint, waypoint); - ::sg_import(src.wayedge, wayedge); - ::sg_import(src.lastWaypoint, lastWaypoint); - ::sg_import(src.lastInAirTime, lastInAirTime); - ::sg_import(src.noWaypointTime, noWaypointTime); - ::sg_import(src.combatPoint, combatPoint); - ::sg_import(src.followPos, followPos); - ::sg_import(src.followPosRecalcTime, followPosRecalcTime); - ::sg_import(src.followPosWaypoint, followPosWaypoint); - ::sg_import(src.loopAnim, loopAnim); - ::sg_import(src.startFrame, startFrame); - ::sg_import(src.endFrame, endFrame); - ::sg_import(src.m_iIcarusID, m_iIcarusID); - ::sg_import(src.taskID, taskID); - ::sg_import(src.parms, parms); - ::sg_import(src.behaviorSet, behaviorSet); - ::sg_import(src.script_targetname, script_targetname); - ::sg_import(src.delayScriptTime, delayScriptTime); - ::sg_import(src.soundSet, soundSet); - ::sg_import(src.setTime, setTime); - ::sg_import(src.cameraGroup, cameraGroup); - ::sg_import(src.noDamageTeam, noDamageTeam); - ::sg_import(src.playerModel, playerModel); - ::sg_import(src.weaponModel, weaponModel); - ::sg_import(src.handRBolt, handRBolt); - ::sg_import(src.handLBolt, handLBolt); - ::sg_import(src.headBolt, headBolt); - ::sg_import(src.cervicalBolt, cervicalBolt); - ::sg_import(src.chestBolt, chestBolt); - ::sg_import(src.gutBolt, gutBolt); - ::sg_import(src.torsoBolt, torsoBolt); - ::sg_import(src.crotchBolt, crotchBolt); - ::sg_import(src.motionBolt, motionBolt); - ::sg_import(src.kneeLBolt, kneeLBolt); - ::sg_import(src.kneeRBolt, kneeRBolt); - ::sg_import(src.elbowLBolt, elbowLBolt); - ::sg_import(src.elbowRBolt, elbowRBolt); - ::sg_import(src.footLBolt, footLBolt); - ::sg_import(src.footRBolt, footRBolt); - ::sg_import(src.faceBone, faceBone); - ::sg_import(src.craniumBone, craniumBone); - ::sg_import(src.cervicalBone, cervicalBone); - ::sg_import(src.thoracicBone, thoracicBone); - ::sg_import(src.upperLumbarBone, upperLumbarBone); - ::sg_import(src.lowerLumbarBone, lowerLumbarBone); - ::sg_import(src.hipsBone, hipsBone); - ::sg_import(src.motionBone, motionBone); - ::sg_import(src.rootBone, rootBone); - ::sg_import(src.footLBone, footLBone); - ::sg_import(src.footRBone, footRBone); - ::sg_import(src.humerusRBone, humerusRBone); - ::sg_import(src.genericBone1, genericBone1); - ::sg_import(src.genericBone2, genericBone2); - ::sg_import(src.genericBone3, genericBone3); - ::sg_import(src.genericBolt1, genericBolt1); - ::sg_import(src.genericBolt2, genericBolt2); - ::sg_import(src.genericBolt3, genericBolt3); - ::sg_import(src.genericBolt4, genericBolt4); - ::sg_import(src.genericBolt5, genericBolt5); - ::sg_import(src.cinematicModel, cinematicModel); - ::sg_import(src.m_pVehicle, m_pVehicle); - ::sg_import(src.NPC, NPC); - ::sg_import(src.ownername, ownername); - ::sg_import(src.cantHitEnemyCounter, cantHitEnemyCounter); - ::sg_import(src.NPC_type, NPC_type); - ::sg_import(src.NPC_targetname, NPC_targetname); - ::sg_import(src.NPC_target, NPC_target); - ::sg_import(src.moverState, moverState); - ::sg_import(src.soundPos1, soundPos1); - ::sg_import(src.sound1to2, sound1to2); - ::sg_import(src.sound2to1, sound2to1); - ::sg_import(src.soundPos2, soundPos2); - ::sg_import(src.soundLoop, soundLoop); - ::sg_import(src.nextTrain, nextTrain); - ::sg_import(src.prevTrain, prevTrain); - ::sg_import(src.pos1, pos1); - ::sg_import(src.pos2, pos2); - ::sg_import(src.pos3, pos3); - ::sg_import(src.sounds, sounds); - ::sg_import(src.closetarget, closetarget); - ::sg_import(src.opentarget, opentarget); - ::sg_import(src.paintarget, paintarget); - ::sg_import(src.lockCount, lockCount); - ::sg_import(src.radius, radius); - ::sg_import(src.wpIndex, wpIndex); - ::sg_import(src.noise_index, noise_index); - ::sg_import(src.startRGBA, startRGBA); - ::sg_import(src.finalRGBA, finalRGBA); - ::sg_import(src.item, item); - ::sg_import(src.message, message); - ::sg_import(src.lightLevel, lightLevel); - ::sg_import(src.forcePushTime, forcePushTime); - ::sg_import(src.forcePuller, forcePuller); + saved_game->read<>(s); + saved_game->read(client); + saved_game->read(inuse); + saved_game->read(linked); + saved_game->read(svFlags); + saved_game->read(bmodel); + saved_game->read(mins); + saved_game->read(maxs); + saved_game->read(contents); + saved_game->read(absmin); + saved_game->read(absmax); + saved_game->read(currentOrigin); + saved_game->read(currentAngles); + saved_game->read(owner); + saved_game->read<>(ghoul2); + saved_game->read(modelScale); + saved_game->read(classname); + saved_game->read(spawnflags); + saved_game->read(flags); + saved_game->read(model); + saved_game->read(model2); + saved_game->read(freetime); + saved_game->read(eventTime); + saved_game->read(freeAfterEvent); + saved_game->read(physicsBounce); + saved_game->read(clipmask); + saved_game->read(speed); + saved_game->read(resultspeed); + saved_game->read(lastMoveTime); + saved_game->read(movedir); + saved_game->read(lastOrigin); + saved_game->read(lastAngles); + saved_game->read(mass); + saved_game->read(lastImpact); + saved_game->read(watertype); + saved_game->read(waterlevel); + saved_game->read(wupdate); + saved_game->read(prev_waterlevel); + saved_game->read(angle); + saved_game->read(target); + saved_game->read(target2); + saved_game->read(target3); + saved_game->read(target4); + saved_game->read(targetJump); + saved_game->read(targetname); + saved_game->read(team); + saved_game->read(roff); + saved_game->read(roff_ctr); + saved_game->read(next_roff_time); + saved_game->read(fx_time); + saved_game->read(nextthink); + saved_game->read(e_ThinkFunc); + saved_game->read(e_clThinkFunc); + saved_game->read(e_ReachedFunc); + saved_game->read(e_BlockedFunc); + saved_game->read(e_TouchFunc); + saved_game->read(e_UseFunc); + saved_game->read(e_PainFunc); + saved_game->read(e_DieFunc); + saved_game->read(health); + saved_game->read(max_health); + saved_game->read(takedamage); + saved_game->read(material); + saved_game->read(damage); + saved_game->read(dflags); + saved_game->read(splashDamage); + saved_game->read(splashRadius); + saved_game->read(methodOfDeath); + saved_game->read(splashMethodOfDeath); + saved_game->read(locationDamage); + saved_game->read(chain); + saved_game->read(enemy); + saved_game->read(activator); + saved_game->read(teamchain); + saved_game->read(teammaster); + saved_game->read(lastEnemy); + saved_game->read(wait); + saved_game->read(random); + saved_game->read(delay); + saved_game->read(alt_fire); + saved_game->read(count); + saved_game->read(bounceCount); + saved_game->read(fly_sound_debounce_time); + saved_game->read(painDebounceTime); + saved_game->read(disconnectDebounceTime); + saved_game->read(attackDebounceTime); + saved_game->read(pushDebounceTime); + saved_game->read(aimDebounceTime); + saved_game->read(useDebounceTime); + saved_game->read(trigger_formation); + saved_game->read(spawnContents); + saved_game->read(waypoint); + saved_game->read(wayedge); + saved_game->read(lastWaypoint); + saved_game->read(lastInAirTime); + saved_game->read(noWaypointTime); + saved_game->read(combatPoint); + saved_game->read(followPos); + saved_game->read(followPosRecalcTime); + saved_game->read(followPosWaypoint); + saved_game->read(loopAnim); + saved_game->read(startFrame); + saved_game->read(endFrame); + saved_game->read(m_iIcarusID); + saved_game->read(taskID); + saved_game->read(parms); + saved_game->read(behaviorSet); + saved_game->read(script_targetname); + saved_game->read(delayScriptTime); + saved_game->read(soundSet); + saved_game->read(setTime); + saved_game->read(cameraGroup); + saved_game->read(noDamageTeam); + saved_game->read(playerModel); + saved_game->read(weaponModel); + saved_game->read(handRBolt); + saved_game->read(handLBolt); + saved_game->read(headBolt); + saved_game->read(cervicalBolt); + saved_game->read(chestBolt); + saved_game->read(gutBolt); + saved_game->read(torsoBolt); + saved_game->read(crotchBolt); + saved_game->read(motionBolt); + saved_game->read(kneeLBolt); + saved_game->read(kneeRBolt); + saved_game->read(elbowLBolt); + saved_game->read(elbowRBolt); + saved_game->read(footLBolt); + saved_game->read(footRBolt); + saved_game->read(faceBone); + saved_game->read(craniumBone); + saved_game->read(cervicalBone); + saved_game->read(thoracicBone); + saved_game->read(upperLumbarBone); + saved_game->read(lowerLumbarBone); + saved_game->read(hipsBone); + saved_game->read(motionBone); + saved_game->read(rootBone); + saved_game->read(footLBone); + saved_game->read(footRBone); + saved_game->read(humerusRBone); + saved_game->read(genericBone1); + saved_game->read(genericBone2); + saved_game->read(genericBone3); + saved_game->read(genericBolt1); + saved_game->read(genericBolt2); + saved_game->read(genericBolt3); + saved_game->read(genericBolt4); + saved_game->read(genericBolt5); + saved_game->read(cinematicModel); + saved_game->read(m_pVehicle); + saved_game->read(NPC); + saved_game->read(ownername); + saved_game->read(cantHitEnemyCounter); + saved_game->read(NPC_type); + saved_game->read(NPC_targetname); + saved_game->read(NPC_target); + saved_game->read(moverState); + saved_game->read(soundPos1); + saved_game->read(sound1to2); + saved_game->read(sound2to1); + saved_game->read(soundPos2); + saved_game->read(soundLoop); + saved_game->read(nextTrain); + saved_game->read(prevTrain); + saved_game->read(pos1); + saved_game->read(pos2); + saved_game->read(pos3); + saved_game->read(sounds); + saved_game->read(closetarget); + saved_game->read(opentarget); + saved_game->read(paintarget); + saved_game->read(lockCount); + saved_game->read(radius); + saved_game->read(wpIndex); + saved_game->read(noise_index); + saved_game->read(startRGBA); + saved_game->read(finalRGBA); + saved_game->read(item); + saved_game->read(message); + saved_game->read(lightLevel); + saved_game->read(forcePushTime); + saved_game->read(forcePuller); } void CGhoul2Info_v::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(mItem, dst.mItem); + saved_game->write(mItem); } void CGhoul2Info_v::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_export(src.mItem, mItem); + saved_game->write(mItem); } diff --git a/code/game/g_shared.h b/code/game/g_shared.h index c58113ceda..133adc2700 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -91,34 +91,7 @@ typedef enum //# material_e #define MAX_CUSTOM_JEDI_SOUNDS 22 #define MAX_CUSTOM_SOUNDS (MAX_CUSTOM_JEDI_SOUNDS + MAX_CUSTOM_EXTRA_SOUNDS + MAX_CUSTOM_COMBAT_SOUNDS + MAX_CUSTOM_BASIC_SOUNDS) // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgClientInfo -{ -public: - int32_t infoValid; - SgArray name; - int32_t team; - int32_t score; - int32_t handicap; - int32_t legsModel; - int32_t legsSkin; - int32_t torsoModel; - int32_t torsoSkin; - int32_t headModel; - int32_t headSkin; - int32_t animFileIndex; - SgArray sounds; - int32_t customBasicSoundDir; - int32_t customCombatSoundDir; - int32_t customExtraSoundDir; - int32_t customJediSoundDir; -}; // SgClientInfo -#pragma pack(pop) - typedef struct { - using SgType = SgClientInfo; - - qboolean infoValid; char name[MAX_QPATH]; @@ -148,10 +121,10 @@ typedef struct { void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } clientInfo_t; @@ -184,70 +157,8 @@ typedef enum #define RF_LOCKEDANGLE 1 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgRenderInfo -{ -public: - SgArray legsModelName; - SgArray torsoModelName; - SgArray headModelName; - int32_t headYawRangeLeft; - int32_t headYawRangeRight; - int32_t headPitchRangeUp; - int32_t headPitchRangeDown; - int32_t torsoYawRangeLeft; - int32_t torsoYawRangeRight; - int32_t torsoPitchRangeUp; - int32_t torsoPitchRangeDown; - int32_t legsFrame; - int32_t torsoFrame; - float legsFpsMod; - float torsoFpsMod; - SgArray customRGBA; - int32_t boneIndex1; - int32_t boneIndex2; - int32_t boneIndex3; - int32_t boneIndex4; - int32_t boneOrient; - SgVec3 boneAngles1; - SgVec3 boneAngles2; - SgVec3 boneAngles3; - SgVec3 boneAngles4; - int32_t renderFlags; - SgVec3 muzzlePoint; - SgVec3 muzzleDir; - SgVec3 muzzlePointOld; - SgVec3 muzzleDirOld; - int32_t mPCalcTime; - float lockYaw; - SgVec3 headPoint; - SgVec3 headAngles; - SgVec3 handRPoint; - SgVec3 handLPoint; - SgVec3 crotchPoint; - SgVec3 footRPoint; - SgVec3 footLPoint; - SgVec3 torsoPoint; - SgVec3 torsoAngles; - SgVec3 eyePoint; - SgVec3 eyeAngles; - int32_t lookTarget; - int32_t lookMode; - int32_t lookTargetClearTime; - int32_t lastVoiceVolume; - SgVec3 lastHeadAngles; - SgVec3 headBobAngles; - SgVec3 targetHeadBobAngles; - int32_t lookingDebounceTime; - float legsYaw; -}; // SgRenderInfo -#pragma pack(pop) - typedef struct renderInfo_s { - using SgType = SgRenderInfo; - - // Legs model, or full model on one piece entities union @@ -338,10 +249,10 @@ typedef struct renderInfo_s void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } renderInfo_t; // Movement information structure @@ -370,28 +281,7 @@ typedef enum { } playerTeamStateState_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgPlayerTeamState -{ -public: - int32_t state; - int32_t captures; - int32_t basedefense; - int32_t carrierdefense; - int32_t flagrecovery; - int32_t fragcarrier; - int32_t assists; - float lasthurtcarrier; - float lastreturnedflag; - float flagsince; - float lastfraggedcarrier; -}; // SgPlayerTeamState -#pragma pack(pop) - typedef struct { - using SgType = SgPlayerTeamState; - - playerTeamStateState_t state; int captures; @@ -408,68 +298,32 @@ typedef struct { void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } playerTeamState_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgObjectives -{ -public: - int32_t display; - int32_t status; -}; // SgObjectives -#pragma pack(pop) - typedef struct objectives_s { - using SgType = SgObjectives; - - qboolean display; // A displayable objective? int status; // Succeed or fail or pending void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } objectives_t; // NOTE: This is an arbitrary number greater than our current number of objectives with // some fluff just in case we add more in the future. #define MAX_MISSION_OBJ 100 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgMissionStats -{ -public: - int32_t secretsFound; - int32_t totalSecrets; - int32_t shotsFired; - int32_t hits; - int32_t enemiesSpawned; - int32_t enemiesKilled; - int32_t saberThrownCnt; - int32_t saberBlocksCnt; - int32_t legAttacksCnt; - int32_t armAttacksCnt; - int32_t torsoAttacksCnt; - int32_t otherAttacksCnt; - SgArray forceUsed; - SgArray weaponUsed; -}; // SgMissionStats -#pragma pack(pop) - typedef struct missionStats_s { - using SgType = SgMissionStats; - - int secretsFound; // # of secret areas found int totalSecrets; // # of secret areas that could have been found int shotsFired; // total number of shots fired @@ -487,10 +341,10 @@ typedef struct missionStats_s void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } missionStats_t; // the auto following clients don't follow a specific client @@ -505,20 +359,7 @@ typedef struct missionStats_s // // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! #pragma pack(push, 4) -class SgClientSession -{ -public: - int32_t missionObjectivesShown; - int32_t sessionTeam; - SgArray mission_objectives; - SgMissionStats missionStats; -}; // SgClientSession -#pragma pack(pop) - typedef struct { - using SgType = SgClientSession; - - int missionObjectivesShown; // Number of times mission objectives have been updated team_t sessionTeam; objectives_t mission_objectives[MAX_MISSION_OBJ]; @@ -526,33 +367,16 @@ typedef struct { void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } clientSession_t; // client data that stays across multiple respawns, but is cleared // on each level change or team change at ClientBegin() // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgClientPersistant -{ -public: - int32_t connected; - SgUserCmd lastCommand; - SgArray netname; - int32_t maxHealth; - int32_t enterTime; - SgArray cmd_angles; - SgPlayerTeamState teamState; -}; // SgClientPersistant -#pragma pack(pop) - typedef struct { - using SgType = SgClientPersistant; - - clientConnected_t connected; usercmd_t lastCommand; char netname[34]; @@ -564,10 +388,10 @@ typedef struct { void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } clientPersistant_t; typedef enum { @@ -605,77 +429,7 @@ typedef enum //# movetype_e // this structure is cleared on each ClientSpawn(), // except for 'client->pers' and 'client->sess' -#pragma pack(push, 4) -class SgGClient -{ -public: - SgPlayerState ps; - SgClientPersistant pers; - SgClientSession sess; - int32_t lastCmdTime; - SgUserCmd usercmd; - int32_t buttons; - int32_t oldbuttons; - int32_t latched_buttons; - int32_t damage_armor; - int32_t damage_blood; - SgVec3 damage_from; - int8_t damage_fromWorld; - int8_t noclip; - int8_t forced_forwardmove; - int8_t forced_rightmove; - int32_t respawnTime; - int32_t idleTime; - int32_t airOutTime; - int32_t timeResidual; - float facial_blink; - float facial_timer; - int32_t facial_anim; - SgClientInfo clientInfo; - int32_t moveType; - int32_t jetPackTime; - int32_t fireDelay; - int32_t breathPuffTime; - int32_t playerTeam; - int32_t enemyTeam; - int32_t leader; - int32_t NPC_class; - float hiddenDist; - SgVec3 hiddenDir; - SgRenderInfo renderInfo; - int8_t dismembered; - int8_t dismemberProbLegs; - int8_t dismemberProbHead; - int8_t dismemberProbArms; - int8_t dismemberProbHands; - int8_t dismemberProbWaist; - int32_t standheight; - int32_t crouchheight; - int32_t poisonDamage; - int32_t poisonTime; - int32_t slopeRecalcTime; - SgVec3 pushVec; - int32_t pushVecTime; - int32_t noRagTime; - int32_t isRagging; - int32_t overridingBones; - SgVec3 ragLastOrigin; - int32_t ragLastOriginTime; - int32_t pushEffectFadeTime; - SgVec3 pushEffectOrigin; - int32_t rocketLockIndex; - float rocketLastValidTime; - float rocketLockTime; - float rocketTargetTime; - int32_t inSpaceSuffocation; - int32_t inSpaceIndex; -}; // SgGClient -#pragma pack(pop) - struct gclient_s { - using SgType = SgGClient; - - // ps MUST be the first element, because the server expects it playerState_t ps; // communicated by server to clients @@ -779,36 +533,25 @@ struct gclient_s { void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); }; #define MAX_PARMS 16 #define MAX_PARM_STRING_LENGTH MAX_QPATH//was 16, had to lengthen it so they could take a valid file path -#pragma pack(push, 4) -class SgParms -{ -public: - SgArray2d parm; -}; // SgParms -#pragma pack(pop) - typedef struct { - using SgType = SgParms; - - char parm[MAX_PARMS][MAX_PARM_STRING_LENGTH]; void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } parms_t; #ifdef GAME_INCLUDE @@ -828,201 +571,7 @@ typedef struct typedef struct centity_s centity_t; // !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!!!!! -#pragma pack(push, 4) -class SgGEntity -{ -public: - SgEntityState s; - int32_t client; - int32_t inuse; - int32_t linked; - int32_t svFlags; - int32_t bmodel; - SgVec3 mins; - SgVec3 maxs; - int32_t contents; - SgVec3 absmin; - SgVec3 absmax; - SgVec3 currentOrigin; - SgVec3 currentAngles; - int32_t owner; - SgCGhoul2InfoV ghoul2; - SgVec3 modelScale; - int32_t classname; - int32_t spawnflags; - int32_t flags; - int32_t model; - int32_t model2; - int32_t freetime; - int32_t eventTime; - int32_t freeAfterEvent; - float physicsBounce; - int32_t clipmask; - float speed; - float resultspeed; - int32_t lastMoveTime; - SgVec3 movedir; - SgVec3 lastOrigin; - SgVec3 lastAngles; - float mass; - int32_t lastImpact; - int32_t watertype; - int32_t waterlevel; - int16_t wupdate; - int16_t prev_waterlevel; - float angle; - int32_t target; - int32_t target2; - int32_t target3; - int32_t target4; - int32_t targetJump; - int32_t targetname; - int32_t team; - int32_t roff; - int32_t roff_ctr; - int32_t next_roff_time; - int32_t fx_time; - int32_t nextthink; - int32_t e_ThinkFunc; - int32_t e_clThinkFunc; - int32_t e_ReachedFunc; - int32_t e_BlockedFunc; - int32_t e_TouchFunc; - int32_t e_UseFunc; - int32_t e_PainFunc; - int32_t e_DieFunc; - int32_t health; - int32_t max_health; - int32_t takedamage; - int32_t material; - int32_t damage; - int32_t dflags; - int32_t splashDamage; - int32_t splashRadius; - int32_t methodOfDeath; - int32_t splashMethodOfDeath; - SgArray locationDamage; - int32_t chain; - int32_t enemy; - int32_t activator; - int32_t teamchain; - int32_t teammaster; - int32_t lastEnemy; - float wait; - float random; - int32_t delay; - int32_t alt_fire; - int32_t count; - int32_t bounceCount; - int32_t fly_sound_debounce_time; - int32_t painDebounceTime; - int32_t disconnectDebounceTime; - int32_t attackDebounceTime; - int32_t pushDebounceTime; - int32_t aimDebounceTime; - int32_t useDebounceTime; - int32_t trigger_formation; - int32_t spawnContents; - int32_t waypoint; - int32_t wayedge; - int32_t lastWaypoint; - int32_t lastInAirTime; - int32_t noWaypointTime; - int32_t combatPoint; - SgVec3 followPos; - int32_t followPosRecalcTime; - int32_t followPosWaypoint; - int32_t loopAnim; - int32_t startFrame; - int32_t endFrame; - int32_t m_iIcarusID; - SgArray taskID; - int32_t parms; - SgArray behaviorSet; - int32_t script_targetname; - int32_t delayScriptTime; - int32_t soundSet; - int32_t setTime; - int32_t cameraGroup; - int32_t noDamageTeam; - int16_t playerModel; - SgArray weaponModel; - int16_t handRBolt; - int16_t handLBolt; - int16_t headBolt; - int16_t cervicalBolt; - int16_t chestBolt; - int16_t gutBolt; - int16_t torsoBolt; - int16_t crotchBolt; - int16_t motionBolt; - int16_t kneeLBolt; - int16_t kneeRBolt; - int16_t elbowLBolt; - int16_t elbowRBolt; - int16_t footLBolt; - int16_t footRBolt; - int16_t faceBone; - int16_t craniumBone; - int16_t cervicalBone; - int16_t thoracicBone; - int16_t upperLumbarBone; - int16_t lowerLumbarBone; - int16_t hipsBone; - int16_t motionBone; - int16_t rootBone; - int16_t footLBone; - int16_t footRBone; - int16_t humerusRBone; - int16_t genericBone1; - int16_t genericBone2; - int16_t genericBone3; - int16_t genericBolt1; - int16_t genericBolt2; - int16_t genericBolt3; - int16_t genericBolt4; - int16_t genericBolt5; - int32_t cinematicModel; - int32_t m_pVehicle; - int32_t NPC; - int32_t ownername; - int32_t cantHitEnemyCounter; - int32_t NPC_type; - int32_t NPC_targetname; - int32_t NPC_target; - int32_t moverState; - int32_t soundPos1; - int32_t sound1to2; - int32_t sound2to1; - int32_t soundPos2; - int32_t soundLoop; - int32_t nextTrain; - int32_t prevTrain; - SgVec3 pos1; - SgVec3 pos2; - SgVec3 pos3; - int32_t sounds; - int32_t closetarget; - int32_t opentarget; - int32_t paintarget; - int32_t lockCount; - float radius; - int32_t wpIndex; - int32_t noise_index; - SgVec4 startRGBA; - SgVec4 finalRGBA; - int32_t item; - int32_t message; - float lightLevel; - int32_t forcePushTime; - int32_t forcePuller; -}; // SgGEntity -#pragma pack(pop) - struct gentity_s { - using SgType = SgGEntity; - - entityState_t s; // communicated by server to clients struct gclient_s *client; // NULL if not a player (unless it's NPC ( if (this->NPC != NULL) ) ... -slc) qboolean inuse; @@ -1336,10 +885,10 @@ Ghoul2 Insert End void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); }; #endif //#ifdef GAME_INCLUDE diff --git a/code/game/g_vehicles.cpp b/code/game/g_vehicles.cpp index fb072daf9c..7bda5bbeb6 100644 --- a/code/game/g_vehicles.cpp +++ b/code/game/g_vehicles.cpp @@ -22,8 +22,7 @@ along with this program; if not, see . #include "../qcommon/q_shared.h" #include "g_local.h" -#include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_i_saved_game.h" #ifdef _JK2 //SP does not have this preprocessor for game like MP does #ifndef _JK2MP @@ -3212,153 +3211,153 @@ void G_SetSharedVehicleFunctions( vehicleInfo_t *pVehInfo ) void Muzzle::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(m_vMuzzlePos, dst.m_vMuzzlePos); - ::sg_export(m_vMuzzleDir, dst.m_vMuzzleDir); - ::sg_export(m_iMuzzleWait, dst.m_iMuzzleWait); - ::sg_export(m_bFired, dst.m_bFired); + saved_game->write(m_vMuzzlePos); + saved_game->write(m_vMuzzleDir); + saved_game->write(m_iMuzzleWait); + saved_game->write(m_bFired); } void Muzzle::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.m_vMuzzlePos, m_vMuzzlePos); - ::sg_import(src.m_vMuzzleDir, m_vMuzzleDir); - ::sg_import(src.m_iMuzzleWait, m_iMuzzleWait); - ::sg_import(src.m_bFired, m_bFired); + saved_game->read(m_vMuzzlePos); + saved_game->read(m_vMuzzleDir); + saved_game->read(m_iMuzzleWait); + saved_game->read(m_bFired); } void vehWeaponStatus_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(linked, dst.linked); - ::sg_export(ammo, dst.ammo); - ::sg_export(lastAmmoInc, dst.lastAmmoInc); - ::sg_export(nextMuzzle, dst.nextMuzzle); + saved_game->write(linked); + saved_game->write(ammo); + saved_game->write(lastAmmoInc); + saved_game->write(nextMuzzle); } void vehWeaponStatus_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.linked, linked); - ::sg_import(src.ammo, ammo); - ::sg_import(src.lastAmmoInc, lastAmmoInc); - ::sg_import(src.nextMuzzle, nextMuzzle); + saved_game->read(linked); + saved_game->read(ammo); + saved_game->read(lastAmmoInc); + saved_game->read(nextMuzzle); } void vehTurretStatus_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(ammo, dst.ammo); - ::sg_export(lastAmmoInc, dst.lastAmmoInc); - ::sg_export(nextMuzzle, dst.nextMuzzle); - ::sg_export(enemyEntNum, dst.enemyEntNum); - ::sg_export(enemyHoldTime, dst.enemyHoldTime); + saved_game->write(ammo); + saved_game->write(lastAmmoInc); + saved_game->write(nextMuzzle); + saved_game->write(enemyEntNum); + saved_game->write(enemyHoldTime); } void vehTurretStatus_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.ammo, ammo); - ::sg_import(src.lastAmmoInc, lastAmmoInc); - ::sg_import(src.nextMuzzle, nextMuzzle); - ::sg_import(src.enemyEntNum, enemyEntNum); - ::sg_import(src.enemyHoldTime, enemyHoldTime); + saved_game->read(ammo); + saved_game->read(lastAmmoInc); + saved_game->read(nextMuzzle); + saved_game->read(enemyEntNum); + saved_game->read(enemyHoldTime); } void Vehicle_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(m_pPilot, dst.m_pPilot); - ::sg_export(m_iPilotTime, dst.m_iPilotTime); - ::sg_export(m_bHasHadPilot, dst.m_bHasHadPilot); - ::sg_export(m_pDroidUnit, dst.m_pDroidUnit); - ::sg_export(m_pParentEntity, dst.m_pParentEntity); - ::sg_export(m_iBoarding, dst.m_iBoarding); - ::sg_export(m_bWasBoarding, dst.m_bWasBoarding); - ::sg_export(m_vBoardingVelocity, dst.m_vBoardingVelocity); - ::sg_export(m_fTimeModifier, dst.m_fTimeModifier); - ::sg_export(m_iLeftWingBone, dst.m_iLeftWingBone); - ::sg_export(m_iRightWingBone, dst.m_iRightWingBone); - ::sg_export(m_iExhaustTag, dst.m_iExhaustTag); - ::sg_export(m_iMuzzleTag, dst.m_iMuzzleTag); - ::sg_export(m_iDroidUnitTag, dst.m_iDroidUnitTag); - ::sg_export(m_iGunnerViewTag, dst.m_iGunnerViewTag); - ::sg_export(m_Muzzles, dst.m_Muzzles); - ::sg_export(m_ucmd, dst.m_ucmd); - ::sg_export(m_EjectDir, dst.m_EjectDir); - ::sg_export(m_ulFlags, dst.m_ulFlags); - ::sg_export(m_vOrientation, dst.m_vOrientation); - ::sg_export(m_fStrafeTime, dst.m_fStrafeTime); - ::sg_export(m_vPrevOrientation, dst.m_vPrevOrientation); - ::sg_export(m_vAngularVelocity, dst.m_vAngularVelocity); - ::sg_export(m_vFullAngleVelocity, dst.m_vFullAngleVelocity); - ::sg_export(m_iArmor, dst.m_iArmor); - ::sg_export(m_iShields, dst.m_iShields); - ::sg_export(m_iLastFXTime, dst.m_iLastFXTime); - ::sg_export(m_iDieTime, dst.m_iDieTime); - ::sg_export(m_pVehicleInfo, dst.m_pVehicleInfo); - ::sg_export(m_LandTrace, dst.m_LandTrace); - ::sg_export(m_iRemovedSurfaces, dst.m_iRemovedSurfaces); - ::sg_export(m_iTurboTime, dst.m_iTurboTime); - ::sg_export(m_iDropTime, dst.m_iDropTime); - ::sg_export(m_iSoundDebounceTimer, dst.m_iSoundDebounceTimer); - ::sg_export(lastShieldInc, dst.lastShieldInc); - ::sg_export(linkWeaponToggleHeld, dst.linkWeaponToggleHeld); - ::sg_export(weaponStatus, dst.weaponStatus); - ::sg_export(turretStatus, dst.turretStatus); - ::sg_export(m_pOldPilot, dst.m_pOldPilot); - ::sg_export(m_safeJumpMountTime, dst.m_safeJumpMountTime); - ::sg_export(m_safeJumpMountRightDot, dst.m_safeJumpMountRightDot); + saved_game->write(m_pPilot); + saved_game->write(m_iPilotTime); + saved_game->write(m_bHasHadPilot); + saved_game->write(m_pDroidUnit); + saved_game->write(m_pParentEntity); + saved_game->write(m_iBoarding); + saved_game->write(m_bWasBoarding); + saved_game->write(m_vBoardingVelocity); + saved_game->write(m_fTimeModifier); + saved_game->write(m_iLeftWingBone); + saved_game->write(m_iRightWingBone); + saved_game->write(m_iExhaustTag); + saved_game->write(m_iMuzzleTag); + saved_game->write(m_iDroidUnitTag); + saved_game->write(m_iGunnerViewTag); + saved_game->write<>(m_Muzzles); + saved_game->write<>(m_ucmd); + saved_game->write(m_EjectDir); + saved_game->write(m_ulFlags); + saved_game->write(m_vOrientation); + saved_game->write(m_fStrafeTime); + saved_game->write(m_vPrevOrientation); + saved_game->write(m_vAngularVelocity); + saved_game->write(m_vFullAngleVelocity); + saved_game->write(m_iArmor); + saved_game->write(m_iShields); + saved_game->write(m_iLastFXTime); + saved_game->write(m_iDieTime); + saved_game->write(m_pVehicleInfo); + saved_game->write<>(m_LandTrace); + saved_game->write(m_iRemovedSurfaces); + saved_game->write(m_iTurboTime); + saved_game->write(m_iDropTime); + saved_game->write(m_iSoundDebounceTimer); + saved_game->write(lastShieldInc); + saved_game->write(linkWeaponToggleHeld); + saved_game->write<>(weaponStatus); + saved_game->write<>(turretStatus); + saved_game->write(m_pOldPilot); + saved_game->write(m_safeJumpMountTime); + saved_game->write(m_safeJumpMountRightDot); } void Vehicle_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.m_pPilot, m_pPilot); - ::sg_import(src.m_iPilotTime, m_iPilotTime); - ::sg_import(src.m_bHasHadPilot, m_bHasHadPilot); - ::sg_import(src.m_pDroidUnit, m_pDroidUnit); - ::sg_import(src.m_pParentEntity, m_pParentEntity); - ::sg_import(src.m_iBoarding, m_iBoarding); - ::sg_import(src.m_bWasBoarding, m_bWasBoarding); - ::sg_import(src.m_vBoardingVelocity, m_vBoardingVelocity); - ::sg_import(src.m_fTimeModifier, m_fTimeModifier); - ::sg_import(src.m_iLeftWingBone, m_iLeftWingBone); - ::sg_import(src.m_iRightWingBone, m_iRightWingBone); - ::sg_import(src.m_iExhaustTag, m_iExhaustTag); - ::sg_import(src.m_iMuzzleTag, m_iMuzzleTag); - ::sg_import(src.m_iDroidUnitTag, m_iDroidUnitTag); - ::sg_import(src.m_iGunnerViewTag, m_iGunnerViewTag); - ::sg_import(src.m_Muzzles, m_Muzzles); - ::sg_import(src.m_ucmd, m_ucmd); - ::sg_import(src.m_EjectDir, m_EjectDir); - ::sg_import(src.m_ulFlags, m_ulFlags); - ::sg_import(src.m_vOrientation, m_vOrientation); - ::sg_import(src.m_fStrafeTime, m_fStrafeTime); - ::sg_import(src.m_vPrevOrientation, m_vPrevOrientation); - ::sg_import(src.m_vAngularVelocity, m_vAngularVelocity); - ::sg_import(src.m_vFullAngleVelocity, m_vFullAngleVelocity); - ::sg_import(src.m_iArmor, m_iArmor); - ::sg_import(src.m_iShields, m_iShields); - ::sg_import(src.m_iLastFXTime, m_iLastFXTime); - ::sg_import(src.m_iDieTime, m_iDieTime); - ::sg_import(src.m_pVehicleInfo, m_pVehicleInfo); - ::sg_import(src.m_LandTrace, m_LandTrace); - ::sg_import(src.m_iRemovedSurfaces, m_iRemovedSurfaces); - ::sg_import(src.m_iTurboTime, m_iTurboTime); - ::sg_import(src.m_iDropTime, m_iDropTime); - ::sg_import(src.m_iSoundDebounceTimer, m_iSoundDebounceTimer); - ::sg_import(src.lastShieldInc, lastShieldInc); - ::sg_import(src.linkWeaponToggleHeld, linkWeaponToggleHeld); - ::sg_import(src.weaponStatus, weaponStatus); - ::sg_import(src.turretStatus, turretStatus); - ::sg_import(src.m_pOldPilot, m_pOldPilot); - ::sg_import(src.m_safeJumpMountTime, m_safeJumpMountTime); - ::sg_import(src.m_safeJumpMountRightDot, m_safeJumpMountRightDot); + saved_game->read(m_pPilot); + saved_game->read(m_iPilotTime); + saved_game->read(m_bHasHadPilot); + saved_game->read(m_pDroidUnit); + saved_game->read(m_pParentEntity); + saved_game->read(m_iBoarding); + saved_game->read(m_bWasBoarding); + saved_game->read(m_vBoardingVelocity); + saved_game->read(m_fTimeModifier); + saved_game->read(m_iLeftWingBone); + saved_game->read(m_iRightWingBone); + saved_game->read(m_iExhaustTag); + saved_game->read(m_iMuzzleTag); + saved_game->read(m_iDroidUnitTag); + saved_game->read(m_iGunnerViewTag); + saved_game->read<>(m_Muzzles); + saved_game->read<>(m_ucmd); + saved_game->read(m_EjectDir); + saved_game->read(m_ulFlags); + saved_game->read(m_vOrientation); + saved_game->read(m_fStrafeTime); + saved_game->read(m_vPrevOrientation); + saved_game->read(m_vAngularVelocity); + saved_game->read(m_vFullAngleVelocity); + saved_game->read(m_iArmor); + saved_game->read(m_iShields); + saved_game->read(m_iLastFXTime); + saved_game->read(m_iDieTime); + saved_game->read(m_pVehicleInfo); + saved_game->read<>(m_LandTrace); + saved_game->read(m_iRemovedSurfaces); + saved_game->read(m_iTurboTime); + saved_game->read(m_iDropTime); + saved_game->read(m_iSoundDebounceTimer); + saved_game->read(lastShieldInc); + saved_game->read(linkWeaponToggleHeld); + saved_game->read<>(weaponStatus); + saved_game->read<>(turretStatus); + saved_game->read(m_pOldPilot); + saved_game->read(m_safeJumpMountTime); + saved_game->read(m_safeJumpMountRightDot); } diff --git a/code/game/g_vehicles.h b/code/game/g_vehicles.h index 85f97e851c..c59b572872 100644 --- a/code/game/g_vehicles.h +++ b/code/game/g_vehicles.h @@ -453,22 +453,8 @@ enum extern void G_VehicleSpawn( gentity_t *self ); // A vehicle weapon muzzle. -#pragma pack(push, 4) -class SgMuzzle -{ -public: - SgVec3 m_vMuzzlePos; - SgVec3 m_vMuzzleDir; - int32_t m_iMuzzleWait; - int8_t m_bFired; -}; // SgMuzzle -#pragma pack(pop) - struct Muzzle { - using SgType = SgMuzzle; - - // These are updated every frame and represent the current position and direction for the specific muzzle. vec3_t m_vMuzzlePos; vec3_t m_vMuzzleDir; @@ -482,10 +468,10 @@ struct Muzzle void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); }; //defines for impact damage surface stuff @@ -538,10 +524,10 @@ typedef struct void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } vehWeaponStatus_t; #pragma pack(push, 4) @@ -574,68 +560,17 @@ typedef struct void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } vehTurretStatus_t; // This is the implementation of the vehicle interface and any of the other variables needed. This // is what actually represents a vehicle. -AReis. // !!!!!!!!!!!!!!!!!! loadsave affecting structure !!!!!!!!!!!!!!!!!!!!!!! -#pragma pack(push, 4) -class SgVehicle -{ -public: - int32_t m_pPilot; - int32_t m_iPilotTime; - int32_t m_bHasHadPilot; - int32_t m_pDroidUnit; - int32_t m_pParentEntity; - int32_t m_iBoarding; - int8_t m_bWasBoarding; - SgVec3 m_vBoardingVelocity; - float m_fTimeModifier; - int32_t m_iLeftWingBone; - int32_t m_iRightWingBone; - SgArray m_iExhaustTag; - SgArray m_iMuzzleTag; - int32_t m_iDroidUnitTag; - SgArray m_iGunnerViewTag; - SgArray m_Muzzles; - SgUserCmd m_ucmd; - int32_t m_EjectDir; - uint32_t m_ulFlags; - SgVec3 m_vOrientation; - int32_t m_fStrafeTime; - SgVec3 m_vPrevOrientation; - float m_vAngularVelocity; - SgVec3 m_vFullAngleVelocity; - int32_t m_iArmor; - int32_t m_iShields; - int32_t m_iLastFXTime; - int32_t m_iDieTime; - int32_t m_pVehicleInfo; - SgTrace m_LandTrace; - int32_t m_iRemovedSurfaces; - int32_t m_iTurboTime; - int32_t m_iDropTime; - int32_t m_iSoundDebounceTimer; - int32_t lastShieldInc; - int32_t linkWeaponToggleHeld; - SgArray weaponStatus; - SgArray turretStatus; - int32_t m_pOldPilot; - int32_t m_safeJumpMountTime; - float m_safeJumpMountRightDot; -}; // SgVehicle -#pragma pack(pop) - struct Vehicle_t { - using SgType = SgVehicle; - - // The entity who pilots/drives this vehicle. // NOTE: This is redundant (since m_pParentEntity->owner _should_ be the pilot). This makes things clearer though. gentity_t *m_pPilot; @@ -748,10 +683,10 @@ struct Vehicle_t void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); }; extern int BG_VehicleGetIndex( const char *vehicleName ); diff --git a/code/game/ghoul2_shared.h b/code/game/ghoul2_shared.h index cdf0e70b87..a28b1f3dc9 100644 --- a/code/game/ghoul2_shared.h +++ b/code/game/ghoul2_shared.h @@ -40,24 +40,8 @@ int G2API_GetTime(int argTime); // this may or may not return arg depending on // G H O U L I I D E F I N E S // // we save the whole surfaceInfo_t struct -#pragma pack(push, 4) -class SgSurfaceInfo -{ -public: - int32_t offFlags; - int32_t surface; - float genBarycentricJ; - float genBarycentricI; - int32_t genPolySurfaceIndex; - int32_t genLod; -}; // SgSurfaceInfo -#pragma pack(pop) - struct surfaceInfo_t { - using SgType = SgSurfaceInfo; - - int offFlags; // what the flags are for this model int surface; // index into array held inside the model definition of pointers to the actual surface data loaded in - used by both client and game float genBarycentricJ; // point 0 barycentric coors @@ -76,10 +60,10 @@ surfaceInfo_t(): void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); }; #define BONE_ANGLES_PREMULT 0x0001 @@ -109,84 +93,8 @@ typedef struct { #include "../rd-common/mdx_format.h" // we save the whole structure here. -#pragma pack(push, 4) -class SgBoneInfo -{ -public: - int32_t boneNumber; - SgMdxaBone matrix; - int32_t flags; - int32_t startFrame; - int32_t endFrame; - int32_t startTime; - int32_t pauseTime; - float animSpeed; - float blendFrame; - int32_t blendLerpFrame; - int32_t blendTime; - int32_t blendStart; - int32_t boneBlendTime; - int32_t boneBlendStart; - SgMdxaBone newMatrix; - int32_t lastTimeUpdated; - int32_t lastContents; - SgVec3 lastPosition; - SgVec3 velocityEffector; - SgVec3 lastAngles; - SgVec3 minAngles; - SgVec3 maxAngles; - SgVec3 currentAngles; - SgVec3 anglesOffset; - SgVec3 positionOffset; - float radius; - float weight; - int32_t ragIndex; - SgVec3 velocityRoot; - int32_t ragStartTime; - int32_t firstTime; - int32_t firstCollisionTime; - int32_t restTime; - int32_t RagFlags; - int32_t DependentRagIndexMask; - SgMdxaBone originalTrueBoneMatrix; - SgMdxaBone parentTrueBoneMatrix; - SgMdxaBone parentOriginalTrueBoneMatrix; - SgVec3 originalOrigin; - SgVec3 originalAngles; - SgVec3 lastShotDir; - int32_t basepose; - int32_t baseposeInv; - int32_t baseposeParent; - int32_t baseposeInvParent; - int32_t parentRawBoneIndex; - SgMdxaBone ragOverrideMatrix; - SgMdxaBone extraMatrix; - SgVec3 extraVec1; - float extraFloat1; - int32_t extraInt1; - SgVec3 ikPosition; - float ikSpeed; - SgVec3 epVelocity; - float epGravFactor; - int32_t solidCount; - uint8_t physicsSettled; - uint8_t snapped; - int32_t parentBoneIndex; - float offsetRotation; - float overGradSpeed; - SgVec3 overGoalSpot; - uint8_t hasOverGoal; - SgMdxaBone animFrameMatrix; - int32_t hasAnimFrameMatrix; - int32_t airTime; -}; // SgBoneInfo -#pragma pack(pop) - struct boneInfo_t { - using SgType = SgBoneInfo; - - int boneNumber; // what bone are we overriding? mdxaBone_t matrix; // details of bone angle overrides - some are pre-done on the server, some in ghoul2 int flags; // flags for override @@ -290,27 +198,13 @@ boneInfo_t(): void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); }; //we save from top to boltUsed here. Don't bother saving the position, it gets rebuilt every frame anyway -#pragma pack(push, 4) -class SgBoltInfo -{ -public: - int32_t boneNumber; - int32_t surfaceNumber; - int32_t surfaceType; - int32_t boltUsed; -}; // SgBoltInfo -#pragma pack(pop) - struct boltInfo_t{ - using SgType = SgBoltInfo; - - int boneNumber; // bone number bolt attaches to int surfaceNumber; // surface number bolt attaches to int surfaceType; // if we attach to a surface, this tells us if it is an original surface or a generated one - doesn't go across the network @@ -324,10 +218,10 @@ struct boltInfo_t{ void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); }; @@ -372,36 +266,9 @@ CRenderableSurface(const CRenderableSurface& rs): }; #endif -#pragma pack(push, 4) -class SgCGhoul2Info -{ -public: - int32_t mModelindex; - int32_t animModelIndexOffset; - int32_t mCustomShader; - int32_t mCustomSkin; - int32_t mModelBoltLink; - int32_t mSurfaceRoot; - int32_t mLodBias; - int32_t mNewOrigin; -#ifdef _G2_GORE - int32_t mGoreSetTag; -#endif - int32_t mModel; - SgArray mFileName; - int32_t mAnimFrameDefault; - int32_t mSkelFrameNum; - int32_t mMeshFrameNum; - int32_t mFlags; -}; // SgCGhoul2Info -#pragma pack(pop) - class CGhoul2Info { public: - using SgType = SgCGhoul2Info; - - surfaceInfo_v mSlist; boltInfo_v mBltlist; boneInfo_v mBlist; @@ -471,10 +338,10 @@ class CGhoul2Info void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); }; class CGhoul2Info_v; @@ -497,14 +364,6 @@ IGhoul2InfoArray &_TheGhoul2InfoArray(); IGhoul2InfoArray &TheGameGhoul2InfoArray(); #endif -#pragma pack(push, 4) -class SgCGhoul2InfoV -{ -public: - int32_t mItem; -}; // SgCGhoul2InfoV -#pragma pack(pop) - class CGhoul2Info_v { int mItem; @@ -546,9 +405,6 @@ class CGhoul2Info_v return InfoArray().Get(mItem); } public: - using SgType = SgCGhoul2InfoV; - - CGhoul2Info_v() { mItem=0; @@ -623,7 +479,7 @@ class CGhoul2Info_v { return 0; } - return Array().size(); + return static_cast(Array().size()); } bool IsValid() const { @@ -639,10 +495,10 @@ class CGhoul2Info_v void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); }; @@ -651,31 +507,9 @@ class CGhoul2Info_v #define G2_FRONTFACE 1 #define G2_BACKFACE 0 -#pragma pack(push, 4) -class SgCCollisionRecord -{ -public: - float mDistance; - int32_t mEntityNum; - int32_t mModelIndex; - int32_t mPolyIndex; - int32_t mSurfaceIndex; - SgVec3 mCollisionPosition; - SgVec3 mCollisionNormal; - int32_t mFlags; - int32_t mMaterial; - int32_t mLocation; - float mBarycentricI; - float mBarycentricJ; -}; // SgCCollisionRecord -#pragma pack(pop) - class CCollisionRecord { public: - using SgType = SgCCollisionRecord; - - float mDistance; int mEntityNum; int mModelIndex; @@ -696,38 +530,10 @@ class CCollisionRecord void sg_export( - SgType& dst) const - { - ::sg_export(mDistance, dst.mDistance); - ::sg_export(mEntityNum, dst.mEntityNum); - ::sg_export(mModelIndex, dst.mModelIndex); - ::sg_export(mPolyIndex, dst.mPolyIndex); - ::sg_export(mSurfaceIndex, dst.mSurfaceIndex); - ::sg_export(mCollisionPosition, dst.mCollisionPosition); - ::sg_export(mCollisionNormal, dst.mCollisionNormal); - ::sg_export(mFlags, dst.mFlags); - ::sg_export(mMaterial, dst.mMaterial); - ::sg_export(mLocation, dst.mLocation); - ::sg_export(mBarycentricI, dst.mBarycentricI); - ::sg_export(mBarycentricJ, dst.mBarycentricJ); - } + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src) - { - ::sg_import(src.mDistance, mDistance); - ::sg_import(src.mEntityNum, mEntityNum); - ::sg_import(src.mModelIndex, mModelIndex); - ::sg_import(src.mPolyIndex, mPolyIndex); - ::sg_import(src.mSurfaceIndex, mSurfaceIndex); - ::sg_import(src.mCollisionPosition, mCollisionPosition); - ::sg_import(src.mCollisionNormal, mCollisionNormal); - ::sg_import(src.mFlags, mFlags); - ::sg_import(src.mMaterial, mMaterial); - ::sg_import(src.mLocation, mLocation); - ::sg_import(src.mBarycentricI, mBarycentricI); - ::sg_import(src.mBarycentricJ, mBarycentricJ); - } + ojk::ISavedGame* saved_game); }; // calling defines for the trace function diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index 77d7ce81d8..a3cf024d41 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -33,7 +33,6 @@ along with this program; if not, see . #include "../qcommon/q_shared.h" #include "../qcommon/qcommon.h" -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" #define STL_ITERATE( a, b ) for ( a = b.begin(); a != b.end(); ++a ) diff --git a/code/qcommon/cm_load.cpp b/code/qcommon/cm_load.cpp index bfe497517f..c2b0e547d3 100644 --- a/code/qcommon/cm_load.cpp +++ b/code/qcommon/cm_load.cpp @@ -24,7 +24,6 @@ along with this program; if not, see . // cmodel.c -- model loading #include "cm_local.h" -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_saved_game.h" #ifdef BSPC diff --git a/code/qcommon/q_shared.cpp b/code/qcommon/q_shared.cpp index 9cba502265..f6b8247c9f 100644 --- a/code/qcommon/q_shared.cpp +++ b/code/qcommon/q_shared.cpp @@ -25,8 +25,7 @@ along with this program; if not, see . // q_shared.c -- stateless support routines that are included in each code dll #include "../game/common_headers.h" -#include "qcommon/ojk_sg_wrappers.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_i_saved_game.h" int Com_Clampi( int min, int max, int value ) { @@ -1615,774 +1614,774 @@ const char *GetStringForID( const stringID_table_t *table, int id ) void cplane_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(normal, dst.normal); - ::sg_export(dist, dst.dist); - ::sg_export(type, dst.type); - ::sg_export(signbits, dst.signbits); - ::sg_export(pad, dst.pad); + saved_game->write(normal); + saved_game->write(dist); + saved_game->write(type); + saved_game->write(signbits); + saved_game->write(pad); } void cplane_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.normal, normal); - ::sg_import(src.dist, dist); - ::sg_import(src.type, type); - ::sg_import(src.signbits, signbits); - ::sg_import(src.pad, pad); + saved_game->read(normal); + saved_game->read(dist); + saved_game->read(type); + saved_game->read(signbits); + saved_game->read(pad); } void trace_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(allsolid, dst.allsolid); - ::sg_export(startsolid, dst.startsolid); - ::sg_export(fraction, dst.fraction); - ::sg_export(endpos, dst.endpos); - ::sg_export(plane, dst.plane); - ::sg_export(surfaceFlags, dst.surfaceFlags); - ::sg_export(contents, dst.contents); - ::sg_export(entityNum, dst.entityNum); - ::sg_export(G2CollisionMap, dst.G2CollisionMap); + saved_game->write(allsolid); + saved_game->write(startsolid); + saved_game->write(fraction); + saved_game->write(endpos); + saved_game->write<>(plane); + saved_game->write(surfaceFlags); + saved_game->write(contents); + saved_game->write(entityNum); + saved_game->write<>(G2CollisionMap); } void trace_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.allsolid, allsolid); - ::sg_import(src.startsolid, startsolid); - ::sg_import(src.fraction, fraction); - ::sg_import(src.endpos, endpos); - ::sg_import(src.plane, plane); - ::sg_import(src.surfaceFlags, surfaceFlags); - ::sg_import(src.contents, contents); - ::sg_import(src.entityNum, entityNum); - ::sg_import(src.G2CollisionMap, G2CollisionMap); + saved_game->read(allsolid); + saved_game->read(startsolid); + saved_game->read(fraction); + saved_game->read(endpos); + saved_game->read<>(plane); + saved_game->read(surfaceFlags); + saved_game->read(contents); + saved_game->read(entityNum); + saved_game->read<>(G2CollisionMap); } void saberTrail_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(inAction, dst.inAction); - ::sg_export(duration, dst.duration); - ::sg_export(lastTime, dst.lastTime); - ::sg_export(base, dst.base); - ::sg_export(tip, dst.tip); - ::sg_export(haveOldPos, dst.haveOldPos); - ::sg_export(oldPos, dst.oldPos); - ::sg_export(oldNormal, dst.oldNormal); + saved_game->write(inAction); + saved_game->write(duration); + saved_game->write(lastTime); + saved_game->write(base); + saved_game->write(tip); + saved_game->write(haveOldPos); + saved_game->write(oldPos); + saved_game->write(oldNormal); } void saberTrail_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.inAction, inAction); - ::sg_import(src.duration, duration); - ::sg_import(src.lastTime, lastTime); - ::sg_import(src.base, base); - ::sg_import(src.tip, tip); - ::sg_import(src.haveOldPos, haveOldPos); - ::sg_import(src.oldPos, oldPos); - ::sg_import(src.oldNormal, oldNormal); + saved_game->read(inAction); + saved_game->read(duration); + saved_game->read(lastTime); + saved_game->read(base); + saved_game->read(tip); + saved_game->read(haveOldPos); + saved_game->read(oldPos); + saved_game->read(oldNormal); } void bladeInfo_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(active, dst.active); - ::sg_export(color, dst.color); - ::sg_export(radius, dst.radius); - ::sg_export(length, dst.length); - ::sg_export(lengthMax, dst.lengthMax); - ::sg_export(lengthOld, dst.lengthOld); - ::sg_export(muzzlePoint, dst.muzzlePoint); - ::sg_export(muzzlePointOld, dst.muzzlePointOld); - ::sg_export(muzzleDir, dst.muzzleDir); - ::sg_export(muzzleDirOld, dst.muzzleDirOld); - ::sg_export(trail, dst.trail); + saved_game->write(active); + saved_game->write(color); + saved_game->write(radius); + saved_game->write(length); + saved_game->write(lengthMax); + saved_game->write(lengthOld); + saved_game->write(muzzlePoint); + saved_game->write(muzzlePointOld); + saved_game->write(muzzleDir); + saved_game->write(muzzleDirOld); + saved_game->write<>(trail); } void bladeInfo_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.active, active); - ::sg_import(src.color, color); - ::sg_import(src.radius, radius); - ::sg_import(src.length, length); - ::sg_import(src.lengthMax, lengthMax); - ::sg_import(src.lengthOld, lengthOld); - ::sg_import(src.muzzlePoint, muzzlePoint); - ::sg_import(src.muzzlePointOld, muzzlePointOld); - ::sg_import(src.muzzleDir, muzzleDir); - ::sg_import(src.muzzleDirOld, muzzleDirOld); - ::sg_import(src.trail, trail); + saved_game->read(active); + saved_game->read(color); + saved_game->read(radius); + saved_game->read(length); + saved_game->read(lengthMax); + saved_game->read(lengthOld); + saved_game->read(muzzlePoint); + saved_game->read(muzzlePointOld); + saved_game->read(muzzleDir); + saved_game->read(muzzleDirOld); + saved_game->read<>(trail); } void saberInfo_t::sg_export( - SgType& dst) const -{ - ::sg_export(name, dst.name); - ::sg_export(fullName, dst.fullName); - ::sg_export(type, dst.type); - ::sg_export(model, dst.model); - ::sg_export(skin, dst.skin); - ::sg_export(soundOn, dst.soundOn); - ::sg_export(soundLoop, dst.soundLoop); - ::sg_export(soundOff, dst.soundOff); - ::sg_export(numBlades, dst.numBlades); - ::sg_export(blade, dst.blade); - ::sg_export(stylesLearned, dst.stylesLearned); - ::sg_export(stylesForbidden, dst.stylesForbidden); - ::sg_export(maxChain, dst.maxChain); - ::sg_export(forceRestrictions, dst.forceRestrictions); - ::sg_export(lockBonus, dst.lockBonus); - ::sg_export(parryBonus, dst.parryBonus); - ::sg_export(breakParryBonus, dst.breakParryBonus); - ::sg_export(breakParryBonus2, dst.breakParryBonus2); - ::sg_export(disarmBonus, dst.disarmBonus); - ::sg_export(disarmBonus2, dst.disarmBonus2); - ::sg_export(singleBladeStyle, dst.singleBladeStyle); - ::sg_export(brokenSaber1, dst.brokenSaber1); - ::sg_export(brokenSaber2, dst.brokenSaber2); - ::sg_export(saberFlags, dst.saberFlags); - ::sg_export(saberFlags2, dst.saberFlags2); - ::sg_export(spinSound, dst.spinSound); - ::sg_export(swingSound, dst.swingSound); - ::sg_export(fallSound, dst.fallSound); - ::sg_export(moveSpeedScale, dst.moveSpeedScale); - ::sg_export(animSpeedScale, dst.animSpeedScale); - ::sg_export(kataMove, dst.kataMove); - ::sg_export(lungeAtkMove, dst.lungeAtkMove); - ::sg_export(jumpAtkUpMove, dst.jumpAtkUpMove); - ::sg_export(jumpAtkFwdMove, dst.jumpAtkFwdMove); - ::sg_export(jumpAtkBackMove, dst.jumpAtkBackMove); - ::sg_export(jumpAtkRightMove, dst.jumpAtkRightMove); - ::sg_export(jumpAtkLeftMove, dst.jumpAtkLeftMove); - ::sg_export(readyAnim, dst.readyAnim); - ::sg_export(drawAnim, dst.drawAnim); - ::sg_export(putawayAnim, dst.putawayAnim); - ::sg_export(tauntAnim, dst.tauntAnim); - ::sg_export(bowAnim, dst.bowAnim); - ::sg_export(meditateAnim, dst.meditateAnim); - ::sg_export(flourishAnim, dst.flourishAnim); - ::sg_export(gloatAnim, dst.gloatAnim); - ::sg_export(bladeStyle2Start, dst.bladeStyle2Start); - ::sg_export(trailStyle, dst.trailStyle); - ::sg_export(g2MarksShader, dst.g2MarksShader); - ::sg_export(g2WeaponMarkShader, dst.g2WeaponMarkShader); - ::sg_export(hitSound, dst.hitSound); - ::sg_export(blockSound, dst.blockSound); - ::sg_export(bounceSound, dst.bounceSound); - ::sg_export(blockEffect, dst.blockEffect); - ::sg_export(hitPersonEffect, dst.hitPersonEffect); - ::sg_export(hitOtherEffect, dst.hitOtherEffect); - ::sg_export(bladeEffect, dst.bladeEffect); - ::sg_export(knockbackScale, dst.knockbackScale); - ::sg_export(damageScale, dst.damageScale); - ::sg_export(splashRadius, dst.splashRadius); - ::sg_export(splashDamage, dst.splashDamage); - ::sg_export(splashKnockback, dst.splashKnockback); - ::sg_export(trailStyle2, dst.trailStyle2); - ::sg_export(g2MarksShader2, dst.g2MarksShader2); - ::sg_export(g2WeaponMarkShader2, dst.g2WeaponMarkShader2); - ::sg_export(hit2Sound, dst.hit2Sound); - ::sg_export(block2Sound, dst.block2Sound); - ::sg_export(bounce2Sound, dst.bounce2Sound); - ::sg_export(blockEffect2, dst.blockEffect2); - ::sg_export(hitPersonEffect2, dst.hitPersonEffect2); - ::sg_export(hitOtherEffect2, dst.hitOtherEffect2); - ::sg_export(bladeEffect2, dst.bladeEffect2); - ::sg_export(knockbackScale2, dst.knockbackScale2); - ::sg_export(damageScale2, dst.damageScale2); - ::sg_export(splashRadius2, dst.splashRadius2); - ::sg_export(splashDamage2, dst.splashDamage2); - ::sg_export(splashKnockback2, dst.splashKnockback2); + ojk::ISavedGame* saved_game) const +{ + saved_game->write(name); + saved_game->write(fullName); + saved_game->write(type); + saved_game->write(model); + saved_game->write(skin); + saved_game->write(soundOn); + saved_game->write(soundLoop); + saved_game->write(soundOff); + saved_game->write(numBlades); + saved_game->write<>(blade); + saved_game->write(stylesLearned); + saved_game->write(stylesForbidden); + saved_game->write(maxChain); + saved_game->write(forceRestrictions); + saved_game->write(lockBonus); + saved_game->write(parryBonus); + saved_game->write(breakParryBonus); + saved_game->write(breakParryBonus2); + saved_game->write(disarmBonus); + saved_game->write(disarmBonus2); + saved_game->write(singleBladeStyle); + saved_game->write(brokenSaber1); + saved_game->write(brokenSaber2); + saved_game->write(saberFlags); + saved_game->write(saberFlags2); + saved_game->write(spinSound); + saved_game->write(swingSound); + saved_game->write(fallSound); + saved_game->write(moveSpeedScale); + saved_game->write(animSpeedScale); + saved_game->write(kataMove); + saved_game->write(lungeAtkMove); + saved_game->write(jumpAtkUpMove); + saved_game->write(jumpAtkFwdMove); + saved_game->write(jumpAtkBackMove); + saved_game->write(jumpAtkRightMove); + saved_game->write(jumpAtkLeftMove); + saved_game->write(readyAnim); + saved_game->write(drawAnim); + saved_game->write(putawayAnim); + saved_game->write(tauntAnim); + saved_game->write(bowAnim); + saved_game->write(meditateAnim); + saved_game->write(flourishAnim); + saved_game->write(gloatAnim); + saved_game->write(bladeStyle2Start); + saved_game->write(trailStyle); + saved_game->write(g2MarksShader); + saved_game->write(g2WeaponMarkShader); + saved_game->write(hitSound); + saved_game->write(blockSound); + saved_game->write(bounceSound); + saved_game->write(blockEffect); + saved_game->write(hitPersonEffect); + saved_game->write(hitOtherEffect); + saved_game->write(bladeEffect); + saved_game->write(knockbackScale); + saved_game->write(damageScale); + saved_game->write(splashRadius); + saved_game->write(splashDamage); + saved_game->write(splashKnockback); + saved_game->write(trailStyle2); + saved_game->write(g2MarksShader2); + saved_game->write(g2WeaponMarkShader2); + saved_game->write(hit2Sound); + saved_game->write(block2Sound); + saved_game->write(bounce2Sound); + saved_game->write(blockEffect2); + saved_game->write(hitPersonEffect2); + saved_game->write(hitOtherEffect2); + saved_game->write(bladeEffect2); + saved_game->write(knockbackScale2); + saved_game->write(damageScale2); + saved_game->write(splashRadius2); + saved_game->write(splashDamage2); + saved_game->write(splashKnockback2); } void saberInfo_t::sg_import( - const SgType& src) -{ - ::sg_import(src.name, name); - ::sg_import(src.fullName, fullName); - ::sg_import(src.type, type); - ::sg_import(src.model, model); - ::sg_import(src.skin, skin); - ::sg_import(src.soundOn, soundOn); - ::sg_import(src.soundLoop, soundLoop); - ::sg_import(src.soundOff, soundOff); - ::sg_import(src.numBlades, numBlades); - ::sg_import(src.blade, blade); - ::sg_import(src.stylesLearned, stylesLearned); - ::sg_import(src.stylesForbidden, stylesForbidden); - ::sg_import(src.maxChain, maxChain); - ::sg_import(src.forceRestrictions, forceRestrictions); - ::sg_import(src.lockBonus, lockBonus); - ::sg_import(src.parryBonus, parryBonus); - ::sg_import(src.breakParryBonus, breakParryBonus); - ::sg_import(src.breakParryBonus2, breakParryBonus2); - ::sg_import(src.disarmBonus, disarmBonus); - ::sg_import(src.disarmBonus2, disarmBonus2); - ::sg_import(src.singleBladeStyle, singleBladeStyle); - ::sg_import(src.brokenSaber1, brokenSaber1); - ::sg_import(src.brokenSaber2, brokenSaber2); - ::sg_import(src.saberFlags, saberFlags); - ::sg_import(src.saberFlags2, saberFlags2); - ::sg_import(src.spinSound, spinSound); - ::sg_import(src.swingSound, swingSound); - ::sg_import(src.fallSound, fallSound); - ::sg_import(src.moveSpeedScale, moveSpeedScale); - ::sg_import(src.animSpeedScale, animSpeedScale); - ::sg_import(src.kataMove, kataMove); - ::sg_import(src.lungeAtkMove, lungeAtkMove); - ::sg_import(src.jumpAtkUpMove, jumpAtkUpMove); - ::sg_import(src.jumpAtkFwdMove, jumpAtkFwdMove); - ::sg_import(src.jumpAtkBackMove, jumpAtkBackMove); - ::sg_import(src.jumpAtkRightMove, jumpAtkRightMove); - ::sg_import(src.jumpAtkLeftMove, jumpAtkLeftMove); - ::sg_import(src.readyAnim, readyAnim); - ::sg_import(src.drawAnim, drawAnim); - ::sg_import(src.putawayAnim, putawayAnim); - ::sg_import(src.tauntAnim, tauntAnim); - ::sg_import(src.bowAnim, bowAnim); - ::sg_import(src.meditateAnim, meditateAnim); - ::sg_import(src.flourishAnim, flourishAnim); - ::sg_import(src.gloatAnim, gloatAnim); - ::sg_import(src.bladeStyle2Start, bladeStyle2Start); - ::sg_import(src.trailStyle, trailStyle); - ::sg_import(src.g2MarksShader, g2MarksShader); - ::sg_import(src.g2WeaponMarkShader, g2WeaponMarkShader); - ::sg_import(src.hitSound, hitSound); - ::sg_import(src.blockSound, blockSound); - ::sg_import(src.bounceSound, bounceSound); - ::sg_import(src.blockEffect, blockEffect); - ::sg_import(src.hitPersonEffect, hitPersonEffect); - ::sg_import(src.hitOtherEffect, hitOtherEffect); - ::sg_import(src.bladeEffect, bladeEffect); - ::sg_import(src.knockbackScale, knockbackScale); - ::sg_import(src.damageScale, damageScale); - ::sg_import(src.splashRadius, splashRadius); - ::sg_import(src.splashDamage, splashDamage); - ::sg_import(src.splashKnockback, splashKnockback); - ::sg_import(src.trailStyle2, trailStyle2); - ::sg_import(src.g2MarksShader2, g2MarksShader2); - ::sg_import(src.g2WeaponMarkShader2, g2WeaponMarkShader2); - ::sg_import(src.hit2Sound, hit2Sound); - ::sg_import(src.block2Sound, block2Sound); - ::sg_import(src.bounce2Sound, bounce2Sound); - ::sg_import(src.blockEffect2, blockEffect2); - ::sg_import(src.hitPersonEffect2, hitPersonEffect2); - ::sg_import(src.hitOtherEffect2, hitOtherEffect2); - ::sg_import(src.bladeEffect2, bladeEffect2); - ::sg_import(src.knockbackScale2, knockbackScale2); - ::sg_import(src.damageScale2, damageScale2); - ::sg_import(src.splashRadius2, splashRadius2); - ::sg_import(src.splashDamage2, splashDamage2); - ::sg_import(src.splashKnockback2, splashKnockback2); + ojk::ISavedGame* saved_game) +{ + saved_game->read(name); + saved_game->read(fullName); + saved_game->read(type); + saved_game->read(model); + saved_game->read(skin); + saved_game->read(soundOn); + saved_game->read(soundLoop); + saved_game->read(soundOff); + saved_game->read(numBlades); + saved_game->read<>(blade); + saved_game->read(stylesLearned); + saved_game->read(stylesForbidden); + saved_game->read(maxChain); + saved_game->read(forceRestrictions); + saved_game->read(lockBonus); + saved_game->read(parryBonus); + saved_game->read(breakParryBonus); + saved_game->read(breakParryBonus2); + saved_game->read(disarmBonus); + saved_game->read(disarmBonus2); + saved_game->read(singleBladeStyle); + saved_game->read(brokenSaber1); + saved_game->read(brokenSaber2); + saved_game->read(saberFlags); + saved_game->read(saberFlags2); + saved_game->read(spinSound); + saved_game->read(swingSound); + saved_game->read(fallSound); + saved_game->read(moveSpeedScale); + saved_game->read(animSpeedScale); + saved_game->read(kataMove); + saved_game->read(lungeAtkMove); + saved_game->read(jumpAtkUpMove); + saved_game->read(jumpAtkFwdMove); + saved_game->read(jumpAtkBackMove); + saved_game->read(jumpAtkRightMove); + saved_game->read(jumpAtkLeftMove); + saved_game->read(readyAnim); + saved_game->read(drawAnim); + saved_game->read(putawayAnim); + saved_game->read(tauntAnim); + saved_game->read(bowAnim); + saved_game->read(meditateAnim); + saved_game->read(flourishAnim); + saved_game->read(gloatAnim); + saved_game->read(bladeStyle2Start); + saved_game->read(trailStyle); + saved_game->read(g2MarksShader); + saved_game->read(g2WeaponMarkShader); + saved_game->read(hitSound); + saved_game->read(blockSound); + saved_game->read(bounceSound); + saved_game->read(blockEffect); + saved_game->read(hitPersonEffect); + saved_game->read(hitOtherEffect); + saved_game->read(bladeEffect); + saved_game->read(knockbackScale); + saved_game->read(damageScale); + saved_game->read(splashRadius); + saved_game->read(splashDamage); + saved_game->read(splashKnockback); + saved_game->read(trailStyle2); + saved_game->read(g2MarksShader2); + saved_game->read(g2WeaponMarkShader2); + saved_game->read(hit2Sound); + saved_game->read(block2Sound); + saved_game->read(bounce2Sound); + saved_game->read(blockEffect2); + saved_game->read(hitPersonEffect2); + saved_game->read(hitOtherEffect2); + saved_game->read(bladeEffect2); + saved_game->read(knockbackScale2); + saved_game->read(damageScale2); + saved_game->read(splashRadius2); + saved_game->read(splashDamage2); + saved_game->read(splashKnockback2); } void saberInfoRetail_t::sg_export( - SgType& dst) const -{ - ::sg_export(name, dst.name); - ::sg_export(fullName, dst.fullName); - ::sg_export(type, dst.type); - ::sg_export(model, dst.model); - ::sg_export(skin, dst.skin); - ::sg_export(soundOn, dst.soundOn); - ::sg_export(soundLoop, dst.soundLoop); - ::sg_export(soundOff, dst.soundOff); - ::sg_export(numBlades, dst.numBlades); - ::sg_export(blade, dst.blade); - ::sg_export(style, dst.style); - ::sg_export(maxChain, dst.maxChain); - ::sg_export(lockable, dst.lockable); - ::sg_export(throwable, dst.throwable); - ::sg_export(disarmable, dst.disarmable); - ::sg_export(activeBlocking, dst.activeBlocking); - ::sg_export(twoHanded, dst.twoHanded); - ::sg_export(forceRestrictions, dst.forceRestrictions); - ::sg_export(lockBonus, dst.lockBonus); - ::sg_export(parryBonus, dst.parryBonus); - ::sg_export(breakParryBonus, dst.breakParryBonus); - ::sg_export(disarmBonus, dst.disarmBonus); - ::sg_export(singleBladeStyle, dst.singleBladeStyle); - ::sg_export(singleBladeThrowable, dst.singleBladeThrowable); - ::sg_export(brokenSaber1, dst.brokenSaber1); - ::sg_export(brokenSaber2, dst.brokenSaber2); - ::sg_export(returnDamage, dst.returnDamage); + ojk::ISavedGame* saved_game) const +{ + saved_game->write(name); + saved_game->write(fullName); + saved_game->write(type); + saved_game->write(model); + saved_game->write(skin); + saved_game->write(soundOn); + saved_game->write(soundLoop); + saved_game->write(soundOff); + saved_game->write(numBlades); + saved_game->write<>(blade); + saved_game->write(style); + saved_game->write(maxChain); + saved_game->write(lockable); + saved_game->write(throwable); + saved_game->write(disarmable); + saved_game->write(activeBlocking); + saved_game->write(twoHanded); + saved_game->write(forceRestrictions); + saved_game->write(lockBonus); + saved_game->write(parryBonus); + saved_game->write(breakParryBonus); + saved_game->write(disarmBonus); + saved_game->write(singleBladeStyle); + saved_game->write(singleBladeThrowable); + saved_game->write(brokenSaber1); + saved_game->write(brokenSaber2); + saved_game->write(returnDamage); } void saberInfoRetail_t::sg_import( - SgType& src) -{ - ::sg_import(src.name, name); - ::sg_import(src.fullName, fullName); - ::sg_import(src.type, type); - ::sg_import(src.model, model); - ::sg_import(src.skin, skin); - ::sg_import(src.soundOn, soundOn); - ::sg_import(src.soundLoop, soundLoop); - ::sg_import(src.soundOff, soundOff); - ::sg_import(src.numBlades, numBlades); - ::sg_import(src.blade, blade); - ::sg_import(src.style, style); - ::sg_import(src.maxChain, maxChain); - ::sg_import(src.lockable, lockable); - ::sg_import(src.throwable, throwable); - ::sg_import(src.disarmable, disarmable); - ::sg_import(src.activeBlocking, activeBlocking); - ::sg_import(src.twoHanded, twoHanded); - ::sg_import(src.forceRestrictions, forceRestrictions); - ::sg_import(src.lockBonus, lockBonus); - ::sg_import(src.parryBonus, parryBonus); - ::sg_import(src.breakParryBonus, breakParryBonus); - ::sg_import(src.disarmBonus, disarmBonus); - ::sg_import(src.singleBladeStyle, singleBladeStyle); - ::sg_import(src.singleBladeThrowable, singleBladeThrowable); - ::sg_import(src.brokenSaber1, brokenSaber1); - ::sg_import(src.brokenSaber2, brokenSaber2); - ::sg_import(src.returnDamage, returnDamage); + ojk::ISavedGame* saved_game) +{ + saved_game->read(name); + saved_game->read(fullName); + saved_game->read(type); + saved_game->read(model); + saved_game->read(skin); + saved_game->read(soundOn); + saved_game->read(soundLoop); + saved_game->read(soundOff); + saved_game->read(numBlades); + saved_game->read<>(blade); + saved_game->read(style); + saved_game->read(maxChain); + saved_game->read(lockable); + saved_game->read(throwable); + saved_game->read(disarmable); + saved_game->read(activeBlocking); + saved_game->read(twoHanded); + saved_game->read(forceRestrictions); + saved_game->read(lockBonus); + saved_game->read(parryBonus); + saved_game->read(breakParryBonus); + saved_game->read(disarmBonus); + saved_game->read(singleBladeStyle); + saved_game->read(singleBladeThrowable); + saved_game->read(brokenSaber1); + saved_game->read(brokenSaber2); + saved_game->read(returnDamage); } void playerState_t::sg_export( - SgType& dst) const -{ - ::sg_export(commandTime, dst.commandTime); - ::sg_export(pm_type, dst.pm_type); - ::sg_export(bobCycle, dst.bobCycle); - ::sg_export(pm_flags, dst.pm_flags); - ::sg_export(pm_time, dst.pm_time); - ::sg_export(origin, dst.origin); - ::sg_export(velocity, dst.velocity); - ::sg_export(weaponTime, dst.weaponTime); - ::sg_export(weaponChargeTime, dst.weaponChargeTime); - ::sg_export(rechargeTime, dst.rechargeTime); - ::sg_export(gravity, dst.gravity); - ::sg_export(leanofs, dst.leanofs); - ::sg_export(friction, dst.friction); - ::sg_export(speed, dst.speed); - ::sg_export(delta_angles, dst.delta_angles); - ::sg_export(groundEntityNum, dst.groundEntityNum); - ::sg_export(legsAnim, dst.legsAnim); - ::sg_export(legsAnimTimer, dst.legsAnimTimer); - ::sg_export(torsoAnim, dst.torsoAnim); - ::sg_export(torsoAnimTimer, dst.torsoAnimTimer); - ::sg_export(movementDir, dst.movementDir); - ::sg_export(eFlags, dst.eFlags); - ::sg_export(eventSequence, dst.eventSequence); - ::sg_export(events, dst.events); - ::sg_export(eventParms, dst.eventParms); - ::sg_export(externalEvent, dst.externalEvent); - ::sg_export(externalEventParm, dst.externalEventParm); - ::sg_export(externalEventTime, dst.externalEventTime); - ::sg_export(clientNum, dst.clientNum); - ::sg_export(weapon, dst.weapon); - ::sg_export(weaponstate, dst.weaponstate); - ::sg_export(batteryCharge, dst.batteryCharge); - ::sg_export(viewangles, dst.viewangles); - ::sg_export(legsYaw, dst.legsYaw); - ::sg_export(viewheight, dst.viewheight); - ::sg_export(damageEvent, dst.damageEvent); - ::sg_export(damageYaw, dst.damageYaw); - ::sg_export(damagePitch, dst.damagePitch); - ::sg_export(damageCount, dst.damageCount); - ::sg_export(stats, dst.stats); - ::sg_export(persistant, dst.persistant); - ::sg_export(powerups, dst.powerups); - ::sg_export(ammo, dst.ammo); - ::sg_export(inventory, dst.inventory); - ::sg_export(security_key_message, dst.security_key_message); - ::sg_export(serverViewOrg, dst.serverViewOrg); - ::sg_export(saberInFlight, dst.saberInFlight); + ojk::ISavedGame* saved_game) const +{ + saved_game->write(commandTime); + saved_game->write(pm_type); + saved_game->write(bobCycle); + saved_game->write(pm_flags); + saved_game->write(pm_time); + saved_game->write(origin); + saved_game->write(velocity); + saved_game->write(weaponTime); + saved_game->write(weaponChargeTime); + saved_game->write(rechargeTime); + saved_game->write(gravity); + saved_game->write(leanofs); + saved_game->write(friction); + saved_game->write(speed); + saved_game->write(delta_angles); + saved_game->write(groundEntityNum); + saved_game->write(legsAnim); + saved_game->write(legsAnimTimer); + saved_game->write(torsoAnim); + saved_game->write(torsoAnimTimer); + saved_game->write(movementDir); + saved_game->write(eFlags); + saved_game->write(eventSequence); + saved_game->write(events); + saved_game->write(eventParms); + saved_game->write(externalEvent); + saved_game->write(externalEventParm); + saved_game->write(externalEventTime); + saved_game->write(clientNum); + saved_game->write(weapon); + saved_game->write(weaponstate); + saved_game->write(batteryCharge); + saved_game->write(viewangles); + saved_game->write(legsYaw); + saved_game->write(viewheight); + saved_game->write(damageEvent); + saved_game->write(damageYaw); + saved_game->write(damagePitch); + saved_game->write(damageCount); + saved_game->write(stats); + saved_game->write(persistant); + saved_game->write(powerups); + saved_game->write(ammo); + saved_game->write(inventory); + saved_game->write(security_key_message); + saved_game->write(serverViewOrg); + saved_game->write(saberInFlight); #ifdef JK2_MODE - ::sg_export(saberActive, dst.saberActive); - ::sg_export(vehicleModel, dst.vehicleModel); - ::sg_export(viewEntity, dst.viewEntity); - ::sg_export(saberColor, dst.saberColor); - ::sg_export(saberLength, dst.saberLength); - ::sg_export(saberLengthMax, dst.saberLengthMax); - ::sg_export(forcePowersActive, dst.forcePowersActive); + saved_game->write(saberActive); + saved_game->write(vehicleModel); + saved_game->write(viewEntity); + saved_game->write(saberColor); + saved_game->write(saberLength); + saved_game->write(saberLengthMax); + saved_game->write(forcePowersActive); #else - ::sg_export(viewEntity, dst.viewEntity); - ::sg_export(forcePowersActive, dst.forcePowersActive); + saved_game->write(viewEntity); + saved_game->write(forcePowersActive); #endif - ::sg_export(useTime, dst.useTime); - ::sg_export(lastShotTime, dst.lastShotTime); - ::sg_export(ping, dst.ping); - ::sg_export(lastOnGround, dst.lastOnGround); - ::sg_export(lastStationary, dst.lastStationary); - ::sg_export(weaponShotCount, dst.weaponShotCount); - ::sg_export(saber, dst.saber); - ::sg_export(dualSabers, dst.dualSabers); - ::sg_export(saberMove, dst.saberMove); - ::sg_export(saberMoveNext, dst.saberMoveNext); - ::sg_export(saberBounceMove, dst.saberBounceMove); - ::sg_export(saberBlocking, dst.saberBlocking); - ::sg_export(saberBlocked, dst.saberBlocked); - ::sg_export(leanStopDebounceTime, dst.leanStopDebounceTime); + saved_game->write(useTime); + saved_game->write(lastShotTime); + saved_game->write(ping); + saved_game->write(lastOnGround); + saved_game->write(lastStationary); + saved_game->write(weaponShotCount); + saved_game->write<>(saber); + saved_game->write(dualSabers); + saved_game->write(saberMove); + saved_game->write(saberMoveNext); + saved_game->write(saberBounceMove); + saved_game->write(saberBlocking); + saved_game->write(saberBlocked); + saved_game->write(leanStopDebounceTime); #ifdef JK2_MODE - ::sg_export(saberLengthOld, dst.saberLengthOld); + saved_game->write(saberLengthOld); #endif - ::sg_export(saberEntityNum, dst.saberEntityNum); - ::sg_export(saberEntityDist, dst.saberEntityDist); - ::sg_export(saberThrowTime, dst.saberThrowTime); - ::sg_export(saberEntityState, dst.saberEntityState); - ::sg_export(saberDamageDebounceTime, dst.saberDamageDebounceTime); - ::sg_export(saberHitWallSoundDebounceTime, dst.saberHitWallSoundDebounceTime); - ::sg_export(saberEventFlags, dst.saberEventFlags); - ::sg_export(saberBlockingTime, dst.saberBlockingTime); - ::sg_export(saberAnimLevel, dst.saberAnimLevel); - ::sg_export(saberAttackChainCount, dst.saberAttackChainCount); - ::sg_export(saberLockTime, dst.saberLockTime); - ::sg_export(saberLockEnemy, dst.saberLockEnemy); - ::sg_export(saberStylesKnown, dst.saberStylesKnown); + saved_game->write(saberEntityNum); + saved_game->write(saberEntityDist); + saved_game->write(saberThrowTime); + saved_game->write(saberEntityState); + saved_game->write(saberDamageDebounceTime); + saved_game->write(saberHitWallSoundDebounceTime); + saved_game->write(saberEventFlags); + saved_game->write(saberBlockingTime); + saved_game->write(saberAnimLevel); + saved_game->write(saberAttackChainCount); + saved_game->write(saberLockTime); + saved_game->write(saberLockEnemy); + saved_game->write(saberStylesKnown); #ifdef JK2_MODE - ::sg_export(saberModel, dst.saberModel); + saved_game->write(saberModel); #endif - ::sg_export(forcePowersKnown, dst.forcePowersKnown); - ::sg_export(forcePowerDuration, dst.forcePowerDuration); - ::sg_export(forcePowerDebounce, dst.forcePowerDebounce); - ::sg_export(forcePower, dst.forcePower); - ::sg_export(forcePowerMax, dst.forcePowerMax); - ::sg_export(forcePowerRegenDebounceTime, dst.forcePowerRegenDebounceTime); - ::sg_export(forcePowerRegenRate, dst.forcePowerRegenRate); - ::sg_export(forcePowerRegenAmount, dst.forcePowerRegenAmount); - ::sg_export(forcePowerLevel, dst.forcePowerLevel); - ::sg_export(forceJumpZStart, dst.forceJumpZStart); - ::sg_export(forceJumpCharge, dst.forceJumpCharge); - ::sg_export(forceGripEntityNum, dst.forceGripEntityNum); - ::sg_export(forceGripOrg, dst.forceGripOrg); - ::sg_export(forceDrainEntityNum, dst.forceDrainEntityNum); - ::sg_export(forceDrainOrg, dst.forceDrainOrg); - ::sg_export(forceHealCount, dst.forceHealCount); - ::sg_export(forceAllowDeactivateTime, dst.forceAllowDeactivateTime); - ::sg_export(forceRageDrainTime, dst.forceRageDrainTime); - ::sg_export(forceRageRecoveryTime, dst.forceRageRecoveryTime); - ::sg_export(forceDrainEntNum, dst.forceDrainEntNum); - ::sg_export(forceDrainTime, dst.forceDrainTime); - ::sg_export(forcePowersForced, dst.forcePowersForced); - ::sg_export(pullAttackEntNum, dst.pullAttackEntNum); - ::sg_export(pullAttackTime, dst.pullAttackTime); - ::sg_export(lastKickedEntNum, dst.lastKickedEntNum); - ::sg_export(taunting, dst.taunting); - ::sg_export(jumpZStart, dst.jumpZStart); - ::sg_export(moveDir, dst.moveDir); - ::sg_export(waterheight, dst.waterheight); - ::sg_export(waterHeightLevel, dst.waterHeightLevel); - ::sg_export(ikStatus, dst.ikStatus); - ::sg_export(heldClient, dst.heldClient); - ::sg_export(heldByClient, dst.heldByClient); - ::sg_export(heldByBolt, dst.heldByBolt); - ::sg_export(heldByBone, dst.heldByBone); - ::sg_export(vehTurnaroundIndex, dst.vehTurnaroundIndex); - ::sg_export(vehTurnaroundTime, dst.vehTurnaroundTime); - ::sg_export(brokenLimbs, dst.brokenLimbs); - ::sg_export(electrifyTime, dst.electrifyTime); + saved_game->write(forcePowersKnown); + saved_game->write(forcePowerDuration); + saved_game->write(forcePowerDebounce); + saved_game->write(forcePower); + saved_game->write(forcePowerMax); + saved_game->write(forcePowerRegenDebounceTime); + saved_game->write(forcePowerRegenRate); + saved_game->write(forcePowerRegenAmount); + saved_game->write(forcePowerLevel); + saved_game->write(forceJumpZStart); + saved_game->write(forceJumpCharge); + saved_game->write(forceGripEntityNum); + saved_game->write(forceGripOrg); + saved_game->write(forceDrainEntityNum); + saved_game->write(forceDrainOrg); + saved_game->write(forceHealCount); + saved_game->write(forceAllowDeactivateTime); + saved_game->write(forceRageDrainTime); + saved_game->write(forceRageRecoveryTime); + saved_game->write(forceDrainEntNum); + saved_game->write(forceDrainTime); + saved_game->write(forcePowersForced); + saved_game->write(pullAttackEntNum); + saved_game->write(pullAttackTime); + saved_game->write(lastKickedEntNum); + saved_game->write(taunting); + saved_game->write(jumpZStart); + saved_game->write(moveDir); + saved_game->write(waterheight); + saved_game->write(waterHeightLevel); + saved_game->write(ikStatus); + saved_game->write(heldClient); + saved_game->write(heldByClient); + saved_game->write(heldByBolt); + saved_game->write(heldByBone); + saved_game->write(vehTurnaroundIndex); + saved_game->write(vehTurnaroundTime); + saved_game->write(brokenLimbs); + saved_game->write(electrifyTime); } void playerState_t::sg_import( - const SgType& src) -{ - ::sg_import(src.commandTime, commandTime); - ::sg_import(src.pm_type, pm_type); - ::sg_import(src.bobCycle, bobCycle); - ::sg_import(src.pm_flags, pm_flags); - ::sg_import(src.pm_time, pm_time); - ::sg_import(src.origin, origin); - ::sg_import(src.velocity, velocity); - ::sg_import(src.weaponTime, weaponTime); - ::sg_import(src.weaponChargeTime, weaponChargeTime); - ::sg_import(src.rechargeTime, rechargeTime); - ::sg_import(src.gravity, gravity); - ::sg_import(src.leanofs, leanofs); - ::sg_import(src.friction, friction); - ::sg_import(src.speed, speed); - ::sg_import(src.delta_angles, delta_angles); - ::sg_import(src.groundEntityNum, groundEntityNum); - ::sg_import(src.legsAnim, legsAnim); - ::sg_import(src.legsAnimTimer, legsAnimTimer); - ::sg_import(src.torsoAnim, torsoAnim); - ::sg_import(src.torsoAnimTimer, torsoAnimTimer); - ::sg_import(src.movementDir, movementDir); - ::sg_import(src.eFlags, eFlags); - ::sg_import(src.eventSequence, eventSequence); - ::sg_import(src.events, events); - ::sg_import(src.eventParms, eventParms); - ::sg_import(src.externalEvent, externalEvent); - ::sg_import(src.externalEventParm, externalEventParm); - ::sg_import(src.externalEventTime, externalEventTime); - ::sg_import(src.clientNum, clientNum); - ::sg_import(src.weapon, weapon); - ::sg_import(src.weaponstate, weaponstate); - ::sg_import(src.batteryCharge, batteryCharge); - ::sg_import(src.viewangles, viewangles); - ::sg_import(src.legsYaw, legsYaw); - ::sg_import(src.viewheight, viewheight); - ::sg_import(src.damageEvent, damageEvent); - ::sg_import(src.damageYaw, damageYaw); - ::sg_import(src.damagePitch, damagePitch); - ::sg_import(src.damageCount, damageCount); - ::sg_import(src.stats, stats); - ::sg_import(src.persistant, persistant); - ::sg_import(src.powerups, powerups); - ::sg_import(src.ammo, ammo); - ::sg_import(src.inventory, inventory); - ::sg_import(src.security_key_message, security_key_message); - ::sg_import(src.serverViewOrg, serverViewOrg); - ::sg_import(src.saberInFlight, saberInFlight); + ojk::ISavedGame* saved_game) +{ + saved_game->read(commandTime); + saved_game->read(pm_type); + saved_game->read(bobCycle); + saved_game->read(pm_flags); + saved_game->read(pm_time); + saved_game->read(origin); + saved_game->read(velocity); + saved_game->read(weaponTime); + saved_game->read(weaponChargeTime); + saved_game->read(rechargeTime); + saved_game->read(gravity); + saved_game->read(leanofs); + saved_game->read(friction); + saved_game->read(speed); + saved_game->read(delta_angles); + saved_game->read(groundEntityNum); + saved_game->read(legsAnim); + saved_game->read(legsAnimTimer); + saved_game->read(torsoAnim); + saved_game->read(torsoAnimTimer); + saved_game->read(movementDir); + saved_game->read(eFlags); + saved_game->read(eventSequence); + saved_game->read(events); + saved_game->read(eventParms); + saved_game->read(externalEvent); + saved_game->read(externalEventParm); + saved_game->read(externalEventTime); + saved_game->read(clientNum); + saved_game->read(weapon); + saved_game->read(weaponstate); + saved_game->read(batteryCharge); + saved_game->read(viewangles); + saved_game->read(legsYaw); + saved_game->read(viewheight); + saved_game->read(damageEvent); + saved_game->read(damageYaw); + saved_game->read(damagePitch); + saved_game->read(damageCount); + saved_game->read(stats); + saved_game->read(persistant); + saved_game->read(powerups); + saved_game->read(ammo); + saved_game->read(inventory); + saved_game->read(security_key_message); + saved_game->read(serverViewOrg); + saved_game->read(saberInFlight); #ifdef JK2_MODE - ::sg_import(src.saberActive, saberActive); - ::sg_import(src.vehicleModel, vehicleModel); - ::sg_import(src.viewEntity, viewEntity); - ::sg_import(src.saberColor, saberColor); - ::sg_import(src.saberLength, saberLength); - ::sg_import(src.saberLengthMax, saberLengthMax); - ::sg_import(src.forcePowersActive, forcePowersActive); + saved_game->read(saberActive); + saved_game->read(vehicleModel); + saved_game->read(viewEntity); + saved_game->read(saberColor); + saved_game->read(saberLength); + saved_game->read(saberLengthMax); + saved_game->read(forcePowersActive); #else - ::sg_import(src.viewEntity, viewEntity); - ::sg_import(src.forcePowersActive, forcePowersActive); + saved_game->read(viewEntity); + saved_game->read(forcePowersActive); #endif - ::sg_import(src.useTime, useTime); - ::sg_import(src.lastShotTime, lastShotTime); - ::sg_import(src.ping, ping); - ::sg_import(src.lastOnGround, lastOnGround); - ::sg_import(src.lastStationary, lastStationary); - ::sg_import(src.weaponShotCount, weaponShotCount); - ::sg_import(src.saber, saber); - ::sg_import(src.dualSabers, dualSabers); - ::sg_import(src.saberMove, saberMove); - ::sg_import(src.saberMoveNext, saberMoveNext); - ::sg_import(src.saberBounceMove, saberBounceMove); - ::sg_import(src.saberBlocking, saberBlocking); - ::sg_import(src.saberBlocked, saberBlocked); - ::sg_import(src.leanStopDebounceTime, leanStopDebounceTime); + saved_game->read(useTime); + saved_game->read(lastShotTime); + saved_game->read(ping); + saved_game->read(lastOnGround); + saved_game->read(lastStationary); + saved_game->read(weaponShotCount); + saved_game->read<>(saber); + saved_game->read(dualSabers); + saved_game->read(saberMove); + saved_game->read(saberMoveNext); + saved_game->read(saberBounceMove); + saved_game->read(saberBlocking); + saved_game->read(saberBlocked); + saved_game->read(leanStopDebounceTime); #ifdef JK2_MODE - ::sg_import(src.saberLengthOld, saberLengthOld); + saved_game->read(saberLengthOld); #endif - ::sg_import(src.saberEntityNum, saberEntityNum); - ::sg_import(src.saberEntityDist, saberEntityDist); - ::sg_import(src.saberThrowTime, saberThrowTime); - ::sg_import(src.saberEntityState, saberEntityState); - ::sg_import(src.saberDamageDebounceTime, saberDamageDebounceTime); - ::sg_import(src.saberHitWallSoundDebounceTime, saberHitWallSoundDebounceTime); - ::sg_import(src.saberEventFlags, saberEventFlags); - ::sg_import(src.saberBlockingTime, saberBlockingTime); - ::sg_import(src.saberAnimLevel, saberAnimLevel); - ::sg_import(src.saberAttackChainCount, saberAttackChainCount); - ::sg_import(src.saberLockTime, saberLockTime); - ::sg_import(src.saberLockEnemy, saberLockEnemy); - ::sg_import(src.saberStylesKnown, saberStylesKnown); + saved_game->read(saberEntityNum); + saved_game->read(saberEntityDist); + saved_game->read(saberThrowTime); + saved_game->read(saberEntityState); + saved_game->read(saberDamageDebounceTime); + saved_game->read(saberHitWallSoundDebounceTime); + saved_game->read(saberEventFlags); + saved_game->read(saberBlockingTime); + saved_game->read(saberAnimLevel); + saved_game->read(saberAttackChainCount); + saved_game->read(saberLockTime); + saved_game->read(saberLockEnemy); + saved_game->read(saberStylesKnown); #ifdef JK2_MODE - ::sg_import(src.saberModel, saberModel); + saved_game->read(saberModel); #endif - ::sg_import(src.forcePowersKnown, forcePowersKnown); - ::sg_import(src.forcePowerDuration, forcePowerDuration); - ::sg_import(src.forcePowerDebounce, forcePowerDebounce); - ::sg_import(src.forcePower, forcePower); - ::sg_import(src.forcePowerMax, forcePowerMax); - ::sg_import(src.forcePowerRegenDebounceTime, forcePowerRegenDebounceTime); - ::sg_import(src.forcePowerRegenRate, forcePowerRegenRate); - ::sg_import(src.forcePowerRegenAmount, forcePowerRegenAmount); - ::sg_import(src.forcePowerLevel, forcePowerLevel); - ::sg_import(src.forceJumpZStart, forceJumpZStart); - ::sg_import(src.forceJumpCharge, forceJumpCharge); - ::sg_import(src.forceGripEntityNum, forceGripEntityNum); - ::sg_import(src.forceGripOrg, forceGripOrg); - ::sg_import(src.forceDrainEntityNum, forceDrainEntityNum); - ::sg_import(src.forceDrainOrg, forceDrainOrg); - ::sg_import(src.forceHealCount, forceHealCount); - ::sg_import(src.forceAllowDeactivateTime, forceAllowDeactivateTime); - ::sg_import(src.forceRageDrainTime, forceRageDrainTime); - ::sg_import(src.forceRageRecoveryTime, forceRageRecoveryTime); - ::sg_import(src.forceDrainEntNum, forceDrainEntNum); - ::sg_import(src.forceDrainTime, forceDrainTime); - ::sg_import(src.forcePowersForced, forcePowersForced); - ::sg_import(src.pullAttackEntNum, pullAttackEntNum); - ::sg_import(src.pullAttackTime, pullAttackTime); - ::sg_import(src.lastKickedEntNum, lastKickedEntNum); - ::sg_import(src.taunting, taunting); - ::sg_import(src.jumpZStart, jumpZStart); - ::sg_import(src.moveDir, moveDir); - ::sg_import(src.waterheight, waterheight); - ::sg_import(src.waterHeightLevel, waterHeightLevel); - ::sg_import(src.ikStatus, ikStatus); - ::sg_import(src.heldClient, heldClient); - ::sg_import(src.heldByClient, heldByClient); - ::sg_import(src.heldByBolt, heldByBolt); - ::sg_import(src.heldByBone, heldByBone); - ::sg_import(src.vehTurnaroundIndex, vehTurnaroundIndex); - ::sg_import(src.vehTurnaroundTime, vehTurnaroundTime); - ::sg_import(src.brokenLimbs, brokenLimbs); - ::sg_import(src.electrifyTime, electrifyTime); + saved_game->read(forcePowersKnown); + saved_game->read(forcePowerDuration); + saved_game->read(forcePowerDebounce); + saved_game->read(forcePower); + saved_game->read(forcePowerMax); + saved_game->read(forcePowerRegenDebounceTime); + saved_game->read(forcePowerRegenRate); + saved_game->read(forcePowerRegenAmount); + saved_game->read(forcePowerLevel); + saved_game->read(forceJumpZStart); + saved_game->read(forceJumpCharge); + saved_game->read(forceGripEntityNum); + saved_game->read(forceGripOrg); + saved_game->read(forceDrainEntityNum); + saved_game->read(forceDrainOrg); + saved_game->read(forceHealCount); + saved_game->read(forceAllowDeactivateTime); + saved_game->read(forceRageDrainTime); + saved_game->read(forceRageRecoveryTime); + saved_game->read(forceDrainEntNum); + saved_game->read(forceDrainTime); + saved_game->read(forcePowersForced); + saved_game->read(pullAttackEntNum); + saved_game->read(pullAttackTime); + saved_game->read(lastKickedEntNum); + saved_game->read(taunting); + saved_game->read(jumpZStart); + saved_game->read(moveDir); + saved_game->read(waterheight); + saved_game->read(waterHeightLevel); + saved_game->read(ikStatus); + saved_game->read(heldClient); + saved_game->read(heldByClient); + saved_game->read(heldByBolt); + saved_game->read(heldByBone); + saved_game->read(vehTurnaroundIndex); + saved_game->read(vehTurnaroundTime); + saved_game->read(brokenLimbs); + saved_game->read(electrifyTime); } void usercmd_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(serverTime, dst.serverTime); - ::sg_export(buttons, dst.buttons); - ::sg_export(weapon, dst.weapon); - ::sg_export(angles, dst.angles); - ::sg_export(generic_cmd, dst.generic_cmd); - ::sg_export(forwardmove, dst.forwardmove); - ::sg_export(rightmove, dst.rightmove); - ::sg_export(upmove, dst.upmove); + saved_game->write(serverTime); + saved_game->write(buttons); + saved_game->write(weapon); + saved_game->write(angles); + saved_game->write(generic_cmd); + saved_game->write(forwardmove); + saved_game->write(rightmove); + saved_game->write(upmove); } void usercmd_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.serverTime, serverTime); - ::sg_import(src.buttons, buttons); - ::sg_import(src.weapon, weapon); - ::sg_import(src.angles, angles); - ::sg_import(src.generic_cmd, generic_cmd); - ::sg_import(src.forwardmove, forwardmove); - ::sg_import(src.rightmove, rightmove); - ::sg_import(src.upmove, upmove); + saved_game->read(serverTime); + saved_game->read(buttons); + saved_game->read(weapon); + saved_game->read(angles); + saved_game->read(generic_cmd); + saved_game->read(forwardmove); + saved_game->read(rightmove); + saved_game->read(upmove); } void trajectory_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(trType, dst.trType); - ::sg_export(trTime, dst.trTime); - ::sg_export(trDuration, dst.trDuration); - ::sg_export(trBase, dst.trBase); - ::sg_export(trDelta, dst.trDelta); + saved_game->write(trType); + saved_game->write(trTime); + saved_game->write(trDuration); + saved_game->write(trBase); + saved_game->write(trDelta); } void trajectory_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.trType, trType); - ::sg_import(src.trTime, trTime); - ::sg_import(src.trDuration, trDuration); - ::sg_import(src.trBase, trBase); - ::sg_import(src.trDelta, trDelta); + saved_game->read(trType); + saved_game->read(trTime); + saved_game->read(trDuration); + saved_game->read(trBase); + saved_game->read(trDelta); } void entityState_t::sg_export( - SgType& dst) const -{ - ::sg_export(number, dst.number); - ::sg_export(eType, dst.eType); - ::sg_export(eFlags, dst.eFlags); - ::sg_export(pos, dst.pos); - ::sg_export(apos, dst.apos); - ::sg_export(time, dst.time); - ::sg_export(time2, dst.time2); - ::sg_export(origin, dst.origin); - ::sg_export(origin2, dst.origin2); - ::sg_export(angles, dst.angles); - ::sg_export(angles2, dst.angles2); - ::sg_export(otherEntityNum, dst.otherEntityNum); - ::sg_export(otherEntityNum2, dst.otherEntityNum2); - ::sg_export(groundEntityNum, dst.groundEntityNum); - ::sg_export(constantLight, dst.constantLight); - ::sg_export(loopSound, dst.loopSound); - ::sg_export(modelindex, dst.modelindex); - ::sg_export(modelindex2, dst.modelindex2); - ::sg_export(modelindex3, dst.modelindex3); - ::sg_export(clientNum, dst.clientNum); - ::sg_export(frame, dst.frame); - ::sg_export(solid, dst.solid); - ::sg_export(event, dst.event); - ::sg_export(eventParm, dst.eventParm); - ::sg_export(powerups, dst.powerups); - ::sg_export(weapon, dst.weapon); - ::sg_export(legsAnim, dst.legsAnim); - ::sg_export(legsAnimTimer, dst.legsAnimTimer); - ::sg_export(torsoAnim, dst.torsoAnim); - ::sg_export(torsoAnimTimer, dst.torsoAnimTimer); - ::sg_export(scale, dst.scale); - ::sg_export(saberInFlight, dst.saberInFlight); - ::sg_export(saberActive, dst.saberActive); + ojk::ISavedGame* saved_game) const +{ + saved_game->write(number); + saved_game->write(eType); + saved_game->write(eFlags); + saved_game->write<>(pos); + saved_game->write<>(apos); + saved_game->write(time); + saved_game->write(time2); + saved_game->write(origin); + saved_game->write(origin2); + saved_game->write(angles); + saved_game->write(angles2); + saved_game->write(otherEntityNum); + saved_game->write(otherEntityNum2); + saved_game->write(groundEntityNum); + saved_game->write(constantLight); + saved_game->write(loopSound); + saved_game->write(modelindex); + saved_game->write(modelindex2); + saved_game->write(modelindex3); + saved_game->write(clientNum); + saved_game->write(frame); + saved_game->write(solid); + saved_game->write(event); + saved_game->write(eventParm); + saved_game->write(powerups); + saved_game->write(weapon); + saved_game->write(legsAnim); + saved_game->write(legsAnimTimer); + saved_game->write(torsoAnim); + saved_game->write(torsoAnimTimer); + saved_game->write(scale); + saved_game->write(saberInFlight); + saved_game->write(saberActive); #ifdef JK2_MODE - ::sg_export(vehicleModel, dst.vehicleModel); + saved_game->write(vehicleModel); #endif - ::sg_export(vehicleAngles, dst.vehicleAngles); - ::sg_export(vehicleArmor, dst.vehicleArmor); - ::sg_export(m_iVehicleNum, dst.m_iVehicleNum); - ::sg_export(modelScale, dst.modelScale); - ::sg_export(radius, dst.radius); - ::sg_export(boltInfo, dst.boltInfo); - ::sg_export(isPortalEnt, dst.isPortalEnt); + saved_game->write(vehicleAngles); + saved_game->write(vehicleArmor); + saved_game->write(m_iVehicleNum); + saved_game->write(modelScale); + saved_game->write(radius); + saved_game->write(boltInfo); + saved_game->write(isPortalEnt); } void entityState_t::sg_import( - const SgType& src) -{ - ::sg_import(src.number, number); - ::sg_import(src.eType, eType); - ::sg_import(src.eFlags, eFlags); - ::sg_import(src.pos, pos); - ::sg_import(src.apos, apos); - ::sg_import(src.time, time); - ::sg_import(src.time2, time2); - ::sg_import(src.origin, origin); - ::sg_import(src.origin2, origin2); - ::sg_import(src.angles, angles); - ::sg_import(src.angles2, angles2); - ::sg_import(src.otherEntityNum, otherEntityNum); - ::sg_import(src.otherEntityNum2, otherEntityNum2); - ::sg_import(src.groundEntityNum, groundEntityNum); - ::sg_import(src.constantLight, constantLight); - ::sg_import(src.loopSound, loopSound); - ::sg_import(src.modelindex, modelindex); - ::sg_import(src.modelindex2, modelindex2); - ::sg_import(src.modelindex3, modelindex3); - ::sg_import(src.clientNum, clientNum); - ::sg_import(src.frame, frame); - ::sg_import(src.solid, solid); - ::sg_import(src.event, event); - ::sg_import(src.eventParm, eventParm); - ::sg_import(src.powerups, powerups); - ::sg_import(src.weapon, weapon); - ::sg_import(src.legsAnim, legsAnim); - ::sg_import(src.legsAnimTimer, legsAnimTimer); - ::sg_import(src.torsoAnim, torsoAnim); - ::sg_import(src.torsoAnimTimer, torsoAnimTimer); - ::sg_import(src.scale, scale); - ::sg_import(src.saberInFlight, saberInFlight); - ::sg_import(src.saberActive, saberActive); + ojk::ISavedGame* saved_game) +{ + saved_game->read(number); + saved_game->read(eType); + saved_game->read(eFlags); + saved_game->read<>(pos); + saved_game->read<>(apos); + saved_game->read(time); + saved_game->read(time2); + saved_game->read(origin); + saved_game->read(origin2); + saved_game->read(angles); + saved_game->read(angles2); + saved_game->read(otherEntityNum); + saved_game->read(otherEntityNum2); + saved_game->read(groundEntityNum); + saved_game->read(constantLight); + saved_game->read(loopSound); + saved_game->read(modelindex); + saved_game->read(modelindex2); + saved_game->read(modelindex3); + saved_game->read(clientNum); + saved_game->read(frame); + saved_game->read(solid); + saved_game->read(event); + saved_game->read(eventParm); + saved_game->read(powerups); + saved_game->read(weapon); + saved_game->read(legsAnim); + saved_game->read(legsAnimTimer); + saved_game->read(torsoAnim); + saved_game->read(torsoAnimTimer); + saved_game->read(scale); + saved_game->read(saberInFlight); + saved_game->read(saberActive); #ifdef JK2_MODE - ::sg_import(src.vehicleModel, vehicleModel); + saved_game->read(vehicleModel); #endif - ::sg_import(src.vehicleAngles, vehicleAngles); - ::sg_import(src.vehicleArmor, vehicleArmor); - ::sg_import(src.m_iVehicleNum, m_iVehicleNum); - ::sg_import(src.modelScale, modelScale); - ::sg_import(src.radius, radius); - ::sg_import(src.boltInfo, boltInfo); - ::sg_import(src.isPortalEnt, isPortalEnt); + saved_game->read(vehicleAngles); + saved_game->read(vehicleArmor); + saved_game->read(m_iVehicleNum); + saved_game->read(modelScale); + saved_game->read(radius); + saved_game->read(boltInfo); + saved_game->read(isPortalEnt); } diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index b0be5d8826..ac2834e86b 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -160,7 +160,6 @@ float FloatSwap( const float *f ); #include "qcommon/q_platform.h" -#include "qcommon/ojk_sg_wrappers_fwd.h" #include "qcommon/ojk_i_saved_game_fwd.h" @@ -1223,22 +1222,7 @@ COLLISION DETECTION // plane_t structure // !!! if this is changed, it must be changed in asm code too !!! -#pragma pack(push, 4) -class SgCPlane -{ -public: - SgVec3 normal; - float dist; - uint8_t type; - uint8_t signbits; - SgArray pad; -}; // SgCPlane -#pragma pack(pop) - typedef struct cplane_s { - using SgType = SgCPlane; - - vec3_t normal; float dist; byte type; // for fast side tests: 0,1,2 = axial, 3 = nonaxial @@ -1247,10 +1231,10 @@ typedef struct cplane_s { void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } cplane_t; /* @@ -1267,26 +1251,7 @@ Ghoul2 Insert End #define MAX_G2_COLLISIONS 16 // a trace is returned when a box is swept through the world -#pragma pack(push, 4) -class SgTrace -{ -public: - int32_t allsolid; - int32_t startsolid; - float fraction; - SgVec3 endpos; - SgCPlane plane; - int32_t surfaceFlags; - int32_t contents; - int32_t entityNum; - SgArray G2CollisionMap; -}; // SgTrace -#pragma pack(pop) - typedef struct { - using SgType = SgTrace; - - qboolean allsolid; // if true, plane is not valid qboolean startsolid; // if true, the initial point was in a solid area float fraction; // time completed, 1.0 = didn't hit anything @@ -1305,10 +1270,10 @@ Ghoul2 Insert End void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } trace_t; // trace->entityNum can also be 0 to (MAX_GENTITIES-1) @@ -1526,26 +1491,8 @@ typedef enum } waterHeightLevel_t; // !!!!!!! loadsave affecting struct !!!!!!! -#pragma pack(push, 4) -class SgSaberTrail -{ -public: - int32_t inAction; - int32_t duration; - int32_t lastTime; - SgVec3 base; - SgVec3 tip; - SgArray haveOldPos; - SgArray oldPos; - SgArray oldNormal; -}; // SgSaberTrail -#pragma pack(pop) - typedef struct { - using SgType = SgSaberTrail; - - // Actual trail stuff int inAction; // controls whether should we even consider starting one int duration; // how long each trail seg stays in existence @@ -1561,38 +1508,17 @@ typedef struct void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } saberTrail_t; #define MAX_SABER_TRAIL_SEGS 8 // !!!!!!!!!!!!! loadsave affecting struct !!!!!!!!!!!!!!! -#pragma pack(push, 4) -class SgBladeInfo -{ -public: - int32_t active; - int32_t color; - float radius; - float length; - float lengthMax; - float lengthOld; - SgVec3 muzzlePoint; - SgVec3 muzzlePointOld; - SgVec3 muzzleDir; - SgVec3 muzzleDirOld; - SgSaberTrail trail; -}; // SgBladeInfo -#pragma pack(pop) - typedef struct { - using SgType = SgBladeInfo; - - qboolean active; saber_colors_t color; float radius; @@ -1617,10 +1543,10 @@ typedef struct void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } bladeInfo_t; #define MAX_BLADES 8 @@ -1689,94 +1615,8 @@ typedef enum #define SFL2_TRANSITION_DAMAGE2 (1<<17)//if set, the blade does damage in start, transition and return anims (like strong style does) // !!!!!!!!!!!! loadsave affecting struct !!!!!!!!!!!!!!!!!!!!!!!!!! -#pragma pack(push, 4) -class SgSaberInfo -{ -public: - int32_t name; - int32_t fullName; - int32_t type; - int32_t model; - int32_t skin; - int32_t soundOn; - int32_t soundLoop; - int32_t soundOff; - int32_t numBlades; - SgArray blade; - int32_t stylesLearned; - int32_t stylesForbidden; - int32_t maxChain; - int32_t forceRestrictions; - int32_t lockBonus; - int32_t parryBonus; - int32_t breakParryBonus; - int32_t breakParryBonus2; - int32_t disarmBonus; - int32_t disarmBonus2; - int32_t singleBladeStyle; - int32_t brokenSaber1; - int32_t brokenSaber2; - int32_t saberFlags; - int32_t saberFlags2; - int32_t spinSound; - SgArray swingSound; - SgArray fallSound; - float moveSpeedScale; - float animSpeedScale; - int32_t kataMove; - int32_t lungeAtkMove; - int32_t jumpAtkUpMove; - int32_t jumpAtkFwdMove; - int32_t jumpAtkBackMove; - int32_t jumpAtkRightMove; - int32_t jumpAtkLeftMove; - int32_t readyAnim; - int32_t drawAnim; - int32_t putawayAnim; - int32_t tauntAnim; - int32_t bowAnim; - int32_t meditateAnim; - int32_t flourishAnim; - int32_t gloatAnim; - int32_t bladeStyle2Start; - int32_t trailStyle; - SgArray g2MarksShader; - SgArray g2WeaponMarkShader; - SgArray hitSound; - SgArray blockSound; - SgArray bounceSound; - int32_t blockEffect; - int32_t hitPersonEffect; - int32_t hitOtherEffect; - int32_t bladeEffect; - float knockbackScale; - float damageScale; - float splashRadius; - int32_t splashDamage; - float splashKnockback; - int32_t trailStyle2; - SgArray g2MarksShader2; - SgArray g2WeaponMarkShader2; - SgArray hit2Sound; - SgArray block2Sound; - SgArray bounce2Sound; - int32_t blockEffect2; - int32_t hitPersonEffect2; - int32_t hitOtherEffect2; - int32_t bladeEffect2; - float knockbackScale2; - float damageScale2; - float splashRadius2; - int32_t splashDamage2; - float splashKnockback2; -}; // SgSaberInfo -#pragma pack(pop) - typedef struct { - using SgType = SgSaberInfo; - - char *name; //entry in sabers.cfg, if any char *fullName; //the "Proper Name" of the saber, shown in the UI saberType_t type; //none, single or staff @@ -1998,52 +1838,15 @@ typedef struct void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } saberInfo_t; //NOTE: Below is the *retail* version of the saberInfo_t structure - it is ONLY used for loading retail-version savegames (we load the savegame into this smaller structure, then copy each field into the appropriate field in the new structure - see SG_ConvertRetailSaberinfoToNewSaberinfo() -#pragma pack(push, 4) -class SgSaberInfoRetail -{ -public: - int32_t name; - int32_t fullName; - int32_t type; - int32_t model; - int32_t skin; - int32_t soundOn; - int32_t soundLoop; - int32_t soundOff; - int32_t numBlades; - SgArray blade; - int32_t style; - int32_t maxChain; - int32_t lockable; - int32_t throwable; - int32_t disarmable; - int32_t activeBlocking; - int32_t twoHanded; - int32_t forceRestrictions; - int32_t lockBonus; - int32_t parryBonus; - int32_t breakParryBonus; - int32_t disarmBonus; - int32_t singleBladeStyle; - int32_t singleBladeThrowable; - int32_t brokenSaber1; - int32_t brokenSaber2; - int32_t returnDamage; -}; // SgSaberInfoRetail -#pragma pack(pop) - typedef struct { - using SgType = SgSaberInfoRetail; - - char *name; //entry in sabers.cfg, if any char *fullName; //the "Proper Name" of the saber, shown in the UI saberType_t type; //none, single or staff @@ -2160,10 +1963,10 @@ typedef struct void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - SgType& src); + ojk::ISavedGame* saved_game); } saberInfoRetail_t; #define MAX_SABERS 2 // if this ever changes then update the table "static const save_field_t savefields_gClient[]"!!!!!!!!!!!! @@ -2179,154 +1982,7 @@ typedef struct // so if a playerState_t is transmitted, the entityState_t can be fully derived // from it. // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgPlayerState -{ -public: - int32_t commandTime; - int32_t pm_type; - int32_t bobCycle; - int32_t pm_flags; - int32_t pm_time; - SgVec3 origin; - SgVec3 velocity; - int32_t weaponTime; - int32_t weaponChargeTime; - int32_t rechargeTime; - int32_t gravity; - int32_t leanofs; - int32_t friction; - int32_t speed; - SgArray delta_angles; - int32_t groundEntityNum; - int32_t legsAnim; - int32_t legsAnimTimer; - int32_t torsoAnim; - int32_t torsoAnimTimer; - int32_t movementDir; - int32_t eFlags; - int32_t eventSequence; - SgArray events; - SgArray eventParms; - int32_t externalEvent; - int32_t externalEventParm; - int32_t externalEventTime; - int32_t clientNum; - int32_t weapon; - int32_t weaponstate; - int32_t batteryCharge; - SgVec3 viewangles; - float legsYaw; - int32_t viewheight; - int32_t damageEvent; - int32_t damageYaw; - int32_t damagePitch; - int32_t damageCount; - SgArray stats; - SgArray persistant; - SgArray powerups; - SgArray ammo; - SgArray inventory; - SgArray2d security_key_message; - SgVec3 serverViewOrg; - int32_t saberInFlight; - -#ifdef JK2_MODE - int32_t saberActive; - int32_t vehicleModel; - int32_t viewEntity; - int32_t saberColor; - float saberLength; - float saberLengthMax; - int32_t forcePowersActive; -#else - int32_t viewEntity; - int32_t forcePowersActive; -#endif - - int32_t useTime; - int32_t lastShotTime; - int32_t ping; - int32_t lastOnGround; - int32_t lastStationary; - int32_t weaponShotCount; - SgArray saber; - int32_t dualSabers; - int16_t saberMove; - int16_t saberMoveNext; - int16_t saberBounceMove; - int16_t saberBlocking; - int16_t saberBlocked; - int16_t leanStopDebounceTime; - -#ifdef JK2_MODE - float saberLengthOld; -#endif - - int32_t saberEntityNum; - float saberEntityDist; - int32_t saberThrowTime; - int32_t saberEntityState; - int32_t saberDamageDebounceTime; - int32_t saberHitWallSoundDebounceTime; - int32_t saberEventFlags; - int32_t saberBlockingTime; - int32_t saberAnimLevel; - int32_t saberAttackChainCount; - int32_t saberLockTime; - int32_t saberLockEnemy; - int32_t saberStylesKnown; - -#ifdef JK2_MODE - int32_t saberModel; -#endif - - int32_t forcePowersKnown; - SgArray forcePowerDuration; - SgArray forcePowerDebounce; - int32_t forcePower; - int32_t forcePowerMax; - int32_t forcePowerRegenDebounceTime; - int32_t forcePowerRegenRate; - int32_t forcePowerRegenAmount; - SgArray forcePowerLevel; - float forceJumpZStart; - float forceJumpCharge; - int32_t forceGripEntityNum; - SgVec3 forceGripOrg; - int32_t forceDrainEntityNum; - SgVec3 forceDrainOrg; - int32_t forceHealCount; - int32_t forceAllowDeactivateTime; - int32_t forceRageDrainTime; - int32_t forceRageRecoveryTime; - int32_t forceDrainEntNum; - float forceDrainTime; - int32_t forcePowersForced; - int32_t pullAttackEntNum; - int32_t pullAttackTime; - int32_t lastKickedEntNum; - int32_t taunting; - float jumpZStart; - SgVec3 moveDir; - float waterheight; - int32_t waterHeightLevel; - int32_t ikStatus; - int32_t heldClient; - int32_t heldByClient; - int32_t heldByBolt; - int32_t heldByBone; - int32_t vehTurnaroundIndex; - int32_t vehTurnaroundTime; - int32_t brokenLimbs; - int32_t electrifyTime; -}; // SgPlayerState -#pragma pack(pop) - typedef struct playerState_s { - using SgType = SgPlayerState; - - int commandTime; // cmd->serverTime of last executed command int pm_type; int bobCycle; // for view bobbing and footstep generation @@ -2630,10 +2286,10 @@ typedef struct playerState_s { void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } playerState_t; //==================================================================== @@ -2681,25 +2337,7 @@ typedef enum // usercmd_t is sent to the server each client frame // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgUserCmd -{ -public: - int32_t serverTime; - int32_t buttons; - uint8_t weapon; - SgArray angles; - uint8_t generic_cmd; - int8_t forwardmove; - int8_t rightmove; - int8_t upmove; -}; // SgUserCmd -#pragma pack(pop) - typedef struct usercmd_s { - using SgType = SgUserCmd; - - int serverTime; int buttons; byte weapon; @@ -2709,10 +2347,10 @@ typedef struct usercmd_s { void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } usercmd_t; //=================================================================== @@ -2730,22 +2368,7 @@ typedef enum {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! TR_GRAVITY } trType_t; -#pragma pack(push, 4) -class SgTrajectory -{ -public: - int32_t trType; - int32_t trTime; - int32_t trDuration; - SgVec3 trBase; - SgVec3 trDelta; -}; // SgTrajectory -#pragma pack(pop) - typedef struct {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! - using SgType = SgTrajectory; - - trType_t trType; int trTime; int trDuration; // if non 0, trTime + trDuration = stop time @@ -2754,10 +2377,10 @@ typedef struct {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } trajectory_t; @@ -2768,62 +2391,7 @@ typedef struct {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! // The messages are delta compressed, so it doesn't really matter if // the structure size is fairly large -#pragma pack(push, 4) -class SgEntityState -{ -public: - int32_t number; - int32_t eType; - int32_t eFlags; - SgTrajectory pos; - SgTrajectory apos; - int32_t time; - int32_t time2; - SgVec3 origin; - SgVec3 origin2; - SgVec3 angles; - SgVec3 angles2; - int32_t otherEntityNum; - int32_t otherEntityNum2; - int32_t groundEntityNum; - int32_t constantLight; - int32_t loopSound; - int32_t modelindex; - int32_t modelindex2; - int32_t modelindex3; - int32_t clientNum; - int32_t frame; - int32_t solid; - int32_t event; - int32_t eventParm; - int32_t powerups; - int32_t weapon; - int32_t legsAnim; - int32_t legsAnimTimer; - int32_t torsoAnim; - int32_t torsoAnimTimer; - int32_t scale; - int32_t saberInFlight; - int32_t saberActive; - -#ifdef JK2_MODE - int32_t vehicleModel; -#endif - - SgVec3 vehicleAngles; - int32_t vehicleArmor; - int32_t m_iVehicleNum; - SgVec3 modelScale; - int32_t radius; - int32_t boltInfo; - int32_t isPortalEnt; -}; // SgEntityState -#pragma pack(pop) - typedef struct entityState_s {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!!!!! - using SgType = SgEntityState; - - int number; // entity index int eType; // entityType_t int eFlags; @@ -2897,10 +2465,10 @@ Ghoul2 Insert End void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } entityState_t; diff --git a/code/rd-common/ghoul2_shared.cpp b/code/rd-common/ghoul2_shared.cpp index 8ec2602b42..1f849493a8 100644 --- a/code/rd-common/ghoul2_shared.cpp +++ b/code/rd-common/ghoul2_shared.cpp @@ -1,246 +1,280 @@ #include "qcommon/q_shared.h" #include "../game/ghoul2_shared.h" -#include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_i_saved_game.h" void surfaceInfo_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(offFlags, dst.offFlags); - ::sg_export(surface, dst.surface); - ::sg_export(genBarycentricJ, dst.genBarycentricJ); - ::sg_export(genBarycentricI, dst.genBarycentricI); - ::sg_export(genPolySurfaceIndex, dst.genPolySurfaceIndex); - ::sg_export(genLod, dst.genLod); + saved_game->write(offFlags); + saved_game->write(surface); + saved_game->write(genBarycentricJ); + saved_game->write(genBarycentricI); + saved_game->write(genPolySurfaceIndex); + saved_game->write(genLod); } void surfaceInfo_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.offFlags, offFlags); - ::sg_import(src.surface, surface); - ::sg_import(src.genBarycentricJ, genBarycentricJ); - ::sg_import(src.genBarycentricI, genBarycentricI); - ::sg_import(src.genPolySurfaceIndex, genPolySurfaceIndex); - ::sg_import(src.genLod, genLod); + saved_game->read(offFlags); + saved_game->read(surface); + saved_game->read(genBarycentricJ); + saved_game->read(genBarycentricI); + saved_game->read(genPolySurfaceIndex); + saved_game->read(genLod); } void boneInfo_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(boneNumber, dst.boneNumber); - ::sg_export(matrix, dst.matrix); - ::sg_export(flags, dst.flags); - ::sg_export(startFrame, dst.startFrame); - ::sg_export(endFrame, dst.endFrame); - ::sg_export(startTime, dst.startTime); - ::sg_export(pauseTime, dst.pauseTime); - ::sg_export(animSpeed, dst.animSpeed); - ::sg_export(blendFrame, dst.blendFrame); - ::sg_export(blendLerpFrame, dst.blendLerpFrame); - ::sg_export(blendTime, dst.blendTime); - ::sg_export(blendStart, dst.blendStart); - ::sg_export(boneBlendTime, dst.boneBlendTime); - ::sg_export(boneBlendStart, dst.boneBlendStart); - ::sg_export(newMatrix, dst.newMatrix); - ::sg_export(lastTimeUpdated, dst.lastTimeUpdated); - ::sg_export(lastContents, dst.lastContents); - ::sg_export(lastPosition, dst.lastPosition); - ::sg_export(velocityEffector, dst.velocityEffector); - ::sg_export(lastAngles, dst.lastAngles); - ::sg_export(minAngles, dst.minAngles); - ::sg_export(maxAngles, dst.maxAngles); - ::sg_export(currentAngles, dst.currentAngles); - ::sg_export(anglesOffset, dst.anglesOffset); - ::sg_export(positionOffset, dst.positionOffset); - ::sg_export(radius, dst.radius); - ::sg_export(weight, dst.weight); - ::sg_export(ragIndex, dst.ragIndex); - ::sg_export(velocityRoot, dst.velocityRoot); - ::sg_export(ragStartTime, dst.ragStartTime); - ::sg_export(firstTime, dst.firstTime); - ::sg_export(firstCollisionTime, dst.firstCollisionTime); - ::sg_export(restTime, dst.restTime); - ::sg_export(RagFlags, dst.RagFlags); - ::sg_export(DependentRagIndexMask, dst.DependentRagIndexMask); - ::sg_export(originalTrueBoneMatrix, dst.originalTrueBoneMatrix); - ::sg_export(parentTrueBoneMatrix, dst.parentTrueBoneMatrix); - ::sg_export(parentOriginalTrueBoneMatrix, dst.parentOriginalTrueBoneMatrix); - ::sg_export(originalOrigin, dst.originalOrigin); - ::sg_export(originalAngles, dst.originalAngles); - ::sg_export(lastShotDir, dst.lastShotDir); - ::sg_export(basepose, dst.basepose); - ::sg_export(baseposeInv, dst.baseposeInv); - ::sg_export(baseposeParent, dst.baseposeParent); - ::sg_export(baseposeInvParent, dst.baseposeInvParent); - ::sg_export(parentRawBoneIndex, dst.parentRawBoneIndex); - ::sg_export(ragOverrideMatrix, dst.ragOverrideMatrix); - ::sg_export(extraMatrix, dst.extraMatrix); - ::sg_export(extraVec1, dst.extraVec1); - ::sg_export(extraFloat1, dst.extraFloat1); - ::sg_export(extraInt1, dst.extraInt1); - ::sg_export(ikPosition, dst.ikPosition); - ::sg_export(ikSpeed, dst.ikSpeed); - ::sg_export(epVelocity, dst.epVelocity); - ::sg_export(epGravFactor, dst.epGravFactor); - ::sg_export(solidCount, dst.solidCount); - ::sg_export(physicsSettled, dst.physicsSettled); - ::sg_export(snapped, dst.snapped); - ::sg_export(parentBoneIndex, dst.parentBoneIndex); - ::sg_export(offsetRotation, dst.offsetRotation); - ::sg_export(overGradSpeed, dst.overGradSpeed); - ::sg_export(overGoalSpot, dst.overGoalSpot); - ::sg_export(hasOverGoal, dst.hasOverGoal); - ::sg_export(animFrameMatrix, dst.animFrameMatrix); - ::sg_export(hasAnimFrameMatrix, dst.hasAnimFrameMatrix); - ::sg_export(airTime, dst.airTime); + saved_game->write(boneNumber); + saved_game->write<>(matrix); + saved_game->write(flags); + saved_game->write(startFrame); + saved_game->write(endFrame); + saved_game->write(startTime); + saved_game->write(pauseTime); + saved_game->write(animSpeed); + saved_game->write(blendFrame); + saved_game->write(blendLerpFrame); + saved_game->write(blendTime); + saved_game->write(blendStart); + saved_game->write(boneBlendTime); + saved_game->write(boneBlendStart); + saved_game->write(newMatrix); + saved_game->write(lastTimeUpdated); + saved_game->write(lastContents); + saved_game->write(lastPosition); + saved_game->write(velocityEffector); + saved_game->write(lastAngles); + saved_game->write(minAngles); + saved_game->write(maxAngles); + saved_game->write(currentAngles); + saved_game->write(anglesOffset); + saved_game->write(positionOffset); + saved_game->write(radius); + saved_game->write(weight); + saved_game->write(ragIndex); + saved_game->write(velocityRoot); + saved_game->write(ragStartTime); + saved_game->write(firstTime); + saved_game->write(firstCollisionTime); + saved_game->write(restTime); + saved_game->write(RagFlags); + saved_game->write(DependentRagIndexMask); + saved_game->write<>(originalTrueBoneMatrix); + saved_game->write<>(parentTrueBoneMatrix); + saved_game->write<>(parentOriginalTrueBoneMatrix); + saved_game->write(originalOrigin); + saved_game->write(originalAngles); + saved_game->write(lastShotDir); + saved_game->write(basepose); + saved_game->write(baseposeInv); + saved_game->write(baseposeParent); + saved_game->write(baseposeInvParent); + saved_game->write(parentRawBoneIndex); + saved_game->write<>(ragOverrideMatrix); + saved_game->write<>(extraMatrix); + saved_game->write(extraVec1); + saved_game->write(extraFloat1); + saved_game->write(extraInt1); + saved_game->write(ikPosition); + saved_game->write(ikSpeed); + saved_game->write(epVelocity); + saved_game->write(epGravFactor); + saved_game->write(solidCount); + saved_game->write(physicsSettled); + saved_game->write(snapped); + saved_game->write(parentBoneIndex); + saved_game->write(offsetRotation); + saved_game->write(overGradSpeed); + saved_game->write(overGoalSpot); + saved_game->write(hasOverGoal); + saved_game->write<>(animFrameMatrix); + saved_game->write(hasAnimFrameMatrix); + saved_game->write(airTime); } void boneInfo_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.boneNumber, boneNumber); - ::sg_import(src.matrix, matrix); - ::sg_import(src.flags, flags); - ::sg_import(src.startFrame, startFrame); - ::sg_import(src.endFrame, endFrame); - ::sg_import(src.startTime, startTime); - ::sg_import(src.pauseTime, pauseTime); - ::sg_import(src.animSpeed, animSpeed); - ::sg_import(src.blendFrame, blendFrame); - ::sg_import(src.blendLerpFrame, blendLerpFrame); - ::sg_import(src.blendTime, blendTime); - ::sg_import(src.blendStart, blendStart); - ::sg_import(src.boneBlendTime, boneBlendTime); - ::sg_import(src.boneBlendStart, boneBlendStart); - ::sg_import(src.newMatrix, newMatrix); - ::sg_import(src.lastTimeUpdated, lastTimeUpdated); - ::sg_import(src.lastContents, lastContents); - ::sg_import(src.lastPosition, lastPosition); - ::sg_import(src.velocityEffector, velocityEffector); - ::sg_import(src.lastAngles, lastAngles); - ::sg_import(src.minAngles, minAngles); - ::sg_import(src.maxAngles, maxAngles); - ::sg_import(src.currentAngles, currentAngles); - ::sg_import(src.anglesOffset, anglesOffset); - ::sg_import(src.positionOffset, positionOffset); - ::sg_import(src.radius, radius); - ::sg_import(src.weight, weight); - ::sg_import(src.ragIndex, ragIndex); - ::sg_import(src.velocityRoot, velocityRoot); - ::sg_import(src.ragStartTime, ragStartTime); - ::sg_import(src.firstTime, firstTime); - ::sg_import(src.firstCollisionTime, firstCollisionTime); - ::sg_import(src.restTime, restTime); - ::sg_import(src.RagFlags, RagFlags); - ::sg_import(src.DependentRagIndexMask, DependentRagIndexMask); - ::sg_import(src.originalTrueBoneMatrix, originalTrueBoneMatrix); - ::sg_import(src.parentTrueBoneMatrix, parentTrueBoneMatrix); - ::sg_import(src.parentOriginalTrueBoneMatrix, parentOriginalTrueBoneMatrix); - ::sg_import(src.originalOrigin, originalOrigin); - ::sg_import(src.originalAngles, originalAngles); - ::sg_import(src.lastShotDir, lastShotDir); - ::sg_import(src.basepose, basepose); - ::sg_import(src.baseposeInv, baseposeInv); - ::sg_import(src.baseposeParent, baseposeParent); - ::sg_import(src.baseposeInvParent, baseposeInvParent); - ::sg_import(src.parentRawBoneIndex, parentRawBoneIndex); - ::sg_import(src.ragOverrideMatrix, ragOverrideMatrix); - ::sg_import(src.extraMatrix, extraMatrix); - ::sg_import(src.extraVec1, extraVec1); - ::sg_import(src.extraFloat1, extraFloat1); - ::sg_import(src.extraInt1, extraInt1); - ::sg_import(src.ikPosition, ikPosition); - ::sg_import(src.ikSpeed, ikSpeed); - ::sg_import(src.epVelocity, epVelocity); - ::sg_import(src.epGravFactor, epGravFactor); - ::sg_import(src.solidCount, solidCount); - ::sg_import(src.physicsSettled, physicsSettled); - ::sg_import(src.snapped, snapped); - ::sg_import(src.parentBoneIndex, parentBoneIndex); - ::sg_import(src.offsetRotation, offsetRotation); - ::sg_import(src.overGradSpeed, overGradSpeed); - ::sg_import(src.overGoalSpot, overGoalSpot); - ::sg_import(src.hasOverGoal, hasOverGoal); - ::sg_import(src.animFrameMatrix, animFrameMatrix); - ::sg_import(src.hasAnimFrameMatrix, hasAnimFrameMatrix); - ::sg_import(src.airTime, airTime); + saved_game->read(boneNumber); + saved_game->read<>(matrix); + saved_game->read(flags); + saved_game->read(startFrame); + saved_game->read(endFrame); + saved_game->read(startTime); + saved_game->read(pauseTime); + saved_game->read(animSpeed); + saved_game->read(blendFrame); + saved_game->read(blendLerpFrame); + saved_game->read(blendTime); + saved_game->read(blendStart); + saved_game->read(boneBlendTime); + saved_game->read(boneBlendStart); + saved_game->read(newMatrix); + saved_game->read(lastTimeUpdated); + saved_game->read(lastContents); + saved_game->read(lastPosition); + saved_game->read(velocityEffector); + saved_game->read(lastAngles); + saved_game->read(minAngles); + saved_game->read(maxAngles); + saved_game->read(currentAngles); + saved_game->read(anglesOffset); + saved_game->read(positionOffset); + saved_game->read(radius); + saved_game->read(weight); + saved_game->read(ragIndex); + saved_game->read(velocityRoot); + saved_game->read(ragStartTime); + saved_game->read(firstTime); + saved_game->read(firstCollisionTime); + saved_game->read(restTime); + saved_game->read(RagFlags); + saved_game->read(DependentRagIndexMask); + saved_game->read<>(originalTrueBoneMatrix); + saved_game->read<>(parentTrueBoneMatrix); + saved_game->read<>(parentOriginalTrueBoneMatrix); + saved_game->read(originalOrigin); + saved_game->read(originalAngles); + saved_game->read(lastShotDir); + saved_game->read(basepose); + saved_game->read(baseposeInv); + saved_game->read(baseposeParent); + saved_game->read(baseposeInvParent); + saved_game->read(parentRawBoneIndex); + saved_game->read<>(ragOverrideMatrix); + saved_game->read<>(extraMatrix); + saved_game->read(extraVec1); + saved_game->read(extraFloat1); + saved_game->read(extraInt1); + saved_game->read(ikPosition); + saved_game->read(ikSpeed); + saved_game->read(epVelocity); + saved_game->read(epGravFactor); + saved_game->read(solidCount); + saved_game->read(physicsSettled); + saved_game->read(snapped); + saved_game->read(parentBoneIndex); + saved_game->read(offsetRotation); + saved_game->read(overGradSpeed); + saved_game->read(overGoalSpot); + saved_game->read(hasOverGoal); + saved_game->read<>(animFrameMatrix); + saved_game->read(hasAnimFrameMatrix); + saved_game->read(airTime); } void boltInfo_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(boneNumber, dst.boneNumber); - ::sg_export(surfaceNumber, dst.surfaceNumber); - ::sg_export(surfaceType, dst.surfaceType); - ::sg_export(boltUsed, dst.boltUsed); + saved_game->write(boneNumber); + saved_game->write(surfaceNumber); + saved_game->write(surfaceType); + saved_game->write(boltUsed); } void boltInfo_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.boneNumber, boneNumber); - ::sg_import(src.surfaceNumber, surfaceNumber); - ::sg_import(src.surfaceType, surfaceType); - ::sg_import(src.boltUsed, boltUsed); + saved_game->read(boneNumber); + saved_game->read(surfaceNumber); + saved_game->read(surfaceType); + saved_game->read(boltUsed); } void CGhoul2Info::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(mModelindex, dst.mModelindex); - ::sg_export(animModelIndexOffset, dst.animModelIndexOffset); - ::sg_export(mCustomShader, dst.mCustomShader); - ::sg_export(mCustomSkin, dst.mCustomSkin); - ::sg_export(mModelBoltLink, dst.mModelBoltLink); - ::sg_export(mSurfaceRoot, dst.mSurfaceRoot); - ::sg_export(mLodBias, dst.mLodBias); - ::sg_export(mNewOrigin, dst.mNewOrigin); + saved_game->write(mModelindex); + saved_game->write(animModelIndexOffset); + saved_game->write(mCustomShader); + saved_game->write(mCustomSkin); + saved_game->write(mModelBoltLink); + saved_game->write(mSurfaceRoot); + saved_game->write(mLodBias); + saved_game->write(mNewOrigin); #ifdef _G2_GORE - ::sg_export(mGoreSetTag, dst.mGoreSetTag); + saved_game->write(mGoreSetTag); #endif - ::sg_export(mModel, dst.mModel); - ::sg_export(mFileName, dst.mFileName); - ::sg_export(mAnimFrameDefault, dst.mAnimFrameDefault); - ::sg_export(mSkelFrameNum, dst.mSkelFrameNum); - ::sg_export(mMeshFrameNum, dst.mMeshFrameNum); - ::sg_export(mFlags, dst.mFlags); + saved_game->write(mModel); + saved_game->write(mFileName); + saved_game->write(mAnimFrameDefault); + saved_game->write(mSkelFrameNum); + saved_game->write(mMeshFrameNum); + saved_game->write(mFlags); } void CGhoul2Info::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.mModelindex, mModelindex); - ::sg_import(src.animModelIndexOffset, animModelIndexOffset); - ::sg_import(src.mCustomShader, mCustomShader); - ::sg_import(src.mCustomSkin, mCustomSkin); - ::sg_import(src.mModelBoltLink, mModelBoltLink); - ::sg_import(src.mSurfaceRoot, mSurfaceRoot); - ::sg_import(src.mLodBias, mLodBias); - ::sg_import(src.mNewOrigin, mNewOrigin); + saved_game->read(mModelindex); + saved_game->read(animModelIndexOffset); + saved_game->read(mCustomShader); + saved_game->read(mCustomSkin); + saved_game->read(mModelBoltLink); + saved_game->read(mSurfaceRoot); + saved_game->read(mLodBias); + saved_game->read(mNewOrigin); #ifdef _G2_GORE - ::sg_import(src.mGoreSetTag, mGoreSetTag); + saved_game->read(mGoreSetTag); #endif - ::sg_import(src.mModel, mModel); - ::sg_import(src.mFileName, mFileName); - ::sg_import(src.mAnimFrameDefault, mAnimFrameDefault); - ::sg_import(src.mSkelFrameNum, mSkelFrameNum); - ::sg_import(src.mMeshFrameNum, mMeshFrameNum); - ::sg_import(src.mFlags, mFlags); + saved_game->read(mModel); + saved_game->read(mFileName); + saved_game->read(mAnimFrameDefault); + saved_game->read(mSkelFrameNum); + saved_game->read(mMeshFrameNum); + saved_game->read(mFlags); } void CGhoul2Info_v::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(mItem, dst.mItem); + saved_game->write(mItem); } void CGhoul2Info_v::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.mItem, mItem); + saved_game->read(mItem); +} + +void CCollisionRecord::sg_export( + ojk::ISavedGame* saved_game) const +{ + saved_game->write(mDistance); + saved_game->write(mEntityNum); + saved_game->write(mModelIndex); + saved_game->write(mPolyIndex); + saved_game->write(mSurfaceIndex); + saved_game->write(mCollisionPosition); + saved_game->write(mCollisionNormal); + saved_game->write(mFlags); + saved_game->write(mMaterial); + saved_game->write(mLocation); + saved_game->write(mBarycentricI); + saved_game->write(mBarycentricJ); +} + +void CCollisionRecord::sg_import( + ojk::ISavedGame* saved_game) +{ + saved_game->read(mDistance); + saved_game->read(mEntityNum); + saved_game->read(mModelIndex); + saved_game->read(mPolyIndex); + saved_game->read(mSurfaceIndex); + saved_game->read(mCollisionPosition); + saved_game->read(mCollisionNormal); + saved_game->read(mFlags); + saved_game->read(mMaterial); + saved_game->read(mLocation); + saved_game->read(mBarycentricI); + saved_game->read(mBarycentricJ); } diff --git a/code/rd-common/mdx_format.cpp b/code/rd-common/mdx_format.cpp index 8bfbc43ff0..bb94d8d3c4 100644 --- a/code/rd-common/mdx_format.cpp +++ b/code/rd-common/mdx_format.cpp @@ -1,16 +1,16 @@ #include "qcommon/q_shared.h" #include "mdx_format.h" -#include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_i_saved_game.h" void mdxaBone_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(matrix, dst.matrix); + saved_game->write(matrix); } void mdxaBone_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.matrix, matrix); + saved_game->read(matrix); } diff --git a/code/rd-common/mdx_format.h b/code/rd-common/mdx_format.h index d7c3736bba..9194f034a1 100644 --- a/code/rd-common/mdx_format.h +++ b/code/rd-common/mdx_format.h @@ -158,30 +158,16 @@ mdxaCompQuatBone_t #ifndef MDXABONEDEF -#ifdef __cplusplus -#pragma pack(push, 4) -class SgMdxaBone -{ -public: - SgArray2d matrix; -}; // SgMdxaBone -#pragma pack(pop) -#endif // __cplusplus - typedef struct { -#ifdef __cplusplus - using SgType = SgMdxaBone; -#endif // __cplusplus - float matrix[3][4]; #ifdef __cplusplus void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); #endif // __cplusplus } mdxaBone_t; #endif diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index 02dbec00e5..e4ddfec308 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -78,9 +78,6 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" - "${SharedDir}/qcommon/ojk_sg_wrappers.h" - "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" - "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" "${SharedDir}/qcommon/ojk_i_saved_game.h" "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" ${SharedCommonFiles} diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index 676ae4d026..a1afb8bd5e 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -50,7 +50,6 @@ along with this program; if not, see . #ifdef _G2_GORE #include "../ghoul2/ghoul2_gore.h" -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" #define GORE_TAG_UPPER (256) @@ -1762,7 +1761,7 @@ void *G2_FindSurface(const model_s *mod, int index, int lod) return (void *)current; } -#if 0 +#if 1 #define SURFACE_SAVE_BLOCK_SIZE sizeof(surfaceInfo_t) #define BOLT_SAVE_BLOCK_SIZE sizeof(boltInfo_t) #define BONE_SAVE_BLOCK_SIZE sizeof(boneInfo_t) @@ -1772,6 +1771,7 @@ const auto BOLT_SAVE_BLOCK_SIZE = static_cast(sizeof(SgBoltInfo)); const auto BONE_SAVE_BLOCK_SIZE = static_cast(sizeof(SgBoneInfo)); #endif +#if 0 void G2_SaveGhoul2Models(CGhoul2Info_v &ghoul2) { char *pGhoul2Data = NULL; @@ -1891,7 +1891,78 @@ void G2_SaveGhoul2Models(CGhoul2Info_v &ghoul2) R_Free(pGhoul2Data); } +#else +void G2_SaveGhoul2Models( + CGhoul2Info_v& ghoul2) +{ + // is there anything to save? + if (!ghoul2.IsValid() || ghoul2.size() == 0) { + auto empty_value = 0; + + ::ri.saved_game->write_chunk( + INT_ID('G', 'H', 'L', '2'), + empty_value); //write out a zero buffer + + return; + } + + ::ri.saved_game->reset_buffer(); + + // save out how many ghoul2 models we have + auto model_count = ghoul2.size(); + + ::ri.saved_game->write( + model_count); + + for (decltype(model_count) i = 0; i < model_count; ++i) { + // first save out the ghoul2 details themselves + ghoul2[i].sg_export( + ::ri.saved_game); + + // save out how many surfaces we have + auto surface_count = ghoul2[i].mSlist.size(); + + ::ri.saved_game->write( + surface_count); + // now save the all the surface list info + for (decltype(surface_count) x = 0; x < surface_count; ++x) { + ghoul2[i].mSlist[x].sg_export( + ::ri.saved_game); + } + + // save out how many bones we have + auto bone_count = ghoul2[i].mBlist.size(); + + ::ri.saved_game->write( + bone_count); + + // now save the all the bone list info + for (decltype(bone_count) x = 0; x < bone_count; ++x) { + ghoul2[i].mBlist[x].sg_export( + ::ri.saved_game); + } + + // save out how many bolts we have + auto bolt_count = ghoul2[i].mBltlist.size(); + + ::ri.saved_game->write( + bolt_count); + + // lastly save the all the bolt list info + for (decltype(bolt_count) x = 0; x < bolt_count; ++x) + { + ghoul2[i].mBltlist[x].sg_export( + ::ri.saved_game); + } + } + + ::ri.saved_game->write_chunk( + INT_ID('G', 'H', 'L', '2')); +} +#endif + +#if 0 void G2_LoadGhoul2Model(CGhoul2Info_v &ghoul2, char *buffer) { // first thing, lets see how many ghoul2 models we have, and resize our buffers accordingly @@ -1972,3 +2043,90 @@ void G2_LoadGhoul2Model(CGhoul2Info_v &ghoul2, char *buffer) } } } +#else +// FIXME Remove 'buffer' parameter +void G2_LoadGhoul2Model( + CGhoul2Info_v& ghoul2, + char* buffer) +{ + static_cast(buffer); + + // first thing, lets see how many ghoul2 models we have, and resize our buffers accordingly + auto model_count = 0; + + ::ri.saved_game->read( + model_count); + + ghoul2.resize( + model_count); + + // did we actually resize to a value? + if (model_count == 0) { + // no, ok, well, done then. + return; + } + + // now we have enough instances, lets go through each one and load up the relevant details + for (decltype(model_count) i = 0; i < model_count; ++i) { + ghoul2[i].mSkelFrameNum = 0; + ghoul2[i].mModelindex = -1; + ghoul2[i].mFileName[0] = 0; + ghoul2[i].mValid = false; + + // load the ghoul2 info from the buffer + ghoul2[i].sg_import( + ::ri.saved_game); + + if (ghoul2[i].mModelindex != -1 && ghoul2[i].mFileName[0]) { + ghoul2[i].mModelindex = i; + + ::G2_SetupModelPointers( + &ghoul2[i]); + } + + // give us enough surfaces to load up the data + auto surface_count = 0; + + ::ri.saved_game->read( + surface_count); + + ghoul2[i].mSlist.resize(surface_count); + + // now load all the surfaces + for (decltype(surface_count) x = 0; x < surface_count; ++x) { + ghoul2[i].mSlist[x].sg_import( + ::ri.saved_game); + } + + // give us enough bones to load up the data + auto bone_count = 0; + + ::ri.saved_game->read( + bone_count); + + ghoul2[i].mBlist.resize( + bone_count); + + // now load all the bones + for (decltype(bone_count) x = 0; x < bone_count; ++x) { + ghoul2[i].mBlist[x].sg_import( + ::ri.saved_game); + } + + // give us enough bolts to load up the data + auto bolt_count = 0; + + ::ri.saved_game->read( + bolt_count); + + ghoul2[i].mBltlist.resize( + bolt_count); + + // now load all the bolts + for (decltype(bolt_count) x = 0; x < bolt_count; ++x) { + ghoul2[i].mBltlist[x].sg_import( + ::ri.saved_game); + } + } +} +#endif diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 52d70841c2..b856df37f0 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -37,7 +37,6 @@ along with this program; if not, see . #include -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_saved_game.h" static char saveGameComment[iSG_COMMENT_SIZE]; diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index 2804a04676..2e12a2b1bc 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -28,7 +28,6 @@ along with this program; if not, see . #include "../../code/client/vmachine.h" #include "../../code/qcommon/sstring.h" -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index 37d91ebdf0..4412aa1aa0 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -131,6 +131,7 @@ set(JK2SPGameGameFiles "${JK2SPDir}/game/ai.h" "${JK2SPDir}/game/ai.cpp" "${JK2SPDir}/game/anims.h" + "${JK2SPDir}/game/anims.cpp" "${JK2SPDir}/game/b_local.h" "${JK2SPDir}/game/b_public.h" "${JK2SPDir}/game/b_public.cpp" @@ -237,9 +238,6 @@ set(JK2SPGameCommonFiles "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SPDir}/qcommon/strippublic.h" - "${SharedDir}/qcommon/ojk_sg_wrappers.h" - "${SharedDir}/qcommon/ojk_sg_wrappers_fwd.h" - "${SharedDir}/qcommon/ojk_sg_wrappers_shared.h" "${SharedDir}/qcommon/ojk_i_saved_game.h" "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" diff --git a/codeJK2/game/G_Timer.cpp b/codeJK2/game/G_Timer.cpp index c67eda9a98..1896e48a86 100644 --- a/codeJK2/game/G_Timer.cpp +++ b/codeJK2/game/G_Timer.cpp @@ -23,7 +23,6 @@ along with this program; if not, see . #include "g_local.h" #include "../../code/Rufl/hstring.h" -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" #define MAX_GTIMERS 16384 diff --git a/codeJK2/game/Q3_Registers.cpp b/codeJK2/game/Q3_Registers.cpp index 3fb2e65dd9..2c4602f124 100644 --- a/codeJK2/game/Q3_Registers.cpp +++ b/codeJK2/game/Q3_Registers.cpp @@ -24,7 +24,6 @@ along with this program; if not, see . #include "g_local.h" #include "Q3_Registers.h" -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" extern void Q3_DebugPrint( int level, const char *format, ... ); diff --git a/codeJK2/game/ai.cpp b/codeJK2/game/ai.cpp index aa46625336..7ba59e07ab 100644 --- a/codeJK2/game/ai.cpp +++ b/codeJK2/game/ai.cpp @@ -1,67 +1,67 @@ #include "../cgame/cg_local.h" #include "ai.h" -#include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_i_saved_game.h" void AIGroupMember_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(number, dst.number); - ::sg_export(waypoint, dst.waypoint); - ::sg_export(pathCostToEnemy, dst.pathCostToEnemy); - ::sg_export(closestBuddy, dst.closestBuddy); + saved_game->write(number); + saved_game->write(waypoint); + saved_game->write(pathCostToEnemy); + saved_game->write(closestBuddy); } void AIGroupMember_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.number, number); - ::sg_import(src.waypoint, waypoint); - ::sg_import(src.pathCostToEnemy, pathCostToEnemy); - ::sg_import(src.closestBuddy, closestBuddy); + saved_game->read(number); + saved_game->read(waypoint); + saved_game->read(pathCostToEnemy); + saved_game->read(closestBuddy); } void AIGroupInfo_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(numGroup, dst.numGroup); - ::sg_export(processed, dst.processed); - ::sg_export(team, dst.team); - ::sg_export(enemy, dst.enemy); - ::sg_export(enemyWP, dst.enemyWP); - ::sg_export(speechDebounceTime, dst.speechDebounceTime); - ::sg_export(lastClearShotTime, dst.lastClearShotTime); - ::sg_export(lastSeenEnemyTime, dst.lastSeenEnemyTime); - ::sg_export(morale, dst.morale); - ::sg_export(moraleAdjust, dst.moraleAdjust); - ::sg_export(moraleDebounce, dst.moraleDebounce); - ::sg_export(memberValidateTime, dst.memberValidateTime); - ::sg_export(activeMemberNum, dst.activeMemberNum); - ::sg_export(commander, dst.commander); - ::sg_export(enemyLastSeenPos, dst.enemyLastSeenPos); - ::sg_export(numState, dst.numState); - ::sg_export(member, dst.member); + saved_game->write(numGroup); + saved_game->write(processed); + saved_game->write(team); + saved_game->write(enemy); + saved_game->write(enemyWP); + saved_game->write(speechDebounceTime); + saved_game->write(lastClearShotTime); + saved_game->write(lastSeenEnemyTime); + saved_game->write(morale); + saved_game->write(moraleAdjust); + saved_game->write(moraleDebounce); + saved_game->write(memberValidateTime); + saved_game->write(activeMemberNum); + saved_game->write(commander); + saved_game->write(enemyLastSeenPos); + saved_game->write(numState); + saved_game->write<>(member); } void AIGroupInfo_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.numGroup, numGroup); - ::sg_import(src.processed, processed); - ::sg_import(src.team, team); - ::sg_import(src.enemy, enemy); - ::sg_import(src.enemyWP, enemyWP); - ::sg_import(src.speechDebounceTime, speechDebounceTime); - ::sg_import(src.lastClearShotTime, lastClearShotTime); - ::sg_import(src.lastSeenEnemyTime, lastSeenEnemyTime); - ::sg_import(src.morale, morale); - ::sg_import(src.moraleAdjust, moraleAdjust); - ::sg_import(src.moraleDebounce, moraleDebounce); - ::sg_import(src.memberValidateTime, memberValidateTime); - ::sg_import(src.activeMemberNum, activeMemberNum); - ::sg_import(src.commander, commander); - ::sg_import(src.enemyLastSeenPos, enemyLastSeenPos); - ::sg_import(src.numState, numState); - ::sg_import(src.member, member); + saved_game->read(numGroup); + saved_game->read(processed); + saved_game->read(team); + saved_game->read(enemy); + saved_game->read(enemyWP); + saved_game->read(speechDebounceTime); + saved_game->read(lastClearShotTime); + saved_game->read(lastSeenEnemyTime); + saved_game->read(morale); + saved_game->read(moraleAdjust); + saved_game->read(moraleDebounce); + saved_game->read(memberValidateTime); + saved_game->read(activeMemberNum); + saved_game->read(commander); + saved_game->read(enemyLastSeenPos); + saved_game->read(numState); + saved_game->read<>(member); } diff --git a/codeJK2/game/ai.h b/codeJK2/game/ai.h index 38c13cca3a..b0dcba6994 100644 --- a/codeJK2/game/ai.h +++ b/codeJK2/game/ai.h @@ -105,22 +105,8 @@ void NPC_BSHowler_Default( void ); //Group AI #define MAX_FRAME_GROUPS 32 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgAiGroupMember -{ -public: - int32_t number; - int32_t waypoint; - int32_t pathCostToEnemy; - int32_t closestBuddy; -}; // SgAiGroupMember -#pragma pack(pop) - typedef struct AIGroupMember_s { - using SgType = SgAiGroupMember; - - int number; int waypoint; int pathCostToEnemy; @@ -128,43 +114,16 @@ typedef struct AIGroupMember_s void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } AIGroupMember_t; #define MAX_GROUP_MEMBERS 32 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgAiGroupInfo -{ -public: - int32_t numGroup; - int32_t processed; - int32_t team; - int32_t enemy; - int32_t enemyWP; - int32_t speechDebounceTime; - int32_t lastClearShotTime; - int32_t lastSeenEnemyTime; - int32_t morale; - int32_t moraleAdjust; - int32_t moraleDebounce; - int32_t memberValidateTime; - int32_t activeMemberNum; - int32_t commander; - SgVec3 enemyLastSeenPos; - SgArray numState; - SgArray member; -}; // SgAiGroupInfo -#pragma pack(pop) - typedef struct AIGroupInfo_s { - using SgType = SgAiGroupInfo; - - int numGroup; qboolean processed; team_t team; @@ -185,10 +144,10 @@ typedef struct AIGroupInfo_s void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } AIGroupInfo_t; int AI_GetGroupSize( vec3_t origin, int radius, team_t playerTeam, gentity_t *avoid = NULL ); diff --git a/codeJK2/game/anims.cpp b/codeJK2/game/anims.cpp new file mode 100644 index 0000000000..0c97035dc4 --- /dev/null +++ b/codeJK2/game/anims.cpp @@ -0,0 +1,24 @@ +#include "g_local.h" +#include "anims.h" +#include "qcommon/ojk_i_saved_game.h" + + +void animFileSet_t::sg_export( + ojk::ISavedGame* saved_game) const +{ + saved_game->write(filename); + saved_game->write<>(animations); + saved_game->write<>(torsoAnimSnds); + saved_game->write<>(legsAnimSnds); + saved_game->write(soundsCached); +} + +void animFileSet_t::sg_import( + ojk::ISavedGame* saved_game) +{ + saved_game->read(filename); + saved_game->read<>(animations); + saved_game->read<>(torsoAnimSnds); + saved_game->read<>(legsAnimSnds); + saved_game->read(soundsCached); +} diff --git a/codeJK2/game/anims.h b/codeJK2/game/anims.h index b8675487c4..3d137477f1 100644 --- a/codeJK2/game/anims.h +++ b/codeJK2/game/anims.h @@ -1399,23 +1399,8 @@ extern stringID_table_t animTable [MAX_ANIMATIONS+1]; #endif// #ifndef CG_PLAYER_CPP // !!!!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!!!! -#pragma pack(push, 4) -class SgAnimFileSet -{ -public: - SgArray filename; - SgArray animations; - SgArray torsoAnimSnds; - SgArray legsAnimSnds; - int32_t soundsCached; -}; // SgAnimFileSet -#pragma pack(pop) - typedef struct { - using SgType = SgAnimFileSet; - - char filename[MAX_QPATH]; animation_t animations[MAX_ANIMATIONS]; animsounds_t torsoAnimSnds[MAX_ANIM_SOUNDS]; @@ -1424,24 +1409,10 @@ typedef struct void sg_export( - SgType& dst) const - { - ::sg_export(filename, dst.filename); - ::sg_export(animations, dst.animations); - ::sg_export(torsoAnimSnds, dst.torsoAnimSnds); - ::sg_export(legsAnimSnds, dst.legsAnimSnds); - ::sg_export(soundsCached, dst.soundsCached); - } + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src) - { - ::sg_import(src.filename, filename); - ::sg_import(src.animations, animations); - ::sg_import(src.torsoAnimSnds, torsoAnimSnds); - ::sg_import(src.legsAnimSnds, legsAnimSnds); - ::sg_import(src.soundsCached, soundsCached); - } + ojk::ISavedGame* saved_game); } animFileSet_t; #define MAX_ANIM_FILES 64 diff --git a/codeJK2/game/b_public.cpp b/codeJK2/game/b_public.cpp index 21a9cc1565..bc3daae4f2 100644 --- a/codeJK2/game/b_public.cpp +++ b/codeJK2/game/b_public.cpp @@ -1,259 +1,259 @@ #include "b_local.h" #include "b_public.h" -#include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_i_saved_game.h" void gNPCstats_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(aggression, dst.aggression); - ::sg_export(aim, dst.aim); - ::sg_export(earshot, dst.earshot); - ::sg_export(evasion, dst.evasion); - ::sg_export(hfov, dst.hfov); - ::sg_export(intelligence, dst.intelligence); - ::sg_export(move, dst.move); - ::sg_export(reactions, dst.reactions); - ::sg_export(shootDistance, dst.shootDistance); - ::sg_export(vfov, dst.vfov); - ::sg_export(vigilance, dst.vigilance); - ::sg_export(visrange, dst.visrange); - ::sg_export(moveType, dst.moveType); - ::sg_export(runSpeed, dst.runSpeed); - ::sg_export(walkSpeed, dst.walkSpeed); - ::sg_export(yawSpeed, dst.yawSpeed); - ::sg_export(health, dst.health); - ::sg_export(acceleration, dst.acceleration); + saved_game->write(aggression); + saved_game->write(aim); + saved_game->write(earshot); + saved_game->write(evasion); + saved_game->write(hfov); + saved_game->write(intelligence); + saved_game->write(move); + saved_game->write(reactions); + saved_game->write(shootDistance); + saved_game->write(vfov); + saved_game->write(vigilance); + saved_game->write(visrange); + saved_game->write(moveType); + saved_game->write(runSpeed); + saved_game->write(walkSpeed); + saved_game->write(yawSpeed); + saved_game->write(health); + saved_game->write(acceleration); } void gNPCstats_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.aggression, aggression); - ::sg_import(src.aim, aim); - ::sg_import(src.earshot, earshot); - ::sg_import(src.evasion, evasion); - ::sg_import(src.hfov, hfov); - ::sg_import(src.intelligence, intelligence); - ::sg_import(src.move, move); - ::sg_import(src.reactions, reactions); - ::sg_import(src.shootDistance, shootDistance); - ::sg_import(src.vfov, vfov); - ::sg_import(src.vigilance, vigilance); - ::sg_import(src.visrange, visrange); - ::sg_import(src.moveType, moveType); - ::sg_import(src.runSpeed, runSpeed); - ::sg_import(src.walkSpeed, walkSpeed); - ::sg_import(src.yawSpeed, yawSpeed); - ::sg_import(src.health, health); - ::sg_import(src.acceleration, acceleration); + saved_game->read(aggression); + saved_game->read(aim); + saved_game->read(earshot); + saved_game->read(evasion); + saved_game->read(hfov); + saved_game->read(intelligence); + saved_game->read(move); + saved_game->read(reactions); + saved_game->read(shootDistance); + saved_game->read(vfov); + saved_game->read(vigilance); + saved_game->read(visrange); + saved_game->read(moveType); + saved_game->read(runSpeed); + saved_game->read(walkSpeed); + saved_game->read(yawSpeed); + saved_game->read(health); + saved_game->read(acceleration); } void gNPC_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(timeOfDeath, dst.timeOfDeath); - ::sg_export(touchedByPlayer, dst.touchedByPlayer); - ::sg_export(enemyLastVisibility, dst.enemyLastVisibility); - ::sg_export(aimTime, dst.aimTime); - ::sg_export(desiredYaw, dst.desiredYaw); - ::sg_export(desiredPitch, dst.desiredPitch); - ::sg_export(lockedDesiredYaw, dst.lockedDesiredYaw); - ::sg_export(lockedDesiredPitch, dst.lockedDesiredPitch); - ::sg_export(aimingBeam, dst.aimingBeam); - ::sg_export(enemyLastSeenLocation, dst.enemyLastSeenLocation); - ::sg_export(enemyLastSeenTime, dst.enemyLastSeenTime); - ::sg_export(enemyLastHeardLocation, dst.enemyLastHeardLocation); - ::sg_export(enemyLastHeardTime, dst.enemyLastHeardTime); - ::sg_export(lastAlertID, dst.lastAlertID); - ::sg_export(eFlags, dst.eFlags); - ::sg_export(aiFlags, dst.aiFlags); - ::sg_export(currentAmmo, dst.currentAmmo); - ::sg_export(shotTime, dst.shotTime); - ::sg_export(burstCount, dst.burstCount); - ::sg_export(burstMin, dst.burstMin); - ::sg_export(burstMean, dst.burstMean); - ::sg_export(burstMax, dst.burstMax); - ::sg_export(burstSpacing, dst.burstSpacing); - ::sg_export(attackHold, dst.attackHold); - ::sg_export(attackHoldTime, dst.attackHoldTime); - ::sg_export(shootAngles, dst.shootAngles); - ::sg_export(rank, dst.rank); - ::sg_export(behaviorState, dst.behaviorState); - ::sg_export(defaultBehavior, dst.defaultBehavior); - ::sg_export(tempBehavior, dst.tempBehavior); - ::sg_export(ignorePain, dst.ignorePain); - ::sg_export(duckDebounceTime, dst.duckDebounceTime); - ::sg_export(walkDebounceTime, dst.walkDebounceTime); - ::sg_export(enemyCheckDebounceTime, dst.enemyCheckDebounceTime); - ::sg_export(investigateDebounceTime, dst.investigateDebounceTime); - ::sg_export(investigateCount, dst.investigateCount); - ::sg_export(investigateGoal, dst.investigateGoal); - ::sg_export(investigateSoundDebounceTime, dst.investigateSoundDebounceTime); - ::sg_export(greetingDebounceTime, dst.greetingDebounceTime); - ::sg_export(eventOwner, dst.eventOwner); - ::sg_export(coverTarg, dst.coverTarg); - ::sg_export(jumpState, dst.jumpState); - ::sg_export(followDist, dst.followDist); - ::sg_export(tempGoal, dst.tempGoal); - ::sg_export(goalEntity, dst.goalEntity); - ::sg_export(lastGoalEntity, dst.lastGoalEntity); - ::sg_export(eventualGoal, dst.eventualGoal); - ::sg_export(captureGoal, dst.captureGoal); - ::sg_export(defendEnt, dst.defendEnt); - ::sg_export(greetEnt, dst.greetEnt); - ::sg_export(goalTime, dst.goalTime); - ::sg_export(straightToGoal, dst.straightToGoal); - ::sg_export(distToGoal, dst.distToGoal); - ::sg_export(navTime, dst.navTime); - ::sg_export(blockingEntNum, dst.blockingEntNum); - ::sg_export(blockedSpeechDebounceTime, dst.blockedSpeechDebounceTime); - ::sg_export(lastSideStepSide, dst.lastSideStepSide); - ::sg_export(sideStepHoldTime, dst.sideStepHoldTime); - ::sg_export(homeWp, dst.homeWp); - ::sg_export(group, dst.group); - ::sg_export(lastPathAngles, dst.lastPathAngles); - ::sg_export(stats, dst.stats); - ::sg_export(aimErrorDebounceTime, dst.aimErrorDebounceTime); - ::sg_export(lastAimErrorYaw, dst.lastAimErrorYaw); - ::sg_export(lastAimErrorPitch, dst.lastAimErrorPitch); - ::sg_export(aimOfs, dst.aimOfs); - ::sg_export(currentAim, dst.currentAim); - ::sg_export(currentAggression, dst.currentAggression); - ::sg_export(scriptFlags, dst.scriptFlags); - ::sg_export(desiredSpeed, dst.desiredSpeed); - ::sg_export(currentSpeed, dst.currentSpeed); - ::sg_export(last_forwardmove, dst.last_forwardmove); - ::sg_export(last_rightmove, dst.last_rightmove); - ::sg_export(lastClearOrigin, dst.lastClearOrigin); - ::sg_export(consecutiveBlockedMoves, dst.consecutiveBlockedMoves); - ::sg_export(blockedDebounceTime, dst.blockedDebounceTime); - ::sg_export(shoveCount, dst.shoveCount); - ::sg_export(blockedDest, dst.blockedDest); - ::sg_export(combatPoint, dst.combatPoint); - ::sg_export(lastFailedCombatPoint, dst.lastFailedCombatPoint); - ::sg_export(movementSpeech, dst.movementSpeech); - ::sg_export(movementSpeechChance, dst.movementSpeechChance); - ::sg_export(nextBStateThink, dst.nextBStateThink); - ::sg_export(last_ucmd, dst.last_ucmd); - ::sg_export(combatMove, dst.combatMove); - ::sg_export(goalRadius, dst.goalRadius); - ::sg_export(pauseTime, dst.pauseTime); - ::sg_export(standTime, dst.standTime); - ::sg_export(localState, dst.localState); - ::sg_export(squadState, dst.squadState); - ::sg_export(confusionTime, dst.confusionTime); - ::sg_export(charmedTime, dst.charmedTime); - ::sg_export(controlledTime, dst.controlledTime); - ::sg_export(surrenderTime, dst.surrenderTime); - ::sg_export(enemyLaggedPos, dst.enemyLaggedPos); - ::sg_export(watchTarget, dst.watchTarget); - ::sg_export(ffireCount, dst.ffireCount); - ::sg_export(ffireDebounce, dst.ffireDebounce); - ::sg_export(ffireFadeDebounce, dst.ffireFadeDebounce); + saved_game->write(timeOfDeath); + saved_game->write(touchedByPlayer); + saved_game->write(enemyLastVisibility); + saved_game->write(aimTime); + saved_game->write(desiredYaw); + saved_game->write(desiredPitch); + saved_game->write(lockedDesiredYaw); + saved_game->write(lockedDesiredPitch); + saved_game->write(aimingBeam); + saved_game->write(enemyLastSeenLocation); + saved_game->write(enemyLastSeenTime); + saved_game->write(enemyLastHeardLocation); + saved_game->write(enemyLastHeardTime); + saved_game->write(lastAlertID); + saved_game->write(eFlags); + saved_game->write(aiFlags); + saved_game->write(currentAmmo); + saved_game->write(shotTime); + saved_game->write(burstCount); + saved_game->write(burstMin); + saved_game->write(burstMean); + saved_game->write(burstMax); + saved_game->write(burstSpacing); + saved_game->write(attackHold); + saved_game->write(attackHoldTime); + saved_game->write(shootAngles); + saved_game->write(rank); + saved_game->write(behaviorState); + saved_game->write(defaultBehavior); + saved_game->write(tempBehavior); + saved_game->write(ignorePain); + saved_game->write(duckDebounceTime); + saved_game->write(walkDebounceTime); + saved_game->write(enemyCheckDebounceTime); + saved_game->write(investigateDebounceTime); + saved_game->write(investigateCount); + saved_game->write(investigateGoal); + saved_game->write(investigateSoundDebounceTime); + saved_game->write(greetingDebounceTime); + saved_game->write(eventOwner); + saved_game->write(coverTarg); + saved_game->write(jumpState); + saved_game->write(followDist); + saved_game->write(tempGoal); + saved_game->write(goalEntity); + saved_game->write(lastGoalEntity); + saved_game->write(eventualGoal); + saved_game->write(captureGoal); + saved_game->write(defendEnt); + saved_game->write(greetEnt); + saved_game->write(goalTime); + saved_game->write(straightToGoal); + saved_game->write(distToGoal); + saved_game->write(navTime); + saved_game->write(blockingEntNum); + saved_game->write(blockedSpeechDebounceTime); + saved_game->write(lastSideStepSide); + saved_game->write(sideStepHoldTime); + saved_game->write(homeWp); + saved_game->write(group); + saved_game->write(lastPathAngles); + saved_game->write<>(stats); + saved_game->write(aimErrorDebounceTime); + saved_game->write(lastAimErrorYaw); + saved_game->write(lastAimErrorPitch); + saved_game->write(aimOfs); + saved_game->write(currentAim); + saved_game->write(currentAggression); + saved_game->write(scriptFlags); + saved_game->write(desiredSpeed); + saved_game->write(currentSpeed); + saved_game->write(last_forwardmove); + saved_game->write(last_rightmove); + saved_game->write(lastClearOrigin); + saved_game->write(consecutiveBlockedMoves); + saved_game->write(blockedDebounceTime); + saved_game->write(shoveCount); + saved_game->write(blockedDest); + saved_game->write(combatPoint); + saved_game->write(lastFailedCombatPoint); + saved_game->write(movementSpeech); + saved_game->write(movementSpeechChance); + saved_game->write(nextBStateThink); + saved_game->write<>(last_ucmd); + saved_game->write(combatMove); + saved_game->write(goalRadius); + saved_game->write(pauseTime); + saved_game->write(standTime); + saved_game->write(localState); + saved_game->write(squadState); + saved_game->write(confusionTime); + saved_game->write(charmedTime); + saved_game->write(controlledTime); + saved_game->write(surrenderTime); + saved_game->write(enemyLaggedPos); + saved_game->write(watchTarget); + saved_game->write(ffireCount); + saved_game->write(ffireDebounce); + saved_game->write(ffireFadeDebounce); } void gNPC_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.timeOfDeath, timeOfDeath); - ::sg_import(src.touchedByPlayer, touchedByPlayer); - ::sg_import(src.enemyLastVisibility, enemyLastVisibility); - ::sg_import(src.aimTime, aimTime); - ::sg_import(src.desiredYaw, desiredYaw); - ::sg_import(src.desiredPitch, desiredPitch); - ::sg_import(src.lockedDesiredYaw, lockedDesiredYaw); - ::sg_import(src.lockedDesiredPitch, lockedDesiredPitch); - ::sg_import(src.aimingBeam, aimingBeam); - ::sg_import(src.enemyLastSeenLocation, enemyLastSeenLocation); - ::sg_import(src.enemyLastSeenTime, enemyLastSeenTime); - ::sg_import(src.enemyLastHeardLocation, enemyLastHeardLocation); - ::sg_import(src.enemyLastHeardTime, enemyLastHeardTime); - ::sg_import(src.lastAlertID, lastAlertID); - ::sg_import(src.eFlags, eFlags); - ::sg_import(src.aiFlags, aiFlags); - ::sg_import(src.currentAmmo, currentAmmo); - ::sg_import(src.shotTime, shotTime); - ::sg_import(src.burstCount, burstCount); - ::sg_import(src.burstMin, burstMin); - ::sg_import(src.burstMean, burstMean); - ::sg_import(src.burstMax, burstMax); - ::sg_import(src.burstSpacing, burstSpacing); - ::sg_import(src.attackHold, attackHold); - ::sg_import(src.attackHoldTime, attackHoldTime); - ::sg_import(src.shootAngles, shootAngles); - ::sg_import(src.rank, rank); - ::sg_import(src.behaviorState, behaviorState); - ::sg_import(src.defaultBehavior, defaultBehavior); - ::sg_import(src.tempBehavior, tempBehavior); - ::sg_import(src.ignorePain, ignorePain); - ::sg_import(src.duckDebounceTime, duckDebounceTime); - ::sg_import(src.walkDebounceTime, walkDebounceTime); - ::sg_import(src.enemyCheckDebounceTime, enemyCheckDebounceTime); - ::sg_import(src.investigateDebounceTime, investigateDebounceTime); - ::sg_import(src.investigateCount, investigateCount); - ::sg_import(src.investigateGoal, investigateGoal); - ::sg_import(src.investigateSoundDebounceTime, investigateSoundDebounceTime); - ::sg_import(src.greetingDebounceTime, greetingDebounceTime); - ::sg_import(src.eventOwner, eventOwner); - ::sg_import(src.coverTarg, coverTarg); - ::sg_import(src.jumpState, jumpState); - ::sg_import(src.followDist, followDist); - ::sg_import(src.tempGoal, tempGoal); - ::sg_import(src.goalEntity, goalEntity); - ::sg_import(src.lastGoalEntity, lastGoalEntity); - ::sg_import(src.eventualGoal, eventualGoal); - ::sg_import(src.captureGoal, captureGoal); - ::sg_import(src.defendEnt, defendEnt); - ::sg_import(src.greetEnt, greetEnt); - ::sg_import(src.goalTime, goalTime); - ::sg_import(src.straightToGoal, straightToGoal); - ::sg_import(src.distToGoal, distToGoal); - ::sg_import(src.navTime, navTime); - ::sg_import(src.blockingEntNum, blockingEntNum); - ::sg_import(src.blockedSpeechDebounceTime, blockedSpeechDebounceTime); - ::sg_import(src.lastSideStepSide, lastSideStepSide); - ::sg_import(src.sideStepHoldTime, sideStepHoldTime); - ::sg_import(src.homeWp, homeWp); - ::sg_import(src.group, group); - ::sg_import(src.lastPathAngles, lastPathAngles); - ::sg_import(src.stats, stats); - ::sg_import(src.aimErrorDebounceTime, aimErrorDebounceTime); - ::sg_import(src.lastAimErrorYaw, lastAimErrorYaw); - ::sg_import(src.lastAimErrorPitch, lastAimErrorPitch); - ::sg_import(src.aimOfs, aimOfs); - ::sg_import(src.currentAim, currentAim); - ::sg_import(src.currentAggression, currentAggression); - ::sg_import(src.scriptFlags, scriptFlags); - ::sg_import(src.desiredSpeed, desiredSpeed); - ::sg_import(src.currentSpeed, currentSpeed); - ::sg_import(src.last_forwardmove, last_forwardmove); - ::sg_import(src.last_rightmove, last_rightmove); - ::sg_import(src.lastClearOrigin, lastClearOrigin); - ::sg_import(src.consecutiveBlockedMoves, consecutiveBlockedMoves); - ::sg_import(src.blockedDebounceTime, blockedDebounceTime); - ::sg_import(src.shoveCount, shoveCount); - ::sg_import(src.blockedDest, blockedDest); - ::sg_import(src.combatPoint, combatPoint); - ::sg_import(src.lastFailedCombatPoint, lastFailedCombatPoint); - ::sg_import(src.movementSpeech, movementSpeech); - ::sg_import(src.movementSpeechChance, movementSpeechChance); - ::sg_import(src.nextBStateThink, nextBStateThink); - ::sg_import(src.last_ucmd, last_ucmd); - ::sg_import(src.combatMove, combatMove); - ::sg_import(src.goalRadius, goalRadius); - ::sg_import(src.pauseTime, pauseTime); - ::sg_import(src.standTime, standTime); - ::sg_import(src.localState, localState); - ::sg_import(src.squadState, squadState); - ::sg_import(src.confusionTime, confusionTime); - ::sg_import(src.charmedTime, charmedTime); - ::sg_import(src.controlledTime, controlledTime); - ::sg_import(src.surrenderTime, surrenderTime); - ::sg_import(src.enemyLaggedPos, enemyLaggedPos); - ::sg_import(src.watchTarget, watchTarget); - ::sg_import(src.ffireCount, ffireCount); - ::sg_import(src.ffireDebounce, ffireDebounce); - ::sg_import(src.ffireFadeDebounce, ffireFadeDebounce); + saved_game->read(timeOfDeath); + saved_game->read(touchedByPlayer); + saved_game->read(enemyLastVisibility); + saved_game->read(aimTime); + saved_game->read(desiredYaw); + saved_game->read(desiredPitch); + saved_game->read(lockedDesiredYaw); + saved_game->read(lockedDesiredPitch); + saved_game->read(aimingBeam); + saved_game->read(enemyLastSeenLocation); + saved_game->read(enemyLastSeenTime); + saved_game->read(enemyLastHeardLocation); + saved_game->read(enemyLastHeardTime); + saved_game->read(lastAlertID); + saved_game->read(eFlags); + saved_game->read(aiFlags); + saved_game->read(currentAmmo); + saved_game->read(shotTime); + saved_game->read(burstCount); + saved_game->read(burstMin); + saved_game->read(burstMean); + saved_game->read(burstMax); + saved_game->read(burstSpacing); + saved_game->read(attackHold); + saved_game->read(attackHoldTime); + saved_game->read(shootAngles); + saved_game->read(rank); + saved_game->read(behaviorState); + saved_game->read(defaultBehavior); + saved_game->read(tempBehavior); + saved_game->read(ignorePain); + saved_game->read(duckDebounceTime); + saved_game->read(walkDebounceTime); + saved_game->read(enemyCheckDebounceTime); + saved_game->read(investigateDebounceTime); + saved_game->read(investigateCount); + saved_game->read(investigateGoal); + saved_game->read(investigateSoundDebounceTime); + saved_game->read(greetingDebounceTime); + saved_game->read(eventOwner); + saved_game->read(coverTarg); + saved_game->read(jumpState); + saved_game->read(followDist); + saved_game->read(tempGoal); + saved_game->read(goalEntity); + saved_game->read(lastGoalEntity); + saved_game->read(eventualGoal); + saved_game->read(captureGoal); + saved_game->read(defendEnt); + saved_game->read(greetEnt); + saved_game->read(goalTime); + saved_game->read(straightToGoal); + saved_game->read(distToGoal); + saved_game->read(navTime); + saved_game->read(blockingEntNum); + saved_game->read(blockedSpeechDebounceTime); + saved_game->read(lastSideStepSide); + saved_game->read(sideStepHoldTime); + saved_game->read(homeWp); + saved_game->read(group); + saved_game->read(lastPathAngles); + saved_game->read<>(stats); + saved_game->read(aimErrorDebounceTime); + saved_game->read(lastAimErrorYaw); + saved_game->read(lastAimErrorPitch); + saved_game->read(aimOfs); + saved_game->read(currentAim); + saved_game->read(currentAggression); + saved_game->read(scriptFlags); + saved_game->read(desiredSpeed); + saved_game->read(currentSpeed); + saved_game->read(last_forwardmove); + saved_game->read(last_rightmove); + saved_game->read(lastClearOrigin); + saved_game->read(consecutiveBlockedMoves); + saved_game->read(blockedDebounceTime); + saved_game->read(shoveCount); + saved_game->read(blockedDest); + saved_game->read(combatPoint); + saved_game->read(lastFailedCombatPoint); + saved_game->read(movementSpeech); + saved_game->read(movementSpeechChance); + saved_game->read(nextBStateThink); + saved_game->read<>(last_ucmd); + saved_game->read(combatMove); + saved_game->read(goalRadius); + saved_game->read(pauseTime); + saved_game->read(standTime); + saved_game->read(localState); + saved_game->read(squadState); + saved_game->read(confusionTime); + saved_game->read(charmedTime); + saved_game->read(controlledTime); + saved_game->read(surrenderTime); + saved_game->read(enemyLaggedPos); + saved_game->read(watchTarget); + saved_game->read(ffireCount); + saved_game->read(ffireDebounce); + saved_game->read(ffireFadeDebounce); } diff --git a/codeJK2/game/b_public.h b/codeJK2/game/b_public.h index 0e2626a0ce..9b92e32099 100644 --- a/codeJK2/game/b_public.h +++ b/codeJK2/game/b_public.h @@ -114,36 +114,8 @@ typedef enum //# movetype_e NUM_MOVETYPES } movetype_t; -#pragma pack(push, 4) -class SgGNpcStats -{ -public: - int32_t aggression; - int32_t aim; - float earshot; - int32_t evasion; - int32_t hfov; - int32_t intelligence; - int32_t move; - int32_t reactions; - float shootDistance; - int32_t vfov; - float vigilance; - float visrange; - int32_t moveType; - int32_t runSpeed; - int32_t walkSpeed; - float yawSpeed; - int32_t health; - int32_t acceleration; -}; // SgGNpcStats -#pragma pack(pop) - typedef struct gNPCstats_e {//Stats, loaded in, and can be set by scripts - using SgType = SgGNpcStats; - - //AI int aggression; // " int aim; // " @@ -167,10 +139,10 @@ typedef struct gNPCstats_e void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } gNPCstats_t; // NOTE!!! If you add any ptr fields into this structure could you please tell me so I can update the load/save code? @@ -181,117 +153,8 @@ typedef struct gNPCstats_e #define ENEMY_POS_LAG_INTERVAL 100 #define ENEMY_POS_LAG_STEPS (MAX_ENEMY_POS_LAG/ENEMY_POS_LAG_INTERVAL) -#pragma pack(push, 4) -class SgGNpc -{ -public: - int32_t timeOfDeath; - int32_t touchedByPlayer; - int32_t enemyLastVisibility; - int32_t aimTime; - float desiredYaw; - float desiredPitch; - float lockedDesiredYaw; - float lockedDesiredPitch; - int32_t aimingBeam; - SgVec3 enemyLastSeenLocation; - int32_t enemyLastSeenTime; - SgVec3 enemyLastHeardLocation; - int32_t enemyLastHeardTime; - int32_t lastAlertID; - int32_t eFlags; - int32_t aiFlags; - int32_t currentAmmo; - int32_t shotTime; - int32_t burstCount; - int32_t burstMin; - int32_t burstMean; - int32_t burstMax; - int32_t burstSpacing; - int32_t attackHold; - int32_t attackHoldTime; - SgVec3 shootAngles; - int32_t rank; - int32_t behaviorState; - int32_t defaultBehavior; - int32_t tempBehavior; - int32_t ignorePain; - int32_t duckDebounceTime; - int32_t walkDebounceTime; - int32_t enemyCheckDebounceTime; - int32_t investigateDebounceTime; - int32_t investigateCount; - SgVec3 investigateGoal; - int32_t investigateSoundDebounceTime; - int32_t greetingDebounceTime; - int32_t eventOwner; - int32_t coverTarg; - int32_t jumpState; - float followDist; - int32_t tempGoal; - int32_t goalEntity; - int32_t lastGoalEntity; - int32_t eventualGoal; - int32_t captureGoal; - int32_t defendEnt; - int32_t greetEnt; - int32_t goalTime; - int32_t straightToGoal; - float distToGoal; - int32_t navTime; - int32_t blockingEntNum; - int32_t blockedSpeechDebounceTime; - int32_t lastSideStepSide; - int32_t sideStepHoldTime; - int32_t homeWp; - int32_t group; - SgVec3 lastPathAngles; - SgGNpcStats stats; - int32_t aimErrorDebounceTime; - float lastAimErrorYaw; - float lastAimErrorPitch; - SgVec3 aimOfs; - int32_t currentAim; - int32_t currentAggression; - int32_t scriptFlags; - int32_t desiredSpeed; - int32_t currentSpeed; - int8_t last_forwardmove; - int8_t last_rightmove; - SgVec3 lastClearOrigin; - int32_t consecutiveBlockedMoves; - int32_t blockedDebounceTime; - int32_t shoveCount; - SgVec3 blockedDest; - int32_t combatPoint; - int32_t lastFailedCombatPoint; - int32_t movementSpeech; - float movementSpeechChance; - int32_t nextBStateThink; - SgUserCmd last_ucmd; - int32_t combatMove; - int32_t goalRadius; - int32_t pauseTime; - int32_t standTime; - int32_t localState; - int32_t squadState; - int32_t confusionTime; - int32_t charmedTime; - int32_t controlledTime; - int32_t surrenderTime; - SgArray enemyLaggedPos; - int32_t watchTarget; - int32_t ffireCount; - int32_t ffireDebounce; - int32_t ffireFadeDebounce; -}; // SgGNpc -#pragma pack(pop) - typedef struct { - using SgType = SgGNpc; - - //FIXME: Put in playerInfo or something int timeOfDeath; //FIXME do we really need both of these gentity_t *touchedByPlayer; @@ -441,10 +304,10 @@ typedef struct void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } gNPC_t; void G_SquadPathsInit(void); diff --git a/codeJK2/game/bg_public.cpp b/codeJK2/game/bg_public.cpp index 6cbc584860..33d4df9e43 100644 --- a/codeJK2/game/bg_public.cpp +++ b/codeJK2/game/bg_public.cpp @@ -1,42 +1,42 @@ #include "bg_public.h" -#include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_i_saved_game.h" void animation_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(firstFrame, dst.firstFrame); - ::sg_export(numFrames, dst.numFrames); - ::sg_export(loopFrames, dst.loopFrames); - ::sg_export(frameLerp, dst.frameLerp); - ::sg_export(initialLerp, dst.initialLerp); + saved_game->write(firstFrame); + saved_game->write(numFrames); + saved_game->write(loopFrames); + saved_game->write(frameLerp); + saved_game->write(initialLerp); } void animation_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.firstFrame, firstFrame); - ::sg_import(src.numFrames, numFrames); - ::sg_import(src.loopFrames, loopFrames); - ::sg_import(src.frameLerp, frameLerp); - ::sg_import(src.initialLerp, initialLerp); + saved_game->read(firstFrame); + saved_game->read(numFrames); + saved_game->read(loopFrames); + saved_game->read(frameLerp); + saved_game->read(initialLerp); } void animsounds_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(keyFrame, dst.keyFrame); - ::sg_export(soundIndex, dst.soundIndex); - ::sg_export(numRandomAnimSounds, dst.numRandomAnimSounds); - ::sg_export(probability, dst.probability); + saved_game->write(keyFrame); + saved_game->write(soundIndex); + saved_game->write(numRandomAnimSounds); + saved_game->write(probability); } void animsounds_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.keyFrame, keyFrame); - ::sg_import(src.soundIndex, soundIndex); - ::sg_import(src.numRandomAnimSounds, numRandomAnimSounds); - ::sg_import(src.probability, probability); + saved_game->read(keyFrame); + saved_game->read(soundIndex); + saved_game->read(numRandomAnimSounds); + saved_game->read(probability); } diff --git a/codeJK2/game/bg_public.h b/codeJK2/game/bg_public.h index df0e84f413..b3c376c9a1 100644 --- a/codeJK2/game/bg_public.h +++ b/codeJK2/game/bg_public.h @@ -441,22 +441,7 @@ typedef enum { } entity_event_t; -#pragma pack(push, 4) -class SgAnimation -{ -public: - int32_t firstFrame; - int32_t numFrames; - int32_t loopFrames; - int32_t frameLerp; - int32_t initialLerp; -}; // SgAnimation -#pragma pack(pop) - typedef struct animation_s { - using SgType = SgAnimation; - - int firstFrame; int numFrames; int loopFrames; // 0 to numFrames, -1 = no loop @@ -465,30 +450,16 @@ typedef struct animation_s { void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } animation_t; #define MAX_RANDOM_ANIMSOUNDS 8 -#pragma pack(push, 4) -class SgAnimSounds -{ -public: - int32_t keyFrame; - SgArray soundIndex; - int32_t numRandomAnimSounds; - int32_t probability; -}; // SgAnimSounds -#pragma pack(pop) - typedef struct animsounds_s { - using SgType = SgAnimSounds; - - int keyFrame; //Frame to play sound on int soundIndex[MAX_RANDOM_ANIMSOUNDS]; //sound file to play - FIXME: should be an index, handle random some other way? int numRandomAnimSounds; //string variable min for va("...%d.wav", Q_irand(lowestVa, highestVa)) @@ -496,10 +467,10 @@ typedef struct animsounds_s void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } animsounds_t; // means of death diff --git a/codeJK2/game/g_local.cpp b/codeJK2/game/g_local.cpp index 960ab4912f..45e867ed8d 100644 --- a/codeJK2/game/g_local.cpp +++ b/codeJK2/game/g_local.cpp @@ -1,76 +1,76 @@ #include "g_local.h" -#include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_i_saved_game.h" void alertEvent_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(position, dst.position); - ::sg_export(radius, dst.radius); - ::sg_export(level, dst.level); - ::sg_export(type, dst.type); - ::sg_export(owner, dst.owner); - ::sg_export(light, dst.light); - ::sg_export(addLight, dst.addLight); - ::sg_export(ID, dst.ID); - ::sg_export(timestamp, dst.timestamp); + saved_game->write(position); + saved_game->write(radius); + saved_game->write(level); + saved_game->write(type); + saved_game->write(owner); + saved_game->write(light); + saved_game->write(addLight); + saved_game->write(ID); + saved_game->write(timestamp); } void alertEvent_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.position, position); - ::sg_import(src.radius, radius); - ::sg_import(src.level, level); - ::sg_import(src.type, type); - ::sg_import(src.owner, owner); - ::sg_import(src.light, light); - ::sg_import(src.addLight, addLight); - ::sg_import(src.ID, ID); - ::sg_import(src.timestamp, timestamp); + saved_game->read(position); + saved_game->read(radius); + saved_game->read(level); + saved_game->read(type); + saved_game->read(owner); + saved_game->read(light); + saved_game->read(addLight); + saved_game->read(ID); + saved_game->read(timestamp); } void level_locals_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(clients, dst.clients); - ::sg_export(maxclients, dst.maxclients); - ::sg_export(framenum, dst.framenum); - ::sg_export(time, dst.time); - ::sg_export(previousTime, dst.previousTime); - ::sg_export(globalTime, dst.globalTime); - ::sg_export(mapname, dst.mapname); - ::sg_export(locationLinked, dst.locationLinked); - ::sg_export(locationHead, dst.locationHead); - ::sg_export(alertEvents, dst.alertEvents); - ::sg_export(numAlertEvents, dst.numAlertEvents); - ::sg_export(curAlertID, dst.curAlertID); - ::sg_export(groups, dst.groups); - ::sg_export(knownAnimFileSets, dst.knownAnimFileSets); - ::sg_export(numKnownAnimFileSets, dst.numKnownAnimFileSets); - ::sg_export(worldFlags, dst.worldFlags); - ::sg_export(dmState, dst.dmState); + saved_game->write(clients); + saved_game->write(maxclients); + saved_game->write(framenum); + saved_game->write(time); + saved_game->write(previousTime); + saved_game->write(globalTime); + saved_game->write(mapname); + saved_game->write(locationLinked); + saved_game->write(locationHead); + saved_game->write<>(alertEvents); + saved_game->write(numAlertEvents); + saved_game->write(curAlertID); + saved_game->write<>(groups); + saved_game->write<>(knownAnimFileSets); + saved_game->write(numKnownAnimFileSets); + saved_game->write(worldFlags); + saved_game->write(dmState); } void level_locals_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.clients, clients); - ::sg_import(src.maxclients, maxclients); - ::sg_import(src.framenum, framenum); - ::sg_import(src.time, time); - ::sg_import(src.previousTime, previousTime); - ::sg_import(src.globalTime, globalTime); - ::sg_import(src.mapname, mapname); - ::sg_import(src.locationLinked, locationLinked); - ::sg_import(src.locationHead, locationHead); - ::sg_import(src.alertEvents, alertEvents); - ::sg_import(src.numAlertEvents, numAlertEvents); - ::sg_import(src.curAlertID, curAlertID); - ::sg_import(src.groups, groups); - ::sg_import(src.knownAnimFileSets, knownAnimFileSets); - ::sg_import(src.numKnownAnimFileSets, numKnownAnimFileSets); - ::sg_import(src.worldFlags, worldFlags); - ::sg_import(src.dmState, dmState); + saved_game->read(clients); + saved_game->read(maxclients); + saved_game->read(framenum); + saved_game->read(time); + saved_game->read(previousTime); + saved_game->read(globalTime); + saved_game->read(mapname); + saved_game->read(locationLinked); + saved_game->read(locationHead); + saved_game->read<>(alertEvents); + saved_game->read(numAlertEvents); + saved_game->read(curAlertID); + saved_game->read<>(groups); + saved_game->read<>(knownAnimFileSets); + saved_game->read(numKnownAnimFileSets); + saved_game->read(worldFlags); + saved_game->read(dmState); } diff --git a/codeJK2/game/g_local.h b/codeJK2/game/g_local.h index b3fa51d586..f1030f3d44 100644 --- a/codeJK2/game/g_local.h +++ b/codeJK2/game/g_local.h @@ -129,27 +129,8 @@ enum alertEventLevel_e }; // !!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! -#pragma pack(push, 4) -class SgAlertEvent -{ -public: - SgVec3 position; - float radius; - int32_t level; - int32_t type; - int32_t owner; - float light; - float addLight; - int32_t ID; - int32_t timestamp; -}; // SgAlertEvent -#pragma pack(pop) - typedef struct alertEvent_s { - using SgType = SgAlertEvent; - - vec3_t position; //Where the event is located float radius; //Consideration radius alertEventLevel_e level; //Priority level of the event @@ -162,10 +143,10 @@ typedef struct alertEvent_s void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } alertEvent_t; // @@ -189,35 +170,8 @@ typedef struct #define WF_SNOWING 0x00000002 //snowing // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgLevelLocals -{ -public: - int32_t clients; - int32_t maxclients; - int32_t framenum; - int32_t time; - int32_t previousTime; - int32_t globalTime; - SgArray mapname; - int32_t locationLinked; - int32_t locationHead; - SgArray alertEvents; - int32_t numAlertEvents; - int32_t curAlertID; - SgArray groups; - SgArray knownAnimFileSets; - int32_t numKnownAnimFileSets; - int32_t worldFlags; - int32_t dmState; -}; // SgLevelLocals -#pragma pack(pop) - typedef struct { - using SgType = SgLevelLocals; - - gclient_t *clients; // [maxclients] // store latched cvars here that we want to get at often @@ -271,10 +225,10 @@ typedef struct void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } level_locals_t; extern level_locals_t level; diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp index 18b0355241..88870deb8a 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -35,7 +35,6 @@ along with this program; if not, see . #include "objectives.h" #include "../cgame/cg_local.h" // yeah I know this is naughty, but we're shipping soon... #include "time.h" -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" extern CNavigator navigator; diff --git a/codeJK2/game/g_objectives.cpp b/codeJK2/game/g_objectives.cpp index 11c2b7f213..60c9ade3b9 100644 --- a/codeJK2/game/g_objectives.cpp +++ b/codeJK2/game/g_objectives.cpp @@ -31,7 +31,6 @@ along with this program; if not, see . #define G_OBJECTIVES_CPP #include "objectives.h" -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" qboolean missionInfo_Updated; diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp index 8d3f388584..db72c04074 100644 --- a/codeJK2/game/g_roff.cpp +++ b/codeJK2/game/g_roff.cpp @@ -25,7 +25,6 @@ along with this program; if not, see . #include "g_local.h" #include "g_roff.h" #include "g_icarus.h" -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" // The list of precached ROFFs diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index 96349134b9..eaa31cde66 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -33,7 +33,6 @@ along with this program; if not, see . #include "../cgame/cg_camera.h" #include "g_icarus.h" #include "../../code/qcommon/sstring.h" -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" extern void OBJ_LoadTacticalInfo(void); @@ -447,50 +446,43 @@ void EnumerateField(const field_t *pField, byte *pbBase) } template -static void EnumerateFields(const field_t *pFields, T* src_instance, unsigned int ulChid, size_t iLen) +static void EnumerateFields( + const field_t* pFields, + T* src_instance, + unsigned int ulChid, + size_t iLen) { - strList.clear(); + strList.clear(); auto pbData = reinterpret_cast(src_instance); - // enumerate all the fields... - // - if (pFields) - { - for (const field_t *pField = pFields; pField->psName; pField++) - { - assert(pField->iOffset < iLen); - EnumerateField(pField, pbData); - } - } - - // save out raw data... - // - using SgType = typename T::SgType; - - constexpr auto dst_size = static_cast(sizeof(SgType)); - - auto& dst_buffer = ::sg_get_buffer( - dst_size); + // enumerate all the fields... + // + if (pFields) { + for (auto pField = pFields; pField->psName; ++pField) { + assert(pField->iOffset < iLen); + ::EnumerateField(pField, pbData); + } + } - auto dst_instance = reinterpret_cast(dst_buffer.data()); + // save out raw data... + // + ::gi.saved_game->reset_buffer(); - ::sg_export(*src_instance, *dst_instance); + src_instance->sg_export( + ::gi.saved_game); ::gi.saved_game->write_chunk( - ulChid, - dst_buffer.data(), - dst_size); + ulChid); - // save out any associated strings.. - // - for (const auto& it : strList) - { + // save out any associated strings.. + // + for (const auto& it : strList) { ::gi.saved_game->write_chunk( - INT_ID('S','T','R','G'), + INT_ID('S', 'T', 'R', 'G'), it.c_str(), static_cast(it.length() + 1)); - } + } } static void EvaluateField(const field_t *pField, byte *pbBase, byte *pbOriginalRefData/* may be NULL*/) @@ -593,6 +585,7 @@ static const char *SG_GetChidText(unsigned int chid) return chidtext; } +#if 0 template static void EvaluateFields(const field_t *pFields, T* pbData, T* pbOriginalRefData, unsigned int ulChid, int iSize, qboolean bOkToSizeMisMatch) { @@ -638,6 +631,32 @@ static void EvaluateFields(const field_t *pFields, T* pbData, T* pbOriginalRefDa } } } +#else +template +static void EvaluateFields( + const field_t* pFields, + T* pbData, + T* pbOriginalRefData, + unsigned int ulChid, + int iSize, + qboolean bOkToSizeMisMatch) +{ + ::gi.saved_game->read_chunk( + ulChid); + + pbData->sg_import( + ::gi.saved_game); + + if (pFields) { + for (auto pField = pFields; pField->psName; ++pField) { + ::EvaluateField( + pField, + reinterpret_cast(pbData), + reinterpret_cast(pbOriginalRefData)); + } + } +} +#endif /* ============== @@ -913,15 +932,18 @@ static void ReadGEntities(qboolean qbAutosave) // the scary ghoul2 stuff... (fingers crossed) // { - char *pGhoul2Data = NULL; - ::gi.saved_game->read_chunk( INT_ID('G','H','L','2')); +// FIXME Remove +#if 0 auto buffer = ::gi.saved_game->get_buffer(); - pGhoul2Data = reinterpret_cast(buffer.data()); + auto pGhoul2Data = reinterpret_cast(buffer.data()); + + gi.G2API_LoadGhoul2Models(pEnt->ghoul2, pGhoul2Data); // if it's going to crash anywhere... +#endif - gi.G2API_LoadGhoul2Models(pEnt->ghoul2, pGhoul2Data); // if it's going to crash anywhere... + gi.G2API_LoadGhoul2Models(pEnt->ghoul2, nullptr); } // gi.unlinkentity (pEntOriginal); diff --git a/codeJK2/game/g_shared.cpp b/codeJK2/game/g_shared.cpp index 42e7099a32..b0b1d5bda1 100644 --- a/codeJK2/game/g_shared.cpp +++ b/codeJK2/game/g_shared.cpp @@ -1,815 +1,815 @@ #include "g_local.h" #include "g_shared.h" -#include "qcommon/ojk_sg_wrappers.h" +#include "qcommon/ojk_i_saved_game.h" void clientInfo_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(infoValid, dst.infoValid); - ::sg_export(name, dst.name); - ::sg_export(team, dst.team); - ::sg_export(score, dst.score); - ::sg_export(handicap, dst.handicap); - ::sg_export(legsModel, dst.legsModel); - ::sg_export(legsSkin, dst.legsSkin); - ::sg_export(torsoModel, dst.torsoModel); - ::sg_export(torsoSkin, dst.torsoSkin); - ::sg_export(headModel, dst.headModel); - ::sg_export(headSkin, dst.headSkin); - ::sg_export(extensions, dst.extensions); - ::sg_export(animFileIndex, dst.animFileIndex); - ::sg_export(sounds, dst.sounds); - ::sg_export(customBasicSoundDir, dst.customBasicSoundDir); - ::sg_export(customCombatSoundDir, dst.customCombatSoundDir); - ::sg_export(customExtraSoundDir, dst.customExtraSoundDir); - ::sg_export(customJediSoundDir, dst.customJediSoundDir); + saved_game->write(infoValid); + saved_game->write(name); + saved_game->write(team); + saved_game->write(score); + saved_game->write(handicap); + saved_game->write(legsModel); + saved_game->write(legsSkin); + saved_game->write(torsoModel); + saved_game->write(torsoSkin); + saved_game->write(headModel); + saved_game->write(headSkin); + saved_game->write(extensions); + saved_game->write(animFileIndex); + saved_game->write(sounds); + saved_game->write(customBasicSoundDir); + saved_game->write(customCombatSoundDir); + saved_game->write(customExtraSoundDir); + saved_game->write(customJediSoundDir); } void clientInfo_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.infoValid, infoValid); - ::sg_import(src.name, name); - ::sg_import(src.team, team); - ::sg_import(src.score, score); - ::sg_import(src.handicap, handicap); - ::sg_import(src.legsModel, legsModel); - ::sg_import(src.legsSkin, legsSkin); - ::sg_import(src.torsoModel, torsoModel); - ::sg_import(src.torsoSkin, torsoSkin); - ::sg_import(src.headModel, headModel); - ::sg_import(src.headSkin, headSkin); - ::sg_import(src.extensions, extensions); - ::sg_import(src.animFileIndex, animFileIndex); - ::sg_import(src.sounds, sounds); - ::sg_import(src.customBasicSoundDir, customBasicSoundDir); - ::sg_import(src.customCombatSoundDir, customCombatSoundDir); - ::sg_import(src.customExtraSoundDir, customExtraSoundDir); - ::sg_import(src.customJediSoundDir, customJediSoundDir); + saved_game->read(infoValid); + saved_game->read(name); + saved_game->read(team); + saved_game->read(score); + saved_game->read(handicap); + saved_game->read(legsModel); + saved_game->read(legsSkin); + saved_game->read(torsoModel); + saved_game->read(torsoSkin); + saved_game->read(headModel); + saved_game->read(headSkin); + saved_game->read(extensions); + saved_game->read(animFileIndex); + saved_game->read(sounds); + saved_game->read(customBasicSoundDir); + saved_game->read(customCombatSoundDir); + saved_game->read(customExtraSoundDir); + saved_game->read(customJediSoundDir); } void modelInfo_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(modelIndex, dst.modelIndex); - ::sg_export(customRGB, dst.customRGB); - ::sg_export(customAlpha, dst.customAlpha); + saved_game->write(modelIndex); + saved_game->write(customRGB); + saved_game->write(customAlpha); } void modelInfo_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.modelIndex, modelIndex); - ::sg_import(src.customRGB, customRGB); - ::sg_import(src.customAlpha, customAlpha); + saved_game->read(modelIndex); + saved_game->read(customRGB); + saved_game->read(customAlpha); } void renderInfo_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(legsModel, dst.legsModel); - ::sg_export(legsModelName, dst.legsModelName); - ::sg_export(torsoModel, dst.torsoModel); - ::sg_export(headModel, dst.headModel); - ::sg_export(torsoModelName, dst.torsoModelName); - ::sg_export(headModelName, dst.headModelName); - ::sg_export(headYawRangeLeft, dst.headYawRangeLeft); - ::sg_export(headYawRangeRight, dst.headYawRangeRight); - ::sg_export(headPitchRangeUp, dst.headPitchRangeUp); - ::sg_export(headPitchRangeDown, dst.headPitchRangeDown); - ::sg_export(torsoYawRangeLeft, dst.torsoYawRangeLeft); - ::sg_export(torsoYawRangeRight, dst.torsoYawRangeRight); - ::sg_export(torsoPitchRangeUp, dst.torsoPitchRangeUp); - ::sg_export(torsoPitchRangeDown, dst.torsoPitchRangeDown); - ::sg_export(legsFrame, dst.legsFrame); - ::sg_export(torsoFrame, dst.torsoFrame); - ::sg_export(legsFpsMod, dst.legsFpsMod); - ::sg_export(torsoFpsMod, dst.torsoFpsMod); - ::sg_export(customRGB, dst.customRGB); - ::sg_export(customAlpha, dst.customAlpha); - ::sg_export(renderFlags, dst.renderFlags); - ::sg_export(muzzlePoint, dst.muzzlePoint); - ::sg_export(muzzleDir, dst.muzzleDir); - ::sg_export(muzzlePointOld, dst.muzzlePointOld); - ::sg_export(muzzleDirOld, dst.muzzleDirOld); - ::sg_export(mPCalcTime, dst.mPCalcTime); - ::sg_export(lockYaw, dst.lockYaw); - ::sg_export(headPoint, dst.headPoint); - ::sg_export(headAngles, dst.headAngles); - ::sg_export(handRPoint, dst.handRPoint); - ::sg_export(handLPoint, dst.handLPoint); - ::sg_export(crotchPoint, dst.crotchPoint); - ::sg_export(footRPoint, dst.footRPoint); - ::sg_export(footLPoint, dst.footLPoint); - ::sg_export(torsoPoint, dst.torsoPoint); - ::sg_export(torsoAngles, dst.torsoAngles); - ::sg_export(eyePoint, dst.eyePoint); - ::sg_export(eyeAngles, dst.eyeAngles); - ::sg_export(lookTarget, dst.lookTarget); - ::sg_export(lookMode, dst.lookMode); - ::sg_export(lookTargetClearTime, dst.lookTargetClearTime); - ::sg_export(lastVoiceVolume, dst.lastVoiceVolume); - ::sg_export(lastHeadAngles, dst.lastHeadAngles); - ::sg_export(headBobAngles, dst.headBobAngles); - ::sg_export(targetHeadBobAngles, dst.targetHeadBobAngles); - ::sg_export(lookingDebounceTime, dst.lookingDebounceTime); - ::sg_export(legsYaw, dst.legsYaw); + saved_game->write<>(legsModel); + saved_game->write(legsModelName); + saved_game->write<>(torsoModel); + saved_game->write<>(headModel); + saved_game->write(torsoModelName); + saved_game->write(headModelName); + saved_game->write(headYawRangeLeft); + saved_game->write(headYawRangeRight); + saved_game->write(headPitchRangeUp); + saved_game->write(headPitchRangeDown); + saved_game->write(torsoYawRangeLeft); + saved_game->write(torsoYawRangeRight); + saved_game->write(torsoPitchRangeUp); + saved_game->write(torsoPitchRangeDown); + saved_game->write(legsFrame); + saved_game->write(torsoFrame); + saved_game->write(legsFpsMod); + saved_game->write(torsoFpsMod); + saved_game->write(customRGB); + saved_game->write(customAlpha); + saved_game->write(renderFlags); + saved_game->write(muzzlePoint); + saved_game->write(muzzleDir); + saved_game->write(muzzlePointOld); + saved_game->write(muzzleDirOld); + saved_game->write(mPCalcTime); + saved_game->write(lockYaw); + saved_game->write(headPoint); + saved_game->write(headAngles); + saved_game->write(handRPoint); + saved_game->write(handLPoint); + saved_game->write(crotchPoint); + saved_game->write(footRPoint); + saved_game->write(footLPoint); + saved_game->write(torsoPoint); + saved_game->write(torsoAngles); + saved_game->write(eyePoint); + saved_game->write(eyeAngles); + saved_game->write(lookTarget); + saved_game->write(lookMode); + saved_game->write(lookTargetClearTime); + saved_game->write(lastVoiceVolume); + saved_game->write(lastHeadAngles); + saved_game->write(headBobAngles); + saved_game->write(targetHeadBobAngles); + saved_game->write(lookingDebounceTime); + saved_game->write(legsYaw); } void renderInfo_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.legsModel, legsModel); - ::sg_import(src.legsModelName, legsModelName); - ::sg_import(src.torsoModel, torsoModel); - ::sg_import(src.headModel, headModel); - ::sg_import(src.torsoModelName, torsoModelName); - ::sg_import(src.headModelName, headModelName); - ::sg_import(src.headYawRangeLeft, headYawRangeLeft); - ::sg_import(src.headYawRangeRight, headYawRangeRight); - ::sg_import(src.headPitchRangeUp, headPitchRangeUp); - ::sg_import(src.headPitchRangeDown, headPitchRangeDown); - ::sg_import(src.torsoYawRangeLeft, torsoYawRangeLeft); - ::sg_import(src.torsoYawRangeRight, torsoYawRangeRight); - ::sg_import(src.torsoPitchRangeUp, torsoPitchRangeUp); - ::sg_import(src.torsoPitchRangeDown, torsoPitchRangeDown); - ::sg_import(src.legsFrame, legsFrame); - ::sg_import(src.torsoFrame, torsoFrame); - ::sg_import(src.legsFpsMod, legsFpsMod); - ::sg_import(src.torsoFpsMod, torsoFpsMod); - ::sg_import(src.customRGB, customRGB); - ::sg_import(src.customAlpha, customAlpha); - ::sg_import(src.renderFlags, renderFlags); - ::sg_import(src.muzzlePoint, muzzlePoint); - ::sg_import(src.muzzleDir, muzzleDir); - ::sg_import(src.muzzlePointOld, muzzlePointOld); - ::sg_import(src.muzzleDirOld, muzzleDirOld); - ::sg_import(src.mPCalcTime, mPCalcTime); - ::sg_import(src.lockYaw, lockYaw); - ::sg_import(src.headPoint, headPoint); - ::sg_import(src.headAngles, headAngles); - ::sg_import(src.handRPoint, handRPoint); - ::sg_import(src.handLPoint, handLPoint); - ::sg_import(src.crotchPoint, crotchPoint); - ::sg_import(src.footRPoint, footRPoint); - ::sg_import(src.footLPoint, footLPoint); - ::sg_import(src.torsoPoint, torsoPoint); - ::sg_import(src.torsoAngles, torsoAngles); - ::sg_import(src.eyePoint, eyePoint); - ::sg_import(src.eyeAngles, eyeAngles); - ::sg_import(src.lookTarget, lookTarget); - ::sg_import(src.lookMode, lookMode); - ::sg_import(src.lookTargetClearTime, lookTargetClearTime); - ::sg_import(src.lastVoiceVolume, lastVoiceVolume); - ::sg_import(src.lastHeadAngles, lastHeadAngles); - ::sg_import(src.headBobAngles, headBobAngles); - ::sg_import(src.targetHeadBobAngles, targetHeadBobAngles); - ::sg_import(src.lookingDebounceTime, lookingDebounceTime); - ::sg_import(src.legsYaw, legsYaw); + saved_game->read<>(legsModel); + saved_game->read(legsModelName); + saved_game->read<>(torsoModel); + saved_game->read<>(headModel); + saved_game->read(torsoModelName); + saved_game->read(headModelName); + saved_game->read(headYawRangeLeft); + saved_game->read(headYawRangeRight); + saved_game->read(headPitchRangeUp); + saved_game->read(headPitchRangeDown); + saved_game->read(torsoYawRangeLeft); + saved_game->read(torsoYawRangeRight); + saved_game->read(torsoPitchRangeUp); + saved_game->read(torsoPitchRangeDown); + saved_game->read(legsFrame); + saved_game->read(torsoFrame); + saved_game->read(legsFpsMod); + saved_game->read(torsoFpsMod); + saved_game->read(customRGB); + saved_game->read(customAlpha); + saved_game->read(renderFlags); + saved_game->read(muzzlePoint); + saved_game->read(muzzleDir); + saved_game->read(muzzlePointOld); + saved_game->read(muzzleDirOld); + saved_game->read(mPCalcTime); + saved_game->read(lockYaw); + saved_game->read(headPoint); + saved_game->read(headAngles); + saved_game->read(handRPoint); + saved_game->read(handLPoint); + saved_game->read(crotchPoint); + saved_game->read(footRPoint); + saved_game->read(footLPoint); + saved_game->read(torsoPoint); + saved_game->read(torsoAngles); + saved_game->read(eyePoint); + saved_game->read(eyeAngles); + saved_game->read(lookTarget); + saved_game->read(lookMode); + saved_game->read(lookTargetClearTime); + saved_game->read(lastVoiceVolume); + saved_game->read(lastHeadAngles); + saved_game->read(headBobAngles); + saved_game->read(targetHeadBobAngles); + saved_game->read(lookingDebounceTime); + saved_game->read(legsYaw); } void playerTeamState_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(state, dst.state); - ::sg_export(captures, dst.captures); - ::sg_export(basedefense, dst.basedefense); - ::sg_export(carrierdefense, dst.carrierdefense); - ::sg_export(flagrecovery, dst.flagrecovery); - ::sg_export(fragcarrier, dst.fragcarrier); - ::sg_export(assists, dst.assists); - ::sg_export(lasthurtcarrier, dst.lasthurtcarrier); - ::sg_export(lastreturnedflag, dst.lastreturnedflag); - ::sg_export(flagsince, dst.flagsince); - ::sg_export(lastfraggedcarrier, dst.lastfraggedcarrier); + saved_game->write(state); + saved_game->write(captures); + saved_game->write(basedefense); + saved_game->write(carrierdefense); + saved_game->write(flagrecovery); + saved_game->write(fragcarrier); + saved_game->write(assists); + saved_game->write(lasthurtcarrier); + saved_game->write(lastreturnedflag); + saved_game->write(flagsince); + saved_game->write(lastfraggedcarrier); } void playerTeamState_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.state, state); - ::sg_import(src.captures, captures); - ::sg_import(src.basedefense, basedefense); - ::sg_import(src.carrierdefense, carrierdefense); - ::sg_import(src.flagrecovery, flagrecovery); - ::sg_import(src.fragcarrier, fragcarrier); - ::sg_import(src.assists, assists); - ::sg_import(src.lasthurtcarrier, lasthurtcarrier); - ::sg_import(src.lastreturnedflag, lastreturnedflag); - ::sg_import(src.flagsince, flagsince); - ::sg_import(src.lastfraggedcarrier, lastfraggedcarrier); + saved_game->read(state); + saved_game->read(captures); + saved_game->read(basedefense); + saved_game->read(carrierdefense); + saved_game->read(flagrecovery); + saved_game->read(fragcarrier); + saved_game->read(assists); + saved_game->read(lasthurtcarrier); + saved_game->read(lastreturnedflag); + saved_game->read(flagsince); + saved_game->read(lastfraggedcarrier); } void objectives_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(display, dst.display); - ::sg_export(status, dst.status); + saved_game->write(display); + saved_game->write(status); } void objectives_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.display, display); - ::sg_import(src.status, status); + saved_game->read(display); + saved_game->read(status); } void missionStats_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(secretsFound, dst.secretsFound); - ::sg_export(totalSecrets, dst.totalSecrets); - ::sg_export(shotsFired, dst.shotsFired); - ::sg_export(hits, dst.hits); - ::sg_export(enemiesSpawned, dst.enemiesSpawned); - ::sg_export(enemiesKilled, dst.enemiesKilled); - ::sg_export(saberThrownCnt, dst.saberThrownCnt); - ::sg_export(saberBlocksCnt, dst.saberBlocksCnt); - ::sg_export(legAttacksCnt, dst.legAttacksCnt); - ::sg_export(armAttacksCnt, dst.armAttacksCnt); - ::sg_export(torsoAttacksCnt, dst.torsoAttacksCnt); - ::sg_export(otherAttacksCnt, dst.otherAttacksCnt); - ::sg_export(forceUsed, dst.forceUsed); - ::sg_export(weaponUsed, dst.weaponUsed); + saved_game->write(secretsFound); + saved_game->write(totalSecrets); + saved_game->write(shotsFired); + saved_game->write(hits); + saved_game->write(enemiesSpawned); + saved_game->write(enemiesKilled); + saved_game->write(saberThrownCnt); + saved_game->write(saberBlocksCnt); + saved_game->write(legAttacksCnt); + saved_game->write(armAttacksCnt); + saved_game->write(torsoAttacksCnt); + saved_game->write(otherAttacksCnt); + saved_game->write(forceUsed); + saved_game->write(weaponUsed); } void missionStats_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.secretsFound, secretsFound); - ::sg_import(src.totalSecrets, totalSecrets); - ::sg_import(src.shotsFired, shotsFired); - ::sg_import(src.hits, hits); - ::sg_import(src.enemiesSpawned, enemiesSpawned); - ::sg_import(src.enemiesKilled, enemiesKilled); - ::sg_import(src.saberThrownCnt, saberThrownCnt); - ::sg_import(src.saberBlocksCnt, saberBlocksCnt); - ::sg_import(src.legAttacksCnt, legAttacksCnt); - ::sg_import(src.armAttacksCnt, armAttacksCnt); - ::sg_import(src.torsoAttacksCnt, torsoAttacksCnt); - ::sg_import(src.otherAttacksCnt, otherAttacksCnt); - ::sg_import(src.forceUsed, forceUsed); - ::sg_import(src.weaponUsed, weaponUsed); + saved_game->read(secretsFound); + saved_game->read(totalSecrets); + saved_game->read(shotsFired); + saved_game->read(hits); + saved_game->read(enemiesSpawned); + saved_game->read(enemiesKilled); + saved_game->read(saberThrownCnt); + saved_game->read(saberBlocksCnt); + saved_game->read(legAttacksCnt); + saved_game->read(armAttacksCnt); + saved_game->read(torsoAttacksCnt); + saved_game->read(otherAttacksCnt); + saved_game->read(forceUsed); + saved_game->read(weaponUsed); } void clientSession_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(missionObjectivesShown, dst.missionObjectivesShown); - ::sg_export(sessionTeam, dst.sessionTeam); - ::sg_export(mission_objectives, dst.mission_objectives); - ::sg_export(missionStats, dst.missionStats); + saved_game->write(missionObjectivesShown); + saved_game->write(sessionTeam); + saved_game->write<>(mission_objectives); + saved_game->write<>(missionStats); } void clientSession_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.missionObjectivesShown, missionObjectivesShown); - ::sg_import(src.sessionTeam, sessionTeam); - ::sg_import(src.mission_objectives, mission_objectives); - ::sg_import(src.missionStats, missionStats); + saved_game->read(missionObjectivesShown); + saved_game->read(sessionTeam); + saved_game->read<>(mission_objectives); + saved_game->read<>(missionStats); } void clientPersistant_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(connected, dst.connected); - ::sg_export(lastCommand, dst.lastCommand); - ::sg_export(localClient, dst.localClient); - ::sg_export(netname, dst.netname); - ::sg_export(maxHealth, dst.maxHealth); - ::sg_export(enterTime, dst.enterTime); - ::sg_export(cmd_angles, dst.cmd_angles); - ::sg_export(teamState, dst.teamState); + saved_game->write(connected); + saved_game->write<>(lastCommand); + saved_game->write(localClient); + saved_game->write(netname); + saved_game->write(maxHealth); + saved_game->write(enterTime); + saved_game->write(cmd_angles); + saved_game->write<>(teamState); } void clientPersistant_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.connected, connected); - ::sg_import(src.lastCommand, lastCommand); - ::sg_import(src.localClient, localClient); - ::sg_import(src.netname, netname); - ::sg_import(src.maxHealth, maxHealth); - ::sg_import(src.enterTime, enterTime); - ::sg_import(src.cmd_angles, cmd_angles); - ::sg_import(src.teamState, teamState); + saved_game->read(connected); + saved_game->read<>(lastCommand); + saved_game->read(localClient); + saved_game->read(netname); + saved_game->read(maxHealth); + saved_game->read(enterTime); + saved_game->read(cmd_angles); + saved_game->read<>(teamState); } void gclient_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(ps, dst.ps); - ::sg_export(pers, dst.pers); - ::sg_export(sess, dst.sess); - ::sg_export(noclip, dst.noclip); - ::sg_export(lastCmdTime, dst.lastCmdTime); - ::sg_export(usercmd, dst.usercmd); - ::sg_export(buttons, dst.buttons); - ::sg_export(oldbuttons, dst.oldbuttons); - ::sg_export(latched_buttons, dst.latched_buttons); - ::sg_export(damage_armor, dst.damage_armor); - ::sg_export(damage_blood, dst.damage_blood); - ::sg_export(damage_knockback, dst.damage_knockback); - ::sg_export(damage_from, dst.damage_from); - ::sg_export(damage_fromWorld, dst.damage_fromWorld); - ::sg_export(accurateCount, dst.accurateCount); - ::sg_export(respawnTime, dst.respawnTime); - ::sg_export(inactivityTime, dst.inactivityTime); - ::sg_export(inactivityWarning, dst.inactivityWarning); - ::sg_export(idleTime, dst.idleTime); - ::sg_export(airOutTime, dst.airOutTime); - ::sg_export(timeResidual, dst.timeResidual); - ::sg_export(facial_blink, dst.facial_blink); - ::sg_export(facial_frown, dst.facial_frown); - ::sg_export(facial_aux, dst.facial_aux); - ::sg_export(clientInfo, dst.clientInfo); - ::sg_export(forced_forwardmove, dst.forced_forwardmove); - ::sg_export(forced_rightmove, dst.forced_rightmove); - ::sg_export(fireDelay, dst.fireDelay); - ::sg_export(playerTeam, dst.playerTeam); - ::sg_export(enemyTeam, dst.enemyTeam); - ::sg_export(squadname, dst.squadname); - ::sg_export(team_leader, dst.team_leader); - ::sg_export(leader, dst.leader); - ::sg_export(follower, dst.follower); - ::sg_export(numFollowers, dst.numFollowers); - ::sg_export(formationGoal, dst.formationGoal); - ::sg_export(nextFormGoal, dst.nextFormGoal); - ::sg_export(NPC_class, dst.NPC_class); - ::sg_export(hiddenDist, dst.hiddenDist); - ::sg_export(hiddenDir, dst.hiddenDir); - ::sg_export(renderInfo, dst.renderInfo); - ::sg_export(saberTrail, dst.saberTrail); - ::sg_export(dismembered, dst.dismembered); - ::sg_export(dismemberProbLegs, dst.dismemberProbLegs); - ::sg_export(dismemberProbHead, dst.dismemberProbHead); - ::sg_export(dismemberProbArms, dst.dismemberProbArms); - ::sg_export(dismemberProbHands, dst.dismemberProbHands); - ::sg_export(dismemberProbWaist, dst.dismemberProbWaist); - ::sg_export(standheight, dst.standheight); - ::sg_export(crouchheight, dst.crouchheight); - ::sg_export(poisonDamage, dst.poisonDamage); - ::sg_export(poisonTime, dst.poisonTime); - ::sg_export(slopeRecalcTime, dst.slopeRecalcTime); - ::sg_export(pushVec, dst.pushVec); - ::sg_export(pushVecTime, dst.pushVecTime); + saved_game->write<>(ps); + saved_game->write<>(pers); + saved_game->write<>(sess); + saved_game->write(noclip); + saved_game->write(lastCmdTime); + saved_game->write<>(usercmd); + saved_game->write(buttons); + saved_game->write(oldbuttons); + saved_game->write(latched_buttons); + saved_game->write(damage_armor); + saved_game->write(damage_blood); + saved_game->write(damage_knockback); + saved_game->write(damage_from); + saved_game->write(damage_fromWorld); + saved_game->write(accurateCount); + saved_game->write(respawnTime); + saved_game->write(inactivityTime); + saved_game->write(inactivityWarning); + saved_game->write(idleTime); + saved_game->write(airOutTime); + saved_game->write(timeResidual); + saved_game->write(facial_blink); + saved_game->write(facial_frown); + saved_game->write(facial_aux); + saved_game->write<>(clientInfo); + saved_game->write(forced_forwardmove); + saved_game->write(forced_rightmove); + saved_game->write(fireDelay); + saved_game->write(playerTeam); + saved_game->write(enemyTeam); + saved_game->write(squadname); + saved_game->write(team_leader); + saved_game->write(leader); + saved_game->write(follower); + saved_game->write(numFollowers); + saved_game->write(formationGoal); + saved_game->write(nextFormGoal); + saved_game->write(NPC_class); + saved_game->write(hiddenDist); + saved_game->write(hiddenDir); + saved_game->write<>(renderInfo); + saved_game->write<>(saberTrail); + saved_game->write(dismembered); + saved_game->write(dismemberProbLegs); + saved_game->write(dismemberProbHead); + saved_game->write(dismemberProbArms); + saved_game->write(dismemberProbHands); + saved_game->write(dismemberProbWaist); + saved_game->write(standheight); + saved_game->write(crouchheight); + saved_game->write(poisonDamage); + saved_game->write(poisonTime); + saved_game->write(slopeRecalcTime); + saved_game->write(pushVec); + saved_game->write(pushVecTime); } void gclient_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.ps, ps); - ::sg_import(src.pers, pers); - ::sg_import(src.sess, sess); - ::sg_import(src.noclip, noclip); - ::sg_import(src.lastCmdTime, lastCmdTime); - ::sg_import(src.usercmd, usercmd); - ::sg_import(src.buttons, buttons); - ::sg_import(src.oldbuttons, oldbuttons); - ::sg_import(src.latched_buttons, latched_buttons); - ::sg_import(src.damage_armor, damage_armor); - ::sg_import(src.damage_blood, damage_blood); - ::sg_import(src.damage_knockback, damage_knockback); - ::sg_import(src.damage_from, damage_from); - ::sg_import(src.damage_fromWorld, damage_fromWorld); - ::sg_import(src.accurateCount, accurateCount); - ::sg_import(src.respawnTime, respawnTime); - ::sg_import(src.inactivityTime, inactivityTime); - ::sg_import(src.inactivityWarning, inactivityWarning); - ::sg_import(src.idleTime, idleTime); - ::sg_import(src.airOutTime, airOutTime); - ::sg_import(src.timeResidual, timeResidual); - ::sg_import(src.facial_blink, facial_blink); - ::sg_import(src.facial_frown, facial_frown); - ::sg_import(src.facial_aux, facial_aux); - ::sg_import(src.clientInfo, clientInfo); - ::sg_import(src.forced_forwardmove, forced_forwardmove); - ::sg_import(src.forced_rightmove, forced_rightmove); - ::sg_import(src.fireDelay, fireDelay); - ::sg_import(src.playerTeam, playerTeam); - ::sg_import(src.enemyTeam, enemyTeam); - ::sg_import(src.squadname, squadname); - ::sg_import(src.team_leader, team_leader); - ::sg_import(src.leader, leader); - ::sg_import(src.follower, follower); - ::sg_import(src.numFollowers, numFollowers); - ::sg_import(src.formationGoal, formationGoal); - ::sg_import(src.nextFormGoal, nextFormGoal); - ::sg_import(src.NPC_class, NPC_class); - ::sg_import(src.hiddenDist, hiddenDist); - ::sg_import(src.hiddenDir, hiddenDir); - ::sg_import(src.renderInfo, renderInfo); - ::sg_import(src.saberTrail, saberTrail); - ::sg_import(src.dismembered, dismembered); - ::sg_import(src.dismemberProbLegs, dismemberProbLegs); - ::sg_import(src.dismemberProbHead, dismemberProbHead); - ::sg_import(src.dismemberProbArms, dismemberProbArms); - ::sg_import(src.dismemberProbHands, dismemberProbHands); - ::sg_import(src.dismemberProbWaist, dismemberProbWaist); - ::sg_import(src.standheight, standheight); - ::sg_import(src.crouchheight, crouchheight); - ::sg_import(src.poisonDamage, poisonDamage); - ::sg_import(src.poisonTime, poisonTime); - ::sg_import(src.slopeRecalcTime, slopeRecalcTime); - ::sg_import(src.pushVec, pushVec); - ::sg_import(src.pushVecTime, pushVecTime); + saved_game->read<>(ps); + saved_game->read<>(pers); + saved_game->read<>(sess); + saved_game->read(noclip); + saved_game->read(lastCmdTime); + saved_game->read<>(usercmd); + saved_game->read(buttons); + saved_game->read(oldbuttons); + saved_game->read(latched_buttons); + saved_game->read(damage_armor); + saved_game->read(damage_blood); + saved_game->read(damage_knockback); + saved_game->read(damage_from); + saved_game->read(damage_fromWorld); + saved_game->read(accurateCount); + saved_game->read(respawnTime); + saved_game->read(inactivityTime); + saved_game->read(inactivityWarning); + saved_game->read(idleTime); + saved_game->read(airOutTime); + saved_game->read(timeResidual); + saved_game->read(facial_blink); + saved_game->read(facial_frown); + saved_game->read(facial_aux); + saved_game->read<>(clientInfo); + saved_game->read(forced_forwardmove); + saved_game->read(forced_rightmove); + saved_game->read(fireDelay); + saved_game->read(playerTeam); + saved_game->read(enemyTeam); + saved_game->read(squadname); + saved_game->read(team_leader); + saved_game->read(leader); + saved_game->read(follower); + saved_game->read(numFollowers); + saved_game->read(formationGoal); + saved_game->read(nextFormGoal); + saved_game->read(NPC_class); + saved_game->read(hiddenDist); + saved_game->read(hiddenDir); + saved_game->read<>(renderInfo); + saved_game->read<>(saberTrail); + saved_game->read(dismembered); + saved_game->read(dismemberProbLegs); + saved_game->read(dismemberProbHead); + saved_game->read(dismemberProbArms); + saved_game->read(dismemberProbHands); + saved_game->read(dismemberProbWaist); + saved_game->read(standheight); + saved_game->read(crouchheight); + saved_game->read(poisonDamage); + saved_game->read(poisonTime); + saved_game->read(slopeRecalcTime); + saved_game->read(pushVec); + saved_game->read(pushVecTime); } void parms_t::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(parm, dst.parm); + saved_game->write(parm); } void parms_t::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.parm, parm); + saved_game->read(parm); } void gentity_s::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(s, dst.s); - ::sg_export(client, dst.client); - ::sg_export(inuse, dst.inuse); - ::sg_export(linked, dst.linked); - ::sg_export(svFlags, dst.svFlags); - ::sg_export(bmodel, dst.bmodel); - ::sg_export(mins, dst.mins); - ::sg_export(maxs, dst.maxs); - ::sg_export(contents, dst.contents); - ::sg_export(absmin, dst.absmin); - ::sg_export(absmax, dst.absmax); - ::sg_export(currentOrigin, dst.currentOrigin); - ::sg_export(currentAngles, dst.currentAngles); - ::sg_export(owner, dst.owner); - ::sg_export(ghoul2, dst.ghoul2); - ::sg_export(classname, dst.classname); - ::sg_export(spawnflags, dst.spawnflags); - ::sg_export(flags, dst.flags); - ::sg_export(model, dst.model); - ::sg_export(model2, dst.model2); - ::sg_export(freetime, dst.freetime); - ::sg_export(eventTime, dst.eventTime); - ::sg_export(freeAfterEvent, dst.freeAfterEvent); - ::sg_export(unlinkAfterEvent, dst.unlinkAfterEvent); - ::sg_export(physicsBounce, dst.physicsBounce); - ::sg_export(clipmask, dst.clipmask); - ::sg_export(speed, dst.speed); - ::sg_export(movedir, dst.movedir); - ::sg_export(lastOrigin, dst.lastOrigin); - ::sg_export(lastAngles, dst.lastAngles); - ::sg_export(mass, dst.mass); - ::sg_export(lastImpact, dst.lastImpact); - ::sg_export(watertype, dst.watertype); - ::sg_export(waterlevel, dst.waterlevel); - ::sg_export(angle, dst.angle); - ::sg_export(target, dst.target); - ::sg_export(target2, dst.target2); - ::sg_export(target3, dst.target3); - ::sg_export(target4, dst.target4); - ::sg_export(targetname, dst.targetname); - ::sg_export(team, dst.team); - ::sg_export(roff, dst.roff); - ::sg_export(roff_ctr, dst.roff_ctr); - ::sg_export(next_roff_time, dst.next_roff_time); - ::sg_export(fx_time, dst.fx_time); - ::sg_export(nextthink, dst.nextthink); - ::sg_export(e_ThinkFunc, dst.e_ThinkFunc); - ::sg_export(e_clThinkFunc, dst.e_clThinkFunc); - ::sg_export(e_ReachedFunc, dst.e_ReachedFunc); - ::sg_export(e_BlockedFunc, dst.e_BlockedFunc); - ::sg_export(e_TouchFunc, dst.e_TouchFunc); - ::sg_export(e_UseFunc, dst.e_UseFunc); - ::sg_export(e_PainFunc, dst.e_PainFunc); - ::sg_export(e_DieFunc, dst.e_DieFunc); - ::sg_export(health, dst.health); - ::sg_export(max_health, dst.max_health); - ::sg_export(takedamage, dst.takedamage); - ::sg_export(material, dst.material); - ::sg_export(damage, dst.damage); - ::sg_export(dflags, dst.dflags); - ::sg_export(splashDamage, dst.splashDamage); - ::sg_export(splashRadius, dst.splashRadius); - ::sg_export(methodOfDeath, dst.methodOfDeath); - ::sg_export(splashMethodOfDeath, dst.splashMethodOfDeath); - ::sg_export(locationDamage, dst.locationDamage); - ::sg_export(chain, dst.chain); - ::sg_export(enemy, dst.enemy); - ::sg_export(activator, dst.activator); - ::sg_export(teamchain, dst.teamchain); - ::sg_export(teammaster, dst.teammaster); - ::sg_export(lastEnemy, dst.lastEnemy); - ::sg_export(wait, dst.wait); - ::sg_export(random, dst.random); - ::sg_export(delay, dst.delay); - ::sg_export(alt_fire, dst.alt_fire); - ::sg_export(count, dst.count); - ::sg_export(bounceCount, dst.bounceCount); - ::sg_export(fly_sound_debounce_time, dst.fly_sound_debounce_time); - ::sg_export(painDebounceTime, dst.painDebounceTime); - ::sg_export(disconnectDebounceTime, dst.disconnectDebounceTime); - ::sg_export(attackDebounceTime, dst.attackDebounceTime); - ::sg_export(pushDebounceTime, dst.pushDebounceTime); - ::sg_export(aimDebounceTime, dst.aimDebounceTime); - ::sg_export(useDebounceTime, dst.useDebounceTime); - ::sg_export(trigger_formation, dst.trigger_formation); - ::sg_export(waypoint, dst.waypoint); - ::sg_export(lastWaypoint, dst.lastWaypoint); - ::sg_export(lastValidWaypoint, dst.lastValidWaypoint); - ::sg_export(noWaypointTime, dst.noWaypointTime); - ::sg_export(combatPoint, dst.combatPoint); - ::sg_export(failedWaypoints, dst.failedWaypoints); - ::sg_export(failedWaypointCheckTime, dst.failedWaypointCheckTime); - ::sg_export(loopAnim, dst.loopAnim); - ::sg_export(startFrame, dst.startFrame); - ::sg_export(endFrame, dst.endFrame); - ::sg_export(sequencer, dst.sequencer); - ::sg_export(taskManager, dst.taskManager); - ::sg_export(taskID, dst.taskID); - ::sg_export(parms, dst.parms); - ::sg_export(behaviorSet, dst.behaviorSet); - ::sg_export(script_targetname, dst.script_targetname); - ::sg_export(delayScriptTime, dst.delayScriptTime); - ::sg_export(fullName, dst.fullName); - ::sg_export(soundSet, dst.soundSet); - ::sg_export(setTime, dst.setTime); - ::sg_export(cameraGroup, dst.cameraGroup); - ::sg_export(noDamageTeam, dst.noDamageTeam); - ::sg_export(playerModel, dst.playerModel); - ::sg_export(weaponModel, dst.weaponModel); - ::sg_export(handRBolt, dst.handRBolt); - ::sg_export(handLBolt, dst.handLBolt); - ::sg_export(headBolt, dst.headBolt); - ::sg_export(cervicalBolt, dst.cervicalBolt); - ::sg_export(chestBolt, dst.chestBolt); - ::sg_export(gutBolt, dst.gutBolt); - ::sg_export(torsoBolt, dst.torsoBolt); - ::sg_export(crotchBolt, dst.crotchBolt); - ::sg_export(motionBolt, dst.motionBolt); - ::sg_export(kneeLBolt, dst.kneeLBolt); - ::sg_export(kneeRBolt, dst.kneeRBolt); - ::sg_export(elbowLBolt, dst.elbowLBolt); - ::sg_export(elbowRBolt, dst.elbowRBolt); - ::sg_export(footLBolt, dst.footLBolt); - ::sg_export(footRBolt, dst.footRBolt); - ::sg_export(faceBone, dst.faceBone); - ::sg_export(craniumBone, dst.craniumBone); - ::sg_export(cervicalBone, dst.cervicalBone); - ::sg_export(thoracicBone, dst.thoracicBone); - ::sg_export(upperLumbarBone, dst.upperLumbarBone); - ::sg_export(lowerLumbarBone, dst.lowerLumbarBone); - ::sg_export(hipsBone, dst.hipsBone); - ::sg_export(motionBone, dst.motionBone); - ::sg_export(rootBone, dst.rootBone); - ::sg_export(footLBone, dst.footLBone); - ::sg_export(footRBone, dst.footRBone); - ::sg_export(genericBone1, dst.genericBone1); - ::sg_export(genericBone2, dst.genericBone2); - ::sg_export(genericBone3, dst.genericBone3); - ::sg_export(genericBolt1, dst.genericBolt1); - ::sg_export(genericBolt2, dst.genericBolt2); - ::sg_export(genericBolt3, dst.genericBolt3); - ::sg_export(genericBolt4, dst.genericBolt4); - ::sg_export(genericBolt5, dst.genericBolt5); - ::sg_export(cinematicModel, dst.cinematicModel); - ::sg_export(NPC, dst.NPC); - ::sg_export(ownername, dst.ownername); - ::sg_export(cantHitEnemyCounter, dst.cantHitEnemyCounter); - ::sg_export(NPC_type, dst.NPC_type); - ::sg_export(NPC_targetname, dst.NPC_targetname); - ::sg_export(NPC_target, dst.NPC_target); - ::sg_export(moverState, dst.moverState); - ::sg_export(soundPos1, dst.soundPos1); - ::sg_export(sound1to2, dst.sound1to2); - ::sg_export(sound2to1, dst.sound2to1); - ::sg_export(soundPos2, dst.soundPos2); - ::sg_export(soundLoop, dst.soundLoop); - ::sg_export(nextTrain, dst.nextTrain); - ::sg_export(prevTrain, dst.prevTrain); - ::sg_export(pos1, dst.pos1); - ::sg_export(pos2, dst.pos2); - ::sg_export(pos3, dst.pos3); - ::sg_export(sounds, dst.sounds); - ::sg_export(closetarget, dst.closetarget); - ::sg_export(opentarget, dst.opentarget); - ::sg_export(paintarget, dst.paintarget); - ::sg_export(lockCount, dst.lockCount); - ::sg_export(radius, dst.radius); - ::sg_export(wpIndex, dst.wpIndex); - ::sg_export(noise_index, dst.noise_index); - ::sg_export(startRGBA, dst.startRGBA); - ::sg_export(finalRGBA, dst.finalRGBA); - ::sg_export(item, dst.item); - ::sg_export(message, dst.message); - ::sg_export(lightLevel, dst.lightLevel); - ::sg_export(forcePushTime, dst.forcePushTime); - ::sg_export(forcePuller, dst.forcePuller); + saved_game->write<>(s); + saved_game->write(client); + saved_game->write(inuse); + saved_game->write(linked); + saved_game->write(svFlags); + saved_game->write(bmodel); + saved_game->write(mins); + saved_game->write(maxs); + saved_game->write(contents); + saved_game->write(absmin); + saved_game->write(absmax); + saved_game->write(currentOrigin); + saved_game->write(currentAngles); + saved_game->write(owner); + saved_game->write<>(ghoul2); + saved_game->write(classname); + saved_game->write(spawnflags); + saved_game->write(flags); + saved_game->write(model); + saved_game->write(model2); + saved_game->write(freetime); + saved_game->write(eventTime); + saved_game->write(freeAfterEvent); + saved_game->write(unlinkAfterEvent); + saved_game->write(physicsBounce); + saved_game->write(clipmask); + saved_game->write(speed); + saved_game->write(movedir); + saved_game->write(lastOrigin); + saved_game->write(lastAngles); + saved_game->write(mass); + saved_game->write(lastImpact); + saved_game->write(watertype); + saved_game->write(waterlevel); + saved_game->write(angle); + saved_game->write(target); + saved_game->write(target2); + saved_game->write(target3); + saved_game->write(target4); + saved_game->write(targetname); + saved_game->write(team); + saved_game->write(roff); + saved_game->write(roff_ctr); + saved_game->write(next_roff_time); + saved_game->write(fx_time); + saved_game->write(nextthink); + saved_game->write(e_ThinkFunc); + saved_game->write(e_clThinkFunc); + saved_game->write(e_ReachedFunc); + saved_game->write(e_BlockedFunc); + saved_game->write(e_TouchFunc); + saved_game->write(e_UseFunc); + saved_game->write(e_PainFunc); + saved_game->write(e_DieFunc); + saved_game->write(health); + saved_game->write(max_health); + saved_game->write(takedamage); + saved_game->write(material); + saved_game->write(damage); + saved_game->write(dflags); + saved_game->write(splashDamage); + saved_game->write(splashRadius); + saved_game->write(methodOfDeath); + saved_game->write(splashMethodOfDeath); + saved_game->write(locationDamage); + saved_game->write(chain); + saved_game->write(enemy); + saved_game->write(activator); + saved_game->write(teamchain); + saved_game->write(teammaster); + saved_game->write(lastEnemy); + saved_game->write(wait); + saved_game->write(random); + saved_game->write(delay); + saved_game->write(alt_fire); + saved_game->write(count); + saved_game->write(bounceCount); + saved_game->write(fly_sound_debounce_time); + saved_game->write(painDebounceTime); + saved_game->write(disconnectDebounceTime); + saved_game->write(attackDebounceTime); + saved_game->write(pushDebounceTime); + saved_game->write(aimDebounceTime); + saved_game->write(useDebounceTime); + saved_game->write(trigger_formation); + saved_game->write(waypoint); + saved_game->write(lastWaypoint); + saved_game->write(lastValidWaypoint); + saved_game->write(noWaypointTime); + saved_game->write(combatPoint); + saved_game->write(failedWaypoints); + saved_game->write(failedWaypointCheckTime); + saved_game->write(loopAnim); + saved_game->write(startFrame); + saved_game->write(endFrame); + saved_game->write(sequencer); + saved_game->write(taskManager); + saved_game->write(taskID); + saved_game->write(parms); + saved_game->write(behaviorSet); + saved_game->write(script_targetname); + saved_game->write(delayScriptTime); + saved_game->write(fullName); + saved_game->write(soundSet); + saved_game->write(setTime); + saved_game->write(cameraGroup); + saved_game->write(noDamageTeam); + saved_game->write(playerModel); + saved_game->write(weaponModel); + saved_game->write(handRBolt); + saved_game->write(handLBolt); + saved_game->write(headBolt); + saved_game->write(cervicalBolt); + saved_game->write(chestBolt); + saved_game->write(gutBolt); + saved_game->write(torsoBolt); + saved_game->write(crotchBolt); + saved_game->write(motionBolt); + saved_game->write(kneeLBolt); + saved_game->write(kneeRBolt); + saved_game->write(elbowLBolt); + saved_game->write(elbowRBolt); + saved_game->write(footLBolt); + saved_game->write(footRBolt); + saved_game->write(faceBone); + saved_game->write(craniumBone); + saved_game->write(cervicalBone); + saved_game->write(thoracicBone); + saved_game->write(upperLumbarBone); + saved_game->write(lowerLumbarBone); + saved_game->write(hipsBone); + saved_game->write(motionBone); + saved_game->write(rootBone); + saved_game->write(footLBone); + saved_game->write(footRBone); + saved_game->write(genericBone1); + saved_game->write(genericBone2); + saved_game->write(genericBone3); + saved_game->write(genericBolt1); + saved_game->write(genericBolt2); + saved_game->write(genericBolt3); + saved_game->write(genericBolt4); + saved_game->write(genericBolt5); + saved_game->write(cinematicModel); + saved_game->write(NPC); + saved_game->write(ownername); + saved_game->write(cantHitEnemyCounter); + saved_game->write(NPC_type); + saved_game->write(NPC_targetname); + saved_game->write(NPC_target); + saved_game->write(moverState); + saved_game->write(soundPos1); + saved_game->write(sound1to2); + saved_game->write(sound2to1); + saved_game->write(soundPos2); + saved_game->write(soundLoop); + saved_game->write(nextTrain); + saved_game->write(prevTrain); + saved_game->write(pos1); + saved_game->write(pos2); + saved_game->write(pos3); + saved_game->write(sounds); + saved_game->write(closetarget); + saved_game->write(opentarget); + saved_game->write(paintarget); + saved_game->write(lockCount); + saved_game->write(radius); + saved_game->write(wpIndex); + saved_game->write(noise_index); + saved_game->write(startRGBA); + saved_game->write(finalRGBA); + saved_game->write(item); + saved_game->write(message); + saved_game->write(lightLevel); + saved_game->write(forcePushTime); + saved_game->write(forcePuller); } void gentity_s::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_import(src.s, s); - ::sg_import(src.client, client); - ::sg_import(src.inuse, inuse); - ::sg_import(src.linked, linked); - ::sg_import(src.svFlags, svFlags); - ::sg_import(src.bmodel, bmodel); - ::sg_import(src.mins, mins); - ::sg_import(src.maxs, maxs); - ::sg_import(src.contents, contents); - ::sg_import(src.absmin, absmin); - ::sg_import(src.absmax, absmax); - ::sg_import(src.currentOrigin, currentOrigin); - ::sg_import(src.currentAngles, currentAngles); - ::sg_import(src.owner, owner); - ::sg_import(src.ghoul2, ghoul2); - ::sg_import(src.classname, classname); - ::sg_import(src.spawnflags, spawnflags); - ::sg_import(src.flags, flags); - ::sg_import(src.model, model); - ::sg_import(src.model2, model2); - ::sg_import(src.freetime, freetime); - ::sg_import(src.eventTime, eventTime); - ::sg_import(src.freeAfterEvent, freeAfterEvent); - ::sg_import(src.unlinkAfterEvent, unlinkAfterEvent); - ::sg_import(src.physicsBounce, physicsBounce); - ::sg_import(src.clipmask, clipmask); - ::sg_import(src.speed, speed); - ::sg_import(src.movedir, movedir); - ::sg_import(src.lastOrigin, lastOrigin); - ::sg_import(src.lastAngles, lastAngles); - ::sg_import(src.mass, mass); - ::sg_import(src.lastImpact, lastImpact); - ::sg_import(src.watertype, watertype); - ::sg_import(src.waterlevel, waterlevel); - ::sg_import(src.angle, angle); - ::sg_import(src.target, target); - ::sg_import(src.target2, target2); - ::sg_import(src.target3, target3); - ::sg_import(src.target4, target4); - ::sg_import(src.targetname, targetname); - ::sg_import(src.team, team); - ::sg_import(src.roff, roff); - ::sg_import(src.roff_ctr, roff_ctr); - ::sg_import(src.next_roff_time, next_roff_time); - ::sg_import(src.fx_time, fx_time); - ::sg_import(src.nextthink, nextthink); - ::sg_import(src.e_ThinkFunc, e_ThinkFunc); - ::sg_import(src.e_clThinkFunc, e_clThinkFunc); - ::sg_import(src.e_ReachedFunc, e_ReachedFunc); - ::sg_import(src.e_BlockedFunc, e_BlockedFunc); - ::sg_import(src.e_TouchFunc, e_TouchFunc); - ::sg_import(src.e_UseFunc, e_UseFunc); - ::sg_import(src.e_PainFunc, e_PainFunc); - ::sg_import(src.e_DieFunc, e_DieFunc); - ::sg_import(src.health, health); - ::sg_import(src.max_health, max_health); - ::sg_import(src.takedamage, takedamage); - ::sg_import(src.material, material); - ::sg_import(src.damage, damage); - ::sg_import(src.dflags, dflags); - ::sg_import(src.splashDamage, splashDamage); - ::sg_import(src.splashRadius, splashRadius); - ::sg_import(src.methodOfDeath, methodOfDeath); - ::sg_import(src.splashMethodOfDeath, splashMethodOfDeath); - ::sg_import(src.locationDamage, locationDamage); - ::sg_import(src.chain, chain); - ::sg_import(src.enemy, enemy); - ::sg_import(src.activator, activator); - ::sg_import(src.teamchain, teamchain); - ::sg_import(src.teammaster, teammaster); - ::sg_import(src.lastEnemy, lastEnemy); - ::sg_import(src.wait, wait); - ::sg_import(src.random, random); - ::sg_import(src.delay, delay); - ::sg_import(src.alt_fire, alt_fire); - ::sg_import(src.count, count); - ::sg_import(src.bounceCount, bounceCount); - ::sg_import(src.fly_sound_debounce_time, fly_sound_debounce_time); - ::sg_import(src.painDebounceTime, painDebounceTime); - ::sg_import(src.disconnectDebounceTime, disconnectDebounceTime); - ::sg_import(src.attackDebounceTime, attackDebounceTime); - ::sg_import(src.pushDebounceTime, pushDebounceTime); - ::sg_import(src.aimDebounceTime, aimDebounceTime); - ::sg_import(src.useDebounceTime, useDebounceTime); - ::sg_import(src.trigger_formation, trigger_formation); - ::sg_import(src.waypoint, waypoint); - ::sg_import(src.lastWaypoint, lastWaypoint); - ::sg_import(src.lastValidWaypoint, lastValidWaypoint); - ::sg_import(src.noWaypointTime, noWaypointTime); - ::sg_import(src.combatPoint, combatPoint); - ::sg_import(src.failedWaypoints, failedWaypoints); - ::sg_import(src.failedWaypointCheckTime, failedWaypointCheckTime); - ::sg_import(src.loopAnim, loopAnim); - ::sg_import(src.startFrame, startFrame); - ::sg_import(src.endFrame, endFrame); - ::sg_import(src.sequencer, sequencer); - ::sg_import(src.taskManager, taskManager); - ::sg_import(src.taskID, taskID); - ::sg_import(src.parms, parms); - ::sg_import(src.behaviorSet, behaviorSet); - ::sg_import(src.script_targetname, script_targetname); - ::sg_import(src.delayScriptTime, delayScriptTime); - ::sg_import(src.fullName, fullName); - ::sg_import(src.soundSet, soundSet); - ::sg_import(src.setTime, setTime); - ::sg_import(src.cameraGroup, cameraGroup); - ::sg_import(src.noDamageTeam, noDamageTeam); - ::sg_import(src.playerModel, playerModel); - ::sg_import(src.weaponModel, weaponModel); - ::sg_import(src.handRBolt, handRBolt); - ::sg_import(src.handLBolt, handLBolt); - ::sg_import(src.headBolt, headBolt); - ::sg_import(src.cervicalBolt, cervicalBolt); - ::sg_import(src.chestBolt, chestBolt); - ::sg_import(src.gutBolt, gutBolt); - ::sg_import(src.torsoBolt, torsoBolt); - ::sg_import(src.crotchBolt, crotchBolt); - ::sg_import(src.motionBolt, motionBolt); - ::sg_import(src.kneeLBolt, kneeLBolt); - ::sg_import(src.kneeRBolt, kneeRBolt); - ::sg_import(src.elbowLBolt, elbowLBolt); - ::sg_import(src.elbowRBolt, elbowRBolt); - ::sg_import(src.footLBolt, footLBolt); - ::sg_import(src.footRBolt, footRBolt); - ::sg_import(src.faceBone, faceBone); - ::sg_import(src.craniumBone, craniumBone); - ::sg_import(src.cervicalBone, cervicalBone); - ::sg_import(src.thoracicBone, thoracicBone); - ::sg_import(src.upperLumbarBone, upperLumbarBone); - ::sg_import(src.lowerLumbarBone, lowerLumbarBone); - ::sg_import(src.hipsBone, hipsBone); - ::sg_import(src.motionBone, motionBone); - ::sg_import(src.rootBone, rootBone); - ::sg_import(src.footLBone, footLBone); - ::sg_import(src.footRBone, footRBone); - ::sg_import(src.genericBone1, genericBone1); - ::sg_import(src.genericBone2, genericBone2); - ::sg_import(src.genericBone3, genericBone3); - ::sg_import(src.genericBolt1, genericBolt1); - ::sg_import(src.genericBolt2, genericBolt2); - ::sg_import(src.genericBolt3, genericBolt3); - ::sg_import(src.genericBolt4, genericBolt4); - ::sg_import(src.genericBolt5, genericBolt5); - ::sg_import(src.cinematicModel, cinematicModel); - ::sg_import(src.NPC, NPC); - ::sg_import(src.ownername, ownername); - ::sg_import(src.cantHitEnemyCounter, cantHitEnemyCounter); - ::sg_import(src.NPC_type, NPC_type); - ::sg_import(src.NPC_targetname, NPC_targetname); - ::sg_import(src.NPC_target, NPC_target); - ::sg_import(src.moverState, moverState); - ::sg_import(src.soundPos1, soundPos1); - ::sg_import(src.sound1to2, sound1to2); - ::sg_import(src.sound2to1, sound2to1); - ::sg_import(src.soundPos2, soundPos2); - ::sg_import(src.soundLoop, soundLoop); - ::sg_import(src.nextTrain, nextTrain); - ::sg_import(src.prevTrain, prevTrain); - ::sg_import(src.pos1, pos1); - ::sg_import(src.pos2, pos2); - ::sg_import(src.pos3, pos3); - ::sg_import(src.sounds, sounds); - ::sg_import(src.closetarget, closetarget); - ::sg_import(src.opentarget, opentarget); - ::sg_import(src.paintarget, paintarget); - ::sg_import(src.lockCount, lockCount); - ::sg_import(src.radius, radius); - ::sg_import(src.wpIndex, wpIndex); - ::sg_import(src.noise_index, noise_index); - ::sg_import(src.startRGBA, startRGBA); - ::sg_import(src.finalRGBA, finalRGBA); - ::sg_import(src.item, item); - ::sg_import(src.message, message); - ::sg_import(src.lightLevel, lightLevel); - ::sg_import(src.forcePushTime, forcePushTime); - ::sg_import(src.forcePuller, forcePuller); + saved_game->read<>(s); + saved_game->read(client); + saved_game->read(inuse); + saved_game->read(linked); + saved_game->read(svFlags); + saved_game->read(bmodel); + saved_game->read(mins); + saved_game->read(maxs); + saved_game->read(contents); + saved_game->read(absmin); + saved_game->read(absmax); + saved_game->read(currentOrigin); + saved_game->read(currentAngles); + saved_game->read(owner); + saved_game->read<>(ghoul2); + saved_game->read(classname); + saved_game->read(spawnflags); + saved_game->read(flags); + saved_game->read(model); + saved_game->read(model2); + saved_game->read(freetime); + saved_game->read(eventTime); + saved_game->read(freeAfterEvent); + saved_game->read(unlinkAfterEvent); + saved_game->read(physicsBounce); + saved_game->read(clipmask); + saved_game->read(speed); + saved_game->read(movedir); + saved_game->read(lastOrigin); + saved_game->read(lastAngles); + saved_game->read(mass); + saved_game->read(lastImpact); + saved_game->read(watertype); + saved_game->read(waterlevel); + saved_game->read(angle); + saved_game->read(target); + saved_game->read(target2); + saved_game->read(target3); + saved_game->read(target4); + saved_game->read(targetname); + saved_game->read(team); + saved_game->read(roff); + saved_game->read(roff_ctr); + saved_game->read(next_roff_time); + saved_game->read(fx_time); + saved_game->read(nextthink); + saved_game->read(e_ThinkFunc); + saved_game->read(e_clThinkFunc); + saved_game->read(e_ReachedFunc); + saved_game->read(e_BlockedFunc); + saved_game->read(e_TouchFunc); + saved_game->read(e_UseFunc); + saved_game->read(e_PainFunc); + saved_game->read(e_DieFunc); + saved_game->read(health); + saved_game->read(max_health); + saved_game->read(takedamage); + saved_game->read(material); + saved_game->read(damage); + saved_game->read(dflags); + saved_game->read(splashDamage); + saved_game->read(splashRadius); + saved_game->read(methodOfDeath); + saved_game->read(splashMethodOfDeath); + saved_game->read(locationDamage); + saved_game->read(chain); + saved_game->read(enemy); + saved_game->read(activator); + saved_game->read(teamchain); + saved_game->read(teammaster); + saved_game->read(lastEnemy); + saved_game->read(wait); + saved_game->read(random); + saved_game->read(delay); + saved_game->read(alt_fire); + saved_game->read(count); + saved_game->read(bounceCount); + saved_game->read(fly_sound_debounce_time); + saved_game->read(painDebounceTime); + saved_game->read(disconnectDebounceTime); + saved_game->read(attackDebounceTime); + saved_game->read(pushDebounceTime); + saved_game->read(aimDebounceTime); + saved_game->read(useDebounceTime); + saved_game->read(trigger_formation); + saved_game->read(waypoint); + saved_game->read(lastWaypoint); + saved_game->read(lastValidWaypoint); + saved_game->read(noWaypointTime); + saved_game->read(combatPoint); + saved_game->read(failedWaypoints); + saved_game->read(failedWaypointCheckTime); + saved_game->read(loopAnim); + saved_game->read(startFrame); + saved_game->read(endFrame); + saved_game->read(sequencer); + saved_game->read(taskManager); + saved_game->read(taskID); + saved_game->read(parms); + saved_game->read(behaviorSet); + saved_game->read(script_targetname); + saved_game->read(delayScriptTime); + saved_game->read(fullName); + saved_game->read(soundSet); + saved_game->read(setTime); + saved_game->read(cameraGroup); + saved_game->read(noDamageTeam); + saved_game->read(playerModel); + saved_game->read(weaponModel); + saved_game->read(handRBolt); + saved_game->read(handLBolt); + saved_game->read(headBolt); + saved_game->read(cervicalBolt); + saved_game->read(chestBolt); + saved_game->read(gutBolt); + saved_game->read(torsoBolt); + saved_game->read(crotchBolt); + saved_game->read(motionBolt); + saved_game->read(kneeLBolt); + saved_game->read(kneeRBolt); + saved_game->read(elbowLBolt); + saved_game->read(elbowRBolt); + saved_game->read(footLBolt); + saved_game->read(footRBolt); + saved_game->read(faceBone); + saved_game->read(craniumBone); + saved_game->read(cervicalBone); + saved_game->read(thoracicBone); + saved_game->read(upperLumbarBone); + saved_game->read(lowerLumbarBone); + saved_game->read(hipsBone); + saved_game->read(motionBone); + saved_game->read(rootBone); + saved_game->read(footLBone); + saved_game->read(footRBone); + saved_game->read(genericBone1); + saved_game->read(genericBone2); + saved_game->read(genericBone3); + saved_game->read(genericBolt1); + saved_game->read(genericBolt2); + saved_game->read(genericBolt3); + saved_game->read(genericBolt4); + saved_game->read(genericBolt5); + saved_game->read(cinematicModel); + saved_game->read(NPC); + saved_game->read(ownername); + saved_game->read(cantHitEnemyCounter); + saved_game->read(NPC_type); + saved_game->read(NPC_targetname); + saved_game->read(NPC_target); + saved_game->read(moverState); + saved_game->read(soundPos1); + saved_game->read(sound1to2); + saved_game->read(sound2to1); + saved_game->read(soundPos2); + saved_game->read(soundLoop); + saved_game->read(nextTrain); + saved_game->read(prevTrain); + saved_game->read(pos1); + saved_game->read(pos2); + saved_game->read(pos3); + saved_game->read(sounds); + saved_game->read(closetarget); + saved_game->read(opentarget); + saved_game->read(paintarget); + saved_game->read(lockCount); + saved_game->read(radius); + saved_game->read(wpIndex); + saved_game->read(noise_index); + saved_game->read(startRGBA); + saved_game->read(finalRGBA); + saved_game->read(item); + saved_game->read(message); + saved_game->read(lightLevel); + saved_game->read(forcePushTime); + saved_game->read(forcePuller); } void CGhoul2Info_v::sg_export( - SgType& dst) const + ojk::ISavedGame* saved_game) const { - ::sg_export(mItem, dst.mItem); + saved_game->write(mItem); } void CGhoul2Info_v::sg_import( - const SgType& src) + ojk::ISavedGame* saved_game) { - ::sg_export(src.mItem, mItem); + saved_game->read(mItem); } diff --git a/codeJK2/game/g_shared.h b/codeJK2/game/g_shared.h index ff906d0da8..1de161a709 100644 --- a/codeJK2/game/g_shared.h +++ b/codeJK2/game/g_shared.h @@ -121,35 +121,7 @@ typedef enum //# material_e #define MAX_CUSTOM_JEDI_SOUNDS 22 #define MAX_CUSTOM_SOUNDS (MAX_CUSTOM_JEDI_SOUNDS + MAX_CUSTOM_EXTRA_SOUNDS + MAX_CUSTOM_COMBAT_SOUNDS + MAX_CUSTOM_BASIC_SOUNDS) // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgClientInfo -{ -public: - int32_t infoValid; - SgArray name; - int32_t team; - int32_t score; - int32_t handicap; - int32_t legsModel; - int32_t legsSkin; - int32_t torsoModel; - int32_t torsoSkin; - int32_t headModel; - int32_t headSkin; - int32_t extensions; - int32_t animFileIndex; - SgArray sounds; - int32_t customBasicSoundDir; - int32_t customCombatSoundDir; - int32_t customExtraSoundDir; - int32_t customJediSoundDir; -}; // SgClientInfo -#pragma pack(pop) - typedef struct { - using SgType = SgClientInfo; - - qboolean infoValid; char name[MAX_QPATH]; @@ -180,10 +152,10 @@ typedef struct { void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } clientInfo_t; @@ -199,31 +171,18 @@ typedef enum // Rendering information structure // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgModelInfo -{ -public: - int32_t modelIndex; - SgVec3 customRGB; - int32_t customAlpha; -}; // SgModelInfo -#pragma pack(pop) - typedef struct modelInfo_s { - using SgType = SgModelInfo; - - int modelIndex; vec3_t customRGB;//Red Green Blue, 0 = don't apply int customAlpha;//Alpha to apply, 0 = none? void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } modelInfo_t; typedef enum @@ -243,65 +202,8 @@ typedef enum #define RF_LOCKEDANGLE 1 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgRenderInfo -{ -public: - SgModelInfo legsModel; - SgArray legsModelName; - SgModelInfo torsoModel; - SgModelInfo headModel; - SgArray torsoModelName; - SgArray headModelName; - int32_t headYawRangeLeft; - int32_t headYawRangeRight; - int32_t headPitchRangeUp; - int32_t headPitchRangeDown; - int32_t torsoYawRangeLeft; - int32_t torsoYawRangeRight; - int32_t torsoPitchRangeUp; - int32_t torsoPitchRangeDown; - int32_t legsFrame; - int32_t torsoFrame; - float legsFpsMod; - float torsoFpsMod; - SgVec3 customRGB; - int32_t customAlpha; - int32_t renderFlags; - SgVec3 muzzlePoint; - SgVec3 muzzleDir; - SgVec3 muzzlePointOld; - SgVec3 muzzleDirOld; - int32_t mPCalcTime; - float lockYaw; - SgVec3 headPoint; - SgVec3 headAngles; - SgVec3 handRPoint; - SgVec3 handLPoint; - SgVec3 crotchPoint; - SgVec3 footRPoint; - SgVec3 footLPoint; - SgVec3 torsoPoint; - SgVec3 torsoAngles; - SgVec3 eyePoint; - SgVec3 eyeAngles; - int32_t lookTarget; - int32_t lookMode; - int32_t lookTargetClearTime; - int32_t lastVoiceVolume; - SgVec3 lastHeadAngles; - SgVec3 headBobAngles; - SgVec3 targetHeadBobAngles; - int32_t lookingDebounceTime; - float legsYaw; -}; // SgRenderInfo -#pragma pack(pop) - typedef struct renderInfo_s { - using SgType = SgRenderInfo; - - // Legs model, or full model on one piece entities union { @@ -381,10 +283,10 @@ typedef struct renderInfo_s void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } renderInfo_t; // Movement information structure @@ -413,28 +315,7 @@ typedef enum { } playerTeamStateState_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgPlayerTeamState -{ -public: - int32_t state; - int32_t captures; - int32_t basedefense; - int32_t carrierdefense; - int32_t flagrecovery; - int32_t fragcarrier; - int32_t assists; - float lasthurtcarrier; - float lastreturnedflag; - float flagsince; - float lastfraggedcarrier; -}; // SgPlayerTeamState -#pragma pack(pop) - typedef struct { - using SgType = SgPlayerTeamState; - - playerTeamStateState_t state; int captures; @@ -451,66 +332,30 @@ typedef struct { void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } playerTeamState_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgObjectives -{ -public: - int32_t display; - int32_t status; -}; // SgObjectives -#pragma pack(pop) - typedef struct objectives_s { - using SgType = SgObjectives; - - qboolean display; // A displayable objective? int status; // Succeed or fail or pending void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } objectives_t; #define MAX_MISSION_OBJ 80 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgMissionStats -{ -public: - int32_t secretsFound; - int32_t totalSecrets; - int32_t shotsFired; - int32_t hits; - int32_t enemiesSpawned; - int32_t enemiesKilled; - int32_t saberThrownCnt; - int32_t saberBlocksCnt; - int32_t legAttacksCnt; - int32_t armAttacksCnt; - int32_t torsoAttacksCnt; - int32_t otherAttacksCnt; - SgArray forceUsed; - SgArray weaponUsed; -}; // SgMissionStats -#pragma pack(pop) - typedef struct missionStats_s { - using SgType = SgMissionStats; - - int secretsFound; // # of secret areas found int totalSecrets; // # of secret areas that could have been found int shotsFired; // total number of shots fired @@ -528,10 +373,10 @@ typedef struct missionStats_s void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } missionStats_t; // the auto following clients don't follow a specific client @@ -545,21 +390,7 @@ typedef struct missionStats_s // MUST be dealt with in G_InitSessionData() / G_ReadSessionData() / G_WriteSessionData() // // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgClientSession -{ -public: - int32_t missionObjectivesShown; - int32_t sessionTeam; - SgArray mission_objectives; - SgMissionStats missionStats; -}; // SgClientSession -#pragma pack(pop) - typedef struct { - using SgType = SgClientSession; - - int missionObjectivesShown; // Number of times mission objectives have been updated team_t sessionTeam; objectives_t mission_objectives[MAX_MISSION_OBJ]; @@ -567,34 +398,16 @@ typedef struct { void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } clientSession_t; // client data that stays across multiple respawns, but is cleared // on each level change or team change at ClientBegin() // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgClientPersistant -{ -public: - int32_t connected; - SgUserCmd lastCommand; - int32_t localClient; - SgArray netname; - int32_t maxHealth; - int32_t enterTime; - SgArray cmd_angles; - SgPlayerTeamState teamState; -}; // SgClientPersistant -#pragma pack(pop) - typedef struct { - using SgType = SgClientPersistant; - - clientConnected_t connected; usercmd_t lastCommand; qboolean localClient; // true if "ip" info key is "localhost" @@ -607,10 +420,10 @@ typedef struct { void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } clientPersistant_t; typedef enum { @@ -636,74 +449,9 @@ typedef enum { } saberBlockedType_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) -class SgGClient -{ -public: - SgPlayerState ps; - SgClientPersistant pers; - SgClientSession sess; - int32_t noclip; - int32_t lastCmdTime; - SgUserCmd usercmd; - int32_t buttons; - int32_t oldbuttons; - int32_t latched_buttons; - int32_t damage_armor; - int32_t damage_blood; - int32_t damage_knockback; - SgVec3 damage_from; - int32_t damage_fromWorld; - int32_t accurateCount; - int32_t respawnTime; - int32_t inactivityTime; - int32_t inactivityWarning; - int32_t idleTime; - int32_t airOutTime; - int32_t timeResidual; - float facial_blink; - float facial_frown; - float facial_aux; - SgClientInfo clientInfo; - int8_t forced_forwardmove; - int8_t forced_rightmove; - int32_t fireDelay; - int32_t playerTeam; - int32_t enemyTeam; - int32_t squadname; - int32_t team_leader; - int32_t leader; - int32_t follower; - int32_t numFollowers; - int32_t formationGoal; - int32_t nextFormGoal; - int32_t NPC_class; - float hiddenDist; - SgVec3 hiddenDir; - SgRenderInfo renderInfo; - SgSaberTrail saberTrail; - int32_t dismembered; - int8_t dismemberProbLegs; - int8_t dismemberProbHead; - int8_t dismemberProbArms; - int8_t dismemberProbHands; - int8_t dismemberProbWaist; - int32_t standheight; - int32_t crouchheight; - int32_t poisonDamage; - int32_t poisonTime; - int32_t slopeRecalcTime; - SgVec3 pushVec; - int32_t pushVecTime; -}; // SgGClient -#pragma pack(pop) - // this structure is cleared on each ClientSpawn(), // except for 'client->pers' and 'client->sess' struct gclient_s { - using SgType = SgGClient; - - // ps MUST be the first element, because the server expects it playerState_t ps; // communicated by server to clients @@ -793,33 +541,24 @@ struct gclient_s { void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); }; #define MAX_PARMS 16 #define MAX_PARM_STRING_LENGTH MAX_QPATH//was 16, had to lengthen it so they could take a valid file path -class SgParms -{ -public: - SgArray2d parm; -}; // SgParms - typedef struct { - using SgType = SgParms; - - char parm[MAX_PARMS][MAX_PARM_STRING_LENGTH]; void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); } parms_t; #define GAME_INCLUDE @@ -838,193 +577,7 @@ typedef struct typedef struct centity_s centity_t; -#pragma pack(push, 4) -class SgGEntity -{ -public: - SgEntityState s; - int32_t client; - int32_t inuse; - int32_t linked; - int32_t svFlags; - int32_t bmodel; - SgVec3 mins; - SgVec3 maxs; - int32_t contents; - SgVec3 absmin; - SgVec3 absmax; - SgVec3 currentOrigin; - SgVec3 currentAngles; - int32_t owner; - SgCGhoul2InfoV ghoul2; - int32_t classname; - int32_t spawnflags; - int32_t flags; - int32_t model; - int32_t model2; - int32_t freetime; - int32_t eventTime; - int32_t freeAfterEvent; - int32_t unlinkAfterEvent; - float physicsBounce; - int32_t clipmask; - float speed; - SgVec3 movedir; - SgVec3 lastOrigin; - SgVec3 lastAngles; - float mass; - int32_t lastImpact; - int32_t watertype; - int32_t waterlevel; - float angle; - int32_t target; - int32_t target2; - int32_t target3; - int32_t target4; - int32_t targetname; - int32_t team; - int32_t roff; - int32_t roff_ctr; - int32_t next_roff_time; - int32_t fx_time; - int32_t nextthink; - int32_t e_ThinkFunc; - int32_t e_clThinkFunc; - int32_t e_ReachedFunc; - int32_t e_BlockedFunc; - int32_t e_TouchFunc; - int32_t e_UseFunc; - int32_t e_PainFunc; - int32_t e_DieFunc; - int32_t health; - int32_t max_health; - int32_t takedamage; - int32_t material; - int32_t damage; - int32_t dflags; - int32_t splashDamage; - int32_t splashRadius; - int32_t methodOfDeath; - int32_t splashMethodOfDeath; - SgArray locationDamage; - int32_t chain; - int32_t enemy; - int32_t activator; - int32_t teamchain; - int32_t teammaster; - int32_t lastEnemy; - float wait; - float random; - int32_t delay; - int32_t alt_fire; - int32_t count; - int32_t bounceCount; - int32_t fly_sound_debounce_time; - int32_t painDebounceTime; - int32_t disconnectDebounceTime; - int32_t attackDebounceTime; - int32_t pushDebounceTime; - int32_t aimDebounceTime; - int32_t useDebounceTime; - int32_t trigger_formation; - int32_t waypoint; - int32_t lastWaypoint; - int32_t lastValidWaypoint; - int32_t noWaypointTime; - int32_t combatPoint; - SgArray failedWaypoints; - int32_t failedWaypointCheckTime; - int32_t loopAnim; - int32_t startFrame; - int32_t endFrame; - int32_t sequencer; - int32_t taskManager; - SgArray taskID; - int32_t parms; - SgArray behaviorSet; - int32_t script_targetname; - int32_t delayScriptTime; - int32_t fullName; - int32_t soundSet; - int32_t setTime; - int32_t cameraGroup; - int32_t noDamageTeam; - int32_t playerModel; - int32_t weaponModel; - int32_t handRBolt; - int32_t handLBolt; - int32_t headBolt; - int32_t cervicalBolt; - int32_t chestBolt; - int32_t gutBolt; - int32_t torsoBolt; - int32_t crotchBolt; - int32_t motionBolt; - int32_t kneeLBolt; - int32_t kneeRBolt; - int32_t elbowLBolt; - int32_t elbowRBolt; - int32_t footLBolt; - int32_t footRBolt; - int32_t faceBone; - int32_t craniumBone; - int32_t cervicalBone; - int32_t thoracicBone; - int32_t upperLumbarBone; - int32_t lowerLumbarBone; - int32_t hipsBone; - int32_t motionBone; - int32_t rootBone; - int32_t footLBone; - int32_t footRBone; - int32_t genericBone1; - int32_t genericBone2; - int32_t genericBone3; - int32_t genericBolt1; - int32_t genericBolt2; - int32_t genericBolt3; - int32_t genericBolt4; - int32_t genericBolt5; - int32_t cinematicModel; - int32_t NPC; - int32_t ownername; - int32_t cantHitEnemyCounter; - int32_t NPC_type; - int32_t NPC_targetname; - int32_t NPC_target; - int32_t moverState; - int32_t soundPos1; - int32_t sound1to2; - int32_t sound2to1; - int32_t soundPos2; - int32_t soundLoop; - int32_t nextTrain; - int32_t prevTrain; - SgVec3 pos1; - SgVec3 pos2; - SgVec3 pos3; - int32_t sounds; - int32_t closetarget; - int32_t opentarget; - int32_t paintarget; - int32_t lockCount; - float radius; - int32_t wpIndex; - int32_t noise_index; - SgVec4 startRGBA; - SgVec4 finalRGBA; - int32_t item; - int32_t message; - float lightLevel; - int32_t forcePushTime; - int32_t forcePuller; -}; // SgGEntity -#pragma pack(pop) - struct gentity_s { - using SgType = SgGEntity; - - entityState_t s; // communicated by server to clients struct gclient_s *client; // NULL if not a player (unless it's NPC ( if (this->NPC != NULL) ) ... -slc) qboolean inuse; @@ -1324,10 +877,10 @@ Ghoul2 Insert End void sg_export( - SgType& dst) const; + ojk::ISavedGame* saved_game) const; void sg_import( - const SgType& src); + ojk::ISavedGame* saved_game); }; #endif //#ifdef GAME_INCLUDE diff --git a/codeJK2/icarus/Instance.cpp b/codeJK2/icarus/Instance.cpp index 78e4f9450c..b19ef5ba27 100644 --- a/codeJK2/icarus/Instance.cpp +++ b/codeJK2/icarus/Instance.cpp @@ -29,7 +29,6 @@ along with this program; if not, see . #include "instance.h" #include -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" // Instance diff --git a/codeJK2/icarus/Sequence.cpp b/codeJK2/icarus/Sequence.cpp index 0d6a1e88c4..bcb5eaeead 100644 --- a/codeJK2/icarus/Sequence.cpp +++ b/codeJK2/icarus/Sequence.cpp @@ -28,7 +28,6 @@ along with this program; if not, see . #include "icarus.h" #include -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" CSequence::CSequence( void ) diff --git a/codeJK2/icarus/Sequencer.cpp b/codeJK2/icarus/Sequencer.cpp index c41b06ca18..2f6f05f0f4 100644 --- a/codeJK2/icarus/Sequencer.cpp +++ b/codeJK2/icarus/Sequencer.cpp @@ -30,7 +30,6 @@ along with this program; if not, see . #include "g_shared.h" #include "assert.h" -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" // Sequencer diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index 3310505333..6ce2bf433f 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -31,7 +31,6 @@ along with this program; if not, see . #include -#include "qcommon/ojk_sg_wrappers.h" #include "qcommon/ojk_i_saved_game.h" #define ICARUS_VALIDATE(a) if ( a == false ) return TASK_FAILED; diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index 5ff9c8b47b..889c87b681 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -1,4 +1,5 @@ #include "ojk_saved_game.h" +#include #include "ojk_saved_game_exception.h" #include "qcommon/qcommon.h" #include "server/server.h" diff --git a/shared/qcommon/ojk_sg_wrappers.h b/shared/qcommon/ojk_sg_wrappers.h deleted file mode 100644 index e735487daf..0000000000 --- a/shared/qcommon/ojk_sg_wrappers.h +++ /dev/null @@ -1,2269 +0,0 @@ -// -// Saved game wrappers. -// - - -#ifndef OJK_SG_WRAPPERS_INCLUDED -#define OJK_SG_WRAPPERS_INCLUDED - - -#ifdef __cplusplus - - -#include -#include -#include -#include "ojk_sg_wrappers_shared.h" - - -namespace detail { - - -template -class SgTraits -{ -private: - using yes = std::true_type; - using no = std::false_type; - - - // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - // ReadSaveData - - template - static auto test_read_save_data(int) -> decltype( - std::declval().ReadSaveData( - static_cast(0), - static_cast(nullptr), - static_cast(0), - static_cast(nullptr) - ) == 0, - - yes() - ); - - template - static no test_read_save_data(...); - - // ReadSaveData - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - // I_ReadSaveData - - template - static auto test_i_read_save_data(int) -> decltype( - std::declval().I_ReadSaveData( - static_cast(0), - static_cast(nullptr), - static_cast(0), - static_cast(nullptr) - ) == 0, - - yes() - ); - - template - static no test_i_read_save_data(...); - - // I_ReadSaveData - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - // ReadFromSaveGame - - template - static auto test_read_from_save_game(int) -> decltype( - std::declval().ReadFromSaveGame( - static_cast(0), - static_cast(nullptr), - static_cast(0), - static_cast(nullptr) - ) == 0, - - yes() - ); - - template - static no test_read_from_save_game(...); - - // ReadFromSaveGame - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - // WriteSaveData - - template - static auto test_write_save_data(int) -> decltype( - std::declval().WriteSaveData( - static_cast(0), - static_cast(nullptr), - static_cast(0) - ) == 0, - - yes() - ); - - template - static no test_write_save_data(...); - - // WriteSaveData - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - // I_WriteSaveData - - template - static auto test_i_write_save_data(int) -> decltype( - std::declval().I_WriteSaveData( - static_cast(0), - static_cast(nullptr), - static_cast(0) - ) == 0, - - yes() - ); - - template - static no test_i_write_save_data(...); - - // I_WriteSaveData - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - // AppendToSaveGame - - template - static auto test_append_to_save_game(int) -> decltype( - std::declval().AppendToSaveGame( - static_cast(0), - static_cast(nullptr), - static_cast(0) - ) == 0, - - yes() - ); - - template - static no test_append_to_save_game(...); - - // AppendToSaveGame - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - // SG_Append - - template - static auto test_sg_append(int) -> decltype( - std::declval().SG_Append( - static_cast(0), - static_cast(nullptr), - static_cast(0) - ) == 0, - - yes() - ); - - template - static no test_sg_append(...); - - // SG_Append - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - // has_sg_export - - template - static auto test_sg_export(int) -> decltype( - std::declval().sg_export( - std::declval() - ), - - yes() - ); - - template - static no test_sg_export(...); - - // has_sg_export - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - // has_sg_import - - template - static auto test_sg_import(int) -> decltype( - std::declval().sg_import( - std::declval() - ), - - yes() - ); - - template - static no test_sg_import(...); - - // has_sg_import - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - -public: - static constexpr bool is_numeric() - { - return std::is_arithmetic::value || std::is_enum::value; - } - - static constexpr bool is_any_char() - { - return - std::is_same::value || - std::is_same::value || - std::is_same::value; - } - - static constexpr bool is_array_1d() - { - return std::is_array::value && std::rank::value == 1; - } - - static constexpr bool is_array_2d() - { - return std::is_array::value && std::rank::value == 2; - } - - static constexpr bool has_read_save_data() - { - return std::is_same(0)), yes>::value; - } - - static constexpr bool has_i_read_save_data() - { - return std::is_same(0)), yes>::value; - } - - static constexpr bool has_read_from_save_game() - { - return std::is_same(0)), yes>::value; - } - - static constexpr bool has_write_save_data() - { - return std::is_same(0)), yes>::value; - } - - static constexpr bool has_i_write_save_data() - { - return std::is_same(0)), yes>::value; - } - - static constexpr bool has_append_to_save_game() - { - return std::is_same(0)), yes>::value; - } - - static constexpr bool has_sg_append() - { - return std::is_same(0)), yes>::value; - } - - static constexpr bool has_sg_export() - { - return std::is_same(0)), yes>::value; - } - - static constexpr bool has_sg_import() - { - return std::is_same(0)), yes>::value; - } -}; // SgTraits - - -class SgVoidTag -{ -public: -}; //SgVoidTag - -class SgImportTag -{ -public: -}; //SgImportTag - -class SgExportTag -{ -public: -}; //SgExportTag - -class SgPointerTag -{ -public: -}; // SgPointerTag - -class SgArray1dTag -{ -public: -}; // SgArray1dTag - -class SgArray2dTag -{ -public: -}; // SgArray2dTag - -class SgClassTag -{ -public: -}; // SgClassTag - -class SgNumericTag -{ -public: -}; // SgNumericTag - -class SgBoolTag -{ -public: -}; // SgBoolTag - -class SgAnyCharTag -{ -public: -}; // SgAnyCharTag - -class SgFuncTag -{ -public: -}; // SgFuncTag - -class SgReadSaveDataFuncTag -{ -public: -}; // SgReadSaveDataFuncTag - -class SgIReadSaveDataFuncTag -{ -public: -}; // SgIReadSaveDataFuncTag - -class SgReadFromSaveGameFuncTag -{ -public: -}; // SgReadFromSaveGameFuncTag - -class SgSgAppendFuncTag -{ -public: -}; // SgSgAppendFuncTag - -class SgWriteSaveDataFuncTag -{ -public: -}; // SgWriteSaveDataFuncTag - -class SgIWriteSaveDataFuncTag -{ -public: -}; // SgIWriteSaveDataFuncTag - -class SgAppendToSaveGameFuncTag -{ -public: -}; // SgAppendToSaveGameFuncTag - - -} // detail - - -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// sg_get_read_func -// -// Returns a read function wrapper for a function pointer, -// pointer to an object or a reference to an object. -// - -namespace detail { - - -using SgReadFunc = std::function; - - -template -inline SgReadFunc sg_get_read_func( - TFunc& func, - SgFuncTag) -{ - return func; -} - -template -inline SgReadFunc sg_get_read_func( - TInstance* instance, - SgPointerTag, - SgReadSaveDataFuncTag) -{ - return std::bind( - &TInstance::ReadSaveData, - instance, - std::placeholders::_1, - std::placeholders::_2, - std::placeholders::_3, - std::placeholders::_4); -} - -template -inline SgReadFunc sg_get_read_func( - TInstance* instance, - SgPointerTag, - SgIReadSaveDataFuncTag) -{ - return instance->I_ReadSaveData; -} - -template -inline SgReadFunc sg_get_read_func( - TInstance* instance, - SgPointerTag, - SgReadFromSaveGameFuncTag) -{ - return instance->ReadFromSaveGame; -} - -template -inline SgReadFunc sg_get_read_func( - TInstance* instance, - SgPointerTag) -{ - using Tag = typename std::conditional< - SgTraits::has_read_save_data(), - SgReadSaveDataFuncTag, - typename std::conditional< - SgTraits::has_i_read_save_data(), - SgIReadSaveDataFuncTag, - typename std::conditional< - SgTraits::has_read_from_save_game(), - SgReadFromSaveGameFuncTag, - void - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported instance type."); - - return sg_get_read_func( - instance, - SgPointerTag(), - Tag()); -} - -template -inline SgReadFunc sg_get_read_func( - TInstance& instance, - SgClassTag) -{ - return sg_get_read_func( - &instance, - SgPointerTag()); -} - -template -inline SgReadFunc sg_get_read_func( - TInstance& instance) -{ - using Tag = typename std::conditional< - std::is_function::value, - SgFuncTag, - typename std::conditional< - std::is_class::value, - SgClassTag, - typename std::conditional< - std::is_pointer::value, - SgPointerTag, - void - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported instance type."); - - return sg_get_read_func( - instance, - Tag()); -} - - -} // detail - -// sg_get_read_func -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// sg_get_write_func -// -// Returns a write function wrapper for a function pointer, -// pointer to an object or a reference to an object. -// - -namespace detail { - - -using SgWriteFunc = std::function; - - -template -inline SgWriteFunc sg_get_write_func( - TFunc& func, - SgFuncTag) -{ - return func; -} - -template -inline SgWriteFunc sg_get_write_func( - TInstance* instance, - SgPointerTag, - SgSgAppendFuncTag) -{ - return instance->SG_Append; -} - -template -inline SgWriteFunc sg_get_write_func( - TInstance* instance, - SgPointerTag, - SgWriteSaveDataFuncTag) -{ - return std::bind( - &TInstance::WriteSaveData, - instance, - std::placeholders::_1, - std::placeholders::_2, - std::placeholders::_3); -} - -template -inline SgWriteFunc sg_get_write_func( - TInstance* instance, - SgPointerTag, - SgIWriteSaveDataFuncTag) -{ - return instance->I_WriteSaveData; -} - -template -inline SgWriteFunc sg_get_write_func( - TInstance* instance, - SgPointerTag, - SgAppendToSaveGameFuncTag) -{ - return instance->AppendToSaveGame; -} - -template -inline SgWriteFunc sg_get_write_func( - TInstance* instance, - SgPointerTag) -{ - using Tag = typename std::conditional< - SgTraits::has_sg_append(), - SgSgAppendFuncTag, - typename std::conditional< - SgTraits::has_write_save_data(), - SgWriteSaveDataFuncTag, - typename std::conditional< - SgTraits::has_i_write_save_data(), - SgIWriteSaveDataFuncTag, - typename std::conditional< - SgTraits::has_append_to_save_game(), - SgAppendToSaveGameFuncTag, - void - >::type - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported instance type."); - - return sg_get_write_func( - instance, - SgPointerTag(), - Tag()); -} - -template -inline SgWriteFunc sg_get_write_func( - TInstance& instance, - SgClassTag) -{ - return sg_get_write_func( - &instance, - SgPointerTag()); -} - -template -inline SgWriteFunc sg_get_write_func( - TInstance& instance) -{ - using Tag = typename std::conditional< - std::is_function::value, - SgFuncTag, - typename std::conditional< - std::is_class::value, - SgClassTag, - typename std::conditional< - std::is_pointer::value, - SgPointerTag, - void - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported instance type."); - - return sg_get_write_func( - instance, - Tag()); -} - - -} // detail - -// sg_get_write_func -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// sg_export -// -// Exports a value or a fixed-array of values from a -// native type to a saved game one. -// - -namespace detail { - - -template -inline void sg_export( - const TSrc& src, - TDst& dst, - SgNumericTag) -{ - dst = static_cast(src); -} - -template -inline void sg_export( - const TSrc& src, - TDst& dst, - SgPointerTag) -{ - dst = static_cast(reinterpret_cast(src)); -} - -template -inline void sg_export( - const TSrc& src, - TDst& dst, - SgClassTag) -{ - src.sg_export(dst); -} - -template -inline void sg_export( - const TSrc (&src)[TCount], - SgArray& dst, - SgArray1dTag, - SgNumericTag) -{ - std::uninitialized_copy_n( - src, - TCount, - dst.begin()); -} - -template -inline void sg_export( - const TSrc (&src)[TCount], - SgArray& dst, - SgArray1dTag, - SgPointerTag) -{ - for (decltype(TCount) i = 0; i < TCount; ++i) { - dst[i] = static_cast(reinterpret_cast(src[i])); - } -} - -template -inline void sg_export( - const TSrc (&src)[TCount], - SgArray& dst, - SgArray1dTag, - SgClassTag) -{ - for (decltype(TCount) i = 0; i < TCount; ++i) { - sg_export( - src[i], - dst[i], - SgClassTag()); - } -} - -template -inline void sg_export( - const TSrc (&src)[TCount], - SgArray& dst, - SgArray1dTag) -{ - using Tag = typename std::conditional< - SgTraits::is_numeric() && SgTraits::is_numeric(), - SgNumericTag, - typename std::conditional< - std::is_pointer::value && SgTraits::is_numeric(), - SgPointerTag, - typename std::conditional< - SgTraits::has_sg_export() && std::is_class::value, - SgClassTag, - void - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - sg_export( - src, - dst, - SgArray1dTag(), - Tag()); -} - -template -inline void sg_export( - const TSrc (&src)[TCount1][TCount2], - SgArray2d& dst, - SgArray2dTag) -{ - static_assert( - detail::SgTraits::is_numeric() && - detail::SgTraits::is_numeric(), - "Unsupported types."); - - for (decltype(TCount1) i = 0; i < TCount1; ++i) { - std::uninitialized_copy_n( - src[i], - TCount2, - dst[i].begin()); - } -} - - -} // detail - - -template -inline void sg_export( - const TSrc& src, - TDst& dst) -{ - using Tag = typename std::conditional< - detail::SgTraits::is_numeric() && - detail::SgTraits::is_numeric(), - detail::SgNumericTag, - typename std::conditional< - std::is_pointer::value && - detail::SgTraits::is_numeric(), - detail::SgPointerTag, - typename std::conditional< - detail::SgTraits::has_sg_export() && - std::is_class::value, - detail::SgClassTag, - typename std::conditional< - detail::SgTraits::is_array_1d(), - detail::SgArray1dTag, - typename std::conditional< - detail::SgTraits::is_array_2d(), - detail::SgArray2dTag, - void - >::type - >::type - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - detail::sg_export( - src, - dst, - Tag()); -} - -// sg_export -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// sg_import -// -// Imports a value or a fixed-szie array of values from a -// saved game type to a native one. -// - -namespace detail { - - -template -inline void sg_import( - const TSrc& src, - TDst& dst, - SgNumericTag, - SgNumericTag) -{ - dst = static_cast(src); -} - -template -inline void sg_import( - const TSrc& src, - TDst& dst, - SgNumericTag, - SgBoolTag) -{ - dst = (src != 0); -} - -template -inline void sg_import( - const TSrc& src, - TDst& dst, - SgNumericTag) -{ - using Tag = typename std::conditional< - std::is_same::value, - SgBoolTag, - SgNumericTag - >::type; - - sg_import( - src, - dst, - SgNumericTag(), - Tag()); -} - -template -inline void sg_import( - const TSrc& src, - TDst& dst, - SgPointerTag) -{ - dst = reinterpret_cast(static_cast(src)); -} - -template -inline void sg_import( - const TSrc& src, - TDst& dst, - SgClassTag) -{ - dst.sg_import(src); -} - -template -inline void sg_import( - const SgArray& src, - TDst (&dst)[TCount], - SgArray1dTag, - SgNumericTag) -{ - std::uninitialized_copy( - src.cbegin(), - src.cend(), - dst); -} - -template -inline void sg_import( - const SgArray& src, - TDst (&dst)[TCount], - SgArray1dTag, - SgPointerTag) -{ - for (decltype(TCount) i = 0; i < TCount; ++i) { - dst[i] = reinterpret_cast(static_cast(src[i])); - } -} - -template -inline void sg_import( - const SgArray& src, - TDst (&dst)[TCount], - SgArray1dTag, - SgClassTag) -{ - for (decltype(TCount) i = 0; i < TCount; ++i) { - sg_import( - src[i], - dst[i], - SgClassTag()); - } -} - -template -inline void sg_import( - const SgArray& src, - TDst (&dst)[TCount], - SgArray1dTag) -{ - using Tag = typename std::conditional< - SgTraits::is_numeric() && SgTraits::is_numeric(), - SgNumericTag, - typename std::conditional< - SgTraits::is_numeric() && std::is_pointer::value, - SgPointerTag, - typename std::conditional< - std::is_class::value && SgTraits::has_sg_import(), - SgClassTag, - void - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - sg_import( - src, - dst, - SgArray1dTag(), - Tag()); -} - -template -inline void sg_import( - const SgArray2d& src, - TDst (&dst)[TCount1][TCount2], - SgArray2dTag) -{ - static_assert( - SgTraits::is_numeric() && SgTraits::is_numeric(), - "Unsupported types."); - - for (decltype(TCount1) i = 0; i < TCount1; ++i) { - std::uninitialized_copy( - src[i].cbegin(), - src[i].cend(), - dst[i]); - } -} - - -} // detail - - -template -inline void sg_import( - const TSrc& src, - TDst& dst) -{ - using Tag = typename std::conditional< - detail::SgTraits::is_numeric(), - detail::SgNumericTag, - typename std::conditional< - std::is_pointer::value, - detail::SgPointerTag, - typename std::conditional< - std::is_class::value && - detail::SgTraits::has_sg_import(), - detail::SgClassTag, - typename std::conditional< - detail::SgTraits::is_array_1d(), - detail::SgArray1dTag, - typename std::conditional< - detail::SgTraits::is_array_2d(), - detail::SgArray2dTag, - void - >::type - >::type - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - detail::sg_import( - src, - dst, - Tag()); -} - -// sg_import -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// sg_read_no_cast (fixed size) -// -// Reads a value or a fixed-size array of values from a -// saved game without conversion. -// - -namespace detail { - - -template -inline int sg_read_no_cast( - SgReadFunc& read_func, - unsigned int chunk_id, - TDst& dst_value, - SgNumericTag) -{ - constexpr auto dst_size = static_cast(sizeof(TDst)); - - return read_func( - chunk_id, - &dst_value, - dst_size, - nullptr); -} - -template -inline int sg_read_no_cast( - SgReadFunc& read_func, - unsigned int chunk_id, - TDst& dst_value, - SgClassTag) -{ - using SgType = typename TDst::SgType; - - constexpr auto src_size = static_cast(sizeof(SgType)); - - auto& buffer = sg_get_buffer( - src_size); - - auto read_result = read_func( - chunk_id, - buffer.data(), - src_size, - nullptr); - - auto& src_value = *reinterpret_cast(buffer.data()); - - ::sg_import(src_value, dst_value); - - return read_result; -} - -template -inline int sg_read_no_cast( - SgReadFunc& read_func, - unsigned int chunk_id, - TDst (&dst_values)[TCount], - SgArray1dTag, - SgNumericTag) -{ - constexpr auto dst_size = static_cast(TCount * sizeof(TDst)); - - return read_func( - chunk_id, - &dst_values[0], - dst_size, - nullptr); -} - -template -inline int sg_read_no_cast( - SgReadFunc& read_func, - unsigned int chunk_id, - TDst (&dst_values)[TCount], - SgArray1dTag, - SgClassTag) -{ - using SgType = typename TDst::SgType; - - constexpr auto src_size = static_cast(TCount * sizeof(SgType)); - - auto& buffer = sg_get_buffer( - src_size); - - auto read_result = read_func( - chunk_id, - buffer.data(), - src_size, - nullptr); - - auto src_values = reinterpret_cast(buffer.data()); - - for (decltype(TCount) i = 0; i < TCount; ++i) { - ::sg_import(src_values[i], dst_values[i]); - } - - return read_result; -} - -template -inline int sg_read_no_cast( - SgReadFunc& read_func, - unsigned int chunk_id, - TDst (&dst_values)[TCount], - SgArray1dTag) -{ - using Tag = typename std::conditional< - std::is_same::value, - void, - typename std::conditional< - detail::SgTraits::is_numeric(), - detail::SgNumericTag, - typename std::conditional< - detail::SgTraits::has_sg_import(), - detail::SgClassTag, - void - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - return sg_read_no_cast( - read_func, - chunk_id, - dst_values, - SgArray1dTag(), - Tag() - ); -} - - -} // detail - - -template -inline int sg_read_no_cast( - TInstance&& instance, - unsigned int chunk_id, - TDst& dst_value) -{ - using Tag = typename std::conditional< - std::is_same::value, - void, - typename std::conditional< - detail::SgTraits::is_numeric(), - detail::SgNumericTag, - typename std::conditional< - detail::SgTraits::has_sg_import(), - detail::SgClassTag, - typename std::conditional< - detail::SgTraits::is_array_1d(), - detail::SgArray1dTag, - void - >::type - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - auto read_func = detail::sg_get_read_func( - instance); - - return detail::sg_read_no_cast( - read_func, - chunk_id, - dst_value, - Tag()); -} - -// sg_read_no_cast (fixed size) -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// sg_read_no_cast (dynamic size) -// -// Reads a specified number of values from a -// saved game without conversion. -// - -namespace detail { - - -template -inline int sg_read_no_cast( - SgReadFunc& read_func, - unsigned int chunk_id, - TDst* dst_values, - int dst_count, - SgPointerTag, - SgNumericTag) -{ - const auto dst_size = static_cast(dst_count * sizeof(TDst)); - - return read_func( - chunk_id, - dst_values, - dst_size, - nullptr); -} - -inline int sg_read_no_cast( - SgReadFunc& read_func, - unsigned int chunk_id, - void* dst_values, - int dst_count, - SgPointerTag, - SgVoidTag) -{ - return read_func( - chunk_id, - dst_values, - dst_count, - nullptr); -} - -template -inline int sg_read_no_cast( - SgReadFunc& read_func, - unsigned int chunk_id, - TDst* dst_values, - int dst_count, - SgPointerTag) -{ - using Tag = typename std::conditional< - std::is_same::value, - void, - typename std::conditional< - SgTraits::is_numeric(), - SgNumericTag, - typename std::conditional< - std::is_same::value, - SgVoidTag, - void - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - return sg_read_no_cast( - read_func, - chunk_id, - dst_values, - dst_count, - SgPointerTag(), - Tag()); -} - -template -inline int sg_read_no_cast( - SgReadFunc& read_func, - unsigned int chunk_id, - TDst (&dst_values)[TCount], - int dst_count, - SgArray1dTag) -{ - if (dst_count > TCount) { - throw SgException("Read overflow."); - } - - return sg_read_no_cast( - read_func, - chunk_id, - &dst_values[0], - dst_count, - SgPointerTag()); -} - - -} // detail - - -template -inline int sg_read_no_cast( - TInstance&& instance, - unsigned int chunk_id, - TDst& dst_value, - int dst_count) -{ - using Tag = typename std::conditional< - std::is_same::value, - void, - typename std::conditional< - std::is_pointer::value, - detail::SgPointerTag, - typename std::conditional< - detail::SgTraits::is_array_1d(), - detail::SgArray1dTag, - void - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - - auto read_func = detail::sg_get_read_func( - instance); - - return detail::sg_read_no_cast( - read_func, - chunk_id, - dst_value, - dst_count, - Tag()); -} - -// sg_read_no_cast (dynamic size) -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// sg_read (fixed size) -// -// Reads a value or a fixed-array of values from a -// saved game with conversion. -// - -namespace detail { - - -template -inline int sg_read( - SgReadFunc& read_func, - unsigned int chunk_id, - TDst& dst_value, - SgBoolTag) -{ - TSrc src_value; - constexpr auto src_size = static_cast(sizeof(TSrc)); - - auto read_result = read_func( - chunk_id, - &src_value, - src_size, - nullptr); - - dst_value = (src_value != 0); - - return read_result; -} - -template -inline int sg_read( - SgReadFunc& read_func, - unsigned int chunk_id, - TDst& dst_value, - SgNumericTag) -{ - TSrc src_value; - constexpr auto src_size = static_cast(sizeof(TSrc)); - - auto read_result = read_func( - chunk_id, - &src_value, - src_size, - nullptr); - - dst_value = static_cast(src_value); - - return read_result; -} - -template -inline int sg_read( - SgReadFunc& read_func, - unsigned int chunk_id, - TDst& dst_value, - SgPointerTag) -{ - TSrc src_value; - constexpr auto src_size = static_cast(sizeof(TSrc)); - - auto read_result = read_func( - chunk_id, - &src_value, - src_size, - nullptr); - - dst_value = reinterpret_cast(static_cast(src_value)); - - return read_result; -} - -template -inline int sg_read( - SgReadFunc& read_func, - unsigned int chunk_id, - TDst (&dst_values)[TCount], - SgArray1dTag, - SgNumericTag) -{ - constexpr auto src_size = static_cast(TCount * sizeof(TSrc)); - - auto& src_buffer = sg_get_buffer( - src_size); - - auto read_result = read_func( - chunk_id, - src_buffer.data(), - src_size, - nullptr); - - auto src_values = reinterpret_cast(src_buffer.data()); - - std::uninitialized_copy_n( - src_values, - TCount, - dst_values); - - return read_result; -} - -template -inline int sg_read( - SgReadFunc& read_func, - unsigned int chunk_id, - TDst (&dst_values)[TCount], - SgArray1dTag) -{ - using Tag = typename std::conditional< - std::is_same::value || std::is_same::value, - void, - typename std::conditional< - SgTraits::is_numeric() && SgTraits::is_numeric(), - SgNumericTag, - void - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - return sg_read( - read_func, - chunk_id, - dst_values, - SgArray1dTag(), - Tag()); -} - - -} // detail - - -template -inline int sg_read( - TInstance&& instance, - unsigned int chunk_id, - TDst& dst_value) -{ - using Tag = typename std::conditional< - detail::SgTraits::is_numeric() && - std::is_same::value, - detail::SgBoolTag, - typename std::conditional< - detail::SgTraits::is_numeric() && - detail::SgTraits::is_numeric(), - detail::SgNumericTag, - typename std::conditional< - detail::SgTraits::is_numeric() && - std::is_pointer::value, - detail::SgPointerTag, - typename std::conditional< - detail::SgTraits::is_array_1d(), - detail::SgArray1dTag, - void - >::type - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - auto read_func = detail::sg_get_read_func( - instance); - - return detail::sg_read( - read_func, - chunk_id, - dst_value, - Tag()); -} - -// sg_read (fixed size) -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// sg_read (dynamic size) -// -// Reads a spesified number of values from a -// saved game with conversion. -// - -namespace detail { - - -template -inline int sg_read( - SgReadFunc& read_func, - unsigned int chunk_id, - TDst* dst_values, - int dst_count, - SgPointerTag) -{ - if (!dst_values) { - throw SgException("Null pointer."); - } - - const auto src_size = static_cast(dst_count * sizeof(TSrc)); - - auto& buffer = sg_get_buffer( - src_size); - - auto read_result = read_func( - chunk_id, - buffer.data(), - src_size, - nullptr); - - auto src_values = reinterpret_cast(buffer.data()); - - std::uninitialized_copy_n( - src_values, - dst_count, - dst_values); - - return read_result; -} - -template -inline int sg_read( - SgReadFunc& read_func, - unsigned int chunk_id, - TDst (&dst_values)[TCount], - int dst_count, - SgArray1dTag) -{ - return sg_read( - read_func, - chunk_id, - &dst_values[0], - dst_count, - SgPointerTag()); -} - - -} // detail - - -template -inline int sg_read( - TInstance&& instance, - unsigned int chunk_id, - TDst& dst_value, - int dst_count) -{ - using Tag = typename std::conditional< - detail::SgTraits::is_numeric() && - std::is_pointer::value, - detail::SgPointerTag, - typename std::conditional< - detail::SgTraits::is_array_1d(), - detail::SgArray1dTag, - void - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - if (dst_count < 0) { - throw SgException("Negative count."); - } - - auto read_func = detail::sg_get_read_func( - instance); - - return detail::sg_read( - read_func, - chunk_id, - dst_value, - dst_count, - Tag()); -} - -// sg_read (dynamic size) -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// sg_read_skip -// -// Skips a specified number of bytes in a saved game. -// - -template -inline int sg_read_skip( - TInstance&& instance, - unsigned int chunk_id, - int count) -{ - if (count < 0) { - throw SgException("Negative count."); - } - - auto read_func = detail::sg_get_read_func( - instance); - - return read_func( - chunk_id, - nullptr, - count, - nullptr); -} - -template -inline int sg_read_skip( - TInstance&& instance, - unsigned int chunk_id) -{ - constexpr auto skip_size = static_cast(sizeof(TSkip)); - - return sg_read_skip( - instance, - chunk_id, - skip_size); -} - -// sg_read_skip -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - -// Reads a data from a saved game into an automatically allocated block. -template -inline int sg_read_allocate( - TInstance&& instance, - unsigned int chunk_id, - TValue*& value) -{ - auto read_func = detail::sg_get_read_func( - instance); - - void* void_ptr = nullptr; - - auto read_result = read_func( - chunk_id, - nullptr, - 0, - &void_ptr); - - value = static_cast(void_ptr); - - return read_result; -} - - -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// sg_write_no_cast (fixed size) -// -// Writes a value or a fixed-size array of values into a -// saved game without conversion. -// - -namespace detail { - - -template -inline int sg_write_no_cast( - SgWriteFunc& write_func, - unsigned int chunk_id, - const TSrc& src_value, - SgNumericTag) -{ - constexpr auto src_size = static_cast(sizeof(TSrc)); - - return write_func( - chunk_id, - const_cast(&src_value), - src_size); -} - -template -inline int sg_write_no_cast( - SgWriteFunc& write_func, - unsigned int chunk_id, - const TSrc& src_value, - SgClassTag) -{ - using SgType = typename TSrc::SgType; - - constexpr auto dst_size = static_cast(sizeof(SgType)); - - auto& dst_buffer = sg_get_buffer( - dst_size); - - auto& dst_value = *reinterpret_cast(dst_buffer.data()); - - ::sg_export(src_value, dst_value); - - return write_func( - chunk_id, - &dst_value, - dst_size); -} - -template -inline int sg_write_no_cast( - SgWriteFunc& write_func, - unsigned int chunk_id, - const TSrc (&src_values)[TCount], - SgArray1dTag, - SgNumericTag) -{ - constexpr auto src_size = static_cast(TCount * sizeof(TSrc)); - - return write_func( - chunk_id, - const_cast(&src_values[0]), - src_size); -} - -template -inline int sg_write_no_cast( - SgWriteFunc& write_func, - unsigned int chunk_id, - const TSrc (&src_values)[TCount], - SgArray1dTag, - SgClassTag) -{ - using SgType = typename TSrc::SgType; - - constexpr auto dst_size = static_cast(TCount * sizeof(SgType)); - - auto& dst_buffer = sg_get_buffer( - dst_size); - - auto dst_values = reinterpret_cast(dst_buffer.data()); - - for (decltype(TCount) i = 0; i < TCount; ++i) { - ::sg_export(src_values[i], dst_values[i]); - } - - return write_func( - chunk_id, - dst_values, - dst_size); -} - -template -inline int sg_write_no_cast( - SgWriteFunc& write_func, - unsigned int chunk_id, - const TSrc (&src_values)[TCount], - SgArray1dTag) -{ - using Tag = typename std::conditional< - std::is_same::value, - void, - typename std::conditional< - detail::SgTraits::is_numeric(), - detail::SgNumericTag, - typename std::conditional< - detail::SgTraits::has_sg_export(), - detail::SgClassTag, - void - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - return sg_write_no_cast( - write_func, - chunk_id, - src_values, - SgArray1dTag(), - Tag() - ); -} - - -} // detail - - -template -inline int sg_write_no_cast( - TInstance&& instance, - unsigned int chunk_id, - const TSrc& src_value) -{ - using Tag = typename std::conditional< - std::is_same::value, - void, - typename std::conditional< - detail::SgTraits::is_numeric(), - detail::SgNumericTag, - typename std::conditional< - detail::SgTraits::has_sg_export(), - detail::SgClassTag, - typename std::conditional< - detail::SgTraits::is_array_1d(), - detail::SgArray1dTag, - void - >::type - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - auto write_func = detail::sg_get_write_func( - instance); - - return detail::sg_write_no_cast( - write_func, - chunk_id, - src_value, - Tag()); -} - -// sg_write_no_cast (fixed size) -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// sg_write_no_cast (dynamic size) -// -// Writes a specified number of values into a -// saved game without conversion. -// - -namespace detail { - - -template -inline int sg_write_no_cast( - SgWriteFunc& write_func, - unsigned int chunk_id, - const TSrc* src_values, - int src_count, - SgPointerTag, - SgVoidTag) -{ - return write_func( - chunk_id, - const_cast(src_values), - src_count); -} - -template -inline int sg_write_no_cast( - SgWriteFunc& write_func, - unsigned int chunk_id, - const TSrc* src_values, - int src_count, - SgPointerTag, - SgNumericTag) -{ - const auto src_size = static_cast(src_count * sizeof(TSrc)); - - return write_func( - chunk_id, - const_cast(src_values), - src_size); -} - -template -inline int sg_write_no_cast( - SgWriteFunc& write_func, - unsigned int chunk_id, - const TSrc* src_values, - int src_count, - SgPointerTag) -{ - using Tag = typename std::conditional< - std::is_same::value, - void, - typename std::conditional< - SgTraits::is_numeric(), - SgNumericTag, - typename std::conditional< - std::is_same::value, - SgVoidTag, - void - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - if (!src_values) { - throw SgException("Null pointer."); - } - - return sg_write_no_cast( - write_func, - chunk_id, - src_values, - src_count, - SgPointerTag(), - Tag()); -} - -template -inline int sg_write_no_cast( - SgWriteFunc& write_func, - unsigned int chunk_id, - const TSrc (&src_values)[TCount], - int src_count, - SgArray1dTag) -{ - if (src_count > TCount) { - throw SgException("Write overflow."); - } - - return sg_write_no_cast( - write_func, - chunk_id, - &src_values[0], - src_count, - SgPointerTag()); -} - - -} // detail - - -template -inline int sg_write_no_cast( - TInstance&& instance, - unsigned int chunk_id, - TSrc&& src_value, - int src_count) -{ - using TSrcTag = typename std::remove_reference::type; - - using Tag = typename std::conditional< - std::is_same::value, - void, - typename std::conditional< - std::is_pointer::value, - detail::SgPointerTag, - typename std::conditional< - detail::SgTraits::is_array_1d(), - detail::SgArray1dTag, - void - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - - auto write_func = detail::sg_get_write_func( - instance); - - return detail::sg_write_no_cast( - write_func, - chunk_id, - src_value, - src_count, - Tag()); -} - -// sg_write_no_cast (dynamic size) -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// sg_write (fixed size) -// -// Writes a value or a fixed-array of values into a -// saved game with conversion. -// - -namespace detail { - - -template -inline int sg_write( - SgWriteFunc& write_func, - unsigned int chunk_id, - const TSrc& src_value, - SgNumericTag) -{ - auto dst_value = static_cast(src_value); - constexpr auto dst_size = static_cast(sizeof(TDst)); - - return write_func( - chunk_id, - &dst_value, - dst_size); -} - -template -inline int sg_write( - SgWriteFunc& write_func, - unsigned int chunk_id, - const TSrc& src_value, - SgPointerTag) -{ - auto dst_value = static_cast(reinterpret_cast(src_value)); - - constexpr auto dst_size = static_cast(sizeof(TDst)); - - return write_func( - chunk_id, - &dst_value, - dst_size); -} - -template -inline int sg_write( - SgWriteFunc& write_func, - unsigned int chunk_id, - const TSrc (&src_values)[TCount], - SgArray1dTag, - SgNumericTag) -{ - constexpr auto dst_size = static_cast(TCount * sizeof(TDst)); - - auto& dst_buffer = sg_get_buffer( - dst_size); - - auto dst_values = reinterpret_cast(dst_buffer.data()); - - std::uninitialized_copy_n( - src_values, - TCount, - dst_values); - - return write_func( - chunk_id, - dst_values, - dst_size); -} - -template -inline int sg_write( - SgWriteFunc& write_func, - unsigned int chunk_id, - const TSrc (&src_values)[TCount], - SgArray1dTag) -{ - using Tag = typename std::conditional< - SgTraits::is_numeric() && SgTraits::is_numeric(), - SgNumericTag, - void - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - return sg_write( - write_func, - chunk_id, - src_values, - SgArray1dTag(), - Tag()); -} - - -} // detail - - -template -inline int sg_write( - TInstance&& instance, - unsigned int chunk_id, - const TSrc& src_value) -{ - using Tag = typename std::conditional< - detail::SgTraits::is_numeric() && - detail::SgTraits::is_numeric(), - detail::SgNumericTag, - typename std::conditional< - std::is_pointer::value && - detail::SgTraits::is_numeric(), - detail::SgPointerTag, - typename std::conditional< - detail::SgTraits::is_array_1d(), - detail::SgArray1dTag, - void - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - auto write_func = detail::sg_get_write_func( - instance); - - return detail::sg_write( - write_func, - chunk_id, - src_value, - Tag()); -} - -// sg_write (fixed size) -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// sg_write (dynamic size) -// -// Reads a spesified number of values from a -// saved game with conversion. -// - -namespace detail { - - -template -inline int sg_write( - SgWriteFunc& write_func, - unsigned int chunk_id, - const TSrc* src_values, - int src_count, - SgPointerTag) -{ - if (!src_values) { - throw SgException("Null pointer."); - } - - const auto dst_size = static_cast(src_count * sizeof(TDst)); - - auto& dst_buffer = sg_get_buffer( - dst_size); - - auto dst_values = reinterpret_cast(dst_buffer.data()); - - std::uninitialized_copy_n( - src_values, - src_count, - dst_values); - - return write_func( - chunk_id, - dst_values, - dst_size); -} - -template -inline int sg_write( - SgWriteFunc& write_func, - unsigned int chunk_id, - const TSrc (&src_values)[TCount], - int src_count, - SgArray1dTag) -{ - return sg_write( - write_func, - chunk_id, - &src_values[0], - src_count, - SgPointerTag()); -} - - -} // detail - - -template -inline int sg_write( - TInstance&& instance, - unsigned int chunk_id, - const TSrc& src_value, - int src_count) -{ - using Tag = typename std::conditional< - std::is_pointer::value && - detail::SgTraits::is_numeric(), - detail::SgPointerTag, - typename std::conditional< - detail::SgTraits::is_array_1d(), - detail::SgArray1dTag, - void - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported types."); - - if (src_count < 0) { - throw SgException("Negative count."); - } - - auto write_func = detail::sg_get_write_func( - instance); - - return detail::sg_write( - write_func, - chunk_id, - src_value, - src_count, - Tag()); -} - -// sg_write (dynamic size) -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - -#endif // __cplusplus - - -#endif // OJK_SG_WRAPPERS_INCLUDED diff --git a/shared/qcommon/ojk_sg_wrappers_fwd.h b/shared/qcommon/ojk_sg_wrappers_fwd.h deleted file mode 100644 index 04e387648c..0000000000 --- a/shared/qcommon/ojk_sg_wrappers_fwd.h +++ /dev/null @@ -1,122 +0,0 @@ -// -// Forward declarartions of saved game wrappers. -// - - -#ifndef OJK_SG_WRAPPERS_FWD_INCLUDED -#define OJK_SG_WRAPPERS_FWD_INCLUDED - - -#include "ojk_sg_wrappers_shared.h" - - -#ifdef __cplusplus - - -// Exports a value or a fixed-array of values from a -// native type to a saved game one. -template -void sg_export( - const TSrc& src, - TDst& dst); - -// Imports a value or a fixed-szie array of values from a -// saved game type to a native one. -template -void sg_import( - const TSrc& src, - TDst& dst); - -// Reads a value or a fixed-size array of values from a -// saved game without conversion. -template -int sg_read_no_cast( - TInstance&& instance, - unsigned int chunk_id, - TDst& dst_value); - -// Reads a specified number of values from a -// saved game without conversion. -template -int sg_read_no_cast( - TInstance&& instance, - unsigned int chunk_id, - TDst& dst_value, - int dst_count); - -// Reads a value or a fixed-array of values from a -// saved game with conversion. -template -int sg_read( - TInstance&& instance, - unsigned int chunk_id, - TDst& dst_value); - -// Reads a spesified number of values from a -// saved game with conversion. -template -int sg_read( - TInstance&& instance, - unsigned int chunk_id, - TDst& dst_value, - int dst_count); - -// Skips a specified number of bytes in a saved game. -template -int sg_read_skip( - TInstance&& instance, - unsigned int chunk_id, - int count); - -// Skips a specified number (by a type size) of bytes in a saved game. -template -int sg_read_skip( - TInstance&& instance, - unsigned int chunk_id); - -// Reads a data from a saved game into an automatically allocated block. -template -int sg_read_allocate( - TInstance&& instance, - unsigned int chunk_id, - TValue*& value); - -// Writes a value or a fixed-size array of values into a -// saved game without conversion. -template -int sg_write_no_cast( - TInstance&& instance, - unsigned int chunk_id, - const TSrc& src_value); - -// Writes a specified number of values into a -// saved game without conversion. -template -int sg_write_no_cast( - TInstance&& instance, - unsigned int chunk_id, - TSrc&& src_value, - int src_count); - -// Writes a value or a fixed-array of values into a -// saved game with conversion. -template -int sg_write( - TInstance&& instance, - unsigned int chunk_id, - const TSrc& src_value); - -// Reads a spesified number of values from a -// saved game with conversion. -template -int sg_write( - TInstance&& instance, - unsigned int chunk_id, - const TSrc& src_value, - int src_count); - - -#endif // __cplusplus - - -#endif // OJK_SG_WRAPPERS_FWD_INCLUDED diff --git a/shared/qcommon/ojk_sg_wrappers_shared.h b/shared/qcommon/ojk_sg_wrappers_shared.h deleted file mode 100644 index 195fc3cf0d..0000000000 --- a/shared/qcommon/ojk_sg_wrappers_shared.h +++ /dev/null @@ -1,65 +0,0 @@ -// -// Shared staff of saved game wrappers. -// - - -#ifndef OJK_SG_WRAPPERS_SHARED_INCLUDED -#define OJK_SG_WRAPPERS_SHARED_INCLUDED - - -#ifdef __cplusplus - - -#include -#include -#include -#include - - -template -using SgArray = std::array; - -template -using SgArray2d = SgArray, TCount1>; - -using SgVec3 = SgArray; -using SgVec4 = SgArray; - -using SgBuffer = std::vector; - - -class SgException : - public std::runtime_error -{ -public: - explicit SgException( - const std::string& what_arg) : - std::runtime_error(what_arg) - { - } - - explicit SgException( - const char* what_arg) : - std::runtime_error(what_arg) - { - } - - virtual ~SgException() - { - } -}; // SgException - - -inline SgBuffer& sg_get_buffer( - int new_size) -{ - static SgBuffer buffer; - buffer.resize(new_size); - return buffer; -} - - -#endif // __cplusplus - - -#endif // OJK_SG_WRAPPERS_SHARED_INCLUDED From 6a7359ccd4e685a1f1c14a006e9033bba5a514e9 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Fri, 15 Jul 2016 21:52:22 +0300 Subject: [PATCH 251/445] Format saved game code --- shared/qcommon/ojk_exception.cpp | 3 +- shared/qcommon/ojk_exception.h | 3 +- shared/qcommon/ojk_i_saved_game.h | 9 +- shared/qcommon/ojk_i_saved_game_fwd.h | 3 +- shared/qcommon/ojk_saved_game.cpp | 154 +++++++++++++------- shared/qcommon/ojk_saved_game.h | 3 +- shared/qcommon/ojk_saved_game_exception.cpp | 3 +- shared/qcommon/ojk_saved_game_exception.h | 3 +- 8 files changed, 119 insertions(+), 62 deletions(-) diff --git a/shared/qcommon/ojk_exception.cpp b/shared/qcommon/ojk_exception.cpp index 82e4bc14ae..00b6e61999 100644 --- a/shared/qcommon/ojk_exception.cpp +++ b/shared/qcommon/ojk_exception.cpp @@ -6,7 +6,8 @@ #include "ojk_exception.h" -namespace ojk { +namespace ojk +{ Exception::Exception( diff --git a/shared/qcommon/ojk_exception.h b/shared/qcommon/ojk_exception.h index 8e4704ea05..bc763ac8a0 100644 --- a/shared/qcommon/ojk_exception.h +++ b/shared/qcommon/ojk_exception.h @@ -11,7 +11,8 @@ #include -namespace ojk { +namespace ojk +{ class Exception : diff --git a/shared/qcommon/ojk_i_saved_game.h b/shared/qcommon/ojk_i_saved_game.h index 79b7e5fd3f..542c89a40f 100644 --- a/shared/qcommon/ojk_i_saved_game.h +++ b/shared/qcommon/ojk_i_saved_game.h @@ -261,7 +261,8 @@ void ISavedGame::read( using Src = typename std::conditional< std::is_same::value, TDst, - TSrc>::type; + TSrc + >::type; constexpr auto is_src_pure_numeric = std::is_arithmetic::value && @@ -337,7 +338,8 @@ void ISavedGame::read( >::type >::type; - for (int i = 0; i < dst_count; ++i) { + for (int i = 0; i < dst_count; ++i) + { read( dst_values[i], Tag()); @@ -549,7 +551,8 @@ void ISavedGame::write( >::type >::type; - for (int i = 0; i < src_count; ++i) { + for (int i = 0; i < src_count; ++i) + { write( src_values[i], Tag()); diff --git a/shared/qcommon/ojk_i_saved_game_fwd.h b/shared/qcommon/ojk_i_saved_game_fwd.h index 818ce7d1c5..141d8bbf30 100644 --- a/shared/qcommon/ojk_i_saved_game_fwd.h +++ b/shared/qcommon/ojk_i_saved_game_fwd.h @@ -13,7 +13,8 @@ #include -namespace ojk { +namespace ojk +{ class ISavedGame diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index 889c87b681..be098f8d9a 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -5,7 +5,8 @@ #include "server/server.h" -namespace ojk { +namespace ojk +{ SavedGame::SavedGame() : @@ -36,13 +37,15 @@ bool SavedGame::open( auto is_succeed = true; - if (is_succeed) { + if (is_succeed) + { ::FS_FOpenFileRead( file_path.c_str(), &file_handle_, qtrue); - if (file_handle_ == 0) { + if (file_handle_ == 0) + { is_succeed = false; auto error_message = get_failed_to_open_message( @@ -55,18 +58,21 @@ bool SavedGame::open( } } - if (is_succeed) { + if (is_succeed) + { is_readable_ = true; } int sg_version = -1; - if (is_succeed) { + if (is_succeed) + { static_cast(read_chunk( INT_ID('_', 'V', 'E', 'R'), sg_version)); - if (sg_version != iSAVEGAME_VERSION) { + if (sg_version != iSAVEGAME_VERSION) + { is_succeed = false; ::Com_Printf( @@ -77,7 +83,8 @@ bool SavedGame::open( } } - if (!is_succeed) { + if (!is_succeed) + { close(); } @@ -99,7 +106,8 @@ bool SavedGame::create( file_handle_ = ::FS_FOpenFileWrite( path.c_str()); - if (file_handle_ == 0) { + if (file_handle_ == 0) + { auto error_message = get_failed_to_open_message( path, false); @@ -125,7 +133,8 @@ bool SavedGame::create( void SavedGame::close() { - if (file_handle_ != 0) { + if (file_handle_ != 0) + { ::FS_FCloseFile(file_handle_); file_handle_ = 0; } @@ -176,16 +185,20 @@ bool SavedGame::read_chunk( auto bBlockIsCompressed = (static_cast(uiLoadedLength) < 0); - if (bBlockIsCompressed) { + if (bBlockIsCompressed) + { uiLoadedLength = -static_cast(uiLoadedLength); } // Make sure we are loading the correct chunk... // - if (ulLoadedChid != chunk_id) { - auto loaded_chunk_id_string = get_chunk_id_string(ulLoadedChid); + if (ulLoadedChid != chunk_id) + { + auto loaded_chunk_id_string = get_chunk_id_string( + ulLoadedChid); - if (!is_preview_mode_) { + if (!is_preview_mode_) + { ::Com_Error( ERR_DROP, "Loaded chunk ID (%s) does not match requested chunk ID (%s)", @@ -200,7 +213,8 @@ bool SavedGame::read_chunk( // uint32_t uiCompressedLength = 0; - if (bBlockIsCompressed) { + if (bBlockIsCompressed) + { uiLoaded += ::FS_Read( &uiCompressedLength, static_cast(sizeof(uiCompressedLength)), @@ -220,7 +234,9 @@ bool SavedGame::read_chunk( decompress( rle_buffer_, io_buffer_); - } else { + } + else + { io_buffer_.resize( uiLoadedLength); @@ -245,8 +261,10 @@ bool SavedGame::read_chunk( io_buffer_.data(), static_cast(io_buffer_.size())); - if (uiLoadedCksum != uiCksum) { - if (!is_preview_mode_) { + if (uiLoadedCksum != uiCksum) + { + if (!is_preview_mode_) + { ::Com_Error( ERR_DROP, "Failed checksum check for chunk", @@ -258,13 +276,14 @@ bool SavedGame::read_chunk( // Make sure we didn't encounter any read errors... if (uiLoaded != - sizeof(ulLoadedChid) + - sizeof(uiLoadedLength) + - sizeof(uiLoadedCksum) + - (bBlockIsCompressed ? sizeof(uiCompressedLength) : 0) + - (bBlockIsCompressed ? uiCompressedLength : io_buffer_.size())) + sizeof(ulLoadedChid) + + sizeof(uiLoadedLength) + + sizeof(uiLoadedCksum) + + (bBlockIsCompressed ? sizeof(uiCompressedLength) : 0) + + (bBlockIsCompressed ? uiCompressedLength : io_buffer_.size())) { - if (!is_preview_mode_) { + if (!is_preview_mode_) + { ::Com_Error( ERR_DROP, "Error during loading chunk %s", @@ -287,7 +306,8 @@ bool SavedGame::write_chunk( "Attempting write of chunk %s\n", chunk_id_string.c_str()); - if (::sv_testsave->integer != 0) { + if (::sv_testsave->integer != 0) + { return true; } @@ -304,19 +324,24 @@ bool SavedGame::write_chunk( int iCompressedLength = 0; - if (::sv_compress_saved_games->integer == 0) { + if (::sv_compress_saved_games->integer == 0) + { iCompressedLength = -1; - } else { + } + else + { compress( io_buffer_, rle_buffer_); - if (rle_buffer_.size() < io_buffer_.size()) { + if (rle_buffer_.size() < io_buffer_.size()) + { iCompressedLength = static_cast(rle_buffer_.size()); } } - if (iCompressedLength >= 0) { + if (iCompressedLength >= 0) + { auto iLength = -static_cast(io_buffer_.size()); uiSaved += ::FS_Write( @@ -354,7 +379,9 @@ bool SavedGame::write_chunk( return false; } - } else { + } + else + { auto iLength = static_cast(io_buffer_.size()); uiSaved += ::FS_Write( @@ -395,26 +422,31 @@ void SavedGame::raw_read( void* dst_data, int dst_size) { - if (!dst_data) { + if (!dst_data) + { throw_error( "Null pointer."); } - if (dst_size < 0) { + if (dst_size < 0) + { throw_error( "Negative size."); } - if (!is_readable_) { + if (!is_readable_) + { throw_error( "Not readable."); } - if (dst_size == 0) { + if (dst_size == 0) + { return; } - if ((io_buffer_offset_ + dst_size) > io_buffer_.size()) { + if ((io_buffer_offset_ + dst_size) > io_buffer_.size()) + { throw_error( "Not enough data."); } @@ -431,22 +463,26 @@ void SavedGame::raw_write( const void* src_data, int src_size) { - if (!src_data) { + if (!src_data) + { throw_error( "Null pointer."); } - if (src_size < 0) { + if (src_size < 0) + { throw_error( "Negative size."); } - if (!is_writable_) { + if (!is_writable_) + { throw_error( "Not writable."); } - if (src_size == 0) { + if (src_size == 0) + { return; } @@ -482,7 +518,8 @@ void SavedGame::rename( old_path.c_str(), new_path.c_str()); - if (rename_result != 0) { + if (rename_result != 0) + { ::Com_Printf( S_COLOR_RED "Error during savegame-rename. Check \"%s\" for write-protect or disk full!\n", new_path.c_str()); @@ -530,7 +567,8 @@ void SavedGame::compress( int src_count = 0; int dst_index = 0; - while (src_count < src_size) { + while (src_count < src_size) + { auto src_index = src_count; auto b = src_buffer[src_index++]; @@ -541,7 +579,8 @@ void SavedGame::compress( src_index += 1; } - if ((src_index - src_count) == 1) { + if ((src_index - src_count) == 1) + { while (src_index < src_size && (src_index - src_count) < 127 && ( src_buffer[src_index] != src_buffer[src_index - 1] || ( @@ -560,10 +599,13 @@ void SavedGame::compress( dst_buffer[dst_index++] = static_cast(src_count - src_index); - for (auto i = src_count; i < src_index; ++i) { + for (auto i = src_count; i < src_index; ++i) + { dst_buffer[dst_index++] = src_buffer[i]; } - } else { + } + else + { dst_buffer[dst_index++] = static_cast(src_index - src_count); @@ -586,16 +628,21 @@ void SavedGame::decompress( auto remain_size = static_cast(dst_buffer.size()); - while (remain_size > 0) { + while (remain_size > 0) + { auto count = static_cast(src_buffer[src_index++]); - if (count > 0) { + if (count > 0) + { std::uninitialized_fill_n( &dst_buffer[dst_index], count, src_buffer[src_index++]); - } else { - if (count < 0) { + } + else + { + if (count < 0) + { count = -count; std::uninitialized_copy_n( @@ -637,13 +684,13 @@ std::string SavedGame::get_failed_to_open_message( auto message_id = is_open ? #if JK2_MODE - "MENUS3_FAILED_TO_OPEN_SAVEGAME" : - "MENUS3_FAILED_TO_CREATE_SAVEGAME" + "MENUS3_FAILED_TO_OPEN_SAVEGAME" : + "MENUS3_FAILED_TO_CREATE_SAVEGAME" #else - "MENUS_FAILED_TO_OPEN_SAVEGAME" : - "MENUS3_FAILED_TO_CREATE_SAVEGAME" + "MENUS_FAILED_TO_OPEN_SAVEGAME" : + "MENUS3_FAILED_TO_CREATE_SAVEGAME" #endif - ; + ; std::string result( S_COLOR_RED); @@ -652,7 +699,8 @@ std::string SavedGame::get_failed_to_open_message( ::SE_GetString(message_id), file_name.c_str()); - if (result.length() > max_length) { + if (result.length() > max_length) + { result.resize(max_length); } diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game.h index c9085e16ec..6bb31e86c9 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game.h @@ -14,7 +14,8 @@ #include "ojk_i_saved_game.h" -namespace ojk { +namespace ojk +{ class SavedGame : diff --git a/shared/qcommon/ojk_saved_game_exception.cpp b/shared/qcommon/ojk_saved_game_exception.cpp index 6f9318696e..06225e9e34 100644 --- a/shared/qcommon/ojk_saved_game_exception.cpp +++ b/shared/qcommon/ojk_saved_game_exception.cpp @@ -6,7 +6,8 @@ #include "ojk_saved_game_exception.h" -namespace ojk { +namespace ojk +{ SavedGameException::SavedGameException( diff --git a/shared/qcommon/ojk_saved_game_exception.h b/shared/qcommon/ojk_saved_game_exception.h index 45c67081d0..10f73e96c4 100644 --- a/shared/qcommon/ojk_saved_game_exception.h +++ b/shared/qcommon/ojk_saved_game_exception.h @@ -10,7 +10,8 @@ #include "ojk_exception.h" -namespace ojk { +namespace ojk +{ class SavedGameException : From 1022a86791abef89e8c0bc820094bc9b10f26718 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 16 Jul 2016 14:13:18 +0300 Subject: [PATCH 252/445] Implement handling of class type --- shared/qcommon/ojk_i_saved_game.h | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/shared/qcommon/ojk_i_saved_game.h b/shared/qcommon/ojk_i_saved_game.h index 542c89a40f..04b5353e0e 100644 --- a/shared/qcommon/ojk_i_saved_game.h +++ b/shared/qcommon/ojk_i_saved_game.h @@ -214,8 +214,12 @@ void ISavedGame::read( TDst& dst_value, ClassTag) { - throw - "Not implemented."; + static_assert( + std::is_same::value, + "Unsupported types."); + + dst_value.sg_import( + this); } template @@ -428,8 +432,12 @@ void ISavedGame::write( const TSrc& src_value, ClassTag) { - throw - "Not implemented."; + static_assert( + std::is_same::value, + "Unsupported types."); + + src_value.sg_export( + this); } template From 54412cde0e6c71fc24505be969a5b7f3e7c26d09 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 16 Jul 2016 16:14:16 +0300 Subject: [PATCH 253/445] Remove wrappers and original code leftovers --- code/CMakeLists.txt | 5 +- code/client/cl_main.cpp | 1 - code/game/CMakeLists.txt | 3 + code/game/Q3_Interface.cpp | 10 --- code/game/Q3_Interface.h | 2 - code/game/g_public.h | 5 -- code/game/g_shared.cpp | 21 +---- code/game/g_shared.h | 1 - code/icarus/IcarusInterface.h | 2 - code/rd-common/tr_public.h | 2 - code/server/sv_game.cpp | 4 - code/server/sv_savegame.cpp | 137 ++++++++++++++++++++++-------- codeJK2/game/CMakeLists.txt | 4 + codeJK2/game/g_shared.cpp | 13 --- shared/qcommon/ojk_saved_game.cpp | 5 ++ shared/qcommon/ojk_saved_game.h | 3 + 16 files changed, 123 insertions(+), 95 deletions(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 99cea2dbf9..38525f37e5 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -281,10 +281,12 @@ if(BuildSPEngine OR BuildJK2SPEngine) set(SPEngineRendererFiles "${SPDir}/rd-common/mdx_format.h" + "${SPDir}/rd-common/mdx_format.cpp" "${SPDir}/rd-common/tr_public.h" "${SPDir}/rd-common/tr_types.h" ) - + source_group("renderer" FILES ${SPEngineRendererFiles}) + set(SPEngineFiles ${SPEngineFiles} ${SPEngineRendererFiles}) # UI files set(SPEngineUIFiles @@ -308,6 +310,7 @@ if(BuildSPEngine OR BuildJK2SPEngine) set(SPEngineGhoul2Files "${SPDir}/ghoul2/G2.h" "${SPDir}/ghoul2/ghoul2_gore.h" + "${SPDir}/rd-common/ghoul2_shared.cpp" ) source_group("ghoul2" FILES ${SPEngineGhoul2Files}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineGhoul2Files}) diff --git a/code/client/cl_main.cpp b/code/client/cl_main.cpp index b3ab567c76..d02fe0d24c 100644 --- a/code/client/cl_main.cpp +++ b/code/client/cl_main.cpp @@ -1143,7 +1143,6 @@ void CL_InitRef( void ) { RIT(FS_Write); RIT(FS_WriteFile); RIT(Hunk_ClearToMark); - RIT(SG_Append); RIT(SND_RegisterAudio_LevelLoadEnd); //RIT(SV_PointContents); RIT(SV_Trace); diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 475d3e81a4..6a4cf1ebaf 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -265,6 +265,9 @@ set(SPGameCommonFiles "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" + "${SPDir}/rd-common/mdx_format.h" + "${SPDir}/rd-common/mdx_format.cpp" + "${SPDir}/rd-common/ghoul2_shared.cpp" "${SharedDir}/qcommon/ojk_i_saved_game.h" "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 4ec336fa94..29d659e8cf 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -11154,16 +11154,6 @@ void CQuake3GameInterface::FreeVariable( const char *name ) } //Save / Load functions -int CQuake3GameInterface::WriteSaveData( unsigned int chid, const void *data, int length ) -{ - return gi.AppendToSaveGame( chid, data, length ); -} - -int CQuake3GameInterface::ReadSaveData( unsigned int chid, void *address, int length, void **addressptr ) -{ - return gi.ReadFromSaveGame( chid, address, length, addressptr ); -} - ojk::ISavedGame* CQuake3GameInterface::get_saved_game() { return ::gi.saved_game; diff --git a/code/game/Q3_Interface.h b/code/game/Q3_Interface.h index 3bc97b113d..ff2e22ab6d 100644 --- a/code/game/Q3_Interface.h +++ b/code/game/Q3_Interface.h @@ -697,8 +697,6 @@ class CQuake3GameInterface : public IGameInterface void FreeVariable( const char *name ); //Save / Load functions - int WriteSaveData( unsigned int chid, const void *data, int length ); - int ReadSaveData( unsigned int chid, void *address, int length, void **addressptr = NULL ); int LinkGame( int entID, int icarusID ); ojk::ISavedGame* get_saved_game() override; diff --git a/code/game/g_public.h b/code/game/g_public.h index f0c21fa2df..b503c7890d 100644 --- a/code/game/g_public.h +++ b/code/game/g_public.h @@ -185,11 +185,6 @@ typedef struct { // Savegame handling // - qboolean (*AppendToSaveGame)(unsigned int chid, const void *data, int length); - - int (*ReadFromSaveGame)(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPtr ); - int (*ReadFromSaveGameOptional)(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPtr ); - ojk::ISavedGame* saved_game; // add commands to the console as if they were typed in diff --git a/code/game/g_shared.cpp b/code/game/g_shared.cpp index aa60cf024d..9fe0920217 100644 --- a/code/game/g_shared.cpp +++ b/code/game/g_shared.cpp @@ -272,7 +272,7 @@ void clientPersistant_t::sg_export( ojk::ISavedGame* saved_game) const { saved_game->write(connected); - saved_game->write(lastCommand); + saved_game->write<>(lastCommand); saved_game->write(netname); saved_game->write(maxHealth); saved_game->write(enterTime); @@ -284,7 +284,7 @@ void clientPersistant_t::sg_import( ojk::ISavedGame* saved_game) { saved_game->read(connected); - saved_game->read(lastCommand); + saved_game->read<>(lastCommand); saved_game->read(netname); saved_game->read(maxHealth); saved_game->read(enterTime); @@ -300,7 +300,7 @@ void gclient_s::sg_export( saved_game->write<>(pers); saved_game->write<>(sess); saved_game->write(lastCmdTime); - saved_game->write(usercmd); + saved_game->write<>(usercmd); saved_game->write(buttons); saved_game->write(oldbuttons); saved_game->write(latched_buttons); @@ -365,7 +365,7 @@ void gclient_s::sg_import( saved_game->read<>(pers); saved_game->read<>(sess); saved_game->read(lastCmdTime); - saved_game->read(usercmd); + saved_game->read<>(usercmd); saved_game->read(buttons); saved_game->read(oldbuttons); saved_game->read(latched_buttons); @@ -814,16 +814,3 @@ void gentity_t::sg_import( saved_game->read(forcePushTime); saved_game->read(forcePuller); } - - -void CGhoul2Info_v::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(mItem); -} - -void CGhoul2Info_v::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->write(mItem); -} diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 133adc2700..d1de2a39d7 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -358,7 +358,6 @@ typedef struct missionStats_s // MUST be dealt with in G_InitSessionData() / G_ReadSessionData() / G_WriteSessionData() // // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -#pragma pack(push, 4) typedef struct { int missionObjectivesShown; // Number of times mission objectives have been updated team_t sessionTeam; diff --git a/code/icarus/IcarusInterface.h b/code/icarus/IcarusInterface.h index 71acf2bb79..c953db1b86 100644 --- a/code/icarus/IcarusInterface.h +++ b/code/icarus/IcarusInterface.h @@ -144,8 +144,6 @@ class IGameInterface // Save / Load functions - virtual int WriteSaveData( unsigned int chid, const void *data, int length ) = 0; - virtual int ReadSaveData( unsigned int chid, void *address, int length, void **addressptr = NULL ) = 0; virtual int LinkGame( int gameID, int icarusID ) = 0; virtual ojk::ISavedGame* get_saved_game() = 0; diff --git a/code/rd-common/tr_public.h b/code/rd-common/tr_public.h index 9b4e2f27b5..f14af68715 100644 --- a/code/rd-common/tr_public.h +++ b/code/rd-common/tr_public.h @@ -112,8 +112,6 @@ typedef struct { const int passEntityNum, const int contentmask, const EG2_Collision eG2TraceType, const int useLod ); - qboolean (*SG_Append) ( unsigned int chid, const void *pvData, int iLength ); - ojk::ISavedGame* saved_game; int (*SV_PointContents) ( const vec3_t p, clipHandle_t model ); diff --git a/code/server/sv_game.cpp b/code/server/sv_game.cpp index ec5296d892..74ce6adcab 100644 --- a/code/server/sv_game.cpp +++ b/code/server/sv_game.cpp @@ -930,10 +930,6 @@ void SV_InitGameProgs (void) { import.FS_FreeFile = FS_FreeFile; import.FS_GetFileList = FS_GetFileList; - import.AppendToSaveGame = SG_Append; - import.ReadFromSaveGame = SG_Read; - import.ReadFromSaveGameOptional = SG_ReadOptional; - import.saved_game = &ojk::SavedGame::get_instance(); import.AdjustAreaPortalState = SV_AdjustAreaPortalState; diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index b856df37f0..79b44d1aaf 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -44,7 +44,11 @@ static char saveGameComment[iSG_COMMENT_SIZE]; //#define SG_PROFILE // enable for debug save stats if you want int giSaveGameVersion; // filled in when a savegame file is opened + +#if 0 fileHandle_t fhSaveGame = 0; +#endif + SavedGameJustLoaded_e eSavedGameJustLoaded = eNO; qboolean qbSGReadIsTestOnly = qfalse; // this MUST be left in this state char sLastSaveFileLoaded[MAX_QPATH]={0}; @@ -139,13 +143,14 @@ static const char *SG_AddSavePath( const char *psPathlessBaseName ) return sSaveName[i]; } -void SG_WipeSavegame( const char *psPathlessBaseName ) +void SG_WipeSavegame( + const char* psPathlessBaseName) { - const char *psLocalFilename = SG_AddSavePath( psPathlessBaseName ); - - FS_DeleteUserGenFile( psLocalFilename ); + ojk::SavedGame::remove( + psPathlessBaseName); } +#if 0 static qboolean SG_Move( const char *psPathlessBaseName_Src, const char *psPathlessBaseName_Dst ) { const char *psLocalFilename_Src = SG_AddSavePath( psPathlessBaseName_Src ); @@ -161,8 +166,9 @@ static qboolean SG_Move( const char *psPathlessBaseName_Src, const char *psPathl return qtrue; } +#endif - +#if 0 qboolean gbSGWriteFailed = qfalse; static qboolean SG_Create( const char *psPathlessBaseName ) @@ -189,10 +195,12 @@ static qboolean SG_Create( const char *psPathlessBaseName ) return qtrue; } +#endif // called from the ERR_DROP stuff just in case the error occured during loading of a saved game, because if // we didn't do this then we'd run out of quake file handles after the 8th load fail... // +#if 0 void SG_Shutdown() { if (fhSaveGame ) @@ -209,7 +217,25 @@ void SG_Shutdown() extern qboolean gbAlreadyDoingLoad; gbAlreadyDoingLoad = qfalse; } +#else +void SG_Shutdown() +{ + auto saved_game = &ojk::SavedGame::get_instance(); + + saved_game->close(); + eSavedGameJustLoaded = eNO; + // important to do this if we ERR_DROP during loading, else next map you load after + // a bad save-file you'll arrive at dead :-) + + // and this bit stops people messing up the laoder by repeatedly stabbing at the load key during loads... + // + extern qboolean gbAlreadyDoingLoad; + gbAlreadyDoingLoad = qfalse; +} +#endif + +#if 0 qboolean SG_Close() { assert( fhSaveGame ); @@ -239,8 +265,9 @@ qboolean SG_Close() CompressMem_FreeScratchBuffer(); return qtrue; } +#endif - +#if 0 qboolean SG_Open( const char *psPathlessBaseName ) { // if ( fhSaveGame ) // hmmm... @@ -280,6 +307,7 @@ qboolean SG_Open( const char *psPathlessBaseName ) return qtrue; } +#endif // you should only call this when you know you've successfully opened a savegame, and you want to query for // whether it's an old (street-copy) version, or a new (expansion-pack) version @@ -1030,30 +1058,33 @@ static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest) } // Gets the savegame screenshot // -qboolean SG_GetSaveImage( const char *psPathlessBaseName, void *pvAddress ) +qboolean SG_GetSaveImage(const char *psPathlessBaseName, void *pvAddress) { - if(!psPathlessBaseName) - { - return qfalse; - } - - if (!SG_Open(psPathlessBaseName)) - { - return qfalse; - } + if (!psPathlessBaseName) + { + return qfalse; + } auto saved_game = &ojk::SavedGame::get_instance(); + if (!saved_game->open(psPathlessBaseName)) + { + return qfalse; + } + saved_game->read_chunk( - INT_ID('C','O','M','M')); + INT_ID('C', 'O', 'M', 'M')); saved_game->read_chunk( - INT_ID('C','M','T','M')); + INT_ID('C', 'M', 'T', 'M')); + + auto bGotSaveImage = SG_ReadScreenshot( + qfalse, + pvAddress); - qboolean bGotSaveImage = SG_ReadScreenshot(qfalse, pvAddress); + saved_game->close(); - SG_Close(); - return bGotSaveImage; + return bGotSaveImage; } @@ -1177,7 +1208,9 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) SG_StoreSaveGameComment(va("--> %s <--",psMapName)); } - if(!SG_Create( "current" )) + auto saved_game = &ojk::SavedGame::get_instance(); + + if(!saved_game->create( "current" )) { Com_Printf (GetString_FailedToOpenSaveGame("current",qfalse));//S_COLOR_RED "Failed to create savegame\n"); SG_WipeSavegame( "current" ); @@ -1194,8 +1227,6 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) SG_WriteScreenshot(qbAutosave, sMapCmd); #endif - auto saved_game = &ojk::SavedGame::get_instance(); - saved_game->write_chunk( INT_ID('M','P','C','M'), sMapCmd); @@ -1220,8 +1251,12 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) SG_WriteServerConfigStrings(); } ge->WriteLevel(qbAutosave); // always done now, but ent saver only does player if auto - SG_Close(); - if (gbSGWriteFailed) + + auto is_write_failed = saved_game->is_write_failed(); + + saved_game->close(); + + if (is_write_failed) { Com_Printf (GetString_FailedToOpenSaveGame("current",qfalse));//S_COLOR_RED "Failed to write savegame!\n"); SG_WipeSavegame( "current" ); @@ -1229,7 +1264,13 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) return qfalse; } +#if 0 SG_Move( "current", psPathlessBaseName ); +#else + ojk::SavedGame::rename( + "current", + psPathlessBaseName); +#endif sv_testsave->integer = iPrevTestSave; @@ -1249,7 +1290,9 @@ qboolean SG_ReadSavegame(const char *psPathlessBaseName) Cvar_Set( "cg_missionstatusscreen", "0" );//reset if loading a game #endif - if (!SG_Open( psPathlessBaseName )) + auto saved_game = &ojk::SavedGame::get_instance(); + + if (!saved_game->open(psPathlessBaseName)) { Com_Printf (GetString_FailedToOpenSaveGame(psPathlessBaseName, qtrue));//S_COLOR_RED "Failed to open savegame \"%s\"\n", psPathlessBaseName); sv_testsave->integer = iPrevTestSave; @@ -1265,8 +1308,6 @@ qboolean SG_ReadSavegame(const char *psPathlessBaseName) // Read in all the server data... // - auto saved_game = &ojk::SavedGame::get_instance(); - saved_game->read_chunk( INT_ID('C','O','M','M'), sComment); @@ -1310,18 +1351,22 @@ qboolean SG_ReadSavegame(const char *psPathlessBaseName) } ge->ReadLevel(qbAutosave, qbLoadTransition); // always done now, but ent reader only does player if auto +#if 0 if(!SG_Close()) { Com_Printf (GetString_FailedToOpenSaveGame(psPathlessBaseName,qfalse));//S_COLOR_RED "Failed to close savegame\n"); sv_testsave->integer = iPrevTestSave; return qfalse; } +#else + saved_game->close(); +#endif sv_testsave->integer = iPrevTestSave; return qtrue; } - +#if 0 int Compress_RLE(const byte *pIn, int iLength, byte *pOut) { int iCount=0,iOutIndex=0; @@ -1358,7 +1403,9 @@ int Compress_RLE(const byte *pIn, int iLength, byte *pOut) } return iOutIndex; } +#endif +#if 0 void DeCompress_RLE(byte *pOut, const byte *pIn, int iDecompressedBytesRemaining) { signed char count; @@ -1381,7 +1428,9 @@ void DeCompress_RLE(byte *pOut, const byte *pIn, int iDecompressedBytesRemaining iDecompressedBytesRemaining -= count; } } +#endif +#if 0 // simulate decompression over original data (but don't actually do it), to test de/compress validity... // qboolean Verify_RLE(const byte *pOut, const byte *pIn, int iDecompressedBytesRemaining) @@ -1422,8 +1471,9 @@ qboolean Verify_RLE(const byte *pOut, const byte *pIn, int iDecompressedBytesRem return qtrue; } +#endif - +#if 0 byte *gpbCompBlock = NULL; int giCompBlockSize = 0; static void CompressMem_FreeScratchBuffer(void) @@ -1435,7 +1485,9 @@ static void CompressMem_FreeScratchBuffer(void) } giCompBlockSize = 0; } +#endif +#if 0 static byte *CompressMem_AllocScratchBuffer(int iSize) { // only alloc new buffer if we need more than the existing one... @@ -1450,7 +1502,9 @@ static byte *CompressMem_AllocScratchBuffer(int iSize) return gpbCompBlock; } +#endif +#if 0 // returns -1 for compression-not-worth-it, else compressed length... // int CompressMem(byte *pbData, int iLength, byte *&pbOut) @@ -1478,15 +1532,17 @@ int CompressMem(byte *pbData, int iLength, byte *&pbOut) return iOutputLength; } +#endif +#if 0 //pass through function int SG_Write(const void * chid, const int bytesize, fileHandle_t fhSaveGame) { return FS_Write( chid, bytesize, fhSaveGame); } +#endif - - +#if 0 qboolean SG_Append(unsigned int chid, const void *pvData, int iLength) { unsigned int uiCksum; @@ -1573,21 +1629,24 @@ qboolean SG_Append(unsigned int chid, const void *pvData, int iLength) return qtrue; } +#endif +#if 0 //pass through function int SG_ReadBytes(void * chid, int bytesize, fileHandle_t fhSaveGame) { return FS_Read( chid, bytesize, fhSaveGame); } +#endif - +#if 0 int SG_Seek( fileHandle_t fhSaveGame, long offset, int origin ) { return FS_Seek(fhSaveGame, offset, origin); } +#endif - - +#if 0 // Pass in pvAddress (or NULL if you want memory to be allocated) // if pvAddress==NULL && ppvAddressPtr == NULL then the block is discarded/skipped. // @@ -1750,17 +1809,21 @@ static int SG_Read_Actual(unsigned int chid, void *pvAddress, int iLength, void return iLength; } +#endif +#if 0 int SG_Read(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPtr /* = NULL */) { return SG_Read_Actual(chid, pvAddress, iLength, ppvAddressPtr, qfalse ); // qboolean bChunkIsOptional } +#endif +#if 0 int SG_ReadOptional(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPtr /* = NULL */) { return SG_Read_Actual(chid, pvAddress, iLength, ppvAddressPtr, qtrue); // qboolean bChunkIsOptional } - +#endif void SG_TestSave(void) { diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index 4412aa1aa0..f4714063bd 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -26,6 +26,7 @@ set(JK2SPGameDefines ${SharedDefines} "JK2_MODE" "SP_GAME") set(JK2SPGameIncludeDirectories "${JK2SPDir}" "${JK2SPDir}/game" + "${SPDir}" "${SharedDir}" "${GSLIncludeDirectory}" ) @@ -238,6 +239,9 @@ set(JK2SPGameCommonFiles "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SPDir}/qcommon/strippublic.h" + "${SPDir}/rd-common/ghoul2_shared.cpp" + "${SPDir}/rd-common/mdx_format.h" + "${SPDir}/rd-common/mdx_format.cpp" "${SharedDir}/qcommon/ojk_i_saved_game.h" "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" diff --git a/codeJK2/game/g_shared.cpp b/codeJK2/game/g_shared.cpp index b0b1d5bda1..b53b8db4f4 100644 --- a/codeJK2/game/g_shared.cpp +++ b/codeJK2/game/g_shared.cpp @@ -800,16 +800,3 @@ void gentity_s::sg_import( saved_game->read(forcePushTime); saved_game->read(forcePuller); } - - -void CGhoul2Info_v::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(mItem); -} - -void CGhoul2Info_v::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(mItem); -} diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index be098f8d9a..328cc5b64e 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -499,6 +499,11 @@ void SavedGame::raw_write( io_buffer_offset_ = new_buffer_size; } +bool SavedGame::is_write_failed() const +{ + return is_write_failed_; +} + const SavedGame::Buffer& SavedGame::get_buffer() const { return io_buffer_; diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game.h index 6bb31e86c9..d975411533 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game.h @@ -86,6 +86,9 @@ class SavedGame : using ISavedGame::write; + bool is_write_failed() const; + + // Returns an I/O buffer. const Buffer& get_buffer() const override; From 43bcc08059151ff0b88cf342e4954cc1a072789a Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 16 Jul 2016 17:09:13 +0300 Subject: [PATCH 254/445] Add method to control preview mode --- code/server/sv_savegame.cpp | 21 ++++++++++++++++----- shared/qcommon/ojk_saved_game.cpp | 6 ++++++ shared/qcommon/ojk_saved_game.h | 3 +++ 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 79b44d1aaf..76dfdba08d 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -50,7 +50,11 @@ fileHandle_t fhSaveGame = 0; #endif SavedGameJustLoaded_e eSavedGameJustLoaded = eNO; + +#if 0 qboolean qbSGReadIsTestOnly = qfalse; // this MUST be left in this state +#endif + char sLastSaveFileLoaded[MAX_QPATH]={0}; #define iSG_MAPCMD_SIZE MAX_QPATH @@ -91,6 +95,7 @@ typedef map CChidInfo_t; CChidInfo_t save_info; #endif +#if 0 const char *SG_GetChidText(unsigned int chid) { static union { char c[5]; int i; } chidtext; @@ -99,7 +104,7 @@ const char *SG_GetChidText(unsigned int chid) return chidtext.c; } - +#endif static const char *GetString_FailedToOpenSaveGame(const char *psFilename, qboolean bOpen) { @@ -117,6 +122,7 @@ static const char *GetString_FailedToOpenSaveGame(const char *psFilename, qboole return sTemp; } +#if 0 // (copes with up to 8 ptr returns at once) // static const char *SG_AddSavePath( const char *psPathlessBaseName ) @@ -142,6 +148,7 @@ static const char *SG_AddSavePath( const char *psPathlessBaseName ) Com_sprintf( sSaveName[i], MAX_OSPATH, "saves/%s.sav", psPathlessBaseName ); return sSaveName[i]; } +#endif void SG_WipeSavegame( const char* psPathlessBaseName) @@ -309,6 +316,7 @@ qboolean SG_Open( const char *psPathlessBaseName ) } #endif +#if 0 // you should only call this when you know you've successfully opened a savegame, and you want to query for // whether it's an old (street-copy) version, or a new (expansion-pack) version // @@ -316,6 +324,7 @@ int SG_Version(void) { return giSaveGameVersion; } +#endif void SV_WipeGame_f(void) { @@ -929,14 +938,17 @@ int SG_GetSaveGameComment(const char *psPathlessBaseName, char *sComment, char * size_t iScreenShotLength; #endif - qbSGReadIsTestOnly = qtrue; // do NOT leave this in this state - auto saved_game = &ojk::SavedGame::get_instance(); + saved_game->set_preview_mode( + true); + if (!saved_game->open( psPathlessBaseName)) { - qbSGReadIsTestOnly = qfalse; + saved_game->set_preview_mode( + false); + return 0; } @@ -973,7 +985,6 @@ int SG_GetSaveGameComment(const char *psPathlessBaseName, char *sComment, char * #endif } } - qbSGReadIsTestOnly = qfalse; saved_game->close(); diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index 328cc5b64e..3ab447d54c 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -504,6 +504,12 @@ bool SavedGame::is_write_failed() const return is_write_failed_; } +void SavedGame::set_preview_mode( + bool value) +{ + is_preview_mode_ = value; +} + const SavedGame::Buffer& SavedGame::get_buffer() const { return io_buffer_; diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game.h index d975411533..7511a2b82e 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game.h @@ -88,6 +88,9 @@ class SavedGame : bool is_write_failed() const; + void set_preview_mode( + bool value); + // Returns an I/O buffer. const Buffer& get_buffer() const override; From a1ef2822e6ed7d0f62cd96bb4bfc7a99ca652bbb Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 16 Jul 2016 19:56:17 +0300 Subject: [PATCH 255/445] Remove wrappers and old save code leftovers --- codeJK2/game/Q3_Interface.cpp | 3 --- codeJK2/game/g_public.h | 5 ----- 2 files changed, 8 deletions(-) diff --git a/codeJK2/game/Q3_Interface.cpp b/codeJK2/game/Q3_Interface.cpp index 7d2c82c192..7a6a73c9fa 100644 --- a/codeJK2/game/Q3_Interface.cpp +++ b/codeJK2/game/Q3_Interface.cpp @@ -9262,10 +9262,7 @@ void Interface_Init( interface_export_t *pe ) pe->I_FreeVariable = Q3_FreeVariable; //Save / Load functions - pe->I_WriteSaveData = gi.AppendToSaveGame; - pe->I_ReadSaveData = gi.ReadFromSaveGame; pe->I_LinkEntity = ICARUS_LinkEntity; - pe->saved_game = gi.saved_game; gclient_t *client; diff --git a/codeJK2/game/g_public.h b/codeJK2/game/g_public.h index f09e3e0f27..960e5d82ed 100644 --- a/codeJK2/game/g_public.h +++ b/codeJK2/game/g_public.h @@ -174,11 +174,6 @@ typedef struct { // Savegame handling // - qboolean (*AppendToSaveGame)(unsigned int chid, const void *data, int length); - - int (*ReadFromSaveGame)(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPtr ); - int (*ReadFromSaveGameOptional)(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPtr ); - ojk::ISavedGame* saved_game; // add commands to the console as if they were typed in From 0b8140cc1b0a40fea9edd012cbc5523a366431cc Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 16 Jul 2016 20:10:34 +0300 Subject: [PATCH 256/445] Add method to advance the buffer offset --- shared/qcommon/ojk_i_saved_game_fwd.h | 5 ++++ shared/qcommon/ojk_saved_game.cpp | 43 +++++++++++++++++++++++++++ shared/qcommon/ojk_saved_game.h | 3 ++ 3 files changed, 51 insertions(+) diff --git a/shared/qcommon/ojk_i_saved_game_fwd.h b/shared/qcommon/ojk_i_saved_game_fwd.h index 141d8bbf30..1a989c14a8 100644 --- a/shared/qcommon/ojk_i_saved_game_fwd.h +++ b/shared/qcommon/ojk_i_saved_game_fwd.h @@ -116,6 +116,11 @@ class ISavedGame int src_count); + // Increments buffer's offset by the specified non-negative count. + virtual void advance_buffer( + int count) = 0; + + // Returns an I/O buffer. virtual const Buffer& get_buffer() const = 0; diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index 3ab447d54c..5ceeab7cf6 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -510,6 +510,49 @@ void SavedGame::set_preview_mode( is_preview_mode_ = value; } +void SavedGame::advance_buffer( + int count) +{ + if (!is_readable_ && !is_writable_) + { + throw_error( + "Not open or created."); + } + + if (count < 0) + { + throw_error( + "Negative count."); + } + + if (count == 0) + { + return; + } + + auto new_offset = io_buffer_offset_ + count; + auto buffer_size = io_buffer_.size(); + + if (new_offset > buffer_size) + { + if (is_readable_) + { + throw_error( + "Not enough data."); + } + else if (is_writable_) + { + io_buffer_offset_ = new_offset; + + if (new_offset > buffer_size) + { + io_buffer_.resize( + new_offset); + } + } + } +} + const SavedGame::Buffer& SavedGame::get_buffer() const { return io_buffer_; diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game.h index 7511a2b82e..d0ece437c9 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game.h @@ -91,6 +91,9 @@ class SavedGame : void set_preview_mode( bool value); + // Increments buffer's offset by the specified non-negative count. + void advance_buffer( + int count) override; // Returns an I/O buffer. const Buffer& get_buffer() const override; From 33ca62565fd349cbfac06ca7363c20b8967bb3a3 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 17 Jul 2016 17:34:32 +0300 Subject: [PATCH 257/445] Fix pointer reading/writing --- codeJK2/game/CMakeLists.txt | 1 - shared/qcommon/ojk_i_saved_game.h | 2 +- shared/qcommon/ojk_i_saved_game_fwd.h | 4 ++-- shared/qcommon/ojk_saved_game.cpp | 6 +++--- shared/qcommon/ojk_saved_game.h | 2 +- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index f4714063bd..faf204bb08 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -26,7 +26,6 @@ set(JK2SPGameDefines ${SharedDefines} "JK2_MODE" "SP_GAME") set(JK2SPGameIncludeDirectories "${JK2SPDir}" "${JK2SPDir}/game" - "${SPDir}" "${SharedDir}" "${GSLIncludeDirectory}" ) diff --git a/shared/qcommon/ojk_i_saved_game.h b/shared/qcommon/ojk_i_saved_game.h index 04b5353e0e..fc246f87e7 100644 --- a/shared/qcommon/ojk_i_saved_game.h +++ b/shared/qcommon/ojk_i_saved_game.h @@ -186,7 +186,7 @@ void ISavedGame::read( template void ISavedGame::read( - TDst* dst_value, + TDst*& dst_value, PointerTag) { static_assert( diff --git a/shared/qcommon/ojk_i_saved_game_fwd.h b/shared/qcommon/ojk_i_saved_game_fwd.h index 1a989c14a8..3573f3b12d 100644 --- a/shared/qcommon/ojk_i_saved_game_fwd.h +++ b/shared/qcommon/ojk_i_saved_game_fwd.h @@ -117,7 +117,7 @@ class ISavedGame // Increments buffer's offset by the specified non-negative count. - virtual void advance_buffer( + virtual void skip( int count) = 0; @@ -153,7 +153,7 @@ class ISavedGame template void read( - TDst* dst_value, + TDst*& dst_value, PointerTag); template diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index 5ceeab7cf6..936c80bff0 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -510,7 +510,7 @@ void SavedGame::set_preview_mode( is_preview_mode_ = value; } -void SavedGame::advance_buffer( +void SavedGame::skip( int count) { if (!is_readable_ && !is_writable_) @@ -542,8 +542,6 @@ void SavedGame::advance_buffer( } else if (is_writable_) { - io_buffer_offset_ = new_offset; - if (new_offset > buffer_size) { io_buffer_.resize( @@ -551,6 +549,8 @@ void SavedGame::advance_buffer( } } } + + io_buffer_offset_ = new_offset; } const SavedGame::Buffer& SavedGame::get_buffer() const diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game.h index d0ece437c9..a91515c3ba 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game.h @@ -92,7 +92,7 @@ class SavedGame : bool value); // Increments buffer's offset by the specified non-negative count. - void advance_buffer( + void skip( int count) override; // Returns an I/O buffer. From 41065ad3f3e695530f9da6b70d28f49f8edfa6a2 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 17 Jul 2016 20:10:13 +0300 Subject: [PATCH 258/445] Move import/export code into the header files --- code/CMakeLists.txt | 2 - code/cgame/FxScheduler.cpp | 23 - code/cgame/FxScheduler.h | 20 +- code/game/CMakeLists.txt | 7 - code/game/ai.cpp | 66 --- code/game/ai.h | 58 ++- code/game/b_public.cpp | 293 ----------- code/game/b_public.h | 284 ++++++++++- code/game/bg_public.cpp | 45 -- code/game/bg_public.h | 38 +- code/game/g_local.cpp | 101 ---- code/game/g_local.h | 90 +++- code/game/g_shared.cpp | 816 ------------------------------- code/game/g_shared.h | 784 ++++++++++++++++++++++++++++- code/game/g_vehicles.cpp | 154 ------ code/game/g_vehicles.h | 175 +++++-- code/game/ghoul2_shared.h | 264 +++++++++- code/qcommon/q_shared.cpp | 778 +---------------------------- code/qcommon/q_shared.h | 742 +++++++++++++++++++++++++++- code/rd-common/ghoul2_shared.cpp | 280 ----------- code/rd-common/mdx_format.cpp | 16 - code/rd-common/mdx_format.h | 14 +- code/rd-vanilla/CMakeLists.txt | 2 - codeJK2/game/CMakeLists.txt | 8 - codeJK2/game/ai.cpp | 67 --- codeJK2/game/ai.h | 58 ++- codeJK2/game/anims.cpp | 24 - codeJK2/game/anims.h | 18 +- codeJK2/game/b_public.cpp | 259 ---------- codeJK2/game/b_public.h | 250 +++++++++- codeJK2/game/bg_public.cpp | 42 -- codeJK2/game/bg_public.h | 34 +- codeJK2/game/g_local.cpp | 76 --- codeJK2/game/g_local.h | 68 ++- codeJK2/game/g_shared.cpp | 802 ------------------------------ codeJK2/game/g_shared.h | 766 ++++++++++++++++++++++++++++- 36 files changed, 3508 insertions(+), 4016 deletions(-) delete mode 100644 code/game/ai.cpp delete mode 100644 code/game/b_public.cpp delete mode 100644 code/game/bg_public.cpp delete mode 100644 code/game/g_local.cpp delete mode 100644 code/game/g_shared.cpp delete mode 100644 code/rd-common/ghoul2_shared.cpp delete mode 100644 code/rd-common/mdx_format.cpp delete mode 100644 codeJK2/game/ai.cpp delete mode 100644 codeJK2/game/anims.cpp delete mode 100644 codeJK2/game/b_public.cpp delete mode 100644 codeJK2/game/bg_public.cpp delete mode 100644 codeJK2/game/g_local.cpp delete mode 100644 codeJK2/game/g_shared.cpp diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 38525f37e5..7e1dff40e5 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -281,7 +281,6 @@ if(BuildSPEngine OR BuildJK2SPEngine) set(SPEngineRendererFiles "${SPDir}/rd-common/mdx_format.h" - "${SPDir}/rd-common/mdx_format.cpp" "${SPDir}/rd-common/tr_public.h" "${SPDir}/rd-common/tr_types.h" ) @@ -310,7 +309,6 @@ if(BuildSPEngine OR BuildJK2SPEngine) set(SPEngineGhoul2Files "${SPDir}/ghoul2/G2.h" "${SPDir}/ghoul2/ghoul2_gore.h" - "${SPDir}/rd-common/ghoul2_shared.cpp" ) source_group("ghoul2" FILES ${SPEngineGhoul2Files}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineGhoul2Files}) diff --git a/code/cgame/FxScheduler.cpp b/code/cgame/FxScheduler.cpp index ef4c0d441d..083e785440 100644 --- a/code/cgame/FxScheduler.cpp +++ b/code/cgame/FxScheduler.cpp @@ -1924,26 +1924,3 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, const vec3_t origin, ve } } } - - -void SLoopedEffect::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(mId); - saved_game->write(mBoltInfo); - saved_game->write(mNextTime); - saved_game->write(mLoopStopTime); - saved_game->write(mPortalEffect); - saved_game->write(mIsRelative); -} - -void SLoopedEffect::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(mId); - saved_game->read(mBoltInfo); - saved_game->read(mNextTime); - saved_game->read(mLoopStopTime); - saved_game->read(mPortalEffect); - saved_game->read(mIsRelative); -} diff --git a/code/cgame/FxScheduler.h b/code/cgame/FxScheduler.h index 6a9349c001..ef6e8a9481 100644 --- a/code/cgame/FxScheduler.h +++ b/code/cgame/FxScheduler.h @@ -412,10 +412,26 @@ struct SLoopedEffect void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(mId); + saved_game->write(mBoltInfo); + saved_game->write(mNextTime); + saved_game->write(mLoopStopTime); + saved_game->write(mPortalEffect); + saved_game->write(mIsRelative); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(mId); + saved_game->read(mBoltInfo); + saved_game->read(mNextTime); + saved_game->read(mLoopStopTime); + saved_game->read(mPortalEffect); + saved_game->read(mIsRelative); + } }; class CFxScheduler diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 6a4cf1ebaf..da8a64da91 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -149,14 +149,11 @@ set(SPGameGameFiles "${SPDir}/game/SpeederNPC.cpp" "${SPDir}/game/WalkerNPC.cpp" "${SPDir}/game/ai.h" - "${SPDir}/game/ai.cpp" "${SPDir}/game/anims.h" "${SPDir}/game/b_local.h" "${SPDir}/game/b_public.h" - "${SPDir}/game/b_public.cpp" "${SPDir}/game/bg_local.h" "${SPDir}/game/bg_public.h" - "${SPDir}/game/bg_public.cpp" "${SPDir}/game/bset.h" "${SPDir}/game/bstate.h" "${SPDir}/game/channels.h" @@ -167,13 +164,11 @@ set(SPGameGameFiles "${SPDir}/game/g_functions.h" "${SPDir}/game/g_items.h" "${SPDir}/game/g_local.h" - "${SPDir}/game/g_local.cpp" "${SPDir}/game/g_nav.h" "${SPDir}/game/g_navigator.h" "${SPDir}/game/g_public.h" "${SPDir}/game/g_roff.h" "${SPDir}/game/g_shared.h" - "${SPDir}/game/g_shared.cpp" "${SPDir}/game/genericparser2.h" "${SPDir}/game/ghoul2_shared.h" "${SPDir}/game/hitlocs.h" @@ -266,8 +261,6 @@ set(SPGameCommonFiles "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SPDir}/rd-common/mdx_format.h" - "${SPDir}/rd-common/mdx_format.cpp" - "${SPDir}/rd-common/ghoul2_shared.cpp" "${SharedDir}/qcommon/ojk_i_saved_game.h" "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" diff --git a/code/game/ai.cpp b/code/game/ai.cpp deleted file mode 100644 index ea5193cd1d..0000000000 --- a/code/game/ai.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include "../cgame/cg_local.h" -#include "ai.h" -#include "qcommon/ojk_i_saved_game.h" - - -void AIGroupMember_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(number); - saved_game->write(waypoint); - saved_game->write(pathCostToEnemy); - saved_game->write(closestBuddy); -} - -void AIGroupMember_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(number); - saved_game->read(waypoint); - saved_game->read(pathCostToEnemy); - saved_game->read(closestBuddy); -} - -void AIGroupInfo_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(numGroup); - saved_game->write(processed); - saved_game->write(team); - saved_game->write(enemy); - saved_game->write(enemyWP); - saved_game->write(speechDebounceTime); - saved_game->write(lastClearShotTime); - saved_game->write(lastSeenEnemyTime); - saved_game->write(morale); - saved_game->write(moraleAdjust); - saved_game->write(moraleDebounce); - saved_game->write(memberValidateTime); - saved_game->write(activeMemberNum); - saved_game->write(commander); - saved_game->write(enemyLastSeenPos); - saved_game->write(numState); - saved_game->write<>(member); -} - -void AIGroupInfo_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(numGroup); - saved_game->read(processed); - saved_game->read(team); - saved_game->read(enemy); - saved_game->read(enemyWP); - saved_game->read(speechDebounceTime); - saved_game->read(lastClearShotTime); - saved_game->read(lastSeenEnemyTime); - saved_game->read(morale); - saved_game->read(moraleAdjust); - saved_game->read(moraleDebounce); - saved_game->read(memberValidateTime); - saved_game->read(activeMemberNum); - saved_game->read(commander); - saved_game->read(enemyLastSeenPos); - saved_game->read(numState); - saved_game->read<>(member); -} diff --git a/code/game/ai.h b/code/game/ai.h index 780feffc99..5046f17383 100644 --- a/code/game/ai.h +++ b/code/game/ai.h @@ -124,10 +124,22 @@ typedef struct AIGroupMember_s void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(number); + saved_game->write(waypoint); + saved_game->write(pathCostToEnemy); + saved_game->write(closestBuddy); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(number); + saved_game->read(waypoint); + saved_game->read(pathCostToEnemy); + saved_game->read(closestBuddy); + } } AIGroupMember_t; #define MAX_GROUP_MEMBERS 32 @@ -154,10 +166,48 @@ typedef struct AIGroupInfo_s void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(numGroup); + saved_game->write(processed); + saved_game->write(team); + saved_game->write(enemy); + saved_game->write(enemyWP); + saved_game->write(speechDebounceTime); + saved_game->write(lastClearShotTime); + saved_game->write(lastSeenEnemyTime); + saved_game->write(morale); + saved_game->write(moraleAdjust); + saved_game->write(moraleDebounce); + saved_game->write(memberValidateTime); + saved_game->write(activeMemberNum); + saved_game->write(commander); + saved_game->write(enemyLastSeenPos); + saved_game->write(numState); + saved_game->write<>(member); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(numGroup); + saved_game->read(processed); + saved_game->read(team); + saved_game->read(enemy); + saved_game->read(enemyWP); + saved_game->read(speechDebounceTime); + saved_game->read(lastClearShotTime); + saved_game->read(lastSeenEnemyTime); + saved_game->read(morale); + saved_game->read(moraleAdjust); + saved_game->read(moraleDebounce); + saved_game->read(memberValidateTime); + saved_game->read(activeMemberNum); + saved_game->read(commander); + saved_game->read(enemyLastSeenPos); + saved_game->read(numState); + saved_game->read<>(member); + } } AIGroupInfo_t; diff --git a/code/game/b_public.cpp b/code/game/b_public.cpp deleted file mode 100644 index 8a4a78a9b4..0000000000 --- a/code/game/b_public.cpp +++ /dev/null @@ -1,293 +0,0 @@ -#include "b_local.h" -#include "b_public.h" -#include "qcommon/ojk_i_saved_game.h" - - -void gNPCstats_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(aggression); - saved_game->write(aim); - saved_game->write(earshot); - saved_game->write(evasion); - saved_game->write(hfov); - saved_game->write(intelligence); - saved_game->write(move); - saved_game->write(reactions); - saved_game->write(shootDistance); - saved_game->write(vfov); - saved_game->write(vigilance); - saved_game->write(visrange); - saved_game->write(runSpeed); - saved_game->write(walkSpeed); - saved_game->write(yawSpeed); - saved_game->write(health); - saved_game->write(acceleration); - saved_game->write(sex); -} - -void gNPCstats_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(aggression); - saved_game->read(aim); - saved_game->read(earshot); - saved_game->read(evasion); - saved_game->read(hfov); - saved_game->read(intelligence); - saved_game->read(move); - saved_game->read(reactions); - saved_game->read(shootDistance); - saved_game->read(vfov); - saved_game->read(vigilance); - saved_game->read(visrange); - saved_game->read(runSpeed); - saved_game->read(walkSpeed); - saved_game->read(yawSpeed); - saved_game->read(health); - saved_game->read(acceleration); - saved_game->read(sex); -} - - -void gNPC_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(timeOfDeath); - saved_game->write(touchedByPlayer); - saved_game->write(enemyLastVisibility); - saved_game->write(aimTime); - saved_game->write(desiredYaw); - saved_game->write(desiredPitch); - saved_game->write(lockedDesiredYaw); - saved_game->write(lockedDesiredPitch); - saved_game->write(aimingBeam); - saved_game->write(enemyLastSeenLocation); - saved_game->write(enemyLastSeenTime); - saved_game->write(enemyLastHeardLocation); - saved_game->write(enemyLastHeardTime); - saved_game->write(lastAlertID); - saved_game->write(eFlags); - saved_game->write(aiFlags); - saved_game->write(currentAmmo); - saved_game->write(shotTime); - saved_game->write(burstCount); - saved_game->write(burstMin); - -#ifdef BASE_SAVE_COMPAT - saved_game->write(burstMean); -#endif - - saved_game->write(burstMax); - saved_game->write(burstSpacing); - saved_game->write(attackHold); - saved_game->write(attackHoldTime); - saved_game->write(shootAngles); - saved_game->write(rank); - saved_game->write(behaviorState); - saved_game->write(defaultBehavior); - saved_game->write(tempBehavior); - saved_game->write(ignorePain); - saved_game->write(duckDebounceTime); - saved_game->write(walkDebounceTime); - saved_game->write(enemyCheckDebounceTime); - saved_game->write(investigateDebounceTime); - saved_game->write(investigateCount); - saved_game->write(investigateGoal); - saved_game->write(investigateSoundDebounceTime); - saved_game->write(greetingDebounceTime); - saved_game->write(eventOwner); - saved_game->write(coverTarg); - saved_game->write(jumpState); - saved_game->write(followDist); - saved_game->write(tempGoal); - saved_game->write(goalEntity); - saved_game->write(lastGoalEntity); - saved_game->write(eventualGoal); - saved_game->write(captureGoal); - saved_game->write(defendEnt); - saved_game->write(greetEnt); - saved_game->write(goalTime); - saved_game->write(straightToGoal); - saved_game->write(distToGoal); - saved_game->write(navTime); - saved_game->write(blockingEntNum); - saved_game->write(blockedSpeechDebounceTime); - saved_game->write(homeWp); - saved_game->write(avoidSide); - saved_game->write(leaderAvoidSide); - saved_game->write(lastAvoidSteerSide); - saved_game->write(lastAvoidSteerSideDebouncer); - saved_game->write(group); - saved_game->write(troop); - saved_game->write(lastPathAngles); - saved_game->write<>(stats); - saved_game->write(aimErrorDebounceTime); - saved_game->write(lastAimErrorYaw); - saved_game->write(lastAimErrorPitch); - saved_game->write(aimOfs); - saved_game->write(currentAim); - saved_game->write(currentAggression); - saved_game->write(scriptFlags); - saved_game->write(desiredSpeed); - saved_game->write(currentSpeed); - saved_game->write(last_forwardmove); - saved_game->write(last_rightmove); - saved_game->write(lastClearOrigin); - saved_game->write(shoveCount); - saved_game->write(blockedDebounceTime); - saved_game->write(blockedEntity); - saved_game->write(blockedTargetPosition); - saved_game->write(blockedTargetEntity); - saved_game->write(jumpDest); - saved_game->write(jumpTarget); - saved_game->write(jumpMaxXYDist); - saved_game->write(jumpMazZDist); - saved_game->write(jumpSide); - saved_game->write(jumpTime); - saved_game->write(jumpBackupTime); - saved_game->write(jumpNextCheckTime); - saved_game->write(combatPoint); - saved_game->write(lastFailedCombatPoint); - saved_game->write(movementSpeech); - saved_game->write(movementSpeechChance); - saved_game->write(nextBStateThink); - saved_game->write<>(last_ucmd); - saved_game->write(combatMove); - saved_game->write(goalRadius); - saved_game->write(pauseTime); - saved_game->write(standTime); - saved_game->write(localState); - saved_game->write(squadState); - saved_game->write(confusionTime); - saved_game->write(charmedTime); - saved_game->write(controlledTime); - saved_game->write(surrenderTime); - saved_game->write(kneelTime); - saved_game->write(enemyLaggedPos); - saved_game->write(watchTarget); - saved_game->write(ffireCount); - saved_game->write(ffireDebounce); - saved_game->write(ffireFadeDebounce); -} - -void gNPC_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(timeOfDeath); - saved_game->read(touchedByPlayer); - saved_game->read(enemyLastVisibility); - saved_game->read(aimTime); - saved_game->read(desiredYaw); - saved_game->read(desiredPitch); - saved_game->read(lockedDesiredYaw); - saved_game->read(lockedDesiredPitch); - saved_game->read(aimingBeam); - saved_game->read(enemyLastSeenLocation); - saved_game->read(enemyLastSeenTime); - saved_game->read(enemyLastHeardLocation); - saved_game->read(enemyLastHeardTime); - saved_game->read(lastAlertID); - saved_game->read(eFlags); - saved_game->read(aiFlags); - saved_game->read(currentAmmo); - saved_game->read(shotTime); - saved_game->read(burstCount); - saved_game->read(burstMin); - -#ifdef BASE_SAVE_COMPAT - saved_game->read(burstMean); -#endif - - saved_game->read(burstMax); - saved_game->read(burstSpacing); - saved_game->read(attackHold); - saved_game->read(attackHoldTime); - saved_game->read(shootAngles); - saved_game->read(rank); - saved_game->read(behaviorState); - saved_game->read(defaultBehavior); - saved_game->read(tempBehavior); - saved_game->read(ignorePain); - saved_game->read(duckDebounceTime); - saved_game->read(walkDebounceTime); - saved_game->read(enemyCheckDebounceTime); - saved_game->read(investigateDebounceTime); - saved_game->read(investigateCount); - saved_game->read(investigateGoal); - saved_game->read(investigateSoundDebounceTime); - saved_game->read(greetingDebounceTime); - saved_game->read(eventOwner); - saved_game->read(coverTarg); - saved_game->read(jumpState); - saved_game->read(followDist); - saved_game->read(tempGoal); - saved_game->read(goalEntity); - saved_game->read(lastGoalEntity); - saved_game->read(eventualGoal); - saved_game->read(captureGoal); - saved_game->read(defendEnt); - saved_game->read(greetEnt); - saved_game->read(goalTime); - saved_game->read(straightToGoal); - saved_game->read(distToGoal); - saved_game->read(navTime); - saved_game->read(blockingEntNum); - saved_game->read(blockedSpeechDebounceTime); - saved_game->read(homeWp); - saved_game->read(avoidSide); - saved_game->read(leaderAvoidSide); - saved_game->read(lastAvoidSteerSide); - saved_game->read(lastAvoidSteerSideDebouncer); - saved_game->read(group); - saved_game->read(troop); - saved_game->read(lastPathAngles); - saved_game->read<>(stats); - saved_game->read(aimErrorDebounceTime); - saved_game->read(lastAimErrorYaw); - saved_game->read(lastAimErrorPitch); - saved_game->read(aimOfs); - saved_game->read(currentAim); - saved_game->read(currentAggression); - saved_game->read(scriptFlags); - saved_game->read(desiredSpeed); - saved_game->read(currentSpeed); - saved_game->read(last_forwardmove); - saved_game->read(last_rightmove); - saved_game->read(lastClearOrigin); - saved_game->read(shoveCount); - saved_game->read(blockedDebounceTime); - saved_game->read(blockedEntity); - saved_game->read(blockedTargetPosition); - saved_game->read(blockedTargetEntity); - saved_game->read(jumpDest); - saved_game->read(jumpTarget); - saved_game->read(jumpMaxXYDist); - saved_game->read(jumpMazZDist); - saved_game->read(jumpSide); - saved_game->read(jumpTime); - saved_game->read(jumpBackupTime); - saved_game->read(jumpNextCheckTime); - saved_game->read(combatPoint); - saved_game->read(lastFailedCombatPoint); - saved_game->read(movementSpeech); - saved_game->read(movementSpeechChance); - saved_game->read(nextBStateThink); - saved_game->read<>(last_ucmd); - saved_game->read(combatMove); - saved_game->read(goalRadius); - saved_game->read(pauseTime); - saved_game->read(standTime); - saved_game->read(localState); - saved_game->read(squadState); - saved_game->read(confusionTime); - saved_game->read(charmedTime); - saved_game->read(controlledTime); - saved_game->read(surrenderTime); - saved_game->read(kneelTime); - saved_game->read(enemyLaggedPos); - saved_game->read(watchTarget); - saved_game->read(ffireCount); - saved_game->read(ffireDebounce); - saved_game->read(ffireFadeDebounce); -} diff --git a/code/game/b_public.h b/code/game/b_public.h index 95a33a7913..3b3d52e46a 100644 --- a/code/game/b_public.h +++ b/code/game/b_public.h @@ -158,10 +158,50 @@ typedef struct gNPCstats_e void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(aggression); + saved_game->write(aim); + saved_game->write(earshot); + saved_game->write(evasion); + saved_game->write(hfov); + saved_game->write(intelligence); + saved_game->write(move); + saved_game->write(reactions); + saved_game->write(shootDistance); + saved_game->write(vfov); + saved_game->write(vigilance); + saved_game->write(visrange); + saved_game->write(runSpeed); + saved_game->write(walkSpeed); + saved_game->write(yawSpeed); + saved_game->write(health); + saved_game->write(acceleration); + saved_game->write(sex); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(aggression); + saved_game->read(aim); + saved_game->read(earshot); + saved_game->read(evasion); + saved_game->read(hfov); + saved_game->read(intelligence); + saved_game->read(move); + saved_game->read(reactions); + saved_game->read(shootDistance); + saved_game->read(vfov); + saved_game->read(vigilance); + saved_game->read(visrange); + saved_game->read(runSpeed); + saved_game->read(walkSpeed); + saved_game->read(yawSpeed); + saved_game->read(health); + saved_game->read(acceleration); + saved_game->read(sex); + } } gNPCstats_t; @@ -342,10 +382,246 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(timeOfDeath); + saved_game->write(touchedByPlayer); + saved_game->write(enemyLastVisibility); + saved_game->write(aimTime); + saved_game->write(desiredYaw); + saved_game->write(desiredPitch); + saved_game->write(lockedDesiredYaw); + saved_game->write(lockedDesiredPitch); + saved_game->write(aimingBeam); + saved_game->write(enemyLastSeenLocation); + saved_game->write(enemyLastSeenTime); + saved_game->write(enemyLastHeardLocation); + saved_game->write(enemyLastHeardTime); + saved_game->write(lastAlertID); + saved_game->write(eFlags); + saved_game->write(aiFlags); + saved_game->write(currentAmmo); + saved_game->write(shotTime); + saved_game->write(burstCount); + saved_game->write(burstMin); + +#ifdef BASE_SAVE_COMPAT + saved_game->write(burstMean); +#endif // BASE_SAVE_COMPAT + + saved_game->write(burstMax); + saved_game->write(burstSpacing); + saved_game->write(attackHold); + saved_game->write(attackHoldTime); + saved_game->write(shootAngles); + saved_game->write(rank); + saved_game->write(behaviorState); + saved_game->write(defaultBehavior); + saved_game->write(tempBehavior); + saved_game->write(ignorePain); + saved_game->write(duckDebounceTime); + saved_game->write(walkDebounceTime); + saved_game->write(enemyCheckDebounceTime); + saved_game->write(investigateDebounceTime); + saved_game->write(investigateCount); + saved_game->write(investigateGoal); + saved_game->write(investigateSoundDebounceTime); + saved_game->write(greetingDebounceTime); + saved_game->write(eventOwner); + saved_game->write(coverTarg); + saved_game->write(jumpState); + saved_game->write(followDist); + saved_game->write(tempGoal); + saved_game->write(goalEntity); + saved_game->write(lastGoalEntity); + saved_game->write(eventualGoal); + saved_game->write(captureGoal); + saved_game->write(defendEnt); + saved_game->write(greetEnt); + saved_game->write(goalTime); + saved_game->write(straightToGoal); + saved_game->write(distToGoal); + saved_game->write(navTime); + saved_game->write(blockingEntNum); + saved_game->write(blockedSpeechDebounceTime); + saved_game->write(homeWp); + saved_game->write(avoidSide); + saved_game->write(leaderAvoidSide); + saved_game->write(lastAvoidSteerSide); + saved_game->write(lastAvoidSteerSideDebouncer); + saved_game->write(group); + saved_game->write(troop); + saved_game->write(lastPathAngles); + saved_game->write<>(stats); + saved_game->write(aimErrorDebounceTime); + saved_game->write(lastAimErrorYaw); + saved_game->write(lastAimErrorPitch); + saved_game->write(aimOfs); + saved_game->write(currentAim); + saved_game->write(currentAggression); + saved_game->write(scriptFlags); + saved_game->write(desiredSpeed); + saved_game->write(currentSpeed); + saved_game->write(last_forwardmove); + saved_game->write(last_rightmove); + saved_game->write(lastClearOrigin); + saved_game->write(shoveCount); + saved_game->write(blockedDebounceTime); + saved_game->write(blockedEntity); + saved_game->write(blockedTargetPosition); + saved_game->write(blockedTargetEntity); + saved_game->write(jumpDest); + saved_game->write(jumpTarget); + saved_game->write(jumpMaxXYDist); + saved_game->write(jumpMazZDist); + saved_game->write(jumpSide); + saved_game->write(jumpTime); + saved_game->write(jumpBackupTime); + saved_game->write(jumpNextCheckTime); + saved_game->write(combatPoint); + saved_game->write(lastFailedCombatPoint); + saved_game->write(movementSpeech); + saved_game->write(movementSpeechChance); + saved_game->write(nextBStateThink); + saved_game->write<>(last_ucmd); + saved_game->write(combatMove); + saved_game->write(goalRadius); + saved_game->write(pauseTime); + saved_game->write(standTime); + saved_game->write(localState); + saved_game->write(squadState); + saved_game->write(confusionTime); + saved_game->write(charmedTime); + saved_game->write(controlledTime); + saved_game->write(surrenderTime); + saved_game->write(kneelTime); + saved_game->write(enemyLaggedPos); + saved_game->write(watchTarget); + saved_game->write(ffireCount); + saved_game->write(ffireDebounce); + saved_game->write(ffireFadeDebounce); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(timeOfDeath); + saved_game->read(touchedByPlayer); + saved_game->read(enemyLastVisibility); + saved_game->read(aimTime); + saved_game->read(desiredYaw); + saved_game->read(desiredPitch); + saved_game->read(lockedDesiredYaw); + saved_game->read(lockedDesiredPitch); + saved_game->read(aimingBeam); + saved_game->read(enemyLastSeenLocation); + saved_game->read(enemyLastSeenTime); + saved_game->read(enemyLastHeardLocation); + saved_game->read(enemyLastHeardTime); + saved_game->read(lastAlertID); + saved_game->read(eFlags); + saved_game->read(aiFlags); + saved_game->read(currentAmmo); + saved_game->read(shotTime); + saved_game->read(burstCount); + saved_game->read(burstMin); + +#ifdef BASE_SAVE_COMPAT + saved_game->read(burstMean); +#endif // BASE_SAVE_COMPAT + + saved_game->read(burstMax); + saved_game->read(burstSpacing); + saved_game->read(attackHold); + saved_game->read(attackHoldTime); + saved_game->read(shootAngles); + saved_game->read(rank); + saved_game->read(behaviorState); + saved_game->read(defaultBehavior); + saved_game->read(tempBehavior); + saved_game->read(ignorePain); + saved_game->read(duckDebounceTime); + saved_game->read(walkDebounceTime); + saved_game->read(enemyCheckDebounceTime); + saved_game->read(investigateDebounceTime); + saved_game->read(investigateCount); + saved_game->read(investigateGoal); + saved_game->read(investigateSoundDebounceTime); + saved_game->read(greetingDebounceTime); + saved_game->read(eventOwner); + saved_game->read(coverTarg); + saved_game->read(jumpState); + saved_game->read(followDist); + saved_game->read(tempGoal); + saved_game->read(goalEntity); + saved_game->read(lastGoalEntity); + saved_game->read(eventualGoal); + saved_game->read(captureGoal); + saved_game->read(defendEnt); + saved_game->read(greetEnt); + saved_game->read(goalTime); + saved_game->read(straightToGoal); + saved_game->read(distToGoal); + saved_game->read(navTime); + saved_game->read(blockingEntNum); + saved_game->read(blockedSpeechDebounceTime); + saved_game->read(homeWp); + saved_game->read(avoidSide); + saved_game->read(leaderAvoidSide); + saved_game->read(lastAvoidSteerSide); + saved_game->read(lastAvoidSteerSideDebouncer); + saved_game->read(group); + saved_game->read(troop); + saved_game->read(lastPathAngles); + saved_game->read<>(stats); + saved_game->read(aimErrorDebounceTime); + saved_game->read(lastAimErrorYaw); + saved_game->read(lastAimErrorPitch); + saved_game->read(aimOfs); + saved_game->read(currentAim); + saved_game->read(currentAggression); + saved_game->read(scriptFlags); + saved_game->read(desiredSpeed); + saved_game->read(currentSpeed); + saved_game->read(last_forwardmove); + saved_game->read(last_rightmove); + saved_game->read(lastClearOrigin); + saved_game->read(shoveCount); + saved_game->read(blockedDebounceTime); + saved_game->read(blockedEntity); + saved_game->read(blockedTargetPosition); + saved_game->read(blockedTargetEntity); + saved_game->read(jumpDest); + saved_game->read(jumpTarget); + saved_game->read(jumpMaxXYDist); + saved_game->read(jumpMazZDist); + saved_game->read(jumpSide); + saved_game->read(jumpTime); + saved_game->read(jumpBackupTime); + saved_game->read(jumpNextCheckTime); + saved_game->read(combatPoint); + saved_game->read(lastFailedCombatPoint); + saved_game->read(movementSpeech); + saved_game->read(movementSpeechChance); + saved_game->read(nextBStateThink); + saved_game->read<>(last_ucmd); + saved_game->read(combatMove); + saved_game->read(goalRadius); + saved_game->read(pauseTime); + saved_game->read(standTime); + saved_game->read(localState); + saved_game->read(squadState); + saved_game->read(confusionTime); + saved_game->read(charmedTime); + saved_game->read(controlledTime); + saved_game->read(surrenderTime); + saved_game->read(kneelTime); + saved_game->read(enemyLaggedPos); + saved_game->read(watchTarget); + saved_game->read(ffireCount); + saved_game->read(ffireDebounce); + saved_game->read(ffireFadeDebounce); + } } gNPC_t; diff --git a/code/game/bg_public.cpp b/code/game/bg_public.cpp deleted file mode 100644 index 6eacc785e0..0000000000 --- a/code/game/bg_public.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include "bg_public.h" -#include "qcommon/ojk_i_saved_game.h" - - -void animation_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(firstFrame); - saved_game->write(numFrames); - saved_game->write(frameLerp); - saved_game->write(loopFrames); - saved_game->write(glaIndex); -} - -void animation_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(firstFrame); - saved_game->read(numFrames); - saved_game->read(frameLerp); - saved_game->read(loopFrames); - saved_game->read(glaIndex); -} - -void animevent_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(eventType); - saved_game->write(modelOnly); - saved_game->write(glaIndex); - saved_game->write(keyFrame); - saved_game->write(eventData); - saved_game->write(stringData); -} - -void animevent_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(eventType); - saved_game->read(modelOnly); - saved_game->read(glaIndex); - saved_game->read(keyFrame); - saved_game->read(eventData); - saved_game->read(stringData); -} diff --git a/code/game/bg_public.h b/code/game/bg_public.h index dff6eb80de..d520cc84ed 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -464,10 +464,24 @@ typedef struct animation_s { void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(firstFrame); + saved_game->write(numFrames); + saved_game->write(frameLerp); + saved_game->write(loopFrames); + saved_game->write(glaIndex); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(firstFrame); + saved_game->read(numFrames); + saved_game->read(frameLerp); + saved_game->read(loopFrames); + saved_game->read(glaIndex); + } } animation_t; #define MAX_ANIM_FILES 16 @@ -532,10 +546,26 @@ typedef struct animevent_s void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(eventType); + saved_game->write(modelOnly); + saved_game->write(glaIndex); + saved_game->write(keyFrame); + saved_game->write(eventData); + saved_game->write(stringData); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(eventType); + saved_game->read(modelOnly); + saved_game->read(glaIndex); + saved_game->read(keyFrame); + saved_game->read(eventData); + saved_game->read(stringData); + } } animevent_t; typedef enum diff --git a/code/game/g_local.cpp b/code/game/g_local.cpp deleted file mode 100644 index 7758a88cc8..0000000000 --- a/code/game/g_local.cpp +++ /dev/null @@ -1,101 +0,0 @@ -#include "g_local.h" -#include "qcommon/ojk_i_saved_game.h" - - -void animFileSet_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(filename); - saved_game->write<>(animations); - saved_game->write<>(torsoAnimEvents); - saved_game->write<>(legsAnimEvents); - saved_game->write(torsoAnimEventCount); - saved_game->write(legsAnimEventCount); -} - -void animFileSet_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(filename); - saved_game->read<>(animations); - saved_game->read<>(torsoAnimEvents); - saved_game->read<>(legsAnimEvents); - saved_game->read(torsoAnimEventCount); - saved_game->read(legsAnimEventCount); -} - - -void alertEvent_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(position); - saved_game->write(radius); - saved_game->write(level); - saved_game->write(type); - saved_game->write(owner); - saved_game->write(light); - saved_game->write(addLight); - saved_game->write(ID); - saved_game->write(timestamp); - saved_game->write(onGround); -} - -void alertEvent_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(position); - saved_game->read(radius); - saved_game->read(level); - saved_game->read(type); - saved_game->read(owner); - saved_game->read(light); - saved_game->read(addLight); - saved_game->read(ID); - saved_game->read(timestamp); - saved_game->read(onGround); -} - - -void level_locals_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(clients); - saved_game->write(maxclients); - saved_game->write(framenum); - saved_game->write(time); - saved_game->write(previousTime); - saved_game->write(globalTime); - saved_game->write(mapname); - saved_game->write(locationLinked); - saved_game->write(locationHead); - saved_game->write<>(alertEvents); - saved_game->write(numAlertEvents); - saved_game->write(curAlertID); - saved_game->write<>(groups); - saved_game->write<>(knownAnimFileSets); - saved_game->write(numKnownAnimFileSets); - saved_game->write(worldFlags); - saved_game->write(dmState); -} - -void level_locals_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(clients); - saved_game->read(maxclients); - saved_game->read(framenum); - saved_game->read(time); - saved_game->read(previousTime); - saved_game->read(globalTime); - saved_game->read(mapname); - saved_game->read(locationLinked); - saved_game->read(locationHead); - saved_game->read<>(alertEvents); - saved_game->read(numAlertEvents); - saved_game->read(curAlertID); - saved_game->read<>(groups); - saved_game->read<>(knownAnimFileSets); - saved_game->read(numKnownAnimFileSets); - saved_game->read(worldFlags); - saved_game->read(dmState); -} diff --git a/code/game/g_local.h b/code/game/g_local.h index 17c8b338d7..fc29d572fa 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -99,10 +99,26 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(filename); + saved_game->write<>(animations); + saved_game->write<>(torsoAnimEvents); + saved_game->write<>(legsAnimEvents); + saved_game->write(torsoAnimEventCount); + saved_game->write(legsAnimEventCount); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(filename); + saved_game->read<>(animations); + saved_game->read<>(torsoAnimEvents); + saved_game->read<>(legsAnimEvents); + saved_game->read(torsoAnimEventCount); + saved_game->read(legsAnimEventCount); + } } animFileSet_t; extern stringID_table_t animTable [MAX_ANIMATIONS+1]; @@ -167,10 +183,34 @@ typedef struct alertEvent_s void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(position); + saved_game->write(radius); + saved_game->write(level); + saved_game->write(type); + saved_game->write(owner); + saved_game->write(light); + saved_game->write(addLight); + saved_game->write(ID); + saved_game->write(timestamp); + saved_game->write(onGround); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(position); + saved_game->read(radius); + saved_game->read(level); + saved_game->read(type); + saved_game->read(owner); + saved_game->read(light); + saved_game->read(addLight); + saved_game->read(ID); + saved_game->read(timestamp); + saved_game->read(onGround); + } } alertEvent_t; // @@ -257,10 +297,48 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(clients); + saved_game->write(maxclients); + saved_game->write(framenum); + saved_game->write(time); + saved_game->write(previousTime); + saved_game->write(globalTime); + saved_game->write(mapname); + saved_game->write(locationLinked); + saved_game->write(locationHead); + saved_game->write<>(alertEvents); + saved_game->write(numAlertEvents); + saved_game->write(curAlertID); + saved_game->write<>(groups); + saved_game->write<>(knownAnimFileSets); + saved_game->write(numKnownAnimFileSets); + saved_game->write(worldFlags); + saved_game->write(dmState); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(clients); + saved_game->read(maxclients); + saved_game->read(framenum); + saved_game->read(time); + saved_game->read(previousTime); + saved_game->read(globalTime); + saved_game->read(mapname); + saved_game->read(locationLinked); + saved_game->read(locationHead); + saved_game->read<>(alertEvents); + saved_game->read(numAlertEvents); + saved_game->read(curAlertID); + saved_game->read<>(groups); + saved_game->read<>(knownAnimFileSets); + saved_game->read(numKnownAnimFileSets); + saved_game->read(worldFlags); + saved_game->read(dmState); + } } level_locals_t; extern level_locals_t level; diff --git a/code/game/g_shared.cpp b/code/game/g_shared.cpp deleted file mode 100644 index 9fe0920217..0000000000 --- a/code/game/g_shared.cpp +++ /dev/null @@ -1,816 +0,0 @@ -#include "g_local.h" -#include "g_shared.h" -#include "qcommon/ojk_i_saved_game.h" - - -void clientInfo_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(infoValid); - saved_game->write(name); - saved_game->write(team); - saved_game->write(score); - saved_game->write(handicap); - saved_game->write(legsModel); - saved_game->write(legsSkin); - saved_game->write(torsoModel); - saved_game->write(torsoSkin); - saved_game->write(headModel); - saved_game->write(headSkin); - saved_game->write(animFileIndex); - saved_game->write(sounds); - saved_game->write(customBasicSoundDir); - saved_game->write(customCombatSoundDir); - saved_game->write(customExtraSoundDir); - saved_game->write(customJediSoundDir); -} - -void clientInfo_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(infoValid); - saved_game->read(name); - saved_game->read(team); - saved_game->read(score); - saved_game->read(handicap); - saved_game->read(legsModel); - saved_game->read(legsSkin); - saved_game->read(torsoModel); - saved_game->read(torsoSkin); - saved_game->read(headModel); - saved_game->read(headSkin); - saved_game->read(animFileIndex); - saved_game->read(sounds); - saved_game->read(customBasicSoundDir); - saved_game->read(customCombatSoundDir); - saved_game->read(customExtraSoundDir); - saved_game->read(customJediSoundDir); -} - - -void renderInfo_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(legsModelName); - saved_game->write(torsoModelName); - saved_game->write(headModelName); - saved_game->write(headYawRangeLeft); - saved_game->write(headYawRangeRight); - saved_game->write(headPitchRangeUp); - saved_game->write(headPitchRangeDown); - saved_game->write(torsoYawRangeLeft); - saved_game->write(torsoYawRangeRight); - saved_game->write(torsoPitchRangeUp); - saved_game->write(torsoPitchRangeDown); - saved_game->write(legsFrame); - saved_game->write(torsoFrame); - saved_game->write(legsFpsMod); - saved_game->write(torsoFpsMod); - saved_game->write(customRGBA); - saved_game->write(boneIndex1); - saved_game->write(boneIndex2); - saved_game->write(boneIndex3); - saved_game->write(boneIndex4); - saved_game->write(boneOrient); - saved_game->write(boneAngles1); - saved_game->write(boneAngles2); - saved_game->write(boneAngles3); - saved_game->write(boneAngles4); - saved_game->write(renderFlags); - saved_game->write(muzzlePoint); - saved_game->write(muzzleDir); - saved_game->write(muzzlePointOld); - saved_game->write(muzzleDirOld); - saved_game->write(mPCalcTime); - saved_game->write(lockYaw); - saved_game->write(headPoint); - saved_game->write(headAngles); - saved_game->write(handRPoint); - saved_game->write(handLPoint); - saved_game->write(crotchPoint); - saved_game->write(footRPoint); - saved_game->write(footLPoint); - saved_game->write(torsoPoint); - saved_game->write(torsoAngles); - saved_game->write(eyePoint); - saved_game->write(eyeAngles); - saved_game->write(lookTarget); - saved_game->write(lookMode); - saved_game->write(lookTargetClearTime); - saved_game->write(lastVoiceVolume); - saved_game->write(lastHeadAngles); - saved_game->write(headBobAngles); - saved_game->write(targetHeadBobAngles); - saved_game->write(lookingDebounceTime); - saved_game->write(legsYaw); -} - -void renderInfo_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(legsModelName); - saved_game->read(torsoModelName); - saved_game->read(headModelName); - saved_game->read(headYawRangeLeft); - saved_game->read(headYawRangeRight); - saved_game->read(headPitchRangeUp); - saved_game->read(headPitchRangeDown); - saved_game->read(torsoYawRangeLeft); - saved_game->read(torsoYawRangeRight); - saved_game->read(torsoPitchRangeUp); - saved_game->read(torsoPitchRangeDown); - saved_game->read(legsFrame); - saved_game->read(torsoFrame); - saved_game->read(legsFpsMod); - saved_game->read(torsoFpsMod); - saved_game->read(customRGBA); - saved_game->read(boneIndex1); - saved_game->read(boneIndex2); - saved_game->read(boneIndex3); - saved_game->read(boneIndex4); - saved_game->read(boneOrient); - saved_game->read(boneAngles1); - saved_game->read(boneAngles2); - saved_game->read(boneAngles3); - saved_game->read(boneAngles4); - saved_game->read(renderFlags); - saved_game->read(muzzlePoint); - saved_game->read(muzzleDir); - saved_game->read(muzzlePointOld); - saved_game->read(muzzleDirOld); - saved_game->read(mPCalcTime); - saved_game->read(lockYaw); - saved_game->read(headPoint); - saved_game->read(headAngles); - saved_game->read(handRPoint); - saved_game->read(handLPoint); - saved_game->read(crotchPoint); - saved_game->read(footRPoint); - saved_game->read(footLPoint); - saved_game->read(torsoPoint); - saved_game->read(torsoAngles); - saved_game->read(eyePoint); - saved_game->read(eyeAngles); - saved_game->read(lookTarget); - saved_game->read(lookMode); - saved_game->read(lookTargetClearTime); - saved_game->read(lastVoiceVolume); - saved_game->read(lastHeadAngles); - saved_game->read(headBobAngles); - saved_game->read(targetHeadBobAngles); - saved_game->read(lookingDebounceTime); - saved_game->read(legsYaw); -} - -void playerTeamState_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(state); - saved_game->write(captures); - saved_game->write(basedefense); - saved_game->write(carrierdefense); - saved_game->write(flagrecovery); - saved_game->write(fragcarrier); - saved_game->write(assists); - saved_game->write(lasthurtcarrier); - saved_game->write(lastreturnedflag); - saved_game->write(flagsince); - saved_game->write(lastfraggedcarrier); -} - -void playerTeamState_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(state); - saved_game->read(captures); - saved_game->read(basedefense); - saved_game->read(carrierdefense); - saved_game->read(flagrecovery); - saved_game->read(fragcarrier); - saved_game->read(assists); - saved_game->read(lasthurtcarrier); - saved_game->read(lastreturnedflag); - saved_game->read(flagsince); - saved_game->read(lastfraggedcarrier); -} - - -void objectives_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(display); - saved_game->write(status); -} - -void objectives_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(display); - saved_game->read(status); -} - - -void missionStats_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(secretsFound); - saved_game->write(totalSecrets); - saved_game->write(shotsFired); - saved_game->write(hits); - saved_game->write(enemiesSpawned); - saved_game->write(enemiesKilled); - saved_game->write(saberThrownCnt); - saved_game->write(saberBlocksCnt); - saved_game->write(legAttacksCnt); - saved_game->write(armAttacksCnt); - saved_game->write(torsoAttacksCnt); - saved_game->write(otherAttacksCnt); - saved_game->write(forceUsed); - saved_game->write(weaponUsed); -} - -void missionStats_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(secretsFound); - saved_game->read(totalSecrets); - saved_game->read(shotsFired); - saved_game->read(hits); - saved_game->read(enemiesSpawned); - saved_game->read(enemiesKilled); - saved_game->read(saberThrownCnt); - saved_game->read(saberBlocksCnt); - saved_game->read(legAttacksCnt); - saved_game->read(armAttacksCnt); - saved_game->read(torsoAttacksCnt); - saved_game->read(otherAttacksCnt); - saved_game->read(forceUsed); - saved_game->read(weaponUsed); -} - - -void clientSession_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(missionObjectivesShown); - saved_game->write(sessionTeam); - saved_game->write<>(mission_objectives); - saved_game->write<>(missionStats); -} - -void clientSession_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(missionObjectivesShown); - saved_game->read(sessionTeam); - saved_game->read<>(mission_objectives); - saved_game->read<>(missionStats); -} - - -void clientPersistant_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(connected); - saved_game->write<>(lastCommand); - saved_game->write(netname); - saved_game->write(maxHealth); - saved_game->write(enterTime); - saved_game->write(cmd_angles); - saved_game->write<>(teamState); -} - -void clientPersistant_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(connected); - saved_game->read<>(lastCommand); - saved_game->read(netname); - saved_game->read(maxHealth); - saved_game->read(enterTime); - saved_game->read(cmd_angles); - saved_game->read<>(teamState); -} - - -void gclient_s::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write<>(ps); - saved_game->write<>(pers); - saved_game->write<>(sess); - saved_game->write(lastCmdTime); - saved_game->write<>(usercmd); - saved_game->write(buttons); - saved_game->write(oldbuttons); - saved_game->write(latched_buttons); - saved_game->write(damage_armor); - saved_game->write(damage_blood); - saved_game->write(damage_from); - saved_game->write(damage_fromWorld); - saved_game->write(noclip); - saved_game->write(forced_forwardmove); - saved_game->write(forced_rightmove); - saved_game->write(respawnTime); - saved_game->write(idleTime); - saved_game->write(airOutTime); - saved_game->write(timeResidual); - saved_game->write(facial_blink); - saved_game->write(facial_timer); - saved_game->write(facial_anim); - saved_game->write<>(clientInfo); - saved_game->write(moveType); - saved_game->write(jetPackTime); - saved_game->write(fireDelay); - saved_game->write(breathPuffTime); - saved_game->write(playerTeam); - saved_game->write(enemyTeam); - saved_game->write(leader); - saved_game->write(NPC_class); - saved_game->write(hiddenDist); - saved_game->write(hiddenDir); - saved_game->write<>(renderInfo); - saved_game->write(dismembered); - saved_game->write(dismemberProbLegs); - saved_game->write(dismemberProbHead); - saved_game->write(dismemberProbArms); - saved_game->write(dismemberProbHands); - saved_game->write(dismemberProbWaist); - saved_game->write(standheight); - saved_game->write(crouchheight); - saved_game->write(poisonDamage); - saved_game->write(poisonTime); - saved_game->write(slopeRecalcTime); - saved_game->write(pushVec); - saved_game->write(pushVecTime); - saved_game->write(noRagTime); - saved_game->write(isRagging); - saved_game->write(overridingBones); - saved_game->write(ragLastOrigin); - saved_game->write(ragLastOriginTime); - saved_game->write(pushEffectFadeTime); - saved_game->write(pushEffectOrigin); - saved_game->write(rocketLockIndex); - saved_game->write(rocketLastValidTime); - saved_game->write(rocketLockTime); - saved_game->write(rocketTargetTime); - saved_game->write(inSpaceSuffocation); - saved_game->write(inSpaceIndex); -} - -void gclient_s::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read<>(ps); - saved_game->read<>(pers); - saved_game->read<>(sess); - saved_game->read(lastCmdTime); - saved_game->read<>(usercmd); - saved_game->read(buttons); - saved_game->read(oldbuttons); - saved_game->read(latched_buttons); - saved_game->read(damage_armor); - saved_game->read(damage_blood); - saved_game->read(damage_from); - saved_game->read(damage_fromWorld); - saved_game->read(noclip); - saved_game->read(forced_forwardmove); - saved_game->read(forced_rightmove); - saved_game->read(respawnTime); - saved_game->read(idleTime); - saved_game->read(airOutTime); - saved_game->read(timeResidual); - saved_game->read(facial_blink); - saved_game->read(facial_timer); - saved_game->read(facial_anim); - saved_game->read<>(clientInfo); - saved_game->read(moveType); - saved_game->read(jetPackTime); - saved_game->read(fireDelay); - saved_game->read(breathPuffTime); - saved_game->read(playerTeam); - saved_game->read(enemyTeam); - saved_game->read(leader); - saved_game->read(NPC_class); - saved_game->read(hiddenDist); - saved_game->read(hiddenDir); - saved_game->read<>(renderInfo); - saved_game->read(dismembered); - saved_game->read(dismemberProbLegs); - saved_game->read(dismemberProbHead); - saved_game->read(dismemberProbArms); - saved_game->read(dismemberProbHands); - saved_game->read(dismemberProbWaist); - saved_game->read(standheight); - saved_game->read(crouchheight); - saved_game->read(poisonDamage); - saved_game->read(poisonTime); - saved_game->read(slopeRecalcTime); - saved_game->read(pushVec); - saved_game->read(pushVecTime); - saved_game->read(noRagTime); - saved_game->read(isRagging); - saved_game->read(overridingBones); - saved_game->read(ragLastOrigin); - saved_game->read(ragLastOriginTime); - saved_game->read(pushEffectFadeTime); - saved_game->read(pushEffectOrigin); - saved_game->read(rocketLockIndex); - saved_game->read(rocketLastValidTime); - saved_game->read(rocketLockTime); - saved_game->read(rocketTargetTime); - saved_game->read(inSpaceSuffocation); - saved_game->read(inSpaceIndex); -} - - -void parms_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(parm); -} - -void parms_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(parm); -} - - -void gentity_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write<>(s); - saved_game->write(client); - saved_game->write(inuse); - saved_game->write(linked); - saved_game->write(svFlags); - saved_game->write(bmodel); - saved_game->write(mins); - saved_game->write(maxs); - saved_game->write(contents); - saved_game->write(absmin); - saved_game->write(absmax); - saved_game->write(currentOrigin); - saved_game->write(currentAngles); - saved_game->write(owner); - saved_game->write<>(ghoul2); - saved_game->write(modelScale); - saved_game->write(classname); - saved_game->write(spawnflags); - saved_game->write(flags); - saved_game->write(model); - saved_game->write(model2); - saved_game->write(freetime); - saved_game->write(eventTime); - saved_game->write(freeAfterEvent); - saved_game->write(physicsBounce); - saved_game->write(clipmask); - saved_game->write(speed); - saved_game->write(resultspeed); - saved_game->write(lastMoveTime); - saved_game->write(movedir); - saved_game->write(lastOrigin); - saved_game->write(lastAngles); - saved_game->write(mass); - saved_game->write(lastImpact); - saved_game->write(watertype); - saved_game->write(waterlevel); - saved_game->write(wupdate); - saved_game->write(prev_waterlevel); - saved_game->write(angle); - saved_game->write(target); - saved_game->write(target2); - saved_game->write(target3); - saved_game->write(target4); - saved_game->write(targetJump); - saved_game->write(targetname); - saved_game->write(team); - saved_game->write(roff); - saved_game->write(roff_ctr); - saved_game->write(next_roff_time); - saved_game->write(fx_time); - saved_game->write(nextthink); - saved_game->write(e_ThinkFunc); - saved_game->write(e_clThinkFunc); - saved_game->write(e_ReachedFunc); - saved_game->write(e_BlockedFunc); - saved_game->write(e_TouchFunc); - saved_game->write(e_UseFunc); - saved_game->write(e_PainFunc); - saved_game->write(e_DieFunc); - saved_game->write(health); - saved_game->write(max_health); - saved_game->write(takedamage); - saved_game->write(material); - saved_game->write(damage); - saved_game->write(dflags); - saved_game->write(splashDamage); - saved_game->write(splashRadius); - saved_game->write(methodOfDeath); - saved_game->write(splashMethodOfDeath); - saved_game->write(locationDamage); - saved_game->write(chain); - saved_game->write(enemy); - saved_game->write(activator); - saved_game->write(teamchain); - saved_game->write(teammaster); - saved_game->write(lastEnemy); - saved_game->write(wait); - saved_game->write(random); - saved_game->write(delay); - saved_game->write(alt_fire); - saved_game->write(count); - saved_game->write(bounceCount); - saved_game->write(fly_sound_debounce_time); - saved_game->write(painDebounceTime); - saved_game->write(disconnectDebounceTime); - saved_game->write(attackDebounceTime); - saved_game->write(pushDebounceTime); - saved_game->write(aimDebounceTime); - saved_game->write(useDebounceTime); - saved_game->write(trigger_formation); - saved_game->write(spawnContents); - saved_game->write(waypoint); - saved_game->write(wayedge); - saved_game->write(lastWaypoint); - saved_game->write(lastInAirTime); - saved_game->write(noWaypointTime); - saved_game->write(combatPoint); - saved_game->write(followPos); - saved_game->write(followPosRecalcTime); - saved_game->write(followPosWaypoint); - saved_game->write(loopAnim); - saved_game->write(startFrame); - saved_game->write(endFrame); - saved_game->write(m_iIcarusID); - saved_game->write(taskID); - saved_game->write(parms); - saved_game->write(behaviorSet); - saved_game->write(script_targetname); - saved_game->write(delayScriptTime); - saved_game->write(soundSet); - saved_game->write(setTime); - saved_game->write(cameraGroup); - saved_game->write(noDamageTeam); - saved_game->write(playerModel); - saved_game->write(weaponModel); - saved_game->write(handRBolt); - saved_game->write(handLBolt); - saved_game->write(headBolt); - saved_game->write(cervicalBolt); - saved_game->write(chestBolt); - saved_game->write(gutBolt); - saved_game->write(torsoBolt); - saved_game->write(crotchBolt); - saved_game->write(motionBolt); - saved_game->write(kneeLBolt); - saved_game->write(kneeRBolt); - saved_game->write(elbowLBolt); - saved_game->write(elbowRBolt); - saved_game->write(footLBolt); - saved_game->write(footRBolt); - saved_game->write(faceBone); - saved_game->write(craniumBone); - saved_game->write(cervicalBone); - saved_game->write(thoracicBone); - saved_game->write(upperLumbarBone); - saved_game->write(lowerLumbarBone); - saved_game->write(hipsBone); - saved_game->write(motionBone); - saved_game->write(rootBone); - saved_game->write(footLBone); - saved_game->write(footRBone); - saved_game->write(humerusRBone); - saved_game->write(genericBone1); - saved_game->write(genericBone2); - saved_game->write(genericBone3); - saved_game->write(genericBolt1); - saved_game->write(genericBolt2); - saved_game->write(genericBolt3); - saved_game->write(genericBolt4); - saved_game->write(genericBolt5); - saved_game->write(cinematicModel); - saved_game->write(m_pVehicle); - saved_game->write(NPC); - saved_game->write(ownername); - saved_game->write(cantHitEnemyCounter); - saved_game->write(NPC_type); - saved_game->write(NPC_targetname); - saved_game->write(NPC_target); - saved_game->write(moverState); - saved_game->write(soundPos1); - saved_game->write(sound1to2); - saved_game->write(sound2to1); - saved_game->write(soundPos2); - saved_game->write(soundLoop); - saved_game->write(nextTrain); - saved_game->write(prevTrain); - saved_game->write(pos1); - saved_game->write(pos2); - saved_game->write(pos3); - saved_game->write(sounds); - saved_game->write(closetarget); - saved_game->write(opentarget); - saved_game->write(paintarget); - saved_game->write(lockCount); - saved_game->write(radius); - saved_game->write(wpIndex); - saved_game->write(noise_index); - saved_game->write(startRGBA); - saved_game->write(finalRGBA); - saved_game->write(item); - saved_game->write(message); - saved_game->write(lightLevel); - saved_game->write(forcePushTime); - saved_game->write(forcePuller); -} - -void gentity_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read<>(s); - saved_game->read(client); - saved_game->read(inuse); - saved_game->read(linked); - saved_game->read(svFlags); - saved_game->read(bmodel); - saved_game->read(mins); - saved_game->read(maxs); - saved_game->read(contents); - saved_game->read(absmin); - saved_game->read(absmax); - saved_game->read(currentOrigin); - saved_game->read(currentAngles); - saved_game->read(owner); - saved_game->read<>(ghoul2); - saved_game->read(modelScale); - saved_game->read(classname); - saved_game->read(spawnflags); - saved_game->read(flags); - saved_game->read(model); - saved_game->read(model2); - saved_game->read(freetime); - saved_game->read(eventTime); - saved_game->read(freeAfterEvent); - saved_game->read(physicsBounce); - saved_game->read(clipmask); - saved_game->read(speed); - saved_game->read(resultspeed); - saved_game->read(lastMoveTime); - saved_game->read(movedir); - saved_game->read(lastOrigin); - saved_game->read(lastAngles); - saved_game->read(mass); - saved_game->read(lastImpact); - saved_game->read(watertype); - saved_game->read(waterlevel); - saved_game->read(wupdate); - saved_game->read(prev_waterlevel); - saved_game->read(angle); - saved_game->read(target); - saved_game->read(target2); - saved_game->read(target3); - saved_game->read(target4); - saved_game->read(targetJump); - saved_game->read(targetname); - saved_game->read(team); - saved_game->read(roff); - saved_game->read(roff_ctr); - saved_game->read(next_roff_time); - saved_game->read(fx_time); - saved_game->read(nextthink); - saved_game->read(e_ThinkFunc); - saved_game->read(e_clThinkFunc); - saved_game->read(e_ReachedFunc); - saved_game->read(e_BlockedFunc); - saved_game->read(e_TouchFunc); - saved_game->read(e_UseFunc); - saved_game->read(e_PainFunc); - saved_game->read(e_DieFunc); - saved_game->read(health); - saved_game->read(max_health); - saved_game->read(takedamage); - saved_game->read(material); - saved_game->read(damage); - saved_game->read(dflags); - saved_game->read(splashDamage); - saved_game->read(splashRadius); - saved_game->read(methodOfDeath); - saved_game->read(splashMethodOfDeath); - saved_game->read(locationDamage); - saved_game->read(chain); - saved_game->read(enemy); - saved_game->read(activator); - saved_game->read(teamchain); - saved_game->read(teammaster); - saved_game->read(lastEnemy); - saved_game->read(wait); - saved_game->read(random); - saved_game->read(delay); - saved_game->read(alt_fire); - saved_game->read(count); - saved_game->read(bounceCount); - saved_game->read(fly_sound_debounce_time); - saved_game->read(painDebounceTime); - saved_game->read(disconnectDebounceTime); - saved_game->read(attackDebounceTime); - saved_game->read(pushDebounceTime); - saved_game->read(aimDebounceTime); - saved_game->read(useDebounceTime); - saved_game->read(trigger_formation); - saved_game->read(spawnContents); - saved_game->read(waypoint); - saved_game->read(wayedge); - saved_game->read(lastWaypoint); - saved_game->read(lastInAirTime); - saved_game->read(noWaypointTime); - saved_game->read(combatPoint); - saved_game->read(followPos); - saved_game->read(followPosRecalcTime); - saved_game->read(followPosWaypoint); - saved_game->read(loopAnim); - saved_game->read(startFrame); - saved_game->read(endFrame); - saved_game->read(m_iIcarusID); - saved_game->read(taskID); - saved_game->read(parms); - saved_game->read(behaviorSet); - saved_game->read(script_targetname); - saved_game->read(delayScriptTime); - saved_game->read(soundSet); - saved_game->read(setTime); - saved_game->read(cameraGroup); - saved_game->read(noDamageTeam); - saved_game->read(playerModel); - saved_game->read(weaponModel); - saved_game->read(handRBolt); - saved_game->read(handLBolt); - saved_game->read(headBolt); - saved_game->read(cervicalBolt); - saved_game->read(chestBolt); - saved_game->read(gutBolt); - saved_game->read(torsoBolt); - saved_game->read(crotchBolt); - saved_game->read(motionBolt); - saved_game->read(kneeLBolt); - saved_game->read(kneeRBolt); - saved_game->read(elbowLBolt); - saved_game->read(elbowRBolt); - saved_game->read(footLBolt); - saved_game->read(footRBolt); - saved_game->read(faceBone); - saved_game->read(craniumBone); - saved_game->read(cervicalBone); - saved_game->read(thoracicBone); - saved_game->read(upperLumbarBone); - saved_game->read(lowerLumbarBone); - saved_game->read(hipsBone); - saved_game->read(motionBone); - saved_game->read(rootBone); - saved_game->read(footLBone); - saved_game->read(footRBone); - saved_game->read(humerusRBone); - saved_game->read(genericBone1); - saved_game->read(genericBone2); - saved_game->read(genericBone3); - saved_game->read(genericBolt1); - saved_game->read(genericBolt2); - saved_game->read(genericBolt3); - saved_game->read(genericBolt4); - saved_game->read(genericBolt5); - saved_game->read(cinematicModel); - saved_game->read(m_pVehicle); - saved_game->read(NPC); - saved_game->read(ownername); - saved_game->read(cantHitEnemyCounter); - saved_game->read(NPC_type); - saved_game->read(NPC_targetname); - saved_game->read(NPC_target); - saved_game->read(moverState); - saved_game->read(soundPos1); - saved_game->read(sound1to2); - saved_game->read(sound2to1); - saved_game->read(soundPos2); - saved_game->read(soundLoop); - saved_game->read(nextTrain); - saved_game->read(prevTrain); - saved_game->read(pos1); - saved_game->read(pos2); - saved_game->read(pos3); - saved_game->read(sounds); - saved_game->read(closetarget); - saved_game->read(opentarget); - saved_game->read(paintarget); - saved_game->read(lockCount); - saved_game->read(radius); - saved_game->read(wpIndex); - saved_game->read(noise_index); - saved_game->read(startRGBA); - saved_game->read(finalRGBA); - saved_game->read(item); - saved_game->read(message); - saved_game->read(lightLevel); - saved_game->read(forcePushTime); - saved_game->read(forcePuller); -} diff --git a/code/game/g_shared.h b/code/game/g_shared.h index d1de2a39d7..94cfc3f11f 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -121,10 +121,48 @@ typedef struct { void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(infoValid); + saved_game->write(name); + saved_game->write(team); + saved_game->write(score); + saved_game->write(handicap); + saved_game->write(legsModel); + saved_game->write(legsSkin); + saved_game->write(torsoModel); + saved_game->write(torsoSkin); + saved_game->write(headModel); + saved_game->write(headSkin); + saved_game->write(animFileIndex); + saved_game->write(sounds); + saved_game->write(customBasicSoundDir); + saved_game->write(customCombatSoundDir); + saved_game->write(customExtraSoundDir); + saved_game->write(customJediSoundDir); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(infoValid); + saved_game->read(name); + saved_game->read(team); + saved_game->read(score); + saved_game->read(handicap); + saved_game->read(legsModel); + saved_game->read(legsSkin); + saved_game->read(torsoModel); + saved_game->read(torsoSkin); + saved_game->read(headModel); + saved_game->read(headSkin); + saved_game->read(animFileIndex); + saved_game->read(sounds); + saved_game->read(customBasicSoundDir); + saved_game->read(customCombatSoundDir); + saved_game->read(customExtraSoundDir); + saved_game->read(customJediSoundDir); + } } clientInfo_t; @@ -249,10 +287,118 @@ typedef struct renderInfo_s void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(legsModelName); + saved_game->write(torsoModelName); + saved_game->write(headModelName); + saved_game->write(headYawRangeLeft); + saved_game->write(headYawRangeRight); + saved_game->write(headPitchRangeUp); + saved_game->write(headPitchRangeDown); + saved_game->write(torsoYawRangeLeft); + saved_game->write(torsoYawRangeRight); + saved_game->write(torsoPitchRangeUp); + saved_game->write(torsoPitchRangeDown); + saved_game->write(legsFrame); + saved_game->write(torsoFrame); + saved_game->write(legsFpsMod); + saved_game->write(torsoFpsMod); + saved_game->write(customRGBA); + saved_game->write(boneIndex1); + saved_game->write(boneIndex2); + saved_game->write(boneIndex3); + saved_game->write(boneIndex4); + saved_game->write(boneOrient); + saved_game->write(boneAngles1); + saved_game->write(boneAngles2); + saved_game->write(boneAngles3); + saved_game->write(boneAngles4); + saved_game->write(renderFlags); + saved_game->write(muzzlePoint); + saved_game->write(muzzleDir); + saved_game->write(muzzlePointOld); + saved_game->write(muzzleDirOld); + saved_game->write(mPCalcTime); + saved_game->write(lockYaw); + saved_game->write(headPoint); + saved_game->write(headAngles); + saved_game->write(handRPoint); + saved_game->write(handLPoint); + saved_game->write(crotchPoint); + saved_game->write(footRPoint); + saved_game->write(footLPoint); + saved_game->write(torsoPoint); + saved_game->write(torsoAngles); + saved_game->write(eyePoint); + saved_game->write(eyeAngles); + saved_game->write(lookTarget); + saved_game->write(lookMode); + saved_game->write(lookTargetClearTime); + saved_game->write(lastVoiceVolume); + saved_game->write(lastHeadAngles); + saved_game->write(headBobAngles); + saved_game->write(targetHeadBobAngles); + saved_game->write(lookingDebounceTime); + saved_game->write(legsYaw); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(legsModelName); + saved_game->read(torsoModelName); + saved_game->read(headModelName); + saved_game->read(headYawRangeLeft); + saved_game->read(headYawRangeRight); + saved_game->read(headPitchRangeUp); + saved_game->read(headPitchRangeDown); + saved_game->read(torsoYawRangeLeft); + saved_game->read(torsoYawRangeRight); + saved_game->read(torsoPitchRangeUp); + saved_game->read(torsoPitchRangeDown); + saved_game->read(legsFrame); + saved_game->read(torsoFrame); + saved_game->read(legsFpsMod); + saved_game->read(torsoFpsMod); + saved_game->read(customRGBA); + saved_game->read(boneIndex1); + saved_game->read(boneIndex2); + saved_game->read(boneIndex3); + saved_game->read(boneIndex4); + saved_game->read(boneOrient); + saved_game->read(boneAngles1); + saved_game->read(boneAngles2); + saved_game->read(boneAngles3); + saved_game->read(boneAngles4); + saved_game->read(renderFlags); + saved_game->read(muzzlePoint); + saved_game->read(muzzleDir); + saved_game->read(muzzlePointOld); + saved_game->read(muzzleDirOld); + saved_game->read(mPCalcTime); + saved_game->read(lockYaw); + saved_game->read(headPoint); + saved_game->read(headAngles); + saved_game->read(handRPoint); + saved_game->read(handLPoint); + saved_game->read(crotchPoint); + saved_game->read(footRPoint); + saved_game->read(footLPoint); + saved_game->read(torsoPoint); + saved_game->read(torsoAngles); + saved_game->read(eyePoint); + saved_game->read(eyeAngles); + saved_game->read(lookTarget); + saved_game->read(lookMode); + saved_game->read(lookTargetClearTime); + saved_game->read(lastVoiceVolume); + saved_game->read(lastHeadAngles); + saved_game->read(headBobAngles); + saved_game->read(targetHeadBobAngles); + saved_game->read(lookingDebounceTime); + saved_game->read(legsYaw); + } } renderInfo_t; // Movement information structure @@ -298,10 +444,36 @@ typedef struct { void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(state); + saved_game->write(captures); + saved_game->write(basedefense); + saved_game->write(carrierdefense); + saved_game->write(flagrecovery); + saved_game->write(fragcarrier); + saved_game->write(assists); + saved_game->write(lasthurtcarrier); + saved_game->write(lastreturnedflag); + saved_game->write(flagsince); + saved_game->write(lastfraggedcarrier); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(state); + saved_game->read(captures); + saved_game->read(basedefense); + saved_game->read(carrierdefense); + saved_game->read(flagrecovery); + saved_game->read(fragcarrier); + saved_game->read(assists); + saved_game->read(lasthurtcarrier); + saved_game->read(lastreturnedflag); + saved_game->read(flagsince); + saved_game->read(lastfraggedcarrier); + } } playerTeamState_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! @@ -312,10 +484,18 @@ typedef struct objectives_s void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(display); + saved_game->write(status); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(display); + saved_game->read(status); + } } objectives_t; // NOTE: This is an arbitrary number greater than our current number of objectives with // some fluff just in case we add more in the future. @@ -341,10 +521,42 @@ typedef struct missionStats_s void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(secretsFound); + saved_game->write(totalSecrets); + saved_game->write(shotsFired); + saved_game->write(hits); + saved_game->write(enemiesSpawned); + saved_game->write(enemiesKilled); + saved_game->write(saberThrownCnt); + saved_game->write(saberBlocksCnt); + saved_game->write(legAttacksCnt); + saved_game->write(armAttacksCnt); + saved_game->write(torsoAttacksCnt); + saved_game->write(otherAttacksCnt); + saved_game->write(forceUsed); + saved_game->write(weaponUsed); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(secretsFound); + saved_game->read(totalSecrets); + saved_game->read(shotsFired); + saved_game->read(hits); + saved_game->read(enemiesSpawned); + saved_game->read(enemiesKilled); + saved_game->read(saberThrownCnt); + saved_game->read(saberBlocksCnt); + saved_game->read(legAttacksCnt); + saved_game->read(armAttacksCnt); + saved_game->read(torsoAttacksCnt); + saved_game->read(otherAttacksCnt); + saved_game->read(forceUsed); + saved_game->read(weaponUsed); + } } missionStats_t; // the auto following clients don't follow a specific client @@ -366,10 +578,22 @@ typedef struct { void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(missionObjectivesShown); + saved_game->write(sessionTeam); + saved_game->write<>(mission_objectives); + saved_game->write<>(missionStats); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(missionObjectivesShown); + saved_game->read(sessionTeam); + saved_game->read<>(mission_objectives); + saved_game->read<>(missionStats); + } } clientSession_t; // client data that stays across multiple respawns, but is cleared @@ -387,10 +611,28 @@ typedef struct { void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(connected); + saved_game->write<>(lastCommand); + saved_game->write(netname); + saved_game->write(maxHealth); + saved_game->write(enterTime); + saved_game->write(cmd_angles); + saved_game->write<>(teamState); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(connected); + saved_game->read<>(lastCommand); + saved_game->read(netname); + saved_game->read(maxHealth); + saved_game->read(enterTime); + saved_game->read(cmd_angles); + saved_game->read<>(teamState); + } } clientPersistant_t; typedef enum { @@ -532,10 +774,134 @@ struct gclient_s { void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write<>(ps); + saved_game->write<>(pers); + saved_game->write<>(sess); + saved_game->write(lastCmdTime); + saved_game->write<>(usercmd); + saved_game->write(buttons); + saved_game->write(oldbuttons); + saved_game->write(latched_buttons); + saved_game->write(damage_armor); + saved_game->write(damage_blood); + saved_game->write(damage_from); + saved_game->write(damage_fromWorld); + saved_game->write(noclip); + saved_game->write(forced_forwardmove); + saved_game->write(forced_rightmove); + saved_game->write(respawnTime); + saved_game->write(idleTime); + saved_game->write(airOutTime); + saved_game->write(timeResidual); + saved_game->write(facial_blink); + saved_game->write(facial_timer); + saved_game->write(facial_anim); + saved_game->write<>(clientInfo); + saved_game->write(moveType); + saved_game->write(jetPackTime); + saved_game->write(fireDelay); + saved_game->write(breathPuffTime); + saved_game->write(playerTeam); + saved_game->write(enemyTeam); + saved_game->write(leader); + saved_game->write(NPC_class); + saved_game->write(hiddenDist); + saved_game->write(hiddenDir); + saved_game->write<>(renderInfo); + saved_game->write(dismembered); + saved_game->write(dismemberProbLegs); + saved_game->write(dismemberProbHead); + saved_game->write(dismemberProbArms); + saved_game->write(dismemberProbHands); + saved_game->write(dismemberProbWaist); + saved_game->write(standheight); + saved_game->write(crouchheight); + saved_game->write(poisonDamage); + saved_game->write(poisonTime); + saved_game->write(slopeRecalcTime); + saved_game->write(pushVec); + saved_game->write(pushVecTime); + saved_game->write(noRagTime); + saved_game->write(isRagging); + saved_game->write(overridingBones); + saved_game->write(ragLastOrigin); + saved_game->write(ragLastOriginTime); + saved_game->write(pushEffectFadeTime); + saved_game->write(pushEffectOrigin); + saved_game->write(rocketLockIndex); + saved_game->write(rocketLastValidTime); + saved_game->write(rocketLockTime); + saved_game->write(rocketTargetTime); + saved_game->write(inSpaceSuffocation); + saved_game->write(inSpaceIndex); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read<>(ps); + saved_game->read<>(pers); + saved_game->read<>(sess); + saved_game->read(lastCmdTime); + saved_game->read<>(usercmd); + saved_game->read(buttons); + saved_game->read(oldbuttons); + saved_game->read(latched_buttons); + saved_game->read(damage_armor); + saved_game->read(damage_blood); + saved_game->read(damage_from); + saved_game->read(damage_fromWorld); + saved_game->read(noclip); + saved_game->read(forced_forwardmove); + saved_game->read(forced_rightmove); + saved_game->read(respawnTime); + saved_game->read(idleTime); + saved_game->read(airOutTime); + saved_game->read(timeResidual); + saved_game->read(facial_blink); + saved_game->read(facial_timer); + saved_game->read(facial_anim); + saved_game->read<>(clientInfo); + saved_game->read(moveType); + saved_game->read(jetPackTime); + saved_game->read(fireDelay); + saved_game->read(breathPuffTime); + saved_game->read(playerTeam); + saved_game->read(enemyTeam); + saved_game->read(leader); + saved_game->read(NPC_class); + saved_game->read(hiddenDist); + saved_game->read(hiddenDir); + saved_game->read<>(renderInfo); + saved_game->read(dismembered); + saved_game->read(dismemberProbLegs); + saved_game->read(dismemberProbHead); + saved_game->read(dismemberProbArms); + saved_game->read(dismemberProbHands); + saved_game->read(dismemberProbWaist); + saved_game->read(standheight); + saved_game->read(crouchheight); + saved_game->read(poisonDamage); + saved_game->read(poisonTime); + saved_game->read(slopeRecalcTime); + saved_game->read(pushVec); + saved_game->read(pushVecTime); + saved_game->read(noRagTime); + saved_game->read(isRagging); + saved_game->read(overridingBones); + saved_game->read(ragLastOrigin); + saved_game->read(ragLastOriginTime); + saved_game->read(pushEffectFadeTime); + saved_game->read(pushEffectOrigin); + saved_game->read(rocketLockIndex); + saved_game->read(rocketLastValidTime); + saved_game->read(rocketLockTime); + saved_game->read(rocketTargetTime); + saved_game->read(inSpaceSuffocation); + saved_game->read(inSpaceIndex); + } }; #define MAX_PARMS 16 @@ -547,10 +913,16 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(parm); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(parm); + } } parms_t; #ifdef GAME_INCLUDE @@ -884,10 +1256,382 @@ Ghoul2 Insert End void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write<>(s); + saved_game->write(client); + saved_game->write(inuse); + saved_game->write(linked); + saved_game->write(svFlags); + saved_game->write(bmodel); + saved_game->write(mins); + saved_game->write(maxs); + saved_game->write(contents); + saved_game->write(absmin); + saved_game->write(absmax); + saved_game->write(currentOrigin); + saved_game->write(currentAngles); + saved_game->write(owner); + saved_game->write<>(ghoul2); + saved_game->write(modelScale); + saved_game->write(classname); + saved_game->write(spawnflags); + saved_game->write(flags); + saved_game->write(model); + saved_game->write(model2); + saved_game->write(freetime); + saved_game->write(eventTime); + saved_game->write(freeAfterEvent); + saved_game->write(physicsBounce); + saved_game->write(clipmask); + saved_game->write(speed); + saved_game->write(resultspeed); + saved_game->write(lastMoveTime); + saved_game->write(movedir); + saved_game->write(lastOrigin); + saved_game->write(lastAngles); + saved_game->write(mass); + saved_game->write(lastImpact); + saved_game->write(watertype); + saved_game->write(waterlevel); + saved_game->write(wupdate); + saved_game->write(prev_waterlevel); + saved_game->write(angle); + saved_game->write(target); + saved_game->write(target2); + saved_game->write(target3); + saved_game->write(target4); + saved_game->write(targetJump); + saved_game->write(targetname); + saved_game->write(team); + saved_game->write(roff); + saved_game->write(roff_ctr); + saved_game->write(next_roff_time); + saved_game->write(fx_time); + saved_game->write(nextthink); + saved_game->write(e_ThinkFunc); + saved_game->write(e_clThinkFunc); + saved_game->write(e_ReachedFunc); + saved_game->write(e_BlockedFunc); + saved_game->write(e_TouchFunc); + saved_game->write(e_UseFunc); + saved_game->write(e_PainFunc); + saved_game->write(e_DieFunc); + saved_game->write(health); + saved_game->write(max_health); + saved_game->write(takedamage); + saved_game->write(material); + saved_game->write(damage); + saved_game->write(dflags); + saved_game->write(splashDamage); + saved_game->write(splashRadius); + saved_game->write(methodOfDeath); + saved_game->write(splashMethodOfDeath); + saved_game->write(locationDamage); + saved_game->write(chain); + saved_game->write(enemy); + saved_game->write(activator); + saved_game->write(teamchain); + saved_game->write(teammaster); + saved_game->write(lastEnemy); + saved_game->write(wait); + saved_game->write(random); + saved_game->write(delay); + saved_game->write(alt_fire); + saved_game->write(count); + saved_game->write(bounceCount); + saved_game->write(fly_sound_debounce_time); + saved_game->write(painDebounceTime); + saved_game->write(disconnectDebounceTime); + saved_game->write(attackDebounceTime); + saved_game->write(pushDebounceTime); + saved_game->write(aimDebounceTime); + saved_game->write(useDebounceTime); + saved_game->write(trigger_formation); + saved_game->write(spawnContents); + saved_game->write(waypoint); + saved_game->write(wayedge); + saved_game->write(lastWaypoint); + saved_game->write(lastInAirTime); + saved_game->write(noWaypointTime); + saved_game->write(combatPoint); + saved_game->write(followPos); + saved_game->write(followPosRecalcTime); + saved_game->write(followPosWaypoint); + saved_game->write(loopAnim); + saved_game->write(startFrame); + saved_game->write(endFrame); + saved_game->write(m_iIcarusID); + saved_game->write(taskID); + saved_game->write(parms); + saved_game->write(behaviorSet); + saved_game->write(script_targetname); + saved_game->write(delayScriptTime); + saved_game->write(soundSet); + saved_game->write(setTime); + saved_game->write(cameraGroup); + saved_game->write(noDamageTeam); + saved_game->write(playerModel); + saved_game->write(weaponModel); + saved_game->write(handRBolt); + saved_game->write(handLBolt); + saved_game->write(headBolt); + saved_game->write(cervicalBolt); + saved_game->write(chestBolt); + saved_game->write(gutBolt); + saved_game->write(torsoBolt); + saved_game->write(crotchBolt); + saved_game->write(motionBolt); + saved_game->write(kneeLBolt); + saved_game->write(kneeRBolt); + saved_game->write(elbowLBolt); + saved_game->write(elbowRBolt); + saved_game->write(footLBolt); + saved_game->write(footRBolt); + saved_game->write(faceBone); + saved_game->write(craniumBone); + saved_game->write(cervicalBone); + saved_game->write(thoracicBone); + saved_game->write(upperLumbarBone); + saved_game->write(lowerLumbarBone); + saved_game->write(hipsBone); + saved_game->write(motionBone); + saved_game->write(rootBone); + saved_game->write(footLBone); + saved_game->write(footRBone); + saved_game->write(humerusRBone); + saved_game->write(genericBone1); + saved_game->write(genericBone2); + saved_game->write(genericBone3); + saved_game->write(genericBolt1); + saved_game->write(genericBolt2); + saved_game->write(genericBolt3); + saved_game->write(genericBolt4); + saved_game->write(genericBolt5); + saved_game->write(cinematicModel); + saved_game->write(m_pVehicle); + saved_game->write(NPC); + saved_game->write(ownername); + saved_game->write(cantHitEnemyCounter); + saved_game->write(NPC_type); + saved_game->write(NPC_targetname); + saved_game->write(NPC_target); + saved_game->write(moverState); + saved_game->write(soundPos1); + saved_game->write(sound1to2); + saved_game->write(sound2to1); + saved_game->write(soundPos2); + saved_game->write(soundLoop); + saved_game->write(nextTrain); + saved_game->write(prevTrain); + saved_game->write(pos1); + saved_game->write(pos2); + saved_game->write(pos3); + saved_game->write(sounds); + saved_game->write(closetarget); + saved_game->write(opentarget); + saved_game->write(paintarget); + saved_game->write(lockCount); + saved_game->write(radius); + saved_game->write(wpIndex); + saved_game->write(noise_index); + saved_game->write(startRGBA); + saved_game->write(finalRGBA); + saved_game->write(item); + saved_game->write(message); + saved_game->write(lightLevel); + saved_game->write(forcePushTime); + saved_game->write(forcePuller); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read<>(s); + saved_game->read(client); + saved_game->read(inuse); + saved_game->read(linked); + saved_game->read(svFlags); + saved_game->read(bmodel); + saved_game->read(mins); + saved_game->read(maxs); + saved_game->read(contents); + saved_game->read(absmin); + saved_game->read(absmax); + saved_game->read(currentOrigin); + saved_game->read(currentAngles); + saved_game->read(owner); + saved_game->read<>(ghoul2); + saved_game->read(modelScale); + saved_game->read(classname); + saved_game->read(spawnflags); + saved_game->read(flags); + saved_game->read(model); + saved_game->read(model2); + saved_game->read(freetime); + saved_game->read(eventTime); + saved_game->read(freeAfterEvent); + saved_game->read(physicsBounce); + saved_game->read(clipmask); + saved_game->read(speed); + saved_game->read(resultspeed); + saved_game->read(lastMoveTime); + saved_game->read(movedir); + saved_game->read(lastOrigin); + saved_game->read(lastAngles); + saved_game->read(mass); + saved_game->read(lastImpact); + saved_game->read(watertype); + saved_game->read(waterlevel); + saved_game->read(wupdate); + saved_game->read(prev_waterlevel); + saved_game->read(angle); + saved_game->read(target); + saved_game->read(target2); + saved_game->read(target3); + saved_game->read(target4); + saved_game->read(targetJump); + saved_game->read(targetname); + saved_game->read(team); + saved_game->read(roff); + saved_game->read(roff_ctr); + saved_game->read(next_roff_time); + saved_game->read(fx_time); + saved_game->read(nextthink); + saved_game->read(e_ThinkFunc); + saved_game->read(e_clThinkFunc); + saved_game->read(e_ReachedFunc); + saved_game->read(e_BlockedFunc); + saved_game->read(e_TouchFunc); + saved_game->read(e_UseFunc); + saved_game->read(e_PainFunc); + saved_game->read(e_DieFunc); + saved_game->read(health); + saved_game->read(max_health); + saved_game->read(takedamage); + saved_game->read(material); + saved_game->read(damage); + saved_game->read(dflags); + saved_game->read(splashDamage); + saved_game->read(splashRadius); + saved_game->read(methodOfDeath); + saved_game->read(splashMethodOfDeath); + saved_game->read(locationDamage); + saved_game->read(chain); + saved_game->read(enemy); + saved_game->read(activator); + saved_game->read(teamchain); + saved_game->read(teammaster); + saved_game->read(lastEnemy); + saved_game->read(wait); + saved_game->read(random); + saved_game->read(delay); + saved_game->read(alt_fire); + saved_game->read(count); + saved_game->read(bounceCount); + saved_game->read(fly_sound_debounce_time); + saved_game->read(painDebounceTime); + saved_game->read(disconnectDebounceTime); + saved_game->read(attackDebounceTime); + saved_game->read(pushDebounceTime); + saved_game->read(aimDebounceTime); + saved_game->read(useDebounceTime); + saved_game->read(trigger_formation); + saved_game->read(spawnContents); + saved_game->read(waypoint); + saved_game->read(wayedge); + saved_game->read(lastWaypoint); + saved_game->read(lastInAirTime); + saved_game->read(noWaypointTime); + saved_game->read(combatPoint); + saved_game->read(followPos); + saved_game->read(followPosRecalcTime); + saved_game->read(followPosWaypoint); + saved_game->read(loopAnim); + saved_game->read(startFrame); + saved_game->read(endFrame); + saved_game->read(m_iIcarusID); + saved_game->read(taskID); + saved_game->read(parms); + saved_game->read(behaviorSet); + saved_game->read(script_targetname); + saved_game->read(delayScriptTime); + saved_game->read(soundSet); + saved_game->read(setTime); + saved_game->read(cameraGroup); + saved_game->read(noDamageTeam); + saved_game->read(playerModel); + saved_game->read(weaponModel); + saved_game->read(handRBolt); + saved_game->read(handLBolt); + saved_game->read(headBolt); + saved_game->read(cervicalBolt); + saved_game->read(chestBolt); + saved_game->read(gutBolt); + saved_game->read(torsoBolt); + saved_game->read(crotchBolt); + saved_game->read(motionBolt); + saved_game->read(kneeLBolt); + saved_game->read(kneeRBolt); + saved_game->read(elbowLBolt); + saved_game->read(elbowRBolt); + saved_game->read(footLBolt); + saved_game->read(footRBolt); + saved_game->read(faceBone); + saved_game->read(craniumBone); + saved_game->read(cervicalBone); + saved_game->read(thoracicBone); + saved_game->read(upperLumbarBone); + saved_game->read(lowerLumbarBone); + saved_game->read(hipsBone); + saved_game->read(motionBone); + saved_game->read(rootBone); + saved_game->read(footLBone); + saved_game->read(footRBone); + saved_game->read(humerusRBone); + saved_game->read(genericBone1); + saved_game->read(genericBone2); + saved_game->read(genericBone3); + saved_game->read(genericBolt1); + saved_game->read(genericBolt2); + saved_game->read(genericBolt3); + saved_game->read(genericBolt4); + saved_game->read(genericBolt5); + saved_game->read(cinematicModel); + saved_game->read(m_pVehicle); + saved_game->read(NPC); + saved_game->read(ownername); + saved_game->read(cantHitEnemyCounter); + saved_game->read(NPC_type); + saved_game->read(NPC_targetname); + saved_game->read(NPC_target); + saved_game->read(moverState); + saved_game->read(soundPos1); + saved_game->read(sound1to2); + saved_game->read(sound2to1); + saved_game->read(soundPos2); + saved_game->read(soundLoop); + saved_game->read(nextTrain); + saved_game->read(prevTrain); + saved_game->read(pos1); + saved_game->read(pos2); + saved_game->read(pos3); + saved_game->read(sounds); + saved_game->read(closetarget); + saved_game->read(opentarget); + saved_game->read(paintarget); + saved_game->read(lockCount); + saved_game->read(radius); + saved_game->read(wpIndex); + saved_game->read(noise_index); + saved_game->read(startRGBA); + saved_game->read(finalRGBA); + saved_game->read(item); + saved_game->read(message); + saved_game->read(lightLevel); + saved_game->read(forcePushTime); + saved_game->read(forcePuller); + } }; #endif //#ifdef GAME_INCLUDE diff --git a/code/game/g_vehicles.cpp b/code/game/g_vehicles.cpp index 7bda5bbeb6..d25f003bad 100644 --- a/code/game/g_vehicles.cpp +++ b/code/game/g_vehicles.cpp @@ -22,7 +22,6 @@ along with this program; if not, see . #include "../qcommon/q_shared.h" #include "g_local.h" -#include "qcommon/ojk_i_saved_game.h" #ifdef _JK2 //SP does not have this preprocessor for game like MP does #ifndef _JK2MP @@ -3208,156 +3207,3 @@ void G_SetSharedVehicleFunctions( vehicleInfo_t *pVehInfo ) #undef MOD_EXPLOSIVE #endif - - -void Muzzle::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(m_vMuzzlePos); - saved_game->write(m_vMuzzleDir); - saved_game->write(m_iMuzzleWait); - saved_game->write(m_bFired); -} - -void Muzzle::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(m_vMuzzlePos); - saved_game->read(m_vMuzzleDir); - saved_game->read(m_iMuzzleWait); - saved_game->read(m_bFired); -} - - -void vehWeaponStatus_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(linked); - saved_game->write(ammo); - saved_game->write(lastAmmoInc); - saved_game->write(nextMuzzle); -} - -void vehWeaponStatus_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(linked); - saved_game->read(ammo); - saved_game->read(lastAmmoInc); - saved_game->read(nextMuzzle); -} - - -void vehTurretStatus_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(ammo); - saved_game->write(lastAmmoInc); - saved_game->write(nextMuzzle); - saved_game->write(enemyEntNum); - saved_game->write(enemyHoldTime); -} - -void vehTurretStatus_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(ammo); - saved_game->read(lastAmmoInc); - saved_game->read(nextMuzzle); - saved_game->read(enemyEntNum); - saved_game->read(enemyHoldTime); -} - - -void Vehicle_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(m_pPilot); - saved_game->write(m_iPilotTime); - saved_game->write(m_bHasHadPilot); - saved_game->write(m_pDroidUnit); - saved_game->write(m_pParentEntity); - saved_game->write(m_iBoarding); - saved_game->write(m_bWasBoarding); - saved_game->write(m_vBoardingVelocity); - saved_game->write(m_fTimeModifier); - saved_game->write(m_iLeftWingBone); - saved_game->write(m_iRightWingBone); - saved_game->write(m_iExhaustTag); - saved_game->write(m_iMuzzleTag); - saved_game->write(m_iDroidUnitTag); - saved_game->write(m_iGunnerViewTag); - saved_game->write<>(m_Muzzles); - saved_game->write<>(m_ucmd); - saved_game->write(m_EjectDir); - saved_game->write(m_ulFlags); - saved_game->write(m_vOrientation); - saved_game->write(m_fStrafeTime); - saved_game->write(m_vPrevOrientation); - saved_game->write(m_vAngularVelocity); - saved_game->write(m_vFullAngleVelocity); - saved_game->write(m_iArmor); - saved_game->write(m_iShields); - saved_game->write(m_iLastFXTime); - saved_game->write(m_iDieTime); - saved_game->write(m_pVehicleInfo); - saved_game->write<>(m_LandTrace); - saved_game->write(m_iRemovedSurfaces); - saved_game->write(m_iTurboTime); - saved_game->write(m_iDropTime); - saved_game->write(m_iSoundDebounceTimer); - saved_game->write(lastShieldInc); - saved_game->write(linkWeaponToggleHeld); - saved_game->write<>(weaponStatus); - saved_game->write<>(turretStatus); - saved_game->write(m_pOldPilot); - saved_game->write(m_safeJumpMountTime); - saved_game->write(m_safeJumpMountRightDot); -} - -void Vehicle_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(m_pPilot); - saved_game->read(m_iPilotTime); - saved_game->read(m_bHasHadPilot); - saved_game->read(m_pDroidUnit); - saved_game->read(m_pParentEntity); - saved_game->read(m_iBoarding); - saved_game->read(m_bWasBoarding); - saved_game->read(m_vBoardingVelocity); - saved_game->read(m_fTimeModifier); - saved_game->read(m_iLeftWingBone); - saved_game->read(m_iRightWingBone); - saved_game->read(m_iExhaustTag); - saved_game->read(m_iMuzzleTag); - saved_game->read(m_iDroidUnitTag); - saved_game->read(m_iGunnerViewTag); - saved_game->read<>(m_Muzzles); - saved_game->read<>(m_ucmd); - saved_game->read(m_EjectDir); - saved_game->read(m_ulFlags); - saved_game->read(m_vOrientation); - saved_game->read(m_fStrafeTime); - saved_game->read(m_vPrevOrientation); - saved_game->read(m_vAngularVelocity); - saved_game->read(m_vFullAngleVelocity); - saved_game->read(m_iArmor); - saved_game->read(m_iShields); - saved_game->read(m_iLastFXTime); - saved_game->read(m_iDieTime); - saved_game->read(m_pVehicleInfo); - saved_game->read<>(m_LandTrace); - saved_game->read(m_iRemovedSurfaces); - saved_game->read(m_iTurboTime); - saved_game->read(m_iDropTime); - saved_game->read(m_iSoundDebounceTimer); - saved_game->read(lastShieldInc); - saved_game->read(linkWeaponToggleHeld); - saved_game->read<>(weaponStatus); - saved_game->read<>(turretStatus); - saved_game->read(m_pOldPilot); - saved_game->read(m_safeJumpMountTime); - saved_game->read(m_safeJumpMountRightDot); -} - diff --git a/code/game/g_vehicles.h b/code/game/g_vehicles.h index c59b572872..f54c770371 100644 --- a/code/game/g_vehicles.h +++ b/code/game/g_vehicles.h @@ -468,10 +468,22 @@ struct Muzzle void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(m_vMuzzlePos); + saved_game->write(m_vMuzzleDir); + saved_game->write(m_iMuzzleWait); + saved_game->write(m_bFired); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(m_vMuzzlePos); + saved_game->read(m_vMuzzleDir); + saved_game->read(m_iMuzzleWait); + saved_game->read(m_bFired); + } }; //defines for impact damage surface stuff @@ -497,22 +509,8 @@ struct Muzzle #define SHIPSURF_BROKEN_E (1<<4) //wing 3 #define SHIPSURF_BROKEN_F (1<<5) //wing 4 -#pragma pack(push, 4) -class SgVehWeaponStatus -{ -public: - int32_t linked; - int32_t ammo; - int32_t lastAmmoInc; - int32_t nextMuzzle; -}; // SgVehWeaponStatus -#pragma pack(pop) - typedef struct { - using SgType = SgVehWeaponStatus; - - //linked firing mode qboolean linked;//weapon 1's muzzles are in linked firing mode //current weapon ammo @@ -524,29 +522,26 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(linked); + saved_game->write(ammo); + saved_game->write(lastAmmoInc); + saved_game->write(nextMuzzle); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(linked); + saved_game->read(ammo); + saved_game->read(lastAmmoInc); + saved_game->read(nextMuzzle); + } } vehWeaponStatus_t; -#pragma pack(push, 4) -class SgVehTurretStatus -{ -public: - int32_t ammo; - int32_t lastAmmoInc; - int32_t nextMuzzle; - int32_t enemyEntNum; - int32_t enemyHoldTime; -}; // SgVehTurretStatus -#pragma pack(pop) - typedef struct { - using SgType = SgVehTurretStatus; - - //current weapon ammo int ammo; //debouncer for ammo recharge @@ -560,10 +555,24 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(ammo); + saved_game->write(lastAmmoInc); + saved_game->write(nextMuzzle); + saved_game->write(enemyEntNum); + saved_game->write(enemyHoldTime); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(ammo); + saved_game->read(lastAmmoInc); + saved_game->read(nextMuzzle); + saved_game->read(enemyEntNum); + saved_game->read(enemyHoldTime); + } } vehTurretStatus_t; // This is the implementation of the vehicle interface and any of the other variables needed. This @@ -682,11 +691,97 @@ struct Vehicle_t float m_safeJumpMountRightDot; - void sg_export( - ojk::ISavedGame* saved_game) const; - - void sg_import( - ojk::ISavedGame* saved_game); + void Vehicle_t::sg_export( + ojk::ISavedGame* saved_game) const + { + saved_game->write(m_pPilot); + saved_game->write(m_iPilotTime); + saved_game->write(m_bHasHadPilot); + saved_game->write(m_pDroidUnit); + saved_game->write(m_pParentEntity); + saved_game->write(m_iBoarding); + saved_game->write(m_bWasBoarding); + saved_game->write(m_vBoardingVelocity); + saved_game->write(m_fTimeModifier); + saved_game->write(m_iLeftWingBone); + saved_game->write(m_iRightWingBone); + saved_game->write(m_iExhaustTag); + saved_game->write(m_iMuzzleTag); + saved_game->write(m_iDroidUnitTag); + saved_game->write(m_iGunnerViewTag); + saved_game->write<>(m_Muzzles); + saved_game->write<>(m_ucmd); + saved_game->write(m_EjectDir); + saved_game->write(m_ulFlags); + saved_game->write(m_vOrientation); + saved_game->write(m_fStrafeTime); + saved_game->write(m_vPrevOrientation); + saved_game->write(m_vAngularVelocity); + saved_game->write(m_vFullAngleVelocity); + saved_game->write(m_iArmor); + saved_game->write(m_iShields); + saved_game->write(m_iLastFXTime); + saved_game->write(m_iDieTime); + saved_game->write(m_pVehicleInfo); + saved_game->write<>(m_LandTrace); + saved_game->write(m_iRemovedSurfaces); + saved_game->write(m_iTurboTime); + saved_game->write(m_iDropTime); + saved_game->write(m_iSoundDebounceTimer); + saved_game->write(lastShieldInc); + saved_game->write(linkWeaponToggleHeld); + saved_game->write<>(weaponStatus); + saved_game->write<>(turretStatus); + saved_game->write(m_pOldPilot); + saved_game->write(m_safeJumpMountTime); + saved_game->write(m_safeJumpMountRightDot); + } + + void Vehicle_t::sg_import( + ojk::ISavedGame* saved_game) + { + saved_game->read(m_pPilot); + saved_game->read(m_iPilotTime); + saved_game->read(m_bHasHadPilot); + saved_game->read(m_pDroidUnit); + saved_game->read(m_pParentEntity); + saved_game->read(m_iBoarding); + saved_game->read(m_bWasBoarding); + saved_game->read(m_vBoardingVelocity); + saved_game->read(m_fTimeModifier); + saved_game->read(m_iLeftWingBone); + saved_game->read(m_iRightWingBone); + saved_game->read(m_iExhaustTag); + saved_game->read(m_iMuzzleTag); + saved_game->read(m_iDroidUnitTag); + saved_game->read(m_iGunnerViewTag); + saved_game->read<>(m_Muzzles); + saved_game->read<>(m_ucmd); + saved_game->read(m_EjectDir); + saved_game->read(m_ulFlags); + saved_game->read(m_vOrientation); + saved_game->read(m_fStrafeTime); + saved_game->read(m_vPrevOrientation); + saved_game->read(m_vAngularVelocity); + saved_game->read(m_vFullAngleVelocity); + saved_game->read(m_iArmor); + saved_game->read(m_iShields); + saved_game->read(m_iLastFXTime); + saved_game->read(m_iDieTime); + saved_game->read(m_pVehicleInfo); + saved_game->read<>(m_LandTrace); + saved_game->read(m_iRemovedSurfaces); + saved_game->read(m_iTurboTime); + saved_game->read(m_iDropTime); + saved_game->read(m_iSoundDebounceTimer); + saved_game->read(lastShieldInc); + saved_game->read(linkWeaponToggleHeld); + saved_game->read<>(weaponStatus); + saved_game->read<>(turretStatus); + saved_game->read(m_pOldPilot); + saved_game->read(m_safeJumpMountTime); + saved_game->read(m_safeJumpMountRightDot); + } }; extern int BG_VehicleGetIndex( const char *vehicleName ); diff --git a/code/game/ghoul2_shared.h b/code/game/ghoul2_shared.h index a28b1f3dc9..c9e30a2078 100644 --- a/code/game/ghoul2_shared.h +++ b/code/game/ghoul2_shared.h @@ -60,10 +60,26 @@ surfaceInfo_t(): void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(offFlags); + saved_game->write(surface); + saved_game->write(genBarycentricJ); + saved_game->write(genBarycentricI); + saved_game->write(genPolySurfaceIndex); + saved_game->write(genLod); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(offFlags); + saved_game->read(surface); + saved_game->read(genBarycentricJ); + saved_game->read(genBarycentricI); + saved_game->read(genPolySurfaceIndex); + saved_game->read(genLod); + } }; #define BONE_ANGLES_PREMULT 0x0001 @@ -198,10 +214,146 @@ boneInfo_t(): void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(boneNumber); + saved_game->write<>(matrix); + saved_game->write(flags); + saved_game->write(startFrame); + saved_game->write(endFrame); + saved_game->write(startTime); + saved_game->write(pauseTime); + saved_game->write(animSpeed); + saved_game->write(blendFrame); + saved_game->write(blendLerpFrame); + saved_game->write(blendTime); + saved_game->write(blendStart); + saved_game->write(boneBlendTime); + saved_game->write(boneBlendStart); + saved_game->write(newMatrix); + saved_game->write(lastTimeUpdated); + saved_game->write(lastContents); + saved_game->write(lastPosition); + saved_game->write(velocityEffector); + saved_game->write(lastAngles); + saved_game->write(minAngles); + saved_game->write(maxAngles); + saved_game->write(currentAngles); + saved_game->write(anglesOffset); + saved_game->write(positionOffset); + saved_game->write(radius); + saved_game->write(weight); + saved_game->write(ragIndex); + saved_game->write(velocityRoot); + saved_game->write(ragStartTime); + saved_game->write(firstTime); + saved_game->write(firstCollisionTime); + saved_game->write(restTime); + saved_game->write(RagFlags); + saved_game->write(DependentRagIndexMask); + saved_game->write<>(originalTrueBoneMatrix); + saved_game->write<>(parentTrueBoneMatrix); + saved_game->write<>(parentOriginalTrueBoneMatrix); + saved_game->write(originalOrigin); + saved_game->write(originalAngles); + saved_game->write(lastShotDir); + saved_game->write(basepose); + saved_game->write(baseposeInv); + saved_game->write(baseposeParent); + saved_game->write(baseposeInvParent); + saved_game->write(parentRawBoneIndex); + saved_game->write<>(ragOverrideMatrix); + saved_game->write<>(extraMatrix); + saved_game->write(extraVec1); + saved_game->write(extraFloat1); + saved_game->write(extraInt1); + saved_game->write(ikPosition); + saved_game->write(ikSpeed); + saved_game->write(epVelocity); + saved_game->write(epGravFactor); + saved_game->write(solidCount); + saved_game->write(physicsSettled); + saved_game->write(snapped); + saved_game->write(parentBoneIndex); + saved_game->write(offsetRotation); + saved_game->write(overGradSpeed); + saved_game->write(overGoalSpot); + saved_game->write(hasOverGoal); + saved_game->write<>(animFrameMatrix); + saved_game->write(hasAnimFrameMatrix); + saved_game->write(airTime); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(boneNumber); + saved_game->read<>(matrix); + saved_game->read(flags); + saved_game->read(startFrame); + saved_game->read(endFrame); + saved_game->read(startTime); + saved_game->read(pauseTime); + saved_game->read(animSpeed); + saved_game->read(blendFrame); + saved_game->read(blendLerpFrame); + saved_game->read(blendTime); + saved_game->read(blendStart); + saved_game->read(boneBlendTime); + saved_game->read(boneBlendStart); + saved_game->read(newMatrix); + saved_game->read(lastTimeUpdated); + saved_game->read(lastContents); + saved_game->read(lastPosition); + saved_game->read(velocityEffector); + saved_game->read(lastAngles); + saved_game->read(minAngles); + saved_game->read(maxAngles); + saved_game->read(currentAngles); + saved_game->read(anglesOffset); + saved_game->read(positionOffset); + saved_game->read(radius); + saved_game->read(weight); + saved_game->read(ragIndex); + saved_game->read(velocityRoot); + saved_game->read(ragStartTime); + saved_game->read(firstTime); + saved_game->read(firstCollisionTime); + saved_game->read(restTime); + saved_game->read(RagFlags); + saved_game->read(DependentRagIndexMask); + saved_game->read<>(originalTrueBoneMatrix); + saved_game->read<>(parentTrueBoneMatrix); + saved_game->read<>(parentOriginalTrueBoneMatrix); + saved_game->read(originalOrigin); + saved_game->read(originalAngles); + saved_game->read(lastShotDir); + saved_game->read(basepose); + saved_game->read(baseposeInv); + saved_game->read(baseposeParent); + saved_game->read(baseposeInvParent); + saved_game->read(parentRawBoneIndex); + saved_game->read<>(ragOverrideMatrix); + saved_game->read<>(extraMatrix); + saved_game->read(extraVec1); + saved_game->read(extraFloat1); + saved_game->read(extraInt1); + saved_game->read(ikPosition); + saved_game->read(ikSpeed); + saved_game->read(epVelocity); + saved_game->read(epGravFactor); + saved_game->read(solidCount); + saved_game->read(physicsSettled); + saved_game->read(snapped); + saved_game->read(parentBoneIndex); + saved_game->read(offsetRotation); + saved_game->read(overGradSpeed); + saved_game->read(overGoalSpot); + saved_game->read(hasOverGoal); + saved_game->read<>(animFrameMatrix); + saved_game->read(hasAnimFrameMatrix); + saved_game->read(airTime); + } }; //we save from top to boltUsed here. Don't bother saving the position, it gets rebuilt every frame anyway struct boltInfo_t{ @@ -218,10 +370,22 @@ struct boltInfo_t{ void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(boneNumber); + saved_game->write(surfaceNumber); + saved_game->write(surfaceType); + saved_game->write(boltUsed); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(boneNumber); + saved_game->read(surfaceNumber); + saved_game->read(surfaceType); + saved_game->read(boltUsed); + } }; @@ -338,10 +502,52 @@ class CGhoul2Info void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(mModelindex); + saved_game->write(animModelIndexOffset); + saved_game->write(mCustomShader); + saved_game->write(mCustomSkin); + saved_game->write(mModelBoltLink); + saved_game->write(mSurfaceRoot); + saved_game->write(mLodBias); + saved_game->write(mNewOrigin); + +#ifdef _G2_GORE + saved_game->write(mGoreSetTag); +#endif // _G2_GORE + + saved_game->write(mModel); + saved_game->write(mFileName); + saved_game->write(mAnimFrameDefault); + saved_game->write(mSkelFrameNum); + saved_game->write(mMeshFrameNum); + saved_game->write(mFlags); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(mModelindex); + saved_game->read(animModelIndexOffset); + saved_game->read(mCustomShader); + saved_game->read(mCustomSkin); + saved_game->read(mModelBoltLink); + saved_game->read(mSurfaceRoot); + saved_game->read(mLodBias); + saved_game->read(mNewOrigin); + +#ifdef _G2_GORE + saved_game->read(mGoreSetTag); +#endif // _G2_GORE + + saved_game->read(mModel); + saved_game->read(mFileName); + saved_game->read(mAnimFrameDefault); + saved_game->read(mSkelFrameNum); + saved_game->read(mMeshFrameNum); + saved_game->read(mFlags); + } }; class CGhoul2Info_v; @@ -495,10 +701,16 @@ class CGhoul2Info_v void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(mItem); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(mItem); + } }; @@ -530,10 +742,38 @@ class CCollisionRecord void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(mDistance); + saved_game->write(mEntityNum); + saved_game->write(mModelIndex); + saved_game->write(mPolyIndex); + saved_game->write(mSurfaceIndex); + saved_game->write(mCollisionPosition); + saved_game->write(mCollisionNormal); + saved_game->write(mFlags); + saved_game->write(mMaterial); + saved_game->write(mLocation); + saved_game->write(mBarycentricI); + saved_game->write(mBarycentricJ); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(mDistance); + saved_game->read(mEntityNum); + saved_game->read(mModelIndex); + saved_game->read(mPolyIndex); + saved_game->read(mSurfaceIndex); + saved_game->read(mCollisionPosition); + saved_game->read(mCollisionNormal); + saved_game->read(mFlags); + saved_game->read(mMaterial); + saved_game->read(mLocation); + saved_game->read(mBarycentricI); + saved_game->read(mBarycentricJ); + } }; // calling defines for the trace function diff --git a/code/qcommon/q_shared.cpp b/code/qcommon/q_shared.cpp index f6b8247c9f..013e39268a 100644 --- a/code/qcommon/q_shared.cpp +++ b/code/qcommon/q_shared.cpp @@ -25,7 +25,7 @@ along with this program; if not, see . // q_shared.c -- stateless support routines that are included in each code dll #include "../game/common_headers.h" -#include "qcommon/ojk_i_saved_game.h" + int Com_Clampi( int min, int max, int value ) { @@ -1611,779 +1611,3 @@ const char *GetStringForID( const stringID_table_t *table, int id ) return NULL; } - - -void cplane_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(normal); - saved_game->write(dist); - saved_game->write(type); - saved_game->write(signbits); - saved_game->write(pad); -} - -void cplane_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(normal); - saved_game->read(dist); - saved_game->read(type); - saved_game->read(signbits); - saved_game->read(pad); -} - - -void trace_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(allsolid); - saved_game->write(startsolid); - saved_game->write(fraction); - saved_game->write(endpos); - saved_game->write<>(plane); - saved_game->write(surfaceFlags); - saved_game->write(contents); - saved_game->write(entityNum); - saved_game->write<>(G2CollisionMap); -} - -void trace_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(allsolid); - saved_game->read(startsolid); - saved_game->read(fraction); - saved_game->read(endpos); - saved_game->read<>(plane); - saved_game->read(surfaceFlags); - saved_game->read(contents); - saved_game->read(entityNum); - saved_game->read<>(G2CollisionMap); -} - - -void saberTrail_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(inAction); - saved_game->write(duration); - saved_game->write(lastTime); - saved_game->write(base); - saved_game->write(tip); - saved_game->write(haveOldPos); - saved_game->write(oldPos); - saved_game->write(oldNormal); -} - -void saberTrail_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(inAction); - saved_game->read(duration); - saved_game->read(lastTime); - saved_game->read(base); - saved_game->read(tip); - saved_game->read(haveOldPos); - saved_game->read(oldPos); - saved_game->read(oldNormal); -} - - -void bladeInfo_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(active); - saved_game->write(color); - saved_game->write(radius); - saved_game->write(length); - saved_game->write(lengthMax); - saved_game->write(lengthOld); - saved_game->write(muzzlePoint); - saved_game->write(muzzlePointOld); - saved_game->write(muzzleDir); - saved_game->write(muzzleDirOld); - saved_game->write<>(trail); -} - -void bladeInfo_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(active); - saved_game->read(color); - saved_game->read(radius); - saved_game->read(length); - saved_game->read(lengthMax); - saved_game->read(lengthOld); - saved_game->read(muzzlePoint); - saved_game->read(muzzlePointOld); - saved_game->read(muzzleDir); - saved_game->read(muzzleDirOld); - saved_game->read<>(trail); -} - - -void saberInfo_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(name); - saved_game->write(fullName); - saved_game->write(type); - saved_game->write(model); - saved_game->write(skin); - saved_game->write(soundOn); - saved_game->write(soundLoop); - saved_game->write(soundOff); - saved_game->write(numBlades); - saved_game->write<>(blade); - saved_game->write(stylesLearned); - saved_game->write(stylesForbidden); - saved_game->write(maxChain); - saved_game->write(forceRestrictions); - saved_game->write(lockBonus); - saved_game->write(parryBonus); - saved_game->write(breakParryBonus); - saved_game->write(breakParryBonus2); - saved_game->write(disarmBonus); - saved_game->write(disarmBonus2); - saved_game->write(singleBladeStyle); - saved_game->write(brokenSaber1); - saved_game->write(brokenSaber2); - saved_game->write(saberFlags); - saved_game->write(saberFlags2); - saved_game->write(spinSound); - saved_game->write(swingSound); - saved_game->write(fallSound); - saved_game->write(moveSpeedScale); - saved_game->write(animSpeedScale); - saved_game->write(kataMove); - saved_game->write(lungeAtkMove); - saved_game->write(jumpAtkUpMove); - saved_game->write(jumpAtkFwdMove); - saved_game->write(jumpAtkBackMove); - saved_game->write(jumpAtkRightMove); - saved_game->write(jumpAtkLeftMove); - saved_game->write(readyAnim); - saved_game->write(drawAnim); - saved_game->write(putawayAnim); - saved_game->write(tauntAnim); - saved_game->write(bowAnim); - saved_game->write(meditateAnim); - saved_game->write(flourishAnim); - saved_game->write(gloatAnim); - saved_game->write(bladeStyle2Start); - saved_game->write(trailStyle); - saved_game->write(g2MarksShader); - saved_game->write(g2WeaponMarkShader); - saved_game->write(hitSound); - saved_game->write(blockSound); - saved_game->write(bounceSound); - saved_game->write(blockEffect); - saved_game->write(hitPersonEffect); - saved_game->write(hitOtherEffect); - saved_game->write(bladeEffect); - saved_game->write(knockbackScale); - saved_game->write(damageScale); - saved_game->write(splashRadius); - saved_game->write(splashDamage); - saved_game->write(splashKnockback); - saved_game->write(trailStyle2); - saved_game->write(g2MarksShader2); - saved_game->write(g2WeaponMarkShader2); - saved_game->write(hit2Sound); - saved_game->write(block2Sound); - saved_game->write(bounce2Sound); - saved_game->write(blockEffect2); - saved_game->write(hitPersonEffect2); - saved_game->write(hitOtherEffect2); - saved_game->write(bladeEffect2); - saved_game->write(knockbackScale2); - saved_game->write(damageScale2); - saved_game->write(splashRadius2); - saved_game->write(splashDamage2); - saved_game->write(splashKnockback2); -} - -void saberInfo_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(name); - saved_game->read(fullName); - saved_game->read(type); - saved_game->read(model); - saved_game->read(skin); - saved_game->read(soundOn); - saved_game->read(soundLoop); - saved_game->read(soundOff); - saved_game->read(numBlades); - saved_game->read<>(blade); - saved_game->read(stylesLearned); - saved_game->read(stylesForbidden); - saved_game->read(maxChain); - saved_game->read(forceRestrictions); - saved_game->read(lockBonus); - saved_game->read(parryBonus); - saved_game->read(breakParryBonus); - saved_game->read(breakParryBonus2); - saved_game->read(disarmBonus); - saved_game->read(disarmBonus2); - saved_game->read(singleBladeStyle); - saved_game->read(brokenSaber1); - saved_game->read(brokenSaber2); - saved_game->read(saberFlags); - saved_game->read(saberFlags2); - saved_game->read(spinSound); - saved_game->read(swingSound); - saved_game->read(fallSound); - saved_game->read(moveSpeedScale); - saved_game->read(animSpeedScale); - saved_game->read(kataMove); - saved_game->read(lungeAtkMove); - saved_game->read(jumpAtkUpMove); - saved_game->read(jumpAtkFwdMove); - saved_game->read(jumpAtkBackMove); - saved_game->read(jumpAtkRightMove); - saved_game->read(jumpAtkLeftMove); - saved_game->read(readyAnim); - saved_game->read(drawAnim); - saved_game->read(putawayAnim); - saved_game->read(tauntAnim); - saved_game->read(bowAnim); - saved_game->read(meditateAnim); - saved_game->read(flourishAnim); - saved_game->read(gloatAnim); - saved_game->read(bladeStyle2Start); - saved_game->read(trailStyle); - saved_game->read(g2MarksShader); - saved_game->read(g2WeaponMarkShader); - saved_game->read(hitSound); - saved_game->read(blockSound); - saved_game->read(bounceSound); - saved_game->read(blockEffect); - saved_game->read(hitPersonEffect); - saved_game->read(hitOtherEffect); - saved_game->read(bladeEffect); - saved_game->read(knockbackScale); - saved_game->read(damageScale); - saved_game->read(splashRadius); - saved_game->read(splashDamage); - saved_game->read(splashKnockback); - saved_game->read(trailStyle2); - saved_game->read(g2MarksShader2); - saved_game->read(g2WeaponMarkShader2); - saved_game->read(hit2Sound); - saved_game->read(block2Sound); - saved_game->read(bounce2Sound); - saved_game->read(blockEffect2); - saved_game->read(hitPersonEffect2); - saved_game->read(hitOtherEffect2); - saved_game->read(bladeEffect2); - saved_game->read(knockbackScale2); - saved_game->read(damageScale2); - saved_game->read(splashRadius2); - saved_game->read(splashDamage2); - saved_game->read(splashKnockback2); -} - - -void saberInfoRetail_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(name); - saved_game->write(fullName); - saved_game->write(type); - saved_game->write(model); - saved_game->write(skin); - saved_game->write(soundOn); - saved_game->write(soundLoop); - saved_game->write(soundOff); - saved_game->write(numBlades); - saved_game->write<>(blade); - saved_game->write(style); - saved_game->write(maxChain); - saved_game->write(lockable); - saved_game->write(throwable); - saved_game->write(disarmable); - saved_game->write(activeBlocking); - saved_game->write(twoHanded); - saved_game->write(forceRestrictions); - saved_game->write(lockBonus); - saved_game->write(parryBonus); - saved_game->write(breakParryBonus); - saved_game->write(disarmBonus); - saved_game->write(singleBladeStyle); - saved_game->write(singleBladeThrowable); - saved_game->write(brokenSaber1); - saved_game->write(brokenSaber2); - saved_game->write(returnDamage); -} - -void saberInfoRetail_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(name); - saved_game->read(fullName); - saved_game->read(type); - saved_game->read(model); - saved_game->read(skin); - saved_game->read(soundOn); - saved_game->read(soundLoop); - saved_game->read(soundOff); - saved_game->read(numBlades); - saved_game->read<>(blade); - saved_game->read(style); - saved_game->read(maxChain); - saved_game->read(lockable); - saved_game->read(throwable); - saved_game->read(disarmable); - saved_game->read(activeBlocking); - saved_game->read(twoHanded); - saved_game->read(forceRestrictions); - saved_game->read(lockBonus); - saved_game->read(parryBonus); - saved_game->read(breakParryBonus); - saved_game->read(disarmBonus); - saved_game->read(singleBladeStyle); - saved_game->read(singleBladeThrowable); - saved_game->read(brokenSaber1); - saved_game->read(brokenSaber2); - saved_game->read(returnDamage); -} - - -void playerState_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(commandTime); - saved_game->write(pm_type); - saved_game->write(bobCycle); - saved_game->write(pm_flags); - saved_game->write(pm_time); - saved_game->write(origin); - saved_game->write(velocity); - saved_game->write(weaponTime); - saved_game->write(weaponChargeTime); - saved_game->write(rechargeTime); - saved_game->write(gravity); - saved_game->write(leanofs); - saved_game->write(friction); - saved_game->write(speed); - saved_game->write(delta_angles); - saved_game->write(groundEntityNum); - saved_game->write(legsAnim); - saved_game->write(legsAnimTimer); - saved_game->write(torsoAnim); - saved_game->write(torsoAnimTimer); - saved_game->write(movementDir); - saved_game->write(eFlags); - saved_game->write(eventSequence); - saved_game->write(events); - saved_game->write(eventParms); - saved_game->write(externalEvent); - saved_game->write(externalEventParm); - saved_game->write(externalEventTime); - saved_game->write(clientNum); - saved_game->write(weapon); - saved_game->write(weaponstate); - saved_game->write(batteryCharge); - saved_game->write(viewangles); - saved_game->write(legsYaw); - saved_game->write(viewheight); - saved_game->write(damageEvent); - saved_game->write(damageYaw); - saved_game->write(damagePitch); - saved_game->write(damageCount); - saved_game->write(stats); - saved_game->write(persistant); - saved_game->write(powerups); - saved_game->write(ammo); - saved_game->write(inventory); - saved_game->write(security_key_message); - saved_game->write(serverViewOrg); - saved_game->write(saberInFlight); - -#ifdef JK2_MODE - saved_game->write(saberActive); - saved_game->write(vehicleModel); - saved_game->write(viewEntity); - saved_game->write(saberColor); - saved_game->write(saberLength); - saved_game->write(saberLengthMax); - saved_game->write(forcePowersActive); -#else - saved_game->write(viewEntity); - saved_game->write(forcePowersActive); -#endif - - saved_game->write(useTime); - saved_game->write(lastShotTime); - saved_game->write(ping); - saved_game->write(lastOnGround); - saved_game->write(lastStationary); - saved_game->write(weaponShotCount); - saved_game->write<>(saber); - saved_game->write(dualSabers); - saved_game->write(saberMove); - saved_game->write(saberMoveNext); - saved_game->write(saberBounceMove); - saved_game->write(saberBlocking); - saved_game->write(saberBlocked); - saved_game->write(leanStopDebounceTime); - -#ifdef JK2_MODE - saved_game->write(saberLengthOld); -#endif - - saved_game->write(saberEntityNum); - saved_game->write(saberEntityDist); - saved_game->write(saberThrowTime); - saved_game->write(saberEntityState); - saved_game->write(saberDamageDebounceTime); - saved_game->write(saberHitWallSoundDebounceTime); - saved_game->write(saberEventFlags); - saved_game->write(saberBlockingTime); - saved_game->write(saberAnimLevel); - saved_game->write(saberAttackChainCount); - saved_game->write(saberLockTime); - saved_game->write(saberLockEnemy); - saved_game->write(saberStylesKnown); - -#ifdef JK2_MODE - saved_game->write(saberModel); -#endif - - saved_game->write(forcePowersKnown); - saved_game->write(forcePowerDuration); - saved_game->write(forcePowerDebounce); - saved_game->write(forcePower); - saved_game->write(forcePowerMax); - saved_game->write(forcePowerRegenDebounceTime); - saved_game->write(forcePowerRegenRate); - saved_game->write(forcePowerRegenAmount); - saved_game->write(forcePowerLevel); - saved_game->write(forceJumpZStart); - saved_game->write(forceJumpCharge); - saved_game->write(forceGripEntityNum); - saved_game->write(forceGripOrg); - saved_game->write(forceDrainEntityNum); - saved_game->write(forceDrainOrg); - saved_game->write(forceHealCount); - saved_game->write(forceAllowDeactivateTime); - saved_game->write(forceRageDrainTime); - saved_game->write(forceRageRecoveryTime); - saved_game->write(forceDrainEntNum); - saved_game->write(forceDrainTime); - saved_game->write(forcePowersForced); - saved_game->write(pullAttackEntNum); - saved_game->write(pullAttackTime); - saved_game->write(lastKickedEntNum); - saved_game->write(taunting); - saved_game->write(jumpZStart); - saved_game->write(moveDir); - saved_game->write(waterheight); - saved_game->write(waterHeightLevel); - saved_game->write(ikStatus); - saved_game->write(heldClient); - saved_game->write(heldByClient); - saved_game->write(heldByBolt); - saved_game->write(heldByBone); - saved_game->write(vehTurnaroundIndex); - saved_game->write(vehTurnaroundTime); - saved_game->write(brokenLimbs); - saved_game->write(electrifyTime); -} - -void playerState_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(commandTime); - saved_game->read(pm_type); - saved_game->read(bobCycle); - saved_game->read(pm_flags); - saved_game->read(pm_time); - saved_game->read(origin); - saved_game->read(velocity); - saved_game->read(weaponTime); - saved_game->read(weaponChargeTime); - saved_game->read(rechargeTime); - saved_game->read(gravity); - saved_game->read(leanofs); - saved_game->read(friction); - saved_game->read(speed); - saved_game->read(delta_angles); - saved_game->read(groundEntityNum); - saved_game->read(legsAnim); - saved_game->read(legsAnimTimer); - saved_game->read(torsoAnim); - saved_game->read(torsoAnimTimer); - saved_game->read(movementDir); - saved_game->read(eFlags); - saved_game->read(eventSequence); - saved_game->read(events); - saved_game->read(eventParms); - saved_game->read(externalEvent); - saved_game->read(externalEventParm); - saved_game->read(externalEventTime); - saved_game->read(clientNum); - saved_game->read(weapon); - saved_game->read(weaponstate); - saved_game->read(batteryCharge); - saved_game->read(viewangles); - saved_game->read(legsYaw); - saved_game->read(viewheight); - saved_game->read(damageEvent); - saved_game->read(damageYaw); - saved_game->read(damagePitch); - saved_game->read(damageCount); - saved_game->read(stats); - saved_game->read(persistant); - saved_game->read(powerups); - saved_game->read(ammo); - saved_game->read(inventory); - saved_game->read(security_key_message); - saved_game->read(serverViewOrg); - saved_game->read(saberInFlight); - -#ifdef JK2_MODE - saved_game->read(saberActive); - saved_game->read(vehicleModel); - saved_game->read(viewEntity); - saved_game->read(saberColor); - saved_game->read(saberLength); - saved_game->read(saberLengthMax); - saved_game->read(forcePowersActive); -#else - saved_game->read(viewEntity); - saved_game->read(forcePowersActive); -#endif - - saved_game->read(useTime); - saved_game->read(lastShotTime); - saved_game->read(ping); - saved_game->read(lastOnGround); - saved_game->read(lastStationary); - saved_game->read(weaponShotCount); - saved_game->read<>(saber); - saved_game->read(dualSabers); - saved_game->read(saberMove); - saved_game->read(saberMoveNext); - saved_game->read(saberBounceMove); - saved_game->read(saberBlocking); - saved_game->read(saberBlocked); - saved_game->read(leanStopDebounceTime); - -#ifdef JK2_MODE - saved_game->read(saberLengthOld); -#endif - - saved_game->read(saberEntityNum); - saved_game->read(saberEntityDist); - saved_game->read(saberThrowTime); - saved_game->read(saberEntityState); - saved_game->read(saberDamageDebounceTime); - saved_game->read(saberHitWallSoundDebounceTime); - saved_game->read(saberEventFlags); - saved_game->read(saberBlockingTime); - saved_game->read(saberAnimLevel); - saved_game->read(saberAttackChainCount); - saved_game->read(saberLockTime); - saved_game->read(saberLockEnemy); - saved_game->read(saberStylesKnown); - -#ifdef JK2_MODE - saved_game->read(saberModel); -#endif - - saved_game->read(forcePowersKnown); - saved_game->read(forcePowerDuration); - saved_game->read(forcePowerDebounce); - saved_game->read(forcePower); - saved_game->read(forcePowerMax); - saved_game->read(forcePowerRegenDebounceTime); - saved_game->read(forcePowerRegenRate); - saved_game->read(forcePowerRegenAmount); - saved_game->read(forcePowerLevel); - saved_game->read(forceJumpZStart); - saved_game->read(forceJumpCharge); - saved_game->read(forceGripEntityNum); - saved_game->read(forceGripOrg); - saved_game->read(forceDrainEntityNum); - saved_game->read(forceDrainOrg); - saved_game->read(forceHealCount); - saved_game->read(forceAllowDeactivateTime); - saved_game->read(forceRageDrainTime); - saved_game->read(forceRageRecoveryTime); - saved_game->read(forceDrainEntNum); - saved_game->read(forceDrainTime); - saved_game->read(forcePowersForced); - saved_game->read(pullAttackEntNum); - saved_game->read(pullAttackTime); - saved_game->read(lastKickedEntNum); - saved_game->read(taunting); - saved_game->read(jumpZStart); - saved_game->read(moveDir); - saved_game->read(waterheight); - saved_game->read(waterHeightLevel); - saved_game->read(ikStatus); - saved_game->read(heldClient); - saved_game->read(heldByClient); - saved_game->read(heldByBolt); - saved_game->read(heldByBone); - saved_game->read(vehTurnaroundIndex); - saved_game->read(vehTurnaroundTime); - saved_game->read(brokenLimbs); - saved_game->read(electrifyTime); -} - - -void usercmd_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(serverTime); - saved_game->write(buttons); - saved_game->write(weapon); - saved_game->write(angles); - saved_game->write(generic_cmd); - saved_game->write(forwardmove); - saved_game->write(rightmove); - saved_game->write(upmove); -} - -void usercmd_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(serverTime); - saved_game->read(buttons); - saved_game->read(weapon); - saved_game->read(angles); - saved_game->read(generic_cmd); - saved_game->read(forwardmove); - saved_game->read(rightmove); - saved_game->read(upmove); -} - - -void trajectory_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(trType); - saved_game->write(trTime); - saved_game->write(trDuration); - saved_game->write(trBase); - saved_game->write(trDelta); -} - -void trajectory_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(trType); - saved_game->read(trTime); - saved_game->read(trDuration); - saved_game->read(trBase); - saved_game->read(trDelta); -} - - -void entityState_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(number); - saved_game->write(eType); - saved_game->write(eFlags); - saved_game->write<>(pos); - saved_game->write<>(apos); - saved_game->write(time); - saved_game->write(time2); - saved_game->write(origin); - saved_game->write(origin2); - saved_game->write(angles); - saved_game->write(angles2); - saved_game->write(otherEntityNum); - saved_game->write(otherEntityNum2); - saved_game->write(groundEntityNum); - saved_game->write(constantLight); - saved_game->write(loopSound); - saved_game->write(modelindex); - saved_game->write(modelindex2); - saved_game->write(modelindex3); - saved_game->write(clientNum); - saved_game->write(frame); - saved_game->write(solid); - saved_game->write(event); - saved_game->write(eventParm); - saved_game->write(powerups); - saved_game->write(weapon); - saved_game->write(legsAnim); - saved_game->write(legsAnimTimer); - saved_game->write(torsoAnim); - saved_game->write(torsoAnimTimer); - saved_game->write(scale); - saved_game->write(saberInFlight); - saved_game->write(saberActive); - -#ifdef JK2_MODE - saved_game->write(vehicleModel); -#endif - - saved_game->write(vehicleAngles); - saved_game->write(vehicleArmor); - saved_game->write(m_iVehicleNum); - saved_game->write(modelScale); - saved_game->write(radius); - saved_game->write(boltInfo); - saved_game->write(isPortalEnt); -} - -void entityState_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(number); - saved_game->read(eType); - saved_game->read(eFlags); - saved_game->read<>(pos); - saved_game->read<>(apos); - saved_game->read(time); - saved_game->read(time2); - saved_game->read(origin); - saved_game->read(origin2); - saved_game->read(angles); - saved_game->read(angles2); - saved_game->read(otherEntityNum); - saved_game->read(otherEntityNum2); - saved_game->read(groundEntityNum); - saved_game->read(constantLight); - saved_game->read(loopSound); - saved_game->read(modelindex); - saved_game->read(modelindex2); - saved_game->read(modelindex3); - saved_game->read(clientNum); - saved_game->read(frame); - saved_game->read(solid); - saved_game->read(event); - saved_game->read(eventParm); - saved_game->read(powerups); - saved_game->read(weapon); - saved_game->read(legsAnim); - saved_game->read(legsAnimTimer); - saved_game->read(torsoAnim); - saved_game->read(torsoAnimTimer); - saved_game->read(scale); - saved_game->read(saberInFlight); - saved_game->read(saberActive); - -#ifdef JK2_MODE - saved_game->read(vehicleModel); -#endif - - saved_game->read(vehicleAngles); - saved_game->read(vehicleArmor); - saved_game->read(m_iVehicleNum); - saved_game->read(modelScale); - saved_game->read(radius); - saved_game->read(boltInfo); - saved_game->read(isPortalEnt); -} - - -// end - diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index ac2834e86b..0186889513 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -1231,10 +1231,24 @@ typedef struct cplane_s { void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(normal); + saved_game->write(dist); + saved_game->write(type); + saved_game->write(signbits); + saved_game->write(pad); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(normal); + saved_game->read(dist); + saved_game->read(type); + saved_game->read(signbits); + saved_game->read(pad); + } } cplane_t; /* @@ -1270,10 +1284,32 @@ Ghoul2 Insert End void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(allsolid); + saved_game->write(startsolid); + saved_game->write(fraction); + saved_game->write(endpos); + saved_game->write<>(plane); + saved_game->write(surfaceFlags); + saved_game->write(contents); + saved_game->write(entityNum); + saved_game->write<>(G2CollisionMap); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(allsolid); + saved_game->read(startsolid); + saved_game->read(fraction); + saved_game->read(endpos); + saved_game->read<>(plane); + saved_game->read(surfaceFlags); + saved_game->read(contents); + saved_game->read(entityNum); + saved_game->read<>(G2CollisionMap); + } } trace_t; // trace->entityNum can also be 0 to (MAX_GENTITIES-1) @@ -1508,10 +1544,30 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(inAction); + saved_game->write(duration); + saved_game->write(lastTime); + saved_game->write(base); + saved_game->write(tip); + saved_game->write(haveOldPos); + saved_game->write(oldPos); + saved_game->write(oldNormal); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(inAction); + saved_game->read(duration); + saved_game->read(lastTime); + saved_game->read(base); + saved_game->read(tip); + saved_game->read(haveOldPos); + saved_game->read(oldPos); + saved_game->read(oldNormal); + } } saberTrail_t; #define MAX_SABER_TRAIL_SEGS 8 @@ -1543,10 +1599,36 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(active); + saved_game->write(color); + saved_game->write(radius); + saved_game->write(length); + saved_game->write(lengthMax); + saved_game->write(lengthOld); + saved_game->write(muzzlePoint); + saved_game->write(muzzlePointOld); + saved_game->write(muzzleDir); + saved_game->write(muzzleDirOld); + saved_game->write<>(trail); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(active); + saved_game->read(color); + saved_game->read(radius); + saved_game->read(length); + saved_game->read(lengthMax); + saved_game->read(lengthOld); + saved_game->read(muzzlePoint); + saved_game->read(muzzlePointOld); + saved_game->read(muzzleDir); + saved_game->read(muzzleDirOld); + saved_game->read<>(trail); + } } bladeInfo_t; #define MAX_BLADES 8 @@ -1838,10 +1920,166 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(name); + saved_game->write(fullName); + saved_game->write(type); + saved_game->write(model); + saved_game->write(skin); + saved_game->write(soundOn); + saved_game->write(soundLoop); + saved_game->write(soundOff); + saved_game->write(numBlades); + saved_game->write<>(blade); + saved_game->write(stylesLearned); + saved_game->write(stylesForbidden); + saved_game->write(maxChain); + saved_game->write(forceRestrictions); + saved_game->write(lockBonus); + saved_game->write(parryBonus); + saved_game->write(breakParryBonus); + saved_game->write(breakParryBonus2); + saved_game->write(disarmBonus); + saved_game->write(disarmBonus2); + saved_game->write(singleBladeStyle); + saved_game->write(brokenSaber1); + saved_game->write(brokenSaber2); + saved_game->write(saberFlags); + saved_game->write(saberFlags2); + saved_game->write(spinSound); + saved_game->write(swingSound); + saved_game->write(fallSound); + saved_game->write(moveSpeedScale); + saved_game->write(animSpeedScale); + saved_game->write(kataMove); + saved_game->write(lungeAtkMove); + saved_game->write(jumpAtkUpMove); + saved_game->write(jumpAtkFwdMove); + saved_game->write(jumpAtkBackMove); + saved_game->write(jumpAtkRightMove); + saved_game->write(jumpAtkLeftMove); + saved_game->write(readyAnim); + saved_game->write(drawAnim); + saved_game->write(putawayAnim); + saved_game->write(tauntAnim); + saved_game->write(bowAnim); + saved_game->write(meditateAnim); + saved_game->write(flourishAnim); + saved_game->write(gloatAnim); + saved_game->write(bladeStyle2Start); + saved_game->write(trailStyle); + saved_game->write(g2MarksShader); + saved_game->write(g2WeaponMarkShader); + saved_game->write(hitSound); + saved_game->write(blockSound); + saved_game->write(bounceSound); + saved_game->write(blockEffect); + saved_game->write(hitPersonEffect); + saved_game->write(hitOtherEffect); + saved_game->write(bladeEffect); + saved_game->write(knockbackScale); + saved_game->write(damageScale); + saved_game->write(splashRadius); + saved_game->write(splashDamage); + saved_game->write(splashKnockback); + saved_game->write(trailStyle2); + saved_game->write(g2MarksShader2); + saved_game->write(g2WeaponMarkShader2); + saved_game->write(hit2Sound); + saved_game->write(block2Sound); + saved_game->write(bounce2Sound); + saved_game->write(blockEffect2); + saved_game->write(hitPersonEffect2); + saved_game->write(hitOtherEffect2); + saved_game->write(bladeEffect2); + saved_game->write(knockbackScale2); + saved_game->write(damageScale2); + saved_game->write(splashRadius2); + saved_game->write(splashDamage2); + saved_game->write(splashKnockback2); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(name); + saved_game->read(fullName); + saved_game->read(type); + saved_game->read(model); + saved_game->read(skin); + saved_game->read(soundOn); + saved_game->read(soundLoop); + saved_game->read(soundOff); + saved_game->read(numBlades); + saved_game->read<>(blade); + saved_game->read(stylesLearned); + saved_game->read(stylesForbidden); + saved_game->read(maxChain); + saved_game->read(forceRestrictions); + saved_game->read(lockBonus); + saved_game->read(parryBonus); + saved_game->read(breakParryBonus); + saved_game->read(breakParryBonus2); + saved_game->read(disarmBonus); + saved_game->read(disarmBonus2); + saved_game->read(singleBladeStyle); + saved_game->read(brokenSaber1); + saved_game->read(brokenSaber2); + saved_game->read(saberFlags); + saved_game->read(saberFlags2); + saved_game->read(spinSound); + saved_game->read(swingSound); + saved_game->read(fallSound); + saved_game->read(moveSpeedScale); + saved_game->read(animSpeedScale); + saved_game->read(kataMove); + saved_game->read(lungeAtkMove); + saved_game->read(jumpAtkUpMove); + saved_game->read(jumpAtkFwdMove); + saved_game->read(jumpAtkBackMove); + saved_game->read(jumpAtkRightMove); + saved_game->read(jumpAtkLeftMove); + saved_game->read(readyAnim); + saved_game->read(drawAnim); + saved_game->read(putawayAnim); + saved_game->read(tauntAnim); + saved_game->read(bowAnim); + saved_game->read(meditateAnim); + saved_game->read(flourishAnim); + saved_game->read(gloatAnim); + saved_game->read(bladeStyle2Start); + saved_game->read(trailStyle); + saved_game->read(g2MarksShader); + saved_game->read(g2WeaponMarkShader); + saved_game->read(hitSound); + saved_game->read(blockSound); + saved_game->read(bounceSound); + saved_game->read(blockEffect); + saved_game->read(hitPersonEffect); + saved_game->read(hitOtherEffect); + saved_game->read(bladeEffect); + saved_game->read(knockbackScale); + saved_game->read(damageScale); + saved_game->read(splashRadius); + saved_game->read(splashDamage); + saved_game->read(splashKnockback); + saved_game->read(trailStyle2); + saved_game->read(g2MarksShader2); + saved_game->read(g2WeaponMarkShader2); + saved_game->read(hit2Sound); + saved_game->read(block2Sound); + saved_game->read(bounce2Sound); + saved_game->read(blockEffect2); + saved_game->read(hitPersonEffect2); + saved_game->read(hitOtherEffect2); + saved_game->read(bladeEffect2); + saved_game->read(knockbackScale2); + saved_game->read(damageScale2); + saved_game->read(splashRadius2); + saved_game->read(splashDamage2); + saved_game->read(splashKnockback2); + } } saberInfo_t; //NOTE: Below is the *retail* version of the saberInfo_t structure - it is ONLY used for loading retail-version savegames (we load the savegame into this smaller structure, then copy each field into the appropriate field in the new structure - see SG_ConvertRetailSaberinfoToNewSaberinfo() @@ -1963,10 +2201,68 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(name); + saved_game->write(fullName); + saved_game->write(type); + saved_game->write(model); + saved_game->write(skin); + saved_game->write(soundOn); + saved_game->write(soundLoop); + saved_game->write(soundOff); + saved_game->write(numBlades); + saved_game->write<>(blade); + saved_game->write(style); + saved_game->write(maxChain); + saved_game->write(lockable); + saved_game->write(throwable); + saved_game->write(disarmable); + saved_game->write(activeBlocking); + saved_game->write(twoHanded); + saved_game->write(forceRestrictions); + saved_game->write(lockBonus); + saved_game->write(parryBonus); + saved_game->write(breakParryBonus); + saved_game->write(disarmBonus); + saved_game->write(singleBladeStyle); + saved_game->write(singleBladeThrowable); + saved_game->write(brokenSaber1); + saved_game->write(brokenSaber2); + saved_game->write(returnDamage); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(name); + saved_game->read(fullName); + saved_game->read(type); + saved_game->read(model); + saved_game->read(skin); + saved_game->read(soundOn); + saved_game->read(soundLoop); + saved_game->read(soundOff); + saved_game->read(numBlades); + saved_game->read<>(blade); + saved_game->read(style); + saved_game->read(maxChain); + saved_game->read(lockable); + saved_game->read(throwable); + saved_game->read(disarmable); + saved_game->read(activeBlocking); + saved_game->read(twoHanded); + saved_game->read(forceRestrictions); + saved_game->read(lockBonus); + saved_game->read(parryBonus); + saved_game->read(breakParryBonus); + saved_game->read(disarmBonus); + saved_game->read(singleBladeStyle); + saved_game->read(singleBladeThrowable); + saved_game->read(brokenSaber1); + saved_game->read(brokenSaber2); + saved_game->read(returnDamage); + } } saberInfoRetail_t; #define MAX_SABERS 2 // if this ever changes then update the table "static const save_field_t savefields_gClient[]"!!!!!!!!!!!! @@ -2286,10 +2582,288 @@ typedef struct playerState_s { void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(commandTime); + saved_game->write(pm_type); + saved_game->write(bobCycle); + saved_game->write(pm_flags); + saved_game->write(pm_time); + saved_game->write(origin); + saved_game->write(velocity); + saved_game->write(weaponTime); + saved_game->write(weaponChargeTime); + saved_game->write(rechargeTime); + saved_game->write(gravity); + saved_game->write(leanofs); + saved_game->write(friction); + saved_game->write(speed); + saved_game->write(delta_angles); + saved_game->write(groundEntityNum); + saved_game->write(legsAnim); + saved_game->write(legsAnimTimer); + saved_game->write(torsoAnim); + saved_game->write(torsoAnimTimer); + saved_game->write(movementDir); + saved_game->write(eFlags); + saved_game->write(eventSequence); + saved_game->write(events); + saved_game->write(eventParms); + saved_game->write(externalEvent); + saved_game->write(externalEventParm); + saved_game->write(externalEventTime); + saved_game->write(clientNum); + saved_game->write(weapon); + saved_game->write(weaponstate); + saved_game->write(batteryCharge); + saved_game->write(viewangles); + saved_game->write(legsYaw); + saved_game->write(viewheight); + saved_game->write(damageEvent); + saved_game->write(damageYaw); + saved_game->write(damagePitch); + saved_game->write(damageCount); + saved_game->write(stats); + saved_game->write(persistant); + saved_game->write(powerups); + saved_game->write(ammo); + saved_game->write(inventory); + saved_game->write(security_key_message); + saved_game->write(serverViewOrg); + saved_game->write(saberInFlight); + +#ifdef JK2_MODE + saved_game->write(saberActive); + saved_game->write(vehicleModel); + saved_game->write(viewEntity); + saved_game->write(saberColor); + saved_game->write(saberLength); + saved_game->write(saberLengthMax); + saved_game->write(forcePowersActive); +#else + saved_game->write(viewEntity); + saved_game->write(forcePowersActive); +#endif // JK2_MODE + + saved_game->write(useTime); + saved_game->write(lastShotTime); + saved_game->write(ping); + saved_game->write(lastOnGround); + saved_game->write(lastStationary); + saved_game->write(weaponShotCount); + saved_game->write<>(saber); + saved_game->write(dualSabers); + saved_game->write(saberMove); + saved_game->write(saberMoveNext); + saved_game->write(saberBounceMove); + saved_game->write(saberBlocking); + saved_game->write(saberBlocked); + saved_game->write(leanStopDebounceTime); + +#ifdef JK2_MODE + saved_game->write(saberLengthOld); +#endif // JK2_MODE + + saved_game->write(saberEntityNum); + saved_game->write(saberEntityDist); + saved_game->write(saberThrowTime); + saved_game->write(saberEntityState); + saved_game->write(saberDamageDebounceTime); + saved_game->write(saberHitWallSoundDebounceTime); + saved_game->write(saberEventFlags); + saved_game->write(saberBlockingTime); + saved_game->write(saberAnimLevel); + saved_game->write(saberAttackChainCount); + saved_game->write(saberLockTime); + saved_game->write(saberLockEnemy); + saved_game->write(saberStylesKnown); + +#ifdef JK2_MODE + saved_game->write(saberModel); +#endif // JK2_MODE + + saved_game->write(forcePowersKnown); + saved_game->write(forcePowerDuration); + saved_game->write(forcePowerDebounce); + saved_game->write(forcePower); + saved_game->write(forcePowerMax); + saved_game->write(forcePowerRegenDebounceTime); + saved_game->write(forcePowerRegenRate); + saved_game->write(forcePowerRegenAmount); + saved_game->write(forcePowerLevel); + saved_game->write(forceJumpZStart); + saved_game->write(forceJumpCharge); + saved_game->write(forceGripEntityNum); + saved_game->write(forceGripOrg); + saved_game->write(forceDrainEntityNum); + saved_game->write(forceDrainOrg); + saved_game->write(forceHealCount); + saved_game->write(forceAllowDeactivateTime); + saved_game->write(forceRageDrainTime); + saved_game->write(forceRageRecoveryTime); + saved_game->write(forceDrainEntNum); + saved_game->write(forceDrainTime); + saved_game->write(forcePowersForced); + saved_game->write(pullAttackEntNum); + saved_game->write(pullAttackTime); + saved_game->write(lastKickedEntNum); + saved_game->write(taunting); + saved_game->write(jumpZStart); + saved_game->write(moveDir); + saved_game->write(waterheight); + saved_game->write(waterHeightLevel); + saved_game->write(ikStatus); + saved_game->write(heldClient); + saved_game->write(heldByClient); + saved_game->write(heldByBolt); + saved_game->write(heldByBone); + saved_game->write(vehTurnaroundIndex); + saved_game->write(vehTurnaroundTime); + saved_game->write(brokenLimbs); + saved_game->write(electrifyTime); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(commandTime); + saved_game->read(pm_type); + saved_game->read(bobCycle); + saved_game->read(pm_flags); + saved_game->read(pm_time); + saved_game->read(origin); + saved_game->read(velocity); + saved_game->read(weaponTime); + saved_game->read(weaponChargeTime); + saved_game->read(rechargeTime); + saved_game->read(gravity); + saved_game->read(leanofs); + saved_game->read(friction); + saved_game->read(speed); + saved_game->read(delta_angles); + saved_game->read(groundEntityNum); + saved_game->read(legsAnim); + saved_game->read(legsAnimTimer); + saved_game->read(torsoAnim); + saved_game->read(torsoAnimTimer); + saved_game->read(movementDir); + saved_game->read(eFlags); + saved_game->read(eventSequence); + saved_game->read(events); + saved_game->read(eventParms); + saved_game->read(externalEvent); + saved_game->read(externalEventParm); + saved_game->read(externalEventTime); + saved_game->read(clientNum); + saved_game->read(weapon); + saved_game->read(weaponstate); + saved_game->read(batteryCharge); + saved_game->read(viewangles); + saved_game->read(legsYaw); + saved_game->read(viewheight); + saved_game->read(damageEvent); + saved_game->read(damageYaw); + saved_game->read(damagePitch); + saved_game->read(damageCount); + saved_game->read(stats); + saved_game->read(persistant); + saved_game->read(powerups); + saved_game->read(ammo); + saved_game->read(inventory); + saved_game->read(security_key_message); + saved_game->read(serverViewOrg); + saved_game->read(saberInFlight); + +#ifdef JK2_MODE + saved_game->read(saberActive); + saved_game->read(vehicleModel); + saved_game->read(viewEntity); + saved_game->read(saberColor); + saved_game->read(saberLength); + saved_game->read(saberLengthMax); + saved_game->read(forcePowersActive); +#else + saved_game->read(viewEntity); + saved_game->read(forcePowersActive); +#endif // JK2_MODE + + saved_game->read(useTime); + saved_game->read(lastShotTime); + saved_game->read(ping); + saved_game->read(lastOnGround); + saved_game->read(lastStationary); + saved_game->read(weaponShotCount); + saved_game->read<>(saber); + saved_game->read(dualSabers); + saved_game->read(saberMove); + saved_game->read(saberMoveNext); + saved_game->read(saberBounceMove); + saved_game->read(saberBlocking); + saved_game->read(saberBlocked); + saved_game->read(leanStopDebounceTime); + +#ifdef JK2_MODE + saved_game->read(saberLengthOld); +#endif // JK2_MODE + + saved_game->read(saberEntityNum); + saved_game->read(saberEntityDist); + saved_game->read(saberThrowTime); + saved_game->read(saberEntityState); + saved_game->read(saberDamageDebounceTime); + saved_game->read(saberHitWallSoundDebounceTime); + saved_game->read(saberEventFlags); + saved_game->read(saberBlockingTime); + saved_game->read(saberAnimLevel); + saved_game->read(saberAttackChainCount); + saved_game->read(saberLockTime); + saved_game->read(saberLockEnemy); + saved_game->read(saberStylesKnown); + +#ifdef JK2_MODE + saved_game->read(saberModel); +#endif // JK2_MODE + + saved_game->read(forcePowersKnown); + saved_game->read(forcePowerDuration); + saved_game->read(forcePowerDebounce); + saved_game->read(forcePower); + saved_game->read(forcePowerMax); + saved_game->read(forcePowerRegenDebounceTime); + saved_game->read(forcePowerRegenRate); + saved_game->read(forcePowerRegenAmount); + saved_game->read(forcePowerLevel); + saved_game->read(forceJumpZStart); + saved_game->read(forceJumpCharge); + saved_game->read(forceGripEntityNum); + saved_game->read(forceGripOrg); + saved_game->read(forceDrainEntityNum); + saved_game->read(forceDrainOrg); + saved_game->read(forceHealCount); + saved_game->read(forceAllowDeactivateTime); + saved_game->read(forceRageDrainTime); + saved_game->read(forceRageRecoveryTime); + saved_game->read(forceDrainEntNum); + saved_game->read(forceDrainTime); + saved_game->read(forcePowersForced); + saved_game->read(pullAttackEntNum); + saved_game->read(pullAttackTime); + saved_game->read(lastKickedEntNum); + saved_game->read(taunting); + saved_game->read(jumpZStart); + saved_game->read(moveDir); + saved_game->read(waterheight); + saved_game->read(waterHeightLevel); + saved_game->read(ikStatus); + saved_game->read(heldClient); + saved_game->read(heldByClient); + saved_game->read(heldByBolt); + saved_game->read(heldByBone); + saved_game->read(vehTurnaroundIndex); + saved_game->read(vehTurnaroundTime); + saved_game->read(brokenLimbs); + saved_game->read(electrifyTime); + } } playerState_t; //==================================================================== @@ -2347,10 +2921,30 @@ typedef struct usercmd_s { void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(serverTime); + saved_game->write(buttons); + saved_game->write(weapon); + saved_game->write(angles); + saved_game->write(generic_cmd); + saved_game->write(forwardmove); + saved_game->write(rightmove); + saved_game->write(upmove); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(serverTime); + saved_game->read(buttons); + saved_game->read(weapon); + saved_game->read(angles); + saved_game->read(generic_cmd); + saved_game->read(forwardmove); + saved_game->read(rightmove); + saved_game->read(upmove); + } } usercmd_t; //=================================================================== @@ -2377,10 +2971,24 @@ typedef struct {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(trType); + saved_game->write(trTime); + saved_game->write(trDuration); + saved_game->write(trBase); + saved_game->write(trDelta); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(trType); + saved_game->read(trTime); + saved_game->read(trDuration); + saved_game->read(trBase); + saved_game->read(trDelta); + } } trajectory_t; @@ -2465,10 +3073,104 @@ Ghoul2 Insert End void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(number); + saved_game->write(eType); + saved_game->write(eFlags); + saved_game->write<>(pos); + saved_game->write<>(apos); + saved_game->write(time); + saved_game->write(time2); + saved_game->write(origin); + saved_game->write(origin2); + saved_game->write(angles); + saved_game->write(angles2); + saved_game->write(otherEntityNum); + saved_game->write(otherEntityNum2); + saved_game->write(groundEntityNum); + saved_game->write(constantLight); + saved_game->write(loopSound); + saved_game->write(modelindex); + saved_game->write(modelindex2); + saved_game->write(modelindex3); + saved_game->write(clientNum); + saved_game->write(frame); + saved_game->write(solid); + saved_game->write(event); + saved_game->write(eventParm); + saved_game->write(powerups); + saved_game->write(weapon); + saved_game->write(legsAnim); + saved_game->write(legsAnimTimer); + saved_game->write(torsoAnim); + saved_game->write(torsoAnimTimer); + saved_game->write(scale); + saved_game->write(saberInFlight); + saved_game->write(saberActive); + +#ifdef JK2_MODE + saved_game->write(vehicleModel); +#endif // JK2_MODE + + saved_game->write(vehicleAngles); + saved_game->write(vehicleArmor); + saved_game->write(m_iVehicleNum); + saved_game->write(modelScale); + saved_game->write(radius); + saved_game->write(boltInfo); + saved_game->write(isPortalEnt); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(number); + saved_game->read(eType); + saved_game->read(eFlags); + saved_game->read<>(pos); + saved_game->read<>(apos); + saved_game->read(time); + saved_game->read(time2); + saved_game->read(origin); + saved_game->read(origin2); + saved_game->read(angles); + saved_game->read(angles2); + saved_game->read(otherEntityNum); + saved_game->read(otherEntityNum2); + saved_game->read(groundEntityNum); + saved_game->read(constantLight); + saved_game->read(loopSound); + saved_game->read(modelindex); + saved_game->read(modelindex2); + saved_game->read(modelindex3); + saved_game->read(clientNum); + saved_game->read(frame); + saved_game->read(solid); + saved_game->read(event); + saved_game->read(eventParm); + saved_game->read(powerups); + saved_game->read(weapon); + saved_game->read(legsAnim); + saved_game->read(legsAnimTimer); + saved_game->read(torsoAnim); + saved_game->read(torsoAnimTimer); + saved_game->read(scale); + saved_game->read(saberInFlight); + saved_game->read(saberActive); + +#ifdef JK2_MODE + saved_game->read(vehicleModel); +#endif // JK2_MODE + + saved_game->read(vehicleAngles); + saved_game->read(vehicleArmor); + saved_game->read(m_iVehicleNum); + saved_game->read(modelScale); + saved_game->read(radius); + saved_game->read(boltInfo); + saved_game->read(isPortalEnt); + } } entityState_t; diff --git a/code/rd-common/ghoul2_shared.cpp b/code/rd-common/ghoul2_shared.cpp deleted file mode 100644 index 1f849493a8..0000000000 --- a/code/rd-common/ghoul2_shared.cpp +++ /dev/null @@ -1,280 +0,0 @@ -#include "qcommon/q_shared.h" -#include "../game/ghoul2_shared.h" -#include "qcommon/ojk_i_saved_game.h" - - -void surfaceInfo_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(offFlags); - saved_game->write(surface); - saved_game->write(genBarycentricJ); - saved_game->write(genBarycentricI); - saved_game->write(genPolySurfaceIndex); - saved_game->write(genLod); -} - -void surfaceInfo_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(offFlags); - saved_game->read(surface); - saved_game->read(genBarycentricJ); - saved_game->read(genBarycentricI); - saved_game->read(genPolySurfaceIndex); - saved_game->read(genLod); -} - - -void boneInfo_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(boneNumber); - saved_game->write<>(matrix); - saved_game->write(flags); - saved_game->write(startFrame); - saved_game->write(endFrame); - saved_game->write(startTime); - saved_game->write(pauseTime); - saved_game->write(animSpeed); - saved_game->write(blendFrame); - saved_game->write(blendLerpFrame); - saved_game->write(blendTime); - saved_game->write(blendStart); - saved_game->write(boneBlendTime); - saved_game->write(boneBlendStart); - saved_game->write(newMatrix); - saved_game->write(lastTimeUpdated); - saved_game->write(lastContents); - saved_game->write(lastPosition); - saved_game->write(velocityEffector); - saved_game->write(lastAngles); - saved_game->write(minAngles); - saved_game->write(maxAngles); - saved_game->write(currentAngles); - saved_game->write(anglesOffset); - saved_game->write(positionOffset); - saved_game->write(radius); - saved_game->write(weight); - saved_game->write(ragIndex); - saved_game->write(velocityRoot); - saved_game->write(ragStartTime); - saved_game->write(firstTime); - saved_game->write(firstCollisionTime); - saved_game->write(restTime); - saved_game->write(RagFlags); - saved_game->write(DependentRagIndexMask); - saved_game->write<>(originalTrueBoneMatrix); - saved_game->write<>(parentTrueBoneMatrix); - saved_game->write<>(parentOriginalTrueBoneMatrix); - saved_game->write(originalOrigin); - saved_game->write(originalAngles); - saved_game->write(lastShotDir); - saved_game->write(basepose); - saved_game->write(baseposeInv); - saved_game->write(baseposeParent); - saved_game->write(baseposeInvParent); - saved_game->write(parentRawBoneIndex); - saved_game->write<>(ragOverrideMatrix); - saved_game->write<>(extraMatrix); - saved_game->write(extraVec1); - saved_game->write(extraFloat1); - saved_game->write(extraInt1); - saved_game->write(ikPosition); - saved_game->write(ikSpeed); - saved_game->write(epVelocity); - saved_game->write(epGravFactor); - saved_game->write(solidCount); - saved_game->write(physicsSettled); - saved_game->write(snapped); - saved_game->write(parentBoneIndex); - saved_game->write(offsetRotation); - saved_game->write(overGradSpeed); - saved_game->write(overGoalSpot); - saved_game->write(hasOverGoal); - saved_game->write<>(animFrameMatrix); - saved_game->write(hasAnimFrameMatrix); - saved_game->write(airTime); -} - -void boneInfo_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(boneNumber); - saved_game->read<>(matrix); - saved_game->read(flags); - saved_game->read(startFrame); - saved_game->read(endFrame); - saved_game->read(startTime); - saved_game->read(pauseTime); - saved_game->read(animSpeed); - saved_game->read(blendFrame); - saved_game->read(blendLerpFrame); - saved_game->read(blendTime); - saved_game->read(blendStart); - saved_game->read(boneBlendTime); - saved_game->read(boneBlendStart); - saved_game->read(newMatrix); - saved_game->read(lastTimeUpdated); - saved_game->read(lastContents); - saved_game->read(lastPosition); - saved_game->read(velocityEffector); - saved_game->read(lastAngles); - saved_game->read(minAngles); - saved_game->read(maxAngles); - saved_game->read(currentAngles); - saved_game->read(anglesOffset); - saved_game->read(positionOffset); - saved_game->read(radius); - saved_game->read(weight); - saved_game->read(ragIndex); - saved_game->read(velocityRoot); - saved_game->read(ragStartTime); - saved_game->read(firstTime); - saved_game->read(firstCollisionTime); - saved_game->read(restTime); - saved_game->read(RagFlags); - saved_game->read(DependentRagIndexMask); - saved_game->read<>(originalTrueBoneMatrix); - saved_game->read<>(parentTrueBoneMatrix); - saved_game->read<>(parentOriginalTrueBoneMatrix); - saved_game->read(originalOrigin); - saved_game->read(originalAngles); - saved_game->read(lastShotDir); - saved_game->read(basepose); - saved_game->read(baseposeInv); - saved_game->read(baseposeParent); - saved_game->read(baseposeInvParent); - saved_game->read(parentRawBoneIndex); - saved_game->read<>(ragOverrideMatrix); - saved_game->read<>(extraMatrix); - saved_game->read(extraVec1); - saved_game->read(extraFloat1); - saved_game->read(extraInt1); - saved_game->read(ikPosition); - saved_game->read(ikSpeed); - saved_game->read(epVelocity); - saved_game->read(epGravFactor); - saved_game->read(solidCount); - saved_game->read(physicsSettled); - saved_game->read(snapped); - saved_game->read(parentBoneIndex); - saved_game->read(offsetRotation); - saved_game->read(overGradSpeed); - saved_game->read(overGoalSpot); - saved_game->read(hasOverGoal); - saved_game->read<>(animFrameMatrix); - saved_game->read(hasAnimFrameMatrix); - saved_game->read(airTime); -} - - -void boltInfo_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(boneNumber); - saved_game->write(surfaceNumber); - saved_game->write(surfaceType); - saved_game->write(boltUsed); -} - -void boltInfo_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(boneNumber); - saved_game->read(surfaceNumber); - saved_game->read(surfaceType); - saved_game->read(boltUsed); -} - - -void CGhoul2Info::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(mModelindex); - saved_game->write(animModelIndexOffset); - saved_game->write(mCustomShader); - saved_game->write(mCustomSkin); - saved_game->write(mModelBoltLink); - saved_game->write(mSurfaceRoot); - saved_game->write(mLodBias); - saved_game->write(mNewOrigin); -#ifdef _G2_GORE - saved_game->write(mGoreSetTag); -#endif - saved_game->write(mModel); - saved_game->write(mFileName); - saved_game->write(mAnimFrameDefault); - saved_game->write(mSkelFrameNum); - saved_game->write(mMeshFrameNum); - saved_game->write(mFlags); -} - -void CGhoul2Info::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(mModelindex); - saved_game->read(animModelIndexOffset); - saved_game->read(mCustomShader); - saved_game->read(mCustomSkin); - saved_game->read(mModelBoltLink); - saved_game->read(mSurfaceRoot); - saved_game->read(mLodBias); - saved_game->read(mNewOrigin); -#ifdef _G2_GORE - saved_game->read(mGoreSetTag); -#endif - saved_game->read(mModel); - saved_game->read(mFileName); - saved_game->read(mAnimFrameDefault); - saved_game->read(mSkelFrameNum); - saved_game->read(mMeshFrameNum); - saved_game->read(mFlags); -} - - -void CGhoul2Info_v::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(mItem); -} - -void CGhoul2Info_v::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(mItem); -} - -void CCollisionRecord::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(mDistance); - saved_game->write(mEntityNum); - saved_game->write(mModelIndex); - saved_game->write(mPolyIndex); - saved_game->write(mSurfaceIndex); - saved_game->write(mCollisionPosition); - saved_game->write(mCollisionNormal); - saved_game->write(mFlags); - saved_game->write(mMaterial); - saved_game->write(mLocation); - saved_game->write(mBarycentricI); - saved_game->write(mBarycentricJ); -} - -void CCollisionRecord::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(mDistance); - saved_game->read(mEntityNum); - saved_game->read(mModelIndex); - saved_game->read(mPolyIndex); - saved_game->read(mSurfaceIndex); - saved_game->read(mCollisionPosition); - saved_game->read(mCollisionNormal); - saved_game->read(mFlags); - saved_game->read(mMaterial); - saved_game->read(mLocation); - saved_game->read(mBarycentricI); - saved_game->read(mBarycentricJ); -} diff --git a/code/rd-common/mdx_format.cpp b/code/rd-common/mdx_format.cpp deleted file mode 100644 index bb94d8d3c4..0000000000 --- a/code/rd-common/mdx_format.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "qcommon/q_shared.h" -#include "mdx_format.h" -#include "qcommon/ojk_i_saved_game.h" - - -void mdxaBone_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(matrix); -} - -void mdxaBone_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(matrix); -} diff --git a/code/rd-common/mdx_format.h b/code/rd-common/mdx_format.h index 9194f034a1..3637e8a9f2 100644 --- a/code/rd-common/mdx_format.h +++ b/code/rd-common/mdx_format.h @@ -163,11 +163,17 @@ typedef struct { #ifdef __cplusplus - void sg_export( - ojk::ISavedGame* saved_game) const; +void sg_export( + ojk::ISavedGame* saved_game) const +{ + saved_game->write(matrix); +} - void sg_import( - ojk::ISavedGame* saved_game); +void sg_import( + ojk::ISavedGame* saved_game) +{ + saved_game->read(matrix); +} #endif // __cplusplus } mdxaBone_t; #endif diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index e4ddfec308..f16462d170 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -133,9 +133,7 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) set(SPRDVanillaFiles ${SPRDVanillaFiles} ${SPRDVanillaMainFiles}) set(SPRDVanillaRdCommonFiles - "${SPDir}/rd-common/ghoul2_shared.cpp" "${SPDir}/rd-common/mdx_format.h" - "${SPDir}/rd-common/mdx_format.cpp" "${SPDir}/rd-common/tr_common.h" "${SPDir}/rd-common/tr_font.cpp" "${SPDir}/rd-common/tr_font.h" diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index faf204bb08..a099777f63 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -129,15 +129,11 @@ set(JK2SPGameGameFiles "${JK2SPDir}/game/Q3_Interface.h" "${JK2SPDir}/game/Q3_Registers.h" "${JK2SPDir}/game/ai.h" - "${JK2SPDir}/game/ai.cpp" "${JK2SPDir}/game/anims.h" - "${JK2SPDir}/game/anims.cpp" "${JK2SPDir}/game/b_local.h" "${JK2SPDir}/game/b_public.h" - "${JK2SPDir}/game/b_public.cpp" "${JK2SPDir}/game/bg_local.h" "${JK2SPDir}/game/bg_public.h" - "${JK2SPDir}/game/bg_public.cpp" "${JK2SPDir}/game/bset.h" "${JK2SPDir}/game/bstate.h" "${JK2SPDir}/game/channels.h" @@ -149,13 +145,11 @@ set(JK2SPGameGameFiles "${JK2SPDir}/game/g_icarus.h" "${JK2SPDir}/game/g_items.h" "${JK2SPDir}/game/g_local.h" - "${JK2SPDir}/game/g_local.cpp" "${JK2SPDir}/game/g_nav.h" "${JK2SPDir}/game/g_navigator.h" "${JK2SPDir}/game/g_public.h" "${JK2SPDir}/game/g_roff.h" "${JK2SPDir}/game/g_shared.h" - "${JK2SPDir}/game/g_shared.cpp" "${JK2SPDir}/game/genericparser2.h" "${JK2SPDir}/game/ghoul2_shared.h" "${JK2SPDir}/game/npc_headers.h" @@ -238,9 +232,7 @@ set(JK2SPGameCommonFiles "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SPDir}/qcommon/strippublic.h" - "${SPDir}/rd-common/ghoul2_shared.cpp" "${SPDir}/rd-common/mdx_format.h" - "${SPDir}/rd-common/mdx_format.cpp" "${SharedDir}/qcommon/ojk_i_saved_game.h" "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" diff --git a/codeJK2/game/ai.cpp b/codeJK2/game/ai.cpp deleted file mode 100644 index 7ba59e07ab..0000000000 --- a/codeJK2/game/ai.cpp +++ /dev/null @@ -1,67 +0,0 @@ -#include "../cgame/cg_local.h" -#include "ai.h" -#include "qcommon/ojk_i_saved_game.h" - - -void AIGroupMember_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(number); - saved_game->write(waypoint); - saved_game->write(pathCostToEnemy); - saved_game->write(closestBuddy); -} - -void AIGroupMember_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(number); - saved_game->read(waypoint); - saved_game->read(pathCostToEnemy); - saved_game->read(closestBuddy); -} - - -void AIGroupInfo_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(numGroup); - saved_game->write(processed); - saved_game->write(team); - saved_game->write(enemy); - saved_game->write(enemyWP); - saved_game->write(speechDebounceTime); - saved_game->write(lastClearShotTime); - saved_game->write(lastSeenEnemyTime); - saved_game->write(morale); - saved_game->write(moraleAdjust); - saved_game->write(moraleDebounce); - saved_game->write(memberValidateTime); - saved_game->write(activeMemberNum); - saved_game->write(commander); - saved_game->write(enemyLastSeenPos); - saved_game->write(numState); - saved_game->write<>(member); -} - -void AIGroupInfo_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(numGroup); - saved_game->read(processed); - saved_game->read(team); - saved_game->read(enemy); - saved_game->read(enemyWP); - saved_game->read(speechDebounceTime); - saved_game->read(lastClearShotTime); - saved_game->read(lastSeenEnemyTime); - saved_game->read(morale); - saved_game->read(moraleAdjust); - saved_game->read(moraleDebounce); - saved_game->read(memberValidateTime); - saved_game->read(activeMemberNum); - saved_game->read(commander); - saved_game->read(enemyLastSeenPos); - saved_game->read(numState); - saved_game->read<>(member); -} diff --git a/codeJK2/game/ai.h b/codeJK2/game/ai.h index b0dcba6994..ae16d8dbc7 100644 --- a/codeJK2/game/ai.h +++ b/codeJK2/game/ai.h @@ -114,10 +114,22 @@ typedef struct AIGroupMember_s void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(number); + saved_game->write(waypoint); + saved_game->write(pathCostToEnemy); + saved_game->write(closestBuddy); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(number); + saved_game->read(waypoint); + saved_game->read(pathCostToEnemy); + saved_game->read(closestBuddy); + } } AIGroupMember_t; #define MAX_GROUP_MEMBERS 32 @@ -144,10 +156,48 @@ typedef struct AIGroupInfo_s void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(numGroup); + saved_game->write(processed); + saved_game->write(team); + saved_game->write(enemy); + saved_game->write(enemyWP); + saved_game->write(speechDebounceTime); + saved_game->write(lastClearShotTime); + saved_game->write(lastSeenEnemyTime); + saved_game->write(morale); + saved_game->write(moraleAdjust); + saved_game->write(moraleDebounce); + saved_game->write(memberValidateTime); + saved_game->write(activeMemberNum); + saved_game->write(commander); + saved_game->write(enemyLastSeenPos); + saved_game->write(numState); + saved_game->write<>(member); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(numGroup); + saved_game->read(processed); + saved_game->read(team); + saved_game->read(enemy); + saved_game->read(enemyWP); + saved_game->read(speechDebounceTime); + saved_game->read(lastClearShotTime); + saved_game->read(lastSeenEnemyTime); + saved_game->read(morale); + saved_game->read(moraleAdjust); + saved_game->read(moraleDebounce); + saved_game->read(memberValidateTime); + saved_game->read(activeMemberNum); + saved_game->read(commander); + saved_game->read(enemyLastSeenPos); + saved_game->read(numState); + saved_game->read<>(member); + } } AIGroupInfo_t; int AI_GetGroupSize( vec3_t origin, int radius, team_t playerTeam, gentity_t *avoid = NULL ); diff --git a/codeJK2/game/anims.cpp b/codeJK2/game/anims.cpp deleted file mode 100644 index 0c97035dc4..0000000000 --- a/codeJK2/game/anims.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include "g_local.h" -#include "anims.h" -#include "qcommon/ojk_i_saved_game.h" - - -void animFileSet_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(filename); - saved_game->write<>(animations); - saved_game->write<>(torsoAnimSnds); - saved_game->write<>(legsAnimSnds); - saved_game->write(soundsCached); -} - -void animFileSet_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(filename); - saved_game->read<>(animations); - saved_game->read<>(torsoAnimSnds); - saved_game->read<>(legsAnimSnds); - saved_game->read(soundsCached); -} diff --git a/codeJK2/game/anims.h b/codeJK2/game/anims.h index 3d137477f1..893791ef8a 100644 --- a/codeJK2/game/anims.h +++ b/codeJK2/game/anims.h @@ -1409,10 +1409,24 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(filename); + saved_game->write<>(animations); + saved_game->write<>(torsoAnimSnds); + saved_game->write<>(legsAnimSnds); + saved_game->write(soundsCached); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(filename); + saved_game->read<>(animations); + saved_game->read<>(torsoAnimSnds); + saved_game->read<>(legsAnimSnds); + saved_game->read(soundsCached); + } } animFileSet_t; #define MAX_ANIM_FILES 64 diff --git a/codeJK2/game/b_public.cpp b/codeJK2/game/b_public.cpp deleted file mode 100644 index bc3daae4f2..0000000000 --- a/codeJK2/game/b_public.cpp +++ /dev/null @@ -1,259 +0,0 @@ -#include "b_local.h" -#include "b_public.h" -#include "qcommon/ojk_i_saved_game.h" - - -void gNPCstats_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(aggression); - saved_game->write(aim); - saved_game->write(earshot); - saved_game->write(evasion); - saved_game->write(hfov); - saved_game->write(intelligence); - saved_game->write(move); - saved_game->write(reactions); - saved_game->write(shootDistance); - saved_game->write(vfov); - saved_game->write(vigilance); - saved_game->write(visrange); - saved_game->write(moveType); - saved_game->write(runSpeed); - saved_game->write(walkSpeed); - saved_game->write(yawSpeed); - saved_game->write(health); - saved_game->write(acceleration); -} - -void gNPCstats_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(aggression); - saved_game->read(aim); - saved_game->read(earshot); - saved_game->read(evasion); - saved_game->read(hfov); - saved_game->read(intelligence); - saved_game->read(move); - saved_game->read(reactions); - saved_game->read(shootDistance); - saved_game->read(vfov); - saved_game->read(vigilance); - saved_game->read(visrange); - saved_game->read(moveType); - saved_game->read(runSpeed); - saved_game->read(walkSpeed); - saved_game->read(yawSpeed); - saved_game->read(health); - saved_game->read(acceleration); -} - - -void gNPC_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(timeOfDeath); - saved_game->write(touchedByPlayer); - saved_game->write(enemyLastVisibility); - saved_game->write(aimTime); - saved_game->write(desiredYaw); - saved_game->write(desiredPitch); - saved_game->write(lockedDesiredYaw); - saved_game->write(lockedDesiredPitch); - saved_game->write(aimingBeam); - saved_game->write(enemyLastSeenLocation); - saved_game->write(enemyLastSeenTime); - saved_game->write(enemyLastHeardLocation); - saved_game->write(enemyLastHeardTime); - saved_game->write(lastAlertID); - saved_game->write(eFlags); - saved_game->write(aiFlags); - saved_game->write(currentAmmo); - saved_game->write(shotTime); - saved_game->write(burstCount); - saved_game->write(burstMin); - saved_game->write(burstMean); - saved_game->write(burstMax); - saved_game->write(burstSpacing); - saved_game->write(attackHold); - saved_game->write(attackHoldTime); - saved_game->write(shootAngles); - saved_game->write(rank); - saved_game->write(behaviorState); - saved_game->write(defaultBehavior); - saved_game->write(tempBehavior); - saved_game->write(ignorePain); - saved_game->write(duckDebounceTime); - saved_game->write(walkDebounceTime); - saved_game->write(enemyCheckDebounceTime); - saved_game->write(investigateDebounceTime); - saved_game->write(investigateCount); - saved_game->write(investigateGoal); - saved_game->write(investigateSoundDebounceTime); - saved_game->write(greetingDebounceTime); - saved_game->write(eventOwner); - saved_game->write(coverTarg); - saved_game->write(jumpState); - saved_game->write(followDist); - saved_game->write(tempGoal); - saved_game->write(goalEntity); - saved_game->write(lastGoalEntity); - saved_game->write(eventualGoal); - saved_game->write(captureGoal); - saved_game->write(defendEnt); - saved_game->write(greetEnt); - saved_game->write(goalTime); - saved_game->write(straightToGoal); - saved_game->write(distToGoal); - saved_game->write(navTime); - saved_game->write(blockingEntNum); - saved_game->write(blockedSpeechDebounceTime); - saved_game->write(lastSideStepSide); - saved_game->write(sideStepHoldTime); - saved_game->write(homeWp); - saved_game->write(group); - saved_game->write(lastPathAngles); - saved_game->write<>(stats); - saved_game->write(aimErrorDebounceTime); - saved_game->write(lastAimErrorYaw); - saved_game->write(lastAimErrorPitch); - saved_game->write(aimOfs); - saved_game->write(currentAim); - saved_game->write(currentAggression); - saved_game->write(scriptFlags); - saved_game->write(desiredSpeed); - saved_game->write(currentSpeed); - saved_game->write(last_forwardmove); - saved_game->write(last_rightmove); - saved_game->write(lastClearOrigin); - saved_game->write(consecutiveBlockedMoves); - saved_game->write(blockedDebounceTime); - saved_game->write(shoveCount); - saved_game->write(blockedDest); - saved_game->write(combatPoint); - saved_game->write(lastFailedCombatPoint); - saved_game->write(movementSpeech); - saved_game->write(movementSpeechChance); - saved_game->write(nextBStateThink); - saved_game->write<>(last_ucmd); - saved_game->write(combatMove); - saved_game->write(goalRadius); - saved_game->write(pauseTime); - saved_game->write(standTime); - saved_game->write(localState); - saved_game->write(squadState); - saved_game->write(confusionTime); - saved_game->write(charmedTime); - saved_game->write(controlledTime); - saved_game->write(surrenderTime); - saved_game->write(enemyLaggedPos); - saved_game->write(watchTarget); - saved_game->write(ffireCount); - saved_game->write(ffireDebounce); - saved_game->write(ffireFadeDebounce); -} - -void gNPC_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(timeOfDeath); - saved_game->read(touchedByPlayer); - saved_game->read(enemyLastVisibility); - saved_game->read(aimTime); - saved_game->read(desiredYaw); - saved_game->read(desiredPitch); - saved_game->read(lockedDesiredYaw); - saved_game->read(lockedDesiredPitch); - saved_game->read(aimingBeam); - saved_game->read(enemyLastSeenLocation); - saved_game->read(enemyLastSeenTime); - saved_game->read(enemyLastHeardLocation); - saved_game->read(enemyLastHeardTime); - saved_game->read(lastAlertID); - saved_game->read(eFlags); - saved_game->read(aiFlags); - saved_game->read(currentAmmo); - saved_game->read(shotTime); - saved_game->read(burstCount); - saved_game->read(burstMin); - saved_game->read(burstMean); - saved_game->read(burstMax); - saved_game->read(burstSpacing); - saved_game->read(attackHold); - saved_game->read(attackHoldTime); - saved_game->read(shootAngles); - saved_game->read(rank); - saved_game->read(behaviorState); - saved_game->read(defaultBehavior); - saved_game->read(tempBehavior); - saved_game->read(ignorePain); - saved_game->read(duckDebounceTime); - saved_game->read(walkDebounceTime); - saved_game->read(enemyCheckDebounceTime); - saved_game->read(investigateDebounceTime); - saved_game->read(investigateCount); - saved_game->read(investigateGoal); - saved_game->read(investigateSoundDebounceTime); - saved_game->read(greetingDebounceTime); - saved_game->read(eventOwner); - saved_game->read(coverTarg); - saved_game->read(jumpState); - saved_game->read(followDist); - saved_game->read(tempGoal); - saved_game->read(goalEntity); - saved_game->read(lastGoalEntity); - saved_game->read(eventualGoal); - saved_game->read(captureGoal); - saved_game->read(defendEnt); - saved_game->read(greetEnt); - saved_game->read(goalTime); - saved_game->read(straightToGoal); - saved_game->read(distToGoal); - saved_game->read(navTime); - saved_game->read(blockingEntNum); - saved_game->read(blockedSpeechDebounceTime); - saved_game->read(lastSideStepSide); - saved_game->read(sideStepHoldTime); - saved_game->read(homeWp); - saved_game->read(group); - saved_game->read(lastPathAngles); - saved_game->read<>(stats); - saved_game->read(aimErrorDebounceTime); - saved_game->read(lastAimErrorYaw); - saved_game->read(lastAimErrorPitch); - saved_game->read(aimOfs); - saved_game->read(currentAim); - saved_game->read(currentAggression); - saved_game->read(scriptFlags); - saved_game->read(desiredSpeed); - saved_game->read(currentSpeed); - saved_game->read(last_forwardmove); - saved_game->read(last_rightmove); - saved_game->read(lastClearOrigin); - saved_game->read(consecutiveBlockedMoves); - saved_game->read(blockedDebounceTime); - saved_game->read(shoveCount); - saved_game->read(blockedDest); - saved_game->read(combatPoint); - saved_game->read(lastFailedCombatPoint); - saved_game->read(movementSpeech); - saved_game->read(movementSpeechChance); - saved_game->read(nextBStateThink); - saved_game->read<>(last_ucmd); - saved_game->read(combatMove); - saved_game->read(goalRadius); - saved_game->read(pauseTime); - saved_game->read(standTime); - saved_game->read(localState); - saved_game->read(squadState); - saved_game->read(confusionTime); - saved_game->read(charmedTime); - saved_game->read(controlledTime); - saved_game->read(surrenderTime); - saved_game->read(enemyLaggedPos); - saved_game->read(watchTarget); - saved_game->read(ffireCount); - saved_game->read(ffireDebounce); - saved_game->read(ffireFadeDebounce); -} diff --git a/codeJK2/game/b_public.h b/codeJK2/game/b_public.h index 9b92e32099..50abb30571 100644 --- a/codeJK2/game/b_public.h +++ b/codeJK2/game/b_public.h @@ -139,10 +139,50 @@ typedef struct gNPCstats_e void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(aggression); + saved_game->write(aim); + saved_game->write(earshot); + saved_game->write(evasion); + saved_game->write(hfov); + saved_game->write(intelligence); + saved_game->write(move); + saved_game->write(reactions); + saved_game->write(shootDistance); + saved_game->write(vfov); + saved_game->write(vigilance); + saved_game->write(visrange); + saved_game->write(moveType); + saved_game->write(runSpeed); + saved_game->write(walkSpeed); + saved_game->write(yawSpeed); + saved_game->write(health); + saved_game->write(acceleration); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(aggression); + saved_game->read(aim); + saved_game->read(earshot); + saved_game->read(evasion); + saved_game->read(hfov); + saved_game->read(intelligence); + saved_game->read(move); + saved_game->read(reactions); + saved_game->read(shootDistance); + saved_game->read(vfov); + saved_game->read(vigilance); + saved_game->read(visrange); + saved_game->read(moveType); + saved_game->read(runSpeed); + saved_game->read(walkSpeed); + saved_game->read(yawSpeed); + saved_game->read(health); + saved_game->read(acceleration); + } } gNPCstats_t; // NOTE!!! If you add any ptr fields into this structure could you please tell me so I can update the load/save code? @@ -304,10 +344,212 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(timeOfDeath); + saved_game->write(touchedByPlayer); + saved_game->write(enemyLastVisibility); + saved_game->write(aimTime); + saved_game->write(desiredYaw); + saved_game->write(desiredPitch); + saved_game->write(lockedDesiredYaw); + saved_game->write(lockedDesiredPitch); + saved_game->write(aimingBeam); + saved_game->write(enemyLastSeenLocation); + saved_game->write(enemyLastSeenTime); + saved_game->write(enemyLastHeardLocation); + saved_game->write(enemyLastHeardTime); + saved_game->write(lastAlertID); + saved_game->write(eFlags); + saved_game->write(aiFlags); + saved_game->write(currentAmmo); + saved_game->write(shotTime); + saved_game->write(burstCount); + saved_game->write(burstMin); + saved_game->write(burstMean); + saved_game->write(burstMax); + saved_game->write(burstSpacing); + saved_game->write(attackHold); + saved_game->write(attackHoldTime); + saved_game->write(shootAngles); + saved_game->write(rank); + saved_game->write(behaviorState); + saved_game->write(defaultBehavior); + saved_game->write(tempBehavior); + saved_game->write(ignorePain); + saved_game->write(duckDebounceTime); + saved_game->write(walkDebounceTime); + saved_game->write(enemyCheckDebounceTime); + saved_game->write(investigateDebounceTime); + saved_game->write(investigateCount); + saved_game->write(investigateGoal); + saved_game->write(investigateSoundDebounceTime); + saved_game->write(greetingDebounceTime); + saved_game->write(eventOwner); + saved_game->write(coverTarg); + saved_game->write(jumpState); + saved_game->write(followDist); + saved_game->write(tempGoal); + saved_game->write(goalEntity); + saved_game->write(lastGoalEntity); + saved_game->write(eventualGoal); + saved_game->write(captureGoal); + saved_game->write(defendEnt); + saved_game->write(greetEnt); + saved_game->write(goalTime); + saved_game->write(straightToGoal); + saved_game->write(distToGoal); + saved_game->write(navTime); + saved_game->write(blockingEntNum); + saved_game->write(blockedSpeechDebounceTime); + saved_game->write(lastSideStepSide); + saved_game->write(sideStepHoldTime); + saved_game->write(homeWp); + saved_game->write(group); + saved_game->write(lastPathAngles); + saved_game->write<>(stats); + saved_game->write(aimErrorDebounceTime); + saved_game->write(lastAimErrorYaw); + saved_game->write(lastAimErrorPitch); + saved_game->write(aimOfs); + saved_game->write(currentAim); + saved_game->write(currentAggression); + saved_game->write(scriptFlags); + saved_game->write(desiredSpeed); + saved_game->write(currentSpeed); + saved_game->write(last_forwardmove); + saved_game->write(last_rightmove); + saved_game->write(lastClearOrigin); + saved_game->write(consecutiveBlockedMoves); + saved_game->write(blockedDebounceTime); + saved_game->write(shoveCount); + saved_game->write(blockedDest); + saved_game->write(combatPoint); + saved_game->write(lastFailedCombatPoint); + saved_game->write(movementSpeech); + saved_game->write(movementSpeechChance); + saved_game->write(nextBStateThink); + saved_game->write<>(last_ucmd); + saved_game->write(combatMove); + saved_game->write(goalRadius); + saved_game->write(pauseTime); + saved_game->write(standTime); + saved_game->write(localState); + saved_game->write(squadState); + saved_game->write(confusionTime); + saved_game->write(charmedTime); + saved_game->write(controlledTime); + saved_game->write(surrenderTime); + saved_game->write(enemyLaggedPos); + saved_game->write(watchTarget); + saved_game->write(ffireCount); + saved_game->write(ffireDebounce); + saved_game->write(ffireFadeDebounce); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(timeOfDeath); + saved_game->read(touchedByPlayer); + saved_game->read(enemyLastVisibility); + saved_game->read(aimTime); + saved_game->read(desiredYaw); + saved_game->read(desiredPitch); + saved_game->read(lockedDesiredYaw); + saved_game->read(lockedDesiredPitch); + saved_game->read(aimingBeam); + saved_game->read(enemyLastSeenLocation); + saved_game->read(enemyLastSeenTime); + saved_game->read(enemyLastHeardLocation); + saved_game->read(enemyLastHeardTime); + saved_game->read(lastAlertID); + saved_game->read(eFlags); + saved_game->read(aiFlags); + saved_game->read(currentAmmo); + saved_game->read(shotTime); + saved_game->read(burstCount); + saved_game->read(burstMin); + saved_game->read(burstMean); + saved_game->read(burstMax); + saved_game->read(burstSpacing); + saved_game->read(attackHold); + saved_game->read(attackHoldTime); + saved_game->read(shootAngles); + saved_game->read(rank); + saved_game->read(behaviorState); + saved_game->read(defaultBehavior); + saved_game->read(tempBehavior); + saved_game->read(ignorePain); + saved_game->read(duckDebounceTime); + saved_game->read(walkDebounceTime); + saved_game->read(enemyCheckDebounceTime); + saved_game->read(investigateDebounceTime); + saved_game->read(investigateCount); + saved_game->read(investigateGoal); + saved_game->read(investigateSoundDebounceTime); + saved_game->read(greetingDebounceTime); + saved_game->read(eventOwner); + saved_game->read(coverTarg); + saved_game->read(jumpState); + saved_game->read(followDist); + saved_game->read(tempGoal); + saved_game->read(goalEntity); + saved_game->read(lastGoalEntity); + saved_game->read(eventualGoal); + saved_game->read(captureGoal); + saved_game->read(defendEnt); + saved_game->read(greetEnt); + saved_game->read(goalTime); + saved_game->read(straightToGoal); + saved_game->read(distToGoal); + saved_game->read(navTime); + saved_game->read(blockingEntNum); + saved_game->read(blockedSpeechDebounceTime); + saved_game->read(lastSideStepSide); + saved_game->read(sideStepHoldTime); + saved_game->read(homeWp); + saved_game->read(group); + saved_game->read(lastPathAngles); + saved_game->read<>(stats); + saved_game->read(aimErrorDebounceTime); + saved_game->read(lastAimErrorYaw); + saved_game->read(lastAimErrorPitch); + saved_game->read(aimOfs); + saved_game->read(currentAim); + saved_game->read(currentAggression); + saved_game->read(scriptFlags); + saved_game->read(desiredSpeed); + saved_game->read(currentSpeed); + saved_game->read(last_forwardmove); + saved_game->read(last_rightmove); + saved_game->read(lastClearOrigin); + saved_game->read(consecutiveBlockedMoves); + saved_game->read(blockedDebounceTime); + saved_game->read(shoveCount); + saved_game->read(blockedDest); + saved_game->read(combatPoint); + saved_game->read(lastFailedCombatPoint); + saved_game->read(movementSpeech); + saved_game->read(movementSpeechChance); + saved_game->read(nextBStateThink); + saved_game->read<>(last_ucmd); + saved_game->read(combatMove); + saved_game->read(goalRadius); + saved_game->read(pauseTime); + saved_game->read(standTime); + saved_game->read(localState); + saved_game->read(squadState); + saved_game->read(confusionTime); + saved_game->read(charmedTime); + saved_game->read(controlledTime); + saved_game->read(surrenderTime); + saved_game->read(enemyLaggedPos); + saved_game->read(watchTarget); + saved_game->read(ffireCount); + saved_game->read(ffireDebounce); + saved_game->read(ffireFadeDebounce); + } } gNPC_t; void G_SquadPathsInit(void); diff --git a/codeJK2/game/bg_public.cpp b/codeJK2/game/bg_public.cpp deleted file mode 100644 index 33d4df9e43..0000000000 --- a/codeJK2/game/bg_public.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "bg_public.h" -#include "qcommon/ojk_i_saved_game.h" - - -void animation_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(firstFrame); - saved_game->write(numFrames); - saved_game->write(loopFrames); - saved_game->write(frameLerp); - saved_game->write(initialLerp); -} - -void animation_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(firstFrame); - saved_game->read(numFrames); - saved_game->read(loopFrames); - saved_game->read(frameLerp); - saved_game->read(initialLerp); -} - - -void animsounds_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(keyFrame); - saved_game->write(soundIndex); - saved_game->write(numRandomAnimSounds); - saved_game->write(probability); -} - -void animsounds_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(keyFrame); - saved_game->read(soundIndex); - saved_game->read(numRandomAnimSounds); - saved_game->read(probability); -} diff --git a/codeJK2/game/bg_public.h b/codeJK2/game/bg_public.h index b3c376c9a1..e5907051a3 100644 --- a/codeJK2/game/bg_public.h +++ b/codeJK2/game/bg_public.h @@ -450,10 +450,24 @@ typedef struct animation_s { void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(firstFrame); + saved_game->write(numFrames); + saved_game->write(loopFrames); + saved_game->write(frameLerp); + saved_game->write(initialLerp); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(firstFrame); + saved_game->read(numFrames); + saved_game->read(loopFrames); + saved_game->read(frameLerp); + saved_game->read(initialLerp); + } } animation_t; #define MAX_RANDOM_ANIMSOUNDS 8 @@ -467,10 +481,22 @@ typedef struct animsounds_s void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(keyFrame); + saved_game->write(soundIndex); + saved_game->write(numRandomAnimSounds); + saved_game->write(probability); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(keyFrame); + saved_game->read(soundIndex); + saved_game->read(numRandomAnimSounds); + saved_game->read(probability); + } } animsounds_t; // means of death diff --git a/codeJK2/game/g_local.cpp b/codeJK2/game/g_local.cpp deleted file mode 100644 index 45e867ed8d..0000000000 --- a/codeJK2/game/g_local.cpp +++ /dev/null @@ -1,76 +0,0 @@ -#include "g_local.h" -#include "qcommon/ojk_i_saved_game.h" - - -void alertEvent_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(position); - saved_game->write(radius); - saved_game->write(level); - saved_game->write(type); - saved_game->write(owner); - saved_game->write(light); - saved_game->write(addLight); - saved_game->write(ID); - saved_game->write(timestamp); -} - -void alertEvent_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(position); - saved_game->read(radius); - saved_game->read(level); - saved_game->read(type); - saved_game->read(owner); - saved_game->read(light); - saved_game->read(addLight); - saved_game->read(ID); - saved_game->read(timestamp); -} - - -void level_locals_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(clients); - saved_game->write(maxclients); - saved_game->write(framenum); - saved_game->write(time); - saved_game->write(previousTime); - saved_game->write(globalTime); - saved_game->write(mapname); - saved_game->write(locationLinked); - saved_game->write(locationHead); - saved_game->write<>(alertEvents); - saved_game->write(numAlertEvents); - saved_game->write(curAlertID); - saved_game->write<>(groups); - saved_game->write<>(knownAnimFileSets); - saved_game->write(numKnownAnimFileSets); - saved_game->write(worldFlags); - saved_game->write(dmState); -} - -void level_locals_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(clients); - saved_game->read(maxclients); - saved_game->read(framenum); - saved_game->read(time); - saved_game->read(previousTime); - saved_game->read(globalTime); - saved_game->read(mapname); - saved_game->read(locationLinked); - saved_game->read(locationHead); - saved_game->read<>(alertEvents); - saved_game->read(numAlertEvents); - saved_game->read(curAlertID); - saved_game->read<>(groups); - saved_game->read<>(knownAnimFileSets); - saved_game->read(numKnownAnimFileSets); - saved_game->read(worldFlags); - saved_game->read(dmState); -} diff --git a/codeJK2/game/g_local.h b/codeJK2/game/g_local.h index f1030f3d44..623ec123ec 100644 --- a/codeJK2/game/g_local.h +++ b/codeJK2/game/g_local.h @@ -143,10 +143,32 @@ typedef struct alertEvent_s void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(position); + saved_game->write(radius); + saved_game->write(level); + saved_game->write(type); + saved_game->write(owner); + saved_game->write(light); + saved_game->write(addLight); + saved_game->write(ID); + saved_game->write(timestamp); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(position); + saved_game->read(radius); + saved_game->read(level); + saved_game->read(type); + saved_game->read(owner); + saved_game->read(light); + saved_game->read(addLight); + saved_game->read(ID); + saved_game->read(timestamp); + } } alertEvent_t; // @@ -225,10 +247,48 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(clients); + saved_game->write(maxclients); + saved_game->write(framenum); + saved_game->write(time); + saved_game->write(previousTime); + saved_game->write(globalTime); + saved_game->write(mapname); + saved_game->write(locationLinked); + saved_game->write(locationHead); + saved_game->write<>(alertEvents); + saved_game->write(numAlertEvents); + saved_game->write(curAlertID); + saved_game->write<>(groups); + saved_game->write<>(knownAnimFileSets); + saved_game->write(numKnownAnimFileSets); + saved_game->write(worldFlags); + saved_game->write(dmState); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(clients); + saved_game->read(maxclients); + saved_game->read(framenum); + saved_game->read(time); + saved_game->read(previousTime); + saved_game->read(globalTime); + saved_game->read(mapname); + saved_game->read(locationLinked); + saved_game->read(locationHead); + saved_game->read<>(alertEvents); + saved_game->read(numAlertEvents); + saved_game->read(curAlertID); + saved_game->read<>(groups); + saved_game->read<>(knownAnimFileSets); + saved_game->read(numKnownAnimFileSets); + saved_game->read(worldFlags); + saved_game->read(dmState); + } } level_locals_t; extern level_locals_t level; diff --git a/codeJK2/game/g_shared.cpp b/codeJK2/game/g_shared.cpp deleted file mode 100644 index b53b8db4f4..0000000000 --- a/codeJK2/game/g_shared.cpp +++ /dev/null @@ -1,802 +0,0 @@ -#include "g_local.h" -#include "g_shared.h" -#include "qcommon/ojk_i_saved_game.h" - - -void clientInfo_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(infoValid); - saved_game->write(name); - saved_game->write(team); - saved_game->write(score); - saved_game->write(handicap); - saved_game->write(legsModel); - saved_game->write(legsSkin); - saved_game->write(torsoModel); - saved_game->write(torsoSkin); - saved_game->write(headModel); - saved_game->write(headSkin); - saved_game->write(extensions); - saved_game->write(animFileIndex); - saved_game->write(sounds); - saved_game->write(customBasicSoundDir); - saved_game->write(customCombatSoundDir); - saved_game->write(customExtraSoundDir); - saved_game->write(customJediSoundDir); -} - -void clientInfo_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(infoValid); - saved_game->read(name); - saved_game->read(team); - saved_game->read(score); - saved_game->read(handicap); - saved_game->read(legsModel); - saved_game->read(legsSkin); - saved_game->read(torsoModel); - saved_game->read(torsoSkin); - saved_game->read(headModel); - saved_game->read(headSkin); - saved_game->read(extensions); - saved_game->read(animFileIndex); - saved_game->read(sounds); - saved_game->read(customBasicSoundDir); - saved_game->read(customCombatSoundDir); - saved_game->read(customExtraSoundDir); - saved_game->read(customJediSoundDir); -} - - -void modelInfo_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(modelIndex); - saved_game->write(customRGB); - saved_game->write(customAlpha); -} - -void modelInfo_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(modelIndex); - saved_game->read(customRGB); - saved_game->read(customAlpha); -} - - -void renderInfo_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write<>(legsModel); - saved_game->write(legsModelName); - saved_game->write<>(torsoModel); - saved_game->write<>(headModel); - saved_game->write(torsoModelName); - saved_game->write(headModelName); - saved_game->write(headYawRangeLeft); - saved_game->write(headYawRangeRight); - saved_game->write(headPitchRangeUp); - saved_game->write(headPitchRangeDown); - saved_game->write(torsoYawRangeLeft); - saved_game->write(torsoYawRangeRight); - saved_game->write(torsoPitchRangeUp); - saved_game->write(torsoPitchRangeDown); - saved_game->write(legsFrame); - saved_game->write(torsoFrame); - saved_game->write(legsFpsMod); - saved_game->write(torsoFpsMod); - saved_game->write(customRGB); - saved_game->write(customAlpha); - saved_game->write(renderFlags); - saved_game->write(muzzlePoint); - saved_game->write(muzzleDir); - saved_game->write(muzzlePointOld); - saved_game->write(muzzleDirOld); - saved_game->write(mPCalcTime); - saved_game->write(lockYaw); - saved_game->write(headPoint); - saved_game->write(headAngles); - saved_game->write(handRPoint); - saved_game->write(handLPoint); - saved_game->write(crotchPoint); - saved_game->write(footRPoint); - saved_game->write(footLPoint); - saved_game->write(torsoPoint); - saved_game->write(torsoAngles); - saved_game->write(eyePoint); - saved_game->write(eyeAngles); - saved_game->write(lookTarget); - saved_game->write(lookMode); - saved_game->write(lookTargetClearTime); - saved_game->write(lastVoiceVolume); - saved_game->write(lastHeadAngles); - saved_game->write(headBobAngles); - saved_game->write(targetHeadBobAngles); - saved_game->write(lookingDebounceTime); - saved_game->write(legsYaw); -} - -void renderInfo_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read<>(legsModel); - saved_game->read(legsModelName); - saved_game->read<>(torsoModel); - saved_game->read<>(headModel); - saved_game->read(torsoModelName); - saved_game->read(headModelName); - saved_game->read(headYawRangeLeft); - saved_game->read(headYawRangeRight); - saved_game->read(headPitchRangeUp); - saved_game->read(headPitchRangeDown); - saved_game->read(torsoYawRangeLeft); - saved_game->read(torsoYawRangeRight); - saved_game->read(torsoPitchRangeUp); - saved_game->read(torsoPitchRangeDown); - saved_game->read(legsFrame); - saved_game->read(torsoFrame); - saved_game->read(legsFpsMod); - saved_game->read(torsoFpsMod); - saved_game->read(customRGB); - saved_game->read(customAlpha); - saved_game->read(renderFlags); - saved_game->read(muzzlePoint); - saved_game->read(muzzleDir); - saved_game->read(muzzlePointOld); - saved_game->read(muzzleDirOld); - saved_game->read(mPCalcTime); - saved_game->read(lockYaw); - saved_game->read(headPoint); - saved_game->read(headAngles); - saved_game->read(handRPoint); - saved_game->read(handLPoint); - saved_game->read(crotchPoint); - saved_game->read(footRPoint); - saved_game->read(footLPoint); - saved_game->read(torsoPoint); - saved_game->read(torsoAngles); - saved_game->read(eyePoint); - saved_game->read(eyeAngles); - saved_game->read(lookTarget); - saved_game->read(lookMode); - saved_game->read(lookTargetClearTime); - saved_game->read(lastVoiceVolume); - saved_game->read(lastHeadAngles); - saved_game->read(headBobAngles); - saved_game->read(targetHeadBobAngles); - saved_game->read(lookingDebounceTime); - saved_game->read(legsYaw); -} - - -void playerTeamState_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(state); - saved_game->write(captures); - saved_game->write(basedefense); - saved_game->write(carrierdefense); - saved_game->write(flagrecovery); - saved_game->write(fragcarrier); - saved_game->write(assists); - saved_game->write(lasthurtcarrier); - saved_game->write(lastreturnedflag); - saved_game->write(flagsince); - saved_game->write(lastfraggedcarrier); -} - -void playerTeamState_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(state); - saved_game->read(captures); - saved_game->read(basedefense); - saved_game->read(carrierdefense); - saved_game->read(flagrecovery); - saved_game->read(fragcarrier); - saved_game->read(assists); - saved_game->read(lasthurtcarrier); - saved_game->read(lastreturnedflag); - saved_game->read(flagsince); - saved_game->read(lastfraggedcarrier); -} - - -void objectives_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(display); - saved_game->write(status); -} - -void objectives_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(display); - saved_game->read(status); -} - - -void missionStats_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(secretsFound); - saved_game->write(totalSecrets); - saved_game->write(shotsFired); - saved_game->write(hits); - saved_game->write(enemiesSpawned); - saved_game->write(enemiesKilled); - saved_game->write(saberThrownCnt); - saved_game->write(saberBlocksCnt); - saved_game->write(legAttacksCnt); - saved_game->write(armAttacksCnt); - saved_game->write(torsoAttacksCnt); - saved_game->write(otherAttacksCnt); - saved_game->write(forceUsed); - saved_game->write(weaponUsed); -} - -void missionStats_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(secretsFound); - saved_game->read(totalSecrets); - saved_game->read(shotsFired); - saved_game->read(hits); - saved_game->read(enemiesSpawned); - saved_game->read(enemiesKilled); - saved_game->read(saberThrownCnt); - saved_game->read(saberBlocksCnt); - saved_game->read(legAttacksCnt); - saved_game->read(armAttacksCnt); - saved_game->read(torsoAttacksCnt); - saved_game->read(otherAttacksCnt); - saved_game->read(forceUsed); - saved_game->read(weaponUsed); -} - - -void clientSession_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(missionObjectivesShown); - saved_game->write(sessionTeam); - saved_game->write<>(mission_objectives); - saved_game->write<>(missionStats); -} - -void clientSession_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(missionObjectivesShown); - saved_game->read(sessionTeam); - saved_game->read<>(mission_objectives); - saved_game->read<>(missionStats); -} - - -void clientPersistant_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(connected); - saved_game->write<>(lastCommand); - saved_game->write(localClient); - saved_game->write(netname); - saved_game->write(maxHealth); - saved_game->write(enterTime); - saved_game->write(cmd_angles); - saved_game->write<>(teamState); -} - -void clientPersistant_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(connected); - saved_game->read<>(lastCommand); - saved_game->read(localClient); - saved_game->read(netname); - saved_game->read(maxHealth); - saved_game->read(enterTime); - saved_game->read(cmd_angles); - saved_game->read<>(teamState); -} - - -void gclient_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write<>(ps); - saved_game->write<>(pers); - saved_game->write<>(sess); - saved_game->write(noclip); - saved_game->write(lastCmdTime); - saved_game->write<>(usercmd); - saved_game->write(buttons); - saved_game->write(oldbuttons); - saved_game->write(latched_buttons); - saved_game->write(damage_armor); - saved_game->write(damage_blood); - saved_game->write(damage_knockback); - saved_game->write(damage_from); - saved_game->write(damage_fromWorld); - saved_game->write(accurateCount); - saved_game->write(respawnTime); - saved_game->write(inactivityTime); - saved_game->write(inactivityWarning); - saved_game->write(idleTime); - saved_game->write(airOutTime); - saved_game->write(timeResidual); - saved_game->write(facial_blink); - saved_game->write(facial_frown); - saved_game->write(facial_aux); - saved_game->write<>(clientInfo); - saved_game->write(forced_forwardmove); - saved_game->write(forced_rightmove); - saved_game->write(fireDelay); - saved_game->write(playerTeam); - saved_game->write(enemyTeam); - saved_game->write(squadname); - saved_game->write(team_leader); - saved_game->write(leader); - saved_game->write(follower); - saved_game->write(numFollowers); - saved_game->write(formationGoal); - saved_game->write(nextFormGoal); - saved_game->write(NPC_class); - saved_game->write(hiddenDist); - saved_game->write(hiddenDir); - saved_game->write<>(renderInfo); - saved_game->write<>(saberTrail); - saved_game->write(dismembered); - saved_game->write(dismemberProbLegs); - saved_game->write(dismemberProbHead); - saved_game->write(dismemberProbArms); - saved_game->write(dismemberProbHands); - saved_game->write(dismemberProbWaist); - saved_game->write(standheight); - saved_game->write(crouchheight); - saved_game->write(poisonDamage); - saved_game->write(poisonTime); - saved_game->write(slopeRecalcTime); - saved_game->write(pushVec); - saved_game->write(pushVecTime); -} - -void gclient_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read<>(ps); - saved_game->read<>(pers); - saved_game->read<>(sess); - saved_game->read(noclip); - saved_game->read(lastCmdTime); - saved_game->read<>(usercmd); - saved_game->read(buttons); - saved_game->read(oldbuttons); - saved_game->read(latched_buttons); - saved_game->read(damage_armor); - saved_game->read(damage_blood); - saved_game->read(damage_knockback); - saved_game->read(damage_from); - saved_game->read(damage_fromWorld); - saved_game->read(accurateCount); - saved_game->read(respawnTime); - saved_game->read(inactivityTime); - saved_game->read(inactivityWarning); - saved_game->read(idleTime); - saved_game->read(airOutTime); - saved_game->read(timeResidual); - saved_game->read(facial_blink); - saved_game->read(facial_frown); - saved_game->read(facial_aux); - saved_game->read<>(clientInfo); - saved_game->read(forced_forwardmove); - saved_game->read(forced_rightmove); - saved_game->read(fireDelay); - saved_game->read(playerTeam); - saved_game->read(enemyTeam); - saved_game->read(squadname); - saved_game->read(team_leader); - saved_game->read(leader); - saved_game->read(follower); - saved_game->read(numFollowers); - saved_game->read(formationGoal); - saved_game->read(nextFormGoal); - saved_game->read(NPC_class); - saved_game->read(hiddenDist); - saved_game->read(hiddenDir); - saved_game->read<>(renderInfo); - saved_game->read<>(saberTrail); - saved_game->read(dismembered); - saved_game->read(dismemberProbLegs); - saved_game->read(dismemberProbHead); - saved_game->read(dismemberProbArms); - saved_game->read(dismemberProbHands); - saved_game->read(dismemberProbWaist); - saved_game->read(standheight); - saved_game->read(crouchheight); - saved_game->read(poisonDamage); - saved_game->read(poisonTime); - saved_game->read(slopeRecalcTime); - saved_game->read(pushVec); - saved_game->read(pushVecTime); -} - - -void parms_t::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write(parm); -} - -void parms_t::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read(parm); -} - - -void gentity_s::sg_export( - ojk::ISavedGame* saved_game) const -{ - saved_game->write<>(s); - saved_game->write(client); - saved_game->write(inuse); - saved_game->write(linked); - saved_game->write(svFlags); - saved_game->write(bmodel); - saved_game->write(mins); - saved_game->write(maxs); - saved_game->write(contents); - saved_game->write(absmin); - saved_game->write(absmax); - saved_game->write(currentOrigin); - saved_game->write(currentAngles); - saved_game->write(owner); - saved_game->write<>(ghoul2); - saved_game->write(classname); - saved_game->write(spawnflags); - saved_game->write(flags); - saved_game->write(model); - saved_game->write(model2); - saved_game->write(freetime); - saved_game->write(eventTime); - saved_game->write(freeAfterEvent); - saved_game->write(unlinkAfterEvent); - saved_game->write(physicsBounce); - saved_game->write(clipmask); - saved_game->write(speed); - saved_game->write(movedir); - saved_game->write(lastOrigin); - saved_game->write(lastAngles); - saved_game->write(mass); - saved_game->write(lastImpact); - saved_game->write(watertype); - saved_game->write(waterlevel); - saved_game->write(angle); - saved_game->write(target); - saved_game->write(target2); - saved_game->write(target3); - saved_game->write(target4); - saved_game->write(targetname); - saved_game->write(team); - saved_game->write(roff); - saved_game->write(roff_ctr); - saved_game->write(next_roff_time); - saved_game->write(fx_time); - saved_game->write(nextthink); - saved_game->write(e_ThinkFunc); - saved_game->write(e_clThinkFunc); - saved_game->write(e_ReachedFunc); - saved_game->write(e_BlockedFunc); - saved_game->write(e_TouchFunc); - saved_game->write(e_UseFunc); - saved_game->write(e_PainFunc); - saved_game->write(e_DieFunc); - saved_game->write(health); - saved_game->write(max_health); - saved_game->write(takedamage); - saved_game->write(material); - saved_game->write(damage); - saved_game->write(dflags); - saved_game->write(splashDamage); - saved_game->write(splashRadius); - saved_game->write(methodOfDeath); - saved_game->write(splashMethodOfDeath); - saved_game->write(locationDamage); - saved_game->write(chain); - saved_game->write(enemy); - saved_game->write(activator); - saved_game->write(teamchain); - saved_game->write(teammaster); - saved_game->write(lastEnemy); - saved_game->write(wait); - saved_game->write(random); - saved_game->write(delay); - saved_game->write(alt_fire); - saved_game->write(count); - saved_game->write(bounceCount); - saved_game->write(fly_sound_debounce_time); - saved_game->write(painDebounceTime); - saved_game->write(disconnectDebounceTime); - saved_game->write(attackDebounceTime); - saved_game->write(pushDebounceTime); - saved_game->write(aimDebounceTime); - saved_game->write(useDebounceTime); - saved_game->write(trigger_formation); - saved_game->write(waypoint); - saved_game->write(lastWaypoint); - saved_game->write(lastValidWaypoint); - saved_game->write(noWaypointTime); - saved_game->write(combatPoint); - saved_game->write(failedWaypoints); - saved_game->write(failedWaypointCheckTime); - saved_game->write(loopAnim); - saved_game->write(startFrame); - saved_game->write(endFrame); - saved_game->write(sequencer); - saved_game->write(taskManager); - saved_game->write(taskID); - saved_game->write(parms); - saved_game->write(behaviorSet); - saved_game->write(script_targetname); - saved_game->write(delayScriptTime); - saved_game->write(fullName); - saved_game->write(soundSet); - saved_game->write(setTime); - saved_game->write(cameraGroup); - saved_game->write(noDamageTeam); - saved_game->write(playerModel); - saved_game->write(weaponModel); - saved_game->write(handRBolt); - saved_game->write(handLBolt); - saved_game->write(headBolt); - saved_game->write(cervicalBolt); - saved_game->write(chestBolt); - saved_game->write(gutBolt); - saved_game->write(torsoBolt); - saved_game->write(crotchBolt); - saved_game->write(motionBolt); - saved_game->write(kneeLBolt); - saved_game->write(kneeRBolt); - saved_game->write(elbowLBolt); - saved_game->write(elbowRBolt); - saved_game->write(footLBolt); - saved_game->write(footRBolt); - saved_game->write(faceBone); - saved_game->write(craniumBone); - saved_game->write(cervicalBone); - saved_game->write(thoracicBone); - saved_game->write(upperLumbarBone); - saved_game->write(lowerLumbarBone); - saved_game->write(hipsBone); - saved_game->write(motionBone); - saved_game->write(rootBone); - saved_game->write(footLBone); - saved_game->write(footRBone); - saved_game->write(genericBone1); - saved_game->write(genericBone2); - saved_game->write(genericBone3); - saved_game->write(genericBolt1); - saved_game->write(genericBolt2); - saved_game->write(genericBolt3); - saved_game->write(genericBolt4); - saved_game->write(genericBolt5); - saved_game->write(cinematicModel); - saved_game->write(NPC); - saved_game->write(ownername); - saved_game->write(cantHitEnemyCounter); - saved_game->write(NPC_type); - saved_game->write(NPC_targetname); - saved_game->write(NPC_target); - saved_game->write(moverState); - saved_game->write(soundPos1); - saved_game->write(sound1to2); - saved_game->write(sound2to1); - saved_game->write(soundPos2); - saved_game->write(soundLoop); - saved_game->write(nextTrain); - saved_game->write(prevTrain); - saved_game->write(pos1); - saved_game->write(pos2); - saved_game->write(pos3); - saved_game->write(sounds); - saved_game->write(closetarget); - saved_game->write(opentarget); - saved_game->write(paintarget); - saved_game->write(lockCount); - saved_game->write(radius); - saved_game->write(wpIndex); - saved_game->write(noise_index); - saved_game->write(startRGBA); - saved_game->write(finalRGBA); - saved_game->write(item); - saved_game->write(message); - saved_game->write(lightLevel); - saved_game->write(forcePushTime); - saved_game->write(forcePuller); -} - -void gentity_s::sg_import( - ojk::ISavedGame* saved_game) -{ - saved_game->read<>(s); - saved_game->read(client); - saved_game->read(inuse); - saved_game->read(linked); - saved_game->read(svFlags); - saved_game->read(bmodel); - saved_game->read(mins); - saved_game->read(maxs); - saved_game->read(contents); - saved_game->read(absmin); - saved_game->read(absmax); - saved_game->read(currentOrigin); - saved_game->read(currentAngles); - saved_game->read(owner); - saved_game->read<>(ghoul2); - saved_game->read(classname); - saved_game->read(spawnflags); - saved_game->read(flags); - saved_game->read(model); - saved_game->read(model2); - saved_game->read(freetime); - saved_game->read(eventTime); - saved_game->read(freeAfterEvent); - saved_game->read(unlinkAfterEvent); - saved_game->read(physicsBounce); - saved_game->read(clipmask); - saved_game->read(speed); - saved_game->read(movedir); - saved_game->read(lastOrigin); - saved_game->read(lastAngles); - saved_game->read(mass); - saved_game->read(lastImpact); - saved_game->read(watertype); - saved_game->read(waterlevel); - saved_game->read(angle); - saved_game->read(target); - saved_game->read(target2); - saved_game->read(target3); - saved_game->read(target4); - saved_game->read(targetname); - saved_game->read(team); - saved_game->read(roff); - saved_game->read(roff_ctr); - saved_game->read(next_roff_time); - saved_game->read(fx_time); - saved_game->read(nextthink); - saved_game->read(e_ThinkFunc); - saved_game->read(e_clThinkFunc); - saved_game->read(e_ReachedFunc); - saved_game->read(e_BlockedFunc); - saved_game->read(e_TouchFunc); - saved_game->read(e_UseFunc); - saved_game->read(e_PainFunc); - saved_game->read(e_DieFunc); - saved_game->read(health); - saved_game->read(max_health); - saved_game->read(takedamage); - saved_game->read(material); - saved_game->read(damage); - saved_game->read(dflags); - saved_game->read(splashDamage); - saved_game->read(splashRadius); - saved_game->read(methodOfDeath); - saved_game->read(splashMethodOfDeath); - saved_game->read(locationDamage); - saved_game->read(chain); - saved_game->read(enemy); - saved_game->read(activator); - saved_game->read(teamchain); - saved_game->read(teammaster); - saved_game->read(lastEnemy); - saved_game->read(wait); - saved_game->read(random); - saved_game->read(delay); - saved_game->read(alt_fire); - saved_game->read(count); - saved_game->read(bounceCount); - saved_game->read(fly_sound_debounce_time); - saved_game->read(painDebounceTime); - saved_game->read(disconnectDebounceTime); - saved_game->read(attackDebounceTime); - saved_game->read(pushDebounceTime); - saved_game->read(aimDebounceTime); - saved_game->read(useDebounceTime); - saved_game->read(trigger_formation); - saved_game->read(waypoint); - saved_game->read(lastWaypoint); - saved_game->read(lastValidWaypoint); - saved_game->read(noWaypointTime); - saved_game->read(combatPoint); - saved_game->read(failedWaypoints); - saved_game->read(failedWaypointCheckTime); - saved_game->read(loopAnim); - saved_game->read(startFrame); - saved_game->read(endFrame); - saved_game->read(sequencer); - saved_game->read(taskManager); - saved_game->read(taskID); - saved_game->read(parms); - saved_game->read(behaviorSet); - saved_game->read(script_targetname); - saved_game->read(delayScriptTime); - saved_game->read(fullName); - saved_game->read(soundSet); - saved_game->read(setTime); - saved_game->read(cameraGroup); - saved_game->read(noDamageTeam); - saved_game->read(playerModel); - saved_game->read(weaponModel); - saved_game->read(handRBolt); - saved_game->read(handLBolt); - saved_game->read(headBolt); - saved_game->read(cervicalBolt); - saved_game->read(chestBolt); - saved_game->read(gutBolt); - saved_game->read(torsoBolt); - saved_game->read(crotchBolt); - saved_game->read(motionBolt); - saved_game->read(kneeLBolt); - saved_game->read(kneeRBolt); - saved_game->read(elbowLBolt); - saved_game->read(elbowRBolt); - saved_game->read(footLBolt); - saved_game->read(footRBolt); - saved_game->read(faceBone); - saved_game->read(craniumBone); - saved_game->read(cervicalBone); - saved_game->read(thoracicBone); - saved_game->read(upperLumbarBone); - saved_game->read(lowerLumbarBone); - saved_game->read(hipsBone); - saved_game->read(motionBone); - saved_game->read(rootBone); - saved_game->read(footLBone); - saved_game->read(footRBone); - saved_game->read(genericBone1); - saved_game->read(genericBone2); - saved_game->read(genericBone3); - saved_game->read(genericBolt1); - saved_game->read(genericBolt2); - saved_game->read(genericBolt3); - saved_game->read(genericBolt4); - saved_game->read(genericBolt5); - saved_game->read(cinematicModel); - saved_game->read(NPC); - saved_game->read(ownername); - saved_game->read(cantHitEnemyCounter); - saved_game->read(NPC_type); - saved_game->read(NPC_targetname); - saved_game->read(NPC_target); - saved_game->read(moverState); - saved_game->read(soundPos1); - saved_game->read(sound1to2); - saved_game->read(sound2to1); - saved_game->read(soundPos2); - saved_game->read(soundLoop); - saved_game->read(nextTrain); - saved_game->read(prevTrain); - saved_game->read(pos1); - saved_game->read(pos2); - saved_game->read(pos3); - saved_game->read(sounds); - saved_game->read(closetarget); - saved_game->read(opentarget); - saved_game->read(paintarget); - saved_game->read(lockCount); - saved_game->read(radius); - saved_game->read(wpIndex); - saved_game->read(noise_index); - saved_game->read(startRGBA); - saved_game->read(finalRGBA); - saved_game->read(item); - saved_game->read(message); - saved_game->read(lightLevel); - saved_game->read(forcePushTime); - saved_game->read(forcePuller); -} diff --git a/codeJK2/game/g_shared.h b/codeJK2/game/g_shared.h index 1de161a709..90726949a9 100644 --- a/codeJK2/game/g_shared.h +++ b/codeJK2/game/g_shared.h @@ -152,10 +152,50 @@ typedef struct { void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(infoValid); + saved_game->write(name); + saved_game->write(team); + saved_game->write(score); + saved_game->write(handicap); + saved_game->write(legsModel); + saved_game->write(legsSkin); + saved_game->write(torsoModel); + saved_game->write(torsoSkin); + saved_game->write(headModel); + saved_game->write(headSkin); + saved_game->write(extensions); + saved_game->write(animFileIndex); + saved_game->write(sounds); + saved_game->write(customBasicSoundDir); + saved_game->write(customCombatSoundDir); + saved_game->write(customExtraSoundDir); + saved_game->write(customJediSoundDir); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(infoValid); + saved_game->read(name); + saved_game->read(team); + saved_game->read(score); + saved_game->read(handicap); + saved_game->read(legsModel); + saved_game->read(legsSkin); + saved_game->read(torsoModel); + saved_game->read(torsoSkin); + saved_game->read(headModel); + saved_game->read(headSkin); + saved_game->read(extensions); + saved_game->read(animFileIndex); + saved_game->read(sounds); + saved_game->read(customBasicSoundDir); + saved_game->read(customCombatSoundDir); + saved_game->read(customExtraSoundDir); + saved_game->read(customJediSoundDir); + } } clientInfo_t; @@ -179,10 +219,20 @@ typedef struct modelInfo_s void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(modelIndex); + saved_game->write(customRGB); + saved_game->write(customAlpha); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(modelIndex); + saved_game->read(customRGB); + saved_game->read(customAlpha); + } } modelInfo_t; typedef enum @@ -283,10 +333,108 @@ typedef struct renderInfo_s void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write<>(legsModel); + saved_game->write(legsModelName); + saved_game->write<>(torsoModel); + saved_game->write<>(headModel); + saved_game->write(torsoModelName); + saved_game->write(headModelName); + saved_game->write(headYawRangeLeft); + saved_game->write(headYawRangeRight); + saved_game->write(headPitchRangeUp); + saved_game->write(headPitchRangeDown); + saved_game->write(torsoYawRangeLeft); + saved_game->write(torsoYawRangeRight); + saved_game->write(torsoPitchRangeUp); + saved_game->write(torsoPitchRangeDown); + saved_game->write(legsFrame); + saved_game->write(torsoFrame); + saved_game->write(legsFpsMod); + saved_game->write(torsoFpsMod); + saved_game->write(customRGB); + saved_game->write(customAlpha); + saved_game->write(renderFlags); + saved_game->write(muzzlePoint); + saved_game->write(muzzleDir); + saved_game->write(muzzlePointOld); + saved_game->write(muzzleDirOld); + saved_game->write(mPCalcTime); + saved_game->write(lockYaw); + saved_game->write(headPoint); + saved_game->write(headAngles); + saved_game->write(handRPoint); + saved_game->write(handLPoint); + saved_game->write(crotchPoint); + saved_game->write(footRPoint); + saved_game->write(footLPoint); + saved_game->write(torsoPoint); + saved_game->write(torsoAngles); + saved_game->write(eyePoint); + saved_game->write(eyeAngles); + saved_game->write(lookTarget); + saved_game->write(lookMode); + saved_game->write(lookTargetClearTime); + saved_game->write(lastVoiceVolume); + saved_game->write(lastHeadAngles); + saved_game->write(headBobAngles); + saved_game->write(targetHeadBobAngles); + saved_game->write(lookingDebounceTime); + saved_game->write(legsYaw); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read<>(legsModel); + saved_game->read(legsModelName); + saved_game->read<>(torsoModel); + saved_game->read<>(headModel); + saved_game->read(torsoModelName); + saved_game->read(headModelName); + saved_game->read(headYawRangeLeft); + saved_game->read(headYawRangeRight); + saved_game->read(headPitchRangeUp); + saved_game->read(headPitchRangeDown); + saved_game->read(torsoYawRangeLeft); + saved_game->read(torsoYawRangeRight); + saved_game->read(torsoPitchRangeUp); + saved_game->read(torsoPitchRangeDown); + saved_game->read(legsFrame); + saved_game->read(torsoFrame); + saved_game->read(legsFpsMod); + saved_game->read(torsoFpsMod); + saved_game->read(customRGB); + saved_game->read(customAlpha); + saved_game->read(renderFlags); + saved_game->read(muzzlePoint); + saved_game->read(muzzleDir); + saved_game->read(muzzlePointOld); + saved_game->read(muzzleDirOld); + saved_game->read(mPCalcTime); + saved_game->read(lockYaw); + saved_game->read(headPoint); + saved_game->read(headAngles); + saved_game->read(handRPoint); + saved_game->read(handLPoint); + saved_game->read(crotchPoint); + saved_game->read(footRPoint); + saved_game->read(footLPoint); + saved_game->read(torsoPoint); + saved_game->read(torsoAngles); + saved_game->read(eyePoint); + saved_game->read(eyeAngles); + saved_game->read(lookTarget); + saved_game->read(lookMode); + saved_game->read(lookTargetClearTime); + saved_game->read(lastVoiceVolume); + saved_game->read(lastHeadAngles); + saved_game->read(headBobAngles); + saved_game->read(targetHeadBobAngles); + saved_game->read(lookingDebounceTime); + saved_game->read(legsYaw); + } } renderInfo_t; // Movement information structure @@ -332,10 +480,36 @@ typedef struct { void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(state); + saved_game->write(captures); + saved_game->write(basedefense); + saved_game->write(carrierdefense); + saved_game->write(flagrecovery); + saved_game->write(fragcarrier); + saved_game->write(assists); + saved_game->write(lasthurtcarrier); + saved_game->write(lastreturnedflag); + saved_game->write(flagsince); + saved_game->write(lastfraggedcarrier); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(state); + saved_game->read(captures); + saved_game->read(basedefense); + saved_game->read(carrierdefense); + saved_game->read(flagrecovery); + saved_game->read(fragcarrier); + saved_game->read(assists); + saved_game->read(lasthurtcarrier); + saved_game->read(lastreturnedflag); + saved_game->read(flagsince); + saved_game->read(lastfraggedcarrier); + } } playerTeamState_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! @@ -346,10 +520,18 @@ typedef struct objectives_s void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(display); + saved_game->write(status); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(display); + saved_game->read(status); + } } objectives_t; #define MAX_MISSION_OBJ 80 @@ -373,10 +555,42 @@ typedef struct missionStats_s void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(secretsFound); + saved_game->write(totalSecrets); + saved_game->write(shotsFired); + saved_game->write(hits); + saved_game->write(enemiesSpawned); + saved_game->write(enemiesKilled); + saved_game->write(saberThrownCnt); + saved_game->write(saberBlocksCnt); + saved_game->write(legAttacksCnt); + saved_game->write(armAttacksCnt); + saved_game->write(torsoAttacksCnt); + saved_game->write(otherAttacksCnt); + saved_game->write(forceUsed); + saved_game->write(weaponUsed); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(secretsFound); + saved_game->read(totalSecrets); + saved_game->read(shotsFired); + saved_game->read(hits); + saved_game->read(enemiesSpawned); + saved_game->read(enemiesKilled); + saved_game->read(saberThrownCnt); + saved_game->read(saberBlocksCnt); + saved_game->read(legAttacksCnt); + saved_game->read(armAttacksCnt); + saved_game->read(torsoAttacksCnt); + saved_game->read(otherAttacksCnt); + saved_game->read(forceUsed); + saved_game->read(weaponUsed); + } } missionStats_t; // the auto following clients don't follow a specific client @@ -398,10 +612,22 @@ typedef struct { void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(missionObjectivesShown); + saved_game->write(sessionTeam); + saved_game->write<>(mission_objectives); + saved_game->write<>(missionStats); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(missionObjectivesShown); + saved_game->read(sessionTeam); + saved_game->read<>(mission_objectives); + saved_game->read<>(missionStats); + } } clientSession_t; // client data that stays across multiple respawns, but is cleared @@ -420,10 +646,30 @@ typedef struct { void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(connected); + saved_game->write<>(lastCommand); + saved_game->write(localClient); + saved_game->write(netname); + saved_game->write(maxHealth); + saved_game->write(enterTime); + saved_game->write(cmd_angles); + saved_game->write<>(teamState); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(connected); + saved_game->read<>(lastCommand); + saved_game->read(localClient); + saved_game->read(netname); + saved_game->read(maxHealth); + saved_game->read(enterTime); + saved_game->read(cmd_angles); + saved_game->read<>(teamState); + } } clientPersistant_t; typedef enum { @@ -541,10 +787,124 @@ struct gclient_s { void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write<>(ps); + saved_game->write<>(pers); + saved_game->write<>(sess); + saved_game->write(noclip); + saved_game->write(lastCmdTime); + saved_game->write<>(usercmd); + saved_game->write(buttons); + saved_game->write(oldbuttons); + saved_game->write(latched_buttons); + saved_game->write(damage_armor); + saved_game->write(damage_blood); + saved_game->write(damage_knockback); + saved_game->write(damage_from); + saved_game->write(damage_fromWorld); + saved_game->write(accurateCount); + saved_game->write(respawnTime); + saved_game->write(inactivityTime); + saved_game->write(inactivityWarning); + saved_game->write(idleTime); + saved_game->write(airOutTime); + saved_game->write(timeResidual); + saved_game->write(facial_blink); + saved_game->write(facial_frown); + saved_game->write(facial_aux); + saved_game->write<>(clientInfo); + saved_game->write(forced_forwardmove); + saved_game->write(forced_rightmove); + saved_game->write(fireDelay); + saved_game->write(playerTeam); + saved_game->write(enemyTeam); + saved_game->write(squadname); + saved_game->write(team_leader); + saved_game->write(leader); + saved_game->write(follower); + saved_game->write(numFollowers); + saved_game->write(formationGoal); + saved_game->write(nextFormGoal); + saved_game->write(NPC_class); + saved_game->write(hiddenDist); + saved_game->write(hiddenDir); + saved_game->write<>(renderInfo); + saved_game->write<>(saberTrail); + saved_game->write(dismembered); + saved_game->write(dismemberProbLegs); + saved_game->write(dismemberProbHead); + saved_game->write(dismemberProbArms); + saved_game->write(dismemberProbHands); + saved_game->write(dismemberProbWaist); + saved_game->write(standheight); + saved_game->write(crouchheight); + saved_game->write(poisonDamage); + saved_game->write(poisonTime); + saved_game->write(slopeRecalcTime); + saved_game->write(pushVec); + saved_game->write(pushVecTime); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read<>(ps); + saved_game->read<>(pers); + saved_game->read<>(sess); + saved_game->read(noclip); + saved_game->read(lastCmdTime); + saved_game->read<>(usercmd); + saved_game->read(buttons); + saved_game->read(oldbuttons); + saved_game->read(latched_buttons); + saved_game->read(damage_armor); + saved_game->read(damage_blood); + saved_game->read(damage_knockback); + saved_game->read(damage_from); + saved_game->read(damage_fromWorld); + saved_game->read(accurateCount); + saved_game->read(respawnTime); + saved_game->read(inactivityTime); + saved_game->read(inactivityWarning); + saved_game->read(idleTime); + saved_game->read(airOutTime); + saved_game->read(timeResidual); + saved_game->read(facial_blink); + saved_game->read(facial_frown); + saved_game->read(facial_aux); + saved_game->read<>(clientInfo); + saved_game->read(forced_forwardmove); + saved_game->read(forced_rightmove); + saved_game->read(fireDelay); + saved_game->read(playerTeam); + saved_game->read(enemyTeam); + saved_game->read(squadname); + saved_game->read(team_leader); + saved_game->read(leader); + saved_game->read(follower); + saved_game->read(numFollowers); + saved_game->read(formationGoal); + saved_game->read(nextFormGoal); + saved_game->read(NPC_class); + saved_game->read(hiddenDist); + saved_game->read(hiddenDir); + saved_game->read<>(renderInfo); + saved_game->read<>(saberTrail); + saved_game->read(dismembered); + saved_game->read(dismemberProbLegs); + saved_game->read(dismemberProbHead); + saved_game->read(dismemberProbArms); + saved_game->read(dismemberProbHands); + saved_game->read(dismemberProbWaist); + saved_game->read(standheight); + saved_game->read(crouchheight); + saved_game->read(poisonDamage); + saved_game->read(poisonTime); + saved_game->read(slopeRecalcTime); + saved_game->read(pushVec); + saved_game->read(pushVecTime); + } }; #define MAX_PARMS 16 @@ -555,10 +915,16 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write(parm); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read(parm); + } } parms_t; #define GAME_INCLUDE @@ -877,10 +1243,366 @@ Ghoul2 Insert End void sg_export( - ojk::ISavedGame* saved_game) const; + ojk::ISavedGame* saved_game) const + { + saved_game->write<>(s); + saved_game->write(client); + saved_game->write(inuse); + saved_game->write(linked); + saved_game->write(svFlags); + saved_game->write(bmodel); + saved_game->write(mins); + saved_game->write(maxs); + saved_game->write(contents); + saved_game->write(absmin); + saved_game->write(absmax); + saved_game->write(currentOrigin); + saved_game->write(currentAngles); + saved_game->write(owner); + saved_game->write<>(ghoul2); + saved_game->write(classname); + saved_game->write(spawnflags); + saved_game->write(flags); + saved_game->write(model); + saved_game->write(model2); + saved_game->write(freetime); + saved_game->write(eventTime); + saved_game->write(freeAfterEvent); + saved_game->write(unlinkAfterEvent); + saved_game->write(physicsBounce); + saved_game->write(clipmask); + saved_game->write(speed); + saved_game->write(movedir); + saved_game->write(lastOrigin); + saved_game->write(lastAngles); + saved_game->write(mass); + saved_game->write(lastImpact); + saved_game->write(watertype); + saved_game->write(waterlevel); + saved_game->write(angle); + saved_game->write(target); + saved_game->write(target2); + saved_game->write(target3); + saved_game->write(target4); + saved_game->write(targetname); + saved_game->write(team); + saved_game->write(roff); + saved_game->write(roff_ctr); + saved_game->write(next_roff_time); + saved_game->write(fx_time); + saved_game->write(nextthink); + saved_game->write(e_ThinkFunc); + saved_game->write(e_clThinkFunc); + saved_game->write(e_ReachedFunc); + saved_game->write(e_BlockedFunc); + saved_game->write(e_TouchFunc); + saved_game->write(e_UseFunc); + saved_game->write(e_PainFunc); + saved_game->write(e_DieFunc); + saved_game->write(health); + saved_game->write(max_health); + saved_game->write(takedamage); + saved_game->write(material); + saved_game->write(damage); + saved_game->write(dflags); + saved_game->write(splashDamage); + saved_game->write(splashRadius); + saved_game->write(methodOfDeath); + saved_game->write(splashMethodOfDeath); + saved_game->write(locationDamage); + saved_game->write(chain); + saved_game->write(enemy); + saved_game->write(activator); + saved_game->write(teamchain); + saved_game->write(teammaster); + saved_game->write(lastEnemy); + saved_game->write(wait); + saved_game->write(random); + saved_game->write(delay); + saved_game->write(alt_fire); + saved_game->write(count); + saved_game->write(bounceCount); + saved_game->write(fly_sound_debounce_time); + saved_game->write(painDebounceTime); + saved_game->write(disconnectDebounceTime); + saved_game->write(attackDebounceTime); + saved_game->write(pushDebounceTime); + saved_game->write(aimDebounceTime); + saved_game->write(useDebounceTime); + saved_game->write(trigger_formation); + saved_game->write(waypoint); + saved_game->write(lastWaypoint); + saved_game->write(lastValidWaypoint); + saved_game->write(noWaypointTime); + saved_game->write(combatPoint); + saved_game->write(failedWaypoints); + saved_game->write(failedWaypointCheckTime); + saved_game->write(loopAnim); + saved_game->write(startFrame); + saved_game->write(endFrame); + saved_game->write(sequencer); + saved_game->write(taskManager); + saved_game->write(taskID); + saved_game->write(parms); + saved_game->write(behaviorSet); + saved_game->write(script_targetname); + saved_game->write(delayScriptTime); + saved_game->write(fullName); + saved_game->write(soundSet); + saved_game->write(setTime); + saved_game->write(cameraGroup); + saved_game->write(noDamageTeam); + saved_game->write(playerModel); + saved_game->write(weaponModel); + saved_game->write(handRBolt); + saved_game->write(handLBolt); + saved_game->write(headBolt); + saved_game->write(cervicalBolt); + saved_game->write(chestBolt); + saved_game->write(gutBolt); + saved_game->write(torsoBolt); + saved_game->write(crotchBolt); + saved_game->write(motionBolt); + saved_game->write(kneeLBolt); + saved_game->write(kneeRBolt); + saved_game->write(elbowLBolt); + saved_game->write(elbowRBolt); + saved_game->write(footLBolt); + saved_game->write(footRBolt); + saved_game->write(faceBone); + saved_game->write(craniumBone); + saved_game->write(cervicalBone); + saved_game->write(thoracicBone); + saved_game->write(upperLumbarBone); + saved_game->write(lowerLumbarBone); + saved_game->write(hipsBone); + saved_game->write(motionBone); + saved_game->write(rootBone); + saved_game->write(footLBone); + saved_game->write(footRBone); + saved_game->write(genericBone1); + saved_game->write(genericBone2); + saved_game->write(genericBone3); + saved_game->write(genericBolt1); + saved_game->write(genericBolt2); + saved_game->write(genericBolt3); + saved_game->write(genericBolt4); + saved_game->write(genericBolt5); + saved_game->write(cinematicModel); + saved_game->write(NPC); + saved_game->write(ownername); + saved_game->write(cantHitEnemyCounter); + saved_game->write(NPC_type); + saved_game->write(NPC_targetname); + saved_game->write(NPC_target); + saved_game->write(moverState); + saved_game->write(soundPos1); + saved_game->write(sound1to2); + saved_game->write(sound2to1); + saved_game->write(soundPos2); + saved_game->write(soundLoop); + saved_game->write(nextTrain); + saved_game->write(prevTrain); + saved_game->write(pos1); + saved_game->write(pos2); + saved_game->write(pos3); + saved_game->write(sounds); + saved_game->write(closetarget); + saved_game->write(opentarget); + saved_game->write(paintarget); + saved_game->write(lockCount); + saved_game->write(radius); + saved_game->write(wpIndex); + saved_game->write(noise_index); + saved_game->write(startRGBA); + saved_game->write(finalRGBA); + saved_game->write(item); + saved_game->write(message); + saved_game->write(lightLevel); + saved_game->write(forcePushTime); + saved_game->write(forcePuller); + } void sg_import( - ojk::ISavedGame* saved_game); + ojk::ISavedGame* saved_game) + { + saved_game->read<>(s); + saved_game->read(client); + saved_game->read(inuse); + saved_game->read(linked); + saved_game->read(svFlags); + saved_game->read(bmodel); + saved_game->read(mins); + saved_game->read(maxs); + saved_game->read(contents); + saved_game->read(absmin); + saved_game->read(absmax); + saved_game->read(currentOrigin); + saved_game->read(currentAngles); + saved_game->read(owner); + saved_game->read<>(ghoul2); + saved_game->read(classname); + saved_game->read(spawnflags); + saved_game->read(flags); + saved_game->read(model); + saved_game->read(model2); + saved_game->read(freetime); + saved_game->read(eventTime); + saved_game->read(freeAfterEvent); + saved_game->read(unlinkAfterEvent); + saved_game->read(physicsBounce); + saved_game->read(clipmask); + saved_game->read(speed); + saved_game->read(movedir); + saved_game->read(lastOrigin); + saved_game->read(lastAngles); + saved_game->read(mass); + saved_game->read(lastImpact); + saved_game->read(watertype); + saved_game->read(waterlevel); + saved_game->read(angle); + saved_game->read(target); + saved_game->read(target2); + saved_game->read(target3); + saved_game->read(target4); + saved_game->read(targetname); + saved_game->read(team); + saved_game->read(roff); + saved_game->read(roff_ctr); + saved_game->read(next_roff_time); + saved_game->read(fx_time); + saved_game->read(nextthink); + saved_game->read(e_ThinkFunc); + saved_game->read(e_clThinkFunc); + saved_game->read(e_ReachedFunc); + saved_game->read(e_BlockedFunc); + saved_game->read(e_TouchFunc); + saved_game->read(e_UseFunc); + saved_game->read(e_PainFunc); + saved_game->read(e_DieFunc); + saved_game->read(health); + saved_game->read(max_health); + saved_game->read(takedamage); + saved_game->read(material); + saved_game->read(damage); + saved_game->read(dflags); + saved_game->read(splashDamage); + saved_game->read(splashRadius); + saved_game->read(methodOfDeath); + saved_game->read(splashMethodOfDeath); + saved_game->read(locationDamage); + saved_game->read(chain); + saved_game->read(enemy); + saved_game->read(activator); + saved_game->read(teamchain); + saved_game->read(teammaster); + saved_game->read(lastEnemy); + saved_game->read(wait); + saved_game->read(random); + saved_game->read(delay); + saved_game->read(alt_fire); + saved_game->read(count); + saved_game->read(bounceCount); + saved_game->read(fly_sound_debounce_time); + saved_game->read(painDebounceTime); + saved_game->read(disconnectDebounceTime); + saved_game->read(attackDebounceTime); + saved_game->read(pushDebounceTime); + saved_game->read(aimDebounceTime); + saved_game->read(useDebounceTime); + saved_game->read(trigger_formation); + saved_game->read(waypoint); + saved_game->read(lastWaypoint); + saved_game->read(lastValidWaypoint); + saved_game->read(noWaypointTime); + saved_game->read(combatPoint); + saved_game->read(failedWaypoints); + saved_game->read(failedWaypointCheckTime); + saved_game->read(loopAnim); + saved_game->read(startFrame); + saved_game->read(endFrame); + saved_game->read(sequencer); + saved_game->read(taskManager); + saved_game->read(taskID); + saved_game->read(parms); + saved_game->read(behaviorSet); + saved_game->read(script_targetname); + saved_game->read(delayScriptTime); + saved_game->read(fullName); + saved_game->read(soundSet); + saved_game->read(setTime); + saved_game->read(cameraGroup); + saved_game->read(noDamageTeam); + saved_game->read(playerModel); + saved_game->read(weaponModel); + saved_game->read(handRBolt); + saved_game->read(handLBolt); + saved_game->read(headBolt); + saved_game->read(cervicalBolt); + saved_game->read(chestBolt); + saved_game->read(gutBolt); + saved_game->read(torsoBolt); + saved_game->read(crotchBolt); + saved_game->read(motionBolt); + saved_game->read(kneeLBolt); + saved_game->read(kneeRBolt); + saved_game->read(elbowLBolt); + saved_game->read(elbowRBolt); + saved_game->read(footLBolt); + saved_game->read(footRBolt); + saved_game->read(faceBone); + saved_game->read(craniumBone); + saved_game->read(cervicalBone); + saved_game->read(thoracicBone); + saved_game->read(upperLumbarBone); + saved_game->read(lowerLumbarBone); + saved_game->read(hipsBone); + saved_game->read(motionBone); + saved_game->read(rootBone); + saved_game->read(footLBone); + saved_game->read(footRBone); + saved_game->read(genericBone1); + saved_game->read(genericBone2); + saved_game->read(genericBone3); + saved_game->read(genericBolt1); + saved_game->read(genericBolt2); + saved_game->read(genericBolt3); + saved_game->read(genericBolt4); + saved_game->read(genericBolt5); + saved_game->read(cinematicModel); + saved_game->read(NPC); + saved_game->read(ownername); + saved_game->read(cantHitEnemyCounter); + saved_game->read(NPC_type); + saved_game->read(NPC_targetname); + saved_game->read(NPC_target); + saved_game->read(moverState); + saved_game->read(soundPos1); + saved_game->read(sound1to2); + saved_game->read(sound2to1); + saved_game->read(soundPos2); + saved_game->read(soundLoop); + saved_game->read(nextTrain); + saved_game->read(prevTrain); + saved_game->read(pos1); + saved_game->read(pos2); + saved_game->read(pos3); + saved_game->read(sounds); + saved_game->read(closetarget); + saved_game->read(opentarget); + saved_game->read(paintarget); + saved_game->read(lockCount); + saved_game->read(radius); + saved_game->read(wpIndex); + saved_game->read(noise_index); + saved_game->read(startRGBA); + saved_game->read(finalRGBA); + saved_game->read(item); + saved_game->read(message); + saved_game->read(lightLevel); + saved_game->read(forcePushTime); + saved_game->read(forcePuller); + } }; #endif //#ifdef GAME_INCLUDE From ef5c8b4655ed4fb7d981a023c080468b70c7aeb3 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 17 Jul 2016 20:51:00 +0300 Subject: [PATCH 259/445] Make distinct name for clientPersistant_t to avoid strange behavior in Visual Studio --- code/game/g_client.cpp | 2 +- code/game/g_shared.h | 9 ++++++--- codeJK2/game/g_client.cpp | 2 +- codeJK2/game/g_shared.h | 9 ++++++--- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index 4fb143297b..c6d4799038 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -2118,7 +2118,7 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded vec3_t spawn_origin, spawn_angles; gclient_t *client; int i; - clientPersistant_t saved; + ja_clientPersistant_t saved; clientSession_t savedSess; clientInfo_t savedCi; int persistant[MAX_PERSISTANT]; diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 94cfc3f11f..221234a389 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -599,7 +599,10 @@ typedef struct { // client data that stays across multiple respawns, but is cleared // on each level change or team change at ClientBegin() // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct { +// FIXME Prefix added to avoid debugging problems in Visual Studio. +class ja_clientPersistant_t +{ +public: clientConnected_t connected; usercmd_t lastCommand; char netname[34]; @@ -633,7 +636,7 @@ typedef struct { saved_game->read(cmd_angles); saved_game->read<>(teamState); } -} clientPersistant_t; +}; // ja_clientPersistant_t typedef enum { BLK_NO, @@ -675,7 +678,7 @@ struct gclient_s { playerState_t ps; // communicated by server to clients // private to game - clientPersistant_t pers; + ja_clientPersistant_t pers; clientSession_t sess; int lastCmdTime; // level.time of last usercmd_t, for EF_CONNECTION diff --git a/codeJK2/game/g_client.cpp b/codeJK2/game/g_client.cpp index 6f34d83f93..6b3570f43f 100644 --- a/codeJK2/game/g_client.cpp +++ b/codeJK2/game/g_client.cpp @@ -1520,7 +1520,7 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded vec3_t spawn_origin, spawn_angles; gclient_t *client; int i; - clientPersistant_t saved; + jo_clientPersistant_t saved; clientSession_t savedSess; clientInfo_t savedCi; int persistant[MAX_PERSISTANT]; diff --git a/codeJK2/game/g_shared.h b/codeJK2/game/g_shared.h index 90726949a9..6d90522e35 100644 --- a/codeJK2/game/g_shared.h +++ b/codeJK2/game/g_shared.h @@ -633,7 +633,10 @@ typedef struct { // client data that stays across multiple respawns, but is cleared // on each level change or team change at ClientBegin() // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct { +// FIXME Prefix added to avoid debugging problems in Visual Studio. +class jo_clientPersistant_t +{ +public: clientConnected_t connected; usercmd_t lastCommand; qboolean localClient; // true if "ip" info key is "localhost" @@ -670,7 +673,7 @@ typedef struct { saved_game->read(cmd_angles); saved_game->read<>(teamState); } -} clientPersistant_t; +}; // jo_clientPersistant_t typedef enum { BLK_NO, @@ -702,7 +705,7 @@ struct gclient_s { playerState_t ps; // communicated by server to clients // private to game - clientPersistant_t pers; + jo_clientPersistant_t pers; clientSession_t sess; qboolean noclip; From 178d0d5b5eaf31574e277e8fedd8a117cfdc44e8 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 17 Jul 2016 22:18:38 +0300 Subject: [PATCH 260/445] Fix reading/writing gclient_s class and realted classes --- codeJK2/game/g_shared.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/codeJK2/game/g_shared.h b/codeJK2/game/g_shared.h index 6d90522e35..a9b0c9995c 100644 --- a/codeJK2/game/g_shared.h +++ b/codeJK2/game/g_shared.h @@ -655,9 +655,11 @@ class jo_clientPersistant_t saved_game->write<>(lastCommand); saved_game->write(localClient); saved_game->write(netname); + saved_game->skip(2); saved_game->write(maxHealth); saved_game->write(enterTime); saved_game->write(cmd_angles); + saved_game->skip(2); saved_game->write<>(teamState); } @@ -668,9 +670,11 @@ class jo_clientPersistant_t saved_game->read<>(lastCommand); saved_game->read(localClient); saved_game->read(netname); + saved_game->skip(2); saved_game->read(maxHealth); saved_game->read(enterTime); saved_game->read(cmd_angles); + saved_game->skip(2); saved_game->read<>(teamState); } }; // jo_clientPersistant_t @@ -819,6 +823,7 @@ struct gclient_s { saved_game->write<>(clientInfo); saved_game->write(forced_forwardmove); saved_game->write(forced_rightmove); + saved_game->skip(2); saved_game->write(fireDelay); saved_game->write(playerTeam); saved_game->write(enemyTeam); @@ -840,6 +845,7 @@ struct gclient_s { saved_game->write(dismemberProbArms); saved_game->write(dismemberProbHands); saved_game->write(dismemberProbWaist); + saved_game->skip(3); saved_game->write(standheight); saved_game->write(crouchheight); saved_game->write(poisonDamage); @@ -879,6 +885,7 @@ struct gclient_s { saved_game->read<>(clientInfo); saved_game->read(forced_forwardmove); saved_game->read(forced_rightmove); + saved_game->skip(2); saved_game->read(fireDelay); saved_game->read(playerTeam); saved_game->read(enemyTeam); @@ -900,6 +907,7 @@ struct gclient_s { saved_game->read(dismemberProbArms); saved_game->read(dismemberProbHands); saved_game->read(dismemberProbWaist); + saved_game->skip(3); saved_game->read(standheight); saved_game->read(crouchheight); saved_game->read(poisonDamage); From be45441ba5d9636ff1cd5323f45ba8bd96283276 Mon Sep 17 00:00:00 2001 From: dusty22 Date: Mon, 18 Jul 2016 12:25:41 -0400 Subject: [PATCH 261/445] Some preliminary changes - Layed foundations for multi-weapon support for NPCs - Fixed bugs with projectiles from weapons not disappearing - Boba_Fett AI types now default to blaster rifle behavior when trying to switch to an AI state using a weapon they dont have - Should have fixed some bugs with CLASS_COMMANDO and CLASS_MANDA - started process of making CLASS_MANDA into Boba_Fett with just flamethrower --- CHANGELOG.txt | 14 +- code/game/AI_BobaFett.cpp | 32 +- code/game/NPC_behavior.cpp | 2 +- code/game/NPC_stats.cpp | 11 + code/game/NPC_utils.cpp | 2 +- code/game/b_public.h | 62 ++ code/game/g_combat.cpp | 19 +- code/game/g_main.cpp | 38 ++ code/game/g_missile.cpp | 1138 ++++++++++++++++++------------------ code/game/weapons.h | 63 ++ 10 files changed, 788 insertions(+), 593 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 40c8892665..d9dc6b2262 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -95,19 +95,21 @@ Future ideas ---------------------------------------------------------------------------------------------------------------------------- Things to do - - *savegame screenshots -- *separate cvar for player HP and Shields -- reborn masters with debounce to limit constant saber throwing + lightning -- *NPCs avoid cliffs - *extra fields in Weapons.dat such as NPCDamageMult, NPCAltDamageMult, saber ignition/deignition time -- force push strong version, mindtrick changes -- doing a full slash when starting saber off regardless of movement - *camera controls (1st, 2nd, 3rd, 4th person) - better AI for NPCs deciding to surrender - balance staff and duals blocking - finish new NPC fields -- make sure saber stats save correctly +- make sure saber combat stats save correctly +- saber flags as cvars for player +Sidelined: +- *separate cvar for player HP and Shields +- reborn masters with debounce to limit constant saber throwing + lightning +- *NPCs avoid cliffs +- force push strong version, mindtrick changes +- doing a full slash when starting saber off regardless of movement * would like to implement into OpenJK ** not completely tested but should work diff --git a/code/game/AI_BobaFett.cpp b/code/game/AI_BobaFett.cpp index 02287e0f9f..9c89b69c2d 100644 --- a/code/game/AI_BobaFett.cpp +++ b/code/game/AI_BobaFett.cpp @@ -369,7 +369,8 @@ qboolean Boba_StopKnockdown( gentity_t *self, gentity_t *pusher, const vec3_t pu //////////////////////////////////////////////////////////////////////////////////////// qboolean Boba_Flying( gentity_t *self ) { - assert(self && self->client && (self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA));//self->NPC && + assert(self && self->client && (self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA + || self->client->NPC_class == CLASS_COMMANDO));//self->NPC && return ((qboolean)(self->client->moveType==MT_FLYSWIM)); } @@ -557,6 +558,11 @@ void Boba_StartFlameThrower( gentity_t *self ) //////////////////////////////////////////////////////////////////////////////////////// void Boba_DoFlameThrower( gentity_t *self ) { + if (self->client->NPC_class == CLASS_COMMANDO) + { + return; + } + if ( self->s.number < MAX_CLIENTS ) { if ( self->client ) @@ -864,6 +870,26 @@ void Boba_TacticsSelect() } } + switch (nextState) { + case BTS_FLAMETHROW: + if ((!NPC->client->NPC_class == CLASS_BOBAFETT && !NPC->client->NPC_class == CLASS_MANDA)) + { + nextState = BTS_RIFLE; + break; + } + case BTS_MISSILE: + if (!HaveWeapon(WP_ROCKET_LAUNCHER)) + { + nextState = BTS_RIFLE; + break; + } + case BTS_SNIPER: + if (!HaveWeapon(WP_DISRUPTOR)) + { + nextState = BTS_RIFLE; + break; + } + } // The Next State Has Been Selected, Now Change Weapon If Necessary @@ -1111,7 +1137,9 @@ void Boba_Update() //--------------------------------------------- if ( NPC->client->ps.groundEntityNum == ENTITYNUM_NONE && NPC->client->ps.forceJumpZStart - && !Q_irand( 0, 10 ) ) + && !Q_irand( 0, 10 ) + && NPC->client->NPC_class != CLASS_COMMANDO + && NPC->client->NPC_class != CLASS_MANDA) {//take off Boba_FlyStart( NPC ); } diff --git a/code/game/NPC_behavior.cpp b/code/game/NPC_behavior.cpp index f75b96bdd5..a8ae9410a8 100644 --- a/code/game/NPC_behavior.cpp +++ b/code/game/NPC_behavior.cpp @@ -1594,7 +1594,7 @@ qboolean NPC_CheckSurrender(qboolean noEscape = qfalse) if (!Q3_TaskIDPending(NPC, TID_MOVE_NAV) //not scripted to go somewhere && NPC->client->ps.groundEntityNum != ENTITYNUM_NONE //not in the air && !NPC->client->ps.weaponTime && !PM_InKnockDown(&NPC->client->ps)//not firing and not on the ground - && NPC->enemy && NPC->enemy->client && NPC->enemy->enemy == NPC && NPC->enemy->s.weapon != WP_NONE && (NPC->enemy->s.weapon != WP_MELEE || (NPC->enemy->client->NPC_class == CLASS_RANCOR || NPC->enemy->client->NPC_class == CLASS_WAMPA))//enemy is using a weapon or is a Rancor or Wampa + && NPC->enemy && NPC->enemy->client /*&& NPC->enemy->enemy == NPC*/ && NPC->enemy->s.weapon != WP_NONE && (NPC->enemy->s.weapon != WP_MELEE || (NPC->enemy->client->NPC_class == CLASS_RANCOR || NPC->enemy->client->NPC_class == CLASS_WAMPA))//enemy is using a weapon or is a Rancor or Wampa && NPC->enemy->health > 20 && NPC->enemy->painDebounceTime < level.time - 3000 && NPC->enemy->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] < level.time - 1000) {//don't surrender if scripted to run somewhere or if we're in the air or if we're busy or if we don't have an enemy or if the enemy is not mad at me or is hurt or not a threat or busy being attacked //FIXME: even if not in a group, don't surrender if there are other enemies in the PVS and within a certain range? diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index d7c90a985c..06ff3f32db 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -1976,6 +1976,11 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) NPC->NPC->allWeaponOrder[6] = WP_NONE; NPC->NPC->allWeaponOrder[7] = WP_NONE; */ + NPC->NPC->weapList = new wpnList(); + NPC->NPC->lightBlasterWeaps = new wpnList(); + NPC->NPC->heavyBlasterWeaps = new wpnList(); + NPC->NPC->heavyWeaps = new wpnList(); + // fill in defaults stats->sex = SEX_MALE; stats->aggression = 3; @@ -3540,6 +3545,12 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) RegisterItem( FindItemForWeapon( (weapon_t)(weap) ) ); //precache the weapon NPC->client->ps.ammo[weaponData[weap].ammoIndex] = ammoData[weaponData[weap].ammoIndex].max; } + + if (lightBlasterWeap(weap)) NPC->NPC->lightBlasterWeaps->add(weap); + if (heavyBlasterWeap(weap)) NPC->NPC->heavyBlasterWeaps->add(weap); + if (heavyWeap(weap)) NPC->NPC->heavyWeaps->add(weap); + + NPC->NPC->weapList->add(weap); } continue; } diff --git a/code/game/NPC_utils.cpp b/code/game/NPC_utils.cpp index 58e9401e02..cb2533f704 100644 --- a/code/game/NPC_utils.cpp +++ b/code/game/NPC_utils.cpp @@ -1651,7 +1651,7 @@ void JET_FlyStart( gentity_t *self ) return; } self->lastInAirTime = level.time; - if (self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA) + if (self->client->NPC_class == CLASS_BOBAFETT) { Boba_FlyStart( self ); } diff --git a/code/game/b_public.h b/code/game/b_public.h index bf0158941f..7c36e8564c 100644 --- a/code/game/b_public.h +++ b/code/game/b_public.h @@ -168,6 +168,62 @@ typedef struct gNPCstats_e } gNPCstats_t; +struct wpnNode { + wpnNode* nextWeap; + int thisWeap; + + wpnNode(int wp) { + this->thisWeap = wp; + this->nextWeap = NULL; + } +}; + +struct wpnList { //NPCs use these to make a list of weaps they have, so they can choose from if need to switch weaps + wpnNode* head; + int size; + + wpnList() { + this->head = NULL; + this->size = 0; + } + + void add(int wp) { + if (size == 0) { + this->head = new wpnNode(wp); + this->size = 1; + } + else { + wpnNode nodeToInsertAfter = *head; + for (int i = 1; i < size; i++) { + nodeToInsertAfter = *(nodeToInsertAfter.nextWeap); + } + + nodeToInsertAfter.nextWeap = new wpnNode(wp); + size++; + } + } + + wpnNode* findAndReturn(int index) { + if (size == 0) return NULL; + else { + wpnNode* nodeToReturn = head; + for (int i = 1; i < size; i++) { + nodeToReturn = nodeToReturn->nextWeap; + } + + return nodeToReturn; + } + } + + int pickRand() { + if (size == 0) return -1; + else { + int choice = Q_irand(1, size); + return findAndReturn(choice)->thisWeap; + } + } +}; + #define MAX_ENEMY_POS_LAG 2400 #define ENEMY_POS_LAG_INTERVAL 100 #define ENEMY_POS_LAG_STEPS (MAX_ENEMY_POS_LAG/ENEMY_POS_LAG_INTERVAL) @@ -342,6 +398,12 @@ typedef struct int ffireCount; //sigh... you'd think I'd be able to find a way to do this without having to use 3 int fields, but... int ffireDebounce; int ffireFadeDebounce; + + //Dusty additions + wpnList* weapList; + wpnList* lightBlasterWeaps; + wpnList* heavyBlasterWeaps; + wpnList* heavyWeaps; } gNPC_t; void G_SquadPathsInit(void); diff --git a/code/game/g_combat.cpp b/code/game/g_combat.cpp index 08389d98cb..eda0df64bd 100644 --- a/code/game/g_combat.cpp +++ b/code/game/g_combat.cpp @@ -100,6 +100,9 @@ static qboolean G_Dismemberable( gentity_t *self, int hitLoc ); extern gitem_t *FindItemForAmmo( ammo_t ammo ); extern void WP_RemoveSaber( gentity_t *ent, int saberNum ); +qboolean blasterDamage(int mod); +qboolean heavyDamage(int mod); + qboolean G_GetRootSurfNameWithVariant( gentity_t *ent, const char *rootSurfName, char *returnSurfName, int returnSize ); /* @@ -7054,11 +7057,11 @@ qboolean blasterDamage(int mod) { case MOD_BOWCASTER: case MOD_BOWCASTER_ALT: case MOD_REPEATER: - //case MOD_DEMP2, - //case MOD_DEMP2_ALT, - //NEW for JKA weapons: + //case MOD_DEMP2, + //case MOD_DEMP2_ALT, + //NEW for JKA weapons: case MOD_CONC: - case MOD_CONC_ALT: + case MOD_CONC_ALT: case MOD_SEEKER: case MOD_EMPLACED: return qtrue; @@ -7068,20 +7071,20 @@ qboolean blasterDamage(int mod) { } qboolean heavyDamage(int mod) { - switch (mod) { + switch (mod) { case MOD_REPEATER_ALT: case MOD_FLECHETTE: case MOD_FLECHETTE_ALT: case MOD_ROCKET: - case MOD_ROCKET_ALT: + case MOD_ROCKET_ALT: case MOD_THERMAL: case MOD_THERMAL_ALT: case MOD_DETPACK: case MOD_LASERTRIP: case MOD_LASERTRIP_ALT: case MOD_MELEE: - return qtrue; + return qtrue; default: return qfalse; } -} +} \ No newline at end of file diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index ad06ee90d0..5f899a276a 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -226,6 +226,44 @@ cvar_t *g_char_forceAffinity; //make into ui_cvars? cvar_t *g_char_forceFocus; cvar_t *g_char_forceSensitivity; +/* +cvar_t *g_char_moveSpeedScale; 1.0 - you move faster / slower when using this saber +cvar_t *g_char_animSpeedScale; 1.0 - plays normal attack animations faster / slower + +//replace certain anims +cvar_t *g_char_readyAnim; none - anim to use when standing idle(use name of enum in anims.h or BehavEd's list) +cvar_t *g_char_drawAnim; none - anim to use when drawing weapon(use name of enum in anims.h or BehavEd's list) +cvar_t *g_char_putawayAnim; none - anim to use when putting weapon away(use name of enum in anims.h or BehavEd's list) +cvar_t *g_char_tauntAnim; none - anim to use when hit "taunt" (use name of enum in anims.h or BehavEd's list) +cvar_t *g_char_bowAnim; none - anim to use when hit "bow" (use name of enum in anims.h or BehavEd's list) +cvar_t *g_char_meditateAnim; none - anim to use when hit "meditate" (use name of enum in anims.h or BehavEd's list) +cvar_t *g_char_flourishAnim: none - anim to use when hit "flourish" (use name of enum in anims.h or BehavEd's list) +cvar_t *g_char_gloatAnim; none - anim to use when hit "gloat" (use name of enum in anims.h or BehavEd's list) + +//optionally disallow certain types of moves and attacks +noRollStab 0 - if set, cannot do roll - stab move at end of roll +noPullAttack 0 - if set, cannot do pull + attack move(move not available in MP anyway) +noBackAttack 0 - if set, cannot do back - stab moves +noStabDown 0 - if set, cannot do stabdown move(when enemy is on ground) +noWallRuns 0 - if set, cannot side - run or forward - run on walls +noWallFlips 0 - if set, cannot do backflip off wall or side - flips off walls +noWallGrab 0 - if set, cannot grab wall & jump off +noRolls 0 - if set, cannot roll +noFlips 0 - if set, cannot do flips +noCartwheels 0 - if set, cannot do cartwheels +noKicks 0 - if set, cannot do kicks(can't do kicks anyway if using a throwable saber/sword) +noMirrorAttacks 0 - if set, cannot do the simultaneous attack left / right moves(only available in Dual Lightsaber Combat Style) + +//done in both cgame and game (BG code) +kataMove 0 - if set, player will execute this move when they press both attack buttons at the same time(see list below for valid values) +lungeAtkMove 0 - if set, player will execute this move when they crouch + fwd + attack(see list below for valid values) +jumpAtkUpMove 0 - if set, player will execute this move when they jump + attack(see list below for valid values) +jumpAtkFwdMove 0 - if set, player will execute this move when they jump + fwd + attack(see list below for valid values) +jumpAtkBackMove 0 - if set, player will execute this move when they jump + back + attack(see list below for valid values) +jumpAtkRightMove 0 - if set, player will execute this move when they jump + rightattack(see list below for valid values) +jumpAtkLeftMove 0 - if set, player will execute this move when they jump + left + attack(see list below for valid values) +//NOTE: these "move" fields refer to saber moves that are defined in code. Set to LS_NONE to have the normal move removed, set to one of the following values to override the current move +*/ // kef -- used with DebugTraceForNPC cvar_t *g_npcdebug; diff --git a/code/game/g_missile.cpp b/code/game/g_missile.cpp index a5a14582de..0d590f6273 100644 --- a/code/game/g_missile.cpp +++ b/code/game/g_missile.cpp @@ -24,93 +24,93 @@ along with this program; if not, see . #include "g_local.h" #include "g_functions.h" #include "wp_saber.h" -#include "bg_local.h" +#include "bg_local.h" #include "../cgame/cg_local.h" #include "b_local.h" #ifdef _DEBUG - #include +#include #endif //_DEBUG -extern qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f ); -qboolean LogAccuracyHit( gentity_t *target, gentity_t *attacker ); -extern qboolean PM_SaberInParry( int move ); -extern qboolean PM_SaberInReflect( int move ); -extern qboolean PM_SaberInIdle( int move ); -extern qboolean PM_SaberInAttack( int move ); -extern qboolean PM_SaberInTransitionAny( int move ); -extern qboolean PM_SaberInSpecialAttack( int anim ); -extern qboolean PM_WalkingOrIdle(gentity_t *self); +extern qboolean InFront(vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f); +qboolean LogAccuracyHit(gentity_t *target, gentity_t *attacker); +extern qboolean PM_SaberInParry(int move); +extern qboolean PM_SaberInReflect(int move); +extern qboolean PM_SaberInIdle(int move); +extern qboolean PM_SaberInAttack(int move); +extern qboolean PM_SaberInTransitionAny(int move); +extern qboolean PM_SaberInSpecialAttack(int anim); +extern qboolean PM_WalkingOrIdle(gentity_t *self); //------------------------------------------------------------------------- -void G_MissileBounceEffect( gentity_t *ent, vec3_t org, vec3_t dir, qboolean hitWorld ) +void G_MissileBounceEffect(gentity_t *ent, vec3_t org, vec3_t dir, qboolean hitWorld) { //FIXME: have an EV_BOUNCE_MISSILE event that checks the s.weapon and does the appropriate effect - switch( ent->s.weapon ) + switch (ent->s.weapon) { case WP_BOWCASTER: - if ( hitWorld ) + if (hitWorld) { - G_PlayEffect( "bowcaster/bounce_wall", org, dir ); + G_PlayEffect("bowcaster/bounce_wall", org, dir); } else { - G_PlayEffect( "bowcaster/deflect", ent->currentOrigin, dir ); + G_PlayEffect("bowcaster/deflect", ent->currentOrigin, dir); } break; case WP_BLASTER: case WP_BRYAR_PISTOL: case WP_BLASTER_PISTOL: - G_PlayEffect( "blaster/deflect", ent->currentOrigin, dir ); + G_PlayEffect("blaster/deflect", ent->currentOrigin, dir); break; default: - { - gentity_t *tent = G_TempEntity( org, EV_GRENADE_BOUNCE ); - VectorCopy( dir, tent->pos1 ); - tent->s.weapon = ent->s.weapon; - } + { + gentity_t *tent = G_TempEntity(org, EV_GRENADE_BOUNCE); + VectorCopy(dir, tent->pos1); + tent->s.weapon = ent->s.weapon; + } break; } } -void G_MissileReflectEffect( gentity_t *ent, vec3_t org, vec3_t dir ) +void G_MissileReflectEffect(gentity_t *ent, vec3_t org, vec3_t dir) { //FIXME: have an EV_BOUNCE_MISSILE event that checks the s.weapon and does the appropriate effect - switch( ent->s.weapon ) + switch (ent->s.weapon) { case WP_BOWCASTER: - G_PlayEffect( "bowcaster/deflect", ent->currentOrigin, dir ); + G_PlayEffect("bowcaster/deflect", ent->currentOrigin, dir); break; case WP_BLASTER: case WP_BRYAR_PISTOL: case WP_BLASTER_PISTOL: default: - G_PlayEffect( "blaster/deflect", ent->currentOrigin, dir ); + G_PlayEffect("blaster/deflect", ent->currentOrigin, dir); break; } } //------------------------------------------------------------------------- -static void G_MissileStick( gentity_t *missile, gentity_t *other, trace_t *tr ) +static void G_MissileStick(gentity_t *missile, gentity_t *other, trace_t *tr) { - if ( other->NPC || !Q_stricmp( other->classname, "misc_model_breakable" )) + if (other->NPC || !Q_stricmp(other->classname, "misc_model_breakable")) { // we bounce off of NPC's and misc model breakables because sticking to them requires too much effort vec3_t velocity; - int hitTime = level.previousTime + ( level.time - level.previousTime ) * tr->fraction; + int hitTime = level.previousTime + (level.time - level.previousTime) * tr->fraction; - EvaluateTrajectoryDelta( &missile->s.pos, hitTime, velocity ); + EvaluateTrajectoryDelta(&missile->s.pos, hitTime, velocity); - float dot = DotProduct( velocity, tr->plane.normal ); - G_SetOrigin( missile, tr->endpos ); - VectorMA( velocity, -1.6f * dot, tr->plane.normal, missile->s.pos.trDelta ); - VectorMA( missile->s.pos.trDelta, 10, tr->plane.normal, missile->s.pos.trDelta ); + float dot = DotProduct(velocity, tr->plane.normal); + G_SetOrigin(missile, tr->endpos); + VectorMA(velocity, -1.6f * dot, tr->plane.normal, missile->s.pos.trDelta); + VectorMA(missile->s.pos.trDelta, 10, tr->plane.normal, missile->s.pos.trDelta); missile->s.pos.trTime = level.time - 10; // move a bit on the first frame // check for stop - if ( tr->entityNum >= 0 && tr->entityNum < ENTITYNUM_WORLD && - tr->plane.normal[2] > 0.7 && missile->s.pos.trDelta[2] < 40 ) //this can happen even on very slightly sloped walls, so changed it from > 0 to > 0.7 + if (tr->entityNum >= 0 && tr->entityNum < ENTITYNUM_WORLD && + tr->plane.normal[2] > 0.7 && missile->s.pos.trDelta[2] < 40) //this can happen even on very slightly sloped walls, so changed it from > 0 to > 0.7 { missile->nextthink = level.time + 100; } @@ -123,14 +123,14 @@ static void G_MissileStick( gentity_t *missile, gentity_t *other, trace_t *tr ) return; // don't stick yet } - if ( missile->e_TouchFunc != touchF_NULL ) + if (missile->e_TouchFunc != touchF_NULL) { - GEntity_TouchFunc( missile, other, tr ); + GEntity_TouchFunc(missile, other, tr); } - G_AddEvent( missile, EV_MISSILE_STICK, 0 ); + G_AddEvent(missile, EV_MISSILE_STICK, 0); - if ( other->s.eType == ET_MOVER || other->e_DieFunc == dieF_funcBBrushDie || other->e_DieFunc == dieF_funcGlassDie) + if (other->s.eType == ET_MOVER || other->e_DieFunc == dieF_funcBBrushDie || other->e_DieFunc == dieF_funcGlassDie) { // movers and breakable brushes need extra info...so sticky missiles can ride lifts and blow up when the thing they are attached to goes away. missile->s.groundEntityNum = tr->entityNum; @@ -141,11 +141,11 @@ static void G_MissileStick( gentity_t *missile, gentity_t *other, trace_t *tr ) ================ G_ReflectMissile - Reflect the missile roughly back at it's owner +Reflect the missile roughly back at it's owner ================ */ -vec3_t g_crosshairWorldCoord = {0, 0, 0}; -extern gentity_t *Jedi_FindEnemyInCone( gentity_t *self, gentity_t *fallback, float minDot ); +vec3_t g_crosshairWorldCoord = { 0, 0, 0 }; +extern gentity_t *Jedi_FindEnemyInCone(gentity_t *self, gentity_t *fallback, float minDot); extern cvar_t *g_saberAutoBlocking; void G_ReflectMissile(gentity_t *ent, gentity_t *missile, vec3_t forward, forcePowers_t powerToUse) { @@ -165,7 +165,7 @@ void G_ReflectMissile(gentity_t *ent, gentity_t *missile, vec3_t forward, forceP speed = VectorNormalize(missile->s.pos.trDelta); if (ent && owner && owner->client && - (owner->client->ps.forcePowerLevel[powerToUse] > FORCE_LEVEL_2 || (owner->client->ps.forcePowerLevel[powerToUse] > FORCE_LEVEL_1&&!Q_irand(0, 3)))) + (owner->client->ps.forcePowerLevel[powerToUse] > FORCE_LEVEL_2 || (owner->client->ps.forcePowerLevel[powerToUse]>FORCE_LEVEL_1&&!Q_irand(0, 3)))) //if high enough force skill (100% at level 3, 25% at level 2, 0% at level 1), reflections are perfectly deflected toward an enemy { perfectReflection = qtrue; @@ -176,225 +176,212 @@ void G_ReflectMissile(gentity_t *ent, gentity_t *missile, vec3_t forward, forceP if (owner->client->ps.saberInFlight) {//but need saber in-hand for perfect reflection perfectReflection = qfalse; + } - if (ent && owner && owner->client && !owner->client->ps.saberInFlight && - (owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2 || (owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1&&!Q_irand(0, 3)))) - {//if high enough defense skill and saber in-hand (100% at level 3, 25% at level 2, 0% at level 1), reflections are perfectly deflected toward an enemy - gentity_t *enemy; - if (owner->enemy && Q_irand(0, 3)) - {//toward current enemy 75% of the time - enemy = owner->enemy; - } + if (g_spskill->integer >= 2 && !g_saberAutoBlocking->integer && owner->client->ps.saberBlockingTime < level.time) + {//but need to be blocking for perfect reflection on higher difficulties + perfectReflection = qfalse; + } - if (g_spskill->integer >= 2 - && !g_saberAutoBlocking->integer - && owner->client->ps.saberBlockingTime < level.time) - {//but need to be blocking for perfect reflection on higher difficulties - perfectReflection = qfalse; - } + if (!PM_WalkingOrIdle(ent) || !PM_SaberInParry(ent->client->ps.saberMove)) + {//but need to be blocking for perfect reflection on higher difficulties + perfectReflection = qfalse; + } + } - if (!PM_WalkingOrIdle(ent) - || !PM_SaberInParry) - {//no perfect reflections for non-blockers - perfectReflection = qfalse; - } + if (perfectReflection) + { + if (g_spskill->integer < 2 || owner->s.clientNum >= MAX_CLIENTS) //either by autoaim (lower difficulties) + { + gentity_t *enemy; + if (owner->enemy && Q_irand(0, 3)) + {//toward current enemy 75% of the time + enemy = owner->enemy; } - - if (perfectReflection) + else + {//find another enemy + enemy = Jedi_FindEnemyInCone(owner, owner->enemy, 0.3f); + } + if (enemy) { - if (g_spskill->integer < 2 || owner->s.clientNum >= MAX_CLIENTS) //either by autoaim (lower difficulties) - { - gentity_t *enemy; - if (owner->enemy && Q_irand(0, 3)) - {//toward current enemy 75% of the time - enemy = owner->enemy; - } - else - {//find another enemy - enemy = Jedi_FindEnemyInCone(owner, owner->enemy, 0.3f); - } - if (enemy) - { - vec3_t bullseye; - CalcEntitySpot(enemy, SPOT_HEAD, bullseye); - bullseye[0] += Q_irand(-4, 4); - bullseye[1] += Q_irand(-4, 4); - bullseye[2] += Q_irand(-16, 4); - VectorSubtract(bullseye, missile->currentOrigin, bounce_dir); - VectorNormalize(bounce_dir); - if (!PM_SaberInParry(owner->client->ps.saberMove) - && !PM_SaberInReflect(owner->client->ps.saberMove) - && !PM_SaberInIdle(owner->client->ps.saberMove)) - {//a bit more wild - if (PM_SaberInAttack(owner->client->ps.saberMove) - || PM_SaberInTransitionAny(owner->client->ps.saberMove) - || PM_SaberInSpecialAttack(owner->client->ps.torsoAnim)) - {//moderately more wild - for (i = 0; i < 3; i++) - { - bounce_dir[i] += Q_flrand(-0.2f, 0.2f); - } - } - else - {//mildly more wild - for (i = 0; i < 3; i++) - { - bounce_dir[i] += Q_flrand(-0.1f, 0.1f); - } - } + vec3_t bullseye; + CalcEntitySpot(enemy, SPOT_HEAD, bullseye); + bullseye[0] += Q_irand(-4, 4); + bullseye[1] += Q_irand(-4, 4); + bullseye[2] += Q_irand(-16, 4); + VectorSubtract(bullseye, missile->currentOrigin, bounce_dir); + VectorNormalize(bounce_dir); + if (!PM_SaberInParry(owner->client->ps.saberMove) + && !PM_SaberInReflect(owner->client->ps.saberMove) + && !PM_SaberInIdle(owner->client->ps.saberMove)) + {//a bit more wild + if (PM_SaberInAttack(owner->client->ps.saberMove) + || PM_SaberInTransitionAny(owner->client->ps.saberMove) + || PM_SaberInSpecialAttack(owner->client->ps.torsoAnim)) + {//moderately more wild + for (i = 0; i < 3; i++) + { + bounce_dir[i] += Q_flrand(-0.2f, 0.2f); } - VectorNormalize(bounce_dir); - reflected = qtrue; } - } - else //or by where the crosshair is (higher difficulties) - { - VectorSubtract(g_crosshairWorldCoord, missile->currentOrigin, bounce_dir); - VectorNormalize(bounce_dir); - if (!PM_SaberInParry(owner->client->ps.saberMove) - && !PM_SaberInReflect(owner->client->ps.saberMove) - && !PM_SaberInIdle(owner->client->ps.saberMove)) - {//a bit more wild - if (PM_SaberInAttack(owner->client->ps.saberMove) - || PM_SaberInTransitionAny(owner->client->ps.saberMove) - || PM_SaberInSpecialAttack(owner->client->ps.torsoAnim)) - {//moderately more wild - for (i = 0; i < 3; i++) - { - bounce_dir[i] += Q_flrand(-0.2f, 0.2f); - } - } - else - {//mildly more wild - for (i = 0; i < 3; i++) - { - bounce_dir[i] += Q_flrand(-0.1f, 0.1f); - } + else + {//mildly more wild + for (i = 0; i < 3; i++) + { + bounce_dir[i] += Q_flrand(-0.1f, 0.1f); } } - VectorNormalize(bounce_dir); - reflected = qtrue; } + VectorNormalize(bounce_dir); + reflected = qtrue; } - if (!reflected) - { - if (g_spskill->integer < 2 || owner->s.clientNum >= MAX_CLIENTS) - { - if (missile->owner && missile->s.weapon != WP_SABER) - {//bounce back at them if you can - VectorSubtract(missile->owner->currentOrigin, missile->currentOrigin, bounce_dir); - VectorNormalize(bounce_dir); - } - else + } + else //or by where the crosshair is (higher difficulties) + { + VectorSubtract(g_crosshairWorldCoord, missile->currentOrigin, bounce_dir); + VectorNormalize(bounce_dir); + if (!PM_SaberInParry(owner->client->ps.saberMove) + && !PM_SaberInReflect(owner->client->ps.saberMove) + && !PM_SaberInIdle(owner->client->ps.saberMove)) + {//a bit more wild + if (PM_SaberInAttack(owner->client->ps.saberMove) + || PM_SaberInTransitionAny(owner->client->ps.saberMove) + || PM_SaberInSpecialAttack(owner->client->ps.torsoAnim)) + {//moderately more wild + for (i = 0; i < 3; i++) { - vec3_t missile_dir; - - VectorSubtract(ent->currentOrigin, missile->currentOrigin, missile_dir); - VectorCopy(missile->s.pos.trDelta, bounce_dir); - VectorScale(bounce_dir, DotProduct(forward, missile_dir), bounce_dir); - VectorNormalize(bounce_dir); + bounce_dir[i] += Q_flrand(-0.2f, 0.2f); } } - else //deflect off at an angle. - { - vec3_t deflect_dir, missile_dir; - float forceFactor; - VectorSubtract(g_crosshairWorldCoord, missile->currentOrigin, deflect_dir); - VectorCopy(missile->s.pos.trDelta, missile_dir); - VectorNormalize(missile_dir); - VectorNormalize(deflect_dir); - - //bigger forceFactors make the reflected shots go closer to the crosshair - switch (owner->client->ps.forcePowerLevel[powerToUse]) + else + {//mildly more wild + for (i = 0; i < 3; i++) { - case FORCE_LEVEL_1: - forceFactor = 2.0f; - break; - case FORCE_LEVEL_2: - forceFactor = 3.0f; - break; - default: - forceFactor = 10.0f; - break; + bounce_dir[i] += Q_flrand(-0.1f, 0.1f); } + } + } + VectorNormalize(bounce_dir); + reflected = qtrue; + } + } + if (!reflected) + { + if (g_spskill->integer < 2 || owner->s.clientNum >= MAX_CLIENTS) + { + if (missile->owner && missile->s.weapon != WP_SABER) + {//bounce back at them if you can + VectorSubtract(missile->owner->currentOrigin, missile->currentOrigin, bounce_dir); + VectorNormalize(bounce_dir); + } + else + { + vec3_t missile_dir; - VectorMA(missile_dir, forceFactor, deflect_dir, bounce_dir); + VectorSubtract(ent->currentOrigin, missile->currentOrigin, missile_dir); + VectorCopy(missile->s.pos.trDelta, bounce_dir); + VectorScale(bounce_dir, DotProduct(forward, missile_dir), bounce_dir); + VectorNormalize(bounce_dir); + } + } + else //deflect off at an angle. + { + vec3_t deflect_dir, missile_dir; + float forceFactor; + VectorSubtract(g_crosshairWorldCoord, missile->currentOrigin, deflect_dir); + VectorCopy(missile->s.pos.trDelta, missile_dir); + VectorNormalize(missile_dir); + VectorNormalize(deflect_dir); + + //bigger forceFactors make the reflected shots go closer to the crosshair + switch (owner->client->ps.forcePowerLevel[powerToUse]) + { + case FORCE_LEVEL_1: + forceFactor = 2.0f; + break; + case FORCE_LEVEL_2: + forceFactor = 3.0f; + break; + default: + forceFactor = 10.0f; + break; + } + + VectorMA(missile_dir, forceFactor, deflect_dir, bounce_dir); - VectorNormalize(bounce_dir); + VectorNormalize(bounce_dir); + } + if (owner->s.weapon == WP_SABER && owner->client && powerToUse == FP_SABER_DEFENSE) + {//saber + if (owner->client->ps.saberInFlight) + {//reflecting off a thrown saber is totally wild + for (i = 0; i < 3; i++) + { + bounce_dir[i] += Q_flrand(-0.8f, 0.8f); } - if (owner->s.weapon == WP_SABER && owner->client && powerToUse == FP_SABER_DEFENSE) - {//saber - if (owner->client->ps.saberInFlight) - {//reflecting off a thrown saber is totally wild - for (i = 0; i < 3; i++) - { - bounce_dir[i] += Q_flrand(-0.8f, 0.8f); - } - } - else if (owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] <= FORCE_LEVEL_1) - {// at level 1 or below - for (i = 0; i < 3; i++) - { - bounce_dir[i] += Q_flrand(-0.4f, 0.4f); - } - } - else - {// at level 2 - for (i = 0; i < 3; i++) - { - bounce_dir[i] += Q_flrand(-0.2f, 0.2f); - } - } - if (!PM_SaberInParry(owner->client->ps.saberMove) - && !PM_SaberInReflect(owner->client->ps.saberMove) - && !PM_SaberInIdle(owner->client->ps.saberMove)) - {//a bit more wild - if (PM_SaberInAttack(owner->client->ps.saberMove) - || PM_SaberInTransitionAny(owner->client->ps.saberMove) - || PM_SaberInSpecialAttack(owner->client->ps.torsoAnim)) - {//really wild - for (i = 0; i < 3; i++) - { - bounce_dir[i] += Q_flrand(-0.3f, 0.3f); - } - } - else - {//mildly more wild - for (i = 0; i < 3; i++) - { - bounce_dir[i] += Q_flrand(-0.1f, 0.1f); - } - } + } + else if (owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] <= FORCE_LEVEL_1) + {// at level 1 or below + for (i = 0; i < 3; i++) + { + bounce_dir[i] += Q_flrand(-0.4f, 0.4f); + } + } + else + {// at level 2 + for (i = 0; i < 3; i++) + { + bounce_dir[i] += Q_flrand(-0.2f, 0.2f); + } + } + if (!PM_SaberInParry(owner->client->ps.saberMove) + && !PM_SaberInReflect(owner->client->ps.saberMove) + && !PM_SaberInIdle(owner->client->ps.saberMove)) + {//a bit more wild + if (PM_SaberInAttack(owner->client->ps.saberMove) + || PM_SaberInTransitionAny(owner->client->ps.saberMove) + || PM_SaberInSpecialAttack(owner->client->ps.torsoAnim)) + {//really wild + for (i = 0; i < 3; i++) + { + bounce_dir[i] += Q_flrand(-0.3f, 0.3f); } } else - {//some other kind of reflection + {//mildly more wild for (i = 0; i < 3; i++) { - bounce_dir[i] += Q_flrand(-0.2f, 0.2f); + bounce_dir[i] += Q_flrand(-0.1f, 0.1f); } } } - VectorNormalize(bounce_dir); - VectorScale(bounce_dir, speed, missile->s.pos.trDelta); + } + else + {//some other kind of reflection + for (i = 0; i < 3; i++) + { + bounce_dir[i] += Q_flrand(-0.2f, 0.2f); + } + } + } + VectorNormalize(bounce_dir); + VectorScale(bounce_dir, speed, missile->s.pos.trDelta); #ifdef _DEBUG - assert(!Q_isnan(missile->s.pos.trDelta[0]) && !Q_isnan(missile->s.pos.trDelta[1]) && !Q_isnan(missile->s.pos.trDelta[2])); + assert(!Q_isnan(missile->s.pos.trDelta[0]) && !Q_isnan(missile->s.pos.trDelta[1]) && !Q_isnan(missile->s.pos.trDelta[2])); #endif// _DEBUG - missile->s.pos.trTime = level.time - 10; // move a bit on the very first frame - VectorCopy(missile->currentOrigin, missile->s.pos.trBase); - if (missile->s.weapon != WP_SABER) - {//you are mine, now! - if (!missile->lastEnemy) - {//remember who originally shot this missile - missile->lastEnemy = missile->owner; - } - missile->owner = owner; - } - if (missile->s.weapon == WP_ROCKET_LAUNCHER) - {//stop homing - missile->e_ThinkFunc = thinkF_NULL; - } + missile->s.pos.trTime = level.time - 10; // move a bit on the very first frame + VectorCopy(missile->currentOrigin, missile->s.pos.trBase); + if (missile->s.weapon != WP_SABER) + {//you are mine, now! + if (!missile->lastEnemy) + {//remember who originally shot this missile + missile->lastEnemy = missile->owner; } + missile->owner = owner; + } + if (missile->s.weapon == WP_ROCKET_LAUNCHER) + {//stop homing + missile->e_ThinkFunc = thinkF_NULL; } } @@ -404,31 +391,31 @@ G_BounceRollMissile ================ */ -void G_BounceRollMissile( gentity_t *ent, trace_t *trace ) +void G_BounceRollMissile(gentity_t *ent, trace_t *trace) { vec3_t velocity, normal; float dot, speedXY, velocityZ, normalZ; int hitTime; // reflect the velocity on the trace plane - hitTime = level.previousTime + ( level.time - level.previousTime ) * trace->fraction; - EvaluateTrajectoryDelta( &ent->s.pos, hitTime, velocity ); + hitTime = level.previousTime + (level.time - level.previousTime) * trace->fraction; + EvaluateTrajectoryDelta(&ent->s.pos, hitTime, velocity); //Do horizontal //FIXME: Need to roll up, down slopes velocityZ = velocity[2]; velocity[2] = 0; - speedXY = VectorLength( velocity );//friction - VectorCopy( trace->plane.normal, normal ); + speedXY = VectorLength(velocity);//friction + VectorCopy(trace->plane.normal, normal); normalZ = normal[2]; normal[2] = 0; - dot = DotProduct( velocity, normal ); - VectorMA( velocity, -2*dot, normal, ent->s.pos.trDelta ); + dot = DotProduct(velocity, normal); + VectorMA(velocity, -2 * dot, normal, ent->s.pos.trDelta); //now do the z reflection //FIXME: Bobbles when it stops - VectorSet( velocity, 0, 0, velocityZ ); - VectorSet( normal, 0, 0, normalZ ); - dot = DotProduct( velocity, normal )*-1; - if ( dot > 10 ) + VectorSet(velocity, 0, 0, velocityZ); + VectorSet(normal, 0, 0, normalZ); + dot = DotProduct(velocity, normal)*-1; + if (dot > 10) { ent->s.pos.trDelta[2] = dot*0.3f;//not very bouncy } @@ -438,23 +425,23 @@ void G_BounceRollMissile( gentity_t *ent, trace_t *trace ) } // check for stop - if ( speedXY <= 0 ) + if (speedXY <= 0) { - G_SetOrigin( ent, trace->endpos ); - VectorCopy( ent->currentAngles, ent->s.apos.trBase ); - VectorClear( ent->s.apos.trDelta ); + G_SetOrigin(ent, trace->endpos); + VectorCopy(ent->currentAngles, ent->s.apos.trBase); + VectorClear(ent->s.apos.trDelta); ent->s.apos.trType = TR_STATIONARY; return; } //FIXME: rolling needs to match direction - VectorCopy( ent->currentAngles, ent->s.apos.trBase ); - VectorCopy( ent->s.pos.trDelta, ent->s.apos.trDelta ); + VectorCopy(ent->currentAngles, ent->s.apos.trBase); + VectorCopy(ent->s.pos.trDelta, ent->s.apos.trDelta); //remember this spot - VectorCopy( trace->endpos, ent->currentOrigin ); + VectorCopy(trace->endpos, ent->currentOrigin); ent->s.pos.trTime = hitTime - 10; - VectorCopy( ent->currentOrigin, ent->s.pos.trBase ); + VectorCopy(ent->currentOrigin, ent->s.pos.trBase); //VectorCopy( trace->plane.normal, ent->pos1 ); } @@ -464,50 +451,50 @@ G_BounceMissile ================ */ -void G_BounceMissile( gentity_t *ent, trace_t *trace ) { +void G_BounceMissile(gentity_t *ent, trace_t *trace) { vec3_t velocity; float dot; int hitTime; // reflect the velocity on the trace plane - hitTime = level.previousTime + ( level.time - level.previousTime ) * trace->fraction; - EvaluateTrajectoryDelta( &ent->s.pos, hitTime, velocity ); - dot = DotProduct( velocity, trace->plane.normal ); - VectorMA( velocity, -2*dot, trace->plane.normal, ent->s.pos.trDelta ); + hitTime = level.previousTime + (level.time - level.previousTime) * trace->fraction; + EvaluateTrajectoryDelta(&ent->s.pos, hitTime, velocity); + dot = DotProduct(velocity, trace->plane.normal); + VectorMA(velocity, -2 * dot, trace->plane.normal, ent->s.pos.trDelta); - if ( ent->s.eFlags & EF_BOUNCE_SHRAPNEL ) + if (ent->s.eFlags & EF_BOUNCE_SHRAPNEL) { - VectorScale( ent->s.pos.trDelta, 0.25f, ent->s.pos.trDelta ); + VectorScale(ent->s.pos.trDelta, 0.25f, ent->s.pos.trDelta); ent->s.pos.trType = TR_GRAVITY; // check for stop - if ( trace->plane.normal[2] > 0.7 && ent->s.pos.trDelta[2] < 40 ) //this can happen even on very slightly sloped walls, so changed it from > 0 to > 0.7 + if (trace->plane.normal[2] > 0.7 && ent->s.pos.trDelta[2] < 40) //this can happen even on very slightly sloped walls, so changed it from > 0 to > 0.7 { - G_SetOrigin( ent, trace->endpos ); + G_SetOrigin(ent, trace->endpos); ent->nextthink = level.time + 100; return; } } - else if ( ent->s.eFlags & EF_BOUNCE_HALF ) + else if (ent->s.eFlags & EF_BOUNCE_HALF) { - VectorScale( ent->s.pos.trDelta, 0.5, ent->s.pos.trDelta ); + VectorScale(ent->s.pos.trDelta, 0.5, ent->s.pos.trDelta); // check for stop - if ( trace->plane.normal[2] > 0.7 && ent->s.pos.trDelta[2] < 40 ) //this can happen even on very slightly sloped walls, so changed it from > 0 to > 0.7 + if (trace->plane.normal[2] > 0.7 && ent->s.pos.trDelta[2] < 40) //this can happen even on very slightly sloped walls, so changed it from > 0 to > 0.7 { - if ( ent->s.weapon == WP_THERMAL ) + if (ent->s.weapon == WP_THERMAL) {//roll when you "stop" ent->s.pos.trType = TR_INTERPOLATE; } else { - G_SetOrigin( ent, trace->endpos ); + G_SetOrigin(ent, trace->endpos); ent->nextthink = level.time + 500; return; } } - if ( ent->s.weapon == WP_THERMAL ) + if (ent->s.weapon == WP_THERMAL) { ent->has_bounced = qtrue; } @@ -515,14 +502,14 @@ void G_BounceMissile( gentity_t *ent, trace_t *trace ) { #if 0 // OLD--this looks so wrong. It looked wrong in EF. It just must be wrong. - VectorAdd( ent->currentOrigin, trace->plane.normal, ent->currentOrigin); + VectorAdd(ent->currentOrigin, trace->plane.normal, ent->currentOrigin); ent->s.pos.trTime = level.time - 10; #else // NEW--It would seem that we want to set our trBase to the trace endpos // and set the trTime to the actual time of impact.... - VectorAdd( trace->endpos, trace->plane.normal, ent->currentOrigin ); - if ( hitTime >= level.time ) + VectorAdd(trace->endpos, trace->plane.normal, ent->currentOrigin); + if (hitTime >= level.time) {//trace fraction must have been 1 ent->s.pos.trTime = level.time - 10; } @@ -532,13 +519,13 @@ void G_BounceMissile( gentity_t *ent, trace_t *trace ) { } #endif - VectorCopy( ent->currentOrigin, ent->s.pos.trBase ); - VectorCopy( trace->plane.normal, ent->pos1 ); + VectorCopy(ent->currentOrigin, ent->s.pos.trBase); + VectorCopy(trace->plane.normal, ent->pos1); - if ( ent->s.weapon != WP_SABER + if (ent->s.weapon != WP_SABER && ent->s.weapon != WP_THERMAL && ent->e_clThinkFunc != clThinkF_CG_Limb - && ent->e_ThinkFunc != thinkF_LimbThink ) + && ent->e_ThinkFunc != thinkF_LimbThink) {//not a saber, bouncing thermal or limb //now you can damage the guy you came from ent->owner = NULL; @@ -552,105 +539,105 @@ G_MissileImpact ================ */ -void NoghriGasCloudThink( gentity_t *self ) +void NoghriGasCloudThink(gentity_t *self) { self->nextthink = level.time + FRAMETIME; - AddSightEvent( self->owner, self->currentOrigin, 200, AEL_DANGER, 50 ); + AddSightEvent(self->owner, self->currentOrigin, 200, AEL_DANGER, 50); - if ( self->fx_time < level.time ) + if (self->fx_time < level.time) { - vec3_t up = {0,0,1}; - G_PlayEffect( "noghri_stick/gas_cloud", self->currentOrigin, up ); + vec3_t up = { 0, 0, 1 }; + G_PlayEffect("noghri_stick/gas_cloud", self->currentOrigin, up); self->fx_time = level.time + 250; } - if ( level.time - self->s.time <= 2500 ) + if (level.time - self->s.time <= 2500) { - if ( !Q_irand( 0, 3-g_spskill->integer ) ) + if (!Q_irand(0, 3 - g_spskill->integer)) { - G_RadiusDamage( self->currentOrigin, self->owner, Q_irand( 1, 4 ), self->splashRadius, - self->owner, self->splashMethodOfDeath ); + G_RadiusDamage(self->currentOrigin, self->owner, Q_irand(1, 4), self->splashRadius, + self->owner, self->splashMethodOfDeath); } } - if ( level.time - self->s.time > 3000 ) + if (level.time - self->s.time > 3000) { - G_FreeEntity( self ); + G_FreeEntity(self); } } -void G_SpawnNoghriGasCloud( gentity_t *ent ) +void G_SpawnNoghriGasCloud(gentity_t *ent) {//FIXME: force-pushable/dispersable? ent->freeAfterEvent = qfalse; ent->e_TouchFunc = touchF_NULL; //ent->s.loopSound = G_SoundIndex( "sound/weapons/noghri/smoke.wav" ); //G_SoundOnEnt( ent, CHAN_AUTO, "sound/weapons/noghri/smoke.wav" ); - G_SetOrigin( ent, ent->currentOrigin ); + G_SetOrigin(ent, ent->currentOrigin); ent->e_ThinkFunc = thinkF_NoghriGasCloudThink; ent->nextthink = level.time + FRAMETIME; - vec3_t up = {0,0,1}; - G_PlayEffect( "noghri_stick/gas_cloud", ent->currentOrigin, up ); + vec3_t up = { 0, 0, 1 }; + G_PlayEffect("noghri_stick/gas_cloud", ent->currentOrigin, up); ent->fx_time = level.time + 250; ent->s.time = level.time; } -extern void laserTrapStick( gentity_t *ent, vec3_t endpos, vec3_t normal ); -extern qboolean W_AccuracyLoggableWeapon( int weapon, qboolean alt_fire, int mod ); -void G_MissileImpacted( gentity_t *ent, gentity_t *other, vec3_t impactPos, vec3_t normal, int hitLoc=HL_NONE ) +extern void laserTrapStick(gentity_t *ent, vec3_t endpos, vec3_t normal); +extern qboolean W_AccuracyLoggableWeapon(int weapon, qboolean alt_fire, int mod); +void G_MissileImpacted(gentity_t *ent, gentity_t *other, vec3_t impactPos, vec3_t normal, int hitLoc = HL_NONE) { // impact damage - if ( other->takedamage ) + if (other->takedamage) { // FIXME: wrong damage direction? - if ( ent->damage ) + if (ent->damage) { vec3_t velocity; - EvaluateTrajectoryDelta( &ent->s.pos, level.time, velocity ); - if ( VectorLength( velocity ) == 0 ) + EvaluateTrajectoryDelta(&ent->s.pos, level.time, velocity); + if (VectorLength(velocity) == 0) { velocity[2] = 1; // stepped on a grenade } int damage = ent->damage; - if( other->client ) + if (other->client) { class_t npc_class = other->client->NPC_class; // If we are a robot and we aren't currently doing the full body electricity... - if ( npc_class == CLASS_SEEKER || npc_class == CLASS_PROBE || npc_class == CLASS_MOUSE || - npc_class == CLASS_GONK || npc_class == CLASS_R2D2 || npc_class == CLASS_R5D2 || npc_class == CLASS_REMOTE || - npc_class == CLASS_MARK1 || npc_class == CLASS_MARK2 || //npc_class == CLASS_PROTOCOL ||//no protocol, looks odd - npc_class == CLASS_INTERROGATOR || npc_class == CLASS_ATST || npc_class == CLASS_SENTRY ) + if (npc_class == CLASS_SEEKER || npc_class == CLASS_PROBE || npc_class == CLASS_MOUSE || + npc_class == CLASS_GONK || npc_class == CLASS_R2D2 || npc_class == CLASS_R5D2 || npc_class == CLASS_REMOTE || + npc_class == CLASS_MARK1 || npc_class == CLASS_MARK2 || //npc_class == CLASS_PROTOCOL ||//no protocol, looks odd + npc_class == CLASS_INTERROGATOR || npc_class == CLASS_ATST || npc_class == CLASS_SENTRY) { // special droid only behaviors - if ( other->client->ps.powerups[PW_SHOCKED] < level.time + 100 ) + if (other->client->ps.powerups[PW_SHOCKED] < level.time + 100) { // ... do the effect for a split second for some more feedback - other->s.powerups |= ( 1 << PW_SHOCKED ); + other->s.powerups |= (1 << PW_SHOCKED); other->client->ps.powerups[PW_SHOCKED] = level.time + 450; } //FIXME: throw some sparks off droids,too } } - G_Damage( other, ent, ent->owner, velocity, - impactPos, damage, - ent->dflags, ent->methodOfDeath, hitLoc); + G_Damage(other, ent, ent->owner, velocity, + impactPos, damage, + ent->dflags, ent->methodOfDeath, hitLoc); - if ( ent->s.weapon == WP_DEMP2 ) + if (ent->s.weapon == WP_DEMP2) {//a hit with demp2 decloaks saboteurs - if ( other && other->client && other->client->NPC_class == CLASS_SABOTEUR ) + if (other && other->client && other->client->NPC_class == CLASS_SABOTEUR) {//FIXME: make this disabled cloak hold for some amount of time? - Saboteur_Decloak( other, Q_irand( 3000, 10000 ) ); - if ( ent->methodOfDeath == MOD_DEMP2_ALT ) + Saboteur_Decloak(other, Q_irand(3000, 10000)); + if (ent->methodOfDeath == MOD_DEMP2_ALT) {//direct hit with alt disabled cloak forever - if ( other->NPC ) + if (other->NPC) {//permanently disable the saboteur's cloak other->NPC->aiFlags &= ~NPCAI_SHIELDS; } @@ -664,24 +651,24 @@ void G_MissileImpacted( gentity_t *ent, gentity_t *other, vec3_t impactPos, vec3 // one, rather than changing the missile into the explosion? //G_FreeEntity(ent); - if ( (other->takedamage && other->client ) || (ent->s.weapon == WP_FLECHETTE && other->contents&CONTENTS_LIGHTSABER) ) + if ((other->takedamage && other->client) || (ent->s.weapon == WP_FLECHETTE && other->contents&CONTENTS_LIGHTSABER)) { - G_AddEvent( ent, EV_MISSILE_HIT, DirToByte( normal ) ); + G_AddEvent(ent, EV_MISSILE_HIT, DirToByte(normal)); ent->s.otherEntityNum = other->s.number; } else { - G_AddEvent( ent, EV_MISSILE_MISS, DirToByte( normal ) ); + G_AddEvent(ent, EV_MISSILE_MISS, DirToByte(normal)); ent->s.otherEntityNum = other->s.number; } - VectorCopy( normal, ent->pos1 ); + VectorCopy(normal, ent->pos1); - if ( ent->owner )//&& ent->owner->s.number == 0 ) + if (ent->owner)//&& ent->owner->s.number == 0 ) { //Add the event - AddSoundEvent( ent->owner, ent->currentOrigin, 256, AEL_SUSPICIOUS, qfalse, qtrue ); - AddSightEvent( ent->owner, ent->currentOrigin, 512, AEL_DISCOVERED, 75 ); + AddSoundEvent(ent->owner, ent->currentOrigin, 256, AEL_SUSPICIOUS, qfalse, qtrue); + AddSightEvent(ent->owner, ent->currentOrigin, 512, AEL_DISCOVERED, 75); } ent->freeAfterEvent = qtrue; @@ -690,64 +677,64 @@ void G_MissileImpacted( gentity_t *ent, gentity_t *other, vec3_t impactPos, vec3 ent->s.eType = ET_GENERAL; //SnapVectorTowards( trace->endpos, ent->s.pos.trBase ); // save net bandwidth - VectorCopy( impactPos, ent->s.pos.trBase ); + VectorCopy(impactPos, ent->s.pos.trBase); - G_SetOrigin( ent, impactPos ); + G_SetOrigin(ent, impactPos); // splash damage (doesn't apply to person directly hit) - if ( ent->splashDamage ) + if (ent->splashDamage) { - G_RadiusDamage( impactPos, ent->owner, ent->splashDamage, ent->splashRadius, - other, ent->splashMethodOfDeath ); + G_RadiusDamage(impactPos, ent->owner, ent->splashDamage, ent->splashRadius, + other, ent->splashMethodOfDeath); } - if ( ent->s.weapon == WP_NOGHRI_STICK ) + if (ent->s.weapon == WP_NOGHRI_STICK) { - G_SpawnNoghriGasCloud( ent ); + G_SpawnNoghriGasCloud(ent); } - gi.linkentity( ent ); + gi.linkentity(ent); } //------------------------------------------------ -static void G_MissileAddAlerts( gentity_t *ent ) +static void G_MissileAddAlerts(gentity_t *ent) { //Add the event - if ( ent->s.weapon == WP_THERMAL && ((ent->delay-level.time) < 2000 || ent->s.pos.trType == TR_INTERPOLATE) ) + if (ent->s.weapon == WP_THERMAL && ((ent->delay - level.time) < 2000 || ent->s.pos.trType == TR_INTERPOLATE)) {//a thermal about to explode or rolling - if ( (ent->delay-level.time) < 500 ) + if ((ent->delay - level.time) < 500) {//half a second before it explodes! - AddSoundEvent( ent->owner, ent->currentOrigin, ent->splashRadius*2, AEL_DANGER_GREAT, qfalse, qtrue ); - AddSightEvent( ent->owner, ent->currentOrigin, ent->splashRadius*2, AEL_DANGER_GREAT, 20 ); + AddSoundEvent(ent->owner, ent->currentOrigin, ent->splashRadius * 2, AEL_DANGER_GREAT, qfalse, qtrue); + AddSightEvent(ent->owner, ent->currentOrigin, ent->splashRadius * 2, AEL_DANGER_GREAT, 20); } else {//2 seconds until it explodes or it's rolling - AddSoundEvent( ent->owner, ent->currentOrigin, ent->splashRadius*2, AEL_DANGER, qfalse, qtrue ); - AddSightEvent( ent->owner, ent->currentOrigin, ent->splashRadius*2, AEL_DANGER, 20 ); + AddSoundEvent(ent->owner, ent->currentOrigin, ent->splashRadius * 2, AEL_DANGER, qfalse, qtrue); + AddSightEvent(ent->owner, ent->currentOrigin, ent->splashRadius * 2, AEL_DANGER, 20); } } else { - AddSoundEvent( ent->owner, ent->currentOrigin, 128, AEL_DISCOVERED ); - AddSightEvent( ent->owner, ent->currentOrigin, 256, AEL_DISCOVERED, 40 ); + AddSoundEvent(ent->owner, ent->currentOrigin, 128, AEL_DISCOVERED); + AddSightEvent(ent->owner, ent->currentOrigin, 256, AEL_DISCOVERED, 40); } } //------------------------------------------------------ -void G_MissileImpact( gentity_t *ent, trace_t *trace, int hitLoc=HL_NONE ) +void G_MissileImpact(gentity_t *ent, trace_t *trace, int hitLoc = HL_NONE) { gentity_t *other; vec3_t diff; other = &g_entities[trace->entityNum]; - if ( other == ent ) + if (other == ent) { - assert(0&&"missile hit itself!!!"); + assert(0 && "missile hit itself!!!"); return; } - if ( trace->plane.normal[0] == 0.0f && - trace->plane.normal[1] == 0.0f && - trace->plane.normal[2] == 0.0f + if (trace->plane.normal[0] == 0.0f && + trace->plane.normal[1] == 0.0f && + trace->plane.normal[2] == 0.0f ) {//model moved into missile in flight probably... trace->plane.normal[0] = -ent->s.pos.trDelta[0]; @@ -756,17 +743,17 @@ void G_MissileImpact( gentity_t *ent, trace_t *trace, int hitLoc=HL_NONE ) VectorNormalize(trace->plane.normal); } - if ( ent->owner && (other->takedamage||other->client) ) + if (ent->owner && (other->takedamage || other->client)) { - if ( !ent->lastEnemy || ent->lastEnemy == ent->owner ) + if (!ent->lastEnemy || ent->lastEnemy == ent->owner) {//a missile that was not reflected or, if so, still is owned by original owner - if( LogAccuracyHit( other, ent->owner ) ) + if (LogAccuracyHit(other, ent->owner)) { ent->owner->client->ps.persistant[PERS_ACCURACY_HITS]++; } - if ( ent->owner->client && !ent->owner->s.number ) + if (ent->owner->client && !ent->owner->s.number) { - if ( W_AccuracyLoggableWeapon( ent->s.weapon, qfalse, ent->methodOfDeath ) ) + if (W_AccuracyLoggableWeapon(ent->s.weapon, qfalse, ent->methodOfDeath)) { ent->owner->client->sess.missionStats.hits++; } @@ -775,19 +762,19 @@ void G_MissileImpact( gentity_t *ent, trace_t *trace, int hitLoc=HL_NONE ) } // check for bounce //OR: if the surfaceParm is has a reflect property (magnetic shielding) and the missile isn't an exploding missile - qboolean bounce = !!( (!other->takedamage && (ent->s.eFlags&(EF_BOUNCE|EF_BOUNCE_HALF))) || (((trace->surfaceFlags&SURF_FORCEFIELD)||(other->flags&FL_SHIELDED))&&!ent->splashDamage&&!ent->splashRadius&&ent->s.weapon != WP_NOGHRI_STICK) ); + qboolean bounce = !!((!other->takedamage && (ent->s.eFlags&(EF_BOUNCE | EF_BOUNCE_HALF))) || (((trace->surfaceFlags&SURF_FORCEFIELD) || (other->flags&FL_SHIELDED)) && !ent->splashDamage&&!ent->splashRadius&&ent->s.weapon != WP_NOGHRI_STICK)); - if ( ent->dflags & DAMAGE_HEAVY_WEAP_CLASS ) + if (ent->dflags & DAMAGE_HEAVY_WEAP_CLASS) { // heavy class missiles generally never bounce. bounce = qfalse; } - if ( other->flags & (FL_DMG_BY_HEAVY_WEAP_ONLY | FL_SHIELDED )) + if (other->flags & (FL_DMG_BY_HEAVY_WEAP_ONLY | FL_SHIELDED)) { // Dumb assumption, but I guess we must be a shielded ion_cannon?? We should probably verify // if it's an ion_cannon that's Heavy Weapon only, we don't want to make it shielded do we...? - if ( (!strcmp( "misc_ion_cannon", other->classname )) && (other->flags & FL_SHIELDED) ) + if ((!strcmp("misc_ion_cannon", other->classname)) && (other->flags & FL_SHIELDED)) { // Anything will bounce off of us. bounce = qtrue; @@ -797,94 +784,94 @@ void G_MissileImpact( gentity_t *ent, trace_t *trace, int hitLoc=HL_NONE ) } } - if ( ent->s.weapon == WP_DEMP2 ) + if (ent->s.weapon == WP_DEMP2) { // demp2 shots can never bounce bounce = qfalse; // in fact, alt-charge shots will not call the regular impact functions - if ( ent->alt_fire ) + if (ent->alt_fire) { // detonate at the trace end - VectorCopy( trace->endpos, ent->currentOrigin ); - VectorCopy( trace->plane.normal, ent->pos1 ); - DEMP2_AltDetonate( ent ); + VectorCopy(trace->endpos, ent->currentOrigin); + VectorCopy(trace->plane.normal, ent->pos1); + DEMP2_AltDetonate(ent); return; } } - if ( bounce ) + if (bounce) { // Check to see if there is a bounce count - if ( ent->bounceCount ) + if (ent->bounceCount) { // decrement number of bounces and then see if it should be done bouncing - if ( !(--ent->bounceCount) ) { + if (!(--ent->bounceCount)) { // He (or she) will bounce no more (after this current bounce, that is). - ent->s.eFlags &= ~( EF_BOUNCE | EF_BOUNCE_HALF ); + ent->s.eFlags &= ~(EF_BOUNCE | EF_BOUNCE_HALF); } } - if ( other->NPC ) + if (other->NPC) { - G_Damage( other, ent, ent->owner, ent->currentOrigin, ent->s.pos.trDelta, 0, DAMAGE_NO_DAMAGE, MOD_UNKNOWN ); + G_Damage(other, ent, ent->owner, ent->currentOrigin, ent->s.pos.trDelta, 0, DAMAGE_NO_DAMAGE, MOD_UNKNOWN); } - G_BounceMissile( ent, trace ); + G_BounceMissile(ent, trace); - if ( ent->owner )//&& ent->owner->s.number == 0 ) + if (ent->owner)//&& ent->owner->s.number == 0 ) { - G_MissileAddAlerts( ent ); + G_MissileAddAlerts(ent); } - G_MissileBounceEffect( ent, trace->endpos, trace->plane.normal, trace->entityNum==ENTITYNUM_WORLD ); + G_MissileBounceEffect(ent, trace->endpos, trace->plane.normal, trace->entityNum == ENTITYNUM_WORLD); return; } // I would glom onto the EF_BOUNCE code section above, but don't feel like risking breaking something else - if ( (!other->takedamage && ( ent->s.eFlags&(EF_BOUNCE_SHRAPNEL) ) ) - || ((trace->surfaceFlags&SURF_FORCEFIELD)&&!ent->splashDamage&&!ent->splashRadius) ) + if ((!other->takedamage && (ent->s.eFlags&(EF_BOUNCE_SHRAPNEL))) + || ((trace->surfaceFlags&SURF_FORCEFIELD) && !ent->splashDamage&&!ent->splashRadius)) { - if ( !(other->contents&CONTENTS_LIGHTSABER) + if (!(other->contents&CONTENTS_LIGHTSABER) || g_spskill->integer <= 0//on easy, it reflects all shots - || (g_spskill->integer == 1 && ent->s.weapon != WP_FLECHETTE && ent->s.weapon != WP_DEMP2 )//on medium it won't reflect flechette or demp shots - || (g_spskill->integer >= 2 && ent->s.weapon != WP_FLECHETTE && ent->s.weapon != WP_DEMP2 && ent->s.weapon != WP_BOWCASTER && ent->s.weapon != WP_REPEATER )//on hard it won't reflect flechette, demp, repeater or bowcaster shots + || (g_spskill->integer == 1 && ent->s.weapon != WP_FLECHETTE && ent->s.weapon != WP_DEMP2)//on medium it won't reflect flechette or demp shots + || (g_spskill->integer >= 2 && ent->s.weapon != WP_FLECHETTE && ent->s.weapon != WP_DEMP2 && ent->s.weapon != WP_BOWCASTER && ent->s.weapon != WP_REPEATER)//on hard it won't reflect flechette, demp, repeater or bowcaster shots ) { - G_BounceMissile( ent, trace ); + G_BounceMissile(ent, trace); - if ( --ent->bounceCount < 0 ) + if (--ent->bounceCount < 0) { ent->s.eFlags &= ~EF_BOUNCE_SHRAPNEL; } - G_MissileBounceEffect( ent, trace->endpos, trace->plane.normal, trace->entityNum==ENTITYNUM_WORLD ); + G_MissileBounceEffect(ent, trace->endpos, trace->plane.normal, trace->entityNum == ENTITYNUM_WORLD); return; } } - if ( (!other->takedamage || (other->client && other->health <= 0)) + if ((!other->takedamage || (other->client && other->health <= 0)) && ent->s.weapon == WP_THERMAL - && !ent->alt_fire ) + && !ent->alt_fire) {//rolling thermal det - FIXME: make this an eFlag like bounce & stick!!! //G_BounceRollMissile( ent, trace ); - if ( ent->owner )//&& ent->owner->s.number == 0 ) + if (ent->owner)//&& ent->owner->s.number == 0 ) { - G_MissileAddAlerts( ent ); + G_MissileAddAlerts(ent); } //gi.linkentity( ent ); return; } // check for sticking - if ( ent->s.eFlags & EF_MISSILE_STICK ) + if (ent->s.eFlags & EF_MISSILE_STICK) { - if ( ent->owner )//&& ent->owner->s.number == 0 ) + if (ent->owner)//&& ent->owner->s.number == 0 ) { //Add the event - if ( ent->s.weapon == WP_TRIP_MINE ) + if (ent->s.weapon == WP_TRIP_MINE) { - AddSoundEvent( ent->owner, ent->currentOrigin, ent->splashRadius/2, AEL_DISCOVERED/*AEL_DANGER*/, qfalse, qtrue ); - AddSightEvent( ent->owner, ent->currentOrigin, ent->splashRadius*2, AEL_DISCOVERED/*AEL_DANGER*/, 60 ); + AddSoundEvent(ent->owner, ent->currentOrigin, ent->splashRadius / 2, AEL_DISCOVERED/*AEL_DANGER*/, qfalse, qtrue); + AddSightEvent(ent->owner, ent->currentOrigin, ent->splashRadius * 2, AEL_DISCOVERED/*AEL_DANGER*/, 60); /* AddSoundEvent( ent->owner, ent->currentOrigin, ent->splashRadius*2, AEL_DANGER, qfalse, qtrue ); AddSightEvent( ent->owner, ent->currentOrigin, ent->splashRadius*2, AEL_DANGER, 60 ); @@ -892,37 +879,37 @@ void G_MissileImpact( gentity_t *ent, trace_t *trace, int hitLoc=HL_NONE ) } else { - AddSoundEvent( ent->owner, ent->currentOrigin, 128, AEL_DISCOVERED, qfalse, qtrue ); - AddSightEvent( ent->owner, ent->currentOrigin, 256, AEL_DISCOVERED, 10 ); + AddSoundEvent(ent->owner, ent->currentOrigin, 128, AEL_DISCOVERED, qfalse, qtrue); + AddSightEvent(ent->owner, ent->currentOrigin, 256, AEL_DISCOVERED, 10); } } - G_MissileStick( ent, other, trace ); + G_MissileStick(ent, other, trace); return; } -extern bool WP_DoingMoronicForcedAnimationForForcePowers(gentity_t *ent); + extern bool WP_DoingMoronicForcedAnimationForForcePowers(gentity_t *ent); // check for hitting a lightsaber - if ( other->contents & CONTENTS_LIGHTSABER ) + if (other->contents & CONTENTS_LIGHTSABER) { - if ( other->owner && !other->owner->s.number && other->owner->client ) + if (other->owner && !other->owner->s.number && other->owner->client) { other->owner->client->sess.missionStats.saberBlocksCnt++; } - if ( ( g_spskill->integer <= 0//on easy, it reflects all shots - || (g_spskill->integer == 1 && ent->s.weapon != WP_FLECHETTE && ent->s.weapon != WP_DEMP2 )//on medium it won't reflect flechette or demp shots - || (g_spskill->integer >= 2 && ent->s.weapon != WP_FLECHETTE && ent->s.weapon != WP_DEMP2 && ent->s.weapon != WP_BOWCASTER && ent->s.weapon != WP_REPEATER )//on hard it won't reflect flechette, demp, repeater or bowcaster shots - ) + if ((g_spskill->integer <= 0//on easy, it reflects all shots + || (g_spskill->integer == 1 && ent->s.weapon != WP_FLECHETTE && ent->s.weapon != WP_DEMP2)//on medium it won't reflect flechette or demp shots + || (g_spskill->integer >= 2 && ent->s.weapon != WP_FLECHETTE && ent->s.weapon != WP_DEMP2 && ent->s.weapon != WP_BOWCASTER && ent->s.weapon != WP_REPEATER)//on hard it won't reflect flechette, demp, repeater or bowcaster shots + ) && (!ent->splashDamage || !ent->splashRadius) //this would be cool, though, to "bat" the thermal det away... - && ent->s.weapon != WP_NOGHRI_STICK )//gas bomb, don't reflect + && ent->s.weapon != WP_NOGHRI_STICK)//gas bomb, don't reflect { //FIXME: take other's owner's FP_SABER_DEFENSE into account here somehow? - if ( !other->owner || !other->owner->client || other->owner->client->ps.saberInFlight - || (InFront( ent->currentOrigin, other->owner->currentOrigin, other->owner->client->ps.viewangles, SABER_REFLECT_MISSILE_CONE ) && - !WP_DoingMoronicForcedAnimationForForcePowers(other)) )//other->owner->s.number != 0 || + if (!other->owner || !other->owner->client || other->owner->client->ps.saberInFlight + || (InFront(ent->currentOrigin, other->owner->currentOrigin, other->owner->client->ps.viewangles, SABER_REFLECT_MISSILE_CONE) && + !WP_DoingMoronicForcedAnimationForForcePowers(other)))//other->owner->s.number != 0 || {//Jedi cannot block shots from behind! int blockChance = 0; - switch ( other->owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] ) + switch (other->owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) {//level 1 reflects 50% of the time, level 2 reflects 75% of the time case FORCE_LEVEL_3: blockChance = 10; @@ -934,34 +921,34 @@ extern bool WP_DoingMoronicForcedAnimationForForcePowers(gentity_t *ent); blockChance = 1; break; } - if ( blockChance && (other->owner->client->ps.forcePowersActive&(1<owner->client->ps.forcePowersActive&(1 << FP_SPEED))) {//in in force speed, better chance of deflecting the shot - blockChance += other->owner->client->ps.forcePowerLevel[FP_SPEED]*2; + blockChance += other->owner->client->ps.forcePowerLevel[FP_SPEED] * 2; } - if ( Q_irand( 0, blockChance ) ) + if (Q_irand(0, blockChance)) { VectorSubtract(ent->currentOrigin, other->currentOrigin, diff); VectorNormalize(diff); - G_ReflectMissile( other, ent, diff, FP_SABER_DEFENSE); - if ( other->owner && other->owner->client ) + G_ReflectMissile(other, ent, diff, FP_SABER_DEFENSE); + if (other->owner && other->owner->client) { other->owner->client->ps.saberEventFlags |= SEF_DEFLECTED; } //do the effect - VectorCopy( ent->s.pos.trDelta, diff ); - VectorNormalize( diff ); - G_MissileReflectEffect( ent, trace->endpos, trace->plane.normal ); + VectorCopy(ent->s.pos.trDelta, diff); + VectorNormalize(diff); + G_MissileReflectEffect(ent, trace->endpos, trace->plane.normal); return; } } } else {//still do the bounce effect - G_MissileReflectEffect( ent, trace->endpos, trace->plane.normal ); + G_MissileReflectEffect(ent, trace->endpos, trace->plane.normal); } } - G_MissileImpacted( ent, other, trace->endpos, trace->plane.normal, hitLoc ); + G_MissileImpacted(ent, other, trace->endpos, trace->plane.normal, hitLoc); } /* @@ -971,35 +958,35 @@ G_ExplodeMissile Explode a missile without an impact ================ */ -void G_ExplodeMissile( gentity_t *ent ) +void G_ExplodeMissile(gentity_t *ent) { vec3_t dir; vec3_t origin; - EvaluateTrajectory( &ent->s.pos, level.time, origin ); - SnapVector( origin ); - G_SetOrigin( ent, origin ); + EvaluateTrajectory(&ent->s.pos, level.time, origin); + SnapVector(origin); + G_SetOrigin(ent, origin); // we don't have a valid direction, so just point straight up dir[0] = dir[1] = 0; dir[2] = 1; - if ( ent->owner )//&& ent->owner->s.number == 0 ) + if (ent->owner)//&& ent->owner->s.number == 0 ) { //Add the event - AddSoundEvent( ent->owner, ent->currentOrigin, 256, AEL_DISCOVERED, qfalse, qtrue );//FIXME: are we on ground or not? - AddSightEvent( ent->owner, ent->currentOrigin, 512, AEL_DISCOVERED, 100 ); + AddSoundEvent(ent->owner, ent->currentOrigin, 256, AEL_DISCOVERED, qfalse, qtrue);//FIXME: are we on ground or not? + AddSightEvent(ent->owner, ent->currentOrigin, 512, AEL_DISCOVERED, 100); } -/* ent->s.eType = ET_GENERAL; + /* ent->s.eType = ET_GENERAL; G_AddEvent( ent, EV_MISSILE_MISS, DirToByte( dir ) ); ent->freeAfterEvent = qtrue;*/ // splash damage - if ( ent->splashDamage ) + if (ent->splashDamage) { - G_RadiusDamage( ent->currentOrigin, ent->owner, ent->splashDamage, ent->splashRadius, NULL - , ent->splashMethodOfDeath ); + G_RadiusDamage(ent->currentOrigin, ent->owner, ent->splashDamage, ent->splashRadius, NULL + , ent->splashMethodOfDeath); } G_FreeEntity(ent); @@ -1007,24 +994,24 @@ void G_ExplodeMissile( gentity_t *ent ) } -void G_RunStuckMissile( gentity_t *ent ) +void G_RunStuckMissile(gentity_t *ent) { - if ( ent->takedamage ) + if (ent->takedamage) { - if ( ent->s.groundEntityNum >= 0 && ent->s.groundEntityNum < ENTITYNUM_WORLD ) + if (ent->s.groundEntityNum >= 0 && ent->s.groundEntityNum < ENTITYNUM_WORLD) { gentity_t *other = &g_entities[ent->s.groundEntityNum]; - if ( (!VectorCompare( vec3_origin, other->s.pos.trDelta ) && other->s.pos.trType != TR_STATIONARY) || - (!VectorCompare( vec3_origin, other->s.apos.trDelta ) && other->s.apos.trType != TR_STATIONARY) ) + if ((!VectorCompare(vec3_origin, other->s.pos.trDelta) && other->s.pos.trType != TR_STATIONARY) || + (!VectorCompare(vec3_origin, other->s.apos.trDelta) && other->s.apos.trType != TR_STATIONARY)) {//thing I stuck to is moving or rotating now, kill me - G_Damage( ent, other, other, NULL, NULL, 99999, 0, MOD_CRUSH ); + G_Damage(ent, other, other, NULL, NULL, 99999, 0, MOD_CRUSH); return; } } } // check think function - G_RunThink( ent ); + G_RunThink(ent); } /* @@ -1034,7 +1021,7 @@ G_GroundTrace ================== */ -int G_GroundTrace( gentity_t *ent, pml_t *pPml ) +int G_GroundTrace(gentity_t *ent, pml_t *pPml) { vec3_t point; trace_t trace; @@ -1043,11 +1030,11 @@ int G_GroundTrace( gentity_t *ent, pml_t *pPml ) point[1] = ent->currentOrigin[1]; point[2] = ent->currentOrigin[2] - 0.25; - gi.trace ( &trace, ent->currentOrigin, ent->mins, ent->maxs, point, ent->s.number, ent->clipmask, (EG2_Collision)0, 0 ); + gi.trace(&trace, ent->currentOrigin, ent->mins, ent->maxs, point, ent->s.number, ent->clipmask, (EG2_Collision)0, 0); pPml->groundTrace = trace; // do something corrective if the trace starts in a solid... - if ( trace.allsolid ) + if (trace.allsolid) { pPml->groundPlane = qfalse; pPml->walking = qfalse; @@ -1055,7 +1042,7 @@ int G_GroundTrace( gentity_t *ent, pml_t *pPml ) } // if the trace didn't hit anything, we are in free fall - if ( trace.fraction == 1.0 ) + if (trace.fraction == 1.0) { pPml->groundPlane = qfalse; pPml->walking = qfalse; @@ -1063,7 +1050,7 @@ int G_GroundTrace( gentity_t *ent, pml_t *pPml ) } // check if getting thrown off the ground - if ( ent->s.pos.trDelta[2] > 0 && DotProduct( ent->s.pos.trDelta, trace.plane.normal ) > 10 ) + if (ent->s.pos.trDelta[2] > 0 && DotProduct(ent->s.pos.trDelta, trace.plane.normal) > 10) { pPml->groundPlane = qfalse; pPml->walking = qfalse; @@ -1071,7 +1058,7 @@ int G_GroundTrace( gentity_t *ent, pml_t *pPml ) } // slopes that are too steep will not be considered onground - if ( trace.plane.normal[2] < MIN_WALK_NORMAL ) + if (trace.plane.normal[2] < MIN_WALK_NORMAL) { pPml->groundPlane = qtrue; pPml->walking = qfalse; @@ -1084,30 +1071,31 @@ int G_GroundTrace( gentity_t *ent, pml_t *pPml ) /* if ( ent->s.groundEntityNum == ENTITYNUM_NONE ) { - // just hit the ground + // just hit the ground } */ return trace.entityNum; } -void G_ClipVelocity( vec3_t in, vec3_t normal, vec3_t out, float overbounce ) +void G_ClipVelocity(vec3_t in, vec3_t normal, vec3_t out, float overbounce) { float backoff; float change; int i; - backoff = DotProduct (in, normal); + backoff = DotProduct(in, normal); - if ( backoff < 0 ) { + if (backoff < 0) { backoff *= overbounce; - } else { + } + else { backoff /= overbounce; } - for ( i=0 ; i<3 ; i++ ) + for (i = 0; i<3; i++) { - change = normal[i]*backoff; + change = normal[i] * backoff; out[i] = in[i] - change; } } @@ -1128,7 +1116,7 @@ Also gets stuck inside thrower if looking down when thrown */ #define MAX_CLIP_PLANES 5 #define BUMPCLIP 1.5f -void G_RollMissile( gentity_t *ent ) +void G_RollMissile(gentity_t *ent) { int bumpcount, numbumps; vec3_t dir; @@ -1148,34 +1136,34 @@ void G_RollMissile( gentity_t *ent ) float bounceAmt = BUMPCLIP; gentity_t *hitEnt = NULL; - memset( &objPML, 0, sizeof( objPML ) ); + memset(&objPML, 0, sizeof(objPML)); - G_GroundTrace( ent, &objPML ); + G_GroundTrace(ent, &objPML); objPML.frametime = (level.time - level.previousTime)*0.001; numbumps = 4; - VectorCopy ( ent->s.pos.trDelta, primal_velocity ); + VectorCopy(ent->s.pos.trDelta, primal_velocity); - VectorCopy( ent->s.pos.trDelta, endVelocity ); + VectorCopy(ent->s.pos.trDelta, endVelocity); endVelocity[2] -= g_gravity->value * objPML.frametime; - ent->s.pos.trDelta[2] = ( ent->s.pos.trDelta[2] + endVelocity[2] ) * 0.5; + ent->s.pos.trDelta[2] = (ent->s.pos.trDelta[2] + endVelocity[2]) * 0.5; primal_velocity[2] = endVelocity[2]; - if ( objPML.groundPlane ) + if (objPML.groundPlane) {//FIXME: never happens! // slide along the ground plane - G_ClipVelocity( ent->s.pos.trDelta, objPML.groundTrace.plane.normal, ent->s.pos.trDelta, BUMPCLIP ); - VectorScale( ent->s.pos.trDelta, 0.9f, ent->s.pos.trDelta ); + G_ClipVelocity(ent->s.pos.trDelta, objPML.groundTrace.plane.normal, ent->s.pos.trDelta, BUMPCLIP); + VectorScale(ent->s.pos.trDelta, 0.9f, ent->s.pos.trDelta); } time_left = objPML.frametime; // never turn against the ground plane - if ( objPML.groundPlane ) + if (objPML.groundPlane) { numplanes = 1; - VectorCopy( objPML.groundTrace.plane.normal, planes[0] ); + VectorCopy(objPML.groundTrace.plane.normal, planes[0]); } else { @@ -1188,31 +1176,31 @@ void G_RollMissile( gentity_t *ent ) numplanes++; */ - for ( bumpcount = 0; bumpcount < numbumps; bumpcount++ ) + for (bumpcount = 0; bumpcount < numbumps; bumpcount++) { // calculate position we are trying to move to - VectorMA( ent->currentOrigin, time_left, ent->s.pos.trDelta, end ); + VectorMA(ent->currentOrigin, time_left, ent->s.pos.trDelta, end); // see if we can make it there - gi.trace ( &trace, ent->currentOrigin, ent->mins, ent->maxs, end, ent->s.number, ent->clipmask, G2_RETURNONHIT, 10 ); + gi.trace(&trace, ent->currentOrigin, ent->mins, ent->maxs, end, ent->s.number, ent->clipmask, G2_RETURNONHIT, 10); //TEMP HACK: //had to move this up above the trace.allsolid check now that for some reason ghoul2 impacts tell me I'm allsolid?! //this needs to be fixed, really - if ( trace.entityNum < ENTITYNUM_WORLD ) + if (trace.entityNum < ENTITYNUM_WORLD) {//hit another ent hitEnt = &g_entities[trace.entityNum]; - if ( hitEnt && (hitEnt->takedamage || (hitEnt->contents&CONTENTS_LIGHTSABER) ) ) + if (hitEnt && (hitEnt->takedamage || (hitEnt->contents&CONTENTS_LIGHTSABER))) { - G_MissileImpact( ent, &trace ); - if ( ent->s.eType == ET_GENERAL ) + G_MissileImpact(ent, &trace); + if (ent->s.eType == ET_GENERAL) {//exploded return; } } } - if ( trace.allsolid ) + if (trace.allsolid) { // entity is completely trapped in another solid //FIXME: this happens a lot now when we hit a G2 ent... WTF? @@ -1220,15 +1208,15 @@ void G_RollMissile( gentity_t *ent ) return;// qtrue; } - if ( trace.fraction > 0 ) + if (trace.fraction > 0) { // actually covered some distance - VectorCopy( trace.endpos, ent->currentOrigin ); + VectorCopy(trace.endpos, ent->currentOrigin); } - if ( trace.fraction == 1 ) + if (trace.fraction == 1) { - break; // moved the entire distance + break; // moved the entire distance } //pm->ps->pm_flags |= PMF_BUMPED; @@ -1240,16 +1228,16 @@ void G_RollMissile( gentity_t *ent ) /* if ( PM_ClientImpact( trace.entityNum, qtrue ) ) { - continue; + continue; } */ time_left -= time_left * trace.fraction; - if ( numplanes >= MAX_CLIP_PLANES ) + if (numplanes >= MAX_CLIP_PLANES) { // this shouldn't really happen - VectorClear( ent->s.pos.trDelta ); + VectorClear(ent->s.pos.trDelta); return;// qtrue; } @@ -1258,25 +1246,25 @@ void G_RollMissile( gentity_t *ent ) // out along it, which fixes some epsilon issues with // non-axial planes // - for ( i = 0 ; i < numplanes ; i++ ) + for (i = 0; i < numplanes; i++) { - if ( DotProduct( trace.plane.normal, planes[i] ) > 0.99 ) + if (DotProduct(trace.plane.normal, planes[i]) > 0.99) { - VectorAdd( trace.plane.normal, ent->s.pos.trDelta, ent->s.pos.trDelta ); + VectorAdd(trace.plane.normal, ent->s.pos.trDelta, ent->s.pos.trDelta); break; } } - if ( i < numplanes ) + if (i < numplanes) { continue; } - VectorCopy( trace.plane.normal, planes[numplanes] ); + VectorCopy(trace.plane.normal, planes[numplanes]); numplanes++; // // modify velocity so it parallels all of the clip planes // - if ( &g_entities[trace.entityNum] != NULL && g_entities[trace.entityNum].client ) + if (&g_entities[trace.entityNum] != NULL && g_entities[trace.entityNum].client) {//hit a person, bounce off much less bounceAmt = OVERCLIP; } @@ -1286,92 +1274,92 @@ void G_RollMissile( gentity_t *ent ) } // find a plane that it enters - for ( i = 0 ; i < numplanes ; i++ ) + for (i = 0; i < numplanes; i++) { - into = DotProduct( ent->s.pos.trDelta, planes[i] ); - if ( into >= 0.1 ) + into = DotProduct(ent->s.pos.trDelta, planes[i]); + if (into >= 0.1) { continue; // move doesn't interact with the plane } // see how hard we are hitting things - if ( -into > pml.impactSpeed ) + if (-into > pml.impactSpeed) { pml.impactSpeed = -into; } // slide along the plane - G_ClipVelocity( ent->s.pos.trDelta, planes[i], clipVelocity, bounceAmt ); + G_ClipVelocity(ent->s.pos.trDelta, planes[i], clipVelocity, bounceAmt); // slide along the plane - G_ClipVelocity( endVelocity, planes[i], endClipVelocity, bounceAmt ); + G_ClipVelocity(endVelocity, planes[i], endClipVelocity, bounceAmt); // see if there is a second plane that the new move enters - for ( j = 0 ; j < numplanes ; j++ ) + for (j = 0; j < numplanes; j++) { - if ( j == i ) + if (j == i) { continue; } - if ( DotProduct( clipVelocity, planes[j] ) >= 0.1 ) + if (DotProduct(clipVelocity, planes[j]) >= 0.1) { continue; // move doesn't interact with the plane } // try clipping the move to the plane - G_ClipVelocity( clipVelocity, planes[j], clipVelocity, bounceAmt ); - G_ClipVelocity( endClipVelocity, planes[j], endClipVelocity, bounceAmt ); + G_ClipVelocity(clipVelocity, planes[j], clipVelocity, bounceAmt); + G_ClipVelocity(endClipVelocity, planes[j], endClipVelocity, bounceAmt); // see if it goes back into the first clip plane - if ( DotProduct( clipVelocity, planes[i] ) >= 0 ) + if (DotProduct(clipVelocity, planes[i]) >= 0) { continue; } // slide the original velocity along the crease - CrossProduct (planes[i], planes[j], dir); - VectorNormalize( dir ); - d = DotProduct( dir, ent->s.pos.trDelta ); - VectorScale( dir, d, clipVelocity ); + CrossProduct(planes[i], planes[j], dir); + VectorNormalize(dir); + d = DotProduct(dir, ent->s.pos.trDelta); + VectorScale(dir, d, clipVelocity); - CrossProduct (planes[i], planes[j], dir); - VectorNormalize( dir ); - d = DotProduct( dir, endVelocity ); - VectorScale( dir, d, endClipVelocity ); + CrossProduct(planes[i], planes[j], dir); + VectorNormalize(dir); + d = DotProduct(dir, endVelocity); + VectorScale(dir, d, endClipVelocity); // see if there is a third plane the the new move enters - for ( k = 0 ; k < numplanes ; k++ ) + for (k = 0; k < numplanes; k++) { - if ( k == i || k == j ) + if (k == i || k == j) { continue; } - if ( DotProduct( clipVelocity, planes[k] ) >= 0.1 ) + if (DotProduct(clipVelocity, planes[k]) >= 0.1) { continue; // move doesn't interact with the plane } // stop dead at a triple plane interaction - VectorClear( ent->s.pos.trDelta ); + VectorClear(ent->s.pos.trDelta); return;// qtrue; } } // if we have fixed all interactions, try another move - VectorCopy( clipVelocity, ent->s.pos.trDelta ); - VectorCopy( endClipVelocity, endVelocity ); + VectorCopy(clipVelocity, ent->s.pos.trDelta); + VectorCopy(endClipVelocity, endVelocity); break; } - VectorScale( endVelocity, 0.975f, endVelocity ); + VectorScale(endVelocity, 0.975f, endVelocity); } - VectorCopy( endVelocity, ent->s.pos.trDelta ); + VectorCopy(endVelocity, ent->s.pos.trDelta); // don't change velocity if in a timer (FIXME: is this correct?) /* if ( pm->ps->pm_time ) { - VectorCopy( primal_velocity, ent->s.pos.trDelta ); + VectorCopy( primal_velocity, ent->s.pos.trDelta ); } */ @@ -1383,50 +1371,50 @@ G_RunMissile ================ */ -void G_MoverTouchPushTriggers( gentity_t *ent, vec3_t oldOrg ); -void G_RunMissile( gentity_t *ent ) +void G_MoverTouchPushTriggers(gentity_t *ent, vec3_t oldOrg); +void G_RunMissile(gentity_t *ent) { vec3_t oldOrg; trace_t tr; - int trHitLoc=HL_NONE; + int trHitLoc = HL_NONE; - if ( (ent->s.eFlags&EF_HELD_BY_SAND_CREATURE) ) + if ((ent->s.eFlags&EF_HELD_BY_SAND_CREATURE)) {//in a sand creature's mouth - if ( ent->activator ) + if (ent->activator) { mdxaBone_t boltMatrix; // Getting the bolt here //in hand - vec3_t scAngles = {0}; + vec3_t scAngles = { 0 }; scAngles[YAW] = ent->activator->currentAngles[YAW]; - gi.G2API_GetBoltMatrix( ent->activator->ghoul2, ent->activator->playerModel, ent->activator->gutBolt, - &boltMatrix, scAngles, ent->activator->currentOrigin, (cg.time?cg.time:level.time), - NULL, ent->activator->s.modelScale ); + gi.G2API_GetBoltMatrix(ent->activator->ghoul2, ent->activator->playerModel, ent->activator->gutBolt, + &boltMatrix, scAngles, ent->activator->currentOrigin, (cg.time ? cg.time : level.time), + NULL, ent->activator->s.modelScale); // Storing ent position, bolt position, and bolt axis - gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, ent->currentOrigin ); - G_SetOrigin( ent, ent->currentOrigin ); + gi.G2API_GiveMeVectorFromMatrix(boltMatrix, ORIGIN, ent->currentOrigin); + G_SetOrigin(ent, ent->currentOrigin); } // check think function - G_RunThink( ent ); + G_RunThink(ent); return; } - VectorCopy( ent->currentOrigin, oldOrg ); + VectorCopy(ent->currentOrigin, oldOrg); // get current position - if ( ent->s.pos.trType == TR_INTERPOLATE ) + if (ent->s.pos.trType == TR_INTERPOLATE) {//rolling missile? //FIXME: WTF?!! Sticks to stick missiles? //FIXME: they stick inside the player - G_RollMissile( ent ); - if ( ent->s.eType != ET_GENERAL ) + G_RollMissile(ent); + if (ent->s.eType != ET_GENERAL) {//didn't explode - VectorCopy( ent->currentOrigin, ent->s.pos.trBase ); - gi.trace( &tr, oldOrg, ent->mins, ent->maxs, ent->currentOrigin, ent->s.number, ent->clipmask, G2_RETURNONHIT, 10 ); - if ( VectorCompare( ent->s.pos.trDelta, vec3_origin ) ) + VectorCopy(ent->currentOrigin, ent->s.pos.trBase); + gi.trace(&tr, oldOrg, ent->mins, ent->maxs, ent->currentOrigin, ent->s.number, ent->clipmask, G2_RETURNONHIT, 10); + if (VectorCompare(ent->s.pos.trDelta, vec3_origin)) { //VectorCopy( ent->currentAngles, ent->s.apos.trBase ); - VectorClear( ent->s.apos.trDelta ); + VectorClear(ent->s.apos.trDelta); } else { @@ -1434,19 +1422,19 @@ void G_RunMissile( gentity_t *ent ) float speed; ent->s.apos.trType = TR_INTERPOLATE; - VectorSet( ang, 0, ent->s.apos.trBase[1], 0 ); - AngleVectors( ang, fwdDir, rtDir, NULL ); - speed = VectorLength( ent->s.pos.trDelta )*4; + VectorSet(ang, 0, ent->s.apos.trBase[1], 0); + AngleVectors(ang, fwdDir, rtDir, NULL); + speed = VectorLength(ent->s.pos.trDelta) * 4; //HMM, this works along an axis-aligned dir, but not along diagonals //This is because when roll gets to 90, pitch becomes yaw, and vice-versa //Maybe need to just set the angles directly? - ent->s.apos.trDelta[0] = DotProduct( fwdDir, ent->s.pos.trDelta ); + ent->s.apos.trDelta[0] = DotProduct(fwdDir, ent->s.pos.trDelta); ent->s.apos.trDelta[1] = 0;//never spin! - ent->s.apos.trDelta[2] = DotProduct( rtDir, ent->s.pos.trDelta ); + ent->s.apos.trDelta[2] = DotProduct(rtDir, ent->s.pos.trDelta); - VectorNormalize( ent->s.apos.trDelta ); - VectorScale( ent->s.apos.trDelta, speed, ent->s.apos.trDelta ); + VectorNormalize(ent->s.apos.trDelta); + VectorScale(ent->s.apos.trDelta, speed, ent->s.apos.trDelta); ent->s.apos.trTime = level.previousTime; } @@ -1455,43 +1443,43 @@ void G_RunMissile( gentity_t *ent ) else { vec3_t origin; - EvaluateTrajectory( &ent->s.pos, level.time, origin ); + EvaluateTrajectory(&ent->s.pos, level.time, origin); // trace a line from the previous position to the current position, // ignoring interactions with the missile owner - gi.trace( &tr, ent->currentOrigin, ent->mins, ent->maxs, origin, - ent->owner ? ent->owner->s.number : ent->s.number, ent->clipmask, G2_COLLIDE, 10 ); + gi.trace(&tr, ent->currentOrigin, ent->mins, ent->maxs, origin, + ent->owner ? ent->owner->s.number : ent->s.number, ent->clipmask, G2_COLLIDE, 10); - if ( tr.entityNum != ENTITYNUM_NONE ) + if (tr.entityNum != ENTITYNUM_NONE) { gentity_t *other = &g_entities[tr.entityNum]; // check for hitting a lightsaber - if ( other->contents & CONTENTS_LIGHTSABER ) + if (other->contents & CONTENTS_LIGHTSABER) {//hit a lightsaber bbox - if ( other->owner - && other->owner->client - && !other->owner->client->ps.saberInFlight + if (other->owner + && other->owner->client + && !other->owner->client->ps.saberInFlight && ((Q_irand(0, (other->owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] * other->owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE])) == 0 && other->owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] != 0) - || !InFront( ent->currentOrigin, other->owner->currentOrigin, other->owner->client->ps.viewangles, SABER_REFLECT_MISSILE_CONE ) ) )//other->owner->s.number == 0 && + || !InFront(ent->currentOrigin, other->owner->currentOrigin, other->owner->client->ps.viewangles, SABER_REFLECT_MISSILE_CONE)))//other->owner->s.number == 0 && {//Jedi cannot block shots from behind! //re-trace from here, ignoring the lightsaber - gi.trace( &tr, tr.endpos, ent->mins, ent->maxs, origin, tr.entityNum, ent->clipmask, G2_RETURNONHIT, 10 ); + gi.trace(&tr, tr.endpos, ent->mins, ent->maxs, origin, tr.entityNum, ent->clipmask, G2_RETURNONHIT, 10); } } } - VectorCopy( tr.endpos, ent->currentOrigin ); + VectorCopy(tr.endpos, ent->currentOrigin); } // get current angles - VectorMA( ent->s.apos.trBase, (level.time - ent->s.apos.trTime) * 0.001, ent->s.apos.trDelta, ent->s.apos.trBase ); + VectorMA(ent->s.apos.trBase, (level.time - ent->s.apos.trTime) * 0.001, ent->s.apos.trDelta, ent->s.apos.trBase); //FIXME: Rolling things hitting G2 polys is weird /////////////////////////////////////////////////////// -//? if ( tr.fraction != 1 ) + //? if ( tr.fraction != 1 ) { - // did we hit or go near a Ghoul2 model? -// qboolean hitModel = qfalse; - for (int i=0; i < MAX_G2_COLLISIONS; i++) + // did we hit or go near a Ghoul2 model? + // qboolean hitModel = qfalse; + for (int i = 0; i < MAX_G2_COLLISIONS; i++) { if (tr.G2CollisionMap[i].mEntityNum == -1) { @@ -1505,99 +1493,99 @@ void G_RunMissile( gentity_t *ent ) // make sure we only do this once, not for all the entrance wounds we might generate if ((coll.mFlags & G2_FRONTFACE)/* && !(hitModel)*/ && hitEnt->health) { - if (trHitLoc==HL_NONE) + if (trHitLoc == HL_NONE) { - G_GetHitLocFromSurfName( &g_entities[coll.mEntityNum], gi.G2API_GetSurfaceName( &g_entities[coll.mEntityNum].ghoul2[coll.mModelIndex], coll.mSurfaceIndex ), &trHitLoc, coll.mCollisionPosition, NULL, NULL, ent->methodOfDeath ); + G_GetHitLocFromSurfName(&g_entities[coll.mEntityNum], gi.G2API_GetSurfaceName(&g_entities[coll.mEntityNum].ghoul2[coll.mModelIndex], coll.mSurfaceIndex), &trHitLoc, coll.mCollisionPosition, NULL, NULL, ent->methodOfDeath); } break; // NOTE: the way this whole section was working, it would only get inside of this IF once anyway, might as well break out now } } } -///////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////// - if ( tr.startsolid ) + if (tr.startsolid) { tr.fraction = 0; } - gi.linkentity( ent ); + gi.linkentity(ent); - if ( ent->s.pos.trType == TR_STATIONARY && (ent->s.eFlags&EF_MISSILE_STICK) ) + if (ent->s.pos.trType == TR_STATIONARY && (ent->s.eFlags&EF_MISSILE_STICK)) {//stuck missiles should check some special stuff - G_RunStuckMissile( ent ); + G_RunStuckMissile(ent); return; } // check think function - G_RunThink( ent ); + G_RunThink(ent); - if ( ent->s.eType != ET_MISSILE ) + if (ent->s.eType != ET_MISSILE) { return; // exploded } - if ( ent->mass ) + if (ent->mass) { - G_MoverTouchPushTriggers( ent, oldOrg ); + G_MoverTouchPushTriggers(ent, oldOrg); } /* if ( !(ent->s.eFlags & EF_TELEPORT_BIT) ) { - G_MoverTouchTeleportTriggers( ent, oldOrg ); - if ( ent->s.eFlags & EF_TELEPORT_BIT ) - {//was teleported - return; - } + G_MoverTouchTeleportTriggers( ent, oldOrg ); + if ( ent->s.eFlags & EF_TELEPORT_BIT ) + {//was teleported + return; + } } else { - ent->s.eFlags &= ~EF_TELEPORT_BIT; + ent->s.eFlags &= ~EF_TELEPORT_BIT; } */ - AddSightEvent( ent->owner, ent->currentOrigin, 512, AEL_DISCOVERED, 75 );//wakes them up when see a shot passes in front of them - if ( !Q_irand( 0, 10 ) ) + AddSightEvent(ent->owner, ent->currentOrigin, 512, AEL_DISCOVERED, 75);//wakes them up when see a shot passes in front of them + if (!Q_irand(0, 10)) {//not so often... - if ( ent->splashDamage && ent->splashRadius ) + if (ent->splashDamage && ent->splashRadius) {//I'm an exploder, let people around me know danger is coming - if ( ent->s.weapon == WP_TRIP_MINE ) + if (ent->s.weapon == WP_TRIP_MINE) {//??? } else { - if ( ent->s.weapon == WP_ROCKET_LAUNCHER && ent->e_ThinkFunc == thinkF_rocketThink ) + if (ent->s.weapon == WP_ROCKET_LAUNCHER && ent->e_ThinkFunc == thinkF_rocketThink) {//homing rocket- run like hell! - AddSightEvent( ent->owner, ent->currentOrigin, ent->splashRadius, AEL_DANGER_GREAT, 50 ); + AddSightEvent(ent->owner, ent->currentOrigin, ent->splashRadius, AEL_DANGER_GREAT, 50); } else { - AddSightEvent( ent->owner, ent->currentOrigin, ent->splashRadius, AEL_DANGER, 50 ); + AddSightEvent(ent->owner, ent->currentOrigin, ent->splashRadius, AEL_DANGER, 50); } - AddSoundEvent( ent->owner, ent->currentOrigin, ent->splashRadius, AEL_DANGER ); + AddSoundEvent(ent->owner, ent->currentOrigin, ent->splashRadius, AEL_DANGER); } } else {//makes them run from near misses - AddSightEvent( ent->owner, ent->currentOrigin, 48, AEL_DANGER, 50 ); + AddSightEvent(ent->owner, ent->currentOrigin, 48, AEL_DANGER, 50); } } - if ( tr.fraction == 1 ) + if (tr.fraction == 1) { - if ( ent->s.weapon == WP_THERMAL && ent->s.pos.trType == TR_INTERPOLATE ) + if (ent->s.weapon == WP_THERMAL && ent->s.pos.trType == TR_INTERPOLATE) {//a rolling thermal that didn't hit anything - G_MissileAddAlerts( ent ); + G_MissileAddAlerts(ent); } return; } // never explode or bounce on sky - if ( tr.surfaceFlags & SURF_NOIMPACT ) + if (tr.surfaceFlags & SURF_NOIMPACT) { - G_FreeEntity( ent ); + G_FreeEntity(ent); return; } - G_MissileImpact( ent, &tr, trHitLoc ); -} + G_MissileImpact(ent, &tr, trHitLoc); +} \ No newline at end of file diff --git a/code/game/weapons.h b/code/game/weapons.h index 24a76fae60..e9ae53bf62 100644 --- a/code/game/weapons.h +++ b/code/game/weapons.h @@ -83,6 +83,69 @@ typedef enum //# weapon_e WP_NUM_WEAPONS } weapon_t; +qboolean heavyWeap(int wp) +{ + switch (wp) { + case WP_FLECHETTE: + case WP_ROCKET_LAUNCHER: + case WP_CONCUSSION: + return true; + } + + return false; +} + +qboolean blasterWeap(int wp) +{ + switch (wp) { + case WP_BLASTER_PISTOL: + case WP_BLASTER: + case WP_REPEATER: + case WP_BOWCASTER: + case WP_NOGHRI_STICK: + case WP_BRYAR_PISTOL: + return true; + } + + return false; +} + +qboolean lightBlasterWeap(int wp) +{ + switch (wp) { + case WP_BLASTER_PISTOL: + case WP_BLASTER: + case WP_NOGHRI_STICK: + case WP_BRYAR_PISTOL: + return true; + } + + return false; +} + +qboolean heavyBlasterWeap(int wp) +{ + switch (wp) { + case WP_REPEATER: + case WP_BOWCASTER: + return true; + } + + return false; +} + +qboolean meleeWeap(int wp) +{ + switch (wp) { + case WP_SABER: + case WP_MELEE: + case WP_STUN_BATON: + return true; + } + + return false; +} + #define FIRST_WEAPON WP_SABER // this is the first weapon for next and prev weapon switching #define MAX_PLAYER_WEAPONS WP_STUN_BATON // this is the max you can switch to and get with the give all. - FIXME: it's actually this one *minus* one... why? From a202bdaf2cf8aecfbd847ae540d38977dea12ed6 Mon Sep 17 00:00:00 2001 From: dusty22 Date: Mon, 18 Jul 2016 16:42:54 -0400 Subject: [PATCH 262/445] moved function defs to fix compilation error --- code/game/NPC_stats.cpp | 5 ++++ code/game/g_weapon.cpp | 63 +++++++++++++++++++++++++++++++++++++++++ code/game/weapons.h | 63 ----------------------------------------- 3 files changed, 68 insertions(+), 63 deletions(-) diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index 06ff3f32db..58becbc5eb 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -1933,6 +1933,11 @@ void NPC_BuildRandom( gentity_t *NPC ) extern void G_MatchPlayerWeapon( gentity_t *ent ); extern void G_InitPlayerFromCvars( gentity_t *ent ); extern void G_SetG2PlayerModel( gentity_t * const ent, const char *modelName, const char *customSkin, const char *surfOff, const char *surfOn ); +extern qboolean blasterWeap(int wp); +extern qboolean lightBlasterWeap(int wp); +extern qboolean heavyBlasterWeap(int wp); +extern qboolean heavyWeap(int wp); + qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { const char *token; diff --git a/code/game/g_weapon.cpp b/code/game/g_weapon.cpp index 7fff9c4842..2f2792f06e 100644 --- a/code/game/g_weapon.cpp +++ b/code/game/g_weapon.cpp @@ -1702,3 +1702,66 @@ void SP_misc_weapon_shooter( gentity_t *self ) self->wait = 500; } } + +qboolean heavyWeap(int wp) +{ + switch (wp) { + case WP_FLECHETTE: + case WP_ROCKET_LAUNCHER: + case WP_CONCUSSION: + return true; + } + + return false; +} + +qboolean blasterWeap(int wp) +{ + switch (wp) { + case WP_BLASTER_PISTOL: + case WP_BLASTER: + case WP_REPEATER: + case WP_BOWCASTER: + case WP_NOGHRI_STICK: + case WP_BRYAR_PISTOL: + return true; + } + + return false; +} + +qboolean lightBlasterWeap(int wp) +{ + switch (wp) { + case WP_BLASTER_PISTOL: + case WP_BLASTER: + case WP_NOGHRI_STICK: + case WP_BRYAR_PISTOL: + return true; + } + + return false; +} + +qboolean heavyBlasterWeap(int wp) +{ + switch (wp) { + case WP_REPEATER: + case WP_BOWCASTER: + return true; + } + + return false; +} + +qboolean meleeWeap(int wp) +{ + switch (wp) { + case WP_SABER: + case WP_MELEE: + case WP_STUN_BATON: + return true; + } + + return false; +} diff --git a/code/game/weapons.h b/code/game/weapons.h index e9ae53bf62..24a76fae60 100644 --- a/code/game/weapons.h +++ b/code/game/weapons.h @@ -83,69 +83,6 @@ typedef enum //# weapon_e WP_NUM_WEAPONS } weapon_t; -qboolean heavyWeap(int wp) -{ - switch (wp) { - case WP_FLECHETTE: - case WP_ROCKET_LAUNCHER: - case WP_CONCUSSION: - return true; - } - - return false; -} - -qboolean blasterWeap(int wp) -{ - switch (wp) { - case WP_BLASTER_PISTOL: - case WP_BLASTER: - case WP_REPEATER: - case WP_BOWCASTER: - case WP_NOGHRI_STICK: - case WP_BRYAR_PISTOL: - return true; - } - - return false; -} - -qboolean lightBlasterWeap(int wp) -{ - switch (wp) { - case WP_BLASTER_PISTOL: - case WP_BLASTER: - case WP_NOGHRI_STICK: - case WP_BRYAR_PISTOL: - return true; - } - - return false; -} - -qboolean heavyBlasterWeap(int wp) -{ - switch (wp) { - case WP_REPEATER: - case WP_BOWCASTER: - return true; - } - - return false; -} - -qboolean meleeWeap(int wp) -{ - switch (wp) { - case WP_SABER: - case WP_MELEE: - case WP_STUN_BATON: - return true; - } - - return false; -} - #define FIRST_WEAPON WP_SABER // this is the first weapon for next and prev weapon switching #define MAX_PLAYER_WEAPONS WP_STUN_BATON // this is the max you can switch to and get with the give all. - FIXME: it's actually this one *minus* one... why? From 18d3330c057559e84416c6bae2a72641f4c855fc Mon Sep 17 00:00:00 2001 From: dusty22 Date: Tue, 19 Jul 2016 09:18:04 -0400 Subject: [PATCH 263/445] handicap_maxArmor, cg_lightningBlockEffect max armor sets the max shield power you can receive from a shield station lightningblockeffect controls what .efx file is used for the force lightning saber block visual effect --- code/cgame/cg_local.h | 1 + code/cgame/cg_main.cpp | 3 +++ code/game/g_client.cpp | 11 +++++------ code/game/g_local.h | 5 ++++- code/game/g_main.cpp | 26 ++++++++++++++++---------- code/game/g_misc.cpp | 4 ++-- code/game/wp_saber.cpp | 3 +-- 7 files changed, 32 insertions(+), 21 deletions(-) diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index 19b8f11dda..4f58852f8e 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -656,6 +656,7 @@ extern vmCvar_t cg_fovViewmodel; extern vmCvar_t cg_fovViewmodelAdjust; extern vmCvar_t cg_scaleVehicleSensitivity; +extern vmCvar_t cg_lightningBlockEffect; void CG_NewClientinfo( int clientNum ); // diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index d22df28c54..5eba47115e 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -339,6 +339,8 @@ vmCvar_t cg_fovViewmodelAdjust; vmCvar_t cg_scaleVehicleSensitivity; +vmCvar_t cg_lightningBlockEffect; + //new cvars - Dusty /* vmCvar_t cg_lightningBolts; @@ -468,6 +470,7 @@ static cvarTable_t cvarTable[] = { { &cg_fovViewmodelAdjust, "cg_fovViewmodelAdjust", "1", CVAR_ARCHIVE }, { &cg_scaleVehicleSensitivity, "cg_scaleVehicleSensitivity", "1", CVAR_ARCHIVE }, + { &cg_lightningBlockEffect, "cg_lightningBlockEffect", "force/lightning", CVAR_ARCHIVE }, }; static const size_t cvarTableSize = ARRAY_LEN( cvarTable ); diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index ce8e41ad7d..4b260d4d38 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -454,7 +454,7 @@ if desired. void ClientUserinfoChanged( int clientNum ) { gentity_t *ent = g_entities + clientNum; gclient_t *client = ent->client; - int health=100, maxHealth=100; + int health = 100; const char *s=NULL; char userinfo[MAX_INFO_STRING]={0}, buf[MAX_INFO_STRING]={0}, sound[MAX_STRING_CHARS]={0}, oldname[34]={0}; @@ -472,12 +472,11 @@ void ClientUserinfoChanged( int clientNum ) { ClientCleanName( s, client->pers.netname, sizeof( client->pers.netname ) ); // set max health - maxHealth = 200; - health = Com_Clampi( 1, 200, atoi( Info_ValueForKey( userinfo, "handicap" ) ) ); + int handicapLimit = 200; //the health AND armor limit for handicap cvar + int handicap = atoi(Info_ValueForKey(userinfo, "handicap")); + + health = Com_Clampi(1, handicapLimit, handicap); //forces handicap value limit client->pers.maxHealth = health; - if ( client->pers.maxHealth < 1 || client->pers.maxHealth > maxHealth ) - client->pers.maxHealth = 200; - client->ps.stats[STAT_MAX_HEALTH] = client->pers.maxHealth; // sounds Q_strncpyz( sound, Info_ValueForKey (userinfo, "snd"), sizeof( sound ) ); diff --git a/code/game/g_local.h b/code/game/g_local.h index 9dae1815bb..cf9131e431 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -265,10 +265,13 @@ extern cvar_t *g_subtitles; extern cvar_t *g_removeDoors; extern cvar_t *g_ICARUSDebug; extern cvar_t *g_npcdebug; + +extern cvar_t *g_allowBunnyhopping; + extern cvar_t *g_weaponVelocity; extern cvar_t *g_weaponAltVelocity; +extern cvar_t *g_handicap_maxArmor; -extern cvar_t *g_allowBunnyhopping; extern gentity_t *player; // // g_spawn.c diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 5f899a276a..a46230eae6 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -202,9 +202,20 @@ cvar_t *g_saber_color; cvar_t *g_saber2_color; cvar_t *g_saberDarkSideSaberColor; + +// kef -- used with DebugTraceForNPC +cvar_t *g_npcdebug; + +// mcg -- testing: make NPCs obey do not enter brushes better? +cvar_t *g_navSafetyChecks; + +cvar_t *g_broadsword; + +cvar_t *g_allowBunnyhopping; + //new cvars - Dusty cvar_t *g_autoRoll; -cvar_t *g_saberNewCombat; +cvar_t *g_saberNewCombat; cvar_t *g_saberLocksEnabled; cvar_t *g_saberDamageScale; cvar_t *g_saberDamageScaleGlobal; @@ -226,6 +237,8 @@ cvar_t *g_char_forceAffinity; //make into ui_cvars? cvar_t *g_char_forceFocus; cvar_t *g_char_forceSensitivity; +cvar_t *g_handicap_maxArmor; + /* cvar_t *g_char_moveSpeedScale; 1.0 - you move faster / slower when using this saber cvar_t *g_char_animSpeedScale; 1.0 - plays normal attack animations faster / slower @@ -265,15 +278,6 @@ jumpAtkLeftMove 0 - if set, player will execute this move when they jump + lef //NOTE: these "move" fields refer to saber moves that are defined in code. Set to LS_NONE to have the normal move removed, set to one of the following values to override the current move */ -// kef -- used with DebugTraceForNPC -cvar_t *g_npcdebug; - -// mcg -- testing: make NPCs obey do not enter brushes better? -cvar_t *g_navSafetyChecks; - -cvar_t *g_broadsword; - -cvar_t *g_allowBunnyhopping; qboolean stop_icarus = qfalse; @@ -773,6 +777,8 @@ void G_InitCvars( void ) { g_char_breakParryBonus = gi.cvar("g_char_breakParryBonus", "0", CVAR_CHEAT | CVAR_SAVEGAME); g_weaponVelocity = gi.cvar("g_weaponVelocity", "1.0", CVAR_ARCHIVE | CVAR_CHEAT); g_weaponAltVelocity = gi.cvar("g_weaponAltVelocity", "1.0", CVAR_ARCHIVE | CVAR_CHEAT); + + g_handicap_maxArmor = gi.cvar("handicap_maxArmor", "100", CVAR_ARCHIVE | CVAR_SAVEGAME | CVAR_NORESTART); } /* diff --git a/code/game/g_misc.cpp b/code/game/g_misc.cpp index 1a3935beca..bcb298c7ce 100644 --- a/code/game/g_misc.cpp +++ b/code/game/g_misc.cpp @@ -2034,7 +2034,7 @@ void shield_power_converter_use( gentity_t *self, gentity_t *other, gentity_t *a { self->setTime = level.time + 100; - dif = 100 - activator->client->ps.stats[STAT_ARMOR]; // FIXME: define for max armor? + dif = g_handicap_maxArmor->integer - activator->client->ps.stats[STAT_ARMOR]; if ( dif > 0 && self->count ) // Already at full armor?..and do I even have anything to give { @@ -2071,7 +2071,7 @@ void shield_power_converter_use( gentity_t *self, gentity_t *other, gentity_t *a self->s.frame = 1; } } - else if ( activator->client->ps.stats[STAT_ARMOR] >= 100 ) // FIXME: define for max + else if ( activator->client->ps.stats[STAT_ARMOR] >= g_handicap_maxArmor->integer ) // FIXME: define for max { // play full sound G_Sound( self, G_SoundIndex( "sound/interface/shieldcon_done.mp3" )); diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 9efaa1d2e4..d2c0bc7244 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -78,7 +78,6 @@ extern cvar_t *g_char_forceRegen; extern cvar_t *g_char_parryBonus; extern cvar_t *g_char_breakParryBonus; - extern qboolean WP_SaberBladeUseSecondBladeStyle(saberInfo_t *saber, int bladeNum); extern qboolean WP_SaberBladeDoTransitionDamage(saberInfo_t *saber, int bladeNum); extern qboolean Q3_TaskIDPending(gentity_t *ent, taskID_t taskType); @@ -13316,7 +13315,7 @@ void ForceLightningDamage(gentity_t *self, gentity_t *traceEnt, vec3_t dir, floa } VectorMA(traceEnt->client->ps.saber[saberNo].blade[bladeNo].muzzlePoint, traceEnt->client->ps.saber[saberNo].blade[bladeNo].length*Q_flrand(0, 1), traceEnt->client->ps.saber[saberNo].blade[bladeNo].muzzleDir, end); - G_PlayEffect(G_EffectIndex("force/lightning"), end, fwd); + G_PlayEffect(G_EffectIndex(cg_lightningBlockEffect.string), end, fwd); } else if (blockedWithHand) { From ebd58e79bd0f9dba16ca3993dce72ba5f9940d11 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Wed, 20 Jul 2016 19:57:06 +0300 Subject: [PATCH 264/445] Rename saved game affected classes --- code/cgame/cg_local.h | 2 +- code/cgame/cg_main.cpp | 10 +++--- code/cgame/cg_media.h | 2 +- code/cgame/cg_players.cpp | 40 ++++++++++++------------ code/cgame/cg_weapons.cpp | 6 ++-- code/game/AI_Animal.cpp | 2 +- code/game/AI_SandCreature.cpp | 2 +- code/game/AI_Stormtrooper.cpp | 10 +++--- code/game/AI_Utils.cpp | 30 +++++++++--------- code/game/NPC.cpp | 4 +-- code/game/NPC_senses.cpp | 10 +++--- code/game/NPC_spawn.cpp | 4 +-- code/game/NPC_stats.cpp | 18 +++++------ code/game/NPC_utils.cpp | 2 +- code/game/Q3_Interface.cpp | 4 +-- code/game/ai.h | 14 ++++++--- code/game/b_local.h | 2 +- code/game/b_public.h | 2 +- code/game/bg_pangles.cpp | 2 +- code/game/bg_panimate.cpp | 14 ++++----- code/game/bg_pmove.cpp | 4 +-- code/game/bg_public.h | 7 +++-- code/game/fields.h | 2 +- code/game/g_active.cpp | 12 ++++---- code/game/g_client.cpp | 20 ++++++------ code/game/g_cmds.cpp | 2 +- code/game/g_combat.cpp | 8 ++--- code/game/g_local.h | 26 +++++++++------- code/game/g_main.cpp | 2 +- code/game/g_misc_model.cpp | 2 +- code/game/g_navigator.cpp | 2 +- code/game/g_objectives.cpp | 8 ++--- code/game/g_public.h | 2 +- code/game/g_savegame.cpp | 52 ++++++++++++++++---------------- code/game/g_session.cpp | 8 ++--- code/game/g_shared.h | 27 +++++++++++------ code/game/g_target.cpp | 4 +-- code/game/g_weapon.cpp | 2 +- code/game/wp_saber.cpp | 6 ++-- code/ui/ui_main.cpp | 6 ++-- codeJK2/cgame/cg_local.h | 2 +- codeJK2/cgame/cg_main.cpp | 10 +++--- codeJK2/cgame/cg_media.h | 2 +- codeJK2/cgame/cg_players.cpp | 42 +++++++++++++------------- codeJK2/cgame/cg_weapons.cpp | 6 ++-- codeJK2/game/AI_Stormtrooper.cpp | 10 +++--- codeJK2/game/AI_Utils.cpp | 34 ++++++++++----------- codeJK2/game/NPC.cpp | 4 +-- codeJK2/game/NPC_senses.cpp | 8 ++--- codeJK2/game/NPC_spawn.cpp | 6 ++-- codeJK2/game/NPC_stats.cpp | 10 +++--- codeJK2/game/NPC_utils.cpp | 2 +- codeJK2/game/Q3_Interface.cpp | 4 +-- codeJK2/game/ai.h | 14 ++++++--- codeJK2/game/anims.h | 8 +++-- codeJK2/game/b_local.h | 2 +- codeJK2/game/b_public.h | 2 +- codeJK2/game/bg_panimate.cpp | 12 ++++---- codeJK2/game/bg_pmove.cpp | 4 +-- codeJK2/game/bg_public.h | 7 +++-- codeJK2/game/fields.h | 2 +- codeJK2/game/g_active.cpp | 12 ++++---- codeJK2/game/g_client.cpp | 22 +++++++------- codeJK2/game/g_cmds.cpp | 2 +- codeJK2/game/g_combat.cpp | 6 ++-- codeJK2/game/g_local.h | 22 ++++++++------ codeJK2/game/g_main.cpp | 2 +- codeJK2/game/g_misc_model.cpp | 2 +- codeJK2/game/g_objectives.cpp | 8 ++--- codeJK2/game/g_public.h | 2 +- codeJK2/game/g_savegame.cpp | 48 ++++++++++++++--------------- codeJK2/game/g_session.cpp | 8 ++--- codeJK2/game/g_shared.h | 27 +++++++++++------ codeJK2/game/g_svcmds.cpp | 4 +-- codeJK2/game/g_target.cpp | 2 +- codeJK2/game/wp_saber.cpp | 4 +-- 76 files changed, 392 insertions(+), 352 deletions(-) diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index 19b8f11dda..9ae6e36213 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -128,7 +128,7 @@ typedef struct { qboolean pitching; int animationNumber; - animation_t *animation; + ja_animation_t *animation; int animationTime; // time when the first frame of the animation will be exact } lerpFrame_t; diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 3c335baca1..d704b8a06b 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -33,7 +33,7 @@ along with this program; if not, see . //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char > namePrecache_m; extern namePrecache_m *as_preCacheMap; -extern void CG_RegisterNPCCustomSounds( clientInfo_t *ci ); +extern void CG_RegisterNPCCustomSounds( ja_clientInfo_t *ci ); extern qboolean G_AddSexToMunroString ( char *string, qboolean qDoBoth ); extern int G_ParseAnimFileSet( const char *skeletonName, const char *modelName=0); extern void CG_DrawDataPadInventorySelect( void ); @@ -852,7 +852,7 @@ CLIENT INFO CG_RegisterClientSkin ========================== */ -qboolean CG_RegisterClientSkin( clientInfo_t *ci, +qboolean CG_RegisterClientSkin( ja_clientInfo_t *ci, const char *headModelName, const char *headSkinName, const char *torsoModelName, const char *torsoSkinName, const char *legsModelName, const char *legsSkinName) @@ -902,7 +902,7 @@ qboolean CG_RegisterClientSkin( clientInfo_t *ci, CG_RegisterClientModelname ========================== */ -qboolean CG_RegisterClientModelname( clientInfo_t *ci, +qboolean CG_RegisterClientModelname( ja_clientInfo_t *ci, const char *headModelName, const char *headSkinName, const char *torsoModelName, const char *torsoSkinName, const char *legsModelName, const char *legsSkinName ) @@ -990,7 +990,7 @@ Ghoul2 Insert End } -void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri) +void CG_RegisterClientRenderInfo(ja_clientInfo_t *ci, renderInfo_t *ri) { char *slash; char headModelName[MAX_QPATH]; @@ -1190,7 +1190,7 @@ void CG_RegisterClientModels (int entityNum) if(entityNum < MAX_CLIENTS) { - memcpy(&cgs.clientinfo[entityNum], &ent->client->clientInfo, sizeof(clientInfo_t)); + memcpy(&cgs.clientinfo[entityNum], &ent->client->clientInfo, sizeof(ja_clientInfo_t)); } } diff --git a/code/cgame/cg_media.h b/code/cgame/cg_media.h index 6e045f3187..38651b3b3d 100644 --- a/code/cgame/cg_media.h +++ b/code/cgame/cg_media.h @@ -399,7 +399,7 @@ typedef struct { qhandle_t inlineDrawModel[MAX_SUBMODELS]; vec3_t inlineModelMidpoints[MAX_SUBMODELS]; - clientInfo_t clientinfo[MAX_CLIENTS]; + ja_clientInfo_t clientinfo[MAX_CLIENTS]; // media cgMedia_t media; diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index d0514748e9..bbbe47613b 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -123,7 +123,7 @@ void CG_AddGhoul2Mark(int type, float size, vec3_t hitloc, vec3_t hitdirection, gi.G2API_AddSkinGore(ghoul2,goreSkin); } -qboolean CG_RegisterClientModelname( clientInfo_t *ci, const char *headModelName, const char *headSkinName, +qboolean CG_RegisterClientModelname( ja_clientInfo_t *ci, const char *headModelName, const char *headSkinName, const char *torsoModelName, const char *torsoSkinName, const char *legsModelName, const char *legsSkinName ); @@ -319,7 +319,7 @@ static const char *GetCustomSound_VariantCapped(const char *ppsTable[], int iEnt extern cvar_t *g_sex; extern cvar_t *com_buildScript; -static void CG_RegisterCustomSounds(clientInfo_t *ci, int iSoundEntryBase, +static void CG_RegisterCustomSounds(ja_clientInfo_t *ci, int iSoundEntryBase, int iTableEntries, const char *ppsTable[], const char *psDir ) { @@ -375,7 +375,7 @@ CG_CustomSound */ static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int customSoundSet ) { - clientInfo_t *ci; + ja_clientInfo_t *ci; int i; if ( soundName[0] != '*' ) @@ -517,7 +517,7 @@ CG_NewClientinfo */ void CG_NewClientinfo( int clientNum ) { - clientInfo_t *ci; + ja_clientInfo_t *ci; const char *configstring; const char *v; // const char *s; @@ -591,7 +591,7 @@ void CG_NewClientinfo( int clientNum ) /* CG_RegisterNPCCustomSounds */ -void CG_RegisterNPCCustomSounds( clientInfo_t *ci ) +void CG_RegisterNPCCustomSounds( ja_clientInfo_t *ci ) { // const char *s; // int i; @@ -710,9 +710,9 @@ void CG_ClearAnimEvtCache( void ) CG_SetLerpFrameAnimation =============== */ -static void CG_SetLerpFrameAnimation( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation ) +static void CG_SetLerpFrameAnimation( ja_clientInfo_t *ci, lerpFrame_t *lf, int newAnimation ) { - animation_t *anim; + ja_animation_t *anim; if ( newAnimation < 0 || newAnimation >= MAX_ANIMATIONS ) { @@ -748,9 +748,9 @@ Sets cg.snap, cg.oldFrame, and cg.backlerp cg.time should be between oldFrameTime and frameTime after exit =============== */ -static qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, float fpsMod, int entNum ) { +static qboolean CG_RunLerpFrame( ja_clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, float fpsMod, int entNum ) { int f, animFrameTime; - animation_t *anim; + ja_animation_t *anim; qboolean newFrame = qfalse; if(fpsMod > 2 || fpsMod < 0.5) @@ -877,7 +877,7 @@ static qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnima CG_ClearLerpFrame =============== */ -static void CG_ClearLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int animationNumber ) +static void CG_ClearLerpFrame( ja_clientInfo_t *ci, lerpFrame_t *lf, int animationNumber ) { lf->frameTime = lf->oldFrameTime = cg.time; CG_SetLerpFrameAnimation( ci, lf, animationNumber ); @@ -898,7 +898,7 @@ CG_PlayerAnimation */ static void CG_PlayerAnimation( centity_t *cent, int *legsOld, int *legs, float *legsBackLerp, int *torsoOld, int *torso, float *torsoBackLerp ) { - clientInfo_t *ci; + ja_clientInfo_t *ci; int legsAnim; int legsTurnAnim = -1; qboolean newLegsFrame = qfalse; @@ -1209,7 +1209,7 @@ static void CG_PlayerAnimEvents( int animFileIndex, qboolean torso, int oldFrame else {//still in same anim, check for looping anim inSameAnim = qtrue; - animation_t *animation = &level.knownAnimFileSets[animFileIndex].animations[anim]; + ja_animation_t *animation = &level.knownAnimFileSets[animFileIndex].animations[anim]; animBackward = (animation->frameLerp<0); if ( animation->loopFrames != -1 ) {//a looping anim! @@ -1649,7 +1649,7 @@ Added 11/06/02 by Aurelio Reis. extern vmCvar_t cg_drawBreath; static void CG_BreathPuffs( centity_t *cent, vec3_t angles, vec3_t origin ) { - gclient_s *client = cent->gent->client; + ja_gclient_t *client = cent->gent->client; /* cg_drawBreath.integer == 0 - Don't draw at all. == 1 - Draw both (but bubbles only when under water). @@ -2686,7 +2686,7 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) int turnAnim = PM_TurnAnimForLegsAnim( cent->gent, cent->gent->client->ps.legsAnim ); if ( turnAnim != -1 && cent->gent->health > 0 ) { - animation_t *animations = level.knownAnimFileSets[cent->gent->client->clientInfo.animFileIndex].animations; + ja_animation_t *animations = level.knownAnimFileSets[cent->gent->client->clientInfo.animFileIndex].animations; if ( !animatingHips || ( animations[turnAnim].firstFrame != startFrame ) )// only set the anim if we aren't going to do the same animation again { @@ -3915,7 +3915,7 @@ static void CG_PlayerSplash( centity_t *cent ) if ( cent->gent && cent->gent->client ) { - gclient_t *cl = cent->gent->client; + ja_gclient_t *cl = cent->gent->client; if ( cent->gent->disconnectDebounceTime < cg.time ) // can't do these expanding ripples all the time { @@ -5093,7 +5093,7 @@ static void CG_G2SetHeadAnim( centity_t *cent, int anim ) { gentity_t *gent = cent->gent; const int blendTime = 50; - const animation_t *animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; + const ja_animation_t *animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; int animFlags = BONE_ANIM_OVERRIDE ;//| BONE_ANIM_BLEND; // animSpeed is 1.0 if the frameLerp (ms/frame) is 50 (20 fps). // float timeScaleMod = (cg_timescale.value&&gent&&gent->s.clientNum==0&&!player_locked&&!MatrixMode&&gent->client->ps.forcePowersActive&(1< 0.0f @@ -5932,7 +5932,7 @@ extern void FX_AddPrimitive( CEffect **effect, int killTime ); //------------------------------------------------------- void CG_CheckSaberInWater( centity_t *cent, centity_t *scent, int saberNum, int modelIndex, vec3_t origin, vec3_t angles ) { - gclient_s *client = cent->gent->client; + ja_gclient_t *client = cent->gent->client; if ( !client ) { return; @@ -5981,7 +5981,7 @@ static void CG_AddSaberBladeGo( centity_t *cent, centity_t *scent, refEntity_t * mdxaBone_t boltMatrix; qboolean tagHack = qfalse; - gclient_s *client = cent->gent->client; + ja_gclient_t *client = cent->gent->client; if ( !client ) { @@ -6812,7 +6812,7 @@ extern qboolean G_RagDoll(gentity_t *ent, vec3_t forcedAngles); int cg_saberOnSoundTime[MAX_GENTITIES] = {0}; void CG_Player( centity_t *cent ) { - clientInfo_t *ci; + ja_clientInfo_t *ci; qboolean shadow, staticScale = qfalse; float shadowPlane; const weaponData_t *wData = NULL; diff --git a/code/cgame/cg_weapons.cpp b/code/cgame/cg_weapons.cpp index 020412c72d..5f7959bffe 100644 --- a/code/cgame/cg_weapons.cpp +++ b/code/cgame/cg_weapons.cpp @@ -747,14 +747,14 @@ the weapon hand animation has 3 anims, ================= */ extern qboolean ValidAnimFileIndex ( int index ); -int CG_MapTorsoToWeaponFrame( const clientInfo_t *ci, int frame, int animNum, int weaponNum, int firing ) +int CG_MapTorsoToWeaponFrame( const ja_clientInfo_t *ci, int frame, int animNum, int weaponNum, int firing ) { // we should use the animNum to map a weapon frame instead of relying on the torso frame if ( !ValidAnimFileIndex( ci->animFileIndex ) ) { return 0; } - animation_t *animations = level.knownAnimFileSets[ci->animFileIndex].animations; + ja_animation_t *animations = level.knownAnimFileSets[ci->animFileIndex].animations; int ret=0; switch( animNum ) @@ -1144,7 +1144,7 @@ void CG_AddViewWeapon( playerState_t *ps ) #endif { // get clientinfo for animation map - const clientInfo_t *ci = ¢->gent->client->clientInfo; + const ja_clientInfo_t *ci = ¢->gent->client->clientInfo; int torsoAnim = cent->gent->client->ps.torsoAnim;//pe.torso.animationNumber; float currentFrame; int startFrame,endFrame,flags; diff --git a/code/game/AI_Animal.cpp b/code/game/AI_Animal.cpp index 4626ff4d1f..08ea31cbe8 100644 --- a/code/game/AI_Animal.cpp +++ b/code/game/AI_Animal.cpp @@ -183,7 +183,7 @@ void NPC_BSAnimal_Default( void ) int alertEvent = NPC_CheckAlertEvents(qtrue, qtrue, -1, qfalse, AEL_MINOR, qfalse); if ( alertEvent >= 0 ) { - alertEvent_t *event = &level.alertEvents[alertEvent]; + ja_alertEvent_t *event = &level.alertEvents[alertEvent]; if (event->owner!=NPC && Distance(event->position, CurrentLocation.v)radius) { ThreatLocation = event->position; diff --git a/code/game/AI_SandCreature.cpp b/code/game/AI_SandCreature.cpp index 49e7b8f53a..2ec8a60bf0 100644 --- a/code/game/AI_SandCreature.cpp +++ b/code/game/AI_SandCreature.cpp @@ -462,7 +462,7 @@ void SandCreature_CheckMovingEnts( void ) void SandCreature_SeekAlert( int alertEvent ) { - alertEvent_t *alert = &level.alertEvents[alertEvent]; + ja_alertEvent_t *alert = &level.alertEvents[alertEvent]; //FIXME: check for higher alert status or closer than last location? NPCInfo->enemyLastSeenTime = level.time; diff --git a/code/game/AI_Stormtrooper.cpp b/code/game/AI_Stormtrooper.cpp index dfcdf9ff38..b7f78a1762 100644 --- a/code/game/AI_Stormtrooper.cpp +++ b/code/game/AI_Stormtrooper.cpp @@ -29,10 +29,10 @@ along with this program; if not, see . extern void CG_DrawAlert( vec3_t origin, float rating ); extern void G_AddVoiceEvent( gentity_t *self, int event, int speakDebounceTime ); -extern void AI_GroupUpdateSquadstates( AIGroupInfo_t *group, gentity_t *member, int newSquadState ); -extern qboolean AI_GroupContainsEntNum( AIGroupInfo_t *group, int entNum ); -extern void AI_GroupUpdateEnemyLastSeen( AIGroupInfo_t *group, vec3_t spot ); -extern void AI_GroupUpdateClearShotTime( AIGroupInfo_t *group ); +extern void AI_GroupUpdateSquadstates( ja_AIGroupInfo_t *group, gentity_t *member, int newSquadState ); +extern qboolean AI_GroupContainsEntNum( ja_AIGroupInfo_t *group, int entNum ); +extern void AI_GroupUpdateEnemyLastSeen( ja_AIGroupInfo_t *group, vec3_t spot ); +extern void AI_GroupUpdateClearShotTime( ja_AIGroupInfo_t *group ); extern void NPC_TempLookTarget( gentity_t *self, int lookEntNum, int minLookTime, int maxLookTime ); extern qboolean G_ExpandPointToBBox( vec3_t point, const vec3_t mins, const vec3_t maxs, int ignore, int clipmask ); extern void ChangeWeapon( gentity_t *ent, int newWeapon ); @@ -1854,7 +1854,7 @@ void ST_Commander( void ) { int i;//, j; int cp, cpFlags; - AIGroupInfo_t *group = NPCInfo->group; + ja_AIGroupInfo_t *group = NPCInfo->group; gentity_t *member;//, *buddy; qboolean enemyLost = qfalse; float avoidDist; diff --git a/code/game/AI_Utils.cpp b/code/game/AI_Utils.cpp index 5199a61c3b..6f13ea942c 100644 --- a/code/game/AI_Utils.cpp +++ b/code/game/AI_Utils.cpp @@ -33,7 +33,7 @@ along with this program; if not, see . #define DEFAULT_RADIUS 45 extern cvar_t *d_noGroupAI; -qboolean AI_ValidateGroupMember( AIGroupInfo_t *group, gentity_t *member ); +qboolean AI_ValidateGroupMember( ja_AIGroupInfo_t *group, gentity_t *member ); /* ------------------------- @@ -92,7 +92,7 @@ int AI_GetGroupSize( gentity_t *ent, int radius ) return AI_GetGroupSize( ent->currentOrigin, radius, ent->client->playerTeam, ent ); } -void AI_SetClosestBuddy( AIGroupInfo_t *group ) +void AI_SetClosestBuddy( ja_AIGroupInfo_t *group ) { int i, j; int dist, bestDist; @@ -114,9 +114,9 @@ void AI_SetClosestBuddy( AIGroupInfo_t *group ) } } -void AI_SortGroupByPathCostToEnemy( AIGroupInfo_t *group ) +void AI_SortGroupByPathCostToEnemy( ja_AIGroupInfo_t *group ) { - AIGroupMember_t bestMembers[MAX_GROUP_MEMBERS]; + ja_AIGroupMember_t bestMembers[MAX_GROUP_MEMBERS]; int i, j, k; qboolean sort = qfalse; @@ -212,7 +212,7 @@ qboolean AI_FindSelfInPreviousGroup( gentity_t *self ) return qfalse; } -void AI_InsertGroupMember( AIGroupInfo_t *group, gentity_t *member ) +void AI_InsertGroupMember( ja_AIGroupInfo_t *group, gentity_t *member ) { int i; //okay, you know what? Check this damn group and make sure we're not already in here! @@ -287,7 +287,7 @@ qboolean AI_GetNextEmptyGroup( gentity_t *self ) } } -qboolean AI_ValidateNoEnemyGroupMember( AIGroupInfo_t *group, gentity_t *member ) +qboolean AI_ValidateNoEnemyGroupMember( ja_AIGroupInfo_t *group, gentity_t *member ) { if ( !group ) { @@ -318,7 +318,7 @@ qboolean AI_ValidateNoEnemyGroupMember( AIGroupInfo_t *group, gentity_t *member return qtrue; } -qboolean AI_ValidateGroupMember( AIGroupInfo_t *group, gentity_t *member ) +qboolean AI_ValidateGroupMember( ja_AIGroupInfo_t *group, gentity_t *member ) { //Validate ents if ( member == NULL ) @@ -468,7 +468,7 @@ void AI_GetGroup( gentity_t *self ) } //create a new one - memset( self->NPC->group, 0, sizeof( AIGroupInfo_t ) ); + memset( self->NPC->group, 0, sizeof( ja_AIGroupInfo_t ) ); self->NPC->group->enemy = self->enemy; self->NPC->group->team = self->client->playerTeam; @@ -534,7 +534,7 @@ void AI_GetGroup( gentity_t *self ) AI_SetClosestBuddy( self->NPC->group ); } -void AI_SetNewGroupCommander( AIGroupInfo_t *group ) +void AI_SetNewGroupCommander( ja_AIGroupInfo_t *group ) { gentity_t *member = NULL; group->commander = NULL; @@ -549,7 +549,7 @@ void AI_SetNewGroupCommander( AIGroupInfo_t *group ) } } -void AI_DeleteGroupMember( AIGroupInfo_t *group, int memberNum ) +void AI_DeleteGroupMember( ja_AIGroupInfo_t *group, int memberNum ) { if ( group->commander && group->commander->s.number == group->member[memberNum].number ) { @@ -673,7 +673,7 @@ void AI_GroupMemberKilled( gentity_t *self ) }*/ } -void AI_GroupUpdateEnemyLastSeen( AIGroupInfo_t *group, vec3_t spot ) +void AI_GroupUpdateEnemyLastSeen( ja_AIGroupInfo_t *group, vec3_t spot ) { if ( !group ) { @@ -683,7 +683,7 @@ void AI_GroupUpdateEnemyLastSeen( AIGroupInfo_t *group, vec3_t spot ) VectorCopy( spot, group->enemyLastSeenPos ); } -void AI_GroupUpdateClearShotTime( AIGroupInfo_t *group ) +void AI_GroupUpdateClearShotTime( ja_AIGroupInfo_t *group ) { if ( !group ) { @@ -692,7 +692,7 @@ void AI_GroupUpdateClearShotTime( AIGroupInfo_t *group ) group->lastClearShotTime = level.time; } -void AI_GroupUpdateSquadstates( AIGroupInfo_t *group, gentity_t *member, int newSquadState ) +void AI_GroupUpdateSquadstates( ja_AIGroupInfo_t *group, gentity_t *member, int newSquadState ) { if ( !group ) { @@ -712,7 +712,7 @@ void AI_GroupUpdateSquadstates( AIGroupInfo_t *group, gentity_t *member, int new } } -qboolean AI_RefreshGroup( AIGroupInfo_t *group ) +qboolean AI_RefreshGroup( ja_AIGroupInfo_t *group ) { gentity_t *member; int i;//, j; @@ -953,7 +953,7 @@ void AI_UpdateGroups( void ) } } -qboolean AI_GroupContainsEntNum( AIGroupInfo_t *group, int entNum ) +qboolean AI_GroupContainsEntNum( ja_AIGroupInfo_t *group, int entNum ) { if ( !group ) { diff --git a/code/game/NPC.cpp b/code/game/NPC.cpp index 328d9a2dbe..885eeb46ba 100644 --- a/code/game/NPC.cpp +++ b/code/game/NPC.cpp @@ -77,7 +77,7 @@ extern qboolean stop_icarus; gentity_t *NPC; gNPC_t *NPCInfo; -gclient_t *client; +ja_gclient_t *client; usercmd_t ucmd; visibility_t enemyVisibility; @@ -915,7 +915,7 @@ void SetNPCGlobals( gentity_t *ent ) gentity_t *_saved_NPC; gNPC_t *_saved_NPCInfo; -gclient_t *_saved_client; +ja_gclient_t *_saved_client; usercmd_t _saved_ucmd; void SaveNPCGlobals() diff --git a/code/game/NPC_senses.cpp b/code/game/NPC_senses.cpp index 2e3fc0baa5..ae50b42c6a 100644 --- a/code/game/NPC_senses.cpp +++ b/code/game/NPC_senses.cpp @@ -590,7 +590,7 @@ qboolean G_RememberAlertEvent( gentity_t *self, int alertIndex ) // Get The Event Struct //---------------------- - alertEvent_t& at = level.alertEvents[alertIndex]; + ja_alertEvent_t& at = level.alertEvents[alertIndex]; if ( at.ID == self->NPC->lastAlertID ) {//already know this one @@ -865,12 +865,12 @@ void ClearPlayerAlertEvents( void ) {//still have more in the array if ( (i+1) < MAX_ALERT_EVENTS ) { - memmove( &level.alertEvents[i], &level.alertEvents[i+1], sizeof(alertEvent_t)*(MAX_ALERT_EVENTS-(i+1) ) ); + memmove( &level.alertEvents[i], &level.alertEvents[i+1], sizeof(ja_alertEvent_t)*(MAX_ALERT_EVENTS-(i+1) ) ); } } else {//just clear this one... or should we clear the whole array? - memset( &level.alertEvents[i], 0, sizeof( alertEvent_t ) ); + memset( &level.alertEvents[i], 0, sizeof( ja_alertEvent_t ) ); } } } @@ -905,12 +905,12 @@ qboolean RemoveOldestAlert( void ) {//still have more in the array if ( (oldestEvent+1) < MAX_ALERT_EVENTS ) { - memmove( &level.alertEvents[oldestEvent], &level.alertEvents[oldestEvent+1], sizeof(alertEvent_t)*(MAX_ALERT_EVENTS-(oldestEvent+1) ) ); + memmove( &level.alertEvents[oldestEvent], &level.alertEvents[oldestEvent+1], sizeof(ja_alertEvent_t)*(MAX_ALERT_EVENTS-(oldestEvent+1) ) ); } } else {//just clear this one... or should we clear the whole array? - memset( &level.alertEvents[oldestEvent], 0, sizeof( alertEvent_t ) ); + memset( &level.alertEvents[oldestEvent], 0, sizeof( ja_alertEvent_t ) ); } } //make sure this never drops below zero... if it does, something very very bad happened diff --git a/code/game/NPC_spawn.cpp b/code/game/NPC_spawn.cpp index 9dd0ce7930..02719e14d4 100644 --- a/code/game/NPC_spawn.cpp +++ b/code/game/NPC_spawn.cpp @@ -985,7 +985,7 @@ extern qboolean stop_icarus; void NPC_Begin (gentity_t *ent) { vec3_t spawn_origin, spawn_angles; - gclient_t *client; + ja_gclient_t *client; usercmd_t ucmd; gentity_t *spawnPoint = NULL; @@ -1503,7 +1503,7 @@ gentity_t *NPC_Spawn_Do( gentity_t *ent, qboolean fullSpawnNow ) return NULL; } - newent->client = (gclient_s *)gi.Malloc(sizeof(gclient_s), TAG_G_ALLOC, qtrue); + newent->client = (ja_gclient_t *)gi.Malloc(sizeof(ja_gclient_t), TAG_G_ALLOC, qtrue); newent->svFlags |= SVF_NPC; diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index 19611d82ce..caf851f0ec 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -356,9 +356,9 @@ static int MoveTypeNameToEnum( const char *name ) return MT_STATIC; } -extern void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri); +extern void CG_RegisterClientRenderInfo(ja_clientInfo_t *ci, renderInfo_t *ri); extern void CG_RegisterClientModels (int entityNum); -extern void CG_RegisterNPCCustomSounds( clientInfo_t *ci ); +extern void CG_RegisterNPCCustomSounds( ja_clientInfo_t *ci ); //#define CONVENIENT_ANIMATION_FILE_DEBUG_THING @@ -413,7 +413,7 @@ int CG_CheckAnimFrameForEventType( animevent_t *animEvents, int keyFrame, animEv ParseAnimationEvtBlock ====================== */ -static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, const char* aeb_filename, animevent_t *animEvents, animation_t *animations, unsigned char &lastAnimEvent, const char **text_p, bool bIsFrameSkipped) +static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, const char* aeb_filename, animevent_t *animEvents, ja_animation_t *animations, unsigned char &lastAnimEvent, const char **text_p, bool bIsFrameSkipped) { const char *token; int num, n, animNum, keyFrame, lowestVal, highestVal, curAnimEvent = 0; @@ -829,10 +829,10 @@ void G_ParseAnimationEvtFile(int glaIndex, const char* eventsDirectory, int file // Get The Pointers To The Anim Event Arrays //------------------------------------------- - animFileSet_t& afileset = level.knownAnimFileSets[fileIndex]; + ja_animFileSet_t& afileset = level.knownAnimFileSets[fileIndex]; animevent_t *legsAnimEvents = afileset.legsAnimEvents; animevent_t *torsoAnimEvents = afileset.torsoAnimEvents; - animation_t *animations = afileset.animations; + ja_animation_t *animations = afileset.animations; if (modelSpecific) @@ -884,7 +884,7 @@ qboolean G_ParseAnimationFile(int glaIndex, const char *skeletonName, int fileIn float fps = 0; const char* text_p = text; int animNum = 0; - animation_t* animations = level.knownAnimFileSets[fileIndex].animations; + ja_animation_t* animations = level.knownAnimFileSets[fileIndex].animations; char skeletonPath[MAX_QPATH]; @@ -1071,7 +1071,7 @@ int G_ParseAnimFileSet(const char *skeletonName, const char *modelName=0) level.knownAnimFileSets[fileIndex].torsoAnimEventCount = 0; level.knownAnimFileSets[fileIndex].legsAnimEventCount = 0; - animation_t* animations = level.knownAnimFileSets[fileIndex].animations; + ja_animation_t* animations = level.knownAnimFileSets[fileIndex].animations; animevent_t* legsAnimEvents = level.knownAnimFileSets[fileIndex].legsAnimEvents; animevent_t* torsoAnimEvents = level.knownAnimFileSets[fileIndex].torsoAnimEvents; @@ -1577,7 +1577,7 @@ Precaches NPC skins, tgas and md3s. */ void CG_NPC_Precache ( gentity_t *spawner ) { - clientInfo_t ci={}; + ja_clientInfo_t ci={}; renderInfo_t ri={}; team_t playerTeam = TEAM_FREE; const char *token; @@ -1941,7 +1941,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) char sound[MAX_QPATH]; char playerModel[MAX_QPATH]; char customSkin[MAX_QPATH]; - clientInfo_t *ci = &NPC->client->clientInfo; + ja_clientInfo_t *ci = &NPC->client->clientInfo; renderInfo_t *ri = &NPC->client->renderInfo; gNPCstats_t *stats = NULL; qboolean md3Model = qtrue; diff --git a/code/game/NPC_utils.cpp b/code/game/NPC_utils.cpp index d92cdd167d..c6cd5c90bd 100644 --- a/code/game/NPC_utils.cpp +++ b/code/game/NPC_utils.cpp @@ -1180,7 +1180,7 @@ gentity_t *NPC_PickEnemyExt( qboolean checkAlerts = qfalse ) //There is an event to look at if ( alertEvent >= 0 ) { - alertEvent_t *event = &level.alertEvents[alertEvent]; + ja_alertEvent_t *event = &level.alertEvents[alertEvent]; //Don't pay attention to our own alerts if ( event->owner == NPC ) diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 29d659e8cf..7f3c1a65f8 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -751,7 +751,7 @@ extern qboolean G_CheckPlayerDarkSide( void ); static void Q3_SetObjective(const char *ObjEnum, int status) { int objectiveID; - gclient_t *client; + ja_gclient_t *client; objectives_t *objective; int *objectivesShown; @@ -7453,7 +7453,7 @@ CQuake3GameInterface::CQuake3GameInterface() : IGameInterface() player_locked = qfalse; - gclient_t* client = &level.clients[0]; + ja_gclient_t* client = &level.clients[0]; memset(&client->sess, 0, sizeof(client->sess)); } diff --git a/code/game/ai.h b/code/game/ai.h index 5046f17383..a3222580c5 100644 --- a/code/game/ai.h +++ b/code/game/ai.h @@ -115,8 +115,10 @@ void NPC_BSAnimal_Default( void ); //Group AI #define MAX_FRAME_GROUPS 32 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct AIGroupMember_s +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class ja_AIGroupMember_t { +public: int number; int waypoint; int pathCostToEnemy; @@ -140,12 +142,14 @@ typedef struct AIGroupMember_s saved_game->read(pathCostToEnemy); saved_game->read(closestBuddy); } -} AIGroupMember_t; +}; // ja_AIGroupMember_t #define MAX_GROUP_MEMBERS 32 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct AIGroupInfo_s +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class ja_AIGroupInfo_t { +public: int numGroup; qboolean processed; team_t team; @@ -162,7 +166,7 @@ typedef struct AIGroupInfo_s gentity_t *commander; vec3_t enemyLastSeenPos; int numState[ NUM_SQUAD_STATES ]; - AIGroupMember_t member[ MAX_GROUP_MEMBERS ]; + ja_AIGroupMember_t member[ MAX_GROUP_MEMBERS ]; void sg_export( @@ -208,7 +212,7 @@ typedef struct AIGroupInfo_s saved_game->read(numState); saved_game->read<>(member); } -} AIGroupInfo_t; +}; // ja_AIGroupInfo_t int AI_GetGroupSize( vec3_t origin, int radius, team_t playerTeam, gentity_t *avoid = NULL ); diff --git a/code/game/b_local.h b/code/game/b_local.h index 8093b64b0c..0814fc8bf2 100644 --- a/code/game/b_local.h +++ b/code/game/b_local.h @@ -81,7 +81,7 @@ extern void Debug_NPCPrintf( gentity_t *printNPC, cvar_t *cv, int debugLevel, ch //NPC_ai variables - shared by NPC.cpp andf the following modules extern gentity_t *NPC; extern gNPC_t *NPCInfo; -extern gclient_t *client; +extern ja_gclient_t *client; extern usercmd_t ucmd; extern visibility_t enemyVisibility; diff --git a/code/game/b_public.h b/code/game/b_public.h index 3b3d52e46a..a547fab767 100644 --- a/code/game/b_public.h +++ b/code/game/b_public.h @@ -292,7 +292,7 @@ typedef struct int leaderAvoidSide; int lastAvoidSteerSide; int lastAvoidSteerSideDebouncer; - AIGroupInfo_t *group; + ja_AIGroupInfo_t *group; int troop; vec3_t lastPathAngles; //So we know which way to face generally when we stop diff --git a/code/game/bg_pangles.cpp b/code/game/bg_pangles.cpp index 052dc31cf0..ca94bf30b1 100644 --- a/code/game/bg_pangles.cpp +++ b/code/game/bg_pangles.cpp @@ -67,7 +67,7 @@ void BG_IK_MoveLimb( CGhoul2Info_v &ghoul2, int boltIndex, char *animBone, char vec3_t holdPoint; vec3_t torg; float distToDest; - animation_t *anim = &level.knownAnimFileSets[animFileIndex].animations[basePose]; + ja_animation_t *anim = &level.knownAnimFileSets[animFileIndex].animations[basePose]; assert( ghoul2.size() ); diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index 48b23f04f6..70d8621bc7 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -4180,7 +4180,7 @@ int PM_LegsAnimForFrame( gentity_t *ent, int legsFrame ) if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) return -1; - animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + ja_animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; int glaIndex = gi.G2API_GetAnimIndex(&(ent->ghoul2[0])); for ( int animation = 0; animation < BOTH_CIN_1; animation++ ) //first anim after last legs @@ -4215,7 +4215,7 @@ int PM_LegsAnimForFrame( gentity_t *ent, int legsFrame ) int PM_ValidateAnimRange( const int startFrame, const int endFrame, const float animSpeed ) {//given a startframe and endframe, see if that lines up with any known animation - animation_t *animations = level.knownAnimFileSets[0].animations; + ja_animation_t *animations = level.knownAnimFileSets[0].animations; for ( int anim = 0; anim < MAX_ANIMATIONS; anim++ ) { @@ -4264,7 +4264,7 @@ int PM_TorsoAnimForFrame( gentity_t *ent, int torsoFrame ) if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) return -1; - animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + ja_animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; int glaIndex = gi.G2API_GetAnimIndex(&(ent->ghoul2[0])); for ( int animation = 0; animation < LEGS_TURN1; animation++ ) //first legs only anim @@ -4306,7 +4306,7 @@ qboolean PM_FinishedCurrentLegsAnim( gentity_t *self ) curFrame = floor( currentFrame ); int legsAnim = self->client->ps.legsAnim; - animation_t *animations = level.knownAnimFileSets[self->client->clientInfo.animFileIndex].animations; + ja_animation_t *animations = level.knownAnimFileSets[self->client->clientInfo.animFileIndex].animations; if ( curFrame >= animations[legsAnim].firstFrame + (animations[legsAnim].numFrames - 2) ) { @@ -4337,7 +4337,7 @@ qboolean PM_HasAnimation( gentity_t *ent, int animation ) if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) return qfalse; - animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + ja_animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; //No frames, no anim if ( animations[animation].numFrames == 0 ) @@ -4660,8 +4660,8 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, //---------------------------- float timeScaleMod = PM_GetTimeScaleMod( gent ); const int actualTime = (cg.time?cg.time:level.time); - const animation_t* animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; - const animation_t& curAnim = animations[anim]; + const ja_animation_t* animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; + const ja_animation_t& curAnim = animations[anim]; // Make Sure This Character Has Such An Anim And A Model //------------------------------------------------------- diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 29223cf01b..bf2b62994d 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -10554,7 +10554,7 @@ qboolean PM_SaberLocked( void ) int remaining = 0; if( ValidAnimFileIndex( gent->client->clientInfo.animFileIndex ) ) { - animation_t *anim; + ja_animation_t *anim; float currentFrame, junk2; int curFrame, junk; int strength = 1; @@ -10697,7 +10697,7 @@ qboolean PM_SaberLocked( void ) if( ValidAnimFileIndex( genemy->client->clientInfo.animFileIndex ) ) { - animation_t *anim; + ja_animation_t *anim; anim = &level.knownAnimFileSets[genemy->client->clientInfo.animFileIndex].animations[genemy->client->ps.torsoAnim]; /* float currentFrame, junk2; diff --git a/code/game/bg_public.h b/code/game/bg_public.h index d520cc84ed..4afafb16c4 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -454,7 +454,10 @@ typedef enum { } entity_event_t; -typedef struct animation_s { +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class ja_animation_t +{ +public: unsigned short firstFrame; unsigned short numFrames; short frameLerp; // msec between frames @@ -482,7 +485,7 @@ typedef struct animation_s { saved_game->read(loopFrames); saved_game->read(glaIndex); } -} animation_t; +}; // ja_animation_t #define MAX_ANIM_FILES 16 #define MAX_ANIM_EVENTS 300 diff --git a/code/game/fields.h b/code/game/fields.h index 8d358319ce..877ececa20 100644 --- a/code/game/fields.h +++ b/code/game/fields.h @@ -38,7 +38,7 @@ along with this program; if not, see . #endif #define STOFS(x) offsetof(spawn_temp_t, x) #define LLOFS(x) offsetof(level_locals_t, x) -#define CLOFS(x) offsetof(gclient_t, x) +#define CLOFS(x) offsetof(ja_gclient_t, x) #define NPCOFS(x) offsetof(gNPC_t, x) #define VHOFS(x) offsetof(Vehicle_t, x) diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index c40de5e202..dc77d4253c 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -481,7 +481,7 @@ global pain sound events for all clients. =============== */ void P_DamageFeedback( gentity_t *player ) { - gclient_t *client; + ja_gclient_t *client; float count; vec3_t angles; @@ -1685,7 +1685,7 @@ Actions that happen once a second ================== */ void ClientTimerActions( gentity_t *ent, int msec ) { - gclient_t *client; + ja_gclient_t *client; client = ent->client; client->timeResidual += msec; @@ -1734,7 +1734,7 @@ void ClientTimerActions( gentity_t *ent, int msec ) { ClientIntermissionThink ==================== */ -static qboolean ClientCinematicThink( gclient_t *client ) { +static qboolean ClientCinematicThink( ja_gclient_t *client ) { client->ps.eFlags &= ~EF_FIRING; // swap button actions @@ -1760,7 +1760,7 @@ extern void WP_SaberUpdateOldBladeData( gentity_t *ent ); void ClientEvents( gentity_t *ent, int oldEventSequence ) { int i; int event; - gclient_t *client; + ja_gclient_t *client; //int damage; #ifndef FINAL_BUILD qboolean fired = qfalse; @@ -4412,7 +4412,7 @@ This function is called ONLY from ClientThinkReal, and is responsible for settin */ void ClientAlterSpeed(gentity_t *ent, usercmd_t *ucmd, qboolean controlledByPlayer, float vehicleFrameTimeModifier) { - gclient_t *client = ent->client; + ja_gclient_t *client = ent->client; Vehicle_t *pVeh = NULL; if ( ent->client && ent->client->NPC_class == CLASS_VEHICLE ) @@ -4754,7 +4754,7 @@ extern float G_CanJumpToEnemyVeh(Vehicle_t *pVeh, const usercmd_t *pUmcd ); void ClientThink_real( gentity_t *ent, usercmd_t *ucmd ) { - gclient_t *client; + ja_gclient_t *client; pmove_t pm; vec3_t oldOrigin; int oldEventSequence; diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index c6d4799038..5d55ebb9b1 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -453,7 +453,7 @@ if desired. */ void ClientUserinfoChanged( int clientNum ) { gentity_t *ent = g_entities + clientNum; - gclient_t *client = ent->client; + ja_gclient_t *client = ent->client; int health=100, maxHealth=100; const char *s=NULL; char userinfo[MAX_INFO_STRING]={0}, buf[MAX_INFO_STRING]={0}, @@ -526,12 +526,12 @@ char *ClientConnect( int clientNum, qboolean firstTime, SavedGameJustLoaded_e eS // they can connect ent->client = level.clients + clientNum; - gclient_t *client = ent->client; + ja_gclient_t *client = ent->client; // if (!qbFromSavedGame) if (eSavedGameJustLoaded != eFULL) { - clientSession_t savedSess = client->sess; // + ja_clientSession_t savedSess = client->sess; // memset( client, 0, sizeof(*client) ); client->sess = savedSess; if ( firstTime ) { //not loading full, and directconnect @@ -581,7 +581,7 @@ void ClientBegin( int clientNum, usercmd_t *cmd, SavedGameJustLoaded_e eSavedGam // qboolean qbFromSavedGame { gentity_t *ent; - gclient_t *client; + ja_gclient_t *client; ent = g_entities + clientNum; client = level.clients + clientNum; @@ -681,7 +681,7 @@ Player_RestoreFromPrevLevel */ static void Player_RestoreFromPrevLevel(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded) { - gclient_t *client = ent->client; + ja_gclient_t *client = ent->client; int i; assert(client); @@ -2116,11 +2116,11 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded { int index; vec3_t spawn_origin, spawn_angles; - gclient_t *client; + ja_gclient_t *client; int i; ja_clientPersistant_t saved; - clientSession_t savedSess; - clientInfo_t savedCi; + ja_clientSession_t savedSess; + ja_clientInfo_t savedCi; int persistant[MAX_PERSISTANT]; usercmd_t ucmd; gentity_t *spawnPoint; @@ -2195,11 +2195,11 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded persistant[i] = client->ps.persistant[i]; } //Preserve clientInfo - memcpy (&savedCi, &client->clientInfo, sizeof(clientInfo_t)); + memcpy (&savedCi, &client->clientInfo, sizeof(ja_clientInfo_t)); memset (client, 0, sizeof(*client)); - memcpy (&client->clientInfo, &savedCi, sizeof(clientInfo_t)); + memcpy (&client->clientInfo, &savedCi, sizeof(ja_clientInfo_t)); client->pers = saved; client->sess = savedSess; diff --git a/code/game/g_cmds.cpp b/code/game/g_cmds.cpp index b34868a77c..e211517a31 100644 --- a/code/game/g_cmds.cpp +++ b/code/game/g_cmds.cpp @@ -126,7 +126,7 @@ Returns -1 if invalid ================== */ int ClientNumberFromString( gentity_t *to, char *s ) { - gclient_t *cl; + ja_gclient_t *cl; int idnum; char s2[MAX_STRING_CHARS]; char n2[MAX_STRING_CHARS]; diff --git a/code/game/g_combat.cpp b/code/game/g_combat.cpp index 42370d71a0..a8566a64f0 100644 --- a/code/game/g_combat.cpp +++ b/code/game/g_combat.cpp @@ -2049,7 +2049,7 @@ static qboolean G_Dismember( gentity_t *ent, vec3_t point, gi.G2API_StopBoneAnim( &limb->ghoul2[limb->playerModel], "pelvis" ); gi.G2API_StopBoneAnim( &limb->ghoul2[limb->playerModel], "upper_lumbar" ); //FIXME: screws up origin - animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + ja_animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; //play the proper dismember anim on the limb gi.G2API_SetBoneAnim(&limb->ghoul2[limb->playerModel], 0, animations[limbAnim].firstFrame, animations[limbAnim].numFrames + animations[limbAnim].firstFrame, @@ -4833,7 +4833,7 @@ CheckArmor */ int CheckArmor (gentity_t *ent, int damage, int dflags, int mod) { - gclient_t *client; + ja_gclient_t *client; int save; int count; @@ -5488,7 +5488,7 @@ dflags these flags are used to control how T_Damage works */ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, const vec3_t dir, const vec3_t point, int damage, int dflags, int mod, int hitLoc ) { - gclient_t *client; + ja_gclient_t *client; int take; int asave = 0; int knockback; @@ -6330,7 +6330,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, const gi.G2API_CopyGhoul2Instance(targ->ghoul2, limb->ghoul2, -1); gi.G2API_SetRootSurface(limb->ghoul2, limb->playerModel, "lfront"); gi.G2API_SetSurfaceOnOff(&targ->ghoul2[targ->playerModel], "lfront", TURN_OFF); - animation_t *animations = level.knownAnimFileSets[targ->client->clientInfo.animFileIndex].animations; + ja_animation_t *animations = level.knownAnimFileSets[targ->client->clientInfo.animFileIndex].animations; //play the proper dismember anim on the limb gi.G2API_SetBoneAnim(&limb->ghoul2[limb->playerModel], 0, animations[BOTH_A1_BL_TR].firstFrame, diff --git a/code/game/g_local.h b/code/game/g_local.h index fc29d572fa..9da71d54ee 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -88,10 +88,12 @@ along with this program; if not, see . #define VALIDSTRING( a ) ( ( a != NULL ) && ( a[0] != '\0' ) ) //animations -typedef struct +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class ja_animFileSet_t { +public: char filename[MAX_QPATH]; - animation_t animations[MAX_ANIMATIONS]; + ja_animation_t animations[MAX_ANIMATIONS]; animevent_t torsoAnimEvents[MAX_ANIM_EVENTS]; animevent_t legsAnimEvents[MAX_ANIM_EVENTS]; unsigned char torsoAnimEventCount; @@ -119,7 +121,7 @@ typedef struct saved_game->read(torsoAnimEventCount); saved_game->read(legsAnimEventCount); } -} animFileSet_t; +}; // ja_animFileSet_t extern stringID_table_t animTable [MAX_ANIMATIONS+1]; @@ -168,8 +170,10 @@ enum alertEventLevel_e }; // !!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! -typedef struct alertEvent_s +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class ja_alertEvent_t { +public: vec3_t position; //Where the event is located float radius; //Consideration radius alertEventLevel_e level; //Priority level of the event @@ -211,7 +215,7 @@ typedef struct alertEvent_s saved_game->read(timestamp); saved_game->read(onGround); } -} alertEvent_t; +}; // ja_alertEvent_t // // this structure is cleared as each map is entered @@ -237,7 +241,7 @@ typedef struct // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! typedef struct { - gclient_t *clients; // [maxclients] + ja_gclient_t *clients; // [maxclients] // store latched cvars here that we want to get at often int maxclients; @@ -253,13 +257,13 @@ typedef struct qboolean locationLinked; // target_locations get linked gentity_t *locationHead; // head of the location list - alertEvent_t alertEvents[ MAX_ALERT_EVENTS ]; + ja_alertEvent_t alertEvents[ MAX_ALERT_EVENTS ]; int numAlertEvents; int curAlertID; - AIGroupInfo_t groups[MAX_FRAME_GROUPS]; + ja_AIGroupInfo_t groups[MAX_FRAME_GROUPS]; - animFileSet_t knownAnimFileSets[MAX_ANIM_FILES]; + ja_animFileSet_t knownAnimFileSets[MAX_ANIM_FILES]; int numKnownAnimFileSets; int worldFlags; @@ -631,8 +635,8 @@ void Svcmd_GameMem_f( void ); // // g_session.c // -void G_ReadSessionData( gclient_t *client ); -void G_InitSessionData( gclient_t *client, char *userinfo ); +void G_ReadSessionData( ja_gclient_t *client ); +void G_InitSessionData( ja_gclient_t *client, char *userinfo ); void G_InitWorldSession( void ); void G_WriteSessionData( void ); diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 1ffb9aca5e..4475289467 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -759,7 +759,7 @@ void InitGame( const char *mapname, const char *spawntarget, int checkSum, cons ClearAllInUse(); // initialize all clients for this game level.maxclients = 1; - level.clients = (struct gclient_s *) G_Alloc( level.maxclients * sizeof(level.clients[0]) ); + level.clients = (ja_gclient_t*) G_Alloc( level.maxclients * sizeof(level.clients[0]) ); memset(level.clients, 0, level.maxclients * sizeof(level.clients[0])); // set client fields on player diff --git a/code/game/g_misc_model.cpp b/code/game/g_misc_model.cpp index 8a01b39dc6..210ddf654b 100644 --- a/code/game/g_misc_model.cpp +++ b/code/game/g_misc_model.cpp @@ -155,7 +155,7 @@ extern int G_ParseAnimFileSet( const char *skeletonName, const char *modelName=0 int temp_animFileIndex; void set_MiscAnim( gentity_t *ent) { - animation_t *animations = level.knownAnimFileSets[temp_animFileIndex].animations; + ja_animation_t *animations = level.knownAnimFileSets[temp_animFileIndex].animations; if (ent->playerModel & 1) { int anim = BOTH_STAND3; diff --git a/code/game/g_navigator.cpp b/code/game/g_navigator.cpp index 297286dea0..ed38204c62 100644 --- a/code/game/g_navigator.cpp +++ b/code/game/g_navigator.cpp @@ -2198,7 +2198,7 @@ void NAV::RegisterDangerSense(gentity_t* actor, int alertEventIndex) // Get The Alert List For This Ent And The Alert Itself //------------------------------------------------------ TAlertList& al = mEntityAlertList[actor->s.number]; - alertEvent_t& ae = level.alertEvents[alertEventIndex]; + ja_alertEvent_t& ae = level.alertEvents[alertEventIndex]; if (ae.radius<=0.0f) { diff --git a/code/game/g_objectives.cpp b/code/game/g_objectives.cpp index b9ced077d0..e206c3b627 100644 --- a/code/game/g_objectives.cpp +++ b/code/game/g_objectives.cpp @@ -58,7 +58,7 @@ void OBJ_SetPendingObjectives(gentity_t *ent) OBJ_SaveMissionObjectives ============ */ -void OBJ_SaveMissionObjectives( gclient_t *client ) +void OBJ_SaveMissionObjectives( ja_gclient_t *client ) { ::gi.saved_game->write_chunk( INT_ID('O','B','J','T'), @@ -73,7 +73,7 @@ OBJ_SaveObjectiveData */ void OBJ_SaveObjectiveData(void) { - gclient_t *client; + ja_gclient_t *client; client = &level.clients[0]; @@ -85,7 +85,7 @@ void OBJ_SaveObjectiveData(void) OBJ_LoadMissionObjectives ============ */ -void OBJ_LoadMissionObjectives( gclient_t *client ) +void OBJ_LoadMissionObjectives( ja_gclient_t *client ) { ::gi.saved_game->read_chunk( INT_ID('O','B','J','T'), @@ -100,7 +100,7 @@ OBJ_LoadObjectiveData */ void OBJ_LoadObjectiveData(void) { - gclient_t *client; + ja_gclient_t *client; client = &level.clients[0]; diff --git a/code/game/g_public.h b/code/game/g_public.h index b503c7890d..08cf22cb71 100644 --- a/code/game/g_public.h +++ b/code/game/g_public.h @@ -76,7 +76,7 @@ class CRagDollParams; //rww - RAGDOLL_END typedef struct gentity_s gentity_t; -typedef struct gclient_s gclient_t; +//typedef struct gclient_s gclient_t; typedef enum { diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index 6bcfa0d672..31dcbaed80 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -255,9 +255,9 @@ static gentity_t *GetGEntityPtr(intptr_t iEntNum) -static intptr_t GetGroupNumber(AIGroupInfo_t *pGroup) +static intptr_t GetGroupNumber(ja_AIGroupInfo_t *pGroup) { - assert( pGroup != (AIGroupInfo_t *) 0xcdcdcdcd); + assert( pGroup != (ja_AIGroupInfo_t *) 0xcdcdcdcd); if (pGroup == NULL) { @@ -272,7 +272,7 @@ static intptr_t GetGroupNumber(AIGroupInfo_t *pGroup) return iReturnIndex; } -static AIGroupInfo_t *GetGroupPtr(intptr_t iGroupNum) +static ja_AIGroupInfo_t *GetGroupPtr(intptr_t iGroupNum) { if (iGroupNum == -1) { @@ -288,12 +288,12 @@ static AIGroupInfo_t *GetGroupPtr(intptr_t iGroupNum) /////////// gclient_t * //////// // // -static intptr_t GetGClientNum(gclient_t *c, gentity_t *ent) +static intptr_t GetGClientNum(ja_gclient_t *c, gentity_t *ent) { // unfortunately, I now need to see if this is a INT_ID('r','e','a','l') client (and therefore resolve to an enum), or // whether it's one of the NPC or SP_misc_weapon_shooter // - assert(c != (gclient_t *)0xcdcdcdcd); + assert(c != (ja_gclient_t *)0xcdcdcdcd); if (c == NULL) { @@ -310,7 +310,7 @@ static intptr_t GetGClientNum(gclient_t *c, gentity_t *ent) } } -static gclient_t *GetGClientPtr(intptr_t c) +static ja_gclient_t *GetGClientPtr(intptr_t c) { if (c == -1) { @@ -318,7 +318,7 @@ static gclient_t *GetGClientPtr(intptr_t c) } if (c == -2) { - return (gclient_t *) -2; // preserve this value so that I know to load in one of Mike's private NPC clients later + return (ja_gclient_t *) -2; // preserve this value so that I know to load in one of Mike's private NPC clients later } assert(c >= 0); @@ -407,11 +407,11 @@ static void EnumerateField(const save_field_t *pField, const byte *pbBase) break; case F_GROUP: - *(int *)pv = GetGroupNumber(*(AIGroupInfo_t **)pv); + *(int *)pv = GetGroupNumber(*(ja_AIGroupInfo_t **)pv); break; case F_GCLIENT: - *(intptr_t *)pv = GetGClientNum(*(gclient_t **)pv, (gentity_t *) pbBase); + *(intptr_t *)pv = GetGClientNum(*(ja_gclient_t **)pv, (gentity_t *) pbBase); break; case F_ITEM: @@ -448,7 +448,7 @@ static void EnumerateField(const save_field_t *pField, const byte *pbBase) case F_ALERTEVENT: // convert all gentity_t ptrs in an alertEvent array into indexes... { - alertEvent_t* p = (alertEvent_t *) pv; + ja_alertEvent_t* p = (ja_alertEvent_t *) pv; for (int i=0; iclient; // NOT *tempEnt.client!! + ja_gclient_t client = *ent->client; // NOT *tempEnt.client!! EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I'), sizeof(client)); } @@ -1056,9 +1056,9 @@ static void ReadGEntities(qboolean qbAutosave) */ } - if (pEnt->client == (gclient_t*) -2) // one of Mike G's NPC clients? + if (pEnt->client == (ja_gclient_t*) -2) // one of Mike G's NPC clients? { - gclient_t tempGClient; + ja_gclient_t tempGClient; EvaluateFields(savefields_gClient, &tempGClient, (byte *)pEntOriginal->client, INT_ID('G','C','L','I'), sizeof(*pEnt->client),qtrue);//qfalse); @@ -1074,7 +1074,7 @@ static void ReadGEntities(qboolean qbAutosave) { // original didn't have one (hmmm...) so make a new one... // - pEnt->client = (gclient_t *) G_Alloc(sizeof(*pEnt->client)); + pEnt->client = (ja_gclient_t *) G_Alloc(sizeof(*pEnt->client)); } // copy over the one we've just loaded.... @@ -1239,7 +1239,7 @@ void WriteLevel(qboolean qbAutosave) // write out one client - us! // assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way ReadGame works - gclient_t client = level.clients[0]; + ja_gclient_t client = level.clients[0]; EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I'), sizeof(client)); WriteLevelLocals(); // level_locals_t level } @@ -1288,7 +1288,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) //SO: We read it in, but throw it away. //Read & throw away gclient info - gclient_t junkClient; + ja_gclient_t junkClient; EvaluateFields(savefields_gClient, &junkClient, (byte *)&level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qtrue);//qfalse); ReadLevelLocals(); // level_locals_t level @@ -1303,7 +1303,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) { assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way things work - gclient_t GClient; + ja_gclient_t GClient; EvaluateFields(savefields_gClient, &GClient, (byte *)&level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qtrue);//qfalse); level.clients[0] = GClient; // struct copy ReadLevelLocals(); // level_locals_t level diff --git a/code/game/g_session.cpp b/code/game/g_session.cpp index 8a42757085..59beb6dd7c 100644 --- a/code/game/g_session.cpp +++ b/code/game/g_session.cpp @@ -42,7 +42,7 @@ G_WriteClientSessionData Called on game shutdown ================ */ -void G_WriteClientSessionData( gclient_t *client ) { +void G_WriteClientSessionData( ja_gclient_t *client ) { const char *s; const char *s2; const char *var; @@ -112,7 +112,7 @@ G_ReadSessionData Called on a reconnect ================ */ -void G_ReadSessionData( gclient_t *client ) { +void G_ReadSessionData( ja_gclient_t *client ) { char s[MAX_STRING_CHARS]; const char *var; int i; @@ -202,8 +202,8 @@ G_InitSessionData Called on a first-time connect ================ */ -void G_InitSessionData( gclient_t *client, char *userinfo ) { - clientSession_t *sess; +void G_InitSessionData( ja_gclient_t *client, char *userinfo ) { + ja_clientSession_t *sess; sess = &client->sess; diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 221234a389..ddf8aa5d26 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -91,7 +91,10 @@ typedef enum //# material_e #define MAX_CUSTOM_JEDI_SOUNDS 22 #define MAX_CUSTOM_SOUNDS (MAX_CUSTOM_JEDI_SOUNDS + MAX_CUSTOM_EXTRA_SOUNDS + MAX_CUSTOM_COMBAT_SOUNDS + MAX_CUSTOM_BASIC_SOUNDS) // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct { +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class ja_clientInfo_t +{ +public: qboolean infoValid; char name[MAX_QPATH]; @@ -163,7 +166,7 @@ typedef struct { saved_game->read(customExtraSoundDir); saved_game->read(customJediSoundDir); } -} clientInfo_t; +}; // ja_clientInfo_t //================================================================== @@ -570,7 +573,10 @@ typedef struct missionStats_s // MUST be dealt with in G_InitSessionData() / G_ReadSessionData() / G_WriteSessionData() // // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct { +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class ja_clientSession_t +{ +public: int missionObjectivesShown; // Number of times mission objectives have been updated team_t sessionTeam; objectives_t mission_objectives[MAX_MISSION_OBJ]; @@ -594,7 +600,7 @@ typedef struct { saved_game->read<>(mission_objectives); saved_game->read<>(missionStats); } -} clientSession_t; +}; // ja_clientSession_t // client data that stays across multiple respawns, but is cleared // on each level change or team change at ClientBegin() @@ -673,13 +679,16 @@ typedef enum //# movetype_e // this structure is cleared on each ClientSpawn(), // except for 'client->pers' and 'client->sess' -struct gclient_s { +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class ja_gclient_t +{ +public: // ps MUST be the first element, because the server expects it playerState_t ps; // communicated by server to clients // private to game ja_clientPersistant_t pers; - clientSession_t sess; + ja_clientSession_t sess; int lastCmdTime; // level.time of last usercmd_t, for EF_CONNECTION @@ -717,7 +726,7 @@ struct gclient_s { int facial_anim; // anim to show in anim mode //Client info - updated when ClientInfoChanged is called, instead of using configstrings - clientInfo_t clientInfo; + ja_clientInfo_t clientInfo; movetype_t moveType; int jetPackTime; int fireDelay; //msec to delay calling G_FireWeapon after EV_FIREWEAPON event is called @@ -905,7 +914,7 @@ struct gclient_s { saved_game->read(inSpaceSuffocation); saved_game->read(inSpaceIndex); } -}; +}; // ja_gclient_t #define MAX_PARMS 16 #define MAX_PARM_STRING_LENGTH MAX_QPATH//was 16, had to lengthen it so they could take a valid file path @@ -947,7 +956,7 @@ typedef struct centity_s centity_t; // !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!!!!! struct gentity_s { entityState_t s; // communicated by server to clients - struct gclient_s *client; // NULL if not a player (unless it's NPC ( if (this->NPC != NULL) ) ... -slc) + ja_gclient_t *client; // NULL if not a player (unless it's NPC ( if (this->NPC != NULL) ) ... -slc) qboolean inuse; qboolean linked; // qfalse if not in any good cluster diff --git a/code/game/g_target.cpp b/code/game/g_target.cpp index db57c221d4..904e1904b3 100644 --- a/code/game/g_target.cpp +++ b/code/game/g_target.cpp @@ -925,7 +925,7 @@ void set_mission_stats_cvars( void ) char text[1024]={0}; //we'll assume that the activator is the player - gclient_t* const client = &level.clients[0]; + ja_gclient_t* const client = &level.clients[0]; if (!client) { @@ -1222,7 +1222,7 @@ void SP_target_autosave( gentity_t *self ) void target_secret_use(gentity_t *self, gentity_t *other, gentity_t *activator) { //we'll assume that the activator is the player - gclient_t* const client = &level.clients[0]; + ja_gclient_t* const client = &level.clients[0]; client->sess.missionStats.secretsFound++; if ( activator ) { diff --git a/code/game/g_weapon.cpp b/code/game/g_weapon.cpp index 643fe5e515..b72148d46c 100644 --- a/code/game/g_weapon.cpp +++ b/code/game/g_weapon.cpp @@ -1663,7 +1663,7 @@ extern stringID_table_t WPTable[]; void SP_misc_weapon_shooter( gentity_t *self ) { //alloc a client just for the weapon code to use - self->client = (gclient_s *)gi.Malloc(sizeof(gclient_s), TAG_G_ALLOC, qtrue); + self->client = (ja_gclient_t *)gi.Malloc(sizeof(ja_gclient_t), TAG_G_ALLOC, qtrue); //set weapon self->s.weapon = self->client->ps.weapon = WP_BLASTER; diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index e8c41a433b..f087f1b160 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -70,7 +70,7 @@ extern void G_SetViewEntity( gentity_t *self, gentity_t *viewEntity ); extern qboolean G_ControlledByPlayer( gentity_t *self ); extern void G_AddVoiceEvent( gentity_t *self, int event, int speakDebounceTime ); extern void CG_ChangeWeapon( int num ); -extern void CG_SaberDoWeaponHitMarks( gclient_t *client, gentity_t *saberEnt, gentity_t *hitEnt, int saberNum, int bladeNum, vec3_t hitPos, vec3_t hitDir, vec3_t uaxis, vec3_t splashBackDir, float sizeTimeScale ); +extern void CG_SaberDoWeaponHitMarks( ja_gclient_t *client, gentity_t *saberEnt, gentity_t *hitEnt, int saberNum, int bladeNum, vec3_t hitPos, vec3_t hitDir, vec3_t uaxis, vec3_t splashBackDir, float sizeTimeScale ); extern void G_AngerAlert( gentity_t *self ); extern void G_ReflectMissile( gentity_t *ent, gentity_t *missile, vec3_t forward ); extern int G_CheckLedgeDive( gentity_t *self, float checkDist, const vec3_t checkVel, qboolean tryOpposite, qboolean tryPerp ); @@ -544,7 +544,7 @@ void G_Throw( gentity_t *targ, const vec3_t newDir, float push ) } } -int WP_SetSaberModel( gclient_t *client, class_t npcClass ) +int WP_SetSaberModel( ja_gclient_t *client, class_t npcClass ) {//FIXME: read from NPCs.cfg if ( client ) { @@ -3131,7 +3131,7 @@ qboolean G_CheckIncrementLockAnim( int anim, int winOrLose ) qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLockMode_t lockMode ) { - animation_t *anim; + ja_animation_t *anim; int attAnim, defAnim, advance = 0; float attStart = 0.5f, defStart = 0.5f; float idealDist = 48.0f; diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 7e8ad672ca..3f48716c2e 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -2020,7 +2020,7 @@ static qboolean UI_OwnerDrawHandleKey(int ownerDraw, int flags, float *special, typedef struct { char filename[MAX_QPATH]; - animation_t animations[MAX_ANIMATIONS]; + ja_animation_t animations[MAX_ANIMATIONS]; } animFileSet_t; static animFileSet_t ui_knownAnimFileSets[MAX_ANIM_FILES]; @@ -2035,7 +2035,7 @@ qboolean UI_ParseAnimationFile( const char *af_filename ) float fps; char text[80000]; int animNum; - animation_t *animations = ui_knownAnimFileSets[ui_numKnownAnimFileSets].animations; + ja_animation_t *animations = ui_knownAnimFileSets[ui_numKnownAnimFileSets].animations; len = re.GetAnimationCFG(af_filename, text, sizeof(text)); if ( len <= 0 ) @@ -2205,7 +2205,7 @@ int UI_G2SetAnim(CGhoul2Info *ghlInfo, const char *boneName, int animNum, const if (animIndex != -1) { - animation_t *anim = &ui_knownAnimFileSets[animIndex].animations[animNum]; + ja_animation_t *anim = &ui_knownAnimFileSets[animIndex].animations[animNum]; if (anim->numFrames <= 0) { return 0; diff --git a/codeJK2/cgame/cg_local.h b/codeJK2/cgame/cg_local.h index 30eb45f99f..94252607c3 100644 --- a/codeJK2/cgame/cg_local.h +++ b/codeJK2/cgame/cg_local.h @@ -123,7 +123,7 @@ typedef struct { qboolean pitching; int animationNumber; - animation_t *animation; + jo_animation_t *animation; int animationTime; // time when the first frame of the animation will be exact } lerpFrame_t; diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index 2e12a2b1bc..7b2e5c2d0d 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -33,7 +33,7 @@ along with this program; if not, see . //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char, std::less, std::allocator< unsigned char > > namePrecache_m; extern namePrecache_m *as_preCacheMap; -extern void CG_RegisterNPCCustomSounds( clientInfo_t *ci ); +extern void CG_RegisterNPCCustomSounds( jo_clientInfo_t *ci ); extern qboolean G_AddSexToMunroString ( char *string, qboolean qDoBoth ); extern void CG_RegisterNPCEffects( team_t team ); extern qboolean G_ParseAnimFileSet( const char *filename, const char *animCFG, int *animFileIndex ); @@ -796,7 +796,7 @@ qhandle_t CG_RegisterHeadSkin( const char *headModelName, const char *headSkinNa CG_RegisterClientSkin ========================== */ -qboolean CG_RegisterClientSkin( clientInfo_t *ci, +qboolean CG_RegisterClientSkin( jo_clientInfo_t *ci, const char *headModelName, const char *headSkinName, const char *torsoModelName, const char *torsoSkinName, const char *legsModelName, const char *legsSkinName) @@ -852,7 +852,7 @@ qboolean CG_RegisterClientSkin( clientInfo_t *ci, CG_RegisterClientModelname ========================== */ -qboolean CG_RegisterClientModelname( clientInfo_t *ci, +qboolean CG_RegisterClientModelname( jo_clientInfo_t *ci, const char *headModelName, const char *headSkinName, const char *torsoModelName, const char *torsoSkinName, const char *legsModelName, const char *legsSkinName ) @@ -939,7 +939,7 @@ Ghoul2 Insert End } -void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri) +void CG_RegisterClientRenderInfo(jo_clientInfo_t *ci, renderInfo_t *ri) { char *slash; char headModelName[MAX_QPATH]; @@ -1104,7 +1104,7 @@ void CG_RegisterClientModels (int entityNum) if(entityNum < MAX_CLIENTS) { - memcpy(&cgs.clientinfo[entityNum], &ent->client->clientInfo, sizeof(clientInfo_t)); + memcpy(&cgs.clientinfo[entityNum], &ent->client->clientInfo, sizeof(jo_clientInfo_t)); } } diff --git a/codeJK2/cgame/cg_media.h b/codeJK2/cgame/cg_media.h index 5c24c4e15a..bd0cf363ca 100644 --- a/codeJK2/cgame/cg_media.h +++ b/codeJK2/cgame/cg_media.h @@ -353,7 +353,7 @@ typedef struct { qhandle_t inlineDrawModel[MAX_SUBMODELS]; vec3_t inlineModelMidpoints[MAX_SUBMODELS]; - clientInfo_t clientinfo[MAX_CLIENTS]; + jo_clientInfo_t clientinfo[MAX_CLIENTS]; // media cgMedia_t media; diff --git a/codeJK2/cgame/cg_players.cpp b/codeJK2/cgame/cg_players.cpp index 6417b0cd8c..5f544bd054 100644 --- a/codeJK2/cgame/cg_players.cpp +++ b/codeJK2/cgame/cg_players.cpp @@ -43,7 +43,7 @@ taken from the entityState_t */ -qboolean CG_RegisterClientModelname( clientInfo_t *ci, const char *headModelName, const char *headSkinName, +qboolean CG_RegisterClientModelname( jo_clientInfo_t *ci, const char *headModelName, const char *headSkinName, const char *torsoModelName, const char *torsoSkinName, const char *legsModelName, const char *legsSkinName ); @@ -231,7 +231,7 @@ static const char *GetCustomSound_VariantCapped(const char *ppsTable[], int iEnt return ppsTable[iEntryNum]; } -static void CG_RegisterCustomSounds(clientInfo_t *ci, int iSoundEntryBase, +static void CG_RegisterCustomSounds(jo_clientInfo_t *ci, int iSoundEntryBase, int iTableEntries, const char *ppsTable[], const char *psDir ) { @@ -273,7 +273,7 @@ CG_CustomSound */ static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int customSoundSet ) { - clientInfo_t *ci; + jo_clientInfo_t *ci; int i; if ( soundName[0] != '*' ) @@ -407,7 +407,7 @@ CG_NewClientinfo */ void CG_NewClientinfo( int clientNum ) { - clientInfo_t *ci; + jo_clientInfo_t *ci; const char *configstring; const char *v; // const char *s; @@ -481,7 +481,7 @@ void CG_NewClientinfo( int clientNum ) /* CG_RegisterNPCCustomSounds */ -void CG_RegisterNPCCustomSounds( clientInfo_t *ci ) +void CG_RegisterNPCCustomSounds( jo_clientInfo_t *ci ) { // const char *s; // int i; @@ -578,7 +578,7 @@ qboolean ValidAnimFileIndex ( int index ) -void ParseAnimationSndBlock(const char *asb_filename, animsounds_t *animSounds, animation_t *animations, int *i,const char **text_p) +void ParseAnimationSndBlock(const char *asb_filename, animsounds_t *animSounds, jo_animation_t *animations, int *i,const char **text_p) { const char *token; char soundString[MAX_QPATH]; @@ -757,7 +757,7 @@ void CG_ParseAnimationSndFile( const char *as_filename, int animFileIndex ) assert(animFileIndex < MAX_ANIM_FILES); animsounds_t *legsAnimSnds = level.knownAnimFileSets[animFileIndex].legsAnimSnds; animsounds_t *torsoAnimSnds = level.knownAnimFileSets[animFileIndex].torsoAnimSnds; - animation_t *animations = level.knownAnimFileSets[animFileIndex].animations; + jo_animation_t *animations = level.knownAnimFileSets[animFileIndex].animations; if ( level.knownAnimFileSets[animFileIndex].soundsCached ) {//already cached this one @@ -832,9 +832,9 @@ void CG_ParseAnimationSndFile( const char *as_filename, int animFileIndex ) CG_SetLerpFrameAnimation =============== */ -void CG_SetLerpFrameAnimation( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation ) +void CG_SetLerpFrameAnimation( jo_clientInfo_t *ci, lerpFrame_t *lf, int newAnimation ) { - animation_t *anim; + jo_animation_t *anim; if ( newAnimation < 0 || newAnimation >= MAX_ANIMATIONS ) { @@ -870,9 +870,9 @@ Sets cg.snap, cg.oldFrame, and cg.backlerp cg.time should be between oldFrameTime and frameTime after exit =============== */ -qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, float fpsMod, int entNum ) { +qboolean CG_RunLerpFrame( jo_clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, float fpsMod, int entNum ) { int f, animFrameTime; - animation_t *anim; + jo_animation_t *anim; qboolean newFrame = qfalse; if(fpsMod > 2 || fpsMod < 0.5) @@ -1002,7 +1002,7 @@ qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, f CG_ClearLerpFrame =============== */ -void CG_ClearLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int animationNumber ) +void CG_ClearLerpFrame( jo_clientInfo_t *ci, lerpFrame_t *lf, int animationNumber ) { lf->frameTime = lf->oldFrameTime = cg.time; CG_SetLerpFrameAnimation( ci, lf, animationNumber ); @@ -1023,7 +1023,7 @@ CG_PlayerAnimation */ void CG_PlayerAnimation( centity_t *cent, int *legsOld, int *legs, float *legsBackLerp, int *torsoOld, int *torso, float *torsoBackLerp ) { - clientInfo_t *ci; + jo_clientInfo_t *ci; int legsAnim; int legsTurnAnim = -1; qboolean newLegsFrame = qfalse; @@ -1147,7 +1147,7 @@ void CG_PlayerAnimSounds( int animFileIndex, qboolean torso, int oldFrame, int f else {//still in same anim, check for looping anim inSameAnim = qtrue; - animation_t *animation = &level.knownAnimFileSets[animFileIndex].animations[anim]; + jo_animation_t *animation = &level.knownAnimFileSets[animFileIndex].animations[anim]; animBackward = (animation->frameLerp<0); if ( animation->loopFrames != -1 ) {//a looping anim! @@ -2181,7 +2181,7 @@ void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) int turnAnim = PM_TurnAnimForLegsAnim( cent->gent, cent->gent->client->ps.legsAnim ); if ( turnAnim != -1 && cent->gent->health > 0 ) { - animation_t *animations = level.knownAnimFileSets[cent->gent->client->clientInfo.animFileIndex].animations; + jo_animation_t *animations = level.knownAnimFileSets[cent->gent->client->clientInfo.animFileIndex].animations; if ( !animatingHips || ( animations[turnAnim].firstFrame != startFrame ) )// only set the anim if we aren't going to do the same animation again { @@ -3031,7 +3031,7 @@ void CG_PlayerSplash( centity_t *cent ) if ( cent->gent && cent->gent->client ) { - gclient_t *cl = cent->gent->client; + jo_gclient_t *cl = cent->gent->client; if ( cent->gent->disconnectDebounceTime < cg.time ) // can't do these expanding ripples all the time { @@ -3708,7 +3708,7 @@ static void CG_G2SetHeadAnim( centity_t *cent, int anim ) { gentity_t *gent = cent->gent; const int blendTime = 50; - const animation_t *animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; + const jo_animation_t *animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; int animFlags = BONE_ANIM_OVERRIDE ;//| BONE_ANIM_BLEND; // animSpeed is 1.0 if the frameLerp (ms/frame) is 50 (20 fps). // float timeScaleMod = (cg_timescale.value&&gent&&gent->s.clientNum==0&&!player_locked&&!MatrixMode&&gent->client->ps.forcePowersActive&(1<gent->client->clientInfo;; + jo_clientInfo_t *ci = ¢->gent->client->clientInfo;; // if we have facial texture extensions, go get the sound override and add it to the face skin // if we aren't talking, then it will be 0 @@ -4372,7 +4372,7 @@ extern void FX_AddPrimitive( CEffect **effect, int killTime ); //------------------------------------------------------- void CG_CheckSaberInWater( centity_t *cent, centity_t *scent, int modelIndex, vec3_t origin, vec3_t angles ) { - gclient_s *client = cent->gent->client; + jo_gclient_t *client = cent->gent->client; vec3_t saberOrg; if ( !client ) { @@ -4409,7 +4409,7 @@ void CG_AddSaberBlade( centity_t *cent, centity_t *scent, refEntity_t *saber, in trace_t trace; float length; - gclient_s *client = cent->gent->client; + jo_gclient_t *client = cent->gent->client; if ( !client ) { @@ -4780,7 +4780,7 @@ CG_Player */ extern qboolean G_ControlledByPlayer( gentity_t *self ); void CG_Player( centity_t *cent ) { - clientInfo_t *ci; + jo_clientInfo_t *ci; qboolean shadow, staticScale = qfalse; float shadowPlane; const weaponData_t *wData = NULL; diff --git a/codeJK2/cgame/cg_weapons.cpp b/codeJK2/cgame/cg_weapons.cpp index a03fe0268d..afb6973f42 100644 --- a/codeJK2/cgame/cg_weapons.cpp +++ b/codeJK2/cgame/cg_weapons.cpp @@ -657,14 +657,14 @@ the weapon hand animation has 3 anims, ================= */ extern qboolean ValidAnimFileIndex ( int index ); -int CG_MapTorsoToWeaponFrame( const clientInfo_t *ci, int frame, int animNum, int weaponNum, int firing ) +int CG_MapTorsoToWeaponFrame( const jo_clientInfo_t *ci, int frame, int animNum, int weaponNum, int firing ) { // we should use the animNum to map a weapon frame instead of relying on the torso frame if ( !ValidAnimFileIndex( ci->animFileIndex ) ) { return 0; } - animation_t *animations = level.knownAnimFileSets[ci->animFileIndex].animations; + jo_animation_t *animations = level.knownAnimFileSets[ci->animFileIndex].animations; int ret=0; switch( animNum ) @@ -1054,7 +1054,7 @@ void CG_AddViewWeapon( playerState_t *ps ) else { // get clientinfo for animation map - const clientInfo_t *ci = ¢->gent->client->clientInfo; + const jo_clientInfo_t *ci = ¢->gent->client->clientInfo; int torsoAnim = cent->gent->client->ps.torsoAnim;//pe.torso.animationNumber; float currentFrame; int startFrame,endFrame,flags; diff --git a/codeJK2/game/AI_Stormtrooper.cpp b/codeJK2/game/AI_Stormtrooper.cpp index d79cd1d118..d9a4300323 100644 --- a/codeJK2/game/AI_Stormtrooper.cpp +++ b/codeJK2/game/AI_Stormtrooper.cpp @@ -28,10 +28,10 @@ along with this program; if not, see . extern void CG_DrawAlert( vec3_t origin, float rating ); extern void G_AddVoiceEvent( gentity_t *self, int event, int speakDebounceTime ); -extern void AI_GroupUpdateSquadstates( AIGroupInfo_t *group, gentity_t *member, int newSquadState ); -extern qboolean AI_GroupContainsEntNum( AIGroupInfo_t *group, int entNum ); -extern void AI_GroupUpdateEnemyLastSeen( AIGroupInfo_t *group, vec3_t spot ); -extern void AI_GroupUpdateClearShotTime( AIGroupInfo_t *group ); +extern void AI_GroupUpdateSquadstates( jo_AIGroupInfo_t *group, gentity_t *member, int newSquadState ); +extern qboolean AI_GroupContainsEntNum( jo_AIGroupInfo_t *group, int entNum ); +extern void AI_GroupUpdateEnemyLastSeen( jo_AIGroupInfo_t *group, vec3_t spot ); +extern void AI_GroupUpdateClearShotTime( jo_AIGroupInfo_t *group ); extern void NPC_TempLookTarget( gentity_t *self, int lookEntNum, int minLookTime, int maxLookTime ); extern qboolean G_ExpandPointToBBox( vec3_t point, const vec3_t mins, const vec3_t maxs, int ignore, int clipmask ); extern void ChangeWeapon( gentity_t *ent, int newWeapon ); @@ -1714,7 +1714,7 @@ void ST_Commander( void ) { int i, j; int cp, cpFlags_org, cpFlags; - AIGroupInfo_t *group = NPCInfo->group; + jo_AIGroupInfo_t *group = NPCInfo->group; gentity_t *member;//, *buddy; qboolean runner = qfalse; qboolean enemyLost = qfalse; diff --git a/codeJK2/game/AI_Utils.cpp b/codeJK2/game/AI_Utils.cpp index bdd670f394..511577bf53 100644 --- a/codeJK2/game/AI_Utils.cpp +++ b/codeJK2/game/AI_Utils.cpp @@ -36,7 +36,7 @@ along with this program; if not, see . extern CNavigator navigator; extern cvar_t *d_noGroupAI; -qboolean AI_ValidateGroupMember( AIGroupInfo_t *group, gentity_t *member ); +qboolean AI_ValidateGroupMember( jo_AIGroupInfo_t *group, gentity_t *member ); /* ------------------------- @@ -96,7 +96,7 @@ int AI_GetGroupSize( gentity_t *ent, int radius ) } extern int NAV_FindClosestWaypointForPoint( gentity_t *ent, vec3_t point ); -int AI_ClosestGroupEntityNumToPoint( AIGroupInfo_t &group, vec3_t point ) +int AI_ClosestGroupEntityNumToPoint( jo_AIGroupInfo_t &group, vec3_t point ) { int markerWP = WAYPOINT_NONE; int cost, bestCost = Q3_INFINITE; @@ -127,7 +127,7 @@ int AI_ClosestGroupEntityNumToPoint( AIGroupInfo_t &group, vec3_t point ) return closest; } -void AI_SetClosestBuddy( AIGroupInfo_t *group ) +void AI_SetClosestBuddy( jo_AIGroupInfo_t *group ) { int i, j; int dist, bestDist; @@ -149,9 +149,9 @@ void AI_SetClosestBuddy( AIGroupInfo_t *group ) } } -void AI_SortGroupByPathCostToEnemy( AIGroupInfo_t *group ) +void AI_SortGroupByPathCostToEnemy( jo_AIGroupInfo_t *group ) { - AIGroupMember_t bestMembers[MAX_GROUP_MEMBERS]; + jo_AIGroupMember_t bestMembers[MAX_GROUP_MEMBERS]; int i, j, k; qboolean sort = qfalse; @@ -247,7 +247,7 @@ qboolean AI_FindSelfInPreviousGroup( gentity_t *self ) return qfalse; } -void AI_InsertGroupMember( AIGroupInfo_t *group, gentity_t *member ) +void AI_InsertGroupMember( jo_AIGroupInfo_t *group, gentity_t *member ) { //okay, you know what? Check this damn group and make sure we're not already in here! int i; @@ -322,7 +322,7 @@ qboolean AI_GetNextEmptyGroup( gentity_t *self ) } } -qboolean AI_ValidateNoEnemyGroupMember( AIGroupInfo_t *group, gentity_t *member ) +qboolean AI_ValidateNoEnemyGroupMember( jo_AIGroupInfo_t *group, gentity_t *member ) { if ( !group ) { @@ -353,7 +353,7 @@ qboolean AI_ValidateNoEnemyGroupMember( AIGroupInfo_t *group, gentity_t *member return qtrue; } -qboolean AI_ValidateGroupMember( AIGroupInfo_t *group, gentity_t *member ) +qboolean AI_ValidateGroupMember( jo_AIGroupInfo_t *group, gentity_t *member ) { //Validate ents if ( member == NULL ) @@ -494,7 +494,7 @@ void AI_GetGroup( gentity_t *self ) } //create a new one - memset( self->NPC->group, 0, sizeof( AIGroupInfo_t ) ); + memset( self->NPC->group, 0, sizeof( jo_AIGroupInfo_t ) ); self->NPC->group->enemy = self->enemy; self->NPC->group->team = self->client->playerTeam; @@ -560,7 +560,7 @@ void AI_GetGroup( gentity_t *self ) AI_SetClosestBuddy( self->NPC->group ); } -void AI_SetNewGroupCommander( AIGroupInfo_t *group ) +void AI_SetNewGroupCommander( jo_AIGroupInfo_t *group ) { gentity_t *member = NULL; group->commander = NULL; @@ -575,7 +575,7 @@ void AI_SetNewGroupCommander( AIGroupInfo_t *group ) } } -void AI_DeleteGroupMember( AIGroupInfo_t *group, int memberNum ) +void AI_DeleteGroupMember( jo_AIGroupInfo_t *group, int memberNum ) { if ( group->commander && group->commander->s.number == group->member[memberNum].number ) { @@ -623,7 +623,7 @@ extern void ST_MarkToCover( gentity_t *self ); extern void ST_StartFlee( gentity_t *self, gentity_t *enemy, vec3_t dangerPoint, int dangerLevel, int minTime, int maxTime ); void AI_GroupMemberKilled( gentity_t *self ) { - AIGroupInfo_t *group = self->NPC->group; + jo_AIGroupInfo_t *group = self->NPC->group; gentity_t *member; qboolean noflee = qfalse; @@ -699,7 +699,7 @@ void AI_GroupMemberKilled( gentity_t *self ) } } -void AI_GroupUpdateEnemyLastSeen( AIGroupInfo_t *group, vec3_t spot ) +void AI_GroupUpdateEnemyLastSeen( jo_AIGroupInfo_t *group, vec3_t spot ) { if ( !group ) { @@ -709,7 +709,7 @@ void AI_GroupUpdateEnemyLastSeen( AIGroupInfo_t *group, vec3_t spot ) VectorCopy( spot, group->enemyLastSeenPos ); } -void AI_GroupUpdateClearShotTime( AIGroupInfo_t *group ) +void AI_GroupUpdateClearShotTime( jo_AIGroupInfo_t *group ) { if ( !group ) { @@ -718,7 +718,7 @@ void AI_GroupUpdateClearShotTime( AIGroupInfo_t *group ) group->lastClearShotTime = level.time; } -void AI_GroupUpdateSquadstates( AIGroupInfo_t *group, gentity_t *member, int newSquadState ) +void AI_GroupUpdateSquadstates( jo_AIGroupInfo_t *group, gentity_t *member, int newSquadState ) { if ( !group ) { @@ -738,7 +738,7 @@ void AI_GroupUpdateSquadstates( AIGroupInfo_t *group, gentity_t *member, int new } } -qboolean AI_RefreshGroup( AIGroupInfo_t *group ) +qboolean AI_RefreshGroup( jo_AIGroupInfo_t *group ) { gentity_t *member; int i;//, j; @@ -975,7 +975,7 @@ void AI_UpdateGroups( void ) } } -qboolean AI_GroupContainsEntNum( AIGroupInfo_t *group, int entNum ) +qboolean AI_GroupContainsEntNum( jo_AIGroupInfo_t *group, int entNum ) { if ( !group ) { diff --git a/codeJK2/game/NPC.cpp b/codeJK2/game/NPC.cpp index 30cbcece69..c301664763 100644 --- a/codeJK2/game/NPC.cpp +++ b/codeJK2/game/NPC.cpp @@ -76,7 +76,7 @@ extern qboolean stop_icarus; gentity_t *NPC; gNPC_t *NPCInfo; -gclient_t *client; +jo_gclient_t *client; usercmd_t ucmd; visibility_t enemyVisibility; @@ -818,7 +818,7 @@ void SetNPCGlobals( gentity_t *ent ) gentity_t *_saved_NPC; gNPC_t *_saved_NPCInfo; -gclient_t *_saved_client; +jo_gclient_t *_saved_client; usercmd_t _saved_ucmd; void SaveNPCGlobals() diff --git a/codeJK2/game/NPC_senses.cpp b/codeJK2/game/NPC_senses.cpp index 57e6abc8e5..8a0508ff50 100644 --- a/codeJK2/game/NPC_senses.cpp +++ b/codeJK2/game/NPC_senses.cpp @@ -699,12 +699,12 @@ void ClearPlayerAlertEvents( void ) {//still have more in the array if ( (i+1) < MAX_ALERT_EVENTS ) { - memmove( &level.alertEvents[i], &level.alertEvents[i+1], sizeof(alertEvent_t)*(MAX_ALERT_EVENTS-(i+1) ) ); + memmove( &level.alertEvents[i], &level.alertEvents[i+1], sizeof(jo_alertEvent_t)*(MAX_ALERT_EVENTS-(i+1) ) ); } } else {//just clear this one... or should we clear the whole array? - memset( &level.alertEvents[i], 0, sizeof( alertEvent_t ) ); + memset( &level.alertEvents[i], 0, sizeof( jo_alertEvent_t ) ); } } } @@ -739,12 +739,12 @@ qboolean RemoveOldestAlert( void ) {//still have more in the array if ( (oldestEvent+1) < MAX_ALERT_EVENTS ) { - memmove( &level.alertEvents[oldestEvent], &level.alertEvents[oldestEvent+1], sizeof(alertEvent_t)*(MAX_ALERT_EVENTS-(oldestEvent+1) ) ); + memmove( &level.alertEvents[oldestEvent], &level.alertEvents[oldestEvent+1], sizeof(jo_alertEvent_t)*(MAX_ALERT_EVENTS-(oldestEvent+1) ) ); } } else {//just clear this one... or should we clear the whole array? - memset( &level.alertEvents[oldestEvent], 0, sizeof( alertEvent_t ) ); + memset( &level.alertEvents[oldestEvent], 0, sizeof( jo_alertEvent_t ) ); } } //make sure this never drops below zero... if it does, something very very bad happened diff --git a/codeJK2/game/NPC_spawn.cpp b/codeJK2/game/NPC_spawn.cpp index e1599aabf2..3627d20158 100644 --- a/codeJK2/game/NPC_spawn.cpp +++ b/codeJK2/game/NPC_spawn.cpp @@ -74,7 +74,7 @@ extern void NPC_Mark2_Precache(void); extern void NPC_GalakMech_Precache( void ); extern void NPC_GalakMech_Init( gentity_t *ent ); extern void NPC_Protocol_Precache( void ); -extern int WP_SetSaberModel( gclient_t *client, class_t npcClass ); +extern int WP_SetSaberModel( jo_gclient_t *client, class_t npcClass ); #define NSF_DROP_TO_FLOOR 16 @@ -771,7 +771,7 @@ extern qboolean stop_icarus; void NPC_Begin (gentity_t *ent) { vec3_t spawn_origin, spawn_angles; - gclient_t *client; + jo_gclient_t *client; usercmd_t ucmd; gentity_t *spawnPoint = NULL; @@ -1222,7 +1222,7 @@ void NPC_Spawn_Go( gentity_t *ent ) newent->NPC->tempGoal->owner = newent; newent->NPC->tempGoal->svFlags |= SVF_NOCLIENT; - newent->client = (gclient_s *)G_Alloc (sizeof(gclient_s)); + newent->client = (jo_gclient_t *)G_Alloc (sizeof(jo_gclient_t)); if ( newent->client == NULL ) { diff --git a/codeJK2/game/NPC_stats.cpp b/codeJK2/game/NPC_stats.cpp index 4aa7aabba3..85e7cfdc69 100644 --- a/codeJK2/game/NPC_stats.cpp +++ b/codeJK2/game/NPC_stats.cpp @@ -301,9 +301,9 @@ static int MoveTypeNameToEnum( const char *name ) return MT_STATIC; } -extern void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri); +extern void CG_RegisterClientRenderInfo(jo_clientInfo_t *ci, renderInfo_t *ri); extern void CG_RegisterClientModels (int entityNum); -extern void CG_RegisterNPCCustomSounds( clientInfo_t *ci ); +extern void CG_RegisterNPCCustomSounds( jo_clientInfo_t *ci ); extern void CG_RegisterNPCEffects( team_t team ); extern void CG_ParseAnimationSndFile( const char *filename, int animFileIndex ); @@ -355,7 +355,7 @@ qboolean G_ParseAnimationFile( const char *af_filename ) //int skip; char text[40000]; int animNum; - animation_t *animations = level.knownAnimFileSets[level.numKnownAnimFileSets].animations; + jo_animation_t *animations = level.knownAnimFileSets[level.numKnownAnimFileSets].animations; len = gi.RE_GetAnimationCFG(af_filename, NULL, 0); if (len <= 0) @@ -705,7 +705,7 @@ Precaches NPC skins, tgas and md3s. */ void NPC_Precache ( gentity_t *spawner ) { - clientInfo_t ci={}; + jo_clientInfo_t ci={}; renderInfo_t ri={}; team_t playerTeam = TEAM_FREE; const char *token; @@ -1069,7 +1069,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) char sound[MAX_QPATH]; char playerModel[MAX_QPATH]; char customSkin[MAX_QPATH]; - clientInfo_t *ci = &NPC->client->clientInfo; + jo_clientInfo_t *ci = &NPC->client->clientInfo; renderInfo_t *ri = &NPC->client->renderInfo; gNPCstats_t *stats = NULL; qboolean md3Model = qtrue; diff --git a/codeJK2/game/NPC_utils.cpp b/codeJK2/game/NPC_utils.cpp index b885de820c..602fb14242 100644 --- a/codeJK2/game/NPC_utils.cpp +++ b/codeJK2/game/NPC_utils.cpp @@ -1108,7 +1108,7 @@ gentity_t *NPC_PickEnemyExt( qboolean checkAlerts = qfalse ) //There is an event to look at if ( alertEvent >= 0 ) { - alertEvent_t *event = &level.alertEvents[alertEvent]; + jo_alertEvent_t *event = &level.alertEvents[alertEvent]; //Don't pay attention to our own alerts if ( event->owner == NPC ) diff --git a/codeJK2/game/Q3_Interface.cpp b/codeJK2/game/Q3_Interface.cpp index 7a6a73c9fa..71699d58b2 100644 --- a/codeJK2/game/Q3_Interface.cpp +++ b/codeJK2/game/Q3_Interface.cpp @@ -722,7 +722,7 @@ Q3_SetObjective static void Q3_SetObjective(const char *ObjEnum, int status) { int objectiveID; - gclient_t *client; + jo_gclient_t *client; objectives_t *objective; int *objectivesShown; @@ -9265,7 +9265,7 @@ void Interface_Init( interface_export_t *pe ) pe->I_LinkEntity = ICARUS_LinkEntity; pe->saved_game = gi.saved_game; - gclient_t *client; + jo_gclient_t *client; client = &level.clients[0]; memset(&client->sess,0,sizeof(client->sess)); } diff --git a/codeJK2/game/ai.h b/codeJK2/game/ai.h index ae16d8dbc7..ad0a12c707 100644 --- a/codeJK2/game/ai.h +++ b/codeJK2/game/ai.h @@ -105,8 +105,10 @@ void NPC_BSHowler_Default( void ); //Group AI #define MAX_FRAME_GROUPS 32 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct AIGroupMember_s +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class jo_AIGroupMember_t { +public: int number; int waypoint; int pathCostToEnemy; @@ -130,12 +132,14 @@ typedef struct AIGroupMember_s saved_game->read(pathCostToEnemy); saved_game->read(closestBuddy); } -} AIGroupMember_t; +}; // jo_AIGroupMember_t #define MAX_GROUP_MEMBERS 32 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct AIGroupInfo_s +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class jo_AIGroupInfo_t { +public: int numGroup; qboolean processed; team_t team; @@ -152,7 +156,7 @@ typedef struct AIGroupInfo_s gentity_t *commander; vec3_t enemyLastSeenPos; int numState[ NUM_SQUAD_STATES ]; - AIGroupMember_t member[ MAX_GROUP_MEMBERS ]; + jo_AIGroupMember_t member[ MAX_GROUP_MEMBERS ]; void sg_export( @@ -198,7 +202,7 @@ typedef struct AIGroupInfo_s saved_game->read(numState); saved_game->read<>(member); } -} AIGroupInfo_t; +}; // jo_AIGroupInfo_t int AI_GetGroupSize( vec3_t origin, int radius, team_t playerTeam, gentity_t *avoid = NULL ); int AI_GetGroupSize( gentity_t *ent, int radius ); diff --git a/codeJK2/game/anims.h b/codeJK2/game/anims.h index 893791ef8a..8e873893bf 100644 --- a/codeJK2/game/anims.h +++ b/codeJK2/game/anims.h @@ -1399,10 +1399,12 @@ extern stringID_table_t animTable [MAX_ANIMATIONS+1]; #endif// #ifndef CG_PLAYER_CPP // !!!!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!!!! -typedef struct +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class jo_animFileSet_t { +public: char filename[MAX_QPATH]; - animation_t animations[MAX_ANIMATIONS]; + jo_animation_t animations[MAX_ANIMATIONS]; animsounds_t torsoAnimSnds[MAX_ANIM_SOUNDS]; animsounds_t legsAnimSnds[MAX_ANIM_SOUNDS]; qboolean soundsCached; @@ -1427,7 +1429,7 @@ typedef struct saved_game->read<>(legsAnimSnds); saved_game->read(soundsCached); } -} animFileSet_t; +}; // jo_animFileSet_t #define MAX_ANIM_FILES 64 #endif// #ifndef __ANIMS_H__ diff --git a/codeJK2/game/b_local.h b/codeJK2/game/b_local.h index 4b9ed50062..d450b920a8 100644 --- a/codeJK2/game/b_local.h +++ b/codeJK2/game/b_local.h @@ -82,7 +82,7 @@ extern void Debug_NPCPrintf( gentity_t *printNPC, cvar_t *cv, int debugLevel, ch //NPC_ai variables - shared by NPC.cpp andf the following modules extern gentity_t *NPC; extern gNPC_t *NPCInfo; -extern gclient_t *client; +extern jo_gclient_t *client; extern usercmd_t ucmd; extern visibility_t enemyVisibility; diff --git a/codeJK2/game/b_public.h b/codeJK2/game/b_public.h index 50abb30571..85f6671e29 100644 --- a/codeJK2/game/b_public.h +++ b/codeJK2/game/b_public.h @@ -270,7 +270,7 @@ typedef struct int lastSideStepSide; int sideStepHoldTime; int homeWp; - AIGroupInfo_t *group; + jo_AIGroupInfo_t *group; vec3_t lastPathAngles; //So we know which way to face generally when we stop diff --git a/codeJK2/game/bg_panimate.cpp b/codeJK2/game/bg_panimate.cpp index 788cc41120..b7e39c2710 100644 --- a/codeJK2/game/bg_panimate.cpp +++ b/codeJK2/game/bg_panimate.cpp @@ -1854,7 +1854,7 @@ int PM_LegsAnimForFrame( gentity_t *ent, int legsFrame ) if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) return -1; - animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + jo_animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; for ( int animation = 0; animation < FACE_TALK1; animation++ ) { @@ -1883,7 +1883,7 @@ int PM_LegsAnimForFrame( gentity_t *ent, int legsFrame ) int PM_ValidateAnimRange( int startFrame, int endFrame, float animSpeed ) {//given a startframe and endframe, see if that lines up with any known animation - animation_t *animations = level.knownAnimFileSets[0].animations; + jo_animation_t *animations = level.knownAnimFileSets[0].animations; for ( int anim = 0; anim < MAX_ANIMATIONS; anim++ ) { @@ -1932,7 +1932,7 @@ int PM_TorsoAnimForFrame( gentity_t *ent, int torsoFrame ) if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) return -1; - animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + jo_animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; for ( int animation = 0; animation < LEGS_WALKBACK1; animation++ ) { @@ -1968,7 +1968,7 @@ qboolean PM_FinishedCurrentLegsAnim( gentity_t *self ) curFrame = floor( currentFrame ); int legsAnim = self->client->ps.legsAnim; - animation_t *animations = level.knownAnimFileSets[self->client->clientInfo.animFileIndex].animations; + jo_animation_t *animations = level.knownAnimFileSets[self->client->clientInfo.animFileIndex].animations; if ( curFrame >= animations[legsAnim].firstFrame + (animations[legsAnim].numFrames - 2) ) { @@ -1999,7 +1999,7 @@ qboolean PM_HasAnimation( gentity_t *ent, int animation ) if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) return qfalse; - animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + jo_animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; //No frames, no anim if ( animations[animation].numFrames == 0 ) @@ -2235,7 +2235,7 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, #endif return; } - animation_t *animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; + jo_animation_t *animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; float timeScaleMod = PM_GetTimeScaleMod( gent ); float animSpeed, oldAnimSpeed; int actualTime = (cg.time?cg.time:level.time); diff --git a/codeJK2/game/bg_pmove.cpp b/codeJK2/game/bg_pmove.cpp index 0fb672ea5b..1d320262a9 100644 --- a/codeJK2/game/bg_pmove.cpp +++ b/codeJK2/game/bg_pmove.cpp @@ -6490,7 +6490,7 @@ qboolean PM_SaberLocked( void ) int remaining = 0; if( ValidAnimFileIndex( gent->client->clientInfo.animFileIndex ) ) { - animation_t *anim; + jo_animation_t *anim; float currentFrame, junk2; int curFrame, junk; int strength = 1; @@ -6587,7 +6587,7 @@ qboolean PM_SaberLocked( void ) } if( ValidAnimFileIndex( genemy->client->clientInfo.animFileIndex ) ) { - animation_t *anim; + jo_animation_t *anim; anim = &level.knownAnimFileSets[genemy->client->clientInfo.animFileIndex].animations[genemy->client->ps.torsoAnim]; /* float currentFrame, junk2; diff --git a/codeJK2/game/bg_public.h b/codeJK2/game/bg_public.h index e5907051a3..22ec3ad694 100644 --- a/codeJK2/game/bg_public.h +++ b/codeJK2/game/bg_public.h @@ -441,7 +441,10 @@ typedef enum { } entity_event_t; -typedef struct animation_s { +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class jo_animation_t +{ +public: int firstFrame; int numFrames; int loopFrames; // 0 to numFrames, -1 = no loop @@ -468,7 +471,7 @@ typedef struct animation_s { saved_game->read(frameLerp); saved_game->read(initialLerp); } -} animation_t; +}; // jo_animation_t #define MAX_RANDOM_ANIMSOUNDS 8 diff --git a/codeJK2/game/fields.h b/codeJK2/game/fields.h index c801467629..b08b128333 100644 --- a/codeJK2/game/fields.h +++ b/codeJK2/game/fields.h @@ -38,7 +38,7 @@ along with this program; if not, see . #endif #define STOFS(x) offsetof(spawn_temp_t, x) #define LLOFS(x) offsetof(level_locals_t, x) -#define CLOFS(x) offsetof(gclient_t, x) +#define CLOFS(x) offsetof(jo_gclient_t, x) #define NPCOFS(x) offsetof(gNPC_t, x) // #define strFOFS(x) #x,FOFS(x) diff --git a/codeJK2/game/g_active.cpp b/codeJK2/game/g_active.cpp index 77dc3847fe..0f3a69ec4f 100644 --- a/codeJK2/game/g_active.cpp +++ b/codeJK2/game/g_active.cpp @@ -419,7 +419,7 @@ global pain sound events for all clients. =============== */ void P_DamageFeedback( gentity_t *player ) { - gclient_t *client; + jo_gclient_t *client; float count; vec3_t angles; @@ -1134,7 +1134,7 @@ ClientInactivityTimer Returns qfalse if the client is dropped ================= */ -qboolean ClientInactivityTimer( gclient_t *client ) { +qboolean ClientInactivityTimer( jo_gclient_t *client ) { if ( ! g_inactivity->integer ) { // give everyone some time, so if the operator sets g_inactivity during @@ -1178,7 +1178,7 @@ Actions that happen once a second ================== */ void ClientTimerActions( gentity_t *ent, int msec ) { - gclient_t *client; + jo_gclient_t *client; client = ent->client; client->timeResidual += msec; @@ -1215,7 +1215,7 @@ void ClientTimerActions( gentity_t *ent, int msec ) { ClientIntermissionThink ==================== */ -static qboolean ClientCinematicThink( gclient_t *client ) { +static qboolean ClientCinematicThink( jo_gclient_t *client ) { client->ps.eFlags &= ~EF_FIRING; // swap button actions @@ -1241,7 +1241,7 @@ extern void WP_SaberUpdateOldBladeData( gentity_t *ent ); void ClientEvents( gentity_t *ent, int oldEventSequence ) { int i; int event; - gclient_t *client; + jo_gclient_t *client; //int damage; #ifndef FINAL_BUILD qboolean fired = qfalse; @@ -1982,7 +1982,7 @@ usually be a couple times for each server frame on fast clients. extern int G_FindLocalInterestPoint( gentity_t *self ); void ClientThink_real( gentity_t *ent, usercmd_t *ucmd ) { - gclient_t *client; + jo_gclient_t *client; pmove_t pm; vec3_t oldOrigin; int oldEventSequence; diff --git a/codeJK2/game/g_client.cpp b/codeJK2/game/g_client.cpp index 6b3570f43f..e460630588 100644 --- a/codeJK2/game/g_client.cpp +++ b/codeJK2/game/g_client.cpp @@ -382,7 +382,7 @@ ForceClientSkin Forces a client's skin (for teamplay) =========== */ -void ForceClientSkin( gclient_t *client, char *model, const char *skin ) { +void ForceClientSkin( jo_gclient_t *client, char *model, const char *skin ) { char *p; if ((p = strchr(model, '/')) != NULL) { @@ -469,7 +469,7 @@ if desired. */ void ClientUserinfoChanged( int clientNum ) { gentity_t *ent = g_entities + clientNum; - gclient_t *client = ent->client; + jo_gclient_t *client = ent->client; int health=100, maxHealth=100; const char *s=NULL, *sex=NULL; char userinfo[MAX_INFO_STRING]={0}, buf[MAX_INFO_STRING]={0}, @@ -540,12 +540,12 @@ char *ClientConnect( int clientNum, qboolean firstTime, SavedGameJustLoaded_e eS // they can connect ent->client = level.clients + clientNum; - gclient_t *client = ent->client; + jo_gclient_t *client = ent->client; // if (!qbFromSavedGame) if (eSavedGameJustLoaded != eFULL) { - clientSession_t savedSess = client->sess; // + jo_clientSession_t savedSess = client->sess; // memset( client, 0, sizeof(*client) ); client->sess = savedSess; } @@ -591,7 +591,7 @@ void ClientBegin( int clientNum, usercmd_t *cmd, SavedGameJustLoaded_e eSavedGam // qboolean qbFromSavedGame { gentity_t *ent; - gclient_t *client; + jo_gclient_t *client; ent = g_entities + clientNum; client = level.clients + clientNum; @@ -688,7 +688,7 @@ Player_RestoreFromPrevLevel */ void Player_RestoreFromPrevLevel(gentity_t *ent) { - gclient_t *client = ent->client; + jo_gclient_t *client = ent->client; int i; assert(client); @@ -1518,11 +1518,11 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded { int index; vec3_t spawn_origin, spawn_angles; - gclient_t *client; + jo_gclient_t *client; int i; jo_clientPersistant_t saved; - clientSession_t savedSess; - clientInfo_t savedCi; + jo_clientSession_t savedSess; + jo_clientInfo_t savedCi; int persistant[MAX_PERSISTANT]; usercmd_t ucmd; gentity_t *spawnPoint; @@ -1587,11 +1587,11 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded persistant[i] = client->ps.persistant[i]; } //Preserve clientInfo - memcpy (&savedCi, &client->clientInfo, sizeof(clientInfo_t)); + memcpy (&savedCi, &client->clientInfo, sizeof(jo_clientInfo_t)); memset (client, 0, sizeof(*client)); - memcpy (&client->clientInfo, &savedCi, sizeof(clientInfo_t)); + memcpy (&client->clientInfo, &savedCi, sizeof(jo_clientInfo_t)); client->pers = saved; client->sess = savedSess; diff --git a/codeJK2/game/g_cmds.cpp b/codeJK2/game/g_cmds.cpp index 668e0218c8..ac38665b24 100644 --- a/codeJK2/game/g_cmds.cpp +++ b/codeJK2/game/g_cmds.cpp @@ -125,7 +125,7 @@ Returns -1 if invalid ================== */ int ClientNumberFromString( gentity_t *to, char *s ) { - gclient_t *cl; + jo_gclient_t *cl; int idnum; char s2[MAX_STRING_CHARS]; char n2[MAX_STRING_CHARS]; diff --git a/codeJK2/game/g_combat.cpp b/codeJK2/game/g_combat.cpp index efdee55b72..684df30be6 100644 --- a/codeJK2/game/g_combat.cpp +++ b/codeJK2/game/g_combat.cpp @@ -1863,7 +1863,7 @@ static qboolean G_Dismember( gentity_t *ent, vec3_t point, gi.G2API_StopBoneAnim( &limb->ghoul2[limb->playerModel], "pelvis" ); gi.G2API_StopBoneAnim( &limb->ghoul2[limb->playerModel], "upper_lumbar" ); //FIXME: screws up origin - animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + jo_animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; //play the proper dismember anim on the limb gi.G2API_SetBoneAnim(&limb->ghoul2[limb->playerModel], 0, animations[limbAnim].firstFrame, animations[limbAnim].numFrames + animations[limbAnim].firstFrame, @@ -4303,7 +4303,7 @@ CheckArmor */ int CheckArmor (gentity_t *ent, int damage, int dflags) { - gclient_t *client; + jo_gclient_t *client; int save; int count; @@ -4794,7 +4794,7 @@ dflags these flags are used to control how T_Damage works void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_t dir, vec3_t point, int damage, int dflags, int mod, int hitLoc ) { - gclient_t *client; + jo_gclient_t *client; int take; int asave = 0; int knockback; diff --git a/codeJK2/game/g_local.h b/codeJK2/game/g_local.h index 623ec123ec..4488fd4f2d 100644 --- a/codeJK2/game/g_local.h +++ b/codeJK2/game/g_local.h @@ -129,8 +129,10 @@ enum alertEventLevel_e }; // !!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! -typedef struct alertEvent_s +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class jo_alertEvent_t { +public: vec3_t position; //Where the event is located float radius; //Consideration radius alertEventLevel_e level; //Priority level of the event @@ -169,7 +171,7 @@ typedef struct alertEvent_s saved_game->read(ID); saved_game->read(timestamp); } -} alertEvent_t; +}; // jo_alertEvent_t // // this structure is cleared as each map is entered @@ -194,7 +196,7 @@ typedef struct // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! typedef struct { - gclient_t *clients; // [maxclients] + jo_gclient_t *clients; // [maxclients] // store latched cvars here that we want to get at often int maxclients; @@ -210,13 +212,13 @@ typedef struct qboolean locationLinked; // target_locations get linked gentity_t *locationHead; // head of the location list - alertEvent_t alertEvents[ MAX_ALERT_EVENTS ]; + jo_alertEvent_t alertEvents[ MAX_ALERT_EVENTS ]; int numAlertEvents; int curAlertID; - AIGroupInfo_t groups[MAX_FRAME_GROUPS]; + jo_AIGroupInfo_t groups[MAX_FRAME_GROUPS]; - animFileSet_t knownAnimFileSets[MAX_ANIM_FILES]; + jo_animFileSet_t knownAnimFileSets[MAX_ANIM_FILES]; int numKnownAnimFileSets; int worldFlags; @@ -467,8 +469,8 @@ team_t PickTeam( int ignoreClientNum ); void SetClientViewAngle( gentity_t *ent, vec3_t angle ); gentity_t *SelectSpawnPoint ( vec3_t avoidPoint, team_t team, vec3_t origin, vec3_t angles ); void respawn (gentity_t *ent); -void InitClientPersistant (gclient_t *client); -void InitClientResp (gclient_t *client); +void InitClientPersistant (jo_gclient_t *client); +void InitClientResp (jo_gclient_t *client); qboolean ClientSpawn( gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded ); void player_die (gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int mod, int dFlags, int hitLoc); void AddScore( gentity_t *ent, int score ); @@ -572,8 +574,8 @@ void Svcmd_GameMem_f( void ); // // g_session.c // -void G_ReadSessionData( gclient_t *client ); -void G_InitSessionData( gclient_t *client, char *userinfo ); +void G_ReadSessionData( jo_gclient_t *client ); +void G_InitSessionData( jo_gclient_t *client, char *userinfo ); void G_InitWorldSession( void ); void G_WriteSessionData( void ); diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp index 88870deb8a..1de4cd183a 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -645,7 +645,7 @@ void InitGame( const char *mapname, const char *spawntarget, int checkSum, cons ClearAllInUse(); // initialize all clients for this game level.maxclients = 1; - level.clients = (struct gclient_s *) G_Alloc( level.maxclients * sizeof(level.clients[0]) ); + level.clients = (jo_gclient_t *) G_Alloc( level.maxclients * sizeof(level.clients[0]) ); memset(level.clients, 0, level.maxclients * sizeof(level.clients[0])); // set client fields on player diff --git a/codeJK2/game/g_misc_model.cpp b/codeJK2/game/g_misc_model.cpp index 3587e13903..a3e322608e 100644 --- a/codeJK2/game/g_misc_model.cpp +++ b/codeJK2/game/g_misc_model.cpp @@ -158,7 +158,7 @@ extern qboolean G_ParseAnimFileSet( const char *filename, const char *animCFG, i int temp_animFileIndex; void set_MiscAnim( gentity_t *ent) { - animation_t *animations = level.knownAnimFileSets[temp_animFileIndex].animations; + jo_animation_t *animations = level.knownAnimFileSets[temp_animFileIndex].animations; if (ent->playerModel & 1) { int anim = BOTH_STAND3; diff --git a/codeJK2/game/g_objectives.cpp b/codeJK2/game/g_objectives.cpp index 60c9ade3b9..dbd6c5c581 100644 --- a/codeJK2/game/g_objectives.cpp +++ b/codeJK2/game/g_objectives.cpp @@ -60,7 +60,7 @@ void OBJ_SetPendingObjectives(gentity_t *ent) OBJ_SaveMissionObjectives ============ */ -void OBJ_SaveMissionObjectives( gclient_t *client ) +void OBJ_SaveMissionObjectives( jo_gclient_t *client ) { ::gi.saved_game->write_chunk( INT_ID('O','B','J','T'), @@ -75,7 +75,7 @@ OBJ_SaveObjectiveData */ void OBJ_SaveObjectiveData(void) { - gclient_t *client; + jo_gclient_t *client; client = &level.clients[0]; @@ -87,7 +87,7 @@ void OBJ_SaveObjectiveData(void) OBJ_LoadMissionObjectives ============ */ -void OBJ_LoadMissionObjectives( gclient_t *client ) +void OBJ_LoadMissionObjectives( jo_gclient_t *client ) { ::gi.saved_game->read_chunk( INT_ID('O','B','J','T'), @@ -102,7 +102,7 @@ OBJ_LoadObjectiveData */ void OBJ_LoadObjectiveData(void) { - gclient_t *client; + jo_gclient_t *client; client = &level.clients[0]; diff --git a/codeJK2/game/g_public.h b/codeJK2/game/g_public.h index 960e5d82ed..e5e331300d 100644 --- a/codeJK2/game/g_public.h +++ b/codeJK2/game/g_public.h @@ -67,7 +67,7 @@ along with this program; if not, see . //=============================================================== typedef struct gentity_s gentity_t; -typedef struct gclient_s gclient_t; +//typedef struct gclient_s gclient_t; typedef enum { diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index eaa31cde66..c7df21c97e 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -239,9 +239,9 @@ gentity_t *GetGEntityPtr(intptr_t iEntNum) return (g_entities + iEntNum); } -static intptr_t GetGroupNumber(AIGroupInfo_t *pGroup) +static intptr_t GetGroupNumber(jo_AIGroupInfo_t *pGroup) { - assert( pGroup != (AIGroupInfo_t *) 0xcdcdcdcd); + assert( pGroup != (jo_AIGroupInfo_t *) 0xcdcdcdcd); if (pGroup == NULL) { @@ -256,7 +256,7 @@ static intptr_t GetGroupNumber(AIGroupInfo_t *pGroup) return iReturnIndex; } -static AIGroupInfo_t *GetGroupPtr(intptr_t iGroupNum) +static jo_AIGroupInfo_t *GetGroupPtr(intptr_t iGroupNum) { if (iGroupNum == -1) { @@ -272,9 +272,9 @@ static AIGroupInfo_t *GetGroupPtr(intptr_t iGroupNum) /////////// gclient_t * //////// // // -intptr_t GetGClientNum(gclient_t *c) +intptr_t GetGClientNum(jo_gclient_t *c) { - assert(c != (gclient_t *)0xcdcdcdcd); + assert(c != (jo_gclient_t *)0xcdcdcdcd); if (c == NULL) { @@ -284,7 +284,7 @@ intptr_t GetGClientNum(gclient_t *c) return (c - level.clients); } -gclient_t *GetGClientPtr(intptr_t c) +jo_gclient_t *GetGClientPtr(intptr_t c) { if (c == -1) { @@ -292,7 +292,7 @@ gclient_t *GetGClientPtr(intptr_t c) } if (c == -2) { - return (gclient_t *) -2; // preserve this value so that I know to load in one of Mike's private NPC clients later + return (jo_gclient_t *) -2; // preserve this value so that I know to load in one of Mike's private NPC clients later } assert(c >= 0); @@ -350,7 +350,7 @@ void EnumerateField(const field_t *pField, byte *pbBase) break; case F_GROUP: - *(intptr_t *)pv = GetGroupNumber(*(AIGroupInfo_t **)pv); + *(intptr_t *)pv = GetGroupNumber(*(jo_AIGroupInfo_t **)pv); break; case F_GCLIENT: @@ -364,7 +364,7 @@ void EnumerateField(const field_t *pField, byte *pbBase) { // regular client... // - *(intptr_t *)pv = GetGClientNum(*(gclient_t **)pv); + *(intptr_t *)pv = GetGClientNum(*(jo_gclient_t **)pv); break; } else @@ -406,7 +406,7 @@ void EnumerateField(const field_t *pField, byte *pbBase) case F_ALERTEVENT: // convert all gentity_t ptrs in an alertEvent array into indexes... { - alertEvent_t* p = (alertEvent_t *) pv; + jo_alertEvent_t* p = (jo_alertEvent_t *) pv; for (int i=0; iclient; // NOT *tempEnt.client!! + jo_gclient_t client = *ent->client; // NOT *tempEnt.client!! EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I'), sizeof(client)); } @@ -873,9 +873,9 @@ static void ReadGEntities(qboolean qbAutosave) } - if (pEnt->client == (gclient_t*) -2) // one of Mike G's NPC clients? + if (pEnt->client == (jo_gclient_t*) -2) // one of Mike G's NPC clients? { - gclient_t tempGClient; + jo_gclient_t tempGClient; EvaluateFields(savefields_gClient, &tempGClient, pEntOriginal->client, INT_ID('G','C','L','I'), sizeof(*pEnt->client),qfalse); @@ -891,7 +891,7 @@ static void ReadGEntities(qboolean qbAutosave) { // original didn't have one (hmmm...) so make a new one... // - pEnt->client = (gclient_t *) G_Alloc(sizeof(*pEnt->client)); + pEnt->client = (jo_gclient_t *) G_Alloc(sizeof(*pEnt->client)); } // copy over the one we've just loaded.... @@ -1021,7 +1021,7 @@ void WriteLevel(qboolean qbAutosave) // write out one client - us! // assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way ReadGame works - gclient_t client = level.clients[0]; + jo_gclient_t client = level.clients[0]; EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I'), sizeof(client)); WriteLevelLocals(); // level_locals_t level } @@ -1063,7 +1063,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) //SO: We read it in, but throw it away. //Read & throw away gclient info - gclient_t junkClient; + jo_gclient_t junkClient; EvaluateFields(savefields_gClient, &junkClient, &level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qfalse); //Read & throw away objective info @@ -1078,7 +1078,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) { assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way things work - gclient_t GClient; + jo_gclient_t GClient; EvaluateFields(savefields_gClient, &GClient, &level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qfalse); level.clients[0] = GClient; // struct copy ReadLevelLocals(); // level_locals_t level diff --git a/codeJK2/game/g_session.cpp b/codeJK2/game/g_session.cpp index 1499dfa09d..44657d2bd0 100644 --- a/codeJK2/game/g_session.cpp +++ b/codeJK2/game/g_session.cpp @@ -43,7 +43,7 @@ G_WriteClientSessionData Called on game shutdown ================ */ -void G_WriteClientSessionData( gclient_t *client ) { +void G_WriteClientSessionData( jo_gclient_t *client ) { const char *s; const char *s2; const char *var; @@ -109,7 +109,7 @@ G_ReadSessionData Called on a reconnect ================ */ -void G_ReadSessionData( gclient_t *client ) { +void G_ReadSessionData( jo_gclient_t *client ) { char s[MAX_STRING_CHARS]; const char *var; int i; @@ -188,8 +188,8 @@ G_InitSessionData Called on a first-time connect ================ */ -void G_InitSessionData( gclient_t *client, char *userinfo ) { - clientSession_t *sess; +void G_InitSessionData( jo_gclient_t *client, char *userinfo ) { + jo_clientSession_t *sess; sess = &client->sess; diff --git a/codeJK2/game/g_shared.h b/codeJK2/game/g_shared.h index a9b0c9995c..f9e108eba8 100644 --- a/codeJK2/game/g_shared.h +++ b/codeJK2/game/g_shared.h @@ -121,7 +121,10 @@ typedef enum //# material_e #define MAX_CUSTOM_JEDI_SOUNDS 22 #define MAX_CUSTOM_SOUNDS (MAX_CUSTOM_JEDI_SOUNDS + MAX_CUSTOM_EXTRA_SOUNDS + MAX_CUSTOM_COMBAT_SOUNDS + MAX_CUSTOM_BASIC_SOUNDS) // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct { +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class jo_clientInfo_t +{ +public: qboolean infoValid; char name[MAX_QPATH]; @@ -196,7 +199,7 @@ typedef struct { saved_game->read(customExtraSoundDir); saved_game->read(customJediSoundDir); } -} clientInfo_t; +}; // jo_clientInfo_t //================================================================== @@ -604,7 +607,10 @@ typedef struct missionStats_s // MUST be dealt with in G_InitSessionData() / G_ReadSessionData() / G_WriteSessionData() // // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct { +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class jo_clientSession_t +{ +public: int missionObjectivesShown; // Number of times mission objectives have been updated team_t sessionTeam; objectives_t mission_objectives[MAX_MISSION_OBJ]; @@ -628,7 +634,7 @@ typedef struct { saved_game->read<>(mission_objectives); saved_game->read<>(missionStats); } -} clientSession_t; +}; // jo_clientSession_t // client data that stays across multiple respawns, but is cleared // on each level change or team change at ClientBegin() @@ -704,13 +710,16 @@ typedef enum { // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! // this structure is cleared on each ClientSpawn(), // except for 'client->pers' and 'client->sess' -struct gclient_s { +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class jo_gclient_t +{ +public: // ps MUST be the first element, because the server expects it playerState_t ps; // communicated by server to clients // private to game jo_clientPersistant_t pers; - clientSession_t sess; + jo_clientSession_t sess; qboolean noclip; @@ -751,7 +760,7 @@ struct gclient_s { float facial_aux; // time before next aux. If a minus value, we are in aux mode //Client info - updated when ClientInfoChanged is called, instead of using configstrings - clientInfo_t clientInfo; + jo_clientInfo_t clientInfo; signed char forced_forwardmove; signed char forced_rightmove; int fireDelay; //msec to delay calling G_FireWeapon after EV_FIREWEAPON event is called @@ -916,7 +925,7 @@ struct gclient_s { saved_game->read(pushVec); saved_game->read(pushVecTime); } -}; +}; // jo_gclient_t #define MAX_PARMS 16 #define MAX_PARM_STRING_LENGTH MAX_QPATH//was 16, had to lengthen it so they could take a valid file path @@ -956,7 +965,7 @@ typedef struct centity_s centity_t; struct gentity_s { entityState_t s; // communicated by server to clients - struct gclient_s *client; // NULL if not a player (unless it's NPC ( if (this->NPC != NULL) ) ... -slc) + jo_gclient_t *client; // NULL if not a player (unless it's NPC ( if (this->NPC != NULL) ) ... -slc) qboolean inuse; qboolean linked; // qfalse if not in any good cluster diff --git a/codeJK2/game/g_svcmds.cpp b/codeJK2/game/g_svcmds.cpp index 83b28a27d4..7f122a0135 100644 --- a/codeJK2/game/g_svcmds.cpp +++ b/codeJK2/game/g_svcmds.cpp @@ -78,8 +78,8 @@ void Svcmd_EntityList_f (void) { } } -gclient_t *ClientForString( const char *s ) { - gclient_t *cl; +jo_gclient_t *ClientForString( const char *s ) { + jo_gclient_t *cl; int i; int idnum; diff --git a/codeJK2/game/g_target.cpp b/codeJK2/game/g_target.cpp index bfa38e1985..3c12415605 100644 --- a/codeJK2/game/g_target.cpp +++ b/codeJK2/game/g_target.cpp @@ -1072,7 +1072,7 @@ void SP_target_autosave( gentity_t *self ) void target_secret_use(gentity_t *self, gentity_t *other, gentity_t *activator) { //we'll assume that the activator is the player - gclient_t* const client = &level.clients[0]; + jo_gclient_t* const client = &level.clients[0]; client->sess.missionStats.secretsFound++; if ( activator ) { diff --git a/codeJK2/game/wp_saber.cpp b/codeJK2/game/wp_saber.cpp index 1b5f5fcb40..c72c3a4fd6 100644 --- a/codeJK2/game/wp_saber.cpp +++ b/codeJK2/game/wp_saber.cpp @@ -362,7 +362,7 @@ void G_Throw( gentity_t *targ, vec3_t newDir, float push ) } } -int WP_SetSaberModel( gclient_t *client, class_t npcClass ) +int WP_SetSaberModel( jo_gclient_t *client, class_t npcClass ) { if ( client ) { @@ -1862,7 +1862,7 @@ extern void PM_SetAnimFrame( gentity_t *gent, int frame, qboolean torso, qboolea extern qboolean ValidAnimFileIndex ( int index ); qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLockMode_t lockMode ) { - animation_t *anim; + jo_animation_t *anim; int attAnim, defAnim, advance = 0; float attStart = 0.5f; float idealDist = 48.0f; From 62edd3c44494c13a12818c342401d196830f7e7d Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Fri, 22 Jul 2016 22:10:29 +0300 Subject: [PATCH 265/445] Rename saved game affected classes --- code/cgame/cg_main.cpp | 2 +- code/cgame/cg_players.cpp | 2 +- code/game/AI_HazardTrooper.cpp | 2 +- code/game/NPC.cpp | 8 +++--- code/game/NPC_spawn.cpp | 2 +- code/game/NPC_stats.cpp | 8 +++--- code/game/Q3_Interface.cpp | 6 ++--- code/game/b_local.h | 2 +- code/game/b_public.h | 13 ++++++---- code/game/fields.h | 4 +-- code/game/g_local.h | 8 +++--- code/game/g_main.cpp | 2 +- code/game/g_public.h | 3 ++- code/game/g_savegame.cpp | 14 +++++------ code/game/g_shared.h | 43 +++++++++++++++++++------------ code/qcommon/msg.cpp | 2 +- code/qcommon/q_shared.h | 7 ++++-- code/qcommon/qcommon.h | 6 ++--- code/ui/ui_main.cpp | 7 +++--- codeJK2/cgame/cg_main.cpp | 2 +- codeJK2/cgame/cg_players.cpp | 2 +- codeJK2/game/NPC.cpp | 4 +-- codeJK2/game/NPC_spawn.cpp | 4 +-- codeJK2/game/NPC_stats.cpp | 8 +++--- codeJK2/game/Q3_Interface.cpp | 6 ++--- codeJK2/game/b_local.h | 2 +- codeJK2/game/b_public.h | 13 ++++++---- codeJK2/game/fields.h | 4 +-- codeJK2/game/g_local.h | 8 +++--- codeJK2/game/g_main.cpp | 2 +- codeJK2/game/g_savegame.cpp | 14 +++++------ codeJK2/game/g_shared.h | 46 +++++++++++++++++++++------------- 32 files changed, 147 insertions(+), 109 deletions(-) diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index d704b8a06b..f6d955a055 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -990,7 +990,7 @@ Ghoul2 Insert End } -void CG_RegisterClientRenderInfo(ja_clientInfo_t *ci, renderInfo_t *ri) +void CG_RegisterClientRenderInfo(ja_clientInfo_t *ci, ja_renderInfo_t *ri) { char *slash; char headModelName[MAX_QPATH]; diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index bbbe47613b..25d3abb80d 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -1811,7 +1811,7 @@ CG_AddHeadBob */ static qboolean CG_AddHeadBob( centity_t *cent, vec3_t addTo ) { - renderInfo_t *renderInfo = ¢->gent->client->renderInfo; + ja_renderInfo_t *renderInfo = ¢->gent->client->renderInfo; const int volume = gi.VoiceVolume[cent->gent->s.clientNum]; const int volChange = volume - renderInfo->lastVoiceVolume;//was *3 because voice fromLA was too low int i; diff --git a/code/game/AI_HazardTrooper.cpp b/code/game/AI_HazardTrooper.cpp index fd4e6beeae..d5f6f82e08 100644 --- a/code/game/AI_HazardTrooper.cpp +++ b/code/game/AI_HazardTrooper.cpp @@ -452,7 +452,7 @@ class CTroop float targetNoiseLevel; gentity_t* scanner = mActors[scannerIndex]; - gNPCstats_t* scannerStats = &(scanner->NPC->stats); + ja_gNPCstats_t* scannerStats = &(scanner->NPC->stats); float scannerMaxViewDist = scannerStats->visrange; float scannerMinVisability = 0.1f;//1.0f - scannerStats->vigilance; float scannerMaxHearDist = scannerStats->earshot; diff --git a/code/game/NPC.cpp b/code/game/NPC.cpp index 885eeb46ba..f46e8d8fbc 100644 --- a/code/game/NPC.cpp +++ b/code/game/NPC.cpp @@ -76,13 +76,13 @@ cvar_t *d_slowmodeath; extern qboolean stop_icarus; gentity_t *NPC; -gNPC_t *NPCInfo; +ja_gNPC_t *NPCInfo; ja_gclient_t *client; usercmd_t ucmd; visibility_t enemyVisibility; void NPC_SetAnim(gentity_t *ent,int setAnimParts,int anim,int setAnimFlags, int iBlend); -static bState_t G_CurrentBState( gNPC_t *gNPC ); +static bState_t G_CurrentBState( ja_gNPC_t *gNPC ); extern int eventClearTime; @@ -914,7 +914,7 @@ void SetNPCGlobals( gentity_t *ent ) } gentity_t *_saved_NPC; -gNPC_t *_saved_NPCInfo; +ja_gNPC_t *_saved_NPCInfo; ja_gclient_t *_saved_client; usercmd_t _saved_ucmd; @@ -2137,7 +2137,7 @@ void NPC_RunBehavior( int team, int bState ) } } -static bState_t G_CurrentBState( gNPC_t *gNPC ) +static bState_t G_CurrentBState( ja_gNPC_t *gNPC ) { if ( gNPC->tempBehavior != BS_DEFAULT ) {//Overrides normal behavior until cleared diff --git a/code/game/NPC_spawn.cpp b/code/game/NPC_spawn.cpp index 02719e14d4..a593d4f6fe 100644 --- a/code/game/NPC_spawn.cpp +++ b/code/game/NPC_spawn.cpp @@ -1517,7 +1517,7 @@ gentity_t *NPC_Spawn_Do( gentity_t *ent, qboolean fullSpawnNow ) newent->NPC_type = Q_strlwr( G_NewString( ent->NPC_type ) ); //get my own copy so i can free it when i die } - newent->NPC = (gNPC_t*) gi.Malloc(sizeof(gNPC_t), TAG_G_ALLOC, qtrue); + newent->NPC = (ja_gNPC_t*) gi.Malloc(sizeof(ja_gNPC_t), TAG_G_ALLOC, qtrue); newent->NPC->tempGoal = G_Spawn(); diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index caf851f0ec..01e29cd664 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -356,7 +356,7 @@ static int MoveTypeNameToEnum( const char *name ) return MT_STATIC; } -extern void CG_RegisterClientRenderInfo(ja_clientInfo_t *ci, renderInfo_t *ri); +extern void CG_RegisterClientRenderInfo(ja_clientInfo_t *ci, ja_renderInfo_t *ri); extern void CG_RegisterClientModels (int entityNum); extern void CG_RegisterNPCCustomSounds( ja_clientInfo_t *ci ); @@ -1578,7 +1578,7 @@ Precaches NPC skins, tgas and md3s. void CG_NPC_Precache ( gentity_t *spawner ) { ja_clientInfo_t ci={}; - renderInfo_t ri={}; + ja_renderInfo_t ri={}; team_t playerTeam = TEAM_FREE; const char *token; const char *value; @@ -1942,8 +1942,8 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) char playerModel[MAX_QPATH]; char customSkin[MAX_QPATH]; ja_clientInfo_t *ci = &NPC->client->clientInfo; - renderInfo_t *ri = &NPC->client->renderInfo; - gNPCstats_t *stats = NULL; + ja_renderInfo_t *ri = &NPC->client->renderInfo; + ja_gNPCstats_t *stats = NULL; qboolean md3Model = qtrue; char surfOff[1024]={0}; char surfOn[1024]={0}; diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 7f3c1a65f8..a527a58406 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -752,7 +752,7 @@ static void Q3_SetObjective(const char *ObjEnum, int status) { int objectiveID; ja_gclient_t *client; - objectives_t *objective; + ja_objectives_t *objective; int *objectivesShown; client = &level.clients[0]; @@ -4077,8 +4077,8 @@ void Q3_SetParm (int entID, int parmNum, const char *parmValue) if( !ent->parms ) { - ent->parms = (parms_t *)G_Alloc( sizeof(parms_t) ); - memset( ent->parms, 0, sizeof(parms_t) ); + ent->parms = (ja_parms_t *)G_Alloc( sizeof(ja_parms_t) ); + memset( ent->parms, 0, sizeof(ja_parms_t) ); } if ( (val = Q3_CheckStringCounterIncrement( parmValue )) ) diff --git a/code/game/b_local.h b/code/game/b_local.h index 0814fc8bf2..a49df8d6ae 100644 --- a/code/game/b_local.h +++ b/code/game/b_local.h @@ -80,7 +80,7 @@ extern void Debug_NPCPrintf( gentity_t *printNPC, cvar_t *cv, int debugLevel, ch //MCG - Begin============================================================ //NPC_ai variables - shared by NPC.cpp andf the following modules extern gentity_t *NPC; -extern gNPC_t *NPCInfo; +extern ja_gNPC_t *NPCInfo; extern ja_gclient_t *client; extern usercmd_t ucmd; extern visibility_t enemyVisibility; diff --git a/code/game/b_public.h b/code/game/b_public.h index a547fab767..f2054f0a42 100644 --- a/code/game/b_public.h +++ b/code/game/b_public.h @@ -132,8 +132,9 @@ typedef enum } sexType_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct gNPCstats_e +class ja_gNPCstats_t {//Stats, loaded in, and can be set by scripts +public: //AI int aggression; // " int aim; // " @@ -202,7 +203,7 @@ typedef struct gNPCstats_e saved_game->read(acceleration); saved_game->read(sex); } -} gNPCstats_t; +}; // ja_gNPCstats_t #define MAX_ENEMY_POS_LAG 2400 @@ -210,8 +211,10 @@ typedef struct gNPCstats_e #define ENEMY_POS_LAG_STEPS (MAX_ENEMY_POS_LAG/ENEMY_POS_LAG_INTERVAL) // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class ja_gNPC_t { +public: //FIXME: Put in playerInfo or something int timeOfDeath; //FIXME do we really need both of these gentity_t *touchedByPlayer; @@ -298,7 +301,7 @@ typedef struct vec3_t lastPathAngles; //So we know which way to face generally when we stop //stats - gNPCstats_t stats; + ja_gNPCstats_t stats; int aimErrorDebounceTime; float lastAimErrorYaw; float lastAimErrorPitch; @@ -622,7 +625,7 @@ typedef struct saved_game->read(ffireDebounce); saved_game->read(ffireFadeDebounce); } -} gNPC_t; +}; // ja_gNPC_t void G_SquadPathsInit(void); diff --git a/code/game/fields.h b/code/game/fields.h index 877ececa20..ba7bb10294 100644 --- a/code/game/fields.h +++ b/code/game/fields.h @@ -37,9 +37,9 @@ along with this program; if not, see . #define FOFS(x) offsetof(gentity_t, x) // usually already defined in qshared.h #endif #define STOFS(x) offsetof(spawn_temp_t, x) -#define LLOFS(x) offsetof(level_locals_t, x) +#define LLOFS(x) offsetof(ja_level_locals_t, x) #define CLOFS(x) offsetof(ja_gclient_t, x) -#define NPCOFS(x) offsetof(gNPC_t, x) +#define NPCOFS(x) offsetof(ja_gNPC_t, x) #define VHOFS(x) offsetof(Vehicle_t, x) // diff --git a/code/game/g_local.h b/code/game/g_local.h index 9da71d54ee..3502333f35 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -239,8 +239,10 @@ typedef struct #define WF_PUFFING 0x00000004 // puffing something // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class ja_level_locals_t { +public: ja_gclient_t *clients; // [maxclients] // store latched cvars here that we want to get at often @@ -343,9 +345,9 @@ typedef struct saved_game->read(worldFlags); saved_game->read(dmState); } -} level_locals_t; +}; // ja_level_locals_t -extern level_locals_t level; +extern ja_level_locals_t level; extern game_export_t globals; extern cvar_t *g_gravity; diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 4475289467..0d75924e98 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -62,7 +62,7 @@ extern qboolean g_bCollidableRoffs; #define STEPSIZE 18 -level_locals_t level; +ja_level_locals_t level; game_import_t gi; game_export_t globals; gentity_t g_entities[MAX_GENTITIES]; diff --git a/code/game/g_public.h b/code/game/g_public.h index 08cf22cb71..0465c27a7e 100644 --- a/code/game/g_public.h +++ b/code/game/g_public.h @@ -90,10 +90,11 @@ typedef enum #ifndef GAME_INCLUDE // the server needs to know enough information to handle collision and snapshot generation +class playerState_t; struct gentity_s { entityState_t s; // communicated by server to clients - struct playerState_s *client; + playerState_t *client; qboolean inuse; qboolean linked; // qfalse if not in any good cluster diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index 31dcbaed80..25a362c2a3 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -835,7 +835,7 @@ All pointer variables (except function pointers) must be handled specially. */ static void WriteLevelLocals () { - level_locals_t *temp = (level_locals_t *)gi.Malloc(sizeof(level_locals_t), TAG_TEMP_WORKSPACE, qfalse); + ja_level_locals_t *temp = (ja_level_locals_t *)gi.Malloc(sizeof(ja_level_locals_t), TAG_TEMP_WORKSPACE, qfalse); *temp = level; // copy out all data into a temp space EnumerateFields(savefields_LevelLocals, temp, INT_ID('L','V','L','C'), LLOFS(LEVEL_LOCALS_T_SAVESTOP)); // sizeof(temp)); @@ -855,7 +855,7 @@ static void ReadLevelLocals () // ja_gclient_t *pClients = level.clients; // save clients - level_locals_t *temp = (level_locals_t *)gi.Malloc(sizeof(level_locals_t), TAG_TEMP_WORKSPACE, qfalse); + ja_level_locals_t *temp = (ja_level_locals_t *)gi.Malloc(sizeof(ja_level_locals_t), TAG_TEMP_WORKSPACE, qfalse); *temp = level; // struct copy EvaluateFields(savefields_LevelLocals, temp, (byte *)&level, INT_ID('L','V','L','C'), LLOFS(LEVEL_LOCALS_T_SAVESTOP),qfalse); // sizeof(level_locals_t)); level = *temp; // struct copy @@ -909,7 +909,7 @@ static void WriteGEntities(qboolean qbAutosave) // if (tempEnt.NPC) { - gNPC_t npc = *ent->NPC; // NOT *tempEnt.NPC; !! :-) + ja_gNPC_t npc = *ent->NPC; // NOT *tempEnt.NPC; !! :-) EnumerateFields(savefields_gNPC, &npc, INT_ID('G','N','P','C'), sizeof(npc)); } @@ -1022,7 +1022,7 @@ static void ReadGEntities(qboolean qbAutosave) // if (pEnt->NPC) // will be qtrue/qfalse { - gNPC_t tempNPC; + ja_gNPC_t tempNPC; EvaluateFields(savefields_gNPC, &tempNPC,(byte *)pEntOriginal->NPC, INT_ID('G','N','P','C'), sizeof (*pEnt->NPC),qfalse); @@ -1039,7 +1039,7 @@ static void ReadGEntities(qboolean qbAutosave) // original didn't have one (hmmm...), so make a new one... // //assert(0); // I want to know about this, though not in release - pEnt->NPC = (gNPC_t *) G_Alloc(sizeof(*pEnt->NPC)); + pEnt->NPC = (ja_gNPC_t *) G_Alloc(sizeof(*pEnt->NPC)); } // copy over the one we've just loaded... @@ -1091,7 +1091,7 @@ static void ReadGEntities(qboolean qbAutosave) // if (pEnt->parms) // will be qtrue/qfalse { - parms_t tempParms; + ja_parms_t tempParms; ::gi.saved_game->read_chunk( INT_ID('P','A','R','M'), @@ -1109,7 +1109,7 @@ static void ReadGEntities(qboolean qbAutosave) { // original didn't have one, so make a new one... // - pEnt->parms = (parms_t *) G_Alloc(sizeof(*pEnt->parms)); + pEnt->parms = (ja_parms_t *) G_Alloc(sizeof(*pEnt->parms)); } // copy over the one we've just loaded... diff --git a/code/game/g_shared.h b/code/game/g_shared.h index ddf8aa5d26..8fe7f2aefb 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -198,8 +198,10 @@ typedef enum #define RF_LOCKEDANGLE 1 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct renderInfo_s +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class ja_renderInfo_t { +public: // Legs model, or full model on one piece entities union @@ -402,7 +404,7 @@ typedef struct renderInfo_s saved_game->read(lookingDebounceTime); saved_game->read(legsYaw); } -} renderInfo_t; +}; // ja_renderInfo_t // Movement information structure @@ -430,7 +432,10 @@ typedef enum { } playerTeamStateState_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct { +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class ja_playerTeamState_t +{ +public: playerTeamStateState_t state; int captures; @@ -477,11 +482,13 @@ typedef struct { saved_game->read(flagsince); saved_game->read(lastfraggedcarrier); } -} playerTeamState_t; +}; // ja_playerTeamState_t // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct objectives_s +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class ja_objectives_t { +public: qboolean display; // A displayable objective? int status; // Succeed or fail or pending @@ -499,14 +506,16 @@ typedef struct objectives_s saved_game->read(display); saved_game->read(status); } -} objectives_t; +}; // ja_objectives_t // NOTE: This is an arbitrary number greater than our current number of objectives with // some fluff just in case we add more in the future. #define MAX_MISSION_OBJ 100 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct missionStats_s +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class ja_missionStats_t { +public: int secretsFound; // # of secret areas found int totalSecrets; // # of secret areas that could have been found int shotsFired; // total number of shots fired @@ -560,7 +569,7 @@ typedef struct missionStats_s saved_game->read(forceUsed); saved_game->read(weaponUsed); } -} missionStats_t; +}; // ja_missionStats_t // the auto following clients don't follow a specific client // number, but instead follow the first two active players @@ -579,8 +588,8 @@ class ja_clientSession_t public: int missionObjectivesShown; // Number of times mission objectives have been updated team_t sessionTeam; - objectives_t mission_objectives[MAX_MISSION_OBJ]; - missionStats_t missionStats; // Various totals while on a mission + ja_objectives_t mission_objectives[MAX_MISSION_OBJ]; + ja_missionStats_t missionStats; // Various totals while on a mission void sg_export( @@ -616,7 +625,7 @@ class ja_clientPersistant_t int enterTime; // level.time the client entered the game short cmd_angles[3]; // angles sent over in the last command - playerTeamState_t teamState; // status in teamplay games + ja_playerTeamState_t teamState; // status in teamplay games void sg_export( @@ -744,7 +753,7 @@ class ja_gclient_t float hiddenDist;//How close ents have to be to pick you up as an enemy vec3_t hiddenDir;//Normalized direction in which NPCs can't see you (you are hidden) - renderInfo_t renderInfo; + ja_renderInfo_t renderInfo; //dismember tracker bool dismembered; @@ -919,8 +928,10 @@ class ja_gclient_t #define MAX_PARMS 16 #define MAX_PARM_STRING_LENGTH MAX_QPATH//was 16, had to lengthen it so they could take a valid file path -typedef struct +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class ja_parms_t { +public: char parm[MAX_PARMS][MAX_PARM_STRING_LENGTH]; @@ -935,7 +946,7 @@ typedef struct { saved_game->read(parm); } -} parms_t; +}; // ja_parms_t #ifdef GAME_INCLUDE //these hold the place for the enums in functions.h so i don't have to recompile everytime it changes @@ -1135,7 +1146,7 @@ Ghoul2 Insert End //Script/ICARUS-related fields int m_iIcarusID; int taskID[NUM_TIDS]; - parms_t *parms; + ja_parms_t *parms; char *behaviorSet[NUM_BSETS]; char *script_targetname; int delayScriptTime; @@ -1202,7 +1213,7 @@ Ghoul2 Insert End //NPC/Player entity fields //FIXME: Make these client only? - gNPC_t *NPC;//Only allocated if the entity becomes an NPC + ja_gNPC_t *NPC;//Only allocated if the entity becomes an NPC //Other NPC/Player-related entity fields char *ownername;//Used by squadpaths to locate owning NPC diff --git a/code/qcommon/msg.cpp b/code/qcommon/msg.cpp index 1a351508e3..dc23211555 100644 --- a/code/qcommon/msg.cpp +++ b/code/qcommon/msg.cpp @@ -1026,7 +1026,7 @@ MSG_WriteDeltaPlayerstate ============= */ -void MSG_WriteDeltaPlayerstate( msg_t *msg, struct playerState_s *from, struct playerState_s *to ) { +void MSG_WriteDeltaPlayerstate( msg_t *msg, playerState_t *from, playerState_t *to ) { int i; playerState_t dummy; int statsbits; diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 0186889513..54ef294ea0 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -2278,7 +2278,10 @@ typedef struct // so if a playerState_t is transmitted, the entityState_t can be fully derived // from it. // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct playerState_s { +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class playerState_t +{ +public: int commandTime; // cmd->serverTime of last executed command int pm_type; int bobCycle; // for view bobbing and footstep generation @@ -2864,7 +2867,7 @@ typedef struct playerState_s { saved_game->read(brokenLimbs); saved_game->read(electrifyTime); } -} playerState_t; +}; // playerState_t //==================================================================== diff --git a/code/qcommon/qcommon.h b/code/qcommon/qcommon.h index bd79f4b51f..483b85b107 100644 --- a/code/qcommon/qcommon.h +++ b/code/qcommon/qcommon.h @@ -68,7 +68,7 @@ void MSG_WriteData (msg_t *buf, const void *data, int length); struct usercmd_s; struct entityState_s; -struct playerState_s; +class playerState_t; void MSG_WriteBits( msg_t *msg, int value, int bits ); @@ -99,8 +99,8 @@ void MSG_ReadDeltaEntity( msg_t *msg, entityState_t *from, entityState_t *to, void MSG_ReadEntity( msg_t *msg, entityState_t *to); void MSG_WriteEntity( msg_t *msg, entityState_t *to, int removeNum); -void MSG_WriteDeltaPlayerstate( msg_t *msg, struct playerState_s *from, struct playerState_s *to ); -void MSG_ReadDeltaPlayerstate( msg_t *msg, struct playerState_s *from, struct playerState_s *to ); +void MSG_WriteDeltaPlayerstate( msg_t *msg, playerState_t *from, playerState_t *to ); +void MSG_ReadDeltaPlayerstate( msg_t *msg, playerState_t *from, playerState_t *to ); /* ============================================================== diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 3f48716c2e..2b790af4ac 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -2017,12 +2017,13 @@ static qboolean UI_OwnerDrawHandleKey(int ownerDraw, int flags, float *special, //because the ui can be loaded while the game/cgame are not loaded. So we're going to recreate what we need here. #undef MAX_ANIM_FILES #define MAX_ANIM_FILES 4 -typedef struct +class ui_animFileSet_t { +public: char filename[MAX_QPATH]; ja_animation_t animations[MAX_ANIMATIONS]; -} animFileSet_t; -static animFileSet_t ui_knownAnimFileSets[MAX_ANIM_FILES]; +}; // ui_animFileSet_t +static ui_animFileSet_t ui_knownAnimFileSets[MAX_ANIM_FILES]; int ui_numKnownAnimFileSets; diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index 7b2e5c2d0d..709f4430e5 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -939,7 +939,7 @@ Ghoul2 Insert End } -void CG_RegisterClientRenderInfo(jo_clientInfo_t *ci, renderInfo_t *ri) +void CG_RegisterClientRenderInfo(jo_clientInfo_t *ci, jo_renderInfo_t *ri) { char *slash; char headModelName[MAX_QPATH]; diff --git a/codeJK2/cgame/cg_players.cpp b/codeJK2/cgame/cg_players.cpp index 5f544bd054..7aea958e0c 100644 --- a/codeJK2/cgame/cg_players.cpp +++ b/codeJK2/cgame/cg_players.cpp @@ -1666,7 +1666,7 @@ CG_AddHeadBob */ static qboolean CG_AddHeadBob( centity_t *cent, vec3_t addTo ) { - renderInfo_t *renderInfo = ¢->gent->client->renderInfo; + jo_renderInfo_t *renderInfo = ¢->gent->client->renderInfo; const int volume = gi.VoiceVolume[cent->gent->s.clientNum]; const int volChange = volume - renderInfo->lastVoiceVolume;//was *3 because voice fromLA was too low int i; diff --git a/codeJK2/game/NPC.cpp b/codeJK2/game/NPC.cpp index c301664763..b6a69e2224 100644 --- a/codeJK2/game/NPC.cpp +++ b/codeJK2/game/NPC.cpp @@ -75,7 +75,7 @@ cvar_t *d_slowmodeath; extern qboolean stop_icarus; gentity_t *NPC; -gNPC_t *NPCInfo; +jo_gNPC_t *NPCInfo; jo_gclient_t *client; usercmd_t ucmd; visibility_t enemyVisibility; @@ -817,7 +817,7 @@ void SetNPCGlobals( gentity_t *ent ) } gentity_t *_saved_NPC; -gNPC_t *_saved_NPCInfo; +jo_gNPC_t *_saved_NPCInfo; jo_gclient_t *_saved_client; usercmd_t _saved_ucmd; diff --git a/codeJK2/game/NPC_spawn.cpp b/codeJK2/game/NPC_spawn.cpp index 3627d20158..c3faba73ce 100644 --- a/codeJK2/game/NPC_spawn.cpp +++ b/codeJK2/game/NPC_spawn.cpp @@ -1070,9 +1070,9 @@ void NPC_Begin (gentity_t *ent) } } -gNPC_t *New_NPC_t() +jo_gNPC_t *New_NPC_t() { - gNPC_t *ptr = (gNPC_t *)G_Alloc (sizeof(gNPC_t)); + jo_gNPC_t *ptr = (jo_gNPC_t *)G_Alloc (sizeof(jo_gNPC_t)); if (ptr) { diff --git a/codeJK2/game/NPC_stats.cpp b/codeJK2/game/NPC_stats.cpp index 85e7cfdc69..1eec8d1da2 100644 --- a/codeJK2/game/NPC_stats.cpp +++ b/codeJK2/game/NPC_stats.cpp @@ -301,7 +301,7 @@ static int MoveTypeNameToEnum( const char *name ) return MT_STATIC; } -extern void CG_RegisterClientRenderInfo(jo_clientInfo_t *ci, renderInfo_t *ri); +extern void CG_RegisterClientRenderInfo(jo_clientInfo_t *ci, jo_renderInfo_t *ri); extern void CG_RegisterClientModels (int entityNum); extern void CG_RegisterNPCCustomSounds( jo_clientInfo_t *ci ); extern void CG_RegisterNPCEffects( team_t team ); @@ -706,7 +706,7 @@ Precaches NPC skins, tgas and md3s. void NPC_Precache ( gentity_t *spawner ) { jo_clientInfo_t ci={}; - renderInfo_t ri={}; + jo_renderInfo_t ri={}; team_t playerTeam = TEAM_FREE; const char *token; const char *value; @@ -1070,8 +1070,8 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) char playerModel[MAX_QPATH]; char customSkin[MAX_QPATH]; jo_clientInfo_t *ci = &NPC->client->clientInfo; - renderInfo_t *ri = &NPC->client->renderInfo; - gNPCstats_t *stats = NULL; + jo_renderInfo_t *ri = &NPC->client->renderInfo; + jo_gNPCstats_t *stats = NULL; qboolean md3Model = qtrue; char surfOff[1024]; char surfOn[1024]; diff --git a/codeJK2/game/Q3_Interface.cpp b/codeJK2/game/Q3_Interface.cpp index 71699d58b2..86dc9efcd7 100644 --- a/codeJK2/game/Q3_Interface.cpp +++ b/codeJK2/game/Q3_Interface.cpp @@ -723,7 +723,7 @@ static void Q3_SetObjective(const char *ObjEnum, int status) { int objectiveID; jo_gclient_t *client; - objectives_t *objective; + jo_objectives_t *objective; int *objectivesShown; client = &level.clients[0]; @@ -4124,8 +4124,8 @@ void Q3_SetParm (int entID, int parmNum, const char *parmValue) if( !ent->parms ) { - ent->parms = (parms_t *)G_Alloc( sizeof(parms_t) ); - memset( ent->parms, 0, sizeof(parms_t) ); + ent->parms = (jo_parms_t *)G_Alloc( sizeof(jo_parms_t) ); + memset( ent->parms, 0, sizeof(jo_parms_t) ); } if ( (val = Q3_CheckStringCounterIncrement( parmValue )) ) diff --git a/codeJK2/game/b_local.h b/codeJK2/game/b_local.h index d450b920a8..dd3ebd0f55 100644 --- a/codeJK2/game/b_local.h +++ b/codeJK2/game/b_local.h @@ -81,7 +81,7 @@ extern void Debug_NPCPrintf( gentity_t *printNPC, cvar_t *cv, int debugLevel, ch //MCG - Begin============================================================ //NPC_ai variables - shared by NPC.cpp andf the following modules extern gentity_t *NPC; -extern gNPC_t *NPCInfo; +extern jo_gNPC_t *NPCInfo; extern jo_gclient_t *client; extern usercmd_t ucmd; extern visibility_t enemyVisibility; diff --git a/codeJK2/game/b_public.h b/codeJK2/game/b_public.h index 85f6671e29..66263b0a4f 100644 --- a/codeJK2/game/b_public.h +++ b/codeJK2/game/b_public.h @@ -114,8 +114,9 @@ typedef enum //# movetype_e NUM_MOVETYPES } movetype_t; -typedef struct gNPCstats_e +class jo_gNPCstats_t {//Stats, loaded in, and can be set by scripts +public: //AI int aggression; // " int aim; // " @@ -183,7 +184,7 @@ typedef struct gNPCstats_e saved_game->read(health); saved_game->read(acceleration); } -} gNPCstats_t; +}; // jo_gNPCstats_t // NOTE!!! If you add any ptr fields into this structure could you please tell me so I can update the load/save code? // so far the only things I've got to cope with are a bunch of gentity_t*'s, but tell me if any more get added -slc @@ -193,8 +194,10 @@ typedef struct gNPCstats_e #define ENEMY_POS_LAG_INTERVAL 100 #define ENEMY_POS_LAG_STEPS (MAX_ENEMY_POS_LAG/ENEMY_POS_LAG_INTERVAL) -typedef struct +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class jo_gNPC_t { +public: //FIXME: Put in playerInfo or something int timeOfDeath; //FIXME do we really need both of these gentity_t *touchedByPlayer; @@ -275,7 +278,7 @@ typedef struct vec3_t lastPathAngles; //So we know which way to face generally when we stop //stats - gNPCstats_t stats; + jo_gNPCstats_t stats; int aimErrorDebounceTime; float lastAimErrorYaw; float lastAimErrorPitch; @@ -550,7 +553,7 @@ typedef struct saved_game->read(ffireDebounce); saved_game->read(ffireFadeDebounce); } -} gNPC_t; +}; // jo_gNPC_t void G_SquadPathsInit(void); void NPC_InitGame( void ); diff --git a/codeJK2/game/fields.h b/codeJK2/game/fields.h index b08b128333..42e3da31e7 100644 --- a/codeJK2/game/fields.h +++ b/codeJK2/game/fields.h @@ -37,9 +37,9 @@ along with this program; if not, see . #define FOFS(x) offsetof(gentity_t, x) // usually already defined in qshared.h #endif #define STOFS(x) offsetof(spawn_temp_t, x) -#define LLOFS(x) offsetof(level_locals_t, x) +#define LLOFS(x) offsetof(jo_level_locals_t, x) #define CLOFS(x) offsetof(jo_gclient_t, x) -#define NPCOFS(x) offsetof(gNPC_t, x) +#define NPCOFS(x) offsetof(jo_gNPC_t, x) // #define strFOFS(x) #x,FOFS(x) #define strSTOFS(x) #x,STOFS(x) diff --git a/codeJK2/game/g_local.h b/codeJK2/game/g_local.h index 4488fd4f2d..58f8d086e0 100644 --- a/codeJK2/game/g_local.h +++ b/codeJK2/game/g_local.h @@ -194,8 +194,10 @@ typedef struct #define WF_SNOWING 0x00000002 //snowing // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class jo_level_locals_t { +public: jo_gclient_t *clients; // [maxclients] // store latched cvars here that we want to get at often @@ -291,9 +293,9 @@ typedef struct saved_game->read(worldFlags); saved_game->read(dmState); } -} level_locals_t; +}; // jo_level_locals_t -extern level_locals_t level; +extern jo_level_locals_t level; extern game_export_t globals; extern cvar_t *g_gravity; diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp index 1de4cd183a..43068088a1 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -44,7 +44,7 @@ int eventClearTime = 0; #define STEPSIZE 18 -level_locals_t level; +jo_level_locals_t level; game_import_t gi; game_export_t globals; gentity_t g_entities[MAX_GENTITIES]; diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index c7df21c97e..5e75a1e9dc 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -667,7 +667,7 @@ All pointer variables (except function pointers) must be handled specially. */ static void WriteLevelLocals () { - level_locals_t *temp = (level_locals_t *)gi.Malloc(sizeof(level_locals_t), TAG_TEMP_WORKSPACE, qfalse); + jo_level_locals_t *temp = (jo_level_locals_t *)gi.Malloc(sizeof(jo_level_locals_t), TAG_TEMP_WORKSPACE, qfalse); *temp = level; // copy out all data into a temp space EnumerateFields(savefields_LevelLocals, temp, INT_ID('L','V','L','C'), LLOFS(LEVEL_LOCALS_T_SAVESTOP)); @@ -687,7 +687,7 @@ static void ReadLevelLocals () // jo_gclient_t *pClients = level.clients; // save clients - level_locals_t *temp = (level_locals_t *)gi.Malloc(sizeof(level_locals_t), TAG_TEMP_WORKSPACE, qfalse); + jo_level_locals_t *temp = (jo_level_locals_t *)gi.Malloc(sizeof(jo_level_locals_t), TAG_TEMP_WORKSPACE, qfalse); *temp = level; EvaluateFields(savefields_LevelLocals, temp, &level, INT_ID('L','V','L','C'), LLOFS(LEVEL_LOCALS_T_SAVESTOP),qfalse); // sizeof(level_locals_t)); level = *temp; // struct copy @@ -741,7 +741,7 @@ static void WriteGEntities(qboolean qbAutosave) // if (tempEnt.NPC) { - gNPC_t npc = *ent->NPC; // NOT *tempEnt.NPC; !! :-) + jo_gNPC_t npc = *ent->NPC; // NOT *tempEnt.NPC; !! :-) EnumerateFields(savefields_gNPC, &npc, INT_ID('G','N','P','C'), sizeof(npc)); } @@ -847,7 +847,7 @@ static void ReadGEntities(qboolean qbAutosave) // if (pEnt->NPC) // will be qtrue/qfalse { - gNPC_t tempNPC; + jo_gNPC_t tempNPC; EvaluateFields(savefields_gNPC, &tempNPC,pEntOriginal->NPC, INT_ID('G','N','P','C'), sizeof (*pEnt->NPC),qfalse); @@ -864,7 +864,7 @@ static void ReadGEntities(qboolean qbAutosave) // original didn't have one (hmmm...), so make a new one... // //assert(0); // I want to know about this, though not in release - pEnt->NPC = (gNPC_t *) G_Alloc(sizeof(*pEnt->NPC)); + pEnt->NPC = (jo_gNPC_t *) G_Alloc(sizeof(*pEnt->NPC)); } // copy over the one we've just loaded... @@ -903,7 +903,7 @@ static void ReadGEntities(qboolean qbAutosave) // if (pEnt->parms) // will be qtrue/qfalse { - parms_t tempParms; + jo_parms_t tempParms; ::gi.saved_game->read_chunk( INT_ID('P','A','R','M'), @@ -921,7 +921,7 @@ static void ReadGEntities(qboolean qbAutosave) { // original didn't have one, so make a new one... // - pEnt->parms = (parms_t *) G_Alloc(sizeof(*pEnt->parms)); + pEnt->parms = (jo_parms_t *) G_Alloc(sizeof(*pEnt->parms)); } // copy over the one we've just loaded... diff --git a/codeJK2/game/g_shared.h b/codeJK2/game/g_shared.h index f9e108eba8..c25e7b1184 100644 --- a/codeJK2/game/g_shared.h +++ b/codeJK2/game/g_shared.h @@ -255,8 +255,10 @@ typedef enum #define RF_LOCKEDANGLE 1 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct renderInfo_s +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class jo_renderInfo_t { +public: // Legs model, or full model on one piece entities union { @@ -438,7 +440,7 @@ typedef struct renderInfo_s saved_game->read(lookingDebounceTime); saved_game->read(legsYaw); } -} renderInfo_t; +}; // jo_renderInfo_t // Movement information structure @@ -466,7 +468,10 @@ typedef enum { } playerTeamStateState_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct { +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class jo_playerTeamState_t +{ +public: playerTeamStateState_t state; int captures; @@ -513,11 +518,13 @@ typedef struct { saved_game->read(flagsince); saved_game->read(lastfraggedcarrier); } -} playerTeamState_t; +}; // jo_playerTeamState_t // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct objectives_s +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class jo_objectives_t { +public: qboolean display; // A displayable objective? int status; // Succeed or fail or pending @@ -535,12 +542,14 @@ typedef struct objectives_s saved_game->read(display); saved_game->read(status); } -} objectives_t; +}; // jo_objectives_t #define MAX_MISSION_OBJ 80 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -typedef struct missionStats_s +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class jo_missionStats_t { +public: int secretsFound; // # of secret areas found int totalSecrets; // # of secret areas that could have been found int shotsFired; // total number of shots fired @@ -594,7 +603,7 @@ typedef struct missionStats_s saved_game->read(forceUsed); saved_game->read(weaponUsed); } -} missionStats_t; +}; // jo_missionStats_t // the auto following clients don't follow a specific client // number, but instead follow the first two active players @@ -613,8 +622,8 @@ class jo_clientSession_t public: int missionObjectivesShown; // Number of times mission objectives have been updated team_t sessionTeam; - objectives_t mission_objectives[MAX_MISSION_OBJ]; - missionStats_t missionStats; // Various totals while on a mission + jo_objectives_t mission_objectives[MAX_MISSION_OBJ]; + jo_missionStats_t missionStats; // Various totals while on a mission void sg_export( @@ -651,7 +660,7 @@ class jo_clientPersistant_t int enterTime; // level.time the client entered the game short cmd_angles[3]; // angles sent over in the last command - playerTeamState_t teamState; // status in teamplay games + jo_playerTeamState_t teamState; // status in teamplay games void sg_export( @@ -781,7 +790,7 @@ class jo_gclient_t float hiddenDist;//How close ents have to be to pick you up as an enemy vec3_t hiddenDir;//Normalized direction in which NPCs can't see you (you are hidden) - renderInfo_t renderInfo; + jo_renderInfo_t renderInfo; saberTrail_t saberTrail; //dismember tracker @@ -929,8 +938,11 @@ class jo_gclient_t #define MAX_PARMS 16 #define MAX_PARM_STRING_LENGTH MAX_QPATH//was 16, had to lengthen it so they could take a valid file path -typedef struct -{ + +// FIXME Added prefix to avoid debugging problems in Visual Studio. +class jo_parms_t +{ +public: char parm[MAX_PARMS][MAX_PARM_STRING_LENGTH]; @@ -945,7 +957,7 @@ typedef struct { saved_game->read(parm); } -} parms_t; +}; // jo_parms_t #define GAME_INCLUDE #ifdef GAME_INCLUDE @@ -1135,7 +1147,7 @@ Ghoul2 Insert End CSequencer *sequencer; CTaskManager *taskManager; int taskID[NUM_TIDS]; - parms_t *parms; + jo_parms_t *parms; char *behaviorSet[NUM_BSETS]; char *script_targetname; int delayScriptTime; @@ -1198,7 +1210,7 @@ Ghoul2 Insert End //FIELDS USED EXCLUSIVELY BY SPECIFIC CLASSES OF ENTITIES //NPC/Player entity fields //FIXME: Make these client only? - gNPC_t *NPC;//Only allocated if the entity becomes an NPC + jo_gNPC_t *NPC;//Only allocated if the entity becomes an NPC //Other NPC/Player-related entity fields char *ownername;//Used by squadpaths to locate owning NPC From bb3a1ca512c10da668cce1d97e8059784ebe9aa9 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 23 Jul 2016 17:42:47 +0300 Subject: [PATCH 266/445] Fix 'holes' inside saved game affected classes due alignment --- code/cgame/FxScheduler.h | 2 ++ code/game/b_public.h | 2 ++ code/game/g_local.h | 2 ++ code/game/g_shared.h | 6 ++++++ code/game/g_vehicles.h | 4 ++++ code/game/ghoul2_shared.h | 4 ++++ code/qcommon/q_shared.h | 2 ++ codeJK2/game/b_public.h | 2 ++ 8 files changed, 24 insertions(+) diff --git a/code/cgame/FxScheduler.h b/code/cgame/FxScheduler.h index ef6e8a9481..1025661ea5 100644 --- a/code/cgame/FxScheduler.h +++ b/code/cgame/FxScheduler.h @@ -420,6 +420,7 @@ struct SLoopedEffect saved_game->write(mLoopStopTime); saved_game->write(mPortalEffect); saved_game->write(mIsRelative); + saved_game->skip(2); } void sg_import( @@ -431,6 +432,7 @@ struct SLoopedEffect saved_game->read(mLoopStopTime); saved_game->read(mPortalEffect); saved_game->read(mIsRelative); + saved_game->skip(2); } }; diff --git a/code/game/b_public.h b/code/game/b_public.h index f2054f0a42..5351e1678a 100644 --- a/code/game/b_public.h +++ b/code/game/b_public.h @@ -467,6 +467,7 @@ class ja_gNPC_t saved_game->write(currentSpeed); saved_game->write(last_forwardmove); saved_game->write(last_rightmove); + saved_game->skip(2); saved_game->write(lastClearOrigin); saved_game->write(shoveCount); saved_game->write(blockedDebounceTime); @@ -588,6 +589,7 @@ class ja_gNPC_t saved_game->read(currentSpeed); saved_game->read(last_forwardmove); saved_game->read(last_rightmove); + saved_game->skip(2); saved_game->read(lastClearOrigin); saved_game->read(shoveCount); saved_game->read(blockedDebounceTime); diff --git a/code/game/g_local.h b/code/game/g_local.h index 3502333f35..c99532e646 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -109,6 +109,7 @@ class ja_animFileSet_t saved_game->write<>(legsAnimEvents); saved_game->write(torsoAnimEventCount); saved_game->write(legsAnimEventCount); + saved_game->skip(2); } void sg_import( @@ -120,6 +121,7 @@ class ja_animFileSet_t saved_game->read<>(legsAnimEvents); saved_game->read(torsoAnimEventCount); saved_game->read(legsAnimEventCount); + saved_game->skip(2); } }; // ja_animFileSet_t diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 8fe7f2aefb..cd23705b72 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -634,9 +634,11 @@ class ja_clientPersistant_t saved_game->write(connected); saved_game->write<>(lastCommand); saved_game->write(netname); + saved_game->skip(2); saved_game->write(maxHealth); saved_game->write(enterTime); saved_game->write(cmd_angles); + saved_game->skip(2); saved_game->write<>(teamState); } @@ -646,9 +648,11 @@ class ja_clientPersistant_t saved_game->read(connected); saved_game->read<>(lastCommand); saved_game->read(netname); + saved_game->skip(2); saved_game->read(maxHealth); saved_game->read(enterTime); saved_game->read(cmd_angles); + saved_game->skip(2); saved_game->read<>(teamState); } }; // ja_clientPersistant_t @@ -837,6 +841,7 @@ class ja_gclient_t saved_game->write(dismemberProbArms); saved_game->write(dismemberProbHands); saved_game->write(dismemberProbWaist); + saved_game->skip(2); saved_game->write(standheight); saved_game->write(crouchheight); saved_game->write(poisonDamage); @@ -902,6 +907,7 @@ class ja_gclient_t saved_game->read(dismemberProbArms); saved_game->read(dismemberProbHands); saved_game->read(dismemberProbWaist); + saved_game->skip(2); saved_game->read(standheight); saved_game->read(crouchheight); saved_game->read(poisonDamage); diff --git a/code/game/g_vehicles.h b/code/game/g_vehicles.h index f54c770371..e1ec0863a6 100644 --- a/code/game/g_vehicles.h +++ b/code/game/g_vehicles.h @@ -474,6 +474,7 @@ struct Muzzle saved_game->write(m_vMuzzleDir); saved_game->write(m_iMuzzleWait); saved_game->write(m_bFired); + saved_game->skip(3); } void sg_import( @@ -483,6 +484,7 @@ struct Muzzle saved_game->read(m_vMuzzleDir); saved_game->read(m_iMuzzleWait); saved_game->read(m_bFired); + saved_game->skip(3); } }; @@ -701,6 +703,7 @@ struct Vehicle_t saved_game->write(m_pParentEntity); saved_game->write(m_iBoarding); saved_game->write(m_bWasBoarding); + saved_game->skip(3); saved_game->write(m_vBoardingVelocity); saved_game->write(m_fTimeModifier); saved_game->write(m_iLeftWingBone); @@ -747,6 +750,7 @@ struct Vehicle_t saved_game->read(m_pParentEntity); saved_game->read(m_iBoarding); saved_game->read(m_bWasBoarding); + saved_game->skip(3); saved_game->read(m_vBoardingVelocity); saved_game->read(m_fTimeModifier); saved_game->read(m_iLeftWingBone); diff --git a/code/game/ghoul2_shared.h b/code/game/ghoul2_shared.h index c9e30a2078..f0a24e6188 100644 --- a/code/game/ghoul2_shared.h +++ b/code/game/ghoul2_shared.h @@ -274,11 +274,13 @@ boneInfo_t(): saved_game->write(solidCount); saved_game->write(physicsSettled); saved_game->write(snapped); + saved_game->skip(2); saved_game->write(parentBoneIndex); saved_game->write(offsetRotation); saved_game->write(overGradSpeed); saved_game->write(overGoalSpot); saved_game->write(hasOverGoal); + saved_game->skip(3); saved_game->write<>(animFrameMatrix); saved_game->write(hasAnimFrameMatrix); saved_game->write(airTime); @@ -345,11 +347,13 @@ boneInfo_t(): saved_game->read(solidCount); saved_game->read(physicsSettled); saved_game->read(snapped); + saved_game->skip(2); saved_game->read(parentBoneIndex); saved_game->read(offsetRotation); saved_game->read(overGradSpeed); saved_game->read(overGoalSpot); saved_game->read(hasOverGoal); + saved_game->skip(3); saved_game->read<>(animFrameMatrix); saved_game->read(hasAnimFrameMatrix); saved_game->read(airTime); diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 54ef294ea0..da6153f393 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -2929,6 +2929,7 @@ typedef struct usercmd_s { saved_game->write(serverTime); saved_game->write(buttons); saved_game->write(weapon); + saved_game->skip(3); saved_game->write(angles); saved_game->write(generic_cmd); saved_game->write(forwardmove); @@ -2942,6 +2943,7 @@ typedef struct usercmd_s { saved_game->read(serverTime); saved_game->read(buttons); saved_game->read(weapon); + saved_game->skip(3); saved_game->read(angles); saved_game->read(generic_cmd); saved_game->read(forwardmove); diff --git a/codeJK2/game/b_public.h b/codeJK2/game/b_public.h index 66263b0a4f..9f76dba605 100644 --- a/codeJK2/game/b_public.h +++ b/codeJK2/game/b_public.h @@ -422,6 +422,7 @@ class jo_gNPC_t saved_game->write(currentSpeed); saved_game->write(last_forwardmove); saved_game->write(last_rightmove); + saved_game->skip(2); saved_game->write(lastClearOrigin); saved_game->write(consecutiveBlockedMoves); saved_game->write(blockedDebounceTime); @@ -526,6 +527,7 @@ class jo_gNPC_t saved_game->read(currentSpeed); saved_game->read(last_forwardmove); saved_game->read(last_rightmove); + saved_game->skip(2); saved_game->read(lastClearOrigin); saved_game->read(consecutiveBlockedMoves); saved_game->read(blockedDebounceTime); From 27bc43f16f6a99b09704f77f5870e9d3d9fe9fa1 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 23 Jul 2016 18:26:16 +0300 Subject: [PATCH 267/445] Check for chunk read error in EvaluateFields --- codeJK2/game/g_savegame.cpp | 7 +++++++ shared/qcommon/ojk_i_saved_game.h | 4 ++++ shared/qcommon/ojk_i_saved_game_fwd.h | 3 +++ shared/qcommon/ojk_saved_game.cpp | 5 +++++ shared/qcommon/ojk_saved_game.h | 4 ++++ 5 files changed, 23 insertions(+) diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index 5e75a1e9dc..e4c9ca977c 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -647,6 +647,13 @@ static void EvaluateFields( pbData->sg_import( ::gi.saved_game); + if (!::gi.saved_game->is_all_data_read()) + { + ::G_Error( + ::va("EvaluateFields(): variable-sized chunk '%s' without handler!", + ::SG_GetChidText(ulChid))); + } + if (pFields) { for (auto pField = pFields; pField->psName; ++pField) { ::EvaluateField( diff --git a/shared/qcommon/ojk_i_saved_game.h b/shared/qcommon/ojk_i_saved_game.h index fc246f87e7..f050a78f1a 100644 --- a/shared/qcommon/ojk_i_saved_game.h +++ b/shared/qcommon/ojk_i_saved_game.h @@ -44,6 +44,8 @@ bool ISavedGame::read_chunk( read( dst_value); + result &= is_all_data_read(); + return result; } @@ -60,6 +62,8 @@ bool ISavedGame::read_chunk( dst_values, dst_count); + result &= is_all_data_read(); + return result; } diff --git a/shared/qcommon/ojk_i_saved_game_fwd.h b/shared/qcommon/ojk_i_saved_game_fwd.h index 3573f3b12d..c9559fabc5 100644 --- a/shared/qcommon/ojk_i_saved_game_fwd.h +++ b/shared/qcommon/ojk_i_saved_game_fwd.h @@ -61,6 +61,9 @@ class ISavedGame TDst* dst_values, int dst_count); + // Returns true if all data read from the internal buffer. + virtual bool is_all_data_read() const = 0; + // Writes a chunk into the file from the internal buffer. virtual bool write_chunk( diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index 936c80bff0..b170dfeaf1 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -296,6 +296,11 @@ bool SavedGame::read_chunk( return true; } +bool SavedGame::is_all_data_read() const +{ + return io_buffer_.size() == io_buffer_offset_; +} + bool SavedGame::write_chunk( const SavedGame::ChunkId chunk_id) { diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game.h index a91515c3ba..e9b04d27a0 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game.h @@ -63,6 +63,10 @@ class SavedGame : using ISavedGame::read_chunk; + // Returns true if all data read from the internal buffer. + bool is_all_data_read() const override; + + // Writes a chunk into the file from the internal buffer. bool write_chunk( const ChunkId chunk_id) override; From 35a97816473284f34895a668ede751ae07c3d238 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 23 Jul 2016 21:59:22 +0300 Subject: [PATCH 268/445] Fix ICARUS data saving --- code/game/g_savegame.cpp | 9 +++++++++ code/icarus/IcarusImplementation.cpp | 4 ++-- shared/qcommon/ojk_saved_game.cpp | 12 ++++-------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index 25a362c2a3..5d6e77cf22 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -814,6 +814,15 @@ static void EvaluateFields( pbData->sg_import( ::gi.saved_game); + // FIXME Add support for retail version? + + if (!::gi.saved_game->is_all_data_read()) + { + ::G_Error( + ::va("EvaluateFields(): variable-sized chunk '%s' without handler!", + ::SG_GetChidText(ulChid))); + } + if (pFields) { for (const save_field_t* pField = pFields; pField->psName; ++pField) { diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index a3cf024d41..a93fdc697a 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -543,7 +543,7 @@ int CIcarus::Save() //Save out a ICARUS save block header with the ICARUS version double version = ICARUS_VERSION; - saved_game->read_chunk( + saved_game->write_chunk( INT_ID('I','C','A','R'), version); @@ -569,7 +569,7 @@ int CIcarus::Save() } // Write out the buffer with all our collected data. - saved_game->read_chunk( + saved_game->write_chunk( INT_ID('I','S','E','Q'), m_byBuffer, static_cast(m_ulBufferCurPos)); diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index b170dfeaf1..9617e5f4cb 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -120,7 +120,7 @@ bool SavedGame::create( } - is_writable_ = false; + is_writable_ = true; int sg_version = iSAVEGAME_VERSION; @@ -327,13 +327,9 @@ bool SavedGame::write_chunk( static_cast(sizeof(chunk_id)), file_handle_); - int iCompressedLength = 0; + int iCompressedLength = -1; - if (::sv_compress_saved_games->integer == 0) - { - iCompressedLength = -1; - } - else + if (::sv_compress_saved_games->integer != 0) { compress( io_buffer_, @@ -577,7 +573,7 @@ void SavedGame::rename( old_path.c_str(), new_path.c_str()); - if (rename_result != 0) + if (rename_result == 0) { ::Com_Printf( S_COLOR_RED "Error during savegame-rename. Check \"%s\" for write-protect or disk full!\n", From f3862ce59428ef8231a3cdf3d30a874782ea69a6 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 24 Jul 2016 17:48:48 +0300 Subject: [PATCH 269/445] Add try_read method Revise SG_GetSaveGameComment and SG_ReadSavegame --- code/CMakeLists.txt | 1 + code/game/CMakeLists.txt | 2 +- code/rd-vanilla/CMakeLists.txt | 1 + code/server/sv_savegame.cpp | 266 +++++++++++++++----------- codeJK2/game/CMakeLists.txt | 2 +- shared/qcommon/ojk_i_saved_game.h | 57 ++++-- shared/qcommon/ojk_i_saved_game_fwd.h | 28 ++- shared/qcommon/ojk_saved_game.cpp | 195 +++++++++---------- shared/qcommon/ojk_saved_game.h | 27 +-- shared/qcommon/ojk_scope_guard.h | 58 ++++++ 10 files changed, 392 insertions(+), 245 deletions(-) create mode 100644 shared/qcommon/ojk_scope_guard.h diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 7e1dff40e5..571aba288f 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -182,6 +182,7 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SharedDir}/qcommon/ojk_saved_game.cpp" "${SharedDir}/qcommon/ojk_saved_game_exception.h" "${SharedDir}/qcommon/ojk_saved_game_exception.cpp" + "${SharedDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index da8a64da91..9438679089 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -263,7 +263,7 @@ set(SPGameCommonFiles "${SPDir}/rd-common/mdx_format.h" "${SharedDir}/qcommon/ojk_i_saved_game.h" "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" - + "${SharedDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) source_group("common" FILES ${SPGameCommonFiles}) diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index f16462d170..5172eb9e35 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -80,6 +80,7 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) "${SPDir}/qcommon/q_shared.h" "${SharedDir}/qcommon/ojk_i_saved_game.h" "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" + "${SharedDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) source_group("common" FILES ${SPRDVanillaCommonFiles}) diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 76dfdba08d..2ae7b432f7 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -38,6 +38,7 @@ along with this program; if not, see . #include #include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_exception.h" static char saveGameComment[iSG_COMMENT_SIZE]; @@ -930,65 +931,62 @@ static time_t SG_GetTime ( unsigned int timestamp ) // Test to see if the given file name is in the save game directory // then grab the comment if it's there // -int SG_GetSaveGameComment(const char *psPathlessBaseName, char *sComment, char *sMapName) +int SG_GetSaveGameComment( + const char* psPathlessBaseName, + char* sComment, + char* sMapName) { - int ret = 0; - time_t tFileTime; -#ifdef JK2_MODE - size_t iScreenShotLength; -#endif + auto ret = 0; auto saved_game = &ojk::SavedGame::get_instance(); - saved_game->set_preview_mode( - true); + try + { + if (!saved_game->open( + psPathlessBaseName)) + { + return 0; + } - if (!saved_game->open( - psPathlessBaseName)) - { - saved_game->set_preview_mode( - false); + saved_game->read_chunk( + INT_ID('C', 'O', 'M', 'M'), + sComment, + iSG_COMMENT_SIZE); - return 0; - } + unsigned int fileTime = 0; - if (saved_game->read_chunk( - INT_ID('C','O','M','M'), - sComment, - iSG_COMMENT_SIZE)) - { - unsigned int fileTime = 0; + saved_game->read_chunk( + INT_ID('C', 'M', 'T', 'M'), + fileTime); + + auto tFileTime = ::SG_GetTime( + fileTime); - if (saved_game->read_chunk( - INT_ID('C','M','T','M'), - fileTime)) - { - tFileTime = SG_GetTime (fileTime); -#ifdef JK2_MODE - if (saved_game->read_chunk( - INT_ID('S','H','L','N'), - iScreenShotLength)) - { - if (saved_game->read_chunk(INT_ID('S','H','O','T'))) - { -#endif - if (saved_game->read_chunk( - INT_ID('M','P','C','M'), - sMapName, - iSG_MAPCMD_SIZE)) - { - ret = tFileTime; - } #ifdef JK2_MODE - } - } + size_t iScreenShotLength; + + saved_game->read_chunk( + INT_ID('S', 'H', 'L', 'N'), + iScreenShotLength); + + saved_game->read_chunk( + INT_ID('S', 'H', 'O', 'T')); #endif - } - } + + saved_game->read_chunk( + INT_ID('M', 'P', 'C', 'M'), + sMapName, + iSG_MAPCMD_SIZE); + + ret = tFileTime; + } + catch (ojk::SavedGameException&) + { + } saved_game->close(); - return ret; + return ret; } @@ -1288,93 +1286,133 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) return qtrue; } -qboolean SG_ReadSavegame(const char *psPathlessBaseName) +qboolean SG_ReadSavegame( + const char* psPathlessBaseName) { - char sComment[iSG_COMMENT_SIZE]; - char sMapCmd [iSG_MAPCMD_SIZE]; - qboolean qbAutosave; - - int iPrevTestSave = sv_testsave->integer; - sv_testsave->integer = 0; + char sComment[iSG_COMMENT_SIZE]; + char sMapCmd[iSG_MAPCMD_SIZE]; #ifdef JK2_MODE - Cvar_Set( "cg_missionstatusscreen", "0" );//reset if loading a game + Cvar_Set( + "cg_missionstatusscreen", + "0"); #endif auto saved_game = &ojk::SavedGame::get_instance(); - if (!saved_game->open(psPathlessBaseName)) - { - Com_Printf (GetString_FailedToOpenSaveGame(psPathlessBaseName, qtrue));//S_COLOR_RED "Failed to open savegame \"%s\"\n", psPathlessBaseName); - sv_testsave->integer = iPrevTestSave; - return qfalse; - } + const auto iPrevTestSave = ::sv_testsave->integer; - // this check isn't really necessary, but it reminds me that these two strings may actually be the same physical one. - // - if (psPathlessBaseName != sLastSaveFileLoaded) - { - Q_strncpyz(sLastSaveFileLoaded,psPathlessBaseName,sizeof(sLastSaveFileLoaded)); - } + ojk::ScopeGuard scope_guard( + [&]() + { + ::sv_testsave->integer = 0; + }, - // Read in all the server data... - // - saved_game->read_chunk( - INT_ID('C','O','M','M'), - sComment); - - Com_DPrintf("Reading: %s\n", sComment); - - saved_game->read_chunk( - INT_ID('C','M','T','M')); - -#ifdef JK2_MODE - SG_ReadScreenshot(qtrue); // qboolean qbSetAsLoadingScreen -#endif - saved_game->read_chunk( - INT_ID('M','P','C','M'), - sMapCmd); + [&]() + { + saved_game->close(); - SG_ReadCvars(); + ::sv_testsave->integer = iPrevTestSave; + } + ); - // read game state - qbAutosave = ReadGame(); - eSavedGameJustLoaded = (qbAutosave)?eAUTO:eFULL; - - SV_SpawnServer(sMapCmd, eForceReload_NOTHING, (eSavedGameJustLoaded != eFULL) ); // note that this also trashes the whole G_Alloc pool as well (of course) + try + { + if (!saved_game->open(psPathlessBaseName)) + { + //S_COLOR_RED "Failed to open savegame \"%s\"\n", psPathlessBaseName); + ::Com_Printf( + ::GetString_FailedToOpenSaveGame( + psPathlessBaseName, + qtrue)); + + return qfalse; + } + + // this check isn't really necessary, but it reminds me that these two strings may actually be the same physical one. + // + if (psPathlessBaseName != sLastSaveFileLoaded) + { + ::Q_strncpyz( + ::sLastSaveFileLoaded, + psPathlessBaseName, + sizeof(sLastSaveFileLoaded)); + } + + // Read in all the server data... + // + saved_game->read_chunk( + INT_ID('C', 'O', 'M', 'M'), + sComment); - // read in all the level data... - // - if (!qbAutosave) - { - auto saved_game = &ojk::SavedGame::get_instance(); + ::Com_DPrintf( + "Reading: %s\n", + sComment); - saved_game->read_chunk( - INT_ID('T','I','M','E'), - ::sv.time); + saved_game->read_chunk( + INT_ID('C', 'M', 'T', 'M')); - saved_game->read_chunk( - INT_ID('T','I','M','R'), - ::sv.timeResidual); +#ifdef JK2_MODE + ::SG_ReadScreenshot( + qtrue); +#endif - CM_ReadPortalState(); - SG_ReadServerConfigStrings(); - } - ge->ReadLevel(qbAutosave, qbLoadTransition); // always done now, but ent reader only does player if auto + saved_game->read_chunk( + INT_ID('M', 'P', 'C', 'M'), + sMapCmd); + + ::SG_ReadCvars(); + + // read game state + const auto qbAutosave = ::ReadGame(); + + ::eSavedGameJustLoaded = (qbAutosave ? eAUTO : eFULL); + + // note that this also trashes the whole G_Alloc pool as well (of course) + ::SV_SpawnServer( + sMapCmd, + eForceReload_NOTHING, + (::eSavedGameJustLoaded != eFULL)); + + // read in all the level data... + // + if (!qbAutosave) + { + saved_game->read_chunk( + INT_ID('T', 'I', 'M', 'E'), + ::sv.time); + + saved_game->read_chunk( + INT_ID('T', 'I', 'M', 'R'), + ::sv.timeResidual); + + ::CM_ReadPortalState(); + ::SG_ReadServerConfigStrings(); + } + + // always done now, but ent reader only does player if auto + ::ge->ReadLevel( + qbAutosave, + qbLoadTransition); + } + catch (ojk::SavedGameException& ex) + { + ::Com_Error( + ERR_DROP, + "%s", + ex.what()); + } #if 0 - if(!SG_Close()) - { - Com_Printf (GetString_FailedToOpenSaveGame(psPathlessBaseName,qfalse));//S_COLOR_RED "Failed to close savegame\n"); - sv_testsave->integer = iPrevTestSave; - return qfalse; - } -#else - saved_game->close(); + if (!SG_Close()) + { + Com_Printf(GetString_FailedToOpenSaveGame(psPathlessBaseName, qfalse));//S_COLOR_RED "Failed to close savegame\n"); + sv_testsave->integer = iPrevTestSave; + return qfalse; + } #endif - sv_testsave->integer = iPrevTestSave; - return qtrue; + return true; } #if 0 diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index a099777f63..06faddc924 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -235,7 +235,7 @@ set(JK2SPGameCommonFiles "${SPDir}/rd-common/mdx_format.h" "${SharedDir}/qcommon/ojk_i_saved_game.h" "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" - + "${SharedDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) source_group("common" FILES ${JK2SPGameCommonFiles}) diff --git a/shared/qcommon/ojk_i_saved_game.h b/shared/qcommon/ojk_i_saved_game.h index f050a78f1a..125064c368 100644 --- a/shared/qcommon/ojk_i_saved_game.h +++ b/shared/qcommon/ojk_i_saved_game.h @@ -10,6 +10,7 @@ #include #include #include "ojk_i_saved_game_fwd.h" +#include "ojk_scope_guard.h" namespace ojk { @@ -34,37 +35,33 @@ inline ISavedGame::~ISavedGame() // read_chunk template -bool ISavedGame::read_chunk( +void ISavedGame::read_chunk( const ChunkId chunk_id, TDst& dst_value) { - auto result = read_chunk( + read_chunk( chunk_id); read( dst_value); - result &= is_all_data_read(); - - return result; + ensure_all_data_read(); } template -bool ISavedGame::read_chunk( +void ISavedGame::read_chunk( const ChunkId chunk_id, TDst* dst_values, int dst_count) { - auto result = read_chunk( + read_chunk( chunk_id); read( dst_values, dst_count); - result &= is_all_data_read(); - - return result; + ensure_all_data_read(); } // read_chunk @@ -75,7 +72,7 @@ bool ISavedGame::read_chunk( // write_chunk template -bool ISavedGame::write_chunk( +void ISavedGame::write_chunk( const ChunkId chunk_id, const TSrc& src_value) { @@ -84,12 +81,12 @@ bool ISavedGame::write_chunk( write( src_value); - return write_chunk( + write_chunk( chunk_id); } template -bool ISavedGame::write_chunk( +void ISavedGame::write_chunk( const ChunkId chunk_id, const TSrc* src_values, int src_count) @@ -100,7 +97,7 @@ bool ISavedGame::write_chunk( src_values, src_count); - return write_chunk( + write_chunk( chunk_id); } @@ -250,6 +247,38 @@ void ISavedGame::read( // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// try_read + +template +bool ISavedGame::try_read( + TDst& dst_value) +{ + ScopeGuard scope_guard( + [this]() + { + this->allow_read_overflow( + true); + }, + + [this]() + { + this->allow_read_overflow( + false); + } + ); + + + read( + dst_value); + + return is_all_data_read(); +} + +// try_read +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // read (C-array) diff --git a/shared/qcommon/ojk_i_saved_game_fwd.h b/shared/qcommon/ojk_i_saved_game_fwd.h index c9559fabc5..1ed867c6b7 100644 --- a/shared/qcommon/ojk_i_saved_game_fwd.h +++ b/shared/qcommon/ojk_i_saved_game_fwd.h @@ -43,20 +43,20 @@ class ISavedGame // Reads a chunk from the file into the internal buffer. - virtual bool read_chunk( + virtual void read_chunk( const ChunkId chunk_id) = 0; // Reads a value or an array of values from the file via // the internal buffer. template - bool read_chunk( + void read_chunk( const ChunkId chunk_id, TDst& dst_value); // Reads an array of values with specified count from // the file via the internal buffer. template - bool read_chunk( + void read_chunk( const ChunkId chunk_id, TDst* dst_values, int dst_count); @@ -64,22 +64,25 @@ class ISavedGame // Returns true if all data read from the internal buffer. virtual bool is_all_data_read() const = 0; + // Throws an exception if all data not read. + virtual void ensure_all_data_read() const = 0; + // Writes a chunk into the file from the internal buffer. - virtual bool write_chunk( + virtual void write_chunk( const ChunkId chunk_id) = 0; // Writes a value or an array of values into the file via // the internal buffer. template - bool write_chunk( + void write_chunk( const ChunkId chunk_id, const TSrc& src_value); // Writes an array of values with specified count into // the file via the internal buffer. template - bool write_chunk( + void write_chunk( const ChunkId chunk_id, const TSrc* src_values, int src_count); @@ -102,6 +105,13 @@ class ISavedGame int dst_count); + // Tries to read a value or array of values from the internal buffer. + // Returns true on success or false otherwise. + template + bool try_read( + TDst& dst_value); + + // Writes a raw data into the internal buffer. virtual void raw_write( const void* src_data, @@ -144,6 +154,12 @@ class ISavedGame class CastTag { public: }; + // If true won't throw an exception when buffer offset is beyond it's size. + // Although, no data will be read beyond the buffer. + virtual void allow_read_overflow( + bool value) = 0; + + template void read( TDst& dst_value, diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index 9617e5f4cb..56bb31ce3d 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -16,8 +16,8 @@ SavedGame::SavedGame() : rle_buffer_(), is_readable_(), is_writable_(), - is_preview_mode_(), - is_write_failed_() + is_write_failed_(), + is_read_overflow_allowed_() { } @@ -32,7 +32,7 @@ bool SavedGame::open( close(); - auto&& file_path = generate_path( + const auto&& file_path = generate_path( base_file_name); auto is_succeed = true; @@ -48,9 +48,9 @@ bool SavedGame::open( { is_succeed = false; - auto error_message = get_failed_to_open_message( - file_path, - true); + const auto&& error_message = + S_COLOR_RED "Failed to open a saved game file: \"" + + file_path + "\"."; ::Com_DPrintf( "%s\n", @@ -63,7 +63,7 @@ bool SavedGame::open( is_readable_ = true; } - int sg_version = -1; + auto sg_version = -1; if (is_succeed) { @@ -100,17 +100,17 @@ bool SavedGame::create( remove( base_file_name); - auto path = generate_path( + const auto&& file_path = generate_path( base_file_name); file_handle_ = ::FS_FOpenFileWrite( - path.c_str()); + file_path.c_str()); if (file_handle_ == 0) { - auto error_message = get_failed_to_open_message( - path, - false); + const auto&& error_message = + S_COLOR_RED "Failed to create a saved game file: \"" + + file_path + "\"."; ::Com_Printf( "%s\n", @@ -122,11 +122,11 @@ bool SavedGame::create( is_writable_ = true; - int sg_version = iSAVEGAME_VERSION; + const auto sg_version = iSAVEGAME_VERSION; - static_cast(write_chunk( + write_chunk( INT_ID('_', 'V', 'E', 'R'), - sg_version)); + sg_version); return true; } @@ -144,7 +144,6 @@ void SavedGame::close() is_readable_ = false; is_writable_ = false; - is_preview_mode_ = false; is_write_failed_ = false; } @@ -158,12 +157,12 @@ bool SavedGame::is_writable() const return is_writable_; } -bool SavedGame::read_chunk( +void SavedGame::read_chunk( const SavedGame::ChunkId chunk_id) { io_buffer_offset_ = 0; - auto chunk_id_string = get_chunk_id_string( + const auto&& chunk_id_string = get_chunk_id_string( chunk_id); ::Com_DPrintf( @@ -183,7 +182,7 @@ bool SavedGame::read_chunk( static_cast(sizeof(uiLoadedLength)), file_handle_); - auto bBlockIsCompressed = (static_cast(uiLoadedLength) < 0); + const auto bBlockIsCompressed = (static_cast(uiLoadedLength) < 0); if (bBlockIsCompressed) { @@ -194,9 +193,10 @@ bool SavedGame::read_chunk( // if (ulLoadedChid != chunk_id) { - auto loaded_chunk_id_string = get_chunk_id_string( + const auto&& loaded_chunk_id_string = get_chunk_id_string( ulLoadedChid); +#if 0 if (!is_preview_mode_) { ::Com_Error( @@ -205,8 +205,17 @@ bool SavedGame::read_chunk( loaded_chunk_id_string.c_str(), chunk_id_string.c_str()); } +#else + const auto&& error_message = + "Loaded chunk ID (" + + loaded_chunk_id_string + + ") does not match requested chunk ID (" + + chunk_id_string + + ")."; - return false; + throw_error( + error_message); +#endif } // Load in data and magic number... @@ -257,12 +266,13 @@ bool SavedGame::read_chunk( // Make sure the checksums match... // - auto uiCksum = ::Com_BlockChecksum( + const auto uiCksum = ::Com_BlockChecksum( io_buffer_.data(), static_cast(io_buffer_.size())); if (uiLoadedCksum != uiCksum) { +#if 0 if (!is_preview_mode_) { ::Com_Error( @@ -270,8 +280,13 @@ bool SavedGame::read_chunk( "Failed checksum check for chunk", chunk_id_string.c_str()); } +#else + const auto&& error_message = + "Failed checksum check for chunk " + chunk_id_string + "."; - return false; + throw_error( + error_message); +#endif } // Make sure we didn't encounter any read errors... @@ -282,6 +297,7 @@ bool SavedGame::read_chunk( (bBlockIsCompressed ? sizeof(uiCompressedLength) : 0) + (bBlockIsCompressed ? uiCompressedLength : io_buffer_.size())) { +#if 0 if (!is_preview_mode_) { ::Com_Error( @@ -289,11 +305,14 @@ bool SavedGame::read_chunk( "Error during loading chunk %s", chunk_id_string.c_str()); } +#else + const auto&& error_message = + "Error during loading chunk " + chunk_id_string + "."; - return false; + throw_error( + error_message); +#endif } - - return true; } bool SavedGame::is_all_data_read() const @@ -301,10 +320,19 @@ bool SavedGame::is_all_data_read() const return io_buffer_.size() == io_buffer_offset_; } -bool SavedGame::write_chunk( +void SavedGame::ensure_all_data_read() const +{ + if (!is_all_data_read()) + { + throw_error( + "Not all expected data read."); + } +} + +void SavedGame::write_chunk( const SavedGame::ChunkId chunk_id) { - auto chunk_id_string = get_chunk_id_string( + const auto&& chunk_id_string = get_chunk_id_string( chunk_id); ::Com_DPrintf( @@ -313,12 +341,12 @@ bool SavedGame::write_chunk( if (::sv_testsave->integer != 0) { - return true; + return; } - auto src_size = static_cast(io_buffer_.size()); + const auto src_size = static_cast(io_buffer_.size()); - auto uiCksum = Com_BlockChecksum( + const auto uiCksum = Com_BlockChecksum( io_buffer_.data(), src_size); @@ -327,7 +355,7 @@ bool SavedGame::write_chunk( static_cast(sizeof(chunk_id)), file_handle_); - int iCompressedLength = -1; + auto iCompressedLength = -1; if (::sv_compress_saved_games->integer != 0) { @@ -341,9 +369,9 @@ bool SavedGame::write_chunk( } } - if (iCompressedLength >= 0) + if (iCompressedLength > 0) { - auto iLength = -static_cast(io_buffer_.size()); + const auto iLength = -static_cast(io_buffer_.size()); uiSaved += ::FS_Write( &iLength, @@ -378,12 +406,12 @@ bool SavedGame::write_chunk( S_COLOR_RED "Failed to write %s chunk\n", chunk_id_string.c_str()); - return false; + return; } } else { - auto iLength = static_cast(io_buffer_.size()); + const auto iLength = static_cast(io_buffer_.size()); uiSaved += ::FS_Write( &iLength, @@ -412,11 +440,9 @@ bool SavedGame::write_chunk( S_COLOR_RED "Failed to write %s chunk\n", chunk_id_string.c_str()); - return false; + return; } } - - return true; } void SavedGame::raw_read( @@ -448,14 +474,20 @@ void SavedGame::raw_read( if ((io_buffer_offset_ + dst_size) > io_buffer_.size()) { - throw_error( - "Not enough data."); + if (!is_read_overflow_allowed_) + { + throw_error( + "Not enough data."); + } } - std::uninitialized_copy_n( - &io_buffer_[io_buffer_offset_], - dst_size, - static_cast(dst_data)); + if (!is_read_overflow_allowed_) + { + std::uninitialized_copy_n( + &io_buffer_[io_buffer_offset_], + dst_size, + static_cast(dst_data)); + } io_buffer_offset_ += dst_size; } @@ -487,7 +519,7 @@ void SavedGame::raw_write( return; } - auto new_buffer_size = io_buffer_offset_ + src_size; + const auto new_buffer_size = io_buffer_offset_ + src_size; io_buffer_.resize( new_buffer_size); @@ -505,12 +537,6 @@ bool SavedGame::is_write_failed() const return is_write_failed_; } -void SavedGame::set_preview_mode( - bool value) -{ - is_preview_mode_ = value; -} - void SavedGame::skip( int count) { @@ -531,8 +557,8 @@ void SavedGame::skip( return; } - auto new_offset = io_buffer_offset_ + count; - auto buffer_size = io_buffer_.size(); + const auto new_offset = io_buffer_offset_ + count; + const auto buffer_size = io_buffer_.size(); if (new_offset > buffer_size) { @@ -563,20 +589,21 @@ void SavedGame::rename( const std::string& old_base_file_name, const std::string& new_base_file_name) { - auto old_path = generate_path( + const auto&& old_path = generate_path( old_base_file_name); - auto new_path = generate_path( + const auto&& new_path = generate_path( new_base_file_name); - auto rename_result = ::FS_MoveUserGenFile( + const auto rename_result = ::FS_MoveUserGenFile( old_path.c_str(), new_path.c_str()); if (rename_result == 0) { ::Com_Printf( - S_COLOR_RED "Error during savegame-rename. Check \"%s\" for write-protect or disk full!\n", + S_COLOR_RED "Error during savegame-rename." + " Check \"%s\" for write-protect or disk full!\n", new_path.c_str()); } } @@ -584,7 +611,7 @@ void SavedGame::rename( void SavedGame::remove( const std::string& base_file_name) { - auto path = generate_path( + const auto&& path = generate_path( base_file_name); ::FS_DeleteUserGenFile( @@ -597,6 +624,12 @@ SavedGame& SavedGame::get_instance() return result; } +void SavedGame::allow_read_overflow( + bool value) +{ + is_read_overflow_allowed_ = value; +} + void SavedGame::throw_error( const char* message) { @@ -615,12 +648,12 @@ void SavedGame::compress( const Buffer& src_buffer, Buffer& dst_buffer) { - auto src_size = static_cast(src_buffer.size()); + const auto src_size = static_cast(src_buffer.size()); dst_buffer.resize(2 * src_size); - int src_count = 0; - int dst_index = 0; + auto src_count = 0; + auto dst_index = 0; while (src_count < src_size) { @@ -678,8 +711,8 @@ void SavedGame::decompress( const Buffer& src_buffer, Buffer& dst_buffer) { - int src_index = 0; - int dst_index = 0; + auto src_index = 0; + auto dst_index = 0; auto remain_size = static_cast(dst_buffer.size()); @@ -725,43 +758,11 @@ std::string SavedGame::generate_path( '/', '_'); - auto path = "saves/" + normalized_file_name + ".sav"; + auto&& path = "saves/" + normalized_file_name + ".sav"; return path; } -std::string SavedGame::get_failed_to_open_message( - const std::string& file_name, - bool is_open) -{ - constexpr int max_length = 256; - - auto message_id = - is_open ? -#if JK2_MODE - "MENUS3_FAILED_TO_OPEN_SAVEGAME" : - "MENUS3_FAILED_TO_CREATE_SAVEGAME" -#else - "MENUS_FAILED_TO_OPEN_SAVEGAME" : - "MENUS3_FAILED_TO_CREATE_SAVEGAME" -#endif - ; - - std::string result( - S_COLOR_RED); - - result += ::va( - ::SE_GetString(message_id), - file_name.c_str()); - - if (result.length() > max_length) - { - result.resize(max_length); - } - - return result; -} - std::string SavedGame::get_chunk_id_string( uint32_t chunk_id) { diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game.h index e9b04d27a0..3b975fa93f 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game.h @@ -57,7 +57,7 @@ class SavedGame : // Reads a chunk from the file into the internal buffer. - bool read_chunk( + void read_chunk( const ChunkId chunk_id) override; using ISavedGame::read_chunk; @@ -66,9 +66,12 @@ class SavedGame : // Returns true if all data read from the internal buffer. bool is_all_data_read() const override; + // Throws an exception if all data not read. + void ensure_all_data_read() const override; + // Writes a chunk into the file from the internal buffer. - bool write_chunk( + void write_chunk( const ChunkId chunk_id) override; using ISavedGame::write_chunk; @@ -92,9 +95,6 @@ class SavedGame : bool is_write_failed() const; - void set_preview_mode( - bool value); - // Increments buffer's offset by the specified non-negative count. void skip( int count) override; @@ -119,6 +119,13 @@ class SavedGame : static SavedGame& get_instance(); +protected: + // If true won't throw an exception when buffer offset is beyond it's size. + // Although, no data will be read beyond the buffer. + void allow_read_overflow( + bool value) override; + + private: using BufferOffset = Buffer::size_type; using Paths = std::vector; @@ -142,12 +149,12 @@ class SavedGame : // True if saved game opened for writing. bool is_writable_; - // Does not throws an exception on chunk reading if true. - bool is_preview_mode_; - // True if any previous write operation failed. bool is_write_failed_; + // Controls exception throw on read overflow. + bool is_read_overflow_allowed_; + // Throws an exception. static void throw_error( @@ -172,10 +179,6 @@ class SavedGame : static std::string generate_path( const std::string& base_file_name); - static std::string get_failed_to_open_message( - const std::string& file_name, - bool is_open); - // Returns a string representation of a chunk id. static std::string get_chunk_id_string( diff --git a/shared/qcommon/ojk_scope_guard.h b/shared/qcommon/ojk_scope_guard.h new file mode 100644 index 0000000000..3cf39c96b0 --- /dev/null +++ b/shared/qcommon/ojk_scope_guard.h @@ -0,0 +1,58 @@ +// +// Calls specified callbacks on scope enter (optional) and exit. +// + + +#ifndef OJK_SCOPE_GUARD_INCLUDED +#define OJK_SCOPE_GUARD_INCLUDED + + +#include +#include + + +namespace ojk +{ + + +class ScopeGuard +{ +public: + using Callback = std::function; + + + ScopeGuard( + Callback leave_callback) : + leave_callback_(leave_callback) + { + } + + ScopeGuard( + Callback enter_callback, + Callback leave_callback) : + ScopeGuard(leave_callback) + { + enter_callback(); + } + + ScopeGuard( + const ScopeGuard& that) = delete; + + ScopeGuard& operator=( + const ScopeGuard& that) = delete; + + ~ScopeGuard() + { + leave_callback_(); + } + + +private: + Callback leave_callback_; +}; // ScopeGuard + + +} // ojk + + +#endif // OJK_SCOPE_GUARD_INCLUDED From e286d0e90ae6778b2d1a23f16277bc5e6e8bda19 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 24 Jul 2016 18:17:35 +0300 Subject: [PATCH 270/445] Rename saved game affected classes back --- code/cgame/cg_local.h | 2 +- code/cgame/cg_main.cpp | 10 ++--- code/cgame/cg_media.h | 2 +- code/cgame/cg_players.cpp | 42 ++++++++++---------- code/cgame/cg_weapons.cpp | 6 +-- code/game/AI_Animal.cpp | 2 +- code/game/AI_HazardTrooper.cpp | 2 +- code/game/AI_SandCreature.cpp | 2 +- code/game/AI_Stormtrooper.cpp | 10 ++--- code/game/AI_Utils.cpp | 30 +++++++-------- code/game/NPC.cpp | 12 +++--- code/game/NPC_senses.cpp | 10 ++--- code/game/NPC_spawn.cpp | 6 +-- code/game/NPC_stats.cpp | 24 ++++++------ code/game/NPC_utils.cpp | 2 +- code/game/Q3_Interface.cpp | 10 ++--- code/game/ai.h | 12 +++--- code/game/b_local.h | 4 +- code/game/b_public.h | 13 +++---- code/game/bg_pangles.cpp | 2 +- code/game/bg_panimate.cpp | 14 +++---- code/game/bg_pmove.cpp | 4 +- code/game/bg_public.h | 5 +-- code/game/fields.h | 6 +-- code/game/g_active.cpp | 12 +++--- code/game/g_client.cpp | 22 +++++------ code/game/g_cmds.cpp | 2 +- code/game/g_combat.cpp | 8 ++-- code/game/g_local.h | 31 +++++++-------- code/game/g_main.cpp | 4 +- code/game/g_misc_model.cpp | 2 +- code/game/g_navigator.cpp | 2 +- code/game/g_objectives.cpp | 8 ++-- code/game/g_savegame.cpp | 66 ++++++++++++++++---------------- code/game/g_session.cpp | 8 ++-- code/game/g_shared.h | 64 ++++++++++++++----------------- code/game/g_target.cpp | 4 +- code/game/g_weapon.cpp | 2 +- code/game/wp_saber.cpp | 6 +-- code/qcommon/q_shared.h | 1 - code/ui/ui_main.cpp | 6 +-- codeJK2/cgame/cg_local.h | 2 +- codeJK2/cgame/cg_main.cpp | 10 ++--- codeJK2/cgame/cg_media.h | 2 +- codeJK2/cgame/cg_players.cpp | 44 ++++++++++----------- codeJK2/cgame/cg_weapons.cpp | 6 +-- codeJK2/game/AI_Stormtrooper.cpp | 10 ++--- codeJK2/game/AI_Utils.cpp | 34 ++++++++-------- codeJK2/game/NPC.cpp | 8 ++-- codeJK2/game/NPC_senses.cpp | 8 ++-- codeJK2/game/NPC_spawn.cpp | 10 ++--- codeJK2/game/NPC_stats.cpp | 16 ++++---- codeJK2/game/NPC_utils.cpp | 2 +- codeJK2/game/Q3_Interface.cpp | 10 ++--- codeJK2/game/ai.h | 12 +++--- codeJK2/game/anims.h | 7 ++-- codeJK2/game/b_local.h | 4 +- codeJK2/game/b_public.h | 13 +++---- codeJK2/game/bg_panimate.cpp | 12 +++--- codeJK2/game/bg_pmove.cpp | 4 +- codeJK2/game/bg_public.h | 5 +-- codeJK2/game/fields.h | 6 +-- codeJK2/game/g_active.cpp | 12 +++--- codeJK2/game/g_client.cpp | 24 ++++++------ codeJK2/game/g_cmds.cpp | 2 +- codeJK2/game/g_combat.cpp | 6 +-- codeJK2/game/g_local.h | 28 +++++++------- codeJK2/game/g_main.cpp | 4 +- codeJK2/game/g_misc_model.cpp | 2 +- codeJK2/game/g_objectives.cpp | 8 ++-- codeJK2/game/g_savegame.cpp | 62 +++++++++++++++--------------- codeJK2/game/g_session.cpp | 8 ++-- codeJK2/game/g_shared.h | 64 ++++++++++++++----------------- codeJK2/game/g_svcmds.cpp | 4 +- codeJK2/game/g_target.cpp | 2 +- codeJK2/game/wp_saber.cpp | 4 +- 76 files changed, 452 insertions(+), 483 deletions(-) diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index 9ae6e36213..19b8f11dda 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -128,7 +128,7 @@ typedef struct { qboolean pitching; int animationNumber; - ja_animation_t *animation; + animation_t *animation; int animationTime; // time when the first frame of the animation will be exact } lerpFrame_t; diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index f6d955a055..3c335baca1 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -33,7 +33,7 @@ along with this program; if not, see . //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char > namePrecache_m; extern namePrecache_m *as_preCacheMap; -extern void CG_RegisterNPCCustomSounds( ja_clientInfo_t *ci ); +extern void CG_RegisterNPCCustomSounds( clientInfo_t *ci ); extern qboolean G_AddSexToMunroString ( char *string, qboolean qDoBoth ); extern int G_ParseAnimFileSet( const char *skeletonName, const char *modelName=0); extern void CG_DrawDataPadInventorySelect( void ); @@ -852,7 +852,7 @@ CLIENT INFO CG_RegisterClientSkin ========================== */ -qboolean CG_RegisterClientSkin( ja_clientInfo_t *ci, +qboolean CG_RegisterClientSkin( clientInfo_t *ci, const char *headModelName, const char *headSkinName, const char *torsoModelName, const char *torsoSkinName, const char *legsModelName, const char *legsSkinName) @@ -902,7 +902,7 @@ qboolean CG_RegisterClientSkin( ja_clientInfo_t *ci, CG_RegisterClientModelname ========================== */ -qboolean CG_RegisterClientModelname( ja_clientInfo_t *ci, +qboolean CG_RegisterClientModelname( clientInfo_t *ci, const char *headModelName, const char *headSkinName, const char *torsoModelName, const char *torsoSkinName, const char *legsModelName, const char *legsSkinName ) @@ -990,7 +990,7 @@ Ghoul2 Insert End } -void CG_RegisterClientRenderInfo(ja_clientInfo_t *ci, ja_renderInfo_t *ri) +void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri) { char *slash; char headModelName[MAX_QPATH]; @@ -1190,7 +1190,7 @@ void CG_RegisterClientModels (int entityNum) if(entityNum < MAX_CLIENTS) { - memcpy(&cgs.clientinfo[entityNum], &ent->client->clientInfo, sizeof(ja_clientInfo_t)); + memcpy(&cgs.clientinfo[entityNum], &ent->client->clientInfo, sizeof(clientInfo_t)); } } diff --git a/code/cgame/cg_media.h b/code/cgame/cg_media.h index 38651b3b3d..6e045f3187 100644 --- a/code/cgame/cg_media.h +++ b/code/cgame/cg_media.h @@ -399,7 +399,7 @@ typedef struct { qhandle_t inlineDrawModel[MAX_SUBMODELS]; vec3_t inlineModelMidpoints[MAX_SUBMODELS]; - ja_clientInfo_t clientinfo[MAX_CLIENTS]; + clientInfo_t clientinfo[MAX_CLIENTS]; // media cgMedia_t media; diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index 25d3abb80d..bb01835a4b 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -123,7 +123,7 @@ void CG_AddGhoul2Mark(int type, float size, vec3_t hitloc, vec3_t hitdirection, gi.G2API_AddSkinGore(ghoul2,goreSkin); } -qboolean CG_RegisterClientModelname( ja_clientInfo_t *ci, const char *headModelName, const char *headSkinName, +qboolean CG_RegisterClientModelname( clientInfo_t *ci, const char *headModelName, const char *headSkinName, const char *torsoModelName, const char *torsoSkinName, const char *legsModelName, const char *legsSkinName ); @@ -319,7 +319,7 @@ static const char *GetCustomSound_VariantCapped(const char *ppsTable[], int iEnt extern cvar_t *g_sex; extern cvar_t *com_buildScript; -static void CG_RegisterCustomSounds(ja_clientInfo_t *ci, int iSoundEntryBase, +static void CG_RegisterCustomSounds(clientInfo_t *ci, int iSoundEntryBase, int iTableEntries, const char *ppsTable[], const char *psDir ) { @@ -375,7 +375,7 @@ CG_CustomSound */ static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int customSoundSet ) { - ja_clientInfo_t *ci; + clientInfo_t *ci; int i; if ( soundName[0] != '*' ) @@ -517,7 +517,7 @@ CG_NewClientinfo */ void CG_NewClientinfo( int clientNum ) { - ja_clientInfo_t *ci; + clientInfo_t *ci; const char *configstring; const char *v; // const char *s; @@ -591,7 +591,7 @@ void CG_NewClientinfo( int clientNum ) /* CG_RegisterNPCCustomSounds */ -void CG_RegisterNPCCustomSounds( ja_clientInfo_t *ci ) +void CG_RegisterNPCCustomSounds( clientInfo_t *ci ) { // const char *s; // int i; @@ -710,9 +710,9 @@ void CG_ClearAnimEvtCache( void ) CG_SetLerpFrameAnimation =============== */ -static void CG_SetLerpFrameAnimation( ja_clientInfo_t *ci, lerpFrame_t *lf, int newAnimation ) +static void CG_SetLerpFrameAnimation( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation ) { - ja_animation_t *anim; + animation_t *anim; if ( newAnimation < 0 || newAnimation >= MAX_ANIMATIONS ) { @@ -748,9 +748,9 @@ Sets cg.snap, cg.oldFrame, and cg.backlerp cg.time should be between oldFrameTime and frameTime after exit =============== */ -static qboolean CG_RunLerpFrame( ja_clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, float fpsMod, int entNum ) { +static qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, float fpsMod, int entNum ) { int f, animFrameTime; - ja_animation_t *anim; + animation_t *anim; qboolean newFrame = qfalse; if(fpsMod > 2 || fpsMod < 0.5) @@ -877,7 +877,7 @@ static qboolean CG_RunLerpFrame( ja_clientInfo_t *ci, lerpFrame_t *lf, int newAn CG_ClearLerpFrame =============== */ -static void CG_ClearLerpFrame( ja_clientInfo_t *ci, lerpFrame_t *lf, int animationNumber ) +static void CG_ClearLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int animationNumber ) { lf->frameTime = lf->oldFrameTime = cg.time; CG_SetLerpFrameAnimation( ci, lf, animationNumber ); @@ -898,7 +898,7 @@ CG_PlayerAnimation */ static void CG_PlayerAnimation( centity_t *cent, int *legsOld, int *legs, float *legsBackLerp, int *torsoOld, int *torso, float *torsoBackLerp ) { - ja_clientInfo_t *ci; + clientInfo_t *ci; int legsAnim; int legsTurnAnim = -1; qboolean newLegsFrame = qfalse; @@ -1209,7 +1209,7 @@ static void CG_PlayerAnimEvents( int animFileIndex, qboolean torso, int oldFrame else {//still in same anim, check for looping anim inSameAnim = qtrue; - ja_animation_t *animation = &level.knownAnimFileSets[animFileIndex].animations[anim]; + animation_t *animation = &level.knownAnimFileSets[animFileIndex].animations[anim]; animBackward = (animation->frameLerp<0); if ( animation->loopFrames != -1 ) {//a looping anim! @@ -1649,7 +1649,7 @@ Added 11/06/02 by Aurelio Reis. extern vmCvar_t cg_drawBreath; static void CG_BreathPuffs( centity_t *cent, vec3_t angles, vec3_t origin ) { - ja_gclient_t *client = cent->gent->client; + gclient_t *client = cent->gent->client; /* cg_drawBreath.integer == 0 - Don't draw at all. == 1 - Draw both (but bubbles only when under water). @@ -1811,7 +1811,7 @@ CG_AddHeadBob */ static qboolean CG_AddHeadBob( centity_t *cent, vec3_t addTo ) { - ja_renderInfo_t *renderInfo = ¢->gent->client->renderInfo; + renderInfo_t *renderInfo = ¢->gent->client->renderInfo; const int volume = gi.VoiceVolume[cent->gent->s.clientNum]; const int volChange = volume - renderInfo->lastVoiceVolume;//was *3 because voice fromLA was too low int i; @@ -2686,7 +2686,7 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) int turnAnim = PM_TurnAnimForLegsAnim( cent->gent, cent->gent->client->ps.legsAnim ); if ( turnAnim != -1 && cent->gent->health > 0 ) { - ja_animation_t *animations = level.knownAnimFileSets[cent->gent->client->clientInfo.animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[cent->gent->client->clientInfo.animFileIndex].animations; if ( !animatingHips || ( animations[turnAnim].firstFrame != startFrame ) )// only set the anim if we aren't going to do the same animation again { @@ -3915,7 +3915,7 @@ static void CG_PlayerSplash( centity_t *cent ) if ( cent->gent && cent->gent->client ) { - ja_gclient_t *cl = cent->gent->client; + gclient_t *cl = cent->gent->client; if ( cent->gent->disconnectDebounceTime < cg.time ) // can't do these expanding ripples all the time { @@ -5093,7 +5093,7 @@ static void CG_G2SetHeadAnim( centity_t *cent, int anim ) { gentity_t *gent = cent->gent; const int blendTime = 50; - const ja_animation_t *animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; + const animation_t *animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; int animFlags = BONE_ANIM_OVERRIDE ;//| BONE_ANIM_BLEND; // animSpeed is 1.0 if the frameLerp (ms/frame) is 50 (20 fps). // float timeScaleMod = (cg_timescale.value&&gent&&gent->s.clientNum==0&&!player_locked&&!MatrixMode&&gent->client->ps.forcePowersActive&(1< 0.0f @@ -5932,7 +5932,7 @@ extern void FX_AddPrimitive( CEffect **effect, int killTime ); //------------------------------------------------------- void CG_CheckSaberInWater( centity_t *cent, centity_t *scent, int saberNum, int modelIndex, vec3_t origin, vec3_t angles ) { - ja_gclient_t *client = cent->gent->client; + gclient_t *client = cent->gent->client; if ( !client ) { return; @@ -5981,7 +5981,7 @@ static void CG_AddSaberBladeGo( centity_t *cent, centity_t *scent, refEntity_t * mdxaBone_t boltMatrix; qboolean tagHack = qfalse; - ja_gclient_t *client = cent->gent->client; + gclient_t *client = cent->gent->client; if ( !client ) { @@ -6812,7 +6812,7 @@ extern qboolean G_RagDoll(gentity_t *ent, vec3_t forcedAngles); int cg_saberOnSoundTime[MAX_GENTITIES] = {0}; void CG_Player( centity_t *cent ) { - ja_clientInfo_t *ci; + clientInfo_t *ci; qboolean shadow, staticScale = qfalse; float shadowPlane; const weaponData_t *wData = NULL; diff --git a/code/cgame/cg_weapons.cpp b/code/cgame/cg_weapons.cpp index 5f7959bffe..020412c72d 100644 --- a/code/cgame/cg_weapons.cpp +++ b/code/cgame/cg_weapons.cpp @@ -747,14 +747,14 @@ the weapon hand animation has 3 anims, ================= */ extern qboolean ValidAnimFileIndex ( int index ); -int CG_MapTorsoToWeaponFrame( const ja_clientInfo_t *ci, int frame, int animNum, int weaponNum, int firing ) +int CG_MapTorsoToWeaponFrame( const clientInfo_t *ci, int frame, int animNum, int weaponNum, int firing ) { // we should use the animNum to map a weapon frame instead of relying on the torso frame if ( !ValidAnimFileIndex( ci->animFileIndex ) ) { return 0; } - ja_animation_t *animations = level.knownAnimFileSets[ci->animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[ci->animFileIndex].animations; int ret=0; switch( animNum ) @@ -1144,7 +1144,7 @@ void CG_AddViewWeapon( playerState_t *ps ) #endif { // get clientinfo for animation map - const ja_clientInfo_t *ci = ¢->gent->client->clientInfo; + const clientInfo_t *ci = ¢->gent->client->clientInfo; int torsoAnim = cent->gent->client->ps.torsoAnim;//pe.torso.animationNumber; float currentFrame; int startFrame,endFrame,flags; diff --git a/code/game/AI_Animal.cpp b/code/game/AI_Animal.cpp index 08ea31cbe8..4626ff4d1f 100644 --- a/code/game/AI_Animal.cpp +++ b/code/game/AI_Animal.cpp @@ -183,7 +183,7 @@ void NPC_BSAnimal_Default( void ) int alertEvent = NPC_CheckAlertEvents(qtrue, qtrue, -1, qfalse, AEL_MINOR, qfalse); if ( alertEvent >= 0 ) { - ja_alertEvent_t *event = &level.alertEvents[alertEvent]; + alertEvent_t *event = &level.alertEvents[alertEvent]; if (event->owner!=NPC && Distance(event->position, CurrentLocation.v)radius) { ThreatLocation = event->position; diff --git a/code/game/AI_HazardTrooper.cpp b/code/game/AI_HazardTrooper.cpp index d5f6f82e08..fd4e6beeae 100644 --- a/code/game/AI_HazardTrooper.cpp +++ b/code/game/AI_HazardTrooper.cpp @@ -452,7 +452,7 @@ class CTroop float targetNoiseLevel; gentity_t* scanner = mActors[scannerIndex]; - ja_gNPCstats_t* scannerStats = &(scanner->NPC->stats); + gNPCstats_t* scannerStats = &(scanner->NPC->stats); float scannerMaxViewDist = scannerStats->visrange; float scannerMinVisability = 0.1f;//1.0f - scannerStats->vigilance; float scannerMaxHearDist = scannerStats->earshot; diff --git a/code/game/AI_SandCreature.cpp b/code/game/AI_SandCreature.cpp index 2ec8a60bf0..49e7b8f53a 100644 --- a/code/game/AI_SandCreature.cpp +++ b/code/game/AI_SandCreature.cpp @@ -462,7 +462,7 @@ void SandCreature_CheckMovingEnts( void ) void SandCreature_SeekAlert( int alertEvent ) { - ja_alertEvent_t *alert = &level.alertEvents[alertEvent]; + alertEvent_t *alert = &level.alertEvents[alertEvent]; //FIXME: check for higher alert status or closer than last location? NPCInfo->enemyLastSeenTime = level.time; diff --git a/code/game/AI_Stormtrooper.cpp b/code/game/AI_Stormtrooper.cpp index b7f78a1762..dfcdf9ff38 100644 --- a/code/game/AI_Stormtrooper.cpp +++ b/code/game/AI_Stormtrooper.cpp @@ -29,10 +29,10 @@ along with this program; if not, see . extern void CG_DrawAlert( vec3_t origin, float rating ); extern void G_AddVoiceEvent( gentity_t *self, int event, int speakDebounceTime ); -extern void AI_GroupUpdateSquadstates( ja_AIGroupInfo_t *group, gentity_t *member, int newSquadState ); -extern qboolean AI_GroupContainsEntNum( ja_AIGroupInfo_t *group, int entNum ); -extern void AI_GroupUpdateEnemyLastSeen( ja_AIGroupInfo_t *group, vec3_t spot ); -extern void AI_GroupUpdateClearShotTime( ja_AIGroupInfo_t *group ); +extern void AI_GroupUpdateSquadstates( AIGroupInfo_t *group, gentity_t *member, int newSquadState ); +extern qboolean AI_GroupContainsEntNum( AIGroupInfo_t *group, int entNum ); +extern void AI_GroupUpdateEnemyLastSeen( AIGroupInfo_t *group, vec3_t spot ); +extern void AI_GroupUpdateClearShotTime( AIGroupInfo_t *group ); extern void NPC_TempLookTarget( gentity_t *self, int lookEntNum, int minLookTime, int maxLookTime ); extern qboolean G_ExpandPointToBBox( vec3_t point, const vec3_t mins, const vec3_t maxs, int ignore, int clipmask ); extern void ChangeWeapon( gentity_t *ent, int newWeapon ); @@ -1854,7 +1854,7 @@ void ST_Commander( void ) { int i;//, j; int cp, cpFlags; - ja_AIGroupInfo_t *group = NPCInfo->group; + AIGroupInfo_t *group = NPCInfo->group; gentity_t *member;//, *buddy; qboolean enemyLost = qfalse; float avoidDist; diff --git a/code/game/AI_Utils.cpp b/code/game/AI_Utils.cpp index 6f13ea942c..5199a61c3b 100644 --- a/code/game/AI_Utils.cpp +++ b/code/game/AI_Utils.cpp @@ -33,7 +33,7 @@ along with this program; if not, see . #define DEFAULT_RADIUS 45 extern cvar_t *d_noGroupAI; -qboolean AI_ValidateGroupMember( ja_AIGroupInfo_t *group, gentity_t *member ); +qboolean AI_ValidateGroupMember( AIGroupInfo_t *group, gentity_t *member ); /* ------------------------- @@ -92,7 +92,7 @@ int AI_GetGroupSize( gentity_t *ent, int radius ) return AI_GetGroupSize( ent->currentOrigin, radius, ent->client->playerTeam, ent ); } -void AI_SetClosestBuddy( ja_AIGroupInfo_t *group ) +void AI_SetClosestBuddy( AIGroupInfo_t *group ) { int i, j; int dist, bestDist; @@ -114,9 +114,9 @@ void AI_SetClosestBuddy( ja_AIGroupInfo_t *group ) } } -void AI_SortGroupByPathCostToEnemy( ja_AIGroupInfo_t *group ) +void AI_SortGroupByPathCostToEnemy( AIGroupInfo_t *group ) { - ja_AIGroupMember_t bestMembers[MAX_GROUP_MEMBERS]; + AIGroupMember_t bestMembers[MAX_GROUP_MEMBERS]; int i, j, k; qboolean sort = qfalse; @@ -212,7 +212,7 @@ qboolean AI_FindSelfInPreviousGroup( gentity_t *self ) return qfalse; } -void AI_InsertGroupMember( ja_AIGroupInfo_t *group, gentity_t *member ) +void AI_InsertGroupMember( AIGroupInfo_t *group, gentity_t *member ) { int i; //okay, you know what? Check this damn group and make sure we're not already in here! @@ -287,7 +287,7 @@ qboolean AI_GetNextEmptyGroup( gentity_t *self ) } } -qboolean AI_ValidateNoEnemyGroupMember( ja_AIGroupInfo_t *group, gentity_t *member ) +qboolean AI_ValidateNoEnemyGroupMember( AIGroupInfo_t *group, gentity_t *member ) { if ( !group ) { @@ -318,7 +318,7 @@ qboolean AI_ValidateNoEnemyGroupMember( ja_AIGroupInfo_t *group, gentity_t *memb return qtrue; } -qboolean AI_ValidateGroupMember( ja_AIGroupInfo_t *group, gentity_t *member ) +qboolean AI_ValidateGroupMember( AIGroupInfo_t *group, gentity_t *member ) { //Validate ents if ( member == NULL ) @@ -468,7 +468,7 @@ void AI_GetGroup( gentity_t *self ) } //create a new one - memset( self->NPC->group, 0, sizeof( ja_AIGroupInfo_t ) ); + memset( self->NPC->group, 0, sizeof( AIGroupInfo_t ) ); self->NPC->group->enemy = self->enemy; self->NPC->group->team = self->client->playerTeam; @@ -534,7 +534,7 @@ void AI_GetGroup( gentity_t *self ) AI_SetClosestBuddy( self->NPC->group ); } -void AI_SetNewGroupCommander( ja_AIGroupInfo_t *group ) +void AI_SetNewGroupCommander( AIGroupInfo_t *group ) { gentity_t *member = NULL; group->commander = NULL; @@ -549,7 +549,7 @@ void AI_SetNewGroupCommander( ja_AIGroupInfo_t *group ) } } -void AI_DeleteGroupMember( ja_AIGroupInfo_t *group, int memberNum ) +void AI_DeleteGroupMember( AIGroupInfo_t *group, int memberNum ) { if ( group->commander && group->commander->s.number == group->member[memberNum].number ) { @@ -673,7 +673,7 @@ void AI_GroupMemberKilled( gentity_t *self ) }*/ } -void AI_GroupUpdateEnemyLastSeen( ja_AIGroupInfo_t *group, vec3_t spot ) +void AI_GroupUpdateEnemyLastSeen( AIGroupInfo_t *group, vec3_t spot ) { if ( !group ) { @@ -683,7 +683,7 @@ void AI_GroupUpdateEnemyLastSeen( ja_AIGroupInfo_t *group, vec3_t spot ) VectorCopy( spot, group->enemyLastSeenPos ); } -void AI_GroupUpdateClearShotTime( ja_AIGroupInfo_t *group ) +void AI_GroupUpdateClearShotTime( AIGroupInfo_t *group ) { if ( !group ) { @@ -692,7 +692,7 @@ void AI_GroupUpdateClearShotTime( ja_AIGroupInfo_t *group ) group->lastClearShotTime = level.time; } -void AI_GroupUpdateSquadstates( ja_AIGroupInfo_t *group, gentity_t *member, int newSquadState ) +void AI_GroupUpdateSquadstates( AIGroupInfo_t *group, gentity_t *member, int newSquadState ) { if ( !group ) { @@ -712,7 +712,7 @@ void AI_GroupUpdateSquadstates( ja_AIGroupInfo_t *group, gentity_t *member, int } } -qboolean AI_RefreshGroup( ja_AIGroupInfo_t *group ) +qboolean AI_RefreshGroup( AIGroupInfo_t *group ) { gentity_t *member; int i;//, j; @@ -953,7 +953,7 @@ void AI_UpdateGroups( void ) } } -qboolean AI_GroupContainsEntNum( ja_AIGroupInfo_t *group, int entNum ) +qboolean AI_GroupContainsEntNum( AIGroupInfo_t *group, int entNum ) { if ( !group ) { diff --git a/code/game/NPC.cpp b/code/game/NPC.cpp index f46e8d8fbc..328d9a2dbe 100644 --- a/code/game/NPC.cpp +++ b/code/game/NPC.cpp @@ -76,13 +76,13 @@ cvar_t *d_slowmodeath; extern qboolean stop_icarus; gentity_t *NPC; -ja_gNPC_t *NPCInfo; -ja_gclient_t *client; +gNPC_t *NPCInfo; +gclient_t *client; usercmd_t ucmd; visibility_t enemyVisibility; void NPC_SetAnim(gentity_t *ent,int setAnimParts,int anim,int setAnimFlags, int iBlend); -static bState_t G_CurrentBState( ja_gNPC_t *gNPC ); +static bState_t G_CurrentBState( gNPC_t *gNPC ); extern int eventClearTime; @@ -914,8 +914,8 @@ void SetNPCGlobals( gentity_t *ent ) } gentity_t *_saved_NPC; -ja_gNPC_t *_saved_NPCInfo; -ja_gclient_t *_saved_client; +gNPC_t *_saved_NPCInfo; +gclient_t *_saved_client; usercmd_t _saved_ucmd; void SaveNPCGlobals() @@ -2137,7 +2137,7 @@ void NPC_RunBehavior( int team, int bState ) } } -static bState_t G_CurrentBState( ja_gNPC_t *gNPC ) +static bState_t G_CurrentBState( gNPC_t *gNPC ) { if ( gNPC->tempBehavior != BS_DEFAULT ) {//Overrides normal behavior until cleared diff --git a/code/game/NPC_senses.cpp b/code/game/NPC_senses.cpp index ae50b42c6a..2e3fc0baa5 100644 --- a/code/game/NPC_senses.cpp +++ b/code/game/NPC_senses.cpp @@ -590,7 +590,7 @@ qboolean G_RememberAlertEvent( gentity_t *self, int alertIndex ) // Get The Event Struct //---------------------- - ja_alertEvent_t& at = level.alertEvents[alertIndex]; + alertEvent_t& at = level.alertEvents[alertIndex]; if ( at.ID == self->NPC->lastAlertID ) {//already know this one @@ -865,12 +865,12 @@ void ClearPlayerAlertEvents( void ) {//still have more in the array if ( (i+1) < MAX_ALERT_EVENTS ) { - memmove( &level.alertEvents[i], &level.alertEvents[i+1], sizeof(ja_alertEvent_t)*(MAX_ALERT_EVENTS-(i+1) ) ); + memmove( &level.alertEvents[i], &level.alertEvents[i+1], sizeof(alertEvent_t)*(MAX_ALERT_EVENTS-(i+1) ) ); } } else {//just clear this one... or should we clear the whole array? - memset( &level.alertEvents[i], 0, sizeof( ja_alertEvent_t ) ); + memset( &level.alertEvents[i], 0, sizeof( alertEvent_t ) ); } } } @@ -905,12 +905,12 @@ qboolean RemoveOldestAlert( void ) {//still have more in the array if ( (oldestEvent+1) < MAX_ALERT_EVENTS ) { - memmove( &level.alertEvents[oldestEvent], &level.alertEvents[oldestEvent+1], sizeof(ja_alertEvent_t)*(MAX_ALERT_EVENTS-(oldestEvent+1) ) ); + memmove( &level.alertEvents[oldestEvent], &level.alertEvents[oldestEvent+1], sizeof(alertEvent_t)*(MAX_ALERT_EVENTS-(oldestEvent+1) ) ); } } else {//just clear this one... or should we clear the whole array? - memset( &level.alertEvents[oldestEvent], 0, sizeof( ja_alertEvent_t ) ); + memset( &level.alertEvents[oldestEvent], 0, sizeof( alertEvent_t ) ); } } //make sure this never drops below zero... if it does, something very very bad happened diff --git a/code/game/NPC_spawn.cpp b/code/game/NPC_spawn.cpp index a593d4f6fe..fba920d5e3 100644 --- a/code/game/NPC_spawn.cpp +++ b/code/game/NPC_spawn.cpp @@ -985,7 +985,7 @@ extern qboolean stop_icarus; void NPC_Begin (gentity_t *ent) { vec3_t spawn_origin, spawn_angles; - ja_gclient_t *client; + gclient_t *client; usercmd_t ucmd; gentity_t *spawnPoint = NULL; @@ -1503,7 +1503,7 @@ gentity_t *NPC_Spawn_Do( gentity_t *ent, qboolean fullSpawnNow ) return NULL; } - newent->client = (ja_gclient_t *)gi.Malloc(sizeof(ja_gclient_t), TAG_G_ALLOC, qtrue); + newent->client = (gclient_t *)gi.Malloc(sizeof(gclient_t), TAG_G_ALLOC, qtrue); newent->svFlags |= SVF_NPC; @@ -1517,7 +1517,7 @@ gentity_t *NPC_Spawn_Do( gentity_t *ent, qboolean fullSpawnNow ) newent->NPC_type = Q_strlwr( G_NewString( ent->NPC_type ) ); //get my own copy so i can free it when i die } - newent->NPC = (ja_gNPC_t*) gi.Malloc(sizeof(ja_gNPC_t), TAG_G_ALLOC, qtrue); + newent->NPC = (gNPC_t*) gi.Malloc(sizeof(gNPC_t), TAG_G_ALLOC, qtrue); newent->NPC->tempGoal = G_Spawn(); diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index 01e29cd664..19611d82ce 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -356,9 +356,9 @@ static int MoveTypeNameToEnum( const char *name ) return MT_STATIC; } -extern void CG_RegisterClientRenderInfo(ja_clientInfo_t *ci, ja_renderInfo_t *ri); +extern void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri); extern void CG_RegisterClientModels (int entityNum); -extern void CG_RegisterNPCCustomSounds( ja_clientInfo_t *ci ); +extern void CG_RegisterNPCCustomSounds( clientInfo_t *ci ); //#define CONVENIENT_ANIMATION_FILE_DEBUG_THING @@ -413,7 +413,7 @@ int CG_CheckAnimFrameForEventType( animevent_t *animEvents, int keyFrame, animEv ParseAnimationEvtBlock ====================== */ -static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, const char* aeb_filename, animevent_t *animEvents, ja_animation_t *animations, unsigned char &lastAnimEvent, const char **text_p, bool bIsFrameSkipped) +static void ParseAnimationEvtBlock(int glaIndex, unsigned short modelIndex, const char* aeb_filename, animevent_t *animEvents, animation_t *animations, unsigned char &lastAnimEvent, const char **text_p, bool bIsFrameSkipped) { const char *token; int num, n, animNum, keyFrame, lowestVal, highestVal, curAnimEvent = 0; @@ -829,10 +829,10 @@ void G_ParseAnimationEvtFile(int glaIndex, const char* eventsDirectory, int file // Get The Pointers To The Anim Event Arrays //------------------------------------------- - ja_animFileSet_t& afileset = level.knownAnimFileSets[fileIndex]; + animFileSet_t& afileset = level.knownAnimFileSets[fileIndex]; animevent_t *legsAnimEvents = afileset.legsAnimEvents; animevent_t *torsoAnimEvents = afileset.torsoAnimEvents; - ja_animation_t *animations = afileset.animations; + animation_t *animations = afileset.animations; if (modelSpecific) @@ -884,7 +884,7 @@ qboolean G_ParseAnimationFile(int glaIndex, const char *skeletonName, int fileIn float fps = 0; const char* text_p = text; int animNum = 0; - ja_animation_t* animations = level.knownAnimFileSets[fileIndex].animations; + animation_t* animations = level.knownAnimFileSets[fileIndex].animations; char skeletonPath[MAX_QPATH]; @@ -1071,7 +1071,7 @@ int G_ParseAnimFileSet(const char *skeletonName, const char *modelName=0) level.knownAnimFileSets[fileIndex].torsoAnimEventCount = 0; level.knownAnimFileSets[fileIndex].legsAnimEventCount = 0; - ja_animation_t* animations = level.knownAnimFileSets[fileIndex].animations; + animation_t* animations = level.knownAnimFileSets[fileIndex].animations; animevent_t* legsAnimEvents = level.knownAnimFileSets[fileIndex].legsAnimEvents; animevent_t* torsoAnimEvents = level.knownAnimFileSets[fileIndex].torsoAnimEvents; @@ -1577,8 +1577,8 @@ Precaches NPC skins, tgas and md3s. */ void CG_NPC_Precache ( gentity_t *spawner ) { - ja_clientInfo_t ci={}; - ja_renderInfo_t ri={}; + clientInfo_t ci={}; + renderInfo_t ri={}; team_t playerTeam = TEAM_FREE; const char *token; const char *value; @@ -1941,9 +1941,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) char sound[MAX_QPATH]; char playerModel[MAX_QPATH]; char customSkin[MAX_QPATH]; - ja_clientInfo_t *ci = &NPC->client->clientInfo; - ja_renderInfo_t *ri = &NPC->client->renderInfo; - ja_gNPCstats_t *stats = NULL; + clientInfo_t *ci = &NPC->client->clientInfo; + renderInfo_t *ri = &NPC->client->renderInfo; + gNPCstats_t *stats = NULL; qboolean md3Model = qtrue; char surfOff[1024]={0}; char surfOn[1024]={0}; diff --git a/code/game/NPC_utils.cpp b/code/game/NPC_utils.cpp index c6cd5c90bd..d92cdd167d 100644 --- a/code/game/NPC_utils.cpp +++ b/code/game/NPC_utils.cpp @@ -1180,7 +1180,7 @@ gentity_t *NPC_PickEnemyExt( qboolean checkAlerts = qfalse ) //There is an event to look at if ( alertEvent >= 0 ) { - ja_alertEvent_t *event = &level.alertEvents[alertEvent]; + alertEvent_t *event = &level.alertEvents[alertEvent]; //Don't pay attention to our own alerts if ( event->owner == NPC ) diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index a527a58406..29d659e8cf 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -751,8 +751,8 @@ extern qboolean G_CheckPlayerDarkSide( void ); static void Q3_SetObjective(const char *ObjEnum, int status) { int objectiveID; - ja_gclient_t *client; - ja_objectives_t *objective; + gclient_t *client; + objectives_t *objective; int *objectivesShown; client = &level.clients[0]; @@ -4077,8 +4077,8 @@ void Q3_SetParm (int entID, int parmNum, const char *parmValue) if( !ent->parms ) { - ent->parms = (ja_parms_t *)G_Alloc( sizeof(ja_parms_t) ); - memset( ent->parms, 0, sizeof(ja_parms_t) ); + ent->parms = (parms_t *)G_Alloc( sizeof(parms_t) ); + memset( ent->parms, 0, sizeof(parms_t) ); } if ( (val = Q3_CheckStringCounterIncrement( parmValue )) ) @@ -7453,7 +7453,7 @@ CQuake3GameInterface::CQuake3GameInterface() : IGameInterface() player_locked = qfalse; - ja_gclient_t* client = &level.clients[0]; + gclient_t* client = &level.clients[0]; memset(&client->sess, 0, sizeof(client->sess)); } diff --git a/code/game/ai.h b/code/game/ai.h index a3222580c5..672a5f588b 100644 --- a/code/game/ai.h +++ b/code/game/ai.h @@ -115,8 +115,7 @@ void NPC_BSAnimal_Default( void ); //Group AI #define MAX_FRAME_GROUPS 32 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class ja_AIGroupMember_t +class AIGroupMember_t { public: int number; @@ -142,12 +141,11 @@ class ja_AIGroupMember_t saved_game->read(pathCostToEnemy); saved_game->read(closestBuddy); } -}; // ja_AIGroupMember_t +}; // AIGroupMember_t #define MAX_GROUP_MEMBERS 32 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class ja_AIGroupInfo_t +class AIGroupInfo_t { public: int numGroup; @@ -166,7 +164,7 @@ class ja_AIGroupInfo_t gentity_t *commander; vec3_t enemyLastSeenPos; int numState[ NUM_SQUAD_STATES ]; - ja_AIGroupMember_t member[ MAX_GROUP_MEMBERS ]; + AIGroupMember_t member[ MAX_GROUP_MEMBERS ]; void sg_export( @@ -212,7 +210,7 @@ class ja_AIGroupInfo_t saved_game->read(numState); saved_game->read<>(member); } -}; // ja_AIGroupInfo_t +}; // AIGroupInfo_t int AI_GetGroupSize( vec3_t origin, int radius, team_t playerTeam, gentity_t *avoid = NULL ); diff --git a/code/game/b_local.h b/code/game/b_local.h index a49df8d6ae..8093b64b0c 100644 --- a/code/game/b_local.h +++ b/code/game/b_local.h @@ -80,8 +80,8 @@ extern void Debug_NPCPrintf( gentity_t *printNPC, cvar_t *cv, int debugLevel, ch //MCG - Begin============================================================ //NPC_ai variables - shared by NPC.cpp andf the following modules extern gentity_t *NPC; -extern ja_gNPC_t *NPCInfo; -extern ja_gclient_t *client; +extern gNPC_t *NPCInfo; +extern gclient_t *client; extern usercmd_t ucmd; extern visibility_t enemyVisibility; diff --git a/code/game/b_public.h b/code/game/b_public.h index 5351e1678a..590dce55e6 100644 --- a/code/game/b_public.h +++ b/code/game/b_public.h @@ -132,7 +132,7 @@ typedef enum } sexType_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -class ja_gNPCstats_t +class gNPCstats_t {//Stats, loaded in, and can be set by scripts public: //AI @@ -203,7 +203,7 @@ class ja_gNPCstats_t saved_game->read(acceleration); saved_game->read(sex); } -}; // ja_gNPCstats_t +}; // gNPCstats_t #define MAX_ENEMY_POS_LAG 2400 @@ -211,8 +211,7 @@ class ja_gNPCstats_t #define ENEMY_POS_LAG_STEPS (MAX_ENEMY_POS_LAG/ENEMY_POS_LAG_INTERVAL) // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class ja_gNPC_t +class gNPC_t { public: //FIXME: Put in playerInfo or something @@ -295,13 +294,13 @@ class ja_gNPC_t int leaderAvoidSide; int lastAvoidSteerSide; int lastAvoidSteerSideDebouncer; - ja_AIGroupInfo_t *group; + AIGroupInfo_t *group; int troop; vec3_t lastPathAngles; //So we know which way to face generally when we stop //stats - ja_gNPCstats_t stats; + gNPCstats_t stats; int aimErrorDebounceTime; float lastAimErrorYaw; float lastAimErrorPitch; @@ -627,7 +626,7 @@ class ja_gNPC_t saved_game->read(ffireDebounce); saved_game->read(ffireFadeDebounce); } -}; // ja_gNPC_t +}; // gNPC_t void G_SquadPathsInit(void); diff --git a/code/game/bg_pangles.cpp b/code/game/bg_pangles.cpp index ca94bf30b1..052dc31cf0 100644 --- a/code/game/bg_pangles.cpp +++ b/code/game/bg_pangles.cpp @@ -67,7 +67,7 @@ void BG_IK_MoveLimb( CGhoul2Info_v &ghoul2, int boltIndex, char *animBone, char vec3_t holdPoint; vec3_t torg; float distToDest; - ja_animation_t *anim = &level.knownAnimFileSets[animFileIndex].animations[basePose]; + animation_t *anim = &level.knownAnimFileSets[animFileIndex].animations[basePose]; assert( ghoul2.size() ); diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index 70d8621bc7..48b23f04f6 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -4180,7 +4180,7 @@ int PM_LegsAnimForFrame( gentity_t *ent, int legsFrame ) if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) return -1; - ja_animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; int glaIndex = gi.G2API_GetAnimIndex(&(ent->ghoul2[0])); for ( int animation = 0; animation < BOTH_CIN_1; animation++ ) //first anim after last legs @@ -4215,7 +4215,7 @@ int PM_LegsAnimForFrame( gentity_t *ent, int legsFrame ) int PM_ValidateAnimRange( const int startFrame, const int endFrame, const float animSpeed ) {//given a startframe and endframe, see if that lines up with any known animation - ja_animation_t *animations = level.knownAnimFileSets[0].animations; + animation_t *animations = level.knownAnimFileSets[0].animations; for ( int anim = 0; anim < MAX_ANIMATIONS; anim++ ) { @@ -4264,7 +4264,7 @@ int PM_TorsoAnimForFrame( gentity_t *ent, int torsoFrame ) if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) return -1; - ja_animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; int glaIndex = gi.G2API_GetAnimIndex(&(ent->ghoul2[0])); for ( int animation = 0; animation < LEGS_TURN1; animation++ ) //first legs only anim @@ -4306,7 +4306,7 @@ qboolean PM_FinishedCurrentLegsAnim( gentity_t *self ) curFrame = floor( currentFrame ); int legsAnim = self->client->ps.legsAnim; - ja_animation_t *animations = level.knownAnimFileSets[self->client->clientInfo.animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[self->client->clientInfo.animFileIndex].animations; if ( curFrame >= animations[legsAnim].firstFrame + (animations[legsAnim].numFrames - 2) ) { @@ -4337,7 +4337,7 @@ qboolean PM_HasAnimation( gentity_t *ent, int animation ) if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) return qfalse; - ja_animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; //No frames, no anim if ( animations[animation].numFrames == 0 ) @@ -4660,8 +4660,8 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, //---------------------------- float timeScaleMod = PM_GetTimeScaleMod( gent ); const int actualTime = (cg.time?cg.time:level.time); - const ja_animation_t* animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; - const ja_animation_t& curAnim = animations[anim]; + const animation_t* animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; + const animation_t& curAnim = animations[anim]; // Make Sure This Character Has Such An Anim And A Model //------------------------------------------------------- diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index bf2b62994d..29223cf01b 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -10554,7 +10554,7 @@ qboolean PM_SaberLocked( void ) int remaining = 0; if( ValidAnimFileIndex( gent->client->clientInfo.animFileIndex ) ) { - ja_animation_t *anim; + animation_t *anim; float currentFrame, junk2; int curFrame, junk; int strength = 1; @@ -10697,7 +10697,7 @@ qboolean PM_SaberLocked( void ) if( ValidAnimFileIndex( genemy->client->clientInfo.animFileIndex ) ) { - ja_animation_t *anim; + animation_t *anim; anim = &level.knownAnimFileSets[genemy->client->clientInfo.animFileIndex].animations[genemy->client->ps.torsoAnim]; /* float currentFrame, junk2; diff --git a/code/game/bg_public.h b/code/game/bg_public.h index 4afafb16c4..e2e7b936dd 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -454,8 +454,7 @@ typedef enum { } entity_event_t; -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class ja_animation_t +class animation_t { public: unsigned short firstFrame; @@ -485,7 +484,7 @@ class ja_animation_t saved_game->read(loopFrames); saved_game->read(glaIndex); } -}; // ja_animation_t +}; // animation_t #define MAX_ANIM_FILES 16 #define MAX_ANIM_EVENTS 300 diff --git a/code/game/fields.h b/code/game/fields.h index ba7bb10294..8d358319ce 100644 --- a/code/game/fields.h +++ b/code/game/fields.h @@ -37,9 +37,9 @@ along with this program; if not, see . #define FOFS(x) offsetof(gentity_t, x) // usually already defined in qshared.h #endif #define STOFS(x) offsetof(spawn_temp_t, x) -#define LLOFS(x) offsetof(ja_level_locals_t, x) -#define CLOFS(x) offsetof(ja_gclient_t, x) -#define NPCOFS(x) offsetof(ja_gNPC_t, x) +#define LLOFS(x) offsetof(level_locals_t, x) +#define CLOFS(x) offsetof(gclient_t, x) +#define NPCOFS(x) offsetof(gNPC_t, x) #define VHOFS(x) offsetof(Vehicle_t, x) // diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index dc77d4253c..c40de5e202 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -481,7 +481,7 @@ global pain sound events for all clients. =============== */ void P_DamageFeedback( gentity_t *player ) { - ja_gclient_t *client; + gclient_t *client; float count; vec3_t angles; @@ -1685,7 +1685,7 @@ Actions that happen once a second ================== */ void ClientTimerActions( gentity_t *ent, int msec ) { - ja_gclient_t *client; + gclient_t *client; client = ent->client; client->timeResidual += msec; @@ -1734,7 +1734,7 @@ void ClientTimerActions( gentity_t *ent, int msec ) { ClientIntermissionThink ==================== */ -static qboolean ClientCinematicThink( ja_gclient_t *client ) { +static qboolean ClientCinematicThink( gclient_t *client ) { client->ps.eFlags &= ~EF_FIRING; // swap button actions @@ -1760,7 +1760,7 @@ extern void WP_SaberUpdateOldBladeData( gentity_t *ent ); void ClientEvents( gentity_t *ent, int oldEventSequence ) { int i; int event; - ja_gclient_t *client; + gclient_t *client; //int damage; #ifndef FINAL_BUILD qboolean fired = qfalse; @@ -4412,7 +4412,7 @@ This function is called ONLY from ClientThinkReal, and is responsible for settin */ void ClientAlterSpeed(gentity_t *ent, usercmd_t *ucmd, qboolean controlledByPlayer, float vehicleFrameTimeModifier) { - ja_gclient_t *client = ent->client; + gclient_t *client = ent->client; Vehicle_t *pVeh = NULL; if ( ent->client && ent->client->NPC_class == CLASS_VEHICLE ) @@ -4754,7 +4754,7 @@ extern float G_CanJumpToEnemyVeh(Vehicle_t *pVeh, const usercmd_t *pUmcd ); void ClientThink_real( gentity_t *ent, usercmd_t *ucmd ) { - ja_gclient_t *client; + gclient_t *client; pmove_t pm; vec3_t oldOrigin; int oldEventSequence; diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index 5d55ebb9b1..4fb143297b 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -453,7 +453,7 @@ if desired. */ void ClientUserinfoChanged( int clientNum ) { gentity_t *ent = g_entities + clientNum; - ja_gclient_t *client = ent->client; + gclient_t *client = ent->client; int health=100, maxHealth=100; const char *s=NULL; char userinfo[MAX_INFO_STRING]={0}, buf[MAX_INFO_STRING]={0}, @@ -526,12 +526,12 @@ char *ClientConnect( int clientNum, qboolean firstTime, SavedGameJustLoaded_e eS // they can connect ent->client = level.clients + clientNum; - ja_gclient_t *client = ent->client; + gclient_t *client = ent->client; // if (!qbFromSavedGame) if (eSavedGameJustLoaded != eFULL) { - ja_clientSession_t savedSess = client->sess; // + clientSession_t savedSess = client->sess; // memset( client, 0, sizeof(*client) ); client->sess = savedSess; if ( firstTime ) { //not loading full, and directconnect @@ -581,7 +581,7 @@ void ClientBegin( int clientNum, usercmd_t *cmd, SavedGameJustLoaded_e eSavedGam // qboolean qbFromSavedGame { gentity_t *ent; - ja_gclient_t *client; + gclient_t *client; ent = g_entities + clientNum; client = level.clients + clientNum; @@ -681,7 +681,7 @@ Player_RestoreFromPrevLevel */ static void Player_RestoreFromPrevLevel(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded) { - ja_gclient_t *client = ent->client; + gclient_t *client = ent->client; int i; assert(client); @@ -2116,11 +2116,11 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded { int index; vec3_t spawn_origin, spawn_angles; - ja_gclient_t *client; + gclient_t *client; int i; - ja_clientPersistant_t saved; - ja_clientSession_t savedSess; - ja_clientInfo_t savedCi; + clientPersistant_t saved; + clientSession_t savedSess; + clientInfo_t savedCi; int persistant[MAX_PERSISTANT]; usercmd_t ucmd; gentity_t *spawnPoint; @@ -2195,11 +2195,11 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded persistant[i] = client->ps.persistant[i]; } //Preserve clientInfo - memcpy (&savedCi, &client->clientInfo, sizeof(ja_clientInfo_t)); + memcpy (&savedCi, &client->clientInfo, sizeof(clientInfo_t)); memset (client, 0, sizeof(*client)); - memcpy (&client->clientInfo, &savedCi, sizeof(ja_clientInfo_t)); + memcpy (&client->clientInfo, &savedCi, sizeof(clientInfo_t)); client->pers = saved; client->sess = savedSess; diff --git a/code/game/g_cmds.cpp b/code/game/g_cmds.cpp index e211517a31..b34868a77c 100644 --- a/code/game/g_cmds.cpp +++ b/code/game/g_cmds.cpp @@ -126,7 +126,7 @@ Returns -1 if invalid ================== */ int ClientNumberFromString( gentity_t *to, char *s ) { - ja_gclient_t *cl; + gclient_t *cl; int idnum; char s2[MAX_STRING_CHARS]; char n2[MAX_STRING_CHARS]; diff --git a/code/game/g_combat.cpp b/code/game/g_combat.cpp index a8566a64f0..42370d71a0 100644 --- a/code/game/g_combat.cpp +++ b/code/game/g_combat.cpp @@ -2049,7 +2049,7 @@ static qboolean G_Dismember( gentity_t *ent, vec3_t point, gi.G2API_StopBoneAnim( &limb->ghoul2[limb->playerModel], "pelvis" ); gi.G2API_StopBoneAnim( &limb->ghoul2[limb->playerModel], "upper_lumbar" ); //FIXME: screws up origin - ja_animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; //play the proper dismember anim on the limb gi.G2API_SetBoneAnim(&limb->ghoul2[limb->playerModel], 0, animations[limbAnim].firstFrame, animations[limbAnim].numFrames + animations[limbAnim].firstFrame, @@ -4833,7 +4833,7 @@ CheckArmor */ int CheckArmor (gentity_t *ent, int damage, int dflags, int mod) { - ja_gclient_t *client; + gclient_t *client; int save; int count; @@ -5488,7 +5488,7 @@ dflags these flags are used to control how T_Damage works */ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, const vec3_t dir, const vec3_t point, int damage, int dflags, int mod, int hitLoc ) { - ja_gclient_t *client; + gclient_t *client; int take; int asave = 0; int knockback; @@ -6330,7 +6330,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, const gi.G2API_CopyGhoul2Instance(targ->ghoul2, limb->ghoul2, -1); gi.G2API_SetRootSurface(limb->ghoul2, limb->playerModel, "lfront"); gi.G2API_SetSurfaceOnOff(&targ->ghoul2[targ->playerModel], "lfront", TURN_OFF); - ja_animation_t *animations = level.knownAnimFileSets[targ->client->clientInfo.animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[targ->client->clientInfo.animFileIndex].animations; //play the proper dismember anim on the limb gi.G2API_SetBoneAnim(&limb->ghoul2[limb->playerModel], 0, animations[BOTH_A1_BL_TR].firstFrame, diff --git a/code/game/g_local.h b/code/game/g_local.h index c99532e646..df0d6cc88f 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -88,12 +88,11 @@ along with this program; if not, see . #define VALIDSTRING( a ) ( ( a != NULL ) && ( a[0] != '\0' ) ) //animations -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class ja_animFileSet_t +class animFileSet_t { public: char filename[MAX_QPATH]; - ja_animation_t animations[MAX_ANIMATIONS]; + animation_t animations[MAX_ANIMATIONS]; animevent_t torsoAnimEvents[MAX_ANIM_EVENTS]; animevent_t legsAnimEvents[MAX_ANIM_EVENTS]; unsigned char torsoAnimEventCount; @@ -123,7 +122,7 @@ class ja_animFileSet_t saved_game->read(legsAnimEventCount); saved_game->skip(2); } -}; // ja_animFileSet_t +}; // animFileSet_t extern stringID_table_t animTable [MAX_ANIMATIONS+1]; @@ -172,8 +171,7 @@ enum alertEventLevel_e }; // !!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class ja_alertEvent_t +class alertEvent_t { public: vec3_t position; //Where the event is located @@ -217,7 +215,7 @@ class ja_alertEvent_t saved_game->read(timestamp); saved_game->read(onGround); } -}; // ja_alertEvent_t +}; // alertEvent_t // // this structure is cleared as each map is entered @@ -241,11 +239,10 @@ typedef struct #define WF_PUFFING 0x00000004 // puffing something // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class ja_level_locals_t +class level_locals_t { public: - ja_gclient_t *clients; // [maxclients] + gclient_t *clients; // [maxclients] // store latched cvars here that we want to get at often int maxclients; @@ -261,13 +258,13 @@ class ja_level_locals_t qboolean locationLinked; // target_locations get linked gentity_t *locationHead; // head of the location list - ja_alertEvent_t alertEvents[ MAX_ALERT_EVENTS ]; + alertEvent_t alertEvents[ MAX_ALERT_EVENTS ]; int numAlertEvents; int curAlertID; - ja_AIGroupInfo_t groups[MAX_FRAME_GROUPS]; + AIGroupInfo_t groups[MAX_FRAME_GROUPS]; - ja_animFileSet_t knownAnimFileSets[MAX_ANIM_FILES]; + animFileSet_t knownAnimFileSets[MAX_ANIM_FILES]; int numKnownAnimFileSets; int worldFlags; @@ -347,9 +344,9 @@ class ja_level_locals_t saved_game->read(worldFlags); saved_game->read(dmState); } -}; // ja_level_locals_t +}; // level_locals_t -extern ja_level_locals_t level; +extern level_locals_t level; extern game_export_t globals; extern cvar_t *g_gravity; @@ -639,8 +636,8 @@ void Svcmd_GameMem_f( void ); // // g_session.c // -void G_ReadSessionData( ja_gclient_t *client ); -void G_InitSessionData( ja_gclient_t *client, char *userinfo ); +void G_ReadSessionData( gclient_t *client ); +void G_InitSessionData( gclient_t *client, char *userinfo ); void G_InitWorldSession( void ); void G_WriteSessionData( void ); diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 0d75924e98..3e4f7de2ba 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -62,7 +62,7 @@ extern qboolean g_bCollidableRoffs; #define STEPSIZE 18 -ja_level_locals_t level; +level_locals_t level; game_import_t gi; game_export_t globals; gentity_t g_entities[MAX_GENTITIES]; @@ -759,7 +759,7 @@ void InitGame( const char *mapname, const char *spawntarget, int checkSum, cons ClearAllInUse(); // initialize all clients for this game level.maxclients = 1; - level.clients = (ja_gclient_t*) G_Alloc( level.maxclients * sizeof(level.clients[0]) ); + level.clients = (gclient_t*) G_Alloc( level.maxclients * sizeof(level.clients[0]) ); memset(level.clients, 0, level.maxclients * sizeof(level.clients[0])); // set client fields on player diff --git a/code/game/g_misc_model.cpp b/code/game/g_misc_model.cpp index 210ddf654b..8a01b39dc6 100644 --- a/code/game/g_misc_model.cpp +++ b/code/game/g_misc_model.cpp @@ -155,7 +155,7 @@ extern int G_ParseAnimFileSet( const char *skeletonName, const char *modelName=0 int temp_animFileIndex; void set_MiscAnim( gentity_t *ent) { - ja_animation_t *animations = level.knownAnimFileSets[temp_animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[temp_animFileIndex].animations; if (ent->playerModel & 1) { int anim = BOTH_STAND3; diff --git a/code/game/g_navigator.cpp b/code/game/g_navigator.cpp index ed38204c62..297286dea0 100644 --- a/code/game/g_navigator.cpp +++ b/code/game/g_navigator.cpp @@ -2198,7 +2198,7 @@ void NAV::RegisterDangerSense(gentity_t* actor, int alertEventIndex) // Get The Alert List For This Ent And The Alert Itself //------------------------------------------------------ TAlertList& al = mEntityAlertList[actor->s.number]; - ja_alertEvent_t& ae = level.alertEvents[alertEventIndex]; + alertEvent_t& ae = level.alertEvents[alertEventIndex]; if (ae.radius<=0.0f) { diff --git a/code/game/g_objectives.cpp b/code/game/g_objectives.cpp index e206c3b627..b9ced077d0 100644 --- a/code/game/g_objectives.cpp +++ b/code/game/g_objectives.cpp @@ -58,7 +58,7 @@ void OBJ_SetPendingObjectives(gentity_t *ent) OBJ_SaveMissionObjectives ============ */ -void OBJ_SaveMissionObjectives( ja_gclient_t *client ) +void OBJ_SaveMissionObjectives( gclient_t *client ) { ::gi.saved_game->write_chunk( INT_ID('O','B','J','T'), @@ -73,7 +73,7 @@ OBJ_SaveObjectiveData */ void OBJ_SaveObjectiveData(void) { - ja_gclient_t *client; + gclient_t *client; client = &level.clients[0]; @@ -85,7 +85,7 @@ void OBJ_SaveObjectiveData(void) OBJ_LoadMissionObjectives ============ */ -void OBJ_LoadMissionObjectives( ja_gclient_t *client ) +void OBJ_LoadMissionObjectives( gclient_t *client ) { ::gi.saved_game->read_chunk( INT_ID('O','B','J','T'), @@ -100,7 +100,7 @@ OBJ_LoadObjectiveData */ void OBJ_LoadObjectiveData(void) { - ja_gclient_t *client; + gclient_t *client; client = &level.clients[0]; diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index 5d6e77cf22..174e514cfa 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -255,9 +255,9 @@ static gentity_t *GetGEntityPtr(intptr_t iEntNum) -static intptr_t GetGroupNumber(ja_AIGroupInfo_t *pGroup) +static intptr_t GetGroupNumber(AIGroupInfo_t *pGroup) { - assert( pGroup != (ja_AIGroupInfo_t *) 0xcdcdcdcd); + assert( pGroup != (AIGroupInfo_t *) 0xcdcdcdcd); if (pGroup == NULL) { @@ -272,7 +272,7 @@ static intptr_t GetGroupNumber(ja_AIGroupInfo_t *pGroup) return iReturnIndex; } -static ja_AIGroupInfo_t *GetGroupPtr(intptr_t iGroupNum) +static AIGroupInfo_t *GetGroupPtr(intptr_t iGroupNum) { if (iGroupNum == -1) { @@ -288,12 +288,12 @@ static ja_AIGroupInfo_t *GetGroupPtr(intptr_t iGroupNum) /////////// gclient_t * //////// // // -static intptr_t GetGClientNum(ja_gclient_t *c, gentity_t *ent) +static intptr_t GetGClientNum(gclient_t *c, gentity_t *ent) { // unfortunately, I now need to see if this is a INT_ID('r','e','a','l') client (and therefore resolve to an enum), or // whether it's one of the NPC or SP_misc_weapon_shooter // - assert(c != (ja_gclient_t *)0xcdcdcdcd); + assert(c != (gclient_t *)0xcdcdcdcd); if (c == NULL) { @@ -310,7 +310,7 @@ static intptr_t GetGClientNum(ja_gclient_t *c, gentity_t *ent) } } -static ja_gclient_t *GetGClientPtr(intptr_t c) +static gclient_t *GetGClientPtr(intptr_t c) { if (c == -1) { @@ -318,7 +318,7 @@ static ja_gclient_t *GetGClientPtr(intptr_t c) } if (c == -2) { - return (ja_gclient_t *) -2; // preserve this value so that I know to load in one of Mike's private NPC clients later + return (gclient_t *) -2; // preserve this value so that I know to load in one of Mike's private NPC clients later } assert(c >= 0); @@ -407,11 +407,11 @@ static void EnumerateField(const save_field_t *pField, const byte *pbBase) break; case F_GROUP: - *(int *)pv = GetGroupNumber(*(ja_AIGroupInfo_t **)pv); + *(int *)pv = GetGroupNumber(*(AIGroupInfo_t **)pv); break; case F_GCLIENT: - *(intptr_t *)pv = GetGClientNum(*(ja_gclient_t **)pv, (gentity_t *) pbBase); + *(intptr_t *)pv = GetGClientNum(*(gclient_t **)pv, (gentity_t *) pbBase); break; case F_ITEM: @@ -448,7 +448,7 @@ static void EnumerateField(const save_field_t *pField, const byte *pbBase) case F_ALERTEVENT: // convert all gentity_t ptrs in an alertEvent array into indexes... { - ja_alertEvent_t* p = (ja_alertEvent_t *) pv; + alertEvent_t* p = (alertEvent_t *) pv; for (int i=0; iNPC; // NOT *tempEnt.NPC; !! :-) + gNPC_t npc = *ent->NPC; // NOT *tempEnt.NPC; !! :-) EnumerateFields(savefields_gNPC, &npc, INT_ID('G','N','P','C'), sizeof(npc)); } - if (tempEnt.client == (ja_gclient_t *)-2) // I know, I know... + if (tempEnt.client == (gclient_t *)-2) // I know, I know... { - ja_gclient_t client = *ent->client; // NOT *tempEnt.client!! + gclient_t client = *ent->client; // NOT *tempEnt.client!! EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I'), sizeof(client)); } @@ -1031,7 +1031,7 @@ static void ReadGEntities(qboolean qbAutosave) // if (pEnt->NPC) // will be qtrue/qfalse { - ja_gNPC_t tempNPC; + gNPC_t tempNPC; EvaluateFields(savefields_gNPC, &tempNPC,(byte *)pEntOriginal->NPC, INT_ID('G','N','P','C'), sizeof (*pEnt->NPC),qfalse); @@ -1048,7 +1048,7 @@ static void ReadGEntities(qboolean qbAutosave) // original didn't have one (hmmm...), so make a new one... // //assert(0); // I want to know about this, though not in release - pEnt->NPC = (ja_gNPC_t *) G_Alloc(sizeof(*pEnt->NPC)); + pEnt->NPC = (gNPC_t *) G_Alloc(sizeof(*pEnt->NPC)); } // copy over the one we've just loaded... @@ -1065,9 +1065,9 @@ static void ReadGEntities(qboolean qbAutosave) */ } - if (pEnt->client == (ja_gclient_t*) -2) // one of Mike G's NPC clients? + if (pEnt->client == (gclient_t*) -2) // one of Mike G's NPC clients? { - ja_gclient_t tempGClient; + gclient_t tempGClient; EvaluateFields(savefields_gClient, &tempGClient, (byte *)pEntOriginal->client, INT_ID('G','C','L','I'), sizeof(*pEnt->client),qtrue);//qfalse); @@ -1083,7 +1083,7 @@ static void ReadGEntities(qboolean qbAutosave) { // original didn't have one (hmmm...) so make a new one... // - pEnt->client = (ja_gclient_t *) G_Alloc(sizeof(*pEnt->client)); + pEnt->client = (gclient_t *) G_Alloc(sizeof(*pEnt->client)); } // copy over the one we've just loaded.... @@ -1100,7 +1100,7 @@ static void ReadGEntities(qboolean qbAutosave) // if (pEnt->parms) // will be qtrue/qfalse { - ja_parms_t tempParms; + parms_t tempParms; ::gi.saved_game->read_chunk( INT_ID('P','A','R','M'), @@ -1118,7 +1118,7 @@ static void ReadGEntities(qboolean qbAutosave) { // original didn't have one, so make a new one... // - pEnt->parms = (ja_parms_t *) G_Alloc(sizeof(*pEnt->parms)); + pEnt->parms = (parms_t *) G_Alloc(sizeof(*pEnt->parms)); } // copy over the one we've just loaded... @@ -1248,7 +1248,7 @@ void WriteLevel(qboolean qbAutosave) // write out one client - us! // assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way ReadGame works - ja_gclient_t client = level.clients[0]; + gclient_t client = level.clients[0]; EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I'), sizeof(client)); WriteLevelLocals(); // level_locals_t level } @@ -1297,7 +1297,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) //SO: We read it in, but throw it away. //Read & throw away gclient info - ja_gclient_t junkClient; + gclient_t junkClient; EvaluateFields(savefields_gClient, &junkClient, (byte *)&level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qtrue);//qfalse); ReadLevelLocals(); // level_locals_t level @@ -1312,7 +1312,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) { assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way things work - ja_gclient_t GClient; + gclient_t GClient; EvaluateFields(savefields_gClient, &GClient, (byte *)&level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qtrue);//qfalse); level.clients[0] = GClient; // struct copy ReadLevelLocals(); // level_locals_t level diff --git a/code/game/g_session.cpp b/code/game/g_session.cpp index 59beb6dd7c..8a42757085 100644 --- a/code/game/g_session.cpp +++ b/code/game/g_session.cpp @@ -42,7 +42,7 @@ G_WriteClientSessionData Called on game shutdown ================ */ -void G_WriteClientSessionData( ja_gclient_t *client ) { +void G_WriteClientSessionData( gclient_t *client ) { const char *s; const char *s2; const char *var; @@ -112,7 +112,7 @@ G_ReadSessionData Called on a reconnect ================ */ -void G_ReadSessionData( ja_gclient_t *client ) { +void G_ReadSessionData( gclient_t *client ) { char s[MAX_STRING_CHARS]; const char *var; int i; @@ -202,8 +202,8 @@ G_InitSessionData Called on a first-time connect ================ */ -void G_InitSessionData( ja_gclient_t *client, char *userinfo ) { - ja_clientSession_t *sess; +void G_InitSessionData( gclient_t *client, char *userinfo ) { + clientSession_t *sess; sess = &client->sess; diff --git a/code/game/g_shared.h b/code/game/g_shared.h index cd23705b72..7201c2e1af 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -91,8 +91,7 @@ typedef enum //# material_e #define MAX_CUSTOM_JEDI_SOUNDS 22 #define MAX_CUSTOM_SOUNDS (MAX_CUSTOM_JEDI_SOUNDS + MAX_CUSTOM_EXTRA_SOUNDS + MAX_CUSTOM_COMBAT_SOUNDS + MAX_CUSTOM_BASIC_SOUNDS) // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class ja_clientInfo_t +class clientInfo_t { public: qboolean infoValid; @@ -166,7 +165,7 @@ class ja_clientInfo_t saved_game->read(customExtraSoundDir); saved_game->read(customJediSoundDir); } -}; // ja_clientInfo_t +}; // clientInfo_t //================================================================== @@ -198,8 +197,7 @@ typedef enum #define RF_LOCKEDANGLE 1 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class ja_renderInfo_t +class renderInfo_t { public: // Legs model, or full model on one piece entities @@ -404,7 +402,7 @@ class ja_renderInfo_t saved_game->read(lookingDebounceTime); saved_game->read(legsYaw); } -}; // ja_renderInfo_t +}; // renderInfo_t // Movement information structure @@ -432,8 +430,7 @@ typedef enum { } playerTeamStateState_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class ja_playerTeamState_t +class playerTeamState_t { public: playerTeamStateState_t state; @@ -482,11 +479,10 @@ class ja_playerTeamState_t saved_game->read(flagsince); saved_game->read(lastfraggedcarrier); } -}; // ja_playerTeamState_t +}; // playerTeamState_t // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class ja_objectives_t +class objectives_t { public: qboolean display; // A displayable objective? @@ -506,14 +502,13 @@ class ja_objectives_t saved_game->read(display); saved_game->read(status); } -}; // ja_objectives_t +}; // objectives_t // NOTE: This is an arbitrary number greater than our current number of objectives with // some fluff just in case we add more in the future. #define MAX_MISSION_OBJ 100 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class ja_missionStats_t +class missionStats_t { public: int secretsFound; // # of secret areas found @@ -569,7 +564,7 @@ class ja_missionStats_t saved_game->read(forceUsed); saved_game->read(weaponUsed); } -}; // ja_missionStats_t +}; // missionStats_t // the auto following clients don't follow a specific client // number, but instead follow the first two active players @@ -582,14 +577,13 @@ class ja_missionStats_t // MUST be dealt with in G_InitSessionData() / G_ReadSessionData() / G_WriteSessionData() // // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class ja_clientSession_t +class clientSession_t { public: int missionObjectivesShown; // Number of times mission objectives have been updated team_t sessionTeam; - ja_objectives_t mission_objectives[MAX_MISSION_OBJ]; - ja_missionStats_t missionStats; // Various totals while on a mission + objectives_t mission_objectives[MAX_MISSION_OBJ]; + missionStats_t missionStats; // Various totals while on a mission void sg_export( @@ -609,13 +603,13 @@ class ja_clientSession_t saved_game->read<>(mission_objectives); saved_game->read<>(missionStats); } -}; // ja_clientSession_t +}; // clientSession_t // client data that stays across multiple respawns, but is cleared // on each level change or team change at ClientBegin() // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! // FIXME Prefix added to avoid debugging problems in Visual Studio. -class ja_clientPersistant_t +class clientPersistant_t { public: clientConnected_t connected; @@ -625,7 +619,7 @@ class ja_clientPersistant_t int enterTime; // level.time the client entered the game short cmd_angles[3]; // angles sent over in the last command - ja_playerTeamState_t teamState; // status in teamplay games + playerTeamState_t teamState; // status in teamplay games void sg_export( @@ -655,7 +649,7 @@ class ja_clientPersistant_t saved_game->skip(2); saved_game->read<>(teamState); } -}; // ja_clientPersistant_t +}; // clientPersistant_t typedef enum { BLK_NO, @@ -692,16 +686,15 @@ typedef enum //# movetype_e // this structure is cleared on each ClientSpawn(), // except for 'client->pers' and 'client->sess' -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class ja_gclient_t +class gclient_t { public: // ps MUST be the first element, because the server expects it playerState_t ps; // communicated by server to clients // private to game - ja_clientPersistant_t pers; - ja_clientSession_t sess; + clientPersistant_t pers; + clientSession_t sess; int lastCmdTime; // level.time of last usercmd_t, for EF_CONNECTION @@ -739,7 +732,7 @@ class ja_gclient_t int facial_anim; // anim to show in anim mode //Client info - updated when ClientInfoChanged is called, instead of using configstrings - ja_clientInfo_t clientInfo; + clientInfo_t clientInfo; movetype_t moveType; int jetPackTime; int fireDelay; //msec to delay calling G_FireWeapon after EV_FIREWEAPON event is called @@ -757,7 +750,7 @@ class ja_gclient_t float hiddenDist;//How close ents have to be to pick you up as an enemy vec3_t hiddenDir;//Normalized direction in which NPCs can't see you (you are hidden) - ja_renderInfo_t renderInfo; + renderInfo_t renderInfo; //dismember tracker bool dismembered; @@ -929,13 +922,12 @@ class ja_gclient_t saved_game->read(inSpaceSuffocation); saved_game->read(inSpaceIndex); } -}; // ja_gclient_t +}; // gclient_t #define MAX_PARMS 16 #define MAX_PARM_STRING_LENGTH MAX_QPATH//was 16, had to lengthen it so they could take a valid file path -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class ja_parms_t +class parms_t { public: char parm[MAX_PARMS][MAX_PARM_STRING_LENGTH]; @@ -952,7 +944,7 @@ class ja_parms_t { saved_game->read(parm); } -}; // ja_parms_t +}; // parms_t #ifdef GAME_INCLUDE //these hold the place for the enums in functions.h so i don't have to recompile everytime it changes @@ -973,7 +965,7 @@ typedef struct centity_s centity_t; // !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!!!!! struct gentity_s { entityState_t s; // communicated by server to clients - ja_gclient_t *client; // NULL if not a player (unless it's NPC ( if (this->NPC != NULL) ) ... -slc) + gclient_t *client; // NULL if not a player (unless it's NPC ( if (this->NPC != NULL) ) ... -slc) qboolean inuse; qboolean linked; // qfalse if not in any good cluster @@ -1152,7 +1144,7 @@ Ghoul2 Insert End //Script/ICARUS-related fields int m_iIcarusID; int taskID[NUM_TIDS]; - ja_parms_t *parms; + parms_t *parms; char *behaviorSet[NUM_BSETS]; char *script_targetname; int delayScriptTime; @@ -1219,7 +1211,7 @@ Ghoul2 Insert End //NPC/Player entity fields //FIXME: Make these client only? - ja_gNPC_t *NPC;//Only allocated if the entity becomes an NPC + gNPC_t *NPC;//Only allocated if the entity becomes an NPC //Other NPC/Player-related entity fields char *ownername;//Used by squadpaths to locate owning NPC diff --git a/code/game/g_target.cpp b/code/game/g_target.cpp index 904e1904b3..db57c221d4 100644 --- a/code/game/g_target.cpp +++ b/code/game/g_target.cpp @@ -925,7 +925,7 @@ void set_mission_stats_cvars( void ) char text[1024]={0}; //we'll assume that the activator is the player - ja_gclient_t* const client = &level.clients[0]; + gclient_t* const client = &level.clients[0]; if (!client) { @@ -1222,7 +1222,7 @@ void SP_target_autosave( gentity_t *self ) void target_secret_use(gentity_t *self, gentity_t *other, gentity_t *activator) { //we'll assume that the activator is the player - ja_gclient_t* const client = &level.clients[0]; + gclient_t* const client = &level.clients[0]; client->sess.missionStats.secretsFound++; if ( activator ) { diff --git a/code/game/g_weapon.cpp b/code/game/g_weapon.cpp index b72148d46c..0197f22c2d 100644 --- a/code/game/g_weapon.cpp +++ b/code/game/g_weapon.cpp @@ -1663,7 +1663,7 @@ extern stringID_table_t WPTable[]; void SP_misc_weapon_shooter( gentity_t *self ) { //alloc a client just for the weapon code to use - self->client = (ja_gclient_t *)gi.Malloc(sizeof(ja_gclient_t), TAG_G_ALLOC, qtrue); + self->client = (gclient_t *)gi.Malloc(sizeof(gclient_t), TAG_G_ALLOC, qtrue); //set weapon self->s.weapon = self->client->ps.weapon = WP_BLASTER; diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index f087f1b160..e8c41a433b 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -70,7 +70,7 @@ extern void G_SetViewEntity( gentity_t *self, gentity_t *viewEntity ); extern qboolean G_ControlledByPlayer( gentity_t *self ); extern void G_AddVoiceEvent( gentity_t *self, int event, int speakDebounceTime ); extern void CG_ChangeWeapon( int num ); -extern void CG_SaberDoWeaponHitMarks( ja_gclient_t *client, gentity_t *saberEnt, gentity_t *hitEnt, int saberNum, int bladeNum, vec3_t hitPos, vec3_t hitDir, vec3_t uaxis, vec3_t splashBackDir, float sizeTimeScale ); +extern void CG_SaberDoWeaponHitMarks( gclient_t *client, gentity_t *saberEnt, gentity_t *hitEnt, int saberNum, int bladeNum, vec3_t hitPos, vec3_t hitDir, vec3_t uaxis, vec3_t splashBackDir, float sizeTimeScale ); extern void G_AngerAlert( gentity_t *self ); extern void G_ReflectMissile( gentity_t *ent, gentity_t *missile, vec3_t forward ); extern int G_CheckLedgeDive( gentity_t *self, float checkDist, const vec3_t checkVel, qboolean tryOpposite, qboolean tryPerp ); @@ -544,7 +544,7 @@ void G_Throw( gentity_t *targ, const vec3_t newDir, float push ) } } -int WP_SetSaberModel( ja_gclient_t *client, class_t npcClass ) +int WP_SetSaberModel( gclient_t *client, class_t npcClass ) {//FIXME: read from NPCs.cfg if ( client ) { @@ -3131,7 +3131,7 @@ qboolean G_CheckIncrementLockAnim( int anim, int winOrLose ) qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLockMode_t lockMode ) { - ja_animation_t *anim; + animation_t *anim; int attAnim, defAnim, advance = 0; float attStart = 0.5f, defStart = 0.5f; float idealDist = 48.0f; diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index da6153f393..6ae3fabc55 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -2278,7 +2278,6 @@ typedef struct // so if a playerState_t is transmitted, the entityState_t can be fully derived // from it. // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. class playerState_t { public: diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 2b790af4ac..361114832d 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -2021,7 +2021,7 @@ class ui_animFileSet_t { public: char filename[MAX_QPATH]; - ja_animation_t animations[MAX_ANIMATIONS]; + animation_t animations[MAX_ANIMATIONS]; }; // ui_animFileSet_t static ui_animFileSet_t ui_knownAnimFileSets[MAX_ANIM_FILES]; @@ -2036,7 +2036,7 @@ qboolean UI_ParseAnimationFile( const char *af_filename ) float fps; char text[80000]; int animNum; - ja_animation_t *animations = ui_knownAnimFileSets[ui_numKnownAnimFileSets].animations; + animation_t *animations = ui_knownAnimFileSets[ui_numKnownAnimFileSets].animations; len = re.GetAnimationCFG(af_filename, text, sizeof(text)); if ( len <= 0 ) @@ -2206,7 +2206,7 @@ int UI_G2SetAnim(CGhoul2Info *ghlInfo, const char *boneName, int animNum, const if (animIndex != -1) { - ja_animation_t *anim = &ui_knownAnimFileSets[animIndex].animations[animNum]; + animation_t *anim = &ui_knownAnimFileSets[animIndex].animations[animNum]; if (anim->numFrames <= 0) { return 0; diff --git a/codeJK2/cgame/cg_local.h b/codeJK2/cgame/cg_local.h index 94252607c3..30eb45f99f 100644 --- a/codeJK2/cgame/cg_local.h +++ b/codeJK2/cgame/cg_local.h @@ -123,7 +123,7 @@ typedef struct { qboolean pitching; int animationNumber; - jo_animation_t *animation; + animation_t *animation; int animationTime; // time when the first frame of the animation will be exact } lerpFrame_t; diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index 709f4430e5..2e12a2b1bc 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -33,7 +33,7 @@ along with this program; if not, see . //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char, std::less, std::allocator< unsigned char > > namePrecache_m; extern namePrecache_m *as_preCacheMap; -extern void CG_RegisterNPCCustomSounds( jo_clientInfo_t *ci ); +extern void CG_RegisterNPCCustomSounds( clientInfo_t *ci ); extern qboolean G_AddSexToMunroString ( char *string, qboolean qDoBoth ); extern void CG_RegisterNPCEffects( team_t team ); extern qboolean G_ParseAnimFileSet( const char *filename, const char *animCFG, int *animFileIndex ); @@ -796,7 +796,7 @@ qhandle_t CG_RegisterHeadSkin( const char *headModelName, const char *headSkinNa CG_RegisterClientSkin ========================== */ -qboolean CG_RegisterClientSkin( jo_clientInfo_t *ci, +qboolean CG_RegisterClientSkin( clientInfo_t *ci, const char *headModelName, const char *headSkinName, const char *torsoModelName, const char *torsoSkinName, const char *legsModelName, const char *legsSkinName) @@ -852,7 +852,7 @@ qboolean CG_RegisterClientSkin( jo_clientInfo_t *ci, CG_RegisterClientModelname ========================== */ -qboolean CG_RegisterClientModelname( jo_clientInfo_t *ci, +qboolean CG_RegisterClientModelname( clientInfo_t *ci, const char *headModelName, const char *headSkinName, const char *torsoModelName, const char *torsoSkinName, const char *legsModelName, const char *legsSkinName ) @@ -939,7 +939,7 @@ Ghoul2 Insert End } -void CG_RegisterClientRenderInfo(jo_clientInfo_t *ci, jo_renderInfo_t *ri) +void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri) { char *slash; char headModelName[MAX_QPATH]; @@ -1104,7 +1104,7 @@ void CG_RegisterClientModels (int entityNum) if(entityNum < MAX_CLIENTS) { - memcpy(&cgs.clientinfo[entityNum], &ent->client->clientInfo, sizeof(jo_clientInfo_t)); + memcpy(&cgs.clientinfo[entityNum], &ent->client->clientInfo, sizeof(clientInfo_t)); } } diff --git a/codeJK2/cgame/cg_media.h b/codeJK2/cgame/cg_media.h index bd0cf363ca..5c24c4e15a 100644 --- a/codeJK2/cgame/cg_media.h +++ b/codeJK2/cgame/cg_media.h @@ -353,7 +353,7 @@ typedef struct { qhandle_t inlineDrawModel[MAX_SUBMODELS]; vec3_t inlineModelMidpoints[MAX_SUBMODELS]; - jo_clientInfo_t clientinfo[MAX_CLIENTS]; + clientInfo_t clientinfo[MAX_CLIENTS]; // media cgMedia_t media; diff --git a/codeJK2/cgame/cg_players.cpp b/codeJK2/cgame/cg_players.cpp index 7aea958e0c..ab7edc457a 100644 --- a/codeJK2/cgame/cg_players.cpp +++ b/codeJK2/cgame/cg_players.cpp @@ -43,7 +43,7 @@ taken from the entityState_t */ -qboolean CG_RegisterClientModelname( jo_clientInfo_t *ci, const char *headModelName, const char *headSkinName, +qboolean CG_RegisterClientModelname( clientInfo_t *ci, const char *headModelName, const char *headSkinName, const char *torsoModelName, const char *torsoSkinName, const char *legsModelName, const char *legsSkinName ); @@ -231,7 +231,7 @@ static const char *GetCustomSound_VariantCapped(const char *ppsTable[], int iEnt return ppsTable[iEntryNum]; } -static void CG_RegisterCustomSounds(jo_clientInfo_t *ci, int iSoundEntryBase, +static void CG_RegisterCustomSounds(clientInfo_t *ci, int iSoundEntryBase, int iTableEntries, const char *ppsTable[], const char *psDir ) { @@ -273,7 +273,7 @@ CG_CustomSound */ static sfxHandle_t CG_CustomSound( int entityNum, const char *soundName, int customSoundSet ) { - jo_clientInfo_t *ci; + clientInfo_t *ci; int i; if ( soundName[0] != '*' ) @@ -407,7 +407,7 @@ CG_NewClientinfo */ void CG_NewClientinfo( int clientNum ) { - jo_clientInfo_t *ci; + clientInfo_t *ci; const char *configstring; const char *v; // const char *s; @@ -481,7 +481,7 @@ void CG_NewClientinfo( int clientNum ) /* CG_RegisterNPCCustomSounds */ -void CG_RegisterNPCCustomSounds( jo_clientInfo_t *ci ) +void CG_RegisterNPCCustomSounds( clientInfo_t *ci ) { // const char *s; // int i; @@ -578,7 +578,7 @@ qboolean ValidAnimFileIndex ( int index ) -void ParseAnimationSndBlock(const char *asb_filename, animsounds_t *animSounds, jo_animation_t *animations, int *i,const char **text_p) +void ParseAnimationSndBlock(const char *asb_filename, animsounds_t *animSounds, animation_t *animations, int *i,const char **text_p) { const char *token; char soundString[MAX_QPATH]; @@ -757,7 +757,7 @@ void CG_ParseAnimationSndFile( const char *as_filename, int animFileIndex ) assert(animFileIndex < MAX_ANIM_FILES); animsounds_t *legsAnimSnds = level.knownAnimFileSets[animFileIndex].legsAnimSnds; animsounds_t *torsoAnimSnds = level.knownAnimFileSets[animFileIndex].torsoAnimSnds; - jo_animation_t *animations = level.knownAnimFileSets[animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[animFileIndex].animations; if ( level.knownAnimFileSets[animFileIndex].soundsCached ) {//already cached this one @@ -832,9 +832,9 @@ void CG_ParseAnimationSndFile( const char *as_filename, int animFileIndex ) CG_SetLerpFrameAnimation =============== */ -void CG_SetLerpFrameAnimation( jo_clientInfo_t *ci, lerpFrame_t *lf, int newAnimation ) +void CG_SetLerpFrameAnimation( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation ) { - jo_animation_t *anim; + animation_t *anim; if ( newAnimation < 0 || newAnimation >= MAX_ANIMATIONS ) { @@ -870,9 +870,9 @@ Sets cg.snap, cg.oldFrame, and cg.backlerp cg.time should be between oldFrameTime and frameTime after exit =============== */ -qboolean CG_RunLerpFrame( jo_clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, float fpsMod, int entNum ) { +qboolean CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, float fpsMod, int entNum ) { int f, animFrameTime; - jo_animation_t *anim; + animation_t *anim; qboolean newFrame = qfalse; if(fpsMod > 2 || fpsMod < 0.5) @@ -1002,7 +1002,7 @@ qboolean CG_RunLerpFrame( jo_clientInfo_t *ci, lerpFrame_t *lf, int newAnimation CG_ClearLerpFrame =============== */ -void CG_ClearLerpFrame( jo_clientInfo_t *ci, lerpFrame_t *lf, int animationNumber ) +void CG_ClearLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int animationNumber ) { lf->frameTime = lf->oldFrameTime = cg.time; CG_SetLerpFrameAnimation( ci, lf, animationNumber ); @@ -1023,7 +1023,7 @@ CG_PlayerAnimation */ void CG_PlayerAnimation( centity_t *cent, int *legsOld, int *legs, float *legsBackLerp, int *torsoOld, int *torso, float *torsoBackLerp ) { - jo_clientInfo_t *ci; + clientInfo_t *ci; int legsAnim; int legsTurnAnim = -1; qboolean newLegsFrame = qfalse; @@ -1147,7 +1147,7 @@ void CG_PlayerAnimSounds( int animFileIndex, qboolean torso, int oldFrame, int f else {//still in same anim, check for looping anim inSameAnim = qtrue; - jo_animation_t *animation = &level.knownAnimFileSets[animFileIndex].animations[anim]; + animation_t *animation = &level.knownAnimFileSets[animFileIndex].animations[anim]; animBackward = (animation->frameLerp<0); if ( animation->loopFrames != -1 ) {//a looping anim! @@ -1666,7 +1666,7 @@ CG_AddHeadBob */ static qboolean CG_AddHeadBob( centity_t *cent, vec3_t addTo ) { - jo_renderInfo_t *renderInfo = ¢->gent->client->renderInfo; + renderInfo_t *renderInfo = ¢->gent->client->renderInfo; const int volume = gi.VoiceVolume[cent->gent->s.clientNum]; const int volChange = volume - renderInfo->lastVoiceVolume;//was *3 because voice fromLA was too low int i; @@ -2181,7 +2181,7 @@ void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) int turnAnim = PM_TurnAnimForLegsAnim( cent->gent, cent->gent->client->ps.legsAnim ); if ( turnAnim != -1 && cent->gent->health > 0 ) { - jo_animation_t *animations = level.knownAnimFileSets[cent->gent->client->clientInfo.animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[cent->gent->client->clientInfo.animFileIndex].animations; if ( !animatingHips || ( animations[turnAnim].firstFrame != startFrame ) )// only set the anim if we aren't going to do the same animation again { @@ -3031,7 +3031,7 @@ void CG_PlayerSplash( centity_t *cent ) if ( cent->gent && cent->gent->client ) { - jo_gclient_t *cl = cent->gent->client; + gclient_t *cl = cent->gent->client; if ( cent->gent->disconnectDebounceTime < cg.time ) // can't do these expanding ripples all the time { @@ -3708,7 +3708,7 @@ static void CG_G2SetHeadAnim( centity_t *cent, int anim ) { gentity_t *gent = cent->gent; const int blendTime = 50; - const jo_animation_t *animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; + const animation_t *animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; int animFlags = BONE_ANIM_OVERRIDE ;//| BONE_ANIM_BLEND; // animSpeed is 1.0 if the frameLerp (ms/frame) is 50 (20 fps). // float timeScaleMod = (cg_timescale.value&&gent&&gent->s.clientNum==0&&!player_locked&&!MatrixMode&&gent->client->ps.forcePowersActive&(1<gent->client->clientInfo;; + clientInfo_t *ci = ¢->gent->client->clientInfo;; // if we have facial texture extensions, go get the sound override and add it to the face skin // if we aren't talking, then it will be 0 @@ -4372,7 +4372,7 @@ extern void FX_AddPrimitive( CEffect **effect, int killTime ); //------------------------------------------------------- void CG_CheckSaberInWater( centity_t *cent, centity_t *scent, int modelIndex, vec3_t origin, vec3_t angles ) { - jo_gclient_t *client = cent->gent->client; + gclient_t *client = cent->gent->client; vec3_t saberOrg; if ( !client ) { @@ -4409,7 +4409,7 @@ void CG_AddSaberBlade( centity_t *cent, centity_t *scent, refEntity_t *saber, in trace_t trace; float length; - jo_gclient_t *client = cent->gent->client; + gclient_t *client = cent->gent->client; if ( !client ) { @@ -4780,7 +4780,7 @@ CG_Player */ extern qboolean G_ControlledByPlayer( gentity_t *self ); void CG_Player( centity_t *cent ) { - jo_clientInfo_t *ci; + clientInfo_t *ci; qboolean shadow, staticScale = qfalse; float shadowPlane; const weaponData_t *wData = NULL; diff --git a/codeJK2/cgame/cg_weapons.cpp b/codeJK2/cgame/cg_weapons.cpp index afb6973f42..a03fe0268d 100644 --- a/codeJK2/cgame/cg_weapons.cpp +++ b/codeJK2/cgame/cg_weapons.cpp @@ -657,14 +657,14 @@ the weapon hand animation has 3 anims, ================= */ extern qboolean ValidAnimFileIndex ( int index ); -int CG_MapTorsoToWeaponFrame( const jo_clientInfo_t *ci, int frame, int animNum, int weaponNum, int firing ) +int CG_MapTorsoToWeaponFrame( const clientInfo_t *ci, int frame, int animNum, int weaponNum, int firing ) { // we should use the animNum to map a weapon frame instead of relying on the torso frame if ( !ValidAnimFileIndex( ci->animFileIndex ) ) { return 0; } - jo_animation_t *animations = level.knownAnimFileSets[ci->animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[ci->animFileIndex].animations; int ret=0; switch( animNum ) @@ -1054,7 +1054,7 @@ void CG_AddViewWeapon( playerState_t *ps ) else { // get clientinfo for animation map - const jo_clientInfo_t *ci = ¢->gent->client->clientInfo; + const clientInfo_t *ci = ¢->gent->client->clientInfo; int torsoAnim = cent->gent->client->ps.torsoAnim;//pe.torso.animationNumber; float currentFrame; int startFrame,endFrame,flags; diff --git a/codeJK2/game/AI_Stormtrooper.cpp b/codeJK2/game/AI_Stormtrooper.cpp index d9a4300323..d79cd1d118 100644 --- a/codeJK2/game/AI_Stormtrooper.cpp +++ b/codeJK2/game/AI_Stormtrooper.cpp @@ -28,10 +28,10 @@ along with this program; if not, see . extern void CG_DrawAlert( vec3_t origin, float rating ); extern void G_AddVoiceEvent( gentity_t *self, int event, int speakDebounceTime ); -extern void AI_GroupUpdateSquadstates( jo_AIGroupInfo_t *group, gentity_t *member, int newSquadState ); -extern qboolean AI_GroupContainsEntNum( jo_AIGroupInfo_t *group, int entNum ); -extern void AI_GroupUpdateEnemyLastSeen( jo_AIGroupInfo_t *group, vec3_t spot ); -extern void AI_GroupUpdateClearShotTime( jo_AIGroupInfo_t *group ); +extern void AI_GroupUpdateSquadstates( AIGroupInfo_t *group, gentity_t *member, int newSquadState ); +extern qboolean AI_GroupContainsEntNum( AIGroupInfo_t *group, int entNum ); +extern void AI_GroupUpdateEnemyLastSeen( AIGroupInfo_t *group, vec3_t spot ); +extern void AI_GroupUpdateClearShotTime( AIGroupInfo_t *group ); extern void NPC_TempLookTarget( gentity_t *self, int lookEntNum, int minLookTime, int maxLookTime ); extern qboolean G_ExpandPointToBBox( vec3_t point, const vec3_t mins, const vec3_t maxs, int ignore, int clipmask ); extern void ChangeWeapon( gentity_t *ent, int newWeapon ); @@ -1714,7 +1714,7 @@ void ST_Commander( void ) { int i, j; int cp, cpFlags_org, cpFlags; - jo_AIGroupInfo_t *group = NPCInfo->group; + AIGroupInfo_t *group = NPCInfo->group; gentity_t *member;//, *buddy; qboolean runner = qfalse; qboolean enemyLost = qfalse; diff --git a/codeJK2/game/AI_Utils.cpp b/codeJK2/game/AI_Utils.cpp index 511577bf53..bdd670f394 100644 --- a/codeJK2/game/AI_Utils.cpp +++ b/codeJK2/game/AI_Utils.cpp @@ -36,7 +36,7 @@ along with this program; if not, see . extern CNavigator navigator; extern cvar_t *d_noGroupAI; -qboolean AI_ValidateGroupMember( jo_AIGroupInfo_t *group, gentity_t *member ); +qboolean AI_ValidateGroupMember( AIGroupInfo_t *group, gentity_t *member ); /* ------------------------- @@ -96,7 +96,7 @@ int AI_GetGroupSize( gentity_t *ent, int radius ) } extern int NAV_FindClosestWaypointForPoint( gentity_t *ent, vec3_t point ); -int AI_ClosestGroupEntityNumToPoint( jo_AIGroupInfo_t &group, vec3_t point ) +int AI_ClosestGroupEntityNumToPoint( AIGroupInfo_t &group, vec3_t point ) { int markerWP = WAYPOINT_NONE; int cost, bestCost = Q3_INFINITE; @@ -127,7 +127,7 @@ int AI_ClosestGroupEntityNumToPoint( jo_AIGroupInfo_t &group, vec3_t point ) return closest; } -void AI_SetClosestBuddy( jo_AIGroupInfo_t *group ) +void AI_SetClosestBuddy( AIGroupInfo_t *group ) { int i, j; int dist, bestDist; @@ -149,9 +149,9 @@ void AI_SetClosestBuddy( jo_AIGroupInfo_t *group ) } } -void AI_SortGroupByPathCostToEnemy( jo_AIGroupInfo_t *group ) +void AI_SortGroupByPathCostToEnemy( AIGroupInfo_t *group ) { - jo_AIGroupMember_t bestMembers[MAX_GROUP_MEMBERS]; + AIGroupMember_t bestMembers[MAX_GROUP_MEMBERS]; int i, j, k; qboolean sort = qfalse; @@ -247,7 +247,7 @@ qboolean AI_FindSelfInPreviousGroup( gentity_t *self ) return qfalse; } -void AI_InsertGroupMember( jo_AIGroupInfo_t *group, gentity_t *member ) +void AI_InsertGroupMember( AIGroupInfo_t *group, gentity_t *member ) { //okay, you know what? Check this damn group and make sure we're not already in here! int i; @@ -322,7 +322,7 @@ qboolean AI_GetNextEmptyGroup( gentity_t *self ) } } -qboolean AI_ValidateNoEnemyGroupMember( jo_AIGroupInfo_t *group, gentity_t *member ) +qboolean AI_ValidateNoEnemyGroupMember( AIGroupInfo_t *group, gentity_t *member ) { if ( !group ) { @@ -353,7 +353,7 @@ qboolean AI_ValidateNoEnemyGroupMember( jo_AIGroupInfo_t *group, gentity_t *memb return qtrue; } -qboolean AI_ValidateGroupMember( jo_AIGroupInfo_t *group, gentity_t *member ) +qboolean AI_ValidateGroupMember( AIGroupInfo_t *group, gentity_t *member ) { //Validate ents if ( member == NULL ) @@ -494,7 +494,7 @@ void AI_GetGroup( gentity_t *self ) } //create a new one - memset( self->NPC->group, 0, sizeof( jo_AIGroupInfo_t ) ); + memset( self->NPC->group, 0, sizeof( AIGroupInfo_t ) ); self->NPC->group->enemy = self->enemy; self->NPC->group->team = self->client->playerTeam; @@ -560,7 +560,7 @@ void AI_GetGroup( gentity_t *self ) AI_SetClosestBuddy( self->NPC->group ); } -void AI_SetNewGroupCommander( jo_AIGroupInfo_t *group ) +void AI_SetNewGroupCommander( AIGroupInfo_t *group ) { gentity_t *member = NULL; group->commander = NULL; @@ -575,7 +575,7 @@ void AI_SetNewGroupCommander( jo_AIGroupInfo_t *group ) } } -void AI_DeleteGroupMember( jo_AIGroupInfo_t *group, int memberNum ) +void AI_DeleteGroupMember( AIGroupInfo_t *group, int memberNum ) { if ( group->commander && group->commander->s.number == group->member[memberNum].number ) { @@ -623,7 +623,7 @@ extern void ST_MarkToCover( gentity_t *self ); extern void ST_StartFlee( gentity_t *self, gentity_t *enemy, vec3_t dangerPoint, int dangerLevel, int minTime, int maxTime ); void AI_GroupMemberKilled( gentity_t *self ) { - jo_AIGroupInfo_t *group = self->NPC->group; + AIGroupInfo_t *group = self->NPC->group; gentity_t *member; qboolean noflee = qfalse; @@ -699,7 +699,7 @@ void AI_GroupMemberKilled( gentity_t *self ) } } -void AI_GroupUpdateEnemyLastSeen( jo_AIGroupInfo_t *group, vec3_t spot ) +void AI_GroupUpdateEnemyLastSeen( AIGroupInfo_t *group, vec3_t spot ) { if ( !group ) { @@ -709,7 +709,7 @@ void AI_GroupUpdateEnemyLastSeen( jo_AIGroupInfo_t *group, vec3_t spot ) VectorCopy( spot, group->enemyLastSeenPos ); } -void AI_GroupUpdateClearShotTime( jo_AIGroupInfo_t *group ) +void AI_GroupUpdateClearShotTime( AIGroupInfo_t *group ) { if ( !group ) { @@ -718,7 +718,7 @@ void AI_GroupUpdateClearShotTime( jo_AIGroupInfo_t *group ) group->lastClearShotTime = level.time; } -void AI_GroupUpdateSquadstates( jo_AIGroupInfo_t *group, gentity_t *member, int newSquadState ) +void AI_GroupUpdateSquadstates( AIGroupInfo_t *group, gentity_t *member, int newSquadState ) { if ( !group ) { @@ -738,7 +738,7 @@ void AI_GroupUpdateSquadstates( jo_AIGroupInfo_t *group, gentity_t *member, int } } -qboolean AI_RefreshGroup( jo_AIGroupInfo_t *group ) +qboolean AI_RefreshGroup( AIGroupInfo_t *group ) { gentity_t *member; int i;//, j; @@ -975,7 +975,7 @@ void AI_UpdateGroups( void ) } } -qboolean AI_GroupContainsEntNum( jo_AIGroupInfo_t *group, int entNum ) +qboolean AI_GroupContainsEntNum( AIGroupInfo_t *group, int entNum ) { if ( !group ) { diff --git a/codeJK2/game/NPC.cpp b/codeJK2/game/NPC.cpp index b6a69e2224..30cbcece69 100644 --- a/codeJK2/game/NPC.cpp +++ b/codeJK2/game/NPC.cpp @@ -75,8 +75,8 @@ cvar_t *d_slowmodeath; extern qboolean stop_icarus; gentity_t *NPC; -jo_gNPC_t *NPCInfo; -jo_gclient_t *client; +gNPC_t *NPCInfo; +gclient_t *client; usercmd_t ucmd; visibility_t enemyVisibility; @@ -817,8 +817,8 @@ void SetNPCGlobals( gentity_t *ent ) } gentity_t *_saved_NPC; -jo_gNPC_t *_saved_NPCInfo; -jo_gclient_t *_saved_client; +gNPC_t *_saved_NPCInfo; +gclient_t *_saved_client; usercmd_t _saved_ucmd; void SaveNPCGlobals() diff --git a/codeJK2/game/NPC_senses.cpp b/codeJK2/game/NPC_senses.cpp index 8a0508ff50..57e6abc8e5 100644 --- a/codeJK2/game/NPC_senses.cpp +++ b/codeJK2/game/NPC_senses.cpp @@ -699,12 +699,12 @@ void ClearPlayerAlertEvents( void ) {//still have more in the array if ( (i+1) < MAX_ALERT_EVENTS ) { - memmove( &level.alertEvents[i], &level.alertEvents[i+1], sizeof(jo_alertEvent_t)*(MAX_ALERT_EVENTS-(i+1) ) ); + memmove( &level.alertEvents[i], &level.alertEvents[i+1], sizeof(alertEvent_t)*(MAX_ALERT_EVENTS-(i+1) ) ); } } else {//just clear this one... or should we clear the whole array? - memset( &level.alertEvents[i], 0, sizeof( jo_alertEvent_t ) ); + memset( &level.alertEvents[i], 0, sizeof( alertEvent_t ) ); } } } @@ -739,12 +739,12 @@ qboolean RemoveOldestAlert( void ) {//still have more in the array if ( (oldestEvent+1) < MAX_ALERT_EVENTS ) { - memmove( &level.alertEvents[oldestEvent], &level.alertEvents[oldestEvent+1], sizeof(jo_alertEvent_t)*(MAX_ALERT_EVENTS-(oldestEvent+1) ) ); + memmove( &level.alertEvents[oldestEvent], &level.alertEvents[oldestEvent+1], sizeof(alertEvent_t)*(MAX_ALERT_EVENTS-(oldestEvent+1) ) ); } } else {//just clear this one... or should we clear the whole array? - memset( &level.alertEvents[oldestEvent], 0, sizeof( jo_alertEvent_t ) ); + memset( &level.alertEvents[oldestEvent], 0, sizeof( alertEvent_t ) ); } } //make sure this never drops below zero... if it does, something very very bad happened diff --git a/codeJK2/game/NPC_spawn.cpp b/codeJK2/game/NPC_spawn.cpp index c3faba73ce..cd2c2b3055 100644 --- a/codeJK2/game/NPC_spawn.cpp +++ b/codeJK2/game/NPC_spawn.cpp @@ -74,7 +74,7 @@ extern void NPC_Mark2_Precache(void); extern void NPC_GalakMech_Precache( void ); extern void NPC_GalakMech_Init( gentity_t *ent ); extern void NPC_Protocol_Precache( void ); -extern int WP_SetSaberModel( jo_gclient_t *client, class_t npcClass ); +extern int WP_SetSaberModel( gclient_t *client, class_t npcClass ); #define NSF_DROP_TO_FLOOR 16 @@ -771,7 +771,7 @@ extern qboolean stop_icarus; void NPC_Begin (gentity_t *ent) { vec3_t spawn_origin, spawn_angles; - jo_gclient_t *client; + gclient_t *client; usercmd_t ucmd; gentity_t *spawnPoint = NULL; @@ -1070,9 +1070,9 @@ void NPC_Begin (gentity_t *ent) } } -jo_gNPC_t *New_NPC_t() +gNPC_t *New_NPC_t() { - jo_gNPC_t *ptr = (jo_gNPC_t *)G_Alloc (sizeof(jo_gNPC_t)); + gNPC_t *ptr = (gNPC_t *)G_Alloc (sizeof(gNPC_t)); if (ptr) { @@ -1222,7 +1222,7 @@ void NPC_Spawn_Go( gentity_t *ent ) newent->NPC->tempGoal->owner = newent; newent->NPC->tempGoal->svFlags |= SVF_NOCLIENT; - newent->client = (jo_gclient_t *)G_Alloc (sizeof(jo_gclient_t)); + newent->client = (gclient_t *)G_Alloc (sizeof(gclient_t)); if ( newent->client == NULL ) { diff --git a/codeJK2/game/NPC_stats.cpp b/codeJK2/game/NPC_stats.cpp index 1eec8d1da2..4aa7aabba3 100644 --- a/codeJK2/game/NPC_stats.cpp +++ b/codeJK2/game/NPC_stats.cpp @@ -301,9 +301,9 @@ static int MoveTypeNameToEnum( const char *name ) return MT_STATIC; } -extern void CG_RegisterClientRenderInfo(jo_clientInfo_t *ci, jo_renderInfo_t *ri); +extern void CG_RegisterClientRenderInfo(clientInfo_t *ci, renderInfo_t *ri); extern void CG_RegisterClientModels (int entityNum); -extern void CG_RegisterNPCCustomSounds( jo_clientInfo_t *ci ); +extern void CG_RegisterNPCCustomSounds( clientInfo_t *ci ); extern void CG_RegisterNPCEffects( team_t team ); extern void CG_ParseAnimationSndFile( const char *filename, int animFileIndex ); @@ -355,7 +355,7 @@ qboolean G_ParseAnimationFile( const char *af_filename ) //int skip; char text[40000]; int animNum; - jo_animation_t *animations = level.knownAnimFileSets[level.numKnownAnimFileSets].animations; + animation_t *animations = level.knownAnimFileSets[level.numKnownAnimFileSets].animations; len = gi.RE_GetAnimationCFG(af_filename, NULL, 0); if (len <= 0) @@ -705,8 +705,8 @@ Precaches NPC skins, tgas and md3s. */ void NPC_Precache ( gentity_t *spawner ) { - jo_clientInfo_t ci={}; - jo_renderInfo_t ri={}; + clientInfo_t ci={}; + renderInfo_t ri={}; team_t playerTeam = TEAM_FREE; const char *token; const char *value; @@ -1069,9 +1069,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) char sound[MAX_QPATH]; char playerModel[MAX_QPATH]; char customSkin[MAX_QPATH]; - jo_clientInfo_t *ci = &NPC->client->clientInfo; - jo_renderInfo_t *ri = &NPC->client->renderInfo; - jo_gNPCstats_t *stats = NULL; + clientInfo_t *ci = &NPC->client->clientInfo; + renderInfo_t *ri = &NPC->client->renderInfo; + gNPCstats_t *stats = NULL; qboolean md3Model = qtrue; char surfOff[1024]; char surfOn[1024]; diff --git a/codeJK2/game/NPC_utils.cpp b/codeJK2/game/NPC_utils.cpp index 602fb14242..b885de820c 100644 --- a/codeJK2/game/NPC_utils.cpp +++ b/codeJK2/game/NPC_utils.cpp @@ -1108,7 +1108,7 @@ gentity_t *NPC_PickEnemyExt( qboolean checkAlerts = qfalse ) //There is an event to look at if ( alertEvent >= 0 ) { - jo_alertEvent_t *event = &level.alertEvents[alertEvent]; + alertEvent_t *event = &level.alertEvents[alertEvent]; //Don't pay attention to our own alerts if ( event->owner == NPC ) diff --git a/codeJK2/game/Q3_Interface.cpp b/codeJK2/game/Q3_Interface.cpp index 86dc9efcd7..7a6a73c9fa 100644 --- a/codeJK2/game/Q3_Interface.cpp +++ b/codeJK2/game/Q3_Interface.cpp @@ -722,8 +722,8 @@ Q3_SetObjective static void Q3_SetObjective(const char *ObjEnum, int status) { int objectiveID; - jo_gclient_t *client; - jo_objectives_t *objective; + gclient_t *client; + objectives_t *objective; int *objectivesShown; client = &level.clients[0]; @@ -4124,8 +4124,8 @@ void Q3_SetParm (int entID, int parmNum, const char *parmValue) if( !ent->parms ) { - ent->parms = (jo_parms_t *)G_Alloc( sizeof(jo_parms_t) ); - memset( ent->parms, 0, sizeof(jo_parms_t) ); + ent->parms = (parms_t *)G_Alloc( sizeof(parms_t) ); + memset( ent->parms, 0, sizeof(parms_t) ); } if ( (val = Q3_CheckStringCounterIncrement( parmValue )) ) @@ -9265,7 +9265,7 @@ void Interface_Init( interface_export_t *pe ) pe->I_LinkEntity = ICARUS_LinkEntity; pe->saved_game = gi.saved_game; - jo_gclient_t *client; + gclient_t *client; client = &level.clients[0]; memset(&client->sess,0,sizeof(client->sess)); } diff --git a/codeJK2/game/ai.h b/codeJK2/game/ai.h index ad0a12c707..3bd7e0ae47 100644 --- a/codeJK2/game/ai.h +++ b/codeJK2/game/ai.h @@ -105,8 +105,7 @@ void NPC_BSHowler_Default( void ); //Group AI #define MAX_FRAME_GROUPS 32 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class jo_AIGroupMember_t +class AIGroupMember_t { public: int number; @@ -132,12 +131,11 @@ class jo_AIGroupMember_t saved_game->read(pathCostToEnemy); saved_game->read(closestBuddy); } -}; // jo_AIGroupMember_t +}; // AIGroupMember_t #define MAX_GROUP_MEMBERS 32 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class jo_AIGroupInfo_t +class AIGroupInfo_t { public: int numGroup; @@ -156,7 +154,7 @@ class jo_AIGroupInfo_t gentity_t *commander; vec3_t enemyLastSeenPos; int numState[ NUM_SQUAD_STATES ]; - jo_AIGroupMember_t member[ MAX_GROUP_MEMBERS ]; + AIGroupMember_t member[ MAX_GROUP_MEMBERS ]; void sg_export( @@ -202,7 +200,7 @@ class jo_AIGroupInfo_t saved_game->read(numState); saved_game->read<>(member); } -}; // jo_AIGroupInfo_t +}; // AIGroupInfo_t int AI_GetGroupSize( vec3_t origin, int radius, team_t playerTeam, gentity_t *avoid = NULL ); int AI_GetGroupSize( gentity_t *ent, int radius ); diff --git a/codeJK2/game/anims.h b/codeJK2/game/anims.h index 8e873893bf..d4b9cb9943 100644 --- a/codeJK2/game/anims.h +++ b/codeJK2/game/anims.h @@ -1399,12 +1399,11 @@ extern stringID_table_t animTable [MAX_ANIMATIONS+1]; #endif// #ifndef CG_PLAYER_CPP // !!!!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class jo_animFileSet_t +class animFileSet_t { public: char filename[MAX_QPATH]; - jo_animation_t animations[MAX_ANIMATIONS]; + animation_t animations[MAX_ANIMATIONS]; animsounds_t torsoAnimSnds[MAX_ANIM_SOUNDS]; animsounds_t legsAnimSnds[MAX_ANIM_SOUNDS]; qboolean soundsCached; @@ -1429,7 +1428,7 @@ class jo_animFileSet_t saved_game->read<>(legsAnimSnds); saved_game->read(soundsCached); } -}; // jo_animFileSet_t +}; // animFileSet_t #define MAX_ANIM_FILES 64 #endif// #ifndef __ANIMS_H__ diff --git a/codeJK2/game/b_local.h b/codeJK2/game/b_local.h index dd3ebd0f55..4b9ed50062 100644 --- a/codeJK2/game/b_local.h +++ b/codeJK2/game/b_local.h @@ -81,8 +81,8 @@ extern void Debug_NPCPrintf( gentity_t *printNPC, cvar_t *cv, int debugLevel, ch //MCG - Begin============================================================ //NPC_ai variables - shared by NPC.cpp andf the following modules extern gentity_t *NPC; -extern jo_gNPC_t *NPCInfo; -extern jo_gclient_t *client; +extern gNPC_t *NPCInfo; +extern gclient_t *client; extern usercmd_t ucmd; extern visibility_t enemyVisibility; diff --git a/codeJK2/game/b_public.h b/codeJK2/game/b_public.h index 9f76dba605..66d5c29e6e 100644 --- a/codeJK2/game/b_public.h +++ b/codeJK2/game/b_public.h @@ -114,7 +114,7 @@ typedef enum //# movetype_e NUM_MOVETYPES } movetype_t; -class jo_gNPCstats_t +class gNPCstats_t {//Stats, loaded in, and can be set by scripts public: //AI @@ -184,7 +184,7 @@ class jo_gNPCstats_t saved_game->read(health); saved_game->read(acceleration); } -}; // jo_gNPCstats_t +}; // gNPCstats_t // NOTE!!! If you add any ptr fields into this structure could you please tell me so I can update the load/save code? // so far the only things I've got to cope with are a bunch of gentity_t*'s, but tell me if any more get added -slc @@ -194,8 +194,7 @@ class jo_gNPCstats_t #define ENEMY_POS_LAG_INTERVAL 100 #define ENEMY_POS_LAG_STEPS (MAX_ENEMY_POS_LAG/ENEMY_POS_LAG_INTERVAL) -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class jo_gNPC_t +class gNPC_t { public: //FIXME: Put in playerInfo or something @@ -273,12 +272,12 @@ class jo_gNPC_t int lastSideStepSide; int sideStepHoldTime; int homeWp; - jo_AIGroupInfo_t *group; + AIGroupInfo_t *group; vec3_t lastPathAngles; //So we know which way to face generally when we stop //stats - jo_gNPCstats_t stats; + gNPCstats_t stats; int aimErrorDebounceTime; float lastAimErrorYaw; float lastAimErrorPitch; @@ -555,7 +554,7 @@ class jo_gNPC_t saved_game->read(ffireDebounce); saved_game->read(ffireFadeDebounce); } -}; // jo_gNPC_t +}; // gNPC_t void G_SquadPathsInit(void); void NPC_InitGame( void ); diff --git a/codeJK2/game/bg_panimate.cpp b/codeJK2/game/bg_panimate.cpp index b7e39c2710..788cc41120 100644 --- a/codeJK2/game/bg_panimate.cpp +++ b/codeJK2/game/bg_panimate.cpp @@ -1854,7 +1854,7 @@ int PM_LegsAnimForFrame( gentity_t *ent, int legsFrame ) if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) return -1; - jo_animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; for ( int animation = 0; animation < FACE_TALK1; animation++ ) { @@ -1883,7 +1883,7 @@ int PM_LegsAnimForFrame( gentity_t *ent, int legsFrame ) int PM_ValidateAnimRange( int startFrame, int endFrame, float animSpeed ) {//given a startframe and endframe, see if that lines up with any known animation - jo_animation_t *animations = level.knownAnimFileSets[0].animations; + animation_t *animations = level.knownAnimFileSets[0].animations; for ( int anim = 0; anim < MAX_ANIMATIONS; anim++ ) { @@ -1932,7 +1932,7 @@ int PM_TorsoAnimForFrame( gentity_t *ent, int torsoFrame ) if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) return -1; - jo_animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; for ( int animation = 0; animation < LEGS_WALKBACK1; animation++ ) { @@ -1968,7 +1968,7 @@ qboolean PM_FinishedCurrentLegsAnim( gentity_t *self ) curFrame = floor( currentFrame ); int legsAnim = self->client->ps.legsAnim; - jo_animation_t *animations = level.knownAnimFileSets[self->client->clientInfo.animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[self->client->clientInfo.animFileIndex].animations; if ( curFrame >= animations[legsAnim].firstFrame + (animations[legsAnim].numFrames - 2) ) { @@ -1999,7 +1999,7 @@ qboolean PM_HasAnimation( gentity_t *ent, int animation ) if( ValidAnimFileIndex( ent->client->clientInfo.animFileIndex ) == qfalse ) return qfalse; - jo_animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; //No frames, no anim if ( animations[animation].numFrames == 0 ) @@ -2235,7 +2235,7 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, #endif return; } - jo_animation_t *animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations; float timeScaleMod = PM_GetTimeScaleMod( gent ); float animSpeed, oldAnimSpeed; int actualTime = (cg.time?cg.time:level.time); diff --git a/codeJK2/game/bg_pmove.cpp b/codeJK2/game/bg_pmove.cpp index 1d320262a9..0fb672ea5b 100644 --- a/codeJK2/game/bg_pmove.cpp +++ b/codeJK2/game/bg_pmove.cpp @@ -6490,7 +6490,7 @@ qboolean PM_SaberLocked( void ) int remaining = 0; if( ValidAnimFileIndex( gent->client->clientInfo.animFileIndex ) ) { - jo_animation_t *anim; + animation_t *anim; float currentFrame, junk2; int curFrame, junk; int strength = 1; @@ -6587,7 +6587,7 @@ qboolean PM_SaberLocked( void ) } if( ValidAnimFileIndex( genemy->client->clientInfo.animFileIndex ) ) { - jo_animation_t *anim; + animation_t *anim; anim = &level.knownAnimFileSets[genemy->client->clientInfo.animFileIndex].animations[genemy->client->ps.torsoAnim]; /* float currentFrame, junk2; diff --git a/codeJK2/game/bg_public.h b/codeJK2/game/bg_public.h index 22ec3ad694..77b11b0ad0 100644 --- a/codeJK2/game/bg_public.h +++ b/codeJK2/game/bg_public.h @@ -441,8 +441,7 @@ typedef enum { } entity_event_t; -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class jo_animation_t +class animation_t { public: int firstFrame; @@ -471,7 +470,7 @@ class jo_animation_t saved_game->read(frameLerp); saved_game->read(initialLerp); } -}; // jo_animation_t +}; // animation_t #define MAX_RANDOM_ANIMSOUNDS 8 diff --git a/codeJK2/game/fields.h b/codeJK2/game/fields.h index 42e3da31e7..c801467629 100644 --- a/codeJK2/game/fields.h +++ b/codeJK2/game/fields.h @@ -37,9 +37,9 @@ along with this program; if not, see . #define FOFS(x) offsetof(gentity_t, x) // usually already defined in qshared.h #endif #define STOFS(x) offsetof(spawn_temp_t, x) -#define LLOFS(x) offsetof(jo_level_locals_t, x) -#define CLOFS(x) offsetof(jo_gclient_t, x) -#define NPCOFS(x) offsetof(jo_gNPC_t, x) +#define LLOFS(x) offsetof(level_locals_t, x) +#define CLOFS(x) offsetof(gclient_t, x) +#define NPCOFS(x) offsetof(gNPC_t, x) // #define strFOFS(x) #x,FOFS(x) #define strSTOFS(x) #x,STOFS(x) diff --git a/codeJK2/game/g_active.cpp b/codeJK2/game/g_active.cpp index 0f3a69ec4f..77dc3847fe 100644 --- a/codeJK2/game/g_active.cpp +++ b/codeJK2/game/g_active.cpp @@ -419,7 +419,7 @@ global pain sound events for all clients. =============== */ void P_DamageFeedback( gentity_t *player ) { - jo_gclient_t *client; + gclient_t *client; float count; vec3_t angles; @@ -1134,7 +1134,7 @@ ClientInactivityTimer Returns qfalse if the client is dropped ================= */ -qboolean ClientInactivityTimer( jo_gclient_t *client ) { +qboolean ClientInactivityTimer( gclient_t *client ) { if ( ! g_inactivity->integer ) { // give everyone some time, so if the operator sets g_inactivity during @@ -1178,7 +1178,7 @@ Actions that happen once a second ================== */ void ClientTimerActions( gentity_t *ent, int msec ) { - jo_gclient_t *client; + gclient_t *client; client = ent->client; client->timeResidual += msec; @@ -1215,7 +1215,7 @@ void ClientTimerActions( gentity_t *ent, int msec ) { ClientIntermissionThink ==================== */ -static qboolean ClientCinematicThink( jo_gclient_t *client ) { +static qboolean ClientCinematicThink( gclient_t *client ) { client->ps.eFlags &= ~EF_FIRING; // swap button actions @@ -1241,7 +1241,7 @@ extern void WP_SaberUpdateOldBladeData( gentity_t *ent ); void ClientEvents( gentity_t *ent, int oldEventSequence ) { int i; int event; - jo_gclient_t *client; + gclient_t *client; //int damage; #ifndef FINAL_BUILD qboolean fired = qfalse; @@ -1982,7 +1982,7 @@ usually be a couple times for each server frame on fast clients. extern int G_FindLocalInterestPoint( gentity_t *self ); void ClientThink_real( gentity_t *ent, usercmd_t *ucmd ) { - jo_gclient_t *client; + gclient_t *client; pmove_t pm; vec3_t oldOrigin; int oldEventSequence; diff --git a/codeJK2/game/g_client.cpp b/codeJK2/game/g_client.cpp index e460630588..6f34d83f93 100644 --- a/codeJK2/game/g_client.cpp +++ b/codeJK2/game/g_client.cpp @@ -382,7 +382,7 @@ ForceClientSkin Forces a client's skin (for teamplay) =========== */ -void ForceClientSkin( jo_gclient_t *client, char *model, const char *skin ) { +void ForceClientSkin( gclient_t *client, char *model, const char *skin ) { char *p; if ((p = strchr(model, '/')) != NULL) { @@ -469,7 +469,7 @@ if desired. */ void ClientUserinfoChanged( int clientNum ) { gentity_t *ent = g_entities + clientNum; - jo_gclient_t *client = ent->client; + gclient_t *client = ent->client; int health=100, maxHealth=100; const char *s=NULL, *sex=NULL; char userinfo[MAX_INFO_STRING]={0}, buf[MAX_INFO_STRING]={0}, @@ -540,12 +540,12 @@ char *ClientConnect( int clientNum, qboolean firstTime, SavedGameJustLoaded_e eS // they can connect ent->client = level.clients + clientNum; - jo_gclient_t *client = ent->client; + gclient_t *client = ent->client; // if (!qbFromSavedGame) if (eSavedGameJustLoaded != eFULL) { - jo_clientSession_t savedSess = client->sess; // + clientSession_t savedSess = client->sess; // memset( client, 0, sizeof(*client) ); client->sess = savedSess; } @@ -591,7 +591,7 @@ void ClientBegin( int clientNum, usercmd_t *cmd, SavedGameJustLoaded_e eSavedGam // qboolean qbFromSavedGame { gentity_t *ent; - jo_gclient_t *client; + gclient_t *client; ent = g_entities + clientNum; client = level.clients + clientNum; @@ -688,7 +688,7 @@ Player_RestoreFromPrevLevel */ void Player_RestoreFromPrevLevel(gentity_t *ent) { - jo_gclient_t *client = ent->client; + gclient_t *client = ent->client; int i; assert(client); @@ -1518,11 +1518,11 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded { int index; vec3_t spawn_origin, spawn_angles; - jo_gclient_t *client; + gclient_t *client; int i; - jo_clientPersistant_t saved; - jo_clientSession_t savedSess; - jo_clientInfo_t savedCi; + clientPersistant_t saved; + clientSession_t savedSess; + clientInfo_t savedCi; int persistant[MAX_PERSISTANT]; usercmd_t ucmd; gentity_t *spawnPoint; @@ -1587,11 +1587,11 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded persistant[i] = client->ps.persistant[i]; } //Preserve clientInfo - memcpy (&savedCi, &client->clientInfo, sizeof(jo_clientInfo_t)); + memcpy (&savedCi, &client->clientInfo, sizeof(clientInfo_t)); memset (client, 0, sizeof(*client)); - memcpy (&client->clientInfo, &savedCi, sizeof(jo_clientInfo_t)); + memcpy (&client->clientInfo, &savedCi, sizeof(clientInfo_t)); client->pers = saved; client->sess = savedSess; diff --git a/codeJK2/game/g_cmds.cpp b/codeJK2/game/g_cmds.cpp index ac38665b24..668e0218c8 100644 --- a/codeJK2/game/g_cmds.cpp +++ b/codeJK2/game/g_cmds.cpp @@ -125,7 +125,7 @@ Returns -1 if invalid ================== */ int ClientNumberFromString( gentity_t *to, char *s ) { - jo_gclient_t *cl; + gclient_t *cl; int idnum; char s2[MAX_STRING_CHARS]; char n2[MAX_STRING_CHARS]; diff --git a/codeJK2/game/g_combat.cpp b/codeJK2/game/g_combat.cpp index 684df30be6..efdee55b72 100644 --- a/codeJK2/game/g_combat.cpp +++ b/codeJK2/game/g_combat.cpp @@ -1863,7 +1863,7 @@ static qboolean G_Dismember( gentity_t *ent, vec3_t point, gi.G2API_StopBoneAnim( &limb->ghoul2[limb->playerModel], "pelvis" ); gi.G2API_StopBoneAnim( &limb->ghoul2[limb->playerModel], "upper_lumbar" ); //FIXME: screws up origin - jo_animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[ent->client->clientInfo.animFileIndex].animations; //play the proper dismember anim on the limb gi.G2API_SetBoneAnim(&limb->ghoul2[limb->playerModel], 0, animations[limbAnim].firstFrame, animations[limbAnim].numFrames + animations[limbAnim].firstFrame, @@ -4303,7 +4303,7 @@ CheckArmor */ int CheckArmor (gentity_t *ent, int damage, int dflags) { - jo_gclient_t *client; + gclient_t *client; int save; int count; @@ -4794,7 +4794,7 @@ dflags these flags are used to control how T_Damage works void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_t dir, vec3_t point, int damage, int dflags, int mod, int hitLoc ) { - jo_gclient_t *client; + gclient_t *client; int take; int asave = 0; int knockback; diff --git a/codeJK2/game/g_local.h b/codeJK2/game/g_local.h index 58f8d086e0..a20601e85a 100644 --- a/codeJK2/game/g_local.h +++ b/codeJK2/game/g_local.h @@ -129,8 +129,7 @@ enum alertEventLevel_e }; // !!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class jo_alertEvent_t +class alertEvent_t { public: vec3_t position; //Where the event is located @@ -171,7 +170,7 @@ class jo_alertEvent_t saved_game->read(ID); saved_game->read(timestamp); } -}; // jo_alertEvent_t +}; // alertEvent_t // // this structure is cleared as each map is entered @@ -194,11 +193,10 @@ typedef struct #define WF_SNOWING 0x00000002 //snowing // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class jo_level_locals_t +class level_locals_t { public: - jo_gclient_t *clients; // [maxclients] + gclient_t *clients; // [maxclients] // store latched cvars here that we want to get at often int maxclients; @@ -214,13 +212,13 @@ class jo_level_locals_t qboolean locationLinked; // target_locations get linked gentity_t *locationHead; // head of the location list - jo_alertEvent_t alertEvents[ MAX_ALERT_EVENTS ]; + alertEvent_t alertEvents[ MAX_ALERT_EVENTS ]; int numAlertEvents; int curAlertID; - jo_AIGroupInfo_t groups[MAX_FRAME_GROUPS]; + AIGroupInfo_t groups[MAX_FRAME_GROUPS]; - jo_animFileSet_t knownAnimFileSets[MAX_ANIM_FILES]; + animFileSet_t knownAnimFileSets[MAX_ANIM_FILES]; int numKnownAnimFileSets; int worldFlags; @@ -293,9 +291,9 @@ class jo_level_locals_t saved_game->read(worldFlags); saved_game->read(dmState); } -}; // jo_level_locals_t +}; // level_locals_t -extern jo_level_locals_t level; +extern level_locals_t level; extern game_export_t globals; extern cvar_t *g_gravity; @@ -471,8 +469,8 @@ team_t PickTeam( int ignoreClientNum ); void SetClientViewAngle( gentity_t *ent, vec3_t angle ); gentity_t *SelectSpawnPoint ( vec3_t avoidPoint, team_t team, vec3_t origin, vec3_t angles ); void respawn (gentity_t *ent); -void InitClientPersistant (jo_gclient_t *client); -void InitClientResp (jo_gclient_t *client); +void InitClientPersistant (gclient_t *client); +void InitClientResp (gclient_t *client); qboolean ClientSpawn( gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded ); void player_die (gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int mod, int dFlags, int hitLoc); void AddScore( gentity_t *ent, int score ); @@ -576,8 +574,8 @@ void Svcmd_GameMem_f( void ); // // g_session.c // -void G_ReadSessionData( jo_gclient_t *client ); -void G_InitSessionData( jo_gclient_t *client, char *userinfo ); +void G_ReadSessionData( gclient_t *client ); +void G_InitSessionData( gclient_t *client, char *userinfo ); void G_InitWorldSession( void ); void G_WriteSessionData( void ); diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp index 43068088a1..cafe9d6126 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -44,7 +44,7 @@ int eventClearTime = 0; #define STEPSIZE 18 -jo_level_locals_t level; +level_locals_t level; game_import_t gi; game_export_t globals; gentity_t g_entities[MAX_GENTITIES]; @@ -645,7 +645,7 @@ void InitGame( const char *mapname, const char *spawntarget, int checkSum, cons ClearAllInUse(); // initialize all clients for this game level.maxclients = 1; - level.clients = (jo_gclient_t *) G_Alloc( level.maxclients * sizeof(level.clients[0]) ); + level.clients = (gclient_t *) G_Alloc( level.maxclients * sizeof(level.clients[0]) ); memset(level.clients, 0, level.maxclients * sizeof(level.clients[0])); // set client fields on player diff --git a/codeJK2/game/g_misc_model.cpp b/codeJK2/game/g_misc_model.cpp index a3e322608e..3587e13903 100644 --- a/codeJK2/game/g_misc_model.cpp +++ b/codeJK2/game/g_misc_model.cpp @@ -158,7 +158,7 @@ extern qboolean G_ParseAnimFileSet( const char *filename, const char *animCFG, i int temp_animFileIndex; void set_MiscAnim( gentity_t *ent) { - jo_animation_t *animations = level.knownAnimFileSets[temp_animFileIndex].animations; + animation_t *animations = level.knownAnimFileSets[temp_animFileIndex].animations; if (ent->playerModel & 1) { int anim = BOTH_STAND3; diff --git a/codeJK2/game/g_objectives.cpp b/codeJK2/game/g_objectives.cpp index dbd6c5c581..60c9ade3b9 100644 --- a/codeJK2/game/g_objectives.cpp +++ b/codeJK2/game/g_objectives.cpp @@ -60,7 +60,7 @@ void OBJ_SetPendingObjectives(gentity_t *ent) OBJ_SaveMissionObjectives ============ */ -void OBJ_SaveMissionObjectives( jo_gclient_t *client ) +void OBJ_SaveMissionObjectives( gclient_t *client ) { ::gi.saved_game->write_chunk( INT_ID('O','B','J','T'), @@ -75,7 +75,7 @@ OBJ_SaveObjectiveData */ void OBJ_SaveObjectiveData(void) { - jo_gclient_t *client; + gclient_t *client; client = &level.clients[0]; @@ -87,7 +87,7 @@ void OBJ_SaveObjectiveData(void) OBJ_LoadMissionObjectives ============ */ -void OBJ_LoadMissionObjectives( jo_gclient_t *client ) +void OBJ_LoadMissionObjectives( gclient_t *client ) { ::gi.saved_game->read_chunk( INT_ID('O','B','J','T'), @@ -102,7 +102,7 @@ OBJ_LoadObjectiveData */ void OBJ_LoadObjectiveData(void) { - jo_gclient_t *client; + gclient_t *client; client = &level.clients[0]; diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index e4c9ca977c..530ab2a1ec 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -239,9 +239,9 @@ gentity_t *GetGEntityPtr(intptr_t iEntNum) return (g_entities + iEntNum); } -static intptr_t GetGroupNumber(jo_AIGroupInfo_t *pGroup) +static intptr_t GetGroupNumber(AIGroupInfo_t *pGroup) { - assert( pGroup != (jo_AIGroupInfo_t *) 0xcdcdcdcd); + assert( pGroup != (AIGroupInfo_t *) 0xcdcdcdcd); if (pGroup == NULL) { @@ -256,7 +256,7 @@ static intptr_t GetGroupNumber(jo_AIGroupInfo_t *pGroup) return iReturnIndex; } -static jo_AIGroupInfo_t *GetGroupPtr(intptr_t iGroupNum) +static AIGroupInfo_t *GetGroupPtr(intptr_t iGroupNum) { if (iGroupNum == -1) { @@ -272,9 +272,9 @@ static jo_AIGroupInfo_t *GetGroupPtr(intptr_t iGroupNum) /////////// gclient_t * //////// // // -intptr_t GetGClientNum(jo_gclient_t *c) +intptr_t GetGClientNum(gclient_t *c) { - assert(c != (jo_gclient_t *)0xcdcdcdcd); + assert(c != (gclient_t *)0xcdcdcdcd); if (c == NULL) { @@ -284,7 +284,7 @@ intptr_t GetGClientNum(jo_gclient_t *c) return (c - level.clients); } -jo_gclient_t *GetGClientPtr(intptr_t c) +gclient_t *GetGClientPtr(intptr_t c) { if (c == -1) { @@ -292,7 +292,7 @@ jo_gclient_t *GetGClientPtr(intptr_t c) } if (c == -2) { - return (jo_gclient_t *) -2; // preserve this value so that I know to load in one of Mike's private NPC clients later + return (gclient_t *) -2; // preserve this value so that I know to load in one of Mike's private NPC clients later } assert(c >= 0); @@ -350,7 +350,7 @@ void EnumerateField(const field_t *pField, byte *pbBase) break; case F_GROUP: - *(intptr_t *)pv = GetGroupNumber(*(jo_AIGroupInfo_t **)pv); + *(intptr_t *)pv = GetGroupNumber(*(AIGroupInfo_t **)pv); break; case F_GCLIENT: @@ -364,7 +364,7 @@ void EnumerateField(const field_t *pField, byte *pbBase) { // regular client... // - *(intptr_t *)pv = GetGClientNum(*(jo_gclient_t **)pv); + *(intptr_t *)pv = GetGClientNum(*(gclient_t **)pv); break; } else @@ -406,7 +406,7 @@ void EnumerateField(const field_t *pField, byte *pbBase) case F_ALERTEVENT: // convert all gentity_t ptrs in an alertEvent array into indexes... { - jo_alertEvent_t* p = (jo_alertEvent_t *) pv; + alertEvent_t* p = (alertEvent_t *) pv; for (int i=0; iNPC; // NOT *tempEnt.NPC; !! :-) + gNPC_t npc = *ent->NPC; // NOT *tempEnt.NPC; !! :-) EnumerateFields(savefields_gNPC, &npc, INT_ID('G','N','P','C'), sizeof(npc)); } - if (tempEnt.client == (jo_gclient_t *)-2) // I know, I know... + if (tempEnt.client == (gclient_t *)-2) // I know, I know... { - jo_gclient_t client = *ent->client; // NOT *tempEnt.client!! + gclient_t client = *ent->client; // NOT *tempEnt.client!! EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I'), sizeof(client)); } @@ -854,7 +854,7 @@ static void ReadGEntities(qboolean qbAutosave) // if (pEnt->NPC) // will be qtrue/qfalse { - jo_gNPC_t tempNPC; + gNPC_t tempNPC; EvaluateFields(savefields_gNPC, &tempNPC,pEntOriginal->NPC, INT_ID('G','N','P','C'), sizeof (*pEnt->NPC),qfalse); @@ -871,7 +871,7 @@ static void ReadGEntities(qboolean qbAutosave) // original didn't have one (hmmm...), so make a new one... // //assert(0); // I want to know about this, though not in release - pEnt->NPC = (jo_gNPC_t *) G_Alloc(sizeof(*pEnt->NPC)); + pEnt->NPC = (gNPC_t *) G_Alloc(sizeof(*pEnt->NPC)); } // copy over the one we've just loaded... @@ -880,9 +880,9 @@ static void ReadGEntities(qboolean qbAutosave) } - if (pEnt->client == (jo_gclient_t*) -2) // one of Mike G's NPC clients? + if (pEnt->client == (gclient_t*) -2) // one of Mike G's NPC clients? { - jo_gclient_t tempGClient; + gclient_t tempGClient; EvaluateFields(savefields_gClient, &tempGClient, pEntOriginal->client, INT_ID('G','C','L','I'), sizeof(*pEnt->client),qfalse); @@ -898,7 +898,7 @@ static void ReadGEntities(qboolean qbAutosave) { // original didn't have one (hmmm...) so make a new one... // - pEnt->client = (jo_gclient_t *) G_Alloc(sizeof(*pEnt->client)); + pEnt->client = (gclient_t *) G_Alloc(sizeof(*pEnt->client)); } // copy over the one we've just loaded.... @@ -910,7 +910,7 @@ static void ReadGEntities(qboolean qbAutosave) // if (pEnt->parms) // will be qtrue/qfalse { - jo_parms_t tempParms; + parms_t tempParms; ::gi.saved_game->read_chunk( INT_ID('P','A','R','M'), @@ -928,7 +928,7 @@ static void ReadGEntities(qboolean qbAutosave) { // original didn't have one, so make a new one... // - pEnt->parms = (jo_parms_t *) G_Alloc(sizeof(*pEnt->parms)); + pEnt->parms = (parms_t *) G_Alloc(sizeof(*pEnt->parms)); } // copy over the one we've just loaded... @@ -1028,7 +1028,7 @@ void WriteLevel(qboolean qbAutosave) // write out one client - us! // assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way ReadGame works - jo_gclient_t client = level.clients[0]; + gclient_t client = level.clients[0]; EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I'), sizeof(client)); WriteLevelLocals(); // level_locals_t level } @@ -1070,7 +1070,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) //SO: We read it in, but throw it away. //Read & throw away gclient info - jo_gclient_t junkClient; + gclient_t junkClient; EvaluateFields(savefields_gClient, &junkClient, &level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qfalse); //Read & throw away objective info @@ -1085,7 +1085,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) { assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way things work - jo_gclient_t GClient; + gclient_t GClient; EvaluateFields(savefields_gClient, &GClient, &level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qfalse); level.clients[0] = GClient; // struct copy ReadLevelLocals(); // level_locals_t level diff --git a/codeJK2/game/g_session.cpp b/codeJK2/game/g_session.cpp index 44657d2bd0..1499dfa09d 100644 --- a/codeJK2/game/g_session.cpp +++ b/codeJK2/game/g_session.cpp @@ -43,7 +43,7 @@ G_WriteClientSessionData Called on game shutdown ================ */ -void G_WriteClientSessionData( jo_gclient_t *client ) { +void G_WriteClientSessionData( gclient_t *client ) { const char *s; const char *s2; const char *var; @@ -109,7 +109,7 @@ G_ReadSessionData Called on a reconnect ================ */ -void G_ReadSessionData( jo_gclient_t *client ) { +void G_ReadSessionData( gclient_t *client ) { char s[MAX_STRING_CHARS]; const char *var; int i; @@ -188,8 +188,8 @@ G_InitSessionData Called on a first-time connect ================ */ -void G_InitSessionData( jo_gclient_t *client, char *userinfo ) { - jo_clientSession_t *sess; +void G_InitSessionData( gclient_t *client, char *userinfo ) { + clientSession_t *sess; sess = &client->sess; diff --git a/codeJK2/game/g_shared.h b/codeJK2/game/g_shared.h index c25e7b1184..0213be5fd6 100644 --- a/codeJK2/game/g_shared.h +++ b/codeJK2/game/g_shared.h @@ -121,8 +121,7 @@ typedef enum //# material_e #define MAX_CUSTOM_JEDI_SOUNDS 22 #define MAX_CUSTOM_SOUNDS (MAX_CUSTOM_JEDI_SOUNDS + MAX_CUSTOM_EXTRA_SOUNDS + MAX_CUSTOM_COMBAT_SOUNDS + MAX_CUSTOM_BASIC_SOUNDS) // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class jo_clientInfo_t +class clientInfo_t { public: qboolean infoValid; @@ -199,7 +198,7 @@ class jo_clientInfo_t saved_game->read(customExtraSoundDir); saved_game->read(customJediSoundDir); } -}; // jo_clientInfo_t +}; // clientInfo_t //================================================================== @@ -255,8 +254,7 @@ typedef enum #define RF_LOCKEDANGLE 1 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class jo_renderInfo_t +class renderInfo_t { public: // Legs model, or full model on one piece entities @@ -440,7 +438,7 @@ class jo_renderInfo_t saved_game->read(lookingDebounceTime); saved_game->read(legsYaw); } -}; // jo_renderInfo_t +}; // renderInfo_t // Movement information structure @@ -468,8 +466,7 @@ typedef enum { } playerTeamStateState_t; // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class jo_playerTeamState_t +class playerTeamState_t { public: playerTeamStateState_t state; @@ -518,11 +515,10 @@ class jo_playerTeamState_t saved_game->read(flagsince); saved_game->read(lastfraggedcarrier); } -}; // jo_playerTeamState_t +}; // playerTeamState_t // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class jo_objectives_t +class objectives_t { public: qboolean display; // A displayable objective? @@ -542,12 +538,11 @@ class jo_objectives_t saved_game->read(display); saved_game->read(status); } -}; // jo_objectives_t +}; // objectives_t #define MAX_MISSION_OBJ 80 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class jo_missionStats_t +class missionStats_t { public: int secretsFound; // # of secret areas found @@ -603,7 +598,7 @@ class jo_missionStats_t saved_game->read(forceUsed); saved_game->read(weaponUsed); } -}; // jo_missionStats_t +}; // missionStats_t // the auto following clients don't follow a specific client // number, but instead follow the first two active players @@ -616,14 +611,13 @@ class jo_missionStats_t // MUST be dealt with in G_InitSessionData() / G_ReadSessionData() / G_WriteSessionData() // // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class jo_clientSession_t +class clientSession_t { public: int missionObjectivesShown; // Number of times mission objectives have been updated team_t sessionTeam; - jo_objectives_t mission_objectives[MAX_MISSION_OBJ]; - jo_missionStats_t missionStats; // Various totals while on a mission + objectives_t mission_objectives[MAX_MISSION_OBJ]; + missionStats_t missionStats; // Various totals while on a mission void sg_export( @@ -643,13 +637,13 @@ class jo_clientSession_t saved_game->read<>(mission_objectives); saved_game->read<>(missionStats); } -}; // jo_clientSession_t +}; // clientSession_t // client data that stays across multiple respawns, but is cleared // on each level change or team change at ClientBegin() // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! // FIXME Prefix added to avoid debugging problems in Visual Studio. -class jo_clientPersistant_t +class clientPersistant_t { public: clientConnected_t connected; @@ -660,7 +654,7 @@ class jo_clientPersistant_t int enterTime; // level.time the client entered the game short cmd_angles[3]; // angles sent over in the last command - jo_playerTeamState_t teamState; // status in teamplay games + playerTeamState_t teamState; // status in teamplay games void sg_export( @@ -692,7 +686,7 @@ class jo_clientPersistant_t saved_game->skip(2); saved_game->read<>(teamState); } -}; // jo_clientPersistant_t +}; // clientPersistant_t typedef enum { BLK_NO, @@ -719,16 +713,15 @@ typedef enum { // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! // this structure is cleared on each ClientSpawn(), // except for 'client->pers' and 'client->sess' -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class jo_gclient_t +class gclient_t { public: // ps MUST be the first element, because the server expects it playerState_t ps; // communicated by server to clients // private to game - jo_clientPersistant_t pers; - jo_clientSession_t sess; + clientPersistant_t pers; + clientSession_t sess; qboolean noclip; @@ -769,7 +762,7 @@ class jo_gclient_t float facial_aux; // time before next aux. If a minus value, we are in aux mode //Client info - updated when ClientInfoChanged is called, instead of using configstrings - jo_clientInfo_t clientInfo; + clientInfo_t clientInfo; signed char forced_forwardmove; signed char forced_rightmove; int fireDelay; //msec to delay calling G_FireWeapon after EV_FIREWEAPON event is called @@ -790,7 +783,7 @@ class jo_gclient_t float hiddenDist;//How close ents have to be to pick you up as an enemy vec3_t hiddenDir;//Normalized direction in which NPCs can't see you (you are hidden) - jo_renderInfo_t renderInfo; + renderInfo_t renderInfo; saberTrail_t saberTrail; //dismember tracker @@ -934,13 +927,12 @@ class jo_gclient_t saved_game->read(pushVec); saved_game->read(pushVecTime); } -}; // jo_gclient_t +}; // gclient_t #define MAX_PARMS 16 #define MAX_PARM_STRING_LENGTH MAX_QPATH//was 16, had to lengthen it so they could take a valid file path -// FIXME Added prefix to avoid debugging problems in Visual Studio. -class jo_parms_t +class parms_t { public: char parm[MAX_PARMS][MAX_PARM_STRING_LENGTH]; @@ -957,7 +949,7 @@ class jo_parms_t { saved_game->read(parm); } -}; // jo_parms_t +}; // parms_t #define GAME_INCLUDE #ifdef GAME_INCLUDE @@ -977,7 +969,7 @@ typedef struct centity_s centity_t; struct gentity_s { entityState_t s; // communicated by server to clients - jo_gclient_t *client; // NULL if not a player (unless it's NPC ( if (this->NPC != NULL) ) ... -slc) + gclient_t *client; // NULL if not a player (unless it's NPC ( if (this->NPC != NULL) ) ... -slc) qboolean inuse; qboolean linked; // qfalse if not in any good cluster @@ -1147,7 +1139,7 @@ Ghoul2 Insert End CSequencer *sequencer; CTaskManager *taskManager; int taskID[NUM_TIDS]; - jo_parms_t *parms; + parms_t *parms; char *behaviorSet[NUM_BSETS]; char *script_targetname; int delayScriptTime; @@ -1210,7 +1202,7 @@ Ghoul2 Insert End //FIELDS USED EXCLUSIVELY BY SPECIFIC CLASSES OF ENTITIES //NPC/Player entity fields //FIXME: Make these client only? - jo_gNPC_t *NPC;//Only allocated if the entity becomes an NPC + gNPC_t *NPC;//Only allocated if the entity becomes an NPC //Other NPC/Player-related entity fields char *ownername;//Used by squadpaths to locate owning NPC diff --git a/codeJK2/game/g_svcmds.cpp b/codeJK2/game/g_svcmds.cpp index 7f122a0135..83b28a27d4 100644 --- a/codeJK2/game/g_svcmds.cpp +++ b/codeJK2/game/g_svcmds.cpp @@ -78,8 +78,8 @@ void Svcmd_EntityList_f (void) { } } -jo_gclient_t *ClientForString( const char *s ) { - jo_gclient_t *cl; +gclient_t *ClientForString( const char *s ) { + gclient_t *cl; int i; int idnum; diff --git a/codeJK2/game/g_target.cpp b/codeJK2/game/g_target.cpp index 3c12415605..bfa38e1985 100644 --- a/codeJK2/game/g_target.cpp +++ b/codeJK2/game/g_target.cpp @@ -1072,7 +1072,7 @@ void SP_target_autosave( gentity_t *self ) void target_secret_use(gentity_t *self, gentity_t *other, gentity_t *activator) { //we'll assume that the activator is the player - jo_gclient_t* const client = &level.clients[0]; + gclient_t* const client = &level.clients[0]; client->sess.missionStats.secretsFound++; if ( activator ) { diff --git a/codeJK2/game/wp_saber.cpp b/codeJK2/game/wp_saber.cpp index c72c3a4fd6..1b5f5fcb40 100644 --- a/codeJK2/game/wp_saber.cpp +++ b/codeJK2/game/wp_saber.cpp @@ -362,7 +362,7 @@ void G_Throw( gentity_t *targ, vec3_t newDir, float push ) } } -int WP_SetSaberModel( jo_gclient_t *client, class_t npcClass ) +int WP_SetSaberModel( gclient_t *client, class_t npcClass ) { if ( client ) { @@ -1862,7 +1862,7 @@ extern void PM_SetAnimFrame( gentity_t *gent, int frame, qboolean torso, qboolea extern qboolean ValidAnimFileIndex ( int index ); qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLockMode_t lockMode ) { - jo_animation_t *anim; + animation_t *anim; int attAnim, defAnim, advance = 0; float attStart = 0.5f; float idealDist = 48.0f; From 501db346ac5d055749e56090a2b3e1fb380cdf03 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 24 Jul 2016 22:41:50 +0300 Subject: [PATCH 271/445] JA: Restore loading of retail saved game --- code/game/g_public.h | 6 +- code/game/g_savegame.cpp | 170 +++++++++++++++++++++++--- code/game/g_shared.h | 13 +- code/qcommon/q_shared.h | 17 ++- code/qcommon/qcommon.h | 6 +- codeJK2/game/g_shared.h | 1 - shared/qcommon/ojk_i_saved_game_fwd.h | 3 + shared/qcommon/ojk_saved_game.cpp | 11 +- shared/qcommon/ojk_saved_game.h | 3 + 9 files changed, 202 insertions(+), 28 deletions(-) diff --git a/code/game/g_public.h b/code/game/g_public.h index 0465c27a7e..a69244a3eb 100644 --- a/code/game/g_public.h +++ b/code/game/g_public.h @@ -90,7 +90,11 @@ typedef enum #ifndef GAME_INCLUDE // the server needs to know enough information to handle collision and snapshot generation -class playerState_t; +template +class PlayerStateBase; + +using playerState_t = PlayerStateBase; + struct gentity_s { entityState_t s; // communicated by server to clients diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index 174e514cfa..4ca5aece44 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -738,6 +738,126 @@ static void SG_ConvertRetailSaberinfoToNewSaberinfo( void *sabData, saberInfo_t } } + +void saberInfoRetail_t::sg_export( + saberInfo_t& dst) const +{ + ::WP_SaberSetDefaults( + &dst, + false); + + if (!activeBlocking) + { + dst.saberFlags |= SFL_NOT_ACTIVE_BLOCKING; + } + + ::memcpy( + dst.blade, + blade, + sizeof(blade)); + + dst.breakParryBonus = breakParryBonus; + dst.brokenSaber1 = brokenSaber1; + dst.brokenSaber2 = brokenSaber2; + + if (!disarmable) + { + dst.saberFlags |= SFL_NOT_DISARMABLE; + } + + dst.disarmBonus = disarmBonus; + dst.forceRestrictions = forceRestrictions; + dst.fullName = fullName; + + if (!lockable) + { + dst.saberFlags |= SFL_NOT_LOCKABLE; + } + + dst.lockBonus = lockBonus; + dst.maxChain = maxChain; + dst.model = model; + dst.name = name; + dst.numBlades = numBlades; + dst.parryBonus = parryBonus; + + if (returnDamage) + { + dst.saberFlags |= SFL_RETURN_DAMAGE; + } + + dst.singleBladeStyle = singleBladeStyle; + + if (singleBladeThrowable) + { + dst.saberFlags |= SFL_SINGLE_BLADE_THROWABLE; + } + + dst.skin = skin; + dst.soundLoop = soundLoop; + dst.soundOff = soundOff; + dst.soundOn = soundOn; + + if (style != SS_NONE && style < SS_NUM_SABER_STYLES) + { + //OLD WAY: only allowed ONE style + //learn only this style + dst.stylesLearned = 1 << style; + + //forbid all other styles + dst.stylesForbidden = 0; + for (auto styleNum = SS_NONE + 1; styleNum < SS_NUM_SABER_STYLES; ++styleNum) + { + if (styleNum != style) + { + dst.stylesForbidden |= 1 << styleNum; + } + } + } + + if (!throwable) + { + dst.saberFlags |= SFL_NOT_THROWABLE; + } + + if (twoHanded) + { + dst.saberFlags |= SFL_TWO_HANDED; + } + + dst.type = type; +} + +static void copy_retail_gclient_to_current( + const RetailGClient& src, + gclient_t& dst) +{ + const auto src_pre_size = offsetof(RetailGClient, ps.saber[0]); + + const auto src_post_offset = + offsetof(RetailGClient, ps.dualSabers); + + const auto src_post_size = sizeof(RetailGClient) - src_post_offset; + + const auto dst_post_offset = offsetof(gclient_t, ps.dualSabers); + + ::memcpy( + reinterpret_cast(&dst), + reinterpret_cast(&src), + src_pre_size); + + for (int i = 0; i < MAX_SABERS; ++i) + { + src.ps.saber[i].sg_export( + dst.ps.saber[i]); + } + + ::memcpy( + reinterpret_cast(&dst) + src_post_offset, + reinterpret_cast(&src) + dst_post_offset, + src_post_size); +} + #if 0 template static void EvaluateFields(const save_field_t *pFields, T *pbData, byte *pbOriginalRefData, unsigned int ulChid, int iSize, qboolean bOkToSizeMisMatch) @@ -796,9 +916,6 @@ static void EvaluateFields(const save_field_t *pFields, T *pbData, byte *pbOrigi } } #else -// FIXME Retail saved game not supported. -// FIXME Is it really needed? -// FIXME Also remove iSize and bOkToSizeMisMatch in that case. template static void EvaluateFields( const save_field_t* pFields, @@ -808,19 +925,44 @@ static void EvaluateFields( int iSize, qboolean bOkToSizeMisMatch) { - ::gi.saved_game->read_chunk( - ulChid); - - pbData->sg_import( - ::gi.saved_game); - - // FIXME Add support for retail version? + auto& instance = *pbData; - if (!::gi.saved_game->is_all_data_read()) + if (ulChid != INT_ID('G','C','L','I')) { - ::G_Error( - ::va("EvaluateFields(): variable-sized chunk '%s' without handler!", - ::SG_GetChidText(ulChid))); + ::gi.saved_game->read_chunk( + ulChid, + instance); + } + else + { + ::gi.saved_game->read_chunk( + ulChid); + + ::gi.saved_game->try_read( + instance); + + if (!::gi.saved_game->is_all_data_read()) + { + RetailGClient retail_client; + + ::gi.saved_game->reset_buffer_offset(); + + ::gi.saved_game->try_read( + retail_client); + + if (::gi.saved_game->is_all_data_read()) + { + copy_retail_gclient_to_current( + retail_client, + *reinterpret_cast(pbData)); + } + else + { + ::G_Error( + ::va("EvaluateFields(): variable-sized chunk '%s' without handler!", + ::SG_GetChidText(ulChid))); + } + } } if (pFields) diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 7201c2e1af..b4523aa96c 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -608,7 +608,6 @@ class clientSession_t // client data that stays across multiple respawns, but is cleared // on each level change or team change at ClientBegin() // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Prefix added to avoid debugging problems in Visual Studio. class clientPersistant_t { public: @@ -686,11 +685,12 @@ typedef enum //# movetype_e // this structure is cleared on each ClientSpawn(), // except for 'client->pers' and 'client->sess' -class gclient_t +template +class GClientBase { public: // ps MUST be the first element, because the server expects it - playerState_t ps; // communicated by server to clients + PlayerStateBase ps; // communicated by server to clients // private to game clientPersistant_t pers; @@ -922,7 +922,12 @@ class gclient_t saved_game->read(inSpaceSuffocation); saved_game->read(inSpaceIndex); } -}; // gclient_t +}; // GClientBase + + +using gclient_t = GClientBase; +using RetailGClient = GClientBase; + #define MAX_PARMS 16 #define MAX_PARM_STRING_LENGTH MAX_QPATH//was 16, had to lengthen it so they could take a valid file path diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 6ae3fabc55..84d622fa88 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -2083,8 +2083,9 @@ typedef struct } saberInfo_t; //NOTE: Below is the *retail* version of the saberInfo_t structure - it is ONLY used for loading retail-version savegames (we load the savegame into this smaller structure, then copy each field into the appropriate field in the new structure - see SG_ConvertRetailSaberinfoToNewSaberinfo() -typedef struct +class saberInfoRetail_t { +public: char *name; //entry in sabers.cfg, if any char *fullName; //the "Proper Name" of the saber, shown in the UI saberType_t type; //none, single or staff @@ -2263,7 +2264,10 @@ typedef struct saved_game->read(brokenSaber2); saved_game->read(returnDamage); } -} saberInfoRetail_t; + + void sg_export( + saberInfo_t& dst) const; +}; // saberInfoRetail_t #define MAX_SABERS 2 // if this ever changes then update the table "static const save_field_t savefields_gClient[]"!!!!!!!!!!!! @@ -2278,7 +2282,8 @@ typedef struct // so if a playerState_t is transmitted, the entityState_t can be fully derived // from it. // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -class playerState_t +template +class PlayerStateBase { public: int commandTime; // cmd->serverTime of last executed command @@ -2382,7 +2387,7 @@ class playerState_t //FIXME: maybe allocate all these structures (saber, force powers, vehicles) // or descend them as classes - so not every client has all this info - saberInfo_t saber[MAX_SABERS]; + TSaberInfo saber[MAX_SABERS]; qboolean dualSabers; qboolean SaberStaff( void ) { return ( saber[0].type == SABER_STAFF || (dualSabers && saber[1].type == SABER_STAFF) ); }; qboolean SaberActive() { return ( saber[0].Active() || (dualSabers&&saber[1].Active()) ); }; @@ -2866,8 +2871,10 @@ class playerState_t saved_game->read(brokenLimbs); saved_game->read(electrifyTime); } -}; // playerState_t +}; // PlayerStateBase + +using playerState_t = PlayerStateBase; //==================================================================== diff --git a/code/qcommon/qcommon.h b/code/qcommon/qcommon.h index 483b85b107..70580daf9d 100644 --- a/code/qcommon/qcommon.h +++ b/code/qcommon/qcommon.h @@ -68,7 +68,11 @@ void MSG_WriteData (msg_t *buf, const void *data, int length); struct usercmd_s; struct entityState_s; -class playerState_t; + +template +class PlayerStateBase; + +using playerState_t = PlayerStateBase; void MSG_WriteBits( msg_t *msg, int value, int bits ); diff --git a/codeJK2/game/g_shared.h b/codeJK2/game/g_shared.h index 0213be5fd6..3aefa95359 100644 --- a/codeJK2/game/g_shared.h +++ b/codeJK2/game/g_shared.h @@ -642,7 +642,6 @@ class clientSession_t // client data that stays across multiple respawns, but is cleared // on each level change or team change at ClientBegin() // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! -// FIXME Prefix added to avoid debugging problems in Visual Studio. class clientPersistant_t { public: diff --git a/shared/qcommon/ojk_i_saved_game_fwd.h b/shared/qcommon/ojk_i_saved_game_fwd.h index 1ed867c6b7..b55fe77b0c 100644 --- a/shared/qcommon/ojk_i_saved_game_fwd.h +++ b/shared/qcommon/ojk_i_saved_game_fwd.h @@ -141,6 +141,9 @@ class ISavedGame // Clears buffer and resets it's offset to the beginning. virtual void reset_buffer() = 0; + // Resets buffer offset to the beginning. + virtual void reset_buffer_offset() = 0; + protected: // Tags for dispatching. diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index 56bb31ce3d..5a189116a0 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -472,7 +472,9 @@ void SavedGame::raw_read( return; } - if ((io_buffer_offset_ + dst_size) > io_buffer_.size()) + auto is_overflowed = ((io_buffer_offset_ + dst_size) > io_buffer_.size()); + + if (is_overflowed) { if (!is_read_overflow_allowed_) { @@ -481,7 +483,7 @@ void SavedGame::raw_read( } } - if (!is_read_overflow_allowed_) + if (!is_overflowed) { std::uninitialized_copy_n( &io_buffer_[io_buffer_offset_], @@ -779,6 +781,11 @@ std::string SavedGame::get_chunk_id_string( void SavedGame::reset_buffer() { io_buffer_.clear(); + reset_buffer_offset(); +} + +void SavedGame::reset_buffer_offset() +{ io_buffer_offset_ = 0; } diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game.h index 3b975fa93f..1b59232796 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game.h @@ -105,6 +105,9 @@ class SavedGame : // Clears buffer and resets it's offset to the beginning. void reset_buffer() override; + // Resets buffer offset to the beginning. + void reset_buffer_offset() override; + // Renames a saved game file. static void rename( From 3dcf239041df17b181ef6872b11824ff293cd51a Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Mon, 25 Jul 2016 19:08:34 +0300 Subject: [PATCH 272/445] Clean up saved game code leftovers --- code/game/g_savegame.cpp | 297 +--------------- code/server/sv_savegame.cpp | 674 +----------------------------------- codeJK2/game/g_savegame.cpp | 90 +---- 3 files changed, 35 insertions(+), 1026 deletions(-) diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index 4ca5aece44..d31cbfbc33 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -508,8 +508,7 @@ template static void EnumerateFields( const save_field_t* pFields, const T* src_instance, - unsigned int ulChid, - size_t iLen) + unsigned int ulChid) { strList.clear(); @@ -520,7 +519,7 @@ static void EnumerateFields( // if (pFields) { for (auto pField = pFields; pField->psName; ++pField) { - assert(pField->iOffset < iLen); + assert(pField->iOffset < sizeof(T)); ::EnumerateField(pField, pbData); } } @@ -666,78 +665,6 @@ static const char *SG_GetChidText( unsigned int chid ) { } extern void WP_SaberSetDefaults( saberInfo_t *saber, qboolean setColors); -static void SG_ConvertRetailSaberinfoToNewSaberinfo( void *sabData, saberInfo_t *saberNew ) -{ - saberInfoRetail_t *saberRetail = ((saberInfoRetail_t *)(sabData)); - - for ( int saberNum = 0; saberNum < 2; saberNum++ ) - { - WP_SaberSetDefaults( &saberNew[saberNum], qfalse ); - if ( !saberRetail[saberNum].activeBlocking ) - { - saberNew[saberNum].saberFlags |= SFL_NOT_ACTIVE_BLOCKING; - } - memcpy( saberNew[saberNum].blade, saberRetail[saberNum].blade, sizeof( saberRetail[saberNum].blade ) ); - saberNew[saberNum].breakParryBonus = saberRetail[saberNum].breakParryBonus; - saberNew[saberNum].brokenSaber1 = saberRetail[saberNum].brokenSaber1; - saberNew[saberNum].brokenSaber2 = saberRetail[saberNum].brokenSaber2; - if ( !saberRetail[saberNum].disarmable ) - { - saberNew[saberNum].saberFlags |= SFL_NOT_DISARMABLE; - } - saberNew[saberNum].disarmBonus = saberRetail[saberNum].disarmBonus; - saberNew[saberNum].forceRestrictions = saberRetail[saberNum].forceRestrictions; - saberNew[saberNum].fullName = saberRetail[saberNum].fullName; - if ( !saberRetail[saberNum].lockable ) - { - saberNew[saberNum].saberFlags |= SFL_NOT_LOCKABLE; - } - saberNew[saberNum].lockBonus = saberRetail[saberNum].lockBonus; - saberNew[saberNum].maxChain = saberRetail[saberNum].maxChain; - saberNew[saberNum].model = saberRetail[saberNum].model; - saberNew[saberNum].name = saberRetail[saberNum].name; - saberNew[saberNum].numBlades = saberRetail[saberNum].numBlades; - saberNew[saberNum].parryBonus = saberRetail[saberNum].parryBonus; - if ( saberRetail[saberNum].returnDamage ) - { - saberNew[saberNum].saberFlags |= SFL_RETURN_DAMAGE; - } - saberNew[saberNum].singleBladeStyle = saberRetail[saberNum].singleBladeStyle; - if ( saberRetail[saberNum].singleBladeThrowable ) - { - saberNew[saberNum].saberFlags |= SFL_SINGLE_BLADE_THROWABLE; - } - saberNew[saberNum].skin = saberRetail[saberNum].skin; - saberNew[saberNum].soundLoop = saberRetail[saberNum].soundLoop; - saberNew[saberNum].soundOff = saberRetail[saberNum].soundOff; - saberNew[saberNum].soundOn = saberRetail[saberNum].soundOn; - if ( saberRetail[saberNum].style != SS_NONE - && saberRetail[saberNum].style < SS_NUM_SABER_STYLES ) - {//OLD WAY: only allowed ONE style - //learn only this style - saberNew[saberNum].stylesLearned = (1< -static void EvaluateFields(const save_field_t *pFields, T *pbData, byte *pbOriginalRefData, unsigned int ulChid, int iSize, qboolean bOkToSizeMisMatch) -{ - using SgType = typename T::SgType; - - iSize = static_cast(sizeof(SgType)); - - auto& sg_buffer = ::sg_get_buffer(iSize); - - auto sg_object = reinterpret_cast(sg_buffer.data()); - - int iReadSize = ::gi.ReadFromSaveGame(ulChid, sg_object, bOkToSizeMisMatch?0:iSize, NULL); - - if (iReadSize != iSize) - { - // handle any chunks that are ok to change length (typically this is a last minute hack, - // so hopefully we won't need it any more... ;-) - // - switch (ulChid) - { - // example chunk handler... - // - case INT_ID('G','C','L','I'): - if ( iSize == (int)(iReadSize+((sizeof(saberInfo_t)-sizeof(saberInfoRetail_t))*2)) ) - { - gclient_t newClient; - const int preSaberDataSize = ((intptr_t)&newClient.ps.saber[0]-(intptr_t)&newClient); - memcpy( &newClient, pbData, preSaberDataSize ); - SG_ConvertRetailSaberinfoToNewSaberinfo( ((void *)(&((gclient_t *)(pbData))->ps.saber[0])), &newClient.ps.saber[0] ); - memcpy( &newClient.ps.dualSabers, pbData+preSaberDataSize+(sizeof(saberInfoRetail_t)*2), sizeof(newClient)-(preSaberDataSize+(sizeof(saberInfo_t)*2)) ); - memcpy( pbData, &newClient, sizeof(gclient_t) ); - } - else - {//opps, not a saberInfo size mismatch, some other FUBAR-ness... - G_Error(va("EvaluateFields(): variable-sized chunk '%s' without handler!",SG_GetChidText(ulChid))); - } - break; - - default: - // won't return... - // - G_Error(va("EvaluateFields(): variable-sized chunk '%s' without handler!",SG_GetChidText(ulChid))); - break; - } - } - - ::sg_import(*sg_object, *pbData); - - if (pFields) - { - for (const save_field_t *pField = pFields; pField->psName; pField++) - { - EvaluateField(pField, reinterpret_cast(pbData), pbOriginalRefData); - } - } -} -#else template static void EvaluateFields( const save_field_t* pFields, T* pbData, byte* pbOriginalRefData, - unsigned int ulChid, - int iSize, - qboolean bOkToSizeMisMatch) + unsigned int ulChid) { auto& instance = *pbData; @@ -975,7 +842,6 @@ static void EvaluateFields( } } } -#endif /* ============== @@ -989,7 +855,7 @@ static void WriteLevelLocals () level_locals_t *temp = (level_locals_t *)gi.Malloc(sizeof(level_locals_t), TAG_TEMP_WORKSPACE, qfalse); *temp = level; // copy out all data into a temp space - EnumerateFields(savefields_LevelLocals, temp, INT_ID('L','V','L','C'), LLOFS(LEVEL_LOCALS_T_SAVESTOP)); // sizeof(temp)); + EnumerateFields(savefields_LevelLocals, temp, INT_ID('L','V','L','C')); gi.Free(temp); } @@ -1008,7 +874,7 @@ static void ReadLevelLocals () level_locals_t *temp = (level_locals_t *)gi.Malloc(sizeof(level_locals_t), TAG_TEMP_WORKSPACE, qfalse); *temp = level; // struct copy - EvaluateFields(savefields_LevelLocals, temp, (byte *)&level, INT_ID('L','V','L','C'), LLOFS(LEVEL_LOCALS_T_SAVESTOP),qfalse); // sizeof(level_locals_t)); + EvaluateFields(savefields_LevelLocals, temp, (byte *)&level, INT_ID('L','V','L','C')); level = *temp; // struct copy level.clients = pClients; // restore clients @@ -1054,7 +920,7 @@ static void WriteGEntities(qboolean qbAutosave) gi.linkentity( ent ); } - EnumerateFields(savefields_gEntity, &tempEnt, INT_ID('G','E','N','T'), sizeof(tempEnt)); + EnumerateFields(savefields_gEntity, &tempEnt, INT_ID('G','E','N','T')); // now for any fiddly bits that would be rather awkward to build into the enumerator... // @@ -1062,13 +928,13 @@ static void WriteGEntities(qboolean qbAutosave) { gNPC_t npc = *ent->NPC; // NOT *tempEnt.NPC; !! :-) - EnumerateFields(savefields_gNPC, &npc, INT_ID('G','N','P','C'), sizeof(npc)); + EnumerateFields(savefields_gNPC, &npc, INT_ID('G','N','P','C')); } if (tempEnt.client == (gclient_t *)-2) // I know, I know... { gclient_t client = *ent->client; // NOT *tempEnt.client!! - EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I'), sizeof(client)); + EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I')); } if (tempEnt.parms) @@ -1081,7 +947,7 @@ static void WriteGEntities(qboolean qbAutosave) if (tempEnt.m_pVehicle) { Vehicle_t vehicle = *ent->m_pVehicle; // NOT *tempEnt.m_pVehicle!! - EnumerateFields(savefields_gVHIC, &vehicle, INT_ID('V','H','I','C'), sizeof(vehicle)); + EnumerateFields(savefields_gVHIC, &vehicle, INT_ID('V','H','I','C')); } // the scary ghoul2 saver stuff... (fingers crossed) @@ -1166,7 +1032,7 @@ static void ReadGEntities(qboolean qbAutosave) // gi.G2API_LoadSaveCodeDestructGhoul2Info(pEnt->ghoul2); pEnt->ghoul2.kill(); - EvaluateFields(savefields_gEntity, pEnt, (byte *)pEntOriginal, INT_ID('G','E','N','T'), sizeof(*pEnt),qfalse); + EvaluateFields(savefields_gEntity, pEnt, (byte *)pEntOriginal, INT_ID('G','E','N','T')); pEnt->ghoul2.kill(); // now for any fiddly bits... @@ -1175,7 +1041,7 @@ static void ReadGEntities(qboolean qbAutosave) { gNPC_t tempNPC; - EvaluateFields(savefields_gNPC, &tempNPC,(byte *)pEntOriginal->NPC, INT_ID('G','N','P','C'), sizeof (*pEnt->NPC),qfalse); + EvaluateFields(savefields_gNPC, &tempNPC,(byte *)pEntOriginal->NPC, INT_ID('G','N','P','C')); // so can we pinch the original's one or do we have to alloc a new one?... // @@ -1211,7 +1077,7 @@ static void ReadGEntities(qboolean qbAutosave) { gclient_t tempGClient; - EvaluateFields(savefields_gClient, &tempGClient, (byte *)pEntOriginal->client, INT_ID('G','C','L','I'), sizeof(*pEnt->client),qtrue);//qfalse); + EvaluateFields(savefields_gClient, &tempGClient, (byte *)pEntOriginal->client, INT_ID('G','C','L','I')); // can we pinch the original's client handle or do we have to alloc a new one?... // @@ -1272,7 +1138,7 @@ static void ReadGEntities(qboolean qbAutosave) { Vehicle_t tempVehicle; - EvaluateFields(savefields_gVHIC, &tempVehicle,(byte *)pEntOriginal->m_pVehicle, INT_ID('V','H','I','C'), sizeof (*pEnt->m_pVehicle),qfalse); + EvaluateFields(savefields_gVHIC, &tempVehicle,(byte *)pEntOriginal->m_pVehicle, INT_ID('V','H','I','C')); // so can we pinch the original's one or do we have to alloc a new one?... // @@ -1300,14 +1166,6 @@ static void ReadGEntities(qboolean qbAutosave) ::gi.saved_game->read_chunk( INT_ID('G','H','L','2')); -// FIXME Remove -#if 0 - auto buffer = ::gi.saved_game->get_buffer(); - auto pGhoul2Data = reinterpret_cast(buffer.data()); - - gi.G2API_LoadGhoul2Models(pEnt->ghoul2, pGhoul2Data); // if it's going to crash anywhere... -#endif - gi.G2API_LoadGhoul2Models(pEnt->ghoul2, nullptr); } @@ -1391,7 +1249,7 @@ void WriteLevel(qboolean qbAutosave) // assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way ReadGame works gclient_t client = level.clients[0]; - EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I'), sizeof(client)); + EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I')); WriteLevelLocals(); // level_locals_t level } @@ -1440,7 +1298,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) //Read & throw away gclient info gclient_t junkClient; - EvaluateFields(savefields_gClient, &junkClient, (byte *)&level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qtrue);//qfalse); + EvaluateFields(savefields_gClient, &junkClient, (byte *)&level.clients[0], INT_ID('G','C','L','I')); ReadLevelLocals(); // level_locals_t level @@ -1455,7 +1313,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way things work gclient_t GClient; - EvaluateFields(savefields_gClient, &GClient, (byte *)&level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qtrue);//qfalse); + EvaluateFields(savefields_gClient, &GClient, (byte *)&level.clients[0], INT_ID('G','C','L','I')); level.clients[0] = GClient; // struct copy ReadLevelLocals(); // level_locals_t level } @@ -1492,126 +1350,3 @@ qboolean GameAllowedToSaveHere(void) } //////////////////// eof ///////////////////// - -#if 0 -// !!!!!!!!!!!!!!!!!! loadsave affecting structure !!!!!!!!!!!!!!!!!!!!!!! -struct Vehicle_t -{ - // The entity who pilots/drives this vehicle. - // NOTE: This is redundant (since m_pParentEntity->owner _should_ be the pilot). This makes things clearer though. - gentity_t *m_pPilot; - - int m_iPilotTime; //if spawnflag to die without pilot and this < level.time then die. - qboolean m_bHasHadPilot; //qtrue once the vehicle gets its first pilot - - // The passengers of this vehicle. - gentity_t **m_ppPassengers; - - // The number of passengers currently in this vehicle. - int m_iNumPassengers; - - //the droid unit NPC for this vehicle, if any - gentity_t *m_pDroidUnit; - - // The entity from which this NPC comes from. - gentity_t *m_pParentEntity; - - // If not zero, how long to wait before we can do anything with the vehicle (we're getting on still). - // -1 = board from left, -2 = board from right, -3 = jump/quick board. -4 & -5 = throw off existing pilot - int m_iBoarding; - - // Used to check if we've just started the boarding process - bool m_bWasBoarding; - - // The speed the vehicle maintains while boarding occurs (often zero) - vec3_t m_vBoardingVelocity; - - // Time modifier (must only be used in ProcessMoveCommands() and ProcessOrientCommands() and is updated in Update()). - float m_fTimeModifier; - - // Ghoul2 Animation info. - // NOTE: Since each vehicle has their own model instance, these bolts must be local to each vehicle as well. - int m_iLeftWingBone; - int m_iRightWingBone; - //int m_iDriverTag; - int m_iExhaustTag[MAX_VEHICLE_EXHAUSTS]; - int m_iMuzzleTag[MAX_VEHICLE_MUZZLES]; - int m_iDroidUnitTag; - int m_iGunnerViewTag[MAX_VEHICLE_TURRETS];//Where to put the view origin of the gunner (index) - - // This vehicles weapon muzzles. - Muzzle m_Muzzles[MAX_VEHICLE_MUZZLES]; - - // The user commands structure. - usercmd_t m_ucmd; - - // The direction an entity will eject from the vehicle towards. - int m_EjectDir; - - // Flags that describe the vehicles behavior. - unsigned int m_ulFlags; - - // NOTE: Vehicle Type ID, Orientation, and Armor MUST be transmitted over the net. - - // Current angles of this vehicle. - vec3_t m_vOrientation; - - // How long you have strafed left or right (increments every frame that you strafe to right, decrements every frame you strafe left) - int m_fStrafeTime; - - // Previous angles of this vehicle. - vec3_t m_vPrevOrientation; - - // When control is lost on a speeder, current angular velocity is stored here and applied until landing - float m_vAngularVelocity; - - vec3_t m_vFullAngleVelocity; - - // Current armor and shields of your vehicle (explodes if armor to 0). - int m_iArmor; //hull strength - STAT_HEALTH on NPC - int m_iShields; //energy shielding - STAT_ARMOR on NPC - - // Timer for all cgame-FX...? ex: exhaust? - int m_iLastFXTime; - - // When to die. - int m_iDieTime; - - // This pointer is to a valid VehicleInfo (which could be an animal, speeder, fighter, whatever). This - // contains the functions actually used to do things to this specific kind of vehicle as well as shared - // information (max speed, type, etc...). - vehicleInfo_t *m_pVehicleInfo; - - // This trace tells us if we're within landing height. - trace_t m_LandTrace; - - //bitflag of surfaces that have broken off - int m_iRemovedSurfaces; - - // the last time this vehicle fired a turbo burst - int m_iTurboTime; - - //how long it should drop like a rock for after freed from SUSPEND - int m_iDropTime; - - int m_iSoundDebounceTimer; - - //last time we incremented the shields - int lastShieldInc; - - //so we don't hold it down and toggle it back and forth - qboolean linkWeaponToggleHeld; - - //info about our weapons (linked, ammo, etc.) - vehWeaponStatus_t weaponStatus[MAX_VEHICLE_WEAPONS]; - vehTurretStatus_t turretStatus[MAX_VEHICLE_TURRETS]; - - //the guy who was previously the pilot - gentity_t* m_pOldPilot; - - // don't need these in mp - int m_safeJumpMountTime; - float m_safeJumpMountRightDot; -}; - -#endif diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 2ae7b432f7..8ee4b8582e 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -46,16 +46,8 @@ static char saveGameComment[iSG_COMMENT_SIZE]; int giSaveGameVersion; // filled in when a savegame file is opened -#if 0 -fileHandle_t fhSaveGame = 0; -#endif - SavedGameJustLoaded_e eSavedGameJustLoaded = eNO; -#if 0 -qboolean qbSGReadIsTestOnly = qfalse; // this MUST be left in this state -#endif - char sLastSaveFileLoaded[MAX_QPATH]={0}; #define iSG_MAPCMD_SIZE MAX_QPATH @@ -96,17 +88,6 @@ typedef map CChidInfo_t; CChidInfo_t save_info; #endif -#if 0 -const char *SG_GetChidText(unsigned int chid) -{ - static union { char c[5]; int i; } chidtext; - - chidtext.i = BigLong(chid); - - return chidtext.c; -} -#endif - static const char *GetString_FailedToOpenSaveGame(const char *psFilename, qboolean bOpen) { static char sTemp[256]; @@ -123,34 +104,6 @@ static const char *GetString_FailedToOpenSaveGame(const char *psFilename, qboole return sTemp; } -#if 0 -// (copes with up to 8 ptr returns at once) -// -static const char *SG_AddSavePath( const char *psPathlessBaseName ) -{ - static char sSaveName[8][MAX_OSPATH]; - static int i=0; - - int next = i = (i + 1) & 7; - i = next; - - if(psPathlessBaseName) - { - char *p = const_cast(strchr(psPathlessBaseName,'/')); - if (p) - { - while (p) - { - *p = '_'; - p = strchr(p,'/'); - } - } - } - Com_sprintf( sSaveName[i], MAX_OSPATH, "saves/%s.sav", psPathlessBaseName ); - return sSaveName[i]; -} -#endif - void SG_WipeSavegame( const char* psPathlessBaseName) { @@ -158,74 +111,9 @@ void SG_WipeSavegame( psPathlessBaseName); } -#if 0 -static qboolean SG_Move( const char *psPathlessBaseName_Src, const char *psPathlessBaseName_Dst ) -{ - const char *psLocalFilename_Src = SG_AddSavePath( psPathlessBaseName_Src ); - const char *psLocalFilename_Dst = SG_AddSavePath( psPathlessBaseName_Dst ); - - qboolean qbCopyWentOk = FS_MoveUserGenFile( psLocalFilename_Src, psLocalFilename_Dst ); - - if (!qbCopyWentOk) - { - Com_Printf(S_COLOR_RED "Error during savegame-rename. Check \"%s\" for write-protect or disk full!\n", psLocalFilename_Dst ); - return qfalse; - } - - return qtrue; -} -#endif - -#if 0 -qboolean gbSGWriteFailed = qfalse; - -static qboolean SG_Create( const char *psPathlessBaseName ) -{ - gbSGWriteFailed = qfalse; - - SG_WipeSavegame( psPathlessBaseName ); - const char *psLocalFilename = SG_AddSavePath( psPathlessBaseName ); - fhSaveGame = FS_FOpenFileWrite( psLocalFilename ); - - if(!fhSaveGame) - { - Com_Printf(GetString_FailedToOpenSaveGame(psLocalFilename,qfalse));//S_COLOR_RED "Failed to create new savegame file \"%s\"\n", psLocalFilename ); - return qfalse; - } - - auto saved_game = &ojk::SavedGame::get_instance(); - - giSaveGameVersion = iSAVEGAME_VERSION; - - saved_game->write_chunk( - INT_ID('_','V','E','R'), - ::giSaveGameVersion); - - return qtrue; -} -#endif - // called from the ERR_DROP stuff just in case the error occured during loading of a saved game, because if // we didn't do this then we'd run out of quake file handles after the 8th load fail... // -#if 0 -void SG_Shutdown() -{ - if (fhSaveGame ) - { - FS_FCloseFile( fhSaveGame ); - fhSaveGame = NULL_FILE; - } - - eSavedGameJustLoaded = eNO; // important to do this if we ERR_DROP during loading, else next map you load after - // a bad save-file you'll arrive at dead :-) - - // and this bit stops people messing up the laoder by repeatedly stabbing at the load key during loads... - // - extern qboolean gbAlreadyDoingLoad; - gbAlreadyDoingLoad = qfalse; -} -#else void SG_Shutdown() { auto saved_game = &ojk::SavedGame::get_instance(); @@ -241,91 +129,6 @@ void SG_Shutdown() extern qboolean gbAlreadyDoingLoad; gbAlreadyDoingLoad = qfalse; } -#endif - -#if 0 -qboolean SG_Close() -{ - assert( fhSaveGame ); - FS_FCloseFile( fhSaveGame ); - fhSaveGame = NULL_FILE; - -#ifdef SG_PROFILE - if (!sv_testsave->integer) - { - CChidInfo_t::iterator it; - int iCount = 0, iSize = 0; - - Com_DPrintf(S_COLOR_CYAN "================================\n"); - Com_DPrintf(S_COLOR_WHITE "CHID Count Size\n\n"); - for(it = save_info.begin(); it != save_info.end(); ++it) - { - Com_DPrintf("%s %5d %8d\n", SG_GetChidText((*it).first), (*it).second.GetCount(), (*it).second.GetSize()); - iCount += (*it).second.GetCount(); - iSize += (*it).second.GetSize(); - } - Com_DPrintf("\n" S_COLOR_WHITE "%d chunks making %d bytes\n", iCount, iSize); - Com_DPrintf(S_COLOR_CYAN "================================\n"); - save_info.clear(); - } -#endif - - CompressMem_FreeScratchBuffer(); - return qtrue; -} -#endif - -#if 0 -qboolean SG_Open( const char *psPathlessBaseName ) -{ -// if ( fhSaveGame ) // hmmm... -// { // -// SG_Close(); // -// } // - assert( !fhSaveGame); // I'd rather know about this - if(!psPathlessBaseName) - { - return qfalse; - } -//JLFSAVEGAME - - const char *psLocalFilename = SG_AddSavePath( psPathlessBaseName ); - FS_FOpenFileRead( psLocalFilename, &fhSaveGame, qtrue ); //qtrue = dup handle, so I can close it ok later - if (!fhSaveGame) - { -// Com_Printf(S_COLOR_RED "Failed to open savegame file %s\n", psLocalFilename); - Com_DPrintf(GetString_FailedToOpenSaveGame(psLocalFilename, qtrue)); - - return qfalse; - } - giSaveGameVersion=-1;//jic - - auto saved_game = &ojk::SavedGame::get_instance(); - - saved_game->read_chunk( - INT_ID('_','V','E','R'), - ::giSaveGameVersion); - - if (giSaveGameVersion != iSAVEGAME_VERSION) - { - SG_Close(); - Com_Printf (S_COLOR_RED "File \"%s\" has version # %d (expecting %d)\n",psPathlessBaseName, giSaveGameVersion, iSAVEGAME_VERSION); - return qfalse; - } - - return qtrue; -} -#endif - -#if 0 -// you should only call this when you know you've successfully opened a savegame, and you want to query for -// whether it's an old (street-copy) version, or a new (expansion-pack) version -// -int SG_Version(void) -{ - return giSaveGameVersion; -} -#endif void SV_WipeGame_f(void) { @@ -1027,14 +830,14 @@ static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest) // // alloc enough space plus extra 4K for sloppy JPG-decode reader to not do memory access violation... // - byte *pJPGData = (byte *) Z_Malloc(iScreenShotLength + 4096,TAG_TEMP_WORKSPACE, qfalse); + byte *pJPGData = (byte *) Z_Malloc(static_cast(iScreenShotLength + 4096),TAG_TEMP_WORKSPACE, qfalse); // // now read the JPG data... // saved_game->read_chunk( INT_ID('S','H','O','T'), pJPGData, - iScreenShotLength); + static_cast(iScreenShotLength)); // // decompress JPG data... @@ -1140,7 +943,7 @@ static void SG_WriteScreenshot(qboolean qbAutosave, const char *psMapName) size_t iJPGDataSize = 0; size_t bufSize = SG_SCR_WIDTH * SG_SCR_HEIGHT * 3; - byte *pJPGData = (byte *)Z_Malloc( bufSize, TAG_TEMP_WORKSPACE, qfalse, 4 ); + byte *pJPGData = (byte *)Z_Malloc( static_cast(bufSize), TAG_TEMP_WORKSPACE, qfalse, 4 ); iJPGDataSize = re.SaveJPGToBuffer(pJPGData, bufSize, JPEG_IMAGE_QUALITY, SG_SCR_WIDTH, SG_SCR_HEIGHT, pbRawScreenShot, 0 ); if ( qbAutosave ) delete[] byBlank; @@ -1403,477 +1206,9 @@ qboolean SG_ReadSavegame( ex.what()); } -#if 0 - if (!SG_Close()) - { - Com_Printf(GetString_FailedToOpenSaveGame(psPathlessBaseName, qfalse));//S_COLOR_RED "Failed to close savegame\n"); - sv_testsave->integer = iPrevTestSave; - return qfalse; - } -#endif - return true; } -#if 0 -int Compress_RLE(const byte *pIn, int iLength, byte *pOut) -{ - int iCount=0,iOutIndex=0; - - while (iCount < iLength) - { - int iIndex = iCount; - byte b = pIn[iIndex++]; - - while (iIndex1 && pIn[iIndex]!=pIn[iIndex-2]))){ - iIndex++; - } - while (iIndex 0) - { - count = (signed char) *pIn++; - if (count>0) - { - memset(pOut,*pIn++,count); - } - else - if (count<0) - { - count = (signed char) -count; - memcpy(pOut,pIn,count); - pIn += count; - } - pOut += count; - iDecompressedBytesRemaining -= count; - } -} -#endif - -#if 0 -// simulate decompression over original data (but don't actually do it), to test de/compress validity... -// -qboolean Verify_RLE(const byte *pOut, const byte *pIn, int iDecompressedBytesRemaining) -{ - signed char count; - const byte *pOutEnd = &pOut[iDecompressedBytesRemaining]; - - while (iDecompressedBytesRemaining > 0) - { - if (pOut >= pOutEnd) - return qfalse; - count = (signed char) *pIn++; - if (count>0) - { - //memset(pOut,*pIn++,count); - int iMemSetByte = *pIn++; - for (int i=0; iinteger) - return -1; - - // malloc enough to cope with uncompressable data (it'll never grow to 2* size, so)... - // - pbOut = CompressMem_AllocScratchBuffer(iLength*2); - // - // compress it... - // - int iOutputLength = Compress_RLE(pbData, iLength, pbOut); - // - // worth compressing?... - // - if (iOutputLength >= iLength) - return -1; - // - // compression code works? (I'd hope this is always the case, but for safety)... - // - if (!Verify_RLE(pbData, pbOut, iLength)) - return -1; - - return iOutputLength; -} -#endif - -#if 0 -//pass through function -int SG_Write(const void * chid, const int bytesize, fileHandle_t fhSaveGame) -{ - return FS_Write( chid, bytesize, fhSaveGame); -} -#endif - -#if 0 -qboolean SG_Append(unsigned int chid, const void *pvData, int iLength) -{ - unsigned int uiCksum; - unsigned int uiSaved; - -#ifdef _DEBUG - int i; - unsigned int *pTest; - - pTest = (unsigned int *) pvData; - for (i=0; iinteger) - { - uiCksum = Com_BlockChecksum (pvData, iLength); - - uiSaved = SG_Write(&chid, sizeof(chid), fhSaveGame); - - byte *pbCompressedData = NULL; - int iCompressedLength = CompressMem((byte*)pvData, iLength, pbCompressedData); - if (iCompressedLength != -1) - { - // compressed... (write length field out as -ve) - // - iLength = -iLength; - uiSaved += SG_Write(&iLength, sizeof(iLength), fhSaveGame); - iLength = -iLength; - // - // [compressed length] - // - uiSaved += SG_Write(&iCompressedLength, sizeof(iCompressedLength), fhSaveGame); - // - // compressed data... - // - uiSaved += SG_Write(pbCompressedData, iCompressedLength, fhSaveGame); - // - // CRC... - // - uiSaved += SG_Write(&uiCksum, sizeof(uiCksum), fhSaveGame); - - if (uiSaved != sizeof(chid) + sizeof(iLength) + sizeof(uiCksum) + sizeof(iCompressedLength) + iCompressedLength) - { - Com_Printf(S_COLOR_RED "Failed to write %s chunk\n", SG_GetChidText(chid)); - gbSGWriteFailed = qtrue; - return qfalse; - } - } - else - { - // uncompressed... - // - uiSaved += SG_Write(&iLength, sizeof(iLength), fhSaveGame); - // - // uncompressed data... - // - uiSaved += SG_Write( pvData, iLength, fhSaveGame); - // - // CRC... - // - uiSaved += SG_Write(&uiCksum, sizeof(uiCksum), fhSaveGame); - - if (uiSaved != sizeof(chid) + sizeof(iLength) + sizeof(uiCksum) + iLength) - { - Com_Printf(S_COLOR_RED "Failed to write %s chunk\n", SG_GetChidText(chid)); - gbSGWriteFailed = qtrue; - return qfalse; - } - } - - #ifdef SG_PROFILE - save_info[chid].Add(iLength); - #endif - } - - return qtrue; -} -#endif - -#if 0 -//pass through function -int SG_ReadBytes(void * chid, int bytesize, fileHandle_t fhSaveGame) -{ - return FS_Read( chid, bytesize, fhSaveGame); -} -#endif - -#if 0 -int SG_Seek( fileHandle_t fhSaveGame, long offset, int origin ) -{ - return FS_Seek(fhSaveGame, offset, origin); -} -#endif - -#if 0 -// Pass in pvAddress (or NULL if you want memory to be allocated) -// if pvAddress==NULL && ppvAddressPtr == NULL then the block is discarded/skipped. -// -// If iLength==0 then it counts as a query, else it must match the size found in the file -// -// function doesn't return if error (uses ERR_DROP), unless "qbSGReadIsTestOnly == qtrue", then NZ return = success -// -static int SG_Read_Actual(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPtr, qboolean bChunkIsOptional) -{ - unsigned int uiLoadedCksum, uiCksum; - unsigned int uiLoadedLength; - unsigned int ulLoadedChid; - unsigned int uiLoaded; - char sChidText1[MAX_QPATH]; - char sChidText2[MAX_QPATH]; - qboolean qbTransient = qfalse; - - Com_DPrintf("Attempting read of chunk %s length %d\n", SG_GetChidText(chid), iLength); - - // Load in chid and length... - // - uiLoaded = SG_ReadBytes( &ulLoadedChid, sizeof(ulLoadedChid), fhSaveGame); - uiLoaded+= SG_ReadBytes( &uiLoadedLength, sizeof(uiLoadedLength),fhSaveGame); - - qboolean bBlockIsCompressed = ((int)uiLoadedLength < 0); - if ( bBlockIsCompressed) - { - uiLoadedLength = -((int)uiLoadedLength); - } - - // Make sure we are loading the correct chunk... - // - if( ulLoadedChid != chid) - { - if (bChunkIsOptional) - { - SG_Seek( fhSaveGame, -(int)uiLoaded, FS_SEEK_CUR ); - return 0; - } - - strcpy(sChidText1, SG_GetChidText(ulLoadedChid)); - strcpy(sChidText2, SG_GetChidText(chid)); - if (!qbSGReadIsTestOnly) - { - Com_Error(ERR_DROP, "Loaded chunk ID (%s) does not match requested chunk ID (%s)", sChidText1, sChidText2); - } - return 0; - } - - // Find length of chunk and make sure it matches the requested length... - // - if( iLength ) // .. but only if there was one specified - { - if(iLength != (int)uiLoadedLength) - { - if (!qbSGReadIsTestOnly) - { - Com_Error(ERR_DROP, "Loaded chunk (%s) has different length than requested", SG_GetChidText(chid)); - } - return 0; - } - } - iLength = uiLoadedLength; // for retval - - // alloc?... - // - if ( !pvAddress ) - { - pvAddress = Z_Malloc(iLength, TAG_SAVEGAME, qfalse); - // - // Pass load address back... - // - if( ppvAddressPtr ) - { - *ppvAddressPtr = pvAddress; - } - else - { - qbTransient = qtrue; // if no passback addr, mark block for skipping - } - } - - // Load in data and magic number... - // - unsigned int uiCompressedLength=0; - if (bBlockIsCompressed) - { - // - // read compressed data length... - // - uiLoaded += SG_ReadBytes( &uiCompressedLength, sizeof(uiCompressedLength),fhSaveGame); - // - // alloc space... - // - byte *pTempRLEData = (byte *)Z_Malloc(uiCompressedLength, TAG_SAVEGAME, qfalse); - // - // read compressed data... - // - uiLoaded += SG_ReadBytes( pTempRLEData, uiCompressedLength, fhSaveGame ); - // - // decompress it... - // - DeCompress_RLE((byte *)pvAddress, pTempRLEData, iLength); - // - // free workspace... - // - Z_Free( pTempRLEData ); - } - else - { - uiLoaded += SG_ReadBytes( pvAddress, iLength, fhSaveGame ); - } - // Get checksum... - // - uiLoaded += SG_ReadBytes( &uiLoadedCksum, sizeof(uiLoadedCksum), fhSaveGame ); - - // Make sure the checksums match... - // - uiCksum = Com_BlockChecksum( pvAddress, iLength ); - if ( uiLoadedCksum != uiCksum) - { - if (!qbSGReadIsTestOnly) - { - Com_Error(ERR_DROP, "Failed checksum check for chunk", SG_GetChidText(chid)); - } - else - { - if ( qbTransient ) - { - Z_Free( pvAddress ); - } - } - return 0; - } - - // Make sure we didn't encounter any read errors... - //size_t - if ( uiLoaded != sizeof(ulLoadedChid) + sizeof(uiLoadedLength) + sizeof(uiLoadedCksum) + (bBlockIsCompressed?sizeof(uiCompressedLength):0) + (bBlockIsCompressed?uiCompressedLength:iLength)) - { - if (!qbSGReadIsTestOnly) - { - Com_Error(ERR_DROP, "Error during loading chunk %s", SG_GetChidText(chid)); - } - else - { - if ( qbTransient ) - { - Z_Free( pvAddress ); - } - } - return 0; - } - - // If we are skipping the chunk, then free the memory... - // - if ( qbTransient ) - { - Z_Free( pvAddress ); - } - - return iLength; -} -#endif - -#if 0 -int SG_Read(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPtr /* = NULL */) -{ - return SG_Read_Actual(chid, pvAddress, iLength, ppvAddressPtr, qfalse ); // qboolean bChunkIsOptional -} -#endif - -#if 0 -int SG_ReadOptional(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPtr /* = NULL */) -{ - return SG_Read_Actual(chid, pvAddress, iLength, ppvAddressPtr, qtrue); // qboolean bChunkIsOptional -} -#endif - void SG_TestSave(void) { if (sv_testsave->integer && sv.state == SS_GAME) @@ -1882,6 +1217,3 @@ void SG_TestSave(void) ge->WriteLevel(false); } } - -////////////////// eof //////////////////// - diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index 530ab2a1ec..34b62798f0 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -449,18 +449,18 @@ template static void EnumerateFields( const field_t* pFields, T* src_instance, - unsigned int ulChid, - size_t iLen) + unsigned int ulChid) { strList.clear(); - auto pbData = reinterpret_cast(src_instance); + auto pbData = reinterpret_cast( + src_instance); // enumerate all the fields... // if (pFields) { for (auto pField = pFields; pField->psName; ++pField) { - assert(pField->iOffset < iLen); + assert(pField->iOffset < sizeof(T)); ::EnumerateField(pField, pbData); } } @@ -585,61 +585,12 @@ static const char *SG_GetChidText(unsigned int chid) return chidtext; } -#if 0 -template -static void EvaluateFields(const field_t *pFields, T* pbData, T* pbOriginalRefData, unsigned int ulChid, int iSize, qboolean bOkToSizeMisMatch) -{ - using SgType = typename T::SgType; - - iSize = static_cast(sizeof(SgType)); - - auto& sg_buffer = ::sg_get_buffer(iSize); - - auto sg_object = reinterpret_cast(sg_buffer.data()); - - int iReadSize = ::gi.ReadFromSaveGame(ulChid, sg_object, bOkToSizeMisMatch?0:iSize, NULL); - - if (iReadSize != iSize) - { - // handle any chunks that are ok to change length (typically this is a last minute hack, - // so hopefully we won't need it any more... ;-) - // - switch (ulChid) - { - // example chunk handler... - // - case INT_ID('G','C','L','I'): -/* assert(iSize>iReadSize); - memset(&pbData[iReadSize], 0, iSize-iReadSize); // zero out new objectives that weren't in old-format save file - break; -*/ - default: - // won't return... - // - G_Error(va("EvaluateFields(): variable-sized chunk '%s' without handler!",SG_GetChidText(ulChid))); - break; - } - } - - ::sg_import(*sg_object, *pbData); - - if (pFields) - { - for (const field_t *pField = pFields; pField->psName; pField++) - { - EvaluateField(pField, reinterpret_cast(pbData), reinterpret_cast(pbOriginalRefData)); - } - } -} -#else template static void EvaluateFields( const field_t* pFields, T* pbData, T* pbOriginalRefData, - unsigned int ulChid, - int iSize, - qboolean bOkToSizeMisMatch) + unsigned int ulChid) { ::gi.saved_game->read_chunk( ulChid); @@ -663,7 +614,6 @@ static void EvaluateFields( } } } -#endif /* ============== @@ -677,7 +627,7 @@ static void WriteLevelLocals () level_locals_t *temp = (level_locals_t *)gi.Malloc(sizeof(level_locals_t), TAG_TEMP_WORKSPACE, qfalse); *temp = level; // copy out all data into a temp space - EnumerateFields(savefields_LevelLocals, temp, INT_ID('L','V','L','C'), LLOFS(LEVEL_LOCALS_T_SAVESTOP)); + EnumerateFields(savefields_LevelLocals, temp, INT_ID('L','V','L','C')); gi.Free(temp); } @@ -696,7 +646,7 @@ static void ReadLevelLocals () level_locals_t *temp = (level_locals_t *)gi.Malloc(sizeof(level_locals_t), TAG_TEMP_WORKSPACE, qfalse); *temp = level; - EvaluateFields(savefields_LevelLocals, temp, &level, INT_ID('L','V','L','C'), LLOFS(LEVEL_LOCALS_T_SAVESTOP),qfalse); // sizeof(level_locals_t)); + EvaluateFields(savefields_LevelLocals, temp, &level, INT_ID('L','V','L','C')); level = *temp; // struct copy level.clients = pClients; // restore clients @@ -742,7 +692,7 @@ static void WriteGEntities(qboolean qbAutosave) gi.linkentity( ent ); } - EnumerateFields(savefields_gEntity, &tempEnt, INT_ID('G','E','N','T'), sizeof(tempEnt)); + EnumerateFields(savefields_gEntity, &tempEnt, INT_ID('G','E','N','T')); // now for any fiddly bits that would be rather awkward to build into the enumerator... // @@ -750,13 +700,13 @@ static void WriteGEntities(qboolean qbAutosave) { gNPC_t npc = *ent->NPC; // NOT *tempEnt.NPC; !! :-) - EnumerateFields(savefields_gNPC, &npc, INT_ID('G','N','P','C'), sizeof(npc)); + EnumerateFields(savefields_gNPC, &npc, INT_ID('G','N','P','C')); } if (tempEnt.client == (gclient_t *)-2) // I know, I know... { gclient_t client = *ent->client; // NOT *tempEnt.client!! - EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I'), sizeof(client)); + EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I')); } if (tempEnt.parms) @@ -847,7 +797,7 @@ static void ReadGEntities(qboolean qbAutosave) // gi.G2API_LoadSaveCodeDestructGhoul2Info(pEnt->ghoul2); pEnt->ghoul2.kill(); - EvaluateFields(savefields_gEntity, pEnt, pEntOriginal, INT_ID('G','E','N','T'), sizeof(*pEnt),qfalse); + EvaluateFields(savefields_gEntity, pEnt, pEntOriginal, INT_ID('G','E','N','T')); pEnt->ghoul2.kill(); // now for any fiddly bits... @@ -856,7 +806,7 @@ static void ReadGEntities(qboolean qbAutosave) { gNPC_t tempNPC; - EvaluateFields(savefields_gNPC, &tempNPC,pEntOriginal->NPC, INT_ID('G','N','P','C'), sizeof (*pEnt->NPC),qfalse); + EvaluateFields(savefields_gNPC, &tempNPC,pEntOriginal->NPC, INT_ID('G','N','P','C')); // so can we pinch the original's one or do we have to alloc a new one?... // @@ -884,7 +834,7 @@ static void ReadGEntities(qboolean qbAutosave) { gclient_t tempGClient; - EvaluateFields(savefields_gClient, &tempGClient, pEntOriginal->client, INT_ID('G','C','L','I'), sizeof(*pEnt->client),qfalse); + EvaluateFields(savefields_gClient, &tempGClient, pEntOriginal->client, INT_ID('G','C','L','I')); // can we pinch the original's client handle or do we have to alloc a new one?... // @@ -942,14 +892,6 @@ static void ReadGEntities(qboolean qbAutosave) ::gi.saved_game->read_chunk( INT_ID('G','H','L','2')); -// FIXME Remove -#if 0 - auto buffer = ::gi.saved_game->get_buffer(); - auto pGhoul2Data = reinterpret_cast(buffer.data()); - - gi.G2API_LoadGhoul2Models(pEnt->ghoul2, pGhoul2Data); // if it's going to crash anywhere... -#endif - gi.G2API_LoadGhoul2Models(pEnt->ghoul2, nullptr); } @@ -1029,7 +971,7 @@ void WriteLevel(qboolean qbAutosave) // assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way ReadGame works gclient_t client = level.clients[0]; - EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I'), sizeof(client)); + EnumerateFields(savefields_gClient, &client, INT_ID('G','C','L','I')); WriteLevelLocals(); // level_locals_t level } @@ -1071,7 +1013,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) //Read & throw away gclient info gclient_t junkClient; - EvaluateFields(savefields_gClient, &junkClient, &level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qfalse); + EvaluateFields(savefields_gClient, &junkClient, &level.clients[0], INT_ID('G','C','L','I')); //Read & throw away objective info ::gi.saved_game->read_chunk( @@ -1086,7 +1028,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) assert(level.maxclients == 1); // I'll need to know if this changes, otherwise I'll need to change the way things work gclient_t GClient; - EvaluateFields(savefields_gClient, &GClient, &level.clients[0], INT_ID('G','C','L','I'), sizeof(*level.clients), qfalse); + EvaluateFields(savefields_gClient, &GClient, &level.clients[0], INT_ID('G','C','L','I')); level.clients[0] = GClient; // struct copy ReadLevelLocals(); // level_locals_t level } From 61205f24a891d6ba665c3363454113a89d5352cc Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Tue, 26 Jul 2016 19:57:40 +0300 Subject: [PATCH 273/445] JO: Fix reading/writing saved game chunk --- shared/qcommon/ojk_saved_game.cpp | 116 ++++++++++++++++++++---------- shared/qcommon/ojk_saved_game.h | 2 + 2 files changed, 82 insertions(+), 36 deletions(-) diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index 5a189116a0..a021fe3e03 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -196,16 +196,6 @@ void SavedGame::read_chunk( const auto&& loaded_chunk_id_string = get_chunk_id_string( ulLoadedChid); -#if 0 - if (!is_preview_mode_) - { - ::Com_Error( - ERR_DROP, - "Loaded chunk ID (%s) does not match requested chunk ID (%s)", - loaded_chunk_id_string.c_str(), - chunk_id_string.c_str()); - } -#else const auto&& error_message = "Loaded chunk ID (" + loaded_chunk_id_string + @@ -215,9 +205,19 @@ void SavedGame::read_chunk( throw_error( error_message); -#endif } + uint32_t uiLoadedCksum = 0; + +#ifdef JK2_MODE + // Get checksum... + // + uiLoaded += ::FS_Read( + &uiLoadedCksum, + static_cast(sizeof(uiLoadedCksum)), + file_handle_); +#endif // JK2_MODE + // Load in data and magic number... // uint32_t uiCompressedLength = 0; @@ -255,14 +255,32 @@ void SavedGame::read_chunk( file_handle_); } +#ifdef JK2_MODE + uint32_t uiLoadedMagic = 0; + + uiLoaded += ::FS_Read( + &uiLoadedMagic, + static_cast(sizeof(uiLoadedMagic)), + file_handle_); + + if (uiLoadedMagic != get_jo_magic_value()) + { + const auto&& error_message = + "Bad saved game magic for chunk " + chunk_id_string + "."; + + throw_error( + error_message); + } +#endif // JK2_MODE + +#ifndef JK2_MODE // Get checksum... // - uint32_t uiLoadedCksum = 0; - uiLoaded += ::FS_Read( &uiLoadedCksum, static_cast(sizeof(uiLoadedCksum)), file_handle_); +#endif // JK2_MODE // Make sure the checksums match... // @@ -272,21 +290,11 @@ void SavedGame::read_chunk( if (uiLoadedCksum != uiCksum) { -#if 0 - if (!is_preview_mode_) - { - ::Com_Error( - ERR_DROP, - "Failed checksum check for chunk", - chunk_id_string.c_str()); - } -#else const auto&& error_message = "Failed checksum check for chunk " + chunk_id_string + "."; throw_error( error_message); -#endif } // Make sure we didn't encounter any read errors... @@ -295,23 +303,17 @@ void SavedGame::read_chunk( sizeof(uiLoadedLength) + sizeof(uiLoadedCksum) + (bBlockIsCompressed ? sizeof(uiCompressedLength) : 0) + - (bBlockIsCompressed ? uiCompressedLength : io_buffer_.size())) + (bBlockIsCompressed ? uiCompressedLength : io_buffer_.size()) + +#ifdef JK2_MODE + sizeof(uiLoadedMagic) + +#endif + 0) { -#if 0 - if (!is_preview_mode_) - { - ::Com_Error( - ERR_DROP, - "Error during loading chunk %s", - chunk_id_string.c_str()); - } -#else const auto&& error_message = "Error during loading chunk " + chunk_id_string + "."; throw_error( error_message); -#endif } } @@ -355,6 +357,13 @@ void SavedGame::write_chunk( static_cast(sizeof(chunk_id)), file_handle_); +#ifdef JK2_MODE + uiSaved += ::FS_Write( + &uiCksum, + static_cast(sizeof(uiCksum)), + file_handle_); +#endif // JK2_MODE + auto iCompressedLength = -1; if (::sv_compress_saved_games->integer != 0) @@ -369,6 +378,10 @@ void SavedGame::write_chunk( } } +#ifdef JK2_MODE + const auto uiMagic = get_jo_magic_value(); +#endif // JK2_MODE + if (iCompressedLength > 0) { const auto iLength = -static_cast(io_buffer_.size()); @@ -388,17 +401,30 @@ void SavedGame::write_chunk( iCompressedLength, file_handle_); +#ifdef JK2_MODE + uiSaved += ::FS_Write( + &uiMagic, + static_cast(sizeof(uiMagic)), + file_handle_); +#endif // JK2_MODE + +#ifndef JK2_MODE uiSaved += ::FS_Write( &uiCksum, static_cast(sizeof(uiCksum)), file_handle_); +#endif // JK2_MODE if (uiSaved != sizeof(chunk_id) + sizeof(iLength) + sizeof(uiCksum) + sizeof(iCompressedLength) + - iCompressedLength) + iCompressedLength + +#ifdef JK2_MODE + sizeof(uiMagic) + +#endif // JK2_MODE + 0) { is_write_failed_ = true; @@ -423,16 +449,29 @@ void SavedGame::write_chunk( iLength, file_handle_); +#ifdef JK2_MODE + uiSaved += ::FS_Write( + &uiMagic, + static_cast(sizeof(uiMagic)), + file_handle_); +#endif // JK2_MODE + +#ifdef JK2_MODE uiSaved += ::FS_Write( &uiCksum, static_cast(sizeof(uiCksum)), file_handle_); +#endif // JK2_MODE if (uiSaved != sizeof(chunk_id) + sizeof(iLength) + sizeof(uiCksum) + - iLength) + iLength + +#ifdef JK2_MODE + sizeof(uiMagic) + +#endif // JK2_MODE + 0) { is_write_failed_ = true; @@ -789,5 +828,10 @@ void SavedGame::reset_buffer_offset() io_buffer_offset_ = 0; } +constexpr uint32_t SavedGame::get_jo_magic_value() +{ + return 0x1234ABCD; +} + } // ojk diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game.h index 1b59232796..481b71c0e3 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game.h @@ -186,6 +186,8 @@ class SavedGame : // Returns a string representation of a chunk id. static std::string get_chunk_id_string( uint32_t chunk_id); + + static constexpr uint32_t get_jo_magic_value(); }; // SavedGame From fa46910cca3d73af7338bb481942bb293214f2eb Mon Sep 17 00:00:00 2001 From: Dusty Date: Thu, 28 Jul 2016 11:27:57 -0400 Subject: [PATCH 274/445] prelim --- code/game/AI_Jedi.cpp | 8 +++++--- code/game/NPC_combat.cpp | 5 +++++ code/game/NPC_spawn.cpp | 6 +++--- code/game/NPC_stats.cpp | 16 ++++++++++------ code/game/g_main.cpp | 4 ++++ code/game/g_missile.cpp | 7 ++++--- code/game/g_weaponLoad.cpp | 2 ++ code/game/weapons.h | 4 ++-- code/game/wp_saber.cpp | 16 +++++++++------- 9 files changed, 44 insertions(+), 24 deletions(-) diff --git a/code/game/AI_Jedi.cpp b/code/game/AI_Jedi.cpp index 1f5bcb389b..0683dda0c9 100644 --- a/code/game/AI_Jedi.cpp +++ b/code/game/AI_Jedi.cpp @@ -97,6 +97,7 @@ extern cvar_t *g_saberRealisticCombat; extern cvar_t *d_slowmodeath; extern cvar_t *g_saberNewControlScheme; extern cvar_t *g_forceNewPowers; +extern cvar_t *g_playerCheatPowers; extern int parryDebounce[]; //extern int forcePowerNeeded[]; //FIXME doesn't point to anything @@ -2150,7 +2151,7 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in } else {//the player - if (g_forceNewPowers->integer) + if (g_forceNewPowers->integer && !g_playerCheatPowers->integer) { if (self->client->ps.forcePowerLevel[FP_SPEED] < 2) { @@ -2188,7 +2189,8 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in } } - else { //old force power version + else if (!g_playerCheatPowers->integer) + { //old force power version if (!(self->client->ps.forcePowersActive&(1 << FP_SPEED))) {//not already in speed if (!WP_ForcePowerUsable(self, FP_SPEED, 0)) @@ -2341,7 +2343,7 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in self->client->ps.legsAnimTimer = self->client->ps.torsoAnimTimer; } - if ( self->s.number ) + if (self->s.number && g_playerCheatPowers->integer) {//NPC //maybe force them to stop moving in this case? self->client->ps.pm_time = self->client->ps.torsoAnimTimer + Q_irand( 100, 1000 ); diff --git a/code/game/NPC_combat.cpp b/code/game/NPC_combat.cpp index 17762fb362..34aa9efd50 100644 --- a/code/game/NPC_combat.cpp +++ b/code/game/NPC_combat.cpp @@ -1035,6 +1035,11 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) ent->NPC->aiFlags &= ~NPCAI_BURST_WEAPON; break; } + + if (ent->NPC->scriptFlags&SCF_ALT_FIRE) + ent->NPC->burstSpacing *= weaponData[newWeapon].npcAltFireTimeMult; + else + ent->NPC->burstSpacing *= weaponData[newWeapon].npcFireTimeMult; } void NPC_ChangeWeapon( int newWeapon ) diff --git a/code/game/NPC_spawn.cpp b/code/game/NPC_spawn.cpp index 2881fc7c90..2640b7b95b 100644 --- a/code/game/NPC_spawn.cpp +++ b/code/game/NPC_spawn.cpp @@ -272,14 +272,14 @@ void NPC_SetMiscDefaultData(gentity_t *ent) ent->flags |= FL_NO_KNOCKBACK; SandCreature_ClearTimers(ent); } - else if (ent->client->NPC_class == CLASS_BOBAFETT - || ent->client->NPC_class == CLASS_MANDA) + else if (ent->client->NPC_class == CLASS_BOBAFETT) {//set some stuff, precache ent->client->ps.forcePowersKnown |= (1 << FP_LEVITATION); ent->client->ps.forcePowerLevel[FP_LEVITATION] = FORCE_LEVEL_3; ent->client->ps.forcePower = 100; ent->NPC->scriptFlags |= (SCF_NAV_CAN_FLY | SCF_FLY_WITH_JET | SCF_NAV_CAN_JUMP); - NPC->flags |= FL_UNDYING; // Can't Kill Boba + if (!Q_stricmp("boba_fett", ent->NPC_type)) + NPC->flags |= FL_UNDYING; // Can't Kill Boba } else if (ent->client->NPC_class == CLASS_ROCKETTROOPER) {//set some stuff, precache diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index 58becbc5eb..6726344147 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -3551,11 +3551,15 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) NPC->client->ps.ammo[weaponData[weap].ammoIndex] = ammoData[weaponData[weap].ammoIndex].max; } - if (lightBlasterWeap(weap)) NPC->NPC->lightBlasterWeaps->add(weap); - if (heavyBlasterWeap(weap)) NPC->NPC->heavyBlasterWeaps->add(weap); - if (heavyWeap(weap)) NPC->NPC->heavyWeaps->add(weap); + if (!parsingPlayer) + { + if (lightBlasterWeap(weap)) NPC->NPC->lightBlasterWeaps->add(weap); + if (heavyBlasterWeap(weap)) NPC->NPC->heavyBlasterWeaps->add(weap); + if (heavyWeap(weap)) NPC->NPC->heavyWeaps->add(weap); - NPC->NPC->weapList->add(weap); + NPC->NPC->weapList->add(weap); + } + } continue; } @@ -3809,7 +3813,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) continue; } - if (!Q_stricmp(token, "meleeKatasForceFx")) + if (!Q_stricmp(token, "meleeKatasNoForceFx")) { if (COM_ParseInt(&p, &n)) { @@ -3818,7 +3822,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } if (NPC->client) { - if (n == 0) + if (n != 0) { NPC->flags |= FL_MELEEKATA_NOFORCEFX; } diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index a46230eae6..a9109d88c2 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -238,6 +238,8 @@ cvar_t *g_char_forceFocus; cvar_t *g_char_forceSensitivity; cvar_t *g_handicap_maxArmor; +cvar_t *g_saberDeflectAutoAim; +cvar_t *g_playerCheatPowers; /* cvar_t *g_char_moveSpeedScale; 1.0 - you move faster / slower when using this saber @@ -779,6 +781,8 @@ void G_InitCvars( void ) { g_weaponAltVelocity = gi.cvar("g_weaponAltVelocity", "1.0", CVAR_ARCHIVE | CVAR_CHEAT); g_handicap_maxArmor = gi.cvar("handicap_maxArmor", "100", CVAR_ARCHIVE | CVAR_SAVEGAME | CVAR_NORESTART); + g_saberDeflectAutoAim = gi.cvar("g_saberDeflectAutoAim", "0", CVAR_SAVEGAME); + g_playerCheatPowers = gi.cvar("g_playerCheatPowers", "0", CVAR_SAVEGAME | CVAR_CHEAT); } /* diff --git a/code/game/g_missile.cpp b/code/game/g_missile.cpp index 0d590f6273..c3b19c43cf 100644 --- a/code/game/g_missile.cpp +++ b/code/game/g_missile.cpp @@ -147,6 +147,7 @@ Reflect the missile roughly back at it's owner vec3_t g_crosshairWorldCoord = { 0, 0, 0 }; extern gentity_t *Jedi_FindEnemyInCone(gentity_t *self, gentity_t *fallback, float minDot); extern cvar_t *g_saberAutoBlocking; +extern cvar_t *g_saberDeflectAutoAim; void G_ReflectMissile(gentity_t *ent, gentity_t *missile, vec3_t forward, forcePowers_t powerToUse) { vec3_t bounce_dir; @@ -183,7 +184,7 @@ void G_ReflectMissile(gentity_t *ent, gentity_t *missile, vec3_t forward, forceP perfectReflection = qfalse; } - if (!PM_WalkingOrIdle(ent) || !PM_SaberInParry(ent->client->ps.saberMove)) + if (!PM_WalkingOrIdle(owner) || !PM_SaberInParry(owner->client->ps.saberMove)) {//but need to be blocking for perfect reflection on higher difficulties perfectReflection = qfalse; } @@ -191,7 +192,7 @@ void G_ReflectMissile(gentity_t *ent, gentity_t *missile, vec3_t forward, forceP if (perfectReflection) { - if (g_spskill->integer < 2 || owner->s.clientNum >= MAX_CLIENTS) //either by autoaim (lower difficulties) + if (!g_saberDeflectAutoAim->integer || owner->s.clientNum >= MAX_CLIENTS) //either by autoaim (lower difficulties) { gentity_t *enemy; if (owner->enemy && Q_irand(0, 3)) @@ -267,7 +268,7 @@ void G_ReflectMissile(gentity_t *ent, gentity_t *missile, vec3_t forward, forceP } if (!reflected) { - if (g_spskill->integer < 2 || owner->s.clientNum >= MAX_CLIENTS) + if (!g_saberDeflectAutoAim->integer || owner->s.clientNum >= MAX_CLIENTS) { if (missile->owner && missile->s.weapon != WP_SABER) {//bounce back at them if you can diff --git a/code/game/g_weaponLoad.cpp b/code/game/g_weaponLoad.cpp index 15c6ff90ff..7f1c61258e 100644 --- a/code/game/g_weaponLoad.cpp +++ b/code/game/g_weaponLoad.cpp @@ -1595,6 +1595,8 @@ void WP_LoadWeaponParms (void) weaponData[i].altVelocity = defaultAltVelocity[i]; weaponData[i].npcDmgMult = 1.0; weaponData[i].npcAltDmgMult = 1.0; + weaponData[i].npcFireTimeMult = 1.0; //npc combat function checks for this + weaponData[i].npcAltFireTimeMult = 1.0; //npc combat function checks for this } WP_ParseParms(buffer); diff --git a/code/game/weapons.h b/code/game/weapons.h index 24a76fae60..00bafb7186 100644 --- a/code/game/weapons.h +++ b/code/game/weapons.h @@ -161,8 +161,8 @@ typedef struct weaponData_s int altVelocity; //MELEE: dmg randomness is +/- this amount for heavy punches float npcDmgMult; //scales the damage NPCs do with primary fire float npcAltDmgMult; //scales the damage NPCs do with alt fire - int npcFireTime; - int npcAltFireTime; + float npcFireTimeMult; + float npcAltFireTimeMult; } weaponData_t; diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index d2c0bc7244..789efd1556 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -78,6 +78,8 @@ extern cvar_t *g_char_forceRegen; extern cvar_t *g_char_parryBonus; extern cvar_t *g_char_breakParryBonus; +extern cvar_t *g_playerCheatPowers; + extern qboolean WP_SaberBladeUseSecondBladeStyle(saberInfo_t *saber, int bladeNum); extern qboolean WP_SaberBladeDoTransitionDamage(saberInfo_t *saber, int bladeNum); extern qboolean Q3_TaskIDPending(gentity_t *ent, taskID_t taskType); @@ -9578,7 +9580,7 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) } else { - if (ent->s.pos.trType == TR_STATIONARY && !self->s.number) + if (ent->s.pos.trType == TR_STATIONARY && !self->s.number && !g_playerCheatPowers->integer) {//nothing you can do with a stationary missile if you're the player continue; } @@ -9623,7 +9625,7 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) //FIXME: handle tripmines and detpacks somehow... // maybe do a force-gesture that makes them explode? // But what if we're within it's splashradius? - if (!self->s.number) + if (!self->s.number && !g_playerCheatPowers->integer) {//players don't auto-handle these at all continue; } @@ -9703,7 +9705,7 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) if ((dot1 = DotProduct(dir, forward)) < SABER_REFLECT_MISSILE_CONE) continue; } - else if (!self->s.number) + else if (!self->s.number && !g_playerCheatPowers->integer) {//player never auto-blocks thrown sabers continue; }//NPCs always try to block sabers coming from behind! @@ -11379,7 +11381,7 @@ void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) } continue; } - else if (!push_list[x]->s.number) + else if (!push_list[x]->s.number && !g_playerCheatPowers->integer) {//player if (!noResist && ShouldPlayerResistForceThrow(push_list[x], self, pull)) { @@ -11413,7 +11415,7 @@ void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) && push_list[x]->client->ps.groundEntityNum != ENTITYNUM_NONE //on the ground && InFront(self->currentOrigin, push_list[x]->currentOrigin, push_list[x]->client->ps.viewangles, 0.3f) //I'm in front of him && (push_list[x]->client->ps.powerups[PW_FORCE_PUSH] > level.time ||//he's pushing too - (push_list[x]->s.number != 0 && push_list[x]->client->ps.weaponTime < level.time)//not the player and not attacking (NPC jedi auto-defend against pushes) + (push_list[x]->s.number != 0 && push_list[x]->client->ps.weaponTime < level.time || (push_list[x]->s.number == 0 && g_playerCheatPowers->integer))//not the player and not attacking (NPC jedi auto-defend against pushes) ) ) {//Jedi don't get pushed, they resist as long as they aren't already attacking and are on the ground @@ -13170,7 +13172,7 @@ void ForceLightningDamage(gentity_t *self, gentity_t *traceEnt, vec3_t dir, floa if (traceEnt->client && traceEnt->health > 0 && traceEnt->NPC - && (traceEnt->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) + && (traceEnt->NPC->aiFlags&NPCAI_BOSS_CHARACTER || (traceEnt->s.number == 0 && g_playerCheatPowers->integer))) {//Luke, Desann Tavion and Kyle can shield themselves from the attack //FIXME: shield effect or something? int parts; @@ -14904,7 +14906,7 @@ void WP_ForcePowerRegenerate(gentity_t *self, int overrideAmt) void WP_ForcePowerDrain(gentity_t *self, forcePowers_t forcePower, int overrideAmt) { - if (self->NPC) + if (self->NPC || g_playerCheatPowers->integer >= 2) {//For now, NPCs have infinite force power return; } From a5185e2eb456265501bb11ee2ecf1a7277b5d3e9 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Fri, 29 Jul 2016 19:23:22 +0300 Subject: [PATCH 275/445] JO: Disable JA structure fields --- code/game/ghoul2_shared.h | 10 +++++ code/qcommon/q_shared.h | 86 ++++++++++++++++++++++++++++++++++++ code/server/sv_savegame.cpp | 6 ++- codeJK2/game/ghoul2_shared.h | 8 +++- 4 files changed, 108 insertions(+), 2 deletions(-) diff --git a/code/game/ghoul2_shared.h b/code/game/ghoul2_shared.h index f0a24e6188..c2a32546a0 100644 --- a/code/game/ghoul2_shared.h +++ b/code/game/ghoul2_shared.h @@ -450,9 +450,13 @@ class CGhoul2Info int mSurfaceRoot; int mLodBias; int mNewOrigin; // this contains the bolt index of the new origin for this model + +#ifndef JK2_MODE #ifdef _G2_GORE int mGoreSetTag; #endif +#endif // !JK2_MODE + qhandle_t mModel; // this and the next entries do NOT go across the network. They are for gameside access ONLY char mFileName[MAX_QPATH]; int mAnimFrameDefault; @@ -483,9 +487,11 @@ class CGhoul2Info mSurfaceRoot(0), mLodBias(0), mNewOrigin(-1), +#ifndef JK2_MODE #ifdef _G2_GORE mGoreSetTag(0), #endif +#endif // !JK2_MODE mModel(0), mAnimFrameDefault(0), mSkelFrameNum(-1), @@ -517,9 +523,11 @@ class CGhoul2Info saved_game->write(mLodBias); saved_game->write(mNewOrigin); +#ifndef JK2_MODE #ifdef _G2_GORE saved_game->write(mGoreSetTag); #endif // _G2_GORE +#endif // !JK2_MODE saved_game->write(mModel); saved_game->write(mFileName); @@ -541,9 +549,11 @@ class CGhoul2Info saved_game->read(mLodBias); saved_game->read(mNewOrigin); +#ifndef JK2_MODE #ifdef _G2_GORE saved_game->read(mGoreSetTag); #endif // _G2_GORE +#endif // !JK2_MODE saved_game->read(mModel); saved_game->read(mFileName); diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 84d622fa88..9b63a8cd6c 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -1463,12 +1463,16 @@ typedef enum FP_SABERTHROW, FP_SABER_DEFENSE, FP_SABER_OFFENSE, + +#ifndef JK2_MODE //new Jedi Academy powers FP_RAGE,//duration - speed, invincibility and extra damage for short period, drains your health and leaves you weak and slow afterwards. FP_PROTECT,//duration - protect against physical/energy (level 1 stops blaster/energy bolts, level 2 stops projectiles, level 3 protects against explosions) FP_ABSORB,//duration - protect against dark force powers (grip, lightning, drain - maybe push/pull, too?) FP_DRAIN,//hold/duration - drain force power for health FP_SEE,//duration - detect/see hidden enemies +#endif // !JK2_MODE + NUM_FORCE_POWERS } forcePowers_t; @@ -2385,6 +2389,7 @@ class PlayerStateBase int lastStationary; //last time you were on the ground int weaponShotCount; +#ifndef JK2_MODE //FIXME: maybe allocate all these structures (saber, force powers, vehicles) // or descend them as classes - so not every client has all this info TSaberInfo saber[MAX_SABERS]; @@ -2508,9 +2513,14 @@ class PlayerStateBase } return parryBonus; }; +#endif // !JK2_MODE short saberMove; + +#ifndef JK2_MODE short saberMoveNext; +#endif // JK2_MODE + short saberBounceMove; short saberBlocking; short saberBlocked; @@ -2531,7 +2541,11 @@ class PlayerStateBase int saberAttackChainCount; int saberLockTime; int saberLockEnemy; + +#ifndef JK2_MODE int saberStylesKnown; +#endif // !JK2_MODE + #ifdef JK2_MODE char *saberModel; #endif @@ -2542,17 +2556,26 @@ class PlayerStateBase int forcePower; int forcePowerMax; int forcePowerRegenDebounceTime; + +#ifndef JK2_MODE int forcePowerRegenRate; //default is 100ms int forcePowerRegenAmount; //default is 1 +#endif // !JK2_MODE + int forcePowerLevel[NUM_FORCE_POWERS]; //so we know the max forceJump power you have float forceJumpZStart; //So when you land, you don't get hurt as much float forceJumpCharge; //you're current forceJump charge-up level, increases the longer you hold the force jump button down int forceGripEntityNum; //what entity I'm gripping vec3_t forceGripOrg; //where the gripped ent should be lifted to + +#ifndef JK2_MODE int forceDrainEntityNum; //what entity I'm draining vec3_t forceDrainOrg; //where the drained ent should be lifted to +#endif // !JK2_MODE + int forceHealCount; //how many points of force heal have been applied so far +#ifndef JK2_MODE //new Jedi Academy force powers int forceAllowDeactivateTime; int forceRageDrainTime; @@ -2563,6 +2586,7 @@ class PlayerStateBase int pullAttackEntNum; int pullAttackTime; int lastKickedEntNum; +#endif // !JK2_MODE int taunting; //replaced BUTTON_GESTURE @@ -2572,6 +2596,7 @@ class PlayerStateBase float waterheight; //exactly what the z org of the water is (will be +4 above if under water, -4 below if not in water) waterHeightLevel_t waterHeightLevel; //how high it really is +#ifndef JK2_MODE //testing IK grabbing qboolean ikStatus; //for IK int heldClient; //for IK, who I'm grabbing, if anyone @@ -2586,6 +2611,7 @@ class PlayerStateBase //NOTE: not really used in SP, just for Fighter Vehicle damage stuff int brokenLimbs; int electrifyTime; +#endif // !JK2_MODE void sg_export( @@ -2658,10 +2684,18 @@ class PlayerStateBase saved_game->write(lastOnGround); saved_game->write(lastStationary); saved_game->write(weaponShotCount); + +#ifndef JK2_MODE saved_game->write<>(saber); saved_game->write(dualSabers); +#endif // !JK2_MODE + saved_game->write(saberMove); + +#ifndef JK2_MODE saved_game->write(saberMoveNext); +#endif // !JK2_MODE + saved_game->write(saberBounceMove); saved_game->write(saberBlocking); saved_game->write(saberBlocked); @@ -2683,7 +2717,10 @@ class PlayerStateBase saved_game->write(saberAttackChainCount); saved_game->write(saberLockTime); saved_game->write(saberLockEnemy); + +#ifndef JK2_MODE saved_game->write(saberStylesKnown); +#endif // !JK2_MODE #ifdef JK2_MODE saved_game->write(saberModel); @@ -2695,16 +2732,26 @@ class PlayerStateBase saved_game->write(forcePower); saved_game->write(forcePowerMax); saved_game->write(forcePowerRegenDebounceTime); + +#ifndef JK2_MODE saved_game->write(forcePowerRegenRate); saved_game->write(forcePowerRegenAmount); +#endif // !JK2_MODE + saved_game->write(forcePowerLevel); saved_game->write(forceJumpZStart); saved_game->write(forceJumpCharge); saved_game->write(forceGripEntityNum); saved_game->write(forceGripOrg); + +#ifndef JK2_MODE saved_game->write(forceDrainEntityNum); saved_game->write(forceDrainOrg); +#endif // !JK2_MODE + saved_game->write(forceHealCount); + +#ifndef JK2_MODE saved_game->write(forceAllowDeactivateTime); saved_game->write(forceRageDrainTime); saved_game->write(forceRageRecoveryTime); @@ -2714,11 +2761,15 @@ class PlayerStateBase saved_game->write(pullAttackEntNum); saved_game->write(pullAttackTime); saved_game->write(lastKickedEntNum); +#endif // !JK2_MODE + saved_game->write(taunting); saved_game->write(jumpZStart); saved_game->write(moveDir); saved_game->write(waterheight); saved_game->write(waterHeightLevel); + +#ifndef JK2_MODE saved_game->write(ikStatus); saved_game->write(heldClient); saved_game->write(heldByClient); @@ -2728,6 +2779,7 @@ class PlayerStateBase saved_game->write(vehTurnaroundTime); saved_game->write(brokenLimbs); saved_game->write(electrifyTime); +#endif // !JK2_MODE } void sg_import( @@ -2800,10 +2852,18 @@ class PlayerStateBase saved_game->read(lastOnGround); saved_game->read(lastStationary); saved_game->read(weaponShotCount); + +#ifndef JK2_MODE saved_game->read<>(saber); saved_game->read(dualSabers); +#endif // !JK2_MODE + saved_game->read(saberMove); + +#ifndef JK2_MODE saved_game->read(saberMoveNext); +#endif // !JK2_MODE + saved_game->read(saberBounceMove); saved_game->read(saberBlocking); saved_game->read(saberBlocked); @@ -2825,7 +2885,10 @@ class PlayerStateBase saved_game->read(saberAttackChainCount); saved_game->read(saberLockTime); saved_game->read(saberLockEnemy); + +#ifndef JK2_MODE saved_game->read(saberStylesKnown); +#endif // !JK2_MODE #ifdef JK2_MODE saved_game->read(saberModel); @@ -2837,16 +2900,26 @@ class PlayerStateBase saved_game->read(forcePower); saved_game->read(forcePowerMax); saved_game->read(forcePowerRegenDebounceTime); + +#ifndef JK2_MODE saved_game->read(forcePowerRegenRate); saved_game->read(forcePowerRegenAmount); +#endif // !JK2_MODE + saved_game->read(forcePowerLevel); saved_game->read(forceJumpZStart); saved_game->read(forceJumpCharge); saved_game->read(forceGripEntityNum); saved_game->read(forceGripOrg); + +#ifndef JK2_MODE saved_game->read(forceDrainEntityNum); saved_game->read(forceDrainOrg); +#endif // !JK2_MODE + saved_game->read(forceHealCount); + +#ifndef JK2_MODE saved_game->read(forceAllowDeactivateTime); saved_game->read(forceRageDrainTime); saved_game->read(forceRageRecoveryTime); @@ -2856,11 +2929,15 @@ class PlayerStateBase saved_game->read(pullAttackEntNum); saved_game->read(pullAttackTime); saved_game->read(lastKickedEntNum); +#endif // !JK2_MODE + saved_game->read(taunting); saved_game->read(jumpZStart); saved_game->read(moveDir); saved_game->read(waterheight); saved_game->read(waterHeightLevel); + +#ifndef JK2_MODE saved_game->read(ikStatus); saved_game->read(heldClient); saved_game->read(heldByClient); @@ -2870,6 +2947,7 @@ class PlayerStateBase saved_game->read(vehTurnaroundTime); saved_game->read(brokenLimbs); saved_game->read(electrifyTime); +#endif // !JK2_MODE } }; // PlayerStateBase @@ -3064,11 +3142,13 @@ typedef struct entityState_s {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!! int vehicleModel; // For overriding your playermodel with a drivable vehicle #endif +#ifndef JK2_MODE //int vehicleIndex; // What kind of vehicle you're driving vec3_t vehicleAngles; // int vehicleArmor; // current armor of your vehicle (explodes if drops to 0) // 0 if not in a vehicle, otherwise the client number. int m_iVehicleNum; +#endif // !JK2_MODE /* Ghoul2 Insert Start @@ -3124,9 +3204,12 @@ Ghoul2 Insert End saved_game->write(vehicleModel); #endif // JK2_MODE +#ifndef JK2_MODE saved_game->write(vehicleAngles); saved_game->write(vehicleArmor); saved_game->write(m_iVehicleNum); +#endif // !JK2_MODE + saved_game->write(modelScale); saved_game->write(radius); saved_game->write(boltInfo); @@ -3174,9 +3257,12 @@ Ghoul2 Insert End saved_game->read(vehicleModel); #endif // JK2_MODE +#ifndef JK2_MODE saved_game->read(vehicleAngles); saved_game->read(vehicleArmor); saved_game->read(m_iVehicleNum); +#endif // !JK2_MODE + saved_game->read(modelScale); saved_game->read(radius); saved_game->read(boltInfo); diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 8ee4b8582e..aba6ce0e58 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -50,7 +50,11 @@ SavedGameJustLoaded_e eSavedGameJustLoaded = eNO; char sLastSaveFileLoaded[MAX_QPATH]={0}; -#define iSG_MAPCMD_SIZE MAX_QPATH +#ifdef JK2_MODE +#define iSG_MAPCMD_SIZE (MAX_TOKEN_CHARS) +#else +#define iSG_MAPCMD_SIZE (MAX_QPATH) +#endif // JK2_MODE static char *SG_GetSaveGameMapName(const char *psPathlessBaseName); static void CompressMem_FreeScratchBuffer(void); diff --git a/codeJK2/game/ghoul2_shared.h b/codeJK2/game/ghoul2_shared.h index e089989e53..076e3d8834 100644 --- a/codeJK2/game/ghoul2_shared.h +++ b/codeJK2/game/ghoul2_shared.h @@ -20,6 +20,10 @@ along with this program; if not, see . =========================================================================== */ + +// FIXME Not used. +#if 0 + #pragma once #if !defined(GHOUL2_SHARED_H_INC) #define GHOUL2_SHARED_H_INC @@ -425,4 +429,6 @@ enum EG2_Collision //==================================================================== -#endif // GHOUL2_SHARED_H_INC \ No newline at end of file +#endif // GHOUL2_SHARED_H_INC + +#endif // 0 From d4ffb1d2220ba2bbc508532372a2862a3ea71ef2 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Fri, 29 Jul 2016 23:23:04 -0500 Subject: [PATCH 276/445] General: Disable @mrwonko's windows build server experimental code by default. --- CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2e4e11b45f..3ee405221b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,9 @@ option(BuildJK2SPRdVanilla "Whether to create projects for the jk2 sp renderer ( option(BuildTests "Whether to build automatic unit tests (requires Boost)" OFF) +Include(CMakeDependentOption) +CMAKE_DEPENDENT_OPTION(BuildSymbolServer "Build WIP Windows Symbol Server (experimental and unused)" OFF "NOT WIN32 OR NOT MSVC" OFF) + # Configure the use of bundled libraries. By default, we assume the user is on # a platform that does not require any bundling. # @@ -342,7 +345,7 @@ if(BuildJK2SPGame) endif() add_subdirectory(${MPDir}) # Windows Symbol Server tools -if(WIN32 AND MSVC) +if(BuildSymbolServer) add_subdirectory("tools/WinSymbol") endif() if(BuildTests) From a7a1274babbb313cda429c67cf5921d20903716f Mon Sep 17 00:00:00 2001 From: Ensiform Date: Fri, 29 Jul 2016 23:27:57 -0500 Subject: [PATCH 277/445] SP: Remove leftover win32 xinput specific forward prototype usage. --- code/client/cl_input.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/code/client/cl_input.cpp b/code/client/cl_input.cpp index 1c6f6596f6..f9c50dce49 100644 --- a/code/client/cl_input.cpp +++ b/code/client/cl_input.cpp @@ -70,11 +70,6 @@ qboolean in_mlooking; extern cvar_t *in_joystick; -#ifndef NO_XINPUT -void IN_UnloadXInput ( void ); -#endif - - static void IN_UseGivenForce(void) { const char *c = Cmd_Argv(1); From a2a364d79b49575b6a9d4a056061a703508ae7ec Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 30 Jul 2016 15:52:30 +0300 Subject: [PATCH 278/445] JO: Undefine _G2_GORE --- code/game/ghoul2_shared.h | 8 -------- code/qcommon/q_shared.h | 4 +++- shared/qcommon/ojk_saved_game.cpp | 4 ++-- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/code/game/ghoul2_shared.h b/code/game/ghoul2_shared.h index c2a32546a0..29e9536e4d 100644 --- a/code/game/ghoul2_shared.h +++ b/code/game/ghoul2_shared.h @@ -451,11 +451,9 @@ class CGhoul2Info int mLodBias; int mNewOrigin; // this contains the bolt index of the new origin for this model -#ifndef JK2_MODE #ifdef _G2_GORE int mGoreSetTag; #endif -#endif // !JK2_MODE qhandle_t mModel; // this and the next entries do NOT go across the network. They are for gameside access ONLY char mFileName[MAX_QPATH]; @@ -487,11 +485,9 @@ class CGhoul2Info mSurfaceRoot(0), mLodBias(0), mNewOrigin(-1), -#ifndef JK2_MODE #ifdef _G2_GORE mGoreSetTag(0), #endif -#endif // !JK2_MODE mModel(0), mAnimFrameDefault(0), mSkelFrameNum(-1), @@ -523,11 +519,9 @@ class CGhoul2Info saved_game->write(mLodBias); saved_game->write(mNewOrigin); -#ifndef JK2_MODE #ifdef _G2_GORE saved_game->write(mGoreSetTag); #endif // _G2_GORE -#endif // !JK2_MODE saved_game->write(mModel); saved_game->write(mFileName); @@ -549,11 +543,9 @@ class CGhoul2Info saved_game->read(mLodBias); saved_game->read(mNewOrigin); -#ifndef JK2_MODE #ifdef _G2_GORE saved_game->read(mGoreSetTag); #endif // _G2_GORE -#endif // !JK2_MODE saved_game->read(mModel); saved_game->read(mFileName); diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 9b63a8cd6c..e20d57707d 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -56,7 +56,9 @@ along with this program; if not, see . #endif //rww - conveniently toggle "gore" code, for model decals and stuff. +#ifndef JK2_MODE #define _G2_GORE +#endif // !JK2_MODE #if JK2_MODE #define PRODUCT_NAME "openjo_sp" @@ -2519,7 +2521,7 @@ class PlayerStateBase #ifndef JK2_MODE short saberMoveNext; -#endif // JK2_MODE +#endif // !JK2_MODE short saberBounceMove; short saberBlocking; diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index a021fe3e03..8c63d9c1ea 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -280,7 +280,7 @@ void SavedGame::read_chunk( &uiLoadedCksum, static_cast(sizeof(uiLoadedCksum)), file_handle_); -#endif // JK2_MODE +#endif // !JK2_MODE // Make sure the checksums match... // @@ -413,7 +413,7 @@ void SavedGame::write_chunk( &uiCksum, static_cast(sizeof(uiCksum)), file_handle_); -#endif // JK2_MODE +#endif // !JK2_MODE if (uiSaved != sizeof(chunk_id) + From fef5407dba8ec9d257e226197bd24daf1ea21c8d Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 30 Jul 2016 16:55:18 +0300 Subject: [PATCH 279/445] JO: Disable some JA-only stuff --- code/client/cl_input.cpp | 7 +++++++ code/qcommon/msg.cpp | 9 +++++++++ code/rd-vanilla/G2_misc.cpp | 11 +++++++++- code/server/sv_game.cpp | 14 +++++++++++++ code/server/sv_snapshot.cpp | 4 ++++ code/ui/ui_main.cpp | 40 +++++++++++++++++++++++++++++++++++++ 6 files changed, 84 insertions(+), 1 deletion(-) diff --git a/code/client/cl_input.cpp b/code/client/cl_input.cpp index 1c6f6596f6..a756e78867 100644 --- a/code/client/cl_input.cpp +++ b/code/client/cl_input.cpp @@ -88,9 +88,12 @@ static void IN_UseGivenForce(void) } switch(forceNum) { +#ifndef JK2_MODE case FP_DRAIN: genCmdNum = GENCMD_FORCE_DRAIN; break; +#endif // !JK2_MODE + case FP_PUSH: genCmdNum = GENCMD_FORCE_THROW; break; @@ -109,6 +112,8 @@ static void IN_UseGivenForce(void) case FP_LIGHTNING: genCmdNum = GENCMD_FORCE_LIGHTNING; break; + +#ifndef JK2_MODE case FP_RAGE: genCmdNum = GENCMD_FORCE_RAGE; break; @@ -121,6 +126,8 @@ static void IN_UseGivenForce(void) case FP_SEE: genCmdNum = GENCMD_FORCE_SEEING; break; +#endif // !JK2_MODE + case FP_HEAL: genCmdNum = GENCMD_FORCE_HEAL; break; diff --git a/code/qcommon/msg.cpp b/code/qcommon/msg.cpp index dc23211555..8740abe380 100644 --- a/code/qcommon/msg.cpp +++ b/code/qcommon/msg.cpp @@ -953,7 +953,13 @@ static const netField_t playerStateFields[] = { PSF(commandTime), 32 }, { PSF(pm_type), 8 }, { PSF(bobCycle), 8 }, + +#ifdef JK2_MODE +{ PSF(pm_flags), 17 }, +#else { PSF(pm_flags), 32 }, +#endif // JK2_MODE + { PSF(pm_time), -16 }, { PSF(origin[0]), 0 }, { PSF(origin[1]), 0 }, @@ -1017,7 +1023,10 @@ static const netField_t playerStateFields[] = { PSF(serverViewOrg[0]), 0 }, { PSF(serverViewOrg[1]), 0 }, { PSF(serverViewOrg[2]), 0 }, + +#ifndef JK2_MODE { PSF(forceRageRecoveryTime), 32 }, +#endif // !JK2_MODE }; /* diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index a1afb8bd5e..3954c8b555 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -48,9 +48,10 @@ along with this program; if not, see . #include +#include "qcommon/ojk_i_saved_game.h" + #ifdef _G2_GORE #include "../ghoul2/ghoul2_gore.h" -#include "qcommon/ojk_i_saved_game.h" #define GORE_TAG_UPPER (256) #define GORE_TAG_MASK (~255) @@ -574,6 +575,7 @@ void G2_TransformModel(CGhoul2Info_v &ghoul2, const int frameNum, vec3_t scale, vec3_t correctScale; qboolean firstModelOnly = qfalse; +#ifndef JK2_MODE if ( cg_g2MarksAllModels == NULL ) { cg_g2MarksAllModels = ri.Cvar_Get( "cg_g2MarksAllModels", "0", 0 ); @@ -584,6 +586,7 @@ void G2_TransformModel(CGhoul2Info_v &ghoul2, const int frameNum, vec3_t scale, { firstModelOnly = qtrue; } +#endif // !JK2_MODE #ifdef _G2_GORE if ( gore @@ -1560,6 +1563,7 @@ void G2_TraceModels(CGhoul2Info_v &ghoul2, vec3_t rayStart, vec3_t rayEnd, CColl qboolean firstModelOnly = qfalse; int firstModel = 0; +#ifndef JK2_MODE if ( cg_g2MarksAllModels == NULL ) { cg_g2MarksAllModels = ri.Cvar_Get( "cg_g2MarksAllModels", "0", 0 ); @@ -1570,6 +1574,7 @@ void G2_TraceModels(CGhoul2Info_v &ghoul2, vec3_t rayStart, vec3_t rayEnd, CColl { firstModelOnly = qtrue; } +#endif // !JK2_MODE #ifdef _G2_GORE if ( gore @@ -1624,6 +1629,8 @@ void G2_TraceModels(CGhoul2Info_v &ghoul2, vec3_t rayStart, vec3_t rayEnd, CColl } lod = G2_DecideTraceLod(g,useLod); + +#ifndef JK2_MODE if ( skipIfLODNotMatch ) {//we only want to hit this SPECIFIC LOD... if ( lod != useLod ) @@ -1631,6 +1638,8 @@ void G2_TraceModels(CGhoul2Info_v &ghoul2, vec3_t rayStart, vec3_t rayEnd, CColl continue; } } +#endif // !JK2_MODE + //reset the quick surface override lookup G2_FindOverrideSurface(-1, g.mSlist); diff --git a/code/server/sv_game.cpp b/code/server/sv_game.cpp index 74ce6adcab..916c5c4dfd 100644 --- a/code/server/sv_game.cpp +++ b/code/server/sv_game.cpp @@ -807,6 +807,20 @@ static void SV_G2API_ClearSkinGore( CGhoul2Info_v &ghoul2 ) { return re.G2API_ClearSkinGore( ghoul2 ); } +#else +static void SV_G2API_AddSkinGore( + CGhoul2Info_v &ghoul2, + SSkinGoreData &gore) +{ + static_cast(ghoul2); + static_cast(gore); +} + +static void SV_G2API_ClearSkinGore( + CGhoul2Info_v &ghoul2) +{ + static_cast(ghoul2); +} #endif static IGhoul2InfoArray& SV_TheGhoul2InfoArray( void ) diff --git a/code/server/sv_snapshot.cpp b/code/server/sv_snapshot.cpp index 7a703ba6d4..16e5f3f28e 100644 --- a/code/server/sv_snapshot.cpp +++ b/code/server/sv_snapshot.cpp @@ -367,6 +367,7 @@ static void SV_AddEntitiesVisibleFromPoint( vec3_t origin, clientSnapshot_t *fra clientpvs = CM_ClusterPVS (clientcluster); +#ifndef JK2_MODE if ( !portal ) {//not if this if through a portal...??? James said to do this... if ( (frame->ps.forcePowersActive&(1<num_entities ; e++ ) { ent = SV_GentityNum(e); @@ -421,6 +423,7 @@ static void SV_AddEntitiesVisibleFromPoint( vec3_t origin, clientSnapshot_t *fra continue; } +#ifndef JK2_MODE if ( sightOn ) {//force sight is on, sees through portals, so draw them always if in radius if ( SV_PlayerCanSeeEnt( ent, frame->ps.forcePowerLevel[FP_SEE] ) ) @@ -429,6 +432,7 @@ static void SV_AddEntitiesVisibleFromPoint( vec3_t origin, clientSnapshot_t *fra continue; } } +#endif // !JK2_MODE // ignore if not touching a PV leaf // check area diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 361114832d..6c784e856a 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -138,14 +138,22 @@ static void UI_UpdateSaberHilt( qboolean secondSaber ); //static void UI_UpdateSaberColor( qboolean secondSaber ); static void UI_InitWeaponSelect( void ); static void UI_WeaponHelpActive( void ); + +#ifndef JK2_MODE static void UI_UpdateFightingStyle ( void ); static void UI_UpdateFightingStyleChoices ( void ); static void UI_CalcForceStatus(void); +#endif // !JK2_MODE + static void UI_DecrementForcePowerLevel( void ); static void UI_DecrementCurrentForcePower ( void ); static void UI_ShutdownForceHelp( void ); static void UI_ForceHelpActive( void ); + +#ifndef JK2_MODE static void UI_DemoSetForceLevels( void ); +#endif // !JK2_MODE + static void UI_RecordForceLevels( void ); static void UI_RecordWeapons( void ); static void UI_ResetCharacterListBoxes( void ); @@ -1207,10 +1215,12 @@ static qboolean UI_RunMenuScript ( const char **args ) UI_ResetSaberCvars(); } } +#ifndef JK2_MODE else if (Q_stricmp(name, "updatefightingstylechoices") == 0) { UI_UpdateFightingStyleChoices(); } +#endif // !JK2_MODE else if (Q_stricmp(name, "initallocforcepower") == 0) { const char *forceName; @@ -1237,10 +1247,12 @@ static qboolean UI_RunMenuScript ( const char **args ) { UI_ForceHelpActive(); } +#ifndef JK2_MODE else if (Q_stricmp(name, "demosetforcelevels") == 0) { UI_DemoSetForceLevels(); } +#endif // !JK2_MODE else if (Q_stricmp(name, "recordforcelevels") == 0) { UI_RecordForceLevels(); @@ -1287,10 +1299,12 @@ static qboolean UI_RunMenuScript ( const char **args ) UI_LoadMissionSelectMenu(cvarName); } } +#ifndef JK2_MODE else if (Q_stricmp(name, "calcforcestatus") == 0) { UI_CalcForceStatus(); } +#endif // !JK2_MODE else if (Q_stricmp(name, "giveweapon") == 0) { const char *weaponIndex; @@ -1455,10 +1469,12 @@ static qboolean UI_RunMenuScript ( const char **args ) String_Parse(args, &amount); UI_GiveInventory(atoi(inventoryIndex),atoi(amount)); } +#ifndef JK2_MODE else if (Q_stricmp(name, "updatefightingstyle") == 0) { UI_UpdateFightingStyle(); } +#endif // !JK2_MODE else if (Q_stricmp(name, "update") == 0) { if (String_Parse(args, &name2)) @@ -1546,6 +1562,7 @@ const char *kyleForceStatusSounds[] = }; +#ifndef JK2_MODE static void UI_CalcForceStatus(void) { float lightSide,darkSide,total; @@ -1661,6 +1678,7 @@ static void UI_CalcForceStatus(void) DC->startLocalSound(DC->registerSound(kyleForceStatusSounds[index], qfalse), CHAN_VOICE ); } } +#endif // !JK2_MODE /* ================= @@ -4252,6 +4270,7 @@ static void UI_UpdateSaberCvars ( void ) Cvar_Set ( "g_saber2_color", Cvar_VariableString ( "ui_saber2_color" ) ); } +#ifndef JK2_MODE static void UI_UpdateFightingStyleChoices ( void ) { // @@ -4350,6 +4369,7 @@ static void UI_UpdateFightingStyleChoices ( void ) } } } +#endif // !JK2_MODE #define MAX_POWER_ENUMS 16 @@ -4360,26 +4380,42 @@ typedef struct { static powerEnum_t powerEnums[MAX_POWER_ENUMS] = { +#ifndef JK2_MODE { "absorb", FP_ABSORB }, +#endif // !JK2_MODE + { "heal", FP_HEAL }, { "mindtrick", FP_TELEPATHY }, + +#ifndef JK2_MODE { "protect", FP_PROTECT }, +#endif // !JK2_MODE // Core powers { "jump", FP_LEVITATION }, { "pull", FP_PULL }, { "push", FP_PUSH }, + +#ifndef JK2_MODE { "sense", FP_SEE }, +#endif // !JK2_MODE + { "speed", FP_SPEED }, { "sabdef", FP_SABER_DEFENSE }, { "saboff", FP_SABER_OFFENSE }, { "sabthrow", FP_SABERTHROW }, // Dark powers +#ifndef JK2_MODE { "drain", FP_DRAIN }, +#endif // !JK2_MODE + { "grip", FP_GRIP }, { "lightning", FP_LIGHTNING }, + +#ifndef JK2_MODE { "rage", FP_RAGE }, +#endif // !JK2_MODE }; @@ -4602,6 +4638,7 @@ static void UI_ForceHelpActive( void ) } } +#ifndef JK2_MODE // Set the force levels depending on the level chosen static void UI_DemoSetForceLevels( void ) { @@ -4686,6 +4723,7 @@ static void UI_DemoSetForceLevels( void ) uiInfo.forcePowerLevel[FP_RAGE]=Q_max(pState->forcePowerLevel[FP_RAGE], uiInfo.forcePowerLevel[FP_RAGE]); } } +#endif // !JK2_MODE // record the force levels into a cvar so when restoring player from map transition // the force levels are set up correctly @@ -5177,6 +5215,7 @@ static void UI_ResetForceLevels ( void ) } +#ifndef JK2_MODE // Set the Players known saber style static void UI_UpdateFightingStyle ( void ) { @@ -5221,6 +5260,7 @@ static void UI_UpdateFightingStyle ( void ) Cvar_Set ( "g_fighting_style", va("%d",saberStyle) ); } } +#endif // !JK2_MODE static void UI_ResetCharacterListBoxes( void ) { From b48f21e28523b5a733fe53c99c99e2b18f7a13e9 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 31 Jul 2016 14:07:06 +0300 Subject: [PATCH 280/445] JO: Disable GHOUL2 gore and ragdoll --- code/game/G_Timer.cpp | 11 +- code/game/ghoul2_shared.h | 16 ++ code/icarus/IcarusImplementation.cpp | 27 ++-- code/qcommon/q_shared.h | 10 ++ code/rd-vanilla/G2_API.cpp | 97 ++++++++++- code/rd-vanilla/G2_bones.cpp | 9 +- code/rd-vanilla/G2_misc.cpp | 225 +++----------------------- code/rd-vanilla/tr_ghoul2.cpp | 59 ++++++- code/server/sv_savegame.cpp | 17 +- code/server/sv_snapshot.cpp | 2 + codeJK2/game/g_savegame.cpp | 6 + shared/qcommon/ojk_i_saved_game.h | 21 +++ shared/qcommon/ojk_i_saved_game_fwd.h | 22 ++- shared/qcommon/ojk_saved_game.cpp | 23 ++- shared/qcommon/ojk_saved_game.h | 24 ++- 15 files changed, 327 insertions(+), 242 deletions(-) diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index b835174fd0..e66ae8c9ff 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -234,11 +234,14 @@ void TIMER_Load( void ) ::gi.saved_game->read_chunk( INT_ID('T','M','I','D')); - auto& sg_buffer = ::gi.saved_game->get_buffer(); + auto sg_buffer_data = static_cast( + ::gi.saved_game->get_buffer_data()); - std::uninitialized_copy( - sg_buffer.cbegin(), - sg_buffer.cend(), + const auto sg_buffer_size = ::gi.saved_game->get_buffer_size(); + + std::uninitialized_copy_n( + sg_buffer_data, + sg_buffer_size, tempBuffer); ::gi.saved_game->read_chunk( diff --git a/code/game/ghoul2_shared.h b/code/game/ghoul2_shared.h index 29e9536e4d..21eb84655d 100644 --- a/code/game/ghoul2_shared.h +++ b/code/game/ghoul2_shared.h @@ -127,6 +127,7 @@ struct boneInfo_t int boneBlendStart; // time bone angle blend with normal animation began mdxaBone_t newMatrix; // This is the lerped matrix that Ghoul2 uses on the client side - does not go across the network +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN int lastTimeUpdated; // if non-zero this is all intialized int lastContents; @@ -191,6 +192,7 @@ struct boneInfo_t int airTime; //base is in air, be more quick and sensitive about collisions //rww - RAGDOLL_END +#endif // !JK2_MODE boneInfo_t(): boneNumber(-1), @@ -231,6 +233,8 @@ boneInfo_t(): saved_game->write(boneBlendTime); saved_game->write(boneBlendStart); saved_game->write(newMatrix); + +#ifndef JK2_MODE saved_game->write(lastTimeUpdated); saved_game->write(lastContents); saved_game->write(lastPosition); @@ -284,6 +288,7 @@ boneInfo_t(): saved_game->write<>(animFrameMatrix); saved_game->write(hasAnimFrameMatrix); saved_game->write(airTime); +#endif // !JK2_MODE } void sg_import( @@ -304,6 +309,8 @@ boneInfo_t(): saved_game->read(boneBlendTime); saved_game->read(boneBlendStart); saved_game->read(newMatrix); + +#ifndef JK2_MODE saved_game->read(lastTimeUpdated); saved_game->read(lastContents); saved_game->read(lastPosition); @@ -357,6 +364,7 @@ boneInfo_t(): saved_game->read<>(animFrameMatrix); saved_game->read(hasAnimFrameMatrix); saved_game->read(airTime); +#endif // JK2_MODE } }; //we save from top to boltUsed here. Don't bother saving the position, it gets rebuilt every frame anyway @@ -511,7 +519,11 @@ class CGhoul2Info ojk::ISavedGame* saved_game) const { saved_game->write(mModelindex); + +#ifndef JK2_MODE saved_game->write(animModelIndexOffset); +#endif // !JK2_MODE + saved_game->write(mCustomShader); saved_game->write(mCustomSkin); saved_game->write(mModelBoltLink); @@ -535,7 +547,11 @@ class CGhoul2Info ojk::ISavedGame* saved_game) { saved_game->read(mModelindex); + +#ifndef JK2_MODE saved_game->read(animModelIndexOffset); +#endif // !JK2_MODE + saved_game->read(mCustomShader); saved_game->read(mCustomSkin); saved_game->read(mModelBoltLink); diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index a93fdc697a..e0b1c5b91d 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -709,11 +709,14 @@ int CIcarus::Load() saved_game->read_chunk( INT_ID('I','S','E','Q')); - auto& sg_buffer = saved_game->get_buffer(); + auto sg_buffer_data = static_cast( + saved_game->get_buffer_data()); - std::uninitialized_copy( - sg_buffer.cbegin(), - sg_buffer.cend(), + const auto sg_buffer_size = saved_game->get_buffer_size(); + + std::uninitialized_copy_n( + sg_buffer_data, + sg_buffer_size, m_byBuffer); //Load all signals @@ -829,14 +832,20 @@ void CIcarus::BufferRead( void *pDstBuff, unsigned long ulNumBytesToRead ) {// We've tried to read past the buffer... IGameInterface::GetGame()->DebugPrint( IGameInterface::WL_ERROR, "BufferRead: Buffer underflow, Looking for new block." ); // Read in the next block. - IGameInterface::GetGame()->get_saved_game()->read_chunk( + + auto saved_game = IGameInterface::GetGame()->get_saved_game(); + + saved_game->read_chunk( INT_ID('I','S','E','Q')); - auto& sg_buffer = IGameInterface::GetGame()->get_saved_game()->get_buffer(); + auto sg_buffer_data = static_cast( + saved_game->get_buffer_data()); + + const auto sg_buffer_size = saved_game->get_buffer_size(); - std::uninitialized_copy( - sg_buffer.cbegin(), - sg_buffer.cend(), + std::uninitialized_copy_n( + sg_buffer_data, + sg_buffer_size, m_byBuffer); m_ulBytesRead = 0; //reset buffer diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index e20d57707d..ed87688d92 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -2704,6 +2704,7 @@ class PlayerStateBase saved_game->write(leanStopDebounceTime); #ifdef JK2_MODE + saved_game->skip(2); saved_game->write(saberLengthOld); #endif // JK2_MODE @@ -2872,6 +2873,7 @@ class PlayerStateBase saved_game->read(leanStopDebounceTime); #ifdef JK2_MODE + saved_game->skip(2); saved_game->read(saberLengthOld); #endif // JK2_MODE @@ -3162,7 +3164,9 @@ Ghoul2 Insert Start Ghoul2 Insert End */ +#ifndef JK2_MODE qboolean isPortalEnt; +#endif // !JK2_MODE void sg_export( @@ -3215,7 +3219,10 @@ Ghoul2 Insert End saved_game->write(modelScale); saved_game->write(radius); saved_game->write(boltInfo); + +#ifndef JK2_MODE saved_game->write(isPortalEnt); +#endif // !JK2_MODE } void sg_import( @@ -3268,7 +3275,10 @@ Ghoul2 Insert End saved_game->read(modelScale); saved_game->read(radius); saved_game->read(boltInfo); + +#ifndef JK2_MODE saved_game->read(isPortalEnt); +#endif // !JK2_MODE } } entityState_t; diff --git a/code/rd-vanilla/G2_API.cpp b/code/rd-vanilla/G2_API.cpp index 2129aabe24..ccff8dc9a6 100644 --- a/code/rd-vanilla/G2_API.cpp +++ b/code/rd-vanilla/G2_API.cpp @@ -41,9 +41,11 @@ along with this program; if not, see . #endif #endif +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN #include "../ghoul2/ghoul2_gore.h" //rww - RAGDOLL_END +#endif // !JK2_MODE extern mdxaBone_t worldMatrix; extern mdxaBone_t worldMatrixInv; @@ -972,10 +974,12 @@ qboolean G2API_RemoveGhoul2Model(CGhoul2Info_v &ghlInfo, const int modelIndex) return qtrue; } +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN #define GHOUL2_RAG_STARTED 0x0010 #define GHOUL2_RAG_FORCESOLVE 0x1000 //api-override, determine if ragdoll should be forced to continue solving even if it thinks it is settled //rww - RAGDOLL_END +#endif // !JK2_MODE int G2API_GetAnimIndex(CGhoul2Info *ghlInfo) { @@ -1018,12 +1022,14 @@ qboolean G2API_SetAnimIndex(CGhoul2Info *ghlInfo, const int index) qboolean G2API_SetBoneAnimIndex(CGhoul2Info *ghlInfo, const int index, const int startFrame, const int endFrame, const int flags, const float animSpeed, const int AcurrentTime, const float setFrame, const int blendTime) { +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN if (ghlInfo && (ghlInfo->mFlags & GHOUL2_RAG_STARTED)) { return qfalse; } //rww - RAGDOLL_END +#endif // !JK2_MODE qboolean ret=qfalse; if (G2_SetupModelPointers(ghlInfo)) @@ -1070,12 +1076,14 @@ qboolean G2API_SetBoneAnimIndex(CGhoul2Info *ghlInfo, const int index, const int qboolean G2API_SetBoneAnim(CGhoul2Info *ghlInfo, const char *boneName, const int startFrame, const int endFrame, const int flags, const float animSpeed, const int AcurrentTime, const float setFrame, const int blendTime) { +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN if (ghlInfo && ghlInfo->mFlags & GHOUL2_RAG_STARTED) { return qfalse; } //rww - RAGDOLL_END +#endif // !JK2_MODE qboolean ret=qfalse; G2ERROR(boneName,"NULL boneName"); @@ -1288,12 +1296,14 @@ qboolean G2API_SetBoneAnglesIndex(CGhoul2Info *ghlInfo, const int index, const v const Eorientations yaw, const Eorientations pitch, const Eorientations roll, qhandle_t *, int blendTime, int AcurrentTime) { +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN if (ghlInfo && ghlInfo->mFlags & GHOUL2_RAG_STARTED) { return qfalse; } //rww - RAGDOLL_END +#endif // !JK2_MODE qboolean ret=qfalse; if (G2_SetupModelPointers(ghlInfo)) @@ -1315,12 +1325,14 @@ qboolean G2API_SetBoneAngles(CGhoul2Info *ghlInfo, const char *boneName, const v const Eorientations up, const Eorientations left, const Eorientations forward, qhandle_t *, int blendTime, int AcurrentTime ) { +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN if (ghlInfo && ghlInfo->mFlags & GHOUL2_RAG_STARTED) { return qfalse; } //rww - RAGDOLL_END +#endif // !JK2_MODE qboolean ret=qfalse; G2ERROR(boneName,"NULL boneName"); @@ -1401,6 +1413,15 @@ qboolean G2API_StopBoneAngles(CGhoul2Info *ghlInfo, const char *boneName) return ret; } +#ifdef JK2_MODE +void G2API_SetRagDoll( + CGhoul2Info_v& ghoul2, + CRagDollParams* parms) +{ + static_cast(ghoul2); + static_cast(parms); +} +#else //rww - RAGDOLL_BEGIN class CRagDollParams; void G2_SetRagDoll(CGhoul2Info_v &ghoul2V,CRagDollParams *parms); @@ -1409,6 +1430,7 @@ void G2API_SetRagDoll(CGhoul2Info_v &ghoul2,CRagDollParams *parms) G2_SetRagDoll(ghoul2,parms); } //rww - RAGDOLL_END +#endif // JK2_MODE qboolean G2API_RemoveBone(CGhoul2Info *ghlInfo, const char *boneName) { @@ -1425,18 +1447,22 @@ qboolean G2API_RemoveBone(CGhoul2Info *ghlInfo, const char *boneName) return ret; } +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN #ifdef _DEBUG extern int ragTraceTime; extern int ragSSCount; extern int ragTraceCount; #endif +#endif // !JK2_MODE void G2API_AnimateG2Models(CGhoul2Info_v &ghoul2, int AcurrentTime,CRagDollUpdateParams *params) { #ifdef JK2_MODE - return; // handled elsewhere -#endif + static_cast(ghoul2); + static_cast(AcurrentTime); + static_cast(params); +#else int model; int currentTime=G2API_GetTime(AcurrentTime); @@ -1460,9 +1486,11 @@ void G2API_AnimateG2Models(CGhoul2Info_v &ghoul2, int AcurrentTime,CRagDollUpdat // assert(ragTraceTime < 15); //assert(ragTraceCount < 600); #endif +#endif // JK2_MODE } //rww - RAGDOLL_END +#ifndef JK2_MODE int G2_Find_Bone_Rag(CGhoul2Info *ghlInfo, boneInfo_v &blist, const char *boneName); #define RAG_PCJ (0x00001) #define RAG_EFFECTOR (0x00100) @@ -1493,9 +1521,18 @@ static inline boneInfo_t *G2_GetRagBoneConveniently(CGhoul2Info_v &ghoul2, const return bone; } +#endif // !JK2_MODE qboolean G2API_RagPCJConstraint(CGhoul2Info_v &ghoul2, const char *boneName, vec3_t min, vec3_t max) { +#ifdef JK2_MODE + static_cast(ghoul2); + static_cast(boneName); + static_cast(min); + static_cast(max); + + return false; +#else boneInfo_t *bone = G2_GetRagBoneConveniently(ghoul2, boneName); if (!bone) @@ -1512,10 +1549,18 @@ qboolean G2API_RagPCJConstraint(CGhoul2Info_v &ghoul2, const char *boneName, vec VectorCopy(max, bone->maxAngles); return qtrue; +#endif // JK2_MODE } qboolean G2API_RagPCJGradientSpeed(CGhoul2Info_v &ghoul2, const char *boneName, const float speed) { +#ifdef JK2_MODE + static_cast(ghoul2); + static_cast(boneName); + static_cast(speed); + + return false; +#else boneInfo_t *bone = G2_GetRagBoneConveniently(ghoul2, boneName); if (!bone) @@ -1531,10 +1576,18 @@ qboolean G2API_RagPCJGradientSpeed(CGhoul2Info_v &ghoul2, const char *boneName, bone->overGradSpeed = speed; return qtrue; +#endif // JK2_MODE } qboolean G2API_RagEffectorGoal(CGhoul2Info_v &ghoul2, const char *boneName, vec3_t pos) { +#ifdef JK2_MODE + static_cast(ghoul2); + static_cast(boneName); + static_cast(pos); + + return false; +#else boneInfo_t *bone = G2_GetRagBoneConveniently(ghoul2, boneName); if (!bone) @@ -1557,6 +1610,7 @@ qboolean G2API_RagEffectorGoal(CGhoul2Info_v &ghoul2, const char *boneName, vec3 bone->hasOverGoal = true; } return qtrue; +#endif // JK2_MODE } qboolean G2API_GetRagBonePos(CGhoul2Info_v &ghoul2, const char *boneName, vec3_t pos, vec3_t entAngles, vec3_t entPos, vec3_t entScale) @@ -1566,6 +1620,13 @@ qboolean G2API_GetRagBonePos(CGhoul2Info_v &ghoul2, const char *boneName, vec3_t qboolean G2API_RagEffectorKick(CGhoul2Info_v &ghoul2, const char *boneName, vec3_t velocity) { +#ifdef JK2_MODE + static_cast(ghoul2); + static_cast(boneName); + static_cast(velocity); + + return false; +#else boneInfo_t *bone = G2_GetRagBoneConveniently(ghoul2, boneName); if (!bone) @@ -1583,10 +1644,17 @@ qboolean G2API_RagEffectorKick(CGhoul2Info_v &ghoul2, const char *boneName, vec3 bone->physicsSettled = false; return qtrue; +#endif // JK2_MODE } qboolean G2API_RagForceSolve(CGhoul2Info_v &ghoul2, qboolean force) { +#ifdef JK2_MODE + static_cast(ghoul2); + static_cast(force); + + return false; +#else assert(ghoul2.size()); CGhoul2Info *ghlInfo = &ghoul2[0]; @@ -1605,18 +1673,43 @@ qboolean G2API_RagForceSolve(CGhoul2Info_v &ghoul2, qboolean force) } return qtrue; +#endif // JK2_MODE } +#ifndef JK2_MODE qboolean G2_SetBoneIKState(CGhoul2Info_v &ghoul2, int time, const char *boneName, int ikState, sharedSetBoneIKStateParams_t *params); +#endif // !JK2_MODE + qboolean G2API_SetBoneIKState(CGhoul2Info_v &ghoul2, int time, const char *boneName, int ikState, sharedSetBoneIKStateParams_t *params) { +#ifdef JK2_MODE + static_cast(ghoul2); + static_cast(time); + static_cast(boneName); + static_cast(ikState); + static_cast(params); + + return false; +#else return G2_SetBoneIKState(ghoul2, time, boneName, ikState, params); +#endif // JK2_MODE } +#ifndef JK2_MODE qboolean G2_IKMove(CGhoul2Info_v &ghoul2, int time, sharedIKMoveParams_t *params); +#endif // !JK2_MODE + qboolean G2API_IKMove(CGhoul2Info_v &ghoul2, int time, sharedIKMoveParams_t *params) { +#ifdef JK2_MODE + static_cast(ghoul2); + static_cast(time); + static_cast(params); + + return false; +#else return G2_IKMove(ghoul2, time, params); +#endif // !JK2_MODE } qboolean G2API_RemoveBolt(CGhoul2Info *ghlInfo, const int index) diff --git a/code/rd-vanilla/G2_bones.cpp b/code/rd-vanilla/G2_bones.cpp index a710d20294..8ab9a432cc 100644 --- a/code/rd-vanilla/G2_bones.cpp +++ b/code/rd-vanilla/G2_bones.cpp @@ -39,10 +39,12 @@ along with this program; if not, see . #include "../ghoul2/G2.h" #endif +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN #include #include "../ghoul2/ghoul2_gore.h" //rww - RAGDOLL_END +#endif // !JK2_MODE extern cvar_t *r_Ghoul2BlendMultiplier; @@ -94,9 +96,11 @@ int G2_Add_Bone (const model_t *mod, boneInfo_v &blist, const char *boneName) mdxaSkelOffsets_t *offsets; boneInfo_t tempBone; +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN memset(&tempBone, 0, sizeof(tempBone)); //rww - RAGDOLL_END +#endif // !JK2_MODE offsets = (mdxaSkelOffsets_t *)((byte *)mod->mdxa + sizeof(mdxaHeader_t)); @@ -1046,6 +1050,7 @@ qboolean G2_Stop_Bone_Angles(CGhoul2Info *ghlInfo, boneInfo_v &blist, const char return qfalse; } +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN /* @@ -4755,6 +4760,7 @@ qboolean G2_IKMove(CGhoul2Info_v &ghoul2, int time, sharedIKMoveParams_t *params #endif return qtrue; } +#endif // !JK2_MODE // set the bone list to all unused so the bone transformation routine ignores it. void G2_Init_Bone_List(boneInfo_v &blist, int numBones) @@ -4775,7 +4781,7 @@ int G2_Get_Bone_Index(CGhoul2Info *ghoul2, const char *boneName, qboolean bAddIf } } - +#ifndef JK2_MODE void G2_FreeRag(void) { if(rag) { @@ -4783,3 +4789,4 @@ void G2_FreeRag(void) rag = NULL; } } +#endif // !JK2_MODE diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index 3954c8b555..6a0111cc74 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -1780,142 +1780,29 @@ const auto BOLT_SAVE_BLOCK_SIZE = static_cast(sizeof(SgBoltInfo)); const auto BONE_SAVE_BLOCK_SIZE = static_cast(sizeof(SgBoneInfo)); #endif -#if 0 -void G2_SaveGhoul2Models(CGhoul2Info_v &ghoul2) -{ - char *pGhoul2Data = NULL; - int iGhoul2Size = 0; - - // is there anything to save? - if (!ghoul2.IsValid()||!ghoul2.size()) - { - uint32_t empty_value = 0; - - ::ri.saved_game->write_chunk( - INT_ID('G','H','L','2'), - empty_value); //write out a zero buffer - - return; - } - - // this one isn't a define since I couldn't work out how to figure it out at compile time - constexpr auto ghoul2BlockSize = static_cast(sizeof(SgCGhoul2Info)); - - // add in count for number of ghoul2 models - iGhoul2Size += 4; - // start out working out the total size of the buffer we need to allocate - for (int i=0; i(ghoul2.size()); - tempBuffer +=4; - - for (int i = 0; i(tempBuffer)); -#endif - tempBuffer += ghoul2BlockSize; - - // save out how many surfaces we have - *(int32_t*)tempBuffer = static_cast(ghoul2[i].mSlist.size()); - tempBuffer +=4; - - // now save the all the surface list info - for (size_t x=0; x(tempBuffer)); -#endif - tempBuffer += SURFACE_SAVE_BLOCK_SIZE; - } - - // save out how many bones we have - *(int32_t*)tempBuffer = static_cast(ghoul2[i].mBlist.size()); - tempBuffer +=4; - - // now save the all the bone list info - for (size_t x = 0; x(tempBuffer)); -#endif - tempBuffer += BONE_SAVE_BLOCK_SIZE; - } - - // save out how many bolts we have - *(int32_t*)tempBuffer = static_cast(ghoul2[i].mBltlist.size()); - tempBuffer +=4; - - // lastly save the all the bolt list info - for (size_t x = 0; x(tempBuffer)); -#endif - tempBuffer += BOLT_SAVE_BLOCK_SIZE; - } - } - ::ri.saved_game->write_chunk( - INT_ID('G','H','L','2'), - pGhoul2Data, - iGhoul2Size); - - R_Free(pGhoul2Data); -} -#else void G2_SaveGhoul2Models( CGhoul2Info_v& ghoul2) { + ::ri.saved_game->reset_buffer(); + // is there anything to save? if (!ghoul2.IsValid() || ghoul2.size() == 0) { - auto empty_value = 0; +#ifdef JK2_MODE + ::ri.saved_game->write_chunk_and_size( + INT_ID('G', 'L', 'S', '2'), + INT_ID('G', 'H', 'L', '2')); +#else + const int zero_size = 0; ::ri.saved_game->write_chunk( INT_ID('G', 'H', 'L', '2'), - empty_value); //write out a zero buffer + zero_size); //write out a zero buffer +#endif // JK2_MODE return; } - ::ri.saved_game->reset_buffer(); // save out how many ghoul2 models we have auto model_count = ghoul2.size(); @@ -1966,93 +1853,16 @@ void G2_SaveGhoul2Models( } } +#ifdef JK2_MODE + ::ri.saved_game->write_chunk_and_size( + INT_ID('G', 'L', 'S', '2'), + INT_ID('G', 'H', 'L', '2')); +#else ::ri.saved_game->write_chunk( INT_ID('G', 'H', 'L', '2')); +#endif // JK2_MODE } -#endif - -#if 0 -void G2_LoadGhoul2Model(CGhoul2Info_v &ghoul2, char *buffer) -{ - // first thing, lets see how many ghoul2 models we have, and resize our buffers accordingly - auto newSize = *(int32_t*)buffer; - ghoul2.resize(newSize); - buffer += 4; - - // did we actually resize to a value? - if (!newSize) - { - // no, ok, well, done then. - return; - } - - // this one isn't a define since I couldn't work out how to figure it out at compile time - constexpr auto ghoul2BlockSize = static_cast(sizeof(SgCGhoul2Info)); - - // now we have enough instances, lets go through each one and load up the relevant details - for (int i=0; i(buffer), - ghoul2[i]); - - buffer +=ghoul2BlockSize; - - if (ghoul2[i].mModelindex!=-1&&ghoul2[i].mFileName[0]) - { - ghoul2[i].mModelindex = i; - G2_SetupModelPointers(&ghoul2[i]); - } - - // give us enough surfaces to load up the data - ghoul2[i].mSlist.resize(*(int32_t*)buffer); - buffer +=4; - // now load all the surfaces - for (size_t x=0; x(buffer), - ghoul2[i].mSlist[x]); - - buffer += SURFACE_SAVE_BLOCK_SIZE; - } - - // give us enough bones to load up the data - ghoul2[i].mBlist.resize(*(int32_t*)buffer); - buffer +=4; - - // now load all the bones - for (size_t x = 0; x(buffer), - ghoul2[i].mBlist[x]); - - buffer += BONE_SAVE_BLOCK_SIZE; - } - - // give us enough bolts to load up the data - ghoul2[i].mBltlist.resize(*(int32_t*)buffer); - buffer +=4; - - // now load all the bolts - for (size_t x = 0; x(buffer), - ghoul2[i].mBltlist[x]); - - buffer += BOLT_SAVE_BLOCK_SIZE; - } - } -} -#else // FIXME Remove 'buffer' parameter void G2_LoadGhoul2Model( CGhoul2Info_v& ghoul2, @@ -2137,5 +1947,6 @@ void G2_LoadGhoul2Model( ::ri.saved_game); } } + + ::ri.saved_game->ensure_all_data_read(); } -#endif diff --git a/code/rd-vanilla/tr_ghoul2.cpp b/code/rd-vanilla/tr_ghoul2.cpp index d81e7fc7e9..cc3cdba753 100644 --- a/code/rd-vanilla/tr_ghoul2.cpp +++ b/code/rd-vanilla/tr_ghoul2.cpp @@ -70,9 +70,11 @@ void G2Time_ReportTimers(void) } #endif +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN #include //rww - RAGDOLL_END +#endif // !JK2_MODE extern cvar_t *r_Ghoul2UnSqash; extern cvar_t *r_Ghoul2AnimSmooth; @@ -101,18 +103,24 @@ const static mdxaBone_t identityMatrix = class CTransformBone { public: +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN int touchRender; //rww - RAGDOLL_END +#endif // !JK2_MODE + mdxaBone_t boneMatrix; //final matrix int parent; // only set once int touch; // for minimal recalculation CTransformBone() { touch=0; + +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN touchRender = 0; //rww - RAGDOLL_END +#endif // !JK2_MODE } }; @@ -156,6 +164,8 @@ class CBoneCache mFinalBones[index].touch=mCurrentTouch; } } + +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN void SmoothLow(int index) { @@ -200,6 +210,8 @@ class CBoneCache #endif// _DEBUG } //rww - RAGDOLL_END +#endif // !JK2_MODE + public: int frameSize; const mdxaHeader_t *header; @@ -219,11 +231,14 @@ class CBoneCache int incomingTime; int mCurrentTouch; + +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN int mCurrentTouchRender; int mLastTouch; int mLastLastTouch; //rww - RAGDOLL_END +#endif // !JK2_MODE // for render smoothing bool mSmoothingActive; @@ -258,10 +273,14 @@ class CBoneCache mFinalBones[i].parent=skel->parent; } mCurrentTouch=3; + +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN mLastTouch=2; mLastLastTouch=1; //rww - RAGDOLL_END +#endif // !JK2_MODE + } ~CBoneCache () { @@ -349,6 +368,8 @@ class CBoneCache } return mFinalBones[index].boneMatrix; } + +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN const inline mdxaBone_t &EvalRender(int index) { @@ -385,13 +406,20 @@ class CBoneCache return mFinalBones[index].parent; } //rww - RAGDOLL_END +#endif // !JK2_MODE // Added by BTO (VV) - This is probably broken // Need to add in smoothing step? CTransformBone *EvalFull(int index) { +#ifdef JK2_MODE // Eval(index); + +// FIXME BBi Was commented + Eval(index); +#else EvalRender(index); +#endif // JK2_MODE if (mSmoothingActive) { return mSmoothBones + index; @@ -413,6 +441,7 @@ static inline float G2_GetVertBoneWeightNotSlow( const mdxmVertex_t *pVert, cons return fBoneWeight; } +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN const mdxaHeader_t *G2_GetModA(CGhoul2Info &ghoul2) { @@ -627,6 +656,7 @@ int G2_GetParentBoneMatrixLow(CGhoul2Info &ghoul2,int boneNum,const vec3_t scale return parent; } //rww - RAGDOLL_END +#endif // !JK2_MODE void RemoveBoneCache(CBoneCache *boneCache) { @@ -1185,6 +1215,7 @@ void G2_TimingModel(boneInfo_t &bone,int currentTime,int numFramesInFile,int &cu */ } +#ifndef JK2_MODE //basically construct a seperate skeleton with full hierarchy to store a matrix //off which will give us the desired settling position given the frame in the skeleton //that should be used -rww @@ -1312,6 +1343,7 @@ void G2_RagGetAnimMatrix(CGhoul2Info &ghoul2, const int boneNum, mdxaBone_t &mat matrix = bone.animFrameMatrix; } +#endif // !JK2_MODE // transform each individual bone's information - making sure to use any override information provided, both for angles and for animations, as // well as multiplying each bone's matrix by it's parents matrix @@ -1853,6 +1885,7 @@ void G2_TransformGhoulBones(boneInfo_v &rootBoneList,mdxaBone_t &rootMatrix, CGh float val=r_Ghoul2AnimSmooth->value; if (smooth&&val>0.0f&&val<1.0f) { +#ifndef JK2_MODE ghoul2.mBoneCache->mLastTouch=ghoul2.mBoneCache->mLastLastTouch; if(ghoul2.mFlags & GHOUL2_RAG_STARTED) @@ -1880,6 +1913,7 @@ void G2_TransformGhoulBones(boneInfo_v &rootBoneList,mdxaBone_t &rootMatrix, CGh } } } +#endif // !JK2_MODE ghoul2.mBoneCache->mSmoothFactor=val; ghoul2.mBoneCache->mSmoothingActive=true; @@ -1894,6 +1928,7 @@ void G2_TransformGhoulBones(boneInfo_v &rootBoneList,mdxaBone_t &rootMatrix, CGh } ghoul2.mBoneCache->mCurrentTouch++; +#ifndef JK2_MODE //rww - RAGDOLL_BEGIN if (HackadelicOnClient) { @@ -1905,6 +1940,7 @@ void G2_TransformGhoulBones(boneInfo_v &rootBoneList,mdxaBone_t &rootMatrix, CGh ghoul2.mBoneCache->mCurrentTouchRender=0; } //rww - RAGDOLL_END +#endif // !JK2_MODE // ghoul2.mBoneCache->mWraithID=0; ghoul2.mBoneCache->frameSize = 0;// can be deleted in new G2 format //(int)( &((mdxaFrame_t *)0)->boneIndexes[ ghoul2.aHeader->numBones ] ); @@ -2984,8 +3020,12 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) const mdxaBone_t *bone2; for ( j = 0; j < numVerts; j++, baseVertex++,v++ ) { - +#ifdef JK2_MODE + // FIXME BBi + bone = &bones->Eval(piBoneReferences[G2_GetVertBoneIndex( v, 0 )]); +#else bone = &bones->EvalRender(piBoneReferences[G2_GetVertBoneIndex( v, 0 )]); +#endif // JK2_MODE int iNumWeights = G2_GetVertWeights( v ); tess.normal[baseVertex][0] = DotProduct( bone->matrix[0], v->normal ); tess.normal[baseVertex][1] = DotProduct( bone->matrix[1], v->normal ); @@ -3002,7 +3042,12 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) fBoneWeight = G2_GetVertBoneWeightNotSlow( v, 0); if (iNumWeights==2) { +#ifdef JK2_MODE + // FIXME BBi + bone2 = &bones->Eval(piBoneReferences[G2_GetVertBoneIndex( v, 1 )]); +#else bone2 = &bones->EvalRender(piBoneReferences[G2_GetVertBoneIndex( v, 1 )]); +#endif // JK2_MODE /* useless transposition tess.xyz[baseVertex][0] = @@ -3031,7 +3076,13 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) fTotalWeight=fBoneWeight; for (k=1; k < iNumWeights-1 ; k++) { +#ifdef JK2_MODE + // FIXME BBi + bone = &bones->Eval(piBoneReferences[G2_GetVertBoneIndex( v, k )]); +#else bone = &bones->EvalRender(piBoneReferences[G2_GetVertBoneIndex( v, k )]); +#endif // JK2_MODE + fBoneWeight = G2_GetVertBoneWeightNotSlow( v, k); fTotalWeight += fBoneWeight; @@ -3039,7 +3090,13 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) tess.xyz[baseVertex][1] += fBoneWeight * ( DotProduct( bone->matrix[1], v->vertCoords ) + bone->matrix[1][3] ); tess.xyz[baseVertex][2] += fBoneWeight * ( DotProduct( bone->matrix[2], v->vertCoords ) + bone->matrix[2][3] ); } + +#ifdef JK2_MODE + // FIXME BBi + bone = &bones->Eval(piBoneReferences[G2_GetVertBoneIndex( v, k )]); +#else bone = &bones->EvalRender(piBoneReferences[G2_GetVertBoneIndex( v, k )]); +#endif // JK2_MODE fBoneWeight = 1.0f-fTotalWeight; tess.xyz[baseVertex][0] += fBoneWeight * ( DotProduct( bone->matrix[0], v->vertCoords ) + bone->matrix[0][3] ); diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index aba6ce0e58..167014a89b 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -572,7 +572,7 @@ void SG_WriteCvars(void) void SG_ReadCvars(void) { int iCount; - const char* psName; + std::string psName; const char* psValue; auto saved_game = &ojk::SavedGame::get_instance(); @@ -586,18 +586,17 @@ void SG_ReadCvars(void) saved_game->read_chunk( INT_ID('C','V','A','R')); - auto name_buffer = saved_game->get_buffer(); - psName = reinterpret_cast(name_buffer.data()); + psName = reinterpret_cast( + saved_game->get_buffer_data()); saved_game->read_chunk( INT_ID('V','A','L','U')); - auto value_buffer = saved_game->get_buffer(); - psValue = reinterpret_cast(value_buffer.data()); + psValue = reinterpret_cast( + saved_game->get_buffer_data()); - - ::Cvar_Set(psName, psValue); + ::Cvar_Set(psName.c_str(), psValue); } } @@ -686,8 +685,8 @@ void SG_ReadServerConfigStrings( void ) saved_game->read_chunk( INT_ID('C','S','D','A')); - auto& sg_buffer = saved_game->get_buffer(); - psName = reinterpret_cast(sg_buffer.data()); + psName = reinterpret_cast( + saved_game->get_buffer_data()); Com_DPrintf( "Cfg str %d = %s\n",iIndex, psName); diff --git a/code/server/sv_snapshot.cpp b/code/server/sv_snapshot.cpp index 16e5f3f28e..acc9c87807 100644 --- a/code/server/sv_snapshot.cpp +++ b/code/server/sv_snapshot.cpp @@ -417,11 +417,13 @@ static void SV_AddEntitiesVisibleFromPoint( vec3_t origin, clientSnapshot_t *fra continue; } +#ifndef JK2_MODE if (ent->s.isPortalEnt) { //rww - portal entities are always sent as well SV_AddEntToSnapshot( svEnt, ent, eNums ); continue; } +#endif // !JK2_MODE #ifndef JK2_MODE if ( sightOn ) diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index 34b62798f0..71a7d0b5b6 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -889,6 +889,12 @@ static void ReadGEntities(qboolean qbAutosave) // the scary ghoul2 stuff... (fingers crossed) // { +#ifdef JK2_MODE + // Skip GL2 data size + ::gi.saved_game->read_chunk( + INT_ID('G','L','2','S')); +#endif // JK2_MODE + ::gi.saved_game->read_chunk( INT_ID('G','H','L','2')); diff --git a/shared/qcommon/ojk_i_saved_game.h b/shared/qcommon/ojk_i_saved_game.h index 125064c368..cb83e41eba 100644 --- a/shared/qcommon/ojk_i_saved_game.h +++ b/shared/qcommon/ojk_i_saved_game.h @@ -71,6 +71,27 @@ void ISavedGame::read_chunk( // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // write_chunk +template +void ISavedGame::write_chunk_and_size( + const ChunkId size_chunk_id, + const ChunkId data_chunk_id) +{ + save_buffer(); + + auto data_size = get_buffer_size(); + + reset_buffer(); + + write_chunk( + size_chunk_id, + data_size); + + load_buffer(); + + write_chunk( + data_chunk_id); +} + template void ISavedGame::write_chunk( const ChunkId chunk_id, diff --git a/shared/qcommon/ojk_i_saved_game_fwd.h b/shared/qcommon/ojk_i_saved_game_fwd.h index b55fe77b0c..91a7e61301 100644 --- a/shared/qcommon/ojk_i_saved_game_fwd.h +++ b/shared/qcommon/ojk_i_saved_game_fwd.h @@ -10,7 +10,6 @@ #include #include -#include namespace ojk @@ -21,7 +20,6 @@ class ISavedGame { public: using ChunkId = uint32_t; - using Buffer = std::vector; ISavedGame(); @@ -72,6 +70,13 @@ class ISavedGame virtual void write_chunk( const ChunkId chunk_id) = 0; + // Writes a data-chunk into the file from the internal buffer + // prepended with a size-chunk that holds a size of the data-chunk. + template + void write_chunk_and_size( + const ChunkId size_chunk_id, + const ChunkId data_chunk_id); + // Writes a value or an array of values into the file via // the internal buffer. template @@ -134,8 +139,17 @@ class ISavedGame int count) = 0; - // Returns an I/O buffer. - virtual const Buffer& get_buffer() const = 0; + // Stores current I/O buffer and it's position. + virtual void save_buffer() = 0; + + // Restores saved I/O buffer and it's position. + virtual void load_buffer() = 0; + + // Returns a pointer to data in the I/O buffer. + virtual const void* get_buffer_data() const = 0; + + // Returns a current size of the I/O buffer. + virtual int get_buffer_size() const = 0; // Clears buffer and resets it's offset to the beginning. diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index 8c63d9c1ea..d10cecc7b3 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -12,7 +12,9 @@ namespace ojk SavedGame::SavedGame() : file_handle_(), io_buffer_(), + saved_io_buffer_(), io_buffer_offset_(), + saved_io_buffer_offset_(), rle_buffer_(), is_readable_(), is_writable_(), @@ -621,9 +623,26 @@ void SavedGame::skip( io_buffer_offset_ = new_offset; } -const SavedGame::Buffer& SavedGame::get_buffer() const +void SavedGame::save_buffer() { - return io_buffer_; + saved_io_buffer_ = io_buffer_; + saved_io_buffer_offset_ = io_buffer_offset_; +} + +void SavedGame::load_buffer() +{ + io_buffer_ = saved_io_buffer_; + io_buffer_offset_ = saved_io_buffer_offset_; +} + +const void* SavedGame::get_buffer_data() const +{ + return io_buffer_.data(); +} + +int SavedGame::get_buffer_size() const +{ + return static_cast(io_buffer_.size()); } void SavedGame::rename( diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game.h index 481b71c0e3..8b5a9b63c8 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game.h @@ -23,7 +23,6 @@ class SavedGame : { public: using ChunkId = uint32_t; - using Buffer = std::vector; SavedGame(); @@ -99,8 +98,20 @@ class SavedGame : void skip( int count) override; - // Returns an I/O buffer. - const Buffer& get_buffer() const override; + + // Stores current I/O buffer and it's position. + void save_buffer() override; + + // Restores saved I/O buffer and it's position. + void load_buffer() override; + + + // Returns a pointer to data in the I/O buffer. + const void* get_buffer_data() const override; + + // Returns a current size of the I/O buffer. + int get_buffer_size() const override; + // Clears buffer and resets it's offset to the beginning. void reset_buffer() override; @@ -130,6 +141,7 @@ class SavedGame : private: + using Buffer = std::vector; using BufferOffset = Buffer::size_type; using Paths = std::vector; @@ -140,9 +152,15 @@ class SavedGame : // I/O buffer. Buffer io_buffer_; + // Saved copy of the I/O buffer. + Buffer saved_io_buffer_; + // A current offset inside the I/O buffer. BufferOffset io_buffer_offset_; + // Saved I/O buffer offset. + BufferOffset saved_io_buffer_offset_; + // RLE codec buffer. Buffer rle_buffer_; From 886753394bed2fe0a1ebb8c9b2f542496a3f9fb9 Mon Sep 17 00:00:00 2001 From: Dusty Date: Sun, 31 Jul 2016 08:04:51 -0400 Subject: [PATCH 281/445] finished v1.1 - fixed a bug where projectiles deflected by the player back at an enemy would just sit there without damaging the enemy - added the g_saberAutoAimDeflect cvar, it wasn't actually in before and the deflection aiming was actually controlled by g_spskill - to accurately aim deflections now you almost must be walking/guarding - fixed a baseJA bug where stormtroopers using Flechette and Repeater alt-fire would switch to primary fire when an enemy is very close not to damage themselves but then couldn't switch back to alt-fire - g_playerCheatPowers - if 1, player gets a lot of abilities that bosses and NPCs have, like auto-pushing explosives, sniper shot dodging, increased jumping ability/resistance to force powers, at 2 fp usage is cut in half, and at 3 you have unlimited fp and take no fall damage; make sure to have this set when before you load your game to get the full effect - iknowkungfu now toggles g_playerCheatPowers on - NPCs are using some new AI for surrendering, but I'm not sure how it behaves in the context of the SP missions, as I only tested it on MP maps which don't have waypointing, but basically they consistently stay surrendered while you are nearby but as soon as you leave they try to do stuff - NPC Jedi now have their level of acrobatics determined by their move stat; 3 allows rolls and lean dodges 4 allows cartwheels and flipping out of knockdown, this way you can restrict an NPC to be less acrobatic and more "technical" - Tweaked the likelihood of Grenadier Grans using WP_MELEE when you have your saber out, don't know if it's a noticeable difference though - handicap_maxArmor controls the maximum charge your shield can get from a power station (not how many points the power station has to give you, but how high your shield can get FROM USING a power station; does it stop filling at 100? 150? etc.) - cg_lightningBlockEffect controls which efx file is used for the force lightning saber block effect - some new fields you can put in NPC files... dualPistols 1 -- gives an NPC dual pistols if have WP_BLASTER_PISTOL cortosis 1 -- cuts damage in half from lightsabers, stacks on top of any other damage reductions blastArmor 1 -- cuts damage in half from explosives and heavy weapons, stacks on top of any other damage reductions magPlating 1 -- cuts damage in half from blasters, stacks on top of any other damage reductions restrictJediPowers 1 -- restricts a Jedi NPC from using abilities they don't have the proper force powers for such as sniper shot dodging without Speed 2, force pushing without Push 1 altFire 1 -- this actually works now dontFlee 1 -- forces SCF_DONT_FLEE (an icarus script thing) dontFire 1 -- forces SCF_DONT_FIRE (like how melee cultists don't punch) rareFire 1 -- allows punching sometimes with melee (to emulate how cultists punch sometimes in the previous version of the mod) heavyMelee 1 -- forces heavy melee regardless of class - new fields are supported by the weapons.dat however I'm not sure how robust they are (they seemed to work for me): velocity, altVelocity: use an integer number (no decimals) npcDmgMult, npcAltDmgMult, npcFireTimeMult, npcAltFireTimeMult: multipliers that use a decimal (like 0.7, 1.5, 2.3 etc.) the npc firetime fields might only work on newly spawned NPCs (firing speed is set as an NPC is spawning in) *read the weaponshelp.txt for overview of what the default values for these things are new bug - for some reason when you use playermodel to become an NPC your HP and shields will match that NPCs HP. Not sure why. --- code/cgame/cg_info.cpp | 9 ++++++-- code/game/AI_Grenadier.cpp | 2 +- code/game/AI_Jedi.cpp | 2 +- code/game/NPC_stats.cpp | 2 ++ code/game/bg_pmove.cpp | 24 +++++++++++++++++--- code/game/g_client.cpp | 7 +++++- code/game/g_main.cpp | 4 +++- code/game/g_svcmds.cpp | 1 + code/game/wp_saber.cpp | 46 +++++++++++++++++++++++--------------- 9 files changed, 70 insertions(+), 27 deletions(-) diff --git a/code/cgame/cg_info.cpp b/code/cgame/cg_info.cpp index a723792553..fb66deaddd 100644 --- a/code/cgame/cg_info.cpp +++ b/code/cgame/cg_info.cpp @@ -785,6 +785,7 @@ static void CG_DrawLoadingScreen( qhandle_t levelshot, qhandle_t savepic, const } // Print savegame pic + /* if (cgi_UI_GetMenuItemInfo( "loadScreen", "savepic", @@ -800,6 +801,7 @@ static void CG_DrawLoadingScreen( qhandle_t levelshot, qhandle_t savepic, const CG_DrawPic(xPos, yPos, width, height, savepic); } } + */ // Get player weapons and force power info CG_GetLoadScreenInfo(&weapons,&forcepowers); @@ -834,7 +836,7 @@ void CG_DrawInformation( void ) { gi.Cvar_VariableStringBuffer(sCVARNAME_PLAYERSAVE, t, sizeof(t)); //better way to get savegame name? qhandle_t levelshot; //the map picture - qhandle_t savepic; //the screenshot of the player's game + qhandle_t savepic = 0; //the screenshot of the player's game extern SavedGameJustLoaded_e g_eSavedGameJustLoaded; // hack! (hey, it's the last week of coding, ok? // if ( g_eSavedGameJustLoaded == eFULL ) @@ -853,9 +855,12 @@ void CG_DrawInformation( void ) { if (!levelshot) { levelshot = cgi_R_RegisterShaderNoMip( "menu/art/unknownmap" ); } + if (!savepic) { + savepic = cgi_R_RegisterShaderNoMip("menu/art/unknownmap"); + } } - savepic = cgi_R_RegisterShaderNoMip(va("saves/screenshots/%s", t)); + //savepic = cgi_R_RegisterShaderNoMip(va("saves/screenshots/%s", t)); if ( g_eSavedGameJustLoaded != eFULL && !strcmp(s,"yavin1") )//special case for first map! { diff --git a/code/game/AI_Grenadier.cpp b/code/game/AI_Grenadier.cpp index 2454f599e5..d606d5a133 100644 --- a/code/game/AI_Grenadier.cpp +++ b/code/game/AI_Grenadier.cpp @@ -48,7 +48,7 @@ extern qboolean FlyingCreature( gentity_t *ent ); #define REALIZE_THRESHOLD 0.6f #define CAUTIOUS_THRESHOLD ( REALIZE_THRESHOLD * 0.75 ) -#define MELEE_CHANCE 100000 +#define MELEE_CHANCE 1000000 qboolean NPC_CheckPlayerTeamStealth( void ); diff --git a/code/game/AI_Jedi.cpp b/code/game/AI_Jedi.cpp index 0683dda0c9..836ccb8dfc 100644 --- a/code/game/AI_Jedi.cpp +++ b/code/game/AI_Jedi.cpp @@ -2343,7 +2343,7 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in self->client->ps.legsAnimTimer = self->client->ps.torsoAnimTimer; } - if (self->s.number && g_playerCheatPowers->integer) + if (self->s.number || (!self->s.number && g_playerCheatPowers->integer)) {//NPC //maybe force them to stop moving in this case? self->client->ps.pm_time = self->client->ps.torsoAnimTimer + Q_irand( 100, 1000 ); diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index 6726344147..ea0275beda 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -3553,11 +3553,13 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) if (!parsingPlayer) { + /* if (lightBlasterWeap(weap)) NPC->NPC->lightBlasterWeaps->add(weap); if (heavyBlasterWeap(weap)) NPC->NPC->heavyBlasterWeaps->add(weap); if (heavyWeap(weap)) NPC->NPC->heavyWeaps->add(weap); NPC->NPC->weapList->add(weap); + */ } } diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 31bc5b2e96..6ca5d891c6 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -153,6 +153,8 @@ extern cvar_t *g_saberForceDrainAmount; extern cvar_t *g_saberLockSuperBreaks; extern cvar_t *g_saberNewCombat; extern cvar_t *g_forceNewPowers; +extern cvar_t *g_playerCheatPowers; +extern cvar_t *g_moonJump; static void PM_SetWaterLevelAtPoint(vec3_t org, int *waterlevel, int *watertype); @@ -1109,7 +1111,11 @@ static qboolean PM_CheckJump(void) float jumpMultiplier; - if (g_forceNewPowers->integer) + if (g_moonJump->integer) + { + jumpMultiplier = 5.0; + } + else if (g_forceNewPowers->integer) { jumpMultiplier = 1.25; } @@ -2911,7 +2917,11 @@ static void PM_AirMove(void) { float gravMod = 1.0f; float jumpMultiplier; - if (g_forceNewPowers->integer) + if (g_moonJump->integer) + { + jumpMultiplier = 5.0; + } + else if (g_forceNewPowers->integer) { jumpMultiplier = 1.25; } @@ -3049,6 +3059,10 @@ static void PM_AirMove(void) { {//I am force jumping and I'm not holding the button anymore float curHeight = pm->ps->origin[2] - pm->ps->forceJumpZStart + (pm->ps->velocity[2] * pml.frametime); float maxJumpHeight = forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]] * jumpMultiplier; + if (g_playerCheatPowers->integer || g_moonJump->integer) + { + maxJumpHeight *= 30; + } if (curHeight >= maxJumpHeight) {//reached top, cut velocity pm->ps->velocity[2] = 0; @@ -4021,7 +4035,11 @@ static void PM_CrashLand(void) qboolean forceLanding = qfalse; float jumpMultiplier; - if (g_forceNewPowers->integer) + if (g_playerCheatPowers->integer >= 3) + { + jumpMultiplier = 5.0; + } + else if (g_forceNewPowers->integer) { jumpMultiplier = 1.25; } diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index 4b260d4d38..ec813b71d2 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -49,6 +49,7 @@ extern cvar_t *g_saber2; extern cvar_t *g_saber_color; extern cvar_t *g_saber2_color; extern cvar_t *g_saberDarkSideSaberColor; +extern cvar_t *g_playerCheatPowers; // g_client.c -- client functions that don't happen every frame @@ -2231,7 +2232,11 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded } ent->classname = "player"; ent->targetname = ent->script_targetname = "player"; - if ( ent->client->NPC_class == CLASS_NONE ) + if (g_playerCheatPowers->integer) + { + ent->client->NPC_class = CLASS_LUKE; + } + else if ( ent->client->NPC_class == CLASS_NONE ) { ent->client->NPC_class = CLASS_PLAYER; } diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index a9109d88c2..35a5d6ad69 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -240,6 +240,7 @@ cvar_t *g_char_forceSensitivity; cvar_t *g_handicap_maxArmor; cvar_t *g_saberDeflectAutoAim; cvar_t *g_playerCheatPowers; +cvar_t *g_moonJump; /* cvar_t *g_char_moveSpeedScale; 1.0 - you move faster / slower when using this saber @@ -782,7 +783,8 @@ void G_InitCvars( void ) { g_handicap_maxArmor = gi.cvar("handicap_maxArmor", "100", CVAR_ARCHIVE | CVAR_SAVEGAME | CVAR_NORESTART); g_saberDeflectAutoAim = gi.cvar("g_saberDeflectAutoAim", "0", CVAR_SAVEGAME); - g_playerCheatPowers = gi.cvar("g_playerCheatPowers", "0", CVAR_SAVEGAME | CVAR_CHEAT); + g_playerCheatPowers = gi.cvar("g_playerCheatPowers", "0", CVAR_ARCHIVE | CVAR_SAVEGAME | CVAR_CHEAT); + g_moonJump = gi.cvar("g_moonJump", "0", CVAR_ARCHIVE | CVAR_CHEAT); } /* diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index 985d477c43..3786bfbf8d 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -1038,6 +1038,7 @@ qboolean ConsoleCommand( void ) { } gi.cvar_set( "g_debugMelee", "1" ); + gi.cvar_set( "g_playerCheatPowers", "1" ); G_SetWeapon( &g_entities[0], WP_MELEE ); for ( int i = FP_FIRST; i < NUM_FORCE_POWERS; i++ ) { diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 789efd1556..4436e98e68 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -362,14 +362,6 @@ float forceJumpHeight[NUM_FORCE_POWER_LEVELS] = 384//(+stepheight+crouchdiff = 418) //384 }; -float forceJumpHeightNew[NUM_FORCE_POWER_LEVELS] = -{ - 32,//normal jump (+stepheight+crouchdiff = 66) - 96 * 1.25,//(+stepheight+crouchdiff = 130) - 192 * 1.25,//(+stepheight+crouchdiff = 226) - 384 * 1.25//(+stepheight+crouchdiff = 418) //384 -}; - float forceJumpHeightMax[NUM_FORCE_POWER_LEVELS] = { 66,//normal jump (32+stepheight(18)+crouchdiff(24) = 74) @@ -9580,7 +9572,7 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) } else { - if (ent->s.pos.trType == TR_STATIONARY && !self->s.number && !g_playerCheatPowers->integer) + if (ent->s.pos.trType == TR_STATIONARY && !self->s.number && !(g_playerCheatPowers->integer)) {//nothing you can do with a stationary missile if you're the player continue; } @@ -9593,9 +9585,10 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) //FIXME: handle detpacks, proximity mines and tripmines if (ent->s.weapon == WP_THERMAL) {//thermal detonator! - if (self->NPC && dist < ent->splashRadius) + if ((self->NPC || (!self->s.number && g_playerCheatPowers->integer)) && dist < ent->splashRadius) { - if (dist < ent->splashRadius && + if (!self->s.number && + dist < ent->splashRadius && ent->nextthink < level.time + 600 && ent->count && self->client->ps.groundEntityNum != ENTITYNUM_NONE && @@ -9626,7 +9619,7 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) // maybe do a force-gesture that makes them explode? // But what if we're within it's splashradius? if (!self->s.number && !g_playerCheatPowers->integer) - {//players don't auto-handle these at all + {//players don't auto-handle these at all unless cheating continue; } else @@ -9646,7 +9639,7 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) //HMM... let's see what happens if these guys try to avoid tripmines and detpacks, too...? } else - {//normal Jedi + {//normal Jedi or enhanced player if (ent->s.pos.trType == TR_STATIONARY && (ent->s.eFlags&EF_MISSILE_STICK) && (self->client->NPC_class != CLASS_REBORN || self->s.weapon == WP_SABER)) {//a placed explosive like a tripmine or detpack @@ -9679,19 +9672,28 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) } } } - else if (dist < ent->splashRadius + else if (self->s.number + && dist < ent->splashRadius && self->client->ps.groundEntityNum != ENTITYNUM_NONE && (DotProduct(dir, forward) < SABER_REFLECT_MISSILE_CONE || !WP_ForcePowerUsable(self, FP_PUSH, 0))) {//NPCs try to evade it self->client->ps.forceJumpCharge = 480; } - else if ((self->client->NPC_class != CLASS_REBORN || self->s.weapon == WP_SABER)) + else if ((self->client->NPC_class != CLASS_REBORN || self->s.weapon == WP_SABER) + || (!self->s.number && g_playerCheatPowers->integer)) {//else, try to force-throw it away if (!ent->owner || !OnSameTeam(self, ent->owner)) { //FIXME: check forcePushRadius[NPC->client->ps.forcePowerLevel[FP_PUSH]] - ForceThrow(self, qfalse); + if (!self->s.number && self->client->ps.forcePowerLevel[FP_PUSH] == 1 && dist >= 192) + { + //player with push 1 has to wait until it's closer otherwise the push misses + } + else + { + ForceThrow(self, qfalse); + } } } //otherwise, can't block it, so we're screwed @@ -11441,7 +11443,11 @@ void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) } } int resistChance = Q_irand(0, 2); - if (push_list[x]->s.number >= MAX_CLIENTS) + if (!push_list[x]->s.number && g_playerCheatPowers->integer) + { + resistChance = 1; + } + else if (push_list[x]->s.number >= MAX_CLIENTS) {//NPC if (g_spskill->integer == 1) {//stupid tweak for graham @@ -14906,10 +14912,14 @@ void WP_ForcePowerRegenerate(gentity_t *self, int overrideAmt) void WP_ForcePowerDrain(gentity_t *self, forcePowers_t forcePower, int overrideAmt) { - if (self->NPC || g_playerCheatPowers->integer >= 2) + if (self->NPC || g_playerCheatPowers->integer >= 3) {//For now, NPCs have infinite force power return; } + else if (!self->NPC && g_playerCheatPowers->integer == 2) + { + overrideAmt *= 0.5; + } //take away the power int drain = overrideAmt; if (!drain) From 4142bd9460b40822ce610e532cc3910d2cdcfe39 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 31 Jul 2016 20:03:59 +0300 Subject: [PATCH 282/445] JO: Fix loading/saving of GHOUL2 and timers --- code/game/G_Timer.cpp | 2 + code/qcommon/q_shared.h | 35 + code/rd-vanilla/G2_misc.cpp | 21 +- codeJK2/game/G_Timer.cpp | 2 + shared/qcommon/ojk_i_saved_game.h | 763 ++++++++-------- shared/qcommon/ojk_i_saved_game_fwd.h | 418 +++++---- shared/qcommon/ojk_saved_game.cpp | 1219 +++++++++++++------------ shared/qcommon/ojk_saved_game.h | 228 ++--- 8 files changed, 1388 insertions(+), 1300 deletions(-) diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index e66ae8c9ff..c7f7b4487c 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -244,6 +244,8 @@ void TIMER_Load( void ) sg_buffer_size, tempBuffer); + tempBuffer[sg_buffer_size] = '\0'; + ::gi.saved_game->read_chunk( INT_ID('T','D','T','A'), time); diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index ed87688d92..83a92dd835 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -1378,14 +1378,24 @@ typedef struct { #define MAX_MODELS 256 + +#ifdef JK2_MODE +#define MAX_SOUNDS (256) +#else #define MAX_SOUNDS 380 +#endif // JK2_MODE #define MAX_SUB_BSP 32 #define MAX_SUBMODELS 512 // nine bits #define MAX_FX 128 + +#ifdef JK2_MODE +#define MAX_WORLD_FX (4) +#else #define MAX_WORLD_FX 66 // was 16 // was 4 +#endif // JK2_MODE /* Ghoul2 Insert Start @@ -1395,7 +1405,11 @@ Ghoul2 Insert Start Ghoul2 Insert End */ +#ifdef JK2_MODE +#define MAX_CONFIGSTRINGS (1024) +#else #define MAX_CONFIGSTRINGS 1300//1024 //rww - I had to up this for terrains +#endif // JK2_MODE // these are the only configstrings that the system reserves, all the // other ones are strictly for servergame to clientgame communication @@ -1416,19 +1430,40 @@ Ghoul2 Insert End #define CS_MODELS 10 +#ifndef JK2_MODE #define CS_SKYBOXORG (CS_MODELS+MAX_MODELS) //rww - skybox info +#endif // !JK2_MODE +#ifdef JK2_MODE +#define CS_SOUNDS (CS_MODELS + MAX_MODELS) +#else #define CS_SOUNDS (CS_SKYBOXORG+1) +#endif // JK2_MODE + +#ifdef JK2_MODE +#define CS_PLAYERS (CS_SOUNDS + MAX_SOUNDS) +#else #ifdef BASE_SAVE_COMPAT #define CS_RESERVED1 (CS_SOUNDS+MAX_SOUNDS) // reserved field for base compat from immersion removal #define CS_PLAYERS (CS_RESERVED1 + 96) #else #define CS_PLAYERS (CS_SOUNDS+MAX_SOUNDS) #endif +#endif // JK2_MODE + #define CS_LIGHT_STYLES (CS_PLAYERS+MAX_CLIENTS) + +#ifndef JK2_MODE #define CS_TERRAINS (CS_LIGHT_STYLES + (MAX_LIGHT_STYLES*3)) #define CS_BSP_MODELS (CS_TERRAINS + MAX_TERRAINS) +#endif // !JK2_MODE + +#ifdef JK2_MODE +#define CS_EFFECTS (CS_LIGHT_STYLES + (MAX_LIGHT_STYLES * 3)) +#else #define CS_EFFECTS (CS_BSP_MODELS + MAX_SUB_BSP)//(CS_LIGHT_STYLES + (MAX_LIGHT_STYLES*3)) +#endif // JK2_MODE + /* Ghoul2 Insert Start */ diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index 6a0111cc74..436c4a66fb 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -1788,13 +1788,16 @@ void G2_SaveGhoul2Models( // is there anything to save? if (!ghoul2.IsValid() || ghoul2.size() == 0) { + const int zero_size = 0; + #ifdef JK2_MODE + ::ri.saved_game->write( + zero_size); + ::ri.saved_game->write_chunk_and_size( - INT_ID('G', 'L', 'S', '2'), + INT_ID('G', 'L', '2', 'S'), INT_ID('G', 'H', 'L', '2')); #else - const int zero_size = 0; - ::ri.saved_game->write_chunk( INT_ID('G', 'H', 'L', '2'), zero_size); //write out a zero buffer @@ -1855,7 +1858,7 @@ void G2_SaveGhoul2Models( #ifdef JK2_MODE ::ri.saved_game->write_chunk_and_size( - INT_ID('G', 'L', 'S', '2'), + INT_ID('G', 'L', '2', 'S'), INT_ID('G', 'H', 'L', '2')); #else ::ri.saved_game->write_chunk( @@ -1873,9 +1876,19 @@ void G2_LoadGhoul2Model( // first thing, lets see how many ghoul2 models we have, and resize our buffers accordingly auto model_count = 0; +#ifdef JK2_MODE + if (::ri.saved_game->get_buffer_size() > 0) + { +#endif // JK2_MODE + ::ri.saved_game->read( model_count); +#ifdef JK2_MODE + } +#endif // JK2_MODE + + ghoul2.resize( model_count); diff --git a/codeJK2/game/G_Timer.cpp b/codeJK2/game/G_Timer.cpp index 1896e48a86..34246eace3 100644 --- a/codeJK2/game/G_Timer.cpp +++ b/codeJK2/game/G_Timer.cpp @@ -259,6 +259,8 @@ void TIMER_Load( void ) tempBuffer, length); + tempBuffer[length] = '\0'; + ::gi.saved_game->read_chunk( INT_ID('T','D','T','A'), time); diff --git a/shared/qcommon/ojk_i_saved_game.h b/shared/qcommon/ojk_i_saved_game.h index cb83e41eba..ed8eaedb99 100644 --- a/shared/qcommon/ojk_i_saved_game.h +++ b/shared/qcommon/ojk_i_saved_game.h @@ -13,7 +13,8 @@ #include "ojk_scope_guard.h" -namespace ojk { +namespace ojk +{ // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -36,32 +37,32 @@ inline ISavedGame::~ISavedGame() template void ISavedGame::read_chunk( - const ChunkId chunk_id, - TDst& dst_value) + const ChunkId chunk_id, + TDst& dst_value) { - read_chunk( - chunk_id); + read_chunk( + chunk_id); - read( - dst_value); + read( + dst_value); - ensure_all_data_read(); + ensure_all_data_read(); } template void ISavedGame::read_chunk( - const ChunkId chunk_id, - TDst* dst_values, - int dst_count) + const ChunkId chunk_id, + TDst* dst_values, + int dst_count) { - read_chunk( - chunk_id); + read_chunk( + chunk_id); - read( - dst_values, - dst_count); + read( + dst_values, + dst_count); - ensure_all_data_read(); + ensure_all_data_read(); } // read_chunk @@ -73,53 +74,53 @@ void ISavedGame::read_chunk( template void ISavedGame::write_chunk_and_size( - const ChunkId size_chunk_id, - const ChunkId data_chunk_id) + const ChunkId size_chunk_id, + const ChunkId data_chunk_id) { - save_buffer(); + save_buffer(); - auto data_size = get_buffer_size(); + auto data_size = get_buffer_size(); - reset_buffer(); + reset_buffer(); - write_chunk( - size_chunk_id, - data_size); + write_chunk( + size_chunk_id, + data_size); - load_buffer(); + load_buffer(); - write_chunk( - data_chunk_id); + write_chunk( + data_chunk_id); } template void ISavedGame::write_chunk( - const ChunkId chunk_id, - const TSrc& src_value) + const ChunkId chunk_id, + const TSrc& src_value) { - reset_buffer(); + reset_buffer(); - write( - src_value); + write( + src_value); - write_chunk( - chunk_id); + write_chunk( + chunk_id); } template void ISavedGame::write_chunk( - const ChunkId chunk_id, - const TSrc* src_values, - int src_count) + const ChunkId chunk_id, + const TSrc* src_values, + int src_count) { - reset_buffer(); + reset_buffer(); - write( - src_values, - src_count); + write( + src_values, + src_count); - write_chunk( - chunk_id); + write_chunk( + chunk_id); } // write_chunk @@ -131,137 +132,137 @@ void ISavedGame::write_chunk( template void ISavedGame::read( - TDst& dst_value) + TDst& dst_value) { - using Tag = typename std::conditional< - std::is_same::value, - BooleanTag, - typename std::conditional< - std::is_arithmetic::value || std::is_enum::value, - NumericTag, - typename std::conditional< - std::is_pointer::value, - PointerTag, - typename std::conditional< - std::is_class::value, - ClassTag, - typename std::conditional< - std::rank::value == 1, - Array1dTag, - typename std::conditional< - std::rank::value == 2, - Array2dTag, - void - >::type - >::type - >::type - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported type."); - - read( - dst_value, - Tag()); + using Tag = typename std::conditional < + std::is_same::value, + BooleanTag, + typename std::conditional< + std::is_arithmetic::value || std::is_enum::value, + NumericTag, + typename std::conditional< + std::is_pointer::value, + PointerTag, + typename std::conditional< + std::is_class::value, + ClassTag, + typename std::conditional< + std::rank::value == 1, + Array1dTag, + typename std::conditional< + std::rank::value == 2, + Array2dTag, + void + >::type + >::type + >::type + >::type + >::type + > ::type; + + static_assert( + !std::is_same::value, + "Unsupported type."); + + read( + dst_value, + Tag()); } template void ISavedGame::read( - TDst& dst_value, - BooleanTag) + TDst& dst_value, + BooleanTag) { - constexpr auto src_size = static_cast(sizeof(TSrc)); + constexpr auto src_size = static_cast(sizeof(TSrc)); - TSrc src_value; + TSrc src_value; - raw_read( - &src_value, - static_cast(sizeof(TSrc))); + raw_read( + &src_value, + static_cast(sizeof(TSrc))); - // FIXME Byte order - // + // FIXME Byte order + // - dst_value = (src_value != 0); + dst_value = (src_value != 0); } template void ISavedGame::read( - TDst& dst_value, - NumericTag) + TDst& dst_value, + NumericTag) { - constexpr auto src_size = static_cast(sizeof(TSrc)); + constexpr auto src_size = static_cast(sizeof(TSrc)); - TSrc src_value; + TSrc src_value; - raw_read( - &src_value, - src_size); + raw_read( + &src_value, + src_size); - // FIXME Byte order - // + // FIXME Byte order + // - dst_value = static_cast(src_value); + dst_value = static_cast(src_value); } template void ISavedGame::read( - TDst*& dst_value, - PointerTag) + TDst*& dst_value, + PointerTag) { - static_assert( - std::is_arithmetic::value && - !std::is_same::value, - "Unsupported types."); + static_assert( + std::is_arithmetic::value && + !std::is_same::value, + "Unsupported types."); - using DstNumeric = typename std::conditional< - std::is_signed::value, - std::intptr_t, - std::uintptr_t - >::type; + using DstNumeric = typename std::conditional< + std::is_signed::value, + std::intptr_t, + std::uintptr_t + >::type; - auto dst_number = DstNumeric(); + auto dst_number = DstNumeric(); - read( - dst_number, - NumericTag()); + read( + dst_number, + NumericTag()); - dst_value = reinterpret_cast(dst_number); + dst_value = reinterpret_cast(dst_number); } template void ISavedGame::read( - TDst& dst_value, - ClassTag) + TDst& dst_value, + ClassTag) { - static_assert( - std::is_same::value, - "Unsupported types."); + static_assert( + std::is_same::value, + "Unsupported types."); - dst_value.sg_import( - this); + dst_value.sg_import( + this); } template void ISavedGame::read( - TDst (&dst_values)[TCount], - Array1dTag) + TDst(&dst_values)[TCount], + Array1dTag) { - read( - &dst_values[0], - TCount); + read( + &dst_values[0], + TCount); } template void ISavedGame::read( - TDst(&dst_values)[TCount1][TCount2], - Array2dTag) + TDst(&dst_values)[TCount1][TCount2], + Array2dTag) { - read( - &dst_values[0][0], - TCount1 * TCount2); + read( + &dst_values[0][0], + TCount1 * TCount2); } // read @@ -273,27 +274,27 @@ void ISavedGame::read( template bool ISavedGame::try_read( - TDst& dst_value) + TDst& dst_value) { - ScopeGuard scope_guard( - [this]() - { - this->allow_read_overflow( - true); - }, + ScopeGuard scope_guard( + [this]() + { + this->allow_read_overflow( + true); + }, - [this]() - { - this->allow_read_overflow( - false); - } - ); + [this]() + { + this->allow_read_overflow( + false); + } + ); - read( - dst_value); + read( + dst_value); - return is_all_data_read(); + return is_all_data_read(); } // try_read @@ -305,103 +306,103 @@ bool ISavedGame::try_read( template void ISavedGame::read( - TDst* dst_values, - int dst_count) + TDst* dst_values, + int dst_count) { - static_assert( - (std::is_arithmetic::value && - !std::is_same::value && - !std::is_enum::value) || - std::is_pointer::value || - std::is_class::value, - "Unsupported types."); - - using Src = typename std::conditional< - std::is_same::value, - TDst, - TSrc - >::type; - - constexpr auto is_src_pure_numeric = - std::is_arithmetic::value && - (!std::is_same::value) && - (!std::is_enum::value); - - constexpr auto is_dst_pure_numeric = - std::is_arithmetic::value && - (!std::is_same::value) && - (!std::is_enum::value); - - constexpr auto is_src_float_point = - std::is_floating_point::value; - - constexpr auto is_dst_float_point = - std::is_floating_point::value; - - constexpr auto has_same_size = - (sizeof(Src) == sizeof(TDst)); - - constexpr auto use_inplace = - is_src_pure_numeric && - is_dst_pure_numeric && - ((!is_src_float_point && !is_dst_float_point) || - (is_src_float_point && is_dst_float_point)) && - has_same_size; - - using Tag = typename std::conditional< - use_inplace, - InplaceTag, - CastTag - >::type; - - read( - dst_values, - dst_count, - Tag()); + static_assert( + (std::is_arithmetic::value && + !std::is_same::value && + !std::is_enum::value) || + std::is_pointer::value || + std::is_class::value, + "Unsupported types."); + + using Src = typename std::conditional< + std::is_same::value, + TDst, + TSrc + >::type; + + constexpr auto is_src_pure_numeric = + std::is_arithmetic::value && + (!std::is_same::value) && + (!std::is_enum::value); + + constexpr auto is_dst_pure_numeric = + std::is_arithmetic::value && + (!std::is_same::value) && + (!std::is_enum::value); + + constexpr auto is_src_float_point = + std::is_floating_point::value; + + constexpr auto is_dst_float_point = + std::is_floating_point::value; + + constexpr auto has_same_size = + (sizeof(Src) == sizeof(TDst)); + + constexpr auto use_inplace = + is_src_pure_numeric && + is_dst_pure_numeric && + ((!is_src_float_point && !is_dst_float_point) || + (is_src_float_point && is_dst_float_point)) && + has_same_size; + + using Tag = typename std::conditional< + use_inplace, + InplaceTag, + CastTag + >::type; + + read( + dst_values, + dst_count, + Tag()); } template void ISavedGame::read( - TDst* dst_values, - int dst_count, - InplaceTag) + TDst* dst_values, + int dst_count, + InplaceTag) { - const auto dst_size = dst_count * static_cast(sizeof(TDst)); + const auto dst_size = dst_count * static_cast(sizeof(TDst)); - raw_read( - dst_values, - dst_size); + raw_read( + dst_values, + dst_size); - // FIXME Byte order - // + // FIXME Byte order + // } template void ISavedGame::read( - TDst* dst_values, - int dst_count, - CastTag) + TDst* dst_values, + int dst_count, + CastTag) { - using Tag = typename std::conditional< - std::is_arithmetic::value, - NumericTag, - typename std::conditional< - std::is_pointer::value, - PointerTag, - typename std::conditional< - std::is_class::value, - ClassTag, - void - >::type - >::type - >::type; - - for (int i = 0; i < dst_count; ++i) - { - read( - dst_values[i], - Tag()); - } + using Tag = typename std::conditional< + std::is_arithmetic::value, + NumericTag, + typename std::conditional< + std::is_pointer::value, + PointerTag, + typename std::conditional< + std::is_class::value, + ClassTag, + void + >::type + >::type + >::type; + + for (int i = 0; i < dst_count; ++i) + { + read( + dst_values[i], + Tag()); + } } // read (C-array) @@ -413,105 +414,105 @@ void ISavedGame::read( template void ISavedGame::write( - const TSrc& src_value) + const TSrc& src_value) { - using Tag = typename std::conditional< - std::is_arithmetic::value || std::is_enum::value, - NumericTag, - typename std::conditional< - std::is_pointer::value, - PointerTag, - typename std::conditional< - std::is_class::value, - ClassTag, - typename std::conditional< - std::rank::value == 1, - Array1dTag, - typename std::conditional< - std::rank::value == 2, - Array2dTag, - void - >::type - >::type - >::type - >::type - >::type; - - static_assert( - !std::is_same::value, - "Unsupported type."); - - write( - src_value, - Tag()); + using Tag = typename std::conditional< + std::is_arithmetic::value || std::is_enum::value, + NumericTag, + typename std::conditional< + std::is_pointer::value, + PointerTag, + typename std::conditional< + std::is_class::value, + ClassTag, + typename std::conditional< + std::rank::value == 1, + Array1dTag, + typename std::conditional< + std::rank::value == 2, + Array2dTag, + void + >::type + >::type + >::type + >::type + >::type; + + static_assert( + !std::is_same::value, + "Unsupported type."); + + write( + src_value, + Tag()); } template void ISavedGame::write( - const TSrc& src_value, - NumericTag) + const TSrc& src_value, + NumericTag) { - constexpr auto dst_size = static_cast(sizeof(TDst)); + constexpr auto dst_size = static_cast(sizeof(TDst)); - auto dst_value = static_cast(src_value); + auto dst_value = static_cast(src_value); - // FIXME Byte order - // + // FIXME Byte order + // - raw_write( - &dst_value, - dst_size); + raw_write( + &dst_value, + dst_size); } template void ISavedGame::write( - const TSrc* src_value, - PointerTag) + const TSrc* src_value, + PointerTag) { - using DstNumeric = typename std::conditional< - std::is_signed::value, - std::intptr_t, - std::uintptr_t - >::type; + using DstNumeric = typename std::conditional< + std::is_signed::value, + std::intptr_t, + std::uintptr_t + >::type; - auto dst_number = reinterpret_cast(src_value); + auto dst_number = reinterpret_cast(src_value); - write( - dst_number, - NumericTag()); + write( + dst_number, + NumericTag()); } template void ISavedGame::write( - const TSrc& src_value, - ClassTag) + const TSrc& src_value, + ClassTag) { - static_assert( - std::is_same::value, - "Unsupported types."); + static_assert( + std::is_same::value, + "Unsupported types."); - src_value.sg_export( - this); + src_value.sg_export( + this); } template void ISavedGame::write( - const TSrc (&src_values)[TCount], - Array1dTag) + const TSrc(&src_values)[TCount], + Array1dTag) { - write( - &src_values[0], - TCount); + write( + &src_values[0], + TCount); } template void ISavedGame::write( - const TSrc (&src_values)[TCount1][TCount2], - Array2dTag) + const TSrc(&src_values)[TCount1][TCount2], + Array2dTag) { - write( - &src_values[0][0], - TCount1 * TCount2); + write( + &src_values[0][0], + TCount1 * TCount2); } // write @@ -523,102 +524,102 @@ void ISavedGame::write( template void ISavedGame::write( - const TSrc* src_values, - int src_count) + const TSrc* src_values, + int src_count) { - static_assert( - (std::is_arithmetic::value && - !std::is_same::value && - !std::is_enum::value) || - std::is_pointer::value || - std::is_class::value, - "Unsupported types."); - - using Dst = typename std::conditional< - std::is_same::value, - TSrc, - TDst>::type; - - constexpr auto is_src_pure_numeric = - std::is_arithmetic::value && - (!std::is_same::value) && - (!std::is_enum::value); - - constexpr auto is_dst_pure_numeric = - std::is_arithmetic::value && - (!std::is_same::value) && - (!std::is_enum::value); - - constexpr auto is_src_float_point = - std::is_floating_point::value; - - constexpr auto is_dst_float_point = - std::is_floating_point::value; - - constexpr auto has_same_size = - (sizeof(TSrc) == sizeof(Dst)); - - constexpr auto use_inplace = - is_src_pure_numeric && - is_dst_pure_numeric && - ((!is_src_float_point && !is_dst_float_point) || - (is_src_float_point && is_dst_float_point)) && - has_same_size; - - using Tag = typename std::conditional< - use_inplace, - InplaceTag, - CastTag - >::type; - - write( - src_values, - src_count, - Tag()); + static_assert( + (std::is_arithmetic::value && + !std::is_same::value && + !std::is_enum::value) || + std::is_pointer::value || + std::is_class::value, + "Unsupported types."); + + using Dst = typename std::conditional< + std::is_same::value, + TSrc, + TDst>::type; + + constexpr auto is_src_pure_numeric = + std::is_arithmetic::value && + (!std::is_same::value) && + (!std::is_enum::value); + + constexpr auto is_dst_pure_numeric = + std::is_arithmetic::value && + (!std::is_same::value) && + (!std::is_enum::value); + + constexpr auto is_src_float_point = + std::is_floating_point::value; + + constexpr auto is_dst_float_point = + std::is_floating_point::value; + + constexpr auto has_same_size = + (sizeof(TSrc) == sizeof(Dst)); + + constexpr auto use_inplace = + is_src_pure_numeric && + is_dst_pure_numeric && + ((!is_src_float_point && !is_dst_float_point) || + (is_src_float_point && is_dst_float_point)) && + has_same_size; + + using Tag = typename std::conditional< + use_inplace, + InplaceTag, + CastTag + >::type; + + write( + src_values, + src_count, + Tag()); } template void ISavedGame::write( - const TSrc* src_values, - int src_count, - InplaceTag) + const TSrc* src_values, + int src_count, + InplaceTag) { - const auto src_size = src_count * static_cast(sizeof(TSrc)); + const auto src_size = src_count * static_cast(sizeof(TSrc)); - raw_write( - src_values, - src_size); + raw_write( + src_values, + src_size); - // FIXME Byte order - // + // FIXME Byte order + // } template void ISavedGame::write( - const TSrc* src_values, - int src_count, - CastTag) + const TSrc* src_values, + int src_count, + CastTag) { - using Tag = typename std::conditional< - std::is_arithmetic::value, - NumericTag, - typename std::conditional< - std::is_pointer::value, - PointerTag, - typename std::conditional< - std::is_class::value, - ClassTag, - void - >::type - >::type - >::type; - - for (int i = 0; i < src_count; ++i) - { - write( - src_values[i], - Tag()); - } + using Tag = typename std::conditional< + std::is_arithmetic::value, + NumericTag, + typename std::conditional< + std::is_pointer::value, + PointerTag, + typename std::conditional< + std::is_class::value, + ClassTag, + void + >::type + >::type + >::type; + + for (int i = 0; i < src_count; ++i) + { + write( + src_values[i], + Tag()); + } } // write (C-array) diff --git a/shared/qcommon/ojk_i_saved_game_fwd.h b/shared/qcommon/ojk_i_saved_game_fwd.h index 91a7e61301..7a3bb596c4 100644 --- a/shared/qcommon/ojk_i_saved_game_fwd.h +++ b/shared/qcommon/ojk_i_saved_game_fwd.h @@ -19,245 +19,269 @@ namespace ojk class ISavedGame { public: - using ChunkId = uint32_t; + using ChunkId = uint32_t; - ISavedGame(); + ISavedGame(); - ISavedGame( - const ISavedGame& that) = delete; + ISavedGame( + const ISavedGame& that) = delete; - ISavedGame& operator=( - const ISavedGame& that) = delete; + ISavedGame& operator=( + const ISavedGame& that) = delete; - virtual ~ISavedGame(); + virtual ~ISavedGame(); - // Returns true if the saved game opened for reading. - virtual bool is_readable() const = 0; + // Returns true if the saved game opened for reading. + virtual bool is_readable() const = 0; - // Returns true if the saved game opened for writing. - virtual bool is_writable() const = 0; + // Returns true if the saved game opened for writing. + virtual bool is_writable() const = 0; - // Reads a chunk from the file into the internal buffer. - virtual void read_chunk( - const ChunkId chunk_id) = 0; + // Reads a chunk from the file into the internal buffer. + virtual void read_chunk( + const ChunkId chunk_id) = 0; - // Reads a value or an array of values from the file via - // the internal buffer. - template - void read_chunk( - const ChunkId chunk_id, - TDst& dst_value); + // Reads a value or an array of values from the file via + // the internal buffer. + template + void read_chunk( + const ChunkId chunk_id, + TDst& dst_value); - // Reads an array of values with specified count from - // the file via the internal buffer. - template - void read_chunk( - const ChunkId chunk_id, - TDst* dst_values, - int dst_count); + // Reads an array of values with specified count from + // the file via the internal buffer. + template + void read_chunk( + const ChunkId chunk_id, + TDst* dst_values, + int dst_count); - // Returns true if all data read from the internal buffer. - virtual bool is_all_data_read() const = 0; + // Returns true if all data read from the internal buffer. + virtual bool is_all_data_read() const = 0; - // Throws an exception if all data not read. - virtual void ensure_all_data_read() const = 0; + // Throws an exception if all data not read. + virtual void ensure_all_data_read() const = 0; - // Writes a chunk into the file from the internal buffer. - virtual void write_chunk( - const ChunkId chunk_id) = 0; + // Writes a chunk into the file from the internal buffer. + virtual void write_chunk( + const ChunkId chunk_id) = 0; - // Writes a data-chunk into the file from the internal buffer - // prepended with a size-chunk that holds a size of the data-chunk. - template - void write_chunk_and_size( - const ChunkId size_chunk_id, - const ChunkId data_chunk_id); + // Writes a data-chunk into the file from the internal buffer + // prepended with a size-chunk that holds a size of the data-chunk. + template + void write_chunk_and_size( + const ChunkId size_chunk_id, + const ChunkId data_chunk_id); - // Writes a value or an array of values into the file via - // the internal buffer. - template - void write_chunk( - const ChunkId chunk_id, - const TSrc& src_value); + // Writes a value or an array of values into the file via + // the internal buffer. + template + void write_chunk( + const ChunkId chunk_id, + const TSrc& src_value); - // Writes an array of values with specified count into - // the file via the internal buffer. - template - void write_chunk( - const ChunkId chunk_id, - const TSrc* src_values, - int src_count); + // Writes an array of values with specified count into + // the file via the internal buffer. + template + void write_chunk( + const ChunkId chunk_id, + const TSrc* src_values, + int src_count); - // Reads a raw data from the internal buffer. - virtual void raw_read( - void* dst_data, - int dst_size) = 0; + // Reads a raw data from the internal buffer. + virtual void raw_read( + void* dst_data, + int dst_size) = 0; - // Reads a value or array of values from the internal buffer. - template - void read( - TDst& dst_value); + // Reads a value or array of values from the internal buffer. + template + void read( + TDst& dst_value); - // Reads an array of values with specificed count from the internal buffer. - template - void read( - TDst* dst_values, - int dst_count); + // Reads an array of values with specificed count from the internal buffer. + template + void read( + TDst* dst_values, + int dst_count); - // Tries to read a value or array of values from the internal buffer. - // Returns true on success or false otherwise. - template - bool try_read( - TDst& dst_value); + // Tries to read a value or array of values from the internal buffer. + // Returns true on success or false otherwise. + template + bool try_read( + TDst& dst_value); - // Writes a raw data into the internal buffer. - virtual void raw_write( - const void* src_data, - int src_size) = 0; + // Writes a raw data into the internal buffer. + virtual void raw_write( + const void* src_data, + int src_size) = 0; - // Writes a value or array of values into the internal buffer. - template - void write( - const TSrc& src_value); + // Writes a value or array of values into the internal buffer. + template + void write( + const TSrc& src_value); - // Writes an array of values with specificed count into the internal buffer. - template - void write( - const TSrc* src_values, - int src_count); + // Writes an array of values with specificed count into the internal buffer. + template + void write( + const TSrc* src_values, + int src_count); - // Increments buffer's offset by the specified non-negative count. - virtual void skip( - int count) = 0; + // Increments buffer's offset by the specified non-negative count. + virtual void skip( + int count) = 0; - // Stores current I/O buffer and it's position. - virtual void save_buffer() = 0; + // Stores current I/O buffer and it's position. + virtual void save_buffer() = 0; - // Restores saved I/O buffer and it's position. - virtual void load_buffer() = 0; + // Restores saved I/O buffer and it's position. + virtual void load_buffer() = 0; - // Returns a pointer to data in the I/O buffer. - virtual const void* get_buffer_data() const = 0; + // Returns a pointer to data in the I/O buffer. + virtual const void* get_buffer_data() const = 0; - // Returns a current size of the I/O buffer. - virtual int get_buffer_size() const = 0; + // Returns a current size of the I/O buffer. + virtual int get_buffer_size() const = 0; - // Clears buffer and resets it's offset to the beginning. - virtual void reset_buffer() = 0; + // Clears buffer and resets it's offset to the beginning. + virtual void reset_buffer() = 0; - // Resets buffer offset to the beginning. - virtual void reset_buffer_offset() = 0; + // Resets buffer offset to the beginning. + virtual void reset_buffer_offset() = 0; protected: - // Tags for dispatching. - class BooleanTag { public: }; - class NumericTag { public: }; - class PointerTag { public: }; - class ClassTag { public: }; - class Array1dTag { public: }; - class Array2dTag { public: }; - class InplaceTag { public: }; - class CastTag { public: }; - - - // If true won't throw an exception when buffer offset is beyond it's size. - // Although, no data will be read beyond the buffer. - virtual void allow_read_overflow( - bool value) = 0; - - - template - void read( - TDst& dst_value, - BooleanTag); - - template - void read( - TDst& dst_value, - NumericTag); - - template - void read( - TDst*& dst_value, - PointerTag); - - template - void read( - TDst& dst_value, - ClassTag); - - template - void read( - TDst (&dst_values)[TCount], - Array1dTag); - - template - void read( - TDst (&dst_values)[TCount1][TCount2], - Array2dTag); - - - template - void read( - TDst* dst_values, - int dst_count, - InplaceTag); - - template - void read( - TDst* dst_values, - int dst_count, - CastTag); - - - template - void write( - const TSrc& src_value, - NumericTag); - - template - void write( - const TSrc* src_value, - PointerTag); - - template - void write( - const TSrc& src_value, - ClassTag); - - template - void write( - const TSrc (&src_values)[TCount], - Array1dTag); - - template - void write( - const TSrc (&src_values)[TCount1][TCount2], - Array2dTag); - - - template - void write( - const TSrc* src_values, - int src_count, - InplaceTag); - - template - void write( - const TSrc* src_values, - int src_count, - CastTag); + // Tags for dispatching. + class BooleanTag + { + public: + }; + class NumericTag + { + public: + }; + class PointerTag + { + public: + }; + class ClassTag + { + public: + }; + class Array1dTag + { + public: + }; + class Array2dTag + { + public: + }; + class InplaceTag + { + public: + }; + class CastTag + { + public: + }; + + + // If true won't throw an exception when buffer offset is beyond it's size. + // Although, no data will be read beyond the buffer. + virtual void allow_read_overflow( + bool value) = 0; + + + template + void read( + TDst& dst_value, + BooleanTag); + + template + void read( + TDst& dst_value, + NumericTag); + + template + void read( + TDst*& dst_value, + PointerTag); + + template + void read( + TDst& dst_value, + ClassTag); + + template + void read( + TDst(&dst_values)[TCount], + Array1dTag); + + template + void read( + TDst(&dst_values)[TCount1][TCount2], + Array2dTag); + + + template + void read( + TDst* dst_values, + int dst_count, + InplaceTag); + + template + void read( + TDst* dst_values, + int dst_count, + CastTag); + + + template + void write( + const TSrc& src_value, + NumericTag); + + template + void write( + const TSrc* src_value, + PointerTag); + + template + void write( + const TSrc& src_value, + ClassTag); + + template + void write( + const TSrc(&src_values)[TCount], + Array1dTag); + + template + void write( + const TSrc(&src_values)[TCount1][TCount2], + Array2dTag); + + + template + void write( + const TSrc* src_values, + int src_count, + InplaceTag); + + template + void write( + const TSrc* src_values, + int src_count, + CastTag); }; // ISavedGame diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index d10cecc7b3..c4a270f9d6 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -10,846 +10,857 @@ namespace ojk SavedGame::SavedGame() : - file_handle_(), - io_buffer_(), - saved_io_buffer_(), - io_buffer_offset_(), - saved_io_buffer_offset_(), - rle_buffer_(), - is_readable_(), - is_writable_(), - is_write_failed_(), - is_read_overflow_allowed_() + file_handle_(), + io_buffer_(), + saved_io_buffer_(), + io_buffer_offset_(), + saved_io_buffer_offset_(), + rle_buffer_(), + is_readable_(), + is_writable_(), + is_write_failed_(), + is_read_overflow_allowed_() { } SavedGame::~SavedGame() { - close(); + close(); } bool SavedGame::open( - const std::string& base_file_name) + const std::string& base_file_name) { - close(); + close(); - const auto&& file_path = generate_path( - base_file_name); + const auto&& file_path = generate_path( + base_file_name); - auto is_succeed = true; + auto is_succeed = true; - if (is_succeed) - { - ::FS_FOpenFileRead( - file_path.c_str(), - &file_handle_, - qtrue); + static_cast(::FS_FOpenFileRead( + file_path.c_str(), + &file_handle_, + true)); - if (file_handle_ == 0) - { - is_succeed = false; + if (file_handle_ == 0) + { + is_succeed = false; - const auto&& error_message = - S_COLOR_RED "Failed to open a saved game file: \"" + - file_path + "\"."; + const auto&& error_message = + S_COLOR_RED "Failed to open a saved game file: \"" + + file_path + "\"."; - ::Com_DPrintf( - "%s\n", - error_message.c_str()); - } - } + ::Com_DPrintf( + "%s\n", + error_message.c_str()); + } - if (is_succeed) - { - is_readable_ = true; - } + if (is_succeed) + { + is_readable_ = true; + } - auto sg_version = -1; + auto sg_version = -1; - if (is_succeed) - { - static_cast(read_chunk( - INT_ID('_', 'V', 'E', 'R'), - sg_version)); + if (is_succeed) + { + static_cast(read_chunk( + INT_ID('_', 'V', 'E', 'R'), + sg_version)); - if (sg_version != iSAVEGAME_VERSION) - { - is_succeed = false; + if (sg_version != iSAVEGAME_VERSION) + { + is_succeed = false; - ::Com_Printf( - S_COLOR_RED "File \"%s\" has version # %d (expecting %d)\n", - base_file_name.c_str(), - sg_version, - iSAVEGAME_VERSION); - } - } + ::Com_Printf( + S_COLOR_RED "File \"%s\" has version # %d (expecting %d)\n", + base_file_name.c_str(), + sg_version, + iSAVEGAME_VERSION); + } + } - if (!is_succeed) - { - close(); - } + if (!is_succeed) + { + close(); + } - return is_succeed; + return is_succeed; } bool SavedGame::create( - const std::string& base_file_name) + const std::string& base_file_name) { - close(); + close(); - remove( - base_file_name); + remove( + base_file_name); - const auto&& file_path = generate_path( - base_file_name); + const auto&& file_path = generate_path( + base_file_name); - file_handle_ = ::FS_FOpenFileWrite( - file_path.c_str()); + file_handle_ = ::FS_FOpenFileWrite( + file_path.c_str()); - if (file_handle_ == 0) - { - const auto&& error_message = - S_COLOR_RED "Failed to create a saved game file: \"" + - file_path + "\"."; + if (file_handle_ == 0) + { + const auto&& error_message = + S_COLOR_RED "Failed to create a saved game file: \"" + + file_path + "\"."; - ::Com_Printf( - "%s\n", - error_message.c_str()); + ::Com_Printf( + "%s\n", + error_message.c_str()); - return false; - } + return false; + } - is_writable_ = true; + is_writable_ = true; - const auto sg_version = iSAVEGAME_VERSION; + const auto sg_version = iSAVEGAME_VERSION; - write_chunk( - INT_ID('_', 'V', 'E', 'R'), - sg_version); + write_chunk( + INT_ID('_', 'V', 'E', 'R'), + sg_version); - return true; + return true; } void SavedGame::close() { - if (file_handle_ != 0) - { - ::FS_FCloseFile(file_handle_); - file_handle_ = 0; - } + if (file_handle_ != 0) + { + ::FS_FCloseFile(file_handle_); + file_handle_ = 0; + } - io_buffer_.clear(); - io_buffer_offset_ = 0; + io_buffer_.clear(); + io_buffer_offset_ = 0; - is_readable_ = false; - is_writable_ = false; - is_write_failed_ = false; + is_readable_ = false; + is_writable_ = false; + is_write_failed_ = false; } bool SavedGame::is_readable() const { - return is_readable_; + return is_readable_; } bool SavedGame::is_writable() const { - return is_writable_; + return is_writable_; } void SavedGame::read_chunk( - const SavedGame::ChunkId chunk_id) + const SavedGame::ChunkId chunk_id) { - io_buffer_offset_ = 0; + io_buffer_offset_ = 0; - const auto&& chunk_id_string = get_chunk_id_string( - chunk_id); + const auto&& chunk_id_string = get_chunk_id_string( + chunk_id); - ::Com_DPrintf( - "Attempting read of chunk %s\n", - chunk_id_string.c_str()); + ::Com_DPrintf( + "Attempting read of chunk %s\n", + chunk_id_string.c_str()); - uint32_t ulLoadedChid = 0; - uint32_t uiLoadedLength = 0; + uint32_t ulLoadedChid = 0; + uint32_t uiLoadedLength = 0; - auto uiLoaded = ::FS_Read( - &ulLoadedChid, - static_cast(sizeof(ulLoadedChid)), - file_handle_); + auto uiLoaded = ::FS_Read( + &ulLoadedChid, + static_cast(sizeof(ulLoadedChid)), + file_handle_); - uiLoaded += ::FS_Read( - &uiLoadedLength, - static_cast(sizeof(uiLoadedLength)), - file_handle_); + uiLoaded += ::FS_Read( + &uiLoadedLength, + static_cast(sizeof(uiLoadedLength)), + file_handle_); - const auto bBlockIsCompressed = (static_cast(uiLoadedLength) < 0); + const auto bBlockIsCompressed = (static_cast(uiLoadedLength) < 0); - if (bBlockIsCompressed) - { - uiLoadedLength = -static_cast(uiLoadedLength); - } + if (bBlockIsCompressed) + { + uiLoadedLength = -static_cast(uiLoadedLength); + } - // Make sure we are loading the correct chunk... - // - if (ulLoadedChid != chunk_id) - { - const auto&& loaded_chunk_id_string = get_chunk_id_string( - ulLoadedChid); + // Make sure we are loading the correct chunk... + // + if (ulLoadedChid != chunk_id) + { + const auto&& loaded_chunk_id_string = get_chunk_id_string( + ulLoadedChid); - const auto&& error_message = - "Loaded chunk ID (" + - loaded_chunk_id_string + - ") does not match requested chunk ID (" + - chunk_id_string + - ")."; + const auto&& error_message = + "Loaded chunk ID (" + + loaded_chunk_id_string + + ") does not match requested chunk ID (" + + chunk_id_string + + ")."; - throw_error( - error_message); - } + throw_error( + error_message); + } - uint32_t uiLoadedCksum = 0; + uint32_t uiLoadedCksum = 0; #ifdef JK2_MODE - // Get checksum... - // - uiLoaded += ::FS_Read( - &uiLoadedCksum, - static_cast(sizeof(uiLoadedCksum)), - file_handle_); + // Get checksum... + // + uiLoaded += ::FS_Read( + &uiLoadedCksum, + static_cast(sizeof(uiLoadedCksum)), + file_handle_); #endif // JK2_MODE - // Load in data and magic number... - // - uint32_t uiCompressedLength = 0; - - if (bBlockIsCompressed) - { - uiLoaded += ::FS_Read( - &uiCompressedLength, - static_cast(sizeof(uiCompressedLength)), - file_handle_); - - rle_buffer_.resize( - uiCompressedLength); - - uiLoaded += ::FS_Read( - rle_buffer_.data(), - uiCompressedLength, - file_handle_); - - io_buffer_.resize( - uiLoadedLength); - - decompress( - rle_buffer_, - io_buffer_); - } - else - { - io_buffer_.resize( - uiLoadedLength); - - uiLoaded += ::FS_Read( - io_buffer_.data(), - uiLoadedLength, - file_handle_); - } + // Load in data and magic number... + // + uint32_t uiCompressedLength = 0; + + if (bBlockIsCompressed) + { + uiLoaded += ::FS_Read( + &uiCompressedLength, + static_cast(sizeof(uiCompressedLength)), + file_handle_); + + rle_buffer_.resize( + uiCompressedLength); + + uiLoaded += ::FS_Read( + rle_buffer_.data(), + uiCompressedLength, + file_handle_); + + io_buffer_.resize( + uiLoadedLength); + + decompress( + rle_buffer_, + io_buffer_); + } + else + { + io_buffer_.resize( + uiLoadedLength); + + uiLoaded += ::FS_Read( + io_buffer_.data(), + uiLoadedLength, + file_handle_); + } #ifdef JK2_MODE - uint32_t uiLoadedMagic = 0; + uint32_t uiLoadedMagic = 0; - uiLoaded += ::FS_Read( - &uiLoadedMagic, - static_cast(sizeof(uiLoadedMagic)), - file_handle_); + uiLoaded += ::FS_Read( + &uiLoadedMagic, + static_cast(sizeof(uiLoadedMagic)), + file_handle_); - if (uiLoadedMagic != get_jo_magic_value()) - { - const auto&& error_message = - "Bad saved game magic for chunk " + chunk_id_string + "."; + if (uiLoadedMagic != get_jo_magic_value()) + { + const auto&& error_message = + "Bad saved game magic for chunk " + chunk_id_string + "."; - throw_error( - error_message); - } + throw_error( + error_message); + } #endif // JK2_MODE #ifndef JK2_MODE - // Get checksum... - // - uiLoaded += ::FS_Read( - &uiLoadedCksum, - static_cast(sizeof(uiLoadedCksum)), - file_handle_); + // Get checksum... + // + uiLoaded += ::FS_Read( + &uiLoadedCksum, + static_cast(sizeof(uiLoadedCksum)), + file_handle_); #endif // !JK2_MODE - // Make sure the checksums match... - // - const auto uiCksum = ::Com_BlockChecksum( - io_buffer_.data(), - static_cast(io_buffer_.size())); - - if (uiLoadedCksum != uiCksum) - { - const auto&& error_message = - "Failed checksum check for chunk " + chunk_id_string + "."; - - throw_error( - error_message); - } - - // Make sure we didn't encounter any read errors... - if (uiLoaded != - sizeof(ulLoadedChid) + - sizeof(uiLoadedLength) + - sizeof(uiLoadedCksum) + - (bBlockIsCompressed ? sizeof(uiCompressedLength) : 0) + - (bBlockIsCompressed ? uiCompressedLength : io_buffer_.size()) + + // Make sure the checksums match... + // + const auto uiCksum = ::Com_BlockChecksum( + io_buffer_.data(), + static_cast(io_buffer_.size())); + + if (uiLoadedCksum != uiCksum) + { + const auto&& error_message = + "Failed checksum check for chunk " + chunk_id_string + "."; + + throw_error( + error_message); + } + + // Make sure we didn't encounter any read errors... + if (uiLoaded != + sizeof(ulLoadedChid) + + sizeof(uiLoadedLength) + + sizeof(uiLoadedCksum) + + (bBlockIsCompressed ? sizeof(uiCompressedLength) : 0) + + (bBlockIsCompressed ? uiCompressedLength : io_buffer_.size()) + #ifdef JK2_MODE - sizeof(uiLoadedMagic) + + sizeof(uiLoadedMagic) + #endif - 0) - { - const auto&& error_message = - "Error during loading chunk " + chunk_id_string + "."; + 0) + { + const auto&& error_message = + "Error during loading chunk " + chunk_id_string + "."; - throw_error( - error_message); - } + throw_error( + error_message); + } } bool SavedGame::is_all_data_read() const { - return io_buffer_.size() == io_buffer_offset_; + return io_buffer_.size() == io_buffer_offset_; } void SavedGame::ensure_all_data_read() const { - if (!is_all_data_read()) - { - throw_error( - "Not all expected data read."); - } + if (!is_all_data_read()) + { + throw_error( + "Not all expected data read."); + } } void SavedGame::write_chunk( - const SavedGame::ChunkId chunk_id) + const SavedGame::ChunkId chunk_id) { - const auto&& chunk_id_string = get_chunk_id_string( - chunk_id); + const auto&& chunk_id_string = get_chunk_id_string( + chunk_id); - ::Com_DPrintf( - "Attempting write of chunk %s\n", - chunk_id_string.c_str()); + ::Com_DPrintf( + "Attempting write of chunk %s\n", + chunk_id_string.c_str()); - if (::sv_testsave->integer != 0) - { - return; - } + if (::sv_testsave->integer != 0) + { + return; + } - const auto src_size = static_cast(io_buffer_.size()); + const auto src_size = static_cast(io_buffer_.size()); - const auto uiCksum = Com_BlockChecksum( - io_buffer_.data(), - src_size); + const auto uiCksum = Com_BlockChecksum( + io_buffer_.data(), + src_size); - uint32_t uiSaved = ::FS_Write( - &chunk_id, - static_cast(sizeof(chunk_id)), - file_handle_); + uint32_t uiSaved = ::FS_Write( + &chunk_id, + static_cast(sizeof(chunk_id)), + file_handle_); -#ifdef JK2_MODE - uiSaved += ::FS_Write( - &uiCksum, - static_cast(sizeof(uiCksum)), - file_handle_); -#endif // JK2_MODE +#ifndef JK2_MODE + uiSaved += ::FS_Write( + &uiCksum, + static_cast(sizeof(uiCksum)), + file_handle_); +#endif // !JK2_MODE - auto iCompressedLength = -1; + auto iCompressedLength = -1; - if (::sv_compress_saved_games->integer != 0) - { - compress( - io_buffer_, - rle_buffer_); + if (::sv_compress_saved_games->integer != 0) + { + compress( + io_buffer_, + rle_buffer_); - if (rle_buffer_.size() < io_buffer_.size()) - { - iCompressedLength = static_cast(rle_buffer_.size()); - } - } + if (rle_buffer_.size() < io_buffer_.size()) + { + iCompressedLength = static_cast(rle_buffer_.size()); + } + } #ifdef JK2_MODE - const auto uiMagic = get_jo_magic_value(); + const auto uiMagic = get_jo_magic_value(); #endif // JK2_MODE - if (iCompressedLength > 0) - { - const auto iLength = -static_cast(io_buffer_.size()); + if (iCompressedLength > 0) + { + const auto iLength = -static_cast(io_buffer_.size()); - uiSaved += ::FS_Write( - &iLength, - static_cast(sizeof(iLength)), - file_handle_); + uiSaved += ::FS_Write( + &iLength, + static_cast(sizeof(iLength)), + file_handle_); - uiSaved += ::FS_Write( - &iCompressedLength, - static_cast(sizeof(iCompressedLength)), - file_handle_); +#ifdef JK2_MODE + uiSaved += ::FS_Write( + &uiCksum, + static_cast(sizeof(uiCksum)), + file_handle_); +#endif // JK2_MODE - uiSaved += ::FS_Write( - rle_buffer_.data(), - iCompressedLength, - file_handle_); + uiSaved += ::FS_Write( + &iCompressedLength, + static_cast(sizeof(iCompressedLength)), + file_handle_); + + uiSaved += ::FS_Write( + rle_buffer_.data(), + iCompressedLength, + file_handle_); #ifdef JK2_MODE - uiSaved += ::FS_Write( - &uiMagic, - static_cast(sizeof(uiMagic)), - file_handle_); + uiSaved += ::FS_Write( + &uiMagic, + static_cast(sizeof(uiMagic)), + file_handle_); #endif // JK2_MODE #ifndef JK2_MODE - uiSaved += ::FS_Write( - &uiCksum, - static_cast(sizeof(uiCksum)), - file_handle_); + uiSaved += ::FS_Write( + &uiCksum, + static_cast(sizeof(uiCksum)), + file_handle_); #endif // !JK2_MODE - if (uiSaved != - sizeof(chunk_id) + - sizeof(iLength) + - sizeof(uiCksum) + - sizeof(iCompressedLength) + - iCompressedLength + + if (uiSaved != + sizeof(chunk_id) + + sizeof(iLength) + + sizeof(uiCksum) + + sizeof(iCompressedLength) + + iCompressedLength + #ifdef JK2_MODE - sizeof(uiMagic) + + sizeof(uiMagic) + #endif // JK2_MODE - 0) - { - is_write_failed_ = true; - - ::Com_Printf( - S_COLOR_RED "Failed to write %s chunk\n", - chunk_id_string.c_str()); - - return; - } - } - else - { - const auto iLength = static_cast(io_buffer_.size()); - - uiSaved += ::FS_Write( - &iLength, - static_cast(sizeof(iLength)), - file_handle_); - - uiSaved += ::FS_Write( - io_buffer_.data(), - iLength, - file_handle_); + 0) + { + is_write_failed_ = true; + + ::Com_Printf( + S_COLOR_RED "Failed to write %s chunk\n", + chunk_id_string.c_str()); + + return; + } + } + else + { + const auto iLength = static_cast(io_buffer_.size()); + + uiSaved += ::FS_Write( + &iLength, + static_cast(sizeof(iLength)), + file_handle_); #ifdef JK2_MODE - uiSaved += ::FS_Write( - &uiMagic, - static_cast(sizeof(uiMagic)), - file_handle_); + uiSaved += ::FS_Write( + &uiCksum, + static_cast(sizeof(uiCksum)), + file_handle_); #endif // JK2_MODE + uiSaved += ::FS_Write( + io_buffer_.data(), + iLength, + file_handle_); + #ifdef JK2_MODE - uiSaved += ::FS_Write( - &uiCksum, - static_cast(sizeof(uiCksum)), - file_handle_); + uiSaved += ::FS_Write( + &uiMagic, + static_cast(sizeof(uiMagic)), + file_handle_); #endif // JK2_MODE - if (uiSaved != - sizeof(chunk_id) + - sizeof(iLength) + - sizeof(uiCksum) + - iLength + +#ifndef JK2_MODE + uiSaved += ::FS_Write( + &uiCksum, + static_cast(sizeof(uiCksum)), + file_handle_); +#endif // !JK2_MODE + + if (uiSaved != + sizeof(chunk_id) + + sizeof(iLength) + + sizeof(uiCksum) + + iLength + #ifdef JK2_MODE - sizeof(uiMagic) + + sizeof(uiMagic) + #endif // JK2_MODE - 0) - { - is_write_failed_ = true; + 0) + { + is_write_failed_ = true; - ::Com_Printf( - S_COLOR_RED "Failed to write %s chunk\n", - chunk_id_string.c_str()); + ::Com_Printf( + S_COLOR_RED "Failed to write %s chunk\n", + chunk_id_string.c_str()); - return; - } - } + return; + } + } } void SavedGame::raw_read( - void* dst_data, - int dst_size) -{ - if (!dst_data) - { - throw_error( - "Null pointer."); - } - - if (dst_size < 0) - { - throw_error( - "Negative size."); - } - - if (!is_readable_) - { - throw_error( - "Not readable."); - } - - if (dst_size == 0) - { - return; - } - - auto is_overflowed = ((io_buffer_offset_ + dst_size) > io_buffer_.size()); - - if (is_overflowed) - { - if (!is_read_overflow_allowed_) - { - throw_error( - "Not enough data."); - } - } - - if (!is_overflowed) - { - std::uninitialized_copy_n( - &io_buffer_[io_buffer_offset_], - dst_size, - static_cast(dst_data)); - } - - io_buffer_offset_ += dst_size; + void* dst_data, + int dst_size) +{ + if (!dst_data) + { + throw_error( + "Null pointer."); + } + + if (dst_size < 0) + { + throw_error( + "Negative size."); + } + + if (!is_readable_) + { + throw_error( + "Not readable."); + } + + if (dst_size == 0) + { + return; + } + + auto is_overflowed = ((io_buffer_offset_ + dst_size) > io_buffer_.size()); + + if (is_overflowed) + { + if (!is_read_overflow_allowed_) + { + throw_error( + "Not enough data."); + } + } + + if (!is_overflowed) + { + std::uninitialized_copy_n( + &io_buffer_[io_buffer_offset_], + dst_size, + static_cast(dst_data)); + } + + io_buffer_offset_ += dst_size; } void SavedGame::raw_write( - const void* src_data, - int src_size) + const void* src_data, + int src_size) { - if (!src_data) - { - throw_error( - "Null pointer."); - } + if (!src_data) + { + throw_error( + "Null pointer."); + } - if (src_size < 0) - { - throw_error( - "Negative size."); - } + if (src_size < 0) + { + throw_error( + "Negative size."); + } - if (!is_writable_) - { - throw_error( - "Not writable."); - } + if (!is_writable_) + { + throw_error( + "Not writable."); + } - if (src_size == 0) - { - return; - } + if (src_size == 0) + { + return; + } - const auto new_buffer_size = io_buffer_offset_ + src_size; + const auto new_buffer_size = io_buffer_offset_ + src_size; - io_buffer_.resize( - new_buffer_size); + io_buffer_.resize( + new_buffer_size); - std::uninitialized_copy_n( - static_cast(src_data), - src_size, - &io_buffer_[io_buffer_offset_]); + std::uninitialized_copy_n( + static_cast(src_data), + src_size, + &io_buffer_[io_buffer_offset_]); - io_buffer_offset_ = new_buffer_size; + io_buffer_offset_ = new_buffer_size; } bool SavedGame::is_write_failed() const { - return is_write_failed_; + return is_write_failed_; } void SavedGame::skip( - int count) -{ - if (!is_readable_ && !is_writable_) - { - throw_error( - "Not open or created."); - } - - if (count < 0) - { - throw_error( - "Negative count."); - } - - if (count == 0) - { - return; - } - - const auto new_offset = io_buffer_offset_ + count; - const auto buffer_size = io_buffer_.size(); - - if (new_offset > buffer_size) - { - if (is_readable_) - { - throw_error( - "Not enough data."); - } - else if (is_writable_) - { - if (new_offset > buffer_size) - { - io_buffer_.resize( - new_offset); - } - } - } - - io_buffer_offset_ = new_offset; + int count) +{ + if (!is_readable_ && !is_writable_) + { + throw_error( + "Not open or created."); + } + + if (count < 0) + { + throw_error( + "Negative count."); + } + + if (count == 0) + { + return; + } + + const auto new_offset = io_buffer_offset_ + count; + const auto buffer_size = io_buffer_.size(); + + if (new_offset > buffer_size) + { + if (is_readable_) + { + throw_error( + "Not enough data."); + } + else if (is_writable_) + { + if (new_offset > buffer_size) + { + io_buffer_.resize( + new_offset); + } + } + } + + io_buffer_offset_ = new_offset; } void SavedGame::save_buffer() { - saved_io_buffer_ = io_buffer_; - saved_io_buffer_offset_ = io_buffer_offset_; + saved_io_buffer_ = io_buffer_; + saved_io_buffer_offset_ = io_buffer_offset_; } void SavedGame::load_buffer() { - io_buffer_ = saved_io_buffer_; - io_buffer_offset_ = saved_io_buffer_offset_; + io_buffer_ = saved_io_buffer_; + io_buffer_offset_ = saved_io_buffer_offset_; } const void* SavedGame::get_buffer_data() const { - return io_buffer_.data(); + return io_buffer_.data(); } int SavedGame::get_buffer_size() const { - return static_cast(io_buffer_.size()); + return static_cast(io_buffer_.size()); } void SavedGame::rename( - const std::string& old_base_file_name, - const std::string& new_base_file_name) + const std::string& old_base_file_name, + const std::string& new_base_file_name) { - const auto&& old_path = generate_path( - old_base_file_name); + const auto&& old_path = generate_path( + old_base_file_name); - const auto&& new_path = generate_path( - new_base_file_name); + const auto&& new_path = generate_path( + new_base_file_name); - const auto rename_result = ::FS_MoveUserGenFile( - old_path.c_str(), - new_path.c_str()); + const auto rename_result = ::FS_MoveUserGenFile( + old_path.c_str(), + new_path.c_str()); - if (rename_result == 0) - { - ::Com_Printf( - S_COLOR_RED "Error during savegame-rename." - " Check \"%s\" for write-protect or disk full!\n", - new_path.c_str()); - } + if (rename_result == 0) + { + ::Com_Printf( + S_COLOR_RED "Error during savegame-rename." + " Check \"%s\" for write-protect or disk full!\n", + new_path.c_str()); + } } void SavedGame::remove( - const std::string& base_file_name) + const std::string& base_file_name) { - const auto&& path = generate_path( - base_file_name); + const auto&& path = generate_path( + base_file_name); - ::FS_DeleteUserGenFile( - path.c_str()); + ::FS_DeleteUserGenFile( + path.c_str()); } SavedGame& SavedGame::get_instance() { - static SavedGame result; - return result; + static SavedGame result; + return result; } void SavedGame::allow_read_overflow( - bool value) + bool value) { - is_read_overflow_allowed_ = value; + is_read_overflow_allowed_ = value; } void SavedGame::throw_error( - const char* message) + const char* message) { - throw SavedGameException( - message); + throw SavedGameException( + message); } void SavedGame::throw_error( - const std::string& message) + const std::string& message) { - throw SavedGameException( - message); + throw SavedGameException( + message); } void SavedGame::compress( - const Buffer& src_buffer, - Buffer& dst_buffer) -{ - const auto src_size = static_cast(src_buffer.size()); - - dst_buffer.resize(2 * src_size); - - auto src_count = 0; - auto dst_index = 0; - - while (src_count < src_size) - { - auto src_index = src_count; - auto b = src_buffer[src_index++]; - - while (src_index < src_size && - (src_index - src_count) < 127 && - src_buffer[src_index] == b) - { - src_index += 1; - } - - if ((src_index - src_count) == 1) - { - while (src_index < src_size && - (src_index - src_count) < 127 && ( - src_buffer[src_index] != src_buffer[src_index - 1] || ( - src_index > 1 && - src_buffer[src_index] != src_buffer[src_index - 2]))) - { - src_index += 1; - } - - while (src_index < src_size && - src_buffer[src_index] == src_buffer[src_index - 1]) - { - src_index -= 1; - } - - dst_buffer[dst_index++] = - static_cast(src_count - src_index); - - for (auto i = src_count; i < src_index; ++i) - { - dst_buffer[dst_index++] = src_buffer[i]; - } - } - else - { - dst_buffer[dst_index++] = - static_cast(src_index - src_count); - - dst_buffer[dst_index++] = b; - } - - src_count = src_index; - } - - dst_buffer.resize( - dst_index); + const Buffer& src_buffer, + Buffer& dst_buffer) +{ + const auto src_size = static_cast(src_buffer.size()); + + dst_buffer.resize(2 * src_size); + + auto src_count = 0; + auto dst_index = 0; + + while (src_count < src_size) + { + auto src_index = src_count; + auto b = src_buffer[src_index++]; + + while (src_index < src_size && + (src_index - src_count) < 127 && + src_buffer[src_index] == b) + { + src_index += 1; + } + + if ((src_index - src_count) == 1) + { + while (src_index < src_size && + (src_index - src_count) < 127 && ( + src_buffer[src_index] != src_buffer[src_index - 1] || ( + src_index > 1 && + src_buffer[src_index] != src_buffer[src_index - 2]))) + { + src_index += 1; + } + + while (src_index < src_size && + src_buffer[src_index] == src_buffer[src_index - 1]) + { + src_index -= 1; + } + + dst_buffer[dst_index++] = + static_cast(src_count - src_index); + + for (auto i = src_count; i < src_index; ++i) + { + dst_buffer[dst_index++] = src_buffer[i]; + } + } + else + { + dst_buffer[dst_index++] = + static_cast(src_index - src_count); + + dst_buffer[dst_index++] = b; + } + + src_count = src_index; + } + + dst_buffer.resize( + dst_index); } void SavedGame::decompress( - const Buffer& src_buffer, - Buffer& dst_buffer) + const Buffer& src_buffer, + Buffer& dst_buffer) { - auto src_index = 0; - auto dst_index = 0; + auto src_index = 0; + auto dst_index = 0; - auto remain_size = static_cast(dst_buffer.size()); + auto remain_size = static_cast(dst_buffer.size()); - while (remain_size > 0) - { - auto count = static_cast(src_buffer[src_index++]); + while (remain_size > 0) + { + auto count = static_cast(src_buffer[src_index++]); - if (count > 0) - { - std::uninitialized_fill_n( - &dst_buffer[dst_index], - count, - src_buffer[src_index++]); - } - else - { - if (count < 0) - { - count = -count; + if (count > 0) + { + std::uninitialized_fill_n( + &dst_buffer[dst_index], + count, + src_buffer[src_index++]); + } + else + { + if (count < 0) + { + count = -count; - std::uninitialized_copy_n( - &src_buffer[src_index], - count, - &dst_buffer[dst_index]); + std::uninitialized_copy_n( + &src_buffer[src_index], + count, + &dst_buffer[dst_index]); - src_index += count; - } - } + src_index += count; + } + } - dst_index += count; - remain_size -= count; - } + dst_index += count; + remain_size -= count; + } } std::string SavedGame::generate_path( - const std::string& base_file_name) + const std::string& base_file_name) { - auto normalized_file_name = base_file_name; + auto normalized_file_name = base_file_name; - std::replace( - normalized_file_name.begin(), - normalized_file_name.end(), - '/', - '_'); + std::replace( + normalized_file_name.begin(), + normalized_file_name.end(), + '/', + '_'); - auto&& path = "saves/" + normalized_file_name + ".sav"; + auto&& path = "saves/" + normalized_file_name + ".sav"; - return path; + return path; } std::string SavedGame::get_chunk_id_string( - uint32_t chunk_id) + uint32_t chunk_id) { - std::string result(4, '\0'); + std::string result(4, '\0'); - result[0] = static_cast((chunk_id >> 24) & 0xFF); - result[1] = static_cast((chunk_id >> 16) & 0xFF); - result[2] = static_cast((chunk_id >> 8) & 0xFF); - result[3] = static_cast((chunk_id >> 0) & 0xFF); + result[0] = static_cast((chunk_id >> 24) & 0xFF); + result[1] = static_cast((chunk_id >> 16) & 0xFF); + result[2] = static_cast((chunk_id >> 8) & 0xFF); + result[3] = static_cast((chunk_id >> 0) & 0xFF); - return result; + return result; } void SavedGame::reset_buffer() { - io_buffer_.clear(); - reset_buffer_offset(); + io_buffer_.clear(); + reset_buffer_offset(); } void SavedGame::reset_buffer_offset() { - io_buffer_offset_ = 0; + io_buffer_offset_ = 0; } constexpr uint32_t SavedGame::get_jo_magic_value() { - return 0x1234ABCD; + return 0x1234ABCD; } diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game.h index 8b5a9b63c8..6e874a4eb7 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game.h @@ -19,193 +19,193 @@ namespace ojk class SavedGame : - public ISavedGame + public ISavedGame { public: - using ChunkId = uint32_t; + using ChunkId = uint32_t; - SavedGame(); + SavedGame(); - SavedGame( - const SavedGame& that) = delete; + SavedGame( + const SavedGame& that) = delete; - SavedGame& operator=( - const SavedGame& that) = delete; + SavedGame& operator=( + const SavedGame& that) = delete; - virtual ~SavedGame(); + virtual ~SavedGame(); - // Creates a new saved game file for writing. - bool create( - const std::string& base_file_name); + // Creates a new saved game file for writing. + bool create( + const std::string& base_file_name); - // Opens an existing saved game file for reading. - bool open( - const std::string& base_file_name); + // Opens an existing saved game file for reading. + bool open( + const std::string& base_file_name); - // Closes the current saved game file. - void close(); + // Closes the current saved game file. + void close(); - // Returns true if the saved game opened for reading. - bool is_readable() const override; + // Returns true if the saved game opened for reading. + bool is_readable() const override; - // Returns true if the saved game opened for writing. - bool is_writable() const override; + // Returns true if the saved game opened for writing. + bool is_writable() const override; - // Reads a chunk from the file into the internal buffer. - void read_chunk( - const ChunkId chunk_id) override; + // Reads a chunk from the file into the internal buffer. + void read_chunk( + const ChunkId chunk_id) override; - using ISavedGame::read_chunk; + using ISavedGame::read_chunk; - // Returns true if all data read from the internal buffer. - bool is_all_data_read() const override; + // Returns true if all data read from the internal buffer. + bool is_all_data_read() const override; - // Throws an exception if all data not read. - void ensure_all_data_read() const override; + // Throws an exception if all data not read. + void ensure_all_data_read() const override; - // Writes a chunk into the file from the internal buffer. - void write_chunk( - const ChunkId chunk_id) override; + // Writes a chunk into the file from the internal buffer. + void write_chunk( + const ChunkId chunk_id) override; - using ISavedGame::write_chunk; + using ISavedGame::write_chunk; - // Reads a raw data from the internal buffer. - void raw_read( - void* dst_data, - int dst_size) override; + // Reads a raw data from the internal buffer. + void raw_read( + void* dst_data, + int dst_size) override; - using ISavedGame::read; + using ISavedGame::read; - // Writes a raw data into the internal buffer. - void raw_write( - const void* src_data, - int src_size) override; + // Writes a raw data into the internal buffer. + void raw_write( + const void* src_data, + int src_size) override; - using ISavedGame::write; + using ISavedGame::write; - bool is_write_failed() const; + bool is_write_failed() const; - // Increments buffer's offset by the specified non-negative count. - void skip( - int count) override; + // Increments buffer's offset by the specified non-negative count. + void skip( + int count) override; - // Stores current I/O buffer and it's position. - void save_buffer() override; + // Stores current I/O buffer and it's position. + void save_buffer() override; - // Restores saved I/O buffer and it's position. - void load_buffer() override; + // Restores saved I/O buffer and it's position. + void load_buffer() override; - // Returns a pointer to data in the I/O buffer. - const void* get_buffer_data() const override; + // Returns a pointer to data in the I/O buffer. + const void* get_buffer_data() const override; - // Returns a current size of the I/O buffer. - int get_buffer_size() const override; + // Returns a current size of the I/O buffer. + int get_buffer_size() const override; - // Clears buffer and resets it's offset to the beginning. - void reset_buffer() override; + // Clears buffer and resets it's offset to the beginning. + void reset_buffer() override; - // Resets buffer offset to the beginning. - void reset_buffer_offset() override; + // Resets buffer offset to the beginning. + void reset_buffer_offset() override; - // Renames a saved game file. - static void rename( - const std::string& old_base_file_name, - const std::string& new_base_file_name); + // Renames a saved game file. + static void rename( + const std::string& old_base_file_name, + const std::string& new_base_file_name); - // Remove a saved game file. - static void remove( - const std::string& base_file_name); + // Remove a saved game file. + static void remove( + const std::string& base_file_name); - // Returns a default instance of the class. - static SavedGame& get_instance(); + // Returns a default instance of the class. + static SavedGame& get_instance(); protected: - // If true won't throw an exception when buffer offset is beyond it's size. - // Although, no data will be read beyond the buffer. - void allow_read_overflow( - bool value) override; + // If true won't throw an exception when buffer offset is beyond it's size. + // Although, no data will be read beyond the buffer. + void allow_read_overflow( + bool value) override; private: - using Buffer = std::vector; - using BufferOffset = Buffer::size_type; - using Paths = std::vector; + using Buffer = std::vector; + using BufferOffset = Buffer::size_type; + using Paths = std::vector; - // A handle to a file. - int32_t file_handle_; + // A handle to a file. + int32_t file_handle_; - // I/O buffer. - Buffer io_buffer_; + // I/O buffer. + Buffer io_buffer_; - // Saved copy of the I/O buffer. - Buffer saved_io_buffer_; + // Saved copy of the I/O buffer. + Buffer saved_io_buffer_; - // A current offset inside the I/O buffer. - BufferOffset io_buffer_offset_; + // A current offset inside the I/O buffer. + BufferOffset io_buffer_offset_; - // Saved I/O buffer offset. - BufferOffset saved_io_buffer_offset_; + // Saved I/O buffer offset. + BufferOffset saved_io_buffer_offset_; - // RLE codec buffer. - Buffer rle_buffer_; + // RLE codec buffer. + Buffer rle_buffer_; - // True if saved game opened for reading. - bool is_readable_; + // True if saved game opened for reading. + bool is_readable_; - // True if saved game opened for writing. - bool is_writable_; + // True if saved game opened for writing. + bool is_writable_; - // True if any previous write operation failed. - bool is_write_failed_; + // True if any previous write operation failed. + bool is_write_failed_; - // Controls exception throw on read overflow. - bool is_read_overflow_allowed_; + // Controls exception throw on read overflow. + bool is_read_overflow_allowed_; - // Throws an exception. - static void throw_error( - const char* message); + // Throws an exception. + static void throw_error( + const char* message); - // Throws an exception. - static void throw_error( - const std::string& message); + // Throws an exception. + static void throw_error( + const std::string& message); - // Compresses data. - static void compress( - const Buffer& src_buffer, - Buffer& dst_buffer); + // Compresses data. + static void compress( + const Buffer& src_buffer, + Buffer& dst_buffer); - // Decompresses data. - static void decompress( - const Buffer& src_buffer, - Buffer& dst_buffer); + // Decompresses data. + static void decompress( + const Buffer& src_buffer, + Buffer& dst_buffer); - static std::string generate_path( - const std::string& base_file_name); + static std::string generate_path( + const std::string& base_file_name); - // Returns a string representation of a chunk id. - static std::string get_chunk_id_string( - uint32_t chunk_id); + // Returns a string representation of a chunk id. + static std::string get_chunk_id_string( + uint32_t chunk_id); - static constexpr uint32_t get_jo_magic_value(); + static constexpr uint32_t get_jo_magic_value(); }; // SavedGame From 08897b11ca5071b54ffd0608c34e1dada96fbcb4 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Mon, 1 Aug 2016 20:32:53 +0300 Subject: [PATCH 283/445] JO: Fix write_chunk --- shared/qcommon/ojk_saved_game.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index c4a270f9d6..a5a97486b1 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -356,13 +356,6 @@ void SavedGame::write_chunk( static_cast(sizeof(chunk_id)), file_handle_); -#ifndef JK2_MODE - uiSaved += ::FS_Write( - &uiCksum, - static_cast(sizeof(uiCksum)), - file_handle_); -#endif // !JK2_MODE - auto iCompressedLength = -1; if (::sv_compress_saved_games->integer != 0) From f0f4722cac99fed31ab9d52d7e87fd06aa561618 Mon Sep 17 00:00:00 2001 From: Rostyslav Date: Mon, 1 Aug 2016 12:54:16 +0300 Subject: [PATCH 284/445] Refactor byte order utilities * Reduce code duplication by moving byte order utilities to `shared/` folder * Rewrite byte order utilities to use compiler builtins where possible for maximum performance. * Declare byte order utilities as `static inline`. * Use platform-independent types for byte order functions. * Remove commented-out code. --- code/qcommon/q_shared.cpp | 123 ----------------------------- code/qcommon/q_shared.h | 18 ----- codemp/qcommon/q_shared.c | 151 ------------------------------------ codemp/qcommon/q_shared.h | 19 ----- shared/qcommon/q_platform.h | 75 ++++++++++++++++-- 5 files changed, 68 insertions(+), 318 deletions(-) diff --git a/code/qcommon/q_shared.cpp b/code/qcommon/q_shared.cpp index 134f3363e2..3bbadbca11 100644 --- a/code/qcommon/q_shared.cpp +++ b/code/qcommon/q_shared.cpp @@ -164,129 +164,6 @@ void COM_DefaultExtension( char *path, int maxSize, const char *extension ) Q_strcat(path, maxSize, extension); } -/* -============================================================================ - - BYTE ORDER FUNCTIONS - -============================================================================ -*/ -/* -// can't just use function pointers, or dll linkage can -// mess up when qcommon is included in multiple places -static short (*_BigShort) (short l); -static short (*_LittleShort) (short l); -static int (*_BigLong) (int l); -static int (*_LittleLong) (int l); -static float (*_BigFloat) (const float *l); -static float (*_LittleFloat) (const float *l); - -short BigShort(short l){return _BigShort(l);} -short LittleShort(short l) {return _LittleShort(l);} -int BigLong (int l) {return _BigLong(l);} -int LittleLong (int l) {return _LittleLong(l);} -float BigFloat (const float *l) {return _BigFloat(l);} -float LittleFloat (const float *l) {return _LittleFloat(l);} -*/ - -void CopyShortSwap( void *dest, void *src ) -{ - byte *to = (byte *)dest, *from = (byte *)src; - - to[0] = from[1]; - to[1] = from[0]; -} - -void CopyLongSwap( void *dest, void *src ) -{ - byte *to = (byte *)dest, *from = (byte *)src; - - to[0] = from[3]; - to[1] = from[2]; - to[2] = from[1]; - to[3] = from[0]; -} - -short ShortSwap (short l) -{ - byte b1,b2; - - b1 = l&255; - b2 = (l>>8)&255; - - return (b1<<8) + b2; -} - -short ShortNoSwap (short l) -{ - return l; -} - -int LongSwap (int l) -{ - byte b1,b2,b3,b4; - - b1 = l&255; - b2 = (l>>8)&255; - b3 = (l>>16)&255; - b4 = (l>>24)&255; - - return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; -} - -int LongNoSwap (int l) -{ - return l; -} - -float FloatSwap (const float *f) { - byteAlias_t out; - - out.f = *f; - out.ui = LongSwap(out.ui); - - return out.f; -} - -float FloatNoSwap (const float *f) -{ - return *f; -} - -/* -================ -Swap_Init -================ -*/ -/* -void Swap_Init (void) -{ - byte swaptest[2] = {1,0}; - -// set the byte swapping variables in a portable manner - if ( *(short *)swaptest == 1) - { - _BigShort = ShortSwap; - _LittleShort = ShortNoSwap; - _BigLong = LongSwap; - _LittleLong = LongNoSwap; - _BigFloat = FloatSwap; - _LittleFloat = FloatNoSwap; - } - else - { - _BigShort = ShortNoSwap; - _LittleShort = ShortSwap; - _BigLong = LongNoSwap; - _LittleLong = LongSwap; - _BigFloat = FloatNoSwap; - _LittleFloat = FloatSwap; - } - -} -*/ - - /* ============================================================================ diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index e01f657b9e..a7e3899a32 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -153,10 +153,6 @@ along with this program; if not, see . #define idppc 0 #endif -short ShortSwap( short l ); -int LongSwap( int l ); -float FloatSwap( const float *f ); - #include "qcommon/q_platform.h" @@ -1090,20 +1086,6 @@ void Q_strstrip( char *string, const char *strip, const char *repl ); const char *Q_strchrs( const char *string, const char *search ); //============================================= -//============================================= -/* -short BigShort(short l); -short LittleShort(short l); -int BigLong (int l); -int LittleLong (int l); -qint64 BigLong64 (qint64 l); -qint64 LittleLong64 (qint64 l); -float BigFloat (const float *l); -float LittleFloat (const float *l); - -void Swap_Init (void); -*/ - char * QDECL va(const char *format, ...); #define TRUNCATE_LENGTH 64 diff --git a/codemp/qcommon/q_shared.c b/codemp/qcommon/q_shared.c index fcee0bdc2a..e71c141919 100644 --- a/codemp/qcommon/q_shared.c +++ b/codemp/qcommon/q_shared.c @@ -207,157 +207,6 @@ void COM_DefaultExtension( char *path, int maxSize, const char *extension ) Q_strcat(path, maxSize, extension); } -/* -============================================================================ - - BYTE ORDER FUNCTIONS - -============================================================================ -*/ -/* -// can't just use function pointers, or dll linkage can -// mess up when qcommon is included in multiple places -static short (*_BigShort) (short l); -static short (*_LittleShort) (short l); -static int (*_BigLong) (int l); -static int (*_LittleLong) (int l); -static qint64 (*_BigLong64) (qint64 l); -static qint64 (*_LittleLong64) (qint64 l); -static float (*_BigFloat) (const float *l); -static float (*_LittleFloat) (const float *l); - -short BigShort(short l){return _BigShort(l);} -short LittleShort(short l) {return _LittleShort(l);} -int BigLong (int l) {return _BigLong(l);} -int LittleLong (int l) {return _LittleLong(l);} -qint64 BigLong64 (qint64 l) {return _BigLong64(l);} -qint64 LittleLong64 (qint64 l) {return _LittleLong64(l);} -float BigFloat (const float *l) {return _BigFloat(l);} -float LittleFloat (const float *l) {return _LittleFloat(l);} -*/ - -void CopyShortSwap( void *dest, void *src ) -{ - byte *to = (byte *)dest, *from = (byte *)src; - - to[0] = from[1]; - to[1] = from[0]; -} - -void CopyLongSwap( void *dest, void *src ) -{ - byte *to = (byte *)dest, *from = (byte *)src; - - to[0] = from[3]; - to[1] = from[2]; - to[2] = from[1]; - to[3] = from[0]; -} - -short ShortSwap (short l) -{ - byte b1,b2; - - b1 = l&255; - b2 = (l>>8)&255; - - return (b1<<8) + b2; -} - -short ShortNoSwap (short l) -{ - return l; -} - -int LongSwap (int l) -{ - byte b1,b2,b3,b4; - - b1 = l&255; - b2 = (l>>8)&255; - b3 = (l>>16)&255; - b4 = (l>>24)&255; - - return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; -} - -int LongNoSwap (int l) -{ - return l; -} - -qint64 Long64Swap (qint64 ll) -{ - qint64 result; - - result.b0 = ll.b7; - result.b1 = ll.b6; - result.b2 = ll.b5; - result.b3 = ll.b4; - result.b4 = ll.b3; - result.b5 = ll.b2; - result.b6 = ll.b1; - result.b7 = ll.b0; - - return result; -} - -qint64 Long64NoSwap (qint64 ll) -{ - return ll; -} - -float FloatSwap (const float *f) { - byteAlias_t out; - - out.f = *f; - out.ui = LongSwap(out.ui); - - return out.f; -} - -float FloatNoSwap (const float *f) -{ - return *f; -} - -/* -================ -Swap_Init -================ -*/ -/* -void Swap_Init (void) -{ - byte swaptest[2] = {1,0}; - -// set the byte swapping variables in a portable manner - if ( *(short *)swaptest == 1) - { - _BigShort = ShortSwap; - _LittleShort = ShortNoSwap; - _BigLong = LongSwap; - _LittleLong = LongNoSwap; - _BigLong64 = Long64Swap; - _LittleLong64 = Long64NoSwap; - _BigFloat = FloatSwap; - _LittleFloat = FloatNoSwap; - } - else - { - _BigShort = ShortNoSwap; - _LittleShort = ShortSwap; - _BigLong = LongNoSwap; - _LittleLong = LongSwap; - _BigLong64 = Long64NoSwap; - _LittleLong64 = Long64Swap; - _BigFloat = FloatNoSwap; - _LittleFloat = FloatSwap; - } - -} -*/ - /* ============================================================================ diff --git a/codemp/qcommon/q_shared.h b/codemp/qcommon/q_shared.h index 835887d705..6f1cf3c55e 100644 --- a/codemp/qcommon/q_shared.h +++ b/codemp/qcommon/q_shared.h @@ -146,11 +146,6 @@ along with this program; if not, see . #define idppc 0 #endif -short ShortSwap( short l ); -int LongSwap( int l ); -float FloatSwap( const float *f ); - - #include "qcommon/q_platform.h" // ================================================================ @@ -1122,20 +1117,6 @@ typedef struct qint64_s { byte b7; } qint64; -//============================================= -/* -short BigShort(short l); -short LittleShort(short l); -int BigLong (int l); -int LittleLong (int l); -qint64 BigLong64 (qint64 l); -qint64 LittleLong64 (qint64 l); -float BigFloat (const float *l); -float LittleFloat (const float *l); - -void Swap_Init (void); -*/ - int FloatAsInt( float f ); char * QDECL va(const char *format, ...); diff --git a/shared/qcommon/q_platform.h b/shared/qcommon/q_platform.h index b2f03d9623..4f8ab6f7cb 100644 --- a/shared/qcommon/q_platform.h +++ b/shared/qcommon/q_platform.h @@ -227,11 +227,72 @@ along with this program; if not, see . #endif // endianness -void CopyShortSwap( void *dest, void *src ); -void CopyLongSwap( void *dest, void *src ); -short ShortSwap( short l ); -int LongSwap( int l ); -float FloatSwap( const float *f ); +// Use compiler builtins where possible for maximum performance +#include +#if !defined(__clang__) && (defined(__GNUC__) || defined(__GNUG__)) + +// gcc + +static inline uint16_t ShortSwap(uint16_t v) +{ + return __builtin_bswap16(v); +} + +static inline uint32_t LongSwap(uint32_t v) +{ + return __builtin_bswap32(v); +} +#elif defined(_MSC_VER) +// MSVC + +// required for _byteswap_ushort/ulong +#include + +static inline uint16_t ShortSwap(uint16_t v) +{ + return _byteswap_ushort(v); +} + +static inline uint32_t LongSwap(uint32_t v) +{ + return _byteswap_ulong(v); +} + +#else +// clang and others +// TODO: investigate about clang bulitins (if they exist) + +static inline uint16_t ShortSwap(uint16_t v) +{ + return ((v & 0x00FF) << 8) | + ((v & 0xFF00) >> 8); +} + +static inline uint32_t LongSwap(uint32_t v) +{ + return ((v & 0x000000FF) << 24) | + ((v & 0x0000FF00) << 8) | + ((v & 0x00FF0000) >> 8) | + ((v & 0xFF000000) >> 24); +} +#endif + +static inline void CopyShortSwap( void *dest, const void *src ) +{ + *(uint16_t*)dest = ShortSwap(*(uint16_t*)src); +} + +static inline void CopyLongSwap( void *dest, const void *src ) +{ + *(uint32_t*)dest = LongSwap(*(uint32_t*)src); +} + +static inline float FloatSwap(float f) +{ + float out; + CopyLongSwap(&out, &f); + return out; +} #if defined(Q3_BIG_ENDIAN) && defined(Q3_LITTLE_ENDIAN) #error "Endianness defined as both big and little" @@ -240,7 +301,7 @@ float FloatSwap( const float *f ); #define CopyLittleLong( dest, src ) CopyLongSwap( dest, src ) #define LittleShort( x ) ShortSwap( x ) #define LittleLong( x ) LongSwap( x ) - #define LittleFloat( x ) FloatSwap( &x ) + #define LittleFloat( x ) FloatSwap( x ) #define BigShort #define BigLong #define BigFloat @@ -252,7 +313,7 @@ float FloatSwap( const float *f ); #define LittleFloat #define BigShort( x ) ShortSwap( x ) #define BigLong( x ) LongSwap( x ) - #define BigFloat( x ) FloatSwap( &x ) + #define BigFloat( x ) FloatSwap( x ) #else #error "Endianness not defined" #endif From ea58b07d735f0b6e9fa406271e0e41a563fda314 Mon Sep 17 00:00:00 2001 From: Rostyslav Date: Wed, 3 Aug 2016 11:17:14 +0300 Subject: [PATCH 285/445] Fix byte order utils for gcc < 4.8 --- shared/qcommon/q_platform.h | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/shared/qcommon/q_platform.h b/shared/qcommon/q_platform.h index 4f8ab6f7cb..d44afa50dd 100644 --- a/shared/qcommon/q_platform.h +++ b/shared/qcommon/q_platform.h @@ -229,13 +229,17 @@ along with this program; if not, see . // endianness // Use compiler builtins where possible for maximum performance #include -#if !defined(__clang__) && (defined(__GNUC__) || defined(__GNUG__)) - -// gcc +#if !defined(__clang__) && (defined(__GNUC__) || defined(__GNUG__)) \ + && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 403) +// gcc >= 4.3 static inline uint16_t ShortSwap(uint16_t v) { +#if __GNUC_MINOR__ >= 8 return __builtin_bswap16(v); +#else + return (v << 8) | (v >> 8); +#endif // gcc >= 4.8 } static inline uint32_t LongSwap(uint32_t v) @@ -259,13 +263,11 @@ static inline uint32_t LongSwap(uint32_t v) } #else -// clang and others -// TODO: investigate about clang bulitins (if they exist) +// clang, gcc < 4.3 and others static inline uint16_t ShortSwap(uint16_t v) { - return ((v & 0x00FF) << 8) | - ((v & 0xFF00) >> 8); + return (v << 8) | (v >> 8); } static inline uint32_t LongSwap(uint32_t v) From 5c8a2d7ad9d53e5886436b50628c258a5b48bda5 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Thu, 4 Aug 2016 13:19:14 +0100 Subject: [PATCH 286/445] Move math functions into shared/qcommon This commit also fixes #753, by accident more than anything else. --- CMakeLists.txt | 4 + code/cgame/FxScheduler.cpp | 2 +- code/cgame/cg_camera.cpp | 12 +- code/cgame/cg_credits.cpp | 8 +- code/cgame/cg_draw.cpp | 2 +- code/cgame/cg_main.cpp | 2 +- code/cgame/cg_players.cpp | 15 +- code/cgame/cg_predict.cpp | 4 +- code/cgame/cg_syscalls.cpp | 14 +- code/cgame/cg_text.cpp | 4 +- code/cgame/cg_view.cpp | 11 +- code/cgame/cg_weapons.cpp | 4 +- code/client/cl_cgame.cpp | 10 +- code/client/cl_cin.cpp | 22 +- code/client/cl_keys.cpp | 12 +- code/client/cl_mp3.cpp | 6 +- code/client/cl_mp3.h | 2 +- code/client/cl_ui.cpp | 2 +- code/client/snd_dma.cpp | 36 +- code/client/snd_mem.cpp | 6 +- code/client/snd_music.cpp | 20 +- code/game/AI_Default.cpp | 11 +- code/game/AI_GalakMech.cpp | 2 +- code/game/AI_HazardTrooper.cpp | 2 +- code/game/AI_Howler.cpp | 4 +- code/game/AI_Jedi.cpp | 4 +- code/game/AI_MineMonster.cpp | 2 +- code/game/AI_Rancor.cpp | 6 +- code/game/AI_Stormtrooper.cpp | 4 +- code/game/AI_Tusken.cpp | 8 +- code/game/AI_Utils.cpp | 2 +- code/game/AI_Wampa.cpp | 8 +- code/game/FighterNPC.cpp | 6 +- code/game/G_Timer.cpp | 4 +- code/game/NPC_behavior.cpp | 6 +- code/game/NPC_combat.cpp | 2 +- code/game/NPC_goal.cpp | 2 +- code/game/NPC_move.cpp | 4 +- code/game/NPC_reactions.cpp | 2 +- code/game/NPC_senses.cpp | 6 +- code/game/NPC_spawn.cpp | 2 +- code/game/Q3_Interface.cpp | 30 +- code/game/b_local.h | 4 +- code/game/bg_panimate.cpp | 4 +- code/game/bg_pmove.cpp | 2 +- code/game/bg_slidemove.cpp | 2 +- code/game/g_active.cpp | 10 +- code/game/g_client.cpp | 4 +- code/game/g_cmds.cpp | 2 +- code/game/g_combat.cpp | 27 +- code/game/g_main.cpp | 4 +- code/game/g_misc.cpp | 2 +- code/game/g_missile.cpp | 6 +- code/game/g_mover.cpp | 2 +- code/game/g_navigator.cpp | 6 +- code/game/g_navnew.cpp | 4 +- code/game/g_object.cpp | 2 +- code/game/g_roff.cpp | 2 +- code/game/g_savegame.cpp | 4 +- code/game/g_session.cpp | 2 +- code/game/g_svcmds.cpp | 4 +- code/game/g_target.cpp | 2 +- code/game/g_turret.cpp | 2 +- code/game/g_vehicles.cpp | 2 +- code/game/g_weapon.cpp | 2 +- code/game/wp_concussion.cpp | 2 +- code/game/wp_saber.cpp | 10 +- code/game/wp_saber.h | 2 +- code/game/wp_thermal.cpp | 2 +- code/qcommon/cm_patch.cpp | 36 +- code/qcommon/common.cpp | 2 +- code/qcommon/files.cpp | 2 +- code/qcommon/net_chan.cpp | 2 +- code/qcommon/q_math.cpp | 919 ------------------ code/qcommon/q_shared.h | 656 +------------ code/qcommon/safe/memory.h | 2 +- code/qcommon/tri_coll_test.cpp | 10 +- code/qcommon/z_memman_pc.cpp | 2 +- code/rd-common/tr_public.h | 2 +- code/rd-vanilla/G2_API.cpp | 2 +- code/rd-vanilla/G2_bones.cpp | 2 +- code/rd-vanilla/tr_WorldEffects.cpp | 2 +- code/rd-vanilla/tr_bsp.cpp | 9 +- code/rd-vanilla/tr_ghoul2.cpp | 4 +- code/rd-vanilla/tr_image.cpp | 4 +- code/rd-vanilla/tr_light.cpp | 2 +- code/rd-vanilla/tr_mesh.cpp | 2 +- code/rd-vanilla/tr_model.cpp | 8 +- code/rd-vanilla/tr_quicksprite.cpp | 4 +- code/rd-vanilla/tr_shader.cpp | 25 +- code/rd-vanilla/tr_skin.cpp | 2 +- code/rd-vanilla/tr_sky.cpp | 2 +- code/server/sv_game.cpp | 6 +- code/server/sv_savegame.cpp | 8 +- code/server/sv_snapshot.cpp | 2 +- code/server/sv_world.cpp | 5 +- code/ui/ui_main.cpp | 10 +- code/ui/ui_shared.cpp | 24 +- codemp/cgame/cg_main.c | 84 -- codemp/game/g_utils.c | 8 - codemp/game/w_saber.c | 9 - codemp/qcommon/q_math.c | 1320 -------------------------- codemp/qcommon/q_shared.h | 446 +-------- codemp/rd-vanilla/G2_misc.cpp | 2 +- shared/qcommon/q_color.c | 157 ++++ shared/qcommon/q_color.h | 153 +++ shared/qcommon/q_math_common.c | 1337 +++++++++++++++++++++++++++ shared/qcommon/q_math_common.h | 280 ++++++ shared/qcommon/q_platform.h | 35 + 109 files changed, 2298 insertions(+), 3721 deletions(-) create mode 100644 shared/qcommon/q_color.c create mode 100644 shared/qcommon/q_color.h create mode 100644 shared/qcommon/q_math_common.c create mode 100644 shared/qcommon/q_math_common.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ee405221b..d4a68e26b4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -306,6 +306,10 @@ endif() # Files shared across all projects set(SharedCommonFiles + "${SharedDir}/qcommon/q_color.h" + "${SharedDir}/qcommon/q_color.c" + "${SharedDir}/qcommon/q_math_common.h" + "${SharedDir}/qcommon/q_math_common.c" "${SharedDir}/qcommon/q_platform.h" ) set(SharedCommonSafeFiles diff --git a/code/cgame/FxScheduler.cpp b/code/cgame/FxScheduler.cpp index e09df30d68..29c512f792 100644 --- a/code/cgame/FxScheduler.cpp +++ b/code/cgame/FxScheduler.cpp @@ -1384,7 +1384,7 @@ void CFxScheduler::AddScheduledEffects( bool portal ) { if (cent.gent->ghoul2[(*itr)->mModelNum].mModelindex>=0) { - doesBoltExist = theFxHelper.GetOriginAxisFromBolt(cent, (*itr)->mModelNum, (*itr)->mBoltNum, origin, axis); + doesBoltExist = (qboolean)(theFxHelper.GetOriginAxisFromBolt(cent, (*itr)->mModelNum, (*itr)->mBoltNum, origin, axis) != 0); } } } diff --git a/code/cgame/cg_camera.cpp b/code/cgame/cg_camera.cpp index d186359292..6263c1548a 100644 --- a/code/cgame/cg_camera.cpp +++ b/code/cgame/cg_camera.cpp @@ -38,7 +38,7 @@ void CGCam_FollowDisable( void ); void CGCam_TrackDisable( void ); void CGCam_Distance( float distance, qboolean initLerp ); void CGCam_DistanceDisable( void ); -extern int CG_CalcFOVFromX( float fov_x ); +extern qboolean CG_CalcFOVFromX( float fov_x ); extern void WP_SaberCatch( gentity_t *self, gentity_t *saber, qboolean switchToSaber ); /* @@ -418,8 +418,8 @@ void CGCam_SetFade( vec4_t dest ) {//Instant completion client_camera.info_state &= ~CAMERA_FADING; client_camera.fade_duration = 0; - Vector4Copy( dest, client_camera.fade_source ); - Vector4Copy( dest, client_camera.fade_color ); + VectorCopy4( dest, client_camera.fade_source ); + VectorCopy4( dest, client_camera.fade_color ); } /* @@ -436,8 +436,8 @@ void CGCam_Fade( vec4_t source, vec4_t dest, float duration ) return; } - Vector4Copy( source, client_camera.fade_source ); - Vector4Copy( dest, client_camera.fade_dest ); + VectorCopy4( source, client_camera.fade_source ); + VectorCopy4( dest, client_camera.fade_dest ); client_camera.fade_duration = duration; client_camera.fade_time = cg.time; @@ -1066,7 +1066,7 @@ void CGCam_UpdateFade( void ) { if ( client_camera.fade_time + client_camera.fade_duration < cg.time ) { - Vector4Copy( client_camera.fade_dest, client_camera.fade_color ); + VectorCopy4( client_camera.fade_dest, client_camera.fade_color ); client_camera.info_state &= ~CAMERA_FADING; } else diff --git a/code/cgame/cg_credits.cpp b/code/cgame/cg_credits.cpp index 46365a2162..85b3a93c09 100644 --- a/code/cgame/cg_credits.cpp +++ b/code/cgame/cg_credits.cpp @@ -112,9 +112,9 @@ struct CreditData_t CreditCards_t CreditCards; CreditLines_t CreditLines; - bool Running(void) + qboolean Running(void) { - return !!( CreditCards.size() || CreditLines.size() ); + return (qboolean)( CreditCards.size() || CreditLines.size() ); } }; @@ -235,12 +235,12 @@ void CG_Credits_Init( const char *psStripReference, vec4_t *pv4Color) // Play the light side end credits music. if ( g_entities[0].client->sess.mission_objectives[0].status != 2 ) { - cgi_S_StartBackgroundTrack( "music/endcredits.mp3", NULL, false ); + cgi_S_StartBackgroundTrack( "music/endcredits.mp3", NULL, qfalse ); } // Play the dark side end credits music. else { - cgi_S_StartBackgroundTrack( "music/vjun3/vjun3_explore.mp3", NULL, false ); + cgi_S_StartBackgroundTrack( "music/vjun3/vjun3_explore.mp3", NULL, qfalse ); } // could make these into parameters later, but for now... diff --git a/code/cgame/cg_draw.cpp b/code/cgame/cg_draw.cpp index f36f3d485a..28b836089f 100644 --- a/code/cgame/cg_draw.cpp +++ b/code/cgame/cg_draw.cpp @@ -2161,7 +2161,7 @@ static void CG_DrawZoomMask( void ) if ( random() > 0.98f && ( cg.time & 1024 )) { - flip = !flip; + flip = (qboolean)!flip; } if ( power ) diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 92e9169536..31936c2740 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -1799,7 +1799,7 @@ void CG_StartMusic( qboolean bForceStart ) { Q_strncpyz( parm2, COM_Parse( &s ), sizeof( parm2 ) ); COM_EndParseSession(); - cgi_S_StartBackgroundTrack( parm1, parm2, !bForceStart ); + cgi_S_StartBackgroundTrack( parm1, parm2, (qboolean)!bForceStart ); } /* diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index d0514748e9..2b7bcdf9a9 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -1210,7 +1210,7 @@ static void CG_PlayerAnimEvents( int animFileIndex, qboolean torso, int oldFrame {//still in same anim, check for looping anim inSameAnim = qtrue; animation_t *animation = &level.knownAnimFileSets[animFileIndex].animations[anim]; - animBackward = (animation->frameLerp<0); + animBackward = (qboolean)(animation->frameLerp<0); if ( animation->loopFrames != -1 ) {//a looping anim! loopAnim = qtrue; @@ -1940,7 +1940,7 @@ static void CG_ATSTLegsYaw( centity_t *cent, vec3_t trailingLegsAngles ) float legAngleDiff = AngleNormalize180(ATSTLegsYaw) - AngleNormalize180(cent->pe.legs.yawAngle); int legsAnim = cent->currentState.legsAnim; - qboolean moving = (!VectorCompare(cent->gent->client->ps.velocity, vec3_origin)); + qboolean moving = (qboolean)!VectorCompare(cent->gent->client->ps.velocity, vec3_origin); if ( moving || legsAnim == BOTH_TURN_LEFT1 || legsAnim == BOTH_TURN_RIGHT1 || fabs(legAngleDiff) > 45 ) {//moving or turning or beyond the turn allowance if ( legsAnim == BOTH_STAND1 && !moving ) @@ -3540,9 +3540,9 @@ static qboolean CG_PlayerShadow( centity_t *const cent, float *const shadowPlane cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, sideOrigin ); sideOrigin[2] += 30; //fudge up a bit for coplaner - bShadowed = _PlayerShadow(sideOrigin, 0, shadowPlane, 28, cgs.media.shadowMarkShader) || bShadowed; + bShadowed = (qboolean)(_PlayerShadow(sideOrigin, 0, shadowPlane, 28, cgs.media.shadowMarkShader) || bShadowed); - bShadowed = _PlayerShadow(rootOrigin, cent->pe.legs.yawAngle, shadowPlane, 64, cgs.media.shadowMarkShader) || bShadowed; + bShadowed = (qboolean)( _PlayerShadow(rootOrigin, cent->pe.legs.yawAngle, shadowPlane, 64, cgs.media.shadowMarkShader) || bShadowed); return bShadowed; } else if ( cent->gent->client->NPC_class == CLASS_RANCOR ) @@ -6728,7 +6728,12 @@ Ghoul2 Insert End } // Pass in the renderfx flags attached to the saber weapon model...this is done so that saber glows // will get rendered properly in a mirror...not sure if this is necessary?? - CG_DoSaber( org_, axis_[0], length, client->ps.saber[saberNum].blade[bladeNum].lengthMax, client->ps.saber[saberNum].blade[bladeNum].radius, client->ps.saber[saberNum].blade[bladeNum].color, renderfx, (noDlight==qfalse) ); + CG_DoSaber( + org_, axis_[0], length, + client->ps.saber[saberNum].blade[bladeNum].lengthMax, + client->ps.saber[saberNum].blade[bladeNum].radius, + client->ps.saber[saberNum].blade[bladeNum].color, + renderfx, (qboolean)!noDlight ); } void CG_AddSaberBlade( centity_t *cent, centity_t *scent, refEntity_t *saber, int renderfx, int modelIndex, vec3_t origin, vec3_t angles ) diff --git a/code/cgame/cg_predict.cpp b/code/cgame/cg_predict.cpp index 070fa6711f..e0c57f7519 100644 --- a/code/cgame/cg_predict.cpp +++ b/code/cgame/cg_predict.cpp @@ -565,7 +565,7 @@ void CG_TouchTriggerPrediction( void ) { return; } - spectator = ( cg.predicted_player_state.pm_type == PM_SPECTATOR ); + spectator = (qboolean)( cg.predicted_player_state.pm_type == PM_SPECTATOR ); if ( cg.predicted_player_state.pm_type != PM_NORMAL && !spectator ) { return; @@ -674,7 +674,7 @@ void CG_PredictPlayerState( void ) { cg_pmove.trace = CG_Trace; cg_pmove.pointcontents = CG_PointContents; cg_pmove.tracemask = MASK_PLAYERSOLID; - cg_pmove.noFootsteps = 0;//( cgs.dmflags & DF_NO_FOOTSTEPS ) > 0; + cg_pmove.noFootsteps = qfalse;//( cgs.dmflags & DF_NO_FOOTSTEPS ) > 0; // save the state before the pmove so we can detect transitions oldPlayerState = cg.predicted_player_state; diff --git a/code/cgame/cg_syscalls.cpp b/code/cgame/cg_syscalls.cpp index 7ff27054cc..264e5c48a2 100644 --- a/code/cgame/cg_syscalls.cpp +++ b/code/cgame/cg_syscalls.cpp @@ -277,12 +277,12 @@ int cgi_R_Font_HeightPixels(const int iFontIndex, const float scale /*= 1.0f*/) qboolean cgi_Language_IsAsian( void ) { - return Q_syscall( CG_LANGUAGE_ISASIAN ); + return (qboolean)(Q_syscall( CG_LANGUAGE_ISASIAN ) != 0); } qboolean cgi_Language_UsesSpaces(void) { - return Q_syscall( CG_LANGUAGE_USESSPACES ); + return (qboolean)(Q_syscall( CG_LANGUAGE_USESSPACES ) != 0); } unsigned int cgi_AnyLanguage_ReadCharFromString( const char *psText, int *piAdvanceCount, qboolean *pbIsTrailingPunctuation /* = NULL */ ) @@ -310,7 +310,7 @@ void cgi_R_AddRefEntityToScene( const refEntity_t *re ) { qboolean cgi_R_inPVS( vec3_t p1, vec3_t p2 ) { - return Q_syscall( CG_R_INPVS, p1, p2 ); + return (qboolean)(Q_syscall( CG_R_INPVS, p1, p2 ) != 0); } @@ -389,16 +389,16 @@ void cgi_GetCurrentSnapshotNumber( int *snapshotNumber, int *serverTime ) { } qboolean cgi_GetSnapshot( int snapshotNumber, snapshot_t *snapshot ) { - return Q_syscall( CG_GETSNAPSHOT, snapshotNumber, snapshot ); + return (qboolean)(Q_syscall( CG_GETSNAPSHOT, snapshotNumber, snapshot ) != 0); } qboolean cgi_GetDefaultState(int entityIndex, entityState_t *state ) { - return Q_syscall( CG_GETDEFAULTSTATE, entityIndex, state ); + return (qboolean)(Q_syscall( CG_GETDEFAULTSTATE, entityIndex, state ) != 0); } qboolean cgi_GetServerCommand( int serverCommandNumber ) { - return Q_syscall( CG_GETSERVERCOMMAND, serverCommandNumber ); + return (qboolean)(Q_syscall( CG_GETSERVERCOMMAND, serverCommandNumber ) != 0); } int cgi_GetCurrentCmdNumber( void ) { @@ -406,7 +406,7 @@ int cgi_GetCurrentCmdNumber( void ) { } qboolean cgi_GetUserCmd( int cmdNumber, usercmd_t *ucmd ) { - return Q_syscall( CG_GETUSERCMD, cmdNumber, ucmd ); + return (qboolean)(Q_syscall( CG_GETUSERCMD, cmdNumber, ucmd ) != 0); } void cgi_SetUserCmdValue( int stateValue, float sensitivityScale, float mPitchOverride, float mYawOverride ) { diff --git a/code/cgame/cg_text.cpp b/code/cgame/cg_text.cpp index 44f3d97880..d535bcec2c 100644 --- a/code/cgame/cg_text.cpp +++ b/code/cgame/cg_text.cpp @@ -435,7 +435,7 @@ void CG_DrawCaptionText(void) if((textcolor_caption[0] == 0) && (textcolor_caption[1] == 0) && (textcolor_caption[2] == 0) && (textcolor_caption[3] == 0)) { - Vector4Copy( colorTable[CT_WHITE], textcolor_caption ); + VectorCopy4( colorTable[CT_WHITE], textcolor_caption ); } cgi_R_SetColor(textcolor_caption); @@ -733,7 +733,7 @@ void CG_DrawCenterString( void ) if((textcolor_center[0] == 0) && (textcolor_center[1] == 0) && (textcolor_center[2] == 0) && (textcolor_center[3] == 0)) { - Vector4Copy( colorTable[CT_WHITE], textcolor_center ); + VectorCopy4( colorTable[CT_WHITE], textcolor_center ); } start = cg.centerPrint; diff --git a/code/cgame/cg_view.cpp b/code/cgame/cg_view.cpp index e1960789c9..3523e64355 100644 --- a/code/cgame/cg_view.cpp +++ b/code/cgame/cg_view.cpp @@ -2087,11 +2087,12 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView ) { cg.zoomMode = 0; } // decide on third person view - cg.renderingThirdPerson = cg_thirdPerson.integer - || (cg.snap->ps.stats[STAT_HEALTH] <= 0) - || (cg.snap->ps.eFlags&EF_HELD_BY_SAND_CREATURE) - || ((g_entities[0].client&&g_entities[0].client->NPC_class==CLASS_ATST) - || (cg.snap->ps.weapon == WP_SABER || cg.snap->ps.weapon == WP_MELEE) ); + cg.renderingThirdPerson = (qboolean)( + cg_thirdPerson.integer + || (cg.snap->ps.stats[STAT_HEALTH] <= 0) + || (cg.snap->ps.eFlags&EF_HELD_BY_SAND_CREATURE) + || ((g_entities[0].client&&g_entities[0].client->NPC_class==CLASS_ATST) + || (cg.snap->ps.weapon == WP_SABER || cg.snap->ps.weapon == WP_MELEE) )); if ( cg.zoomMode ) { diff --git a/code/cgame/cg_weapons.cpp b/code/cgame/cg_weapons.cpp index 020412c72d..9f63394f9a 100644 --- a/code/cgame/cg_weapons.cpp +++ b/code/cgame/cg_weapons.cpp @@ -2993,7 +2993,7 @@ void CG_MissileHitWall( centity_t *cent, int weapon, vec3_t origin, vec3_t dir, break; case WP_EMPLACED_GUN: - FX_EmplacedHitWall( origin, dir, (cent->gent&¢->gent->alt_fire) ); + FX_EmplacedHitWall( origin, dir, (qboolean)(cent->gent&¢->gent->alt_fire) ); break; case WP_ATST_MAIN: @@ -3134,7 +3134,7 @@ void CG_MissileHitPlayer( centity_t *cent, int weapon, vec3_t origin, vec3_t dir break; case WP_EMPLACED_GUN: - FX_EmplacedHitPlayer( origin, dir, (cent->gent&¢->gent->alt_fire) ); + FX_EmplacedHitPlayer( origin, dir, (qboolean)(cent->gent&¢->gent->alt_fire) ); break; case WP_TRIP_MINE: diff --git a/code/client/cl_cgame.cpp b/code/client/cl_cgame.cpp index 35f8eb293d..70b6534353 100644 --- a/code/client/cl_cgame.cpp +++ b/code/client/cl_cgame.cpp @@ -868,7 +868,7 @@ intptr_t CL_CgameSystemCalls( intptr_t *args ) { return 0; case CG_CM_LOADMAP: - CL_CM_LoadMap( (const char *) VMA(1), args[2] ); + CL_CM_LoadMap( (const char *) VMA(1), (qboolean)(args[2] != 0) ); return 0; case CG_CM_NUMINLINEMODELS: return CM_NumInlineModels(); @@ -944,12 +944,12 @@ intptr_t CL_CgameSystemCalls( intptr_t *args ) { S_UpdateEntityPosition( args[1], (const float *) VMA(2) ); return 0; case CG_S_RESPATIALIZE: - S_Respatialize( args[1], (const float *) VMA(2), (float(*)[3]) VMA(3), args[4] ); + S_Respatialize( args[1], (const float *) VMA(2), (float(*)[3]) VMA(3), (qboolean)(args[4] != 0) ); return 0; case CG_S_REGISTERSOUND: return S_RegisterSound( (const char *) VMA(1) ); case CG_S_STARTBACKGROUNDTRACK: - S_StartBackgroundTrack( (const char *) VMA(1), (const char *) VMA(2), args[3]); + S_StartBackgroundTrack( (const char *) VMA(1), (const char *) VMA(2), (qboolean)(args[3] != 0) ); return 0; case CG_S_GETSAMPLELENGTH: return S_GetSampleLengthInMilliSeconds( args[1]); @@ -1190,7 +1190,7 @@ Ghoul2 Insert End return 0; case CG_OPENJK_MENU_PAINT: - Menu_Paint( (menuDef_t *)VMA(1), args[2] ); + Menu_Paint( (menuDef_t *)VMA(1), (qboolean)(args[2] != 0) ); return 0; case CG_OPENJK_GETMENU_BYNAME: @@ -1444,7 +1444,7 @@ qboolean CL_GameCommand( void ) { return qfalse; } - return VM_Call( CG_CONSOLE_COMMAND ); + return (qboolean)(VM_Call( CG_CONSOLE_COMMAND ) != 0); } diff --git a/code/client/cl_cin.cpp b/code/client/cl_cin.cpp index 91cc6ef856..337cc64a03 100644 --- a/code/client/cl_cin.cpp +++ b/code/client/cl_cin.cpp @@ -1162,7 +1162,7 @@ static void RoQInterrupt(void) case ZA_SOUND_MONO: if (!cinTable[currentHandle].silent) { ssize = RllDecodeMonoToStereo( framedata, sbuf, cinTable[currentHandle].RoQFrameSize, 0, (unsigned short)cinTable[currentHandle].roq_flags); - S_RawSamples( ssize, 22050, 2, 1, (byte *)sbuf, s_volume->value, 1 ); + S_RawSamples( ssize, 22050, 2, 1, (byte *)sbuf, s_volume->value, qtrue ); } break; case ZA_SOUND_STEREO: @@ -1172,7 +1172,7 @@ static void RoQInterrupt(void) s_rawend = s_soundtime; } ssize = RllDecodeStereoToStereo( framedata, sbuf, cinTable[currentHandle].RoQFrameSize, 0, (unsigned short)cinTable[currentHandle].roq_flags); - S_RawSamples( ssize, 22050, 2, 2, (byte *)sbuf, s_volume->value, 1 ); + S_RawSamples( ssize, 22050, 2, 2, (byte *)sbuf, s_volume->value, qtrue ); } break; case ROQ_QUAD_INFO: @@ -1494,15 +1494,15 @@ int CIN_PlayCinematic( const char *arg, int x, int y, int w, int h, int systemBi } CIN_SetExtents(currentHandle, x, y, w, h); - CIN_SetLooping(currentHandle, (systemBits & CIN_loop)!=0); + CIN_SetLooping(currentHandle, (qboolean)((systemBits & CIN_loop) != 0)); cinTable[currentHandle].CIN_HEIGHT = DEFAULT_CIN_HEIGHT; cinTable[currentHandle].CIN_WIDTH = DEFAULT_CIN_WIDTH; - cinTable[currentHandle].holdAtEnd = (systemBits & CIN_hold) != 0; - cinTable[currentHandle].alterGameState = (systemBits & CIN_system) != 0; + cinTable[currentHandle].holdAtEnd = (qboolean)((systemBits & CIN_hold) != 0); + cinTable[currentHandle].alterGameState = (qboolean)((systemBits & CIN_system) != 0); cinTable[currentHandle].playonwalls = 1; - cinTable[currentHandle].silent = (systemBits & CIN_silent) != 0; - cinTable[currentHandle].shader = (systemBits & CIN_shader) != 0; + cinTable[currentHandle].silent = (qboolean)((systemBits & CIN_silent) != 0); + cinTable[currentHandle].shader = (qboolean)((systemBits & CIN_shader) != 0); if (psAudioFile) { cinTable[currentHandle].hSFX = S_RegisterSound(psAudioFile); @@ -1625,8 +1625,8 @@ static void CIN_AddTextCrawl() verts[i].modulate[3] = 255*fadeDown; } - _VectorScale( verts[2].modulate, 0.1f, verts[2].modulate ); // darken at the top?? - _VectorScale( verts[3].modulate, 0.1f, verts[3].modulate ); + VectorScaleM( verts[2].modulate, 0.1f, verts[2].modulate ); // darken at the top?? + VectorScaleM( verts[3].modulate, 0.1f, verts[3].modulate ); #define TIMEOFFSET +(cls.realtime-CL_iPlaybackStartTime-TC_DELAY)*0.000015f -1 VectorSet( verts[0].xyz, TC_PLANE_NEAR, -TC_PLANE_WIDTH, TC_PLANE_TOP ); @@ -1856,7 +1856,7 @@ static void PlayCinematic(const char *arg, const char *s, qboolean qbInGame) // work out associated audio-overlay file, if any... // extern cvar_t *s_language; - qboolean bIsForeign = s_language && Q_stricmp(s_language->string,"english") && Q_stricmp(s_language->string,""); + qboolean bIsForeign = (qboolean)(s_language && Q_stricmp(s_language->string,"english") && Q_stricmp(s_language->string,"")); const char *psAudioFile = NULL; qhandle_t hCrawl = 0; if (!Q_stricmp(arg,"video/jk0101_sw.roq")) @@ -1949,7 +1949,7 @@ qboolean CL_CheckPendingCinematic(void) if ( gbPendingCinematic && CIN_HardwareReadyToPlayVideos() ) { gbPendingCinematic = qfalse; // BEFORE next line, or we get recursion - PlayCinematic(sPendingCinematic_Arg,sPendingCinematic_s[0]?sPendingCinematic_s:NULL,false); + PlayCinematic(sPendingCinematic_Arg,sPendingCinematic_s[0]?sPendingCinematic_s:NULL,qfalse); return qtrue; } return qfalse; diff --git a/code/client/cl_keys.cpp b/code/client/cl_keys.cpp index 87a2943b43..b9b36739e2 100644 --- a/code/client/cl_keys.cpp +++ b/code/client/cl_keys.cpp @@ -571,7 +571,7 @@ void Field_KeyDownEvent( field_t *edit, int key ) { if ( key == A_INSERT ) { - kg.key_overstrikeMode = !kg.key_overstrikeMode; + kg.key_overstrikeMode = (qboolean)!kg.key_overstrikeMode; return; } } @@ -1173,10 +1173,10 @@ void CL_ParseBinding( int key, qboolean down, unsigned time ) Q_strncpyz( buf, kg.keys[keynames[key].upper].binding, sizeof( buf ) ); // run all bind commands if console, ui, etc aren't reading keys - allCommands = ( Key_GetCatcher( ) == 0 ); + allCommands = (qboolean)( Key_GetCatcher( ) == 0 ); // allow button up commands if in game even if key catcher is set - allowUpCmds = ( cls.state != CA_DISCONNECTED ); + allowUpCmds = (qboolean)( cls.state != CA_DISCONNECTED ); while( 1 ) { @@ -1224,7 +1224,7 @@ void CL_KeyDownEvent( int key, unsigned time ) kg.keys[keynames[key].upper].repeats++; if( kg.keys[keynames[key].upper].repeats == 1 ) { kg.keyDownCount++; - kg.anykeydown = true; + kg.anykeydown = qtrue; } if ( cl_allowAltEnter->integer && kg.keys[A_ALT].down && key == A_ENTER ) @@ -1243,7 +1243,7 @@ void CL_KeyDownEvent( int key, unsigned time ) // keys can still be used for bound actions if ( ( cls.state == CA_CINEMATIC || CL_IsRunningInGameCinematic()) && !Key_GetCatcher() ) { - SCR_StopCinematic(true); + SCR_StopCinematic(qtrue); return; // key = A_ESCAPE; } @@ -1297,7 +1297,7 @@ void CL_KeyUpEvent( int key, unsigned time ) kg.keyDownCount--; if (kg.keyDownCount <= 0) { - kg.anykeydown = 0; + kg.anykeydown = qfalse; kg.keyDownCount = 0; } diff --git a/code/client/cl_mp3.cpp b/code/client/cl_mp3.cpp index 37a6a6973c..c397a494f4 100644 --- a/code/client/cl_mp3.cpp +++ b/code/client/cl_mp3.cpp @@ -42,7 +42,7 @@ qboolean MP3_IsValid( const char *psLocalFilename, void *pvData, int iDataLen, q Com_Printf(va(S_COLOR_RED"%s(%s)\n",psError, psLocalFilename)); } - return !psError; + return (qboolean)(!psError); } @@ -168,7 +168,7 @@ qboolean MP3_FakeUpWAVInfo( const char *psLocalFilename, void *pvData, int iData // samples = iUnpackedDataLength / width; - return !psError; + return (qboolean)(!psError); } @@ -232,7 +232,7 @@ qboolean MP3_ReadSpecialTagInfo(byte *pbLoadedFile, int iLoadedFileLen, *ppTAG = pTAG; } - return (pTAG && !qbError); + return (qboolean)(pTAG && !qbError); } diff --git a/code/client/cl_mp3.h b/code/client/cl_mp3.h index 032343146f..ccdab28d2e 100644 --- a/code/client/cl_mp3.h +++ b/code/client/cl_mp3.h @@ -58,7 +58,7 @@ extern const char sKEY_UNCOMP[]; void MP3_InitCvars ( void ); qboolean MP3_IsValid ( const char *psLocalFilename, void *pvData, int iDataLen, qboolean bStereoDesired = qfalse ); int MP3_GetUnpackedSize ( const char *psLocalFilename, void *pvData, int iDataLen, qboolean qbIgnoreID3Tag = qfalse, qboolean bStereoDesired = qfalse ); -qboolean MP3_UnpackRawPCM ( const char *psLocalFilename, void *pvData, int iDataLen, byte *pbUnpackBuffer, qboolean bStereoDesired = qfalse ); +int MP3_UnpackRawPCM ( const char *psLocalFilename, void *pvData, int iDataLen, byte *pbUnpackBuffer, qboolean bStereoDesired = qfalse ); qboolean MP3Stream_InitPlayingTimeFields( LP_MP3STREAM lpMP3Stream, const char *psLocalFilename, void *pvData, int iDataLen, qboolean bStereoDesired = qfalse); float MP3Stream_GetPlayingTimeInSeconds( LP_MP3STREAM lpMP3Stream ); float MP3Stream_GetRemainingTimeInSeconds( LP_MP3STREAM lpMP3Stream ); diff --git a/code/client/cl_ui.cpp b/code/client/cl_ui.cpp index 980fe57b4f..80d002f1f3 100644 --- a/code/client/cl_ui.cpp +++ b/code/client/cl_ui.cpp @@ -309,7 +309,7 @@ void CL_InitUI( void ) { uii.Milliseconds = Sys_Milliseconds2; - UI_Init(UI_API_VERSION, &uii, (cls.state > CA_DISCONNECTED && cls.state <= CA_ACTIVE)); + UI_Init(UI_API_VERSION, &uii, (qboolean)(cls.state > CA_DISCONNECTED && cls.state <= CA_ACTIVE)); // uie->UI_Init( UI_API_VERSION, &uii ); diff --git a/code/client/snd_dma.cpp b/code/client/snd_dma.cpp index 754a50922c..48ae0057a9 100644 --- a/code/client/snd_dma.cpp +++ b/code/client/snd_dma.cpp @@ -201,8 +201,8 @@ typedef struct soundChannel_t entchan; // For Open AL - bool bProcessed; - bool bRelative; + qboolean bProcessed; + qboolean bRelative; } loopSound_t; #define MAX_LOOP_SOUNDS 64 @@ -1859,7 +1859,7 @@ void S_ClearLoopingSounds( void ) if (s_UseOpenAL) { for (int i = 0; i < MAX_LOOP_SOUNDS; i++) - loopSounds[i].bProcessed = false; + loopSounds[i].bProcessed = qfalse; } #endif numLoopSounds = 0; @@ -1892,7 +1892,7 @@ void S_AddLoopingSound( int entityNum, const vec3_t origin, const vec3_t velocit } sfx = &s_knownSfx[ sfxHandle ]; - if (sfx->bInMemory == qfalse){ + if (!sfx->bInMemory){ S_memoryLoad(sfx); } SND_TouchSFX(sfx); @@ -3282,7 +3282,7 @@ void UpdateLoopingSounds() alSourcefv(s_channels[i].alSource, AL_POSITION, pos); alSourcei(s_channels[i].alSource, AL_SOURCE_RELATIVE, AL_TRUE); - loop->bRelative = true; + loop->bRelative = qtrue; } // Make sure Gain is set correctly @@ -3293,13 +3293,13 @@ void UpdateLoopingSounds() } ch->bProcessed = true; - loop->bProcessed = true; + loop->bProcessed = qtrue; } else if ((loop->bProcessed == false) && (ch->thesfx == loop->sfx) && (!memcmp(ch->origin, loop->origin, sizeof(ch->origin)))) { // Match ! ch->bProcessed = true; - loop->bProcessed = true; + loop->bProcessed = qtrue; // Make sure Gain is set correctly if (ch->master_vol != loop->volume) @@ -3344,7 +3344,7 @@ void UpdateLoopingSounds() UpdateEAXBuffer(ch); ch->bProcessed = true; - loop->bProcessed = true; + loop->bProcessed = qtrue; break; } } @@ -3373,7 +3373,7 @@ void UpdateLoopingSounds() { loop = &loopSounds[j]; - if (loop->bProcessed == false) + if (!loop->bProcessed) { ch = S_PickChannel(0,0); @@ -3388,7 +3388,7 @@ void UpdateLoopingSounds() && (loop->origin[2] == listener_pos[1]) ) { // Assume that this sound is head relative - loop->bRelative = true; + loop->bRelative = qtrue; ch->origin[0] = 0.f; ch->origin[1] = 0.f; ch->origin[2] = 0.f; @@ -3398,7 +3398,7 @@ void UpdateLoopingSounds() ch->origin[0] = loop->origin[0]; ch->origin[1] = loop->origin[1]; ch->origin[2] = loop->origin[2]; - loop->bRelative = false; + loop->bRelative = qfalse; } ch->fixed_origin = loop->bRelative; @@ -3858,7 +3858,13 @@ void S_SoundList_f( void ) { for (sfx=s_knownSfx, i=0 ; ibDefaultSound && !sfx->pMP3StreamHeader && sfx->pSoundData && (Z_Size(sfx->pSoundData) > cv_MP3overhead->integer); + qboolean bMP3DumpOverride = (qboolean)( + bShouldBeMP3 && + cv_MP3overhead && + !sfx->bDefaultSound && + !sfx->pMP3StreamHeader && + sfx->pSoundData && + (Z_Size(sfx->pSoundData) > cv_MP3overhead->integer)); if (bMP3DumpOverride || (!bShouldBeMP3 && (!bWavOnly || sfx->eSoundCompressionMethod == ct_16))) { @@ -5015,7 +5021,7 @@ static void S_UpdateBackgroundTrack( void ) // standard / non-dynamic one-track music... // const char *psCommand = S_Music_GetRequestedState(); // special check just for "silence" case... - qboolean bShouldBeSilent = (psCommand && !Q_stricmp(psCommand,"silence")); + qboolean bShouldBeSilent = (qboolean)(psCommand && !Q_stricmp(psCommand,"silence")); float fDesiredVolume = bShouldBeSilent ? 0.0f : s_musicVolume->value; // // internal to this code is a volume-smoother... @@ -5273,11 +5279,11 @@ qboolean SND_RegisterAudio_LevelLoadEnd(qboolean bDeleteEverythingNotUsedThisLev if (bDeleteEverythingNotUsedThisLevel) { - bDeleteThis = (sfx->iLastLevelUsedOn != re.RegisterMedia_GetLevel()); + bDeleteThis = (qboolean)(sfx->iLastLevelUsedOn != re.RegisterMedia_GetLevel()); } else { - bDeleteThis = (sfx->iLastLevelUsedOn < re.RegisterMedia_GetLevel()); + bDeleteThis = (qboolean)(sfx->iLastLevelUsedOn < re.RegisterMedia_GetLevel()); } if (bDeleteThis) diff --git a/code/client/snd_mem.cpp b/code/client/snd_mem.cpp index d31fafc1e9..821c8424b8 100644 --- a/code/client/snd_mem.cpp +++ b/code/client/snd_mem.cpp @@ -794,7 +794,7 @@ static qboolean S_LoadSound_Actual( sfx_t *sfx ) { // Create space for lipsync data (4 lip sync values per streaming AL buffer) if (strstr(sfx->sSoundName, "chars") ) - sfx->lipSyncData = (char *)Z_Malloc(16, TAG_SND_RAWDATA, false); + sfx->lipSyncData = (char *)Z_Malloc(16, TAG_SND_RAWDATA, qfalse); else sfx->lipSyncData = NULL; } @@ -853,7 +853,7 @@ static qboolean S_LoadSound_Actual( sfx_t *sfx ) { if (strstr(sfx->sSoundName, "chars")) { - sfx->lipSyncData = (char *)Z_Malloc((sfx->iSoundLengthInSamples / 1000) + 1, TAG_SND_RAWDATA, false); + sfx->lipSyncData = (char *)Z_Malloc((sfx->iSoundLengthInSamples / 1000) + 1, TAG_SND_RAWDATA, qfalse); S_PreProcessLipSync(sfx); } else @@ -926,7 +926,7 @@ static qboolean S_LoadSound_Actual( sfx_t *sfx ) { if ((strstr(sfx->sSoundName, "chars")) || (strstr(sfx->sSoundName, "CHARS"))) { - sfx->lipSyncData = (char *)Z_Malloc((sfx->iSoundLengthInSamples / 1000) + 1, TAG_SND_RAWDATA, false); + sfx->lipSyncData = (char *)Z_Malloc((sfx->iSoundLengthInSamples / 1000) + 1, TAG_SND_RAWDATA, qfalse); S_PreProcessLipSync(sfx); } else diff --git a/code/client/snd_music.cpp b/code/client/snd_music.cpp index 4ecd45ee58..1d9596d387 100644 --- a/code/client/snd_music.cpp +++ b/code/client/snd_music.cpp @@ -204,7 +204,7 @@ const char *Music_BaseStateToString( MusicState_e eMusicState, qboolean bDebugPr return NULL; } -static bool Music_ParseMusic( gsl::czstring filename, const CGenericParser2& Parser, MusicData_t* MusicData, const CGPGroup& pgMusicFiles, const gsl::cstring_view& psMusicName, const gsl::cstring_view& psMusicNameKey, MusicState_e eMusicState ) +static qboolean Music_ParseMusic( gsl::czstring filename, const CGenericParser2& Parser, MusicData_t* MusicData, const CGPGroup& pgMusicFiles, const gsl::cstring_view& psMusicName, const gsl::cstring_view& psMusicNameKey, MusicState_e eMusicState ) { bool bReturn = false; MusicFile_t MusicFile; @@ -301,7 +301,7 @@ static bool Music_ParseMusic( gsl::czstring filename, const CGenericParser2& Par if( iNumExitPoints > iMAX_EXPLORE_TRANSITIONS ) { Music_Parse_Error( filename, build_string( "\"", psMusicName, "\" has > ", iMAX_EXPLORE_TRANSITIONS, " ", psMusicNameKey, " transitions defined!\n" ) ); - return false; + return qfalse; } break; @@ -309,7 +309,7 @@ static bool Music_ParseMusic( gsl::czstring filename, const CGenericParser2& Par if( iNumExitPoints > iMAX_ACTION_TRANSITIONS ) { Music_Parse_Error( filename, build_string( "\"", psMusicName, "\" has > ", iMAX_ACTION_TRANSITIONS, " ", psMusicNameKey, " transitions defined!\n" ) ); - return false; + return qfalse; } break; @@ -317,7 +317,7 @@ static bool Music_ParseMusic( gsl::czstring filename, const CGenericParser2& Par case eBGRNDTRACK_DEATH: Music_Parse_Error( filename, build_string( "\"", psMusicName, "\" has ", psMusicNameKey, " transitions defined, this is not allowed!\n" ) ); - return false; + return qfalse; default: break; } @@ -354,7 +354,7 @@ static bool Music_ParseMusic( gsl::czstring filename, const CGenericParser2& Par ( *MusicData )[ psMusicNameKey ] = MusicFile; } - return bReturn; + return (qboolean)bReturn; } // called from SV_SpawnServer, but before map load and music start etc. @@ -669,9 +669,8 @@ qboolean Music_DynamicDataAvailable(const char *psDynamicMusicLabel) { if (Music_ParseLeveldata(sLevelName)) { - return !!( Music_GetBaseMusicFile( eBGRNDTRACK_EXPLORE ) && - Music_GetBaseMusicFile( eBGRNDTRACK_ACTION ) - ); + return (qboolean)(Music_GetBaseMusicFile(eBGRNDTRACK_EXPLORE) && + Music_GetBaseMusicFile(eBGRNDTRACK_ACTION)); } } @@ -742,9 +741,8 @@ const char *Music_GetFileNameForState( MusicState_e eMusicState) qboolean Music_StateIsTransition( MusicState_e eMusicState ) { - return (eMusicState >= eBGRNDTRACK_FIRSTTRANSITION && - eMusicState <= eBGRNDTRACK_LASTTRANSITION - ); + return (qboolean)(eMusicState >= eBGRNDTRACK_FIRSTTRANSITION && + eMusicState <= eBGRNDTRACK_LASTTRANSITION); } diff --git a/code/game/AI_Default.cpp b/code/game/AI_Default.cpp index 14db201fc5..e95756a9ea 100644 --- a/code/game/AI_Default.cpp +++ b/code/game/AI_Default.cpp @@ -209,7 +209,12 @@ void NPC_BSStandGuard (void) { if(NPC->client->enemyTeam) { - gentity_t *newenemy = NPC_PickEnemy(NPC, NPC->client->enemyTeam, (NPC->cantHitEnemyCounter < 10), (NPC->client->enemyTeam == TEAM_PLAYER), qtrue); + gentity_t *newenemy = NPC_PickEnemy( + NPC, NPC->client->enemyTeam, + (qboolean)(NPC->cantHitEnemyCounter < 10), + (qboolean)(NPC->client->enemyTeam == TEAM_PLAYER), + qtrue); + //only checks for vis if couldn't hit last enemy if(newenemy) { @@ -249,7 +254,7 @@ void NPC_BSHuntAndKill( void ) visibility_t oEVis; int curAnim; - NPC_CheckEnemy( NPCInfo->tempBehavior != BS_HUNT_AND_KILL, qfalse );//don't find new enemy if this is tempbehav + NPC_CheckEnemy( (qboolean)(NPCInfo->tempBehavior != BS_HUNT_AND_KILL), qfalse );//don't find new enemy if this is tempbehav if ( NPC->enemy ) { @@ -747,7 +752,7 @@ void NPC_BSDefault( void ) } } //look for a new enemy if don't have one and are allowed to look, validate current enemy if have one - NPC_CheckEnemy( (NPCInfo->scriptFlags&SCF_LOOK_FOR_ENEMIES), qfalse ); + NPC_CheckEnemy( (qboolean)((NPCInfo->scriptFlags&SCF_LOOK_FOR_ENEMIES) != 0), qfalse ); if ( !NPC->enemy ) {//still don't have an enemy if ( !(NPCInfo->scriptFlags&SCF_IGNORE_ALERTS) ) diff --git a/code/game/AI_GalakMech.cpp b/code/game/AI_GalakMech.cpp index cb9816747e..a8b4d1bf8c 100644 --- a/code/game/AI_GalakMech.cpp +++ b/code/game/AI_GalakMech.cpp @@ -732,7 +732,7 @@ void Pilot_Steer_Vehicle() } }*/ //} - WeaponThink(true); + WeaponThink(qtrue); } ucmd.rightmove = (EnemySide==Side_Left)?( 127):(-127); } diff --git a/code/game/AI_HazardTrooper.cpp b/code/game/AI_HazardTrooper.cpp index fd4e6beeae..e9b47baa68 100644 --- a/code/game/AI_HazardTrooper.cpp +++ b/code/game/AI_HazardTrooper.cpp @@ -785,7 +785,7 @@ class CTroop if (mActors[actorIndex]->NPC->combatPoint!=-1) { - NPC_FreeCombatPoint(mActors[actorIndex]->NPC->combatPoint, false); + NPC_FreeCombatPoint(mActors[actorIndex]->NPC->combatPoint, qfalse); mActors[actorIndex]->NPC->combatPoint = -1; } diff --git a/code/game/AI_Howler.cpp b/code/game/AI_Howler.cpp index 7e061e9962..e3a6d664be 100644 --- a/code/game/AI_Howler.cpp +++ b/code/game/AI_Howler.cpp @@ -496,7 +496,7 @@ static void Howler_Combat( void ) } else if ( TIMER_Done( NPC, "standing" ) ) { - faced = Howler_Move( 1 ); + faced = Howler_Move( qtrue ); } } else @@ -738,7 +738,7 @@ void NPC_BSHowler_Default( void ) { gentity_t *sav_enemy = NPC->enemy;//FIXME: what about NPC->lastEnemy? NPC->enemy = NULL; - gentity_t *newEnemy = NPC_CheckEnemy( NPCInfo->confusionTime < level.time, qfalse, qfalse ); + gentity_t *newEnemy = NPC_CheckEnemy( (qboolean)(NPCInfo->confusionTime < level.time), qfalse, qfalse ); NPC->enemy = sav_enemy; if ( newEnemy && newEnemy != sav_enemy ) {//picked up a new enemy! diff --git a/code/game/AI_Jedi.cpp b/code/game/AI_Jedi.cpp index 61ab411948..1c508c5784 100644 --- a/code/game/AI_Jedi.cpp +++ b/code/game/AI_Jedi.cpp @@ -3714,7 +3714,7 @@ static evasionType_t Jedi_CheckEvadeSpecialAttacks( void ) float distSq = DistanceSquared( NPC->currentOrigin, NPC->enemy->currentOrigin ); if ( distSq < minSafeDistSq ) {//evade! - qboolean doJump = ( NPC->enemy->client->ps.torsoAnim == BOTH_ROLL_STAB || distSq < 3000.0f );//not much time left, just jump! + qboolean doJump = (qboolean)( NPC->enemy->client->ps.torsoAnim == BOTH_ROLL_STAB || distSq < 3000.0f );//not much time left, just jump! if ( (NPCInfo->scriptFlags&SCF_NO_ACROBATICS) || !doJump ) {//roll? @@ -7647,7 +7647,7 @@ void NPC_BSJedi_Default( void ) //FIXME: build a list of all local enemies (since we have to find best anyway) for other AI factors- like when to use group attacks, determine when to change tactics, when surrounded, when blocked by another in the enemy group, etc. Should we build this group list or let the enemies maintain their own list and we just access it? gentity_t *sav_enemy = NPC->enemy;//FIXME: what about NPC->lastEnemy? NPC->enemy = NULL; - gentity_t *newEnemy = NPC_CheckEnemy( NPCInfo->confusionTime < level.time, qfalse, qfalse ); + gentity_t *newEnemy = NPC_CheckEnemy( (qboolean)(NPCInfo->confusionTime < level.time), qfalse, qfalse ); NPC->enemy = sav_enemy; if ( newEnemy && newEnemy != sav_enemy ) {//picked up a new enemy! diff --git a/code/game/AI_MineMonster.cpp b/code/game/AI_MineMonster.cpp index b3f6fae466..9c11b01e41 100644 --- a/code/game/AI_MineMonster.cpp +++ b/code/game/AI_MineMonster.cpp @@ -227,7 +227,7 @@ void MineMonster_Combat( void ) } else { - MineMonster_Move( 1 ); + MineMonster_Move( qtrue ); } } else diff --git a/code/game/AI_Rancor.cpp b/code/game/AI_Rancor.cpp index 45f6448f79..68d0c4cccf 100644 --- a/code/game/AI_Rancor.cpp +++ b/code/game/AI_Rancor.cpp @@ -1164,7 +1164,7 @@ void Rancor_Combat( void ) } else { - Rancor_Move( 1 ); + Rancor_Move( qtrue ); } } else @@ -1571,7 +1571,7 @@ void NPC_BSRancor_Default( void ) {//breakable brush if ( !Rancor_AttackBBrush() ) {//didn't move inside that func, so call move here...? - Rancor_Move( 1 ); + Rancor_Move( qtrue ); } NPC_UpdateAngles( qtrue, qtrue ); return; @@ -1621,7 +1621,7 @@ void NPC_BSRancor_Default( void ) { gentity_t *sav_enemy = NPC->enemy;//FIXME: what about NPC->lastEnemy? NPC->enemy = NULL; - gentity_t *newEnemy = NPC_CheckEnemy( NPCInfo->confusionTime < level.time, qfalse, qfalse ); + gentity_t *newEnemy = NPC_CheckEnemy( (qboolean)(NPCInfo->confusionTime < level.time), qfalse, qfalse ); NPC->enemy = sav_enemy; if ( newEnemy && newEnemy != sav_enemy ) {//picked up a new enemy! diff --git a/code/game/AI_Stormtrooper.cpp b/code/game/AI_Stormtrooper.cpp index dfcdf9ff38..31c964dc09 100644 --- a/code/game/AI_Stormtrooper.cpp +++ b/code/game/AI_Stormtrooper.cpp @@ -1161,7 +1161,7 @@ void NPC_BSST_Investigate( void ) if ( NPCInfo->localState == LSTATE_INVESTIGATE && (NPCInfo->goalEntity!=NULL) ) { //See if we're there - if ( !STEER::Reached(NPC, NPCInfo->goalEntity, 32, !!FlyingCreature(NPC)) ) + if ( !STEER::Reached(NPC, NPCInfo->goalEntity, 32, FlyingCreature(NPC) != qfalse) ) { ucmd.buttons |= BUTTON_WALKING; @@ -1716,7 +1716,7 @@ void ST_TransferMoveGoal( gentity_t *self, gentity_t *other ) {//I must be going for a goal, give that to him instead if ( self->NPC->goalEntity == self->NPC->tempGoal ) { - NPC_SetMoveGoal( other, self->NPC->tempGoal->currentOrigin, self->NPC->goalRadius, ((self->NPC->tempGoal->svFlags&SVF_NAVGOAL)?true:false) ); + NPC_SetMoveGoal( other, self->NPC->tempGoal->currentOrigin, self->NPC->goalRadius, (qboolean)((self->NPC->tempGoal->svFlags & SVF_NAVGOAL) != 0) ); } else { diff --git a/code/game/AI_Tusken.cpp b/code/game/AI_Tusken.cpp index 59df126b33..bf6df7334a 100644 --- a/code/game/AI_Tusken.cpp +++ b/code/game/AI_Tusken.cpp @@ -494,10 +494,10 @@ qboolean G_TuskenAttackAnimDamage( gentity_t *self ) //gi.Printf("%f\n", percentComplete); switch (self->client->ps.torsoAnim) { - case BOTH_TUSKENATTACK1: return (percentComplete>0.3 && percentComplete<0.7); - case BOTH_TUSKENATTACK2: return (percentComplete>0.3 && percentComplete<0.7); - case BOTH_TUSKENATTACK3: return (percentComplete>0.1 && percentComplete<0.5); - case BOTH_TUSKENLUNGE1: return (percentComplete>0.3 && percentComplete<0.5); + case BOTH_TUSKENATTACK1: return (qboolean)(percentComplete>0.3 && percentComplete<0.7); + case BOTH_TUSKENATTACK2: return (qboolean)(percentComplete>0.3 && percentComplete<0.7); + case BOTH_TUSKENATTACK3: return (qboolean)(percentComplete>0.1 && percentComplete<0.5); + case BOTH_TUSKENLUNGE1: return (qboolean)(percentComplete>0.3 && percentComplete<0.5); } } } diff --git a/code/game/AI_Utils.cpp b/code/game/AI_Utils.cpp index 5199a61c3b..bbb1b8313d 100644 --- a/code/game/AI_Utils.cpp +++ b/code/game/AI_Utils.cpp @@ -934,7 +934,7 @@ qboolean AI_RefreshGroup( AIGroupInfo_t *group ) //mark this group as not having been run this frame group->processed = qfalse; - return (group->numGroup>0); + return (qboolean)(group->numGroup>0); } void AI_UpdateGroups( void ) diff --git a/code/game/AI_Wampa.cpp b/code/game/AI_Wampa.cpp index 6a9771aa92..001aea46d4 100644 --- a/code/game/AI_Wampa.cpp +++ b/code/game/AI_Wampa.cpp @@ -357,7 +357,7 @@ void Wampa_Attack( float distance, qboolean doCharge ) if ( NPC->client->ps.legsAnim == BOTH_ATTACK1 && distance > (NPC->maxs[0]+MIN_DISTANCE) ) {//okay to keep moving ucmd.buttons |= BUTTON_WALKING; - Wampa_Move( 1 ); + Wampa_Move( qtrue ); } } @@ -378,7 +378,7 @@ void Wampa_Combat( void ) NPCInfo->goalEntity = NPC->enemy; NPCInfo->goalRadius = MIN_DISTANCE;//MAX_DISTANCE; // just get us within combat range - Wampa_Move( 0 ); + Wampa_Move( qfalse ); return; } /* @@ -424,7 +424,7 @@ void Wampa_Combat( void ) } else { - Wampa_Move( 1 ); + Wampa_Move( qtrue ); } } else @@ -878,7 +878,7 @@ void NPC_BSWampa_Default( void ) { gentity_t *sav_enemy = NPC->enemy;//FIXME: what about NPC->lastEnemy? NPC->enemy = NULL; - gentity_t *newEnemy = NPC_CheckEnemy( NPCInfo->confusionTime < level.time, qfalse, qfalse ); + gentity_t *newEnemy = NPC_CheckEnemy( (qboolean)(NPCInfo->confusionTime < level.time), qfalse, qfalse ); NPC->enemy = sav_enemy; if ( newEnemy && newEnemy != sav_enemy ) {//picked up a new enemy! diff --git a/code/game/FighterNPC.cpp b/code/game/FighterNPC.cpp index 9345e40717..dfab7bd2af 100644 --- a/code/game/FighterNPC.cpp +++ b/code/game/FighterNPC.cpp @@ -451,7 +451,7 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) return; } - isLandingOrLaunching = (FighterIsLanding( pVeh, parentPS )||FighterIsLaunching( pVeh, parentPS )); + isLandingOrLaunching = (qboolean)(FighterIsLanding( pVeh, parentPS )||FighterIsLaunching( pVeh, parentPS )); // If we are hitting the ground, just allow the fighter to go up and down. if ( isLandingOrLaunching//going slow enough to start landing @@ -1228,7 +1228,7 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) #else parentPS = &parent->client->ps; riderPS = &rider->client->ps; - isDead = (parentPS->stats[STAT_HEALTH] <= 0 ); + isDead = (qboolean)(parentPS->stats[STAT_HEALTH] <= 0 ); #endif #ifdef _JK2MP @@ -1267,7 +1267,7 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) pVeh->m_vOrientation[ROLL] = PredictedAngularDecrement(0.95f, angleTimeMod*2.0f, pVeh->m_vOrientation[ROLL]); } - isLandingOrLanded = (FighterIsLanding( pVeh, parentPS )||FighterIsLanded( pVeh, parentPS )); + isLandingOrLanded = (qboolean)(FighterIsLanding( pVeh, parentPS )||FighterIsLanded( pVeh, parentPS )); if (!isLandingOrLanded) { //don't do this stuff while landed.. I guess. I don't want ships spinning in place, looks silly. diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index 952471a4cb..8383c7f777 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -334,7 +334,7 @@ qboolean TIMER_Done( gentity_t *ent, const char *identifier ) return qtrue; } - return (timer->time < level.time); + return (qboolean)(timer->time < level.time); } /* @@ -357,7 +357,7 @@ qboolean TIMER_Done2( gentity_t *ent, const char *identifier, qboolean remove ) return qfalse; } - res = (timer->time < level.time); + res = (qboolean)(timer->time < level.time); if (res && remove) { diff --git a/code/game/NPC_behavior.cpp b/code/game/NPC_behavior.cpp index 9f51936ccd..ad3eda7d03 100644 --- a/code/game/NPC_behavior.cpp +++ b/code/game/NPC_behavior.cpp @@ -243,7 +243,7 @@ void NPC_BSCinematic( void ) if (TIMER_Done(NPC, "NoAnimFireDelay")) { TIMER_Set(NPC, "NoAnimFireDelay", NPC_AttackDebounceForWeapon()); - FireWeapon(NPC, (NPCInfo->scriptFlags&SCF_ALT_FIRE)) ; + FireWeapon(NPC, (qboolean)((NPCInfo->scriptFlags&SCF_ALT_FIRE) != 0)); } } @@ -593,7 +593,7 @@ void NPC_BSFollowLeader_UpdateEnemy(void) { if ( !NPC->enemy ) {//no enemy, find one - NPC_CheckEnemy( NPCInfo->confusionTimeconfusionTimeenemy ) {//just found one NPCInfo->enemyCheckDebounceTime = level.time + Q_irand( 3000, 10000 ); @@ -651,7 +651,7 @@ void NPC_BSFollowLeader_UpdateEnemy(void) } else if ( NPC->client->ps.weapon && NPCInfo->enemyCheckDebounceTime < level.time ) { - NPC_CheckEnemy( (NPCInfo->confusionTimetempBehavior!=BS_FOLLOW_LEADER), qfalse );//don't find new enemy if this is tempbehav + NPC_CheckEnemy( (qboolean)(NPCInfo->confusionTimetempBehavior!=BS_FOLLOW_LEADER), qfalse );//don't find new enemy if this is tempbehav } } } diff --git a/code/game/NPC_combat.cpp b/code/game/NPC_combat.cpp index 2d932a22e2..be430076a5 100644 --- a/code/game/NPC_combat.cpp +++ b/code/game/NPC_combat.cpp @@ -1244,7 +1244,7 @@ HaveWeapon qboolean HaveWeapon( int weapon ) { - return ( client->ps.stats[STAT_WEAPONS] & ( 1 << weapon ) ); + return (qboolean)( client->ps.stats[STAT_WEAPONS] & ( 1 << weapon ) ); } qboolean EntIsGlass (gentity_t *check) diff --git a/code/game/NPC_goal.cpp b/code/game/NPC_goal.cpp index f82fb87d6a..871eefdf6d 100644 --- a/code/game/NPC_goal.cpp +++ b/code/game/NPC_goal.cpp @@ -161,7 +161,7 @@ qboolean ReachedGoal( gentity_t *goal ) NPCInfo->aiFlags &= ~NPCAI_TOUCHED_GOAL; return qtrue; } - return STEER::Reached(NPC, goal, NPCInfo->goalRadius, !!FlyingCreature(NPC)); + return (qboolean)STEER::Reached(NPC, goal, NPCInfo->goalRadius, FlyingCreature(NPC) != qfalse); } /* diff --git a/code/game/NPC_move.cpp b/code/game/NPC_move.cpp index da51cef715..3f38d3695d 100644 --- a/code/game/NPC_move.cpp +++ b/code/game/NPC_move.cpp @@ -612,7 +612,7 @@ qboolean NPC_JumpBackingUp() NPCInfo->jumpBackupTime = 0; return NPC_TryJump(); } - return false; + return qfalse; } @@ -821,7 +821,7 @@ qboolean NPC_MoveToGoal( qboolean tryStraight ) //FIXME: tryStraight not even us #if AI_TIMERS navTime += GetTime( startTime ); #endif// AI_TIMERS - return moveSuccess; + return (qboolean)moveSuccess; } /* diff --git a/code/game/NPC_reactions.cpp b/code/game/NPC_reactions.cpp index ba796bbd6e..89e05b1b26 100644 --- a/code/game/NPC_reactions.cpp +++ b/code/game/NPC_reactions.cpp @@ -985,7 +985,7 @@ void NPC_Respond( gentity_t *self, int userNum ) if ( event != -1 ) { //hack here because we reuse some "combat" and "extra" sounds - qboolean addFlag = (self->NPC->scriptFlags&SCF_NO_COMBAT_TALK); + qboolean addFlag = (qboolean)((self->NPC->scriptFlags&SCF_NO_COMBAT_TALK) != 0); self->NPC->scriptFlags &= ~SCF_NO_COMBAT_TALK; G_AddVoiceEvent( self, event, 3000 ); diff --git a/code/game/NPC_senses.cpp b/code/game/NPC_senses.cpp index 2e3fc0baa5..8b25531d31 100644 --- a/code/game/NPC_senses.cpp +++ b/code/game/NPC_senses.cpp @@ -120,7 +120,7 @@ qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold dot = DotProduct( dir, forward ); - return (dot > threshHold); + return (qboolean)(dot > threshHold); } float DotToSpot( vec3_t spot, vec3_t from, vec3_t fromAngles ) @@ -599,7 +599,7 @@ qboolean G_RememberAlertEvent( gentity_t *self, int alertIndex ) if (at.owner==self) {//don't care about events that I made - return false; + return qfalse; } self->NPC->lastAlertID = at.ID; @@ -916,7 +916,7 @@ qboolean RemoveOldestAlert( void ) //make sure this never drops below zero... if it does, something very very bad happened assert( level.numAlertEvents >= 0 ); //return true is have room for one now - return (level.numAlertEventspers.cmd_angles, ucmd.angles ); + VectorCopyM( client->pers.cmd_angles, ucmd.angles ); ent->client->ps.groundEntityNum = ENTITYNUM_NONE; diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 7b12b23816..200fce428d 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -530,39 +530,39 @@ static void SetTextColor ( vec4_t textcolor,const char *color) if (Q_stricmp(color,"BLACK") == 0) { - Vector4Copy( colorTable[CT_BLACK], textcolor ); + VectorCopy4( colorTable[CT_BLACK], textcolor ); } else if (Q_stricmp(color,"RED") == 0) { - Vector4Copy( colorTable[CT_RED], textcolor ); + VectorCopy4( colorTable[CT_RED], textcolor ); } else if (Q_stricmp(color,"GREEN") == 0) { - Vector4Copy( colorTable[CT_GREEN], textcolor ); + VectorCopy4( colorTable[CT_GREEN], textcolor ); } else if (Q_stricmp(color,"YELLOW") == 0) { - Vector4Copy( colorTable[CT_YELLOW], textcolor ); + VectorCopy4( colorTable[CT_YELLOW], textcolor ); } else if (Q_stricmp(color,"BLUE") == 0) { - Vector4Copy( colorTable[CT_BLUE], textcolor ); + VectorCopy4( colorTable[CT_BLUE], textcolor ); } else if (Q_stricmp(color,"CYAN") == 0) { - Vector4Copy( colorTable[CT_CYAN], textcolor ); + VectorCopy4( colorTable[CT_CYAN], textcolor ); } else if (Q_stricmp(color,"MAGENTA") == 0) { - Vector4Copy( colorTable[CT_MAGENTA], textcolor ); + VectorCopy4( colorTable[CT_MAGENTA], textcolor ); } else if (Q_stricmp(color,"WHITE") == 0) { - Vector4Copy( colorTable[CT_WHITE], textcolor ); + VectorCopy4( colorTable[CT_WHITE], textcolor ); } else { - Vector4Copy( colorTable[CT_WHITE], textcolor ); + VectorCopy4( colorTable[CT_WHITE], textcolor ); } return; @@ -764,10 +764,10 @@ static void Q3_SetObjective(const char *ObjEnum, int status) switch (status) { case SET_OBJ_HIDE : - objective->display = OBJECTIVE_HIDE; + objective->display = (qboolean)(OBJECTIVE_HIDE != 0); break; case SET_OBJ_SHOW : - objective->display = OBJECTIVE_SHOW; + objective->display = (qboolean)(OBJECTIVE_SHOW != 0); objectivesShown++; missionInfo_Updated = qtrue; // Activate flashing text break; @@ -7845,7 +7845,7 @@ int CQuake3GameInterface::PlayIcarusSound( int taskID, int entID, const char *n soundChannel_t voice_chan = CHAN_VOICE; // set a default so the compiler doesn't bitch qboolean type_voice = qfalse; - Q_strncpyz( finalName, name, MAX_QPATH, 0 ); + Q_strncpyz( finalName, name, MAX_QPATH ); Q_strlwr(finalName); G_AddSexToPlayerString( finalName, qtrue ); @@ -8389,7 +8389,7 @@ void CQuake3GameInterface::Set( int taskID, int entID, const char *type_name, co case SET_ICARUS_FREEZE: case SET_ICARUS_UNFREEZE: - Q3_SetICARUSFreeze( entID, (char *) data, (toSet==SET_ICARUS_FREEZE) ); + Q3_SetICARUSFreeze( entID, (char *) data, (qboolean)(toSet==SET_ICARUS_FREEZE) ); break; case SET_WEAPON: @@ -11228,9 +11228,9 @@ void CQuake3GameInterface::PrecacheScript( const char *name ) void CQuake3GameInterface::PrecacheSound( const char *name ) { - char finalName[MAX_QPATH]; + char finalName[MAX_QPATH]; - Q_strncpyz( finalName, name, MAX_QPATH, 0 ); + Q_strncpyz( finalName, name, MAX_QPATH ); Q_strlwr(finalName); if (com_buildScript->integer) { //get the male sound first diff --git a/code/game/b_local.h b/code/game/b_local.h index 8093b64b0c..d95c7563d9 100644 --- a/code/game/b_local.h +++ b/code/game/b_local.h @@ -310,8 +310,8 @@ extern qboolean NPC_SetCombatPoint( int combatPointID ); #define MAX_COMBAT_POINT_CHECK 32 -extern int NPC_ValidEnemy( gentity_t *ent ); -extern int NPC_CheckEnemyExt( qboolean checkAlerts = qfalse ); +extern qboolean NPC_ValidEnemy( gentity_t *ent ); +extern qboolean NPC_CheckEnemyExt( qboolean checkAlerts = qfalse ); extern qboolean NPC_FindPlayer( void ); extern qboolean NPC_CheckCanAttackExt( void ); diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index 48b23f04f6..b6813299d8 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -1192,7 +1192,7 @@ qboolean PM_InAnimForSaberMove( int anim, int saberMove ) } if ( anim >= BOTH_P1_S1_T_ && anim <= BOTH_H1_S1_BR ) {//parries, knockaways and broken parries - return (anim==saberMoveData[saberMove].animToUse); + return (qboolean)(anim==saberMoveData[saberMove].animToUse); } return qfalse; } @@ -7125,7 +7125,7 @@ qboolean PM_SaberLockBreakAnim( int anim ) case BOTH_LK_ST_S_S_B_1_W: //normal break I won case BOTH_LK_ST_S_T_B_1_L: //normal break I lost case BOTH_LK_ST_S_T_B_1_W: //normal break I won - return (PM_SuperBreakLoseAnim(anim)||PM_SuperBreakWinAnim(anim)); + return (qboolean)(PM_SuperBreakLoseAnim(anim)||PM_SuperBreakWinAnim(anim)); break; } return qfalse; diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 29223cf01b..3857f0721a 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -103,7 +103,7 @@ extern void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ); extern qboolean WP_ForcePowerAvailable( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); extern void WP_ForcePowerDrain( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); extern float G_ForceWallJumpStrength( void ); -extern int G_CheckRollSafety( gentity_t *self, int anim, float testDist ); +extern qboolean G_CheckRollSafety( gentity_t *self, int anim, float testDist ); extern saberMoveName_t PM_CheckDualSpinProtect( void ); extern saberMoveName_t PM_CheckPullAttack( void ); extern qboolean JET_Flying( gentity_t *self ); diff --git a/code/game/bg_slidemove.cpp b/code/game/bg_slidemove.cpp index 5beeac7179..52d1fb4e0f 100644 --- a/code/game/bg_slidemove.cpp +++ b/code/game/bg_slidemove.cpp @@ -326,7 +326,7 @@ qboolean PM_SlideMove( float gravMod ) { VectorCopy( primal_velocity, pm->ps->velocity ); } - return ( bumpcount != 0 ); + return (qboolean)( bumpcount != 0 ); } /* diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index c40de5e202..f79a8c2b72 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -4429,8 +4429,8 @@ void ClientAlterSpeed(gentity_t *ent, usercmd_t *ucmd, qboolean controlledByPlay { if ( !(ucmd->buttons & BUTTON_USE) ) {//Not leaning - qboolean Flying = (ucmd->upmove && ent->client->moveType == MT_FLYSWIM); - qboolean Climbing = (ucmd->upmove && ent->watertype&CONTENTS_LADDER ); + qboolean Flying = (qboolean)(ucmd->upmove && ent->client->moveType == MT_FLYSWIM); + qboolean Climbing = (qboolean)(ucmd->upmove && ent->watertype&CONTENTS_LADDER ); client->ps.friction = 6; @@ -4900,7 +4900,7 @@ extern cvar_t *g_skippingcin; {//lock out player control if ( !player_locked ) { - VectorClear( ucmd->angles ); + VectorClearM( ucmd->angles ); } ucmd->forwardmove = 0; ucmd->rightmove = 0; @@ -5394,7 +5394,7 @@ extern cvar_t *g_skippingcin; pm.trace = gi.trace; pm.pointcontents = gi.pointcontents; pm.debugLevel = g_debugMove->integer; - pm.noFootsteps = 0;//( g_dmflags->integer & DF_NO_FOOTSTEPS ) > 0; + pm.noFootsteps = qfalse;//( g_dmflags->integer & DF_NO_FOOTSTEPS ) > 0; if ( ent->client && ent->NPC ) { @@ -5448,7 +5448,7 @@ extern cvar_t *g_skippingcin; ent->waterlevel = pm.waterlevel; ent->watertype = pm.watertype; - _VectorCopy( ucmd->angles, client->pers.cmd_angles ); + VectorCopyM( ucmd->angles, client->pers.cmd_angles ); // execute client events ClientEvents( ent, oldEventSequence ); diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index 738a794c62..278645ffa4 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -604,7 +604,7 @@ void ClientBegin( int clientNum, usercmd_t *cmd, SavedGameJustLoaded_e eSavedGam client->pers.connected = CON_CONNECTED; client->pers.teamState.state = TEAM_BEGIN; - _VectorCopy( cmd->angles, client->pers.cmd_angles ); + VectorCopyM( cmd->angles, client->pers.cmd_angles ); memset( &client->ps, 0, sizeof( client->ps ) ); if( gi.Cvar_VariableIntegerValue( "g_clearstats" ) ) @@ -2381,7 +2381,7 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded client->ps.commandTime = level.time - 100; ucmd = client->pers.lastCommand; ucmd.serverTime = level.time; - _VectorCopy( client->pers.cmd_angles, ucmd.angles ); + VectorCopyM( client->pers.cmd_angles, ucmd.angles ); ucmd.weapon = client->ps.weapon; // client think calls Pmove which sets the client->ps.weapon to ucmd.weapon, so ... ent->client->ps.groundEntityNum = ENTITYNUM_NONE; ClientThink( ent-g_entities, &ucmd ); diff --git a/code/game/g_cmds.cpp b/code/game/g_cmds.cpp index b34868a77c..2c36f48464 100644 --- a/code/game/g_cmds.cpp +++ b/code/game/g_cmds.cpp @@ -727,7 +727,7 @@ void Cmd_SetObjective_f( gentity_t *ent ) displayStatus = atoi(gi.argv(2)); status = atoi(gi.argv(3)); - ent->client->sess.mission_objectives[objectiveI].display = displayStatus; + ent->client->sess.mission_objectives[objectiveI].display = (qboolean)(displayStatus != 0); ent->client->sess.mission_objectives[objectiveI].status = status; G_CheckPlayerDarkSide(); } diff --git a/code/game/g_combat.cpp b/code/game/g_combat.cpp index 42370d71a0..94f4a28447 100644 --- a/code/game/g_combat.cpp +++ b/code/game/g_combat.cpp @@ -476,7 +476,7 @@ qboolean OnSameTeam( gentity_t *ent1, gentity_t *ent2 ) // return qtrue; // } - return ( ent1->client->playerTeam == ent2->client->playerTeam ); + return (qboolean)( ent1->client->playerTeam == ent2->client->playerTeam ); } @@ -1879,10 +1879,8 @@ qboolean G_LimbLost( gentity_t *ent, int hitLoc ) return qtrue; } return qfalse; - break; default: - return (ent->locationDamage[hitLoc]>=Q3_INFINITE); - break; + return (qboolean)(ent->locationDamage[hitLoc]>=Q3_INFINITE); } } @@ -3778,7 +3776,7 @@ void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int NPC_FreeCombatPoint( self->NPC->combatPoint ); if ( self->NPC->group ) { - lastInGroup = (self->NPC->group->numGroup < 2); + lastInGroup = (qboolean)(self->NPC->group->numGroup < 2); AI_GroupMemberKilled( self ); AI_DeleteSelfFromGroup( self ); } @@ -5904,7 +5902,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, const case MOD_LAVA: case MOD_FALLING: case MOD_MELEE: - doSound = (Q_irand(0,4)==0); + doSound = (qboolean)(Q_irand(0,4)==0); switch ( targ->client->ps.forcePowerLevel[FP_PROTECT] ) { case FORCE_LEVEL_4: @@ -6447,14 +6445,15 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, const // Undying If: //-------------------------------------------------------------------------- - qboolean targUndying = (!alreadyDead - && !(dflags&DAMAGE_NO_PROTECTION) - && ( - (targ->flags&FL_UNDYING) - || (dflags&DAMAGE_NO_KILL) - || ((targ->client) && (targ->client->ps.forcePowersActive & (1<flags&FL_UNDYING) || + (dflags&DAMAGE_NO_KILL) || + ((targ->client) && + (targ->client->ps.forcePowersActive & (1 << FP_RAGE)) & + !(dflags&DAMAGE_NO_PROTECTION) && + !(dflags&DAMAGE_DIE_ON_IMPACT)))); if ( targ->client && targ->client->NPC_class == CLASS_WAMPA diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 7e106804a0..edc43e81b5 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -91,7 +91,7 @@ qboolean PInUse(unsigned int entNum) { assert(entNum>=0); assert(entNummisc_dlight_active = !ent->misc_dlight_active; //toggle + ent->misc_dlight_active = (qboolean)!ent->misc_dlight_active; //toggle misc_lightstyle_set (ent); } diff --git a/code/game/g_missile.cpp b/code/game/g_missile.cpp index fd243eee6c..020744f455 100644 --- a/code/game/g_missile.cpp +++ b/code/game/g_missile.cpp @@ -673,7 +673,7 @@ void G_MissileImpact( gentity_t *ent, trace_t *trace, int hitLoc=HL_NONE ) } // check for bounce //OR: if the surfaceParm is has a reflect property (magnetic shielding) and the missile isn't an exploding missile - qboolean bounce = !!( (!other->takedamage && (ent->s.eFlags&(EF_BOUNCE|EF_BOUNCE_HALF))) || (((trace->surfaceFlags&SURF_FORCEFIELD)||(other->flags&FL_SHIELDED))&&!ent->splashDamage&&!ent->splashRadius&&ent->s.weapon != WP_NOGHRI_STICK) ); + qboolean bounce = (qboolean)( (!other->takedamage && (ent->s.eFlags&(EF_BOUNCE|EF_BOUNCE_HALF))) || (((trace->surfaceFlags&SURF_FORCEFIELD)||(other->flags&FL_SHIELDED))&&!ent->splashDamage&&!ent->splashRadius&&ent->s.weapon != WP_NOGHRI_STICK) ); if ( ent->dflags & DAMAGE_HEAVY_WEAP_CLASS ) { @@ -734,7 +734,7 @@ void G_MissileImpact( gentity_t *ent, trace_t *trace, int hitLoc=HL_NONE ) { G_MissileAddAlerts( ent ); } - G_MissileBounceEffect( ent, trace->endpos, trace->plane.normal, trace->entityNum==ENTITYNUM_WORLD ); + G_MissileBounceEffect( ent, trace->endpos, trace->plane.normal, (qboolean)(trace->entityNum==ENTITYNUM_WORLD) ); return; } @@ -755,7 +755,7 @@ void G_MissileImpact( gentity_t *ent, trace_t *trace, int hitLoc=HL_NONE ) { ent->s.eFlags &= ~EF_BOUNCE_SHRAPNEL; } - G_MissileBounceEffect( ent, trace->endpos, trace->plane.normal, trace->entityNum==ENTITYNUM_WORLD ); + G_MissileBounceEffect( ent, trace->endpos, trace->plane.normal, (qboolean)(trace->entityNum==ENTITYNUM_WORLD) ); return; } } diff --git a/code/game/g_mover.cpp b/code/game/g_mover.cpp index b8f04d70f8..905abd2a5e 100644 --- a/code/game/g_mover.cpp +++ b/code/game/g_mover.cpp @@ -342,7 +342,7 @@ qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t ** VectorAdd( pusher->currentAngles, amove, pusher->currentAngles ); gi.linkentity( pusher ); - notMoving = (VectorCompare( vec3_origin, move )&&VectorCompare( vec3_origin, amove )); + notMoving = (qboolean)(VectorCompare( vec3_origin, move )&&VectorCompare( vec3_origin, amove )); // see if any solid entities are inside the final position for ( e = 0 ; e < listedEntities ; e++ ) { diff --git a/code/game/g_navigator.cpp b/code/game/g_navigator.cpp index 297286dea0..c1a56b43bb 100644 --- a/code/game/g_navigator.cpp +++ b/code/game/g_navigator.cpp @@ -641,7 +641,7 @@ class CGraphUser : public TGraph::user } else if ( Edge.BlockingBreakable()) {//we had a breakable in our way, now it's gone, see if there is anything else in the way - if ( NAV::TestEdge( Edge.mNodeA, Edge.mNodeB, false ) ) + if ( NAV::TestEdge( Edge.mNodeA, Edge.mNodeB, qfalse ) ) {//clear it Edge.mFlags.clear_bit(CWayEdge::WE_BLOCKING_BREAK); } @@ -1911,7 +1911,7 @@ bool NAV::LoadFromEntitiesAndSaveToFile(const char *filename, int checksum) // Try Medium //------------ - CanGo = TestEdge( at.mNodeA, at.mNodeB, IsDebugEdge ); + CanGo = TestEdge( at.mNodeA, at.mNodeB, (qboolean)IsDebugEdge ); if (!CanGo) { at.mFlags.clear_bit(CWayEdge::WE_SIZE_LARGE); @@ -1920,7 +1920,7 @@ bool NAV::LoadFromEntitiesAndSaveToFile(const char *filename, int checksum) { gi.Printf("Nav(%s)<->(%s): Attempting Size Medium...\n", aName, bName); } - CanGo = TestEdge( at.mNodeA, at.mNodeB, IsDebugEdge ); + CanGo = TestEdge( at.mNodeA, at.mNodeB, (qboolean)IsDebugEdge ); } // If This Edge Can't Go At Any Size, Dump It diff --git a/code/game/g_navnew.cpp b/code/game/g_navnew.cpp index 50dfd66d1c..2cd87f368b 100644 --- a/code/game/g_navnew.cpp +++ b/code/game/g_navnew.cpp @@ -53,11 +53,11 @@ qboolean NAV_HitNavGoal( vec3_t point, vec3_t mins, vec3_t maxs, vec3_t dest, in { diff[2] = 0; } - return ( VectorLengthSquared( diff ) <= (radius*radius) ); + return (qboolean)( VectorLengthSquared( diff ) <= (radius*radius) ); } else {//must hit exactly - return ( DistanceSquared(dest, point) <= (radius*radius) ); + return (qboolean)( DistanceSquared(dest, point) <= (radius*radius) ); } //There is probably a better way to do this, either by preserving the original // mins and maxs of the navgoal and doing this check ONLY if the radius diff --git a/code/game/g_object.cpp b/code/game/g_object.cpp index be5857c05f..db653e5b2c 100644 --- a/code/game/g_object.cpp +++ b/code/game/g_object.cpp @@ -210,7 +210,7 @@ void G_RunObject( gentity_t *ent ) G_Sound( ent, G_SoundIndex( "sound/movers/objects/objectHit.wav" ) ); } } - DoImpact( ent, traceEnt, !(tr.surfaceFlags&SURF_NODAMAGE), &tr ); + DoImpact( ent, traceEnt, (qboolean)!(tr.surfaceFlags&SURF_NODAMAGE), &tr ); } if ( !ent || (ent->takedamage&&ent->health <= 0) ) diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp index 41dfbc2d2d..c09cf6bd0e 100644 --- a/code/game/g_roff.cpp +++ b/code/game/g_roff.cpp @@ -414,7 +414,7 @@ static qboolean G_InitRoff( char *file, unsigned char *data ) } } - return false; + return qfalse; } //------------------------------------------------------- diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index cbb44498a9..7eec301258 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -483,7 +483,7 @@ static void EnumerateField(const save_field_t *pField, const byte *pbBase) break; case F_BOOLPTR: - *(qboolean *)pv = !!(*(int *)pv); + *(qboolean *)pv = (qboolean)(*(int *)pv != 0); break; // These are pointers that are always recreated @@ -1248,7 +1248,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) extern int killPlayerTimer; qboolean GameAllowedToSaveHere(void) { - return (!in_camera&&!killPlayerTimer); + return (qboolean)(!in_camera&&!killPlayerTimer); } //////////////////// eof ///////////////////// diff --git a/code/game/g_session.cpp b/code/game/g_session.cpp index 8a42757085..09f6f602ca 100644 --- a/code/game/g_session.cpp +++ b/code/game/g_session.cpp @@ -139,7 +139,7 @@ void G_ReadSessionData( gclient_t *client ) { // Clear the objectives out for (i=0;i< MAX_OBJECTIVES; i++) { - client->sess.mission_objectives[i].display = 0; + client->sess.mission_objectives[i].display = qfalse; client->sess.mission_objectives[i].status = OBJECTIVE_STAT_PENDING; } diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index 985d477c43..9473d17018 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -244,11 +244,11 @@ static void Svcmd_SaberBlade_f() qboolean turnOn; if ( gi.argc() > 2 ) {//explicit - turnOn = (atoi(gi.argv(3))!=0); + turnOn = (qboolean)(atoi(gi.argv(3))!=0); } else {//toggle - turnOn = (g_entities[0].client->ps.saber[sabernum].blade[bladenum].active==qfalse); + turnOn = (qboolean)!g_entities[0].client->ps.saber[sabernum].blade[bladenum].active; } g_entities[0].client->ps.SaberBladeActivate( sabernum, bladenum, turnOn ); diff --git a/code/game/g_target.cpp b/code/game/g_target.cpp index db57c221d4..3189505829 100644 --- a/code/game/g_target.cpp +++ b/code/game/g_target.cpp @@ -1013,7 +1013,7 @@ void target_level_change_use(gentity_t *self, gentity_t *other, gentity_t *activ } else { - G_ChangeMap( self->message, self->target, (self->spawnflags&1) ); + G_ChangeMap( self->message, self->target, (qboolean)((self->spawnflags&1) != 0) ); } if (self->count>=0) { diff --git a/code/game/g_turret.cpp b/code/game/g_turret.cpp index 7641719143..ec6aaa0b7b 100644 --- a/code/game/g_turret.cpp +++ b/code/game/g_turret.cpp @@ -257,7 +257,7 @@ void turret_head_think( gentity_t *self ) self->modelScale ); if ( (self->spawnflags&SPF_TURRETG2_TURBO) ) { - self->alt_fire = !self->alt_fire; + self->alt_fire = (qboolean)!self->alt_fire; } gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, org ); diff --git a/code/game/g_vehicles.cpp b/code/game/g_vehicles.cpp index d25f003bad..2db37c0065 100644 --- a/code/game/g_vehicles.cpp +++ b/code/game/g_vehicles.cpp @@ -2032,7 +2032,7 @@ static bool Update( Vehicle_t *pVeh, const usercmd_t *pUmcd ) {//okay to toggle if ( pVeh->m_pVehicleInfo->weapon[i].linkable == 1 ) {//link-toggleable - pVeh->weaponStatus[i].linked = !pVeh->weaponStatus[i].linked; + pVeh->weaponStatus[i].linked = (qboolean)!pVeh->weaponStatus[i].linked; } } linkHeld = qtrue; diff --git a/code/game/g_weapon.cpp b/code/game/g_weapon.cpp index 643fe5e515..5188736d1e 100644 --- a/code/game/g_weapon.cpp +++ b/code/game/g_weapon.cpp @@ -1609,7 +1609,7 @@ TOGGLE - keep firing until used again (fires at intervals of "wait") */ void misc_weapon_shooter_fire( gentity_t *self ) { - FireWeapon( self, (self->spawnflags&1) ); + FireWeapon( self, (qboolean)((self->spawnflags&1) != 0) ); if ( (self->spawnflags&2) ) {//repeat self->e_ThinkFunc = thinkF_misc_weapon_shooter_fire; diff --git a/code/game/wp_concussion.cpp b/code/game/wp_concussion.cpp index 355d33fb3b..7c21a1a40d 100644 --- a/code/game/wp_concussion.cpp +++ b/code/game/wp_concussion.cpp @@ -162,7 +162,7 @@ static void WP_FireConcussionAlt( gentity_t *ent ) } int hitLoc = G_GetHitLocFromTrace( &tr, MOD_CONC_ALT ); - qboolean noKnockBack = (traceEnt->flags&FL_NO_KNOCKBACK);//will be set if they die, I want to know if it was on *before* they died + qboolean noKnockBack = (qboolean)((traceEnt->flags&FL_NO_KNOCKBACK) != 0);//will be set if they die, I want to know if it was on *before* they died if ( traceEnt && traceEnt->client && traceEnt->client->NPC_class == CLASS_GALAKMECH ) {//hehe G_Damage( traceEnt, ent, ent, forwardVec, tr.endpos, 10, DAMAGE_NO_KNOCKBACK|DAMAGE_NO_HIT_LOC, MOD_CONC_ALT, hitLoc ); diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index e8c41a433b..956bf02b9a 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -2342,7 +2342,7 @@ qboolean WP_SaberDamageEffects( trace_t *tr, const vec3_t start, float length, f } } } - return (numHitEnts>0); + return (qboolean)(numHitEnts>0); } void WP_SaberBlockEffect( gentity_t *attacker, int saberNum, int bladeNum, vec3_t position, vec3_t normal, qboolean cutNotBlock ) @@ -5280,7 +5280,7 @@ void WP_SaberDamageTrace( gentity_t *ent, int saberNum, int bladeNum ) } else if ( entAttacking && hitOwnerDefending ) {//I'm attacking hit, they're parrying - qboolean activeDefense = (hitOwner->s.number||g_saberAutoBlocking->integer||hitOwner->client->ps.saberBlockingTime > level.time); + qboolean activeDefense = (qboolean)(hitOwner->s.number||g_saberAutoBlocking->integer||hitOwner->client->ps.saberBlockingTime > level.time); if ( !Q_irand( 0, g_saberLockRandomNess->integer*3 ) && activeDefense && (g_debugSaberLock->integer || forceLock || @@ -9552,15 +9552,15 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake ) && ((!pull&&self->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_2 && push_list[x]->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_1) //level 1 push || (pull && self->client->ps.forcePowerLevel[FP_PULL] < FORCE_LEVEL_2 && push_list[x]->client->ps.forcePowerLevel[FP_PULL] < FORCE_LEVEL_1)) )//level 1 pull {//NPC or third person player (without force push/pull skill), and force push/pull level is at 1 - WP_ForceKnockdown( push_list[x], self, pull, (!pull&&knockback>150), qfalse ); + WP_ForceKnockdown( push_list[x], self, pull, (qboolean)(!pull&&knockback>150), qfalse ); } else if ( !push_list[x]->s.number ) {//player, have to force an anim on him - WP_ForceKnockdown( push_list[x], self, pull, (!pull&&knockback>150), qfalse ); + WP_ForceKnockdown( push_list[x], self, pull, (qboolean)(!pull&&knockback>150), qfalse ); } else {//NPC and force-push/pull at level 2 or higher - WP_ForceKnockdown( push_list[x], self, pull, (!pull&&knockback>100), qfalse ); + WP_ForceKnockdown( push_list[x], self, pull, (qboolean)(!pull&&knockback>100), qfalse ); } } push_list[x]->forcePushTime = level.time + 600; // let the push effect last for 600 ms diff --git a/code/game/wp_saber.h b/code/game/wp_saber.h index f7483e7627..042f01fc19 100644 --- a/code/game/wp_saber.h +++ b/code/game/wp_saber.h @@ -460,7 +460,7 @@ typedef struct int blocking; saberMoveName_t chain_idle; // What move to call if the attack button is not pressed at the end of this anim saberMoveName_t chain_attack; // What move to call if the attack button (and nothing else) is pressed - qboolean trailLength; + int trailLength; } saberMoveData_t; extern saberMoveData_t saberMoveData[LS_MOVE_MAX]; diff --git a/code/game/wp_thermal.cpp b/code/game/wp_thermal.cpp index e4cf9ac331..cb2e76c36e 100644 --- a/code/game/wp_thermal.cpp +++ b/code/game/wp_thermal.cpp @@ -363,7 +363,7 @@ gentity_t *WP_FireThermalDetonator( gentity_t *ent, qboolean alt_fire ) } float thrownSpeed = TD_VELOCITY; - const qboolean thisIsAShooter = !Q_stricmp( "misc_weapon_shooter", ent->classname); + const qboolean thisIsAShooter = (qboolean)!Q_stricmp( "misc_weapon_shooter", ent->classname); if (thisIsAShooter) { diff --git a/code/qcommon/cm_patch.cpp b/code/qcommon/cm_patch.cpp index aef98d1f72..dbaa19ddf2 100644 --- a/code/qcommon/cm_patch.cpp +++ b/code/qcommon/cm_patch.cpp @@ -202,7 +202,7 @@ static qboolean CM_NeedsSubdivision( vec3_t a, vec3_t b, vec3_t c ) { VectorSubtract( cmid, lmid, delta ); dist = VectorLengthSquared( delta ); - return dist >= SUBDIVIDE_DISTANCE * SUBDIVIDE_DISTANCE; + return (qboolean)(dist >= (SUBDIVIDE_DISTANCE * SUBDIVIDE_DISTANCE)); } /* @@ -515,7 +515,7 @@ int CM_FindPlane2(float plane[4], int *flipped) { Com_Error( ERR_DROP, "MAX_PATCH_PLANES reached (%d)", MAX_PATCH_PLANES ); } - Vector4Copy( plane, planes[numPlanes].plane ); + VectorCopy4( plane, planes[numPlanes].plane ); planes[numPlanes].signbits = CM_SignbitsForNormal( plane ); numPlanes++; @@ -569,7 +569,7 @@ static int CM_FindPlane( float *p1, float *p2, float *p3 ) { Com_Error( ERR_DROP, "MAX_PATCH_PLANES" ); } - Vector4Copy( plane, planes[numPlanes].plane ); + VectorCopy4( plane, planes[numPlanes].plane ); planes[numPlanes].signbits = CM_SignbitsForNormal( plane ); numPlanes++; @@ -793,14 +793,14 @@ static qboolean CM_ValidateFacet( facet_t *facet ) { return qfalse; } - Vector4Copy( planes[ facet->surfacePlane ].plane, plane ); + VectorCopy4( planes[ facet->surfacePlane ].plane, plane ); w = BaseWindingForPlane( plane, plane[3] ); for ( j = 0 ; j < facet->numBorders && w ; j++ ) { if ( facet->borderPlanes[j] == -1 ) { FreeWinding(w); return qfalse; } - Vector4Copy( planes[ facet->borderPlanes[j] ].plane, plane ); + VectorCopy4( planes[ facet->borderPlanes[j] ].plane, plane ); if ( !facet->borderInward[j] ) { VectorSubtract( vec3_origin, plane, plane ); plane[3] = -plane[3]; @@ -847,12 +847,12 @@ void CM_AddFacetBevels( facet_t *facet ) { return; #endif - Vector4Copy( planes[ facet->surfacePlane ].plane, plane ); + VectorCopy4( planes[ facet->surfacePlane ].plane, plane ); w = BaseWindingForPlane( plane, plane[3] ); for ( j = 0 ; j < facet->numBorders && w ; j++ ) { if (facet->borderPlanes[j] == facet->surfacePlane) continue; - Vector4Copy( planes[ facet->borderPlanes[j] ].plane, plane ); + VectorCopy4( planes[ facet->borderPlanes[j] ].plane, plane ); if ( !facet->borderInward[j] ) { VectorSubtract( vec3_origin, plane, plane ); @@ -894,7 +894,7 @@ void CM_AddFacetBevels( facet_t *facet ) { if ( i == facet->numBorders ) { if (facet->numBorders > 4 + 6 + 16) Com_Printf(S_COLOR_RED"ERROR: too many bevels\n"); facet->borderPlanes[facet->numBorders] = CM_FindPlane2(plane, &flipped); - facet->borderNoAdjust[facet->numBorders] = 0; + facet->borderNoAdjust[facet->numBorders] = qfalse; facet->borderInward[facet->numBorders] = flipped; facet->numBorders++; } @@ -962,11 +962,11 @@ void CM_AddFacetBevels( facet_t *facet ) { facet->borderPlanes[k]) Com_Printf("WARNING: bevel plane already used\n"); } - facet->borderNoAdjust[facet->numBorders] = 0; + facet->borderNoAdjust[facet->numBorders] = qfalse; facet->borderInward[facet->numBorders] = flipped; // w2 = CopyWinding(w); - Vector4Copy(planes[facet->borderPlanes[facet->numBorders]].plane, newplane); + VectorCopy4(planes[facet->borderPlanes[facet->numBorders]].plane, newplane); if (!facet->borderInward[facet->numBorders]) { VectorNegate(newplane, newplane); @@ -993,7 +993,7 @@ void CM_AddFacetBevels( facet_t *facet ) { #ifndef BSPC //add opposite plane facet->borderPlanes[facet->numBorders] = facet->surfacePlane; - facet->borderNoAdjust[facet->numBorders] = 0; + facet->borderNoAdjust[facet->numBorders] = qfalse; facet->borderInward[facet->numBorders] = qtrue; facet->numBorders++; #endif //BSPC @@ -1020,7 +1020,7 @@ static void CM_PatchCollideFromGrid( cGrid_t *grid, patchCollide_t *pf ) { int gridPlanes[CM_MAX_GRID_SIZE][CM_MAX_GRID_SIZE][2]; facet_t *facet; int borders[4]; - int noAdjust[4]; + qboolean noAdjust[4]; int numFacets; facets = (facet_t*) Z_Malloc(MAX_FACETS*sizeof(facet_t), TAG_TEMP_WORKSPACE, qfalse); @@ -1053,7 +1053,7 @@ static void CM_PatchCollideFromGrid( cGrid_t *grid, patchCollide_t *pf ) { } else if ( grid->wrapHeight ) { borders[EN_TOP] = gridPlanes[i][grid->height-2][1]; } - noAdjust[EN_TOP] = ( borders[EN_TOP] == gridPlanes[i][j][0] ); + noAdjust[EN_TOP] = (qboolean)( borders[EN_TOP] == gridPlanes[i][j][0] ); if ( borders[EN_TOP] == -1 || noAdjust[EN_TOP] ) { borders[EN_TOP] = CM_EdgePlaneNum( grid, gridPlanes, i, j, 0 ); } @@ -1064,7 +1064,7 @@ static void CM_PatchCollideFromGrid( cGrid_t *grid, patchCollide_t *pf ) { } else if ( grid->wrapHeight ) { borders[EN_BOTTOM] = gridPlanes[i][0][0]; } - noAdjust[EN_BOTTOM] = ( borders[EN_BOTTOM] == gridPlanes[i][j][1] ); + noAdjust[EN_BOTTOM] = (qboolean)( borders[EN_BOTTOM] == gridPlanes[i][j][1] ); if ( borders[EN_BOTTOM] == -1 || noAdjust[EN_BOTTOM] ) { borders[EN_BOTTOM] = CM_EdgePlaneNum( grid, gridPlanes, i, j, 2 ); } @@ -1075,7 +1075,7 @@ static void CM_PatchCollideFromGrid( cGrid_t *grid, patchCollide_t *pf ) { } else if ( grid->wrapWidth ) { borders[EN_LEFT] = gridPlanes[grid->width-2][j][0]; } - noAdjust[EN_LEFT] = ( borders[EN_LEFT] == gridPlanes[i][j][1] ); + noAdjust[EN_LEFT] = (qboolean)( borders[EN_LEFT] == gridPlanes[i][j][1] ); if ( borders[EN_LEFT] == -1 || noAdjust[EN_LEFT] ) { borders[EN_LEFT] = CM_EdgePlaneNum( grid, gridPlanes, i, j, 3 ); } @@ -1086,7 +1086,7 @@ static void CM_PatchCollideFromGrid( cGrid_t *grid, patchCollide_t *pf ) { } else if ( grid->wrapWidth ) { borders[EN_RIGHT] = gridPlanes[0][j][1]; } - noAdjust[EN_RIGHT] = ( borders[EN_RIGHT] == gridPlanes[i][j][0] ); + noAdjust[EN_RIGHT] = (qboolean)( borders[EN_RIGHT] == gridPlanes[i][j][0] ); if ( borders[EN_RIGHT] == -1 || noAdjust[EN_RIGHT] ) { borders[EN_RIGHT] = CM_EdgePlaneNum( grid, gridPlanes, i, j, 1 ); } @@ -1601,7 +1601,7 @@ void CM_TraceThroughPatchCollide( traceWork_t *tw, const struct patchCollide_s * continue; } if (hit) { - Vector4Copy(plane, bestplane); + VectorCopy4(plane, bestplane); } for ( j = 0 ; j < facet->numBorders ; j++ ) { planes = &pc->planes[ facet->borderPlanes[j] ]; @@ -1642,7 +1642,7 @@ void CM_TraceThroughPatchCollide( traceWork_t *tw, const struct patchCollide_s * } if (hit) { hitnum = j; - Vector4Copy(plane, bestplane); + VectorCopy4(plane, bestplane); } } if (j < facet->numBorders) continue; diff --git a/code/qcommon/common.cpp b/code/qcommon/common.cpp index 0a23d628ee..a1e73e496a 100644 --- a/code/qcommon/common.cpp +++ b/code/qcommon/common.cpp @@ -866,7 +866,7 @@ int Com_EventLoop( void ) { case SE_NONE: break; case SE_KEY: - CL_KeyEvent( ev.evValue, ev.evValue2, ev.evTime ); + CL_KeyEvent( ev.evValue, (qboolean)ev.evValue2, ev.evTime ); break; case SE_CHAR: CL_CharEvent( ev.evValue ); diff --git a/code/qcommon/files.cpp b/code/qcommon/files.cpp index 69e3df8cf1..24e9290891 100644 --- a/code/qcommon/files.cpp +++ b/code/qcommon/files.cpp @@ -661,7 +661,7 @@ qboolean FS_MoveUserGenFile( const char *filename_src, const char *filename_dst FS_CheckFilenameIsMutable( to_ospath, __func__ ); remove( to_ospath ); - return !rename( from_ospath, to_ospath ); + return (qboolean)!rename( from_ospath, to_ospath ); } /* diff --git a/code/qcommon/net_chan.cpp b/code/qcommon/net_chan.cpp index 337427b2e4..79bc3336ea 100644 --- a/code/qcommon/net_chan.cpp +++ b/code/qcommon/net_chan.cpp @@ -424,7 +424,7 @@ qboolean NET_CompareAdr (netadr_t a, netadr_t b) qboolean NET_IsLocalAddress( netadr_t adr ) { - return adr.type == NA_LOOPBACK; + return (qboolean)(adr.type == NA_LOOPBACK); } diff --git a/code/qcommon/q_math.cpp b/code/qcommon/q_math.cpp index 9be0a9c22a..73ff310764 100644 --- a/code/qcommon/q_math.cpp +++ b/code/qcommon/q_math.cpp @@ -25,922 +25,3 @@ along with this program; if not, see . // q_math.c -- stateless support routines that are included in each code module #include "../game/common_headers.h" - -const vec3_t vec3_origin = {0,0,0}; -const vec3_t axisDefault[3] = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } }; - -vec4_t colorTable[CT_MAX] = -{ -{0, 0, 0, 0}, // CT_NONE -{0, 0, 0, 1}, // CT_BLACK -{1, 0, 0, 1}, // CT_RED -{0, 1, 0, 1}, // CT_GREEN -{0, 0, 1, 1}, // CT_BLUE -{1, 1, 0, 1}, // CT_YELLOW -{1, 0, 1, 1}, // CT_MAGENTA -{0, 1, 1, 1}, // CT_CYAN -{1, 1, 1, 1}, // CT_WHITE -{0.75f, 0.75f, 0.75f, 1}, // CT_LTGREY -{0.50f, 0.50f, 0.50f, 1}, // CT_MDGREY -{0.25f, 0.25f, 0.25f, 1}, // CT_DKGREY -{0.15f, 0.15f, 0.15f, 1}, // CT_DKGREY2 - -{0.992f, 0.652f, 0.0f, 1}, // CT_VLTORANGE -- needs values -{0.810f, 0.530f, 0.0f, 1}, // CT_LTORANGE -{0.610f, 0.330f, 0.0f, 1}, // CT_DKORANGE -{0.402f, 0.265f, 0.0f, 1}, // CT_VDKORANGE - -{0.503f, 0.375f, 0.996f, 1}, // CT_VLTBLUE1 -{0.367f, 0.261f, 0.722f, 1}, // CT_LTBLUE1 -{0.199f, 0.0f, 0.398f, 1}, // CT_DKBLUE1 -{0.160f, 0.117f, 0.324f, 1}, // CT_VDKBLUE1 - -{0.300f, 0.628f, 0.816f, 1}, // CT_VLTBLUE2 -- needs values -{0.300f, 0.628f, 0.816f, 1}, // CT_LTBLUE2 -{0.191f, 0.289f, 0.457f, 1}, // CT_DKBLUE2 -{0.125f, 0.250f, 0.324f, 1}, // CT_VDKBLUE2 - -{0.796f, 0.398f, 0.199f, 1}, // CT_VLTBROWN1 -- needs values -{0.796f, 0.398f, 0.199f, 1}, // CT_LTBROWN1 -{0.558f, 0.207f, 0.027f, 1}, // CT_DKBROWN1 -{0.328f, 0.125f, 0.035f, 1}, // CT_VDKBROWN1 - -{0.996f, 0.796f, 0.398f, 1}, // CT_VLTGOLD1 -- needs values -{0.996f, 0.796f, 0.398f, 1}, // CT_LTGOLD1 -{0.605f, 0.441f, 0.113f, 1}, // CT_DKGOLD1 -{0.386f, 0.308f, 0.148f, 1}, // CT_VDKGOLD1 - -{0.648f, 0.562f, 0.784f, 1}, // CT_VLTPURPLE1 -- needs values -{0.648f, 0.562f, 0.784f, 1}, // CT_LTPURPLE1 -{0.437f, 0.335f, 0.597f, 1}, // CT_DKPURPLE1 -{0.308f, 0.269f, 0.375f, 1}, // CT_VDKPURPLE1 - -{0.816f, 0.531f, 0.710f, 1}, // CT_VLTPURPLE2 -- needs values -{0.816f, 0.531f, 0.710f, 1}, // CT_LTPURPLE2 -{0.566f, 0.269f, 0.457f, 1}, // CT_DKPURPLE2 -{0.343f, 0.226f, 0.316f, 1}, // CT_VDKPURPLE2 - -{0.929f, 0.597f, 0.929f, 1}, // CT_VLTPURPLE3 -{0.570f, 0.371f, 0.570f, 1}, // CT_LTPURPLE3 -{0.355f, 0.199f, 0.355f, 1}, // CT_DKPURPLE3 -{0.285f, 0.136f, 0.230f, 1}, // CT_VDKPURPLE3 - -{0.953f, 0.378f, 0.250f, 1}, // CT_VLTRED1 -{0.953f, 0.378f, 0.250f, 1}, // CT_LTRED1 -{0.593f, 0.121f, 0.109f, 1}, // CT_DKRED1 -{0.429f, 0.171f, 0.113f, 1}, // CT_VDKRED1 -{.25f, 0, 0, 1}, // CT_VDKRED -{.70f, 0, 0, 1}, // CT_DKRED - -{0.717f, 0.902f, 1.0f, 1}, // CT_VLTAQUA -{0.574f, 0.722f, 0.804f, 1}, // CT_LTAQUA -{0.287f, 0.361f, 0.402f, 1}, // CT_DKAQUA -{0.143f, 0.180f, 0.201f, 1}, // CT_VDKAQUA - -{0.871f, 0.386f, 0.375f, 1}, // CT_LTPINK -{0.435f, 0.193f, 0.187f, 1}, // CT_DKPINK -{ 0, .5f, .5f, 1}, // CT_LTCYAN -{ 0, .25f, .25f, 1}, // CT_DKCYAN -{ .179f, .51f, .92f, 1}, // CT_LTBLUE3 -{ .199f, .71f, .92f, 1}, // CT_LTBLUE3 -{ .5f, .05f, .4f, 1}, // CT_DKBLUE3 - -{ 0.0f, .613f, .097f, 1}, // CT_HUD_GREEN -{ 0.835f, .015f, .015f, 1}, // CT_HUD_RED -{ .567f, .685f, 1.0f, .75f}, // CT_ICON_BLUE -{ .515f, .406f, .507f, 1}, // CT_NO_AMMO_RED - -{ 1.0f, .658f, .062f, 1}, // CT_HUD_ORANGE -{ 0.549f, .854f, 1.0f, 1.0f}, // CT_TITLE -}; - -vec4_t g_color_table[Q_COLOR_BITS+1] = { - { 0.0f, 0.0f, 0.0f, 1.0f }, // black - { 1.0f, 0.0f, 0.0f, 1.0f }, // red - { 0.0f, 1.0f, 0.0f, 1.0f }, // green - { 1.0f, 1.0f, 0.0f, 1.0f }, // yellow - { 0.0f, 0.0f, 1.0f, 1.0f }, // blue - { 0.0f, 1.0f, 1.0f, 1.0f }, // cyan - { 1.0f, 0.0f, 1.0f, 1.0f }, // magenta - { 1.0f, 1.0f, 1.0f, 1.0f }, // white - { 1.0f, 0.5f, 0.0f, 1.0f }, // orange - { 0.5f, 0.5f, 0.5f, 1.0f }, // md.grey -}; - -vec3_t bytedirs[NUMVERTEXNORMALS] = -{ -{-0.525731f, 0.000000f, 0.850651f}, {-0.442863f, 0.238856f, 0.864188f}, -{-0.295242f, 0.000000f, 0.955423f}, {-0.309017f, 0.500000f, 0.809017f}, -{-0.162460f, 0.262866f, 0.951056f}, {0.000000f, 0.000000f, 1.000000f}, -{0.000000f, 0.850651f, 0.525731f}, {-0.147621f, 0.716567f, 0.681718f}, -{0.147621f, 0.716567f, 0.681718f}, {0.000000f, 0.525731f, 0.850651f}, -{0.309017f, 0.500000f, 0.809017f}, {0.525731f, 0.000000f, 0.850651f}, -{0.295242f, 0.000000f, 0.955423f}, {0.442863f, 0.238856f, 0.864188f}, -{0.162460f, 0.262866f, 0.951056f}, {-0.681718f, 0.147621f, 0.716567f}, -{-0.809017f, 0.309017f, 0.500000f},{-0.587785f, 0.425325f, 0.688191f}, -{-0.850651f, 0.525731f, 0.000000f},{-0.864188f, 0.442863f, 0.238856f}, -{-0.716567f, 0.681718f, 0.147621f},{-0.688191f, 0.587785f, 0.425325f}, -{-0.500000f, 0.809017f, 0.309017f}, {-0.238856f, 0.864188f, 0.442863f}, -{-0.425325f, 0.688191f, 0.587785f}, {-0.716567f, 0.681718f, -0.147621f}, -{-0.500000f, 0.809017f, -0.309017f}, {-0.525731f, 0.850651f, 0.000000f}, -{0.000000f, 0.850651f, -0.525731f}, {-0.238856f, 0.864188f, -0.442863f}, -{0.000000f, 0.955423f, -0.295242f}, {-0.262866f, 0.951056f, -0.162460f}, -{0.000000f, 1.000000f, 0.000000f}, {0.000000f, 0.955423f, 0.295242f}, -{-0.262866f, 0.951056f, 0.162460f}, {0.238856f, 0.864188f, 0.442863f}, -{0.262866f, 0.951056f, 0.162460f}, {0.500000f, 0.809017f, 0.309017f}, -{0.238856f, 0.864188f, -0.442863f},{0.262866f, 0.951056f, -0.162460f}, -{0.500000f, 0.809017f, -0.309017f},{0.850651f, 0.525731f, 0.000000f}, -{0.716567f, 0.681718f, 0.147621f}, {0.716567f, 0.681718f, -0.147621f}, -{0.525731f, 0.850651f, 0.000000f}, {0.425325f, 0.688191f, 0.587785f}, -{0.864188f, 0.442863f, 0.238856f}, {0.688191f, 0.587785f, 0.425325f}, -{0.809017f, 0.309017f, 0.500000f}, {0.681718f, 0.147621f, 0.716567f}, -{0.587785f, 0.425325f, 0.688191f}, {0.955423f, 0.295242f, 0.000000f}, -{1.000000f, 0.000000f, 0.000000f}, {0.951056f, 0.162460f, 0.262866f}, -{0.850651f, -0.525731f, 0.000000f},{0.955423f, -0.295242f, 0.000000f}, -{0.864188f, -0.442863f, 0.238856f}, {0.951056f, -0.162460f, 0.262866f}, -{0.809017f, -0.309017f, 0.500000f}, {0.681718f, -0.147621f, 0.716567f}, -{0.850651f, 0.000000f, 0.525731f}, {0.864188f, 0.442863f, -0.238856f}, -{0.809017f, 0.309017f, -0.500000f}, {0.951056f, 0.162460f, -0.262866f}, -{0.525731f, 0.000000f, -0.850651f}, {0.681718f, 0.147621f, -0.716567f}, -{0.681718f, -0.147621f, -0.716567f},{0.850651f, 0.000000f, -0.525731f}, -{0.809017f, -0.309017f, -0.500000f}, {0.864188f, -0.442863f, -0.238856f}, -{0.951056f, -0.162460f, -0.262866f}, {0.147621f, 0.716567f, -0.681718f}, -{0.309017f, 0.500000f, -0.809017f}, {0.425325f, 0.688191f, -0.587785f}, -{0.442863f, 0.238856f, -0.864188f}, {0.587785f, 0.425325f, -0.688191f}, -{0.688191f, 0.587785f, -0.425325f}, {-0.147621f, 0.716567f, -0.681718f}, -{-0.309017f, 0.500000f, -0.809017f}, {0.000000f, 0.525731f, -0.850651f}, -{-0.525731f, 0.000000f, -0.850651f}, {-0.442863f, 0.238856f, -0.864188f}, -{-0.295242f, 0.000000f, -0.955423f}, {-0.162460f, 0.262866f, -0.951056f}, -{0.000000f, 0.000000f, -1.000000f}, {0.295242f, 0.000000f, -0.955423f}, -{0.162460f, 0.262866f, -0.951056f}, {-0.442863f, -0.238856f, -0.864188f}, -{-0.309017f, -0.500000f, -0.809017f}, {-0.162460f, -0.262866f, -0.951056f}, -{0.000000f, -0.850651f, -0.525731f}, {-0.147621f, -0.716567f, -0.681718f}, -{0.147621f, -0.716567f, -0.681718f}, {0.000000f, -0.525731f, -0.850651f}, -{0.309017f, -0.500000f, -0.809017f}, {0.442863f, -0.238856f, -0.864188f}, -{0.162460f, -0.262866f, -0.951056f}, {0.238856f, -0.864188f, -0.442863f}, -{0.500000f, -0.809017f, -0.309017f}, {0.425325f, -0.688191f, -0.587785f}, -{0.716567f, -0.681718f, -0.147621f}, {0.688191f, -0.587785f, -0.425325f}, -{0.587785f, -0.425325f, -0.688191f}, {0.000000f, -0.955423f, -0.295242f}, -{0.000000f, -1.000000f, 0.000000f}, {0.262866f, -0.951056f, -0.162460f}, -{0.000000f, -0.850651f, 0.525731f}, {0.000000f, -0.955423f, 0.295242f}, -{0.238856f, -0.864188f, 0.442863f}, {0.262866f, -0.951056f, 0.162460f}, -{0.500000f, -0.809017f, 0.309017f}, {0.716567f, -0.681718f, 0.147621f}, -{0.525731f, -0.850651f, 0.000000f}, {-0.238856f, -0.864188f, -0.442863f}, -{-0.500000f, -0.809017f, -0.309017f}, {-0.262866f, -0.951056f, -0.162460f}, -{-0.850651f, -0.525731f, 0.000000f}, {-0.716567f, -0.681718f, -0.147621f}, -{-0.716567f, -0.681718f, 0.147621f}, {-0.525731f, -0.850651f, 0.000000f}, -{-0.500000f, -0.809017f, 0.309017f}, {-0.238856f, -0.864188f, 0.442863f}, -{-0.262866f, -0.951056f, 0.162460f}, {-0.864188f, -0.442863f, 0.238856f}, -{-0.809017f, -0.309017f, 0.500000f}, {-0.688191f, -0.587785f, 0.425325f}, -{-0.681718f, -0.147621f, 0.716567f}, {-0.442863f, -0.238856f, 0.864188f}, -{-0.587785f, -0.425325f, 0.688191f}, {-0.309017f, -0.500000f, 0.809017f}, -{-0.147621f, -0.716567f, 0.681718f}, {-0.425325f, -0.688191f, 0.587785f}, -{-0.162460f, -0.262866f, 0.951056f}, {0.442863f, -0.238856f, 0.864188f}, -{0.162460f, -0.262866f, 0.951056f}, {0.309017f, -0.500000f, 0.809017f}, -{0.147621f, -0.716567f, 0.681718f}, {0.000000f, -0.525731f, 0.850651f}, -{0.425325f, -0.688191f, 0.587785f}, {0.587785f, -0.425325f, 0.688191f}, -{0.688191f, -0.587785f, 0.425325f}, {-0.955423f, 0.295242f, 0.000000f}, -{-0.951056f, 0.162460f, 0.262866f}, {-1.000000f, 0.000000f, 0.000000f}, -{-0.850651f, 0.000000f, 0.525731f}, {-0.955423f, -0.295242f, 0.000000f}, -{-0.951056f, -0.162460f, 0.262866f}, {-0.864188f, 0.442863f, -0.238856f}, -{-0.951056f, 0.162460f, -0.262866f}, {-0.809017f, 0.309017f, -0.500000f}, -{-0.864188f, -0.442863f, -0.238856f}, {-0.951056f, -0.162460f, -0.262866f}, -{-0.809017f, -0.309017f, -0.500000f}, {-0.681718f, 0.147621f, -0.716567f}, -{-0.681718f, -0.147621f, -0.716567f}, {-0.850651f, 0.000000f, -0.525731f}, -{-0.688191f, 0.587785f, -0.425325f}, {-0.587785f, 0.425325f, -0.688191f}, -{-0.425325f, 0.688191f, -0.587785f}, {-0.425325f, -0.688191f, -0.587785f}, -{-0.587785f, -0.425325f, -0.688191f}, {-0.688191f, -0.587785f, -0.425325f} -}; - -//============================================================== - - -//======================================================= - -/* -erandom - -This function produces a random number with a exponential -distribution and the specified mean value. -*/ -float erandom( float mean ) { - float r; - - do { - r = random(); - } while ( r == 0.0 ); - - return -mean * log( r ); -} - -signed char ClampChar( int i ) { - if ( i < -128 ) { - return -128; - } - if ( i > 127 ) { - return 127; - } - return i; -} - -signed short ClampShort( int i ) { - if ( i < (short)0x8000 ) { - return (short)0x8000; - } - if ( i > 0x7fff ) { - return 0x7fff; - } - return i; -} - - -// this isn't a real cheap function to call! -int DirToByte( vec3_t dir ) { - int i, best; - float d, bestd; - - if ( !dir ) { - return 0; - } - - bestd = 0; - best = 0; - for (i=0 ; i bestd) - { - bestd = d; - best = i; - } - } - - return best; -} - -void ByteToDir( int b, vec3_t dir ) { - if ( b < 0 || b >= NUMVERTEXNORMALS ) { - VectorCopy( vec3_origin, dir ); - return; - } - VectorCopy (bytedirs[b], dir); -} - - -unsigned ColorBytes3 (float r, float g, float b) { - unsigned i; - - ( (byte *)&i )[0] = r * 255; - ( (byte *)&i )[1] = g * 255; - ( (byte *)&i )[2] = b * 255; - - return i; -} - -unsigned ColorBytes4 (float r, float g, float b, float a) { - unsigned i; - - ( (byte *)&i )[0] = r * 255; - ( (byte *)&i )[1] = g * 255; - ( (byte *)&i )[2] = b * 255; - ( (byte *)&i )[3] = a * 255; - - return i; -} - -float NormalizeColor( const vec3_t in, vec3_t out ) { - float max; - - max = in[0]; - if ( in[1] > max ) { - max = in[1]; - } - if ( in[2] > max ) { - max = in[2]; - } - - if ( !max ) { - VectorClear( out ); - } else { - out[0] = in[0] / max; - out[1] = in[1] / max; - out[2] = in[2] / max; - } - return max; -} - -void VectorAdvance( const vec3_t veca, const float scale, const vec3_t vecb, vec3_t vecc) -{ - vecc[0] = veca[0] + (scale * (vecb[0] - veca[0])); - vecc[1] = veca[1] + (scale * (vecb[1] - veca[1])); - vecc[2] = veca[2] + (scale * (vecb[2] - veca[2])); -} - -//============================================================================ - -/* -===================== -PlaneFromPoints - -Returns false if the triangle is degenrate. -The normal will point out of the clock for clockwise ordered points -===================== -*/ -qboolean PlaneFromPoints( vec4_t plane, const vec3_t a, const vec3_t b, const vec3_t c ) { - vec3_t d1, d2; - - VectorSubtract( b, a, d1 ); - VectorSubtract( c, a, d2 ); - CrossProduct( d2, d1, plane ); - if ( VectorNormalize( plane ) == 0 ) { - return qfalse; - } - - plane[3] = DotProduct( a, plane ); - return qtrue; -} - -/* -=============== -RotatePointAroundVector - -From q3mme -=============== -*/ -void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float degrees ) { - float m[3][3]; - float c, s, t; - - degrees = DEG2RAD( degrees ); - s = sinf( degrees ); - c = cosf( degrees ); - t = 1 - c; - - m[0][0] = t*dir[0]*dir[0] + c; - m[0][1] = t*dir[0]*dir[1] + s*dir[2]; - m[0][2] = t*dir[0]*dir[2] - s*dir[1]; - - m[1][0] = t*dir[0]*dir[1] - s*dir[2]; - m[1][1] = t*dir[1]*dir[1] + c; - m[1][2] = t*dir[1]*dir[2] + s*dir[0]; - - m[2][0] = t*dir[0]*dir[2] + s*dir[1]; - m[2][1] = t*dir[1]*dir[2] - s*dir[0]; - m[2][2] = t*dir[2]*dir[2] + c; - VectorRotate( point, m, dst ); -} - -/* -=============== -RotateAroundDirection -=============== -*/ -void RotateAroundDirection( vec3_t axis[3], float yaw ) { - - // create an arbitrary axis[1] - PerpendicularVector( axis[1], axis[0] ); - - // rotate it around axis[0] by yaw - if ( yaw ) { - vec3_t temp; - - VectorCopy( axis[1], temp ); - RotatePointAroundVector( axis[1], axis[0], temp, yaw ); - } - - // cross to get axis[2] - CrossProduct( axis[0], axis[1], axis[2] ); -} - - - -void vectoangles( const vec3_t value1, vec3_t angles ) { - float forward; - float yaw, pitch; - - if ( value1[1] == 0 && value1[0] == 0 ) { - yaw = 0; - if ( value1[2] > 0 ) { - pitch = 90; - } - else { - pitch = 270; - } - } - else { - if ( value1[0] ) { - yaw = ( atan2 ( value1[1], value1[0] ) * 180 / M_PI ); - } - else if ( value1[1] > 0 ) { - yaw = 90; - } - else { - yaw = 270; - } - if ( yaw < 0 ) { - yaw += 360; - } - - forward = sqrt ( value1[0]*value1[0] + value1[1]*value1[1] ); - pitch = ( atan2(value1[2], forward) * 180 / M_PI ); - if ( pitch < 0 ) { - pitch += 360; - } - } - - angles[PITCH] = -pitch; - angles[YAW] = yaw; - angles[ROLL] = 0; -} - -void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal ) -{ - float d; - vec3_t n; - float inv_denom; - - inv_denom = 1.0F / DotProduct( normal, normal ); - - d = DotProduct( normal, p ) * inv_denom; - - n[0] = normal[0] * inv_denom; - n[1] = normal[1] * inv_denom; - n[2] = normal[2] * inv_denom; - - dst[0] = p[0] - d * n[0]; - dst[1] = p[1] - d * n[1]; - dst[2] = p[2] - d * n[2]; -} - -/* -================ -MakeNormalVectors - -Given a normalized forward vector, create two -other perpendicular vectors -================ -*/ -void MakeNormalVectors( const vec3_t forward, vec3_t right, vec3_t up) { - float d; - - // this rotate and negate guarantees a vector - // not colinear with the original - right[1] = -forward[0]; - right[2] = forward[1]; - right[0] = forward[2]; - - d = DotProduct (right, forward); - VectorMA (right, -d, forward, right); - VectorNormalize (right); - CrossProduct (right, forward, up); -} - -//============================================================================ - -/* -** float q_rsqrt( float number ) -*/ -float Q_rsqrt( float number ) -{ - byteAlias_t t; - float x2, y; - const float threehalfs = 1.5F; - - x2 = number * 0.5F; - y = number; - t.f = number; - t.i = 0x5f3759df - ( t.i >> 1 ); // what the fuck? - y = t.f; - y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration -// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed - - assert( !Q_isnan(y) ); // bk010122 - FPE? - return y; -} - -float Q_fabs( float f ) { - byteAlias_t fi; - fi.f = f; - fi.i &= 0x7FFFFFFF; - return fi.f; -} - -//============================================================ - - -//float AngleMod(float a) { -// a = (360.0/65536) * ((int)(a*(65536/360.0)) & 65535); -// return a; -//} - - - -//============================================================ - - -/* -================= -SetPlaneSignbits -================= -*/ -void SetPlaneSignbits (cplane_t *out) { - int bits, j; - - // for fast box on planeside test - bits = 0; - for (j=0 ; j<3 ; j++) { - if (out->normal[j] < 0) { - bits |= 1<signbits = bits; -} - -/* -================== -BoxOnPlaneSide - -Returns 1, 2, or 1 + 2 -================== -*/ -int BoxOnPlaneSide(vec3_t emins, vec3_t emaxs, struct cplane_s *p) -{ - float dist[2]; - int sides, b, i; - - // fast axial cases - if (p->type < 3) - { - if (p->dist <= emins[p->type]) - return 1; - if (p->dist >= emaxs[p->type]) - return 2; - return 3; - } - - // general case - dist[0] = dist[1] = 0; - if (p->signbits < 8) // >= 8: default case is original code (dist[0]=dist[1]=0) - { - for (i=0 ; i<3 ; i++) - { - b = (p->signbits >> i) & 1; - dist[ b] += p->normal[i]*emaxs[i]; - dist[!b] += p->normal[i]*emins[i]; - } - } - - sides = 0; - if (dist[0] >= p->dist) - sides = 1; - if (dist[1] < p->dist) - sides |= 2; - - return sides; -} - -/* -================= -RadiusFromBounds -================= -*/ -float RadiusFromBounds( const vec3_t mins, const vec3_t maxs ) { - int i; - vec3_t corner; - float a, b; - - for (i=0 ; i<3 ; i++) { - a = Q_fabs( mins[i] ); - b = Q_fabs( maxs[i] ); - corner[i] = a > b ? a : b; - } - - return VectorLength (corner); -} - - -void ClearBounds( vec3_t mins, vec3_t maxs ) { - mins[0] = mins[1] = mins[2] = WORLD_SIZE; //99999; // I used WORLD_SIZE instead of MAX_WORLD_COORD... - maxs[0] = maxs[1] = maxs[2] = -WORLD_SIZE; //-99999; // ... so it would definately be beyond furthese legal. -} - - -vec_t DistanceHorizontal( const vec3_t p1, const vec3_t p2 ) { - vec3_t v; - - VectorSubtract( p2, p1, v ); - return sqrt( v[0]*v[0] + v[1]*v[1] ); //Leave off the z component -} - -vec_t DistanceHorizontalSquared( const vec3_t p1, const vec3_t p2 ) { - vec3_t v; - - VectorSubtract( p2, p1, v ); - return v[0]*v[0] + v[1]*v[1]; //Leave off the z component -} - -int Q_log2( int val ) { - int answer; - - answer = 0; - while ( ( val>>=1 ) != 0 ) { - answer++; - } - return answer; -} - -/* -================= -PlaneTypeForNormal -================= -*/ -int PlaneTypeForNormal (vec3_t normal) { - if ( normal[0] == 1.0 ) - return PLANE_X; - if ( normal[1] == 1.0 ) - return PLANE_Y; - if ( normal[2] == 1.0 ) - return PLANE_Z; - - return PLANE_NON_AXIAL; -} - - - -/* -================ -MatrixMultiply -================ -*/ -void MatrixMultiply(float in1[3][3], float in2[3][3], float out[3][3]) { - out[0][0] = in1[0][0] * in2[0][0] + in1[0][1] * in2[1][0] + - in1[0][2] * in2[2][0]; - out[0][1] = in1[0][0] * in2[0][1] + in1[0][1] * in2[1][1] + - in1[0][2] * in2[2][1]; - out[0][2] = in1[0][0] * in2[0][2] + in1[0][1] * in2[1][2] + - in1[0][2] * in2[2][2]; - out[1][0] = in1[1][0] * in2[0][0] + in1[1][1] * in2[1][0] + - in1[1][2] * in2[2][0]; - out[1][1] = in1[1][0] * in2[0][1] + in1[1][1] * in2[1][1] + - in1[1][2] * in2[2][1]; - out[1][2] = in1[1][0] * in2[0][2] + in1[1][1] * in2[1][2] + - in1[1][2] * in2[2][2]; - out[2][0] = in1[2][0] * in2[0][0] + in1[2][1] * in2[1][0] + - in1[2][2] * in2[2][0]; - out[2][1] = in1[2][0] * in2[0][1] + in1[2][1] * in2[1][1] + - in1[2][2] * in2[2][1]; - out[2][2] = in1[2][0] * in2[0][2] + in1[2][1] * in2[1][2] + - in1[2][2] * in2[2][2]; -} - - -void AngleVectors( const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up) { - float angle; - static float sr, sp, sy, cr, cp, cy; - // static to help MS compiler fp bugs - - angle = angles[YAW] * (M_PI*2 / 360.0); - sy = sin(angle); - cy = cos(angle); - angle = angles[PITCH] * (M_PI*2 / 360.0); - sp = sin(angle); - cp = cos(angle); - - if (forward) - { - forward[0] = cp*cy; - forward[1] = cp*sy; - forward[2] = -sp; - } - if (right || up) - { - angle = angles[ROLL] * (M_PI*2 / 360.0); - sr = sin(angle); - cr = cos(angle); - if (right) - { - right[0] = (-sr*sp*cy + cr*sy); - right[1] = (-sr*sp*sy + -cr*cy); - right[2] = -sr*cp; - } - if (up) - { - up[0] = (cr*sp*cy + sr*sy); - up[1] = (cr*sp*sy + -sr*cy); - up[2] = cr*cp; - } - } -} - -/* -** assumes "src" is normalized -*/ -void PerpendicularVector( vec3_t dst, const vec3_t src ) -{ - int pos; - int i; - float minelem = 1.0F; - vec3_t tempvec; - - /* - ** find the smallest magnitude axially aligned vector - ** bias towards using z instead of x or y - */ - for ( pos = 0, i = 2; i >= 0; i-- ) - { - if ( Q_fabs( src[i] ) < minelem ) - { - pos = i; - minelem = Q_fabs( src[i] ); - } - } - tempvec[0] = tempvec[1] = tempvec[2] = 0.0F; - tempvec[pos] = 1.0F; - - /* - ** project the point onto the plane defined by src - */ - ProjectPointOnPlane( dst, tempvec, src ); - - /* - ** normalize the result - */ - VectorNormalize( dst ); -} - -float Q_powf( float x, int y ) { - float r = x; - for ( y--; y>0; y-- ) - r *= x; - return r; -} - -/* -------------------------- -DotProductNormalize -------------------------- -*/ - -float DotProductNormalize( const vec3_t inVec1, const vec3_t inVec2 ) -{ - vec3_t v1, v2; - - VectorNormalize2( inVec1, v1 ); - VectorNormalize2( inVec2, v2 ); - - return DotProduct(v1, v2); -} - -/* -------------------------- -G_FindClosestPointOnLineSegment -------------------------- -*/ - -qboolean G_FindClosestPointOnLineSegment( const vec3_t start, const vec3_t end, const vec3_t from, vec3_t result ) -{ - vec3_t vecStart2From, vecStart2End, vecEnd2Start, vecEnd2From; - float distEnd2From, distEnd2Result, theta, cos_theta; - - //Find the perpendicular vector to vec from start to end - VectorSubtract( from, start, vecStart2From); - VectorSubtract( end, start, vecStart2End); - - float dot = DotProductNormalize( vecStart2From, vecStart2End ); - - if ( dot <= 0 ) - { - //The perpendicular would be beyond or through the start point - VectorCopy( start, result ); - return qfalse; - } - - if ( dot == 1 ) - { - //parallel, closer of 2 points will be the target - if( (VectorLengthSquared( vecStart2From )) < (VectorLengthSquared( vecStart2End )) ) - { - VectorCopy( from, result ); - } - else - { - VectorCopy( end, result ); - } - return qfalse; - } - - //Try other end - VectorSubtract( from, end, vecEnd2From); - VectorSubtract( start, end, vecEnd2Start); - - dot = DotProductNormalize( vecEnd2From, vecEnd2Start ); - - if ( dot <= 0 ) - {//The perpendicular would be beyond or through the start point - VectorCopy( end, result ); - return qfalse; - } - - if ( dot == 1 ) - {//parallel, closer of 2 points will be the target - if( (VectorLengthSquared( vecEnd2From )) < (VectorLengthSquared( vecEnd2Start ))) - { - VectorCopy( from, result ); - } - else - { - VectorCopy( end, result ); - } - return qfalse; - } - - // /| - // c / | - // / |a - // theta /)__| - // b - //cos(theta) = b / c - //solve for b - //b = cos(theta) * c - - //angle between vecs end2from and end2start, should be between 0 and 90 - theta = 90 * (1 - dot);//theta - - //Get length of side from End2Result using sine of theta - distEnd2From = VectorLength( vecEnd2From );//c - cos_theta = cos(DEG2RAD(theta));//cos(theta) - distEnd2Result = cos_theta * distEnd2From;//b - - //Extrapolate to find result - VectorNormalize( vecEnd2Start ); - VectorMA( end, distEnd2Result, vecEnd2Start, result ); - - //perpendicular intersection is between the 2 endpoints - return qtrue; -} - -float G_PointDistFromLineSegment( const vec3_t start, const vec3_t end, const vec3_t from ) -{ - vec3_t vecStart2From, vecStart2End, vecEnd2Start, vecEnd2From, intersection; - float distEnd2From, distStart2From, distEnd2Result, theta, cos_theta; - - //Find the perpendicular vector to vec from start to end - VectorSubtract( from, start, vecStart2From); - VectorSubtract( end, start, vecStart2End); - VectorSubtract( from, end, vecEnd2From); - VectorSubtract( start, end, vecEnd2Start); - - float dot = DotProductNormalize( vecStart2From, vecStart2End ); - - distStart2From = Distance( start, from ); - distEnd2From = Distance( end, from ); - - if ( dot <= 0 ) - { - //The perpendicular would be beyond or through the start point - return distStart2From; - } - - if ( dot == 1 ) - { - //parallel, closer of 2 points will be the target - return ((distStart2From. // q_shared.h -- included first by ALL program modules. // A user mod should never modify this file +#include "qcommon/q_math_common.h" +#include "qcommon/q_color.h" + #ifdef _MSC_VER #pragma warning(disable : 4018) // signed/unsigned mismatch @@ -160,61 +163,17 @@ along with this program; if not, see . // TYPE DEFINITIONS // ================================================================ -typedef unsigned char byte; -typedef unsigned short word; -typedef unsigned long ulong; - -typedef enum { qfalse=0, qtrue } qboolean; -#define qboolean int //don't want strict type checking on the qboolean - #define Q_min(x,y) ((x)<(y)?(x):(y)) #define Q_max(x,y) ((x)>(y)?(x):(y)) -#if defined (_MSC_VER) && (_MSC_VER >= 1600) - - #include - - // vsnprintf is ISO/IEC 9899:1999 - // abstracting this to make it portable - int Q_vsnprintf( char *str, size_t size, const char *format, va_list args ); - -#elif defined (_MSC_VER) - - #include - - typedef signed __int64 int64_t; - typedef signed __int32 int32_t; - typedef signed __int16 int16_t; - typedef signed __int8 int8_t; - typedef unsigned __int64 uint64_t; - typedef unsigned __int32 uint32_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int8 uint8_t; - +#if defined (_MSC_VER) // vsnprintf is ISO/IEC 9899:1999 // abstracting this to make it portable int Q_vsnprintf( char *str, size_t size, const char *format, va_list args ); #else // not using MSVC - - #if !defined(__STDC_LIMIT_MACROS) - #define __STDC_LIMIT_MACROS - #endif - #include - #define Q_vsnprintf vsnprintf - #endif -// 32 bit field aliasing -typedef union byteAlias_u { - float f; - int32_t i; - uint32_t ui; - qboolean qb; - byte b[4]; - char c[4]; -} byteAlias_t; - typedef int32_t qhandle_t, thandle_t, fxHandle_t, sfxHandle_t, fileHandle_t, clipHandle_t; #define NULL_HANDLE ((qhandle_t)0) @@ -357,40 +316,6 @@ typedef enum { #define CIN_shader 16 -/* -============================================================== - -MATHLIB - -============================================================== -*/ - -typedef float vec_t; -typedef float vec2_t[2], vec3_t[3], vec4_t[4], vec5_t[5]; -typedef int ivec2_t[2], ivec3_t[3], ivec4_t[4], ivec5_t[5]; -typedef vec3_t vec3pair_t[2], matrix3_t[3]; - -typedef int fixed4_t, fixed8_t, fixed16_t; - -#ifndef M_PI -#define M_PI 3.14159265358979323846 // matches value in gcc v2 math.h -#endif - -#if defined(_MSC_VER) -static __inline long Q_ftol(float f) -{ - return (long)f; -} -#else -static inline long Q_ftol(float f) -{ - return (long)f; -} -#endif - -#define NUMVERTEXNORMALS 162 -extern vec3_t bytedirs[NUMVERTEXNORMALS]; - // all drawing is done to a 640*480 virtual screen size // and will be automatically scaled to the real resolution #define SCREEN_WIDTH 640 @@ -408,129 +333,6 @@ extern vec3_t bytedirs[NUMVERTEXNORMALS]; #define GIANTCHAR_WIDTH 32 #define GIANTCHAR_HEIGHT 48 -typedef enum -{ -CT_NONE, -CT_BLACK, -CT_RED, -CT_GREEN, -CT_BLUE, -CT_YELLOW, -CT_MAGENTA, -CT_CYAN, -CT_WHITE, -CT_LTGREY, -CT_MDGREY, -CT_DKGREY, -CT_DKGREY2, - -CT_VLTORANGE, -CT_LTORANGE, -CT_DKORANGE, -CT_VDKORANGE, - -CT_VLTBLUE1, -CT_LTBLUE1, -CT_DKBLUE1, -CT_VDKBLUE1, - -CT_VLTBLUE2, -CT_LTBLUE2, -CT_DKBLUE2, -CT_VDKBLUE2, - -CT_VLTBROWN1, -CT_LTBROWN1, -CT_DKBROWN1, -CT_VDKBROWN1, - -CT_VLTGOLD1, -CT_LTGOLD1, -CT_DKGOLD1, -CT_VDKGOLD1, - -CT_VLTPURPLE1, -CT_LTPURPLE1, -CT_DKPURPLE1, -CT_VDKPURPLE1, - -CT_VLTPURPLE2, -CT_LTPURPLE2, -CT_DKPURPLE2, -CT_VDKPURPLE2, - -CT_VLTPURPLE3, -CT_LTPURPLE3, -CT_DKPURPLE3, -CT_VDKPURPLE3, - -CT_VLTRED1, -CT_LTRED1, -CT_DKRED1, -CT_VDKRED1, -CT_VDKRED, -CT_DKRED, - -CT_VLTAQUA, -CT_LTAQUA, -CT_DKAQUA, -CT_VDKAQUA, - -CT_LTPINK, -CT_DKPINK, -CT_LTCYAN, -CT_DKCYAN, -CT_LTBLUE3, -CT_BLUE3, -CT_DKBLUE3, - -CT_HUD_GREEN, -CT_HUD_RED, -CT_ICON_BLUE, -CT_NO_AMMO_RED, -CT_HUD_ORANGE, - -CT_TITLE, - -CT_MAX -} ct_table_t; - -extern vec4_t colorTable[CT_MAX]; - -#define Q_COLOR_ESCAPE '^' -#define Q_COLOR_BITS 0xF // was 7 - -// you MUST have the last bit on here about colour strings being less than 7 or taiwanese strings register as colour!!!! -#define Q_IsColorString(p) ( p && *(p) == Q_COLOR_ESCAPE && *((p)+1) && *((p)+1) != Q_COLOR_ESCAPE && *((p)+1) <= '9' && *((p)+1) >= '0' ) -#define Q_IsColorStringExt(p) ((p) && *(p) == Q_COLOR_ESCAPE && *((p)+1) && *((p)+1) >= '0' && *((p)+1) <= '9') // ^[0-9] - -#define COLOR_BLACK '0' -#define COLOR_RED '1' -#define COLOR_GREEN '2' -#define COLOR_YELLOW '3' -#define COLOR_BLUE '4' -#define COLOR_CYAN '5' -#define COLOR_MAGENTA '6' -#define COLOR_WHITE '7' -#define COLOR_ORANGE '8' -#define COLOR_GREY '9' -#define ColorIndex(c) ( ( (c) - '0' ) & Q_COLOR_BITS ) - -#define S_COLOR_BLACK "^0" -#define S_COLOR_RED "^1" -#define S_COLOR_GREEN "^2" -#define S_COLOR_YELLOW "^3" -#define S_COLOR_BLUE "^4" -#define S_COLOR_CYAN "^5" -#define S_COLOR_MAGENTA "^6" -#define S_COLOR_WHITE "^7" -#define S_COLOR_ORANGE "^8" -#define S_COLOR_GREY "^9" - -extern vec4_t g_color_table[Q_COLOR_BITS+1]; - -#define MAKERGB( v, r, g, b ) v[0]=r;v[1]=g;v[2]=b -#define MAKERGBA( v, r, g, b, a ) v[0]=r;v[1]=g;v[2]=b;v[3]=a // Player weapons effects typedef enum @@ -546,436 +348,10 @@ typedef enum #define MAX_BATTERIES 2500 -#define PI_DIV_180 0.017453292519943295769236907684886 -#define INV_PI_DIV_180 57.295779513082320876798154814105 - -// Punish Aurelio if you don't like these performance enhancements. :-) -#define DEG2RAD( a ) ( ( (a) * PI_DIV_180 ) ) -#define RAD2DEG( a ) ( ( (a) * INV_PI_DIV_180 ) ) - -// A divide can be avoided by just multiplying by PI_DIV_180 which is PI divided by 180. - Aurelio -//#define DEG2RAD( a ) ( ( (a) * M_PI ) / 180.0F ) -// A divide can be avoided by just multiplying by INV_PI_DIV_180(inverse of PI/180) which is 180 divided by PI. - Aurelio -//#define RAD2DEG( a ) ( ( (a) * 180.0f ) / M_PI ) - #define ENUM2STRING(arg) { #arg,arg } -struct cplane_s; - -extern const vec3_t vec3_origin; -extern const vec3_t axisDefault[3]; - -#define nanmask (255<<23) - -#define IS_NAN(x) (((*(int *)&x)&nanmask)==nanmask) - -float Q_fabs( float f ); -float Q_rsqrt( float f ); // reciprocal square root - -#define SQRTFAST( x ) ( 1.0f / Q_rsqrt( x ) ) - -signed char ClampChar( int i ); -signed short ClampShort( int i ); - -float Q_powf( float x, int y ); - -// this isn't a real cheap function to call! -int DirToByte( vec3_t dir ); -void ByteToDir( int b, vec3_t dir ); - -#define _DotProduct(x,y) ((x)[0]*(y)[0]+(x)[1]*(y)[1]+(x)[2]*(y)[2]) -#define _VectorSubtract(a,b,c) ((c)[0]=(a)[0]-(b)[0],(c)[1]=(a)[1]-(b)[1],(c)[2]=(a)[2]-(b)[2]) -#define _VectorAdd(a,b,c) ((c)[0]=(a)[0]+(b)[0],(c)[1]=(a)[1]+(b)[1],(c)[2]=(a)[2]+(b)[2]) -#define _VectorCopy(a,b) ((b)[0]=(a)[0],(b)[1]=(a)[1],(b)[2]=(a)[2]) -#define _VectorScale(v, s, o) ((o)[0]=(v)[0]*(s),(o)[1]=(v)[1]*(s),(o)[2]=(v)[2]*(s)) -#define _VectorMA(v, s, b, o) ((o)[0]=(v)[0]+(b)[0]*(s),(o)[1]=(v)[1]+(b)[1]*(s),(o)[2]=(v)[2]+(b)[2]*(s)) - - -#define VectorClear(a) ((a)[0]=(a)[1]=(a)[2]=0) -#define VectorNegate(a,b) ((b)[0]=-(a)[0],(b)[1]=-(a)[1],(b)[2]=-(a)[2]) -#define VectorSet(v, x, y, z) ((v)[0]=(x), (v)[1]=(y), (v)[2]=(z)) -#define Vector4Copy(a,b) ((b)[0]=(a)[0],(b)[1]=(a)[1],(b)[2]=(a)[2],(b)[3]=(a)[3]) - -#define SnapVector(v) {v[0]=(int)v[0];v[1]=(int)v[1];v[2]=(int)v[2];} - -// just in case you do't want to use the macros -inline void VectorMA( const vec3_t veca, float scale, const vec3_t vecb, vec3_t vecc) { - vecc[0] = veca[0] + scale*vecb[0]; - vecc[1] = veca[1] + scale*vecb[1]; - vecc[2] = veca[2] + scale*vecb[2]; -} - -inline vec_t DotProduct( const vec3_t v1, const vec3_t v2 ) { - return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]; -} - -inline void CrossProduct( const vec3_t v1, const vec3_t v2, vec3_t cross ) { - cross[0] = v1[1]*v2[2] - v1[2]*v2[1]; - cross[1] = v1[2]*v2[0] - v1[0]*v2[2]; - cross[2] = v1[0]*v2[1] - v1[1]*v2[0]; -} - -inline void VectorSubtract( const vec3_t veca, const vec3_t vecb, vec3_t o ) { - o[0] = veca[0]-vecb[0]; - o[1] = veca[1]-vecb[1]; - o[2] = veca[2]-vecb[2]; -} - -inline void VectorAdd( const vec3_t veca, const vec3_t vecb, vec3_t o ) { - o[0] = veca[0]+vecb[0]; - o[1] = veca[1]+vecb[1]; - o[2] = veca[2]+vecb[2]; -} - -inline void VectorCopy( const vec3_t in, vec3_t out ) { - out[0] = in[0]; - out[1] = in[1]; - out[2] = in[2]; -} - -inline void VectorScale( const vec3_t i, vec_t scale, vec3_t o ) { - o[0] = i[0]*scale; - o[1] = i[1]*scale; - o[2] = i[2]*scale; -} - -float DotProductNormalize( const vec3_t inVec1, const vec3_t inVec2 ); - -unsigned ColorBytes3 (float r, float g, float b); -unsigned ColorBytes4 (float r, float g, float b, float a); - -float NormalizeColor( const vec3_t in, vec3_t out ); -float RadiusFromBounds( const vec3_t mins, const vec3_t maxs ); - -void ClearBounds( vec3_t mins, vec3_t maxs ); - -inline void AddPointToBounds( const vec3_t v, vec3_t mins, vec3_t maxs ) { - if ( v[0] < mins[0] ) { - mins[0] = v[0]; - } - if ( v[0] > maxs[0]) { - maxs[0] = v[0]; - } - - if ( v[1] < mins[1] ) { - mins[1] = v[1]; - } - if ( v[1] > maxs[1]) { - maxs[1] = v[1]; - } - - if ( v[2] < mins[2] ) { - mins[2] = v[2]; - } - if ( v[2] > maxs[2]) { - maxs[2] = v[2]; - } -} - -inline int VectorCompare( const vec3_t v1, const vec3_t v2 ) { - if (v1[0] != v2[0] || v1[1] != v2[1] || v1[2] != v2[2]) { - return 0; - } - return 1; -} - -//NOTE: less precise -inline int VectorCompare2( const vec3_t v1, const vec3_t v2 ) { - if ( v1[0] > v2[0]+0.0001f || v1[0] < v2[0]-0.0001f - || v1[1] > v2[1]+0.0001f || v1[1] < v2[1]-0.0001f - || v1[2] > v2[2]+0.0001f || v1[2] < v2[2]-0.0001f ) { - return 0; - } - return 1; -} -inline vec_t VectorLength( const vec3_t v ) { - return (vec_t)sqrt (v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); -} - -inline vec_t VectorLengthSquared( const vec3_t v ) { - return (v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); -} - -inline vec_t Distance( const vec3_t p1, const vec3_t p2 ) { - vec3_t v; - - VectorSubtract (p2, p1, v); - return VectorLength( v ); -} - -inline vec_t DistanceSquared( const vec3_t p1, const vec3_t p2 ) { - vec3_t v; - - VectorSubtract (p2, p1, v); - return v[0]*v[0] + v[1]*v[1] + v[2]*v[2]; -} - -// fast vector normalize routine that does not check to make sure -// that length != 0, nor does it return length, uses rsqrt approximation -inline void VectorNormalizeFast( vec3_t v ) -{ - float ilength; - - ilength = Q_rsqrt( DotProduct( v, v ) ); - - v[0] *= ilength; - v[1] *= ilength; - v[2] *= ilength; -} - -inline void VectorInverse( vec3_t v ){ - v[0] = -v[0]; - v[1] = -v[1]; - v[2] = -v[2]; -} - -inline void VectorRotate( const vec3_t in, vec3_t matrix[3], vec3_t out ) -{ - out[0] = DotProduct( in, matrix[0] ); - out[1] = DotProduct( in, matrix[1] ); - out[2] = DotProduct( in, matrix[2] ); -} - -//if length is 0, v is untouched otherwise v is normalized -inline vec_t VectorNormalize( vec3_t v ) { - float length, ilength; - - length = v[0]*v[0] + v[1]*v[1] + v[2]*v[2]; - length = sqrt (length); - - if ( length > 0.0001f ) { - ilength = 1/length; - v[0] *= ilength; - v[1] *= ilength; - v[2] *= ilength; - } - - return length; -} - - -//if length is 0, out is cleared, otherwise out is normalized -inline vec_t VectorNormalize2( const vec3_t v, vec3_t out) { - float length, ilength; - - length = v[0]*v[0] + v[1]*v[1] + v[2]*v[2]; - length = sqrt (length); - - if (length) - { - ilength = 1/length; - out[0] = v[0]*ilength; - out[1] = v[1]*ilength; - out[2] = v[2]*ilength; - } else { - VectorClear( out ); - } - - return length; -} - -int Q_log2(int val); - -inline qboolean Q_isnan ( float f ) { -#ifdef _MSC_VER - return _isnan (f); -#elif defined(__cplusplus) - return std::isnan (f); -#else - return isnan (f); -#endif -} - -inline int Q_rand( int *seed ) { - *seed = (69069 * *seed + 1); - return *seed; -} - -inline float Q_random( int *seed ) { - return ( Q_rand( seed ) & 0xffff ) / (float)0x10000; -} - -inline float Q_crandom( int *seed ) { - return 2.0F * ( Q_random( seed ) - 0.5f ); -} - -// Returns an integer min <= x <= max (ie inclusive) -inline int Q_irand(int min, int max) { - assert(min <= max); - return (rand() % (max - min + 1)) + min; -} - -#define random() (rand() / (float)RAND_MAX) - -// Returns a float min <= x < max (exclusive; will get max - 0.00001; but never max -inline float Q_flrand(float min, float max) { - return (random() * (max - min)) + min; -} - -//returns a float between -1 and 1.0 -inline float crandom() { - return Q_flrand(-1.0f, 1.0f); -} - -float erandom( float mean ); - -void AngleVectors( const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up); - -/* -================= -AnglesToAxis -================= -*/ -inline void AnglesToAxis( const vec3_t angles, vec3_t axis[3] ) { - vec3_t right; - - // angle vectors returns "right" instead of "y axis" - AngleVectors( angles, axis[0], right, axis[2] ); - VectorSubtract( vec3_origin, right, axis[1] ); -} - -inline void AxisClear( vec3_t axis[3] ) { - axis[0][0] = 1; - axis[0][1] = 0; - axis[0][2] = 0; - axis[1][0] = 0; - axis[1][1] = 1; - axis[1][2] = 0; - axis[2][0] = 0; - axis[2][1] = 0; - axis[2][2] = 1; -} - -inline void AxisCopy( const vec3_t in[3], vec3_t out[3] ) { - VectorCopy( in[0], out[0] ); - VectorCopy( in[1], out[1] ); - VectorCopy( in[2], out[2] ); -} - -void vectoangles( const vec3_t value1, vec3_t angles); - -vec_t DistanceHorizontal( const vec3_t p1, const vec3_t p2 ); -vec_t DistanceHorizontalSquared( const vec3_t p1, const vec3_t p2 ); - -inline vec_t GetYawForDirection( const vec3_t p1, const vec3_t p2 ) { - vec3_t v, angles; - - VectorSubtract( p2, p1, v ); - vectoangles( v, angles ); - - return angles[YAW]; -} - -inline void GetAnglesForDirection( const vec3_t p1, const vec3_t p2, vec3_t out ) { - vec3_t v; - - VectorSubtract( p2, p1, v ); - vectoangles( v, out ); -} - - -void SetPlaneSignbits( struct cplane_s *out ); -int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *plane); -//float AngleMod(float a); - -inline float LerpAngle (float from, float to, float frac) { - float a; - - if ( to - from > 180 ) { - to -= 360; - } - if ( to - from < -180 ) { - to += 360; - } - a = from + frac * (to - from); - - return a; -} - -/* -================= -AngleSubtract - -Always returns a value from -180 to 180 -================= -*/ -inline float AngleSubtract( float a1, float a2 ) { - float a; - - a = a1 - a2; - while ( a > 180 ) { - a -= 360; - } - while ( a < -180 ) { - a += 360; - } - return a; -} - -inline void AnglesSubtract( vec3_t v1, vec3_t v2, vec3_t v3 ) { - v3[0] = AngleSubtract( v1[0], v2[0] ); - v3[1] = AngleSubtract( v1[1], v2[1] ); - v3[2] = AngleSubtract( v1[2], v2[2] ); -} - -/* -================= -AngleNormalize360 - -returns angle normalized to the range [0 <= angle < 360] -================= -*/ -inline float AngleNormalize360 ( float angle ) { - return (360.0 / 65536) * ((int)(angle * (65536 / 360.0)) & 65535); -} - -/* -================= -AngleNormalize180 - -returns angle normalized to the range [-180 < angle <= 180] -================= -*/ -inline float AngleNormalize180 ( float angle ) { - angle = AngleNormalize360( angle ); - if ( angle > 180.0 ) { - angle -= 360.0; - } - return angle; -} - -/* -================= -AngleDelta - -returns the normalized delta from angle1 to angle2 -================= -*/ -inline float AngleDelta ( float angle1, float angle2 ) { - return AngleNormalize180( angle1 - angle2 ); -} - -qboolean PlaneFromPoints( vec4_t plane, const vec3_t a, const vec3_t b, const vec3_t c ); -void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal ); -void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float degrees ); -void RotateAroundDirection( vec3_t axis[3], float yaw ); -void MakeNormalVectors( const vec3_t forward, vec3_t right, vec3_t up ); -// perpendicular vector could be replaced by this - -int PlaneTypeForNormal (vec3_t normal); - -void MatrixMultiply(float in1[3][3], float in2[3][3], float out[3][3]); -void PerpendicularVector( vec3_t dst, const vec3_t src ); - - - //============================================= -int Com_Clampi( int min, int max, int value ); -float Com_Clamp( float min, float max, float value ); -int Com_AbsClampi( int min, int max, int value ); -float Com_AbsClamp( float min, float max, float value ); - char *COM_SkipPath( char *pathname ); const char *COM_GetExtension( const char *name ); void COM_StripExtension( const char *in, char *out, int destsize ); @@ -987,7 +363,7 @@ void COM_BeginParseSession( void ); void COM_EndParseSession( void ); // For compatibility with shared code -static inline void COM_BeginParseSession( const char *sessionName ) +QINLINE void COM_BeginParseSession( const char *sessionName ) { COM_BeginParseSession(); } @@ -1191,24 +567,6 @@ COLLISION DETECTION #include "../game/surfaceflags.h" // shared with the q3map utility -// plane types are used to speed some tests -// 0-2 are axial planes -#define PLANE_X 0 -#define PLANE_Y 1 -#define PLANE_Z 2 -#define PLANE_NON_AXIAL 3 - - -// plane_t structure -// !!! if this is changed, it must be changed in asm code too !!! -typedef struct cplane_s { - vec3_t normal; - float dist; - byte type; // for fast side tests: 0,1,2 = axial, 3 = nonaxial - byte signbits; // signx + (signy<<1) + (signz<<2), used as lookup during collision - byte pad[2]; -} cplane_t; - /* Ghoul2 Insert Start */ @@ -2021,8 +1379,8 @@ typedef struct playerState_s { // or descend them as classes - so not every client has all this info saberInfo_t saber[MAX_SABERS]; qboolean dualSabers; - qboolean SaberStaff( void ) { return ( saber[0].type == SABER_STAFF || (dualSabers && saber[1].type == SABER_STAFF) ); }; - qboolean SaberActive() { return ( saber[0].Active() || (dualSabers&&saber[1].Active()) ); }; + qboolean SaberStaff( void ) { return (qboolean)( saber[0].type == SABER_STAFF || (dualSabers && saber[1].type == SABER_STAFF) ); }; + qboolean SaberActive() { return (qboolean)( saber[0].Active() || (dualSabers&&saber[1].Active()) ); }; void SetSaberLength( float length ) { saber[0].SetLength( length ); diff --git a/code/qcommon/safe/memory.h b/code/qcommon/safe/memory.h index 1f21985234..1299509102 100644 --- a/code/qcommon/safe/memory.h +++ b/code/qcommon/safe/memory.h @@ -13,7 +13,7 @@ namespace Zone { namespace detail { - inline void* Malloc( int iSize, memtag_t eTag, bool bZeroit = false ) + inline void* Malloc( int iSize, memtag_t eTag, qboolean bZeroit = qfalse ) { #ifdef _JK2EXE return Z_Malloc( iSize, eTag, bZeroit ); diff --git a/code/qcommon/tri_coll_test.cpp b/code/qcommon/tri_coll_test.cpp index a6f790ff61..b9a5bb9d23 100644 --- a/code/qcommon/tri_coll_test.cpp +++ b/code/qcommon/tri_coll_test.cpp @@ -116,11 +116,11 @@ e=Ax*Cy-Ay*Cx; \ if(f>0) \ { \ - if(e>=0 && e<=f) return 1; \ + if(e>=0 && e<=f) return qtrue; \ } \ else \ { \ - if(e<=0 && e>=f) return 1; \ + if(e<=0 && e>=f) return qtrue; \ } \ } @@ -158,7 +158,7 @@ d2=a*V0[i0]+b*V0[i1]+c; \ if(d0*d1>0.0) \ { \ - if(d0*d2>0.0) return 1; \ + if(d0*d2>0.0) return qtrue; \ } \ } @@ -248,7 +248,7 @@ qboolean tri_tri_intersect(vec3_t V0,vec3_t V1,vec3_t V2, du0du2=du0*du2; if(du0du1>0.0f && du0du2>0.0f) /* same sign on all of them + not equal 0 ? */ - return 0; /* no intersection occurs */ + return qfalse; /* no intersection occurs */ /* compute plane of triangle (U0,U1,U2) */ SUB(E1,U1,U0); @@ -272,7 +272,7 @@ qboolean tri_tri_intersect(vec3_t V0,vec3_t V1,vec3_t V2, dv0dv2=dv0*dv2; if(dv0dv1>0.0f && dv0dv2>0.0f) /* same sign on all of them + not equal 0 ? */ - return 0; /* no intersection occurs */ + return qfalse; /* no intersection occurs */ /* compute direction of intersection line */ CROSS(D,N1,N2); diff --git a/code/qcommon/z_memman_pc.cpp b/code/qcommon/z_memman_pc.cpp index f1002058d8..b2cab8b793 100644 --- a/code/qcommon/z_memman_pc.cpp +++ b/code/qcommon/z_memman_pc.cpp @@ -524,7 +524,7 @@ qboolean Z_IsFromZone(const void *pvAddress, memtag_t eTag) return qfalse; } - return pMemory->iSize; + return (qboolean)(pMemory->iSize != 0); } // stats-query function to ask how big a malloc is... diff --git a/code/rd-common/tr_public.h b/code/rd-common/tr_public.h index d0eded623d..2be819e78c 100644 --- a/code/rd-common/tr_public.h +++ b/code/rd-common/tr_public.h @@ -312,7 +312,7 @@ typedef struct { int (*G2API_GetSurfaceRenderStatus)(CGhoul2Info *ghlInfo, const char *surfaceName); int (*G2API_GetTime)(int argTime); void (*G2API_GiveMeVectorFromMatrix)(mdxaBone_t &boltMatrix, Eorientations flags, vec3_t &vec); - int (*G2API_HaveWeGhoul2Models)(CGhoul2Info_v &ghoul2); + qboolean (*G2API_HaveWeGhoul2Models)(CGhoul2Info_v &ghoul2); qboolean (*G2API_IKMove)(CGhoul2Info_v &ghoul2, int time, sharedIKMoveParams_t *params); int (*G2API_InitGhoul2Model)(CGhoul2Info_v &ghoul2, const char *fileName, int modelIndex, qhandle_t customSkin, qhandle_t customShader, int modelFlags, int lodBias); diff --git a/code/rd-vanilla/G2_API.cpp b/code/rd-vanilla/G2_API.cpp index 2129aabe24..c5394c33ba 100644 --- a/code/rd-vanilla/G2_API.cpp +++ b/code/rd-vanilla/G2_API.cpp @@ -1815,7 +1815,7 @@ void G2API_ListBones(CGhoul2Info *ghlInfo, int frame) // decide if we have Ghoul2 models associated with this ghoul list or not qboolean G2API_HaveWeGhoul2Models(CGhoul2Info_v &ghoul2) { - return !!ghoul2.IsValid(); + return (qboolean)ghoul2.IsValid(); } // run through the Ghoul2 models and set each of the mModel values to the correct one from the cgs.gameModel offset lsit diff --git a/code/rd-vanilla/G2_bones.cpp b/code/rd-vanilla/G2_bones.cpp index a710d20294..dac2ff0ae9 100644 --- a/code/rd-vanilla/G2_bones.cpp +++ b/code/rd-vanilla/G2_bones.cpp @@ -438,7 +438,7 @@ qboolean G2_Remove_Bone (CGhoul2Info *ghlInfo, boneInfo_v &blist, const char *bo int index = G2_Find_Bone(ghlInfo, blist, boneName); if (index==-1) { - return false; + return qfalse; } return G2_Remove_Bone_Index(blist, index); diff --git a/code/rd-vanilla/tr_WorldEffects.cpp b/code/rd-vanilla/tr_WorldEffects.cpp index 9fecd7fe86..6b63507704 100644 --- a/code/rd-vanilla/tr_WorldEffects.cpp +++ b/code/rd-vanilla/tr_WorldEffects.cpp @@ -1033,7 +1033,7 @@ class CParticleCloud // Create The Image //------------------ - mImage = R_FindImageFile(texturePath, false, false, false, GL_CLAMP); + mImage = R_FindImageFile(texturePath, qfalse, qfalse, qfalse, GL_CLAMP); if (!mImage) { Com_Error(ERR_DROP, "CParticleCloud: Could not texture %s", texturePath); diff --git a/code/rd-vanilla/tr_bsp.cpp b/code/rd-vanilla/tr_bsp.cpp index 159e780580..5ea038d541 100644 --- a/code/rd-vanilla/tr_bsp.cpp +++ b/code/rd-vanilla/tr_bsp.cpp @@ -247,8 +247,11 @@ static void R_LoadLightmaps( lump_t *l, const char *psMapName, world_t &worldDat image[j*4+3] = 255; } } - tr.lightmaps[worldData.startLightMapIndex+i] = R_CreateImage( va("$%s/lightmap%d",sMapName,worldData.startLightMapIndex+i), image, - LIGHTMAP_SIZE, LIGHTMAP_SIZE, GL_RGBA, qfalse, qfalse, r_ext_compressed_lightmaps->integer, GL_CLAMP ); + tr.lightmaps[worldData.startLightMapIndex+i] = R_CreateImage( + va("$%s/lightmap%d", sMapName, worldData.startLightMapIndex+i), + image, LIGHTMAP_SIZE, LIGHTMAP_SIZE, GL_RGBA, qfalse, qfalse, + (qboolean)(r_ext_compressed_lightmaps->integer != 0), + GL_CLAMP); } if ( r_lightmap->integer == 2 ) { @@ -1132,7 +1135,7 @@ static void R_LoadFogs( lump_t *l, lump_t *brushesLump, lump_t *sidesLump, world out->parms.depthForOpaque = 0.0f; out->colorInt = 0x00000000; out->tcScale = 0.0f; - out->hasSurface = false; + out->hasSurface = qfalse; } } diff --git a/code/rd-vanilla/tr_ghoul2.cpp b/code/rd-vanilla/tr_ghoul2.cpp index d81e7fc7e9..ced4bf23af 100644 --- a/code/rd-vanilla/tr_ghoul2.cpp +++ b/code/rd-vanilla/tr_ghoul2.cpp @@ -2554,7 +2554,7 @@ void R_AddGhoulSurfaces( trRefEntity_t *ent ) { shader_t *gore_shader = 0; #endif int fogNum = 0; - bool personalModel; + qboolean personalModel; int cull; int i, whichLod, j; skin_t *skin; @@ -2590,7 +2590,7 @@ void R_AddGhoulSurfaces( trRefEntity_t *ent ) { RootMatrix(ghoul2,currentTime, ent->e.modelScale,rootMatrix); // don't add third_person objects if not in a portal - personalModel = (ent->e.renderfx & RF_THIRD_PERSON) && !tr.viewParms.isPortal; + personalModel = (qboolean)((ent->e.renderfx & RF_THIRD_PERSON) && !tr.viewParms.isPortal); int modelList[32]; assert(ghoul2.size()<=31); diff --git a/code/rd-vanilla/tr_image.cpp b/code/rd-vanilla/tr_image.cpp index 5fc5306a56..276698ec0b 100644 --- a/code/rd-vanilla/tr_image.cpp +++ b/code/rd-vanilla/tr_image.cpp @@ -699,7 +699,7 @@ static void Upload32( unsigned *data, goto done; } - R_LightScaleTexture (data, width, height, !mipmap ); + R_LightScaleTexture (data, width, height, (qboolean)!mipmap); qglTexImage2D (GL_TEXTURE_2D, 0, *pformat, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data ); @@ -1034,7 +1034,7 @@ image_t *R_CreateImage( const char *name, const byte *pic, int width, int height GL_Bind(image); Upload32( (unsigned *)pic, format, - image->mipmap, + (qboolean)image->mipmap, allowPicmip, isLightmap, allowTC, diff --git a/code/rd-vanilla/tr_light.cpp b/code/rd-vanilla/tr_light.cpp index cef398a226..d176af56c5 100644 --- a/code/rd-vanilla/tr_light.cpp +++ b/code/rd-vanilla/tr_light.cpp @@ -96,7 +96,7 @@ void R_DlightBmodel( bmodel_t *bmodel, qboolean NoLight ) { } } - tr.currentEntity->needDlights = (mask != 0); + tr.currentEntity->needDlights = (qboolean)(mask != 0); tr.currentEntity->dlightBits = mask; diff --git a/code/rd-vanilla/tr_mesh.cpp b/code/rd-vanilla/tr_mesh.cpp index e4dc3963e9..c9aa9fa0e8 100644 --- a/code/rd-vanilla/tr_mesh.cpp +++ b/code/rd-vanilla/tr_mesh.cpp @@ -312,7 +312,7 @@ void R_AddMD3Surfaces( trRefEntity_t *ent ) { qboolean personalModel; // don't add third_person objects if not in a portal - personalModel = (ent->e.renderfx & RF_THIRD_PERSON) && !tr.viewParms.isPortal; + personalModel = (qboolean)((ent->e.renderfx & RF_THIRD_PERSON) && !tr.viewParms.isPortal); if ( ent->e.renderfx & RF_CAP_FRAMES) { if (ent->e.frame > tr.currentModel->md3[0]->numFrames-1) diff --git a/code/rd-vanilla/tr_model.cpp b/code/rd-vanilla/tr_model.cpp index f19fc92994..9b2d74fdaa 100644 --- a/code/rd-vanilla/tr_model.cpp +++ b/code/rd-vanilla/tr_model.cpp @@ -166,9 +166,7 @@ qboolean RE_RegisterModels_GetDiskFile( const char *psModelFileName, void **ppvB ri.FS_ReadFile( sModelName, ppvBuffer ); *pqbAlreadyCached = qfalse; - const bool bSuccess = !!(*ppvBuffer); - - return bSuccess; + return (qboolean)(*ppvBuffer != 0); } else { @@ -277,11 +275,11 @@ qboolean RE_RegisterModels_LevelLoadEnd(qboolean bDeleteEverythingNotUsedThisLev if (bDeleteEverythingNotUsedThisLevel) { - bDeleteThis = (CachedModel.iLastLevelUsedOn != RE_RegisterMedia_GetLevel()); + bDeleteThis = (qboolean)(CachedModel.iLastLevelUsedOn != RE_RegisterMedia_GetLevel()); } else { - bDeleteThis = (CachedModel.iLastLevelUsedOn < RE_RegisterMedia_GetLevel()); + bDeleteThis = (qboolean)(CachedModel.iLastLevelUsedOn < RE_RegisterMedia_GetLevel()); } // if it wasn't used on this level, dump it... diff --git a/code/rd-vanilla/tr_quicksprite.cpp b/code/rd-vanilla/tr_quicksprite.cpp index 5aeab21b3d..9a0a02e1ac 100644 --- a/code/rd-vanilla/tr_quicksprite.cpp +++ b/code/rd-vanilla/tr_quicksprite.cpp @@ -190,11 +190,11 @@ void CQuickSpriteSystem::StartGroup(textureBundle_t *bundle, uint32_t glbits, in if(cullingOn) { - mTurnCullBackOn=true; + mTurnCullBackOn=qtrue; } else { - mTurnCullBackOn=false; + mTurnCullBackOn=qfalse; } qglDisable(GL_CULL_FACE); } diff --git a/code/rd-vanilla/tr_shader.cpp b/code/rd-vanilla/tr_shader.cpp index 217e5c522b..0ebcdf6551 100644 --- a/code/rd-vanilla/tr_shader.cpp +++ b/code/rd-vanilla/tr_shader.cpp @@ -1246,7 +1246,12 @@ static qboolean ParseStage( shaderStage_t *stage, const char **text ) } else { - stage->bundle[0].image = R_FindImageFile( token, !shader.noMipMaps, !shader.noPicMip, !shader.noTC, GL_REPEAT ); + stage->bundle[0].image = R_FindImageFile( + token, + (qboolean)!shader.noMipMaps, + (qboolean)!shader.noPicMip, + (qboolean)!shader.noTC, + GL_REPEAT ); if ( !stage->bundle[0].image ) { ri.Printf( PRINT_WARNING, "WARNING: R_FindImageFile could not find '%s' in shader '%s'\n", token, shader.name ); @@ -1266,7 +1271,12 @@ static qboolean ParseStage( shaderStage_t *stage, const char **text ) return qfalse; } - stage->bundle[0].image = R_FindImageFile( token, !shader.noMipMaps, !shader.noPicMip, !shader.noTC, GL_CLAMP ); + stage->bundle[0].image = R_FindImageFile( + token, + (qboolean)!shader.noMipMaps, + (qboolean)!shader.noPicMip, + (qboolean)!shader.noTC, + GL_CLAMP ); if ( !stage->bundle[0].image ) { ri.Printf( PRINT_WARNING, "WARNING: R_FindImageFile could not find '%s' in shader '%s'\n", token, shader.name ); @@ -1302,7 +1312,12 @@ static qboolean ParseStage( shaderStage_t *stage, const char **text ) } num = stage->bundle[0].numImageAnimations; if ( num < MAX_IMAGE_ANIMATIONS ) { - images[num] = R_FindImageFile( token, !shader.noMipMaps, !shader.noPicMip, !shader.noTC, bClamp?GL_CLAMP:GL_REPEAT ); + images[num] = R_FindImageFile( + token, + (qboolean)!shader.noMipMaps, + (qboolean)!shader.noPicMip, + (qboolean)!shader.noTC, + bClamp?GL_CLAMP:GL_REPEAT); if ( !images[num] ) { ri.Printf( PRINT_WARNING, "WARNING: R_FindImageFile could not find '%s' in shader '%s'\n", token, shader.name ); @@ -1942,7 +1957,7 @@ static void ParseSkyParms( const char **text ) { if ( strcmp( token, "-" ) ) { for (i=0 ; i<6 ; i++) { Com_sprintf( pathname, sizeof(pathname), "%s_%s", token, suf[i] ); - shader.sky->outerbox[i] = R_FindImageFile( ( char * ) pathname, qtrue, qtrue, !shader.noTC, GL_CLAMP ); + shader.sky->outerbox[i] = R_FindImageFile( ( char * ) pathname, qtrue, qtrue, (qboolean)!shader.noTC, GL_CLAMP ); if ( !shader.sky->outerbox[i] ) { if (i) { shader.sky->outerbox[i] = shader.sky->outerbox[i-1];//not found, so let's use the previous image @@ -3348,7 +3363,7 @@ static inline const int *R_FindLightmap( const int *lightmapIndex ) // attempt to load an external lightmap Com_sprintf( fileName, sizeof(fileName), "%s/" EXTERNAL_LIGHTMAP, tr.worldDir, *lightmapIndex ); - image = R_FindImageFile( fileName, qfalse, qfalse, r_ext_compressed_lightmaps->integer, GL_CLAMP ); + image = R_FindImageFile( fileName, qfalse, qfalse, (qboolean)(r_ext_compressed_lightmaps->integer != 0), GL_CLAMP ); if( image == NULL ) { return lightmapsVertex; diff --git a/code/rd-vanilla/tr_skin.cpp b/code/rd-vanilla/tr_skin.cpp index dbc6982634..92dbff92f5 100644 --- a/code/rd-vanilla/tr_skin.cpp +++ b/code/rd-vanilla/tr_skin.cpp @@ -167,7 +167,7 @@ int RE_GetAnimationCFG(const char *psCFGFilename, char *psDest, int iDestSize) // not found, so load it... // fileHandle_t f; - int iLen = ri.FS_FOpenFileRead( psCFGFilename, &f, FS_READ ); + int iLen = ri.FS_FOpenFileRead( psCFGFilename, &f, qfalse ); if (iLen <= 0) { return 0; diff --git a/code/rd-vanilla/tr_sky.cpp b/code/rd-vanilla/tr_sky.cpp index fe44363c79..4c4dfcfb4f 100644 --- a/code/rd-vanilla/tr_sky.cpp +++ b/code/rd-vanilla/tr_sky.cpp @@ -600,7 +600,7 @@ static void FillCloudBox( const shader_t *shader, int stage ) } // only add indexes for first stage - FillCloudySkySide( sky_mins_subd, sky_maxs_subd, ( stage == 0 ) ); + FillCloudySkySide( sky_mins_subd, sky_maxs_subd, (qboolean)( stage == 0 ) ); } } diff --git a/code/server/sv_game.cpp b/code/server/sv_game.cpp index 0d5d9aa3d4..253cca32a0 100644 --- a/code/server/sv_game.cpp +++ b/code/server/sv_game.cpp @@ -440,12 +440,12 @@ static void SV_G2API_AnimateG2Models( CGhoul2Info_v &ghoul2, int AcurrentTime, C re.G2API_AnimateG2Models( ghoul2, AcurrentTime, params ); } -static int SV_G2API_AttachEnt( int *boltInfo, CGhoul2Info *ghlInfoTo, int toBoltIndex, int entNum, int toModelNum ) +static qboolean SV_G2API_AttachEnt( int *boltInfo, CGhoul2Info *ghlInfoTo, int toBoltIndex, int entNum, int toModelNum ) { return re.G2API_AttachEnt( boltInfo, ghlInfoTo, toBoltIndex, entNum, toModelNum ); } -static int SV_G2API_AttachG2Model( CGhoul2Info *ghlInfo, CGhoul2Info *ghlInfoTo, int toBoltIndex, int toModel ) +static qboolean SV_G2API_AttachG2Model( CGhoul2Info *ghlInfo, CGhoul2Info *ghlInfoTo, int toBoltIndex, int toModel ) { return re.G2API_AttachG2Model( ghlInfo, ghlInfoTo, toBoltIndex, toModel ); } @@ -577,7 +577,7 @@ static void SV_G2API_GiveMeVectorFromMatrix( mdxaBone_t &boltMatrix, Eorientatio re.G2API_GiveMeVectorFromMatrix( boltMatrix, flags, vec ); } -static int SV_G2API_HaveWeGhoul2Models( CGhoul2Info_v &ghoul2 ) +static qboolean SV_G2API_HaveWeGhoul2Models( CGhoul2Info_v &ghoul2 ) { return re.G2API_HaveWeGhoul2Models( ghoul2 ); } diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 57b7bd42ae..d488cf2155 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -1130,7 +1130,7 @@ qboolean SG_ReadSavegame(const char *psPathlessBaseName) qbAutosave = ReadGame(); eSavedGameJustLoaded = (qbAutosave)?eAUTO:eFULL; - SV_SpawnServer(sMapCmd, eForceReload_NOTHING, (eSavedGameJustLoaded != eFULL) ); // note that this also trashes the whole G_Alloc pool as well (of course) + SV_SpawnServer(sMapCmd, eForceReload_NOTHING, (qboolean)(eSavedGameJustLoaded != eFULL) ); // note that this also trashes the whole G_Alloc pool as well (of course) // read in all the level data... // @@ -1445,7 +1445,7 @@ static int SG_Read_Actual(unsigned int chid, void *pvAddress, int iLength, void uiLoaded = SG_ReadBytes( &ulLoadedChid, sizeof(ulLoadedChid), fhSaveGame); uiLoaded+= SG_ReadBytes( &uiLoadedLength, sizeof(uiLoadedLength),fhSaveGame); - qboolean bBlockIsCompressed = ((int)uiLoadedLength < 0); + qboolean bBlockIsCompressed = (qboolean)((int)uiLoadedLength < 0); if ( bBlockIsCompressed) { uiLoadedLength = -((int)uiLoadedLength); @@ -1599,8 +1599,8 @@ void SG_TestSave(void) { if (sv_testsave->integer && sv.state == SS_GAME) { - WriteGame (false); - ge->WriteLevel(false); + WriteGame(qfalse); + ge->WriteLevel(qfalse); } } diff --git a/code/server/sv_snapshot.cpp b/code/server/sv_snapshot.cpp index 7a703ba6d4..9ca096f2c0 100644 --- a/code/server/sv_snapshot.cpp +++ b/code/server/sv_snapshot.cpp @@ -174,7 +174,7 @@ static void SV_WriteSnapshotToClient( client_t *client, msg_t *msg ) { MSG_WriteLong (msg, client->cmdNum); // we have executed up to here snapFlags = client->droppedCommands << 1; - client->droppedCommands = 0; + client->droppedCommands = qfalse; MSG_WriteByte (msg, snapFlags); diff --git a/code/server/sv_world.cpp b/code/server/sv_world.cpp index a56bace60c..be960b5286 100644 --- a/code/server/sv_world.cpp +++ b/code/server/sv_world.cpp @@ -719,7 +719,10 @@ void SV_ClipMoveToEntities( moveclip_t *clip ) { trace.entityNum = touch->s.number; clip->trace = trace; - clip->trace.startsolid |= oldStart; + if ( oldStart ) + { + clip->trace.startsolid = qtrue; + } } /* Ghoul2 Insert Start diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 1b21a399ef..c00e24c3b5 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -2265,7 +2265,7 @@ static qboolean UI_ParseColorData(char* buf, playerSpeciesInfo_t &species) if ( token[0] == 0 ) { COM_EndParseSession( ); - return species.ColorCount; + return (qboolean)(species.ColorCount != 0); } if (species.ColorCount >= species.ColorMax) @@ -2309,7 +2309,7 @@ bIsImageFile builds path and scans for valid image extentions ================= */ -static bool bIsImageFile(const char* dirptr, const char* skinname, qboolean building) +static qboolean IsImageFile(const char* dirptr, const char* skinname, qboolean building) { char fpath[MAX_QPATH]; int f; @@ -2331,10 +2331,10 @@ static bool bIsImageFile(const char* dirptr, const char* skinname, qboolean buil { ui.FS_FCloseFile(f); if ( building ) ui.R_RegisterShaderNoMip(fpath); - return true; + return qtrue; } - return false; + return qfalse; } static void UI_FreeSpecies( playerSpeciesInfo_t *species ) @@ -2452,7 +2452,7 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) filelen = strlen(fileptr); COM_StripExtension(fileptr,skinname, sizeof(skinname)); - if (bIsImageFile(dirptr, skinname, building)) + if (IsImageFile(dirptr, skinname, (qboolean)(building != 0))) { //if it exists if (Q_stricmpn(skinname,"head_",5) == 0) { diff --git a/code/ui/ui_shared.cpp b/code/ui/ui_shared.cpp index 220e74002c..df9d28ac31 100644 --- a/code/ui/ui_shared.cpp +++ b/code/ui/ui_shared.cpp @@ -5138,8 +5138,8 @@ qboolean String_Parse(const char **p, const char **out) token = COM_ParseExt(p, qfalse); if (token && token[0] != 0) { - *(out) = String_Alloc(token); - return *(out)!=NULL; + *out = String_Alloc(token); + return (qboolean)(*out != NULL); } return qfalse; } @@ -5790,7 +5790,7 @@ qboolean PC_ParseString(const char **string) hold = COM_ParseString(&parseData[parseDataCount].bufferCurrent,string); } - return(hold); + return (qboolean)(hold != 0); } qboolean PC_ParseInt(int *number) @@ -9142,7 +9142,7 @@ IsVisible */ qboolean IsVisible(int flags) { - return (flags & WINDOW_VISIBLE && !(flags & WINDOW_FADINGOUT)); + return (qboolean)((flags & WINDOW_VISIBLE && !(flags & WINDOW_FADINGOUT)) != 0); } /* @@ -9758,7 +9758,7 @@ qboolean Item_TextField_HandleKey(itemDef_t *item, int key) if ( key == A_INSERT || key == A_KP_0 ) { - DC->setOverstrikeMode(!DC->getOverstrikeMode()); + DC->setOverstrikeMode((qboolean)(!DC->getOverstrikeMode())); return qtrue; } } @@ -10967,9 +10967,9 @@ qboolean Item_HandleAccept(itemDef_t * item) if (item->accept) { Item_RunScript(item, item->accept); - return true; + return qtrue; } - return false; + return qfalse; } @@ -10985,9 +10985,9 @@ qboolean Item_HandleSelectionNext(itemDef_t * item) if (item->selectionNext) { Item_RunScript(item, item->selectionNext); - return true; + return qtrue; } - return false; + return qfalse; } //JLFDPADSCRIPT MPMOVED @@ -11002,9 +11002,9 @@ qboolean Item_HandleSelectionPrev(itemDef_t * item) if (item->selectionPrev) { Item_RunScript(item, item->selectionPrev); - return true; + return qtrue; } - return false; + return qfalse; } @@ -11137,7 +11137,7 @@ void Menu_HandleKey(menuDef_t *menu, int key, qboolean down) case A_F11: if (DC->getCVarValue("developer")) { - uis.debugMode ^= 1; + uis.debugMode = (qboolean)!uis.debugMode; } break; diff --git a/codemp/cgame/cg_main.c b/codemp/cgame/cg_main.c index dab48832d0..6ae460905b 100644 --- a/codemp/cgame/cg_main.c +++ b/codemp/cgame/cg_main.c @@ -42,90 +42,6 @@ Ghoul2 Insert End void CG_InitJetpackGhoul2(void); void CG_CleanJetpackGhoul2(void); -vec4_t colorTable[CT_MAX] = -{ - {0, 0, 0, 0}, // CT_NONE - {0, 0, 0, 1}, // CT_BLACK - {1, 0, 0, 1}, // CT_RED - {0, 1, 0, 1}, // CT_GREEN - {0, 0, 1, 1}, // CT_BLUE - {1, 1, 0, 1}, // CT_YELLOW - {1, 0, 1, 1}, // CT_MAGENTA - {0, 1, 1, 1}, // CT_CYAN - {1, 1, 1, 1}, // CT_WHITE - {0.75f, 0.75f, 0.75f, 1}, // CT_LTGREY - {0.50f, 0.50f, 0.50f, 1}, // CT_MDGREY - {0.25f, 0.25f, 0.25f, 1}, // CT_DKGREY - {0.15f, 0.15f, 0.15f, 1}, // CT_DKGREY2 - - {0.810f, 0.530f, 0.0f, 1}, // CT_VLTORANGE -- needs values - {0.810f, 0.530f, 0.0f, 1}, // CT_LTORANGE - {0.610f, 0.330f, 0.0f, 1}, // CT_DKORANGE - {0.402f, 0.265f, 0.0f, 1}, // CT_VDKORANGE - - {0.503f, 0.375f, 0.996f, 1}, // CT_VLTBLUE1 - {0.367f, 0.261f, 0.722f, 1}, // CT_LTBLUE1 - {0.199f, 0.0f, 0.398f, 1}, // CT_DKBLUE1 - {0.160f, 0.117f, 0.324f, 1}, // CT_VDKBLUE1 - - {0.300f, 0.628f, 0.816f, 1}, // CT_VLTBLUE2 -- needs values - {0.300f, 0.628f, 0.816f, 1}, // CT_LTBLUE2 - {0.191f, 0.289f, 0.457f, 1}, // CT_DKBLUE2 - {0.125f, 0.250f, 0.324f, 1}, // CT_VDKBLUE2 - - {0.796f, 0.398f, 0.199f, 1}, // CT_VLTBROWN1 -- needs values - {0.796f, 0.398f, 0.199f, 1}, // CT_LTBROWN1 - {0.558f, 0.207f, 0.027f, 1}, // CT_DKBROWN1 - {0.328f, 0.125f, 0.035f, 1}, // CT_VDKBROWN1 - - {0.996f, 0.796f, 0.398f, 1}, // CT_VLTGOLD1 -- needs values - {0.996f, 0.796f, 0.398f, 1}, // CT_LTGOLD1 - {0.605f, 0.441f, 0.113f, 1}, // CT_DKGOLD1 - {0.386f, 0.308f, 0.148f, 1}, // CT_VDKGOLD1 - - {0.648f, 0.562f, 0.784f, 1}, // CT_VLTPURPLE1 -- needs values - {0.648f, 0.562f, 0.784f, 1}, // CT_LTPURPLE1 - {0.437f, 0.335f, 0.597f, 1}, // CT_DKPURPLE1 - {0.308f, 0.269f, 0.375f, 1}, // CT_VDKPURPLE1 - - {0.816f, 0.531f, 0.710f, 1}, // CT_VLTPURPLE2 -- needs values - {0.816f, 0.531f, 0.710f, 1}, // CT_LTPURPLE2 - {0.566f, 0.269f, 0.457f, 1}, // CT_DKPURPLE2 - {0.343f, 0.226f, 0.316f, 1}, // CT_VDKPURPLE2 - - {0.929f, 0.597f, 0.929f, 1}, // CT_VLTPURPLE3 - {0.570f, 0.371f, 0.570f, 1}, // CT_LTPURPLE3 - {0.355f, 0.199f, 0.355f, 1}, // CT_DKPURPLE3 - {0.285f, 0.136f, 0.230f, 1}, // CT_VDKPURPLE3 - - {0.953f, 0.378f, 0.250f, 1}, // CT_VLTRED1 - {0.953f, 0.378f, 0.250f, 1}, // CT_LTRED1 - {0.593f, 0.121f, 0.109f, 1}, // CT_DKRED1 - {0.429f, 0.171f, 0.113f, 1}, // CT_VDKRED1 - {.25f, 0, 0, 1}, // CT_VDKRED - {.70f, 0, 0, 1}, // CT_DKRED - - {0.717f, 0.902f, 1.0f, 1}, // CT_VLTAQUA - {0.574f, 0.722f, 0.804f, 1}, // CT_LTAQUA - {0.287f, 0.361f, 0.402f, 1}, // CT_DKAQUA - {0.143f, 0.180f, 0.201f, 1}, // CT_VDKAQUA - - {0.871f, 0.386f, 0.375f, 1}, // CT_LTPINK - {0.435f, 0.193f, 0.187f, 1}, // CT_DKPINK - { 0, .5f, .5f, 1}, // CT_LTCYAN - { 0, .25f, .25f, 1}, // CT_DKCYAN - { .179f, .51f, .92f, 1}, // CT_LTBLUE3 - { .199f, .71f, .92f, 1}, // CT_LTBLUE3 - { .5f, .05f, .4f, 1}, // CT_DKBLUE3 - - { 0.0f, .613f, .097f, 1}, // CT_HUD_GREEN - { 0.835f, .015f, .015f, 1}, // CT_HUD_RED - { .567f, .685f, 1.0f, .75f}, // CT_ICON_BLUE - { .515f, .406f, .507f, 1}, // CT_NO_AMMO_RED - { 1.0f, .658f, .062f, 1}, // CT_HUD_ORANGE - -}; - void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum ); void CG_Shutdown( void ); diff --git a/codemp/game/g_utils.c b/codemp/game/g_utils.c index 7d83e62619..3ae79cc857 100644 --- a/codemp/game/g_utils.c +++ b/codemp/game/g_utils.c @@ -2284,11 +2284,3 @@ float ShortestLineSegBewteen2LineSegs( vec3_t start1, vec3_t end1, vec3_t start2 return current_dist; } - -void GetAnglesForDirection( const vec3_t p1, const vec3_t p2, vec3_t out ) -{ - vec3_t v; - - VectorSubtract( p2, p1, v ); - vectoangles( v, out ); -} diff --git a/codemp/game/w_saber.c b/codemp/game/w_saber.c index aa283ed4d7..bb0b86e296 100644 --- a/codemp/game/w_saber.c +++ b/codemp/game/w_saber.c @@ -5238,15 +5238,6 @@ static QINLINE qboolean CheckSaberDamage(gentity_t *self, int rSaberNum, int rBl return didHit; } -QINLINE int VectorCompare2( const vec3_t v1, const vec3_t v2 ) { - if ( v1[0] > v2[0]+0.0001f || v1[0] < v2[0]-0.0001f - || v1[1] > v2[1]+0.0001f || v1[1] < v2[1]-0.0001f - || v1[2] > v2[2]+0.0001f || v1[2] < v2[2]-0.0001f ) { - return 0; - } - return 1; -} - #define MAX_SABER_SWING_INC 0.33f void G_SPSaberDamageTraceLerped( gentity_t *self, int saberNum, int bladeNum, vec3_t baseNew, vec3_t endNew, int clipmask ) { diff --git a/codemp/qcommon/q_math.c b/codemp/qcommon/q_math.c index 1a3461c7f7..1733af7cd5 100644 --- a/codemp/qcommon/q_math.c +++ b/codemp/qcommon/q_math.c @@ -24,1323 +24,3 @@ along with this program; if not, see . // q_math.c -- stateless support routines that are included in each code module #include "q_shared.h" - -vec3_t vec3_origin = {0,0,0}; -matrix3_t axisDefault = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } }; - - -vec4_t colorBlack = {0, 0, 0, 1}; -vec4_t colorRed = {1, 0, 0, 1}; -vec4_t colorGreen = {0, 1, 0, 1}; -vec4_t colorBlue = {0, 0, 1, 1}; -vec4_t colorYellow = {1, 1, 0, 1}; -vec4_t colorOrange = {1, 0.5, 0, 1}; -vec4_t colorMagenta= {1, 0, 1, 1}; -vec4_t colorCyan = {0, 1, 1, 1}; -vec4_t colorWhite = {1, 1, 1, 1}; -vec4_t colorLtGrey = {0.75, 0.75, 0.75, 1}; -vec4_t colorMdGrey = {0.5, 0.5, 0.5, 1}; -vec4_t colorDkGrey = {0.25, 0.25, 0.25, 1}; - -vec4_t colorLtBlue = {0.367f, 0.261f, 0.722f, 1}; -vec4_t colorDkBlue = {0.199f, 0.0f, 0.398f, 1}; - -vec4_t g_color_table[Q_COLOR_BITS+1] = { - { 0.0, 0.0, 0.0, 1.0 }, // black - { 1.0, 0.0, 0.0, 1.0 }, // red - { 0.0, 1.0, 0.0, 1.0 }, // green - { 1.0, 1.0, 0.0, 1.0 }, // yellow - { 0.0, 0.0, 1.0, 1.0 }, // blue - { 0.0, 1.0, 1.0, 1.0 }, // cyan - { 1.0, 0.0, 1.0, 1.0 }, // magenta - { 1.0, 1.0, 1.0, 1.0 }, // white - { 1.0, 0.5, 0.0, 1.0 }, // orange - { 0.5, 0.5, 0.5, 1.0 }, // md.grey -}; - -vec3_t bytedirs[NUMVERTEXNORMALS] = -{ -{-0.525731f, 0.000000f, 0.850651f}, {-0.442863f, 0.238856f, 0.864188f}, -{-0.295242f, 0.000000f, 0.955423f}, {-0.309017f, 0.500000f, 0.809017f}, -{-0.162460f, 0.262866f, 0.951056f}, {0.000000f, 0.000000f, 1.000000f}, -{0.000000f, 0.850651f, 0.525731f}, {-0.147621f, 0.716567f, 0.681718f}, -{0.147621f, 0.716567f, 0.681718f}, {0.000000f, 0.525731f, 0.850651f}, -{0.309017f, 0.500000f, 0.809017f}, {0.525731f, 0.000000f, 0.850651f}, -{0.295242f, 0.000000f, 0.955423f}, {0.442863f, 0.238856f, 0.864188f}, -{0.162460f, 0.262866f, 0.951056f}, {-0.681718f, 0.147621f, 0.716567f}, -{-0.809017f, 0.309017f, 0.500000f},{-0.587785f, 0.425325f, 0.688191f}, -{-0.850651f, 0.525731f, 0.000000f},{-0.864188f, 0.442863f, 0.238856f}, -{-0.716567f, 0.681718f, 0.147621f},{-0.688191f, 0.587785f, 0.425325f}, -{-0.500000f, 0.809017f, 0.309017f}, {-0.238856f, 0.864188f, 0.442863f}, -{-0.425325f, 0.688191f, 0.587785f}, {-0.716567f, 0.681718f, -0.147621f}, -{-0.500000f, 0.809017f, -0.309017f}, {-0.525731f, 0.850651f, 0.000000f}, -{0.000000f, 0.850651f, -0.525731f}, {-0.238856f, 0.864188f, -0.442863f}, -{0.000000f, 0.955423f, -0.295242f}, {-0.262866f, 0.951056f, -0.162460f}, -{0.000000f, 1.000000f, 0.000000f}, {0.000000f, 0.955423f, 0.295242f}, -{-0.262866f, 0.951056f, 0.162460f}, {0.238856f, 0.864188f, 0.442863f}, -{0.262866f, 0.951056f, 0.162460f}, {0.500000f, 0.809017f, 0.309017f}, -{0.238856f, 0.864188f, -0.442863f},{0.262866f, 0.951056f, -0.162460f}, -{0.500000f, 0.809017f, -0.309017f},{0.850651f, 0.525731f, 0.000000f}, -{0.716567f, 0.681718f, 0.147621f}, {0.716567f, 0.681718f, -0.147621f}, -{0.525731f, 0.850651f, 0.000000f}, {0.425325f, 0.688191f, 0.587785f}, -{0.864188f, 0.442863f, 0.238856f}, {0.688191f, 0.587785f, 0.425325f}, -{0.809017f, 0.309017f, 0.500000f}, {0.681718f, 0.147621f, 0.716567f}, -{0.587785f, 0.425325f, 0.688191f}, {0.955423f, 0.295242f, 0.000000f}, -{1.000000f, 0.000000f, 0.000000f}, {0.951056f, 0.162460f, 0.262866f}, -{0.850651f, -0.525731f, 0.000000f},{0.955423f, -0.295242f, 0.000000f}, -{0.864188f, -0.442863f, 0.238856f}, {0.951056f, -0.162460f, 0.262866f}, -{0.809017f, -0.309017f, 0.500000f}, {0.681718f, -0.147621f, 0.716567f}, -{0.850651f, 0.000000f, 0.525731f}, {0.864188f, 0.442863f, -0.238856f}, -{0.809017f, 0.309017f, -0.500000f}, {0.951056f, 0.162460f, -0.262866f}, -{0.525731f, 0.000000f, -0.850651f}, {0.681718f, 0.147621f, -0.716567f}, -{0.681718f, -0.147621f, -0.716567f},{0.850651f, 0.000000f, -0.525731f}, -{0.809017f, -0.309017f, -0.500000f}, {0.864188f, -0.442863f, -0.238856f}, -{0.951056f, -0.162460f, -0.262866f}, {0.147621f, 0.716567f, -0.681718f}, -{0.309017f, 0.500000f, -0.809017f}, {0.425325f, 0.688191f, -0.587785f}, -{0.442863f, 0.238856f, -0.864188f}, {0.587785f, 0.425325f, -0.688191f}, -{0.688191f, 0.587785f, -0.425325f}, {-0.147621f, 0.716567f, -0.681718f}, -{-0.309017f, 0.500000f, -0.809017f}, {0.000000f, 0.525731f, -0.850651f}, -{-0.525731f, 0.000000f, -0.850651f}, {-0.442863f, 0.238856f, -0.864188f}, -{-0.295242f, 0.000000f, -0.955423f}, {-0.162460f, 0.262866f, -0.951056f}, -{0.000000f, 0.000000f, -1.000000f}, {0.295242f, 0.000000f, -0.955423f}, -{0.162460f, 0.262866f, -0.951056f}, {-0.442863f, -0.238856f, -0.864188f}, -{-0.309017f, -0.500000f, -0.809017f}, {-0.162460f, -0.262866f, -0.951056f}, -{0.000000f, -0.850651f, -0.525731f}, {-0.147621f, -0.716567f, -0.681718f}, -{0.147621f, -0.716567f, -0.681718f}, {0.000000f, -0.525731f, -0.850651f}, -{0.309017f, -0.500000f, -0.809017f}, {0.442863f, -0.238856f, -0.864188f}, -{0.162460f, -0.262866f, -0.951056f}, {0.238856f, -0.864188f, -0.442863f}, -{0.500000f, -0.809017f, -0.309017f}, {0.425325f, -0.688191f, -0.587785f}, -{0.716567f, -0.681718f, -0.147621f}, {0.688191f, -0.587785f, -0.425325f}, -{0.587785f, -0.425325f, -0.688191f}, {0.000000f, -0.955423f, -0.295242f}, -{0.000000f, -1.000000f, 0.000000f}, {0.262866f, -0.951056f, -0.162460f}, -{0.000000f, -0.850651f, 0.525731f}, {0.000000f, -0.955423f, 0.295242f}, -{0.238856f, -0.864188f, 0.442863f}, {0.262866f, -0.951056f, 0.162460f}, -{0.500000f, -0.809017f, 0.309017f}, {0.716567f, -0.681718f, 0.147621f}, -{0.525731f, -0.850651f, 0.000000f}, {-0.238856f, -0.864188f, -0.442863f}, -{-0.500000f, -0.809017f, -0.309017f}, {-0.262866f, -0.951056f, -0.162460f}, -{-0.850651f, -0.525731f, 0.000000f}, {-0.716567f, -0.681718f, -0.147621f}, -{-0.716567f, -0.681718f, 0.147621f}, {-0.525731f, -0.850651f, 0.000000f}, -{-0.500000f, -0.809017f, 0.309017f}, {-0.238856f, -0.864188f, 0.442863f}, -{-0.262866f, -0.951056f, 0.162460f}, {-0.864188f, -0.442863f, 0.238856f}, -{-0.809017f, -0.309017f, 0.500000f}, {-0.688191f, -0.587785f, 0.425325f}, -{-0.681718f, -0.147621f, 0.716567f}, {-0.442863f, -0.238856f, 0.864188f}, -{-0.587785f, -0.425325f, 0.688191f}, {-0.309017f, -0.500000f, 0.809017f}, -{-0.147621f, -0.716567f, 0.681718f}, {-0.425325f, -0.688191f, 0.587785f}, -{-0.162460f, -0.262866f, 0.951056f}, {0.442863f, -0.238856f, 0.864188f}, -{0.162460f, -0.262866f, 0.951056f}, {0.309017f, -0.500000f, 0.809017f}, -{0.147621f, -0.716567f, 0.681718f}, {0.000000f, -0.525731f, 0.850651f}, -{0.425325f, -0.688191f, 0.587785f}, {0.587785f, -0.425325f, 0.688191f}, -{0.688191f, -0.587785f, 0.425325f}, {-0.955423f, 0.295242f, 0.000000f}, -{-0.951056f, 0.162460f, 0.262866f}, {-1.000000f, 0.000000f, 0.000000f}, -{-0.850651f, 0.000000f, 0.525731f}, {-0.955423f, -0.295242f, 0.000000f}, -{-0.951056f, -0.162460f, 0.262866f}, {-0.864188f, 0.442863f, -0.238856f}, -{-0.951056f, 0.162460f, -0.262866f}, {-0.809017f, 0.309017f, -0.500000f}, -{-0.864188f, -0.442863f, -0.238856f}, {-0.951056f, -0.162460f, -0.262866f}, -{-0.809017f, -0.309017f, -0.500000f}, {-0.681718f, 0.147621f, -0.716567f}, -{-0.681718f, -0.147621f, -0.716567f}, {-0.850651f, 0.000000f, -0.525731f}, -{-0.688191f, 0.587785f, -0.425325f}, {-0.587785f, 0.425325f, -0.688191f}, -{-0.425325f, 0.688191f, -0.587785f}, {-0.425325f, -0.688191f, -0.587785f}, -{-0.587785f, -0.425325f, -0.688191f}, {-0.688191f, -0.587785f, -0.425325f} -}; - -//============================================================== - -int Q_rand( int *seed ) { - *seed = (69069 * *seed + 1); - return *seed; -} - -float Q_random( int *seed ) { - return ( Q_rand( seed ) & 0xffff ) / (float)0x10000; -} - -float Q_crandom( int *seed ) { - return 2.0 * ( Q_random( seed ) - 0.5 ); -} - -//======================================================= - -signed char ClampChar( int i ) { - if ( i < -128 ) { - return -128; - } - if ( i > 127 ) { - return 127; - } - return i; -} - -signed short ClampShort( int i ) { - if ( i < -32768 ) { - return -32768; - } - if ( i > 0x7fff ) { - return 0x7fff; - } - return i; -} - - -// this isn't a real cheap function to call! -int DirToByte( vec3_t dir ) { - int i, best; - float d, bestd; - - if ( !dir ) { - return 0; - } - - bestd = 0; - best = 0; - for (i=0 ; i bestd) - { - bestd = d; - best = i; - } - } - - return best; -} - -void ByteToDir( int b, vec3_t dir ) { - if ( b < 0 || b >= NUMVERTEXNORMALS ) { - VectorCopyM( vec3_origin, dir ); - return; - } - VectorCopy(bytedirs[b], dir); -} - - -unsigned ColorBytes3 (float r, float g, float b) { - unsigned i; - - ( (byte *)&i )[0] = r * 255; - ( (byte *)&i )[1] = g * 255; - ( (byte *)&i )[2] = b * 255; - - return i; -} - -unsigned ColorBytes4 (float r, float g, float b, float a) { - unsigned i; - - ( (byte *)&i )[0] = r * 255; - ( (byte *)&i )[1] = g * 255; - ( (byte *)&i )[2] = b * 255; - ( (byte *)&i )[3] = a * 255; - - return i; -} - -float NormalizeColor( const vec3_t in, vec3_t out ) { - float max; - - max = in[0]; - if ( in[1] > max ) { - max = in[1]; - } - if ( in[2] > max ) { - max = in[2]; - } - - if ( !max ) { - VectorClear( out ); - } else { - out[0] = in[0] / max; - out[1] = in[1] / max; - out[2] = in[2] / max; - } - return max; -} - - -/* -===================== -PlaneFromPoints - -Returns false if the triangle is degenrate. -The normal will point out of the clock for clockwise ordered points -===================== -*/ -qboolean PlaneFromPoints( vec4_t plane, const vec3_t a, const vec3_t b, const vec3_t c ) { - vec3_t d1, d2; - - VectorSubtract( b, a, d1 ); - VectorSubtract( c, a, d2 ); - CrossProduct( d2, d1, plane ); - if ( VectorNormalize( plane ) == 0 ) { - return qfalse; - } - - plane[3] = DotProduct( a, plane ); - return qtrue; -} - -/* -=============== -RotatePointAroundVector - -From q3mme -=============== -*/ -void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float degrees ) { - float m[3][3]; - float c, s, t; - - degrees = DEG2RAD( degrees ); - s = sinf( degrees ); - c = cosf( degrees ); - t = 1 - c; - - m[0][0] = t*dir[0]*dir[0] + c; - m[0][1] = t*dir[0]*dir[1] + s*dir[2]; - m[0][2] = t*dir[0]*dir[2] - s*dir[1]; - - m[1][0] = t*dir[0]*dir[1] - s*dir[2]; - m[1][1] = t*dir[1]*dir[1] + c; - m[1][2] = t*dir[1]*dir[2] + s*dir[0]; - - m[2][0] = t*dir[0]*dir[2] + s*dir[1]; - m[2][1] = t*dir[1]*dir[2] - s*dir[0]; - m[2][2] = t*dir[2]*dir[2] + c; - VectorRotate( point, m, dst ); -} - -/* -=============== -RotateAroundDirection -=============== -*/ -void RotateAroundDirection( matrix3_t axis, float yaw ) { - - // create an arbitrary axis[1] - PerpendicularVector( axis[1], axis[0] ); - - // rotate it around axis[0] by yaw - if ( yaw ) { - vec3_t temp; - - VectorCopy( axis[1], temp ); - RotatePointAroundVector( axis[1], axis[0], temp, yaw ); - } - - // cross to get axis[2] - CrossProduct( axis[0], axis[1], axis[2] ); -} - - - -void vectoangles( const vec3_t value1, vec3_t angles ) { - float forward; - float yaw, pitch; - - if ( value1[1] == 0 && value1[0] == 0 ) { - yaw = 0; - if ( value1[2] > 0 ) { - pitch = 90; - } - else { - pitch = 270; - } - } - else { - if ( value1[0] ) { - yaw = ( atan2 ( value1[1], value1[0] ) * 180 / M_PI ); - } - else if ( value1[1] > 0 ) { - yaw = 90; - } - else { - yaw = 270; - } - if ( yaw < 0 ) { - yaw += 360; - } - - forward = sqrt ( value1[0]*value1[0] + value1[1]*value1[1] ); - pitch = ( atan2(value1[2], forward) * 180 / M_PI ); - if ( pitch < 0 ) { - pitch += 360; - } - } - - angles[PITCH] = -pitch; - angles[YAW] = yaw; - angles[ROLL] = 0; -} - - -/* -================= -AnglesToAxis -================= -*/ -void AnglesToAxis( const vec3_t angles, matrix3_t axis ) { - vec3_t right; - - // angle vectors returns "right" instead of "y axis" - AngleVectors( angles, axis[0], right, axis[2] ); - VectorSubtract( vec3_origin, right, axis[1] ); -} - -void AxisClear( matrix3_t axis ) { - axis[0][0] = 1; - axis[0][1] = 0; - axis[0][2] = 0; - axis[1][0] = 0; - axis[1][1] = 1; - axis[1][2] = 0; - axis[2][0] = 0; - axis[2][1] = 0; - axis[2][2] = 1; -} - -void AxisCopy( matrix3_t in, matrix3_t out ) { - VectorCopy( in[0], out[0] ); - VectorCopy( in[1], out[1] ); - VectorCopy( in[2], out[2] ); -} - -void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal ) -{ - float d; - vec3_t n; - float inv_denom; - - inv_denom = DotProduct( normal, normal ); - assert( Q_fabs(inv_denom) != 0.0f ); - inv_denom = 1.0f / inv_denom; - - d = DotProduct( normal, p ) * inv_denom; - - n[0] = normal[0] * inv_denom; - n[1] = normal[1] * inv_denom; - n[2] = normal[2] * inv_denom; - - dst[0] = p[0] - d * n[0]; - dst[1] = p[1] - d * n[1]; - dst[2] = p[2] - d * n[2]; -} - -/* -================ -MakeNormalVectors - -Given a normalized forward vector, create two -other perpendicular vectors -================ -*/ -void MakeNormalVectors( const vec3_t forward, vec3_t right, vec3_t up) { - float d; - - // this rotate and negate guarantees a vector - // not colinear with the original - right[1] = -forward[0]; - right[2] = forward[1]; - right[0] = forward[2]; - - d = DotProduct(right, forward); - VectorMA(right, -d, forward, right); - VectorNormalize (right); - CrossProduct (right, forward, up); -} - - -void VectorRotate( const vec3_t in, matrix3_t matrix, vec3_t out ) -{ - out[0] = DotProduct( in, matrix[0] ); - out[1] = DotProduct( in, matrix[1] ); - out[2] = DotProduct( in, matrix[2] ); -} - -//============================================================================ - -#if !idppc -/* -** float q_rsqrt( float number ) -*/ -float Q_rsqrt( float number ) -{ - byteAlias_t t; - float x2, y; - const float threehalfs = 1.5F; - - x2 = number * 0.5F; - y = number; - t.f = number; - t.i = 0x5f3759df - ( t.i >> 1 ); // what the fuck? - y = t.f; - y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration -// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed - - assert( !Q_isnan(y) ); - return y; -} - -float Q_fabs( float f ) { - byteAlias_t fi; - fi.f = f; - fi.i &= 0x7FFFFFFF; - return fi.f; -} -#endif - -//============================================================ - -/* -=============== -LerpAngle - -=============== -*/ -float LerpAngle (float from, float to, float frac) { - float a; - - if ( to - from > 180 ) { - to -= 360; - } - if ( to - from < -180 ) { - to += 360; - } - a = from + frac * (to - from); - - return a; -} - - -/* -================= -AngleSubtract - -Always returns a value from -180 to 180 -================= -*/ -float AngleSubtract( float a1, float a2 ) { - float a; - - a = a1 - a2; - a=fmod(a,360);//chop it down quickly, then level it out - while ( a > 180 ) { - a -= 360; - } - while ( a < -180 ) { - a += 360; - } - return a; -} - - -void AnglesSubtract( vec3_t v1, vec3_t v2, vec3_t v3 ) { - v3[0] = AngleSubtract( v1[0], v2[0] ); - v3[1] = AngleSubtract( v1[1], v2[1] ); - v3[2] = AngleSubtract( v1[2], v2[2] ); -} - - -float AngleMod(float a) { - a = (360.0/65536) * ((int)(a*(65536/360.0)) & 65535); - return a; -} - - -/* -================= -AngleNormalize360 - -returns angle normalized to the range [0 <= angle < 360] -================= -*/ -float AngleNormalize360 ( float angle ) { - return (360.0 / 65536) * ((int)(angle * (65536 / 360.0)) & 65535); -} - - -/* -================= -AngleNormalize180 - -returns angle normalized to the range [-180 < angle <= 180] -================= -*/ -float AngleNormalize180 ( float angle ) { - angle = AngleNormalize360( angle ); - if ( angle > 180.0 ) { - angle -= 360.0; - } - return angle; -} - - -/* -================= -AngleDelta - -returns the normalized delta from angle1 to angle2 -================= -*/ -float AngleDelta ( float angle1, float angle2 ) { - return AngleNormalize180( angle1 - angle2 ); -} - - -//============================================================ - - -/* -================= -SetPlaneSignbits -================= -*/ -void SetPlaneSignbits (cplane_t *out) { - int bits, j; - - // for fast box on planeside test - bits = 0; - for (j=0 ; j<3 ; j++) { - if (out->normal[j] < 0) { - bits |= 1<signbits = bits; -} - - -/* -================== -BoxOnPlaneSide - -Returns 1, 2, or 1 + 2 -================== -*/ -int BoxOnPlaneSide(vec3_t emins, vec3_t emaxs, struct cplane_s *p) -{ - float dist[2]; - int sides, b, i; - - // fast axial cases - if (p->type < 3) - { - if (p->dist <= emins[p->type]) - return 1; - if (p->dist >= emaxs[p->type]) - return 2; - return 3; - } - - // general case - dist[0] = dist[1] = 0; - if (p->signbits < 8) // >= 8: default case is original code (dist[0]=dist[1]=0) - { - for (i=0 ; i<3 ; i++) - { - b = (p->signbits >> i) & 1; - dist[ b] += p->normal[i]*emaxs[i]; - dist[!b] += p->normal[i]*emins[i]; - } - } - - sides = 0; - if (dist[0] >= p->dist) - sides = 1; - if (dist[1] < p->dist) - sides |= 2; - - return sides; -} - -/* -================= -RadiusFromBounds -================= -*/ -float RadiusFromBounds( const vec3_t mins, const vec3_t maxs ) { - int i; - vec3_t corner; - float a, b; - - for (i=0 ; i<3 ; i++) { - a = fabs( mins[i] ); - b = fabs( maxs[i] ); - corner[i] = a > b ? a : b; - } - - return VectorLength (corner); -} - - -void ClearBounds( vec3_t mins, vec3_t maxs ) { - mins[0] = mins[1] = mins[2] = 99999; - maxs[0] = maxs[1] = maxs[2] = -99999; -} - -float DistanceHorizontal( const vec3_t p1, const vec3_t p2 ) { - vec3_t v; - - VectorSubtract( p2, p1, v ); - return sqrt( v[0]*v[0] + v[1]*v[1] ); //Leave off the z component -} - -float DistanceHorizontalSquared( const vec3_t p1, const vec3_t p2 ) { - vec3_t v; - - VectorSubtract( p2, p1, v ); - return v[0]*v[0] + v[1]*v[1]; //Leave off the z component -} - -void AddPointToBounds( const vec3_t v, vec3_t mins, vec3_t maxs ) { - if ( v[0] < mins[0] ) { - mins[0] = v[0]; - } - if ( v[0] > maxs[0]) { - maxs[0] = v[0]; - } - - if ( v[1] < mins[1] ) { - mins[1] = v[1]; - } - if ( v[1] > maxs[1]) { - maxs[1] = v[1]; - } - - if ( v[2] < mins[2] ) { - mins[2] = v[2]; - } - if ( v[2] > maxs[2]) { - maxs[2] = v[2]; - } -} - -void VectorAdd( const vec3_t vec1, const vec3_t vec2, vec3_t vecOut ) { - vecOut[0] = vec1[0]+vec2[0]; - vecOut[1] = vec1[1]+vec2[1]; - vecOut[2] = vec1[2]+vec2[2]; -} - -void VectorSubtract( const vec3_t vec1, const vec3_t vec2, vec3_t vecOut ) { - vecOut[0] = vec1[0]-vec2[0]; - vecOut[1] = vec1[1]-vec2[1]; - vecOut[2] = vec1[2]-vec2[2]; -} - -void VectorScale( const vec3_t vecIn, float scale, vec3_t vecOut ) { - vecOut[0] = vecIn[0]*scale; - vecOut[1] = vecIn[1]*scale; - vecOut[2] = vecIn[2]*scale; -} - -void VectorScale4( const vec4_t vecIn, float scale, vec4_t vecOut ) { - vecOut[0] = vecIn[0]*scale; - vecOut[1] = vecIn[1]*scale; - vecOut[2] = vecIn[2]*scale; - vecOut[3] = vecIn[3]*scale; -} - -void VectorMA( const vec3_t vec1, float scale, const vec3_t vec2, vec3_t vecOut ) { - vecOut[0] = vec1[0] + scale*vec2[0]; - vecOut[1] = vec1[1] + scale*vec2[1]; - vecOut[2] = vec1[2] + scale*vec2[2]; -} - -float VectorLength( const vec3_t vec ) { - return (float)sqrt( vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2] ); -} - -float VectorLengthSquared( const vec3_t vec ) { - return (vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]); -} - -float Distance( const vec3_t p1, const vec3_t p2 ) { - vec3_t v; - - VectorSubtract( p2, p1, v ); - return VectorLength( v ); -} - -float DistanceSquared( const vec3_t p1, const vec3_t p2 ) { - vec3_t v; - - VectorSubtract( p2, p1, v ); - return v[0]*v[0] + v[1]*v[1] + v[2]*v[2]; -} - -// fast vector normalize routine that does not check to make sure -// that length != 0, nor does it return length, uses rsqrt approximation -void VectorNormalizeFast( vec3_t vec ) -{ - float ilength; - - ilength = Q_rsqrt( DotProduct( vec, vec ) ); - - vec[0] *= ilength; - vec[1] *= ilength; - vec[2] *= ilength; -} - -float VectorNormalize( vec3_t vec ) { - float length, ilength; - - length = vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]; - length = sqrt( length ); - - if ( length ) { - ilength = 1/length; - vec[0] *= ilength; - vec[1] *= ilength; - vec[2] *= ilength; - } - - return length; -} - -float VectorNormalize2( const vec3_t vec, vec3_t vecOut ) { - float length, ilength; - - length = vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]; - length = sqrtf( length ); - - if ( length ) { - ilength = 1/length; - vecOut[0] = vec[0]*ilength; - vecOut[1] = vec[1]*ilength; - vecOut[2] = vec[2]*ilength; - } - else - VectorClear( vecOut ); - - return length; -} - -void VectorCopy( const vec3_t vecIn, vec3_t vecOut ) { - vecOut[0]=vecIn[0]; vecOut[1]=vecIn[1]; vecOut[2]=vecIn[2]; -} - -void VectorCopy4( const vec4_t vecIn, vec4_t vecOut ) { - vecOut[0]=vecIn[0]; vecOut[1]=vecIn[1]; vecOut[2]=vecIn[2]; vecOut[3]=vecIn[3]; -} - -void VectorSet( vec3_t vec, float x, float y, float z ) { - vec[0]=x; vec[1]=y; vec[2]=z; -} - -void VectorSet4( vec4_t vec, float x, float y, float z, float w ) { - vec[0]=x; vec[1]=y; vec[2]=z; vec[3]=w; -} - -void VectorSet5( vec5_t vec, float x, float y, float z, float w, float u ) { - vec[0]=x; vec[1]=y; vec[2]=z; vec[3]=w; vec[4]=u; -} - -void VectorClear( vec3_t vec ) { - vec[0] = vec[1] = vec[2] = 0; -} - -void VectorClear4( vec4_t vec ) { - vec[0] = vec[1] = vec[2] = vec[3] = 0; -} - -void VectorInc( vec3_t vec ) { - vec[0] += 1.0f; vec[1] += 1.0f; vec[2] += 1.0f; -} - -void VectorDec( vec3_t vec ) { - vec[0] -= 1.0f; vec[1] -= 1.0f; vec[2] -= 1.0f; -} - -void VectorInverse( vec3_t vec ) { - vec[0] = -vec[0]; vec[1] = -vec[1]; vec[2] = -vec[2]; -} - -void CrossProduct( const vec3_t vec1, const vec3_t vec2, vec3_t vecOut ) { - vecOut[0] = vec1[1]*vec2[2] - vec1[2]*vec2[1]; - vecOut[1] = vec1[2]*vec2[0] - vec1[0]*vec2[2]; - vecOut[2] = vec1[0]*vec2[1] - vec1[1]*vec2[0]; -} - -float DotProduct( const vec3_t vec1, const vec3_t vec2 ) { - return vec1[0]*vec2[0] + vec1[1]*vec2[1] + vec1[2]*vec2[2]; -} - -qboolean VectorCompare( const vec3_t vec1, const vec3_t vec2 ) { - if ( vec1[0] != vec2[0] || vec1[1] != vec2[1] || vec1[2] != vec2[2] ) - return qfalse; - return qtrue; -} - -void SnapVector( float *v ) { -#if defined(_MSC_VER) && !defined(idx64) - // pitiful attempt to reduce _ftol2 calls -rww - static int i; - static float f; - - f = *v; - __asm fld f - __asm fistp i - *v = i; - v++; - f = *v; - __asm fld f - __asm fistp i - *v = i; - v++; - f = *v; - __asm fld f - __asm fistp i - *v = i; -#else // mac, linux, mingw - v[0] = (int)v[0]; - v[1] = (int)v[1]; - v[2] = (int)v[2]; -#endif -} - -int Q_log2( int val ) { - int answer; - - answer = 0; - while ( ( val>>=1 ) != 0 ) { - answer++; - } - return answer; -} - - - -/* -================= -PlaneTypeForNormal -================= -*/ -/* -int PlaneTypeForNormal (vec3_t normal) { - if ( normal[0] == 1.0 ) - return PLANE_X; - if ( normal[1] == 1.0 ) - return PLANE_Y; - if ( normal[2] == 1.0 ) - return PLANE_Z; - - return PLANE_NON_AXIAL; -} -*/ - - -/* -================ -MatrixMultiply -================ -*/ -void MatrixMultiply(float in1[3][3], float in2[3][3], float out[3][3]) { - out[0][0] = in1[0][0] * in2[0][0] + in1[0][1] * in2[1][0] + - in1[0][2] * in2[2][0]; - out[0][1] = in1[0][0] * in2[0][1] + in1[0][1] * in2[1][1] + - in1[0][2] * in2[2][1]; - out[0][2] = in1[0][0] * in2[0][2] + in1[0][1] * in2[1][2] + - in1[0][2] * in2[2][2]; - out[1][0] = in1[1][0] * in2[0][0] + in1[1][1] * in2[1][0] + - in1[1][2] * in2[2][0]; - out[1][1] = in1[1][0] * in2[0][1] + in1[1][1] * in2[1][1] + - in1[1][2] * in2[2][1]; - out[1][2] = in1[1][0] * in2[0][2] + in1[1][1] * in2[1][2] + - in1[1][2] * in2[2][2]; - out[2][0] = in1[2][0] * in2[0][0] + in1[2][1] * in2[1][0] + - in1[2][2] * in2[2][0]; - out[2][1] = in1[2][0] * in2[0][1] + in1[2][1] * in2[1][1] + - in1[2][2] * in2[2][1]; - out[2][2] = in1[2][0] * in2[0][2] + in1[2][1] * in2[1][2] + - in1[2][2] * in2[2][2]; -} - - -void AngleVectors( const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up) { - float angle; - static float sr, sp, sy, cr, cp, cy; - // static to help MS compiler fp bugs - - angle = angles[YAW] * (M_PI*2 / 360); - sy = sin(angle); - cy = cos(angle); - angle = angles[PITCH] * (M_PI*2 / 360); - sp = sin(angle); - cp = cos(angle); - angle = angles[ROLL] * (M_PI*2 / 360); - sr = sin(angle); - cr = cos(angle); - - if (forward) - { - forward[0] = cp*cy; - forward[1] = cp*sy; - forward[2] = -sp; - } - if (right) - { - right[0] = (-1*sr*sp*cy+-1*cr*-sy); - right[1] = (-1*sr*sp*sy+-1*cr*cy); - right[2] = -1*sr*cp; - } - if (up) - { - up[0] = (cr*sp*cy+-sr*-sy); - up[1] = (cr*sp*sy+-sr*cy); - up[2] = cr*cp; - } -} - -/* -** assumes "src" is normalized -*/ -void PerpendicularVector( vec3_t dst, const vec3_t src ) -{ - int pos; - int i; - float minelem = 1.0F; - vec3_t tempvec; - - /* - ** find the smallest magnitude axially aligned vector - */ - for ( pos = 0, i = 0; i < 3; i++ ) - { - if ( fabs( src[i] ) < minelem ) - { - pos = i; - minelem = fabs( src[i] ); - } - } - tempvec[0] = tempvec[1] = tempvec[2] = 0.0F; - tempvec[pos] = 1.0F; - - /* - ** project the point onto the plane defined by src - */ - ProjectPointOnPlane( dst, tempvec, src ); - - /* - ** normalize the result - */ - VectorNormalize( dst ); -} - -/* -** NormalToLatLong -** -** We use two byte encoded normals in some space critical applications. -** Lat = 0 at (1,0,0) to 360 (-1,0,0), encoded in 8-bit sine table format -** Lng = 0 at (0,0,1) to 180 (0,0,-1), encoded in 8-bit sine table format -** -*/ -//rwwRMG - added -void NormalToLatLong( const vec3_t normal, byte bytes[2] ) -{ - // check for singularities - if (!normal[0] && !normal[1]) - { - if ( normal[2] > 0.0f ) - { - bytes[0] = 0; - bytes[1] = 0; // lat = 0, long = 0 - } - else - { - bytes[0] = 128; - bytes[1] = 0; // lat = 0, long = 128 - } - } - else - { - int a, b; - - a = (int)(RAD2DEG( (float)atan2( normal[1], normal[0] ) ) * (255.0f / 360.0f )); - a &= 0xff; - - b = (int)(RAD2DEG( (float)acos( normal[2] ) ) * ( 255.0f / 360.0f )); - b &= 0xff; - - bytes[0] = b; // longitude - bytes[1] = a; // lattitude - } -} - -/* -===================== -Q_acos - -the msvc acos doesn't always return a value between -PI and PI: - -int i; -i = 1065353246; -acos(*(float*) &i) == -1.#IND0 - - This should go in q_math but it is too late to add new traps - to game and ui -===================== -*/ -float Q_acos(float c) { - float angle; - - angle = acos(c); - - if (angle > M_PI) { - return (float)M_PI; - } - if (angle < -M_PI) { - return (float)M_PI; - } - return angle; -} - -float Q_asin(float c) -{ - float angle; - - angle = asin(c); - - if (angle > M_PI) { - return (float)M_PI; - } - if (angle < -M_PI) { - return (float)M_PI; - } - return angle; -} - -// This is the VC libc version of rand() without multiple seeds per thread or 12 levels -// of subroutine calls. -// Both calls have been designed to minimise the inherent number of float <--> int -// conversions and the additional math required to get the desired value. -// eg the typical tint = (rand() * 255) / 32768 -// becomes tint = irand(0, 255) - -static uint32_t holdrand = 0x89abcdef; - -void Rand_Init(int seed) -{ - holdrand = seed; -} - -// Returns a float min <= x < max (exclusive; will get max - 0.00001; but never max) - -float flrand(float min, float max) -{ - float result; - - holdrand = (holdrand * 214013L) + 2531011L; - result = (float)(holdrand >> 17); // 0 - 32767 range - result = ((result * (max - min)) / (float)QRAND_MAX) + min; - - return(result); -} -float Q_flrand(float min, float max) -{ - return flrand(min,max); -} - -// Returns an integer min <= x <= max (ie inclusive) - -int irand(int min, int max) -{ - int result; - - assert((max - min) < QRAND_MAX); - - max++; - holdrand = (holdrand * 214013L) + 2531011L; - result = holdrand >> 17; - result = ((result * (max - min)) >> 15) + min; - return(result); -} - -int Q_irand(int value1, int value2) -{ - return irand(value1, value2); -} - -float Q_powf ( float x, int y ) -{ - float r = x; - for ( y--; y>0; y-- ) - r *= x; - return r; -} - -qboolean Q_isnan (float f) -{ -#ifdef _MSC_VER - return (qboolean)(_isnan (f) != 0); -#else - return (qboolean)(isnan (f) != 0); -#endif -} - -/* -------------------------- -DotProductNormalize -------------------------- -*/ - -float DotProductNormalize( const vec3_t inVec1, const vec3_t inVec2 ) -{ - vec3_t v1, v2; - - VectorNormalize2( inVec1, v1 ); - VectorNormalize2( inVec2, v2 ); - - return DotProduct(v1, v2); -} - -/* -------------------------- -G_FindClosestPointOnLineSegment -------------------------- -*/ - -qboolean G_FindClosestPointOnLineSegment( const vec3_t start, const vec3_t end, const vec3_t from, vec3_t result ) -{ - vec3_t vecStart2From, vecStart2End, vecEnd2Start, vecEnd2From; - float distEnd2From, distEnd2Result, theta, cos_theta, dot; - - //Find the perpendicular vector to vec from start to end - VectorSubtract( from, start, vecStart2From); - VectorSubtract( end, start, vecStart2End); - - dot = DotProductNormalize( vecStart2From, vecStart2End ); - - if ( dot <= 0 ) - { - //The perpendicular would be beyond or through the start point - VectorCopy( start, result ); - return qfalse; - } - - if ( dot == 1 ) - { - //parallel, closer of 2 points will be the target - if( (VectorLengthSquared( vecStart2From )) < (VectorLengthSquared( vecStart2End )) ) - { - VectorCopy( from, result ); - } - else - { - VectorCopy( end, result ); - } - return qfalse; - } - - //Try other end - VectorSubtract( from, end, vecEnd2From); - VectorSubtract( start, end, vecEnd2Start); - - dot = DotProductNormalize( vecEnd2From, vecEnd2Start ); - - if ( dot <= 0 ) - {//The perpendicular would be beyond or through the start point - VectorCopy( end, result ); - return qfalse; - } - - if ( dot == 1 ) - {//parallel, closer of 2 points will be the target - if( (VectorLengthSquared( vecEnd2From )) < (VectorLengthSquared( vecEnd2Start ))) - { - VectorCopy( from, result ); - } - else - { - VectorCopy( end, result ); - } - return qfalse; - } - - // /| - // c / | - // / |a - // theta /)__| - // b - //cos(theta) = b / c - //solve for b - //b = cos(theta) * c - - //angle between vecs end2from and end2start, should be between 0 and 90 - theta = 90 * (1 - dot);//theta - - //Get length of side from End2Result using sine of theta - distEnd2From = VectorLength( vecEnd2From );//c - cos_theta = cos(DEG2RAD(theta));//cos(theta) - distEnd2Result = cos_theta * distEnd2From;//b - - //Extrapolate to find result - VectorNormalize( vecEnd2Start ); - VectorMA( end, distEnd2Result, vecEnd2Start, result ); - - //perpendicular intersection is between the 2 endpoints - return qtrue; -} - -float G_PointDistFromLineSegment( const vec3_t start, const vec3_t end, const vec3_t from ) -{ - vec3_t vecStart2From, vecStart2End, vecEnd2Start, vecEnd2From, intersection; - float distEnd2From, distStart2From, distEnd2Result, theta, cos_theta, dot; - - //Find the perpendicular vector to vec from start to end - VectorSubtract( from, start, vecStart2From); - VectorSubtract( end, start, vecStart2End); - VectorSubtract( from, end, vecEnd2From); - VectorSubtract( start, end, vecEnd2Start); - - dot = DotProductNormalize( vecStart2From, vecStart2End ); - - distStart2From = Distance( start, from ); - distEnd2From = Distance( end, from ); - - if ( dot <= 0 ) - { - //The perpendicular would be beyond or through the start point - return distStart2From; - } - - if ( dot == 1 ) - { - //parallel, closer of 2 points will be the target - return ((distStart2From. // between base<->modbase clients and servers (mismatching events, powerups, etc) // leave this defined to ensure compatibility +#include "qcommon/q_math_common.h" +#include "qcommon/q_color.h" #include "qcommon/disablewarnings.h" #include "game/teams.h" //npc team stuff @@ -148,61 +150,14 @@ along with this program; if not, see . #include "qcommon/q_platform.h" -// ================================================================ -// TYPE DEFINITIONS -// ================================================================ - -typedef unsigned char byte; -typedef unsigned short word; -typedef unsigned long ulong; - -typedef enum qboolean_e { qfalse=0, qtrue } qboolean; - -#define Q_min(x,y) ((x)<(y)?(x):(y)) -#define Q_max(x,y) ((x)>(y)?(x):(y)) - -#if defined (_MSC_VER) && (_MSC_VER >= 1600) - - #include - - // vsnprintf is ISO/IEC 9899:1999 - // abstracting this to make it portable - int Q_vsnprintf( char *str, size_t size, const char *format, va_list args ); - -#elif defined (_MSC_VER) - - #include - - typedef signed __int64 int64_t; - typedef signed __int32 int32_t; - typedef signed __int16 int16_t; - typedef signed __int8 int8_t; - typedef unsigned __int64 uint64_t; - typedef unsigned __int32 uint32_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int8 uint8_t; - +#if defined (_MSC_VER) // vsnprintf is ISO/IEC 9899:1999 // abstracting this to make it portable int Q_vsnprintf( char *str, size_t size, const char *format, va_list args ); #else // not using MSVC - - #include - #define Q_vsnprintf vsnprintf - #endif -// 32 bit field aliasing -typedef union byteAlias_u { - float f; - int32_t i; - uint32_t ui; - qboolean qb; - byte b[4]; - char c[4]; -} byteAlias_t; - typedef union fileBuffer_u { void *v; char *c; @@ -233,16 +188,8 @@ typedef int32_t qhandle_t, thandle_t, fxHandle_t, sfxHandle_t, fileHandle_t, cli #define NULL ((void *)0) #endif -#define MAX_QINT 0x7fffffff -#define MIN_QINT (-MAX_QINT-1) - #define INT_ID( a, b, c, d ) (uint32_t)((((a) & 0xff) << 24) | (((b) & 0xff) << 16) | (((c) & 0xff) << 8) | ((d) & 0xff)) -// angle indexes -#define PITCH 0 // up / down -#define YAW 1 // left / right -#define ROLL 2 // fall over - // the game guarantees that no string from the network will ever // exceed MAX_STRING_CHARS #define MAX_STRING_CHARS 1024 // max length of a string passed to Cmd_TokenizeString @@ -393,38 +340,6 @@ void *Hunk_Alloc( int size, ha_pref preference ); #define CIN_silent 8 #define CIN_shader 16 -/* -============================================================== - -MATHLIB - -============================================================== -*/ - - -typedef float vec2_t[2], vec3_t[3], vec4_t[4], vec5_t[5]; -typedef int ivec2_t[2], ivec3_t[3], ivec4_t[4], ivec5_t[5]; -typedef vec3_t vec3pair_t[2], matrix3_t[3]; - -typedef int fixed4_t, fixed8_t, fixed16_t; - -#ifndef M_PI -#define M_PI 3.14159265358979323846f // matches value in gcc v2 math.h -#endif - -#if defined(_MSC_VER) -static __inline long Q_ftol(float f) -{ - return (long)f; -} -#else -static inline long Q_ftol(float f) -{ - return (long)f; -} -#endif - - typedef enum { BLK_NO, BLK_TIGHT, // Block only attacks and shots around the saber itself, a bbox of around 12x12x12 @@ -448,8 +363,6 @@ typedef enum { BLOCKED_TOP_PROJ } saberBlockedType_t; - - typedef enum { SABER_RED, @@ -658,10 +571,6 @@ typedef struct wpobject_s wpneighbor_t neighbors[MAX_NEIGHBOR_SIZE]; } wpobject_t; - -#define NUMVERTEXNORMALS 162 -extern vec3_t bytedirs[NUMVERTEXNORMALS]; - // all drawing is done to a 640*480 virtual screen size // and will be automatically scaled to the real resolution #define SCREEN_WIDTH 640 @@ -679,325 +588,8 @@ extern vec3_t bytedirs[NUMVERTEXNORMALS]; #define GIANTCHAR_WIDTH 32 #define GIANTCHAR_HEIGHT 48 -typedef enum -{ -CT_NONE, -CT_BLACK, -CT_RED, -CT_GREEN, -CT_BLUE, -CT_YELLOW, -CT_MAGENTA, -CT_CYAN, -CT_WHITE, -CT_LTGREY, -CT_MDGREY, -CT_DKGREY, -CT_DKGREY2, - -CT_VLTORANGE, -CT_LTORANGE, -CT_DKORANGE, -CT_VDKORANGE, - -CT_VLTBLUE1, -CT_LTBLUE1, -CT_DKBLUE1, -CT_VDKBLUE1, - -CT_VLTBLUE2, -CT_LTBLUE2, -CT_DKBLUE2, -CT_VDKBLUE2, - -CT_VLTBROWN1, -CT_LTBROWN1, -CT_DKBROWN1, -CT_VDKBROWN1, - -CT_VLTGOLD1, -CT_LTGOLD1, -CT_DKGOLD1, -CT_VDKGOLD1, - -CT_VLTPURPLE1, -CT_LTPURPLE1, -CT_DKPURPLE1, -CT_VDKPURPLE1, - -CT_VLTPURPLE2, -CT_LTPURPLE2, -CT_DKPURPLE2, -CT_VDKPURPLE2, - -CT_VLTPURPLE3, -CT_LTPURPLE3, -CT_DKPURPLE3, -CT_VDKPURPLE3, - -CT_VLTRED1, -CT_LTRED1, -CT_DKRED1, -CT_VDKRED1, -CT_VDKRED, -CT_DKRED, - -CT_VLTAQUA, -CT_LTAQUA, -CT_DKAQUA, -CT_VDKAQUA, - -CT_LTPINK, -CT_DKPINK, -CT_LTCYAN, -CT_DKCYAN, -CT_LTBLUE3, -CT_BLUE3, -CT_DKBLUE3, - -CT_HUD_GREEN, -CT_HUD_RED, -CT_ICON_BLUE, -CT_NO_AMMO_RED, -CT_HUD_ORANGE, - -CT_MAX -} ct_table_t; - -extern vec4_t colorTable[CT_MAX]; - -extern vec4_t colorBlack; -extern vec4_t colorRed; -extern vec4_t colorGreen; -extern vec4_t colorBlue; -extern vec4_t colorYellow; -extern vec4_t colorOrange; -extern vec4_t colorMagenta; -extern vec4_t colorCyan; -extern vec4_t colorWhite; -extern vec4_t colorLtGrey; -extern vec4_t colorMdGrey; -extern vec4_t colorDkGrey; -extern vec4_t colorLtBlue; -extern vec4_t colorDkBlue; - -#define Q_COLOR_ESCAPE '^' -#define Q_COLOR_BITS 0xF // was 7 - -// you MUST have the last bit on here about colour strings being less than 7 or taiwanese strings register as colour!!!! -#define Q_IsColorString(p) ( p && *(p) == Q_COLOR_ESCAPE && *((p)+1) && *((p)+1) != Q_COLOR_ESCAPE && *((p)+1) <= '9' && *((p)+1) >= '0' ) -// Correct version of the above for Q_StripColor -#define Q_IsColorStringExt(p) ((p) && *(p) == Q_COLOR_ESCAPE && *((p)+1) && *((p)+1) >= '0' && *((p)+1) <= '9') // ^[0-9] - - -#define COLOR_BLACK '0' -#define COLOR_RED '1' -#define COLOR_GREEN '2' -#define COLOR_YELLOW '3' -#define COLOR_BLUE '4' -#define COLOR_CYAN '5' -#define COLOR_MAGENTA '6' -#define COLOR_WHITE '7' -#define COLOR_ORANGE '8' -#define COLOR_GREY '9' -#define ColorIndex(c) ( ( (c) - '0' ) & Q_COLOR_BITS ) - -#define S_COLOR_BLACK "^0" -#define S_COLOR_RED "^1" -#define S_COLOR_GREEN "^2" -#define S_COLOR_YELLOW "^3" -#define S_COLOR_BLUE "^4" -#define S_COLOR_CYAN "^5" -#define S_COLOR_MAGENTA "^6" -#define S_COLOR_WHITE "^7" -#define S_COLOR_ORANGE "^8" -#define S_COLOR_GREY "^9" - -extern vec4_t g_color_table[Q_COLOR_BITS+1]; - -#define MAKERGB( v, r, g, b ) v[0]=r;v[1]=g;v[2]=b -#define MAKERGBA( v, r, g, b, a ) v[0]=r;v[1]=g;v[2]=b;v[3]=a - -struct cplane_s; - -extern vec3_t vec3_origin; -extern matrix3_t axisDefault; - -#if idppc - -static inline float Q_rsqrt( float number ) { - float x = 0.5f * number; - float y; -#ifdef __GNUC__ - asm("frsqrte %0,%1" : "=f" (y) : "f" (number)); -#else - y = __frsqrte( number ); -#endif - return y * (1.5f - (x * y * y)); - } - -#ifdef __GNUC__ -static inline float Q_fabs(float x) { - float abs_x; - - asm("fabs %0,%1" : "=f" (abs_x) : "f" (x)); - return abs_x; -} -#else -#define Q_fabs __fabsf -#endif - -#else - -float Q_fabs( float f ); -float Q_rsqrt( float f ); // reciprocal square root - -#endif // idppc - - -#define SQRTFAST( x ) ( (x) * Q_rsqrt( x ) ) - -signed char ClampChar( int i ); -signed short ClampShort( int i ); - -float Q_powf ( float x, int y ); - -// this isn't a real cheap function to call! -int DirToByte( vec3_t dir ); -void ByteToDir( int b, vec3_t dir ); - -//rwwRMG - added math defines -#define minimum( x, y ) ((x) < (y) ? (x) : (y)) -#define maximum( x, y ) ((x) > (y) ? (x) : (y)) - -#define DEG2RAD( deg ) ( ((deg)*M_PI) / 180.0f ) -#define RAD2DEG( rad ) ( ((rad)*180.0f) / M_PI ) - -void VectorAdd( const vec3_t vec1, const vec3_t vec2, vec3_t vecOut ); -void VectorSubtract( const vec3_t vec1, const vec3_t vec2, vec3_t vecOut ); -void VectorScale( const vec3_t vecIn, float scale, vec3_t vecOut ); -void VectorScale4( const vec4_t vecIn, float scale, vec4_t vecOut ); -void VectorMA( const vec3_t vec1, float scale, const vec3_t vec2, vec3_t vecOut ); -float VectorLength( const vec3_t vec ); -float VectorLengthSquared( const vec3_t vec ); -float Distance( const vec3_t p1, const vec3_t p2 ); -float DistanceSquared( const vec3_t p1, const vec3_t p2 ); -void VectorNormalizeFast( vec3_t vec ); -float VectorNormalize( vec3_t vec ); -float VectorNormalize2( const vec3_t vec, vec3_t vecOut ); -void VectorCopy( const vec3_t vecIn, vec3_t vecOut ); -void VectorCopy4( const vec4_t vecIn, vec4_t vecOut ); -void VectorSet( vec3_t vec, float x, float y, float z ); -void VectorSet4( vec4_t vec, float x, float y, float z, float w ); -void VectorSet5( vec5_t vec, float x, float y, float z, float w, float u ); -void VectorClear( vec3_t vec ); -void VectorClear4( vec4_t vec ); -void VectorInc( vec3_t vec ); -void VectorDec( vec3_t vec ); -void VectorInverse( vec3_t vec ); -void CrossProduct( const vec3_t vec1, const vec3_t vec2, vec3_t vecOut ); -float DotProduct( const vec3_t vec1, const vec3_t vec2 ); -qboolean VectorCompare( const vec3_t vec1, const vec3_t vec2 ); -void SnapVector( float *v ); - -#define VectorAddM( vec1, vec2, vecOut ) ((vecOut)[0]=(vec1)[0]+(vec2)[0], (vecOut)[1]=(vec1)[1]+(vec2)[1], (vecOut)[2]=(vec1)[2]+(vec2)[2]) -#define VectorSubtractM( vec1, vec2, vecOut ) ((vecOut)[0]=(vec1)[0]-(vec2)[0], (vecOut)[1]=(vec1)[1]-(vec2)[1], (vecOut)[2]=(vec1)[2]-(vec2)[2]) -#define VectorScaleM( vecIn, scale, vecOut ) ((vecOut)[0]=(vecIn)[0]*(scale), (vecOut)[1]=(vecIn)[1]*(scale), (vecOut)[2]=(vecIn)[2]*(scale)) -#define VectorScale4M( vecIn, scale, vecOut ) ((vecOut)[0]=(vecIn)[0]*(scale), (vecOut)[1]=(vecIn)[1]*(scale), (vecOut)[2]=(vecIn)[2]*(scale), (vecOut)[3]=(vecIn)[3]*(scale)) -#define VectorMAM( vec1, scale, vec2, vecOut ) ((vecOut)[0]=(vec1)[0]+(vec2)[0]*(scale), (vecOut)[1]=(vec1)[1]+(vec2)[1]*(scale), (vecOut)[2]=(vec1)[2]+(vec2)[2]*(scale)) -#define VectorLengthM( vec ) VectorLength( vec ) -#define VectorLengthSquaredM( vec ) VectorLengthSquared( vec ) -#define DistanceM( vec ) Distance( vec ) -#define DistanceSquaredM( p1, p2 ) DistanceSquared( p1, p2 ) -#define VectorNormalizeFastM( vec ) VectorNormalizeFast( vec ) -#define VectorNormalizeM( vec ) VectorNormalize( vec ) -#define VectorNormalize2M( vec, vecOut ) VectorNormalize2( vec, vecOut ) -#define VectorCopyM( vecIn, vecOut ) ((vecOut)[0]=(vecIn)[0], (vecOut)[1]=(vecIn)[1], (vecOut)[2]=(vecIn)[2]) -#define VectorCopy4M( vecIn, vecOut ) ((vecOut)[0]=(vecIn)[0], (vecOut)[1]=(vecIn)[1], (vecOut)[2]=(vecIn)[2], (vecOut)[3]=(vecIn)[3]) -#define VectorSetM( vec, x, y, z ) ((vec)[0]=(x), (vec)[1]=(y), (vec)[2]=(z)) -#define VectorSet4M( vec, x, y, z, w ) ((vec)[0]=(x), (vec)[1]=(y), (vec)[2]=(z), (vec)[3]=(w)) -#define VectorSet5M( vec, x, y, z, w, u ) ((vec)[0]=(x), (vec)[1]=(y), (vec)[2]=(z), (vec)[3]=(w), (vec)[4]=(u)) -#define VectorClearM( vec ) ((vec)[0]=(vec)[1]=(vec)[2]=0) -#define VectorClear4M( vec ) ((vec)[0]=(vec)[1]=(vec)[2]=(vec)[3]=0) -#define VectorIncM( vec ) ((vec)[0]+=1.0f, (vec)[1]+=1.0f, (vec)[2]+=1.0f) -#define VectorDecM( vec ) ((vec)[0]-=1.0f, (vec)[1]-=1.0f, (vec)[2]-=1.0f) -#define VectorInverseM( vec ) ((vec)[0]=-(vec)[0], (vec)[1]=-(vec)[1], (vec)[2]=-(vec)[2]) -#define CrossProductM( vec1, vec2, vecOut ) ((vecOut)[0]=((vec1)[1]*(vec2)[2])-((vec1)[2]*(v2)[1]), (vecOut)[1]=((vec1)[2]*(vec2)[0])-((vec1)[0]*(vec2)[2]), (vecOut)[2]=((vec1)[0]*(vec2)[1])-((vec1)[1]*(vec2)[0])) -#define DotProductM( x, y ) ((x)[0]*(y)[0]+(x)[1]*(y)[1]+(x)[2]*(y)[2]) -#define VectorCompareM( vec1, vec2 ) (!!((vec1)[0]==(vec2)[0] && (vec1)[1]==(vec2)[1] && (vec1)[2]==(vec2)[2])) - -// TODO -#define VectorScaleVector(a,b,c) (((c)[0]=(a)[0]*(b)[0]),((c)[1]=(a)[1]*(b)[1]),((c)[2]=(a)[2]*(b)[2])) -#define VectorInverseScaleVector(a,b,c) ((c)[0]=(a)[0]/(b)[0],(c)[1]=(a)[1]/(b)[1],(c)[2]=(a)[2]/(b)[2]) -#define VectorScaleVectorAdd(c,a,b,o) ((o)[0]=(c)[0]+((a)[0]*(b)[0]),(o)[1]=(c)[1]+((a)[1]*(b)[1]),(o)[2]=(c)[2]+((a)[2]*(b)[2])) -#define VectorAdvance(a,s,b,c) (((c)[0]=(a)[0] + s * ((b)[0] - (a)[0])),((c)[1]=(a)[1] + s * ((b)[1] - (a)[1])),((c)[2]=(a)[2] + s * ((b)[2] - (a)[2]))) -#define VectorAverage(a,b,c) (((c)[0]=((a)[0]+(b)[0])*0.5f),((c)[1]=((a)[1]+(b)[1])*0.5f),((c)[2]=((a)[2]+(b)[2])*0.5f)) -#define VectorNegate(a,b) ((b)[0]=-(a)[0],(b)[1]=-(a)[1],(b)[2]=-(a)[2]) - -unsigned ColorBytes3 (float r, float g, float b); -unsigned ColorBytes4 (float r, float g, float b, float a); - -float NormalizeColor( const vec3_t in, vec3_t out ); - -float RadiusFromBounds( const vec3_t mins, const vec3_t maxs ); -void ClearBounds( vec3_t mins, vec3_t maxs ); -float DistanceHorizontal( const vec3_t p1, const vec3_t p2 ); -float DistanceHorizontalSquared( const vec3_t p1, const vec3_t p2 ); -void AddPointToBounds( const vec3_t v, vec3_t mins, vec3_t maxs ); -void VectorRotate( const vec3_t in, matrix3_t matrix, vec3_t out ); -int Q_log2(int val); - -qboolean Q_isnan(float f); -float Q_acos(float c); -float Q_asin(float c); - -int Q_rand( int *seed ); -float Q_random( int *seed ); -float Q_crandom( int *seed ); - -#define random() ((rand () & 0x7fff) / ((float)0x7fff)) -#define crandom() (2.0 * (random() - 0.5)) - -void vectoangles( const vec3_t value1, vec3_t angles); -void AnglesToAxis( const vec3_t angles, matrix3_t axis ); - -void AxisClear( matrix3_t axis ); -void AxisCopy( matrix3_t in, matrix3_t out ); - -void SetPlaneSignbits( struct cplane_s *out ); -int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *plane); - -double fmod( double x, double y ); -float AngleMod(float a); -float LerpAngle (float from, float to, float frac); -float AngleSubtract( float a1, float a2 ); -void AnglesSubtract( vec3_t v1, vec3_t v2, vec3_t v3 ); - -float AngleNormalize360 ( float angle ); -float AngleNormalize180 ( float angle ); -float AngleDelta ( float angle1, float angle2 ); - -qboolean PlaneFromPoints( vec4_t plane, const vec3_t a, const vec3_t b, const vec3_t c ); -void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal ); -void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float degrees ); -void RotateAroundDirection( matrix3_t axis, float yaw ); -void MakeNormalVectors( const vec3_t forward, vec3_t right, vec3_t up ); -// perpendicular vector could be replaced by this - -//int PlaneTypeForNormal (vec3_t normal); - -void MatrixMultiply(float in1[3][3], float in2[3][3], float out[3][3]); -void AngleVectors( const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up); -void PerpendicularVector( vec3_t dst, const vec3_t src ); -void NormalToLatLong( const vec3_t normal, byte bytes[2] ); //rwwRMG - added - //============================================= -int Com_Clampi( int min, int max, int value ); //rwwRMG - added -float Com_Clamp( float min, float max, float value ); -int Com_AbsClampi( int min, int max, int value ); -float Com_AbsClamp( float min, float max, float value ); - char *COM_SkipPath( char *pathname ); const char *COM_GetExtension( const char *name ); void COM_StripExtension( const char *in, char *out, int destsize ); @@ -1227,31 +819,6 @@ COLLISION DETECTION #include "game/surfaceflags.h" // shared with the q3map utility -// plane types are used to speed some tests -// 0-2 are axial planes -#define PLANE_X 0 -#define PLANE_Y 1 -#define PLANE_Z 2 -#define PLANE_NON_AXIAL 3 - - -/* -================= -PlaneTypeForNormal -================= -*/ - -#define PlaneTypeForNormal(x) (x[0] == 1.0 ? PLANE_X : (x[1] == 1.0 ? PLANE_Y : (x[2] == 1.0 ? PLANE_Z : PLANE_NON_AXIAL) ) ) - -// plane_t structure -// !!! if this is changed, it must be changed in asm code too !!! -typedef struct cplane_s { - vec3_t normal; - float dist; - byte type; // for fast side tests: 0,1,2 = axial, 3 = nonaxial - byte signbits; // signx + (signy<<1) + (signz<<2), used as lookup during collision - byte pad[2]; -} cplane_t; /* Ghoul2 Insert Start */ @@ -2265,13 +1832,6 @@ typedef enum { #define SAY_TEAM 1 #define SAY_TELL 2 -#define QRAND_MAX 32768 - -void Rand_Init(int seed); -float flrand(float min, float max); -int irand(int min, int max); -int Q_irand(int value1, int value2); - /* Ghoul2 Insert Start */ diff --git a/codemp/rd-vanilla/G2_misc.cpp b/codemp/rd-vanilla/G2_misc.cpp index b7dd9c217f..76468bb3de 100644 --- a/codemp/rd-vanilla/G2_misc.cpp +++ b/codemp/rd-vanilla/G2_misc.cpp @@ -962,7 +962,7 @@ void G2_GorePolys( const mdxmSurface_t *surface, CTraceSurface &TS, const mdxmSu add.mDeleteTime=G2API_GetTime(0) + TS.gore->lifeTime; } add.mFadeTime = TS.gore->fadeOutTime; - add.mFadeRGB = !!(TS.gore->fadeRGB); + add.mFadeRGB = (TS.gore->fadeRGB != qfalse); add.mGoreTag = newTag; add.mGoreGrowStartTime=G2API_GetTime(0); diff --git a/shared/qcommon/q_color.c b/shared/qcommon/q_color.c new file mode 100644 index 0000000000..ac849b55db --- /dev/null +++ b/shared/qcommon/q_color.c @@ -0,0 +1,157 @@ +#include "q_color.h" + +vec4_t colorBlack = {0, 0, 0, 1}; +vec4_t colorRed = {1, 0, 0, 1}; +vec4_t colorGreen = {0, 1, 0, 1}; +vec4_t colorBlue = {0, 0, 1, 1}; +vec4_t colorYellow = {1, 1, 0, 1}; +vec4_t colorOrange = {1, 0.5, 0, 1}; +vec4_t colorMagenta= {1, 0, 1, 1}; +vec4_t colorCyan = {0, 1, 1, 1}; +vec4_t colorWhite = {1, 1, 1, 1}; +vec4_t colorLtGrey = {0.75, 0.75, 0.75, 1}; +vec4_t colorMdGrey = {0.5, 0.5, 0.5, 1}; +vec4_t colorDkGrey = {0.25, 0.25, 0.25, 1}; + +vec4_t colorLtBlue = {0.367f, 0.261f, 0.722f, 1}; +vec4_t colorDkBlue = {0.199f, 0.0f, 0.398f, 1}; + +vec4_t g_color_table[Q_COLOR_BITS+1] = { + { 0.0, 0.0, 0.0, 1.0 }, // black + { 1.0, 0.0, 0.0, 1.0 }, // red + { 0.0, 1.0, 0.0, 1.0 }, // green + { 1.0, 1.0, 0.0, 1.0 }, // yellow + { 0.0, 0.0, 1.0, 1.0 }, // blue + { 0.0, 1.0, 1.0, 1.0 }, // cyan + { 1.0, 0.0, 1.0, 1.0 }, // magenta + { 1.0, 1.0, 1.0, 1.0 }, // white + { 1.0, 0.5, 0.0, 1.0 }, // orange + { 0.5, 0.5, 0.5, 1.0 }, // md.grey +}; + +vec4_t colorTable[CT_MAX] = +{ + {0, 0, 0, 0}, // CT_NONE + {0, 0, 0, 1}, // CT_BLACK + {1, 0, 0, 1}, // CT_RED + {0, 1, 0, 1}, // CT_GREEN + {0, 0, 1, 1}, // CT_BLUE + {1, 1, 0, 1}, // CT_YELLOW + {1, 0, 1, 1}, // CT_MAGENTA + {0, 1, 1, 1}, // CT_CYAN + {1, 1, 1, 1}, // CT_WHITE + {0.75f, 0.75f, 0.75f, 1}, // CT_LTGREY + {0.50f, 0.50f, 0.50f, 1}, // CT_MDGREY + {0.25f, 0.25f, 0.25f, 1}, // CT_DKGREY + {0.15f, 0.15f, 0.15f, 1}, // CT_DKGREY2 + + {0.992f, 0.652f, 0.0f, 1}, // CT_VLTORANGE -- needs values + {0.810f, 0.530f, 0.0f, 1}, // CT_LTORANGE + {0.610f, 0.330f, 0.0f, 1}, // CT_DKORANGE + {0.402f, 0.265f, 0.0f, 1}, // CT_VDKORANGE + + {0.503f, 0.375f, 0.996f, 1}, // CT_VLTBLUE1 + {0.367f, 0.261f, 0.722f, 1}, // CT_LTBLUE1 + {0.199f, 0.0f, 0.398f, 1}, // CT_DKBLUE1 + {0.160f, 0.117f, 0.324f, 1}, // CT_VDKBLUE1 + + {0.300f, 0.628f, 0.816f, 1}, // CT_VLTBLUE2 -- needs values + {0.300f, 0.628f, 0.816f, 1}, // CT_LTBLUE2 + {0.191f, 0.289f, 0.457f, 1}, // CT_DKBLUE2 + {0.125f, 0.250f, 0.324f, 1}, // CT_VDKBLUE2 + + {0.796f, 0.398f, 0.199f, 1}, // CT_VLTBROWN1 -- needs values + {0.796f, 0.398f, 0.199f, 1}, // CT_LTBROWN1 + {0.558f, 0.207f, 0.027f, 1}, // CT_DKBROWN1 + {0.328f, 0.125f, 0.035f, 1}, // CT_VDKBROWN1 + + {0.996f, 0.796f, 0.398f, 1}, // CT_VLTGOLD1 -- needs values + {0.996f, 0.796f, 0.398f, 1}, // CT_LTGOLD1 + {0.605f, 0.441f, 0.113f, 1}, // CT_DKGOLD1 + {0.386f, 0.308f, 0.148f, 1}, // CT_VDKGOLD1 + + {0.648f, 0.562f, 0.784f, 1}, // CT_VLTPURPLE1 -- needs values + {0.648f, 0.562f, 0.784f, 1}, // CT_LTPURPLE1 + {0.437f, 0.335f, 0.597f, 1}, // CT_DKPURPLE1 + {0.308f, 0.269f, 0.375f, 1}, // CT_VDKPURPLE1 + + {0.816f, 0.531f, 0.710f, 1}, // CT_VLTPURPLE2 -- needs values + {0.816f, 0.531f, 0.710f, 1}, // CT_LTPURPLE2 + {0.566f, 0.269f, 0.457f, 1}, // CT_DKPURPLE2 + {0.343f, 0.226f, 0.316f, 1}, // CT_VDKPURPLE2 + + {0.929f, 0.597f, 0.929f, 1}, // CT_VLTPURPLE3 + {0.570f, 0.371f, 0.570f, 1}, // CT_LTPURPLE3 + {0.355f, 0.199f, 0.355f, 1}, // CT_DKPURPLE3 + {0.285f, 0.136f, 0.230f, 1}, // CT_VDKPURPLE3 + + {0.953f, 0.378f, 0.250f, 1}, // CT_VLTRED1 + {0.953f, 0.378f, 0.250f, 1}, // CT_LTRED1 + {0.593f, 0.121f, 0.109f, 1}, // CT_DKRED1 + {0.429f, 0.171f, 0.113f, 1}, // CT_VDKRED1 + {.25f, 0, 0, 1}, // CT_VDKRED + {.70f, 0, 0, 1}, // CT_DKRED + + {0.717f, 0.902f, 1.0f, 1}, // CT_VLTAQUA + {0.574f, 0.722f, 0.804f, 1}, // CT_LTAQUA + {0.287f, 0.361f, 0.402f, 1}, // CT_DKAQUA + {0.143f, 0.180f, 0.201f, 1}, // CT_VDKAQUA + + {0.871f, 0.386f, 0.375f, 1}, // CT_LTPINK + {0.435f, 0.193f, 0.187f, 1}, // CT_DKPINK + { 0, .5f, .5f, 1}, // CT_LTCYAN + { 0, .25f, .25f, 1}, // CT_DKCYAN + { .179f, .51f, .92f, 1}, // CT_LTBLUE3 + { .199f, .71f, .92f, 1}, // CT_LTBLUE3 + { .5f, .05f, .4f, 1}, // CT_DKBLUE3 + + { 0.0f, .613f, .097f, 1}, // CT_HUD_GREEN + { 0.835f, .015f, .015f, 1}, // CT_HUD_RED + { .567f, .685f, 1.0f, .75f}, // CT_ICON_BLUE + { .515f, .406f, .507f, 1}, // CT_NO_AMMO_RED + + { 1.0f, .658f, .062f, 1}, // CT_HUD_ORANGE + { 0.549f, .854f, 1.0f, 1.0f}, // CT_TITLE +}; + +unsigned ColorBytes3 (float r, float g, float b) { + unsigned i; + + ( (byte *)&i )[0] = (byte)(r * 255); + ( (byte *)&i )[1] = (byte)(g * 255); + ( (byte *)&i )[2] = (byte)(b * 255); + + return i; +} + +unsigned ColorBytes4 (float r, float g, float b, float a) { + unsigned i; + + ( (byte *)&i )[0] = (byte)(r * 255); + ( (byte *)&i )[1] = (byte)(g * 255); + ( (byte *)&i )[2] = (byte)(b * 255); + ( (byte *)&i )[3] = (byte)(a * 255); + + return i; +} + +float NormalizeColor( const vec3_t in, vec3_t out ) { + float max; + + max = in[0]; + if ( in[1] > max ) { + max = in[1]; + } + if ( in[2] > max ) { + max = in[2]; + } + + if ( !max ) { + VectorClear( out ); + } else { + out[0] = in[0] / max; + out[1] = in[1] / max; + out[2] = in[2] / max; + } + return max; +} diff --git a/shared/qcommon/q_color.h b/shared/qcommon/q_color.h new file mode 100644 index 0000000000..838a4e4d05 --- /dev/null +++ b/shared/qcommon/q_color.h @@ -0,0 +1,153 @@ +#pragma once + +#include "q_math_common.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +#define MAKERGB( v, r, g, b ) v[0]=r;v[1]=g;v[2]=b +#define MAKERGBA( v, r, g, b, a ) v[0]=r;v[1]=g;v[2]=b;v[3]=a + +#define Q_COLOR_ESCAPE '^' +#define Q_COLOR_BITS 0xF // was 7 + +// you MUST have the last bit on here about colour strings being less than 7 or taiwanese strings register as colour!!!! +#define Q_IsColorString(p) ( p && *(p) == Q_COLOR_ESCAPE && *((p)+1) && *((p)+1) != Q_COLOR_ESCAPE && *((p)+1) <= '9' && *((p)+1) >= '0' ) +#define Q_IsColorStringExt(p) ((p) && *(p) == Q_COLOR_ESCAPE && *((p)+1) && *((p)+1) >= '0' && *((p)+1) <= '9') // ^[0-9] + +#define COLOR_BLACK '0' +#define COLOR_RED '1' +#define COLOR_GREEN '2' +#define COLOR_YELLOW '3' +#define COLOR_BLUE '4' +#define COLOR_CYAN '5' +#define COLOR_MAGENTA '6' +#define COLOR_WHITE '7' +#define COLOR_ORANGE '8' +#define COLOR_GREY '9' +#define ColorIndex(c) ( ( (c) - '0' ) & Q_COLOR_BITS ) + +#define S_COLOR_BLACK "^0" +#define S_COLOR_RED "^1" +#define S_COLOR_GREEN "^2" +#define S_COLOR_YELLOW "^3" +#define S_COLOR_BLUE "^4" +#define S_COLOR_CYAN "^5" +#define S_COLOR_MAGENTA "^6" +#define S_COLOR_WHITE "^7" +#define S_COLOR_ORANGE "^8" +#define S_COLOR_GREY "^9" + +typedef enum ct_table_e +{ + CT_NONE, + CT_BLACK, + CT_RED, + CT_GREEN, + CT_BLUE, + CT_YELLOW, + CT_MAGENTA, + CT_CYAN, + CT_WHITE, + CT_LTGREY, + CT_MDGREY, + CT_DKGREY, + CT_DKGREY2, + + CT_VLTORANGE, + CT_LTORANGE, + CT_DKORANGE, + CT_VDKORANGE, + + CT_VLTBLUE1, + CT_LTBLUE1, + CT_DKBLUE1, + CT_VDKBLUE1, + + CT_VLTBLUE2, + CT_LTBLUE2, + CT_DKBLUE2, + CT_VDKBLUE2, + + CT_VLTBROWN1, + CT_LTBROWN1, + CT_DKBROWN1, + CT_VDKBROWN1, + + CT_VLTGOLD1, + CT_LTGOLD1, + CT_DKGOLD1, + CT_VDKGOLD1, + + CT_VLTPURPLE1, + CT_LTPURPLE1, + CT_DKPURPLE1, + CT_VDKPURPLE1, + + CT_VLTPURPLE2, + CT_LTPURPLE2, + CT_DKPURPLE2, + CT_VDKPURPLE2, + + CT_VLTPURPLE3, + CT_LTPURPLE3, + CT_DKPURPLE3, + CT_VDKPURPLE3, + + CT_VLTRED1, + CT_LTRED1, + CT_DKRED1, + CT_VDKRED1, + CT_VDKRED, + CT_DKRED, + + CT_VLTAQUA, + CT_LTAQUA, + CT_DKAQUA, + CT_VDKAQUA, + + CT_LTPINK, + CT_DKPINK, + CT_LTCYAN, + CT_DKCYAN, + CT_LTBLUE3, + CT_BLUE3, + CT_DKBLUE3, + + CT_HUD_GREEN, + CT_HUD_RED, + CT_ICON_BLUE, + CT_NO_AMMO_RED, + CT_HUD_ORANGE, + + CT_TITLE, + + CT_MAX +} ct_table_t; + +extern vec4_t colorBlack; +extern vec4_t colorRed; +extern vec4_t colorGreen; +extern vec4_t colorBlue; +extern vec4_t colorYellow; +extern vec4_t colorOrange; +extern vec4_t colorMagenta; +extern vec4_t colorCyan; +extern vec4_t colorWhite; +extern vec4_t colorLtGrey; +extern vec4_t colorMdGrey; +extern vec4_t colorDkGrey; +extern vec4_t colorLtBlue; +extern vec4_t colorDkBlue; + +extern vec4_t g_color_table[Q_COLOR_BITS+1]; +extern vec4_t colorTable[CT_MAX]; + +unsigned ColorBytes3 (float r, float g, float b); +unsigned ColorBytes4 (float r, float g, float b, float a); +float NormalizeColor( const vec3_t in, vec3_t out ); + +#if defined(__cplusplus) +} // extern "C" +#endif diff --git a/shared/qcommon/q_math_common.c b/shared/qcommon/q_math_common.c new file mode 100644 index 0000000000..8837bf6436 --- /dev/null +++ b/shared/qcommon/q_math_common.c @@ -0,0 +1,1337 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#include "q_math_common.h" +#include +#include +#include +#include + + +/////////////////////////////////////////////////////////////////////////// +// +// DIRECTION ENCODING +// +/////////////////////////////////////////////////////////////////////////// +#define NUMVERTEXNORMALS 162 +static const vec3_t bytedirs[NUMVERTEXNORMALS] = +{ + {-0.525731f, 0.000000f, 0.850651f}, {-0.442863f, 0.238856f, 0.864188f}, + {-0.295242f, 0.000000f, 0.955423f}, {-0.309017f, 0.500000f, 0.809017f}, + {-0.162460f, 0.262866f, 0.951056f}, {0.000000f, 0.000000f, 1.000000f}, + {0.000000f, 0.850651f, 0.525731f}, {-0.147621f, 0.716567f, 0.681718f}, + {0.147621f, 0.716567f, 0.681718f}, {0.000000f, 0.525731f, 0.850651f}, + {0.309017f, 0.500000f, 0.809017f}, {0.525731f, 0.000000f, 0.850651f}, + {0.295242f, 0.000000f, 0.955423f}, {0.442863f, 0.238856f, 0.864188f}, + {0.162460f, 0.262866f, 0.951056f}, {-0.681718f, 0.147621f, 0.716567f}, + {-0.809017f, 0.309017f, 0.500000f},{-0.587785f, 0.425325f, 0.688191f}, + {-0.850651f, 0.525731f, 0.000000f},{-0.864188f, 0.442863f, 0.238856f}, + {-0.716567f, 0.681718f, 0.147621f},{-0.688191f, 0.587785f, 0.425325f}, + {-0.500000f, 0.809017f, 0.309017f}, {-0.238856f, 0.864188f, 0.442863f}, + {-0.425325f, 0.688191f, 0.587785f}, {-0.716567f, 0.681718f, -0.147621f}, + {-0.500000f, 0.809017f, -0.309017f}, {-0.525731f, 0.850651f, 0.000000f}, + {0.000000f, 0.850651f, -0.525731f}, {-0.238856f, 0.864188f, -0.442863f}, + {0.000000f, 0.955423f, -0.295242f}, {-0.262866f, 0.951056f, -0.162460f}, + {0.000000f, 1.000000f, 0.000000f}, {0.000000f, 0.955423f, 0.295242f}, + {-0.262866f, 0.951056f, 0.162460f}, {0.238856f, 0.864188f, 0.442863f}, + {0.262866f, 0.951056f, 0.162460f}, {0.500000f, 0.809017f, 0.309017f}, + {0.238856f, 0.864188f, -0.442863f},{0.262866f, 0.951056f, -0.162460f}, + {0.500000f, 0.809017f, -0.309017f},{0.850651f, 0.525731f, 0.000000f}, + {0.716567f, 0.681718f, 0.147621f}, {0.716567f, 0.681718f, -0.147621f}, + {0.525731f, 0.850651f, 0.000000f}, {0.425325f, 0.688191f, 0.587785f}, + {0.864188f, 0.442863f, 0.238856f}, {0.688191f, 0.587785f, 0.425325f}, + {0.809017f, 0.309017f, 0.500000f}, {0.681718f, 0.147621f, 0.716567f}, + {0.587785f, 0.425325f, 0.688191f}, {0.955423f, 0.295242f, 0.000000f}, + {1.000000f, 0.000000f, 0.000000f}, {0.951056f, 0.162460f, 0.262866f}, + {0.850651f, -0.525731f, 0.000000f},{0.955423f, -0.295242f, 0.000000f}, + {0.864188f, -0.442863f, 0.238856f}, {0.951056f, -0.162460f, 0.262866f}, + {0.809017f, -0.309017f, 0.500000f}, {0.681718f, -0.147621f, 0.716567f}, + {0.850651f, 0.000000f, 0.525731f}, {0.864188f, 0.442863f, -0.238856f}, + {0.809017f, 0.309017f, -0.500000f}, {0.951056f, 0.162460f, -0.262866f}, + {0.525731f, 0.000000f, -0.850651f}, {0.681718f, 0.147621f, -0.716567f}, + {0.681718f, -0.147621f, -0.716567f},{0.850651f, 0.000000f, -0.525731f}, + {0.809017f, -0.309017f, -0.500000f}, {0.864188f, -0.442863f, -0.238856f}, + {0.951056f, -0.162460f, -0.262866f}, {0.147621f, 0.716567f, -0.681718f}, + {0.309017f, 0.500000f, -0.809017f}, {0.425325f, 0.688191f, -0.587785f}, + {0.442863f, 0.238856f, -0.864188f}, {0.587785f, 0.425325f, -0.688191f}, + {0.688191f, 0.587785f, -0.425325f}, {-0.147621f, 0.716567f, -0.681718f}, + {-0.309017f, 0.500000f, -0.809017f}, {0.000000f, 0.525731f, -0.850651f}, + {-0.525731f, 0.000000f, -0.850651f}, {-0.442863f, 0.238856f, -0.864188f}, + {-0.295242f, 0.000000f, -0.955423f}, {-0.162460f, 0.262866f, -0.951056f}, + {0.000000f, 0.000000f, -1.000000f}, {0.295242f, 0.000000f, -0.955423f}, + {0.162460f, 0.262866f, -0.951056f}, {-0.442863f, -0.238856f, -0.864188f}, + {-0.309017f, -0.500000f, -0.809017f}, {-0.162460f, -0.262866f, -0.951056f}, + {0.000000f, -0.850651f, -0.525731f}, {-0.147621f, -0.716567f, -0.681718f}, + {0.147621f, -0.716567f, -0.681718f}, {0.000000f, -0.525731f, -0.850651f}, + {0.309017f, -0.500000f, -0.809017f}, {0.442863f, -0.238856f, -0.864188f}, + {0.162460f, -0.262866f, -0.951056f}, {0.238856f, -0.864188f, -0.442863f}, + {0.500000f, -0.809017f, -0.309017f}, {0.425325f, -0.688191f, -0.587785f}, + {0.716567f, -0.681718f, -0.147621f}, {0.688191f, -0.587785f, -0.425325f}, + {0.587785f, -0.425325f, -0.688191f}, {0.000000f, -0.955423f, -0.295242f}, + {0.000000f, -1.000000f, 0.000000f}, {0.262866f, -0.951056f, -0.162460f}, + {0.000000f, -0.850651f, 0.525731f}, {0.000000f, -0.955423f, 0.295242f}, + {0.238856f, -0.864188f, 0.442863f}, {0.262866f, -0.951056f, 0.162460f}, + {0.500000f, -0.809017f, 0.309017f}, {0.716567f, -0.681718f, 0.147621f}, + {0.525731f, -0.850651f, 0.000000f}, {-0.238856f, -0.864188f, -0.442863f}, + {-0.500000f, -0.809017f, -0.309017f}, {-0.262866f, -0.951056f, -0.162460f}, + {-0.850651f, -0.525731f, 0.000000f}, {-0.716567f, -0.681718f, -0.147621f}, + {-0.716567f, -0.681718f, 0.147621f}, {-0.525731f, -0.850651f, 0.000000f}, + {-0.500000f, -0.809017f, 0.309017f}, {-0.238856f, -0.864188f, 0.442863f}, + {-0.262866f, -0.951056f, 0.162460f}, {-0.864188f, -0.442863f, 0.238856f}, + {-0.809017f, -0.309017f, 0.500000f}, {-0.688191f, -0.587785f, 0.425325f}, + {-0.681718f, -0.147621f, 0.716567f}, {-0.442863f, -0.238856f, 0.864188f}, + {-0.587785f, -0.425325f, 0.688191f}, {-0.309017f, -0.500000f, 0.809017f}, + {-0.147621f, -0.716567f, 0.681718f}, {-0.425325f, -0.688191f, 0.587785f}, + {-0.162460f, -0.262866f, 0.951056f}, {0.442863f, -0.238856f, 0.864188f}, + {0.162460f, -0.262866f, 0.951056f}, {0.309017f, -0.500000f, 0.809017f}, + {0.147621f, -0.716567f, 0.681718f}, {0.000000f, -0.525731f, 0.850651f}, + {0.425325f, -0.688191f, 0.587785f}, {0.587785f, -0.425325f, 0.688191f}, + {0.688191f, -0.587785f, 0.425325f}, {-0.955423f, 0.295242f, 0.000000f}, + {-0.951056f, 0.162460f, 0.262866f}, {-1.000000f, 0.000000f, 0.000000f}, + {-0.850651f, 0.000000f, 0.525731f}, {-0.955423f, -0.295242f, 0.000000f}, + {-0.951056f, -0.162460f, 0.262866f}, {-0.864188f, 0.442863f, -0.238856f}, + {-0.951056f, 0.162460f, -0.262866f}, {-0.809017f, 0.309017f, -0.500000f}, + {-0.864188f, -0.442863f, -0.238856f}, {-0.951056f, -0.162460f, -0.262866f}, + {-0.809017f, -0.309017f, -0.500000f}, {-0.681718f, 0.147621f, -0.716567f}, + {-0.681718f, -0.147621f, -0.716567f}, {-0.850651f, 0.000000f, -0.525731f}, + {-0.688191f, 0.587785f, -0.425325f}, {-0.587785f, 0.425325f, -0.688191f}, + {-0.425325f, 0.688191f, -0.587785f}, {-0.425325f, -0.688191f, -0.587785f}, + {-0.587785f, -0.425325f, -0.688191f}, {-0.688191f, -0.587785f, -0.425325f} +}; + +// this isn't a real cheap function to call! +int DirToByte( vec3_t dir ) +{ + int i, best; + float d, bestd; + + if ( !dir ) { + return 0; + } + + bestd = 0; + best = 0; + for (i=0 ; i bestd) + { + bestd = d; + best = i; + } + } + + return best; +} + +void ByteToDir( int b, vec3_t dir ) +{ + if ( b < 0 || b >= NUMVERTEXNORMALS ) { + VectorCopy( vec3_origin, dir ); + return; + } + VectorCopy(bytedirs[b], dir); +} + +/* +** NormalToLatLong +** +** We use two byte encoded normals in some space critical applications. +** Lat = 0 at (1,0,0) to 360 (-1,0,0), encoded in 8-bit sine table format +** Lng = 0 at (0,0,1) to 180 (0,0,-1), encoded in 8-bit sine table format +** +*/ +//rwwRMG - added +void NormalToLatLong( const vec3_t normal, byte bytes[2] ) +{ + // check for singularities + if (!normal[0] && !normal[1]) + { + if ( normal[2] > 0.0f ) + { + bytes[0] = 0; + bytes[1] = 0; // lat = 0, long = 0 + } + else + { + bytes[0] = 128; + bytes[1] = 0; // lat = 0, long = 128 + } + } + else + { + int a, b; + + a = (int)(RAD2DEG( (float)atan2( normal[1], normal[0] ) ) * (255.0f / 360.0f )); + a &= 0xff; + + b = (int)(RAD2DEG( (float)acos( normal[2] ) ) * ( 255.0f / 360.0f )); + b &= 0xff; + + bytes[0] = b; // longitude + bytes[1] = a; // lattitude + } +} + +/////////////////////////////////////////////////////////////////////////// +// +// RANDOM NUMBER GENERATION +// +/////////////////////////////////////////////////////////////////////////// +int Q_rand( int *seed ) +{ + *seed = (69069 * *seed + 1); + return *seed; +} + +float Q_random( int *seed ) +{ + return (Q_rand(seed) & 0xffff) / (float)0x10000; +} + +float Q_crandom( int *seed ) +{ + return 2.0f * (Q_random(seed) - 0.5f); +} + +// This is the VC libc version of rand() without multiple seeds per thread or 12 levels +// of subroutine calls. +// Both calls have been designed to minimise the inherent number of float <--> int +// conversions and the additional math required to get the desired value. +// eg the typical tint = (rand() * 255) / 32768 +// becomes tint = irand(0, 255) +static uint32_t holdrand = 0x89abcdef; + +void Rand_Init( int seed ) +{ + holdrand = seed; +} + +// Returns a float min <= x < max (exclusive; will get max - 0.00001; but never max) +float flrand(float min, float max) +{ + float result; + + holdrand = (holdrand * 214013L) + 2531011L; + result = (float)(holdrand >> 17); // 0 - 32767 range + result = ((result * (max - min)) / (float)QRAND_MAX) + min; + + return(result); +} + +float Q_flrand( float min, float max ) +{ + return flrand(min, max); +} + +// Returns an integer min <= x <= max (ie inclusive) +int irand( int min, int max ) +{ + int result; + + assert((max - min) < QRAND_MAX); + + max++; + holdrand = (holdrand * 214013L) + 2531011L; + result = holdrand >> 17; + result = ((result * (max - min)) >> 15) + min; + + return result; +} + +int Q_irand( int value1, int value2 ) +{ + return irand(value1, value2); +} + +/* +erandom + +This function produces a random number with a exponential +distribution and the specified mean value. +*/ +float erandom( float mean ) +{ + float r; + + do { + r = random(); + } while ( r == 0.0 ); + + return -mean * logf( r ); +} + + +/////////////////////////////////////////////////////////////////////////// +// +// MATH UTILITIES +// +/////////////////////////////////////////////////////////////////////////// +signed char ClampChar( int i ) +{ + if ( i < -128 ) { + return -128; + } + if ( i > 127 ) { + return 127; + } + return i; +} + +signed short ClampShort( int i ) +{ + if ( i < -32768 ) { + return -32768; + } + if ( i > 0x7fff ) { + return 0x7fff; + } + return i; +} + +float Q_rsqrt( float number ) +{ + byteAlias_t t; + float x2, y; + const float threehalfs = 1.5F; + + x2 = number * 0.5F; + y = number; + t.f = number; + t.i = 0x5f3759df - ( t.i >> 1 ); // what the fuck? + y = t.f; + y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration + // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed + + assert( !Q_isnan(y) ); + return y; +} + +float Q_fabs( float f ) +{ + byteAlias_t fi; + fi.f = f; + fi.i &= 0x7FFFFFFF; + return fi.f; +} + +/* +===================== +Q_acos + +the msvc acos doesn't always return a value between -PI and PI: + +int i; +i = 1065353246; +acos(*(float*) &i) == -1.#IND0 + +This should go in q_math but it is too late to add new traps +to game and ui +===================== +*/ +float Q_acos(float c) { + float angle; + + angle = acosf(c); + + if (angle > M_PI) { + return (float)M_PI; + } + if (angle < -M_PI) { + return (float)M_PI; + } + return angle; +} + +float Q_asin(float c) +{ + float angle; + + angle = asinf(c); + + if (angle > M_PI) { + return (float)M_PI; + } + if (angle < -M_PI) { + return (float)M_PI; + } + return angle; +} + +float Q_powf ( float x, int y ) +{ + float r = x; + for ( y--; y>0; y-- ) + r *= x; + return r; +} + +qboolean Q_isnan (float f) +{ +#ifdef _MSC_VER + return (qboolean)(_isnan (f) != 0); +#else + return (qboolean)(isnan (f) != 0); +#endif +} + +int Q_log2( int val ) +{ + int answer; + + answer = 0; + while ( ( val>>=1 ) != 0 ) { + answer++; + } + return answer; +} + +float LerpAngle(float from, float to, float frac) +{ + float a; + + if ( to - from > 180 ) { + to -= 360; + } + if ( to - from < -180 ) { + to += 360; + } + a = from + frac * (to - from); + + return a; +} + +/* +================= +AngleSubtract + +Always returns a value from -180 to 180 +================= +*/ +float AngleSubtract( float a1, float a2 ) { + float a; + + a = a1 - a2; + a=fmodf(a,360);//chop it down quickly, then level it out + while ( a > 180 ) { + a -= 360; + } + while ( a < -180 ) { + a += 360; + } + return a; +} + +void AnglesSubtract( vec3_t v1, vec3_t v2, vec3_t v3 ) { + v3[0] = AngleSubtract( v1[0], v2[0] ); + v3[1] = AngleSubtract( v1[1], v2[1] ); + v3[2] = AngleSubtract( v1[2], v2[2] ); +} + +float AngleMod(float a) { + a = (360.0f/65536) * ((int)(a*(65536/360.0f)) & 65535); + return a; +} + +/* +================= +AngleNormalize360 + +returns angle normalized to the range [0 <= angle < 360] +================= +*/ +float AngleNormalize360 ( float angle ) { + return (360.0f / 65536) * ((int)(angle * (65536 / 360.0f)) & 65535); +} + +/* +================= +AngleNormalize180 + +returns angle normalized to the range [-180 < angle <= 180] +================= +*/ +float AngleNormalize180 ( float angle ) { + angle = AngleNormalize360( angle ); + if ( angle > 180.0 ) { + angle -= 360.0; + } + return angle; +} + +/* +================= +AngleDelta + +returns the normalized delta from angle1 to angle2 +================= +*/ +float AngleDelta ( float angle1, float angle2 ) { + return AngleNormalize180( angle1 - angle2 ); +} + + +/////////////////////////////////////////////////////////////////////////// +// +// GEOMETRIC UTILITIES +// +/////////////////////////////////////////////////////////////////////////// +/* +===================== +PlaneFromPoints + +Returns false if the triangle is degenrate. +The normal will point out of the clock for clockwise ordered points +===================== +*/ +qboolean PlaneFromPoints( vec4_t plane, const vec3_t a, const vec3_t b, const vec3_t c ) { + vec3_t d1, d2; + + VectorSubtract( b, a, d1 ); + VectorSubtract( c, a, d2 ); + CrossProduct( d2, d1, plane ); + if ( VectorNormalize( plane ) == 0 ) { + return qfalse; + } + + plane[3] = DotProduct( a, plane ); + return qtrue; +} + +/* +=============== +RotatePointAroundVector + +From q3mme +=============== +*/ +void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float degrees ) { + float m[3][3]; + float c, s, t; + + degrees = DEG2RAD( degrees ); + s = sinf( degrees ); + c = cosf( degrees ); + t = 1 - c; + + m[0][0] = t*dir[0]*dir[0] + c; + m[0][1] = t*dir[0]*dir[1] + s*dir[2]; + m[0][2] = t*dir[0]*dir[2] - s*dir[1]; + + m[1][0] = t*dir[0]*dir[1] - s*dir[2]; + m[1][1] = t*dir[1]*dir[1] + c; + m[1][2] = t*dir[1]*dir[2] + s*dir[0]; + + m[2][0] = t*dir[0]*dir[2] + s*dir[1]; + m[2][1] = t*dir[1]*dir[2] - s*dir[0]; + m[2][2] = t*dir[2]*dir[2] + c; + VectorRotate( point, m, dst ); +} + +void RotateAroundDirection( matrix3_t axis, float yaw ) { + + // create an arbitrary axis[1] + PerpendicularVector( axis[1], axis[0] ); + + // rotate it around axis[0] by yaw + if ( yaw ) { + vec3_t temp; + + VectorCopy( axis[1], temp ); + RotatePointAroundVector( axis[1], axis[0], temp, yaw ); + } + + // cross to get axis[2] + CrossProduct( axis[0], axis[1], axis[2] ); +} + +void vectoangles( const vec3_t value1, vec3_t angles ) { + float forward; + float yaw, pitch; + + if ( value1[1] == 0 && value1[0] == 0 ) { + yaw = 0; + if ( value1[2] > 0 ) { + pitch = 90; + } + else { + pitch = 270; + } + } + else { + if ( value1[0] ) { + yaw = ( atan2f ( value1[1], value1[0] ) * 180 / M_PI ); + } + else if ( value1[1] > 0 ) { + yaw = 90; + } + else { + yaw = 270; + } + if ( yaw < 0 ) { + yaw += 360; + } + + forward = sqrtf ( value1[0]*value1[0] + value1[1]*value1[1] ); + pitch = ( atan2f(value1[2], forward) * 180 / M_PI ); + if ( pitch < 0 ) { + pitch += 360; + } + } + + angles[PITCH] = -pitch; + angles[YAW] = yaw; + angles[ROLL] = 0; +} + +vec_t GetYawForDirection( const vec3_t p1, const vec3_t p2 ) { + vec3_t v, angles; + + VectorSubtract( p2, p1, v ); + vectoangles( v, angles ); + + return angles[YAW]; +} + +void GetAnglesForDirection( const vec3_t p1, const vec3_t p2, vec3_t out ) { + vec3_t v; + + VectorSubtract( p2, p1, v ); + vectoangles( v, out ); +} + +void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal ) +{ + float d; + vec3_t n; + float inv_denom; + + inv_denom = DotProduct( normal, normal ); + assert( Q_fabs(inv_denom) != 0.0f ); + inv_denom = 1.0f / inv_denom; + + d = DotProduct( normal, p ) * inv_denom; + + n[0] = normal[0] * inv_denom; + n[1] = normal[1] * inv_denom; + n[2] = normal[2] * inv_denom; + + dst[0] = p[0] - d * n[0]; + dst[1] = p[1] - d * n[1]; + dst[2] = p[2] - d * n[2]; +} + +qboolean G_FindClosestPointOnLineSegment( const vec3_t start, const vec3_t end, const vec3_t from, vec3_t result ) +{ + vec3_t vecStart2From, vecStart2End, vecEnd2Start, vecEnd2From; + float distEnd2From, distEnd2Result, theta, cos_theta, dot; + + //Find the perpendicular vector to vec from start to end + VectorSubtract( from, start, vecStart2From); + VectorSubtract( end, start, vecStart2End); + + dot = DotProductNormalize( vecStart2From, vecStart2End ); + + if ( dot <= 0 ) + { + //The perpendicular would be beyond or through the start point + VectorCopy( start, result ); + return qfalse; + } + + if ( dot == 1 ) + { + //parallel, closer of 2 points will be the target + if( (VectorLengthSquared( vecStart2From )) < (VectorLengthSquared( vecStart2End )) ) + { + VectorCopy( from, result ); + } + else + { + VectorCopy( end, result ); + } + return qfalse; + } + + //Try other end + VectorSubtract( from, end, vecEnd2From); + VectorSubtract( start, end, vecEnd2Start); + + dot = DotProductNormalize( vecEnd2From, vecEnd2Start ); + + if ( dot <= 0 ) + {//The perpendicular would be beyond or through the start point + VectorCopy( end, result ); + return qfalse; + } + + if ( dot == 1 ) + {//parallel, closer of 2 points will be the target + if( (VectorLengthSquared( vecEnd2From )) < (VectorLengthSquared( vecEnd2Start ))) + { + VectorCopy( from, result ); + } + else + { + VectorCopy( end, result ); + } + return qfalse; + } + + // /| + // c / | + // / |a + // theta /)__| + // b + //cos(theta) = b / c + //solve for b + //b = cos(theta) * c + + //angle between vecs end2from and end2start, should be between 0 and 90 + theta = 90 * (1 - dot);//theta + + //Get length of side from End2Result using sine of theta + distEnd2From = VectorLength( vecEnd2From );//c + cos_theta = cosf(DEG2RAD(theta));//cos(theta) + distEnd2Result = cos_theta * distEnd2From;//b + + //Extrapolate to find result + VectorNormalize( vecEnd2Start ); + VectorMA( end, distEnd2Result, vecEnd2Start, result ); + + //perpendicular intersection is between the 2 endpoints + return qtrue; +} + +float G_PointDistFromLineSegment( const vec3_t start, const vec3_t end, const vec3_t from ) +{ + vec3_t vecStart2From, vecStart2End, vecEnd2Start, vecEnd2From, intersection; + float distEnd2From, distStart2From, distEnd2Result, theta, cos_theta, dot; + + //Find the perpendicular vector to vec from start to end + VectorSubtract( from, start, vecStart2From); + VectorSubtract( end, start, vecStart2End); + VectorSubtract( from, end, vecEnd2From); + VectorSubtract( start, end, vecEnd2Start); + + dot = DotProductNormalize( vecStart2From, vecStart2End ); + + distStart2From = Distance( start, from ); + distEnd2From = Distance( end, from ); + + if ( dot <= 0 ) + { + //The perpendicular would be beyond or through the start point + return distStart2From; + } + + if ( dot == 1 ) + { + //parallel, closer of 2 points will be the target + return ((distStart2From b ? a : b; + } + + return VectorLength (corner); +} + +void ClearBounds( vec3_t mins, vec3_t maxs ) { + mins[0] = mins[1] = mins[2] = 100000; + maxs[0] = maxs[1] = maxs[2] = -100000; +} + +void AddPointToBounds( const vec3_t v, vec3_t mins, vec3_t maxs ) { + if ( v[0] < mins[0] ) { + mins[0] = v[0]; + } + if ( v[0] > maxs[0]) { + maxs[0] = v[0]; + } + + if ( v[1] < mins[1] ) { + mins[1] = v[1]; + } + if ( v[1] > maxs[1]) { + maxs[1] = v[1]; + } + + if ( v[2] < mins[2] ) { + mins[2] = v[2]; + } + if ( v[2] > maxs[2]) { + maxs[2] = v[2]; + } +} + + +/////////////////////////////////////////////////////////////////////////// +// +// PLANE +// +/////////////////////////////////////////////////////////////////////////// +void SetPlaneSignbits( cplane_t *out ) +{ + int bits, j; + + // for fast box on planeside test + bits = 0; + for (j=0 ; j<3 ; j++) { + if (out->normal[j] < 0) { + bits |= 1<signbits = bits; +} + +int PlaneTypeForNormal( vec3_t normal ) +{ + if ( normal[0] == 1.0 ) + return PLANE_X; + if ( normal[1] == 1.0 ) + return PLANE_Y; + if ( normal[2] == 1.0 ) + return PLANE_Z; + + return PLANE_NON_AXIAL; +} + +/* +================== +BoxOnPlaneSide + +Returns 1, 2, or 1 + 2 +================== +*/ +int BoxOnPlaneSide(vec3_t emins, vec3_t emaxs, cplane_t *p) +{ + float dist[2]; + int sides, b, i; + + // fast axial cases + if (p->type < 3) + { + if (p->dist <= emins[p->type]) + return 1; + if (p->dist >= emaxs[p->type]) + return 2; + return 3; + } + + // general case + dist[0] = dist[1] = 0; + if (p->signbits < 8) // >= 8: default case is original code (dist[0]=dist[1]=0) + { + for (i=0 ; i<3 ; i++) + { + b = (p->signbits >> i) & 1; + dist[ b] += p->normal[i]*emaxs[i]; + dist[!b] += p->normal[i]*emins[i]; + } + } + + sides = 0; + if (dist[0] >= p->dist) + sides = 1; + if (dist[1] < p->dist) + sides |= 2; + + return sides; +} + + +/////////////////////////////////////////////////////////////////////////// +// +// AXIS +// +/////////////////////////////////////////////////////////////////////////// +matrix3_t axisDefault = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } }; + +void AxisClear( matrix3_t axis ) { + axis[0][0] = 1; + axis[0][1] = 0; + axis[0][2] = 0; + axis[1][0] = 0; + axis[1][1] = 1; + axis[1][2] = 0; + axis[2][0] = 0; + axis[2][1] = 0; + axis[2][2] = 1; +} + +void AxisCopy( matrix3_t in, matrix3_t out ) { + VectorCopy( in[0], out[0] ); + VectorCopy( in[1], out[1] ); + VectorCopy( in[2], out[2] ); +} + +void AnglesToAxis( const vec3_t angles, matrix3_t axis ) { + vec3_t right; + + // angle vectors returns "right" instead of "y axis" + AngleVectors( angles, axis[0], right, axis[2] ); + VectorSubtract( vec3_origin, right, axis[1] ); +} + + +/////////////////////////////////////////////////////////////////////////// +// +// VEC3 +// +/////////////////////////////////////////////////////////////////////////// +vec3_t vec3_origin = {0,0,0}; + +void VectorAdd( const vec3_t vec1, const vec3_t vec2, vec3_t vecOut ) +{ + vecOut[0] = vec1[0]+vec2[0]; + vecOut[1] = vec1[1]+vec2[1]; + vecOut[2] = vec1[2]+vec2[2]; +} + +void VectorSubtract( const vec3_t vec1, const vec3_t vec2, vec3_t vecOut ) +{ + vecOut[0] = vec1[0]-vec2[0]; + vecOut[1] = vec1[1]-vec2[1]; + vecOut[2] = vec1[2]-vec2[2]; +} + +void VectorScale( const vec3_t vecIn, float scale, vec3_t vecOut ) +{ + vecOut[0] = vecIn[0]*scale; + vecOut[1] = vecIn[1]*scale; + vecOut[2] = vecIn[2]*scale; +} + +void VectorMA( const vec3_t vec1, float scale, const vec3_t vec2, vec3_t vecOut ) +{ + vecOut[0] = vec1[0] + scale*vec2[0]; + vecOut[1] = vec1[1] + scale*vec2[1]; + vecOut[2] = vec1[2] + scale*vec2[2]; +} + +void VectorSet( vec3_t vec, float x, float y, float z ) +{ + vec[0]=x; vec[1]=y; vec[2]=z; +} + +void VectorClear( vec3_t vec ) +{ + vec[0] = vec[1] = vec[2] = 0.0f; +} + +void VectorCopy( const vec3_t vecIn, vec3_t vecOut ) +{ + vecOut[0] = vecIn[0]; + vecOut[1] = vecIn[1]; + vecOut[2] = vecIn[2]; +} + +float VectorLength( const vec3_t vec ) +{ + return (float)sqrt( vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2] ); +} + +float VectorLengthSquared( const vec3_t vec ) +{ + return (vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]); +} + +float Distance( const vec3_t p1, const vec3_t p2 ) +{ + vec3_t v; + + VectorSubtract( p2, p1, v ); + return VectorLength( v ); +} + +float DistanceSquared( const vec3_t p1, const vec3_t p2 ) +{ + vec3_t v; + + VectorSubtract( p2, p1, v ); + return v[0]*v[0] + v[1]*v[1] + v[2]*v[2]; +} + +// fast vector normalize routine that does not check to make sure +// that length != 0, nor does it return length, uses rsqrt approximation +void VectorNormalizeFast( vec3_t vec ) +{ + float ilength; + + ilength = Q_rsqrt( DotProduct( vec, vec ) ); + + vec[0] *= ilength; + vec[1] *= ilength; + vec[2] *= ilength; +} + +float VectorNormalize( vec3_t vec ) +{ + float length, ilength; + + length = vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]; + length = sqrtf( length ); + + if ( length ) { + ilength = 1/length; + vec[0] *= ilength; + vec[1] *= ilength; + vec[2] *= ilength; + } + + return length; +} + +float VectorNormalize2( const vec3_t vec, vec3_t vecOut ) +{ + float length, ilength; + + length = vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]; + length = sqrtf( length ); + + if ( length ) { + ilength = 1/length; + vecOut[0] = vec[0]*ilength; + vecOut[1] = vec[1]*ilength; + vecOut[2] = vec[2]*ilength; + } + else + VectorClear( vecOut ); + + return length; +} + +void VectorAdvance( const vec3_t veca, const float scale, const vec3_t vecb, vec3_t vecc) +{ + vecc[0] = veca[0] + (scale * (vecb[0] - veca[0])); + vecc[1] = veca[1] + (scale * (vecb[1] - veca[1])); + vecc[2] = veca[2] + (scale * (vecb[2] - veca[2])); +} + +void VectorInc( vec3_t vec ) { + vec[0] += 1.0f; vec[1] += 1.0f; vec[2] += 1.0f; +} + +void VectorDec( vec3_t vec ) { + vec[0] -= 1.0f; vec[1] -= 1.0f; vec[2] -= 1.0f; +} + +void VectorInverse( vec3_t vec ) { + vec[0] = -vec[0]; vec[1] = -vec[1]; vec[2] = -vec[2]; +} + +void CrossProduct( const vec3_t vec1, const vec3_t vec2, vec3_t vecOut ) { + vecOut[0] = vec1[1]*vec2[2] - vec1[2]*vec2[1]; + vecOut[1] = vec1[2]*vec2[0] - vec1[0]*vec2[2]; + vecOut[2] = vec1[0]*vec2[1] - vec1[1]*vec2[0]; +} + +float DotProduct( const vec3_t vec1, const vec3_t vec2 ) { + return vec1[0]*vec2[0] + vec1[1]*vec2[1] + vec1[2]*vec2[2]; +} + +qboolean VectorCompare( const vec3_t vec1, const vec3_t vec2 ) +{ + return (qboolean)(vec1[0] == vec2[0] && vec1[1] == vec2[1] && vec1[2] == vec2[2]); +} + +qboolean VectorCompare2( const vec3_t v1, const vec3_t v2 ) +{ + if ( v1[0] > (v2[0] + 0.0001f) || v1[0] < (v2[0] - 0.0001f) || + v1[1] > (v2[1] + 0.0001f) || v1[1] < (v2[1] + 0.0001f) || + v1[2] > (v2[2] + 0.0001f) || v1[2] < (v2[2] + 0.0001f) ) + { + return qfalse; + } + + return qtrue; +} + +void SnapVector( float *v ) +{ +#if defined(_MSC_VER) && !defined(idx64) + // pitiful attempt to reduce _ftol2 calls -rww + static int i; + static float f; + + f = *v; + __asm fld f + __asm fistp i + *v = (float)i; + v++; + f = *v; + __asm fld f + __asm fistp i + *v = (float)i; + v++; + f = *v; + __asm fld f + __asm fistp i + *v = (float)i; +#else // mac, linux, mingw + v[0] = (int)v[0]; + v[1] = (int)v[1]; + v[2] = (int)v[2]; +#endif +} + +float DistanceHorizontal( const vec3_t p1, const vec3_t p2 ) +{ + vec3_t v; + + VectorSubtract( p2, p1, v ); + return sqrtf( v[0]*v[0] + v[1]*v[1] ); //Leave off the z component +} + +float DistanceHorizontalSquared( const vec3_t p1, const vec3_t p2 ) +{ + vec3_t v; + + VectorSubtract( p2, p1, v ); + return v[0]*v[0] + v[1]*v[1]; //Leave off the z component +} + +/* +================ +MakeNormalVectors + +Given a normalized forward vector, create two +other perpendicular vectors +================ +*/ +void MakeNormalVectors( const vec3_t forward, vec3_t right, vec3_t up) { + float d; + + // this rotate and negate guarantees a vector + // not colinear with the original + right[1] = -forward[0]; + right[2] = forward[1]; + right[0] = forward[2]; + + d = DotProduct(right, forward); + VectorMA(right, -d, forward, right); + VectorNormalize (right); + CrossProduct (right, forward, up); +} + +void VectorRotate( const vec3_t in, matrix3_t matrix, vec3_t out ) +{ + out[0] = DotProduct( in, matrix[0] ); + out[1] = DotProduct( in, matrix[1] ); + out[2] = DotProduct( in, matrix[2] ); +} + +void AngleVectors( const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up) { + float angle; + static float sr, sp, sy, cr, cp, cy; + // static to help MS compiler fp bugs + + angle = angles[YAW] * (M_PI*2 / 360); + sy = sinf(angle); + cy = cosf(angle); + angle = angles[PITCH] * (M_PI*2 / 360); + sp = sinf(angle); + cp = cosf(angle); + angle = angles[ROLL] * (M_PI*2 / 360); + sr = sinf(angle); + cr = cosf(angle); + + if (forward) + { + forward[0] = cp*cy; + forward[1] = cp*sy; + forward[2] = -sp; + } + if (right) + { + right[0] = (-1*sr*sp*cy+-1*cr*-sy); + right[1] = (-1*sr*sp*sy+-1*cr*cy); + right[2] = -1*sr*cp; + } + if (up) + { + up[0] = (cr*sp*cy+-sr*-sy); + up[1] = (cr*sp*sy+-sr*cy); + up[2] = cr*cp; + } +} + +/* +** assumes "src" is normalized +*/ +void PerpendicularVector( vec3_t dst, const vec3_t src ) +{ + int pos; + int i; + float minelem = 1.0F; + vec3_t tempvec; + + /* + ** find the smallest magnitude axially aligned vector + */ + for ( pos = 0, i = 0; i < 3; i++ ) + { + if ( fabs( src[i] ) < minelem ) + { + pos = i; + minelem = fabsf( src[i] ); + } + } + tempvec[0] = tempvec[1] = tempvec[2] = 0.0F; + tempvec[pos] = 1.0F; + + /* + ** project the point onto the plane defined by src + */ + ProjectPointOnPlane( dst, tempvec, src ); + + /* + ** normalize the result + */ + VectorNormalize( dst ); +} + +float DotProductNormalize( const vec3_t inVec1, const vec3_t inVec2 ) +{ + vec3_t v1, v2; + + VectorNormalize2( inVec1, v1 ); + VectorNormalize2( inVec2, v2 ); + + return DotProduct(v1, v2); +} + + +/////////////////////////////////////////////////////////////////////////// +// +// VEC4 +// +/////////////////////////////////////////////////////////////////////////// +void VectorScale4( const vec4_t vecIn, float scale, vec4_t vecOut ) +{ + vecOut[0] = vecIn[0]*scale; + vecOut[1] = vecIn[1]*scale; + vecOut[2] = vecIn[2]*scale; + vecOut[3] = vecIn[3]*scale; +} + +void VectorCopy4( const vec4_t vecIn, vec4_t vecOut ) +{ + vecOut[0] = vecIn[0]; + vecOut[1] = vecIn[1]; + vecOut[2] = vecIn[2]; + vecOut[3] = vecIn[3]; +} + +void VectorSet4( vec4_t vec, float x, float y, float z, float w ) +{ + vec[0]=x; vec[1]=y; vec[2]=z; vec[3]=w; +} + +void VectorClear4( vec4_t vec ) +{ + vec[0] = vec[1] = vec[2] = vec[3] = 0; +} + +/////////////////////////////////////////////////////////////////////////// +// +// VEC5 +// +/////////////////////////////////////////////////////////////////////////// +void VectorSet5( vec5_t vec, float x, float y, float z, float w, float u ) { + vec[0]=x; vec[1]=y; vec[2]=z; vec[3]=w; vec[4]=u; +} diff --git a/shared/qcommon/q_math_common.h b/shared/qcommon/q_math_common.h new file mode 100644 index 0000000000..1a0ddb3f8a --- /dev/null +++ b/shared/qcommon/q_math_common.h @@ -0,0 +1,280 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ +#pragma once + +#include "q_platform.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +typedef float vec_t; +typedef float vec2_t[2], vec3_t[3], vec4_t[4], vec5_t[5]; +typedef int ivec2_t[2], ivec3_t[3], ivec4_t[4], ivec5_t[5]; +typedef vec3_t vec3pair_t[2], matrix3_t[3]; + +typedef int fixed4_t, fixed8_t, fixed16_t; + +#ifndef M_PI +#define M_PI 3.14159265358979323846f // matches value in gcc v2 math.h +#endif + +#define MAX_QINT 0x7fffffff +#define MIN_QINT (-MAX_QINT-1) + +/////////////////////////////////////////////////////////////////////////// +// +// DIRECTION ENCODING +// +/////////////////////////////////////////////////////////////////////////// +int DirToByte( vec3_t dir ); +void ByteToDir( int b, vec3_t dir ); +void NormalToLatLong( const vec3_t normal, byte bytes[2] ); + +/////////////////////////////////////////////////////////////////////////// +// +// RANDOM NUMBER GENERATION +// +/////////////////////////////////////////////////////////////////////////// +#define QRAND_MAX 32768 + +int Q_rand( int *seed ); +float Q_random( int *seed ); +float Q_crandom( int *seed ); + +void Rand_Init( int seed ); +float flrand(float min, float max); +float Q_flrand( float min, float max ); +int irand( int min, int max ); +int Q_irand( int value1, int value2 ); + +float erandom( float mean ); + +#define random() ((rand () & 0x7fff) / ((float)0x7fff)) +#define crandom() (2.0 * (random() - 0.5)) + + +/////////////////////////////////////////////////////////////////////////// +// +// MATH UTILITIES +// +/////////////////////////////////////////////////////////////////////////// +#define minimum( x, y ) ((x) < (y) ? (x) : (y)) +#define maximum( x, y ) ((x) > (y) ? (x) : (y)) + +#define PI_DIV_180 0.017453292519943295769236907684886f +#define INV_PI_DIV_180 57.295779513082320876798154814105f + +#define DEG2RAD( a ) ( ( (a) * PI_DIV_180 ) ) +#define RAD2DEG( a ) ( ( (a) * INV_PI_DIV_180 ) ) + +#define SQRTFAST( x ) ( (x) * Q_rsqrt( x ) ) + +#define Q_min(x,y) ((x)<(y)?(x):(y)) +#define Q_max(x,y) ((x)>(y)?(x):(y)) + +#if defined(_MSC_VER) +static __inline long Q_ftol( float f ) +{ + return (long)f; +} +#else +static inline long Q_ftol( float f ) +{ + return (long)f; +} +#endif + +signed char ClampChar( int i ); +signed short ClampShort( int i ); +int Com_Clampi( int min, int max, int value ); +float Com_Clamp( float min, float max, float value ); +int Com_AbsClampi( int min, int max, int value ); +float Com_AbsClamp( float min, float max, float value ); + +float Q_rsqrt( float number ); +float Q_fabs( float f ); + +float Q_acos(float c); +float Q_asin(float c); +float Q_powf ( float x, int y ); +qboolean Q_isnan (float f); +int Q_log2( int val ); + +float LerpAngle(float from, float to, float frac); +float AngleSubtract( float a1, float a2 ); +void AnglesSubtract( vec3_t v1, vec3_t v2, vec3_t v3 ); +float AngleMod(float a); +float AngleNormalize360 ( float angle ); +float AngleNormalize180 ( float angle ); +float AngleDelta( float angle1, float angle2 ); + + +/////////////////////////////////////////////////////////////////////////// +// +// GEOMETRIC UTILITIES +// +/////////////////////////////////////////////////////////////////////////// +// angle indexes +#define PITCH 0 // up / down +#define YAW 1 // left / right +#define ROLL 2 // fall over + +qboolean PlaneFromPoints( vec4_t plane, const vec3_t a, const vec3_t b, const vec3_t c ); +void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float degrees ); +void RotateAroundDirection( matrix3_t axis, float yaw ); +void vectoangles( const vec3_t value1, vec3_t angles ); +vec_t GetYawForDirection( const vec3_t p1, const vec3_t p2 ); +void GetAnglesForDirection( const vec3_t p1, const vec3_t p2, vec3_t out ); +void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal ); +qboolean G_FindClosestPointOnLineSegment( const vec3_t start, const vec3_t end, const vec3_t from, vec3_t result ); +float G_PointDistFromLineSegment( const vec3_t start, const vec3_t end, const vec3_t from ); +void MatrixMultiply(float in1[3][3], float in2[3][3], float out[3][3]); + + +/////////////////////////////////////////////////////////////////////////// +// +// BOUNDING BOX +// +/////////////////////////////////////////////////////////////////////////// +float RadiusFromBounds( const vec3_t mins, const vec3_t maxs ); +void ClearBounds( vec3_t mins, vec3_t maxs ); +void AddPointToBounds( const vec3_t v, vec3_t mins, vec3_t maxs ); + + +/////////////////////////////////////////////////////////////////////////// +// +// PLANE +// +/////////////////////////////////////////////////////////////////////////// +// plane types are used to speed some tests +// 0-2 are axial planes +#define PLANE_X 0 +#define PLANE_Y 1 +#define PLANE_Z 2 +#define PLANE_NON_AXIAL 3 + +// plane_t structure +typedef struct cplane_s { + vec3_t normal; + float dist; + byte type; // for fast side tests: 0,1,2 = axial, 3 = nonaxial + byte signbits; // signx + (signy<<1) + (signz<<2), used as lookup during collision + byte pad[2]; +} cplane_t; + +void SetPlaneSignbits( cplane_t *out ); +int PlaneTypeForNormal( vec3_t normal ); +int BoxOnPlaneSide(vec3_t emins, vec3_t emaxs, cplane_t *p); + + +/////////////////////////////////////////////////////////////////////////// +// +// AXIS +// +/////////////////////////////////////////////////////////////////////////// +extern matrix3_t axisDefault; + +void AxisClear( matrix3_t axis ); +void AxisCopy( matrix3_t in, matrix3_t out ); +void AnglesToAxis( const vec3_t angles, matrix3_t axis ); + + +/////////////////////////////////////////////////////////////////////////// +// +// VEC3 +// +/////////////////////////////////////////////////////////////////////////// +extern vec3_t vec3_origin; + +#define VectorScaleM(v, factor, dst) \ + (dst)[0] = (v[0]) * (factor), \ + (dst)[1] = (v[1]) * (factor), \ + (dst)[2] = (v[2]) * (factor) +#define VectorCopyM(src, dst) \ + (dst)[0] = (src[0]), \ + (dst)[1] = (src[1]), \ + (dst)[2] = (src[2]) +#define VectorClearM(dst) \ + memset((dst), 0, sizeof((dst)[0]) * 3) + +void VectorAdd( const vec3_t vec1, const vec3_t vec2, vec3_t vecOut ); +void VectorSubtract( const vec3_t vec1, const vec3_t vec2, vec3_t vecOut ); +void VectorScale( const vec3_t vecIn, float scale, vec3_t vecOut ); +void VectorMA( const vec3_t vec1, float scale, const vec3_t vec2, vec3_t vecOut ); +void VectorSet( vec3_t vec, float x, float y, float z ); +void VectorClear( vec3_t vec ); +void VectorCopy( const vec3_t vecIn, vec3_t vecOut ); +float VectorLength( const vec3_t vec ); +float VectorLengthSquared( const vec3_t vec ); +void VectorNormalizeFast( vec3_t vec ); +float VectorNormalize( vec3_t vec ); +float VectorNormalize2( const vec3_t vec, vec3_t vecOut ); +void VectorAdvance( const vec3_t veca, const float scale, const vec3_t vecb, vec3_t vecc); +void VectorInc( vec3_t vec ); +void VectorDec( vec3_t vec ); +void VectorInverse( vec3_t vec ); +void CrossProduct( const vec3_t vec1, const vec3_t vec2, vec3_t vecOut ); +float DotProduct( const vec3_t vec1, const vec3_t vec2 ); +qboolean VectorCompare( const vec3_t vec1, const vec3_t vec2 ); +qboolean VectorCompare2( const vec3_t v1, const vec3_t v2 ); + +void SnapVector( float *v ); +float Distance( const vec3_t p1, const vec3_t p2 ); +float DistanceSquared( const vec3_t p1, const vec3_t p2 ); +float DistanceHorizontal( const vec3_t p1, const vec3_t p2 ); +float DistanceHorizontalSquared( const vec3_t p1, const vec3_t p2 ); +void MakeNormalVectors( const vec3_t forward, vec3_t right, vec3_t up); +void VectorRotate( const vec3_t in, matrix3_t matrix, vec3_t out ); +void AngleVectors( const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up); +void PerpendicularVector( vec3_t dst, const vec3_t src ); +float DotProductNormalize( const vec3_t inVec1, const vec3_t inVec2 ); + +#define VectorScaleVector(a,b,c) (((c)[0]=(a)[0]*(b)[0]),((c)[1]=(a)[1]*(b)[1]),((c)[2]=(a)[2]*(b)[2])) +#define VectorInverseScaleVector(a,b,c) ((c)[0]=(a)[0]/(b)[0],(c)[1]=(a)[1]/(b)[1],(c)[2]=(a)[2]/(b)[2]) +#define VectorScaleVectorAdd(c,a,b,o) ((o)[0]=(c)[0]+((a)[0]*(b)[0]),(o)[1]=(c)[1]+((a)[1]*(b)[1]),(o)[2]=(c)[2]+((a)[2]*(b)[2])) +#define VectorAverage(a,b,c) (((c)[0]=((a)[0]+(b)[0])*0.5f),((c)[1]=((a)[1]+(b)[1])*0.5f),((c)[2]=((a)[2]+(b)[2])*0.5f)) +#define VectorNegate(a,b) ((b)[0]=-(a)[0],(b)[1]=-(a)[1],(b)[2]=-(a)[2]) + + +/////////////////////////////////////////////////////////////////////////// +// +// VEC4 +// +/////////////////////////////////////////////////////////////////////////// +void VectorScale4( const vec4_t vecIn, float scale, vec4_t vecOut ); +void VectorCopy4( const vec4_t vecIn, vec4_t vecOut ); +void VectorSet4( vec4_t vec, float x, float y, float z, float w ); +void VectorClear4( vec4_t vec ); + +/////////////////////////////////////////////////////////////////////////// +// +// VEC5 +// +/////////////////////////////////////////////////////////////////////////// +void VectorSet5( vec5_t vec, float x, float y, float z, float w, float u ); + + +#if defined(__cplusplus) +} // extern "C" +#endif diff --git a/shared/qcommon/q_platform.h b/shared/qcommon/q_platform.h index d44afa50dd..37e8a0c8ee 100644 --- a/shared/qcommon/q_platform.h +++ b/shared/qcommon/q_platform.h @@ -209,6 +209,26 @@ along with this program; if not, see . #endif #endif +#if defined (_MSC_VER) + #if _MSC_VER >= 1600 + #include + #else + typedef signed __int64 int64_t; + typedef signed __int32 int32_t; + typedef signed __int16 int16_t; + typedef signed __int8 int8_t; + typedef unsigned __int64 uint64_t; + typedef unsigned __int32 uint32_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int8 uint8_t; + #endif +#else // not using MSVC + #if !defined(__STDC_LIMIT_MACROS) + #define __STDC_LIMIT_MACROS + #endif + #include +#endif + // catch missing defines in above blocks #if !defined(OS_STRING) #error "Operating system not supported" @@ -320,6 +340,21 @@ static inline float FloatSwap(float f) #error "Endianness not defined" #endif +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned long ulong; + +typedef enum { qfalse, qtrue } qboolean; + +// 32 bit field aliasing +typedef union byteAlias_u { + float f; + int32_t i; + uint32_t ui; + qboolean qb; + byte b[4]; + char c[4]; +} byteAlias_t; // platform string #if defined(NDEBUG) From 24559b44a05d75b8bdaee151cec488f077218af0 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Thu, 4 Aug 2016 14:22:44 +0100 Subject: [PATCH 287/445] Move string functions into shared/ folder --- CMakeLists.txt | 2 + code/cgame/cg_players.cpp | 6 +- code/game/NPC_stats.cpp | 38 ++-- code/game/g_combat.cpp | 4 +- code/game/g_inventory.cpp | 2 +- code/game/wp_saberLoad.cpp | 8 +- code/qcommon/q_shared.cpp | 415 ----------------------------------- code/qcommon/q_shared.h | 55 +---- code/qcommon/sstring.h | 8 +- code/ui/ui_main.cpp | 12 +- code/ui/ui_saber.cpp | 6 +- code/ui/ui_shared.cpp | 6 +- codemp/qcommon/q_shared.c | 427 ------------------------------------ codemp/qcommon/q_shared.h | 40 +--- shared/qcommon/q_string.c | 435 +++++++++++++++++++++++++++++++++++++ shared/qcommon/q_string.h | 52 +++++ 16 files changed, 536 insertions(+), 980 deletions(-) create mode 100644 shared/qcommon/q_string.c create mode 100644 shared/qcommon/q_string.h diff --git a/CMakeLists.txt b/CMakeLists.txt index d4a68e26b4..902f5c6c3b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -310,6 +310,8 @@ set(SharedCommonFiles "${SharedDir}/qcommon/q_color.c" "${SharedDir}/qcommon/q_math_common.h" "${SharedDir}/qcommon/q_math_common.c" + "${SharedDir}/qcommon/q_string.h" + "${SharedDir}/qcommon/q_string.c" "${SharedDir}/qcommon/q_platform.h" ) set(SharedCommonSafeFiles diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index 2b7bcdf9a9..1f4319ba40 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -552,19 +552,19 @@ void CG_NewClientinfo( int clientNum ) v = Info_ValueForKey( configstring, "legsModel" ); Q_strncpyz( g_entities[clientNum].client->renderInfo.legsModelName, v, - sizeof( g_entities[clientNum].client->renderInfo.legsModelName), qtrue); + sizeof( g_entities[clientNum].client->renderInfo.legsModelName)); // torsoModel v = Info_ValueForKey( configstring, "torsoModel" ); Q_strncpyz( g_entities[clientNum].client->renderInfo.torsoModelName, v, - sizeof( g_entities[clientNum].client->renderInfo.torsoModelName), qtrue); + sizeof( g_entities[clientNum].client->renderInfo.torsoModelName)); // headModel v = Info_ValueForKey( configstring, "headModel" ); Q_strncpyz( g_entities[clientNum].client->renderInfo.headModelName, v, - sizeof( g_entities[clientNum].client->renderInfo.headModelName), qtrue); + sizeof( g_entities[clientNum].client->renderInfo.headModelName)); // sounds v = Info_ValueForKey( configstring, "snd" ); diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index 19611d82ce..1e3ea43cbb 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -1227,7 +1227,7 @@ void G_LoadAnimFileSet( gentity_t *ent, const char *pModelName ) } else { - Q_strncpyz( animName, GLAName, sizeof( animName ), qtrue ); + Q_strncpyz( animName, GLAName, sizeof( animName ) ); slash = strrchr( animName, '/' ); if ( slash ) { @@ -1318,7 +1318,7 @@ void NPC_PrecacheAnimationCFG( const char *NPC_type ) continue; } //must copy data out of this pointer into a different part of memory because the funcs we're about to call will call COM_ParseExt - Q_strncpyz( filename, value, sizeof( filename ), qtrue ); + Q_strncpyz( filename, value, sizeof( filename ) ); G_ParseAnimFileSet( filename ); COM_EndParseSession( ); return; @@ -1342,7 +1342,7 @@ void NPC_PrecacheAnimationCFG( const char *NPC_type ) GLAName = gi.G2API_GetAnimFileNameIndex( handle ); if ( GLAName ) { - Q_strncpyz( animName, GLAName, sizeof( animName ), qtrue ); + Q_strncpyz( animName, GLAName, sizeof( animName ) ); slash = strrchr( animName, '/' ); if ( slash ) { @@ -1351,7 +1351,7 @@ void NPC_PrecacheAnimationCFG( const char *NPC_type ) strippedName = COM_SkipPath( animName ); //must copy data out of this pointer into a different part of memory because the funcs we're about to call will call COM_ParseExt - Q_strncpyz( filename, value, sizeof( filename ), qtrue ); + Q_strncpyz( filename, value, sizeof( filename ) ); G_ParseAnimFileSet(strippedName, filename); COM_EndParseSession( ); @@ -1660,7 +1660,7 @@ void CG_NPC_Precache ( gentity_t *spawner ) } else { - Q_strncpyz( ri.headModelName, value, sizeof(ri.headModelName), qtrue); + Q_strncpyz( ri.headModelName, value, sizeof(ri.headModelName)); } md3Model = qtrue; continue; @@ -1679,7 +1679,7 @@ void CG_NPC_Precache ( gentity_t *spawner ) } else { - Q_strncpyz( ri.torsoModelName, value, sizeof(ri.torsoModelName), qtrue); + Q_strncpyz( ri.torsoModelName, value, sizeof(ri.torsoModelName)); } md3Model = qtrue; continue; @@ -1692,7 +1692,7 @@ void CG_NPC_Precache ( gentity_t *spawner ) { continue; } - Q_strncpyz( ri.legsModelName, value, sizeof(ri.legsModelName), qtrue); + Q_strncpyz( ri.legsModelName, value, sizeof(ri.legsModelName)); md3Model = qtrue; continue; } @@ -1704,7 +1704,7 @@ void CG_NPC_Precache ( gentity_t *spawner ) { continue; } - Q_strncpyz( playerModel, value, sizeof(playerModel), qtrue); + Q_strncpyz( playerModel, value, sizeof(playerModel)); md3Model = qfalse; continue; } @@ -1716,7 +1716,7 @@ void CG_NPC_Precache ( gentity_t *spawner ) { continue; } - Q_strncpyz( customSkin, value, sizeof(customSkin), qtrue); + Q_strncpyz( customSkin, value, sizeof(customSkin)); continue; } @@ -2486,7 +2486,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } else { - Q_strncpyz( ri->headModelName, value, sizeof(ri->headModelName), qtrue); + Q_strncpyz( ri->headModelName, value, sizeof(ri->headModelName)); } continue; } @@ -2510,7 +2510,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } else { - Q_strncpyz( ri->torsoModelName, value, sizeof(ri->torsoModelName), qtrue); + Q_strncpyz( ri->torsoModelName, value, sizeof(ri->torsoModelName)); } continue; } @@ -2522,7 +2522,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { continue; } - Q_strncpyz( ri->legsModelName, value, sizeof(ri->legsModelName), qtrue); + Q_strncpyz( ri->legsModelName, value, sizeof(ri->legsModelName)); //Need to do this here to get the right index ci->animFileIndex = G_ParseAnimFileSet(ri->legsModelName); continue; @@ -2535,7 +2535,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { continue; } - Q_strncpyz( playerModel, value, sizeof(playerModel), qtrue); + Q_strncpyz( playerModel, value, sizeof(playerModel)); md3Model = qfalse; continue; } @@ -2547,7 +2547,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { continue; } - Q_strncpyz( customSkin, value, sizeof(customSkin), qtrue); + Q_strncpyz( customSkin, value, sizeof(customSkin)); continue; } @@ -2565,7 +2565,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } else { - Q_strncpyz( surfOff, value, sizeof(surfOff), qtrue); + Q_strncpyz( surfOff, value, sizeof(surfOff)); } continue; } @@ -2584,7 +2584,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } else { - Q_strncpyz( surfOn, value, sizeof(surfOn), qtrue); + Q_strncpyz( surfOn, value, sizeof(surfOn)); } continue; } @@ -4019,7 +4019,7 @@ Ghoul2 Insert Start { int iVehIndex = BG_VehicleGetIndex( NPC->NPC_type ); strcpy(customSkin, "default"); // Ignore any custom skin that may have come from the NPC File - Q_strncpyz( playerModel, g_vehicleInfo[iVehIndex].model, sizeof(playerModel), qtrue); + Q_strncpyz( playerModel, g_vehicleInfo[iVehIndex].model, sizeof(playerModel)); if ( g_vehicleInfo[iVehIndex].skin && g_vehicleInfo[iVehIndex].skin[0] ) { bool forceSkin = false; @@ -4041,7 +4041,7 @@ Ghoul2 Insert Start //--------------------------------------------------- if (forceSkin) { - Q_strncpyz( customSkin, NPC->soundSet, sizeof(customSkin), qtrue); + Q_strncpyz( customSkin, NPC->soundSet, sizeof(customSkin)); } // Otherwise Choose A Random Skin @@ -4052,7 +4052,7 @@ Ghoul2 Insert Start { gi.Printf(S_COLOR_RED"WARNING: Unable to use skin (%s)", NPC->soundSet); } - Q_strncpyz( customSkin, *skinarray[Q_irand(0, skinarray.size()-1)], sizeof(customSkin), qtrue); + Q_strncpyz( customSkin, *skinarray[Q_irand(0, skinarray.size()-1)], sizeof(customSkin)); } if (NPC->soundSet && gi.bIsFromZone(NPC->soundSet, TAG_G_ALLOC)) { gi.Free(NPC->soundSet); diff --git a/code/game/g_combat.cpp b/code/game/g_combat.cpp index 94f4a28447..dd2a0ec03d 100644 --- a/code/game/g_combat.cpp +++ b/code/game/g_combat.cpp @@ -2307,7 +2307,7 @@ qboolean G_GetRootSurfNameWithVariant( gentity_t *ent, const char *rootSurfName, { if ( !gi.G2API_GetSurfaceRenderStatus( &ent->ghoul2[ent->playerModel], rootSurfName ) ) {//see if the basic name without variants is on - Q_strncpyz( returnSurfName, rootSurfName, returnSize, qtrue ); + Q_strncpyz( returnSurfName, rootSurfName, returnSize ); return qtrue; } else @@ -2322,7 +2322,7 @@ qboolean G_GetRootSurfNameWithVariant( gentity_t *ent, const char *rootSurfName, } } } - Q_strncpyz( returnSurfName, rootSurfName, returnSize, qtrue ); + Q_strncpyz( returnSurfName, rootSurfName, returnSize ); return qfalse; } diff --git a/code/game/g_inventory.cpp b/code/game/g_inventory.cpp index 2ac285af1d..71720b0c64 100644 --- a/code/game/g_inventory.cpp +++ b/code/game/g_inventory.cpp @@ -90,7 +90,7 @@ qboolean INV_SecurityKeyGive( gentity_t *target, const char *keyname ) if ( target->client->ps.security_key_message[i][0] == '\0' ) {//fill in the first empty slot we find with this key target->client->ps.inventory[INV_SECURITY_KEY]++; // He got the key - Q_strncpyz( target->client->ps.security_key_message[i], keyname, MAX_SECURITY_KEY_MESSSAGE, qtrue ); + Q_strncpyz( target->client->ps.security_key_message[i], keyname, MAX_SECURITY_KEY_MESSSAGE ); return qtrue; } } diff --git a/code/game/wp_saberLoad.cpp b/code/game/wp_saberLoad.cpp index 237a85e4d2..c298d1d456 100644 --- a/code/game/wp_saberLoad.cpp +++ b/code/game/wp_saberLoad.cpp @@ -1360,7 +1360,7 @@ static void Saber_ParseG2MarksShader( saberInfo_t *saber, const char **p ) { SkipRestOfLine( p ); return; } - Q_strncpyz( saber->g2MarksShader, value, sizeof( saber->g2MarksShader ), qtrue ); + Q_strncpyz( saber->g2MarksShader, value, sizeof( saber->g2MarksShader ) ); //NOTE: registers this on cgame side where it registers all client assets } static void Saber_ParseG2WeaponMarkShader( saberInfo_t *saber, const char **p ) { @@ -1369,7 +1369,7 @@ static void Saber_ParseG2WeaponMarkShader( saberInfo_t *saber, const char **p ) SkipRestOfLine( p ); return; } - Q_strncpyz( saber->g2WeaponMarkShader, value, sizeof( saber->g2WeaponMarkShader ), qtrue ); + Q_strncpyz( saber->g2WeaponMarkShader, value, sizeof( saber->g2WeaponMarkShader ) ); //NOTE: registers this on cgame side where it registers all client assets } static void Saber_ParseKnockbackScale( saberInfo_t *saber, const char **p ) { @@ -1585,7 +1585,7 @@ static void Saber_ParseG2MarksShader2( saberInfo_t *saber, const char **p ) { SkipRestOfLine( p ); return; } - Q_strncpyz( saber->g2MarksShader2, value, sizeof(saber->g2MarksShader2), qtrue ); + Q_strncpyz( saber->g2MarksShader2, value, sizeof(saber->g2MarksShader2) ); //NOTE: registers this on cgame side where it registers all client assets } static void Saber_ParseG2WeaponMarkShader2( saberInfo_t *saber, const char **p ) { @@ -1594,7 +1594,7 @@ static void Saber_ParseG2WeaponMarkShader2( saberInfo_t *saber, const char **p ) SkipRestOfLine( p ); return; } - Q_strncpyz( saber->g2WeaponMarkShader2, value, sizeof(saber->g2WeaponMarkShader2), qtrue ); + Q_strncpyz( saber->g2WeaponMarkShader2, value, sizeof(saber->g2WeaponMarkShader2) ); //NOTE: registers this on cgame side where it registers all client assets } static void Saber_ParseKnockbackScale2( saberInfo_t *saber, const char **p ) { diff --git a/code/qcommon/q_shared.cpp b/code/qcommon/q_shared.cpp index 3bbadbca11..c3406f3000 100644 --- a/code/qcommon/q_shared.cpp +++ b/code/qcommon/q_shared.cpp @@ -681,421 +681,6 @@ int Com_HexStrToInt( const char *str ) ============================================================================ */ -int Q_isprint( int c ) -{ - if ( c >= 0x20 && c <= 0x7E ) - return ( 1 ); - return ( 0 ); -} - -int Q_islower( int c ) -{ - if (c >= 'a' && c <= 'z') - return ( 1 ); - return ( 0 ); -} - -int Q_isupper( int c ) -{ - if (c >= 'A' && c <= 'Z') - return ( 1 ); - return ( 0 ); -} - -int Q_isalpha( int c ) -{ - if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) - return ( 1 ); - return ( 0 ); -} - -qboolean Q_isanumber( const char *s ) -{ - char *p; - double ret; - - if( *s == '\0' ) - return qfalse; - - ret = strtod( s, &p ); - - if ( ret == HUGE_VAL || errno == ERANGE ) - return qfalse; - - return (qboolean)(*p == '\0'); -} - -qboolean Q_isintegral( float f ) -{ - return (qboolean)( (int)f == f ); -} - -/* -char* Q_strrchr( const char* string, int c ) -{ - char cc = c; - char *s; - char *sp=(char *)0; - - s = (char*)string; - - while (*s) - { - if (*s == cc) - sp = s; - s++; - } - if (cc == 0) - sp = s; - - return sp; -} -*/ -/* -============= -Q_strncpyz - -Safe strncpy that ensures a trailing zero -============= -*/ -void Q_strncpyz( char *dest, const char *src, int destsize, qboolean bBarfIfTooLong/* = qfalse */ ) -{ - if ( !dest ) { - Com_Error( ERR_FATAL, "Q_strncpyz: NULL dest" ); - } - if ( !src ) { - Com_Error( ERR_FATAL, "Q_strncpyz: NULL src" ); - } - if ( destsize < 1 ) { - Com_Error(ERR_FATAL,"Q_strncpyz: destsize < 1" ); - } - - if (bBarfIfTooLong) - { - if ( strlen(src)+1 > (size_t)destsize) - { - Com_Error(ERR_FATAL,"String dest buffer too small to hold string \"%s\" %d > %d\n(source addr = %x, dest addr = %x",src, strlen(src)+1, destsize, src, dest); - } - } - strncpy( dest, src, destsize-1 ); - dest[destsize-1] = 0; -} -#if 1 -int Q_stricmpn (const char *s1, const char *s2, int n) { - int c1, c2; - - if ( s1 == NULL ) { - if ( s2 == NULL ) - return 0; - else - return -1; - } - else if ( s2==NULL ) - return 1; - - do { - c1 = *s1++; - c2 = *s2++; - - if (!n--) { - return 0; // strings are equal until end point - } - - if (c1 != c2) { - if (c1 >= 'a' && c1 <= 'z') { - c1 -= ('a' - 'A'); - } - if (c2 >= 'a' && c2 <= 'z') { - c2 -= ('a' - 'A'); - } - if (c1 != c2) { - return c1 < c2 ? -1 : 1; - } - } - } while (c1); - - return 0; // strings are equal -} - -int Q_strncmp (const char *s1, const char *s2, int n) { - int c1, c2; - - do { - c1 = *s1++; - c2 = *s2++; - - if (!n--) { - return 0; // strings are equal until end point - } - - if (c1 != c2) { - return c1 < c2 ? -1 : 1; - } - } while (c1); - - return 0; // strings are equal -} - -char *Q_strlwr( char *s1 ) { - char *s; - - s = s1; - while ( *s ) { - *s = tolower(*s); - s++; - } - return s1; -} - -char *Q_strupr( char *s1 ) { - char *s; - - s = s1; - while ( *s ) { - *s = toupper(*s); - s++; - } - return s1; -} -#endif - -// never goes past bounds or leaves without a terminating 0 -void Q_strcat( char *dest, int size, const char *src ) { - int l1; - - l1 = strlen( dest ); - if ( l1 >= size ) { - Com_Error( ERR_FATAL, "Q_strcat: already overflowed" ); - } - if ( strlen(src)+1 > (size_t)(size - l1)) - { //do the error here instead of in Q_strncpyz to get a meaningful msg - Com_Error(ERR_FATAL,"Q_strcat: cannot append \"%s\" to \"%s\"", src, dest); - } - Q_strncpyz( dest + l1, src, size - l1 ); -} - -/* -* Find the first occurrence of find in s. -*/ -const char *Q_stristr( const char *s, const char *find ) -{ - char c, sc; - size_t len; - - if ((c = *find++) != 0) - { - if (c >= 'a' && c <= 'z') - { - c -= ('a' - 'A'); - } - len = strlen(find); - do - { - do - { - if ((sc = *s++) == 0) - return NULL; - if (sc >= 'a' && sc <= 'z') - { - sc -= ('a' - 'A'); - } - } while (sc != c); - } while (Q_stricmpn(s, find, len) != 0); - s--; - } - return s; -} - -int Q_PrintStrlen( const char *string ) { - int len; - const char *p; - - if( !string ) { - return 0; - } - - len = 0; - p = string; - while( *p ) { - if( Q_IsColorString( p ) ) { - p += 2; - continue; - } - p++; - len++; - } - - return len; -} - - -char *Q_CleanStr( char *string ) { - char* d; - char* s; - int c; - - s = string; - d = string; - while ((c = *s) != 0 ) { - if ( Q_IsColorString( s ) ) { - s++; - } - else if ( c >= 0x20 && c <= 0x7E ) { - *d++ = c; - } - s++; - } - *d = '\0'; - - return string; -} - -/* -================== -Q_StripColor - -Strips coloured strings in-place using multiple passes: "fgs^^56fds" -> "fgs^6fds" -> "fgsfds" - -This function modifies INPUT (is mutable) - -(Also strips ^8 and ^9) -================== -*/ -void Q_StripColor(char *text) -{ - qboolean doPass = qtrue; - char *read; - char *write; - - while ( doPass ) - { - doPass = qfalse; - read = write = text; - while ( *read ) - { - if ( Q_IsColorStringExt(read) ) - { - doPass = qtrue; - read += 2; - } - else - { - // Avoid writing the same data over itself - if (write != read) - { - *write = *read; - } - write++; - read++; - } - } - if ( write < read ) - { - // Add trailing NUL byte if string has shortened - *write = '\0'; - } - } -} - -/* -Q_strstrip - - Description: Replace strip[x] in string with repl[x] or remove characters entirely - Mutates: string - Return: -- - - Examples: Q_strstrip( "Bo\nb is h\rairy!!", "\n\r!", "123" ); // "Bo1b is h2airy33" - Q_strstrip( "Bo\nb is h\rairy!!", "\n\r!", "12" ); // "Bo1b is h2airy" - Q_strstrip( "Bo\nb is h\rairy!!", "\n\r!", NULL ); // "Bob is hairy" -*/ - -void Q_strstrip( char *string, const char *strip, const char *repl ) -{ - char *out=string, *p=string, c; - const char *s=strip; - int replaceLen = repl?strlen( repl ):0, offset=0; - qboolean recordChar = qtrue; - - while ( (c = *p++) != '\0' ) - { - recordChar = qtrue; - for ( s=strip; *s; s++ ) - { - offset = s-strip; - if ( c == *s ) - { - if ( !repl || offset >= replaceLen ) - recordChar = qfalse; - else - c = repl[offset]; - break; - } - } - if ( recordChar ) - *out++ = c; - } - *out = '\0'; -} - -/* -Q_strchrs - - Description: Find any characters in a string. Think of it as a shorthand strchr loop. - Mutates: -- - Return: first instance of any characters found - otherwise NULL -*/ - -const char *Q_strchrs( const char *string, const char *search ) -{ - const char *p = string, *s = search; - - while ( *p != '\0' ) - { - for ( s=search; *s; s++ ) - { - if ( *p == *s ) - return p; - } - p++; - } - - return NULL; -} - -#ifdef _MSC_VER -/* -============= -Q_vsnprintf - -Special wrapper function for Microsoft's broken _vsnprintf() function. -MinGW comes with its own snprintf() which is not broken. -============= -*/ - -int Q_vsnprintf(char *str, size_t size, const char *format, va_list ap) -{ - int retval; - - retval = _vsnprintf(str, size, format, ap); - - if(retval < 0 || retval == size) - { - // Microsoft doesn't adhere to the C99 standard of vsnprintf, - // which states that the return value must be the number of - // bytes written if the output string had sufficient length. - // - // Obviously we cannot determine that value from Microsoft's - // implementation, so we have no choice but to return size. - - str[size - 1] = '\0'; - return size; - } - - return retval; -} -#endif - int QDECL Com_sprintf( char *dest, int size, const char *fmt, ...) { int len; va_list argptr; diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 42f6d690d9..7679f6def2 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -30,6 +30,7 @@ along with this program; if not, see . #include "qcommon/q_math_common.h" #include "qcommon/q_color.h" +#include "qcommon/q_string.h" #ifdef _MSC_VER @@ -166,14 +167,6 @@ along with this program; if not, see . #define Q_min(x,y) ((x)<(y)?(x):(y)) #define Q_max(x,y) ((x)>(y)?(x):(y)) -#if defined (_MSC_VER) - // vsnprintf is ISO/IEC 9899:1999 - // abstracting this to make it portable - int Q_vsnprintf( char *str, size_t size, const char *format, va_list args ); -#else // not using MSVC - #define Q_vsnprintf vsnprintf -#endif - typedef int32_t qhandle_t, thandle_t, fxHandle_t, sfxHandle_t, fileHandle_t, clipHandle_t; #define NULL_HANDLE ((qhandle_t)0) @@ -416,52 +409,6 @@ typedef enum { } fsOrigin_t; //============================================= - -int Q_isprint( int c ); -int Q_islower( int c ); -int Q_isupper( int c ); -int Q_isalpha( int c ); -qboolean Q_isanumber( const char *s ); -qboolean Q_isintegral( float f ); - -#if 1 -// portable case insensitive compare -int Q_strncmp (const char *s1, const char *s2, int n); -int Q_stricmpn (const char *s1, const char *s2, int n); -inline int Q_stricmp (const char *s1, const char *s2) {return Q_stricmpn (s1, s2, 99999);} -char *Q_strlwr( char *s1 ); -char *Q_strupr( char *s1 ); -char *Q_strrchr( const char* string, int c ); -#else -// NON-portable (but faster) versions -inline int Q_stricmp (const char *s1, const char *s2) { return stricmp(s1, s2); } -inline int Q_strncmp (const char *s1, const char *s2, int n) { return strncmp(s1, s2, n); } -inline int Q_stricmpn (const char *s1, const char *s2, int n) { return strnicmp(s1, s2, n); } -inline char *Q_strlwr( char *s1 ) { return strlwr(s1); } -inline char *Q_strupr( char *s1 ) { return strupr(s1); } -inline const char *Q_strrchr( const char* str, int c ) { return strrchr(str, c); } -#endif - - -// buffer size safe library replacements -#ifdef __cplusplus -void Q_strncpyz( char *dest, const char *src, int destsize, qboolean bBarfIfTooLong = qfalse ); -#else -void Q_strncpyz( char *dest, const char *src, int destsize, qboolean bBarfIfTooLong ); -#endif -void Q_strcat( char *dest, int size, const char *src ); - -const char *Q_stristr( const char *s, const char *find ); - -// strlen that discounts Quake color sequences -int Q_PrintStrlen( const char *string ); -// removes color sequences from string -char *Q_CleanStr( char *string ); -void Q_StripColor ( char *string ); -void Q_strstrip( char *string, const char *strip, const char *repl ); -const char *Q_strchrs( const char *string, const char *search ); -//============================================= - char * QDECL va(const char *format, ...); #define TRUNCATE_LENGTH 64 diff --git a/code/qcommon/sstring.h b/code/qcommon/sstring.h index 2243ecaf3a..a3ca6695ae 100644 --- a/code/qcommon/sstring.h +++ b/code/qcommon/sstring.h @@ -53,13 +53,13 @@ class sstring sstring(const sstring &o) { //strcpy(mStorage.data,o.mStorage.data); - Q_strncpyz(mStorage.data,o.mStorage.data,sizeof(mStorage.data),qtrue); + Q_strncpyz(mStorage.data,o.mStorage.data,sizeof(mStorage.data)); } sstring(const char *s) { //assert(strlen(s) & operator=(const sstring &o) { //strcpy(mStorage.data,o.mStorage.data); - Q_strncpyz(mStorage.data,o.mStorage.data,sizeof(mStorage.data),qtrue); + Q_strncpyz(mStorage.data,o.mStorage.data,sizeof(mStorage.data)); return *this; } sstring & operator=(const char *s) { assert(strlen(s)Name, dirptr, MAX_QPATH, qtrue ); + Q_strncpyz( species->Name, dirptr, MAX_QPATH ); if (!UI_ParseColorData(buffer.data(),*species)) { @@ -2461,7 +2461,7 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) species->SkinHeadMax *= 2; species->SkinHead = (skinName_t *)realloc(species->SkinHead, species->SkinHeadMax*sizeof(skinName_t)); } - Q_strncpyz(species->SkinHead[species->SkinHeadCount++].name, skinname, SKIN_LENGTH, qtrue); + Q_strncpyz(species->SkinHead[species->SkinHeadCount++].name, skinname, SKIN_LENGTH); iSkinParts |= 1<<0; } else if (Q_stricmpn(skinname,"torso_",6) == 0) @@ -2471,7 +2471,7 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) species->SkinTorsoMax *= 2; species->SkinTorso = (skinName_t *)realloc(species->SkinTorso, species->SkinTorsoMax*sizeof(skinName_t)); } - Q_strncpyz(species->SkinTorso[species->SkinTorsoCount++].name, skinname, SKIN_LENGTH, qtrue); + Q_strncpyz(species->SkinTorso[species->SkinTorsoCount++].name, skinname, SKIN_LENGTH); iSkinParts |= 1<<1; } else if (Q_stricmpn(skinname,"lower_",6) == 0) @@ -2481,7 +2481,7 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) species->SkinLegMax *= 2; species->SkinLeg = (skinName_t *)realloc(species->SkinLeg, species->SkinLegMax*sizeof(skinName_t)); } - Q_strncpyz(species->SkinLeg[species->SkinLegCount++].name, skinname, SKIN_LENGTH, qtrue); + Q_strncpyz(species->SkinLeg[species->SkinLegCount++].name, skinname, SKIN_LENGTH); iSkinParts |= 1<<2; } diff --git a/code/ui/ui_saber.cpp b/code/ui/ui_saber.cpp index d67cac60c9..858cf9b8fa 100644 --- a/code/ui/ui_saber.cpp +++ b/code/ui/ui_saber.cpp @@ -784,19 +784,19 @@ void UI_GetSaberForMenu( char *saber, int saberNum ) case 3://MD_SINGLE_STRONG: if ( saberType != SABER_SINGLE ) { - Q_strncpyz(saber,"single_1",MAX_QPATH,qtrue); + Q_strncpyz(saber,"single_1",MAX_QPATH); } break; case 4://MD_DUAL_SABERS: if ( saberType != SABER_SINGLE ) { - Q_strncpyz(saber,"single_1",MAX_QPATH,qtrue); + Q_strncpyz(saber,"single_1",MAX_QPATH); } break; case 5://MD_SABER_STAFF: if ( saberType == SABER_SINGLE || saberType == SABER_NONE ) { - Q_strncpyz(saber,"dual_1",MAX_QPATH,qtrue); + Q_strncpyz(saber,"dual_1",MAX_QPATH); } break; } diff --git a/code/ui/ui_shared.cpp b/code/ui/ui_shared.cpp index df9d28ac31..337d5c74a0 100644 --- a/code/ui/ui_shared.cpp +++ b/code/ui/ui_shared.cpp @@ -2345,7 +2345,7 @@ qboolean Script_Defer ( itemDef_t* item, const char **args ) uiInfo.deferredScriptItem = item; // Save the rest of the script - Q_strncpyz ( uiInfo.deferredScript, *args, MAX_DEFERRED_SCRIPT, qfalse ); + Q_strncpyz ( uiInfo.deferredScript, *args, MAX_DEFERRED_SCRIPT ); // No more running return qfalse; @@ -5991,14 +5991,14 @@ qboolean Item_EnableShowViaCvar(itemDef_t *item, int flag) } COM_EndParseSession(); - Q_strncpyz(buff, val, sizeof(buff), qtrue); + Q_strncpyz(buff, val, sizeof(buff)); DC->getCVarString(item->cvarTest, script, sizeof(script)); p = script; } else { DC->getCVarString(item->cvarTest, buff, sizeof(buff)); - Q_strncpyz(script, item->enableCvar, sizeof(script), qtrue); + Q_strncpyz(script, item->enableCvar, sizeof(script)); p = script; } COM_BeginParseSession(); diff --git a/codemp/qcommon/q_shared.c b/codemp/qcommon/q_shared.c index e71c141919..1d3df4f512 100644 --- a/codemp/qcommon/q_shared.c +++ b/codemp/qcommon/q_shared.c @@ -707,433 +707,6 @@ int Com_HexStrToInt( const char *str ) ============================================================================ */ -int Q_isprint( int c ) -{ - if ( c >= 0x20 && c <= 0x7E ) - return ( 1 ); - return ( 0 ); -} - -int Q_isprintext( int c ) -{ - if ( c >= 0x20 && c <= 0x7E ) - return (1); - if ( c >= 0x80 && c <= 0xFE ) - return (1); - return (0); -} - -int Q_isgraph( int c ) -{ - if ( c >= 0x21 && c <= 0x7E ) - return (1); - if ( c >= 0x80 && c <= 0xFE ) - return (1); - return (0); -} - -int Q_islower( int c ) -{ - if (c >= 'a' && c <= 'z') - return ( 1 ); - return ( 0 ); -} - -int Q_isupper( int c ) -{ - if (c >= 'A' && c <= 'Z') - return ( 1 ); - return ( 0 ); -} - -int Q_isalpha( int c ) -{ - if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) - return ( 1 ); - return ( 0 ); -} - -qboolean Q_isanumber( const char *s ) -{ - char *p; - double ret; - - if( *s == '\0' ) - return qfalse; - - ret = strtod( s, &p ); - - if ( ret == HUGE_VAL || errno == ERANGE ) - return qfalse; - - return (qboolean)(*p == '\0'); -} - -qboolean Q_isintegral( float f ) -{ - return (qboolean)( (int)f == f ); -} - -char* Q_strrchr( const char* string, int c ) -{ - char cc = c; - char *s; - char *sp=(char *)0; - - s = (char*)string; - - while (*s) - { - if (*s == cc) - sp = s; - s++; - } - if (cc == 0) - sp = s; - - return sp; -} - -/* -============= -Q_strncpyz - -Safe strncpy that ensures a trailing zero -============= -*/ -void Q_strncpyz( char *dest, const char *src, int destsize ) { - if ( !dest ) { - Com_Error( ERR_FATAL, "Q_strncpyz: NULL dest" ); - return; - } - if ( !src ) { - Com_Error( ERR_FATAL, "Q_strncpyz: NULL src" ); - return; - } - if ( destsize < 1 ) { - Com_Error( ERR_FATAL,"Q_strncpyz: destsize < 1" ); - return; - } - - strncpy( dest, src, destsize-1 ); - dest[destsize-1] = 0; -} - -int Q_stricmpn (const char *s1, const char *s2, int n) { - int c1, c2; - - if ( s1 == NULL ) { - if ( s2 == NULL ) - return 0; - else - return -1; - } - else if ( s2==NULL ) - return 1; - - do { - c1 = *s1++; - c2 = *s2++; - - if (!n--) { - return 0; // strings are equal until end point - } - - if (c1 != c2) { - if (c1 >= 'a' && c1 <= 'z') { - c1 -= ('a' - 'A'); - } - if (c2 >= 'a' && c2 <= 'z') { - c2 -= ('a' - 'A'); - } - if (c1 != c2) { - return c1 < c2 ? -1 : 1; - } - } - } while (c1); - - return 0; // strings are equal -} - -int Q_strncmp (const char *s1, const char *s2, int n) { - int c1, c2; - - do { - c1 = *s1++; - c2 = *s2++; - - if (!n--) { - return 0; // strings are equal until end point - } - - if (c1 != c2) { - return c1 < c2 ? -1 : 1; - } - } while (c1); - - return 0; // strings are equal -} - -int Q_stricmp (const char *s1, const char *s2) { - return (s1 && s2) ? Q_stricmpn (s1, s2, 99999) : -1; -} - -char *Q_strlwr( char *s1 ) { - char *s; - - s = s1; - while ( *s ) { - *s = tolower(*s); - s++; - } - return s1; -} - -char *Q_strupr( char *s1 ) { - char *s; - - s = s1; - while ( *s ) { - *s = toupper(*s); - s++; - } - return s1; -} - - -// never goes past bounds or leaves without a terminating 0 -void Q_strcat( char *dest, int size, const char *src ) { - int l1; - - l1 = strlen( dest ); - if ( l1 >= size ) { - Com_Error( ERR_FATAL, "Q_strcat: already overflowed" ); - } - Q_strncpyz( dest + l1, src, size - l1 ); -} - -/* -* Find the first occurrence of find in s. -*/ -const char *Q_stristr( const char *s, const char *find ) { - char c, sc; - size_t len; - - if ((c = *find++) != 0) - { - if (c >= 'a' && c <= 'z') - { - c -= ('a' - 'A'); - } - len = strlen(find); - do - { - do - { - if ((sc = *s++) == 0) - return NULL; - if (sc >= 'a' && sc <= 'z') - { - sc -= ('a' - 'A'); - } - } while (sc != c); - } while (Q_stricmpn(s, find, len) != 0); - s--; - } - return s; -} - -int Q_PrintStrlen( const char *string ) { - int len; - const char *p; - - if( !string ) { - return 0; - } - - len = 0; - p = string; - while( *p ) { - if( Q_IsColorString( p ) ) { - p += 2; - continue; - } - p++; - len++; - } - - return len; -} - - -/* This function modifies INPUT (is mutable) */ -char *Q_CleanStr( char *string ) { - char* d; - char* s; - int c; - - s = string; - d = string; - while ((c = *s) != 0 ) { - if ( Q_IsColorString( s ) ) { - s++; - } - else if ( c >= 0x20 && c <= 0x7E ) { - *d++ = c; - } - s++; - } - *d = '\0'; - - return string; -} - -/* -================== -Q_StripColor - -Strips coloured strings in-place using multiple passes: "fgs^^56fds" -> "fgs^6fds" -> "fgsfds" - -This function modifies INPUT (is mutable) - -(Also strips ^8 and ^9) -================== -*/ -void Q_StripColor(char *text) -{ - qboolean doPass = qtrue; - char *read; - char *write; - - while ( doPass ) - { - doPass = qfalse; - read = write = text; - while ( *read ) - { - if ( Q_IsColorStringExt(read) ) - { - doPass = qtrue; - read += 2; - } - else - { - // Avoid writing the same data over itself - if (write != read) - { - *write = *read; - } - write++; - read++; - } - } - if ( write < read ) - { - // Add trailing NUL byte if string has shortened - *write = '\0'; - } - } -} - -/* -Q_strstrip - - Description: Replace strip[x] in string with repl[x] or remove characters entirely - Mutates: string - Return: -- - - Examples: Q_strstrip( "Bo\nb is h\rairy!!", "\n\r!", "123" ); // "Bo1b is h2airy33" - Q_strstrip( "Bo\nb is h\rairy!!", "\n\r!", "12" ); // "Bo1b is h2airy" - Q_strstrip( "Bo\nb is h\rairy!!", "\n\r!", NULL ); // "Bob is hairy" -*/ - -void Q_strstrip( char *string, const char *strip, const char *repl ) -{ - char *out=string, *p=string, c; - const char *s=strip; - int replaceLen = repl?strlen( repl ):0, offset=0; - qboolean recordChar = qtrue; - - while ( (c = *p++) != '\0' ) - { - recordChar = qtrue; - for ( s=strip; *s; s++ ) - { - offset = s-strip; - if ( c == *s ) - { - if ( !repl || offset >= replaceLen ) - recordChar = qfalse; - else - c = repl[offset]; - break; - } - } - if ( recordChar ) - *out++ = c; - } - *out = '\0'; -} - -/* -Q_strchrs - - Description: Find any characters in a string. Think of it as a shorthand strchr loop. - Mutates: -- - Return: first instance of any characters found - otherwise NULL -*/ - -const char *Q_strchrs( const char *string, const char *search ) -{ - const char *p = string, *s = search; - - while ( *p != '\0' ) - { - for ( s=search; *s; s++ ) - { - if ( *p == *s ) - return p; - } - p++; - } - - return NULL; -} - -#ifdef _MSC_VER -/* -============= -Q_vsnprintf - -Special wrapper function for Microsoft's broken _vsnprintf() function. -MinGW comes with its own snprintf() which is not broken. -============= -*/ - -int Q_vsnprintf(char *str, size_t size, const char *format, va_list ap) -{ - int retval; - - retval = _vsnprintf(str, size, format, ap); - - if(retval < 0 || retval == size) - { - // Microsoft doesn't adhere to the C99 standard of vsnprintf, - // which states that the return value must be the number of - // bytes written if the output string had sufficient length. - // - // Obviously we cannot determine that value from Microsoft's - // implementation, so we have no choice but to return size. - - str[size - 1] = '\0'; - return size; - } - - return retval; -} -#endif - int QDECL Com_sprintf( char *dest, int size, const char *fmt, ...) { int len; va_list argptr; diff --git a/codemp/qcommon/q_shared.h b/codemp/qcommon/q_shared.h index 75d43a93c2..c44b0be5f3 100644 --- a/codemp/qcommon/q_shared.h +++ b/codemp/qcommon/q_shared.h @@ -50,6 +50,7 @@ along with this program; if not, see . #include "qcommon/q_math_common.h" #include "qcommon/q_color.h" +#include "qcommon/q_string.h" #include "qcommon/disablewarnings.h" #include "game/teams.h" //npc team stuff @@ -150,14 +151,6 @@ along with this program; if not, see . #include "qcommon/q_platform.h" -#if defined (_MSC_VER) - // vsnprintf is ISO/IEC 9899:1999 - // abstracting this to make it portable - int Q_vsnprintf( char *str, size_t size, const char *format, va_list args ); -#else // not using MSVC - #define Q_vsnprintf vsnprintf -#endif - typedef union fileBuffer_u { void *v; char *c; @@ -665,37 +658,6 @@ typedef enum { //============================================= -int Q_isprint( int c ); -int Q_islower( int c ); -int Q_isupper( int c ); -int Q_isalpha( int c ); -qboolean Q_isanumber( const char *s ); -qboolean Q_isintegral( float f ); - -// portable case insensitive compare -int Q_stricmp (const char *s1, const char *s2); -int Q_strncmp (const char *s1, const char *s2, int n); -int Q_stricmpn (const char *s1, const char *s2, int n); -char *Q_strlwr( char *s1 ); -char *Q_strupr( char *s1 ); -char *Q_strrchr( const char* string, int c ); - -// buffer size safe library replacements -void Q_strncpyz( char *dest, const char *src, int destsize ); -void Q_strcat( char *dest, int size, const char *src ); - -const char *Q_stristr( const char *s, const char *find); - -// strlen that discounts Quake color sequences -int Q_PrintStrlen( const char *string ); -// removes color sequences from string -char *Q_CleanStr( char *string ); -void Q_StripColor(char *text); -void Q_strstrip( char *string, const char *strip, const char *repl ); -const char *Q_strchrs( const char *string, const char *search ); - -//============================================= - // 64-bit integers for global rankings interface // implemented as a struct for qvm compatibility typedef struct qint64_s { diff --git a/shared/qcommon/q_string.c b/shared/qcommon/q_string.c new file mode 100644 index 0000000000..a936fe2864 --- /dev/null +++ b/shared/qcommon/q_string.c @@ -0,0 +1,435 @@ +#include "q_string.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "q_color.h" + +int Q_isprint( int c ) +{ + if ( c >= 0x20 && c <= 0x7E ) + return ( 1 ); + return ( 0 ); +} + +int Q_isprintext( int c ) +{ + if ( c >= 0x20 && c <= 0x7E ) + return (1); + if ( c >= 0x80 && c <= 0xFE ) + return (1); + return (0); +} + +int Q_isgraph( int c ) +{ + if ( c >= 0x21 && c <= 0x7E ) + return (1); + if ( c >= 0x80 && c <= 0xFE ) + return (1); + return (0); +} + +int Q_islower( int c ) +{ + if (c >= 'a' && c <= 'z') + return ( 1 ); + return ( 0 ); +} + +int Q_isupper( int c ) +{ + if (c >= 'A' && c <= 'Z') + return ( 1 ); + return ( 0 ); +} + +int Q_isalpha( int c ) +{ + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) + return ( 1 ); + return ( 0 ); +} + +qboolean Q_isanumber( const char *s ) +{ + char *p; + double ret; + + if( *s == '\0' ) + return qfalse; + + ret = strtod( s, &p ); + + if ( ret == HUGE_VAL || errno == ERANGE ) + return qfalse; + + return (qboolean)(*p == '\0'); +} + +qboolean Q_isintegral( float f ) +{ + return (qboolean)( (int)f == f ); +} + +char* Q_strrchr( const char* string, int c ) +{ + char cc = c; + char *s; + char *sp=(char *)0; + + s = (char*)string; + + while (*s) + { + if (*s == cc) + sp = s; + s++; + } + if (cc == 0) + sp = s; + + return sp; +} + +/* +============= +Q_strncpyz + +Safe strncpy that ensures a trailing zero +============= +*/ +void Q_strncpyz( char *dest, const char *src, int destsize ) { + assert(src); + assert(dest); + assert(destsize); + + strncpy( dest, src, destsize-1 ); + dest[destsize-1] = 0; +} + +int Q_stricmpn (const char *s1, const char *s2, int n) { + int c1, c2; + + if ( s1 == NULL ) { + if ( s2 == NULL ) + return 0; + else + return -1; + } + else if ( s2==NULL ) + return 1; + + do { + c1 = *s1++; + c2 = *s2++; + + if (!n--) { + return 0; // strings are equal until end point + } + + if (c1 != c2) { + if (c1 >= 'a' && c1 <= 'z') { + c1 -= ('a' - 'A'); + } + if (c2 >= 'a' && c2 <= 'z') { + c2 -= ('a' - 'A'); + } + if (c1 != c2) { + return c1 < c2 ? -1 : 1; + } + } + } while (c1); + + return 0; // strings are equal +} + +int Q_stricmp (const char *s1, const char *s2) { + return (s1 && s2) ? Q_stricmpn (s1, s2, 99999) : -1; +} + +int Q_strncmp (const char *s1, const char *s2, int n) { + int c1, c2; + + do { + c1 = *s1++; + c2 = *s2++; + + if (!n--) { + return 0; // strings are equal until end point + } + + if (c1 != c2) { + return c1 < c2 ? -1 : 1; + } + } while (c1); + + return 0; // strings are equal +} + +char *Q_strlwr( char *s1 ) { + char *s; + + s = s1; + while ( *s ) { + *s = tolower(*s); + s++; + } + return s1; +} + +char *Q_strupr( char *s1 ) { + char *s; + + s = s1; + while ( *s ) { + *s = toupper(*s); + s++; + } + return s1; +} + +// never goes past bounds or leaves without a terminating 0 +void Q_strcat( char *dest, int size, const char *src ) { + int l1; + + l1 = strlen( dest ); + if ( l1 >= size ) { + //Com_Error( ERR_FATAL, "Q_strcat: already overflowed" ); + return; + } + if ( strlen(src)+1 > (size_t)(size - l1)) + { //do the error here instead of in Q_strncpyz to get a meaningful msg + //Com_Error(ERR_FATAL,"Q_strcat: cannot append \"%s\" to \"%s\"", src, dest); + return; + } + Q_strncpyz( dest + l1, src, size - l1 ); +} + +/* +* Find the first occurrence of find in s. +*/ +const char *Q_stristr( const char *s, const char *find ) +{ + char c, sc; + size_t len; + + if ((c = *find++) != 0) + { + if (c >= 'a' && c <= 'z') + { + c -= ('a' - 'A'); + } + len = strlen(find); + do + { + do + { + if ((sc = *s++) == 0) + return NULL; + if (sc >= 'a' && sc <= 'z') + { + sc -= ('a' - 'A'); + } + } while (sc != c); + } while (Q_stricmpn(s, find, len) != 0); + s--; + } + return s; +} + +int Q_PrintStrlen( const char *string ) { + int len; + const char *p; + + if( !string ) { + return 0; + } + + len = 0; + p = string; + while( *p ) { + if( Q_IsColorString( p ) ) { + p += 2; + continue; + } + p++; + len++; + } + + return len; +} + + +char *Q_CleanStr( char *string ) { + char* d; + char* s; + int c; + + s = string; + d = string; + while ((c = *s) != 0 ) { + if ( Q_IsColorString( s ) ) { + s++; + } + else if ( c >= 0x20 && c <= 0x7E ) { + *d++ = c; + } + s++; + } + *d = '\0'; + + return string; +} + +/* +================== +Q_StripColor + +Strips coloured strings in-place using multiple passes: "fgs^^56fds" -> "fgs^6fds" -> "fgsfds" + +This function modifies INPUT (is mutable) + +(Also strips ^8 and ^9) +================== +*/ +void Q_StripColor(char *text) +{ + qboolean doPass = qtrue; + char *read; + char *write; + + while ( doPass ) + { + doPass = qfalse; + read = write = text; + while ( *read ) + { + if ( Q_IsColorStringExt(read) ) + { + doPass = qtrue; + read += 2; + } + else + { + // Avoid writing the same data over itself + if (write != read) + { + *write = *read; + } + write++; + read++; + } + } + if ( write < read ) + { + // Add trailing NUL byte if string has shortened + *write = '\0'; + } + } +} + +/* +Q_strstrip + +Description: Replace strip[x] in string with repl[x] or remove characters entirely +Mutates: string +Return: -- + +Examples: Q_strstrip( "Bo\nb is h\rairy!!", "\n\r!", "123" ); // "Bo1b is h2airy33" +Q_strstrip( "Bo\nb is h\rairy!!", "\n\r!", "12" ); // "Bo1b is h2airy" +Q_strstrip( "Bo\nb is h\rairy!!", "\n\r!", NULL ); // "Bob is hairy" +*/ + +void Q_strstrip( char *string, const char *strip, const char *repl ) +{ + char *out=string, *p=string, c; + const char *s=strip; + int replaceLen = repl?strlen( repl ):0, offset=0; + qboolean recordChar = qtrue; + + while ( (c = *p++) != '\0' ) + { + recordChar = qtrue; + for ( s=strip; *s; s++ ) + { + offset = s-strip; + if ( c == *s ) + { + if ( !repl || offset >= replaceLen ) + recordChar = qfalse; + else + c = repl[offset]; + break; + } + } + if ( recordChar ) + *out++ = c; + } + *out = '\0'; +} + +/* +Q_strchrs + +Description: Find any characters in a string. Think of it as a shorthand strchr loop. +Mutates: -- +Return: first instance of any characters found +otherwise NULL +*/ + +const char *Q_strchrs( const char *string, const char *search ) +{ + const char *p = string, *s = search; + + while ( *p != '\0' ) + { + for ( s=search; *s; s++ ) + { + if ( *p == *s ) + return p; + } + p++; + } + + return NULL; +} + +#if defined(_MSC_VER) +/* +============= +Q_vsnprintf + +Special wrapper function for Microsoft's broken _vsnprintf() function. +MinGW comes with its own snprintf() which is not broken. +============= +*/ + +int Q_vsnprintf(char *str, size_t size, const char *format, va_list ap) +{ + int retval; + + retval = _vsnprintf(str, size, format, ap); + + if(retval < 0 || retval == size) + { + // Microsoft doesn't adhere to the C99 standard of vsnprintf, + // which states that the return value must be the number of + // bytes written if the output string had sufficient length. + // + // Obviously we cannot determine that value from Microsoft's + // implementation, so we have no choice but to return size. + + str[size - 1] = '\0'; + return size; + } + + return retval; +} +#endif \ No newline at end of file diff --git a/shared/qcommon/q_string.h b/shared/qcommon/q_string.h new file mode 100644 index 0000000000..5228e80299 --- /dev/null +++ b/shared/qcommon/q_string.h @@ -0,0 +1,52 @@ +#pragma once + +#include "q_platform.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +int Q_isprint( int c ); +int Q_isprintext( int c ); +int Q_isgraph( int c ); +int Q_islower( int c ); +int Q_isupper( int c ); +int Q_isalpha( int c ); +qboolean Q_isanumber( const char *s ); +qboolean Q_isintegral( float f ); + +// portable case insensitive compare +int Q_stricmp(const char *s1, const char *s2); +int Q_strncmp(const char *s1, const char *s2, int n); +int Q_stricmpn(const char *s1, const char *s2, int n); +char *Q_strlwr( char *s1 ); +char *Q_strupr( char *s1 ); +char *Q_strrchr( const char* string, int c ); + +// buffer size safe library replacements +void Q_strncpyz( char *dest, const char *src, int destsize ); +void Q_strcat( char *dest, int size, const char *src ); + +const char *Q_stristr( const char *s, const char *find); + +// strlen that discounts Quake color sequences +int Q_PrintStrlen( const char *string ); + +// removes color sequences from string +char *Q_CleanStr( char *string ); +void Q_StripColor(char *text); +const char *Q_strchrs( const char *string, const char *search ); + +void Q_strstrip( char *string, const char *strip, const char *repl ); + +#if defined (_MSC_VER) + // vsnprintf is ISO/IEC 9899:1999 + // abstracting this to make it portable + int Q_vsnprintf( char *str, size_t size, const char *format, va_list args ); +#else // not using MSVC + #define Q_vsnprintf vsnprintf +#endif + +#if defined(__cplusplus) +} // extern "C" +#endif From df6aa600f846e09524af3bd2697c1e2fa84a6f66 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Thu, 4 Aug 2016 15:49:21 +0100 Subject: [PATCH 288/445] Move some more functions into shared math files --- code/qcommon/q_shared.cpp | 49 ---------------------------------- code/qcommon/q_shared.h | 12 --------- codemp/qcommon/q_shared.c | 48 --------------------------------- shared/qcommon/q_math_common.c | 48 +++++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 109 deletions(-) diff --git a/code/qcommon/q_shared.cpp b/code/qcommon/q_shared.cpp index c3406f3000..ccfca8c160 100644 --- a/code/qcommon/q_shared.cpp +++ b/code/qcommon/q_shared.cpp @@ -26,55 +26,6 @@ along with this program; if not, see . #include "../game/common_headers.h" -int Com_Clampi( int min, int max, int value ) -{ - if ( value < min ) - { - return min; - } - if ( value > max ) - { - return max; - } - return value; -} - -float Com_Clamp( float min, float max, float value ) -{ - if ( value < min ) { - return min; - } - if ( value > max ) { - return max; - } - return value; -} - -int Com_AbsClampi( int min, int max, int value ) -{ - if( value < 0 ) - { - return Com_Clampi( -max, -min, value ); - } - else - { - return Com_Clampi( min, max, value ); - } -} - -float Com_AbsClamp( float min, float max, float value ) -{ - if( value < 0.0f ) - { - return Com_Clamp( -max, -min, value ); - } - else - { - return Com_Clamp( min, max, value ); - } -} - - /* ============ COM_SkipPath diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 7679f6def2..a631ed45b9 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -157,16 +157,12 @@ along with this program; if not, see . #define idppc 0 #endif - #include "qcommon/q_platform.h" // ================================================================ // TYPE DEFINITIONS // ================================================================ -#define Q_min(x,y) ((x)<(y)?(x):(y)) -#define Q_max(x,y) ((x)>(y)?(x):(y)) - typedef int32_t qhandle_t, thandle_t, fxHandle_t, sfxHandle_t, fileHandle_t, clipHandle_t; #define NULL_HANDLE ((qhandle_t)0) @@ -192,16 +188,8 @@ typedef int32_t qhandle_t, thandle_t, fxHandle_t, sfxHandle_t, fileHandle_t, cli #define NULL ((void *)0) #endif -#define MAX_QINT 0x7fffffff -#define MIN_QINT (-MAX_QINT-1) - #define INT_ID( a, b, c, d ) (uint32_t)((((a) & 0xff) << 24) | (((b) & 0xff) << 16) | (((c) & 0xff) << 8) | ((d) & 0xff)) -// angle indexes -#define PITCH 0 // up / down -#define YAW 1 // left / right -#define ROLL 2 // fall over - // the game guarantees that no string from the network will ever // exceed MAX_STRING_CHARS #define MAX_STRING_CHARS 1024 // max length of a string passed to Cmd_TokenizeString diff --git a/codemp/qcommon/q_shared.c b/codemp/qcommon/q_shared.c index 1d3df4f512..439ea624aa 100644 --- a/codemp/qcommon/q_shared.c +++ b/codemp/qcommon/q_shared.c @@ -70,54 +70,6 @@ const char *GetStringForID( stringID_table_t *table, int id ) return NULL; } -int Com_Clampi( int min, int max, int value ) -{ - if ( value < min ) - { - return min; - } - if ( value > max ) - { - return max; - } - return value; -} - -float Com_Clamp( float min, float max, float value ) { - if ( value < min ) { - return min; - } - if ( value > max ) { - return max; - } - return value; -} - -int Com_AbsClampi( int min, int max, int value ) -{ - if( value < 0 ) - { - return Com_Clampi( -max, -min, value ); - } - else - { - return Com_Clampi( min, max, value ); - } -} - -float Com_AbsClamp( float min, float max, float value ) -{ - if( value < 0.0f ) - { - return Com_Clamp( -max, -min, value ); - } - else - { - return Com_Clamp( min, max, value ); - } -} - - /* ============ COM_SkipPath diff --git a/shared/qcommon/q_math_common.c b/shared/qcommon/q_math_common.c index 8837bf6436..e954304cfd 100644 --- a/shared/qcommon/q_math_common.c +++ b/shared/qcommon/q_math_common.c @@ -309,6 +309,54 @@ signed short ClampShort( int i ) return i; } +int Com_Clampi( int min, int max, int value ) +{ + if ( value < min ) + { + return min; + } + if ( value > max ) + { + return max; + } + return value; +} + +float Com_Clamp( float min, float max, float value ) { + if ( value < min ) { + return min; + } + if ( value > max ) { + return max; + } + return value; +} + +int Com_AbsClampi( int min, int max, int value ) +{ + if( value < 0 ) + { + return Com_Clampi( -max, -min, value ); + } + else + { + return Com_Clampi( min, max, value ); + } +} + +float Com_AbsClamp( float min, float max, float value ) +{ + if( value < 0.0f ) + { + return Com_Clamp( -max, -min, value ); + } + else + { + return Com_Clamp( min, max, value ); + } +} + + float Q_rsqrt( float number ) { byteAlias_t t; From cfcc97f335fdb89994e83b8db8edb7ac0529c58d Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Fri, 5 Aug 2016 16:29:34 +0100 Subject: [PATCH 289/445] Increase size of cgame/UI memory and string pools UI memory pool size 2mb -> 4mb UI string pool size 384kb -> 2mb cgame string pool size 128kb -> 2mb --- code/ui/ui_shared.cpp | 5 ++--- code/ui/ui_shared.h | 7 +------ codemp/ui/ui_shared.c | 9 +++------ codemp/ui/ui_shared.h | 6 +----- 4 files changed, 7 insertions(+), 20 deletions(-) diff --git a/code/ui/ui_shared.cpp b/code/ui/ui_shared.cpp index 220e74002c..08cdef3f2a 100644 --- a/code/ui/ui_shared.cpp +++ b/code/ui/ui_shared.cpp @@ -93,10 +93,9 @@ static void *captureData = NULL; //const char defaultString[10] = {"default"}; #ifdef CGAME -#define MEM_POOL_SIZE 128 * 1024 +#define MEM_POOL_SIZE (128 * 1024) #else -//#define MEM_POOL_SIZE 1024 * 1024 -#define MEM_POOL_SIZE 2048 * 1024 +#define MEM_POOL_SIZE (4 * 1024 * 1024) #endif #define SCROLL_TIME_START 500 diff --git a/code/ui/ui_shared.h b/code/ui/ui_shared.h index 9bf26c0b79..53151f3fca 100644 --- a/code/ui/ui_shared.h +++ b/code/ui/ui_shared.h @@ -106,12 +106,7 @@ typedef struct multiDef_s { #define CVAR_HIDE 0x00000008 #define CVAR_SUBSTRING 0x00000010 //when using enable or disable, just check for strstr instead of == - -#ifdef CGAME -#define STRING_POOL_SIZE 128*1024 -#else -#define STRING_POOL_SIZE 384*1024 -#endif +#define STRING_POOL_SIZE (2*1024*1024) #define NUM_CROSSHAIRS 9 diff --git a/codemp/ui/ui_shared.c b/codemp/ui/ui_shared.c index 3c7679bcdb..225c65cf90 100644 --- a/codemp/ui/ui_shared.c +++ b/codemp/ui/ui_shared.c @@ -127,12 +127,9 @@ extern qboolean ItemParse_model_g2anim_go( itemDef_t *item, const char *animName #ifdef _CGAME - #define MEM_POOL_SIZE 128 * 1024 - #define UI_ALLOCATION_TAG TAG_CG_UI_ALLOC +#define MEM_POOL_SIZE (128 * 1024) #else -// #define MEM_POOL_SIZE 1024 * 1024 - #define MEM_POOL_SIZE 2048 * 1024 - #define UI_ALLOCATION_TAG TAG_UI_ALLOC +#define MEM_POOL_SIZE (4 * 1024 * 1024) #endif static char memoryPool[MEM_POOL_SIZE]; @@ -271,7 +268,7 @@ const char *String_Alloc(const char *p) { } //Increase STRING_POOL_SIZE. - assert(0); + Com_Printf( S_COLOR_RED, "String pool has been exhausted.\n" ); return NULL; } diff --git a/codemp/ui/ui_shared.h b/codemp/ui/ui_shared.h index 5e74993890..56a0ee795d 100644 --- a/codemp/ui/ui_shared.h +++ b/codemp/ui/ui_shared.h @@ -76,11 +76,7 @@ along with this program; if not, see . #define CURSOR_ARROW 0x00000002 #define CURSOR_SIZER 0x00000004 -#ifdef _CGAME - #define STRING_POOL_SIZE 128*1024 -#else - #define STRING_POOL_SIZE 384*1024 -#endif +#define STRING_POOL_SIZE (2*1024*1024) #define MAX_STRING_HANDLES 4096 #define MAX_SCRIPT_ARGS 12 From 149fcb96272fc9d4a17373dcca0761014688f7cf Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Fri, 5 Aug 2016 20:07:35 +0300 Subject: [PATCH 290/445] Split ISavedGame into two classes --- code/CMakeLists.txt | 9 +- code/game/CMakeLists.txt | 7 +- code/rd-vanilla/CMakeLists.txt | 7 +- codeJK2/game/CMakeLists.txt | 7 +- shared/qcommon/ojk_i_saved_game_stream.h | 103 ++++++++++++ ...saved_game.cpp => ojk_saved_game_file.cpp} | 86 +++++----- ...ojk_saved_game.h => ojk_saved_game_file.h} | 61 +++---- ..._game.h => ojk_saved_game_stream_helper.h} | 130 ++++++++------- ...d.h => ojk_saved_game_stream_helper_fwd.h} | 149 ++++-------------- 9 files changed, 287 insertions(+), 272 deletions(-) create mode 100644 shared/qcommon/ojk_i_saved_game_stream.h rename shared/qcommon/{ojk_saved_game.cpp => ojk_saved_game_file.cpp} (89%) rename shared/qcommon/{ojk_saved_game.h => ojk_saved_game_file.h} (84%) rename shared/qcommon/{ojk_i_saved_game.h => ojk_saved_game_stream_helper.h} (81%) rename shared/qcommon/{ojk_i_saved_game_fwd.h => ojk_saved_game_stream_helper_fwd.h} (58%) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 571aba288f..db03e34679 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -176,12 +176,13 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SharedDir}/qcommon/ojk_exception.h" "${SharedDir}/qcommon/ojk_exception.cpp" - "${SharedDir}/qcommon/ojk_i_saved_game.h" - "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" - "${SharedDir}/qcommon/ojk_saved_game.h" - "${SharedDir}/qcommon/ojk_saved_game.cpp" "${SharedDir}/qcommon/ojk_saved_game_exception.h" "${SharedDir}/qcommon/ojk_saved_game_exception.cpp" + "${SharedDir}/qcommon/ojk_i_saved_game_stream.h" + "${SharedDir}/qcommon/ojk_saved_game_file.h" + "${SharedDir}/qcommon/ojk_saved_game_file.cpp" + "${SharedDir}/qcommon/ojk_saved_game_stream_helper.h" + "${SharedDir}/qcommon/ojk_saved_game_stream_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 9438679089..df94c7ee56 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -261,8 +261,11 @@ set(SPGameCommonFiles "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SPDir}/rd-common/mdx_format.h" - "${SharedDir}/qcommon/ojk_i_saved_game.h" - "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" + "${SharedDir}/qcommon/ojk_i_saved_game_stream.h" + "${SharedDir}/qcommon/ojk_saved_game_file.h" + "${SharedDir}/qcommon/ojk_saved_game_file.cpp" + "${SharedDir}/qcommon/ojk_saved_game_stream_helper.h" + "${SharedDir}/qcommon/ojk_saved_game_stream_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index 5172eb9e35..dd4e50b7ef 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -78,8 +78,11 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" - "${SharedDir}/qcommon/ojk_i_saved_game.h" - "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" + "${SharedDir}/qcommon/ojk_i_saved_game_stream.h" + "${SharedDir}/qcommon/ojk_saved_game_file.h" + "${SharedDir}/qcommon/ojk_saved_game_file.cpp" + "${SharedDir}/qcommon/ojk_saved_game_stream_helper.h" + "${SharedDir}/qcommon/ojk_saved_game_stream_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index 06faddc924..4ddfdaf34e 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -233,8 +233,11 @@ set(JK2SPGameCommonFiles "${SPDir}/qcommon/q_shared.h" "${SPDir}/qcommon/strippublic.h" "${SPDir}/rd-common/mdx_format.h" - "${SharedDir}/qcommon/ojk_i_saved_game.h" - "${SharedDir}/qcommon/ojk_i_saved_game_fwd.h" + "${SharedDir}/qcommon/ojk_i_saved_game_stream.h" + "${SharedDir}/qcommon/ojk_saved_game_file.h" + "${SharedDir}/qcommon/ojk_saved_game_file.cpp" + "${SharedDir}/qcommon/ojk_saved_game_stream_helper.h" + "${SharedDir}/qcommon/ojk_saved_game_stream_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) diff --git a/shared/qcommon/ojk_i_saved_game_stream.h b/shared/qcommon/ojk_i_saved_game_stream.h new file mode 100644 index 0000000000..4c6a6bfb9a --- /dev/null +++ b/shared/qcommon/ojk_i_saved_game_stream.h @@ -0,0 +1,103 @@ +// +// Saved game stream interface. +// + + +#ifndef OJK_I_SAVED_GAME_STREAM_INCLUDED +#define OJK_I_SAVED_GAME_STREAM_INCLUDED + + +#include + + +namespace ojk +{ + + +class ISavedGameStream +{ +public: + ISavedGameStream() + { + } + + ISavedGameStream( + const ISavedGameStream& that) = delete; + + ISavedGameStream& operator=( + const ISavedGameStream& that) = delete; + + virtual ~ISavedGameStream() + { + } + + + // Returns true if the saved game opened for reading. + virtual bool is_readable() const = 0; + + // Returns true if the saved game opened for writing. + virtual bool is_writable() const = 0; + + + // Reads a chunk from the file into the internal buffer. + virtual void read_chunk( + const uint32_t chunk_id) = 0; + + // Returns true if all data read from the internal buffer. + virtual bool is_all_data_read() const = 0; + + // Throws an exception if all data not read. + virtual void ensure_all_data_read() const = 0; + + + // Writes a chunk into the file from the internal buffer. + virtual void write_chunk( + const uint32_t chunk_id) = 0; + + + // Reads a raw data from the internal buffer. + virtual void read( + void* dst_data, + int dst_size) = 0; + + // Writes a raw data into the internal buffer. + virtual void write( + const void* src_data, + int src_size) = 0; + + // Increments buffer's offset by the specified non-negative count. + virtual void skip( + int count) = 0; + + + // Stores current I/O buffer and it's position. + virtual void save_buffer() = 0; + + // Restores saved I/O buffer and it's position. + virtual void load_buffer() = 0; + + // Returns a pointer to data in the I/O buffer. + virtual const void* get_buffer_data() const = 0; + + // Returns a current size of the I/O buffer. + virtual int get_buffer_size() const = 0; + + + // Clears buffer and resets it's offset to the beginning. + virtual void reset_buffer() = 0; + + // Resets buffer offset to the beginning. + virtual void reset_buffer_offset() = 0; + + + // If true won't throw an exception when buffer offset is beyond it's size. + // Although, no data will be read beyond the buffer. + virtual void allow_read_overflow( + bool value) = 0; +}; // ISavedGameStream + + +} // ojk + + +#endif // OJK_I_SAVED_GAME_STREAM_INCLUDED diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game_file.cpp similarity index 89% rename from shared/qcommon/ojk_saved_game.cpp rename to shared/qcommon/ojk_saved_game_file.cpp index a5a97486b1..bcee5f74f6 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game_file.cpp @@ -1,4 +1,10 @@ -#include "ojk_saved_game.h" +// +// Saved game file. +// + + +#include "ojk_saved_game_file.h" +#include "ojk_saved_game_stream_helper.h" #include #include "ojk_saved_game_exception.h" #include "qcommon/qcommon.h" @@ -9,7 +15,7 @@ namespace ojk { -SavedGame::SavedGame() : +SavedGameFile::SavedGameFile() : file_handle_(), io_buffer_(), saved_io_buffer_(), @@ -23,12 +29,12 @@ SavedGame::SavedGame() : { } -SavedGame::~SavedGame() +SavedGameFile::~SavedGameFile() { close(); } -bool SavedGame::open( +bool SavedGameFile::open( const std::string& base_file_name) { close(); @@ -66,7 +72,9 @@ bool SavedGame::open( if (is_succeed) { - static_cast(read_chunk( + SavedGameStreamHelper sgsh(this); + + static_cast(sgsh.read_chunk( INT_ID('_', 'V', 'E', 'R'), sg_version)); @@ -90,7 +98,7 @@ bool SavedGame::open( return is_succeed; } -bool SavedGame::create( +bool SavedGameFile::create( const std::string& base_file_name) { close(); @@ -123,14 +131,16 @@ bool SavedGame::create( const auto sg_version = iSAVEGAME_VERSION; - write_chunk( + SavedGameStreamHelper sgsh(this); + + sgsh.write_chunk( INT_ID('_', 'V', 'E', 'R'), sg_version); return true; } -void SavedGame::close() +void SavedGameFile::close() { if (file_handle_ != 0) { @@ -146,18 +156,18 @@ void SavedGame::close() is_write_failed_ = false; } -bool SavedGame::is_readable() const +bool SavedGameFile::is_readable() const { return is_readable_; } -bool SavedGame::is_writable() const +bool SavedGameFile::is_writable() const { return is_writable_; } -void SavedGame::read_chunk( - const SavedGame::ChunkId chunk_id) +void SavedGameFile::read_chunk( + const uint32_t chunk_id) { io_buffer_offset_ = 0; @@ -316,12 +326,12 @@ void SavedGame::read_chunk( } } -bool SavedGame::is_all_data_read() const +bool SavedGameFile::is_all_data_read() const { return io_buffer_.size() == io_buffer_offset_; } -void SavedGame::ensure_all_data_read() const +void SavedGameFile::ensure_all_data_read() const { if (!is_all_data_read()) { @@ -330,8 +340,8 @@ void SavedGame::ensure_all_data_read() const } } -void SavedGame::write_chunk( - const SavedGame::ChunkId chunk_id) +void SavedGameFile::write_chunk( + const uint32_t chunk_id) { const auto&& chunk_id_string = get_chunk_id_string( chunk_id); @@ -490,7 +500,7 @@ void SavedGame::write_chunk( } } -void SavedGame::raw_read( +void SavedGameFile::read( void* dst_data, int dst_size) { @@ -539,7 +549,7 @@ void SavedGame::raw_read( io_buffer_offset_ += dst_size; } -void SavedGame::raw_write( +void SavedGameFile::write( const void* src_data, int src_size) { @@ -579,12 +589,12 @@ void SavedGame::raw_write( io_buffer_offset_ = new_buffer_size; } -bool SavedGame::is_write_failed() const +bool SavedGameFile::is_write_failed() const { return is_write_failed_; } -void SavedGame::skip( +void SavedGameFile::skip( int count) { if (!is_readable_ && !is_writable_) @@ -627,29 +637,29 @@ void SavedGame::skip( io_buffer_offset_ = new_offset; } -void SavedGame::save_buffer() +void SavedGameFile::save_buffer() { saved_io_buffer_ = io_buffer_; saved_io_buffer_offset_ = io_buffer_offset_; } -void SavedGame::load_buffer() +void SavedGameFile::load_buffer() { io_buffer_ = saved_io_buffer_; io_buffer_offset_ = saved_io_buffer_offset_; } -const void* SavedGame::get_buffer_data() const +const void* SavedGameFile::get_buffer_data() const { return io_buffer_.data(); } -int SavedGame::get_buffer_size() const +int SavedGameFile::get_buffer_size() const { return static_cast(io_buffer_.size()); } -void SavedGame::rename( +void SavedGameFile::rename( const std::string& old_base_file_name, const std::string& new_base_file_name) { @@ -672,7 +682,7 @@ void SavedGame::rename( } } -void SavedGame::remove( +void SavedGameFile::remove( const std::string& base_file_name) { const auto&& path = generate_path( @@ -682,33 +692,33 @@ void SavedGame::remove( path.c_str()); } -SavedGame& SavedGame::get_instance() +SavedGameFile& SavedGameFile::get_instance() { - static SavedGame result; + static SavedGameFile result; return result; } -void SavedGame::allow_read_overflow( +void SavedGameFile::allow_read_overflow( bool value) { is_read_overflow_allowed_ = value; } -void SavedGame::throw_error( +void SavedGameFile::throw_error( const char* message) { throw SavedGameException( message); } -void SavedGame::throw_error( +void SavedGameFile::throw_error( const std::string& message) { throw SavedGameException( message); } -void SavedGame::compress( +void SavedGameFile::compress( const Buffer& src_buffer, Buffer& dst_buffer) { @@ -771,7 +781,7 @@ void SavedGame::compress( dst_index); } -void SavedGame::decompress( +void SavedGameFile::decompress( const Buffer& src_buffer, Buffer& dst_buffer) { @@ -811,7 +821,7 @@ void SavedGame::decompress( } } -std::string SavedGame::generate_path( +std::string SavedGameFile::generate_path( const std::string& base_file_name) { auto normalized_file_name = base_file_name; @@ -827,7 +837,7 @@ std::string SavedGame::generate_path( return path; } -std::string SavedGame::get_chunk_id_string( +std::string SavedGameFile::get_chunk_id_string( uint32_t chunk_id) { std::string result(4, '\0'); @@ -840,18 +850,18 @@ std::string SavedGame::get_chunk_id_string( return result; } -void SavedGame::reset_buffer() +void SavedGameFile::reset_buffer() { io_buffer_.clear(); reset_buffer_offset(); } -void SavedGame::reset_buffer_offset() +void SavedGameFile::reset_buffer_offset() { io_buffer_offset_ = 0; } -constexpr uint32_t SavedGame::get_jo_magic_value() +constexpr uint32_t SavedGameFile::get_jo_magic_value() { return 0x1234ABCD; } diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game_file.h similarity index 84% rename from shared/qcommon/ojk_saved_game.h rename to shared/qcommon/ojk_saved_game_file.h index 6e874a4eb7..1ffa06c03a 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game_file.h @@ -1,39 +1,36 @@ // -// Saved game. +// Saved game file. // (forward declaration) // -#ifndef OJK_SAVED_GAME_FWD_INCLUDED -#define OJK_SAVED_GAME_FWD_INCLUDED +#ifndef OJK_SAVED_GAME_FILE_INCLUDED +#define OJK_SAVED_GAME_FILE_INCLUDED #include #include #include -#include "ojk_i_saved_game.h" +#include "ojk_i_saved_game_stream.h" namespace ojk { -class SavedGame : - public ISavedGame +class SavedGameFile : + public ISavedGameStream { public: - using ChunkId = uint32_t; + SavedGameFile(); + SavedGameFile( + const SavedGameFile& that) = delete; - SavedGame(); + SavedGameFile& operator=( + const SavedGameFile& that) = delete; - SavedGame( - const SavedGame& that) = delete; - - SavedGame& operator=( - const SavedGame& that) = delete; - - virtual ~SavedGame(); + virtual ~SavedGameFile(); // Creates a new saved game file for writing. @@ -57,9 +54,9 @@ class SavedGame : // Reads a chunk from the file into the internal buffer. void read_chunk( - const ChunkId chunk_id) override; + const uint32_t chunk_id) override; - using ISavedGame::read_chunk; + using ISavedGameStream::read_chunk; // Returns true if all data read from the internal buffer. @@ -71,26 +68,20 @@ class SavedGame : // Writes a chunk into the file from the internal buffer. void write_chunk( - const ChunkId chunk_id) override; - - using ISavedGame::write_chunk; + const uint32_t chunk_id) override; // Reads a raw data from the internal buffer. - void raw_read( + void read( void* dst_data, int dst_size) override; - using ISavedGame::read; - // Writes a raw data into the internal buffer. - void raw_write( + void write( const void* src_data, int src_size) override; - using ISavedGame::write; - bool is_write_failed() const; @@ -119,6 +110,11 @@ class SavedGame : // Resets buffer offset to the beginning. void reset_buffer_offset() override; + // If true won't throw an exception when buffer offset is beyond it's size. + // Although, no data will be read beyond the buffer. + void allow_read_overflow( + bool value) override; + // Renames a saved game file. static void rename( @@ -130,14 +126,7 @@ class SavedGame : const std::string& base_file_name); // Returns a default instance of the class. - static SavedGame& get_instance(); - - -protected: - // If true won't throw an exception when buffer offset is beyond it's size. - // Although, no data will be read beyond the buffer. - void allow_read_overflow( - bool value) override; + static SavedGameFile& get_instance(); private: @@ -206,10 +195,10 @@ class SavedGame : uint32_t chunk_id); static constexpr uint32_t get_jo_magic_value(); -}; // SavedGame +}; // SavedGameFile } // ojk -#endif // OJK_SAVED_GAME_FWD_INCLUDED +#endif // OJK_SAVED_GAME_FILE_INCLUDED diff --git a/shared/qcommon/ojk_i_saved_game.h b/shared/qcommon/ojk_saved_game_stream_helper.h similarity index 81% rename from shared/qcommon/ojk_i_saved_game.h rename to shared/qcommon/ojk_saved_game_stream_helper.h index ed8eaedb99..6af5dd05af 100644 --- a/shared/qcommon/ojk_i_saved_game.h +++ b/shared/qcommon/ojk_saved_game_stream_helper.h @@ -1,15 +1,15 @@ // -// Saved game interface. +// Saved game stream helper. // -#ifndef OJK_I_SAVED_GAME_INCLUDED -#define OJK_I_SAVED_GAME_INCLUDED +#ifndef OJK_SAVED_GAME_STREAM_HELPER_INCLUDED +#define OJK_SAVED_GAME_STREAM_HELPER_INCLUDED #include #include -#include "ojk_i_saved_game_fwd.h" +#include "ojk_saved_game_stream_helper_fwd.h" #include "ojk_scope_guard.h" @@ -20,11 +20,9 @@ namespace ojk // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // Class stuff -inline ISavedGame::ISavedGame() -{ -} - -inline ISavedGame::~ISavedGame() +inline SavedGameStreamHelper::SavedGameStreamHelper( + ISavedGameStream* saved_game_stream) : + saved_game_stream_(saved_game_stream) { } @@ -36,33 +34,33 @@ inline ISavedGame::~ISavedGame() // read_chunk template -void ISavedGame::read_chunk( - const ChunkId chunk_id, +void SavedGameStreamHelper::read_chunk( + const uint32_t chunk_id, TDst& dst_value) { - read_chunk( + saved_game_stream_->read_chunk( chunk_id); read( dst_value); - ensure_all_data_read(); + saved_game_stream_->ensure_all_data_read(); } template -void ISavedGame::read_chunk( - const ChunkId chunk_id, +void SavedGameStreamHelper::read_chunk( + const uint32_t chunk_id, TDst* dst_values, int dst_count) { - read_chunk( + saved_game_stream_->read_chunk( chunk_id); read( dst_values, dst_count); - ensure_all_data_read(); + saved_game_stream_->ensure_all_data_read(); } // read_chunk @@ -73,53 +71,53 @@ void ISavedGame::read_chunk( // write_chunk template -void ISavedGame::write_chunk_and_size( - const ChunkId size_chunk_id, - const ChunkId data_chunk_id) +void SavedGameStreamHelper::write_chunk_and_size( + const uint32_t size_chunk_id, + const uint32_t data_chunk_id) { - save_buffer(); + saved_game_stream_->save_buffer(); - auto data_size = get_buffer_size(); + auto data_size = saved_game_stream_->get_buffer_size(); - reset_buffer(); + saved_game_stream_->reset_buffer(); write_chunk( size_chunk_id, data_size); - load_buffer(); + saved_game_stream_->load_buffer(); - write_chunk( + saved_game_stream_->write_chunk( data_chunk_id); } template -void ISavedGame::write_chunk( - const ChunkId chunk_id, +void SavedGameStreamHelper::write_chunk( + const uint32_t chunk_id, const TSrc& src_value) { - reset_buffer(); + saved_game_stream_->reset_buffer(); write( src_value); - write_chunk( + saved_game_stream_->write_chunk( chunk_id); } template -void ISavedGame::write_chunk( - const ChunkId chunk_id, +void SavedGameStreamHelper::write_chunk( + const uint32_t chunk_id, const TSrc* src_values, int src_count) { - reset_buffer(); + saved_game_stream_->reset_buffer(); write( src_values, src_count); - write_chunk( + saved_game_stream_->write_chunk( chunk_id); } @@ -131,7 +129,7 @@ void ISavedGame::write_chunk( // read template -void ISavedGame::read( +void SavedGameStreamHelper::read( TDst& dst_value) { using Tag = typename std::conditional < @@ -170,7 +168,7 @@ void ISavedGame::read( } template -void ISavedGame::read( +void SavedGameStreamHelper::read( TDst& dst_value, BooleanTag) { @@ -178,7 +176,7 @@ void ISavedGame::read( TSrc src_value; - raw_read( + saved_game_stream_->read( &src_value, static_cast(sizeof(TSrc))); @@ -189,7 +187,7 @@ void ISavedGame::read( } template -void ISavedGame::read( +void SavedGameStreamHelper::read( TDst& dst_value, NumericTag) { @@ -197,7 +195,7 @@ void ISavedGame::read( TSrc src_value; - raw_read( + saved_game_stream_->read( &src_value, src_size); @@ -208,7 +206,7 @@ void ISavedGame::read( } template -void ISavedGame::read( +void SavedGameStreamHelper::read( TDst*& dst_value, PointerTag) { @@ -233,7 +231,7 @@ void ISavedGame::read( } template -void ISavedGame::read( +void SavedGameStreamHelper::read( TDst& dst_value, ClassTag) { @@ -242,11 +240,11 @@ void ISavedGame::read( "Unsupported types."); dst_value.sg_import( - this); + saved_game_stream_); } template -void ISavedGame::read( +void SavedGameStreamHelper::read( TDst(&dst_values)[TCount], Array1dTag) { @@ -256,7 +254,7 @@ void ISavedGame::read( } template -void ISavedGame::read( +void SavedGameStreamHelper::read( TDst(&dst_values)[TCount1][TCount2], Array2dTag) { @@ -273,19 +271,19 @@ void ISavedGame::read( // try_read template -bool ISavedGame::try_read( +bool SavedGameStreamHelper::try_read( TDst& dst_value) { ScopeGuard scope_guard( - [this]() + [saved_game_stream_]() { - this->allow_read_overflow( + saved_game_stream_->allow_read_overflow( true); }, - [this]() + [saved_game_stream_]() { - this->allow_read_overflow( + saved_game_stream_->allow_read_overflow( false); } ); @@ -294,7 +292,7 @@ bool ISavedGame::try_read( read( dst_value); - return is_all_data_read(); + return saved_game_stream_->is_all_data_read(); } // try_read @@ -305,7 +303,7 @@ bool ISavedGame::try_read( // read (C-array) template -void ISavedGame::read( +void SavedGameStreamHelper::read( TDst* dst_values, int dst_count) { @@ -362,14 +360,14 @@ void ISavedGame::read( } template -void ISavedGame::read( +void SavedGameStreamHelper::read( TDst* dst_values, int dst_count, InplaceTag) { const auto dst_size = dst_count * static_cast(sizeof(TDst)); - raw_read( + saved_game_stream_->read( dst_values, dst_size); @@ -378,7 +376,7 @@ void ISavedGame::read( } template -void ISavedGame::read( +void SavedGameStreamHelper::read( TDst* dst_values, int dst_count, CastTag) @@ -413,7 +411,7 @@ void ISavedGame::read( // write template -void ISavedGame::write( +void SavedGameStreamHelper::write( const TSrc& src_value) { using Tag = typename std::conditional< @@ -448,7 +446,7 @@ void ISavedGame::write( } template -void ISavedGame::write( +void SavedGameStreamHelper::write( const TSrc& src_value, NumericTag) { @@ -459,13 +457,13 @@ void ISavedGame::write( // FIXME Byte order // - raw_write( + saved_game_stream_->write( &dst_value, dst_size); } template -void ISavedGame::write( +void SavedGameStreamHelper::write( const TSrc* src_value, PointerTag) { @@ -483,7 +481,7 @@ void ISavedGame::write( } template -void ISavedGame::write( +void SavedGameStreamHelper::write( const TSrc& src_value, ClassTag) { @@ -492,11 +490,11 @@ void ISavedGame::write( "Unsupported types."); src_value.sg_export( - this); + saved_game_stream_); } template -void ISavedGame::write( +void SavedGameStreamHelper::write( const TSrc(&src_values)[TCount], Array1dTag) { @@ -506,7 +504,7 @@ void ISavedGame::write( } template -void ISavedGame::write( +void SavedGameStreamHelper::write( const TSrc(&src_values)[TCount1][TCount2], Array2dTag) { @@ -523,7 +521,7 @@ void ISavedGame::write( // write (C-array) template -void ISavedGame::write( +void SavedGameStreamHelper::write( const TSrc* src_values, int src_count) { @@ -579,14 +577,14 @@ void ISavedGame::write( } template -void ISavedGame::write( +void SavedGameStreamHelper::write( const TSrc* src_values, int src_count, InplaceTag) { const auto src_size = src_count * static_cast(sizeof(TSrc)); - raw_write( + saved_game_stream_->write( src_values, src_size); @@ -595,7 +593,7 @@ void ISavedGame::write( } template -void ISavedGame::write( +void SavedGameStreamHelper::write( const TSrc* src_values, int src_count, CastTag) @@ -629,4 +627,4 @@ void ISavedGame::write( } // ojk -#endif // OJK_I_SAVED_GAME_INCLUDED +#endif // OJK_SAVED_GAME_STREAM_HELPER_INCLUDED diff --git a/shared/qcommon/ojk_i_saved_game_fwd.h b/shared/qcommon/ojk_saved_game_stream_helper_fwd.h similarity index 58% rename from shared/qcommon/ojk_i_saved_game_fwd.h rename to shared/qcommon/ojk_saved_game_stream_helper_fwd.h index 7a3bb596c4..63d2fe6360 100644 --- a/shared/qcommon/ojk_i_saved_game_fwd.h +++ b/shared/qcommon/ojk_saved_game_stream_helper_fwd.h @@ -1,103 +1,64 @@ // -// Saved game interface. +// Saved game stream helper. // (forward declaration) // -#ifndef OJK_I_SAVED_GAME_FWD_INCLUDED -#define OJK_I_SAVED_GAME_FWD_INCLUDED +#ifndef OJK_SAVED_GAME_STREAM_HELPER_FWD_INCLUDED +#define OJK_SAVED_GAME_STREAM_HELPER_FWD_INCLUDED -#include -#include +#include "ojk_i_saved_game_stream.h" namespace ojk { -class ISavedGame +class SavedGameStreamHelper { public: - using ChunkId = uint32_t; + SavedGameStreamHelper( + ISavedGameStream* saved_game_stream); - ISavedGame(); - - ISavedGame( - const ISavedGame& that) = delete; - - ISavedGame& operator=( - const ISavedGame& that) = delete; - - virtual ~ISavedGame(); - - - // Returns true if the saved game opened for reading. - virtual bool is_readable() const = 0; - - // Returns true if the saved game opened for writing. - virtual bool is_writable() const = 0; - - - // Reads a chunk from the file into the internal buffer. - virtual void read_chunk( - const ChunkId chunk_id) = 0; - // Reads a value or an array of values from the file via // the internal buffer. template void read_chunk( - const ChunkId chunk_id, + const uint32_t chunk_id, TDst& dst_value); // Reads an array of values with specified count from // the file via the internal buffer. template void read_chunk( - const ChunkId chunk_id, + const uint32_t chunk_id, TDst* dst_values, int dst_count); - // Returns true if all data read from the internal buffer. - virtual bool is_all_data_read() const = 0; - - // Throws an exception if all data not read. - virtual void ensure_all_data_read() const = 0; - - - // Writes a chunk into the file from the internal buffer. - virtual void write_chunk( - const ChunkId chunk_id) = 0; - // Writes a data-chunk into the file from the internal buffer // prepended with a size-chunk that holds a size of the data-chunk. template void write_chunk_and_size( - const ChunkId size_chunk_id, - const ChunkId data_chunk_id); + const uint32_t size_chunk_id, + const uint32_t data_chunk_id); // Writes a value or an array of values into the file via // the internal buffer. template void write_chunk( - const ChunkId chunk_id, + const uint32_t chunk_id, const TSrc& src_value); // Writes an array of values with specified count into // the file via the internal buffer. template void write_chunk( - const ChunkId chunk_id, + const uint32_t chunk_id, const TSrc* src_values, int src_count); - - // Reads a raw data from the internal buffer. - virtual void raw_read( - void* dst_data, - int dst_size) = 0; - // Reads a value or array of values from the internal buffer. template void read( @@ -117,11 +78,6 @@ class ISavedGame TDst& dst_value); - // Writes a raw data into the internal buffer. - virtual void raw_write( - const void* src_data, - int src_size) = 0; - // Writes a value or array of values into the internal buffer. template void write( @@ -134,71 +90,19 @@ class ISavedGame int src_count); - // Increments buffer's offset by the specified non-negative count. - virtual void skip( - int count) = 0; - - - // Stores current I/O buffer and it's position. - virtual void save_buffer() = 0; - - // Restores saved I/O buffer and it's position. - virtual void load_buffer() = 0; +private: + ISavedGameStream* saved_game_stream_; - // Returns a pointer to data in the I/O buffer. - virtual const void* get_buffer_data() const = 0; - // Returns a current size of the I/O buffer. - virtual int get_buffer_size() const = 0; - - - // Clears buffer and resets it's offset to the beginning. - virtual void reset_buffer() = 0; - - // Resets buffer offset to the beginning. - virtual void reset_buffer_offset() = 0; - - -protected: // Tags for dispatching. - class BooleanTag - { - public: - }; - class NumericTag - { - public: - }; - class PointerTag - { - public: - }; - class ClassTag - { - public: - }; - class Array1dTag - { - public: - }; - class Array2dTag - { - public: - }; - class InplaceTag - { - public: - }; - class CastTag - { - public: - }; - - - // If true won't throw an exception when buffer offset is beyond it's size. - // Although, no data will be read beyond the buffer. - virtual void allow_read_overflow( - bool value) = 0; + class BooleanTag { public: }; + class NumericTag { public: }; + class PointerTag { public: }; + class ClassTag { public: }; + class Array1dTag { public: }; + class Array2dTag { public: }; + class InplaceTag { public: }; + class CastTag { public: }; template @@ -282,10 +186,11 @@ class ISavedGame const TSrc* src_values, int src_count, CastTag); -}; // ISavedGame +}; // SavedGameStreamHelper + +} -} // ojk +#endif // OJK_SAVED_GAME_STREAM_HELPER_FWD_INCLUDED -#endif // OJK_I_SAVED_GAME_FWD_INCLUDED From 83d3b79baa44b1697f14d8720f126753a693bdf7 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sat, 6 Aug 2016 14:05:39 +0100 Subject: [PATCH 291/445] Fix VS2013 build VS2013 doesn't understand the 'inline' keyword when compiling C files. --- shared/qcommon/q_platform.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/shared/qcommon/q_platform.h b/shared/qcommon/q_platform.h index d44afa50dd..325d666c50 100644 --- a/shared/qcommon/q_platform.h +++ b/shared/qcommon/q_platform.h @@ -252,12 +252,12 @@ static inline uint32_t LongSwap(uint32_t v) // required for _byteswap_ushort/ulong #include -static inline uint16_t ShortSwap(uint16_t v) +static uint16_t ShortSwap(uint16_t v) { return _byteswap_ushort(v); } -static inline uint32_t LongSwap(uint32_t v) +static uint32_t LongSwap(uint32_t v) { return _byteswap_ulong(v); } @@ -279,17 +279,17 @@ static inline uint32_t LongSwap(uint32_t v) } #endif -static inline void CopyShortSwap( void *dest, const void *src ) +static void CopyShortSwap( void *dest, const void *src ) { *(uint16_t*)dest = ShortSwap(*(uint16_t*)src); } -static inline void CopyLongSwap( void *dest, const void *src ) +static void CopyLongSwap( void *dest, const void *src ) { *(uint32_t*)dest = LongSwap(*(uint32_t*)src); } -static inline float FloatSwap(float f) +static float FloatSwap(float f) { float out; CopyLongSwap(&out, &f); From fecff2e8baa53afada3194fa7533e87d08e72b72 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 6 Aug 2016 20:24:49 +0300 Subject: [PATCH 292/445] Revise saved game classes --- code/CMakeLists.txt | 6 +- code/game/CMakeLists.txt | 6 +- code/rd-vanilla/CMakeLists.txt | 6 +- codeJK2/game/CMakeLists.txt | 6 +- shared/qcommon/ojk_i_saved_game_file.h | 101 ++++++ shared/qcommon/ojk_i_saved_game_stream.h | 103 ------ shared/qcommon/ojk_saved_game_file.cpp | 302 +++++++++++------- shared/qcommon/ojk_saved_game_file.h | 66 ++-- ..._helper.h => ojk_saved_game_file_helper.h} | 273 +++++++++------- ...fwd.h => ojk_saved_game_file_helper_fwd.h} | 81 +++-- 10 files changed, 548 insertions(+), 402 deletions(-) create mode 100644 shared/qcommon/ojk_i_saved_game_file.h delete mode 100644 shared/qcommon/ojk_i_saved_game_stream.h rename shared/qcommon/{ojk_saved_game_stream_helper.h => ojk_saved_game_file_helper.h} (74%) rename shared/qcommon/{ojk_saved_game_stream_helper_fwd.h => ojk_saved_game_file_helper_fwd.h} (71%) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index db03e34679..43d9542fec 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -178,11 +178,11 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SharedDir}/qcommon/ojk_exception.cpp" "${SharedDir}/qcommon/ojk_saved_game_exception.h" "${SharedDir}/qcommon/ojk_saved_game_exception.cpp" - "${SharedDir}/qcommon/ojk_i_saved_game_stream.h" + "${SharedDir}/qcommon/ojk_i_saved_game_file.h" "${SharedDir}/qcommon/ojk_saved_game_file.h" "${SharedDir}/qcommon/ojk_saved_game_file.cpp" - "${SharedDir}/qcommon/ojk_saved_game_stream_helper.h" - "${SharedDir}/qcommon/ojk_saved_game_stream_helper_fwd.h" + "${SharedDir}/qcommon/ojk_saved_game_file_helper.h" + "${SharedDir}/qcommon/ojk_saved_game_file_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index df94c7ee56..bdafd86b90 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -261,11 +261,11 @@ set(SPGameCommonFiles "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SPDir}/rd-common/mdx_format.h" - "${SharedDir}/qcommon/ojk_i_saved_game_stream.h" + "${SharedDir}/qcommon/ojk_i_saved_game_file.h" "${SharedDir}/qcommon/ojk_saved_game_file.h" "${SharedDir}/qcommon/ojk_saved_game_file.cpp" - "${SharedDir}/qcommon/ojk_saved_game_stream_helper.h" - "${SharedDir}/qcommon/ojk_saved_game_stream_helper_fwd.h" + "${SharedDir}/qcommon/ojk_saved_game_file_helper.h" + "${SharedDir}/qcommon/ojk_saved_game_file_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index dd4e50b7ef..c3025e2ea3 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -78,11 +78,11 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" - "${SharedDir}/qcommon/ojk_i_saved_game_stream.h" + "${SharedDir}/qcommon/ojk_i_saved_game_file.h" "${SharedDir}/qcommon/ojk_saved_game_file.h" "${SharedDir}/qcommon/ojk_saved_game_file.cpp" - "${SharedDir}/qcommon/ojk_saved_game_stream_helper.h" - "${SharedDir}/qcommon/ojk_saved_game_stream_helper_fwd.h" + "${SharedDir}/qcommon/ojk_saved_game_file_helper.h" + "${SharedDir}/qcommon/ojk_saved_game_file_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index 4ddfdaf34e..605cec68fe 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -233,11 +233,11 @@ set(JK2SPGameCommonFiles "${SPDir}/qcommon/q_shared.h" "${SPDir}/qcommon/strippublic.h" "${SPDir}/rd-common/mdx_format.h" - "${SharedDir}/qcommon/ojk_i_saved_game_stream.h" + "${SharedDir}/qcommon/ojk_i_saved_game_file.h" "${SharedDir}/qcommon/ojk_saved_game_file.h" "${SharedDir}/qcommon/ojk_saved_game_file.cpp" - "${SharedDir}/qcommon/ojk_saved_game_stream_helper.h" - "${SharedDir}/qcommon/ojk_saved_game_stream_helper_fwd.h" + "${SharedDir}/qcommon/ojk_saved_game_file_helper.h" + "${SharedDir}/qcommon/ojk_saved_game_file_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) diff --git a/shared/qcommon/ojk_i_saved_game_file.h b/shared/qcommon/ojk_i_saved_game_file.h new file mode 100644 index 0000000000..73f5b70093 --- /dev/null +++ b/shared/qcommon/ojk_i_saved_game_file.h @@ -0,0 +1,101 @@ +// +// Saved game file interface. +// + + +#ifndef OJK_I_SAVED_GAME_FILE_INCLUDED +#define OJK_I_SAVED_GAME_FILE_INCLUDED + + +#include + + +namespace ojk +{ + + +class ISavedGameFile +{ +public: + ISavedGameFile() + { + } + + ISavedGameFile( + const ISavedGameFile& that) = delete; + + ISavedGameFile& operator=( + const ISavedGameFile& that) = delete; + + virtual ~ISavedGameFile() + { + } + + + // Tries to reads a chunk from the file into the internal buffer. + virtual bool read_chunk( + const uint32_t chunk_id) = 0; + + // Returns true if all data read from the internal buffer. + virtual bool is_all_data_read() const = 0; + + // Calls error method if all data not read from the internal buffer. + virtual void ensure_all_data_read() = 0; + + + // Writes a chunk into the file from the internal buffer. + virtual bool write_chunk( + const uint32_t chunk_id) = 0; + + + // Reads data from the internal buffer. + virtual bool read( + void* dst_data, + int dst_size) = 0; + + // Writes data into the internal buffer. + virtual bool write( + const void* src_data, + int src_size) = 0; + + // Increments buffer's offset by the specified non-negative count. + virtual bool skip( + int count) = 0; + + + // Stores current I/O buffer and it's position. + virtual void save_buffer() = 0; + + // Restores saved I/O buffer and it's position. + virtual void load_buffer() = 0; + + // Returns a pointer to data in the I/O buffer. + virtual const void* get_buffer_data() const = 0; + + // Returns a current size of the I/O buffer. + virtual int get_buffer_size() const = 0; + + + // Clears buffer and resets it's offset to the beginning. + virtual void reset_buffer() = 0; + + // Resets buffer offset to the beginning. + virtual void reset_buffer_offset() = 0; + + + // Error flag. + // Returns true if read/write operation failed otherwise false. + virtual bool is_failed() const = 0; + + // Clears error flag and message. + virtual void clear_error() = 0; + + // Calls Com_Error with last error message or with a generic one. + virtual void throw_error() = 0; +}; // ISavedGameFile + + +} // ojk + + +#endif // OJK_I_SAVED_GAME_FILE_INCLUDED diff --git a/shared/qcommon/ojk_i_saved_game_stream.h b/shared/qcommon/ojk_i_saved_game_stream.h deleted file mode 100644 index 4c6a6bfb9a..0000000000 --- a/shared/qcommon/ojk_i_saved_game_stream.h +++ /dev/null @@ -1,103 +0,0 @@ -// -// Saved game stream interface. -// - - -#ifndef OJK_I_SAVED_GAME_STREAM_INCLUDED -#define OJK_I_SAVED_GAME_STREAM_INCLUDED - - -#include - - -namespace ojk -{ - - -class ISavedGameStream -{ -public: - ISavedGameStream() - { - } - - ISavedGameStream( - const ISavedGameStream& that) = delete; - - ISavedGameStream& operator=( - const ISavedGameStream& that) = delete; - - virtual ~ISavedGameStream() - { - } - - - // Returns true if the saved game opened for reading. - virtual bool is_readable() const = 0; - - // Returns true if the saved game opened for writing. - virtual bool is_writable() const = 0; - - - // Reads a chunk from the file into the internal buffer. - virtual void read_chunk( - const uint32_t chunk_id) = 0; - - // Returns true if all data read from the internal buffer. - virtual bool is_all_data_read() const = 0; - - // Throws an exception if all data not read. - virtual void ensure_all_data_read() const = 0; - - - // Writes a chunk into the file from the internal buffer. - virtual void write_chunk( - const uint32_t chunk_id) = 0; - - - // Reads a raw data from the internal buffer. - virtual void read( - void* dst_data, - int dst_size) = 0; - - // Writes a raw data into the internal buffer. - virtual void write( - const void* src_data, - int src_size) = 0; - - // Increments buffer's offset by the specified non-negative count. - virtual void skip( - int count) = 0; - - - // Stores current I/O buffer and it's position. - virtual void save_buffer() = 0; - - // Restores saved I/O buffer and it's position. - virtual void load_buffer() = 0; - - // Returns a pointer to data in the I/O buffer. - virtual const void* get_buffer_data() const = 0; - - // Returns a current size of the I/O buffer. - virtual int get_buffer_size() const = 0; - - - // Clears buffer and resets it's offset to the beginning. - virtual void reset_buffer() = 0; - - // Resets buffer offset to the beginning. - virtual void reset_buffer_offset() = 0; - - - // If true won't throw an exception when buffer offset is beyond it's size. - // Although, no data will be read beyond the buffer. - virtual void allow_read_overflow( - bool value) = 0; -}; // ISavedGameStream - - -} // ojk - - -#endif // OJK_I_SAVED_GAME_STREAM_INCLUDED diff --git a/shared/qcommon/ojk_saved_game_file.cpp b/shared/qcommon/ojk_saved_game_file.cpp index bcee5f74f6..e883310515 100644 --- a/shared/qcommon/ojk_saved_game_file.cpp +++ b/shared/qcommon/ojk_saved_game_file.cpp @@ -4,9 +4,8 @@ #include "ojk_saved_game_file.h" -#include "ojk_saved_game_stream_helper.h" +#include "ojk_saved_game_file_helper.h" #include -#include "ojk_saved_game_exception.h" #include "qcommon/qcommon.h" #include "server/server.h" @@ -16,6 +15,7 @@ namespace ojk SavedGameFile::SavedGameFile() : + error_message_(), file_handle_(), io_buffer_(), saved_io_buffer_(), @@ -24,8 +24,7 @@ SavedGameFile::SavedGameFile() : rle_buffer_(), is_readable_(), is_writable_(), - is_write_failed_(), - is_read_overflow_allowed_() + is_failed_() { } @@ -40,10 +39,10 @@ bool SavedGameFile::open( close(); - const auto&& file_path = generate_path( + const auto file_path = generate_path( base_file_name); - auto is_succeed = true; + bool is_succeed = true; static_cast(::FS_FOpenFileRead( file_path.c_str(), @@ -54,13 +53,13 @@ bool SavedGameFile::open( { is_succeed = false; - const auto&& error_message = + error_message_ = S_COLOR_RED "Failed to open a saved game file: \"" + file_path + "\"."; ::Com_DPrintf( "%s\n", - error_message.c_str()); + error_message_.c_str()); } if (is_succeed) @@ -68,25 +67,35 @@ bool SavedGameFile::open( is_readable_ = true; } - auto sg_version = -1; if (is_succeed) { - SavedGameStreamHelper sgsh(this); + SavedGameFileHelper sgfh( + this); + + int sg_version = -1; - static_cast(sgsh.read_chunk( + if (sgfh.try_read_chunk( INT_ID('_', 'V', 'E', 'R'), - sg_version)); + sg_version)) + { + if (sg_version != iSAVEGAME_VERSION) + { + is_succeed = false; - if (sg_version != iSAVEGAME_VERSION) + ::Com_Printf( + S_COLOR_RED "File \"%s\" has version # %d (expecting %d)\n", + base_file_name.c_str(), + sg_version, + iSAVEGAME_VERSION); + } + } + else { is_succeed = false; ::Com_Printf( - S_COLOR_RED "File \"%s\" has version # %d (expecting %d)\n", - base_file_name.c_str(), - sg_version, - iSAVEGAME_VERSION); + S_COLOR_RED "Failed to read a version.\n"); } } @@ -107,7 +116,7 @@ bool SavedGameFile::create( remove( base_file_name); - const auto&& file_path = generate_path( + const auto file_path = generate_path( base_file_name); file_handle_ = ::FS_FOpenFileWrite( @@ -115,7 +124,7 @@ bool SavedGameFile::create( if (file_handle_ == 0) { - const auto&& error_message = + const auto error_message = S_COLOR_RED "Failed to create a saved game file: \"" + file_path + "\"."; @@ -131,12 +140,18 @@ bool SavedGameFile::create( const auto sg_version = iSAVEGAME_VERSION; - SavedGameStreamHelper sgsh(this); + SavedGameFileHelper sgsh(this); sgsh.write_chunk( INT_ID('_', 'V', 'E', 'R'), sg_version); + if (is_failed()) + { + close(); + return false; + } + return true; } @@ -148,30 +163,33 @@ void SavedGameFile::close() file_handle_ = 0; } + error_message_.clear(); + io_buffer_.clear(); io_buffer_offset_ = 0; + saved_io_buffer_.clear(); + saved_io_buffer_offset_ = 0; + + rle_buffer_.clear(); + is_readable_ = false; is_writable_ = false; - is_write_failed_ = false; + is_failed_ = false; } -bool SavedGameFile::is_readable() const +bool SavedGameFile::read_chunk( + const uint32_t chunk_id) { - return is_readable_; -} + if (is_failed_) + { + return false; + } -bool SavedGameFile::is_writable() const -{ - return is_writable_; -} -void SavedGameFile::read_chunk( - const uint32_t chunk_id) -{ io_buffer_offset_ = 0; - const auto&& chunk_id_string = get_chunk_id_string( + const auto chunk_id_string = get_chunk_id_string( chunk_id); ::Com_DPrintf( @@ -191,7 +209,7 @@ void SavedGameFile::read_chunk( static_cast(sizeof(uiLoadedLength)), file_handle_); - const auto bBlockIsCompressed = (static_cast(uiLoadedLength) < 0); + const bool bBlockIsCompressed = (static_cast(uiLoadedLength) < 0); if (bBlockIsCompressed) { @@ -202,18 +220,19 @@ void SavedGameFile::read_chunk( // if (ulLoadedChid != chunk_id) { - const auto&& loaded_chunk_id_string = get_chunk_id_string( + is_failed_ = true; + + const auto loaded_chunk_id_string = get_chunk_id_string( ulLoadedChid); - const auto&& error_message = + error_message_ = "Loaded chunk ID (" + - loaded_chunk_id_string + - ") does not match requested chunk ID (" + - chunk_id_string + - ")."; + loaded_chunk_id_string + + ") does not match requested chunk ID (" + + chunk_id_string + + ")."; - throw_error( - error_message); + return false; } uint32_t uiLoadedCksum = 0; @@ -274,11 +293,12 @@ void SavedGameFile::read_chunk( if (uiLoadedMagic != get_jo_magic_value()) { - const auto&& error_message = + is_failed_ = true; + + error_message_ = "Bad saved game magic for chunk " + chunk_id_string + "."; - throw_error( - error_message); + return false; } #endif // JK2_MODE @@ -299,11 +319,12 @@ void SavedGameFile::read_chunk( if (uiLoadedCksum != uiCksum) { - const auto&& error_message = + is_failed_ = true; + + error_message_ = "Failed checksum check for chunk " + chunk_id_string + "."; - throw_error( - error_message); + return false; } // Make sure we didn't encounter any read errors... @@ -318,12 +339,15 @@ void SavedGameFile::read_chunk( #endif 0) { - const auto&& error_message = + is_failed_ = true; + + error_message_ = "Error during loading chunk " + chunk_id_string + "."; - throw_error( - error_message); + return false; } + + return true; } bool SavedGameFile::is_all_data_read() const @@ -331,19 +355,26 @@ bool SavedGameFile::is_all_data_read() const return io_buffer_.size() == io_buffer_offset_; } -void SavedGameFile::ensure_all_data_read() const +void SavedGameFile::ensure_all_data_read() { if (!is_all_data_read()) { - throw_error( - "Not all expected data read."); + error_message_ = "Not all expected data read."; + + throw_error(); } } -void SavedGameFile::write_chunk( +bool SavedGameFile::write_chunk( const uint32_t chunk_id) { - const auto&& chunk_id_string = get_chunk_id_string( + if (is_failed_) + { + return false; + } + + + const auto chunk_id_string = get_chunk_id_string( chunk_id); ::Com_DPrintf( @@ -352,7 +383,7 @@ void SavedGameFile::write_chunk( if (::sv_testsave->integer != 0) { - return; + return true; } const auto src_size = static_cast(io_buffer_.size()); @@ -435,13 +466,16 @@ void SavedGameFile::write_chunk( #endif // JK2_MODE 0) { - is_write_failed_ = true; + is_failed_ = true; + + error_message_ = "Failed to write " + chunk_id_string + " chunk."; ::Com_Printf( - S_COLOR_RED "Failed to write %s chunk\n", - chunk_id_string.c_str()); + "%s%s\n", + S_COLOR_RED, + error_message_.c_str()); - return; + return false; } } else @@ -489,91 +523,107 @@ void SavedGameFile::write_chunk( #endif // JK2_MODE 0) { - is_write_failed_ = true; + is_failed_ = true; + + error_message_ = "Failed to write " + chunk_id_string + " chunk."; ::Com_Printf( - S_COLOR_RED "Failed to write %s chunk\n", - chunk_id_string.c_str()); + "%s%s\n", + S_COLOR_RED, + error_message_.c_str()); - return; + return false; } } + + return true; } -void SavedGameFile::read( +bool SavedGameFile::read( void* dst_data, int dst_size) { + if (is_failed_) + { + return false; + } + if (!dst_data) { - throw_error( - "Null pointer."); + is_failed_ = true; + error_message_ = "Null pointer."; + return false; } if (dst_size < 0) { - throw_error( - "Negative size."); + is_failed_ = true; + error_message_ = "Negative size."; + return false; } if (!is_readable_) { - throw_error( - "Not readable."); + is_failed_ = true; + error_message_ = "Not readable."; + return false; } if (dst_size == 0) { - return; + return true; } - auto is_overflowed = ((io_buffer_offset_ + dst_size) > io_buffer_.size()); - - if (is_overflowed) + if ((io_buffer_offset_ + dst_size) > io_buffer_.size()) { - if (!is_read_overflow_allowed_) - { - throw_error( - "Not enough data."); - } + is_failed_ = true; + error_message_ = "Not enough data."; + return false; } - if (!is_overflowed) - { - std::uninitialized_copy_n( - &io_buffer_[io_buffer_offset_], - dst_size, - static_cast(dst_data)); - } + std::uninitialized_copy_n( + &io_buffer_[io_buffer_offset_], + dst_size, + static_cast(dst_data)); io_buffer_offset_ += dst_size; + + return true; } -void SavedGameFile::write( +bool SavedGameFile::write( const void* src_data, int src_size) { + if (is_failed_) + { + return false; + } + if (!src_data) { - throw_error( - "Null pointer."); + is_failed_ = true; + error_message_ = "Null pointer."; + return false; } if (src_size < 0) { - throw_error( - "Negative size."); + is_failed_ = true; + error_message_ = "Negative size."; + return false; } if (!is_writable_) { - throw_error( - "Not writable."); + is_failed_ = true; + error_message_ = "Not writable."; + return false; } if (src_size == 0) { - return; + return true; } const auto new_buffer_size = io_buffer_offset_ + src_size; @@ -587,31 +637,40 @@ void SavedGameFile::write( &io_buffer_[io_buffer_offset_]); io_buffer_offset_ = new_buffer_size; + + return true; } -bool SavedGameFile::is_write_failed() const +bool SavedGameFile::is_failed() const { - return is_write_failed_; + return is_failed_; } -void SavedGameFile::skip( +bool SavedGameFile::skip( int count) { + if (is_failed_) + { + return false; + } + if (!is_readable_ && !is_writable_) { - throw_error( - "Not open or created."); + is_failed_ = true; + error_message_ = "Not open or created."; + return false; } if (count < 0) { - throw_error( - "Negative count."); + is_failed_ = true; + error_message_ = "Negative count."; + return false; } if (count == 0) { - return; + return true; } const auto new_offset = io_buffer_offset_ + count; @@ -621,8 +680,9 @@ void SavedGameFile::skip( { if (is_readable_) { - throw_error( - "Not enough data."); + is_failed_ = true; + error_message_ = "Not enough data."; + return false; } else if (is_writable_) { @@ -635,6 +695,8 @@ void SavedGameFile::skip( } io_buffer_offset_ = new_offset; + + return true; } void SavedGameFile::save_buffer() @@ -677,7 +739,7 @@ void SavedGameFile::rename( { ::Com_Printf( S_COLOR_RED "Error during savegame-rename." - " Check \"%s\" for write-protect or disk full!\n", + " Check \"%s\" for write-protect or disk full!\n", new_path.c_str()); } } @@ -698,24 +760,30 @@ SavedGameFile& SavedGameFile::get_instance() return result; } -void SavedGameFile::allow_read_overflow( - bool value) +bool SavedGameFile::is_failed() const { - is_read_overflow_allowed_ = value; + return is_failed_; } -void SavedGameFile::throw_error( - const char* message) +void SavedGameFile::clear_error() { - throw SavedGameException( - message); + is_failed_ = false; + error_message_.clear(); } -void SavedGameFile::throw_error( - const std::string& message) +void SavedGameFile::throw_error() { - throw SavedGameException( - message); + if (error_message_.empty()) + { + error_message_ = "Generic error."; + } + + error_message_ = "SG: " + error_message_; + + ::Com_Error( + ERR_DROP, + "%s", + error_message_.c_str()); } void SavedGameFile::compress( diff --git a/shared/qcommon/ojk_saved_game_file.h b/shared/qcommon/ojk_saved_game_file.h index 1ffa06c03a..1de9c97f26 100644 --- a/shared/qcommon/ojk_saved_game_file.h +++ b/shared/qcommon/ojk_saved_game_file.h @@ -11,7 +11,7 @@ #include #include #include -#include "ojk_i_saved_game_stream.h" +#include "ojk_i_saved_game_file.h" namespace ojk @@ -19,7 +19,7 @@ namespace ojk class SavedGameFile : - public ISavedGameStream + public ISavedGameFile { public: SavedGameFile(); @@ -45,48 +45,41 @@ class SavedGameFile : void close(); - // Returns true if the saved game opened for reading. - bool is_readable() const override; - - // Returns true if the saved game opened for writing. - bool is_writable() const override; - - // Reads a chunk from the file into the internal buffer. - void read_chunk( + bool read_chunk( const uint32_t chunk_id) override; - using ISavedGameStream::read_chunk; - // Returns true if all data read from the internal buffer. bool is_all_data_read() const override; - // Throws an exception if all data not read. - void ensure_all_data_read() const override; + // Calls error method if all data not read. + void ensure_all_data_read() override; // Writes a chunk into the file from the internal buffer. - void write_chunk( + // Returns true on success or false otherwise. + bool write_chunk( const uint32_t chunk_id) override; // Reads a raw data from the internal buffer. - void read( + // Returns true on success or false otherwise. + bool read( void* dst_data, int dst_size) override; // Writes a raw data into the internal buffer. - void write( + // Returns true on success or false otherwise. + bool write( const void* src_data, int src_size) override; - bool is_write_failed() const; - // Increments buffer's offset by the specified non-negative count. - void skip( + // Returns true on success or false otherwise. + bool skip( int count) override; @@ -110,10 +103,16 @@ class SavedGameFile : // Resets buffer offset to the beginning. void reset_buffer_offset() override; - // If true won't throw an exception when buffer offset is beyond it's size. - // Although, no data will be read beyond the buffer. - void allow_read_overflow( - bool value) override; + + // Returns true if read/write operation failed otherwise false. + // Any chunk related try-method clears at the beginning this flag. + bool is_failed() const override; + + // Clears error flag and message. + void clear_error() override; + + // Calls Com_Error with last error message or with a generic one. + void throw_error() override; // Renames a saved game file. @@ -135,6 +134,9 @@ class SavedGameFile : using Paths = std::vector; + // Last error message. + std::string error_message_; + // A handle to a file. int32_t file_handle_; @@ -159,20 +161,8 @@ class SavedGameFile : // True if saved game opened for writing. bool is_writable_; - // True if any previous write operation failed. - bool is_write_failed_; - - // Controls exception throw on read overflow. - bool is_read_overflow_allowed_; - - - // Throws an exception. - static void throw_error( - const char* message); - - // Throws an exception. - static void throw_error( - const std::string& message); + // Error flag. + bool is_failed_; // Compresses data. diff --git a/shared/qcommon/ojk_saved_game_stream_helper.h b/shared/qcommon/ojk_saved_game_file_helper.h similarity index 74% rename from shared/qcommon/ojk_saved_game_stream_helper.h rename to shared/qcommon/ojk_saved_game_file_helper.h index 6af5dd05af..05fbfa0d11 100644 --- a/shared/qcommon/ojk_saved_game_stream_helper.h +++ b/shared/qcommon/ojk_saved_game_file_helper.h @@ -1,15 +1,15 @@ // -// Saved game stream helper. +// Saved game file helper. // -#ifndef OJK_SAVED_GAME_STREAM_HELPER_INCLUDED -#define OJK_SAVED_GAME_STREAM_HELPER_INCLUDED +#ifndef OJK_SAVED_GAME_FILE_HELPER_INCLUDED +#define OJK_SAVED_GAME_FILE_HELPER_INCLUDED #include #include -#include "ojk_saved_game_stream_helper_fwd.h" +#include "ojk_saved_game_file_helper_fwd.h" #include "ojk_scope_guard.h" @@ -20,9 +20,9 @@ namespace ojk // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // Class stuff -inline SavedGameStreamHelper::SavedGameStreamHelper( - ISavedGameStream* saved_game_stream) : - saved_game_stream_(saved_game_stream) +inline SavedGameFileHelper::SavedGameFileHelper( + ISavedGameFile* saved_game_file) : + saved_game_file_(saved_game_file) { } @@ -31,36 +31,61 @@ inline SavedGameStreamHelper::SavedGameStreamHelper( // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// read_chunk +// try_read_chunk template -void SavedGameStreamHelper::read_chunk( +bool SavedGameFileHelper::try_read_chunk( const uint32_t chunk_id, TDst& dst_value) { - saved_game_stream_->read_chunk( - chunk_id); + if (!saved_game_file_->read_chunk( + chunk_id);) + { + return false; + } - read( - dst_value); + if (!try_read( + dst_value)) + { + return false; + } - saved_game_stream_->ensure_all_data_read(); + return saved_game_file_->is_all_data_read(); } +// try_read_chunk +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// read_chunk + template -void SavedGameStreamHelper::read_chunk( +void SavedGameFileHelper::read_chunk( + const uint32_t chunk_id, + TDst& dst_value) +{ + if (!try_read_chunk( + chunk_id, + dst_value)) + { + saved_game_file_->throw_error(); + } +} + +template +void SavedGameFileHelper::read_chunk( const uint32_t chunk_id, TDst* dst_values, int dst_count) { - saved_game_stream_->read_chunk( - chunk_id); - - read( - dst_values, - dst_count); - - saved_game_stream_->ensure_all_data_read(); + if (!try_read_chunk( + chunk_id, + dst_value, + dst_count)) + { + saved_game_file_->throw_error(); + } } // read_chunk @@ -71,53 +96,53 @@ void SavedGameStreamHelper::read_chunk( // write_chunk template -void SavedGameStreamHelper::write_chunk_and_size( +void SavedGameFileHelper::write_chunk_and_size( const uint32_t size_chunk_id, const uint32_t data_chunk_id) { - saved_game_stream_->save_buffer(); + saved_game_file_->save_buffer(); - auto data_size = saved_game_stream_->get_buffer_size(); + auto data_size = saved_game_file_->get_buffer_size(); - saved_game_stream_->reset_buffer(); + saved_game_file_->reset_buffer(); write_chunk( size_chunk_id, data_size); - saved_game_stream_->load_buffer(); + saved_game_file_->load_buffer(); - saved_game_stream_->write_chunk( + saved_game_file_->write_chunk( data_chunk_id); } template -void SavedGameStreamHelper::write_chunk( +void SavedGameFileHelper::write_chunk( const uint32_t chunk_id, const TSrc& src_value) { - saved_game_stream_->reset_buffer(); + saved_game_file_->reset_buffer(); write( src_value); - saved_game_stream_->write_chunk( + saved_game_file_->write_chunk( chunk_id); } template -void SavedGameStreamHelper::write_chunk( +void SavedGameFileHelper::write_chunk( const uint32_t chunk_id, const TSrc* src_values, int src_count) { - saved_game_stream_->reset_buffer(); + saved_game_file_->reset_buffer(); write( src_values, src_count); - saved_game_stream_->write_chunk( + saved_game_file_->write_chunk( chunk_id); } @@ -126,10 +151,10 @@ void SavedGameStreamHelper::write_chunk( // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// read +// try_read template -void SavedGameStreamHelper::read( +bool SavedGameFileHelper::try_read( TDst& dst_value) { using Tag = typename std::conditional < @@ -162,13 +187,32 @@ void SavedGameStreamHelper::read( !std::is_same::value, "Unsupported type."); - read( + return try_read( dst_value, Tag()); } +// try_read +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// read + template -void SavedGameStreamHelper::read( +void SavedGameFileHelper::read( + TDst& dst_value) +{ + if (!try_read( + dst_value, + Tag())) + { + saved_game_file_->throw_error(); + } +} + +template +bool SavedGameFileHelper::try_read( TDst& dst_value, BooleanTag) { @@ -176,18 +220,23 @@ void SavedGameStreamHelper::read( TSrc src_value; - saved_game_stream_->read( + if (!saved_game_file_->read( &src_value, - static_cast(sizeof(TSrc))); + static_cast(sizeof(TSrc)))) + { + return false; + } // FIXME Byte order // dst_value = (src_value != 0); + + return true; } template -void SavedGameStreamHelper::read( +bool SavedGameFileHelper::try_read( TDst& dst_value, NumericTag) { @@ -195,18 +244,23 @@ void SavedGameStreamHelper::read( TSrc src_value; - saved_game_stream_->read( + if (!saved_game_file_->read( &src_value, - src_size); + src_size)) + { + return false; + } // FIXME Byte order // dst_value = static_cast(src_value); + + return true; } template -void SavedGameStreamHelper::read( +bool SavedGameFileHelper::try_read( TDst*& dst_value, PointerTag) { @@ -223,15 +277,20 @@ void SavedGameStreamHelper::read( auto dst_number = DstNumeric(); - read( + if (!try_read( dst_number, - NumericTag()); + NumericTag())) + { + return false; + } dst_value = reinterpret_cast(dst_number); + + return true; } template -void SavedGameStreamHelper::read( +bool SavedGameFileHelper::try_read( TDst& dst_value, ClassTag) { @@ -240,25 +299,27 @@ void SavedGameStreamHelper::read( "Unsupported types."); dst_value.sg_import( - saved_game_stream_); + saved_game_file_); + + return !saved_game_file_->is_failed(); } template -void SavedGameStreamHelper::read( +bool SavedGameFileHelper::try_read( TDst(&dst_values)[TCount], Array1dTag) { - read( + return try_read( &dst_values[0], TCount); } template -void SavedGameStreamHelper::read( +bool SavedGameFileHelper::try_read( TDst(&dst_values)[TCount1][TCount2], Array2dTag) { - read( + return try_read( &dst_values[0][0], TCount1 * TCount2); } @@ -268,42 +329,10 @@ void SavedGameStreamHelper::read( // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// try_read +// try_read (C-array) template -bool SavedGameStreamHelper::try_read( - TDst& dst_value) -{ - ScopeGuard scope_guard( - [saved_game_stream_]() - { - saved_game_stream_->allow_read_overflow( - true); - }, - - [saved_game_stream_]() - { - saved_game_stream_->allow_read_overflow( - false); - } - ); - - - read( - dst_value); - - return saved_game_stream_->is_all_data_read(); -} - -// try_read -// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - -// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// read (C-array) - -template -void SavedGameStreamHelper::read( +bool SavedGameFileHelper::try_read( TDst* dst_values, int dst_count) { @@ -353,30 +382,55 @@ void SavedGameStreamHelper::read( CastTag >::type; - read( + return try_read( dst_values, dst_count, Tag()); } +// try_read (C-array) +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// read (C-array) + +template +void SavedGameFileHelper::read( + TDst* dst_values, + int dst_count) +{ + if (!try_read( + dst_values, + dst_count)) + { + saved_game_file_->throw_error(); + } +} + template -void SavedGameStreamHelper::read( +bool SavedGameFileHelper::try_read( TDst* dst_values, int dst_count, InplaceTag) { const auto dst_size = dst_count * static_cast(sizeof(TDst)); - saved_game_stream_->read( + if (!saved_game_file_->read( dst_values, - dst_size); + dst_size)) + { + return false; + } // FIXME Byte order // + + return true; } template -void SavedGameStreamHelper::read( +bool SavedGameFileHelper::try_read( TDst* dst_values, int dst_count, CastTag) @@ -397,10 +451,15 @@ void SavedGameStreamHelper::read( for (int i = 0; i < dst_count; ++i) { - read( + if (!try_read( dst_values[i], - Tag()); + Tag())) + { + return false; + } } + + return true; } // read (C-array) @@ -411,7 +470,7 @@ void SavedGameStreamHelper::read( // write template -void SavedGameStreamHelper::write( +void SavedGameFileHelper::write( const TSrc& src_value) { using Tag = typename std::conditional< @@ -446,7 +505,7 @@ void SavedGameStreamHelper::write( } template -void SavedGameStreamHelper::write( +void SavedGameFileHelper::write( const TSrc& src_value, NumericTag) { @@ -457,13 +516,13 @@ void SavedGameStreamHelper::write( // FIXME Byte order // - saved_game_stream_->write( + saved_game_file_->write( &dst_value, dst_size); } template -void SavedGameStreamHelper::write( +void SavedGameFileHelper::write( const TSrc* src_value, PointerTag) { @@ -481,7 +540,7 @@ void SavedGameStreamHelper::write( } template -void SavedGameStreamHelper::write( +void SavedGameFileHelper::write( const TSrc& src_value, ClassTag) { @@ -490,11 +549,11 @@ void SavedGameStreamHelper::write( "Unsupported types."); src_value.sg_export( - saved_game_stream_); + saved_game_file_); } template -void SavedGameStreamHelper::write( +void SavedGameFileHelper::write( const TSrc(&src_values)[TCount], Array1dTag) { @@ -504,7 +563,7 @@ void SavedGameStreamHelper::write( } template -void SavedGameStreamHelper::write( +void SavedGameFileHelper::write( const TSrc(&src_values)[TCount1][TCount2], Array2dTag) { @@ -521,7 +580,7 @@ void SavedGameStreamHelper::write( // write (C-array) template -void SavedGameStreamHelper::write( +void SavedGameFileHelper::write( const TSrc* src_values, int src_count) { @@ -577,14 +636,14 @@ void SavedGameStreamHelper::write( } template -void SavedGameStreamHelper::write( +void SavedGameFileHelper::write( const TSrc* src_values, int src_count, InplaceTag) { const auto src_size = src_count * static_cast(sizeof(TSrc)); - saved_game_stream_->write( + saved_game_file_->write( src_values, src_size); @@ -593,7 +652,7 @@ void SavedGameStreamHelper::write( } template -void SavedGameStreamHelper::write( +void SavedGameFileHelper::write( const TSrc* src_values, int src_count, CastTag) @@ -627,4 +686,4 @@ void SavedGameStreamHelper::write( } // ojk -#endif // OJK_SAVED_GAME_STREAM_HELPER_INCLUDED +#endif // OJK_SAVED_GAME_FILE_HELPER_INCLUDED diff --git a/shared/qcommon/ojk_saved_game_stream_helper_fwd.h b/shared/qcommon/ojk_saved_game_file_helper_fwd.h similarity index 71% rename from shared/qcommon/ojk_saved_game_stream_helper_fwd.h rename to shared/qcommon/ojk_saved_game_file_helper_fwd.h index 63d2fe6360..fb9dfb4ca8 100644 --- a/shared/qcommon/ojk_saved_game_stream_helper_fwd.h +++ b/shared/qcommon/ojk_saved_game_file_helper_fwd.h @@ -1,29 +1,38 @@ // -// Saved game stream helper. +// Saved game file helper. // (forward declaration) // -#ifndef OJK_SAVED_GAME_STREAM_HELPER_FWD_INCLUDED -#define OJK_SAVED_GAME_STREAM_HELPER_FWD_INCLUDED +#ifndef OJK_SAVED_GAME_FILE_HELPER_FWD_INCLUDED +#define OJK_SAVED_GAME_FILE_HELPER_FWD_INCLUDED -#include "ojk_i_saved_game_stream.h" +#include "ojk_i_saved_game_file.h" namespace ojk { -class SavedGameStreamHelper +class SavedGameFileHelper { public: - SavedGameStreamHelper( - ISavedGameStream* saved_game_stream); + SavedGameFileHelper( + ISavedGameFile* saved_game_file); + // Tries to read a value or an array of values from the file via + // the internal buffer. + // Return true on success or false otherwise. + template + bool try_read_chunk( + const uint32_t chunk_id, + TDst& dst_value); + // Reads a value or an array of values from the file via // the internal buffer. + // Calls error method on error. template void read_chunk( const uint32_t chunk_id, @@ -31,6 +40,16 @@ class SavedGameStreamHelper // Reads an array of values with specified count from // the file via the internal buffer. + // Return true on success or false otherwise. + template + bool try_read_chunk( + const uint32_t chunk_id, + TDst* dst_values, + int dst_count); + + // Reads an array of values with specified count from + // the file via the internal buffer. + // Calls error method on error. template void read_chunk( const uint32_t chunk_id, @@ -59,31 +78,43 @@ class SavedGameStreamHelper const TSrc* src_values, int src_count); + + // Tries to read a value or array of values from the internal buffer. + // Returns true on success or false otherwise. + template + bool try_read( + TDst& dst_value); + // Reads a value or array of values from the internal buffer. + // Calls error method on error. template void read( TDst& dst_value); - // Reads an array of values with specificed count from the internal buffer. + // Tries to read an array of values with specificed count from the internal buffer. + // Calls error method on error. + // Return true on success or false otherwise. template - void read( + bool try_read( TDst* dst_values, int dst_count); - - // Tries to read a value or array of values from the internal buffer. - // Returns true on success or false otherwise. + // Reads an array of values with specificed count from the internal buffer. + // Calls error method on error. template - bool try_read( - TDst& dst_value); + void read( + TDst* dst_values, + int dst_count); // Writes a value or array of values into the internal buffer. + // Returns true on success or false otherwise. template void write( const TSrc& src_value); // Writes an array of values with specificed count into the internal buffer. + // Returns true on success or false otherwise. template void write( const TSrc* src_values, @@ -91,7 +122,7 @@ class SavedGameStreamHelper private: - ISavedGameStream* saved_game_stream_; + ISavedGameFile* saved_game_file_; // Tags for dispatching. @@ -106,44 +137,44 @@ class SavedGameStreamHelper template - void read( + bool try_read( TDst& dst_value, BooleanTag); template - void read( + bool try_read( TDst& dst_value, NumericTag); template - void read( + bool try_read( TDst*& dst_value, PointerTag); template - void read( + bool try_read( TDst& dst_value, ClassTag); template - void read( + bool try_read( TDst(&dst_values)[TCount], Array1dTag); template - void read( + bool try_read( TDst(&dst_values)[TCount1][TCount2], Array2dTag); template - void read( + bool try_read( TDst* dst_values, int dst_count, InplaceTag); template - void read( + bool try_read( TDst* dst_values, int dst_count, CastTag); @@ -186,11 +217,11 @@ class SavedGameStreamHelper const TSrc* src_values, int src_count, CastTag); -}; // SavedGameStreamHelper +}; // SavedGameFileHelper } -#endif // OJK_SAVED_GAME_STREAM_HELPER_FWD_INCLUDED +#endif // OJK_SAVED_GAME_FILE_HELPER_FWD_INCLUDED From b44e5ccd87d372698ded6c813aff48a1433f33ef Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 7 Aug 2016 15:10:06 +0300 Subject: [PATCH 293/445] SG: Use new classes --- code/CMakeLists.txt | 4 - code/cgame/FxScheduler.cpp | 32 +- code/cgame/FxScheduler.h | 32 +- code/cgame/cg_main.cpp | 36 +- code/client/cl_main.cpp | 4 +- code/game/CMakeLists.txt | 2 - code/game/G_Timer.cpp | 58 +- code/game/Q3_Interface.cpp | 136 +- code/game/Q3_Interface.h | 2 +- code/game/ai.h | 92 +- code/game/b_public.h | 532 +++--- code/game/bg_public.h | 52 +- code/game/g_local.h | 148 +- code/game/g_main.cpp | 46 +- code/game/g_objectives.cpp | 20 +- code/game/g_public.h | 4 +- code/game/g_roff.cpp | 50 +- code/game/g_savegame.cpp | 245 +-- code/game/g_shared.h | 1460 ++++++++--------- code/game/g_vehicles.h | 240 +-- code/game/ghoul2_shared.h | 448 ++--- code/icarus/IcarusImplementation.cpp | 80 +- code/icarus/IcarusInterface.h | 2 +- code/qcommon/cm_load.cpp | 32 +- code/qcommon/q_shared.h | 1306 +++++++-------- code/rd-common/mdx_format.h | 8 +- code/rd-common/tr_public.h | 2 +- code/rd-vanilla/CMakeLists.txt | 2 - code/rd-vanilla/G2_misc.cpp | 256 +-- code/server/sv_game.cpp | 4 +- code/server/sv_savegame.cpp | 616 +++---- codeJK2/cgame/cg_main.cpp | 32 +- codeJK2/game/CMakeLists.txt | 2 - codeJK2/game/G_Timer.cpp | 60 +- codeJK2/game/Q3_Registers.cpp | 134 +- codeJK2/game/ai.h | 92 +- codeJK2/game/anims.h | 24 +- codeJK2/game/b_public.h | 480 +++--- codeJK2/game/bg_public.h | 44 +- codeJK2/game/g_local.h | 112 +- codeJK2/game/g_main.cpp | 42 +- codeJK2/game/g_objectives.cpp | 20 +- codeJK2/game/g_public.h | 2 +- codeJK2/game/g_roff.cpp | 53 +- codeJK2/game/g_savegame.cpp | 234 +-- codeJK2/game/g_shared.h | 1416 ++++++++-------- codeJK2/icarus/Instance.cpp | 130 +- codeJK2/icarus/Sequence.cpp | 173 +- codeJK2/icarus/Sequencer.cpp | 116 +- codeJK2/icarus/TaskManager.cpp | 272 +-- codeJK2/icarus/interface.h | 2 +- shared/qcommon/ojk_exception.cpp | 30 - shared/qcommon/ojk_exception.h | 36 - shared/qcommon/ojk_saved_game_exception.cpp | 30 - shared/qcommon/ojk_saved_game_exception.h | 35 - shared/qcommon/ojk_saved_game_file.cpp | 5 - shared/qcommon/ojk_saved_game_file_helper.h | 100 +- .../qcommon/ojk_saved_game_file_helper_fwd.h | 22 + 58 files changed, 4920 insertions(+), 4729 deletions(-) delete mode 100644 shared/qcommon/ojk_exception.cpp delete mode 100644 shared/qcommon/ojk_exception.h delete mode 100644 shared/qcommon/ojk_saved_game_exception.cpp delete mode 100644 shared/qcommon/ojk_saved_game_exception.h diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 43d9542fec..4fbb89ced2 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -174,10 +174,6 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SPDir}/qcommon/timing.h" "${SPDir}/qcommon/MiniHeap.h" - "${SharedDir}/qcommon/ojk_exception.h" - "${SharedDir}/qcommon/ojk_exception.cpp" - "${SharedDir}/qcommon/ojk_saved_game_exception.h" - "${SharedDir}/qcommon/ojk_saved_game_exception.cpp" "${SharedDir}/qcommon/ojk_i_saved_game_file.h" "${SharedDir}/qcommon/ojk_saved_game_file.h" "${SharedDir}/qcommon/ojk_saved_game_file.cpp" diff --git a/code/cgame/FxScheduler.cpp b/code/cgame/FxScheduler.cpp index 083e785440..aa8d637b8f 100644 --- a/code/cgame/FxScheduler.cpp +++ b/code/cgame/FxScheduler.cpp @@ -41,7 +41,7 @@ along with this program; if not, see . #include "qcommon/safe/string.h" #include -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" CFxScheduler theFxScheduler; @@ -110,9 +110,12 @@ void CFxScheduler::LoadSave_Read() Clean(); // need to get rid of old pre-cache handles, or it thinks it has some older effects when it doesn't g_vstrEffectsNeededPerSlot.clear(); // jic - ::gi.saved_game->read_chunk( - INT_ID('F','X','L','E'), - ::gLoopedEffectArray); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('F', 'X', 'L', 'E'), + ::gLoopedEffectArray); // // now read in and re-register the effects we need for those structs... @@ -121,9 +124,9 @@ void CFxScheduler::LoadSave_Read() { char sFX_Filename[MAX_QPATH]; - ::gi.saved_game->read_chunk( - INT_ID('F','X','F','N'), - sFX_Filename); + sgfh.read_chunk( + INT_ID('F', 'X', 'F', 'N'), + sFX_Filename); g_vstrEffectsNeededPerSlot.push_back( sFX_Filename ); } @@ -131,11 +134,14 @@ void CFxScheduler::LoadSave_Read() void CFxScheduler::LoadSave_Write() { + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + // bsave the data we need... // - ::gi.saved_game->write_chunk( - INT_ID('F','X','L','E'), - mLoopedEffectArray); + sgfh.write_chunk( + INT_ID('F', 'X', 'L', 'E'), + mLoopedEffectArray); // // then cope with the fact that the mID field in each struct of the array we've just saved will not @@ -168,9 +174,9 @@ void CFxScheduler::LoadSave_Write() // write out this string... // - ::gi.saved_game->write_chunk( - INT_ID('F','X','F','N'), - sFX_Filename); + sgfh.write_chunk( + INT_ID('F', 'X', 'F', 'N'), + sFX_Filename); } } diff --git a/code/cgame/FxScheduler.h b/code/cgame/FxScheduler.h index 1025661ea5..ea7266b543 100644 --- a/code/cgame/FxScheduler.h +++ b/code/cgame/FxScheduler.h @@ -412,27 +412,27 @@ struct SLoopedEffect void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(mId); - saved_game->write(mBoltInfo); - saved_game->write(mNextTime); - saved_game->write(mLoopStopTime); - saved_game->write(mPortalEffect); - saved_game->write(mIsRelative); - saved_game->skip(2); + saved_game.write(mId); + saved_game.write(mBoltInfo); + saved_game.write(mNextTime); + saved_game.write(mLoopStopTime); + saved_game.write(mPortalEffect); + saved_game.write(mIsRelative); + saved_game.skip(2); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(mId); - saved_game->read(mBoltInfo); - saved_game->read(mNextTime); - saved_game->read(mLoopStopTime); - saved_game->read(mPortalEffect); - saved_game->read(mIsRelative); - saved_game->skip(2); + saved_game.read(mId); + saved_game.read(mBoltInfo); + saved_game.read(mNextTime); + saved_game.read(mLoopStopTime); + saved_game.read(mPortalEffect); + saved_game.read(mIsRelative); + saved_game.skip(2); } }; diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 3c335baca1..58331c757d 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -28,7 +28,7 @@ along with this program; if not, see . #include "g_local.h" #include "../qcommon/sstring.h" -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char > namePrecache_m; @@ -1905,26 +1905,32 @@ static void CG_GameStateReceived( void ) { } -void CG_WriteTheEvilCGHackStuff(void) +void CG_WriteTheEvilCGHackStuff() { - ::gi.saved_game->write_chunk( - INT_ID('F','P','S','L'), - ::cg.forcepowerSelect); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); - ::gi.saved_game->write_chunk( - INT_ID('I','V','S','L'), - ::cg.inventorySelect); + sgfh.write_chunk( + INT_ID('F', 'P', 'S', 'L'), + ::cg.forcepowerSelect); + sgfh.write_chunk( + INT_ID('I', 'V', 'S', 'L'), + ::cg.inventorySelect); } -void CG_ReadTheEvilCGHackStuff(void) + +void CG_ReadTheEvilCGHackStuff() { - ::gi.saved_game->read_chunk( - INT_ID('F','P','S','L'), - ::gi_cg_forcepowerSelect); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('F', 'P', 'S', 'L'), + ::gi_cg_forcepowerSelect); - ::gi.saved_game->read_chunk( - INT_ID('I','V','S','L'), - ::gi_cg_inventorySelect); + sgfh.read_chunk( + INT_ID('I', 'V', 'S', 'L'), + ::gi_cg_inventorySelect); gbUseTheseValuesFromLoadSave = qtrue; } diff --git a/code/client/cl_main.cpp b/code/client/cl_main.cpp index d02fe0d24c..3be1fd3c09 100644 --- a/code/client/cl_main.cpp +++ b/code/client/cl_main.cpp @@ -32,7 +32,7 @@ along with this program; if not, see . #include "../ghoul2/G2.h" #include "qcommon/stringed_ingame.h" #include "sys/sys_loadlib.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_file.h" #define RETRANSMIT_TIMEOUT 3000 // time between connection packet retransmits @@ -1181,7 +1181,7 @@ void CL_InitRef( void ) { rit.SV_PointContents = SV_PointContents; - rit.saved_game = &ojk::SavedGame::get_instance(); + rit.saved_game = &ojk::SavedGameFile::get_instance(); ret = GetRefAPI( REF_API_VERSION, &rit ); diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index bdafd86b90..9fa65ce36f 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -262,8 +262,6 @@ set(SPGameCommonFiles "${SPDir}/qcommon/q_shared.h" "${SPDir}/rd-common/mdx_format.h" "${SharedDir}/qcommon/ojk_i_saved_game_file.h" - "${SharedDir}/qcommon/ojk_saved_game_file.h" - "${SharedDir}/qcommon/ojk_saved_game_file.cpp" "${SharedDir}/qcommon/ojk_saved_game_file_helper.h" "${SharedDir}/qcommon/ojk_saved_game_file_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index c7f7b4487c..b16fabc657 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -22,7 +22,7 @@ along with this program; if not, see . #include "g_local.h" #include "../Rufl/hstring.h" -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" #define MAX_GTIMERS 16384 @@ -159,6 +159,9 @@ void TIMER_Save( void ) int j; gentity_t *ent; + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + for ( j = 0, ent = &g_entities[0]; j < MAX_GENTITIES; j++, ent++ ) { unsigned char numTimers = TIMER_GetCount(j); @@ -172,9 +175,9 @@ void TIMER_Save( void ) } //Write out the timer information - ::gi.saved_game->write_chunk( - INT_ID('T','I','M','E'), - numTimers); + sgfh.write_chunk( + INT_ID('T', 'I', 'M', 'E'), + numTimers); gtimer_t *p = g_timers[j]; assert ((numTimers && p) || (!numTimers && !p)); @@ -188,15 +191,15 @@ void TIMER_Save( void ) assert( length < 1024 );//This will cause problems when loading the timer if longer //Write out the id string - ::gi.saved_game->write_chunk( - INT_ID('T','M','I','D'), - timerID, - length); + sgfh.write_chunk( + INT_ID('T', 'M', 'I', 'D'), + timerID, + length); //Write out the timer data - ::gi.saved_game->write_chunk( - INT_ID('T','D','T','A'), - time); + sgfh.write_chunk( + INT_ID('T', 'D', 'T', 'A'), + time); p = p->next; } @@ -214,13 +217,16 @@ void TIMER_Load( void ) int j; gentity_t *ent; + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + for ( j = 0, ent = &g_entities[0]; j < MAX_GENTITIES; j++, ent++ ) { unsigned char numTimers; - ::gi.saved_game->read_chunk( - INT_ID('T','I','M','E'), - numTimers); + sgfh.read_chunk( + INT_ID('T', 'I', 'M', 'E'), + numTimers); //Read back all entries for ( int i = 0; i < numTimers; i++ ) @@ -231,24 +237,24 @@ void TIMER_Load( void ) assert (sizeof(g_timers[0]->time) == sizeof(time) );//make sure we're reading the same size as we wrote //Read the id string and time - ::gi.saved_game->read_chunk( - INT_ID('T','M','I','D')); + sgfh.read_chunk( + INT_ID('T', 'M', 'I', 'D')); - auto sg_buffer_data = static_cast( - ::gi.saved_game->get_buffer_data()); + auto sg_buffer_data = static_cast( + sgfh.get_buffer_data()); - const auto sg_buffer_size = ::gi.saved_game->get_buffer_size(); + const auto sg_buffer_size = sgfh.get_buffer_size(); - std::uninitialized_copy_n( - sg_buffer_data, - sg_buffer_size, - tempBuffer); + std::uninitialized_copy_n( + sg_buffer_data, + sg_buffer_size, + tempBuffer); tempBuffer[sg_buffer_size] = '\0'; - ::gi.saved_game->read_chunk( - INT_ID('T','D','T','A'), - time); + sgfh.read_chunk( + INT_ID('T', 'D', 'T', 'A'), + time); //this is odd, we saved all the timers in the autosave, but not all the ents are spawned yet from an auto load, so skip it if (ent->inuse) diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 29d659e8cf..d8b9ae4242 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -40,7 +40,7 @@ along with this program; if not, see . #include "wp_saber.h" #include "g_vehicles.h" #include "g_navigator.h" -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" extern cvar_t *com_buildScript; @@ -7208,9 +7208,12 @@ void CQuake3GameInterface::VariableSaveFloats( varFloat_m &fmap ) { int numFloats = fmap.size(); - ::gi.saved_game->write_chunk( - INT_ID('F','V','A','R'), - numFloats); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.write_chunk( + INT_ID('F', 'V', 'A', 'R'), + numFloats); varFloat_m::iterator vfi; STL_ITERATE( vfi, fmap ) @@ -7219,19 +7222,19 @@ void CQuake3GameInterface::VariableSaveFloats( varFloat_m &fmap ) int idSize = strlen( ((*vfi).first).c_str() ); //Save out the real data - ::gi.saved_game->write_chunk( - INT_ID('F','I','D','L'), - idSize); + sgfh.write_chunk( + INT_ID('F', 'I', 'D', 'L'), + idSize); - ::gi.saved_game->write_chunk( - INT_ID('F','I','D','S'), - ((*vfi).first).c_str(), - idSize); + sgfh.write_chunk( + INT_ID('F', 'I', 'D', 'S'), + ((*vfi).first).c_str(), + idSize); //Save out the float value - ::gi.saved_game->write_chunk( - INT_ID('F','V','A','L'), - (*vfi).second); + sgfh.write_chunk( + INT_ID('F', 'V', 'A', 'L'), + (*vfi).second); } } @@ -7245,9 +7248,12 @@ void CQuake3GameInterface::VariableSaveStrings( varString_m &smap ) { int numStrings = smap.size(); - ::gi.saved_game->write_chunk( - INT_ID('S','V','A','R'), - numStrings); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.write_chunk( + INT_ID('S', 'V', 'A', 'R'), + numStrings); varString_m::iterator vsi; STL_ITERATE( vsi, smap ) @@ -7256,26 +7262,26 @@ void CQuake3GameInterface::VariableSaveStrings( varString_m &smap ) int idSize = strlen( ((*vsi).first).c_str() ); //Save out the real data - ::gi.saved_game->write_chunk( - INT_ID('S','I','D','L'), - idSize); + sgfh.write_chunk( + INT_ID('S', 'I', 'D', 'L'), + idSize); - ::gi.saved_game->write_chunk( - INT_ID('S','I','D','S'), - ((*vsi).first).c_str(), - idSize); + sgfh.write_chunk( + INT_ID('S', 'I', 'D', 'S'), + ((*vsi).first).c_str(), + idSize); //Save out the string value idSize = strlen( ((*vsi).second).c_str() ); - ::gi.saved_game->write_chunk( - INT_ID('S','V','S','Z'), - idSize); + sgfh.write_chunk( + INT_ID('S', 'V', 'S', 'Z'), + idSize); - ::gi.saved_game->write_chunk( - INT_ID('S','V','A','L'), - ((*vsi).second).c_str(), - idSize); + sgfh.write_chunk( + INT_ID('S', 'V', 'A', 'L'), + ((*vsi).second).c_str(), + idSize); } } @@ -7305,30 +7311,33 @@ void CQuake3GameInterface::VariableLoadFloats( varFloat_m &fmap ) int numFloats; char tempBuffer[1024]; - ::gi.saved_game->read_chunk( - INT_ID('F','V','A','R'), - numFloats); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('F', 'V', 'A', 'R'), + numFloats); for ( int i = 0; i < numFloats; i++ ) { int idSize; - ::gi.saved_game->read_chunk( - INT_ID('F','I','D','L'), - idSize); + sgfh.read_chunk( + INT_ID('F', 'I', 'D', 'L'), + idSize); - ::gi.saved_game->read_chunk( - INT_ID('F','I','D','S'), - tempBuffer, - idSize); + sgfh.read_chunk( + INT_ID('F', 'I', 'D', 'S'), + tempBuffer, + idSize); tempBuffer[ idSize ] = 0; float val; - ::gi.saved_game->read_chunk( - INT_ID('F','V','A','L'), - val); + sgfh.read_chunk( + INT_ID('F', 'V', 'A', 'L'), + val); DeclareVariable( TK_FLOAT, (const char *) &tempBuffer ); SetFloatVariable( (const char *) &tempBuffer, val ); @@ -7347,33 +7356,36 @@ void CQuake3GameInterface::VariableLoadStrings( int type, varString_m &fmap ) char tempBuffer[1024]; char tempBuffer2[1024]; - ::gi.saved_game->read_chunk( - INT_ID('S','V','A','R'), - numFloats); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('S', 'V', 'A', 'R'), + numFloats); for ( int i = 0; i < numFloats; i++ ) { int idSize; - ::gi.saved_game->read_chunk( - INT_ID('S','I','D','L'), - idSize); + sgfh.read_chunk( + INT_ID('S', 'I', 'D', 'L'), + idSize); - ::gi.saved_game->read_chunk( - INT_ID('S','I','D','S'), - tempBuffer, - idSize); + sgfh.read_chunk( + INT_ID('S', 'I', 'D', 'S'), + tempBuffer, + idSize); tempBuffer[ idSize ] = 0; - ::gi.saved_game->read_chunk( - INT_ID('S','V','S','Z'), - idSize); + sgfh.read_chunk( + INT_ID('S', 'V', 'S', 'Z'), + idSize); - ::gi.saved_game->read_chunk( - INT_ID('S','V','A','L'), - tempBuffer2, - idSize); + sgfh.read_chunk( + INT_ID('S', 'V', 'A', 'L'), + tempBuffer2, + idSize); tempBuffer2[ idSize ] = 0; @@ -11154,7 +11166,7 @@ void CQuake3GameInterface::FreeVariable( const char *name ) } //Save / Load functions -ojk::ISavedGame* CQuake3GameInterface::get_saved_game() +ojk::ISavedGameFile* CQuake3GameInterface::get_saved_game_file() { return ::gi.saved_game; } diff --git a/code/game/Q3_Interface.h b/code/game/Q3_Interface.h index ff2e22ab6d..1f36f135cd 100644 --- a/code/game/Q3_Interface.h +++ b/code/game/Q3_Interface.h @@ -699,7 +699,7 @@ class CQuake3GameInterface : public IGameInterface //Save / Load functions int LinkGame( int entID, int icarusID ); - ojk::ISavedGame* get_saved_game() override; + ojk::ISavedGameFile* get_saved_game_file() override; // Access functions int CreateIcarus( int entID); diff --git a/code/game/ai.h b/code/game/ai.h index 672a5f588b..b7739de2f9 100644 --- a/code/game/ai.h +++ b/code/game/ai.h @@ -125,21 +125,21 @@ class AIGroupMember_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(number); - saved_game->write(waypoint); - saved_game->write(pathCostToEnemy); - saved_game->write(closestBuddy); + saved_game.write(number); + saved_game.write(waypoint); + saved_game.write(pathCostToEnemy); + saved_game.write(closestBuddy); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(number); - saved_game->read(waypoint); - saved_game->read(pathCostToEnemy); - saved_game->read(closestBuddy); + saved_game.read(number); + saved_game.read(waypoint); + saved_game.read(pathCostToEnemy); + saved_game.read(closestBuddy); } }; // AIGroupMember_t @@ -168,47 +168,47 @@ class AIGroupInfo_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(numGroup); - saved_game->write(processed); - saved_game->write(team); - saved_game->write(enemy); - saved_game->write(enemyWP); - saved_game->write(speechDebounceTime); - saved_game->write(lastClearShotTime); - saved_game->write(lastSeenEnemyTime); - saved_game->write(morale); - saved_game->write(moraleAdjust); - saved_game->write(moraleDebounce); - saved_game->write(memberValidateTime); - saved_game->write(activeMemberNum); - saved_game->write(commander); - saved_game->write(enemyLastSeenPos); - saved_game->write(numState); - saved_game->write<>(member); + saved_game.write(numGroup); + saved_game.write(processed); + saved_game.write(team); + saved_game.write(enemy); + saved_game.write(enemyWP); + saved_game.write(speechDebounceTime); + saved_game.write(lastClearShotTime); + saved_game.write(lastSeenEnemyTime); + saved_game.write(morale); + saved_game.write(moraleAdjust); + saved_game.write(moraleDebounce); + saved_game.write(memberValidateTime); + saved_game.write(activeMemberNum); + saved_game.write(commander); + saved_game.write(enemyLastSeenPos); + saved_game.write(numState); + saved_game.write<>(member); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(numGroup); - saved_game->read(processed); - saved_game->read(team); - saved_game->read(enemy); - saved_game->read(enemyWP); - saved_game->read(speechDebounceTime); - saved_game->read(lastClearShotTime); - saved_game->read(lastSeenEnemyTime); - saved_game->read(morale); - saved_game->read(moraleAdjust); - saved_game->read(moraleDebounce); - saved_game->read(memberValidateTime); - saved_game->read(activeMemberNum); - saved_game->read(commander); - saved_game->read(enemyLastSeenPos); - saved_game->read(numState); - saved_game->read<>(member); + saved_game.read(numGroup); + saved_game.read(processed); + saved_game.read(team); + saved_game.read(enemy); + saved_game.read(enemyWP); + saved_game.read(speechDebounceTime); + saved_game.read(lastClearShotTime); + saved_game.read(lastSeenEnemyTime); + saved_game.read(morale); + saved_game.read(moraleAdjust); + saved_game.read(moraleDebounce); + saved_game.read(memberValidateTime); + saved_game.read(activeMemberNum); + saved_game.read(commander); + saved_game.read(enemyLastSeenPos); + saved_game.read(numState); + saved_game.read<>(member); } }; // AIGroupInfo_t diff --git a/code/game/b_public.h b/code/game/b_public.h index 590dce55e6..d8d7971ad3 100644 --- a/code/game/b_public.h +++ b/code/game/b_public.h @@ -159,49 +159,49 @@ class gNPCstats_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(aggression); - saved_game->write(aim); - saved_game->write(earshot); - saved_game->write(evasion); - saved_game->write(hfov); - saved_game->write(intelligence); - saved_game->write(move); - saved_game->write(reactions); - saved_game->write(shootDistance); - saved_game->write(vfov); - saved_game->write(vigilance); - saved_game->write(visrange); - saved_game->write(runSpeed); - saved_game->write(walkSpeed); - saved_game->write(yawSpeed); - saved_game->write(health); - saved_game->write(acceleration); - saved_game->write(sex); + saved_game.write(aggression); + saved_game.write(aim); + saved_game.write(earshot); + saved_game.write(evasion); + saved_game.write(hfov); + saved_game.write(intelligence); + saved_game.write(move); + saved_game.write(reactions); + saved_game.write(shootDistance); + saved_game.write(vfov); + saved_game.write(vigilance); + saved_game.write(visrange); + saved_game.write(runSpeed); + saved_game.write(walkSpeed); + saved_game.write(yawSpeed); + saved_game.write(health); + saved_game.write(acceleration); + saved_game.write(sex); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(aggression); - saved_game->read(aim); - saved_game->read(earshot); - saved_game->read(evasion); - saved_game->read(hfov); - saved_game->read(intelligence); - saved_game->read(move); - saved_game->read(reactions); - saved_game->read(shootDistance); - saved_game->read(vfov); - saved_game->read(vigilance); - saved_game->read(visrange); - saved_game->read(runSpeed); - saved_game->read(walkSpeed); - saved_game->read(yawSpeed); - saved_game->read(health); - saved_game->read(acceleration); - saved_game->read(sex); + saved_game.read(aggression); + saved_game.read(aim); + saved_game.read(earshot); + saved_game.read(evasion); + saved_game.read(hfov); + saved_game.read(intelligence); + saved_game.read(move); + saved_game.read(reactions); + saved_game.read(shootDistance); + saved_game.read(vfov); + saved_game.read(vigilance); + saved_game.read(visrange); + saved_game.read(runSpeed); + saved_game.read(walkSpeed); + saved_game.read(yawSpeed); + saved_game.read(health); + saved_game.read(acceleration); + saved_game.read(sex); } }; // gNPCstats_t @@ -384,247 +384,247 @@ class gNPC_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(timeOfDeath); - saved_game->write(touchedByPlayer); - saved_game->write(enemyLastVisibility); - saved_game->write(aimTime); - saved_game->write(desiredYaw); - saved_game->write(desiredPitch); - saved_game->write(lockedDesiredYaw); - saved_game->write(lockedDesiredPitch); - saved_game->write(aimingBeam); - saved_game->write(enemyLastSeenLocation); - saved_game->write(enemyLastSeenTime); - saved_game->write(enemyLastHeardLocation); - saved_game->write(enemyLastHeardTime); - saved_game->write(lastAlertID); - saved_game->write(eFlags); - saved_game->write(aiFlags); - saved_game->write(currentAmmo); - saved_game->write(shotTime); - saved_game->write(burstCount); - saved_game->write(burstMin); + saved_game.write(timeOfDeath); + saved_game.write(touchedByPlayer); + saved_game.write(enemyLastVisibility); + saved_game.write(aimTime); + saved_game.write(desiredYaw); + saved_game.write(desiredPitch); + saved_game.write(lockedDesiredYaw); + saved_game.write(lockedDesiredPitch); + saved_game.write(aimingBeam); + saved_game.write(enemyLastSeenLocation); + saved_game.write(enemyLastSeenTime); + saved_game.write(enemyLastHeardLocation); + saved_game.write(enemyLastHeardTime); + saved_game.write(lastAlertID); + saved_game.write(eFlags); + saved_game.write(aiFlags); + saved_game.write(currentAmmo); + saved_game.write(shotTime); + saved_game.write(burstCount); + saved_game.write(burstMin); #ifdef BASE_SAVE_COMPAT - saved_game->write(burstMean); + saved_game.write(burstMean); #endif // BASE_SAVE_COMPAT - saved_game->write(burstMax); - saved_game->write(burstSpacing); - saved_game->write(attackHold); - saved_game->write(attackHoldTime); - saved_game->write(shootAngles); - saved_game->write(rank); - saved_game->write(behaviorState); - saved_game->write(defaultBehavior); - saved_game->write(tempBehavior); - saved_game->write(ignorePain); - saved_game->write(duckDebounceTime); - saved_game->write(walkDebounceTime); - saved_game->write(enemyCheckDebounceTime); - saved_game->write(investigateDebounceTime); - saved_game->write(investigateCount); - saved_game->write(investigateGoal); - saved_game->write(investigateSoundDebounceTime); - saved_game->write(greetingDebounceTime); - saved_game->write(eventOwner); - saved_game->write(coverTarg); - saved_game->write(jumpState); - saved_game->write(followDist); - saved_game->write(tempGoal); - saved_game->write(goalEntity); - saved_game->write(lastGoalEntity); - saved_game->write(eventualGoal); - saved_game->write(captureGoal); - saved_game->write(defendEnt); - saved_game->write(greetEnt); - saved_game->write(goalTime); - saved_game->write(straightToGoal); - saved_game->write(distToGoal); - saved_game->write(navTime); - saved_game->write(blockingEntNum); - saved_game->write(blockedSpeechDebounceTime); - saved_game->write(homeWp); - saved_game->write(avoidSide); - saved_game->write(leaderAvoidSide); - saved_game->write(lastAvoidSteerSide); - saved_game->write(lastAvoidSteerSideDebouncer); - saved_game->write(group); - saved_game->write(troop); - saved_game->write(lastPathAngles); - saved_game->write<>(stats); - saved_game->write(aimErrorDebounceTime); - saved_game->write(lastAimErrorYaw); - saved_game->write(lastAimErrorPitch); - saved_game->write(aimOfs); - saved_game->write(currentAim); - saved_game->write(currentAggression); - saved_game->write(scriptFlags); - saved_game->write(desiredSpeed); - saved_game->write(currentSpeed); - saved_game->write(last_forwardmove); - saved_game->write(last_rightmove); - saved_game->skip(2); - saved_game->write(lastClearOrigin); - saved_game->write(shoveCount); - saved_game->write(blockedDebounceTime); - saved_game->write(blockedEntity); - saved_game->write(blockedTargetPosition); - saved_game->write(blockedTargetEntity); - saved_game->write(jumpDest); - saved_game->write(jumpTarget); - saved_game->write(jumpMaxXYDist); - saved_game->write(jumpMazZDist); - saved_game->write(jumpSide); - saved_game->write(jumpTime); - saved_game->write(jumpBackupTime); - saved_game->write(jumpNextCheckTime); - saved_game->write(combatPoint); - saved_game->write(lastFailedCombatPoint); - saved_game->write(movementSpeech); - saved_game->write(movementSpeechChance); - saved_game->write(nextBStateThink); - saved_game->write<>(last_ucmd); - saved_game->write(combatMove); - saved_game->write(goalRadius); - saved_game->write(pauseTime); - saved_game->write(standTime); - saved_game->write(localState); - saved_game->write(squadState); - saved_game->write(confusionTime); - saved_game->write(charmedTime); - saved_game->write(controlledTime); - saved_game->write(surrenderTime); - saved_game->write(kneelTime); - saved_game->write(enemyLaggedPos); - saved_game->write(watchTarget); - saved_game->write(ffireCount); - saved_game->write(ffireDebounce); - saved_game->write(ffireFadeDebounce); + saved_game.write(burstMax); + saved_game.write(burstSpacing); + saved_game.write(attackHold); + saved_game.write(attackHoldTime); + saved_game.write(shootAngles); + saved_game.write(rank); + saved_game.write(behaviorState); + saved_game.write(defaultBehavior); + saved_game.write(tempBehavior); + saved_game.write(ignorePain); + saved_game.write(duckDebounceTime); + saved_game.write(walkDebounceTime); + saved_game.write(enemyCheckDebounceTime); + saved_game.write(investigateDebounceTime); + saved_game.write(investigateCount); + saved_game.write(investigateGoal); + saved_game.write(investigateSoundDebounceTime); + saved_game.write(greetingDebounceTime); + saved_game.write(eventOwner); + saved_game.write(coverTarg); + saved_game.write(jumpState); + saved_game.write(followDist); + saved_game.write(tempGoal); + saved_game.write(goalEntity); + saved_game.write(lastGoalEntity); + saved_game.write(eventualGoal); + saved_game.write(captureGoal); + saved_game.write(defendEnt); + saved_game.write(greetEnt); + saved_game.write(goalTime); + saved_game.write(straightToGoal); + saved_game.write(distToGoal); + saved_game.write(navTime); + saved_game.write(blockingEntNum); + saved_game.write(blockedSpeechDebounceTime); + saved_game.write(homeWp); + saved_game.write(avoidSide); + saved_game.write(leaderAvoidSide); + saved_game.write(lastAvoidSteerSide); + saved_game.write(lastAvoidSteerSideDebouncer); + saved_game.write(group); + saved_game.write(troop); + saved_game.write(lastPathAngles); + saved_game.write<>(stats); + saved_game.write(aimErrorDebounceTime); + saved_game.write(lastAimErrorYaw); + saved_game.write(lastAimErrorPitch); + saved_game.write(aimOfs); + saved_game.write(currentAim); + saved_game.write(currentAggression); + saved_game.write(scriptFlags); + saved_game.write(desiredSpeed); + saved_game.write(currentSpeed); + saved_game.write(last_forwardmove); + saved_game.write(last_rightmove); + saved_game.skip(2); + saved_game.write(lastClearOrigin); + saved_game.write(shoveCount); + saved_game.write(blockedDebounceTime); + saved_game.write(blockedEntity); + saved_game.write(blockedTargetPosition); + saved_game.write(blockedTargetEntity); + saved_game.write(jumpDest); + saved_game.write(jumpTarget); + saved_game.write(jumpMaxXYDist); + saved_game.write(jumpMazZDist); + saved_game.write(jumpSide); + saved_game.write(jumpTime); + saved_game.write(jumpBackupTime); + saved_game.write(jumpNextCheckTime); + saved_game.write(combatPoint); + saved_game.write(lastFailedCombatPoint); + saved_game.write(movementSpeech); + saved_game.write(movementSpeechChance); + saved_game.write(nextBStateThink); + saved_game.write<>(last_ucmd); + saved_game.write(combatMove); + saved_game.write(goalRadius); + saved_game.write(pauseTime); + saved_game.write(standTime); + saved_game.write(localState); + saved_game.write(squadState); + saved_game.write(confusionTime); + saved_game.write(charmedTime); + saved_game.write(controlledTime); + saved_game.write(surrenderTime); + saved_game.write(kneelTime); + saved_game.write(enemyLaggedPos); + saved_game.write(watchTarget); + saved_game.write(ffireCount); + saved_game.write(ffireDebounce); + saved_game.write(ffireFadeDebounce); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(timeOfDeath); - saved_game->read(touchedByPlayer); - saved_game->read(enemyLastVisibility); - saved_game->read(aimTime); - saved_game->read(desiredYaw); - saved_game->read(desiredPitch); - saved_game->read(lockedDesiredYaw); - saved_game->read(lockedDesiredPitch); - saved_game->read(aimingBeam); - saved_game->read(enemyLastSeenLocation); - saved_game->read(enemyLastSeenTime); - saved_game->read(enemyLastHeardLocation); - saved_game->read(enemyLastHeardTime); - saved_game->read(lastAlertID); - saved_game->read(eFlags); - saved_game->read(aiFlags); - saved_game->read(currentAmmo); - saved_game->read(shotTime); - saved_game->read(burstCount); - saved_game->read(burstMin); + saved_game.read(timeOfDeath); + saved_game.read(touchedByPlayer); + saved_game.read(enemyLastVisibility); + saved_game.read(aimTime); + saved_game.read(desiredYaw); + saved_game.read(desiredPitch); + saved_game.read(lockedDesiredYaw); + saved_game.read(lockedDesiredPitch); + saved_game.read(aimingBeam); + saved_game.read(enemyLastSeenLocation); + saved_game.read(enemyLastSeenTime); + saved_game.read(enemyLastHeardLocation); + saved_game.read(enemyLastHeardTime); + saved_game.read(lastAlertID); + saved_game.read(eFlags); + saved_game.read(aiFlags); + saved_game.read(currentAmmo); + saved_game.read(shotTime); + saved_game.read(burstCount); + saved_game.read(burstMin); #ifdef BASE_SAVE_COMPAT - saved_game->read(burstMean); + saved_game.read(burstMean); #endif // BASE_SAVE_COMPAT - saved_game->read(burstMax); - saved_game->read(burstSpacing); - saved_game->read(attackHold); - saved_game->read(attackHoldTime); - saved_game->read(shootAngles); - saved_game->read(rank); - saved_game->read(behaviorState); - saved_game->read(defaultBehavior); - saved_game->read(tempBehavior); - saved_game->read(ignorePain); - saved_game->read(duckDebounceTime); - saved_game->read(walkDebounceTime); - saved_game->read(enemyCheckDebounceTime); - saved_game->read(investigateDebounceTime); - saved_game->read(investigateCount); - saved_game->read(investigateGoal); - saved_game->read(investigateSoundDebounceTime); - saved_game->read(greetingDebounceTime); - saved_game->read(eventOwner); - saved_game->read(coverTarg); - saved_game->read(jumpState); - saved_game->read(followDist); - saved_game->read(tempGoal); - saved_game->read(goalEntity); - saved_game->read(lastGoalEntity); - saved_game->read(eventualGoal); - saved_game->read(captureGoal); - saved_game->read(defendEnt); - saved_game->read(greetEnt); - saved_game->read(goalTime); - saved_game->read(straightToGoal); - saved_game->read(distToGoal); - saved_game->read(navTime); - saved_game->read(blockingEntNum); - saved_game->read(blockedSpeechDebounceTime); - saved_game->read(homeWp); - saved_game->read(avoidSide); - saved_game->read(leaderAvoidSide); - saved_game->read(lastAvoidSteerSide); - saved_game->read(lastAvoidSteerSideDebouncer); - saved_game->read(group); - saved_game->read(troop); - saved_game->read(lastPathAngles); - saved_game->read<>(stats); - saved_game->read(aimErrorDebounceTime); - saved_game->read(lastAimErrorYaw); - saved_game->read(lastAimErrorPitch); - saved_game->read(aimOfs); - saved_game->read(currentAim); - saved_game->read(currentAggression); - saved_game->read(scriptFlags); - saved_game->read(desiredSpeed); - saved_game->read(currentSpeed); - saved_game->read(last_forwardmove); - saved_game->read(last_rightmove); - saved_game->skip(2); - saved_game->read(lastClearOrigin); - saved_game->read(shoveCount); - saved_game->read(blockedDebounceTime); - saved_game->read(blockedEntity); - saved_game->read(blockedTargetPosition); - saved_game->read(blockedTargetEntity); - saved_game->read(jumpDest); - saved_game->read(jumpTarget); - saved_game->read(jumpMaxXYDist); - saved_game->read(jumpMazZDist); - saved_game->read(jumpSide); - saved_game->read(jumpTime); - saved_game->read(jumpBackupTime); - saved_game->read(jumpNextCheckTime); - saved_game->read(combatPoint); - saved_game->read(lastFailedCombatPoint); - saved_game->read(movementSpeech); - saved_game->read(movementSpeechChance); - saved_game->read(nextBStateThink); - saved_game->read<>(last_ucmd); - saved_game->read(combatMove); - saved_game->read(goalRadius); - saved_game->read(pauseTime); - saved_game->read(standTime); - saved_game->read(localState); - saved_game->read(squadState); - saved_game->read(confusionTime); - saved_game->read(charmedTime); - saved_game->read(controlledTime); - saved_game->read(surrenderTime); - saved_game->read(kneelTime); - saved_game->read(enemyLaggedPos); - saved_game->read(watchTarget); - saved_game->read(ffireCount); - saved_game->read(ffireDebounce); - saved_game->read(ffireFadeDebounce); + saved_game.read(burstMax); + saved_game.read(burstSpacing); + saved_game.read(attackHold); + saved_game.read(attackHoldTime); + saved_game.read(shootAngles); + saved_game.read(rank); + saved_game.read(behaviorState); + saved_game.read(defaultBehavior); + saved_game.read(tempBehavior); + saved_game.read(ignorePain); + saved_game.read(duckDebounceTime); + saved_game.read(walkDebounceTime); + saved_game.read(enemyCheckDebounceTime); + saved_game.read(investigateDebounceTime); + saved_game.read(investigateCount); + saved_game.read(investigateGoal); + saved_game.read(investigateSoundDebounceTime); + saved_game.read(greetingDebounceTime); + saved_game.read(eventOwner); + saved_game.read(coverTarg); + saved_game.read(jumpState); + saved_game.read(followDist); + saved_game.read(tempGoal); + saved_game.read(goalEntity); + saved_game.read(lastGoalEntity); + saved_game.read(eventualGoal); + saved_game.read(captureGoal); + saved_game.read(defendEnt); + saved_game.read(greetEnt); + saved_game.read(goalTime); + saved_game.read(straightToGoal); + saved_game.read(distToGoal); + saved_game.read(navTime); + saved_game.read(blockingEntNum); + saved_game.read(blockedSpeechDebounceTime); + saved_game.read(homeWp); + saved_game.read(avoidSide); + saved_game.read(leaderAvoidSide); + saved_game.read(lastAvoidSteerSide); + saved_game.read(lastAvoidSteerSideDebouncer); + saved_game.read(group); + saved_game.read(troop); + saved_game.read(lastPathAngles); + saved_game.read<>(stats); + saved_game.read(aimErrorDebounceTime); + saved_game.read(lastAimErrorYaw); + saved_game.read(lastAimErrorPitch); + saved_game.read(aimOfs); + saved_game.read(currentAim); + saved_game.read(currentAggression); + saved_game.read(scriptFlags); + saved_game.read(desiredSpeed); + saved_game.read(currentSpeed); + saved_game.read(last_forwardmove); + saved_game.read(last_rightmove); + saved_game.skip(2); + saved_game.read(lastClearOrigin); + saved_game.read(shoveCount); + saved_game.read(blockedDebounceTime); + saved_game.read(blockedEntity); + saved_game.read(blockedTargetPosition); + saved_game.read(blockedTargetEntity); + saved_game.read(jumpDest); + saved_game.read(jumpTarget); + saved_game.read(jumpMaxXYDist); + saved_game.read(jumpMazZDist); + saved_game.read(jumpSide); + saved_game.read(jumpTime); + saved_game.read(jumpBackupTime); + saved_game.read(jumpNextCheckTime); + saved_game.read(combatPoint); + saved_game.read(lastFailedCombatPoint); + saved_game.read(movementSpeech); + saved_game.read(movementSpeechChance); + saved_game.read(nextBStateThink); + saved_game.read<>(last_ucmd); + saved_game.read(combatMove); + saved_game.read(goalRadius); + saved_game.read(pauseTime); + saved_game.read(standTime); + saved_game.read(localState); + saved_game.read(squadState); + saved_game.read(confusionTime); + saved_game.read(charmedTime); + saved_game.read(controlledTime); + saved_game.read(surrenderTime); + saved_game.read(kneelTime); + saved_game.read(enemyLaggedPos); + saved_game.read(watchTarget); + saved_game.read(ffireCount); + saved_game.read(ffireDebounce); + saved_game.read(ffireFadeDebounce); } }; // gNPC_t diff --git a/code/game/bg_public.h b/code/game/bg_public.h index e2e7b936dd..a016416c03 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -466,23 +466,23 @@ class animation_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(firstFrame); - saved_game->write(numFrames); - saved_game->write(frameLerp); - saved_game->write(loopFrames); - saved_game->write(glaIndex); + saved_game.write(firstFrame); + saved_game.write(numFrames); + saved_game.write(frameLerp); + saved_game.write(loopFrames); + saved_game.write(glaIndex); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(firstFrame); - saved_game->read(numFrames); - saved_game->read(frameLerp); - saved_game->read(loopFrames); - saved_game->read(glaIndex); + saved_game.read(firstFrame); + saved_game.read(numFrames); + saved_game.read(frameLerp); + saved_game.read(loopFrames); + saved_game.read(glaIndex); } }; // animation_t @@ -548,25 +548,25 @@ typedef struct animevent_s void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(eventType); - saved_game->write(modelOnly); - saved_game->write(glaIndex); - saved_game->write(keyFrame); - saved_game->write(eventData); - saved_game->write(stringData); + saved_game.write(eventType); + saved_game.write(modelOnly); + saved_game.write(glaIndex); + saved_game.write(keyFrame); + saved_game.write(eventData); + saved_game.write(stringData); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(eventType); - saved_game->read(modelOnly); - saved_game->read(glaIndex); - saved_game->read(keyFrame); - saved_game->read(eventData); - saved_game->read(stringData); + saved_game.read(eventType); + saved_game.read(modelOnly); + saved_game.read(glaIndex); + saved_game.read(keyFrame); + saved_game.read(eventData); + saved_game.read(stringData); } } animevent_t; diff --git a/code/game/g_local.h b/code/game/g_local.h index df0d6cc88f..2bca16fd28 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -100,27 +100,27 @@ class animFileSet_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(filename); - saved_game->write<>(animations); - saved_game->write<>(torsoAnimEvents); - saved_game->write<>(legsAnimEvents); - saved_game->write(torsoAnimEventCount); - saved_game->write(legsAnimEventCount); - saved_game->skip(2); + saved_game.write(filename); + saved_game.write<>(animations); + saved_game.write<>(torsoAnimEvents); + saved_game.write<>(legsAnimEvents); + saved_game.write(torsoAnimEventCount); + saved_game.write(legsAnimEventCount); + saved_game.skip(2); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(filename); - saved_game->read<>(animations); - saved_game->read<>(torsoAnimEvents); - saved_game->read<>(legsAnimEvents); - saved_game->read(torsoAnimEventCount); - saved_game->read(legsAnimEventCount); - saved_game->skip(2); + saved_game.read(filename); + saved_game.read<>(animations); + saved_game.read<>(torsoAnimEvents); + saved_game.read<>(legsAnimEvents); + saved_game.read(torsoAnimEventCount); + saved_game.read(legsAnimEventCount); + saved_game.skip(2); } }; // animFileSet_t @@ -187,33 +187,33 @@ class alertEvent_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(position); - saved_game->write(radius); - saved_game->write(level); - saved_game->write(type); - saved_game->write(owner); - saved_game->write(light); - saved_game->write(addLight); - saved_game->write(ID); - saved_game->write(timestamp); - saved_game->write(onGround); + saved_game.write(position); + saved_game.write(radius); + saved_game.write(level); + saved_game.write(type); + saved_game.write(owner); + saved_game.write(light); + saved_game.write(addLight); + saved_game.write(ID); + saved_game.write(timestamp); + saved_game.write(onGround); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(position); - saved_game->read(radius); - saved_game->read(level); - saved_game->read(type); - saved_game->read(owner); - saved_game->read(light); - saved_game->read(addLight); - saved_game->read(ID); - saved_game->read(timestamp); - saved_game->read(onGround); + saved_game.read(position); + saved_game.read(radius); + saved_game.read(level); + saved_game.read(type); + saved_game.read(owner); + saved_game.read(light); + saved_game.read(addLight); + saved_game.read(ID); + saved_game.read(timestamp); + saved_game.read(onGround); } }; // alertEvent_t @@ -302,47 +302,47 @@ class level_locals_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(clients); - saved_game->write(maxclients); - saved_game->write(framenum); - saved_game->write(time); - saved_game->write(previousTime); - saved_game->write(globalTime); - saved_game->write(mapname); - saved_game->write(locationLinked); - saved_game->write(locationHead); - saved_game->write<>(alertEvents); - saved_game->write(numAlertEvents); - saved_game->write(curAlertID); - saved_game->write<>(groups); - saved_game->write<>(knownAnimFileSets); - saved_game->write(numKnownAnimFileSets); - saved_game->write(worldFlags); - saved_game->write(dmState); + saved_game.write(clients); + saved_game.write(maxclients); + saved_game.write(framenum); + saved_game.write(time); + saved_game.write(previousTime); + saved_game.write(globalTime); + saved_game.write(mapname); + saved_game.write(locationLinked); + saved_game.write(locationHead); + saved_game.write<>(alertEvents); + saved_game.write(numAlertEvents); + saved_game.write(curAlertID); + saved_game.write<>(groups); + saved_game.write<>(knownAnimFileSets); + saved_game.write(numKnownAnimFileSets); + saved_game.write(worldFlags); + saved_game.write(dmState); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(clients); - saved_game->read(maxclients); - saved_game->read(framenum); - saved_game->read(time); - saved_game->read(previousTime); - saved_game->read(globalTime); - saved_game->read(mapname); - saved_game->read(locationLinked); - saved_game->read(locationHead); - saved_game->read<>(alertEvents); - saved_game->read(numAlertEvents); - saved_game->read(curAlertID); - saved_game->read<>(groups); - saved_game->read<>(knownAnimFileSets); - saved_game->read(numKnownAnimFileSets); - saved_game->read(worldFlags); - saved_game->read(dmState); + saved_game.read(clients); + saved_game.read(maxclients); + saved_game.read(framenum); + saved_game.read(time); + saved_game.read(previousTime); + saved_game.read(globalTime); + saved_game.read(mapname); + saved_game.read(locationLinked); + saved_game.read(locationHead); + saved_game.read<>(alertEvents); + saved_game.read(numAlertEvents); + saved_game.read(curAlertID); + saved_game.read<>(groups); + saved_game.read<>(knownAnimFileSets); + saved_game.read(numKnownAnimFileSets); + saved_game.read(worldFlags); + saved_game.read(dmState); } }; // level_locals_t diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 3e4f7de2ba..b6dc728f1d 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -36,7 +36,7 @@ along with this program; if not, see . #include "../ghoul2/ghoul2_gore.h" //rww - RAGDOLL_END -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" extern void WP_SaberLoadParms( void ); extern qboolean G_PlayerSpawned( void ); @@ -105,18 +105,24 @@ qboolean PInUse(unsigned int entNum) } */ -void WriteInUseBits(void) +void WriteInUseBits() { - ::gi.saved_game->write_chunk( - INT_ID('I','N','U','S'), - ::g_entityInUseBits); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.write_chunk( + INT_ID('I', 'N', 'U', 'S'), + ::g_entityInUseBits); } -void ReadInUseBits(void) +void ReadInUseBits() { - ::gi.saved_game->read_chunk( - INT_ID('I','N','U','S'), - ::g_entityInUseBits); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('I', 'N', 'U', 'S'), + ::g_entityInUseBits); // This is only temporary. Once I have converted all the ent->inuse refs, // it won;t be needed -MW. @@ -2113,20 +2119,26 @@ extern int delayedShutDown; extern qboolean player_locked; -void G_LoadSave_WriteMiscData(void) +void G_LoadSave_WriteMiscData() { - ::gi.saved_game->write_chunk( - INT_ID('L','C','K','D'), - ::player_locked); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.write_chunk( + INT_ID('L', 'C', 'K', 'D'), + ::player_locked); } -void G_LoadSave_ReadMiscData(void) +void G_LoadSave_ReadMiscData() { - ::gi.saved_game->read_chunk( - INT_ID('L','C','K','D'), - ::player_locked); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('L', 'C', 'K', 'D'), + ::player_locked); } diff --git a/code/game/g_objectives.cpp b/code/game/g_objectives.cpp index b9ced077d0..5d61462846 100644 --- a/code/game/g_objectives.cpp +++ b/code/game/g_objectives.cpp @@ -29,7 +29,7 @@ along with this program; if not, see . #define G_OBJECTIVES_CPP #include "objectives.h" -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" qboolean missionInfo_Updated; @@ -60,9 +60,12 @@ OBJ_SaveMissionObjectives */ void OBJ_SaveMissionObjectives( gclient_t *client ) { - ::gi.saved_game->write_chunk( - INT_ID('O','B','J','T'), - client->sess.mission_objectives); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.write_chunk( + INT_ID('O', 'B', 'J', 'T'), + client->sess.mission_objectives); } @@ -87,9 +90,12 @@ OBJ_LoadMissionObjectives */ void OBJ_LoadMissionObjectives( gclient_t *client ) { - ::gi.saved_game->read_chunk( - INT_ID('O','B','J','T'), - client->sess.mission_objectives); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('O', 'B', 'J', 'T'), + client->sess.mission_objectives); } diff --git a/code/game/g_public.h b/code/game/g_public.h index a69244a3eb..2051b32ea1 100644 --- a/code/game/g_public.h +++ b/code/game/g_public.h @@ -26,7 +26,7 @@ along with this program; if not, see . // g_public.h -- game module information visible to server -#include "qcommon/ojk_i_saved_game_fwd.h" +#include "qcommon/ojk_i_saved_game_file.h" #define GAME_API_VERSION 8 @@ -190,7 +190,7 @@ typedef struct { // Savegame handling // - ojk::ISavedGame* saved_game; + ojk::ISavedGameFile* saved_game; // add commands to the console as if they were typed in // for map changing, etc diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp index a8a41ef032..2c70b5f7b2 100644 --- a/code/game/g_roff.cpp +++ b/code/game/g_roff.cpp @@ -25,7 +25,7 @@ along with this program; if not, see . #include "Q3_Interface.h" #include "../cgame/cg_local.h" #include "g_functions.h" -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" // The list of precached ROFFs roff_list_t roffs[MAX_ROFFS]; @@ -651,10 +651,13 @@ void G_SaveCachedRoffs() { int i, len; + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + // Write out the number of cached ROFFs - ::gi.saved_game->write_chunk( - INT_ID('R','O','F','F'), - ::num_roffs); + sgfh.write_chunk( + INT_ID('R', 'O', 'F', 'F'), + ::num_roffs); // Now dump out the cached ROFF file names in order so they can be loaded on the other end for ( i = 0; i < num_roffs; i++ ) @@ -662,14 +665,14 @@ void G_SaveCachedRoffs() // Dump out the string length to make things a bit easier on the other end...heh heh. len = strlen( roffs[i].fileName ) + 1; - ::gi.saved_game->write_chunk( - INT_ID('S','L','E','N'), - len); + sgfh.write_chunk( + INT_ID('S', 'L', 'E', 'N'), + len); - ::gi.saved_game->write_chunk( - INT_ID('R','S','T','R'), - roffs[i].fileName, - len); + sgfh.write_chunk( + INT_ID('R', 'S', 'T', 'R'), + roffs[i].fileName, + len); } } @@ -685,22 +688,25 @@ void G_LoadCachedRoffs() int i, count, len; char buffer[MAX_QPATH]; + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + // Get the count of goodies we need to revive - ::gi.saved_game->read_chunk( - INT_ID('R','O','F','F'), - count); + sgfh.read_chunk( + INT_ID('R', 'O', 'F', 'F'), + count); // Now bring 'em back to life for ( i = 0; i < count; i++ ) { - ::gi.saved_game->read_chunk( - INT_ID('S','L','E','N'), - len); - - ::gi.saved_game->read_chunk( - INT_ID('R','S','T','R'), - buffer, - len); + sgfh.read_chunk( + INT_ID('S', 'L', 'E', 'N'), + len); + + sgfh.read_chunk( + INT_ID('R', 'S', 'T', 'R'), + buffer, + len); G_LoadRoff( buffer ); } diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index d31cbfbc33..ea5e3a925b 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -30,7 +30,7 @@ along with this program; if not, see . #include "objectives.h" #include "../cgame/cg_camera.h" #include "../qcommon/sstring.h" -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" extern void OBJ_LoadTacticalInfo(void); @@ -188,7 +188,10 @@ static char *GetStringPtr(int iStrlen, char *psOriginal/*may be NULL*/) assert(iStrlen+1<=(int)sizeof(sString)); - ::gi.saved_game->read_chunk( + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( INT_ID('S','T','R','G'), sString, iStrlen); @@ -506,42 +509,48 @@ static void EnumerateField(const save_field_t *pField, const byte *pbBase) template static void EnumerateFields( - const save_field_t* pFields, - const T* src_instance, - unsigned int ulChid) + const save_field_t* pFields, + const T* src_instance, + unsigned int ulChid) { - strList.clear(); + strList.clear(); - auto pbData = reinterpret_cast( - src_instance); + auto pbData = reinterpret_cast( + src_instance); - // enumerate all the fields... - // - if (pFields) { - for (auto pField = pFields; pField->psName; ++pField) { - assert(pField->iOffset < sizeof(T)); - ::EnumerateField(pField, pbData); - } - } + // enumerate all the fields... + // + if (pFields) + { + for (auto pField = pFields; pField->psName; ++pField) + { + assert(pField->iOffset < sizeof(T)); + ::EnumerateField(pField, pbData); + } + } - // save out raw data... - // - ::gi.saved_game->reset_buffer(); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); - src_instance->sg_export( - ::gi.saved_game); + // save out raw data... + // + sgfh.reset_buffer(); - ::gi.saved_game->write_chunk( - ulChid); + src_instance->sg_export( + sgfh); - // save out any associated strings.. - // - for (const auto& it : strList) { - ::gi.saved_game->write_chunk( - INT_ID('S', 'T', 'R', 'G'), - it.c_str(), - static_cast(it.length() + 1)); - } + sgfh.write_chunk( + ulChid); + + // save out any associated strings.. + // + for (const auto& it : strList) + { + sgfh.write_chunk( + INT_ID('S', 'T', 'R', 'G'), + it.c_str(), + static_cast(it.length() + 1)); + } } @@ -787,60 +796,58 @@ static void copy_retail_gclient_to_current( template static void EvaluateFields( - const save_field_t* pFields, - T* pbData, - byte* pbOriginalRefData, - unsigned int ulChid) + const save_field_t* pFields, + T* pbData, + byte* pbOriginalRefData, + unsigned int ulChid) { - auto& instance = *pbData; - - if (ulChid != INT_ID('G','C','L','I')) - { - ::gi.saved_game->read_chunk( - ulChid, - instance); - } - else - { - ::gi.saved_game->read_chunk( - ulChid); - - ::gi.saved_game->try_read( - instance); + auto& instance = *pbData; - if (!::gi.saved_game->is_all_data_read()) - { - RetailGClient retail_client; + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); - ::gi.saved_game->reset_buffer_offset(); + if (ulChid != INT_ID('G', 'C', 'L', 'I')) + { + sgfh.read_chunk( + ulChid, + instance); + } + else + { + if (!sgfh.try_read_chunk( + ulChid, + instance)) + { + RetailGClient retail_client; - ::gi.saved_game->try_read( - retail_client); + sgfh.reset_buffer_offset(); - if (::gi.saved_game->is_all_data_read()) - { - copy_retail_gclient_to_current( - retail_client, - *reinterpret_cast(pbData)); - } - else - { - ::G_Error( - ::va("EvaluateFields(): variable-sized chunk '%s' without handler!", - ::SG_GetChidText(ulChid))); - } - } - } + if (sgfh.try_read( + retail_client)) + { + copy_retail_gclient_to_current( + retail_client, + *reinterpret_cast(pbData)); + } + else + { + ::G_Error( + ::va("EvaluateFields(): variable-sized chunk '%s' without handler!", + ::SG_GetChidText(ulChid))); + } + } + } - if (pFields) - { - for (const save_field_t* pField = pFields; pField->psName; ++pField) { - ::EvaluateField( - pField, - reinterpret_cast(pbData), - pbOriginalRefData); - } - } + if (pFields) + { + for (const save_field_t* pField = pFields; pField->psName; ++pField) + { + ::EvaluateField( + pField, + reinterpret_cast(pbData), + pbOriginalRefData); + } + } } /* @@ -896,9 +903,12 @@ static void WriteGEntities(qboolean qbAutosave) } } - ::gi.saved_game->write_chunk( - INT_ID('N','M','E','D'), - iCount); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.write_chunk( + INT_ID('N', 'M', 'E', 'D'), + iCount); for (i=0; i<(qbAutosave?1:globals.num_entities); i++) { @@ -906,9 +916,9 @@ static void WriteGEntities(qboolean qbAutosave) if ( ent->inuse) { - ::gi.saved_game->write_chunk( - INT_ID('E','D','N','M'), - i); + sgfh.write_chunk( + INT_ID('E', 'D', 'N', 'M'), + i); qboolean qbLinked = ent->linked; gi.unlinkentity( ent ); @@ -939,9 +949,9 @@ static void WriteGEntities(qboolean qbAutosave) if (tempEnt.parms) { - ::gi.saved_game->write_chunk( - INT_ID('P','A','R','M'), - *ent->parms); + sgfh.write_chunk( + INT_ID('P', 'A', 'R', 'M'), + *ent->parms); } if (tempEnt.m_pVehicle) @@ -971,9 +981,9 @@ static void WriteGEntities(qboolean qbAutosave) // static int iBlah = 1234; - ::gi.saved_game->write_chunk( - INT_ID('I','C','O','K'), - iBlah); + sgfh.write_chunk( + INT_ID('I', 'C', 'O', 'K'), + iBlah); } if (!qbAutosave )//really shouldn't need to write these bits at all, just restore them from the ents... { @@ -986,18 +996,21 @@ static void ReadGEntities(qboolean qbAutosave) int iCount; int i; - ::gi.saved_game->read_chunk( - INT_ID('N','M','E','D'), - iCount); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('N', 'M', 'E', 'D'), + iCount); int iPreviousEntRead = -1; for (i=0; iread_chunk( - INT_ID('E','D','N','M'), - iEntIndex); + sgfh.read_chunk( + INT_ID('E', 'D', 'N', 'M'), + iEntIndex); if (iEntIndex >= globals.num_entities) { @@ -1110,9 +1123,9 @@ static void ReadGEntities(qboolean qbAutosave) { parms_t tempParms; - ::gi.saved_game->read_chunk( - INT_ID('P','A','R','M'), - tempParms); + sgfh.read_chunk( + INT_ID('P', 'A', 'R', 'M'), + tempParms); // so can we pinch the original's one or do we have to alloc a new one?... // @@ -1163,8 +1176,8 @@ static void ReadGEntities(qboolean qbAutosave) // the scary ghoul2 stuff... (fingers crossed) // { - ::gi.saved_game->read_chunk( - INT_ID('G','H','L','2')); + sgfh.read_chunk( + INT_ID('G', 'H', 'L', '2')); gi.G2API_LoadGhoul2Models(pEnt->ghoul2, nullptr); } @@ -1230,9 +1243,9 @@ static void ReadGEntities(qboolean qbAutosave) // static int iBlah = 1234; - ::gi.saved_game->read_chunk( - INT_ID('I','C','O','K'), - iBlah); + sgfh.read_chunk( + INT_ID('I', 'C', 'O', 'K'), + iBlah); } if (!qbAutosave) { @@ -1270,13 +1283,19 @@ void WriteLevel(qboolean qbAutosave) // static int iDONE = 1234; - ::gi.saved_game->write_chunk( - INT_ID('D','O','N','E'), - iDONE); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.write_chunk( + INT_ID('D', 'O', 'N', 'E'), + iDONE); } void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) { + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + if ( qbLoadTransition ) { // I STRONGLY SUSPECT THAT THIS WILL JUST ERR_DROP BECAUSE OF THE LOAD SWAPPING OF THE CHUNK-ORDER @@ -1303,8 +1322,8 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) ReadLevelLocals(); // level_locals_t level //Read & throw away objective info - ::gi.saved_game->read_chunk( - INT_ID('O','B','J','T')); + sgfh.read_chunk( + INT_ID('O', 'B', 'J', 'T')); } else { @@ -1338,9 +1357,9 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) // static int iDONE = 1234; - ::gi.saved_game->read_chunk( - INT_ID('D','O','N','E'), - iDONE); + sgfh.read_chunk( + INT_ID('D', 'O', 'N', 'E'), + iDONE); } extern int killPlayerTimer; diff --git a/code/game/g_shared.h b/code/game/g_shared.h index b4523aa96c..be3cf2e86a 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -123,47 +123,47 @@ class clientInfo_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(infoValid); - saved_game->write(name); - saved_game->write(team); - saved_game->write(score); - saved_game->write(handicap); - saved_game->write(legsModel); - saved_game->write(legsSkin); - saved_game->write(torsoModel); - saved_game->write(torsoSkin); - saved_game->write(headModel); - saved_game->write(headSkin); - saved_game->write(animFileIndex); - saved_game->write(sounds); - saved_game->write(customBasicSoundDir); - saved_game->write(customCombatSoundDir); - saved_game->write(customExtraSoundDir); - saved_game->write(customJediSoundDir); + saved_game.write(infoValid); + saved_game.write(name); + saved_game.write(team); + saved_game.write(score); + saved_game.write(handicap); + saved_game.write(legsModel); + saved_game.write(legsSkin); + saved_game.write(torsoModel); + saved_game.write(torsoSkin); + saved_game.write(headModel); + saved_game.write(headSkin); + saved_game.write(animFileIndex); + saved_game.write(sounds); + saved_game.write(customBasicSoundDir); + saved_game.write(customCombatSoundDir); + saved_game.write(customExtraSoundDir); + saved_game.write(customJediSoundDir); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(infoValid); - saved_game->read(name); - saved_game->read(team); - saved_game->read(score); - saved_game->read(handicap); - saved_game->read(legsModel); - saved_game->read(legsSkin); - saved_game->read(torsoModel); - saved_game->read(torsoSkin); - saved_game->read(headModel); - saved_game->read(headSkin); - saved_game->read(animFileIndex); - saved_game->read(sounds); - saved_game->read(customBasicSoundDir); - saved_game->read(customCombatSoundDir); - saved_game->read(customExtraSoundDir); - saved_game->read(customJediSoundDir); + saved_game.read(infoValid); + saved_game.read(name); + saved_game.read(team); + saved_game.read(score); + saved_game.read(handicap); + saved_game.read(legsModel); + saved_game.read(legsSkin); + saved_game.read(torsoModel); + saved_game.read(torsoSkin); + saved_game.read(headModel); + saved_game.read(headSkin); + saved_game.read(animFileIndex); + saved_game.read(sounds); + saved_game.read(customBasicSoundDir); + saved_game.read(customCombatSoundDir); + saved_game.read(customExtraSoundDir); + saved_game.read(customJediSoundDir); } }; // clientInfo_t @@ -290,117 +290,117 @@ class renderInfo_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(legsModelName); - saved_game->write(torsoModelName); - saved_game->write(headModelName); - saved_game->write(headYawRangeLeft); - saved_game->write(headYawRangeRight); - saved_game->write(headPitchRangeUp); - saved_game->write(headPitchRangeDown); - saved_game->write(torsoYawRangeLeft); - saved_game->write(torsoYawRangeRight); - saved_game->write(torsoPitchRangeUp); - saved_game->write(torsoPitchRangeDown); - saved_game->write(legsFrame); - saved_game->write(torsoFrame); - saved_game->write(legsFpsMod); - saved_game->write(torsoFpsMod); - saved_game->write(customRGBA); - saved_game->write(boneIndex1); - saved_game->write(boneIndex2); - saved_game->write(boneIndex3); - saved_game->write(boneIndex4); - saved_game->write(boneOrient); - saved_game->write(boneAngles1); - saved_game->write(boneAngles2); - saved_game->write(boneAngles3); - saved_game->write(boneAngles4); - saved_game->write(renderFlags); - saved_game->write(muzzlePoint); - saved_game->write(muzzleDir); - saved_game->write(muzzlePointOld); - saved_game->write(muzzleDirOld); - saved_game->write(mPCalcTime); - saved_game->write(lockYaw); - saved_game->write(headPoint); - saved_game->write(headAngles); - saved_game->write(handRPoint); - saved_game->write(handLPoint); - saved_game->write(crotchPoint); - saved_game->write(footRPoint); - saved_game->write(footLPoint); - saved_game->write(torsoPoint); - saved_game->write(torsoAngles); - saved_game->write(eyePoint); - saved_game->write(eyeAngles); - saved_game->write(lookTarget); - saved_game->write(lookMode); - saved_game->write(lookTargetClearTime); - saved_game->write(lastVoiceVolume); - saved_game->write(lastHeadAngles); - saved_game->write(headBobAngles); - saved_game->write(targetHeadBobAngles); - saved_game->write(lookingDebounceTime); - saved_game->write(legsYaw); + saved_game.write(legsModelName); + saved_game.write(torsoModelName); + saved_game.write(headModelName); + saved_game.write(headYawRangeLeft); + saved_game.write(headYawRangeRight); + saved_game.write(headPitchRangeUp); + saved_game.write(headPitchRangeDown); + saved_game.write(torsoYawRangeLeft); + saved_game.write(torsoYawRangeRight); + saved_game.write(torsoPitchRangeUp); + saved_game.write(torsoPitchRangeDown); + saved_game.write(legsFrame); + saved_game.write(torsoFrame); + saved_game.write(legsFpsMod); + saved_game.write(torsoFpsMod); + saved_game.write(customRGBA); + saved_game.write(boneIndex1); + saved_game.write(boneIndex2); + saved_game.write(boneIndex3); + saved_game.write(boneIndex4); + saved_game.write(boneOrient); + saved_game.write(boneAngles1); + saved_game.write(boneAngles2); + saved_game.write(boneAngles3); + saved_game.write(boneAngles4); + saved_game.write(renderFlags); + saved_game.write(muzzlePoint); + saved_game.write(muzzleDir); + saved_game.write(muzzlePointOld); + saved_game.write(muzzleDirOld); + saved_game.write(mPCalcTime); + saved_game.write(lockYaw); + saved_game.write(headPoint); + saved_game.write(headAngles); + saved_game.write(handRPoint); + saved_game.write(handLPoint); + saved_game.write(crotchPoint); + saved_game.write(footRPoint); + saved_game.write(footLPoint); + saved_game.write(torsoPoint); + saved_game.write(torsoAngles); + saved_game.write(eyePoint); + saved_game.write(eyeAngles); + saved_game.write(lookTarget); + saved_game.write(lookMode); + saved_game.write(lookTargetClearTime); + saved_game.write(lastVoiceVolume); + saved_game.write(lastHeadAngles); + saved_game.write(headBobAngles); + saved_game.write(targetHeadBobAngles); + saved_game.write(lookingDebounceTime); + saved_game.write(legsYaw); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(legsModelName); - saved_game->read(torsoModelName); - saved_game->read(headModelName); - saved_game->read(headYawRangeLeft); - saved_game->read(headYawRangeRight); - saved_game->read(headPitchRangeUp); - saved_game->read(headPitchRangeDown); - saved_game->read(torsoYawRangeLeft); - saved_game->read(torsoYawRangeRight); - saved_game->read(torsoPitchRangeUp); - saved_game->read(torsoPitchRangeDown); - saved_game->read(legsFrame); - saved_game->read(torsoFrame); - saved_game->read(legsFpsMod); - saved_game->read(torsoFpsMod); - saved_game->read(customRGBA); - saved_game->read(boneIndex1); - saved_game->read(boneIndex2); - saved_game->read(boneIndex3); - saved_game->read(boneIndex4); - saved_game->read(boneOrient); - saved_game->read(boneAngles1); - saved_game->read(boneAngles2); - saved_game->read(boneAngles3); - saved_game->read(boneAngles4); - saved_game->read(renderFlags); - saved_game->read(muzzlePoint); - saved_game->read(muzzleDir); - saved_game->read(muzzlePointOld); - saved_game->read(muzzleDirOld); - saved_game->read(mPCalcTime); - saved_game->read(lockYaw); - saved_game->read(headPoint); - saved_game->read(headAngles); - saved_game->read(handRPoint); - saved_game->read(handLPoint); - saved_game->read(crotchPoint); - saved_game->read(footRPoint); - saved_game->read(footLPoint); - saved_game->read(torsoPoint); - saved_game->read(torsoAngles); - saved_game->read(eyePoint); - saved_game->read(eyeAngles); - saved_game->read(lookTarget); - saved_game->read(lookMode); - saved_game->read(lookTargetClearTime); - saved_game->read(lastVoiceVolume); - saved_game->read(lastHeadAngles); - saved_game->read(headBobAngles); - saved_game->read(targetHeadBobAngles); - saved_game->read(lookingDebounceTime); - saved_game->read(legsYaw); + saved_game.read(legsModelName); + saved_game.read(torsoModelName); + saved_game.read(headModelName); + saved_game.read(headYawRangeLeft); + saved_game.read(headYawRangeRight); + saved_game.read(headPitchRangeUp); + saved_game.read(headPitchRangeDown); + saved_game.read(torsoYawRangeLeft); + saved_game.read(torsoYawRangeRight); + saved_game.read(torsoPitchRangeUp); + saved_game.read(torsoPitchRangeDown); + saved_game.read(legsFrame); + saved_game.read(torsoFrame); + saved_game.read(legsFpsMod); + saved_game.read(torsoFpsMod); + saved_game.read(customRGBA); + saved_game.read(boneIndex1); + saved_game.read(boneIndex2); + saved_game.read(boneIndex3); + saved_game.read(boneIndex4); + saved_game.read(boneOrient); + saved_game.read(boneAngles1); + saved_game.read(boneAngles2); + saved_game.read(boneAngles3); + saved_game.read(boneAngles4); + saved_game.read(renderFlags); + saved_game.read(muzzlePoint); + saved_game.read(muzzleDir); + saved_game.read(muzzlePointOld); + saved_game.read(muzzleDirOld); + saved_game.read(mPCalcTime); + saved_game.read(lockYaw); + saved_game.read(headPoint); + saved_game.read(headAngles); + saved_game.read(handRPoint); + saved_game.read(handLPoint); + saved_game.read(crotchPoint); + saved_game.read(footRPoint); + saved_game.read(footLPoint); + saved_game.read(torsoPoint); + saved_game.read(torsoAngles); + saved_game.read(eyePoint); + saved_game.read(eyeAngles); + saved_game.read(lookTarget); + saved_game.read(lookMode); + saved_game.read(lookTargetClearTime); + saved_game.read(lastVoiceVolume); + saved_game.read(lastHeadAngles); + saved_game.read(headBobAngles); + saved_game.read(targetHeadBobAngles); + saved_game.read(lookingDebounceTime); + saved_game.read(legsYaw); } }; // renderInfo_t @@ -449,35 +449,35 @@ class playerTeamState_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(state); - saved_game->write(captures); - saved_game->write(basedefense); - saved_game->write(carrierdefense); - saved_game->write(flagrecovery); - saved_game->write(fragcarrier); - saved_game->write(assists); - saved_game->write(lasthurtcarrier); - saved_game->write(lastreturnedflag); - saved_game->write(flagsince); - saved_game->write(lastfraggedcarrier); + saved_game.write(state); + saved_game.write(captures); + saved_game.write(basedefense); + saved_game.write(carrierdefense); + saved_game.write(flagrecovery); + saved_game.write(fragcarrier); + saved_game.write(assists); + saved_game.write(lasthurtcarrier); + saved_game.write(lastreturnedflag); + saved_game.write(flagsince); + saved_game.write(lastfraggedcarrier); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(state); - saved_game->read(captures); - saved_game->read(basedefense); - saved_game->read(carrierdefense); - saved_game->read(flagrecovery); - saved_game->read(fragcarrier); - saved_game->read(assists); - saved_game->read(lasthurtcarrier); - saved_game->read(lastreturnedflag); - saved_game->read(flagsince); - saved_game->read(lastfraggedcarrier); + saved_game.read(state); + saved_game.read(captures); + saved_game.read(basedefense); + saved_game.read(carrierdefense); + saved_game.read(flagrecovery); + saved_game.read(fragcarrier); + saved_game.read(assists); + saved_game.read(lasthurtcarrier); + saved_game.read(lastreturnedflag); + saved_game.read(flagsince); + saved_game.read(lastfraggedcarrier); } }; // playerTeamState_t @@ -490,17 +490,17 @@ class objectives_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(display); - saved_game->write(status); + saved_game.write(display); + saved_game.write(status); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(display); - saved_game->read(status); + saved_game.read(display); + saved_game.read(status); } }; // objectives_t // NOTE: This is an arbitrary number greater than our current number of objectives with @@ -528,41 +528,41 @@ class missionStats_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(secretsFound); - saved_game->write(totalSecrets); - saved_game->write(shotsFired); - saved_game->write(hits); - saved_game->write(enemiesSpawned); - saved_game->write(enemiesKilled); - saved_game->write(saberThrownCnt); - saved_game->write(saberBlocksCnt); - saved_game->write(legAttacksCnt); - saved_game->write(armAttacksCnt); - saved_game->write(torsoAttacksCnt); - saved_game->write(otherAttacksCnt); - saved_game->write(forceUsed); - saved_game->write(weaponUsed); + saved_game.write(secretsFound); + saved_game.write(totalSecrets); + saved_game.write(shotsFired); + saved_game.write(hits); + saved_game.write(enemiesSpawned); + saved_game.write(enemiesKilled); + saved_game.write(saberThrownCnt); + saved_game.write(saberBlocksCnt); + saved_game.write(legAttacksCnt); + saved_game.write(armAttacksCnt); + saved_game.write(torsoAttacksCnt); + saved_game.write(otherAttacksCnt); + saved_game.write(forceUsed); + saved_game.write(weaponUsed); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(secretsFound); - saved_game->read(totalSecrets); - saved_game->read(shotsFired); - saved_game->read(hits); - saved_game->read(enemiesSpawned); - saved_game->read(enemiesKilled); - saved_game->read(saberThrownCnt); - saved_game->read(saberBlocksCnt); - saved_game->read(legAttacksCnt); - saved_game->read(armAttacksCnt); - saved_game->read(torsoAttacksCnt); - saved_game->read(otherAttacksCnt); - saved_game->read(forceUsed); - saved_game->read(weaponUsed); + saved_game.read(secretsFound); + saved_game.read(totalSecrets); + saved_game.read(shotsFired); + saved_game.read(hits); + saved_game.read(enemiesSpawned); + saved_game.read(enemiesKilled); + saved_game.read(saberThrownCnt); + saved_game.read(saberBlocksCnt); + saved_game.read(legAttacksCnt); + saved_game.read(armAttacksCnt); + saved_game.read(torsoAttacksCnt); + saved_game.read(otherAttacksCnt); + saved_game.read(forceUsed); + saved_game.read(weaponUsed); } }; // missionStats_t @@ -587,21 +587,21 @@ class clientSession_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(missionObjectivesShown); - saved_game->write(sessionTeam); - saved_game->write<>(mission_objectives); - saved_game->write<>(missionStats); + saved_game.write(missionObjectivesShown); + saved_game.write(sessionTeam); + saved_game.write<>(mission_objectives); + saved_game.write<>(missionStats); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(missionObjectivesShown); - saved_game->read(sessionTeam); - saved_game->read<>(mission_objectives); - saved_game->read<>(missionStats); + saved_game.read(missionObjectivesShown); + saved_game.read(sessionTeam); + saved_game.read<>(mission_objectives); + saved_game.read<>(missionStats); } }; // clientSession_t @@ -622,31 +622,31 @@ class clientPersistant_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(connected); - saved_game->write<>(lastCommand); - saved_game->write(netname); - saved_game->skip(2); - saved_game->write(maxHealth); - saved_game->write(enterTime); - saved_game->write(cmd_angles); - saved_game->skip(2); - saved_game->write<>(teamState); + saved_game.write(connected); + saved_game.write<>(lastCommand); + saved_game.write(netname); + saved_game.skip(2); + saved_game.write(maxHealth); + saved_game.write(enterTime); + saved_game.write(cmd_angles); + saved_game.skip(2); + saved_game.write<>(teamState); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(connected); - saved_game->read<>(lastCommand); - saved_game->read(netname); - saved_game->skip(2); - saved_game->read(maxHealth); - saved_game->read(enterTime); - saved_game->read(cmd_angles); - saved_game->skip(2); - saved_game->read<>(teamState); + saved_game.read(connected); + saved_game.read<>(lastCommand); + saved_game.read(netname); + saved_game.skip(2); + saved_game.read(maxHealth); + saved_game.read(enterTime); + saved_game.read(cmd_angles); + saved_game.skip(2); + saved_game.read<>(teamState); } }; // clientPersistant_t @@ -792,135 +792,135 @@ class GClientBase void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write<>(ps); - saved_game->write<>(pers); - saved_game->write<>(sess); - saved_game->write(lastCmdTime); - saved_game->write<>(usercmd); - saved_game->write(buttons); - saved_game->write(oldbuttons); - saved_game->write(latched_buttons); - saved_game->write(damage_armor); - saved_game->write(damage_blood); - saved_game->write(damage_from); - saved_game->write(damage_fromWorld); - saved_game->write(noclip); - saved_game->write(forced_forwardmove); - saved_game->write(forced_rightmove); - saved_game->write(respawnTime); - saved_game->write(idleTime); - saved_game->write(airOutTime); - saved_game->write(timeResidual); - saved_game->write(facial_blink); - saved_game->write(facial_timer); - saved_game->write(facial_anim); - saved_game->write<>(clientInfo); - saved_game->write(moveType); - saved_game->write(jetPackTime); - saved_game->write(fireDelay); - saved_game->write(breathPuffTime); - saved_game->write(playerTeam); - saved_game->write(enemyTeam); - saved_game->write(leader); - saved_game->write(NPC_class); - saved_game->write(hiddenDist); - saved_game->write(hiddenDir); - saved_game->write<>(renderInfo); - saved_game->write(dismembered); - saved_game->write(dismemberProbLegs); - saved_game->write(dismemberProbHead); - saved_game->write(dismemberProbArms); - saved_game->write(dismemberProbHands); - saved_game->write(dismemberProbWaist); - saved_game->skip(2); - saved_game->write(standheight); - saved_game->write(crouchheight); - saved_game->write(poisonDamage); - saved_game->write(poisonTime); - saved_game->write(slopeRecalcTime); - saved_game->write(pushVec); - saved_game->write(pushVecTime); - saved_game->write(noRagTime); - saved_game->write(isRagging); - saved_game->write(overridingBones); - saved_game->write(ragLastOrigin); - saved_game->write(ragLastOriginTime); - saved_game->write(pushEffectFadeTime); - saved_game->write(pushEffectOrigin); - saved_game->write(rocketLockIndex); - saved_game->write(rocketLastValidTime); - saved_game->write(rocketLockTime); - saved_game->write(rocketTargetTime); - saved_game->write(inSpaceSuffocation); - saved_game->write(inSpaceIndex); + saved_game.write<>(ps); + saved_game.write<>(pers); + saved_game.write<>(sess); + saved_game.write(lastCmdTime); + saved_game.write<>(usercmd); + saved_game.write(buttons); + saved_game.write(oldbuttons); + saved_game.write(latched_buttons); + saved_game.write(damage_armor); + saved_game.write(damage_blood); + saved_game.write(damage_from); + saved_game.write(damage_fromWorld); + saved_game.write(noclip); + saved_game.write(forced_forwardmove); + saved_game.write(forced_rightmove); + saved_game.write(respawnTime); + saved_game.write(idleTime); + saved_game.write(airOutTime); + saved_game.write(timeResidual); + saved_game.write(facial_blink); + saved_game.write(facial_timer); + saved_game.write(facial_anim); + saved_game.write<>(clientInfo); + saved_game.write(moveType); + saved_game.write(jetPackTime); + saved_game.write(fireDelay); + saved_game.write(breathPuffTime); + saved_game.write(playerTeam); + saved_game.write(enemyTeam); + saved_game.write(leader); + saved_game.write(NPC_class); + saved_game.write(hiddenDist); + saved_game.write(hiddenDir); + saved_game.write<>(renderInfo); + saved_game.write(dismembered); + saved_game.write(dismemberProbLegs); + saved_game.write(dismemberProbHead); + saved_game.write(dismemberProbArms); + saved_game.write(dismemberProbHands); + saved_game.write(dismemberProbWaist); + saved_game.skip(2); + saved_game.write(standheight); + saved_game.write(crouchheight); + saved_game.write(poisonDamage); + saved_game.write(poisonTime); + saved_game.write(slopeRecalcTime); + saved_game.write(pushVec); + saved_game.write(pushVecTime); + saved_game.write(noRagTime); + saved_game.write(isRagging); + saved_game.write(overridingBones); + saved_game.write(ragLastOrigin); + saved_game.write(ragLastOriginTime); + saved_game.write(pushEffectFadeTime); + saved_game.write(pushEffectOrigin); + saved_game.write(rocketLockIndex); + saved_game.write(rocketLastValidTime); + saved_game.write(rocketLockTime); + saved_game.write(rocketTargetTime); + saved_game.write(inSpaceSuffocation); + saved_game.write(inSpaceIndex); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read<>(ps); - saved_game->read<>(pers); - saved_game->read<>(sess); - saved_game->read(lastCmdTime); - saved_game->read<>(usercmd); - saved_game->read(buttons); - saved_game->read(oldbuttons); - saved_game->read(latched_buttons); - saved_game->read(damage_armor); - saved_game->read(damage_blood); - saved_game->read(damage_from); - saved_game->read(damage_fromWorld); - saved_game->read(noclip); - saved_game->read(forced_forwardmove); - saved_game->read(forced_rightmove); - saved_game->read(respawnTime); - saved_game->read(idleTime); - saved_game->read(airOutTime); - saved_game->read(timeResidual); - saved_game->read(facial_blink); - saved_game->read(facial_timer); - saved_game->read(facial_anim); - saved_game->read<>(clientInfo); - saved_game->read(moveType); - saved_game->read(jetPackTime); - saved_game->read(fireDelay); - saved_game->read(breathPuffTime); - saved_game->read(playerTeam); - saved_game->read(enemyTeam); - saved_game->read(leader); - saved_game->read(NPC_class); - saved_game->read(hiddenDist); - saved_game->read(hiddenDir); - saved_game->read<>(renderInfo); - saved_game->read(dismembered); - saved_game->read(dismemberProbLegs); - saved_game->read(dismemberProbHead); - saved_game->read(dismemberProbArms); - saved_game->read(dismemberProbHands); - saved_game->read(dismemberProbWaist); - saved_game->skip(2); - saved_game->read(standheight); - saved_game->read(crouchheight); - saved_game->read(poisonDamage); - saved_game->read(poisonTime); - saved_game->read(slopeRecalcTime); - saved_game->read(pushVec); - saved_game->read(pushVecTime); - saved_game->read(noRagTime); - saved_game->read(isRagging); - saved_game->read(overridingBones); - saved_game->read(ragLastOrigin); - saved_game->read(ragLastOriginTime); - saved_game->read(pushEffectFadeTime); - saved_game->read(pushEffectOrigin); - saved_game->read(rocketLockIndex); - saved_game->read(rocketLastValidTime); - saved_game->read(rocketLockTime); - saved_game->read(rocketTargetTime); - saved_game->read(inSpaceSuffocation); - saved_game->read(inSpaceIndex); + saved_game.read<>(ps); + saved_game.read<>(pers); + saved_game.read<>(sess); + saved_game.read(lastCmdTime); + saved_game.read<>(usercmd); + saved_game.read(buttons); + saved_game.read(oldbuttons); + saved_game.read(latched_buttons); + saved_game.read(damage_armor); + saved_game.read(damage_blood); + saved_game.read(damage_from); + saved_game.read(damage_fromWorld); + saved_game.read(noclip); + saved_game.read(forced_forwardmove); + saved_game.read(forced_rightmove); + saved_game.read(respawnTime); + saved_game.read(idleTime); + saved_game.read(airOutTime); + saved_game.read(timeResidual); + saved_game.read(facial_blink); + saved_game.read(facial_timer); + saved_game.read(facial_anim); + saved_game.read<>(clientInfo); + saved_game.read(moveType); + saved_game.read(jetPackTime); + saved_game.read(fireDelay); + saved_game.read(breathPuffTime); + saved_game.read(playerTeam); + saved_game.read(enemyTeam); + saved_game.read(leader); + saved_game.read(NPC_class); + saved_game.read(hiddenDist); + saved_game.read(hiddenDir); + saved_game.read<>(renderInfo); + saved_game.read(dismembered); + saved_game.read(dismemberProbLegs); + saved_game.read(dismemberProbHead); + saved_game.read(dismemberProbArms); + saved_game.read(dismemberProbHands); + saved_game.read(dismemberProbWaist); + saved_game.skip(2); + saved_game.read(standheight); + saved_game.read(crouchheight); + saved_game.read(poisonDamage); + saved_game.read(poisonTime); + saved_game.read(slopeRecalcTime); + saved_game.read(pushVec); + saved_game.read(pushVecTime); + saved_game.read(noRagTime); + saved_game.read(isRagging); + saved_game.read(overridingBones); + saved_game.read(ragLastOrigin); + saved_game.read(ragLastOriginTime); + saved_game.read(pushEffectFadeTime); + saved_game.read(pushEffectOrigin); + saved_game.read(rocketLockIndex); + saved_game.read(rocketLastValidTime); + saved_game.read(rocketLockTime); + saved_game.read(rocketTargetTime); + saved_game.read(inSpaceSuffocation); + saved_game.read(inSpaceIndex); } }; // GClientBase @@ -939,15 +939,15 @@ class parms_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(parm); + saved_game.write(parm); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(parm); + saved_game.read(parm); } }; // parms_t @@ -1282,381 +1282,381 @@ Ghoul2 Insert End void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write<>(s); - saved_game->write(client); - saved_game->write(inuse); - saved_game->write(linked); - saved_game->write(svFlags); - saved_game->write(bmodel); - saved_game->write(mins); - saved_game->write(maxs); - saved_game->write(contents); - saved_game->write(absmin); - saved_game->write(absmax); - saved_game->write(currentOrigin); - saved_game->write(currentAngles); - saved_game->write(owner); - saved_game->write<>(ghoul2); - saved_game->write(modelScale); - saved_game->write(classname); - saved_game->write(spawnflags); - saved_game->write(flags); - saved_game->write(model); - saved_game->write(model2); - saved_game->write(freetime); - saved_game->write(eventTime); - saved_game->write(freeAfterEvent); - saved_game->write(physicsBounce); - saved_game->write(clipmask); - saved_game->write(speed); - saved_game->write(resultspeed); - saved_game->write(lastMoveTime); - saved_game->write(movedir); - saved_game->write(lastOrigin); - saved_game->write(lastAngles); - saved_game->write(mass); - saved_game->write(lastImpact); - saved_game->write(watertype); - saved_game->write(waterlevel); - saved_game->write(wupdate); - saved_game->write(prev_waterlevel); - saved_game->write(angle); - saved_game->write(target); - saved_game->write(target2); - saved_game->write(target3); - saved_game->write(target4); - saved_game->write(targetJump); - saved_game->write(targetname); - saved_game->write(team); - saved_game->write(roff); - saved_game->write(roff_ctr); - saved_game->write(next_roff_time); - saved_game->write(fx_time); - saved_game->write(nextthink); - saved_game->write(e_ThinkFunc); - saved_game->write(e_clThinkFunc); - saved_game->write(e_ReachedFunc); - saved_game->write(e_BlockedFunc); - saved_game->write(e_TouchFunc); - saved_game->write(e_UseFunc); - saved_game->write(e_PainFunc); - saved_game->write(e_DieFunc); - saved_game->write(health); - saved_game->write(max_health); - saved_game->write(takedamage); - saved_game->write(material); - saved_game->write(damage); - saved_game->write(dflags); - saved_game->write(splashDamage); - saved_game->write(splashRadius); - saved_game->write(methodOfDeath); - saved_game->write(splashMethodOfDeath); - saved_game->write(locationDamage); - saved_game->write(chain); - saved_game->write(enemy); - saved_game->write(activator); - saved_game->write(teamchain); - saved_game->write(teammaster); - saved_game->write(lastEnemy); - saved_game->write(wait); - saved_game->write(random); - saved_game->write(delay); - saved_game->write(alt_fire); - saved_game->write(count); - saved_game->write(bounceCount); - saved_game->write(fly_sound_debounce_time); - saved_game->write(painDebounceTime); - saved_game->write(disconnectDebounceTime); - saved_game->write(attackDebounceTime); - saved_game->write(pushDebounceTime); - saved_game->write(aimDebounceTime); - saved_game->write(useDebounceTime); - saved_game->write(trigger_formation); - saved_game->write(spawnContents); - saved_game->write(waypoint); - saved_game->write(wayedge); - saved_game->write(lastWaypoint); - saved_game->write(lastInAirTime); - saved_game->write(noWaypointTime); - saved_game->write(combatPoint); - saved_game->write(followPos); - saved_game->write(followPosRecalcTime); - saved_game->write(followPosWaypoint); - saved_game->write(loopAnim); - saved_game->write(startFrame); - saved_game->write(endFrame); - saved_game->write(m_iIcarusID); - saved_game->write(taskID); - saved_game->write(parms); - saved_game->write(behaviorSet); - saved_game->write(script_targetname); - saved_game->write(delayScriptTime); - saved_game->write(soundSet); - saved_game->write(setTime); - saved_game->write(cameraGroup); - saved_game->write(noDamageTeam); - saved_game->write(playerModel); - saved_game->write(weaponModel); - saved_game->write(handRBolt); - saved_game->write(handLBolt); - saved_game->write(headBolt); - saved_game->write(cervicalBolt); - saved_game->write(chestBolt); - saved_game->write(gutBolt); - saved_game->write(torsoBolt); - saved_game->write(crotchBolt); - saved_game->write(motionBolt); - saved_game->write(kneeLBolt); - saved_game->write(kneeRBolt); - saved_game->write(elbowLBolt); - saved_game->write(elbowRBolt); - saved_game->write(footLBolt); - saved_game->write(footRBolt); - saved_game->write(faceBone); - saved_game->write(craniumBone); - saved_game->write(cervicalBone); - saved_game->write(thoracicBone); - saved_game->write(upperLumbarBone); - saved_game->write(lowerLumbarBone); - saved_game->write(hipsBone); - saved_game->write(motionBone); - saved_game->write(rootBone); - saved_game->write(footLBone); - saved_game->write(footRBone); - saved_game->write(humerusRBone); - saved_game->write(genericBone1); - saved_game->write(genericBone2); - saved_game->write(genericBone3); - saved_game->write(genericBolt1); - saved_game->write(genericBolt2); - saved_game->write(genericBolt3); - saved_game->write(genericBolt4); - saved_game->write(genericBolt5); - saved_game->write(cinematicModel); - saved_game->write(m_pVehicle); - saved_game->write(NPC); - saved_game->write(ownername); - saved_game->write(cantHitEnemyCounter); - saved_game->write(NPC_type); - saved_game->write(NPC_targetname); - saved_game->write(NPC_target); - saved_game->write(moverState); - saved_game->write(soundPos1); - saved_game->write(sound1to2); - saved_game->write(sound2to1); - saved_game->write(soundPos2); - saved_game->write(soundLoop); - saved_game->write(nextTrain); - saved_game->write(prevTrain); - saved_game->write(pos1); - saved_game->write(pos2); - saved_game->write(pos3); - saved_game->write(sounds); - saved_game->write(closetarget); - saved_game->write(opentarget); - saved_game->write(paintarget); - saved_game->write(lockCount); - saved_game->write(radius); - saved_game->write(wpIndex); - saved_game->write(noise_index); - saved_game->write(startRGBA); - saved_game->write(finalRGBA); - saved_game->write(item); - saved_game->write(message); - saved_game->write(lightLevel); - saved_game->write(forcePushTime); - saved_game->write(forcePuller); + saved_game.write<>(s); + saved_game.write(client); + saved_game.write(inuse); + saved_game.write(linked); + saved_game.write(svFlags); + saved_game.write(bmodel); + saved_game.write(mins); + saved_game.write(maxs); + saved_game.write(contents); + saved_game.write(absmin); + saved_game.write(absmax); + saved_game.write(currentOrigin); + saved_game.write(currentAngles); + saved_game.write(owner); + saved_game.write<>(ghoul2); + saved_game.write(modelScale); + saved_game.write(classname); + saved_game.write(spawnflags); + saved_game.write(flags); + saved_game.write(model); + saved_game.write(model2); + saved_game.write(freetime); + saved_game.write(eventTime); + saved_game.write(freeAfterEvent); + saved_game.write(physicsBounce); + saved_game.write(clipmask); + saved_game.write(speed); + saved_game.write(resultspeed); + saved_game.write(lastMoveTime); + saved_game.write(movedir); + saved_game.write(lastOrigin); + saved_game.write(lastAngles); + saved_game.write(mass); + saved_game.write(lastImpact); + saved_game.write(watertype); + saved_game.write(waterlevel); + saved_game.write(wupdate); + saved_game.write(prev_waterlevel); + saved_game.write(angle); + saved_game.write(target); + saved_game.write(target2); + saved_game.write(target3); + saved_game.write(target4); + saved_game.write(targetJump); + saved_game.write(targetname); + saved_game.write(team); + saved_game.write(roff); + saved_game.write(roff_ctr); + saved_game.write(next_roff_time); + saved_game.write(fx_time); + saved_game.write(nextthink); + saved_game.write(e_ThinkFunc); + saved_game.write(e_clThinkFunc); + saved_game.write(e_ReachedFunc); + saved_game.write(e_BlockedFunc); + saved_game.write(e_TouchFunc); + saved_game.write(e_UseFunc); + saved_game.write(e_PainFunc); + saved_game.write(e_DieFunc); + saved_game.write(health); + saved_game.write(max_health); + saved_game.write(takedamage); + saved_game.write(material); + saved_game.write(damage); + saved_game.write(dflags); + saved_game.write(splashDamage); + saved_game.write(splashRadius); + saved_game.write(methodOfDeath); + saved_game.write(splashMethodOfDeath); + saved_game.write(locationDamage); + saved_game.write(chain); + saved_game.write(enemy); + saved_game.write(activator); + saved_game.write(teamchain); + saved_game.write(teammaster); + saved_game.write(lastEnemy); + saved_game.write(wait); + saved_game.write(random); + saved_game.write(delay); + saved_game.write(alt_fire); + saved_game.write(count); + saved_game.write(bounceCount); + saved_game.write(fly_sound_debounce_time); + saved_game.write(painDebounceTime); + saved_game.write(disconnectDebounceTime); + saved_game.write(attackDebounceTime); + saved_game.write(pushDebounceTime); + saved_game.write(aimDebounceTime); + saved_game.write(useDebounceTime); + saved_game.write(trigger_formation); + saved_game.write(spawnContents); + saved_game.write(waypoint); + saved_game.write(wayedge); + saved_game.write(lastWaypoint); + saved_game.write(lastInAirTime); + saved_game.write(noWaypointTime); + saved_game.write(combatPoint); + saved_game.write(followPos); + saved_game.write(followPosRecalcTime); + saved_game.write(followPosWaypoint); + saved_game.write(loopAnim); + saved_game.write(startFrame); + saved_game.write(endFrame); + saved_game.write(m_iIcarusID); + saved_game.write(taskID); + saved_game.write(parms); + saved_game.write(behaviorSet); + saved_game.write(script_targetname); + saved_game.write(delayScriptTime); + saved_game.write(soundSet); + saved_game.write(setTime); + saved_game.write(cameraGroup); + saved_game.write(noDamageTeam); + saved_game.write(playerModel); + saved_game.write(weaponModel); + saved_game.write(handRBolt); + saved_game.write(handLBolt); + saved_game.write(headBolt); + saved_game.write(cervicalBolt); + saved_game.write(chestBolt); + saved_game.write(gutBolt); + saved_game.write(torsoBolt); + saved_game.write(crotchBolt); + saved_game.write(motionBolt); + saved_game.write(kneeLBolt); + saved_game.write(kneeRBolt); + saved_game.write(elbowLBolt); + saved_game.write(elbowRBolt); + saved_game.write(footLBolt); + saved_game.write(footRBolt); + saved_game.write(faceBone); + saved_game.write(craniumBone); + saved_game.write(cervicalBone); + saved_game.write(thoracicBone); + saved_game.write(upperLumbarBone); + saved_game.write(lowerLumbarBone); + saved_game.write(hipsBone); + saved_game.write(motionBone); + saved_game.write(rootBone); + saved_game.write(footLBone); + saved_game.write(footRBone); + saved_game.write(humerusRBone); + saved_game.write(genericBone1); + saved_game.write(genericBone2); + saved_game.write(genericBone3); + saved_game.write(genericBolt1); + saved_game.write(genericBolt2); + saved_game.write(genericBolt3); + saved_game.write(genericBolt4); + saved_game.write(genericBolt5); + saved_game.write(cinematicModel); + saved_game.write(m_pVehicle); + saved_game.write(NPC); + saved_game.write(ownername); + saved_game.write(cantHitEnemyCounter); + saved_game.write(NPC_type); + saved_game.write(NPC_targetname); + saved_game.write(NPC_target); + saved_game.write(moverState); + saved_game.write(soundPos1); + saved_game.write(sound1to2); + saved_game.write(sound2to1); + saved_game.write(soundPos2); + saved_game.write(soundLoop); + saved_game.write(nextTrain); + saved_game.write(prevTrain); + saved_game.write(pos1); + saved_game.write(pos2); + saved_game.write(pos3); + saved_game.write(sounds); + saved_game.write(closetarget); + saved_game.write(opentarget); + saved_game.write(paintarget); + saved_game.write(lockCount); + saved_game.write(radius); + saved_game.write(wpIndex); + saved_game.write(noise_index); + saved_game.write(startRGBA); + saved_game.write(finalRGBA); + saved_game.write(item); + saved_game.write(message); + saved_game.write(lightLevel); + saved_game.write(forcePushTime); + saved_game.write(forcePuller); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read<>(s); - saved_game->read(client); - saved_game->read(inuse); - saved_game->read(linked); - saved_game->read(svFlags); - saved_game->read(bmodel); - saved_game->read(mins); - saved_game->read(maxs); - saved_game->read(contents); - saved_game->read(absmin); - saved_game->read(absmax); - saved_game->read(currentOrigin); - saved_game->read(currentAngles); - saved_game->read(owner); - saved_game->read<>(ghoul2); - saved_game->read(modelScale); - saved_game->read(classname); - saved_game->read(spawnflags); - saved_game->read(flags); - saved_game->read(model); - saved_game->read(model2); - saved_game->read(freetime); - saved_game->read(eventTime); - saved_game->read(freeAfterEvent); - saved_game->read(physicsBounce); - saved_game->read(clipmask); - saved_game->read(speed); - saved_game->read(resultspeed); - saved_game->read(lastMoveTime); - saved_game->read(movedir); - saved_game->read(lastOrigin); - saved_game->read(lastAngles); - saved_game->read(mass); - saved_game->read(lastImpact); - saved_game->read(watertype); - saved_game->read(waterlevel); - saved_game->read(wupdate); - saved_game->read(prev_waterlevel); - saved_game->read(angle); - saved_game->read(target); - saved_game->read(target2); - saved_game->read(target3); - saved_game->read(target4); - saved_game->read(targetJump); - saved_game->read(targetname); - saved_game->read(team); - saved_game->read(roff); - saved_game->read(roff_ctr); - saved_game->read(next_roff_time); - saved_game->read(fx_time); - saved_game->read(nextthink); - saved_game->read(e_ThinkFunc); - saved_game->read(e_clThinkFunc); - saved_game->read(e_ReachedFunc); - saved_game->read(e_BlockedFunc); - saved_game->read(e_TouchFunc); - saved_game->read(e_UseFunc); - saved_game->read(e_PainFunc); - saved_game->read(e_DieFunc); - saved_game->read(health); - saved_game->read(max_health); - saved_game->read(takedamage); - saved_game->read(material); - saved_game->read(damage); - saved_game->read(dflags); - saved_game->read(splashDamage); - saved_game->read(splashRadius); - saved_game->read(methodOfDeath); - saved_game->read(splashMethodOfDeath); - saved_game->read(locationDamage); - saved_game->read(chain); - saved_game->read(enemy); - saved_game->read(activator); - saved_game->read(teamchain); - saved_game->read(teammaster); - saved_game->read(lastEnemy); - saved_game->read(wait); - saved_game->read(random); - saved_game->read(delay); - saved_game->read(alt_fire); - saved_game->read(count); - saved_game->read(bounceCount); - saved_game->read(fly_sound_debounce_time); - saved_game->read(painDebounceTime); - saved_game->read(disconnectDebounceTime); - saved_game->read(attackDebounceTime); - saved_game->read(pushDebounceTime); - saved_game->read(aimDebounceTime); - saved_game->read(useDebounceTime); - saved_game->read(trigger_formation); - saved_game->read(spawnContents); - saved_game->read(waypoint); - saved_game->read(wayedge); - saved_game->read(lastWaypoint); - saved_game->read(lastInAirTime); - saved_game->read(noWaypointTime); - saved_game->read(combatPoint); - saved_game->read(followPos); - saved_game->read(followPosRecalcTime); - saved_game->read(followPosWaypoint); - saved_game->read(loopAnim); - saved_game->read(startFrame); - saved_game->read(endFrame); - saved_game->read(m_iIcarusID); - saved_game->read(taskID); - saved_game->read(parms); - saved_game->read(behaviorSet); - saved_game->read(script_targetname); - saved_game->read(delayScriptTime); - saved_game->read(soundSet); - saved_game->read(setTime); - saved_game->read(cameraGroup); - saved_game->read(noDamageTeam); - saved_game->read(playerModel); - saved_game->read(weaponModel); - saved_game->read(handRBolt); - saved_game->read(handLBolt); - saved_game->read(headBolt); - saved_game->read(cervicalBolt); - saved_game->read(chestBolt); - saved_game->read(gutBolt); - saved_game->read(torsoBolt); - saved_game->read(crotchBolt); - saved_game->read(motionBolt); - saved_game->read(kneeLBolt); - saved_game->read(kneeRBolt); - saved_game->read(elbowLBolt); - saved_game->read(elbowRBolt); - saved_game->read(footLBolt); - saved_game->read(footRBolt); - saved_game->read(faceBone); - saved_game->read(craniumBone); - saved_game->read(cervicalBone); - saved_game->read(thoracicBone); - saved_game->read(upperLumbarBone); - saved_game->read(lowerLumbarBone); - saved_game->read(hipsBone); - saved_game->read(motionBone); - saved_game->read(rootBone); - saved_game->read(footLBone); - saved_game->read(footRBone); - saved_game->read(humerusRBone); - saved_game->read(genericBone1); - saved_game->read(genericBone2); - saved_game->read(genericBone3); - saved_game->read(genericBolt1); - saved_game->read(genericBolt2); - saved_game->read(genericBolt3); - saved_game->read(genericBolt4); - saved_game->read(genericBolt5); - saved_game->read(cinematicModel); - saved_game->read(m_pVehicle); - saved_game->read(NPC); - saved_game->read(ownername); - saved_game->read(cantHitEnemyCounter); - saved_game->read(NPC_type); - saved_game->read(NPC_targetname); - saved_game->read(NPC_target); - saved_game->read(moverState); - saved_game->read(soundPos1); - saved_game->read(sound1to2); - saved_game->read(sound2to1); - saved_game->read(soundPos2); - saved_game->read(soundLoop); - saved_game->read(nextTrain); - saved_game->read(prevTrain); - saved_game->read(pos1); - saved_game->read(pos2); - saved_game->read(pos3); - saved_game->read(sounds); - saved_game->read(closetarget); - saved_game->read(opentarget); - saved_game->read(paintarget); - saved_game->read(lockCount); - saved_game->read(radius); - saved_game->read(wpIndex); - saved_game->read(noise_index); - saved_game->read(startRGBA); - saved_game->read(finalRGBA); - saved_game->read(item); - saved_game->read(message); - saved_game->read(lightLevel); - saved_game->read(forcePushTime); - saved_game->read(forcePuller); + saved_game.read<>(s); + saved_game.read(client); + saved_game.read(inuse); + saved_game.read(linked); + saved_game.read(svFlags); + saved_game.read(bmodel); + saved_game.read(mins); + saved_game.read(maxs); + saved_game.read(contents); + saved_game.read(absmin); + saved_game.read(absmax); + saved_game.read(currentOrigin); + saved_game.read(currentAngles); + saved_game.read(owner); + saved_game.read<>(ghoul2); + saved_game.read(modelScale); + saved_game.read(classname); + saved_game.read(spawnflags); + saved_game.read(flags); + saved_game.read(model); + saved_game.read(model2); + saved_game.read(freetime); + saved_game.read(eventTime); + saved_game.read(freeAfterEvent); + saved_game.read(physicsBounce); + saved_game.read(clipmask); + saved_game.read(speed); + saved_game.read(resultspeed); + saved_game.read(lastMoveTime); + saved_game.read(movedir); + saved_game.read(lastOrigin); + saved_game.read(lastAngles); + saved_game.read(mass); + saved_game.read(lastImpact); + saved_game.read(watertype); + saved_game.read(waterlevel); + saved_game.read(wupdate); + saved_game.read(prev_waterlevel); + saved_game.read(angle); + saved_game.read(target); + saved_game.read(target2); + saved_game.read(target3); + saved_game.read(target4); + saved_game.read(targetJump); + saved_game.read(targetname); + saved_game.read(team); + saved_game.read(roff); + saved_game.read(roff_ctr); + saved_game.read(next_roff_time); + saved_game.read(fx_time); + saved_game.read(nextthink); + saved_game.read(e_ThinkFunc); + saved_game.read(e_clThinkFunc); + saved_game.read(e_ReachedFunc); + saved_game.read(e_BlockedFunc); + saved_game.read(e_TouchFunc); + saved_game.read(e_UseFunc); + saved_game.read(e_PainFunc); + saved_game.read(e_DieFunc); + saved_game.read(health); + saved_game.read(max_health); + saved_game.read(takedamage); + saved_game.read(material); + saved_game.read(damage); + saved_game.read(dflags); + saved_game.read(splashDamage); + saved_game.read(splashRadius); + saved_game.read(methodOfDeath); + saved_game.read(splashMethodOfDeath); + saved_game.read(locationDamage); + saved_game.read(chain); + saved_game.read(enemy); + saved_game.read(activator); + saved_game.read(teamchain); + saved_game.read(teammaster); + saved_game.read(lastEnemy); + saved_game.read(wait); + saved_game.read(random); + saved_game.read(delay); + saved_game.read(alt_fire); + saved_game.read(count); + saved_game.read(bounceCount); + saved_game.read(fly_sound_debounce_time); + saved_game.read(painDebounceTime); + saved_game.read(disconnectDebounceTime); + saved_game.read(attackDebounceTime); + saved_game.read(pushDebounceTime); + saved_game.read(aimDebounceTime); + saved_game.read(useDebounceTime); + saved_game.read(trigger_formation); + saved_game.read(spawnContents); + saved_game.read(waypoint); + saved_game.read(wayedge); + saved_game.read(lastWaypoint); + saved_game.read(lastInAirTime); + saved_game.read(noWaypointTime); + saved_game.read(combatPoint); + saved_game.read(followPos); + saved_game.read(followPosRecalcTime); + saved_game.read(followPosWaypoint); + saved_game.read(loopAnim); + saved_game.read(startFrame); + saved_game.read(endFrame); + saved_game.read(m_iIcarusID); + saved_game.read(taskID); + saved_game.read(parms); + saved_game.read(behaviorSet); + saved_game.read(script_targetname); + saved_game.read(delayScriptTime); + saved_game.read(soundSet); + saved_game.read(setTime); + saved_game.read(cameraGroup); + saved_game.read(noDamageTeam); + saved_game.read(playerModel); + saved_game.read(weaponModel); + saved_game.read(handRBolt); + saved_game.read(handLBolt); + saved_game.read(headBolt); + saved_game.read(cervicalBolt); + saved_game.read(chestBolt); + saved_game.read(gutBolt); + saved_game.read(torsoBolt); + saved_game.read(crotchBolt); + saved_game.read(motionBolt); + saved_game.read(kneeLBolt); + saved_game.read(kneeRBolt); + saved_game.read(elbowLBolt); + saved_game.read(elbowRBolt); + saved_game.read(footLBolt); + saved_game.read(footRBolt); + saved_game.read(faceBone); + saved_game.read(craniumBone); + saved_game.read(cervicalBone); + saved_game.read(thoracicBone); + saved_game.read(upperLumbarBone); + saved_game.read(lowerLumbarBone); + saved_game.read(hipsBone); + saved_game.read(motionBone); + saved_game.read(rootBone); + saved_game.read(footLBone); + saved_game.read(footRBone); + saved_game.read(humerusRBone); + saved_game.read(genericBone1); + saved_game.read(genericBone2); + saved_game.read(genericBone3); + saved_game.read(genericBolt1); + saved_game.read(genericBolt2); + saved_game.read(genericBolt3); + saved_game.read(genericBolt4); + saved_game.read(genericBolt5); + saved_game.read(cinematicModel); + saved_game.read(m_pVehicle); + saved_game.read(NPC); + saved_game.read(ownername); + saved_game.read(cantHitEnemyCounter); + saved_game.read(NPC_type); + saved_game.read(NPC_targetname); + saved_game.read(NPC_target); + saved_game.read(moverState); + saved_game.read(soundPos1); + saved_game.read(sound1to2); + saved_game.read(sound2to1); + saved_game.read(soundPos2); + saved_game.read(soundLoop); + saved_game.read(nextTrain); + saved_game.read(prevTrain); + saved_game.read(pos1); + saved_game.read(pos2); + saved_game.read(pos3); + saved_game.read(sounds); + saved_game.read(closetarget); + saved_game.read(opentarget); + saved_game.read(paintarget); + saved_game.read(lockCount); + saved_game.read(radius); + saved_game.read(wpIndex); + saved_game.read(noise_index); + saved_game.read(startRGBA); + saved_game.read(finalRGBA); + saved_game.read(item); + saved_game.read(message); + saved_game.read(lightLevel); + saved_game.read(forcePushTime); + saved_game.read(forcePuller); } }; #endif //#ifdef GAME_INCLUDE diff --git a/code/game/g_vehicles.h b/code/game/g_vehicles.h index e1ec0863a6..7e4845afe7 100644 --- a/code/game/g_vehicles.h +++ b/code/game/g_vehicles.h @@ -468,23 +468,23 @@ struct Muzzle void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(m_vMuzzlePos); - saved_game->write(m_vMuzzleDir); - saved_game->write(m_iMuzzleWait); - saved_game->write(m_bFired); - saved_game->skip(3); + saved_game.write(m_vMuzzlePos); + saved_game.write(m_vMuzzleDir); + saved_game.write(m_iMuzzleWait); + saved_game.write(m_bFired); + saved_game.skip(3); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(m_vMuzzlePos); - saved_game->read(m_vMuzzleDir); - saved_game->read(m_iMuzzleWait); - saved_game->read(m_bFired); - saved_game->skip(3); + saved_game.read(m_vMuzzlePos); + saved_game.read(m_vMuzzleDir); + saved_game.read(m_iMuzzleWait); + saved_game.read(m_bFired); + saved_game.skip(3); } }; @@ -524,21 +524,21 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(linked); - saved_game->write(ammo); - saved_game->write(lastAmmoInc); - saved_game->write(nextMuzzle); + saved_game.write(linked); + saved_game.write(ammo); + saved_game.write(lastAmmoInc); + saved_game.write(nextMuzzle); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(linked); - saved_game->read(ammo); - saved_game->read(lastAmmoInc); - saved_game->read(nextMuzzle); + saved_game.read(linked); + saved_game.read(ammo); + saved_game.read(lastAmmoInc); + saved_game.read(nextMuzzle); } } vehWeaponStatus_t; @@ -557,23 +557,23 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(ammo); - saved_game->write(lastAmmoInc); - saved_game->write(nextMuzzle); - saved_game->write(enemyEntNum); - saved_game->write(enemyHoldTime); + saved_game.write(ammo); + saved_game.write(lastAmmoInc); + saved_game.write(nextMuzzle); + saved_game.write(enemyEntNum); + saved_game.write(enemyHoldTime); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(ammo); - saved_game->read(lastAmmoInc); - saved_game->read(nextMuzzle); - saved_game->read(enemyEntNum); - saved_game->read(enemyHoldTime); + saved_game.read(ammo); + saved_game.read(lastAmmoInc); + saved_game.read(nextMuzzle); + saved_game.read(enemyEntNum); + saved_game.read(enemyHoldTime); } } vehTurretStatus_t; @@ -694,97 +694,97 @@ struct Vehicle_t void Vehicle_t::sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(m_pPilot); - saved_game->write(m_iPilotTime); - saved_game->write(m_bHasHadPilot); - saved_game->write(m_pDroidUnit); - saved_game->write(m_pParentEntity); - saved_game->write(m_iBoarding); - saved_game->write(m_bWasBoarding); - saved_game->skip(3); - saved_game->write(m_vBoardingVelocity); - saved_game->write(m_fTimeModifier); - saved_game->write(m_iLeftWingBone); - saved_game->write(m_iRightWingBone); - saved_game->write(m_iExhaustTag); - saved_game->write(m_iMuzzleTag); - saved_game->write(m_iDroidUnitTag); - saved_game->write(m_iGunnerViewTag); - saved_game->write<>(m_Muzzles); - saved_game->write<>(m_ucmd); - saved_game->write(m_EjectDir); - saved_game->write(m_ulFlags); - saved_game->write(m_vOrientation); - saved_game->write(m_fStrafeTime); - saved_game->write(m_vPrevOrientation); - saved_game->write(m_vAngularVelocity); - saved_game->write(m_vFullAngleVelocity); - saved_game->write(m_iArmor); - saved_game->write(m_iShields); - saved_game->write(m_iLastFXTime); - saved_game->write(m_iDieTime); - saved_game->write(m_pVehicleInfo); - saved_game->write<>(m_LandTrace); - saved_game->write(m_iRemovedSurfaces); - saved_game->write(m_iTurboTime); - saved_game->write(m_iDropTime); - saved_game->write(m_iSoundDebounceTimer); - saved_game->write(lastShieldInc); - saved_game->write(linkWeaponToggleHeld); - saved_game->write<>(weaponStatus); - saved_game->write<>(turretStatus); - saved_game->write(m_pOldPilot); - saved_game->write(m_safeJumpMountTime); - saved_game->write(m_safeJumpMountRightDot); + saved_game.write(m_pPilot); + saved_game.write(m_iPilotTime); + saved_game.write(m_bHasHadPilot); + saved_game.write(m_pDroidUnit); + saved_game.write(m_pParentEntity); + saved_game.write(m_iBoarding); + saved_game.write(m_bWasBoarding); + saved_game.skip(3); + saved_game.write(m_vBoardingVelocity); + saved_game.write(m_fTimeModifier); + saved_game.write(m_iLeftWingBone); + saved_game.write(m_iRightWingBone); + saved_game.write(m_iExhaustTag); + saved_game.write(m_iMuzzleTag); + saved_game.write(m_iDroidUnitTag); + saved_game.write(m_iGunnerViewTag); + saved_game.write<>(m_Muzzles); + saved_game.write<>(m_ucmd); + saved_game.write(m_EjectDir); + saved_game.write(m_ulFlags); + saved_game.write(m_vOrientation); + saved_game.write(m_fStrafeTime); + saved_game.write(m_vPrevOrientation); + saved_game.write(m_vAngularVelocity); + saved_game.write(m_vFullAngleVelocity); + saved_game.write(m_iArmor); + saved_game.write(m_iShields); + saved_game.write(m_iLastFXTime); + saved_game.write(m_iDieTime); + saved_game.write(m_pVehicleInfo); + saved_game.write<>(m_LandTrace); + saved_game.write(m_iRemovedSurfaces); + saved_game.write(m_iTurboTime); + saved_game.write(m_iDropTime); + saved_game.write(m_iSoundDebounceTimer); + saved_game.write(lastShieldInc); + saved_game.write(linkWeaponToggleHeld); + saved_game.write<>(weaponStatus); + saved_game.write<>(turretStatus); + saved_game.write(m_pOldPilot); + saved_game.write(m_safeJumpMountTime); + saved_game.write(m_safeJumpMountRightDot); } void Vehicle_t::sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(m_pPilot); - saved_game->read(m_iPilotTime); - saved_game->read(m_bHasHadPilot); - saved_game->read(m_pDroidUnit); - saved_game->read(m_pParentEntity); - saved_game->read(m_iBoarding); - saved_game->read(m_bWasBoarding); - saved_game->skip(3); - saved_game->read(m_vBoardingVelocity); - saved_game->read(m_fTimeModifier); - saved_game->read(m_iLeftWingBone); - saved_game->read(m_iRightWingBone); - saved_game->read(m_iExhaustTag); - saved_game->read(m_iMuzzleTag); - saved_game->read(m_iDroidUnitTag); - saved_game->read(m_iGunnerViewTag); - saved_game->read<>(m_Muzzles); - saved_game->read<>(m_ucmd); - saved_game->read(m_EjectDir); - saved_game->read(m_ulFlags); - saved_game->read(m_vOrientation); - saved_game->read(m_fStrafeTime); - saved_game->read(m_vPrevOrientation); - saved_game->read(m_vAngularVelocity); - saved_game->read(m_vFullAngleVelocity); - saved_game->read(m_iArmor); - saved_game->read(m_iShields); - saved_game->read(m_iLastFXTime); - saved_game->read(m_iDieTime); - saved_game->read(m_pVehicleInfo); - saved_game->read<>(m_LandTrace); - saved_game->read(m_iRemovedSurfaces); - saved_game->read(m_iTurboTime); - saved_game->read(m_iDropTime); - saved_game->read(m_iSoundDebounceTimer); - saved_game->read(lastShieldInc); - saved_game->read(linkWeaponToggleHeld); - saved_game->read<>(weaponStatus); - saved_game->read<>(turretStatus); - saved_game->read(m_pOldPilot); - saved_game->read(m_safeJumpMountTime); - saved_game->read(m_safeJumpMountRightDot); + saved_game.read(m_pPilot); + saved_game.read(m_iPilotTime); + saved_game.read(m_bHasHadPilot); + saved_game.read(m_pDroidUnit); + saved_game.read(m_pParentEntity); + saved_game.read(m_iBoarding); + saved_game.read(m_bWasBoarding); + saved_game.skip(3); + saved_game.read(m_vBoardingVelocity); + saved_game.read(m_fTimeModifier); + saved_game.read(m_iLeftWingBone); + saved_game.read(m_iRightWingBone); + saved_game.read(m_iExhaustTag); + saved_game.read(m_iMuzzleTag); + saved_game.read(m_iDroidUnitTag); + saved_game.read(m_iGunnerViewTag); + saved_game.read<>(m_Muzzles); + saved_game.read<>(m_ucmd); + saved_game.read(m_EjectDir); + saved_game.read(m_ulFlags); + saved_game.read(m_vOrientation); + saved_game.read(m_fStrafeTime); + saved_game.read(m_vPrevOrientation); + saved_game.read(m_vAngularVelocity); + saved_game.read(m_vFullAngleVelocity); + saved_game.read(m_iArmor); + saved_game.read(m_iShields); + saved_game.read(m_iLastFXTime); + saved_game.read(m_iDieTime); + saved_game.read(m_pVehicleInfo); + saved_game.read<>(m_LandTrace); + saved_game.read(m_iRemovedSurfaces); + saved_game.read(m_iTurboTime); + saved_game.read(m_iDropTime); + saved_game.read(m_iSoundDebounceTimer); + saved_game.read(lastShieldInc); + saved_game.read(linkWeaponToggleHeld); + saved_game.read<>(weaponStatus); + saved_game.read<>(turretStatus); + saved_game.read(m_pOldPilot); + saved_game.read(m_safeJumpMountTime); + saved_game.read(m_safeJumpMountRightDot); } }; diff --git a/code/game/ghoul2_shared.h b/code/game/ghoul2_shared.h index 21eb84655d..2a77e20974 100644 --- a/code/game/ghoul2_shared.h +++ b/code/game/ghoul2_shared.h @@ -60,25 +60,25 @@ surfaceInfo_t(): void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(offFlags); - saved_game->write(surface); - saved_game->write(genBarycentricJ); - saved_game->write(genBarycentricI); - saved_game->write(genPolySurfaceIndex); - saved_game->write(genLod); + saved_game.write(offFlags); + saved_game.write(surface); + saved_game.write(genBarycentricJ); + saved_game.write(genBarycentricI); + saved_game.write(genPolySurfaceIndex); + saved_game.write(genLod); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(offFlags); - saved_game->read(surface); - saved_game->read(genBarycentricJ); - saved_game->read(genBarycentricI); - saved_game->read(genPolySurfaceIndex); - saved_game->read(genLod); + saved_game.read(offFlags); + saved_game.read(surface); + saved_game.read(genBarycentricJ); + saved_game.read(genBarycentricI); + saved_game.read(genPolySurfaceIndex); + saved_game.read(genLod); } }; @@ -216,154 +216,154 @@ boneInfo_t(): void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(boneNumber); - saved_game->write<>(matrix); - saved_game->write(flags); - saved_game->write(startFrame); - saved_game->write(endFrame); - saved_game->write(startTime); - saved_game->write(pauseTime); - saved_game->write(animSpeed); - saved_game->write(blendFrame); - saved_game->write(blendLerpFrame); - saved_game->write(blendTime); - saved_game->write(blendStart); - saved_game->write(boneBlendTime); - saved_game->write(boneBlendStart); - saved_game->write(newMatrix); + saved_game.write(boneNumber); + saved_game.write<>(matrix); + saved_game.write(flags); + saved_game.write(startFrame); + saved_game.write(endFrame); + saved_game.write(startTime); + saved_game.write(pauseTime); + saved_game.write(animSpeed); + saved_game.write(blendFrame); + saved_game.write(blendLerpFrame); + saved_game.write(blendTime); + saved_game.write(blendStart); + saved_game.write(boneBlendTime); + saved_game.write(boneBlendStart); + saved_game.write(newMatrix); #ifndef JK2_MODE - saved_game->write(lastTimeUpdated); - saved_game->write(lastContents); - saved_game->write(lastPosition); - saved_game->write(velocityEffector); - saved_game->write(lastAngles); - saved_game->write(minAngles); - saved_game->write(maxAngles); - saved_game->write(currentAngles); - saved_game->write(anglesOffset); - saved_game->write(positionOffset); - saved_game->write(radius); - saved_game->write(weight); - saved_game->write(ragIndex); - saved_game->write(velocityRoot); - saved_game->write(ragStartTime); - saved_game->write(firstTime); - saved_game->write(firstCollisionTime); - saved_game->write(restTime); - saved_game->write(RagFlags); - saved_game->write(DependentRagIndexMask); - saved_game->write<>(originalTrueBoneMatrix); - saved_game->write<>(parentTrueBoneMatrix); - saved_game->write<>(parentOriginalTrueBoneMatrix); - saved_game->write(originalOrigin); - saved_game->write(originalAngles); - saved_game->write(lastShotDir); - saved_game->write(basepose); - saved_game->write(baseposeInv); - saved_game->write(baseposeParent); - saved_game->write(baseposeInvParent); - saved_game->write(parentRawBoneIndex); - saved_game->write<>(ragOverrideMatrix); - saved_game->write<>(extraMatrix); - saved_game->write(extraVec1); - saved_game->write(extraFloat1); - saved_game->write(extraInt1); - saved_game->write(ikPosition); - saved_game->write(ikSpeed); - saved_game->write(epVelocity); - saved_game->write(epGravFactor); - saved_game->write(solidCount); - saved_game->write(physicsSettled); - saved_game->write(snapped); - saved_game->skip(2); - saved_game->write(parentBoneIndex); - saved_game->write(offsetRotation); - saved_game->write(overGradSpeed); - saved_game->write(overGoalSpot); - saved_game->write(hasOverGoal); - saved_game->skip(3); - saved_game->write<>(animFrameMatrix); - saved_game->write(hasAnimFrameMatrix); - saved_game->write(airTime); + saved_game.write(lastTimeUpdated); + saved_game.write(lastContents); + saved_game.write(lastPosition); + saved_game.write(velocityEffector); + saved_game.write(lastAngles); + saved_game.write(minAngles); + saved_game.write(maxAngles); + saved_game.write(currentAngles); + saved_game.write(anglesOffset); + saved_game.write(positionOffset); + saved_game.write(radius); + saved_game.write(weight); + saved_game.write(ragIndex); + saved_game.write(velocityRoot); + saved_game.write(ragStartTime); + saved_game.write(firstTime); + saved_game.write(firstCollisionTime); + saved_game.write(restTime); + saved_game.write(RagFlags); + saved_game.write(DependentRagIndexMask); + saved_game.write<>(originalTrueBoneMatrix); + saved_game.write<>(parentTrueBoneMatrix); + saved_game.write<>(parentOriginalTrueBoneMatrix); + saved_game.write(originalOrigin); + saved_game.write(originalAngles); + saved_game.write(lastShotDir); + saved_game.write(basepose); + saved_game.write(baseposeInv); + saved_game.write(baseposeParent); + saved_game.write(baseposeInvParent); + saved_game.write(parentRawBoneIndex); + saved_game.write<>(ragOverrideMatrix); + saved_game.write<>(extraMatrix); + saved_game.write(extraVec1); + saved_game.write(extraFloat1); + saved_game.write(extraInt1); + saved_game.write(ikPosition); + saved_game.write(ikSpeed); + saved_game.write(epVelocity); + saved_game.write(epGravFactor); + saved_game.write(solidCount); + saved_game.write(physicsSettled); + saved_game.write(snapped); + saved_game.skip(2); + saved_game.write(parentBoneIndex); + saved_game.write(offsetRotation); + saved_game.write(overGradSpeed); + saved_game.write(overGoalSpot); + saved_game.write(hasOverGoal); + saved_game.skip(3); + saved_game.write<>(animFrameMatrix); + saved_game.write(hasAnimFrameMatrix); + saved_game.write(airTime); #endif // !JK2_MODE } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(boneNumber); - saved_game->read<>(matrix); - saved_game->read(flags); - saved_game->read(startFrame); - saved_game->read(endFrame); - saved_game->read(startTime); - saved_game->read(pauseTime); - saved_game->read(animSpeed); - saved_game->read(blendFrame); - saved_game->read(blendLerpFrame); - saved_game->read(blendTime); - saved_game->read(blendStart); - saved_game->read(boneBlendTime); - saved_game->read(boneBlendStart); - saved_game->read(newMatrix); + saved_game.read(boneNumber); + saved_game.read<>(matrix); + saved_game.read(flags); + saved_game.read(startFrame); + saved_game.read(endFrame); + saved_game.read(startTime); + saved_game.read(pauseTime); + saved_game.read(animSpeed); + saved_game.read(blendFrame); + saved_game.read(blendLerpFrame); + saved_game.read(blendTime); + saved_game.read(blendStart); + saved_game.read(boneBlendTime); + saved_game.read(boneBlendStart); + saved_game.read(newMatrix); #ifndef JK2_MODE - saved_game->read(lastTimeUpdated); - saved_game->read(lastContents); - saved_game->read(lastPosition); - saved_game->read(velocityEffector); - saved_game->read(lastAngles); - saved_game->read(minAngles); - saved_game->read(maxAngles); - saved_game->read(currentAngles); - saved_game->read(anglesOffset); - saved_game->read(positionOffset); - saved_game->read(radius); - saved_game->read(weight); - saved_game->read(ragIndex); - saved_game->read(velocityRoot); - saved_game->read(ragStartTime); - saved_game->read(firstTime); - saved_game->read(firstCollisionTime); - saved_game->read(restTime); - saved_game->read(RagFlags); - saved_game->read(DependentRagIndexMask); - saved_game->read<>(originalTrueBoneMatrix); - saved_game->read<>(parentTrueBoneMatrix); - saved_game->read<>(parentOriginalTrueBoneMatrix); - saved_game->read(originalOrigin); - saved_game->read(originalAngles); - saved_game->read(lastShotDir); - saved_game->read(basepose); - saved_game->read(baseposeInv); - saved_game->read(baseposeParent); - saved_game->read(baseposeInvParent); - saved_game->read(parentRawBoneIndex); - saved_game->read<>(ragOverrideMatrix); - saved_game->read<>(extraMatrix); - saved_game->read(extraVec1); - saved_game->read(extraFloat1); - saved_game->read(extraInt1); - saved_game->read(ikPosition); - saved_game->read(ikSpeed); - saved_game->read(epVelocity); - saved_game->read(epGravFactor); - saved_game->read(solidCount); - saved_game->read(physicsSettled); - saved_game->read(snapped); - saved_game->skip(2); - saved_game->read(parentBoneIndex); - saved_game->read(offsetRotation); - saved_game->read(overGradSpeed); - saved_game->read(overGoalSpot); - saved_game->read(hasOverGoal); - saved_game->skip(3); - saved_game->read<>(animFrameMatrix); - saved_game->read(hasAnimFrameMatrix); - saved_game->read(airTime); + saved_game.read(lastTimeUpdated); + saved_game.read(lastContents); + saved_game.read(lastPosition); + saved_game.read(velocityEffector); + saved_game.read(lastAngles); + saved_game.read(minAngles); + saved_game.read(maxAngles); + saved_game.read(currentAngles); + saved_game.read(anglesOffset); + saved_game.read(positionOffset); + saved_game.read(radius); + saved_game.read(weight); + saved_game.read(ragIndex); + saved_game.read(velocityRoot); + saved_game.read(ragStartTime); + saved_game.read(firstTime); + saved_game.read(firstCollisionTime); + saved_game.read(restTime); + saved_game.read(RagFlags); + saved_game.read(DependentRagIndexMask); + saved_game.read<>(originalTrueBoneMatrix); + saved_game.read<>(parentTrueBoneMatrix); + saved_game.read<>(parentOriginalTrueBoneMatrix); + saved_game.read(originalOrigin); + saved_game.read(originalAngles); + saved_game.read(lastShotDir); + saved_game.read(basepose); + saved_game.read(baseposeInv); + saved_game.read(baseposeParent); + saved_game.read(baseposeInvParent); + saved_game.read(parentRawBoneIndex); + saved_game.read<>(ragOverrideMatrix); + saved_game.read<>(extraMatrix); + saved_game.read(extraVec1); + saved_game.read(extraFloat1); + saved_game.read(extraInt1); + saved_game.read(ikPosition); + saved_game.read(ikSpeed); + saved_game.read(epVelocity); + saved_game.read(epGravFactor); + saved_game.read(solidCount); + saved_game.read(physicsSettled); + saved_game.read(snapped); + saved_game.skip(2); + saved_game.read(parentBoneIndex); + saved_game.read(offsetRotation); + saved_game.read(overGradSpeed); + saved_game.read(overGoalSpot); + saved_game.read(hasOverGoal); + saved_game.skip(3); + saved_game.read<>(animFrameMatrix); + saved_game.read(hasAnimFrameMatrix); + saved_game.read(airTime); #endif // JK2_MODE } }; @@ -382,21 +382,21 @@ struct boltInfo_t{ void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(boneNumber); - saved_game->write(surfaceNumber); - saved_game->write(surfaceType); - saved_game->write(boltUsed); + saved_game.write(boneNumber); + saved_game.write(surfaceNumber); + saved_game.write(surfaceType); + saved_game.write(boltUsed); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(boneNumber); - saved_game->read(surfaceNumber); - saved_game->read(surfaceType); - saved_game->read(boltUsed); + saved_game.read(boneNumber); + saved_game.read(surfaceNumber); + saved_game.read(surfaceType); + saved_game.read(boltUsed); } }; @@ -516,59 +516,59 @@ class CGhoul2Info void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(mModelindex); + saved_game.write(mModelindex); #ifndef JK2_MODE - saved_game->write(animModelIndexOffset); + saved_game.write(animModelIndexOffset); #endif // !JK2_MODE - saved_game->write(mCustomShader); - saved_game->write(mCustomSkin); - saved_game->write(mModelBoltLink); - saved_game->write(mSurfaceRoot); - saved_game->write(mLodBias); - saved_game->write(mNewOrigin); + saved_game.write(mCustomShader); + saved_game.write(mCustomSkin); + saved_game.write(mModelBoltLink); + saved_game.write(mSurfaceRoot); + saved_game.write(mLodBias); + saved_game.write(mNewOrigin); #ifdef _G2_GORE - saved_game->write(mGoreSetTag); + saved_game.write(mGoreSetTag); #endif // _G2_GORE - saved_game->write(mModel); - saved_game->write(mFileName); - saved_game->write(mAnimFrameDefault); - saved_game->write(mSkelFrameNum); - saved_game->write(mMeshFrameNum); - saved_game->write(mFlags); + saved_game.write(mModel); + saved_game.write(mFileName); + saved_game.write(mAnimFrameDefault); + saved_game.write(mSkelFrameNum); + saved_game.write(mMeshFrameNum); + saved_game.write(mFlags); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(mModelindex); + saved_game.read(mModelindex); #ifndef JK2_MODE - saved_game->read(animModelIndexOffset); + saved_game.read(animModelIndexOffset); #endif // !JK2_MODE - saved_game->read(mCustomShader); - saved_game->read(mCustomSkin); - saved_game->read(mModelBoltLink); - saved_game->read(mSurfaceRoot); - saved_game->read(mLodBias); - saved_game->read(mNewOrigin); + saved_game.read(mCustomShader); + saved_game.read(mCustomSkin); + saved_game.read(mModelBoltLink); + saved_game.read(mSurfaceRoot); + saved_game.read(mLodBias); + saved_game.read(mNewOrigin); #ifdef _G2_GORE - saved_game->read(mGoreSetTag); + saved_game.read(mGoreSetTag); #endif // _G2_GORE - saved_game->read(mModel); - saved_game->read(mFileName); - saved_game->read(mAnimFrameDefault); - saved_game->read(mSkelFrameNum); - saved_game->read(mMeshFrameNum); - saved_game->read(mFlags); + saved_game.read(mModel); + saved_game.read(mFileName); + saved_game.read(mAnimFrameDefault); + saved_game.read(mSkelFrameNum); + saved_game.read(mMeshFrameNum); + saved_game.read(mFlags); } }; @@ -723,15 +723,15 @@ class CGhoul2Info_v void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(mItem); + saved_game.write(mItem); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(mItem); + saved_game.read(mItem); } }; @@ -764,37 +764,37 @@ class CCollisionRecord void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(mDistance); - saved_game->write(mEntityNum); - saved_game->write(mModelIndex); - saved_game->write(mPolyIndex); - saved_game->write(mSurfaceIndex); - saved_game->write(mCollisionPosition); - saved_game->write(mCollisionNormal); - saved_game->write(mFlags); - saved_game->write(mMaterial); - saved_game->write(mLocation); - saved_game->write(mBarycentricI); - saved_game->write(mBarycentricJ); + saved_game.write(mDistance); + saved_game.write(mEntityNum); + saved_game.write(mModelIndex); + saved_game.write(mPolyIndex); + saved_game.write(mSurfaceIndex); + saved_game.write(mCollisionPosition); + saved_game.write(mCollisionNormal); + saved_game.write(mFlags); + saved_game.write(mMaterial); + saved_game.write(mLocation); + saved_game.write(mBarycentricI); + saved_game.write(mBarycentricJ); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(mDistance); - saved_game->read(mEntityNum); - saved_game->read(mModelIndex); - saved_game->read(mPolyIndex); - saved_game->read(mSurfaceIndex); - saved_game->read(mCollisionPosition); - saved_game->read(mCollisionNormal); - saved_game->read(mFlags); - saved_game->read(mMaterial); - saved_game->read(mLocation); - saved_game->read(mBarycentricI); - saved_game->read(mBarycentricJ); + saved_game.read(mDistance); + saved_game.read(mEntityNum); + saved_game.read(mModelIndex); + saved_game.read(mPolyIndex); + saved_game.read(mSurfaceIndex); + saved_game.read(mCollisionPosition); + saved_game.read(mCollisionNormal); + saved_game.read(mFlags); + saved_game.read(mMaterial); + saved_game.read(mLocation); + saved_game.read(mBarycentricI); + saved_game.read(mBarycentricJ); } }; diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index e0b1c5b91d..7ba36bc715 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -33,7 +33,7 @@ along with this program; if not, see . #include "../qcommon/q_shared.h" #include "../qcommon/qcommon.h" -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" #define STL_ITERATE( a, b ) for ( a = b.begin(); a != b.end(); ++a ) #define STL_INSERT( a, b ) a.insert( a.end(), b ); @@ -538,14 +538,16 @@ int CIcarus::Save() CreateBuffer(); IGameInterface* game = IGameInterface::GetGame(m_flavor); - auto saved_game = game->get_saved_game(); + + ojk::SavedGameFileHelper sgfh( + game->get_saved_game_file()); //Save out a ICARUS save block header with the ICARUS version double version = ICARUS_VERSION; - saved_game->write_chunk( - INT_ID('I','C','A','R'), - version); + sgfh.write_chunk( + INT_ID('I', 'C', 'A', 'R'), + version); //Save out the signals if ( SaveSignals() == false ) @@ -569,10 +571,10 @@ int CIcarus::Save() } // Write out the buffer with all our collected data. - saved_game->write_chunk( - INT_ID('I','S','E','Q'), - m_byBuffer, - static_cast(m_ulBufferCurPos)); + sgfh.write_chunk( + INT_ID('I', 'S', 'E', 'Q'), + m_byBuffer, + static_cast(m_ulBufferCurPos)); // De-allocate the temporary buffer. DestroyBuffer(); @@ -685,7 +687,9 @@ int CIcarus::Load() CreateBuffer(); IGameInterface* game = IGameInterface::GetGame(m_flavor); - auto saved_game = game->get_saved_game(); + + ojk::SavedGameFileHelper sgfh( + game->get_saved_game_file()); //Clear out any old information Free(); @@ -693,9 +697,9 @@ int CIcarus::Load() //Check to make sure we're at the ICARUS save block double version; - saved_game->read_chunk( - INT_ID('I','C','A','R'), - version); + sgfh.read_chunk( + INT_ID('I', 'C', 'A', 'R'), + version); //Versions must match! if ( version != ICARUS_VERSION ) @@ -706,18 +710,18 @@ int CIcarus::Load() } // Read into the buffer all our data. - saved_game->read_chunk( - INT_ID('I','S','E','Q')); + sgfh.read_chunk( + INT_ID('I','S','E','Q')); - auto sg_buffer_data = static_cast( - saved_game->get_buffer_data()); + auto sg_buffer_data = static_cast( + sgfh.get_buffer_data()); - const auto sg_buffer_size = saved_game->get_buffer_size(); + const auto sg_buffer_size = sgfh.get_buffer_size(); - std::uninitialized_copy_n( - sg_buffer_data, - sg_buffer_size, - m_byBuffer); + std::uninitialized_copy_n( + sg_buffer_data, + sg_buffer_size, + m_byBuffer); //Load all signals if ( LoadSignals() == false ) @@ -806,10 +810,13 @@ void CIcarus::BufferWrite( void *pSrcData, unsigned long ulNumBytesToWrite ) { // Write out the buffer with all our collected data so far... IGameInterface::GetGame()->DebugPrint( IGameInterface::WL_ERROR, "BufferWrite: Out of buffer space, Flushing." ); - IGameInterface::GetGame()->get_saved_game()->write_chunk( - INT_ID('I','S','E','Q'), - m_byBuffer, - static_cast(m_ulBufferCurPos)); + ojk::SavedGameFileHelper sgfh( + IGameInterface::GetGame()->get_saved_game_file()); + + sgfh.write_chunk( + INT_ID('I', 'S', 'E', 'Q'), + m_byBuffer, + static_cast(m_ulBufferCurPos)); m_ulBufferCurPos = 0; //reset buffer } @@ -833,20 +840,21 @@ void CIcarus::BufferRead( void *pDstBuff, unsigned long ulNumBytesToRead ) IGameInterface::GetGame()->DebugPrint( IGameInterface::WL_ERROR, "BufferRead: Buffer underflow, Looking for new block." ); // Read in the next block. - auto saved_game = IGameInterface::GetGame()->get_saved_game(); + ojk::SavedGameFileHelper sgfh( + IGameInterface::GetGame()->get_saved_game_file()); - saved_game->read_chunk( - INT_ID('I','S','E','Q')); + sgfh.read_chunk( + INT_ID('I', 'S', 'E', 'Q')); - auto sg_buffer_data = static_cast( - saved_game->get_buffer_data()); + auto sg_buffer_data = static_cast( + sgfh.get_buffer_data()); - const auto sg_buffer_size = saved_game->get_buffer_size(); + const auto sg_buffer_size = sgfh.get_buffer_size(); - std::uninitialized_copy_n( - sg_buffer_data, - sg_buffer_size, - m_byBuffer); + std::uninitialized_copy_n( + sg_buffer_data, + sg_buffer_size, + m_byBuffer); m_ulBytesRead = 0; //reset buffer } diff --git a/code/icarus/IcarusInterface.h b/code/icarus/IcarusInterface.h index c953db1b86..26265c197b 100644 --- a/code/icarus/IcarusInterface.h +++ b/code/icarus/IcarusInterface.h @@ -145,7 +145,7 @@ class IGameInterface // Save / Load functions virtual int LinkGame( int gameID, int icarusID ) = 0; - virtual ojk::ISavedGame* get_saved_game() = 0; + virtual ojk::ISavedGameFile* get_saved_game_file() = 0; // Access functions diff --git a/code/qcommon/cm_load.cpp b/code/qcommon/cm_load.cpp index c2b0e547d3..459ead779d 100644 --- a/code/qcommon/cm_load.cpp +++ b/code/qcommon/cm_load.cpp @@ -24,7 +24,8 @@ along with this program; if not, see . // cmodel.c -- model loading #include "cm_local.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_file.h" +#include "qcommon/ojk_saved_game_file_helper.h" #ifdef BSPC void SetPlaneSignbits (cplane_t *out) { @@ -1214,14 +1215,15 @@ Writes the portal state to a savegame file qboolean SG_Append(unsigned int chid, const void *data, int length); int SG_Read(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPtr = NULL); -void CM_WritePortalState () +void CM_WritePortalState() { - auto saved_game = &ojk::SavedGame::get_instance(); + ojk::SavedGameFileHelper sgfh( + &ojk::SavedGameFile::get_instance()); - saved_game->write_chunk( - INT_ID('P','R','T','S'), - ::cmg.areaPortals, - ::cmg.numAreas * ::cmg.numAreas); + sgfh.write_chunk( + INT_ID('P', 'R', 'T', 'S'), + ::cmg.areaPortals, + ::cmg.numAreas * ::cmg.numAreas); } /* @@ -1232,17 +1234,15 @@ Reads the portal state from a savegame file and recalculates the area connections =================== */ -void CM_ReadPortalState () +void CM_ReadPortalState() { - //auto saved_game = static_cast( - // &ojk::SavedGame::get_instance()); - auto saved_game = &ojk::SavedGame::get_instance(); + ojk::SavedGameFileHelper sgfh( + &ojk::SavedGameFile::get_instance()); - saved_game->read_chunk( - INT_ID('P','R','T','S'), - ::cmg.areaPortals, - ::cmg.numAreas * ::cmg.numAreas); + sgfh.read_chunk( + INT_ID('P', 'R', 'T', 'S'), + ::cmg.areaPortals, + ::cmg.numAreas * ::cmg.numAreas); CM_FloodAreaConnections (cmg); } - diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 83a92dd835..96cadd8d15 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -162,7 +162,7 @@ float FloatSwap( const float *f ); #include "qcommon/q_platform.h" -#include "qcommon/ojk_i_saved_game_fwd.h" +#include "qcommon/ojk_saved_game_file_helper_fwd.h" // ================================================================ @@ -1233,23 +1233,23 @@ typedef struct cplane_s { void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(normal); - saved_game->write(dist); - saved_game->write(type); - saved_game->write(signbits); - saved_game->write(pad); + saved_game.write(normal); + saved_game.write(dist); + saved_game.write(type); + saved_game.write(signbits); + saved_game.write(pad); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(normal); - saved_game->read(dist); - saved_game->read(type); - saved_game->read(signbits); - saved_game->read(pad); + saved_game.read(normal); + saved_game.read(dist); + saved_game.read(type); + saved_game.read(signbits); + saved_game.read(pad); } } cplane_t; @@ -1286,31 +1286,31 @@ Ghoul2 Insert End void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(allsolid); - saved_game->write(startsolid); - saved_game->write(fraction); - saved_game->write(endpos); - saved_game->write<>(plane); - saved_game->write(surfaceFlags); - saved_game->write(contents); - saved_game->write(entityNum); - saved_game->write<>(G2CollisionMap); + saved_game.write(allsolid); + saved_game.write(startsolid); + saved_game.write(fraction); + saved_game.write(endpos); + saved_game.write<>(plane); + saved_game.write(surfaceFlags); + saved_game.write(contents); + saved_game.write(entityNum); + saved_game.write<>(G2CollisionMap); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(allsolid); - saved_game->read(startsolid); - saved_game->read(fraction); - saved_game->read(endpos); - saved_game->read<>(plane); - saved_game->read(surfaceFlags); - saved_game->read(contents); - saved_game->read(entityNum); - saved_game->read<>(G2CollisionMap); + saved_game.read(allsolid); + saved_game.read(startsolid); + saved_game.read(fraction); + saved_game.read(endpos); + saved_game.read<>(plane); + saved_game.read(surfaceFlags); + saved_game.read(contents); + saved_game.read(entityNum); + saved_game.read<>(G2CollisionMap); } } trace_t; @@ -1585,29 +1585,29 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(inAction); - saved_game->write(duration); - saved_game->write(lastTime); - saved_game->write(base); - saved_game->write(tip); - saved_game->write(haveOldPos); - saved_game->write(oldPos); - saved_game->write(oldNormal); + saved_game.write(inAction); + saved_game.write(duration); + saved_game.write(lastTime); + saved_game.write(base); + saved_game.write(tip); + saved_game.write(haveOldPos); + saved_game.write(oldPos); + saved_game.write(oldNormal); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(inAction); - saved_game->read(duration); - saved_game->read(lastTime); - saved_game->read(base); - saved_game->read(tip); - saved_game->read(haveOldPos); - saved_game->read(oldPos); - saved_game->read(oldNormal); + saved_game.read(inAction); + saved_game.read(duration); + saved_game.read(lastTime); + saved_game.read(base); + saved_game.read(tip); + saved_game.read(haveOldPos); + saved_game.read(oldPos); + saved_game.read(oldNormal); } } saberTrail_t; @@ -1640,35 +1640,35 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(active); - saved_game->write(color); - saved_game->write(radius); - saved_game->write(length); - saved_game->write(lengthMax); - saved_game->write(lengthOld); - saved_game->write(muzzlePoint); - saved_game->write(muzzlePointOld); - saved_game->write(muzzleDir); - saved_game->write(muzzleDirOld); - saved_game->write<>(trail); + saved_game.write(active); + saved_game.write(color); + saved_game.write(radius); + saved_game.write(length); + saved_game.write(lengthMax); + saved_game.write(lengthOld); + saved_game.write(muzzlePoint); + saved_game.write(muzzlePointOld); + saved_game.write(muzzleDir); + saved_game.write(muzzleDirOld); + saved_game.write<>(trail); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(active); - saved_game->read(color); - saved_game->read(radius); - saved_game->read(length); - saved_game->read(lengthMax); - saved_game->read(lengthOld); - saved_game->read(muzzlePoint); - saved_game->read(muzzlePointOld); - saved_game->read(muzzleDir); - saved_game->read(muzzleDirOld); - saved_game->read<>(trail); + saved_game.read(active); + saved_game.read(color); + saved_game.read(radius); + saved_game.read(length); + saved_game.read(lengthMax); + saved_game.read(lengthOld); + saved_game.read(muzzlePoint); + saved_game.read(muzzlePointOld); + saved_game.read(muzzleDir); + saved_game.read(muzzleDirOld); + saved_game.read<>(trail); } } bladeInfo_t; @@ -1961,165 +1961,165 @@ typedef struct void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(name); - saved_game->write(fullName); - saved_game->write(type); - saved_game->write(model); - saved_game->write(skin); - saved_game->write(soundOn); - saved_game->write(soundLoop); - saved_game->write(soundOff); - saved_game->write(numBlades); - saved_game->write<>(blade); - saved_game->write(stylesLearned); - saved_game->write(stylesForbidden); - saved_game->write(maxChain); - saved_game->write(forceRestrictions); - saved_game->write(lockBonus); - saved_game->write(parryBonus); - saved_game->write(breakParryBonus); - saved_game->write(breakParryBonus2); - saved_game->write(disarmBonus); - saved_game->write(disarmBonus2); - saved_game->write(singleBladeStyle); - saved_game->write(brokenSaber1); - saved_game->write(brokenSaber2); - saved_game->write(saberFlags); - saved_game->write(saberFlags2); - saved_game->write(spinSound); - saved_game->write(swingSound); - saved_game->write(fallSound); - saved_game->write(moveSpeedScale); - saved_game->write(animSpeedScale); - saved_game->write(kataMove); - saved_game->write(lungeAtkMove); - saved_game->write(jumpAtkUpMove); - saved_game->write(jumpAtkFwdMove); - saved_game->write(jumpAtkBackMove); - saved_game->write(jumpAtkRightMove); - saved_game->write(jumpAtkLeftMove); - saved_game->write(readyAnim); - saved_game->write(drawAnim); - saved_game->write(putawayAnim); - saved_game->write(tauntAnim); - saved_game->write(bowAnim); - saved_game->write(meditateAnim); - saved_game->write(flourishAnim); - saved_game->write(gloatAnim); - saved_game->write(bladeStyle2Start); - saved_game->write(trailStyle); - saved_game->write(g2MarksShader); - saved_game->write(g2WeaponMarkShader); - saved_game->write(hitSound); - saved_game->write(blockSound); - saved_game->write(bounceSound); - saved_game->write(blockEffect); - saved_game->write(hitPersonEffect); - saved_game->write(hitOtherEffect); - saved_game->write(bladeEffect); - saved_game->write(knockbackScale); - saved_game->write(damageScale); - saved_game->write(splashRadius); - saved_game->write(splashDamage); - saved_game->write(splashKnockback); - saved_game->write(trailStyle2); - saved_game->write(g2MarksShader2); - saved_game->write(g2WeaponMarkShader2); - saved_game->write(hit2Sound); - saved_game->write(block2Sound); - saved_game->write(bounce2Sound); - saved_game->write(blockEffect2); - saved_game->write(hitPersonEffect2); - saved_game->write(hitOtherEffect2); - saved_game->write(bladeEffect2); - saved_game->write(knockbackScale2); - saved_game->write(damageScale2); - saved_game->write(splashRadius2); - saved_game->write(splashDamage2); - saved_game->write(splashKnockback2); + saved_game.write(name); + saved_game.write(fullName); + saved_game.write(type); + saved_game.write(model); + saved_game.write(skin); + saved_game.write(soundOn); + saved_game.write(soundLoop); + saved_game.write(soundOff); + saved_game.write(numBlades); + saved_game.write<>(blade); + saved_game.write(stylesLearned); + saved_game.write(stylesForbidden); + saved_game.write(maxChain); + saved_game.write(forceRestrictions); + saved_game.write(lockBonus); + saved_game.write(parryBonus); + saved_game.write(breakParryBonus); + saved_game.write(breakParryBonus2); + saved_game.write(disarmBonus); + saved_game.write(disarmBonus2); + saved_game.write(singleBladeStyle); + saved_game.write(brokenSaber1); + saved_game.write(brokenSaber2); + saved_game.write(saberFlags); + saved_game.write(saberFlags2); + saved_game.write(spinSound); + saved_game.write(swingSound); + saved_game.write(fallSound); + saved_game.write(moveSpeedScale); + saved_game.write(animSpeedScale); + saved_game.write(kataMove); + saved_game.write(lungeAtkMove); + saved_game.write(jumpAtkUpMove); + saved_game.write(jumpAtkFwdMove); + saved_game.write(jumpAtkBackMove); + saved_game.write(jumpAtkRightMove); + saved_game.write(jumpAtkLeftMove); + saved_game.write(readyAnim); + saved_game.write(drawAnim); + saved_game.write(putawayAnim); + saved_game.write(tauntAnim); + saved_game.write(bowAnim); + saved_game.write(meditateAnim); + saved_game.write(flourishAnim); + saved_game.write(gloatAnim); + saved_game.write(bladeStyle2Start); + saved_game.write(trailStyle); + saved_game.write(g2MarksShader); + saved_game.write(g2WeaponMarkShader); + saved_game.write(hitSound); + saved_game.write(blockSound); + saved_game.write(bounceSound); + saved_game.write(blockEffect); + saved_game.write(hitPersonEffect); + saved_game.write(hitOtherEffect); + saved_game.write(bladeEffect); + saved_game.write(knockbackScale); + saved_game.write(damageScale); + saved_game.write(splashRadius); + saved_game.write(splashDamage); + saved_game.write(splashKnockback); + saved_game.write(trailStyle2); + saved_game.write(g2MarksShader2); + saved_game.write(g2WeaponMarkShader2); + saved_game.write(hit2Sound); + saved_game.write(block2Sound); + saved_game.write(bounce2Sound); + saved_game.write(blockEffect2); + saved_game.write(hitPersonEffect2); + saved_game.write(hitOtherEffect2); + saved_game.write(bladeEffect2); + saved_game.write(knockbackScale2); + saved_game.write(damageScale2); + saved_game.write(splashRadius2); + saved_game.write(splashDamage2); + saved_game.write(splashKnockback2); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(name); - saved_game->read(fullName); - saved_game->read(type); - saved_game->read(model); - saved_game->read(skin); - saved_game->read(soundOn); - saved_game->read(soundLoop); - saved_game->read(soundOff); - saved_game->read(numBlades); - saved_game->read<>(blade); - saved_game->read(stylesLearned); - saved_game->read(stylesForbidden); - saved_game->read(maxChain); - saved_game->read(forceRestrictions); - saved_game->read(lockBonus); - saved_game->read(parryBonus); - saved_game->read(breakParryBonus); - saved_game->read(breakParryBonus2); - saved_game->read(disarmBonus); - saved_game->read(disarmBonus2); - saved_game->read(singleBladeStyle); - saved_game->read(brokenSaber1); - saved_game->read(brokenSaber2); - saved_game->read(saberFlags); - saved_game->read(saberFlags2); - saved_game->read(spinSound); - saved_game->read(swingSound); - saved_game->read(fallSound); - saved_game->read(moveSpeedScale); - saved_game->read(animSpeedScale); - saved_game->read(kataMove); - saved_game->read(lungeAtkMove); - saved_game->read(jumpAtkUpMove); - saved_game->read(jumpAtkFwdMove); - saved_game->read(jumpAtkBackMove); - saved_game->read(jumpAtkRightMove); - saved_game->read(jumpAtkLeftMove); - saved_game->read(readyAnim); - saved_game->read(drawAnim); - saved_game->read(putawayAnim); - saved_game->read(tauntAnim); - saved_game->read(bowAnim); - saved_game->read(meditateAnim); - saved_game->read(flourishAnim); - saved_game->read(gloatAnim); - saved_game->read(bladeStyle2Start); - saved_game->read(trailStyle); - saved_game->read(g2MarksShader); - saved_game->read(g2WeaponMarkShader); - saved_game->read(hitSound); - saved_game->read(blockSound); - saved_game->read(bounceSound); - saved_game->read(blockEffect); - saved_game->read(hitPersonEffect); - saved_game->read(hitOtherEffect); - saved_game->read(bladeEffect); - saved_game->read(knockbackScale); - saved_game->read(damageScale); - saved_game->read(splashRadius); - saved_game->read(splashDamage); - saved_game->read(splashKnockback); - saved_game->read(trailStyle2); - saved_game->read(g2MarksShader2); - saved_game->read(g2WeaponMarkShader2); - saved_game->read(hit2Sound); - saved_game->read(block2Sound); - saved_game->read(bounce2Sound); - saved_game->read(blockEffect2); - saved_game->read(hitPersonEffect2); - saved_game->read(hitOtherEffect2); - saved_game->read(bladeEffect2); - saved_game->read(knockbackScale2); - saved_game->read(damageScale2); - saved_game->read(splashRadius2); - saved_game->read(splashDamage2); - saved_game->read(splashKnockback2); + saved_game.read(name); + saved_game.read(fullName); + saved_game.read(type); + saved_game.read(model); + saved_game.read(skin); + saved_game.read(soundOn); + saved_game.read(soundLoop); + saved_game.read(soundOff); + saved_game.read(numBlades); + saved_game.read<>(blade); + saved_game.read(stylesLearned); + saved_game.read(stylesForbidden); + saved_game.read(maxChain); + saved_game.read(forceRestrictions); + saved_game.read(lockBonus); + saved_game.read(parryBonus); + saved_game.read(breakParryBonus); + saved_game.read(breakParryBonus2); + saved_game.read(disarmBonus); + saved_game.read(disarmBonus2); + saved_game.read(singleBladeStyle); + saved_game.read(brokenSaber1); + saved_game.read(brokenSaber2); + saved_game.read(saberFlags); + saved_game.read(saberFlags2); + saved_game.read(spinSound); + saved_game.read(swingSound); + saved_game.read(fallSound); + saved_game.read(moveSpeedScale); + saved_game.read(animSpeedScale); + saved_game.read(kataMove); + saved_game.read(lungeAtkMove); + saved_game.read(jumpAtkUpMove); + saved_game.read(jumpAtkFwdMove); + saved_game.read(jumpAtkBackMove); + saved_game.read(jumpAtkRightMove); + saved_game.read(jumpAtkLeftMove); + saved_game.read(readyAnim); + saved_game.read(drawAnim); + saved_game.read(putawayAnim); + saved_game.read(tauntAnim); + saved_game.read(bowAnim); + saved_game.read(meditateAnim); + saved_game.read(flourishAnim); + saved_game.read(gloatAnim); + saved_game.read(bladeStyle2Start); + saved_game.read(trailStyle); + saved_game.read(g2MarksShader); + saved_game.read(g2WeaponMarkShader); + saved_game.read(hitSound); + saved_game.read(blockSound); + saved_game.read(bounceSound); + saved_game.read(blockEffect); + saved_game.read(hitPersonEffect); + saved_game.read(hitOtherEffect); + saved_game.read(bladeEffect); + saved_game.read(knockbackScale); + saved_game.read(damageScale); + saved_game.read(splashRadius); + saved_game.read(splashDamage); + saved_game.read(splashKnockback); + saved_game.read(trailStyle2); + saved_game.read(g2MarksShader2); + saved_game.read(g2WeaponMarkShader2); + saved_game.read(hit2Sound); + saved_game.read(block2Sound); + saved_game.read(bounce2Sound); + saved_game.read(blockEffect2); + saved_game.read(hitPersonEffect2); + saved_game.read(hitOtherEffect2); + saved_game.read(bladeEffect2); + saved_game.read(knockbackScale2); + saved_game.read(damageScale2); + saved_game.read(splashRadius2); + saved_game.read(splashDamage2); + saved_game.read(splashKnockback2); } } saberInfo_t; @@ -2243,67 +2243,67 @@ class saberInfoRetail_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(name); - saved_game->write(fullName); - saved_game->write(type); - saved_game->write(model); - saved_game->write(skin); - saved_game->write(soundOn); - saved_game->write(soundLoop); - saved_game->write(soundOff); - saved_game->write(numBlades); - saved_game->write<>(blade); - saved_game->write(style); - saved_game->write(maxChain); - saved_game->write(lockable); - saved_game->write(throwable); - saved_game->write(disarmable); - saved_game->write(activeBlocking); - saved_game->write(twoHanded); - saved_game->write(forceRestrictions); - saved_game->write(lockBonus); - saved_game->write(parryBonus); - saved_game->write(breakParryBonus); - saved_game->write(disarmBonus); - saved_game->write(singleBladeStyle); - saved_game->write(singleBladeThrowable); - saved_game->write(brokenSaber1); - saved_game->write(brokenSaber2); - saved_game->write(returnDamage); + saved_game.write(name); + saved_game.write(fullName); + saved_game.write(type); + saved_game.write(model); + saved_game.write(skin); + saved_game.write(soundOn); + saved_game.write(soundLoop); + saved_game.write(soundOff); + saved_game.write(numBlades); + saved_game.write<>(blade); + saved_game.write(style); + saved_game.write(maxChain); + saved_game.write(lockable); + saved_game.write(throwable); + saved_game.write(disarmable); + saved_game.write(activeBlocking); + saved_game.write(twoHanded); + saved_game.write(forceRestrictions); + saved_game.write(lockBonus); + saved_game.write(parryBonus); + saved_game.write(breakParryBonus); + saved_game.write(disarmBonus); + saved_game.write(singleBladeStyle); + saved_game.write(singleBladeThrowable); + saved_game.write(brokenSaber1); + saved_game.write(brokenSaber2); + saved_game.write(returnDamage); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(name); - saved_game->read(fullName); - saved_game->read(type); - saved_game->read(model); - saved_game->read(skin); - saved_game->read(soundOn); - saved_game->read(soundLoop); - saved_game->read(soundOff); - saved_game->read(numBlades); - saved_game->read<>(blade); - saved_game->read(style); - saved_game->read(maxChain); - saved_game->read(lockable); - saved_game->read(throwable); - saved_game->read(disarmable); - saved_game->read(activeBlocking); - saved_game->read(twoHanded); - saved_game->read(forceRestrictions); - saved_game->read(lockBonus); - saved_game->read(parryBonus); - saved_game->read(breakParryBonus); - saved_game->read(disarmBonus); - saved_game->read(singleBladeStyle); - saved_game->read(singleBladeThrowable); - saved_game->read(brokenSaber1); - saved_game->read(brokenSaber2); - saved_game->read(returnDamage); + saved_game.read(name); + saved_game.read(fullName); + saved_game.read(type); + saved_game.read(model); + saved_game.read(skin); + saved_game.read(soundOn); + saved_game.read(soundLoop); + saved_game.read(soundOff); + saved_game.read(numBlades); + saved_game.read<>(blade); + saved_game.read(style); + saved_game.read(maxChain); + saved_game.read(lockable); + saved_game.read(throwable); + saved_game.read(disarmable); + saved_game.read(activeBlocking); + saved_game.read(twoHanded); + saved_game.read(forceRestrictions); + saved_game.read(lockBonus); + saved_game.read(parryBonus); + saved_game.read(breakParryBonus); + saved_game.read(disarmBonus); + saved_game.read(singleBladeStyle); + saved_game.read(singleBladeThrowable); + saved_game.read(brokenSaber1); + saved_game.read(brokenSaber2); + saved_game.read(returnDamage); } void sg_export( @@ -2652,340 +2652,340 @@ class PlayerStateBase void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(commandTime); - saved_game->write(pm_type); - saved_game->write(bobCycle); - saved_game->write(pm_flags); - saved_game->write(pm_time); - saved_game->write(origin); - saved_game->write(velocity); - saved_game->write(weaponTime); - saved_game->write(weaponChargeTime); - saved_game->write(rechargeTime); - saved_game->write(gravity); - saved_game->write(leanofs); - saved_game->write(friction); - saved_game->write(speed); - saved_game->write(delta_angles); - saved_game->write(groundEntityNum); - saved_game->write(legsAnim); - saved_game->write(legsAnimTimer); - saved_game->write(torsoAnim); - saved_game->write(torsoAnimTimer); - saved_game->write(movementDir); - saved_game->write(eFlags); - saved_game->write(eventSequence); - saved_game->write(events); - saved_game->write(eventParms); - saved_game->write(externalEvent); - saved_game->write(externalEventParm); - saved_game->write(externalEventTime); - saved_game->write(clientNum); - saved_game->write(weapon); - saved_game->write(weaponstate); - saved_game->write(batteryCharge); - saved_game->write(viewangles); - saved_game->write(legsYaw); - saved_game->write(viewheight); - saved_game->write(damageEvent); - saved_game->write(damageYaw); - saved_game->write(damagePitch); - saved_game->write(damageCount); - saved_game->write(stats); - saved_game->write(persistant); - saved_game->write(powerups); - saved_game->write(ammo); - saved_game->write(inventory); - saved_game->write(security_key_message); - saved_game->write(serverViewOrg); - saved_game->write(saberInFlight); + saved_game.write(commandTime); + saved_game.write(pm_type); + saved_game.write(bobCycle); + saved_game.write(pm_flags); + saved_game.write(pm_time); + saved_game.write(origin); + saved_game.write(velocity); + saved_game.write(weaponTime); + saved_game.write(weaponChargeTime); + saved_game.write(rechargeTime); + saved_game.write(gravity); + saved_game.write(leanofs); + saved_game.write(friction); + saved_game.write(speed); + saved_game.write(delta_angles); + saved_game.write(groundEntityNum); + saved_game.write(legsAnim); + saved_game.write(legsAnimTimer); + saved_game.write(torsoAnim); + saved_game.write(torsoAnimTimer); + saved_game.write(movementDir); + saved_game.write(eFlags); + saved_game.write(eventSequence); + saved_game.write(events); + saved_game.write(eventParms); + saved_game.write(externalEvent); + saved_game.write(externalEventParm); + saved_game.write(externalEventTime); + saved_game.write(clientNum); + saved_game.write(weapon); + saved_game.write(weaponstate); + saved_game.write(batteryCharge); + saved_game.write(viewangles); + saved_game.write(legsYaw); + saved_game.write(viewheight); + saved_game.write(damageEvent); + saved_game.write(damageYaw); + saved_game.write(damagePitch); + saved_game.write(damageCount); + saved_game.write(stats); + saved_game.write(persistant); + saved_game.write(powerups); + saved_game.write(ammo); + saved_game.write(inventory); + saved_game.write(security_key_message); + saved_game.write(serverViewOrg); + saved_game.write(saberInFlight); #ifdef JK2_MODE - saved_game->write(saberActive); - saved_game->write(vehicleModel); - saved_game->write(viewEntity); - saved_game->write(saberColor); - saved_game->write(saberLength); - saved_game->write(saberLengthMax); - saved_game->write(forcePowersActive); + saved_game.write(saberActive); + saved_game.write(vehicleModel); + saved_game.write(viewEntity); + saved_game.write(saberColor); + saved_game.write(saberLength); + saved_game.write(saberLengthMax); + saved_game.write(forcePowersActive); #else - saved_game->write(viewEntity); - saved_game->write(forcePowersActive); + saved_game.write(viewEntity); + saved_game.write(forcePowersActive); #endif // JK2_MODE - saved_game->write(useTime); - saved_game->write(lastShotTime); - saved_game->write(ping); - saved_game->write(lastOnGround); - saved_game->write(lastStationary); - saved_game->write(weaponShotCount); + saved_game.write(useTime); + saved_game.write(lastShotTime); + saved_game.write(ping); + saved_game.write(lastOnGround); + saved_game.write(lastStationary); + saved_game.write(weaponShotCount); #ifndef JK2_MODE - saved_game->write<>(saber); - saved_game->write(dualSabers); + saved_game.write<>(saber); + saved_game.write(dualSabers); #endif // !JK2_MODE - saved_game->write(saberMove); + saved_game.write(saberMove); #ifndef JK2_MODE - saved_game->write(saberMoveNext); + saved_game.write(saberMoveNext); #endif // !JK2_MODE - saved_game->write(saberBounceMove); - saved_game->write(saberBlocking); - saved_game->write(saberBlocked); - saved_game->write(leanStopDebounceTime); + saved_game.write(saberBounceMove); + saved_game.write(saberBlocking); + saved_game.write(saberBlocked); + saved_game.write(leanStopDebounceTime); #ifdef JK2_MODE - saved_game->skip(2); - saved_game->write(saberLengthOld); + saved_game.skip(2); + saved_game.write(saberLengthOld); #endif // JK2_MODE - saved_game->write(saberEntityNum); - saved_game->write(saberEntityDist); - saved_game->write(saberThrowTime); - saved_game->write(saberEntityState); - saved_game->write(saberDamageDebounceTime); - saved_game->write(saberHitWallSoundDebounceTime); - saved_game->write(saberEventFlags); - saved_game->write(saberBlockingTime); - saved_game->write(saberAnimLevel); - saved_game->write(saberAttackChainCount); - saved_game->write(saberLockTime); - saved_game->write(saberLockEnemy); + saved_game.write(saberEntityNum); + saved_game.write(saberEntityDist); + saved_game.write(saberThrowTime); + saved_game.write(saberEntityState); + saved_game.write(saberDamageDebounceTime); + saved_game.write(saberHitWallSoundDebounceTime); + saved_game.write(saberEventFlags); + saved_game.write(saberBlockingTime); + saved_game.write(saberAnimLevel); + saved_game.write(saberAttackChainCount); + saved_game.write(saberLockTime); + saved_game.write(saberLockEnemy); #ifndef JK2_MODE - saved_game->write(saberStylesKnown); + saved_game.write(saberStylesKnown); #endif // !JK2_MODE #ifdef JK2_MODE - saved_game->write(saberModel); + saved_game.write(saberModel); #endif // JK2_MODE - saved_game->write(forcePowersKnown); - saved_game->write(forcePowerDuration); - saved_game->write(forcePowerDebounce); - saved_game->write(forcePower); - saved_game->write(forcePowerMax); - saved_game->write(forcePowerRegenDebounceTime); + saved_game.write(forcePowersKnown); + saved_game.write(forcePowerDuration); + saved_game.write(forcePowerDebounce); + saved_game.write(forcePower); + saved_game.write(forcePowerMax); + saved_game.write(forcePowerRegenDebounceTime); #ifndef JK2_MODE - saved_game->write(forcePowerRegenRate); - saved_game->write(forcePowerRegenAmount); + saved_game.write(forcePowerRegenRate); + saved_game.write(forcePowerRegenAmount); #endif // !JK2_MODE - saved_game->write(forcePowerLevel); - saved_game->write(forceJumpZStart); - saved_game->write(forceJumpCharge); - saved_game->write(forceGripEntityNum); - saved_game->write(forceGripOrg); + saved_game.write(forcePowerLevel); + saved_game.write(forceJumpZStart); + saved_game.write(forceJumpCharge); + saved_game.write(forceGripEntityNum); + saved_game.write(forceGripOrg); #ifndef JK2_MODE - saved_game->write(forceDrainEntityNum); - saved_game->write(forceDrainOrg); + saved_game.write(forceDrainEntityNum); + saved_game.write(forceDrainOrg); #endif // !JK2_MODE - saved_game->write(forceHealCount); + saved_game.write(forceHealCount); #ifndef JK2_MODE - saved_game->write(forceAllowDeactivateTime); - saved_game->write(forceRageDrainTime); - saved_game->write(forceRageRecoveryTime); - saved_game->write(forceDrainEntNum); - saved_game->write(forceDrainTime); - saved_game->write(forcePowersForced); - saved_game->write(pullAttackEntNum); - saved_game->write(pullAttackTime); - saved_game->write(lastKickedEntNum); + saved_game.write(forceAllowDeactivateTime); + saved_game.write(forceRageDrainTime); + saved_game.write(forceRageRecoveryTime); + saved_game.write(forceDrainEntNum); + saved_game.write(forceDrainTime); + saved_game.write(forcePowersForced); + saved_game.write(pullAttackEntNum); + saved_game.write(pullAttackTime); + saved_game.write(lastKickedEntNum); #endif // !JK2_MODE - saved_game->write(taunting); - saved_game->write(jumpZStart); - saved_game->write(moveDir); - saved_game->write(waterheight); - saved_game->write(waterHeightLevel); + saved_game.write(taunting); + saved_game.write(jumpZStart); + saved_game.write(moveDir); + saved_game.write(waterheight); + saved_game.write(waterHeightLevel); #ifndef JK2_MODE - saved_game->write(ikStatus); - saved_game->write(heldClient); - saved_game->write(heldByClient); - saved_game->write(heldByBolt); - saved_game->write(heldByBone); - saved_game->write(vehTurnaroundIndex); - saved_game->write(vehTurnaroundTime); - saved_game->write(brokenLimbs); - saved_game->write(electrifyTime); + saved_game.write(ikStatus); + saved_game.write(heldClient); + saved_game.write(heldByClient); + saved_game.write(heldByBolt); + saved_game.write(heldByBone); + saved_game.write(vehTurnaroundIndex); + saved_game.write(vehTurnaroundTime); + saved_game.write(brokenLimbs); + saved_game.write(electrifyTime); #endif // !JK2_MODE } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(commandTime); - saved_game->read(pm_type); - saved_game->read(bobCycle); - saved_game->read(pm_flags); - saved_game->read(pm_time); - saved_game->read(origin); - saved_game->read(velocity); - saved_game->read(weaponTime); - saved_game->read(weaponChargeTime); - saved_game->read(rechargeTime); - saved_game->read(gravity); - saved_game->read(leanofs); - saved_game->read(friction); - saved_game->read(speed); - saved_game->read(delta_angles); - saved_game->read(groundEntityNum); - saved_game->read(legsAnim); - saved_game->read(legsAnimTimer); - saved_game->read(torsoAnim); - saved_game->read(torsoAnimTimer); - saved_game->read(movementDir); - saved_game->read(eFlags); - saved_game->read(eventSequence); - saved_game->read(events); - saved_game->read(eventParms); - saved_game->read(externalEvent); - saved_game->read(externalEventParm); - saved_game->read(externalEventTime); - saved_game->read(clientNum); - saved_game->read(weapon); - saved_game->read(weaponstate); - saved_game->read(batteryCharge); - saved_game->read(viewangles); - saved_game->read(legsYaw); - saved_game->read(viewheight); - saved_game->read(damageEvent); - saved_game->read(damageYaw); - saved_game->read(damagePitch); - saved_game->read(damageCount); - saved_game->read(stats); - saved_game->read(persistant); - saved_game->read(powerups); - saved_game->read(ammo); - saved_game->read(inventory); - saved_game->read(security_key_message); - saved_game->read(serverViewOrg); - saved_game->read(saberInFlight); + saved_game.read(commandTime); + saved_game.read(pm_type); + saved_game.read(bobCycle); + saved_game.read(pm_flags); + saved_game.read(pm_time); + saved_game.read(origin); + saved_game.read(velocity); + saved_game.read(weaponTime); + saved_game.read(weaponChargeTime); + saved_game.read(rechargeTime); + saved_game.read(gravity); + saved_game.read(leanofs); + saved_game.read(friction); + saved_game.read(speed); + saved_game.read(delta_angles); + saved_game.read(groundEntityNum); + saved_game.read(legsAnim); + saved_game.read(legsAnimTimer); + saved_game.read(torsoAnim); + saved_game.read(torsoAnimTimer); + saved_game.read(movementDir); + saved_game.read(eFlags); + saved_game.read(eventSequence); + saved_game.read(events); + saved_game.read(eventParms); + saved_game.read(externalEvent); + saved_game.read(externalEventParm); + saved_game.read(externalEventTime); + saved_game.read(clientNum); + saved_game.read(weapon); + saved_game.read(weaponstate); + saved_game.read(batteryCharge); + saved_game.read(viewangles); + saved_game.read(legsYaw); + saved_game.read(viewheight); + saved_game.read(damageEvent); + saved_game.read(damageYaw); + saved_game.read(damagePitch); + saved_game.read(damageCount); + saved_game.read(stats); + saved_game.read(persistant); + saved_game.read(powerups); + saved_game.read(ammo); + saved_game.read(inventory); + saved_game.read(security_key_message); + saved_game.read(serverViewOrg); + saved_game.read(saberInFlight); #ifdef JK2_MODE - saved_game->read(saberActive); - saved_game->read(vehicleModel); - saved_game->read(viewEntity); - saved_game->read(saberColor); - saved_game->read(saberLength); - saved_game->read(saberLengthMax); - saved_game->read(forcePowersActive); + saved_game.read(saberActive); + saved_game.read(vehicleModel); + saved_game.read(viewEntity); + saved_game.read(saberColor); + saved_game.read(saberLength); + saved_game.read(saberLengthMax); + saved_game.read(forcePowersActive); #else - saved_game->read(viewEntity); - saved_game->read(forcePowersActive); + saved_game.read(viewEntity); + saved_game.read(forcePowersActive); #endif // JK2_MODE - saved_game->read(useTime); - saved_game->read(lastShotTime); - saved_game->read(ping); - saved_game->read(lastOnGround); - saved_game->read(lastStationary); - saved_game->read(weaponShotCount); + saved_game.read(useTime); + saved_game.read(lastShotTime); + saved_game.read(ping); + saved_game.read(lastOnGround); + saved_game.read(lastStationary); + saved_game.read(weaponShotCount); #ifndef JK2_MODE - saved_game->read<>(saber); - saved_game->read(dualSabers); + saved_game.read<>(saber); + saved_game.read(dualSabers); #endif // !JK2_MODE - saved_game->read(saberMove); + saved_game.read(saberMove); #ifndef JK2_MODE - saved_game->read(saberMoveNext); + saved_game.read(saberMoveNext); #endif // !JK2_MODE - saved_game->read(saberBounceMove); - saved_game->read(saberBlocking); - saved_game->read(saberBlocked); - saved_game->read(leanStopDebounceTime); + saved_game.read(saberBounceMove); + saved_game.read(saberBlocking); + saved_game.read(saberBlocked); + saved_game.read(leanStopDebounceTime); #ifdef JK2_MODE - saved_game->skip(2); - saved_game->read(saberLengthOld); + saved_game.skip(2); + saved_game.read(saberLengthOld); #endif // JK2_MODE - saved_game->read(saberEntityNum); - saved_game->read(saberEntityDist); - saved_game->read(saberThrowTime); - saved_game->read(saberEntityState); - saved_game->read(saberDamageDebounceTime); - saved_game->read(saberHitWallSoundDebounceTime); - saved_game->read(saberEventFlags); - saved_game->read(saberBlockingTime); - saved_game->read(saberAnimLevel); - saved_game->read(saberAttackChainCount); - saved_game->read(saberLockTime); - saved_game->read(saberLockEnemy); + saved_game.read(saberEntityNum); + saved_game.read(saberEntityDist); + saved_game.read(saberThrowTime); + saved_game.read(saberEntityState); + saved_game.read(saberDamageDebounceTime); + saved_game.read(saberHitWallSoundDebounceTime); + saved_game.read(saberEventFlags); + saved_game.read(saberBlockingTime); + saved_game.read(saberAnimLevel); + saved_game.read(saberAttackChainCount); + saved_game.read(saberLockTime); + saved_game.read(saberLockEnemy); #ifndef JK2_MODE - saved_game->read(saberStylesKnown); + saved_game.read(saberStylesKnown); #endif // !JK2_MODE #ifdef JK2_MODE - saved_game->read(saberModel); + saved_game.read(saberModel); #endif // JK2_MODE - saved_game->read(forcePowersKnown); - saved_game->read(forcePowerDuration); - saved_game->read(forcePowerDebounce); - saved_game->read(forcePower); - saved_game->read(forcePowerMax); - saved_game->read(forcePowerRegenDebounceTime); + saved_game.read(forcePowersKnown); + saved_game.read(forcePowerDuration); + saved_game.read(forcePowerDebounce); + saved_game.read(forcePower); + saved_game.read(forcePowerMax); + saved_game.read(forcePowerRegenDebounceTime); #ifndef JK2_MODE - saved_game->read(forcePowerRegenRate); - saved_game->read(forcePowerRegenAmount); + saved_game.read(forcePowerRegenRate); + saved_game.read(forcePowerRegenAmount); #endif // !JK2_MODE - saved_game->read(forcePowerLevel); - saved_game->read(forceJumpZStart); - saved_game->read(forceJumpCharge); - saved_game->read(forceGripEntityNum); - saved_game->read(forceGripOrg); + saved_game.read(forcePowerLevel); + saved_game.read(forceJumpZStart); + saved_game.read(forceJumpCharge); + saved_game.read(forceGripEntityNum); + saved_game.read(forceGripOrg); #ifndef JK2_MODE - saved_game->read(forceDrainEntityNum); - saved_game->read(forceDrainOrg); + saved_game.read(forceDrainEntityNum); + saved_game.read(forceDrainOrg); #endif // !JK2_MODE - saved_game->read(forceHealCount); + saved_game.read(forceHealCount); #ifndef JK2_MODE - saved_game->read(forceAllowDeactivateTime); - saved_game->read(forceRageDrainTime); - saved_game->read(forceRageRecoveryTime); - saved_game->read(forceDrainEntNum); - saved_game->read(forceDrainTime); - saved_game->read(forcePowersForced); - saved_game->read(pullAttackEntNum); - saved_game->read(pullAttackTime); - saved_game->read(lastKickedEntNum); + saved_game.read(forceAllowDeactivateTime); + saved_game.read(forceRageDrainTime); + saved_game.read(forceRageRecoveryTime); + saved_game.read(forceDrainEntNum); + saved_game.read(forceDrainTime); + saved_game.read(forcePowersForced); + saved_game.read(pullAttackEntNum); + saved_game.read(pullAttackTime); + saved_game.read(lastKickedEntNum); #endif // !JK2_MODE - saved_game->read(taunting); - saved_game->read(jumpZStart); - saved_game->read(moveDir); - saved_game->read(waterheight); - saved_game->read(waterHeightLevel); + saved_game.read(taunting); + saved_game.read(jumpZStart); + saved_game.read(moveDir); + saved_game.read(waterheight); + saved_game.read(waterHeightLevel); #ifndef JK2_MODE - saved_game->read(ikStatus); - saved_game->read(heldClient); - saved_game->read(heldByClient); - saved_game->read(heldByBolt); - saved_game->read(heldByBone); - saved_game->read(vehTurnaroundIndex); - saved_game->read(vehTurnaroundTime); - saved_game->read(brokenLimbs); - saved_game->read(electrifyTime); + saved_game.read(ikStatus); + saved_game.read(heldClient); + saved_game.read(heldByClient); + saved_game.read(heldByBolt); + saved_game.read(heldByBone); + saved_game.read(vehTurnaroundIndex); + saved_game.read(vehTurnaroundTime); + saved_game.read(brokenLimbs); + saved_game.read(electrifyTime); #endif // !JK2_MODE } }; // PlayerStateBase @@ -3047,31 +3047,31 @@ typedef struct usercmd_s { void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(serverTime); - saved_game->write(buttons); - saved_game->write(weapon); - saved_game->skip(3); - saved_game->write(angles); - saved_game->write(generic_cmd); - saved_game->write(forwardmove); - saved_game->write(rightmove); - saved_game->write(upmove); + saved_game.write(serverTime); + saved_game.write(buttons); + saved_game.write(weapon); + saved_game.skip(3); + saved_game.write(angles); + saved_game.write(generic_cmd); + saved_game.write(forwardmove); + saved_game.write(rightmove); + saved_game.write(upmove); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(serverTime); - saved_game->read(buttons); - saved_game->read(weapon); - saved_game->skip(3); - saved_game->read(angles); - saved_game->read(generic_cmd); - saved_game->read(forwardmove); - saved_game->read(rightmove); - saved_game->read(upmove); + saved_game.read(serverTime); + saved_game.read(buttons); + saved_game.read(weapon); + saved_game.skip(3); + saved_game.read(angles); + saved_game.read(generic_cmd); + saved_game.read(forwardmove); + saved_game.read(rightmove); + saved_game.read(upmove); } } usercmd_t; @@ -3099,23 +3099,23 @@ typedef struct {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(trType); - saved_game->write(trTime); - saved_game->write(trDuration); - saved_game->write(trBase); - saved_game->write(trDelta); + saved_game.write(trType); + saved_game.write(trTime); + saved_game.write(trDuration); + saved_game.write(trBase); + saved_game.write(trDelta); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(trType); - saved_game->read(trTime); - saved_game->read(trDuration); - saved_game->read(trBase); - saved_game->read(trDelta); + saved_game.read(trType); + saved_game.read(trTime); + saved_game.read(trDuration); + saved_game.read(trBase); + saved_game.read(trDelta); } } trajectory_t; @@ -3205,114 +3205,114 @@ Ghoul2 Insert End void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(number); - saved_game->write(eType); - saved_game->write(eFlags); - saved_game->write<>(pos); - saved_game->write<>(apos); - saved_game->write(time); - saved_game->write(time2); - saved_game->write(origin); - saved_game->write(origin2); - saved_game->write(angles); - saved_game->write(angles2); - saved_game->write(otherEntityNum); - saved_game->write(otherEntityNum2); - saved_game->write(groundEntityNum); - saved_game->write(constantLight); - saved_game->write(loopSound); - saved_game->write(modelindex); - saved_game->write(modelindex2); - saved_game->write(modelindex3); - saved_game->write(clientNum); - saved_game->write(frame); - saved_game->write(solid); - saved_game->write(event); - saved_game->write(eventParm); - saved_game->write(powerups); - saved_game->write(weapon); - saved_game->write(legsAnim); - saved_game->write(legsAnimTimer); - saved_game->write(torsoAnim); - saved_game->write(torsoAnimTimer); - saved_game->write(scale); - saved_game->write(saberInFlight); - saved_game->write(saberActive); + saved_game.write(number); + saved_game.write(eType); + saved_game.write(eFlags); + saved_game.write<>(pos); + saved_game.write<>(apos); + saved_game.write(time); + saved_game.write(time2); + saved_game.write(origin); + saved_game.write(origin2); + saved_game.write(angles); + saved_game.write(angles2); + saved_game.write(otherEntityNum); + saved_game.write(otherEntityNum2); + saved_game.write(groundEntityNum); + saved_game.write(constantLight); + saved_game.write(loopSound); + saved_game.write(modelindex); + saved_game.write(modelindex2); + saved_game.write(modelindex3); + saved_game.write(clientNum); + saved_game.write(frame); + saved_game.write(solid); + saved_game.write(event); + saved_game.write(eventParm); + saved_game.write(powerups); + saved_game.write(weapon); + saved_game.write(legsAnim); + saved_game.write(legsAnimTimer); + saved_game.write(torsoAnim); + saved_game.write(torsoAnimTimer); + saved_game.write(scale); + saved_game.write(saberInFlight); + saved_game.write(saberActive); #ifdef JK2_MODE - saved_game->write(vehicleModel); + saved_game.write(vehicleModel); #endif // JK2_MODE #ifndef JK2_MODE - saved_game->write(vehicleAngles); - saved_game->write(vehicleArmor); - saved_game->write(m_iVehicleNum); + saved_game.write(vehicleAngles); + saved_game.write(vehicleArmor); + saved_game.write(m_iVehicleNum); #endif // !JK2_MODE - saved_game->write(modelScale); - saved_game->write(radius); - saved_game->write(boltInfo); + saved_game.write(modelScale); + saved_game.write(radius); + saved_game.write(boltInfo); #ifndef JK2_MODE - saved_game->write(isPortalEnt); + saved_game.write(isPortalEnt); #endif // !JK2_MODE } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(number); - saved_game->read(eType); - saved_game->read(eFlags); - saved_game->read<>(pos); - saved_game->read<>(apos); - saved_game->read(time); - saved_game->read(time2); - saved_game->read(origin); - saved_game->read(origin2); - saved_game->read(angles); - saved_game->read(angles2); - saved_game->read(otherEntityNum); - saved_game->read(otherEntityNum2); - saved_game->read(groundEntityNum); - saved_game->read(constantLight); - saved_game->read(loopSound); - saved_game->read(modelindex); - saved_game->read(modelindex2); - saved_game->read(modelindex3); - saved_game->read(clientNum); - saved_game->read(frame); - saved_game->read(solid); - saved_game->read(event); - saved_game->read(eventParm); - saved_game->read(powerups); - saved_game->read(weapon); - saved_game->read(legsAnim); - saved_game->read(legsAnimTimer); - saved_game->read(torsoAnim); - saved_game->read(torsoAnimTimer); - saved_game->read(scale); - saved_game->read(saberInFlight); - saved_game->read(saberActive); + saved_game.read(number); + saved_game.read(eType); + saved_game.read(eFlags); + saved_game.read<>(pos); + saved_game.read<>(apos); + saved_game.read(time); + saved_game.read(time2); + saved_game.read(origin); + saved_game.read(origin2); + saved_game.read(angles); + saved_game.read(angles2); + saved_game.read(otherEntityNum); + saved_game.read(otherEntityNum2); + saved_game.read(groundEntityNum); + saved_game.read(constantLight); + saved_game.read(loopSound); + saved_game.read(modelindex); + saved_game.read(modelindex2); + saved_game.read(modelindex3); + saved_game.read(clientNum); + saved_game.read(frame); + saved_game.read(solid); + saved_game.read(event); + saved_game.read(eventParm); + saved_game.read(powerups); + saved_game.read(weapon); + saved_game.read(legsAnim); + saved_game.read(legsAnimTimer); + saved_game.read(torsoAnim); + saved_game.read(torsoAnimTimer); + saved_game.read(scale); + saved_game.read(saberInFlight); + saved_game.read(saberActive); #ifdef JK2_MODE - saved_game->read(vehicleModel); + saved_game.read(vehicleModel); #endif // JK2_MODE #ifndef JK2_MODE - saved_game->read(vehicleAngles); - saved_game->read(vehicleArmor); - saved_game->read(m_iVehicleNum); + saved_game.read(vehicleAngles); + saved_game.read(vehicleArmor); + saved_game.read(m_iVehicleNum); #endif // !JK2_MODE - saved_game->read(modelScale); - saved_game->read(radius); - saved_game->read(boltInfo); + saved_game.read(modelScale); + saved_game.read(radius); + saved_game.read(boltInfo); #ifndef JK2_MODE - saved_game->read(isPortalEnt); + saved_game.read(isPortalEnt); #endif // !JK2_MODE } } entityState_t; diff --git a/code/rd-common/mdx_format.h b/code/rd-common/mdx_format.h index 3637e8a9f2..14e4c16c56 100644 --- a/code/rd-common/mdx_format.h +++ b/code/rd-common/mdx_format.h @@ -164,15 +164,15 @@ typedef struct { #ifdef __cplusplus void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(matrix); + saved_game.write(matrix); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(matrix); + saved_game.read(matrix); } #endif // __cplusplus } mdxaBone_t; diff --git a/code/rd-common/tr_public.h b/code/rd-common/tr_public.h index f14af68715..7af64cb024 100644 --- a/code/rd-common/tr_public.h +++ b/code/rd-common/tr_public.h @@ -112,7 +112,7 @@ typedef struct { const int passEntityNum, const int contentmask, const EG2_Collision eG2TraceType, const int useLod ); - ojk::ISavedGame* saved_game; + ojk::ISavedGameFile* saved_game; int (*SV_PointContents) ( const vec3_t p, clipHandle_t model ); diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index c3025e2ea3..08f06ed8d1 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -79,8 +79,6 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SharedDir}/qcommon/ojk_i_saved_game_file.h" - "${SharedDir}/qcommon/ojk_saved_game_file.h" - "${SharedDir}/qcommon/ojk_saved_game_file.cpp" "${SharedDir}/qcommon/ojk_saved_game_file_helper.h" "${SharedDir}/qcommon/ojk_saved_game_file_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index 436c4a66fb..cb85f4e8f9 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -48,7 +48,7 @@ along with this program; if not, see . #include -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" #ifdef _G2_GORE #include "../ghoul2/ghoul2_gore.h" @@ -1782,184 +1782,200 @@ const auto BONE_SAVE_BLOCK_SIZE = static_cast(sizeof(SgBoneInfo)); void G2_SaveGhoul2Models( - CGhoul2Info_v& ghoul2) + CGhoul2Info_v& ghoul2) { - ::ri.saved_game->reset_buffer(); + ojk::SavedGameFileHelper sgfh( + ::ri.saved_game); - // is there anything to save? - if (!ghoul2.IsValid() || ghoul2.size() == 0) { - const int zero_size = 0; + sgfh.reset_buffer(); + + // is there anything to save? + if (!ghoul2.IsValid() || ghoul2.size() == 0) + { + const int zero_size = 0; #ifdef JK2_MODE - ::ri.saved_game->write( + sgfh.write( zero_size); - ::ri.saved_game->write_chunk_and_size( - INT_ID('G', 'L', '2', 'S'), - INT_ID('G', 'H', 'L', '2')); + sgfh.write_chunk_and_size( + INT_ID('G', 'L', '2', 'S'), + INT_ID('G', 'H', 'L', '2')); #else - ::ri.saved_game->write_chunk( - INT_ID('G', 'H', 'L', '2'), - zero_size); //write out a zero buffer + sgfh.write_chunk( + INT_ID('G', 'H', 'L', '2'), + zero_size); //write out a zero buffer #endif // JK2_MODE - return; - } + return; + } - // save out how many ghoul2 models we have - auto model_count = ghoul2.size(); + // save out how many ghoul2 models we have + auto model_count = ghoul2.size(); - ::ri.saved_game->write( - model_count); + sgfh.write( + model_count); - for (decltype(model_count) i = 0; i < model_count; ++i) { - // first save out the ghoul2 details themselves - ghoul2[i].sg_export( - ::ri.saved_game); + for (decltype(model_count) i = 0; i < model_count; ++i) + { + // first save out the ghoul2 details themselves + ghoul2[i].sg_export( + sgfh); - // save out how many surfaces we have - auto surface_count = ghoul2[i].mSlist.size(); + // save out how many surfaces we have + auto surface_count = ghoul2[i].mSlist.size(); - ::ri.saved_game->write( - surface_count); + sgfh.write( + surface_count); - // now save the all the surface list info - for (decltype(surface_count) x = 0; x < surface_count; ++x) { - ghoul2[i].mSlist[x].sg_export( - ::ri.saved_game); - } + // now save the all the surface list info + for (decltype(surface_count) x = 0; x < surface_count; ++x) + { + ghoul2[i].mSlist[x].sg_export( + sgfh); + } - // save out how many bones we have - auto bone_count = ghoul2[i].mBlist.size(); + // save out how many bones we have + auto bone_count = ghoul2[i].mBlist.size(); - ::ri.saved_game->write( - bone_count); + sgfh.write( + bone_count); - // now save the all the bone list info - for (decltype(bone_count) x = 0; x < bone_count; ++x) { - ghoul2[i].mBlist[x].sg_export( - ::ri.saved_game); - } + // now save the all the bone list info + for (decltype(bone_count) x = 0; x < bone_count; ++x) + { + ghoul2[i].mBlist[x].sg_export( + sgfh); + } - // save out how many bolts we have - auto bolt_count = ghoul2[i].mBltlist.size(); + // save out how many bolts we have + auto bolt_count = ghoul2[i].mBltlist.size(); - ::ri.saved_game->write( - bolt_count); + sgfh.write( + bolt_count); - // lastly save the all the bolt list info - for (decltype(bolt_count) x = 0; x < bolt_count; ++x) - { - ghoul2[i].mBltlist[x].sg_export( - ::ri.saved_game); - } - } + // lastly save the all the bolt list info + for (decltype(bolt_count) x = 0; x < bolt_count; ++x) + { + ghoul2[i].mBltlist[x].sg_export( + sgfh); + } + } #ifdef JK2_MODE - ::ri.saved_game->write_chunk_and_size( - INT_ID('G', 'L', '2', 'S'), - INT_ID('G', 'H', 'L', '2')); + sgfh.write_chunk_and_size( + INT_ID('G', 'L', '2', 'S'), + INT_ID('G', 'H', 'L', '2')); #else - ::ri.saved_game->write_chunk( - INT_ID('G', 'H', 'L', '2')); + sgfh.write_chunk( + INT_ID('G', 'H', 'L', '2')); #endif // JK2_MODE } // FIXME Remove 'buffer' parameter void G2_LoadGhoul2Model( - CGhoul2Info_v& ghoul2, - char* buffer) + CGhoul2Info_v& ghoul2, + char* buffer) { - static_cast(buffer); + static_cast(buffer); + + ojk::SavedGameFileHelper sgfh( + ::ri.saved_game); - // first thing, lets see how many ghoul2 models we have, and resize our buffers accordingly - auto model_count = 0; + // first thing, lets see how many ghoul2 models we have, and resize our buffers accordingly + int model_count = 0; #ifdef JK2_MODE - if (::ri.saved_game->get_buffer_size() > 0) + if (sgfh.get_buffer_size() > 0) { #endif // JK2_MODE - ::ri.saved_game->read( - model_count); + sgfh.read( + model_count); #ifdef JK2_MODE } #endif // JK2_MODE - ghoul2.resize( - model_count); + ghoul2.resize( + model_count); - // did we actually resize to a value? - if (model_count == 0) { - // no, ok, well, done then. - return; - } + // did we actually resize to a value? + if (model_count == 0) + { + // no, ok, well, done then. + return; + } - // now we have enough instances, lets go through each one and load up the relevant details - for (decltype(model_count) i = 0; i < model_count; ++i) { - ghoul2[i].mSkelFrameNum = 0; - ghoul2[i].mModelindex = -1; - ghoul2[i].mFileName[0] = 0; - ghoul2[i].mValid = false; + // now we have enough instances, lets go through each one and load up the relevant details + for (decltype(model_count) i = 0; i < model_count; ++i) + { + ghoul2[i].mSkelFrameNum = 0; + ghoul2[i].mModelindex = -1; + ghoul2[i].mFileName[0] = 0; + ghoul2[i].mValid = false; - // load the ghoul2 info from the buffer - ghoul2[i].sg_import( - ::ri.saved_game); + // load the ghoul2 info from the buffer + ghoul2[i].sg_import( + sgfh); - if (ghoul2[i].mModelindex != -1 && ghoul2[i].mFileName[0]) { - ghoul2[i].mModelindex = i; + if (ghoul2[i].mModelindex != -1 && ghoul2[i].mFileName[0]) + { + ghoul2[i].mModelindex = i; - ::G2_SetupModelPointers( - &ghoul2[i]); - } + ::G2_SetupModelPointers( + &ghoul2[i]); + } - // give us enough surfaces to load up the data - auto surface_count = 0; + // give us enough surfaces to load up the data + auto surface_count = 0; - ::ri.saved_game->read( - surface_count); + sgfh.read( + surface_count); - ghoul2[i].mSlist.resize(surface_count); + ghoul2[i].mSlist.resize(surface_count); - // now load all the surfaces - for (decltype(surface_count) x = 0; x < surface_count; ++x) { - ghoul2[i].mSlist[x].sg_import( - ::ri.saved_game); - } + // now load all the surfaces + for (decltype(surface_count) x = 0; x < surface_count; ++x) + { + ghoul2[i].mSlist[x].sg_import( + sgfh); + } - // give us enough bones to load up the data - auto bone_count = 0; + // give us enough bones to load up the data + auto bone_count = 0; - ::ri.saved_game->read( - bone_count); + sgfh.read( + bone_count); - ghoul2[i].mBlist.resize( - bone_count); + ghoul2[i].mBlist.resize( + bone_count); - // now load all the bones - for (decltype(bone_count) x = 0; x < bone_count; ++x) { - ghoul2[i].mBlist[x].sg_import( - ::ri.saved_game); - } + // now load all the bones + for (decltype(bone_count) x = 0; x < bone_count; ++x) + { + ghoul2[i].mBlist[x].sg_import( + sgfh); + } - // give us enough bolts to load up the data - auto bolt_count = 0; + // give us enough bolts to load up the data + auto bolt_count = 0; - ::ri.saved_game->read( - bolt_count); + sgfh.read( + bolt_count); - ghoul2[i].mBltlist.resize( - bolt_count); + ghoul2[i].mBltlist.resize( + bolt_count); - // now load all the bolts - for (decltype(bolt_count) x = 0; x < bolt_count; ++x) { - ghoul2[i].mBltlist[x].sg_import( - ::ri.saved_game); - } - } + // now load all the bolts + for (decltype(bolt_count) x = 0; x < bolt_count; ++x) + { + ghoul2[i].mBltlist[x].sg_import( + sgfh); + } + } - ::ri.saved_game->ensure_all_data_read(); + sgfh.ensure_all_data_read(); } diff --git a/code/server/sv_game.cpp b/code/server/sv_game.cpp index 916c5c4dfd..65b2d6aba6 100644 --- a/code/server/sv_game.cpp +++ b/code/server/sv_game.cpp @@ -30,7 +30,7 @@ along with this program; if not, see . #include "server.h" #include "../client/vmachine.h" #include "../client/client.h" -#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_file.h" /*#include "..\renderer\tr_local.h" #include "..\renderer\tr_WorldEffects.h"*/ /* @@ -944,7 +944,7 @@ void SV_InitGameProgs (void) { import.FS_FreeFile = FS_FreeFile; import.FS_GetFileList = FS_GetFileList; - import.saved_game = &ojk::SavedGame::get_instance(); + import.saved_game = &ojk::SavedGameFile::get_instance(); import.AdjustAreaPortalState = SV_AdjustAreaPortalState; import.AreasConnected = CM_AreasConnected; diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 167014a89b..02deab7bdc 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -37,8 +37,9 @@ along with this program; if not, see . #include -#include "qcommon/ojk_saved_game.h" -#include "qcommon/ojk_saved_game_exception.h" +#include "qcommon/ojk_saved_game_file.h" +#include "qcommon/ojk_saved_game_file_helper.h" + static char saveGameComment[iSG_COMMENT_SIZE]; @@ -111,7 +112,7 @@ static const char *GetString_FailedToOpenSaveGame(const char *psFilename, qboole void SG_WipeSavegame( const char* psPathlessBaseName) { - ojk::SavedGame::remove( + ojk::SavedGameFile::remove( psPathlessBaseName); } @@ -120,9 +121,9 @@ void SG_WipeSavegame( // void SG_Shutdown() { - auto saved_game = &ojk::SavedGame::get_instance(); + auto& saved_game = ojk::SavedGameFile::get_instance(); - saved_game->close(); + saved_game.close(); eSavedGameJustLoaded = eNO; // important to do this if we ERR_DROP during loading, else next map you load after @@ -397,11 +398,12 @@ void SV_SaveGame_f(void) //--------------- static void WriteGame(qboolean autosave) { - auto saved_game = &ojk::SavedGame::get_instance(); + ojk::SavedGameFileHelper sgfh( + &ojk::SavedGameFile::get_instance()); - saved_game->write_chunk( - INT_ID('G','A','M','E'), - autosave); + sgfh.write_chunk( + INT_ID('G', 'A', 'M', 'E'), + autosave); if (autosave) { @@ -417,36 +419,36 @@ static void WriteGame(qboolean autosave) memset(s,0,sizeof(s)); Cvar_VariableStringBuffer( sCVARNAME_PLAYERSAVE, s, sizeof(s) ); - saved_game->write_chunk( - INT_ID('C','V','S','V'), - s); + sgfh.write_chunk( + INT_ID('C', 'V', 'S', 'V'), + s); // write ammo... // memset(s,0,sizeof(s)); Cvar_VariableStringBuffer( "playerammo", s, sizeof(s) ); - saved_game->write_chunk( - INT_ID('A','M','M','O'), - s); + sgfh.write_chunk( + INT_ID('A', 'M', 'M', 'O'), + s); // write inventory... // memset(s,0,sizeof(s)); Cvar_VariableStringBuffer( "playerinv", s, sizeof(s) ); - saved_game->write_chunk( - INT_ID('I','V','T','Y'), - s); + sgfh.write_chunk( + INT_ID('I', 'V', 'T', 'Y'), + s); // the new JK2 stuff - force powers, etc... // memset(s,0,sizeof(s)); Cvar_VariableStringBuffer( "playerfplvl", s, sizeof(s) ); - saved_game->write_chunk( - INT_ID('F','P','L','V'), - s); + sgfh.write_chunk( + INT_ID('F', 'P', 'L', 'V'), + s); } } @@ -454,11 +456,12 @@ static qboolean ReadGame (void) { qboolean qbAutoSave; - auto saved_game = &ojk::SavedGame::get_instance(); + ojk::SavedGameFileHelper sgfh( + &ojk::SavedGameFile::get_instance()); - saved_game->read_chunk( - INT_ID('G','A','M','E'), - qbAutoSave); + sgfh.read_chunk( + INT_ID('G', 'A', 'M', 'E'), + qbAutoSave); if (qbAutoSave) { @@ -468,9 +471,9 @@ static qboolean ReadGame (void) // memset(s,0,sizeof(s)); - saved_game->read_chunk( - INT_ID('C','V','S','V'), - s); + sgfh.read_chunk( + INT_ID('C', 'V', 'S', 'V'), + s); Cvar_Set( sCVARNAME_PLAYERSAVE, s ); @@ -478,9 +481,9 @@ static qboolean ReadGame (void) // memset(s,0,sizeof(s)); - saved_game->read_chunk( - INT_ID('A','M','M','O'), - s); + sgfh.read_chunk( + INT_ID('A', 'M', 'M', 'O'), + s); Cvar_Set( "playerammo", s); @@ -488,9 +491,9 @@ static qboolean ReadGame (void) // memset(s,0,sizeof(s)); - saved_game->read_chunk( - INT_ID('I','V','T','Y'), - s); + sgfh.read_chunk( + INT_ID('I', 'V', 'T', 'Y'), + s); Cvar_Set( "playerinv", s); @@ -498,9 +501,9 @@ static qboolean ReadGame (void) // memset(s,0,sizeof(s)); - saved_game->read_chunk( - INT_ID('F','P','L','V'), - s); + sgfh.read_chunk( + INT_ID('F', 'P', 'L', 'V'), + s); Cvar_Set( "playerfplvl", s ); } @@ -521,7 +524,8 @@ void SG_WriteCvars(void) cvar_t *var; int iCount = 0; - auto saved_game = &ojk::SavedGame::get_instance(); + ojk::SavedGameFileHelper sgfh( + &ojk::SavedGameFile::get_instance()); // count the cvars... // @@ -540,9 +544,9 @@ void SG_WriteCvars(void) // store count... // - saved_game->write_chunk( - INT_ID('C','V','C','N'), - iCount); + sgfh.write_chunk( + INT_ID('C', 'V', 'C', 'N'), + iCount); // write 'em... // @@ -557,52 +561,54 @@ void SG_WriteCvars(void) continue; } - saved_game->write_chunk( - INT_ID('C','V','A','R'), - var->name, - static_cast(strlen(var->name) + 1)); + sgfh.write_chunk( + INT_ID('C', 'V', 'A', 'R'), + var->name, + static_cast(strlen(var->name) + 1)); - saved_game->write_chunk( - INT_ID('V','A','L','U'), - var->string, - static_cast(strlen(var->string) + 1)); + sgfh.write_chunk( + INT_ID('V', 'A', 'L', 'U'), + var->string, + static_cast(strlen(var->string) + 1)); } } -void SG_ReadCvars(void) +void SG_ReadCvars() { - int iCount; - std::string psName; - const char* psValue; + int iCount; + std::string psName; + const char* psValue; - auto saved_game = &ojk::SavedGame::get_instance(); + ojk::SavedGameFileHelper sgfh( + &ojk::SavedGameFile::get_instance()); - saved_game->read_chunk( - INT_ID('C','V','C','N'), - iCount); + sgfh.read_chunk( + INT_ID('C', 'V', 'C', 'N'), + iCount); - for (int i = 0; i < iCount; ++i) - { - saved_game->read_chunk( - INT_ID('C','V','A','R')); + for (int i = 0; i < iCount; ++i) + { + sgfh.read_chunk( + INT_ID('C', 'V', 'A', 'R')); - psName = reinterpret_cast( - saved_game->get_buffer_data()); + psName = reinterpret_cast( + sgfh.get_buffer_data()); - saved_game->read_chunk( - INT_ID('V','A','L','U')); + sgfh.read_chunk( + INT_ID('V', 'A', 'L', 'U')); - psValue = reinterpret_cast( - saved_game->get_buffer_data()); + psValue = reinterpret_cast( + sgfh.get_buffer_data()); - ::Cvar_Set(psName.c_str(), psValue); - } + ::Cvar_Set(psName.c_str(), psValue); + } } -void SG_WriteServerConfigStrings( void ) +void SG_WriteServerConfigStrings() { - auto saved_game = &ojk::SavedGame::get_instance(); + ojk::SavedGameFileHelper sgfh( + &ojk::SavedGameFile::get_instance()); int iCount = 0; int i; // not in FOR statement in case compiler goes weird by reg-optimising it then failing to get the address later @@ -620,9 +626,9 @@ void SG_WriteServerConfigStrings( void ) } } - saved_game->write_chunk( - INT_ID('C','S','C','N'), - iCount); + sgfh.write_chunk( + INT_ID('C', 'S', 'C', 'N'), + iCount); // now write 'em... // @@ -632,14 +638,14 @@ void SG_WriteServerConfigStrings( void ) { if (sv.configstrings[i] && strlen(sv.configstrings[i])) { - saved_game->write_chunk( - INT_ID('C','S','I','N'), - i); - - saved_game->write_chunk( - INT_ID('C','S','D','A'), - ::sv.configstrings[i], - static_cast(strlen(::sv.configstrings[i])+1)); + sgfh.write_chunk( + INT_ID('C', 'S', 'I', 'N'), + i); + + sgfh.write_chunk( + INT_ID('C', 'S', 'D', 'A'), + ::sv.configstrings[i], + static_cast(strlen(::sv.configstrings[i]) + 1)); } } } @@ -665,11 +671,12 @@ void SG_ReadServerConfigStrings( void ) // int iCount; - auto saved_game = &ojk::SavedGame::get_instance(); + ojk::SavedGameFileHelper sgfh( + &ojk::SavedGameFile::get_instance()); - saved_game->read_chunk( - INT_ID('C','S','C','N'), - iCount); + sgfh.read_chunk( + INT_ID('C', 'S', 'C', 'N'), + iCount); Com_DPrintf( "Reading %d configstrings...\n",iCount); @@ -678,15 +685,15 @@ void SG_ReadServerConfigStrings( void ) int iIndex; const char *psName; - saved_game->read_chunk( - INT_ID('C','S','I','N'), - iIndex); + sgfh.read_chunk( + INT_ID('C', 'S', 'I', 'N'), + iIndex); - saved_game->read_chunk( - INT_ID('C','S','D','A')); + sgfh.read_chunk( + INT_ID('C', 'S', 'D', 'A')); - psName = reinterpret_cast( - saved_game->get_buffer_data()); + psName = reinterpret_cast( + sgfh.get_buffer_data()); Com_DPrintf( "Cfg str %d = %s\n",iIndex, psName); @@ -702,7 +709,8 @@ static unsigned int SG_UnixTimestamp ( const time_t& t ) static void SG_WriteComment(qboolean qbAutosave, const char *psMapName) { - auto saved_game = &ojk::SavedGame::get_instance(); + ojk::SavedGameFileHelper sgfh( + &ojk::SavedGameFile::get_instance()); char sComment[iSG_COMMENT_SIZE]; @@ -715,16 +723,16 @@ static void SG_WriteComment(qboolean qbAutosave, const char *psMapName) Q_strncpyz(sComment,saveGameComment, sizeof(sComment)); } - saved_game->write_chunk( - INT_ID('C','O','M','M'), - sComment); + sgfh.write_chunk( + INT_ID('C', 'O', 'M', 'M'), + sComment); // Add Date/Time/Map stamp unsigned int timestamp = SG_UnixTimestamp (time (NULL)); - saved_game->write_chunk( - INT_ID('C','M','T','M'), - timestamp); + sgfh.write_chunk( + INT_ID('C', 'M', 'T', 'M'), + timestamp); Com_DPrintf("Saving: current (%s)\n", sComment); } @@ -738,61 +746,77 @@ static time_t SG_GetTime ( unsigned int timestamp ) // then grab the comment if it's there // int SG_GetSaveGameComment( - const char* psPathlessBaseName, - char* sComment, - char* sMapName) + const char* psPathlessBaseName, + char* sComment, + char* sMapName) { - auto ret = 0; + auto ret = 0; + + auto& saved_game = ojk::SavedGameFile::get_instance(); + + ojk::SavedGameFileHelper sgfh( + &saved_game); + + if (!saved_game.open( + psPathlessBaseName)) + { + return 0; + } - auto saved_game = &ojk::SavedGame::get_instance(); + bool is_succeed = true; - try - { - if (!saved_game->open( - psPathlessBaseName)) - { - return 0; - } + is_succeed = sgfh.try_read_chunk( + INT_ID('C', 'O', 'M', 'M'), + sComment, + iSG_COMMENT_SIZE); - saved_game->read_chunk( - INT_ID('C', 'O', 'M', 'M'), - sComment, - iSG_COMMENT_SIZE); + auto tFileTime = ::SG_GetTime(0); - unsigned int fileTime = 0; + if (is_succeed) + { + unsigned int fileTime = 0; - saved_game->read_chunk( - INT_ID('C', 'M', 'T', 'M'), - fileTime); + is_succeed = sgfh.try_read_chunk( + INT_ID('C', 'M', 'T', 'M'), + fileTime); - auto tFileTime = ::SG_GetTime( - fileTime); + if (is_succeed) + { + tFileTime = ::SG_GetTime( + fileTime); + } + } #ifdef JK2_MODE - size_t iScreenShotLength; + if (is_succeed) + { + size_t iScreenShotLength; - saved_game->read_chunk( - INT_ID('S', 'H', 'L', 'N'), - iScreenShotLength); + is_succeed = sgfh.try_read_chunk( + INT_ID('S', 'H', 'L', 'N'), + iScreenShotLength); + } - saved_game->read_chunk( - INT_ID('S', 'H', 'O', 'T')); + if (is_succeed) + { + sgfh.read_chunk( + INT_ID('S', 'H', 'O', 'T')); + } #endif - saved_game->read_chunk( - INT_ID('M', 'P', 'C', 'M'), - sMapName, - iSG_MAPCMD_SIZE); + if (is_succeed) + { + sgfh.read_chunk( + INT_ID('M', 'P', 'C', 'M'), + sMapName, + iSG_MAPCMD_SIZE); + } - ret = tFileTime; - } - catch (ojk::SavedGameException&) - { - } + ret = tFileTime; - saved_game->close(); + saved_game.close(); - return ret; + return ret; } @@ -820,15 +844,17 @@ static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest = static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest) { qboolean bReturn = qfalse; - auto saved_game = &ojk::SavedGame::get_instance(); + + ojk::SavedGameFileHelper sgfh( + &ojk::SavedGameFile::get_instance()); // get JPG screenshot data length... // size_t iScreenShotLength = 0; - saved_game->read_chunk( - INT_ID('S','H','L','N'), - iScreenShotLength); + sgfh.read_chunk( + INT_ID('S', 'H', 'L', 'N'), + iScreenShotLength); // // alloc enough space plus extra 4K for sloppy JPG-decode reader to not do memory access violation... @@ -837,10 +863,10 @@ static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest) // // now read the JPG data... // - saved_game->read_chunk( - INT_ID('S','H','O','T'), - pJPGData, - static_cast(iScreenShotLength)); + sgfh.read_chunk( + INT_ID('S', 'H', 'O', 'T'), + pJPGData, + static_cast(iScreenShotLength)); // // decompress JPG data... @@ -875,37 +901,41 @@ static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest) // qboolean SG_GetSaveImage(const char *psPathlessBaseName, void *pvAddress) { - if (!psPathlessBaseName) - { - return qfalse; - } + if (!psPathlessBaseName) + { + return qfalse; + } + + auto& saved_game = ojk::SavedGameFile::get_instance(); - auto saved_game = &ojk::SavedGame::get_instance(); + if (!saved_game.open(psPathlessBaseName)) + { + return qfalse; + } - if (!saved_game->open(psPathlessBaseName)) - { - return qfalse; - } + ojk::SavedGameFileHelper sgfh( + &saved_game); - saved_game->read_chunk( - INT_ID('C', 'O', 'M', 'M')); + sgfh.read_chunk( + INT_ID('C', 'O', 'M', 'M')); - saved_game->read_chunk( - INT_ID('C', 'M', 'T', 'M')); + sgfh.read_chunk( + INT_ID('C', 'M', 'T', 'M')); - auto bGotSaveImage = SG_ReadScreenshot( - qfalse, - pvAddress); + auto bGotSaveImage = SG_ReadScreenshot( + qfalse, + pvAddress); - saved_game->close(); + saved_game.close(); - return bGotSaveImage; + return bGotSaveImage; } static void SG_WriteScreenshot(qboolean qbAutosave, const char *psMapName) { - auto saved_game = &ojk::SavedGame::get_instance(); + ojk::SavedGameFileHelper sgfh( + &ojk::SavedGameFile::get_instance()); byte *pbRawScreenShot = NULL; byte *byBlank = NULL; @@ -951,11 +981,11 @@ static void SG_WriteScreenshot(qboolean qbAutosave, const char *psMapName) if ( qbAutosave ) delete[] byBlank; - saved_game->write_chunk( + sgfh.write_chunk( INT_ID('S','H','L','N'), iJPGDataSize); - saved_game->write_chunk( + sgfh.write_chunk( INT_ID('S','H','O','T'), pJPGData, static_cast(iJPGDataSize)); @@ -1023,9 +1053,9 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) SG_StoreSaveGameComment(va("--> %s <--",psMapName)); } - auto saved_game = &ojk::SavedGame::get_instance(); + auto& saved_game = ojk::SavedGameFile::get_instance(); - if(!saved_game->create( "current" )) + if(!saved_game.create( "current" )) { Com_Printf (GetString_FailedToOpenSaveGame("current",qfalse));//S_COLOR_RED "Failed to create savegame\n"); SG_WipeSavegame( "current" ); @@ -1034,6 +1064,9 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) } //END JLF + ojk::SavedGameFileHelper sgfh( + &saved_game); + char sMapCmd[iSG_MAPCMD_SIZE]={0}; Q_strncpyz( sMapCmd,psMapName, sizeof(sMapCmd)); // need as array rather than ptr because const strlen needed for MPCM chunk @@ -1042,9 +1075,9 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) SG_WriteScreenshot(qbAutosave, sMapCmd); #endif - saved_game->write_chunk( - INT_ID('M','P','C','M'), - sMapCmd); + sgfh.write_chunk( + INT_ID('M', 'P', 'C', 'M'), + sMapCmd); SG_WriteCvars(); @@ -1054,22 +1087,22 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) // if (!qbAutosave) { - saved_game->write_chunk( - INT_ID('T','I','M','E'), - ::sv.time); + sgfh.write_chunk( + INT_ID('T', 'I', 'M', 'E'), + ::sv.time); - saved_game->write_chunk( - INT_ID('T','I','M','R'), - ::sv.timeResidual); + sgfh.write_chunk( + INT_ID('T', 'I', 'M', 'R'), + ::sv.timeResidual); CM_WritePortalState(); SG_WriteServerConfigStrings(); } ge->WriteLevel(qbAutosave); // always done now, but ent saver only does player if auto - auto is_write_failed = saved_game->is_write_failed(); + auto is_write_failed = saved_game.is_failed(); - saved_game->close(); + saved_game.close(); if (is_write_failed) { @@ -1079,137 +1112,126 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) return qfalse; } -#if 0 - SG_Move( "current", psPathlessBaseName ); -#else - ojk::SavedGame::rename( - "current", - psPathlessBaseName); -#endif - + ojk::SavedGameFile::rename( + "current", + psPathlessBaseName); sv_testsave->integer = iPrevTestSave; return qtrue; } qboolean SG_ReadSavegame( - const char* psPathlessBaseName) + const char* psPathlessBaseName) { - char sComment[iSG_COMMENT_SIZE]; - char sMapCmd[iSG_MAPCMD_SIZE]; + char sComment[iSG_COMMENT_SIZE]; + char sMapCmd[iSG_MAPCMD_SIZE]; #ifdef JK2_MODE - Cvar_Set( - "cg_missionstatusscreen", - "0"); + Cvar_Set( + "cg_missionstatusscreen", + "0"); #endif - auto saved_game = &ojk::SavedGame::get_instance(); - - const auto iPrevTestSave = ::sv_testsave->integer; - - ojk::ScopeGuard scope_guard( - [&]() - { - ::sv_testsave->integer = 0; - }, - - [&]() - { - saved_game->close(); - - ::sv_testsave->integer = iPrevTestSave; - } - ); - - try - { - if (!saved_game->open(psPathlessBaseName)) - { - //S_COLOR_RED "Failed to open savegame \"%s\"\n", psPathlessBaseName); - ::Com_Printf( - ::GetString_FailedToOpenSaveGame( - psPathlessBaseName, - qtrue)); - - return qfalse; - } - - // this check isn't really necessary, but it reminds me that these two strings may actually be the same physical one. - // - if (psPathlessBaseName != sLastSaveFileLoaded) - { - ::Q_strncpyz( - ::sLastSaveFileLoaded, - psPathlessBaseName, - sizeof(sLastSaveFileLoaded)); - } - - // Read in all the server data... - // - saved_game->read_chunk( - INT_ID('C', 'O', 'M', 'M'), - sComment); - - ::Com_DPrintf( - "Reading: %s\n", - sComment); - - saved_game->read_chunk( - INT_ID('C', 'M', 'T', 'M')); + auto& saved_game = ojk::SavedGameFile::get_instance(); + + ojk::SavedGameFileHelper sgfh( + &saved_game); + + const auto iPrevTestSave = ::sv_testsave->integer; + + ojk::ScopeGuard scope_guard( + [&]() + { + ::sv_testsave->integer = 0; + }, + + [&]() + { + saved_game.close(); + + ::sv_testsave->integer = iPrevTestSave; + } + ); + + + if (!saved_game.open(psPathlessBaseName)) + { + //S_COLOR_RED "Failed to open savegame \"%s\"\n", psPathlessBaseName); + ::Com_Printf( + ::GetString_FailedToOpenSaveGame( + psPathlessBaseName, + qtrue)); + + return qfalse; + } + + // this check isn't really necessary, but it reminds me that these two strings may actually be the same physical one. + // + if (psPathlessBaseName != sLastSaveFileLoaded) + { + ::Q_strncpyz( + ::sLastSaveFileLoaded, + psPathlessBaseName, + sizeof(sLastSaveFileLoaded)); + } + + // Read in all the server data... + // + sgfh.read_chunk( + INT_ID('C', 'O', 'M', 'M'), + sComment); + + ::Com_DPrintf( + "Reading: %s\n", + sComment); + + sgfh.read_chunk( + INT_ID('C', 'M', 'T', 'M')); #ifdef JK2_MODE - ::SG_ReadScreenshot( - qtrue); + ::SG_ReadScreenshot( + qtrue); #endif - saved_game->read_chunk( - INT_ID('M', 'P', 'C', 'M'), - sMapCmd); - - ::SG_ReadCvars(); - - // read game state - const auto qbAutosave = ::ReadGame(); - - ::eSavedGameJustLoaded = (qbAutosave ? eAUTO : eFULL); - - // note that this also trashes the whole G_Alloc pool as well (of course) - ::SV_SpawnServer( - sMapCmd, - eForceReload_NOTHING, - (::eSavedGameJustLoaded != eFULL)); - - // read in all the level data... - // - if (!qbAutosave) - { - saved_game->read_chunk( - INT_ID('T', 'I', 'M', 'E'), - ::sv.time); - - saved_game->read_chunk( - INT_ID('T', 'I', 'M', 'R'), - ::sv.timeResidual); - - ::CM_ReadPortalState(); - ::SG_ReadServerConfigStrings(); - } - - // always done now, but ent reader only does player if auto - ::ge->ReadLevel( - qbAutosave, - qbLoadTransition); - } - catch (ojk::SavedGameException& ex) - { - ::Com_Error( - ERR_DROP, - "%s", - ex.what()); - } - - return true; + sgfh.read_chunk( + INT_ID('M', 'P', 'C', 'M'), + sMapCmd); + + ::SG_ReadCvars(); + + // read game state + const auto qbAutosave = ::ReadGame(); + + ::eSavedGameJustLoaded = (qbAutosave ? eAUTO : eFULL); + + // note that this also trashes the whole G_Alloc pool as well (of course) + ::SV_SpawnServer( + sMapCmd, + eForceReload_NOTHING, + (::eSavedGameJustLoaded != eFULL)); + + // read in all the level data... + // + if (!qbAutosave) + { + sgfh.read_chunk( + INT_ID('T', 'I', 'M', 'E'), + ::sv.time); + + sgfh.read_chunk( + INT_ID('T', 'I', 'M', 'R'), + ::sv.timeResidual); + + ::CM_ReadPortalState(); + ::SG_ReadServerConfigStrings(); + } + + // always done now, but ent reader only does player if auto + ::ge->ReadLevel( + qbAutosave, + qbLoadTransition); + + return true; } void SG_TestSave(void) diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index 2e12a2b1bc..0ca1e912ea 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -28,7 +28,7 @@ along with this program; if not, see . #include "../../code/client/vmachine.h" #include "../../code/qcommon/sstring.h" -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char, std::less, std::allocator< unsigned char > > namePrecache_m; @@ -1640,24 +1640,30 @@ Ghoul2 Insert End void CG_WriteTheEvilCGHackStuff(void) { - ::gi.saved_game->write_chunk( - INT_ID('F','P','S','L'), - ::cg.forcepowerSelect); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); - ::gi.saved_game->write_chunk( - INT_ID('I','V','S','L'), - ::cg.inventorySelect); + sgfh.write_chunk( + INT_ID('F', 'P', 'S', 'L'), + ::cg.forcepowerSelect); + + sgfh.write_chunk( + INT_ID('I', 'V', 'S', 'L'), + ::cg.inventorySelect); } void CG_ReadTheEvilCGHackStuff(void) { - ::gi.saved_game->read_chunk( - INT_ID('F','P','S','L'), - ::gi_cg_forcepowerSelect); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('F', 'P', 'S', 'L'), + ::gi_cg_forcepowerSelect); - ::gi.saved_game->read_chunk( - INT_ID('I','V','S','L'), - ::gi_cg_inventorySelect); + sgfh.read_chunk( + INT_ID('I', 'V', 'S', 'L'), + ::gi_cg_inventorySelect); gbUseTheseValuesFromLoadSave = qtrue; } diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index 605cec68fe..d450eadbc9 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -234,8 +234,6 @@ set(JK2SPGameCommonFiles "${SPDir}/qcommon/strippublic.h" "${SPDir}/rd-common/mdx_format.h" "${SharedDir}/qcommon/ojk_i_saved_game_file.h" - "${SharedDir}/qcommon/ojk_saved_game_file.h" - "${SharedDir}/qcommon/ojk_saved_game_file.cpp" "${SharedDir}/qcommon/ojk_saved_game_file_helper.h" "${SharedDir}/qcommon/ojk_saved_game_file_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" diff --git a/codeJK2/game/G_Timer.cpp b/codeJK2/game/G_Timer.cpp index 34246eace3..855b932974 100644 --- a/codeJK2/game/G_Timer.cpp +++ b/codeJK2/game/G_Timer.cpp @@ -23,7 +23,7 @@ along with this program; if not, see . #include "g_local.h" #include "../../code/Rufl/hstring.h" -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" #define MAX_GTIMERS 16384 @@ -165,6 +165,9 @@ void TIMER_Save( void ) int j; gentity_t *ent; + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + for ( j = 0, ent = &g_entities[0]; j < MAX_GENTITIES; j++, ent++ ) { int numTimers = TIMER_GetCount(j); @@ -178,9 +181,9 @@ void TIMER_Save( void ) } //Write out the timer information - ::gi.saved_game->write_chunk( - INT_ID('T','I','M','E'), - numTimers); + sgfh.write_chunk( + INT_ID('T', 'I', 'M', 'E'), + numTimers); gtimer_t *p = g_timers[j]; assert ((numTimers && p) || (!numTimers && !p)); @@ -194,19 +197,19 @@ void TIMER_Save( void ) assert( length < 1024 );//This will cause problems when loading the timer if longer //Write out the string size and data - ::gi.saved_game->write_chunk( - INT_ID('T','S','L','N'), - length); + sgfh.write_chunk( + INT_ID('T', 'S', 'L', 'N'), + length); - ::gi.saved_game->write_chunk( - INT_ID('T','S','N','M'), - timerID, - length); + sgfh.write_chunk( + INT_ID('T', 'S', 'N', 'M'), + timerID, + length); //Write out the timer data - ::gi.saved_game->write_chunk( - INT_ID('T','D','T','A'), - time); + sgfh.write_chunk( + INT_ID('T', 'D', 'T', 'A'), + time); p = p->next; } @@ -224,13 +227,16 @@ void TIMER_Load( void ) int j; gentity_t *ent; + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + for ( j = 0, ent = &g_entities[0]; j < MAX_GENTITIES; j++, ent++ ) { int numTimers; - ::gi.saved_game->read_chunk( - INT_ID('T','I','M','E'), - numTimers); + sgfh.read_chunk( + INT_ID('T', 'I', 'M', 'E'), + numTimers); //Make sure there's something to read if ( numTimers == 0 ) @@ -244,9 +250,9 @@ void TIMER_Load( void ) assert (sizeof(g_timers[0]->time) == sizeof(time) );//make sure we're reading the same size as we wrote - ::gi.saved_game->read_chunk( - INT_ID('T','S','L','N'), - length); + sgfh.read_chunk( + INT_ID('T', 'S', 'L', 'N'), + length); if ( length >= 1024 ) { assert( 0 ); @@ -254,16 +260,16 @@ void TIMER_Load( void ) } //Read the id and time - ::gi.saved_game->read_chunk( - INT_ID('T','S','N','M'), - tempBuffer, - length); + sgfh.read_chunk( + INT_ID('T', 'S', 'N', 'M'), + tempBuffer, + length); tempBuffer[length] = '\0'; - ::gi.saved_game->read_chunk( - INT_ID('T','D','T','A'), - time); + sgfh.read_chunk( + INT_ID('T', 'D', 'T', 'A'), + time); //this is odd, we saved all the timers in the autosave, but not all the ents are spawned yet from an auto load, so skip it if (ent->inuse) diff --git a/codeJK2/game/Q3_Registers.cpp b/codeJK2/game/Q3_Registers.cpp index 2c4602f124..10b4109fba 100644 --- a/codeJK2/game/Q3_Registers.cpp +++ b/codeJK2/game/Q3_Registers.cpp @@ -24,7 +24,7 @@ along with this program; if not, see . #include "g_local.h" #include "Q3_Registers.h" -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" extern void Q3_DebugPrint( int level, const char *format, ... ); @@ -290,9 +290,12 @@ void Q3_VariableSaveFloats( varFloat_m &fmap ) { int numFloats = fmap.size(); - ::gi.saved_game->write_chunk( - INT_ID('F','V','A','R'), - numFloats); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.write_chunk( + INT_ID('F', 'V', 'A', 'R'), + numFloats); varFloat_m::iterator vfi; STL_ITERATE( vfi, fmap ) @@ -301,19 +304,19 @@ void Q3_VariableSaveFloats( varFloat_m &fmap ) int idSize = strlen( ((*vfi).first).c_str() ); //Save out the real data - ::gi.saved_game->write_chunk( - INT_ID('F','I','D','L'), - idSize); + sgfh.write_chunk( + INT_ID('F', 'I', 'D', 'L'), + idSize); - ::gi.saved_game->write_chunk( - INT_ID('F','I','D','S'), - ((*vfi).first).c_str(), - idSize); + sgfh.write_chunk( + INT_ID('F', 'I', 'D', 'S'), + ((*vfi).first).c_str(), + idSize); //Save out the float value - ::gi.saved_game->write_chunk( - INT_ID('F','V','A','L'), - (*vfi).second); + sgfh.write_chunk( + INT_ID('F', 'V', 'A', 'L'), + (*vfi).second); } } @@ -327,9 +330,12 @@ void Q3_VariableSaveStrings( varString_m &smap ) { int numStrings = smap.size(); - ::gi.saved_game->write_chunk( - INT_ID('S','V','A','R'), - numStrings); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.write_chunk( + INT_ID('S', 'V', 'A', 'R'), + numStrings); varString_m::iterator vsi; STL_ITERATE( vsi, smap ) @@ -338,26 +344,26 @@ void Q3_VariableSaveStrings( varString_m &smap ) int idSize = strlen( ((*vsi).first).c_str() ); //Save out the real data - ::gi.saved_game->write_chunk( - INT_ID('S','I','D','L'), - idSize); + sgfh.write_chunk( + INT_ID('S', 'I', 'D', 'L'), + idSize); - ::gi.saved_game->write_chunk( - INT_ID('S','I','D','S'), - ((*vsi).first).c_str(), - idSize); + sgfh.write_chunk( + INT_ID('S', 'I', 'D', 'S'), + ((*vsi).first).c_str(), + idSize); //Save out the string value idSize = strlen( ((*vsi).second).c_str() ); - ::gi.saved_game->write_chunk( - INT_ID('S','V','S','Z'), - idSize); + sgfh.write_chunk( + INT_ID('S', 'V', 'S', 'Z'), + idSize); - ::gi.saved_game->write_chunk( - INT_ID('S','V','A','L'), - ((*vsi).second).c_str(), - idSize); + sgfh.write_chunk( + INT_ID('S', 'V', 'A', 'L'), + ((*vsi).second).c_str(), + idSize); } } @@ -387,30 +393,33 @@ void Q3_VariableLoadFloats( varFloat_m &fmap ) int numFloats; char tempBuffer[1024]; - ::gi.saved_game->read_chunk( - INT_ID('F','V','A','R'), - numFloats); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('F', 'V', 'A', 'R'), + numFloats); for ( int i = 0; i < numFloats; i++ ) { int idSize; - ::gi.saved_game->read_chunk( - INT_ID('F','I','D','L'), - idSize); + sgfh.read_chunk( + INT_ID('F', 'I', 'D', 'L'), + idSize); - ::gi.saved_game->read_chunk( - INT_ID('F','I','D','S'), - tempBuffer, - idSize); + sgfh.read_chunk( + INT_ID('F', 'I', 'D', 'S'), + tempBuffer, + idSize); tempBuffer[ idSize ] = 0; float val; - ::gi.saved_game->read_chunk( - INT_ID('F','V','A','L'), - val); + sgfh.read_chunk( + INT_ID('F', 'V', 'A', 'L'), + val); Q3_DeclareVariable( TK_FLOAT, (const char *) &tempBuffer ); Q3_SetFloatVariable( (const char *) &tempBuffer, val ); @@ -429,33 +438,36 @@ void Q3_VariableLoadStrings( int type, varString_m &fmap ) char tempBuffer[1024]; char tempBuffer2[1024]; - ::gi.saved_game->read_chunk( - INT_ID('S','V','A','R'), - numFloats); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('S', 'V', 'A', 'R'), + numFloats); for ( int i = 0; i < numFloats; i++ ) { int idSize; - ::gi.saved_game->read_chunk( - INT_ID('S','I','D','L'), - idSize); + sgfh.read_chunk( + INT_ID('S', 'I', 'D', 'L'), + idSize); - ::gi.saved_game->read_chunk( - INT_ID('S','I','D','S'), - tempBuffer, - idSize); + sgfh.read_chunk( + INT_ID('S', 'I', 'D', 'S'), + tempBuffer, + idSize); tempBuffer[ idSize ] = 0; - ::gi.saved_game->read_chunk( - INT_ID('S','V','S','Z'), - idSize); + sgfh.read_chunk( + INT_ID('S', 'V', 'S', 'Z'), + idSize); - ::gi.saved_game->read_chunk( - INT_ID('S','V','A','L'), - tempBuffer2, - idSize); + sgfh.read_chunk( + INT_ID('S', 'V', 'A', 'L'), + tempBuffer2, + idSize); tempBuffer2[ idSize ] = 0; diff --git a/codeJK2/game/ai.h b/codeJK2/game/ai.h index 3bd7e0ae47..746ec904bd 100644 --- a/codeJK2/game/ai.h +++ b/codeJK2/game/ai.h @@ -115,21 +115,21 @@ class AIGroupMember_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(number); - saved_game->write(waypoint); - saved_game->write(pathCostToEnemy); - saved_game->write(closestBuddy); + saved_game.write(number); + saved_game.write(waypoint); + saved_game.write(pathCostToEnemy); + saved_game.write(closestBuddy); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(number); - saved_game->read(waypoint); - saved_game->read(pathCostToEnemy); - saved_game->read(closestBuddy); + saved_game.read(number); + saved_game.read(waypoint); + saved_game.read(pathCostToEnemy); + saved_game.read(closestBuddy); } }; // AIGroupMember_t @@ -158,47 +158,47 @@ class AIGroupInfo_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(numGroup); - saved_game->write(processed); - saved_game->write(team); - saved_game->write(enemy); - saved_game->write(enemyWP); - saved_game->write(speechDebounceTime); - saved_game->write(lastClearShotTime); - saved_game->write(lastSeenEnemyTime); - saved_game->write(morale); - saved_game->write(moraleAdjust); - saved_game->write(moraleDebounce); - saved_game->write(memberValidateTime); - saved_game->write(activeMemberNum); - saved_game->write(commander); - saved_game->write(enemyLastSeenPos); - saved_game->write(numState); - saved_game->write<>(member); + saved_game.write(numGroup); + saved_game.write(processed); + saved_game.write(team); + saved_game.write(enemy); + saved_game.write(enemyWP); + saved_game.write(speechDebounceTime); + saved_game.write(lastClearShotTime); + saved_game.write(lastSeenEnemyTime); + saved_game.write(morale); + saved_game.write(moraleAdjust); + saved_game.write(moraleDebounce); + saved_game.write(memberValidateTime); + saved_game.write(activeMemberNum); + saved_game.write(commander); + saved_game.write(enemyLastSeenPos); + saved_game.write(numState); + saved_game.write<>(member); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(numGroup); - saved_game->read(processed); - saved_game->read(team); - saved_game->read(enemy); - saved_game->read(enemyWP); - saved_game->read(speechDebounceTime); - saved_game->read(lastClearShotTime); - saved_game->read(lastSeenEnemyTime); - saved_game->read(morale); - saved_game->read(moraleAdjust); - saved_game->read(moraleDebounce); - saved_game->read(memberValidateTime); - saved_game->read(activeMemberNum); - saved_game->read(commander); - saved_game->read(enemyLastSeenPos); - saved_game->read(numState); - saved_game->read<>(member); + saved_game.read(numGroup); + saved_game.read(processed); + saved_game.read(team); + saved_game.read(enemy); + saved_game.read(enemyWP); + saved_game.read(speechDebounceTime); + saved_game.read(lastClearShotTime); + saved_game.read(lastSeenEnemyTime); + saved_game.read(morale); + saved_game.read(moraleAdjust); + saved_game.read(moraleDebounce); + saved_game.read(memberValidateTime); + saved_game.read(activeMemberNum); + saved_game.read(commander); + saved_game.read(enemyLastSeenPos); + saved_game.read(numState); + saved_game.read<>(member); } }; // AIGroupInfo_t diff --git a/codeJK2/game/anims.h b/codeJK2/game/anims.h index d4b9cb9943..7cbd679a91 100644 --- a/codeJK2/game/anims.h +++ b/codeJK2/game/anims.h @@ -1410,23 +1410,23 @@ class animFileSet_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(filename); - saved_game->write<>(animations); - saved_game->write<>(torsoAnimSnds); - saved_game->write<>(legsAnimSnds); - saved_game->write(soundsCached); + saved_game.write(filename); + saved_game.write<>(animations); + saved_game.write<>(torsoAnimSnds); + saved_game.write<>(legsAnimSnds); + saved_game.write(soundsCached); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(filename); - saved_game->read<>(animations); - saved_game->read<>(torsoAnimSnds); - saved_game->read<>(legsAnimSnds); - saved_game->read(soundsCached); + saved_game.read(filename); + saved_game.read<>(animations); + saved_game.read<>(torsoAnimSnds); + saved_game.read<>(legsAnimSnds); + saved_game.read(soundsCached); } }; // animFileSet_t #define MAX_ANIM_FILES 64 diff --git a/codeJK2/game/b_public.h b/codeJK2/game/b_public.h index 66d5c29e6e..9256b41b07 100644 --- a/codeJK2/game/b_public.h +++ b/codeJK2/game/b_public.h @@ -140,49 +140,49 @@ class gNPCstats_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(aggression); - saved_game->write(aim); - saved_game->write(earshot); - saved_game->write(evasion); - saved_game->write(hfov); - saved_game->write(intelligence); - saved_game->write(move); - saved_game->write(reactions); - saved_game->write(shootDistance); - saved_game->write(vfov); - saved_game->write(vigilance); - saved_game->write(visrange); - saved_game->write(moveType); - saved_game->write(runSpeed); - saved_game->write(walkSpeed); - saved_game->write(yawSpeed); - saved_game->write(health); - saved_game->write(acceleration); + saved_game.write(aggression); + saved_game.write(aim); + saved_game.write(earshot); + saved_game.write(evasion); + saved_game.write(hfov); + saved_game.write(intelligence); + saved_game.write(move); + saved_game.write(reactions); + saved_game.write(shootDistance); + saved_game.write(vfov); + saved_game.write(vigilance); + saved_game.write(visrange); + saved_game.write(moveType); + saved_game.write(runSpeed); + saved_game.write(walkSpeed); + saved_game.write(yawSpeed); + saved_game.write(health); + saved_game.write(acceleration); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(aggression); - saved_game->read(aim); - saved_game->read(earshot); - saved_game->read(evasion); - saved_game->read(hfov); - saved_game->read(intelligence); - saved_game->read(move); - saved_game->read(reactions); - saved_game->read(shootDistance); - saved_game->read(vfov); - saved_game->read(vigilance); - saved_game->read(visrange); - saved_game->read(moveType); - saved_game->read(runSpeed); - saved_game->read(walkSpeed); - saved_game->read(yawSpeed); - saved_game->read(health); - saved_game->read(acceleration); + saved_game.read(aggression); + saved_game.read(aim); + saved_game.read(earshot); + saved_game.read(evasion); + saved_game.read(hfov); + saved_game.read(intelligence); + saved_game.read(move); + saved_game.read(reactions); + saved_game.read(shootDistance); + saved_game.read(vfov); + saved_game.read(vigilance); + saved_game.read(visrange); + saved_game.read(moveType); + saved_game.read(runSpeed); + saved_game.read(walkSpeed); + saved_game.read(yawSpeed); + saved_game.read(health); + saved_game.read(acceleration); } }; // gNPCstats_t @@ -346,213 +346,213 @@ class gNPC_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(timeOfDeath); - saved_game->write(touchedByPlayer); - saved_game->write(enemyLastVisibility); - saved_game->write(aimTime); - saved_game->write(desiredYaw); - saved_game->write(desiredPitch); - saved_game->write(lockedDesiredYaw); - saved_game->write(lockedDesiredPitch); - saved_game->write(aimingBeam); - saved_game->write(enemyLastSeenLocation); - saved_game->write(enemyLastSeenTime); - saved_game->write(enemyLastHeardLocation); - saved_game->write(enemyLastHeardTime); - saved_game->write(lastAlertID); - saved_game->write(eFlags); - saved_game->write(aiFlags); - saved_game->write(currentAmmo); - saved_game->write(shotTime); - saved_game->write(burstCount); - saved_game->write(burstMin); - saved_game->write(burstMean); - saved_game->write(burstMax); - saved_game->write(burstSpacing); - saved_game->write(attackHold); - saved_game->write(attackHoldTime); - saved_game->write(shootAngles); - saved_game->write(rank); - saved_game->write(behaviorState); - saved_game->write(defaultBehavior); - saved_game->write(tempBehavior); - saved_game->write(ignorePain); - saved_game->write(duckDebounceTime); - saved_game->write(walkDebounceTime); - saved_game->write(enemyCheckDebounceTime); - saved_game->write(investigateDebounceTime); - saved_game->write(investigateCount); - saved_game->write(investigateGoal); - saved_game->write(investigateSoundDebounceTime); - saved_game->write(greetingDebounceTime); - saved_game->write(eventOwner); - saved_game->write(coverTarg); - saved_game->write(jumpState); - saved_game->write(followDist); - saved_game->write(tempGoal); - saved_game->write(goalEntity); - saved_game->write(lastGoalEntity); - saved_game->write(eventualGoal); - saved_game->write(captureGoal); - saved_game->write(defendEnt); - saved_game->write(greetEnt); - saved_game->write(goalTime); - saved_game->write(straightToGoal); - saved_game->write(distToGoal); - saved_game->write(navTime); - saved_game->write(blockingEntNum); - saved_game->write(blockedSpeechDebounceTime); - saved_game->write(lastSideStepSide); - saved_game->write(sideStepHoldTime); - saved_game->write(homeWp); - saved_game->write(group); - saved_game->write(lastPathAngles); - saved_game->write<>(stats); - saved_game->write(aimErrorDebounceTime); - saved_game->write(lastAimErrorYaw); - saved_game->write(lastAimErrorPitch); - saved_game->write(aimOfs); - saved_game->write(currentAim); - saved_game->write(currentAggression); - saved_game->write(scriptFlags); - saved_game->write(desiredSpeed); - saved_game->write(currentSpeed); - saved_game->write(last_forwardmove); - saved_game->write(last_rightmove); - saved_game->skip(2); - saved_game->write(lastClearOrigin); - saved_game->write(consecutiveBlockedMoves); - saved_game->write(blockedDebounceTime); - saved_game->write(shoveCount); - saved_game->write(blockedDest); - saved_game->write(combatPoint); - saved_game->write(lastFailedCombatPoint); - saved_game->write(movementSpeech); - saved_game->write(movementSpeechChance); - saved_game->write(nextBStateThink); - saved_game->write<>(last_ucmd); - saved_game->write(combatMove); - saved_game->write(goalRadius); - saved_game->write(pauseTime); - saved_game->write(standTime); - saved_game->write(localState); - saved_game->write(squadState); - saved_game->write(confusionTime); - saved_game->write(charmedTime); - saved_game->write(controlledTime); - saved_game->write(surrenderTime); - saved_game->write(enemyLaggedPos); - saved_game->write(watchTarget); - saved_game->write(ffireCount); - saved_game->write(ffireDebounce); - saved_game->write(ffireFadeDebounce); + saved_game.write(timeOfDeath); + saved_game.write(touchedByPlayer); + saved_game.write(enemyLastVisibility); + saved_game.write(aimTime); + saved_game.write(desiredYaw); + saved_game.write(desiredPitch); + saved_game.write(lockedDesiredYaw); + saved_game.write(lockedDesiredPitch); + saved_game.write(aimingBeam); + saved_game.write(enemyLastSeenLocation); + saved_game.write(enemyLastSeenTime); + saved_game.write(enemyLastHeardLocation); + saved_game.write(enemyLastHeardTime); + saved_game.write(lastAlertID); + saved_game.write(eFlags); + saved_game.write(aiFlags); + saved_game.write(currentAmmo); + saved_game.write(shotTime); + saved_game.write(burstCount); + saved_game.write(burstMin); + saved_game.write(burstMean); + saved_game.write(burstMax); + saved_game.write(burstSpacing); + saved_game.write(attackHold); + saved_game.write(attackHoldTime); + saved_game.write(shootAngles); + saved_game.write(rank); + saved_game.write(behaviorState); + saved_game.write(defaultBehavior); + saved_game.write(tempBehavior); + saved_game.write(ignorePain); + saved_game.write(duckDebounceTime); + saved_game.write(walkDebounceTime); + saved_game.write(enemyCheckDebounceTime); + saved_game.write(investigateDebounceTime); + saved_game.write(investigateCount); + saved_game.write(investigateGoal); + saved_game.write(investigateSoundDebounceTime); + saved_game.write(greetingDebounceTime); + saved_game.write(eventOwner); + saved_game.write(coverTarg); + saved_game.write(jumpState); + saved_game.write(followDist); + saved_game.write(tempGoal); + saved_game.write(goalEntity); + saved_game.write(lastGoalEntity); + saved_game.write(eventualGoal); + saved_game.write(captureGoal); + saved_game.write(defendEnt); + saved_game.write(greetEnt); + saved_game.write(goalTime); + saved_game.write(straightToGoal); + saved_game.write(distToGoal); + saved_game.write(navTime); + saved_game.write(blockingEntNum); + saved_game.write(blockedSpeechDebounceTime); + saved_game.write(lastSideStepSide); + saved_game.write(sideStepHoldTime); + saved_game.write(homeWp); + saved_game.write(group); + saved_game.write(lastPathAngles); + saved_game.write<>(stats); + saved_game.write(aimErrorDebounceTime); + saved_game.write(lastAimErrorYaw); + saved_game.write(lastAimErrorPitch); + saved_game.write(aimOfs); + saved_game.write(currentAim); + saved_game.write(currentAggression); + saved_game.write(scriptFlags); + saved_game.write(desiredSpeed); + saved_game.write(currentSpeed); + saved_game.write(last_forwardmove); + saved_game.write(last_rightmove); + saved_game.skip(2); + saved_game.write(lastClearOrigin); + saved_game.write(consecutiveBlockedMoves); + saved_game.write(blockedDebounceTime); + saved_game.write(shoveCount); + saved_game.write(blockedDest); + saved_game.write(combatPoint); + saved_game.write(lastFailedCombatPoint); + saved_game.write(movementSpeech); + saved_game.write(movementSpeechChance); + saved_game.write(nextBStateThink); + saved_game.write<>(last_ucmd); + saved_game.write(combatMove); + saved_game.write(goalRadius); + saved_game.write(pauseTime); + saved_game.write(standTime); + saved_game.write(localState); + saved_game.write(squadState); + saved_game.write(confusionTime); + saved_game.write(charmedTime); + saved_game.write(controlledTime); + saved_game.write(surrenderTime); + saved_game.write(enemyLaggedPos); + saved_game.write(watchTarget); + saved_game.write(ffireCount); + saved_game.write(ffireDebounce); + saved_game.write(ffireFadeDebounce); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(timeOfDeath); - saved_game->read(touchedByPlayer); - saved_game->read(enemyLastVisibility); - saved_game->read(aimTime); - saved_game->read(desiredYaw); - saved_game->read(desiredPitch); - saved_game->read(lockedDesiredYaw); - saved_game->read(lockedDesiredPitch); - saved_game->read(aimingBeam); - saved_game->read(enemyLastSeenLocation); - saved_game->read(enemyLastSeenTime); - saved_game->read(enemyLastHeardLocation); - saved_game->read(enemyLastHeardTime); - saved_game->read(lastAlertID); - saved_game->read(eFlags); - saved_game->read(aiFlags); - saved_game->read(currentAmmo); - saved_game->read(shotTime); - saved_game->read(burstCount); - saved_game->read(burstMin); - saved_game->read(burstMean); - saved_game->read(burstMax); - saved_game->read(burstSpacing); - saved_game->read(attackHold); - saved_game->read(attackHoldTime); - saved_game->read(shootAngles); - saved_game->read(rank); - saved_game->read(behaviorState); - saved_game->read(defaultBehavior); - saved_game->read(tempBehavior); - saved_game->read(ignorePain); - saved_game->read(duckDebounceTime); - saved_game->read(walkDebounceTime); - saved_game->read(enemyCheckDebounceTime); - saved_game->read(investigateDebounceTime); - saved_game->read(investigateCount); - saved_game->read(investigateGoal); - saved_game->read(investigateSoundDebounceTime); - saved_game->read(greetingDebounceTime); - saved_game->read(eventOwner); - saved_game->read(coverTarg); - saved_game->read(jumpState); - saved_game->read(followDist); - saved_game->read(tempGoal); - saved_game->read(goalEntity); - saved_game->read(lastGoalEntity); - saved_game->read(eventualGoal); - saved_game->read(captureGoal); - saved_game->read(defendEnt); - saved_game->read(greetEnt); - saved_game->read(goalTime); - saved_game->read(straightToGoal); - saved_game->read(distToGoal); - saved_game->read(navTime); - saved_game->read(blockingEntNum); - saved_game->read(blockedSpeechDebounceTime); - saved_game->read(lastSideStepSide); - saved_game->read(sideStepHoldTime); - saved_game->read(homeWp); - saved_game->read(group); - saved_game->read(lastPathAngles); - saved_game->read<>(stats); - saved_game->read(aimErrorDebounceTime); - saved_game->read(lastAimErrorYaw); - saved_game->read(lastAimErrorPitch); - saved_game->read(aimOfs); - saved_game->read(currentAim); - saved_game->read(currentAggression); - saved_game->read(scriptFlags); - saved_game->read(desiredSpeed); - saved_game->read(currentSpeed); - saved_game->read(last_forwardmove); - saved_game->read(last_rightmove); - saved_game->skip(2); - saved_game->read(lastClearOrigin); - saved_game->read(consecutiveBlockedMoves); - saved_game->read(blockedDebounceTime); - saved_game->read(shoveCount); - saved_game->read(blockedDest); - saved_game->read(combatPoint); - saved_game->read(lastFailedCombatPoint); - saved_game->read(movementSpeech); - saved_game->read(movementSpeechChance); - saved_game->read(nextBStateThink); - saved_game->read<>(last_ucmd); - saved_game->read(combatMove); - saved_game->read(goalRadius); - saved_game->read(pauseTime); - saved_game->read(standTime); - saved_game->read(localState); - saved_game->read(squadState); - saved_game->read(confusionTime); - saved_game->read(charmedTime); - saved_game->read(controlledTime); - saved_game->read(surrenderTime); - saved_game->read(enemyLaggedPos); - saved_game->read(watchTarget); - saved_game->read(ffireCount); - saved_game->read(ffireDebounce); - saved_game->read(ffireFadeDebounce); + saved_game.read(timeOfDeath); + saved_game.read(touchedByPlayer); + saved_game.read(enemyLastVisibility); + saved_game.read(aimTime); + saved_game.read(desiredYaw); + saved_game.read(desiredPitch); + saved_game.read(lockedDesiredYaw); + saved_game.read(lockedDesiredPitch); + saved_game.read(aimingBeam); + saved_game.read(enemyLastSeenLocation); + saved_game.read(enemyLastSeenTime); + saved_game.read(enemyLastHeardLocation); + saved_game.read(enemyLastHeardTime); + saved_game.read(lastAlertID); + saved_game.read(eFlags); + saved_game.read(aiFlags); + saved_game.read(currentAmmo); + saved_game.read(shotTime); + saved_game.read(burstCount); + saved_game.read(burstMin); + saved_game.read(burstMean); + saved_game.read(burstMax); + saved_game.read(burstSpacing); + saved_game.read(attackHold); + saved_game.read(attackHoldTime); + saved_game.read(shootAngles); + saved_game.read(rank); + saved_game.read(behaviorState); + saved_game.read(defaultBehavior); + saved_game.read(tempBehavior); + saved_game.read(ignorePain); + saved_game.read(duckDebounceTime); + saved_game.read(walkDebounceTime); + saved_game.read(enemyCheckDebounceTime); + saved_game.read(investigateDebounceTime); + saved_game.read(investigateCount); + saved_game.read(investigateGoal); + saved_game.read(investigateSoundDebounceTime); + saved_game.read(greetingDebounceTime); + saved_game.read(eventOwner); + saved_game.read(coverTarg); + saved_game.read(jumpState); + saved_game.read(followDist); + saved_game.read(tempGoal); + saved_game.read(goalEntity); + saved_game.read(lastGoalEntity); + saved_game.read(eventualGoal); + saved_game.read(captureGoal); + saved_game.read(defendEnt); + saved_game.read(greetEnt); + saved_game.read(goalTime); + saved_game.read(straightToGoal); + saved_game.read(distToGoal); + saved_game.read(navTime); + saved_game.read(blockingEntNum); + saved_game.read(blockedSpeechDebounceTime); + saved_game.read(lastSideStepSide); + saved_game.read(sideStepHoldTime); + saved_game.read(homeWp); + saved_game.read(group); + saved_game.read(lastPathAngles); + saved_game.read<>(stats); + saved_game.read(aimErrorDebounceTime); + saved_game.read(lastAimErrorYaw); + saved_game.read(lastAimErrorPitch); + saved_game.read(aimOfs); + saved_game.read(currentAim); + saved_game.read(currentAggression); + saved_game.read(scriptFlags); + saved_game.read(desiredSpeed); + saved_game.read(currentSpeed); + saved_game.read(last_forwardmove); + saved_game.read(last_rightmove); + saved_game.skip(2); + saved_game.read(lastClearOrigin); + saved_game.read(consecutiveBlockedMoves); + saved_game.read(blockedDebounceTime); + saved_game.read(shoveCount); + saved_game.read(blockedDest); + saved_game.read(combatPoint); + saved_game.read(lastFailedCombatPoint); + saved_game.read(movementSpeech); + saved_game.read(movementSpeechChance); + saved_game.read(nextBStateThink); + saved_game.read<>(last_ucmd); + saved_game.read(combatMove); + saved_game.read(goalRadius); + saved_game.read(pauseTime); + saved_game.read(standTime); + saved_game.read(localState); + saved_game.read(squadState); + saved_game.read(confusionTime); + saved_game.read(charmedTime); + saved_game.read(controlledTime); + saved_game.read(surrenderTime); + saved_game.read(enemyLaggedPos); + saved_game.read(watchTarget); + saved_game.read(ffireCount); + saved_game.read(ffireDebounce); + saved_game.read(ffireFadeDebounce); } }; // gNPC_t diff --git a/codeJK2/game/bg_public.h b/codeJK2/game/bg_public.h index 77b11b0ad0..74b30e2285 100644 --- a/codeJK2/game/bg_public.h +++ b/codeJK2/game/bg_public.h @@ -452,23 +452,23 @@ class animation_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(firstFrame); - saved_game->write(numFrames); - saved_game->write(loopFrames); - saved_game->write(frameLerp); - saved_game->write(initialLerp); + saved_game.write(firstFrame); + saved_game.write(numFrames); + saved_game.write(loopFrames); + saved_game.write(frameLerp); + saved_game.write(initialLerp); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(firstFrame); - saved_game->read(numFrames); - saved_game->read(loopFrames); - saved_game->read(frameLerp); - saved_game->read(initialLerp); + saved_game.read(firstFrame); + saved_game.read(numFrames); + saved_game.read(loopFrames); + saved_game.read(frameLerp); + saved_game.read(initialLerp); } }; // animation_t @@ -483,21 +483,21 @@ typedef struct animsounds_s void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(keyFrame); - saved_game->write(soundIndex); - saved_game->write(numRandomAnimSounds); - saved_game->write(probability); + saved_game.write(keyFrame); + saved_game.write(soundIndex); + saved_game.write(numRandomAnimSounds); + saved_game.write(probability); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(keyFrame); - saved_game->read(soundIndex); - saved_game->read(numRandomAnimSounds); - saved_game->read(probability); + saved_game.read(keyFrame); + saved_game.read(soundIndex); + saved_game.read(numRandomAnimSounds); + saved_game.read(probability); } } animsounds_t; diff --git a/codeJK2/game/g_local.h b/codeJK2/game/g_local.h index a20601e85a..9156fcced8 100644 --- a/codeJK2/game/g_local.h +++ b/codeJK2/game/g_local.h @@ -144,31 +144,31 @@ class alertEvent_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(position); - saved_game->write(radius); - saved_game->write(level); - saved_game->write(type); - saved_game->write(owner); - saved_game->write(light); - saved_game->write(addLight); - saved_game->write(ID); - saved_game->write(timestamp); + saved_game.write(position); + saved_game.write(radius); + saved_game.write(level); + saved_game.write(type); + saved_game.write(owner); + saved_game.write(light); + saved_game.write(addLight); + saved_game.write(ID); + saved_game.write(timestamp); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(position); - saved_game->read(radius); - saved_game->read(level); - saved_game->read(type); - saved_game->read(owner); - saved_game->read(light); - saved_game->read(addLight); - saved_game->read(ID); - saved_game->read(timestamp); + saved_game.read(position); + saved_game.read(radius); + saved_game.read(level); + saved_game.read(type); + saved_game.read(owner); + saved_game.read(light); + saved_game.read(addLight); + saved_game.read(ID); + saved_game.read(timestamp); } }; // alertEvent_t @@ -249,47 +249,47 @@ class level_locals_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(clients); - saved_game->write(maxclients); - saved_game->write(framenum); - saved_game->write(time); - saved_game->write(previousTime); - saved_game->write(globalTime); - saved_game->write(mapname); - saved_game->write(locationLinked); - saved_game->write(locationHead); - saved_game->write<>(alertEvents); - saved_game->write(numAlertEvents); - saved_game->write(curAlertID); - saved_game->write<>(groups); - saved_game->write<>(knownAnimFileSets); - saved_game->write(numKnownAnimFileSets); - saved_game->write(worldFlags); - saved_game->write(dmState); + saved_game.write(clients); + saved_game.write(maxclients); + saved_game.write(framenum); + saved_game.write(time); + saved_game.write(previousTime); + saved_game.write(globalTime); + saved_game.write(mapname); + saved_game.write(locationLinked); + saved_game.write(locationHead); + saved_game.write<>(alertEvents); + saved_game.write(numAlertEvents); + saved_game.write(curAlertID); + saved_game.write<>(groups); + saved_game.write<>(knownAnimFileSets); + saved_game.write(numKnownAnimFileSets); + saved_game.write(worldFlags); + saved_game.write(dmState); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(clients); - saved_game->read(maxclients); - saved_game->read(framenum); - saved_game->read(time); - saved_game->read(previousTime); - saved_game->read(globalTime); - saved_game->read(mapname); - saved_game->read(locationLinked); - saved_game->read(locationHead); - saved_game->read<>(alertEvents); - saved_game->read(numAlertEvents); - saved_game->read(curAlertID); - saved_game->read<>(groups); - saved_game->read<>(knownAnimFileSets); - saved_game->read(numKnownAnimFileSets); - saved_game->read(worldFlags); - saved_game->read(dmState); + saved_game.read(clients); + saved_game.read(maxclients); + saved_game.read(framenum); + saved_game.read(time); + saved_game.read(previousTime); + saved_game.read(globalTime); + saved_game.read(mapname); + saved_game.read(locationLinked); + saved_game.read(locationHead); + saved_game.read<>(alertEvents); + saved_game.read(numAlertEvents); + saved_game.read(curAlertID); + saved_game.read<>(groups); + saved_game.read<>(knownAnimFileSets); + saved_game.read(numKnownAnimFileSets); + saved_game.read(worldFlags); + saved_game.read(dmState); } }; // level_locals_t diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp index cafe9d6126..1196bb8f83 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -35,7 +35,7 @@ along with this program; if not, see . #include "objectives.h" #include "../cgame/cg_local.h" // yeah I know this is naughty, but we're shipping soon... #include "time.h" -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" extern CNavigator navigator; @@ -88,18 +88,24 @@ qboolean PInUse2(gentity_t *ent) return((g_entityInUseBits[entNum/32]&(((unsigned int)1)<<(entNum&0x1f)))!=0); } -void WriteInUseBits(void) +void WriteInUseBits() { - ::gi.saved_game->write_chunk( - INT_ID('I','N','U','S'), - ::g_entityInUseBits); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.write_chunk( + INT_ID('I', 'N', 'U', 'S'), + ::g_entityInUseBits); } -void ReadInUseBits(void) +void ReadInUseBits() { - ::gi.saved_game->read_chunk( - INT_ID('I','N','U','S'), - ::g_entityInUseBits); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('I', 'N', 'U', 'S'), + ::g_entityInUseBits); // This is only temporary. Once I have converted all the ent->inuse refs, // it won;t be needed -MW. @@ -1483,18 +1489,24 @@ extern qboolean player_locked; void G_LoadSave_WriteMiscData(void) { - ::gi.saved_game->write_chunk( - INT_ID('L','C','K','D'), - ::player_locked); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.write_chunk( + INT_ID('L', 'C', 'K', 'D'), + ::player_locked); } void G_LoadSave_ReadMiscData(void) { - ::gi.saved_game->read_chunk( - INT_ID('L','C','K','D'), - ::player_locked); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('L', 'C', 'K', 'D'), + ::player_locked); } diff --git a/codeJK2/game/g_objectives.cpp b/codeJK2/game/g_objectives.cpp index 60c9ade3b9..52629b85ac 100644 --- a/codeJK2/game/g_objectives.cpp +++ b/codeJK2/game/g_objectives.cpp @@ -31,7 +31,7 @@ along with this program; if not, see . #define G_OBJECTIVES_CPP #include "objectives.h" -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" qboolean missionInfo_Updated; @@ -62,9 +62,12 @@ OBJ_SaveMissionObjectives */ void OBJ_SaveMissionObjectives( gclient_t *client ) { - ::gi.saved_game->write_chunk( - INT_ID('O','B','J','T'), - client->sess.mission_objectives); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.write_chunk( + INT_ID('O', 'B', 'J', 'T'), + client->sess.mission_objectives); } @@ -89,9 +92,12 @@ OBJ_LoadMissionObjectives */ void OBJ_LoadMissionObjectives( gclient_t *client ) { - ::gi.saved_game->read_chunk( - INT_ID('O','B','J','T'), - client->sess.mission_objectives); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('O', 'B', 'J', 'T'), + client->sess.mission_objectives); } diff --git a/codeJK2/game/g_public.h b/codeJK2/game/g_public.h index e5e331300d..224af073f0 100644 --- a/codeJK2/game/g_public.h +++ b/codeJK2/game/g_public.h @@ -174,7 +174,7 @@ typedef struct { // Savegame handling // - ojk::ISavedGame* saved_game; + ojk::ISavedGameFile* saved_game; // add commands to the console as if they were typed in // for map changing, etc diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp index db72c04074..fcdde07e9f 100644 --- a/codeJK2/game/g_roff.cpp +++ b/codeJK2/game/g_roff.cpp @@ -25,7 +25,7 @@ along with this program; if not, see . #include "g_local.h" #include "g_roff.h" #include "g_icarus.h" -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" // The list of precached ROFFs roff_list_t roffs[MAX_ROFFS]; @@ -626,24 +626,28 @@ void G_SaveCachedRoffs() { int i, len; + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + // Write out the number of cached ROFFs - ::gi.saved_game->write_chunk( - INT_ID('R','O','F','F'), - ::num_roffs); + sgfh.write_chunk( + INT_ID('R', 'O', 'F', 'F'), + ::num_roffs); // Now dump out the cached ROFF file names in order so they can be loaded on the other end for ( i = 0; i < num_roffs; i++ ) { // Dump out the string length to make things a bit easier on the other end...heh heh. len = strlen( roffs[i].fileName ) + 1; - ::gi.saved_game->write_chunk( - INT_ID('S','L','E','N'), - len); - - ::gi.saved_game->write_chunk( - INT_ID('R','S','T','R'), - ::roffs[i].fileName, - len); + + sgfh.write_chunk( + INT_ID('S', 'L', 'E', 'N'), + len); + + sgfh.write_chunk( + INT_ID('R', 'S', 'T', 'R'), + ::roffs[i].fileName, + len); } } @@ -659,22 +663,25 @@ void G_LoadCachedRoffs() int i, count, len; char buffer[MAX_QPATH]; + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + // Get the count of goodies we need to revive - ::gi.saved_game->read_chunk( - INT_ID('R','O','F','F'), - count); + sgfh.read_chunk( + INT_ID('R', 'O', 'F', 'F'), + count); // Now bring 'em back to life for ( i = 0; i < count; i++ ) { - ::gi.saved_game->read_chunk( - INT_ID('S','L','E','N'), - len); - - ::gi.saved_game->read_chunk( - INT_ID('R','S','T','R'), - buffer, - len); + sgfh.read_chunk( + INT_ID('S', 'L', 'E', 'N'), + len); + + sgfh.read_chunk( + INT_ID('R', 'S', 'T', 'R'), + buffer, + len); G_LoadRoff( buffer ); } diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index 71a7d0b5b6..f5cb58df23 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -33,7 +33,7 @@ along with this program; if not, see . #include "../cgame/cg_camera.h" #include "g_icarus.h" #include "../../code/qcommon/sstring.h" -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" extern void OBJ_LoadTacticalInfo(void); @@ -184,10 +184,13 @@ char *GetStringPtr(int iStrlen, char *psOriginal/*may be NULL*/) assert(iStrlen+1<=(int)sizeof(sString)); - ::gi.saved_game->read_chunk( - INT_ID('S','T','R','G'), - sString, - iStrlen); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('S', 'T', 'R', 'G'), + sString, + iStrlen); // we can't do string recycling with the new g_alloc pool dumping, so just always alloc here... // @@ -447,42 +450,48 @@ void EnumerateField(const field_t *pField, byte *pbBase) template static void EnumerateFields( - const field_t* pFields, - T* src_instance, - unsigned int ulChid) + const field_t* pFields, + T* src_instance, + unsigned int ulChid) { - strList.clear(); - - auto pbData = reinterpret_cast( - src_instance); - - // enumerate all the fields... - // - if (pFields) { - for (auto pField = pFields; pField->psName; ++pField) { - assert(pField->iOffset < sizeof(T)); - ::EnumerateField(pField, pbData); - } - } - - // save out raw data... - // - ::gi.saved_game->reset_buffer(); - - src_instance->sg_export( - ::gi.saved_game); - - ::gi.saved_game->write_chunk( - ulChid); - - // save out any associated strings.. - // - for (const auto& it : strList) { - ::gi.saved_game->write_chunk( - INT_ID('S', 'T', 'R', 'G'), - it.c_str(), - static_cast(it.length() + 1)); - } + strList.clear(); + + auto pbData = reinterpret_cast( + src_instance); + + // enumerate all the fields... + // + if (pFields) + { + for (auto pField = pFields; pField->psName; ++pField) + { + assert(pField->iOffset < sizeof(T)); + ::EnumerateField(pField, pbData); + } + } + + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + // save out raw data... + // + sgfh.reset_buffer(); + + src_instance->sg_export( + sgfh); + + sgfh.write_chunk( + ulChid); + + // save out any associated strings.. + // + for (const auto& it : strList) + { + sgfh.write_chunk( + INT_ID('S', 'T', 'R', 'G'), + it.c_str(), + static_cast(it.length() + 1)); + } } static void EvaluateField(const field_t *pField, byte *pbBase, byte *pbOriginalRefData/* may be NULL*/) @@ -587,32 +596,33 @@ static const char *SG_GetChidText(unsigned int chid) template static void EvaluateFields( - const field_t* pFields, - T* pbData, - T* pbOriginalRefData, - unsigned int ulChid) + const field_t* pFields, + T* pbData, + T* pbOriginalRefData, + unsigned int ulChid) { - ::gi.saved_game->read_chunk( - ulChid); - - pbData->sg_import( - ::gi.saved_game); - - if (!::gi.saved_game->is_all_data_read()) - { - ::G_Error( - ::va("EvaluateFields(): variable-sized chunk '%s' without handler!", - ::SG_GetChidText(ulChid))); - } - - if (pFields) { - for (auto pField = pFields; pField->psName; ++pField) { - ::EvaluateField( - pField, - reinterpret_cast(pbData), - reinterpret_cast(pbOriginalRefData)); - } - } + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + if (!sgfh.try_read_chunk( + ulChid, + *pbData)) + { + ::G_Error( + ::va("EvaluateFields(): variable-sized chunk '%s' without handler!", + ::SG_GetChidText(ulChid))); + } + + if (pFields) + { + for (auto pField = pFields; pField->psName; ++pField) + { + ::EvaluateField( + pField, + reinterpret_cast(pbData), + reinterpret_cast(pbOriginalRefData)); + } + } } /* @@ -668,9 +678,12 @@ static void WriteGEntities(qboolean qbAutosave) } } - ::gi.saved_game->write_chunk( - INT_ID('N','M','E','D'), - iCount); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.write_chunk( + INT_ID('N', 'M', 'E', 'D'), + iCount); for (i=0; i<(qbAutosave?1:globals.num_entities); i++) { @@ -678,9 +691,9 @@ static void WriteGEntities(qboolean qbAutosave) if ( ent->inuse) { - ::gi.saved_game->write_chunk( - INT_ID('E','D','N','M'), - i); + sgfh.write_chunk( + INT_ID('E', 'D', 'N', 'M'), + i); qboolean qbLinked = ent->linked; gi.unlinkentity( ent ); @@ -711,9 +724,9 @@ static void WriteGEntities(qboolean qbAutosave) if (tempEnt.parms) { - ::gi.saved_game->write_chunk( - INT_ID('P','A','R','M'), - *ent->parms); + sgfh.write_chunk( + INT_ID('P', 'A', 'R', 'M'), + *ent->parms); } // the scary ghoul2 saver stuff... (fingers crossed) @@ -737,9 +750,9 @@ static void WriteGEntities(qboolean qbAutosave) // static int iBlah = 1234; - ::gi.saved_game->write_chunk( - INT_ID('I','C','O','K'), - iBlah); + sgfh.write_chunk( + INT_ID('I', 'C', 'O', 'K'), + iBlah); } if (!qbAutosave )//really shouldn't need to write these bits at all, just restore them from the ents... { @@ -752,17 +765,21 @@ static void ReadGEntities(qboolean qbAutosave) int iCount; int i; - ::gi.saved_game->read_chunk( - INT_ID('N','M','E','D'), - iCount); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('N', 'M', 'E', 'D'), + iCount); int iPreviousEntRead = -1; for (i=0; iread_chunk( - INT_ID('E','D','N','M'), - iEntIndex); + + sgfh.read_chunk( + INT_ID('E', 'D', 'N', 'M'), + iEntIndex); if (iEntIndex >= globals.num_entities) { @@ -862,9 +879,9 @@ static void ReadGEntities(qboolean qbAutosave) { parms_t tempParms; - ::gi.saved_game->read_chunk( - INT_ID('P','A','R','M'), - tempParms); + sgfh.read_chunk( + INT_ID('P', 'A', 'R', 'M'), + tempParms); // so can we pinch the original's one or do we have to alloc a new one?... // @@ -890,15 +907,17 @@ static void ReadGEntities(qboolean qbAutosave) // { #ifdef JK2_MODE - // Skip GL2 data size - ::gi.saved_game->read_chunk( - INT_ID('G','L','2','S')); + // Skip GL2 data size + sgfh.read_chunk( + INT_ID('G', 'L', '2', 'S')); #endif // JK2_MODE - ::gi.saved_game->read_chunk( - INT_ID('G','H','L','2')); + sgfh.read_chunk( + INT_ID('G', 'H', 'L', '2')); - gi.G2API_LoadGhoul2Models(pEnt->ghoul2, nullptr); + gi.G2API_LoadGhoul2Models( + pEnt->ghoul2, + nullptr); } // gi.unlinkentity (pEntOriginal); @@ -958,9 +977,9 @@ static void ReadGEntities(qboolean qbAutosave) // static int iBlah = 1234; - ::gi.saved_game->read_chunk( - INT_ID('I','C','O','K'), - iBlah); + sgfh.read_chunk( + INT_ID('I', 'C', 'O', 'K'), + iBlah); } if (!qbAutosave) { @@ -997,9 +1016,12 @@ void WriteLevel(qboolean qbAutosave) // static int iDONE = 1234; - ::gi.saved_game->write_chunk( - INT_ID('D','O','N','E'), - iDONE); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.write_chunk( + INT_ID('D', 'O', 'N', 'E'), + iDONE); } void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) @@ -1022,8 +1044,11 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) EvaluateFields(savefields_gClient, &junkClient, &level.clients[0], INT_ID('G','C','L','I')); //Read & throw away objective info - ::gi.saved_game->read_chunk( - INT_ID('O','B','J','T')); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('O', 'B', 'J', 'T')); ReadLevelLocals(); // level_locals_t level } @@ -1057,9 +1082,12 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) // static int iDONE = 1234; - ::gi.saved_game->read_chunk( - INT_ID('D','O','N','E'), - iDONE); + ojk::SavedGameFileHelper sgfh( + ::gi.saved_game); + + sgfh.read_chunk( + INT_ID('D', 'O', 'N', 'E'), + iDONE); } extern int killPlayerTimer; diff --git a/codeJK2/game/g_shared.h b/codeJK2/game/g_shared.h index 3aefa95359..c84d2927c0 100644 --- a/codeJK2/game/g_shared.h +++ b/codeJK2/game/g_shared.h @@ -154,49 +154,49 @@ class clientInfo_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(infoValid); - saved_game->write(name); - saved_game->write(team); - saved_game->write(score); - saved_game->write(handicap); - saved_game->write(legsModel); - saved_game->write(legsSkin); - saved_game->write(torsoModel); - saved_game->write(torsoSkin); - saved_game->write(headModel); - saved_game->write(headSkin); - saved_game->write(extensions); - saved_game->write(animFileIndex); - saved_game->write(sounds); - saved_game->write(customBasicSoundDir); - saved_game->write(customCombatSoundDir); - saved_game->write(customExtraSoundDir); - saved_game->write(customJediSoundDir); + saved_game.write(infoValid); + saved_game.write(name); + saved_game.write(team); + saved_game.write(score); + saved_game.write(handicap); + saved_game.write(legsModel); + saved_game.write(legsSkin); + saved_game.write(torsoModel); + saved_game.write(torsoSkin); + saved_game.write(headModel); + saved_game.write(headSkin); + saved_game.write(extensions); + saved_game.write(animFileIndex); + saved_game.write(sounds); + saved_game.write(customBasicSoundDir); + saved_game.write(customCombatSoundDir); + saved_game.write(customExtraSoundDir); + saved_game.write(customJediSoundDir); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(infoValid); - saved_game->read(name); - saved_game->read(team); - saved_game->read(score); - saved_game->read(handicap); - saved_game->read(legsModel); - saved_game->read(legsSkin); - saved_game->read(torsoModel); - saved_game->read(torsoSkin); - saved_game->read(headModel); - saved_game->read(headSkin); - saved_game->read(extensions); - saved_game->read(animFileIndex); - saved_game->read(sounds); - saved_game->read(customBasicSoundDir); - saved_game->read(customCombatSoundDir); - saved_game->read(customExtraSoundDir); - saved_game->read(customJediSoundDir); + saved_game.read(infoValid); + saved_game.read(name); + saved_game.read(team); + saved_game.read(score); + saved_game.read(handicap); + saved_game.read(legsModel); + saved_game.read(legsSkin); + saved_game.read(torsoModel); + saved_game.read(torsoSkin); + saved_game.read(headModel); + saved_game.read(headSkin); + saved_game.read(extensions); + saved_game.read(animFileIndex); + saved_game.read(sounds); + saved_game.read(customBasicSoundDir); + saved_game.read(customCombatSoundDir); + saved_game.read(customExtraSoundDir); + saved_game.read(customJediSoundDir); } }; // clientInfo_t @@ -221,19 +221,19 @@ typedef struct modelInfo_s void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(modelIndex); - saved_game->write(customRGB); - saved_game->write(customAlpha); + saved_game.write(modelIndex); + saved_game.write(customRGB); + saved_game.write(customAlpha); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(modelIndex); - saved_game->read(customRGB); - saved_game->read(customAlpha); + saved_game.read(modelIndex); + saved_game.read(customRGB); + saved_game.read(customAlpha); } } modelInfo_t; @@ -336,107 +336,107 @@ class renderInfo_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write<>(legsModel); - saved_game->write(legsModelName); - saved_game->write<>(torsoModel); - saved_game->write<>(headModel); - saved_game->write(torsoModelName); - saved_game->write(headModelName); - saved_game->write(headYawRangeLeft); - saved_game->write(headYawRangeRight); - saved_game->write(headPitchRangeUp); - saved_game->write(headPitchRangeDown); - saved_game->write(torsoYawRangeLeft); - saved_game->write(torsoYawRangeRight); - saved_game->write(torsoPitchRangeUp); - saved_game->write(torsoPitchRangeDown); - saved_game->write(legsFrame); - saved_game->write(torsoFrame); - saved_game->write(legsFpsMod); - saved_game->write(torsoFpsMod); - saved_game->write(customRGB); - saved_game->write(customAlpha); - saved_game->write(renderFlags); - saved_game->write(muzzlePoint); - saved_game->write(muzzleDir); - saved_game->write(muzzlePointOld); - saved_game->write(muzzleDirOld); - saved_game->write(mPCalcTime); - saved_game->write(lockYaw); - saved_game->write(headPoint); - saved_game->write(headAngles); - saved_game->write(handRPoint); - saved_game->write(handLPoint); - saved_game->write(crotchPoint); - saved_game->write(footRPoint); - saved_game->write(footLPoint); - saved_game->write(torsoPoint); - saved_game->write(torsoAngles); - saved_game->write(eyePoint); - saved_game->write(eyeAngles); - saved_game->write(lookTarget); - saved_game->write(lookMode); - saved_game->write(lookTargetClearTime); - saved_game->write(lastVoiceVolume); - saved_game->write(lastHeadAngles); - saved_game->write(headBobAngles); - saved_game->write(targetHeadBobAngles); - saved_game->write(lookingDebounceTime); - saved_game->write(legsYaw); + saved_game.write<>(legsModel); + saved_game.write(legsModelName); + saved_game.write<>(torsoModel); + saved_game.write<>(headModel); + saved_game.write(torsoModelName); + saved_game.write(headModelName); + saved_game.write(headYawRangeLeft); + saved_game.write(headYawRangeRight); + saved_game.write(headPitchRangeUp); + saved_game.write(headPitchRangeDown); + saved_game.write(torsoYawRangeLeft); + saved_game.write(torsoYawRangeRight); + saved_game.write(torsoPitchRangeUp); + saved_game.write(torsoPitchRangeDown); + saved_game.write(legsFrame); + saved_game.write(torsoFrame); + saved_game.write(legsFpsMod); + saved_game.write(torsoFpsMod); + saved_game.write(customRGB); + saved_game.write(customAlpha); + saved_game.write(renderFlags); + saved_game.write(muzzlePoint); + saved_game.write(muzzleDir); + saved_game.write(muzzlePointOld); + saved_game.write(muzzleDirOld); + saved_game.write(mPCalcTime); + saved_game.write(lockYaw); + saved_game.write(headPoint); + saved_game.write(headAngles); + saved_game.write(handRPoint); + saved_game.write(handLPoint); + saved_game.write(crotchPoint); + saved_game.write(footRPoint); + saved_game.write(footLPoint); + saved_game.write(torsoPoint); + saved_game.write(torsoAngles); + saved_game.write(eyePoint); + saved_game.write(eyeAngles); + saved_game.write(lookTarget); + saved_game.write(lookMode); + saved_game.write(lookTargetClearTime); + saved_game.write(lastVoiceVolume); + saved_game.write(lastHeadAngles); + saved_game.write(headBobAngles); + saved_game.write(targetHeadBobAngles); + saved_game.write(lookingDebounceTime); + saved_game.write(legsYaw); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read<>(legsModel); - saved_game->read(legsModelName); - saved_game->read<>(torsoModel); - saved_game->read<>(headModel); - saved_game->read(torsoModelName); - saved_game->read(headModelName); - saved_game->read(headYawRangeLeft); - saved_game->read(headYawRangeRight); - saved_game->read(headPitchRangeUp); - saved_game->read(headPitchRangeDown); - saved_game->read(torsoYawRangeLeft); - saved_game->read(torsoYawRangeRight); - saved_game->read(torsoPitchRangeUp); - saved_game->read(torsoPitchRangeDown); - saved_game->read(legsFrame); - saved_game->read(torsoFrame); - saved_game->read(legsFpsMod); - saved_game->read(torsoFpsMod); - saved_game->read(customRGB); - saved_game->read(customAlpha); - saved_game->read(renderFlags); - saved_game->read(muzzlePoint); - saved_game->read(muzzleDir); - saved_game->read(muzzlePointOld); - saved_game->read(muzzleDirOld); - saved_game->read(mPCalcTime); - saved_game->read(lockYaw); - saved_game->read(headPoint); - saved_game->read(headAngles); - saved_game->read(handRPoint); - saved_game->read(handLPoint); - saved_game->read(crotchPoint); - saved_game->read(footRPoint); - saved_game->read(footLPoint); - saved_game->read(torsoPoint); - saved_game->read(torsoAngles); - saved_game->read(eyePoint); - saved_game->read(eyeAngles); - saved_game->read(lookTarget); - saved_game->read(lookMode); - saved_game->read(lookTargetClearTime); - saved_game->read(lastVoiceVolume); - saved_game->read(lastHeadAngles); - saved_game->read(headBobAngles); - saved_game->read(targetHeadBobAngles); - saved_game->read(lookingDebounceTime); - saved_game->read(legsYaw); + saved_game.read<>(legsModel); + saved_game.read(legsModelName); + saved_game.read<>(torsoModel); + saved_game.read<>(headModel); + saved_game.read(torsoModelName); + saved_game.read(headModelName); + saved_game.read(headYawRangeLeft); + saved_game.read(headYawRangeRight); + saved_game.read(headPitchRangeUp); + saved_game.read(headPitchRangeDown); + saved_game.read(torsoYawRangeLeft); + saved_game.read(torsoYawRangeRight); + saved_game.read(torsoPitchRangeUp); + saved_game.read(torsoPitchRangeDown); + saved_game.read(legsFrame); + saved_game.read(torsoFrame); + saved_game.read(legsFpsMod); + saved_game.read(torsoFpsMod); + saved_game.read(customRGB); + saved_game.read(customAlpha); + saved_game.read(renderFlags); + saved_game.read(muzzlePoint); + saved_game.read(muzzleDir); + saved_game.read(muzzlePointOld); + saved_game.read(muzzleDirOld); + saved_game.read(mPCalcTime); + saved_game.read(lockYaw); + saved_game.read(headPoint); + saved_game.read(headAngles); + saved_game.read(handRPoint); + saved_game.read(handLPoint); + saved_game.read(crotchPoint); + saved_game.read(footRPoint); + saved_game.read(footLPoint); + saved_game.read(torsoPoint); + saved_game.read(torsoAngles); + saved_game.read(eyePoint); + saved_game.read(eyeAngles); + saved_game.read(lookTarget); + saved_game.read(lookMode); + saved_game.read(lookTargetClearTime); + saved_game.read(lastVoiceVolume); + saved_game.read(lastHeadAngles); + saved_game.read(headBobAngles); + saved_game.read(targetHeadBobAngles); + saved_game.read(lookingDebounceTime); + saved_game.read(legsYaw); } }; // renderInfo_t @@ -485,35 +485,35 @@ class playerTeamState_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(state); - saved_game->write(captures); - saved_game->write(basedefense); - saved_game->write(carrierdefense); - saved_game->write(flagrecovery); - saved_game->write(fragcarrier); - saved_game->write(assists); - saved_game->write(lasthurtcarrier); - saved_game->write(lastreturnedflag); - saved_game->write(flagsince); - saved_game->write(lastfraggedcarrier); + saved_game.write(state); + saved_game.write(captures); + saved_game.write(basedefense); + saved_game.write(carrierdefense); + saved_game.write(flagrecovery); + saved_game.write(fragcarrier); + saved_game.write(assists); + saved_game.write(lasthurtcarrier); + saved_game.write(lastreturnedflag); + saved_game.write(flagsince); + saved_game.write(lastfraggedcarrier); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(state); - saved_game->read(captures); - saved_game->read(basedefense); - saved_game->read(carrierdefense); - saved_game->read(flagrecovery); - saved_game->read(fragcarrier); - saved_game->read(assists); - saved_game->read(lasthurtcarrier); - saved_game->read(lastreturnedflag); - saved_game->read(flagsince); - saved_game->read(lastfraggedcarrier); + saved_game.read(state); + saved_game.read(captures); + saved_game.read(basedefense); + saved_game.read(carrierdefense); + saved_game.read(flagrecovery); + saved_game.read(fragcarrier); + saved_game.read(assists); + saved_game.read(lasthurtcarrier); + saved_game.read(lastreturnedflag); + saved_game.read(flagsince); + saved_game.read(lastfraggedcarrier); } }; // playerTeamState_t @@ -526,17 +526,17 @@ class objectives_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(display); - saved_game->write(status); + saved_game.write(display); + saved_game.write(status); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(display); - saved_game->read(status); + saved_game.read(display); + saved_game.read(status); } }; // objectives_t #define MAX_MISSION_OBJ 80 @@ -562,41 +562,41 @@ class missionStats_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(secretsFound); - saved_game->write(totalSecrets); - saved_game->write(shotsFired); - saved_game->write(hits); - saved_game->write(enemiesSpawned); - saved_game->write(enemiesKilled); - saved_game->write(saberThrownCnt); - saved_game->write(saberBlocksCnt); - saved_game->write(legAttacksCnt); - saved_game->write(armAttacksCnt); - saved_game->write(torsoAttacksCnt); - saved_game->write(otherAttacksCnt); - saved_game->write(forceUsed); - saved_game->write(weaponUsed); + saved_game.write(secretsFound); + saved_game.write(totalSecrets); + saved_game.write(shotsFired); + saved_game.write(hits); + saved_game.write(enemiesSpawned); + saved_game.write(enemiesKilled); + saved_game.write(saberThrownCnt); + saved_game.write(saberBlocksCnt); + saved_game.write(legAttacksCnt); + saved_game.write(armAttacksCnt); + saved_game.write(torsoAttacksCnt); + saved_game.write(otherAttacksCnt); + saved_game.write(forceUsed); + saved_game.write(weaponUsed); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(secretsFound); - saved_game->read(totalSecrets); - saved_game->read(shotsFired); - saved_game->read(hits); - saved_game->read(enemiesSpawned); - saved_game->read(enemiesKilled); - saved_game->read(saberThrownCnt); - saved_game->read(saberBlocksCnt); - saved_game->read(legAttacksCnt); - saved_game->read(armAttacksCnt); - saved_game->read(torsoAttacksCnt); - saved_game->read(otherAttacksCnt); - saved_game->read(forceUsed); - saved_game->read(weaponUsed); + saved_game.read(secretsFound); + saved_game.read(totalSecrets); + saved_game.read(shotsFired); + saved_game.read(hits); + saved_game.read(enemiesSpawned); + saved_game.read(enemiesKilled); + saved_game.read(saberThrownCnt); + saved_game.read(saberBlocksCnt); + saved_game.read(legAttacksCnt); + saved_game.read(armAttacksCnt); + saved_game.read(torsoAttacksCnt); + saved_game.read(otherAttacksCnt); + saved_game.read(forceUsed); + saved_game.read(weaponUsed); } }; // missionStats_t @@ -621,21 +621,21 @@ class clientSession_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(missionObjectivesShown); - saved_game->write(sessionTeam); - saved_game->write<>(mission_objectives); - saved_game->write<>(missionStats); + saved_game.write(missionObjectivesShown); + saved_game.write(sessionTeam); + saved_game.write<>(mission_objectives); + saved_game.write<>(missionStats); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(missionObjectivesShown); - saved_game->read(sessionTeam); - saved_game->read<>(mission_objectives); - saved_game->read<>(missionStats); + saved_game.read(missionObjectivesShown); + saved_game.read(sessionTeam); + saved_game.read<>(mission_objectives); + saved_game.read<>(missionStats); } }; // clientSession_t @@ -657,33 +657,33 @@ class clientPersistant_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(connected); - saved_game->write<>(lastCommand); - saved_game->write(localClient); - saved_game->write(netname); - saved_game->skip(2); - saved_game->write(maxHealth); - saved_game->write(enterTime); - saved_game->write(cmd_angles); - saved_game->skip(2); - saved_game->write<>(teamState); + saved_game.write(connected); + saved_game.write<>(lastCommand); + saved_game.write(localClient); + saved_game.write(netname); + saved_game.skip(2); + saved_game.write(maxHealth); + saved_game.write(enterTime); + saved_game.write(cmd_angles); + saved_game.skip(2); + saved_game.write<>(teamState); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(connected); - saved_game->read<>(lastCommand); - saved_game->read(localClient); - saved_game->read(netname); - saved_game->skip(2); - saved_game->read(maxHealth); - saved_game->read(enterTime); - saved_game->read(cmd_angles); - saved_game->skip(2); - saved_game->read<>(teamState); + saved_game.read(connected); + saved_game.read<>(lastCommand); + saved_game.read(localClient); + saved_game.read(netname); + saved_game.skip(2); + saved_game.read(maxHealth); + saved_game.read(enterTime); + saved_game.read(cmd_angles); + saved_game.skip(2); + saved_game.read<>(teamState); } }; // clientPersistant_t @@ -804,127 +804,127 @@ class gclient_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write<>(ps); - saved_game->write<>(pers); - saved_game->write<>(sess); - saved_game->write(noclip); - saved_game->write(lastCmdTime); - saved_game->write<>(usercmd); - saved_game->write(buttons); - saved_game->write(oldbuttons); - saved_game->write(latched_buttons); - saved_game->write(damage_armor); - saved_game->write(damage_blood); - saved_game->write(damage_knockback); - saved_game->write(damage_from); - saved_game->write(damage_fromWorld); - saved_game->write(accurateCount); - saved_game->write(respawnTime); - saved_game->write(inactivityTime); - saved_game->write(inactivityWarning); - saved_game->write(idleTime); - saved_game->write(airOutTime); - saved_game->write(timeResidual); - saved_game->write(facial_blink); - saved_game->write(facial_frown); - saved_game->write(facial_aux); - saved_game->write<>(clientInfo); - saved_game->write(forced_forwardmove); - saved_game->write(forced_rightmove); - saved_game->skip(2); - saved_game->write(fireDelay); - saved_game->write(playerTeam); - saved_game->write(enemyTeam); - saved_game->write(squadname); - saved_game->write(team_leader); - saved_game->write(leader); - saved_game->write(follower); - saved_game->write(numFollowers); - saved_game->write(formationGoal); - saved_game->write(nextFormGoal); - saved_game->write(NPC_class); - saved_game->write(hiddenDist); - saved_game->write(hiddenDir); - saved_game->write<>(renderInfo); - saved_game->write<>(saberTrail); - saved_game->write(dismembered); - saved_game->write(dismemberProbLegs); - saved_game->write(dismemberProbHead); - saved_game->write(dismemberProbArms); - saved_game->write(dismemberProbHands); - saved_game->write(dismemberProbWaist); - saved_game->skip(3); - saved_game->write(standheight); - saved_game->write(crouchheight); - saved_game->write(poisonDamage); - saved_game->write(poisonTime); - saved_game->write(slopeRecalcTime); - saved_game->write(pushVec); - saved_game->write(pushVecTime); + saved_game.write<>(ps); + saved_game.write<>(pers); + saved_game.write<>(sess); + saved_game.write(noclip); + saved_game.write(lastCmdTime); + saved_game.write<>(usercmd); + saved_game.write(buttons); + saved_game.write(oldbuttons); + saved_game.write(latched_buttons); + saved_game.write(damage_armor); + saved_game.write(damage_blood); + saved_game.write(damage_knockback); + saved_game.write(damage_from); + saved_game.write(damage_fromWorld); + saved_game.write(accurateCount); + saved_game.write(respawnTime); + saved_game.write(inactivityTime); + saved_game.write(inactivityWarning); + saved_game.write(idleTime); + saved_game.write(airOutTime); + saved_game.write(timeResidual); + saved_game.write(facial_blink); + saved_game.write(facial_frown); + saved_game.write(facial_aux); + saved_game.write<>(clientInfo); + saved_game.write(forced_forwardmove); + saved_game.write(forced_rightmove); + saved_game.skip(2); + saved_game.write(fireDelay); + saved_game.write(playerTeam); + saved_game.write(enemyTeam); + saved_game.write(squadname); + saved_game.write(team_leader); + saved_game.write(leader); + saved_game.write(follower); + saved_game.write(numFollowers); + saved_game.write(formationGoal); + saved_game.write(nextFormGoal); + saved_game.write(NPC_class); + saved_game.write(hiddenDist); + saved_game.write(hiddenDir); + saved_game.write<>(renderInfo); + saved_game.write<>(saberTrail); + saved_game.write(dismembered); + saved_game.write(dismemberProbLegs); + saved_game.write(dismemberProbHead); + saved_game.write(dismemberProbArms); + saved_game.write(dismemberProbHands); + saved_game.write(dismemberProbWaist); + saved_game.skip(3); + saved_game.write(standheight); + saved_game.write(crouchheight); + saved_game.write(poisonDamage); + saved_game.write(poisonTime); + saved_game.write(slopeRecalcTime); + saved_game.write(pushVec); + saved_game.write(pushVecTime); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read<>(ps); - saved_game->read<>(pers); - saved_game->read<>(sess); - saved_game->read(noclip); - saved_game->read(lastCmdTime); - saved_game->read<>(usercmd); - saved_game->read(buttons); - saved_game->read(oldbuttons); - saved_game->read(latched_buttons); - saved_game->read(damage_armor); - saved_game->read(damage_blood); - saved_game->read(damage_knockback); - saved_game->read(damage_from); - saved_game->read(damage_fromWorld); - saved_game->read(accurateCount); - saved_game->read(respawnTime); - saved_game->read(inactivityTime); - saved_game->read(inactivityWarning); - saved_game->read(idleTime); - saved_game->read(airOutTime); - saved_game->read(timeResidual); - saved_game->read(facial_blink); - saved_game->read(facial_frown); - saved_game->read(facial_aux); - saved_game->read<>(clientInfo); - saved_game->read(forced_forwardmove); - saved_game->read(forced_rightmove); - saved_game->skip(2); - saved_game->read(fireDelay); - saved_game->read(playerTeam); - saved_game->read(enemyTeam); - saved_game->read(squadname); - saved_game->read(team_leader); - saved_game->read(leader); - saved_game->read(follower); - saved_game->read(numFollowers); - saved_game->read(formationGoal); - saved_game->read(nextFormGoal); - saved_game->read(NPC_class); - saved_game->read(hiddenDist); - saved_game->read(hiddenDir); - saved_game->read<>(renderInfo); - saved_game->read<>(saberTrail); - saved_game->read(dismembered); - saved_game->read(dismemberProbLegs); - saved_game->read(dismemberProbHead); - saved_game->read(dismemberProbArms); - saved_game->read(dismemberProbHands); - saved_game->read(dismemberProbWaist); - saved_game->skip(3); - saved_game->read(standheight); - saved_game->read(crouchheight); - saved_game->read(poisonDamage); - saved_game->read(poisonTime); - saved_game->read(slopeRecalcTime); - saved_game->read(pushVec); - saved_game->read(pushVecTime); + saved_game.read<>(ps); + saved_game.read<>(pers); + saved_game.read<>(sess); + saved_game.read(noclip); + saved_game.read(lastCmdTime); + saved_game.read<>(usercmd); + saved_game.read(buttons); + saved_game.read(oldbuttons); + saved_game.read(latched_buttons); + saved_game.read(damage_armor); + saved_game.read(damage_blood); + saved_game.read(damage_knockback); + saved_game.read(damage_from); + saved_game.read(damage_fromWorld); + saved_game.read(accurateCount); + saved_game.read(respawnTime); + saved_game.read(inactivityTime); + saved_game.read(inactivityWarning); + saved_game.read(idleTime); + saved_game.read(airOutTime); + saved_game.read(timeResidual); + saved_game.read(facial_blink); + saved_game.read(facial_frown); + saved_game.read(facial_aux); + saved_game.read<>(clientInfo); + saved_game.read(forced_forwardmove); + saved_game.read(forced_rightmove); + saved_game.skip(2); + saved_game.read(fireDelay); + saved_game.read(playerTeam); + saved_game.read(enemyTeam); + saved_game.read(squadname); + saved_game.read(team_leader); + saved_game.read(leader); + saved_game.read(follower); + saved_game.read(numFollowers); + saved_game.read(formationGoal); + saved_game.read(nextFormGoal); + saved_game.read(NPC_class); + saved_game.read(hiddenDist); + saved_game.read(hiddenDir); + saved_game.read<>(renderInfo); + saved_game.read<>(saberTrail); + saved_game.read(dismembered); + saved_game.read(dismemberProbLegs); + saved_game.read(dismemberProbHead); + saved_game.read(dismemberProbArms); + saved_game.read(dismemberProbHands); + saved_game.read(dismemberProbWaist); + saved_game.skip(3); + saved_game.read(standheight); + saved_game.read(crouchheight); + saved_game.read(poisonDamage); + saved_game.read(poisonTime); + saved_game.read(slopeRecalcTime); + saved_game.read(pushVec); + saved_game.read(pushVecTime); } }; // gclient_t @@ -938,15 +938,15 @@ class parms_t void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write(parm); + saved_game.write(parm); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read(parm); + saved_game.read(parm); } }; // parms_t @@ -1266,365 +1266,365 @@ Ghoul2 Insert End void sg_export( - ojk::ISavedGame* saved_game) const + ojk::SavedGameFileHelper& saved_game) const { - saved_game->write<>(s); - saved_game->write(client); - saved_game->write(inuse); - saved_game->write(linked); - saved_game->write(svFlags); - saved_game->write(bmodel); - saved_game->write(mins); - saved_game->write(maxs); - saved_game->write(contents); - saved_game->write(absmin); - saved_game->write(absmax); - saved_game->write(currentOrigin); - saved_game->write(currentAngles); - saved_game->write(owner); - saved_game->write<>(ghoul2); - saved_game->write(classname); - saved_game->write(spawnflags); - saved_game->write(flags); - saved_game->write(model); - saved_game->write(model2); - saved_game->write(freetime); - saved_game->write(eventTime); - saved_game->write(freeAfterEvent); - saved_game->write(unlinkAfterEvent); - saved_game->write(physicsBounce); - saved_game->write(clipmask); - saved_game->write(speed); - saved_game->write(movedir); - saved_game->write(lastOrigin); - saved_game->write(lastAngles); - saved_game->write(mass); - saved_game->write(lastImpact); - saved_game->write(watertype); - saved_game->write(waterlevel); - saved_game->write(angle); - saved_game->write(target); - saved_game->write(target2); - saved_game->write(target3); - saved_game->write(target4); - saved_game->write(targetname); - saved_game->write(team); - saved_game->write(roff); - saved_game->write(roff_ctr); - saved_game->write(next_roff_time); - saved_game->write(fx_time); - saved_game->write(nextthink); - saved_game->write(e_ThinkFunc); - saved_game->write(e_clThinkFunc); - saved_game->write(e_ReachedFunc); - saved_game->write(e_BlockedFunc); - saved_game->write(e_TouchFunc); - saved_game->write(e_UseFunc); - saved_game->write(e_PainFunc); - saved_game->write(e_DieFunc); - saved_game->write(health); - saved_game->write(max_health); - saved_game->write(takedamage); - saved_game->write(material); - saved_game->write(damage); - saved_game->write(dflags); - saved_game->write(splashDamage); - saved_game->write(splashRadius); - saved_game->write(methodOfDeath); - saved_game->write(splashMethodOfDeath); - saved_game->write(locationDamage); - saved_game->write(chain); - saved_game->write(enemy); - saved_game->write(activator); - saved_game->write(teamchain); - saved_game->write(teammaster); - saved_game->write(lastEnemy); - saved_game->write(wait); - saved_game->write(random); - saved_game->write(delay); - saved_game->write(alt_fire); - saved_game->write(count); - saved_game->write(bounceCount); - saved_game->write(fly_sound_debounce_time); - saved_game->write(painDebounceTime); - saved_game->write(disconnectDebounceTime); - saved_game->write(attackDebounceTime); - saved_game->write(pushDebounceTime); - saved_game->write(aimDebounceTime); - saved_game->write(useDebounceTime); - saved_game->write(trigger_formation); - saved_game->write(waypoint); - saved_game->write(lastWaypoint); - saved_game->write(lastValidWaypoint); - saved_game->write(noWaypointTime); - saved_game->write(combatPoint); - saved_game->write(failedWaypoints); - saved_game->write(failedWaypointCheckTime); - saved_game->write(loopAnim); - saved_game->write(startFrame); - saved_game->write(endFrame); - saved_game->write(sequencer); - saved_game->write(taskManager); - saved_game->write(taskID); - saved_game->write(parms); - saved_game->write(behaviorSet); - saved_game->write(script_targetname); - saved_game->write(delayScriptTime); - saved_game->write(fullName); - saved_game->write(soundSet); - saved_game->write(setTime); - saved_game->write(cameraGroup); - saved_game->write(noDamageTeam); - saved_game->write(playerModel); - saved_game->write(weaponModel); - saved_game->write(handRBolt); - saved_game->write(handLBolt); - saved_game->write(headBolt); - saved_game->write(cervicalBolt); - saved_game->write(chestBolt); - saved_game->write(gutBolt); - saved_game->write(torsoBolt); - saved_game->write(crotchBolt); - saved_game->write(motionBolt); - saved_game->write(kneeLBolt); - saved_game->write(kneeRBolt); - saved_game->write(elbowLBolt); - saved_game->write(elbowRBolt); - saved_game->write(footLBolt); - saved_game->write(footRBolt); - saved_game->write(faceBone); - saved_game->write(craniumBone); - saved_game->write(cervicalBone); - saved_game->write(thoracicBone); - saved_game->write(upperLumbarBone); - saved_game->write(lowerLumbarBone); - saved_game->write(hipsBone); - saved_game->write(motionBone); - saved_game->write(rootBone); - saved_game->write(footLBone); - saved_game->write(footRBone); - saved_game->write(genericBone1); - saved_game->write(genericBone2); - saved_game->write(genericBone3); - saved_game->write(genericBolt1); - saved_game->write(genericBolt2); - saved_game->write(genericBolt3); - saved_game->write(genericBolt4); - saved_game->write(genericBolt5); - saved_game->write(cinematicModel); - saved_game->write(NPC); - saved_game->write(ownername); - saved_game->write(cantHitEnemyCounter); - saved_game->write(NPC_type); - saved_game->write(NPC_targetname); - saved_game->write(NPC_target); - saved_game->write(moverState); - saved_game->write(soundPos1); - saved_game->write(sound1to2); - saved_game->write(sound2to1); - saved_game->write(soundPos2); - saved_game->write(soundLoop); - saved_game->write(nextTrain); - saved_game->write(prevTrain); - saved_game->write(pos1); - saved_game->write(pos2); - saved_game->write(pos3); - saved_game->write(sounds); - saved_game->write(closetarget); - saved_game->write(opentarget); - saved_game->write(paintarget); - saved_game->write(lockCount); - saved_game->write(radius); - saved_game->write(wpIndex); - saved_game->write(noise_index); - saved_game->write(startRGBA); - saved_game->write(finalRGBA); - saved_game->write(item); - saved_game->write(message); - saved_game->write(lightLevel); - saved_game->write(forcePushTime); - saved_game->write(forcePuller); + saved_game.write<>(s); + saved_game.write(client); + saved_game.write(inuse); + saved_game.write(linked); + saved_game.write(svFlags); + saved_game.write(bmodel); + saved_game.write(mins); + saved_game.write(maxs); + saved_game.write(contents); + saved_game.write(absmin); + saved_game.write(absmax); + saved_game.write(currentOrigin); + saved_game.write(currentAngles); + saved_game.write(owner); + saved_game.write<>(ghoul2); + saved_game.write(classname); + saved_game.write(spawnflags); + saved_game.write(flags); + saved_game.write(model); + saved_game.write(model2); + saved_game.write(freetime); + saved_game.write(eventTime); + saved_game.write(freeAfterEvent); + saved_game.write(unlinkAfterEvent); + saved_game.write(physicsBounce); + saved_game.write(clipmask); + saved_game.write(speed); + saved_game.write(movedir); + saved_game.write(lastOrigin); + saved_game.write(lastAngles); + saved_game.write(mass); + saved_game.write(lastImpact); + saved_game.write(watertype); + saved_game.write(waterlevel); + saved_game.write(angle); + saved_game.write(target); + saved_game.write(target2); + saved_game.write(target3); + saved_game.write(target4); + saved_game.write(targetname); + saved_game.write(team); + saved_game.write(roff); + saved_game.write(roff_ctr); + saved_game.write(next_roff_time); + saved_game.write(fx_time); + saved_game.write(nextthink); + saved_game.write(e_ThinkFunc); + saved_game.write(e_clThinkFunc); + saved_game.write(e_ReachedFunc); + saved_game.write(e_BlockedFunc); + saved_game.write(e_TouchFunc); + saved_game.write(e_UseFunc); + saved_game.write(e_PainFunc); + saved_game.write(e_DieFunc); + saved_game.write(health); + saved_game.write(max_health); + saved_game.write(takedamage); + saved_game.write(material); + saved_game.write(damage); + saved_game.write(dflags); + saved_game.write(splashDamage); + saved_game.write(splashRadius); + saved_game.write(methodOfDeath); + saved_game.write(splashMethodOfDeath); + saved_game.write(locationDamage); + saved_game.write(chain); + saved_game.write(enemy); + saved_game.write(activator); + saved_game.write(teamchain); + saved_game.write(teammaster); + saved_game.write(lastEnemy); + saved_game.write(wait); + saved_game.write(random); + saved_game.write(delay); + saved_game.write(alt_fire); + saved_game.write(count); + saved_game.write(bounceCount); + saved_game.write(fly_sound_debounce_time); + saved_game.write(painDebounceTime); + saved_game.write(disconnectDebounceTime); + saved_game.write(attackDebounceTime); + saved_game.write(pushDebounceTime); + saved_game.write(aimDebounceTime); + saved_game.write(useDebounceTime); + saved_game.write(trigger_formation); + saved_game.write(waypoint); + saved_game.write(lastWaypoint); + saved_game.write(lastValidWaypoint); + saved_game.write(noWaypointTime); + saved_game.write(combatPoint); + saved_game.write(failedWaypoints); + saved_game.write(failedWaypointCheckTime); + saved_game.write(loopAnim); + saved_game.write(startFrame); + saved_game.write(endFrame); + saved_game.write(sequencer); + saved_game.write(taskManager); + saved_game.write(taskID); + saved_game.write(parms); + saved_game.write(behaviorSet); + saved_game.write(script_targetname); + saved_game.write(delayScriptTime); + saved_game.write(fullName); + saved_game.write(soundSet); + saved_game.write(setTime); + saved_game.write(cameraGroup); + saved_game.write(noDamageTeam); + saved_game.write(playerModel); + saved_game.write(weaponModel); + saved_game.write(handRBolt); + saved_game.write(handLBolt); + saved_game.write(headBolt); + saved_game.write(cervicalBolt); + saved_game.write(chestBolt); + saved_game.write(gutBolt); + saved_game.write(torsoBolt); + saved_game.write(crotchBolt); + saved_game.write(motionBolt); + saved_game.write(kneeLBolt); + saved_game.write(kneeRBolt); + saved_game.write(elbowLBolt); + saved_game.write(elbowRBolt); + saved_game.write(footLBolt); + saved_game.write(footRBolt); + saved_game.write(faceBone); + saved_game.write(craniumBone); + saved_game.write(cervicalBone); + saved_game.write(thoracicBone); + saved_game.write(upperLumbarBone); + saved_game.write(lowerLumbarBone); + saved_game.write(hipsBone); + saved_game.write(motionBone); + saved_game.write(rootBone); + saved_game.write(footLBone); + saved_game.write(footRBone); + saved_game.write(genericBone1); + saved_game.write(genericBone2); + saved_game.write(genericBone3); + saved_game.write(genericBolt1); + saved_game.write(genericBolt2); + saved_game.write(genericBolt3); + saved_game.write(genericBolt4); + saved_game.write(genericBolt5); + saved_game.write(cinematicModel); + saved_game.write(NPC); + saved_game.write(ownername); + saved_game.write(cantHitEnemyCounter); + saved_game.write(NPC_type); + saved_game.write(NPC_targetname); + saved_game.write(NPC_target); + saved_game.write(moverState); + saved_game.write(soundPos1); + saved_game.write(sound1to2); + saved_game.write(sound2to1); + saved_game.write(soundPos2); + saved_game.write(soundLoop); + saved_game.write(nextTrain); + saved_game.write(prevTrain); + saved_game.write(pos1); + saved_game.write(pos2); + saved_game.write(pos3); + saved_game.write(sounds); + saved_game.write(closetarget); + saved_game.write(opentarget); + saved_game.write(paintarget); + saved_game.write(lockCount); + saved_game.write(radius); + saved_game.write(wpIndex); + saved_game.write(noise_index); + saved_game.write(startRGBA); + saved_game.write(finalRGBA); + saved_game.write(item); + saved_game.write(message); + saved_game.write(lightLevel); + saved_game.write(forcePushTime); + saved_game.write(forcePuller); } void sg_import( - ojk::ISavedGame* saved_game) + ojk::SavedGameFileHelper& saved_game) { - saved_game->read<>(s); - saved_game->read(client); - saved_game->read(inuse); - saved_game->read(linked); - saved_game->read(svFlags); - saved_game->read(bmodel); - saved_game->read(mins); - saved_game->read(maxs); - saved_game->read(contents); - saved_game->read(absmin); - saved_game->read(absmax); - saved_game->read(currentOrigin); - saved_game->read(currentAngles); - saved_game->read(owner); - saved_game->read<>(ghoul2); - saved_game->read(classname); - saved_game->read(spawnflags); - saved_game->read(flags); - saved_game->read(model); - saved_game->read(model2); - saved_game->read(freetime); - saved_game->read(eventTime); - saved_game->read(freeAfterEvent); - saved_game->read(unlinkAfterEvent); - saved_game->read(physicsBounce); - saved_game->read(clipmask); - saved_game->read(speed); - saved_game->read(movedir); - saved_game->read(lastOrigin); - saved_game->read(lastAngles); - saved_game->read(mass); - saved_game->read(lastImpact); - saved_game->read(watertype); - saved_game->read(waterlevel); - saved_game->read(angle); - saved_game->read(target); - saved_game->read(target2); - saved_game->read(target3); - saved_game->read(target4); - saved_game->read(targetname); - saved_game->read(team); - saved_game->read(roff); - saved_game->read(roff_ctr); - saved_game->read(next_roff_time); - saved_game->read(fx_time); - saved_game->read(nextthink); - saved_game->read(e_ThinkFunc); - saved_game->read(e_clThinkFunc); - saved_game->read(e_ReachedFunc); - saved_game->read(e_BlockedFunc); - saved_game->read(e_TouchFunc); - saved_game->read(e_UseFunc); - saved_game->read(e_PainFunc); - saved_game->read(e_DieFunc); - saved_game->read(health); - saved_game->read(max_health); - saved_game->read(takedamage); - saved_game->read(material); - saved_game->read(damage); - saved_game->read(dflags); - saved_game->read(splashDamage); - saved_game->read(splashRadius); - saved_game->read(methodOfDeath); - saved_game->read(splashMethodOfDeath); - saved_game->read(locationDamage); - saved_game->read(chain); - saved_game->read(enemy); - saved_game->read(activator); - saved_game->read(teamchain); - saved_game->read(teammaster); - saved_game->read(lastEnemy); - saved_game->read(wait); - saved_game->read(random); - saved_game->read(delay); - saved_game->read(alt_fire); - saved_game->read(count); - saved_game->read(bounceCount); - saved_game->read(fly_sound_debounce_time); - saved_game->read(painDebounceTime); - saved_game->read(disconnectDebounceTime); - saved_game->read(attackDebounceTime); - saved_game->read(pushDebounceTime); - saved_game->read(aimDebounceTime); - saved_game->read(useDebounceTime); - saved_game->read(trigger_formation); - saved_game->read(waypoint); - saved_game->read(lastWaypoint); - saved_game->read(lastValidWaypoint); - saved_game->read(noWaypointTime); - saved_game->read(combatPoint); - saved_game->read(failedWaypoints); - saved_game->read(failedWaypointCheckTime); - saved_game->read(loopAnim); - saved_game->read(startFrame); - saved_game->read(endFrame); - saved_game->read(sequencer); - saved_game->read(taskManager); - saved_game->read(taskID); - saved_game->read(parms); - saved_game->read(behaviorSet); - saved_game->read(script_targetname); - saved_game->read(delayScriptTime); - saved_game->read(fullName); - saved_game->read(soundSet); - saved_game->read(setTime); - saved_game->read(cameraGroup); - saved_game->read(noDamageTeam); - saved_game->read(playerModel); - saved_game->read(weaponModel); - saved_game->read(handRBolt); - saved_game->read(handLBolt); - saved_game->read(headBolt); - saved_game->read(cervicalBolt); - saved_game->read(chestBolt); - saved_game->read(gutBolt); - saved_game->read(torsoBolt); - saved_game->read(crotchBolt); - saved_game->read(motionBolt); - saved_game->read(kneeLBolt); - saved_game->read(kneeRBolt); - saved_game->read(elbowLBolt); - saved_game->read(elbowRBolt); - saved_game->read(footLBolt); - saved_game->read(footRBolt); - saved_game->read(faceBone); - saved_game->read(craniumBone); - saved_game->read(cervicalBone); - saved_game->read(thoracicBone); - saved_game->read(upperLumbarBone); - saved_game->read(lowerLumbarBone); - saved_game->read(hipsBone); - saved_game->read(motionBone); - saved_game->read(rootBone); - saved_game->read(footLBone); - saved_game->read(footRBone); - saved_game->read(genericBone1); - saved_game->read(genericBone2); - saved_game->read(genericBone3); - saved_game->read(genericBolt1); - saved_game->read(genericBolt2); - saved_game->read(genericBolt3); - saved_game->read(genericBolt4); - saved_game->read(genericBolt5); - saved_game->read(cinematicModel); - saved_game->read(NPC); - saved_game->read(ownername); - saved_game->read(cantHitEnemyCounter); - saved_game->read(NPC_type); - saved_game->read(NPC_targetname); - saved_game->read(NPC_target); - saved_game->read(moverState); - saved_game->read(soundPos1); - saved_game->read(sound1to2); - saved_game->read(sound2to1); - saved_game->read(soundPos2); - saved_game->read(soundLoop); - saved_game->read(nextTrain); - saved_game->read(prevTrain); - saved_game->read(pos1); - saved_game->read(pos2); - saved_game->read(pos3); - saved_game->read(sounds); - saved_game->read(closetarget); - saved_game->read(opentarget); - saved_game->read(paintarget); - saved_game->read(lockCount); - saved_game->read(radius); - saved_game->read(wpIndex); - saved_game->read(noise_index); - saved_game->read(startRGBA); - saved_game->read(finalRGBA); - saved_game->read(item); - saved_game->read(message); - saved_game->read(lightLevel); - saved_game->read(forcePushTime); - saved_game->read(forcePuller); + saved_game.read<>(s); + saved_game.read(client); + saved_game.read(inuse); + saved_game.read(linked); + saved_game.read(svFlags); + saved_game.read(bmodel); + saved_game.read(mins); + saved_game.read(maxs); + saved_game.read(contents); + saved_game.read(absmin); + saved_game.read(absmax); + saved_game.read(currentOrigin); + saved_game.read(currentAngles); + saved_game.read(owner); + saved_game.read<>(ghoul2); + saved_game.read(classname); + saved_game.read(spawnflags); + saved_game.read(flags); + saved_game.read(model); + saved_game.read(model2); + saved_game.read(freetime); + saved_game.read(eventTime); + saved_game.read(freeAfterEvent); + saved_game.read(unlinkAfterEvent); + saved_game.read(physicsBounce); + saved_game.read(clipmask); + saved_game.read(speed); + saved_game.read(movedir); + saved_game.read(lastOrigin); + saved_game.read(lastAngles); + saved_game.read(mass); + saved_game.read(lastImpact); + saved_game.read(watertype); + saved_game.read(waterlevel); + saved_game.read(angle); + saved_game.read(target); + saved_game.read(target2); + saved_game.read(target3); + saved_game.read(target4); + saved_game.read(targetname); + saved_game.read(team); + saved_game.read(roff); + saved_game.read(roff_ctr); + saved_game.read(next_roff_time); + saved_game.read(fx_time); + saved_game.read(nextthink); + saved_game.read(e_ThinkFunc); + saved_game.read(e_clThinkFunc); + saved_game.read(e_ReachedFunc); + saved_game.read(e_BlockedFunc); + saved_game.read(e_TouchFunc); + saved_game.read(e_UseFunc); + saved_game.read(e_PainFunc); + saved_game.read(e_DieFunc); + saved_game.read(health); + saved_game.read(max_health); + saved_game.read(takedamage); + saved_game.read(material); + saved_game.read(damage); + saved_game.read(dflags); + saved_game.read(splashDamage); + saved_game.read(splashRadius); + saved_game.read(methodOfDeath); + saved_game.read(splashMethodOfDeath); + saved_game.read(locationDamage); + saved_game.read(chain); + saved_game.read(enemy); + saved_game.read(activator); + saved_game.read(teamchain); + saved_game.read(teammaster); + saved_game.read(lastEnemy); + saved_game.read(wait); + saved_game.read(random); + saved_game.read(delay); + saved_game.read(alt_fire); + saved_game.read(count); + saved_game.read(bounceCount); + saved_game.read(fly_sound_debounce_time); + saved_game.read(painDebounceTime); + saved_game.read(disconnectDebounceTime); + saved_game.read(attackDebounceTime); + saved_game.read(pushDebounceTime); + saved_game.read(aimDebounceTime); + saved_game.read(useDebounceTime); + saved_game.read(trigger_formation); + saved_game.read(waypoint); + saved_game.read(lastWaypoint); + saved_game.read(lastValidWaypoint); + saved_game.read(noWaypointTime); + saved_game.read(combatPoint); + saved_game.read(failedWaypoints); + saved_game.read(failedWaypointCheckTime); + saved_game.read(loopAnim); + saved_game.read(startFrame); + saved_game.read(endFrame); + saved_game.read(sequencer); + saved_game.read(taskManager); + saved_game.read(taskID); + saved_game.read(parms); + saved_game.read(behaviorSet); + saved_game.read(script_targetname); + saved_game.read(delayScriptTime); + saved_game.read(fullName); + saved_game.read(soundSet); + saved_game.read(setTime); + saved_game.read(cameraGroup); + saved_game.read(noDamageTeam); + saved_game.read(playerModel); + saved_game.read(weaponModel); + saved_game.read(handRBolt); + saved_game.read(handLBolt); + saved_game.read(headBolt); + saved_game.read(cervicalBolt); + saved_game.read(chestBolt); + saved_game.read(gutBolt); + saved_game.read(torsoBolt); + saved_game.read(crotchBolt); + saved_game.read(motionBolt); + saved_game.read(kneeLBolt); + saved_game.read(kneeRBolt); + saved_game.read(elbowLBolt); + saved_game.read(elbowRBolt); + saved_game.read(footLBolt); + saved_game.read(footRBolt); + saved_game.read(faceBone); + saved_game.read(craniumBone); + saved_game.read(cervicalBone); + saved_game.read(thoracicBone); + saved_game.read(upperLumbarBone); + saved_game.read(lowerLumbarBone); + saved_game.read(hipsBone); + saved_game.read(motionBone); + saved_game.read(rootBone); + saved_game.read(footLBone); + saved_game.read(footRBone); + saved_game.read(genericBone1); + saved_game.read(genericBone2); + saved_game.read(genericBone3); + saved_game.read(genericBolt1); + saved_game.read(genericBolt2); + saved_game.read(genericBolt3); + saved_game.read(genericBolt4); + saved_game.read(genericBolt5); + saved_game.read(cinematicModel); + saved_game.read(NPC); + saved_game.read(ownername); + saved_game.read(cantHitEnemyCounter); + saved_game.read(NPC_type); + saved_game.read(NPC_targetname); + saved_game.read(NPC_target); + saved_game.read(moverState); + saved_game.read(soundPos1); + saved_game.read(sound1to2); + saved_game.read(sound2to1); + saved_game.read(soundPos2); + saved_game.read(soundLoop); + saved_game.read(nextTrain); + saved_game.read(prevTrain); + saved_game.read(pos1); + saved_game.read(pos2); + saved_game.read(pos3); + saved_game.read(sounds); + saved_game.read(closetarget); + saved_game.read(opentarget); + saved_game.read(paintarget); + saved_game.read(lockCount); + saved_game.read(radius); + saved_game.read(wpIndex); + saved_game.read(noise_index); + saved_game.read(startRGBA); + saved_game.read(finalRGBA); + saved_game.read(item); + saved_game.read(message); + saved_game.read(lightLevel); + saved_game.read(forcePushTime); + saved_game.read(forcePuller); } }; #endif //#ifdef GAME_INCLUDE diff --git a/codeJK2/icarus/Instance.cpp b/codeJK2/icarus/Instance.cpp index b19ef5ba27..463e09525c 100644 --- a/codeJK2/icarus/Instance.cpp +++ b/codeJK2/icarus/Instance.cpp @@ -29,7 +29,7 @@ along with this program; if not, see . #include "instance.h" #include -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" // Instance @@ -304,11 +304,12 @@ int ICARUS_Instance::SaveSequenceIDTable( void ) //Save out the number of sequences to follow int numSequences = m_sequences.size(); - auto saved_game = m_interface->saved_game; + ojk::SavedGameFileHelper sgfh( + m_interface->saved_game); - saved_game->write_chunk( - INT_ID('#','S','E','Q'), - numSequences); + sgfh.write_chunk( + INT_ID('#', 'S', 'E', 'Q'), + numSequences); //Sequences are saved first, by ID and information sequence_l::iterator sqi; @@ -325,10 +326,10 @@ int ICARUS_Instance::SaveSequenceIDTable( void ) idTable[itr++] = (*sqi)->GetID(); } - saved_game->write_chunk( - INT_ID('S','Q','T','B'), - idTable, - numSequences); + sgfh.write_chunk( + INT_ID('S', 'Q', 'T', 'B'), + idTable, + numSequences); delete[] idTable; @@ -367,11 +368,12 @@ int ICARUS_Instance::SaveSequencers( void ) //Save out the number of sequences to follow int numSequencers = m_sequencers.size(); - auto saved_game = m_interface->saved_game; + ojk::SavedGameFileHelper sgfh( + m_interface->saved_game); - saved_game->write_chunk( - INT_ID('#','S','Q','R'), - numSequencers); + sgfh.write_chunk( + INT_ID('#', 'S', 'Q', 'R'), + numSequencers); //The sequencers are then saved sequencer_l::iterator si; @@ -393,11 +395,12 @@ int ICARUS_Instance::SaveSignals( void ) { int numSignals = m_signals.size(); - auto saved_game = m_interface->saved_game; + ojk::SavedGameFileHelper sgfh( + m_interface->saved_game); - saved_game->write_chunk( - INT_ID('I','S','I','G'), - numSignals); + sgfh.write_chunk( + INT_ID('I', 'S', 'I', 'G'), + numSignals); signal_m::iterator si; STL_ITERATE( si, m_signals ) @@ -411,15 +414,15 @@ int ICARUS_Instance::SaveSignals( void ) int length = strlen( name ) + 1; //Save out the string size - saved_game->write_chunk( - INT_ID('S','I','G','#'), - length); + sgfh.write_chunk( + INT_ID('S', 'I', 'G', '#'), + length); //Write out the string - saved_game->write_chunk( - INT_ID('S','I','G','N'), - name, - length ); + sgfh.write_chunk( + INT_ID('S', 'I', 'G', 'N'), + name, + length); } return true; @@ -436,11 +439,12 @@ int ICARUS_Instance::Save( void ) //Save out a ICARUS save block header with the ICARUS version double version = ICARUS_VERSION; - auto saved_game = m_interface->saved_game; + ojk::SavedGameFileHelper sgfh( + m_interface->saved_game); - saved_game->write_chunk( - INT_ID('I','C','A','R'), - version); + sgfh.write_chunk( + INT_ID('I', 'C', 'A', 'R'), + version); //Save out the signals if ( SaveSignals() == false ) @@ -454,9 +458,9 @@ int ICARUS_Instance::Save( void ) if ( SaveSequencers() == false ) return false; - saved_game->write_chunk( - INT_ID('I','E','N','D'), - version); + sgfh.write_chunk( + INT_ID('I', 'E', 'N', 'D'), + version); return true; } @@ -471,9 +475,12 @@ int ICARUS_Instance::LoadSignals( void ) { int numSignals; - m_interface->saved_game->read_chunk( - INT_ID('I','S','I','G'), - numSignals); + ojk::SavedGameFileHelper sgfh( + m_interface->saved_game); + + sgfh.read_chunk( + INT_ID('I', 'S', 'I', 'G'), + numSignals); for ( int i = 0; i < numSignals; i++ ) { @@ -481,17 +488,17 @@ int ICARUS_Instance::LoadSignals( void ) int length; //Get the size of the string - m_interface->saved_game->read_chunk( - INT_ID('S','I','G','#'), - length); + sgfh.read_chunk( + INT_ID('S', 'I', 'G', '#'), + length); assert( length < (int)sizeof( buffer ) ); //Get the string - m_interface->saved_game->read_chunk( - INT_ID('S','I','G','N'), - buffer, - length); + sgfh.read_chunk( + INT_ID('S', 'I', 'G', 'N'), + buffer, + length); //Turn it on and add it to the system Signal( (const char *) &buffer ); @@ -531,10 +538,13 @@ int ICARUS_Instance::LoadSequences( void ) CSequence *sequence; int numSequences; + ojk::SavedGameFileHelper sgfh( + m_interface->saved_game); + //Get the number of sequences to read in - m_interface->saved_game->read_chunk( - INT_ID('#','S','E','Q'), - numSequences); + sgfh.read_chunk( + INT_ID('#', 'S', 'E', 'Q'), + numSequences); int *idTable = new int[ numSequences ]; @@ -542,10 +552,10 @@ int ICARUS_Instance::LoadSequences( void ) return false; //Load the sequencer ID table - m_interface->saved_game->read_chunk( - INT_ID('S','Q','T','B'), - idTable, - numSequences); + sgfh.read_chunk( + INT_ID('S', 'Q', 'T', 'B'), + idTable, + numSequences); //First pass, allocate all container sequences and give them their proper IDs if ( AllocateSequences( numSequences, idTable ) == false ) @@ -580,10 +590,13 @@ int ICARUS_Instance::LoadSequencers( void ) CSequencer *sequencer; int numSequencers; + ojk::SavedGameFileHelper sgfh( + m_interface->saved_game); + //Get the number of sequencers to load - m_interface->saved_game->read_chunk( - INT_ID('#','S','Q','R'), - numSequencers); + sgfh.read_chunk( + INT_ID('#', 'S', 'Q', 'R'), + numSequencers); //Load all sequencers for ( int i = 0; i < numSequencers; i++ ) @@ -613,9 +626,12 @@ int ICARUS_Instance::Load( void ) //Check to make sure we're at the ICARUS save block double version; - m_interface->saved_game->read_chunk( - INT_ID('I','C','A','R'), - version); + ojk::SavedGameFileHelper sgfh( + m_interface->saved_game); + + sgfh.read_chunk( + INT_ID('I', 'C', 'A', 'R'), + version); //Versions must match! if ( version != ICARUS_VERSION ) @@ -645,9 +661,9 @@ int ICARUS_Instance::Load( void ) return false; } - m_interface->saved_game->read_chunk( - INT_ID('I','E','N','D'), - version); + sgfh.read_chunk( + INT_ID('I', 'E', 'N', 'D'), + version); return true; } diff --git a/codeJK2/icarus/Sequence.cpp b/codeJK2/icarus/Sequence.cpp index bcb5eaeead..0267997c9e 100644 --- a/codeJK2/icarus/Sequence.cpp +++ b/codeJK2/icarus/Sequence.cpp @@ -28,7 +28,7 @@ along with this program; if not, see . #include "icarus.h" #include -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" CSequence::CSequence( void ) { @@ -343,26 +343,29 @@ int CSequence::SaveCommand( CBlock *block ) int numMembers, bID, size; CBlockMember *bm; - auto saved_game = m_owner->GetInterface()->saved_game; + ojk::SavedGameFileHelper sgfh( + m_owner->GetInterface()->saved_game); //Save out the block ID bID = block->GetBlockID(); - saved_game->write_chunk( - INT_ID('B','L','I','D'), - bID); + + sgfh.write_chunk( + INT_ID('B', 'L', 'I', 'D'), + bID); //Save out the block's flags flags = block->GetFlags(); - saved_game->write_chunk( - INT_ID('B','F','L','G'), - flags); + + sgfh.write_chunk( + INT_ID('B', 'F', 'L', 'G'), + flags); //Save out the number of members to read numMembers = block->GetNumMembers(); - saved_game->write_chunk( - INT_ID('B','N','U','M'), - numMembers); + sgfh.write_chunk( + INT_ID('B', 'N', 'U', 'M'), + numMembers); for ( int i = 0; i < numMembers; i++ ) { @@ -371,24 +374,24 @@ int CSequence::SaveCommand( CBlock *block ) //Save the block id bID = bm->GetID(); - saved_game->write_chunk( - INT_ID('B','M','I','D'), - bID); + sgfh.write_chunk( + INT_ID('B', 'M', 'I', 'D'), + bID); //Save out the data size size = bm->GetSize(); - saved_game->write_chunk( - INT_ID('B','S','I','Z'), - size); + sgfh.write_chunk( + INT_ID('B', 'S', 'I', 'Z'), + size); //Save out the raw data auto raw_data = static_cast(bm->GetData()); - saved_game->write_chunk( - INT_ID('B','M','E','M'), - raw_data, - size); + sgfh.write_chunk( + INT_ID('B', 'M', 'E', 'M'), + raw_data, + size); } return true; @@ -406,51 +409,52 @@ int CSequence::Save( void ) block_l::iterator bi; int id; - auto saved_game = m_owner->GetInterface()->saved_game; + ojk::SavedGameFileHelper sgfh( + m_owner->GetInterface()->saved_game); //Save the parent (by GUID) id = ( m_parent != NULL ) ? m_parent->GetID() : -1; - saved_game->write_chunk( - INT_ID('S','P','I','D'), - id); + sgfh.write_chunk( + INT_ID('S', 'P', 'I', 'D'), + id); //Save the return (by GUID) id = ( m_return != NULL ) ? m_return->GetID() : -1; - saved_game->write_chunk( - INT_ID('S','R','I','D'), - id); + sgfh.write_chunk( + INT_ID('S', 'R', 'I', 'D'), + id); //Save the number of children - saved_game->write_chunk( - INT_ID('S','N','C','H'), - m_numChildren); + sgfh.write_chunk( + INT_ID('S', 'N', 'C', 'H'), + m_numChildren); //Save out the children (only by GUID) STL_ITERATE( ci, m_children ) { id = (*ci)->GetID(); - saved_game->write_chunk( - INT_ID('S','C','H','D'), - id); + sgfh.write_chunk( + INT_ID('S', 'C', 'H', 'D'), + id); } //Save flags - saved_game->write_chunk( - INT_ID('S','F','L','G'), - m_flags); + sgfh.write_chunk( + INT_ID('S', 'F', 'L', 'G'), + m_flags); //Save iterations - saved_game->write_chunk( - INT_ID('S','I','T','R'), - m_iterations); + sgfh.write_chunk( + INT_ID('S', 'I', 'T', 'R'), + m_iterations); //Save the number of commands - saved_game->write_chunk( - INT_ID('S','N','M','C'), - m_numCommands); + sgfh.write_chunk( + INT_ID('S', 'N', 'M', 'C'), + m_numCommands); //Save the commands STL_ITERATE( bi, m_commands ) @@ -478,34 +482,35 @@ int CSequence::Load( void ) int bID, bSize; void *bData; - auto saved_game = m_owner->GetInterface()->saved_game; + ojk::SavedGameFileHelper sgfh( + m_owner->GetInterface()->saved_game); //Get the parent sequence - saved_game->read_chunk( - INT_ID('S','P','I','D'), - id); + sgfh.read_chunk( + INT_ID('S', 'P', 'I', 'D'), + id); m_parent = ( id != -1 ) ? m_owner->GetSequence( id ) : NULL; //Get the return sequence - saved_game->read_chunk( - INT_ID('S','R','I','D'), - id); + sgfh.read_chunk( + INT_ID('S', 'R', 'I', 'D'), + id); m_return = ( id != -1 ) ? m_owner->GetSequence( id ) : NULL; //Get the number of children - saved_game->read_chunk( - INT_ID('S','N','C','H'), - m_numChildren); + sgfh.read_chunk( + INT_ID('S', 'N', 'C', 'H'), + m_numChildren); //Reload all children for ( i = 0; i < m_numChildren; i++ ) { //Get the child sequence ID - saved_game->read_chunk( - INT_ID('S','C','H','D'), - id); + sgfh.read_chunk( + INT_ID('S', 'C', 'H', 'D'), + id); //Get the desired sequence if ( ( sequence = m_owner->GetSequence( id ) ) == NULL ) @@ -520,67 +525,67 @@ int CSequence::Load( void ) //Get the sequence flags - saved_game->read_chunk( - INT_ID('S','F','L','G'), - m_flags); + sgfh.read_chunk( + INT_ID('S', 'F', 'L', 'G'), + m_flags); //Get the number of iterations - saved_game->read_chunk( - INT_ID('S','I','T','R'), - m_iterations); + sgfh.read_chunk( + INT_ID('S', 'I', 'T', 'R'), + m_iterations); int numCommands; //Get the number of commands - saved_game->read_chunk( - INT_ID('S','N','M','C'), - numCommands); + sgfh.read_chunk( + INT_ID('S', 'N', 'M', 'C'), + numCommands); //Get all the commands for ( i = 0; i < numCommands; i++ ) { //Get the block ID and create a new container - saved_game->read_chunk( - INT_ID('B','L','I','D'), - id); + sgfh.read_chunk( + INT_ID('B', 'L', 'I', 'D'), + id); block = new CBlock; block->Create( id ); //Read the block's flags - saved_game->read_chunk( - INT_ID('B','F','L','G'), - flags); + sgfh.read_chunk( + INT_ID('B', 'F', 'L', 'G'), + flags); block->SetFlags( flags ); //Get the number of block members - saved_game->read_chunk( - INT_ID('B','N','U','M'), - numMembers); + sgfh.read_chunk( + INT_ID('B', 'N', 'U', 'M'), + numMembers); for ( int j = 0; j < numMembers; j++ ) { //Get the member ID - saved_game->read_chunk( - INT_ID('B','M','I','D'), - bID); + sgfh.read_chunk( + INT_ID('B', 'M', 'I', 'D'), + bID); //Get the member size - saved_game->read_chunk( - INT_ID('B','S','I','Z'), - bSize); + sgfh.read_chunk( + INT_ID('B', 'S', 'I', 'Z'), + bSize); //Get the member's data if ( ( bData = ICARUS_Malloc( bSize ) ) == NULL ) return false; //Get the actual raw data - saved_game->read_chunk( - INT_ID('B','M','E','M'), - static_cast(bData), - bSize); + sgfh.read_chunk( + INT_ID('B', 'M', 'E', 'M'), + static_cast(bData), + bSize); //Write out the correct type switch ( bID ) diff --git a/codeJK2/icarus/Sequencer.cpp b/codeJK2/icarus/Sequencer.cpp index 2f6f05f0f4..487b7dcaa0 100644 --- a/codeJK2/icarus/Sequencer.cpp +++ b/codeJK2/icarus/Sequencer.cpp @@ -30,7 +30,7 @@ along with this program; if not, see . #include "g_shared.h" #include "assert.h" -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" // Sequencer @@ -2332,24 +2332,27 @@ int CSequencer::Save( void ) //Get the number of sequences to save out numSequences = m_sequences.size(); + ojk::SavedGameFileHelper sgfh( + m_ie->saved_game); + //Save out the owner sequence - saved_game->write_chunk( - INT_ID('S','Q','R','E'), - m_ownerID); + sgfh.write_chunk( + INT_ID('S', 'Q', 'R', 'E'), + m_ownerID); //Write out the number of sequences we need to read - saved_game->write_chunk( - INT_ID('S','Q','R','#'), - numSequences); + sgfh.write_chunk( + INT_ID('S', 'Q', 'R', '#'), + numSequences); //Second pass, save out all sequences, in order STL_ITERATE( si, m_sequences ) { id = (*si)->GetID(); - saved_game->write_chunk( - INT_ID('S','Q','R','I'), - id); + sgfh.write_chunk( + INT_ID('S', 'Q', 'R', 'I'), + id); } //Save out the taskManager @@ -2358,44 +2361,44 @@ int CSequencer::Save( void ) //Save out the task sequences mapping the name to the GUIDs numTasks = m_taskSequences.size(); - saved_game->write_chunk( - INT_ID('S','Q','T','#'), - numTasks); + sgfh.write_chunk( + INT_ID('S', 'Q', 'T', '#'), + numTasks); STL_ITERATE( ti, m_taskSequences ) { //Save the task group's ID id = ((*ti).first)->GetGUID(); - saved_game->write_chunk( - INT_ID('S','T','I','D'), - id); + sgfh.write_chunk( + INT_ID('S', 'T', 'I', 'D'), + id); //Save the sequence's ID id = ((*ti).second)->GetID(); - saved_game->write_chunk( - INT_ID('S','S','I','D'), - id); + sgfh.write_chunk( + INT_ID('S', 'S', 'I', 'D'), + id); } int curGroupID = ( m_curGroup == NULL ) ? -1 : m_curGroup->GetGUID(); - saved_game->write_chunk( - INT_ID('S','Q','C','T'), - curGroupID); + sgfh.write_chunk( + INT_ID('S', 'Q', 'C', 'T'), + curGroupID); //Output the number of commands - saved_game->write_chunk( - INT_ID('S','Q','#','C'), - m_numCommands); //FIXME: This can be reconstructed + sgfh.write_chunk( + INT_ID('S', 'Q', '#', 'C'), + m_numCommands); //FIXME: This can be reconstructed //Output the ID of the current sequence id = ( m_curSequence != NULL ) ? m_curSequence->GetID() : -1; - saved_game->write_chunk( - INT_ID('S','Q','C','S'), - id); + sgfh.write_chunk( + INT_ID('S', 'Q', 'C', 'S'), + id); return true; } @@ -2410,10 +2413,13 @@ int CSequencer::Load( void ) { int i; + ojk::SavedGameFileHelper sgfh( + m_ie->saved_game); + //Get the owner of this sequencer - m_ie->saved_game->read_chunk( - INT_ID('S','Q','R','E'), - m_ownerID); + sgfh.read_chunk( + INT_ID('S', 'Q', 'R', 'E'), + m_ownerID); //Link the entity back to the sequencer m_ie->I_LinkEntity( m_ownerID, this, m_taskManager ); @@ -2423,16 +2429,16 @@ int CSequencer::Load( void ) int numSequences, seqID, taskID, numTasks; //Get the number of sequences to read - m_ie->saved_game->read_chunk( - INT_ID('S','Q','R','#'), - numSequences); + sgfh.read_chunk( + INT_ID('S', 'Q', 'R', '#'), + numSequences); //Read in all the sequences for ( i = 0; i < numSequences; i++ ) { - m_ie->saved_game->read_chunk( - INT_ID('S','Q','R','I'), - seqID); + sgfh.read_chunk( + INT_ID('S', 'Q', 'R', 'I'), + seqID); seq = m_owner->GetSequence( seqID ); @@ -2449,22 +2455,22 @@ int CSequencer::Load( void ) m_taskManager->Load(); //Get the number of tasks in the map - m_ie->saved_game->read_chunk( - INT_ID('S','Q','T','#'), - numTasks); + sgfh.read_chunk( + INT_ID('S', 'Q', 'T', '#'), + numTasks); //Read in, and reassociate the tasks to the sequences for ( i = 0; i < numTasks; i++ ) { //Read in the task's ID - m_ie->saved_game->read_chunk( - INT_ID('S','T','I','D'), - taskID); + sgfh.read_chunk( + INT_ID('S', 'T', 'I', 'D'), + taskID); //Read in the sequence's ID - m_ie->saved_game->read_chunk( - INT_ID('S','S','I','D'), - seqID); + sgfh.read_chunk( + INT_ID('S', 'S', 'I', 'D'), + seqID); taskGroup = m_taskManager->GetTaskGroup( taskID ); @@ -2481,21 +2487,21 @@ int CSequencer::Load( void ) int curGroupID; //Get the current task group - m_ie->saved_game->read_chunk( - INT_ID('S','Q','C','T'), - curGroupID); + sgfh.read_chunk( + INT_ID('S', 'Q', 'C', 'T'), + curGroupID); m_curGroup = ( curGroupID == -1 ) ? NULL : m_taskManager->GetTaskGroup( curGroupID ); //Get the number of commands - m_ie->saved_game->read_chunk( - INT_ID('S','Q','#','C'), - m_numCommands); + sgfh.read_chunk( + INT_ID('S', 'Q', '#', 'C'), + m_numCommands); //Get the current sequence - m_ie->saved_game->read_chunk( - INT_ID('S','Q','C','S'), - seqID); + sgfh.read_chunk( + INT_ID('S', 'Q', 'C', 'S'), + seqID); m_curSequence = ( seqID != -1 ) ? m_owner->GetSequence( seqID ) : NULL; diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index 6ce2bf433f..b609738ea9 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -31,7 +31,7 @@ along with this program; if not, see . #include -#include "qcommon/ojk_i_saved_game.h" +#include "qcommon/ojk_saved_game_file_helper.h" #define ICARUS_VALIDATE(a) if ( a == false ) return TASK_FAILED; @@ -1640,28 +1640,29 @@ int CTaskManager::SaveCommand( CBlock *block ) int numMembers, bID, size; CBlockMember *bm; - auto saved_game = m_owner->GetInterface()->saved_game; + ojk::SavedGameFileHelper sgfh( + m_owner->GetInterface()->saved_game); //Save out the block ID bID = block->GetBlockID(); - saved_game->write_chunk( - INT_ID('B','L','I','D'), - bID); + sgfh.write_chunk( + INT_ID('B', 'L', 'I', 'D'), + bID); //Save out the block's flags flags = block->GetFlags(); - saved_game->write_chunk( - INT_ID('B','F','L','G'), - flags); + sgfh.write_chunk( + INT_ID('B', 'F', 'L', 'G'), + flags); //Save out the number of members to read numMembers = block->GetNumMembers(); - saved_game->write_chunk( - INT_ID('B','N','U','M'), - numMembers); + sgfh.write_chunk( + INT_ID('B', 'N', 'U', 'M'), + numMembers); for ( int i = 0; i < numMembers; i++ ) { @@ -1670,24 +1671,24 @@ int CTaskManager::SaveCommand( CBlock *block ) //Save the block id bID = bm->GetID(); - saved_game->write_chunk( - INT_ID('B','M','I','D'), - bID); + sgfh.write_chunk( + INT_ID('B', 'M', 'I', 'D'), + bID); //Save out the data size size = bm->GetSize(); - saved_game->write_chunk( - INT_ID('B','S','I','Z'), - size); + sgfh.write_chunk( + INT_ID('B', 'S', 'I', 'Z'), + size); //Save out the raw data auto raw_data = static_cast(bm->GetData()); - saved_game->write_chunk( - INT_ID('B','M','E','M'), - raw_data, - size); + sgfh.write_chunk( + INT_ID('B', 'M', 'E', 'M'), + raw_data, + size); } return true; @@ -1709,19 +1710,20 @@ void CTaskManager::Save( void ) int id, numCommands; int numWritten; - auto saved_game = m_owner->GetInterface()->saved_game; + ojk::SavedGameFileHelper sgfh( + m_owner->GetInterface()->saved_game); //Save the taskmanager's GUID - saved_game->write_chunk( - INT_ID('T','M','I','D'), - m_GUID); //FIXME: This can be reconstructed + sgfh.write_chunk( + INT_ID('T', 'M', 'I', 'D'), + m_GUID); //FIXME: This can be reconstructed //Save out the number of tasks that will follow int iNumTasks = m_tasks.size(); - saved_game->write_chunk( - INT_ID('T','S','K','#'), - iNumTasks); + sgfh.write_chunk( + INT_ID('T', 'S', 'K', '#'), + iNumTasks); //Save out all the tasks tasks_l::iterator ti; @@ -1731,16 +1733,16 @@ void CTaskManager::Save( void ) //Save the GUID id = (*ti)->GetGUID(); - saved_game->write_chunk( - INT_ID('T','K','I','D'), - id); + sgfh.write_chunk( + INT_ID('T', 'K', 'I', 'D'), + id); //Save the timeStamp (FIXME: Although, this is going to be worthless if time is not consistent...) timeStamp = (*ti)->GetTimeStamp(); - saved_game->write_chunk( - INT_ID('T','K','T','S'), - timeStamp); + sgfh.write_chunk( + INT_ID('T', 'K', 'T', 'S'), + timeStamp); //Save out the block block = (*ti)->GetBlock(); @@ -1750,9 +1752,9 @@ void CTaskManager::Save( void ) //Save out the number of task groups int numTaskGroups = m_taskGroups.size(); - saved_game->write_chunk( - INT_ID('T','G','#','G'), - numTaskGroups); + sgfh.write_chunk( + INT_ID('T', 'G', '#', 'G'), + numTaskGroups); //Save out the IDs of all the task groups numWritten = 0; @@ -1761,9 +1763,9 @@ void CTaskManager::Save( void ) { id = (*tgi)->GetGUID(); - saved_game->write_chunk( - INT_ID('T','K','G','#'), - id); + sgfh.write_chunk( + INT_ID('T', 'K', 'G', '#'), + id); numWritten++; } @@ -1776,16 +1778,16 @@ void CTaskManager::Save( void ) //Save out the parent id = ( (*tgi)->GetParent() == NULL ) ? -1 : ((*tgi)->GetParent())->GetGUID(); - saved_game->write_chunk( - INT_ID('T','K','G','P'), - id); + sgfh.write_chunk( + INT_ID('T', 'K', 'G', 'P'), + id); //Save out the number of commands numCommands = (*tgi)->m_completedTasks.size(); - saved_game->write_chunk( - INT_ID('T','G','N','C'), - numCommands); + sgfh.write_chunk( + INT_ID('T', 'G', 'N', 'C'), + numCommands); //Save out the command map CTaskGroup::taskCallback_m::iterator tci; @@ -1795,24 +1797,25 @@ void CTaskManager::Save( void ) //Write out the ID id = (*tci).first; - saved_game->write_chunk( - INT_ID('G','M','I','D'), - id); + sgfh.write_chunk( + INT_ID('G', 'M', 'I', 'D'), + id); //Write out the state of completion completed = (*tci).second; - saved_game->write_chunk( - INT_ID('G','M','D','N'), - completed); + sgfh.write_chunk( + INT_ID('G', 'M', 'D', 'N'), + completed); } //Save out the number of completed commands id = (*tgi)->m_numCompleted; - saved_game->write_chunk( - INT_ID('T','G','D','N'), - id); //FIXME: This can be reconstructed + sgfh.write_chunk( + INT_ID('T', 'G', 'D', 'N'), + id); //FIXME: This can be reconstructed + numWritten++; } assert (numWritten == numTaskGroups); @@ -1823,9 +1826,9 @@ void CTaskManager::Save( void ) //Save out the currently active group int curGroupID = ( m_curGroup == NULL ) ? -1 : m_curGroup->GetGUID(); - saved_game->write_chunk( - INT_ID('T','G','C','G'), - curGroupID); + sgfh.write_chunk( + INT_ID('T', 'G', 'C', 'G'), + curGroupID); } //Save out the task group name maps @@ -1841,24 +1844,24 @@ void CTaskManager::Save( void ) int length = strlen( name ) + 1; //Save out the string size - saved_game->write_chunk( - INT_ID('T','G','N','L'), - length); + sgfh.write_chunk( + INT_ID('T', 'G', 'N', 'L'), + length); //Write out the string - saved_game->write_chunk( - INT_ID('T','G','N','S'), - name, - length); + sgfh.write_chunk( + INT_ID('T', 'G', 'N', 'S'), + name, + length); taskGroup = (*tmi).second; id = taskGroup->GetGUID(); //Write out the ID - saved_game->write_chunk( - INT_ID('T','G','N','I'), - id); + sgfh.write_chunk( + INT_ID('T', 'G', 'N', 'I'), + id); numWritten++; } @@ -1884,17 +1887,18 @@ void CTaskManager::Load( void ) int bID, bSize; int i; - auto saved_game = m_owner->GetInterface()->saved_game; + ojk::SavedGameFileHelper sgfh( + m_owner->GetInterface()->saved_game); //Get the GUID - saved_game->read_chunk( - INT_ID('T','M','I','D'), - m_GUID); + sgfh.read_chunk( + INT_ID('T', 'M', 'I', 'D'), + m_GUID); //Get the number of tasks to follow - saved_game->read_chunk( - INT_ID('T','S','K','#'), - numTasks); + sgfh.read_chunk( + INT_ID('T', 'S', 'K', '#'), + numTasks); //Reload all the tasks for ( i = 0; i < numTasks; i++ ) @@ -1904,16 +1908,16 @@ void CTaskManager::Load( void ) assert( task ); //Get the GUID - saved_game->read_chunk( - INT_ID('T','K','I','D'), - id); + sgfh.read_chunk( + INT_ID('T', 'K', 'I', 'D'), + id); task->SetGUID( id ); //Get the time stamp - saved_game->read_chunk( - INT_ID('T','K','T','S'), - timeStamp); + sgfh.read_chunk( + INT_ID('T', 'K', 'T', 'S'), + timeStamp); task->SetTimeStamp( timeStamp ); @@ -1922,37 +1926,37 @@ void CTaskManager::Load( void ) // //Get the block ID and create a new container - saved_game->read_chunk( - INT_ID('B','L','I','D'), - id); + sgfh.read_chunk( + INT_ID('B', 'L', 'I', 'D'), + id); block = new CBlock; block->Create( id ); //Read the block's flags - saved_game->read_chunk( - INT_ID('B','F','L','G'), - flags); + sgfh.read_chunk( + INT_ID('B', 'F', 'L', 'G'), + flags); block->SetFlags( flags ); //Get the number of block members - saved_game->read_chunk( - INT_ID('B','N','U','M'), - numMembers); + sgfh.read_chunk( + INT_ID('B', 'N', 'U', 'M'), + numMembers); for ( int j = 0; j < numMembers; j++ ) { //Get the member ID - saved_game->read_chunk( - INT_ID('B','M','I','D'), - bID); + sgfh.read_chunk( + INT_ID('B', 'M', 'I', 'D'), + bID); //Get the member size - saved_game->read_chunk( - INT_ID('B','S','I','Z'), - bSize); + sgfh.read_chunk( + INT_ID('B', 'S', 'I', 'Z'), + bSize); //Get the member's data if ( ( bData = ICARUS_Malloc( bSize ) ) == NULL ) @@ -1962,10 +1966,10 @@ void CTaskManager::Load( void ) } //Get the actual raw data - saved_game->read_chunk( - INT_ID('B','M','E','M'), - static_cast(bData), - bSize); + sgfh.read_chunk( + INT_ID('B', 'M', 'E', 'M'), + static_cast(bData), + bSize); //Write out the correct type switch ( bID ) @@ -2016,9 +2020,9 @@ void CTaskManager::Load( void ) //Load the task groups int numTaskGroups; - saved_game->read_chunk( - INT_ID('T','G','#','G'), - numTaskGroups); + sgfh.read_chunk( + INT_ID('T', 'G', '#', 'G'), + numTaskGroups); if ( numTaskGroups == 0 ) return; @@ -2033,9 +2037,9 @@ void CTaskManager::Load( void ) assert( taskGroup ); //Get this task group's ID - saved_game->read_chunk( - INT_ID('T','K','G','#'), - taskIDs[i]); + sgfh.read_chunk( + INT_ID('T', 'K', 'G', '#'), + taskIDs[i]); taskGroup->m_GUID = taskIDs[i]; @@ -2051,47 +2055,47 @@ void CTaskManager::Load( void ) assert( taskGroup ); //Load the parent ID - saved_game->read_chunk( - INT_ID('T','K','G','P'), - id); + sgfh.read_chunk( + INT_ID('T', 'K', 'G', 'P'), + id); if ( id != -1 ) taskGroup->m_parent = ( GetTaskGroup( id ) != NULL ) ? GetTaskGroup( id ) : NULL; //Get the number of commands in this group - saved_game->read_chunk( - INT_ID('T','G','N','C'), - numMembers); + sgfh.read_chunk( + INT_ID('T', 'G', 'N', 'C'), + numMembers); //Get each command and its completion state for ( int j = 0; j < numMembers; j++ ) { //Get the ID - saved_game->read_chunk( - INT_ID('G','M','I','D'), - id); + sgfh.read_chunk( + INT_ID('G', 'M', 'I', 'D'), + id); //Write out the state of completion - saved_game->read_chunk( - INT_ID('G','M','D','N'), - completed); + sgfh.read_chunk( + INT_ID('G', 'M', 'D', 'N'), + completed); //Save it out taskGroup->m_completedTasks[ id ] = completed; } //Get the number of completed tasks - saved_game->read_chunk( - INT_ID('T','G','D','N'), - taskGroup->m_numCompleted); + sgfh.read_chunk( + INT_ID('T', 'G', 'D', 'N'), + taskGroup->m_numCompleted); } //Reload the currently active group int curGroupID; - saved_game->read_chunk( - INT_ID('T','G','C','G'), - curGroupID); + sgfh.read_chunk( + INT_ID('T', 'G', 'C', 'G'), + curGroupID); //Reload the map entries for ( i = 0; i < numTaskGroups; i++ ) @@ -2100,20 +2104,20 @@ void CTaskManager::Load( void ) int length; //Get the size of the string - saved_game->read_chunk( - INT_ID('T','G','N','L'), - length); + sgfh.read_chunk( + INT_ID('T', 'G', 'N', 'L'), + length); //Get the string - saved_game->read_chunk( - INT_ID('T','G','N','S'), - name, - length); + sgfh.read_chunk( + INT_ID('T', 'G', 'N', 'S'), + name, + length); //Get the id - saved_game->read_chunk( - INT_ID('T','G','N','I'), - id); + sgfh.read_chunk( + INT_ID('T', 'G', 'N', 'I'), + id); taskGroup = GetTaskGroup( id ); assert( taskGroup ); diff --git a/codeJK2/icarus/interface.h b/codeJK2/icarus/interface.h index 39cc91567a..b04bf2652d 100644 --- a/codeJK2/icarus/interface.h +++ b/codeJK2/icarus/interface.h @@ -85,7 +85,7 @@ typedef struct interface_export_s int (*I_ReadSaveData)( unsigned int chid, void *address, int length, void **addressptr/* = NULL */); int (*I_LinkEntity)( int entID, CSequencer *sequencer, CTaskManager *taskManager ); - ojk::ISavedGame* saved_game; + ojk::ISavedGameFile* saved_game; } interface_export_t; #endif //__INTERFACE__ diff --git a/shared/qcommon/ojk_exception.cpp b/shared/qcommon/ojk_exception.cpp deleted file mode 100644 index 00b6e61999..0000000000 --- a/shared/qcommon/ojk_exception.cpp +++ /dev/null @@ -1,30 +0,0 @@ -// -// Base exception. -// - - -#include "ojk_exception.h" - - -namespace ojk -{ - - -Exception::Exception( - const char* message) : - std::runtime_error(message) -{ -} - -Exception::Exception( - const std::string& message) : - std::runtime_error(message) -{ -} - -Exception::~Exception() -{ -} - - -} // ojk diff --git a/shared/qcommon/ojk_exception.h b/shared/qcommon/ojk_exception.h deleted file mode 100644 index bc763ac8a0..0000000000 --- a/shared/qcommon/ojk_exception.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// Base exception. -// - - -#ifndef OJK_EXCEPTION_INCLUDED -#define OJK_EXCEPTION_INCLUDED - - -#include -#include - - -namespace ojk -{ - - -class Exception : - public std::runtime_error -{ -public: - explicit Exception( - const char* message); - - explicit Exception( - const std::string& message); - - virtual ~Exception(); -}; // Exception - - -} // ojk - - -#endif // OJK_EXCEPTION_INCLUDED - diff --git a/shared/qcommon/ojk_saved_game_exception.cpp b/shared/qcommon/ojk_saved_game_exception.cpp deleted file mode 100644 index 06225e9e34..0000000000 --- a/shared/qcommon/ojk_saved_game_exception.cpp +++ /dev/null @@ -1,30 +0,0 @@ -// -// Saved game exception. -// - - -#include "ojk_saved_game_exception.h" - - -namespace ojk -{ - - -SavedGameException::SavedGameException( - const char* message) : - Exception(message) -{ -} - -SavedGameException::SavedGameException( - const std::string& message) : - Exception(message) -{ -} - -SavedGameException::~SavedGameException() -{ -} - - -} // ojk diff --git a/shared/qcommon/ojk_saved_game_exception.h b/shared/qcommon/ojk_saved_game_exception.h deleted file mode 100644 index 10f73e96c4..0000000000 --- a/shared/qcommon/ojk_saved_game_exception.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// Saved game exception. -// - - -#ifndef OJK_SAVED_GAME_EXCEPTION_INCLUDED -#define OJK_SAVED_GAME_EXCEPTION_INCLUDED - - -#include "ojk_exception.h" - - -namespace ojk -{ - - -class SavedGameException : - public Exception -{ -public: - explicit SavedGameException( - const char* message); - - explicit SavedGameException( - const std::string& message); - - virtual ~SavedGameException(); -}; // SavedGameException - - -} // ojk - - -#endif // OJK_SAVED_GAME_EXCEPTION_INCLUDED - diff --git a/shared/qcommon/ojk_saved_game_file.cpp b/shared/qcommon/ojk_saved_game_file.cpp index e883310515..aa8a9a7f7a 100644 --- a/shared/qcommon/ojk_saved_game_file.cpp +++ b/shared/qcommon/ojk_saved_game_file.cpp @@ -760,11 +760,6 @@ SavedGameFile& SavedGameFile::get_instance() return result; } -bool SavedGameFile::is_failed() const -{ - return is_failed_; -} - void SavedGameFile::clear_error() { is_failed_ = false; diff --git a/shared/qcommon/ojk_saved_game_file_helper.h b/shared/qcommon/ojk_saved_game_file_helper.h index 05fbfa0d11..4ee969716b 100644 --- a/shared/qcommon/ojk_saved_game_file_helper.h +++ b/shared/qcommon/ojk_saved_game_file_helper.h @@ -30,6 +30,73 @@ inline SavedGameFileHelper::SavedGameFileHelper( // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// Public methods + +inline void SavedGameFileHelper::read_chunk( + const uint32_t chunk_id) +{ + if (!saved_game_file_->read_chunk( + chunk_id)) + { + saved_game_file_->throw_error(); + } +} + +inline void SavedGameFileHelper::write_chunk( + const uint32_t chunk_id) +{ + if (!saved_game_file_->write_chunk( + chunk_id)) + { + saved_game_file_->throw_error(); + } +} + +inline void SavedGameFileHelper::skip( + int count) +{ + if (!saved_game_file_->skip( + count)) + { + saved_game_file_->throw_error(); + } +} + +inline const void* SavedGameFileHelper::get_buffer_data() +{ + return saved_game_file_->get_buffer_data(); +} + +inline int SavedGameFileHelper::get_buffer_size() const +{ + return saved_game_file_->get_buffer_size(); +} + +inline void SavedGameFileHelper::reset_buffer() +{ + saved_game_file_->reset_buffer(); +} + +inline void SavedGameFileHelper::reset_buffer_offset() +{ + saved_game_file_->reset_buffer_offset(); +} + +inline void SavedGameFileHelper::ensure_all_data_read() +{ + saved_game_file_->ensure_all_data_read(); +} + +inline bool SavedGameFileHelper::is_failed() const +{ + return saved_game_file_->is_failed(); +} + +// Public methods +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // try_read_chunk @@ -39,7 +106,7 @@ bool SavedGameFileHelper::try_read_chunk( TDst& dst_value) { if (!saved_game_file_->read_chunk( - chunk_id);) + chunk_id)) { return false; } @@ -53,6 +120,28 @@ bool SavedGameFileHelper::try_read_chunk( return saved_game_file_->is_all_data_read(); } +template +bool SavedGameFileHelper::try_read_chunk( + const uint32_t chunk_id, + TDst* dst_values, + int dst_count) +{ + if (!saved_game_file_->read_chunk( + chunk_id)) + { + return false; + } + + if (!try_read( + dst_values, + dst_count)) + { + return false; + } + + return saved_game_file_->is_all_data_read(); +} + // try_read_chunk // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @@ -81,7 +170,7 @@ void SavedGameFileHelper::read_chunk( { if (!try_read_chunk( chunk_id, - dst_value, + dst_values, dst_count)) { saved_game_file_->throw_error(); @@ -204,8 +293,7 @@ void SavedGameFileHelper::read( TDst& dst_value) { if (!try_read( - dst_value, - Tag())) + dst_value)) { saved_game_file_->throw_error(); } @@ -299,7 +387,7 @@ bool SavedGameFileHelper::try_read( "Unsupported types."); dst_value.sg_import( - saved_game_file_); + *this); return !saved_game_file_->is_failed(); } @@ -549,7 +637,7 @@ void SavedGameFileHelper::write( "Unsupported types."); src_value.sg_export( - saved_game_file_); + *this); } template diff --git a/shared/qcommon/ojk_saved_game_file_helper_fwd.h b/shared/qcommon/ojk_saved_game_file_helper_fwd.h index fb9dfb4ca8..e27daf64d5 100644 --- a/shared/qcommon/ojk_saved_game_file_helper_fwd.h +++ b/shared/qcommon/ojk_saved_game_file_helper_fwd.h @@ -22,6 +22,28 @@ class SavedGameFileHelper ISavedGameFile* saved_game_file); + void read_chunk( + const uint32_t chunk_id); + + void write_chunk( + const uint32_t chunk_id); + + void skip( + int count); + + const void* get_buffer_data(); + + int get_buffer_size() const; + + void reset_buffer(); + + void reset_buffer_offset(); + + void ensure_all_data_read(); + + bool is_failed() const; + + // Tries to read a value or an array of values from the file via // the internal buffer. // Return true on success or false otherwise. From 3179f7741d399ceff3372f943e6240bb35f9d47d Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 7 Aug 2016 17:45:00 +0300 Subject: [PATCH 294/445] SG: Rename classes and files --- code/CMakeLists.txt | 10 +- code/cgame/FxScheduler.cpp | 14 +- code/cgame/FxScheduler.h | 4 +- code/cgame/cg_main.cpp | 14 +- code/client/cl_main.cpp | 4 +- code/game/CMakeLists.txt | 6 +- code/game/G_Timer.cpp | 22 +-- code/game/Q3_Interface.cpp | 48 +++--- code/game/Q3_Interface.h | 2 +- code/game/ai.h | 8 +- code/game/b_public.h | 8 +- code/game/bg_public.h | 8 +- code/game/g_local.h | 12 +- code/game/g_main.cpp | 18 +- code/game/g_objectives.cpp | 10 +- code/game/g_public.h | 4 +- code/game/g_roff.cpp | 18 +- code/game/g_savegame.cpp | 58 +++---- code/game/g_shared.h | 40 ++--- code/game/g_vehicles.h | 16 +- code/game/ghoul2_shared.h | 24 +-- code/icarus/IcarusImplementation.cpp | 30 ++-- code/icarus/IcarusInterface.h | 2 +- code/qcommon/cm_load.cpp | 16 +- code/qcommon/q_shared.h | 42 ++--- code/rd-common/mdx_format.h | 4 +- code/rd-common/tr_public.h | 2 +- code/rd-vanilla/CMakeLists.txt | 6 +- code/rd-vanilla/G2_misc.cpp | 54 +++--- code/server/sv_game.cpp | 4 +- code/server/sv_savegame.cpp | 154 ++++++++--------- codeJK2/cgame/cg_main.cpp | 14 +- codeJK2/game/CMakeLists.txt | 6 +- codeJK2/game/G_Timer.cpp | 22 +-- codeJK2/game/Q3_Registers.cpp | 46 ++--- codeJK2/game/ai.h | 8 +- codeJK2/game/anims.h | 4 +- codeJK2/game/b_public.h | 8 +- codeJK2/game/bg_public.h | 8 +- codeJK2/game/g_local.h | 8 +- codeJK2/game/g_main.cpp | 18 +- codeJK2/game/g_objectives.cpp | 10 +- codeJK2/game/g_public.h | 2 +- codeJK2/game/g_roff.cpp | 18 +- codeJK2/game/g_savegame.cpp | 56 +++--- codeJK2/game/g_shared.h | 44 ++--- codeJK2/icarus/Instance.cpp | 50 +++--- codeJK2/icarus/Sequence.cpp | 60 +++---- codeJK2/icarus/Sequencer.cpp | 42 ++--- codeJK2/icarus/TaskManager.cpp | 92 +++++----- codeJK2/icarus/interface.h | 2 +- ...i_saved_game_file.h => ojk_i_saved_game.h} | 24 +-- ...saved_game_file.cpp => ojk_saved_game.cpp} | 72 ++++---- ...ojk_saved_game_file.h => ojk_saved_game.h} | 31 ++-- ..._file_helper.h => ojk_saved_game_helper.h} | 160 +++++++++--------- ...lper_fwd.h => ojk_saved_game_helper_fwd.h} | 22 +-- 56 files changed, 744 insertions(+), 745 deletions(-) rename shared/qcommon/{ojk_i_saved_game_file.h => ojk_i_saved_game.h} (82%) rename shared/qcommon/{ojk_saved_game_file.cpp => ojk_saved_game.cpp} (91%) rename shared/qcommon/{ojk_saved_game_file.h => ojk_saved_game.h} (88%) rename shared/qcommon/{ojk_saved_game_file_helper.h => ojk_saved_game_helper.h} (79%) rename shared/qcommon/{ojk_saved_game_file_helper_fwd.h => ojk_saved_game_helper_fwd.h} (93%) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 4fbb89ced2..70154d6a76 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -174,11 +174,11 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SPDir}/qcommon/timing.h" "${SPDir}/qcommon/MiniHeap.h" - "${SharedDir}/qcommon/ojk_i_saved_game_file.h" - "${SharedDir}/qcommon/ojk_saved_game_file.h" - "${SharedDir}/qcommon/ojk_saved_game_file.cpp" - "${SharedDir}/qcommon/ojk_saved_game_file_helper.h" - "${SharedDir}/qcommon/ojk_saved_game_file_helper_fwd.h" + "${SharedDir}/qcommon/ojk_i_saved_game.h" + "${SharedDir}/qcommon/ojk_saved_game.h" + "${SharedDir}/qcommon/ojk_saved_game.cpp" + "${SharedDir}/qcommon/ojk_saved_game_helper.h" + "${SharedDir}/qcommon/ojk_saved_game_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} diff --git a/code/cgame/FxScheduler.cpp b/code/cgame/FxScheduler.cpp index aa8d637b8f..8c9613e9ff 100644 --- a/code/cgame/FxScheduler.cpp +++ b/code/cgame/FxScheduler.cpp @@ -41,7 +41,7 @@ along with this program; if not, see . #include "qcommon/safe/string.h" #include -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" CFxScheduler theFxScheduler; @@ -110,10 +110,10 @@ void CFxScheduler::LoadSave_Read() Clean(); // need to get rid of old pre-cache handles, or it thinks it has some older effects when it doesn't g_vstrEffectsNeededPerSlot.clear(); // jic - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('F', 'X', 'L', 'E'), ::gLoopedEffectArray); @@ -124,7 +124,7 @@ void CFxScheduler::LoadSave_Read() { char sFX_Filename[MAX_QPATH]; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('F', 'X', 'F', 'N'), sFX_Filename); @@ -134,12 +134,12 @@ void CFxScheduler::LoadSave_Read() void CFxScheduler::LoadSave_Write() { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); // bsave the data we need... // - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('F', 'X', 'L', 'E'), mLoopedEffectArray); @@ -174,7 +174,7 @@ void CFxScheduler::LoadSave_Write() // write out this string... // - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('F', 'X', 'F', 'N'), sFX_Filename); } diff --git a/code/cgame/FxScheduler.h b/code/cgame/FxScheduler.h index ea7266b543..b5572ae31b 100644 --- a/code/cgame/FxScheduler.h +++ b/code/cgame/FxScheduler.h @@ -412,7 +412,7 @@ struct SLoopedEffect void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(mId); saved_game.write(mBoltInfo); @@ -424,7 +424,7 @@ struct SLoopedEffect } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(mId); saved_game.read(mBoltInfo); diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 58331c757d..725c9ce606 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -28,7 +28,7 @@ along with this program; if not, see . #include "g_local.h" #include "../qcommon/sstring.h" -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char > namePrecache_m; @@ -1907,28 +1907,28 @@ static void CG_GameStateReceived( void ) { void CG_WriteTheEvilCGHackStuff() { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('F', 'P', 'S', 'L'), ::cg.forcepowerSelect); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('I', 'V', 'S', 'L'), ::cg.inventorySelect); } void CG_ReadTheEvilCGHackStuff() { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('F', 'P', 'S', 'L'), ::gi_cg_forcepowerSelect); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('I', 'V', 'S', 'L'), ::gi_cg_inventorySelect); diff --git a/code/client/cl_main.cpp b/code/client/cl_main.cpp index 3be1fd3c09..d02fe0d24c 100644 --- a/code/client/cl_main.cpp +++ b/code/client/cl_main.cpp @@ -32,7 +32,7 @@ along with this program; if not, see . #include "../ghoul2/G2.h" #include "qcommon/stringed_ingame.h" #include "sys/sys_loadlib.h" -#include "qcommon/ojk_saved_game_file.h" +#include "qcommon/ojk_saved_game.h" #define RETRANSMIT_TIMEOUT 3000 // time between connection packet retransmits @@ -1181,7 +1181,7 @@ void CL_InitRef( void ) { rit.SV_PointContents = SV_PointContents; - rit.saved_game = &ojk::SavedGameFile::get_instance(); + rit.saved_game = &ojk::SavedGame::get_instance(); ret = GetRefAPI( REF_API_VERSION, &rit ); diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 9fa65ce36f..8000d20dad 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -261,9 +261,9 @@ set(SPGameCommonFiles "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SPDir}/rd-common/mdx_format.h" - "${SharedDir}/qcommon/ojk_i_saved_game_file.h" - "${SharedDir}/qcommon/ojk_saved_game_file_helper.h" - "${SharedDir}/qcommon/ojk_saved_game_file_helper_fwd.h" + "${SharedDir}/qcommon/ojk_i_saved_game.h" + "${SharedDir}/qcommon/ojk_saved_game_helper.h" + "${SharedDir}/qcommon/ojk_saved_game_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index b16fabc657..90b5e3ba6e 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -22,7 +22,7 @@ along with this program; if not, see . #include "g_local.h" #include "../Rufl/hstring.h" -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" #define MAX_GTIMERS 16384 @@ -159,7 +159,7 @@ void TIMER_Save( void ) int j; gentity_t *ent; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); for ( j = 0, ent = &g_entities[0]; j < MAX_GENTITIES; j++, ent++ ) @@ -175,7 +175,7 @@ void TIMER_Save( void ) } //Write out the timer information - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'I', 'M', 'E'), numTimers); @@ -191,13 +191,13 @@ void TIMER_Save( void ) assert( length < 1024 );//This will cause problems when loading the timer if longer //Write out the id string - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'M', 'I', 'D'), timerID, length); //Write out the timer data - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'D', 'T', 'A'), time); @@ -217,14 +217,14 @@ void TIMER_Load( void ) int j; gentity_t *ent; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); for ( j = 0, ent = &g_entities[0]; j < MAX_GENTITIES; j++, ent++ ) { unsigned char numTimers; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'I', 'M', 'E'), numTimers); @@ -237,13 +237,13 @@ void TIMER_Load( void ) assert (sizeof(g_timers[0]->time) == sizeof(time) );//make sure we're reading the same size as we wrote //Read the id string and time - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'M', 'I', 'D')); auto sg_buffer_data = static_cast( - sgfh.get_buffer_data()); + saved_game.get_buffer_data()); - const auto sg_buffer_size = sgfh.get_buffer_size(); + const auto sg_buffer_size = saved_game.get_buffer_size(); std::uninitialized_copy_n( sg_buffer_data, @@ -252,7 +252,7 @@ void TIMER_Load( void ) tempBuffer[sg_buffer_size] = '\0'; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'D', 'T', 'A'), time); diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index d8b9ae4242..5f8a5f60c0 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -40,7 +40,7 @@ along with this program; if not, see . #include "wp_saber.h" #include "g_vehicles.h" #include "g_navigator.h" -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" extern cvar_t *com_buildScript; @@ -7208,10 +7208,10 @@ void CQuake3GameInterface::VariableSaveFloats( varFloat_m &fmap ) { int numFloats = fmap.size(); - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('F', 'V', 'A', 'R'), numFloats); @@ -7222,17 +7222,17 @@ void CQuake3GameInterface::VariableSaveFloats( varFloat_m &fmap ) int idSize = strlen( ((*vfi).first).c_str() ); //Save out the real data - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('F', 'I', 'D', 'L'), idSize); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('F', 'I', 'D', 'S'), ((*vfi).first).c_str(), idSize); //Save out the float value - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('F', 'V', 'A', 'L'), (*vfi).second); } @@ -7248,10 +7248,10 @@ void CQuake3GameInterface::VariableSaveStrings( varString_m &smap ) { int numStrings = smap.size(); - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'V', 'A', 'R'), numStrings); @@ -7262,11 +7262,11 @@ void CQuake3GameInterface::VariableSaveStrings( varString_m &smap ) int idSize = strlen( ((*vsi).first).c_str() ); //Save out the real data - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'I', 'D', 'L'), idSize); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'I', 'D', 'S'), ((*vsi).first).c_str(), idSize); @@ -7274,11 +7274,11 @@ void CQuake3GameInterface::VariableSaveStrings( varString_m &smap ) //Save out the string value idSize = strlen( ((*vsi).second).c_str() ); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'V', 'S', 'Z'), idSize); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'V', 'A', 'L'), ((*vsi).second).c_str(), idSize); @@ -7311,10 +7311,10 @@ void CQuake3GameInterface::VariableLoadFloats( varFloat_m &fmap ) int numFloats; char tempBuffer[1024]; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('F', 'V', 'A', 'R'), numFloats); @@ -7322,11 +7322,11 @@ void CQuake3GameInterface::VariableLoadFloats( varFloat_m &fmap ) { int idSize; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('F', 'I', 'D', 'L'), idSize); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('F', 'I', 'D', 'S'), tempBuffer, idSize); @@ -7335,7 +7335,7 @@ void CQuake3GameInterface::VariableLoadFloats( varFloat_m &fmap ) float val; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('F', 'V', 'A', 'L'), val); @@ -7356,10 +7356,10 @@ void CQuake3GameInterface::VariableLoadStrings( int type, varString_m &fmap ) char tempBuffer[1024]; char tempBuffer2[1024]; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'V', 'A', 'R'), numFloats); @@ -7367,22 +7367,22 @@ void CQuake3GameInterface::VariableLoadStrings( int type, varString_m &fmap ) { int idSize; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'I', 'D', 'L'), idSize); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'I', 'D', 'S'), tempBuffer, idSize); tempBuffer[ idSize ] = 0; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'V', 'S', 'Z'), idSize); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'V', 'A', 'L'), tempBuffer2, idSize); @@ -11166,7 +11166,7 @@ void CQuake3GameInterface::FreeVariable( const char *name ) } //Save / Load functions -ojk::ISavedGameFile* CQuake3GameInterface::get_saved_game_file() +ojk::ISavedGame* CQuake3GameInterface::get_saved_game_file() { return ::gi.saved_game; } diff --git a/code/game/Q3_Interface.h b/code/game/Q3_Interface.h index 1f36f135cd..9f7c7b8ae9 100644 --- a/code/game/Q3_Interface.h +++ b/code/game/Q3_Interface.h @@ -699,7 +699,7 @@ class CQuake3GameInterface : public IGameInterface //Save / Load functions int LinkGame( int entID, int icarusID ); - ojk::ISavedGameFile* get_saved_game_file() override; + ojk::ISavedGame* get_saved_game_file() override; // Access functions int CreateIcarus( int entID); diff --git a/code/game/ai.h b/code/game/ai.h index b7739de2f9..dc3e533eba 100644 --- a/code/game/ai.h +++ b/code/game/ai.h @@ -125,7 +125,7 @@ class AIGroupMember_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(number); saved_game.write(waypoint); @@ -134,7 +134,7 @@ class AIGroupMember_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(number); saved_game.read(waypoint); @@ -168,7 +168,7 @@ class AIGroupInfo_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(numGroup); saved_game.write(processed); @@ -190,7 +190,7 @@ class AIGroupInfo_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(numGroup); saved_game.read(processed); diff --git a/code/game/b_public.h b/code/game/b_public.h index d8d7971ad3..f10e76fb8d 100644 --- a/code/game/b_public.h +++ b/code/game/b_public.h @@ -159,7 +159,7 @@ class gNPCstats_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(aggression); saved_game.write(aim); @@ -182,7 +182,7 @@ class gNPCstats_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(aggression); saved_game.read(aim); @@ -384,7 +384,7 @@ class gNPC_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(timeOfDeath); saved_game.write(touchedByPlayer); @@ -506,7 +506,7 @@ class gNPC_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(timeOfDeath); saved_game.read(touchedByPlayer); diff --git a/code/game/bg_public.h b/code/game/bg_public.h index a016416c03..1a884f2a3c 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -466,7 +466,7 @@ class animation_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(firstFrame); saved_game.write(numFrames); @@ -476,7 +476,7 @@ class animation_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(firstFrame); saved_game.read(numFrames); @@ -548,7 +548,7 @@ typedef struct animevent_s void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(eventType); saved_game.write(modelOnly); @@ -559,7 +559,7 @@ typedef struct animevent_s } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(eventType); saved_game.read(modelOnly); diff --git a/code/game/g_local.h b/code/game/g_local.h index 2bca16fd28..4f1a64c844 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -100,7 +100,7 @@ class animFileSet_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(filename); saved_game.write<>(animations); @@ -112,7 +112,7 @@ class animFileSet_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(filename); saved_game.read<>(animations); @@ -187,7 +187,7 @@ class alertEvent_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(position); saved_game.write(radius); @@ -202,7 +202,7 @@ class alertEvent_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(position); saved_game.read(radius); @@ -302,7 +302,7 @@ class level_locals_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(clients); saved_game.write(maxclients); @@ -324,7 +324,7 @@ class level_locals_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(clients); saved_game.read(maxclients); diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index b6dc728f1d..428f4d9024 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -36,7 +36,7 @@ along with this program; if not, see . #include "../ghoul2/ghoul2_gore.h" //rww - RAGDOLL_END -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" extern void WP_SaberLoadParms( void ); extern qboolean G_PlayerSpawned( void ); @@ -107,20 +107,20 @@ qboolean PInUse(unsigned int entNum) void WriteInUseBits() { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('I', 'N', 'U', 'S'), ::g_entityInUseBits); } void ReadInUseBits() { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('I', 'N', 'U', 'S'), ::g_entityInUseBits); @@ -2121,10 +2121,10 @@ extern qboolean player_locked; void G_LoadSave_WriteMiscData() { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('L', 'C', 'K', 'D'), ::player_locked); } @@ -2133,10 +2133,10 @@ void G_LoadSave_WriteMiscData() void G_LoadSave_ReadMiscData() { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('L', 'C', 'K', 'D'), ::player_locked); } diff --git a/code/game/g_objectives.cpp b/code/game/g_objectives.cpp index 5d61462846..5073cf8d83 100644 --- a/code/game/g_objectives.cpp +++ b/code/game/g_objectives.cpp @@ -29,7 +29,7 @@ along with this program; if not, see . #define G_OBJECTIVES_CPP #include "objectives.h" -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" qboolean missionInfo_Updated; @@ -60,10 +60,10 @@ OBJ_SaveMissionObjectives */ void OBJ_SaveMissionObjectives( gclient_t *client ) { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('O', 'B', 'J', 'T'), client->sess.mission_objectives); } @@ -90,10 +90,10 @@ OBJ_LoadMissionObjectives */ void OBJ_LoadMissionObjectives( gclient_t *client ) { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('O', 'B', 'J', 'T'), client->sess.mission_objectives); } diff --git a/code/game/g_public.h b/code/game/g_public.h index 2051b32ea1..b553e2e145 100644 --- a/code/game/g_public.h +++ b/code/game/g_public.h @@ -26,7 +26,7 @@ along with this program; if not, see . // g_public.h -- game module information visible to server -#include "qcommon/ojk_i_saved_game_file.h" +#include "qcommon/ojk_i_saved_game.h" #define GAME_API_VERSION 8 @@ -190,7 +190,7 @@ typedef struct { // Savegame handling // - ojk::ISavedGameFile* saved_game; + ojk::ISavedGame* saved_game; // add commands to the console as if they were typed in // for map changing, etc diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp index 2c70b5f7b2..49fe7d6983 100644 --- a/code/game/g_roff.cpp +++ b/code/game/g_roff.cpp @@ -25,7 +25,7 @@ along with this program; if not, see . #include "Q3_Interface.h" #include "../cgame/cg_local.h" #include "g_functions.h" -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" // The list of precached ROFFs roff_list_t roffs[MAX_ROFFS]; @@ -651,11 +651,11 @@ void G_SaveCachedRoffs() { int i, len; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); // Write out the number of cached ROFFs - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('R', 'O', 'F', 'F'), ::num_roffs); @@ -665,11 +665,11 @@ void G_SaveCachedRoffs() // Dump out the string length to make things a bit easier on the other end...heh heh. len = strlen( roffs[i].fileName ) + 1; - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'L', 'E', 'N'), len); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('R', 'S', 'T', 'R'), roffs[i].fileName, len); @@ -688,22 +688,22 @@ void G_LoadCachedRoffs() int i, count, len; char buffer[MAX_QPATH]; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); // Get the count of goodies we need to revive - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('R', 'O', 'F', 'F'), count); // Now bring 'em back to life for ( i = 0; i < count; i++ ) { - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'L', 'E', 'N'), len); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('R', 'S', 'T', 'R'), buffer, len); diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index ea5e3a925b..cc16c1f721 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -30,7 +30,7 @@ along with this program; if not, see . #include "objectives.h" #include "../cgame/cg_camera.h" #include "../qcommon/sstring.h" -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" extern void OBJ_LoadTacticalInfo(void); @@ -188,10 +188,10 @@ static char *GetStringPtr(int iStrlen, char *psOriginal/*may be NULL*/) assert(iStrlen+1<=(int)sizeof(sString)); - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S','T','R','G'), sString, iStrlen); @@ -529,24 +529,24 @@ static void EnumerateFields( } } - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); // save out raw data... // - sgfh.reset_buffer(); + saved_game.reset_buffer(); src_instance->sg_export( - sgfh); + saved_game); - sgfh.write_chunk( + saved_game.write_chunk( ulChid); // save out any associated strings.. // for (const auto& it : strList) { - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'T', 'R', 'G'), it.c_str(), static_cast(it.length() + 1)); @@ -803,26 +803,26 @@ static void EvaluateFields( { auto& instance = *pbData; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); if (ulChid != INT_ID('G', 'C', 'L', 'I')) { - sgfh.read_chunk( + saved_game.read_chunk( ulChid, instance); } else { - if (!sgfh.try_read_chunk( + if (!saved_game.try_read_chunk( ulChid, instance)) { RetailGClient retail_client; - sgfh.reset_buffer_offset(); + saved_game.reset_buffer_offset(); - if (sgfh.try_read( + if (saved_game.try_read( retail_client)) { copy_retail_gclient_to_current( @@ -903,10 +903,10 @@ static void WriteGEntities(qboolean qbAutosave) } } - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('N', 'M', 'E', 'D'), iCount); @@ -916,7 +916,7 @@ static void WriteGEntities(qboolean qbAutosave) if ( ent->inuse) { - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('E', 'D', 'N', 'M'), i); @@ -949,7 +949,7 @@ static void WriteGEntities(qboolean qbAutosave) if (tempEnt.parms) { - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('P', 'A', 'R', 'M'), *ent->parms); } @@ -981,7 +981,7 @@ static void WriteGEntities(qboolean qbAutosave) // static int iBlah = 1234; - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('I', 'C', 'O', 'K'), iBlah); } @@ -996,10 +996,10 @@ static void ReadGEntities(qboolean qbAutosave) int iCount; int i; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('N', 'M', 'E', 'D'), iCount); @@ -1008,7 +1008,7 @@ static void ReadGEntities(qboolean qbAutosave) { int iEntIndex; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('E', 'D', 'N', 'M'), iEntIndex); @@ -1123,7 +1123,7 @@ static void ReadGEntities(qboolean qbAutosave) { parms_t tempParms; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('P', 'A', 'R', 'M'), tempParms); @@ -1176,7 +1176,7 @@ static void ReadGEntities(qboolean qbAutosave) // the scary ghoul2 stuff... (fingers crossed) // { - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('G', 'H', 'L', '2')); gi.G2API_LoadGhoul2Models(pEnt->ghoul2, nullptr); @@ -1243,7 +1243,7 @@ static void ReadGEntities(qboolean qbAutosave) // static int iBlah = 1234; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('I', 'C', 'O', 'K'), iBlah); } @@ -1283,17 +1283,17 @@ void WriteLevel(qboolean qbAutosave) // static int iDONE = 1234; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('D', 'O', 'N', 'E'), iDONE); } void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); if ( qbLoadTransition ) @@ -1322,7 +1322,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) ReadLevelLocals(); // level_locals_t level //Read & throw away objective info - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('O', 'B', 'J', 'T')); } else @@ -1357,7 +1357,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) // static int iDONE = 1234; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('D', 'O', 'N', 'E'), iDONE); } diff --git a/code/game/g_shared.h b/code/game/g_shared.h index be3cf2e86a..e86103dd83 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -123,7 +123,7 @@ class clientInfo_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(infoValid); saved_game.write(name); @@ -145,7 +145,7 @@ class clientInfo_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(infoValid); saved_game.read(name); @@ -290,7 +290,7 @@ class renderInfo_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(legsModelName); saved_game.write(torsoModelName); @@ -347,7 +347,7 @@ class renderInfo_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(legsModelName); saved_game.read(torsoModelName); @@ -449,7 +449,7 @@ class playerTeamState_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(state); saved_game.write(captures); @@ -465,7 +465,7 @@ class playerTeamState_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(state); saved_game.read(captures); @@ -490,14 +490,14 @@ class objectives_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(display); saved_game.write(status); } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(display); saved_game.read(status); @@ -528,7 +528,7 @@ class missionStats_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(secretsFound); saved_game.write(totalSecrets); @@ -547,7 +547,7 @@ class missionStats_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(secretsFound); saved_game.read(totalSecrets); @@ -587,7 +587,7 @@ class clientSession_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(missionObjectivesShown); saved_game.write(sessionTeam); @@ -596,7 +596,7 @@ class clientSession_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(missionObjectivesShown); saved_game.read(sessionTeam); @@ -622,7 +622,7 @@ class clientPersistant_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(connected); saved_game.write<>(lastCommand); @@ -636,7 +636,7 @@ class clientPersistant_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(connected); saved_game.read<>(lastCommand); @@ -792,7 +792,7 @@ class GClientBase void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write<>(ps); saved_game.write<>(pers); @@ -858,7 +858,7 @@ class GClientBase } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read<>(ps); saved_game.read<>(pers); @@ -939,13 +939,13 @@ class parms_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(parm); } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(parm); } @@ -1282,7 +1282,7 @@ Ghoul2 Insert End void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write<>(s); saved_game.write(client); @@ -1471,7 +1471,7 @@ Ghoul2 Insert End } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read<>(s); saved_game.read(client); diff --git a/code/game/g_vehicles.h b/code/game/g_vehicles.h index 7e4845afe7..ce36437639 100644 --- a/code/game/g_vehicles.h +++ b/code/game/g_vehicles.h @@ -468,7 +468,7 @@ struct Muzzle void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(m_vMuzzlePos); saved_game.write(m_vMuzzleDir); @@ -478,7 +478,7 @@ struct Muzzle } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(m_vMuzzlePos); saved_game.read(m_vMuzzleDir); @@ -524,7 +524,7 @@ typedef struct void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(linked); saved_game.write(ammo); @@ -533,7 +533,7 @@ typedef struct } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(linked); saved_game.read(ammo); @@ -557,7 +557,7 @@ typedef struct void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(ammo); saved_game.write(lastAmmoInc); @@ -567,7 +567,7 @@ typedef struct } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(ammo); saved_game.read(lastAmmoInc); @@ -694,7 +694,7 @@ struct Vehicle_t void Vehicle_t::sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(m_pPilot); saved_game.write(m_iPilotTime); @@ -741,7 +741,7 @@ struct Vehicle_t } void Vehicle_t::sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(m_pPilot); saved_game.read(m_iPilotTime); diff --git a/code/game/ghoul2_shared.h b/code/game/ghoul2_shared.h index 2a77e20974..8cf64dd794 100644 --- a/code/game/ghoul2_shared.h +++ b/code/game/ghoul2_shared.h @@ -60,7 +60,7 @@ surfaceInfo_t(): void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(offFlags); saved_game.write(surface); @@ -71,7 +71,7 @@ surfaceInfo_t(): } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(offFlags); saved_game.read(surface); @@ -216,7 +216,7 @@ boneInfo_t(): void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(boneNumber); saved_game.write<>(matrix); @@ -292,7 +292,7 @@ boneInfo_t(): } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(boneNumber); saved_game.read<>(matrix); @@ -382,7 +382,7 @@ struct boltInfo_t{ void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(boneNumber); saved_game.write(surfaceNumber); @@ -391,7 +391,7 @@ struct boltInfo_t{ } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(boneNumber); saved_game.read(surfaceNumber); @@ -516,7 +516,7 @@ class CGhoul2Info void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(mModelindex); @@ -544,7 +544,7 @@ class CGhoul2Info } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(mModelindex); @@ -723,13 +723,13 @@ class CGhoul2Info_v void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(mItem); } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(mItem); } @@ -764,7 +764,7 @@ class CCollisionRecord void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(mDistance); saved_game.write(mEntityNum); @@ -781,7 +781,7 @@ class CCollisionRecord } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(mDistance); saved_game.read(mEntityNum); diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index 7ba36bc715..2fe169ae32 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -33,7 +33,7 @@ along with this program; if not, see . #include "../qcommon/q_shared.h" #include "../qcommon/qcommon.h" -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" #define STL_ITERATE( a, b ) for ( a = b.begin(); a != b.end(); ++a ) #define STL_INSERT( a, b ) a.insert( a.end(), b ); @@ -539,13 +539,13 @@ int CIcarus::Save() IGameInterface* game = IGameInterface::GetGame(m_flavor); - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( game->get_saved_game_file()); //Save out a ICARUS save block header with the ICARUS version double version = ICARUS_VERSION; - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('I', 'C', 'A', 'R'), version); @@ -571,7 +571,7 @@ int CIcarus::Save() } // Write out the buffer with all our collected data. - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('I', 'S', 'E', 'Q'), m_byBuffer, static_cast(m_ulBufferCurPos)); @@ -688,7 +688,7 @@ int CIcarus::Load() IGameInterface* game = IGameInterface::GetGame(m_flavor); - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( game->get_saved_game_file()); //Clear out any old information @@ -697,7 +697,7 @@ int CIcarus::Load() //Check to make sure we're at the ICARUS save block double version; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('I', 'C', 'A', 'R'), version); @@ -710,13 +710,13 @@ int CIcarus::Load() } // Read into the buffer all our data. - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('I','S','E','Q')); auto sg_buffer_data = static_cast( - sgfh.get_buffer_data()); + saved_game.get_buffer_data()); - const auto sg_buffer_size = sgfh.get_buffer_size(); + const auto sg_buffer_size = saved_game.get_buffer_size(); std::uninitialized_copy_n( sg_buffer_data, @@ -810,10 +810,10 @@ void CIcarus::BufferWrite( void *pSrcData, unsigned long ulNumBytesToWrite ) { // Write out the buffer with all our collected data so far... IGameInterface::GetGame()->DebugPrint( IGameInterface::WL_ERROR, "BufferWrite: Out of buffer space, Flushing." ); - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( IGameInterface::GetGame()->get_saved_game_file()); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('I', 'S', 'E', 'Q'), m_byBuffer, static_cast(m_ulBufferCurPos)); @@ -840,16 +840,16 @@ void CIcarus::BufferRead( void *pDstBuff, unsigned long ulNumBytesToRead ) IGameInterface::GetGame()->DebugPrint( IGameInterface::WL_ERROR, "BufferRead: Buffer underflow, Looking for new block." ); // Read in the next block. - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( IGameInterface::GetGame()->get_saved_game_file()); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('I', 'S', 'E', 'Q')); auto sg_buffer_data = static_cast( - sgfh.get_buffer_data()); + saved_game.get_buffer_data()); - const auto sg_buffer_size = sgfh.get_buffer_size(); + const auto sg_buffer_size = saved_game.get_buffer_size(); std::uninitialized_copy_n( sg_buffer_data, diff --git a/code/icarus/IcarusInterface.h b/code/icarus/IcarusInterface.h index 26265c197b..9c9d451e65 100644 --- a/code/icarus/IcarusInterface.h +++ b/code/icarus/IcarusInterface.h @@ -145,7 +145,7 @@ class IGameInterface // Save / Load functions virtual int LinkGame( int gameID, int icarusID ) = 0; - virtual ojk::ISavedGameFile* get_saved_game_file() = 0; + virtual ojk::ISavedGame* get_saved_game_file() = 0; // Access functions diff --git a/code/qcommon/cm_load.cpp b/code/qcommon/cm_load.cpp index 459ead779d..80886cf129 100644 --- a/code/qcommon/cm_load.cpp +++ b/code/qcommon/cm_load.cpp @@ -24,8 +24,8 @@ along with this program; if not, see . // cmodel.c -- model loading #include "cm_local.h" -#include "qcommon/ojk_saved_game_file.h" -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_helper.h" #ifdef BSPC void SetPlaneSignbits (cplane_t *out) { @@ -1217,10 +1217,10 @@ int SG_Read(unsigned int chid, void *pvAddress, int iLength, void **ppvAddressPt void CM_WritePortalState() { - ojk::SavedGameFileHelper sgfh( - &ojk::SavedGameFile::get_instance()); + ojk::SavedGameHelper saved_game( + &ojk::SavedGame::get_instance()); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('P', 'R', 'T', 'S'), ::cmg.areaPortals, ::cmg.numAreas * ::cmg.numAreas); @@ -1236,10 +1236,10 @@ and recalculates the area connections */ void CM_ReadPortalState() { - ojk::SavedGameFileHelper sgfh( - &ojk::SavedGameFile::get_instance()); + ojk::SavedGameHelper saved_game( + &ojk::SavedGame::get_instance()); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('P', 'R', 'T', 'S'), ::cmg.areaPortals, ::cmg.numAreas * ::cmg.numAreas); diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 96cadd8d15..a79f6ad0e7 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -162,7 +162,7 @@ float FloatSwap( const float *f ); #include "qcommon/q_platform.h" -#include "qcommon/ojk_saved_game_file_helper_fwd.h" +#include "qcommon/ojk_saved_game_helper_fwd.h" // ================================================================ @@ -1233,7 +1233,7 @@ typedef struct cplane_s { void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(normal); saved_game.write(dist); @@ -1243,7 +1243,7 @@ typedef struct cplane_s { } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(normal); saved_game.read(dist); @@ -1286,7 +1286,7 @@ Ghoul2 Insert End void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(allsolid); saved_game.write(startsolid); @@ -1300,7 +1300,7 @@ Ghoul2 Insert End } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(allsolid); saved_game.read(startsolid); @@ -1585,7 +1585,7 @@ typedef struct void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(inAction); saved_game.write(duration); @@ -1598,7 +1598,7 @@ typedef struct } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(inAction); saved_game.read(duration); @@ -1640,7 +1640,7 @@ typedef struct void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(active); saved_game.write(color); @@ -1656,7 +1656,7 @@ typedef struct } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(active); saved_game.read(color); @@ -1961,7 +1961,7 @@ typedef struct void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(name); saved_game.write(fullName); @@ -2042,7 +2042,7 @@ typedef struct } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(name); saved_game.read(fullName); @@ -2243,7 +2243,7 @@ class saberInfoRetail_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(name); saved_game.write(fullName); @@ -2275,7 +2275,7 @@ class saberInfoRetail_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(name); saved_game.read(fullName); @@ -2652,7 +2652,7 @@ class PlayerStateBase void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(commandTime); saved_game.write(pm_type); @@ -2821,7 +2821,7 @@ class PlayerStateBase } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(commandTime); saved_game.read(pm_type); @@ -3047,7 +3047,7 @@ typedef struct usercmd_s { void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(serverTime); saved_game.write(buttons); @@ -3061,7 +3061,7 @@ typedef struct usercmd_s { } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(serverTime); saved_game.read(buttons); @@ -3099,7 +3099,7 @@ typedef struct {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(trType); saved_game.write(trTime); @@ -3109,7 +3109,7 @@ typedef struct {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(trType); saved_game.read(trTime); @@ -3205,7 +3205,7 @@ Ghoul2 Insert End void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(number); saved_game.write(eType); @@ -3261,7 +3261,7 @@ Ghoul2 Insert End } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(number); saved_game.read(eType); diff --git a/code/rd-common/mdx_format.h b/code/rd-common/mdx_format.h index 14e4c16c56..29bca781be 100644 --- a/code/rd-common/mdx_format.h +++ b/code/rd-common/mdx_format.h @@ -164,13 +164,13 @@ typedef struct { #ifdef __cplusplus void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(matrix); } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(matrix); } diff --git a/code/rd-common/tr_public.h b/code/rd-common/tr_public.h index 7af64cb024..f14af68715 100644 --- a/code/rd-common/tr_public.h +++ b/code/rd-common/tr_public.h @@ -112,7 +112,7 @@ typedef struct { const int passEntityNum, const int contentmask, const EG2_Collision eG2TraceType, const int useLod ); - ojk::ISavedGameFile* saved_game; + ojk::ISavedGame* saved_game; int (*SV_PointContents) ( const vec3_t p, clipHandle_t model ); diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index 08f06ed8d1..b947b99498 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -78,9 +78,9 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" - "${SharedDir}/qcommon/ojk_i_saved_game_file.h" - "${SharedDir}/qcommon/ojk_saved_game_file_helper.h" - "${SharedDir}/qcommon/ojk_saved_game_file_helper_fwd.h" + "${SharedDir}/qcommon/ojk_i_saved_game.h" + "${SharedDir}/qcommon/ojk_saved_game_helper.h" + "${SharedDir}/qcommon/ojk_saved_game_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index cb85f4e8f9..069b8ab63c 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -48,7 +48,7 @@ along with this program; if not, see . #include -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" #ifdef _G2_GORE #include "../ghoul2/ghoul2_gore.h" @@ -1784,10 +1784,10 @@ const auto BONE_SAVE_BLOCK_SIZE = static_cast(sizeof(SgBoneInfo)); void G2_SaveGhoul2Models( CGhoul2Info_v& ghoul2) { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::ri.saved_game); - sgfh.reset_buffer(); + saved_game.reset_buffer(); // is there anything to save? if (!ghoul2.IsValid() || ghoul2.size() == 0) @@ -1795,14 +1795,14 @@ void G2_SaveGhoul2Models( const int zero_size = 0; #ifdef JK2_MODE - sgfh.write( + saved_game.write( zero_size); - sgfh.write_chunk_and_size( + saved_game.write_chunk_and_size( INT_ID('G', 'L', '2', 'S'), INT_ID('G', 'H', 'L', '2')); #else - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('G', 'H', 'L', '2'), zero_size); //write out a zero buffer #endif // JK2_MODE @@ -1814,61 +1814,61 @@ void G2_SaveGhoul2Models( // save out how many ghoul2 models we have auto model_count = ghoul2.size(); - sgfh.write( + saved_game.write( model_count); for (decltype(model_count) i = 0; i < model_count; ++i) { // first save out the ghoul2 details themselves ghoul2[i].sg_export( - sgfh); + saved_game); // save out how many surfaces we have auto surface_count = ghoul2[i].mSlist.size(); - sgfh.write( + saved_game.write( surface_count); // now save the all the surface list info for (decltype(surface_count) x = 0; x < surface_count; ++x) { ghoul2[i].mSlist[x].sg_export( - sgfh); + saved_game); } // save out how many bones we have auto bone_count = ghoul2[i].mBlist.size(); - sgfh.write( + saved_game.write( bone_count); // now save the all the bone list info for (decltype(bone_count) x = 0; x < bone_count; ++x) { ghoul2[i].mBlist[x].sg_export( - sgfh); + saved_game); } // save out how many bolts we have auto bolt_count = ghoul2[i].mBltlist.size(); - sgfh.write( + saved_game.write( bolt_count); // lastly save the all the bolt list info for (decltype(bolt_count) x = 0; x < bolt_count; ++x) { ghoul2[i].mBltlist[x].sg_export( - sgfh); + saved_game); } } #ifdef JK2_MODE - sgfh.write_chunk_and_size( + saved_game.write_chunk_and_size( INT_ID('G', 'L', '2', 'S'), INT_ID('G', 'H', 'L', '2')); #else - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('G', 'H', 'L', '2')); #endif // JK2_MODE } @@ -1880,18 +1880,18 @@ void G2_LoadGhoul2Model( { static_cast(buffer); - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::ri.saved_game); // first thing, lets see how many ghoul2 models we have, and resize our buffers accordingly int model_count = 0; #ifdef JK2_MODE - if (sgfh.get_buffer_size() > 0) + if (saved_game.get_buffer_size() > 0) { #endif // JK2_MODE - sgfh.read( + saved_game.read( model_count); #ifdef JK2_MODE @@ -1919,7 +1919,7 @@ void G2_LoadGhoul2Model( // load the ghoul2 info from the buffer ghoul2[i].sg_import( - sgfh); + saved_game); if (ghoul2[i].mModelindex != -1 && ghoul2[i].mFileName[0]) { @@ -1932,7 +1932,7 @@ void G2_LoadGhoul2Model( // give us enough surfaces to load up the data auto surface_count = 0; - sgfh.read( + saved_game.read( surface_count); ghoul2[i].mSlist.resize(surface_count); @@ -1941,13 +1941,13 @@ void G2_LoadGhoul2Model( for (decltype(surface_count) x = 0; x < surface_count; ++x) { ghoul2[i].mSlist[x].sg_import( - sgfh); + saved_game); } // give us enough bones to load up the data auto bone_count = 0; - sgfh.read( + saved_game.read( bone_count); ghoul2[i].mBlist.resize( @@ -1957,13 +1957,13 @@ void G2_LoadGhoul2Model( for (decltype(bone_count) x = 0; x < bone_count; ++x) { ghoul2[i].mBlist[x].sg_import( - sgfh); + saved_game); } // give us enough bolts to load up the data auto bolt_count = 0; - sgfh.read( + saved_game.read( bolt_count); ghoul2[i].mBltlist.resize( @@ -1973,9 +1973,9 @@ void G2_LoadGhoul2Model( for (decltype(bolt_count) x = 0; x < bolt_count; ++x) { ghoul2[i].mBltlist[x].sg_import( - sgfh); + saved_game); } } - sgfh.ensure_all_data_read(); + saved_game.ensure_all_data_read(); } diff --git a/code/server/sv_game.cpp b/code/server/sv_game.cpp index 65b2d6aba6..4f707997d6 100644 --- a/code/server/sv_game.cpp +++ b/code/server/sv_game.cpp @@ -30,7 +30,7 @@ along with this program; if not, see . #include "server.h" #include "../client/vmachine.h" #include "../client/client.h" -#include "qcommon/ojk_saved_game_file.h" +#include "qcommon/ojk_saved_game.h" /*#include "..\renderer\tr_local.h" #include "..\renderer\tr_WorldEffects.h"*/ /* @@ -944,7 +944,7 @@ void SV_InitGameProgs (void) { import.FS_FreeFile = FS_FreeFile; import.FS_GetFileList = FS_GetFileList; - import.saved_game = &ojk::SavedGameFile::get_instance(); + import.saved_game = &ojk::SavedGame::get_instance(); import.AdjustAreaPortalState = SV_AdjustAreaPortalState; import.AreasConnected = CM_AreasConnected; diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 02deab7bdc..c0de632dda 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -37,8 +37,8 @@ along with this program; if not, see . #include -#include "qcommon/ojk_saved_game_file.h" -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game.h" +#include "qcommon/ojk_saved_game_helper.h" static char saveGameComment[iSG_COMMENT_SIZE]; @@ -112,7 +112,7 @@ static const char *GetString_FailedToOpenSaveGame(const char *psFilename, qboole void SG_WipeSavegame( const char* psPathlessBaseName) { - ojk::SavedGameFile::remove( + ojk::SavedGame::remove( psPathlessBaseName); } @@ -121,7 +121,7 @@ void SG_WipeSavegame( // void SG_Shutdown() { - auto& saved_game = ojk::SavedGameFile::get_instance(); + auto& saved_game = ojk::SavedGame::get_instance(); saved_game.close(); @@ -398,10 +398,10 @@ void SV_SaveGame_f(void) //--------------- static void WriteGame(qboolean autosave) { - ojk::SavedGameFileHelper sgfh( - &ojk::SavedGameFile::get_instance()); + ojk::SavedGameHelper saved_game( + &ojk::SavedGame::get_instance()); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('G', 'A', 'M', 'E'), autosave); @@ -419,7 +419,7 @@ static void WriteGame(qboolean autosave) memset(s,0,sizeof(s)); Cvar_VariableStringBuffer( sCVARNAME_PLAYERSAVE, s, sizeof(s) ); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('C', 'V', 'S', 'V'), s); @@ -428,7 +428,7 @@ static void WriteGame(qboolean autosave) memset(s,0,sizeof(s)); Cvar_VariableStringBuffer( "playerammo", s, sizeof(s) ); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('A', 'M', 'M', 'O'), s); @@ -437,7 +437,7 @@ static void WriteGame(qboolean autosave) memset(s,0,sizeof(s)); Cvar_VariableStringBuffer( "playerinv", s, sizeof(s) ); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('I', 'V', 'T', 'Y'), s); @@ -446,7 +446,7 @@ static void WriteGame(qboolean autosave) memset(s,0,sizeof(s)); Cvar_VariableStringBuffer( "playerfplvl", s, sizeof(s) ); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('F', 'P', 'L', 'V'), s); } @@ -456,10 +456,10 @@ static qboolean ReadGame (void) { qboolean qbAutoSave; - ojk::SavedGameFileHelper sgfh( - &ojk::SavedGameFile::get_instance()); + ojk::SavedGameHelper saved_game( + &ojk::SavedGame::get_instance()); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('G', 'A', 'M', 'E'), qbAutoSave); @@ -471,7 +471,7 @@ static qboolean ReadGame (void) // memset(s,0,sizeof(s)); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('C', 'V', 'S', 'V'), s); @@ -481,7 +481,7 @@ static qboolean ReadGame (void) // memset(s,0,sizeof(s)); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('A', 'M', 'M', 'O'), s); @@ -491,7 +491,7 @@ static qboolean ReadGame (void) // memset(s,0,sizeof(s)); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('I', 'V', 'T', 'Y'), s); @@ -501,7 +501,7 @@ static qboolean ReadGame (void) // memset(s,0,sizeof(s)); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('F', 'P', 'L', 'V'), s); @@ -524,8 +524,8 @@ void SG_WriteCvars(void) cvar_t *var; int iCount = 0; - ojk::SavedGameFileHelper sgfh( - &ojk::SavedGameFile::get_instance()); + ojk::SavedGameHelper saved_game( + &ojk::SavedGame::get_instance()); // count the cvars... // @@ -544,7 +544,7 @@ void SG_WriteCvars(void) // store count... // - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('C', 'V', 'C', 'N'), iCount); @@ -561,12 +561,12 @@ void SG_WriteCvars(void) continue; } - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('C', 'V', 'A', 'R'), var->name, static_cast(strlen(var->name) + 1)); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('V', 'A', 'L', 'U'), var->string, static_cast(strlen(var->string) + 1)); @@ -579,27 +579,27 @@ void SG_ReadCvars() std::string psName; const char* psValue; - ojk::SavedGameFileHelper sgfh( - &ojk::SavedGameFile::get_instance()); + ojk::SavedGameHelper saved_game( + &ojk::SavedGame::get_instance()); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('C', 'V', 'C', 'N'), iCount); for (int i = 0; i < iCount; ++i) { - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('C', 'V', 'A', 'R')); psName = reinterpret_cast( - sgfh.get_buffer_data()); + saved_game.get_buffer_data()); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('V', 'A', 'L', 'U')); psValue = reinterpret_cast( - sgfh.get_buffer_data()); + saved_game.get_buffer_data()); ::Cvar_Set(psName.c_str(), psValue); } @@ -607,8 +607,8 @@ void SG_ReadCvars() void SG_WriteServerConfigStrings() { - ojk::SavedGameFileHelper sgfh( - &ojk::SavedGameFile::get_instance()); + ojk::SavedGameHelper saved_game( + &ojk::SavedGame::get_instance()); int iCount = 0; int i; // not in FOR statement in case compiler goes weird by reg-optimising it then failing to get the address later @@ -626,7 +626,7 @@ void SG_WriteServerConfigStrings() } } - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('C', 'S', 'C', 'N'), iCount); @@ -638,11 +638,11 @@ void SG_WriteServerConfigStrings() { if (sv.configstrings[i] && strlen(sv.configstrings[i])) { - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('C', 'S', 'I', 'N'), i); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('C', 'S', 'D', 'A'), ::sv.configstrings[i], static_cast(strlen(::sv.configstrings[i]) + 1)); @@ -671,10 +671,10 @@ void SG_ReadServerConfigStrings( void ) // int iCount; - ojk::SavedGameFileHelper sgfh( - &ojk::SavedGameFile::get_instance()); + ojk::SavedGameHelper saved_game( + &ojk::SavedGame::get_instance()); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('C', 'S', 'C', 'N'), iCount); @@ -685,15 +685,15 @@ void SG_ReadServerConfigStrings( void ) int iIndex; const char *psName; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('C', 'S', 'I', 'N'), iIndex); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('C', 'S', 'D', 'A')); psName = reinterpret_cast( - sgfh.get_buffer_data()); + saved_game.get_buffer_data()); Com_DPrintf( "Cfg str %d = %s\n",iIndex, psName); @@ -709,8 +709,8 @@ static unsigned int SG_UnixTimestamp ( const time_t& t ) static void SG_WriteComment(qboolean qbAutosave, const char *psMapName) { - ojk::SavedGameFileHelper sgfh( - &ojk::SavedGameFile::get_instance()); + ojk::SavedGameHelper saved_game( + &ojk::SavedGame::get_instance()); char sComment[iSG_COMMENT_SIZE]; @@ -723,14 +723,14 @@ static void SG_WriteComment(qboolean qbAutosave, const char *psMapName) Q_strncpyz(sComment,saveGameComment, sizeof(sComment)); } - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('C', 'O', 'M', 'M'), sComment); // Add Date/Time/Map stamp unsigned int timestamp = SG_UnixTimestamp (time (NULL)); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('C', 'M', 'T', 'M'), timestamp); @@ -752,9 +752,9 @@ int SG_GetSaveGameComment( { auto ret = 0; - auto& saved_game = ojk::SavedGameFile::get_instance(); + auto& saved_game = ojk::SavedGame::get_instance(); - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( &saved_game); if (!saved_game.open( @@ -765,7 +765,7 @@ int SG_GetSaveGameComment( bool is_succeed = true; - is_succeed = sgfh.try_read_chunk( + is_succeed = saved_game.try_read_chunk( INT_ID('C', 'O', 'M', 'M'), sComment, iSG_COMMENT_SIZE); @@ -776,7 +776,7 @@ int SG_GetSaveGameComment( { unsigned int fileTime = 0; - is_succeed = sgfh.try_read_chunk( + is_succeed = saved_game.try_read_chunk( INT_ID('C', 'M', 'T', 'M'), fileTime); @@ -792,21 +792,21 @@ int SG_GetSaveGameComment( { size_t iScreenShotLength; - is_succeed = sgfh.try_read_chunk( + is_succeed = saved_game.try_read_chunk( INT_ID('S', 'H', 'L', 'N'), iScreenShotLength); } if (is_succeed) { - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'H', 'O', 'T')); } #endif if (is_succeed) { - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('M', 'P', 'C', 'M'), sMapName, iSG_MAPCMD_SIZE); @@ -845,14 +845,14 @@ static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest) { qboolean bReturn = qfalse; - ojk::SavedGameFileHelper sgfh( - &ojk::SavedGameFile::get_instance()); + ojk::SavedGameHelper saved_game( + &ojk::SavedGame::get_instance()); // get JPG screenshot data length... // size_t iScreenShotLength = 0; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'H', 'L', 'N'), iScreenShotLength); @@ -863,7 +863,7 @@ static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest) // // now read the JPG data... // - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'H', 'O', 'T'), pJPGData, static_cast(iScreenShotLength)); @@ -906,20 +906,20 @@ qboolean SG_GetSaveImage(const char *psPathlessBaseName, void *pvAddress) return qfalse; } - auto& saved_game = ojk::SavedGameFile::get_instance(); + auto& saved_game = ojk::SavedGame::get_instance(); if (!saved_game.open(psPathlessBaseName)) { return qfalse; } - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( &saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('C', 'O', 'M', 'M')); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('C', 'M', 'T', 'M')); auto bGotSaveImage = SG_ReadScreenshot( @@ -934,8 +934,8 @@ qboolean SG_GetSaveImage(const char *psPathlessBaseName, void *pvAddress) static void SG_WriteScreenshot(qboolean qbAutosave, const char *psMapName) { - ojk::SavedGameFileHelper sgfh( - &ojk::SavedGameFile::get_instance()); + ojk::SavedGameHelper saved_game( + &ojk::SavedGame::get_instance()); byte *pbRawScreenShot = NULL; byte *byBlank = NULL; @@ -981,11 +981,11 @@ static void SG_WriteScreenshot(qboolean qbAutosave, const char *psMapName) if ( qbAutosave ) delete[] byBlank; - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S','H','L','N'), iJPGDataSize); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S','H','O','T'), pJPGData, static_cast(iJPGDataSize)); @@ -1053,7 +1053,7 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) SG_StoreSaveGameComment(va("--> %s <--",psMapName)); } - auto& saved_game = ojk::SavedGameFile::get_instance(); + auto& saved_game = ojk::SavedGame::get_instance(); if(!saved_game.create( "current" )) { @@ -1064,7 +1064,7 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) } //END JLF - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( &saved_game); char sMapCmd[iSG_MAPCMD_SIZE]={0}; @@ -1075,7 +1075,7 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) SG_WriteScreenshot(qbAutosave, sMapCmd); #endif - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('M', 'P', 'C', 'M'), sMapCmd); @@ -1087,11 +1087,11 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) // if (!qbAutosave) { - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'I', 'M', 'E'), ::sv.time); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'I', 'M', 'R'), ::sv.timeResidual); @@ -1112,7 +1112,7 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) return qfalse; } - ojk::SavedGameFile::rename( + ojk::SavedGame::rename( "current", psPathlessBaseName); @@ -1132,9 +1132,9 @@ qboolean SG_ReadSavegame( "0"); #endif - auto& saved_game = ojk::SavedGameFile::get_instance(); + auto& saved_game = ojk::SavedGame::get_instance(); - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( &saved_game); const auto iPrevTestSave = ::sv_testsave->integer; @@ -1177,7 +1177,7 @@ qboolean SG_ReadSavegame( // Read in all the server data... // - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('C', 'O', 'M', 'M'), sComment); @@ -1185,7 +1185,7 @@ qboolean SG_ReadSavegame( "Reading: %s\n", sComment); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('C', 'M', 'T', 'M')); #ifdef JK2_MODE @@ -1193,7 +1193,7 @@ qboolean SG_ReadSavegame( qtrue); #endif - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('M', 'P', 'C', 'M'), sMapCmd); @@ -1214,11 +1214,11 @@ qboolean SG_ReadSavegame( // if (!qbAutosave) { - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'I', 'M', 'E'), ::sv.time); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'I', 'M', 'R'), ::sv.timeResidual); diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index 0ca1e912ea..bab258d6b5 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -28,7 +28,7 @@ along with this program; if not, see . #include "../../code/client/vmachine.h" #include "../../code/qcommon/sstring.h" -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char, std::less, std::allocator< unsigned char > > namePrecache_m; @@ -1640,28 +1640,28 @@ Ghoul2 Insert End void CG_WriteTheEvilCGHackStuff(void) { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('F', 'P', 'S', 'L'), ::cg.forcepowerSelect); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('I', 'V', 'S', 'L'), ::cg.inventorySelect); } void CG_ReadTheEvilCGHackStuff(void) { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('F', 'P', 'S', 'L'), ::gi_cg_forcepowerSelect); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('I', 'V', 'S', 'L'), ::gi_cg_inventorySelect); diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index d450eadbc9..c56ca0fb63 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -233,9 +233,9 @@ set(JK2SPGameCommonFiles "${SPDir}/qcommon/q_shared.h" "${SPDir}/qcommon/strippublic.h" "${SPDir}/rd-common/mdx_format.h" - "${SharedDir}/qcommon/ojk_i_saved_game_file.h" - "${SharedDir}/qcommon/ojk_saved_game_file_helper.h" - "${SharedDir}/qcommon/ojk_saved_game_file_helper_fwd.h" + "${SharedDir}/qcommon/ojk_i_saved_game.h" + "${SharedDir}/qcommon/ojk_saved_game_helper.h" + "${SharedDir}/qcommon/ojk_saved_game_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) diff --git a/codeJK2/game/G_Timer.cpp b/codeJK2/game/G_Timer.cpp index 855b932974..5b95ee171d 100644 --- a/codeJK2/game/G_Timer.cpp +++ b/codeJK2/game/G_Timer.cpp @@ -23,7 +23,7 @@ along with this program; if not, see . #include "g_local.h" #include "../../code/Rufl/hstring.h" -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" #define MAX_GTIMERS 16384 @@ -165,7 +165,7 @@ void TIMER_Save( void ) int j; gentity_t *ent; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); for ( j = 0, ent = &g_entities[0]; j < MAX_GENTITIES; j++, ent++ ) @@ -181,7 +181,7 @@ void TIMER_Save( void ) } //Write out the timer information - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'I', 'M', 'E'), numTimers); @@ -197,17 +197,17 @@ void TIMER_Save( void ) assert( length < 1024 );//This will cause problems when loading the timer if longer //Write out the string size and data - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'S', 'L', 'N'), length); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'S', 'N', 'M'), timerID, length); //Write out the timer data - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'D', 'T', 'A'), time); @@ -227,14 +227,14 @@ void TIMER_Load( void ) int j; gentity_t *ent; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); for ( j = 0, ent = &g_entities[0]; j < MAX_GENTITIES; j++, ent++ ) { int numTimers; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'I', 'M', 'E'), numTimers); @@ -250,7 +250,7 @@ void TIMER_Load( void ) assert (sizeof(g_timers[0]->time) == sizeof(time) );//make sure we're reading the same size as we wrote - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'S', 'L', 'N'), length); @@ -260,14 +260,14 @@ void TIMER_Load( void ) } //Read the id and time - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'S', 'N', 'M'), tempBuffer, length); tempBuffer[length] = '\0'; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'D', 'T', 'A'), time); diff --git a/codeJK2/game/Q3_Registers.cpp b/codeJK2/game/Q3_Registers.cpp index 10b4109fba..760632c8bf 100644 --- a/codeJK2/game/Q3_Registers.cpp +++ b/codeJK2/game/Q3_Registers.cpp @@ -24,7 +24,7 @@ along with this program; if not, see . #include "g_local.h" #include "Q3_Registers.h" -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" extern void Q3_DebugPrint( int level, const char *format, ... ); @@ -290,10 +290,10 @@ void Q3_VariableSaveFloats( varFloat_m &fmap ) { int numFloats = fmap.size(); - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('F', 'V', 'A', 'R'), numFloats); @@ -304,17 +304,17 @@ void Q3_VariableSaveFloats( varFloat_m &fmap ) int idSize = strlen( ((*vfi).first).c_str() ); //Save out the real data - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('F', 'I', 'D', 'L'), idSize); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('F', 'I', 'D', 'S'), ((*vfi).first).c_str(), idSize); //Save out the float value - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('F', 'V', 'A', 'L'), (*vfi).second); } @@ -330,10 +330,10 @@ void Q3_VariableSaveStrings( varString_m &smap ) { int numStrings = smap.size(); - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'V', 'A', 'R'), numStrings); @@ -344,11 +344,11 @@ void Q3_VariableSaveStrings( varString_m &smap ) int idSize = strlen( ((*vsi).first).c_str() ); //Save out the real data - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'I', 'D', 'L'), idSize); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'I', 'D', 'S'), ((*vsi).first).c_str(), idSize); @@ -356,11 +356,11 @@ void Q3_VariableSaveStrings( varString_m &smap ) //Save out the string value idSize = strlen( ((*vsi).second).c_str() ); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'V', 'S', 'Z'), idSize); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'V', 'A', 'L'), ((*vsi).second).c_str(), idSize); @@ -393,10 +393,10 @@ void Q3_VariableLoadFloats( varFloat_m &fmap ) int numFloats; char tempBuffer[1024]; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('F', 'V', 'A', 'R'), numFloats); @@ -404,11 +404,11 @@ void Q3_VariableLoadFloats( varFloat_m &fmap ) { int idSize; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('F', 'I', 'D', 'L'), idSize); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('F', 'I', 'D', 'S'), tempBuffer, idSize); @@ -417,7 +417,7 @@ void Q3_VariableLoadFloats( varFloat_m &fmap ) float val; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('F', 'V', 'A', 'L'), val); @@ -438,10 +438,10 @@ void Q3_VariableLoadStrings( int type, varString_m &fmap ) char tempBuffer[1024]; char tempBuffer2[1024]; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'V', 'A', 'R'), numFloats); @@ -449,22 +449,22 @@ void Q3_VariableLoadStrings( int type, varString_m &fmap ) { int idSize; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'I', 'D', 'L'), idSize); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'I', 'D', 'S'), tempBuffer, idSize); tempBuffer[ idSize ] = 0; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'V', 'S', 'Z'), idSize); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'V', 'A', 'L'), tempBuffer2, idSize); diff --git a/codeJK2/game/ai.h b/codeJK2/game/ai.h index 746ec904bd..337cfc0f11 100644 --- a/codeJK2/game/ai.h +++ b/codeJK2/game/ai.h @@ -115,7 +115,7 @@ class AIGroupMember_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(number); saved_game.write(waypoint); @@ -124,7 +124,7 @@ class AIGroupMember_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(number); saved_game.read(waypoint); @@ -158,7 +158,7 @@ class AIGroupInfo_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(numGroup); saved_game.write(processed); @@ -180,7 +180,7 @@ class AIGroupInfo_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(numGroup); saved_game.read(processed); diff --git a/codeJK2/game/anims.h b/codeJK2/game/anims.h index 7cbd679a91..c941430981 100644 --- a/codeJK2/game/anims.h +++ b/codeJK2/game/anims.h @@ -1410,7 +1410,7 @@ class animFileSet_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(filename); saved_game.write<>(animations); @@ -1420,7 +1420,7 @@ class animFileSet_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(filename); saved_game.read<>(animations); diff --git a/codeJK2/game/b_public.h b/codeJK2/game/b_public.h index 9256b41b07..b0a73b18b9 100644 --- a/codeJK2/game/b_public.h +++ b/codeJK2/game/b_public.h @@ -140,7 +140,7 @@ class gNPCstats_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(aggression); saved_game.write(aim); @@ -163,7 +163,7 @@ class gNPCstats_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(aggression); saved_game.read(aim); @@ -346,7 +346,7 @@ class gNPC_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(timeOfDeath); saved_game.write(touchedByPlayer); @@ -451,7 +451,7 @@ class gNPC_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(timeOfDeath); saved_game.read(touchedByPlayer); diff --git a/codeJK2/game/bg_public.h b/codeJK2/game/bg_public.h index 74b30e2285..50bba4099f 100644 --- a/codeJK2/game/bg_public.h +++ b/codeJK2/game/bg_public.h @@ -452,7 +452,7 @@ class animation_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(firstFrame); saved_game.write(numFrames); @@ -462,7 +462,7 @@ class animation_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(firstFrame); saved_game.read(numFrames); @@ -483,7 +483,7 @@ typedef struct animsounds_s void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(keyFrame); saved_game.write(soundIndex); @@ -492,7 +492,7 @@ typedef struct animsounds_s } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(keyFrame); saved_game.read(soundIndex); diff --git a/codeJK2/game/g_local.h b/codeJK2/game/g_local.h index 9156fcced8..0e5d78e530 100644 --- a/codeJK2/game/g_local.h +++ b/codeJK2/game/g_local.h @@ -144,7 +144,7 @@ class alertEvent_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(position); saved_game.write(radius); @@ -158,7 +158,7 @@ class alertEvent_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(position); saved_game.read(radius); @@ -249,7 +249,7 @@ class level_locals_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(clients); saved_game.write(maxclients); @@ -271,7 +271,7 @@ class level_locals_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(clients); saved_game.read(maxclients); diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp index 1196bb8f83..1b19c4bb94 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -35,7 +35,7 @@ along with this program; if not, see . #include "objectives.h" #include "../cgame/cg_local.h" // yeah I know this is naughty, but we're shipping soon... #include "time.h" -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" extern CNavigator navigator; @@ -90,20 +90,20 @@ qboolean PInUse2(gentity_t *ent) void WriteInUseBits() { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('I', 'N', 'U', 'S'), ::g_entityInUseBits); } void ReadInUseBits() { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('I', 'N', 'U', 'S'), ::g_entityInUseBits); @@ -1489,10 +1489,10 @@ extern qboolean player_locked; void G_LoadSave_WriteMiscData(void) { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('L', 'C', 'K', 'D'), ::player_locked); } @@ -1501,10 +1501,10 @@ void G_LoadSave_WriteMiscData(void) void G_LoadSave_ReadMiscData(void) { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('L', 'C', 'K', 'D'), ::player_locked); } diff --git a/codeJK2/game/g_objectives.cpp b/codeJK2/game/g_objectives.cpp index 52629b85ac..34e258b34a 100644 --- a/codeJK2/game/g_objectives.cpp +++ b/codeJK2/game/g_objectives.cpp @@ -31,7 +31,7 @@ along with this program; if not, see . #define G_OBJECTIVES_CPP #include "objectives.h" -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" qboolean missionInfo_Updated; @@ -62,10 +62,10 @@ OBJ_SaveMissionObjectives */ void OBJ_SaveMissionObjectives( gclient_t *client ) { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('O', 'B', 'J', 'T'), client->sess.mission_objectives); } @@ -92,10 +92,10 @@ OBJ_LoadMissionObjectives */ void OBJ_LoadMissionObjectives( gclient_t *client ) { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('O', 'B', 'J', 'T'), client->sess.mission_objectives); } diff --git a/codeJK2/game/g_public.h b/codeJK2/game/g_public.h index 224af073f0..e5e331300d 100644 --- a/codeJK2/game/g_public.h +++ b/codeJK2/game/g_public.h @@ -174,7 +174,7 @@ typedef struct { // Savegame handling // - ojk::ISavedGameFile* saved_game; + ojk::ISavedGame* saved_game; // add commands to the console as if they were typed in // for map changing, etc diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp index fcdde07e9f..72aa98162d 100644 --- a/codeJK2/game/g_roff.cpp +++ b/codeJK2/game/g_roff.cpp @@ -25,7 +25,7 @@ along with this program; if not, see . #include "g_local.h" #include "g_roff.h" #include "g_icarus.h" -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" // The list of precached ROFFs roff_list_t roffs[MAX_ROFFS]; @@ -626,11 +626,11 @@ void G_SaveCachedRoffs() { int i, len; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); // Write out the number of cached ROFFs - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('R', 'O', 'F', 'F'), ::num_roffs); @@ -640,11 +640,11 @@ void G_SaveCachedRoffs() // Dump out the string length to make things a bit easier on the other end...heh heh. len = strlen( roffs[i].fileName ) + 1; - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'L', 'E', 'N'), len); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('R', 'S', 'T', 'R'), ::roffs[i].fileName, len); @@ -663,22 +663,22 @@ void G_LoadCachedRoffs() int i, count, len; char buffer[MAX_QPATH]; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); // Get the count of goodies we need to revive - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('R', 'O', 'F', 'F'), count); // Now bring 'em back to life for ( i = 0; i < count; i++ ) { - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'L', 'E', 'N'), len); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('R', 'S', 'T', 'R'), buffer, len); diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index f5cb58df23..cd0ee509d0 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -33,7 +33,7 @@ along with this program; if not, see . #include "../cgame/cg_camera.h" #include "g_icarus.h" #include "../../code/qcommon/sstring.h" -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" extern void OBJ_LoadTacticalInfo(void); @@ -184,10 +184,10 @@ char *GetStringPtr(int iStrlen, char *psOriginal/*may be NULL*/) assert(iStrlen+1<=(int)sizeof(sString)); - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'T', 'R', 'G'), sString, iStrlen); @@ -470,24 +470,24 @@ static void EnumerateFields( } } - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); // save out raw data... // - sgfh.reset_buffer(); + saved_game.reset_buffer(); src_instance->sg_export( - sgfh); + saved_game); - sgfh.write_chunk( + saved_game.write_chunk( ulChid); // save out any associated strings.. // for (const auto& it : strList) { - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'T', 'R', 'G'), it.c_str(), static_cast(it.length() + 1)); @@ -601,10 +601,10 @@ static void EvaluateFields( T* pbOriginalRefData, unsigned int ulChid) { - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - if (!sgfh.try_read_chunk( + if (!saved_game.try_read_chunk( ulChid, *pbData)) { @@ -678,10 +678,10 @@ static void WriteGEntities(qboolean qbAutosave) } } - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('N', 'M', 'E', 'D'), iCount); @@ -691,7 +691,7 @@ static void WriteGEntities(qboolean qbAutosave) if ( ent->inuse) { - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('E', 'D', 'N', 'M'), i); @@ -724,7 +724,7 @@ static void WriteGEntities(qboolean qbAutosave) if (tempEnt.parms) { - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('P', 'A', 'R', 'M'), *ent->parms); } @@ -750,7 +750,7 @@ static void WriteGEntities(qboolean qbAutosave) // static int iBlah = 1234; - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('I', 'C', 'O', 'K'), iBlah); } @@ -765,10 +765,10 @@ static void ReadGEntities(qboolean qbAutosave) int iCount; int i; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('N', 'M', 'E', 'D'), iCount); @@ -777,7 +777,7 @@ static void ReadGEntities(qboolean qbAutosave) { int iEntIndex; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('E', 'D', 'N', 'M'), iEntIndex); @@ -879,7 +879,7 @@ static void ReadGEntities(qboolean qbAutosave) { parms_t tempParms; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('P', 'A', 'R', 'M'), tempParms); @@ -908,11 +908,11 @@ static void ReadGEntities(qboolean qbAutosave) { #ifdef JK2_MODE // Skip GL2 data size - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('G', 'L', '2', 'S')); #endif // JK2_MODE - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('G', 'H', 'L', '2')); gi.G2API_LoadGhoul2Models( @@ -977,7 +977,7 @@ static void ReadGEntities(qboolean qbAutosave) // static int iBlah = 1234; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('I', 'C', 'O', 'K'), iBlah); } @@ -1016,10 +1016,10 @@ void WriteLevel(qboolean qbAutosave) // static int iDONE = 1234; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('D', 'O', 'N', 'E'), iDONE); } @@ -1044,10 +1044,10 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) EvaluateFields(savefields_gClient, &junkClient, &level.clients[0], INT_ID('G','C','L','I')); //Read & throw away objective info - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('O', 'B', 'J', 'T')); ReadLevelLocals(); // level_locals_t level @@ -1082,10 +1082,10 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) // static int iDONE = 1234; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( ::gi.saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('D', 'O', 'N', 'E'), iDONE); } diff --git a/codeJK2/game/g_shared.h b/codeJK2/game/g_shared.h index c84d2927c0..5c07ce7d3d 100644 --- a/codeJK2/game/g_shared.h +++ b/codeJK2/game/g_shared.h @@ -154,7 +154,7 @@ class clientInfo_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(infoValid); saved_game.write(name); @@ -177,7 +177,7 @@ class clientInfo_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(infoValid); saved_game.read(name); @@ -221,7 +221,7 @@ typedef struct modelInfo_s void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(modelIndex); saved_game.write(customRGB); @@ -229,7 +229,7 @@ typedef struct modelInfo_s } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(modelIndex); saved_game.read(customRGB); @@ -336,7 +336,7 @@ class renderInfo_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write<>(legsModel); saved_game.write(legsModelName); @@ -388,7 +388,7 @@ class renderInfo_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read<>(legsModel); saved_game.read(legsModelName); @@ -485,7 +485,7 @@ class playerTeamState_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(state); saved_game.write(captures); @@ -501,7 +501,7 @@ class playerTeamState_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(state); saved_game.read(captures); @@ -526,14 +526,14 @@ class objectives_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(display); saved_game.write(status); } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(display); saved_game.read(status); @@ -562,7 +562,7 @@ class missionStats_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(secretsFound); saved_game.write(totalSecrets); @@ -581,7 +581,7 @@ class missionStats_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(secretsFound); saved_game.read(totalSecrets); @@ -621,7 +621,7 @@ class clientSession_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(missionObjectivesShown); saved_game.write(sessionTeam); @@ -630,7 +630,7 @@ class clientSession_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(missionObjectivesShown); saved_game.read(sessionTeam); @@ -657,7 +657,7 @@ class clientPersistant_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(connected); saved_game.write<>(lastCommand); @@ -672,7 +672,7 @@ class clientPersistant_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(connected); saved_game.read<>(lastCommand); @@ -804,7 +804,7 @@ class gclient_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write<>(ps); saved_game.write<>(pers); @@ -866,7 +866,7 @@ class gclient_t } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read<>(ps); saved_game.read<>(pers); @@ -938,13 +938,13 @@ class parms_t void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write(parm); } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read(parm); } @@ -1266,7 +1266,7 @@ Ghoul2 Insert End void sg_export( - ojk::SavedGameFileHelper& saved_game) const + ojk::SavedGameHelper& saved_game) const { saved_game.write<>(s); saved_game.write(client); @@ -1447,7 +1447,7 @@ Ghoul2 Insert End } void sg_import( - ojk::SavedGameFileHelper& saved_game) + ojk::SavedGameHelper& saved_game) { saved_game.read<>(s); saved_game.read(client); diff --git a/codeJK2/icarus/Instance.cpp b/codeJK2/icarus/Instance.cpp index 463e09525c..a3b4ebe498 100644 --- a/codeJK2/icarus/Instance.cpp +++ b/codeJK2/icarus/Instance.cpp @@ -29,7 +29,7 @@ along with this program; if not, see . #include "instance.h" #include -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" // Instance @@ -304,10 +304,10 @@ int ICARUS_Instance::SaveSequenceIDTable( void ) //Save out the number of sequences to follow int numSequences = m_sequences.size(); - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( m_interface->saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('#', 'S', 'E', 'Q'), numSequences); @@ -326,7 +326,7 @@ int ICARUS_Instance::SaveSequenceIDTable( void ) idTable[itr++] = (*sqi)->GetID(); } - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'Q', 'T', 'B'), idTable, numSequences); @@ -368,10 +368,10 @@ int ICARUS_Instance::SaveSequencers( void ) //Save out the number of sequences to follow int numSequencers = m_sequencers.size(); - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( m_interface->saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('#', 'S', 'Q', 'R'), numSequencers); @@ -395,10 +395,10 @@ int ICARUS_Instance::SaveSignals( void ) { int numSignals = m_signals.size(); - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( m_interface->saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('I', 'S', 'I', 'G'), numSignals); @@ -414,12 +414,12 @@ int ICARUS_Instance::SaveSignals( void ) int length = strlen( name ) + 1; //Save out the string size - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'I', 'G', '#'), length); //Write out the string - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'I', 'G', 'N'), name, length); @@ -439,10 +439,10 @@ int ICARUS_Instance::Save( void ) //Save out a ICARUS save block header with the ICARUS version double version = ICARUS_VERSION; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( m_interface->saved_game); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('I', 'C', 'A', 'R'), version); @@ -458,7 +458,7 @@ int ICARUS_Instance::Save( void ) if ( SaveSequencers() == false ) return false; - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('I', 'E', 'N', 'D'), version); @@ -475,10 +475,10 @@ int ICARUS_Instance::LoadSignals( void ) { int numSignals; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( m_interface->saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('I', 'S', 'I', 'G'), numSignals); @@ -488,14 +488,14 @@ int ICARUS_Instance::LoadSignals( void ) int length; //Get the size of the string - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'I', 'G', '#'), length); assert( length < (int)sizeof( buffer ) ); //Get the string - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'I', 'G', 'N'), buffer, length); @@ -538,11 +538,11 @@ int ICARUS_Instance::LoadSequences( void ) CSequence *sequence; int numSequences; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( m_interface->saved_game); //Get the number of sequences to read in - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('#', 'S', 'E', 'Q'), numSequences); @@ -552,7 +552,7 @@ int ICARUS_Instance::LoadSequences( void ) return false; //Load the sequencer ID table - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'Q', 'T', 'B'), idTable, numSequences); @@ -590,11 +590,11 @@ int ICARUS_Instance::LoadSequencers( void ) CSequencer *sequencer; int numSequencers; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( m_interface->saved_game); //Get the number of sequencers to load - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('#', 'S', 'Q', 'R'), numSequencers); @@ -626,10 +626,10 @@ int ICARUS_Instance::Load( void ) //Check to make sure we're at the ICARUS save block double version; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( m_interface->saved_game); - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('I', 'C', 'A', 'R'), version); @@ -661,7 +661,7 @@ int ICARUS_Instance::Load( void ) return false; } - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('I', 'E', 'N', 'D'), version); diff --git a/codeJK2/icarus/Sequence.cpp b/codeJK2/icarus/Sequence.cpp index 0267997c9e..ba43675912 100644 --- a/codeJK2/icarus/Sequence.cpp +++ b/codeJK2/icarus/Sequence.cpp @@ -28,7 +28,7 @@ along with this program; if not, see . #include "icarus.h" #include -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" CSequence::CSequence( void ) { @@ -343,27 +343,27 @@ int CSequence::SaveCommand( CBlock *block ) int numMembers, bID, size; CBlockMember *bm; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( m_owner->GetInterface()->saved_game); //Save out the block ID bID = block->GetBlockID(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('B', 'L', 'I', 'D'), bID); //Save out the block's flags flags = block->GetFlags(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('B', 'F', 'L', 'G'), flags); //Save out the number of members to read numMembers = block->GetNumMembers(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('B', 'N', 'U', 'M'), numMembers); @@ -374,21 +374,21 @@ int CSequence::SaveCommand( CBlock *block ) //Save the block id bID = bm->GetID(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('B', 'M', 'I', 'D'), bID); //Save out the data size size = bm->GetSize(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('B', 'S', 'I', 'Z'), size); //Save out the raw data auto raw_data = static_cast(bm->GetData()); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('B', 'M', 'E', 'M'), raw_data, size); @@ -409,25 +409,25 @@ int CSequence::Save( void ) block_l::iterator bi; int id; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( m_owner->GetInterface()->saved_game); //Save the parent (by GUID) id = ( m_parent != NULL ) ? m_parent->GetID() : -1; - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'P', 'I', 'D'), id); //Save the return (by GUID) id = ( m_return != NULL ) ? m_return->GetID() : -1; - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'R', 'I', 'D'), id); //Save the number of children - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'N', 'C', 'H'), m_numChildren); @@ -436,23 +436,23 @@ int CSequence::Save( void ) { id = (*ci)->GetID(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'C', 'H', 'D'), id); } //Save flags - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'F', 'L', 'G'), m_flags); //Save iterations - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'I', 'T', 'R'), m_iterations); //Save the number of commands - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'N', 'M', 'C'), m_numCommands); @@ -482,25 +482,25 @@ int CSequence::Load( void ) int bID, bSize; void *bData; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( m_owner->GetInterface()->saved_game); //Get the parent sequence - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'P', 'I', 'D'), id); m_parent = ( id != -1 ) ? m_owner->GetSequence( id ) : NULL; //Get the return sequence - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'R', 'I', 'D'), id); m_return = ( id != -1 ) ? m_owner->GetSequence( id ) : NULL; //Get the number of children - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'N', 'C', 'H'), m_numChildren); @@ -508,7 +508,7 @@ int CSequence::Load( void ) for ( i = 0; i < m_numChildren; i++ ) { //Get the child sequence ID - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'C', 'H', 'D'), id); @@ -525,19 +525,19 @@ int CSequence::Load( void ) //Get the sequence flags - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'F', 'L', 'G'), m_flags); //Get the number of iterations - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'I', 'T', 'R'), m_iterations); int numCommands; //Get the number of commands - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'N', 'M', 'C'), numCommands); @@ -545,7 +545,7 @@ int CSequence::Load( void ) for ( i = 0; i < numCommands; i++ ) { //Get the block ID and create a new container - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('B', 'L', 'I', 'D'), id); @@ -554,26 +554,26 @@ int CSequence::Load( void ) block->Create( id ); //Read the block's flags - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('B', 'F', 'L', 'G'), flags); block->SetFlags( flags ); //Get the number of block members - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('B', 'N', 'U', 'M'), numMembers); for ( int j = 0; j < numMembers; j++ ) { //Get the member ID - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('B', 'M', 'I', 'D'), bID); //Get the member size - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('B', 'S', 'I', 'Z'), bSize); @@ -582,7 +582,7 @@ int CSequence::Load( void ) return false; //Get the actual raw data - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('B', 'M', 'E', 'M'), static_cast(bData), bSize); diff --git a/codeJK2/icarus/Sequencer.cpp b/codeJK2/icarus/Sequencer.cpp index 487b7dcaa0..b8f6b2b303 100644 --- a/codeJK2/icarus/Sequencer.cpp +++ b/codeJK2/icarus/Sequencer.cpp @@ -30,7 +30,7 @@ along with this program; if not, see . #include "g_shared.h" #include "assert.h" -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" // Sequencer @@ -2332,16 +2332,16 @@ int CSequencer::Save( void ) //Get the number of sequences to save out numSequences = m_sequences.size(); - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( m_ie->saved_game); //Save out the owner sequence - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'Q', 'R', 'E'), m_ownerID); //Write out the number of sequences we need to read - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'Q', 'R', '#'), numSequences); @@ -2350,7 +2350,7 @@ int CSequencer::Save( void ) { id = (*si)->GetID(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'Q', 'R', 'I'), id); } @@ -2361,7 +2361,7 @@ int CSequencer::Save( void ) //Save out the task sequences mapping the name to the GUIDs numTasks = m_taskSequences.size(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'Q', 'T', '#'), numTasks); @@ -2370,33 +2370,33 @@ int CSequencer::Save( void ) //Save the task group's ID id = ((*ti).first)->GetGUID(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'T', 'I', 'D'), id); //Save the sequence's ID id = ((*ti).second)->GetID(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'S', 'I', 'D'), id); } int curGroupID = ( m_curGroup == NULL ) ? -1 : m_curGroup->GetGUID(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'Q', 'C', 'T'), curGroupID); //Output the number of commands - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'Q', '#', 'C'), m_numCommands); //FIXME: This can be reconstructed //Output the ID of the current sequence id = ( m_curSequence != NULL ) ? m_curSequence->GetID() : -1; - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('S', 'Q', 'C', 'S'), id); @@ -2413,11 +2413,11 @@ int CSequencer::Load( void ) { int i; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( m_ie->saved_game); //Get the owner of this sequencer - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'Q', 'R', 'E'), m_ownerID); @@ -2429,14 +2429,14 @@ int CSequencer::Load( void ) int numSequences, seqID, taskID, numTasks; //Get the number of sequences to read - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'Q', 'R', '#'), numSequences); //Read in all the sequences for ( i = 0; i < numSequences; i++ ) { - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'Q', 'R', 'I'), seqID); @@ -2455,7 +2455,7 @@ int CSequencer::Load( void ) m_taskManager->Load(); //Get the number of tasks in the map - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'Q', 'T', '#'), numTasks); @@ -2463,12 +2463,12 @@ int CSequencer::Load( void ) for ( i = 0; i < numTasks; i++ ) { //Read in the task's ID - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'T', 'I', 'D'), taskID); //Read in the sequence's ID - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'S', 'I', 'D'), seqID); @@ -2487,19 +2487,19 @@ int CSequencer::Load( void ) int curGroupID; //Get the current task group - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'Q', 'C', 'T'), curGroupID); m_curGroup = ( curGroupID == -1 ) ? NULL : m_taskManager->GetTaskGroup( curGroupID ); //Get the number of commands - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'Q', '#', 'C'), m_numCommands); //Get the current sequence - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('S', 'Q', 'C', 'S'), seqID); diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index b609738ea9..7a247ba780 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -31,7 +31,7 @@ along with this program; if not, see . #include -#include "qcommon/ojk_saved_game_file_helper.h" +#include "qcommon/ojk_saved_game_helper.h" #define ICARUS_VALIDATE(a) if ( a == false ) return TASK_FAILED; @@ -1640,27 +1640,27 @@ int CTaskManager::SaveCommand( CBlock *block ) int numMembers, bID, size; CBlockMember *bm; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( m_owner->GetInterface()->saved_game); //Save out the block ID bID = block->GetBlockID(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('B', 'L', 'I', 'D'), bID); //Save out the block's flags flags = block->GetFlags(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('B', 'F', 'L', 'G'), flags); //Save out the number of members to read numMembers = block->GetNumMembers(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('B', 'N', 'U', 'M'), numMembers); @@ -1671,21 +1671,21 @@ int CTaskManager::SaveCommand( CBlock *block ) //Save the block id bID = bm->GetID(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('B', 'M', 'I', 'D'), bID); //Save out the data size size = bm->GetSize(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('B', 'S', 'I', 'Z'), size); //Save out the raw data auto raw_data = static_cast(bm->GetData()); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('B', 'M', 'E', 'M'), raw_data, size); @@ -1710,18 +1710,18 @@ void CTaskManager::Save( void ) int id, numCommands; int numWritten; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( m_owner->GetInterface()->saved_game); //Save the taskmanager's GUID - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'M', 'I', 'D'), m_GUID); //FIXME: This can be reconstructed //Save out the number of tasks that will follow int iNumTasks = m_tasks.size(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'S', 'K', '#'), iNumTasks); @@ -1733,14 +1733,14 @@ void CTaskManager::Save( void ) //Save the GUID id = (*ti)->GetGUID(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'K', 'I', 'D'), id); //Save the timeStamp (FIXME: Although, this is going to be worthless if time is not consistent...) timeStamp = (*ti)->GetTimeStamp(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'K', 'T', 'S'), timeStamp); @@ -1752,7 +1752,7 @@ void CTaskManager::Save( void ) //Save out the number of task groups int numTaskGroups = m_taskGroups.size(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'G', '#', 'G'), numTaskGroups); @@ -1763,7 +1763,7 @@ void CTaskManager::Save( void ) { id = (*tgi)->GetGUID(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'K', 'G', '#'), id); @@ -1778,14 +1778,14 @@ void CTaskManager::Save( void ) //Save out the parent id = ( (*tgi)->GetParent() == NULL ) ? -1 : ((*tgi)->GetParent())->GetGUID(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'K', 'G', 'P'), id); //Save out the number of commands numCommands = (*tgi)->m_completedTasks.size(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'G', 'N', 'C'), numCommands); @@ -1797,14 +1797,14 @@ void CTaskManager::Save( void ) //Write out the ID id = (*tci).first; - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('G', 'M', 'I', 'D'), id); //Write out the state of completion completed = (*tci).second; - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('G', 'M', 'D', 'N'), completed); } @@ -1812,7 +1812,7 @@ void CTaskManager::Save( void ) //Save out the number of completed commands id = (*tgi)->m_numCompleted; - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'G', 'D', 'N'), id); //FIXME: This can be reconstructed @@ -1826,7 +1826,7 @@ void CTaskManager::Save( void ) //Save out the currently active group int curGroupID = ( m_curGroup == NULL ) ? -1 : m_curGroup->GetGUID(); - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'G', 'C', 'G'), curGroupID); } @@ -1844,12 +1844,12 @@ void CTaskManager::Save( void ) int length = strlen( name ) + 1; //Save out the string size - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'G', 'N', 'L'), length); //Write out the string - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'G', 'N', 'S'), name, length); @@ -1859,7 +1859,7 @@ void CTaskManager::Save( void ) id = taskGroup->GetGUID(); //Write out the ID - sgfh.write_chunk( + saved_game.write_chunk( INT_ID('T', 'G', 'N', 'I'), id); @@ -1887,16 +1887,16 @@ void CTaskManager::Load( void ) int bID, bSize; int i; - ojk::SavedGameFileHelper sgfh( + ojk::SavedGameHelper saved_game( m_owner->GetInterface()->saved_game); //Get the GUID - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'M', 'I', 'D'), m_GUID); //Get the number of tasks to follow - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'S', 'K', '#'), numTasks); @@ -1908,14 +1908,14 @@ void CTaskManager::Load( void ) assert( task ); //Get the GUID - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'K', 'I', 'D'), id); task->SetGUID( id ); //Get the time stamp - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'K', 'T', 'S'), timeStamp); @@ -1926,7 +1926,7 @@ void CTaskManager::Load( void ) // //Get the block ID and create a new container - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('B', 'L', 'I', 'D'), id); @@ -1935,26 +1935,26 @@ void CTaskManager::Load( void ) block->Create( id ); //Read the block's flags - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('B', 'F', 'L', 'G'), flags); block->SetFlags( flags ); //Get the number of block members - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('B', 'N', 'U', 'M'), numMembers); for ( int j = 0; j < numMembers; j++ ) { //Get the member ID - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('B', 'M', 'I', 'D'), bID); //Get the member size - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('B', 'S', 'I', 'Z'), bSize); @@ -1966,7 +1966,7 @@ void CTaskManager::Load( void ) } //Get the actual raw data - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('B', 'M', 'E', 'M'), static_cast(bData), bSize); @@ -2020,7 +2020,7 @@ void CTaskManager::Load( void ) //Load the task groups int numTaskGroups; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'G', '#', 'G'), numTaskGroups); @@ -2037,7 +2037,7 @@ void CTaskManager::Load( void ) assert( taskGroup ); //Get this task group's ID - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'K', 'G', '#'), taskIDs[i]); @@ -2055,7 +2055,7 @@ void CTaskManager::Load( void ) assert( taskGroup ); //Load the parent ID - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'K', 'G', 'P'), id); @@ -2063,7 +2063,7 @@ void CTaskManager::Load( void ) taskGroup->m_parent = ( GetTaskGroup( id ) != NULL ) ? GetTaskGroup( id ) : NULL; //Get the number of commands in this group - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'G', 'N', 'C'), numMembers); @@ -2071,12 +2071,12 @@ void CTaskManager::Load( void ) for ( int j = 0; j < numMembers; j++ ) { //Get the ID - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('G', 'M', 'I', 'D'), id); //Write out the state of completion - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('G', 'M', 'D', 'N'), completed); @@ -2085,7 +2085,7 @@ void CTaskManager::Load( void ) } //Get the number of completed tasks - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'G', 'D', 'N'), taskGroup->m_numCompleted); } @@ -2093,7 +2093,7 @@ void CTaskManager::Load( void ) //Reload the currently active group int curGroupID; - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'G', 'C', 'G'), curGroupID); @@ -2104,18 +2104,18 @@ void CTaskManager::Load( void ) int length; //Get the size of the string - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'G', 'N', 'L'), length); //Get the string - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'G', 'N', 'S'), name, length); //Get the id - sgfh.read_chunk( + saved_game.read_chunk( INT_ID('T', 'G', 'N', 'I'), id); diff --git a/codeJK2/icarus/interface.h b/codeJK2/icarus/interface.h index b04bf2652d..39cc91567a 100644 --- a/codeJK2/icarus/interface.h +++ b/codeJK2/icarus/interface.h @@ -85,7 +85,7 @@ typedef struct interface_export_s int (*I_ReadSaveData)( unsigned int chid, void *address, int length, void **addressptr/* = NULL */); int (*I_LinkEntity)( int entID, CSequencer *sequencer, CTaskManager *taskManager ); - ojk::ISavedGameFile* saved_game; + ojk::ISavedGame* saved_game; } interface_export_t; #endif //__INTERFACE__ diff --git a/shared/qcommon/ojk_i_saved_game_file.h b/shared/qcommon/ojk_i_saved_game.h similarity index 82% rename from shared/qcommon/ojk_i_saved_game_file.h rename to shared/qcommon/ojk_i_saved_game.h index 73f5b70093..f4d01409d9 100644 --- a/shared/qcommon/ojk_i_saved_game_file.h +++ b/shared/qcommon/ojk_i_saved_game.h @@ -1,10 +1,10 @@ // -// Saved game file interface. +// Saved game interface. // -#ifndef OJK_I_SAVED_GAME_FILE_INCLUDED -#define OJK_I_SAVED_GAME_FILE_INCLUDED +#ifndef OJK_I_SAVED_GAME_INCLUDED +#define OJK_I_SAVED_GAME_INCLUDED #include @@ -14,20 +14,20 @@ namespace ojk { -class ISavedGameFile +class ISavedGame { public: - ISavedGameFile() + ISavedGame() { } - ISavedGameFile( - const ISavedGameFile& that) = delete; + ISavedGame( + const ISavedGame& that) = delete; - ISavedGameFile& operator=( - const ISavedGameFile& that) = delete; + ISavedGame& operator=( + const ISavedGame& that) = delete; - virtual ~ISavedGameFile() + virtual ~ISavedGame() { } @@ -92,10 +92,10 @@ class ISavedGameFile // Calls Com_Error with last error message or with a generic one. virtual void throw_error() = 0; -}; // ISavedGameFile +}; // ISavedGame } // ojk -#endif // OJK_I_SAVED_GAME_FILE_INCLUDED +#endif // OJK_I_SAVED_GAME_INCLUDED diff --git a/shared/qcommon/ojk_saved_game_file.cpp b/shared/qcommon/ojk_saved_game.cpp similarity index 91% rename from shared/qcommon/ojk_saved_game_file.cpp rename to shared/qcommon/ojk_saved_game.cpp index aa8a9a7f7a..708fc2854c 100644 --- a/shared/qcommon/ojk_saved_game_file.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -1,10 +1,10 @@ // -// Saved game file. +// Saved game. // -#include "ojk_saved_game_file.h" -#include "ojk_saved_game_file_helper.h" +#include "ojk_saved_game.h" +#include "ojk_saved_game_helper.h" #include #include "qcommon/qcommon.h" #include "server/server.h" @@ -14,7 +14,7 @@ namespace ojk { -SavedGameFile::SavedGameFile() : +SavedGame::SavedGame() : error_message_(), file_handle_(), io_buffer_(), @@ -28,12 +28,12 @@ SavedGameFile::SavedGameFile() : { } -SavedGameFile::~SavedGameFile() +SavedGame::~SavedGame() { close(); } -bool SavedGameFile::open( +bool SavedGame::open( const std::string& base_file_name) { close(); @@ -70,12 +70,12 @@ bool SavedGameFile::open( if (is_succeed) { - SavedGameFileHelper sgfh( + SavedGameHelper saved_game( this); int sg_version = -1; - if (sgfh.try_read_chunk( + if (saved_game.try_read_chunk( INT_ID('_', 'V', 'E', 'R'), sg_version)) { @@ -107,7 +107,7 @@ bool SavedGameFile::open( return is_succeed; } -bool SavedGameFile::create( +bool SavedGame::create( const std::string& base_file_name) { close(); @@ -140,7 +140,7 @@ bool SavedGameFile::create( const auto sg_version = iSAVEGAME_VERSION; - SavedGameFileHelper sgsh(this); + SavedGameHelper sgsh(this); sgsh.write_chunk( INT_ID('_', 'V', 'E', 'R'), @@ -155,7 +155,7 @@ bool SavedGameFile::create( return true; } -void SavedGameFile::close() +void SavedGame::close() { if (file_handle_ != 0) { @@ -178,7 +178,7 @@ void SavedGameFile::close() is_failed_ = false; } -bool SavedGameFile::read_chunk( +bool SavedGame::read_chunk( const uint32_t chunk_id) { if (is_failed_) @@ -350,12 +350,12 @@ bool SavedGameFile::read_chunk( return true; } -bool SavedGameFile::is_all_data_read() const +bool SavedGame::is_all_data_read() const { return io_buffer_.size() == io_buffer_offset_; } -void SavedGameFile::ensure_all_data_read() +void SavedGame::ensure_all_data_read() { if (!is_all_data_read()) { @@ -365,7 +365,7 @@ void SavedGameFile::ensure_all_data_read() } } -bool SavedGameFile::write_chunk( +bool SavedGame::write_chunk( const uint32_t chunk_id) { if (is_failed_) @@ -539,7 +539,7 @@ bool SavedGameFile::write_chunk( return true; } -bool SavedGameFile::read( +bool SavedGame::read( void* dst_data, int dst_size) { @@ -591,7 +591,7 @@ bool SavedGameFile::read( return true; } -bool SavedGameFile::write( +bool SavedGame::write( const void* src_data, int src_size) { @@ -641,12 +641,12 @@ bool SavedGameFile::write( return true; } -bool SavedGameFile::is_failed() const +bool SavedGame::is_failed() const { return is_failed_; } -bool SavedGameFile::skip( +bool SavedGame::skip( int count) { if (is_failed_) @@ -699,29 +699,29 @@ bool SavedGameFile::skip( return true; } -void SavedGameFile::save_buffer() +void SavedGame::save_buffer() { saved_io_buffer_ = io_buffer_; saved_io_buffer_offset_ = io_buffer_offset_; } -void SavedGameFile::load_buffer() +void SavedGame::load_buffer() { io_buffer_ = saved_io_buffer_; io_buffer_offset_ = saved_io_buffer_offset_; } -const void* SavedGameFile::get_buffer_data() const +const void* SavedGame::get_buffer_data() const { return io_buffer_.data(); } -int SavedGameFile::get_buffer_size() const +int SavedGame::get_buffer_size() const { return static_cast(io_buffer_.size()); } -void SavedGameFile::rename( +void SavedGame::rename( const std::string& old_base_file_name, const std::string& new_base_file_name) { @@ -744,7 +744,7 @@ void SavedGameFile::rename( } } -void SavedGameFile::remove( +void SavedGame::remove( const std::string& base_file_name) { const auto&& path = generate_path( @@ -754,19 +754,19 @@ void SavedGameFile::remove( path.c_str()); } -SavedGameFile& SavedGameFile::get_instance() +SavedGame& SavedGame::get_instance() { - static SavedGameFile result; + static SavedGame result; return result; } -void SavedGameFile::clear_error() +void SavedGame::clear_error() { is_failed_ = false; error_message_.clear(); } -void SavedGameFile::throw_error() +void SavedGame::throw_error() { if (error_message_.empty()) { @@ -781,7 +781,7 @@ void SavedGameFile::throw_error() error_message_.c_str()); } -void SavedGameFile::compress( +void SavedGame::compress( const Buffer& src_buffer, Buffer& dst_buffer) { @@ -844,7 +844,7 @@ void SavedGameFile::compress( dst_index); } -void SavedGameFile::decompress( +void SavedGame::decompress( const Buffer& src_buffer, Buffer& dst_buffer) { @@ -884,7 +884,7 @@ void SavedGameFile::decompress( } } -std::string SavedGameFile::generate_path( +std::string SavedGame::generate_path( const std::string& base_file_name) { auto normalized_file_name = base_file_name; @@ -900,7 +900,7 @@ std::string SavedGameFile::generate_path( return path; } -std::string SavedGameFile::get_chunk_id_string( +std::string SavedGame::get_chunk_id_string( uint32_t chunk_id) { std::string result(4, '\0'); @@ -913,18 +913,18 @@ std::string SavedGameFile::get_chunk_id_string( return result; } -void SavedGameFile::reset_buffer() +void SavedGame::reset_buffer() { io_buffer_.clear(); reset_buffer_offset(); } -void SavedGameFile::reset_buffer_offset() +void SavedGame::reset_buffer_offset() { io_buffer_offset_ = 0; } -constexpr uint32_t SavedGameFile::get_jo_magic_value() +constexpr uint32_t SavedGame::get_jo_magic_value() { return 0x1234ABCD; } diff --git a/shared/qcommon/ojk_saved_game_file.h b/shared/qcommon/ojk_saved_game.h similarity index 88% rename from shared/qcommon/ojk_saved_game_file.h rename to shared/qcommon/ojk_saved_game.h index 1de9c97f26..543a8a5473 100644 --- a/shared/qcommon/ojk_saved_game_file.h +++ b/shared/qcommon/ojk_saved_game.h @@ -1,36 +1,35 @@ // -// Saved game file. -// (forward declaration) +// Saved game interface implementation. // -#ifndef OJK_SAVED_GAME_FILE_INCLUDED -#define OJK_SAVED_GAME_FILE_INCLUDED +#ifndef OJK_SAVED_GAME_INCLUDED +#define OJK_SAVED_GAME_INCLUDED #include #include #include -#include "ojk_i_saved_game_file.h" +#include "ojk_i_saved_game.h" namespace ojk { -class SavedGameFile : - public ISavedGameFile +class SavedGame : + public ISavedGame { public: - SavedGameFile(); + SavedGame(); - SavedGameFile( - const SavedGameFile& that) = delete; + SavedGame( + const SavedGame& that) = delete; - SavedGameFile& operator=( - const SavedGameFile& that) = delete; + SavedGame& operator=( + const SavedGame& that) = delete; - virtual ~SavedGameFile(); + virtual ~SavedGame(); // Creates a new saved game file for writing. @@ -125,7 +124,7 @@ class SavedGameFile : const std::string& base_file_name); // Returns a default instance of the class. - static SavedGameFile& get_instance(); + static SavedGame& get_instance(); private: @@ -185,10 +184,10 @@ class SavedGameFile : uint32_t chunk_id); static constexpr uint32_t get_jo_magic_value(); -}; // SavedGameFile +}; // SavedGame } // ojk -#endif // OJK_SAVED_GAME_FILE_INCLUDED +#endif // OJK_SAVED_GAME_INCLUDED diff --git a/shared/qcommon/ojk_saved_game_file_helper.h b/shared/qcommon/ojk_saved_game_helper.h similarity index 79% rename from shared/qcommon/ojk_saved_game_file_helper.h rename to shared/qcommon/ojk_saved_game_helper.h index 4ee969716b..1b3cc2ad1d 100644 --- a/shared/qcommon/ojk_saved_game_file_helper.h +++ b/shared/qcommon/ojk_saved_game_helper.h @@ -1,15 +1,15 @@ // -// Saved game file helper. +// Saved game helper. // -#ifndef OJK_SAVED_GAME_FILE_HELPER_INCLUDED -#define OJK_SAVED_GAME_FILE_HELPER_INCLUDED +#ifndef OJK_SAVED_GAME_HELPER_INCLUDED +#define OJK_SAVED_GAME_HELPER_INCLUDED #include #include -#include "ojk_saved_game_file_helper_fwd.h" +#include "ojk_saved_game_helper_fwd.h" #include "ojk_scope_guard.h" @@ -20,9 +20,9 @@ namespace ojk // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // Class stuff -inline SavedGameFileHelper::SavedGameFileHelper( - ISavedGameFile* saved_game_file) : - saved_game_file_(saved_game_file) +inline SavedGameHelper::SavedGameHelper( + ISavedGame* saved_game) : + saved_game_(saved_game) { } @@ -33,64 +33,64 @@ inline SavedGameFileHelper::SavedGameFileHelper( // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // Public methods -inline void SavedGameFileHelper::read_chunk( +inline void SavedGameHelper::read_chunk( const uint32_t chunk_id) { - if (!saved_game_file_->read_chunk( + if (!saved_game_->read_chunk( chunk_id)) { - saved_game_file_->throw_error(); + saved_game_->throw_error(); } } -inline void SavedGameFileHelper::write_chunk( +inline void SavedGameHelper::write_chunk( const uint32_t chunk_id) { - if (!saved_game_file_->write_chunk( + if (!saved_game_->write_chunk( chunk_id)) { - saved_game_file_->throw_error(); + saved_game_->throw_error(); } } -inline void SavedGameFileHelper::skip( +inline void SavedGameHelper::skip( int count) { - if (!saved_game_file_->skip( + if (!saved_game_->skip( count)) { - saved_game_file_->throw_error(); + saved_game_->throw_error(); } } -inline const void* SavedGameFileHelper::get_buffer_data() +inline const void* SavedGameHelper::get_buffer_data() { - return saved_game_file_->get_buffer_data(); + return saved_game_->get_buffer_data(); } -inline int SavedGameFileHelper::get_buffer_size() const +inline int SavedGameHelper::get_buffer_size() const { - return saved_game_file_->get_buffer_size(); + return saved_game_->get_buffer_size(); } -inline void SavedGameFileHelper::reset_buffer() +inline void SavedGameHelper::reset_buffer() { - saved_game_file_->reset_buffer(); + saved_game_->reset_buffer(); } -inline void SavedGameFileHelper::reset_buffer_offset() +inline void SavedGameHelper::reset_buffer_offset() { - saved_game_file_->reset_buffer_offset(); + saved_game_->reset_buffer_offset(); } -inline void SavedGameFileHelper::ensure_all_data_read() +inline void SavedGameHelper::ensure_all_data_read() { - saved_game_file_->ensure_all_data_read(); + saved_game_->ensure_all_data_read(); } -inline bool SavedGameFileHelper::is_failed() const +inline bool SavedGameHelper::is_failed() const { - return saved_game_file_->is_failed(); + return saved_game_->is_failed(); } // Public methods @@ -101,11 +101,11 @@ inline bool SavedGameFileHelper::is_failed() const // try_read_chunk template -bool SavedGameFileHelper::try_read_chunk( +bool SavedGameHelper::try_read_chunk( const uint32_t chunk_id, TDst& dst_value) { - if (!saved_game_file_->read_chunk( + if (!saved_game_->read_chunk( chunk_id)) { return false; @@ -117,16 +117,16 @@ bool SavedGameFileHelper::try_read_chunk( return false; } - return saved_game_file_->is_all_data_read(); + return saved_game_->is_all_data_read(); } template -bool SavedGameFileHelper::try_read_chunk( +bool SavedGameHelper::try_read_chunk( const uint32_t chunk_id, TDst* dst_values, int dst_count) { - if (!saved_game_file_->read_chunk( + if (!saved_game_->read_chunk( chunk_id)) { return false; @@ -139,7 +139,7 @@ bool SavedGameFileHelper::try_read_chunk( return false; } - return saved_game_file_->is_all_data_read(); + return saved_game_->is_all_data_read(); } // try_read_chunk @@ -150,7 +150,7 @@ bool SavedGameFileHelper::try_read_chunk( // read_chunk template -void SavedGameFileHelper::read_chunk( +void SavedGameHelper::read_chunk( const uint32_t chunk_id, TDst& dst_value) { @@ -158,12 +158,12 @@ void SavedGameFileHelper::read_chunk( chunk_id, dst_value)) { - saved_game_file_->throw_error(); + saved_game_->throw_error(); } } template -void SavedGameFileHelper::read_chunk( +void SavedGameHelper::read_chunk( const uint32_t chunk_id, TDst* dst_values, int dst_count) @@ -173,7 +173,7 @@ void SavedGameFileHelper::read_chunk( dst_values, dst_count)) { - saved_game_file_->throw_error(); + saved_game_->throw_error(); } } @@ -185,53 +185,53 @@ void SavedGameFileHelper::read_chunk( // write_chunk template -void SavedGameFileHelper::write_chunk_and_size( +void SavedGameHelper::write_chunk_and_size( const uint32_t size_chunk_id, const uint32_t data_chunk_id) { - saved_game_file_->save_buffer(); + saved_game_->save_buffer(); - auto data_size = saved_game_file_->get_buffer_size(); + auto data_size = saved_game_->get_buffer_size(); - saved_game_file_->reset_buffer(); + saved_game_->reset_buffer(); write_chunk( size_chunk_id, data_size); - saved_game_file_->load_buffer(); + saved_game_->load_buffer(); - saved_game_file_->write_chunk( + saved_game_->write_chunk( data_chunk_id); } template -void SavedGameFileHelper::write_chunk( +void SavedGameHelper::write_chunk( const uint32_t chunk_id, const TSrc& src_value) { - saved_game_file_->reset_buffer(); + saved_game_->reset_buffer(); write( src_value); - saved_game_file_->write_chunk( + saved_game_->write_chunk( chunk_id); } template -void SavedGameFileHelper::write_chunk( +void SavedGameHelper::write_chunk( const uint32_t chunk_id, const TSrc* src_values, int src_count) { - saved_game_file_->reset_buffer(); + saved_game_->reset_buffer(); write( src_values, src_count); - saved_game_file_->write_chunk( + saved_game_->write_chunk( chunk_id); } @@ -243,7 +243,7 @@ void SavedGameFileHelper::write_chunk( // try_read template -bool SavedGameFileHelper::try_read( +bool SavedGameHelper::try_read( TDst& dst_value) { using Tag = typename std::conditional < @@ -289,18 +289,18 @@ bool SavedGameFileHelper::try_read( // read template -void SavedGameFileHelper::read( +void SavedGameHelper::read( TDst& dst_value) { if (!try_read( dst_value)) { - saved_game_file_->throw_error(); + saved_game_->throw_error(); } } template -bool SavedGameFileHelper::try_read( +bool SavedGameHelper::try_read( TDst& dst_value, BooleanTag) { @@ -308,7 +308,7 @@ bool SavedGameFileHelper::try_read( TSrc src_value; - if (!saved_game_file_->read( + if (!saved_game_->read( &src_value, static_cast(sizeof(TSrc)))) { @@ -324,7 +324,7 @@ bool SavedGameFileHelper::try_read( } template -bool SavedGameFileHelper::try_read( +bool SavedGameHelper::try_read( TDst& dst_value, NumericTag) { @@ -332,7 +332,7 @@ bool SavedGameFileHelper::try_read( TSrc src_value; - if (!saved_game_file_->read( + if (!saved_game_->read( &src_value, src_size)) { @@ -348,7 +348,7 @@ bool SavedGameFileHelper::try_read( } template -bool SavedGameFileHelper::try_read( +bool SavedGameHelper::try_read( TDst*& dst_value, PointerTag) { @@ -378,7 +378,7 @@ bool SavedGameFileHelper::try_read( } template -bool SavedGameFileHelper::try_read( +bool SavedGameHelper::try_read( TDst& dst_value, ClassTag) { @@ -389,11 +389,11 @@ bool SavedGameFileHelper::try_read( dst_value.sg_import( *this); - return !saved_game_file_->is_failed(); + return !saved_game_->is_failed(); } template -bool SavedGameFileHelper::try_read( +bool SavedGameHelper::try_read( TDst(&dst_values)[TCount], Array1dTag) { @@ -403,7 +403,7 @@ bool SavedGameFileHelper::try_read( } template -bool SavedGameFileHelper::try_read( +bool SavedGameHelper::try_read( TDst(&dst_values)[TCount1][TCount2], Array2dTag) { @@ -420,7 +420,7 @@ bool SavedGameFileHelper::try_read( // try_read (C-array) template -bool SavedGameFileHelper::try_read( +bool SavedGameHelper::try_read( TDst* dst_values, int dst_count) { @@ -484,7 +484,7 @@ bool SavedGameFileHelper::try_read( // read (C-array) template -void SavedGameFileHelper::read( +void SavedGameHelper::read( TDst* dst_values, int dst_count) { @@ -492,19 +492,19 @@ void SavedGameFileHelper::read( dst_values, dst_count)) { - saved_game_file_->throw_error(); + saved_game_->throw_error(); } } template -bool SavedGameFileHelper::try_read( +bool SavedGameHelper::try_read( TDst* dst_values, int dst_count, InplaceTag) { const auto dst_size = dst_count * static_cast(sizeof(TDst)); - if (!saved_game_file_->read( + if (!saved_game_->read( dst_values, dst_size)) { @@ -518,7 +518,7 @@ bool SavedGameFileHelper::try_read( } template -bool SavedGameFileHelper::try_read( +bool SavedGameHelper::try_read( TDst* dst_values, int dst_count, CastTag) @@ -558,7 +558,7 @@ bool SavedGameFileHelper::try_read( // write template -void SavedGameFileHelper::write( +void SavedGameHelper::write( const TSrc& src_value) { using Tag = typename std::conditional< @@ -593,7 +593,7 @@ void SavedGameFileHelper::write( } template -void SavedGameFileHelper::write( +void SavedGameHelper::write( const TSrc& src_value, NumericTag) { @@ -604,13 +604,13 @@ void SavedGameFileHelper::write( // FIXME Byte order // - saved_game_file_->write( + saved_game_->write( &dst_value, dst_size); } template -void SavedGameFileHelper::write( +void SavedGameHelper::write( const TSrc* src_value, PointerTag) { @@ -628,7 +628,7 @@ void SavedGameFileHelper::write( } template -void SavedGameFileHelper::write( +void SavedGameHelper::write( const TSrc& src_value, ClassTag) { @@ -641,7 +641,7 @@ void SavedGameFileHelper::write( } template -void SavedGameFileHelper::write( +void SavedGameHelper::write( const TSrc(&src_values)[TCount], Array1dTag) { @@ -651,7 +651,7 @@ void SavedGameFileHelper::write( } template -void SavedGameFileHelper::write( +void SavedGameHelper::write( const TSrc(&src_values)[TCount1][TCount2], Array2dTag) { @@ -668,7 +668,7 @@ void SavedGameFileHelper::write( // write (C-array) template -void SavedGameFileHelper::write( +void SavedGameHelper::write( const TSrc* src_values, int src_count) { @@ -724,14 +724,14 @@ void SavedGameFileHelper::write( } template -void SavedGameFileHelper::write( +void SavedGameHelper::write( const TSrc* src_values, int src_count, InplaceTag) { const auto src_size = src_count * static_cast(sizeof(TSrc)); - saved_game_file_->write( + saved_game_->write( src_values, src_size); @@ -740,7 +740,7 @@ void SavedGameFileHelper::write( } template -void SavedGameFileHelper::write( +void SavedGameHelper::write( const TSrc* src_values, int src_count, CastTag) @@ -774,4 +774,4 @@ void SavedGameFileHelper::write( } // ojk -#endif // OJK_SAVED_GAME_FILE_HELPER_INCLUDED +#endif // OJK_SAVED_GAME_HELPER_INCLUDED diff --git a/shared/qcommon/ojk_saved_game_file_helper_fwd.h b/shared/qcommon/ojk_saved_game_helper_fwd.h similarity index 93% rename from shared/qcommon/ojk_saved_game_file_helper_fwd.h rename to shared/qcommon/ojk_saved_game_helper_fwd.h index e27daf64d5..7dee5b6584 100644 --- a/shared/qcommon/ojk_saved_game_file_helper_fwd.h +++ b/shared/qcommon/ojk_saved_game_helper_fwd.h @@ -1,25 +1,25 @@ // -// Saved game file helper. +// Saved game helper. // (forward declaration) // -#ifndef OJK_SAVED_GAME_FILE_HELPER_FWD_INCLUDED -#define OJK_SAVED_GAME_FILE_HELPER_FWD_INCLUDED +#ifndef OJK_SAVED_GAME_HELPER_FWD_INCLUDED +#define OJK_SAVED_GAME_HELPER_FWD_INCLUDED -#include "ojk_i_saved_game_file.h" +#include "ojk_i_saved_game.h" namespace ojk { -class SavedGameFileHelper +class SavedGameHelper { public: - SavedGameFileHelper( - ISavedGameFile* saved_game_file); + SavedGameHelper( + ISavedGame* saved_game); void read_chunk( @@ -144,7 +144,7 @@ class SavedGameFileHelper private: - ISavedGameFile* saved_game_file_; + ISavedGame* saved_game_; // Tags for dispatching. @@ -239,11 +239,11 @@ class SavedGameFileHelper const TSrc* src_values, int src_count, CastTag); -}; // SavedGameFileHelper +}; // SavedGameHelper -} +} // ojk -#endif // OJK_SAVED_GAME_FILE_HELPER_FWD_INCLUDED +#endif // OJK_SAVED_GAME_HELPER_FWD_INCLUDED From 4116908d780808d233d026f7ecdfaf770a98c2a8 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 7 Aug 2016 21:27:48 +0300 Subject: [PATCH 295/445] SG: Replace spaces with tabs --- code/cgame/FxScheduler.h | 46 +- code/game/Q3_Interface.cpp | 2 +- code/game/Q3_Interface.h | 2 +- code/game/ai.h | 120 +-- code/game/b_public.h | 560 +++++------ code/game/bg_public.h | 80 +- code/game/g_local.h | 190 ++-- code/game/g_public.h | 2 +- code/game/g_savegame.cpp | 220 ++-- code/game/g_shared.h | 1596 +++++++++++++++--------------- code/game/g_vehicles.h | 296 +++--- code/game/ghoul2_shared.h | 528 +++++----- code/icarus/IcarusInterface.h | 2 +- code/qcommon/q_shared.h | 1450 +++++++++++++-------------- code/rd-common/mdx_format.h | 20 +- code/rd-common/tr_public.h | 2 +- code/rd-vanilla/G2_API.cpp | 8 +- code/server/sv_savegame.cpp | 40 +- codeJK2/game/ai.h | 120 +-- codeJK2/game/anims.h | 38 +- codeJK2/game/b_public.h | 508 +++++----- codeJK2/game/bg_public.h | 72 +- codeJK2/game/g_local.h | 140 +-- codeJK2/game/g_public.h | 2 +- codeJK2/game/g_shared.h | 1566 ++++++++++++++--------------- shared/qcommon/ojk_scope_guard.h | 44 +- 26 files changed, 3827 insertions(+), 3827 deletions(-) diff --git a/code/cgame/FxScheduler.h b/code/cgame/FxScheduler.h index b5572ae31b..ad92c6e941 100644 --- a/code/cgame/FxScheduler.h +++ b/code/cgame/FxScheduler.h @@ -411,29 +411,29 @@ struct SLoopedEffect bool mIsRelative; // bolt this puppy on keep it updated - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(mId); - saved_game.write(mBoltInfo); - saved_game.write(mNextTime); - saved_game.write(mLoopStopTime); - saved_game.write(mPortalEffect); - saved_game.write(mIsRelative); - saved_game.skip(2); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(mId); - saved_game.read(mBoltInfo); - saved_game.read(mNextTime); - saved_game.read(mLoopStopTime); - saved_game.read(mPortalEffect); - saved_game.read(mIsRelative); - saved_game.skip(2); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(mId); + saved_game.write(mBoltInfo); + saved_game.write(mNextTime); + saved_game.write(mLoopStopTime); + saved_game.write(mPortalEffect); + saved_game.write(mIsRelative); + saved_game.skip(2); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(mId); + saved_game.read(mBoltInfo); + saved_game.read(mNextTime); + saved_game.read(mLoopStopTime); + saved_game.read(mPortalEffect); + saved_game.read(mIsRelative); + saved_game.skip(2); + } }; class CFxScheduler diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 5f8a5f60c0..4d7c0f153d 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -11168,7 +11168,7 @@ void CQuake3GameInterface::FreeVariable( const char *name ) //Save / Load functions ojk::ISavedGame* CQuake3GameInterface::get_saved_game_file() { - return ::gi.saved_game; + return ::gi.saved_game; } int CQuake3GameInterface::LinkGame( int entID, int icarusID ) diff --git a/code/game/Q3_Interface.h b/code/game/Q3_Interface.h index 9f7c7b8ae9..ca9b03dae4 100644 --- a/code/game/Q3_Interface.h +++ b/code/game/Q3_Interface.h @@ -699,7 +699,7 @@ class CQuake3GameInterface : public IGameInterface //Save / Load functions int LinkGame( int entID, int icarusID ); - ojk::ISavedGame* get_saved_game_file() override; + ojk::ISavedGame* get_saved_game_file() override; // Access functions int CreateIcarus( int entID); diff --git a/code/game/ai.h b/code/game/ai.h index dc3e533eba..bcce390981 100644 --- a/code/game/ai.h +++ b/code/game/ai.h @@ -124,23 +124,23 @@ class AIGroupMember_t int closestBuddy; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(number); - saved_game.write(waypoint); - saved_game.write(pathCostToEnemy); - saved_game.write(closestBuddy); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(number); - saved_game.read(waypoint); - saved_game.read(pathCostToEnemy); - saved_game.read(closestBuddy); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(number); + saved_game.write(waypoint); + saved_game.write(pathCostToEnemy); + saved_game.write(closestBuddy); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(number); + saved_game.read(waypoint); + saved_game.read(pathCostToEnemy); + saved_game.read(closestBuddy); + } }; // AIGroupMember_t #define MAX_GROUP_MEMBERS 32 @@ -167,49 +167,49 @@ class AIGroupInfo_t AIGroupMember_t member[ MAX_GROUP_MEMBERS ]; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(numGroup); - saved_game.write(processed); - saved_game.write(team); - saved_game.write(enemy); - saved_game.write(enemyWP); - saved_game.write(speechDebounceTime); - saved_game.write(lastClearShotTime); - saved_game.write(lastSeenEnemyTime); - saved_game.write(morale); - saved_game.write(moraleAdjust); - saved_game.write(moraleDebounce); - saved_game.write(memberValidateTime); - saved_game.write(activeMemberNum); - saved_game.write(commander); - saved_game.write(enemyLastSeenPos); - saved_game.write(numState); - saved_game.write<>(member); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(numGroup); - saved_game.read(processed); - saved_game.read(team); - saved_game.read(enemy); - saved_game.read(enemyWP); - saved_game.read(speechDebounceTime); - saved_game.read(lastClearShotTime); - saved_game.read(lastSeenEnemyTime); - saved_game.read(morale); - saved_game.read(moraleAdjust); - saved_game.read(moraleDebounce); - saved_game.read(memberValidateTime); - saved_game.read(activeMemberNum); - saved_game.read(commander); - saved_game.read(enemyLastSeenPos); - saved_game.read(numState); - saved_game.read<>(member); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(numGroup); + saved_game.write(processed); + saved_game.write(team); + saved_game.write(enemy); + saved_game.write(enemyWP); + saved_game.write(speechDebounceTime); + saved_game.write(lastClearShotTime); + saved_game.write(lastSeenEnemyTime); + saved_game.write(morale); + saved_game.write(moraleAdjust); + saved_game.write(moraleDebounce); + saved_game.write(memberValidateTime); + saved_game.write(activeMemberNum); + saved_game.write(commander); + saved_game.write(enemyLastSeenPos); + saved_game.write(numState); + saved_game.write<>(member); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(numGroup); + saved_game.read(processed); + saved_game.read(team); + saved_game.read(enemy); + saved_game.read(enemyWP); + saved_game.read(speechDebounceTime); + saved_game.read(lastClearShotTime); + saved_game.read(lastSeenEnemyTime); + saved_game.read(morale); + saved_game.read(moraleAdjust); + saved_game.read(moraleDebounce); + saved_game.read(memberValidateTime); + saved_game.read(activeMemberNum); + saved_game.read(commander); + saved_game.read(enemyLastSeenPos); + saved_game.read(numState); + saved_game.read<>(member); + } }; // AIGroupInfo_t diff --git a/code/game/b_public.h b/code/game/b_public.h index f10e76fb8d..4f081098ca 100644 --- a/code/game/b_public.h +++ b/code/game/b_public.h @@ -158,51 +158,51 @@ class gNPCstats_t sexType_t sex; //male, female, etc. - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(aggression); - saved_game.write(aim); - saved_game.write(earshot); - saved_game.write(evasion); - saved_game.write(hfov); - saved_game.write(intelligence); - saved_game.write(move); - saved_game.write(reactions); - saved_game.write(shootDistance); - saved_game.write(vfov); - saved_game.write(vigilance); - saved_game.write(visrange); - saved_game.write(runSpeed); - saved_game.write(walkSpeed); - saved_game.write(yawSpeed); - saved_game.write(health); - saved_game.write(acceleration); - saved_game.write(sex); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(aggression); - saved_game.read(aim); - saved_game.read(earshot); - saved_game.read(evasion); - saved_game.read(hfov); - saved_game.read(intelligence); - saved_game.read(move); - saved_game.read(reactions); - saved_game.read(shootDistance); - saved_game.read(vfov); - saved_game.read(vigilance); - saved_game.read(visrange); - saved_game.read(runSpeed); - saved_game.read(walkSpeed); - saved_game.read(yawSpeed); - saved_game.read(health); - saved_game.read(acceleration); - saved_game.read(sex); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(aggression); + saved_game.write(aim); + saved_game.write(earshot); + saved_game.write(evasion); + saved_game.write(hfov); + saved_game.write(intelligence); + saved_game.write(move); + saved_game.write(reactions); + saved_game.write(shootDistance); + saved_game.write(vfov); + saved_game.write(vigilance); + saved_game.write(visrange); + saved_game.write(runSpeed); + saved_game.write(walkSpeed); + saved_game.write(yawSpeed); + saved_game.write(health); + saved_game.write(acceleration); + saved_game.write(sex); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(aggression); + saved_game.read(aim); + saved_game.read(earshot); + saved_game.read(evasion); + saved_game.read(hfov); + saved_game.read(intelligence); + saved_game.read(move); + saved_game.read(reactions); + saved_game.read(shootDistance); + saved_game.read(vfov); + saved_game.read(vigilance); + saved_game.read(visrange); + saved_game.read(runSpeed); + saved_game.read(walkSpeed); + saved_game.read(yawSpeed); + saved_game.read(health); + saved_game.read(acceleration); + saved_game.read(sex); + } }; // gNPCstats_t @@ -383,249 +383,249 @@ class gNPC_t int ffireFadeDebounce; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(timeOfDeath); - saved_game.write(touchedByPlayer); - saved_game.write(enemyLastVisibility); - saved_game.write(aimTime); - saved_game.write(desiredYaw); - saved_game.write(desiredPitch); - saved_game.write(lockedDesiredYaw); - saved_game.write(lockedDesiredPitch); - saved_game.write(aimingBeam); - saved_game.write(enemyLastSeenLocation); - saved_game.write(enemyLastSeenTime); - saved_game.write(enemyLastHeardLocation); - saved_game.write(enemyLastHeardTime); - saved_game.write(lastAlertID); - saved_game.write(eFlags); - saved_game.write(aiFlags); - saved_game.write(currentAmmo); - saved_game.write(shotTime); - saved_game.write(burstCount); - saved_game.write(burstMin); + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(timeOfDeath); + saved_game.write(touchedByPlayer); + saved_game.write(enemyLastVisibility); + saved_game.write(aimTime); + saved_game.write(desiredYaw); + saved_game.write(desiredPitch); + saved_game.write(lockedDesiredYaw); + saved_game.write(lockedDesiredPitch); + saved_game.write(aimingBeam); + saved_game.write(enemyLastSeenLocation); + saved_game.write(enemyLastSeenTime); + saved_game.write(enemyLastHeardLocation); + saved_game.write(enemyLastHeardTime); + saved_game.write(lastAlertID); + saved_game.write(eFlags); + saved_game.write(aiFlags); + saved_game.write(currentAmmo); + saved_game.write(shotTime); + saved_game.write(burstCount); + saved_game.write(burstMin); #ifdef BASE_SAVE_COMPAT - saved_game.write(burstMean); + saved_game.write(burstMean); #endif // BASE_SAVE_COMPAT - saved_game.write(burstMax); - saved_game.write(burstSpacing); - saved_game.write(attackHold); - saved_game.write(attackHoldTime); - saved_game.write(shootAngles); - saved_game.write(rank); - saved_game.write(behaviorState); - saved_game.write(defaultBehavior); - saved_game.write(tempBehavior); - saved_game.write(ignorePain); - saved_game.write(duckDebounceTime); - saved_game.write(walkDebounceTime); - saved_game.write(enemyCheckDebounceTime); - saved_game.write(investigateDebounceTime); - saved_game.write(investigateCount); - saved_game.write(investigateGoal); - saved_game.write(investigateSoundDebounceTime); - saved_game.write(greetingDebounceTime); - saved_game.write(eventOwner); - saved_game.write(coverTarg); - saved_game.write(jumpState); - saved_game.write(followDist); - saved_game.write(tempGoal); - saved_game.write(goalEntity); - saved_game.write(lastGoalEntity); - saved_game.write(eventualGoal); - saved_game.write(captureGoal); - saved_game.write(defendEnt); - saved_game.write(greetEnt); - saved_game.write(goalTime); - saved_game.write(straightToGoal); - saved_game.write(distToGoal); - saved_game.write(navTime); - saved_game.write(blockingEntNum); - saved_game.write(blockedSpeechDebounceTime); - saved_game.write(homeWp); - saved_game.write(avoidSide); - saved_game.write(leaderAvoidSide); - saved_game.write(lastAvoidSteerSide); - saved_game.write(lastAvoidSteerSideDebouncer); - saved_game.write(group); - saved_game.write(troop); - saved_game.write(lastPathAngles); - saved_game.write<>(stats); - saved_game.write(aimErrorDebounceTime); - saved_game.write(lastAimErrorYaw); - saved_game.write(lastAimErrorPitch); - saved_game.write(aimOfs); - saved_game.write(currentAim); - saved_game.write(currentAggression); - saved_game.write(scriptFlags); - saved_game.write(desiredSpeed); - saved_game.write(currentSpeed); - saved_game.write(last_forwardmove); - saved_game.write(last_rightmove); - saved_game.skip(2); - saved_game.write(lastClearOrigin); - saved_game.write(shoveCount); - saved_game.write(blockedDebounceTime); - saved_game.write(blockedEntity); - saved_game.write(blockedTargetPosition); - saved_game.write(blockedTargetEntity); - saved_game.write(jumpDest); - saved_game.write(jumpTarget); - saved_game.write(jumpMaxXYDist); - saved_game.write(jumpMazZDist); - saved_game.write(jumpSide); - saved_game.write(jumpTime); - saved_game.write(jumpBackupTime); - saved_game.write(jumpNextCheckTime); - saved_game.write(combatPoint); - saved_game.write(lastFailedCombatPoint); - saved_game.write(movementSpeech); - saved_game.write(movementSpeechChance); - saved_game.write(nextBStateThink); - saved_game.write<>(last_ucmd); - saved_game.write(combatMove); - saved_game.write(goalRadius); - saved_game.write(pauseTime); - saved_game.write(standTime); - saved_game.write(localState); - saved_game.write(squadState); - saved_game.write(confusionTime); - saved_game.write(charmedTime); - saved_game.write(controlledTime); - saved_game.write(surrenderTime); - saved_game.write(kneelTime); - saved_game.write(enemyLaggedPos); - saved_game.write(watchTarget); - saved_game.write(ffireCount); - saved_game.write(ffireDebounce); - saved_game.write(ffireFadeDebounce); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(timeOfDeath); - saved_game.read(touchedByPlayer); - saved_game.read(enemyLastVisibility); - saved_game.read(aimTime); - saved_game.read(desiredYaw); - saved_game.read(desiredPitch); - saved_game.read(lockedDesiredYaw); - saved_game.read(lockedDesiredPitch); - saved_game.read(aimingBeam); - saved_game.read(enemyLastSeenLocation); - saved_game.read(enemyLastSeenTime); - saved_game.read(enemyLastHeardLocation); - saved_game.read(enemyLastHeardTime); - saved_game.read(lastAlertID); - saved_game.read(eFlags); - saved_game.read(aiFlags); - saved_game.read(currentAmmo); - saved_game.read(shotTime); - saved_game.read(burstCount); - saved_game.read(burstMin); + saved_game.write(burstMax); + saved_game.write(burstSpacing); + saved_game.write(attackHold); + saved_game.write(attackHoldTime); + saved_game.write(shootAngles); + saved_game.write(rank); + saved_game.write(behaviorState); + saved_game.write(defaultBehavior); + saved_game.write(tempBehavior); + saved_game.write(ignorePain); + saved_game.write(duckDebounceTime); + saved_game.write(walkDebounceTime); + saved_game.write(enemyCheckDebounceTime); + saved_game.write(investigateDebounceTime); + saved_game.write(investigateCount); + saved_game.write(investigateGoal); + saved_game.write(investigateSoundDebounceTime); + saved_game.write(greetingDebounceTime); + saved_game.write(eventOwner); + saved_game.write(coverTarg); + saved_game.write(jumpState); + saved_game.write(followDist); + saved_game.write(tempGoal); + saved_game.write(goalEntity); + saved_game.write(lastGoalEntity); + saved_game.write(eventualGoal); + saved_game.write(captureGoal); + saved_game.write(defendEnt); + saved_game.write(greetEnt); + saved_game.write(goalTime); + saved_game.write(straightToGoal); + saved_game.write(distToGoal); + saved_game.write(navTime); + saved_game.write(blockingEntNum); + saved_game.write(blockedSpeechDebounceTime); + saved_game.write(homeWp); + saved_game.write(avoidSide); + saved_game.write(leaderAvoidSide); + saved_game.write(lastAvoidSteerSide); + saved_game.write(lastAvoidSteerSideDebouncer); + saved_game.write(group); + saved_game.write(troop); + saved_game.write(lastPathAngles); + saved_game.write<>(stats); + saved_game.write(aimErrorDebounceTime); + saved_game.write(lastAimErrorYaw); + saved_game.write(lastAimErrorPitch); + saved_game.write(aimOfs); + saved_game.write(currentAim); + saved_game.write(currentAggression); + saved_game.write(scriptFlags); + saved_game.write(desiredSpeed); + saved_game.write(currentSpeed); + saved_game.write(last_forwardmove); + saved_game.write(last_rightmove); + saved_game.skip(2); + saved_game.write(lastClearOrigin); + saved_game.write(shoveCount); + saved_game.write(blockedDebounceTime); + saved_game.write(blockedEntity); + saved_game.write(blockedTargetPosition); + saved_game.write(blockedTargetEntity); + saved_game.write(jumpDest); + saved_game.write(jumpTarget); + saved_game.write(jumpMaxXYDist); + saved_game.write(jumpMazZDist); + saved_game.write(jumpSide); + saved_game.write(jumpTime); + saved_game.write(jumpBackupTime); + saved_game.write(jumpNextCheckTime); + saved_game.write(combatPoint); + saved_game.write(lastFailedCombatPoint); + saved_game.write(movementSpeech); + saved_game.write(movementSpeechChance); + saved_game.write(nextBStateThink); + saved_game.write<>(last_ucmd); + saved_game.write(combatMove); + saved_game.write(goalRadius); + saved_game.write(pauseTime); + saved_game.write(standTime); + saved_game.write(localState); + saved_game.write(squadState); + saved_game.write(confusionTime); + saved_game.write(charmedTime); + saved_game.write(controlledTime); + saved_game.write(surrenderTime); + saved_game.write(kneelTime); + saved_game.write(enemyLaggedPos); + saved_game.write(watchTarget); + saved_game.write(ffireCount); + saved_game.write(ffireDebounce); + saved_game.write(ffireFadeDebounce); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(timeOfDeath); + saved_game.read(touchedByPlayer); + saved_game.read(enemyLastVisibility); + saved_game.read(aimTime); + saved_game.read(desiredYaw); + saved_game.read(desiredPitch); + saved_game.read(lockedDesiredYaw); + saved_game.read(lockedDesiredPitch); + saved_game.read(aimingBeam); + saved_game.read(enemyLastSeenLocation); + saved_game.read(enemyLastSeenTime); + saved_game.read(enemyLastHeardLocation); + saved_game.read(enemyLastHeardTime); + saved_game.read(lastAlertID); + saved_game.read(eFlags); + saved_game.read(aiFlags); + saved_game.read(currentAmmo); + saved_game.read(shotTime); + saved_game.read(burstCount); + saved_game.read(burstMin); #ifdef BASE_SAVE_COMPAT - saved_game.read(burstMean); + saved_game.read(burstMean); #endif // BASE_SAVE_COMPAT - saved_game.read(burstMax); - saved_game.read(burstSpacing); - saved_game.read(attackHold); - saved_game.read(attackHoldTime); - saved_game.read(shootAngles); - saved_game.read(rank); - saved_game.read(behaviorState); - saved_game.read(defaultBehavior); - saved_game.read(tempBehavior); - saved_game.read(ignorePain); - saved_game.read(duckDebounceTime); - saved_game.read(walkDebounceTime); - saved_game.read(enemyCheckDebounceTime); - saved_game.read(investigateDebounceTime); - saved_game.read(investigateCount); - saved_game.read(investigateGoal); - saved_game.read(investigateSoundDebounceTime); - saved_game.read(greetingDebounceTime); - saved_game.read(eventOwner); - saved_game.read(coverTarg); - saved_game.read(jumpState); - saved_game.read(followDist); - saved_game.read(tempGoal); - saved_game.read(goalEntity); - saved_game.read(lastGoalEntity); - saved_game.read(eventualGoal); - saved_game.read(captureGoal); - saved_game.read(defendEnt); - saved_game.read(greetEnt); - saved_game.read(goalTime); - saved_game.read(straightToGoal); - saved_game.read(distToGoal); - saved_game.read(navTime); - saved_game.read(blockingEntNum); - saved_game.read(blockedSpeechDebounceTime); - saved_game.read(homeWp); - saved_game.read(avoidSide); - saved_game.read(leaderAvoidSide); - saved_game.read(lastAvoidSteerSide); - saved_game.read(lastAvoidSteerSideDebouncer); - saved_game.read(group); - saved_game.read(troop); - saved_game.read(lastPathAngles); - saved_game.read<>(stats); - saved_game.read(aimErrorDebounceTime); - saved_game.read(lastAimErrorYaw); - saved_game.read(lastAimErrorPitch); - saved_game.read(aimOfs); - saved_game.read(currentAim); - saved_game.read(currentAggression); - saved_game.read(scriptFlags); - saved_game.read(desiredSpeed); - saved_game.read(currentSpeed); - saved_game.read(last_forwardmove); - saved_game.read(last_rightmove); - saved_game.skip(2); - saved_game.read(lastClearOrigin); - saved_game.read(shoveCount); - saved_game.read(blockedDebounceTime); - saved_game.read(blockedEntity); - saved_game.read(blockedTargetPosition); - saved_game.read(blockedTargetEntity); - saved_game.read(jumpDest); - saved_game.read(jumpTarget); - saved_game.read(jumpMaxXYDist); - saved_game.read(jumpMazZDist); - saved_game.read(jumpSide); - saved_game.read(jumpTime); - saved_game.read(jumpBackupTime); - saved_game.read(jumpNextCheckTime); - saved_game.read(combatPoint); - saved_game.read(lastFailedCombatPoint); - saved_game.read(movementSpeech); - saved_game.read(movementSpeechChance); - saved_game.read(nextBStateThink); - saved_game.read<>(last_ucmd); - saved_game.read(combatMove); - saved_game.read(goalRadius); - saved_game.read(pauseTime); - saved_game.read(standTime); - saved_game.read(localState); - saved_game.read(squadState); - saved_game.read(confusionTime); - saved_game.read(charmedTime); - saved_game.read(controlledTime); - saved_game.read(surrenderTime); - saved_game.read(kneelTime); - saved_game.read(enemyLaggedPos); - saved_game.read(watchTarget); - saved_game.read(ffireCount); - saved_game.read(ffireDebounce); - saved_game.read(ffireFadeDebounce); - } + saved_game.read(burstMax); + saved_game.read(burstSpacing); + saved_game.read(attackHold); + saved_game.read(attackHoldTime); + saved_game.read(shootAngles); + saved_game.read(rank); + saved_game.read(behaviorState); + saved_game.read(defaultBehavior); + saved_game.read(tempBehavior); + saved_game.read(ignorePain); + saved_game.read(duckDebounceTime); + saved_game.read(walkDebounceTime); + saved_game.read(enemyCheckDebounceTime); + saved_game.read(investigateDebounceTime); + saved_game.read(investigateCount); + saved_game.read(investigateGoal); + saved_game.read(investigateSoundDebounceTime); + saved_game.read(greetingDebounceTime); + saved_game.read(eventOwner); + saved_game.read(coverTarg); + saved_game.read(jumpState); + saved_game.read(followDist); + saved_game.read(tempGoal); + saved_game.read(goalEntity); + saved_game.read(lastGoalEntity); + saved_game.read(eventualGoal); + saved_game.read(captureGoal); + saved_game.read(defendEnt); + saved_game.read(greetEnt); + saved_game.read(goalTime); + saved_game.read(straightToGoal); + saved_game.read(distToGoal); + saved_game.read(navTime); + saved_game.read(blockingEntNum); + saved_game.read(blockedSpeechDebounceTime); + saved_game.read(homeWp); + saved_game.read(avoidSide); + saved_game.read(leaderAvoidSide); + saved_game.read(lastAvoidSteerSide); + saved_game.read(lastAvoidSteerSideDebouncer); + saved_game.read(group); + saved_game.read(troop); + saved_game.read(lastPathAngles); + saved_game.read<>(stats); + saved_game.read(aimErrorDebounceTime); + saved_game.read(lastAimErrorYaw); + saved_game.read(lastAimErrorPitch); + saved_game.read(aimOfs); + saved_game.read(currentAim); + saved_game.read(currentAggression); + saved_game.read(scriptFlags); + saved_game.read(desiredSpeed); + saved_game.read(currentSpeed); + saved_game.read(last_forwardmove); + saved_game.read(last_rightmove); + saved_game.skip(2); + saved_game.read(lastClearOrigin); + saved_game.read(shoveCount); + saved_game.read(blockedDebounceTime); + saved_game.read(blockedEntity); + saved_game.read(blockedTargetPosition); + saved_game.read(blockedTargetEntity); + saved_game.read(jumpDest); + saved_game.read(jumpTarget); + saved_game.read(jumpMaxXYDist); + saved_game.read(jumpMazZDist); + saved_game.read(jumpSide); + saved_game.read(jumpTime); + saved_game.read(jumpBackupTime); + saved_game.read(jumpNextCheckTime); + saved_game.read(combatPoint); + saved_game.read(lastFailedCombatPoint); + saved_game.read(movementSpeech); + saved_game.read(movementSpeechChance); + saved_game.read(nextBStateThink); + saved_game.read<>(last_ucmd); + saved_game.read(combatMove); + saved_game.read(goalRadius); + saved_game.read(pauseTime); + saved_game.read(standTime); + saved_game.read(localState); + saved_game.read(squadState); + saved_game.read(confusionTime); + saved_game.read(charmedTime); + saved_game.read(controlledTime); + saved_game.read(surrenderTime); + saved_game.read(kneelTime); + saved_game.read(enemyLaggedPos); + saved_game.read(watchTarget); + saved_game.read(ffireCount); + saved_game.read(ffireDebounce); + saved_game.read(ffireFadeDebounce); + } }; // gNPC_t diff --git a/code/game/bg_public.h b/code/game/bg_public.h index 1a884f2a3c..82937a53b6 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -465,25 +465,25 @@ class animation_t unsigned char glaIndex; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(firstFrame); - saved_game.write(numFrames); - saved_game.write(frameLerp); - saved_game.write(loopFrames); - saved_game.write(glaIndex); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(firstFrame); - saved_game.read(numFrames); - saved_game.read(frameLerp); - saved_game.read(loopFrames); - saved_game.read(glaIndex); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(firstFrame); + saved_game.write(numFrames); + saved_game.write(frameLerp); + saved_game.write(loopFrames); + saved_game.write(glaIndex); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(firstFrame); + saved_game.read(numFrames); + saved_game.read(frameLerp); + saved_game.read(loopFrames); + saved_game.read(glaIndex); + } }; // animation_t #define MAX_ANIM_FILES 16 @@ -547,27 +547,27 @@ typedef struct animevent_s char *stringData; //we allow storage of one string, temporarily (in case we have to look up an index later, then make sure to set stringData to NULL so we only do the look-up once) - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(eventType); - saved_game.write(modelOnly); - saved_game.write(glaIndex); - saved_game.write(keyFrame); - saved_game.write(eventData); - saved_game.write(stringData); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(eventType); - saved_game.read(modelOnly); - saved_game.read(glaIndex); - saved_game.read(keyFrame); - saved_game.read(eventData); - saved_game.read(stringData); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(eventType); + saved_game.write(modelOnly); + saved_game.write(glaIndex); + saved_game.write(keyFrame); + saved_game.write(eventData); + saved_game.write(stringData); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(eventType); + saved_game.read(modelOnly); + saved_game.read(glaIndex); + saved_game.read(keyFrame); + saved_game.read(eventData); + saved_game.read(stringData); + } } animevent_t; typedef enum diff --git a/code/game/g_local.h b/code/game/g_local.h index 4f1a64c844..73acc265e4 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -99,29 +99,29 @@ class animFileSet_t unsigned char legsAnimEventCount; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(filename); - saved_game.write<>(animations); - saved_game.write<>(torsoAnimEvents); - saved_game.write<>(legsAnimEvents); - saved_game.write(torsoAnimEventCount); - saved_game.write(legsAnimEventCount); - saved_game.skip(2); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(filename); - saved_game.read<>(animations); - saved_game.read<>(torsoAnimEvents); - saved_game.read<>(legsAnimEvents); - saved_game.read(torsoAnimEventCount); - saved_game.read(legsAnimEventCount); - saved_game.skip(2); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(filename); + saved_game.write<>(animations); + saved_game.write<>(torsoAnimEvents); + saved_game.write<>(legsAnimEvents); + saved_game.write(torsoAnimEventCount); + saved_game.write(legsAnimEventCount); + saved_game.skip(2); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(filename); + saved_game.read<>(animations); + saved_game.read<>(torsoAnimEvents); + saved_game.read<>(legsAnimEvents); + saved_game.read(torsoAnimEventCount); + saved_game.read(legsAnimEventCount); + saved_game.skip(2); + } }; // animFileSet_t extern stringID_table_t animTable [MAX_ANIMATIONS+1]; @@ -186,35 +186,35 @@ class alertEvent_t qboolean onGround; //alert is on the ground (only used for sounds) - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(position); - saved_game.write(radius); - saved_game.write(level); - saved_game.write(type); - saved_game.write(owner); - saved_game.write(light); - saved_game.write(addLight); - saved_game.write(ID); - saved_game.write(timestamp); - saved_game.write(onGround); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(position); - saved_game.read(radius); - saved_game.read(level); - saved_game.read(type); - saved_game.read(owner); - saved_game.read(light); - saved_game.read(addLight); - saved_game.read(ID); - saved_game.read(timestamp); - saved_game.read(onGround); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(position); + saved_game.write(radius); + saved_game.write(level); + saved_game.write(type); + saved_game.write(owner); + saved_game.write(light); + saved_game.write(addLight); + saved_game.write(ID); + saved_game.write(timestamp); + saved_game.write(onGround); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(position); + saved_game.read(radius); + saved_game.read(level); + saved_game.read(type); + saved_game.read(owner); + saved_game.read(light); + saved_game.read(addLight); + saved_game.read(ID); + saved_game.read(timestamp); + saved_game.read(onGround); + } }; // alertEvent_t // @@ -301,49 +301,49 @@ class level_locals_t qboolean hasBspInstances; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(clients); - saved_game.write(maxclients); - saved_game.write(framenum); - saved_game.write(time); - saved_game.write(previousTime); - saved_game.write(globalTime); - saved_game.write(mapname); - saved_game.write(locationLinked); - saved_game.write(locationHead); - saved_game.write<>(alertEvents); - saved_game.write(numAlertEvents); - saved_game.write(curAlertID); - saved_game.write<>(groups); - saved_game.write<>(knownAnimFileSets); - saved_game.write(numKnownAnimFileSets); - saved_game.write(worldFlags); - saved_game.write(dmState); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(clients); - saved_game.read(maxclients); - saved_game.read(framenum); - saved_game.read(time); - saved_game.read(previousTime); - saved_game.read(globalTime); - saved_game.read(mapname); - saved_game.read(locationLinked); - saved_game.read(locationHead); - saved_game.read<>(alertEvents); - saved_game.read(numAlertEvents); - saved_game.read(curAlertID); - saved_game.read<>(groups); - saved_game.read<>(knownAnimFileSets); - saved_game.read(numKnownAnimFileSets); - saved_game.read(worldFlags); - saved_game.read(dmState); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(clients); + saved_game.write(maxclients); + saved_game.write(framenum); + saved_game.write(time); + saved_game.write(previousTime); + saved_game.write(globalTime); + saved_game.write(mapname); + saved_game.write(locationLinked); + saved_game.write(locationHead); + saved_game.write<>(alertEvents); + saved_game.write(numAlertEvents); + saved_game.write(curAlertID); + saved_game.write<>(groups); + saved_game.write<>(knownAnimFileSets); + saved_game.write(numKnownAnimFileSets); + saved_game.write(worldFlags); + saved_game.write(dmState); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(clients); + saved_game.read(maxclients); + saved_game.read(framenum); + saved_game.read(time); + saved_game.read(previousTime); + saved_game.read(globalTime); + saved_game.read(mapname); + saved_game.read(locationLinked); + saved_game.read(locationHead); + saved_game.read<>(alertEvents); + saved_game.read(numAlertEvents); + saved_game.read(curAlertID); + saved_game.read<>(groups); + saved_game.read<>(knownAnimFileSets); + saved_game.read(numKnownAnimFileSets); + saved_game.read(worldFlags); + saved_game.read(dmState); + } }; // level_locals_t extern level_locals_t level; diff --git a/code/game/g_public.h b/code/game/g_public.h index b553e2e145..3c712951ec 100644 --- a/code/game/g_public.h +++ b/code/game/g_public.h @@ -190,7 +190,7 @@ typedef struct { // Savegame handling // - ojk::ISavedGame* saved_game; + ojk::ISavedGame* saved_game; // add commands to the console as if they were typed in // for map changing, etc diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index cc16c1f721..a6c15b70f1 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -191,10 +191,10 @@ static char *GetStringPtr(int iStrlen, char *psOriginal/*may be NULL*/) ojk::SavedGameHelper saved_game( ::gi.saved_game); - saved_game.read_chunk( - INT_ID('S','T','R','G'), - sString, - iStrlen); + saved_game.read_chunk( + INT_ID('S', 'T', 'R', 'G'), + sString, + iStrlen); // TAG_G_ALLOC is always blown away, we can never recycle if (psOriginal && gi.bIsFromZone(psOriginal, TAG_G_ALLOC)) { @@ -676,122 +676,122 @@ static const char *SG_GetChidText( unsigned int chid ) { extern void WP_SaberSetDefaults( saberInfo_t *saber, qboolean setColors); void saberInfoRetail_t::sg_export( - saberInfo_t& dst) const + saberInfo_t& dst) const { - ::WP_SaberSetDefaults( - &dst, - false); - - if (!activeBlocking) - { - dst.saberFlags |= SFL_NOT_ACTIVE_BLOCKING; - } - - ::memcpy( - dst.blade, - blade, - sizeof(blade)); - - dst.breakParryBonus = breakParryBonus; - dst.brokenSaber1 = brokenSaber1; - dst.brokenSaber2 = brokenSaber2; - - if (!disarmable) - { - dst.saberFlags |= SFL_NOT_DISARMABLE; - } - - dst.disarmBonus = disarmBonus; - dst.forceRestrictions = forceRestrictions; - dst.fullName = fullName; - - if (!lockable) - { - dst.saberFlags |= SFL_NOT_LOCKABLE; - } - - dst.lockBonus = lockBonus; - dst.maxChain = maxChain; - dst.model = model; - dst.name = name; - dst.numBlades = numBlades; - dst.parryBonus = parryBonus; - - if (returnDamage) - { - dst.saberFlags |= SFL_RETURN_DAMAGE; - } - - dst.singleBladeStyle = singleBladeStyle; - - if (singleBladeThrowable) - { - dst.saberFlags |= SFL_SINGLE_BLADE_THROWABLE; - } - - dst.skin = skin; - dst.soundLoop = soundLoop; - dst.soundOff = soundOff; - dst.soundOn = soundOn; - - if (style != SS_NONE && style < SS_NUM_SABER_STYLES) - { - //OLD WAY: only allowed ONE style - //learn only this style - dst.stylesLearned = 1 << style; - - //forbid all other styles - dst.stylesForbidden = 0; - for (auto styleNum = SS_NONE + 1; styleNum < SS_NUM_SABER_STYLES; ++styleNum) - { - if (styleNum != style) - { - dst.stylesForbidden |= 1 << styleNum; - } - } - } - - if (!throwable) - { - dst.saberFlags |= SFL_NOT_THROWABLE; - } - - if (twoHanded) - { - dst.saberFlags |= SFL_TWO_HANDED; - } - - dst.type = type; + ::WP_SaberSetDefaults( + &dst, + false); + + if (!activeBlocking) + { + dst.saberFlags |= SFL_NOT_ACTIVE_BLOCKING; + } + + ::memcpy( + dst.blade, + blade, + sizeof(blade)); + + dst.breakParryBonus = breakParryBonus; + dst.brokenSaber1 = brokenSaber1; + dst.brokenSaber2 = brokenSaber2; + + if (!disarmable) + { + dst.saberFlags |= SFL_NOT_DISARMABLE; + } + + dst.disarmBonus = disarmBonus; + dst.forceRestrictions = forceRestrictions; + dst.fullName = fullName; + + if (!lockable) + { + dst.saberFlags |= SFL_NOT_LOCKABLE; + } + + dst.lockBonus = lockBonus; + dst.maxChain = maxChain; + dst.model = model; + dst.name = name; + dst.numBlades = numBlades; + dst.parryBonus = parryBonus; + + if (returnDamage) + { + dst.saberFlags |= SFL_RETURN_DAMAGE; + } + + dst.singleBladeStyle = singleBladeStyle; + + if (singleBladeThrowable) + { + dst.saberFlags |= SFL_SINGLE_BLADE_THROWABLE; + } + + dst.skin = skin; + dst.soundLoop = soundLoop; + dst.soundOff = soundOff; + dst.soundOn = soundOn; + + if (style != SS_NONE && style < SS_NUM_SABER_STYLES) + { + //OLD WAY: only allowed ONE style + //learn only this style + dst.stylesLearned = 1 << style; + + //forbid all other styles + dst.stylesForbidden = 0; + for (auto styleNum = SS_NONE + 1; styleNum < SS_NUM_SABER_STYLES; ++styleNum) + { + if (styleNum != style) + { + dst.stylesForbidden |= 1 << styleNum; + } + } + } + + if (!throwable) + { + dst.saberFlags |= SFL_NOT_THROWABLE; + } + + if (twoHanded) + { + dst.saberFlags |= SFL_TWO_HANDED; + } + + dst.type = type; } static void copy_retail_gclient_to_current( - const RetailGClient& src, - gclient_t& dst) + const RetailGClient& src, + gclient_t& dst) { - const auto src_pre_size = offsetof(RetailGClient, ps.saber[0]); + const auto src_pre_size = offsetof(RetailGClient, ps.saber[0]); - const auto src_post_offset = - offsetof(RetailGClient, ps.dualSabers); + const auto src_post_offset = + offsetof(RetailGClient, ps.dualSabers); - const auto src_post_size = sizeof(RetailGClient) - src_post_offset; + const auto src_post_size = sizeof(RetailGClient) - src_post_offset; - const auto dst_post_offset = offsetof(gclient_t, ps.dualSabers); + const auto dst_post_offset = offsetof(gclient_t, ps.dualSabers); - ::memcpy( - reinterpret_cast(&dst), - reinterpret_cast(&src), - src_pre_size); + ::memcpy( + reinterpret_cast(&dst), + reinterpret_cast(&src), + src_pre_size); - for (int i = 0; i < MAX_SABERS; ++i) - { - src.ps.saber[i].sg_export( - dst.ps.saber[i]); - } + for (int i = 0; i < MAX_SABERS; ++i) + { + src.ps.saber[i].sg_export( + dst.ps.saber[i]); + } - ::memcpy( - reinterpret_cast(&dst) + src_post_offset, - reinterpret_cast(&src) + dst_post_offset, - src_post_size); + ::memcpy( + reinterpret_cast(&dst) + src_post_offset, + reinterpret_cast(&src) + dst_post_offset, + src_post_size); } template @@ -1179,7 +1179,7 @@ static void ReadGEntities(qboolean qbAutosave) saved_game.read_chunk( INT_ID('G', 'H', 'L', '2')); - gi.G2API_LoadGhoul2Models(pEnt->ghoul2, nullptr); + gi.G2API_LoadGhoul2Models(pEnt->ghoul2, nullptr); } // gi.unlinkentity (pEntOriginal); diff --git a/code/game/g_shared.h b/code/game/g_shared.h index e86103dd83..673e705b26 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -122,49 +122,49 @@ class clientInfo_t char *customJediSoundDir; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(infoValid); - saved_game.write(name); - saved_game.write(team); - saved_game.write(score); - saved_game.write(handicap); - saved_game.write(legsModel); - saved_game.write(legsSkin); - saved_game.write(torsoModel); - saved_game.write(torsoSkin); - saved_game.write(headModel); - saved_game.write(headSkin); - saved_game.write(animFileIndex); - saved_game.write(sounds); - saved_game.write(customBasicSoundDir); - saved_game.write(customCombatSoundDir); - saved_game.write(customExtraSoundDir); - saved_game.write(customJediSoundDir); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(infoValid); - saved_game.read(name); - saved_game.read(team); - saved_game.read(score); - saved_game.read(handicap); - saved_game.read(legsModel); - saved_game.read(legsSkin); - saved_game.read(torsoModel); - saved_game.read(torsoSkin); - saved_game.read(headModel); - saved_game.read(headSkin); - saved_game.read(animFileIndex); - saved_game.read(sounds); - saved_game.read(customBasicSoundDir); - saved_game.read(customCombatSoundDir); - saved_game.read(customExtraSoundDir); - saved_game.read(customJediSoundDir); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(infoValid); + saved_game.write(name); + saved_game.write(team); + saved_game.write(score); + saved_game.write(handicap); + saved_game.write(legsModel); + saved_game.write(legsSkin); + saved_game.write(torsoModel); + saved_game.write(torsoSkin); + saved_game.write(headModel); + saved_game.write(headSkin); + saved_game.write(animFileIndex); + saved_game.write(sounds); + saved_game.write(customBasicSoundDir); + saved_game.write(customCombatSoundDir); + saved_game.write(customExtraSoundDir); + saved_game.write(customJediSoundDir); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(infoValid); + saved_game.read(name); + saved_game.read(team); + saved_game.read(score); + saved_game.read(handicap); + saved_game.read(legsModel); + saved_game.read(legsSkin); + saved_game.read(torsoModel); + saved_game.read(torsoSkin); + saved_game.read(headModel); + saved_game.read(headSkin); + saved_game.read(animFileIndex); + saved_game.read(sounds); + saved_game.read(customBasicSoundDir); + saved_game.read(customCombatSoundDir); + saved_game.read(customExtraSoundDir); + saved_game.read(customJediSoundDir); + } }; // clientInfo_t @@ -289,119 +289,119 @@ class renderInfo_t float legsYaw;//yaw angle your legs are actually rendering at - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(legsModelName); - saved_game.write(torsoModelName); - saved_game.write(headModelName); - saved_game.write(headYawRangeLeft); - saved_game.write(headYawRangeRight); - saved_game.write(headPitchRangeUp); - saved_game.write(headPitchRangeDown); - saved_game.write(torsoYawRangeLeft); - saved_game.write(torsoYawRangeRight); - saved_game.write(torsoPitchRangeUp); - saved_game.write(torsoPitchRangeDown); - saved_game.write(legsFrame); - saved_game.write(torsoFrame); - saved_game.write(legsFpsMod); - saved_game.write(torsoFpsMod); - saved_game.write(customRGBA); - saved_game.write(boneIndex1); - saved_game.write(boneIndex2); - saved_game.write(boneIndex3); - saved_game.write(boneIndex4); - saved_game.write(boneOrient); - saved_game.write(boneAngles1); - saved_game.write(boneAngles2); - saved_game.write(boneAngles3); - saved_game.write(boneAngles4); - saved_game.write(renderFlags); - saved_game.write(muzzlePoint); - saved_game.write(muzzleDir); - saved_game.write(muzzlePointOld); - saved_game.write(muzzleDirOld); - saved_game.write(mPCalcTime); - saved_game.write(lockYaw); - saved_game.write(headPoint); - saved_game.write(headAngles); - saved_game.write(handRPoint); - saved_game.write(handLPoint); - saved_game.write(crotchPoint); - saved_game.write(footRPoint); - saved_game.write(footLPoint); - saved_game.write(torsoPoint); - saved_game.write(torsoAngles); - saved_game.write(eyePoint); - saved_game.write(eyeAngles); - saved_game.write(lookTarget); - saved_game.write(lookMode); - saved_game.write(lookTargetClearTime); - saved_game.write(lastVoiceVolume); - saved_game.write(lastHeadAngles); - saved_game.write(headBobAngles); - saved_game.write(targetHeadBobAngles); - saved_game.write(lookingDebounceTime); - saved_game.write(legsYaw); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(legsModelName); - saved_game.read(torsoModelName); - saved_game.read(headModelName); - saved_game.read(headYawRangeLeft); - saved_game.read(headYawRangeRight); - saved_game.read(headPitchRangeUp); - saved_game.read(headPitchRangeDown); - saved_game.read(torsoYawRangeLeft); - saved_game.read(torsoYawRangeRight); - saved_game.read(torsoPitchRangeUp); - saved_game.read(torsoPitchRangeDown); - saved_game.read(legsFrame); - saved_game.read(torsoFrame); - saved_game.read(legsFpsMod); - saved_game.read(torsoFpsMod); - saved_game.read(customRGBA); - saved_game.read(boneIndex1); - saved_game.read(boneIndex2); - saved_game.read(boneIndex3); - saved_game.read(boneIndex4); - saved_game.read(boneOrient); - saved_game.read(boneAngles1); - saved_game.read(boneAngles2); - saved_game.read(boneAngles3); - saved_game.read(boneAngles4); - saved_game.read(renderFlags); - saved_game.read(muzzlePoint); - saved_game.read(muzzleDir); - saved_game.read(muzzlePointOld); - saved_game.read(muzzleDirOld); - saved_game.read(mPCalcTime); - saved_game.read(lockYaw); - saved_game.read(headPoint); - saved_game.read(headAngles); - saved_game.read(handRPoint); - saved_game.read(handLPoint); - saved_game.read(crotchPoint); - saved_game.read(footRPoint); - saved_game.read(footLPoint); - saved_game.read(torsoPoint); - saved_game.read(torsoAngles); - saved_game.read(eyePoint); - saved_game.read(eyeAngles); - saved_game.read(lookTarget); - saved_game.read(lookMode); - saved_game.read(lookTargetClearTime); - saved_game.read(lastVoiceVolume); - saved_game.read(lastHeadAngles); - saved_game.read(headBobAngles); - saved_game.read(targetHeadBobAngles); - saved_game.read(lookingDebounceTime); - saved_game.read(legsYaw); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(legsModelName); + saved_game.write(torsoModelName); + saved_game.write(headModelName); + saved_game.write(headYawRangeLeft); + saved_game.write(headYawRangeRight); + saved_game.write(headPitchRangeUp); + saved_game.write(headPitchRangeDown); + saved_game.write(torsoYawRangeLeft); + saved_game.write(torsoYawRangeRight); + saved_game.write(torsoPitchRangeUp); + saved_game.write(torsoPitchRangeDown); + saved_game.write(legsFrame); + saved_game.write(torsoFrame); + saved_game.write(legsFpsMod); + saved_game.write(torsoFpsMod); + saved_game.write(customRGBA); + saved_game.write(boneIndex1); + saved_game.write(boneIndex2); + saved_game.write(boneIndex3); + saved_game.write(boneIndex4); + saved_game.write(boneOrient); + saved_game.write(boneAngles1); + saved_game.write(boneAngles2); + saved_game.write(boneAngles3); + saved_game.write(boneAngles4); + saved_game.write(renderFlags); + saved_game.write(muzzlePoint); + saved_game.write(muzzleDir); + saved_game.write(muzzlePointOld); + saved_game.write(muzzleDirOld); + saved_game.write(mPCalcTime); + saved_game.write(lockYaw); + saved_game.write(headPoint); + saved_game.write(headAngles); + saved_game.write(handRPoint); + saved_game.write(handLPoint); + saved_game.write(crotchPoint); + saved_game.write(footRPoint); + saved_game.write(footLPoint); + saved_game.write(torsoPoint); + saved_game.write(torsoAngles); + saved_game.write(eyePoint); + saved_game.write(eyeAngles); + saved_game.write(lookTarget); + saved_game.write(lookMode); + saved_game.write(lookTargetClearTime); + saved_game.write(lastVoiceVolume); + saved_game.write(lastHeadAngles); + saved_game.write(headBobAngles); + saved_game.write(targetHeadBobAngles); + saved_game.write(lookingDebounceTime); + saved_game.write(legsYaw); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(legsModelName); + saved_game.read(torsoModelName); + saved_game.read(headModelName); + saved_game.read(headYawRangeLeft); + saved_game.read(headYawRangeRight); + saved_game.read(headPitchRangeUp); + saved_game.read(headPitchRangeDown); + saved_game.read(torsoYawRangeLeft); + saved_game.read(torsoYawRangeRight); + saved_game.read(torsoPitchRangeUp); + saved_game.read(torsoPitchRangeDown); + saved_game.read(legsFrame); + saved_game.read(torsoFrame); + saved_game.read(legsFpsMod); + saved_game.read(torsoFpsMod); + saved_game.read(customRGBA); + saved_game.read(boneIndex1); + saved_game.read(boneIndex2); + saved_game.read(boneIndex3); + saved_game.read(boneIndex4); + saved_game.read(boneOrient); + saved_game.read(boneAngles1); + saved_game.read(boneAngles2); + saved_game.read(boneAngles3); + saved_game.read(boneAngles4); + saved_game.read(renderFlags); + saved_game.read(muzzlePoint); + saved_game.read(muzzleDir); + saved_game.read(muzzlePointOld); + saved_game.read(muzzleDirOld); + saved_game.read(mPCalcTime); + saved_game.read(lockYaw); + saved_game.read(headPoint); + saved_game.read(headAngles); + saved_game.read(handRPoint); + saved_game.read(handLPoint); + saved_game.read(crotchPoint); + saved_game.read(footRPoint); + saved_game.read(footLPoint); + saved_game.read(torsoPoint); + saved_game.read(torsoAngles); + saved_game.read(eyePoint); + saved_game.read(eyeAngles); + saved_game.read(lookTarget); + saved_game.read(lookMode); + saved_game.read(lookTargetClearTime); + saved_game.read(lastVoiceVolume); + saved_game.read(lastHeadAngles); + saved_game.read(headBobAngles); + saved_game.read(targetHeadBobAngles); + saved_game.read(lookingDebounceTime); + saved_game.read(legsYaw); + } }; // renderInfo_t // Movement information structure @@ -448,37 +448,37 @@ class playerTeamState_t float lastfraggedcarrier; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(state); - saved_game.write(captures); - saved_game.write(basedefense); - saved_game.write(carrierdefense); - saved_game.write(flagrecovery); - saved_game.write(fragcarrier); - saved_game.write(assists); - saved_game.write(lasthurtcarrier); - saved_game.write(lastreturnedflag); - saved_game.write(flagsince); - saved_game.write(lastfraggedcarrier); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(state); - saved_game.read(captures); - saved_game.read(basedefense); - saved_game.read(carrierdefense); - saved_game.read(flagrecovery); - saved_game.read(fragcarrier); - saved_game.read(assists); - saved_game.read(lasthurtcarrier); - saved_game.read(lastreturnedflag); - saved_game.read(flagsince); - saved_game.read(lastfraggedcarrier); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(state); + saved_game.write(captures); + saved_game.write(basedefense); + saved_game.write(carrierdefense); + saved_game.write(flagrecovery); + saved_game.write(fragcarrier); + saved_game.write(assists); + saved_game.write(lasthurtcarrier); + saved_game.write(lastreturnedflag); + saved_game.write(flagsince); + saved_game.write(lastfraggedcarrier); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(state); + saved_game.read(captures); + saved_game.read(basedefense); + saved_game.read(carrierdefense); + saved_game.read(flagrecovery); + saved_game.read(fragcarrier); + saved_game.read(assists); + saved_game.read(lasthurtcarrier); + saved_game.read(lastreturnedflag); + saved_game.read(flagsince); + saved_game.read(lastfraggedcarrier); + } }; // playerTeamState_t // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! @@ -489,19 +489,19 @@ class objectives_t int status; // Succeed or fail or pending - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(display); - saved_game.write(status); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(display); + saved_game.write(status); + } - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(display); - saved_game.read(status); - } + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(display); + saved_game.read(status); + } }; // objectives_t // NOTE: This is an arbitrary number greater than our current number of objectives with // some fluff just in case we add more in the future. @@ -527,43 +527,43 @@ class missionStats_t int weaponUsed[WP_NUM_WEAPONS]; // # of times each weapon was used - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(secretsFound); - saved_game.write(totalSecrets); - saved_game.write(shotsFired); - saved_game.write(hits); - saved_game.write(enemiesSpawned); - saved_game.write(enemiesKilled); - saved_game.write(saberThrownCnt); - saved_game.write(saberBlocksCnt); - saved_game.write(legAttacksCnt); - saved_game.write(armAttacksCnt); - saved_game.write(torsoAttacksCnt); - saved_game.write(otherAttacksCnt); - saved_game.write(forceUsed); - saved_game.write(weaponUsed); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(secretsFound); - saved_game.read(totalSecrets); - saved_game.read(shotsFired); - saved_game.read(hits); - saved_game.read(enemiesSpawned); - saved_game.read(enemiesKilled); - saved_game.read(saberThrownCnt); - saved_game.read(saberBlocksCnt); - saved_game.read(legAttacksCnt); - saved_game.read(armAttacksCnt); - saved_game.read(torsoAttacksCnt); - saved_game.read(otherAttacksCnt); - saved_game.read(forceUsed); - saved_game.read(weaponUsed); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(secretsFound); + saved_game.write(totalSecrets); + saved_game.write(shotsFired); + saved_game.write(hits); + saved_game.write(enemiesSpawned); + saved_game.write(enemiesKilled); + saved_game.write(saberThrownCnt); + saved_game.write(saberBlocksCnt); + saved_game.write(legAttacksCnt); + saved_game.write(armAttacksCnt); + saved_game.write(torsoAttacksCnt); + saved_game.write(otherAttacksCnt); + saved_game.write(forceUsed); + saved_game.write(weaponUsed); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(secretsFound); + saved_game.read(totalSecrets); + saved_game.read(shotsFired); + saved_game.read(hits); + saved_game.read(enemiesSpawned); + saved_game.read(enemiesKilled); + saved_game.read(saberThrownCnt); + saved_game.read(saberBlocksCnt); + saved_game.read(legAttacksCnt); + saved_game.read(armAttacksCnt); + saved_game.read(torsoAttacksCnt); + saved_game.read(otherAttacksCnt); + saved_game.read(forceUsed); + saved_game.read(weaponUsed); + } }; // missionStats_t // the auto following clients don't follow a specific client @@ -586,23 +586,23 @@ class clientSession_t missionStats_t missionStats; // Various totals while on a mission - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(missionObjectivesShown); - saved_game.write(sessionTeam); - saved_game.write<>(mission_objectives); - saved_game.write<>(missionStats); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(missionObjectivesShown); - saved_game.read(sessionTeam); - saved_game.read<>(mission_objectives); - saved_game.read<>(missionStats); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(missionObjectivesShown); + saved_game.write(sessionTeam); + saved_game.write<>(mission_objectives); + saved_game.write<>(missionStats); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(missionObjectivesShown); + saved_game.read(sessionTeam); + saved_game.read<>(mission_objectives); + saved_game.read<>(missionStats); + } }; // clientSession_t // client data that stays across multiple respawns, but is cleared @@ -621,33 +621,33 @@ class clientPersistant_t playerTeamState_t teamState; // status in teamplay games - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(connected); - saved_game.write<>(lastCommand); - saved_game.write(netname); - saved_game.skip(2); - saved_game.write(maxHealth); - saved_game.write(enterTime); - saved_game.write(cmd_angles); - saved_game.skip(2); - saved_game.write<>(teamState); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(connected); - saved_game.read<>(lastCommand); - saved_game.read(netname); - saved_game.skip(2); - saved_game.read(maxHealth); - saved_game.read(enterTime); - saved_game.read(cmd_angles); - saved_game.skip(2); - saved_game.read<>(teamState); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(connected); + saved_game.write<>(lastCommand); + saved_game.write(netname); + saved_game.skip(2); + saved_game.write(maxHealth); + saved_game.write(enterTime); + saved_game.write(cmd_angles); + saved_game.skip(2); + saved_game.write<>(teamState); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(connected); + saved_game.read<>(lastCommand); + saved_game.read(netname); + saved_game.skip(2); + saved_game.read(maxHealth); + saved_game.read(enterTime); + saved_game.read(cmd_angles); + saved_game.skip(2); + saved_game.read<>(teamState); + } }; // clientPersistant_t typedef enum { @@ -791,137 +791,137 @@ class GClientBase int inSpaceIndex; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write<>(ps); - saved_game.write<>(pers); - saved_game.write<>(sess); - saved_game.write(lastCmdTime); - saved_game.write<>(usercmd); - saved_game.write(buttons); - saved_game.write(oldbuttons); - saved_game.write(latched_buttons); - saved_game.write(damage_armor); - saved_game.write(damage_blood); - saved_game.write(damage_from); - saved_game.write(damage_fromWorld); - saved_game.write(noclip); - saved_game.write(forced_forwardmove); - saved_game.write(forced_rightmove); - saved_game.write(respawnTime); - saved_game.write(idleTime); - saved_game.write(airOutTime); - saved_game.write(timeResidual); - saved_game.write(facial_blink); - saved_game.write(facial_timer); - saved_game.write(facial_anim); - saved_game.write<>(clientInfo); - saved_game.write(moveType); - saved_game.write(jetPackTime); - saved_game.write(fireDelay); - saved_game.write(breathPuffTime); - saved_game.write(playerTeam); - saved_game.write(enemyTeam); - saved_game.write(leader); - saved_game.write(NPC_class); - saved_game.write(hiddenDist); - saved_game.write(hiddenDir); - saved_game.write<>(renderInfo); - saved_game.write(dismembered); - saved_game.write(dismemberProbLegs); - saved_game.write(dismemberProbHead); - saved_game.write(dismemberProbArms); - saved_game.write(dismemberProbHands); - saved_game.write(dismemberProbWaist); - saved_game.skip(2); - saved_game.write(standheight); - saved_game.write(crouchheight); - saved_game.write(poisonDamage); - saved_game.write(poisonTime); - saved_game.write(slopeRecalcTime); - saved_game.write(pushVec); - saved_game.write(pushVecTime); - saved_game.write(noRagTime); - saved_game.write(isRagging); - saved_game.write(overridingBones); - saved_game.write(ragLastOrigin); - saved_game.write(ragLastOriginTime); - saved_game.write(pushEffectFadeTime); - saved_game.write(pushEffectOrigin); - saved_game.write(rocketLockIndex); - saved_game.write(rocketLastValidTime); - saved_game.write(rocketLockTime); - saved_game.write(rocketTargetTime); - saved_game.write(inSpaceSuffocation); - saved_game.write(inSpaceIndex); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read<>(ps); - saved_game.read<>(pers); - saved_game.read<>(sess); - saved_game.read(lastCmdTime); - saved_game.read<>(usercmd); - saved_game.read(buttons); - saved_game.read(oldbuttons); - saved_game.read(latched_buttons); - saved_game.read(damage_armor); - saved_game.read(damage_blood); - saved_game.read(damage_from); - saved_game.read(damage_fromWorld); - saved_game.read(noclip); - saved_game.read(forced_forwardmove); - saved_game.read(forced_rightmove); - saved_game.read(respawnTime); - saved_game.read(idleTime); - saved_game.read(airOutTime); - saved_game.read(timeResidual); - saved_game.read(facial_blink); - saved_game.read(facial_timer); - saved_game.read(facial_anim); - saved_game.read<>(clientInfo); - saved_game.read(moveType); - saved_game.read(jetPackTime); - saved_game.read(fireDelay); - saved_game.read(breathPuffTime); - saved_game.read(playerTeam); - saved_game.read(enemyTeam); - saved_game.read(leader); - saved_game.read(NPC_class); - saved_game.read(hiddenDist); - saved_game.read(hiddenDir); - saved_game.read<>(renderInfo); - saved_game.read(dismembered); - saved_game.read(dismemberProbLegs); - saved_game.read(dismemberProbHead); - saved_game.read(dismemberProbArms); - saved_game.read(dismemberProbHands); - saved_game.read(dismemberProbWaist); - saved_game.skip(2); - saved_game.read(standheight); - saved_game.read(crouchheight); - saved_game.read(poisonDamage); - saved_game.read(poisonTime); - saved_game.read(slopeRecalcTime); - saved_game.read(pushVec); - saved_game.read(pushVecTime); - saved_game.read(noRagTime); - saved_game.read(isRagging); - saved_game.read(overridingBones); - saved_game.read(ragLastOrigin); - saved_game.read(ragLastOriginTime); - saved_game.read(pushEffectFadeTime); - saved_game.read(pushEffectOrigin); - saved_game.read(rocketLockIndex); - saved_game.read(rocketLastValidTime); - saved_game.read(rocketLockTime); - saved_game.read(rocketTargetTime); - saved_game.read(inSpaceSuffocation); - saved_game.read(inSpaceIndex); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write<>(ps); + saved_game.write<>(pers); + saved_game.write<>(sess); + saved_game.write(lastCmdTime); + saved_game.write<>(usercmd); + saved_game.write(buttons); + saved_game.write(oldbuttons); + saved_game.write(latched_buttons); + saved_game.write(damage_armor); + saved_game.write(damage_blood); + saved_game.write(damage_from); + saved_game.write(damage_fromWorld); + saved_game.write(noclip); + saved_game.write(forced_forwardmove); + saved_game.write(forced_rightmove); + saved_game.write(respawnTime); + saved_game.write(idleTime); + saved_game.write(airOutTime); + saved_game.write(timeResidual); + saved_game.write(facial_blink); + saved_game.write(facial_timer); + saved_game.write(facial_anim); + saved_game.write<>(clientInfo); + saved_game.write(moveType); + saved_game.write(jetPackTime); + saved_game.write(fireDelay); + saved_game.write(breathPuffTime); + saved_game.write(playerTeam); + saved_game.write(enemyTeam); + saved_game.write(leader); + saved_game.write(NPC_class); + saved_game.write(hiddenDist); + saved_game.write(hiddenDir); + saved_game.write<>(renderInfo); + saved_game.write(dismembered); + saved_game.write(dismemberProbLegs); + saved_game.write(dismemberProbHead); + saved_game.write(dismemberProbArms); + saved_game.write(dismemberProbHands); + saved_game.write(dismemberProbWaist); + saved_game.skip(2); + saved_game.write(standheight); + saved_game.write(crouchheight); + saved_game.write(poisonDamage); + saved_game.write(poisonTime); + saved_game.write(slopeRecalcTime); + saved_game.write(pushVec); + saved_game.write(pushVecTime); + saved_game.write(noRagTime); + saved_game.write(isRagging); + saved_game.write(overridingBones); + saved_game.write(ragLastOrigin); + saved_game.write(ragLastOriginTime); + saved_game.write(pushEffectFadeTime); + saved_game.write(pushEffectOrigin); + saved_game.write(rocketLockIndex); + saved_game.write(rocketLastValidTime); + saved_game.write(rocketLockTime); + saved_game.write(rocketTargetTime); + saved_game.write(inSpaceSuffocation); + saved_game.write(inSpaceIndex); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read<>(ps); + saved_game.read<>(pers); + saved_game.read<>(sess); + saved_game.read(lastCmdTime); + saved_game.read<>(usercmd); + saved_game.read(buttons); + saved_game.read(oldbuttons); + saved_game.read(latched_buttons); + saved_game.read(damage_armor); + saved_game.read(damage_blood); + saved_game.read(damage_from); + saved_game.read(damage_fromWorld); + saved_game.read(noclip); + saved_game.read(forced_forwardmove); + saved_game.read(forced_rightmove); + saved_game.read(respawnTime); + saved_game.read(idleTime); + saved_game.read(airOutTime); + saved_game.read(timeResidual); + saved_game.read(facial_blink); + saved_game.read(facial_timer); + saved_game.read(facial_anim); + saved_game.read<>(clientInfo); + saved_game.read(moveType); + saved_game.read(jetPackTime); + saved_game.read(fireDelay); + saved_game.read(breathPuffTime); + saved_game.read(playerTeam); + saved_game.read(enemyTeam); + saved_game.read(leader); + saved_game.read(NPC_class); + saved_game.read(hiddenDist); + saved_game.read(hiddenDir); + saved_game.read<>(renderInfo); + saved_game.read(dismembered); + saved_game.read(dismemberProbLegs); + saved_game.read(dismemberProbHead); + saved_game.read(dismemberProbArms); + saved_game.read(dismemberProbHands); + saved_game.read(dismemberProbWaist); + saved_game.skip(2); + saved_game.read(standheight); + saved_game.read(crouchheight); + saved_game.read(poisonDamage); + saved_game.read(poisonTime); + saved_game.read(slopeRecalcTime); + saved_game.read(pushVec); + saved_game.read(pushVecTime); + saved_game.read(noRagTime); + saved_game.read(isRagging); + saved_game.read(overridingBones); + saved_game.read(ragLastOrigin); + saved_game.read(ragLastOriginTime); + saved_game.read(pushEffectFadeTime); + saved_game.read(pushEffectOrigin); + saved_game.read(rocketLockIndex); + saved_game.read(rocketLastValidTime); + saved_game.read(rocketLockTime); + saved_game.read(rocketTargetTime); + saved_game.read(inSpaceSuffocation); + saved_game.read(inSpaceIndex); + } }; // GClientBase @@ -938,17 +938,17 @@ class parms_t char parm[MAX_PARMS][MAX_PARM_STRING_LENGTH]; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(parm); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(parm); + } - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(parm); - } + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(parm); + } }; // parms_t #ifdef GAME_INCLUDE @@ -1281,383 +1281,383 @@ Ghoul2 Insert End int forcePuller; //who force-pulled me (so we don't damage them if we hit them) - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write<>(s); - saved_game.write(client); - saved_game.write(inuse); - saved_game.write(linked); - saved_game.write(svFlags); - saved_game.write(bmodel); - saved_game.write(mins); - saved_game.write(maxs); - saved_game.write(contents); - saved_game.write(absmin); - saved_game.write(absmax); - saved_game.write(currentOrigin); - saved_game.write(currentAngles); - saved_game.write(owner); - saved_game.write<>(ghoul2); - saved_game.write(modelScale); - saved_game.write(classname); - saved_game.write(spawnflags); - saved_game.write(flags); - saved_game.write(model); - saved_game.write(model2); - saved_game.write(freetime); - saved_game.write(eventTime); - saved_game.write(freeAfterEvent); - saved_game.write(physicsBounce); - saved_game.write(clipmask); - saved_game.write(speed); - saved_game.write(resultspeed); - saved_game.write(lastMoveTime); - saved_game.write(movedir); - saved_game.write(lastOrigin); - saved_game.write(lastAngles); - saved_game.write(mass); - saved_game.write(lastImpact); - saved_game.write(watertype); - saved_game.write(waterlevel); - saved_game.write(wupdate); - saved_game.write(prev_waterlevel); - saved_game.write(angle); - saved_game.write(target); - saved_game.write(target2); - saved_game.write(target3); - saved_game.write(target4); - saved_game.write(targetJump); - saved_game.write(targetname); - saved_game.write(team); - saved_game.write(roff); - saved_game.write(roff_ctr); - saved_game.write(next_roff_time); - saved_game.write(fx_time); - saved_game.write(nextthink); - saved_game.write(e_ThinkFunc); - saved_game.write(e_clThinkFunc); - saved_game.write(e_ReachedFunc); - saved_game.write(e_BlockedFunc); - saved_game.write(e_TouchFunc); - saved_game.write(e_UseFunc); - saved_game.write(e_PainFunc); - saved_game.write(e_DieFunc); - saved_game.write(health); - saved_game.write(max_health); - saved_game.write(takedamage); - saved_game.write(material); - saved_game.write(damage); - saved_game.write(dflags); - saved_game.write(splashDamage); - saved_game.write(splashRadius); - saved_game.write(methodOfDeath); - saved_game.write(splashMethodOfDeath); - saved_game.write(locationDamage); - saved_game.write(chain); - saved_game.write(enemy); - saved_game.write(activator); - saved_game.write(teamchain); - saved_game.write(teammaster); - saved_game.write(lastEnemy); - saved_game.write(wait); - saved_game.write(random); - saved_game.write(delay); - saved_game.write(alt_fire); - saved_game.write(count); - saved_game.write(bounceCount); - saved_game.write(fly_sound_debounce_time); - saved_game.write(painDebounceTime); - saved_game.write(disconnectDebounceTime); - saved_game.write(attackDebounceTime); - saved_game.write(pushDebounceTime); - saved_game.write(aimDebounceTime); - saved_game.write(useDebounceTime); - saved_game.write(trigger_formation); - saved_game.write(spawnContents); - saved_game.write(waypoint); - saved_game.write(wayedge); - saved_game.write(lastWaypoint); - saved_game.write(lastInAirTime); - saved_game.write(noWaypointTime); - saved_game.write(combatPoint); - saved_game.write(followPos); - saved_game.write(followPosRecalcTime); - saved_game.write(followPosWaypoint); - saved_game.write(loopAnim); - saved_game.write(startFrame); - saved_game.write(endFrame); - saved_game.write(m_iIcarusID); - saved_game.write(taskID); - saved_game.write(parms); - saved_game.write(behaviorSet); - saved_game.write(script_targetname); - saved_game.write(delayScriptTime); - saved_game.write(soundSet); - saved_game.write(setTime); - saved_game.write(cameraGroup); - saved_game.write(noDamageTeam); - saved_game.write(playerModel); - saved_game.write(weaponModel); - saved_game.write(handRBolt); - saved_game.write(handLBolt); - saved_game.write(headBolt); - saved_game.write(cervicalBolt); - saved_game.write(chestBolt); - saved_game.write(gutBolt); - saved_game.write(torsoBolt); - saved_game.write(crotchBolt); - saved_game.write(motionBolt); - saved_game.write(kneeLBolt); - saved_game.write(kneeRBolt); - saved_game.write(elbowLBolt); - saved_game.write(elbowRBolt); - saved_game.write(footLBolt); - saved_game.write(footRBolt); - saved_game.write(faceBone); - saved_game.write(craniumBone); - saved_game.write(cervicalBone); - saved_game.write(thoracicBone); - saved_game.write(upperLumbarBone); - saved_game.write(lowerLumbarBone); - saved_game.write(hipsBone); - saved_game.write(motionBone); - saved_game.write(rootBone); - saved_game.write(footLBone); - saved_game.write(footRBone); - saved_game.write(humerusRBone); - saved_game.write(genericBone1); - saved_game.write(genericBone2); - saved_game.write(genericBone3); - saved_game.write(genericBolt1); - saved_game.write(genericBolt2); - saved_game.write(genericBolt3); - saved_game.write(genericBolt4); - saved_game.write(genericBolt5); - saved_game.write(cinematicModel); - saved_game.write(m_pVehicle); - saved_game.write(NPC); - saved_game.write(ownername); - saved_game.write(cantHitEnemyCounter); - saved_game.write(NPC_type); - saved_game.write(NPC_targetname); - saved_game.write(NPC_target); - saved_game.write(moverState); - saved_game.write(soundPos1); - saved_game.write(sound1to2); - saved_game.write(sound2to1); - saved_game.write(soundPos2); - saved_game.write(soundLoop); - saved_game.write(nextTrain); - saved_game.write(prevTrain); - saved_game.write(pos1); - saved_game.write(pos2); - saved_game.write(pos3); - saved_game.write(sounds); - saved_game.write(closetarget); - saved_game.write(opentarget); - saved_game.write(paintarget); - saved_game.write(lockCount); - saved_game.write(radius); - saved_game.write(wpIndex); - saved_game.write(noise_index); - saved_game.write(startRGBA); - saved_game.write(finalRGBA); - saved_game.write(item); - saved_game.write(message); - saved_game.write(lightLevel); - saved_game.write(forcePushTime); - saved_game.write(forcePuller); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read<>(s); - saved_game.read(client); - saved_game.read(inuse); - saved_game.read(linked); - saved_game.read(svFlags); - saved_game.read(bmodel); - saved_game.read(mins); - saved_game.read(maxs); - saved_game.read(contents); - saved_game.read(absmin); - saved_game.read(absmax); - saved_game.read(currentOrigin); - saved_game.read(currentAngles); - saved_game.read(owner); - saved_game.read<>(ghoul2); - saved_game.read(modelScale); - saved_game.read(classname); - saved_game.read(spawnflags); - saved_game.read(flags); - saved_game.read(model); - saved_game.read(model2); - saved_game.read(freetime); - saved_game.read(eventTime); - saved_game.read(freeAfterEvent); - saved_game.read(physicsBounce); - saved_game.read(clipmask); - saved_game.read(speed); - saved_game.read(resultspeed); - saved_game.read(lastMoveTime); - saved_game.read(movedir); - saved_game.read(lastOrigin); - saved_game.read(lastAngles); - saved_game.read(mass); - saved_game.read(lastImpact); - saved_game.read(watertype); - saved_game.read(waterlevel); - saved_game.read(wupdate); - saved_game.read(prev_waterlevel); - saved_game.read(angle); - saved_game.read(target); - saved_game.read(target2); - saved_game.read(target3); - saved_game.read(target4); - saved_game.read(targetJump); - saved_game.read(targetname); - saved_game.read(team); - saved_game.read(roff); - saved_game.read(roff_ctr); - saved_game.read(next_roff_time); - saved_game.read(fx_time); - saved_game.read(nextthink); - saved_game.read(e_ThinkFunc); - saved_game.read(e_clThinkFunc); - saved_game.read(e_ReachedFunc); - saved_game.read(e_BlockedFunc); - saved_game.read(e_TouchFunc); - saved_game.read(e_UseFunc); - saved_game.read(e_PainFunc); - saved_game.read(e_DieFunc); - saved_game.read(health); - saved_game.read(max_health); - saved_game.read(takedamage); - saved_game.read(material); - saved_game.read(damage); - saved_game.read(dflags); - saved_game.read(splashDamage); - saved_game.read(splashRadius); - saved_game.read(methodOfDeath); - saved_game.read(splashMethodOfDeath); - saved_game.read(locationDamage); - saved_game.read(chain); - saved_game.read(enemy); - saved_game.read(activator); - saved_game.read(teamchain); - saved_game.read(teammaster); - saved_game.read(lastEnemy); - saved_game.read(wait); - saved_game.read(random); - saved_game.read(delay); - saved_game.read(alt_fire); - saved_game.read(count); - saved_game.read(bounceCount); - saved_game.read(fly_sound_debounce_time); - saved_game.read(painDebounceTime); - saved_game.read(disconnectDebounceTime); - saved_game.read(attackDebounceTime); - saved_game.read(pushDebounceTime); - saved_game.read(aimDebounceTime); - saved_game.read(useDebounceTime); - saved_game.read(trigger_formation); - saved_game.read(spawnContents); - saved_game.read(waypoint); - saved_game.read(wayedge); - saved_game.read(lastWaypoint); - saved_game.read(lastInAirTime); - saved_game.read(noWaypointTime); - saved_game.read(combatPoint); - saved_game.read(followPos); - saved_game.read(followPosRecalcTime); - saved_game.read(followPosWaypoint); - saved_game.read(loopAnim); - saved_game.read(startFrame); - saved_game.read(endFrame); - saved_game.read(m_iIcarusID); - saved_game.read(taskID); - saved_game.read(parms); - saved_game.read(behaviorSet); - saved_game.read(script_targetname); - saved_game.read(delayScriptTime); - saved_game.read(soundSet); - saved_game.read(setTime); - saved_game.read(cameraGroup); - saved_game.read(noDamageTeam); - saved_game.read(playerModel); - saved_game.read(weaponModel); - saved_game.read(handRBolt); - saved_game.read(handLBolt); - saved_game.read(headBolt); - saved_game.read(cervicalBolt); - saved_game.read(chestBolt); - saved_game.read(gutBolt); - saved_game.read(torsoBolt); - saved_game.read(crotchBolt); - saved_game.read(motionBolt); - saved_game.read(kneeLBolt); - saved_game.read(kneeRBolt); - saved_game.read(elbowLBolt); - saved_game.read(elbowRBolt); - saved_game.read(footLBolt); - saved_game.read(footRBolt); - saved_game.read(faceBone); - saved_game.read(craniumBone); - saved_game.read(cervicalBone); - saved_game.read(thoracicBone); - saved_game.read(upperLumbarBone); - saved_game.read(lowerLumbarBone); - saved_game.read(hipsBone); - saved_game.read(motionBone); - saved_game.read(rootBone); - saved_game.read(footLBone); - saved_game.read(footRBone); - saved_game.read(humerusRBone); - saved_game.read(genericBone1); - saved_game.read(genericBone2); - saved_game.read(genericBone3); - saved_game.read(genericBolt1); - saved_game.read(genericBolt2); - saved_game.read(genericBolt3); - saved_game.read(genericBolt4); - saved_game.read(genericBolt5); - saved_game.read(cinematicModel); - saved_game.read(m_pVehicle); - saved_game.read(NPC); - saved_game.read(ownername); - saved_game.read(cantHitEnemyCounter); - saved_game.read(NPC_type); - saved_game.read(NPC_targetname); - saved_game.read(NPC_target); - saved_game.read(moverState); - saved_game.read(soundPos1); - saved_game.read(sound1to2); - saved_game.read(sound2to1); - saved_game.read(soundPos2); - saved_game.read(soundLoop); - saved_game.read(nextTrain); - saved_game.read(prevTrain); - saved_game.read(pos1); - saved_game.read(pos2); - saved_game.read(pos3); - saved_game.read(sounds); - saved_game.read(closetarget); - saved_game.read(opentarget); - saved_game.read(paintarget); - saved_game.read(lockCount); - saved_game.read(radius); - saved_game.read(wpIndex); - saved_game.read(noise_index); - saved_game.read(startRGBA); - saved_game.read(finalRGBA); - saved_game.read(item); - saved_game.read(message); - saved_game.read(lightLevel); - saved_game.read(forcePushTime); - saved_game.read(forcePuller); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write<>(s); + saved_game.write(client); + saved_game.write(inuse); + saved_game.write(linked); + saved_game.write(svFlags); + saved_game.write(bmodel); + saved_game.write(mins); + saved_game.write(maxs); + saved_game.write(contents); + saved_game.write(absmin); + saved_game.write(absmax); + saved_game.write(currentOrigin); + saved_game.write(currentAngles); + saved_game.write(owner); + saved_game.write<>(ghoul2); + saved_game.write(modelScale); + saved_game.write(classname); + saved_game.write(spawnflags); + saved_game.write(flags); + saved_game.write(model); + saved_game.write(model2); + saved_game.write(freetime); + saved_game.write(eventTime); + saved_game.write(freeAfterEvent); + saved_game.write(physicsBounce); + saved_game.write(clipmask); + saved_game.write(speed); + saved_game.write(resultspeed); + saved_game.write(lastMoveTime); + saved_game.write(movedir); + saved_game.write(lastOrigin); + saved_game.write(lastAngles); + saved_game.write(mass); + saved_game.write(lastImpact); + saved_game.write(watertype); + saved_game.write(waterlevel); + saved_game.write(wupdate); + saved_game.write(prev_waterlevel); + saved_game.write(angle); + saved_game.write(target); + saved_game.write(target2); + saved_game.write(target3); + saved_game.write(target4); + saved_game.write(targetJump); + saved_game.write(targetname); + saved_game.write(team); + saved_game.write(roff); + saved_game.write(roff_ctr); + saved_game.write(next_roff_time); + saved_game.write(fx_time); + saved_game.write(nextthink); + saved_game.write(e_ThinkFunc); + saved_game.write(e_clThinkFunc); + saved_game.write(e_ReachedFunc); + saved_game.write(e_BlockedFunc); + saved_game.write(e_TouchFunc); + saved_game.write(e_UseFunc); + saved_game.write(e_PainFunc); + saved_game.write(e_DieFunc); + saved_game.write(health); + saved_game.write(max_health); + saved_game.write(takedamage); + saved_game.write(material); + saved_game.write(damage); + saved_game.write(dflags); + saved_game.write(splashDamage); + saved_game.write(splashRadius); + saved_game.write(methodOfDeath); + saved_game.write(splashMethodOfDeath); + saved_game.write(locationDamage); + saved_game.write(chain); + saved_game.write(enemy); + saved_game.write(activator); + saved_game.write(teamchain); + saved_game.write(teammaster); + saved_game.write(lastEnemy); + saved_game.write(wait); + saved_game.write(random); + saved_game.write(delay); + saved_game.write(alt_fire); + saved_game.write(count); + saved_game.write(bounceCount); + saved_game.write(fly_sound_debounce_time); + saved_game.write(painDebounceTime); + saved_game.write(disconnectDebounceTime); + saved_game.write(attackDebounceTime); + saved_game.write(pushDebounceTime); + saved_game.write(aimDebounceTime); + saved_game.write(useDebounceTime); + saved_game.write(trigger_formation); + saved_game.write(spawnContents); + saved_game.write(waypoint); + saved_game.write(wayedge); + saved_game.write(lastWaypoint); + saved_game.write(lastInAirTime); + saved_game.write(noWaypointTime); + saved_game.write(combatPoint); + saved_game.write(followPos); + saved_game.write(followPosRecalcTime); + saved_game.write(followPosWaypoint); + saved_game.write(loopAnim); + saved_game.write(startFrame); + saved_game.write(endFrame); + saved_game.write(m_iIcarusID); + saved_game.write(taskID); + saved_game.write(parms); + saved_game.write(behaviorSet); + saved_game.write(script_targetname); + saved_game.write(delayScriptTime); + saved_game.write(soundSet); + saved_game.write(setTime); + saved_game.write(cameraGroup); + saved_game.write(noDamageTeam); + saved_game.write(playerModel); + saved_game.write(weaponModel); + saved_game.write(handRBolt); + saved_game.write(handLBolt); + saved_game.write(headBolt); + saved_game.write(cervicalBolt); + saved_game.write(chestBolt); + saved_game.write(gutBolt); + saved_game.write(torsoBolt); + saved_game.write(crotchBolt); + saved_game.write(motionBolt); + saved_game.write(kneeLBolt); + saved_game.write(kneeRBolt); + saved_game.write(elbowLBolt); + saved_game.write(elbowRBolt); + saved_game.write(footLBolt); + saved_game.write(footRBolt); + saved_game.write(faceBone); + saved_game.write(craniumBone); + saved_game.write(cervicalBone); + saved_game.write(thoracicBone); + saved_game.write(upperLumbarBone); + saved_game.write(lowerLumbarBone); + saved_game.write(hipsBone); + saved_game.write(motionBone); + saved_game.write(rootBone); + saved_game.write(footLBone); + saved_game.write(footRBone); + saved_game.write(humerusRBone); + saved_game.write(genericBone1); + saved_game.write(genericBone2); + saved_game.write(genericBone3); + saved_game.write(genericBolt1); + saved_game.write(genericBolt2); + saved_game.write(genericBolt3); + saved_game.write(genericBolt4); + saved_game.write(genericBolt5); + saved_game.write(cinematicModel); + saved_game.write(m_pVehicle); + saved_game.write(NPC); + saved_game.write(ownername); + saved_game.write(cantHitEnemyCounter); + saved_game.write(NPC_type); + saved_game.write(NPC_targetname); + saved_game.write(NPC_target); + saved_game.write(moverState); + saved_game.write(soundPos1); + saved_game.write(sound1to2); + saved_game.write(sound2to1); + saved_game.write(soundPos2); + saved_game.write(soundLoop); + saved_game.write(nextTrain); + saved_game.write(prevTrain); + saved_game.write(pos1); + saved_game.write(pos2); + saved_game.write(pos3); + saved_game.write(sounds); + saved_game.write(closetarget); + saved_game.write(opentarget); + saved_game.write(paintarget); + saved_game.write(lockCount); + saved_game.write(radius); + saved_game.write(wpIndex); + saved_game.write(noise_index); + saved_game.write(startRGBA); + saved_game.write(finalRGBA); + saved_game.write(item); + saved_game.write(message); + saved_game.write(lightLevel); + saved_game.write(forcePushTime); + saved_game.write(forcePuller); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read<>(s); + saved_game.read(client); + saved_game.read(inuse); + saved_game.read(linked); + saved_game.read(svFlags); + saved_game.read(bmodel); + saved_game.read(mins); + saved_game.read(maxs); + saved_game.read(contents); + saved_game.read(absmin); + saved_game.read(absmax); + saved_game.read(currentOrigin); + saved_game.read(currentAngles); + saved_game.read(owner); + saved_game.read<>(ghoul2); + saved_game.read(modelScale); + saved_game.read(classname); + saved_game.read(spawnflags); + saved_game.read(flags); + saved_game.read(model); + saved_game.read(model2); + saved_game.read(freetime); + saved_game.read(eventTime); + saved_game.read(freeAfterEvent); + saved_game.read(physicsBounce); + saved_game.read(clipmask); + saved_game.read(speed); + saved_game.read(resultspeed); + saved_game.read(lastMoveTime); + saved_game.read(movedir); + saved_game.read(lastOrigin); + saved_game.read(lastAngles); + saved_game.read(mass); + saved_game.read(lastImpact); + saved_game.read(watertype); + saved_game.read(waterlevel); + saved_game.read(wupdate); + saved_game.read(prev_waterlevel); + saved_game.read(angle); + saved_game.read(target); + saved_game.read(target2); + saved_game.read(target3); + saved_game.read(target4); + saved_game.read(targetJump); + saved_game.read(targetname); + saved_game.read(team); + saved_game.read(roff); + saved_game.read(roff_ctr); + saved_game.read(next_roff_time); + saved_game.read(fx_time); + saved_game.read(nextthink); + saved_game.read(e_ThinkFunc); + saved_game.read(e_clThinkFunc); + saved_game.read(e_ReachedFunc); + saved_game.read(e_BlockedFunc); + saved_game.read(e_TouchFunc); + saved_game.read(e_UseFunc); + saved_game.read(e_PainFunc); + saved_game.read(e_DieFunc); + saved_game.read(health); + saved_game.read(max_health); + saved_game.read(takedamage); + saved_game.read(material); + saved_game.read(damage); + saved_game.read(dflags); + saved_game.read(splashDamage); + saved_game.read(splashRadius); + saved_game.read(methodOfDeath); + saved_game.read(splashMethodOfDeath); + saved_game.read(locationDamage); + saved_game.read(chain); + saved_game.read(enemy); + saved_game.read(activator); + saved_game.read(teamchain); + saved_game.read(teammaster); + saved_game.read(lastEnemy); + saved_game.read(wait); + saved_game.read(random); + saved_game.read(delay); + saved_game.read(alt_fire); + saved_game.read(count); + saved_game.read(bounceCount); + saved_game.read(fly_sound_debounce_time); + saved_game.read(painDebounceTime); + saved_game.read(disconnectDebounceTime); + saved_game.read(attackDebounceTime); + saved_game.read(pushDebounceTime); + saved_game.read(aimDebounceTime); + saved_game.read(useDebounceTime); + saved_game.read(trigger_formation); + saved_game.read(spawnContents); + saved_game.read(waypoint); + saved_game.read(wayedge); + saved_game.read(lastWaypoint); + saved_game.read(lastInAirTime); + saved_game.read(noWaypointTime); + saved_game.read(combatPoint); + saved_game.read(followPos); + saved_game.read(followPosRecalcTime); + saved_game.read(followPosWaypoint); + saved_game.read(loopAnim); + saved_game.read(startFrame); + saved_game.read(endFrame); + saved_game.read(m_iIcarusID); + saved_game.read(taskID); + saved_game.read(parms); + saved_game.read(behaviorSet); + saved_game.read(script_targetname); + saved_game.read(delayScriptTime); + saved_game.read(soundSet); + saved_game.read(setTime); + saved_game.read(cameraGroup); + saved_game.read(noDamageTeam); + saved_game.read(playerModel); + saved_game.read(weaponModel); + saved_game.read(handRBolt); + saved_game.read(handLBolt); + saved_game.read(headBolt); + saved_game.read(cervicalBolt); + saved_game.read(chestBolt); + saved_game.read(gutBolt); + saved_game.read(torsoBolt); + saved_game.read(crotchBolt); + saved_game.read(motionBolt); + saved_game.read(kneeLBolt); + saved_game.read(kneeRBolt); + saved_game.read(elbowLBolt); + saved_game.read(elbowRBolt); + saved_game.read(footLBolt); + saved_game.read(footRBolt); + saved_game.read(faceBone); + saved_game.read(craniumBone); + saved_game.read(cervicalBone); + saved_game.read(thoracicBone); + saved_game.read(upperLumbarBone); + saved_game.read(lowerLumbarBone); + saved_game.read(hipsBone); + saved_game.read(motionBone); + saved_game.read(rootBone); + saved_game.read(footLBone); + saved_game.read(footRBone); + saved_game.read(humerusRBone); + saved_game.read(genericBone1); + saved_game.read(genericBone2); + saved_game.read(genericBone3); + saved_game.read(genericBolt1); + saved_game.read(genericBolt2); + saved_game.read(genericBolt3); + saved_game.read(genericBolt4); + saved_game.read(genericBolt5); + saved_game.read(cinematicModel); + saved_game.read(m_pVehicle); + saved_game.read(NPC); + saved_game.read(ownername); + saved_game.read(cantHitEnemyCounter); + saved_game.read(NPC_type); + saved_game.read(NPC_targetname); + saved_game.read(NPC_target); + saved_game.read(moverState); + saved_game.read(soundPos1); + saved_game.read(sound1to2); + saved_game.read(sound2to1); + saved_game.read(soundPos2); + saved_game.read(soundLoop); + saved_game.read(nextTrain); + saved_game.read(prevTrain); + saved_game.read(pos1); + saved_game.read(pos2); + saved_game.read(pos3); + saved_game.read(sounds); + saved_game.read(closetarget); + saved_game.read(opentarget); + saved_game.read(paintarget); + saved_game.read(lockCount); + saved_game.read(radius); + saved_game.read(wpIndex); + saved_game.read(noise_index); + saved_game.read(startRGBA); + saved_game.read(finalRGBA); + saved_game.read(item); + saved_game.read(message); + saved_game.read(lightLevel); + saved_game.read(forcePushTime); + saved_game.read(forcePuller); + } }; #endif //#ifdef GAME_INCLUDE diff --git a/code/game/g_vehicles.h b/code/game/g_vehicles.h index ce36437639..3c74a1fbd4 100644 --- a/code/game/g_vehicles.h +++ b/code/game/g_vehicles.h @@ -467,25 +467,25 @@ struct Muzzle bool m_bFired; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(m_vMuzzlePos); - saved_game.write(m_vMuzzleDir); - saved_game.write(m_iMuzzleWait); - saved_game.write(m_bFired); - saved_game.skip(3); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(m_vMuzzlePos); - saved_game.read(m_vMuzzleDir); - saved_game.read(m_iMuzzleWait); - saved_game.read(m_bFired); - saved_game.skip(3); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(m_vMuzzlePos); + saved_game.write(m_vMuzzleDir); + saved_game.write(m_iMuzzleWait); + saved_game.write(m_bFired); + saved_game.skip(3); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(m_vMuzzlePos); + saved_game.read(m_vMuzzleDir); + saved_game.read(m_iMuzzleWait); + saved_game.read(m_bFired); + saved_game.skip(3); + } }; //defines for impact damage surface stuff @@ -523,23 +523,23 @@ typedef struct int nextMuzzle; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(linked); - saved_game.write(ammo); - saved_game.write(lastAmmoInc); - saved_game.write(nextMuzzle); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(linked); - saved_game.read(ammo); - saved_game.read(lastAmmoInc); - saved_game.read(nextMuzzle); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(linked); + saved_game.write(ammo); + saved_game.write(lastAmmoInc); + saved_game.write(nextMuzzle); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(linked); + saved_game.read(ammo); + saved_game.read(lastAmmoInc); + saved_game.read(nextMuzzle); + } } vehWeaponStatus_t; typedef struct @@ -556,25 +556,25 @@ typedef struct int enemyHoldTime; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(ammo); - saved_game.write(lastAmmoInc); - saved_game.write(nextMuzzle); - saved_game.write(enemyEntNum); - saved_game.write(enemyHoldTime); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(ammo); - saved_game.read(lastAmmoInc); - saved_game.read(nextMuzzle); - saved_game.read(enemyEntNum); - saved_game.read(enemyHoldTime); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(ammo); + saved_game.write(lastAmmoInc); + saved_game.write(nextMuzzle); + saved_game.write(enemyEntNum); + saved_game.write(enemyHoldTime); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(ammo); + saved_game.read(lastAmmoInc); + saved_game.read(nextMuzzle); + saved_game.read(enemyEntNum); + saved_game.read(enemyHoldTime); + } } vehTurretStatus_t; // This is the implementation of the vehicle interface and any of the other variables needed. This @@ -693,99 +693,99 @@ struct Vehicle_t float m_safeJumpMountRightDot; - void Vehicle_t::sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(m_pPilot); - saved_game.write(m_iPilotTime); - saved_game.write(m_bHasHadPilot); - saved_game.write(m_pDroidUnit); - saved_game.write(m_pParentEntity); - saved_game.write(m_iBoarding); - saved_game.write(m_bWasBoarding); - saved_game.skip(3); - saved_game.write(m_vBoardingVelocity); - saved_game.write(m_fTimeModifier); - saved_game.write(m_iLeftWingBone); - saved_game.write(m_iRightWingBone); - saved_game.write(m_iExhaustTag); - saved_game.write(m_iMuzzleTag); - saved_game.write(m_iDroidUnitTag); - saved_game.write(m_iGunnerViewTag); - saved_game.write<>(m_Muzzles); - saved_game.write<>(m_ucmd); - saved_game.write(m_EjectDir); - saved_game.write(m_ulFlags); - saved_game.write(m_vOrientation); - saved_game.write(m_fStrafeTime); - saved_game.write(m_vPrevOrientation); - saved_game.write(m_vAngularVelocity); - saved_game.write(m_vFullAngleVelocity); - saved_game.write(m_iArmor); - saved_game.write(m_iShields); - saved_game.write(m_iLastFXTime); - saved_game.write(m_iDieTime); - saved_game.write(m_pVehicleInfo); - saved_game.write<>(m_LandTrace); - saved_game.write(m_iRemovedSurfaces); - saved_game.write(m_iTurboTime); - saved_game.write(m_iDropTime); - saved_game.write(m_iSoundDebounceTimer); - saved_game.write(lastShieldInc); - saved_game.write(linkWeaponToggleHeld); - saved_game.write<>(weaponStatus); - saved_game.write<>(turretStatus); - saved_game.write(m_pOldPilot); - saved_game.write(m_safeJumpMountTime); - saved_game.write(m_safeJumpMountRightDot); - } - - void Vehicle_t::sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(m_pPilot); - saved_game.read(m_iPilotTime); - saved_game.read(m_bHasHadPilot); - saved_game.read(m_pDroidUnit); - saved_game.read(m_pParentEntity); - saved_game.read(m_iBoarding); - saved_game.read(m_bWasBoarding); - saved_game.skip(3); - saved_game.read(m_vBoardingVelocity); - saved_game.read(m_fTimeModifier); - saved_game.read(m_iLeftWingBone); - saved_game.read(m_iRightWingBone); - saved_game.read(m_iExhaustTag); - saved_game.read(m_iMuzzleTag); - saved_game.read(m_iDroidUnitTag); - saved_game.read(m_iGunnerViewTag); - saved_game.read<>(m_Muzzles); - saved_game.read<>(m_ucmd); - saved_game.read(m_EjectDir); - saved_game.read(m_ulFlags); - saved_game.read(m_vOrientation); - saved_game.read(m_fStrafeTime); - saved_game.read(m_vPrevOrientation); - saved_game.read(m_vAngularVelocity); - saved_game.read(m_vFullAngleVelocity); - saved_game.read(m_iArmor); - saved_game.read(m_iShields); - saved_game.read(m_iLastFXTime); - saved_game.read(m_iDieTime); - saved_game.read(m_pVehicleInfo); - saved_game.read<>(m_LandTrace); - saved_game.read(m_iRemovedSurfaces); - saved_game.read(m_iTurboTime); - saved_game.read(m_iDropTime); - saved_game.read(m_iSoundDebounceTimer); - saved_game.read(lastShieldInc); - saved_game.read(linkWeaponToggleHeld); - saved_game.read<>(weaponStatus); - saved_game.read<>(turretStatus); - saved_game.read(m_pOldPilot); - saved_game.read(m_safeJumpMountTime); - saved_game.read(m_safeJumpMountRightDot); - } + void Vehicle_t::sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(m_pPilot); + saved_game.write(m_iPilotTime); + saved_game.write(m_bHasHadPilot); + saved_game.write(m_pDroidUnit); + saved_game.write(m_pParentEntity); + saved_game.write(m_iBoarding); + saved_game.write(m_bWasBoarding); + saved_game.skip(3); + saved_game.write(m_vBoardingVelocity); + saved_game.write(m_fTimeModifier); + saved_game.write(m_iLeftWingBone); + saved_game.write(m_iRightWingBone); + saved_game.write(m_iExhaustTag); + saved_game.write(m_iMuzzleTag); + saved_game.write(m_iDroidUnitTag); + saved_game.write(m_iGunnerViewTag); + saved_game.write<>(m_Muzzles); + saved_game.write<>(m_ucmd); + saved_game.write(m_EjectDir); + saved_game.write(m_ulFlags); + saved_game.write(m_vOrientation); + saved_game.write(m_fStrafeTime); + saved_game.write(m_vPrevOrientation); + saved_game.write(m_vAngularVelocity); + saved_game.write(m_vFullAngleVelocity); + saved_game.write(m_iArmor); + saved_game.write(m_iShields); + saved_game.write(m_iLastFXTime); + saved_game.write(m_iDieTime); + saved_game.write(m_pVehicleInfo); + saved_game.write<>(m_LandTrace); + saved_game.write(m_iRemovedSurfaces); + saved_game.write(m_iTurboTime); + saved_game.write(m_iDropTime); + saved_game.write(m_iSoundDebounceTimer); + saved_game.write(lastShieldInc); + saved_game.write(linkWeaponToggleHeld); + saved_game.write<>(weaponStatus); + saved_game.write<>(turretStatus); + saved_game.write(m_pOldPilot); + saved_game.write(m_safeJumpMountTime); + saved_game.write(m_safeJumpMountRightDot); + } + + void Vehicle_t::sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(m_pPilot); + saved_game.read(m_iPilotTime); + saved_game.read(m_bHasHadPilot); + saved_game.read(m_pDroidUnit); + saved_game.read(m_pParentEntity); + saved_game.read(m_iBoarding); + saved_game.read(m_bWasBoarding); + saved_game.skip(3); + saved_game.read(m_vBoardingVelocity); + saved_game.read(m_fTimeModifier); + saved_game.read(m_iLeftWingBone); + saved_game.read(m_iRightWingBone); + saved_game.read(m_iExhaustTag); + saved_game.read(m_iMuzzleTag); + saved_game.read(m_iDroidUnitTag); + saved_game.read(m_iGunnerViewTag); + saved_game.read<>(m_Muzzles); + saved_game.read<>(m_ucmd); + saved_game.read(m_EjectDir); + saved_game.read(m_ulFlags); + saved_game.read(m_vOrientation); + saved_game.read(m_fStrafeTime); + saved_game.read(m_vPrevOrientation); + saved_game.read(m_vAngularVelocity); + saved_game.read(m_vFullAngleVelocity); + saved_game.read(m_iArmor); + saved_game.read(m_iShields); + saved_game.read(m_iLastFXTime); + saved_game.read(m_iDieTime); + saved_game.read(m_pVehicleInfo); + saved_game.read<>(m_LandTrace); + saved_game.read(m_iRemovedSurfaces); + saved_game.read(m_iTurboTime); + saved_game.read(m_iDropTime); + saved_game.read(m_iSoundDebounceTimer); + saved_game.read(lastShieldInc); + saved_game.read(linkWeaponToggleHeld); + saved_game.read<>(weaponStatus); + saved_game.read<>(turretStatus); + saved_game.read(m_pOldPilot); + saved_game.read(m_safeJumpMountTime); + saved_game.read(m_safeJumpMountRightDot); + } }; extern int BG_VehicleGetIndex( const char *vehicleName ); diff --git a/code/game/ghoul2_shared.h b/code/game/ghoul2_shared.h index 8cf64dd794..8103eaaf6d 100644 --- a/code/game/ghoul2_shared.h +++ b/code/game/ghoul2_shared.h @@ -59,27 +59,27 @@ surfaceInfo_t(): {} - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(offFlags); - saved_game.write(surface); - saved_game.write(genBarycentricJ); - saved_game.write(genBarycentricI); - saved_game.write(genPolySurfaceIndex); - saved_game.write(genLod); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(offFlags); - saved_game.read(surface); - saved_game.read(genBarycentricJ); - saved_game.read(genBarycentricI); - saved_game.read(genPolySurfaceIndex); - saved_game.read(genLod); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(offFlags); + saved_game.write(surface); + saved_game.write(genBarycentricJ); + saved_game.write(genBarycentricI); + saved_game.write(genPolySurfaceIndex); + saved_game.write(genLod); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(offFlags); + saved_game.read(surface); + saved_game.read(genBarycentricJ); + saved_game.read(genBarycentricI); + saved_game.read(genPolySurfaceIndex); + saved_game.read(genLod); + } }; #define BONE_ANGLES_PREMULT 0x0001 @@ -215,157 +215,157 @@ boneInfo_t(): } - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(boneNumber); - saved_game.write<>(matrix); - saved_game.write(flags); - saved_game.write(startFrame); - saved_game.write(endFrame); - saved_game.write(startTime); - saved_game.write(pauseTime); - saved_game.write(animSpeed); - saved_game.write(blendFrame); - saved_game.write(blendLerpFrame); - saved_game.write(blendTime); - saved_game.write(blendStart); - saved_game.write(boneBlendTime); - saved_game.write(boneBlendStart); - saved_game.write(newMatrix); + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(boneNumber); + saved_game.write<>(matrix); + saved_game.write(flags); + saved_game.write(startFrame); + saved_game.write(endFrame); + saved_game.write(startTime); + saved_game.write(pauseTime); + saved_game.write(animSpeed); + saved_game.write(blendFrame); + saved_game.write(blendLerpFrame); + saved_game.write(blendTime); + saved_game.write(blendStart); + saved_game.write(boneBlendTime); + saved_game.write(boneBlendStart); + saved_game.write(newMatrix); #ifndef JK2_MODE - saved_game.write(lastTimeUpdated); - saved_game.write(lastContents); - saved_game.write(lastPosition); - saved_game.write(velocityEffector); - saved_game.write(lastAngles); - saved_game.write(minAngles); - saved_game.write(maxAngles); - saved_game.write(currentAngles); - saved_game.write(anglesOffset); - saved_game.write(positionOffset); - saved_game.write(radius); - saved_game.write(weight); - saved_game.write(ragIndex); - saved_game.write(velocityRoot); - saved_game.write(ragStartTime); - saved_game.write(firstTime); - saved_game.write(firstCollisionTime); - saved_game.write(restTime); - saved_game.write(RagFlags); - saved_game.write(DependentRagIndexMask); - saved_game.write<>(originalTrueBoneMatrix); - saved_game.write<>(parentTrueBoneMatrix); - saved_game.write<>(parentOriginalTrueBoneMatrix); - saved_game.write(originalOrigin); - saved_game.write(originalAngles); - saved_game.write(lastShotDir); - saved_game.write(basepose); - saved_game.write(baseposeInv); - saved_game.write(baseposeParent); - saved_game.write(baseposeInvParent); - saved_game.write(parentRawBoneIndex); - saved_game.write<>(ragOverrideMatrix); - saved_game.write<>(extraMatrix); - saved_game.write(extraVec1); - saved_game.write(extraFloat1); - saved_game.write(extraInt1); - saved_game.write(ikPosition); - saved_game.write(ikSpeed); - saved_game.write(epVelocity); - saved_game.write(epGravFactor); - saved_game.write(solidCount); - saved_game.write(physicsSettled); - saved_game.write(snapped); - saved_game.skip(2); - saved_game.write(parentBoneIndex); - saved_game.write(offsetRotation); - saved_game.write(overGradSpeed); - saved_game.write(overGoalSpot); - saved_game.write(hasOverGoal); - saved_game.skip(3); - saved_game.write<>(animFrameMatrix); - saved_game.write(hasAnimFrameMatrix); - saved_game.write(airTime); + saved_game.write(lastTimeUpdated); + saved_game.write(lastContents); + saved_game.write(lastPosition); + saved_game.write(velocityEffector); + saved_game.write(lastAngles); + saved_game.write(minAngles); + saved_game.write(maxAngles); + saved_game.write(currentAngles); + saved_game.write(anglesOffset); + saved_game.write(positionOffset); + saved_game.write(radius); + saved_game.write(weight); + saved_game.write(ragIndex); + saved_game.write(velocityRoot); + saved_game.write(ragStartTime); + saved_game.write(firstTime); + saved_game.write(firstCollisionTime); + saved_game.write(restTime); + saved_game.write(RagFlags); + saved_game.write(DependentRagIndexMask); + saved_game.write<>(originalTrueBoneMatrix); + saved_game.write<>(parentTrueBoneMatrix); + saved_game.write<>(parentOriginalTrueBoneMatrix); + saved_game.write(originalOrigin); + saved_game.write(originalAngles); + saved_game.write(lastShotDir); + saved_game.write(basepose); + saved_game.write(baseposeInv); + saved_game.write(baseposeParent); + saved_game.write(baseposeInvParent); + saved_game.write(parentRawBoneIndex); + saved_game.write<>(ragOverrideMatrix); + saved_game.write<>(extraMatrix); + saved_game.write(extraVec1); + saved_game.write(extraFloat1); + saved_game.write(extraInt1); + saved_game.write(ikPosition); + saved_game.write(ikSpeed); + saved_game.write(epVelocity); + saved_game.write(epGravFactor); + saved_game.write(solidCount); + saved_game.write(physicsSettled); + saved_game.write(snapped); + saved_game.skip(2); + saved_game.write(parentBoneIndex); + saved_game.write(offsetRotation); + saved_game.write(overGradSpeed); + saved_game.write(overGoalSpot); + saved_game.write(hasOverGoal); + saved_game.skip(3); + saved_game.write<>(animFrameMatrix); + saved_game.write(hasAnimFrameMatrix); + saved_game.write(airTime); #endif // !JK2_MODE - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(boneNumber); - saved_game.read<>(matrix); - saved_game.read(flags); - saved_game.read(startFrame); - saved_game.read(endFrame); - saved_game.read(startTime); - saved_game.read(pauseTime); - saved_game.read(animSpeed); - saved_game.read(blendFrame); - saved_game.read(blendLerpFrame); - saved_game.read(blendTime); - saved_game.read(blendStart); - saved_game.read(boneBlendTime); - saved_game.read(boneBlendStart); - saved_game.read(newMatrix); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(boneNumber); + saved_game.read<>(matrix); + saved_game.read(flags); + saved_game.read(startFrame); + saved_game.read(endFrame); + saved_game.read(startTime); + saved_game.read(pauseTime); + saved_game.read(animSpeed); + saved_game.read(blendFrame); + saved_game.read(blendLerpFrame); + saved_game.read(blendTime); + saved_game.read(blendStart); + saved_game.read(boneBlendTime); + saved_game.read(boneBlendStart); + saved_game.read(newMatrix); #ifndef JK2_MODE - saved_game.read(lastTimeUpdated); - saved_game.read(lastContents); - saved_game.read(lastPosition); - saved_game.read(velocityEffector); - saved_game.read(lastAngles); - saved_game.read(minAngles); - saved_game.read(maxAngles); - saved_game.read(currentAngles); - saved_game.read(anglesOffset); - saved_game.read(positionOffset); - saved_game.read(radius); - saved_game.read(weight); - saved_game.read(ragIndex); - saved_game.read(velocityRoot); - saved_game.read(ragStartTime); - saved_game.read(firstTime); - saved_game.read(firstCollisionTime); - saved_game.read(restTime); - saved_game.read(RagFlags); - saved_game.read(DependentRagIndexMask); - saved_game.read<>(originalTrueBoneMatrix); - saved_game.read<>(parentTrueBoneMatrix); - saved_game.read<>(parentOriginalTrueBoneMatrix); - saved_game.read(originalOrigin); - saved_game.read(originalAngles); - saved_game.read(lastShotDir); - saved_game.read(basepose); - saved_game.read(baseposeInv); - saved_game.read(baseposeParent); - saved_game.read(baseposeInvParent); - saved_game.read(parentRawBoneIndex); - saved_game.read<>(ragOverrideMatrix); - saved_game.read<>(extraMatrix); - saved_game.read(extraVec1); - saved_game.read(extraFloat1); - saved_game.read(extraInt1); - saved_game.read(ikPosition); - saved_game.read(ikSpeed); - saved_game.read(epVelocity); - saved_game.read(epGravFactor); - saved_game.read(solidCount); - saved_game.read(physicsSettled); - saved_game.read(snapped); - saved_game.skip(2); - saved_game.read(parentBoneIndex); - saved_game.read(offsetRotation); - saved_game.read(overGradSpeed); - saved_game.read(overGoalSpot); - saved_game.read(hasOverGoal); - saved_game.skip(3); - saved_game.read<>(animFrameMatrix); - saved_game.read(hasAnimFrameMatrix); - saved_game.read(airTime); + saved_game.read(lastTimeUpdated); + saved_game.read(lastContents); + saved_game.read(lastPosition); + saved_game.read(velocityEffector); + saved_game.read(lastAngles); + saved_game.read(minAngles); + saved_game.read(maxAngles); + saved_game.read(currentAngles); + saved_game.read(anglesOffset); + saved_game.read(positionOffset); + saved_game.read(radius); + saved_game.read(weight); + saved_game.read(ragIndex); + saved_game.read(velocityRoot); + saved_game.read(ragStartTime); + saved_game.read(firstTime); + saved_game.read(firstCollisionTime); + saved_game.read(restTime); + saved_game.read(RagFlags); + saved_game.read(DependentRagIndexMask); + saved_game.read<>(originalTrueBoneMatrix); + saved_game.read<>(parentTrueBoneMatrix); + saved_game.read<>(parentOriginalTrueBoneMatrix); + saved_game.read(originalOrigin); + saved_game.read(originalAngles); + saved_game.read(lastShotDir); + saved_game.read(basepose); + saved_game.read(baseposeInv); + saved_game.read(baseposeParent); + saved_game.read(baseposeInvParent); + saved_game.read(parentRawBoneIndex); + saved_game.read<>(ragOverrideMatrix); + saved_game.read<>(extraMatrix); + saved_game.read(extraVec1); + saved_game.read(extraFloat1); + saved_game.read(extraInt1); + saved_game.read(ikPosition); + saved_game.read(ikSpeed); + saved_game.read(epVelocity); + saved_game.read(epGravFactor); + saved_game.read(solidCount); + saved_game.read(physicsSettled); + saved_game.read(snapped); + saved_game.skip(2); + saved_game.read(parentBoneIndex); + saved_game.read(offsetRotation); + saved_game.read(overGradSpeed); + saved_game.read(overGoalSpot); + saved_game.read(hasOverGoal); + saved_game.skip(3); + saved_game.read<>(animFrameMatrix); + saved_game.read(hasAnimFrameMatrix); + saved_game.read(airTime); #endif // JK2_MODE - } + } }; //we save from top to boltUsed here. Don't bother saving the position, it gets rebuilt every frame anyway struct boltInfo_t{ @@ -381,23 +381,23 @@ struct boltInfo_t{ {} - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(boneNumber); - saved_game.write(surfaceNumber); - saved_game.write(surfaceType); - saved_game.write(boltUsed); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(boneNumber); - saved_game.read(surfaceNumber); - saved_game.read(surfaceType); - saved_game.read(boltUsed); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(boneNumber); + saved_game.write(surfaceNumber); + saved_game.write(surfaceType); + saved_game.write(boltUsed); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(boneNumber); + saved_game.read(surfaceNumber); + saved_game.read(surfaceType); + saved_game.read(boltUsed); + } }; @@ -515,61 +515,61 @@ class CGhoul2Info } - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(mModelindex); + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(mModelindex); #ifndef JK2_MODE - saved_game.write(animModelIndexOffset); + saved_game.write(animModelIndexOffset); #endif // !JK2_MODE - saved_game.write(mCustomShader); - saved_game.write(mCustomSkin); - saved_game.write(mModelBoltLink); - saved_game.write(mSurfaceRoot); - saved_game.write(mLodBias); - saved_game.write(mNewOrigin); + saved_game.write(mCustomShader); + saved_game.write(mCustomSkin); + saved_game.write(mModelBoltLink); + saved_game.write(mSurfaceRoot); + saved_game.write(mLodBias); + saved_game.write(mNewOrigin); #ifdef _G2_GORE - saved_game.write(mGoreSetTag); + saved_game.write(mGoreSetTag); #endif // _G2_GORE - saved_game.write(mModel); - saved_game.write(mFileName); - saved_game.write(mAnimFrameDefault); - saved_game.write(mSkelFrameNum); - saved_game.write(mMeshFrameNum); - saved_game.write(mFlags); - } + saved_game.write(mModel); + saved_game.write(mFileName); + saved_game.write(mAnimFrameDefault); + saved_game.write(mSkelFrameNum); + saved_game.write(mMeshFrameNum); + saved_game.write(mFlags); + } - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(mModelindex); + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(mModelindex); #ifndef JK2_MODE - saved_game.read(animModelIndexOffset); + saved_game.read(animModelIndexOffset); #endif // !JK2_MODE - saved_game.read(mCustomShader); - saved_game.read(mCustomSkin); - saved_game.read(mModelBoltLink); - saved_game.read(mSurfaceRoot); - saved_game.read(mLodBias); - saved_game.read(mNewOrigin); + saved_game.read(mCustomShader); + saved_game.read(mCustomSkin); + saved_game.read(mModelBoltLink); + saved_game.read(mSurfaceRoot); + saved_game.read(mLodBias); + saved_game.read(mNewOrigin); #ifdef _G2_GORE - saved_game.read(mGoreSetTag); + saved_game.read(mGoreSetTag); #endif // _G2_GORE - saved_game.read(mModel); - saved_game.read(mFileName); - saved_game.read(mAnimFrameDefault); - saved_game.read(mSkelFrameNum); - saved_game.read(mMeshFrameNum); - saved_game.read(mFlags); - } + saved_game.read(mModel); + saved_game.read(mFileName); + saved_game.read(mAnimFrameDefault); + saved_game.read(mSkelFrameNum); + saved_game.read(mMeshFrameNum); + saved_game.read(mFlags); + } }; class CGhoul2Info_v; @@ -722,17 +722,17 @@ class CGhoul2Info_v } - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(mItem); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(mItem); + } - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(mItem); - } + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(mItem); + } }; @@ -763,39 +763,39 @@ class CCollisionRecord {} - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(mDistance); - saved_game.write(mEntityNum); - saved_game.write(mModelIndex); - saved_game.write(mPolyIndex); - saved_game.write(mSurfaceIndex); - saved_game.write(mCollisionPosition); - saved_game.write(mCollisionNormal); - saved_game.write(mFlags); - saved_game.write(mMaterial); - saved_game.write(mLocation); - saved_game.write(mBarycentricI); - saved_game.write(mBarycentricJ); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(mDistance); - saved_game.read(mEntityNum); - saved_game.read(mModelIndex); - saved_game.read(mPolyIndex); - saved_game.read(mSurfaceIndex); - saved_game.read(mCollisionPosition); - saved_game.read(mCollisionNormal); - saved_game.read(mFlags); - saved_game.read(mMaterial); - saved_game.read(mLocation); - saved_game.read(mBarycentricI); - saved_game.read(mBarycentricJ); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(mDistance); + saved_game.write(mEntityNum); + saved_game.write(mModelIndex); + saved_game.write(mPolyIndex); + saved_game.write(mSurfaceIndex); + saved_game.write(mCollisionPosition); + saved_game.write(mCollisionNormal); + saved_game.write(mFlags); + saved_game.write(mMaterial); + saved_game.write(mLocation); + saved_game.write(mBarycentricI); + saved_game.write(mBarycentricJ); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(mDistance); + saved_game.read(mEntityNum); + saved_game.read(mModelIndex); + saved_game.read(mPolyIndex); + saved_game.read(mSurfaceIndex); + saved_game.read(mCollisionPosition); + saved_game.read(mCollisionNormal); + saved_game.read(mFlags); + saved_game.read(mMaterial); + saved_game.read(mLocation); + saved_game.read(mBarycentricI); + saved_game.read(mBarycentricJ); + } }; // calling defines for the trace function diff --git a/code/icarus/IcarusInterface.h b/code/icarus/IcarusInterface.h index 9c9d451e65..694043f159 100644 --- a/code/icarus/IcarusInterface.h +++ b/code/icarus/IcarusInterface.h @@ -145,7 +145,7 @@ class IGameInterface // Save / Load functions virtual int LinkGame( int gameID, int icarusID ) = 0; - virtual ojk::ISavedGame* get_saved_game_file() = 0; + virtual ojk::ISavedGame* get_saved_game_file() = 0; // Access functions diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index a79f6ad0e7..bbb5f7b0c1 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -1232,25 +1232,25 @@ typedef struct cplane_s { byte pad[2]; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(normal); - saved_game.write(dist); - saved_game.write(type); - saved_game.write(signbits); - saved_game.write(pad); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(normal); - saved_game.read(dist); - saved_game.read(type); - saved_game.read(signbits); - saved_game.read(pad); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(normal); + saved_game.write(dist); + saved_game.write(type); + saved_game.write(signbits); + saved_game.write(pad); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(normal); + saved_game.read(dist); + saved_game.read(type); + saved_game.read(signbits); + saved_game.read(pad); + } } cplane_t; /* @@ -1285,33 +1285,33 @@ Ghoul2 Insert End */ - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(allsolid); - saved_game.write(startsolid); - saved_game.write(fraction); - saved_game.write(endpos); - saved_game.write<>(plane); - saved_game.write(surfaceFlags); - saved_game.write(contents); - saved_game.write(entityNum); - saved_game.write<>(G2CollisionMap); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(allsolid); - saved_game.read(startsolid); - saved_game.read(fraction); - saved_game.read(endpos); - saved_game.read<>(plane); - saved_game.read(surfaceFlags); - saved_game.read(contents); - saved_game.read(entityNum); - saved_game.read<>(G2CollisionMap); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(allsolid); + saved_game.write(startsolid); + saved_game.write(fraction); + saved_game.write(endpos); + saved_game.write<>(plane); + saved_game.write(surfaceFlags); + saved_game.write(contents); + saved_game.write(entityNum); + saved_game.write<>(G2CollisionMap); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(allsolid); + saved_game.read(startsolid); + saved_game.read(fraction); + saved_game.read(endpos); + saved_game.read<>(plane); + saved_game.read(surfaceFlags); + saved_game.read(contents); + saved_game.read(entityNum); + saved_game.read<>(G2CollisionMap); + } } trace_t; // trace->entityNum can also be 0 to (MAX_GENTITIES-1) @@ -1584,31 +1584,31 @@ typedef struct // ..then we'll need the normal to project a mark blob onto the impact point - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(inAction); - saved_game.write(duration); - saved_game.write(lastTime); - saved_game.write(base); - saved_game.write(tip); - saved_game.write(haveOldPos); - saved_game.write(oldPos); - saved_game.write(oldNormal); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(inAction); - saved_game.read(duration); - saved_game.read(lastTime); - saved_game.read(base); - saved_game.read(tip); - saved_game.read(haveOldPos); - saved_game.read(oldPos); - saved_game.read(oldNormal); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(inAction); + saved_game.write(duration); + saved_game.write(lastTime); + saved_game.write(base); + saved_game.write(tip); + saved_game.write(haveOldPos); + saved_game.write(oldPos); + saved_game.write(oldNormal); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(inAction); + saved_game.read(duration); + saved_game.read(lastTime); + saved_game.read(base); + saved_game.read(tip); + saved_game.read(haveOldPos); + saved_game.read(oldPos); + saved_game.read(oldNormal); + } } saberTrail_t; #define MAX_SABER_TRAIL_SEGS 8 @@ -1639,37 +1639,37 @@ typedef struct }; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(active); - saved_game.write(color); - saved_game.write(radius); - saved_game.write(length); - saved_game.write(lengthMax); - saved_game.write(lengthOld); - saved_game.write(muzzlePoint); - saved_game.write(muzzlePointOld); - saved_game.write(muzzleDir); - saved_game.write(muzzleDirOld); - saved_game.write<>(trail); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(active); - saved_game.read(color); - saved_game.read(radius); - saved_game.read(length); - saved_game.read(lengthMax); - saved_game.read(lengthOld); - saved_game.read(muzzlePoint); - saved_game.read(muzzlePointOld); - saved_game.read(muzzleDir); - saved_game.read(muzzleDirOld); - saved_game.read<>(trail); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(active); + saved_game.write(color); + saved_game.write(radius); + saved_game.write(length); + saved_game.write(lengthMax); + saved_game.write(lengthOld); + saved_game.write(muzzlePoint); + saved_game.write(muzzlePointOld); + saved_game.write(muzzleDir); + saved_game.write(muzzleDirOld); + saved_game.write<>(trail); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(active); + saved_game.read(color); + saved_game.read(radius); + saved_game.read(length); + saved_game.read(lengthMax); + saved_game.read(lengthOld); + saved_game.read(muzzlePoint); + saved_game.read(muzzlePointOld); + saved_game.read(muzzleDir); + saved_game.read(muzzleDirOld); + saved_game.read<>(trail); + } } bladeInfo_t; #define MAX_BLADES 8 @@ -1960,167 +1960,167 @@ typedef struct }; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(name); - saved_game.write(fullName); - saved_game.write(type); - saved_game.write(model); - saved_game.write(skin); - saved_game.write(soundOn); - saved_game.write(soundLoop); - saved_game.write(soundOff); - saved_game.write(numBlades); - saved_game.write<>(blade); - saved_game.write(stylesLearned); - saved_game.write(stylesForbidden); - saved_game.write(maxChain); - saved_game.write(forceRestrictions); - saved_game.write(lockBonus); - saved_game.write(parryBonus); - saved_game.write(breakParryBonus); - saved_game.write(breakParryBonus2); - saved_game.write(disarmBonus); - saved_game.write(disarmBonus2); - saved_game.write(singleBladeStyle); - saved_game.write(brokenSaber1); - saved_game.write(brokenSaber2); - saved_game.write(saberFlags); - saved_game.write(saberFlags2); - saved_game.write(spinSound); - saved_game.write(swingSound); - saved_game.write(fallSound); - saved_game.write(moveSpeedScale); - saved_game.write(animSpeedScale); - saved_game.write(kataMove); - saved_game.write(lungeAtkMove); - saved_game.write(jumpAtkUpMove); - saved_game.write(jumpAtkFwdMove); - saved_game.write(jumpAtkBackMove); - saved_game.write(jumpAtkRightMove); - saved_game.write(jumpAtkLeftMove); - saved_game.write(readyAnim); - saved_game.write(drawAnim); - saved_game.write(putawayAnim); - saved_game.write(tauntAnim); - saved_game.write(bowAnim); - saved_game.write(meditateAnim); - saved_game.write(flourishAnim); - saved_game.write(gloatAnim); - saved_game.write(bladeStyle2Start); - saved_game.write(trailStyle); - saved_game.write(g2MarksShader); - saved_game.write(g2WeaponMarkShader); - saved_game.write(hitSound); - saved_game.write(blockSound); - saved_game.write(bounceSound); - saved_game.write(blockEffect); - saved_game.write(hitPersonEffect); - saved_game.write(hitOtherEffect); - saved_game.write(bladeEffect); - saved_game.write(knockbackScale); - saved_game.write(damageScale); - saved_game.write(splashRadius); - saved_game.write(splashDamage); - saved_game.write(splashKnockback); - saved_game.write(trailStyle2); - saved_game.write(g2MarksShader2); - saved_game.write(g2WeaponMarkShader2); - saved_game.write(hit2Sound); - saved_game.write(block2Sound); - saved_game.write(bounce2Sound); - saved_game.write(blockEffect2); - saved_game.write(hitPersonEffect2); - saved_game.write(hitOtherEffect2); - saved_game.write(bladeEffect2); - saved_game.write(knockbackScale2); - saved_game.write(damageScale2); - saved_game.write(splashRadius2); - saved_game.write(splashDamage2); - saved_game.write(splashKnockback2); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(name); - saved_game.read(fullName); - saved_game.read(type); - saved_game.read(model); - saved_game.read(skin); - saved_game.read(soundOn); - saved_game.read(soundLoop); - saved_game.read(soundOff); - saved_game.read(numBlades); - saved_game.read<>(blade); - saved_game.read(stylesLearned); - saved_game.read(stylesForbidden); - saved_game.read(maxChain); - saved_game.read(forceRestrictions); - saved_game.read(lockBonus); - saved_game.read(parryBonus); - saved_game.read(breakParryBonus); - saved_game.read(breakParryBonus2); - saved_game.read(disarmBonus); - saved_game.read(disarmBonus2); - saved_game.read(singleBladeStyle); - saved_game.read(brokenSaber1); - saved_game.read(brokenSaber2); - saved_game.read(saberFlags); - saved_game.read(saberFlags2); - saved_game.read(spinSound); - saved_game.read(swingSound); - saved_game.read(fallSound); - saved_game.read(moveSpeedScale); - saved_game.read(animSpeedScale); - saved_game.read(kataMove); - saved_game.read(lungeAtkMove); - saved_game.read(jumpAtkUpMove); - saved_game.read(jumpAtkFwdMove); - saved_game.read(jumpAtkBackMove); - saved_game.read(jumpAtkRightMove); - saved_game.read(jumpAtkLeftMove); - saved_game.read(readyAnim); - saved_game.read(drawAnim); - saved_game.read(putawayAnim); - saved_game.read(tauntAnim); - saved_game.read(bowAnim); - saved_game.read(meditateAnim); - saved_game.read(flourishAnim); - saved_game.read(gloatAnim); - saved_game.read(bladeStyle2Start); - saved_game.read(trailStyle); - saved_game.read(g2MarksShader); - saved_game.read(g2WeaponMarkShader); - saved_game.read(hitSound); - saved_game.read(blockSound); - saved_game.read(bounceSound); - saved_game.read(blockEffect); - saved_game.read(hitPersonEffect); - saved_game.read(hitOtherEffect); - saved_game.read(bladeEffect); - saved_game.read(knockbackScale); - saved_game.read(damageScale); - saved_game.read(splashRadius); - saved_game.read(splashDamage); - saved_game.read(splashKnockback); - saved_game.read(trailStyle2); - saved_game.read(g2MarksShader2); - saved_game.read(g2WeaponMarkShader2); - saved_game.read(hit2Sound); - saved_game.read(block2Sound); - saved_game.read(bounce2Sound); - saved_game.read(blockEffect2); - saved_game.read(hitPersonEffect2); - saved_game.read(hitOtherEffect2); - saved_game.read(bladeEffect2); - saved_game.read(knockbackScale2); - saved_game.read(damageScale2); - saved_game.read(splashRadius2); - saved_game.read(splashDamage2); - saved_game.read(splashKnockback2); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(name); + saved_game.write(fullName); + saved_game.write(type); + saved_game.write(model); + saved_game.write(skin); + saved_game.write(soundOn); + saved_game.write(soundLoop); + saved_game.write(soundOff); + saved_game.write(numBlades); + saved_game.write<>(blade); + saved_game.write(stylesLearned); + saved_game.write(stylesForbidden); + saved_game.write(maxChain); + saved_game.write(forceRestrictions); + saved_game.write(lockBonus); + saved_game.write(parryBonus); + saved_game.write(breakParryBonus); + saved_game.write(breakParryBonus2); + saved_game.write(disarmBonus); + saved_game.write(disarmBonus2); + saved_game.write(singleBladeStyle); + saved_game.write(brokenSaber1); + saved_game.write(brokenSaber2); + saved_game.write(saberFlags); + saved_game.write(saberFlags2); + saved_game.write(spinSound); + saved_game.write(swingSound); + saved_game.write(fallSound); + saved_game.write(moveSpeedScale); + saved_game.write(animSpeedScale); + saved_game.write(kataMove); + saved_game.write(lungeAtkMove); + saved_game.write(jumpAtkUpMove); + saved_game.write(jumpAtkFwdMove); + saved_game.write(jumpAtkBackMove); + saved_game.write(jumpAtkRightMove); + saved_game.write(jumpAtkLeftMove); + saved_game.write(readyAnim); + saved_game.write(drawAnim); + saved_game.write(putawayAnim); + saved_game.write(tauntAnim); + saved_game.write(bowAnim); + saved_game.write(meditateAnim); + saved_game.write(flourishAnim); + saved_game.write(gloatAnim); + saved_game.write(bladeStyle2Start); + saved_game.write(trailStyle); + saved_game.write(g2MarksShader); + saved_game.write(g2WeaponMarkShader); + saved_game.write(hitSound); + saved_game.write(blockSound); + saved_game.write(bounceSound); + saved_game.write(blockEffect); + saved_game.write(hitPersonEffect); + saved_game.write(hitOtherEffect); + saved_game.write(bladeEffect); + saved_game.write(knockbackScale); + saved_game.write(damageScale); + saved_game.write(splashRadius); + saved_game.write(splashDamage); + saved_game.write(splashKnockback); + saved_game.write(trailStyle2); + saved_game.write(g2MarksShader2); + saved_game.write(g2WeaponMarkShader2); + saved_game.write(hit2Sound); + saved_game.write(block2Sound); + saved_game.write(bounce2Sound); + saved_game.write(blockEffect2); + saved_game.write(hitPersonEffect2); + saved_game.write(hitOtherEffect2); + saved_game.write(bladeEffect2); + saved_game.write(knockbackScale2); + saved_game.write(damageScale2); + saved_game.write(splashRadius2); + saved_game.write(splashDamage2); + saved_game.write(splashKnockback2); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(name); + saved_game.read(fullName); + saved_game.read(type); + saved_game.read(model); + saved_game.read(skin); + saved_game.read(soundOn); + saved_game.read(soundLoop); + saved_game.read(soundOff); + saved_game.read(numBlades); + saved_game.read<>(blade); + saved_game.read(stylesLearned); + saved_game.read(stylesForbidden); + saved_game.read(maxChain); + saved_game.read(forceRestrictions); + saved_game.read(lockBonus); + saved_game.read(parryBonus); + saved_game.read(breakParryBonus); + saved_game.read(breakParryBonus2); + saved_game.read(disarmBonus); + saved_game.read(disarmBonus2); + saved_game.read(singleBladeStyle); + saved_game.read(brokenSaber1); + saved_game.read(brokenSaber2); + saved_game.read(saberFlags); + saved_game.read(saberFlags2); + saved_game.read(spinSound); + saved_game.read(swingSound); + saved_game.read(fallSound); + saved_game.read(moveSpeedScale); + saved_game.read(animSpeedScale); + saved_game.read(kataMove); + saved_game.read(lungeAtkMove); + saved_game.read(jumpAtkUpMove); + saved_game.read(jumpAtkFwdMove); + saved_game.read(jumpAtkBackMove); + saved_game.read(jumpAtkRightMove); + saved_game.read(jumpAtkLeftMove); + saved_game.read(readyAnim); + saved_game.read(drawAnim); + saved_game.read(putawayAnim); + saved_game.read(tauntAnim); + saved_game.read(bowAnim); + saved_game.read(meditateAnim); + saved_game.read(flourishAnim); + saved_game.read(gloatAnim); + saved_game.read(bladeStyle2Start); + saved_game.read(trailStyle); + saved_game.read(g2MarksShader); + saved_game.read(g2WeaponMarkShader); + saved_game.read(hitSound); + saved_game.read(blockSound); + saved_game.read(bounceSound); + saved_game.read(blockEffect); + saved_game.read(hitPersonEffect); + saved_game.read(hitOtherEffect); + saved_game.read(bladeEffect); + saved_game.read(knockbackScale); + saved_game.read(damageScale); + saved_game.read(splashRadius); + saved_game.read(splashDamage); + saved_game.read(splashKnockback); + saved_game.read(trailStyle2); + saved_game.read(g2MarksShader2); + saved_game.read(g2WeaponMarkShader2); + saved_game.read(hit2Sound); + saved_game.read(block2Sound); + saved_game.read(bounce2Sound); + saved_game.read(blockEffect2); + saved_game.read(hitPersonEffect2); + saved_game.read(hitOtherEffect2); + saved_game.read(bladeEffect2); + saved_game.read(knockbackScale2); + saved_game.read(damageScale2); + saved_game.read(splashRadius2); + saved_game.read(splashDamage2); + saved_game.read(splashKnockback2); + } } saberInfo_t; //NOTE: Below is the *retail* version of the saberInfo_t structure - it is ONLY used for loading retail-version savegames (we load the savegame into this smaller structure, then copy each field into the appropriate field in the new structure - see SG_ConvertRetailSaberinfoToNewSaberinfo() @@ -2242,72 +2242,72 @@ class saberInfoRetail_t }; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(name); - saved_game.write(fullName); - saved_game.write(type); - saved_game.write(model); - saved_game.write(skin); - saved_game.write(soundOn); - saved_game.write(soundLoop); - saved_game.write(soundOff); - saved_game.write(numBlades); - saved_game.write<>(blade); - saved_game.write(style); - saved_game.write(maxChain); - saved_game.write(lockable); - saved_game.write(throwable); - saved_game.write(disarmable); - saved_game.write(activeBlocking); - saved_game.write(twoHanded); - saved_game.write(forceRestrictions); - saved_game.write(lockBonus); - saved_game.write(parryBonus); - saved_game.write(breakParryBonus); - saved_game.write(disarmBonus); - saved_game.write(singleBladeStyle); - saved_game.write(singleBladeThrowable); - saved_game.write(brokenSaber1); - saved_game.write(brokenSaber2); - saved_game.write(returnDamage); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(name); - saved_game.read(fullName); - saved_game.read(type); - saved_game.read(model); - saved_game.read(skin); - saved_game.read(soundOn); - saved_game.read(soundLoop); - saved_game.read(soundOff); - saved_game.read(numBlades); - saved_game.read<>(blade); - saved_game.read(style); - saved_game.read(maxChain); - saved_game.read(lockable); - saved_game.read(throwable); - saved_game.read(disarmable); - saved_game.read(activeBlocking); - saved_game.read(twoHanded); - saved_game.read(forceRestrictions); - saved_game.read(lockBonus); - saved_game.read(parryBonus); - saved_game.read(breakParryBonus); - saved_game.read(disarmBonus); - saved_game.read(singleBladeStyle); - saved_game.read(singleBladeThrowable); - saved_game.read(brokenSaber1); - saved_game.read(brokenSaber2); - saved_game.read(returnDamage); - } - - void sg_export( - saberInfo_t& dst) const; + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(name); + saved_game.write(fullName); + saved_game.write(type); + saved_game.write(model); + saved_game.write(skin); + saved_game.write(soundOn); + saved_game.write(soundLoop); + saved_game.write(soundOff); + saved_game.write(numBlades); + saved_game.write<>(blade); + saved_game.write(style); + saved_game.write(maxChain); + saved_game.write(lockable); + saved_game.write(throwable); + saved_game.write(disarmable); + saved_game.write(activeBlocking); + saved_game.write(twoHanded); + saved_game.write(forceRestrictions); + saved_game.write(lockBonus); + saved_game.write(parryBonus); + saved_game.write(breakParryBonus); + saved_game.write(disarmBonus); + saved_game.write(singleBladeStyle); + saved_game.write(singleBladeThrowable); + saved_game.write(brokenSaber1); + saved_game.write(brokenSaber2); + saved_game.write(returnDamage); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(name); + saved_game.read(fullName); + saved_game.read(type); + saved_game.read(model); + saved_game.read(skin); + saved_game.read(soundOn); + saved_game.read(soundLoop); + saved_game.read(soundOff); + saved_game.read(numBlades); + saved_game.read<>(blade); + saved_game.read(style); + saved_game.read(maxChain); + saved_game.read(lockable); + saved_game.read(throwable); + saved_game.read(disarmable); + saved_game.read(activeBlocking); + saved_game.read(twoHanded); + saved_game.read(forceRestrictions); + saved_game.read(lockBonus); + saved_game.read(parryBonus); + saved_game.read(breakParryBonus); + saved_game.read(disarmBonus); + saved_game.read(singleBladeStyle); + saved_game.read(singleBladeThrowable); + saved_game.read(brokenSaber1); + saved_game.read(brokenSaber2); + saved_game.read(returnDamage); + } + + void sg_export( + saberInfo_t& dst) const; }; // saberInfoRetail_t #define MAX_SABERS 2 // if this ever changes then update the table "static const save_field_t savefields_gClient[]"!!!!!!!!!!!! @@ -2651,343 +2651,343 @@ class PlayerStateBase #endif // !JK2_MODE - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(commandTime); - saved_game.write(pm_type); - saved_game.write(bobCycle); - saved_game.write(pm_flags); - saved_game.write(pm_time); - saved_game.write(origin); - saved_game.write(velocity); - saved_game.write(weaponTime); - saved_game.write(weaponChargeTime); - saved_game.write(rechargeTime); - saved_game.write(gravity); - saved_game.write(leanofs); - saved_game.write(friction); - saved_game.write(speed); - saved_game.write(delta_angles); - saved_game.write(groundEntityNum); - saved_game.write(legsAnim); - saved_game.write(legsAnimTimer); - saved_game.write(torsoAnim); - saved_game.write(torsoAnimTimer); - saved_game.write(movementDir); - saved_game.write(eFlags); - saved_game.write(eventSequence); - saved_game.write(events); - saved_game.write(eventParms); - saved_game.write(externalEvent); - saved_game.write(externalEventParm); - saved_game.write(externalEventTime); - saved_game.write(clientNum); - saved_game.write(weapon); - saved_game.write(weaponstate); - saved_game.write(batteryCharge); - saved_game.write(viewangles); - saved_game.write(legsYaw); - saved_game.write(viewheight); - saved_game.write(damageEvent); - saved_game.write(damageYaw); - saved_game.write(damagePitch); - saved_game.write(damageCount); - saved_game.write(stats); - saved_game.write(persistant); - saved_game.write(powerups); - saved_game.write(ammo); - saved_game.write(inventory); - saved_game.write(security_key_message); - saved_game.write(serverViewOrg); - saved_game.write(saberInFlight); + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(commandTime); + saved_game.write(pm_type); + saved_game.write(bobCycle); + saved_game.write(pm_flags); + saved_game.write(pm_time); + saved_game.write(origin); + saved_game.write(velocity); + saved_game.write(weaponTime); + saved_game.write(weaponChargeTime); + saved_game.write(rechargeTime); + saved_game.write(gravity); + saved_game.write(leanofs); + saved_game.write(friction); + saved_game.write(speed); + saved_game.write(delta_angles); + saved_game.write(groundEntityNum); + saved_game.write(legsAnim); + saved_game.write(legsAnimTimer); + saved_game.write(torsoAnim); + saved_game.write(torsoAnimTimer); + saved_game.write(movementDir); + saved_game.write(eFlags); + saved_game.write(eventSequence); + saved_game.write(events); + saved_game.write(eventParms); + saved_game.write(externalEvent); + saved_game.write(externalEventParm); + saved_game.write(externalEventTime); + saved_game.write(clientNum); + saved_game.write(weapon); + saved_game.write(weaponstate); + saved_game.write(batteryCharge); + saved_game.write(viewangles); + saved_game.write(legsYaw); + saved_game.write(viewheight); + saved_game.write(damageEvent); + saved_game.write(damageYaw); + saved_game.write(damagePitch); + saved_game.write(damageCount); + saved_game.write(stats); + saved_game.write(persistant); + saved_game.write(powerups); + saved_game.write(ammo); + saved_game.write(inventory); + saved_game.write(security_key_message); + saved_game.write(serverViewOrg); + saved_game.write(saberInFlight); #ifdef JK2_MODE - saved_game.write(saberActive); - saved_game.write(vehicleModel); - saved_game.write(viewEntity); - saved_game.write(saberColor); - saved_game.write(saberLength); - saved_game.write(saberLengthMax); - saved_game.write(forcePowersActive); + saved_game.write(saberActive); + saved_game.write(vehicleModel); + saved_game.write(viewEntity); + saved_game.write(saberColor); + saved_game.write(saberLength); + saved_game.write(saberLengthMax); + saved_game.write(forcePowersActive); #else - saved_game.write(viewEntity); - saved_game.write(forcePowersActive); + saved_game.write(viewEntity); + saved_game.write(forcePowersActive); #endif // JK2_MODE - saved_game.write(useTime); - saved_game.write(lastShotTime); - saved_game.write(ping); - saved_game.write(lastOnGround); - saved_game.write(lastStationary); - saved_game.write(weaponShotCount); + saved_game.write(useTime); + saved_game.write(lastShotTime); + saved_game.write(ping); + saved_game.write(lastOnGround); + saved_game.write(lastStationary); + saved_game.write(weaponShotCount); #ifndef JK2_MODE - saved_game.write<>(saber); - saved_game.write(dualSabers); + saved_game.write<>(saber); + saved_game.write(dualSabers); #endif // !JK2_MODE - saved_game.write(saberMove); + saved_game.write(saberMove); #ifndef JK2_MODE - saved_game.write(saberMoveNext); + saved_game.write(saberMoveNext); #endif // !JK2_MODE - saved_game.write(saberBounceMove); - saved_game.write(saberBlocking); - saved_game.write(saberBlocked); - saved_game.write(leanStopDebounceTime); + saved_game.write(saberBounceMove); + saved_game.write(saberBlocking); + saved_game.write(saberBlocked); + saved_game.write(leanStopDebounceTime); #ifdef JK2_MODE - saved_game.skip(2); - saved_game.write(saberLengthOld); + saved_game.skip(2); + saved_game.write(saberLengthOld); #endif // JK2_MODE - saved_game.write(saberEntityNum); - saved_game.write(saberEntityDist); - saved_game.write(saberThrowTime); - saved_game.write(saberEntityState); - saved_game.write(saberDamageDebounceTime); - saved_game.write(saberHitWallSoundDebounceTime); - saved_game.write(saberEventFlags); - saved_game.write(saberBlockingTime); - saved_game.write(saberAnimLevel); - saved_game.write(saberAttackChainCount); - saved_game.write(saberLockTime); - saved_game.write(saberLockEnemy); + saved_game.write(saberEntityNum); + saved_game.write(saberEntityDist); + saved_game.write(saberThrowTime); + saved_game.write(saberEntityState); + saved_game.write(saberDamageDebounceTime); + saved_game.write(saberHitWallSoundDebounceTime); + saved_game.write(saberEventFlags); + saved_game.write(saberBlockingTime); + saved_game.write(saberAnimLevel); + saved_game.write(saberAttackChainCount); + saved_game.write(saberLockTime); + saved_game.write(saberLockEnemy); #ifndef JK2_MODE - saved_game.write(saberStylesKnown); + saved_game.write(saberStylesKnown); #endif // !JK2_MODE #ifdef JK2_MODE - saved_game.write(saberModel); + saved_game.write(saberModel); #endif // JK2_MODE - saved_game.write(forcePowersKnown); - saved_game.write(forcePowerDuration); - saved_game.write(forcePowerDebounce); - saved_game.write(forcePower); - saved_game.write(forcePowerMax); - saved_game.write(forcePowerRegenDebounceTime); + saved_game.write(forcePowersKnown); + saved_game.write(forcePowerDuration); + saved_game.write(forcePowerDebounce); + saved_game.write(forcePower); + saved_game.write(forcePowerMax); + saved_game.write(forcePowerRegenDebounceTime); #ifndef JK2_MODE - saved_game.write(forcePowerRegenRate); - saved_game.write(forcePowerRegenAmount); + saved_game.write(forcePowerRegenRate); + saved_game.write(forcePowerRegenAmount); #endif // !JK2_MODE - saved_game.write(forcePowerLevel); - saved_game.write(forceJumpZStart); - saved_game.write(forceJumpCharge); - saved_game.write(forceGripEntityNum); - saved_game.write(forceGripOrg); + saved_game.write(forcePowerLevel); + saved_game.write(forceJumpZStart); + saved_game.write(forceJumpCharge); + saved_game.write(forceGripEntityNum); + saved_game.write(forceGripOrg); #ifndef JK2_MODE - saved_game.write(forceDrainEntityNum); - saved_game.write(forceDrainOrg); + saved_game.write(forceDrainEntityNum); + saved_game.write(forceDrainOrg); #endif // !JK2_MODE - saved_game.write(forceHealCount); + saved_game.write(forceHealCount); #ifndef JK2_MODE - saved_game.write(forceAllowDeactivateTime); - saved_game.write(forceRageDrainTime); - saved_game.write(forceRageRecoveryTime); - saved_game.write(forceDrainEntNum); - saved_game.write(forceDrainTime); - saved_game.write(forcePowersForced); - saved_game.write(pullAttackEntNum); - saved_game.write(pullAttackTime); - saved_game.write(lastKickedEntNum); + saved_game.write(forceAllowDeactivateTime); + saved_game.write(forceRageDrainTime); + saved_game.write(forceRageRecoveryTime); + saved_game.write(forceDrainEntNum); + saved_game.write(forceDrainTime); + saved_game.write(forcePowersForced); + saved_game.write(pullAttackEntNum); + saved_game.write(pullAttackTime); + saved_game.write(lastKickedEntNum); #endif // !JK2_MODE - saved_game.write(taunting); - saved_game.write(jumpZStart); - saved_game.write(moveDir); - saved_game.write(waterheight); - saved_game.write(waterHeightLevel); + saved_game.write(taunting); + saved_game.write(jumpZStart); + saved_game.write(moveDir); + saved_game.write(waterheight); + saved_game.write(waterHeightLevel); #ifndef JK2_MODE - saved_game.write(ikStatus); - saved_game.write(heldClient); - saved_game.write(heldByClient); - saved_game.write(heldByBolt); - saved_game.write(heldByBone); - saved_game.write(vehTurnaroundIndex); - saved_game.write(vehTurnaroundTime); - saved_game.write(brokenLimbs); - saved_game.write(electrifyTime); + saved_game.write(ikStatus); + saved_game.write(heldClient); + saved_game.write(heldByClient); + saved_game.write(heldByBolt); + saved_game.write(heldByBone); + saved_game.write(vehTurnaroundIndex); + saved_game.write(vehTurnaroundTime); + saved_game.write(brokenLimbs); + saved_game.write(electrifyTime); #endif // !JK2_MODE - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(commandTime); - saved_game.read(pm_type); - saved_game.read(bobCycle); - saved_game.read(pm_flags); - saved_game.read(pm_time); - saved_game.read(origin); - saved_game.read(velocity); - saved_game.read(weaponTime); - saved_game.read(weaponChargeTime); - saved_game.read(rechargeTime); - saved_game.read(gravity); - saved_game.read(leanofs); - saved_game.read(friction); - saved_game.read(speed); - saved_game.read(delta_angles); - saved_game.read(groundEntityNum); - saved_game.read(legsAnim); - saved_game.read(legsAnimTimer); - saved_game.read(torsoAnim); - saved_game.read(torsoAnimTimer); - saved_game.read(movementDir); - saved_game.read(eFlags); - saved_game.read(eventSequence); - saved_game.read(events); - saved_game.read(eventParms); - saved_game.read(externalEvent); - saved_game.read(externalEventParm); - saved_game.read(externalEventTime); - saved_game.read(clientNum); - saved_game.read(weapon); - saved_game.read(weaponstate); - saved_game.read(batteryCharge); - saved_game.read(viewangles); - saved_game.read(legsYaw); - saved_game.read(viewheight); - saved_game.read(damageEvent); - saved_game.read(damageYaw); - saved_game.read(damagePitch); - saved_game.read(damageCount); - saved_game.read(stats); - saved_game.read(persistant); - saved_game.read(powerups); - saved_game.read(ammo); - saved_game.read(inventory); - saved_game.read(security_key_message); - saved_game.read(serverViewOrg); - saved_game.read(saberInFlight); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(commandTime); + saved_game.read(pm_type); + saved_game.read(bobCycle); + saved_game.read(pm_flags); + saved_game.read(pm_time); + saved_game.read(origin); + saved_game.read(velocity); + saved_game.read(weaponTime); + saved_game.read(weaponChargeTime); + saved_game.read(rechargeTime); + saved_game.read(gravity); + saved_game.read(leanofs); + saved_game.read(friction); + saved_game.read(speed); + saved_game.read(delta_angles); + saved_game.read(groundEntityNum); + saved_game.read(legsAnim); + saved_game.read(legsAnimTimer); + saved_game.read(torsoAnim); + saved_game.read(torsoAnimTimer); + saved_game.read(movementDir); + saved_game.read(eFlags); + saved_game.read(eventSequence); + saved_game.read(events); + saved_game.read(eventParms); + saved_game.read(externalEvent); + saved_game.read(externalEventParm); + saved_game.read(externalEventTime); + saved_game.read(clientNum); + saved_game.read(weapon); + saved_game.read(weaponstate); + saved_game.read(batteryCharge); + saved_game.read(viewangles); + saved_game.read(legsYaw); + saved_game.read(viewheight); + saved_game.read(damageEvent); + saved_game.read(damageYaw); + saved_game.read(damagePitch); + saved_game.read(damageCount); + saved_game.read(stats); + saved_game.read(persistant); + saved_game.read(powerups); + saved_game.read(ammo); + saved_game.read(inventory); + saved_game.read(security_key_message); + saved_game.read(serverViewOrg); + saved_game.read(saberInFlight); #ifdef JK2_MODE - saved_game.read(saberActive); - saved_game.read(vehicleModel); - saved_game.read(viewEntity); - saved_game.read(saberColor); - saved_game.read(saberLength); - saved_game.read(saberLengthMax); - saved_game.read(forcePowersActive); + saved_game.read(saberActive); + saved_game.read(vehicleModel); + saved_game.read(viewEntity); + saved_game.read(saberColor); + saved_game.read(saberLength); + saved_game.read(saberLengthMax); + saved_game.read(forcePowersActive); #else - saved_game.read(viewEntity); - saved_game.read(forcePowersActive); + saved_game.read(viewEntity); + saved_game.read(forcePowersActive); #endif // JK2_MODE - saved_game.read(useTime); - saved_game.read(lastShotTime); - saved_game.read(ping); - saved_game.read(lastOnGround); - saved_game.read(lastStationary); - saved_game.read(weaponShotCount); + saved_game.read(useTime); + saved_game.read(lastShotTime); + saved_game.read(ping); + saved_game.read(lastOnGround); + saved_game.read(lastStationary); + saved_game.read(weaponShotCount); #ifndef JK2_MODE - saved_game.read<>(saber); - saved_game.read(dualSabers); + saved_game.read<>(saber); + saved_game.read(dualSabers); #endif // !JK2_MODE - saved_game.read(saberMove); + saved_game.read(saberMove); #ifndef JK2_MODE - saved_game.read(saberMoveNext); + saved_game.read(saberMoveNext); #endif // !JK2_MODE - saved_game.read(saberBounceMove); - saved_game.read(saberBlocking); - saved_game.read(saberBlocked); - saved_game.read(leanStopDebounceTime); + saved_game.read(saberBounceMove); + saved_game.read(saberBlocking); + saved_game.read(saberBlocked); + saved_game.read(leanStopDebounceTime); #ifdef JK2_MODE - saved_game.skip(2); - saved_game.read(saberLengthOld); + saved_game.skip(2); + saved_game.read(saberLengthOld); #endif // JK2_MODE - saved_game.read(saberEntityNum); - saved_game.read(saberEntityDist); - saved_game.read(saberThrowTime); - saved_game.read(saberEntityState); - saved_game.read(saberDamageDebounceTime); - saved_game.read(saberHitWallSoundDebounceTime); - saved_game.read(saberEventFlags); - saved_game.read(saberBlockingTime); - saved_game.read(saberAnimLevel); - saved_game.read(saberAttackChainCount); - saved_game.read(saberLockTime); - saved_game.read(saberLockEnemy); + saved_game.read(saberEntityNum); + saved_game.read(saberEntityDist); + saved_game.read(saberThrowTime); + saved_game.read(saberEntityState); + saved_game.read(saberDamageDebounceTime); + saved_game.read(saberHitWallSoundDebounceTime); + saved_game.read(saberEventFlags); + saved_game.read(saberBlockingTime); + saved_game.read(saberAnimLevel); + saved_game.read(saberAttackChainCount); + saved_game.read(saberLockTime); + saved_game.read(saberLockEnemy); #ifndef JK2_MODE - saved_game.read(saberStylesKnown); + saved_game.read(saberStylesKnown); #endif // !JK2_MODE #ifdef JK2_MODE - saved_game.read(saberModel); + saved_game.read(saberModel); #endif // JK2_MODE - saved_game.read(forcePowersKnown); - saved_game.read(forcePowerDuration); - saved_game.read(forcePowerDebounce); - saved_game.read(forcePower); - saved_game.read(forcePowerMax); - saved_game.read(forcePowerRegenDebounceTime); + saved_game.read(forcePowersKnown); + saved_game.read(forcePowerDuration); + saved_game.read(forcePowerDebounce); + saved_game.read(forcePower); + saved_game.read(forcePowerMax); + saved_game.read(forcePowerRegenDebounceTime); #ifndef JK2_MODE - saved_game.read(forcePowerRegenRate); - saved_game.read(forcePowerRegenAmount); + saved_game.read(forcePowerRegenRate); + saved_game.read(forcePowerRegenAmount); #endif // !JK2_MODE - saved_game.read(forcePowerLevel); - saved_game.read(forceJumpZStart); - saved_game.read(forceJumpCharge); - saved_game.read(forceGripEntityNum); - saved_game.read(forceGripOrg); + saved_game.read(forcePowerLevel); + saved_game.read(forceJumpZStart); + saved_game.read(forceJumpCharge); + saved_game.read(forceGripEntityNum); + saved_game.read(forceGripOrg); #ifndef JK2_MODE - saved_game.read(forceDrainEntityNum); - saved_game.read(forceDrainOrg); + saved_game.read(forceDrainEntityNum); + saved_game.read(forceDrainOrg); #endif // !JK2_MODE - saved_game.read(forceHealCount); + saved_game.read(forceHealCount); #ifndef JK2_MODE - saved_game.read(forceAllowDeactivateTime); - saved_game.read(forceRageDrainTime); - saved_game.read(forceRageRecoveryTime); - saved_game.read(forceDrainEntNum); - saved_game.read(forceDrainTime); - saved_game.read(forcePowersForced); - saved_game.read(pullAttackEntNum); - saved_game.read(pullAttackTime); - saved_game.read(lastKickedEntNum); + saved_game.read(forceAllowDeactivateTime); + saved_game.read(forceRageDrainTime); + saved_game.read(forceRageRecoveryTime); + saved_game.read(forceDrainEntNum); + saved_game.read(forceDrainTime); + saved_game.read(forcePowersForced); + saved_game.read(pullAttackEntNum); + saved_game.read(pullAttackTime); + saved_game.read(lastKickedEntNum); #endif // !JK2_MODE - saved_game.read(taunting); - saved_game.read(jumpZStart); - saved_game.read(moveDir); - saved_game.read(waterheight); - saved_game.read(waterHeightLevel); + saved_game.read(taunting); + saved_game.read(jumpZStart); + saved_game.read(moveDir); + saved_game.read(waterheight); + saved_game.read(waterHeightLevel); #ifndef JK2_MODE - saved_game.read(ikStatus); - saved_game.read(heldClient); - saved_game.read(heldByClient); - saved_game.read(heldByBolt); - saved_game.read(heldByBone); - saved_game.read(vehTurnaroundIndex); - saved_game.read(vehTurnaroundTime); - saved_game.read(brokenLimbs); - saved_game.read(electrifyTime); + saved_game.read(ikStatus); + saved_game.read(heldClient); + saved_game.read(heldByClient); + saved_game.read(heldByBolt); + saved_game.read(heldByBone); + saved_game.read(vehTurnaroundIndex); + saved_game.read(vehTurnaroundTime); + saved_game.read(brokenLimbs); + saved_game.read(electrifyTime); #endif // !JK2_MODE - } + } }; // PlayerStateBase @@ -3046,33 +3046,33 @@ typedef struct usercmd_s { signed char forwardmove, rightmove, upmove; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(serverTime); - saved_game.write(buttons); - saved_game.write(weapon); - saved_game.skip(3); - saved_game.write(angles); - saved_game.write(generic_cmd); - saved_game.write(forwardmove); - saved_game.write(rightmove); - saved_game.write(upmove); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(serverTime); - saved_game.read(buttons); - saved_game.read(weapon); - saved_game.skip(3); - saved_game.read(angles); - saved_game.read(generic_cmd); - saved_game.read(forwardmove); - saved_game.read(rightmove); - saved_game.read(upmove); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(serverTime); + saved_game.write(buttons); + saved_game.write(weapon); + saved_game.skip(3); + saved_game.write(angles); + saved_game.write(generic_cmd); + saved_game.write(forwardmove); + saved_game.write(rightmove); + saved_game.write(upmove); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(serverTime); + saved_game.read(buttons); + saved_game.read(weapon); + saved_game.skip(3); + saved_game.read(angles); + saved_game.read(generic_cmd); + saved_game.read(forwardmove); + saved_game.read(rightmove); + saved_game.read(upmove); + } } usercmd_t; //=================================================================== @@ -3098,25 +3098,25 @@ typedef struct {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!! vec3_t trDelta; // velocity, etc - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(trType); - saved_game.write(trTime); - saved_game.write(trDuration); - saved_game.write(trBase); - saved_game.write(trDelta); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(trType); - saved_game.read(trTime); - saved_game.read(trDuration); - saved_game.read(trBase); - saved_game.read(trDelta); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(trType); + saved_game.write(trTime); + saved_game.write(trDuration); + saved_game.write(trBase); + saved_game.write(trDelta); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(trType); + saved_game.read(trTime); + saved_game.read(trDuration); + saved_game.read(trBase); + saved_game.read(trDelta); + } } trajectory_t; @@ -3204,117 +3204,117 @@ Ghoul2 Insert End #endif // !JK2_MODE - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(number); - saved_game.write(eType); - saved_game.write(eFlags); - saved_game.write<>(pos); - saved_game.write<>(apos); - saved_game.write(time); - saved_game.write(time2); - saved_game.write(origin); - saved_game.write(origin2); - saved_game.write(angles); - saved_game.write(angles2); - saved_game.write(otherEntityNum); - saved_game.write(otherEntityNum2); - saved_game.write(groundEntityNum); - saved_game.write(constantLight); - saved_game.write(loopSound); - saved_game.write(modelindex); - saved_game.write(modelindex2); - saved_game.write(modelindex3); - saved_game.write(clientNum); - saved_game.write(frame); - saved_game.write(solid); - saved_game.write(event); - saved_game.write(eventParm); - saved_game.write(powerups); - saved_game.write(weapon); - saved_game.write(legsAnim); - saved_game.write(legsAnimTimer); - saved_game.write(torsoAnim); - saved_game.write(torsoAnimTimer); - saved_game.write(scale); - saved_game.write(saberInFlight); - saved_game.write(saberActive); + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(number); + saved_game.write(eType); + saved_game.write(eFlags); + saved_game.write<>(pos); + saved_game.write<>(apos); + saved_game.write(time); + saved_game.write(time2); + saved_game.write(origin); + saved_game.write(origin2); + saved_game.write(angles); + saved_game.write(angles2); + saved_game.write(otherEntityNum); + saved_game.write(otherEntityNum2); + saved_game.write(groundEntityNum); + saved_game.write(constantLight); + saved_game.write(loopSound); + saved_game.write(modelindex); + saved_game.write(modelindex2); + saved_game.write(modelindex3); + saved_game.write(clientNum); + saved_game.write(frame); + saved_game.write(solid); + saved_game.write(event); + saved_game.write(eventParm); + saved_game.write(powerups); + saved_game.write(weapon); + saved_game.write(legsAnim); + saved_game.write(legsAnimTimer); + saved_game.write(torsoAnim); + saved_game.write(torsoAnimTimer); + saved_game.write(scale); + saved_game.write(saberInFlight); + saved_game.write(saberActive); #ifdef JK2_MODE - saved_game.write(vehicleModel); + saved_game.write(vehicleModel); #endif // JK2_MODE #ifndef JK2_MODE - saved_game.write(vehicleAngles); - saved_game.write(vehicleArmor); - saved_game.write(m_iVehicleNum); + saved_game.write(vehicleAngles); + saved_game.write(vehicleArmor); + saved_game.write(m_iVehicleNum); #endif // !JK2_MODE - saved_game.write(modelScale); - saved_game.write(radius); - saved_game.write(boltInfo); + saved_game.write(modelScale); + saved_game.write(radius); + saved_game.write(boltInfo); #ifndef JK2_MODE - saved_game.write(isPortalEnt); + saved_game.write(isPortalEnt); #endif // !JK2_MODE - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(number); - saved_game.read(eType); - saved_game.read(eFlags); - saved_game.read<>(pos); - saved_game.read<>(apos); - saved_game.read(time); - saved_game.read(time2); - saved_game.read(origin); - saved_game.read(origin2); - saved_game.read(angles); - saved_game.read(angles2); - saved_game.read(otherEntityNum); - saved_game.read(otherEntityNum2); - saved_game.read(groundEntityNum); - saved_game.read(constantLight); - saved_game.read(loopSound); - saved_game.read(modelindex); - saved_game.read(modelindex2); - saved_game.read(modelindex3); - saved_game.read(clientNum); - saved_game.read(frame); - saved_game.read(solid); - saved_game.read(event); - saved_game.read(eventParm); - saved_game.read(powerups); - saved_game.read(weapon); - saved_game.read(legsAnim); - saved_game.read(legsAnimTimer); - saved_game.read(torsoAnim); - saved_game.read(torsoAnimTimer); - saved_game.read(scale); - saved_game.read(saberInFlight); - saved_game.read(saberActive); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(number); + saved_game.read(eType); + saved_game.read(eFlags); + saved_game.read<>(pos); + saved_game.read<>(apos); + saved_game.read(time); + saved_game.read(time2); + saved_game.read(origin); + saved_game.read(origin2); + saved_game.read(angles); + saved_game.read(angles2); + saved_game.read(otherEntityNum); + saved_game.read(otherEntityNum2); + saved_game.read(groundEntityNum); + saved_game.read(constantLight); + saved_game.read(loopSound); + saved_game.read(modelindex); + saved_game.read(modelindex2); + saved_game.read(modelindex3); + saved_game.read(clientNum); + saved_game.read(frame); + saved_game.read(solid); + saved_game.read(event); + saved_game.read(eventParm); + saved_game.read(powerups); + saved_game.read(weapon); + saved_game.read(legsAnim); + saved_game.read(legsAnimTimer); + saved_game.read(torsoAnim); + saved_game.read(torsoAnimTimer); + saved_game.read(scale); + saved_game.read(saberInFlight); + saved_game.read(saberActive); #ifdef JK2_MODE - saved_game.read(vehicleModel); + saved_game.read(vehicleModel); #endif // JK2_MODE #ifndef JK2_MODE - saved_game.read(vehicleAngles); - saved_game.read(vehicleArmor); - saved_game.read(m_iVehicleNum); + saved_game.read(vehicleAngles); + saved_game.read(vehicleArmor); + saved_game.read(m_iVehicleNum); #endif // !JK2_MODE - saved_game.read(modelScale); - saved_game.read(radius); - saved_game.read(boltInfo); + saved_game.read(modelScale); + saved_game.read(radius); + saved_game.read(boltInfo); #ifndef JK2_MODE - saved_game.read(isPortalEnt); + saved_game.read(isPortalEnt); #endif // !JK2_MODE - } + } } entityState_t; diff --git a/code/rd-common/mdx_format.h b/code/rd-common/mdx_format.h index 29bca781be..b2d92b1ad0 100644 --- a/code/rd-common/mdx_format.h +++ b/code/rd-common/mdx_format.h @@ -163,17 +163,17 @@ typedef struct { #ifdef __cplusplus -void sg_export( - ojk::SavedGameHelper& saved_game) const -{ - saved_game.write(matrix); -} + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(matrix); + } -void sg_import( - ojk::SavedGameHelper& saved_game) -{ - saved_game.read(matrix); -} + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(matrix); + } #endif // __cplusplus } mdxaBone_t; #endif diff --git a/code/rd-common/tr_public.h b/code/rd-common/tr_public.h index f14af68715..73e96aa226 100644 --- a/code/rd-common/tr_public.h +++ b/code/rd-common/tr_public.h @@ -112,7 +112,7 @@ typedef struct { const int passEntityNum, const int contentmask, const EG2_Collision eG2TraceType, const int useLod ); - ojk::ISavedGame* saved_game; + ojk::ISavedGame* saved_game; int (*SV_PointContents) ( const vec3_t p, clipHandle_t model ); diff --git a/code/rd-vanilla/G2_API.cpp b/code/rd-vanilla/G2_API.cpp index ccff8dc9a6..433ea7b1bf 100644 --- a/code/rd-vanilla/G2_API.cpp +++ b/code/rd-vanilla/G2_API.cpp @@ -1415,11 +1415,11 @@ qboolean G2API_StopBoneAngles(CGhoul2Info *ghlInfo, const char *boneName) #ifdef JK2_MODE void G2API_SetRagDoll( - CGhoul2Info_v& ghoul2, - CRagDollParams* parms) + CGhoul2Info_v& ghoul2, + CRagDollParams* parms) { - static_cast(ghoul2); - static_cast(parms); + static_cast(ghoul2); + static_cast(parms); } #else //rww - RAGDOLL_BEGIN diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index c0de632dda..7372c21af0 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -110,10 +110,10 @@ static const char *GetString_FailedToOpenSaveGame(const char *psFilename, qboole } void SG_WipeSavegame( - const char* psPathlessBaseName) + const char* psPathlessBaseName) { - ojk::SavedGame::remove( - psPathlessBaseName); + ojk::SavedGame::remove( + psPathlessBaseName); } // called from the ERR_DROP stuff just in case the error occured during loading of a saved game, because if @@ -121,18 +121,18 @@ void SG_WipeSavegame( // void SG_Shutdown() { - auto& saved_game = ojk::SavedGame::get_instance(); + auto& saved_game = ojk::SavedGame::get_instance(); - saved_game.close(); + saved_game.close(); - eSavedGameJustLoaded = eNO; - // important to do this if we ERR_DROP during loading, else next map you load after - // a bad save-file you'll arrive at dead :-) + eSavedGameJustLoaded = eNO; + // important to do this if we ERR_DROP during loading, else next map you load after + // a bad save-file you'll arrive at dead :-) - // and this bit stops people messing up the laoder by repeatedly stabbing at the load key during loads... - // - extern qboolean gbAlreadyDoingLoad; - gbAlreadyDoingLoad = qfalse; + // and this bit stops people messing up the laoder by repeatedly stabbing at the load key during loads... + // + extern qboolean gbAlreadyDoingLoad; + gbAlreadyDoingLoad = qfalse; } void SV_WipeGame_f(void) @@ -981,14 +981,14 @@ static void SG_WriteScreenshot(qboolean qbAutosave, const char *psMapName) if ( qbAutosave ) delete[] byBlank; - saved_game.write_chunk( - INT_ID('S','H','L','N'), - iJPGDataSize); + saved_game.write_chunk( + INT_ID('S', 'H', 'L', 'N'), + iJPGDataSize); - saved_game.write_chunk( - INT_ID('S','H','O','T'), - pJPGData, - static_cast(iJPGDataSize)); + saved_game.write_chunk( + INT_ID('S', 'H', 'O', 'T'), + pJPGData, + static_cast(iJPGDataSize)); Z_Free(pJPGData); SCR_TempRawImage_CleanUp(); @@ -1100,7 +1100,7 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) } ge->WriteLevel(qbAutosave); // always done now, but ent saver only does player if auto - auto is_write_failed = saved_game.is_failed(); + auto is_write_failed = saved_game.is_failed(); saved_game.close(); diff --git a/codeJK2/game/ai.h b/codeJK2/game/ai.h index 337cfc0f11..a3f2c8391e 100644 --- a/codeJK2/game/ai.h +++ b/codeJK2/game/ai.h @@ -114,23 +114,23 @@ class AIGroupMember_t int closestBuddy; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(number); - saved_game.write(waypoint); - saved_game.write(pathCostToEnemy); - saved_game.write(closestBuddy); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(number); - saved_game.read(waypoint); - saved_game.read(pathCostToEnemy); - saved_game.read(closestBuddy); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(number); + saved_game.write(waypoint); + saved_game.write(pathCostToEnemy); + saved_game.write(closestBuddy); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(number); + saved_game.read(waypoint); + saved_game.read(pathCostToEnemy); + saved_game.read(closestBuddy); + } }; // AIGroupMember_t #define MAX_GROUP_MEMBERS 32 @@ -157,49 +157,49 @@ class AIGroupInfo_t AIGroupMember_t member[ MAX_GROUP_MEMBERS ]; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(numGroup); - saved_game.write(processed); - saved_game.write(team); - saved_game.write(enemy); - saved_game.write(enemyWP); - saved_game.write(speechDebounceTime); - saved_game.write(lastClearShotTime); - saved_game.write(lastSeenEnemyTime); - saved_game.write(morale); - saved_game.write(moraleAdjust); - saved_game.write(moraleDebounce); - saved_game.write(memberValidateTime); - saved_game.write(activeMemberNum); - saved_game.write(commander); - saved_game.write(enemyLastSeenPos); - saved_game.write(numState); - saved_game.write<>(member); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(numGroup); - saved_game.read(processed); - saved_game.read(team); - saved_game.read(enemy); - saved_game.read(enemyWP); - saved_game.read(speechDebounceTime); - saved_game.read(lastClearShotTime); - saved_game.read(lastSeenEnemyTime); - saved_game.read(morale); - saved_game.read(moraleAdjust); - saved_game.read(moraleDebounce); - saved_game.read(memberValidateTime); - saved_game.read(activeMemberNum); - saved_game.read(commander); - saved_game.read(enemyLastSeenPos); - saved_game.read(numState); - saved_game.read<>(member); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(numGroup); + saved_game.write(processed); + saved_game.write(team); + saved_game.write(enemy); + saved_game.write(enemyWP); + saved_game.write(speechDebounceTime); + saved_game.write(lastClearShotTime); + saved_game.write(lastSeenEnemyTime); + saved_game.write(morale); + saved_game.write(moraleAdjust); + saved_game.write(moraleDebounce); + saved_game.write(memberValidateTime); + saved_game.write(activeMemberNum); + saved_game.write(commander); + saved_game.write(enemyLastSeenPos); + saved_game.write(numState); + saved_game.write<>(member); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(numGroup); + saved_game.read(processed); + saved_game.read(team); + saved_game.read(enemy); + saved_game.read(enemyWP); + saved_game.read(speechDebounceTime); + saved_game.read(lastClearShotTime); + saved_game.read(lastSeenEnemyTime); + saved_game.read(morale); + saved_game.read(moraleAdjust); + saved_game.read(moraleDebounce); + saved_game.read(memberValidateTime); + saved_game.read(activeMemberNum); + saved_game.read(commander); + saved_game.read(enemyLastSeenPos); + saved_game.read(numState); + saved_game.read<>(member); + } }; // AIGroupInfo_t int AI_GetGroupSize( vec3_t origin, int radius, team_t playerTeam, gentity_t *avoid = NULL ); diff --git a/codeJK2/game/anims.h b/codeJK2/game/anims.h index c941430981..cb479b89f2 100644 --- a/codeJK2/game/anims.h +++ b/codeJK2/game/anims.h @@ -1409,25 +1409,25 @@ class animFileSet_t qboolean soundsCached; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(filename); - saved_game.write<>(animations); - saved_game.write<>(torsoAnimSnds); - saved_game.write<>(legsAnimSnds); - saved_game.write(soundsCached); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(filename); - saved_game.read<>(animations); - saved_game.read<>(torsoAnimSnds); - saved_game.read<>(legsAnimSnds); - saved_game.read(soundsCached); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(filename); + saved_game.write<>(animations); + saved_game.write<>(torsoAnimSnds); + saved_game.write<>(legsAnimSnds); + saved_game.write(soundsCached); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(filename); + saved_game.read<>(animations); + saved_game.read<>(torsoAnimSnds); + saved_game.read<>(legsAnimSnds); + saved_game.read(soundsCached); + } }; // animFileSet_t #define MAX_ANIM_FILES 64 diff --git a/codeJK2/game/b_public.h b/codeJK2/game/b_public.h index b0a73b18b9..6f08c8292b 100644 --- a/codeJK2/game/b_public.h +++ b/codeJK2/game/b_public.h @@ -139,51 +139,51 @@ class gNPCstats_t int acceleration; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(aggression); - saved_game.write(aim); - saved_game.write(earshot); - saved_game.write(evasion); - saved_game.write(hfov); - saved_game.write(intelligence); - saved_game.write(move); - saved_game.write(reactions); - saved_game.write(shootDistance); - saved_game.write(vfov); - saved_game.write(vigilance); - saved_game.write(visrange); - saved_game.write(moveType); - saved_game.write(runSpeed); - saved_game.write(walkSpeed); - saved_game.write(yawSpeed); - saved_game.write(health); - saved_game.write(acceleration); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(aggression); - saved_game.read(aim); - saved_game.read(earshot); - saved_game.read(evasion); - saved_game.read(hfov); - saved_game.read(intelligence); - saved_game.read(move); - saved_game.read(reactions); - saved_game.read(shootDistance); - saved_game.read(vfov); - saved_game.read(vigilance); - saved_game.read(visrange); - saved_game.read(moveType); - saved_game.read(runSpeed); - saved_game.read(walkSpeed); - saved_game.read(yawSpeed); - saved_game.read(health); - saved_game.read(acceleration); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(aggression); + saved_game.write(aim); + saved_game.write(earshot); + saved_game.write(evasion); + saved_game.write(hfov); + saved_game.write(intelligence); + saved_game.write(move); + saved_game.write(reactions); + saved_game.write(shootDistance); + saved_game.write(vfov); + saved_game.write(vigilance); + saved_game.write(visrange); + saved_game.write(moveType); + saved_game.write(runSpeed); + saved_game.write(walkSpeed); + saved_game.write(yawSpeed); + saved_game.write(health); + saved_game.write(acceleration); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(aggression); + saved_game.read(aim); + saved_game.read(earshot); + saved_game.read(evasion); + saved_game.read(hfov); + saved_game.read(intelligence); + saved_game.read(move); + saved_game.read(reactions); + saved_game.read(shootDistance); + saved_game.read(vfov); + saved_game.read(vigilance); + saved_game.read(visrange); + saved_game.read(moveType); + saved_game.read(runSpeed); + saved_game.read(walkSpeed); + saved_game.read(yawSpeed); + saved_game.read(health); + saved_game.read(acceleration); + } }; // gNPCstats_t // NOTE!!! If you add any ptr fields into this structure could you please tell me so I can update the load/save code? @@ -345,215 +345,215 @@ class gNPC_t int ffireFadeDebounce; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(timeOfDeath); - saved_game.write(touchedByPlayer); - saved_game.write(enemyLastVisibility); - saved_game.write(aimTime); - saved_game.write(desiredYaw); - saved_game.write(desiredPitch); - saved_game.write(lockedDesiredYaw); - saved_game.write(lockedDesiredPitch); - saved_game.write(aimingBeam); - saved_game.write(enemyLastSeenLocation); - saved_game.write(enemyLastSeenTime); - saved_game.write(enemyLastHeardLocation); - saved_game.write(enemyLastHeardTime); - saved_game.write(lastAlertID); - saved_game.write(eFlags); - saved_game.write(aiFlags); - saved_game.write(currentAmmo); - saved_game.write(shotTime); - saved_game.write(burstCount); - saved_game.write(burstMin); - saved_game.write(burstMean); - saved_game.write(burstMax); - saved_game.write(burstSpacing); - saved_game.write(attackHold); - saved_game.write(attackHoldTime); - saved_game.write(shootAngles); - saved_game.write(rank); - saved_game.write(behaviorState); - saved_game.write(defaultBehavior); - saved_game.write(tempBehavior); - saved_game.write(ignorePain); - saved_game.write(duckDebounceTime); - saved_game.write(walkDebounceTime); - saved_game.write(enemyCheckDebounceTime); - saved_game.write(investigateDebounceTime); - saved_game.write(investigateCount); - saved_game.write(investigateGoal); - saved_game.write(investigateSoundDebounceTime); - saved_game.write(greetingDebounceTime); - saved_game.write(eventOwner); - saved_game.write(coverTarg); - saved_game.write(jumpState); - saved_game.write(followDist); - saved_game.write(tempGoal); - saved_game.write(goalEntity); - saved_game.write(lastGoalEntity); - saved_game.write(eventualGoal); - saved_game.write(captureGoal); - saved_game.write(defendEnt); - saved_game.write(greetEnt); - saved_game.write(goalTime); - saved_game.write(straightToGoal); - saved_game.write(distToGoal); - saved_game.write(navTime); - saved_game.write(blockingEntNum); - saved_game.write(blockedSpeechDebounceTime); - saved_game.write(lastSideStepSide); - saved_game.write(sideStepHoldTime); - saved_game.write(homeWp); - saved_game.write(group); - saved_game.write(lastPathAngles); - saved_game.write<>(stats); - saved_game.write(aimErrorDebounceTime); - saved_game.write(lastAimErrorYaw); - saved_game.write(lastAimErrorPitch); - saved_game.write(aimOfs); - saved_game.write(currentAim); - saved_game.write(currentAggression); - saved_game.write(scriptFlags); - saved_game.write(desiredSpeed); - saved_game.write(currentSpeed); - saved_game.write(last_forwardmove); - saved_game.write(last_rightmove); - saved_game.skip(2); - saved_game.write(lastClearOrigin); - saved_game.write(consecutiveBlockedMoves); - saved_game.write(blockedDebounceTime); - saved_game.write(shoveCount); - saved_game.write(blockedDest); - saved_game.write(combatPoint); - saved_game.write(lastFailedCombatPoint); - saved_game.write(movementSpeech); - saved_game.write(movementSpeechChance); - saved_game.write(nextBStateThink); - saved_game.write<>(last_ucmd); - saved_game.write(combatMove); - saved_game.write(goalRadius); - saved_game.write(pauseTime); - saved_game.write(standTime); - saved_game.write(localState); - saved_game.write(squadState); - saved_game.write(confusionTime); - saved_game.write(charmedTime); - saved_game.write(controlledTime); - saved_game.write(surrenderTime); - saved_game.write(enemyLaggedPos); - saved_game.write(watchTarget); - saved_game.write(ffireCount); - saved_game.write(ffireDebounce); - saved_game.write(ffireFadeDebounce); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(timeOfDeath); - saved_game.read(touchedByPlayer); - saved_game.read(enemyLastVisibility); - saved_game.read(aimTime); - saved_game.read(desiredYaw); - saved_game.read(desiredPitch); - saved_game.read(lockedDesiredYaw); - saved_game.read(lockedDesiredPitch); - saved_game.read(aimingBeam); - saved_game.read(enemyLastSeenLocation); - saved_game.read(enemyLastSeenTime); - saved_game.read(enemyLastHeardLocation); - saved_game.read(enemyLastHeardTime); - saved_game.read(lastAlertID); - saved_game.read(eFlags); - saved_game.read(aiFlags); - saved_game.read(currentAmmo); - saved_game.read(shotTime); - saved_game.read(burstCount); - saved_game.read(burstMin); - saved_game.read(burstMean); - saved_game.read(burstMax); - saved_game.read(burstSpacing); - saved_game.read(attackHold); - saved_game.read(attackHoldTime); - saved_game.read(shootAngles); - saved_game.read(rank); - saved_game.read(behaviorState); - saved_game.read(defaultBehavior); - saved_game.read(tempBehavior); - saved_game.read(ignorePain); - saved_game.read(duckDebounceTime); - saved_game.read(walkDebounceTime); - saved_game.read(enemyCheckDebounceTime); - saved_game.read(investigateDebounceTime); - saved_game.read(investigateCount); - saved_game.read(investigateGoal); - saved_game.read(investigateSoundDebounceTime); - saved_game.read(greetingDebounceTime); - saved_game.read(eventOwner); - saved_game.read(coverTarg); - saved_game.read(jumpState); - saved_game.read(followDist); - saved_game.read(tempGoal); - saved_game.read(goalEntity); - saved_game.read(lastGoalEntity); - saved_game.read(eventualGoal); - saved_game.read(captureGoal); - saved_game.read(defendEnt); - saved_game.read(greetEnt); - saved_game.read(goalTime); - saved_game.read(straightToGoal); - saved_game.read(distToGoal); - saved_game.read(navTime); - saved_game.read(blockingEntNum); - saved_game.read(blockedSpeechDebounceTime); - saved_game.read(lastSideStepSide); - saved_game.read(sideStepHoldTime); - saved_game.read(homeWp); - saved_game.read(group); - saved_game.read(lastPathAngles); - saved_game.read<>(stats); - saved_game.read(aimErrorDebounceTime); - saved_game.read(lastAimErrorYaw); - saved_game.read(lastAimErrorPitch); - saved_game.read(aimOfs); - saved_game.read(currentAim); - saved_game.read(currentAggression); - saved_game.read(scriptFlags); - saved_game.read(desiredSpeed); - saved_game.read(currentSpeed); - saved_game.read(last_forwardmove); - saved_game.read(last_rightmove); - saved_game.skip(2); - saved_game.read(lastClearOrigin); - saved_game.read(consecutiveBlockedMoves); - saved_game.read(blockedDebounceTime); - saved_game.read(shoveCount); - saved_game.read(blockedDest); - saved_game.read(combatPoint); - saved_game.read(lastFailedCombatPoint); - saved_game.read(movementSpeech); - saved_game.read(movementSpeechChance); - saved_game.read(nextBStateThink); - saved_game.read<>(last_ucmd); - saved_game.read(combatMove); - saved_game.read(goalRadius); - saved_game.read(pauseTime); - saved_game.read(standTime); - saved_game.read(localState); - saved_game.read(squadState); - saved_game.read(confusionTime); - saved_game.read(charmedTime); - saved_game.read(controlledTime); - saved_game.read(surrenderTime); - saved_game.read(enemyLaggedPos); - saved_game.read(watchTarget); - saved_game.read(ffireCount); - saved_game.read(ffireDebounce); - saved_game.read(ffireFadeDebounce); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(timeOfDeath); + saved_game.write(touchedByPlayer); + saved_game.write(enemyLastVisibility); + saved_game.write(aimTime); + saved_game.write(desiredYaw); + saved_game.write(desiredPitch); + saved_game.write(lockedDesiredYaw); + saved_game.write(lockedDesiredPitch); + saved_game.write(aimingBeam); + saved_game.write(enemyLastSeenLocation); + saved_game.write(enemyLastSeenTime); + saved_game.write(enemyLastHeardLocation); + saved_game.write(enemyLastHeardTime); + saved_game.write(lastAlertID); + saved_game.write(eFlags); + saved_game.write(aiFlags); + saved_game.write(currentAmmo); + saved_game.write(shotTime); + saved_game.write(burstCount); + saved_game.write(burstMin); + saved_game.write(burstMean); + saved_game.write(burstMax); + saved_game.write(burstSpacing); + saved_game.write(attackHold); + saved_game.write(attackHoldTime); + saved_game.write(shootAngles); + saved_game.write(rank); + saved_game.write(behaviorState); + saved_game.write(defaultBehavior); + saved_game.write(tempBehavior); + saved_game.write(ignorePain); + saved_game.write(duckDebounceTime); + saved_game.write(walkDebounceTime); + saved_game.write(enemyCheckDebounceTime); + saved_game.write(investigateDebounceTime); + saved_game.write(investigateCount); + saved_game.write(investigateGoal); + saved_game.write(investigateSoundDebounceTime); + saved_game.write(greetingDebounceTime); + saved_game.write(eventOwner); + saved_game.write(coverTarg); + saved_game.write(jumpState); + saved_game.write(followDist); + saved_game.write(tempGoal); + saved_game.write(goalEntity); + saved_game.write(lastGoalEntity); + saved_game.write(eventualGoal); + saved_game.write(captureGoal); + saved_game.write(defendEnt); + saved_game.write(greetEnt); + saved_game.write(goalTime); + saved_game.write(straightToGoal); + saved_game.write(distToGoal); + saved_game.write(navTime); + saved_game.write(blockingEntNum); + saved_game.write(blockedSpeechDebounceTime); + saved_game.write(lastSideStepSide); + saved_game.write(sideStepHoldTime); + saved_game.write(homeWp); + saved_game.write(group); + saved_game.write(lastPathAngles); + saved_game.write<>(stats); + saved_game.write(aimErrorDebounceTime); + saved_game.write(lastAimErrorYaw); + saved_game.write(lastAimErrorPitch); + saved_game.write(aimOfs); + saved_game.write(currentAim); + saved_game.write(currentAggression); + saved_game.write(scriptFlags); + saved_game.write(desiredSpeed); + saved_game.write(currentSpeed); + saved_game.write(last_forwardmove); + saved_game.write(last_rightmove); + saved_game.skip(2); + saved_game.write(lastClearOrigin); + saved_game.write(consecutiveBlockedMoves); + saved_game.write(blockedDebounceTime); + saved_game.write(shoveCount); + saved_game.write(blockedDest); + saved_game.write(combatPoint); + saved_game.write(lastFailedCombatPoint); + saved_game.write(movementSpeech); + saved_game.write(movementSpeechChance); + saved_game.write(nextBStateThink); + saved_game.write<>(last_ucmd); + saved_game.write(combatMove); + saved_game.write(goalRadius); + saved_game.write(pauseTime); + saved_game.write(standTime); + saved_game.write(localState); + saved_game.write(squadState); + saved_game.write(confusionTime); + saved_game.write(charmedTime); + saved_game.write(controlledTime); + saved_game.write(surrenderTime); + saved_game.write(enemyLaggedPos); + saved_game.write(watchTarget); + saved_game.write(ffireCount); + saved_game.write(ffireDebounce); + saved_game.write(ffireFadeDebounce); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(timeOfDeath); + saved_game.read(touchedByPlayer); + saved_game.read(enemyLastVisibility); + saved_game.read(aimTime); + saved_game.read(desiredYaw); + saved_game.read(desiredPitch); + saved_game.read(lockedDesiredYaw); + saved_game.read(lockedDesiredPitch); + saved_game.read(aimingBeam); + saved_game.read(enemyLastSeenLocation); + saved_game.read(enemyLastSeenTime); + saved_game.read(enemyLastHeardLocation); + saved_game.read(enemyLastHeardTime); + saved_game.read(lastAlertID); + saved_game.read(eFlags); + saved_game.read(aiFlags); + saved_game.read(currentAmmo); + saved_game.read(shotTime); + saved_game.read(burstCount); + saved_game.read(burstMin); + saved_game.read(burstMean); + saved_game.read(burstMax); + saved_game.read(burstSpacing); + saved_game.read(attackHold); + saved_game.read(attackHoldTime); + saved_game.read(shootAngles); + saved_game.read(rank); + saved_game.read(behaviorState); + saved_game.read(defaultBehavior); + saved_game.read(tempBehavior); + saved_game.read(ignorePain); + saved_game.read(duckDebounceTime); + saved_game.read(walkDebounceTime); + saved_game.read(enemyCheckDebounceTime); + saved_game.read(investigateDebounceTime); + saved_game.read(investigateCount); + saved_game.read(investigateGoal); + saved_game.read(investigateSoundDebounceTime); + saved_game.read(greetingDebounceTime); + saved_game.read(eventOwner); + saved_game.read(coverTarg); + saved_game.read(jumpState); + saved_game.read(followDist); + saved_game.read(tempGoal); + saved_game.read(goalEntity); + saved_game.read(lastGoalEntity); + saved_game.read(eventualGoal); + saved_game.read(captureGoal); + saved_game.read(defendEnt); + saved_game.read(greetEnt); + saved_game.read(goalTime); + saved_game.read(straightToGoal); + saved_game.read(distToGoal); + saved_game.read(navTime); + saved_game.read(blockingEntNum); + saved_game.read(blockedSpeechDebounceTime); + saved_game.read(lastSideStepSide); + saved_game.read(sideStepHoldTime); + saved_game.read(homeWp); + saved_game.read(group); + saved_game.read(lastPathAngles); + saved_game.read<>(stats); + saved_game.read(aimErrorDebounceTime); + saved_game.read(lastAimErrorYaw); + saved_game.read(lastAimErrorPitch); + saved_game.read(aimOfs); + saved_game.read(currentAim); + saved_game.read(currentAggression); + saved_game.read(scriptFlags); + saved_game.read(desiredSpeed); + saved_game.read(currentSpeed); + saved_game.read(last_forwardmove); + saved_game.read(last_rightmove); + saved_game.skip(2); + saved_game.read(lastClearOrigin); + saved_game.read(consecutiveBlockedMoves); + saved_game.read(blockedDebounceTime); + saved_game.read(shoveCount); + saved_game.read(blockedDest); + saved_game.read(combatPoint); + saved_game.read(lastFailedCombatPoint); + saved_game.read(movementSpeech); + saved_game.read(movementSpeechChance); + saved_game.read(nextBStateThink); + saved_game.read<>(last_ucmd); + saved_game.read(combatMove); + saved_game.read(goalRadius); + saved_game.read(pauseTime); + saved_game.read(standTime); + saved_game.read(localState); + saved_game.read(squadState); + saved_game.read(confusionTime); + saved_game.read(charmedTime); + saved_game.read(controlledTime); + saved_game.read(surrenderTime); + saved_game.read(enemyLaggedPos); + saved_game.read(watchTarget); + saved_game.read(ffireCount); + saved_game.read(ffireDebounce); + saved_game.read(ffireFadeDebounce); + } }; // gNPC_t void G_SquadPathsInit(void); diff --git a/codeJK2/game/bg_public.h b/codeJK2/game/bg_public.h index 50bba4099f..d62ab8fc07 100644 --- a/codeJK2/game/bg_public.h +++ b/codeJK2/game/bg_public.h @@ -451,25 +451,25 @@ class animation_t int initialLerp; // msec to get to first frame - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(firstFrame); - saved_game.write(numFrames); - saved_game.write(loopFrames); - saved_game.write(frameLerp); - saved_game.write(initialLerp); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(firstFrame); - saved_game.read(numFrames); - saved_game.read(loopFrames); - saved_game.read(frameLerp); - saved_game.read(initialLerp); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(firstFrame); + saved_game.write(numFrames); + saved_game.write(loopFrames); + saved_game.write(frameLerp); + saved_game.write(initialLerp); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(firstFrame); + saved_game.read(numFrames); + saved_game.read(loopFrames); + saved_game.read(frameLerp); + saved_game.read(initialLerp); + } }; // animation_t #define MAX_RANDOM_ANIMSOUNDS 8 @@ -482,23 +482,23 @@ typedef struct animsounds_s int probability; //chance sound will play, zero value will not run this test (0 = 100% basically) - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(keyFrame); - saved_game.write(soundIndex); - saved_game.write(numRandomAnimSounds); - saved_game.write(probability); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(keyFrame); - saved_game.read(soundIndex); - saved_game.read(numRandomAnimSounds); - saved_game.read(probability); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(keyFrame); + saved_game.write(soundIndex); + saved_game.write(numRandomAnimSounds); + saved_game.write(probability); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(keyFrame); + saved_game.read(soundIndex); + saved_game.read(numRandomAnimSounds); + saved_game.read(probability); + } } animsounds_t; // means of death diff --git a/codeJK2/game/g_local.h b/codeJK2/game/g_local.h index 0e5d78e530..7baad90134 100644 --- a/codeJK2/game/g_local.h +++ b/codeJK2/game/g_local.h @@ -143,33 +143,33 @@ class alertEvent_t int timestamp; //when it was created - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(position); - saved_game.write(radius); - saved_game.write(level); - saved_game.write(type); - saved_game.write(owner); - saved_game.write(light); - saved_game.write(addLight); - saved_game.write(ID); - saved_game.write(timestamp); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(position); - saved_game.read(radius); - saved_game.read(level); - saved_game.read(type); - saved_game.read(owner); - saved_game.read(light); - saved_game.read(addLight); - saved_game.read(ID); - saved_game.read(timestamp); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(position); + saved_game.write(radius); + saved_game.write(level); + saved_game.write(type); + saved_game.write(owner); + saved_game.write(light); + saved_game.write(addLight); + saved_game.write(ID); + saved_game.write(timestamp); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(position); + saved_game.read(radius); + saved_game.read(level); + saved_game.read(type); + saved_game.read(owner); + saved_game.read(light); + saved_game.read(addLight); + saved_game.read(ID); + saved_game.read(timestamp); + } }; // alertEvent_t // @@ -248,49 +248,49 @@ class level_locals_t int dmBeatTime; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(clients); - saved_game.write(maxclients); - saved_game.write(framenum); - saved_game.write(time); - saved_game.write(previousTime); - saved_game.write(globalTime); - saved_game.write(mapname); - saved_game.write(locationLinked); - saved_game.write(locationHead); - saved_game.write<>(alertEvents); - saved_game.write(numAlertEvents); - saved_game.write(curAlertID); - saved_game.write<>(groups); - saved_game.write<>(knownAnimFileSets); - saved_game.write(numKnownAnimFileSets); - saved_game.write(worldFlags); - saved_game.write(dmState); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(clients); - saved_game.read(maxclients); - saved_game.read(framenum); - saved_game.read(time); - saved_game.read(previousTime); - saved_game.read(globalTime); - saved_game.read(mapname); - saved_game.read(locationLinked); - saved_game.read(locationHead); - saved_game.read<>(alertEvents); - saved_game.read(numAlertEvents); - saved_game.read(curAlertID); - saved_game.read<>(groups); - saved_game.read<>(knownAnimFileSets); - saved_game.read(numKnownAnimFileSets); - saved_game.read(worldFlags); - saved_game.read(dmState); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(clients); + saved_game.write(maxclients); + saved_game.write(framenum); + saved_game.write(time); + saved_game.write(previousTime); + saved_game.write(globalTime); + saved_game.write(mapname); + saved_game.write(locationLinked); + saved_game.write(locationHead); + saved_game.write<>(alertEvents); + saved_game.write(numAlertEvents); + saved_game.write(curAlertID); + saved_game.write<>(groups); + saved_game.write<>(knownAnimFileSets); + saved_game.write(numKnownAnimFileSets); + saved_game.write(worldFlags); + saved_game.write(dmState); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(clients); + saved_game.read(maxclients); + saved_game.read(framenum); + saved_game.read(time); + saved_game.read(previousTime); + saved_game.read(globalTime); + saved_game.read(mapname); + saved_game.read(locationLinked); + saved_game.read(locationHead); + saved_game.read<>(alertEvents); + saved_game.read(numAlertEvents); + saved_game.read(curAlertID); + saved_game.read<>(groups); + saved_game.read<>(knownAnimFileSets); + saved_game.read(numKnownAnimFileSets); + saved_game.read(worldFlags); + saved_game.read(dmState); + } }; // level_locals_t extern level_locals_t level; diff --git a/codeJK2/game/g_public.h b/codeJK2/game/g_public.h index e5e331300d..7627f9b6e0 100644 --- a/codeJK2/game/g_public.h +++ b/codeJK2/game/g_public.h @@ -174,7 +174,7 @@ typedef struct { // Savegame handling // - ojk::ISavedGame* saved_game; + ojk::ISavedGame* saved_game; // add commands to the console as if they were typed in // for map changing, etc diff --git a/codeJK2/game/g_shared.h b/codeJK2/game/g_shared.h index 5c07ce7d3d..9e0ac004fb 100644 --- a/codeJK2/game/g_shared.h +++ b/codeJK2/game/g_shared.h @@ -153,51 +153,51 @@ class clientInfo_t char *customJediSoundDir; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(infoValid); - saved_game.write(name); - saved_game.write(team); - saved_game.write(score); - saved_game.write(handicap); - saved_game.write(legsModel); - saved_game.write(legsSkin); - saved_game.write(torsoModel); - saved_game.write(torsoSkin); - saved_game.write(headModel); - saved_game.write(headSkin); - saved_game.write(extensions); - saved_game.write(animFileIndex); - saved_game.write(sounds); - saved_game.write(customBasicSoundDir); - saved_game.write(customCombatSoundDir); - saved_game.write(customExtraSoundDir); - saved_game.write(customJediSoundDir); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(infoValid); - saved_game.read(name); - saved_game.read(team); - saved_game.read(score); - saved_game.read(handicap); - saved_game.read(legsModel); - saved_game.read(legsSkin); - saved_game.read(torsoModel); - saved_game.read(torsoSkin); - saved_game.read(headModel); - saved_game.read(headSkin); - saved_game.read(extensions); - saved_game.read(animFileIndex); - saved_game.read(sounds); - saved_game.read(customBasicSoundDir); - saved_game.read(customCombatSoundDir); - saved_game.read(customExtraSoundDir); - saved_game.read(customJediSoundDir); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(infoValid); + saved_game.write(name); + saved_game.write(team); + saved_game.write(score); + saved_game.write(handicap); + saved_game.write(legsModel); + saved_game.write(legsSkin); + saved_game.write(torsoModel); + saved_game.write(torsoSkin); + saved_game.write(headModel); + saved_game.write(headSkin); + saved_game.write(extensions); + saved_game.write(animFileIndex); + saved_game.write(sounds); + saved_game.write(customBasicSoundDir); + saved_game.write(customCombatSoundDir); + saved_game.write(customExtraSoundDir); + saved_game.write(customJediSoundDir); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(infoValid); + saved_game.read(name); + saved_game.read(team); + saved_game.read(score); + saved_game.read(handicap); + saved_game.read(legsModel); + saved_game.read(legsSkin); + saved_game.read(torsoModel); + saved_game.read(torsoSkin); + saved_game.read(headModel); + saved_game.read(headSkin); + saved_game.read(extensions); + saved_game.read(animFileIndex); + saved_game.read(sounds); + saved_game.read(customBasicSoundDir); + saved_game.read(customCombatSoundDir); + saved_game.read(customExtraSoundDir); + saved_game.read(customJediSoundDir); + } }; // clientInfo_t @@ -220,21 +220,21 @@ typedef struct modelInfo_s int customAlpha;//Alpha to apply, 0 = none? - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(modelIndex); - saved_game.write(customRGB); - saved_game.write(customAlpha); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(modelIndex); - saved_game.read(customRGB); - saved_game.read(customAlpha); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(modelIndex); + saved_game.write(customRGB); + saved_game.write(customAlpha); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(modelIndex); + saved_game.read(customRGB); + saved_game.read(customAlpha); + } } modelInfo_t; typedef enum @@ -335,109 +335,109 @@ class renderInfo_t float legsYaw;//yaw angle your legs are actually rendering at - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write<>(legsModel); - saved_game.write(legsModelName); - saved_game.write<>(torsoModel); - saved_game.write<>(headModel); - saved_game.write(torsoModelName); - saved_game.write(headModelName); - saved_game.write(headYawRangeLeft); - saved_game.write(headYawRangeRight); - saved_game.write(headPitchRangeUp); - saved_game.write(headPitchRangeDown); - saved_game.write(torsoYawRangeLeft); - saved_game.write(torsoYawRangeRight); - saved_game.write(torsoPitchRangeUp); - saved_game.write(torsoPitchRangeDown); - saved_game.write(legsFrame); - saved_game.write(torsoFrame); - saved_game.write(legsFpsMod); - saved_game.write(torsoFpsMod); - saved_game.write(customRGB); - saved_game.write(customAlpha); - saved_game.write(renderFlags); - saved_game.write(muzzlePoint); - saved_game.write(muzzleDir); - saved_game.write(muzzlePointOld); - saved_game.write(muzzleDirOld); - saved_game.write(mPCalcTime); - saved_game.write(lockYaw); - saved_game.write(headPoint); - saved_game.write(headAngles); - saved_game.write(handRPoint); - saved_game.write(handLPoint); - saved_game.write(crotchPoint); - saved_game.write(footRPoint); - saved_game.write(footLPoint); - saved_game.write(torsoPoint); - saved_game.write(torsoAngles); - saved_game.write(eyePoint); - saved_game.write(eyeAngles); - saved_game.write(lookTarget); - saved_game.write(lookMode); - saved_game.write(lookTargetClearTime); - saved_game.write(lastVoiceVolume); - saved_game.write(lastHeadAngles); - saved_game.write(headBobAngles); - saved_game.write(targetHeadBobAngles); - saved_game.write(lookingDebounceTime); - saved_game.write(legsYaw); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read<>(legsModel); - saved_game.read(legsModelName); - saved_game.read<>(torsoModel); - saved_game.read<>(headModel); - saved_game.read(torsoModelName); - saved_game.read(headModelName); - saved_game.read(headYawRangeLeft); - saved_game.read(headYawRangeRight); - saved_game.read(headPitchRangeUp); - saved_game.read(headPitchRangeDown); - saved_game.read(torsoYawRangeLeft); - saved_game.read(torsoYawRangeRight); - saved_game.read(torsoPitchRangeUp); - saved_game.read(torsoPitchRangeDown); - saved_game.read(legsFrame); - saved_game.read(torsoFrame); - saved_game.read(legsFpsMod); - saved_game.read(torsoFpsMod); - saved_game.read(customRGB); - saved_game.read(customAlpha); - saved_game.read(renderFlags); - saved_game.read(muzzlePoint); - saved_game.read(muzzleDir); - saved_game.read(muzzlePointOld); - saved_game.read(muzzleDirOld); - saved_game.read(mPCalcTime); - saved_game.read(lockYaw); - saved_game.read(headPoint); - saved_game.read(headAngles); - saved_game.read(handRPoint); - saved_game.read(handLPoint); - saved_game.read(crotchPoint); - saved_game.read(footRPoint); - saved_game.read(footLPoint); - saved_game.read(torsoPoint); - saved_game.read(torsoAngles); - saved_game.read(eyePoint); - saved_game.read(eyeAngles); - saved_game.read(lookTarget); - saved_game.read(lookMode); - saved_game.read(lookTargetClearTime); - saved_game.read(lastVoiceVolume); - saved_game.read(lastHeadAngles); - saved_game.read(headBobAngles); - saved_game.read(targetHeadBobAngles); - saved_game.read(lookingDebounceTime); - saved_game.read(legsYaw); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write<>(legsModel); + saved_game.write(legsModelName); + saved_game.write<>(torsoModel); + saved_game.write<>(headModel); + saved_game.write(torsoModelName); + saved_game.write(headModelName); + saved_game.write(headYawRangeLeft); + saved_game.write(headYawRangeRight); + saved_game.write(headPitchRangeUp); + saved_game.write(headPitchRangeDown); + saved_game.write(torsoYawRangeLeft); + saved_game.write(torsoYawRangeRight); + saved_game.write(torsoPitchRangeUp); + saved_game.write(torsoPitchRangeDown); + saved_game.write(legsFrame); + saved_game.write(torsoFrame); + saved_game.write(legsFpsMod); + saved_game.write(torsoFpsMod); + saved_game.write(customRGB); + saved_game.write(customAlpha); + saved_game.write(renderFlags); + saved_game.write(muzzlePoint); + saved_game.write(muzzleDir); + saved_game.write(muzzlePointOld); + saved_game.write(muzzleDirOld); + saved_game.write(mPCalcTime); + saved_game.write(lockYaw); + saved_game.write(headPoint); + saved_game.write(headAngles); + saved_game.write(handRPoint); + saved_game.write(handLPoint); + saved_game.write(crotchPoint); + saved_game.write(footRPoint); + saved_game.write(footLPoint); + saved_game.write(torsoPoint); + saved_game.write(torsoAngles); + saved_game.write(eyePoint); + saved_game.write(eyeAngles); + saved_game.write(lookTarget); + saved_game.write(lookMode); + saved_game.write(lookTargetClearTime); + saved_game.write(lastVoiceVolume); + saved_game.write(lastHeadAngles); + saved_game.write(headBobAngles); + saved_game.write(targetHeadBobAngles); + saved_game.write(lookingDebounceTime); + saved_game.write(legsYaw); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read<>(legsModel); + saved_game.read(legsModelName); + saved_game.read<>(torsoModel); + saved_game.read<>(headModel); + saved_game.read(torsoModelName); + saved_game.read(headModelName); + saved_game.read(headYawRangeLeft); + saved_game.read(headYawRangeRight); + saved_game.read(headPitchRangeUp); + saved_game.read(headPitchRangeDown); + saved_game.read(torsoYawRangeLeft); + saved_game.read(torsoYawRangeRight); + saved_game.read(torsoPitchRangeUp); + saved_game.read(torsoPitchRangeDown); + saved_game.read(legsFrame); + saved_game.read(torsoFrame); + saved_game.read(legsFpsMod); + saved_game.read(torsoFpsMod); + saved_game.read(customRGB); + saved_game.read(customAlpha); + saved_game.read(renderFlags); + saved_game.read(muzzlePoint); + saved_game.read(muzzleDir); + saved_game.read(muzzlePointOld); + saved_game.read(muzzleDirOld); + saved_game.read(mPCalcTime); + saved_game.read(lockYaw); + saved_game.read(headPoint); + saved_game.read(headAngles); + saved_game.read(handRPoint); + saved_game.read(handLPoint); + saved_game.read(crotchPoint); + saved_game.read(footRPoint); + saved_game.read(footLPoint); + saved_game.read(torsoPoint); + saved_game.read(torsoAngles); + saved_game.read(eyePoint); + saved_game.read(eyeAngles); + saved_game.read(lookTarget); + saved_game.read(lookMode); + saved_game.read(lookTargetClearTime); + saved_game.read(lastVoiceVolume); + saved_game.read(lastHeadAngles); + saved_game.read(headBobAngles); + saved_game.read(targetHeadBobAngles); + saved_game.read(lookingDebounceTime); + saved_game.read(legsYaw); + } }; // renderInfo_t // Movement information structure @@ -484,37 +484,37 @@ class playerTeamState_t float lastfraggedcarrier; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(state); - saved_game.write(captures); - saved_game.write(basedefense); - saved_game.write(carrierdefense); - saved_game.write(flagrecovery); - saved_game.write(fragcarrier); - saved_game.write(assists); - saved_game.write(lasthurtcarrier); - saved_game.write(lastreturnedflag); - saved_game.write(flagsince); - saved_game.write(lastfraggedcarrier); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(state); - saved_game.read(captures); - saved_game.read(basedefense); - saved_game.read(carrierdefense); - saved_game.read(flagrecovery); - saved_game.read(fragcarrier); - saved_game.read(assists); - saved_game.read(lasthurtcarrier); - saved_game.read(lastreturnedflag); - saved_game.read(flagsince); - saved_game.read(lastfraggedcarrier); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(state); + saved_game.write(captures); + saved_game.write(basedefense); + saved_game.write(carrierdefense); + saved_game.write(flagrecovery); + saved_game.write(fragcarrier); + saved_game.write(assists); + saved_game.write(lasthurtcarrier); + saved_game.write(lastreturnedflag); + saved_game.write(flagsince); + saved_game.write(lastfraggedcarrier); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(state); + saved_game.read(captures); + saved_game.read(basedefense); + saved_game.read(carrierdefense); + saved_game.read(flagrecovery); + saved_game.read(fragcarrier); + saved_game.read(assists); + saved_game.read(lasthurtcarrier); + saved_game.read(lastreturnedflag); + saved_game.read(flagsince); + saved_game.read(lastfraggedcarrier); + } }; // playerTeamState_t // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! @@ -525,19 +525,19 @@ class objectives_t int status; // Succeed or fail or pending - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(display); - saved_game.write(status); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(display); + saved_game.write(status); + } - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(display); - saved_game.read(status); - } + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(display); + saved_game.read(status); + } }; // objectives_t #define MAX_MISSION_OBJ 80 @@ -561,43 +561,43 @@ class missionStats_t int weaponUsed[WP_NUM_WEAPONS]; // # of times each weapon was used - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(secretsFound); - saved_game.write(totalSecrets); - saved_game.write(shotsFired); - saved_game.write(hits); - saved_game.write(enemiesSpawned); - saved_game.write(enemiesKilled); - saved_game.write(saberThrownCnt); - saved_game.write(saberBlocksCnt); - saved_game.write(legAttacksCnt); - saved_game.write(armAttacksCnt); - saved_game.write(torsoAttacksCnt); - saved_game.write(otherAttacksCnt); - saved_game.write(forceUsed); - saved_game.write(weaponUsed); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(secretsFound); - saved_game.read(totalSecrets); - saved_game.read(shotsFired); - saved_game.read(hits); - saved_game.read(enemiesSpawned); - saved_game.read(enemiesKilled); - saved_game.read(saberThrownCnt); - saved_game.read(saberBlocksCnt); - saved_game.read(legAttacksCnt); - saved_game.read(armAttacksCnt); - saved_game.read(torsoAttacksCnt); - saved_game.read(otherAttacksCnt); - saved_game.read(forceUsed); - saved_game.read(weaponUsed); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(secretsFound); + saved_game.write(totalSecrets); + saved_game.write(shotsFired); + saved_game.write(hits); + saved_game.write(enemiesSpawned); + saved_game.write(enemiesKilled); + saved_game.write(saberThrownCnt); + saved_game.write(saberBlocksCnt); + saved_game.write(legAttacksCnt); + saved_game.write(armAttacksCnt); + saved_game.write(torsoAttacksCnt); + saved_game.write(otherAttacksCnt); + saved_game.write(forceUsed); + saved_game.write(weaponUsed); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(secretsFound); + saved_game.read(totalSecrets); + saved_game.read(shotsFired); + saved_game.read(hits); + saved_game.read(enemiesSpawned); + saved_game.read(enemiesKilled); + saved_game.read(saberThrownCnt); + saved_game.read(saberBlocksCnt); + saved_game.read(legAttacksCnt); + saved_game.read(armAttacksCnt); + saved_game.read(torsoAttacksCnt); + saved_game.read(otherAttacksCnt); + saved_game.read(forceUsed); + saved_game.read(weaponUsed); + } }; // missionStats_t // the auto following clients don't follow a specific client @@ -620,23 +620,23 @@ class clientSession_t missionStats_t missionStats; // Various totals while on a mission - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(missionObjectivesShown); - saved_game.write(sessionTeam); - saved_game.write<>(mission_objectives); - saved_game.write<>(missionStats); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(missionObjectivesShown); - saved_game.read(sessionTeam); - saved_game.read<>(mission_objectives); - saved_game.read<>(missionStats); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(missionObjectivesShown); + saved_game.write(sessionTeam); + saved_game.write<>(mission_objectives); + saved_game.write<>(missionStats); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(missionObjectivesShown); + saved_game.read(sessionTeam); + saved_game.read<>(mission_objectives); + saved_game.read<>(missionStats); + } }; // clientSession_t // client data that stays across multiple respawns, but is cleared @@ -656,35 +656,35 @@ class clientPersistant_t playerTeamState_t teamState; // status in teamplay games - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(connected); - saved_game.write<>(lastCommand); - saved_game.write(localClient); - saved_game.write(netname); - saved_game.skip(2); - saved_game.write(maxHealth); - saved_game.write(enterTime); - saved_game.write(cmd_angles); - saved_game.skip(2); - saved_game.write<>(teamState); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(connected); - saved_game.read<>(lastCommand); - saved_game.read(localClient); - saved_game.read(netname); - saved_game.skip(2); - saved_game.read(maxHealth); - saved_game.read(enterTime); - saved_game.read(cmd_angles); - saved_game.skip(2); - saved_game.read<>(teamState); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(connected); + saved_game.write<>(lastCommand); + saved_game.write(localClient); + saved_game.write(netname); + saved_game.skip(2); + saved_game.write(maxHealth); + saved_game.write(enterTime); + saved_game.write(cmd_angles); + saved_game.skip(2); + saved_game.write<>(teamState); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(connected); + saved_game.read<>(lastCommand); + saved_game.read(localClient); + saved_game.read(netname); + saved_game.skip(2); + saved_game.read(maxHealth); + saved_game.read(enterTime); + saved_game.read(cmd_angles); + saved_game.skip(2); + saved_game.read<>(teamState); + } }; // clientPersistant_t typedef enum { @@ -803,129 +803,129 @@ class gclient_t int pushVecTime; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write<>(ps); - saved_game.write<>(pers); - saved_game.write<>(sess); - saved_game.write(noclip); - saved_game.write(lastCmdTime); - saved_game.write<>(usercmd); - saved_game.write(buttons); - saved_game.write(oldbuttons); - saved_game.write(latched_buttons); - saved_game.write(damage_armor); - saved_game.write(damage_blood); - saved_game.write(damage_knockback); - saved_game.write(damage_from); - saved_game.write(damage_fromWorld); - saved_game.write(accurateCount); - saved_game.write(respawnTime); - saved_game.write(inactivityTime); - saved_game.write(inactivityWarning); - saved_game.write(idleTime); - saved_game.write(airOutTime); - saved_game.write(timeResidual); - saved_game.write(facial_blink); - saved_game.write(facial_frown); - saved_game.write(facial_aux); - saved_game.write<>(clientInfo); - saved_game.write(forced_forwardmove); - saved_game.write(forced_rightmove); - saved_game.skip(2); - saved_game.write(fireDelay); - saved_game.write(playerTeam); - saved_game.write(enemyTeam); - saved_game.write(squadname); - saved_game.write(team_leader); - saved_game.write(leader); - saved_game.write(follower); - saved_game.write(numFollowers); - saved_game.write(formationGoal); - saved_game.write(nextFormGoal); - saved_game.write(NPC_class); - saved_game.write(hiddenDist); - saved_game.write(hiddenDir); - saved_game.write<>(renderInfo); - saved_game.write<>(saberTrail); - saved_game.write(dismembered); - saved_game.write(dismemberProbLegs); - saved_game.write(dismemberProbHead); - saved_game.write(dismemberProbArms); - saved_game.write(dismemberProbHands); - saved_game.write(dismemberProbWaist); - saved_game.skip(3); - saved_game.write(standheight); - saved_game.write(crouchheight); - saved_game.write(poisonDamage); - saved_game.write(poisonTime); - saved_game.write(slopeRecalcTime); - saved_game.write(pushVec); - saved_game.write(pushVecTime); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read<>(ps); - saved_game.read<>(pers); - saved_game.read<>(sess); - saved_game.read(noclip); - saved_game.read(lastCmdTime); - saved_game.read<>(usercmd); - saved_game.read(buttons); - saved_game.read(oldbuttons); - saved_game.read(latched_buttons); - saved_game.read(damage_armor); - saved_game.read(damage_blood); - saved_game.read(damage_knockback); - saved_game.read(damage_from); - saved_game.read(damage_fromWorld); - saved_game.read(accurateCount); - saved_game.read(respawnTime); - saved_game.read(inactivityTime); - saved_game.read(inactivityWarning); - saved_game.read(idleTime); - saved_game.read(airOutTime); - saved_game.read(timeResidual); - saved_game.read(facial_blink); - saved_game.read(facial_frown); - saved_game.read(facial_aux); - saved_game.read<>(clientInfo); - saved_game.read(forced_forwardmove); - saved_game.read(forced_rightmove); - saved_game.skip(2); - saved_game.read(fireDelay); - saved_game.read(playerTeam); - saved_game.read(enemyTeam); - saved_game.read(squadname); - saved_game.read(team_leader); - saved_game.read(leader); - saved_game.read(follower); - saved_game.read(numFollowers); - saved_game.read(formationGoal); - saved_game.read(nextFormGoal); - saved_game.read(NPC_class); - saved_game.read(hiddenDist); - saved_game.read(hiddenDir); - saved_game.read<>(renderInfo); - saved_game.read<>(saberTrail); - saved_game.read(dismembered); - saved_game.read(dismemberProbLegs); - saved_game.read(dismemberProbHead); - saved_game.read(dismemberProbArms); - saved_game.read(dismemberProbHands); - saved_game.read(dismemberProbWaist); - saved_game.skip(3); - saved_game.read(standheight); - saved_game.read(crouchheight); - saved_game.read(poisonDamage); - saved_game.read(poisonTime); - saved_game.read(slopeRecalcTime); - saved_game.read(pushVec); - saved_game.read(pushVecTime); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write<>(ps); + saved_game.write<>(pers); + saved_game.write<>(sess); + saved_game.write(noclip); + saved_game.write(lastCmdTime); + saved_game.write<>(usercmd); + saved_game.write(buttons); + saved_game.write(oldbuttons); + saved_game.write(latched_buttons); + saved_game.write(damage_armor); + saved_game.write(damage_blood); + saved_game.write(damage_knockback); + saved_game.write(damage_from); + saved_game.write(damage_fromWorld); + saved_game.write(accurateCount); + saved_game.write(respawnTime); + saved_game.write(inactivityTime); + saved_game.write(inactivityWarning); + saved_game.write(idleTime); + saved_game.write(airOutTime); + saved_game.write(timeResidual); + saved_game.write(facial_blink); + saved_game.write(facial_frown); + saved_game.write(facial_aux); + saved_game.write<>(clientInfo); + saved_game.write(forced_forwardmove); + saved_game.write(forced_rightmove); + saved_game.skip(2); + saved_game.write(fireDelay); + saved_game.write(playerTeam); + saved_game.write(enemyTeam); + saved_game.write(squadname); + saved_game.write(team_leader); + saved_game.write(leader); + saved_game.write(follower); + saved_game.write(numFollowers); + saved_game.write(formationGoal); + saved_game.write(nextFormGoal); + saved_game.write(NPC_class); + saved_game.write(hiddenDist); + saved_game.write(hiddenDir); + saved_game.write<>(renderInfo); + saved_game.write<>(saberTrail); + saved_game.write(dismembered); + saved_game.write(dismemberProbLegs); + saved_game.write(dismemberProbHead); + saved_game.write(dismemberProbArms); + saved_game.write(dismemberProbHands); + saved_game.write(dismemberProbWaist); + saved_game.skip(3); + saved_game.write(standheight); + saved_game.write(crouchheight); + saved_game.write(poisonDamage); + saved_game.write(poisonTime); + saved_game.write(slopeRecalcTime); + saved_game.write(pushVec); + saved_game.write(pushVecTime); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read<>(ps); + saved_game.read<>(pers); + saved_game.read<>(sess); + saved_game.read(noclip); + saved_game.read(lastCmdTime); + saved_game.read<>(usercmd); + saved_game.read(buttons); + saved_game.read(oldbuttons); + saved_game.read(latched_buttons); + saved_game.read(damage_armor); + saved_game.read(damage_blood); + saved_game.read(damage_knockback); + saved_game.read(damage_from); + saved_game.read(damage_fromWorld); + saved_game.read(accurateCount); + saved_game.read(respawnTime); + saved_game.read(inactivityTime); + saved_game.read(inactivityWarning); + saved_game.read(idleTime); + saved_game.read(airOutTime); + saved_game.read(timeResidual); + saved_game.read(facial_blink); + saved_game.read(facial_frown); + saved_game.read(facial_aux); + saved_game.read<>(clientInfo); + saved_game.read(forced_forwardmove); + saved_game.read(forced_rightmove); + saved_game.skip(2); + saved_game.read(fireDelay); + saved_game.read(playerTeam); + saved_game.read(enemyTeam); + saved_game.read(squadname); + saved_game.read(team_leader); + saved_game.read(leader); + saved_game.read(follower); + saved_game.read(numFollowers); + saved_game.read(formationGoal); + saved_game.read(nextFormGoal); + saved_game.read(NPC_class); + saved_game.read(hiddenDist); + saved_game.read(hiddenDir); + saved_game.read<>(renderInfo); + saved_game.read<>(saberTrail); + saved_game.read(dismembered); + saved_game.read(dismemberProbLegs); + saved_game.read(dismemberProbHead); + saved_game.read(dismemberProbArms); + saved_game.read(dismemberProbHands); + saved_game.read(dismemberProbWaist); + saved_game.skip(3); + saved_game.read(standheight); + saved_game.read(crouchheight); + saved_game.read(poisonDamage); + saved_game.read(poisonTime); + saved_game.read(slopeRecalcTime); + saved_game.read(pushVec); + saved_game.read(pushVecTime); + } }; // gclient_t #define MAX_PARMS 16 @@ -937,17 +937,17 @@ class parms_t char parm[MAX_PARMS][MAX_PARM_STRING_LENGTH]; - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(parm); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(parm); + } - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(parm); - } + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(parm); + } }; // parms_t #define GAME_INCLUDE @@ -1265,367 +1265,367 @@ Ghoul2 Insert End int forcePuller; //who force-pulled me (so we don't damage them if we hit them) - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write<>(s); - saved_game.write(client); - saved_game.write(inuse); - saved_game.write(linked); - saved_game.write(svFlags); - saved_game.write(bmodel); - saved_game.write(mins); - saved_game.write(maxs); - saved_game.write(contents); - saved_game.write(absmin); - saved_game.write(absmax); - saved_game.write(currentOrigin); - saved_game.write(currentAngles); - saved_game.write(owner); - saved_game.write<>(ghoul2); - saved_game.write(classname); - saved_game.write(spawnflags); - saved_game.write(flags); - saved_game.write(model); - saved_game.write(model2); - saved_game.write(freetime); - saved_game.write(eventTime); - saved_game.write(freeAfterEvent); - saved_game.write(unlinkAfterEvent); - saved_game.write(physicsBounce); - saved_game.write(clipmask); - saved_game.write(speed); - saved_game.write(movedir); - saved_game.write(lastOrigin); - saved_game.write(lastAngles); - saved_game.write(mass); - saved_game.write(lastImpact); - saved_game.write(watertype); - saved_game.write(waterlevel); - saved_game.write(angle); - saved_game.write(target); - saved_game.write(target2); - saved_game.write(target3); - saved_game.write(target4); - saved_game.write(targetname); - saved_game.write(team); - saved_game.write(roff); - saved_game.write(roff_ctr); - saved_game.write(next_roff_time); - saved_game.write(fx_time); - saved_game.write(nextthink); - saved_game.write(e_ThinkFunc); - saved_game.write(e_clThinkFunc); - saved_game.write(e_ReachedFunc); - saved_game.write(e_BlockedFunc); - saved_game.write(e_TouchFunc); - saved_game.write(e_UseFunc); - saved_game.write(e_PainFunc); - saved_game.write(e_DieFunc); - saved_game.write(health); - saved_game.write(max_health); - saved_game.write(takedamage); - saved_game.write(material); - saved_game.write(damage); - saved_game.write(dflags); - saved_game.write(splashDamage); - saved_game.write(splashRadius); - saved_game.write(methodOfDeath); - saved_game.write(splashMethodOfDeath); - saved_game.write(locationDamage); - saved_game.write(chain); - saved_game.write(enemy); - saved_game.write(activator); - saved_game.write(teamchain); - saved_game.write(teammaster); - saved_game.write(lastEnemy); - saved_game.write(wait); - saved_game.write(random); - saved_game.write(delay); - saved_game.write(alt_fire); - saved_game.write(count); - saved_game.write(bounceCount); - saved_game.write(fly_sound_debounce_time); - saved_game.write(painDebounceTime); - saved_game.write(disconnectDebounceTime); - saved_game.write(attackDebounceTime); - saved_game.write(pushDebounceTime); - saved_game.write(aimDebounceTime); - saved_game.write(useDebounceTime); - saved_game.write(trigger_formation); - saved_game.write(waypoint); - saved_game.write(lastWaypoint); - saved_game.write(lastValidWaypoint); - saved_game.write(noWaypointTime); - saved_game.write(combatPoint); - saved_game.write(failedWaypoints); - saved_game.write(failedWaypointCheckTime); - saved_game.write(loopAnim); - saved_game.write(startFrame); - saved_game.write(endFrame); - saved_game.write(sequencer); - saved_game.write(taskManager); - saved_game.write(taskID); - saved_game.write(parms); - saved_game.write(behaviorSet); - saved_game.write(script_targetname); - saved_game.write(delayScriptTime); - saved_game.write(fullName); - saved_game.write(soundSet); - saved_game.write(setTime); - saved_game.write(cameraGroup); - saved_game.write(noDamageTeam); - saved_game.write(playerModel); - saved_game.write(weaponModel); - saved_game.write(handRBolt); - saved_game.write(handLBolt); - saved_game.write(headBolt); - saved_game.write(cervicalBolt); - saved_game.write(chestBolt); - saved_game.write(gutBolt); - saved_game.write(torsoBolt); - saved_game.write(crotchBolt); - saved_game.write(motionBolt); - saved_game.write(kneeLBolt); - saved_game.write(kneeRBolt); - saved_game.write(elbowLBolt); - saved_game.write(elbowRBolt); - saved_game.write(footLBolt); - saved_game.write(footRBolt); - saved_game.write(faceBone); - saved_game.write(craniumBone); - saved_game.write(cervicalBone); - saved_game.write(thoracicBone); - saved_game.write(upperLumbarBone); - saved_game.write(lowerLumbarBone); - saved_game.write(hipsBone); - saved_game.write(motionBone); - saved_game.write(rootBone); - saved_game.write(footLBone); - saved_game.write(footRBone); - saved_game.write(genericBone1); - saved_game.write(genericBone2); - saved_game.write(genericBone3); - saved_game.write(genericBolt1); - saved_game.write(genericBolt2); - saved_game.write(genericBolt3); - saved_game.write(genericBolt4); - saved_game.write(genericBolt5); - saved_game.write(cinematicModel); - saved_game.write(NPC); - saved_game.write(ownername); - saved_game.write(cantHitEnemyCounter); - saved_game.write(NPC_type); - saved_game.write(NPC_targetname); - saved_game.write(NPC_target); - saved_game.write(moverState); - saved_game.write(soundPos1); - saved_game.write(sound1to2); - saved_game.write(sound2to1); - saved_game.write(soundPos2); - saved_game.write(soundLoop); - saved_game.write(nextTrain); - saved_game.write(prevTrain); - saved_game.write(pos1); - saved_game.write(pos2); - saved_game.write(pos3); - saved_game.write(sounds); - saved_game.write(closetarget); - saved_game.write(opentarget); - saved_game.write(paintarget); - saved_game.write(lockCount); - saved_game.write(radius); - saved_game.write(wpIndex); - saved_game.write(noise_index); - saved_game.write(startRGBA); - saved_game.write(finalRGBA); - saved_game.write(item); - saved_game.write(message); - saved_game.write(lightLevel); - saved_game.write(forcePushTime); - saved_game.write(forcePuller); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read<>(s); - saved_game.read(client); - saved_game.read(inuse); - saved_game.read(linked); - saved_game.read(svFlags); - saved_game.read(bmodel); - saved_game.read(mins); - saved_game.read(maxs); - saved_game.read(contents); - saved_game.read(absmin); - saved_game.read(absmax); - saved_game.read(currentOrigin); - saved_game.read(currentAngles); - saved_game.read(owner); - saved_game.read<>(ghoul2); - saved_game.read(classname); - saved_game.read(spawnflags); - saved_game.read(flags); - saved_game.read(model); - saved_game.read(model2); - saved_game.read(freetime); - saved_game.read(eventTime); - saved_game.read(freeAfterEvent); - saved_game.read(unlinkAfterEvent); - saved_game.read(physicsBounce); - saved_game.read(clipmask); - saved_game.read(speed); - saved_game.read(movedir); - saved_game.read(lastOrigin); - saved_game.read(lastAngles); - saved_game.read(mass); - saved_game.read(lastImpact); - saved_game.read(watertype); - saved_game.read(waterlevel); - saved_game.read(angle); - saved_game.read(target); - saved_game.read(target2); - saved_game.read(target3); - saved_game.read(target4); - saved_game.read(targetname); - saved_game.read(team); - saved_game.read(roff); - saved_game.read(roff_ctr); - saved_game.read(next_roff_time); - saved_game.read(fx_time); - saved_game.read(nextthink); - saved_game.read(e_ThinkFunc); - saved_game.read(e_clThinkFunc); - saved_game.read(e_ReachedFunc); - saved_game.read(e_BlockedFunc); - saved_game.read(e_TouchFunc); - saved_game.read(e_UseFunc); - saved_game.read(e_PainFunc); - saved_game.read(e_DieFunc); - saved_game.read(health); - saved_game.read(max_health); - saved_game.read(takedamage); - saved_game.read(material); - saved_game.read(damage); - saved_game.read(dflags); - saved_game.read(splashDamage); - saved_game.read(splashRadius); - saved_game.read(methodOfDeath); - saved_game.read(splashMethodOfDeath); - saved_game.read(locationDamage); - saved_game.read(chain); - saved_game.read(enemy); - saved_game.read(activator); - saved_game.read(teamchain); - saved_game.read(teammaster); - saved_game.read(lastEnemy); - saved_game.read(wait); - saved_game.read(random); - saved_game.read(delay); - saved_game.read(alt_fire); - saved_game.read(count); - saved_game.read(bounceCount); - saved_game.read(fly_sound_debounce_time); - saved_game.read(painDebounceTime); - saved_game.read(disconnectDebounceTime); - saved_game.read(attackDebounceTime); - saved_game.read(pushDebounceTime); - saved_game.read(aimDebounceTime); - saved_game.read(useDebounceTime); - saved_game.read(trigger_formation); - saved_game.read(waypoint); - saved_game.read(lastWaypoint); - saved_game.read(lastValidWaypoint); - saved_game.read(noWaypointTime); - saved_game.read(combatPoint); - saved_game.read(failedWaypoints); - saved_game.read(failedWaypointCheckTime); - saved_game.read(loopAnim); - saved_game.read(startFrame); - saved_game.read(endFrame); - saved_game.read(sequencer); - saved_game.read(taskManager); - saved_game.read(taskID); - saved_game.read(parms); - saved_game.read(behaviorSet); - saved_game.read(script_targetname); - saved_game.read(delayScriptTime); - saved_game.read(fullName); - saved_game.read(soundSet); - saved_game.read(setTime); - saved_game.read(cameraGroup); - saved_game.read(noDamageTeam); - saved_game.read(playerModel); - saved_game.read(weaponModel); - saved_game.read(handRBolt); - saved_game.read(handLBolt); - saved_game.read(headBolt); - saved_game.read(cervicalBolt); - saved_game.read(chestBolt); - saved_game.read(gutBolt); - saved_game.read(torsoBolt); - saved_game.read(crotchBolt); - saved_game.read(motionBolt); - saved_game.read(kneeLBolt); - saved_game.read(kneeRBolt); - saved_game.read(elbowLBolt); - saved_game.read(elbowRBolt); - saved_game.read(footLBolt); - saved_game.read(footRBolt); - saved_game.read(faceBone); - saved_game.read(craniumBone); - saved_game.read(cervicalBone); - saved_game.read(thoracicBone); - saved_game.read(upperLumbarBone); - saved_game.read(lowerLumbarBone); - saved_game.read(hipsBone); - saved_game.read(motionBone); - saved_game.read(rootBone); - saved_game.read(footLBone); - saved_game.read(footRBone); - saved_game.read(genericBone1); - saved_game.read(genericBone2); - saved_game.read(genericBone3); - saved_game.read(genericBolt1); - saved_game.read(genericBolt2); - saved_game.read(genericBolt3); - saved_game.read(genericBolt4); - saved_game.read(genericBolt5); - saved_game.read(cinematicModel); - saved_game.read(NPC); - saved_game.read(ownername); - saved_game.read(cantHitEnemyCounter); - saved_game.read(NPC_type); - saved_game.read(NPC_targetname); - saved_game.read(NPC_target); - saved_game.read(moverState); - saved_game.read(soundPos1); - saved_game.read(sound1to2); - saved_game.read(sound2to1); - saved_game.read(soundPos2); - saved_game.read(soundLoop); - saved_game.read(nextTrain); - saved_game.read(prevTrain); - saved_game.read(pos1); - saved_game.read(pos2); - saved_game.read(pos3); - saved_game.read(sounds); - saved_game.read(closetarget); - saved_game.read(opentarget); - saved_game.read(paintarget); - saved_game.read(lockCount); - saved_game.read(radius); - saved_game.read(wpIndex); - saved_game.read(noise_index); - saved_game.read(startRGBA); - saved_game.read(finalRGBA); - saved_game.read(item); - saved_game.read(message); - saved_game.read(lightLevel); - saved_game.read(forcePushTime); - saved_game.read(forcePuller); - } + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write<>(s); + saved_game.write(client); + saved_game.write(inuse); + saved_game.write(linked); + saved_game.write(svFlags); + saved_game.write(bmodel); + saved_game.write(mins); + saved_game.write(maxs); + saved_game.write(contents); + saved_game.write(absmin); + saved_game.write(absmax); + saved_game.write(currentOrigin); + saved_game.write(currentAngles); + saved_game.write(owner); + saved_game.write<>(ghoul2); + saved_game.write(classname); + saved_game.write(spawnflags); + saved_game.write(flags); + saved_game.write(model); + saved_game.write(model2); + saved_game.write(freetime); + saved_game.write(eventTime); + saved_game.write(freeAfterEvent); + saved_game.write(unlinkAfterEvent); + saved_game.write(physicsBounce); + saved_game.write(clipmask); + saved_game.write(speed); + saved_game.write(movedir); + saved_game.write(lastOrigin); + saved_game.write(lastAngles); + saved_game.write(mass); + saved_game.write(lastImpact); + saved_game.write(watertype); + saved_game.write(waterlevel); + saved_game.write(angle); + saved_game.write(target); + saved_game.write(target2); + saved_game.write(target3); + saved_game.write(target4); + saved_game.write(targetname); + saved_game.write(team); + saved_game.write(roff); + saved_game.write(roff_ctr); + saved_game.write(next_roff_time); + saved_game.write(fx_time); + saved_game.write(nextthink); + saved_game.write(e_ThinkFunc); + saved_game.write(e_clThinkFunc); + saved_game.write(e_ReachedFunc); + saved_game.write(e_BlockedFunc); + saved_game.write(e_TouchFunc); + saved_game.write(e_UseFunc); + saved_game.write(e_PainFunc); + saved_game.write(e_DieFunc); + saved_game.write(health); + saved_game.write(max_health); + saved_game.write(takedamage); + saved_game.write(material); + saved_game.write(damage); + saved_game.write(dflags); + saved_game.write(splashDamage); + saved_game.write(splashRadius); + saved_game.write(methodOfDeath); + saved_game.write(splashMethodOfDeath); + saved_game.write(locationDamage); + saved_game.write(chain); + saved_game.write(enemy); + saved_game.write(activator); + saved_game.write(teamchain); + saved_game.write(teammaster); + saved_game.write(lastEnemy); + saved_game.write(wait); + saved_game.write(random); + saved_game.write(delay); + saved_game.write(alt_fire); + saved_game.write(count); + saved_game.write(bounceCount); + saved_game.write(fly_sound_debounce_time); + saved_game.write(painDebounceTime); + saved_game.write(disconnectDebounceTime); + saved_game.write(attackDebounceTime); + saved_game.write(pushDebounceTime); + saved_game.write(aimDebounceTime); + saved_game.write(useDebounceTime); + saved_game.write(trigger_formation); + saved_game.write(waypoint); + saved_game.write(lastWaypoint); + saved_game.write(lastValidWaypoint); + saved_game.write(noWaypointTime); + saved_game.write(combatPoint); + saved_game.write(failedWaypoints); + saved_game.write(failedWaypointCheckTime); + saved_game.write(loopAnim); + saved_game.write(startFrame); + saved_game.write(endFrame); + saved_game.write(sequencer); + saved_game.write(taskManager); + saved_game.write(taskID); + saved_game.write(parms); + saved_game.write(behaviorSet); + saved_game.write(script_targetname); + saved_game.write(delayScriptTime); + saved_game.write(fullName); + saved_game.write(soundSet); + saved_game.write(setTime); + saved_game.write(cameraGroup); + saved_game.write(noDamageTeam); + saved_game.write(playerModel); + saved_game.write(weaponModel); + saved_game.write(handRBolt); + saved_game.write(handLBolt); + saved_game.write(headBolt); + saved_game.write(cervicalBolt); + saved_game.write(chestBolt); + saved_game.write(gutBolt); + saved_game.write(torsoBolt); + saved_game.write(crotchBolt); + saved_game.write(motionBolt); + saved_game.write(kneeLBolt); + saved_game.write(kneeRBolt); + saved_game.write(elbowLBolt); + saved_game.write(elbowRBolt); + saved_game.write(footLBolt); + saved_game.write(footRBolt); + saved_game.write(faceBone); + saved_game.write(craniumBone); + saved_game.write(cervicalBone); + saved_game.write(thoracicBone); + saved_game.write(upperLumbarBone); + saved_game.write(lowerLumbarBone); + saved_game.write(hipsBone); + saved_game.write(motionBone); + saved_game.write(rootBone); + saved_game.write(footLBone); + saved_game.write(footRBone); + saved_game.write(genericBone1); + saved_game.write(genericBone2); + saved_game.write(genericBone3); + saved_game.write(genericBolt1); + saved_game.write(genericBolt2); + saved_game.write(genericBolt3); + saved_game.write(genericBolt4); + saved_game.write(genericBolt5); + saved_game.write(cinematicModel); + saved_game.write(NPC); + saved_game.write(ownername); + saved_game.write(cantHitEnemyCounter); + saved_game.write(NPC_type); + saved_game.write(NPC_targetname); + saved_game.write(NPC_target); + saved_game.write(moverState); + saved_game.write(soundPos1); + saved_game.write(sound1to2); + saved_game.write(sound2to1); + saved_game.write(soundPos2); + saved_game.write(soundLoop); + saved_game.write(nextTrain); + saved_game.write(prevTrain); + saved_game.write(pos1); + saved_game.write(pos2); + saved_game.write(pos3); + saved_game.write(sounds); + saved_game.write(closetarget); + saved_game.write(opentarget); + saved_game.write(paintarget); + saved_game.write(lockCount); + saved_game.write(radius); + saved_game.write(wpIndex); + saved_game.write(noise_index); + saved_game.write(startRGBA); + saved_game.write(finalRGBA); + saved_game.write(item); + saved_game.write(message); + saved_game.write(lightLevel); + saved_game.write(forcePushTime); + saved_game.write(forcePuller); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read<>(s); + saved_game.read(client); + saved_game.read(inuse); + saved_game.read(linked); + saved_game.read(svFlags); + saved_game.read(bmodel); + saved_game.read(mins); + saved_game.read(maxs); + saved_game.read(contents); + saved_game.read(absmin); + saved_game.read(absmax); + saved_game.read(currentOrigin); + saved_game.read(currentAngles); + saved_game.read(owner); + saved_game.read<>(ghoul2); + saved_game.read(classname); + saved_game.read(spawnflags); + saved_game.read(flags); + saved_game.read(model); + saved_game.read(model2); + saved_game.read(freetime); + saved_game.read(eventTime); + saved_game.read(freeAfterEvent); + saved_game.read(unlinkAfterEvent); + saved_game.read(physicsBounce); + saved_game.read(clipmask); + saved_game.read(speed); + saved_game.read(movedir); + saved_game.read(lastOrigin); + saved_game.read(lastAngles); + saved_game.read(mass); + saved_game.read(lastImpact); + saved_game.read(watertype); + saved_game.read(waterlevel); + saved_game.read(angle); + saved_game.read(target); + saved_game.read(target2); + saved_game.read(target3); + saved_game.read(target4); + saved_game.read(targetname); + saved_game.read(team); + saved_game.read(roff); + saved_game.read(roff_ctr); + saved_game.read(next_roff_time); + saved_game.read(fx_time); + saved_game.read(nextthink); + saved_game.read(e_ThinkFunc); + saved_game.read(e_clThinkFunc); + saved_game.read(e_ReachedFunc); + saved_game.read(e_BlockedFunc); + saved_game.read(e_TouchFunc); + saved_game.read(e_UseFunc); + saved_game.read(e_PainFunc); + saved_game.read(e_DieFunc); + saved_game.read(health); + saved_game.read(max_health); + saved_game.read(takedamage); + saved_game.read(material); + saved_game.read(damage); + saved_game.read(dflags); + saved_game.read(splashDamage); + saved_game.read(splashRadius); + saved_game.read(methodOfDeath); + saved_game.read(splashMethodOfDeath); + saved_game.read(locationDamage); + saved_game.read(chain); + saved_game.read(enemy); + saved_game.read(activator); + saved_game.read(teamchain); + saved_game.read(teammaster); + saved_game.read(lastEnemy); + saved_game.read(wait); + saved_game.read(random); + saved_game.read(delay); + saved_game.read(alt_fire); + saved_game.read(count); + saved_game.read(bounceCount); + saved_game.read(fly_sound_debounce_time); + saved_game.read(painDebounceTime); + saved_game.read(disconnectDebounceTime); + saved_game.read(attackDebounceTime); + saved_game.read(pushDebounceTime); + saved_game.read(aimDebounceTime); + saved_game.read(useDebounceTime); + saved_game.read(trigger_formation); + saved_game.read(waypoint); + saved_game.read(lastWaypoint); + saved_game.read(lastValidWaypoint); + saved_game.read(noWaypointTime); + saved_game.read(combatPoint); + saved_game.read(failedWaypoints); + saved_game.read(failedWaypointCheckTime); + saved_game.read(loopAnim); + saved_game.read(startFrame); + saved_game.read(endFrame); + saved_game.read(sequencer); + saved_game.read(taskManager); + saved_game.read(taskID); + saved_game.read(parms); + saved_game.read(behaviorSet); + saved_game.read(script_targetname); + saved_game.read(delayScriptTime); + saved_game.read(fullName); + saved_game.read(soundSet); + saved_game.read(setTime); + saved_game.read(cameraGroup); + saved_game.read(noDamageTeam); + saved_game.read(playerModel); + saved_game.read(weaponModel); + saved_game.read(handRBolt); + saved_game.read(handLBolt); + saved_game.read(headBolt); + saved_game.read(cervicalBolt); + saved_game.read(chestBolt); + saved_game.read(gutBolt); + saved_game.read(torsoBolt); + saved_game.read(crotchBolt); + saved_game.read(motionBolt); + saved_game.read(kneeLBolt); + saved_game.read(kneeRBolt); + saved_game.read(elbowLBolt); + saved_game.read(elbowRBolt); + saved_game.read(footLBolt); + saved_game.read(footRBolt); + saved_game.read(faceBone); + saved_game.read(craniumBone); + saved_game.read(cervicalBone); + saved_game.read(thoracicBone); + saved_game.read(upperLumbarBone); + saved_game.read(lowerLumbarBone); + saved_game.read(hipsBone); + saved_game.read(motionBone); + saved_game.read(rootBone); + saved_game.read(footLBone); + saved_game.read(footRBone); + saved_game.read(genericBone1); + saved_game.read(genericBone2); + saved_game.read(genericBone3); + saved_game.read(genericBolt1); + saved_game.read(genericBolt2); + saved_game.read(genericBolt3); + saved_game.read(genericBolt4); + saved_game.read(genericBolt5); + saved_game.read(cinematicModel); + saved_game.read(NPC); + saved_game.read(ownername); + saved_game.read(cantHitEnemyCounter); + saved_game.read(NPC_type); + saved_game.read(NPC_targetname); + saved_game.read(NPC_target); + saved_game.read(moverState); + saved_game.read(soundPos1); + saved_game.read(sound1to2); + saved_game.read(sound2to1); + saved_game.read(soundPos2); + saved_game.read(soundLoop); + saved_game.read(nextTrain); + saved_game.read(prevTrain); + saved_game.read(pos1); + saved_game.read(pos2); + saved_game.read(pos3); + saved_game.read(sounds); + saved_game.read(closetarget); + saved_game.read(opentarget); + saved_game.read(paintarget); + saved_game.read(lockCount); + saved_game.read(radius); + saved_game.read(wpIndex); + saved_game.read(noise_index); + saved_game.read(startRGBA); + saved_game.read(finalRGBA); + saved_game.read(item); + saved_game.read(message); + saved_game.read(lightLevel); + saved_game.read(forcePushTime); + saved_game.read(forcePuller); + } }; #endif //#ifdef GAME_INCLUDE diff --git a/shared/qcommon/ojk_scope_guard.h b/shared/qcommon/ojk_scope_guard.h index 3cf39c96b0..b21a49dd9f 100644 --- a/shared/qcommon/ojk_scope_guard.h +++ b/shared/qcommon/ojk_scope_guard.h @@ -18,37 +18,37 @@ namespace ojk class ScopeGuard { public: - using Callback = std::function; + using Callback = std::function; - ScopeGuard( - Callback leave_callback) : - leave_callback_(leave_callback) - { - } + ScopeGuard( + Callback leave_callback) : + leave_callback_(leave_callback) + { + } - ScopeGuard( - Callback enter_callback, - Callback leave_callback) : - ScopeGuard(leave_callback) - { - enter_callback(); - } + ScopeGuard( + Callback enter_callback, + Callback leave_callback) : + ScopeGuard(leave_callback) + { + enter_callback(); + } - ScopeGuard( - const ScopeGuard& that) = delete; + ScopeGuard( + const ScopeGuard& that) = delete; - ScopeGuard& operator=( - const ScopeGuard& that) = delete; + ScopeGuard& operator=( + const ScopeGuard& that) = delete; - ~ScopeGuard() - { - leave_callback_(); - } + ~ScopeGuard() + { + leave_callback_(); + } private: - Callback leave_callback_; + Callback leave_callback_; }; // ScopeGuard From 2cdbf4192e601c0d9b72b62502f8133cdc136e4d Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 7 Aug 2016 21:46:10 +0300 Subject: [PATCH 296/445] SG: Add checks for file handle --- shared/qcommon/ojk_i_saved_game.h | 7 ++- shared/qcommon/ojk_saved_game.cpp | 51 +++++++++++++++++++--- shared/qcommon/ojk_saved_game_helper_fwd.h | 13 ++++++ 3 files changed, 65 insertions(+), 6 deletions(-) diff --git a/shared/qcommon/ojk_i_saved_game.h b/shared/qcommon/ojk_i_saved_game.h index f4d01409d9..50bad4f3f3 100644 --- a/shared/qcommon/ojk_i_saved_game.h +++ b/shared/qcommon/ojk_i_saved_game.h @@ -32,7 +32,8 @@ class ISavedGame } - // Tries to reads a chunk from the file into the internal buffer. + // Reads a chunk from the file into the internal buffer. + // Returns true on success or false otherwise. virtual bool read_chunk( const uint32_t chunk_id) = 0; @@ -44,21 +45,25 @@ class ISavedGame // Writes a chunk into the file from the internal buffer. + // Returns true on success or false otherwise. virtual bool write_chunk( const uint32_t chunk_id) = 0; // Reads data from the internal buffer. + // Returns true on success or false otherwise. virtual bool read( void* dst_data, int dst_size) = 0; // Writes data into the internal buffer. + // Returns true on success or false otherwise. virtual bool write( const void* src_data, int src_size) = 0; // Increments buffer's offset by the specified non-negative count. + // Returns true on success or false otherwise. virtual bool skip( int count) = 0; diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index 708fc2854c..ede9b5a256 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -163,10 +163,8 @@ void SavedGame::close() file_handle_ = 0; } - error_message_.clear(); - - io_buffer_.clear(); - io_buffer_offset_ = 0; + clear_error(); + reset_buffer(); saved_io_buffer_.clear(); saved_io_buffer_offset_ = 0; @@ -175,7 +173,6 @@ void SavedGame::close() is_readable_ = false; is_writable_ = false; - is_failed_ = false; } bool SavedGame::read_chunk( @@ -186,6 +183,12 @@ bool SavedGame::read_chunk( return false; } + if (file_handle_ == 0) + { + is_failed_ = true; + error_message_ = "Not open or created."; + return false; + } io_buffer_offset_ = 0; @@ -352,6 +355,16 @@ bool SavedGame::read_chunk( bool SavedGame::is_all_data_read() const { + if (is_failed_) + { + return false; + } + + if (file_handle_ == 0) + { + return false; + } + return io_buffer_.size() == io_buffer_offset_; } @@ -373,6 +386,13 @@ bool SavedGame::write_chunk( return false; } + if (file_handle_ == 0) + { + is_failed_ = true; + error_message_ = "Not open or created."; + return false; + } + const auto chunk_id_string = get_chunk_id_string( chunk_id); @@ -548,6 +568,13 @@ bool SavedGame::read( return false; } + if (file_handle_ == 0) + { + is_failed_ = true; + error_message_ = "Not open or created."; + return false; + } + if (!dst_data) { is_failed_ = true; @@ -600,6 +627,13 @@ bool SavedGame::write( return false; } + if (file_handle_ == 0) + { + is_failed_ = true; + error_message_ = "Not open or created."; + return false; + } + if (!src_data) { is_failed_ = true; @@ -654,6 +688,13 @@ bool SavedGame::skip( return false; } + if (file_handle_ == 0) + { + is_failed_ = true; + error_message_ = "Not open or created."; + return false; + } + if (!is_readable_ && !is_writable_) { is_failed_ = true; diff --git a/shared/qcommon/ojk_saved_game_helper_fwd.h b/shared/qcommon/ojk_saved_game_helper_fwd.h index 7dee5b6584..a2f866cd91 100644 --- a/shared/qcommon/ojk_saved_game_helper_fwd.h +++ b/shared/qcommon/ojk_saved_game_helper_fwd.h @@ -22,25 +22,38 @@ class SavedGameHelper ISavedGame* saved_game); + // Reads a chunk from the file into the internal buffer. + // Calls error method on failure. void read_chunk( const uint32_t chunk_id); + // Writes a chunk into the file from the internal buffer. + // Calls error method on failure. void write_chunk( const uint32_t chunk_id); + // Increments buffer's offset by the specified non-negative count. + // Calls error method on failure. void skip( int count); + // Clears buffer and resets it's offset to the beginning. const void* get_buffer_data(); + // Returns a current size of the I/O buffer. int get_buffer_size() const; + // Clears buffer and resets it's offset to the beginning. void reset_buffer(); + // Resets buffer offset to the beginning. void reset_buffer_offset(); + // Calls error method if not all data read. void ensure_all_data_read(); + // Error flag. + // Returns true if read/write operation failed otherwise false. bool is_failed() const; From 4f47e3d4dfbef6008cb6396d0bc9dcac54cce5d4 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Wed, 10 Aug 2016 21:10:51 +0300 Subject: [PATCH 297/445] Fix variable name --- code/server/sv_savegame.cpp | 40 ++++++++++++++++++------------------ codeJK2/icarus/Sequencer.cpp | 2 -- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 7372c21af0..07117796b5 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -754,8 +754,8 @@ int SG_GetSaveGameComment( auto& saved_game = ojk::SavedGame::get_instance(); - ojk::SavedGameHelper saved_game( - &saved_game); + ojk::SavedGameHelper sgh( + &ojk::SavedGame::get_instance()); if (!saved_game.open( psPathlessBaseName)) @@ -765,7 +765,7 @@ int SG_GetSaveGameComment( bool is_succeed = true; - is_succeed = saved_game.try_read_chunk( + is_succeed = sgh.try_read_chunk( INT_ID('C', 'O', 'M', 'M'), sComment, iSG_COMMENT_SIZE); @@ -776,7 +776,7 @@ int SG_GetSaveGameComment( { unsigned int fileTime = 0; - is_succeed = saved_game.try_read_chunk( + is_succeed = sgh.try_read_chunk( INT_ID('C', 'M', 'T', 'M'), fileTime); @@ -792,21 +792,21 @@ int SG_GetSaveGameComment( { size_t iScreenShotLength; - is_succeed = saved_game.try_read_chunk( + is_succeed = sgh.try_read_chunk( INT_ID('S', 'H', 'L', 'N'), iScreenShotLength); } if (is_succeed) { - saved_game.read_chunk( + sgh.read_chunk( INT_ID('S', 'H', 'O', 'T')); } #endif if (is_succeed) { - saved_game.read_chunk( + sgh.read_chunk( INT_ID('M', 'P', 'C', 'M'), sMapName, iSG_MAPCMD_SIZE); @@ -913,13 +913,13 @@ qboolean SG_GetSaveImage(const char *psPathlessBaseName, void *pvAddress) return qfalse; } - ojk::SavedGameHelper saved_game( + ojk::SavedGameHelper sgh( &saved_game); - saved_game.read_chunk( + sgh.read_chunk( INT_ID('C', 'O', 'M', 'M')); - saved_game.read_chunk( + sgh.read_chunk( INT_ID('C', 'M', 'T', 'M')); auto bGotSaveImage = SG_ReadScreenshot( @@ -1064,7 +1064,7 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) } //END JLF - ojk::SavedGameHelper saved_game( + ojk::SavedGameHelper sgh( &saved_game); char sMapCmd[iSG_MAPCMD_SIZE]={0}; @@ -1075,7 +1075,7 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) SG_WriteScreenshot(qbAutosave, sMapCmd); #endif - saved_game.write_chunk( + sgh.write_chunk( INT_ID('M', 'P', 'C', 'M'), sMapCmd); @@ -1087,11 +1087,11 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) // if (!qbAutosave) { - saved_game.write_chunk( + sgh.write_chunk( INT_ID('T', 'I', 'M', 'E'), ::sv.time); - saved_game.write_chunk( + sgh.write_chunk( INT_ID('T', 'I', 'M', 'R'), ::sv.timeResidual); @@ -1134,7 +1134,7 @@ qboolean SG_ReadSavegame( auto& saved_game = ojk::SavedGame::get_instance(); - ojk::SavedGameHelper saved_game( + ojk::SavedGameHelper sgh( &saved_game); const auto iPrevTestSave = ::sv_testsave->integer; @@ -1177,7 +1177,7 @@ qboolean SG_ReadSavegame( // Read in all the server data... // - saved_game.read_chunk( + sgh.read_chunk( INT_ID('C', 'O', 'M', 'M'), sComment); @@ -1185,7 +1185,7 @@ qboolean SG_ReadSavegame( "Reading: %s\n", sComment); - saved_game.read_chunk( + sgh.read_chunk( INT_ID('C', 'M', 'T', 'M')); #ifdef JK2_MODE @@ -1193,7 +1193,7 @@ qboolean SG_ReadSavegame( qtrue); #endif - saved_game.read_chunk( + sgh.read_chunk( INT_ID('M', 'P', 'C', 'M'), sMapCmd); @@ -1214,11 +1214,11 @@ qboolean SG_ReadSavegame( // if (!qbAutosave) { - saved_game.read_chunk( + sgh.read_chunk( INT_ID('T', 'I', 'M', 'E'), ::sv.time); - saved_game.read_chunk( + sgh.read_chunk( INT_ID('T', 'I', 'M', 'R'), ::sv.timeResidual); diff --git a/codeJK2/icarus/Sequencer.cpp b/codeJK2/icarus/Sequencer.cpp index b8f6b2b303..8374a882a8 100644 --- a/codeJK2/icarus/Sequencer.cpp +++ b/codeJK2/icarus/Sequencer.cpp @@ -2327,8 +2327,6 @@ int CSequencer::Save( void ) taskSequence_m::iterator ti; int numSequences = 0, id, numTasks; - auto saved_game = m_ie->saved_game; - //Get the number of sequences to save out numSequences = m_sequences.size(); From dee86c3be8d4543627df63eff53bf483088c9276 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Wed, 10 Aug 2016 21:11:09 +0300 Subject: [PATCH 298/445] JO: Restore CS_PLAYERS value --- code/qcommon/q_shared.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index bbb5f7b0c1..80ca063bbd 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -1440,16 +1440,12 @@ Ghoul2 Insert End #define CS_SOUNDS (CS_SKYBOXORG+1) #endif // JK2_MODE -#ifdef JK2_MODE -#define CS_PLAYERS (CS_SOUNDS + MAX_SOUNDS) -#else #ifdef BASE_SAVE_COMPAT #define CS_RESERVED1 (CS_SOUNDS+MAX_SOUNDS) // reserved field for base compat from immersion removal #define CS_PLAYERS (CS_RESERVED1 + 96) #else #define CS_PLAYERS (CS_SOUNDS+MAX_SOUNDS) #endif -#endif // JK2_MODE #define CS_LIGHT_STYLES (CS_PLAYERS+MAX_CLIENTS) From 87b551f97685254b58fb22aadad32810d455bfee Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Thu, 11 Aug 2016 22:14:42 +0300 Subject: [PATCH 299/445] JO: Fix saved game and regular screenshots --- code/rd-common/tr_common.h | 2 +- code/rd-common/tr_image_jpg.cpp | 16 ++++++++++++---- code/rd-common/tr_public.h | 2 +- code/server/sv_savegame.cpp | 9 ++++++++- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/code/rd-common/tr_common.h b/code/rd-common/tr_common.h index becdf10e08..4d70883c42 100644 --- a/code/rd-common/tr_common.h +++ b/code/rd-common/tr_common.h @@ -79,7 +79,7 @@ void LoadJPGFromBuffer( byte *inputBuffer, size_t len, byte **pic, int *width, i ================================================================================ */ // Convert raw image data to JPEG format and store in buffer. -size_t RE_SaveJPGToBuffer( byte *buffer, size_t bufSize, int quality, int image_width, int image_height, byte *image_buffer, int padding ); +size_t RE_SaveJPGToBuffer( byte *buffer, size_t bufSize, int quality, int image_width, int image_height, byte *image_buffer, int padding, bool flip_vertical ); // Save raw image data as JPEG image file. void RE_SaveJPG( const char * filename, int quality, int image_width, int image_height, byte *image_buffer, int padding ); diff --git a/code/rd-common/tr_image_jpg.cpp b/code/rd-common/tr_image_jpg.cpp index 4bc19ed8ea..a3ddb84a16 100644 --- a/code/rd-common/tr_image_jpg.cpp +++ b/code/rd-common/tr_image_jpg.cpp @@ -339,7 +339,7 @@ void LoadJPGFromBuffer( byte *inputBuffer, size_t len, unsigned char **pic, int * Here the array is only one element long, but you could ask for * more than one scanline at a time if that's more convenient. */ - buf = ((out+(row_stride*cinfo.output_scanline))); + buf = ((out+(row_stride*(cinfo.output_height - cinfo.output_scanline - 1)))); buffer = &buf; (void) jpeg_read_scanlines(&cinfo, buffer, 1); } @@ -492,7 +492,7 @@ Expects RGB input data ================= */ size_t RE_SaveJPGToBuffer(byte *buffer, size_t bufSize, int quality, - int image_width, int image_height, byte *image_buffer, int padding) + int image_width, int image_height, byte *image_buffer, int padding, bool flip_vertical) { struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; @@ -543,7 +543,15 @@ size_t RE_SaveJPGToBuffer(byte *buffer, size_t bufSize, int quality, * Here the array is only one element long, but you could pass * more than one scanline at a time if that's more convenient. */ - row_pointer[0] = &image_buffer[((cinfo.image_height-1)*row_stride)-cinfo.next_scanline * row_stride]; + + int row_index = cinfo.next_scanline; + + if (!flip_vertical) + { + row_index = cinfo.image_height - cinfo.next_scanline - 1; + } + + row_pointer[0] = &image_buffer[row_index * row_stride]; (void) jpeg_write_scanlines(&cinfo, row_pointer, 1); } @@ -569,7 +577,7 @@ void RE_SaveJPG(const char * filename, int quality, int image_width, int image_h bufSize = image_width * image_height * 3; out = (byte *) R_Malloc( bufSize, TAG_TEMP_WORKSPACE, qfalse ); - bufSize = RE_SaveJPGToBuffer(out, bufSize, quality, image_width, image_height, image_buffer, padding); + bufSize = RE_SaveJPGToBuffer(out, bufSize, quality, image_width, image_height, image_buffer, padding, false); ri.FS_WriteFile(filename, out, bufSize); R_Free(out); diff --git a/code/rd-common/tr_public.h b/code/rd-common/tr_public.h index 73e96aa226..850a68fc22 100644 --- a/code/rd-common/tr_public.h +++ b/code/rd-common/tr_public.h @@ -209,7 +209,7 @@ typedef struct { void (*GetScreenShot)(byte *data, int w, int h); #ifdef JK2_MODE - size_t (*SaveJPGToBuffer)(byte *buffer, size_t bufSize, int quality, int image_width, int image_height, byte *image_buffer, int padding ); + size_t (*SaveJPGToBuffer)(byte *buffer, size_t bufSize, int quality, int image_width, int image_height, byte *image_buffer, int padding, bool flip_vertical ); void (*LoadJPGFromBuffer)( byte *inputBuffer, size_t len, byte **pic, int *width, int *height ); #endif diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 07117796b5..d3c4635381 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -977,7 +977,14 @@ static void SG_WriteScreenshot(qboolean qbAutosave, const char *psMapName) size_t iJPGDataSize = 0; size_t bufSize = SG_SCR_WIDTH * SG_SCR_HEIGHT * 3; byte *pJPGData = (byte *)Z_Malloc( static_cast(bufSize), TAG_TEMP_WORKSPACE, qfalse, 4 ); - iJPGDataSize = re.SaveJPGToBuffer(pJPGData, bufSize, JPEG_IMAGE_QUALITY, SG_SCR_WIDTH, SG_SCR_HEIGHT, pbRawScreenShot, 0 ); + +#ifdef JK2_MODE + bool flip_vertical = true; +#else + bool flip_vertical = false; +#endif // JK2_MODE + + iJPGDataSize = re.SaveJPGToBuffer(pJPGData, bufSize, JPEG_IMAGE_QUALITY, SG_SCR_WIDTH, SG_SCR_HEIGHT, pbRawScreenShot, 0, flip_vertical ); if ( qbAutosave ) delete[] byBlank; From 3f439ad17e415d20b1a8c7dca353c7654f7a5ddd Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Fri, 12 Aug 2016 21:32:36 +0300 Subject: [PATCH 300/445] Revise sv_savegame --- code/server/sv_savegame.cpp | 188 +++++++++++++++------ shared/qcommon/ojk_saved_game_helper.h | 7 + shared/qcommon/ojk_saved_game_helper_fwd.h | 5 + 3 files changed, 151 insertions(+), 49 deletions(-) diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index d3c4635381..8dcedcd538 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -58,7 +58,6 @@ char sLastSaveFileLoaded[MAX_QPATH]={0}; #endif // JK2_MODE static char *SG_GetSaveGameMapName(const char *psPathlessBaseName); -static void CompressMem_FreeScratchBuffer(void); #ifdef SG_PROFILE @@ -765,11 +764,31 @@ int SG_GetSaveGameComment( bool is_succeed = true; + // Read description + // is_succeed = sgh.try_read_chunk( - INT_ID('C', 'O', 'M', 'M'), - sComment, - iSG_COMMENT_SIZE); + INT_ID('C', 'O', 'M', 'M')); + + if (is_succeed) + { + if (sComment) + { + if (sgh.get_buffer_size() == iSG_COMMENT_SIZE) + { + std::uninitialized_copy_n( + static_cast(sgh.get_buffer_data()), + iSG_COMMENT_SIZE, + sComment); + } + else + { + sComment[0] = '\0'; + } + } + } + // Read timestamp + // auto tFileTime = ::SG_GetTime(0); if (is_succeed) @@ -788,6 +807,9 @@ int SG_GetSaveGameComment( } #ifdef JK2_MODE + // Read screenshot + // + if (is_succeed) { size_t iScreenShotLength; @@ -799,17 +821,35 @@ int SG_GetSaveGameComment( if (is_succeed) { - sgh.read_chunk( + is_succeed = sgh.try_read_chunk( INT_ID('S', 'H', 'O', 'T')); } #endif + // Read mapname + // if (is_succeed) { - sgh.read_chunk( - INT_ID('M', 'P', 'C', 'M'), - sMapName, - iSG_MAPCMD_SIZE); + is_succeed = sgh.try_read_chunk( + INT_ID('M', 'P', 'C', 'M')); + + if (is_succeed) + { + if (sMapName) + { + if (sgh.get_buffer_size() == iSG_MAPCMD_SIZE) + { + std::uninitialized_copy_n( + static_cast(sgh.get_buffer_data()), + iSG_MAPCMD_SIZE, + sMapName); + } + else + { + sMapName[0] = '\0'; + } + } + } } ret = tFileTime; @@ -840,95 +880,144 @@ static char *SG_GetSaveGameMapName(const char *psPathlessBaseName) // pass in qtrue to set as loading screen, else pass in pvDest to read it into there... // #ifdef JK2_MODE -static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest = NULL); -static qboolean SG_ReadScreenshot(qboolean qbSetAsLoadingScreen, void *pvDest) +static bool SG_ReadScreenshot( + bool set_as_loading_screen, + void* screenshot_ptr) { - qboolean bReturn = qfalse; + bool is_succeed = true; ojk::SavedGameHelper saved_game( &ojk::SavedGame::get_instance()); // get JPG screenshot data length... // - size_t iScreenShotLength = 0; + size_t screenshot_length = 0; - saved_game.read_chunk( + is_succeed = saved_game.try_read_chunk( INT_ID('S', 'H', 'L', 'N'), - iScreenShotLength); + screenshot_length); // // alloc enough space plus extra 4K for sloppy JPG-decode reader to not do memory access violation... // - byte *pJPGData = (byte *) Z_Malloc(static_cast(iScreenShotLength + 4096),TAG_TEMP_WORKSPACE, qfalse); + byte* jpeg_data = nullptr; + + if (is_succeed) + { + jpeg_data = static_cast(::Z_Malloc( + static_cast(screenshot_length + 4096), + TAG_TEMP_WORKSPACE, + false)); + } + // // now read the JPG data... // - saved_game.read_chunk( - INT_ID('S', 'H', 'O', 'T'), - pJPGData, - static_cast(iScreenShotLength)); + if (is_succeed) + { + is_succeed = saved_game.try_read_chunk( + INT_ID('S', 'H', 'O', 'T'), + jpeg_data, + static_cast(screenshot_length)); + } // // decompress JPG data... // - byte *pDecompressedPic = NULL; - int iWidth, iHeight; - re.LoadJPGFromBuffer(pJPGData, iScreenShotLength, &pDecompressedPic, &iWidth, &iHeight); - // - // if the loaded image is the same size as the game is expecting, then copy it to supplied arg (if present)... - // - if (iWidth == SG_SCR_WIDTH && iHeight == SG_SCR_HEIGHT) + byte* image = NULL; + int width; + int height; + + if (is_succeed) { - bReturn = qtrue; + ::re.LoadJPGFromBuffer( + jpeg_data, + screenshot_length, + &image, + &width, + &height); - if (pvDest) + // + // if the loaded image is the same size as the game is expecting, then copy it to supplied arg (if present)... + // + if (width == SG_SCR_WIDTH && height == SG_SCR_HEIGHT) { - memcpy(pvDest, pDecompressedPic, SG_SCR_WIDTH * SG_SCR_HEIGHT * 4); - } + if (screenshot_ptr) + { + ::memcpy( + screenshot_ptr, + image, + SG_SCR_WIDTH * SG_SCR_HEIGHT * 4); + } - if (qbSetAsLoadingScreen) + if (set_as_loading_screen) + { + ::SCR_SetScreenshot( + image, + SG_SCR_WIDTH, + SG_SCR_HEIGHT); + } + } + else { - SCR_SetScreenshot((byte *)pDecompressedPic, SG_SCR_WIDTH, SG_SCR_HEIGHT); + is_succeed = false; } } - Z_Free( pJPGData ); - Z_Free( pDecompressedPic ); + if (jpeg_data) + { + ::Z_Free(jpeg_data); + } + + if (image) + { + ::Z_Free(image); + } - return bReturn; + return is_succeed; } // Gets the savegame screenshot // -qboolean SG_GetSaveImage(const char *psPathlessBaseName, void *pvAddress) +qboolean SG_GetSaveImage( + const char* base_name, + void* image_ptr) { - if (!psPathlessBaseName) + if (!base_name) { - return qfalse; + return false; } auto& saved_game = ojk::SavedGame::get_instance(); - if (!saved_game.open(psPathlessBaseName)) + if (!saved_game.open(base_name)) { - return qfalse; + return false; } + bool is_succeed = true; + ojk::SavedGameHelper sgh( &saved_game); - sgh.read_chunk( + is_succeed = sgh.try_read_chunk( INT_ID('C', 'O', 'M', 'M')); - sgh.read_chunk( - INT_ID('C', 'M', 'T', 'M')); + if (is_succeed) + { + is_succeed = sgh.try_read_chunk( + INT_ID('C', 'M', 'T', 'M')); + } - auto bGotSaveImage = SG_ReadScreenshot( - qfalse, - pvAddress); + if (is_succeed) + { + is_succeed = SG_ReadScreenshot( + false, + image_ptr); + } saved_game.close(); - return bGotSaveImage; + return is_succeed; } @@ -1197,7 +1286,8 @@ qboolean SG_ReadSavegame( #ifdef JK2_MODE ::SG_ReadScreenshot( - qtrue); + true, + nullptr); #endif sgh.read_chunk( diff --git a/shared/qcommon/ojk_saved_game_helper.h b/shared/qcommon/ojk_saved_game_helper.h index 1b3cc2ad1d..b3c9754e82 100644 --- a/shared/qcommon/ojk_saved_game_helper.h +++ b/shared/qcommon/ojk_saved_game_helper.h @@ -100,6 +100,13 @@ inline bool SavedGameHelper::is_failed() const // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // try_read_chunk +inline bool SavedGameHelper::try_read_chunk( + const uint32_t chunk_id) +{ + return saved_game_->read_chunk( + chunk_id); +} + template bool SavedGameHelper::try_read_chunk( const uint32_t chunk_id, diff --git a/shared/qcommon/ojk_saved_game_helper_fwd.h b/shared/qcommon/ojk_saved_game_helper_fwd.h index a2f866cd91..387398d59e 100644 --- a/shared/qcommon/ojk_saved_game_helper_fwd.h +++ b/shared/qcommon/ojk_saved_game_helper_fwd.h @@ -57,6 +57,11 @@ class SavedGameHelper bool is_failed() const; + // Tries to read a chunk's data into the internal buffer. + // Return true on success or false otherwise. + bool try_read_chunk( + const uint32_t chunk_id); + // Tries to read a value or an array of values from the file via // the internal buffer. // Return true on success or false otherwise. From a11a6f3384391a0baa3792626fc197994b8188f6 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 13 Aug 2016 18:03:00 +0300 Subject: [PATCH 301/445] Update game api version --- code/game/g_public.h | 2 +- codeJK2/game/g_public.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/g_public.h b/code/game/g_public.h index 3c712951ec..914468b1b5 100644 --- a/code/game/g_public.h +++ b/code/game/g_public.h @@ -29,7 +29,7 @@ along with this program; if not, see . #include "qcommon/ojk_i_saved_game.h" -#define GAME_API_VERSION 8 +#define GAME_API_VERSION 10 // entity->svFlags // the server does not know how to interpret most of the values diff --git a/codeJK2/game/g_public.h b/codeJK2/game/g_public.h index 7627f9b6e0..b4384b68b1 100644 --- a/codeJK2/game/g_public.h +++ b/codeJK2/game/g_public.h @@ -25,7 +25,7 @@ along with this program; if not, see . #define __G_PUBLIC_H__ // g_public.h -- game module information visible to server -#define GAME_API_VERSION 8 // Bumped up to 8, since we support JA's engine now --eez +#define GAME_API_VERSION 10 // Bumped up to 8, since we support JA's engine now --eez // entity->svFlags // the server does not know how to interpret most of the values From dd26951829a00678451bed0550e719dd1f2e7e83 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sat, 13 Aug 2016 18:19:19 +0300 Subject: [PATCH 302/445] Remove unused header --- code/game/g_public.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/game/g_public.h b/code/game/g_public.h index 914468b1b5..8ca8785dfb 100644 --- a/code/game/g_public.h +++ b/code/game/g_public.h @@ -25,10 +25,6 @@ along with this program; if not, see . #define __G_PUBLIC_H__ // g_public.h -- game module information visible to server - -#include "qcommon/ojk_i_saved_game.h" - - #define GAME_API_VERSION 10 // entity->svFlags From 7470c0f2ac3837cc2171d6c8817e0a0f28130a66 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sun, 21 Aug 2016 10:15:33 +0100 Subject: [PATCH 303/445] JK2: Fix errors caused by qboolean enum change --- code/qcommon/strip.cpp | 4 +- code/rd-common/tr_font.cpp | 86 +++++++++++++++++--------------- codeJK2/cgame/FxScheduler.cpp | 2 +- codeJK2/cgame/cg_camera.cpp | 12 ++--- codeJK2/cgame/cg_credits.cpp | 4 +- codeJK2/cgame/cg_draw.cpp | 2 +- codeJK2/cgame/cg_main.cpp | 2 +- codeJK2/cgame/cg_players.cpp | 20 ++++---- codeJK2/cgame/cg_predict.cpp | 4 +- codeJK2/cgame/cg_syscalls.cpp | 10 ++-- codeJK2/cgame/cg_text.cpp | 4 +- codeJK2/cgame/cg_view.cpp | 6 ++- codeJK2/game/AI_Default.cpp | 10 ++-- codeJK2/game/AI_Howler.cpp | 2 +- codeJK2/game/AI_Jedi.cpp | 3 +- codeJK2/game/AI_MineMonster.cpp | 2 +- codeJK2/game/AI_Stormtrooper.cpp | 4 +- codeJK2/game/AI_Utils.cpp | 2 +- codeJK2/game/G_Timer.cpp | 4 +- codeJK2/game/NPC_behavior.cpp | 7 ++- codeJK2/game/NPC_combat.cpp | 2 +- codeJK2/game/NPC_reactions.cpp | 2 +- codeJK2/game/NPC_senses.cpp | 4 +- codeJK2/game/NPC_spawn.cpp | 2 +- codeJK2/game/NPC_stats.cpp | 78 ++++++++++++++--------------- codeJK2/game/Q3_Interface.cpp | 24 ++++----- codeJK2/game/b_local.h | 36 +++++++------ codeJK2/game/bg_panimate.cpp | 2 +- codeJK2/game/bg_slidemove.cpp | 2 +- codeJK2/game/g_active.cpp | 10 ++-- codeJK2/game/g_client.cpp | 4 +- codeJK2/game/g_cmds.cpp | 2 +- codeJK2/game/g_combat.cpp | 12 ++--- codeJK2/game/g_inventory.cpp | 3 +- codeJK2/game/g_main.cpp | 4 +- codeJK2/game/g_misc.cpp | 2 +- codeJK2/game/g_missile.cpp | 6 ++- codeJK2/game/g_mover.cpp | 2 +- codeJK2/game/g_nav.cpp | 14 +++--- codeJK2/game/g_navigator.h | 2 +- codeJK2/game/g_navnew.cpp | 2 +- codeJK2/game/g_object.cpp | 2 +- codeJK2/game/g_roff.cpp | 4 +- codeJK2/game/g_savegame.cpp | 4 +- codeJK2/game/g_shared.h | 4 +- codeJK2/game/g_target.cpp | 2 +- codeJK2/game/wp_saber.cpp | 20 ++++++-- codeJK2/game/wp_saber.h | 2 +- codeJK2/icarus/TaskManager.cpp | 2 +- codeJK2/qcommon/safe/memory.h | 2 +- shared/qcommon/q_math_common.h | 12 +++-- 51 files changed, 243 insertions(+), 216 deletions(-) diff --git a/code/qcommon/strip.cpp b/code/qcommon/strip.cpp index e9bbd77086..fdc2d38f10 100644 --- a/code/qcommon/strip.cpp +++ b/code/qcommon/strip.cpp @@ -1236,7 +1236,7 @@ void JK2SP_Init(void) // Cvar_Set("sp_language", va("%d", SP_LANGUAGE_JAPANESE)); // stetest, do NOT leave in JK2SP_UpdateLanguage(); - sp_language->modified = false; + sp_language->modified = qfalse; JK2SP_Register("con_text", SP_REGISTER_REQUIRED); //reference is CON_TEXT } @@ -1248,7 +1248,7 @@ void JK2SP_CheckForLanguageUpdates(void) if (sp_language && sp_language->modified) { JK2SP_UpdateLanguage(); // force language package to reload - sp_language->modified = false; + sp_language->modified = qfalse; } } diff --git a/code/rd-common/tr_font.cpp b/code/rd-common/tr_font.cpp index 75e9384c6c..0c1cf81661 100644 --- a/code/rd-common/tr_font.cpp +++ b/code/rd-common/tr_font.cpp @@ -287,16 +287,16 @@ int g_iNonScaledCharRange; // this is used with auto-scaling of asian fonts, any extern qboolean Language_IsKorean( void ); -static inline bool Korean_ValidKSC5601Hangul( byte _iHi, byte _iLo ) +static inline qboolean Korean_ValidKSC5601Hangul( byte _iHi, byte _iLo ) { - return (_iHi >=KSC5601_HANGUL_HIBYTE_START && - _iHi <=KSC5601_HANGUL_HIBYTE_STOP && - _iLo > KSC5601_HANGUL_LOBYTE_LOBOUND && - _iLo < KSC5601_HANGUL_LOBYTE_HIBOUND - ); + return (qboolean)( + _iHi >=KSC5601_HANGUL_HIBYTE_START && + _iHi <=KSC5601_HANGUL_HIBYTE_STOP && + _iLo > KSC5601_HANGUL_LOBYTE_LOBOUND && + _iLo < KSC5601_HANGUL_LOBYTE_HIBOUND); } -static inline bool Korean_ValidKSC5601Hangul( unsigned int uiCode ) +static inline qboolean Korean_ValidKSC5601Hangul( unsigned int uiCode ) { return Korean_ValidKSC5601Hangul( uiCode >> 8, uiCode & 0xFF ); } @@ -342,7 +342,7 @@ static int Korean_InitFields(int &iGlyphTPs, const char *&psLang) extern qboolean Language_IsTaiwanese( void ); -static bool Taiwanese_ValidBig5Code( unsigned int uiCode ) +static qboolean Taiwanese_ValidBig5Code( unsigned int uiCode ) { const byte _iHi = (uiCode >> 8)&0xFF; if ( (_iHi >= BIG5_HIBYTE_START0 && _iHi <= BIG5_HIBYTE_STOP0) @@ -355,17 +355,17 @@ static bool Taiwanese_ValidBig5Code( unsigned int uiCode ) (_iLo >= BIG5_LOBYTE_LOBOUND1 && _iLo <= BIG5_LOBYTE_HIBOUND1) ) { - return true; + return qtrue; } } - return false; + return qfalse; } // only call this when Taiwanese_ValidBig5Code() has already returned true... // -static bool Taiwanese_IsTrailingPunctuation( unsigned int uiCode ) +static qboolean Taiwanese_IsTrailingPunctuation( unsigned int uiCode ) { // so far I'm just counting the first 21 chars, those seem to be all the basic punctuation... // @@ -373,10 +373,10 @@ static bool Taiwanese_IsTrailingPunctuation( unsigned int uiCode ) uiCode < (((BIG5_HIBYTE_START0<<8)|BIG5_LOBYTE_LOBOUND0)+20) ) { - return true; + return qtrue; } - return false; + return qfalse; } @@ -427,7 +427,7 @@ static int Taiwanese_InitFields(int &iGlyphTPs, const char *&psLang) extern qboolean Language_IsJapanese( void ); -static bool Japanese_ValidShiftJISCode( byte _iHi, byte _iLo ) +static qboolean Japanese_ValidShiftJISCode( byte _iHi, byte _iLo ) { if ( (_iHi >= SHIFTJIS_HIBYTE_START0 && _iHi <= SHIFTJIS_HIBYTE_STOP0) || (_iHi >= SHIFTJIS_HIBYTE_START1 && _iHi <= SHIFTJIS_HIBYTE_STOP1) @@ -437,14 +437,14 @@ static bool Japanese_ValidShiftJISCode( byte _iHi, byte _iLo ) (_iLo >= SHIFTJIS_LOBYTE_START1 && _iLo <= SHIFTJIS_LOBYTE_STOP1) ) { - return true; + return qtrue; } } - return false; + return qfalse; } -static inline bool Japanese_ValidShiftJISCode( unsigned int uiCode ) +static inline qboolean Japanese_ValidShiftJISCode( unsigned int uiCode ) { return Japanese_ValidShiftJISCode( uiCode >> 8, uiCode & 0xFF ); } @@ -452,7 +452,7 @@ static inline bool Japanese_ValidShiftJISCode( unsigned int uiCode ) // only call this when Japanese_ValidShiftJISCode() has already returned true... // -static bool Japanese_IsTrailingPunctuation( unsigned int uiCode ) +static qboolean Japanese_IsTrailingPunctuation( unsigned int uiCode ) { // so far I'm just counting the first 18 chars, those seem to be all the basic punctuation... // @@ -460,10 +460,10 @@ static bool Japanese_IsTrailingPunctuation( unsigned int uiCode ) uiCode < (((SHIFTJIS_HIBYTE_START0<<8)|SHIFTJIS_LOBYTE_START0)+18) ) { - return true; + return qtrue; } - return false; + return qfalse; } @@ -513,16 +513,16 @@ static int Japanese_InitFields(int &iGlyphTPs, const char *&psLang) extern qboolean Language_IsChinese( void ); -static inline bool Chinese_ValidGBCode( byte _iHi, byte _iLo ) +static inline qboolean Chinese_ValidGBCode( byte _iHi, byte _iLo ) { - return (_iHi >=GB_HIBYTE_START && - _iHi <=GB_HIBYTE_STOP && - _iLo > GB_LOBYTE_LOBOUND && - _iLo < GB_LOBYTE_HIBOUND - ); + return (qboolean)( + _iHi >=GB_HIBYTE_START && + _iHi <=GB_HIBYTE_STOP && + _iLo > GB_LOBYTE_LOBOUND && + _iLo < GB_LOBYTE_HIBOUND); } -static inline bool Chinese_ValidGBCode( unsigned int uiCode) +static inline qboolean Chinese_ValidGBCode( unsigned int uiCode) { return Chinese_ValidGBCode( uiCode >> 8, uiCode & 0xFF ); } @@ -530,7 +530,7 @@ static inline bool Chinese_ValidGBCode( unsigned int uiCode) #ifndef JK2_MODE // only call this when Chinese_ValidGBCode() has already returned true... // -static bool Chinese_IsTrailingPunctuation( unsigned int uiCode ) +static qboolean Chinese_IsTrailingPunctuation( unsigned int uiCode ) { // so far I'm just counting the first 13 chars, those seem to be all the basic punctuation... // @@ -538,10 +538,10 @@ static bool Chinese_IsTrailingPunctuation( unsigned int uiCode ) uiCode < (((GB_HIBYTE_START<<8)|GB_LOBYTE_LOBOUND)+14) ) { - return true; + return qtrue; } - return false; + return qfalse; } #endif @@ -644,9 +644,9 @@ static int Thai_ValidTISCode( const byte *psString, int &iThaiBytes ) // we tell the translators to put an underscore ('_') between each word even though in Thai they're // all jammed together at final output onscreen... // -static inline bool Thai_IsTrailingPunctuation( unsigned int uiCode ) +static inline qboolean Thai_IsTrailingPunctuation( unsigned int uiCode ) { - return uiCode == '_'; + return (qboolean)(uiCode == '_'); } // takes a TIS 1,2 or 3 byte code and collapse down to a 0..n glyph index... @@ -758,13 +758,13 @@ unsigned int AnyLanguage_ReadCharFromString( char *psText, int *piAdvanceCount, if (pbIsTrailingPunctuation) { - *pbIsTrailingPunctuation = (uiLetter == '!' || - uiLetter == '?' || - uiLetter == ',' || - uiLetter == '.' || - uiLetter == ';' || - uiLetter == ':' - ); + *pbIsTrailingPunctuation = (qboolean)( + uiLetter == '!' || + uiLetter == '?' || + uiLetter == ',' || + uiLetter == '.' || + uiLetter == ';' || + uiLetter == ':'); } return uiLetter; @@ -1721,7 +1721,9 @@ void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, c case 32: // Space pLetter = curfont->GetLetter(' '); fx += curfont->mbRoundCalcs ? Round(pLetter->horizAdvance * fScale) : pLetter->horizAdvance * fScale; - bNextTextWouldOverflow = ( iMaxPixelWidth != -1 && ((fx-fox) > (float)iMaxPixelWidth) ); + bNextTextWouldOverflow = (qboolean)( + iMaxPixelWidth != -1 && + ((fx - fox) > (float)iMaxPixelWidth)); break; default: @@ -1733,7 +1735,9 @@ void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, c float fThisScale = uiLetter > 255 ? fScaleAsian : fScale; float fAdvancePixels = curfont->mbRoundCalcs ? Round(pLetter->horizAdvance * fThisScale) : pLetter->horizAdvance * fThisScale; - bNextTextWouldOverflow = ( iMaxPixelWidth != -1 && (((fx+fAdvancePixels)-fox) > (float)iMaxPixelWidth) ); + bNextTextWouldOverflow = (qboolean)( + iMaxPixelWidth != -1 && + (((fx + fAdvancePixels) - fox) > (float)iMaxPixelWidth)); if (!bNextTextWouldOverflow) { // this 'mbRoundCalcs' stuff is crap, but the only way to make the font code work. Sigh... diff --git a/codeJK2/cgame/FxScheduler.cpp b/codeJK2/cgame/FxScheduler.cpp index d6a69c0a00..dbc6bfb86d 100644 --- a/codeJK2/cgame/FxScheduler.cpp +++ b/codeJK2/cgame/FxScheduler.cpp @@ -1066,7 +1066,7 @@ void CFxScheduler::AddScheduledEffects( void ) vec3_t origin; vec3_t axis[3]; int oldEntNum = -1, oldBoltIndex = -1, oldModelNum = -1; - qboolean doesBoltExist = false; + qboolean doesBoltExist = qfalse; itr = mFxSchedule.begin(); diff --git a/codeJK2/cgame/cg_camera.cpp b/codeJK2/cgame/cg_camera.cpp index a66f7ce20f..2c87cc4079 100644 --- a/codeJK2/cgame/cg_camera.cpp +++ b/codeJK2/cgame/cg_camera.cpp @@ -38,7 +38,7 @@ void CGCam_FollowDisable( void ); void CGCam_TrackDisable( void ); void CGCam_Distance( float distance, qboolean initLerp ); void CGCam_DistanceDisable( void ); -extern int CG_CalcFOVFromX( float fov_x ); +extern qboolean CG_CalcFOVFromX( float fov_x ); extern void WP_SaberCatch( gentity_t *self, gentity_t *saber, qboolean switchToSaber ); /* @@ -382,8 +382,8 @@ void CGCam_SetFade( vec4_t dest ) {//Instant completion client_camera.info_state &= ~CAMERA_FADING; client_camera.fade_duration = 0; - Vector4Copy( dest, client_camera.fade_source ); - Vector4Copy( dest, client_camera.fade_color ); + VectorCopy4( dest, client_camera.fade_source ); + VectorCopy4( dest, client_camera.fade_color ); } /* @@ -400,8 +400,8 @@ void CGCam_Fade( vec4_t source, vec4_t dest, float duration ) return; } - Vector4Copy( source, client_camera.fade_source ); - Vector4Copy( dest, client_camera.fade_dest ); + VectorCopy4( source, client_camera.fade_source ); + VectorCopy4( dest, client_camera.fade_dest ); client_camera.fade_duration = duration; client_camera.fade_time = cg.time; @@ -1031,7 +1031,7 @@ void CGCam_UpdateFade( void ) { if ( client_camera.fade_time + client_camera.fade_duration < cg.time ) { - Vector4Copy( client_camera.fade_dest, client_camera.fade_color ); + VectorCopy4( client_camera.fade_dest, client_camera.fade_color ); client_camera.info_state &= ~CAMERA_FADING; } else diff --git a/codeJK2/cgame/cg_credits.cpp b/codeJK2/cgame/cg_credits.cpp index da046afa57..bc2b77ac47 100644 --- a/codeJK2/cgame/cg_credits.cpp +++ b/codeJK2/cgame/cg_credits.cpp @@ -112,9 +112,9 @@ struct CreditData_t CreditCards_t CreditCards; CreditLines_t CreditLines; - bool Running(void) + qboolean Running(void) { - return !!( CreditCards.size() || CreditLines.size() ); + return (qboolean)(CreditCards.size() || CreditLines.size()); } }; diff --git a/codeJK2/cgame/cg_draw.cpp b/codeJK2/cgame/cg_draw.cpp index 3535832c83..1e46df6a05 100644 --- a/codeJK2/cgame/cg_draw.cpp +++ b/codeJK2/cgame/cg_draw.cpp @@ -1022,7 +1022,7 @@ static void CG_DrawZoomMask( void ) if ( random() > 0.98f && ( cg.time & 1024 )) { - flip = !flip; + flip = (qboolean)!flip; } if ( power ) diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index 4023f36ac8..aff306a538 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -1518,7 +1518,7 @@ void CG_StartMusic( qboolean bForceStart ) { Q_strncpyz( parm2, COM_Parse( &s ), sizeof( parm2 ) ); COM_EndParseSession(); - cgi_S_StartBackgroundTrack( parm1, parm2, !bForceStart ); + cgi_S_StartBackgroundTrack( parm1, parm2, (qboolean)!bForceStart ); } /* diff --git a/codeJK2/cgame/cg_players.cpp b/codeJK2/cgame/cg_players.cpp index 6417b0cd8c..ae1bbb4c7a 100644 --- a/codeJK2/cgame/cg_players.cpp +++ b/codeJK2/cgame/cg_players.cpp @@ -441,20 +441,20 @@ void CG_NewClientinfo( int clientNum ) // legsModel v = Info_ValueForKey( configstring, "legsModel" ); - Q_strncpyz( g_entities[clientNum].client->renderInfo.legsModelName, v, - sizeof( g_entities[clientNum].client->renderInfo.legsModelName), qtrue); + Q_strncpyz(g_entities[clientNum].client->renderInfo.legsModelName, v, + sizeof( g_entities[clientNum].client->renderInfo.legsModelName)); // torsoModel v = Info_ValueForKey( configstring, "torsoModel" ); - Q_strncpyz( g_entities[clientNum].client->renderInfo.torsoModelName, v, - sizeof( g_entities[clientNum].client->renderInfo.torsoModelName), qtrue); + Q_strncpyz(g_entities[clientNum].client->renderInfo.torsoModelName, v, + sizeof( g_entities[clientNum].client->renderInfo.torsoModelName)); // headModel v = Info_ValueForKey( configstring, "headModel" ); - Q_strncpyz( g_entities[clientNum].client->renderInfo.headModelName, v, - sizeof( g_entities[clientNum].client->renderInfo.headModelName), qtrue); + Q_strncpyz(g_entities[clientNum].client->renderInfo.headModelName, v, + sizeof( g_entities[clientNum].client->renderInfo.headModelName)); // sounds cvar_t *sex = gi.cvar( "sex", "male", 0 ); @@ -1148,7 +1148,7 @@ void CG_PlayerAnimSounds( int animFileIndex, qboolean torso, int oldFrame, int f {//still in same anim, check for looping anim inSameAnim = qtrue; animation_t *animation = &level.knownAnimFileSets[animFileIndex].animations[anim]; - animBackward = (animation->frameLerp<0); + animBackward = (qboolean)(animation->frameLerp < 0); if ( animation->loopFrames != -1 ) {//a looping anim! loopAnim = qtrue; @@ -1795,7 +1795,7 @@ void CG_ATSTLegsYaw( centity_t *cent, vec3_t trailingLegsAngles ) float legAngleDiff = AngleNormalize180(ATSTLegsYaw) - AngleNormalize180(cent->pe.legs.yawAngle); int legsAnim = cent->currentState.legsAnim; - qboolean moving = (!VectorCompare(cent->gent->client->ps.velocity, vec3_origin)); + qboolean moving = (qboolean)(!VectorCompare(cent->gent->client->ps.velocity, vec3_origin)); if ( moving || legsAnim == BOTH_TURN_LEFT1 || legsAnim == BOTH_TURN_RIGHT1 || fabs(legAngleDiff) > 45 ) {//moving or turning or beyond the turn allowance if ( legsAnim == BOTH_STAND1 && !moving ) @@ -2937,9 +2937,9 @@ static qboolean CG_PlayerShadow( centity_t *const cent, float *const shadowPlane cgs.model_draw, cent->currentState.modelScale); gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, sideOrigin ); sideOrigin[2] += 30; //fudge up a bit for coplaner - bShadowed = _PlayerShadow(sideOrigin, 0, shadowPlane, 28) || bShadowed; + bShadowed = (qboolean)(_PlayerShadow(sideOrigin, 0, shadowPlane, 28) || bShadowed); - bShadowed = _PlayerShadow(cent->lerpOrigin, cent->pe.legs.yawAngle, shadowPlane, 64) || bShadowed; + bShadowed = (qboolean)(_PlayerShadow(cent->lerpOrigin, cent->pe.legs.yawAngle, shadowPlane, 64) || bShadowed); return bShadowed; } else diff --git a/codeJK2/cgame/cg_predict.cpp b/codeJK2/cgame/cg_predict.cpp index acedda0bac..a849076229 100644 --- a/codeJK2/cgame/cg_predict.cpp +++ b/codeJK2/cgame/cg_predict.cpp @@ -524,7 +524,7 @@ void CG_TouchTriggerPrediction( void ) { return; } - spectator = ( cg.predicted_player_state.pm_type == PM_SPECTATOR ); + spectator = (qboolean)( cg.predicted_player_state.pm_type == PM_SPECTATOR ); if ( cg.predicted_player_state.pm_type != PM_NORMAL && !spectator ) { return; @@ -633,7 +633,7 @@ void CG_PredictPlayerState( void ) { cg_pmove.trace = CG_Trace; cg_pmove.pointcontents = CG_PointContents; cg_pmove.tracemask = MASK_PLAYERSOLID; - cg_pmove.noFootsteps = 0;//( cgs.dmflags & DF_NO_FOOTSTEPS ) > 0; + cg_pmove.noFootsteps = qfalse;//( cgs.dmflags & DF_NO_FOOTSTEPS ) > 0; // save the state before the pmove so we can detect transitions oldPlayerState = cg.predicted_player_state; diff --git a/codeJK2/cgame/cg_syscalls.cpp b/codeJK2/cgame/cg_syscalls.cpp index ec2d3502a7..613bb61510 100644 --- a/codeJK2/cgame/cg_syscalls.cpp +++ b/codeJK2/cgame/cg_syscalls.cpp @@ -254,12 +254,12 @@ int cgi_R_Font_HeightPixels(const int iFontIndex, const float scale /*= 1.0f*/) qboolean cgi_Language_IsAsian( void ) { - return Q_syscall( CG_LANGUAGE_ISASIAN ); + return (qboolean)Q_syscall( CG_LANGUAGE_ISASIAN ); } qboolean cgi_Language_UsesSpaces(void) { - return Q_syscall( CG_LANGUAGE_USESSPACES ); + return (qboolean)Q_syscall( CG_LANGUAGE_USESSPACES ); } unsigned int cgi_AnyLanguage_ReadCharFromString( const char **ppText, qboolean *pbIsTrailingPunctuation /* = NULL */ ) @@ -358,11 +358,11 @@ void cgi_GetCurrentSnapshotNumber( int *snapshotNumber, int *serverTime ) { } qboolean cgi_GetSnapshot( int snapshotNumber, snapshot_t *snapshot ) { - return Q_syscall( CG_GETSNAPSHOT, snapshotNumber, snapshot ); + return (qboolean)Q_syscall( CG_GETSNAPSHOT, snapshotNumber, snapshot ); } qboolean cgi_GetServerCommand( int serverCommandNumber ) { - return Q_syscall( CG_GETSERVERCOMMAND, serverCommandNumber ); + return (qboolean)Q_syscall( CG_GETSERVERCOMMAND, serverCommandNumber ); } int cgi_GetCurrentCmdNumber( void ) { @@ -370,7 +370,7 @@ int cgi_GetCurrentCmdNumber( void ) { } qboolean cgi_GetUserCmd( int cmdNumber, usercmd_t *ucmd ) { - return Q_syscall( CG_GETUSERCMD, cmdNumber, ucmd ); + return (qboolean)Q_syscall( CG_GETUSERCMD, cmdNumber, ucmd ); } void cgi_SetUserCmdValue( int stateValue, float sensitivityScale, float mPitchOverride, float mYawOverride ) { diff --git a/codeJK2/cgame/cg_text.cpp b/codeJK2/cgame/cg_text.cpp index d9c68f30fe..c69f3aed5b 100644 --- a/codeJK2/cgame/cg_text.cpp +++ b/codeJK2/cgame/cg_text.cpp @@ -431,7 +431,7 @@ void CG_DrawCaptionText(void) if((textcolor_caption[0] == 0) && (textcolor_caption[1] == 0) && (textcolor_caption[2] == 0) && (textcolor_caption[3] == 0)) { - Vector4Copy( colorTable[CT_WHITE], textcolor_caption ); + VectorCopy4( colorTable[CT_WHITE], textcolor_caption ); } cgi_R_SetColor(textcolor_caption); @@ -727,7 +727,7 @@ void CG_DrawCenterString( void ) if((textcolor_center[0] == 0) && (textcolor_center[1] == 0) && (textcolor_center[2] == 0) && (textcolor_center[3] == 0)) { - Vector4Copy( colorTable[CT_WHITE], textcolor_center ); + VectorCopy4( colorTable[CT_WHITE], textcolor_center ); } start = cg.centerPrint; diff --git a/codeJK2/cgame/cg_view.cpp b/codeJK2/cgame/cg_view.cpp index 3831bcd4f7..2abf8931ae 100644 --- a/codeJK2/cgame/cg_view.cpp +++ b/codeJK2/cgame/cg_view.cpp @@ -1898,7 +1898,11 @@ wasForceSpeed=isForceSpeed; CG_PredictPlayerState(); // decide on third person view - cg.renderingThirdPerson = cg_thirdPerson.integer || (cg.snap->ps.stats[STAT_HEALTH] <= 0) || (g_entities[0].client&&g_entities[0].client->NPC_class==CLASS_ATST); + cg.renderingThirdPerson = (qboolean)( + cg_thirdPerson.integer || + (cg.snap->ps.stats[STAT_HEALTH] <= 0) || + (g_entities[0].client && + g_entities[0].client->NPC_class == CLASS_ATST)); if ( cg.zoomMode ) { diff --git a/codeJK2/game/AI_Default.cpp b/codeJK2/game/AI_Default.cpp index c845b3417b..6bf38b3fc5 100644 --- a/codeJK2/game/AI_Default.cpp +++ b/codeJK2/game/AI_Default.cpp @@ -213,7 +213,11 @@ void NPC_BSStandGuard (void) { if(NPC->client->enemyTeam) { - gentity_t *newenemy = NPC_PickEnemy(NPC, NPC->client->enemyTeam, (NPC->cantHitEnemyCounter < 10), (NPC->client->enemyTeam == TEAM_PLAYER), qtrue); + gentity_t *newenemy = NPC_PickEnemy( + NPC, NPC->client->enemyTeam, + (qboolean)(NPC->cantHitEnemyCounter < 10), + (qboolean)(NPC->client->enemyTeam == TEAM_PLAYER), + qtrue); //only checks for vis if couldn't hit last enemy if(newenemy) { @@ -253,7 +257,7 @@ void NPC_BSHuntAndKill( void ) visibility_t oEVis; int curAnim; - NPC_CheckEnemy( NPCInfo->tempBehavior != BS_HUNT_AND_KILL, qfalse );//don't find new enemy if this is tempbehav + NPC_CheckEnemy( (qboolean)(NPCInfo->tempBehavior != BS_HUNT_AND_KILL), qfalse );//don't find new enemy if this is tempbehav if ( NPC->enemy ) { @@ -751,7 +755,7 @@ void NPC_BSDefault( void ) } } //look for a new enemy if don't have one and are allowed to look, validate current enemy if have one - NPC_CheckEnemy( (NPCInfo->scriptFlags&SCF_LOOK_FOR_ENEMIES), qfalse ); + NPC_CheckEnemy( (qboolean)(NPCInfo->scriptFlags&SCF_LOOK_FOR_ENEMIES), qfalse ); if ( !NPC->enemy ) {//still don't have an enemy if ( !(NPCInfo->scriptFlags&SCF_IGNORE_ALERTS) ) diff --git a/codeJK2/game/AI_Howler.cpp b/codeJK2/game/AI_Howler.cpp index 22c88ee5d2..c7af899104 100644 --- a/codeJK2/game/AI_Howler.cpp +++ b/codeJK2/game/AI_Howler.cpp @@ -181,7 +181,7 @@ void Howler_Combat( void ) } else { - Howler_Move( 1 ); + Howler_Move( qtrue ); } } else diff --git a/codeJK2/game/AI_Jedi.cpp b/codeJK2/game/AI_Jedi.cpp index ef5d3b592c..e2a375a23e 100644 --- a/codeJK2/game/AI_Jedi.cpp +++ b/codeJK2/game/AI_Jedi.cpp @@ -5229,7 +5229,8 @@ void NPC_BSJedi_Default( void ) //FIXME: build a list of all local enemies (since we have to find best anyway) for other AI factors- like when to use group attacks, determine when to change tactics, when surrounded, when blocked by another in the enemy group, etc. Should we build this group list or let the enemies maintain their own list and we just access it? gentity_t *sav_enemy = NPC->enemy;//FIXME: what about NPC->lastEnemy? NPC->enemy = NULL; - gentity_t *newEnemy = NPC_CheckEnemy( NPCInfo->confusionTime < level.time, qfalse, qfalse ); + gentity_t *newEnemy = NPC_CheckEnemy( + (qboolean)(NPCInfo->confusionTime < level.time), qfalse, qfalse ); NPC->enemy = sav_enemy; if ( newEnemy && newEnemy != sav_enemy ) {//picked up a new enemy! diff --git a/codeJK2/game/AI_MineMonster.cpp b/codeJK2/game/AI_MineMonster.cpp index 3e780e041b..11eb0add3a 100644 --- a/codeJK2/game/AI_MineMonster.cpp +++ b/codeJK2/game/AI_MineMonster.cpp @@ -236,7 +236,7 @@ void MineMonster_Combat( void ) } else { - MineMonster_Move( 1 ); + MineMonster_Move( qtrue ); } } else diff --git a/codeJK2/game/AI_Stormtrooper.cpp b/codeJK2/game/AI_Stormtrooper.cpp index d79cd1d118..047c7112da 100644 --- a/codeJK2/game/AI_Stormtrooper.cpp +++ b/codeJK2/game/AI_Stormtrooper.cpp @@ -1596,7 +1596,9 @@ void ST_TransferMoveGoal( gentity_t *self, gentity_t *other ) {//I must be going for a goal, give that to him instead if ( self->NPC->goalEntity == self->NPC->tempGoal ) { - NPC_SetMoveGoal( other, self->NPC->tempGoal->currentOrigin, self->NPC->goalRadius, ((self->NPC->tempGoal->svFlags&SVF_NAVGOAL)?true:false) ); + NPC_SetMoveGoal( + other, self->NPC->tempGoal->currentOrigin, self->NPC->goalRadius, + ((self->NPC->tempGoal->svFlags & SVF_NAVGOAL) ? qtrue : qfalse)); } else { diff --git a/codeJK2/game/AI_Utils.cpp b/codeJK2/game/AI_Utils.cpp index bdd670f394..c5f978335e 100644 --- a/codeJK2/game/AI_Utils.cpp +++ b/codeJK2/game/AI_Utils.cpp @@ -956,7 +956,7 @@ qboolean AI_RefreshGroup( AIGroupInfo_t *group ) //mark this group as not having been run this frame group->processed = qfalse; - return (group->numGroup>0); + return (qboolean)(group->numGroup > 0); } void AI_UpdateGroups( void ) diff --git a/codeJK2/game/G_Timer.cpp b/codeJK2/game/G_Timer.cpp index 9550b00a9d..3890e24e36 100644 --- a/codeJK2/game/G_Timer.cpp +++ b/codeJK2/game/G_Timer.cpp @@ -352,7 +352,7 @@ qboolean TIMER_Done( gentity_t *ent, const char *identifier ) return qtrue; } - return (timer->time < level.time); + return (qboolean)(timer->time < level.time); } /* @@ -375,7 +375,7 @@ qboolean TIMER_Done2( gentity_t *ent, const char *identifier, qboolean remove ) return qfalse; } - res = (timer->time < level.time); + res = (qboolean)(timer->time < level.time); if (res && remove) { diff --git a/codeJK2/game/NPC_behavior.cpp b/codeJK2/game/NPC_behavior.cpp index a9832318c6..ae03d642cb 100644 --- a/codeJK2/game/NPC_behavior.cpp +++ b/codeJK2/game/NPC_behavior.cpp @@ -563,7 +563,8 @@ void NPC_BSFollowLeader (void) if ( !NPC->enemy ) {//no enemy, find one - NPC_CheckEnemy( NPCInfo->confusionTimeconfusionTime < level.time), qfalse ); if ( NPC->enemy ) {//just found one NPCInfo->enemyCheckDebounceTime = level.time + Q_irand( 3000, 10000 ); @@ -621,7 +622,9 @@ void NPC_BSFollowLeader (void) } else if ( NPC->client->ps.weapon && NPCInfo->enemyCheckDebounceTime < level.time ) { - NPC_CheckEnemy( (NPCInfo->confusionTimetempBehavior!=BS_FOLLOW_LEADER), qfalse );//don't find new enemy if this is tempbehav + NPC_CheckEnemy( + (qboolean)((NPCInfo->confusionTime < level.time) || (NPCInfo->tempBehavior != BS_FOLLOW_LEADER)), + qfalse);//don't find new enemy if this is tempbehav } } diff --git a/codeJK2/game/NPC_combat.cpp b/codeJK2/game/NPC_combat.cpp index e0a0282f96..ab0b32614f 100644 --- a/codeJK2/game/NPC_combat.cpp +++ b/codeJK2/game/NPC_combat.cpp @@ -1016,7 +1016,7 @@ HaveWeapon qboolean HaveWeapon( int weapon ) { - return ( client->ps.stats[STAT_WEAPONS] & ( 1 << weapon ) ); + return (qboolean)(client->ps.stats[STAT_WEAPONS] & (1 << weapon)); } qboolean EntIsGlass (gentity_t *check) diff --git a/codeJK2/game/NPC_reactions.cpp b/codeJK2/game/NPC_reactions.cpp index 61ef1528f7..e61cc279a9 100644 --- a/codeJK2/game/NPC_reactions.cpp +++ b/codeJK2/game/NPC_reactions.cpp @@ -900,7 +900,7 @@ void NPC_Respond( gentity_t *self, int userNum ) if ( event != -1 ) { //hack here because we reuse some "combat" and "extra" sounds - qboolean addFlag = (self->NPC->scriptFlags&SCF_NO_COMBAT_TALK); + qboolean addFlag = (qboolean)(self->NPC->scriptFlags & SCF_NO_COMBAT_TALK); self->NPC->scriptFlags &= ~SCF_NO_COMBAT_TALK; G_AddVoiceEvent( self, event, 3000 ); diff --git a/codeJK2/game/NPC_senses.cpp b/codeJK2/game/NPC_senses.cpp index 57e6abc8e5..bf7ee9dfdf 100644 --- a/codeJK2/game/NPC_senses.cpp +++ b/codeJK2/game/NPC_senses.cpp @@ -120,7 +120,7 @@ qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold dot = DotProduct( dir, forward ); - return (dot > threshHold); + return (qboolean)(dot > threshHold); } /* @@ -750,7 +750,7 @@ qboolean RemoveOldestAlert( void ) //make sure this never drops below zero... if it does, something very very bad happened assert( level.numAlertEvents >= 0 ); //return true is have room for one now - return (level.numAlertEventspers.cmd_angles, ucmd.angles ); + VectorCopyM( client->pers.cmd_angles, ucmd.angles ); ent->client->ps.groundEntityNum = ENTITYNUM_NONE; diff --git a/codeJK2/game/NPC_stats.cpp b/codeJK2/game/NPC_stats.cpp index 4aa7aabba3..ecaa627b01 100644 --- a/codeJK2/game/NPC_stats.cpp +++ b/codeJK2/game/NPC_stats.cpp @@ -471,7 +471,7 @@ qboolean G_ParseAnimFileSet( const char *filename, const char *animCFG, int *ani int i; char *slash; - Q_strncpyz( strippedName, filename, sizeof(strippedName), qtrue); + Q_strncpyz(strippedName, filename, sizeof(strippedName)); slash = strchr( strippedName, '/' ); if ( slash ) { @@ -536,7 +536,7 @@ void G_LoadAnimFileSet( gentity_t *ent, const char *modelName ) } else { - Q_strncpyz( animName, GLAName, sizeof( animName ), qtrue ); + Q_strncpyz(animName, GLAName, sizeof( animName )); slash = strrchr( animName, '/' ); if ( slash ) { @@ -623,7 +623,7 @@ void NPC_PrecacheAnimationCFG( const char *NPC_type ) continue; } //must copy data out of this pointer into a different part of memory because the funcs we're about to call will call COM_ParseExt - Q_strncpyz( filename, value, sizeof( filename ), qtrue ); + Q_strncpyz(filename, value, sizeof( filename )); G_ParseAnimFileSet( filename, filename, &junk ); COM_EndParseSession( ); return; @@ -647,7 +647,7 @@ void NPC_PrecacheAnimationCFG( const char *NPC_type ) GLAName = gi.G2API_GetAnimFileNameIndex( handle ); if ( GLAName ) { - Q_strncpyz( animName, GLAName, sizeof( animName ), qtrue ); + Q_strncpyz(animName, GLAName, sizeof( animName )); slash = strrchr( animName, '/' ); if ( slash ) { @@ -656,7 +656,7 @@ void NPC_PrecacheAnimationCFG( const char *NPC_type ) strippedName = COM_SkipPath( animName ); //must copy data out of this pointer into a different part of memory because the funcs we're about to call will call COM_ParseExt - Q_strncpyz( filename, value, sizeof( filename ), qtrue ); + Q_strncpyz(filename, value, sizeof( filename )); G_ParseAnimFileSet( value, strippedName, &junk );//qfalse ); COM_EndParseSession( ); //FIXME: still not precaching the animsounds.cfg? @@ -787,7 +787,7 @@ void NPC_Precache ( gentity_t *spawner ) } else { - Q_strncpyz( ri.headModelName, value, sizeof(ri.headModelName), qtrue); + Q_strncpyz(ri.headModelName, value, sizeof(ri.headModelName)); } md3Model = qtrue; continue; @@ -806,7 +806,7 @@ void NPC_Precache ( gentity_t *spawner ) } else { - Q_strncpyz( ri.torsoModelName, value, sizeof(ri.torsoModelName), qtrue); + Q_strncpyz(ri.torsoModelName, value, sizeof(ri.torsoModelName)); } md3Model = qtrue; continue; @@ -819,7 +819,7 @@ void NPC_Precache ( gentity_t *spawner ) { continue; } - Q_strncpyz( ri.legsModelName, value, sizeof(ri.legsModelName), qtrue); + Q_strncpyz(ri.legsModelName, value, sizeof(ri.legsModelName)); md3Model = qtrue; continue; } @@ -831,7 +831,7 @@ void NPC_Precache ( gentity_t *spawner ) { continue; } - Q_strncpyz( playerModel, value, sizeof(playerModel), qtrue); + Q_strncpyz(playerModel, value, sizeof(playerModel)); md3Model = qfalse; continue; } @@ -843,7 +843,7 @@ void NPC_Precache ( gentity_t *spawner ) { continue; } - Q_strncpyz( customSkin, value, sizeof(customSkin), qtrue); + Q_strncpyz(customSkin, value, sizeof(customSkin)); continue; } @@ -976,13 +976,13 @@ void NPC_BuildRandom( gentity_t *NPC ) { default: case 0: - Q_strncpyz( NPC->client->renderInfo.headModelName, "garren", sizeof(NPC->client->renderInfo.headModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.headModelName, "garren", sizeof(NPC->client->renderInfo.headModelName)); break; case 1: - Q_strncpyz( NPC->client->renderInfo.headModelName, "garren/salma", sizeof(NPC->client->renderInfo.headModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.headModelName, "garren/salma", sizeof(NPC->client->renderInfo.headModelName)); break; case 2: - Q_strncpyz( NPC->client->renderInfo.headModelName, "garren/mackey", sizeof(NPC->client->renderInfo.headModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.headModelName, "garren/mackey", sizeof(NPC->client->renderInfo.headModelName)); color = Q_irand(3, 5);//torso needs to be afam break; } @@ -990,25 +990,25 @@ void NPC_BuildRandom( gentity_t *NPC ) { default: case 0: - Q_strncpyz( NPC->client->renderInfo.torsoModelName, "crewfemale/gold", sizeof(NPC->client->renderInfo.torsoModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.torsoModelName, "crewfemale/gold", sizeof(NPC->client->renderInfo.torsoModelName)); break; case 1: - Q_strncpyz( NPC->client->renderInfo.torsoModelName, "crewfemale", sizeof(NPC->client->renderInfo.torsoModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.torsoModelName, "crewfemale", sizeof(NPC->client->renderInfo.torsoModelName)); break; case 2: - Q_strncpyz( NPC->client->renderInfo.torsoModelName, "crewfemale/blue", sizeof(NPC->client->renderInfo.torsoModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.torsoModelName, "crewfemale/blue", sizeof(NPC->client->renderInfo.torsoModelName)); break; case 3: - Q_strncpyz( NPC->client->renderInfo.torsoModelName, "crewfemale/aframG", sizeof(NPC->client->renderInfo.torsoModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.torsoModelName, "crewfemale/aframG", sizeof(NPC->client->renderInfo.torsoModelName)); break; case 4: - Q_strncpyz( NPC->client->renderInfo.torsoModelName, "crewfemale/aframR", sizeof(NPC->client->renderInfo.torsoModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.torsoModelName, "crewfemale/aframR", sizeof(NPC->client->renderInfo.torsoModelName)); break; case 5: - Q_strncpyz( NPC->client->renderInfo.torsoModelName, "crewfemale/aframB", sizeof(NPC->client->renderInfo.torsoModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.torsoModelName, "crewfemale/aframB", sizeof(NPC->client->renderInfo.torsoModelName)); break; } - Q_strncpyz( NPC->client->renderInfo.legsModelName, "crewfemale", sizeof(NPC->client->renderInfo.legsModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.legsModelName, "crewfemale", sizeof(NPC->client->renderInfo.legsModelName)); break; default: case 1://male @@ -1018,36 +1018,36 @@ void NPC_BuildRandom( gentity_t *NPC ) { default: case 0: - Q_strncpyz( NPC->client->renderInfo.headModelName, "chakotay/nelson", sizeof(NPC->client->renderInfo.headModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.headModelName, "chakotay/nelson", sizeof(NPC->client->renderInfo.headModelName)); break; case 1: - Q_strncpyz( NPC->client->renderInfo.headModelName, "paris/chase", sizeof(NPC->client->renderInfo.headModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.headModelName, "paris/chase", sizeof(NPC->client->renderInfo.headModelName)); break; case 2: - Q_strncpyz( NPC->client->renderInfo.headModelName, "doctor/pasty", sizeof(NPC->client->renderInfo.headModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.headModelName, "doctor/pasty", sizeof(NPC->client->renderInfo.headModelName)); break; case 3: - Q_strncpyz( NPC->client->renderInfo.headModelName, "kim/durk", sizeof(NPC->client->renderInfo.headModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.headModelName, "kim/durk", sizeof(NPC->client->renderInfo.headModelName)); break; case 4: - Q_strncpyz( NPC->client->renderInfo.headModelName, "paris/kray", sizeof(NPC->client->renderInfo.headModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.headModelName, "paris/kray", sizeof(NPC->client->renderInfo.headModelName)); break; } switch( color ) { default: case 0: - Q_strncpyz( NPC->client->renderInfo.torsoModelName, "crewthin/red", sizeof(NPC->client->renderInfo.torsoModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.torsoModelName, "crewthin/red", sizeof(NPC->client->renderInfo.torsoModelName)); break; case 1: - Q_strncpyz( NPC->client->renderInfo.torsoModelName, "crewthin", sizeof(NPC->client->renderInfo.torsoModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.torsoModelName, "crewthin", sizeof(NPC->client->renderInfo.torsoModelName)); break; case 2: - Q_strncpyz( NPC->client->renderInfo.torsoModelName, "crewthin/blue", sizeof(NPC->client->renderInfo.torsoModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.torsoModelName, "crewthin/blue", sizeof(NPC->client->renderInfo.torsoModelName)); break; //NOTE: 3 - 5 should be red, gold & blue, afram hands } - Q_strncpyz( NPC->client->renderInfo.legsModelName, "crewthin", sizeof(NPC->client->renderInfo.legsModelName), qtrue ); + Q_strncpyz(NPC->client->renderInfo.legsModelName, "crewthin", sizeof(NPC->client->renderInfo.legsModelName)); break; } @@ -1128,9 +1128,9 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) //Set defaults //FIXME: should probably put default torso and head models, but what about enemies //that don't have any- like Stasis? - //Q_strncpyz( ri->headModelName, DEFAULT_HEADMODEL, sizeof(ri->headModelName), qtrue); - //Q_strncpyz( ri->torsoModelName, DEFAULT_TORSOMODEL, sizeof(ri->torsoModelName), qtrue); - //Q_strncpyz( ri->legsModelName, DEFAULT_LEGSMODEL, sizeof(ri->legsModelName), qtrue); + //Q_strncpyz( ri->headModelName, DEFAULT_HEADMODEL, sizeof(ri->headModelName)); + //Q_strncpyz( ri->torsoModelName, DEFAULT_TORSOMODEL, sizeof(ri->torsoModelName)); + //Q_strncpyz( ri->legsModelName, DEFAULT_LEGSMODEL, sizeof(ri->legsModelName)); memset( ri->headModelName, 0, sizeof( ri->headModelName ) ); memset( ri->torsoModelName, 0, sizeof( ri->torsoModelName ) ); memset( ri->legsModelName, 0, sizeof( ri->legsModelName ) ); @@ -1243,7 +1243,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } else { - Q_strncpyz( ri->headModelName, value, sizeof(ri->headModelName), qtrue); + Q_strncpyz( ri->headModelName, value, sizeof(ri->headModelName)); } continue; } @@ -1267,7 +1267,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } else { - Q_strncpyz( ri->torsoModelName, value, sizeof(ri->torsoModelName), qtrue); + Q_strncpyz( ri->torsoModelName, value, sizeof(ri->torsoModelName)); } continue; } @@ -1279,7 +1279,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { continue; } - Q_strncpyz( ri->legsModelName, value, sizeof(ri->legsModelName), qtrue); + Q_strncpyz( ri->legsModelName, value, sizeof(ri->legsModelName)); //Need to do this here to get the right index G_ParseAnimFileSet( ri->legsModelName, ri->legsModelName, &ci->animFileIndex ); continue; @@ -1292,7 +1292,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { continue; } - Q_strncpyz( playerModel, value, sizeof(playerModel), qtrue); + Q_strncpyz( playerModel, value, sizeof(playerModel)); md3Model = qfalse; continue; } @@ -1304,7 +1304,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { continue; } - Q_strncpyz( customSkin, value, sizeof(customSkin), qtrue); + Q_strncpyz( customSkin, value, sizeof(customSkin)); continue; } @@ -1322,7 +1322,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } else { - Q_strncpyz( surfOff, value, sizeof(surfOff), qtrue); + Q_strncpyz( surfOff, value, sizeof(surfOff)); } continue; } @@ -1341,7 +1341,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } else { - Q_strncpyz( surfOn, value, sizeof(surfOn), qtrue); + Q_strncpyz( surfOn, value, sizeof(surfOn)); } continue; } diff --git a/codeJK2/game/Q3_Interface.cpp b/codeJK2/game/Q3_Interface.cpp index 95415eed94..7d97995fab 100644 --- a/codeJK2/game/Q3_Interface.cpp +++ b/codeJK2/game/Q3_Interface.cpp @@ -483,39 +483,39 @@ static void SetTextColor ( vec4_t textcolor,const char *color) if (Q_stricmp(color,"BLACK") == 0) { - Vector4Copy( colorTable[CT_BLACK], textcolor ); + VectorCopy4( colorTable[CT_BLACK], textcolor ); } else if (Q_stricmp(color,"RED") == 0) { - Vector4Copy( colorTable[CT_RED], textcolor ); + VectorCopy4( colorTable[CT_RED], textcolor ); } else if (Q_stricmp(color,"GREEN") == 0) { - Vector4Copy( colorTable[CT_GREEN], textcolor ); + VectorCopy4( colorTable[CT_GREEN], textcolor ); } else if (Q_stricmp(color,"YELLOW") == 0) { - Vector4Copy( colorTable[CT_YELLOW], textcolor ); + VectorCopy4( colorTable[CT_YELLOW], textcolor ); } else if (Q_stricmp(color,"BLUE") == 0) { - Vector4Copy( colorTable[CT_BLUE], textcolor ); + VectorCopy4( colorTable[CT_BLUE], textcolor ); } else if (Q_stricmp(color,"CYAN") == 0) { - Vector4Copy( colorTable[CT_CYAN], textcolor ); + VectorCopy4( colorTable[CT_CYAN], textcolor ); } else if (Q_stricmp(color,"MAGENTA") == 0) { - Vector4Copy( colorTable[CT_MAGENTA], textcolor ); + VectorCopy4( colorTable[CT_MAGENTA], textcolor ); } else if (Q_stricmp(color,"WHITE") == 0) { - Vector4Copy( colorTable[CT_WHITE], textcolor ); + VectorCopy4( colorTable[CT_WHITE], textcolor ); } else { - Vector4Copy( colorTable[CT_WHITE], textcolor ); + VectorCopy4( colorTable[CT_WHITE], textcolor ); } return; @@ -1010,7 +1010,7 @@ static int Q3_PlaySound( int taskID, int entID, const char *name, const char *ch soundChannel_t voice_chan = CHAN_VOICE; // set a default so the compiler doesn't bitch qboolean type_voice = qfalse; - Q_strncpyz( finalName, name, MAX_QPATH, 0 ); + Q_strncpyz( finalName, name, MAX_QPATH ); Q_strupr(finalName); //G_AddSexToMunroString( finalName, qtrue ); @@ -5330,7 +5330,7 @@ static void Q3_SetDismemberable( int entID, qboolean dismemberable) return; } - ent->client->dismembered = !dismemberable; + ent->client->dismembered = (qboolean)(!dismemberable); } @@ -6767,7 +6767,7 @@ static void Q3_Set( int taskID, int entID, const char *type_name, const char *da case SET_ICARUS_FREEZE: case SET_ICARUS_UNFREEZE: - Q3_SetICARUSFreeze( entID, (char *) data, (toSet==SET_ICARUS_FREEZE) ); + Q3_SetICARUSFreeze( entID, (char *) data, (qboolean)(toSet == SET_ICARUS_FREEZE) ); break; case SET_WEAPON: diff --git a/codeJK2/game/b_local.h b/codeJK2/game/b_local.h index 4b9ed50062..7684ddc1db 100644 --- a/codeJK2/game/b_local.h +++ b/codeJK2/game/b_local.h @@ -303,33 +303,31 @@ extern qboolean NPC_SetCombatPoint( int combatPointID ); #define MAX_COMBAT_POINT_CHECK 32 -extern int NPC_ValidEnemy( gentity_t *ent ); -extern int NPC_CheckEnemyExt( qboolean checkAlerts = qfalse ); -extern qboolean NPC_FindPlayer( void ); -extern qboolean NPC_CheckCanAttackExt( void ); +qboolean NPC_ValidEnemy( gentity_t *ent ); +qboolean NPC_CheckEnemyExt( qboolean checkAlerts = qfalse ); +qboolean NPC_FindPlayer( void ); +qboolean NPC_CheckCanAttackExt( void ); -extern int NPC_CheckAlertEvents( qboolean checkSight, qboolean checkSound, int ignoreAlert = -1, qboolean mustHaveOwner = qfalse, int minAlertLevel = AEL_MINOR ); -extern qboolean NPC_CheckForDanger( int alertEvent ); -extern void G_AlertTeam( gentity_t *victim, gentity_t *attacker, float radius, float soundDist ); +int NPC_CheckAlertEvents( qboolean checkSight, qboolean checkSound, int ignoreAlert = -1, qboolean mustHaveOwner = qfalse, int minAlertLevel = AEL_MINOR ); +qboolean NPC_CheckForDanger( int alertEvent ); +void G_AlertTeam( gentity_t *victim, gentity_t *attacker, float radius, float soundDist ); -extern int NPC_FindSquadPoint( vec3_t position ); +int NPC_FindSquadPoint( vec3_t position ); -extern void ClearPlayerAlertEvents( void ); +void ClearPlayerAlertEvents( void ); -extern qboolean G_BoundsOverlap(const vec3_t mins1, const vec3_t maxs1, const vec3_t mins2, const vec3_t maxs2); -extern qboolean NAV_HitNavGoal( vec3_t point, vec3_t mins, vec3_t maxs, vec3_t dest, int radius, qboolean flying ); +qboolean G_BoundsOverlap(const vec3_t mins1, const vec3_t maxs1, const vec3_t mins2, const vec3_t maxs2); +qboolean NAV_HitNavGoal( vec3_t point, vec3_t mins, vec3_t maxs, vec3_t dest, int radius, qboolean flying ); -extern void NPC_SetMoveGoal( gentity_t *ent, vec3_t point, int radius, qboolean isNavGoal = qfalse, int combatPoint = -1, gentity_t *targetEnt = NULL ); +void NPC_SetMoveGoal( gentity_t *ent, vec3_t point, int radius, qboolean isNavGoal = qfalse, int combatPoint = -1, gentity_t *targetEnt = NULL ); -extern qboolean NAV_ClearPathToPoint(gentity_t *self, vec3_t pmins, vec3_t pmaxs, vec3_t point, int clipmask, int okToHitEnt ); -extern void NPC_ApplyWeaponFireDelay(void); +qboolean NAV_ClearPathToPoint(gentity_t *self, vec3_t pmins, vec3_t pmaxs, vec3_t point, int clipmask, int okToHitEnt ); +void NPC_ApplyWeaponFireDelay(void); //NPC_FaceXXX suite -extern qboolean NPC_FacePosition( vec3_t position, qboolean doPitch = qtrue ); -extern qboolean NPC_FaceEntity( gentity_t *ent, qboolean doPitch = qtrue ); -extern qboolean NPC_FaceEnemy( qboolean doPitch = qtrue ); - -extern unsigned char G_AddBoltOn( gentity_t *NPC, const char *boltOnName ); +qboolean NPC_FacePosition( vec3_t position, qboolean doPitch = qtrue ); +qboolean NPC_FaceEntity( gentity_t *ent, qboolean doPitch = qtrue ); +qboolean NPC_FaceEnemy( qboolean doPitch = qtrue ); //Skill level cvar extern cvar_t *g_spskill; diff --git a/codeJK2/game/bg_panimate.cpp b/codeJK2/game/bg_panimate.cpp index 788cc41120..7fd2c7c886 100644 --- a/codeJK2/game/bg_panimate.cpp +++ b/codeJK2/game/bg_panimate.cpp @@ -566,7 +566,7 @@ qboolean PM_InAnimForSaberMove( int anim, int saberMove ) } if ( anim >= BOTH_P1_S1_T_ && anim <= BOTH_H1_S1_BR ) {//parries, knockaways and broken parries - return (anim==saberMoveData[saberMove].animToUse); + return (qboolean)(anim == saberMoveData[saberMove].animToUse); } return qfalse; } diff --git a/codeJK2/game/bg_slidemove.cpp b/codeJK2/game/bg_slidemove.cpp index 861a9de2e8..ef2a4d240d 100644 --- a/codeJK2/game/bg_slidemove.cpp +++ b/codeJK2/game/bg_slidemove.cpp @@ -268,7 +268,7 @@ qboolean PM_SlideMove( float gravMod ) { VectorCopy( primal_velocity, pm->ps->velocity ); } - return ( bumpcount != 0 ); + return (qboolean)( bumpcount != 0 ); } /* diff --git a/codeJK2/game/g_active.cpp b/codeJK2/game/g_active.cpp index 77dc3847fe..b11c447668 100644 --- a/codeJK2/game/g_active.cpp +++ b/codeJK2/game/g_active.cpp @@ -2136,7 +2136,7 @@ extern cvar_t *g_skippingcin; {//lock out player control if ( !player_locked ) { - VectorClear( ucmd->angles ); + VectorClearM( ucmd->angles ); } ucmd->forwardmove = 0; ucmd->rightmove = 0; @@ -2365,8 +2365,8 @@ extern cvar_t *g_skippingcin; { if ( !(ucmd->buttons & BUTTON_USE) ) {//Not leaning - qboolean Flying = (ucmd->upmove && ent->NPC->stats.moveType == MT_FLYSWIM); - qboolean Climbing = (ucmd->upmove && ent->watertype&CONTENTS_LADDER ); + qboolean Flying = (qboolean)(ucmd->upmove && ent->NPC->stats.moveType == MT_FLYSWIM); + qboolean Climbing = (qboolean)(ucmd->upmove && (ent->watertype & CONTENTS_LADDER)); client->ps.friction = 6; @@ -2761,7 +2761,7 @@ extern cvar_t *g_skippingcin; pm.trace = gi.trace; pm.pointcontents = gi.pointcontents; pm.debugLevel = g_debugMove->integer; - pm.noFootsteps = 0;//( g_dmflags->integer & DF_NO_FOOTSTEPS ) > 0; + pm.noFootsteps = qfalse;//( g_dmflags->integer & DF_NO_FOOTSTEPS ) > 0; VectorCopy( client->ps.origin, oldOrigin ); @@ -2802,7 +2802,7 @@ extern cvar_t *g_skippingcin; ent->waterlevel = pm.waterlevel; ent->watertype = pm.watertype; - _VectorCopy( ucmd->angles, client->pers.cmd_angles ); + VectorCopyM( ucmd->angles, client->pers.cmd_angles ); // execute client events ClientEvents( ent, oldEventSequence ); diff --git a/codeJK2/game/g_client.cpp b/codeJK2/game/g_client.cpp index 6f34d83f93..3522f95a32 100644 --- a/codeJK2/game/g_client.cpp +++ b/codeJK2/game/g_client.cpp @@ -614,7 +614,7 @@ void ClientBegin( int clientNum, usercmd_t *cmd, SavedGameJustLoaded_e eSavedGam client->pers.connected = CON_CONNECTED; client->pers.teamState.state = TEAM_BEGIN; - _VectorCopy( cmd->angles, client->pers.cmd_angles ); + VectorCopyM( cmd->angles, client->pers.cmd_angles ); memset( &client->ps, 0, sizeof( client->ps ) ); memset( &client->sess.missionStats, 0, sizeof( client->sess.missionStats ) ); @@ -1746,7 +1746,7 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded client->ps.commandTime = level.time - 100; ucmd = client->pers.lastCommand; ucmd.serverTime = level.time; - _VectorCopy( client->pers.cmd_angles, ucmd.angles ); + VectorCopyM( client->pers.cmd_angles, ucmd.angles ); ucmd.weapon = client->ps.weapon; // client think calls Pmove which sets the client->ps.weapon to ucmd.weapon, so ... ent->client->ps.groundEntityNum = ENTITYNUM_NONE; ClientThink( ent-g_entities, &ucmd ); diff --git a/codeJK2/game/g_cmds.cpp b/codeJK2/game/g_cmds.cpp index 668e0218c8..7fbc3270d1 100644 --- a/codeJK2/game/g_cmds.cpp +++ b/codeJK2/game/g_cmds.cpp @@ -555,7 +555,7 @@ void Cmd_Noclip_f( gentity_t *ent ) { } else { msg = "noclip ON\n"; } - ent->client->noclip = !ent->client->noclip; + ent->client->noclip = (qboolean)!ent->client->noclip; gi.SendServerCommand( ent-g_entities, "print \"%s\"", msg); } diff --git a/codeJK2/game/g_combat.cpp b/codeJK2/game/g_combat.cpp index efdee55b72..7b208daf78 100644 --- a/codeJK2/game/g_combat.cpp +++ b/codeJK2/game/g_combat.cpp @@ -410,7 +410,7 @@ qboolean OnSameTeam( gentity_t *ent1, gentity_t *ent2 ) // return qtrue; // } - return ( ent1->client->playerTeam == ent2->client->playerTeam ); + return (qboolean)( ent1->client->playerTeam == ent2->client->playerTeam ); } @@ -1706,7 +1706,6 @@ qboolean G_LimbLost( gentity_t *ent, int hitLoc ) return qtrue; } return qfalse; - break; case HL_FOOT_LT: if ( ent->locationDamage[HL_FOOT_LT] >= Q3_INFINITE ) @@ -1721,7 +1720,6 @@ qboolean G_LimbLost( gentity_t *ent, int hitLoc ) return qtrue; } return qfalse; - break; case HL_HAND_LT: if ( ent->locationDamage[HL_HAND_LT] >= Q3_INFINITE ) @@ -1741,7 +1739,6 @@ qboolean G_LimbLost( gentity_t *ent, int hitLoc ) return qtrue; } return qfalse; - break; case HL_HAND_RT: if ( ent->locationDamage[HL_HAND_RT] >= Q3_INFINITE ) @@ -1761,7 +1758,6 @@ qboolean G_LimbLost( gentity_t *ent, int hitLoc ) return qtrue; } return qfalse; - break; case HL_HEAD: if ( ent->locationDamage[HL_HEAD] >= Q3_INFINITE ) @@ -1776,10 +1772,8 @@ qboolean G_LimbLost( gentity_t *ent, int hitLoc ) return qtrue; } return qfalse; - break; default: - return (ent->locationDamage[hitLoc]>=Q3_INFINITE); - break; + return (qboolean)(ent->locationDamage[hitLoc] >= Q3_INFINITE); } } @@ -3392,7 +3386,7 @@ void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int NPC_FreeCombatPoint( self->NPC->combatPoint ); if ( self->NPC->group ) { - lastInGroup = (self->NPC->group->numGroup < 2); + lastInGroup = (qboolean)(self->NPC->group->numGroup < 2); AI_GroupMemberKilled( self ); AI_DeleteSelfFromGroup( self ); } diff --git a/codeJK2/game/g_inventory.cpp b/codeJK2/game/g_inventory.cpp index 1adff4898d..cec16fc16c 100644 --- a/codeJK2/game/g_inventory.cpp +++ b/codeJK2/game/g_inventory.cpp @@ -93,7 +93,8 @@ qboolean INV_SecurityKeyGive( gentity_t *target, const char *keyname ) if ( target->client->ps.security_key_message[i][0] == '\0' ) {//fill in the first empty slot we find with this key target->client->ps.inventory[INV_SECURITY_KEY]++; // He got the key - Q_strncpyz( target->client->ps.security_key_message[i], keyname, MAX_SECURITY_KEY_MESSSAGE, qtrue ); + Q_strncpyz(target->client->ps.security_key_message[i], keyname, + sizeof(target->client->ps.security_key_message[i]) ); return qtrue; } } diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp index 2fc693c00c..47edd141b7 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -76,7 +76,7 @@ qboolean PInUse(unsigned int entNum) { assert(entNum>=0); assert(entNum=(uintptr_t)g_entities); assert(((uintptr_t)ent)<=(uintptr_t)(g_entities+MAX_GENTITIES-1)); unsigned int entNum=ent-g_entities; - return((g_entityInUseBits[entNum/32]&(((unsigned int)1)<<(entNum&0x1f)))!=0); + return (qboolean)((g_entityInUseBits[entNum / 32] & (1u << (entNum & 0x1f))) != 0); } void WriteInUseBits(void) diff --git a/codeJK2/game/g_misc.cpp b/codeJK2/game/g_misc.cpp index 7a6ec732ca..92a9bb779d 100644 --- a/codeJK2/game/g_misc.cpp +++ b/codeJK2/game/g_misc.cpp @@ -175,7 +175,7 @@ void misc_dlight_use ( gentity_t *ent, gentity_t *other, gentity_t *activator ) { G_ActivateBehavior(ent,BSET_USE); - ent->misc_dlight_active = !ent->misc_dlight_active; //toggle + ent->misc_dlight_active = (qboolean)!ent->misc_dlight_active; //toggle misc_lightstyle_set (ent); } diff --git a/codeJK2/game/g_missile.cpp b/codeJK2/game/g_missile.cpp index 8973f7539e..875f4ad7d5 100644 --- a/codeJK2/game/g_missile.cpp +++ b/codeJK2/game/g_missile.cpp @@ -588,7 +588,11 @@ void G_MissileImpact( gentity_t *ent, trace_t *trace, int hitLoc=HL_NONE ) } // check for bounce //OR: if the surfaceParm is has a reflect property (magnetic shielding) and the missile isn't an exploding missile - qboolean bounce = !!( (!other->takedamage && (ent->s.eFlags&(EF_BOUNCE|EF_BOUNCE_HALF))) || (((trace->surfaceFlags&SURF_FORCEFIELD)||(other->flags&FL_SHIELDED))&&!ent->splashDamage&&!ent->splashRadius) ); + qboolean bounce = (qboolean)( + (!other->takedamage && (ent->s.eFlags & (EF_BOUNCE | EF_BOUNCE_HALF))) || + (((trace->surfaceFlags & SURF_FORCEFIELD) || (other->flags & FL_SHIELDED)) && + !ent->splashDamage && + !ent->splashRadius)); if ( ent->dflags & DAMAGE_HEAVY_WEAP_CLASS ) { diff --git a/codeJK2/game/g_mover.cpp b/codeJK2/game/g_mover.cpp index 2f88da1abc..144f42d78e 100644 --- a/codeJK2/game/g_mover.cpp +++ b/codeJK2/game/g_mover.cpp @@ -333,7 +333,7 @@ qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t ** VectorAdd( pusher->currentAngles, amove, pusher->currentAngles ); gi.linkentity( pusher ); - notMoving = (VectorCompare( vec3_origin, move )&&VectorCompare( vec3_origin, amove )); + notMoving = (qboolean)(VectorCompare( vec3_origin, move ) && VectorCompare( vec3_origin, amove )); // see if any solid entities are inside the final position for ( e = 0 ; e < listedEntities ; e++ ) { diff --git a/codeJK2/game/g_nav.cpp b/codeJK2/game/g_nav.cpp index a85d479776..818c8686a4 100644 --- a/codeJK2/game/g_nav.cpp +++ b/codeJK2/game/g_nav.cpp @@ -172,11 +172,11 @@ qboolean NAV_HitNavGoal( vec3_t point, vec3_t mins, vec3_t maxs, vec3_t dest, in { diff[2] = 0; } - return ( VectorLengthSquared( diff ) <= (radius*radius) ); + return (qboolean)( VectorLengthSquared( diff ) <= (radius*radius) ); } else {//must hit exactly - return ( DistanceSquared(dest, point) <= (radius*radius) ); + return (qboolean)( DistanceSquared(dest, point) <= (radius*radius) ); } //There is probably a better way to do this, either by preserving the original // mins and maxs of the navgoal and doing this check ONLY if the radius @@ -1680,23 +1680,23 @@ void NAV_StoreWaypoint( gentity_t *ent ) } if ( ent->targetname ) { - Q_strncpyz( tempWaypointList[numStoredWaypoints].targetname, ent->targetname, MAX_QPATH, qtrue ); + Q_strncpyz( tempWaypointList[numStoredWaypoints].targetname, ent->targetname, MAX_QPATH ); } if ( ent->target ) { - Q_strncpyz( tempWaypointList[numStoredWaypoints].target, ent->target, MAX_QPATH, qtrue ); + Q_strncpyz( tempWaypointList[numStoredWaypoints].target, ent->target, MAX_QPATH ); } if ( ent->target2 ) { - Q_strncpyz( tempWaypointList[numStoredWaypoints].target2, ent->target2, MAX_QPATH, qtrue ); + Q_strncpyz( tempWaypointList[numStoredWaypoints].target2, ent->target2, MAX_QPATH ); } if ( ent->target3 ) { - Q_strncpyz( tempWaypointList[numStoredWaypoints].target3, ent->target3, MAX_QPATH, qtrue ); + Q_strncpyz( tempWaypointList[numStoredWaypoints].target3, ent->target3, MAX_QPATH ); } if ( ent->target4 ) { - Q_strncpyz( tempWaypointList[numStoredWaypoints].target4, ent->target4, MAX_QPATH, qtrue ); + Q_strncpyz( tempWaypointList[numStoredWaypoints].target4, ent->target4, MAX_QPATH ); } tempWaypointList[numStoredWaypoints].nodeID = ent->health; diff --git a/codeJK2/game/g_navigator.h b/codeJK2/game/g_navigator.h index 109f59c97d..a544fcb3d3 100644 --- a/codeJK2/game/g_navigator.h +++ b/codeJK2/game/g_navigator.h @@ -210,7 +210,7 @@ class CNavigator qboolean NodesAreNeighbors( int startID, int endID ); void ClearFailedEdge( failedEdge_t *failedEdge ); void ClearAllFailedEdges( void ); - qboolean EdgeFailed( int startID, int endID ); + int EdgeFailed( int startID, int endID ); void AddFailedEdge( int entID, int startID, int endID ); qboolean CheckFailedEdge( failedEdge_t *failedEdge ); void CheckAllFailedEdges( void ); diff --git a/codeJK2/game/g_navnew.cpp b/codeJK2/game/g_navnew.cpp index 9e53e7b6a7..2c533a6649 100644 --- a/codeJK2/game/g_navnew.cpp +++ b/codeJK2/game/g_navnew.cpp @@ -281,7 +281,7 @@ qboolean NAVNEW_SidestepBlocker( gentity_t *self, gentity_t *blocker, vec3_t blo AngleVectors( avoidAngles, movedir, NULL, NULL ); VectorMA( self->currentOrigin, blocked_dist, movedir, block_pos ); gi.trace( &tr, self->currentOrigin, mins, self->maxs, block_pos, self->s.number, self->clipmask|CONTENTS_BOTCLIP, G2_NOCOLLIDE, 0 ); - return (tr.fraction==1.0&&!tr.allsolid&&!tr.startsolid); + return (qboolean)(tr.fraction == 1.0f && !tr.allsolid && !tr.startsolid); } //test right diff --git a/codeJK2/game/g_object.cpp b/codeJK2/game/g_object.cpp index 169af46e3f..100c93965d 100644 --- a/codeJK2/game/g_object.cpp +++ b/codeJK2/game/g_object.cpp @@ -197,7 +197,7 @@ void G_RunObject( gentity_t *ent ) } G_Sound( ent, G_SoundIndex( "sound/movers/objects/objectHit.wav" ) ); } - DoImpact( ent, traceEnt, !(tr.surfaceFlags&SURF_NODAMAGE) ); + DoImpact( ent, traceEnt, (qboolean)(!(tr.surfaceFlags & SURF_NODAMAGE)) ); } if ( !ent || (ent->takedamage&&ent->health <= 0) ) diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp index 8175f19e6e..618d733ddb 100644 --- a/codeJK2/game/g_roff.cpp +++ b/codeJK2/game/g_roff.cpp @@ -396,11 +396,11 @@ qboolean G_InitRoff( char *file, unsigned char *data ) } else { - return false; + return qfalse; } } - return true; + return qtrue; } //------------------------------------------------------- diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index 02b578e497..f1a211d288 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -424,7 +424,7 @@ void EnumerateField(const field_t *pField, byte *pbBase) break; case F_BOOLPTR: - *(qboolean *)pv = !!(*(int *)pv); + *(qboolean *)pv = (*(int *)pv) ? qtrue : qfalse; break; // These are pointers that are always recreated @@ -1027,7 +1027,7 @@ void ReadLevel(qboolean qbAutosave, qboolean qbLoadTransition) extern int killPlayerTimer; qboolean GameAllowedToSaveHere(void) { - return (!in_camera&&!killPlayerTimer); + return (qboolean)(!in_camera && !killPlayerTimer); } //////////////////// eof ///////////////////// diff --git a/codeJK2/game/g_shared.h b/codeJK2/game/g_shared.h index babf5c23db..c0a9a1f32c 100644 --- a/codeJK2/game/g_shared.h +++ b/codeJK2/game/g_shared.h @@ -313,8 +313,8 @@ typedef struct { // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! typedef struct objectives_s { - qboolean display; // A displayable objective? - int status; // Succeed or fail or pending + int display; // A displayable objective? + int status; // Succeed or fail or pending } objectives_t; #define MAX_MISSION_OBJ 80 diff --git a/codeJK2/game/g_target.cpp b/codeJK2/game/g_target.cpp index bfa38e1985..1782d44b46 100644 --- a/codeJK2/game/g_target.cpp +++ b/codeJK2/game/g_target.cpp @@ -928,7 +928,7 @@ void target_level_change_use(gentity_t *self, gentity_t *other, gentity_t *activ } else { - G_ChangeMap( self->message, self->target, (self->spawnflags&1) ); + G_ChangeMap( self->message, self->target, (qboolean)(self->spawnflags & 1) ); } if (self->spawnflags&2) //HIDEINFO { diff --git a/codeJK2/game/wp_saber.cpp b/codeJK2/game/wp_saber.cpp index 1b5f5fcb40..da12ab2444 100644 --- a/codeJK2/game/wp_saber.cpp +++ b/codeJK2/game/wp_saber.cpp @@ -1423,7 +1423,7 @@ qboolean WP_SaberDamageEffects( trace_t *tr, const vec3_t start, float length, f } } } - return (numHitEnts>0); + return (qboolean)(numHitEnts > 0); } void WP_SaberKnockaway( gentity_t *attacker, trace_t *tr ) @@ -3077,7 +3077,11 @@ void WP_SaberDamageTrace( gentity_t *ent ) } else if ( entAttacking && hitOwnerDefending ) {//I'm attacking hit, they're parrying - qboolean activeDefense = (hitOwner->s.number||g_saberAutoBlocking->integer||hitOwner->client->ps.saberBlockingTime > level.time); + qboolean activeDefense = (qboolean)( + hitOwner->s.number || + g_saberAutoBlocking->integer || + hitOwner->client->ps.saberBlockingTime > level.time); + if ( !Q_irand( 0, 2 ) && activeDefense && (hitOwner->client->ps.saberMove != LS_READY || (entPowerLevel-hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand( -6, 0 ) ) @@ -6126,15 +6130,21 @@ void ForceThrow( gentity_t *self, qboolean pull ) && ((!pull&&self->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_2 && push_list[x]->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_1) //level 1 push || (pull && self->client->ps.forcePowerLevel[FP_PULL] < FORCE_LEVEL_2 && push_list[x]->client->ps.forcePowerLevel[FP_PULL] < FORCE_LEVEL_1)) )//level 1 pull {//NPC or third person player (without force push/pull skill), and force push/pull level is at 1 - WP_ForceKnockdown( push_list[x], self, pull, (!pull&&knockback>150), qfalse ); + WP_ForceKnockdown( + push_list[x], self, pull, + (qboolean)(!pull && knockback > 150), qfalse ); } else if ( !push_list[x]->s.number ) {//player, have to force an anim on him - WP_ForceKnockdown( push_list[x], self, pull, (!pull&&knockback>150), qfalse ); + WP_ForceKnockdown( + push_list[x], self, pull, + (qboolean)(!pull && knockback > 150), qfalse ); } else {//NPC and force-push/pull at level 2 or higher - WP_ForceKnockdown( push_list[x], self, pull, (!pull&&knockback>100), qfalse ); + WP_ForceKnockdown( + push_list[x], self, pull, + (qboolean)(!pull && knockback > 100), qfalse ); } } push_list[x]->forcePushTime = level.time + 600; // let the push effect last for 600 ms diff --git a/codeJK2/game/wp_saber.h b/codeJK2/game/wp_saber.h index 3a01640a28..7c8165243a 100644 --- a/codeJK2/game/wp_saber.h +++ b/codeJK2/game/wp_saber.h @@ -294,7 +294,7 @@ typedef struct int blocking; saberMoveName_t chain_idle; // What move to call if the attack button is not pressed at the end of this anim saberMoveName_t chain_attack; // What move to call if the attack button (and nothing else) is pressed - qboolean trailLength; + int trailLength; } saberMoveData_t; extern saberMoveData_t saberMoveData[LS_MOVE_MAX]; diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index 28c498855e..5e6c025bd1 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -361,7 +361,7 @@ IsRunning qboolean CTaskManager::IsRunning( void ) { - return ( m_tasks.empty() == false ); + return (qboolean)!m_tasks.empty(); } /* ------------------------- diff --git a/codeJK2/qcommon/safe/memory.h b/codeJK2/qcommon/safe/memory.h index 1f21985234..1299509102 100644 --- a/codeJK2/qcommon/safe/memory.h +++ b/codeJK2/qcommon/safe/memory.h @@ -13,7 +13,7 @@ namespace Zone { namespace detail { - inline void* Malloc( int iSize, memtag_t eTag, bool bZeroit = false ) + inline void* Malloc( int iSize, memtag_t eTag, qboolean bZeroit = qfalse ) { #ifdef _JK2EXE return Z_Malloc( iSize, eTag, bZeroit ); diff --git a/shared/qcommon/q_math_common.h b/shared/qcommon/q_math_common.h index 1a0ddb3f8a..03c69cbca1 100644 --- a/shared/qcommon/q_math_common.h +++ b/shared/qcommon/q_math_common.h @@ -42,6 +42,7 @@ typedef int fixed4_t, fixed8_t, fixed16_t; #define MAX_QINT 0x7fffffff #define MIN_QINT (-MAX_QINT-1) + /////////////////////////////////////////////////////////////////////////// // // DIRECTION ENCODING @@ -51,6 +52,7 @@ int DirToByte( vec3_t dir ); void ByteToDir( int b, vec3_t dir ); void NormalToLatLong( const vec3_t normal, byte bytes[2] ); + /////////////////////////////////////////////////////////////////////////// // // RANDOM NUMBER GENERATION @@ -58,15 +60,15 @@ void NormalToLatLong( const vec3_t normal, byte bytes[2] ); /////////////////////////////////////////////////////////////////////////// #define QRAND_MAX 32768 -int Q_rand( int *seed ); +int Q_rand( int *seed ); float Q_random( int *seed ); float Q_crandom( int *seed ); -void Rand_Init( int seed ); -float flrand(float min, float max); +void Rand_Init( int seed ); float Q_flrand( float min, float max ); -int irand( int min, int max ); -int Q_irand( int value1, int value2 ); +int Q_irand( int value1, int value2 ); +float flrand( float min, float max ); +int irand( int min, int max ); float erandom( float mean ); From 2bcf85c2e5d0526205165521c88dfe0442e75f06 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sun, 21 Aug 2016 10:31:46 +0100 Subject: [PATCH 304/445] Shared: Remove random() and crandom() Use Q_flrand(0.0f, 1.0f) or Q_flrand(-1.0f, 1.0f) everywhere instead. random() was conflicting with an existing Unix function of the same name. --- code/cgame/FxPrimitives.cpp | 22 +++++----- code/cgame/FxScheduler.cpp | 14 +++--- code/cgame/cg_camera.cpp | 4 +- code/cgame/cg_draw.cpp | 14 +++--- code/cgame/cg_effects.cpp | 58 ++++++++++++------------- code/cgame/cg_ents.cpp | 4 +- code/cgame/cg_players.cpp | 66 ++++++++++++++--------------- code/cgame/cg_weapons.cpp | 8 ++-- code/game/AI_BobaFett.cpp | 8 ++-- code/game/AI_Default.cpp | 6 +-- code/game/AI_Droid.cpp | 6 +-- code/game/AI_HazardTrooper.cpp | 2 +- code/game/AI_ImperialProbe.cpp | 4 +- code/game/AI_Interrogator.cpp | 2 +- code/game/AI_MineMonster.cpp | 10 ++--- code/game/AI_Rancor.cpp | 2 +- code/game/AI_Remote.cpp | 2 +- code/game/AI_RocketTrooper.cpp | 10 ++--- code/game/AI_Seeker.cpp | 14 +++--- code/game/AI_Sentry.cpp | 2 +- code/game/AI_Stormtrooper.cpp | 2 +- code/game/AI_Wampa.cpp | 2 +- code/game/NPC_behavior.cpp | 4 +- code/game/NPC_combat.cpp | 8 ++-- code/game/NPC_reactions.cpp | 4 +- code/game/NPC_utils.cpp | 4 +- code/game/g_breakable.cpp | 4 +- code/game/g_combat.cpp | 12 +++--- code/game/g_emplaced.cpp | 4 +- code/game/g_fx.cpp | 2 +- code/game/g_items.cpp | 10 ++--- code/game/g_misc.cpp | 4 +- code/game/g_misc_model.cpp | 34 +++++++-------- code/game/g_mover.cpp | 2 +- code/game/g_target.cpp | 2 +- code/game/g_trigger.cpp | 6 +-- code/game/g_turret.cpp | 24 +++++------ code/game/g_weapon.cpp | 2 +- code/game/wp_blaster_pistol.cpp | 8 ++-- code/game/wp_blaster_rifle.cpp | 12 +++--- code/game/wp_bowcaster.cpp | 8 ++-- code/game/wp_concussion.cpp | 8 ++-- code/game/wp_det_pack.cpp | 2 +- code/game/wp_flechette.cpp | 10 ++--- code/game/wp_noghri_stick.cpp | 4 +- code/game/wp_repeater.cpp | 8 ++-- code/game/wp_rocket_launcher.cpp | 4 +- code/game/wp_thermal.cpp | 6 +-- code/game/wp_tusken.cpp | 8 ++-- code/icarus/Sequencer.cpp | 4 +- code/icarus/TaskManager.cpp | 6 +-- code/rd-vanilla/tr_cmds.cpp | 2 +- code/rd-vanilla/tr_surface.cpp | 16 +++---- code/ui/ui_saber.cpp | 10 ++--- codeJK2/cgame/FxPrimitives.cpp | 22 +++++----- codeJK2/cgame/FxScheduler.cpp | 14 +++--- codeJK2/cgame/cg_camera.cpp | 4 +- codeJK2/cgame/cg_draw.cpp | 14 +++--- codeJK2/cgame/cg_effects.cpp | 58 ++++++++++++------------- codeJK2/cgame/cg_ents.cpp | 4 +- codeJK2/cgame/cg_players.cpp | 60 +++++++++++++------------- codeJK2/cgame/cg_weapons.cpp | 8 ++-- codeJK2/game/AI_Default.cpp | 6 +-- codeJK2/game/AI_Droid.cpp | 6 +-- codeJK2/game/AI_GalakMech.cpp | 6 +-- codeJK2/game/AI_Howler.cpp | 4 +- codeJK2/game/AI_ImperialProbe.cpp | 4 +- codeJK2/game/AI_Interrogator.cpp | 2 +- codeJK2/game/AI_MineMonster.cpp | 12 +++--- codeJK2/game/AI_Remote.cpp | 2 +- codeJK2/game/AI_Seeker.cpp | 14 +++--- codeJK2/game/AI_Sentry.cpp | 2 +- codeJK2/game/AI_Stormtrooper.cpp | 2 +- codeJK2/game/NPC_behavior.cpp | 4 +- codeJK2/game/NPC_combat.cpp | 8 ++-- codeJK2/game/NPC_reactions.cpp | 4 +- codeJK2/game/NPC_utils.cpp | 4 +- codeJK2/game/g_breakable.cpp | 4 +- codeJK2/game/g_fx.cpp | 2 +- codeJK2/game/g_items.cpp | 10 ++--- codeJK2/game/g_misc.cpp | 8 ++-- codeJK2/game/g_misc_model.cpp | 34 +++++++-------- codeJK2/game/g_mover.cpp | 2 +- codeJK2/game/g_nav.cpp | 2 +- codeJK2/game/g_navnew.cpp | 2 +- codeJK2/game/g_target.cpp | 2 +- codeJK2/game/g_trigger.cpp | 6 +-- codeJK2/game/g_turret.cpp | 22 +++++----- codeJK2/game/g_weapon.cpp | 4 +- codeJK2/game/wp_blaster_rifle.cpp | 12 +++--- codeJK2/game/wp_bowcaster.cpp | 8 ++-- codeJK2/game/wp_bryar_pistol.cpp | 8 ++-- codeJK2/game/wp_det_pack.cpp | 2 +- codeJK2/game/wp_flechette.cpp | 10 ++--- codeJK2/game/wp_repeater.cpp | 8 ++-- codeJK2/game/wp_rocket_launcher.cpp | 4 +- codeJK2/game/wp_thermal.cpp | 6 +-- codeJK2/icarus/Sequencer.cpp | 4 +- codeJK2/icarus/TaskManager.cpp | 6 +-- codemp/botlib/be_aas_route.cpp | 2 +- codemp/botlib/be_ai_chat.cpp | 8 ++-- codemp/botlib/be_ai_gen.cpp | 4 +- codemp/botlib/be_ai_move.cpp | 8 ++-- codemp/botlib/be_ai_weight.cpp | 14 +++--- codemp/cgame/cg_draw.c | 12 +++--- codemp/cgame/cg_effects.c | 66 ++++++++++++++--------------- codemp/cgame/cg_ents.c | 12 +++--- codemp/cgame/cg_localents.c | 4 +- codemp/cgame/cg_players.c | 58 ++++++++++++------------- codemp/cgame/cg_view.c | 4 +- codemp/cgame/cg_weapons.c | 6 +-- codemp/cgame/fx_demp2.c | 24 +++++------ codemp/game/NPC_AI_Default.c | 6 +-- codemp/game/NPC_AI_Droid.c | 6 +-- codemp/game/NPC_AI_GalakMech.c | 6 +-- codemp/game/NPC_AI_Howler.c | 4 +- codemp/game/NPC_AI_ImperialProbe.c | 4 +- codemp/game/NPC_AI_Interrogator.c | 2 +- codemp/game/NPC_AI_MineMonster.c | 12 +++--- codemp/game/NPC_AI_Rancor.c | 4 +- codemp/game/NPC_AI_Remote.c | 2 +- codemp/game/NPC_AI_Seeker.c | 14 +++--- codemp/game/NPC_AI_Sentry.c | 2 +- codemp/game/NPC_AI_Stormtrooper.c | 2 +- codemp/game/NPC_AI_Wampa.c | 4 +- codemp/game/NPC_behavior.c | 4 +- codemp/game/NPC_combat.c | 8 ++-- codemp/game/NPC_reactions.c | 4 +- codemp/game/NPC_utils.c | 4 +- codemp/game/g_bot.c | 2 +- codemp/game/g_client.c | 4 +- codemp/game/g_items.c | 12 +++--- codemp/game/g_misc.c | 6 +-- codemp/game/g_mover.c | 2 +- codemp/game/g_nav.c | 2 +- codemp/game/g_navnew.c | 2 +- codemp/game/g_target.c | 2 +- codemp/game/g_trigger.c | 6 +-- codemp/game/g_turret.c | 8 ++-- codemp/game/g_turret_G2.c | 8 ++-- codemp/game/g_weapon.c | 26 ++++++------ codemp/icarus/Sequencer.cpp | 4 +- codemp/icarus/TaskManager.cpp | 6 +-- codemp/qcommon/files.cpp | 2 +- codemp/rd-vanilla/tr_surface.cpp | 16 +++---- codemp/ui/ui_saber.c | 8 ++-- shared/qcommon/q_math_common.c | 2 +- shared/qcommon/q_math_common.h | 3 -- 148 files changed, 681 insertions(+), 684 deletions(-) diff --git a/code/cgame/FxPrimitives.cpp b/code/cgame/FxPrimitives.cpp index c784e308ff..f902da058e 100644 --- a/code/cgame/FxPrimitives.cpp +++ b/code/cgame/FxPrimitives.cpp @@ -106,7 +106,7 @@ void CParticle::Die() vec3_t norm; // Man, this just seems so, like, uncool and stuff... - VectorSet( norm, crandom(), crandom(), crandom()); + VectorSet( norm, Q_flrand(-1.0f, 1.0f), Q_flrand(-1.0f, 1.0f), Q_flrand(-1.0f, 1.0f)); VectorNormalize( norm ); theFxScheduler.PlayEffect( mDeathFxID, mOrigin1, norm ); @@ -425,7 +425,7 @@ void CParticle::UpdateSize() if (( mFlags & FX_SIZE_RAND )) { // Random simply modulates the existing value - perc1 = random() * perc1; + perc1 = Q_flrand(0.0f, 1.0f) * perc1; } mRefEnt.radius = (mSizeStart * perc1) + (mSizeEnd * (1.0f - perc1)); @@ -502,7 +502,7 @@ void CParticle::UpdateRGB() if (( mFlags & FX_RGB_RAND )) { // Random simply modulates the existing value - perc1 = random() * perc1; + perc1 = Q_flrand(0.0f, 1.0f) * perc1; } // Now get the correct color @@ -593,7 +593,7 @@ void CParticle::UpdateAlpha() if ( (mFlags & FX_ALPHA_RAND) ) { // Random simply modulates the existing value - perc1 = random() * perc1; + perc1 = Q_flrand(0.0f, 1.0f) * perc1; } if ( mFlags & FX_USE_ALPHA ) @@ -860,7 +860,7 @@ bool CLine::Update() //---------------------------- void CElectricity::Initialize() { - mRefEnt.frame = random() * 1265536; + mRefEnt.frame = Q_flrand(0.0f, 1.0f) * 1265536; mRefEnt.endTime = cg.time + (mTimeEnd - mTimeStart); if ( mFlags & FX_DEPTH_HACK ) @@ -1158,7 +1158,7 @@ void CTail::UpdateLength() if ( mFlags & FX_LENGTH_RAND ) { // Random simply modulates the existing value - perc1 = random() * perc1; + perc1 = Q_flrand(0.0f, 1.0f) * perc1; } mLength = (mLengthStart * perc1) + (mLengthEnd * (1.0f - perc1)); @@ -1270,7 +1270,7 @@ void CCylinder::UpdateSize2() if ( mFlags & FX_SIZE2_RAND ) { // Random simply modulates the existing value - perc1 = random() * perc1; + perc1 = Q_flrand(0.0f, 1.0f) * perc1; } mRefEnt.backlerp = (mSize2Start * perc1) + (mSize2End * (1.0f - perc1)); @@ -1376,7 +1376,7 @@ void CEmitter::Draw() #define TRAIL_RATE 8 // we "think" at about a 60hz rate // Pick a target step distance and square it - step = mDensity + crandom() * mVariance; + step = mDensity + Q_flrand(-1.0f, 1.0f) * mVariance; step *= step; dif = 0; @@ -1439,7 +1439,7 @@ void CEmitter::Draw() if ( DistanceSquared( org, mOldOrigin ) >= step ) { // Pick a new target step distance and square it - step = mDensity + crandom() * mVariance; + step = mDensity + Q_flrand(-1.0f, 1.0f) * mVariance; step *= step; // We met the step criteria so, we should add in the effect @@ -1623,7 +1623,7 @@ void CLight::UpdateSize() if ( mFlags & FX_SIZE_RAND ) { // Random simply modulates the existing value - perc1 = random() * perc1; + perc1 = Q_flrand(0.0f, 1.0f) * perc1; } mRefEnt.radius = (mSizeStart * perc1) + (mSizeEnd * (1.0f - perc1)); @@ -1700,7 +1700,7 @@ void CLight::UpdateRGB() if ( mFlags & FX_RGB_RAND ) { // Random simply modulates the existing value - perc1 = random() * perc1; + perc1 = Q_flrand(0.0f, 1.0f) * perc1; } // Now get the correct color diff --git a/code/cgame/FxScheduler.cpp b/code/cgame/FxScheduler.cpp index 29c512f792..63515c9c25 100644 --- a/code/cgame/FxScheduler.cpp +++ b/code/cgame/FxScheduler.cpp @@ -942,7 +942,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, int clientID, int delay // handle RGB color if ( fx->mSpawnFlags & FX_RGB_COMPONENT_INTERP ) { - float perc = random(); + float perc = Q_flrand(0.0f, 1.0f); VectorSet( sRGB, fx->mRedStart.GetVal( perc ), fx->mGreenStart.GetVal( perc ), fx->mBlueStart.GetVal( perc ) ); VectorSet( eRGB, fx->mRedEnd.GetVal( perc ), fx->mGreenEnd.GetVal( perc ), fx->mBlueEnd.GetVal( perc ) ); @@ -1461,7 +1461,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, const vec3_t origin, ve if( fx->mSpawnFlags & FX_RAND_ROT_AROUND_FWD ) { - RotatePointAroundVector( ax[1], ax[0], axis[1], random()*360.0f ); + RotatePointAroundVector( ax[1], ax[0], axis[1], Q_flrand(0.0f, 1.0f)*360.0f ); CrossProduct( ax[0], ax[1], ax[2] ); } @@ -1488,8 +1488,8 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, const vec3_t origin, ve float x, y; float width, height; - x = DEG2RAD( random() * 360.0f ); - y = DEG2RAD( random() * 180.0f ); + x = DEG2RAD( Q_flrand(0.0f, 1.0f) * 360.0f ); + y = DEG2RAD( Q_flrand(0.0f, 1.0f) * 180.0f ); width = fx->mRadius.GetVal(); height = fx->mHeight.GetVal(); @@ -1511,8 +1511,8 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, const vec3_t origin, ve // set up our point, then rotate around the current direction to. Make unrotated cylinder centered around 0,0,0 VectorScale( ax[1], fx->mRadius.GetVal(), pt ); - VectorMA( pt, crandom() * 0.5f * fx->mHeight.GetVal(), ax[0], pt ); - RotatePointAroundVector( temp, ax[0], pt, random() * 360.0f ); + VectorMA( pt, Q_flrand(-1.0f, 1.0f) * 0.5f * fx->mHeight.GetVal(), ax[0], pt ); + RotatePointAroundVector( temp, ax[0], pt, Q_flrand(0.0f, 1.0f) * 360.0f ); VectorAdd( org, temp, org ); @@ -1653,7 +1653,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, const vec3_t origin, ve { if ( fx->mSpawnFlags & FX_RGB_COMPONENT_INTERP ) { - float perc = random(); + float perc = Q_flrand(0.0f, 1.0f); VectorSet( sRGB, fx->mRedStart.GetVal( perc ), fx->mGreenStart.GetVal( perc ), fx->mBlueStart.GetVal( perc ) ); VectorSet( eRGB, fx->mRedEnd.GetVal( perc ), fx->mGreenEnd.GetVal( perc ), fx->mBlueEnd.GetVal( perc ) ); diff --git a/code/cgame/cg_camera.cpp b/code/cgame/cg_camera.cpp index 6263c1548a..72752164b8 100644 --- a/code/cgame/cg_camera.cpp +++ b/code/cgame/cg_camera.cpp @@ -1394,7 +1394,7 @@ void CGCam_UpdateShake( vec3_t origin, vec3_t angles ) for ( int i = 0; i < 3; i++ ) { - moveDir[i] = ( crandom() * intensity ); + moveDir[i] = ( Q_flrand(-1.0f, 1.0f) * intensity ); } //FIXME: Lerp @@ -1403,7 +1403,7 @@ void CGCam_UpdateShake( vec3_t origin, vec3_t angles ) VectorAdd( origin, moveDir, origin ); for ( int i = 0; i < 2; i++ ) // Don't do ROLL - moveDir[i] = ( crandom() * intensity ); + moveDir[i] = ( Q_flrand(-1.0f, 1.0f) * intensity ); //FIXME: Lerp diff --git a/code/cgame/cg_draw.cpp b/code/cgame/cg_draw.cpp index 28b836089f..d0fba72ef0 100644 --- a/code/cgame/cg_draw.cpp +++ b/code/cgame/cg_draw.cpp @@ -2131,9 +2131,9 @@ static void CG_DrawZoomMask( void ) if ( power ) { // Flickery color - color1[0] = 0.7f + crandom() * 0.1f; - color1[1] = 0.8f + crandom() * 0.1f; - color1[2] = 0.7f + crandom() * 0.1f; + color1[0] = 0.7f + Q_flrand(-1.0f, 1.0f) * 0.1f; + color1[1] = 0.8f + Q_flrand(-1.0f, 1.0f) * 0.1f; + color1[2] = 0.7f + Q_flrand(-1.0f, 1.0f) * 0.1f; color1[3] = 1.0f; cgi_R_SetColor( color1 ); @@ -2159,7 +2159,7 @@ static void CG_DrawZoomMask( void ) CG_DrawPic( 307, 40, 26, 30, cgs.media.binocularTri ); } - if ( random() > 0.98f && ( cg.time & 1024 )) + if ( Q_flrand(0.0f, 1.0f) > 0.98f && ( cg.time & 1024 )) { flip = (qboolean)!flip; } @@ -2298,9 +2298,9 @@ static void CG_DrawZoomMask( void ) float pos2 = 220 + cos( cg.time * 0.0004f + light * 0.05f ) * 40 + sin( cg.time * 0.0013f + 1 ) * 20 + sin( cg.time * 0.0021f ) * 5; // Flickery color - color1[0] = 0.7f + crandom() * 0.2f; - color1[1] = 0.8f + crandom() * 0.2f; - color1[2] = 0.7f + crandom() * 0.2f; + color1[0] = 0.7f + Q_flrand(-1.0f, 1.0f) * 0.2f; + color1[1] = 0.8f + Q_flrand(-1.0f, 1.0f) * 0.2f; + color1[2] = 0.7f + Q_flrand(-1.0f, 1.0f) * 0.2f; color1[3] = 1.0f; cgi_R_SetColor( color1 ); diff --git a/code/cgame/cg_effects.cpp b/code/cgame/cg_effects.cpp index 29a8cc9cba..8c6afc41a5 100644 --- a/code/cgame/cg_effects.cpp +++ b/code/cgame/cg_effects.cpp @@ -199,11 +199,11 @@ void CG_SurfaceExplosion( vec3_t origin, vec3_t normal, float radius, float shak int i, numSparks; //Sparks - numSparks = 16 + (random() * 16.0f); + numSparks = 16 + (Q_flrand(0.0f, 1.0f) * 16.0f); for ( i = 0; i < numSparks; i++ ) { - scale = 0.25f + (random() * 2.0f); + scale = 0.25f + (Q_flrand(0.0f, 1.0f) * 2.0f); dscale = -scale*0.5; particle = FX_AddTrail( origin, @@ -232,17 +232,17 @@ void CG_SurfaceExplosion( vec3_t origin, vec3_t normal, float radius, float shak for ( i = 0; i < 4; i++ ) { - VectorSet( temp_org, new_org[0] + (crandom() * 16.0f), new_org[1] + (crandom() * 16.0f), new_org[2] + (random() * 4.0f) ); - VectorSet( temp_vel, velocity[0] + (crandom() * 8.0f), velocity[1] + (crandom() * 8.0f), velocity[2] + (crandom() * 8.0f) ); + VectorSet( temp_org, new_org[0] + (Q_flrand(-1.0f, 1.0f) * 16.0f), new_org[1] + (Q_flrand(-1.0f, 1.0f) * 16.0f), new_org[2] + (Q_flrand(0.0f, 1.0f) * 4.0f) ); + VectorSet( temp_vel, velocity[0] + (Q_flrand(-1.0f, 1.0f) * 8.0f), velocity[1] + (Q_flrand(-1.0f, 1.0f) * 8.0f), velocity[2] + (Q_flrand(-1.0f, 1.0f) * 8.0f) ); FX_AddSprite( temp_org, temp_vel, NULL, - 64.0f + (random() * 32.0f), + 64.0f + (Q_flrand(0.0f, 1.0f) * 32.0f), 16.0f, 1.0f, 0.0f, - 20.0f + (crandom() * 90.0f), + 20.0f + (Q_flrand(-1.0f, 1.0f) * 90.0f), 0.5f, 1500.0f, cgs.media.smokeShader, FXF_USE_ALPHA_CHAN ); @@ -255,14 +255,14 @@ void CG_SurfaceExplosion( vec3_t origin, vec3_t normal, float radius, float shak VectorNormalize( direction ); //Tag the last one with a light - le = CG_MakeExplosion( origin, direction, cgs.media.explosionModel, 6, cgs.media.surfaceExplosionShader, 500, qfalse, radius * 0.02f + (random() * 0.3f) ); + le = CG_MakeExplosion( origin, direction, cgs.media.explosionModel, 6, cgs.media.surfaceExplosionShader, 500, qfalse, radius * 0.02f + (Q_flrand(0.0f, 1.0f) * 0.3f) ); le->light = 150; VectorSet( le->lightColor, 0.9f, 0.8f, 0.5f ); for ( i = 0; i < NUM_EXPLOSIONS-1; i ++) { - VectorSet( new_org, (origin[0] + (16 + (crandom() * 8))*crandom()), (origin[1] + (16 + (crandom() * 8))*crandom()), (origin[2] + (16 + (crandom() * 8))*crandom()) ); - le = CG_MakeExplosion( new_org, direction, cgs.media.explosionModel, 6, cgs.media.surfaceExplosionShader, 300 + (rand() & 99), qfalse, radius * 0.05f + (crandom() *0.3f) ); + VectorSet( new_org, (origin[0] + (16 + (Q_flrand(-1.0f, 1.0f) * 8))*Q_flrand(-1.0f, 1.0f)), (origin[1] + (16 + (Q_flrand(-1.0f, 1.0f) * 8))*Q_flrand(-1.0f, 1.0f)), (origin[2] + (16 + (Q_flrand(-1.0f, 1.0f) * 8))*Q_flrand(-1.0f, 1.0f)) ); + le = CG_MakeExplosion( new_org, direction, cgs.media.explosionModel, 6, cgs.media.surfaceExplosionShader, 300 + (rand() & 99), qfalse, radius * 0.05f + (Q_flrand(-1.0f, 1.0f) *0.3f) ); } //Shake the camera @@ -274,11 +274,11 @@ void CG_SurfaceExplosion( vec3_t origin, vec3_t normal, float radius, float shak if ( smoke ) { VectorMA( origin, -8, normal, temp_org ); -// FX_AddSpawner( temp_org, normal, NULL, NULL, 100, random()*25.0f, 5000.0f, (void *) CG_SmokeSpawn ); +// FX_AddSpawner( temp_org, normal, NULL, NULL, 100, Q_flrand(0.0f, 1.0f)*25.0f, 5000.0f, (void *) CG_SmokeSpawn ); //Impact mark //FIXME: Replace mark - //CG_ImpactMark( cgs.media.burnMarkShader, origin, normal, random()*360, 1,1,1,1, qfalse, 8, qfalse ); + //CG_ImpactMark( cgs.media.burnMarkShader, origin, normal, Q_flrand(0.0f, 1.0f)*360, 1,1,1,1, qfalse, 8, qfalse ); } } */ @@ -371,7 +371,7 @@ void CG_MiscModelExplosion( vec3_t mins, vec3_t maxs, int size, material_t chunk { for( int j = 0; j < 3; j++ ) { - r = random() * 0.8f + 0.1f; + r = Q_flrand(0.0f, 1.0f) * 0.8f + 0.1f; org[j] = ( r * mins[j] + ( 1 - r ) * maxs[j] ); } @@ -567,12 +567,12 @@ void CG_Chunks( int owner, vec3_t origin, const vec3_t normal, const vec3_t mins re->hModel = chunkModel; le->leType = LE_FRAGMENT; - le->endTime = cg.time + 1300 + random() * 900; + le->endTime = cg.time + 1300 + Q_flrand(0.0f, 1.0f) * 900; // spawn chunk roughly in the bbox of the thing...bias towards center in case thing blowing up doesn't complete fill its bbox. for( j = 0; j < 3; j++ ) { - r = random() * 0.8f + 0.1f; + r = Q_flrand(0.0f, 1.0f) * 0.8f + 0.1f; re->origin[j] = ( r * mins[j] + ( 1 - r ) * maxs[j] ); } VectorCopy( re->origin, le->pos.trBase ); @@ -583,18 +583,18 @@ void CG_Chunks( int owner, vec3_t origin, const vec3_t normal, const vec3_t mins VectorScale( dir, Q_flrand( speed * 0.5f, speed * 1.25f ) * speedMod, le->pos.trDelta ); // Angular Velocity - VectorSet( le->angles.trBase, random() * 360, random() * 360, random() * 360 ); + VectorSet( le->angles.trBase, Q_flrand(0.0f, 1.0f) * 360, Q_flrand(0.0f, 1.0f) * 360, Q_flrand(0.0f, 1.0f) * 360 ); - le->angles.trDelta[0] = crandom(); - le->angles.trDelta[1] = crandom(); + le->angles.trDelta[0] = Q_flrand(-1.0f, 1.0f); + le->angles.trDelta[1] = Q_flrand(-1.0f, 1.0f); le->angles.trDelta[2] = 0; // don't do roll - VectorScale( le->angles.trDelta, random() * 600.0f + 200.0f, le->angles.trDelta ); + VectorScale( le->angles.trDelta, Q_flrand(0.0f, 1.0f) * 600.0f + 200.0f, le->angles.trDelta ); le->pos.trType = TR_GRAVITY; le->angles.trType = TR_LINEAR; le->pos.trTime = le->angles.trTime = cg.time; - le->bounceFactor = 0.2f + random() * 0.2f; + le->bounceFactor = 0.2f + Q_flrand(0.0f, 1.0f) * 0.2f; le->leFlags |= LEF_TUMBLE; le->ownerGentNum = owner; le->leBounceSoundType = bounce; @@ -671,7 +671,7 @@ static void CG_DoGlassQuad( vec3_t p[4], vec2_t uv[4], bool stick, int time, vec vec3_t vel, accel; vec3_t rgb1; - VectorSet( vel, crandom() * 12, crandom() * 12, -1 ); + VectorSet( vel, Q_flrand(-1.0f, 1.0f) * 12, Q_flrand(-1.0f, 1.0f) * 12, -1 ); if ( !stick ) { @@ -680,26 +680,26 @@ static void CG_DoGlassQuad( vec3_t p[4], vec2_t uv[4], bool stick, int time, vec } // Set up acceleration due to gravity, 800 is standard QuakeIII gravity, so let's use something close - VectorSet( accel, 0.0f, 0.0f, -(600.0f + random() * 100.0f ) ); + VectorSet( accel, 0.0f, 0.0f, -(600.0f + Q_flrand(0.0f, 1.0f) * 100.0f ) ); VectorSet( rgb1, 1.0f, 1.0f, 1.0f ); // Being glass, we don't want to bounce much - bounce = random() * 0.2f + 0.15f; + bounce = Q_flrand(0.0f, 1.0f) * 0.2f + 0.15f; // Set up our random rotate, we only do PITCH and YAW, not ROLL. This is something like degrees per second - VectorSet( rotDelta, crandom() * 40.0f, crandom() * 40.0f, 0.0f ); + VectorSet( rotDelta, Q_flrand(-1.0f, 1.0f) * 40.0f, Q_flrand(-1.0f, 1.0f) * 40.0f, 0.0f ); CPoly *pol = FX_AddPoly(p, uv, 4, // verts, ST, vertCount vel, accel, // motion 0.15f, 0.0f, 85.0f, // alpha start, alpha end, alpha parm ( begin alpha fade when 85% of life is complete ) rgb1, rgb1, 0.0f, // rgb start, rgb end, rgb parm ( not used ) rotDelta, bounce, time, // rotation amount, bounce, and time to delay motion for ( zero if no delay ); - 3500 + random() * 1000, // life + 3500 + Q_flrand(0.0f, 1.0f) * 1000, // life cgi_R_RegisterShader( "gfx/misc/test_crackle" ), FX_APPLY_PHYSICS | FX_ALPHA_NONLINEAR | FX_USE_ALPHA ); - if ( random() > 0.95f && pol ) + if ( Q_flrand(0.0f, 1.0f) > 0.95f && pol ) { pol->AddFlags( FX_IMPACT_RUNS_FX | FX_KILL_ON_IMPACT ); pol->SetImpactFxID( theFxScheduler.RegisterEffect( "misc/glass_impact" )); @@ -779,8 +779,8 @@ void CG_InitGlass( void ) { for ( t = 0; t < 20; t++ ) { - offX[t][i] = crandom() * 0.03f; - offZ[i][t] = crandom() * 0.03f; + offX[t][i] = Q_flrand(-1.0f, 1.0f) * 0.03f; + offZ[i][t] = Q_flrand(-1.0f, 1.0f) * 0.03f; } } } @@ -938,7 +938,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl CG_CalcBiLerp( verts, subVerts, biPoints ); - float dif = DistanceSquared( subVerts[0], dmgPt ) * timeDecay - random() * 32; + float dif = DistanceSquared( subVerts[0], dmgPt ) * timeDecay - Q_flrand(0.0f, 1.0f) * 32; // If we decrease dif, we are increasing the impact area, making it more likely to blow out large holes dif -= dmgRadius * dmgRadius; @@ -946,7 +946,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl if ( dif > 1 ) { stick = true; - time = dif + random() * 200; + time = dif + Q_flrand(0.0f, 1.0f) * 200; } else { diff --git a/code/cgame/cg_ents.cpp b/code/cgame/cg_ents.cpp index a4c7d5f143..4c8ea97538 100644 --- a/code/cgame/cg_ents.cpp +++ b/code/cgame/cg_ents.cpp @@ -835,7 +835,7 @@ Ghoul2 Insert End // Only display when we have damage if ( t >= 0.0f && t <= 1.0f ) { - t *= random(); + t *= Q_flrand(0.0f, 1.0f); ent.shaderRGBA[0] = ent.shaderRGBA[1] = ent.shaderRGBA[2] = 255.0f * t; ent.shaderRGBA[3] = 255; @@ -886,7 +886,7 @@ static void CG_Speaker( centity_t *cent ) { // ent->s.frame = ent->wait * 10; // ent->s.clientNum = ent->random * 10; - cent->miscTime = (int)(cg.time + cent->currentState.frame * 100 + cent->currentState.clientNum * 100 * crandom()); + cent->miscTime = (int)(cg.time + cent->currentState.frame * 100 + cent->currentState.clientNum * 100 * Q_flrand(-1.0f, 1.0f)); } /* diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index 1f4319ba40..c0fa06c4ef 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -3878,8 +3878,8 @@ static void _PlayerSplash( const vec3_t origin, const vec3_t velocity, const flo VectorCopy( trace.endpos, end ); - end[0] += crandom() * 3.0f; - end[1] += crandom() * 3.0f; + end[0] += Q_flrand(-1.0f, 1.0f) * 3.0f; + end[1] += Q_flrand(-1.0f, 1.0f) * 3.0f; end[2] += 1.0f; //fudge up int t = VectorLengthSquared( velocity ); @@ -3892,10 +3892,10 @@ static void _PlayerSplash( const vec3_t origin, const vec3_t velocity, const flo float alpha = ( t / 8192.0f ) * 0.6f + 0.2f; FX_AddOrientedParticle( -1, end, trace.plane.normal, NULL, NULL, - 6.0f, radius + random() * 48.0f, 0, + 6.0f, radius + Q_flrand(0.0f, 1.0f) * 48.0f, 0, alpha, 0.0f, 0.0f, WHITE, WHITE, 0.0f, - random() * 360, crandom() * 6.0f, NULL, NULL, 0.0f, 0 ,0, 1200, + Q_flrand(0.0f, 1.0f) * 360, Q_flrand(-1.0f, 1.0f) * 6.0f, NULL, NULL, 0.0f, 0 ,0, 1200, cgs.media.wakeMarkShader, FX_ALPHA_LINEAR | FX_SIZE_LINEAR ); } @@ -3949,7 +3949,7 @@ static void CG_PlayerSplash( centity_t *cent ) _PlayerSplash( cent->lerpOrigin, cl->ps.velocity, 36, cl->renderInfo.eyePoint[2] - cent->lerpOrigin[2] + 5 ); } - cent->gent->disconnectDebounceTime = cg.time + 125 + random() * 50.0f; + cent->gent->disconnectDebounceTime = cg.time + 125 + Q_flrand(0.0f, 1.0f) * 50.0f; } } } @@ -4005,7 +4005,7 @@ static void CG_LightningBolt( centity_t *cent, vec3_t origin ) if ( cent->gent->fx_time < cg.time && !(trace.surfaceFlags & SURF_NOIMPACT )) { spark = qtrue; - cent->gent->fx_time = cg.time + random() * 100 + 100; + cent->gent->fx_time = cg.time + Q_flrand(0.0f, 1.0f) * 100 + 100; } // Don't draw certain kinds of impacts when it hits a player and such..or when we hit a surface with a NOIMPACT flag @@ -4355,7 +4355,7 @@ static void CG_ForceElectrocution( centity_t *cent, const vec3_t origin, vec3_t if ( found ) { gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); - if ( random() > 0.5f ) + if ( Q_flrand(0.0f, 1.0f) > 0.5f ) { gi.G2API_GiveMeVectorFromMatrix( boltMatrix, NEGATIVE_X, dir ); } @@ -4365,15 +4365,15 @@ static void CG_ForceElectrocution( centity_t *cent, const vec3_t origin, vec3_t } // Add some fudge, makes us not normalized, but that isn't really important - dir[0] += crandom() * 0.4f; - dir[1] += crandom() * 0.4f; - dir[2] += crandom() * 0.4f; + dir[0] += Q_flrand(-1.0f, 1.0f) * 0.4f; + dir[1] += Q_flrand(-1.0f, 1.0f) * 0.4f; + dir[2] += Q_flrand(-1.0f, 1.0f) * 0.4f; } else { // Just use the lerp Origin and a random direction VectorCopy( cent->lerpOrigin, fxOrg ); - VectorSet( dir, crandom(), crandom(), crandom() ); // Not normalized, but who cares. + VectorSet( dir, Q_flrand(-1.0f, 1.0f), Q_flrand(-1.0f, 1.0f), Q_flrand(-1.0f, 1.0f) ); // Not normalized, but who cares. if ( cent->gent && cent->gent->client ) { switch ( cent->gent->client->NPC_class ) @@ -4393,19 +4393,19 @@ static void CG_ForceElectrocution( centity_t *cent, const vec3_t origin, vec3_t } } - VectorMA( fxOrg, random() * 40 + 40, dir, fxOrg2 ); + VectorMA( fxOrg, Q_flrand(0.0f, 1.0f) * 40 + 40, dir, fxOrg2 ); trace_t tr; CG_Trace( &tr, fxOrg, NULL, NULL, fxOrg2, -1, CONTENTS_SOLID ); - if ( tr.fraction < 1.0f || random() > 0.94f || alwaysDo ) + if ( tr.fraction < 1.0f || Q_flrand(0.0f, 1.0f) > 0.94f || alwaysDo ) { FX_AddElectricity( -1, fxOrg, tr.endpos, 1.5f, 4.0f, 0.0f, 1.0f, 0.5f, 0.0f, rgb, rgb, 0.0f, - 5.5f, random() * 50 + 100, shader, FX_ALPHA_LINEAR | FX_SIZE_LINEAR | FX_BRANCH | FX_GROW | FX_TAPER, -1, -1 ); + 5.5f, Q_flrand(0.0f, 1.0f) * 50 + 100, shader, FX_ALPHA_LINEAR | FX_SIZE_LINEAR | FX_BRANCH | FX_GROW | FX_TAPER, -1, -1 ); } } @@ -4666,7 +4666,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen ent->customShader = 0; cgi_R_AddRefEntityToScene( ent ); - if ( cg.time - ent->endTime < 1000 && (cg_timescale.value * cg_timescale.value * random()) > 0.05f ) + if ( cg.time - ent->endTime < 1000 && (cg_timescale.value * cg_timescale.value * Q_flrand(0.0f, 1.0f)) > 0.05f ) { vec3_t fxOrg; mdxaBone_t boltMatrix; @@ -4677,10 +4677,10 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); VectorMA( fxOrg, -18, cg.refdef.viewaxis[0], fxOrg ); - fxOrg[2] += crandom() * 20; + fxOrg[2] += Q_flrand(-1.0f, 1.0f) * 20; theFxScheduler.PlayEffect( "disruptor/death_smoke", fxOrg ); - if ( random() > 0.5f ) + if ( Q_flrand(0.0f, 1.0f) > 0.5f ) { theFxScheduler.PlayEffect( "disruptor/death_smoke", fxOrg ); } @@ -4757,7 +4757,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen { int dif = gent->client->ps.powerups[PW_SHOCKED] - cg.time; - if ( dif > 0 && random() > 0.4f ) + if ( dif > 0 && Q_flrand(0.0f, 1.0f) > 0.4f ) { // fade out over the last 500 ms int brightness = 255; @@ -4782,7 +4782,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen cgi_R_AddRefEntityToScene( ent ); - if ( random() > 0.9f ) + if ( Q_flrand(0.0f, 1.0f) > 0.9f ) cgi_S_StartSound ( ent->origin, gent->s.number, CHAN_AUTO, cgi_S_RegisterSound( "sound/effects/energy_crackle.wav" ) ); } } @@ -5065,7 +5065,7 @@ static void CG_G2SetHeadBlink( centity_t *cent, qboolean bStart ) if (bStart) { desiredAngles[YAW] = -38; - if ( !in_camera && random() > 0.95f ) + if ( !in_camera && Q_flrand(0.0f, 1.0f) > 0.95f ) { bWink = qtrue; blendTime /=3; @@ -5739,7 +5739,7 @@ static void CG_DoSaberLight( saberInfo_t *saber ) } } - cgi_R_AddLightToScene( mid, diameter + (random()*8.0f), rgb[0], rgb[1], rgb[2] ); + cgi_R_AddLightToScene( mid, diameter + (Q_flrand(0.0f, 1.0f)*8.0f), rgb[0], rgb[1], rgb[2] ); } } @@ -5792,7 +5792,7 @@ static void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax {//FIXME: RGB combine all the colors of the sabers you're using into one averaged color! vec3_t rgb={1,1,1}; CG_RGBForSaberColor( color, rgb ); - cgi_R_AddLightToScene( mid, (length*1.4f) + (random()*3.0f), rgb[0], rgb[1], rgb[2] ); + cgi_R_AddLightToScene( mid, (length*1.4f) + (Q_flrand(0.0f, 1.0f)*3.0f), rgb[0], rgb[1], rgb[2] ); } memset( &saber, 0, sizeof( refEntity_t )); @@ -5815,8 +5815,8 @@ static void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax float radiusRange = radius * 0.075f; float radiusStart = radius-radiusRange; - saber.radius = (radiusStart + crandom() * radiusRange)*radiusmult; - //saber.radius = (2.8f + crandom() * 0.2f)*radiusmult; + saber.radius = (radiusStart + Q_flrand(-1.0f, 1.0f) * radiusRange)*radiusmult; + //saber.radius = (2.8f + Q_flrand(-1.0f, 1.0f) * 0.2f)*radiusmult; VectorCopy( origin, saber.origin ); @@ -5834,8 +5834,8 @@ static void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax 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; + saber.radius = (radiusStart + Q_flrand(-1.0f, 1.0f) * radiusRange)*radiusmult; +// saber.radius = (1.0 + Q_flrand(-1.0f, 1.0f) * 0.2f)*radiusmult; cgi_R_AddRefEntityToScene( &saber ); } @@ -5901,8 +5901,8 @@ static void CG_CreateSaberMarks( vec3_t start, vec3_t end, vec3_t normal ) VectorScale( mid, 0.5f, mid ); VectorSubtract( v->xyz, mid, delta ); - v->st[0] = 0.5 + DotProduct( delta, axis[1] ) * (0.05f + random() * 0.03f); - v->st[1] = 0.5 + DotProduct( delta, axis[2] ) * (0.15f + random() * 0.05f); + v->st[0] = 0.5 + DotProduct( delta, axis[1] ) * (0.05f + Q_flrand(0.0f, 1.0f) * 0.03f); + v->st[1] = 0.5 + DotProduct( delta, axis[2] ) * (0.15f + Q_flrand(0.0f, 1.0f) * 0.05f); } // save it persistantly, do burn first @@ -5921,9 +5921,9 @@ static void CG_CreateSaberMarks( vec3_t start, vec3_t end, vec3_t normal ) mark->alphaFade = qfalse; mark->markShader = cgi_R_RegisterShader("gfx/effects/saberDamageGlow" ); mark->poly.numVerts = mf->numPoints; - mark->color[0] = 215 + random() * 40.0f; - mark->color[1] = 96 + random() * 32.0f; - mark->color[2] = mark->color[3] = random()*15.0f; + mark->color[0] = 215 + Q_flrand(0.0f, 1.0f) * 40.0f; + mark->color[1] = 96 + Q_flrand(0.0f, 1.0f) * 32.0f; + mark->color[2] = mark->color[3] = Q_flrand(0.0f, 1.0f)*15.0f; memcpy( mark->verts, verts, mf->numPoints * sizeof( verts[0] ) ); } } @@ -8399,9 +8399,9 @@ Ghoul2 Insert End CGCam_Shake( val * val * 0.3f, 100 ); } - val += random() * 0.5f; + val += Q_flrand(0.0f, 1.0f) * 0.5f; - FX_AddSprite( cent->gent->client->renderInfo.muzzlePoint, NULL, NULL, 3.0f * val * scale, 0.0f, 0.7f, 0.7f, WHITE, WHITE, random() * 360, 0.0f, 1.0f, shader, FX_USE_ALPHA ); + FX_AddSprite( cent->gent->client->renderInfo.muzzlePoint, NULL, NULL, 3.0f * val * scale, 0.0f, 0.7f, 0.7f, WHITE, WHITE, Q_flrand(0.0f, 1.0f) * 360, 0.0f, 1.0f, shader, FX_USE_ALPHA ); } } } diff --git a/code/cgame/cg_weapons.cpp b/code/cgame/cg_weapons.cpp index 9f63394f9a..dc90ee497e 100644 --- a/code/cgame/cg_weapons.cpp +++ b/code/cgame/cg_weapons.cpp @@ -1210,7 +1210,7 @@ void CG_AddViewWeapon( playerState_t *ps ) cent->gent->client->ps.saber[0].blade[0].length = cent->gent->client->ps.saber[0].blade[0].lengthMax; } } - // FX_Saber( org_, axis_[0], cent->gent->client->ps.saberLength, 2.0 + crandom() * 0.2f, cent->gent->client->ps.saberColor ); + // FX_Saber( org_, axis_[0], cent->gent->client->ps.saberLength, 2.0 + Q_flrand(-1.0f, 1.0f) * 0.2f, cent->gent->client->ps.saberColor ); if ( saberNum == 0 && bladeNum == 0 ) { VectorCopy( axis_[0], cent->gent->client->renderInfo.muzzleDir ); @@ -1333,9 +1333,9 @@ void CG_AddViewWeapon( playerState_t *ps ) CGCam_Shake( val * val * 0.3f, 100 ); } - val += random() * 0.5f; + val += Q_flrand(0.0f, 1.0f) * 0.5f; - FX_AddSprite( flash.origin, NULL, NULL, 3.0f * val * scale, 0.0f, 0.7f, 0.7f, WHITE, WHITE, random() * 360, 0.0f, 1.0f, shader, FX_USE_ALPHA | FX_DEPTH_HACK ); + FX_AddSprite( flash.origin, NULL, NULL, 3.0f * val * scale, 0.0f, 0.7f, 0.7f, WHITE, WHITE, Q_flrand(0.0f, 1.0f) * 360, 0.0f, 1.0f, shader, FX_USE_ALPHA | FX_DEPTH_HACK ); } // Check if the heavy repeater is finishing up a sustained burst @@ -2147,7 +2147,7 @@ extern qboolean Q3_TaskIDPending( gentity_t *ent, taskID_t taskType ); {//not waiting on a scripted sound to finish if( !jumping ) { - if( random() > 0.5 ) + if( Q_flrand(0.0f, 1.0f) > 0.5 ) { G_SoundOnEnt( player, CHAN_VOICE, va( "sound/chars/kyle/09kyk015.wav" )); } diff --git a/code/game/AI_BobaFett.cpp b/code/game/AI_BobaFett.cpp index 0b50e99e4f..8c5925e254 100644 --- a/code/game/AI_BobaFett.cpp +++ b/code/game/AI_BobaFett.cpp @@ -261,8 +261,8 @@ void Boba_DustFallNear(const vec3_t origin, int dustcount) VectorCopy(origin, testStartPos); for (int i=0; i0.0f)?(0.5f):(-0.5f); - testDirection[1] = (random() * 0.5f) - 1.0f; + testDirection[1] = (Q_flrand(0.0f, 1.0f) * 0.5f) - 1.0f; testDirection[1] += (testDirection[1]>0.0f)?(0.5f):(-0.5f); testDirection[2] = 1.0f; VectorMA(NPC->enemy->currentOrigin, 400.0f, testDirection, BobaFootStepLoc); diff --git a/code/game/AI_Default.cpp b/code/game/AI_Default.cpp index e95756a9ea..368cf10832 100644 --- a/code/game/AI_Default.cpp +++ b/code/game/AI_Default.cpp @@ -116,8 +116,8 @@ qboolean NPC_StandTrackAndShoot (gentity_t *NPC, qboolean canDuck) { if ( NPC->health < 20 ) { - // if( NPC->svFlags&SVF_HEALING || random() ) - if( random() ) + // if( NPC->svFlags&SVF_HEALING || Q_flrand(0.0f, 1.0f) ) + if( Q_flrand(0.0f, 1.0f) ) { duck_ok = qtrue; } @@ -205,7 +205,7 @@ void NPC_BSStandGuard (void) //FIXME: Use Snapshot info if ( NPC->enemy == NULL ) {//Possible to pick one up by being shot - if( random() < 0.5 ) + if( Q_flrand(0.0f, 1.0f) < 0.5 ) { if(NPC->client->enemyTeam) { diff --git a/code/game/AI_Droid.cpp b/code/game/AI_Droid.cpp index 3b018d42c7..8fab6ecac9 100644 --- a/code/game/AI_Droid.cpp +++ b/code/game/AI_Droid.cpp @@ -299,7 +299,7 @@ void NPC_Droid_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, co pain_chance = NPC_GetPainChance( self, damage ); // Put it in pain - if ( mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT || random() < pain_chance ) // Spin around in pain? Demp2 always does this + if ( mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT || Q_flrand(0.0f, 1.0f) < pain_chance ) // Spin around in pain? Demp2 always does this { // Health is between 0-30 or was hit by a DEMP2 so pop his head if ( self->health < 30 || mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT ) @@ -365,7 +365,7 @@ void NPC_Droid_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, co pain_chance = NPC_GetPainChance( self, damage ); - if ( mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT || random() < pain_chance ) // Spin around in pain? Demp2 always does this + if ( mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT || Q_flrand(0.0f, 1.0f) < pain_chance ) // Spin around in pain? Demp2 always does this { anim = self->client->ps.legsAnim; @@ -562,7 +562,7 @@ void NPC_BSDroid_Default( void ) else if ( NPCInfo->localState == LSTATE_DROP ) { NPC_UpdateAngles( qtrue, qtrue ); - ucmd.upmove = crandom() * 64; + ucmd.upmove = Q_flrand(-1.0f, 1.0f) * 64; } else if ( NPCInfo->scriptFlags & SCF_LOOK_FOR_ENEMIES ) { diff --git a/code/game/AI_HazardTrooper.cpp b/code/game/AI_HazardTrooper.cpp index e9b47baa68..bb18c85fec 100644 --- a/code/game/AI_HazardTrooper.cpp +++ b/code/game/AI_HazardTrooper.cpp @@ -88,7 +88,7 @@ extern void G_AddVoiceEvent( gentity_t *self, int event, int speakDebounceTime ) extern void CG_DrawEdge( vec3_t start, vec3_t end, int type ); static void HT_Speech( gentity_t *self, int speechType, float failChance ) { - if ( random() < failChance ) + if ( Q_flrand(0.0f, 1.0f) < failChance ) { return; } diff --git a/code/game/AI_ImperialProbe.cpp b/code/game/AI_ImperialProbe.cpp index b9d81e6a43..25620b374b 100644 --- a/code/game/AI_ImperialProbe.cpp +++ b/code/game/AI_ImperialProbe.cpp @@ -224,7 +224,7 @@ void ImperialProbe_Strafe( void ) // Set the strafe start time so we can do a controlled roll NPC->fx_time = level.time; - NPCInfo->standTime = level.time + 3000 + random() * 500; + NPCInfo->standTime = level.time + 3000 + Q_flrand(0.0f, 1.0f) * 500; } } @@ -495,7 +495,7 @@ void NPC_Probe_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, co { pain_chance = NPC_GetPainChance( self, damage ); - if ( random() < pain_chance ) // Spin around in pain? + if ( Q_flrand(0.0f, 1.0f) < pain_chance ) // Spin around in pain? { NPC_SetAnim( self, SETANIM_BOTH, BOTH_PAIN1, SETANIM_FLAG_OVERRIDE); } diff --git a/code/game/AI_Interrogator.cpp b/code/game/AI_Interrogator.cpp index 0929fdc062..f3bd826dd3 100644 --- a/code/game/AI_Interrogator.cpp +++ b/code/game/AI_Interrogator.cpp @@ -289,7 +289,7 @@ void Interrogator_Strafe( void ) // Set the strafe start time NPC->fx_time = level.time; - NPCInfo->standTime = level.time + 3000 + random() * 500; + NPCInfo->standTime = level.time + 3000 + Q_flrand(0.0f, 1.0f) * 500; } } diff --git a/code/game/AI_MineMonster.cpp b/code/game/AI_MineMonster.cpp index 9c11b01e41..02ad97ce8f 100644 --- a/code/game/AI_MineMonster.cpp +++ b/code/game/AI_MineMonster.cpp @@ -144,18 +144,18 @@ void MineMonster_Attack( void ) if ( !TIMER_Exists( NPC, "attacking" )) { // usually try and play a jump attack if the player somehow got above them....or just really rarely - if ( NPC->enemy && ((NPC->enemy->currentOrigin[2] - NPC->currentOrigin[2] > 10 && random() > 0.1f ) - || random() > 0.8f )) + if ( NPC->enemy && ((NPC->enemy->currentOrigin[2] - NPC->currentOrigin[2] > 10 && Q_flrand(0.0f, 1.0f) > 0.1f ) + || Q_flrand(0.0f, 1.0f) > 0.8f )) { // Going to do ATTACK4 - TIMER_Set( NPC, "attacking", 1750 + random() * 200 ); + TIMER_Set( NPC, "attacking", 1750 + Q_flrand(0.0f, 1.0f) * 200 ); NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_ATTACK4, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD ); TIMER_Set( NPC, "attack2_dmg", 950 ); // level two damage } - else if ( random() > 0.5f ) + else if ( Q_flrand(0.0f, 1.0f) > 0.5f ) { - if ( random() > 0.8f ) + if ( Q_flrand(0.0f, 1.0f) > 0.8f ) { // Going to do ATTACK3, (rare) TIMER_Set( NPC, "attacking", 850 ); diff --git a/code/game/AI_Rancor.cpp b/code/game/AI_Rancor.cpp index 68d0c4cccf..803636dfe3 100644 --- a/code/game/AI_Rancor.cpp +++ b/code/game/AI_Rancor.cpp @@ -933,7 +933,7 @@ void Rancor_Attack( float distance, qboolean doCharge, qboolean aimAtBlockedEnti return; } - TIMER_Set( NPC, "attacking", NPC->client->ps.legsAnimTimer + random() * 200 ); + TIMER_Set( NPC, "attacking", NPC->client->ps.legsAnimTimer + Q_flrand(0.0f, 1.0f) * 200 ); } // Need to do delayed damage since the attack animations encapsulate multiple mini-attacks diff --git a/code/game/AI_Remote.cpp b/code/game/AI_Remote.cpp index b18b377c2f..da712d0143 100644 --- a/code/game/AI_Remote.cpp +++ b/code/game/AI_Remote.cpp @@ -188,7 +188,7 @@ void Remote_Strafe( void ) // Set the strafe start time so we can do a controlled roll NPC->fx_time = level.time; - NPCInfo->standTime = level.time + 3000 + random() * 500; + NPCInfo->standTime = level.time + 3000 + Q_flrand(0.0f, 1.0f) * 500; } } diff --git a/code/game/AI_RocketTrooper.cpp b/code/game/AI_RocketTrooper.cpp index 70e5a57d48..69ac2f99bb 100644 --- a/code/game/AI_RocketTrooper.cpp +++ b/code/game/AI_RocketTrooper.cpp @@ -627,7 +627,7 @@ void RT_Flying_Strafe( void ) vec3_t end, right, dir; trace_t tr; - if ( random() > 0.7f + if ( Q_flrand(0.0f, 1.0f) > 0.7f || !NPC->enemy || !NPC->enemy->client ) { @@ -663,7 +663,7 @@ void RT_Flying_Strafe( void ) } } - NPCInfo->standTime = level.time + 1000 + random() * 500; + NPCInfo->standTime = level.time + 1000 + Q_flrand(0.0f, 1.0f) * 500; } } else @@ -677,7 +677,7 @@ void RT_Flying_Strafe( void ) VectorMA( NPC->enemy->currentOrigin, stDis * side, right, end ); // then add a very small bit of random in front of/behind the player action - VectorMA( end, crandom() * 25, dir, end ); + VectorMA( end, Q_flrand(-1.0f, 1.0f) * 25, dir, end ); gi.trace( &tr, NPC->currentOrigin, NULL, NULL, end, NPC->s.number, MASK_SOLID, (EG2_Collision)0, 0 ); @@ -716,7 +716,7 @@ void RT_Flying_Strafe( void ) } } - NPCInfo->standTime = level.time + 2500 + random() * 500; + NPCInfo->standTime = level.time + 2500 + Q_flrand(0.0f, 1.0f) * 500; } } } @@ -857,7 +857,7 @@ void RT_Flying_Think( void ) if ( NPC->random == 0.0f ) { // used to offset seekers around a circle so they don't occupy the same spot. This is not a fool-proof method. - NPC->random = random() * 6.3f; // roughly 2pi + NPC->random = Q_flrand(0.0f, 1.0f) * 6.3f; // roughly 2pi } if ( NPC->enemy && NPC->enemy->health && NPC->enemy->inuse ) diff --git a/code/game/AI_Seeker.cpp b/code/game/AI_Seeker.cpp index d6dd8bbb39..c96327eddf 100644 --- a/code/game/AI_Seeker.cpp +++ b/code/game/AI_Seeker.cpp @@ -178,7 +178,7 @@ void Seeker_Strafe( void ) vec3_t end, right, dir; trace_t tr; - if ( random() > 0.7f || !NPC->enemy || !NPC->enemy->client ) + if ( Q_flrand(0.0f, 1.0f) > 0.7f || !NPC->enemy || !NPC->enemy->client ) { // Do a regular style strafe AngleVectors( NPC->client->renderInfo.eyeAngles, NULL, right, NULL ); @@ -208,7 +208,7 @@ void Seeker_Strafe( void ) // Add a slight upward push NPC->client->ps.velocity[2] += upPush; - NPCInfo->standTime = level.time + 1000 + random() * 500; + NPCInfo->standTime = level.time + 1000 + Q_flrand(0.0f, 1.0f) * 500; } } else @@ -226,7 +226,7 @@ void Seeker_Strafe( void ) VectorMA( NPC->enemy->currentOrigin, stDis * side, right, end ); // then add a very small bit of random in front of/behind the player action - VectorMA( end, crandom() * 25, dir, end ); + VectorMA( end, Q_flrand(-1.0f, 1.0f) * 25, dir, end ); gi.trace( &tr, NPC->currentOrigin, NULL, NULL, end, NPC->s.number, MASK_SOLID, (EG2_Collision)0, 0 ); @@ -253,7 +253,7 @@ void Seeker_Strafe( void ) // Add a slight upward push NPC->client->ps.velocity[2] += upPush; - NPCInfo->standTime = level.time + 2500 + random() * 500; + NPCInfo->standTime = level.time + 2500 + Q_flrand(0.0f, 1.0f) * 500; } } } @@ -434,7 +434,7 @@ void Seeker_FindEnemy( void ) if ( best ) { // used to offset seekers around a circle so they don't occupy the same spot. This is not a fool-proof method. - NPC->random = random() * 6.3f; // roughly 2pi + NPC->random = Q_flrand(0.0f, 1.0f) * 6.3f; // roughly 2pi NPC->enemy = best; } @@ -490,7 +490,7 @@ void Seeker_FollowPlayer( void ) { if ( TIMER_Done( NPC, "seekerhiss" )) { - TIMER_Set( NPC, "seekerhiss", 1000 + random() * 1000 ); + TIMER_Set( NPC, "seekerhiss", 1000 + Q_flrand(0.0f, 1.0f) * 1000 ); G_Sound( NPC, G_SoundIndex( "sound/chars/seeker/misc/hiss" )); } } @@ -527,7 +527,7 @@ void NPC_BSSeeker_Default( void ) if ( NPC->random == 0.0f ) { // used to offset seekers around a circle so they don't occupy the same spot. This is not a fool-proof method. - NPC->random = random() * 6.3f; // roughly 2pi + NPC->random = Q_flrand(0.0f, 1.0f) * 6.3f; // roughly 2pi } if ( NPC->enemy && NPC->enemy->health && NPC->enemy->inuse ) diff --git a/code/game/AI_Sentry.cpp b/code/game/AI_Sentry.cpp index 0e9abf9491..d24c1f9acd 100644 --- a/code/game/AI_Sentry.cpp +++ b/code/game/AI_Sentry.cpp @@ -377,7 +377,7 @@ void Sentry_Strafe( void ) // Set the strafe start time so we can do a controlled roll NPC->fx_time = level.time; - NPCInfo->standTime = level.time + 3000 + random() * 500; + NPCInfo->standTime = level.time + 3000 + Q_flrand(0.0f, 1.0f) * 500; } } diff --git a/code/game/AI_Stormtrooper.cpp b/code/game/AI_Stormtrooper.cpp index 31c964dc09..bf278a5deb 100644 --- a/code/game/AI_Stormtrooper.cpp +++ b/code/game/AI_Stormtrooper.cpp @@ -205,7 +205,7 @@ enum static void ST_Speech( gentity_t *self, int speechType, float failChance ) { - if ( random() < failChance ) + if ( Q_flrand(0.0f, 1.0f) < failChance ) { return; } diff --git a/code/game/AI_Wampa.cpp b/code/game/AI_Wampa.cpp index 001aea46d4..57195d3015 100644 --- a/code/game/AI_Wampa.cpp +++ b/code/game/AI_Wampa.cpp @@ -311,7 +311,7 @@ void Wampa_Attack( float distance, qboolean doCharge ) TIMER_Set( NPC, "attack_dmg", 250 ); } - TIMER_Set( NPC, "attacking", NPC->client->ps.legsAnimTimer + random() * 200 ); + TIMER_Set( NPC, "attacking", NPC->client->ps.legsAnimTimer + Q_flrand(0.0f, 1.0f) * 200 ); //allow us to re-evaluate our running speed/anim TIMER_Set( NPC, "runfar", -1 ); TIMER_Set( NPC, "runclose", -1 ); diff --git a/code/game/NPC_behavior.cpp b/code/game/NPC_behavior.cpp index ad3eda7d03..249bc3c17d 100644 --- a/code/game/NPC_behavior.cpp +++ b/code/game/NPC_behavior.cpp @@ -159,13 +159,13 @@ void NPC_BSAdvanceFight (void) VectorMA ( muzzle, distanceToEnemy, forward, hitspot); VectorSubtract(hitspot, enemy_org, diff); aim_off = VectorLength(diff); - if(aim_off > random() * max_aim_off)//FIXME: use aim value to allow poor aim? + if(aim_off > Q_flrand(0.0f, 1.0f) * max_aim_off)//FIXME: use aim value to allow poor aim? { attack_scale *= 0.75; //see if where we're going to shoot is too far from his head VectorSubtract(hitspot, enemy_head, diff); aim_off = VectorLength(diff); - if(aim_off > random() * max_aim_off) + if(aim_off > Q_flrand(0.0f, 1.0f) * max_aim_off) { attack_ok = qfalse; } diff --git a/code/game/NPC_combat.cpp b/code/game/NPC_combat.cpp index be430076a5..fc60f59f76 100644 --- a/code/game/NPC_combat.cpp +++ b/code/game/NPC_combat.cpp @@ -1327,7 +1327,7 @@ qboolean CanShoot ( gentity_t *ent, gentity_t *shooter ) //Actually, we should just check to fire in dir we're facing and if it's close enough, //and we didn't hit someone on our own team, shoot VectorSubtract(spot, tr.endpos, diff); - if(VectorLength(diff) < random() * 32) + if(VectorLength(diff) < Q_flrand(0.0f, 1.0f) * 32) { return qtrue; } @@ -2330,7 +2330,7 @@ qboolean NPC_CheckDefend (float scale) if(!scale) scale = 1.0; - if((float)(NPCInfo->stats.evasion) > random() * 4 * scale) + if((float)(NPCInfo->stats.evasion) > Q_flrand(0.0f, 1.0f) * 4 * scale) return qtrue; return qfalse; @@ -2505,13 +2505,13 @@ qboolean NPC_CheckCanAttack (float attack_scale, qboolean stationary) VectorMA ( muzzle, distanceToEnemy, forward, hitspot); VectorSubtract(hitspot, enemy_org, diff); aim_off = VectorLength(diff); - if(aim_off > random() * max_aim_off)//FIXME: use aim value to allow poor aim? + if(aim_off > Q_flrand(0.0f, 1.0f) * max_aim_off)//FIXME: use aim value to allow poor aim? { attack_scale *= 0.75; //see if where we're going to shoot is too far from his head VectorSubtract(hitspot, enemy_org, diff); aim_off = VectorLength(diff); - if(aim_off > random() * max_aim_off) + if(aim_off > Q_flrand(0.0f, 1.0f) * max_aim_off) { attack_ok = qfalse; } diff --git a/code/game/NPC_reactions.cpp b/code/game/NPC_reactions.cpp index 89e05b1b26..643bc7dd93 100644 --- a/code/game/NPC_reactions.cpp +++ b/code/game/NPC_reactions.cpp @@ -144,7 +144,7 @@ static void NPC_CheckAttacker( gentity_t *other, int mod ) } //Randomly pick up the target - if ( random() > luckThreshold ) + if ( Q_flrand(0.0f, 1.0f) > luckThreshold ) { G_ClearEnemy( other ); other->enemy = NPC; @@ -295,7 +295,7 @@ void NPC_ChoosePainAnimation( gentity_t *self, gentity_t *other, const vec3_t po } //See if we're going to flinch - if ( random() < pain_chance ) + if ( Q_flrand(0.0f, 1.0f) < pain_chance ) { //Pick and play our animation if ( (self->client->ps.eFlags&EF_FORCE_GRIPPED) ) diff --git a/code/game/NPC_utils.cpp b/code/game/NPC_utils.cpp index d92cdd167d..816e2fa2d5 100644 --- a/code/game/NPC_utils.cpp +++ b/code/game/NPC_utils.cpp @@ -419,7 +419,7 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) //Snap to if(fabs(error) > 10) { - if(random() > 0.6) + if(Q_flrand(0.0f, 1.0f) > 0.6) { doSound = qtrue; } @@ -493,7 +493,7 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) //Snap to if(fabs(error) > 10) { - if(random() > 0.6) + if(Q_flrand(0.0f, 1.0f) > 0.6) { doSound = qtrue; } diff --git a/code/game/g_breakable.cpp b/code/game/g_breakable.cpp index fccf0f524a..ae7c860e44 100644 --- a/code/game/g_breakable.cpp +++ b/code/game/g_breakable.cpp @@ -114,7 +114,7 @@ void funcBBrushDieGo (gentity_t *self) VectorSubtract( self->absmax, self->absmin, org );// size - numChunks = random() * 6 + 18; + numChunks = Q_flrand(0.0f, 1.0f) * 6 + 18; // This formula really has no logical basis other than the fact that it seemed to be the closest to yielding the results that I wanted. // Volume is length * width * height...then break that volume down based on how many chunks we have @@ -502,7 +502,7 @@ void misc_model_breakable_die( gentity_t *self, gentity_t *inflictor, gentity_t AngleVectors( self->s.apos.trBase, dir, NULL, NULL ); VectorNormalize( dir ); - numChunks = random() * 6 + 20; + numChunks = Q_flrand(0.0f, 1.0f) * 6 + 20; VectorSubtract( self->absmax, self->absmin, dis ); diff --git a/code/game/g_combat.cpp b/code/game/g_combat.cpp index dd2a0ec03d..2bea30525a 100644 --- a/code/game/g_combat.cpp +++ b/code/game/g_combat.cpp @@ -6168,14 +6168,14 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, const //for (int i=0; icurrentOrigin, 60.0f, testDirection, testStartPos); VectorCopy(targ->currentOrigin, testEndPos); - testEndPos[0] += (random() * 8.0f) - 4.0f; - testEndPos[1] += (random() * 8.0f) - 4.0f; - testEndPos[2] += (random() * 8.0f); + testEndPos[0] += (Q_flrand(0.0f, 1.0f) * 8.0f) - 4.0f; + testEndPos[1] += (Q_flrand(0.0f, 1.0f) * 8.0f) - 4.0f; + testEndPos[2] += (Q_flrand(0.0f, 1.0f) * 8.0f); gi.trace (&testTrace, testStartPos, NULL, NULL, testEndPos, ENTITYNUM_NONE, MASK_SHOT, G2_COLLIDE, 0); @@ -6188,7 +6188,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, const } // CG_DrawEdge(testStartPos, testEndPos, EDGE_IMPACT_POSSIBLE); float chanceOfFizz = gi.WE_GetChanceOfSaberFizz(); - TIMER_Set(targ, "AcidPainDebounce", 200 + (10000.0f * random() * chanceOfFizz)); + TIMER_Set(targ, "AcidPainDebounce", 200 + (10000.0f * Q_flrand(0.0f, 1.0f) * chanceOfFizz)); hitLoc = HL_CHEST; } } diff --git a/code/game/g_emplaced.cpp b/code/game/g_emplaced.cpp index 6519a9dd58..9ef53cf6e3 100644 --- a/code/game/g_emplaced.cpp +++ b/code/game/g_emplaced.cpp @@ -745,8 +745,8 @@ void emplaced_gun_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacke vec3_t ugly; ugly[YAW] = 4; - ugly[PITCH] = self->lastAngles[PITCH] * 0.8f + crandom() * 6; - ugly[ROLL] = crandom() * 7; + ugly[PITCH] = self->lastAngles[PITCH] * 0.8f + Q_flrand(-1.0f, 1.0f) * 6; + ugly[ROLL] = Q_flrand(-1.0f, 1.0f) * 7; gi.G2API_SetBoneAnglesIndex( &self->ghoul2[self->playerModel], self->lowerLumbarBone, ugly, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 0, 0 ); VectorCopy( self->currentOrigin, org ); diff --git a/code/game/g_fx.cpp b/code/game/g_fx.cpp index 847179bb33..41fe80fb81 100644 --- a/code/game/g_fx.cpp +++ b/code/game/g_fx.cpp @@ -67,7 +67,7 @@ void fx_runner_think( gentity_t *ent ) AngleVectors( ent->currentAngles, ent->pos3, NULL, NULL ); MakeNormalVectors( ent->pos3, ent->pos4, temp ); // there IS a reason this is done...it's so that it doesn't break every effect in the game... - ent->nextthink = level.time + ent->delay + random() * ent->random; + ent->nextthink = level.time + ent->delay + Q_flrand(0.0f, 1.0f) * ent->random; if ( ent->spawnflags & 4 ) // damage { diff --git a/code/game/g_items.cpp b/code/game/g_items.cpp index 79daac206d..96ecfb166f 100644 --- a/code/game/g_items.cpp +++ b/code/game/g_items.cpp @@ -993,7 +993,7 @@ gentity_t *LaunchItem( gitem_t *item, const vec3_t origin, const vec3_t velocity && item->giTag != WP_TRIP_MINE && item->giTag != WP_DET_PACK ) { - VectorSet( dropped->s.angles, 0, crandom() * 180, 90.0f ); + VectorSet( dropped->s.angles, 0, Q_flrand(-1.0f, 1.0f) * 180, 90.0f ); G_SetAngles( dropped, dropped->s.angles ); } } @@ -1030,7 +1030,7 @@ gentity_t *Drop_Item( gentity_t *ent, gitem_t *item, float angle, qboolean copyt AngleVectors( angles, velocity, NULL, NULL ); VectorScale( velocity, 150, velocity ); - velocity[2] += 200 + crandom() * 50; + velocity[2] += 200 + Q_flrand(-1.0f, 1.0f) * 50; if ( copytarget ) { @@ -1507,9 +1507,9 @@ void G_RunItem( gentity_t *ent ) { { ent->s.pos.trType = TR_GRAVITY; ent->s.pos.trTime = level.time; - ent->s.pos.trDelta[0] += crandom() * 40.0f; // I dunno, just do this?? - ent->s.pos.trDelta[1] += crandom() * 40.0f; - ent->s.pos.trDelta[2] += random() * 20.0f; + ent->s.pos.trDelta[0] += Q_flrand(-1.0f, 1.0f) * 40.0f; // I dunno, just do this?? + ent->s.pos.trDelta[1] += Q_flrand(-1.0f, 1.0f) * 40.0f; + ent->s.pos.trDelta[2] += Q_flrand(0.0f, 1.0f) * 20.0f; } else if ( (ent->flags&FL_DROPPED_ITEM) && ent->item diff --git a/code/game/g_misc.cpp b/code/game/g_misc.cpp index 639709c37c..345b635b43 100644 --- a/code/game/g_misc.cpp +++ b/code/game/g_misc.cpp @@ -2771,7 +2771,7 @@ void gas_random_jet( gentity_t *self ) G_PlayEffect( "env/mini_gasjet", pt ); - self->nextthink = level.time + random() * 16000 + 12000; // do this rarely + self->nextthink = level.time + Q_flrand(0.0f, 1.0f) * 16000 + 12000; // do this rarely } //------------------------------------------------------------ @@ -2827,7 +2827,7 @@ void SP_misc_gas_tank( gentity_t *ent ) ent->e_DieFunc = dieF_misc_model_breakable_die; ent->e_ThinkFunc = thinkF_gas_random_jet; - ent->nextthink = level.time + random() * 12000 + 6000; // do this rarely + ent->nextthink = level.time + Q_flrand(0.0f, 1.0f) * 12000 + 6000; // do this rarely } /*QUAKED misc_crystal_crate (1 0 0.25) (-34 -34 0) (34 34 44) NON_SOLID diff --git a/code/game/g_misc_model.cpp b/code/game/g_misc_model.cpp index 8a01b39dc6..e73d224bf2 100644 --- a/code/game/g_misc_model.cpp +++ b/code/game/g_misc_model.cpp @@ -384,18 +384,18 @@ void GunRackAddItem( gitem_t *gun, vec3_t org, vec3_t angs, float ffwd, float fr { if ( t == YAW ) { - it_ent->s.angles[t] = AngleNormalize180( it_ent->s.angles[t] + 180 + crandom() * 14 ); + it_ent->s.angles[t] = AngleNormalize180( it_ent->s.angles[t] + 180 + Q_flrand(-1.0f, 1.0f) * 14 ); } else { - it_ent->s.angles[t] = AngleNormalize180( it_ent->s.angles[t] + crandom() * 4 ); + it_ent->s.angles[t] = AngleNormalize180( it_ent->s.angles[t] + Q_flrand(-1.0f, 1.0f) * 4 ); } } else { if ( t == YAW ) { - it_ent->s.angles[t] = AngleNormalize180( it_ent->s.angles[t] + 90 + crandom() * 4 ); + it_ent->s.angles[t] = AngleNormalize180( it_ent->s.angles[t] + 90 + Q_flrand(-1.0f, 1.0f) * 4 ); } } } @@ -463,7 +463,7 @@ void SP_misc_model_gun_rack( gentity_t *ent ) { for ( int i = 0; i < ct; i++ ) { - GunRackAddItem( itemList[i], ent->s.origin, ent->s.angles, crandom() * 2, ( i - 1 ) * 9 + crandom() * 2, ofz[i] ); + GunRackAddItem( itemList[i], ent->s.origin, ent->s.angles, Q_flrand(-1.0f, 1.0f) * 2, ( i - 1 ) * 9 + Q_flrand(-1.0f, 1.0f) * 2, ofz[i] ); } } @@ -638,7 +638,7 @@ void spawn_rack_goods( gentity_t *ent ) { for ( int i = 0; i < ct; i++ ) { - GunRackAddItem( itemList[i], ent->s.origin, ent->s.angles, crandom() * 0.5f, (i-1)* 8, 7.0f ); + GunRackAddItem( itemList[i], ent->s.origin, ent->s.angles, Q_flrand(-1.0f, 1.0f) * 0.5f, (i-1)* 8, 7.0f ); } } @@ -674,9 +674,9 @@ void spawn_rack_goods( gentity_t *ent ) { // since we may have to put up a health pack on the shelf, we should know where we randomly put // the gun so we don't put the pack on the same spot..so pick either the left or right side - pos = ( random() > .5 ) ? -1 : 1; + pos = ( Q_flrand(0.0f, 1.0f) > .5 ) ? -1 : 1; - GunRackAddItem( it, ent->s.origin, ent->s.angles, crandom() * 2, ( random() * 6 + 4 ) * pos, v_off ); + GunRackAddItem( it, ent->s.origin, ent->s.angles, Q_flrand(-1.0f, 1.0f) * 2, ( Q_flrand(0.0f, 1.0f) * 6 + 4 ) * pos, v_off ); } } @@ -686,7 +686,7 @@ void spawn_rack_goods( gentity_t *ent ) if ( !pos ) { // we haven't picked a side already... - pos = ( random() > .5 ) ? -1 : 1; + pos = ( Q_flrand(0.0f, 1.0f) > .5 ) ? -1 : 1; } else { @@ -694,7 +694,7 @@ void spawn_rack_goods( gentity_t *ent ) pos *= -1; } - GunRackAddItem( health, ent->s.origin, ent->s.angles, crandom() * 0.5f, ( random() * 4 + 4 ) * pos, 24 ); + GunRackAddItem( health, ent->s.origin, ent->s.angles, Q_flrand(-1.0f, 1.0f) * 0.5f, ( Q_flrand(0.0f, 1.0f) * 4 + 4 ) * pos, 24 ); } ent->s.modelindex = G_ModelIndex( "models/map_objects/kejim/weaponsrung.md3" ); @@ -753,8 +753,8 @@ void misc_model_cargo_die( gentity_t *self, gentity_t *inflictor, gentity_t *att if ( health ) { - temp[0] = org[0] + crandom() * 8 + 16; - temp[1] = org[1] + crandom() * 8 + 16; + temp[0] = org[0] + Q_flrand(-1.0f, 1.0f) * 8 + 16; + temp[1] = org[1] + Q_flrand(-1.0f, 1.0f) * 8 + 16; LaunchItem( health, temp, vec3_origin, NULL ); } @@ -765,8 +765,8 @@ void misc_model_cargo_die( gentity_t *self, gentity_t *inflictor, gentity_t *att if ( shields ) { - temp[0] = org[0] + crandom() * 8 - 16; - temp[1] = org[1] + crandom() * 8 + 16; + temp[0] = org[0] + Q_flrand(-1.0f, 1.0f) * 8 - 16; + temp[1] = org[1] + Q_flrand(-1.0f, 1.0f) * 8 + 16; LaunchItem( shields, temp, vec3_origin, NULL ); } @@ -778,8 +778,8 @@ void misc_model_cargo_die( gentity_t *self, gentity_t *inflictor, gentity_t *att if ( bacta ) { - temp[0] = org[0] + crandom() * 8 - 16; - temp[1] = org[1] + crandom() * 8 - 16; + temp[0] = org[0] + Q_flrand(-1.0f, 1.0f) * 8 - 16; + temp[1] = org[1] + Q_flrand(-1.0f, 1.0f) * 8 - 16; LaunchItem( bacta, temp, vec3_origin, NULL ); } @@ -791,8 +791,8 @@ void misc_model_cargo_die( gentity_t *self, gentity_t *inflictor, gentity_t *att if ( batteries ) { - temp[0] = org[0] + crandom() * 8 + 16; - temp[1] = org[1] + crandom() * 8 - 16; + temp[0] = org[0] + Q_flrand(-1.0f, 1.0f) * 8 + 16; + temp[1] = org[1] + Q_flrand(-1.0f, 1.0f) * 8 - 16; LaunchItem( batteries, temp, vec3_origin, NULL ); } diff --git a/code/game/g_mover.cpp b/code/game/g_mover.cpp index 905abd2a5e..47919bd955 100644 --- a/code/game/g_mover.cpp +++ b/code/game/g_mover.cpp @@ -2149,7 +2149,7 @@ void SP_func_train (gentity_t *self) { { self->spawnflags &= ~32; // once only - gi.G2API_SetBoneAnim( &self->ghoul2[self->playerModel], "model_root", self->startFrame, self->endFrame, BONE_ANIM_OVERRIDE_LOOP, 1.0f + crandom() * 0.1f, 0, -1, -1 ); + gi.G2API_SetBoneAnim( &self->ghoul2[self->playerModel], "model_root", self->startFrame, self->endFrame, BONE_ANIM_OVERRIDE_LOOP, 1.0f + Q_flrand(-1.0f, 1.0f) * 0.1f, 0, -1, -1 ); self->endFrame = 0; // don't allow it to do anything with the animation function in G_main } } diff --git a/code/game/g_target.cpp b/code/game/g_target.cpp index 3189505829..9d18d77706 100644 --- a/code/game/g_target.cpp +++ b/code/game/g_target.cpp @@ -79,7 +79,7 @@ void Use_Target_Delay( gentity_t *ent, gentity_t *other, gentity_t *activator ) { G_ActivateBehavior(ent,BSET_USE); - ent->nextthink = level.time + ( ent->wait + ent->random * crandom() ) * 1000; + ent->nextthink = level.time + ( ent->wait + ent->random * Q_flrand(-1.0f, 1.0f) ) * 1000; ent->e_ThinkFunc = thinkF_Think_Target_Delay; ent->activator = activator; } diff --git a/code/game/g_trigger.cpp b/code/game/g_trigger.cpp index 7af83e79e5..f1118c96bf 100644 --- a/code/game/g_trigger.cpp +++ b/code/game/g_trigger.cpp @@ -88,7 +88,7 @@ void multi_trigger_run( gentity_t *ent ) if ( ent->painDebounceTime != level.time ) {//first ent to touch it this frame //ent->e_ThinkFunc = thinkF_multi_wait; - ent->nextthink = level.time + ( ent->wait + ent->random * crandom() ) * 1000; + ent->nextthink = level.time + ( ent->wait + ent->random * Q_flrand(-1.0f, 1.0f) ) * 1000; ent->painDebounceTime = level.time; } } @@ -358,7 +358,7 @@ void trigger_cleared_fire (gentity_t *self) // should start the wait timer now, because the trigger's just been cleared, so we must "wait" from this point if ( self->wait > 0 ) { - self->nextthink = level.time + ( self->wait + self->random * crandom() ) * 1000; + self->nextthink = level.time + ( self->wait + self->random * Q_flrand(-1.0f, 1.0f) ) * 1000; } } @@ -1444,7 +1444,7 @@ so, the basic time between firing is a random time between void func_timer_think( gentity_t *self ) { G_UseTargets (self, self->activator); // set time before next firing - self->nextthink = level.time + 1000 * ( self->wait + crandom() * self->random ); + self->nextthink = level.time + 1000 * ( self->wait + Q_flrand(-1.0f, 1.0f) * self->random ); } void func_timer_use( gentity_t *self, gentity_t *other, gentity_t *activator ) { diff --git a/code/game/g_turret.cpp b/code/game/g_turret.cpp index ec6aaa0b7b..d7f90afa61 100644 --- a/code/game/g_turret.cpp +++ b/code/game/g_turret.cpp @@ -55,7 +55,7 @@ void TurretPain( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, con if ( mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT ) { // DEMP2 makes the turret stop shooting for a bit..and does extra feedback - self->attackDebounceTime = level.time + 800 + random() * 500; + self->attackDebounceTime = level.time + 800 + Q_flrand(0.0f, 1.0f) * 500; G_PlayEffect( "sparks/spark_exp_nosnd", point, dir ); } @@ -638,7 +638,7 @@ void turret_base_think( gentity_t *self ) else { // keep our enemy for a minimum of 2 seconds from now - self->bounceCount = level.time + 2000 + random() * 150; + self->bounceCount = level.time + 2000 + Q_flrand(0.0f, 1.0f) * 150; } turret_aim( self ); @@ -954,7 +954,7 @@ void finish_spawning_turret( gentity_t *base ) // How quickly to fire if ( !base->wait ) { - base->wait = 500;// + random() * 500; + base->wait = 500;// + Q_flrand(0.0f, 1.0f) * 500; } if ( !base->splashDamage ) @@ -994,7 +994,7 @@ void finish_spawning_turret( gentity_t *base ) else { // this is a random time offset for the no-enemy-search-around-mode - base->count = random() * 9000; + base->count = Q_flrand(0.0f, 1.0f) * 9000; if ( !base->health ) { @@ -1010,7 +1010,7 @@ void finish_spawning_turret( gentity_t *base ) // How quickly to fire if ( !base->wait ) { - base->wait = 150 + random() * 55; + base->wait = 150 + Q_flrand(0.0f, 1.0f) * 55; } if ( !base->splashDamage ) @@ -1543,7 +1543,7 @@ static qboolean pas_find_enemies( gentity_t *self ) G_Sound( self, G_SoundIndex( "sound/chars/turret/startup.wav" )); // Wind up turrets for a bit - self->attackDebounceTime = level.time + 900 + random() * 200; + self->attackDebounceTime = level.time + 900 + Q_flrand(0.0f, 1.0f) * 200; } G_SetEnemy( self, target ); @@ -1571,7 +1571,7 @@ void pas_adjust_enemy( gentity_t *ent ) { keep = qfalse; } - else// if ( random() > 0.5f ) + else// if ( Q_flrand(0.0f, 1.0f) > 0.5f ) { // do a trace every now and then. mdxaBone_t boltMatrix; @@ -1607,7 +1607,7 @@ void pas_adjust_enemy( gentity_t *ent ) if ( keep ) { - ent->bounceCount = level.time + 500 + random() * 150; + ent->bounceCount = level.time + 500 + Q_flrand(0.0f, 1.0f) * 150; } else if ( ent->bounceCount < level.time ) // don't ping pong on and off { @@ -1740,7 +1740,7 @@ void pas_think( gentity_t *ent ) ent->s.loopSound = 0; } - if ( ent->enemy && ent->attackDebounceTime < level.time && random() > 0.3f ) + if ( ent->enemy && ent->attackDebounceTime < level.time && Q_flrand(0.0f, 1.0f) > 0.3f ) { ent->count--; @@ -1940,7 +1940,7 @@ void ion_cannon_think( gentity_t *self ) else { // done with burst, so wait delay amount, plus a random bit - self->nextthink = level.time + ( self->delay + crandom() * self->random ); + self->nextthink = level.time + ( self->delay + Q_flrand(-1.0f, 1.0f) * self->random ); self->count = Q_irand(0,5); // 0-5 bursts // Not firing this time @@ -1972,7 +1972,7 @@ void ion_cannon_think( gentity_t *self ) } gi.G2API_SetBoneAnimIndex( &self->ghoul2[self->playerModel], self->rootBone, 0, 8, BONE_ANIM_OVERRIDE_FREEZE, 0.6f, cg.time, -1, -1 ); - self->nextthink = level.time + self->wait + crandom() * self->random; + self->nextthink = level.time + self->wait + Q_flrand(-1.0f, 1.0f) * self->random; } //---------------------------------------------------------------------------------------------- @@ -2126,7 +2126,7 @@ void SP_misc_ion_cannon( gentity_t *base ) { // start thinking now, otherwise, we'll wait until we are used base->e_ThinkFunc = thinkF_ion_cannon_think; - base->nextthink = level.time + base->wait + crandom() * base->random; + base->nextthink = level.time + base->wait + Q_flrand(-1.0f, 1.0f) * base->random; } // Bursts? diff --git a/code/game/g_weapon.cpp b/code/game/g_weapon.cpp index 5188736d1e..c1eb56430b 100644 --- a/code/game/g_weapon.cpp +++ b/code/game/g_weapon.cpp @@ -1615,7 +1615,7 @@ void misc_weapon_shooter_fire( gentity_t *self ) self->e_ThinkFunc = thinkF_misc_weapon_shooter_fire; if (self->random) { - self->nextthink = level.time + self->wait + (int)(random()*self->random); + self->nextthink = level.time + self->wait + (int)(Q_flrand(0.0f, 1.0f)*self->random); } else { diff --git a/code/game/wp_blaster_pistol.cpp b/code/game/wp_blaster_pistol.cpp index 9c9db70e15..cede5bbd16 100644 --- a/code/game/wp_blaster_pistol.cpp +++ b/code/game/wp_blaster_pistol.cpp @@ -52,13 +52,13 @@ void WP_FireBryarPistol( gentity_t *ent, qboolean alt_fire ) if ( ent->client->NPC_class == CLASS_IMPWORKER ) {//*sigh*, hack to make impworkers less accurate without affecteing imperial officer accuracy - angs[PITCH] += ( crandom() * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f - angs[YAW] += ( crandom() * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + angs[PITCH] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + angs[YAW] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f } else { - angs[PITCH] += ( crandom() * ((5-ent->NPC->currentAim)*0.25f) ); - angs[YAW] += ( crandom() * ((5-ent->NPC->currentAim)*0.25f) ); + angs[PITCH] += ( Q_flrand(-1.0f, 1.0f) * ((5-ent->NPC->currentAim)*0.25f) ); + angs[YAW] += ( Q_flrand(-1.0f, 1.0f) * ((5-ent->NPC->currentAim)*0.25f) ); } AngleVectors( angs, forwardVec, NULL, NULL ); diff --git a/code/game/wp_blaster_rifle.cpp b/code/game/wp_blaster_rifle.cpp index aa2ad23fbc..87545617c9 100644 --- a/code/game/wp_blaster_rifle.cpp +++ b/code/game/wp_blaster_rifle.cpp @@ -129,8 +129,8 @@ void WP_FireBlaster( gentity_t *ent, qboolean alt_fire ) if ( alt_fire ) { // add some slop to the alt-fire direction - angs[PITCH] += crandom() * BLASTER_ALT_SPREAD; - angs[YAW] += crandom() * BLASTER_ALT_SPREAD; + angs[PITCH] += Q_flrand(-1.0f, 1.0f) * BLASTER_ALT_SPREAD; + angs[YAW] += Q_flrand(-1.0f, 1.0f) * BLASTER_ALT_SPREAD; } else { @@ -140,14 +140,14 @@ void WP_FireBlaster( gentity_t *ent, qboolean alt_fire ) ( ent->client->NPC_class == CLASS_STORMTROOPER || ent->client->NPC_class == CLASS_SWAMPTROOPER ) ) { - angs[PITCH] += ( crandom() * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f - angs[YAW] += ( crandom() * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + angs[PITCH] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + angs[YAW] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f } else { // add some slop to the main-fire direction - angs[PITCH] += crandom() * BLASTER_MAIN_SPREAD; - angs[YAW] += crandom() * BLASTER_MAIN_SPREAD; + angs[PITCH] += Q_flrand(-1.0f, 1.0f) * BLASTER_MAIN_SPREAD; + angs[YAW] += Q_flrand(-1.0f, 1.0f) * BLASTER_MAIN_SPREAD; } } } diff --git a/code/game/wp_bowcaster.cpp b/code/game/wp_bowcaster.cpp index 11d8b3d860..f0b6680244 100644 --- a/code/game/wp_bowcaster.cpp +++ b/code/game/wp_bowcaster.cpp @@ -86,7 +86,7 @@ static void WP_BowcasterMainFire( gentity_t *ent ) for ( int i = 0; i < count; i++ ) { // create a range of different velocities - vel = BOWCASTER_VELOCITY * ( crandom() * BOWCASTER_VEL_RANGE + 1.0f ); + vel = BOWCASTER_VELOCITY * ( Q_flrand(-1.0f, 1.0f) * BOWCASTER_VEL_RANGE + 1.0f ); vectoangles( forwardVec, angs ); @@ -95,12 +95,12 @@ static void WP_BowcasterMainFire( gentity_t *ent ) {//force sight 2+ gives perfect aim //FIXME: maybe force sight level 3 autoaims some? // add some slop to the fire direction - angs[PITCH] += crandom() * BOWCASTER_ALT_SPREAD * 0.2f; + angs[PITCH] += Q_flrand(-1.0f, 1.0f) * BOWCASTER_ALT_SPREAD * 0.2f; angs[YAW] += ((i+0.5f) * BOWCASTER_ALT_SPREAD - count * 0.5f * BOWCASTER_ALT_SPREAD ); if ( ent->NPC ) { - angs[PITCH] += ( crandom() * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f) ); - angs[YAW] += ( crandom() * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f) ); + angs[PITCH] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f) ); + angs[YAW] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f) ); } } diff --git a/code/game/wp_concussion.cpp b/code/game/wp_concussion.cpp index 7c21a1a40d..eb200888d0 100644 --- a/code/game/wp_concussion.cpp +++ b/code/game/wp_concussion.cpp @@ -42,8 +42,8 @@ static void WP_FireConcussionAlt( gentity_t *ent ) { vec3_t angles; vectoangles(forwardVec, angles); - angles[PITCH] += ( crandom() * (CONC_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f - angles[YAW] += ( crandom() * (CONC_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + angles[PITCH] += ( Q_flrand(-1.0f, 1.0f) * (CONC_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + angles[YAW] += ( Q_flrand(-1.0f, 1.0f) * (CONC_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f AngleVectors(angles, forwardVec, vrightVec, up); } @@ -260,8 +260,8 @@ static void WP_FireConcussion( gentity_t *ent ) { vec3_t angles; vectoangles(forwardVec, angles); - angles[PITCH] += ( crandom() * (CONC_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f - angles[YAW] += ( crandom() * (CONC_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + angles[PITCH] += ( Q_flrand(-1.0f, 1.0f) * (CONC_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + angles[YAW] += ( Q_flrand(-1.0f, 1.0f) * (CONC_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f AngleVectors(angles, forwardVec, vrightVec, up); } diff --git a/code/game/wp_det_pack.cpp b/code/game/wp_det_pack.cpp index 17a6246299..8a481db678 100644 --- a/code/game/wp_det_pack.cpp +++ b/code/game/wp_det_pack.cpp @@ -125,7 +125,7 @@ void WP_FireDetPack( gentity_t *ent, qboolean alt_fire ) { VectorCopy( found->currentOrigin, found->s.origin ); found->e_ThinkFunc = thinkF_WP_Explode; - found->nextthink = level.time + 100 + random() * 100; + found->nextthink = level.time + 100 + Q_flrand(0.0f, 1.0f) * 100; G_Sound( found, G_SoundIndex( "sound/weapons/detpack/warning.wav" )); // would be nice if this actually worked? diff --git a/code/game/wp_flechette.cpp b/code/game/wp_flechette.cpp index aa1b1db547..2f240c8f42 100644 --- a/code/game/wp_flechette.cpp +++ b/code/game/wp_flechette.cpp @@ -64,8 +64,8 @@ static void WP_FlechetteMainFire( gentity_t *ent ) } else { - angs[PITCH] += crandom() * FLECHETTE_SPREAD; - angs[YAW] += crandom() * FLECHETTE_SPREAD; + angs[PITCH] += Q_flrand(-1.0f, 1.0f) * FLECHETTE_SPREAD; + angs[YAW] += Q_flrand(-1.0f, 1.0f) * FLECHETTE_SPREAD; } AngleVectors( angs, fwd, NULL, NULL ); @@ -217,7 +217,7 @@ void WP_flechette_alt_blow( gentity_t *ent ) static void WP_CreateFlechetteBouncyThing( vec3_t start, vec3_t fwd, gentity_t *self ) //------------------------------------------------------------------------------ { - gentity_t *missile = CreateMissile( start, fwd, 950 + random() * 700, 1500 + random() * 2000, self, qtrue ); + gentity_t *missile = CreateMissile( start, fwd, 950 + Q_flrand(0.0f, 1.0f) * 700, 1500 + Q_flrand(0.0f, 1.0f) * 2000, self, qtrue ); missile->e_ThinkFunc = thinkF_WP_flechette_alt_blow; @@ -264,8 +264,8 @@ static void WP_FlechetteAltFire( gentity_t *self ) { VectorCopy( angs, dir ); - dir[PITCH] -= random() * 4 + 8; // make it fly upwards - dir[YAW] += crandom() * 2; + dir[PITCH] -= Q_flrand(0.0f, 1.0f) * 4 + 8; // make it fly upwards + dir[YAW] += Q_flrand(-1.0f, 1.0f) * 2; AngleVectors( dir, fwd, NULL, NULL ); WP_CreateFlechetteBouncyThing( start, fwd, self ); diff --git a/code/game/wp_noghri_stick.cpp b/code/game/wp_noghri_stick.cpp index 35107713b0..a96aac6064 100644 --- a/code/game/wp_noghri_stick.cpp +++ b/code/game/wp_noghri_stick.cpp @@ -38,8 +38,8 @@ void WP_FireNoghriStick( gentity_t *ent ) {//force sight 2+ gives perfect aim //FIXME: maybe force sight level 3 autoaims some? // add some slop to the main-fire direction - angs[PITCH] += ( crandom() * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f - angs[YAW] += ( crandom() * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + angs[PITCH] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + angs[YAW] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f } AngleVectors( angs, dir, NULL, NULL ); diff --git a/code/game/wp_repeater.cpp b/code/game/wp_repeater.cpp index da737c1ecf..792732978b 100644 --- a/code/game/wp_repeater.cpp +++ b/code/game/wp_repeater.cpp @@ -171,14 +171,14 @@ void WP_FireRepeater( gentity_t *ent, qboolean alt_fire ) ent->client->NPC_class == CLASS_SWAMPTROOPER || ent->client->NPC_class == CLASS_SHADOWTROOPER ) ) { - angs[PITCH] += ( crandom() * (REPEATER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f) ); - angs[YAW] += ( crandom() * (REPEATER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f) ); + angs[PITCH] += ( Q_flrand(-1.0f, 1.0f) * (REPEATER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f) ); + angs[YAW] += ( Q_flrand(-1.0f, 1.0f) * (REPEATER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f) ); } else { // add some slop to the alt-fire direction - angs[PITCH] += crandom() * REPEATER_SPREAD; - angs[YAW] += crandom() * REPEATER_SPREAD; + angs[PITCH] += Q_flrand(-1.0f, 1.0f) * REPEATER_SPREAD; + angs[YAW] += Q_flrand(-1.0f, 1.0f) * REPEATER_SPREAD; } } diff --git a/code/game/wp_rocket_launcher.cpp b/code/game/wp_rocket_launcher.cpp index c4890a0b87..9d19bf1807 100644 --- a/code/game/wp_rocket_launcher.cpp +++ b/code/game/wp_rocket_launcher.cpp @@ -137,7 +137,7 @@ void rocketThink( gentity_t *ent ) // add crazy drunkenness for ( int i = 0; i < 3; i++ ) { - newdir[i] += crandom() * ent->random * 0.25f; + newdir[i] += Q_flrand(-1.0f, 1.0f) * ent->random * 0.25f; } // decay the randomness @@ -243,7 +243,7 @@ void WP_FireRocket( gentity_t *ent, qboolean alt_fire ) // if we are fully locked, always take on the enemy. // Also give a slight advantage to higher, but not quite full charges. // Finally, just give any amount of charge a very slight random chance of locking. - if ( dif == 8 || random() * dif > 2 || random() > 0.97f ) + if ( dif == 8 || Q_flrand(0.0f, 1.0f) * dif > 2 || Q_flrand(0.0f, 1.0f) > 0.97f ) { missile->enemy = &g_entities[lockEntNum]; diff --git a/code/game/wp_thermal.cpp b/code/game/wp_thermal.cpp index cb2e76c36e..928df9fd7e 100644 --- a/code/game/wp_thermal.cpp +++ b/code/game/wp_thermal.cpp @@ -397,9 +397,9 @@ gentity_t *WP_FireThermalDetonator( gentity_t *ent, qboolean alt_fire ) VectorMA( target, Q_flrand( 0, -32 ), vec, target );//throw a little short } - target[0] += Q_flrand( -5, 5 )+(crandom()*(6-ent->NPC->currentAim)*2); - target[1] += Q_flrand( -5, 5 )+(crandom()*(6-ent->NPC->currentAim)*2); - target[2] += Q_flrand( -5, 5 )+(crandom()*(6-ent->NPC->currentAim)*2); + target[0] += Q_flrand( -5, 5 )+(Q_flrand(-1.0f, 1.0f)*(6-ent->NPC->currentAim)*2); + target[1] += Q_flrand( -5, 5 )+(Q_flrand(-1.0f, 1.0f)*(6-ent->NPC->currentAim)*2); + target[2] += Q_flrand( -5, 5 )+(Q_flrand(-1.0f, 1.0f)*(6-ent->NPC->currentAim)*2); WP_LobFire( ent, start, target, bolt->mins, bolt->maxs, bolt->clipmask, bolt->s.pos.trDelta, qtrue, ent->s.number, ent->enemy->s.number ); } diff --git a/code/game/wp_tusken.cpp b/code/game/wp_tusken.cpp index f4e75674f1..10c5817fdc 100644 --- a/code/game/wp_tusken.cpp +++ b/code/game/wp_tusken.cpp @@ -47,13 +47,13 @@ void WP_FireTuskenRifle( gentity_t *ent ) if ( ent->client->NPC_class == CLASS_IMPWORKER ) {//*sigh*, hack to make impworkers less accurate without affecteing imperial officer accuracy - angs[PITCH] += ( crandom() * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f - angs[YAW] += ( crandom() * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + angs[PITCH] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + angs[YAW] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f } else { - angs[PITCH] += ( crandom() * ((5-ent->NPC->currentAim)*0.25f) ); - angs[YAW] += ( crandom() * ((5-ent->NPC->currentAim)*0.25f) ); + angs[PITCH] += ( Q_flrand(-1.0f, 1.0f) * ((5-ent->NPC->currentAim)*0.25f) ); + angs[YAW] += ( Q_flrand(-1.0f, 1.0f) * ((5-ent->NPC->currentAim)*0.25f) ); } AngleVectors( angs, forwardVec, NULL, NULL ); diff --git a/code/icarus/Sequencer.cpp b/code/icarus/Sequencer.cpp index d5067ba810..91e506f62e 100644 --- a/code/icarus/Sequencer.cpp +++ b/code/icarus/Sequencer.cpp @@ -1257,7 +1257,7 @@ int CSequencer::EvaluateConditional( CBlock *block , CIcarus* icarus) case CIcarus::ID_RANDOM: { float min, max; - //FIXME: This will not account for nested random() statements + //FIXME: This will not account for nested Q_flrand(0.0f, 1.0f) statements min = *(float *) block->GetMemberData( memberNum++ ); max = *(float *) block->GetMemberData( memberNum++ ); @@ -1428,7 +1428,7 @@ int CSequencer::EvaluateConditional( CBlock *block , CIcarus* icarus) { float min, max; - //FIXME: This will not account for nested random() statements + //FIXME: This will not account for nested Q_flrand(0.0f, 1.0f) statements min = *(float *) block->GetMemberData( memberNum++ ); max = *(float *) block->GetMemberData( memberNum++ ); diff --git a/code/icarus/TaskManager.cpp b/code/icarus/TaskManager.cpp index 63579f493c..74f0b0494d 100644 --- a/code/icarus/TaskManager.cpp +++ b/code/icarus/TaskManager.cpp @@ -404,7 +404,7 @@ int CTaskManager::GetFloat( int entID, CBlock *block, int &memberNum, float &val return icarus->GetGame()->GetFloat( entID, name, &value ); } - //Look for a random() inline call + //Look for a Q_flrand(0.0f, 1.0f) inline call if ( Check( CIcarus::ID_RANDOM, block, memberNum ) ) { float min, max; @@ -476,7 +476,7 @@ int CTaskManager::GetVector( int entID, CBlock *block, int &memberNum, vec3_t &v return icarus->GetGame()->GetVector( entID, name, value ); } - //Look for a random() inline call + //Look for a Q_flrand(0.0f, 1.0f) inline call if ( Check( CIcarus::ID_RANDOM, block, memberNum ) ) { float min, max; @@ -619,7 +619,7 @@ int CTaskManager::Get( int entID, CBlock *block, int &memberNum, char **value, C } } - //Look for a random() inline call + //Look for a Q_flrand(0.0f, 1.0f) inline call if ( Check( CIcarus::ID_RANDOM, block, memberNum ) ) { float min, max, ret; diff --git a/code/rd-vanilla/tr_cmds.cpp b/code/rd-vanilla/tr_cmds.cpp index acb4f1a562..7d17c20d4d 100644 --- a/code/rd-vanilla/tr_cmds.cpp +++ b/code/rd-vanilla/tr_cmds.cpp @@ -303,7 +303,7 @@ void RE_LAGoggles( void ) fog_t *fog = &tr.world->fogs[tr.world->numfogs]; fog->parms.color[0] = 0.75f; - fog->parms.color[1] = 0.42f + random() * 0.025f; + fog->parms.color[1] = 0.42f + Q_flrand(0.0f, 1.0f) * 0.025f; fog->parms.color[2] = 0.07f; fog->parms.depthForOpaque = 10000; fog->colorInt = ColorBytes4(fog->parms.color[0], fog->parms.color[1], fog->parms.color[2], 1.0f); diff --git a/code/rd-vanilla/tr_surface.cpp b/code/rd-vanilla/tr_surface.cpp index 3b1b34d9cb..de693ea5d3 100644 --- a/code/rd-vanilla/tr_surface.cpp +++ b/code/rd-vanilla/tr_surface.cpp @@ -664,14 +664,14 @@ static int f_count; static void CreateShape() //---------------------------------------------------------------------------- { - VectorSet( sh1, 0.66f,// + crandom() * 0.1f, // fwd - 0.08f + crandom() * 0.02f, - 0.08f + crandom() * 0.02f ); + VectorSet( sh1, 0.66f,// + Q_flrand(-1.0f, 1.0f) * 0.1f, // fwd + 0.08f + Q_flrand(-1.0f, 1.0f) * 0.02f, + 0.08f + Q_flrand(-1.0f, 1.0f) * 0.02f ); // it seems to look best to have a point on one side of the ideal line, then the other point on the other side. - VectorSet( sh2, 0.33f,// + crandom() * 0.1f, // fwd - -sh1[1] + crandom() * 0.02f, // forcing point to be on the opposite side of the line -- right - -sh1[2] + crandom() * 0.02f );// up + VectorSet( sh2, 0.33f,// + Q_flrand(-1.0f, 1.0f) * 0.1f, // fwd + -sh1[1] + Q_flrand(-1.0f, 1.0f) * 0.02f, // forcing point to be on the opposite side of the line -- right + -sh1[2] + Q_flrand(-1.0f, 1.0f) * 0.02f );// up } //---------------------------------------------------------------------------- @@ -1161,14 +1161,14 @@ static void RB_SurfaceSaberGlow() { VectorMA( e->origin, i, e->axis[0], end ); - DoSprite( end, e->radius, 0.0f );//random() * 360.0f ); + DoSprite( end, e->radius, 0.0f );//Q_flrand(0.0f, 1.0f) * 360.0f ); e->radius += 0.017f; } // Big hilt sprite // Please don't kill me Pat...I liked the hilt glow blob, but wanted a subtle pulse.:) Feel free to ditch it if you don't like it. --Jeff // Please don't kill me Jeff... The pulse is good, but now I want the halo bigger if the saber is shorter... --Pat - DoSprite( e->origin, 5.5f + random() * 0.25f, 0.0f );//random() * 360.0f ); + DoSprite( e->origin, 5.5f + Q_flrand(0.0f, 1.0f) * 0.25f, 0.0f );//Q_flrand(0.0f, 1.0f) * 360.0f ); } /* diff --git a/code/ui/ui_saber.cpp b/code/ui/ui_saber.cpp index 858cf9b8fa..9da09ca3cb 100644 --- a/code/ui/ui_saber.cpp +++ b/code/ui/ui_saber.cpp @@ -392,7 +392,7 @@ void UI_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float /* 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] ); + cgi_R_AddLightToScene( mid, (length*2.0f) + (Q_flrand(0.0f, 1.0f)*8.0f), rgb[0], rgb[1], rgb[2] ); } */ @@ -416,8 +416,8 @@ void UI_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float float radiusRange = radius * 0.075f; float radiusStart = radius-radiusRange; - saber.radius = (radiusStart + crandom() * radiusRange)*radiusmult; - //saber.radius = (2.8f + crandom() * 0.2f)*radiusmult; + saber.radius = (radiusStart + Q_flrand(-1.0f, 1.0f) * radiusRange)*radiusmult; + //saber.radius = (2.8f + Q_flrand(-1.0f, 1.0f) * 0.2f)*radiusmult; VectorCopy( origin, saber.origin ); @@ -435,8 +435,8 @@ void UI_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float 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; + saber.radius = (radiusStart + Q_flrand(-1.0f, 1.0f) * radiusRange)*radiusmult; +// saber.radius = (1.0 + Q_flrand(-1.0f, 1.0f) * 0.2f)*radiusmult; DC->addRefEntityToScene( &saber ); } diff --git a/codeJK2/cgame/FxPrimitives.cpp b/codeJK2/cgame/FxPrimitives.cpp index b838717bed..a53dde92b7 100644 --- a/codeJK2/cgame/FxPrimitives.cpp +++ b/codeJK2/cgame/FxPrimitives.cpp @@ -102,7 +102,7 @@ void CParticle::Die() vec3_t norm; // Man, this just seems so, like, uncool and stuff... - VectorSet( norm, crandom(), crandom(), crandom()); + VectorSet( norm, Q_flrand(-1.0f, 1.0f), Q_flrand(-1.0f, 1.0f), Q_flrand(-1.0f, 1.0f)); VectorNormalize( norm ); theFxScheduler.PlayEffect( mDeathFxID, mOrigin1, norm ); @@ -395,7 +395,7 @@ void CParticle::UpdateSize() if (( mFlags & FX_SIZE_RAND )) { // Random simply modulates the existing value - perc1 = random() * perc1; + perc1 = Q_flrand(0.0f, 1.0f) * perc1; } mRefEnt.radius = (mSizeStart * perc1) + (mSizeEnd * (1.0f - perc1)); @@ -472,7 +472,7 @@ void CParticle::UpdateRGB() if (( mFlags & FX_RGB_RAND )) { // Random simply modulates the existing value - perc1 = random() * perc1; + perc1 = Q_flrand(0.0f, 1.0f) * perc1; } // Now get the correct color @@ -563,7 +563,7 @@ void CParticle::UpdateAlpha() if ( (mFlags & FX_ALPHA_RAND) ) { // Random simply modulates the existing value - perc1 = random() * perc1; + perc1 = Q_flrand(0.0f, 1.0f) * perc1; } if ( mFlags & FX_USE_ALPHA ) @@ -745,7 +745,7 @@ bool CLine::Update() //---------------------------- void CElectricity::Initialize() { - mRefEnt.frame = random() * 1265536; + mRefEnt.frame = Q_flrand(0.0f, 1.0f) * 1265536; mRefEnt.endTime = cg.time + (mTimeEnd - mTimeStart); if ( mFlags & FX_DEPTH_HACK ) @@ -987,7 +987,7 @@ void CTail::UpdateLength() if ( mFlags & FX_LENGTH_RAND ) { // Random simply modulates the existing value - perc1 = random() * perc1; + perc1 = Q_flrand(0.0f, 1.0f) * perc1; } mLength = (mLengthStart * perc1) + (mLengthEnd * (1.0f - perc1)); @@ -1099,7 +1099,7 @@ void CCylinder::UpdateSize2() if ( mFlags & FX_SIZE2_RAND ) { // Random simply modulates the existing value - perc1 = random() * perc1; + perc1 = Q_flrand(0.0f, 1.0f) * perc1; } mRefEnt.backlerp = (mSize2Start * perc1) + (mSize2End * (1.0f - perc1)); @@ -1165,7 +1165,7 @@ void CEmitter::Draw() #define TRAIL_RATE 8 // we "think" at about a 60hz rate // Pick a target step distance and square it - step = mDensity + crandom() * mVariance; + step = mDensity + Q_flrand(-1.0f, 1.0f) * mVariance; step *= step; dif = 0; @@ -1227,7 +1227,7 @@ void CEmitter::Draw() if ( DistanceSquared( org, mOldOrigin ) >= step ) { // Pick a new target step distance and square it - step = mDensity + crandom() * mVariance; + step = mDensity + Q_flrand(-1.0f, 1.0f) * mVariance; step *= step; // We met the step criteria so, we should add in the effect @@ -1382,7 +1382,7 @@ void CLight::UpdateSize() if ( mFlags & FX_SIZE_RAND ) { // Random simply modulates the existing value - perc1 = random() * perc1; + perc1 = Q_flrand(0.0f, 1.0f) * perc1; } mRefEnt.radius = (mSizeStart * perc1) + (mSizeEnd * (1.0f - perc1)); @@ -1459,7 +1459,7 @@ void CLight::UpdateRGB() if ( mFlags & FX_RGB_RAND ) { // Random simply modulates the existing value - perc1 = random() * perc1; + perc1 = Q_flrand(0.0f, 1.0f) * perc1; } // Now get the correct color diff --git a/codeJK2/cgame/FxScheduler.cpp b/codeJK2/cgame/FxScheduler.cpp index dbc6bfb86d..676d967a00 100644 --- a/codeJK2/cgame/FxScheduler.cpp +++ b/codeJK2/cgame/FxScheduler.cpp @@ -694,7 +694,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, int clientID, int delay // handle RGB color if ( fx->mSpawnFlags & FX_RGB_COMPONENT_INTERP ) { - float perc = random(); + float perc = Q_flrand(0.0f, 1.0f); VectorSet( sRGB, fx->mRedStart.GetVal( perc ), fx->mGreenStart.GetVal( perc ), fx->mBlueStart.GetVal( perc ) ); VectorSet( eRGB, fx->mRedEnd.GetVal( perc ), fx->mGreenEnd.GetVal( perc ), fx->mBlueEnd.GetVal( perc ) ); @@ -1190,7 +1190,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, const vec3_t origin, ve if( fx->mSpawnFlags & FX_RAND_ROT_AROUND_FWD ) { - RotatePointAroundVector( ax[1], ax[0], axis[1], random()*360.0f ); + RotatePointAroundVector( ax[1], ax[0], axis[1], Q_flrand(0.0f, 1.0f)*360.0f ); CrossProduct( ax[0], ax[1], ax[2] ); } @@ -1217,8 +1217,8 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, const vec3_t origin, ve float x, y; float width, height; - x = DEG2RAD( random() * 360.0f ); - y = DEG2RAD( random() * 180.0f ); + x = DEG2RAD( Q_flrand(0.0f, 1.0f) * 360.0f ); + y = DEG2RAD( Q_flrand(0.0f, 1.0f) * 180.0f ); width = fx->mRadius.GetVal(); height = fx->mHeight.GetVal(); @@ -1240,8 +1240,8 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, const vec3_t origin, ve // set up our point, then rotate around the current direction to. Make unrotated cylinder centered around 0,0,0 VectorScale( ax[1], fx->mRadius.GetVal(), pt ); - VectorMA( pt, crandom() * 0.5f * fx->mHeight.GetVal(), ax[0], pt ); - RotatePointAroundVector( temp, ax[0], pt, random() * 360.0f ); + VectorMA( pt, Q_flrand(-1.0f, 1.0f) * 0.5f * fx->mHeight.GetVal(), ax[0], pt ); + RotatePointAroundVector( temp, ax[0], pt, Q_flrand(0.0f, 1.0f) * 360.0f ); VectorAdd( org, temp, org ); @@ -1381,7 +1381,7 @@ void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, const vec3_t origin, ve { if ( fx->mSpawnFlags & FX_RGB_COMPONENT_INTERP ) { - float perc = random(); + float perc = Q_flrand(0.0f, 1.0f); VectorSet( sRGB, fx->mRedStart.GetVal( perc ), fx->mGreenStart.GetVal( perc ), fx->mBlueStart.GetVal( perc ) ); VectorSet( eRGB, fx->mRedEnd.GetVal( perc ), fx->mGreenEnd.GetVal( perc ), fx->mBlueEnd.GetVal( perc ) ); diff --git a/codeJK2/cgame/cg_camera.cpp b/codeJK2/cgame/cg_camera.cpp index 2c87cc4079..459fe4a722 100644 --- a/codeJK2/cgame/cg_camera.cpp +++ b/codeJK2/cgame/cg_camera.cpp @@ -1264,7 +1264,7 @@ void CGCam_UpdateShake( vec3_t origin, vec3_t angles ) for ( i = 0; i < 3; i++ ) { - moveDir[i] = ( crandom() * intensity ); + moveDir[i] = ( Q_flrand(-1.0f, 1.0f) * intensity ); } //FIXME: Lerp @@ -1273,7 +1273,7 @@ void CGCam_UpdateShake( vec3_t origin, vec3_t angles ) VectorAdd( origin, moveDir, origin ); for ( i=0; i < 2; i++ ) // Don't do ROLL - moveDir[i] = ( crandom() * intensity ); + moveDir[i] = ( Q_flrand(-1.0f, 1.0f) * intensity ); //FIXME: Lerp diff --git a/codeJK2/cgame/cg_draw.cpp b/codeJK2/cgame/cg_draw.cpp index 1e46df6a05..35b02669eb 100644 --- a/codeJK2/cgame/cg_draw.cpp +++ b/codeJK2/cgame/cg_draw.cpp @@ -992,9 +992,9 @@ static void CG_DrawZoomMask( void ) if ( power ) { // Flickery color - color1[0] = 0.7f + crandom() * 0.1f; - color1[1] = 0.8f + crandom() * 0.1f; - color1[2] = 0.7f + crandom() * 0.1f; + color1[0] = 0.7f + Q_flrand(-1.0f, 1.0f) * 0.1f; + color1[1] = 0.8f + Q_flrand(-1.0f, 1.0f) * 0.1f; + color1[2] = 0.7f + Q_flrand(-1.0f, 1.0f) * 0.1f; color1[3] = 1.0f; cgi_R_SetColor( color1 ); @@ -1020,7 +1020,7 @@ static void CG_DrawZoomMask( void ) CG_DrawPic( 307, 40, 26, 30, cgs.media.binocularTri ); } - if ( random() > 0.98f && ( cg.time & 1024 )) + if ( Q_flrand(0.0f, 1.0f) > 0.98f && ( cg.time & 1024 )) { flip = (qboolean)!flip; } @@ -1159,9 +1159,9 @@ static void CG_DrawZoomMask( void ) float pos2 = 220 + cos( cg.time * 0.0004f + light * 0.05f ) * 40 + sin( cg.time * 0.0013f + 1 ) * 20 + sin( cg.time * 0.0021f ) * 5; // Flickery color - color1[0] = 0.7f + crandom() * 0.2f; - color1[1] = 0.8f + crandom() * 0.2f; - color1[2] = 0.7f + crandom() * 0.2f; + color1[0] = 0.7f + Q_flrand(-1.0f, 1.0f) * 0.2f; + color1[1] = 0.8f + Q_flrand(-1.0f, 1.0f) * 0.2f; + color1[2] = 0.7f + Q_flrand(-1.0f, 1.0f) * 0.2f; color1[3] = 1.0f; cgi_R_SetColor( color1 ); diff --git a/codeJK2/cgame/cg_effects.cpp b/codeJK2/cgame/cg_effects.cpp index cce8bf1364..ddf80862b8 100644 --- a/codeJK2/cgame/cg_effects.cpp +++ b/codeJK2/cgame/cg_effects.cpp @@ -200,11 +200,11 @@ void CG_SurfaceExplosion( vec3_t origin, vec3_t normal, float radius, float shak int i, numSparks; //Sparks - numSparks = 16 + (random() * 16.0f); + numSparks = 16 + (Q_flrand(0.0f, 1.0f) * 16.0f); for ( i = 0; i < numSparks; i++ ) { - scale = 0.25f + (random() * 2.0f); + scale = 0.25f + (Q_flrand(0.0f, 1.0f) * 2.0f); dscale = -scale*0.5; particle = FX_AddTrail( origin, @@ -233,17 +233,17 @@ void CG_SurfaceExplosion( vec3_t origin, vec3_t normal, float radius, float shak for ( i = 0; i < 4; i++ ) { - VectorSet( temp_org, new_org[0] + (crandom() * 16.0f), new_org[1] + (crandom() * 16.0f), new_org[2] + (random() * 4.0f) ); - VectorSet( temp_vel, velocity[0] + (crandom() * 8.0f), velocity[1] + (crandom() * 8.0f), velocity[2] + (crandom() * 8.0f) ); + VectorSet( temp_org, new_org[0] + (Q_flrand(-1.0f, 1.0f) * 16.0f), new_org[1] + (Q_flrand(-1.0f, 1.0f) * 16.0f), new_org[2] + (Q_flrand(0.0f, 1.0f) * 4.0f) ); + VectorSet( temp_vel, velocity[0] + (Q_flrand(-1.0f, 1.0f) * 8.0f), velocity[1] + (Q_flrand(-1.0f, 1.0f) * 8.0f), velocity[2] + (Q_flrand(-1.0f, 1.0f) * 8.0f) ); FX_AddSprite( temp_org, temp_vel, NULL, - 64.0f + (random() * 32.0f), + 64.0f + (Q_flrand(0.0f, 1.0f) * 32.0f), 16.0f, 1.0f, 0.0f, - 20.0f + (crandom() * 90.0f), + 20.0f + (Q_flrand(-1.0f, 1.0f) * 90.0f), 0.5f, 1500.0f, cgs.media.smokeShader, FXF_USE_ALPHA_CHAN ); @@ -256,14 +256,14 @@ void CG_SurfaceExplosion( vec3_t origin, vec3_t normal, float radius, float shak VectorNormalize( direction ); //Tag the last one with a light - le = CG_MakeExplosion( origin, direction, cgs.media.explosionModel, 6, cgs.media.surfaceExplosionShader, 500, qfalse, radius * 0.02f + (random() * 0.3f) ); + le = CG_MakeExplosion( origin, direction, cgs.media.explosionModel, 6, cgs.media.surfaceExplosionShader, 500, qfalse, radius * 0.02f + (Q_flrand(0.0f, 1.0f) * 0.3f) ); le->light = 150; VectorSet( le->lightColor, 0.9f, 0.8f, 0.5f ); for ( i = 0; i < NUM_EXPLOSIONS-1; i ++) { - VectorSet( new_org, (origin[0] + (16 + (crandom() * 8))*crandom()), (origin[1] + (16 + (crandom() * 8))*crandom()), (origin[2] + (16 + (crandom() * 8))*crandom()) ); - le = CG_MakeExplosion( new_org, direction, cgs.media.explosionModel, 6, cgs.media.surfaceExplosionShader, 300 + (rand() & 99), qfalse, radius * 0.05f + (crandom() *0.3f) ); + VectorSet( new_org, (origin[0] + (16 + (Q_flrand(-1.0f, 1.0f) * 8))*Q_flrand(-1.0f, 1.0f)), (origin[1] + (16 + (Q_flrand(-1.0f, 1.0f) * 8))*Q_flrand(-1.0f, 1.0f)), (origin[2] + (16 + (Q_flrand(-1.0f, 1.0f) * 8))*Q_flrand(-1.0f, 1.0f)) ); + le = CG_MakeExplosion( new_org, direction, cgs.media.explosionModel, 6, cgs.media.surfaceExplosionShader, 300 + (rand() & 99), qfalse, radius * 0.05f + (Q_flrand(-1.0f, 1.0f) *0.3f) ); } //Shake the camera @@ -275,11 +275,11 @@ void CG_SurfaceExplosion( vec3_t origin, vec3_t normal, float radius, float shak if ( smoke ) { VectorMA( origin, -8, normal, temp_org ); -// FX_AddSpawner( temp_org, normal, NULL, NULL, 100, random()*25.0f, 5000.0f, (void *) CG_SmokeSpawn ); +// FX_AddSpawner( temp_org, normal, NULL, NULL, 100, Q_flrand(0.0f, 1.0f)*25.0f, 5000.0f, (void *) CG_SmokeSpawn ); //Impact mark //FIXME: Replace mark - //CG_ImpactMark( cgs.media.burnMarkShader, origin, normal, random()*360, 1,1,1,1, qfalse, 8, qfalse ); + //CG_ImpactMark( cgs.media.burnMarkShader, origin, normal, Q_flrand(0.0f, 1.0f)*360, 1,1,1,1, qfalse, 8, qfalse ); } } */ @@ -372,7 +372,7 @@ void CG_MiscModelExplosion( vec3_t mins, vec3_t maxs, int size, material_t chunk { for( int j = 0; j < 3; j++ ) { - r = random() * 0.8f + 0.1f; + r = Q_flrand(0.0f, 1.0f) * 0.8f + 0.1f; org[j] = ( r * mins[j] + ( 1 - r ) * maxs[j] ); } @@ -535,12 +535,12 @@ void CG_Chunks( int owner, vec3_t origin, const vec3_t normal, const vec3_t mins re->hModel = chunkModel; le->leType = LE_FRAGMENT; - le->endTime = cg.time + 1300 + random() * 900; + le->endTime = cg.time + 1300 + Q_flrand(0.0f, 1.0f) * 900; // spawn chunk roughly in the bbox of the thing...bias towards center in case thing blowing up doesn't complete fill its bbox. for( j = 0; j < 3; j++ ) { - r = random() * 0.8f + 0.1f; + r = Q_flrand(0.0f, 1.0f) * 0.8f + 0.1f; re->origin[j] = ( r * mins[j] + ( 1 - r ) * maxs[j] ); } VectorCopy( re->origin, le->pos.trBase ); @@ -551,18 +551,18 @@ void CG_Chunks( int owner, vec3_t origin, const vec3_t normal, const vec3_t mins VectorScale( dir, Q_flrand( speed * 0.5f, speed * 1.25f ) * speedMod, le->pos.trDelta ); // Angular Velocity - VectorSet( le->angles.trBase, random() * 360, random() * 360, random() * 360 ); + VectorSet( le->angles.trBase, Q_flrand(0.0f, 1.0f) * 360, Q_flrand(0.0f, 1.0f) * 360, Q_flrand(0.0f, 1.0f) * 360 ); - le->angles.trDelta[0] = crandom(); - le->angles.trDelta[1] = crandom(); + le->angles.trDelta[0] = Q_flrand(-1.0f, 1.0f); + le->angles.trDelta[1] = Q_flrand(-1.0f, 1.0f); le->angles.trDelta[2] = 0; // don't do roll - VectorScale( le->angles.trDelta, random() * 600.0f + 200.0f, le->angles.trDelta ); + VectorScale( le->angles.trDelta, Q_flrand(0.0f, 1.0f) * 600.0f + 200.0f, le->angles.trDelta ); le->pos.trType = TR_GRAVITY; le->angles.trType = TR_LINEAR; le->pos.trTime = le->angles.trTime = cg.time; - le->bounceFactor = 0.2f + random() * 0.2f; + le->bounceFactor = 0.2f + Q_flrand(0.0f, 1.0f) * 0.2f; le->leFlags |= LEF_TUMBLE; le->ownerGentNum = owner; le->leBounceSoundType = bounce; @@ -639,7 +639,7 @@ static void CG_DoGlassQuad( vec3_t p[4], vec2_t uv[4], bool stick, int time, vec vec3_t vel, accel; vec3_t rgb1; - VectorSet( vel, crandom() * 12, crandom() * 12, -1 ); + VectorSet( vel, Q_flrand(-1.0f, 1.0f) * 12, Q_flrand(-1.0f, 1.0f) * 12, -1 ); if ( !stick ) { @@ -648,26 +648,26 @@ static void CG_DoGlassQuad( vec3_t p[4], vec2_t uv[4], bool stick, int time, vec } // Set up acceleration due to gravity, 800 is standard QuakeIII gravity, so let's use something close - VectorSet( accel, 0.0f, 0.0f, -(600.0f + random() * 100.0f ) ); + VectorSet( accel, 0.0f, 0.0f, -(600.0f + Q_flrand(0.0f, 1.0f) * 100.0f ) ); VectorSet( rgb1, 1.0f, 1.0f, 1.0f ); // Being glass, we don't want to bounce much - bounce = random() * 0.2f + 0.15f; + bounce = Q_flrand(0.0f, 1.0f) * 0.2f + 0.15f; // Set up our random rotate, we only do PITCH and YAW, not ROLL. This is something like degrees per second - VectorSet( rotDelta, crandom() * 40.0f, crandom() * 40.0f, 0.0f ); + VectorSet( rotDelta, Q_flrand(-1.0f, 1.0f) * 40.0f, Q_flrand(-1.0f, 1.0f) * 40.0f, 0.0f ); CPoly *pol = FX_AddPoly(p, uv, 4, // verts, ST, vertCount vel, accel, // motion 0.15f, 0.0f, 85.0f, // alpha start, alpha end, alpha parm ( begin alpha fade when 85% of life is complete ) rgb1, rgb1, 0.0f, // rgb start, rgb end, rgb parm ( not used ) rotDelta, bounce, time, // rotation amount, bounce, and time to delay motion for ( zero if no delay ); - 3500 + random() * 1000, // life + 3500 + Q_flrand(0.0f, 1.0f) * 1000, // life cgi_R_RegisterShader( "gfx/misc/test_crackle" ), FX_APPLY_PHYSICS | FX_ALPHA_NONLINEAR | FX_USE_ALPHA ); - if ( random() > 0.95f && pol ) + if ( Q_flrand(0.0f, 1.0f) > 0.95f && pol ) { pol->AddFlags( FX_IMPACT_RUNS_FX | FX_KILL_ON_IMPACT ); pol->SetImpactFxID( theFxScheduler.RegisterEffect( "glass_impact" )); @@ -747,8 +747,8 @@ void CG_InitGlass( void ) { for ( t = 0; t < 20; t++ ) { - offX[t][i] = crandom() * 0.03f; - offZ[i][t] = crandom() * 0.03f; + offX[t][i] = Q_flrand(-1.0f, 1.0f) * 0.03f; + offZ[i][t] = Q_flrand(-1.0f, 1.0f) * 0.03f; } } } @@ -906,7 +906,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl CG_CalcBiLerp( verts, subVerts, biPoints ); - float dif = DistanceSquared( subVerts[0], dmgPt ) * timeDecay - random() * 32; + float dif = DistanceSquared( subVerts[0], dmgPt ) * timeDecay - Q_flrand(0.0f, 1.0f) * 32; // If we decrease dif, we are increasing the impact area, making it more likely to blow out large holes dif -= dmgRadius * dmgRadius; @@ -914,7 +914,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl if ( dif > 1 ) { stick = true; - time = dif + random() * 200; + time = dif + Q_flrand(0.0f, 1.0f) * 200; } else { diff --git a/codeJK2/cgame/cg_ents.cpp b/codeJK2/cgame/cg_ents.cpp index 279ab0a047..7fcb0c6f0d 100644 --- a/codeJK2/cgame/cg_ents.cpp +++ b/codeJK2/cgame/cg_ents.cpp @@ -810,7 +810,7 @@ Ghoul2 Insert End // Only display when we have damage if ( t >= 0.0f && t <= 1.0f ) { - t *= random(); + t *= Q_flrand(0.0f, 1.0f); ent.shaderRGBA[0] = ent.shaderRGBA[1] = ent.shaderRGBA[2] = 255.0f * t; ent.shaderRGBA[3] = 255; @@ -845,7 +845,7 @@ static void CG_Speaker( centity_t *cent ) { // ent->s.frame = ent->wait * 10; // ent->s.clientNum = ent->random * 10; - cent->miscTime = (int)(cg.time + cent->currentState.frame * 100 + cent->currentState.clientNum * 100 * crandom()); + cent->miscTime = (int)(cg.time + cent->currentState.frame * 100 + cent->currentState.clientNum * 100 * Q_flrand(-1.0f, 1.0f)); } /* diff --git a/codeJK2/cgame/cg_players.cpp b/codeJK2/cgame/cg_players.cpp index ae1bbb4c7a..48ae0c4d2b 100644 --- a/codeJK2/cgame/cg_players.cpp +++ b/codeJK2/cgame/cg_players.cpp @@ -2994,8 +2994,8 @@ void _PlayerSplash( const vec3_t origin, const vec3_t velocity, const float radi VectorCopy( trace.endpos, end ); - end[0] += crandom() * 3.0f; - end[1] += crandom() * 3.0f; + end[0] += Q_flrand(-1.0f, 1.0f) * 3.0f; + end[1] += Q_flrand(-1.0f, 1.0f) * 3.0f; end[2] += 1.0f; //fudge up int t = VectorLengthSquared( velocity ); @@ -3008,10 +3008,10 @@ void _PlayerSplash( const vec3_t origin, const vec3_t velocity, const float radi float alpha = ( t / 8192.0f ) * 0.6f + 0.2f; FX_AddOrientedParticle( end, trace.plane.normal, NULL, NULL, - 6.0f, radius + random() * 48.0f, 0, + 6.0f, radius + Q_flrand(0.0f, 1.0f) * 48.0f, 0, alpha, 0.0f, 0.0f, WHITE, WHITE, 0.0f, - random() * 360, crandom() * 6.0f, NULL, NULL, 0.0f, 0 ,0, 1200, + Q_flrand(0.0f, 1.0f) * 360, Q_flrand(-1.0f, 1.0f) * 6.0f, NULL, NULL, 0.0f, 0 ,0, 1200, cgs.media.wakeMarkShader, FX_ALPHA_LINEAR | FX_SIZE_LINEAR ); } @@ -3065,7 +3065,7 @@ void CG_PlayerSplash( centity_t *cent ) _PlayerSplash( cent->lerpOrigin, cl->ps.velocity, 36, cl->renderInfo.eyePoint[2] - cent->lerpOrigin[2] + 5 ); } - cent->gent->disconnectDebounceTime = cg.time + 125 + random() * 50.0f; + cent->gent->disconnectDebounceTime = cg.time + 125 + Q_flrand(0.0f, 1.0f) * 50.0f; } } } @@ -3121,7 +3121,7 @@ void CG_LightningBolt( centity_t *cent, vec3_t origin ) if ( cent->gent->fx_time < cg.time && !(trace.surfaceFlags & SURF_NOIMPACT )) { spark = qtrue; - cent->gent->fx_time = cg.time + random() * 100 + 100; + cent->gent->fx_time = cg.time + Q_flrand(0.0f, 1.0f) * 100 + 100; } // Don't draw certain kinds of impacts when it hits a player and such..or when we hit a surface with a NOIMPACT flag @@ -3331,7 +3331,7 @@ static void CG_ForceElectrocution( centity_t *cent, const vec3_t origin, vec3_t if ( found ) { gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); - if ( random() > 0.5f ) + if ( Q_flrand(0.0f, 1.0f) > 0.5f ) { gi.G2API_GiveMeVectorFromMatrix( boltMatrix, NEGATIVE_X, dir ); } @@ -3341,15 +3341,15 @@ static void CG_ForceElectrocution( centity_t *cent, const vec3_t origin, vec3_t } // Add some fudge, makes us not normalized, but that isn't really important - dir[0] += crandom() * 0.4f; - dir[1] += crandom() * 0.4f; - dir[2] += crandom() * 0.4f; + dir[0] += Q_flrand(-1.0f, 1.0f) * 0.4f; + dir[1] += Q_flrand(-1.0f, 1.0f) * 0.4f; + dir[2] += Q_flrand(-1.0f, 1.0f) * 0.4f; } else { // Just use the lerp Origin and a random direction VectorCopy( cent->lerpOrigin, fxOrg ); - VectorSet( dir, crandom(), crandom(), crandom() ); // Not normalized, but who cares. + VectorSet( dir, Q_flrand(-1.0f, 1.0f), Q_flrand(-1.0f, 1.0f), Q_flrand(-1.0f, 1.0f) ); // Not normalized, but who cares. if ( cent->gent && cent->gent->client ) { switch ( cent->gent->client->NPC_class ) @@ -3369,19 +3369,19 @@ static void CG_ForceElectrocution( centity_t *cent, const vec3_t origin, vec3_t } } - VectorMA( fxOrg, random() * 40 + 40, dir, fxOrg2 ); + VectorMA( fxOrg, Q_flrand(0.0f, 1.0f) * 40 + 40, dir, fxOrg2 ); trace_t tr; CG_Trace( &tr, fxOrg, NULL, NULL, fxOrg2, -1, CONTENTS_SOLID ); - if ( tr.fraction < 1.0f || random() > 0.94f ) + if ( tr.fraction < 1.0f || Q_flrand(0.0f, 1.0f) > 0.94f ) { FX_AddElectricity( fxOrg, tr.endpos, 1.5f, 4.0f, 0.0f, 1.0f, 0.5f, 0.0f, rgb, rgb, 0.0f, - 5.5f, random() * 50 + 100, cgs.media.boltShader, FX_ALPHA_LINEAR | FX_SIZE_LINEAR | FX_BRANCH | FX_GROW | FX_TAPER ); + 5.5f, Q_flrand(0.0f, 1.0f) * 50 + 100, cgs.media.boltShader, FX_ALPHA_LINEAR | FX_SIZE_LINEAR | FX_BRANCH | FX_GROW | FX_TAPER ); } } /* @@ -3452,7 +3452,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen ent->customShader = 0; cgi_R_AddRefEntityToScene( ent ); - if ( cg.time - ent->endTime < 1000 && (cg_timescale.value * cg_timescale.value * random()) > 0.05f ) + if ( cg.time - ent->endTime < 1000 && (cg_timescale.value * cg_timescale.value * Q_flrand(0.0f, 1.0f)) > 0.05f ) { vec3_t fxOrg; mdxaBone_t boltMatrix; @@ -3463,10 +3463,10 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, fxOrg ); VectorMA( fxOrg, -18, cg.refdef.viewaxis[0], fxOrg ); - fxOrg[2] += crandom() * 20; + fxOrg[2] += Q_flrand(-1.0f, 1.0f) * 20; theFxScheduler.PlayEffect( "disruptor/death_smoke", fxOrg ); - if ( random() > 0.5f ) + if ( Q_flrand(0.0f, 1.0f) > 0.5f ) { theFxScheduler.PlayEffect( "disruptor/death_smoke", fxOrg ); } @@ -3515,7 +3515,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen { int dif = gent->client->ps.powerups[PW_SHOCKED] - cg.time; - if ( dif > 0 && random() > 0.4f ) + if ( dif > 0 && Q_flrand(0.0f, 1.0f) > 0.4f ) { // fade out over the last 500 ms int brightness = 255; @@ -3540,7 +3540,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen cgi_R_AddRefEntityToScene( ent ); - if ( random() > 0.9f ) + if ( Q_flrand(0.0f, 1.0f) > 0.9f ) cgi_S_StartSound ( ent->origin, gent->s.number, CHAN_AUTO, cgi_S_RegisterSound( "sound/effects/energy_crackle.wav" ) ); } } @@ -3680,7 +3680,7 @@ static void CG_G2SetHeadBlink( centity_t *cent, qboolean bStart ) if (bStart) { desiredAngles[YAW] = -50; - if ( !in_camera && random() > 0.95f ) + if ( !in_camera && Q_flrand(0.0f, 1.0f) > 0.95f ) { bWink = qtrue; blendTime /=3; @@ -4238,7 +4238,7 @@ void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, saber } // always add a light because sabers cast a nice glow before they slice you in half!! or something... - cgi_R_AddLightToScene( mid, (length*2.0f) + (random()*8.0f), rgb[0], rgb[1], rgb[2] ); + cgi_R_AddLightToScene( mid, (length*2.0f) + (Q_flrand(0.0f, 1.0f)*8.0f), rgb[0], rgb[1], rgb[2] ); memset( &saber, 0, sizeof( refEntity_t )); @@ -4258,7 +4258,7 @@ void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, saber } - saber.radius = (2.8 + crandom() * 0.2f)*radiusmult; + saber.radius = (2.8 + Q_flrand(-1.0f, 1.0f) * 0.2f)*radiusmult; VectorCopy( origin, saber.origin ); @@ -4275,7 +4275,7 @@ void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, saber VectorMA( origin, -1, dir, saber.oldorigin ); saber.customShader = blade; saber.reType = RT_LINE; - saber.radius = (1.0 + crandom() * 0.2f)*radiusmult; + saber.radius = (1.0 + Q_flrand(-1.0f, 1.0f) * 0.2f)*radiusmult; cgi_R_AddRefEntityToScene( &saber ); } @@ -4341,8 +4341,8 @@ void CG_CreateSaberMarks( vec3_t start, vec3_t end, vec3_t normal ) VectorScale( mid, 0.5f, mid ); VectorSubtract( v->xyz, mid, delta ); - v->st[0] = 0.5 + DotProduct( delta, axis[1] ) * (0.05f + random() * 0.03f); - v->st[1] = 0.5 + DotProduct( delta, axis[2] ) * (0.15f + random() * 0.05f); + v->st[0] = 0.5 + DotProduct( delta, axis[1] ) * (0.05f + Q_flrand(0.0f, 1.0f) * 0.03f); + v->st[1] = 0.5 + DotProduct( delta, axis[2] ) * (0.15f + Q_flrand(0.0f, 1.0f) * 0.05f); } // save it persistantly, do burn first @@ -4361,9 +4361,9 @@ void CG_CreateSaberMarks( vec3_t start, vec3_t end, vec3_t normal ) mark->alphaFade = qfalse; mark->markShader = cgi_R_RegisterShader("gfx/effects/saberDamageGlow" ); mark->poly.numVerts = mf->numPoints; - mark->color[0] = 215 + random() * 40.0f; - mark->color[1] = 96 + random() * 32.0f; - mark->color[2] = mark->color[3] = random()*15.0f; + mark->color[0] = 215 + Q_flrand(0.0f, 1.0f) * 40.0f; + mark->color[1] = 96 + Q_flrand(0.0f, 1.0f) * 32.0f; + mark->color[2] = mark->color[3] = Q_flrand(0.0f, 1.0f)*15.0f; memcpy( mark->verts, verts, mf->numPoints * sizeof( verts[0] ) ); } } @@ -5994,9 +5994,9 @@ Ghoul2 Insert End CGCam_Shake( val * val * 0.3f, 100 ); } - val += random() * 0.5f; + val += Q_flrand(0.0f, 1.0f) * 0.5f; - FX_AddSprite( cent->gent->client->renderInfo.muzzlePoint, NULL, NULL, 3.0f * val * scale, 0.0f, 0.7f, 0.7f, WHITE, WHITE, random() * 360, 0.0f, 1.0f, shader, FX_USE_ALPHA ); + FX_AddSprite( cent->gent->client->renderInfo.muzzlePoint, NULL, NULL, 3.0f * val * scale, 0.0f, 0.7f, 0.7f, WHITE, WHITE, Q_flrand(0.0f, 1.0f) * 360, 0.0f, 1.0f, shader, FX_USE_ALPHA ); } } } diff --git a/codeJK2/cgame/cg_weapons.cpp b/codeJK2/cgame/cg_weapons.cpp index a03fe0268d..4b5366b5be 100644 --- a/codeJK2/cgame/cg_weapons.cpp +++ b/codeJK2/cgame/cg_weapons.cpp @@ -1108,7 +1108,7 @@ void CG_AddViewWeapon( playerState_t *ps ) cent->gent->client->ps.saberLength = cent->gent->client->ps.saberLengthMax; } } -// FX_Saber( org_, axis_[0], cent->gent->client->ps.saberLength, 2.0 + crandom() * 0.2f, cent->gent->client->ps.saberColor ); +// FX_Saber( org_, axis_[0], cent->gent->client->ps.saberLength, 2.0 + Q_flrand(-1.0f, 1.0f) * 0.2f, cent->gent->client->ps.saberColor ); VectorCopy( axis_[0], cent->gent->client->renderInfo.muzzleDir ); } //--------- @@ -1216,9 +1216,9 @@ void CG_AddViewWeapon( playerState_t *ps ) CGCam_Shake( val * val * 0.3f, 100 ); } - val += random() * 0.5f; + val += Q_flrand(0.0f, 1.0f) * 0.5f; - FX_AddSprite( flash.origin, NULL, NULL, 3.0f * val * scale, 0.0f, 0.7f, 0.7f, WHITE, WHITE, random() * 360, 0.0f, 1.0f, shader, FX_USE_ALPHA | FX_DEPTH_HACK ); + FX_AddSprite( flash.origin, NULL, NULL, 3.0f * val * scale, 0.0f, 0.7f, 0.7f, WHITE, WHITE, Q_flrand(0.0f, 1.0f) * 360, 0.0f, 1.0f, shader, FX_USE_ALPHA | FX_DEPTH_HACK ); } // Check if the heavy repeater is finishing up a sustained burst @@ -2092,7 +2092,7 @@ extern qboolean Q3_TaskIDPending( gentity_t *ent, taskID_t taskType ); {//not waiting on a scripted sound to finish if( !jumping ) { - if( random() > 0.5 ) + if( Q_flrand(0.0f, 1.0f) > 0.5 ) { G_SoundOnEnt( player, CHAN_VOICE, va( "sound/chars/kyle/09kyk015.wav" )); } diff --git a/codeJK2/game/AI_Default.cpp b/codeJK2/game/AI_Default.cpp index 6bf38b3fc5..55ddda93c3 100644 --- a/codeJK2/game/AI_Default.cpp +++ b/codeJK2/game/AI_Default.cpp @@ -120,8 +120,8 @@ qboolean NPC_StandTrackAndShoot (gentity_t *NPC, qboolean canDuck) { if ( NPC->health < 20 ) { - // if( NPC->svFlags&SVF_HEALING || random() ) - if( random() ) + // if( NPC->svFlags&SVF_HEALING || Q_flrand(0.0f, 1.0f) ) + if( Q_flrand(0.0f, 1.0f) ) { duck_ok = qtrue; } @@ -209,7 +209,7 @@ void NPC_BSStandGuard (void) //FIXME: Use Snapshot info if ( NPC->enemy == NULL ) {//Possible to pick one up by being shot - if( random() < 0.5 ) + if( Q_flrand(0.0f, 1.0f) < 0.5 ) { if(NPC->client->enemyTeam) { diff --git a/codeJK2/game/AI_Droid.cpp b/codeJK2/game/AI_Droid.cpp index 367e25206e..f911137d4b 100644 --- a/codeJK2/game/AI_Droid.cpp +++ b/codeJK2/game/AI_Droid.cpp @@ -296,7 +296,7 @@ void NPC_Droid_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, ve pain_chance = NPC_GetPainChance( self, damage ); // Put it in pain - if ( mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT || random() < pain_chance ) // Spin around in pain? Demp2 always does this + if ( mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT || Q_flrand(0.0f, 1.0f) < pain_chance ) // Spin around in pain? Demp2 always does this { // Health is between 0-30 or was hit by a DEMP2 so pop his head if ( self->health < 30 || mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT ) @@ -362,7 +362,7 @@ void NPC_Droid_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, ve pain_chance = NPC_GetPainChance( self, damage ); - if ( mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT || random() < pain_chance ) // Spin around in pain? Demp2 always does this + if ( mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT || Q_flrand(0.0f, 1.0f) < pain_chance ) // Spin around in pain? Demp2 always does this { anim = self->client->ps.legsAnim; @@ -559,7 +559,7 @@ void NPC_BSDroid_Default( void ) else if ( NPCInfo->localState == LSTATE_DROP ) { NPC_UpdateAngles( qtrue, qtrue ); - ucmd.upmove = crandom() * 64; + ucmd.upmove = Q_flrand(-1.0f, 1.0f) * 64; } else if ( NPCInfo->scriptFlags & SCF_LOOK_FOR_ENEMIES ) { diff --git a/codeJK2/game/AI_GalakMech.cpp b/codeJK2/game/AI_GalakMech.cpp index 3234e9e655..8d8738e6a9 100644 --- a/codeJK2/game/AI_GalakMech.cpp +++ b/codeJK2/game/AI_GalakMech.cpp @@ -1024,9 +1024,9 @@ void NPC_BSGM_Attack( void ) VectorCopy( NPC->enemy->currentOrigin, target ); - target[0] += Q_flrand( -5, 5 )+(crandom()*(6-NPCInfo->currentAim)*2); - target[1] += Q_flrand( -5, 5 )+(crandom()*(6-NPCInfo->currentAim)*2); - target[2] += Q_flrand( -5, 5 )+(crandom()*(6-NPCInfo->currentAim)*2); + target[0] += Q_flrand( -5, 5 )+(Q_flrand(-1.0f, 1.0f)*(6-NPCInfo->currentAim)*2); + target[1] += Q_flrand( -5, 5 )+(Q_flrand(-1.0f, 1.0f)*(6-NPCInfo->currentAim)*2); + target[2] += Q_flrand( -5, 5 )+(Q_flrand(-1.0f, 1.0f)*(6-NPCInfo->currentAim)*2); //Find the desired angles qboolean clearshot = WP_LobFire( NPC, muzzle, target, mins, maxs, MASK_SHOT|CONTENTS_LIGHTSABER, diff --git a/codeJK2/game/AI_Howler.cpp b/codeJK2/game/AI_Howler.cpp index c7af899104..3930b0d8b4 100644 --- a/codeJK2/game/AI_Howler.cpp +++ b/codeJK2/game/AI_Howler.cpp @@ -72,7 +72,7 @@ void Howler_Patrol( void ) { if ( TIMER_Done( NPC, "patrolTime" )) { - TIMER_Set( NPC, "patrolTime", crandom() * 5000 + 5000 ); + TIMER_Set( NPC, "patrolTime", Q_flrand(-1.0f, 1.0f) * 5000 + 5000 ); } } @@ -136,7 +136,7 @@ void Howler_Attack( void ) if ( !TIMER_Exists( NPC, "attacking" )) { // Going to do ATTACK1 - TIMER_Set( NPC, "attacking", 1700 + random() * 200 ); + TIMER_Set( NPC, "attacking", 1700 + Q_flrand(0.0f, 1.0f) * 200 ); NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_ATTACK1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD ); TIMER_Set( NPC, "attack_dmg", 200 ); // level two damage diff --git a/codeJK2/game/AI_ImperialProbe.cpp b/codeJK2/game/AI_ImperialProbe.cpp index 2a28cf7b92..a7fb3aeb2d 100644 --- a/codeJK2/game/AI_ImperialProbe.cpp +++ b/codeJK2/game/AI_ImperialProbe.cpp @@ -224,7 +224,7 @@ void ImperialProbe_Strafe( void ) // Set the strafe start time so we can do a controlled roll NPC->fx_time = level.time; - NPCInfo->standTime = level.time + 3000 + random() * 500; + NPCInfo->standTime = level.time + 3000 + Q_flrand(0.0f, 1.0f) * 500; } } @@ -496,7 +496,7 @@ void NPC_Probe_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, ve { pain_chance = NPC_GetPainChance( self, damage ); - if ( random() < pain_chance ) // Spin around in pain? + if ( Q_flrand(0.0f, 1.0f) < pain_chance ) // Spin around in pain? { NPC_SetAnim( self, SETANIM_BOTH, BOTH_PAIN1, SETANIM_FLAG_OVERRIDE); } diff --git a/codeJK2/game/AI_Interrogator.cpp b/codeJK2/game/AI_Interrogator.cpp index 2e1d635cdb..c81111f08a 100644 --- a/codeJK2/game/AI_Interrogator.cpp +++ b/codeJK2/game/AI_Interrogator.cpp @@ -291,7 +291,7 @@ void Interrogator_Strafe( void ) // Set the strafe start time NPC->fx_time = level.time; - NPCInfo->standTime = level.time + 3000 + random() * 500; + NPCInfo->standTime = level.time + 3000 + Q_flrand(0.0f, 1.0f) * 500; } } diff --git a/codeJK2/game/AI_MineMonster.cpp b/codeJK2/game/AI_MineMonster.cpp index 11eb0add3a..eac149a7cb 100644 --- a/codeJK2/game/AI_MineMonster.cpp +++ b/codeJK2/game/AI_MineMonster.cpp @@ -84,7 +84,7 @@ void MineMonster_Patrol( void ) { if ( TIMER_Done( NPC, "patrolTime" )) { - TIMER_Set( NPC, "patrolTime", crandom() * 5000 + 5000 ); + TIMER_Set( NPC, "patrolTime", Q_flrand(-1.0f, 1.0f) * 5000 + 5000 ); } } @@ -153,18 +153,18 @@ void MineMonster_Attack( void ) if ( !TIMER_Exists( NPC, "attacking" )) { // usually try and play a jump attack if the player somehow got above them....or just really rarely - if ( NPC->enemy && ((NPC->enemy->currentOrigin[2] - NPC->currentOrigin[2] > 10 && random() > 0.1f ) - || random() > 0.8f )) + if ( NPC->enemy && ((NPC->enemy->currentOrigin[2] - NPC->currentOrigin[2] > 10 && Q_flrand(0.0f, 1.0f) > 0.1f ) + || Q_flrand(0.0f, 1.0f) > 0.8f )) { // Going to do ATTACK4 - TIMER_Set( NPC, "attacking", 1750 + random() * 200 ); + TIMER_Set( NPC, "attacking", 1750 + Q_flrand(0.0f, 1.0f) * 200 ); NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_ATTACK4, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD ); TIMER_Set( NPC, "attack2_dmg", 950 ); // level two damage } - else if ( random() > 0.5f ) + else if ( Q_flrand(0.0f, 1.0f) > 0.5f ) { - if ( random() > 0.8f ) + if ( Q_flrand(0.0f, 1.0f) > 0.8f ) { // Going to do ATTACK3, (rare) TIMER_Set( NPC, "attacking", 850 ); diff --git a/codeJK2/game/AI_Remote.cpp b/codeJK2/game/AI_Remote.cpp index 12d1d49c6f..520ffdb65e 100644 --- a/codeJK2/game/AI_Remote.cpp +++ b/codeJK2/game/AI_Remote.cpp @@ -187,7 +187,7 @@ void Remote_Strafe( void ) // Set the strafe start time so we can do a controlled roll NPC->fx_time = level.time; - NPCInfo->standTime = level.time + 3000 + random() * 500; + NPCInfo->standTime = level.time + 3000 + Q_flrand(0.0f, 1.0f) * 500; } } diff --git a/codeJK2/game/AI_Seeker.cpp b/codeJK2/game/AI_Seeker.cpp index 4ad5dcfb90..e347a64234 100644 --- a/codeJK2/game/AI_Seeker.cpp +++ b/codeJK2/game/AI_Seeker.cpp @@ -162,7 +162,7 @@ void Seeker_Strafe( void ) vec3_t end, right, dir; trace_t tr; - if ( random() > 0.7f || !NPC->enemy || !NPC->enemy->client ) + if ( Q_flrand(0.0f, 1.0f) > 0.7f || !NPC->enemy || !NPC->enemy->client ) { // Do a regular style strafe AngleVectors( NPC->client->renderInfo.eyeAngles, NULL, right, NULL ); @@ -184,7 +184,7 @@ void Seeker_Strafe( void ) // Add a slight upward push NPC->client->ps.velocity[2] += SEEKER_UPWARD_PUSH; - NPCInfo->standTime = level.time + 1000 + random() * 500; + NPCInfo->standTime = level.time + 1000 + Q_flrand(0.0f, 1.0f) * 500; } } else @@ -197,7 +197,7 @@ void Seeker_Strafe( void ) VectorMA( NPC->enemy->currentOrigin, SEEKER_STRAFE_DIS * side, right, end ); // then add a very small bit of random in front of/behind the player action - VectorMA( end, crandom() * 25, dir, end ); + VectorMA( end, Q_flrand(-1.0f, 1.0f) * 25, dir, end ); gi.trace( &tr, NPC->currentOrigin, NULL, NULL, end, NPC->s.number, MASK_SOLID, G2_NOCOLLIDE, 0 ); @@ -216,7 +216,7 @@ void Seeker_Strafe( void ) // Add a slight upward push NPC->client->ps.velocity[2] += SEEKER_UPWARD_PUSH; - NPCInfo->standTime = level.time + 2500 + random() * 500; + NPCInfo->standTime = level.time + 2500 + Q_flrand(0.0f, 1.0f) * 500; } } } @@ -391,7 +391,7 @@ void Seeker_FindEnemy( void ) if ( best ) { // used to offset seekers around a circle so they don't occupy the same spot. This is not a fool-proof method. - NPC->random = random() * 6.3f; // roughly 2pi + NPC->random = Q_flrand(0.0f, 1.0f) * 6.3f; // roughly 2pi NPC->enemy = best; } @@ -419,7 +419,7 @@ void Seeker_FollowPlayer( void ) { if ( TIMER_Done( NPC, "seekerhiss" )) { - TIMER_Set( NPC, "seekerhiss", 1000 + random() * 1000 ); + TIMER_Set( NPC, "seekerhiss", 1000 + Q_flrand(0.0f, 1.0f) * 1000 ); G_Sound( NPC, G_SoundIndex( "sound/chars/seeker/misc/hiss" )); } @@ -452,7 +452,7 @@ void NPC_BSSeeker_Default( void ) if ( NPC->random == 0.0f ) { // used to offset seekers around a circle so they don't occupy the same spot. This is not a fool-proof method. - NPC->random = random() * 6.3f; // roughly 2pi + NPC->random = Q_flrand(0.0f, 1.0f) * 6.3f; // roughly 2pi } if ( NPC->enemy && NPC->enemy->health && NPC->enemy->inuse ) diff --git a/codeJK2/game/AI_Sentry.cpp b/codeJK2/game/AI_Sentry.cpp index 993d9adfaf..6d56d5163f 100644 --- a/codeJK2/game/AI_Sentry.cpp +++ b/codeJK2/game/AI_Sentry.cpp @@ -377,7 +377,7 @@ void Sentry_Strafe( void ) // Set the strafe start time so we can do a controlled roll NPC->fx_time = level.time; - NPCInfo->standTime = level.time + 3000 + random() * 500; + NPCInfo->standTime = level.time + 3000 + Q_flrand(0.0f, 1.0f) * 500; } } diff --git a/codeJK2/game/AI_Stormtrooper.cpp b/codeJK2/game/AI_Stormtrooper.cpp index 047c7112da..8d4a2d83dd 100644 --- a/codeJK2/game/AI_Stormtrooper.cpp +++ b/codeJK2/game/AI_Stormtrooper.cpp @@ -152,7 +152,7 @@ enum static void ST_Speech( gentity_t *self, int speechType, float failChance ) { - if ( random() < failChance ) + if ( Q_flrand(0.0f, 1.0f) < failChance ) { return; } diff --git a/codeJK2/game/NPC_behavior.cpp b/codeJK2/game/NPC_behavior.cpp index ae03d642cb..93dd4c08ac 100644 --- a/codeJK2/game/NPC_behavior.cpp +++ b/codeJK2/game/NPC_behavior.cpp @@ -156,13 +156,13 @@ void NPC_BSAdvanceFight (void) VectorMA ( muzzle, distanceToEnemy, forward, hitspot); VectorSubtract(hitspot, enemy_org, diff); aim_off = VectorLength(diff); - if(aim_off > random() * max_aim_off)//FIXME: use aim value to allow poor aim? + if(aim_off > Q_flrand(0.0f, 1.0f) * max_aim_off)//FIXME: use aim value to allow poor aim? { attack_scale *= 0.75; //see if where we're going to shoot is too far from his head VectorSubtract(hitspot, enemy_head, diff); aim_off = VectorLength(diff); - if(aim_off > random() * max_aim_off) + if(aim_off > Q_flrand(0.0f, 1.0f) * max_aim_off) { attack_ok = qfalse; } diff --git a/codeJK2/game/NPC_combat.cpp b/codeJK2/game/NPC_combat.cpp index ab0b32614f..dbf7d67ec8 100644 --- a/codeJK2/game/NPC_combat.cpp +++ b/codeJK2/game/NPC_combat.cpp @@ -1099,7 +1099,7 @@ qboolean CanShoot ( gentity_t *ent, gentity_t *shooter ) //Actually, we should just check to fire in dir we're facing and if it's close enough, //and we didn't hit someone on our own team, shoot VectorSubtract(spot, tr.endpos, diff); - if(VectorLength(diff) < random() * 32) + if(VectorLength(diff) < Q_flrand(0.0f, 1.0f) * 32) { return qtrue; } @@ -2110,7 +2110,7 @@ qboolean NPC_CheckDefend (float scale) if(!scale) scale = 1.0; - if((float)(NPCInfo->stats.evasion) > random() * 4 * scale) + if((float)(NPCInfo->stats.evasion) > Q_flrand(0.0f, 1.0f) * 4 * scale) return qtrue; return qfalse; @@ -2285,13 +2285,13 @@ qboolean NPC_CheckCanAttack (float attack_scale, qboolean stationary) VectorMA ( muzzle, distanceToEnemy, forward, hitspot); VectorSubtract(hitspot, enemy_org, diff); aim_off = VectorLength(diff); - if(aim_off > random() * max_aim_off)//FIXME: use aim value to allow poor aim? + if(aim_off > Q_flrand(0.0f, 1.0f) * max_aim_off)//FIXME: use aim value to allow poor aim? { attack_scale *= 0.75; //see if where we're going to shoot is too far from his head VectorSubtract(hitspot, enemy_org, diff); aim_off = VectorLength(diff); - if(aim_off > random() * max_aim_off) + if(aim_off > Q_flrand(0.0f, 1.0f) * max_aim_off) { attack_ok = qfalse; } diff --git a/codeJK2/game/NPC_reactions.cpp b/codeJK2/game/NPC_reactions.cpp index e61cc279a9..209f3e607d 100644 --- a/codeJK2/game/NPC_reactions.cpp +++ b/codeJK2/game/NPC_reactions.cpp @@ -146,7 +146,7 @@ static void NPC_CheckAttacker( gentity_t *other, int mod ) } //Randomly pick up the target - if ( random() > luckThreshold ) + if ( Q_flrand(0.0f, 1.0f) > luckThreshold ) { G_ClearEnemy( other ); other->enemy = NPC; @@ -281,7 +281,7 @@ void NPC_ChoosePainAnimation( gentity_t *self, gentity_t *other, vec3_t point, i } //See if we're going to flinch - if ( random() < pain_chance ) + if ( Q_flrand(0.0f, 1.0f) < pain_chance ) { //Pick and play our animation if ( !(self->client->ps.eFlags&EF_FORCE_GRIPPED) ) diff --git a/codeJK2/game/NPC_utils.cpp b/codeJK2/game/NPC_utils.cpp index b885de820c..da44b88c8b 100644 --- a/codeJK2/game/NPC_utils.cpp +++ b/codeJK2/game/NPC_utils.cpp @@ -393,7 +393,7 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) //Snap to if(fabs(error) > 10) { - if(random() > 0.6) + if(Q_flrand(0.0f, 1.0f) > 0.6) { doSound = qtrue; } @@ -467,7 +467,7 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) //Snap to if(fabs(error) > 10) { - if(random() > 0.6) + if(Q_flrand(0.0f, 1.0f) > 0.6) { doSound = qtrue; } diff --git a/codeJK2/game/g_breakable.cpp b/codeJK2/game/g_breakable.cpp index 86e4dc0afa..3414928966 100644 --- a/codeJK2/game/g_breakable.cpp +++ b/codeJK2/game/g_breakable.cpp @@ -113,7 +113,7 @@ void funcBBrushDieGo (gentity_t *self) VectorSubtract( self->absmax, self->absmin, org );// size - numChunks = random() * 6 + 18; + numChunks = Q_flrand(0.0f, 1.0f) * 6 + 18; // This formula really has no logical basis other than the fact that it seemed to be the closest to yielding the results that I wanted. // Volume is length * width * height...then break that volume down based on how many chunks we have @@ -465,7 +465,7 @@ void misc_model_breakable_die( gentity_t *self, gentity_t *inflictor, gentity_t AngleVectors( self->s.apos.trBase, dir, NULL, NULL ); VectorNormalize( dir ); - numChunks = random() * 6 + 20; + numChunks = Q_flrand(0.0f, 1.0f) * 6 + 20; VectorSubtract( self->absmax, self->absmin, dis ); diff --git a/codeJK2/game/g_fx.cpp b/codeJK2/game/g_fx.cpp index 791a1e3504..8dafdec821 100644 --- a/codeJK2/game/g_fx.cpp +++ b/codeJK2/game/g_fx.cpp @@ -68,7 +68,7 @@ void fx_runner_think( gentity_t *ent ) AngleVectors( ent->currentAngles, ent->pos3, NULL, NULL ); MakeNormalVectors( ent->pos3, ent->pos4, temp ); // there IS a reason this is done...it's so that it doesn't break every effect in the game... - ent->nextthink = level.time + ent->delay + random() * ent->random; + ent->nextthink = level.time + ent->delay + Q_flrand(0.0f, 1.0f) * ent->random; if ( ent->spawnflags & 4 ) // damage { diff --git a/codeJK2/game/g_items.cpp b/codeJK2/game/g_items.cpp index e0a94804fa..07877b3cab 100644 --- a/codeJK2/game/g_items.cpp +++ b/codeJK2/game/g_items.cpp @@ -707,7 +707,7 @@ gentity_t *LaunchItem( gitem_t *item, vec3_t origin, vec3_t velocity, char *targ && item->giTag != WP_TRIP_MINE && item->giTag != WP_DET_PACK ) { - VectorSet( dropped->s.angles, 0, crandom() * 180, 90.0f ); + VectorSet( dropped->s.angles, 0, Q_flrand(-1.0f, 1.0f) * 180, 90.0f ); G_SetAngles( dropped, dropped->s.angles ); } } @@ -744,7 +744,7 @@ gentity_t *Drop_Item( gentity_t *ent, gitem_t *item, float angle, qboolean copyt AngleVectors( angles, velocity, NULL, NULL ); VectorScale( velocity, 150, velocity ); - velocity[2] += 200 + crandom() * 50; + velocity[2] += 200 + Q_flrand(-1.0f, 1.0f) * 50; if ( copytarget ) { @@ -1115,9 +1115,9 @@ void G_RunItem( gentity_t *ent ) { { ent->s.pos.trType = TR_GRAVITY; ent->s.pos.trTime = level.time; - ent->s.pos.trDelta[0] += crandom() * 40.0f; // I dunno, just do this?? - ent->s.pos.trDelta[1] += crandom() * 40.0f; - ent->s.pos.trDelta[2] += random() * 20.0f; + ent->s.pos.trDelta[0] += Q_flrand(-1.0f, 1.0f) * 40.0f; // I dunno, just do this?? + ent->s.pos.trDelta[1] += Q_flrand(-1.0f, 1.0f) * 40.0f; + ent->s.pos.trDelta[2] += Q_flrand(0.0f, 1.0f) * 20.0f; } return; } diff --git a/codeJK2/game/g_misc.cpp b/codeJK2/game/g_misc.cpp index 92a9bb779d..30af0d76eb 100644 --- a/codeJK2/game/g_misc.cpp +++ b/codeJK2/game/g_misc.cpp @@ -748,10 +748,10 @@ void Use_Shooter( gentity_t *ent, gentity_t *other, gentity_t *activator ) PerpendicularVector( up, dir ); CrossProduct( up, dir, right ); - deg = crandom() * ent->random; + deg = Q_flrand(-1.0f, 1.0f) * ent->random; VectorMA( dir, deg, up, dir ); - deg = crandom() * ent->random; + deg = Q_flrand(-1.0f, 1.0f) * ent->random; VectorMA( dir, deg, right, dir ); VectorNormalize( dir ); @@ -2424,7 +2424,7 @@ void gas_random_jet( gentity_t *self ) G_PlayEffect( "env/mini_gasjet", pt ); - self->nextthink = level.time + random() * 16000 + 12000; // do this rarely + self->nextthink = level.time + Q_flrand(0.0f, 1.0f) * 16000 + 12000; // do this rarely } //------------------------------------------------------------ @@ -2480,7 +2480,7 @@ void SP_misc_gas_tank( gentity_t *ent ) ent->e_DieFunc = dieF_misc_model_breakable_die; ent->e_ThinkFunc = thinkF_gas_random_jet; - ent->nextthink = level.time + random() * 12000 + 6000; // do this rarely + ent->nextthink = level.time + Q_flrand(0.0f, 1.0f) * 12000 + 6000; // do this rarely } /*QUAKED misc_crystal_crate (1 0 0.25) (-34 -34 0) (34 34 44) NON_SOLID diff --git a/codeJK2/game/g_misc_model.cpp b/codeJK2/game/g_misc_model.cpp index 3587e13903..657ed82378 100644 --- a/codeJK2/game/g_misc_model.cpp +++ b/codeJK2/game/g_misc_model.cpp @@ -386,18 +386,18 @@ void GunRackAddItem( gitem_t *gun, vec3_t org, vec3_t angs, float ffwd, float fr { if ( t == YAW ) { - it_ent->s.angles[t] = AngleNormalize180( it_ent->s.angles[t] + 180 + crandom() * 14 ); + it_ent->s.angles[t] = AngleNormalize180( it_ent->s.angles[t] + 180 + Q_flrand(-1.0f, 1.0f) * 14 ); } else { - it_ent->s.angles[t] = AngleNormalize180( it_ent->s.angles[t] + crandom() * 4 ); + it_ent->s.angles[t] = AngleNormalize180( it_ent->s.angles[t] + Q_flrand(-1.0f, 1.0f) * 4 ); } } else { if ( t == YAW ) { - it_ent->s.angles[t] = AngleNormalize180( it_ent->s.angles[t] + 90 + crandom() * 4 ); + it_ent->s.angles[t] = AngleNormalize180( it_ent->s.angles[t] + 90 + Q_flrand(-1.0f, 1.0f) * 4 ); } } } @@ -465,7 +465,7 @@ void SP_misc_model_gun_rack( gentity_t *ent ) { for ( int i = 0; i < ct; i++ ) { - GunRackAddItem( itemList[i], ent->s.origin, ent->s.angles, crandom() * 2, ( i - 1 ) * 9 + crandom() * 2, ofz[i] ); + GunRackAddItem( itemList[i], ent->s.origin, ent->s.angles, Q_flrand(-1.0f, 1.0f) * 2, ( i - 1 ) * 9 + Q_flrand(-1.0f, 1.0f) * 2, ofz[i] ); } } @@ -640,7 +640,7 @@ void spawn_rack_goods( gentity_t *ent ) { for ( int i = 0; i < ct; i++ ) { - GunRackAddItem( itemList[i], ent->s.origin, ent->s.angles, crandom() * 0.5f, (i-1)* 8, 7.0f ); + GunRackAddItem( itemList[i], ent->s.origin, ent->s.angles, Q_flrand(-1.0f, 1.0f) * 0.5f, (i-1)* 8, 7.0f ); } } @@ -676,9 +676,9 @@ void spawn_rack_goods( gentity_t *ent ) { // since we may have to put up a health pack on the shelf, we should know where we randomly put // the gun so we don't put the pack on the same spot..so pick either the left or right side - pos = ( random() > .5 ) ? -1 : 1; + pos = ( Q_flrand(0.0f, 1.0f) > .5 ) ? -1 : 1; - GunRackAddItem( it, ent->s.origin, ent->s.angles, crandom() * 2, ( random() * 6 + 4 ) * pos, v_off ); + GunRackAddItem( it, ent->s.origin, ent->s.angles, Q_flrand(-1.0f, 1.0f) * 2, ( Q_flrand(0.0f, 1.0f) * 6 + 4 ) * pos, v_off ); } } @@ -688,7 +688,7 @@ void spawn_rack_goods( gentity_t *ent ) if ( !pos ) { // we haven't picked a side already... - pos = ( random() > .5 ) ? -1 : 1; + pos = ( Q_flrand(0.0f, 1.0f) > .5 ) ? -1 : 1; } else { @@ -696,7 +696,7 @@ void spawn_rack_goods( gentity_t *ent ) pos *= -1; } - GunRackAddItem( health, ent->s.origin, ent->s.angles, crandom() * 0.5f, ( random() * 4 + 4 ) * pos, 24 ); + GunRackAddItem( health, ent->s.origin, ent->s.angles, Q_flrand(-1.0f, 1.0f) * 0.5f, ( Q_flrand(0.0f, 1.0f) * 4 + 4 ) * pos, 24 ); } ent->s.modelindex = G_ModelIndex( "models/map_objects/kejim/weaponsrung.md3" ); @@ -755,8 +755,8 @@ void misc_model_cargo_die( gentity_t *self, gentity_t *inflictor, gentity_t *att if ( health ) { - temp[0] = org[0] + crandom() * 8 + 16; - temp[1] = org[1] + crandom() * 8 + 16; + temp[0] = org[0] + Q_flrand(-1.0f, 1.0f) * 8 + 16; + temp[1] = org[1] + Q_flrand(-1.0f, 1.0f) * 8 + 16; LaunchItem( health, temp, (float *)vec3_origin, NULL ); } @@ -767,8 +767,8 @@ void misc_model_cargo_die( gentity_t *self, gentity_t *inflictor, gentity_t *att if ( shields ) { - temp[0] = org[0] + crandom() * 8 - 16; - temp[1] = org[1] + crandom() * 8 + 16; + temp[0] = org[0] + Q_flrand(-1.0f, 1.0f) * 8 - 16; + temp[1] = org[1] + Q_flrand(-1.0f, 1.0f) * 8 + 16; LaunchItem( shields, temp, (float *)vec3_origin, NULL ); } @@ -780,8 +780,8 @@ void misc_model_cargo_die( gentity_t *self, gentity_t *inflictor, gentity_t *att if ( bacta ) { - temp[0] = org[0] + crandom() * 8 - 16; - temp[1] = org[1] + crandom() * 8 - 16; + temp[0] = org[0] + Q_flrand(-1.0f, 1.0f) * 8 - 16; + temp[1] = org[1] + Q_flrand(-1.0f, 1.0f) * 8 - 16; LaunchItem( bacta, temp, (float *)vec3_origin, NULL ); } @@ -793,8 +793,8 @@ void misc_model_cargo_die( gentity_t *self, gentity_t *inflictor, gentity_t *att if ( batteries ) { - temp[0] = org[0] + crandom() * 8 + 16; - temp[1] = org[1] + crandom() * 8 - 16; + temp[0] = org[0] + Q_flrand(-1.0f, 1.0f) * 8 + 16; + temp[1] = org[1] + Q_flrand(-1.0f, 1.0f) * 8 - 16; LaunchItem( batteries, temp, (float *)vec3_origin, NULL ); } diff --git a/codeJK2/game/g_mover.cpp b/codeJK2/game/g_mover.cpp index 144f42d78e..a4c27204fe 100644 --- a/codeJK2/game/g_mover.cpp +++ b/codeJK2/game/g_mover.cpp @@ -2121,7 +2121,7 @@ void SP_func_train (gentity_t *self) { { self->spawnflags &= ~32; // once only - gi.G2API_SetBoneAnim( &self->ghoul2[self->playerModel], "model_root", self->startFrame, self->endFrame, BONE_ANIM_OVERRIDE_LOOP, 1.0f + crandom() * 0.1f, 0, -1, -1 ); + gi.G2API_SetBoneAnim( &self->ghoul2[self->playerModel], "model_root", self->startFrame, self->endFrame, BONE_ANIM_OVERRIDE_LOOP, 1.0f + Q_flrand(-1.0f, 1.0f) * 0.1f, 0, -1, -1 ); self->endFrame = 0; // don't allow it to do anything with the animation function in G_main } } diff --git a/codeJK2/game/g_nav.cpp b/codeJK2/game/g_nav.cpp index 818c8686a4..15cb157c59 100644 --- a/codeJK2/game/g_nav.cpp +++ b/codeJK2/game/g_nav.cpp @@ -88,7 +88,7 @@ void NPC_Blocked( gentity_t *self, gentity_t *blocker ) //G_AddVoiceEvent( self, Q_irand(EV_BLOCKED1, EV_BLOCKED3), 0 ); } - self->NPC->blockedSpeechDebounceTime = level.time + MIN_BLOCKED_SPEECH_TIME + ( random() * 4000 ); + self->NPC->blockedSpeechDebounceTime = level.time + MIN_BLOCKED_SPEECH_TIME + ( Q_flrand(0.0f, 1.0f) * 4000 ); self->NPC->blockingEntNum = blocker->s.number; } diff --git a/codeJK2/game/g_navnew.cpp b/codeJK2/game/g_navnew.cpp index 2c533a6649..d5d2b208ff 100644 --- a/codeJK2/game/g_navnew.cpp +++ b/codeJK2/game/g_navnew.cpp @@ -68,7 +68,7 @@ void NPC_SetBlocked( gentity_t *self, gentity_t *blocker ) return; //self->NPC->aiFlags |= NPCAI_BLOCKED; - self->NPC->blockedSpeechDebounceTime = level.time + MIN_BLOCKED_SPEECH_TIME + ( random() * 4000 ); + self->NPC->blockedSpeechDebounceTime = level.time + MIN_BLOCKED_SPEECH_TIME + ( Q_flrand(0.0f, 1.0f) * 4000 ); self->NPC->blockingEntNum = blocker->s.number; } diff --git a/codeJK2/game/g_target.cpp b/codeJK2/game/g_target.cpp index 1782d44b46..495a4f96b4 100644 --- a/codeJK2/game/g_target.cpp +++ b/codeJK2/game/g_target.cpp @@ -81,7 +81,7 @@ void Use_Target_Delay( gentity_t *ent, gentity_t *other, gentity_t *activator ) { G_ActivateBehavior(ent,BSET_USE); - ent->nextthink = level.time + ( ent->wait + ent->random * crandom() ) * 1000; + ent->nextthink = level.time + ( ent->wait + ent->random * Q_flrand(-1.0f, 1.0f) ) * 1000; ent->e_ThinkFunc = thinkF_Think_Target_Delay; ent->activator = activator; } diff --git a/codeJK2/game/g_trigger.cpp b/codeJK2/game/g_trigger.cpp index 6657c95e4e..6e6e7ac6af 100644 --- a/codeJK2/game/g_trigger.cpp +++ b/codeJK2/game/g_trigger.cpp @@ -85,7 +85,7 @@ void multi_trigger_run( gentity_t *ent ) if ( ent->painDebounceTime != level.time ) {//first ent to touch it this frame //ent->e_ThinkFunc = thinkF_multi_wait; - ent->nextthink = level.time + ( ent->wait + ent->random * crandom() ) * 1000; + ent->nextthink = level.time + ( ent->wait + ent->random * Q_flrand(-1.0f, 1.0f) ) * 1000; ent->painDebounceTime = level.time; } } @@ -333,7 +333,7 @@ void trigger_cleared_fire (gentity_t *self) // should start the wait timer now, because the trigger's just been cleared, so we must "wait" from this point if ( self->wait > 0 ) { - self->nextthink = level.time + ( self->wait + self->random * crandom() ) * 1000; + self->nextthink = level.time + ( self->wait + self->random * Q_flrand(-1.0f, 1.0f) ) * 1000; } } @@ -1302,7 +1302,7 @@ so, the basic time between firing is a random time between void func_timer_think( gentity_t *self ) { G_UseTargets (self, self->activator); // set time before next firing - self->nextthink = level.time + 1000 * ( self->wait + crandom() * self->random ); + self->nextthink = level.time + 1000 * ( self->wait + Q_flrand(-1.0f, 1.0f) * self->random ); } void func_timer_use( gentity_t *self, gentity_t *other, gentity_t *activator ) { diff --git a/codeJK2/game/g_turret.cpp b/codeJK2/game/g_turret.cpp index f38270d810..5e09128580 100644 --- a/codeJK2/game/g_turret.cpp +++ b/codeJK2/game/g_turret.cpp @@ -48,7 +48,7 @@ void TurretPain( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, vec if ( mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT ) { // DEMP2 makes the turret stop shooting for a bit..and does extra feedback - self->attackDebounceTime = level.time + 800 + random() * 500; + self->attackDebounceTime = level.time + 800 + Q_flrand(0.0f, 1.0f) * 500; G_PlayEffect( "spark_exp_nosnd", point, dir ); } @@ -517,7 +517,7 @@ void turret_base_think( gentity_t *self ) else { // keep our enemy for a minimum of 2 seconds from now - self->bounceCount = level.time + 2000 + random() * 150; + self->bounceCount = level.time + 2000 + Q_flrand(0.0f, 1.0f) * 150; } turret_aim( self ); @@ -631,7 +631,7 @@ void finish_spawning_turret( gentity_t *base ) base->speed = 0; // this is a random time offset for the no-enemy-search-around-mode - base->count = random() * 9000; + base->count = Q_flrand(0.0f, 1.0f) * 9000; if ( !base->health ) { @@ -647,7 +647,7 @@ void finish_spawning_turret( gentity_t *base ) // How quickly to fire if ( !base->wait ) { - base->wait = 150 + random() * 55; + base->wait = 150 + Q_flrand(0.0f, 1.0f) * 55; } if ( !base->splashDamage ) @@ -1156,7 +1156,7 @@ static qboolean pas_find_enemies( gentity_t *self ) G_Sound( self, G_SoundIndex( "sound/chars/turret/startup.wav" )); // Wind up turrets for a bit - self->attackDebounceTime = level.time + 900 + random() * 200; + self->attackDebounceTime = level.time + 900 + Q_flrand(0.0f, 1.0f) * 200; } G_SetEnemy( self, target ); @@ -1184,7 +1184,7 @@ void pas_adjust_enemy( gentity_t *ent ) { keep = qfalse; } - else// if ( random() > 0.5f ) + else// if ( Q_flrand(0.0f, 1.0f) > 0.5f ) { // do a trace every now and then. mdxaBone_t boltMatrix; @@ -1220,7 +1220,7 @@ void pas_adjust_enemy( gentity_t *ent ) if ( keep ) { - ent->bounceCount = level.time + 500 + random() * 150; + ent->bounceCount = level.time + 500 + Q_flrand(0.0f, 1.0f) * 150; } else if ( ent->bounceCount < level.time ) // don't ping pong on and off { @@ -1353,7 +1353,7 @@ void pas_think( gentity_t *ent ) ent->s.loopSound = 0; } - if ( ent->enemy && ent->attackDebounceTime < level.time && random() > 0.3f ) + if ( ent->enemy && ent->attackDebounceTime < level.time && Q_flrand(0.0f, 1.0f) > 0.3f ) { ent->count--; @@ -1553,7 +1553,7 @@ void ion_cannon_think( gentity_t *self ) else { // done with burst, so wait delay amount, plus a random bit - self->nextthink = level.time + ( self->delay + crandom() * self->random ); + self->nextthink = level.time + ( self->delay + Q_flrand(-1.0f, 1.0f) * self->random ); self->count = Q_irand(0,5); // 0-5 bursts // Not firing this time @@ -1585,7 +1585,7 @@ void ion_cannon_think( gentity_t *self ) } gi.G2API_SetBoneAnimIndex( &self->ghoul2[self->playerModel], self->rootBone, 0, 8, BONE_ANIM_OVERRIDE_FREEZE, 0.6f, cg.time, -1, -1 ); - self->nextthink = level.time + self->wait + crandom() * self->random; + self->nextthink = level.time + self->wait + Q_flrand(-1.0f, 1.0f) * self->random; } //---------------------------------------------------------------------------------------------- @@ -1739,7 +1739,7 @@ void SP_misc_ion_cannon( gentity_t *base ) { // start thinking now, otherwise, we'll wait until we are used base->e_ThinkFunc = thinkF_ion_cannon_think; - base->nextthink = level.time + base->wait + crandom() * base->random; + base->nextthink = level.time + base->wait + Q_flrand(-1.0f, 1.0f) * base->random; } // Bursts? diff --git a/codeJK2/game/g_weapon.cpp b/codeJK2/game/g_weapon.cpp index 538eeaead4..4fb25bbf22 100644 --- a/codeJK2/game/g_weapon.cpp +++ b/codeJK2/game/g_weapon.cpp @@ -965,8 +965,8 @@ void emplaced_gun_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacke vec3_t ugly; ugly[YAW] = 4; - ugly[PITCH] = self->lastAngles[PITCH] * 0.8f + crandom() * 6; - ugly[ROLL] = crandom() * 7; + ugly[PITCH] = self->lastAngles[PITCH] * 0.8f + Q_flrand(-1.0f, 1.0f) * 6; + ugly[ROLL] = Q_flrand(-1.0f, 1.0f) * 7; gi.G2API_SetBoneAnglesIndex( &self->ghoul2[self->playerModel], self->lowerLumbarBone, ugly, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, 0, 0 ); VectorCopy( self->currentOrigin, org ); diff --git a/codeJK2/game/wp_blaster_rifle.cpp b/codeJK2/game/wp_blaster_rifle.cpp index f9df6d0de0..21eaaac51a 100644 --- a/codeJK2/game/wp_blaster_rifle.cpp +++ b/codeJK2/game/wp_blaster_rifle.cpp @@ -113,8 +113,8 @@ void WP_FireBlaster( gentity_t *ent, qboolean alt_fire ) if ( alt_fire ) { // add some slop to the alt-fire direction - angs[PITCH] += crandom() * BLASTER_ALT_SPREAD; - angs[YAW] += crandom() * BLASTER_ALT_SPREAD; + angs[PITCH] += Q_flrand(-1.0f, 1.0f) * BLASTER_ALT_SPREAD; + angs[YAW] += Q_flrand(-1.0f, 1.0f) * BLASTER_ALT_SPREAD; } else { @@ -124,14 +124,14 @@ void WP_FireBlaster( gentity_t *ent, qboolean alt_fire ) ( ent->client->NPC_class == CLASS_STORMTROOPER || ent->client->NPC_class == CLASS_SWAMPTROOPER ) ) { - angs[PITCH] += ( crandom() * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f - angs[YAW] += ( crandom() * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + angs[PITCH] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + angs[YAW] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f } else { // add some slop to the main-fire direction - angs[PITCH] += crandom() * BLASTER_MAIN_SPREAD; - angs[YAW] += crandom() * BLASTER_MAIN_SPREAD; + angs[PITCH] += Q_flrand(-1.0f, 1.0f) * BLASTER_MAIN_SPREAD; + angs[YAW] += Q_flrand(-1.0f, 1.0f) * BLASTER_MAIN_SPREAD; } } diff --git a/codeJK2/game/wp_bowcaster.cpp b/codeJK2/game/wp_bowcaster.cpp index a3fe78a2d3..c4072a0777 100644 --- a/codeJK2/game/wp_bowcaster.cpp +++ b/codeJK2/game/wp_bowcaster.cpp @@ -86,17 +86,17 @@ static void WP_BowcasterMainFire( gentity_t *ent ) for ( int i = 0; i < count; i++ ) { // create a range of different velocities - vel = BOWCASTER_VELOCITY * ( crandom() * BOWCASTER_VEL_RANGE + 1.0f ); + vel = BOWCASTER_VELOCITY * ( Q_flrand(-1.0f, 1.0f) * BOWCASTER_VEL_RANGE + 1.0f ); vectoangles( wpFwd, angs ); // add some slop to the fire direction - angs[PITCH] += crandom() * BOWCASTER_ALT_SPREAD * 0.2f; + angs[PITCH] += Q_flrand(-1.0f, 1.0f) * BOWCASTER_ALT_SPREAD * 0.2f; angs[YAW] += ((i+0.5f) * BOWCASTER_ALT_SPREAD - count * 0.5f * BOWCASTER_ALT_SPREAD ); if ( ent->NPC ) { - angs[PITCH] += ( crandom() * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f) ); - angs[YAW] += ( crandom() * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f) ); + angs[PITCH] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f) ); + angs[YAW] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f) ); } AngleVectors( angs, dir, NULL, NULL ); diff --git a/codeJK2/game/wp_bryar_pistol.cpp b/codeJK2/game/wp_bryar_pistol.cpp index 383895bfda..c81c4f18d8 100644 --- a/codeJK2/game/wp_bryar_pistol.cpp +++ b/codeJK2/game/wp_bryar_pistol.cpp @@ -50,13 +50,13 @@ void WP_FireBryarPistol( gentity_t *ent, qboolean alt_fire ) if ( ent->client->NPC_class == CLASS_IMPWORKER ) {//*sigh*, hack to make impworkers less accurate without affecteing imperial officer accuracy - angs[PITCH] += ( crandom() * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f - angs[YAW] += ( crandom() * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + angs[PITCH] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + angs[YAW] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f } else { - angs[PITCH] += ( crandom() * ((5-ent->NPC->currentAim)*0.25f) ); - angs[YAW] += ( crandom() * ((5-ent->NPC->currentAim)*0.25f) ); + angs[PITCH] += ( Q_flrand(-1.0f, 1.0f) * ((5-ent->NPC->currentAim)*0.25f) ); + angs[YAW] += ( Q_flrand(-1.0f, 1.0f) * ((5-ent->NPC->currentAim)*0.25f) ); } AngleVectors( angs, wpFwd, NULL, NULL ); diff --git a/codeJK2/game/wp_det_pack.cpp b/codeJK2/game/wp_det_pack.cpp index cb5169b48b..fadbd1bfde 100644 --- a/codeJK2/game/wp_det_pack.cpp +++ b/codeJK2/game/wp_det_pack.cpp @@ -126,7 +126,7 @@ void WP_FireDetPack( gentity_t *ent, qboolean alt_fire ) { VectorCopy( found->currentOrigin, found->s.origin ); found->e_ThinkFunc = thinkF_WP_Explode; - found->nextthink = level.time + 100 + random() * 100; + found->nextthink = level.time + 100 + Q_flrand(0.0f, 1.0f) * 100; G_Sound( found, G_SoundIndex( "sound/weapons/detpack/warning.wav" )); // would be nice if this actually worked? diff --git a/codeJK2/game/wp_flechette.cpp b/codeJK2/game/wp_flechette.cpp index 382b20b934..79130363a9 100644 --- a/codeJK2/game/wp_flechette.cpp +++ b/codeJK2/game/wp_flechette.cpp @@ -66,8 +66,8 @@ static void WP_FlechetteMainFire( gentity_t *ent ) } else { - angs[PITCH] += crandom() * FLECHETTE_SPREAD; - angs[YAW] += crandom() * FLECHETTE_SPREAD; + angs[PITCH] += Q_flrand(-1.0f, 1.0f) * FLECHETTE_SPREAD; + angs[YAW] += Q_flrand(-1.0f, 1.0f) * FLECHETTE_SPREAD; } AngleVectors( angs, fwd, NULL, NULL ); @@ -217,7 +217,7 @@ void WP_flechette_alt_blow( gentity_t *ent ) static void WP_CreateFlechetteBouncyThing( vec3_t start, vec3_t fwd, gentity_t *self ) //------------------------------------------------------------------------------ { - gentity_t *missile = CreateMissile( start, fwd, 950 + random() * 700, 1500 + random() * 2000, self, qtrue ); + gentity_t *missile = CreateMissile( start, fwd, 950 + Q_flrand(0.0f, 1.0f) * 700, 1500 + Q_flrand(0.0f, 1.0f) * 2000, self, qtrue ); missile->e_ThinkFunc = thinkF_WP_flechette_alt_blow; @@ -264,8 +264,8 @@ static void WP_FlechetteAltFire( gentity_t *self ) { VectorCopy( angs, dir ); - dir[PITCH] -= random() * 4 + 8; // make it fly upwards - dir[YAW] += crandom() * 2; + dir[PITCH] -= Q_flrand(0.0f, 1.0f) * 4 + 8; // make it fly upwards + dir[YAW] += Q_flrand(-1.0f, 1.0f) * 2; AngleVectors( dir, fwd, NULL, NULL ); WP_CreateFlechetteBouncyThing( start, fwd, self ); diff --git a/codeJK2/game/wp_repeater.cpp b/codeJK2/game/wp_repeater.cpp index b744628dfe..9bdddf087b 100644 --- a/codeJK2/game/wp_repeater.cpp +++ b/codeJK2/game/wp_repeater.cpp @@ -166,14 +166,14 @@ void WP_FireRepeater( gentity_t *ent, qboolean alt_fire ) ent->client->NPC_class == CLASS_SWAMPTROOPER || ent->client->NPC_class == CLASS_SHADOWTROOPER ) ) { - angs[PITCH] += ( crandom() * (REPEATER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f) ); - angs[YAW] += ( crandom() * (REPEATER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f) ); + angs[PITCH] += ( Q_flrand(-1.0f, 1.0f) * (REPEATER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f) ); + angs[YAW] += ( Q_flrand(-1.0f, 1.0f) * (REPEATER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f) ); } else { // add some slop to the alt-fire direction - angs[PITCH] += crandom() * REPEATER_SPREAD; - angs[YAW] += crandom() * REPEATER_SPREAD; + angs[PITCH] += Q_flrand(-1.0f, 1.0f) * REPEATER_SPREAD; + angs[YAW] += Q_flrand(-1.0f, 1.0f) * REPEATER_SPREAD; } AngleVectors( angs, dir, NULL, NULL ); diff --git a/codeJK2/game/wp_rocket_launcher.cpp b/codeJK2/game/wp_rocket_launcher.cpp index 174a86e69f..cf7c7b89d5 100644 --- a/codeJK2/game/wp_rocket_launcher.cpp +++ b/codeJK2/game/wp_rocket_launcher.cpp @@ -110,7 +110,7 @@ void rocketThink( gentity_t *ent ) // add crazy drunkenness for ( int i = 0; i < 3; i++ ) { - newdir[i] += crandom() * ent->random * 0.25f; + newdir[i] += Q_flrand(-1.0f, 1.0f) * ent->random * 0.25f; } // decay the randomness @@ -208,7 +208,7 @@ void WP_FireRocket( gentity_t *ent, qboolean alt_fire ) // if we are fully locked, always take on the enemy. // Also give a slight advantage to higher, but not quite full charges. // Finally, just give any amount of charge a very slight random chance of locking. - if ( dif == 8 || random() * dif > 2 || random() > 0.97f ) + if ( dif == 8 || Q_flrand(0.0f, 1.0f) * dif > 2 || Q_flrand(0.0f, 1.0f) > 0.97f ) { missile->enemy = &g_entities[lockEntNum]; diff --git a/codeJK2/game/wp_thermal.cpp b/codeJK2/game/wp_thermal.cpp index 656f33f6fb..bd8049d13e 100644 --- a/codeJK2/game/wp_thermal.cpp +++ b/codeJK2/game/wp_thermal.cpp @@ -354,9 +354,9 @@ gentity_t *WP_FireThermalDetonator( gentity_t *ent, qboolean alt_fire ) VectorMA( target, Q_flrand( 0, -32 ), vec, target );//throw a little short } - target[0] += Q_flrand( -5, 5 )+(crandom()*(6-ent->NPC->currentAim)*2); - target[1] += Q_flrand( -5, 5 )+(crandom()*(6-ent->NPC->currentAim)*2); - target[2] += Q_flrand( -5, 5 )+(crandom()*(6-ent->NPC->currentAim)*2); + target[0] += Q_flrand( -5, 5 )+(Q_flrand(-1.0f, 1.0f)*(6-ent->NPC->currentAim)*2); + target[1] += Q_flrand( -5, 5 )+(Q_flrand(-1.0f, 1.0f)*(6-ent->NPC->currentAim)*2); + target[2] += Q_flrand( -5, 5 )+(Q_flrand(-1.0f, 1.0f)*(6-ent->NPC->currentAim)*2); WP_LobFire( ent, start, target, bolt->mins, bolt->maxs, bolt->clipmask, bolt->s.pos.trDelta, qtrue, ent->s.number, ent->enemy->s.number ); } diff --git a/codeJK2/icarus/Sequencer.cpp b/codeJK2/icarus/Sequencer.cpp index 24fb057482..c8cdbfb20f 100644 --- a/codeJK2/icarus/Sequencer.cpp +++ b/codeJK2/icarus/Sequencer.cpp @@ -1176,7 +1176,7 @@ int CSequencer::EvaluateConditional( CBlock *block ) case ID_RANDOM: { float min, max; - //FIXME: This will not account for nested random() statements + //FIXME: This will not account for nested Q_flrand(0.0f, 1.0f) statements min = *(float *) block->GetMemberData( memberNum++ ); max = *(float *) block->GetMemberData( memberNum++ ); @@ -1347,7 +1347,7 @@ int CSequencer::EvaluateConditional( CBlock *block ) { float min, max; - //FIXME: This will not account for nested random() statements + //FIXME: This will not account for nested Q_flrand(0.0f, 1.0f) statements min = *(float *) block->GetMemberData( memberNum++ ); max = *(float *) block->GetMemberData( memberNum++ ); diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index 5e6c025bd1..35623cf2b0 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -408,7 +408,7 @@ int CTaskManager::GetFloat( int entID, CBlock *block, int &memberNum, float &val return (m_owner->GetInterface())->I_GetFloat( entID, type, name, &value ); } - //Look for a random() inline call + //Look for a Q_flrand(0.0f, 1.0f) inline call if ( Check( ID_RANDOM, block, memberNum ) ) { float min, max; @@ -480,7 +480,7 @@ int CTaskManager::GetVector( int entID, CBlock *block, int &memberNum, vector_t return (m_owner->GetInterface())->I_GetVector( entID, type, name, value ); } - //Look for a random() inline call + //Look for a Q_flrand(0.0f, 1.0f) inline call if ( Check( ID_RANDOM, block, memberNum ) ) { float min, max; @@ -618,7 +618,7 @@ int CTaskManager::Get( int entID, CBlock *block, int &memberNum, char **value ) } } - //Look for a random() inline call + //Look for a Q_flrand(0.0f, 1.0f) inline call if ( Check( ID_RANDOM, block, memberNum ) ) { float min, max, ret; diff --git a/codemp/botlib/be_aas_route.cpp b/codemp/botlib/be_aas_route.cpp index c85dc7dcec..e00e067909 100644 --- a/codemp/botlib/be_aas_route.cpp +++ b/codemp/botlib/be_aas_route.cpp @@ -2014,7 +2014,7 @@ int AAS_RandomGoalArea(int areanum, int travelflags, int *goalareanum, vec3_t go //if the area has no reachabilities if (!AAS_AreaReachability(areanum)) return qfalse; // - n = aasworld.numareas * random(); + n = aasworld.numareas * Q_flrand(0.0f, 1.0f); for (i = 0; i < aasworld.numareas; i++) { if (n <= 0) n = 1; diff --git a/codemp/botlib/be_ai_chat.cpp b/codemp/botlib/be_ai_chat.cpp index 11f4cd3845..fb29c53660 100644 --- a/codemp/botlib/be_ai_chat.cpp +++ b/codemp/botlib/be_ai_chat.cpp @@ -809,7 +809,7 @@ void BotReplaceWeightedSynonyms(char *string, unsigned long int context) { if (!(syn->context & context)) continue; //choose a weighted random replacement synonym - weight = random() * syn->totalweight; + weight = Q_flrand(0.0f, 1.0f) * syn->totalweight; if (!weight) continue; curweight = 0; for (replacement = syn->firstsynonym; replacement; replacement = replacement->next) @@ -1081,7 +1081,7 @@ char *RandomString(char *name) { if (!strcmp(random->string, name)) { - i = random() * random->numstrings; + i = Q_flrand(0.0f, 1.0f) * random->numstrings; for (rs = random->firstrandomstring; rs; rs = rs->next) { if (--i < 0) break; @@ -2469,7 +2469,7 @@ char *BotChooseInitialChatMessage(bot_chatstate_t *cs, char *type) } //end if else //choose a chat message randomly { - n = random() * numchatmessages; + n = Q_flrand(0.0f, 1.0f) * numchatmessages; for (m = t->firstchatmessage; m; m = m->next) { if (m->time > AAS_Time()) continue; @@ -2705,7 +2705,7 @@ int BotReplyChat(int chatstate, char *message, int mcontext, int vcontext, char if (m->time > AAS_Time()) continue; numchatmessages++; } //end if - num = random() * numchatmessages; + num = Q_flrand(0.0f, 1.0f) * numchatmessages; for (m = rchat->firstchatmessage; m; m = m->next) { if (--num < 0) break; diff --git a/codemp/botlib/be_ai_gen.cpp b/codemp/botlib/be_ai_gen.cpp index e2835fc12f..d3871b51ef 100644 --- a/codemp/botlib/be_ai_gen.cpp +++ b/codemp/botlib/be_ai_gen.cpp @@ -69,7 +69,7 @@ int GeneticSelection(int numranks, float *rankings) { //select a bot where the ones with the higest rankings have //the highest chance of being selected - //sum *= random(); + //sum *= Q_flrand(0.0f, 1.0f); for (i = 0; i < numranks; i++) { if (rankings[i] < 0) continue; @@ -78,7 +78,7 @@ int GeneticSelection(int numranks, float *rankings) } //end for } //end if //select a bot randomly - index = random() * numranks; + index = Q_flrand(0.0f, 1.0f) * numranks; for (i = 0; i < numranks; i++) { if (rankings[index] >= 0) return index; diff --git a/codemp/botlib/be_ai_move.cpp b/codemp/botlib/be_ai_move.cpp index dd39eea456..8f24960cf9 100644 --- a/codemp/botlib/be_ai_move.cpp +++ b/codemp/botlib/be_ai_move.cpp @@ -1545,7 +1545,7 @@ bot_moveresult_t BotTravel_WaterJump(bot_movestate_t *ms, aas_reachability_t *re VectorSubtract(reach->end, ms->origin, dir); VectorCopy(dir, hordir); hordir[2] = 0; - dir[2] += 15 + crandom() * 40; + dir[2] += 15 + Q_flrand(-1.0f, 1.0f) * 40; //botimport.Print(PRT_MESSAGE, "BotTravel_WaterJump: dir[2] = %f\n", dir[2]); VectorNormalize(dir); dist = VectorNormalize(hordir); @@ -1583,9 +1583,9 @@ bot_moveresult_t BotFinishTravel_WaterJump(bot_movestate_t *ms, aas_reachability if (!(AAS_PointContents(pnt) & (CONTENTS_LAVA|CONTENTS_SLIME|CONTENTS_WATER))) return result; //swim straight to reachability end VectorSubtract(reach->end, ms->origin, dir); - dir[0] += crandom() * 10; - dir[1] += crandom() * 10; - dir[2] += 70 + crandom() * 10; + dir[0] += Q_flrand(-1.0f, 1.0f) * 10; + dir[1] += Q_flrand(-1.0f, 1.0f) * 10; + dir[2] += 70 + Q_flrand(-1.0f, 1.0f) * 10; //elemantary actions EA_Move(ms->client, dir, 400); //set the ideal view angles diff --git a/codemp/botlib/be_ai_weight.cpp b/codemp/botlib/be_ai_weight.cpp index d3bbcb2d6d..6f5d74d235 100644 --- a/codemp/botlib/be_ai_weight.cpp +++ b/codemp/botlib/be_ai_weight.cpp @@ -629,7 +629,7 @@ float FuzzyWeightUndecided_r(int *inventory, fuzzyseperator_t *fs) if (inventory[fs->index] < fs->value) { if (fs->child) return FuzzyWeightUndecided_r(inventory, fs->child); - else return fs->minweight + random() * (fs->maxweight - fs->minweight); + else return fs->minweight + Q_flrand(0.0f, 1.0f) * (fs->maxweight - fs->minweight); } //end if else if (fs->next) { @@ -637,10 +637,10 @@ float FuzzyWeightUndecided_r(int *inventory, fuzzyseperator_t *fs) { //first weight if (fs->child) w1 = FuzzyWeightUndecided_r(inventory, fs->child); - else w1 = fs->minweight + random() * (fs->maxweight - fs->minweight); + else w1 = fs->minweight + Q_flrand(0.0f, 1.0f) * (fs->maxweight - fs->minweight); //second weight if (fs->next->child) w2 = FuzzyWeight_r(inventory, fs->next->child); - else w2 = fs->next->minweight + random() * (fs->next->maxweight - fs->next->minweight); + else w2 = fs->next->minweight + Q_flrand(0.0f, 1.0f) * (fs->next->maxweight - fs->next->minweight); //the scale factor if(fs->next->value == MAX_INVENTORYVALUE) // is fs->next the default case? return w2; // can't interpolate, return default weight @@ -704,12 +704,12 @@ float FuzzyWeightUndecided(int *inventory, weightconfig_t *wc, int weightnum) if (inventory[s->index] < s->value) { if (s->child) s = s->child; - else return s->minweight + random() * (s->maxweight - s->minweight); + else return s->minweight + Q_flrand(0.0f, 1.0f) * (s->maxweight - s->minweight); } //end if else { if (s->next) s = s->next; - else return s->minweight + random() * (s->maxweight - s->minweight); + else return s->minweight + Q_flrand(0.0f, 1.0f) * (s->maxweight - s->minweight); } //end else } //end if return 0; @@ -730,8 +730,8 @@ void EvolveFuzzySeperator_r(fuzzyseperator_t *fs) else if (fs->type == WT_BALANCE) { //every once in a while an evolution leap occurs, mutation - if (random() < 0.01) fs->weight += crandom() * (fs->maxweight - fs->minweight); - else fs->weight += crandom() * (fs->maxweight - fs->minweight) * 0.5; + if (Q_flrand(0.0f, 1.0f) < 0.01) fs->weight += Q_flrand(-1.0f, 1.0f) * (fs->maxweight - fs->minweight); + else fs->weight += Q_flrand(-1.0f, 1.0f) * (fs->maxweight - fs->minweight) * 0.5; //modify bounds if necesary because of mutation if (fs->weight < fs->minweight) fs->minweight = fs->weight; else if (fs->weight > fs->maxweight) fs->maxweight = fs->weight; diff --git a/codemp/cgame/cg_draw.c b/codemp/cgame/cg_draw.c index b5d4951d01..62078d2d97 100644 --- a/codemp/cgame/cg_draw.c +++ b/codemp/cgame/cg_draw.c @@ -267,9 +267,9 @@ static void CG_DrawZoomMask( void ) CG_DrawPic( 82, 94, 16, 16, cgs.media.binocularCircle ); // Flickery color - color1[0] = 0.7f + crandom() * 0.1f; - color1[1] = 0.8f + crandom() * 0.1f; - color1[2] = 0.7f + crandom() * 0.1f; + color1[0] = 0.7f + Q_flrand(-0.1f, 0.1f); + color1[1] = 0.8f + Q_flrand(-0.1f, 0.1f); + color1[2] = 0.7f + Q_flrand(-0.1f, 0.1f); color1[3] = 1.0f; trap->R_SetColor( color1 ); @@ -287,7 +287,7 @@ static void CG_DrawZoomMask( void ) CG_DrawPic( 307, 40, 26, 30, cgs.media.binocularTri ); } - if ( random() > 0.98f && ( cg.time & 1024 )) + if ( Q_flrand(0.0f, 1.0f) > 0.98f && ( cg.time & 1024 )) { flip = !flip; } @@ -340,8 +340,8 @@ static void CG_DrawZoomMask( void ) val[4] = (ammo / 625) % 5; color1[0] = 0.2f; - color1[1] = 0.55f + crandom() * 0.1f; - color1[2] = 0.5f + crandom() * 0.1f; + color1[1] = 0.55f + Q_flrand(-1.0f, 1.0f) * 0.1f; + color1[2] = 0.5f + Q_flrand(-1.0f, 1.0f) * 0.1f; color1[3] = 1.0f; trap->R_SetColor( color1 ); diff --git a/codemp/cgame/cg_effects.c b/codemp/cgame/cg_effects.c index dc0dc22b17..03defa5061 100644 --- a/codemp/cgame/cg_effects.c +++ b/codemp/cgame/cg_effects.c @@ -61,7 +61,7 @@ void CG_BubbleTrail( vec3_t start, vec3_t end, float spacing ) { le->leFlags = LEF_PUFF_DONT_SCALE; le->leType = LE_MOVE_SCALE_FADE; le->startTime = cg.time; - le->endTime = cg.time + 1000 + random() * 250; + le->endTime = cg.time + 1000 + Q_flrand(-250.0f, 250.0f); le->lifeRate = 1.0 / ( le->endTime - le->startTime ); re = &le->refEntity; @@ -81,9 +81,9 @@ void CG_BubbleTrail( vec3_t start, vec3_t end, float spacing ) { le->pos.trType = TR_LINEAR; le->pos.trTime = cg.time; VectorCopy( move, le->pos.trBase ); - le->pos.trDelta[0] = crandom()*5; - le->pos.trDelta[1] = crandom()*5; - le->pos.trDelta[2] = crandom()*5 + 6; + le->pos.trDelta[0] = Q_flrand(-5.0f, 5.0f); + le->pos.trDelta[1] = Q_flrand(-5.0f, 5.0f); + le->pos.trDelta[2] = Q_flrand(-5.0f, 5.0f) + 6; VectorAdd (move, vec, move); } @@ -249,7 +249,7 @@ static void CG_DoGlassQuad( vec3_t p[4], vec2_t uv[4], qboolean stick, int time, addpolyArgStruct_t apArgs; int i, i_2; - VectorSet( vel, crandom() * 12, crandom() * 12, -1 ); + VectorSet( vel, Q_flrand(-12.0f, 12.0f), Q_flrand(-12.0f, 12.0f), -1 ); if ( !stick ) { @@ -258,17 +258,17 @@ static void CG_DoGlassQuad( vec3_t p[4], vec2_t uv[4], qboolean stick, int time, } // Set up acceleration due to gravity, 800 is standard QuakeIII gravity, so let's use something close - VectorSet( accel, 0.0f, 0.0f, -(600.0f + random() * 100.0f ) ); + VectorSet( accel, 0.0f, 0.0f, -(600.0f + Q_flrand(0.0f, 1.0f) * 100.0f ) ); // We are using an additive shader, so let's set the RGB low so we look more like transparent glass // VectorSet( rgb1, 0.1f, 0.1f, 0.1f ); VectorSet( rgb1, 1.0f, 1.0f, 1.0f ); // Being glass, we don't want to bounce much - bounce = random() * 0.2f + 0.15f; + bounce = Q_flrand(0.0f, 1.0f) * 0.2f + 0.15f; // Set up our random rotate, we only do PITCH and YAW, not ROLL. This is something like degrees per second - VectorSet( rotDelta, crandom() * 40.0f, crandom() * 40.0f, 0.0f ); + VectorSet( rotDelta, Q_flrand(-40.0f, 40.0f), Q_flrand(-40.0f, 40.0f), 0.0f ); //In an ideal world, this might actually work. /* @@ -281,7 +281,7 @@ static void CG_DoGlassQuad( vec3_t p[4], vec2_t uv[4], qboolean stick, int time, cgi_R_RegisterShader( "gfx/misc/test_crackle" ), FX_APPLY_PHYSICS | FX_ALPHA_NONLINEAR | FX_USE_ALPHA ); - if ( random() > 0.95f && pol ) + if ( Q_flrand(0.0f, 1.0f) > 0.95f && pol ) { pol->AddFlags( FX_IMPACT_RUNS_FX | FX_KILL_ON_IMPACT ); pol->SetImpactFxID( theFxScheduler.RegisterEffect( "glass_impact" )); @@ -419,8 +419,8 @@ void CG_InitGlass( void ) { for ( t = 0; t < 20; t++ ) { - offX[t][i] = crandom() * 0.03f; - offZ[i][t] = crandom() * 0.03f; + offX[t][i] = Q_flrand(-1.0f, 1.0f) * 0.03f; + offZ[i][t] = Q_flrand(-1.0f, 1.0f) * 0.03f; } } } @@ -602,7 +602,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl CG_CalcBiLerp( verts, subVerts, biPoints ); - dif = DistanceSquared( subVerts[0], dmgPt ) * timeDecay - random() * 32; + dif = DistanceSquared( subVerts[0], dmgPt ) * timeDecay - Q_flrand(0.0f, 1.0f) * 32; // If we decrease dif, we are increasing the impact area, making it more likely to blow out large holes dif -= dmgRadius * dmgRadius; @@ -610,7 +610,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl if ( dif > 1 ) { stick = qtrue; - time = dif + random() * 200; + time = dif + Q_flrand(0.0f, 1.0f) * 200; } else { @@ -777,7 +777,7 @@ void CG_MiscModelExplosion( vec3_t mins, vec3_t maxs, int size, material_t chunk int j; for( j = 0; j < 3; j++ ) { - r = random() * 0.8f + 0.1f; + r = Q_flrand(0.0f, 1.0f) * 0.8f + 0.1f; org[j] = ( r * mins[j] + ( 1 - r ) * maxs[j] ); } @@ -952,12 +952,12 @@ void CG_Chunks( int owner, vec3_t origin, const vec3_t normal, const vec3_t mins re->hModel = chunkModel; le->leType = LE_FRAGMENT; - le->endTime = cg.time + 1300 + random() * 900; + le->endTime = cg.time + 1300 + Q_flrand(0.0f, 1.0f) * 900; // spawn chunk roughly in the bbox of the thing...bias towards center in case thing blowing up doesn't complete fill its bbox. for( j = 0; j < 3; j++ ) { - r = random() * 0.8f + 0.1f; + r = Q_flrand(0.0f, 1.0f) * 0.8f + 0.1f; re->origin[j] = ( r * mins[j] + ( 1 - r ) * maxs[j] ); } VectorCopy( re->origin, le->pos.trBase ); @@ -968,18 +968,18 @@ void CG_Chunks( int owner, vec3_t origin, const vec3_t normal, const vec3_t mins VectorScale( dir, flrand( speed * 0.5f, speed * 1.25f ) * speedMod, le->pos.trDelta ); // Angular Velocity - VectorSet( le->angles.trBase, random() * 360, random() * 360, random() * 360 ); + VectorSet( le->angles.trBase, Q_flrand(0.0f, 1.0f) * 360, Q_flrand(0.0f, 1.0f) * 360, Q_flrand(0.0f, 1.0f) * 360 ); - le->angles.trDelta[0] = crandom(); - le->angles.trDelta[1] = crandom(); + le->angles.trDelta[0] = Q_flrand(-1.0f, 1.0f); + le->angles.trDelta[1] = Q_flrand(-1.0f, 1.0f); le->angles.trDelta[2] = 0; // don't do roll - VectorScale( le->angles.trDelta, random() * 600.0f + 200.0f, le->angles.trDelta ); + VectorScale( le->angles.trDelta, Q_flrand(0.0f, 1.0f) * 600.0f + 200.0f, le->angles.trDelta ); le->pos.trType = TR_GRAVITY; le->angles.trType = TR_LINEAR; le->pos.trTime = le->angles.trTime = cg.time; - le->bounceFactor = 0.2f + random() * 0.2f; + le->bounceFactor = 0.2f + Q_flrand(0.0f, 1.0f) * 0.2f; le->leFlags |= LEF_TUMBLE; //le->ownerGentNum = owner; le->leBounceSoundType = bounce; @@ -1146,11 +1146,11 @@ void CG_SurfaceExplosion( vec3_t origin, vec3_t normal, float radius, float shak int i, numSparks; //Sparks - numSparks = 16 + (random() * 16.0f); + numSparks = 16 + (Q_flrand(0.0f, 1.0f) * 16.0f); for ( i = 0; i < numSparks; i++ ) { - // scale = 0.25f + (random() * 2.0f); + // scale = 0.25f + (Q_flrand(0.0f, 1.0f) * 2.0f); /* particle = FX_AddTrail( origin, NULL, @@ -1178,17 +1178,17 @@ void CG_SurfaceExplosion( vec3_t origin, vec3_t normal, float radius, float shak for ( i = 0; i < 4; i++ ) { - VectorSet( temp_org, new_org[0] + (crandom() * 16.0f), new_org[1] + (crandom() * 16.0f), new_org[2] + (random() * 4.0f) ); - VectorSet( temp_vel, velocity[0] + (crandom() * 8.0f), velocity[1] + (crandom() * 8.0f), velocity[2] + (crandom() * 8.0f) ); + VectorSet( temp_org, new_org[0] + (Q_flrand(-1.0f, 1.0f) * 16.0f), new_org[1] + (Q_flrand(-1.0f, 1.0f) * 16.0f), new_org[2] + (Q_flrand(0.0f, 1.0f) * 4.0f) ); + VectorSet( temp_vel, velocity[0] + (Q_flrand(-1.0f, 1.0f) * 8.0f), velocity[1] + (Q_flrand(-1.0f, 1.0f) * 8.0f), velocity[2] + (Q_flrand(-1.0f, 1.0f) * 8.0f) ); /* FX_AddSprite( temp_org, temp_vel, NULL, - 64.0f + (random() * 32.0f), + 64.0f + (Q_flrand(0.0f, 1.0f) * 32.0f), 16.0f, 1.0f, 0.0f, - 20.0f + (crandom() * 90.0f), + 20.0f + (Q_flrand(-1.0f, 1.0f) * 90.0f), 0.5f, 1500.0f, cgs.media.smokeShader, FXF_USE_ALPHA_CHAN );*/ @@ -1201,14 +1201,14 @@ void CG_SurfaceExplosion( vec3_t origin, vec3_t normal, float radius, float shak VectorNormalize( direction ); //Tag the last one with a light - le = CG_MakeExplosion( origin, direction, cgs.media.explosionModel, 6, cgs.media.surfaceExplosionShader, 500, qfalse, radius * 0.02f + (random() * 0.3f), 0); + le = CG_MakeExplosion( origin, direction, cgs.media.explosionModel, 6, cgs.media.surfaceExplosionShader, 500, qfalse, radius * 0.02f + (Q_flrand(0.0f, 1.0f) * 0.3f), 0); le->light = 150; VectorSet( le->lightColor, 0.9f, 0.8f, 0.5f ); for ( i = 0; i < NUM_EXPLOSIONS-1; i ++) { - VectorSet( new_org, (origin[0] + (16 + (crandom() * 8))*crandom()), (origin[1] + (16 + (crandom() * 8))*crandom()), (origin[2] + (16 + (crandom() * 8))*crandom()) ); - le = CG_MakeExplosion( new_org, direction, cgs.media.explosionModel, 6, cgs.media.surfaceExplosionShader, 300 + (rand() & 99), qfalse, radius * 0.05f + (crandom() *0.3f), 0); + VectorSet( new_org, (origin[0] + (16 + (Q_flrand(-1.0f, 1.0f) * 8))*Q_flrand(-1.0f, 1.0f)), (origin[1] + (16 + (Q_flrand(-1.0f, 1.0f) * 8))*Q_flrand(-1.0f, 1.0f)), (origin[2] + (16 + (Q_flrand(-1.0f, 1.0f) * 8))*Q_flrand(-1.0f, 1.0f)) ); + le = CG_MakeExplosion( new_org, direction, cgs.media.explosionModel, 6, cgs.media.surfaceExplosionShader, 300 + (rand() & 99), qfalse, radius * 0.05f + (Q_flrand(-1.0f, 1.0f) *0.3f), 0); } //Shake the camera @@ -1220,11 +1220,11 @@ void CG_SurfaceExplosion( vec3_t origin, vec3_t normal, float radius, float shak if ( smoke ) { VectorMA( origin, -8, normal, temp_org ); -// FX_AddSpawner( temp_org, normal, NULL, NULL, 100, random()*25.0f, 5000.0f, (void *) CG_SmokeSpawn ); +// FX_AddSpawner( temp_org, normal, NULL, NULL, 100, Q_flrand(0.0f, 1.0f)*25.0f, 5000.0f, (void *) CG_SmokeSpawn ); //Impact mark //FIXME: Replace mark - //CG_ImpactMark( cgs.media.burnMarkShader, origin, normal, random()*360, 1,1,1,1, qfalse, 8, qfalse ); + //CG_ImpactMark( cgs.media.burnMarkShader, origin, normal, Q_flrand(0.0f, 1.0f)*360, 1,1,1,1, qfalse, 8, qfalse ); } } @@ -1242,7 +1242,7 @@ void CG_LaunchGib( vec3_t origin, vec3_t velocity, qhandle_t hModel ) { le->leType = LE_FRAGMENT; le->startTime = cg.time; - le->endTime = le->startTime + 5000 + random() * 3000; + le->endTime = le->startTime + 5000 + Q_flrand(0.0f, 1.0f) * 3000; VectorCopy( origin, re->origin ); AxisCopy( axisDefault, re->axis ); diff --git a/codemp/cgame/cg_ents.c b/codemp/cgame/cg_ents.c index 131ef0b231..7c28f6c6a9 100644 --- a/codemp/cgame/cg_ents.c +++ b/codemp/cgame/cg_ents.c @@ -705,7 +705,7 @@ void CG_Disintegration(centity_t *cent, refEntity_t *ent) ent->customShader = 0; trap->R_AddRefEntityToScene( ent ); - if ( cg.time - ent->endTime < 1000 && (timescale.value * timescale.value * random()) > 0.05f ) + if ( cg.time - ent->endTime < 1000 && (timescale.value * timescale.value * Q_flrand(0.0f, 1.0f)) > 0.05f ) { vec3_t fxOrg, fxDir; mdxaBone_t boltMatrix; @@ -718,10 +718,10 @@ void CG_Disintegration(centity_t *cent, refEntity_t *ent) BG_GiveMeVectorFromMatrix( &boltMatrix, ORIGIN, fxOrg ); VectorMA( fxOrg, -18, cg.refdef.viewaxis[0], fxOrg ); - fxOrg[2] += crandom() * 20; + fxOrg[2] += Q_flrand(-1.0f, 1.0f) * 20; trap->FX_PlayEffectID( cgs.effects.mDisruptorDeathSmoke, fxOrg, fxDir, -1, -1, qfalse ); - if ( random() > 0.5f ) + if ( Q_flrand(0.0f, 1.0f) > 0.5f ) { trap->FX_PlayEffectID( cgs.effects.mDisruptorDeathSmoke, fxOrg, fxDir, -1, -1, qfalse ); } @@ -1611,7 +1611,7 @@ Ghoul2 Insert End { ent.customShader = cgs.media.electricBody2Shader; } - if ( random() > 0.9f ) + if ( Q_flrand(0.0f, 1.0f) > 0.9f ) { trap->S_StartSound ( NULL, cent->currentState.number, CHAN_AUTO, cgs.media.crackleSound ); } @@ -1854,7 +1854,7 @@ static void CG_Speaker( centity_t *cent ) { // ent->s.frame = ent->wait * 10; // ent->s.clientNum = ent->random * 10; - cent->miscTime = cg.time + cent->currentState.frame * 100 + cent->currentState.clientNum * 100 * crandom(); + cent->miscTime = cg.time + cent->currentState.frame * 100 + cent->currentState.clientNum * 100 * Q_flrand(-1.0f, 1.0f); } qboolean CG_GreyItem(int type, int tag, int plSide) @@ -3239,7 +3239,7 @@ static void CG_FX( centity_t *cent ) cent->muzzleFlashTime = s1->modelindex2; } - cent->miscTime = cg.time + s1->speed + random() * s1->time; + cent->miscTime = cg.time + s1->speed + Q_flrand(0.0f, 1.0f) * s1->time; AngleVectors(s1->angles, fxDir, 0, 0); diff --git a/codemp/cgame/cg_localents.c b/codemp/cgame/cg_localents.c index 89018a164c..76a0fd66f2 100644 --- a/codemp/cgame/cg_localents.c +++ b/codemp/cgame/cg_localents.c @@ -159,10 +159,10 @@ void CG_FragmentBounceMark( localEntity_t *le, trace_t *trace ) { if ( le->leMarkType == LEMT_BLOOD ) { // radius = 16 + (rand()&31); - // CG_ImpactMark( cgs.media.bloodMarkShader, trace->endpos, trace->plane.normal, random()*360, 1,1,1,1, qtrue, radius, qfalse ); + // CG_ImpactMark( cgs.media.bloodMarkShader, trace->endpos, trace->plane.normal, Q_flrand(0.0f, 1.0f)*360, 1,1,1,1, qtrue, radius, qfalse ); } else if ( le->leMarkType == LEMT_BURN ) { // radius = 8 + (rand()&15); - // CG_ImpactMark( cgs.media.burnMarkShader, trace->endpos, trace->plane.normal, random()*360, 1,1,1,1, qtrue, radius, qfalse ); + // CG_ImpactMark( cgs.media.burnMarkShader, trace->endpos, trace->plane.normal, Q_flrand(0.0f, 1.0f)*360, 1,1,1,1, qtrue, radius, qfalse ); } // don't allow a fragment to make multiple marks, or they pile up while settling diff --git a/codemp/cgame/cg_players.c b/codemp/cgame/cg_players.c index 84da903418..1289716352 100644 --- a/codemp/cgame/cg_players.c +++ b/codemp/cgame/cg_players.c @@ -4029,7 +4029,7 @@ static void CG_G2SetHeadBlink( centity_t *cent, qboolean bStart ) if (bStart) { desiredAngles[YAW] = -50; - if ( random() > 0.95f ) + if ( Q_flrand(0.0f, 1.0f) > 0.95f ) { bWink = qtrue; blendTime /=3; @@ -5160,7 +5160,7 @@ void CG_DrawPlayerShield(centity_t *cent, vec3_t origin) ent.origin[2] += 10.0; AnglesToAxis( cent->damageAngles, ent.axis ); - alpha = 255.0 * ((cent->damageTime - cg.time) / MIN_SHIELD_TIME) + random()*16; + alpha = 255.0 * ((cent->damageTime - cg.time) / MIN_SHIELD_TIME) + Q_flrand(0.0f, 1.0f)*16; if (alpha>255) alpha=255; @@ -5353,7 +5353,7 @@ static void CG_DoSaberLight( saberInfo_t *saber ) } } - trap->R_AddLightToScene( mid, diameter + (random()*8.0f), rgb[0], rgb[1], rgb[2] ); + trap->R_AddLightToScene( mid, diameter + (Q_flrand(0.0f, 1.0f)*8.0f), rgb[0], rgb[1], rgb[2] ); } } @@ -5411,7 +5411,7 @@ void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float { // always add a light because sabers cast a nice glow before they slice you in half!! or something... vec3_t rgb={1,1,1}; CG_RGBForSaberColor( color, rgb ); - trap->R_AddLightToScene( mid, (length*1.4f) + (random()*3.0f), rgb[0], rgb[1], rgb[2] ); + trap->R_AddLightToScene( mid, (length*1.4f) + (Q_flrand(0.0f, 1.0f)*3.0f), rgb[0], rgb[1], rgb[2] ); } memset( &saber, 0, sizeof( refEntity_t )); @@ -5439,8 +5439,8 @@ void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float radiusRange = radius * 0.075f; radiusStart = radius-radiusRange; - saber.radius = (radiusStart + crandom() * radiusRange)*radiusmult; - //saber.radius = (2.8f + crandom() * 0.2f)*radiusmult; + saber.radius = (radiusStart + Q_flrand(-1.0f, 1.0f) * radiusRange)*radiusmult; + //saber.radius = (2.8f + Q_flrand(-1.0f, 1.0f) * 0.2f)*radiusmult; VectorCopy( origin, saber.origin ); VectorCopy( dir, saber.axis[0] ); @@ -5460,8 +5460,8 @@ void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float 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; + saber.radius = (radiusStart + Q_flrand(-1.0f, 1.0f) * radiusRange)*radiusmult; +// saber.radius = (1.0 + Q_flrand(-1.0f, 1.0f) * 0.2f)*radiusmult; saber.shaderTexCoord[0] = saber.shaderTexCoord[1] = 1.0f; saber.shaderRGBA[0] = saber.shaderRGBA[1] = saber.shaderRGBA[2] = saber.shaderRGBA[3] = 0xff; @@ -5558,8 +5558,8 @@ void CG_CreateSaberMarks( vec3_t start, vec3_t end, vec3_t normal ) VectorScale( mid, 0.5f, mid ); VectorSubtract( v->xyz, mid, delta ); - v->st[0] = 0.5 + DotProduct( delta, axis[1] ) * (0.05f + random() * 0.03f); - v->st[1] = 0.5 + DotProduct( delta, axis[2] ) * (0.15f + random() * 0.05f); + v->st[0] = 0.5 + DotProduct( delta, axis[1] ) * (0.05f + Q_flrand(0.0f, 1.0f) * 0.03f); + v->st[1] = 0.5 + DotProduct( delta, axis[2] ) * (0.15f + Q_flrand(0.0f, 1.0f) * 0.05f); } if (cg_saberDynamicMarks.integer) @@ -5631,9 +5631,9 @@ void CG_CreateSaberMarks( vec3_t start, vec3_t end, vec3_t normal ) trap->FX_AddPoly(&apArgs); apArgs.shader = cgs.media.mSaberDamageGlow; - apArgs.rgb1[0] = 215 + random() * 40.0f; - apArgs.rgb1[1] = 96 + random() * 32.0f; - apArgs.rgb1[2] = apArgs.alphaParm = random()*15.0f; + apArgs.rgb1[0] = 215 + Q_flrand(0.0f, 1.0f) * 40.0f; + apArgs.rgb1[1] = 96 + Q_flrand(0.0f, 1.0f) * 32.0f; + apArgs.rgb1[2] = apArgs.alphaParm = Q_flrand(0.0f, 1.0f)*15.0f; apArgs.rgb1[0] /= 255; apArgs.rgb1[1] /= 255; @@ -5662,9 +5662,9 @@ void CG_CreateSaberMarks( vec3_t start, vec3_t end, vec3_t normal ) mark->alphaFade = qfalse; mark->markShader = cgs.media.mSaberDamageGlow; mark->poly.numVerts = mf->numPoints; - mark->color[0] = 215 + random() * 40.0f; - mark->color[1] = 96 + random() * 32.0f; - mark->color[2] = mark->color[3] = random()*15.0f; + mark->color[0] = 215 + Q_flrand(0.0f, 1.0f) * 40.0f; + mark->color[1] = 96 + Q_flrand(0.0f, 1.0f) * 32.0f; + mark->color[2] = mark->color[3] = Q_flrand(0.0f, 1.0f)*15.0f; memcpy( mark->verts, verts, mf->numPoints * sizeof( verts[0] ) ); } } @@ -6699,7 +6699,7 @@ void CG_AddLightningBeam(vec3_t start, vec3_t end) VectorMA( b.start, 0.6666f * len, dir, c2 ); // get some chaos values that really aren't very chaotic :) - s1 = sin( cg.time * 0.005f ) * 2 + crandom() * 0.2f; + s1 = sin( cg.time * 0.005f ) * 2 + Q_flrand(-1.0f, 1.0f) * 0.2f; s2 = sin( cg.time * 0.001f ); s3 = sin( cg.time * 0.011f ); @@ -7843,7 +7843,7 @@ static void CG_ForceElectrocution( centity_t *cent, const vec3_t origin, vec3_t if ( found ) { BG_GiveMeVectorFromMatrix( &boltMatrix, ORIGIN, fxOrg ); - if ( random() > 0.5f ) + if ( Q_flrand(0.0f, 1.0f) > 0.5f ) { BG_GiveMeVectorFromMatrix( &boltMatrix, NEGATIVE_X, dir ); } @@ -7853,15 +7853,15 @@ static void CG_ForceElectrocution( centity_t *cent, const vec3_t origin, vec3_t } // Add some fudge, makes us not normalized, but that isn't really important - dir[0] += crandom() * 0.4f; - dir[1] += crandom() * 0.4f; - dir[2] += crandom() * 0.4f; + dir[0] += Q_flrand(-1.0f, 1.0f) * 0.4f; + dir[1] += Q_flrand(-1.0f, 1.0f) * 0.4f; + dir[2] += Q_flrand(-1.0f, 1.0f) * 0.4f; } else { // Just use the lerp Origin and a random direction VectorCopy( cent->lerpOrigin, fxOrg ); - VectorSet( dir, crandom(), crandom(), crandom() ); // Not normalized, but who cares. + VectorSet( dir, Q_flrand(-1.0f, 1.0f), Q_flrand(-1.0f, 1.0f), Q_flrand(-1.0f, 1.0f) ); // Not normalized, but who cares. switch ( cent->currentState.NPC_class ) { case CLASS_PROBE: @@ -7878,11 +7878,11 @@ static void CG_ForceElectrocution( centity_t *cent, const vec3_t origin, vec3_t } } - VectorMA( fxOrg, random() * 40 + 40, dir, fxOrg2 ); + VectorMA( fxOrg, Q_flrand(0.0f, 1.0f) * 40 + 40, dir, fxOrg2 ); CG_Trace( &tr, fxOrg, NULL, NULL, fxOrg2, -1, CONTENTS_SOLID ); - if ( tr.fraction < 1.0f || random() > 0.94f || alwaysDo ) + if ( tr.fraction < 1.0f || Q_flrand(0.0f, 1.0f) > 0.94f || alwaysDo ) { addElectricityArgStruct_t p; @@ -7898,7 +7898,7 @@ static void CG_ForceElectrocution( centity_t *cent, const vec3_t origin, vec3_t VectorCopy(rgb, p.eRGB); p.rgbParm = 0.0f; p.chaos = 5.0f; - p.killTime = (random() * 50 + 100); + p.killTime = (Q_flrand(0.0f, 1.0f) * 50 + 100); p.shader = shader; p.flags = (0x00000001 | 0x00000100 | 0x02000000 | 0x04000000 | 0x01000000); @@ -7910,7 +7910,7 @@ static void CG_ForceElectrocution( centity_t *cent, const vec3_t origin, vec3_t 1.5f, 4.0f, 0.0f, 1.0f, 0.5f, 0.0f, rgb, rgb, 0.0f, - 5.5f, random() * 50 + 100, shader, FX_ALPHA_LINEAR | FX_SIZE_LINEAR | FX_BRANCH | FX_GROW | FX_TAPER ); + 5.5f, Q_flrand(0.0f, 1.0f) * 50 + 100, shader, FX_ALPHA_LINEAR | FX_SIZE_LINEAR | FX_BRANCH | FX_GROW | FX_TAPER ); */ } } @@ -10903,7 +10903,7 @@ void CG_Player( centity_t *cent ) { legs.shaderRGBA[0] = 255; legs.shaderRGBA[1] = 255; legs.shaderRGBA[2] = 255; - legs.shaderRGBA[3] = 10.0f+(sin((float)(cg.time/4))*128.0f);//112.0 * ((cent->damageTime - cg.time) / MIN_SHIELD_TIME) + random()*16; + legs.shaderRGBA[3] = 10.0f+(sin((float)(cg.time/4))*128.0f);//112.0 * ((cent->damageTime - cg.time) / MIN_SHIELD_TIME) + Q_flrand(0.0f, 1.0f)*16; legs.renderfx &= ~RF_RGB_TINT; legs.renderfx &= ~RF_FORCE_ENT_ALPHA; @@ -11065,7 +11065,7 @@ void CG_Player( centity_t *cent ) { int dif = cent->currentState.emplacedOwner - cg.time; vec3_t tempAngles; - if ( dif > 0 && random() > 0.4f ) + if ( dif > 0 && Q_flrand(0.0f, 1.0f) > 0.4f ) { // fade out over the last 500 ms int brightness = 255; @@ -11093,7 +11093,7 @@ void CG_Player( centity_t *cent ) { trap->R_AddRefEntityToScene( &legs ); - if ( random() > 0.9f ) + if ( Q_flrand(0.0f, 1.0f) > 0.9f ) trap->S_StartSound ( NULL, cent->currentState.number, CHAN_AUTO, cgs.media.crackleSound ); } diff --git a/codemp/cgame/cg_view.c b/codemp/cgame/cg_view.c index 492ef371bb..c1b591ab1c 100644 --- a/codemp/cgame/cg_view.c +++ b/codemp/cgame/cg_view.c @@ -1922,14 +1922,14 @@ void CG_SE_UpdateShake( vec3_t origin, vec3_t angles ) for ( i = 0; i < 3; i++ ) { - moveDir[i] = ( crandom() * intensity ); + moveDir[i] = ( Q_flrand(-1.0f, 1.0f) * intensity ); } //Move the camera VectorAdd( origin, moveDir, origin ); for ( i=0; i < 2; i++ ) // Don't do ROLL - moveDir[i] = ( crandom() * intensity ); + moveDir[i] = ( Q_flrand(-1.0f, 1.0f) * intensity ); //Move the angles VectorAdd( angles, moveDir, angles ); diff --git a/codemp/cgame/cg_weapons.c b/codemp/cgame/cg_weapons.c index acf996e3a8..f6f191e0e9 100644 --- a/codemp/cgame/cg_weapons.c +++ b/codemp/cgame/cg_weapons.c @@ -656,7 +656,7 @@ Ghoul2 Insert End } } - val += random() * 0.5f; + val += Q_flrand(0.0f, 1.0f) * 0.5f; VectorCopy(flashorigin, fxSArgs.origin); VectorClear(fxSArgs.vel); @@ -665,13 +665,13 @@ Ghoul2 Insert End fxSArgs.dscale = 0.0f; fxSArgs.sAlpha = 0.7f; fxSArgs.eAlpha = 0.7f; - fxSArgs.rotation = random()*360; + fxSArgs.rotation = Q_flrand(0.0f, 1.0f)*360; fxSArgs.bounce = 0.0f; fxSArgs.life = 1.0f; fxSArgs.shader = shader; fxSArgs.flags = 0x08000000; - //FX_AddSprite( flash.origin, NULL, NULL, 3.0f * val, 0.0f, 0.7f, 0.7f, WHITE, WHITE, random() * 360, 0.0f, 1.0f, shader, FX_USE_ALPHA ); + //FX_AddSprite( flash.origin, NULL, NULL, 3.0f * val, 0.0f, 0.7f, 0.7f, WHITE, WHITE, Q_flrand(0.0f, 1.0f) * 360, 0.0f, 1.0f, shader, FX_USE_ALPHA ); trap->FX_AddSprite(&fxSArgs); } diff --git a/codemp/cgame/fx_demp2.c b/codemp/cgame/fx_demp2.c index 374c334533..ff06911d19 100644 --- a/codemp/cgame/fx_demp2.c +++ b/codemp/cgame/fx_demp2.c @@ -88,7 +88,7 @@ void FX_DEMP2_AltBeam( vec3_t start, vec3_t end, vec3_t normal, //qboolean spark VectorMA( start, 0.6666f * len, dir, c2 ); // get some chaos values that really aren't very chaotic :) - s1 = sin( cg.time * 0.005f ) * 2 + crandom() * 0.2f; + s1 = sin( cg.time * 0.005f ) * 2 + Q_flrand(-1.0f, 1.0f) * 0.2f; s2 = sin( cg.time * 0.001f ); s3 = sin( cg.time * 0.011f ); @@ -122,10 +122,10 @@ void FX_DEMP2_AltBeam( vec3_t start, vec3_t end, vec3_t normal, //qboolean spark chaos, chaos, 0.0f, 1.0f, trap->R_RegisterShader( "gfx/misc/electric2" ), FX_ALPHA_LINEAR ); - s1 = sin( cg.time * 0.0005f ) + crandom() * 0.1f; + s1 = sin( cg.time * 0.0005f ) + Q_flrand(-1.0f, 1.0f) * 0.1f; s2 = sin( cg.time * 0.0025f ); float cc2 = cos( cg.time * 0.0025f ); - s3 = sin( cg.time * 0.01f ) + crandom() * 0.1f; + s3 = sin( cg.time * 0.01f ) + Q_flrand(-1.0f, 1.0f) * 0.1f; VectorSet( chaos, len * 0.08f * s2, len * 0.04f * cc2,//s1 * -s3, @@ -160,14 +160,14 @@ void FX_DEMP2_AltBeam( vec3_t start, vec3_t end, vec3_t normal, //qboolean spark VectorMA( start, 14.0f, dir, c1 ); - FX_AddSprite( c1, NULL, NULL, 12.0f + crandom() * 4, 0.0f, 1.0f, 1.0f, random() * 360, 0.0f, 1.0f, + FX_AddSprite( c1, NULL, NULL, 12.0f + Q_flrand(-1.0f, 1.0f) * 4, 0.0f, 1.0f, 1.0f, Q_flrand(0.0f, 1.0f) * 360, 0.0f, 1.0f, trap->R_RegisterShader( "gfx/misc/lightningFlash" )); - FX_AddSprite( c1, NULL, NULL, 6.0f + crandom() * 2, 0.0f, 1.0f, 1.0f, random() * 360, 0.0f, 1.0f, + FX_AddSprite( c1, NULL, NULL, 6.0f + Q_flrand(-1.0f, 1.0f) * 2, 0.0f, 1.0f, 1.0f, Q_flrand(0.0f, 1.0f) * 360, 0.0f, 1.0f, trap->R_RegisterShader( "gfx/misc/lightningFlash" )); - FX_AddSprite( targ1, NULL, NULL, 4.0f + crandom(), 0.0f, 1.0f, 0.0f, chaos, chaos, random() * 360, 0.0f, 10, + FX_AddSprite( targ1, NULL, NULL, 4.0f + Q_flrand(-1.0f, 1.0f), 0.0f, 1.0f, 0.0f, chaos, chaos, Q_flrand(0.0f, 1.0f) * 360, 0.0f, 10, trap->R_RegisterShader( "gfx/misc/lightningFlash" )); - FX_AddSprite( targ1, NULL, NULL, 8.0f + crandom() * 2, 0.0f, 1.0f, 0.0f, chaos, chaos, random() * 360, 0.0f, 10, + FX_AddSprite( targ1, NULL, NULL, 8.0f + Q_flrand(-1.0f, 1.0f) * 2, 0.0f, 1.0f, 0.0f, chaos, chaos, Q_flrand(0.0f, 1.0f) * 360, 0.0f, 10, trap->R_RegisterShader( "gfx/misc/lightningFlash" )); @@ -181,7 +181,7 @@ void FX_DEMP2_AltBeam( vec3_t start, vec3_t end, vec3_t normal, //qboolean spark VectorMA( targ1, 0.6666f * len, dir, c2 ); // get some chaos values that really aren't very chaotic :) - s1 = sin( cg.time * 0.005f ) * 2 + crandom() * 0.2f; + s1 = sin( cg.time * 0.005f ) * 2 + Q_flrand(-1.0f, 1.0f) * 0.2f; s2 = sin( cg.time * 0.001f ); s3 = sin( cg.time * 0.011f ); @@ -215,10 +215,10 @@ void FX_DEMP2_AltBeam( vec3_t start, vec3_t end, vec3_t normal, //qboolean spark chaos, chaos, 0.0f, 1.0f, trap->R_RegisterShader( "gfx/misc/electric2" ), FX_ALPHA_LINEAR ); - s1 = sin( cg.time * 0.0005f ) + crandom() * 0.1f; + s1 = sin( cg.time * 0.0005f ) + Q_flrand(-1.0f, 1.0f) * 0.1f; s2 = sin( cg.time * 0.0025f ); cc2 = cos( cg.time * 0.0025f ); - s3 = sin( cg.time * 0.01f ) + crandom() * 0.1f; + s3 = sin( cg.time * 0.01f ) + Q_flrand(-1.0f, 1.0f) * 0.1f; VectorSet( chaos, len * 0.08f * s2, len * 0.04f * cc2,//s1 * -s3, @@ -251,9 +251,9 @@ void FX_DEMP2_AltBeam( vec3_t start, vec3_t end, vec3_t normal, //qboolean spark 1.0f, trap->R_RegisterShader( "gfx/misc/electric2" ), FX_ALPHA_LINEAR ); - FX_AddSprite( targ2, NULL, NULL, 4.0f + crandom(), 0.0f, 1.0f, 0.0f, chaos, chaos, random() * 360, 0.0f, 10, + FX_AddSprite( targ2, NULL, NULL, 4.0f + Q_flrand(-1.0f, 1.0f), 0.0f, 1.0f, 0.0f, chaos, chaos, Q_flrand(0.0f, 1.0f) * 360, 0.0f, 10, trap->R_RegisterShader( "gfx/misc/lightningFlash" )); - FX_AddSprite( targ2, NULL, NULL, 8.0f + crandom() * 2, 0.0f, 1.0f, 0.0f, chaos, chaos, random() * 360, 0.0f, 10, + FX_AddSprite( targ2, NULL, NULL, 8.0f + Q_flrand(-1.0f, 1.0f) * 2, 0.0f, 1.0f, 0.0f, chaos, chaos, Q_flrand(0.0f, 1.0f) * 360, 0.0f, 10, trap->R_RegisterShader( "gfx/misc/lightningFlash" )); */ } diff --git a/codemp/game/NPC_AI_Default.c b/codemp/game/NPC_AI_Default.c index debb988269..f8050a5245 100644 --- a/codemp/game/NPC_AI_Default.c +++ b/codemp/game/NPC_AI_Default.c @@ -115,8 +115,8 @@ qboolean NPC_StandTrackAndShoot (gentity_t *NPC, qboolean canDuck) { if ( NPC->health < 20 ) { - // if( NPC->svFlags&SVF_HEALING || random() ) - if( random() ) + // if( NPC->svFlags&SVF_HEALING || Q_flrand(0.0f, 1.0f) ) + if( Q_flrand(0.0f, 1.0f) ) { duck_ok = qtrue; } @@ -203,7 +203,7 @@ void NPC_BSStandGuard (void) //FIXME: Use Snapshot info if ( NPCS.NPC->enemy == NULL ) {//Possible to pick one up by being shot - if( random() < 0.5 ) + if( Q_flrand(0.0f, 1.0f) < 0.5 ) { if(NPCS.NPC->client->enemyTeam) { diff --git a/codemp/game/NPC_AI_Droid.c b/codemp/game/NPC_AI_Droid.c index 70f869c842..4491e4bbcd 100644 --- a/codemp/game/NPC_AI_Droid.c +++ b/codemp/game/NPC_AI_Droid.c @@ -306,7 +306,7 @@ void NPC_Droid_Pain(gentity_t *self, gentity_t *attacker, int damage) pain_chance = NPC_GetPainChance( self, damage ); // Put it in pain - if ( mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT || random() < pain_chance ) // Spin around in pain? Demp2 always does this + if ( mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT || Q_flrand(0.0f, 1.0f) < pain_chance ) // Spin around in pain? Demp2 always does this { // Health is between 0-30 or was hit by a DEMP2 so pop his head if ( !self->s.m_iVehicleNum @@ -384,7 +384,7 @@ void NPC_Droid_Pain(gentity_t *self, gentity_t *attacker, int damage) pain_chance = NPC_GetPainChance( self, damage ); - if ( mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT || random() < pain_chance ) // Spin around in pain? Demp2 always does this + if ( mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT || Q_flrand(0.0f, 1.0f) < pain_chance ) // Spin around in pain? Demp2 always does this { // Health is between 0-30 or was hit by a DEMP2 so pop his head if ( !self->s.m_iVehicleNum @@ -630,7 +630,7 @@ void NPC_BSDroid_Default( void ) else if ( NPCS.NPCInfo->localState == LSTATE_DROP ) { NPC_UpdateAngles( qtrue, qtrue ); - NPCS.ucmd.upmove = crandom() * 64; + NPCS.ucmd.upmove = Q_flrand(-1.0f, 1.0f) * 64; } else if ( NPCS.NPCInfo->scriptFlags & SCF_LOOK_FOR_ENEMIES ) { diff --git a/codemp/game/NPC_AI_GalakMech.c b/codemp/game/NPC_AI_GalakMech.c index 45a42bf620..b8fd462f7c 100644 --- a/codemp/game/NPC_AI_GalakMech.c +++ b/codemp/game/NPC_AI_GalakMech.c @@ -1059,9 +1059,9 @@ void NPC_BSGM_Attack( void ) VectorCopy( NPCS.NPC->enemy->r.currentOrigin, target ); - target[0] += flrand( -5, 5 )+(crandom()*(6-NPCS.NPCInfo->currentAim)*2); - target[1] += flrand( -5, 5 )+(crandom()*(6-NPCS.NPCInfo->currentAim)*2); - target[2] += flrand( -5, 5 )+(crandom()*(6-NPCS.NPCInfo->currentAim)*2); + target[0] += flrand( -5, 5 )+(Q_flrand(-1.0f, 1.0f)*(6-NPCS.NPCInfo->currentAim)*2); + target[1] += flrand( -5, 5 )+(Q_flrand(-1.0f, 1.0f)*(6-NPCS.NPCInfo->currentAim)*2); + target[2] += flrand( -5, 5 )+(Q_flrand(-1.0f, 1.0f)*(6-NPCS.NPCInfo->currentAim)*2); //Find the desired angles clearshot = WP_LobFire( NPCS.NPC, muzzle, target, mins, maxs, MASK_SHOT|CONTENTS_LIGHTSABER, diff --git a/codemp/game/NPC_AI_Howler.c b/codemp/game/NPC_AI_Howler.c index 477e3143b6..1d0df9d69d 100644 --- a/codemp/game/NPC_AI_Howler.c +++ b/codemp/game/NPC_AI_Howler.c @@ -72,7 +72,7 @@ void Howler_Patrol( void ) { if ( TIMER_Done( NPCS.NPC, "patrolTime" )) { - TIMER_Set( NPCS.NPC, "patrolTime", crandom() * 5000 + 5000 ); + TIMER_Set( NPCS.NPC, "patrolTime", Q_flrand(-1.0f, 1.0f) * 5000 + 5000 ); } } @@ -136,7 +136,7 @@ void Howler_Attack( void ) if ( !TIMER_Exists( NPCS.NPC, "attacking" )) { // Going to do ATTACK1 - TIMER_Set( NPCS.NPC, "attacking", 1700 + random() * 200 ); + TIMER_Set( NPCS.NPC, "attacking", 1700 + Q_flrand(0.0f, 1.0f) * 200 ); NPC_SetAnim( NPCS.NPC, SETANIM_BOTH, BOTH_ATTACK1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD ); TIMER_Set( NPCS.NPC, "attack_dmg", 200 ); // level two damage diff --git a/codemp/game/NPC_AI_ImperialProbe.c b/codemp/game/NPC_AI_ImperialProbe.c index c016040057..ecfa3a6392 100644 --- a/codemp/game/NPC_AI_ImperialProbe.c +++ b/codemp/game/NPC_AI_ImperialProbe.c @@ -213,7 +213,7 @@ void ImperialProbe_Strafe( void ) // Set the strafe start time so we can do a controlled roll //NPC->fx_time = level.time; - NPCS.NPCInfo->standTime = level.time + 3000 + random() * 500; + NPCS.NPCInfo->standTime = level.time + 3000 + Q_flrand(0.0f, 1.0f) * 500; } } @@ -496,7 +496,7 @@ void NPC_Probe_Pain(gentity_t *self, gentity_t *attacker, int damage) { pain_chance = NPC_GetPainChance( self, damage ); - if ( random() < pain_chance ) // Spin around in pain? + if ( Q_flrand(0.0f, 1.0f) < pain_chance ) // Spin around in pain? { NPC_SetAnim( self, SETANIM_BOTH, BOTH_PAIN1, SETANIM_FLAG_OVERRIDE); } diff --git a/codemp/game/NPC_AI_Interrogator.c b/codemp/game/NPC_AI_Interrogator.c index 74040a60dd..722c935f80 100644 --- a/codemp/game/NPC_AI_Interrogator.c +++ b/codemp/game/NPC_AI_Interrogator.c @@ -296,7 +296,7 @@ void Interrogator_Strafe( void ) // Set the strafe start time //NPCS.NPC->fx_time = level.time; - NPCS.NPCInfo->standTime = level.time + 3000 + random() * 500; + NPCS.NPCInfo->standTime = level.time + 3000 + Q_flrand(0.0f, 1.0f) * 500; } } diff --git a/codemp/game/NPC_AI_MineMonster.c b/codemp/game/NPC_AI_MineMonster.c index 05977d9f81..3c801728d1 100644 --- a/codemp/game/NPC_AI_MineMonster.c +++ b/codemp/game/NPC_AI_MineMonster.c @@ -85,7 +85,7 @@ void MineMonster_Patrol( void ) { if ( TIMER_Done( NPCS.NPC, "patrolTime" )) { - TIMER_Set( NPCS.NPC, "patrolTime", crandom() * 5000 + 5000 ); + TIMER_Set( NPCS.NPC, "patrolTime", Q_flrand(-1.0f, 1.0f) * 5000 + 5000 ); } } @@ -154,18 +154,18 @@ void MineMonster_Attack( void ) if ( !TIMER_Exists( NPCS.NPC, "attacking" )) { // usually try and play a jump attack if the player somehow got above them....or just really rarely - if ( NPCS.NPC->enemy && ((NPCS.NPC->enemy->r.currentOrigin[2] - NPCS.NPC->r.currentOrigin[2] > 10 && random() > 0.1f ) - || random() > 0.8f )) + if ( NPCS.NPC->enemy && ((NPCS.NPC->enemy->r.currentOrigin[2] - NPCS.NPC->r.currentOrigin[2] > 10 && Q_flrand(0.0f, 1.0f) > 0.1f ) + || Q_flrand(0.0f, 1.0f) > 0.8f )) { // Going to do ATTACK4 - TIMER_Set( NPCS.NPC, "attacking", 1750 + random() * 200 ); + TIMER_Set( NPCS.NPC, "attacking", 1750 + Q_flrand(0.0f, 1.0f) * 200 ); NPC_SetAnim( NPCS.NPC, SETANIM_BOTH, BOTH_ATTACK4, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD ); TIMER_Set( NPCS.NPC, "attack2_dmg", 950 ); // level two damage } - else if ( random() > 0.5f ) + else if ( Q_flrand(0.0f, 1.0f) > 0.5f ) { - if ( random() > 0.8f ) + if ( Q_flrand(0.0f, 1.0f) > 0.8f ) { // Going to do ATTACK3, (rare) TIMER_Set( NPCS.NPC, "attacking", 850 ); diff --git a/codemp/game/NPC_AI_Rancor.c b/codemp/game/NPC_AI_Rancor.c index b89fc8fb60..0fb5834bf9 100644 --- a/codemp/game/NPC_AI_Rancor.c +++ b/codemp/game/NPC_AI_Rancor.c @@ -112,7 +112,7 @@ void Rancor_Patrol( void ) { if ( TIMER_Done( NPCS.NPC, "patrolTime" )) { - TIMER_Set( NPCS.NPC, "patrolTime", crandom() * 5000 + 5000 ); + TIMER_Set( NPCS.NPC, "patrolTime", Q_flrand(-1.0f, 1.0f) * 5000 + 5000 ); } } @@ -499,7 +499,7 @@ void Rancor_Attack( float distance, qboolean doCharge ) TIMER_Set( NPCS.NPC, "attack_dmg", 1000 ); } - TIMER_Set( NPCS.NPC, "attacking", NPCS.NPC->client->ps.legsTimer + random() * 200 ); + TIMER_Set( NPCS.NPC, "attacking", NPCS.NPC->client->ps.legsTimer + Q_flrand(0.0f, 1.0f) * 200 ); } // Need to do delayed damage since the attack animations encapsulate multiple mini-attacks diff --git a/codemp/game/NPC_AI_Remote.c b/codemp/game/NPC_AI_Remote.c index 79d79830f0..c4fb53f1aa 100644 --- a/codemp/game/NPC_AI_Remote.c +++ b/codemp/game/NPC_AI_Remote.c @@ -185,7 +185,7 @@ void Remote_Strafe( void ) // Set the strafe start time so we can do a controlled roll // NPC->fx_time = level.time; - NPCS.NPCInfo->standTime = level.time + 3000 + random() * 500; + NPCS.NPCInfo->standTime = level.time + 3000 + Q_flrand(0.0f, 1.0f) * 500; } } diff --git a/codemp/game/NPC_AI_Seeker.c b/codemp/game/NPC_AI_Seeker.c index 899ecb6ab5..47864259aa 100644 --- a/codemp/game/NPC_AI_Seeker.c +++ b/codemp/game/NPC_AI_Seeker.c @@ -176,7 +176,7 @@ void Seeker_Strafe( void ) vec3_t end, right, dir; trace_t tr; - if ( random() > 0.7f || !NPCS.NPC->enemy || !NPCS.NPC->enemy->client ) + if ( Q_flrand(0.0f, 1.0f) > 0.7f || !NPCS.NPC->enemy || !NPCS.NPC->enemy->client ) { // Do a regular style strafe AngleVectors( NPCS.NPC->client->renderInfo.eyeAngles, NULL, right, NULL ); @@ -206,7 +206,7 @@ void Seeker_Strafe( void ) // Add a slight upward push NPCS.NPC->client->ps.velocity[2] += upPush; - NPCS.NPCInfo->standTime = level.time + 1000 + random() * 500; + NPCS.NPCInfo->standTime = level.time + 1000 + Q_flrand(0.0f, 1.0f) * 500; } } else @@ -226,7 +226,7 @@ void Seeker_Strafe( void ) VectorMA( NPCS.NPC->enemy->r.currentOrigin, stDis * side, right, end ); // then add a very small bit of random in front of/behind the player action - VectorMA( end, crandom() * 25, dir, end ); + VectorMA( end, Q_flrand(-1.0f, 1.0f) * 25, dir, end ); trap->Trace( &tr, NPCS.NPC->r.currentOrigin, NULL, NULL, end, NPCS.NPC->s.number, MASK_SOLID, qfalse, 0, 0 ); @@ -255,7 +255,7 @@ void Seeker_Strafe( void ) // Add a slight upward push NPCS.NPC->client->ps.velocity[2] += upPush; - NPCS.NPCInfo->standTime = level.time + 2500 + random() * 500; + NPCS.NPCInfo->standTime = level.time + 2500 + Q_flrand(0.0f, 1.0f) * 500; } } } @@ -450,7 +450,7 @@ void Seeker_FindEnemy( void ) if ( best ) { // used to offset seekers around a circle so they don't occupy the same spot. This is not a fool-proof method. - NPCS.NPC->random = random() * 6.3f; // roughly 2pi + NPCS.NPC->random = Q_flrand(0.0f, 1.0f) * 6.3f; // roughly 2pi NPCS.NPC->enemy = best; } @@ -518,7 +518,7 @@ void Seeker_FollowOwner( void ) { if ( TIMER_Done( NPCS.NPC, "seekerhiss" )) { - TIMER_Set( NPCS.NPC, "seekerhiss", 1000 + random() * 1000 ); + TIMER_Set( NPCS.NPC, "seekerhiss", 1000 + Q_flrand(0.0f, 1.0f) * 1000 ); G_Sound( NPCS.NPC, CHAN_AUTO, G_SoundIndex( "sound/chars/seeker/misc/hiss" )); } } @@ -570,7 +570,7 @@ void NPC_BSSeeker_Default( void ) if ( NPCS.NPC->random == 0.0f ) { // used to offset seekers around a circle so they don't occupy the same spot. This is not a fool-proof method. - NPCS.NPC->random = random() * 6.3f; // roughly 2pi + NPCS.NPC->random = Q_flrand(0.0f, 1.0f) * 6.3f; // roughly 2pi } if ( NPCS.NPC->enemy && NPCS.NPC->enemy->health && NPCS.NPC->enemy->inuse ) diff --git a/codemp/game/NPC_AI_Sentry.c b/codemp/game/NPC_AI_Sentry.c index 98d28a9d62..f0ff05cac9 100644 --- a/codemp/game/NPC_AI_Sentry.c +++ b/codemp/game/NPC_AI_Sentry.c @@ -379,7 +379,7 @@ void Sentry_Strafe( void ) // Set the strafe start time so we can do a controlled roll // NPC->fx_time = level.time; - NPCS.NPCInfo->standTime = level.time + 3000 + random() * 500; + NPCS.NPCInfo->standTime = level.time + 3000 + Q_flrand(0.0f, 1.0f) * 500; } } diff --git a/codemp/game/NPC_AI_Stormtrooper.c b/codemp/game/NPC_AI_Stormtrooper.c index 9818da68ea..131077e28e 100644 --- a/codemp/game/NPC_AI_Stormtrooper.c +++ b/codemp/game/NPC_AI_Stormtrooper.c @@ -143,7 +143,7 @@ enum static void ST_Speech( gentity_t *self, int speechType, float failChance ) { - if ( random() < failChance ) + if ( Q_flrand(0.0f, 1.0f) < failChance ) { return; } diff --git a/codemp/game/NPC_AI_Wampa.c b/codemp/game/NPC_AI_Wampa.c index df9ea97d13..34f4afb3ca 100644 --- a/codemp/game/NPC_AI_Wampa.c +++ b/codemp/game/NPC_AI_Wampa.c @@ -127,7 +127,7 @@ void Wampa_Patrol( void ) { if ( TIMER_Done( NPCS.NPC, "patrolTime" )) { - TIMER_Set( NPCS.NPC, "patrolTime", crandom() * 5000 + 5000 ); + TIMER_Set( NPCS.NPC, "patrolTime", Q_flrand(-1.0f, 1.0f) * 5000 + 5000 ); } } @@ -311,7 +311,7 @@ void Wampa_Attack( float distance, qboolean doCharge ) TIMER_Set( NPCS.NPC, "attack_dmg", 250 ); } - TIMER_Set( NPCS.NPC, "attacking", NPCS.NPC->client->ps.legsTimer + random() * 200 ); + TIMER_Set( NPCS.NPC, "attacking", NPCS.NPC->client->ps.legsTimer + Q_flrand(0.0f, 1.0f) * 200 ); //allow us to re-evaluate our running speed/anim TIMER_Set( NPCS.NPC, "runfar", -1 ); TIMER_Set( NPCS.NPC, "runclose", -1 ); diff --git a/codemp/game/NPC_behavior.c b/codemp/game/NPC_behavior.c index 4e54f975bd..cc08a64040 100644 --- a/codemp/game/NPC_behavior.c +++ b/codemp/game/NPC_behavior.c @@ -157,13 +157,13 @@ void NPC_BSAdvanceFight (void) VectorMA ( muzzle, distanceToEnemy, forward, hitspot); VectorSubtract(hitspot, enemy_org, diff); aim_off = VectorLength(diff); - if(aim_off > random() * max_aim_off)//FIXME: use aim value to allow poor aim? + if(aim_off > Q_flrand(0.0f, 1.0f) * max_aim_off)//FIXME: use aim value to allow poor aim? { attack_scale *= 0.75; //see if where we're going to shoot is too far from his head VectorSubtract(hitspot, enemy_head, diff); aim_off = VectorLength(diff); - if(aim_off > random() * max_aim_off) + if(aim_off > Q_flrand(0.0f, 1.0f) * max_aim_off) { attack_ok = qfalse; } diff --git a/codemp/game/NPC_combat.c b/codemp/game/NPC_combat.c index f5155b85ea..7b855edc0c 100644 --- a/codemp/game/NPC_combat.c +++ b/codemp/game/NPC_combat.c @@ -1160,7 +1160,7 @@ qboolean CanShoot ( gentity_t *ent, gentity_t *shooter ) //Actually, we should just check to fire in dir we're facing and if it's close enough, //and we didn't hit someone on our own team, shoot VectorSubtract(spot, tr.endpos, diff); - if(VectorLength(diff) < random() * 32) + if(VectorLength(diff) < Q_flrand(0.0f, 1.0f) * 32) { return qtrue; } @@ -2218,7 +2218,7 @@ qboolean NPC_CheckDefend (float scale) if(!scale) scale = 1.0; - if((float)(NPCS.NPCInfo->stats.evasion) > random() * 4 * scale) + if((float)(NPCS.NPCInfo->stats.evasion) > Q_flrand(0.0f, 1.0f) * 4 * scale) return qtrue; return qfalse; @@ -2394,13 +2394,13 @@ qboolean NPC_CheckCanAttack (float attack_scale, qboolean stationary) VectorMA ( muzzle, distanceToEnemy, forward, hitspot); VectorSubtract(hitspot, enemy_org, diff); aim_off = VectorLength(diff); - if(aim_off > random() * max_aim_off)//FIXME: use aim value to allow poor aim? + if(aim_off > Q_flrand(0.0f, 1.0f) * max_aim_off)//FIXME: use aim value to allow poor aim? { attack_scale *= 0.75; //see if where we're going to shoot is too far from his head VectorSubtract(hitspot, enemy_org, diff); aim_off = VectorLength(diff); - if(aim_off > random() * max_aim_off) + if(aim_off > Q_flrand(0.0f, 1.0f) * max_aim_off) { attack_ok = qfalse; } diff --git a/codemp/game/NPC_reactions.c b/codemp/game/NPC_reactions.c index 65163380c2..48c60b411d 100644 --- a/codemp/game/NPC_reactions.c +++ b/codemp/game/NPC_reactions.c @@ -138,7 +138,7 @@ static void NPC_CheckAttacker( gentity_t *other, int mod ) } //Randomly pick up the target - if ( random() > luckThreshold ) + if ( Q_flrand(0.0f, 1.0f) > luckThreshold ) { G_ClearEnemy( other ); other->enemy = NPCS.NPC; @@ -285,7 +285,7 @@ void NPC_ChoosePainAnimation( gentity_t *self, gentity_t *other, vec3_t point, i } //See if we're going to flinch - if ( random() < pain_chance ) + if ( Q_flrand(0.0f, 1.0f) < pain_chance ) { int animLength; diff --git a/codemp/game/NPC_utils.c b/codemp/game/NPC_utils.c index 39985104d8..f811e75894 100644 --- a/codemp/game/NPC_utils.c +++ b/codemp/game/NPC_utils.c @@ -395,7 +395,7 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) //Snap to if(fabs(error) > 10) { - if(random() > 0.6) + if(Q_flrand(0.0f, 1.0f) > 0.6) { doSound = qtrue; } @@ -469,7 +469,7 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) //Snap to if(fabs(error) > 10) { - if(random() > 0.6) + if(Q_flrand(0.0f, 1.0f) > 0.6) { doSound = qtrue; } diff --git a/codemp/game/g_bot.c b/codemp/game/g_bot.c index ed8459a803..474370b3cb 100644 --- a/codemp/game/g_bot.c +++ b/codemp/game/g_bot.c @@ -451,7 +451,7 @@ void G_AddRandomBot( int team ) { num++; } } - num = random() * num; + num = Q_flrand(0.0f, 1.0f) * num; for ( n = 0; n < level.bots.num ; n++ ) { value = Info_ValueForKey( level.bots.infos[n], "name" ); // diff --git a/codemp/game/g_client.c b/codemp/game/g_client.c index 80cc113488..46fcdc9b51 100644 --- a/codemp/game/g_client.c +++ b/codemp/game/g_client.c @@ -791,7 +791,7 @@ gentity_t *SelectRandomFurthestSpawnPoint ( vec3_t avoidPoint, vec3_t origin, ve } // select a random spot from the spawn points furthest away - rnd = random() * (numSpots / 2); + rnd = Q_flrand(0.0f, 1.0f) * (numSpots / 2); VectorCopy (list_spot[rnd]->s.origin, origin); origin[2] += 9; @@ -884,7 +884,7 @@ gentity_t *SelectDuelSpawnPoint( int team, vec3_t avoidPoint, vec3_t origin, vec } // select a random spot from the spawn points furthest away - rnd = random() * (numSpots / 2); + rnd = Q_flrand(0.0f, 1.0f) * (numSpots / 2); VectorCopy (list_spot[rnd]->s.origin, origin); origin[2] += 9; diff --git a/codemp/game/g_items.c b/codemp/game/g_items.c index 074b4df394..14d76df705 100644 --- a/codemp/game/g_items.c +++ b/codemp/game/g_items.c @@ -648,7 +648,7 @@ static qboolean pas_find_enemies( gentity_t *self ) G_Sound( self, CHAN_BODY, G_SoundIndex( "sound/chars/turret/startup.wav" )); // Wind up turrets for a bit - self->attackDebounceTime = level.time + 900 + random() * 200; + self->attackDebounceTime = level.time + 900 + Q_flrand(0.0f, 1.0f) * 200; } G_SetEnemy( self, target ); @@ -702,7 +702,7 @@ void pas_adjust_enemy( gentity_t *ent ) if ( keep ) { - //ent->bounceCount = level.time + 500 + random() * 150; + //ent->bounceCount = level.time + 500 + Q_flrand(0.0f, 1.0f) * 150; } else if ( ent->bounceCount < level.time && ent->enemy ) // don't ping pong on and off { @@ -710,7 +710,7 @@ void pas_adjust_enemy( gentity_t *ent ) // shut-down sound G_Sound( ent, CHAN_BODY, G_SoundIndex( "sound/chars/turret/shutdown.wav" )); - ent->bounceCount = level.time + 500 + random() * 150; + ent->bounceCount = level.time + 500 + Q_flrand(0.0f, 1.0f) * 150; // make turret play ping sound for 5 seconds ent->aimDebounceTime = level.time + 5000; @@ -2633,7 +2633,7 @@ void Touch_Item (gentity_t *ent, gentity_t *other, trace_t *trace) { // random can be used to vary the respawn time if ( ent->random ) { - respawn += crandom() * ent->random; + respawn += Q_flrand(-1.0f, 1.0f) * ent->random; if ( respawn < 1 ) { respawn = 1; } @@ -2784,7 +2784,7 @@ gentity_t *Drop_Item( gentity_t *ent, gitem_t *item, float angle ) { AngleVectors( angles, velocity, NULL, NULL ); VectorScale( velocity, 150, velocity ); - velocity[2] += 200 + crandom() * 50; + velocity[2] += 200 + Q_flrand(-1.0f, 1.0f) * 50; return LaunchItem( item, ent->s.pos.trBase, velocity ); } @@ -2985,7 +2985,7 @@ void FinishSpawningItem( gentity_t *ent ) { if ( ent->item->giType == IT_POWERUP ) { float respawn; - respawn = 45 + crandom() * 15; + respawn = 45 + Q_flrand(-1.0f, 1.0f) * 15; ent->s.eFlags |= EF_NODRAW; ent->r.contents = 0; ent->nextthink = level.time + respawn * 1000; diff --git a/codemp/game/g_misc.c b/codemp/game/g_misc.c index 1a1dcbbac2..ef182490ce 100644 --- a/codemp/game/g_misc.c +++ b/codemp/game/g_misc.c @@ -1172,10 +1172,10 @@ void Use_Shooter( gentity_t *ent, gentity_t *other, gentity_t *activator ) { PerpendicularVector( up, dir ); CrossProduct( up, dir, right ); - deg = crandom() * ent->random; + deg = Q_flrand(-1.0f, 1.0f) * ent->random; VectorMA( dir, deg, up, dir ); - deg = crandom() * ent->random; + deg = Q_flrand(-1.0f, 1.0f) * ent->random; VectorMA( dir, deg, right, dir ); VectorNormalize( dir ); @@ -2332,7 +2332,7 @@ void fx_runner_think( gentity_t *ent ) VectorCopy(ent->r.currentAngles, ent->s.angles); VectorCopy(ent->r.currentOrigin, ent->s.origin); - ent->nextthink = level.time + ent->delay + random() * ent->random; + ent->nextthink = level.time + ent->delay + Q_flrand(0.0f, 1.0f) * ent->random; if ( ent->spawnflags & 4 ) // damage { diff --git a/codemp/game/g_mover.c b/codemp/game/g_mover.c index 4db30f45b8..105aa92132 100644 --- a/codemp/game/g_mover.c +++ b/codemp/game/g_mover.c @@ -2447,7 +2447,7 @@ void funcBBrushDieGo (gentity_t *self) VectorSubtract( self->r.absmax, self->r.absmin, org );// size - numChunks = random() * 6 + 18; + numChunks = Q_flrand(0.0f, 1.0f) * 6 + 18; // This formula really has no logical basis other than the fact that it seemed to be the closest to yielding the results that I wanted. // Volume is length * width * height...then break that volume down based on how many chunks we have diff --git a/codemp/game/g_nav.c b/codemp/game/g_nav.c index dadff7f035..7302127f8a 100644 --- a/codemp/game/g_nav.c +++ b/codemp/game/g_nav.c @@ -121,7 +121,7 @@ void NPC_Blocked( gentity_t *self, gentity_t *blocker ) //G_AddVoiceEvent( self, Q_irand(EV_BLOCKED1, EV_BLOCKED3), 0 ); } - self->NPC->blockedSpeechDebounceTime = level.time + MIN_BLOCKED_SPEECH_TIME + ( random() * 4000 ); + self->NPC->blockedSpeechDebounceTime = level.time + MIN_BLOCKED_SPEECH_TIME + ( Q_flrand(0.0f, 1.0f) * 4000 ); self->NPC->blockingEntNum = blocker->s.number; } diff --git a/codemp/game/g_navnew.c b/codemp/game/g_navnew.c index c937755d9a..395ff598d3 100644 --- a/codemp/game/g_navnew.c +++ b/codemp/game/g_navnew.c @@ -68,7 +68,7 @@ void NPC_SetBlocked( gentity_t *self, gentity_t *blocker ) return; //self->NPC->aiFlags |= NPCAI_BLOCKED; - self->NPC->blockedSpeechDebounceTime = level.time + MIN_BLOCKED_SPEECH_TIME + ( random() * 4000 ); + self->NPC->blockedSpeechDebounceTime = level.time + MIN_BLOCKED_SPEECH_TIME + ( Q_flrand(0.0f, 1.0f) * 4000 ); self->NPC->blockingEntNum = blocker->s.number; } diff --git a/codemp/game/g_target.c b/codemp/game/g_target.c index 2e2b1f721e..84aeb0fe0f 100644 --- a/codemp/game/g_target.c +++ b/codemp/game/g_target.c @@ -106,7 +106,7 @@ void Use_Target_Delay( gentity_t *ent, gentity_t *other, gentity_t *activator ) return; } G_ActivateBehavior(ent,BSET_USE); - ent->nextthink = level.time + ( ent->wait + ent->random * crandom() ) * 1000; + ent->nextthink = level.time + ( ent->wait + ent->random * Q_flrand(-1.0f, 1.0f) ) * 1000; ent->think = Think_Target_Delay; ent->activator = activator; } diff --git a/codemp/game/g_trigger.c b/codemp/game/g_trigger.c index 2946e1ec05..8bf0553df6 100644 --- a/codemp/game/g_trigger.c +++ b/codemp/game/g_trigger.c @@ -93,7 +93,7 @@ void multi_trigger_run( gentity_t *ent ) if ( ent->painDebounceTime != level.time ) {//first ent to touch it this frame //ent->e_ThinkFunc = thinkF_multi_wait; - ent->nextthink = level.time + ( ent->wait + ent->random * crandom() ) * 1000; + ent->nextthink = level.time + ( ent->wait + ent->random * Q_flrand(-1.0f, 1.0f) ) * 1000; ent->painDebounceTime = level.time; } } @@ -574,7 +574,7 @@ void trigger_cleared_fire (gentity_t *self) // should start the wait timer now, because the trigger's just been cleared, so we must "wait" from this point if ( self->wait > 0 ) { - self->nextthink = level.time + ( self->wait + self->random * crandom() ) * 1000; + self->nextthink = level.time + ( self->wait + self->random * Q_flrand(-1.0f, 1.0f) ) * 1000; } } @@ -1771,7 +1771,7 @@ so, the basic time between firing is a random time between void func_timer_think( gentity_t *self ) { G_UseTargets (self, self->activator); // set time before next firing - self->nextthink = level.time + 1000 * ( self->wait + crandom() * self->random ); + self->nextthink = level.time + 1000 * ( self->wait + Q_flrand(-1.0f, 1.0f) * self->random ); } void func_timer_use( gentity_t *self, gentity_t *other, gentity_t *activator ) { diff --git a/codemp/game/g_turret.c b/codemp/game/g_turret.c index 682a8bf32d..5d0c9d3b8f 100644 --- a/codemp/game/g_turret.c +++ b/codemp/game/g_turret.c @@ -43,7 +43,7 @@ void TurretPain( gentity_t *self, gentity_t *attacker, int damage ) if ( attacker->client && attacker->client->ps.weapon == WP_DEMP2 ) { - self->attackDebounceTime = level.time + 800 + random() * 500; + self->attackDebounceTime = level.time + 800 + Q_flrand(0.0f, 1.0f) * 500; self->painDebounceTime = self->attackDebounceTime; } if ( !self->enemy ) @@ -624,7 +624,7 @@ void turret_base_think( gentity_t *self ) else { // keep our enemy for a minimum of 2 seconds from now - self->bounceCount = level.time + 2000 + random() * 150; + self->bounceCount = level.time + 2000 + Q_flrand(0.0f, 1.0f) * 150; } turret_aim( self ); @@ -774,7 +774,7 @@ qboolean turret_base_spawn_top( gentity_t *base ) top->speed = 0; // this is a random time offset for the no-enemy-search-around-mode - top->count = random() * 9000; + top->count = Q_flrand(0.0f, 1.0f) * 9000; if ( !base->health ) { @@ -829,7 +829,7 @@ qboolean turret_base_spawn_top( gentity_t *base ) // How quickly to fire if ( !base->wait ) { - base->wait = 300 + random() * 55; + base->wait = 300 + Q_flrand(0.0f, 1.0f) * 55; } top->wait = base->wait; diff --git a/codemp/game/g_turret_G2.c b/codemp/game/g_turret_G2.c index cfde7602e6..5db87138c9 100644 --- a/codemp/game/g_turret_G2.c +++ b/codemp/game/g_turret_G2.c @@ -238,7 +238,7 @@ void TurretG2Pain( gentity_t *self, gentity_t *attacker, int damage ) if ( attacker->client && attacker->client->ps.weapon == WP_DEMP2 ) { - self->attackDebounceTime = level.time + 2000 + random() * 500; + self->attackDebounceTime = level.time + 2000 + Q_flrand(0.0f, 1.0f) * 500; self->painDebounceTime = self->attackDebounceTime; } if ( !self->enemy ) @@ -962,7 +962,7 @@ void turretG2_base_think( gentity_t *self ) else { // keep our enemy for a minimum of 2 seconds from now - self->bounceCount = level.time + 2000 + random() * 150; + self->bounceCount = level.time + 2000 + Q_flrand(0.0f, 1.0f) * 150; } turretG2_aim( self ); @@ -1170,7 +1170,7 @@ void finish_spawning_turretG2( gentity_t *base ) // How quickly to fire if ( !base->wait ) { - base->wait = 1000;// + random() * 500; + base->wait = 1000;// + Q_flrand(0.0f, 1.0f) * 500; } if ( !base->splashDamage ) @@ -1228,7 +1228,7 @@ void finish_spawning_turretG2( gentity_t *base ) // How quickly to fire if ( !base->wait ) { - base->wait = 150 + random() * 55; + base->wait = 150 + Q_flrand(0.0f, 1.0f) * 55; } if ( !base->splashDamage ) diff --git a/codemp/game/g_weapon.c b/codemp/game/g_weapon.c index 18e487b534..ba9b8dd1b2 100644 --- a/codemp/game/g_weapon.c +++ b/codemp/game/g_weapon.c @@ -529,8 +529,8 @@ static void WP_FireBlaster( gentity_t *ent, qboolean altFire ) if ( altFire ) { // add some slop to the alt-fire direction - angs[PITCH] += crandom() * BLASTER_SPREAD; - angs[YAW] += crandom() * BLASTER_SPREAD; + angs[PITCH] += Q_flrand(-1.0f, 1.0f) * BLASTER_SPREAD; + angs[YAW] += Q_flrand(-1.0f, 1.0f) * BLASTER_SPREAD; } AngleVectors( angs, dir, NULL, NULL ); @@ -1083,12 +1083,12 @@ static void WP_BowcasterMainFire( gentity_t *ent ) for (i = 0; i < count; i++ ) { // create a range of different velocities - vel = BOWCASTER_VELOCITY * ( crandom() * BOWCASTER_VEL_RANGE + 1.0f ); + vel = BOWCASTER_VELOCITY * ( Q_flrand(-1.0f, 1.0f) * BOWCASTER_VEL_RANGE + 1.0f ); vectoangles( forward, angs ); // add some slop to the alt-fire direction - angs[PITCH] += crandom() * BOWCASTER_ALT_SPREAD * 0.2f; + angs[PITCH] += Q_flrand(-1.0f, 1.0f) * BOWCASTER_ALT_SPREAD * 0.2f; angs[YAW] += ((i+0.5f) * BOWCASTER_ALT_SPREAD - count * 0.5f * BOWCASTER_ALT_SPREAD ); AngleVectors( angs, dir, NULL, NULL ); @@ -1204,8 +1204,8 @@ static void WP_FireRepeater( gentity_t *ent, qboolean altFire ) else { // add some slop to the alt-fire direction - angs[PITCH] += crandom() * REPEATER_SPREAD; - angs[YAW] += crandom() * REPEATER_SPREAD; + angs[PITCH] += Q_flrand(-1.0f, 1.0f) * REPEATER_SPREAD; + angs[YAW] += Q_flrand(-1.0f, 1.0f) * REPEATER_SPREAD; AngleVectors( angs, dir, NULL, NULL ); @@ -1523,8 +1523,8 @@ static void WP_FlechetteMainFire( gentity_t *ent ) if (i != 0) { //do nothing on the first shot, it will hit the crosshairs - angs[PITCH] += crandom() * FLECHETTE_SPREAD; - angs[YAW] += crandom() * FLECHETTE_SPREAD; + angs[PITCH] += Q_flrand(-1.0f, 1.0f) * FLECHETTE_SPREAD; + angs[YAW] += Q_flrand(-1.0f, 1.0f) * FLECHETTE_SPREAD; } AngleVectors( angs, fwd, NULL, NULL ); @@ -1643,7 +1643,7 @@ void WP_flechette_alt_blow( gentity_t *ent ) static void WP_CreateFlechetteBouncyThing( vec3_t start, vec3_t fwd, gentity_t *self ) //------------------------------------------------------------------------------ { - gentity_t *missile = CreateMissile( start, fwd, 700 + random() * 700, 1500 + random() * 2000, self, qtrue ); + gentity_t *missile = CreateMissile( start, fwd, 700 + Q_flrand(0.0f, 1.0f) * 700, 1500 + Q_flrand(0.0f, 1.0f) * 2000, self, qtrue ); missile->think = WP_flechette_alt_blow; @@ -1697,8 +1697,8 @@ static void WP_FlechetteAltFire( gentity_t *self ) { VectorCopy( angs, dir ); - dir[PITCH] -= random() * 4 + 8; // make it fly upwards - dir[YAW] += crandom() * 2; + dir[PITCH] -= Q_flrand(0.0f, 1.0f) * 4 + 8; // make it fly upwards + dir[YAW] += Q_flrand(-1.0f, 1.0f) * 2; AngleVectors( dir, fwd, NULL, NULL ); WP_CreateFlechetteBouncyThing( start, fwd, self ); @@ -1861,7 +1861,7 @@ void rocketThink( gentity_t *ent ) // add crazy drunkenness for (i = 0; i < 3; i++ ) { - newdir[i] += crandom() * ent->random * 0.25f; + newdir[i] += Q_flrand(-1.0f, 1.0f) * ent->random * 0.25f; } // decay the randomness @@ -2955,7 +2955,7 @@ void BlowDetpacks(gentity_t *ent) { VectorCopy( found->r.currentOrigin, found->s.origin ); found->think = DetPackBlow; - found->nextthink = level.time + 100 + random() * 200; + found->nextthink = level.time + 100 + Q_flrand(0.0f, 1.0f) * 200; G_Sound( found, CHAN_BODY, G_SoundIndex("sound/weapons/detpack/warning.wav") ); } } diff --git a/codemp/icarus/Sequencer.cpp b/codemp/icarus/Sequencer.cpp index 63d1a87003..6a21194b82 100644 --- a/codemp/icarus/Sequencer.cpp +++ b/codemp/icarus/Sequencer.cpp @@ -1174,7 +1174,7 @@ int CSequencer::EvaluateConditional( CBlock *block ) case ID_RANDOM: { float min, max; - //FIXME: This will not account for nested random() statements + //FIXME: This will not account for nested Q_flrand(0.0f, 1.0f) statements min = *(float *) block->GetMemberData( memberNum++ ); max = *(float *) block->GetMemberData( memberNum++ ); @@ -1345,7 +1345,7 @@ int CSequencer::EvaluateConditional( CBlock *block ) { float min, max; - //FIXME: This will not account for nested random() statements + //FIXME: This will not account for nested Q_flrand(0.0f, 1.0f) statements min = *(float *) block->GetMemberData( memberNum++ ); max = *(float *) block->GetMemberData( memberNum++ ); diff --git a/codemp/icarus/TaskManager.cpp b/codemp/icarus/TaskManager.cpp index c4e31c24a2..ec0b1bea44 100644 --- a/codemp/icarus/TaskManager.cpp +++ b/codemp/icarus/TaskManager.cpp @@ -407,7 +407,7 @@ int CTaskManager::GetFloat( int entID, CBlock *block, int &memberNum, float &val return (m_owner->GetInterface())->I_GetFloat( entID, type, name, &value ); } - //Look for a random() inline call + //Look for a Q_flrand(0.0f, 1.0f) inline call if ( Check( ID_RANDOM, block, memberNum ) ) { float min, max; @@ -479,7 +479,7 @@ int CTaskManager::GetVector( int entID, CBlock *block, int &memberNum, vector_t return (m_owner->GetInterface())->I_GetVector( entID, type, name, value ); } - //Look for a random() inline call + //Look for a Q_flrand(0.0f, 1.0f) inline call if ( Check( ID_RANDOM, block, memberNum ) ) { float min, max; @@ -617,7 +617,7 @@ int CTaskManager::Get( int entID, CBlock *block, int &memberNum, char **value ) } } - //Look for a random() inline call + //Look for a Q_flrand(0.0f, 1.0f) inline call if ( Check( ID_RANDOM, block, memberNum ) ) { float min, max, ret; diff --git a/codemp/qcommon/files.cpp b/codemp/qcommon/files.cpp index 615a207f07..cd4b5ee67e 100644 --- a/codemp/qcommon/files.cpp +++ b/codemp/qcommon/files.cpp @@ -1470,7 +1470,7 @@ long FS_FOpenFileRead( const char *filename, fileHandle_t *file, qboolean unique !FS_IsExt( filename, ".game", l ) && // menu files !FS_IsExt( filename, ".dat", l ) && // for journal files !FS_IsDemoExt( filename, l ) ) { // demos - fs_fakeChkSum = random(); + fs_fakeChkSum = Q_flrand(0.0f, 1.0f); } #ifdef _WIN32 // if running with fs_copyfiles 2, and search path == local, then we need to fail to open diff --git a/codemp/rd-vanilla/tr_surface.cpp b/codemp/rd-vanilla/tr_surface.cpp index 9219f7e36b..2910b82a06 100644 --- a/codemp/rd-vanilla/tr_surface.cpp +++ b/codemp/rd-vanilla/tr_surface.cpp @@ -479,14 +479,14 @@ static void RB_SurfaceSaberGlow() { VectorMA( e->origin, i, e->axis[0], end ); - DoSprite( end, e->radius, 0.0f );//random() * 360.0f ); + DoSprite( end, e->radius, 0.0f );//Q_flrand(0.0f, 1.0f) * 360.0f ); e->radius += 0.017f; } // Big hilt sprite // Please don't kill me Pat...I liked the hilt glow blob, but wanted a subtle pulse.:) Feel free to ditch it if you don't like it. --Jeff // Please don't kill me Jeff... The pulse is good, but now I want the halo bigger if the saber is shorter... --Pat - DoSprite( e->origin, 5.5f + random() * 0.25f, 0.0f );//random() * 360.0f ); + DoSprite( e->origin, 5.5f + Q_flrand(0.0f, 1.0f) * 0.25f, 0.0f );//Q_flrand(0.0f, 1.0f) * 360.0f ); } /* @@ -886,14 +886,14 @@ static float Q_crandom( int *seed ) { static void CreateShape() //---------------------------------------------------------------------------- { - VectorSet( sh1, 0.66f + crandom() * 0.1f, // fwd - 0.07f + crandom() * 0.025f, - 0.07f + crandom() * 0.025f ); + VectorSet( sh1, 0.66f + Q_flrand(-1.0f, 1.0f) * 0.1f, // fwd + 0.07f + Q_flrand(-1.0f, 1.0f) * 0.025f, + 0.07f + Q_flrand(-1.0f, 1.0f) * 0.025f ); // it seems to look best to have a point on one side of the ideal line, then the other point on the other side. - VectorSet( sh2, 0.33f + crandom() * 0.1f, // fwd - -sh1[1] + crandom() * 0.02f, // forcing point to be on the opposite side of the line -- right - -sh1[2] + crandom() * 0.02f );// up + VectorSet( sh2, 0.33f + Q_flrand(-1.0f, 1.0f) * 0.1f, // fwd + -sh1[1] + Q_flrand(-1.0f, 1.0f) * 0.02f, // forcing point to be on the opposite side of the line -- right + -sh1[2] + Q_flrand(-1.0f, 1.0f) * 0.02f );// up } //---------------------------------------------------------------------------- diff --git a/codemp/ui/ui_saber.c b/codemp/ui/ui_saber.c index 5546ecd56c..4894171229 100644 --- a/codemp/ui/ui_saber.c +++ b/codemp/ui/ui_saber.c @@ -315,8 +315,8 @@ void UI_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float radiusRange = radius * 0.075f; radiusStart = radius-radiusRange; - saber.radius = (radiusStart + crandom() * radiusRange)*radiusmult; - //saber.radius = (2.8f + crandom() * 0.2f)*radiusmult; + saber.radius = (radiusStart + Q_flrand(-1.0f, 1.0f) * radiusRange)*radiusmult; + //saber.radius = (2.8f + Q_flrand(-1.0f, 1.0f) * 0.2f)*radiusmult; VectorCopy( origin, saber.origin ); VectorCopy( dir, saber.axis[0] ); @@ -333,8 +333,8 @@ void UI_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float 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; + saber.radius = (radiusStart + Q_flrand(-1.0f, 1.0f) * radiusRange)*radiusmult; +// saber.radius = (1.0 + Q_flrand(-1.0f, 1.0f) * 0.2f)*radiusmult; trap->R_AddRefEntityToScene( &saber ); } diff --git a/shared/qcommon/q_math_common.c b/shared/qcommon/q_math_common.c index e954304cfd..a3e3886288 100644 --- a/shared/qcommon/q_math_common.c +++ b/shared/qcommon/q_math_common.c @@ -275,7 +275,7 @@ float erandom( float mean ) float r; do { - r = random(); + r = Q_flrand(0.0f, 1.0f); } while ( r == 0.0 ); return -mean * logf( r ); diff --git a/shared/qcommon/q_math_common.h b/shared/qcommon/q_math_common.h index 03c69cbca1..e4399d65da 100644 --- a/shared/qcommon/q_math_common.h +++ b/shared/qcommon/q_math_common.h @@ -72,9 +72,6 @@ int irand( int min, int max ); float erandom( float mean ); -#define random() ((rand () & 0x7fff) / ((float)0x7fff)) -#define crandom() (2.0 * (random() - 0.5)) - /////////////////////////////////////////////////////////////////////////// // From fd2a5fac235d8f414061c0a82ce46212e9185cc5 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sun, 21 Aug 2016 11:07:12 +0100 Subject: [PATCH 305/445] Shared: q_math_common -> q_math Also removed old q_math.cpp files in each of the game-specific directories. --- CMakeLists.txt | 4 +-- code/CMakeLists.txt | 1 - code/game/CMakeLists.txt | 1 - code/qcommon/q_math.cpp | 27 -------------------- code/qcommon/q_shared.h | 2 +- code/rd-vanilla/CMakeLists.txt | 1 - codeJK2/game/CMakeLists.txt | 1 - codemp/CMakeLists.txt | 1 - codemp/cgame/CMakeLists.txt | 1 - codemp/game/CMakeLists.txt | 1 - codemp/qcommon/q_math.c | 26 ------------------- codemp/qcommon/q_math.cpp | 24 ----------------- codemp/qcommon/q_shared.h | 2 +- codemp/rd-vanilla/CMakeLists.txt | 1 - codemp/ui/CMakeLists.txt | 1 - shared/qcommon/q_color.h | 2 +- shared/qcommon/{q_math_common.c => q_math.c} | 2 +- shared/qcommon/{q_math_common.h => q_math.h} | 0 18 files changed, 6 insertions(+), 92 deletions(-) delete mode 100644 code/qcommon/q_math.cpp delete mode 100644 codemp/qcommon/q_math.c delete mode 100644 codemp/qcommon/q_math.cpp rename shared/qcommon/{q_math_common.c => q_math.c} (99%) rename shared/qcommon/{q_math_common.h => q_math.h} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 902f5c6c3b..d6130ba727 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -308,8 +308,8 @@ endif() set(SharedCommonFiles "${SharedDir}/qcommon/q_color.h" "${SharedDir}/qcommon/q_color.c" - "${SharedDir}/qcommon/q_math_common.h" - "${SharedDir}/qcommon/q_math_common.c" + "${SharedDir}/qcommon/q_math.h" + "${SharedDir}/qcommon/q_math.c" "${SharedDir}/qcommon/q_string.h" "${SharedDir}/qcommon/q_string.c" "${SharedDir}/qcommon/q_platform.h" diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 923b7003f3..55c6e303f4 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -154,7 +154,6 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SPDir}/qcommon/msg.cpp" "${SPDir}/qcommon/net_chan.cpp" - "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 4a7193a1d8..b0e5e82018 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -257,7 +257,6 @@ set(SPGameCommonFiles "${SPDir}/qcommon/sstring.h" "${SPDir}/qcommon/tags.h" "${SPDir}/qcommon/timing.h" - "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" diff --git a/code/qcommon/q_math.cpp b/code/qcommon/q_math.cpp deleted file mode 100644 index 73ff310764..0000000000 --- a/code/qcommon/q_math.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* -=========================================================================== -Copyright (C) 1999 - 2005, Id Software, Inc. -Copyright (C) 2000 - 2013, Raven Software, Inc. -Copyright (C) 2001 - 2013, Activision, Inc. -Copyright (C) 2005 - 2015, ioquake3 contributors -Copyright (C) 2013 - 2015, OpenJK contributors - -This file is part of the OpenJK source code. - -OpenJK is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License version 2 as -published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, see . -=========================================================================== -*/ - -// q_math.c -- stateless support routines that are included in each code module - -#include "../game/common_headers.h" diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index a631ed45b9..69f13aeb6b 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -28,7 +28,7 @@ along with this program; if not, see . // q_shared.h -- included first by ALL program modules. // A user mod should never modify this file -#include "qcommon/q_math_common.h" +#include "qcommon/q_math.h" #include "qcommon/q_color.h" #include "qcommon/q_string.h" diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index 72ee342398..30f5456e9b 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -75,7 +75,6 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) # Misc files set(SPRDVanillaCommonFiles "${SPDir}/qcommon/matcomp.cpp" - "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index 669e2c1d90..104aac2e6a 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -228,7 +228,6 @@ set(JK2SPGameFiles ${JK2SPGameFiles} ${JK2SPGameUIFiles}) set(JK2SPGameCommonFiles #We only have JKA qcommon files now. "${SPDir}/qcommon/tri_coll_test.cpp" - "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SPDir}/qcommon/strippublic.h" diff --git a/codemp/CMakeLists.txt b/codemp/CMakeLists.txt index a839f261f8..df471face6 100644 --- a/codemp/CMakeLists.txt +++ b/codemp/CMakeLists.txt @@ -241,7 +241,6 @@ if(BuildMPEngine OR BuildMPDed) "${MPDir}/qcommon/net_chan.cpp" "${MPDir}/qcommon/net_ip.cpp" "${MPDir}/qcommon/persistence.cpp" - "${MPDir}/qcommon/q_math.cpp" "${MPDir}/qcommon/q_shared.cpp" "${MPDir}/qcommon/qcommon.h" "${MPDir}/qcommon/qfiles.h" diff --git a/codemp/cgame/CMakeLists.txt b/codemp/cgame/CMakeLists.txt index 432381126b..e64acb053c 100644 --- a/codemp/cgame/CMakeLists.txt +++ b/codemp/cgame/CMakeLists.txt @@ -101,7 +101,6 @@ source_group("cgame" FILES ${MPCGameCgameFiles}) set(MPCGameFiles ${MPCGameFiles} ${MPCGameCgameFiles}) set(MPCGameCommonFiles - "${MPDir}/qcommon/q_math.c" "${MPDir}/qcommon/q_shared.c" "${MPDir}/qcommon/disablewarnings.h" "${MPDir}/qcommon/q_shared.h" diff --git a/codemp/game/CMakeLists.txt b/codemp/game/CMakeLists.txt index b79f06c798..15f4cd0512 100644 --- a/codemp/game/CMakeLists.txt +++ b/codemp/game/CMakeLists.txt @@ -145,7 +145,6 @@ source_group("game" FILES ${MPGameGameFiles}) set(MPGameFiles ${MPGameFiles} ${MPGameGameFiles}) set(MPGameCommonFiles - "${MPDir}/qcommon/q_math.c" "${MPDir}/qcommon/q_shared.c" "${MPDir}/qcommon/disablewarnings.h" "${MPDir}/qcommon/q_shared.h" diff --git a/codemp/qcommon/q_math.c b/codemp/qcommon/q_math.c deleted file mode 100644 index 1733af7cd5..0000000000 --- a/codemp/qcommon/q_math.c +++ /dev/null @@ -1,26 +0,0 @@ -/* -=========================================================================== -Copyright (C) 1999 - 2005, Id Software, Inc. -Copyright (C) 2000 - 2013, Raven Software, Inc. -Copyright (C) 2001 - 2013, Activision, Inc. -Copyright (C) 2005 - 2015, ioquake3 contributors -Copyright (C) 2013 - 2015, OpenJK contributors - -This file is part of the OpenJK source code. - -OpenJK is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License version 2 as -published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, see . -=========================================================================== -*/ - -// q_math.c -- stateless support routines that are included in each code module -#include "q_shared.h" diff --git a/codemp/qcommon/q_math.cpp b/codemp/qcommon/q_math.cpp deleted file mode 100644 index 461b2a9ed1..0000000000 --- a/codemp/qcommon/q_math.cpp +++ /dev/null @@ -1,24 +0,0 @@ -/* -=========================================================================== -Copyright (C) 1999 - 2005, Id Software, Inc. -Copyright (C) 2000 - 2013, Raven Software, Inc. -Copyright (C) 2001 - 2013, Activision, Inc. -Copyright (C) 2013 - 2015, OpenJK contributors - -This file is part of the OpenJK source code. - -OpenJK is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License version 2 as -published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, see . -=========================================================================== -*/ - -#include "qcommon/q_math.c" diff --git a/codemp/qcommon/q_shared.h b/codemp/qcommon/q_shared.h index c44b0be5f3..d845bc8339 100644 --- a/codemp/qcommon/q_shared.h +++ b/codemp/qcommon/q_shared.h @@ -48,7 +48,7 @@ along with this program; if not, see . // between base<->modbase clients and servers (mismatching events, powerups, etc) // leave this defined to ensure compatibility -#include "qcommon/q_math_common.h" +#include "qcommon/q_math.h" #include "qcommon/q_color.h" #include "qcommon/q_string.h" #include "qcommon/disablewarnings.h" diff --git a/codemp/rd-vanilla/CMakeLists.txt b/codemp/rd-vanilla/CMakeLists.txt index 66ab988ef2..e7aa87f8b6 100644 --- a/codemp/rd-vanilla/CMakeLists.txt +++ b/codemp/rd-vanilla/CMakeLists.txt @@ -98,7 +98,6 @@ set(MPVanillaRendererFiles ${MPVanillaRendererFiles} ${MPVanillaRendererRdCommon set(MPVanillaRendererCommonFiles "${MPDir}/qcommon/matcomp.cpp" - "${MPDir}/qcommon/q_math.cpp" "${MPDir}/qcommon/q_shared.cpp" ${SharedCommonFiles}) diff --git a/codemp/ui/CMakeLists.txt b/codemp/ui/CMakeLists.txt index f6db993439..79d299dcc4 100644 --- a/codemp/ui/CMakeLists.txt +++ b/codemp/ui/CMakeLists.txt @@ -48,7 +48,6 @@ source_group("game" FILES ${MPUIGameFiles}) set(MPUIFiles ${MPUIFiles} ${MPUIGameFiles}) set(MPUICommonFiles - "${MPDir}/qcommon/q_math.c" "${MPDir}/qcommon/q_shared.c" "${MPDir}/qcommon/disablewarnings.h" "${MPDir}/qcommon/game_version.h" diff --git a/shared/qcommon/q_color.h b/shared/qcommon/q_color.h index 838a4e4d05..b80fdc6f54 100644 --- a/shared/qcommon/q_color.h +++ b/shared/qcommon/q_color.h @@ -1,6 +1,6 @@ #pragma once -#include "q_math_common.h" +#include "q_math.h" #if defined(__cplusplus) extern "C" { diff --git a/shared/qcommon/q_math_common.c b/shared/qcommon/q_math.c similarity index 99% rename from shared/qcommon/q_math_common.c rename to shared/qcommon/q_math.c index a3e3886288..94a50a7c18 100644 --- a/shared/qcommon/q_math_common.c +++ b/shared/qcommon/q_math.c @@ -21,7 +21,7 @@ along with this program; if not, see . =========================================================================== */ -#include "q_math_common.h" +#include "q_math.h" #include #include #include diff --git a/shared/qcommon/q_math_common.h b/shared/qcommon/q_math.h similarity index 100% rename from shared/qcommon/q_math_common.h rename to shared/qcommon/q_math.h From ff39d76bda1df2c097d7f86e298be3394916bbd6 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sun, 21 Aug 2016 19:20:03 -0500 Subject: [PATCH 306/445] Better fix for sound spam on resume from alt-tab. Fix from JK2MV --- shared/sdl/sdl_sound.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/shared/sdl/sdl_sound.cpp b/shared/sdl/sdl_sound.cpp index be18c85597..567fbf0216 100644 --- a/shared/sdl/sdl_sound.cpp +++ b/shared/sdl/sdl_sound.cpp @@ -306,8 +306,10 @@ void SNDDMA_Activate( qboolean activate ) } #endif - SDL_PauseAudio( !activate ); - if ( activate ) { - S_StopAllSounds(); + if ( activate ) + { + S_ClearSoundBuffer(); } + + SDL_PauseAudio( !activate ); } From 399cc795753f003c80c9650cadeb8f5f10e32b6e Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sun, 21 Aug 2016 19:57:18 -0500 Subject: [PATCH 307/445] Remove batch files for unsupported versions of Visual Studio --- CreateVisualStudio2010Projects.bat | 18 ------------------ CreateVisualStudio2012Projects.bat | 18 ------------------ 2 files changed, 36 deletions(-) delete mode 100644 CreateVisualStudio2010Projects.bat delete mode 100644 CreateVisualStudio2012Projects.bat diff --git a/CreateVisualStudio2010Projects.bat b/CreateVisualStudio2010Projects.bat deleted file mode 100644 index 724cf54db0..0000000000 --- a/CreateVisualStudio2010Projects.bat +++ /dev/null @@ -1,18 +0,0 @@ -@REM Create OpenJK projects for Visual Studio 2010 using CMake -@echo off -for %%X in (cmake.exe) do (set FOUND=%%~$PATH:X) -if not defined FOUND ( - echo CMake was not found on your system. Please make sure you have installed CMake - echo from http://www.cmake.org/ and cmake.exe is installed to your system's PATH - echo environment variable. - echo. - pause - exit /b 1 -) else ( - echo Found CMake! -) -if not exist build\nul (mkdir build) -pushd build -cmake -G "Visual Studio 10" -D CMAKE_INSTALL_PREFIX=../install .. -popd -pause \ No newline at end of file diff --git a/CreateVisualStudio2012Projects.bat b/CreateVisualStudio2012Projects.bat deleted file mode 100644 index 23cf8b0bb4..0000000000 --- a/CreateVisualStudio2012Projects.bat +++ /dev/null @@ -1,18 +0,0 @@ -@REM Create OpenJK projects for Visual Studio 2012 using CMake -@echo off -for %%X in (cmake.exe) do (set FOUND=%%~$PATH:X) -if not defined FOUND ( - echo CMake was not found on your system. Please make sure you have installed CMake - echo from http://www.cmake.org/ and cmake.exe is installed to your system's PATH - echo environment variable. - echo. - pause - exit /b 1 -) else ( - echo Found CMake! -) -if not exist build\nul (mkdir build) -pushd build -cmake -G "Visual Studio 11" -D CMAKE_INSTALL_PREFIX=../install .. -popd -pause \ No newline at end of file From cdfdb5ade1523fb5a4110eb57d892e66decc758d Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Mon, 22 Aug 2016 21:03:36 +0100 Subject: [PATCH 308/445] Shared: Delete unneeded win32 files --- code/win32/glw_win.h | 30 - code/win32/win_gamma.cpp | 157 -- code/win32/win_glimp.cpp | 1861 --------------- code/win32/win_input.cpp | 1706 -------------- code/win32/win_local.h | 89 - code/win32/win_qgl.cpp | 4289 ---------------------------------- code/win32/win_shared.cpp | 181 -- code/win32/win_snd.cpp | 406 ---- code/win32/win_syscon.cpp | 617 ----- code/win32/win_wndproc.cpp | 509 ---- codemp/win32/glw_win.h | 27 - codemp/win32/win_gamma.cpp | 161 -- codemp/win32/win_glimp.cpp | 1878 --------------- codemp/win32/win_input.cpp | 1685 ------------- codemp/win32/win_local.h | 70 - codemp/win32/win_qgl.cpp | 4264 --------------------------------- codemp/win32/win_shared.cpp | 26 - codemp/win32/win_snd.cpp | 385 --- codemp/win32/win_syscon.cpp | 593 ----- codemp/win32/win_wndproc.cpp | 492 ---- 20 files changed, 19426 deletions(-) delete mode 100644 code/win32/glw_win.h delete mode 100644 code/win32/win_gamma.cpp delete mode 100644 code/win32/win_glimp.cpp delete mode 100644 code/win32/win_input.cpp delete mode 100644 code/win32/win_local.h delete mode 100644 code/win32/win_qgl.cpp delete mode 100644 code/win32/win_shared.cpp delete mode 100644 code/win32/win_snd.cpp delete mode 100644 code/win32/win_syscon.cpp delete mode 100644 code/win32/win_wndproc.cpp delete mode 100644 codemp/win32/glw_win.h delete mode 100644 codemp/win32/win_gamma.cpp delete mode 100644 codemp/win32/win_glimp.cpp delete mode 100644 codemp/win32/win_input.cpp delete mode 100644 codemp/win32/win_local.h delete mode 100644 codemp/win32/win_qgl.cpp delete mode 100644 codemp/win32/win_shared.cpp delete mode 100644 codemp/win32/win_snd.cpp delete mode 100644 codemp/win32/win_syscon.cpp delete mode 100644 codemp/win32/win_wndproc.cpp diff --git a/code/win32/glw_win.h b/code/win32/glw_win.h deleted file mode 100644 index e57a0984aa..0000000000 --- a/code/win32/glw_win.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _WIN32 -# error You should not be including this file on this platform -#endif - -#ifndef __GLW_WIN_H__ -#define __GLW_WIN_H__ - -typedef struct -{ - WNDPROC wndproc; - - HDC hDC; // handle to device context - HGLRC hGLRC; // handle to GL rendering context - - HINSTANCE hinstOpenGL; // HINSTANCE for the OpenGL library - - qboolean allowdisplaydepthchange; - qboolean pixelFormatSet; - - int desktopBitsPixel; - int desktopWidth, desktopHeight; - - qboolean cdsFullscreen; - - FILE *log_fp; -} glwstate_t; - -extern glwstate_t glw_state; - -#endif diff --git a/code/win32/win_gamma.cpp b/code/win32/win_gamma.cpp deleted file mode 100644 index 560ba2dcf3..0000000000 --- a/code/win32/win_gamma.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 2 - as published by the Free Software Foundation. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . -*/ -// Copyright 2001-2013 Raven Software - -/* -** WIN_GAMMA.C -*/ -// leave this as first line for PCH reasons... -// -#include "../server/exe_headers.h" - - - -#include -#include "tr_local.h" -#include "../qcommon/qcommon.h" -#include "../win32/glw_win.h" -#include "../win32/win_local.h" - -static unsigned short s_oldHardwareGamma[3][256]; - -/* -** WG_CheckHardwareGamma -** -** Determines if the underlying hardware supports the Win32 gamma correction API. -*/ -void WG_CheckHardwareGamma( void ) -{ - HDC hDC; - - glConfig.deviceSupportsGamma = qfalse; - - if ( !r_ignorehwgamma->integer ) - { - hDC = GetDC( GetDesktopWindow() ); - glConfig.deviceSupportsGamma = GetDeviceGammaRamp( hDC, s_oldHardwareGamma ); - ReleaseDC( GetDesktopWindow(), hDC ); - - if ( glConfig.deviceSupportsGamma ) - { - // - // do a sanity check on the gamma values - // - if ( ( HIBYTE( s_oldHardwareGamma[0][255] ) <= HIBYTE( s_oldHardwareGamma[0][0] ) ) || - ( HIBYTE( s_oldHardwareGamma[1][255] ) <= HIBYTE( s_oldHardwareGamma[1][0] ) ) || - ( HIBYTE( s_oldHardwareGamma[2][255] ) <= HIBYTE( s_oldHardwareGamma[2][0] ) ) ) - { - glConfig.deviceSupportsGamma = qfalse; - ri.Printf( PRINT_WARNING, "WARNING: device has broken gamma support, generated gamma.dat\n" ); - } - - // - // make sure that we didn't have a prior crash in the game, and if so we need to - // restore the gamma values to at least a linear value - // - if ( ( HIBYTE( s_oldHardwareGamma[0][181] ) == 255 ) ) - { - int g; - - ri.Printf( PRINT_WARNING, "WARNING: suspicious gamma tables, using linear ramp for restoration\n" ); - - for ( g = 0; g < 255; g++ ) - { - s_oldHardwareGamma[0][g] = g << 8; - s_oldHardwareGamma[1][g] = g << 8; - s_oldHardwareGamma[2][g] = g << 8; - } - } - } - } -} - -/* -** GLimp_SetGamma -** -** This routine should only be called if glConfig.deviceSupportsGamma is TRUE -*/ -void GLimp_SetGamma( unsigned char red[256], unsigned char green[256], unsigned char blue[256] ) { - unsigned short table[3][256]; - int i, j; - int ret; - OSVERSIONINFO vinfo; - - if ( !glConfig.deviceSupportsGamma || r_ignorehwgamma->integer || !glw_state.hDC ) { - return; - } - -//mapGammaMax(); - - for ( i = 0; i < 256; i++ ) { - table[0][i] = ( ( ( unsigned short ) red[i] ) << 8 ) | red[i]; - table[1][i] = ( ( ( unsigned short ) green[i] ) << 8 ) | green[i]; - table[2][i] = ( ( ( unsigned short ) blue[i] ) << 8 ) | blue[i]; - } - - // Win2K and newer puts this odd restriction on gamma ramps... - vinfo.dwOSVersionInfoSize = sizeof(vinfo); - GetVersionEx( &vinfo ); - if ( vinfo.dwMajorVersion >= 5 && vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) { - Com_DPrintf( "performing gamma clamp.\n" ); - for ( j = 0 ; j < 3 ; j++ ) { - for ( i = 0 ; i < 128 ; i++ ) { - if ( table[j][i] > ( (128+i) << 8 ) ) { - table[j][i] = (128+i) << 8; - } - } - if ( table[j][127] > 254<<8 ) { - table[j][127] = 254<<8; - } - } - } else { - Com_DPrintf( "skipping gamma clamp.\n" ); - } - - // enforce constantly increasing - for ( j = 0 ; j < 3 ; j++ ) { - for ( i = 1 ; i < 256 ; i++ ) { - if ( table[j][i] < table[j][i-1] ) { - table[j][i] = table[j][i-1]; - } - } - } - - ret = SetDeviceGammaRamp( glw_state.hDC, table ); - if ( !ret ) { - Com_Printf( "SetDeviceGammaRamp failed.\n" ); - } -} - -/* -** WG_RestoreGamma -*/ -void WG_RestoreGamma( void ) -{ - if ( glConfig.deviceSupportsGamma ) - { - HDC hDC; - - hDC = GetDC( GetDesktopWindow() ); - SetDeviceGammaRamp( hDC, s_oldHardwareGamma ); - ReleaseDC( GetDesktopWindow(), hDC ); - } -} - diff --git a/code/win32/win_glimp.cpp b/code/win32/win_glimp.cpp deleted file mode 100644 index 1ab9c1e140..0000000000 --- a/code/win32/win_glimp.cpp +++ /dev/null @@ -1,1861 +0,0 @@ -/* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 2 - as published by the Free Software Foundation. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . -*/ -// Copyright 2001-2013 Raven Software - - -// leave this as first line for PCH reasons... -// -#include "../server/exe_headers.h" - - -/* -** WIN_GLIMP.C -** -** This file contains ALL Win32 specific stuff having to do with the -** OpenGL refresh. When a port is being made the following functions -** must be implemented by the port: -** -** GLimp_EndFrame -** GLimp_Init -** GLimp_LogComment -** GLimp_Shutdown -** -** Note that the GLW_xxx functions are Windows specific GL-subsystem -** related functions that are relevant ONLY to win_glimp.c -*/ -#include -#include "tr_local.h" -#include "../qcommon/qcommon.h" -#include "../win32/glw_win.h" -#include "../win32/win_local.h" -#include "../win32/resource.h" //JFM: to get icon - -extern void WG_CheckHardwareGamma( void ); -extern void WG_RestoreGamma( void ); - -typedef enum { - RSERR_OK, - - RSERR_INVALID_FULLSCREEN, - RSERR_INVALID_MODE, - - RSERR_UNKNOWN -} rserr_t; - -#define TRY_PFD_SUCCESS 0 -#define TRY_PFD_FAIL_SOFT 1 -#define TRY_PFD_FAIL_HARD 2 - -#define WINDOW_CLASS_NAME "OpenJK (SP)" - -static void GLW_InitExtensions( void ); -static rserr_t GLW_SetMode( int mode, - int colorbits, - qboolean cdsFullscreen ); - -static qboolean s_classRegistered = qfalse; - -// -// function declaration -// -void QGL_EnableLogging( qboolean enable ); -qboolean QGL_Init( const char *dllname ); -void QGL_Shutdown( void ); - -// -// variable declarations -// -glwstate_t glw_state; - -cvar_t *r_allowSoftwareGL; // don't abort out if the pixelformat claims software - -// Whether the current hardware supports dynamic glows/flares. -extern bool g_bDynamicGlowSupported; - -// Hack variable for deciding which kind of texture rectangle thing to do (for some -// reason it acts different on radeon! It's against the spec!). -bool g_bTextureRectangleHack = false; - - -/* -** GLW_StartDriverAndSetMode -*/ -static qboolean GLW_StartDriverAndSetMode( int mode, - int colorbits, - qboolean cdsFullscreen ) -{ - rserr_t err; - - err = GLW_SetMode( mode, colorbits, cdsFullscreen ); - - switch ( err ) - { - case RSERR_INVALID_FULLSCREEN: - ri.Printf( PRINT_ALL, "...WARNING: fullscreen unavailable in this mode\n" ); - return qfalse; - case RSERR_INVALID_MODE: - ri.Printf( PRINT_ALL, "...WARNING: could not set the given mode (%d)\n", mode ); - return qfalse; - default: - break; - } - return qtrue; -} - -/* -** ChoosePFD -** -** Helper function that replaces ChoosePixelFormat. -*/ -#define MAX_PFDS 256 - -static int GLW_ChoosePFD( HDC hDC, PIXELFORMATDESCRIPTOR *pPFD ) -{ - PIXELFORMATDESCRIPTOR pfds[MAX_PFDS+1]; - int maxPFD = 0; - int i; - int bestMatch = 0; - - ri.Printf( PRINT_ALL, "...GLW_ChoosePFD( %d, %d, %d )\n", ( int ) pPFD->cColorBits, ( int ) pPFD->cDepthBits, ( int ) pPFD->cStencilBits ); - - // count number of PFDs - maxPFD = DescribePixelFormat( hDC, 1, sizeof( PIXELFORMATDESCRIPTOR ), &pfds[0] ); - if ( maxPFD > MAX_PFDS ) - { - ri.Printf( PRINT_WARNING, "...numPFDs > MAX_PFDS (%d > %d)\n", maxPFD, MAX_PFDS ); - maxPFD = MAX_PFDS; - } - - ri.Printf( PRINT_ALL, "...%d PFDs found\n", maxPFD - 1 ); - - // grab information - for ( i = 1; i <= maxPFD; i++ ) - { - DescribePixelFormat( hDC, i, sizeof( PIXELFORMATDESCRIPTOR ), &pfds[i] ); - } - - // look for a best match - for ( i = 1; i <= maxPFD; i++ ) - { - // - // make sure this has hardware acceleration - // - if ( ( pfds[i].dwFlags & PFD_GENERIC_FORMAT ) != 0 ) - { - if ( !r_allowSoftwareGL->integer ) - { - if ( r_verbose->integer ) - { - ri.Printf( PRINT_ALL, "...PFD %d rejected, software acceleration\n", i ); - } - continue; - } - } - - // verify pixel type - if ( pfds[i].iPixelType != PFD_TYPE_RGBA ) - { - if ( r_verbose->integer ) - { - ri.Printf( PRINT_ALL, "...PFD %d rejected, not RGBA\n", i ); - } - continue; - } - - // verify proper flags - if ( ( ( pfds[i].dwFlags & pPFD->dwFlags ) & pPFD->dwFlags ) != pPFD->dwFlags ) - { - if ( r_verbose->integer ) - { - ri.Printf( PRINT_ALL, "...PFD %d rejected, improper flags (%x instead of %x)\n", i, pfds[i].dwFlags, pPFD->dwFlags ); - } - continue; - } - - // verify enough bits - if ( pfds[i].cDepthBits < 15 ) - { - continue; - } - if ( ( pfds[i].cStencilBits < 4 ) && ( pPFD->cStencilBits > 0 ) ) - { - continue; - } - - // - // selection criteria (in order of priority): - // - // PFD_STEREO - // colorBits - // depthBits - // stencilBits - // - if ( bestMatch ) - { - // check stereo - if ( ( pfds[i].dwFlags & PFD_STEREO ) && ( !( pfds[bestMatch].dwFlags & PFD_STEREO ) ) && ( pPFD->dwFlags & PFD_STEREO ) ) - { - bestMatch = i; - continue; - } - - if ( !( pfds[i].dwFlags & PFD_STEREO ) && ( pfds[bestMatch].dwFlags & PFD_STEREO ) && ( pPFD->dwFlags & PFD_STEREO ) ) - { - bestMatch = i; - continue; - } - - // check color - if ( pfds[bestMatch].cColorBits != pPFD->cColorBits ) - { - // prefer perfect match - if ( pfds[i].cColorBits == pPFD->cColorBits ) - { - bestMatch = i; - continue; - } - // otherwise if this PFD has more bits than our best, use it - else if ( pfds[i].cColorBits > pfds[bestMatch].cColorBits ) - { - bestMatch = i; - continue; - } - } - - // check depth - if ( pfds[bestMatch].cDepthBits != pPFD->cDepthBits ) - { - // prefer perfect match - if ( pfds[i].cDepthBits == pPFD->cDepthBits ) - { - bestMatch = i; - continue; - } - // otherwise if this PFD has more bits than our best, use it - else if ( pfds[i].cDepthBits > pfds[bestMatch].cDepthBits ) - { - bestMatch = i; - continue; - } - } - - // check stencil - if ( pfds[bestMatch].cStencilBits != pPFD->cStencilBits ) - { - // prefer perfect match - if ( pfds[i].cStencilBits == pPFD->cStencilBits ) - { - bestMatch = i; - continue; - } - // otherwise if this PFD has more bits than our best, use it - else if ( ( pfds[i].cStencilBits > pfds[bestMatch].cStencilBits ) && - ( pPFD->cStencilBits > 0 ) ) - { - bestMatch = i; - continue; - } - } - } - else - { - bestMatch = i; - } - } - - if ( !bestMatch ) - return 0; - - if ( ( pfds[bestMatch].dwFlags & PFD_GENERIC_FORMAT ) != 0 ) - { - if ( !r_allowSoftwareGL->integer ) - { - ri.Printf( PRINT_ALL, "...no hardware acceleration found\n" ); - return 0; - } - else - { - ri.Printf( PRINT_ALL, "...using software emulation\n" ); - } - } - else if ( pfds[bestMatch].dwFlags & PFD_GENERIC_ACCELERATED ) - { - ri.Printf( PRINT_ALL, "...MCD acceleration found\n" ); - } - else - { - ri.Printf( PRINT_ALL, "...hardware acceleration found\n" ); - } - - *pPFD = pfds[bestMatch]; - - return bestMatch; -} - -/* -** void GLW_CreatePFD -** -** Helper function zeros out then fills in a PFD -*/ -static void GLW_CreatePFD( PIXELFORMATDESCRIPTOR *pPFD, int colorbits, int depthbits, int stencilbits, qboolean stereo ) -{ - PIXELFORMATDESCRIPTOR src = - { - sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd - 1, // version number - PFD_DRAW_TO_WINDOW | // support window - PFD_SUPPORT_OPENGL | // support OpenGL - PFD_DOUBLEBUFFER, // double buffered - PFD_TYPE_RGBA, // RGBA type - 24, // 24-bit color depth - 0, 0, 0, 0, 0, 0, // color bits ignored - 0, // no alpha buffer - 0, // shift bit ignored - 0, // no accumulation buffer - 0, 0, 0, 0, // accum bits ignored - 24, // 24-bit z-buffer - 8, // 8-bit stencil buffer - 0, // no auxiliary buffer - PFD_MAIN_PLANE, // main layer - 0, // reserved - 0, 0, 0 // layer masks ignored - }; - - src.cColorBits = colorbits; - src.cDepthBits = depthbits; - src.cStencilBits = stencilbits; - - if ( stereo ) - { - ri.Printf( PRINT_ALL, "...attempting to use stereo\n" ); - src.dwFlags |= PFD_STEREO; - glConfig.stereoEnabled = qtrue; - } - else - { - glConfig.stereoEnabled = qfalse; - } - - *pPFD = src; -} - -/* -** GLW_MakeContext -*/ -static int GLW_MakeContext( PIXELFORMATDESCRIPTOR *pPFD ) -{ - int pixelformat; - - // - // don't putz around with pixelformat if it's already set (e.g. this is a soft - // reset of the graphics system) - // - if ( !glw_state.pixelFormatSet ) - { - // - // choose, set, and describe our desired pixel format. If we're - // using a minidriver then we need to bypass the GDI functions, - // otherwise use the GDI functions. - // - if ( ( pixelformat = GLW_ChoosePFD( glw_state.hDC, pPFD ) ) == 0 ) - { - ri.Printf( PRINT_ALL, "...GLW_ChoosePFD failed\n"); - return TRY_PFD_FAIL_SOFT; - } - ri.Printf( PRINT_ALL, "...PIXELFORMAT %d selected\n", pixelformat ); - - DescribePixelFormat( glw_state.hDC, pixelformat, sizeof( *pPFD ), pPFD ); - - if ( SetPixelFormat( glw_state.hDC, pixelformat, pPFD ) == FALSE ) - { - ri.Printf (PRINT_ALL, "...SetPixelFormat failed\n", glw_state.hDC ); - return TRY_PFD_FAIL_SOFT; - } - - glw_state.pixelFormatSet = qtrue; - } - - // - // startup the OpenGL subsystem by creating a context and making it current - // - if ( !glw_state.hGLRC ) - { - ri.Printf( PRINT_ALL, "...creating GL context: " ); - if ( ( glw_state.hGLRC = qwglCreateContext( glw_state.hDC ) ) == 0 ) - { - ri.Printf (PRINT_ALL, "failed\n"); - - return TRY_PFD_FAIL_HARD; - } - ri.Printf( PRINT_ALL, "succeeded\n" ); - - ri.Printf( PRINT_ALL, "...making context current: " ); - if ( !qwglMakeCurrent( glw_state.hDC, glw_state.hGLRC ) ) - { - qwglDeleteContext( glw_state.hGLRC ); - glw_state.hGLRC = NULL; - ri.Printf (PRINT_ALL, "failed\n"); - return TRY_PFD_FAIL_HARD; - } - ri.Printf( PRINT_ALL, "succeeded\n" ); - } - - return TRY_PFD_SUCCESS; -} - - -/* -** GLW_InitDriver -** -** - get a DC if one doesn't exist -** - create an HGLRC if one doesn't exist -*/ -static qboolean GLW_InitDriver( int colorbits ) -{ - int tpfd; - int depthbits, stencilbits; - static PIXELFORMATDESCRIPTOR pfd; // save between frames since 'tr' gets cleared - - ri.Printf( PRINT_ALL, "Initializing OpenGL driver\n" ); - - // - // get a DC for our window if we don't already have one allocated - // - if ( glw_state.hDC == NULL ) - { - ri.Printf( PRINT_ALL, "...getting DC: " ); - - if ( ( glw_state.hDC = GetDC( tr.wv->hWnd ) ) == NULL ) - { - ri.Printf( PRINT_ALL, "failed\n" ); - return qfalse; - } - ri.Printf( PRINT_ALL, "succeeded\n" ); - } - - if ( colorbits == 0 ) - { - colorbits = glw_state.desktopBitsPixel; - } - - // - // implicitly assume Z-buffer depth == desktop color depth - // - if ( r_depthbits->integer == 0 ) { - if ( colorbits > 16 ) { - depthbits = 24; - } else { - depthbits = 16; - } - } else { - depthbits = r_depthbits->integer; - } - - // - // do not allow stencil if Z-buffer depth likely won't contain it - // - stencilbits = r_stencilbits->integer; - if ( depthbits < 24 ) - { - stencilbits = 0; - } - - // - // make two attempts to set the PIXELFORMAT - // - - // - // first attempt: r_colorbits, depthbits, and r_stencilbits - // - if ( !glw_state.pixelFormatSet ) - { - GLW_CreatePFD( &pfd, colorbits, depthbits, stencilbits, r_stereo->integer ); - if ( ( tpfd = GLW_MakeContext( &pfd ) ) != TRY_PFD_SUCCESS ) - { - if ( tpfd == TRY_PFD_FAIL_HARD ) - { - ri.Printf( PRINT_WARNING, "...failed hard\n" ); - return qfalse; - } - - // - // punt if we've already tried the desktop bit depth and no stencil bits - // - if ( ( r_colorbits->integer == glw_state.desktopBitsPixel ) && - ( stencilbits == 0 ) ) - { - ReleaseDC( tr.wv->hWnd, glw_state.hDC ); - glw_state.hDC = NULL; - - ri.Printf( PRINT_ALL, "...failed to find an appropriate PIXELFORMAT\n" ); - - return qfalse; - } - - // - // second attempt: desktop's color bits and no stencil - // - if ( colorbits > glw_state.desktopBitsPixel ) - { - colorbits = glw_state.desktopBitsPixel; - } - GLW_CreatePFD( &pfd, colorbits, depthbits, 0, r_stereo->integer ); - if ( GLW_MakeContext( &pfd ) != TRY_PFD_SUCCESS ) - { - if ( glw_state.hDC ) - { - ReleaseDC( tr.wv->hWnd, glw_state.hDC ); - glw_state.hDC = NULL; - } - - ri.Printf( PRINT_ALL, "...failed to find an appropriate PIXELFORMAT\n" ); - - return qfalse; - } - } - - /* - ** report if stereo is desired but unavailable - */ - if ( !( pfd.dwFlags & PFD_STEREO ) && ( r_stereo->integer != 0 ) ) - { - ri.Printf( PRINT_ALL, "...failed to select stereo pixel format\n" ); - glConfig.stereoEnabled = qfalse; - } - } - - /* - ** store PFD specifics - */ - glConfig.colorBits = ( int ) pfd.cColorBits; - glConfig.depthBits = ( int ) pfd.cDepthBits; - glConfig.stencilBits = ( int ) pfd.cStencilBits; - - return qtrue; -} - -/* -** GLW_CreateWindow -** -** Responsible for creating the Win32 window and initializing the OpenGL driver. -*/ -#define WINDOW_STYLE (WS_OVERLAPPED|WS_BORDER|WS_CAPTION|WS_VISIBLE) -static qboolean GLW_CreateWindow( int width, int height, int colorbits, qboolean cdsFullscreen ) -{ - RECT r; - cvar_t *vid_xpos, *vid_ypos; - int stylebits; - int x, y, w, h; - int exstyle; - - // - // register the window class if necessary - // - if ( !s_classRegistered ) - { - WNDCLASS wc; - - memset( &wc, 0, sizeof( wc ) ); - - wc.style = 0; - wc.lpfnWndProc = (WNDPROC) glw_state.wndproc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = tr.wv->hInstance; - wc.hIcon = LoadIcon( tr.wv->hInstance, MAKEINTRESOURCE(IDI_ICON1)); - wc.hCursor = LoadCursor (NULL,IDC_ARROW); - wc.hbrBackground = 0;//(struct HBRUSH__ *)COLOR_GRAYTEXT; - wc.lpszMenuName = 0; - wc.lpszClassName = WINDOW_CLASS_NAME; - - if ( !RegisterClass( &wc ) ) - { - Com_Error( ERR_FATAL, "GLW_CreateWindow: could not register window class, error code: 0x%x", GetLastError() ); - } - s_classRegistered = qtrue; - ri.Printf( PRINT_ALL, "...registered window class\n" ); - } - - // - // create the HWND if one does not already exist - // - if ( !tr.wv->hWnd ) - { - // - // compute width and height - // - r.left = 0; - r.top = 0; - r.right = width; - r.bottom = height; - - if ( cdsFullscreen ) - { - exstyle = 0;//WS_EX_TOPMOST; - stylebits = WS_SYSMENU|WS_POPUP|WS_VISIBLE; //sysmenu gives you the icon - } - else - { - exstyle = 0; - if ( r_noborder->integer == 0 ) - { - stylebits = WS_SYSMENU|WINDOW_STYLE|WS_MINIMIZEBOX; - } - else - { - stylebits = WS_POPUP|WS_VISIBLE; - } - AdjustWindowRect (&r, stylebits, FALSE); - } - - w = r.right - r.left; - h = r.bottom - r.top; - - if ( cdsFullscreen ) - { - x = 0; - y = 0; - } - else - { - vid_xpos = ri.Cvar_Get ("vid_xpos", "", 0); - vid_ypos = ri.Cvar_Get ("vid_ypos", "", 0); - if ( r_centerWindow->integer == 0 ) - { - x = vid_xpos->integer; - y = vid_ypos->integer; - } - else - { - x = ( glw_state.desktopWidth - w ) / 2; - y = ( glw_state.desktopHeight - h ) / 2; - } - - // adjust window coordinates if necessary - // so that the window is completely on screen - if ( x < 0 ) - x = 0; - if ( y < 0 ) - y = 0; - - if ( w < glw_state.desktopWidth && - h < glw_state.desktopHeight ) - { - if ( x + w > glw_state.desktopWidth ) - x = ( glw_state.desktopWidth - w ); - if ( y + h > glw_state.desktopHeight ) - y = ( glw_state.desktopHeight - h ); - } - } - - tr.wv->hWnd = CreateWindowEx ( - exstyle, - WINDOW_CLASS_NAME, //class - WINDOW_CLASS_NAME, //window title - stylebits, - x, y, w, h, - NULL, - NULL, - tr.wv->hInstance, - NULL); - - if ( !tr.wv->hWnd ) - { - Com_Error (ERR_FATAL, "GLW_CreateWindow() - Couldn't create window"); - } - - ShowWindow( tr.wv->hWnd, SW_SHOW ); - UpdateWindow( tr.wv->hWnd ); - ri.Printf( PRINT_ALL, "...created window@%d,%d (%dx%d)\n", x, y, w, h ); - } - else - { - ri.Printf( PRINT_ALL, "...window already present, CreateWindowEx skipped\n" ); - } - - if ( !GLW_InitDriver( colorbits ) ) - { - ShowWindow( tr.wv->hWnd, SW_HIDE ); - DestroyWindow( tr.wv->hWnd ); - tr.wv->hWnd = NULL; - - return qfalse; - } - - SetForegroundWindow( tr.wv->hWnd ); - SetFocus( tr.wv->hWnd ); - - return qtrue; -} - -static void PrintCDSError( int value ) -{ - switch ( value ) - { - case DISP_CHANGE_RESTART: - ri.Printf( PRINT_ALL, "restart required\n" ); - break; - case DISP_CHANGE_BADPARAM: - ri.Printf( PRINT_ALL, "bad param\n" ); - break; - case DISP_CHANGE_BADFLAGS: - ri.Printf( PRINT_ALL, "bad flags\n" ); - break; - case DISP_CHANGE_FAILED: - ri.Printf( PRINT_ALL, "DISP_CHANGE_FAILED\n" ); - break; - case DISP_CHANGE_BADMODE: - ri.Printf( PRINT_ALL, "bad mode\n" ); - break; - case DISP_CHANGE_NOTUPDATED: - ri.Printf( PRINT_ALL, "not updated\n" ); - break; - default: - ri.Printf( PRINT_ALL, "unknown error %d\n", value ); - break; - } -} - -/* -** GLW_SetMode -*/ -static rserr_t GLW_SetMode( int mode, - int colorbits, - qboolean cdsFullscreen ) -{ - HDC hDC; - const char *win_fs[] = { "W", "FS" }; - int cdsRet; - DEVMODE dm; - - // - // print out informational messages - // - ri.Printf( PRINT_ALL, "...setting mode %d:", mode ); - if (mode == -2) - { - int OSwidth = GetSystemMetrics (SM_CXSCREEN); - int OSheight = GetSystemMetrics (SM_CYSCREEN); - - // use desktop video resolution - if( OSheight > 0 ) - { - glConfig.vidWidth = OSwidth; - glConfig.vidHeight = OSheight; - } - else - { - glConfig.vidWidth = 640; - glConfig.vidHeight = 480; - ri.Printf( PRINT_ALL, "Cannot determine display resolution, assuming 640x480\n" ); - } - - //TODO Aspect stuff? - //glConfig.windowAspect = (float)glConfig.vidWidth / (float)glConfig.vidHeight; - } - else if ( !R_GetModeInfo( &glConfig.vidWidth, &glConfig.vidHeight, mode ) ) - { - ri.Printf( PRINT_ALL, " invalid mode\n" ); - return RSERR_INVALID_MODE; - } - ri.Printf( PRINT_ALL, " %d %d %s\n", glConfig.vidWidth, glConfig.vidHeight, win_fs[cdsFullscreen] ); - - // - // check our desktop attributes - // - hDC = GetDC( GetDesktopWindow() ); - glw_state.desktopBitsPixel = GetDeviceCaps( hDC, BITSPIXEL ); - glw_state.desktopWidth = GetDeviceCaps( hDC, HORZRES ); - glw_state.desktopHeight = GetDeviceCaps( hDC, VERTRES ); - ReleaseDC( GetDesktopWindow(), hDC ); - - // - // verify desktop bit depth - // - if ( glw_state.desktopBitsPixel < 15 || glw_state.desktopBitsPixel == 24 ) - { - if ( !cdsFullscreen && (colorbits == 0 || colorbits >= 15 ) ) - { - // since I can't be bothered trying to mess around with asian codepages and MBCS stuff for a windows - // error box that'll only appear if something's seriously fucked then I'm going to fallback to - // english text when these would otherwise be used... - // - char sErrorHead[1024]; // ott - - extern qboolean Language_IsAsian(void); - Q_strncpyz(sErrorHead, Language_IsAsian() ? "Low Desktop Color Depth" : ri.SE_GetString("CON_TEXT_LOW_DESKTOP_COLOUR_DEPTH"), sizeof(sErrorHead) ); - - const char *psErrorBody = Language_IsAsian() ? - "It is highly unlikely that a correct windowed\n" - "display can be initialized with the current\n" - "desktop display depth. Select 'OK' to try\n" - "anyway. Select 'Cancel' to try a fullscreen\n" - "mode instead." - : - ri.SE_GetString("CON_TEXT_TRY_ANYWAY"); - - if ( MessageBox( NULL, - psErrorBody, - sErrorHead, - MB_OKCANCEL | MB_ICONEXCLAMATION ) != IDOK ) - { - return RSERR_INVALID_MODE; - } - } - } - - // do a CDS if needed - if ( cdsFullscreen ) - { - memset( &dm, 0, sizeof( dm ) ); - - dm.dmSize = sizeof( dm ); - - dm.dmPelsWidth = glConfig.vidWidth; - dm.dmPelsHeight = glConfig.vidHeight; - dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; - - if ( r_displayRefresh->integer != 0 ) - { - dm.dmDisplayFrequency = r_displayRefresh->integer; - dm.dmFields |= DM_DISPLAYFREQUENCY; - } - - // try to change color depth if possible - if ( colorbits != 0 ) - { - if ( glw_state.allowdisplaydepthchange ) - { - dm.dmBitsPerPel = colorbits; - dm.dmFields |= DM_BITSPERPEL; - ri.Printf( PRINT_ALL, "...using colorsbits of %d\n", colorbits ); - } - else - { - ri.Printf( PRINT_ALL, "WARNING:...changing depth not supported on Win95 < pre-OSR 2.x\n" ); - } - } - else - { - ri.Printf( PRINT_ALL, "...using desktop display depth of %d\n", glw_state.desktopBitsPixel ); - } - - // - // if we're already in fullscreen then just create the window - // - if ( glw_state.cdsFullscreen ) - { - ri.Printf( PRINT_ALL, "...already fullscreen, avoiding redundant CDS\n" ); - - if ( !GLW_CreateWindow ( glConfig.vidWidth, glConfig.vidHeight, colorbits, qtrue ) ) - { - ri.Printf( PRINT_ALL, "...restoring display settings\n" ); - ChangeDisplaySettings( 0, 0 ); - return RSERR_INVALID_MODE; - } - } - // - // need to call CDS - // - else - { - ri.Printf( PRINT_ALL, "...calling CDS: " ); - - // try setting the exact mode requested, because some drivers don't report - // the low res modes in EnumDisplaySettings, but still work - if ( ( cdsRet = ChangeDisplaySettings( &dm, CDS_FULLSCREEN ) ) == DISP_CHANGE_SUCCESSFUL ) - { - ri.Printf( PRINT_ALL, "ok\n" ); - - if ( !GLW_CreateWindow ( glConfig.vidWidth, glConfig.vidHeight, colorbits, qtrue) ) - { - ri.Printf( PRINT_ALL, "...restoring display settings\n" ); - ChangeDisplaySettings( 0, 0 ); - return RSERR_INVALID_MODE; - } - - glw_state.cdsFullscreen = qtrue; - } - else - { - // - // the exact mode failed, so scan EnumDisplaySettings for the next largest mode - // - DEVMODE devmode; - int modeNum; - - ri.Printf( PRINT_ALL, "failed, " ); - - PrintCDSError( cdsRet ); - - ri.Printf( PRINT_ALL, "...trying next higher resolution:" ); - - // we could do a better matching job here... - for ( modeNum = 0 ; ; modeNum++ ) { - if ( !EnumDisplaySettings( NULL, modeNum, &devmode ) ) { - modeNum = -1; - break; - } - if ( devmode.dmPelsWidth >= glConfig.vidWidth - && devmode.dmPelsHeight >= glConfig.vidHeight - && devmode.dmBitsPerPel >= 15 ) { - break; - } - } - - if ( modeNum != -1 && ( cdsRet = ChangeDisplaySettings( &devmode, CDS_FULLSCREEN ) ) == DISP_CHANGE_SUCCESSFUL ) - { - ri.Printf( PRINT_ALL, " ok\n" ); - if ( !GLW_CreateWindow( glConfig.vidWidth, glConfig.vidHeight, colorbits, qtrue) ) - { - ri.Printf( PRINT_ALL, "...restoring display settings\n" ); - ChangeDisplaySettings( 0, 0 ); - return RSERR_INVALID_MODE; - } - - glw_state.cdsFullscreen = qtrue; - } - else - { - ri.Printf( PRINT_ALL, " failed, " ); - - PrintCDSError( cdsRet ); - - ri.Printf( PRINT_ALL, "...restoring display settings\n" ); - ChangeDisplaySettings( 0, 0 ); - -/* jfm: i took out the following code to allow fallback to mode 3, with this code it goes half windowed and just doesn't work. - glw_state.cdsFullscreen = qfalse; - glConfig.isFullscreen = qfalse; - if ( !GLW_CreateWindow( glConfig.vidWidth, glConfig.vidHeight, colorbits, qfalse) ) - { - return RSERR_INVALID_MODE; - } -*/ - return RSERR_INVALID_FULLSCREEN; - } - } - } - } - else - { - if ( glw_state.cdsFullscreen ) - { - ChangeDisplaySettings( 0, 0 ); - } - - glw_state.cdsFullscreen = qfalse; - if ( !GLW_CreateWindow( glConfig.vidWidth, glConfig.vidHeight, colorbits, qfalse ) ) - { - return RSERR_INVALID_MODE; - } - } - - // - // success, now check display frequency, although this won't be valid on Voodoo(2) - // - memset( &dm, 0, sizeof( dm ) ); - dm.dmSize = sizeof( dm ); - if ( EnumDisplaySettings( NULL, ENUM_CURRENT_SETTINGS, &dm ) ) - { - glConfig.displayFrequency = dm.dmDisplayFrequency; - } - - // NOTE: this is overridden later on standalone 3Dfx drivers - glConfig.isFullscreen = cdsFullscreen; - - return RSERR_OK; -} - -/* -** GLW_CheckForExtension - - Cannot use strstr directly to differentiate between (for eg) reg_combiners and reg_combiners2 -*/ - -bool GL_CheckForExtension(const char *ext) -{ - const char *ptr = Q_stristr( glConfig.extensions_string, ext ); - if (ptr == NULL) - return false; - ptr += strlen(ext); - return ((*ptr == ' ') || (*ptr == '\0')); // verify it's complete string. -} - -static const char *wglExtensions = NULL; - -/* WGL version of the above, ASSUMES wglExtensions is non-null */ -bool WGL_CheckForExtension(const char *ext) -{ - const char *ptr = Q_stristr( wglExtensions, ext ); - if (ptr == NULL) - return false; - ptr += strlen(ext); - return ((*ptr == ' ') || (*ptr == '\0')); // verify it's complete string. -} - -//-------------------------------------------- -static void GLW_InitTextureCompression( void ) -{ - bool newer_tc, old_tc; - - // Check for available tc methods. - newer_tc = GL_CheckForExtension("ARB_texture_compression") && GL_CheckForExtension("EXT_texture_compression_s3tc"); - old_tc = GL_CheckForExtension("GL_S3_s3tc"); - - if ( old_tc ) - { - ri.Printf( PRINT_ALL, "...GL_S3_s3tc available\n" ); - } - - if ( newer_tc ) - { - ri.Printf( PRINT_ALL, "...GL_EXT_texture_compression_s3tc available\n" ); - } - - if ( !r_ext_compressed_textures->value ) - { - // Compressed textures are off - glConfig.textureCompression = TC_NONE; - ri.Printf( PRINT_ALL, "...ignoring texture compression\n" ); - } - else if ( !old_tc && !newer_tc ) - { - // Requesting texture compression, but no method found - glConfig.textureCompression = TC_NONE; - ri.Printf( PRINT_ALL, "...no supported texture compression method found\n" ); - ri.Printf( PRINT_ALL, ".....ignoring texture compression\n" ); - } - else - { - // some form of supported texture compression is avaiable, so see if the user has a preference - if ( r_ext_preferred_tc_method->integer == TC_NONE ) - { - // No preference, so pick the best - if ( newer_tc ) - { - ri.Printf( PRINT_ALL, "...no tc preference specified\n" ); - ri.Printf( PRINT_ALL, ".....using GL_EXT_texture_compression_s3tc\n" ); - glConfig.textureCompression = TC_S3TC_DXT; - } - else - { - ri.Printf( PRINT_ALL, "...no tc preference specified\n" ); - ri.Printf( PRINT_ALL, ".....using GL_S3_s3tc\n" ); - glConfig.textureCompression = TC_S3TC; - } - } - else - { - // User has specified a preference, now see if this request can be honored - if ( old_tc && newer_tc ) - { - // both are avaiable, so we can use the desired tc method - if ( r_ext_preferred_tc_method->integer == TC_S3TC ) - { - ri.Printf( PRINT_ALL, "...using preferred tc method, GL_S3_s3tc\n" ); - glConfig.textureCompression = TC_S3TC; - } - else - { - ri.Printf( PRINT_ALL, "...using preferred tc method, GL_EXT_texture_compression_s3tc\n" ); - glConfig.textureCompression = TC_S3TC_DXT; - } - } - else - { - // Both methods are not available, so this gets trickier - if ( r_ext_preferred_tc_method->integer == TC_S3TC ) - { - // Preferring to user older compression - if ( old_tc ) - { - ri.Printf( PRINT_ALL, "...using GL_S3_s3tc\n" ); - glConfig.textureCompression = TC_S3TC; - } - else - { - // Drat, preference can't be honored - ri.Printf( PRINT_ALL, "...preferred tc method, GL_S3_s3tc not available\n" ); - ri.Printf( PRINT_ALL, ".....falling back to GL_EXT_texture_compression_s3tc\n" ); - glConfig.textureCompression = TC_S3TC_DXT; - } - } - else - { - // Preferring to user newer compression - if ( newer_tc ) - { - ri.Printf( PRINT_ALL, "...using GL_EXT_texture_compression_s3tc\n" ); - glConfig.textureCompression = TC_S3TC_DXT; - } - else - { - // Drat, preference can't be honored - ri.Printf( PRINT_ALL, "...preferred tc method, GL_EXT_texture_compression_s3tc not available\n" ); - ri.Printf( PRINT_ALL, ".....falling back to GL_S3_s3tc\n" ); - glConfig.textureCompression = TC_S3TC; - } - } - } - } - } -} - -/* -** GLW_InitExtensions -*/ -static void GLW_InitExtensions( void ) -{ - if ( !r_allowExtensions->integer ) - { - ri.Printf( PRINT_ALL, "*** IGNORING OPENGL EXTENSIONS ***\n" ); - g_bDynamicGlowSupported = false; - ri.Cvar_Set( "r_DynamicGlow","0" ); - return; - } - - ri.Printf( PRINT_ALL, "Initializing OpenGL extensions\n" ); - - // Select our tc scheme - GLW_InitTextureCompression(); - - // GL_EXT_texture_env_add - glConfig.textureEnvAddAvailable = qfalse; - if ( GL_CheckForExtension( "EXT_texture_env_add" ) ) - { - if ( r_ext_texture_env_add->integer ) - { - glConfig.textureEnvAddAvailable = qtrue; - ri.Printf( PRINT_ALL, "...using GL_EXT_texture_env_add\n" ); - } - else - { - glConfig.textureEnvAddAvailable = qfalse; - ri.Printf( PRINT_ALL, "...ignoring GL_EXT_texture_env_add\n" ); - } - } - else - { - ri.Printf( PRINT_ALL, "...GL_EXT_texture_env_add not found\n" ); - } - - // GL_EXT_texture_filter_anisotropic - glConfig.maxTextureFilterAnisotropy = 0; - if ( GL_CheckForExtension( "EXT_texture_filter_anisotropic" ) ) - { -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF //can't include glext.h here ... sigh - qglGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &glConfig.maxTextureFilterAnisotropy ); - Com_Printf ("...GL_EXT_texture_filter_anisotropic available\n" ); - - if ( r_ext_texture_filter_anisotropic->integer>1 ) - { - Com_Printf ("...using GL_EXT_texture_filter_anisotropic\n" ); - } - else - { - Com_Printf ("...ignoring GL_EXT_texture_filter_anisotropic\n" ); - } - ri.Cvar_SetValue( "r_ext_texture_filter_anisotropic_avail", glConfig.maxTextureFilterAnisotropy ); - if ( r_ext_texture_filter_anisotropic->value > glConfig.maxTextureFilterAnisotropy ) - { - ri.Cvar_SetValue( "r_ext_texture_filter_anisotropic_avail", glConfig.maxTextureFilterAnisotropy ); - } - } - else - { - Com_Printf ("...GL_EXT_texture_filter_anisotropic not found\n" ); - ri.Cvar_Set( "r_ext_texture_filter_anisotropic_avail", "0" ); - } - - // GL_EXT_clamp_to_edge - glConfig.clampToEdgeAvailable = qtrue; - Com_Printf ("...using GL_EXT_texture_edge_clamp\n" ); - - // WGL_EXT_swap_control - qwglSwapIntervalEXT = ( BOOL (WINAPI *)(int)) qwglGetProcAddress( "wglSwapIntervalEXT" ); - if ( qwglSwapIntervalEXT ) - { - ri.Printf( PRINT_ALL, "...using WGL_EXT_swap_control\n" ); - r_swapInterval->modified = qtrue; // force a set next frame - } - else - { - ri.Printf( PRINT_ALL, "...WGL_EXT_swap_control not found\n" ); - } - - // GL_ARB_multitexture - qglMultiTexCoord2fARB = NULL; - qglActiveTextureARB = NULL; - qglClientActiveTextureARB = NULL; - if ( GL_CheckForExtension( "GL_ARB_multitexture" ) ) - { - if ( r_ext_multitexture->integer ) - { - qglMultiTexCoord2fARB = ( PFNGLMULTITEXCOORD2FARBPROC ) qwglGetProcAddress( "glMultiTexCoord2fARB" ); - qglActiveTextureARB = ( PFNGLACTIVETEXTUREARBPROC ) qwglGetProcAddress( "glActiveTextureARB" ); - qglClientActiveTextureARB = ( PFNGLCLIENTACTIVETEXTUREARBPROC ) qwglGetProcAddress( "glClientActiveTextureARB" ); - - if ( qglActiveTextureARB ) - { - qglGetIntegerv( GL_MAX_ACTIVE_TEXTURES_ARB, &glConfig.maxActiveTextures ); - - if ( glConfig.maxActiveTextures > 1 ) - { - ri.Printf( PRINT_ALL, "...using GL_ARB_multitexture\n" ); - } - else - { - qglMultiTexCoord2fARB = NULL; - qglActiveTextureARB = NULL; - qglClientActiveTextureARB = NULL; - ri.Printf( PRINT_ALL, "...not using GL_ARB_multitexture, < 2 texture units\n" ); - } - } - } - else - { - ri.Printf( PRINT_ALL, "...ignoring GL_ARB_multitexture\n" ); - } - } - else - { - ri.Printf( PRINT_ALL, "...GL_ARB_multitexture not found\n" ); - } - - // GL_EXT_compiled_vertex_array - qglLockArraysEXT = NULL; - qglUnlockArraysEXT = NULL; - if ( GL_CheckForExtension( "GL_EXT_compiled_vertex_array" ) ) - { - if ( r_ext_compiled_vertex_array->integer ) - { - ri.Printf( PRINT_ALL, "...using GL_EXT_compiled_vertex_array\n" ); - qglLockArraysEXT = ( void ( APIENTRY * )( int, int ) ) qwglGetProcAddress( "glLockArraysEXT" ); - qglUnlockArraysEXT = ( void ( APIENTRY * )( void ) ) qwglGetProcAddress( "glUnlockArraysEXT" ); - if (!qglLockArraysEXT || !qglUnlockArraysEXT) { - Com_Error (ERR_FATAL, "bad getprocaddress"); - } - } - else - { - ri.Printf( PRINT_ALL, "...ignoring GL_EXT_compiled_vertex_array\n" ); - } - } - else - { - ri.Printf( PRINT_ALL, "...GL_EXT_compiled_vertex_array not found\n" ); - } - - bool bNVRegisterCombiners = false; - // Register Combiners. - if ( GL_CheckForExtension( "GL_NV_register_combiners" ) ) - { - // NOTE: This extension requires multitexture support (over 2 units). - if ( glConfig.maxActiveTextures >= 2 ) - { - bNVRegisterCombiners = true; - // Register Combiners function pointer address load. - AReis - // NOTE: VV guys will _definetly_ not be able to use regcoms. Pixel Shaders are just as good though :-) - // NOTE: Also, this is an nVidia specific extension (of course), so fragment shaders would serve the same purpose - // if we needed some kind of fragment/pixel manipulation support. - qglCombinerParameterfvNV = ( PFNGLCOMBINERPARAMETERFVNV ) qwglGetProcAddress( "glCombinerParameterfvNV" ); - qglCombinerParameterivNV = ( PFNGLCOMBINERPARAMETERIVNV ) qwglGetProcAddress( "glCombinerParameterivNV" ); - qglCombinerParameterfNV = ( PFNGLCOMBINERPARAMETERFNV ) qwglGetProcAddress( "glCombinerParameterfNV" ); - qglCombinerParameteriNV = ( PFNGLCOMBINERPARAMETERINV ) qwglGetProcAddress( "glCombinerParameteriNV" ); - qglCombinerInputNV = ( PFNGLCOMBINERINPUTNV ) qwglGetProcAddress( "glCombinerInputNV" ); - qglCombinerOutputNV = ( PFNGLCOMBINEROUTPUTNV ) qwglGetProcAddress( "glCombinerOutputNV" ); - qglFinalCombinerInputNV = ( PFNGLFINALCOMBINERINPUTNV ) qwglGetProcAddress( "glFinalCombinerInputNV" ); - qglGetCombinerInputParameterfvNV = ( PFNGLGETCOMBINERINPUTPARAMETERFVNV ) qwglGetProcAddress( "glGetCombinerInputParameterfvNV" ); - qglGetCombinerInputParameterivNV = ( PFNGLGETCOMBINERINPUTPARAMETERIVNV ) qwglGetProcAddress( "glGetCombinerInputParameterivNV" ); - qglGetCombinerOutputParameterfvNV = ( PFNGLGETCOMBINEROUTPUTPARAMETERFVNV ) qwglGetProcAddress( "glGetCombinerOutputParameterfvNV" ); - qglGetCombinerOutputParameterivNV = ( PFNGLGETCOMBINEROUTPUTPARAMETERIVNV ) qwglGetProcAddress( "glGetCombinerOutputParameterivNV" ); - qglGetFinalCombinerInputParameterfvNV = ( PFNGLGETFINALCOMBINERINPUTPARAMETERFVNV ) qwglGetProcAddress( "glGetFinalCombinerInputParameterfvNV" ); - qglGetFinalCombinerInputParameterivNV = ( PFNGLGETFINALCOMBINERINPUTPARAMETERIVNV ) qwglGetProcAddress( "glGetFinalCombinerInputParameterivNV" ); - - // Validate the functions we need. - if ( !qglCombinerParameterfvNV || !qglCombinerParameterivNV || !qglCombinerParameterfNV || !qglCombinerParameteriNV || !qglCombinerInputNV || - !qglCombinerOutputNV || !qglFinalCombinerInputNV || !qglGetCombinerInputParameterfvNV || !qglGetCombinerInputParameterivNV || - !qglGetCombinerOutputParameterfvNV || !qglGetCombinerOutputParameterivNV || !qglGetFinalCombinerInputParameterfvNV || !qglGetFinalCombinerInputParameterivNV ) - { - bNVRegisterCombiners = false; - qglCombinerParameterfvNV = NULL; - qglCombinerParameteriNV = NULL; - Com_Printf ("...GL_NV_register_combiners failed\n" ); - } - } - else - { - bNVRegisterCombiners = false; - Com_Printf ("...ignoring GL_NV_register_combiners\n" ); - } - } - else - { - bNVRegisterCombiners = false; - Com_Printf ("...GL_NV_register_combiners not found\n" ); - } - - // NOTE: Vertex and Fragment Programs are very dependant on each other - this is actually a - // good thing! So, just check to see which we support (one or the other) and load the shared - // function pointers. ARB rocks! - - // Vertex Programs. - bool bARBVertexProgram = false; - if ( GL_CheckForExtension( "GL_ARB_vertex_program" ) ) - { - bARBVertexProgram = true; - } - else - { - bARBVertexProgram = false; - Com_Printf ("...GL_ARB_vertex_program not found\n" ); - } - - bool bARBFragmentProgram = false; - // Fragment Programs. - if ( GL_CheckForExtension( "GL_ARB_fragment_program" ) ) - { - bARBFragmentProgram = true; - } - else - { - bARBFragmentProgram = false; - Com_Printf ("...GL_ARB_fragment_program not found\n" ); - } - - // If we support one or the other, load the shared function pointers. - if ( bARBVertexProgram || bARBFragmentProgram ) - { - qglProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) qwglGetProcAddress("glProgramStringARB"); - qglBindProgramARB = (PFNGLBINDPROGRAMARBPROC) qwglGetProcAddress("glBindProgramARB"); - qglDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) qwglGetProcAddress("glDeleteProgramsARB"); - qglGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) qwglGetProcAddress("glGenProgramsARB"); - qglProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC) qwglGetProcAddress("glProgramEnvParameter4dARB"); - qglProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC) qwglGetProcAddress("glProgramEnvParameter4dvARB"); - qglProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC) qwglGetProcAddress("glProgramEnvParameter4fARB"); - qglProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC) qwglGetProcAddress("glProgramEnvParameter4fvARB"); - qglProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) qwglGetProcAddress("glProgramLocalParameter4dARB"); - qglProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) qwglGetProcAddress("glProgramLocalParameter4dvARB"); - qglProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC) qwglGetProcAddress("glProgramLocalParameter4fARB"); - qglProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) qwglGetProcAddress("glProgramLocalParameter4fvARB"); - qglGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC) qwglGetProcAddress("glGetProgramEnvParameterdvARB"); - qglGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC) qwglGetProcAddress("glGetProgramEnvParameterfvARB"); - qglGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) qwglGetProcAddress("glGetProgramLocalParameterdvARB"); - qglGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) qwglGetProcAddress("glGetProgramLocalParameterfvARB"); - qglGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) qwglGetProcAddress("glGetProgramivARB"); - qglGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC) qwglGetProcAddress("glGetProgramStringARB"); - qglIsProgramARB = (PFNGLISPROGRAMARBPROC) qwglGetProcAddress("glIsProgramARB"); - - // Validate the functions we need. - if ( !qglProgramStringARB || !qglBindProgramARB || !qglDeleteProgramsARB || !qglGenProgramsARB || - !qglProgramEnvParameter4dARB || !qglProgramEnvParameter4dvARB || !qglProgramEnvParameter4fARB || - !qglProgramEnvParameter4fvARB || !qglProgramLocalParameter4dARB || !qglProgramLocalParameter4dvARB || - !qglProgramLocalParameter4fARB || !qglProgramLocalParameter4fvARB || !qglGetProgramEnvParameterdvARB || - !qglGetProgramEnvParameterfvARB || !qglGetProgramLocalParameterdvARB || !qglGetProgramLocalParameterfvARB || - !qglGetProgramivARB || !qglGetProgramStringARB || !qglIsProgramARB ) - { - bARBVertexProgram = false; - bARBFragmentProgram = false; - qglGenProgramsARB = NULL; //clear ptrs that get checked - qglProgramEnvParameter4fARB = NULL; - Com_Printf ("...ignoring GL_ARB_vertex_program\n" ); - Com_Printf ("...ignoring GL_ARB_fragment_program\n" ); - } - } - - // Figure out which texture rectangle extension to use. - bool bTexRectSupported = false; - if ( Q_stricmpn( glConfig.vendor_string, "ATI Technologies",16 )==0 - && Q_stricmpn( glConfig.version_string, "1.3.3",5 )==0 - && glConfig.version_string[5] < '9' ) //1.3.34 and 1.3.37 and 1.3.38 are broken for sure, 1.3.39 is not - { - g_bTextureRectangleHack = true; - } - - if ( GL_CheckForExtension( "GL_NV_texture_rectangle" ) || GL_CheckForExtension( "GL_EXT_texture_rectangle" ) ) - { - bTexRectSupported = true; - } - - // OK, so not so good to put this here, but no one else uses it!!! -AReis - typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); - PFNWGLGETEXTENSIONSSTRINGARBPROC qwglGetExtensionsStringARB; - qwglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) qwglGetProcAddress("wglGetExtensionsStringARB"); - - bool bHasPixelFormat = false; - bool bHasRenderTexture = false; - - // Get the WGL extensions string. - if ( qwglGetExtensionsStringARB ) - { - wglExtensions = qwglGetExtensionsStringARB( glw_state.hDC ); - } - - // This externsion is used to get the wgl extension string. - if ( wglExtensions ) - { - // Pixel Format. - if ( WGL_CheckForExtension( "WGL_ARB_pixel_format" ) ) - { - qwglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC) qwglGetProcAddress("wglGetPixelFormatAttribivARB"); - qwglGetPixelFormatAttribfvARB = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC) qwglGetProcAddress("wglGetPixelFormatAttribfvARB"); - qwglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC) qwglGetProcAddress("wglChoosePixelFormatARB"); - - // Validate the functions we need. - if ( !qwglGetPixelFormatAttribivARB || !qwglGetPixelFormatAttribfvARB || !qwglChoosePixelFormatARB ) - { - Com_Printf ("...ignoring WGL_ARB_pixel_format\n" ); - } - else - { - bHasPixelFormat = true; - } - } - else - { - Com_Printf ("...ignoring WGL_ARB_pixel_format\n" ); - } - - // Offscreen pixel-buffer. - // NOTE: VV guys can use the equivelant SetRenderTarget() with the correct texture surfaces. - bool bWGLARBPbuffer = false; - if ( WGL_CheckForExtension( "WGL_ARB_pbuffer" ) && bHasPixelFormat ) - { - bWGLARBPbuffer = true; - qwglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC) qwglGetProcAddress("wglCreatePbufferARB"); - qwglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC) qwglGetProcAddress("wglGetPbufferDCARB"); - qwglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC) qwglGetProcAddress("wglReleasePbufferDCARB"); - qwglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC) qwglGetProcAddress("wglDestroyPbufferARB"); - qwglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC) qwglGetProcAddress("wglQueryPbufferARB"); - - // Validate the functions we need. - if ( !qwglCreatePbufferARB || !qwglGetPbufferDCARB || !qwglReleasePbufferDCARB || !qwglDestroyPbufferARB || !qwglQueryPbufferARB ) - { - bWGLARBPbuffer = false; - Com_Printf ("...WGL_ARB_pbuffer failed\n" ); - } - } - else - { - bWGLARBPbuffer = false; - Com_Printf ("...WGL_ARB_pbuffer not found\n" ); - } - - // Render-Texture (requires pbuffer ext (and it's dependancies of course). - if ( WGL_CheckForExtension( "WGL_ARB_render_texture" ) && bWGLARBPbuffer ) - { - qwglBindTexImageARB = (PFNWGLBINDTEXIMAGEARBPROC) qwglGetProcAddress("wglBindTexImageARB"); - qwglReleaseTexImageARB = (PFNWGLRELEASETEXIMAGEARBPROC) qwglGetProcAddress("wglReleaseTexImageARB"); - qwglSetPbufferAttribARB = (PFNWGLSETPBUFFERATTRIBARBPROC) qwglGetProcAddress("wglSetPbufferAttribARB"); - - // Validate the functions we need. - if ( !qwglCreatePbufferARB || !qwglGetPbufferDCARB || !qwglReleasePbufferDCARB || !qwglDestroyPbufferARB || !qwglQueryPbufferARB ) - { - Com_Printf ("...ignoring WGL_ARB_render_texture\n" ); - } - else - { - bHasRenderTexture = true; - } - } - else - { - Com_Printf ("...ignoring WGL_ARB_render_texture\n" ); - } - } - - // Find out how many general combiners they have. - #define GL_MAX_GENERAL_COMBINERS_NV 0x854D - GLint iNumGeneralCombiners = 0; - if(bNVRegisterCombiners) - qglGetIntegerv( GL_MAX_GENERAL_COMBINERS_NV, &iNumGeneralCombiners ); - - // Only allow dynamic glows/flares if they have the hardware - if ( bTexRectSupported && bARBVertexProgram && bHasRenderTexture && qglActiveTextureARB && glConfig.maxActiveTextures >= 4 && - ( ( bNVRegisterCombiners && iNumGeneralCombiners >= 2 ) || bARBFragmentProgram ) ) - { - g_bDynamicGlowSupported = true; - // this would overwrite any achived setting gwg - // Cvar_Set( "r_DynamicGlow", "1" ); - } - else - { - g_bDynamicGlowSupported = false; - ri.Cvar_Set( "r_DynamicGlow","0" ); - } -} - -/* -** GLW_CheckOSVersion -*/ -static qboolean GLW_CheckOSVersion( void ) -{ -#define OSR2_BUILD_NUMBER 1111 - - OSVERSIONINFO vinfo; - - vinfo.dwOSVersionInfoSize = sizeof(vinfo); - - glw_state.allowdisplaydepthchange = qfalse; - - if ( GetVersionEx( &vinfo) ) - { - if ( vinfo.dwMajorVersion > 4 ) - { - glw_state.allowdisplaydepthchange = qtrue; - } - else if ( vinfo.dwMajorVersion == 4 ) - { - if ( vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) - { - glw_state.allowdisplaydepthchange = qtrue; - } - else if ( vinfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) - { - if ( LOWORD( vinfo.dwBuildNumber ) >= OSR2_BUILD_NUMBER ) - { - glw_state.allowdisplaydepthchange = qtrue; - } - } - } - } - else - { - ri.Printf( PRINT_ALL, "GLW_CheckOSVersion() - GetVersionEx failed\n" ); - return qfalse; - } - - return qtrue; -} - -/* -** GLW_LoadOpenGL -** -** GLimp_win.c internal function that attempts to load and use -** a specific OpenGL DLL. -*/ -static qboolean GLW_LoadOpenGL() -{ - qboolean cdsFullscreen; - - // - // load the driver and bind our function pointers to it - // - if ( QGL_Init( "opengl32" ) ) - { - cdsFullscreen = r_fullscreen->integer; - - // create the window and set up the context - if ( !GLW_StartDriverAndSetMode( r_mode->integer, r_colorbits->integer, cdsFullscreen ) ) - { - // if we're on a 24/32-bit desktop and we're going fullscreen - // try it again but with a 16-bit desktop - if ( r_colorbits->integer != 16 || - cdsFullscreen != qtrue || - r_mode->integer != 3 ) - { - if ( !GLW_StartDriverAndSetMode( 3, 16, qtrue ) ) - { - goto fail; - } - } - } - return qtrue; - } -fail: - - QGL_Shutdown(); - - return qfalse; -} - -/* -** GLimp_EndFrame -*/ -void GLimp_EndFrame (void) -{ - // - // swapinterval stuff - // - if ( r_swapInterval->modified ) { - r_swapInterval->modified = qfalse; - - if ( !glConfig.stereoEnabled ) { // why? - if ( qwglSwapIntervalEXT ) { - qwglSwapIntervalEXT( r_swapInterval->integer ); - } - } - } - - - // don't flip if drawing to front buffer - //if ( stricmp( r_drawBuffer->string, "GL_FRONT" ) != 0 ) - { - SwapBuffers( glw_state.hDC ); - } - - // check logging - QGL_EnableLogging( r_logFile->integer ); -} - -static void GLW_StartOpenGL( void ) -{ - // - // load and initialize the specific OpenGL driver - // - if ( !GLW_LoadOpenGL() ) - { - Com_Error( ERR_FATAL, "GLW_StartOpenGL() - could not load OpenGL subsystem\n" ); - } -} - -/* -** GLimp_Init -** -** This is the platform specific OpenGL initialization function. It -** is responsible for loading OpenGL, initializing it, setting -** extensions, creating a window of the appropriate size, doing -** fullscreen manipulations, etc. Its overall responsibility is -** to make sure that a functional OpenGL subsystem is operating -** when it returns to the ref. -*/ -void GLimp_Init( void ) -{ - char buf[MAX_STRING_CHARS]; - cvar_t *lastValidRenderer = ri.Cvar_Get( "r_lastValidRenderer", "(uninitialized)", CVAR_ARCHIVE ); - cvar_t *cv; - - ri.Printf( PRINT_ALL, "Initializing OpenGL subsystem\n" ); - - // - // check OS version to see if we can do fullscreen display changes - // - if ( !GLW_CheckOSVersion() ) - { - Com_Error( ERR_FATAL, "GLimp_Init() - incorrect operating system\n" ); - } - - // save off hInstance and wndproc - cv = ri.Cvar_Get( "win_hinstance", "", 0 ); - sscanf( cv->string, "%p", (uintptr_t *)&tr.wv->hInstance ); - - cv = ri.Cvar_Get( "win_wndproc", "", 0 ); - sscanf( cv->string, "%p", (uintptr_t *)&glw_state.wndproc ); - - r_allowSoftwareGL = ri.Cvar_Get( "r_allowSoftwareGL", "0", CVAR_LATCH ); - - // load appropriate DLL and initialize subsystem - GLW_StartOpenGL(); - - // get our config strings - glConfig.vendor_string = (const char *) qglGetString (GL_VENDOR); - glConfig.renderer_string = (const char *) qglGetString (GL_RENDERER); - glConfig.version_string = (const char *) qglGetString (GL_VERSION); - glConfig.extensions_string = (const char *) qglGetString (GL_EXTENSIONS); - - if (!glConfig.vendor_string || !glConfig.renderer_string || !glConfig.version_string || !glConfig.extensions_string) - { - Com_Error( ERR_FATAL, "GLimp_Init() - Invalid GL Driver\n" ); - } - - // OpenGL driver constants - qglGetIntegerv( GL_MAX_TEXTURE_SIZE, &glConfig.maxTextureSize ); - // stubbed or broken drivers may have reported 0... - if ( glConfig.maxTextureSize <= 0 ) - { - glConfig.maxTextureSize = 0; - } - - // - // chipset specific configuration - // - Q_strncpyz( buf, glConfig.renderer_string, sizeof(buf) ); - strlwr( buf ); - - // - // NOTE: if changing cvars, do it within this block. This allows them - // to be overridden when testing driver fixes, etc. but only sets - // them to their default state when the hardware is first installed/run. - // - if ( Q_stricmp( lastValidRenderer->string, glConfig.renderer_string ) ) - { - if (ri.LowPhysicalMemory()) - { - ri.Cvar_Set("s_khz", "11");// this will get called before S_Init - ri.Cvar_Set("cg_VariantSoundCap", "2"); - ri.Cvar_Set("s_allowDynamicMusic","0"); - } - //reset to defaults - ri.Cvar_Set( "r_picmip", "1" ); - - // Savage3D and Savage4 should always have trilinear enabled - if ( strstr( buf, "savage3d" ) || strstr( buf, "s3 savage4" ) || strstr( buf, "geforce" ) || strstr( buf, "quadro" ) ) - { - ri.Cvar_Set( "r_texturemode", "GL_LINEAR_MIPMAP_LINEAR" ); - } - else - { - ri.Cvar_Set( "r_textureMode", "GL_LINEAR_MIPMAP_NEAREST" ); - } - - if ( strstr( buf, "kyro" ) ) - { - ri.Cvar_Set( "r_ext_texture_filter_anisotropic", "0"); //KYROs have it avail, but suck at it! - ri.Cvar_Set( "r_ext_preferred_tc_method", "1"); //(Use DXT1 instead of DXT5 - same quality but much better performance on KYRO) - } - - if ( strstr( buf, "geforce2" ) ) - { - ri.Cvar_Set( "cg_renderToTextureFX", "0"); // slow to zero bug fix - } - - if ( strstr( buf, "radeon 9000" ) ) - { - ri.Cvar_Set( "cg_renderToTextureFX", "0"); // white texture bug - } - - GLW_InitExtensions(); //get the values for test below - //this must be a really sucky card! - if ( (glConfig.textureCompression == TC_NONE) || (glConfig.maxActiveTextures < 2) || (glConfig.maxTextureSize <= 512) ) - { - ri.Cvar_Set( "r_picmip", "2"); - ri.Cvar_Set( "r_colorbits", "16"); - ri.Cvar_Set( "r_texturebits", "16"); - ri.Cvar_Set( "r_mode", "3"); //force 640 - ri.Cmd_ExecuteString ("exec low.cfg\n"); //get the rest which can be pulled in after init - } - } - - ri.Cvar_Set( "r_lastValidRenderer", glConfig.renderer_string ); - GLW_InitExtensions(); - - WG_CheckHardwareGamma(); -} - -/* -** GLimp_Shutdown -** -** This routine does all OS specific shutdown procedures for the OpenGL -** subsystem. -*/ -void GLimp_Shutdown( void ) -{ -// const char *strings[] = { "soft", "hard" }; - const char *success[] = { "failed", "success" }; - int retVal; - - // FIXME: Brian, we need better fallbacks from partially initialized failures - if ( !qwglMakeCurrent ) { - return; - } - - ri.Printf( PRINT_ALL, "Shutting down OpenGL subsystem\n" ); - - // restore gamma. We do this first because 3Dfx's extension needs a valid OGL subsystem - WG_RestoreGamma(); - - // set current context to NULL - if ( qwglMakeCurrent ) - { - retVal = qwglMakeCurrent( NULL, NULL ) != 0; - - ri.Printf( PRINT_ALL, "...wglMakeCurrent( NULL, NULL ): %s\n", success[retVal] ); - } - - // delete HGLRC - if ( glw_state.hGLRC ) - { - retVal = qwglDeleteContext( glw_state.hGLRC ) != 0; - ri.Printf( PRINT_ALL, "...deleting GL context: %s\n", success[retVal] ); - glw_state.hGLRC = NULL; - } - - // release DC - if ( glw_state.hDC ) - { - retVal = ReleaseDC( tr.wv->hWnd, glw_state.hDC ) != 0; - ri.Printf( PRINT_ALL, "...releasing DC: %s\n", success[retVal] ); - glw_state.hDC = NULL; - } - - // destroy window - if ( tr.wv->hWnd ) - { - ri.Printf( PRINT_ALL, "...destroying window\n" ); - ShowWindow( tr.wv->hWnd, SW_HIDE ); - DestroyWindow( tr.wv->hWnd ); - tr.wv->hWnd = NULL; - glw_state.pixelFormatSet = qfalse; - } - - // unregister the window class - if ( s_classRegistered ) - { - if ( FAILED (UnregisterClass (WINDOW_CLASS_NAME, tr.wv->hInstance)) ) - { - Com_Error (ERR_FATAL, "GLimp_Shutdown: could not unregister window class, error code 0x%x", GetLastError()); - } - s_classRegistered = qfalse; - } - - // close the r_logFile - if ( glw_state.log_fp ) - { - fclose( glw_state.log_fp ); - glw_state.log_fp = 0; - } - - // reset display settings - if ( glw_state.cdsFullscreen ) - { - ri.Printf( PRINT_ALL, "...resetting display\n" ); - ChangeDisplaySettings( 0, 0 ); - glw_state.cdsFullscreen = qfalse; - } - - // shutdown QGL subsystem - QGL_Shutdown(); - - memset( &glConfig, 0, sizeof( glConfig ) ); - memset( &glState, 0, sizeof( glState ) ); -} - -/* -=============== -GLimp_Minimize - -Minimize the game so that user is back at the desktop -=============== -*/ -void GLimp_Minimize(void) -{ - if ( tr.wv->hWnd ) - { - // Todo with viewlog maybe should try to unminimize but mer. - ShowWindow( tr.wv->hWnd, SW_MINIMIZE ); - } -} - -/* -** GLimp_LogComment -*/ -void GLimp_LogComment( const char *comment ) -{ - if ( glw_state.log_fp ) { - fprintf( glw_state.log_fp, "%s", comment ); - } -} diff --git a/code/win32/win_input.cpp b/code/win32/win_input.cpp deleted file mode 100644 index ed43c59bd8..0000000000 --- a/code/win32/win_input.cpp +++ /dev/null @@ -1,1706 +0,0 @@ -/* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 2 - as published by the Free Software Foundation. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . -*/ -// Copyright 2001-2013 Raven Software - -// win_input.c -- win32 mouse and joystick code -// 02/21/97 JCB Added extended DirectInput code to support external controllers. - -// leave this as first line for PCH reasons... -// -#include "../server/exe_headers.h" - - - - -#include "../client/client.h" -#include "win_local.h" - -#ifndef NO_XINPUT -#include -#endif - -typedef struct { - int oldButtonState; - - qboolean mouseActive; - qboolean mouseInitialized; -} WinMouseVars_t; - -static WinMouseVars_t s_wmv; - -static int window_center_x, window_center_y; - -// -// MIDI definitions -// -static void IN_StartupMIDI( void ); -static void IN_ShutdownMIDI( void ); -#ifndef NO_XINPUT -void IN_UnloadXInput( void ); -#endif - -#define MAX_MIDIIN_DEVICES 8 - -typedef struct { - int numDevices; - MIDIINCAPS caps[MAX_MIDIIN_DEVICES]; - - HMIDIIN hMidiIn; -} MidiInfo_t; - -static MidiInfo_t s_midiInfo; - -// -// Joystick definitions -// -#define JOY_MAX_AXES 6 // X, Y, Z, R, U, V - -typedef struct { - qboolean avail; - int id; // joystick number - JOYCAPS jc; - - int oldbuttonstate; - int oldpovstate; - - JOYINFOEX ji; -} joystickInfo_t; - -static joystickInfo_t joy; - - -cvar_t *in_midi; -cvar_t *in_midiport; -cvar_t *in_midichannel; -cvar_t *in_mididevice; - -cvar_t *in_mouse; -cvar_t *in_joystick; -cvar_t *in_joyBallScale; -cvar_t *in_debugJoystick; -cvar_t *joy_threshold; -cvar_t *joy_xbutton; -cvar_t *joy_ybutton; - -#ifndef NO_XINPUT -cvar_t *xin_invertThumbsticks; -cvar_t *xin_rumbleScale; - -cvar_t *xin_invertLookX; -cvar_t *xin_invertLookY; -#endif - -qboolean in_appactive; - -// forward-referenced functions -void IN_StartupJoystick (void); -void IN_JoyMove(void); - -static void MidiInfo_f( void ); - -/* -============================================================ - -RAW INPUT MOUSE CONTROL - -============================================================ -*/ - -#ifndef HID_USAGE_PAGE_GENERIC -#define HID_USAGE_PAGE_GENERIC ((USHORT) 0x01) -#endif - -#ifndef HID_USAGE_GENERIC_MOUSE -#define HID_USAGE_GENERIC_MOUSE ((USHORT) 0x02) -#endif - -static qboolean rawMouseInitialized = qfalse; -static LONG rawDeltaX = 0; -static LONG rawDeltaY = 0; - -/* -================ -IN_InitRawMouse -================ -*/ -qboolean IN_InitRawMouse( void ) -{ - RAWINPUTDEVICE Rid[1]; - - Com_Printf( "Initializing raw input...\n"); - - Rid[0].usUsagePage = HID_USAGE_PAGE_GENERIC; - Rid[0].usUsage = HID_USAGE_GENERIC_MOUSE; - Rid[0].dwFlags = 0; - Rid[0].hwndTarget = 0; - - if ( RegisterRawInputDevices( Rid, 1, sizeof(Rid[0]) ) == FALSE ) - { - Com_Printf ("Couldn't register raw input devices\n"); - return qfalse; - } - - Com_Printf( "Raw input initialized.\n"); - rawMouseInitialized = qtrue; - return qtrue; -} - -/* -================ -IN_ShutdownRawMouse -================ -*/ -void IN_ShutdownRawMouse( void ) -{ - if ( rawMouseInitialized ) - { - RAWINPUTDEVICE Rid[1]; - - Rid[0].usUsagePage = HID_USAGE_PAGE_GENERIC; - Rid[0].usUsage = HID_USAGE_GENERIC_MOUSE; - Rid[0].dwFlags = RIDEV_REMOVE; - Rid[0].hwndTarget = 0; - - if ( RegisterRawInputDevices( Rid, 1, sizeof(Rid[0]) ) == FALSE ) - { - Com_Printf ("Couldn't un-register raw input devices\n"); - } - - rawMouseInitialized = qfalse; - } -} - -/* -================ -IN_ActivateRawMouse -================ -*/ -void IN_ActivateRawMouse( void ) -{ - rawDeltaX = rawDeltaY = 0; -} - -/* -================ -IN_DeactivateRawMouse -================ -*/ -void IN_DeactivateRawMouse( void ) -{ - rawDeltaX = rawDeltaY = 0; -} - -/* -================ -IN_RawMouse -================ -*/ -void IN_RawMouse( int *mx, int *my ) -{ - // force the mouse to the center, just to be consistent with default mouse behaviour - SetCursorPos (window_center_x, window_center_y); - - *mx = rawDeltaX; - *my = rawDeltaY; - rawDeltaX = rawDeltaY = 0; -} - -/* -================ -IN_RawMouseEvent -================ -*/ -void IN_RawMouseEvent( int lastX, int lastY ) -{ - rawDeltaX += lastX; - rawDeltaY += lastY; -} - - -/* -============================================================ - -WIN32 MOUSE CONTROL - -============================================================ -*/ - -/* -================ -IN_InitWin32Mouse -================ -*/ -void IN_InitWin32Mouse( void ) -{ -} - -/* -================ -IN_ShutdownWin32Mouse -================ -*/ -void IN_ShutdownWin32Mouse( void ) { -} - -/* -================ -IN_ActivateWin32Mouse -================ -*/ -void IN_ActivateWin32Mouse( void ) { - int x, y, width, height; - RECT window_rect; - - x = GetSystemMetrics (SM_XVIRTUALSCREEN); - y = GetSystemMetrics (SM_YVIRTUALSCREEN); - width = GetSystemMetrics (SM_CXVIRTUALSCREEN); - height = GetSystemMetrics (SM_CYVIRTUALSCREEN); - - GetWindowRect ( g_wv.hWnd, &window_rect); - if (window_rect.left < x) - window_rect.left = x; - if (window_rect.top < y) - window_rect.top = y; - if (window_rect.right >= width) - window_rect.right = width-1; - if (window_rect.bottom >= height-1) - window_rect.bottom = height-1; - window_center_x = (window_rect.right + window_rect.left)/2; - window_center_y = (window_rect.top + window_rect.bottom)/2; - - SetCursorPos (window_center_x, window_center_y); - - SetCapture ( g_wv.hWnd ); - ClipCursor (&window_rect); - while (ShowCursor (FALSE) >= 0) - ; -} - -/* -================ -IN_DeactivateWin32Mouse -================ -*/ -void IN_DeactivateWin32Mouse( void ) -{ - ClipCursor (NULL); - ReleaseCapture (); - while (ShowCursor (TRUE) < 0) - ; -} - -/* -================ -IN_Win32Mouse -================ -*/ -void IN_Win32Mouse( int *mx, int *my ) { - POINT current_pos; - - // find mouse movement - GetCursorPos (¤t_pos); - - // force the mouse to the center, so there's room to move - SetCursorPos (window_center_x, window_center_y); - - *mx = current_pos.x - window_center_x; - *my = current_pos.y - window_center_y; -} - - -/* -============================================================ - -DIRECT INPUT MOUSE CONTROL - -============================================================ -*/ - -#undef DEFINE_GUID - -#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - EXTERN_C const GUID name \ - = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } - -DEFINE_GUID(qGUID_SysMouse, 0x6F1D2B60,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); -DEFINE_GUID(qGUID_XAxis, 0xA36D02E0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); -DEFINE_GUID(qGUID_YAxis, 0xA36D02E1,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); -DEFINE_GUID(qGUID_ZAxis, 0xA36D02E2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); - - -#define DINPUT_BUFFERSIZE 16 -#define iDirectInputCreate(a,b,c,d) pDirectInputCreate(a,b,c,d) - -HRESULT (WINAPI *pDirectInputCreate)(HINSTANCE hinst, DWORD dwVersion, - LPDIRECTINPUT * lplpDirectInput, LPUNKNOWN punkOuter); - -static HINSTANCE hInstDI; - -typedef struct MYDATA { - LONG lX; // X axis goes here - LONG lY; // Y axis goes here - LONG lZ; // Z axis goes here - BYTE bButtonA; // One button goes here - BYTE bButtonB; // Another button goes here - BYTE bButtonC; // Another button goes here - BYTE bButtonD; // Another button goes here -} MYDATA; - -static DIOBJECTDATAFORMAT rgodf[] = { - { &qGUID_XAxis, FIELD_OFFSET(MYDATA, lX), DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, - { &qGUID_YAxis, FIELD_OFFSET(MYDATA, lY), DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, - { &qGUID_ZAxis, FIELD_OFFSET(MYDATA, lZ), 0x80000000 | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, - { 0, FIELD_OFFSET(MYDATA, bButtonA), DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, - { 0, FIELD_OFFSET(MYDATA, bButtonB), DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, - { 0, FIELD_OFFSET(MYDATA, bButtonC), 0x80000000 | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, - { 0, FIELD_OFFSET(MYDATA, bButtonD), 0x80000000 | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, -}; - -#define NUM_OBJECTS (sizeof(rgodf) / sizeof(rgodf[0])) - -static DIDATAFORMAT df = { - sizeof(DIDATAFORMAT), // this structure - sizeof(DIOBJECTDATAFORMAT), // size of object data format - DIDF_RELAXIS, // absolute axis coordinates - sizeof(MYDATA), // device data size - NUM_OBJECTS, // number of objects - rgodf, // and here they are -}; - -static LPDIRECTINPUT g_pdi; -static LPDIRECTINPUTDEVICE g_pMouse; - -void IN_DIMouse( int *mx, int *my ); - -/* -======================== -IN_InitDIMouse -======================== -*/ -qboolean IN_InitDIMouse( void ) { - HRESULT hr; - int x, y; - DIPROPDWORD dipdw = { - { - sizeof(DIPROPDWORD), // diph.dwSize - sizeof(DIPROPHEADER), // diph.dwHeaderSize - 0, // diph.dwObj - DIPH_DEVICE, // diph.dwHow - }, - DINPUT_BUFFERSIZE, // dwData - }; - - Com_Printf( "Initializing DirectInput...\n"); - - if (!hInstDI) { - hInstDI = LoadLibrary("dinput.dll"); - - if (hInstDI == NULL) { - Com_Printf ("Couldn't load dinput.dll\n"); - return qfalse; - } - } - - if (!pDirectInputCreate) { - pDirectInputCreate = (long (__stdcall *)(struct HINSTANCE__ *,unsigned long,struct IDirectInputA ** ,struct IUnknown *)) - GetProcAddress(hInstDI,"DirectInputCreateA"); - - if (!pDirectInputCreate) { - Com_Printf ("Couldn't get DI proc addr\n"); - return qfalse; - } - } - - // register with DirectInput and get an IDirectInput to play with. - hr = iDirectInputCreate( g_wv.hInstance, DIRECTINPUT_VERSION, &g_pdi, NULL); - - if (FAILED(hr)) { - Com_Printf ("iDirectInputCreate failed\n"); - return qfalse; - } - - // obtain an interface to the system mouse device. - hr = g_pdi->CreateDevice( qGUID_SysMouse, &g_pMouse, NULL); - - if (FAILED(hr)) { - Com_Printf ("Couldn't open DI mouse device\n"); - return qfalse; - } - - // set the data format to "mouse format". - hr = IDirectInputDevice_SetDataFormat(g_pMouse, &df); - - if (FAILED(hr)) { - Com_Printf ("Couldn't set DI mouse format\n"); - return qfalse; - } - - // set the cooperativity level. - hr = IDirectInputDevice_SetCooperativeLevel(g_pMouse, g_wv.hWnd, - DISCL_EXCLUSIVE | DISCL_FOREGROUND); - - if (FAILED(hr)) { - Com_Printf ("Couldn't set DI coop level\n"); - return qfalse; - } - - - // set the buffer size to DINPUT_BUFFERSIZE elements. - // the buffer size is a DWORD property associated with the device - hr = IDirectInputDevice_SetProperty(g_pMouse, DIPROP_BUFFERSIZE, &dipdw.diph); - - if (FAILED(hr)) { - Com_Printf ("Couldn't set DI buffersize\n"); - return qfalse; - } - - // clear any pending samples - IN_DIMouse( &x, &y ); - IN_DIMouse( &x, &y ); - - Com_Printf( "DirectInput initialized.\n"); - return qtrue; -} - -/* -========================== -IN_ShutdownDIMouse -========================== -*/ -void IN_ShutdownDIMouse( void ) -{ - if (g_pMouse) - { - IDirectInputDevice_Release(g_pMouse); - g_pMouse = NULL; - } - if (g_pdi) - { - IDirectInput_Release(g_pdi); - g_pdi = NULL; - } - if(hInstDI) - { - FreeLibrary(hInstDI); - hInstDI = NULL; - } -} - -/* -========================== -IN_ActivateDIMouse -========================== -*/ -void IN_ActivateDIMouse( void ) { - HRESULT hr; - - if (!g_pMouse) { - return; - } - - // we may fail to reacquire if the window has been recreated - hr = IDirectInputDevice_Acquire( g_pMouse ); - if (FAILED(hr)) { - if ( !IN_InitDIMouse() ) { - Com_Printf ("Falling back to Win32 mouse support...\n"); - Cvar_Set( "in_mouse", "-1" ); - } - } -} - -/* -========================== -IN_DeactivateDIMouse -========================== -*/ -void IN_DeactivateDIMouse( void ) { - if (!g_pMouse) { - return; - } - IDirectInputDevice_Unacquire( g_pMouse ); -} - - -/* -=================== -IN_DIMouse -=================== -*/ -void IN_DIMouse( int *mx, int *my ) { - DIDEVICEOBJECTDATA od; - DIMOUSESTATE state; - DWORD dwElements; - HRESULT hr; - static float oldSysTime; - - if ( !g_pMouse ) { - return; - } - - // fetch new events - for (;;) - { - dwElements = 1; - - hr = IDirectInputDevice_GetDeviceData(g_pMouse, - sizeof(DIDEVICEOBJECTDATA), &od, &dwElements, 0); - if ((hr == DIERR_INPUTLOST) || (hr == DIERR_NOTACQUIRED)) { - IDirectInputDevice_Acquire(g_pMouse); - return; - } - - /* Unable to read data or no data available */ - if ( FAILED(hr) ) { - break; - } - - if ( dwElements == 0 ) { - break; - } - - switch (od.dwOfs) { - case DIMOFS_BUTTON0: - if (od.dwData & 0x80) - Sys_QueEvent( od.dwTimeStamp, SE_KEY, A_MOUSE1, qtrue, 0, NULL ); - else - Sys_QueEvent( od.dwTimeStamp, SE_KEY, A_MOUSE1, qfalse, 0, NULL ); - break; - - case DIMOFS_BUTTON1: - if (od.dwData & 0x80) - Sys_QueEvent( od.dwTimeStamp, SE_KEY, A_MOUSE2, qtrue, 0, NULL ); - else - Sys_QueEvent( od.dwTimeStamp, SE_KEY, A_MOUSE2, qfalse, 0, NULL ); - break; - - case DIMOFS_BUTTON2: - if (od.dwData & 0x80) - Sys_QueEvent( od.dwTimeStamp, SE_KEY, A_MOUSE3, qtrue, 0, NULL ); - else - Sys_QueEvent( od.dwTimeStamp, SE_KEY, A_MOUSE3, qfalse, 0, NULL ); - break; - } - } - - // read the raw delta counter and ignore - // the individual sample time / values - hr = IDirectInputDevice_GetDeviceState(g_pMouse, - sizeof(DIDEVICEOBJECTDATA), &state); - if ( FAILED(hr) ) { - *mx = *my = 0; - return; - } - *mx = state.lX; - *my = state.lY; -} - -/* -============================================================ - - MOUSE CONTROL - -============================================================ -*/ - -/* -=========== -IN_ActivateMouse - -Called when the window gains focus or changes in some way -=========== -*/ -void IN_ActivateMouse( void ) -{ - if (!s_wmv.mouseInitialized ) { - return; - } - if ( !in_mouse->integer ) - { - s_wmv.mouseActive = qfalse; - return; - } - if ( s_wmv.mouseActive ) - { - return; - } - - s_wmv.mouseActive = qtrue; - - if ( in_mouse->integer == 2 ) { - IN_ActivateRawMouse(); - } else if ( in_mouse->integer != -1 ) { - IN_ActivateDIMouse(); - } - IN_ActivateWin32Mouse(); -} - - -/* -=========== -IN_DeactivateMouse - -Called when the window loses focus -=========== -*/ -void IN_DeactivateMouse( void ) { - if (!s_wmv.mouseInitialized ) { - return; - } - if (!s_wmv.mouseActive ) { - return; - } - s_wmv.mouseActive = qfalse; - - IN_DeactivateRawMouse(); - IN_DeactivateDIMouse(); - IN_DeactivateWin32Mouse(); -} - - - -/* -=========== -IN_StartupMouse -=========== -*/ -void IN_StartupMouse( void ) -{ - s_wmv.mouseInitialized = qfalse; - - if ( in_mouse->integer == 0 ) { - Com_Printf ("Mouse control not active.\n"); - return; - } - - // nt4.0 direct input is screwed up - if ( ( g_wv.osversion.dwPlatformId == VER_PLATFORM_WIN32_NT ) && - ( g_wv.osversion.dwMajorVersion == 4 ) ) - { - Com_Printf ("Disallowing DirectInput on NT 4.0\n"); - Cvar_Set( "in_mouse", "-1" ); - } - - s_wmv.mouseInitialized = qtrue; - - if ( in_mouse->integer == -1 ) { - Com_Printf ("Skipping check for DirectInput\n"); - } else if ( in_mouse->integer == 2 ) { - if ( IN_InitRawMouse() ) { - return; - } - Com_Printf ("Falling back to Win32 mouse support...\n"); - } else { - if ( IN_InitDIMouse() ) { - return; - } - Com_Printf ("Falling back to Win32 mouse support...\n"); - } - IN_InitWin32Mouse(); -} - -/* -=========== -IN_MouseEvent -=========== -*/ -#define MAX_MOUSE_BUTTONS 5 - -static int mouseConvert[MAX_MOUSE_BUTTONS] = -{ - A_MOUSE1, - A_MOUSE2, - A_MOUSE3, - A_MOUSE4, - A_MOUSE5 -}; - -void IN_MouseEvent (int mstate) -{ - int i; - - if ( !s_wmv.mouseInitialized ) - { - return; - } - - // perform button actions - for (i = 0 ; i < MAX_MOUSE_BUTTONS ; i++ ) - { - if ( (mstate & (1 << i)) && !(s_wmv.oldButtonState & (1 << i)) ) - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, mouseConvert[i], true, 0, NULL ); - } - if ( !(mstate & (1 << i)) && (s_wmv.oldButtonState & (1 << i)) ) - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, mouseConvert[i], false, 0, NULL ); - } - } - s_wmv.oldButtonState = mstate; -} - - - -/* -=========== -IN_MouseMove -=========== -*/ -void IN_MouseMove ( void ) { - int mx, my; - - if ( rawMouseInitialized ) { - IN_RawMouse( &mx, &my ); - } else if ( g_pMouse ) { - IN_DIMouse( &mx, &my ); - } else { - IN_Win32Mouse( &mx, &my ); - } - - if ( !mx && !my ) { - return; - } - - Sys_QueEvent( 0, SE_MOUSE, mx, my, 0, NULL ); -} - - -/* -========================================================================= - -========================================================================= -*/ - -/* -=========== -IN_Startup -=========== -*/ -void IN_Startup( void ) { - Com_Printf ("\n------- Input Initialization -------\n"); - IN_StartupMouse (); - IN_StartupJoystick (); - IN_StartupMIDI(); - Com_Printf ("------------------------------------\n"); - - in_mouse->modified = qfalse; - in_joystick->modified = qfalse; -} - -/* -=========== -IN_Shutdown -=========== -*/ -void IN_Shutdown( void ) { - IN_DeactivateMouse(); - IN_ShutdownRawMouse(); - IN_ShutdownDIMouse(); - IN_ShutdownMIDI(); -#ifndef NO_XINPUT - if( in_joystick && in_joystick->integer == 2 ) - { - IN_UnloadXInput(); - } -#endif - Cmd_RemoveCommand("midiinfo" ); -} - - -/* -=========== -IN_Init -=========== -*/ -void IN_Init( void ) { - // MIDI input controler variables - in_midi = Cvar_Get ("in_midi", "0", CVAR_ARCHIVE); - in_midiport = Cvar_Get ("in_midiport", "1", CVAR_ARCHIVE); - in_midichannel = Cvar_Get ("in_midichannel", "1", CVAR_ARCHIVE); - in_mididevice = Cvar_Get ("in_mididevice", "0", CVAR_ARCHIVE); - - Cmd_AddCommand( "midiinfo", MidiInfo_f ); - - // mouse variables - in_mouse = Cvar_Get ("in_mouse", "-1", CVAR_ARCHIVE|CVAR_LATCH); - - // joystick variables - in_joystick = Cvar_Get ("in_joystick", "0", CVAR_ARCHIVE|CVAR_LATCH); - in_joyBallScale = Cvar_Get ("in_joyBallScale", "0.02", CVAR_ARCHIVE); - in_debugJoystick = Cvar_Get ("in_debugjoystick", "0", CVAR_TEMP); - - joy_threshold = Cvar_Get ("joy_threshold", "0.15", CVAR_ARCHIVE); - - joy_xbutton = Cvar_Get ("joy_xbutton", "1", CVAR_ARCHIVE); // treat axis as a button - joy_ybutton = Cvar_Get ("joy_ybutton", "0", CVAR_ARCHIVE); // treat axis as a button - -#ifndef NO_XINPUT - xin_invertThumbsticks = Cvar_Get ("xin_invertThumbsticks", "0", CVAR_ARCHIVE); - xin_invertLookX = Cvar_Get ("xin_invertLookX", "0", CVAR_ARCHIVE); - xin_invertLookY = Cvar_Get ("xin_invertLookY", "0", CVAR_ARCHIVE); - - xin_rumbleScale = Cvar_Get ("xin_rumbleScale", "1.0", CVAR_ARCHIVE); - -#endif - - IN_Startup(); -} - - -/* -=========== -IN_Activate - -Called when the main window gains or loses focus. -The window may have been destroyed and recreated -between a deactivate and an activate. -=========== -*/ -void IN_Activate (qboolean active) { - in_appactive = active; - - if ( !active ) - { - IN_DeactivateMouse(); - } -} - - -/* -================== -IN_Frame - -Called every frame, even if not generating commands -================== -*/ -void IN_Frame (void) { - // post joystick events - IN_JoyMove(); - - if ( !s_wmv.mouseInitialized ) { - return; - } - - // If not DISCONNECTED (main menu) or ACTIVE (in game), we're loading - qboolean loading = (qboolean)( cls.state != CA_DISCONNECTED && cls.state != CA_ACTIVE ); - - if( !Cvar_VariableIntegerValue("r_fullscreen") && ( Key_GetCatcher( ) & KEYCATCH_CONSOLE ) ) { - // temporarily deactivate if not in the game and - // running on the desktop - IN_DeactivateMouse (); - return; - } - - if( !Cvar_VariableIntegerValue("r_fullscreen") && loading ) { - IN_DeactivateMouse (); - return; - } - - if ( !in_appactive ) { - IN_DeactivateMouse (); - return; - } - - IN_ActivateMouse(); - - // post events to the system que - IN_MouseMove(); - -} - - -/* -=================== -IN_ClearStates -=================== -*/ -void IN_ClearStates (void) -{ - s_wmv.oldButtonState = 0; -} - - -/* -========================================================================= - -JOYSTICK - -========================================================================= -*/ - -#ifndef NO_XINPUT - -typedef struct { - WORD wButtons; - BYTE bLeftTrigger; - BYTE bRightTrigger; - SHORT sThumbLX; - SHORT sThumbLY; - SHORT sThumbRX; - SHORT sThumbRY; - DWORD dwPaddingReserved; -} XINPUT_GAMEPAD_EX; - -typedef struct { - DWORD dwPacketNumber; - XINPUT_GAMEPAD_EX Gamepad; -} XINPUT_STATE_EX; - -#define X360_GUIDE_BUTTON 0x0400 -#define X360_LEFT_TRIGGER_MASK 0x10000 -#define X360_RIGHT_TRIGGER_MASK 0x20000 - -static XINPUT_STATE_EX xiState; -static DWORD dwLastXIButtonState; - -static HMODULE xiLibrary = NULL; - -typedef DWORD (__stdcall *XIGetFuncPointer)(DWORD, XINPUT_STATE_EX *); -typedef DWORD (__stdcall *XISetFuncPointer)(DWORD, XINPUT_VIBRATION *); -XIGetFuncPointer XI_GetStateEx = NULL; -XISetFuncPointer XI_SetState = NULL; - -/* -=============== -IN_LoadXInput - -Uses direct DLL loading as opposed to static linkage -This is because, as Ensiform pointed out, Windows 8 -and Windows 7 use different XInput versions, hence -different linkage. -=============== -*/ - -qboolean IN_LoadXInput ( void ) -{ - int lastNum; - if( xiLibrary ) - return qfalse; // already loaded - - for(lastNum = 4; lastNum >= 3; lastNum--) // increment as more XInput versions become supported - { - xiLibrary = LoadLibrary( va("XInput1_%i.dll", lastNum) ); - if( xiLibrary) - break; - } - if( !xiLibrary ) - { - Com_Printf( S_COLOR_RED"XInput not detected on your system. Please download the XBOX 360 drivers from the Microsoft home page.\n" ); - return qfalse; - } - - // MEGA HACK: - // Ordinal 100 in the XInput DLL supposedly contains a modified/improved version - // of the XInputGetState function, with one key difference: XInputGetState does - // not get the status of the XBOX Guide button, while XInputGetStateEx does. - XI_GetStateEx = (XIGetFuncPointer)GetProcAddress( xiLibrary, (LPCSTR)100 ); - XI_SetState = (XISetFuncPointer)GetProcAddress( xiLibrary, "XInputSetState" ); - - if( !XI_GetStateEx || !XI_SetState ) - { - Com_Printf("^1IN_LoadXInput failed on pointer establish\n"); - IN_UnloadXInput(); - return qfalse; - } - return qtrue; -} - -/* -=============== -IN_UnloadXInput - -XInput gets unloaded if we change input modes or we shut -down the game -=============== -*/ - -void IN_UnloadXInput ( void ) -{ - if( !xiLibrary ) - { - // not loaded, so don't bother trying to unload - return; - } - FreeLibrary( xiLibrary ); - xiLibrary = NULL; -} - -/* -=============== -IN_JoystickInitXInput - -XBOX 360 controller only -=============== -*/ - -void IN_JoystickInitXInput ( void ) -{ - Com_Printf("Joystick cvar enabled -- XInput mode\n"); - - if(!IN_LoadXInput()) - { - Com_Printf("Could not load XInput -- see above error. Controller not enabled.\n"); - return; - } - - ZeroMemory( &xiState, sizeof(XINPUT_STATE_EX) ); - dwLastXIButtonState = 0UL; - - if (XI_GetStateEx( 0, &xiState ) != ERROR_SUCCESS ) { // only support for Controller 1 atm. If I get bored or something, - // I'll probably add a splitscreen mode just for lulz --eez - Com_Printf("XBOX 360 controller not detected -- no drivers or bad connection\n"); - return; - } - - joy.avail = qtrue; // semi hack, we really have no use for joy. whatever, but we use this to message when connection state changes - -} - -#endif - -/* -=============== -IN_JoystickInitDInput - -DirectInput only -=============== -*/ -void IN_JoystickInitDInput ( void ) -{ - int numdevs; - MMRESULT mmr; - - Com_Printf("Joystick cvar enabled -- DirectInput mode\n"); - - // verify joystick driver is present - if ((numdevs = joyGetNumDevs ()) == 0) - { - Com_Printf ("joystick not found -- driver not present\n"); - return; - } - - // cycle through the joystick ids for the first valid one - mmr = 0; - for (joy.id=0 ; joy.idinteger == 1 ) - { - // DirectInput mode --eez - IN_JoystickInitDInput(); - } -#ifndef NO_XINPUT - else if ( in_joystick->integer == 2 ) - { - // xbox 360 awesomeness - IN_JoystickInitXInput(); - } -#endif - else { - Com_Printf ("Joystick is not active.\n"); - return; - } - -} - -/* -=========== -JoyToF -=========== -*/ -float JoyToF( int value ) { - float fValue; - - // move centerpoint to zero - value -= 32768; - - // convert range from -32768..32767 to -1..1 - fValue = (float)value / 32768.0; - - if ( fValue < -1 ) { - fValue = -1; - } - if ( fValue > 1 ) { - fValue = 1; - } - return fValue; -} - -int JoyToI( int value ) { - // move centerpoint to zero - value -= 32768; - - return value; -} - -int joyDirectionKeys[16] = { - A_CURSOR_LEFT, A_CURSOR_RIGHT, - A_CURSOR_UP, A_CURSOR_DOWN, - A_JOY16, A_JOY17, - A_JOY18, A_JOY19, - A_JOY20, A_JOY21, - A_JOY22, A_JOY23, - - A_JOY24, A_JOY25, - A_JOY26, A_JOY27 -}; - -/* -=========== -IN_DoDirectInput - -Equivalent of IN_JoyMove for DirectInput -=========== -*/ - -void IN_DoDirectInput( void ) -{ - float fAxisValue; - int i; - DWORD buttonstate, povstate; - int x, y; - - // collect the joystick data, if possible - memset (&joy.ji, 0, sizeof(joy.ji)); - joy.ji.dwSize = sizeof(joy.ji); - joy.ji.dwFlags = JOY_RETURNALL; - - if ( joyGetPosEx (joy.id, &joy.ji) != JOYERR_NOERROR ) { - // read error occurred - // turning off the joystick seems too harsh for 1 read error,\ - // but what should be done? - // Com_Printf ("IN_ReadJoystick: no response\n"); - // joy.avail = false; - return; - } - - if ( in_debugJoystick->integer ) { - Com_Printf( "%8x %5i %5.2f %5.2f %5.2f %5.2f %6i %6i\n", - joy.ji.dwButtons, - joy.ji.dwPOV, - JoyToF( joy.ji.dwXpos ), JoyToF( joy.ji.dwYpos ), - JoyToF( joy.ji.dwZpos ), JoyToF( joy.ji.dwRpos ), - JoyToI( joy.ji.dwUpos ), JoyToI( joy.ji.dwVpos ) ); - } - - // loop through the joystick buttons - // key a joystick event or auxillary event for higher number buttons for each state change - buttonstate = joy.ji.dwButtons; - for ( i=0 ; i < joy.jc.wNumButtons ; i++ ) { - if ( (buttonstate & (1<integer) { - if ( fAxisValue < -joy_threshold->value || fAxisValue > joy_threshold->value){ - Sys_QueEvent( g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_SIDE, (int) -(fAxisValue*127.0), 0, NULL ); - }else{ - Sys_QueEvent( g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_SIDE, 0, 0, NULL ); - } - continue; - } - - if (i == 1 && !joy_ybutton->integer) { - if ( fAxisValue < -joy_threshold->value || fAxisValue > joy_threshold->value){ - Sys_QueEvent( g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_FORWARD, (int) -(fAxisValue*127.0), 0, NULL ); - }else{ - Sys_QueEvent( g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_FORWARD, 0, 0, NULL ); - } - continue; - } - - if ( fAxisValue < -joy_threshold->value ) { - povstate |= (1<<(i*2)); - } else if ( fAxisValue > joy_threshold->value ) { - povstate |= (1<<(i*2+1)); - } - } - - // convert POV information from a direction into 4 button bits - if ( joy.jc.wCaps & JOYCAPS_HASPOV ) { - if ( joy.ji.dwPOV != JOY_POVCENTERED ) { - if (joy.ji.dwPOV == JOY_POVFORWARD) - povstate |= 1<<12; - if (joy.ji.dwPOV == JOY_POVBACKWARD) - povstate |= 1<<13; - if (joy.ji.dwPOV == JOY_POVRIGHT) - povstate |= 1<<14; - if (joy.ji.dwPOV == JOY_POVLEFT) - povstate |= 1<<15; - } - } - - // determine which bits have changed and key an auxillary event for each change - for (i=0 ; i < 16 ; i++) { - if ( (povstate & (1<= 6 ) { - x = JoyToI( joy.ji.dwUpos ) * in_joyBallScale->value; - y = JoyToI( joy.ji.dwVpos ) * in_joyBallScale->value; - if ( x || y ) { - Sys_QueEvent( g_wv.sysMsgTime, SE_MOUSE, x, y, 0, NULL ); - } - } -} - -#ifndef NO_XINPUT -/* -=========== -XI_ThumbFloat - -Gets the percentage going one way or the other (as normalized float) -=========== -*/ -float QINLINE XI_ThumbFloat( signed short thumbValue ) -{ - return (thumbValue < 0) ? (thumbValue / 32768.0f) : (thumbValue / 32767.0f); -} - -/* -=========== -XI_ApplyInversion - -Inverts look up/down and look left/right appropriately -=========== -*/ -void XI_ApplyInversion( float *fX, float *fY ) -{ - if( xin_invertLookX->integer ) - *fX *= -1.0f; - if( xin_invertLookY->integer ) - *fY *= -1.0f; -} - -#define CheckButtonStatus( xin, fakekey ) \ - if ( (xiState.Gamepad.wButtons & xin) && !(dwLastXIButtonState & xin) ) \ - Sys_QueEvent(g_wv.sysMsgTime, SE_KEY, fakekey, qtrue, 0, NULL); \ - if ( !(xiState.Gamepad.wButtons & xin) && (dwLastXIButtonState & xin) ) \ - Sys_QueEvent(g_wv.sysMsgTime, SE_KEY, fakekey, qfalse, 0, NULL); \ - if ( (xiState.Gamepad.wButtons & xin) ) \ - dwLastXIButtonState |= xin; \ - else \ - dwLastXIButtonState &= ~xin; \ - -/* -=========== -IN_DoXInput - -Equivalent of IN_JoyMove for XInput (xbox 360) -=========== -*/ - -void IN_DoXInput( void ) -{ - if(!joy.avail) - { - // Joystick not found, continue to search for it :> - if( XI_GetStateEx(0, &xiState) == ERROR_SUCCESS ) - { - joy.avail = qtrue; - Com_Printf("Controller connected.\n"); - } - else - { - return; - } - } - else - { - if( XI_GetStateEx(0, &xiState) != ERROR_SUCCESS ) - { - joy.avail = qfalse; - Com_Printf("Controller disconnected.\n"); - return; - } - } - - // Now that we've dealt with the basic checks for connectivity, let's actually do the _important_ crap. - float leftThumbX = XI_ThumbFloat(xiState.Gamepad.sThumbLX); - float leftThumbY = XI_ThumbFloat(xiState.Gamepad.sThumbLY); - float rightThumbX = XI_ThumbFloat(xiState.Gamepad.sThumbRX); - float rightThumbY = XI_ThumbFloat(xiState.Gamepad.sThumbRY); - float dX = 0, dY = 0; - - /* hi microsoft, go fuck yourself for flipping left stick's Y axis for no reason... */ - leftThumbY *= -1.0f; - rightThumbY *= -1.0f; - - // JOYSTICKS - // This is complete and utter trash in DirectInput, because it doesn't send like half as much crap as it should. - if( xin_invertThumbsticks->integer ) - { - // Left stick functions like right stick - XI_ApplyInversion(&leftThumbX, &leftThumbY); - - // Left stick behavior - if( abs(leftThumbX) > joy_threshold->value ) // FIXME: what does do about deadzones and sensitivity... - { - dX = (leftThumbX-joy_threshold->value) * in_joyBallScale->value; - } - if( abs(leftThumbY) > joy_threshold->value ) - { - dY = (leftThumbY-joy_threshold->value) * in_joyBallScale->value; - } - - Sys_QueEvent(g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_YAW, rightThumbX, 0, NULL); - Sys_QueEvent(g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_PITCH, rightThumbY, 0, NULL); - - // Right stick behavior - // Hardcoded deadzone within the gamecode itself to deal with the situation - Sys_QueEvent(g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_SIDE, rightThumbX * 127, 0, NULL); - Sys_QueEvent(g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_FORWARD, rightThumbY * -127, 0, NULL); - } - else - { - // Thumbsticks act as they should (right stick = camera, left stick = wasd equivalent) - XI_ApplyInversion(&rightThumbX, &rightThumbY); - - // Left stick behavior - // Hardcoded deadzone within the gamecode itself to deal with the situation - Sys_QueEvent(g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_SIDE, leftThumbX * 127, 0, NULL); - Sys_QueEvent(g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_FORWARD, leftThumbY * -127, 0, NULL); - - // Right stick behavior - if( abs(rightThumbX) > joy_threshold->value ) - { - float factor = abs(rightThumbX*128); - dX = (rightThumbX-joy_threshold->value) * in_joyBallScale->value * factor; - if(in_debugJoystick->integer) - Com_Printf("rightThumbX: %f\tfactor: %f\tdX: %f\n", rightThumbX, factor, dX); - } - if( abs(rightThumbY) > joy_threshold->value ) - { - float factor = abs(rightThumbY*128); - dY = (rightThumbY-joy_threshold->value) * in_joyBallScale->value * factor; - if(in_debugJoystick->integer) - Com_Printf("rightThumbY: %f\tfactor: %f\tdX: %f\n", rightThumbY, factor, dY); - } - - // ...but cap it at a reasonable amount. - if(dX < -2.5f) dX = -2.5f; - if(dX > 2.5f) dX = 2.5f; - if(dY < -2.5f) dY = -2.5f; - if(dY > 2.5f) dY = 2.5f; - - dX *= 1024; - dY *= 1024; - - Sys_QueEvent(g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_YAW, dX, 0, NULL); - Sys_QueEvent(g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_PITCH, dY, 0, NULL); - } - - if ( (Key_GetCatcher() & KEYCATCH_UI) ) { - CheckButtonStatus( XINPUT_GAMEPAD_DPAD_UP, A_CURSOR_UP ); - CheckButtonStatus( XINPUT_GAMEPAD_DPAD_DOWN, A_CURSOR_DOWN ); - CheckButtonStatus( XINPUT_GAMEPAD_DPAD_LEFT, A_CURSOR_LEFT ); - CheckButtonStatus( XINPUT_GAMEPAD_DPAD_RIGHT, A_CURSOR_RIGHT ); - CheckButtonStatus( XINPUT_GAMEPAD_START, A_JOY4 ); - CheckButtonStatus( XINPUT_GAMEPAD_BACK, A_JOY5 ); - CheckButtonStatus( XINPUT_GAMEPAD_LEFT_THUMB, A_JOY6 ); - CheckButtonStatus( XINPUT_GAMEPAD_RIGHT_THUMB, A_JOY7 ); - CheckButtonStatus( XINPUT_GAMEPAD_LEFT_SHOULDER, A_JOY8 ); - CheckButtonStatus( XINPUT_GAMEPAD_RIGHT_SHOULDER, A_JOY9 ); - CheckButtonStatus( X360_GUIDE_BUTTON, A_JOY10 ); - CheckButtonStatus( XINPUT_GAMEPAD_A, A_ENTER ); - CheckButtonStatus( XINPUT_GAMEPAD_B, A_JOY12 ); - CheckButtonStatus( XINPUT_GAMEPAD_X, A_JOY13 ); - CheckButtonStatus( XINPUT_GAMEPAD_Y, A_JOY14 ); - } - else { - CheckButtonStatus( XINPUT_GAMEPAD_DPAD_UP, A_JOY0 ); - CheckButtonStatus( XINPUT_GAMEPAD_DPAD_DOWN, A_JOY1 ); - CheckButtonStatus( XINPUT_GAMEPAD_DPAD_LEFT, A_JOY2 ); - CheckButtonStatus( XINPUT_GAMEPAD_DPAD_RIGHT, A_JOY3 ); - CheckButtonStatus( XINPUT_GAMEPAD_START, A_JOY4 ); - CheckButtonStatus( XINPUT_GAMEPAD_BACK, A_JOY5 ); - CheckButtonStatus( XINPUT_GAMEPAD_LEFT_THUMB, A_JOY6 ); - CheckButtonStatus( XINPUT_GAMEPAD_RIGHT_THUMB, A_JOY7 ); - CheckButtonStatus( XINPUT_GAMEPAD_LEFT_SHOULDER, A_JOY8 ); - CheckButtonStatus( XINPUT_GAMEPAD_RIGHT_SHOULDER, A_JOY9 ); - CheckButtonStatus( X360_GUIDE_BUTTON, A_JOY10 ); - CheckButtonStatus( XINPUT_GAMEPAD_A, A_JOY11 ); - CheckButtonStatus( XINPUT_GAMEPAD_B, A_JOY12 ); - CheckButtonStatus( XINPUT_GAMEPAD_X, A_JOY13 ); - CheckButtonStatus( XINPUT_GAMEPAD_Y, A_JOY14 ); - } - - // extra magic required for the triggers - if( xiState.Gamepad.bLeftTrigger && !(dwLastXIButtonState & X360_LEFT_TRIGGER_MASK) ) - { - Sys_QueEvent(g_wv.sysMsgTime, SE_KEY, A_JOY15, qtrue, 0, NULL); - } - else if( !xiState.Gamepad.bLeftTrigger && ( dwLastXIButtonState & X360_LEFT_TRIGGER_MASK ) ) - { - Sys_QueEvent(g_wv.sysMsgTime, SE_KEY, A_JOY15, qfalse, 0, NULL); - } - if( xiState.Gamepad.bLeftTrigger ) - dwLastXIButtonState |= X360_LEFT_TRIGGER_MASK; - else - dwLastXIButtonState &= ~X360_LEFT_TRIGGER_MASK; - - if( xiState.Gamepad.bRightTrigger && !( dwLastXIButtonState & X360_RIGHT_TRIGGER_MASK ) ) - { - Sys_QueEvent(g_wv.sysMsgTime, SE_KEY, A_JOY16, qtrue, 0, NULL); - } - else if( !xiState.Gamepad.bRightTrigger && ( dwLastXIButtonState & X360_RIGHT_TRIGGER_MASK ) ) - { - Sys_QueEvent(g_wv.sysMsgTime, SE_KEY, A_JOY16, qfalse, 0, NULL); - } - if( xiState.Gamepad.bRightTrigger ) - dwLastXIButtonState |= X360_RIGHT_TRIGGER_MASK; - else - dwLastXIButtonState &= ~X360_RIGHT_TRIGGER_MASK; - - if(in_debugJoystick->integer) - Com_Printf("buttons: \t%i\n", dwLastXIButtonState); -} -#endif - -/* -=========== -IN_JoyMove -=========== -*/ -void IN_JoyMove( void ) -{ - if( in_joystick->integer == 1 && joy.avail) - { - IN_DoDirectInput(); - } -#ifndef NO_XINPUT - else if( in_joystick->integer == 2 ) - { - IN_DoXInput(); - } -#endif -} - -/* -========================================================================= - -MIDI - -========================================================================= -*/ - -static void MIDI_NoteOff( int note ) -{ - int qkey; - - qkey = note - 60 + A_AUX0; - - if ( qkey < A_AUX0 ) - { - return; - } - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, qkey, qfalse, 0, NULL ); -} - -static void MIDI_NoteOn( int note, int velocity ) -{ - int qkey; - - if ( velocity == 0 ) - { - MIDI_NoteOff( note ); - } - - qkey = note - 60 + A_AUX0; - - if ( qkey < A_AUX0 ) - { - return; - } - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, qkey, qtrue, 0, NULL ); -} - -static void CALLBACK MidiInProc( HMIDIIN hMidiIn, UINT uMsg, DWORD dwInstance, - DWORD dwParam1, DWORD dwParam2 ) -{ - int message; - - switch ( uMsg ) - { - case MIM_OPEN: - break; - case MIM_CLOSE: - break; - case MIM_DATA: - message = dwParam1 & 0xff; - - // note on - if ( ( message & 0xf0 ) == 0x90 ) - { - if ( ( ( message & 0x0f ) + 1 ) == in_midichannel->integer ) - MIDI_NoteOn( ( dwParam1 & 0xff00 ) >> 8, ( dwParam1 & 0xff0000 ) >> 16 ); - } - else if ( ( message & 0xf0 ) == 0x80 ) - { - if ( ( ( message & 0x0f ) + 1 ) == in_midichannel->integer ) - MIDI_NoteOff( ( dwParam1 & 0xff00 ) >> 8 ); - } - break; - case MIM_LONGDATA: - break; - case MIM_ERROR: - break; - case MIM_LONGERROR: - break; - } - -// Sys_QueEvent( sys_msg_time, SE_KEY, wMsg, qtrue, 0, NULL ); -} - -static void MidiInfo_f( void ) -{ - int i; - - const char *enableStrings[] = { "disabled", "enabled" }; - - Com_Printf( "\nMIDI control: %s\n", enableStrings[in_midi->integer != 0] ); - Com_Printf( "port: %d\n", in_midiport->integer ); - Com_Printf( "channel: %d\n", in_midichannel->integer ); - Com_Printf( "current device: %d\n", in_mididevice->integer ); - Com_Printf( "number of devices: %d\n", s_midiInfo.numDevices ); - for ( i = 0; i < s_midiInfo.numDevices; i++ ) - { - if ( i == Cvar_VariableIntegerValue( "in_mididevice" ) ) - Com_Printf( "***" ); - else - Com_Printf( "..." ); - Com_Printf( "device %2d: %s\n", i, s_midiInfo.caps[i].szPname ); - Com_Printf( "...manufacturer ID: 0x%hx\n", s_midiInfo.caps[i].wMid ); - Com_Printf( "...product ID: 0x%hx\n", s_midiInfo.caps[i].wPid ); - - Com_Printf( "\n" ); - } -} - -static void IN_StartupMIDI( void ) -{ - int i; - - if ( !Cvar_VariableIntegerValue( "in_midi" ) ) - return; - - // - // enumerate MIDI IN devices - // - s_midiInfo.numDevices = midiInGetNumDevs(); - - for ( i = 0; i < s_midiInfo.numDevices; i++ ) - { - midiInGetDevCaps( i, &s_midiInfo.caps[i], sizeof( s_midiInfo.caps[i] ) ); - } - - // - // open the MIDI IN port - // - if ( midiInOpen( &s_midiInfo.hMidiIn, - in_mididevice->integer, - ( unsigned long ) MidiInProc, - ( unsigned long ) NULL, - CALLBACK_FUNCTION ) != MMSYSERR_NOERROR ) - { - Com_Printf( "WARNING: could not open MIDI device %d: '%s'\n", in_mididevice->integer , s_midiInfo.caps[( int ) in_mididevice->value] ); - return; - } - - midiInStart( s_midiInfo.hMidiIn ); -} - -static void IN_ShutdownMIDI( void ) -{ - if ( s_midiInfo.hMidiIn ) - { - midiInClose( s_midiInfo.hMidiIn ); - } - memset( &s_midiInfo, 0, sizeof( s_midiInfo ) ); -} diff --git a/code/win32/win_local.h b/code/win32/win_local.h deleted file mode 100644 index 6ecb8c6dc7..0000000000 --- a/code/win32/win_local.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 2 - as published by the Free Software Foundation. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . -*/ -// Copyright 2001-2013 Raven Software - -// win_local.h: Win32-specific Quake3 header file - -#pragma once - -#if defined (_MSC_VER) && (_MSC_VER >= 1200) -#pragma warning(disable : 4201) -#pragma warning( push ) -#endif - -#if defined (_MSC_VER) && (_MSC_VER >= 1200) -#pragma warning( pop ) -#endif - -#define DIRECTINPUT_VERSION 0x0800 //[ 0x0300 | 0x0500 | 0x0700 | 0x0800 ] -#include -#include - -void IN_MouseEvent (int mstate); -void IN_RawMouseEvent( int lastX, int lastY ); // Send raw input events to the input subsystem - -void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptrLength, void *ptr ); - -void Sys_CreateConsole( void ); -void Sys_DestroyConsole( void ); - -char *Sys_ConsoleInput (void); - -// Input subsystem - -void IN_Init (void); -void IN_Shutdown (void); -void IN_JoystickCommands (void); - -void IN_Move (usercmd_t *cmd); -// add additional non keyboard / non mouse movement on top of the keyboard move cmd - -void IN_DeactivateWin32Mouse( void); - -void IN_Activate (qboolean active); -void IN_Frame (void); - -// window procedure -LONG WINAPI MainWndProc ( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -void Conbuf_AppendText( const char *msg ); - -void SNDDMA_Activate( qboolean bAppActive ); -int SNDDMA_InitDS (); - -typedef struct -{ - HWND hWnd; - HINSTANCE hInstance; - qboolean activeApp; - qboolean isMinimized; - OSVERSIONINFO osversion; - - // when we get a windows message, we store the time off so keyboard processing - // can know the exact time of an event - unsigned sysMsgTime; -} WinVars_t; - -extern WinVars_t g_wv; - - -#define MAX_QUED_EVENTS 256 -#define MASK_QUED_EVENTS ( MAX_QUED_EVENTS - 1 ) - diff --git a/code/win32/win_qgl.cpp b/code/win32/win_qgl.cpp deleted file mode 100644 index 7320b69529..0000000000 --- a/code/win32/win_qgl.cpp +++ /dev/null @@ -1,4289 +0,0 @@ -/* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 2 - as published by the Free Software Foundation. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . -*/ -// Copyright 2001-2013 Raven Software - -// leave this as first line for PCH reasons... -// -#include "../server/exe_headers.h" - - -/* -** QGL_WIN.C -** -** This file implements the operating system binding of GL to QGL function -** pointers. When doing a port of Quake3 you must implement the following -** two functions: -** -** QGL_Init() - loads libraries, assigns function pointers, etc. -** QGL_Shutdown() - unloads libraries, NULLs function pointers -*/ -#include -#include "tr_local.h" -#include "../win32/glw_win.h" - -void QGL_EnableLogging( qboolean enable ); - -int ( WINAPI * qwglSwapIntervalEXT)( int interval ); - -BOOL ( WINAPI * qwglCopyContext)(HGLRC, HGLRC, UINT); -HGLRC ( WINAPI * qwglCreateContext)(HDC); -HGLRC ( WINAPI * qwglCreateLayerContext)(HDC, int); -BOOL ( WINAPI * qwglDeleteContext)(HGLRC); -HGLRC ( WINAPI * qwglGetCurrentContext)(VOID); -HDC ( WINAPI * qwglGetCurrentDC)(VOID); -PROC ( WINAPI * qwglGetProcAddress)(LPCSTR); -BOOL ( WINAPI * qwglMakeCurrent)(HDC, HGLRC); -BOOL ( WINAPI * qwglShareLists)(HGLRC, HGLRC); -BOOL ( WINAPI * qwglUseFontBitmaps)(HDC, DWORD, DWORD, DWORD); - -BOOL ( WINAPI * qwglUseFontOutlines)(HDC, DWORD, DWORD, DWORD, FLOAT, - FLOAT, int, LPGLYPHMETRICSFLOAT); - -BOOL ( WINAPI * qwglDescribeLayerPlane)(HDC, int, int, UINT, - LPLAYERPLANEDESCRIPTOR); -int ( WINAPI * qwglSetLayerPaletteEntries)(HDC, int, int, int, - CONST COLORREF *); -int ( WINAPI * qwglGetLayerPaletteEntries)(HDC, int, int, int, - COLORREF *); -BOOL ( WINAPI * qwglRealizeLayerPalette)(HDC, int, BOOL); -BOOL ( WINAPI * qwglSwapLayerBuffers)(HDC, UINT); - -void ( APIENTRY * qglAccum )(GLenum op, GLfloat value); -void ( APIENTRY * qglAlphaFunc )(GLenum func, GLclampf ref); -GLboolean ( APIENTRY * qglAreTexturesResident )(GLsizei n, const GLuint *textures, GLboolean *residences); -void ( APIENTRY * qglArrayElement )(GLint i); -void ( APIENTRY * qglBegin )(GLenum mode); -void ( APIENTRY * qglBindTexture )(GLenum target, GLuint texture); -void ( APIENTRY * qglBitmap )(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); -void ( APIENTRY * qglBlendFunc )(GLenum sfactor, GLenum dfactor); -void ( APIENTRY * qglCallList )(GLuint list); -void ( APIENTRY * qglCallLists )(GLsizei n, GLenum type, const GLvoid *lists); -void ( APIENTRY * qglClear )(GLbitfield mask); -void ( APIENTRY * qglClearAccum )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -void ( APIENTRY * qglClearColor )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -void ( APIENTRY * qglClearDepth )(GLclampd depth); -void ( APIENTRY * qglClearIndex )(GLfloat c); -void ( APIENTRY * qglClearStencil )(GLint s); -void ( APIENTRY * qglClipPlane )(GLenum plane, const GLdouble *equation); -void ( APIENTRY * qglColor3b )(GLbyte red, GLbyte green, GLbyte blue); -void ( APIENTRY * qglColor3bv )(const GLbyte *v); -void ( APIENTRY * qglColor3d )(GLdouble red, GLdouble green, GLdouble blue); -void ( APIENTRY * qglColor3dv )(const GLdouble *v); -void ( APIENTRY * qglColor3f )(GLfloat red, GLfloat green, GLfloat blue); -void ( APIENTRY * qglColor3fv )(const GLfloat *v); -void ( APIENTRY * qglColor3i )(GLint red, GLint green, GLint blue); -void ( APIENTRY * qglColor3iv )(const GLint *v); -void ( APIENTRY * qglColor3s )(GLshort red, GLshort green, GLshort blue); -void ( APIENTRY * qglColor3sv )(const GLshort *v); -void ( APIENTRY * qglColor3ub )(GLubyte red, GLubyte green, GLubyte blue); -void ( APIENTRY * qglColor3ubv )(const GLubyte *v); -void ( APIENTRY * qglColor3ui )(GLuint red, GLuint green, GLuint blue); -void ( APIENTRY * qglColor3uiv )(const GLuint *v); -void ( APIENTRY * qglColor3us )(GLushort red, GLushort green, GLushort blue); -void ( APIENTRY * qglColor3usv )(const GLushort *v); -void ( APIENTRY * qglColor4b )(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -void ( APIENTRY * qglColor4bv )(const GLbyte *v); -void ( APIENTRY * qglColor4d )(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -void ( APIENTRY * qglColor4dv )(const GLdouble *v); -void ( APIENTRY * qglColor4f )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -void ( APIENTRY * qglColor4fv )(const GLfloat *v); -void ( APIENTRY * qglColor4i )(GLint red, GLint green, GLint blue, GLint alpha); -void ( APIENTRY * qglColor4iv )(const GLint *v); -void ( APIENTRY * qglColor4s )(GLshort red, GLshort green, GLshort blue, GLshort alpha); -void ( APIENTRY * qglColor4sv )(const GLshort *v); -void ( APIENTRY * qglColor4ub )(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -void ( APIENTRY * qglColor4ubv )(const GLubyte *v); -void ( APIENTRY * qglColor4ui )(GLuint red, GLuint green, GLuint blue, GLuint alpha); -void ( APIENTRY * qglColor4uiv )(const GLuint *v); -void ( APIENTRY * qglColor4us )(GLushort red, GLushort green, GLushort blue, GLushort alpha); -void ( APIENTRY * qglColor4usv )(const GLushort *v); -void ( APIENTRY * qglColorMask )(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -void ( APIENTRY * qglColorMaterial )(GLenum face, GLenum mode); -void ( APIENTRY * qglColorPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglCopyPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -void ( APIENTRY * qglCopyTexImage1D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -void ( APIENTRY * qglCopyTexImage2D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -void ( APIENTRY * qglCopyTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -void ( APIENTRY * qglCopyTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -void ( APIENTRY * qglCullFace )(GLenum mode); -void ( APIENTRY * qglDeleteLists )(GLuint list, GLsizei range); -void ( APIENTRY * qglDeleteTextures )(GLsizei n, const GLuint *textures); -void ( APIENTRY * qglDepthFunc )(GLenum func); -void ( APIENTRY * qglDepthMask )(GLboolean flag); -void ( APIENTRY * qglDepthRange )(GLclampd zNear, GLclampd zFar); -void ( APIENTRY * qglDisable )(GLenum cap); -void ( APIENTRY * qglDisableClientState )(GLenum array); -void ( APIENTRY * qglDrawArrays )(GLenum mode, GLint first, GLsizei count); -void ( APIENTRY * qglDrawBuffer )(GLenum mode); -void ( APIENTRY * qglDrawElements )(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -void ( APIENTRY * qglDrawPixels )(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglEdgeFlag )(GLboolean flag); -void ( APIENTRY * qglEdgeFlagPointer )(GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglEdgeFlagv )(const GLboolean *flag); -void ( APIENTRY * qglEnable )(GLenum cap); -void ( APIENTRY * qglEnableClientState )(GLenum array); -void ( APIENTRY * qglEnd )(void); -void ( APIENTRY * qglEndList )(void); -void ( APIENTRY * qglEvalCoord1d )(GLdouble u); -void ( APIENTRY * qglEvalCoord1dv )(const GLdouble *u); -void ( APIENTRY * qglEvalCoord1f )(GLfloat u); -void ( APIENTRY * qglEvalCoord1fv )(const GLfloat *u); -void ( APIENTRY * qglEvalCoord2d )(GLdouble u, GLdouble v); -void ( APIENTRY * qglEvalCoord2dv )(const GLdouble *u); -void ( APIENTRY * qglEvalCoord2f )(GLfloat u, GLfloat v); -void ( APIENTRY * qglEvalCoord2fv )(const GLfloat *u); -void ( APIENTRY * qglEvalMesh1 )(GLenum mode, GLint i1, GLint i2); -void ( APIENTRY * qglEvalMesh2 )(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -void ( APIENTRY * qglEvalPoint1 )(GLint i); -void ( APIENTRY * qglEvalPoint2 )(GLint i, GLint j); -void ( APIENTRY * qglFeedbackBuffer )(GLsizei size, GLenum type, GLfloat *buffer); -void ( APIENTRY * qglFinish )(void); -void ( APIENTRY * qglFlush )(void); -void ( APIENTRY * qglFogf )(GLenum pname, GLfloat param); -void ( APIENTRY * qglFogfv )(GLenum pname, const GLfloat *params); -void ( APIENTRY * qglFogi )(GLenum pname, GLint param); -void ( APIENTRY * qglFogiv )(GLenum pname, const GLint *params); -void ( APIENTRY * qglFrontFace )(GLenum mode); -void ( APIENTRY * qglFrustum )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLuint ( APIENTRY * qglGenLists )(GLsizei range); -void ( APIENTRY * qglGenTextures )(GLsizei n, GLuint *textures); -void ( APIENTRY * qglGetBooleanv )(GLenum pname, GLboolean *params); -void ( APIENTRY * qglGetClipPlane )(GLenum plane, GLdouble *equation); -void ( APIENTRY * qglGetDoublev )(GLenum pname, GLdouble *params); -GLenum ( APIENTRY * qglGetError )(void); -void ( APIENTRY * qglGetFloatv )(GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetIntegerv )(GLenum pname, GLint *params); -void ( APIENTRY * qglGetLightfv )(GLenum light, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetLightiv )(GLenum light, GLenum pname, GLint *params); -void ( APIENTRY * qglGetMapdv )(GLenum target, GLenum query, GLdouble *v); -void ( APIENTRY * qglGetMapfv )(GLenum target, GLenum query, GLfloat *v); -void ( APIENTRY * qglGetMapiv )(GLenum target, GLenum query, GLint *v); -void ( APIENTRY * qglGetMaterialfv )(GLenum face, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetMaterialiv )(GLenum face, GLenum pname, GLint *params); -void ( APIENTRY * qglGetPixelMapfv )(GLenum gmap, GLfloat *values); -void ( APIENTRY * qglGetPixelMapuiv )(GLenum gmap, GLuint *values); -void ( APIENTRY * qglGetPixelMapusv )(GLenum gmap, GLushort *values); -void ( APIENTRY * qglGetPointerv )(GLenum pname, GLvoid* *params); -void ( APIENTRY * qglGetPolygonStipple )(GLubyte *mask); -const GLubyte * ( APIENTRY * qglGetString )(GLenum name); -void ( APIENTRY * qglGetTexEnvfv )(GLenum target, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetTexEnviv )(GLenum target, GLenum pname, GLint *params); -void ( APIENTRY * qglGetTexGendv )(GLenum coord, GLenum pname, GLdouble *params); -void ( APIENTRY * qglGetTexGenfv )(GLenum coord, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetTexGeniv )(GLenum coord, GLenum pname, GLint *params); -void ( APIENTRY * qglGetTexImage )(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -void ( APIENTRY * qglGetTexLevelParameterfv )(GLenum target, GLint level, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetTexLevelParameteriv )(GLenum target, GLint level, GLenum pname, GLint *params); -void ( APIENTRY * qglGetTexParameterfv )(GLenum target, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetTexParameteriv )(GLenum target, GLenum pname, GLint *params); -void ( APIENTRY * qglHint )(GLenum target, GLenum mode); -void ( APIENTRY * qglIndexMask )(GLuint mask); -void ( APIENTRY * qglIndexPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglIndexd )(GLdouble c); -void ( APIENTRY * qglIndexdv )(const GLdouble *c); -void ( APIENTRY * qglIndexf )(GLfloat c); -void ( APIENTRY * qglIndexfv )(const GLfloat *c); -void ( APIENTRY * qglIndexi )(GLint c); -void ( APIENTRY * qglIndexiv )(const GLint *c); -void ( APIENTRY * qglIndexs )(GLshort c); -void ( APIENTRY * qglIndexsv )(const GLshort *c); -void ( APIENTRY * qglIndexub )(GLubyte c); -void ( APIENTRY * qglIndexubv )(const GLubyte *c); -void ( APIENTRY * qglInitNames )(void); -void ( APIENTRY * qglInterleavedArrays )(GLenum format, GLsizei stride, const GLvoid *pointer); -GLboolean ( APIENTRY * qglIsEnabled )(GLenum cap); -GLboolean ( APIENTRY * qglIsList )(GLuint list); -GLboolean ( APIENTRY * qglIsTexture )(GLuint texture); -void ( APIENTRY * qglLightModelf )(GLenum pname, GLfloat param); -void ( APIENTRY * qglLightModelfv )(GLenum pname, const GLfloat *params); -void ( APIENTRY * qglLightModeli )(GLenum pname, GLint param); -void ( APIENTRY * qglLightModeliv )(GLenum pname, const GLint *params); -void ( APIENTRY * qglLightf )(GLenum light, GLenum pname, GLfloat param); -void ( APIENTRY * qglLightfv )(GLenum light, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglLighti )(GLenum light, GLenum pname, GLint param); -void ( APIENTRY * qglLightiv )(GLenum light, GLenum pname, const GLint *params); -void ( APIENTRY * qglLineStipple )(GLint factor, GLushort pattern); -void ( APIENTRY * qglLineWidth )(GLfloat width); -void ( APIENTRY * qglListBase )(GLuint base); -void ( APIENTRY * qglLoadIdentity )(void); -void ( APIENTRY * qglLoadMatrixd )(const GLdouble *m); -void ( APIENTRY * qglLoadMatrixf )(const GLfloat *m); -void ( APIENTRY * qglLoadName )(GLuint name); -void ( APIENTRY * qglLogicOp )(GLenum opcode); -void ( APIENTRY * qglMap1d )(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -void ( APIENTRY * qglMap1f )(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -void ( APIENTRY * qglMap2d )(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -void ( APIENTRY * qglMap2f )(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -void ( APIENTRY * qglMapGrid1d )(GLint un, GLdouble u1, GLdouble u2); -void ( APIENTRY * qglMapGrid1f )(GLint un, GLfloat u1, GLfloat u2); -void ( APIENTRY * qglMapGrid2d )(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -void ( APIENTRY * qglMapGrid2f )(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -void ( APIENTRY * qglMaterialf )(GLenum face, GLenum pname, GLfloat param); -void ( APIENTRY * qglMaterialfv )(GLenum face, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglMateriali )(GLenum face, GLenum pname, GLint param); -void ( APIENTRY * qglMaterialiv )(GLenum face, GLenum pname, const GLint *params); -void ( APIENTRY * qglMatrixMode )(GLenum mode); -void ( APIENTRY * qglMultMatrixd )(const GLdouble *m); -void ( APIENTRY * qglMultMatrixf )(const GLfloat *m); -void ( APIENTRY * qglNewList )(GLuint list, GLenum mode); -void ( APIENTRY * qglNormal3b )(GLbyte nx, GLbyte ny, GLbyte nz); -void ( APIENTRY * qglNormal3bv )(const GLbyte *v); -void ( APIENTRY * qglNormal3d )(GLdouble nx, GLdouble ny, GLdouble nz); -void ( APIENTRY * qglNormal3dv )(const GLdouble *v); -void ( APIENTRY * qglNormal3f )(GLfloat nx, GLfloat ny, GLfloat nz); -void ( APIENTRY * qglNormal3fv )(const GLfloat *v); -void ( APIENTRY * qglNormal3i )(GLint nx, GLint ny, GLint nz); -void ( APIENTRY * qglNormal3iv )(const GLint *v); -void ( APIENTRY * qglNormal3s )(GLshort nx, GLshort ny, GLshort nz); -void ( APIENTRY * qglNormal3sv )(const GLshort *v); -void ( APIENTRY * qglNormalPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglOrtho )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -void ( APIENTRY * qglPassThrough )(GLfloat token); -void ( APIENTRY * qglPixelMapfv )(GLenum gmap, GLsizei mapsize, const GLfloat *values); -void ( APIENTRY * qglPixelMapuiv )(GLenum gmap, GLsizei mapsize, const GLuint *values); -void ( APIENTRY * qglPixelMapusv )(GLenum gmap, GLsizei mapsize, const GLushort *values); -void ( APIENTRY * qglPixelStoref )(GLenum pname, GLfloat param); -void ( APIENTRY * qglPixelStorei )(GLenum pname, GLint param); -void ( APIENTRY * qglPixelTransferf )(GLenum pname, GLfloat param); -void ( APIENTRY * qglPixelTransferi )(GLenum pname, GLint param); -void ( APIENTRY * qglPixelZoom )(GLfloat xfactor, GLfloat yfactor); -void ( APIENTRY * qglPointSize )(GLfloat size); -void ( APIENTRY * qglPolygonMode )(GLenum face, GLenum mode); -void ( APIENTRY * qglPolygonOffset )(GLfloat factor, GLfloat units); -void ( APIENTRY * qglPolygonStipple )(const GLubyte *mask); -void ( APIENTRY * qglPopAttrib )(void); -void ( APIENTRY * qglPopClientAttrib )(void); -void ( APIENTRY * qglPopMatrix )(void); -void ( APIENTRY * qglPopName )(void); -void ( APIENTRY * qglPrioritizeTextures )(GLsizei n, const GLuint *textures, const GLclampf *priorities); -void ( APIENTRY * qglPushAttrib )(GLbitfield mask); -void ( APIENTRY * qglPushClientAttrib )(GLbitfield mask); -void ( APIENTRY * qglPushMatrix )(void); -void ( APIENTRY * qglPushName )(GLuint name); -void ( APIENTRY * qglRasterPos2d )(GLdouble x, GLdouble y); -void ( APIENTRY * qglRasterPos2dv )(const GLdouble *v); -void ( APIENTRY * qglRasterPos2f )(GLfloat x, GLfloat y); -void ( APIENTRY * qglRasterPos2fv )(const GLfloat *v); -void ( APIENTRY * qglRasterPos2i )(GLint x, GLint y); -void ( APIENTRY * qglRasterPos2iv )(const GLint *v); -void ( APIENTRY * qglRasterPos2s )(GLshort x, GLshort y); -void ( APIENTRY * qglRasterPos2sv )(const GLshort *v); -void ( APIENTRY * qglRasterPos3d )(GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglRasterPos3dv )(const GLdouble *v); -void ( APIENTRY * qglRasterPos3f )(GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglRasterPos3fv )(const GLfloat *v); -void ( APIENTRY * qglRasterPos3i )(GLint x, GLint y, GLint z); -void ( APIENTRY * qglRasterPos3iv )(const GLint *v); -void ( APIENTRY * qglRasterPos3s )(GLshort x, GLshort y, GLshort z); -void ( APIENTRY * qglRasterPos3sv )(const GLshort *v); -void ( APIENTRY * qglRasterPos4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -void ( APIENTRY * qglRasterPos4dv )(const GLdouble *v); -void ( APIENTRY * qglRasterPos4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -void ( APIENTRY * qglRasterPos4fv )(const GLfloat *v); -void ( APIENTRY * qglRasterPos4i )(GLint x, GLint y, GLint z, GLint w); -void ( APIENTRY * qglRasterPos4iv )(const GLint *v); -void ( APIENTRY * qglRasterPos4s )(GLshort x, GLshort y, GLshort z, GLshort w); -void ( APIENTRY * qglRasterPos4sv )(const GLshort *v); -void ( APIENTRY * qglReadBuffer )(GLenum mode); -void ( APIENTRY * qglReadPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); -void ( APIENTRY * qglRectd )(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -void ( APIENTRY * qglRectdv )(const GLdouble *v1, const GLdouble *v2); -void ( APIENTRY * qglRectf )(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -void ( APIENTRY * qglRectfv )(const GLfloat *v1, const GLfloat *v2); -void ( APIENTRY * qglRecti )(GLint x1, GLint y1, GLint x2, GLint y2); -void ( APIENTRY * qglRectiv )(const GLint *v1, const GLint *v2); -void ( APIENTRY * qglRects )(GLshort x1, GLshort y1, GLshort x2, GLshort y2); -void ( APIENTRY * qglRectsv )(const GLshort *v1, const GLshort *v2); -GLint ( APIENTRY * qglRenderMode )(GLenum mode); -void ( APIENTRY * qglRotated )(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglRotatef )(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglScaled )(GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglScalef )(GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglScissor )(GLint x, GLint y, GLsizei width, GLsizei height); -void ( APIENTRY * qglSelectBuffer )(GLsizei size, GLuint *buffer); -void ( APIENTRY * qglShadeModel )(GLenum mode); -void ( APIENTRY * qglStencilFunc )(GLenum func, GLint ref, GLuint mask); -void ( APIENTRY * qglStencilMask )(GLuint mask); -void ( APIENTRY * qglStencilOp )(GLenum fail, GLenum zfail, GLenum zpass); -void ( APIENTRY * qglTexCoord1d )(GLdouble s); -void ( APIENTRY * qglTexCoord1dv )(const GLdouble *v); -void ( APIENTRY * qglTexCoord1f )(GLfloat s); -void ( APIENTRY * qglTexCoord1fv )(const GLfloat *v); -void ( APIENTRY * qglTexCoord1i )(GLint s); -void ( APIENTRY * qglTexCoord1iv )(const GLint *v); -void ( APIENTRY * qglTexCoord1s )(GLshort s); -void ( APIENTRY * qglTexCoord1sv )(const GLshort *v); -void ( APIENTRY * qglTexCoord2d )(GLdouble s, GLdouble t); -void ( APIENTRY * qglTexCoord2dv )(const GLdouble *v); -void ( APIENTRY * qglTexCoord2f )(GLfloat s, GLfloat t); -void ( APIENTRY * qglTexCoord2fv )(const GLfloat *v); -void ( APIENTRY * qglTexCoord2i )(GLint s, GLint t); -void ( APIENTRY * qglTexCoord2iv )(const GLint *v); -void ( APIENTRY * qglTexCoord2s )(GLshort s, GLshort t); -void ( APIENTRY * qglTexCoord2sv )(const GLshort *v); -void ( APIENTRY * qglTexCoord3d )(GLdouble s, GLdouble t, GLdouble r); -void ( APIENTRY * qglTexCoord3dv )(const GLdouble *v); -void ( APIENTRY * qglTexCoord3f )(GLfloat s, GLfloat t, GLfloat r); -void ( APIENTRY * qglTexCoord3fv )(const GLfloat *v); -void ( APIENTRY * qglTexCoord3i )(GLint s, GLint t, GLint r); -void ( APIENTRY * qglTexCoord3iv )(const GLint *v); -void ( APIENTRY * qglTexCoord3s )(GLshort s, GLshort t, GLshort r); -void ( APIENTRY * qglTexCoord3sv )(const GLshort *v); -void ( APIENTRY * qglTexCoord4d )(GLdouble s, GLdouble t, GLdouble r, GLdouble q); -void ( APIENTRY * qglTexCoord4dv )(const GLdouble *v); -void ( APIENTRY * qglTexCoord4f )(GLfloat s, GLfloat t, GLfloat r, GLfloat q); -void ( APIENTRY * qglTexCoord4fv )(const GLfloat *v); -void ( APIENTRY * qglTexCoord4i )(GLint s, GLint t, GLint r, GLint q); -void ( APIENTRY * qglTexCoord4iv )(const GLint *v); -void ( APIENTRY * qglTexCoord4s )(GLshort s, GLshort t, GLshort r, GLshort q); -void ( APIENTRY * qglTexCoord4sv )(const GLshort *v); -void ( APIENTRY * qglTexCoordPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglTexEnvf )(GLenum target, GLenum pname, GLfloat param); -void ( APIENTRY * qglTexEnvfv )(GLenum target, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglTexEnvi )(GLenum target, GLenum pname, GLint param); -void ( APIENTRY * qglTexEnviv )(GLenum target, GLenum pname, const GLint *params); -void ( APIENTRY * qglTexGend )(GLenum coord, GLenum pname, GLdouble param); -void ( APIENTRY * qglTexGendv )(GLenum coord, GLenum pname, const GLdouble *params); -void ( APIENTRY * qglTexGenf )(GLenum coord, GLenum pname, GLfloat param); -void ( APIENTRY * qglTexGenfv )(GLenum coord, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglTexGeni )(GLenum coord, GLenum pname, GLint param); -void ( APIENTRY * qglTexGeniv )(GLenum coord, GLenum pname, const GLint *params); -void ( APIENTRY * qglTexImage1D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglTexImage2D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglTexParameterf )(GLenum target, GLenum pname, GLfloat param); -void ( APIENTRY * qglTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglTexParameteri )(GLenum target, GLenum pname, GLint param); -void ( APIENTRY * qglTexParameteriv )(GLenum target, GLenum pname, const GLint *params); -void ( APIENTRY * qglTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglTranslated )(GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglTranslatef )(GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglVertex2d )(GLdouble x, GLdouble y); -void ( APIENTRY * qglVertex2dv )(const GLdouble *v); -void ( APIENTRY * qglVertex2f )(GLfloat x, GLfloat y); -void ( APIENTRY * qglVertex2fv )(const GLfloat *v); -void ( APIENTRY * qglVertex2i )(GLint x, GLint y); -void ( APIENTRY * qglVertex2iv )(const GLint *v); -void ( APIENTRY * qglVertex2s )(GLshort x, GLshort y); -void ( APIENTRY * qglVertex2sv )(const GLshort *v); -void ( APIENTRY * qglVertex3d )(GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglVertex3dv )(const GLdouble *v); -void ( APIENTRY * qglVertex3f )(GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglVertex3fv )(const GLfloat *v); -void ( APIENTRY * qglVertex3i )(GLint x, GLint y, GLint z); -void ( APIENTRY * qglVertex3iv )(const GLint *v); -void ( APIENTRY * qglVertex3s )(GLshort x, GLshort y, GLshort z); -void ( APIENTRY * qglVertex3sv )(const GLshort *v); -void ( APIENTRY * qglVertex4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -void ( APIENTRY * qglVertex4dv )(const GLdouble *v); -void ( APIENTRY * qglVertex4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -void ( APIENTRY * qglVertex4fv )(const GLfloat *v); -void ( APIENTRY * qglVertex4i )(GLint x, GLint y, GLint z, GLint w); -void ( APIENTRY * qglVertex4iv )(const GLint *v); -void ( APIENTRY * qglVertex4s )(GLshort x, GLshort y, GLshort z, GLshort w); -void ( APIENTRY * qglVertex4sv )(const GLshort *v); -void ( APIENTRY * qglVertexPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglViewport )(GLint x, GLint y, GLsizei width, GLsizei height); - - - -static void ( APIENTRY * dllAccum )(GLenum op, GLfloat value); -static void ( APIENTRY * dllAlphaFunc )(GLenum func, GLclampf ref); -GLboolean ( APIENTRY * dllAreTexturesResident )(GLsizei n, const GLuint *textures, GLboolean *residences); -static void ( APIENTRY * dllArrayElement )(GLint i); -static void ( APIENTRY * dllBegin )(GLenum mode); -static void ( APIENTRY * dllBindTexture )(GLenum target, GLuint texture); -static void ( APIENTRY * dllBitmap )(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); -static void ( APIENTRY * dllBlendFunc )(GLenum sfactor, GLenum dfactor); -static void ( APIENTRY * dllCallList )(GLuint list); -static void ( APIENTRY * dllCallLists )(GLsizei n, GLenum type, const GLvoid *lists); -static void ( APIENTRY * dllClear )(GLbitfield mask); -static void ( APIENTRY * dllClearAccum )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -static void ( APIENTRY * dllClearColor )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -static void ( APIENTRY * dllClearDepth )(GLclampd depth); -static void ( APIENTRY * dllClearIndex )(GLfloat c); -static void ( APIENTRY * dllClearStencil )(GLint s); -static void ( APIENTRY * dllClipPlane )(GLenum plane, const GLdouble *equation); -static void ( APIENTRY * dllColor3b )(GLbyte red, GLbyte green, GLbyte blue); -static void ( APIENTRY * dllColor3bv )(const GLbyte *v); -static void ( APIENTRY * dllColor3d )(GLdouble red, GLdouble green, GLdouble blue); -static void ( APIENTRY * dllColor3dv )(const GLdouble *v); -static void ( APIENTRY * dllColor3f )(GLfloat red, GLfloat green, GLfloat blue); -static void ( APIENTRY * dllColor3fv )(const GLfloat *v); -static void ( APIENTRY * dllColor3i )(GLint red, GLint green, GLint blue); -static void ( APIENTRY * dllColor3iv )(const GLint *v); -static void ( APIENTRY * dllColor3s )(GLshort red, GLshort green, GLshort blue); -static void ( APIENTRY * dllColor3sv )(const GLshort *v); -static void ( APIENTRY * dllColor3ub )(GLubyte red, GLubyte green, GLubyte blue); -static void ( APIENTRY * dllColor3ubv )(const GLubyte *v); -static void ( APIENTRY * dllColor3ui )(GLuint red, GLuint green, GLuint blue); -static void ( APIENTRY * dllColor3uiv )(const GLuint *v); -static void ( APIENTRY * dllColor3us )(GLushort red, GLushort green, GLushort blue); -static void ( APIENTRY * dllColor3usv )(const GLushort *v); -static void ( APIENTRY * dllColor4b )(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -static void ( APIENTRY * dllColor4bv )(const GLbyte *v); -static void ( APIENTRY * dllColor4d )(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -static void ( APIENTRY * dllColor4dv )(const GLdouble *v); -static void ( APIENTRY * dllColor4f )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -static void ( APIENTRY * dllColor4fv )(const GLfloat *v); -static void ( APIENTRY * dllColor4i )(GLint red, GLint green, GLint blue, GLint alpha); -static void ( APIENTRY * dllColor4iv )(const GLint *v); -static void ( APIENTRY * dllColor4s )(GLshort red, GLshort green, GLshort blue, GLshort alpha); -static void ( APIENTRY * dllColor4sv )(const GLshort *v); -static void ( APIENTRY * dllColor4ub )(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -static void ( APIENTRY * dllColor4ubv )(const GLubyte *v); -static void ( APIENTRY * dllColor4ui )(GLuint red, GLuint green, GLuint blue, GLuint alpha); -static void ( APIENTRY * dllColor4uiv )(const GLuint *v); -static void ( APIENTRY * dllColor4us )(GLushort red, GLushort green, GLushort blue, GLushort alpha); -static void ( APIENTRY * dllColor4usv )(const GLushort *v); -static void ( APIENTRY * dllColorMask )(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -static void ( APIENTRY * dllColorMaterial )(GLenum face, GLenum mode); -static void ( APIENTRY * dllColorPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllCopyPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -static void ( APIENTRY * dllCopyTexImage1D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -static void ( APIENTRY * dllCopyTexImage2D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -static void ( APIENTRY * dllCopyTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -static void ( APIENTRY * dllCopyTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -static void ( APIENTRY * dllCullFace )(GLenum mode); -static void ( APIENTRY * dllDeleteLists )(GLuint list, GLsizei range); -static void ( APIENTRY * dllDeleteTextures )(GLsizei n, const GLuint *textures); -static void ( APIENTRY * dllDepthFunc )(GLenum func); -static void ( APIENTRY * dllDepthMask )(GLboolean flag); -static void ( APIENTRY * dllDepthRange )(GLclampd zNear, GLclampd zFar); -static void ( APIENTRY * dllDisable )(GLenum cap); -static void ( APIENTRY * dllDisableClientState )(GLenum array); -static void ( APIENTRY * dllDrawArrays )(GLenum mode, GLint first, GLsizei count); -static void ( APIENTRY * dllDrawBuffer )(GLenum mode); -static void ( APIENTRY * dllDrawElements )(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -static void ( APIENTRY * dllDrawPixels )(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllEdgeFlag )(GLboolean flag); -static void ( APIENTRY * dllEdgeFlagPointer )(GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllEdgeFlagv )(const GLboolean *flag); -static void ( APIENTRY * dllEnable )(GLenum cap); -static void ( APIENTRY * dllEnableClientState )(GLenum array); -static void ( APIENTRY * dllEnd )(void); -static void ( APIENTRY * dllEndList )(void); -static void ( APIENTRY * dllEvalCoord1d )(GLdouble u); -static void ( APIENTRY * dllEvalCoord1dv )(const GLdouble *u); -static void ( APIENTRY * dllEvalCoord1f )(GLfloat u); -static void ( APIENTRY * dllEvalCoord1fv )(const GLfloat *u); -static void ( APIENTRY * dllEvalCoord2d )(GLdouble u, GLdouble v); -static void ( APIENTRY * dllEvalCoord2dv )(const GLdouble *u); -static void ( APIENTRY * dllEvalCoord2f )(GLfloat u, GLfloat v); -static void ( APIENTRY * dllEvalCoord2fv )(const GLfloat *u); -static void ( APIENTRY * dllEvalMesh1 )(GLenum mode, GLint i1, GLint i2); -static void ( APIENTRY * dllEvalMesh2 )(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -static void ( APIENTRY * dllEvalPoint1 )(GLint i); -static void ( APIENTRY * dllEvalPoint2 )(GLint i, GLint j); -static void ( APIENTRY * dllFeedbackBuffer )(GLsizei size, GLenum type, GLfloat *buffer); -static void ( APIENTRY * dllFinish )(void); -static void ( APIENTRY * dllFlush )(void); -static void ( APIENTRY * dllFogf )(GLenum pname, GLfloat param); -static void ( APIENTRY * dllFogfv )(GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllFogi )(GLenum pname, GLint param); -static void ( APIENTRY * dllFogiv )(GLenum pname, const GLint *params); -static void ( APIENTRY * dllFrontFace )(GLenum mode); -static void ( APIENTRY * dllFrustum )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLuint ( APIENTRY * dllGenLists )(GLsizei range); -static void ( APIENTRY * dllGenTextures )(GLsizei n, GLuint *textures); -static void ( APIENTRY * dllGetBooleanv )(GLenum pname, GLboolean *params); -static void ( APIENTRY * dllGetClipPlane )(GLenum plane, GLdouble *equation); -static void ( APIENTRY * dllGetDoublev )(GLenum pname, GLdouble *params); -GLenum ( APIENTRY * dllGetError )(void); -static void ( APIENTRY * dllGetFloatv )(GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetIntegerv )(GLenum pname, GLint *params); -static void ( APIENTRY * dllGetLightfv )(GLenum light, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetLightiv )(GLenum light, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetMapdv )(GLenum target, GLenum query, GLdouble *v); -static void ( APIENTRY * dllGetMapfv )(GLenum target, GLenum query, GLfloat *v); -static void ( APIENTRY * dllGetMapiv )(GLenum target, GLenum query, GLint *v); -static void ( APIENTRY * dllGetMaterialfv )(GLenum face, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetMaterialiv )(GLenum face, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetPixelMapfv )(GLenum map, GLfloat *values); -static void ( APIENTRY * dllGetPixelMapuiv )(GLenum map, GLuint *values); -static void ( APIENTRY * dllGetPixelMapusv )(GLenum map, GLushort *values); -static void ( APIENTRY * dllGetPointerv )(GLenum pname, GLvoid* *params); -static void ( APIENTRY * dllGetPolygonStipple )(GLubyte *mask); -const GLubyte * ( APIENTRY * dllGetString )(GLenum name); -static void ( APIENTRY * dllGetTexEnvfv )(GLenum target, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetTexEnviv )(GLenum target, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetTexGendv )(GLenum coord, GLenum pname, GLdouble *params); -static void ( APIENTRY * dllGetTexGenfv )(GLenum coord, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetTexGeniv )(GLenum coord, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetTexImage )(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -static void ( APIENTRY * dllGetTexLevelParameterfv )(GLenum target, GLint level, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetTexLevelParameteriv )(GLenum target, GLint level, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetTexParameterfv )(GLenum target, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetTexParameteriv )(GLenum target, GLenum pname, GLint *params); -static void ( APIENTRY * dllHint )(GLenum target, GLenum mode); -static void ( APIENTRY * dllIndexMask )(GLuint mask); -static void ( APIENTRY * dllIndexPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllIndexd )(GLdouble c); -static void ( APIENTRY * dllIndexdv )(const GLdouble *c); -static void ( APIENTRY * dllIndexf )(GLfloat c); -static void ( APIENTRY * dllIndexfv )(const GLfloat *c); -static void ( APIENTRY * dllIndexi )(GLint c); -static void ( APIENTRY * dllIndexiv )(const GLint *c); -static void ( APIENTRY * dllIndexs )(GLshort c); -static void ( APIENTRY * dllIndexsv )(const GLshort *c); -static void ( APIENTRY * dllIndexub )(GLubyte c); -static void ( APIENTRY * dllIndexubv )(const GLubyte *c); -static void ( APIENTRY * dllInitNames )(void); -static void ( APIENTRY * dllInterleavedArrays )(GLenum format, GLsizei stride, const GLvoid *pointer); -GLboolean ( APIENTRY * dllIsEnabled )(GLenum cap); -GLboolean ( APIENTRY * dllIsList )(GLuint list); -GLboolean ( APIENTRY * dllIsTexture )(GLuint texture); -static void ( APIENTRY * dllLightModelf )(GLenum pname, GLfloat param); -static void ( APIENTRY * dllLightModelfv )(GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllLightModeli )(GLenum pname, GLint param); -static void ( APIENTRY * dllLightModeliv )(GLenum pname, const GLint *params); -static void ( APIENTRY * dllLightf )(GLenum light, GLenum pname, GLfloat param); -static void ( APIENTRY * dllLightfv )(GLenum light, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllLighti )(GLenum light, GLenum pname, GLint param); -static void ( APIENTRY * dllLightiv )(GLenum light, GLenum pname, const GLint *params); -static void ( APIENTRY * dllLineStipple )(GLint factor, GLushort pattern); -static void ( APIENTRY * dllLineWidth )(GLfloat width); -static void ( APIENTRY * dllListBase )(GLuint base); -static void ( APIENTRY * dllLoadIdentity )(void); -static void ( APIENTRY * dllLoadMatrixd )(const GLdouble *m); -static void ( APIENTRY * dllLoadMatrixf )(const GLfloat *m); -static void ( APIENTRY * dllLoadName )(GLuint name); -static void ( APIENTRY * dllLogicOp )(GLenum opcode); -static void ( APIENTRY * dllMap1d )(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -static void ( APIENTRY * dllMap1f )(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -static void ( APIENTRY * dllMap2d )(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -static void ( APIENTRY * dllMap2f )(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -static void ( APIENTRY * dllMapGrid1d )(GLint un, GLdouble u1, GLdouble u2); -static void ( APIENTRY * dllMapGrid1f )(GLint un, GLfloat u1, GLfloat u2); -static void ( APIENTRY * dllMapGrid2d )(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -static void ( APIENTRY * dllMapGrid2f )(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -static void ( APIENTRY * dllMaterialf )(GLenum face, GLenum pname, GLfloat param); -static void ( APIENTRY * dllMaterialfv )(GLenum face, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllMateriali )(GLenum face, GLenum pname, GLint param); -static void ( APIENTRY * dllMaterialiv )(GLenum face, GLenum pname, const GLint *params); -static void ( APIENTRY * dllMatrixMode )(GLenum mode); -static void ( APIENTRY * dllMultMatrixd )(const GLdouble *m); -static void ( APIENTRY * dllMultMatrixf )(const GLfloat *m); -static void ( APIENTRY * dllNewList )(GLuint list, GLenum mode); -static void ( APIENTRY * dllNormal3b )(GLbyte nx, GLbyte ny, GLbyte nz); -static void ( APIENTRY * dllNormal3bv )(const GLbyte *v); -static void ( APIENTRY * dllNormal3d )(GLdouble nx, GLdouble ny, GLdouble nz); -static void ( APIENTRY * dllNormal3dv )(const GLdouble *v); -static void ( APIENTRY * dllNormal3f )(GLfloat nx, GLfloat ny, GLfloat nz); -static void ( APIENTRY * dllNormal3fv )(const GLfloat *v); -static void ( APIENTRY * dllNormal3i )(GLint nx, GLint ny, GLint nz); -static void ( APIENTRY * dllNormal3iv )(const GLint *v); -static void ( APIENTRY * dllNormal3s )(GLshort nx, GLshort ny, GLshort nz); -static void ( APIENTRY * dllNormal3sv )(const GLshort *v); -static void ( APIENTRY * dllNormalPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllOrtho )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -static void ( APIENTRY * dllPassThrough )(GLfloat token); -static void ( APIENTRY * dllPixelMapfv )(GLenum map, GLsizei mapsize, const GLfloat *values); -static void ( APIENTRY * dllPixelMapuiv )(GLenum map, GLsizei mapsize, const GLuint *values); -static void ( APIENTRY * dllPixelMapusv )(GLenum map, GLsizei mapsize, const GLushort *values); -static void ( APIENTRY * dllPixelStoref )(GLenum pname, GLfloat param); -static void ( APIENTRY * dllPixelStorei )(GLenum pname, GLint param); -static void ( APIENTRY * dllPixelTransferf )(GLenum pname, GLfloat param); -static void ( APIENTRY * dllPixelTransferi )(GLenum pname, GLint param); -static void ( APIENTRY * dllPixelZoom )(GLfloat xfactor, GLfloat yfactor); -static void ( APIENTRY * dllPointSize )(GLfloat size); -static void ( APIENTRY * dllPolygonMode )(GLenum face, GLenum mode); -static void ( APIENTRY * dllPolygonOffset )(GLfloat factor, GLfloat units); -static void ( APIENTRY * dllPolygonStipple )(const GLubyte *mask); -static void ( APIENTRY * dllPopAttrib )(void); -static void ( APIENTRY * dllPopClientAttrib )(void); -static void ( APIENTRY * dllPopMatrix )(void); -static void ( APIENTRY * dllPopName )(void); -static void ( APIENTRY * dllPrioritizeTextures )(GLsizei n, const GLuint *textures, const GLclampf *priorities); -static void ( APIENTRY * dllPushAttrib )(GLbitfield mask); -static void ( APIENTRY * dllPushClientAttrib )(GLbitfield mask); -static void ( APIENTRY * dllPushMatrix )(void); -static void ( APIENTRY * dllPushName )(GLuint name); -static void ( APIENTRY * dllRasterPos2d )(GLdouble x, GLdouble y); -static void ( APIENTRY * dllRasterPos2dv )(const GLdouble *v); -static void ( APIENTRY * dllRasterPos2f )(GLfloat x, GLfloat y); -static void ( APIENTRY * dllRasterPos2fv )(const GLfloat *v); -static void ( APIENTRY * dllRasterPos2i )(GLint x, GLint y); -static void ( APIENTRY * dllRasterPos2iv )(const GLint *v); -static void ( APIENTRY * dllRasterPos2s )(GLshort x, GLshort y); -static void ( APIENTRY * dllRasterPos2sv )(const GLshort *v); -static void ( APIENTRY * dllRasterPos3d )(GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllRasterPos3dv )(const GLdouble *v); -static void ( APIENTRY * dllRasterPos3f )(GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllRasterPos3fv )(const GLfloat *v); -static void ( APIENTRY * dllRasterPos3i )(GLint x, GLint y, GLint z); -static void ( APIENTRY * dllRasterPos3iv )(const GLint *v); -static void ( APIENTRY * dllRasterPos3s )(GLshort x, GLshort y, GLshort z); -static void ( APIENTRY * dllRasterPos3sv )(const GLshort *v); -static void ( APIENTRY * dllRasterPos4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -static void ( APIENTRY * dllRasterPos4dv )(const GLdouble *v); -static void ( APIENTRY * dllRasterPos4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -static void ( APIENTRY * dllRasterPos4fv )(const GLfloat *v); -static void ( APIENTRY * dllRasterPos4i )(GLint x, GLint y, GLint z, GLint w); -static void ( APIENTRY * dllRasterPos4iv )(const GLint *v); -static void ( APIENTRY * dllRasterPos4s )(GLshort x, GLshort y, GLshort z, GLshort w); -static void ( APIENTRY * dllRasterPos4sv )(const GLshort *v); -static void ( APIENTRY * dllReadBuffer )(GLenum mode); -static void ( APIENTRY * dllReadPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); -static void ( APIENTRY * dllRectd )(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -static void ( APIENTRY * dllRectdv )(const GLdouble *v1, const GLdouble *v2); -static void ( APIENTRY * dllRectf )(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -static void ( APIENTRY * dllRectfv )(const GLfloat *v1, const GLfloat *v2); -static void ( APIENTRY * dllRecti )(GLint x1, GLint y1, GLint x2, GLint y2); -static void ( APIENTRY * dllRectiv )(const GLint *v1, const GLint *v2); -static void ( APIENTRY * dllRects )(GLshort x1, GLshort y1, GLshort x2, GLshort y2); -static void ( APIENTRY * dllRectsv )(const GLshort *v1, const GLshort *v2); -GLint ( APIENTRY * dllRenderMode )(GLenum mode); -static void ( APIENTRY * dllRotated )(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllRotatef )(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllScaled )(GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllScalef )(GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllScissor )(GLint x, GLint y, GLsizei width, GLsizei height); -static void ( APIENTRY * dllSelectBuffer )(GLsizei size, GLuint *buffer); -static void ( APIENTRY * dllShadeModel )(GLenum mode); -static void ( APIENTRY * dllStencilFunc )(GLenum func, GLint ref, GLuint mask); -static void ( APIENTRY * dllStencilMask )(GLuint mask); -static void ( APIENTRY * dllStencilOp )(GLenum fail, GLenum zfail, GLenum zpass); -static void ( APIENTRY * dllTexCoord1d )(GLdouble s); -static void ( APIENTRY * dllTexCoord1dv )(const GLdouble *v); -static void ( APIENTRY * dllTexCoord1f )(GLfloat s); -static void ( APIENTRY * dllTexCoord1fv )(const GLfloat *v); -static void ( APIENTRY * dllTexCoord1i )(GLint s); -static void ( APIENTRY * dllTexCoord1iv )(const GLint *v); -static void ( APIENTRY * dllTexCoord1s )(GLshort s); -static void ( APIENTRY * dllTexCoord1sv )(const GLshort *v); -static void ( APIENTRY * dllTexCoord2d )(GLdouble s, GLdouble t); -static void ( APIENTRY * dllTexCoord2dv )(const GLdouble *v); -static void ( APIENTRY * dllTexCoord2f )(GLfloat s, GLfloat t); -static void ( APIENTRY * dllTexCoord2fv )(const GLfloat *v); -static void ( APIENTRY * dllTexCoord2i )(GLint s, GLint t); -static void ( APIENTRY * dllTexCoord2iv )(const GLint *v); -static void ( APIENTRY * dllTexCoord2s )(GLshort s, GLshort t); -static void ( APIENTRY * dllTexCoord2sv )(const GLshort *v); -static void ( APIENTRY * dllTexCoord3d )(GLdouble s, GLdouble t, GLdouble r); -static void ( APIENTRY * dllTexCoord3dv )(const GLdouble *v); -static void ( APIENTRY * dllTexCoord3f )(GLfloat s, GLfloat t, GLfloat r); -static void ( APIENTRY * dllTexCoord3fv )(const GLfloat *v); -static void ( APIENTRY * dllTexCoord3i )(GLint s, GLint t, GLint r); -static void ( APIENTRY * dllTexCoord3iv )(const GLint *v); -static void ( APIENTRY * dllTexCoord3s )(GLshort s, GLshort t, GLshort r); -static void ( APIENTRY * dllTexCoord3sv )(const GLshort *v); -static void ( APIENTRY * dllTexCoord4d )(GLdouble s, GLdouble t, GLdouble r, GLdouble q); -static void ( APIENTRY * dllTexCoord4dv )(const GLdouble *v); -static void ( APIENTRY * dllTexCoord4f )(GLfloat s, GLfloat t, GLfloat r, GLfloat q); -static void ( APIENTRY * dllTexCoord4fv )(const GLfloat *v); -static void ( APIENTRY * dllTexCoord4i )(GLint s, GLint t, GLint r, GLint q); -static void ( APIENTRY * dllTexCoord4iv )(const GLint *v); -static void ( APIENTRY * dllTexCoord4s )(GLshort s, GLshort t, GLshort r, GLshort q); -static void ( APIENTRY * dllTexCoord4sv )(const GLshort *v); -static void ( APIENTRY * dllTexCoordPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllTexEnvf )(GLenum target, GLenum pname, GLfloat param); -static void ( APIENTRY * dllTexEnvfv )(GLenum target, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllTexEnvi )(GLenum target, GLenum pname, GLint param); -static void ( APIENTRY * dllTexEnviv )(GLenum target, GLenum pname, const GLint *params); -static void ( APIENTRY * dllTexGend )(GLenum coord, GLenum pname, GLdouble param); -static void ( APIENTRY * dllTexGendv )(GLenum coord, GLenum pname, const GLdouble *params); -static void ( APIENTRY * dllTexGenf )(GLenum coord, GLenum pname, GLfloat param); -static void ( APIENTRY * dllTexGenfv )(GLenum coord, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllTexGeni )(GLenum coord, GLenum pname, GLint param); -static void ( APIENTRY * dllTexGeniv )(GLenum coord, GLenum pname, const GLint *params); -static void ( APIENTRY * dllTexImage1D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllTexImage2D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllTexParameterf )(GLenum target, GLenum pname, GLfloat param); -static void ( APIENTRY * dllTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllTexParameteri )(GLenum target, GLenum pname, GLint param); -static void ( APIENTRY * dllTexParameteriv )(GLenum target, GLenum pname, const GLint *params); -static void ( APIENTRY * dllTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllTranslated )(GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllTranslatef )(GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllVertex2d )(GLdouble x, GLdouble y); -static void ( APIENTRY * dllVertex2dv )(const GLdouble *v); -static void ( APIENTRY * dllVertex2f )(GLfloat x, GLfloat y); -static void ( APIENTRY * dllVertex2fv )(const GLfloat *v); -static void ( APIENTRY * dllVertex2i )(GLint x, GLint y); -static void ( APIENTRY * dllVertex2iv )(const GLint *v); -static void ( APIENTRY * dllVertex2s )(GLshort x, GLshort y); -static void ( APIENTRY * dllVertex2sv )(const GLshort *v); -static void ( APIENTRY * dllVertex3d )(GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllVertex3dv )(const GLdouble *v); -static void ( APIENTRY * dllVertex3f )(GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllVertex3fv )(const GLfloat *v); -static void ( APIENTRY * dllVertex3i )(GLint x, GLint y, GLint z); -static void ( APIENTRY * dllVertex3iv )(const GLint *v); -static void ( APIENTRY * dllVertex3s )(GLshort x, GLshort y, GLshort z); -static void ( APIENTRY * dllVertex3sv )(const GLshort *v); -static void ( APIENTRY * dllVertex4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -static void ( APIENTRY * dllVertex4dv )(const GLdouble *v); -static void ( APIENTRY * dllVertex4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -static void ( APIENTRY * dllVertex4fv )(const GLfloat *v); -static void ( APIENTRY * dllVertex4i )(GLint x, GLint y, GLint z, GLint w); -static void ( APIENTRY * dllVertex4iv )(const GLint *v); -static void ( APIENTRY * dllVertex4s )(GLshort x, GLshort y, GLshort z, GLshort w); -static void ( APIENTRY * dllVertex4sv )(const GLshort *v); -static void ( APIENTRY * dllVertexPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllViewport )(GLint x, GLint y, GLsizei width, GLsizei height); - -static const char * BooleanToString( GLboolean b ) -{ - if ( b == GL_FALSE ) - return "GL_FALSE"; - else if ( b == GL_TRUE ) - return "GL_TRUE"; - else - return "OUT OF RANGE FOR BOOLEAN"; -} - -static const char * FuncToString( GLenum f ) -{ - switch ( f ) - { - case GL_ALWAYS: - return "GL_ALWAYS"; - case GL_NEVER: - return "GL_NEVER"; - case GL_LEQUAL: - return "GL_LEQUAL"; - case GL_LESS: - return "GL_LESS"; - case GL_EQUAL: - return "GL_EQUAL"; - case GL_GREATER: - return "GL_GREATER"; - case GL_GEQUAL: - return "GL_GEQUAL"; - case GL_NOTEQUAL: - return "GL_NOTEQUAL"; - default: - return "!!! UNKNOWN !!!"; - } -} - -static const char * PrimToString( GLenum mode ) -{ - static char prim[1024]; - - if ( mode == GL_TRIANGLES ) - strcpy( prim, "GL_TRIANGLES" ); - else if ( mode == GL_TRIANGLE_STRIP ) - strcpy( prim, "GL_TRIANGLE_STRIP" ); - else if ( mode == GL_TRIANGLE_FAN ) - strcpy( prim, "GL_TRIANGLE_FAN" ); - else if ( mode == GL_QUADS ) - strcpy( prim, "GL_QUADS" ); - else if ( mode == GL_QUAD_STRIP ) - strcpy( prim, "GL_QUAD_STRIP" ); - else if ( mode == GL_POLYGON ) - strcpy( prim, "GL_POLYGON" ); - else if ( mode == GL_POINTS ) - strcpy( prim, "GL_POINTS" ); - else if ( mode == GL_LINES ) - strcpy( prim, "GL_LINES" ); - else if ( mode == GL_LINE_STRIP ) - strcpy( prim, "GL_LINE_STRIP" ); - else if ( mode == GL_LINE_LOOP ) - strcpy( prim, "GL_LINE_LOOP" ); - else - sprintf( prim, "0x%x", mode ); - - return prim; -} - -static const char * CapToString( GLenum cap ) -{ - static char buffer[1024]; - - switch ( cap ) - { - case GL_TEXTURE_2D: - return "GL_TEXTURE_2D"; - case GL_BLEND: - return "GL_BLEND"; - case GL_DEPTH_TEST: - return "GL_DEPTH_TEST"; - case GL_CULL_FACE: - return "GL_CULL_FACE"; - case GL_CLIP_PLANE0: - return "GL_CLIP_PLANE0"; - case GL_COLOR_ARRAY: - return "GL_COLOR_ARRAY"; - case GL_TEXTURE_COORD_ARRAY: - return "GL_TEXTURE_COORD_ARRAY"; - case GL_VERTEX_ARRAY: - return "GL_VERTEX_ARRAY"; - case GL_ALPHA_TEST: - return "GL_ALPHA_TEST"; - case GL_STENCIL_TEST: - return "GL_STENCIL_TEST"; - default: - sprintf( buffer, "0x%x", cap ); - } - - return buffer; -} - -static const char * TypeToString( GLenum t ) -{ - switch ( t ) - { - case GL_BYTE: - return "GL_BYTE"; - case GL_UNSIGNED_BYTE: - return "GL_UNSIGNED_BYTE"; - case GL_SHORT: - return "GL_SHORT"; - case GL_UNSIGNED_SHORT: - return "GL_UNSIGNED_SHORT"; - case GL_INT: - return "GL_INT"; - case GL_UNSIGNED_INT: - return "GL_UNSIGNED_INT"; - case GL_FLOAT: - return "GL_FLOAT"; - case GL_DOUBLE: - return "GL_DOUBLE"; - default: - return "!!! UNKNOWN !!!"; - } -} - -static void APIENTRY logAccum(GLenum op, GLfloat value) -{ - fprintf( glw_state.log_fp, "glAccum\n" ); - dllAccum( op, value ); -} - -static void APIENTRY logAlphaFunc(GLenum func, GLclampf ref) -{ - fprintf( glw_state.log_fp, "glAlphaFunc( 0x%x, %f )\n", func, ref ); - dllAlphaFunc( func, ref ); -} - -static GLboolean APIENTRY logAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences) -{ - fprintf( glw_state.log_fp, "glAreTexturesResident\n" ); - return dllAreTexturesResident( n, textures, residences ); -} - -static void APIENTRY logArrayElement(GLint i) -{ - fprintf( glw_state.log_fp, "glArrayElement\n" ); - dllArrayElement( i ); -} - -static void APIENTRY logBegin(GLenum mode) -{ - fprintf( glw_state.log_fp, "glBegin( %s )\n", PrimToString( mode )); - dllBegin( mode ); -} - -static void APIENTRY logBindTexture(GLenum target, GLuint texture) -{ - fprintf( glw_state.log_fp, "glBindTexture( 0x%x, %u )\n", target, texture ); - dllBindTexture( target, texture ); -} - -static void APIENTRY logBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap) -{ - fprintf( glw_state.log_fp, "glBitmap\n" ); - dllBitmap( width, height, xorig, yorig, xmove, ymove, bitmap ); -} - -static void BlendToName( char *n, GLenum f ) -{ - switch ( f ) - { - case GL_ONE: - strcpy( n, "GL_ONE" ); - break; - case GL_ZERO: - strcpy( n, "GL_ZERO" ); - break; - case GL_SRC_ALPHA: - strcpy( n, "GL_SRC_ALPHA" ); - break; - case GL_ONE_MINUS_SRC_ALPHA: - strcpy( n, "GL_ONE_MINUS_SRC_ALPHA" ); - break; - case GL_DST_COLOR: - strcpy( n, "GL_DST_COLOR" ); - break; - case GL_ONE_MINUS_DST_COLOR: - strcpy( n, "GL_ONE_MINUS_DST_COLOR" ); - break; - case GL_DST_ALPHA: - strcpy( n, "GL_DST_ALPHA" ); - break; - default: - sprintf( n, "0x%x", f ); - } -} -static void APIENTRY logBlendFunc(GLenum sfactor, GLenum dfactor) -{ - char sf[128], df[128]; - - BlendToName( sf, sfactor ); - BlendToName( df, dfactor ); - - fprintf( glw_state.log_fp, "glBlendFunc( %s, %s )\n", sf, df ); - dllBlendFunc( sfactor, dfactor ); -} - -static void APIENTRY logCallList(GLuint list) -{ - fprintf( glw_state.log_fp, "glCallList( %u )\n", list ); - dllCallList( list ); -} - -static void APIENTRY logCallLists(GLsizei n, GLenum type, const void *lists) -{ - fprintf( glw_state.log_fp, "glCallLists\n" ); - dllCallLists( n, type, lists ); -} - -static void APIENTRY logClear(GLbitfield mask) -{ - fprintf( glw_state.log_fp, "glClear( 0x%x = ", mask ); - - if ( mask & GL_COLOR_BUFFER_BIT ) - fprintf( glw_state.log_fp, "GL_COLOR_BUFFER_BIT " ); - if ( mask & GL_DEPTH_BUFFER_BIT ) - fprintf( glw_state.log_fp, "GL_DEPTH_BUFFER_BIT " ); - if ( mask & GL_STENCIL_BUFFER_BIT ) - fprintf( glw_state.log_fp, "GL_STENCIL_BUFFER_BIT " ); - if ( mask & GL_ACCUM_BUFFER_BIT ) - fprintf( glw_state.log_fp, "GL_ACCUM_BUFFER_BIT " ); - - fprintf( glw_state.log_fp, ")\n" ); - dllClear( mask ); -} - -static void APIENTRY logClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) -{ - fprintf( glw_state.log_fp, "glClearAccum\n" ); - dllClearAccum( red, green, blue, alpha ); -} - -static void APIENTRY logClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) -{ - fprintf( glw_state.log_fp, "glClearColor\n" ); - dllClearColor( red, green, blue, alpha ); -} - -static void APIENTRY logClearDepth(GLclampd depth) -{ - fprintf( glw_state.log_fp, "glClearDepth( %f )\n", ( float ) depth ); - dllClearDepth( depth ); -} - -static void APIENTRY logClearIndex(GLfloat c) -{ - fprintf( glw_state.log_fp, "glClearIndex\n" ); - dllClearIndex( c ); -} - -static void APIENTRY logClearStencil(GLint s) -{ - fprintf( glw_state.log_fp, "glClearStencil( %d )\n", s ); - dllClearStencil( s ); -} - -static void APIENTRY logClipPlane(GLenum plane, const GLdouble *equation) -{ - fprintf( glw_state.log_fp, "glClipPlane\n" ); - dllClipPlane( plane, equation ); -} - -static void APIENTRY logColor3b(GLbyte red, GLbyte green, GLbyte blue) -{ - fprintf( glw_state.log_fp, "glColor3b\n" ); - dllColor3b( red, green, blue ); -} - -static void APIENTRY logColor3bv(const GLbyte *v) -{ - fprintf( glw_state.log_fp, "glColor3bv\n" ); - dllColor3bv( v ); -} - -static void APIENTRY logColor3d(GLdouble red, GLdouble green, GLdouble blue) -{ - fprintf( glw_state.log_fp, "glColor3d\n" ); - dllColor3d( red, green, blue ); -} - -static void APIENTRY logColor3dv(const GLdouble *v) -{ - fprintf( glw_state.log_fp, "glColor3dv\n" ); - dllColor3dv( v ); -} - -static void APIENTRY logColor3f(GLfloat red, GLfloat green, GLfloat blue) -{ - fprintf( glw_state.log_fp, "glColor3f\n" ); - dllColor3f( red, green, blue ); -} - -static void APIENTRY logColor3fv(const GLfloat *v) -{ - fprintf( glw_state.log_fp, "glColor3fv\n" ); - dllColor3fv( v ); -} - -static void APIENTRY logColor3i(GLint red, GLint green, GLint blue) -{ - fprintf( glw_state.log_fp, "glColor3i\n" ); - dllColor3i( red, green, blue ); -} - -static void APIENTRY logColor3iv(const GLint *v) -{ - fprintf( glw_state.log_fp, "glColor3iv\n" ); - dllColor3iv( v ); -} - -static void APIENTRY logColor3s(GLshort red, GLshort green, GLshort blue) -{ - fprintf( glw_state.log_fp, "glColor3s\n" ); - dllColor3s( red, green, blue ); -} - -static void APIENTRY logColor3sv(const GLshort *v) -{ - fprintf( glw_state.log_fp, "glColor3sv\n" ); - dllColor3sv( v ); -} - -static void APIENTRY logColor3ub(GLubyte red, GLubyte green, GLubyte blue) -{ - fprintf( glw_state.log_fp, "glColor3ub\n" ); - dllColor3ub( red, green, blue ); -} - -static void APIENTRY logColor3ubv(const GLubyte *v) -{ - fprintf( glw_state.log_fp, "glColor3ubv\n" ); - dllColor3ubv( v ); -} - -#define SIG( x ) fprintf( glw_state.log_fp, x "\n" ) - -static void APIENTRY logColor3ui(GLuint red, GLuint green, GLuint blue) -{ - SIG( "glColor3ui" ); - dllColor3ui( red, green, blue ); -} - -static void APIENTRY logColor3uiv(const GLuint *v) -{ - SIG( "glColor3uiv" ); - dllColor3uiv( v ); -} - -static void APIENTRY logColor3us(GLushort red, GLushort green, GLushort blue) -{ - SIG( "glColor3us" ); - dllColor3us( red, green, blue ); -} - -static void APIENTRY logColor3usv(const GLushort *v) -{ - SIG( "glColor3usv" ); - dllColor3usv( v ); -} - -static void APIENTRY logColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha) -{ - SIG( "glColor4b" ); - dllColor4b( red, green, blue, alpha ); -} - -static void APIENTRY logColor4bv(const GLbyte *v) -{ - SIG( "glColor4bv" ); - dllColor4bv( v ); -} - -static void APIENTRY logColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha) -{ - SIG( "glColor4d" ); - dllColor4d( red, green, blue, alpha ); -} -static void APIENTRY logColor4dv(const GLdouble *v) -{ - SIG( "glColor4dv" ); - dllColor4dv( v ); -} -static void APIENTRY logColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) -{ - fprintf( glw_state.log_fp, "glColor4f( %f,%f,%f,%f )\n", red, green, blue, alpha ); - dllColor4f( red, green, blue, alpha ); -} -static void APIENTRY logColor4fv(const GLfloat *v) -{ - fprintf( glw_state.log_fp, "glColor4fv( %f,%f,%f,%f )\n", v[0], v[1], v[2], v[3] ); - dllColor4fv( v ); -} -static void APIENTRY logColor4i(GLint red, GLint green, GLint blue, GLint alpha) -{ - SIG( "glColor4i" ); - dllColor4i( red, green, blue, alpha ); -} -static void APIENTRY logColor4iv(const GLint *v) -{ - SIG( "glColor4iv" ); - dllColor4iv( v ); -} -static void APIENTRY logColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha) -{ - SIG( "glColor4s" ); - dllColor4s( red, green, blue, alpha ); -} -static void APIENTRY logColor4sv(const GLshort *v) -{ - SIG( "glColor4sv" ); - dllColor4sv( v ); -} -static void APIENTRY logColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) -{ - SIG( "glColor4b" ); - dllColor4b( red, green, blue, alpha ); -} -static void APIENTRY logColor4ubv(const GLubyte *v) -{ - SIG( "glColor4ubv" ); - dllColor4ubv( v ); -} -static void APIENTRY logColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha) -{ - SIG( "glColor4ui" ); - dllColor4ui( red, green, blue, alpha ); -} -static void APIENTRY logColor4uiv(const GLuint *v) -{ - SIG( "glColor4uiv" ); - dllColor4uiv( v ); -} -static void APIENTRY logColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha) -{ - SIG( "glColor4us" ); - dllColor4us( red, green, blue, alpha ); -} -static void APIENTRY logColor4usv(const GLushort *v) -{ - SIG( "glColor4usv" ); - dllColor4usv( v ); -} -static void APIENTRY logColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) -{ - SIG( "glColorMask" ); - dllColorMask( red, green, blue, alpha ); -} -static void APIENTRY logColorMaterial(GLenum face, GLenum mode) -{ - SIG( "glColorMaterial" ); - dllColorMaterial( face, mode ); -} - -static void APIENTRY logColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer) -{ - fprintf( glw_state.log_fp, "glColorPointer( %d, %s, %d, MEM )\n", size, TypeToString( type ), stride ); - dllColorPointer( size, type, stride, pointer ); -} - -static void APIENTRY logCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type) -{ - SIG( "glCopyPixels" ); - dllCopyPixels( x, y, width, height, type ); -} - -static void APIENTRY logCopyTexImage1D(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border) -{ - SIG( "glCopyTexImage1D" ); - dllCopyTexImage1D( target, level, internalFormat, x, y, width, border ); -} - -static void APIENTRY logCopyTexImage2D(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) -{ - SIG( "glCopyTexImage2D" ); - dllCopyTexImage2D( target, level, internalFormat, x, y, width, height, border ); -} - -static void APIENTRY logCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) -{ - SIG( "glCopyTexSubImage1D" ); - dllCopyTexSubImage1D( target, level, xoffset, x, y, width ); -} - -static void APIENTRY logCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) -{ - SIG( "glCopyTexSubImage2D" ); - dllCopyTexSubImage2D( target, level, xoffset, yoffset, x, y, width, height ); -} - -static void APIENTRY logCullFace(GLenum mode) -{ - fprintf( glw_state.log_fp, "glCullFace( %s )\n", ( mode == GL_FRONT ) ? "GL_FRONT" : "GL_BACK" ); - dllCullFace( mode ); -} - -static void APIENTRY logDeleteLists(GLuint list, GLsizei range) -{ - SIG( "glDeleteLists" ); - dllDeleteLists( list, range ); -} - -static void APIENTRY logDeleteTextures(GLsizei n, const GLuint *textures) -{ - SIG( "glDeleteTextures" ); - dllDeleteTextures( n, textures ); -} - -static void APIENTRY logDepthFunc(GLenum func) -{ - fprintf( glw_state.log_fp, "glDepthFunc( %s )\n", FuncToString( func ) ); - dllDepthFunc( func ); -} - -static void APIENTRY logDepthMask(GLboolean flag) -{ - fprintf( glw_state.log_fp, "glDepthMask( %s )\n", BooleanToString( flag ) ); - dllDepthMask( flag ); -} - -static void APIENTRY logDepthRange(GLclampd zNear, GLclampd zFar) -{ - fprintf( glw_state.log_fp, "glDepthRange( %f, %f )\n", ( float ) zNear, ( float ) zFar ); - dllDepthRange( zNear, zFar ); -} - -static void APIENTRY logDisable(GLenum cap) -{ - fprintf( glw_state.log_fp, "glDisable( %s )\n", CapToString( cap ) ); - dllDisable( cap ); -} - -static void APIENTRY logDisableClientState(GLenum array) -{ - fprintf( glw_state.log_fp, "glDisableClientState( %s )\n", CapToString( array ) ); - dllDisableClientState( array ); -} - -static void APIENTRY logDrawArrays(GLenum mode, GLint first, GLsizei count) -{ - SIG( "glDrawArrays" ); - dllDrawArrays( mode, first, count ); -} - -static void APIENTRY logDrawBuffer(GLenum mode) -{ - SIG( "glDrawBuffer" ); - dllDrawBuffer( mode ); -} - -static void APIENTRY logDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices) -{ - fprintf( glw_state.log_fp, "glDrawElements( %s, %d, %s, MEM )\n", PrimToString( mode ), count, TypeToString( type ) ); - dllDrawElements( mode, count, type, indices ); -} - -static void APIENTRY logDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) -{ - SIG( "glDrawPixels" ); - dllDrawPixels( width, height, format, type, pixels ); -} - -static void APIENTRY logEdgeFlag(GLboolean flag) -{ - SIG( "glEdgeFlag" ); - dllEdgeFlag( flag ); -} - -static void APIENTRY logEdgeFlagPointer(GLsizei stride, const void *pointer) -{ - SIG( "glEdgeFlagPointer" ); - dllEdgeFlagPointer( stride, pointer ); -} - -static void APIENTRY logEdgeFlagv(const GLboolean *flag) -{ - SIG( "glEdgeFlagv" ); - dllEdgeFlagv( flag ); -} - -static void APIENTRY logEnable(GLenum cap) -{ - fprintf( glw_state.log_fp, "glEnable( %s )\n", CapToString( cap ) ); - dllEnable( cap ); -} - -static void APIENTRY logEnableClientState(GLenum array) -{ - fprintf( glw_state.log_fp, "glEnableClientState( %s )\n", CapToString( array ) ); - dllEnableClientState( array ); -} - -static void APIENTRY logEnd(void) -{ - SIG( "glEnd" ); - dllEnd(); -} - -static void APIENTRY logEndList(void) -{ - SIG( "glEndList" ); - dllEndList(); -} - -static void APIENTRY logEvalCoord1d(GLdouble u) -{ - SIG( "glEvalCoord1d" ); - dllEvalCoord1d( u ); -} - -static void APIENTRY logEvalCoord1dv(const GLdouble *u) -{ - SIG( "glEvalCoord1dv" ); - dllEvalCoord1dv( u ); -} - -static void APIENTRY logEvalCoord1f(GLfloat u) -{ - SIG( "glEvalCoord1f" ); - dllEvalCoord1f( u ); -} - -static void APIENTRY logEvalCoord1fv(const GLfloat *u) -{ - SIG( "glEvalCoord1fv" ); - dllEvalCoord1fv( u ); -} -static void APIENTRY logEvalCoord2d(GLdouble u, GLdouble v) -{ - SIG( "glEvalCoord2d" ); - dllEvalCoord2d( u, v ); -} -static void APIENTRY logEvalCoord2dv(const GLdouble *u) -{ - SIG( "glEvalCoord2dv" ); - dllEvalCoord2dv( u ); -} -static void APIENTRY logEvalCoord2f(GLfloat u, GLfloat v) -{ - SIG( "glEvalCoord2f" ); - dllEvalCoord2f( u, v ); -} -static void APIENTRY logEvalCoord2fv(const GLfloat *u) -{ - SIG( "glEvalCoord2fv" ); - dllEvalCoord2fv( u ); -} - -static void APIENTRY logEvalMesh1(GLenum mode, GLint i1, GLint i2) -{ - SIG( "glEvalMesh1" ); - dllEvalMesh1( mode, i1, i2 ); -} -static void APIENTRY logEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2) -{ - SIG( "glEvalMesh2" ); - dllEvalMesh2( mode, i1, i2, j1, j2 ); -} -static void APIENTRY logEvalPoint1(GLint i) -{ - SIG( "glEvalPoint1" ); - dllEvalPoint1( i ); -} -static void APIENTRY logEvalPoint2(GLint i, GLint j) -{ - SIG( "glEvalPoint2" ); - dllEvalPoint2( i, j ); -} - -static void APIENTRY logFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer) -{ - SIG( "glFeedbackBuffer" ); - dllFeedbackBuffer( size, type, buffer ); -} - -static void APIENTRY logFinish(void) -{ - SIG( "glFinish" ); - dllFinish(); -} - -static void APIENTRY logFlush(void) -{ - SIG( "glFlush" ); - dllFlush(); -} - -static void APIENTRY logFogf(GLenum pname, GLfloat param) -{ - SIG( "glFogf" ); - dllFogf( pname, param ); -} - -static void APIENTRY logFogfv(GLenum pname, const GLfloat *params) -{ - SIG( "glFogfv" ); - dllFogfv( pname, params ); -} - -static void APIENTRY logFogi(GLenum pname, GLint param) -{ - SIG( "glFogi" ); - dllFogi( pname, param ); -} - -static void APIENTRY logFogiv(GLenum pname, const GLint *params) -{ - SIG( "glFogiv" ); - dllFogiv( pname, params ); -} - -static void APIENTRY logFrontFace(GLenum mode) -{ - SIG( "glFrontFace" ); - dllFrontFace( mode ); -} - -static void APIENTRY logFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) -{ - SIG( "glFrustum" ); - dllFrustum( left, right, bottom, top, zNear, zFar ); -} - -static GLuint APIENTRY logGenLists(GLsizei range) -{ - SIG( "glGenLists" ); - return dllGenLists( range ); -} - -static void APIENTRY logGenTextures(GLsizei n, GLuint *textures) -{ - SIG( "glGenTextures" ); - dllGenTextures( n, textures ); -} - -static void APIENTRY logGetBooleanv(GLenum pname, GLboolean *params) -{ - SIG( "glGetBooleanv" ); - dllGetBooleanv( pname, params ); -} - -static void APIENTRY logGetClipPlane(GLenum plane, GLdouble *equation) -{ - SIG( "glGetClipPlane" ); - dllGetClipPlane( plane, equation ); -} - -static void APIENTRY logGetDoublev(GLenum pname, GLdouble *params) -{ - SIG( "glGetDoublev" ); - dllGetDoublev( pname, params ); -} - -static GLenum APIENTRY logGetError(void) -{ - SIG( "glGetError" ); - return dllGetError(); -} - -static void APIENTRY logGetFloatv(GLenum pname, GLfloat *params) -{ - SIG( "glGetFloatv" ); - dllGetFloatv( pname, params ); -} - -static void APIENTRY logGetIntegerv(GLenum pname, GLint *params) -{ - SIG( "glGetIntegerv" ); - dllGetIntegerv( pname, params ); -} - -static void APIENTRY logGetLightfv(GLenum light, GLenum pname, GLfloat *params) -{ - SIG( "glGetLightfv" ); - dllGetLightfv( light, pname, params ); -} - -static void APIENTRY logGetLightiv(GLenum light, GLenum pname, GLint *params) -{ - SIG( "glGetLightiv" ); - dllGetLightiv( light, pname, params ); -} - -static void APIENTRY logGetMapdv(GLenum target, GLenum query, GLdouble *v) -{ - SIG( "glGetMapdv" ); - dllGetMapdv( target, query, v ); -} - -static void APIENTRY logGetMapfv(GLenum target, GLenum query, GLfloat *v) -{ - SIG( "glGetMapfv" ); - dllGetMapfv( target, query, v ); -} - -static void APIENTRY logGetMapiv(GLenum target, GLenum query, GLint *v) -{ - SIG( "glGetMapiv" ); - dllGetMapiv( target, query, v ); -} - -static void APIENTRY logGetMaterialfv(GLenum face, GLenum pname, GLfloat *params) -{ - SIG( "glGetMaterialfv" ); - dllGetMaterialfv( face, pname, params ); -} - -static void APIENTRY logGetMaterialiv(GLenum face, GLenum pname, GLint *params) -{ - SIG( "glGetMaterialiv" ); - dllGetMaterialiv( face, pname, params ); -} - -static void APIENTRY logGetPixelMapfv(GLenum map, GLfloat *values) -{ - SIG( "glGetPixelMapfv" ); - dllGetPixelMapfv( map, values ); -} - -static void APIENTRY logGetPixelMapuiv(GLenum map, GLuint *values) -{ - SIG( "glGetPixelMapuiv" ); - dllGetPixelMapuiv( map, values ); -} - -static void APIENTRY logGetPixelMapusv(GLenum map, GLushort *values) -{ - SIG( "glGetPixelMapusv" ); - dllGetPixelMapusv( map, values ); -} - -static void APIENTRY logGetPointerv(GLenum pname, GLvoid* *params) -{ - SIG( "glGetPointerv" ); - dllGetPointerv( pname, params ); -} - -static void APIENTRY logGetPolygonStipple(GLubyte *mask) -{ - SIG( "glGetPolygonStipple" ); - dllGetPolygonStipple( mask ); -} - -static const GLubyte * APIENTRY logGetString(GLenum name) -{ - SIG( "glGetString" ); - return dllGetString( name ); -} - -static void APIENTRY logGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params) -{ - SIG( "glGetTexEnvfv" ); - dllGetTexEnvfv( target, pname, params ); -} - -static void APIENTRY logGetTexEnviv(GLenum target, GLenum pname, GLint *params) -{ - SIG( "glGetTexEnviv" ); - dllGetTexEnviv( target, pname, params ); -} - -static void APIENTRY logGetTexGendv(GLenum coord, GLenum pname, GLdouble *params) -{ - SIG( "glGetTexGendv" ); - dllGetTexGendv( coord, pname, params ); -} - -static void APIENTRY logGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params) -{ - SIG( "glGetTexGenfv" ); - dllGetTexGenfv( coord, pname, params ); -} - -static void APIENTRY logGetTexGeniv(GLenum coord, GLenum pname, GLint *params) -{ - SIG( "glGetTexGeniv" ); - dllGetTexGeniv( coord, pname, params ); -} - -static void APIENTRY logGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels) -{ - SIG( "glGetTexImage" ); - dllGetTexImage( target, level, format, type, pixels ); -} -static void APIENTRY logGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params ) -{ - SIG( "glGetTexLevelParameterfv" ); - dllGetTexLevelParameterfv( target, level, pname, params ); -} - -static void APIENTRY logGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params) -{ - SIG( "glGetTexLevelParameteriv" ); - dllGetTexLevelParameteriv( target, level, pname, params ); -} - -static void APIENTRY logGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params) -{ - SIG( "glGetTexParameterfv" ); - dllGetTexParameterfv( target, pname, params ); -} - -static void APIENTRY logGetTexParameteriv(GLenum target, GLenum pname, GLint *params) -{ - SIG( "glGetTexParameteriv" ); - dllGetTexParameteriv( target, pname, params ); -} - -static void APIENTRY logHint(GLenum target, GLenum mode) -{ - fprintf( glw_state.log_fp, "glHint( 0x%x, 0x%x )\n", target, mode ); - dllHint( target, mode ); -} - -static void APIENTRY logIndexMask(GLuint mask) -{ - SIG( "glIndexMask" ); - dllIndexMask( mask ); -} - -static void APIENTRY logIndexPointer(GLenum type, GLsizei stride, const void *pointer) -{ - SIG( "glIndexPointer" ); - dllIndexPointer( type, stride, pointer ); -} - -static void APIENTRY logIndexd(GLdouble c) -{ - SIG( "glIndexd" ); - dllIndexd( c ); -} - -static void APIENTRY logIndexdv(const GLdouble *c) -{ - SIG( "glIndexdv" ); - dllIndexdv( c ); -} - -static void APIENTRY logIndexf(GLfloat c) -{ - SIG( "glIndexf" ); - dllIndexf( c ); -} - -static void APIENTRY logIndexfv(const GLfloat *c) -{ - SIG( "glIndexfv" ); - dllIndexfv( c ); -} - -static void APIENTRY logIndexi(GLint c) -{ - SIG( "glIndexi" ); - dllIndexi( c ); -} - -static void APIENTRY logIndexiv(const GLint *c) -{ - SIG( "glIndexiv" ); - dllIndexiv( c ); -} - -static void APIENTRY logIndexs(GLshort c) -{ - SIG( "glIndexs" ); - dllIndexs( c ); -} - -static void APIENTRY logIndexsv(const GLshort *c) -{ - SIG( "glIndexsv" ); - dllIndexsv( c ); -} - -static void APIENTRY logIndexub(GLubyte c) -{ - SIG( "glIndexub" ); - dllIndexub( c ); -} - -static void APIENTRY logIndexubv(const GLubyte *c) -{ - SIG( "glIndexubv" ); - dllIndexubv( c ); -} - -static void APIENTRY logInitNames(void) -{ - SIG( "glInitNames" ); - dllInitNames(); -} - -static void APIENTRY logInterleavedArrays(GLenum format, GLsizei stride, const void *pointer) -{ - SIG( "glInterleavedArrays" ); - dllInterleavedArrays( format, stride, pointer ); -} - -static GLboolean APIENTRY logIsEnabled(GLenum cap) -{ - SIG( "glIsEnabled" ); - return dllIsEnabled( cap ); -} -static GLboolean APIENTRY logIsList(GLuint list) -{ - SIG( "glIsList" ); - return dllIsList( list ); -} -static GLboolean APIENTRY logIsTexture(GLuint texture) -{ - SIG( "glIsTexture" ); - return dllIsTexture( texture ); -} - -static void APIENTRY logLightModelf(GLenum pname, GLfloat param) -{ - SIG( "glLightModelf" ); - dllLightModelf( pname, param ); -} - -static void APIENTRY logLightModelfv(GLenum pname, const GLfloat *params) -{ - SIG( "glLightModelfv" ); - dllLightModelfv( pname, params ); -} - -static void APIENTRY logLightModeli(GLenum pname, GLint param) -{ - SIG( "glLightModeli" ); - dllLightModeli( pname, param ); - -} - -static void APIENTRY logLightModeliv(GLenum pname, const GLint *params) -{ - SIG( "glLightModeliv" ); - dllLightModeliv( pname, params ); -} - -static void APIENTRY logLightf(GLenum light, GLenum pname, GLfloat param) -{ - SIG( "glLightf" ); - dllLightf( light, pname, param ); -} - -static void APIENTRY logLightfv(GLenum light, GLenum pname, const GLfloat *params) -{ - SIG( "glLightfv" ); - dllLightfv( light, pname, params ); -} - -static void APIENTRY logLighti(GLenum light, GLenum pname, GLint param) -{ - SIG( "glLighti" ); - dllLighti( light, pname, param ); -} - -static void APIENTRY logLightiv(GLenum light, GLenum pname, const GLint *params) -{ - SIG( "glLightiv" ); - dllLightiv( light, pname, params ); -} - -static void APIENTRY logLineStipple(GLint factor, GLushort pattern) -{ - SIG( "glLineStipple" ); - dllLineStipple( factor, pattern ); -} - -static void APIENTRY logLineWidth(GLfloat width) -{ - SIG( "glLineWidth" ); - dllLineWidth( width ); -} - -static void APIENTRY logListBase(GLuint base) -{ - SIG( "glListBase" ); - dllListBase( base ); -} - -static void APIENTRY logLoadIdentity(void) -{ - SIG( "glLoadIdentity" ); - dllLoadIdentity(); -} - -static void APIENTRY logLoadMatrixd(const GLdouble *m) -{ - SIG( "glLoadMatrixd" ); - dllLoadMatrixd( m ); -} - -static void APIENTRY logLoadMatrixf(const GLfloat *m) -{ - SIG( "glLoadMatrixf" ); - dllLoadMatrixf( m ); -} - -static void APIENTRY logLoadName(GLuint name) -{ - SIG( "glLoadName" ); - dllLoadName( name ); -} - -static void APIENTRY logLogicOp(GLenum opcode) -{ - SIG( "glLogicOp" ); - dllLogicOp( opcode ); -} - -static void APIENTRY logMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points) -{ - SIG( "glMap1d" ); - dllMap1d( target, u1, u2, stride, order, points ); -} - -static void APIENTRY logMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points) -{ - SIG( "glMap1f" ); - dllMap1f( target, u1, u2, stride, order, points ); -} - -static void APIENTRY logMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points) -{ - SIG( "glMap2d" ); - dllMap2d( target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points ); -} - -static void APIENTRY logMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points) -{ - SIG( "glMap2f" ); - dllMap2f( target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points ); -} - -static void APIENTRY logMapGrid1d(GLint un, GLdouble u1, GLdouble u2) -{ - SIG( "glMapGrid1d" ); - dllMapGrid1d( un, u1, u2 ); -} - -static void APIENTRY logMapGrid1f(GLint un, GLfloat u1, GLfloat u2) -{ - SIG( "glMapGrid1f" ); - dllMapGrid1f( un, u1, u2 ); -} - -static void APIENTRY logMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2) -{ - SIG( "glMapGrid2d" ); - dllMapGrid2d( un, u1, u2, vn, v1, v2 ); -} -static void APIENTRY logMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2) -{ - SIG( "glMapGrid2f" ); - dllMapGrid2f( un, u1, u2, vn, v1, v2 ); -} -static void APIENTRY logMaterialf(GLenum face, GLenum pname, GLfloat param) -{ - SIG( "glMaterialf" ); - dllMaterialf( face, pname, param ); -} -static void APIENTRY logMaterialfv(GLenum face, GLenum pname, const GLfloat *params) -{ - SIG( "glMaterialfv" ); - dllMaterialfv( face, pname, params ); -} - -static void APIENTRY logMateriali(GLenum face, GLenum pname, GLint param) -{ - SIG( "glMateriali" ); - dllMateriali( face, pname, param ); -} - -static void APIENTRY logMaterialiv(GLenum face, GLenum pname, const GLint *params) -{ - SIG( "glMaterialiv" ); - dllMaterialiv( face, pname, params ); -} - -static void APIENTRY logMatrixMode(GLenum mode) -{ - SIG( "glMatrixMode" ); - dllMatrixMode( mode ); -} - -static void APIENTRY logMultMatrixd(const GLdouble *m) -{ - SIG( "glMultMatrixd" ); - dllMultMatrixd( m ); -} - -static void APIENTRY logMultMatrixf(const GLfloat *m) -{ - SIG( "glMultMatrixf" ); - dllMultMatrixf( m ); -} - -static void APIENTRY logNewList(GLuint list, GLenum mode) -{ - SIG( "glNewList" ); - dllNewList( list, mode ); -} - -static void APIENTRY logNormal3b(GLbyte nx, GLbyte ny, GLbyte nz) -{ - SIG ("glNormal3b" ); - dllNormal3b( nx, ny, nz ); -} - -static void APIENTRY logNormal3bv(const GLbyte *v) -{ - SIG( "glNormal3bv" ); - dllNormal3bv( v ); -} - -static void APIENTRY logNormal3d(GLdouble nx, GLdouble ny, GLdouble nz) -{ - SIG( "glNormal3d" ); - dllNormal3d( nx, ny, nz ); -} - -static void APIENTRY logNormal3dv(const GLdouble *v) -{ - SIG( "glNormal3dv" ); - dllNormal3dv( v ); -} - -static void APIENTRY logNormal3f(GLfloat nx, GLfloat ny, GLfloat nz) -{ - SIG( "glNormal3f" ); - dllNormal3f( nx, ny, nz ); -} - -static void APIENTRY logNormal3fv(const GLfloat *v) -{ - SIG( "glNormal3fv" ); - dllNormal3fv( v ); -} -static void APIENTRY logNormal3i(GLint nx, GLint ny, GLint nz) -{ - SIG( "glNormal3i" ); - dllNormal3i( nx, ny, nz ); -} -static void APIENTRY logNormal3iv(const GLint *v) -{ - SIG( "glNormal3iv" ); - dllNormal3iv( v ); -} -static void APIENTRY logNormal3s(GLshort nx, GLshort ny, GLshort nz) -{ - SIG( "glNormal3s" ); - dllNormal3s( nx, ny, nz ); -} -static void APIENTRY logNormal3sv(const GLshort *v) -{ - SIG( "glNormal3sv" ); - dllNormal3sv( v ); -} -static void APIENTRY logNormalPointer(GLenum type, GLsizei stride, const void *pointer) -{ - SIG( "glNormalPointer" ); - dllNormalPointer( type, stride, pointer ); -} -static void APIENTRY logOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) -{ - SIG( "glOrtho" ); - dllOrtho( left, right, bottom, top, zNear, zFar ); -} - -static void APIENTRY logPassThrough(GLfloat token) -{ - SIG( "glPassThrough" ); - dllPassThrough( token ); -} - -static void APIENTRY logPixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values) -{ - SIG( "glPixelMapfv" ); - dllPixelMapfv( map, mapsize, values ); -} - -static void APIENTRY logPixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values) -{ - SIG( "glPixelMapuiv" ); - dllPixelMapuiv( map, mapsize, values ); -} - -static void APIENTRY logPixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values) -{ - SIG( "glPixelMapusv" ); - dllPixelMapusv( map, mapsize, values ); -} -static void APIENTRY logPixelStoref(GLenum pname, GLfloat param) -{ - SIG( "glPixelStoref" ); - dllPixelStoref( pname, param ); -} -static void APIENTRY logPixelStorei(GLenum pname, GLint param) -{ - SIG( "glPixelStorei" ); - dllPixelStorei( pname, param ); -} -static void APIENTRY logPixelTransferf(GLenum pname, GLfloat param) -{ - SIG( "glPixelTransferf" ); - dllPixelTransferf( pname, param ); -} - -static void APIENTRY logPixelTransferi(GLenum pname, GLint param) -{ - SIG( "glPixelTransferi" ); - dllPixelTransferi( pname, param ); -} - -static void APIENTRY logPixelZoom(GLfloat xfactor, GLfloat yfactor) -{ - SIG( "glPixelZoom" ); - dllPixelZoom( xfactor, yfactor ); -} - -static void APIENTRY logPointSize(GLfloat size) -{ - SIG( "glPointSize" ); - dllPointSize( size ); -} - -static void APIENTRY logPolygonMode(GLenum face, GLenum mode) -{ - fprintf( glw_state.log_fp, "glPolygonMode( 0x%x, 0x%x )\n", face, mode ); - dllPolygonMode( face, mode ); -} - -static void APIENTRY logPolygonOffset(GLfloat factor, GLfloat units) -{ - SIG( "glPolygonOffset" ); - dllPolygonOffset( factor, units ); -} -static void APIENTRY logPolygonStipple(const GLubyte *mask ) -{ - SIG( "glPolygonStipple" ); - dllPolygonStipple( mask ); -} -static void APIENTRY logPopAttrib(void) -{ - SIG( "glPopAttrib" ); - dllPopAttrib(); -} - -static void APIENTRY logPopClientAttrib(void) -{ - SIG( "glPopClientAttrib" ); - dllPopClientAttrib(); -} - -static void APIENTRY logPopMatrix(void) -{ - SIG( "glPopMatrix" ); - dllPopMatrix(); -} - -static void APIENTRY logPopName(void) -{ - SIG( "glPopName" ); - dllPopName(); -} - -static void APIENTRY logPrioritizeTextures(GLsizei n, const GLuint *textures, const GLclampf *priorities) -{ - SIG( "glPrioritizeTextures" ); - dllPrioritizeTextures( n, textures, priorities ); -} - -static void APIENTRY logPushAttrib(GLbitfield mask) -{ - SIG( "glPushAttrib" ); - dllPushAttrib( mask ); -} - -static void APIENTRY logPushClientAttrib(GLbitfield mask) -{ - SIG( "glPushClientAttrib" ); - dllPushClientAttrib( mask ); -} - -static void APIENTRY logPushMatrix(void) -{ - SIG( "glPushMatrix" ); - dllPushMatrix(); -} - -static void APIENTRY logPushName(GLuint name) -{ - SIG( "glPushName" ); - dllPushName( name ); -} - -static void APIENTRY logRasterPos2d(GLdouble x, GLdouble y) -{ - SIG ("glRasterPot2d" ); - dllRasterPos2d( x, y ); -} - -static void APIENTRY logRasterPos2dv(const GLdouble *v) -{ - SIG( "glRasterPos2dv" ); - dllRasterPos2dv( v ); -} - -static void APIENTRY logRasterPos2f(GLfloat x, GLfloat y) -{ - SIG( "glRasterPos2f" ); - dllRasterPos2f( x, y ); -} -static void APIENTRY logRasterPos2fv(const GLfloat *v) -{ - SIG( "glRasterPos2dv" ); - dllRasterPos2fv( v ); -} -static void APIENTRY logRasterPos2i(GLint x, GLint y) -{ - SIG( "glRasterPos2if" ); - dllRasterPos2i( x, y ); -} -static void APIENTRY logRasterPos2iv(const GLint *v) -{ - SIG( "glRasterPos2iv" ); - dllRasterPos2iv( v ); -} -static void APIENTRY logRasterPos2s(GLshort x, GLshort y) -{ - SIG( "glRasterPos2s" ); - dllRasterPos2s( x, y ); -} -static void APIENTRY logRasterPos2sv(const GLshort *v) -{ - SIG( "glRasterPos2sv" ); - dllRasterPos2sv( v ); -} -static void APIENTRY logRasterPos3d(GLdouble x, GLdouble y, GLdouble z) -{ - SIG( "glRasterPos3d" ); - dllRasterPos3d( x, y, z ); -} -static void APIENTRY logRasterPos3dv(const GLdouble *v) -{ - SIG( "glRasterPos3dv" ); - dllRasterPos3dv( v ); -} -static void APIENTRY logRasterPos3f(GLfloat x, GLfloat y, GLfloat z) -{ - SIG( "glRasterPos3f" ); - dllRasterPos3f( x, y, z ); -} -static void APIENTRY logRasterPos3fv(const GLfloat *v) -{ - SIG( "glRasterPos3fv" ); - dllRasterPos3fv( v ); -} -static void APIENTRY logRasterPos3i(GLint x, GLint y, GLint z) -{ - SIG( "glRasterPos3i" ); - dllRasterPos3i( x, y, z ); -} -static void APIENTRY logRasterPos3iv(const GLint *v) -{ - SIG( "glRasterPos3iv" ); - dllRasterPos3iv( v ); -} -static void APIENTRY logRasterPos3s(GLshort x, GLshort y, GLshort z) -{ - SIG( "glRasterPos3s" ); - dllRasterPos3s( x, y, z ); -} -static void APIENTRY logRasterPos3sv(const GLshort *v) -{ - SIG( "glRasterPos3sv" ); - dllRasterPos3sv( v ); -} -static void APIENTRY logRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) -{ - SIG( "glRasterPos4d" ); - dllRasterPos4d( x, y, z, w ); -} -static void APIENTRY logRasterPos4dv(const GLdouble *v) -{ - SIG( "glRasterPos4dv" ); - dllRasterPos4dv( v ); -} -static void APIENTRY logRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ - SIG( "glRasterPos4f" ); - dllRasterPos4f( x, y, z, w ); -} -static void APIENTRY logRasterPos4fv(const GLfloat *v) -{ - SIG( "glRasterPos4fv" ); - dllRasterPos4fv( v ); -} -static void APIENTRY logRasterPos4i(GLint x, GLint y, GLint z, GLint w) -{ - SIG( "glRasterPos4i" ); - dllRasterPos4i( x, y, z, w ); -} -static void APIENTRY logRasterPos4iv(const GLint *v) -{ - SIG( "glRasterPos4iv" ); - dllRasterPos4iv( v ); -} -static void APIENTRY logRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w) -{ - SIG( "glRasterPos4s" ); - dllRasterPos4s( x, y, z, w ); -} -static void APIENTRY logRasterPos4sv(const GLshort *v) -{ - SIG( "glRasterPos4sv" ); - dllRasterPos4sv( v ); -} -static void APIENTRY logReadBuffer(GLenum mode) -{ - SIG( "glReadBuffer" ); - dllReadBuffer( mode ); -} -static void APIENTRY logReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels) -{ - SIG( "glReadPixels" ); - dllReadPixels( x, y, width, height, format, type, pixels ); -} - -static void APIENTRY logRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) -{ - SIG( "glRectd" ); - dllRectd( x1, y1, x2, y2 ); -} - -static void APIENTRY logRectdv(const GLdouble *v1, const GLdouble *v2) -{ - SIG( "glRectdv" ); - dllRectdv( v1, v2 ); -} - -static void APIENTRY logRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) -{ - SIG( "glRectf" ); - dllRectf( x1, y1, x2, y2 ); -} - -static void APIENTRY logRectfv(const GLfloat *v1, const GLfloat *v2) -{ - SIG( "glRectfv" ); - dllRectfv( v1, v2 ); -} -static void APIENTRY logRecti(GLint x1, GLint y1, GLint x2, GLint y2) -{ - SIG( "glRecti" ); - dllRecti( x1, y1, x2, y2 ); -} -static void APIENTRY logRectiv(const GLint *v1, const GLint *v2) -{ - SIG( "glRectiv" ); - dllRectiv( v1, v2 ); -} -static void APIENTRY logRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2) -{ - SIG( "glRects" ); - dllRects( x1, y1, x2, y2 ); -} -static void APIENTRY logRectsv(const GLshort *v1, const GLshort *v2) -{ - SIG( "glRectsv" ); - dllRectsv( v1, v2 ); -} -static GLint APIENTRY logRenderMode(GLenum mode) -{ - SIG( "glRenderMode" ); - return dllRenderMode( mode ); -} -static void APIENTRY logRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z) -{ - SIG( "glRotated" ); - dllRotated( angle, x, y, z ); -} - -static void APIENTRY logRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) -{ - SIG( "glRotatef" ); - dllRotatef( angle, x, y, z ); -} - -static void APIENTRY logScaled(GLdouble x, GLdouble y, GLdouble z) -{ - SIG( "glScaled" ); - dllScaled( x, y, z ); -} - -static void APIENTRY logScalef(GLfloat x, GLfloat y, GLfloat z) -{ - SIG( "glScalef" ); - dllScalef( x, y, z ); -} - -static void APIENTRY logScissor(GLint x, GLint y, GLsizei width, GLsizei height) -{ - fprintf( glw_state.log_fp, "glScissor( %d, %d, %d, %d )\n", x, y, width, height ); - dllScissor( x, y, width, height ); -} - -static void APIENTRY logSelectBuffer(GLsizei size, GLuint *buffer) -{ - SIG( "glSelectBuffer" ); - dllSelectBuffer( size, buffer ); -} - -static void APIENTRY logShadeModel(GLenum mode) -{ - SIG( "glShadeModel" ); - dllShadeModel( mode ); -} - -static void APIENTRY logStencilFunc(GLenum func, GLint ref, GLuint mask) -{ - SIG( "glStencilFunc" ); - dllStencilFunc( func, ref, mask ); -} - -static void APIENTRY logStencilMask(GLuint mask) -{ - SIG( "glStencilMask" ); - dllStencilMask( mask ); -} - -static void APIENTRY logStencilOp(GLenum fail, GLenum zfail, GLenum zpass) -{ - SIG( "glStencilOp" ); - dllStencilOp( fail, zfail, zpass ); -} - -static void APIENTRY logTexCoord1d(GLdouble s) -{ - SIG( "glTexCoord1d" ); - dllTexCoord1d( s ); -} - -static void APIENTRY logTexCoord1dv(const GLdouble *v) -{ - SIG( "glTexCoord1dv" ); - dllTexCoord1dv( v ); -} - -static void APIENTRY logTexCoord1f(GLfloat s) -{ - SIG( "glTexCoord1f" ); - dllTexCoord1f( s ); -} -static void APIENTRY logTexCoord1fv(const GLfloat *v) -{ - SIG( "glTexCoord1fv" ); - dllTexCoord1fv( v ); -} -static void APIENTRY logTexCoord1i(GLint s) -{ - SIG( "glTexCoord1i" ); - dllTexCoord1i( s ); -} -static void APIENTRY logTexCoord1iv(const GLint *v) -{ - SIG( "glTexCoord1iv" ); - dllTexCoord1iv( v ); -} -static void APIENTRY logTexCoord1s(GLshort s) -{ - SIG( "glTexCoord1s" ); - dllTexCoord1s( s ); -} -static void APIENTRY logTexCoord1sv(const GLshort *v) -{ - SIG( "glTexCoord1sv" ); - dllTexCoord1sv( v ); -} -static void APIENTRY logTexCoord2d(GLdouble s, GLdouble t) -{ - SIG( "glTexCoord2d" ); - dllTexCoord2d( s, t ); -} - -static void APIENTRY logTexCoord2dv(const GLdouble *v) -{ - SIG( "glTexCoord2dv" ); - dllTexCoord2dv( v ); -} -static void APIENTRY logTexCoord2f(GLfloat s, GLfloat t) -{ - SIG( "glTexCoord2f" ); - dllTexCoord2f( s, t ); -} -static void APIENTRY logTexCoord2fv(const GLfloat *v) -{ - SIG( "glTexCoord2fv" ); - dllTexCoord2fv( v ); -} -static void APIENTRY logTexCoord2i(GLint s, GLint t) -{ - SIG( "glTexCoord2i" ); - dllTexCoord2i( s, t ); -} -static void APIENTRY logTexCoord2iv(const GLint *v) -{ - SIG( "glTexCoord2iv" ); - dllTexCoord2iv( v ); -} -static void APIENTRY logTexCoord2s(GLshort s, GLshort t) -{ - SIG( "glTexCoord2s" ); - dllTexCoord2s( s, t ); -} -static void APIENTRY logTexCoord2sv(const GLshort *v) -{ - SIG( "glTexCoord2sv" ); - dllTexCoord2sv( v ); -} -static void APIENTRY logTexCoord3d(GLdouble s, GLdouble t, GLdouble r) -{ - SIG( "glTexCoord3d" ); - dllTexCoord3d( s, t, r ); -} -static void APIENTRY logTexCoord3dv(const GLdouble *v) -{ - SIG( "glTexCoord3dv" ); - dllTexCoord3dv( v ); -} -static void APIENTRY logTexCoord3f(GLfloat s, GLfloat t, GLfloat r) -{ - SIG( "glTexCoord3f" ); - dllTexCoord3f( s, t, r ); -} -static void APIENTRY logTexCoord3fv(const GLfloat *v) -{ - SIG( "glTexCoord3fv" ); - dllTexCoord3fv( v ); -} -static void APIENTRY logTexCoord3i(GLint s, GLint t, GLint r) -{ - SIG( "glTexCoord3i" ); - dllTexCoord3i( s, t, r ); -} -static void APIENTRY logTexCoord3iv(const GLint *v) -{ - SIG( "glTexCoord3iv" ); - dllTexCoord3iv( v ); -} -static void APIENTRY logTexCoord3s(GLshort s, GLshort t, GLshort r) -{ - SIG( "glTexCoord3s" ); - dllTexCoord3s( s, t, r ); -} -static void APIENTRY logTexCoord3sv(const GLshort *v) -{ - SIG( "glTexCoord3sv" ); - dllTexCoord3sv( v ); -} -static void APIENTRY logTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q) -{ - SIG( "glTexCoord4d" ); - dllTexCoord4d( s, t, r, q ); -} -static void APIENTRY logTexCoord4dv(const GLdouble *v) -{ - SIG( "glTexCoord4dv" ); - dllTexCoord4dv( v ); -} -static void APIENTRY logTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q) -{ - SIG( "glTexCoord4f" ); - dllTexCoord4f( s, t, r, q ); -} -static void APIENTRY logTexCoord4fv(const GLfloat *v) -{ - SIG( "glTexCoord4fv" ); - dllTexCoord4fv( v ); -} -static void APIENTRY logTexCoord4i(GLint s, GLint t, GLint r, GLint q) -{ - SIG( "glTexCoord4i" ); - dllTexCoord4i( s, t, r, q ); -} -static void APIENTRY logTexCoord4iv(const GLint *v) -{ - SIG( "glTexCoord4iv" ); - dllTexCoord4iv( v ); -} -static void APIENTRY logTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q) -{ - SIG( "glTexCoord4s" ); - dllTexCoord4s( s, t, r, q ); -} -static void APIENTRY logTexCoord4sv(const GLshort *v) -{ - SIG( "glTexCoord4sv" ); - dllTexCoord4sv( v ); -} -static void APIENTRY logTexCoordPointer(GLint size, GLenum type, GLsizei stride, const void *pointer) -{ - fprintf( glw_state.log_fp, "glTexCoordPointer( %d, %s, %d, MEM )\n", size, TypeToString( type ), stride ); - dllTexCoordPointer( size, type, stride, pointer ); -} - -static void APIENTRY logTexEnvf(GLenum target, GLenum pname, GLfloat param) -{ - fprintf( glw_state.log_fp, "glTexEnvf( 0x%x, 0x%x, %f )\n", target, pname, param ); - dllTexEnvf( target, pname, param ); -} - -static void APIENTRY logTexEnvfv(GLenum target, GLenum pname, const GLfloat *params) -{ - SIG( "glTexEnvfv" ); - dllTexEnvfv( target, pname, params ); -} - -static void APIENTRY logTexEnvi(GLenum target, GLenum pname, GLint param) -{ - fprintf( glw_state.log_fp, "glTexEnvi( 0x%x, 0x%x, 0x%x )\n", target, pname, param ); - dllTexEnvi( target, pname, param ); -} -static void APIENTRY logTexEnviv(GLenum target, GLenum pname, const GLint *params) -{ - SIG( "glTexEnviv" ); - dllTexEnviv( target, pname, params ); -} - -static void APIENTRY logTexGend(GLenum coord, GLenum pname, GLdouble param) -{ - SIG( "glTexGend" ); - dllTexGend( coord, pname, param ); -} - -static void APIENTRY logTexGendv(GLenum coord, GLenum pname, const GLdouble *params) -{ - SIG( "glTexGendv" ); - dllTexGendv( coord, pname, params ); -} - -static void APIENTRY logTexGenf(GLenum coord, GLenum pname, GLfloat param) -{ - SIG( "glTexGenf" ); - dllTexGenf( coord, pname, param ); -} -static void APIENTRY logTexGenfv(GLenum coord, GLenum pname, const GLfloat *params) -{ - SIG( "glTexGenfv" ); - dllTexGenfv( coord, pname, params ); -} -static void APIENTRY logTexGeni(GLenum coord, GLenum pname, GLint param) -{ - SIG( "glTexGeni" ); - dllTexGeni( coord, pname, param ); -} -static void APIENTRY logTexGeniv(GLenum coord, GLenum pname, const GLint *params) -{ - SIG( "glTexGeniv" ); - dllTexGeniv( coord, pname, params ); -} -static void APIENTRY logTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels) -{ - SIG( "glTexImage1D" ); - dllTexImage1D( target, level, internalformat, width, border, format, type, pixels ); -} -static void APIENTRY logTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels) -{ - SIG( "glTexImage2D" ); - dllTexImage2D( target, level, internalformat, width, height, border, format, type, pixels ); -} - -static void APIENTRY logTexParameterf(GLenum target, GLenum pname, GLfloat param) -{ - fprintf( glw_state.log_fp, "glTexParameterf( 0x%x, 0x%x, %f )\n", target, pname, param ); - dllTexParameterf( target, pname, param ); -} - -static void APIENTRY logTexParameterfv(GLenum target, GLenum pname, const GLfloat *params) -{ - SIG( "glTexParameterfv" ); - dllTexParameterfv( target, pname, params ); -} -static void APIENTRY logTexParameteri(GLenum target, GLenum pname, GLint param) -{ - fprintf( glw_state.log_fp, "glTexParameteri( 0x%x, 0x%x, 0x%x )\n", target, pname, param ); - dllTexParameteri( target, pname, param ); -} -static void APIENTRY logTexParameteriv(GLenum target, GLenum pname, const GLint *params) -{ - SIG( "glTexParameteriv" ); - dllTexParameteriv( target, pname, params ); -} -static void APIENTRY logTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels) -{ - SIG( "glTexSubImage1D" ); - dllTexSubImage1D( target, level, xoffset, width, format, type, pixels ); -} -static void APIENTRY logTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) -{ - SIG( "glTexSubImage2D" ); - dllTexSubImage2D( target, level, xoffset, yoffset, width, height, format, type, pixels ); -} -static void APIENTRY logTranslated(GLdouble x, GLdouble y, GLdouble z) -{ - SIG( "glTranslated" ); - dllTranslated( x, y, z ); -} - -static void APIENTRY logTranslatef(GLfloat x, GLfloat y, GLfloat z) -{ - SIG( "glTranslatef" ); - dllTranslatef( x, y, z ); -} - -static void APIENTRY logVertex2d(GLdouble x, GLdouble y) -{ - SIG( "glVertex2d" ); - dllVertex2d( x, y ); -} - -static void APIENTRY logVertex2dv(const GLdouble *v) -{ - SIG( "glVertex2dv" ); - dllVertex2dv( v ); -} -static void APIENTRY logVertex2f(GLfloat x, GLfloat y) -{ - SIG( "glVertex2f" ); - dllVertex2f( x, y ); -} -static void APIENTRY logVertex2fv(const GLfloat *v) -{ - SIG( "glVertex2fv" ); - dllVertex2fv( v ); -} -static void APIENTRY logVertex2i(GLint x, GLint y) -{ - SIG( "glVertex2i" ); - dllVertex2i( x, y ); -} -static void APIENTRY logVertex2iv(const GLint *v) -{ - SIG( "glVertex2iv" ); - dllVertex2iv( v ); -} -static void APIENTRY logVertex2s(GLshort x, GLshort y) -{ - SIG( "glVertex2s" ); - dllVertex2s( x, y ); -} -static void APIENTRY logVertex2sv(const GLshort *v) -{ - SIG( "glVertex2sv" ); - dllVertex2sv( v ); -} -static void APIENTRY logVertex3d(GLdouble x, GLdouble y, GLdouble z) -{ - SIG( "glVertex3d" ); - dllVertex3d( x, y, z ); -} -static void APIENTRY logVertex3dv(const GLdouble *v) -{ - SIG( "glVertex3dv" ); - dllVertex3dv( v ); -} -static void APIENTRY logVertex3f(GLfloat x, GLfloat y, GLfloat z) -{ - SIG( "glVertex3f" ); - dllVertex3f( x, y, z ); -} -static void APIENTRY logVertex3fv(const GLfloat *v) -{ - SIG( "glVertex3fv" ); - dllVertex3fv( v ); -} -static void APIENTRY logVertex3i(GLint x, GLint y, GLint z) -{ - SIG( "glVertex3i" ); - dllVertex3i( x, y, z ); -} -static void APIENTRY logVertex3iv(const GLint *v) -{ - SIG( "glVertex3iv" ); - dllVertex3iv( v ); -} -static void APIENTRY logVertex3s(GLshort x, GLshort y, GLshort z) -{ - SIG( "glVertex3s" ); - dllVertex3s( x, y, z ); -} -static void APIENTRY logVertex3sv(const GLshort *v) -{ - SIG( "glVertex3sv" ); - dllVertex3sv( v ); -} -static void APIENTRY logVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) -{ - SIG( "glVertex4d" ); - dllVertex4d( x, y, z, w ); -} -static void APIENTRY logVertex4dv(const GLdouble *v) -{ - SIG( "glVertex4dv" ); - dllVertex4dv( v ); -} -static void APIENTRY logVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ - SIG( "glVertex4f" ); - dllVertex4f( x, y, z, w ); -} -static void APIENTRY logVertex4fv(const GLfloat *v) -{ - SIG( "glVertex4fv" ); - dllVertex4fv( v ); -} -static void APIENTRY logVertex4i(GLint x, GLint y, GLint z, GLint w) -{ - SIG( "glVertex4i" ); - dllVertex4i( x, y, z, w ); -} -static void APIENTRY logVertex4iv(const GLint *v) -{ - SIG( "glVertex4iv" ); - dllVertex4iv( v ); -} -static void APIENTRY logVertex4s(GLshort x, GLshort y, GLshort z, GLshort w) -{ - SIG( "glVertex4s" ); - dllVertex4s( x, y, z, w ); -} -static void APIENTRY logVertex4sv(const GLshort *v) -{ - SIG( "glVertex4sv" ); - dllVertex4sv( v ); -} -static void APIENTRY logVertexPointer(GLint size, GLenum type, GLsizei stride, const void *pointer) -{ - fprintf( glw_state.log_fp, "glVertexPointer( %d, %s, %d, MEM )\n", size, TypeToString( type ), stride ); - dllVertexPointer( size, type, stride, pointer ); -} -static void APIENTRY logViewport(GLint x, GLint y, GLsizei width, GLsizei height) -{ - fprintf( glw_state.log_fp, "glViewport( %d, %d, %d, %d )\n", x, y, width, height ); - dllViewport( x, y, width, height ); -} - -/* -** QGL_Shutdown -** -** Unloads the specified DLL then nulls out all the proc pointers. This -** is only called during a hard shutdown of the OGL subsystem (e.g. vid_restart). -*/ -void QGL_Shutdown( void ) -{ - ri.Printf( PRINT_ALL, "...shutting down QGL\n" ); - - if ( glw_state.hinstOpenGL ) - { - ri.Printf( PRINT_ALL, "...unloading OpenGL DLL\n" ); - FreeLibrary( glw_state.hinstOpenGL ); - } - - glw_state.hinstOpenGL = NULL; - - qglAccum = NULL; - qglAlphaFunc = NULL; - qglAreTexturesResident = NULL; - qglArrayElement = NULL; - qglBegin = NULL; - qglBindTexture = NULL; - qglBitmap = NULL; - qglBlendFunc = NULL; - qglCallList = NULL; - qglCallLists = NULL; - qglClear = NULL; - qglClearAccum = NULL; - qglClearColor = NULL; - qglClearDepth = NULL; - qglClearIndex = NULL; - qglClearStencil = NULL; - qglClipPlane = NULL; - qglColor3b = NULL; - qglColor3bv = NULL; - qglColor3d = NULL; - qglColor3dv = NULL; - qglColor3f = NULL; - qglColor3fv = NULL; - qglColor3i = NULL; - qglColor3iv = NULL; - qglColor3s = NULL; - qglColor3sv = NULL; - qglColor3ub = NULL; - qglColor3ubv = NULL; - qglColor3ui = NULL; - qglColor3uiv = NULL; - qglColor3us = NULL; - qglColor3usv = NULL; - qglColor4b = NULL; - qglColor4bv = NULL; - qglColor4d = NULL; - qglColor4dv = NULL; - qglColor4f = NULL; - qglColor4fv = NULL; - qglColor4i = NULL; - qglColor4iv = NULL; - qglColor4s = NULL; - qglColor4sv = NULL; - qglColor4ub = NULL; - qglColor4ubv = NULL; - qglColor4ui = NULL; - qglColor4uiv = NULL; - qglColor4us = NULL; - qglColor4usv = NULL; - qglColorMask = NULL; - qglColorMaterial = NULL; - qglColorPointer = NULL; - qglCopyPixels = NULL; - qglCopyTexImage1D = NULL; - qglCopyTexImage2D = NULL; - qglCopyTexSubImage1D = NULL; - qglCopyTexSubImage2D = NULL; - qglCullFace = NULL; - qglDeleteLists = NULL; - qglDeleteTextures = NULL; - qglDepthFunc = NULL; - qglDepthMask = NULL; - qglDepthRange = NULL; - qglDisable = NULL; - qglDisableClientState = NULL; - qglDrawArrays = NULL; - qglDrawBuffer = NULL; - qglDrawElements = NULL; - qglDrawPixels = NULL; - qglEdgeFlag = NULL; - qglEdgeFlagPointer = NULL; - qglEdgeFlagv = NULL; - qglEnable = NULL; - qglEnableClientState = NULL; - qglEnd = NULL; - qglEndList = NULL; - qglEvalCoord1d = NULL; - qglEvalCoord1dv = NULL; - qglEvalCoord1f = NULL; - qglEvalCoord1fv = NULL; - qglEvalCoord2d = NULL; - qglEvalCoord2dv = NULL; - qglEvalCoord2f = NULL; - qglEvalCoord2fv = NULL; - qglEvalMesh1 = NULL; - qglEvalMesh2 = NULL; - qglEvalPoint1 = NULL; - qglEvalPoint2 = NULL; - qglFeedbackBuffer = NULL; - qglFinish = NULL; - qglFlush = NULL; - qglFogf = NULL; - qglFogfv = NULL; - qglFogi = NULL; - qglFogiv = NULL; - qglFrontFace = NULL; - qglFrustum = NULL; - qglGenLists = NULL; - qglGenTextures = NULL; - qglGetBooleanv = NULL; - qglGetClipPlane = NULL; - qglGetDoublev = NULL; - qglGetError = NULL; - qglGetFloatv = NULL; - qglGetIntegerv = NULL; - qglGetLightfv = NULL; - qglGetLightiv = NULL; - qglGetMapdv = NULL; - qglGetMapfv = NULL; - qglGetMapiv = NULL; - qglGetMaterialfv = NULL; - qglGetMaterialiv = NULL; - qglGetPixelMapfv = NULL; - qglGetPixelMapuiv = NULL; - qglGetPixelMapusv = NULL; - qglGetPointerv = NULL; - qglGetPolygonStipple = NULL; - qglGetString = NULL; - qglGetTexEnvfv = NULL; - qglGetTexEnviv = NULL; - qglGetTexGendv = NULL; - qglGetTexGenfv = NULL; - qglGetTexGeniv = NULL; - qglGetTexImage = NULL; - qglGetTexLevelParameterfv = NULL; - qglGetTexLevelParameteriv = NULL; - qglGetTexParameterfv = NULL; - qglGetTexParameteriv = NULL; - qglHint = NULL; - qglIndexMask = NULL; - qglIndexPointer = NULL; - qglIndexd = NULL; - qglIndexdv = NULL; - qglIndexf = NULL; - qglIndexfv = NULL; - qglIndexi = NULL; - qglIndexiv = NULL; - qglIndexs = NULL; - qglIndexsv = NULL; - qglIndexub = NULL; - qglIndexubv = NULL; - qglInitNames = NULL; - qglInterleavedArrays = NULL; - qglIsEnabled = NULL; - qglIsList = NULL; - qglIsTexture = NULL; - qglLightModelf = NULL; - qglLightModelfv = NULL; - qglLightModeli = NULL; - qglLightModeliv = NULL; - qglLightf = NULL; - qglLightfv = NULL; - qglLighti = NULL; - qglLightiv = NULL; - qglLineStipple = NULL; - qglLineWidth = NULL; - qglListBase = NULL; - qglLoadIdentity = NULL; - qglLoadMatrixd = NULL; - qglLoadMatrixf = NULL; - qglLoadName = NULL; - qglLogicOp = NULL; - qglMap1d = NULL; - qglMap1f = NULL; - qglMap2d = NULL; - qglMap2f = NULL; - qglMapGrid1d = NULL; - qglMapGrid1f = NULL; - qglMapGrid2d = NULL; - qglMapGrid2f = NULL; - qglMaterialf = NULL; - qglMaterialfv = NULL; - qglMateriali = NULL; - qglMaterialiv = NULL; - qglMatrixMode = NULL; - qglMultMatrixd = NULL; - qglMultMatrixf = NULL; - qglNewList = NULL; - qglNormal3b = NULL; - qglNormal3bv = NULL; - qglNormal3d = NULL; - qglNormal3dv = NULL; - qglNormal3f = NULL; - qglNormal3fv = NULL; - qglNormal3i = NULL; - qglNormal3iv = NULL; - qglNormal3s = NULL; - qglNormal3sv = NULL; - qglNormalPointer = NULL; - qglOrtho = NULL; - qglPassThrough = NULL; - qglPixelMapfv = NULL; - qglPixelMapuiv = NULL; - qglPixelMapusv = NULL; - qglPixelStoref = NULL; - qglPixelStorei = NULL; - qglPixelTransferf = NULL; - qglPixelTransferi = NULL; - qglPixelZoom = NULL; - qglPointSize = NULL; - qglPolygonMode = NULL; - qglPolygonOffset = NULL; - qglPolygonStipple = NULL; - qglPopAttrib = NULL; - qglPopClientAttrib = NULL; - qglPopMatrix = NULL; - qglPopName = NULL; - qglPrioritizeTextures = NULL; - qglPushAttrib = NULL; - qglPushClientAttrib = NULL; - qglPushMatrix = NULL; - qglPushName = NULL; - qglRasterPos2d = NULL; - qglRasterPos2dv = NULL; - qglRasterPos2f = NULL; - qglRasterPos2fv = NULL; - qglRasterPos2i = NULL; - qglRasterPos2iv = NULL; - qglRasterPos2s = NULL; - qglRasterPos2sv = NULL; - qglRasterPos3d = NULL; - qglRasterPos3dv = NULL; - qglRasterPos3f = NULL; - qglRasterPos3fv = NULL; - qglRasterPos3i = NULL; - qglRasterPos3iv = NULL; - qglRasterPos3s = NULL; - qglRasterPos3sv = NULL; - qglRasterPos4d = NULL; - qglRasterPos4dv = NULL; - qglRasterPos4f = NULL; - qglRasterPos4fv = NULL; - qglRasterPos4i = NULL; - qglRasterPos4iv = NULL; - qglRasterPos4s = NULL; - qglRasterPos4sv = NULL; - qglReadBuffer = NULL; - qglReadPixels = NULL; - qglRectd = NULL; - qglRectdv = NULL; - qglRectf = NULL; - qglRectfv = NULL; - qglRecti = NULL; - qglRectiv = NULL; - qglRects = NULL; - qglRectsv = NULL; - qglRenderMode = NULL; - qglRotated = NULL; - qglRotatef = NULL; - qglScaled = NULL; - qglScalef = NULL; - qglScissor = NULL; - qglSelectBuffer = NULL; - qglShadeModel = NULL; - qglStencilFunc = NULL; - qglStencilMask = NULL; - qglStencilOp = NULL; - qglTexCoord1d = NULL; - qglTexCoord1dv = NULL; - qglTexCoord1f = NULL; - qglTexCoord1fv = NULL; - qglTexCoord1i = NULL; - qglTexCoord1iv = NULL; - qglTexCoord1s = NULL; - qglTexCoord1sv = NULL; - qglTexCoord2d = NULL; - qglTexCoord2dv = NULL; - qglTexCoord2f = NULL; - qglTexCoord2fv = NULL; - qglTexCoord2i = NULL; - qglTexCoord2iv = NULL; - qglTexCoord2s = NULL; - qglTexCoord2sv = NULL; - qglTexCoord3d = NULL; - qglTexCoord3dv = NULL; - qglTexCoord3f = NULL; - qglTexCoord3fv = NULL; - qglTexCoord3i = NULL; - qglTexCoord3iv = NULL; - qglTexCoord3s = NULL; - qglTexCoord3sv = NULL; - qglTexCoord4d = NULL; - qglTexCoord4dv = NULL; - qglTexCoord4f = NULL; - qglTexCoord4fv = NULL; - qglTexCoord4i = NULL; - qglTexCoord4iv = NULL; - qglTexCoord4s = NULL; - qglTexCoord4sv = NULL; - qglTexCoordPointer = NULL; - qglTexEnvf = NULL; - qglTexEnvfv = NULL; - qglTexEnvi = NULL; - qglTexEnviv = NULL; - qglTexGend = NULL; - qglTexGendv = NULL; - qglTexGenf = NULL; - qglTexGenfv = NULL; - qglTexGeni = NULL; - qglTexGeniv = NULL; - qglTexImage1D = NULL; - qglTexImage2D = NULL; - qglTexParameterf = NULL; - qglTexParameterfv = NULL; - qglTexParameteri = NULL; - qglTexParameteriv = NULL; - qglTexSubImage1D = NULL; - qglTexSubImage2D = NULL; - qglTranslated = NULL; - qglTranslatef = NULL; - qglVertex2d = NULL; - qglVertex2dv = NULL; - qglVertex2f = NULL; - qglVertex2fv = NULL; - qglVertex2i = NULL; - qglVertex2iv = NULL; - qglVertex2s = NULL; - qglVertex2sv = NULL; - qglVertex3d = NULL; - qglVertex3dv = NULL; - qglVertex3f = NULL; - qglVertex3fv = NULL; - qglVertex3i = NULL; - qglVertex3iv = NULL; - qglVertex3s = NULL; - qglVertex3sv = NULL; - qglVertex4d = NULL; - qglVertex4dv = NULL; - qglVertex4f = NULL; - qglVertex4fv = NULL; - qglVertex4i = NULL; - qglVertex4iv = NULL; - qglVertex4s = NULL; - qglVertex4sv = NULL; - qglVertexPointer = NULL; - qglViewport = NULL; - - qwglCopyContext = NULL; - qwglCreateContext = NULL; - qwglCreateLayerContext = NULL; - qwglDeleteContext = NULL; - qwglDescribeLayerPlane = NULL; - qwglGetCurrentContext = NULL; - qwglGetCurrentDC = NULL; - qwglGetLayerPaletteEntries = NULL; - qwglGetProcAddress = NULL; - qwglMakeCurrent = NULL; - qwglRealizeLayerPalette = NULL; - qwglSetLayerPaletteEntries = NULL; - qwglShareLists = NULL; - qwglSwapLayerBuffers = NULL; - qwglUseFontBitmaps = NULL; - qwglUseFontOutlines = NULL; -} - -# pragma warning (disable : 4113 4133 4047 ) -# define GPA( a ) GetProcAddress( glw_state.hinstOpenGL, a ) - -/* -** QGL_Init -** -** This is responsible for binding our qgl function pointers to -** the appropriate GL stuff. In Windows this means doing a -** LoadLibrary and a bunch of calls to GetProcAddress. On other -** operating systems we need to do the right thing, whatever that -** might be. -*/ -qboolean QGL_Init( const char *dllname ) -{ - assert( glw_state.hinstOpenGL == 0 ); - - ri.Printf( PRINT_ALL, "...initializing QGL\n" ); - - //ri.Printf( PRINT_ALL, "...calling LoadLibrary( '%s.dll' ): ", dllname ); - - if ( ( glw_state.hinstOpenGL = LoadLibrary( dllname ) ) == 0 ) - { - ri.Printf( PRINT_ALL, "failed\n" ); - return qfalse; - } - ri.Printf( PRINT_ALL, "succeeded\n" ); - - qglAccum = dllAccum = (void (APIENTRY *)(unsigned int,float))GPA( "glAccum" ); - qglAlphaFunc = dllAlphaFunc = (void (APIENTRY *)(unsigned int,float))GPA( "glAlphaFunc" ); - qglAreTexturesResident = dllAreTexturesResident = (unsigned char (APIENTRY *)(int,const unsigned int *,unsigned char *))GPA( "glAreTexturesResident" ); - qglArrayElement = dllArrayElement = (void (APIENTRY *)(int))GPA( "glArrayElement" ); - qglBegin = dllBegin = (void (APIENTRY *)(unsigned int))GPA( "glBegin" ); - qglBindTexture = dllBindTexture = (void (APIENTRY *)(unsigned int,unsigned int))GPA( "glBindTexture" ); - qglBitmap = dllBitmap = (void (APIENTRY *)(int,int,float,float,float,float,const unsigned char *))GPA( "glBitmap" ); - qglBlendFunc = dllBlendFunc = (void (APIENTRY *)(unsigned int,unsigned int))GPA( "glBlendFunc" ); - qglCallList = dllCallList = (void (APIENTRY *)(unsigned int))GPA( "glCallList" ); - qglCallLists = dllCallLists = (void (APIENTRY *)(int,unsigned int,const void *))GPA( "glCallLists" ); - qglClear = dllClear = (void (APIENTRY *)(unsigned int))GPA( "glClear" ); - qglClearAccum = dllClearAccum = (void (APIENTRY *)(float,float,float,float))GPA( "glClearAccum" ); - qglClearColor = dllClearColor = (void (APIENTRY *)(float,float,float,float))GPA( "glClearColor" ); - qglClearDepth = dllClearDepth = (void (APIENTRY *)(double))GPA( "glClearDepth" ); - qglClearIndex = dllClearIndex = (void (APIENTRY *)(float))GPA( "glClearIndex" ); - qglClearStencil = dllClearStencil = (void (APIENTRY *)(int))GPA( "glClearStencil" ); - qglClipPlane = dllClipPlane = (void (APIENTRY *)(unsigned int,const double *))GPA( "glClipPlane" ); - qglColor3b = dllColor3b = (void (APIENTRY *)(signed char,signed char,signed char))GPA( "glColor3b" ); - qglColor3bv = dllColor3bv = (void (APIENTRY *)(const signed char *))GPA( "glColor3bv" ); - qglColor3d = dllColor3d = (void (APIENTRY *)(double,double,double))GPA( "glColor3d" ); - qglColor3dv = dllColor3dv = (void (APIENTRY *)(const double *))GPA( "glColor3dv" ); - qglColor3f = dllColor3f = (void (APIENTRY *)(float,float,float))GPA( "glColor3f" ); - qglColor3fv = dllColor3fv = (void (APIENTRY *)(const float *))GPA( "glColor3fv" ); - qglColor3i = dllColor3i = (void (APIENTRY *)(int,int,int))GPA( "glColor3i" ); - qglColor3iv = dllColor3iv = (void (APIENTRY *)(const int *))GPA( "glColor3iv" ); - qglColor3s = dllColor3s =(void (APIENTRY *)(short,short,short))GPA( "glColor3s" ); - qglColor3sv = dllColor3sv =(void (APIENTRY *)(const short *))GPA( "glColor3sv" ); - qglColor3ub = dllColor3ub =(void (APIENTRY *)(unsigned char,unsigned char,unsigned char))GPA( "glColor3ub" ); - qglColor3ubv = dllColor3ubv =(void (APIENTRY *)(const unsigned char *))GPA( "glColor3ubv" ); - qglColor3ui = dllColor3ui =(void (APIENTRY *)(unsigned int,unsigned int,unsigned int))GPA( "glColor3ui" ); - qglColor3uiv = dllColor3uiv =(void (APIENTRY *)(const unsigned int *))GPA( "glColor3uiv" ); - qglColor3us = dllColor3us =(void (APIENTRY *)(unsigned short,unsigned short,unsigned short))GPA( "glColor3us" ); - qglColor3usv = dllColor3usv =(void (APIENTRY *)(const unsigned short *))GPA( "glColor3usv" ); - qglColor4b = dllColor4b =(void (APIENTRY *)(signed char,signed char,signed char,signed char))GPA( "glColor4b" ); - qglColor4bv = dllColor4bv =(void (APIENTRY *)(const signed char *))GPA( "glColor4bv" ); - qglColor4d = dllColor4d =(void (APIENTRY *)(double,double,double,double))GPA( "glColor4d" ); - qglColor4dv = dllColor4dv =(void (APIENTRY *)(const double *))GPA( "glColor4dv" ); - qglColor4f = dllColor4f =(void (APIENTRY *)(float,float,float,float))GPA( "glColor4f" ); - qglColor4fv = dllColor4fv =(void (APIENTRY *)(const float *))GPA( "glColor4fv" ); - qglColor4i = dllColor4i =(void (APIENTRY *)(int,int,int,int))GPA( "glColor4i" ); - qglColor4iv = dllColor4iv =(void (APIENTRY *)(const int *))GPA( "glColor4iv" ); - qglColor4s = dllColor4s =(void (APIENTRY *)(short,short,short,short))GPA( "glColor4s" ); - qglColor4sv = dllColor4sv =(void (APIENTRY *)(const short *))GPA( "glColor4sv" ); - qglColor4ub = dllColor4ub =(void (APIENTRY *)(unsigned char,unsigned char,unsigned char,unsigned char))GPA( "glColor4ub" ); - qglColor4ubv = dllColor4ubv =(void (APIENTRY *)(const unsigned char *))GPA( "glColor4ubv" ); - qglColor4ui = dllColor4ui =(void (APIENTRY *)(unsigned int,unsigned int,unsigned int,unsigned int))GPA( "glColor4ui" ); - qglColor4uiv = dllColor4uiv =(void (APIENTRY *)(const unsigned int *))GPA( "glColor4uiv" ); - qglColor4us = dllColor4us =(void (APIENTRY *)(unsigned short,unsigned short,unsigned short,unsigned short))GPA( "glColor4us" ); - qglColor4usv = dllColor4usv =(void (APIENTRY *)(const unsigned short *))GPA( "glColor4usv" ); - qglColorMask = dllColorMask =(void (APIENTRY *)(unsigned char,unsigned char,unsigned char,unsigned char))GPA( "glColorMask" ); - qglColorMaterial = dllColorMaterial =(void (APIENTRY *)(unsigned int,unsigned int))GPA( "glColorMaterial" ); - qglColorPointer = dllColorPointer =(void (APIENTRY *)(int,unsigned int,int,const void *))GPA( "glColorPointer" ); - qglCopyPixels = dllCopyPixels =(void (APIENTRY *)(int,int,int,int,unsigned int))GPA( "glCopyPixels" ); - qglCopyTexImage1D = dllCopyTexImage1D =(void (APIENTRY *)(unsigned int,int,unsigned int,int,int,int,int))GPA( "glCopyTexImage1D" ); - qglCopyTexImage2D = dllCopyTexImage2D =(void (APIENTRY *)(unsigned int,int,unsigned int,int,int,int,int,int))GPA( "glCopyTexImage2D" ); - qglCopyTexSubImage1D = dllCopyTexSubImage1D =(void (APIENTRY *)(unsigned int,int,int,int,int,int))GPA( "glCopyTexSubImage1D" ); - qglCopyTexSubImage2D = dllCopyTexSubImage2D =(void (APIENTRY *)(unsigned int,int,int,int,int,int,int,int))GPA( "glCopyTexSubImage2D" ); - qglCullFace = dllCullFace =(void (APIENTRY *)(unsigned int))GPA( "glCullFace" ); - qglDeleteLists = dllDeleteLists =(void (APIENTRY *)(unsigned int,int))GPA( "glDeleteLists" ); - qglDeleteTextures = dllDeleteTextures =(void (APIENTRY *)(int,const unsigned int *))GPA( "glDeleteTextures" ); - qglDepthFunc = dllDepthFunc =(void (APIENTRY *)(unsigned int))GPA( "glDepthFunc" ); - qglDepthMask = dllDepthMask =(void (APIENTRY *)(unsigned char))GPA( "glDepthMask" ); - qglDepthRange = dllDepthRange =(void (APIENTRY *)(double,double))GPA( "glDepthRange" ); - qglDisable = dllDisable =(void (APIENTRY *)(unsigned int))GPA( "glDisable" ); - qglDisableClientState = dllDisableClientState =(void (APIENTRY *)(unsigned int))GPA( "glDisableClientState" ); - qglDrawArrays = dllDrawArrays =(void (APIENTRY *)(unsigned int,int,int))GPA( "glDrawArrays" ); - qglDrawBuffer = dllDrawBuffer =(void (APIENTRY *)(unsigned int))GPA( "glDrawBuffer" ); - qglDrawElements = dllDrawElements =(void (APIENTRY *)(unsigned int,int,unsigned int,const void *))GPA( "glDrawElements" ); - qglDrawPixels = dllDrawPixels =(void (APIENTRY *)(int,int,unsigned int,unsigned int,const void *))GPA( "glDrawPixels" ); - qglEdgeFlag = dllEdgeFlag =(void (APIENTRY *)(unsigned char))GPA( "glEdgeFlag" ); - qglEdgeFlagPointer = dllEdgeFlagPointer =(void (APIENTRY *)(int,const void *))GPA( "glEdgeFlagPointer" ); - qglEdgeFlagv = dllEdgeFlagv =(void (APIENTRY *)(const unsigned char *))GPA( "glEdgeFlagv" ); - qglEnable = dllEnable =(void (APIENTRY *)(unsigned int))GPA( "glEnable" ); - qglEnableClientState = dllEnableClientState =(void (APIENTRY *)(unsigned int))GPA( "glEnableClientState" ); - qglEnd = dllEnd =(void (APIENTRY *)(void))GPA( "glEnd" ); - qglEndList = dllEndList =(void (APIENTRY *)(void))GPA( "glEndList" ); - qglEvalCoord1d = dllEvalCoord1d =(void (APIENTRY *)(double))GPA( "glEvalCoord1d" ); - qglEvalCoord1dv = dllEvalCoord1dv =(void (APIENTRY *)(const double *))GPA( "glEvalCoord1dv" ); - qglEvalCoord1f = dllEvalCoord1f =(void (APIENTRY *)(float))GPA( "glEvalCoord1f" ); - qglEvalCoord1fv = dllEvalCoord1fv =(void (APIENTRY *)(const float *))GPA( "glEvalCoord1fv" ); - qglEvalCoord2d = dllEvalCoord2d =(void (APIENTRY *)(double,double))GPA( "glEvalCoord2d" ); - qglEvalCoord2dv = dllEvalCoord2dv =(void (APIENTRY *)(const double *))GPA( "glEvalCoord2dv" ); - qglEvalCoord2f = dllEvalCoord2f =(void (APIENTRY *)(float,float))GPA( "glEvalCoord2f" ); - qglEvalCoord2fv = dllEvalCoord2fv =(void (APIENTRY *)(const float *))GPA( "glEvalCoord2fv" ); - qglEvalMesh1 = dllEvalMesh1 =(void (APIENTRY *)(unsigned int,int,int))GPA( "glEvalMesh1" ); - qglEvalMesh2 = dllEvalMesh2 =(void (APIENTRY *)(unsigned int,int,int,int,int))GPA( "glEvalMesh2" ); - qglEvalPoint1 = dllEvalPoint1 =(void (APIENTRY *)(int))GPA( "glEvalPoint1" ); - qglEvalPoint2 = dllEvalPoint2 =(void (APIENTRY *)(int,int))GPA( "glEvalPoint2" ); - qglFeedbackBuffer = dllFeedbackBuffer =(void (APIENTRY *)(int,unsigned int,float *))GPA( "glFeedbackBuffer" ); - qglFinish = dllFinish =(void (APIENTRY *)(void))GPA( "glFinish" ); - qglFlush = dllFlush =(void (APIENTRY *)(void))GPA( "glFlush" ); - qglFogf = dllFogf =(void (APIENTRY *)(unsigned int,float))GPA( "glFogf" ); - qglFogfv = dllFogfv =(void (APIENTRY *)(unsigned int,const float *))GPA( "glFogfv" ); - qglFogi = dllFogi =(void (APIENTRY *)(unsigned int,int))GPA( "glFogi" ); - qglFogiv = dllFogiv =(void (APIENTRY *)(unsigned int,const int *))GPA( "glFogiv" ); - qglFrontFace = dllFrontFace =(void (APIENTRY *)(unsigned int))GPA( "glFrontFace" ); - qglFrustum = dllFrustum =(void (APIENTRY *)(double,double,double,double,double,double))GPA( "glFrustum" ); - qglGenLists = dllGenLists =(unsigned int (APIENTRY *)(int))GPA( "glGenLists" ); - qglGenTextures = dllGenTextures =(void (APIENTRY *)(int,unsigned int *))GPA( "glGenTextures" ); - qglGetBooleanv = dllGetBooleanv =(void (APIENTRY *)(unsigned int,unsigned char *))GPA( "glGetBooleanv" ); - qglGetClipPlane = dllGetClipPlane =(void (APIENTRY *)(unsigned int,double *))GPA( "glGetClipPlane" ); - qglGetDoublev = dllGetDoublev =(void (APIENTRY *)(unsigned int,double *))GPA( "glGetDoublev" ); - qglGetError = dllGetError =(unsigned int (APIENTRY *)(void))GPA( "glGetError" ); - qglGetFloatv = dllGetFloatv =(void (APIENTRY *)(unsigned int,float *))GPA( "glGetFloatv" ); - qglGetIntegerv = dllGetIntegerv =(void (APIENTRY *)(unsigned int,int *))GPA( "glGetIntegerv" ); - qglGetLightfv = dllGetLightfv =(void (APIENTRY *)(unsigned int,unsigned int,float *))GPA( "glGetLightfv" ); - qglGetLightiv = dllGetLightiv =(void (APIENTRY *)(unsigned int,unsigned int,int *))GPA( "glGetLightiv" ); - qglGetMapdv = dllGetMapdv =(void (APIENTRY *)(unsigned int,unsigned int,double *))GPA( "glGetMapdv" ); - qglGetMapfv = dllGetMapfv =(void (APIENTRY *)(unsigned int,unsigned int,float *))GPA( "glGetMapfv" ); - qglGetMapiv = dllGetMapiv =(void (APIENTRY *)(unsigned int,unsigned int,int *))GPA( "glGetMapiv" ); - qglGetMaterialfv = dllGetMaterialfv =(void (APIENTRY *)(unsigned int,unsigned int,float *))GPA( "glGetMaterialfv" ); - qglGetMaterialiv = dllGetMaterialiv =(void (APIENTRY *)(unsigned int,unsigned int,int *))GPA( "glGetMaterialiv" ); - qglGetPixelMapfv = dllGetPixelMapfv =(void (APIENTRY *)(unsigned int,float *))GPA( "glGetPixelMapfv" ); - qglGetPixelMapuiv = dllGetPixelMapuiv =(void (APIENTRY *)(unsigned int,unsigned int *))GPA( "glGetPixelMapuiv" ); - qglGetPixelMapusv = dllGetPixelMapusv =(void (APIENTRY *)(unsigned int,unsigned short *))GPA( "glGetPixelMapusv" ); - qglGetPointerv = dllGetPointerv =(void (APIENTRY *)(unsigned int,void ** ))GPA( "glGetPointerv" ); - qglGetPolygonStipple = dllGetPolygonStipple =(void (APIENTRY *)(unsigned char *))GPA( "glGetPolygonStipple" ); - qglGetString = dllGetString =(const unsigned char *(APIENTRY *)(unsigned int))GPA( "glGetString" ); - qglGetTexEnvfv = dllGetTexEnvfv =(void (APIENTRY *)(unsigned int,unsigned int,float *))GPA( "glGetTexEnvfv" ); - qglGetTexEnviv = dllGetTexEnviv =(void (APIENTRY *)(unsigned int,unsigned int,int *))GPA( "glGetTexEnviv" ); - qglGetTexGendv = dllGetTexGendv =(void (APIENTRY *)(unsigned int,unsigned int,double *))GPA( "glGetTexGendv" ); - qglGetTexGenfv = dllGetTexGenfv =(void (APIENTRY *)(unsigned int,unsigned int,float *))GPA( "glGetTexGenfv" ); - qglGetTexGeniv = dllGetTexGeniv =(void (APIENTRY *)(unsigned int,unsigned int,int *))GPA( "glGetTexGeniv" ); - qglGetTexImage = dllGetTexImage =(void (APIENTRY *)(unsigned int,int,unsigned int,unsigned int,void *))GPA( "glGetTexImage" ); -// qglGetTexLevelParameterfv = dllGetTexLevelParameterfv =(void (APIENTRY *)(unsigned int,int,unsigned int,float *))GPA( "glGetTexLevelParameterfv" ); -// qglGetTexLevelParameteriv = dllGetTexLevelParameteriv =(void (APIENTRY *)(unsigned int,int,unsigned int,int *))GPA( "glGetTexLevelParameteriv" ); - qglGetTexParameterfv = dllGetTexParameterfv =(void (APIENTRY *)(unsigned int,unsigned int,float *))GPA( "glGetTexParameterfv" ); - qglGetTexParameteriv = dllGetTexParameteriv =(void (APIENTRY *)(unsigned int,unsigned int,int *))GPA( "glGetTexParameteriv" ); - qglHint = dllHint =(void (APIENTRY *)(unsigned int,unsigned int))GPA( "glHint" ); - qglIndexMask = dllIndexMask =(void (APIENTRY *)(unsigned int))GPA( "glIndexMask" ); - qglIndexPointer = dllIndexPointer =(void (APIENTRY *)(unsigned int,int,const void *))GPA( "glIndexPointer" ); - qglIndexd = dllIndexd =(void (APIENTRY *)(double))GPA( "glIndexd" ); - qglIndexdv = dllIndexdv =(void (APIENTRY *)(const double *))GPA( "glIndexdv" ); - qglIndexf = dllIndexf =(void (APIENTRY *)(float))GPA( "glIndexf" ); - qglIndexfv = dllIndexfv =(void (APIENTRY *)(const float *))GPA( "glIndexfv" ); - qglIndexi = dllIndexi =(void (APIENTRY *)(int))GPA( "glIndexi" ); - qglIndexiv = dllIndexiv =(void (APIENTRY *)(const int *))GPA( "glIndexiv" ); - qglIndexs = dllIndexs =(void (APIENTRY *)(short))GPA( "glIndexs" ); - qglIndexsv = dllIndexsv =(void (APIENTRY *)(const short *))GPA( "glIndexsv" ); - qglIndexub = dllIndexub =(void (APIENTRY *)(unsigned char))GPA( "glIndexub" ); - qglIndexubv = dllIndexubv =(void (APIENTRY *)(const unsigned char *))GPA( "glIndexubv" ); - qglInitNames = dllInitNames =(void (APIENTRY *)(void))GPA( "glInitNames" ); - qglInterleavedArrays = dllInterleavedArrays =(void (APIENTRY *)(unsigned int,int,const void *))GPA( "glInterleavedArrays" ); - qglIsEnabled = dllIsEnabled =(unsigned char (APIENTRY *)(unsigned int))GPA( "glIsEnabled" ); - qglIsList = dllIsList =(unsigned char (APIENTRY *)(unsigned int))GPA( "glIsList" ); - qglIsTexture = dllIsTexture =(unsigned char (APIENTRY *)(unsigned int))GPA( "glIsTexture" ); - qglLightModelf = dllLightModelf =(void (APIENTRY *)(unsigned int,float))GPA( "glLightModelf" ); - qglLightModelfv = dllLightModelfv =(void (APIENTRY *)(unsigned int,const float *))GPA( "glLightModelfv" ); - qglLightModeli = dllLightModeli =(void (APIENTRY *)(unsigned int,int))GPA( "glLightModeli" ); - qglLightModeliv = dllLightModeliv =(void (APIENTRY *)(unsigned int,const int *))GPA( "glLightModeliv" ); - qglLightf = dllLightf =(void (APIENTRY *)(unsigned int,unsigned int,float))GPA( "glLightf" ); - qglLightfv = dllLightfv =(void (APIENTRY *)(unsigned int,unsigned int,const float *))GPA( "glLightfv" ); - qglLighti = dllLighti =(void (APIENTRY *)(unsigned int,unsigned int,int))GPA( "glLighti" ); - qglLightiv = dllLightiv =(void (APIENTRY *)(unsigned int,unsigned int,const int *))GPA( "glLightiv" ); - qglLineStipple = dllLineStipple =(void (APIENTRY *)(int,unsigned short))GPA( "glLineStipple" ); - qglLineWidth = dllLineWidth =(void (APIENTRY *)(float))GPA( "glLineWidth" ); - qglListBase = dllListBase =(void (APIENTRY *)(unsigned int))GPA( "glListBase" ); - qglLoadIdentity = dllLoadIdentity =(void (APIENTRY *)(void))GPA( "glLoadIdentity" ); - qglLoadMatrixd = dllLoadMatrixd =(void (APIENTRY *)(const double *))GPA( "glLoadMatrixd" ); - qglLoadMatrixf = dllLoadMatrixf =(void (APIENTRY *)(const float *))GPA( "glLoadMatrixf" ); - qglLoadName = dllLoadName =(void (APIENTRY *)(unsigned int))GPA( "glLoadName" ); - qglLogicOp = dllLogicOp =(void (APIENTRY *)(unsigned int))GPA( "glLogicOp" ); - qglMap1d = dllMap1d =(void (APIENTRY *)(unsigned int,double,double,int,int,const double *))GPA( "glMap1d" ); - qglMap1f = dllMap1f =(void (APIENTRY *)(unsigned int,float,float,int,int,const float *))GPA( "glMap1f" ); - qglMap2d = dllMap2d =(void (APIENTRY *)(unsigned int,double,double,int,int,double,double,int,int,const double *))GPA( "glMap2d" ); - qglMap2f = dllMap2f =(void (APIENTRY *)(unsigned int,float,float,int,int,float,float,int,int,const float *))GPA( "glMap2f" ); - qglMapGrid1d = dllMapGrid1d =(void (APIENTRY *)(int,double,double))GPA( "glMapGrid1d" ); - qglMapGrid1f = dllMapGrid1f =(void (APIENTRY *)(int,float,float))GPA( "glMapGrid1f" ); - qglMapGrid2d = dllMapGrid2d =(void (APIENTRY *)(int,double,double,int,double,double))GPA( "glMapGrid2d" ); - qglMapGrid2f = dllMapGrid2f =(void (APIENTRY *)(int,float,float,int,float,float))GPA( "glMapGrid2f" ); - qglMaterialf = dllMaterialf =(void (APIENTRY *)(unsigned int,unsigned int,float))GPA( "glMaterialf" ); - qglMaterialfv = dllMaterialfv =(void (APIENTRY *)(unsigned int,unsigned int,const float *))GPA( "glMaterialfv" ); - qglMateriali = dllMateriali =(void (APIENTRY *)(unsigned int,unsigned int,int))GPA( "glMateriali" ); - qglMaterialiv = dllMaterialiv =(void (APIENTRY *)(unsigned int,unsigned int,const int *))GPA( "glMaterialiv" ); - qglMatrixMode = dllMatrixMode =(void (APIENTRY *)(unsigned int))GPA( "glMatrixMode" ); - qglMultMatrixd = dllMultMatrixd =(void (APIENTRY *)(const double *))GPA( "glMultMatrixd" ); - qglMultMatrixf = dllMultMatrixf =(void (APIENTRY *)(const float *))GPA( "glMultMatrixf" ); - qglNewList = dllNewList =(void (APIENTRY *)(unsigned int,unsigned int))GPA( "glNewList" ); - qglNormal3b = dllNormal3b =(void (APIENTRY *)(signed char,signed char,signed char))GPA( "glNormal3b" ); - qglNormal3bv = dllNormal3bv =(void (APIENTRY *)(const signed char *))GPA( "glNormal3bv" ); - qglNormal3d = dllNormal3d =(void (APIENTRY *)(double,double,double))GPA( "glNormal3d" ); - qglNormal3dv = dllNormal3dv =(void (APIENTRY *)(const double *))GPA( "glNormal3dv" ); - qglNormal3f = dllNormal3f =(void (APIENTRY *)(float,float,float))GPA( "glNormal3f" ); - qglNormal3fv = dllNormal3fv =(void (APIENTRY *)(const float *))GPA( "glNormal3fv" ); - qglNormal3i = dllNormal3i =(void (APIENTRY *)(int,int,int))GPA( "glNormal3i" ); - qglNormal3iv = dllNormal3iv =(void (APIENTRY *)(const int *))GPA( "glNormal3iv" ); - qglNormal3s = dllNormal3s =(void (APIENTRY *)(short,short,short))GPA( "glNormal3s" ); - qglNormal3sv = dllNormal3sv =(void (APIENTRY *)(const short *))GPA( "glNormal3sv" ); - qglNormalPointer = dllNormalPointer =(void (APIENTRY *)(unsigned int,int,const void *))GPA( "glNormalPointer" ); - qglOrtho = dllOrtho =(void (APIENTRY *)(double,double,double,double,double,double))GPA( "glOrtho" ); - qglPassThrough = dllPassThrough =(void (APIENTRY *)(float))GPA( "glPassThrough" ); - qglPixelMapfv = dllPixelMapfv =(void (APIENTRY *)(unsigned int,int,const float *))GPA( "glPixelMapfv" ); - qglPixelMapuiv = dllPixelMapuiv =(void (APIENTRY *)(unsigned int,int,const unsigned int *))GPA( "glPixelMapuiv" ); - qglPixelMapusv = dllPixelMapusv =(void (APIENTRY *)(unsigned int,int,const unsigned short *))GPA( "glPixelMapusv" ); - qglPixelStoref = dllPixelStoref =(void (APIENTRY *)(unsigned int,float))GPA( "glPixelStoref" ); - qglPixelStorei = dllPixelStorei =(void (APIENTRY *)(unsigned int,int))GPA( "glPixelStorei" ); - qglPixelTransferf = dllPixelTransferf =(void (APIENTRY *)(unsigned int,float))GPA( "glPixelTransferf" ); - qglPixelTransferi = dllPixelTransferi =(void (APIENTRY *)(unsigned int,int))GPA( "glPixelTransferi" ); - qglPixelZoom = dllPixelZoom =(void (APIENTRY *)(float,float))GPA( "glPixelZoom" ); - qglPointSize = dllPointSize =(void (APIENTRY *)(float))GPA( "glPointSize" ); - qglPolygonMode = dllPolygonMode =(void (APIENTRY *)(unsigned int,unsigned int))GPA( "glPolygonMode" ); - qglPolygonOffset = dllPolygonOffset =(void (APIENTRY *)(float,float))GPA( "glPolygonOffset" ); - qglPolygonStipple = dllPolygonStipple =(void (APIENTRY *)(const unsigned char *))GPA( "glPolygonStipple" ); - qglPopAttrib = dllPopAttrib =(void (APIENTRY *)(void))GPA( "glPopAttrib" ); - qglPopClientAttrib = dllPopClientAttrib =(void (APIENTRY *)(void))GPA( "glPopClientAttrib" ); - qglPopMatrix = dllPopMatrix =(void (APIENTRY *)(void))GPA( "glPopMatrix" ); - qglPopName = dllPopName =(void (APIENTRY *)(void))GPA( "glPopName" ); - qglPrioritizeTextures = dllPrioritizeTextures =(void (APIENTRY *)(int,const unsigned int *,const float *))GPA( "glPrioritizeTextures" ); - qglPushAttrib = dllPushAttrib =(void (APIENTRY *)(unsigned int))GPA( "glPushAttrib" ); - qglPushClientAttrib = dllPushClientAttrib =(void (APIENTRY *)(unsigned int))GPA( "glPushClientAttrib" ); - qglPushMatrix = dllPushMatrix =(void (APIENTRY *)(void))GPA( "glPushMatrix" ); - qglPushName = dllPushName =(void (APIENTRY *)(unsigned int))GPA( "glPushName" ); - qglRasterPos2d = dllRasterPos2d =(void (APIENTRY *)(double,double))GPA( "glRasterPos2d" ); - qglRasterPos2dv = dllRasterPos2dv =(void (APIENTRY *)(const double *))GPA( "glRasterPos2dv" ); - qglRasterPos2f = dllRasterPos2f =(void (APIENTRY *)(float,float))GPA( "glRasterPos2f" ); - qglRasterPos2fv = dllRasterPos2fv =(void (APIENTRY *)(const float *))GPA( "glRasterPos2fv" ); - qglRasterPos2i = dllRasterPos2i =(void (APIENTRY *)(int,int))GPA( "glRasterPos2i" ); - qglRasterPos2iv = dllRasterPos2iv =(void (APIENTRY *)(const int *))GPA( "glRasterPos2iv" ); - qglRasterPos2s = dllRasterPos2s =(void (APIENTRY *)(short,short))GPA( "glRasterPos2s" ); - qglRasterPos2sv = dllRasterPos2sv =(void (APIENTRY *)(const short *))GPA( "glRasterPos2sv" ); - qglRasterPos3d = dllRasterPos3d =(void (APIENTRY *)(double,double,double))GPA( "glRasterPos3d" ); - qglRasterPos3dv = dllRasterPos3dv =(void (APIENTRY *)(const double *))GPA( "glRasterPos3dv" ); - qglRasterPos3f = dllRasterPos3f =(void (APIENTRY *)(float,float,float))GPA( "glRasterPos3f" ); - qglRasterPos3fv = dllRasterPos3fv =(void (APIENTRY *)(const float *))GPA( "glRasterPos3fv" ); - qglRasterPos3i = dllRasterPos3i =(void (APIENTRY *)(int,int,int))GPA( "glRasterPos3i" ); - qglRasterPos3iv = dllRasterPos3iv =(void (APIENTRY *)(const int *))GPA( "glRasterPos3iv" ); - qglRasterPos3s = dllRasterPos3s =(void (APIENTRY *)(short,short,short))GPA( "glRasterPos3s" ); - qglRasterPos3sv = dllRasterPos3sv =(void (APIENTRY *)(const short *))GPA( "glRasterPos3sv" ); - qglRasterPos4d = dllRasterPos4d =(void (APIENTRY *)(double,double,double,double))GPA( "glRasterPos4d" ); - qglRasterPos4dv = dllRasterPos4dv =(void (APIENTRY *)(const double *))GPA( "glRasterPos4dv" ); - qglRasterPos4f = dllRasterPos4f =(void (APIENTRY *)(float,float,float,float))GPA( "glRasterPos4f" ); - qglRasterPos4fv = dllRasterPos4fv =(void (APIENTRY *)(const float *))GPA( "glRasterPos4fv" ); - qglRasterPos4i = dllRasterPos4i =(void (APIENTRY *)(int,int,int,int))GPA( "glRasterPos4i" ); - qglRasterPos4iv = dllRasterPos4iv =(void (APIENTRY *)(const int *))GPA( "glRasterPos4iv" ); - qglRasterPos4s = dllRasterPos4s =(void (APIENTRY *)(short,short,short,short))GPA( "glRasterPos4s" ); - qglRasterPos4sv = dllRasterPos4sv =(void (APIENTRY *)(const short *))GPA( "glRasterPos4sv" ); - qglReadBuffer = dllReadBuffer =(void (APIENTRY *)(unsigned int))GPA( "glReadBuffer" ); - qglReadPixels = dllReadPixels =(void (APIENTRY *)(int,int,int,int,unsigned int,unsigned int,void *))GPA( "glReadPixels" ); - qglRectd = dllRectd =(void (APIENTRY *)(double,double,double,double))GPA( "glRectd" ); - qglRectdv = dllRectdv =(void (APIENTRY *)(const double *,const double *))GPA( "glRectdv" ); - qglRectf = dllRectf =(void (APIENTRY *)(float,float,float,float))GPA( "glRectf" ); - qglRectfv = dllRectfv =(void (APIENTRY *)(const float *,const float *))GPA( "glRectfv" ); - qglRecti = dllRecti =(void (APIENTRY *)(int,int,int,int))GPA( "glRecti" ); - qglRectiv = dllRectiv =(void (APIENTRY *)(const int *,const int *))GPA( "glRectiv" ); - qglRects = dllRects =(void (APIENTRY *)(short,short,short,short))GPA( "glRects" ); - qglRectsv = dllRectsv =(void (APIENTRY *)(const short *,const short *))GPA( "glRectsv" ); - qglRenderMode = dllRenderMode =(int (APIENTRY *)(unsigned int))GPA( "glRenderMode" ); - qglRotated = dllRotated =(void (APIENTRY *)(double,double,double,double))GPA( "glRotated" ); - qglRotatef = dllRotatef =(void (APIENTRY *)(float,float,float,float))GPA( "glRotatef" ); - qglScaled = dllScaled =(void (APIENTRY *)(double,double,double))GPA( "glScaled" ); - qglScalef = dllScalef =(void (APIENTRY *)(float,float,float))GPA( "glScalef" ); - qglScissor = dllScissor =(void (APIENTRY *)(int,int,int,int))GPA( "glScissor" ); - qglSelectBuffer = dllSelectBuffer =(void (APIENTRY *)(int,unsigned int *))GPA( "glSelectBuffer" ); - qglShadeModel = dllShadeModel =(void (APIENTRY *)(unsigned int))GPA( "glShadeModel" ); - qglStencilFunc = dllStencilFunc =(void (APIENTRY *)(unsigned int,int,unsigned int))GPA( "glStencilFunc" ); - qglStencilMask = dllStencilMask =(void (APIENTRY *)(unsigned int))GPA( "glStencilMask" ); - qglStencilOp = dllStencilOp =(void (APIENTRY *)(unsigned int,unsigned int,unsigned int))GPA( "glStencilOp" ); - qglTexCoord1d = dllTexCoord1d =(void (APIENTRY *)(double))GPA( "glTexCoord1d" ); - qglTexCoord1dv = dllTexCoord1dv =(void (APIENTRY *)(const double *))GPA( "glTexCoord1dv" ); - qglTexCoord1f = dllTexCoord1f =(void (APIENTRY *)(float))GPA( "glTexCoord1f" ); - qglTexCoord1fv = dllTexCoord1fv =(void (APIENTRY *)(const float *))GPA( "glTexCoord1fv" ); - qglTexCoord1i = dllTexCoord1i =(void (APIENTRY *)(int))GPA( "glTexCoord1i" ); - qglTexCoord1iv = dllTexCoord1iv =(void (APIENTRY *)(const int *))GPA( "glTexCoord1iv" ); - qglTexCoord1s = dllTexCoord1s =(void (APIENTRY *)(short))GPA( "glTexCoord1s" ); - qglTexCoord1sv = dllTexCoord1sv =(void (APIENTRY *)(const short *))GPA( "glTexCoord1sv" ); - qglTexCoord2d = dllTexCoord2d =(void (APIENTRY *)(double,double))GPA( "glTexCoord2d" ); - qglTexCoord2dv = dllTexCoord2dv =(void (APIENTRY *)(const double *))GPA( "glTexCoord2dv" ); - qglTexCoord2f = dllTexCoord2f =(void (APIENTRY *)(float,float))GPA( "glTexCoord2f" ); - qglTexCoord2fv = dllTexCoord2fv =(void (APIENTRY *)(const float *))GPA( "glTexCoord2fv" ); - qglTexCoord2i = dllTexCoord2i =(void (APIENTRY *)(int,int))GPA( "glTexCoord2i" ); - qglTexCoord2iv = dllTexCoord2iv =(void (APIENTRY *)(const int *))GPA( "glTexCoord2iv" ); - qglTexCoord2s = dllTexCoord2s =(void (APIENTRY *)(short,short))GPA( "glTexCoord2s" ); - qglTexCoord2sv = dllTexCoord2sv =(void (APIENTRY *)(const short *))GPA( "glTexCoord2sv" ); - qglTexCoord3d = dllTexCoord3d =(void (APIENTRY *)(double,double,double))GPA( "glTexCoord3d" ); - qglTexCoord3dv = dllTexCoord3dv =(void (APIENTRY *)(const double *))GPA( "glTexCoord3dv" ); - qglTexCoord3f = dllTexCoord3f =(void (APIENTRY *)(float,float,float))GPA( "glTexCoord3f" ); - qglTexCoord3fv = dllTexCoord3fv =(void (APIENTRY *)(const float *))GPA( "glTexCoord3fv" ); - qglTexCoord3i = dllTexCoord3i =(void (APIENTRY *)(int,int,int))GPA( "glTexCoord3i" ); - qglTexCoord3iv = dllTexCoord3iv =(void (APIENTRY *)(const int *))GPA( "glTexCoord3iv" ); - qglTexCoord3s = dllTexCoord3s =(void (APIENTRY *)(short,short,short))GPA( "glTexCoord3s" ); - qglTexCoord3sv = dllTexCoord3sv =(void (APIENTRY *)(const short *))GPA( "glTexCoord3sv" ); - qglTexCoord4d = dllTexCoord4d =(void (APIENTRY *)(double,double,double,double))GPA( "glTexCoord4d" ); - qglTexCoord4dv = dllTexCoord4dv =(void (APIENTRY *)(const double *))GPA( "glTexCoord4dv" ); - qglTexCoord4f = dllTexCoord4f =(void (APIENTRY *)(float,float,float,float))GPA( "glTexCoord4f" ); - qglTexCoord4fv = dllTexCoord4fv =(void (APIENTRY *)(const float *))GPA( "glTexCoord4fv" ); - qglTexCoord4i = dllTexCoord4i =(void (APIENTRY *)(int,int,int,int))GPA( "glTexCoord4i" ); - qglTexCoord4iv = dllTexCoord4iv =(void (APIENTRY *)(const int *))GPA( "glTexCoord4iv" ); - qglTexCoord4s = dllTexCoord4s =(void (APIENTRY *)(short,short,short,short))GPA( "glTexCoord4s" ); - qglTexCoord4sv = dllTexCoord4sv =(void (APIENTRY *)(const short *))GPA( "glTexCoord4sv" ); - qglTexCoordPointer = dllTexCoordPointer =(void (APIENTRY *)(int,unsigned int,int,const void *))GPA( "glTexCoordPointer" ); - qglTexEnvf = dllTexEnvf =(void (APIENTRY *)(unsigned int,unsigned int,float))GPA( "glTexEnvf" ); - qglTexEnvfv = dllTexEnvfv =(void (APIENTRY *)(unsigned int,unsigned int,const float *))GPA( "glTexEnvfv" ); - qglTexEnvi = dllTexEnvi =(void (APIENTRY *)(unsigned int,unsigned int,int))GPA( "glTexEnvi" ); - qglTexEnviv = dllTexEnviv =(void (APIENTRY *)(unsigned int,unsigned int,const int *))GPA( "glTexEnviv" ); - qglTexGend = dllTexGend =(void (APIENTRY *)(unsigned int,unsigned int,double))GPA( "glTexGend" ); - qglTexGendv = dllTexGendv =(void (APIENTRY *)(unsigned int,unsigned int,const double *))GPA( "glTexGendv" ); - qglTexGenf = dllTexGenf =(void (APIENTRY *)(unsigned int,unsigned int,float))GPA( "glTexGenf" ); - qglTexGenfv = dllTexGenfv =(void (APIENTRY *)(unsigned int,unsigned int,const float *))GPA( "glTexGenfv" ); - qglTexGeni = dllTexGeni =(void (APIENTRY *)(unsigned int,unsigned int,int))GPA( "glTexGeni" ); - qglTexGeniv = dllTexGeniv =(void (APIENTRY *)(unsigned int,unsigned int,const int *))GPA( "glTexGeniv" ); - qglTexImage1D = dllTexImage1D =(void (APIENTRY *)(unsigned int,int,int,int,int,unsigned int,unsigned int,const void *))GPA( "glTexImage1D" ); - qglTexImage2D = dllTexImage2D =(void (APIENTRY *)(unsigned int,int,int,int,int,int,unsigned int,unsigned int,const void *))GPA( "glTexImage2D" ); - qglTexParameterf = dllTexParameterf =(void (APIENTRY *)(unsigned int,unsigned int,float))GPA( "glTexParameterf" ); - qglTexParameterfv = dllTexParameterfv =(void (APIENTRY *)(unsigned int,unsigned int,const float *))GPA( "glTexParameterfv" ); - qglTexParameteri = dllTexParameteri =(void (APIENTRY *)(unsigned int,unsigned int,int))GPA( "glTexParameteri" ); - qglTexParameteriv = dllTexParameteriv =(void (APIENTRY *)(unsigned int,unsigned int,const int *))GPA( "glTexParameteriv" ); - qglTexSubImage1D = dllTexSubImage1D =(void (APIENTRY *)(unsigned int,int,int,int,unsigned int,unsigned int,const void *))GPA( "glTexSubImage1D" ); - qglTexSubImage2D = dllTexSubImage2D =(void (APIENTRY *)(unsigned int,int,int,int,int,int,unsigned int,unsigned int,const void *))GPA( "glTexSubImage2D" ); - qglTranslated = dllTranslated =(void (APIENTRY *)(double,double,double))GPA( "glTranslated" ); - qglTranslatef = dllTranslatef =(void (APIENTRY *)(float,float,float))GPA( "glTranslatef" ); - qglVertex2d = dllVertex2d =(void (APIENTRY *)(double,double))GPA( "glVertex2d" ); - qglVertex2dv = dllVertex2dv =(void (APIENTRY *)(const double *))GPA( "glVertex2dv" ); - qglVertex2f = dllVertex2f =(void (APIENTRY *)(float,float))GPA( "glVertex2f" ); - qglVertex2fv = dllVertex2fv =(void (APIENTRY *)(const float *))GPA( "glVertex2fv" ); - qglVertex2i = dllVertex2i =(void (APIENTRY *)(int,int))GPA( "glVertex2i" ); - qglVertex2iv = dllVertex2iv =(void (APIENTRY *)(const int *))GPA( "glVertex2iv" ); - qglVertex2s = dllVertex2s =(void (APIENTRY *)(short,short))GPA( "glVertex2s" ); - qglVertex2sv = dllVertex2sv =(void (APIENTRY *)(const short *))GPA( "glVertex2sv" ); - qglVertex3d = dllVertex3d =(void (APIENTRY *)(double,double,double))GPA( "glVertex3d" ); - qglVertex3dv = dllVertex3dv =(void (APIENTRY *)(const double *))GPA( "glVertex3dv" ); - qglVertex3f = dllVertex3f =(void (APIENTRY *)(float,float,float))GPA( "glVertex3f" ); - qglVertex3fv = dllVertex3fv =(void (APIENTRY *)(const float *))GPA( "glVertex3fv" ); - qglVertex3i = dllVertex3i =(void (APIENTRY *)(int,int,int))GPA( "glVertex3i" ); - qglVertex3iv = dllVertex3iv =(void (APIENTRY *)(const int *))GPA( "glVertex3iv" ); - qglVertex3s = dllVertex3s =(void (APIENTRY *)(short,short,short))GPA( "glVertex3s" ); - qglVertex3sv = dllVertex3sv =(void (APIENTRY *)(const short *))GPA( "glVertex3sv" ); - qglVertex4d = dllVertex4d =(void (APIENTRY *)(double,double,double,double))GPA( "glVertex4d" ); - qglVertex4dv = dllVertex4dv =(void (APIENTRY *)(const double *))GPA( "glVertex4dv" ); - qglVertex4f = dllVertex4f =(void (APIENTRY *)(float,float,float,float))GPA( "glVertex4f" ); - qglVertex4fv = dllVertex4fv =(void (APIENTRY *)(const float *))GPA( "glVertex4fv" ); - qglVertex4i = dllVertex4i =(void (APIENTRY *)(int,int,int,int))GPA( "glVertex4i" ); - qglVertex4iv = dllVertex4iv =(void (APIENTRY *)(const int *))GPA( "glVertex4iv" ); - qglVertex4s = dllVertex4s =(void (APIENTRY *)(short,short,short,short))GPA( "glVertex4s" ); - qglVertex4sv = dllVertex4sv =(void (APIENTRY *)(const short *))GPA( "glVertex4sv" ); - qglVertexPointer = dllVertexPointer =(void (APIENTRY *)(int,unsigned int,int,const void *))GPA( "glVertexPointer" ); - qglViewport = dllViewport =(void (APIENTRY *)(int,int,int,int))GPA( "glViewport" ); - - qwglCopyContext = (BOOL (WINAPI *)(HGLRC, HGLRC, UINT))GPA( "wglCopyContext" ); - qwglCreateContext = (HGLRC (WINAPI *)(HDC))GPA( "wglCreateContext" ); - qwglCreateLayerContext = (HGLRC (WINAPI *)(HDC, int))GPA( "wglCreateLayerContext" ); - qwglDeleteContext = (BOOL (WINAPI *)(HGLRC))GPA( "wglDeleteContext" ); - qwglDescribeLayerPlane = (BOOL (WINAPI *)(HDC, int, int, UINT, LPLAYERPLANEDESCRIPTOR))GPA( "wglDescribeLayerPlane" ); - qwglGetCurrentContext = (HGLRC (WINAPI *)(VOID))GPA( "wglGetCurrentContext" ); - qwglGetCurrentDC = (HDC (WINAPI *)(VOID))GPA( "wglGetCurrentDC" ); - qwglGetLayerPaletteEntries = (int (WINAPI *)(HDC, int, int, int, COLORREF *))GPA( "wglGetLayerPaletteEntries" ); - qwglGetProcAddress = (PROC (WINAPI *)(LPCSTR))GPA( "wglGetProcAddress" ); - qwglMakeCurrent = (BOOL (WINAPI *)(HDC, HGLRC))GPA( "wglMakeCurrent" ); - qwglRealizeLayerPalette = (BOOL (WINAPI *)(HDC, int, BOOL))GPA( "wglRealizeLayerPalette" ); - qwglSetLayerPaletteEntries = (int (WINAPI *)(HDC, int, int, int, const COLORREF *))GPA( "wglSetLayerPaletteEntries" ); - qwglShareLists = (BOOL (WINAPI *)(HGLRC, HGLRC))GPA( "wglShareLists" ); - qwglSwapLayerBuffers = (BOOL (WINAPI *)(HDC, UINT))GPA( "wglSwapLayerBuffers" ); - qwglUseFontBitmaps = (BOOL (WINAPI *)(HDC, DWORD, DWORD, DWORD))GPA( "wglUseFontBitmapsA" ); - qwglUseFontOutlines = (BOOL (WINAPI *)(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int, LPGLYPHMETRICSFLOAT))GPA( "wglUseFontOutlinesA" ); - - qwglSwapIntervalEXT = 0; - qglActiveTextureARB = 0; - qglClientActiveTextureARB = 0; - qglMultiTexCoord2fARB = 0; - qglLockArraysEXT = 0; - qglUnlockArraysEXT = 0; - - // check logging - QGL_EnableLogging( r_logFile->integer ); - - return qtrue; -} - -void QGL_EnableLogging( qboolean enable ) -{ - static qboolean isEnabled; - - // return if we're already active - if ( isEnabled && enable ) { - // decrement log counter and stop if it has reached 0 - ri.Cvar_Set( "r_logFile", va("%d", r_logFile->integer - 1 ) ); - if ( r_logFile->integer ) { - return; - } - enable = qfalse; - } - - // return if we're already disabled - if ( !enable && !isEnabled ) - return; - - isEnabled = enable; - - if ( enable ) - { - if ( !glw_state.log_fp ) - { - struct tm *newtime; - time_t aclock; - char buffer[1024]; - cvar_t *basedir; - - time( &aclock ); - newtime = localtime( &aclock ); - - asctime( newtime ); - - basedir = ri.Cvar_Get( "fs_basepath", "", 0 ); - Com_sprintf( buffer, sizeof(buffer), "%s/gl.log", basedir->string ); - glw_state.log_fp = fopen( buffer, "wt" ); - - fprintf( glw_state.log_fp, "%s\n", asctime( newtime ) ); - } - - qglAccum = logAccum; - qglAlphaFunc = logAlphaFunc; - qglAreTexturesResident = logAreTexturesResident; - qglArrayElement = logArrayElement; - qglBegin = logBegin; - qglBindTexture = logBindTexture; - qglBitmap = logBitmap; - qglBlendFunc = logBlendFunc; - qglCallList = logCallList; - qglCallLists = logCallLists; - qglClear = logClear; - qglClearAccum = logClearAccum; - qglClearColor = logClearColor; - qglClearDepth = logClearDepth; - qglClearIndex = logClearIndex; - qglClearStencil = logClearStencil; - qglClipPlane = logClipPlane; - qglColor3b = logColor3b; - qglColor3bv = logColor3bv; - qglColor3d = logColor3d; - qglColor3dv = logColor3dv; - qglColor3f = logColor3f; - qglColor3fv = logColor3fv; - qglColor3i = logColor3i; - qglColor3iv = logColor3iv; - qglColor3s = logColor3s; - qglColor3sv = logColor3sv; - qglColor3ub = logColor3ub; - qglColor3ubv = logColor3ubv; - qglColor3ui = logColor3ui; - qglColor3uiv = logColor3uiv; - qglColor3us = logColor3us; - qglColor3usv = logColor3usv; - qglColor4b = logColor4b; - qglColor4bv = logColor4bv; - qglColor4d = logColor4d; - qglColor4dv = logColor4dv; - qglColor4f = logColor4f; - qglColor4fv = logColor4fv; - qglColor4i = logColor4i; - qglColor4iv = logColor4iv; - qglColor4s = logColor4s; - qglColor4sv = logColor4sv; - qglColor4ub = logColor4ub; - qglColor4ubv = logColor4ubv; - qglColor4ui = logColor4ui; - qglColor4uiv = logColor4uiv; - qglColor4us = logColor4us; - qglColor4usv = logColor4usv; - qglColorMask = logColorMask; - qglColorMaterial = logColorMaterial; - qglColorPointer = logColorPointer; - qglCopyPixels = logCopyPixels; - qglCopyTexImage1D = logCopyTexImage1D; - qglCopyTexImage2D = logCopyTexImage2D; - qglCopyTexSubImage1D = logCopyTexSubImage1D; - qglCopyTexSubImage2D = logCopyTexSubImage2D; - qglCullFace = logCullFace; - qglDeleteLists = logDeleteLists ; - qglDeleteTextures = logDeleteTextures ; - qglDepthFunc = logDepthFunc ; - qglDepthMask = logDepthMask ; - qglDepthRange = logDepthRange ; - qglDisable = logDisable ; - qglDisableClientState = logDisableClientState ; - qglDrawArrays = logDrawArrays ; - qglDrawBuffer = logDrawBuffer ; - qglDrawElements = logDrawElements ; - qglDrawPixels = logDrawPixels ; - qglEdgeFlag = logEdgeFlag ; - qglEdgeFlagPointer = logEdgeFlagPointer ; - qglEdgeFlagv = logEdgeFlagv ; - qglEnable = logEnable ; - qglEnableClientState = logEnableClientState ; - qglEnd = logEnd ; - qglEndList = logEndList ; - qglEvalCoord1d = logEvalCoord1d ; - qglEvalCoord1dv = logEvalCoord1dv ; - qglEvalCoord1f = logEvalCoord1f ; - qglEvalCoord1fv = logEvalCoord1fv ; - qglEvalCoord2d = logEvalCoord2d ; - qglEvalCoord2dv = logEvalCoord2dv ; - qglEvalCoord2f = logEvalCoord2f ; - qglEvalCoord2fv = logEvalCoord2fv ; - qglEvalMesh1 = logEvalMesh1 ; - qglEvalMesh2 = logEvalMesh2 ; - qglEvalPoint1 = logEvalPoint1 ; - qglEvalPoint2 = logEvalPoint2 ; - qglFeedbackBuffer = logFeedbackBuffer ; - qglFinish = logFinish ; - qglFlush = logFlush ; - qglFogf = logFogf ; - qglFogfv = logFogfv ; - qglFogi = logFogi ; - qglFogiv = logFogiv ; - qglFrontFace = logFrontFace ; - qglFrustum = logFrustum ; - qglGenLists = logGenLists ; - qglGenTextures = logGenTextures ; - qglGetBooleanv = logGetBooleanv ; - qglGetClipPlane = logGetClipPlane ; - qglGetDoublev = logGetDoublev ; - qglGetError = logGetError ; - qglGetFloatv = logGetFloatv ; - qglGetIntegerv = logGetIntegerv ; - qglGetLightfv = logGetLightfv ; - qglGetLightiv = logGetLightiv ; - qglGetMapdv = logGetMapdv ; - qglGetMapfv = logGetMapfv ; - qglGetMapiv = logGetMapiv ; - qglGetMaterialfv = logGetMaterialfv ; - qglGetMaterialiv = logGetMaterialiv ; - qglGetPixelMapfv = logGetPixelMapfv ; - qglGetPixelMapuiv = logGetPixelMapuiv ; - qglGetPixelMapusv = logGetPixelMapusv ; - qglGetPointerv = logGetPointerv ; - qglGetPolygonStipple = logGetPolygonStipple ; - qglGetString = logGetString ; - qglGetTexEnvfv = logGetTexEnvfv ; - qglGetTexEnviv = logGetTexEnviv ; - qglGetTexGendv = logGetTexGendv ; - qglGetTexGenfv = logGetTexGenfv ; - qglGetTexGeniv = logGetTexGeniv ; - qglGetTexImage = logGetTexImage ; - qglGetTexLevelParameterfv = logGetTexLevelParameterfv ; - qglGetTexLevelParameteriv = logGetTexLevelParameteriv ; - qglGetTexParameterfv = logGetTexParameterfv ; - qglGetTexParameteriv = logGetTexParameteriv ; - qglHint = logHint ; - qglIndexMask = logIndexMask ; - qglIndexPointer = logIndexPointer ; - qglIndexd = logIndexd ; - qglIndexdv = logIndexdv ; - qglIndexf = logIndexf ; - qglIndexfv = logIndexfv ; - qglIndexi = logIndexi ; - qglIndexiv = logIndexiv ; - qglIndexs = logIndexs ; - qglIndexsv = logIndexsv ; - qglIndexub = logIndexub ; - qglIndexubv = logIndexubv ; - qglInitNames = logInitNames ; - qglInterleavedArrays = logInterleavedArrays ; - qglIsEnabled = logIsEnabled ; - qglIsList = logIsList ; - qglIsTexture = logIsTexture ; - qglLightModelf = logLightModelf ; - qglLightModelfv = logLightModelfv ; - qglLightModeli = logLightModeli ; - qglLightModeliv = logLightModeliv ; - qglLightf = logLightf ; - qglLightfv = logLightfv ; - qglLighti = logLighti ; - qglLightiv = logLightiv ; - qglLineStipple = logLineStipple ; - qglLineWidth = logLineWidth ; - qglListBase = logListBase ; - qglLoadIdentity = logLoadIdentity ; - qglLoadMatrixd = logLoadMatrixd ; - qglLoadMatrixf = logLoadMatrixf ; - qglLoadName = logLoadName ; - qglLogicOp = logLogicOp ; - qglMap1d = logMap1d ; - qglMap1f = logMap1f ; - qglMap2d = logMap2d ; - qglMap2f = logMap2f ; - qglMapGrid1d = logMapGrid1d ; - qglMapGrid1f = logMapGrid1f ; - qglMapGrid2d = logMapGrid2d ; - qglMapGrid2f = logMapGrid2f ; - qglMaterialf = logMaterialf ; - qglMaterialfv = logMaterialfv ; - qglMateriali = logMateriali ; - qglMaterialiv = logMaterialiv ; - qglMatrixMode = logMatrixMode ; - qglMultMatrixd = logMultMatrixd ; - qglMultMatrixf = logMultMatrixf ; - qglNewList = logNewList ; - qglNormal3b = logNormal3b ; - qglNormal3bv = logNormal3bv ; - qglNormal3d = logNormal3d ; - qglNormal3dv = logNormal3dv ; - qglNormal3f = logNormal3f ; - qglNormal3fv = logNormal3fv ; - qglNormal3i = logNormal3i ; - qglNormal3iv = logNormal3iv ; - qglNormal3s = logNormal3s ; - qglNormal3sv = logNormal3sv ; - qglNormalPointer = logNormalPointer ; - qglOrtho = logOrtho ; - qglPassThrough = logPassThrough ; - qglPixelMapfv = logPixelMapfv ; - qglPixelMapuiv = logPixelMapuiv ; - qglPixelMapusv = logPixelMapusv ; - qglPixelStoref = logPixelStoref ; - qglPixelStorei = logPixelStorei ; - qglPixelTransferf = logPixelTransferf ; - qglPixelTransferi = logPixelTransferi ; - qglPixelZoom = logPixelZoom ; - qglPointSize = logPointSize ; - qglPolygonMode = logPolygonMode ; - qglPolygonOffset = logPolygonOffset ; - qglPolygonStipple = logPolygonStipple ; - qglPopAttrib = logPopAttrib ; - qglPopClientAttrib = logPopClientAttrib ; - qglPopMatrix = logPopMatrix ; - qglPopName = logPopName ; - qglPrioritizeTextures = logPrioritizeTextures ; - qglPushAttrib = logPushAttrib ; - qglPushClientAttrib = logPushClientAttrib ; - qglPushMatrix = logPushMatrix ; - qglPushName = logPushName ; - qglRasterPos2d = logRasterPos2d ; - qglRasterPos2dv = logRasterPos2dv ; - qglRasterPos2f = logRasterPos2f ; - qglRasterPos2fv = logRasterPos2fv ; - qglRasterPos2i = logRasterPos2i ; - qglRasterPos2iv = logRasterPos2iv ; - qglRasterPos2s = logRasterPos2s ; - qglRasterPos2sv = logRasterPos2sv ; - qglRasterPos3d = logRasterPos3d ; - qglRasterPos3dv = logRasterPos3dv ; - qglRasterPos3f = logRasterPos3f ; - qglRasterPos3fv = logRasterPos3fv ; - qglRasterPos3i = logRasterPos3i ; - qglRasterPos3iv = logRasterPos3iv ; - qglRasterPos3s = logRasterPos3s ; - qglRasterPos3sv = logRasterPos3sv ; - qglRasterPos4d = logRasterPos4d ; - qglRasterPos4dv = logRasterPos4dv ; - qglRasterPos4f = logRasterPos4f ; - qglRasterPos4fv = logRasterPos4fv ; - qglRasterPos4i = logRasterPos4i ; - qglRasterPos4iv = logRasterPos4iv ; - qglRasterPos4s = logRasterPos4s ; - qglRasterPos4sv = logRasterPos4sv ; - qglReadBuffer = logReadBuffer ; - qglReadPixels = logReadPixels ; - qglRectd = logRectd ; - qglRectdv = logRectdv ; - qglRectf = logRectf ; - qglRectfv = logRectfv ; - qglRecti = logRecti ; - qglRectiv = logRectiv ; - qglRects = logRects ; - qglRectsv = logRectsv ; - qglRenderMode = logRenderMode ; - qglRotated = logRotated ; - qglRotatef = logRotatef ; - qglScaled = logScaled ; - qglScalef = logScalef ; - qglScissor = logScissor ; - qglSelectBuffer = logSelectBuffer ; - qglShadeModel = logShadeModel ; - qglStencilFunc = logStencilFunc ; - qglStencilMask = logStencilMask ; - qglStencilOp = logStencilOp ; - qglTexCoord1d = logTexCoord1d ; - qglTexCoord1dv = logTexCoord1dv ; - qglTexCoord1f = logTexCoord1f ; - qglTexCoord1fv = logTexCoord1fv ; - qglTexCoord1i = logTexCoord1i ; - qglTexCoord1iv = logTexCoord1iv ; - qglTexCoord1s = logTexCoord1s ; - qglTexCoord1sv = logTexCoord1sv ; - qglTexCoord2d = logTexCoord2d ; - qglTexCoord2dv = logTexCoord2dv ; - qglTexCoord2f = logTexCoord2f ; - qglTexCoord2fv = logTexCoord2fv ; - qglTexCoord2i = logTexCoord2i ; - qglTexCoord2iv = logTexCoord2iv ; - qglTexCoord2s = logTexCoord2s ; - qglTexCoord2sv = logTexCoord2sv ; - qglTexCoord3d = logTexCoord3d ; - qglTexCoord3dv = logTexCoord3dv ; - qglTexCoord3f = logTexCoord3f ; - qglTexCoord3fv = logTexCoord3fv ; - qglTexCoord3i = logTexCoord3i ; - qglTexCoord3iv = logTexCoord3iv ; - qglTexCoord3s = logTexCoord3s ; - qglTexCoord3sv = logTexCoord3sv ; - qglTexCoord4d = logTexCoord4d ; - qglTexCoord4dv = logTexCoord4dv ; - qglTexCoord4f = logTexCoord4f ; - qglTexCoord4fv = logTexCoord4fv ; - qglTexCoord4i = logTexCoord4i ; - qglTexCoord4iv = logTexCoord4iv ; - qglTexCoord4s = logTexCoord4s ; - qglTexCoord4sv = logTexCoord4sv ; - qglTexCoordPointer = logTexCoordPointer ; - qglTexEnvf = logTexEnvf ; - qglTexEnvfv = logTexEnvfv ; - qglTexEnvi = logTexEnvi ; - qglTexEnviv = logTexEnviv ; - qglTexGend = logTexGend ; - qglTexGendv = logTexGendv ; - qglTexGenf = logTexGenf ; - qglTexGenfv = logTexGenfv ; - qglTexGeni = logTexGeni ; - qglTexGeniv = logTexGeniv ; - qglTexImage1D = logTexImage1D ; - qglTexImage2D = logTexImage2D ; - qglTexParameterf = logTexParameterf ; - qglTexParameterfv = logTexParameterfv ; - qglTexParameteri = logTexParameteri ; - qglTexParameteriv = logTexParameteriv ; - qglTexSubImage1D = logTexSubImage1D ; - qglTexSubImage2D = logTexSubImage2D ; - qglTranslated = logTranslated ; - qglTranslatef = logTranslatef ; - qglVertex2d = logVertex2d ; - qglVertex2dv = logVertex2dv ; - qglVertex2f = logVertex2f ; - qglVertex2fv = logVertex2fv ; - qglVertex2i = logVertex2i ; - qglVertex2iv = logVertex2iv ; - qglVertex2s = logVertex2s ; - qglVertex2sv = logVertex2sv ; - qglVertex3d = logVertex3d ; - qglVertex3dv = logVertex3dv ; - qglVertex3f = logVertex3f ; - qglVertex3fv = logVertex3fv ; - qglVertex3i = logVertex3i ; - qglVertex3iv = logVertex3iv ; - qglVertex3s = logVertex3s ; - qglVertex3sv = logVertex3sv ; - qglVertex4d = logVertex4d ; - qglVertex4dv = logVertex4dv ; - qglVertex4f = logVertex4f ; - qglVertex4fv = logVertex4fv ; - qglVertex4i = logVertex4i ; - qglVertex4iv = logVertex4iv ; - qglVertex4s = logVertex4s ; - qglVertex4sv = logVertex4sv ; - qglVertexPointer = logVertexPointer ; - qglViewport = logViewport ; - } - else - { - if ( glw_state.log_fp ) { - fprintf( glw_state.log_fp, "*** CLOSING LOG ***\n" ); - fclose( glw_state.log_fp ); - glw_state.log_fp = NULL; - } - qglAccum = dllAccum; - qglAlphaFunc = dllAlphaFunc; - qglAreTexturesResident = dllAreTexturesResident; - qglArrayElement = dllArrayElement; - qglBegin = dllBegin; - qglBindTexture = dllBindTexture; - qglBitmap = dllBitmap; - qglBlendFunc = dllBlendFunc; - qglCallList = dllCallList; - qglCallLists = dllCallLists; - qglClear = dllClear; - qglClearAccum = dllClearAccum; - qglClearColor = dllClearColor; - qglClearDepth = dllClearDepth; - qglClearIndex = dllClearIndex; - qglClearStencil = dllClearStencil; - qglClipPlane = dllClipPlane; - qglColor3b = dllColor3b; - qglColor3bv = dllColor3bv; - qglColor3d = dllColor3d; - qglColor3dv = dllColor3dv; - qglColor3f = dllColor3f; - qglColor3fv = dllColor3fv; - qglColor3i = dllColor3i; - qglColor3iv = dllColor3iv; - qglColor3s = dllColor3s; - qglColor3sv = dllColor3sv; - qglColor3ub = dllColor3ub; - qglColor3ubv = dllColor3ubv; - qglColor3ui = dllColor3ui; - qglColor3uiv = dllColor3uiv; - qglColor3us = dllColor3us; - qglColor3usv = dllColor3usv; - qglColor4b = dllColor4b; - qglColor4bv = dllColor4bv; - qglColor4d = dllColor4d; - qglColor4dv = dllColor4dv; - qglColor4f = dllColor4f; - qglColor4fv = dllColor4fv; - qglColor4i = dllColor4i; - qglColor4iv = dllColor4iv; - qglColor4s = dllColor4s; - qglColor4sv = dllColor4sv; - qglColor4ub = dllColor4ub; - qglColor4ubv = dllColor4ubv; - qglColor4ui = dllColor4ui; - qglColor4uiv = dllColor4uiv; - qglColor4us = dllColor4us; - qglColor4usv = dllColor4usv; - qglColorMask = dllColorMask; - qglColorMaterial = dllColorMaterial; - qglColorPointer = dllColorPointer; - qglCopyPixels = dllCopyPixels; - qglCopyTexImage1D = dllCopyTexImage1D; - qglCopyTexImage2D = dllCopyTexImage2D; - qglCopyTexSubImage1D = dllCopyTexSubImage1D; - qglCopyTexSubImage2D = dllCopyTexSubImage2D; - qglCullFace = dllCullFace; - qglDeleteLists = dllDeleteLists ; - qglDeleteTextures = dllDeleteTextures ; - qglDepthFunc = dllDepthFunc ; - qglDepthMask = dllDepthMask ; - qglDepthRange = dllDepthRange ; - qglDisable = dllDisable ; - qglDisableClientState = dllDisableClientState ; - qglDrawArrays = dllDrawArrays ; - qglDrawBuffer = dllDrawBuffer ; - qglDrawElements = dllDrawElements ; - qglDrawPixels = dllDrawPixels ; - qglEdgeFlag = dllEdgeFlag ; - qglEdgeFlagPointer = dllEdgeFlagPointer ; - qglEdgeFlagv = dllEdgeFlagv ; - qglEnable = dllEnable ; - qglEnableClientState = dllEnableClientState ; - qglEnd = dllEnd ; - qglEndList = dllEndList ; - qglEvalCoord1d = dllEvalCoord1d ; - qglEvalCoord1dv = dllEvalCoord1dv ; - qglEvalCoord1f = dllEvalCoord1f ; - qglEvalCoord1fv = dllEvalCoord1fv ; - qglEvalCoord2d = dllEvalCoord2d ; - qglEvalCoord2dv = dllEvalCoord2dv ; - qglEvalCoord2f = dllEvalCoord2f ; - qglEvalCoord2fv = dllEvalCoord2fv ; - qglEvalMesh1 = dllEvalMesh1 ; - qglEvalMesh2 = dllEvalMesh2 ; - qglEvalPoint1 = dllEvalPoint1 ; - qglEvalPoint2 = dllEvalPoint2 ; - qglFeedbackBuffer = dllFeedbackBuffer ; - qglFinish = dllFinish ; - qglFlush = dllFlush ; - qglFogf = dllFogf ; - qglFogfv = dllFogfv ; - qglFogi = dllFogi ; - qglFogiv = dllFogiv ; - qglFrontFace = dllFrontFace ; - qglFrustum = dllFrustum ; - qglGenLists = dllGenLists ; - qglGenTextures = dllGenTextures ; - qglGetBooleanv = dllGetBooleanv ; - qglGetClipPlane = dllGetClipPlane ; - qglGetDoublev = dllGetDoublev ; - qglGetError = dllGetError ; - qglGetFloatv = dllGetFloatv ; - qglGetIntegerv = dllGetIntegerv ; - qglGetLightfv = dllGetLightfv ; - qglGetLightiv = dllGetLightiv ; - qglGetMapdv = dllGetMapdv ; - qglGetMapfv = dllGetMapfv ; - qglGetMapiv = dllGetMapiv ; - qglGetMaterialfv = dllGetMaterialfv ; - qglGetMaterialiv = dllGetMaterialiv ; - qglGetPixelMapfv = dllGetPixelMapfv ; - qglGetPixelMapuiv = dllGetPixelMapuiv ; - qglGetPixelMapusv = dllGetPixelMapusv ; - qglGetPointerv = dllGetPointerv ; - qglGetPolygonStipple = dllGetPolygonStipple ; - qglGetString = dllGetString ; - qglGetTexEnvfv = dllGetTexEnvfv ; - qglGetTexEnviv = dllGetTexEnviv ; - qglGetTexGendv = dllGetTexGendv ; - qglGetTexGenfv = dllGetTexGenfv ; - qglGetTexGeniv = dllGetTexGeniv ; - qglGetTexImage = dllGetTexImage ; - qglGetTexLevelParameterfv = dllGetTexLevelParameterfv ; - qglGetTexLevelParameteriv = dllGetTexLevelParameteriv ; - qglGetTexParameterfv = dllGetTexParameterfv ; - qglGetTexParameteriv = dllGetTexParameteriv ; - qglHint = dllHint ; - qglIndexMask = dllIndexMask ; - qglIndexPointer = dllIndexPointer ; - qglIndexd = dllIndexd ; - qglIndexdv = dllIndexdv ; - qglIndexf = dllIndexf ; - qglIndexfv = dllIndexfv ; - qglIndexi = dllIndexi ; - qglIndexiv = dllIndexiv ; - qglIndexs = dllIndexs ; - qglIndexsv = dllIndexsv ; - qglIndexub = dllIndexub ; - qglIndexubv = dllIndexubv ; - qglInitNames = dllInitNames ; - qglInterleavedArrays = dllInterleavedArrays ; - qglIsEnabled = dllIsEnabled ; - qglIsList = dllIsList ; - qglIsTexture = dllIsTexture ; - qglLightModelf = dllLightModelf ; - qglLightModelfv = dllLightModelfv ; - qglLightModeli = dllLightModeli ; - qglLightModeliv = dllLightModeliv ; - qglLightf = dllLightf ; - qglLightfv = dllLightfv ; - qglLighti = dllLighti ; - qglLightiv = dllLightiv ; - qglLineStipple = dllLineStipple ; - qglLineWidth = dllLineWidth ; - qglListBase = dllListBase ; - qglLoadIdentity = dllLoadIdentity ; - qglLoadMatrixd = dllLoadMatrixd ; - qglLoadMatrixf = dllLoadMatrixf ; - qglLoadName = dllLoadName ; - qglLogicOp = dllLogicOp ; - qglMap1d = dllMap1d ; - qglMap1f = dllMap1f ; - qglMap2d = dllMap2d ; - qglMap2f = dllMap2f ; - qglMapGrid1d = dllMapGrid1d ; - qglMapGrid1f = dllMapGrid1f ; - qglMapGrid2d = dllMapGrid2d ; - qglMapGrid2f = dllMapGrid2f ; - qglMaterialf = dllMaterialf ; - qglMaterialfv = dllMaterialfv ; - qglMateriali = dllMateriali ; - qglMaterialiv = dllMaterialiv ; - qglMatrixMode = dllMatrixMode ; - qglMultMatrixd = dllMultMatrixd ; - qglMultMatrixf = dllMultMatrixf ; - qglNewList = dllNewList ; - qglNormal3b = dllNormal3b ; - qglNormal3bv = dllNormal3bv ; - qglNormal3d = dllNormal3d ; - qglNormal3dv = dllNormal3dv ; - qglNormal3f = dllNormal3f ; - qglNormal3fv = dllNormal3fv ; - qglNormal3i = dllNormal3i ; - qglNormal3iv = dllNormal3iv ; - qglNormal3s = dllNormal3s ; - qglNormal3sv = dllNormal3sv ; - qglNormalPointer = dllNormalPointer ; - qglOrtho = dllOrtho ; - qglPassThrough = dllPassThrough ; - qglPixelMapfv = dllPixelMapfv ; - qglPixelMapuiv = dllPixelMapuiv ; - qglPixelMapusv = dllPixelMapusv ; - qglPixelStoref = dllPixelStoref ; - qglPixelStorei = dllPixelStorei ; - qglPixelTransferf = dllPixelTransferf ; - qglPixelTransferi = dllPixelTransferi ; - qglPixelZoom = dllPixelZoom ; - qglPointSize = dllPointSize ; - qglPolygonMode = dllPolygonMode ; - qglPolygonOffset = dllPolygonOffset ; - qglPolygonStipple = dllPolygonStipple ; - qglPopAttrib = dllPopAttrib ; - qglPopClientAttrib = dllPopClientAttrib ; - qglPopMatrix = dllPopMatrix ; - qglPopName = dllPopName ; - qglPrioritizeTextures = dllPrioritizeTextures ; - qglPushAttrib = dllPushAttrib ; - qglPushClientAttrib = dllPushClientAttrib ; - qglPushMatrix = dllPushMatrix ; - qglPushName = dllPushName ; - qglRasterPos2d = dllRasterPos2d ; - qglRasterPos2dv = dllRasterPos2dv ; - qglRasterPos2f = dllRasterPos2f ; - qglRasterPos2fv = dllRasterPos2fv ; - qglRasterPos2i = dllRasterPos2i ; - qglRasterPos2iv = dllRasterPos2iv ; - qglRasterPos2s = dllRasterPos2s ; - qglRasterPos2sv = dllRasterPos2sv ; - qglRasterPos3d = dllRasterPos3d ; - qglRasterPos3dv = dllRasterPos3dv ; - qglRasterPos3f = dllRasterPos3f ; - qglRasterPos3fv = dllRasterPos3fv ; - qglRasterPos3i = dllRasterPos3i ; - qglRasterPos3iv = dllRasterPos3iv ; - qglRasterPos3s = dllRasterPos3s ; - qglRasterPos3sv = dllRasterPos3sv ; - qglRasterPos4d = dllRasterPos4d ; - qglRasterPos4dv = dllRasterPos4dv ; - qglRasterPos4f = dllRasterPos4f ; - qglRasterPos4fv = dllRasterPos4fv ; - qglRasterPos4i = dllRasterPos4i ; - qglRasterPos4iv = dllRasterPos4iv ; - qglRasterPos4s = dllRasterPos4s ; - qglRasterPos4sv = dllRasterPos4sv ; - qglReadBuffer = dllReadBuffer ; - qglReadPixels = dllReadPixels ; - qglRectd = dllRectd ; - qglRectdv = dllRectdv ; - qglRectf = dllRectf ; - qglRectfv = dllRectfv ; - qglRecti = dllRecti ; - qglRectiv = dllRectiv ; - qglRects = dllRects ; - qglRectsv = dllRectsv ; - qglRenderMode = dllRenderMode ; - qglRotated = dllRotated ; - qglRotatef = dllRotatef ; - qglScaled = dllScaled ; - qglScalef = dllScalef ; - qglScissor = dllScissor ; - qglSelectBuffer = dllSelectBuffer ; - qglShadeModel = dllShadeModel ; - qglStencilFunc = dllStencilFunc ; - qglStencilMask = dllStencilMask ; - qglStencilOp = dllStencilOp ; - qglTexCoord1d = dllTexCoord1d ; - qglTexCoord1dv = dllTexCoord1dv ; - qglTexCoord1f = dllTexCoord1f ; - qglTexCoord1fv = dllTexCoord1fv ; - qglTexCoord1i = dllTexCoord1i ; - qglTexCoord1iv = dllTexCoord1iv ; - qglTexCoord1s = dllTexCoord1s ; - qglTexCoord1sv = dllTexCoord1sv ; - qglTexCoord2d = dllTexCoord2d ; - qglTexCoord2dv = dllTexCoord2dv ; - qglTexCoord2f = dllTexCoord2f ; - qglTexCoord2fv = dllTexCoord2fv ; - qglTexCoord2i = dllTexCoord2i ; - qglTexCoord2iv = dllTexCoord2iv ; - qglTexCoord2s = dllTexCoord2s ; - qglTexCoord2sv = dllTexCoord2sv ; - qglTexCoord3d = dllTexCoord3d ; - qglTexCoord3dv = dllTexCoord3dv ; - qglTexCoord3f = dllTexCoord3f ; - qglTexCoord3fv = dllTexCoord3fv ; - qglTexCoord3i = dllTexCoord3i ; - qglTexCoord3iv = dllTexCoord3iv ; - qglTexCoord3s = dllTexCoord3s ; - qglTexCoord3sv = dllTexCoord3sv ; - qglTexCoord4d = dllTexCoord4d ; - qglTexCoord4dv = dllTexCoord4dv ; - qglTexCoord4f = dllTexCoord4f ; - qglTexCoord4fv = dllTexCoord4fv ; - qglTexCoord4i = dllTexCoord4i ; - qglTexCoord4iv = dllTexCoord4iv ; - qglTexCoord4s = dllTexCoord4s ; - qglTexCoord4sv = dllTexCoord4sv ; - qglTexCoordPointer = dllTexCoordPointer ; - qglTexEnvf = dllTexEnvf ; - qglTexEnvfv = dllTexEnvfv ; - qglTexEnvi = dllTexEnvi ; - qglTexEnviv = dllTexEnviv ; - qglTexGend = dllTexGend ; - qglTexGendv = dllTexGendv ; - qglTexGenf = dllTexGenf ; - qglTexGenfv = dllTexGenfv ; - qglTexGeni = dllTexGeni ; - qglTexGeniv = dllTexGeniv ; - qglTexImage1D = dllTexImage1D ; - qglTexImage2D = dllTexImage2D ; - qglTexParameterf = dllTexParameterf ; - qglTexParameterfv = dllTexParameterfv ; - qglTexParameteri = dllTexParameteri ; - qglTexParameteriv = dllTexParameteriv ; - qglTexSubImage1D = dllTexSubImage1D ; - qglTexSubImage2D = dllTexSubImage2D ; - qglTranslated = dllTranslated ; - qglTranslatef = dllTranslatef ; - qglVertex2d = dllVertex2d ; - qglVertex2dv = dllVertex2dv ; - qglVertex2f = dllVertex2f ; - qglVertex2fv = dllVertex2fv ; - qglVertex2i = dllVertex2i ; - qglVertex2iv = dllVertex2iv ; - qglVertex2s = dllVertex2s ; - qglVertex2sv = dllVertex2sv ; - qglVertex3d = dllVertex3d ; - qglVertex3dv = dllVertex3dv ; - qglVertex3f = dllVertex3f ; - qglVertex3fv = dllVertex3fv ; - qglVertex3i = dllVertex3i ; - qglVertex3iv = dllVertex3iv ; - qglVertex3s = dllVertex3s ; - qglVertex3sv = dllVertex3sv ; - qglVertex4d = dllVertex4d ; - qglVertex4dv = dllVertex4dv ; - qglVertex4f = dllVertex4f ; - qglVertex4fv = dllVertex4fv ; - qglVertex4i = dllVertex4i ; - qglVertex4iv = dllVertex4iv ; - qglVertex4s = dllVertex4s ; - qglVertex4sv = dllVertex4sv ; - qglVertexPointer = dllVertexPointer ; - qglViewport = dllViewport ; - } -} - -#pragma warning (default : 4113 4133 4047 ) - - - diff --git a/code/win32/win_shared.cpp b/code/win32/win_shared.cpp deleted file mode 100644 index 7903e39836..0000000000 --- a/code/win32/win_shared.cpp +++ /dev/null @@ -1,181 +0,0 @@ -/* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 2 - as published by the Free Software Foundation. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . -*/ -// Copyright 2001-2013 Raven Software - -// leave this as first line for PCH reasons... -// -#include "../server/exe_headers.h" - -#include - -#include "../qcommon/q_shared.h" -#include "../qcommon/qcommon.h" -#include "win_local.h" - -// Used to determine where to store user-specific files -static char homePath[ MAX_OSPATH ] = { 0 }; - -static char binaryPath[ MAX_OSPATH ] = { 0 }; -static char installPath[ MAX_OSPATH ] = { 0 }; - -/* -================= -Sys_SetBinaryPath -================= -*/ -void Sys_SetBinaryPath(const char *path) -{ - Q_strncpyz(binaryPath, path, sizeof(binaryPath)); -} - -/* -================= -Sys_BinaryPath -================= -*/ -char *Sys_BinaryPath(void) -{ - return binaryPath; -} - -/* -================= -Sys_SetDefaultInstallPath -================= -*/ -void Sys_SetDefaultInstallPath(const char *path) -{ - Q_strncpyz(installPath, path, sizeof(installPath)); -} - -/* -================= -Sys_DefaultInstallPath -================= -*/ -char *Sys_DefaultInstallPath(void) -{ - if (*installPath) - return installPath; - else - return Sys_Cwd(); -} - -/* -============== -Sys_Dirname -============== -*/ -const char *Sys_Dirname( char *path ) -{ - static char dir[ MAX_OSPATH ] = { 0 }; - int length; - - Q_strncpyz( dir, path, sizeof( dir ) ); - length = strlen( dir ) - 1; - - while( length > 0 && dir[ length ] != '\\' ) - length--; - - dir[ length ] = '\0'; - - return dir; -} - -/* -================ -Sys_Milliseconds -================ -*/ -int Sys_Milliseconds (void) -{ - static int sys_timeBase = timeGetTime(); - int sys_curtime; - - sys_curtime = timeGetTime() - sys_timeBase; - - return sys_curtime; -} - -char *Sys_GetCurrentUser( void ) -{ - static char s_userName[1024]; - unsigned long size = sizeof( s_userName ); - - - if ( !GetUserName( s_userName, &size ) ) - Q_strncpyz( s_userName, "player", 1024 ); - - if ( !s_userName[0] ) - { - Q_strncpyz( s_userName, "player", 1024 ); - } - - return s_userName; -} - -/* -============== -Sys_DefaultHomePath -============== -*/ -char *Sys_DefaultHomePath(void) { -#ifdef _PORTABLE_VERSION - Com_Printf("Portable install requested, skipping homepath support\n"); - return NULL; -#else - typedef HRESULT (__stdcall * GETFOLDERPATH)(HWND, int, HANDLE, DWORD, LPSTR); - - TCHAR szPath[MAX_PATH]; - GETFOLDERPATH qSHGetFolderPath; - HMODULE shfolder = LoadLibrary("shfolder.dll"); - - if(shfolder == NULL) - { - Com_Printf("Unable to load SHFolder.dll\n"); - return NULL; - } - - if(!*homePath && com_homepath) - { - qSHGetFolderPath = (GETFOLDERPATH)GetProcAddress(shfolder, "SHGetFolderPathA"); - if(qSHGetFolderPath == NULL) - { - Com_Printf("Unable to find SHGetFolderPath in SHFolder.dll\n"); - FreeLibrary(shfolder); - return NULL; - } - - if( !SUCCEEDED( qSHGetFolderPath( NULL, CSIDL_PERSONAL, - NULL, 0, szPath ) ) ) - { - Com_Printf("Unable to detect CSIDL_PERSONAL\n"); - FreeLibrary(shfolder); - return NULL; - } - - Com_sprintf(homePath, sizeof(homePath), "%s%cMy Games%c", szPath, PATH_SEP, PATH_SEP); - - if(com_homepath->string[0]) - Q_strcat(homePath, sizeof(homePath), com_homepath->string); - else - Q_strcat(homePath, sizeof(homePath), HOMEPATH_NAME_WIN); - } - - FreeLibrary(shfolder); - return homePath; -#endif -} \ No newline at end of file diff --git a/code/win32/win_snd.cpp b/code/win32/win_snd.cpp deleted file mode 100644 index 62704c79ed..0000000000 --- a/code/win32/win_snd.cpp +++ /dev/null @@ -1,406 +0,0 @@ -/* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 2 - as published by the Free Software Foundation. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . -*/ -// Copyright 2001-2013 Raven Software - -// leave this as first line for PCH reasons... -// -#include "../server/exe_headers.h" - -#include - -#include "../client/snd_local.h" -#include "win_local.h" - -HRESULT (WINAPI *pDirectSoundCreate)(GUID FAR *lpGUID, LPDIRECTSOUND FAR *lplpDS, IUnknown FAR *pUnkOuter); -#define iDirectSoundCreate(a,b,c) pDirectSoundCreate(a,b,c) - -#define SECONDARY_BUFFER_SIZE 0x10000 - -#ifdef USE_OPENAL -extern int s_UseOpenAL; -#endif - -static qboolean dsound_init; -static int sample16; -static DWORD gSndBufSize; -static DWORD locksize; -static LPDIRECTSOUND pDS; -static LPDIRECTSOUNDBUFFER pDSBuf, pDSPBuf; -static HINSTANCE hInstDS; - - -static const char *DSoundError( int error ) { - switch ( error ) { - case DSERR_BUFFERLOST: - return "DSERR_BUFFERLOST"; - case DSERR_INVALIDCALL: - return "DSERR_INVALIDCALLS"; - case DSERR_INVALIDPARAM: - return "DSERR_INVALIDPARAM"; - case DSERR_PRIOLEVELNEEDED: - return "DSERR_PRIOLEVELNEEDED"; - case DSERR_ALLOCATED: - return "DSERR_ALLOCATED"; - case DSERR_UNINITIALIZED: - return "DSERR_UNINITIALIZED"; - case DSERR_UNSUPPORTED: - return "DSERR_UNSUPPORTED "; - } - - return "unknown"; -} - -/* -================== -SNDDMA_Shutdown -================== -*/ -void SNDDMA_Shutdown( void ) { - Com_DPrintf( "Shutting down sound system\n" ); - - if ( pDS ) { - Com_DPrintf( "Destroying DS buffers\n" ); - if ( pDS ) - { - Com_DPrintf( "...setting NORMAL coop level\n" ); - // FIXME JA was DSSCL_NORMAL and Q3 says DSSCL_PRIORITY but the printf says setting normal - pDS->SetCooperativeLevel( g_wv.hWnd, DSSCL_PRIORITY ); - } - - if ( pDSBuf ) - { - Com_DPrintf( "...stopping and releasing sound buffer\n" ); - pDSBuf->Stop( ); - pDSBuf->Release( ); - } - - // only release primary buffer if it's not also the mixing buffer we just released - if ( pDSPBuf && ( pDSBuf != pDSPBuf ) ) - { - Com_DPrintf( "...releasing primary buffer\n" ); - pDSPBuf->Release( ); - } - pDSBuf = NULL; - pDSPBuf = NULL; - - dma.buffer = NULL; - - Com_DPrintf( "...releasing DS object\n" ); - pDS->Release( ); - } - - if ( hInstDS ) { - Com_DPrintf( "...freeing DSOUND.DLL\n" ); - FreeLibrary( hInstDS ); - hInstDS = NULL; - } - - pDS = NULL; - pDSBuf = NULL; - pDSPBuf = NULL; - dsound_init = qfalse; - memset ((void *)&dma, 0, sizeof (dma)); - CoUninitialize( ); -} - -/* -================== -SNDDMA_Init - -Initialize direct sound -Returns false if failed -================== -*/ -qboolean SNDDMA_Init(void) { - - memset ((void *)&dma, 0, sizeof (dma)); - dsound_init = qfalse; - - CoInitialize(NULL); - - if ( !SNDDMA_InitDS () ) { - return qfalse; - } - - dsound_init = qtrue; - - Com_DPrintf("Completed successfully\n" ); - - return qtrue; -} - -#undef DEFINE_GUID - -#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - EXTERN_C const GUID name \ - = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } - -// DirectSound Component GUID {47D4D946-62E8-11CF-93BC-444553540000} -DEFINE_GUID(CLSID_DirectSound, 0x47d4d946, 0x62e8, 0x11cf, 0x93, 0xbc, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0); - -// DirectSound 8.0 Component GUID {3901CC3F-84B5-4FA4-BA35-AA8172B8A09B} -DEFINE_GUID(CLSID_DirectSound8, 0x3901cc3f, 0x84b5, 0x4fa4, 0xba, 0x35, 0xaa, 0x81, 0x72, 0xb8, 0xa0, 0x9b); - -DEFINE_GUID(IID_IDirectSound8, 0xC50A7E93, 0xF395, 0x4834, 0x9E, 0xF6, 0x7F, 0xA9, 0x9D, 0xE5, 0x09, 0x66); -DEFINE_GUID(IID_IDirectSound, 0x279AFA83, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60); - - -int SNDDMA_InitDS () -{ - HRESULT hresult; - DSBUFFERDESC dsbuf; - DSBCAPS dsbcaps; - WAVEFORMATEX format; - int use8; - - Com_Printf( "Initializing DirectSound\n"); - - use8 = 1; - // Create IDirectSound using the primary sound device - if( FAILED( hresult = CoCreateInstance(CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, IID_IDirectSound8, (void **)&pDS))) { - use8 = 0; - if( FAILED( hresult = CoCreateInstance(CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, IID_IDirectSound, (void **)&pDS))) { - Com_Printf ("failed\n"); - SNDDMA_Shutdown (); - return qfalse; - } - } - - hresult = pDS->Initialize( NULL); - - Com_DPrintf( "ok\n" ); - - Com_DPrintf("...setting DSSCL_PRIORITY coop level: " ); - - if ( DS_OK != pDS->SetCooperativeLevel( g_wv.hWnd, DSSCL_PRIORITY ) ) { - Com_Printf ("failed\n"); - SNDDMA_Shutdown (); - return qfalse; - } - Com_DPrintf("ok\n" ); - - - // create the secondary buffer we'll actually work with - dma.channels = 2; - dma.samplebits = 16; - - if (s_khz->integer == 44) - dma.speed = 44100; - else if (s_khz->integer == 22) - dma.speed = 22050; - else - dma.speed = 11025; - - memset (&format, 0, sizeof(format)); - format.wFormatTag = WAVE_FORMAT_PCM; - format.nChannels = dma.channels; - format.wBitsPerSample = dma.samplebits; - format.nSamplesPerSec = dma.speed; - format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8; - format.cbSize = 0; - format.nAvgBytesPerSec = format.nSamplesPerSec*format.nBlockAlign; - - memset (&dsbuf, 0, sizeof(dsbuf)); - dsbuf.dwSize = sizeof(DSBUFFERDESC); - - // Micah: take advantage of 2D hardware.if available. - dsbuf.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_LOCHARDWARE; - if (use8) { - dsbuf.dwFlags |= DSBCAPS_GETCURRENTPOSITION2; - } -//#define idDSBCAPS_GETCURRENTPOSITION2 0x00010000 - dsbuf.dwBufferBytes = SECONDARY_BUFFER_SIZE; - dsbuf.lpwfxFormat = &format; - - memset(&dsbcaps, 0, sizeof(dsbcaps)); - dsbcaps.dwSize = sizeof(dsbcaps); - - Com_DPrintf( "...creating secondary buffer: " ); - if (DS_OK == pDS->CreateSoundBuffer(&dsbuf, &pDSBuf, NULL)) { - Com_Printf( "locked hardware. ok\n" ); - } - else { - // Couldn't get hardware, fallback to software. - dsbuf.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_LOCSOFTWARE; - if (use8) { - dsbuf.dwFlags |= DSBCAPS_GETCURRENTPOSITION2; - } - if (DS_OK != pDS->CreateSoundBuffer(&dsbuf, &pDSBuf, NULL)) { - Com_Printf( "failed\n" ); - SNDDMA_Shutdown (); - return qfalse; - } - Com_DPrintf( "forced to software. ok\n" ); - } - - // Make sure mixer is active - if ( DS_OK != pDSBuf->Play(0, 0, DSBPLAY_LOOPING) ) { - Com_Printf ("*** Looped sound play failed ***\n"); - SNDDMA_Shutdown (); - return qfalse; - } - - // get the returned buffer size - if ( DS_OK != pDSBuf->GetCaps (&dsbcaps) ) { - Com_Printf ("*** GetCaps failed ***\n"); - SNDDMA_Shutdown (); - return qfalse; - } - - gSndBufSize = dsbcaps.dwBufferBytes; - - dma.channels = format.nChannels; - dma.samplebits = format.wBitsPerSample; - dma.speed = format.nSamplesPerSec; - dma.samples = gSndBufSize/(dma.samplebits/8); - dma.submission_chunk = 1; - dma.buffer = NULL; // must be locked first - - sample16 = (dma.samplebits/8) - 1; - - SNDDMA_BeginPainting (); - if (dma.buffer) - memset(dma.buffer, 0, dma.samples * dma.samplebits/8); - SNDDMA_Submit (); - return 1; -} -/* -============== -SNDDMA_GetDMAPos - -return the current sample position (in mono samples read) -inside the recirculating dma buffer, so the mixing code will know -how many sample are required to fill it up. -=============== -*/ -int SNDDMA_GetDMAPos( void ) { - MMTIME mmtime; - int s; - DWORD dwWrite; - - if ( !dsound_init ) { - return 0; - } - - mmtime.wType = TIME_SAMPLES; - pDSBuf->GetCurrentPosition(&mmtime.u.sample, &dwWrite); - - s = mmtime.u.sample; - - s >>= sample16; - - s &= (dma.samples-1); - - return s; -} - -/* -============== -SNDDMA_BeginPainting - -Makes sure dma.buffer is valid -=============== -*/ -void SNDDMA_BeginPainting( void ) { - int reps; - DWORD dwSize2; - DWORD *pbuf, *pbuf2; - HRESULT hresult; - DWORD dwStatus; - - if ( !pDSBuf ) { - return; - } - - // if the buffer was lost or stopped, restore it and/or restart it - if ( pDSBuf->GetStatus (&dwStatus) != DS_OK ) { - Com_Printf ("Couldn't get sound buffer status\n"); - } - - if (dwStatus & DSBSTATUS_BUFFERLOST) - pDSBuf->Restore (); - - if (!(dwStatus & DSBSTATUS_PLAYING)) - pDSBuf->Play(0, 0, DSBPLAY_LOOPING); - - // lock the dsound buffer - - reps = 0; - dma.buffer = NULL; - - while ((hresult = pDSBuf->Lock(0, gSndBufSize, (void **)&pbuf, &locksize, - (void **)&pbuf2, &dwSize2, 0)) != DS_OK) - { - if (hresult != DSERR_BUFFERLOST) - { - Com_Printf( "SNDDMA_BeginPainting: Lock failed with error '%s'\n", DSoundError( hresult ) ); - S_Shutdown (); - return; - } - else - { - pDSBuf->Restore( ); - } - - if (++reps > 2) - return; - } - dma.buffer = (unsigned char *)pbuf; -} - -/* -============== -SNDDMA_Submit - -Send sound to device if buffer isn't really the dma buffer -Also unlocks the dsound buffer -=============== -*/ -void SNDDMA_Submit( void ) { - // unlock the dsound buffer - if ( pDSBuf ) { - pDSBuf->Unlock(dma.buffer, locksize, NULL, 0); - } -} - - -/* -================= -SNDDMA_Activate - -When we change windows we need to do this -================= -*/ -void SNDDMA_Activate( qboolean bAppActive ) -{ -#ifdef USE_OPENAL - if (s_UseOpenAL) - { - S_AL_MuteAllSounds(!bAppActive); - } -#endif - - if ( !pDS ) { - return; - } - - if ( DS_OK != pDS->SetCooperativeLevel( g_wv.hWnd, DSSCL_PRIORITY ) ) { - Com_Printf ("sound SetCooperativeLevel failed\n"); - SNDDMA_Shutdown (); - } -} - - diff --git a/code/win32/win_syscon.cpp b/code/win32/win_syscon.cpp deleted file mode 100644 index 3621241346..0000000000 --- a/code/win32/win_syscon.cpp +++ /dev/null @@ -1,617 +0,0 @@ -/* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 2 - as published by the Free Software Foundation. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . -*/ -// Copyright 2001-2013 Raven Software - -// win_syscon.h - -// leave this as first line for PCH reasons... -// -#include "../server/exe_headers.h" - - - - -#include "../client/client.h" -#include "win_local.h" -#include "resource.h" -#include -#include -#include -#include -#include -#include -#include - -enum { - COPY_ID = 1, - QUIT_ID, - CLEAR_ID, - - ERRORBOX_ID = 10, - ERRORTEXT_ID, - - EDIT_ID = 100, - INPUT_ID -}; - -typedef struct -{ - HWND hWnd; - HWND hwndBuffer; - - HWND hwndButtonClear; - HWND hwndButtonCopy; - HWND hwndButtonQuit; - - HWND hwndErrorBox; - HWND hwndErrorText; - - HBITMAP hbmLogo; - HBITMAP hbmClearBitmap; - - HBRUSH hbrEditBackground; - HBRUSH hbrErrorBackground; - - HFONT hfBufferFont; - HFONT hfButtonFont; - - HWND hwndInputLine; - - char errorString[80]; - - char consoleText[512], returnedText[512]; - int visLevel; - qboolean quitOnClose; - int windowWidth, windowHeight; - - WNDPROC SysInputLineWndProc; - - // console - field_t g_consoleField; - int nextHistoryLine; // the last line in the history buffer, not masked - int historyLine; // the line being displayed from history buffer will be <= nextHistoryLine - field_t historyEditLines[COMMAND_HISTORY]; - -} WinConData; - -static WinConData s_wcd; - -static LRESULT CALLBACK ConWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) -{ - char *cmdString; - static qboolean s_timePolarity; - - switch (uMsg) - { - case WM_ACTIVATE: - if ( LOWORD( wParam ) != WA_INACTIVE ) - { - SetFocus( s_wcd.hwndInputLine ); - } - - if ( com_viewlog ) - { - // if the viewlog is open, check to see if it's being minimized - if ( com_viewlog->integer == 1 ) - { - if ( HIWORD( wParam ) ) // minimized flag - { - Cvar_Set( "viewlog", "2" ); - } - } - else if ( com_viewlog->integer == 2 ) - { - if ( !HIWORD( wParam ) ) // minimized flag - { - Cvar_Set( "viewlog", "1" ); - } - } - } - break; - - case WM_CLOSE: - if ( s_wcd.quitOnClose ) - { - PostQuitMessage( 0 ); - } - else - { - Sys_ShowConsole( 0, qfalse ); - Cvar_Set( "viewlog", "0" ); - } - return 0; - case WM_CTLCOLORSTATIC: - if ( ( HWND ) lParam == s_wcd.hwndBuffer ) - { - SetBkColor( ( HDC ) wParam, RGB( 0, 0, 0 ) ); - SetTextColor( ( HDC ) wParam, RGB( 249, 249, 000 ) ); - return ( LRESULT ) s_wcd.hbrEditBackground; - } - else if ( ( HWND ) lParam == s_wcd.hwndErrorBox ) - { - if ( s_timePolarity & 1 ) - { - SetBkColor( ( HDC ) wParam, RGB( 0x80, 0x80, 0x80 ) ); - SetTextColor( ( HDC ) wParam, RGB( 0xff, 0x00, 0x00 ) ); - } - else - { - SetBkColor( ( HDC ) wParam, RGB( 0x80, 0x80, 0x80 ) ); - SetTextColor( ( HDC ) wParam, RGB( 0x00, 0x00, 0x00 ) ); - } - return ( LRESULT ) s_wcd.hbrErrorBackground; - } - return FALSE; - break; - - case WM_COMMAND: - if ( wParam == COPY_ID ) - { - SendMessage( s_wcd.hwndBuffer, EM_SETSEL, 0, -1 ); - SendMessage( s_wcd.hwndBuffer, WM_COPY, 0, 0 ); - } - else if ( wParam == QUIT_ID ) - { - if ( s_wcd.quitOnClose ) - { - PostQuitMessage( 0 ); - } - else - { - cmdString = CopyString( "quit" ); - Sys_QueEvent( 0, SE_CONSOLE, 0, 0, strlen( cmdString ) + 1, cmdString ); - } - } - else if ( wParam == CLEAR_ID ) - { - SendMessage( s_wcd.hwndBuffer, EM_SETSEL, 0, -1 ); - SendMessage( s_wcd.hwndBuffer, EM_REPLACESEL, FALSE, ( LPARAM ) "" ); - UpdateWindow( s_wcd.hwndBuffer ); - } - break; - case WM_CREATE: - s_wcd.hbrEditBackground = CreateSolidBrush( RGB( 0x00, 0x00, 0x00 ) ); - s_wcd.hbrErrorBackground = CreateSolidBrush( RGB( 0x80, 0x80, 0x80 ) ); - SetTimer( hWnd, 1, 1000, NULL ); - break; - case WM_ERASEBKGND: - return DefWindowProc( hWnd, uMsg, wParam, lParam ); - case WM_TIMER: - if ( wParam == 1 ) - { - s_timePolarity = !s_timePolarity; - if ( s_wcd.hwndErrorBox ) - { - InvalidateRect( s_wcd.hwndErrorBox, NULL, FALSE ); - } - } - break; - } - - return DefWindowProc( hWnd, uMsg, wParam, lParam ); -} - -static LRESULT CALLBACK InputLineWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) -{ - switch ( uMsg ) - { - case WM_KILLFOCUS: - if ( ( HWND ) wParam == s_wcd.hWnd || - ( HWND ) wParam == s_wcd.hwndErrorBox ) - { - SetFocus( hWnd ); - return 0; - } - break; - - case WM_CHAR: - GetWindowText( s_wcd.hwndInputLine, s_wcd.g_consoleField.buffer, sizeof( s_wcd.g_consoleField.buffer ) ); - SendMessage( s_wcd.hwndInputLine, EM_GETSEL, (WPARAM) NULL, (LPARAM) &s_wcd.g_consoleField.cursor ); - - if ( wParam == VK_RETURN ) - { - strncat( s_wcd.consoleText, s_wcd.g_consoleField.buffer, sizeof( s_wcd.consoleText ) - strlen( s_wcd.consoleText ) - 5 ); - strcat( s_wcd.consoleText, "\n" ); - SetWindowText( s_wcd.hwndInputLine, "" ); - - Sys_Print( va( "%c%s\n", CONSOLE_PROMPT_CHAR, s_wcd.g_consoleField.buffer ) ); - - // empty lines just scroll the console without adding to history - if ( !s_wcd.g_consoleField.buffer[0] ) - return 0; - - // copy line to history buffer - s_wcd.historyEditLines[s_wcd.nextHistoryLine % COMMAND_HISTORY] = s_wcd.g_consoleField; - s_wcd.nextHistoryLine++; - s_wcd.historyLine = s_wcd.nextHistoryLine; - Field_Clear( &s_wcd.g_consoleField ); - s_wcd.g_consoleField.widthInChars = g_console_field_width; - - return 0; - } - - if ( wParam == VK_TAB ) - { - Field_AutoComplete( &s_wcd.g_consoleField ); - SetWindowText( s_wcd.hwndInputLine, s_wcd.g_consoleField.buffer ); - SendMessage( s_wcd.hwndInputLine, EM_SETSEL, s_wcd.g_consoleField.cursor, s_wcd.g_consoleField.cursor ); - return 0; - } - break; - case WM_KEYDOWN: - // history scrolling - if ( wParam == VK_UP ) - {// scroll up: arrow-up - if ( s_wcd.nextHistoryLine - s_wcd.historyLine < COMMAND_HISTORY && s_wcd.historyLine > 0 ) - s_wcd.historyLine--; - s_wcd.g_consoleField = s_wcd.historyEditLines[s_wcd.historyLine % COMMAND_HISTORY]; - SetWindowText( s_wcd.hwndInputLine, s_wcd.g_consoleField.buffer ); - SendMessage( s_wcd.hwndInputLine, EM_SETSEL, s_wcd.g_consoleField.cursor, s_wcd.g_consoleField.cursor ); - - return 0; - } - - if ( wParam == VK_DOWN ) - {// scroll down: arrow-down - s_wcd.historyLine++; - if (s_wcd.historyLine >= s_wcd.nextHistoryLine) { - s_wcd.historyLine = s_wcd.nextHistoryLine; - Field_Clear( &s_wcd.g_consoleField ); - s_wcd.g_consoleField.widthInChars = g_console_field_width; - SetWindowText( s_wcd.hwndInputLine, s_wcd.g_consoleField.buffer ); - SendMessage( s_wcd.hwndInputLine, EM_SETSEL, s_wcd.g_consoleField.cursor, s_wcd.g_consoleField.cursor ); - return 0; - } - s_wcd.g_consoleField = s_wcd.historyEditLines[s_wcd.historyLine % COMMAND_HISTORY]; - SetWindowText( s_wcd.hwndInputLine, s_wcd.g_consoleField.buffer ); - SendMessage( s_wcd.hwndInputLine, EM_SETSEL, s_wcd.g_consoleField.cursor, s_wcd.g_consoleField.cursor ); - - return 0; - } - break; - } - - return CallWindowProc( s_wcd.SysInputLineWndProc, hWnd, uMsg, wParam, lParam ); -} - -/* -** Sys_CreateConsole -*/ -void Sys_CreateConsole( void ) -{ - HDC hDC; - WNDCLASS wc; - RECT rect; - const char *DEDCLASS = "JK2MP WinConsole"; - int nHeight; - int swidth, sheight; - int DEDSTYLE = WS_POPUPWINDOW | WS_CAPTION | WS_MINIMIZEBOX; - - memset( &wc, 0, sizeof( wc ) ); - - wc.style = 0; - wc.lpfnWndProc = (WNDPROC) ConWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = g_wv.hInstance; - wc.hIcon = LoadIcon( g_wv.hInstance, MAKEINTRESOURCE(IDI_ICON1)); - wc.hCursor = LoadCursor (NULL,IDC_ARROW); - wc.hbrBackground = (HBRUSH__ *)COLOR_INACTIVEBORDER;//(HBRUSH__ *)COLOR_WINDOW; - wc.lpszMenuName = 0; - wc.lpszClassName = DEDCLASS; - - if ( !RegisterClass (&wc) ) { - return; - } - - rect.left = 0; - rect.right = 600; - rect.top = 0; - rect.bottom = 450; - AdjustWindowRect( &rect, DEDSTYLE, FALSE ); - - hDC = GetDC( GetDesktopWindow() ); - swidth = GetDeviceCaps( hDC, HORZRES ); - sheight = GetDeviceCaps( hDC, VERTRES ); - ReleaseDC( GetDesktopWindow(), hDC ); - - s_wcd.windowWidth = rect.right - rect.left + 1; - s_wcd.windowHeight = rect.bottom - rect.top + 1; - - s_wcd.hWnd = CreateWindowEx( 0, - DEDCLASS, - "OpenJK Singleplayer Console", - DEDSTYLE, - ( swidth - 600 ) / 2, ( sheight - 450 ) / 2 , rect.right - rect.left + 1, rect.bottom - rect.top + 1, - NULL, - NULL, - g_wv.hInstance, - NULL ); - - if ( s_wcd.hWnd == NULL ) - { - return; - } - - // - // create fonts - // - hDC = GetDC( s_wcd.hWnd ); - nHeight = -MulDiv( 8, GetDeviceCaps( hDC, LOGPIXELSY), 72); - - s_wcd.hfBufferFont = CreateFont( nHeight, - 0, - 0, - 0, - FW_LIGHT, - 0, - 0, - 0, - DEFAULT_CHARSET, - OUT_DEFAULT_PRECIS, - CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, - FF_MODERN | FIXED_PITCH, - "Courier New" ); - - ReleaseDC( s_wcd.hWnd, hDC ); - - // - // create the input line - // - s_wcd.hwndInputLine = CreateWindow( "edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | - ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, - 6, 400, s_wcd.windowWidth-20, 20, - s_wcd.hWnd, - ( HMENU ) INPUT_ID, // child window ID - g_wv.hInstance, NULL ); - - // - // create the buttons - // - s_wcd.hwndButtonCopy = CreateWindow( "button", NULL, BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, - 5, 425, 72, 24, - s_wcd.hWnd, - ( HMENU ) COPY_ID, // child window ID - g_wv.hInstance, NULL ); - SendMessage( s_wcd.hwndButtonCopy, WM_SETTEXT, 0, ( LPARAM ) "copy" ); - - s_wcd.hwndButtonClear = CreateWindow( "button", NULL, BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, - 82, 425, 72, 24, - s_wcd.hWnd, - ( HMENU ) CLEAR_ID, // child window ID - g_wv.hInstance, NULL ); - SendMessage( s_wcd.hwndButtonClear, WM_SETTEXT, 0, ( LPARAM ) "clear" ); - - s_wcd.hwndButtonQuit = CreateWindow( "button", NULL, BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, - s_wcd.windowWidth-92, 425, 72, 24, - s_wcd.hWnd, - ( HMENU ) QUIT_ID, // child window ID - g_wv.hInstance, NULL ); - SendMessage( s_wcd.hwndButtonQuit, WM_SETTEXT, 0, ( LPARAM ) "quit" ); - - - // - // create the scrollbuffer - // - s_wcd.hwndBuffer = CreateWindow( "edit", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | - ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_TABSTOP, - 6, 40, s_wcd.windowWidth-20, 354, - s_wcd.hWnd, - ( HMENU ) EDIT_ID, // child window ID - g_wv.hInstance, NULL ); - SendMessage( s_wcd.hwndBuffer, WM_SETFONT, ( WPARAM ) s_wcd.hfBufferFont, 0 ); - - s_wcd.SysInputLineWndProc = ( WNDPROC ) SetWindowLongPtr( s_wcd.hwndInputLine, GWLP_WNDPROC, ( LONG_PTR ) InputLineWndProc ); - SendMessage( s_wcd.hwndInputLine, WM_SETFONT, ( WPARAM ) s_wcd.hfBufferFont, 0 ); - SendMessage( s_wcd.hwndBuffer, EM_LIMITTEXT, ( WPARAM ) 0x7fff, 0 ); - - ShowWindow( s_wcd.hWnd, SW_SHOWDEFAULT); - UpdateWindow( s_wcd.hWnd ); - SetForegroundWindow( s_wcd.hWnd ); - SetFocus( s_wcd.hwndInputLine ); - - Field_Clear( &s_wcd.g_consoleField ); - s_wcd.g_consoleField.widthInChars = g_console_field_width; - for ( int i = 0 ; i < COMMAND_HISTORY ; i++ ) { - Field_Clear( &s_wcd.historyEditLines[i] ); - s_wcd.historyEditLines[i].widthInChars = g_console_field_width; - } - - s_wcd.visLevel = 1; -} - -/* -** Sys_DestroyConsole -*/ -void Sys_DestroyConsole( void ) { - if ( s_wcd.hWnd ) { - DeleteObject(s_wcd.hbrEditBackground); - DeleteObject(s_wcd.hbrErrorBackground); - DeleteObject(s_wcd.hfBufferFont); - ShowWindow( s_wcd.hWnd, SW_HIDE ); - CloseWindow( s_wcd.hWnd ); - DestroyWindow( s_wcd.hWnd ); - s_wcd.hWnd = 0; - } -} - -/* -** Sys_ShowConsole -*/ -void Sys_ShowConsole( int visLevel, qboolean quitOnClose ) -{ - s_wcd.quitOnClose = quitOnClose; - - if ( visLevel == s_wcd.visLevel ) - { - if (quitOnClose) {//attempt to bring it to the front on error exit - SetForegroundWindow( s_wcd.hWnd ); - SetFocus( s_wcd.hwndInputLine ); - } - return; - } - - s_wcd.visLevel = visLevel; - - if ( !s_wcd.hWnd ){ - return; - } - - switch ( visLevel ) - { - case 0: - ShowWindow( s_wcd.hWnd, SW_HIDE ); - break; - case 1: - ShowWindow( s_wcd.hWnd, SW_SHOWNORMAL ); - SendMessage( s_wcd.hwndBuffer, EM_LINESCROLL, 0, 0xffff ); - if (quitOnClose) {//attempt to bring it to the front on error exit - SetForegroundWindow( s_wcd.hWnd ); - SetFocus( s_wcd.hwndInputLine ); - } - break; - case 2: - ShowWindow( s_wcd.hWnd, SW_MINIMIZE ); - break; - default: - Sys_Error( "Invalid visLevel %d sent to Sys_ShowConsole\n", visLevel ); - break; - } -} - -/* -** Sys_ConsoleInput -*/ -char *Sys_ConsoleInput( void ) -{ - if ( s_wcd.consoleText[0] == 0 ) - { - return NULL; - } - - Q_strncpyz( s_wcd.returnedText, s_wcd.consoleText, 512 ); - s_wcd.consoleText[0] = 0; - - return s_wcd.returnedText; -} - -/* -** Conbuf_AppendText -*/ -void Conbuf_AppendText( const char *pMsg ) -{ -#define CONSOLE_BUFFER_SIZE 16384 - if ( !s_wcd.hWnd ) { - return; - } - char buffer[CONSOLE_BUFFER_SIZE*4]; - char *b = buffer; - const char *msg; - int bufLen; - int i = 0; - static unsigned long s_totalChars; - - // - // if the message is REALLY long, use just the last portion of it - // - if ( strlen( pMsg ) > CONSOLE_BUFFER_SIZE - 1 ) - { - msg = pMsg + strlen( pMsg ) - CONSOLE_BUFFER_SIZE + 1; - } - else - { - msg = pMsg; - } - - // - // copy into an intermediate buffer - // - while ( msg[i] && ( ( b - buffer ) < sizeof( buffer ) - 1 ) ) - { - if ( msg[i] == '\n' && msg[i+1] == '\r' ) - { - b[0] = '\r'; - b[1] = '\n'; - b += 2; - i++; - } - else if ( msg[i] == '\r' ) - { - b[0] = '\r'; - b[1] = '\n'; - b += 2; - } - else if ( msg[i] == '\n' ) - { - b[0] = '\r'; - b[1] = '\n'; - b += 2; - } - else if ( Q_IsColorString( &msg[i] ) ) - { - i++; - } - else - { - *b= msg[i]; - b++; - } - i++; - } - *b = 0; - bufLen = b - buffer; - - s_totalChars += bufLen; - - // - // replace selection instead of appending if we're overflowing - // - if ( s_totalChars > 0x7fff ) - { - SendMessage( s_wcd.hwndBuffer, EM_SETSEL, 0, -1 ); - s_totalChars = bufLen; - } - - // - // put this text into the windows console - // - SendMessage( s_wcd.hwndBuffer, EM_LINESCROLL, 0, 0xffff ); - SendMessage( s_wcd.hwndBuffer, EM_SCROLLCARET, 0, 0 ); - SendMessage( s_wcd.hwndBuffer, EM_REPLACESEL, 0, (LPARAM) buffer ); -} - -/* -** Sys_SetErrorText -*/ -void Sys_SetErrorText( const char *buf ) -{ - Q_strncpyz( s_wcd.errorString, buf, sizeof( s_wcd.errorString ) ); - - if ( !s_wcd.hwndErrorBox ) - { - s_wcd.hwndErrorBox = CreateWindow( "static", NULL, WS_CHILD | WS_VISIBLE | SS_SUNKEN, - 6, 5, s_wcd.windowWidth-20, 30, - s_wcd.hWnd, - ( HMENU ) ERRORBOX_ID, // child window ID - g_wv.hInstance, NULL ); - SendMessage( s_wcd.hwndErrorBox, WM_SETFONT, ( WPARAM ) s_wcd.hfBufferFont, 0 ); - SetWindowText( s_wcd.hwndErrorBox, s_wcd.errorString ); - - DestroyWindow( s_wcd.hwndInputLine ); - s_wcd.hwndInputLine = NULL; - } -} diff --git a/code/win32/win_wndproc.cpp b/code/win32/win_wndproc.cpp deleted file mode 100644 index bcb9ae4af0..0000000000 --- a/code/win32/win_wndproc.cpp +++ /dev/null @@ -1,509 +0,0 @@ -/* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 2 - as published by the Free Software Foundation. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . -*/ -// Copyright 2001-2013 Raven Software - -// leave this as first line for PCH reasons... -// -#include "../server/exe_headers.h" - - - - -#include "../client/client.h" -#include "win_local.h" - -// The only directly referenced keycode - the console key (which gives different ascii codes depending on locale) -#define CONSOLE_SCAN_CODE 0x29 - - -WinVars_t g_wv; - -#ifndef WM_MOUSEWHEEL -#define WM_MOUSEWHEEL (WM_MOUSELAST+1) // message that will be supported by the OS -#endif - -static UINT MSH_MOUSEWHEEL; - -// Console variables that we need to access from this module -cvar_t *vid_xpos; // X coordinate of window position -cvar_t *vid_ypos; // Y coordinate of window position - -LONG WINAPI MainWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); - -/* -================== -VID_AppActivate -================== -*/ -static void VID_AppActivate(BOOL fActive, BOOL minimize) -{ - g_wv.isMinimized = minimize; - - Key_ClearStates(); // FIXME!!! - - // we don't want to act like we're active if we're minimized - if (fActive && !g_wv.isMinimized ) - { - g_wv.activeApp = qtrue; - } - else - { - g_wv.activeApp = qfalse; - } - - // minimize/restore mouse-capture on demand - if (!g_wv.activeApp ) - { - IN_Activate (qfalse); - } - else - { - IN_Activate (qtrue); - } -} - -static byte virtualKeyConvert[0x92][2] = -{ - { 0, 0 }, - { A_MOUSE1, A_MOUSE1 }, // VK_LBUTTON 01 Left mouse button - { A_MOUSE2, A_MOUSE2 }, // VK_RBUTTON 02 Right mouse button - { 0, 0 }, // VK_CANCEL 03 Control-break processing - { A_MOUSE3, A_MOUSE3 }, // VK_MBUTTON 04 Middle mouse button (three-button mouse) - { A_MOUSE4, A_MOUSE4 }, // VK_XBUTTON1 05 Windows 2000/XP: X1 mouse button - { A_MOUSE5, A_MOUSE5 }, // VK_XBUTTON2 06 Windows 2000/XP: X2 mouse button - { 0, 0 }, // 07 Undefined - { A_BACKSPACE, A_BACKSPACE }, // VK_BACK 08 BACKSPACE key - { A_TAB, A_TAB }, // VK_TAB 09 TAB key - { 0, 0 }, // 0A Reserved - { 0, 0 }, // 0B Reserved - { A_KP_5, 0 }, // VK_CLEAR 0C CLEAR key - { A_ENTER, A_KP_ENTER }, // VK_RETURN 0D ENTER key - { 0, 0 }, // 0E Undefined - { 0, 0 }, // 0F Undefined - { A_SHIFT, A_SHIFT }, // VK_SHIFT 10 SHIFT key - { A_CTRL, A_CTRL }, // VK_CONTROL 11 CTRL key - { A_ALT, A_ALT }, // VK_MENU 12 ALT key - { A_PAUSE, A_PAUSE }, // VK_PAUSE 13 PAUSE key - { A_CAPSLOCK, A_CAPSLOCK }, // VK_CAPITAL 14 CAPS LOCK key - { 0, 0 }, // VK_KANA 15 IME Kana mode - { 0, 0 }, // 16 Undefined - { 0, 0 }, // VK_JUNJA 17 IME Junja mode - { 0, 0 }, // VK_FINAL 18 IME final mode - { 0, 0 }, // VK_KANJI 19 IME Kanji mode - { 0, 0 }, // 1A Undefined - { A_ESCAPE, A_ESCAPE }, // VK_ESCAPE 1B ESC key - { 0, 0 }, // VK_CONVERT 1C IME convert - { 0, 0 }, // VK_NONCONVERT 1D IME nonconvert - { 0, 0 }, // VK_ACCEPT 1E IME accept - { 0, 0 }, // VK_MODECHANGE 1F IME mode change request - { A_SPACE, A_SPACE }, // VK_SPACE 20 SPACEBAR - { A_KP_9, A_PAGE_UP }, // VK_PRIOR 21 PAGE UP key - { A_KP_3, A_PAGE_DOWN }, // VK_NEXT 22 PAGE DOWN key - { A_KP_1, A_END }, // VK_END 23 END key - { A_KP_7, A_HOME }, // VK_HOME 24 HOME key - { A_KP_4, A_CURSOR_LEFT }, // VK_LEFT 25 LEFT ARROW key - { A_KP_8, A_CURSOR_UP }, // VK_UP 26 UP ARROW key - { A_KP_6, A_CURSOR_RIGHT }, // VK_RIGHT 27 RIGHT ARROW key - { A_KP_2, A_CURSOR_DOWN }, // VK_DOWN 28 DOWN ARROW key - { 0, 0 }, // VK_SELECT 29 SELECT key - { 0, 0 }, // VK_PRINT 2A PRINT key - { 0, 0 }, // VK_EXECUTE 2B EXECUTE key - { A_PRINTSCREEN, A_PRINTSCREEN }, // VK_SNAPSHOT 2C PRINT SCREEN key - { A_KP_0, A_INSERT }, // VK_INSERT 2D INS key - { A_KP_PERIOD, A_DELETE }, // VK_DELETE 2E DEL key - { 0, 0 }, // VK_HELP 2F HELP key - { A_0, A_0 }, // 30 0 key - { A_1, A_1 }, // 31 1 key - { A_2, A_2 }, // 32 2 key - { A_3, A_3 }, // 33 3 key - { A_4, A_4 }, // 34 4 key - { A_5, A_5 }, // 35 5 key - { A_6, A_6 }, // 36 6 key - { A_7, A_7 }, // 37 7 key - { A_8, A_8 }, // 38 8 key - { A_9, A_9 }, // 39 9 key - { 0, 0 }, // 3A Undefined - { 0, 0 }, // 3B Undefined - { 0, 0 }, // 3C Undefined - { 0, 0 }, // 3D Undefined - { 0, 0 }, // 3E Undefined - { 0, 0 }, // 3F Undefined - { 0, 0 }, // 40 Undefined - { A_CAP_A, A_CAP_A }, // 41 A key - { A_CAP_B, A_CAP_B }, // 42 B key - { A_CAP_C, A_CAP_C }, // 43 C key - { A_CAP_D, A_CAP_D }, // 44 D key - { A_CAP_E, A_CAP_E }, // 45 E key - { A_CAP_F, A_CAP_F }, // 46 F key - { A_CAP_G, A_CAP_G }, // 47 G key - { A_CAP_H, A_CAP_H }, // 48 H key - { A_CAP_I, A_CAP_I }, // 49 I key - { A_CAP_J, A_CAP_J }, // 4A J key - { A_CAP_K, A_CAP_K }, // 4B K key - { A_CAP_L, A_CAP_L }, // 4C L key - { A_CAP_M, A_CAP_M }, // 4D M key - { A_CAP_N, A_CAP_N }, // 4E N key - { A_CAP_O, A_CAP_O }, // 4F O key - { A_CAP_P, A_CAP_P }, // 50 P key - { A_CAP_Q, A_CAP_Q }, // 51 Q key - { A_CAP_R, A_CAP_R }, // 52 R key - { A_CAP_S, A_CAP_S }, // 53 S key - { A_CAP_T, A_CAP_T }, // 54 T key - { A_CAP_U, A_CAP_U }, // 55 U key - { A_CAP_V, A_CAP_V }, // 56 V key - { A_CAP_W, A_CAP_W }, // 57 W key - { A_CAP_X, A_CAP_X }, // 58 X key - { A_CAP_Y, A_CAP_Y }, // 59 Y key - { A_CAP_Z, A_CAP_Z }, // 5A Z key - { 0, 0 }, // VK_LWIN 5B Left Windows key (Microsoft® Natural® keyboard) - { 0, 0 }, // VK_RWIN 5C Right Windows key (Natural keyboard) - { 0, 0 }, // VK_APPS 5D Applications key (Natural keyboard) - { 0, 0 }, // 5E Reserved - { 0, 0 }, // VK_SLEEP 5F Computer Sleep key - { A_KP_0, A_KP_0 }, // VK_NUMPAD0 60 Numeric keypad 0 key - { A_KP_1, A_KP_1 }, // VK_NUMPAD1 61 Numeric keypad 1 key - { A_KP_2, A_KP_2 }, // VK_NUMPAD2 62 Numeric keypad 2 key - { A_KP_3, A_KP_3 }, // VK_NUMPAD3 63 Numeric keypad 3 key - { A_KP_4, A_KP_4 }, // VK_NUMPAD4 64 Numeric keypad 4 key - { A_KP_5, A_KP_5 }, // VK_NUMPAD5 65 Numeric keypad 5 key - { A_KP_6, A_KP_6 }, // VK_NUMPAD6 66 Numeric keypad 6 key - { A_KP_7, A_KP_7 }, // VK_NUMPAD7 67 Numeric keypad 7 key - { A_KP_8, A_KP_8 }, // VK_NUMPAD8 68 Numeric keypad 8 key - { A_KP_9, A_KP_9 }, // VK_NUMPAD9 69 Numeric keypad 9 key - { A_MULTIPLY, A_MULTIPLY }, // VK_MULTIPLY 6A Multiply key - { A_KP_PLUS, A_KP_PLUS }, // VK_ADD 6B Add key - { 0, 0 }, // VK_SEPARATOR 6C Separator key - { A_KP_MINUS, A_KP_MINUS }, // VK_SUBTRACT 6D Subtract key - { A_KP_PERIOD, A_KP_PERIOD }, // VK_DECIMAL 6E Decimal key - { A_DIVIDE, A_DIVIDE }, // VK_DIVIDE 6F Divide key - { A_F1, A_F1 }, // VK_F1 70 F1 key - { A_F2, A_F2 }, // VK_F2 71 F2 key - { A_F3, A_F3 }, // VK_F3 72 F3 key - { A_F4, A_F4 }, // VK_F4 73 F4 key - { A_F5, A_F5 }, // VK_F5 74 F5 key - { A_F6, A_F6 }, // VK_F6 75 F6 key - { A_F7, A_F7 }, // VK_F7 76 F7 key - { A_F8, A_F8 }, // VK_F8 77 F8 key - { A_F9, A_F9 }, // VK_F9 78 F9 key - { A_F10, A_F10 }, // VK_F10 79 F10 key - { A_F11, A_F11 }, // VK_F11 7A F11 key - { A_F12, A_F12 }, // VK_F12 7B F12 key - { 0, 0 }, // VK_F13 7C F13 key - { 0, 0 }, // VK_F14 7D F14 key - { 0, 0 }, // VK_F15 7E F15 key - { 0, 0 }, // VK_F16 7F F16 key - { 0, 0 }, // VK_F17 80H F17 key - { 0, 0 }, // VK_F18 81H F18 key - { 0, 0 }, // VK_F19 82H F19 key - { 0, 0 }, // VK_F20 83H F20 key - { 0, 0 }, // VK_F21 84H F21 key - { 0, 0 }, // VK_F22 85H F22 key - { 0, 0 }, // VK_F23 86H F23 key - { 0, 0 }, // VK_F24 87H F24 key - { 0, 0 }, // 88 Unassigned - { 0, 0 }, // 89 Unassigned - { 0, 0 }, // 8A Unassigned - { 0, 0 }, // 8B Unassigned - { 0, 0 }, // 8C Unassigned - { 0, 0 }, // 8D Unassigned - { 0, 0 }, // 8E Unassigned - { 0, 0 }, // 8F Unassigned - { A_NUMLOCK, A_NUMLOCK }, // VK_NUMLOCK 90 NUM LOCK key - { A_SCROLLLOCK, A_SCROLLLOCK } // VK_SCROLL 91 -}; - -/* -======= -MapKey - -Map from windows to quake keynums -======= -*/ -static int MapKey (ulong key, word wParam) -{ - ulong result, scan, extended; - - // Check for the console key (hard code to the key you would expect) - scan = ( key >> 16 ) & 0xff; - if(scan == CONSOLE_SCAN_CODE) - { - return(A_CONSOLE); - } - - // Try to convert the virtual key directly - result = 0; - extended = (key >> 24) & 1; - if(wParam > 0 && wParam <= VK_SCROLL) - { - // yeuch, but oh well... - // - if ( wParam >= VK_NUMPAD0 && wParam <= VK_NUMPAD9 ) - { - bool bNumlockOn = !!(GetKeyState( VK_NUMLOCK ) & 1); - if ( bNumlockOn ) - { - wParam = 0x30 + (wParam - VK_NUMPAD0); // convert to standard 0..9 - } - } - result = virtualKeyConvert[wParam][extended]; - } - // Get the unshifted ascii code (if any) - if(!result) - { - result = MapVirtualKey(wParam, 2) & 0xff; - } - // Output any debug prints -// if(in_debug && in_debug->integer & 1) -// { -// Com_Printf("WM_KEY: %x : %x : %x\n", key, wParam, result); -// } - return(result); -} - - -/* -==================== -MainWndProc - -main window procedure -==================== -*/ - -#define WM_BUTTON4DOWN (WM_MOUSELAST+2) -#define WM_BUTTON4UP (WM_MOUSELAST+3) -#define MK_BUTTON4L 0x0020 -#define MK_BUTTON4R 0x0040 - -LONG WINAPI MainWndProc ( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - byte code; - - if ( uMsg == MSH_MOUSEWHEEL ) - { - if ( ( ( int ) wParam ) > 0 ) - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, A_MWHEELUP, qtrue, 0, NULL ); - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, A_MWHEELUP, qfalse, 0, NULL ); - } - else - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, A_MWHEELDOWN, qtrue, 0, NULL ); - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, A_MWHEELDOWN, qfalse, 0, NULL ); - } - return DefWindowProc (hWnd, uMsg, wParam, lParam); - } - - switch (uMsg) - { - case WM_MOUSEWHEEL: - // - // - // this chunk of code theoretically only works under NT4 and Win98 - // since this message doesn't exist under Win95 - // - if ( ( short ) HIWORD( wParam ) > 0 ) - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, A_MWHEELUP, qtrue, 0, NULL ); - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, A_MWHEELUP, qfalse, 0, NULL ); - } - else - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, A_MWHEELDOWN, qtrue, 0, NULL ); - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, A_MWHEELDOWN, qfalse, 0, NULL ); - } - break; - - case WM_CREATE: - - g_wv.hWnd = hWnd; - - vid_xpos = Cvar_Get ("vid_xpos", "3", CVAR_ARCHIVE); - vid_ypos = Cvar_Get ("vid_ypos", "22", CVAR_ARCHIVE); - - MSH_MOUSEWHEEL = RegisterWindowMessage("MSWHEEL_ROLLMSG"); - - break; - case WM_DESTROY: - // let sound and input know about this? - g_wv.hWnd = NULL; - break; - - case WM_CLOSE: - Cbuf_ExecuteText( EXEC_APPEND, "quit" ); - break; - - case WM_ACTIVATE: - { - int fActive, fMinimized; - - fActive = LOWORD(wParam); - fMinimized = (BOOL) HIWORD(wParam); - - VID_AppActivate( fActive != WA_INACTIVE, fMinimized); - SNDDMA_Activate( fActive != WA_INACTIVE && !fMinimized ); - } - break; - - case WM_MOVE: - { - int xPos, yPos; - RECT r; - int style; - - if (!Cvar_VariableIntegerValue("r_fullscreen") ) - { - xPos = (short) LOWORD(lParam); // horizontal position - yPos = (short) HIWORD(lParam); // vertical position - - r.left = 0; - r.top = 0; - r.right = 1; - r.bottom = 1; - - style = GetWindowLongPtr( hWnd, GWL_STYLE ); - AdjustWindowRect( &r, style, FALSE ); - - Cvar_SetValue( "vid_xpos", xPos + r.left); - Cvar_SetValue( "vid_ypos", yPos + r.top); - vid_xpos->modified = qfalse; - vid_ypos->modified = qfalse; - if ( g_wv.activeApp ) - { - IN_Activate (qtrue); - } - } - } - break; - -// this is complicated because Win32 seems to pack multiple mouse events into -// one update sometimes, so we always check all states and look for events - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - case WM_MBUTTONDOWN: - case WM_MBUTTONUP: - case WM_MOUSEMOVE: - case WM_BUTTON4DOWN: - case WM_BUTTON4UP: - { - int temp; - - temp = 0; - - if (wParam & MK_LBUTTON) - temp |= 1; - - if (wParam & MK_RBUTTON) - temp |= 2; - - if (wParam & MK_MBUTTON) - temp |= 4; - - if (wParam & MK_BUTTON4L) - temp |= 8; - - if (wParam & MK_BUTTON4R) - temp |= 16; - - IN_MouseEvent (temp); - } - break; - - case WM_INPUT: - { - UINT rawSize; - if ( GetRawInputData( (HRAWINPUT) lParam, RID_INPUT, NULL, &rawSize, sizeof(RAWINPUTHEADER) ) == -1 ) - break; - - RAWINPUT raw; - if ( GetRawInputData( (HRAWINPUT) lParam, RID_INPUT, &raw, &rawSize, sizeof(RAWINPUTHEADER) ) != rawSize ) - break; - - if ( ( raw.header.dwType != RIM_TYPEMOUSE ) || ( raw.data.mouse.usFlags != MOUSE_MOVE_RELATIVE ) ) - break; - - int xPosRelative = raw.data.mouse.lLastX; - int yPosRelative = raw.data.mouse.lLastY; - IN_RawMouseEvent( xPosRelative, yPosRelative ); - } - break; - - case WM_SYSCOMMAND: - if ( (wParam&0xFFF0) == SC_SCREENSAVE || (wParam&0xFFF0) == SC_MONITORPOWER || (wParam&0xFFF0) == SC_KEYMENU ) - { - return 0; - } - break; - - case WM_SYSKEYDOWN: - if ( wParam == VK_RETURN ) //alt-enter - { - if ( !ge || (ge->GameAllowedToSaveHere() && !(Key_GetCatcher( )&KEYCATCH_UI)) ) - {//okay, don't switch if the game is running while in a cinematic or in the menu - Cvar_SetValue( "r_fullscreen", !Cvar_VariableIntegerValue("r_fullscreen") ); - Cbuf_AddText( "vid_restart\n" ); - } - return 0; - } - // fall through - case WM_KEYDOWN: - code = MapKey( lParam, wParam ); - if(code) - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, code, qtrue, 0, NULL ); - } - break; - - case WM_SYSKEYUP: - case WM_KEYUP: - code = MapKey( lParam, wParam ); - if(code) - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, code, qfalse, 0, NULL ); - } - break; - - case WM_CHAR: - if(((lParam >> 16) & 0xff) != CONSOLE_SCAN_CODE) - { - Sys_QueEvent( g_wv.sysMsgTime, SE_CHAR, wParam, 0, 0, NULL ); - } - // Output any debug prints -// if(in_debug && in_debug->integer & 2) -// { -// Com_Printf("WM_CHAR: %x\n", wParam); -// } - break; - - case WM_POWERBROADCAST: - if (wParam == PBT_APMQUERYSUSPEND) - { -#ifndef FINAL_BUILD - Com_Printf("Cannot go into hibernate / standby mode while game is running!\n"); -#endif - return BROADCAST_QUERY_DENY; - } - break; - } - - return DefWindowProc( hWnd, uMsg, wParam, lParam ); -} - diff --git a/codemp/win32/glw_win.h b/codemp/win32/glw_win.h deleted file mode 100644 index 9ddd4d2087..0000000000 --- a/codemp/win32/glw_win.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once -#error You should not be including this file on this platform - -#include - -typedef struct glwstate_s { - WNDPROC wndproc; - - HDC hDC; // handle to device context - HGLRC hGLRC; // handle to GL rendering context - - HINSTANCE hinstOpenGL; // HINSTANCE for the OpenGL library - - qboolean allowdisplaydepthchange; - qboolean pixelFormatSet; - - int desktopBitsPixel; - int desktopWidth, desktopHeight; - - qboolean cdsFullscreen; - - FILE *log_fp; -} glwstate_t; - -extern glwstate_t glw_state; - -bool GL_CheckForExtension(const char *ext); diff --git a/codemp/win32/win_gamma.cpp b/codemp/win32/win_gamma.cpp deleted file mode 100644 index cacb4c3919..0000000000 --- a/codemp/win32/win_gamma.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/* -** WIN_GAMMA.C -*/ -#include -#include "tr_local.h" -#include "qcommon/qcommon.h" -#include "glw_win.h" -#include "win_local.h" - -static unsigned short s_oldHardwareGamma[3][256]; - -/* -** WG_CheckHardwareGamma -** -** Determines if the underlying hardware supports the Win32 gamma correction API. -*/ -void WG_CheckHardwareGamma( void ) -{ - HDC hDC; - - glConfig.deviceSupportsGamma = qfalse; - - if ( !r_ignorehwgamma->integer ) - { - hDC = GetDC( GetDesktopWindow() ); - glConfig.deviceSupportsGamma = (qboolean)GetDeviceGammaRamp( hDC, s_oldHardwareGamma ); - ReleaseDC( GetDesktopWindow(), hDC ); - - if ( glConfig.deviceSupportsGamma ) - { - // - // do a sanity check on the gamma values - // - if ( ( HIBYTE( s_oldHardwareGamma[0][255] ) <= HIBYTE( s_oldHardwareGamma[0][0] ) ) || - ( HIBYTE( s_oldHardwareGamma[1][255] ) <= HIBYTE( s_oldHardwareGamma[1][0] ) ) || - ( HIBYTE( s_oldHardwareGamma[2][255] ) <= HIBYTE( s_oldHardwareGamma[2][0] ) ) ) - { - glConfig.deviceSupportsGamma = qfalse; - Com_Printf (S_COLOR_YELLOW "WARNING: device has broken gamma support, generated gamma.dat\n" ); - } - - // - // make sure that we didn't have a prior crash in the game, and if so we need to - // restore the gamma values to at least a linear value - // - if ( ( HIBYTE( s_oldHardwareGamma[0][181] ) == 255 ) ) - { - int g; - - Com_Printf (S_COLOR_YELLOW "WARNING: suspicious gamma tables, using linear ramp for restoration\n" ); - - for ( g = 0; g < 255; g++ ) - { - s_oldHardwareGamma[0][g] = g << 8; - s_oldHardwareGamma[1][g] = g << 8; - s_oldHardwareGamma[2][g] = g << 8; - } - } - } - } -} - -/* -void mapGammaMax( void ) { - int i, j; - unsigned short table[3][256]; - - // try to figure out what win2k will let us get away with setting - for ( i = 0 ; i < 256 ; i++ ) { - if ( i >= 128 ) { - table[0][i] = table[1][i] = table[2][i] = 0xffff; - } else { - table[0][i] = table[1][i] = table[2][i] = i<<9; - } - } - - for ( i = 0 ; i < 128 ; i++ ) { - for ( j = i*2 ; j < 255 ; j++ ) { - table[0][i] = table[1][i] = table[2][i] = j<<8; - if ( !SetDeviceGammaRamp( glw_state.hDC, table ) ) { - break; - } - } - table[0][i] = table[1][i] = table[2][i] = i<<9; - Com_Printf( "index %i max: %i\n", i, j-1 ); - } -} -*/ - -/* -** GLimp_SetGamma -** -** This routine should only be called if glConfig.deviceSupportsGamma is TRUE -*/ -void GLimp_SetGamma( unsigned char red[256], unsigned char green[256], unsigned char blue[256] ) { - unsigned short table[3][256]; - int i, j; - int ret; - OSVERSIONINFO vinfo; - - if ( !glConfig.deviceSupportsGamma || r_ignorehwgamma->integer || !glw_state.hDC ) { - return; - } - -//mapGammaMax(); - - for ( i = 0; i < 256; i++ ) { - table[0][i] = ( ( ( unsigned short ) red[i] ) << 8 ) | red[i]; - table[1][i] = ( ( ( unsigned short ) green[i] ) << 8 ) | green[i]; - table[2][i] = ( ( ( unsigned short ) blue[i] ) << 8 ) | blue[i]; - } - - // Win2K puts this odd restriction on gamma ramps... - vinfo.dwOSVersionInfoSize = sizeof(vinfo); - GetVersionEx( &vinfo ); - if ( vinfo.dwMajorVersion >= 5 && vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) { - ri->Printf( PRINT_DEVELOPER, "performing gamma clamp.\n" ); - for ( j = 0 ; j < 3 ; j++ ) { - for ( i = 0 ; i < 128 ; i++ ) { - if ( table[j][i] > ( (128+i) << 8 ) ) { - table[j][i] = (128+i) << 8; - } - } - if ( table[j][127] > 254<<8 ) { - table[j][127] = 254<<8; - } - } - } else { - ri->Printf( PRINT_DEVELOPER, "skipping gamma clamp.\n" ); - } - - // enforce constantly increasing - for ( j = 0 ; j < 3 ; j++ ) { - for ( i = 1 ; i < 256 ; i++ ) { - if ( table[j][i] < table[j][i-1] ) { - table[j][i] = table[j][i-1]; - } - } - } - - ret = SetDeviceGammaRamp( glw_state.hDC, table ); - if ( !ret ) { - Com_Printf( "SetDeviceGammaRamp failed.\n" ); - } -} - -/* -** WG_RestoreGamma -*/ -void WG_RestoreGamma( void ) -{ - if ( glConfig.deviceSupportsGamma ) - { - HDC hDC; - - hDC = GetDC( GetDesktopWindow() ); - SetDeviceGammaRamp( hDC, s_oldHardwareGamma ); - ReleaseDC( GetDesktopWindow(), hDC ); - } -} - diff --git a/codemp/win32/win_glimp.cpp b/codemp/win32/win_glimp.cpp deleted file mode 100644 index 26aed7d3fe..0000000000 --- a/codemp/win32/win_glimp.cpp +++ /dev/null @@ -1,1878 +0,0 @@ -/* -** WIN_GLIMP.C -** -** This file contains ALL Win32 specific stuff having to do with the -** OpenGL refresh. When a port is being made the following functions -** must be implemented by the port: -** -** GLimp_EndFrame -** GLimp_Init -** GLimp_LogComment -** GLimp_Shutdown -** -** Note that the GLW_xxx functions are Windows specific GL-subsystem -** related functions that are relevant ONLY to win_glimp.c -*/ -#include -#include "tr_local.h" - -#include "resource.h" -#include "glw_win.h" -#include "win_local.h" -#include "qcommon/stringed_ingame.h" -extern void WG_CheckHardwareGamma( void ); -extern void WG_RestoreGamma( void ); - -typedef enum { - RSERR_OK, - - RSERR_INVALID_FULLSCREEN, - RSERR_INVALID_MODE, - - RSERR_UNKNOWN -} rserr_t; - -#define TRY_PFD_SUCCESS 0 -#define TRY_PFD_FAIL_SOFT 1 -#define TRY_PFD_FAIL_HARD 2 - -#define WINDOW_CLASS_NAME CLIENT_WINDOW_TITLE - -static void GLW_InitExtensions( void ); -static rserr_t GLW_SetMode( int mode, - int colorbits, - qboolean cdsFullscreen ); - -static qboolean s_classRegistered = qfalse; - -// -// function declaration -// -void QGL_EnableLogging( qboolean enable ); -qboolean QGL_Init( const char *dllname ); -void QGL_Shutdown( void ); - -// -// variable declarations -// -glwstate_t glw_state; - -cvar_t *r_allowSoftwareGL; // don't abort out if the pixelformat claims software - -// Whether the current hardware supports dynamic glows/flares. -extern bool g_bDynamicGlowSupported; - -// Hack variable for deciding which kind of texture rectangle thing to do (for some -// reason it acts different on radeon! It's against the spec!). -bool g_bTextureRectangleHack = false; - -/* -** GLW_StartDriverAndSetMode -*/ -static qboolean GLW_StartDriverAndSetMode( int mode, - int colorbits, - qboolean cdsFullscreen ) -{ - rserr_t err; - - err = GLW_SetMode( mode, colorbits, cdsFullscreen ); - - switch ( err ) - { - case RSERR_INVALID_FULLSCREEN: - Com_Printf("...WARNING: fullscreen unavailable in this mode\n" ); - return qfalse; - case RSERR_INVALID_MODE: - Com_Printf ("...WARNING: could not set the given mode (%d)\n", mode ); - return qfalse; - default: - break; - } - return qtrue; -} - -/* -** ChoosePFD -** -** Helper function that replaces ChoosePixelFormat. -*/ -#define MAX_PFDS 256 - -static int GLW_ChoosePFD( HDC hDC, PIXELFORMATDESCRIPTOR *pPFD ) -{ - PIXELFORMATDESCRIPTOR pfds[MAX_PFDS+1]; - int maxPFD = 0; - int i; - int bestMatch = 0; - - Com_Printf ("...GLW_ChoosePFD( %d, %d, %d )\n", ( int ) pPFD->cColorBits, ( int ) pPFD->cDepthBits, ( int ) pPFD->cStencilBits ); - - // count number of PFDs - maxPFD = DescribePixelFormat( hDC, 1, sizeof( PIXELFORMATDESCRIPTOR ), &pfds[0] ); - - if ( maxPFD > MAX_PFDS ) - { - Com_Printf (S_COLOR_YELLOW "...numPFDs > MAX_PFDS (%d > %d)\n", maxPFD, MAX_PFDS ); - maxPFD = MAX_PFDS; - } - - Com_Printf ("...%d PFDs found\n", maxPFD - 1 ); - - // grab information - for ( i = 1; i <= maxPFD; i++ ) - { - DescribePixelFormat( hDC, i, sizeof( PIXELFORMATDESCRIPTOR ), &pfds[i] ); - } - - // look for a best match - for ( i = 1; i <= maxPFD; i++ ) - { - // - // make sure this has hardware acceleration - // - if ( ( pfds[i].dwFlags & PFD_GENERIC_FORMAT ) != 0 ) - { - if ( !r_allowSoftwareGL->integer ) - { - if ( r_verbose->integer ) - { - Com_Printf ("...PFD %d rejected, software acceleration\n", i ); - } - continue; - } - } - - // verify pixel type - if ( pfds[i].iPixelType != PFD_TYPE_RGBA ) - { - if ( r_verbose->integer ) - { - Com_Printf ("...PFD %d rejected, not RGBA\n", i ); - } - continue; - } - - // verify proper flags - if ( ( ( pfds[i].dwFlags & pPFD->dwFlags ) & pPFD->dwFlags ) != pPFD->dwFlags ) - { - if ( r_verbose->integer ) - { - Com_Printf ("...PFD %d rejected, improper flags (%x instead of %x)\n", i, pfds[i].dwFlags, pPFD->dwFlags ); - } - continue; - } - - // verify enough bits - if ( pfds[i].cDepthBits < 15 ) - { - continue; - } - if ( ( pfds[i].cStencilBits < 4 ) && ( pPFD->cStencilBits > 0 ) ) - { - continue; - } - - // - // selection criteria (in order of priority): - // - // PFD_STEREO - // colorBits - // depthBits - // stencilBits - // - if ( bestMatch ) - { - // check stereo - if ( ( pfds[i].dwFlags & PFD_STEREO ) && ( !( pfds[bestMatch].dwFlags & PFD_STEREO ) ) && ( pPFD->dwFlags & PFD_STEREO ) ) - { - bestMatch = i; - continue; - } - - if ( !( pfds[i].dwFlags & PFD_STEREO ) && ( pfds[bestMatch].dwFlags & PFD_STEREO ) && ( pPFD->dwFlags & PFD_STEREO ) ) - { - bestMatch = i; - continue; - } - - // check color - if ( pfds[bestMatch].cColorBits != pPFD->cColorBits ) - { - // prefer perfect match - if ( pfds[i].cColorBits == pPFD->cColorBits ) - { - bestMatch = i; - continue; - } - // otherwise if this PFD has more bits than our best, use it - else if ( pfds[i].cColorBits > pfds[bestMatch].cColorBits ) - { - bestMatch = i; - continue; - } - } - - // check depth - if ( pfds[bestMatch].cDepthBits != pPFD->cDepthBits ) - { - // prefer perfect match - if ( pfds[i].cDepthBits == pPFD->cDepthBits ) - { - bestMatch = i; - continue; - } - // otherwise if this PFD has more bits than our best, use it - else if ( pfds[i].cDepthBits > pfds[bestMatch].cDepthBits ) - { - bestMatch = i; - continue; - } - } - - // check stencil - if ( pfds[bestMatch].cStencilBits != pPFD->cStencilBits ) - { - // prefer perfect match - if ( pfds[i].cStencilBits == pPFD->cStencilBits ) - { - bestMatch = i; - continue; - } - // otherwise if this PFD has more bits than our best, use it - else if ( ( pfds[i].cStencilBits > pfds[bestMatch].cStencilBits ) && - ( pPFD->cStencilBits > 0 ) ) - { - bestMatch = i; - continue; - } - } - } - else - { - bestMatch = i; - } - } - - if ( !bestMatch ) - return 0; - - if ( ( pfds[bestMatch].dwFlags & PFD_GENERIC_FORMAT ) != 0 ) - { - if ( !r_allowSoftwareGL->integer ) - { - Com_Printf ("...no hardware acceleration found\n" ); - return 0; - } - else - { - Com_Printf ("...using software emulation\n" ); - } - } - else if ( pfds[bestMatch].dwFlags & PFD_GENERIC_ACCELERATED ) - { - Com_Printf ("...MCD acceleration found\n" ); - } - else - { - Com_Printf ("...hardware acceleration found\n" ); - } - - *pPFD = pfds[bestMatch]; - - return bestMatch; -} - -/* -** void GLW_CreatePFD -** -** Helper function zeros out then fills in a PFD -*/ -static void GLW_CreatePFD( PIXELFORMATDESCRIPTOR *pPFD, int colorbits, int depthbits, int stencilbits, qboolean stereo ) -{ - PIXELFORMATDESCRIPTOR src = - { - sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd - 1, // version number - PFD_DRAW_TO_WINDOW | // support window - PFD_SUPPORT_OPENGL | // support OpenGL - PFD_DOUBLEBUFFER, // double buffered - PFD_TYPE_RGBA, // RGBA type - 24, // 24-bit color depth - 0, 0, 0, 0, 0, 0, // color bits ignored - 0, // no alpha buffer - 0, // shift bit ignored - 0, // no accumulation buffer - 0, 0, 0, 0, // accum bits ignored - 24, // 24-bit z-buffer - 8, // 8-bit stencil buffer - 0, // no auxiliary buffer - PFD_MAIN_PLANE, // main layer - 0, // reserved - 0, 0, 0 // layer masks ignored - }; - - src.cColorBits = colorbits; - src.cDepthBits = depthbits; - src.cStencilBits = stencilbits; - - if ( stereo ) - { - Com_Printf ("...attempting to use stereo\n" ); - src.dwFlags |= PFD_STEREO; - glConfig.stereoEnabled = qtrue; - } - else - { - glConfig.stereoEnabled = qfalse; - } - - *pPFD = src; -} - -/* -** GLW_MakeContext -*/ -static int GLW_MakeContext( PIXELFORMATDESCRIPTOR *pPFD ) -{ - int pixelformat; - - // - // don't putz around with pixelformat if it's already set (e.g. this is a soft - // reset of the graphics system) - // - if ( !glw_state.pixelFormatSet ) - { - // - // choose, set, and describe our desired pixel format. If we're - // using a minidriver then we need to bypass the GDI functions, - // otherwise use the GDI functions. - // - if ( ( pixelformat = GLW_ChoosePFD( glw_state.hDC, pPFD ) ) == 0 ) - { - Com_Printf ("...GLW_ChoosePFD failed\n"); - return TRY_PFD_FAIL_SOFT; - } - Com_Printf ("...PIXELFORMAT %d selected\n", pixelformat ); - - DescribePixelFormat( glw_state.hDC, pixelformat, sizeof( *pPFD ), pPFD ); - - if ( SetPixelFormat( glw_state.hDC, pixelformat, pPFD ) == FALSE ) - { - Com_Printf ( "...SetPixelFormat failed\n", glw_state.hDC ); - return TRY_PFD_FAIL_SOFT; - } - - glw_state.pixelFormatSet = qtrue; - } - - // - // startup the OpenGL subsystem by creating a context and making it current - // - if ( !glw_state.hGLRC ) - { - Com_Printf ("...creating GL context: " ); - if ( ( glw_state.hGLRC = qwglCreateContext( glw_state.hDC ) ) == 0 ) - { - Com_Printf ( "failed\n"); - - return TRY_PFD_FAIL_HARD; - } - Com_Printf ("succeeded\n" ); - - Com_Printf ("...making context current: " ); - if ( !qwglMakeCurrent( glw_state.hDC, glw_state.hGLRC ) ) - { - qwglDeleteContext( glw_state.hGLRC ); - glw_state.hGLRC = NULL; - Com_Printf ( "failed\n"); - return TRY_PFD_FAIL_HARD; - } - Com_Printf ("succeeded\n" ); - } - - return TRY_PFD_SUCCESS; -} - - -/* -** GLW_InitDriver -** -** - get a DC if one doesn't exist -** - create an HGLRC if one doesn't exist -*/ -static qboolean GLW_InitDriver( int colorbits ) -{ - int tpfd; - int depthbits, stencilbits; - static PIXELFORMATDESCRIPTOR pfd; // save between frames since 'tr' gets cleared - - Com_Printf ("Initializing OpenGL driver\n" ); - - // - // get a DC for our window if we don't already have one allocated - // - if ( glw_state.hDC == NULL ) - { - Com_Printf ("...getting DC: " ); - - if ( ( glw_state.hDC = GetDC( tr.wv->hWnd ) ) == NULL ) - { - Com_Printf ("failed\n" ); - return qfalse; - } - Com_Printf ("succeeded\n" ); - } - - if ( colorbits == 0 ) - { - colorbits = glw_state.desktopBitsPixel; - } - - // - // implicitly assume Z-buffer depth == desktop color depth - // - if ( r_depthbits->integer == 0 ) { - if ( colorbits > 16 ) { - depthbits = 24; - } else { - depthbits = 16; - } - } else { - depthbits = r_depthbits->integer; - } - - // - // do not allow stencil if Z-buffer depth likely won't contain it - // - stencilbits = r_stencilbits->integer; - if ( depthbits < 24 ) - { - stencilbits = 0; - } - - // - // make two attempts to set the PIXELFORMAT - // - - // - // first attempt: r_colorbits, depthbits, and r_stencilbits - // - if ( !glw_state.pixelFormatSet ) - { - GLW_CreatePFD( &pfd, colorbits, depthbits, stencilbits, (qboolean)r_stereo->integer ); - if ( ( tpfd = GLW_MakeContext( &pfd ) ) != TRY_PFD_SUCCESS ) - { - if ( tpfd == TRY_PFD_FAIL_HARD ) - { - Com_Printf (S_COLOR_YELLOW "...failed hard\n" ); - return qfalse; - } - - // - // punt if we've already tried the desktop bit depth and no stencil bits - // - if ( ( r_colorbits->integer == glw_state.desktopBitsPixel ) && - ( stencilbits == 0 ) ) - { - ReleaseDC( tr.wv->hWnd, glw_state.hDC ); - glw_state.hDC = NULL; - - Com_Printf ("...failed to find an appropriate PIXELFORMAT\n" ); - - return qfalse; - } - - // - // second attempt: desktop's color bits and no stencil - // - if ( colorbits > glw_state.desktopBitsPixel ) - { - colorbits = glw_state.desktopBitsPixel; - } - GLW_CreatePFD( &pfd, colorbits, depthbits, 0, (qboolean)r_stereo->integer ); - if ( GLW_MakeContext( &pfd ) != TRY_PFD_SUCCESS ) - { - if ( glw_state.hDC ) - { - ReleaseDC( tr.wv->hWnd, glw_state.hDC ); - glw_state.hDC = NULL; - } - - Com_Printf ("...failed to find an appropriate PIXELFORMAT\n" ); - - return qfalse; - } - } - - /* - ** report if stereo is desired but unavailable - */ - if ( !( pfd.dwFlags & PFD_STEREO ) && ( r_stereo->integer != 0 ) ) - { - Com_Printf ("...failed to select stereo pixel format\n" ); - glConfig.stereoEnabled = qfalse; - } - } - - /* - ** store PFD specifics - */ - glConfig.colorBits = ( int ) pfd.cColorBits; - glConfig.depthBits = ( int ) pfd.cDepthBits; - glConfig.stencilBits = ( int ) pfd.cStencilBits; - - return qtrue; -} - -/* -** GLW_CreateWindow -** -** Responsible for creating the Win32 window and initializing the OpenGL driver. -*/ -#define WINDOW_STYLE (WS_OVERLAPPED|WS_BORDER|WS_CAPTION|WS_VISIBLE) -static qboolean GLW_CreateWindow( int width, int height, int colorbits, qboolean cdsFullscreen ) -{ - RECT r; - cvar_t *vid_xpos, *vid_ypos; - DWORD stylebits; - int x, y, w, h; - DWORD exstyle; - - // - // register the window class if necessary - // - if ( !s_classRegistered ) - { - WNDCLASS wc; - - memset( &wc, 0, sizeof( wc ) ); - - wc.style = 0; - wc.lpfnWndProc = (WNDPROC) glw_state.wndproc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = tr.wv->hInstance; - wc.hIcon = LoadIcon( tr.wv->hInstance, MAKEINTRESOURCE(IDI_ICON1)); - wc.hCursor = LoadCursor (NULL,IDC_ARROW); - wc.hbrBackground = 0;//(HBRUSH__ *)COLOR_GRAYTEXT; - wc.lpszMenuName = 0; - wc.lpszClassName = WINDOW_CLASS_NAME; - - if ( !RegisterClass( &wc ) ) - { - Com_Error( ERR_FATAL, "GLW_CreateWindow: could not register window class, error code: 0x%x", GetLastError() ); - } - s_classRegistered = qtrue; -// Com_Printf ("...registered window class\n" ); - } - - // - // create the HWND if one does not already exist - // - if ( !tr.wv->hWnd ) - { - // - // compute width and height - // - r.left = 0; - r.top = 0; - r.right = width; - r.bottom = height; - - if ( cdsFullscreen ) - { - exstyle = 0;//WS_EX_TOPMOST; - stylebits = WS_SYSMENU|WS_POPUP|WS_VISIBLE; //sysmenu gives you the icon - } - else - { - exstyle = 0; - if ( r_noborder->integer == 0 ) - { - stylebits = WS_SYSMENU|WINDOW_STYLE|WS_MINIMIZEBOX; - } - else - { - stylebits = WS_POPUP|WS_VISIBLE; - } - AdjustWindowRect (&r, stylebits, FALSE); - } - - w = r.right - r.left; - h = r.bottom - r.top; - - if ( cdsFullscreen ) - { - x = 0; - y = 0; - } - else - { - vid_xpos = ri->Cvar_Get ("vid_xpos", "", 0); - vid_ypos = ri->Cvar_Get ("vid_ypos", "", 0); - if ( r_centerWindow->integer == 0 ) - { - x = vid_xpos->integer; - y = vid_ypos->integer; - } - else - { - x = ( glw_state.desktopWidth - w ) / 2; - y = ( glw_state.desktopHeight - h ) / 2; - } - - // adjust window coordinates if necessary - // so that the window is completely on screen - if ( x < 0 ) - x = 0; - if ( y < 0 ) - y = 0; - - if ( w < glw_state.desktopWidth && - h < glw_state.desktopHeight ) - { - if ( x + w > glw_state.desktopWidth ) - x = ( glw_state.desktopWidth - w ); - if ( y + h > glw_state.desktopHeight ) - y = ( glw_state.desktopHeight - h ); - } - } - - tr.wv->hWnd = CreateWindowEx ( - exstyle, - WINDOW_CLASS_NAME, - WINDOW_CLASS_NAME, - stylebits, - x, y, w, h, - NULL, - NULL, - tr.wv->hInstance, - NULL); - - if ( !tr.wv->hWnd ) - { - Com_Error (ERR_FATAL, "GLW_CreateWindow() - Couldn't create window"); - } - - ShowWindow( tr.wv->hWnd, SW_SHOW ); - UpdateWindow( tr.wv->hWnd ); - Com_Printf ("...created window@%d,%d (%dx%d)\n", x, y, w, h ); - } - else - { - Com_Printf ("...window already present, CreateWindowEx skipped\n" ); - } - - if ( !GLW_InitDriver( colorbits ) ) - { - ShowWindow( tr.wv->hWnd, SW_HIDE ); - DestroyWindow( tr.wv->hWnd ); - tr.wv->hWnd = NULL; - - return qfalse; - } - - SetForegroundWindow( tr.wv->hWnd ); - SetFocus( tr.wv->hWnd ); - - return qtrue; -} - -static void PrintCDSError( int value ) -{ - switch ( value ) - { - case DISP_CHANGE_RESTART: - Com_Printf ("restart required\n" ); - break; - case DISP_CHANGE_BADPARAM: - Com_Printf ("bad param\n" ); - break; - case DISP_CHANGE_BADFLAGS: - Com_Printf ("bad flags\n" ); - break; - case DISP_CHANGE_FAILED: - Com_Printf ("DISP_CHANGE_FAILED\n" ); - break; - case DISP_CHANGE_BADMODE: - Com_Printf ("bad mode\n" ); - break; - case DISP_CHANGE_NOTUPDATED: - Com_Printf ("not updated\n" ); - break; - default: - Com_Printf ("unknown error %d\n", value ); - break; - } -} - -/* -** GLW_SetMode -*/ -static rserr_t GLW_SetMode( int mode, - int colorbits, - qboolean cdsFullscreen ) -{ - HDC hDC; - const char *win_fs[] = { "W", "FS" }; - int cdsRet; - DEVMODE dm; - - // - // print out informational messages - // - Com_Printf ("...setting mode %d:", mode ); - if (mode == -2) - { - int OSwidth = GetSystemMetrics (SM_CXSCREEN); - int OSheight = GetSystemMetrics (SM_CYSCREEN); - - // use desktop video resolution - if( OSheight > 0 ) - { - glConfig.vidWidth = OSwidth; - glConfig.vidHeight = OSheight; - } - else - { - glConfig.vidWidth = 640; - glConfig.vidHeight = 480; - Com_Printf( "Cannot determine display resolution, assuming 640x480\n" ); - } - - //TODO Aspect stuff? - //glConfig.windowAspect = (float)glConfig.vidWidth / (float)glConfig.vidHeight; - } - else if ( !R_GetModeInfo( &glConfig.vidWidth, &glConfig.vidHeight, mode ) ) - { - Com_Printf (" invalid mode\n" ); - return RSERR_INVALID_MODE; - } - Com_Printf (" %d %d %s\n", glConfig.vidWidth, glConfig.vidHeight, win_fs[cdsFullscreen] ); - - // - // check our desktop attributes - // - hDC = GetDC( GetDesktopWindow() ); - glw_state.desktopBitsPixel = GetDeviceCaps( hDC, BITSPIXEL ); - glw_state.desktopWidth = GetDeviceCaps( hDC, HORZRES ); - glw_state.desktopHeight = GetDeviceCaps( hDC, VERTRES ); - ReleaseDC( GetDesktopWindow(), hDC ); - - // - // verify desktop bit depth - // - if ( glw_state.desktopBitsPixel < 15 || glw_state.desktopBitsPixel == 24 ) - { - if (!cdsFullscreen && (colorbits == 0 || colorbits >= 15 ) ) - { - // since I can't be bothered trying to mess around with asian codepages and MBCS stuff for a windows - // error box that'll only appear if something's seriously fucked then I'm going to fallback to - // english text when these would otherwise be used... - // - char sErrorHead[1024]; // ott - - extern qboolean Language_IsAsian(void); - Q_strncpyz(sErrorHead, Language_IsAsian() ? "Low Desktop Color Depth" : ri->SE_GetString("CON_TEXT_LOW_DESKTOP_COLOUR_DEPTH"), sizeof(sErrorHead) ); - - const char *psErrorBody = Language_IsAsian() ? - "It is highly unlikely that a correct windowed\n" - "display can be initialized with the current\n" - "desktop display depth. Select 'OK' to try\n" - "anyway. Select 'Cancel' to try a fullscreen\n" - "mode instead." - : - ri->SE_GetString("CON_TEXT_TRY_ANYWAY"); - - if ( MessageBox( NULL, - psErrorBody, - sErrorHead, - MB_OKCANCEL | MB_ICONEXCLAMATION ) != IDOK ) - { - return RSERR_INVALID_MODE; - } - } - } - - // do a CDS if needed - if ( cdsFullscreen ) - { - memset( &dm, 0, sizeof( dm ) ); - - dm.dmSize = sizeof( dm ); - - dm.dmPelsWidth = glConfig.vidWidth; - dm.dmPelsHeight = glConfig.vidHeight; - dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; - - if ( r_displayRefresh->integer != 0 ) - { - dm.dmDisplayFrequency = r_displayRefresh->integer; - dm.dmFields |= DM_DISPLAYFREQUENCY; - } - - // try to change color depth if possible - if ( colorbits != 0 ) - { - if ( glw_state.allowdisplaydepthchange ) - { - dm.dmBitsPerPel = colorbits; - dm.dmFields |= DM_BITSPERPEL; - Com_Printf ("...using colorsbits of %d\n", colorbits ); - } - else - { - Com_Printf ("WARNING:...changing depth not supported on Win95 < pre-OSR 2.x\n" ); - } - } - else - { - Com_Printf ("...using desktop display depth of %d\n", glw_state.desktopBitsPixel ); - } - - // - // if we're already in fullscreen then just create the window - // - if ( glw_state.cdsFullscreen ) - { - Com_Printf ("...already fullscreen, avoiding redundant CDS\n" ); - - if ( !GLW_CreateWindow ( glConfig.vidWidth, glConfig.vidHeight, colorbits, qtrue ) ) - { - Com_Printf ("...restoring display settings\n" ); - ChangeDisplaySettings( 0, 0 ); - return RSERR_INVALID_MODE; - } - } - // - // need to call CDS - // - else - { - Com_Printf ("...calling CDS: " ); - - // try setting the exact mode requested, because some drivers don't report - // the low res modes in EnumDisplaySettings, but still work - if ( ( cdsRet = ChangeDisplaySettings( &dm, CDS_FULLSCREEN ) ) == DISP_CHANGE_SUCCESSFUL ) - { - Com_Printf ("ok\n" ); - - if ( !GLW_CreateWindow ( glConfig.vidWidth, glConfig.vidHeight, colorbits, qtrue) ) - { - Com_Printf ("...restoring display settings\n" ); - ChangeDisplaySettings( 0, 0 ); - return RSERR_INVALID_MODE; - } - - glw_state.cdsFullscreen = qtrue; - } - else - { - // - // the exact mode failed, so scan EnumDisplaySettings for the next largest mode - // - DEVMODE devmode; - int modeNum; - - Com_Printf ("failed, " ); - - PrintCDSError( cdsRet ); - - Com_Printf ("...trying next higher resolution:" ); - - // we could do a better matching job here... - for ( modeNum = 0 ; ; modeNum++ ) { - if ( !EnumDisplaySettings( NULL, modeNum, &devmode ) ) { - modeNum = -1; - break; - } - if ( devmode.dmPelsWidth >= glConfig.vidWidth - && devmode.dmPelsHeight >= glConfig.vidHeight - && devmode.dmBitsPerPel >= 15 ) { - break; - } - } - - if ( modeNum != -1 && ( cdsRet = ChangeDisplaySettings( &devmode, CDS_FULLSCREEN ) ) == DISP_CHANGE_SUCCESSFUL ) - { - Com_Printf (" ok\n" ); - if ( !GLW_CreateWindow( glConfig.vidWidth, glConfig.vidHeight, colorbits, qtrue) ) - { - Com_Printf ("...restoring display settings\n" ); - ChangeDisplaySettings( 0, 0 ); - return RSERR_INVALID_MODE; - } - - glw_state.cdsFullscreen = qtrue; - } - else - { - Com_Printf (" failed, " ); - - PrintCDSError( cdsRet ); - - Com_Printf ("...restoring display settings\n" ); - ChangeDisplaySettings( 0, 0 ); - -/* jfm: i took out the following code to allow fallback to mode 3, with this code it goes half windowed and just doesn't work. - glw_state.cdsFullscreen = qfalse; - glConfig.isFullscreen = qfalse; - if ( !GLW_CreateWindow( glConfig.vidWidth, glConfig.vidHeight, colorbits, qfalse) ) - { - return RSERR_INVALID_MODE; - } -*/ - return RSERR_INVALID_FULLSCREEN; - } - } - } - } - else - { - if ( glw_state.cdsFullscreen ) - { - ChangeDisplaySettings( 0, 0 ); - } - - glw_state.cdsFullscreen = qfalse; - if ( !GLW_CreateWindow( glConfig.vidWidth, glConfig.vidHeight, colorbits, qfalse ) ) - { - return RSERR_INVALID_MODE; - } - } - - // - // success, now check display frequency, although this won't be valid on Voodoo(2) - // - memset( &dm, 0, sizeof( dm ) ); - dm.dmSize = sizeof( dm ); - if ( EnumDisplaySettings( NULL, ENUM_CURRENT_SETTINGS, &dm ) ) - { - glConfig.displayFrequency = dm.dmDisplayFrequency; - } - - // NOTE: this is overridden later on standalone 3Dfx drivers - glConfig.isFullscreen = cdsFullscreen; - - return RSERR_OK; -} - -/* -** GLW_CheckForExtension - - Cannot use strstr directly to differentiate between (for eg) reg_combiners and reg_combiners2 -*/ - -bool GL_CheckForExtension(const char *ext) -{ - const char *ptr = Q_stristr( glConfigExt.originalExtensionString, ext ); - if (ptr == NULL) - return false; - ptr += strlen(ext); - return ((*ptr == ' ') || (*ptr == '\0')); // verify it's complete string. -} - -static const char *wglExtensions = NULL; - -/* WGL version of the above, ASSUMES wglExtensions is non-null */ -bool WGL_CheckForExtension(const char *ext) -{ - const char *ptr = Q_stristr( wglExtensions, ext ); - if (ptr == NULL) - return false; - ptr += strlen(ext); - return ((*ptr == ' ') || (*ptr == '\0')); // verify it's complete string. -} - -//-------------------------------------------- -static void GLW_InitTextureCompression( void ) -{ - bool newer_tc, old_tc; - - // Check for available tc methods. - newer_tc = GL_CheckForExtension("ARB_texture_compression") && GL_CheckForExtension("EXT_texture_compression_s3tc"); - old_tc = GL_CheckForExtension("GL_S3_s3tc"); - - if ( old_tc ) - { - Com_Printf ("...GL_S3_s3tc available\n" ); - } - - if ( newer_tc ) - { - Com_Printf ("...GL_EXT_texture_compression_s3tc available\n" ); - } - - if ( !r_ext_compressed_textures->value ) - { - // Compressed textures are off - glConfig.textureCompression = TC_NONE; - Com_Printf ("...ignoring texture compression\n" ); - } - else if ( !old_tc && !newer_tc ) - { - // Requesting texture compression, but no method found - glConfig.textureCompression = TC_NONE; - Com_Printf ("...no supported texture compression method found\n" ); - Com_Printf (".....ignoring texture compression\n" ); - } - else - { - // some form of supported texture compression is avaiable, so see if the user has a preference - if ( r_ext_preferred_tc_method->integer == TC_NONE ) - { - // No preference, so pick the best - if ( newer_tc ) - { - Com_Printf ("...no tc preference specified\n" ); - Com_Printf (".....using GL_EXT_texture_compression_s3tc\n" ); - glConfig.textureCompression = TC_S3TC_DXT; - } - else - { - Com_Printf ("...no tc preference specified\n" ); - Com_Printf (".....using GL_S3_s3tc\n" ); - glConfig.textureCompression = TC_S3TC; - } - } - else - { - // User has specified a preference, now see if this request can be honored - if ( old_tc && newer_tc ) - { - // both are avaiable, so we can use the desired tc method - if ( r_ext_preferred_tc_method->integer == TC_S3TC ) - { - Com_Printf ("...using preferred tc method, GL_S3_s3tc\n" ); - glConfig.textureCompression = TC_S3TC; - } - else - { - Com_Printf ("...using preferred tc method, GL_EXT_texture_compression_s3tc\n" ); - glConfig.textureCompression = TC_S3TC_DXT; - } - } - else - { - // Both methods are not available, so this gets trickier - if ( r_ext_preferred_tc_method->integer == TC_S3TC ) - { - // Preferring to user older compression - if ( old_tc ) - { - Com_Printf ("...using GL_S3_s3tc\n" ); - glConfig.textureCompression = TC_S3TC; - } - else - { - // Drat, preference can't be honored - Com_Printf ("...preferred tc method, GL_S3_s3tc not available\n" ); - Com_Printf (".....falling back to GL_EXT_texture_compression_s3tc\n" ); - glConfig.textureCompression = TC_S3TC_DXT; - } - } - else - { - // Preferring to user newer compression - if ( newer_tc ) - { - Com_Printf ("...using GL_EXT_texture_compression_s3tc\n" ); - glConfig.textureCompression = TC_S3TC_DXT; - } - else - { - // Drat, preference can't be honored - Com_Printf ("...preferred tc method, GL_EXT_texture_compression_s3tc not available\n" ); - Com_Printf (".....falling back to GL_S3_s3tc\n" ); - glConfig.textureCompression = TC_S3TC; - } - } - } - } - } -} - -/* -** GLW_InitExtensions -*/ -static void GLW_InitExtensions( void ) -{ - if ( !r_allowExtensions->integer ) - { - Com_Printf ("*** IGNORING OPENGL EXTENSIONS ***\n" ); - g_bDynamicGlowSupported = false; - ri->Cvar_Set( "r_DynamicGlow","0" ); - return; - } - - Com_Printf ("Initializing OpenGL extensions\n" ); - - // Select our tc scheme - GLW_InitTextureCompression(); - - // GL_EXT_texture_env_add - glConfig.textureEnvAddAvailable = qfalse; - if ( GL_CheckForExtension( "EXT_texture_env_add" ) ) - { - if ( r_ext_texture_env_add->integer ) - { - glConfig.textureEnvAddAvailable = qtrue; - Com_Printf ("...using GL_EXT_texture_env_add\n" ); - } - else - { - glConfig.textureEnvAddAvailable = qfalse; - Com_Printf ("...ignoring GL_EXT_texture_env_add\n" ); - } - } - else - { - Com_Printf ("...GL_EXT_texture_env_add not found\n" ); - } - - // GL_EXT_texture_filter_anisotropic - glConfig.maxTextureFilterAnisotropy = 0; - if ( GL_CheckForExtension( "EXT_texture_filter_anisotropic" ) ) - { -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF //can't include glext.h here ... sigh - qglGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &glConfig.maxTextureFilterAnisotropy ); - Com_Printf ("...GL_EXT_texture_filter_anisotropic available\n" ); - - if ( r_ext_texture_filter_anisotropic->integer > 1 ) - { - Com_Printf ("...using GL_EXT_texture_filter_anisotropic\n" ); - } - else - { - Com_Printf ("...ignoring GL_EXT_texture_filter_anisotropic\n" ); - } - ri->Cvar_SetValue( "r_ext_texture_filter_anisotropic_avail", glConfig.maxTextureFilterAnisotropy ); - if ( r_ext_texture_filter_anisotropic->value > glConfig.maxTextureFilterAnisotropy ) - { - ri->Cvar_SetValue( "r_ext_texture_filter_anisotropic_avail", glConfig.maxTextureFilterAnisotropy ); - } - } - else - { - Com_Printf ("...GL_EXT_texture_filter_anisotropic not found\n" ); - ri->Cvar_Set( "r_ext_texture_filter_anisotropic_avail", "0" ); - } - - // GL_EXT_clamp_to_edge - glConfig.clampToEdgeAvailable = qtrue; - Com_Printf ("...using GL_EXT_texture_edge_clamp\n" ); - - // WGL_EXT_swap_control - qwglSwapIntervalEXT = ( BOOL (WINAPI *)(int)) qwglGetProcAddress( "wglSwapIntervalEXT" ); - if ( qwglSwapIntervalEXT ) - { - Com_Printf ("...using WGL_EXT_swap_control\n" ); - r_swapInterval->modified = qtrue; // force a set next frame - } - else - { - Com_Printf ("...WGL_EXT_swap_control not found\n" ); - } - - // GL_ARB_multitexture - qglMultiTexCoord2fARB = NULL; - qglActiveTextureARB = NULL; - qglClientActiveTextureARB = NULL; - if ( GL_CheckForExtension( "GL_ARB_multitexture" ) ) - { - if ( r_ext_multitexture->integer ) - { - qglMultiTexCoord2fARB = ( PFNGLMULTITEXCOORD2FARBPROC ) qwglGetProcAddress( "glMultiTexCoord2fARB" ); - qglActiveTextureARB = ( PFNGLACTIVETEXTUREARBPROC ) qwglGetProcAddress( "glActiveTextureARB" ); - qglClientActiveTextureARB = ( PFNGLCLIENTACTIVETEXTUREARBPROC ) qwglGetProcAddress( "glClientActiveTextureARB" ); - - if ( qglActiveTextureARB ) - { - GLint glint = 0; - qglGetIntegerv( GL_MAX_ACTIVE_TEXTURES_ARB, &glint ); - glConfig.maxActiveTextures = (int) glint; - - if ( glConfig.maxActiveTextures > 1 ) - { - Com_Printf ("...using GL_ARB_multitexture\n" ); - } - else - { - qglMultiTexCoord2fARB = NULL; - qglActiveTextureARB = NULL; - qglClientActiveTextureARB = NULL; - Com_Printf ("...not using GL_ARB_multitexture, < 2 texture units\n" ); - } - } - } - else - { - Com_Printf ("...ignoring GL_ARB_multitexture\n" ); - } - } - else - { - Com_Printf ("...GL_ARB_multitexture not found\n" ); - } - - // GL_EXT_compiled_vertex_array - qglLockArraysEXT = NULL; - qglUnlockArraysEXT = NULL; - if ( GL_CheckForExtension( "GL_EXT_compiled_vertex_array" ) ) - { - if ( r_ext_compiled_vertex_array->integer ) - { - Com_Printf ("...using GL_EXT_compiled_vertex_array\n" ); - qglLockArraysEXT = ( void ( APIENTRY * )( int, int ) ) qwglGetProcAddress( "glLockArraysEXT" ); - qglUnlockArraysEXT = ( void ( APIENTRY * )( void ) ) qwglGetProcAddress( "glUnlockArraysEXT" ); - if (!qglLockArraysEXT || !qglUnlockArraysEXT) { - Com_Error (ERR_FATAL, "bad getprocaddress"); - } - } - else - { - Com_Printf ("...ignoring GL_EXT_compiled_vertex_array\n" ); - } - } - else - { - Com_Printf ("...GL_EXT_compiled_vertex_array not found\n" ); - } - - bool bNVRegisterCombiners = false; - // Register Combiners. - if ( GL_CheckForExtension( "GL_NV_register_combiners" ) ) - { - // NOTE: This extension requires multitexture support (over 2 units). - if ( glConfig.maxActiveTextures >= 2 ) - { - bNVRegisterCombiners = true; - // Register Combiners function pointer address load. - AReis - // NOTE: VV guys will _definetly_ not be able to use regcoms. Pixel Shaders are just as good though :-) - // NOTE: Also, this is an nVidia specific extension (of course), so fragment shaders would serve the same purpose - // if we needed some kind of fragment/pixel manipulation support. - qglCombinerParameterfvNV = ( PFNGLCOMBINERPARAMETERFVNV ) qwglGetProcAddress( "glCombinerParameterfvNV" ); - qglCombinerParameterivNV = ( PFNGLCOMBINERPARAMETERIVNV ) qwglGetProcAddress( "glCombinerParameterivNV" ); - qglCombinerParameterfNV = ( PFNGLCOMBINERPARAMETERFNV ) qwglGetProcAddress( "glCombinerParameterfNV" ); - qglCombinerParameteriNV = ( PFNGLCOMBINERPARAMETERINV ) qwglGetProcAddress( "glCombinerParameteriNV" ); - qglCombinerInputNV = ( PFNGLCOMBINERINPUTNV ) qwglGetProcAddress( "glCombinerInputNV" ); - qglCombinerOutputNV = ( PFNGLCOMBINEROUTPUTNV ) qwglGetProcAddress( "glCombinerOutputNV" ); - qglFinalCombinerInputNV = ( PFNGLFINALCOMBINERINPUTNV ) qwglGetProcAddress( "glFinalCombinerInputNV" ); - qglGetCombinerInputParameterfvNV = ( PFNGLGETCOMBINERINPUTPARAMETERFVNV ) qwglGetProcAddress( "glGetCombinerInputParameterfvNV" ); - qglGetCombinerInputParameterivNV = ( PFNGLGETCOMBINERINPUTPARAMETERIVNV ) qwglGetProcAddress( "glGetCombinerInputParameterivNV" ); - qglGetCombinerOutputParameterfvNV = ( PFNGLGETCOMBINEROUTPUTPARAMETERFVNV ) qwglGetProcAddress( "glGetCombinerOutputParameterfvNV" ); - qglGetCombinerOutputParameterivNV = ( PFNGLGETCOMBINEROUTPUTPARAMETERIVNV ) qwglGetProcAddress( "glGetCombinerOutputParameterivNV" ); - qglGetFinalCombinerInputParameterfvNV = ( PFNGLGETFINALCOMBINERINPUTPARAMETERFVNV ) qwglGetProcAddress( "glGetFinalCombinerInputParameterfvNV" ); - qglGetFinalCombinerInputParameterivNV = ( PFNGLGETFINALCOMBINERINPUTPARAMETERIVNV ) qwglGetProcAddress( "glGetFinalCombinerInputParameterivNV" ); - - // Validate the functions we need. - if ( !qglCombinerParameterfvNV || !qglCombinerParameterivNV || !qglCombinerParameterfNV || !qglCombinerParameteriNV || !qglCombinerInputNV || - !qglCombinerOutputNV || !qglFinalCombinerInputNV || !qglGetCombinerInputParameterfvNV || !qglGetCombinerInputParameterivNV || - !qglGetCombinerOutputParameterfvNV || !qglGetCombinerOutputParameterivNV || !qglGetFinalCombinerInputParameterfvNV || !qglGetFinalCombinerInputParameterivNV ) - { - bNVRegisterCombiners = false; - qglCombinerParameterfvNV = NULL; - qglCombinerParameteriNV = NULL; - Com_Printf ("...GL_NV_register_combiners failed\n" ); - } - } - else - { - bNVRegisterCombiners = false; - Com_Printf ("...ignoring GL_NV_register_combiners\n" ); - } - } - else - { - bNVRegisterCombiners = false; - Com_Printf ("...GL_NV_register_combiners not found\n" ); - } - - // NOTE: Vertex and Fragment Programs are very dependant on each other - this is actually a - // good thing! So, just check to see which we support (one or the other) and load the shared - // function pointers. ARB rocks! - - // Vertex Programs. - bool bARBVertexProgram = false; - if ( GL_CheckForExtension( "GL_ARB_vertex_program" ) ) - { - bARBVertexProgram = true; - } - else - { - bARBVertexProgram = false; - Com_Printf ("...GL_ARB_vertex_program not found\n" ); - } - - // Fragment Programs. - bool bARBFragmentProgram = false; - if ( GL_CheckForExtension( "GL_ARB_fragment_program" ) ) - { - bARBFragmentProgram = true; - } - else - { - bARBFragmentProgram = false; - Com_Printf ("...GL_ARB_fragment_program not found\n" ); - } - - // If we support one or the other, load the shared function pointers. - if ( bARBVertexProgram || bARBFragmentProgram ) - { - qglProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) qwglGetProcAddress("glProgramStringARB"); - qglBindProgramARB = (PFNGLBINDPROGRAMARBPROC) qwglGetProcAddress("glBindProgramARB"); - qglDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) qwglGetProcAddress("glDeleteProgramsARB"); - qglGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) qwglGetProcAddress("glGenProgramsARB"); - qglProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC) qwglGetProcAddress("glProgramEnvParameter4dARB"); - qglProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC) qwglGetProcAddress("glProgramEnvParameter4dvARB"); - qglProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC) qwglGetProcAddress("glProgramEnvParameter4fARB"); - qglProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC) qwglGetProcAddress("glProgramEnvParameter4fvARB"); - qglProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) qwglGetProcAddress("glProgramLocalParameter4dARB"); - qglProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) qwglGetProcAddress("glProgramLocalParameter4dvARB"); - qglProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC) qwglGetProcAddress("glProgramLocalParameter4fARB"); - qglProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) qwglGetProcAddress("glProgramLocalParameter4fvARB"); - qglGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC) qwglGetProcAddress("glGetProgramEnvParameterdvARB"); - qglGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC) qwglGetProcAddress("glGetProgramEnvParameterfvARB"); - qglGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) qwglGetProcAddress("glGetProgramLocalParameterdvARB"); - qglGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) qwglGetProcAddress("glGetProgramLocalParameterfvARB"); - qglGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) qwglGetProcAddress("glGetProgramivARB"); - qglGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC) qwglGetProcAddress("glGetProgramStringARB"); - qglIsProgramARB = (PFNGLISPROGRAMARBPROC) qwglGetProcAddress("glIsProgramARB"); - - // Validate the functions we need. - if ( !qglProgramStringARB || !qglBindProgramARB || !qglDeleteProgramsARB || !qglGenProgramsARB || - !qglProgramEnvParameter4dARB || !qglProgramEnvParameter4dvARB || !qglProgramEnvParameter4fARB || - !qglProgramEnvParameter4fvARB || !qglProgramLocalParameter4dARB || !qglProgramLocalParameter4dvARB || - !qglProgramLocalParameter4fARB || !qglProgramLocalParameter4fvARB || !qglGetProgramEnvParameterdvARB || - !qglGetProgramEnvParameterfvARB || !qglGetProgramLocalParameterdvARB || !qglGetProgramLocalParameterfvARB || - !qglGetProgramivARB || !qglGetProgramStringARB || !qglIsProgramARB ) - { - bARBVertexProgram = false; - bARBFragmentProgram = false; - qglGenProgramsARB = NULL; //clear ptrs that get checked - qglProgramEnvParameter4fARB = NULL; - Com_Printf ("...ignoring GL_ARB_vertex_program\n" ); - Com_Printf ("...ignoring GL_ARB_fragment_program\n" ); - } - } - - // Figure out which texture rectangle extension to use. - bool bTexRectSupported = false; - if ( Q_stricmpn( glConfig.vendor_string, "ATI Technologies",16 )==0 - && Q_stricmpn( glConfig.version_string, "1.3.3",5 )==0 - && glConfig.version_string[5] < '9' ) //1.3.34 and 1.3.37 and 1.3.38 are broken for sure, 1.3.39 is not - { - g_bTextureRectangleHack = true; - } - - if ( GL_CheckForExtension( "GL_NV_texture_rectangle" ) || GL_CheckForExtension( "GL_EXT_texture_rectangle" ) ) - { - bTexRectSupported = true; - } - - // OK, so not so good to put this here, but no one else uses it!!! -AReis - typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); - PFNWGLGETEXTENSIONSSTRINGARBPROC qwglGetExtensionsStringARB; - qwglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) qwglGetProcAddress("wglGetExtensionsStringARB"); - - bool bHasPixelFormat = false; - bool bHasRenderTexture = false; - - // Get the WGL extensions string. - if ( qwglGetExtensionsStringARB ) - { - wglExtensions = qwglGetExtensionsStringARB( glw_state.hDC ); - } - - // This externsion is used to get the wgl extension string. - if ( wglExtensions ) - { - // Pixel Format. - if ( WGL_CheckForExtension( "WGL_ARB_pixel_format" ) ) - { - qwglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC) qwglGetProcAddress("wglGetPixelFormatAttribivARB"); - qwglGetPixelFormatAttribfvARB = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC) qwglGetProcAddress("wglGetPixelFormatAttribfvARB"); - qwglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC) qwglGetProcAddress("wglChoosePixelFormatARB"); - - // Validate the functions we need. - if ( !qwglGetPixelFormatAttribivARB || !qwglGetPixelFormatAttribfvARB || !qwglChoosePixelFormatARB ) - { - Com_Printf ("...ignoring WGL_ARB_pixel_format\n" ); - } - else - { - bHasPixelFormat = true; - } - } - else - { - Com_Printf ("...ignoring WGL_ARB_pixel_format\n" ); - } - - // Offscreen pixel-buffer. - // NOTE: VV guys can use the equivelant SetRenderTarget() with the correct texture surfaces. - bool bWGLARBPbuffer = false; - if ( WGL_CheckForExtension( "WGL_ARB_pbuffer" ) && bHasPixelFormat ) - { - bWGLARBPbuffer = true; - qwglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC) qwglGetProcAddress("wglCreatePbufferARB"); - qwglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC) qwglGetProcAddress("wglGetPbufferDCARB"); - qwglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC) qwglGetProcAddress("wglReleasePbufferDCARB"); - qwglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC) qwglGetProcAddress("wglDestroyPbufferARB"); - qwglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC) qwglGetProcAddress("wglQueryPbufferARB"); - - // Validate the functions we need. - if ( !qwglCreatePbufferARB || !qwglGetPbufferDCARB || !qwglReleasePbufferDCARB || !qwglDestroyPbufferARB || !qwglQueryPbufferARB ) - { - bWGLARBPbuffer = false; - Com_Printf ("...WGL_ARB_pbuffer failed\n" ); - } - } - else - { - bWGLARBPbuffer = false; - Com_Printf ("...WGL_ARB_pbuffer not found\n" ); - } - - // Render-Texture (requires pbuffer ext (and it's dependancies of course). - if ( WGL_CheckForExtension( "WGL_ARB_render_texture" ) && bWGLARBPbuffer ) - { - qwglBindTexImageARB = (PFNWGLBINDTEXIMAGEARBPROC) qwglGetProcAddress("wglBindTexImageARB"); - qwglReleaseTexImageARB = (PFNWGLRELEASETEXIMAGEARBPROC) qwglGetProcAddress("wglReleaseTexImageARB"); - qwglSetPbufferAttribARB = (PFNWGLSETPBUFFERATTRIBARBPROC) qwglGetProcAddress("wglSetPbufferAttribARB"); - - // Validate the functions we need. - if ( !qwglCreatePbufferARB || !qwglGetPbufferDCARB || !qwglReleasePbufferDCARB || !qwglDestroyPbufferARB || !qwglQueryPbufferARB ) - { - Com_Printf ("...ignoring WGL_ARB_render_texture\n" ); - } - else - { - bHasRenderTexture = true; - } - } - else - { - Com_Printf ("...ignoring WGL_ARB_render_texture\n" ); - } - } - - // Find out how many general combiners they have. - #define GL_MAX_GENERAL_COMBINERS_NV 0x854D - GLint iNumGeneralCombiners = 0; - if(bNVRegisterCombiners) - qglGetIntegerv( GL_MAX_GENERAL_COMBINERS_NV, &iNumGeneralCombiners ); - - // Only allow dynamic glows/flares if they have the hardware - if ( bTexRectSupported && bARBVertexProgram && bHasRenderTexture && qglActiveTextureARB && glConfig.maxActiveTextures >= 4 && - ( ( bNVRegisterCombiners && iNumGeneralCombiners >= 2 ) || bARBFragmentProgram ) ) - { - g_bDynamicGlowSupported = true; - // this would overwrite any achived setting gwg - // ri.Cvar_Set( "r_DynamicGlow", "1" ); - } - else - { - g_bDynamicGlowSupported = false; - ri->Cvar_Set( "r_DynamicGlow","0" ); - } -} - -/* -** GLW_CheckOSVersion -*/ -static qboolean GLW_CheckOSVersion( void ) -{ -#define OSR2_BUILD_NUMBER 1111 - - OSVERSIONINFO vinfo; - - vinfo.dwOSVersionInfoSize = sizeof(vinfo); - - glw_state.allowdisplaydepthchange = qfalse; - - if ( GetVersionEx( &vinfo) ) - { - if ( vinfo.dwMajorVersion > 4 ) - { - glw_state.allowdisplaydepthchange = qtrue; - } - else if ( vinfo.dwMajorVersion == 4 ) - { - if ( vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) - { - glw_state.allowdisplaydepthchange = qtrue; - } - else if ( vinfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) - { - if ( LOWORD( vinfo.dwBuildNumber ) >= OSR2_BUILD_NUMBER ) - { - glw_state.allowdisplaydepthchange = qtrue; - } - } - } - } - else - { - Com_Printf ("GLW_CheckOSVersion() - GetVersionEx failed\n" ); - return qfalse; - } - - return qtrue; -} - -/* -** GLW_LoadOpenGL -** -** GLimp_win.c internal function that attempts to load and use -** a specific OpenGL DLL. -*/ -static qboolean GLW_LoadOpenGL( ) -{ - qboolean cdsFullscreen; - - // - // load the driver and bind our function pointers to it - // - if ( QGL_Init( "opengl32" ) ) - { - cdsFullscreen = (qboolean)r_fullscreen->integer; - - // create the window and set up the context - if ( !GLW_StartDriverAndSetMode( r_mode->integer, r_colorbits->integer, cdsFullscreen ) ) - { - // if we're on a 24/32-bit desktop and we're going fullscreen on an ICD, - // try it again but with a 16-bit desktop - if ( r_colorbits->integer != 16 || - cdsFullscreen != qtrue || - r_mode->integer != 3 ) - { - if ( !GLW_StartDriverAndSetMode( 3, 16, qtrue ) ) - { - goto fail; - } - } - } - -#ifdef _CRAZY_ATTRIB_DEBUG - //I can get away with this because we don't actually use push/pop attrib anywhere else. - qglPushAttrib(GL_ACCUM_BUFFER_BIT|GL_COLOR_BUFFER_BIT|GL_CURRENT_BIT|GL_DEPTH_BUFFER_BIT| - GL_ENABLE_BIT|GL_EVAL_BIT|GL_FOG_BIT|GL_HINT_BIT|GL_LIGHTING_BIT|GL_LINE_BIT|GL_LIST_BIT| - GL_PIXEL_MODE_BIT|GL_POINT_BIT|GL_POLYGON_BIT|GL_POLYGON_STIPPLE_BIT|GL_SCISSOR_BIT| - GL_STENCIL_BUFFER_BIT|GL_TEXTURE_BIT|GL_TRANSFORM_BIT|GL_VIEWPORT_BIT); -#endif - - return qtrue; - } -fail: - - QGL_Shutdown(); - - return qfalse; -} - -/* -** GLimp_EndFrame -*/ -void GLimp_EndFrame (void) -{ - // - // swapinterval stuff - // - if ( r_swapInterval->modified ) { - r_swapInterval->modified = qfalse; - - if ( !glConfig.stereoEnabled ) { // why? - if ( qwglSwapIntervalEXT ) { - qwglSwapIntervalEXT( r_swapInterval->integer ); - } - } - } - - - // don't flip if drawing to front buffer - //if ( Q_stricmp( r_drawBuffer->string, "GL_FRONT" ) != 0 ) - { - SwapBuffers( glw_state.hDC ); - } - - // check logging - QGL_EnableLogging( (qboolean)r_logFile->integer ); -} - -static void GLW_StartOpenGL( void ) -{ - // - // load and initialize the specific OpenGL driver - // - if ( !GLW_LoadOpenGL() ) - { - Com_Error( ERR_FATAL, "GLW_StartOpenGL() - could not load OpenGL subsystem\n" ); - } -} - -// Truncates the GL extensions string by only allowing up to 'maxExtensions' extensions in the string. -static const char *TruncateGLExtensionsString (const char *extensionsString, int maxExtensions) -{ - const char *p = extensionsString; - const char *q; - int numExtensions = 0; - size_t extensionsLen = strlen (extensionsString); - - char *truncatedExtensions; - - while ( (q = strchr (p, ' ')) != NULL && numExtensions <= maxExtensions ) - { - p = q + 1; - numExtensions++; - } - - if ( q != NULL ) - { - // We still have more extensions. We'll call this the end - - extensionsLen = p - extensionsString - 1; - } - - truncatedExtensions = (char *)ri->Hunk_Alloc (extensionsLen + 1, h_low); - Q_strncpyz (truncatedExtensions, extensionsString, extensionsLen + 1); - - return truncatedExtensions; -} - -/* -** GLimp_Init -** -** This is the platform specific OpenGL initialization function. It -** is responsible for loading OpenGL, initializing it, setting -** extensions, creating a window of the appropriate size, doing -** fullscreen manipulations, etc. Its overall responsibility is -** to make sure that a functional OpenGL subsystem is operating -** when it returns to the ref. -*/ -void GLimp_Init( void ) -{ - char buf[MAX_STRING_CHARS]; - cvar_t *lastValidRenderer = ri->Cvar_Get( "r_lastValidRenderer", "(uninitialized)", CVAR_ARCHIVE ); - cvar_t *cv; - -// Com_Printf ("Initializing OpenGL subsystem\n" ); - - // - // check OS version to see if we can do fullscreen display changes - // - if ( !GLW_CheckOSVersion() ) - { - Com_Error( ERR_FATAL, "GLimp_Init() - incorrect operating system\n" ); - } - - // save off hInstance and wndproc - cv = ri->Cvar_Get( "win_hinstance", "", 0 ); - sscanf( cv->string, "%p", (uintptr_t *)&tr.wv->hInstance ); - - cv = ri->Cvar_Get( "win_wndproc", "", 0 ); - sscanf( cv->string, "%p", (uintptr_t *)&glw_state.wndproc ); - - r_allowSoftwareGL = ri->Cvar_Get( "r_allowSoftwareGL", "0", CVAR_LATCH ); - - // load appropriate DLL and initialize subsystem - GLW_StartOpenGL(); - - // get our config strings - glConfig.vendor_string = (const char *) qglGetString (GL_VENDOR); - glConfig.renderer_string = (const char *) qglGetString (GL_RENDERER); - glConfig.version_string = (const char *) qglGetString (GL_VERSION); - glConfig.extensions_string = (const char *) qglGetString (GL_EXTENSIONS); - - if (!glConfig.vendor_string || !glConfig.renderer_string || !glConfig.version_string || !glConfig.extensions_string) - { - Com_Error( ERR_FATAL, "GLimp_Init() - Invalid GL Driver\n" ); - } - - glConfigExt.originalExtensionString = glConfig.extensions_string; - glConfig.extensions_string = TruncateGLExtensionsString (glConfigExt.originalExtensionString, 128); - - // OpenGL driver constants - qglGetIntegerv( GL_MAX_TEXTURE_SIZE, &glConfig.maxTextureSize ); - // stubbed or broken drivers may have reported 0... - if ( glConfig.maxTextureSize <= 0 ) - { - glConfig.maxTextureSize = 0; - } - - // - // chipset specific configuration - // - Q_strncpyz( buf, glConfig.renderer_string, sizeof(buf) ); - strlwr( buf ); - - // - // NOTE: if changing cvars, do it within this block. This allows them - // to be overridden when testing driver fixes, etc. but only sets - // them to their default state when the hardware is first installed/run. - // - if ( Q_stricmp( lastValidRenderer->string, glConfig.renderer_string ) ) - { - if (ri->Sys_LowPhysicalMemory()) - { - ri->Cvar_Set("s_khz", "11");// this will get called before S_Init - } - //reset to defaults - ri->Cvar_Set( "r_picmip", "1" ); - - // Savage3D and Savage4 should always have trilinear enabled - if ( strstr( buf, "savage3d" ) || strstr( buf, "s3 savage4" ) || strstr( buf, "geforce" ) || strstr( buf, "quadro" ) ) - { - ri->Cvar_Set( "r_texturemode", "GL_LINEAR_MIPMAP_LINEAR" ); - } - else - { - ri->Cvar_Set( "r_textureMode", "GL_LINEAR_MIPMAP_NEAREST" ); - } - - if ( strstr( buf, "kyro" ) ) - { - ri->Cvar_Set( "r_ext_texture_filter_anisotropic", "0"); //KYROs have it avail, but suck at it! - ri->Cvar_Set( "r_ext_preferred_tc_method", "1"); //(Use DXT1 instead of DXT5 - same quality but much better performance on KYRO) - } - if ( strstr( buf, "geforce2" ) ) - { - ri->Cvar_Set( "cg_renderToTextureFX", "0"); // slow to zero bug fix - } - - if ( strstr( buf, "radeon 9000" ) ) - { - ri->Cvar_Set( "cg_renderToTextureFX", "0"); // white texture bug - } - - GLW_InitExtensions(); //get the values for test below - //this must be a really sucky card! - if ( (glConfig.textureCompression == TC_NONE) || (glConfig.maxActiveTextures < 2) || (glConfig.maxTextureSize <= 512) ) - { - ri->Cvar_Set( "r_picmip", "2"); - ri->Cvar_Set( "r_colorbits", "16"); - ri->Cvar_Set( "r_texturebits", "16"); - ri->Cvar_Set( "r_mode", "3"); //force 640 - ri->Cmd_ExecuteString ("exec low.cfg\n"); //get the rest which can be pulled in after init - } - } - - ri->Cvar_Set( "r_lastValidRenderer", glConfig.renderer_string ); - GLW_InitExtensions(); - - WG_CheckHardwareGamma(); -} - -/* -** GLimp_Shutdown -** -** This routine does all OS specific shutdown procedures for the OpenGL -** subsystem. -*/ -void GLimp_Shutdown( void ) -{ -// const char *strings[] = { "soft", "hard" }; -// const char *success[] = { "failed", "success" }; - int retVal; - - // FIXME: Brian, we need better fallbacks from partially initialized failures - if ( !qwglMakeCurrent ) { - return; - } - - Com_Printf ("Shutting down OpenGL subsystem\n" ); - - // restore gamma. We do this first because 3Dfx's extension needs a valid OGL subsystem - WG_RestoreGamma(); - - // set current context to NULL - if ( qwglMakeCurrent ) - { - retVal = qwglMakeCurrent( NULL, NULL ) != 0; - -// Com_Printf ("...wglMakeCurrent( NULL, NULL ): %s\n", success[retVal] ); - } - - // delete HGLRC - if ( glw_state.hGLRC ) - { - retVal = qwglDeleteContext( glw_state.hGLRC ) != 0; -// Com_Printf ("...deleting GL context: %s\n", success[retVal] ); - glw_state.hGLRC = NULL; - } - - // release DC - if ( glw_state.hDC ) - { - retVal = ReleaseDC( tr.wv->hWnd, glw_state.hDC ) != 0; -// Com_Printf ("...releasing DC: %s\n", success[retVal] ); - glw_state.hDC = NULL; - } - - // destroy window - if ( tr.wv->hWnd ) - { -// Com_Printf ("...destroying window\n" ); - ShowWindow( tr.wv->hWnd, SW_HIDE ); - DestroyWindow( tr.wv->hWnd ); - tr.wv->hWnd = NULL; - glw_state.pixelFormatSet = qfalse; - } - - // unregister the window class - if ( s_classRegistered ) - { - if ( FAILED (UnregisterClass (WINDOW_CLASS_NAME, tr.wv->hInstance)) ) - { - Com_Error (ERR_FATAL, "GLimp_Shutdown: could not unregister window class, error code 0x%x", GetLastError()); - } - s_classRegistered = qfalse; - } - - // close the r_logFile - if ( glw_state.log_fp ) - { - fclose( glw_state.log_fp ); - glw_state.log_fp = 0; - } - - // reset display settings - if ( glw_state.cdsFullscreen ) - { -// Com_Printf ("...resetting display\n" ); - ChangeDisplaySettings( 0, 0 ); - glw_state.cdsFullscreen = qfalse; - } - - // shutdown QGL subsystem - QGL_Shutdown(); - - memset( &glConfig, 0, sizeof( glConfig ) ); - memset( &glState, 0, sizeof( glState ) ); -} - -/* -=============== -GLimp_Minimize - -Minimize the game so that user is back at the desktop -=============== -*/ -void GLimp_Minimize(void) -{ - if ( tr.wv->hWnd ) - { - // Todo with viewlog maybe should try to unminimize but mer. - ShowWindow( tr.wv->hWnd, SW_MINIMIZE ); - } -} - -/* -** GLimp_LogComment -*/ -void GLimp_LogComment( char *comment ) -{ - if ( glw_state.log_fp ) { - fprintf( glw_state.log_fp, "%s", comment ); - } -} diff --git a/codemp/win32/win_input.cpp b/codemp/win32/win_input.cpp deleted file mode 100644 index 02ece924c7..0000000000 --- a/codemp/win32/win_input.cpp +++ /dev/null @@ -1,1685 +0,0 @@ -// win_input.c -- win32 mouse and joystick code - -#include "client/client.h" -#include "win_local.h" - -#ifndef NO_XINPUT -#include -#endif - -typedef struct WinMouseVars_s { - int oldButtonState; - - qboolean mouseActive; - qboolean mouseInitialized; -} WinMouseVars_t; - -static WinMouseVars_t s_wmv; - -static int window_center_x, window_center_y; - -// -// MIDI definitions -// -static void IN_StartupMIDI( void ); -static void IN_ShutdownMIDI( void ); - -#define MAX_MIDIIN_DEVICES 8 - -typedef struct MidiInfo_s { - int numDevices; - MIDIINCAPS caps[MAX_MIDIIN_DEVICES]; - - HMIDIIN hMidiIn; -} MidiInfo_t; - -static MidiInfo_t s_midiInfo; - -// -// Joystick definitions -// -#define JOY_MAX_AXES 6 // X, Y, Z, R, U, V - -typedef struct joystickInfo_s { - qboolean avail; - int id; // joystick number - JOYCAPS jc; - - int oldbuttonstate; - int oldpovstate; - - JOYINFOEX ji; -} joystickInfo_t; - -static joystickInfo_t joy; - - -cvar_t *in_midi; -cvar_t *in_midiport; -cvar_t *in_midichannel; -cvar_t *in_mididevice; - -#ifndef NO_XINPUT -cvar_t *xin_invertThumbsticks; -cvar_t *xin_rumbleScale; - -cvar_t *xin_invertLookX; -cvar_t *xin_invertLookY; -#endif - -cvar_t *in_mouse; -cvar_t *in_joystick; -cvar_t *in_joyBallScale; -cvar_t *in_debugJoystick; -cvar_t *joy_threshold; -cvar_t *joy_xbutton; -cvar_t *joy_ybutton; - -qboolean in_appactive; - -// forward-referenced functions -void IN_StartupJoystick (void); -void IN_JoyMove(void); -#ifndef NO_XINPUT -void IN_UnloadXInput ( void ); -#endif - -static void MidiInfo_f( void ); - -/* -============================================================ - -RAW INPUT MOUSE CONTROL - -============================================================ -*/ - -#ifndef HID_USAGE_PAGE_GENERIC -#define HID_USAGE_PAGE_GENERIC ((USHORT) 0x01) -#endif - -#ifndef HID_USAGE_GENERIC_MOUSE -#define HID_USAGE_GENERIC_MOUSE ((USHORT) 0x02) -#endif - -static qboolean rawMouseInitialized = qfalse; -static LONG rawDeltaX = 0; -static LONG rawDeltaY = 0; - -/* -================ -IN_InitRawMouse -================ -*/ -qboolean IN_InitRawMouse( void ) -{ - RAWINPUTDEVICE Rid[1]; - - Com_Printf( "Initializing raw input...\n"); - - Rid[0].usUsagePage = HID_USAGE_PAGE_GENERIC; - Rid[0].usUsage = HID_USAGE_GENERIC_MOUSE; - Rid[0].dwFlags = 0; - Rid[0].hwndTarget = 0; - - if ( RegisterRawInputDevices( Rid, 1, sizeof(Rid[0]) ) == FALSE ) - { - Com_Printf ("Couldn't register raw input devices\n"); - return qfalse; - } - - Com_Printf( "Raw input initialized.\n"); - rawMouseInitialized = qtrue; - return qtrue; -} - -/* -================ -IN_ShutdownRawMouse -================ -*/ -void IN_ShutdownRawMouse( void ) -{ - if ( rawMouseInitialized ) - { - RAWINPUTDEVICE Rid[1]; - - Rid[0].usUsagePage = HID_USAGE_PAGE_GENERIC; - Rid[0].usUsage = HID_USAGE_GENERIC_MOUSE; - Rid[0].dwFlags = RIDEV_REMOVE; - Rid[0].hwndTarget = 0; - - if ( RegisterRawInputDevices( Rid, 1, sizeof(Rid[0]) ) == FALSE ) - { - Com_Printf ("Couldn't un-register raw input devices\n"); - } - - rawMouseInitialized = qfalse; - } -} - -/* -================ -IN_ActivateRawMouse -================ -*/ -void IN_ActivateRawMouse( void ) -{ - rawDeltaX = rawDeltaY = 0; -} - -/* -================ -IN_DeactivateRawMouse -================ -*/ -void IN_DeactivateRawMouse( void ) -{ - rawDeltaX = rawDeltaY = 0; -} - -/* -================ -IN_RawMouse -================ -*/ -void IN_RawMouse( int *mx, int *my ) -{ - // force the mouse to the center, just to be consistent with default mouse behaviour - SetCursorPos (window_center_x, window_center_y); - - *mx = rawDeltaX; - *my = rawDeltaY; - rawDeltaX = rawDeltaY = 0; -} - -/* -================ -IN_RawMouseEvent -================ -*/ -void IN_RawMouseEvent( int lastX, int lastY ) -{ - rawDeltaX += lastX; - rawDeltaY += lastY; -} - - -/* -============================================================ - -WIN32 MOUSE CONTROL - -============================================================ -*/ - -/* -================ -IN_InitWin32Mouse -================ -*/ -void IN_InitWin32Mouse( void ) -{ -} - -/* -================ -IN_ShutdownWin32Mouse -================ -*/ -void IN_ShutdownWin32Mouse( void ) { -} - -/* -================ -IN_ActivateWin32Mouse -================ -*/ -void IN_ActivateWin32Mouse( void ) { - int x, y, width, height; - RECT window_rect; - - x = GetSystemMetrics (SM_XVIRTUALSCREEN); - y = GetSystemMetrics (SM_YVIRTUALSCREEN); - width = GetSystemMetrics (SM_CXVIRTUALSCREEN); - height = GetSystemMetrics (SM_CYVIRTUALSCREEN); - - GetWindowRect ( g_wv.hWnd, &window_rect); - if (window_rect.left < x) - window_rect.left = x; - if (window_rect.top < y) - window_rect.top = y; - if (window_rect.right >= width) - window_rect.right = width-1; - if (window_rect.bottom >= height-1) - window_rect.bottom = height-1; - window_center_x = (window_rect.right + window_rect.left)/2; - window_center_y = (window_rect.top + window_rect.bottom)/2; - - SetCursorPos (window_center_x, window_center_y); - - SetCapture ( g_wv.hWnd ); - ClipCursor (&window_rect); - while (ShowCursor (FALSE) >= 0) - ; -} - -/* -================ -IN_DeactivateWin32Mouse -================ -*/ -void IN_DeactivateWin32Mouse( void ) -{ - ClipCursor (NULL); - ReleaseCapture (); - while (ShowCursor (TRUE) < 0) - ; -} - -/* -================ -IN_Win32Mouse -================ -*/ -void IN_Win32Mouse( int *mx, int *my ) { - POINT current_pos; - - // find mouse movement - GetCursorPos (¤t_pos); - - // force the mouse to the center, so there's room to move - SetCursorPos (window_center_x, window_center_y); - - *mx = current_pos.x - window_center_x; - *my = current_pos.y - window_center_y; -} - - -/* -============================================================ - -DIRECT INPUT MOUSE CONTROL - -============================================================ -*/ - -#undef DEFINE_GUIDX - -#define DEFINE_GUIDX(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - EXTERN_C const GUID name \ - = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } - -DEFINE_GUIDX(GUID_SysMouse, 0x6F1D2B60,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); -DEFINE_GUIDX(GUID_XAxis, 0xA36D02E0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); -DEFINE_GUIDX(GUID_YAxis, 0xA36D02E1,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); -DEFINE_GUIDX(GUID_ZAxis, 0xA36D02E2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); - - -#define DINPUT_BUFFERSIZE 16 -#define iDirectInputCreate(a,b,c,d) pDirectInputCreate(a,b,c,d) - -typedef HRESULT (WINAPI *DirectInputCreateFn)(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUT * lplpDirectInput, LPUNKNOWN punkOuter); -DirectInputCreateFn pDirectInputCreate; - -static HINSTANCE hInstDI; - -typedef struct MYDATA { - LONG lX; // X axis goes here - LONG lY; // Y axis goes here - LONG lZ; // Z axis goes here - BYTE bButtonA; // One button goes here - BYTE bButtonB; // Another button goes here - BYTE bButtonC; // Another button goes here - BYTE bButtonD; // Another button goes here -} MYDATA; - -static DIOBJECTDATAFORMAT rgodf[] = { - { &GUID_XAxis, FIELD_OFFSET(MYDATA, lX), DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, - { &GUID_YAxis, FIELD_OFFSET(MYDATA, lY), DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, - { &GUID_ZAxis, FIELD_OFFSET(MYDATA, lZ), 0x80000000 | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, - { 0, FIELD_OFFSET(MYDATA, bButtonA), DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, - { 0, FIELD_OFFSET(MYDATA, bButtonB), DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, - { 0, FIELD_OFFSET(MYDATA, bButtonC), 0x80000000 | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, - { 0, FIELD_OFFSET(MYDATA, bButtonD), 0x80000000 | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, -}; - -#define NUM_OBJECTS (sizeof(rgodf) / sizeof(rgodf[0])) - -static DIDATAFORMAT df = { - sizeof(DIDATAFORMAT), // this structure - sizeof(DIOBJECTDATAFORMAT), // size of object data format - DIDF_RELAXIS, // absolute axis coordinates - sizeof(MYDATA), // device data size - NUM_OBJECTS, // number of objects - rgodf, // and here they are -}; - -static LPDIRECTINPUT g_pdi; -static LPDIRECTINPUTDEVICE g_pMouse; - -void IN_DIMouse( int *mx, int *my ); - -/* -======================== -IN_InitDIMouse -======================== -*/ -qboolean IN_InitDIMouse( void ) { - HRESULT hr; - int x, y; - DIPROPDWORD dipdw = { - { - sizeof(DIPROPDWORD), // diph.dwSize - sizeof(DIPROPHEADER), // diph.dwHeaderSize - 0, // diph.dwObj - DIPH_DEVICE, // diph.dwHow - }, - DINPUT_BUFFERSIZE, // dwData - }; - - Com_Printf( "Initializing DirectInput...\n"); - - if (!hInstDI) { - hInstDI = LoadLibrary("dinput.dll"); - - if (hInstDI == NULL) { - Com_Printf ("Couldn't load dinput.dll\n"); - return qfalse; - } - } - - if (!pDirectInputCreate) { - pDirectInputCreate = (DirectInputCreateFn)GetProcAddress(hInstDI,"DirectInputCreateA"); - - if (!pDirectInputCreate) { - Com_Printf ("Couldn't get DI proc addr\n"); - return qfalse; - } - } - - // register with DirectInput and get an IDirectInput to play with. - hr = iDirectInputCreate( g_wv.hInstance, DIRECTINPUT_VERSION, &g_pdi, NULL); - - if (FAILED(hr)) { - Com_Printf ("iDirectInputCreate failed\n"); - return qfalse; - } - - // obtain an interface to the system mouse device. - hr = IDirectInput_CreateDevice(g_pdi, GUID_SysMouse, &g_pMouse, NULL); - - if (FAILED(hr)) { - Com_Printf ("Couldn't open DI mouse device\n"); - return qfalse; - } - - // set the data format to "mouse format". - hr = IDirectInputDevice_SetDataFormat(g_pMouse, &df); - - if (FAILED(hr)) { - Com_Printf ("Couldn't set DI mouse format\n"); - return qfalse; - } - - // set the cooperativity level. - hr = IDirectInputDevice_SetCooperativeLevel(g_pMouse, g_wv.hWnd, - DISCL_EXCLUSIVE | DISCL_FOREGROUND); - - if (FAILED(hr)) { - Com_Printf ("Couldn't set DI coop level\n"); - return qfalse; - } - - - // set the buffer size to DINPUT_BUFFERSIZE elements. - // the buffer size is a DWORD property associated with the device - hr = IDirectInputDevice_SetProperty(g_pMouse, DIPROP_BUFFERSIZE, &dipdw.diph); - - if (FAILED(hr)) { - Com_Printf ("Couldn't set DI buffersize\n"); - return qfalse; - } - - // clear any pending samples - IN_DIMouse( &x, &y ); - IN_DIMouse( &x, &y ); - - Com_Printf( "DirectInput initialized.\n"); - return qtrue; -} - -/* -========================== -IN_ShutdownDIMouse -========================== -*/ -void IN_ShutdownDIMouse( void ) { - if (g_pMouse) { - IDirectInputDevice_Release(g_pMouse); - g_pMouse = NULL; - } - - if (g_pdi) { - IDirectInput_Release(g_pdi); - g_pdi = NULL; - } -} - -/* -========================== -IN_ActivateDIMouse -========================== -*/ -void IN_ActivateDIMouse( void ) { - HRESULT hr; - - if (!g_pMouse) { - return; - } - - // we may fail to reacquire if the window has been recreated - hr = IDirectInputDevice_Acquire( g_pMouse ); - if (FAILED(hr)) { - if ( !IN_InitDIMouse() ) { - Com_Printf ("Falling back to Win32 mouse support...\n"); - Cvar_Set( "in_mouse", "-1" ); - } - } -} - -/* -========================== -IN_DeactivateDIMouse -========================== -*/ -void IN_DeactivateDIMouse( void ) { - if (!g_pMouse) { - return; - } - IDirectInputDevice_Unacquire( g_pMouse ); -} - - -/* -=================== -IN_DIMouse -=================== -*/ -void IN_DIMouse( int *mx, int *my ) { - DIDEVICEOBJECTDATA od; - DIMOUSESTATE state; - DWORD dwElements; - HRESULT hr; - static float oldSysTime; - - if ( !g_pMouse ) { - return; - } - - // fetch new events - for (;;) - { - dwElements = 1; - - hr = IDirectInputDevice_GetDeviceData(g_pMouse, - sizeof(DIDEVICEOBJECTDATA), &od, &dwElements, 0); - if ((hr == DIERR_INPUTLOST) || (hr == DIERR_NOTACQUIRED)) { - IDirectInputDevice_Acquire(g_pMouse); - return; - } - - /* Unable to read data or no data available */ - if ( FAILED(hr) ) { - break; - } - - if ( dwElements == 0 ) { - break; - } - - switch (od.dwOfs) { - case DIMOFS_BUTTON0: - if (od.dwData & 0x80) - Sys_QueEvent( od.dwTimeStamp, SE_KEY, A_MOUSE1, qtrue, 0, NULL ); - else - Sys_QueEvent( od.dwTimeStamp, SE_KEY, A_MOUSE1, qfalse, 0, NULL ); - break; - - case DIMOFS_BUTTON1: - if (od.dwData & 0x80) - Sys_QueEvent( od.dwTimeStamp, SE_KEY, A_MOUSE2, qtrue, 0, NULL ); - else - Sys_QueEvent( od.dwTimeStamp, SE_KEY, A_MOUSE2, qfalse, 0, NULL ); - break; - - case DIMOFS_BUTTON2: - if (od.dwData & 0x80) - Sys_QueEvent( od.dwTimeStamp, SE_KEY, A_MOUSE3, qtrue, 0, NULL ); - else - Sys_QueEvent( od.dwTimeStamp, SE_KEY, A_MOUSE3, qfalse, 0, NULL ); - break; - - case DIMOFS_BUTTON3: - if (od.dwData & 0x80) - Sys_QueEvent( od.dwTimeStamp, SE_KEY, A_MOUSE4, qtrue, 0, NULL ); - else - Sys_QueEvent( od.dwTimeStamp, SE_KEY, A_MOUSE4, qfalse, 0, NULL ); - break; - - // needs DIRECTINPUT_VERSION >= 0x0700 to compile, which we seem to have, so... - // - case DIMOFS_BUTTON4: - if (od.dwData & 0x80) - Sys_QueEvent( od.dwTimeStamp, SE_KEY, A_MOUSE5, qtrue, 0, NULL ); - else - Sys_QueEvent( od.dwTimeStamp, SE_KEY, A_MOUSE5, qfalse, 0, NULL ); - break; - } - } - - // read the raw delta counter and ignore - // the individual sample time / values - hr = IDirectInputDevice_GetDeviceState(g_pMouse, - sizeof(DIDEVICEOBJECTDATA), &state); - if ( FAILED(hr) ) { - *mx = *my = 0; - return; - } - *mx = state.lX; - *my = state.lY; -} - -/* -============================================================ - - MOUSE CONTROL - -============================================================ -*/ - -/* -=========== -IN_ActivateMouse - -Called when the window gains focus or changes in some way -=========== -*/ -void IN_ActivateMouse( void ) -{ - if (!s_wmv.mouseInitialized ) { - return; - } - if ( !in_mouse->integer ) - { - s_wmv.mouseActive = qfalse; - return; - } - if ( s_wmv.mouseActive ) - { - return; - } - - s_wmv.mouseActive = qtrue; - - if ( in_mouse->integer == 2 ) { - IN_ActivateRawMouse(); - } else if ( in_mouse->integer != -1 ) { - IN_ActivateDIMouse(); - } - IN_ActivateWin32Mouse(); -} - - -/* -=========== -IN_DeactivateMouse - -Called when the window loses focus -=========== -*/ -void IN_DeactivateMouse( void ) { - if (!s_wmv.mouseInitialized ) { - return; - } - if (!s_wmv.mouseActive ) { - return; - } - s_wmv.mouseActive = qfalse; - - IN_DeactivateRawMouse(); - IN_DeactivateDIMouse(); - IN_DeactivateWin32Mouse(); -} - - - -/* -=========== -IN_StartupMouse -=========== -*/ -void IN_StartupMouse( void ) -{ - s_wmv.mouseInitialized = qfalse; - - if ( in_mouse->integer == 0 ) { - Com_Printf ("Mouse control not active.\n"); - return; - } - - // nt4.0 direct input is screwed up - if ( ( g_wv.osversion.dwPlatformId == VER_PLATFORM_WIN32_NT ) && - ( g_wv.osversion.dwMajorVersion == 4 ) ) - { - Com_Printf ("Disallowing DirectInput on NT 4.0\n"); - Cvar_Set( "in_mouse", "-1" ); - } - - s_wmv.mouseInitialized = qtrue; - - if ( in_mouse->integer == -1 ) { - Com_Printf ("Skipping check for DirectInput\n"); - } else if ( in_mouse->integer == 2 ) { - if ( IN_InitRawMouse() ) { - return; - } - Com_Printf ("Falling back to Win32 mouse support...\n"); - } else { - if ( IN_InitDIMouse() ) { - return; - } - Com_Printf ("Falling back to Win32 mouse support...\n"); - } - IN_InitWin32Mouse(); -} - -/* -=========== -IN_MouseEvent -=========== -*/ -#define MAX_MOUSE_BUTTONS 5 - -static int mouseConvert[MAX_MOUSE_BUTTONS] = -{ - A_MOUSE1, - A_MOUSE2, - A_MOUSE3, - A_MOUSE4, - A_MOUSE5 -}; - -void IN_MouseEvent (int mstate) -{ - int i; - - if ( !s_wmv.mouseInitialized ) - { - return; - } - - // perform button actions - for (i = 0 ; i < MAX_MOUSE_BUTTONS ; i++ ) - { - if ( (mstate & (1 << i)) && !(s_wmv.oldButtonState & (1 << i)) ) - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, mouseConvert[i], true, 0, NULL ); - } - if ( !(mstate & (1 << i)) && (s_wmv.oldButtonState & (1 << i)) ) - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, mouseConvert[i], false, 0, NULL ); - } - } - s_wmv.oldButtonState = mstate; -} - - -/* -=========== -IN_MouseMove -=========== -*/ -void IN_MouseMove ( void ) { - int mx, my; - - if ( rawMouseInitialized ) { - IN_RawMouse( &mx, &my ); - } else if ( g_pMouse ) { - IN_DIMouse( &mx, &my ); - } else { - IN_Win32Mouse( &mx, &my ); - } - - if ( !mx && !my ) { - return; - } - - Sys_QueEvent( 0, SE_MOUSE, mx, my, 0, NULL ); -} - - -/* -========================================================================= - -========================================================================= -*/ - -/* -=========== -IN_Startup -=========== -*/ -void IN_Startup( void ) { - Com_Printf ("\n------- Input Initialization -------\n"); - IN_StartupMouse (); - IN_StartupJoystick (); - IN_StartupMIDI(); - Com_Printf ("------------------------------------\n"); - - in_mouse->modified = qfalse; - in_joystick->modified = qfalse; -} - -/* -=========== -IN_Shutdown -=========== -*/ -void IN_Shutdown( void ) { - IN_DeactivateMouse(); - IN_ShutdownRawMouse(); - IN_ShutdownDIMouse(); - IN_ShutdownMIDI(); -#ifndef NO_XINPUT - if( in_joystick && in_joystick->integer == 2 ) - { - IN_UnloadXInput(); - } -#endif - Cmd_RemoveCommand("midiinfo" ); -} - - -/* -=========== -IN_Init -=========== -*/ -void IN_Init( void ) { - // MIDI input controler variables - in_midi = Cvar_Get ("in_midi", "0", CVAR_ARCHIVE); - in_midiport = Cvar_Get ("in_midiport", "1", CVAR_ARCHIVE); - in_midichannel = Cvar_Get ("in_midichannel", "1", CVAR_ARCHIVE); - in_mididevice = Cvar_Get ("in_mididevice", "0", CVAR_ARCHIVE); - - Cmd_AddCommand( "midiinfo", MidiInfo_f ); - - // mouse variables - in_mouse = Cvar_Get ("in_mouse", "-1", CVAR_ARCHIVE|CVAR_LATCH); - - // joystick variables - in_joystick = Cvar_Get ("in_joystick", "0", CVAR_ARCHIVE|CVAR_LATCH); - in_joyBallScale = Cvar_Get ("in_joyBallScale", "0.02", CVAR_ARCHIVE); // XInput: treat as right stick sens - in_debugJoystick = Cvar_Get ("in_debugjoystick", "0", CVAR_TEMP); - - joy_threshold = Cvar_Get ("joy_threshold", "0.15", CVAR_ARCHIVE); - -#ifndef NO_XINPUT - xin_invertThumbsticks = Cvar_Get ("xin_invertThumbsticks", "0", CVAR_ARCHIVE); - xin_invertLookX = Cvar_Get ("xin_invertLookX", "0", CVAR_ARCHIVE); - xin_invertLookY = Cvar_Get ("xin_invertLookY", "0", CVAR_ARCHIVE); - - xin_rumbleScale = Cvar_Get ("xin_rumbleScale", "1.0", CVAR_ARCHIVE); - -#endif - joy_xbutton = Cvar_Get ("joy_xbutton", "1", CVAR_ARCHIVE); // treat axis as a button - joy_ybutton = Cvar_Get ("joy_ybutton", "0", CVAR_ARCHIVE); - - IN_Startup(); -} - - -/* -=========== -IN_Activate - -Called when the main window gains or loses focus. -The window may have been destroyed and recreated -between a deactivate and an activate. -=========== -*/ -void IN_Activate (qboolean active) { - in_appactive = active; - - if ( !active ) - { - IN_DeactivateMouse(); - } -} - -/* -================== -IN_Frame - -Called every frame, even if not generating commands -================== -*/ -void IN_Frame (void) { - // post joystick events - IN_JoyMove(); - - if ( !s_wmv.mouseInitialized ) { - return; - } - - // If not DISCONNECTED (main menu) or ACTIVE (in game), we're loading - qboolean loading = (qboolean)( cls.state != CA_DISCONNECTED && cls.state != CA_ACTIVE ); - - // temporarily deactivate if not in the game and - // running on the desktop - if( !Cvar_VariableIntegerValue("r_fullscreen") && ( Key_GetCatcher( ) & KEYCATCH_CONSOLE ) ) { - IN_DeactivateMouse (); - return; - } - - if( !Cvar_VariableIntegerValue("r_fullscreen") && loading ) { - IN_DeactivateMouse (); - return; - } - - if ( !in_appactive ) { - IN_DeactivateMouse (); - return; - } - - IN_ActivateMouse(); - - // post events to the system que - IN_MouseMove(); -} - - -/* -=================== -IN_ClearStates -=================== -*/ -void IN_ClearStates (void) -{ - s_wmv.oldButtonState = 0; -} - - -/* -========================================================================= - -JOYSTICK - -========================================================================= -*/ - -#ifndef NO_XINPUT - -typedef struct { - WORD wButtons; - BYTE bLeftTrigger; - BYTE bRightTrigger; - SHORT sThumbLX; - SHORT sThumbLY; - SHORT sThumbRX; - SHORT sThumbRY; - DWORD dwPaddingReserved; -} XINPUT_GAMEPAD_EX; - -typedef struct { - DWORD dwPacketNumber; - XINPUT_GAMEPAD_EX Gamepad; -} XINPUT_STATE_EX; - -#define X360_GUIDE_BUTTON 0x0400 -#define X360_LEFT_TRIGGER_MASK 0x10000 -#define X360_RIGHT_TRIGGER_MASK 0x20000 - -static XINPUT_STATE_EX xiState; -static DWORD dwLastXIButtonState; - -static HMODULE xiLibrary = NULL; - -typedef DWORD (__stdcall *XIGetFuncPointer)(DWORD, XINPUT_STATE_EX *); -typedef DWORD (__stdcall *XISetFuncPointer)(DWORD, XINPUT_VIBRATION *); -XIGetFuncPointer XI_GetStateEx = NULL; -XISetFuncPointer XI_SetState = NULL; - -/* -=============== -IN_LoadXInput - -Uses direct DLL loading as opposed to static linkage -This is because, as Ensiform pointed out, Windows 8 -and Windows 7 use different XInput versions, hence -different linkage. -=============== -*/ - -qboolean IN_LoadXInput ( void ) -{ - int lastNum; - if( xiLibrary ) - return qfalse; // already loaded - - for(lastNum = 4; lastNum >= 3; lastNum--) // increment as more XInput versions become supported - { - xiLibrary = LoadLibrary( va("XInput1_%i.dll", lastNum) ); - if( xiLibrary) - break; - } - if( !xiLibrary ) - { - Com_Printf( S_COLOR_RED"XInput not detected on your system. Please download the XBOX 360 drivers from the Microsoft home page.\n" ); - return qfalse; - } - - // Ordinal 100 in the XInput DLL supposedly contains a modified/improved version - // of the XInputGetState function, with one key difference: XInputGetState does - // not get the status of the XBOX Guide button, while XInputGetStateEx does. - XI_GetStateEx = (XIGetFuncPointer)GetProcAddress( xiLibrary, (LPCSTR)100 ); - XI_SetState = (XISetFuncPointer)GetProcAddress( xiLibrary, "XInputSetState" ); - - if( !XI_GetStateEx || !XI_SetState ) - { - Com_Printf("^1IN_LoadXInput failed on pointer establish\n"); - IN_UnloadXInput(); - return qfalse; - } - return qtrue; -} - -/* -=============== -IN_UnloadXInput - -XInput gets unloaded if we change input modes or we shut -down the game -=============== -*/ - -void IN_UnloadXInput ( void ) -{ - if( !xiLibrary ) - { - // not loaded, so don't bother trying to unload - return; - } - FreeLibrary( xiLibrary ); - xiLibrary = NULL; -} - -/* -=============== -IN_JoystickInitXInput - -XBOX 360 controller only -=============== -*/ - -void IN_JoystickInitXInput ( void ) -{ - Com_Printf("Joystick cvar enabled -- XInput mode\n"); - - if(!IN_LoadXInput()) - { - Com_Printf("Could not load XInput -- see above error. Controller not enabled.\n"); - return; - } - - ZeroMemory( &xiState, sizeof(XINPUT_STATE_EX) ); - dwLastXIButtonState = 0UL; - - if (XI_GetStateEx( 0, &xiState ) != ERROR_SUCCESS ) { // only support for Controller 1 atm. If I get bored or something, - // I'll probably add a splitscreen mode just for lulz --eez - Com_Printf("XBOX 360 controller not detected -- no drivers or bad connection\n"); - return; - } - - joy.avail = qtrue; // semi hack, we really have no use for joy. whatever, but we use this to message when connection state changes - -} - -#endif - -/* -=============== -IN_JoystickInitDInput - -DirectInput only -=============== -*/ -void IN_JoystickInitDInput ( void ) -{ - int numdevs; - MMRESULT mmr; - - Com_Printf("Joystick cvar enabled -- DirectInput mode\n"); - - // verify joystick driver is present - if ((numdevs = joyGetNumDevs ()) == 0) - { - Com_Printf ("joystick not found -- driver not present\n"); - return; - } - - // cycle through the joystick ids for the first valid one - mmr = 0; - for (joy.id=0 ; joy.idinteger == 1 ) - { - // DirectInput mode --eez - IN_JoystickInitDInput(); - } -#ifndef NO_XINPUT - else if ( in_joystick->integer == 2 ) - { - // xbox 360 awesomeness - IN_JoystickInitXInput(); - } -#endif - else { - Com_Printf ("Joystick is not active.\n"); - return; - } - -} - -/* -=========== -JoyToF -=========== -*/ -float JoyToF( int value ) { - float fValue; - - // move centerpoint to zero - value -= 32768; - - // convert range from -32768..32767 to -1..1 - fValue = (float)value / 32768.0; - - if ( fValue < -1 ) { - fValue = -1; - } - if ( fValue > 1 ) { - fValue = 1; - } - return fValue; -} - -int JoyToI( int value ) { - // move centerpoint to zero - value -= 32768; - - return value; -} - -int joyDirectionKeys[16] = { - A_CURSOR_LEFT, A_CURSOR_RIGHT, - A_CURSOR_UP, A_CURSOR_DOWN, - A_JOY16, A_JOY17, - A_JOY18, A_JOY19, - A_JOY20, A_JOY21, - A_JOY22, A_JOY23, - - A_JOY24, A_JOY25, - A_JOY26, A_JOY27 -}; - -/* -=========== -IN_DoDirectInput - -Equivalent of IN_JoyMove for DirectInput -=========== -*/ - -void IN_DoDirectInput( void ) -{ - float fAxisValue; - int i; - DWORD buttonstate, povstate; - int x, y; - - // collect the joystick data, if possible - memset (&joy.ji, 0, sizeof(joy.ji)); - joy.ji.dwSize = sizeof(joy.ji); - joy.ji.dwFlags = JOY_RETURNALL; - - if ( joyGetPosEx (joy.id, &joy.ji) != JOYERR_NOERROR ) { - // read error occurred - // turning off the joystick seems too harsh for 1 read error,\ - // but what should be done? - // Com_Printf ("IN_ReadJoystick: no response\n"); - // joy.avail = false; - return; - } - - if ( in_debugJoystick->integer ) { - Com_Printf( "%8x %5i %5.2f %5.2f %5.2f %5.2f %6i %6i\n", - joy.ji.dwButtons, - joy.ji.dwPOV, - JoyToF( joy.ji.dwXpos ), JoyToF( joy.ji.dwYpos ), - JoyToF( joy.ji.dwZpos ), JoyToF( joy.ji.dwRpos ), - JoyToI( joy.ji.dwUpos ), JoyToI( joy.ji.dwVpos ) ); - } - - // loop through the joystick buttons - // key a joystick event or auxillary event for higher number buttons for each state change - buttonstate = joy.ji.dwButtons; - for ( i=0 ; i < joy.jc.wNumButtons ; i++ ) { - if ( (buttonstate & (1<integer) { - if ( fAxisValue < -joy_threshold->value || fAxisValue > joy_threshold->value){ - Sys_QueEvent( g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_SIDE, (int) -(fAxisValue*127.0), 0, NULL ); - }else{ - Sys_QueEvent( g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_SIDE, 0, 0, NULL ); - } - continue; - } - - if (i == 1 && !joy_ybutton->integer) { - if ( fAxisValue < -joy_threshold->value || fAxisValue > joy_threshold->value){ - Sys_QueEvent( g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_FORWARD, (int) -(fAxisValue*127.0), 0, NULL ); - }else{ - Sys_QueEvent( g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_FORWARD, 0, 0, NULL ); - } - continue; - } - - if ( fAxisValue < -joy_threshold->value ) { - povstate |= (1<<(i*2)); - } else if ( fAxisValue > joy_threshold->value ) { - povstate |= (1<<(i*2+1)); - } - } - - // convert POV information from a direction into 4 button bits - if ( joy.jc.wCaps & JOYCAPS_HASPOV ) { - if ( joy.ji.dwPOV != JOY_POVCENTERED ) { - if (joy.ji.dwPOV == JOY_POVFORWARD) - povstate |= 1<<12; - if (joy.ji.dwPOV == JOY_POVBACKWARD) - povstate |= 1<<13; - if (joy.ji.dwPOV == JOY_POVRIGHT) - povstate |= 1<<14; - if (joy.ji.dwPOV == JOY_POVLEFT) - povstate |= 1<<15; - } - } - - // determine which bits have changed and key an auxillary event for each change - for (i=0 ; i < 16 ; i++) { - if ( (povstate & (1<= 6 ) { - x = JoyToI( joy.ji.dwUpos ) * in_joyBallScale->value; - y = JoyToI( joy.ji.dwVpos ) * in_joyBallScale->value; - if ( x || y ) { - Sys_QueEvent( g_wv.sysMsgTime, SE_MOUSE, x, y, 0, NULL ); - } - } -} - -#ifndef NO_XINPUT -/* -=========== -XI_ThumbFloat - -Gets the percentage going one way or the other (as normalized float) -=========== -*/ -float QINLINE XI_ThumbFloat( signed short thumbValue ) -{ - return (thumbValue < 0) ? (thumbValue / 32768.0f) : (thumbValue / 32767.0f); -} - -/* -=========== -XI_ApplyInversion - -Inverts look up/down and look left/right appropriately -=========== -*/ -void XI_ApplyInversion( float *fX, float *fY ) -{ - if( xin_invertLookX->integer ) - *fX *= -1.0f; - if( xin_invertLookY->integer ) - *fY *= -1.0f; -} - -#define CheckButtonStatus( xin, fakekey ) \ - if ( (xiState.Gamepad.wButtons & xin) && !(dwLastXIButtonState & xin) ) \ - Sys_QueEvent(g_wv.sysMsgTime, SE_KEY, fakekey, qtrue, 0, NULL); \ - if ( !(xiState.Gamepad.wButtons & xin) && (dwLastXIButtonState & xin) ) \ - Sys_QueEvent(g_wv.sysMsgTime, SE_KEY, fakekey, qfalse, 0, NULL); \ - if ( (xiState.Gamepad.wButtons & xin) ) \ - dwLastXIButtonState |= xin; \ - else \ - dwLastXIButtonState &= ~xin; \ - -/* -=========== -IN_DoXInput - -Equivalent of IN_JoyMove for XInput (xbox 360) -=========== -*/ - -void IN_DoXInput( void ) -{ - if(!joy.avail) - { - // Joystick not found, continue to search for it :> - if( XI_GetStateEx(0, &xiState) == ERROR_SUCCESS ) - { - joy.avail = qtrue; - Com_Printf("Controller connected.\n"); - } - else - { - return; - } - } - else - { - if( XI_GetStateEx(0, &xiState) != ERROR_SUCCESS ) - { - joy.avail = qfalse; - Com_Printf("Controller disconnected.\n"); - return; - } - } - - // Now that we've dealt with the basic checks for connectivity, let's actually do the _important_ crap. - float leftThumbX = XI_ThumbFloat(xiState.Gamepad.sThumbLX); - float leftThumbY = XI_ThumbFloat(xiState.Gamepad.sThumbLY); - float rightThumbX = XI_ThumbFloat(xiState.Gamepad.sThumbRX); - float rightThumbY = XI_ThumbFloat(xiState.Gamepad.sThumbRY); - float dX = 0, dY = 0; - - /* hi microsoft, go fuck yourself for flipping left stick's Y axis for no reason... */ - leftThumbY *= -1.0f; - rightThumbY *= -1.0f; - - // JOYSTICKS - // This is complete and utter trash in DirectInput, because it doesn't send like half as much crap as it should. - if( xin_invertThumbsticks->integer ) - { - // Left stick functions like right stick - XI_ApplyInversion(&leftThumbX, &leftThumbY); - - // Left stick behavior - if( abs(leftThumbX) > joy_threshold->value ) // FIXME: what does do about deadzones and sensitivity... - { - dX = (leftThumbX-joy_threshold->value) * in_joyBallScale->value; - } - if( abs(leftThumbY) > joy_threshold->value ) - { - dY = (leftThumbY-joy_threshold->value) * in_joyBallScale->value; - } - - Sys_QueEvent(g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_YAW, rightThumbX, 0, NULL); - Sys_QueEvent(g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_PITCH, rightThumbY, 0, NULL); - - // Right stick behavior - // Hardcoded deadzone within the gamecode itself to deal with the situation - Sys_QueEvent(g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_SIDE, rightThumbX * 127, 0, NULL); - Sys_QueEvent(g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_FORWARD, rightThumbY * -127, 0, NULL); - } - else - { - // Thumbsticks act as they should (right stick = camera, left stick = wasd equivalent) - XI_ApplyInversion(&rightThumbX, &rightThumbY); - - // Left stick behavior - // Hardcoded deadzone within the gamecode itself to deal with the situation - Sys_QueEvent(g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_SIDE, leftThumbX * 127, 0, NULL); - Sys_QueEvent(g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_FORWARD, leftThumbY * -127, 0, NULL); - - // Right stick behavior - if( abs(rightThumbX) > joy_threshold->value ) - { - float factor = abs(rightThumbX*128); - dX = (rightThumbX-joy_threshold->value) * in_joyBallScale->value * factor; - if(in_debugJoystick->integer) - Com_Printf("rightThumbX: %f\tfactor: %f\tdX: %f\n", rightThumbX, factor, dX); - } - if( abs(rightThumbY) > joy_threshold->value ) - { - float factor = abs(rightThumbY*128); - dY = (rightThumbY-joy_threshold->value) * in_joyBallScale->value * factor; - if(in_debugJoystick->integer) - Com_Printf("rightThumbY: %f\tfactor: %f\tdX: %f\n", rightThumbY, factor, dY); - } - - // ...but cap it at a reasonable amount. - if(dX < -2.5f) dX = -2.5f; - if(dX > 2.5f) dX = 2.5f; - if(dY < -2.5f) dY = -2.5f; - if(dY > 2.5f) dY = 2.5f; - - dX *= 1024; - dY *= 1024; - - Sys_QueEvent(g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_YAW, dX, 0, NULL); - Sys_QueEvent(g_wv.sysMsgTime, SE_JOYSTICK_AXIS, AXIS_PITCH, dY, 0, NULL); - } - - if ( (Key_GetCatcher() & KEYCATCH_UI) ) { - CheckButtonStatus( XINPUT_GAMEPAD_DPAD_UP, A_CURSOR_UP ); - CheckButtonStatus( XINPUT_GAMEPAD_DPAD_DOWN, A_CURSOR_DOWN ); - CheckButtonStatus( XINPUT_GAMEPAD_DPAD_LEFT, A_CURSOR_LEFT ); - CheckButtonStatus( XINPUT_GAMEPAD_DPAD_RIGHT, A_CURSOR_RIGHT ); - CheckButtonStatus( XINPUT_GAMEPAD_START, A_JOY4 ); - CheckButtonStatus( XINPUT_GAMEPAD_BACK, A_JOY5 ); - CheckButtonStatus( XINPUT_GAMEPAD_LEFT_THUMB, A_JOY6 ); - CheckButtonStatus( XINPUT_GAMEPAD_RIGHT_THUMB, A_JOY7 ); - CheckButtonStatus( XINPUT_GAMEPAD_LEFT_SHOULDER, A_JOY8 ); - CheckButtonStatus( XINPUT_GAMEPAD_RIGHT_SHOULDER, A_JOY9 ); - CheckButtonStatus( X360_GUIDE_BUTTON, A_JOY10 ); - CheckButtonStatus( XINPUT_GAMEPAD_A, A_ENTER ); - CheckButtonStatus( XINPUT_GAMEPAD_B, A_JOY12 ); - CheckButtonStatus( XINPUT_GAMEPAD_X, A_JOY13 ); - CheckButtonStatus( XINPUT_GAMEPAD_Y, A_JOY14 ); - } - else { - CheckButtonStatus( XINPUT_GAMEPAD_DPAD_UP, A_JOY0 ); - CheckButtonStatus( XINPUT_GAMEPAD_DPAD_DOWN, A_JOY1 ); - CheckButtonStatus( XINPUT_GAMEPAD_DPAD_LEFT, A_JOY2 ); - CheckButtonStatus( XINPUT_GAMEPAD_DPAD_RIGHT, A_JOY3 ); - CheckButtonStatus( XINPUT_GAMEPAD_START, A_JOY4 ); - CheckButtonStatus( XINPUT_GAMEPAD_BACK, A_JOY5 ); - CheckButtonStatus( XINPUT_GAMEPAD_LEFT_THUMB, A_JOY6 ); - CheckButtonStatus( XINPUT_GAMEPAD_RIGHT_THUMB, A_JOY7 ); - CheckButtonStatus( XINPUT_GAMEPAD_LEFT_SHOULDER, A_JOY8 ); - CheckButtonStatus( XINPUT_GAMEPAD_RIGHT_SHOULDER, A_JOY9 ); - CheckButtonStatus( X360_GUIDE_BUTTON, A_JOY10 ); - CheckButtonStatus( XINPUT_GAMEPAD_A, A_JOY11 ); - CheckButtonStatus( XINPUT_GAMEPAD_B, A_JOY12 ); - CheckButtonStatus( XINPUT_GAMEPAD_X, A_JOY13 ); - CheckButtonStatus( XINPUT_GAMEPAD_Y, A_JOY14 ); - } - - // extra magic required for the triggers - if( xiState.Gamepad.bLeftTrigger && !(dwLastXIButtonState & X360_LEFT_TRIGGER_MASK) ) - { - Sys_QueEvent(g_wv.sysMsgTime, SE_KEY, A_JOY15, qtrue, 0, NULL); - } - else if( !xiState.Gamepad.bLeftTrigger && ( dwLastXIButtonState & X360_LEFT_TRIGGER_MASK ) ) - { - Sys_QueEvent(g_wv.sysMsgTime, SE_KEY, A_JOY15, qfalse, 0, NULL); - } - if( xiState.Gamepad.bLeftTrigger ) - dwLastXIButtonState |= X360_LEFT_TRIGGER_MASK; - else - dwLastXIButtonState &= ~X360_LEFT_TRIGGER_MASK; - - if( xiState.Gamepad.bRightTrigger && !( dwLastXIButtonState & X360_RIGHT_TRIGGER_MASK ) ) - { - Sys_QueEvent(g_wv.sysMsgTime, SE_KEY, A_JOY16, qtrue, 0, NULL); - } - else if( !xiState.Gamepad.bRightTrigger && ( dwLastXIButtonState & X360_RIGHT_TRIGGER_MASK ) ) - { - Sys_QueEvent(g_wv.sysMsgTime, SE_KEY, A_JOY16, qfalse, 0, NULL); - } - if( xiState.Gamepad.bRightTrigger ) - dwLastXIButtonState |= X360_RIGHT_TRIGGER_MASK; - else - dwLastXIButtonState &= ~X360_RIGHT_TRIGGER_MASK; - - if(in_debugJoystick->integer) - Com_Printf("buttons: \t%i\n", dwLastXIButtonState); -} -#endif - -/* -=========== -IN_JoyMove -=========== -*/ -void IN_JoyMove( void ) -{ - if( in_joystick->integer == 1 && joy.avail) - { - IN_DoDirectInput(); - } -#ifndef NO_XINPUT - else if( in_joystick->integer == 2 ) - { - IN_DoXInput(); - } -#endif -} - -/* -========================================================================= - -MIDI - -========================================================================= -*/ - -static void MIDI_NoteOff( int note ) -{ - int qkey; - - qkey = note - 60 + A_AUX0; - - if ( qkey < A_AUX0 ) - { - return; - } - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, qkey, qfalse, 0, NULL ); -} - -static void MIDI_NoteOn( int note, int velocity ) -{ - int qkey; - - if ( velocity == 0 ) - { - MIDI_NoteOff( note ); - } - - qkey = note - 60 + A_AUX0; - - if ( qkey < A_AUX0 ) - { - return; - } - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, qkey, qtrue, 0, NULL ); -} - -static void CALLBACK MidiInProc( HMIDIIN hMidiIn, UINT uMsg, DWORD dwInstance, - DWORD dwParam1, DWORD dwParam2 ) -{ - int message; - - switch ( uMsg ) - { - case MIM_OPEN: - break; - case MIM_CLOSE: - break; - case MIM_DATA: - message = dwParam1 & 0xff; - - // note on - if ( ( message & 0xf0 ) == 0x90 ) - { - if ( ( ( message & 0x0f ) + 1 ) == in_midichannel->integer ) - MIDI_NoteOn( ( dwParam1 & 0xff00 ) >> 8, ( dwParam1 & 0xff0000 ) >> 16 ); - } - else if ( ( message & 0xf0 ) == 0x80 ) - { - if ( ( ( message & 0x0f ) + 1 ) == in_midichannel->integer ) - MIDI_NoteOff( ( dwParam1 & 0xff00 ) >> 8 ); - } - break; - case MIM_LONGDATA: - break; - case MIM_ERROR: - break; - case MIM_LONGERROR: - break; - } - -// Sys_QueEvent( sys_msg_time, SE_KEY, wMsg, qtrue, 0, NULL ); -} - -static void MidiInfo_f( void ) -{ - int i; - - const char *enableStrings[] = { "disabled", "enabled" }; - - Com_Printf( "\nMIDI control: %s\n", enableStrings[in_midi->integer != 0] ); - Com_Printf( "port: %d\n", in_midiport->integer ); - Com_Printf( "channel: %d\n", in_midichannel->integer ); - Com_Printf( "current device: %d\n", in_mididevice->integer ); - Com_Printf( "number of devices: %d\n", s_midiInfo.numDevices ); - for ( i = 0; i < s_midiInfo.numDevices; i++ ) - { - if ( i == Cvar_VariableValue( "in_mididevice" ) ) - Com_Printf( "***" ); - else - Com_Printf( "..." ); - Com_Printf( "device %2d: %s\n", i, s_midiInfo.caps[i].szPname ); - Com_Printf( "...manufacturer ID: 0x%hx\n", s_midiInfo.caps[i].wMid ); - Com_Printf( "...product ID: 0x%hx\n", s_midiInfo.caps[i].wPid ); - - Com_Printf( "\n" ); - } -} - -static void IN_StartupMIDI( void ) -{ - int i; - - if ( !Cvar_VariableValue( "in_midi" ) ) - return; - - // - // enumerate MIDI IN devices - // - s_midiInfo.numDevices = midiInGetNumDevs(); - - for ( i = 0; i < s_midiInfo.numDevices; i++ ) - { - midiInGetDevCaps( i, &s_midiInfo.caps[i], sizeof( s_midiInfo.caps[i] ) ); - } - - // - // open the MIDI IN port - // - if ( midiInOpen( &s_midiInfo.hMidiIn, - in_mididevice->integer, - ( unsigned long ) MidiInProc, - ( unsigned long ) NULL, - CALLBACK_FUNCTION ) != MMSYSERR_NOERROR ) - { - Com_Printf( "WARNING: could not open MIDI device %d: '%s'\n", in_mididevice->integer , s_midiInfo.caps[( int ) in_mididevice->value] ); - return; - } - - midiInStart( s_midiInfo.hMidiIn ); -} - -static void IN_ShutdownMIDI( void ) -{ - if ( s_midiInfo.hMidiIn ) - { - midiInClose( s_midiInfo.hMidiIn ); - } - Com_Memset( &s_midiInfo, 0, sizeof( s_midiInfo ) ); -} - diff --git a/codemp/win32/win_local.h b/codemp/win32/win_local.h deleted file mode 100644 index 855ef10805..0000000000 --- a/codemp/win32/win_local.h +++ /dev/null @@ -1,70 +0,0 @@ -// win_local.h: Win32-specific Quake3 header file -#pragma once -#error Deprecated file - -#include "qcommon/qcommon.h" - -#define DIRECTINPUT_VERSION 0x0800 //[ 0x0300 | 0x0500 | 0x0700 | 0x0800 ] -#include -#include - -void IN_MouseEvent (int mstate); -void IN_RawMouseEvent( int lastX, int lastY ); // Send raw input events to the input subsystem - -void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptrLength, void *ptr ); - -void Sys_CreateConsole( void ); -void Sys_DestroyConsole( void ); - -char *Sys_ConsoleInput (void); - -qboolean Sys_GetPacket ( netadr_t *net_from, msg_t *net_message ); - -// Input subsystem - -void IN_Init (void); -void IN_Shutdown (void); -void IN_JoystickCommands (void); - -void IN_Move (usercmd_t *cmd); -// add additional non keyboard / non mouse movement on top of the keyboard move cmd - -void IN_DeactivateWin32Mouse( void); - -void IN_Activate (qboolean active); -void IN_Frame (void); - -// window procedure -LONG WINAPI MainWndProc ( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -void Conbuf_AppendText( const char *msg ); - -void SNDDMA_Activate( qboolean bAppActive ); -int SNDDMA_InitDS (); - -typedef struct WinVars_s { - - HINSTANCE reflib_library; // Handle to refresh DLL - qboolean reflib_active; - - HWND hWnd; - HINSTANCE hInstance; - qboolean activeApp; - qboolean isMinimized; - OSVERSIONINFO osversion; - - // when we get a windows message, we store the time off so keyboard processing - // can know the exact time of an event - unsigned sysMsgTime; -} WinVars_t; - -extern WinVars_t g_wv; - - -#define MAX_QUED_EVENTS 256 -#define MASK_QUED_EVENTS ( MAX_QUED_EVENTS - 1 ) - diff --git a/codemp/win32/win_qgl.cpp b/codemp/win32/win_qgl.cpp deleted file mode 100644 index fc2e7fed2c..0000000000 --- a/codemp/win32/win_qgl.cpp +++ /dev/null @@ -1,4264 +0,0 @@ -/* -** QGL_WIN.C -** -** This file implements the operating system binding of GL to QGL function -** pointers. When doing a port of Quake3 you must implement the following -** two functions: -** -** QGL_Init() - loads libraries, assigns function pointers, etc. -** QGL_Shutdown() - unloads libraries, NULLs function pointers -*/ -#include -#include "tr_local.h" -#include "glw_win.h" - -void QGL_EnableLogging( qboolean enable ); - -int ( WINAPI * qwglSwapIntervalEXT)( int interval ); - -BOOL ( WINAPI * qwglCopyContext)(HGLRC, HGLRC, UINT); -HGLRC ( WINAPI * qwglCreateContext)(HDC); -HGLRC ( WINAPI * qwglCreateLayerContext)(HDC, int); -BOOL ( WINAPI * qwglDeleteContext)(HGLRC); -HGLRC ( WINAPI * qwglGetCurrentContext)(VOID); -HDC ( WINAPI * qwglGetCurrentDC)(VOID); -PROC ( WINAPI * qwglGetProcAddress)(LPCSTR); -BOOL ( WINAPI * qwglMakeCurrent)(HDC, HGLRC); -BOOL ( WINAPI * qwglShareLists)(HGLRC, HGLRC); -BOOL ( WINAPI * qwglUseFontBitmaps)(HDC, DWORD, DWORD, DWORD); - -BOOL ( WINAPI * qwglUseFontOutlines)(HDC, DWORD, DWORD, DWORD, FLOAT, - FLOAT, int, LPGLYPHMETRICSFLOAT); - -BOOL ( WINAPI * qwglDescribeLayerPlane)(HDC, int, int, UINT, - LPLAYERPLANEDESCRIPTOR); -int ( WINAPI * qwglSetLayerPaletteEntries)(HDC, int, int, int, - CONST COLORREF *); -int ( WINAPI * qwglGetLayerPaletteEntries)(HDC, int, int, int, - COLORREF *); -BOOL ( WINAPI * qwglRealizeLayerPalette)(HDC, int, BOOL); -BOOL ( WINAPI * qwglSwapLayerBuffers)(HDC, UINT); - -void ( APIENTRY * qglAccum )(GLenum op, GLfloat value); -void ( APIENTRY * qglAlphaFunc )(GLenum func, GLclampf ref); -GLboolean ( APIENTRY * qglAreTexturesResident )(GLsizei n, const GLuint *textures, GLboolean *residences); -void ( APIENTRY * qglArrayElement )(GLint i); -void ( APIENTRY * qglBegin )(GLenum mode); -void ( APIENTRY * qglBindTexture )(GLenum target, GLuint texture); -void ( APIENTRY * qglBitmap )(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); -void ( APIENTRY * qglBlendFunc )(GLenum sfactor, GLenum dfactor); -void ( APIENTRY * qglCallList )(GLuint list); -void ( APIENTRY * qglCallLists )(GLsizei n, GLenum type, const GLvoid *lists); -void ( APIENTRY * qglClear )(GLbitfield mask); -void ( APIENTRY * qglClearAccum )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -void ( APIENTRY * qglClearColor )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -void ( APIENTRY * qglClearDepth )(GLclampd depth); -void ( APIENTRY * qglClearIndex )(GLfloat c); -void ( APIENTRY * qglClearStencil )(GLint s); -void ( APIENTRY * qglClipPlane )(GLenum plane, const GLdouble *equation); -void ( APIENTRY * qglColor3b )(GLbyte red, GLbyte green, GLbyte blue); -void ( APIENTRY * qglColor3bv )(const GLbyte *v); -void ( APIENTRY * qglColor3d )(GLdouble red, GLdouble green, GLdouble blue); -void ( APIENTRY * qglColor3dv )(const GLdouble *v); -void ( APIENTRY * qglColor3f )(GLfloat red, GLfloat green, GLfloat blue); -void ( APIENTRY * qglColor3fv )(const GLfloat *v); -void ( APIENTRY * qglColor3i )(GLint red, GLint green, GLint blue); -void ( APIENTRY * qglColor3iv )(const GLint *v); -void ( APIENTRY * qglColor3s )(GLshort red, GLshort green, GLshort blue); -void ( APIENTRY * qglColor3sv )(const GLshort *v); -void ( APIENTRY * qglColor3ub )(GLubyte red, GLubyte green, GLubyte blue); -void ( APIENTRY * qglColor3ubv )(const GLubyte *v); -void ( APIENTRY * qglColor3ui )(GLuint red, GLuint green, GLuint blue); -void ( APIENTRY * qglColor3uiv )(const GLuint *v); -void ( APIENTRY * qglColor3us )(GLushort red, GLushort green, GLushort blue); -void ( APIENTRY * qglColor3usv )(const GLushort *v); -void ( APIENTRY * qglColor4b )(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -void ( APIENTRY * qglColor4bv )(const GLbyte *v); -void ( APIENTRY * qglColor4d )(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -void ( APIENTRY * qglColor4dv )(const GLdouble *v); -void ( APIENTRY * qglColor4f )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -void ( APIENTRY * qglColor4fv )(const GLfloat *v); -void ( APIENTRY * qglColor4i )(GLint red, GLint green, GLint blue, GLint alpha); -void ( APIENTRY * qglColor4iv )(const GLint *v); -void ( APIENTRY * qglColor4s )(GLshort red, GLshort green, GLshort blue, GLshort alpha); -void ( APIENTRY * qglColor4sv )(const GLshort *v); -void ( APIENTRY * qglColor4ub )(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -void ( APIENTRY * qglColor4ubv )(const GLubyte *v); -void ( APIENTRY * qglColor4ui )(GLuint red, GLuint green, GLuint blue, GLuint alpha); -void ( APIENTRY * qglColor4uiv )(const GLuint *v); -void ( APIENTRY * qglColor4us )(GLushort red, GLushort green, GLushort blue, GLushort alpha); -void ( APIENTRY * qglColor4usv )(const GLushort *v); -void ( APIENTRY * qglColorMask )(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -void ( APIENTRY * qglColorMaterial )(GLenum face, GLenum mode); -void ( APIENTRY * qglColorPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglCopyPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -void ( APIENTRY * qglCopyTexImage1D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -void ( APIENTRY * qglCopyTexImage2D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -void ( APIENTRY * qglCopyTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -void ( APIENTRY * qglCopyTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -void ( APIENTRY * qglCullFace )(GLenum mode); -void ( APIENTRY * qglDeleteLists )(GLuint list, GLsizei range); -void ( APIENTRY * qglDeleteTextures )(GLsizei n, const GLuint *textures); -void ( APIENTRY * qglDepthFunc )(GLenum func); -void ( APIENTRY * qglDepthMask )(GLboolean flag); -void ( APIENTRY * qglDepthRange )(GLclampd zNear, GLclampd zFar); -void ( APIENTRY * qglDisable )(GLenum cap); -void ( APIENTRY * qglDisableClientState )(GLenum array); -void ( APIENTRY * qglDrawArrays )(GLenum mode, GLint first, GLsizei count); -void ( APIENTRY * qglDrawBuffer )(GLenum mode); -void ( APIENTRY * qglDrawElements )(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -void ( APIENTRY * qglDrawPixels )(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglEdgeFlag )(GLboolean flag); -void ( APIENTRY * qglEdgeFlagPointer )(GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglEdgeFlagv )(const GLboolean *flag); -void ( APIENTRY * qglEnable )(GLenum cap); -void ( APIENTRY * qglEnableClientState )(GLenum array); -void ( APIENTRY * qglEnd )(void); -void ( APIENTRY * qglEndList )(void); -void ( APIENTRY * qglEvalCoord1d )(GLdouble u); -void ( APIENTRY * qglEvalCoord1dv )(const GLdouble *u); -void ( APIENTRY * qglEvalCoord1f )(GLfloat u); -void ( APIENTRY * qglEvalCoord1fv )(const GLfloat *u); -void ( APIENTRY * qglEvalCoord2d )(GLdouble u, GLdouble v); -void ( APIENTRY * qglEvalCoord2dv )(const GLdouble *u); -void ( APIENTRY * qglEvalCoord2f )(GLfloat u, GLfloat v); -void ( APIENTRY * qglEvalCoord2fv )(const GLfloat *u); -void ( APIENTRY * qglEvalMesh1 )(GLenum mode, GLint i1, GLint i2); -void ( APIENTRY * qglEvalMesh2 )(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -void ( APIENTRY * qglEvalPoint1 )(GLint i); -void ( APIENTRY * qglEvalPoint2 )(GLint i, GLint j); -void ( APIENTRY * qglFeedbackBuffer )(GLsizei size, GLenum type, GLfloat *buffer); -void ( APIENTRY * qglFinish )(void); -void ( APIENTRY * qglFlush )(void); -void ( APIENTRY * qglFogf )(GLenum pname, GLfloat param); -void ( APIENTRY * qglFogfv )(GLenum pname, const GLfloat *params); -void ( APIENTRY * qglFogi )(GLenum pname, GLint param); -void ( APIENTRY * qglFogiv )(GLenum pname, const GLint *params); -void ( APIENTRY * qglFrontFace )(GLenum mode); -void ( APIENTRY * qglFrustum )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLuint ( APIENTRY * qglGenLists )(GLsizei range); -void ( APIENTRY * qglGenTextures )(GLsizei n, GLuint *textures); -void ( APIENTRY * qglGetBooleanv )(GLenum pname, GLboolean *params); -void ( APIENTRY * qglGetClipPlane )(GLenum plane, GLdouble *equation); -void ( APIENTRY * qglGetDoublev )(GLenum pname, GLdouble *params); -GLenum ( APIENTRY * qglGetError )(void); -void ( APIENTRY * qglGetFloatv )(GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetIntegerv )(GLenum pname, GLint *params); -void ( APIENTRY * qglGetLightfv )(GLenum light, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetLightiv )(GLenum light, GLenum pname, GLint *params); -void ( APIENTRY * qglGetMapdv )(GLenum target, GLenum query, GLdouble *v); -void ( APIENTRY * qglGetMapfv )(GLenum target, GLenum query, GLfloat *v); -void ( APIENTRY * qglGetMapiv )(GLenum target, GLenum query, GLint *v); -void ( APIENTRY * qglGetMaterialfv )(GLenum face, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetMaterialiv )(GLenum face, GLenum pname, GLint *params); -void ( APIENTRY * qglGetPixelMapfv )(GLenum m, GLfloat *values); //rwwRMG - map->m (avoid map type conflict) -void ( APIENTRY * qglGetPixelMapuiv )(GLenum m, GLuint *values); //rwwRMG - map->m (avoid map type conflict) -void ( APIENTRY * qglGetPixelMapusv )(GLenum m, GLushort *values); //rwwRMG - map->m (avoid map type conflict) -void ( APIENTRY * qglGetPointerv )(GLenum pname, GLvoid* *params); -void ( APIENTRY * qglGetPolygonStipple )(GLubyte *mask); -const GLubyte * ( APIENTRY * qglGetString )(GLenum name); -void ( APIENTRY * qglGetTexEnvfv )(GLenum target, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetTexEnviv )(GLenum target, GLenum pname, GLint *params); -void ( APIENTRY * qglGetTexGendv )(GLenum coord, GLenum pname, GLdouble *params); -void ( APIENTRY * qglGetTexGenfv )(GLenum coord, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetTexGeniv )(GLenum coord, GLenum pname, GLint *params); -void ( APIENTRY * qglGetTexImage )(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -void ( APIENTRY * qglGetTexLevelParameterfv )(GLenum target, GLint level, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetTexLevelParameteriv )(GLenum target, GLint level, GLenum pname, GLint *params); -void ( APIENTRY * qglGetTexParameterfv )(GLenum target, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetTexParameteriv )(GLenum target, GLenum pname, GLint *params); -void ( APIENTRY * qglHint )(GLenum target, GLenum mode); -void ( APIENTRY * qglIndexMask )(GLuint mask); -void ( APIENTRY * qglIndexPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglIndexd )(GLdouble c); -void ( APIENTRY * qglIndexdv )(const GLdouble *c); -void ( APIENTRY * qglIndexf )(GLfloat c); -void ( APIENTRY * qglIndexfv )(const GLfloat *c); -void ( APIENTRY * qglIndexi )(GLint c); -void ( APIENTRY * qglIndexiv )(const GLint *c); -void ( APIENTRY * qglIndexs )(GLshort c); -void ( APIENTRY * qglIndexsv )(const GLshort *c); -void ( APIENTRY * qglIndexub )(GLubyte c); -void ( APIENTRY * qglIndexubv )(const GLubyte *c); -void ( APIENTRY * qglInitNames )(void); -void ( APIENTRY * qglInterleavedArrays )(GLenum format, GLsizei stride, const GLvoid *pointer); -GLboolean ( APIENTRY * qglIsEnabled )(GLenum cap); -GLboolean ( APIENTRY * qglIsList )(GLuint list); -GLboolean ( APIENTRY * qglIsTexture )(GLuint texture); -void ( APIENTRY * qglLightModelf )(GLenum pname, GLfloat param); -void ( APIENTRY * qglLightModelfv )(GLenum pname, const GLfloat *params); -void ( APIENTRY * qglLightModeli )(GLenum pname, GLint param); -void ( APIENTRY * qglLightModeliv )(GLenum pname, const GLint *params); -void ( APIENTRY * qglLightf )(GLenum light, GLenum pname, GLfloat param); -void ( APIENTRY * qglLightfv )(GLenum light, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglLighti )(GLenum light, GLenum pname, GLint param); -void ( APIENTRY * qglLightiv )(GLenum light, GLenum pname, const GLint *params); -void ( APIENTRY * qglLineStipple )(GLint factor, GLushort pattern); -void ( APIENTRY * qglLineWidth )(GLfloat width); -void ( APIENTRY * qglListBase )(GLuint base); -void ( APIENTRY * qglLoadIdentity )(void); -void ( APIENTRY * qglLoadMatrixd )(const GLdouble *m); -void ( APIENTRY * qglLoadMatrixf )(const GLfloat *m); -void ( APIENTRY * qglLoadName )(GLuint name); -void ( APIENTRY * qglLogicOp )(GLenum opcode); -void ( APIENTRY * qglMap1d )(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -void ( APIENTRY * qglMap1f )(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -void ( APIENTRY * qglMap2d )(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -void ( APIENTRY * qglMap2f )(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -void ( APIENTRY * qglMapGrid1d )(GLint un, GLdouble u1, GLdouble u2); -void ( APIENTRY * qglMapGrid1f )(GLint un, GLfloat u1, GLfloat u2); -void ( APIENTRY * qglMapGrid2d )(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -void ( APIENTRY * qglMapGrid2f )(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -void ( APIENTRY * qglMaterialf )(GLenum face, GLenum pname, GLfloat param); -void ( APIENTRY * qglMaterialfv )(GLenum face, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglMateriali )(GLenum face, GLenum pname, GLint param); -void ( APIENTRY * qglMaterialiv )(GLenum face, GLenum pname, const GLint *params); -void ( APIENTRY * qglMatrixMode )(GLenum mode); -void ( APIENTRY * qglMultMatrixd )(const GLdouble *m); -void ( APIENTRY * qglMultMatrixf )(const GLfloat *m); -void ( APIENTRY * qglNewList )(GLuint list, GLenum mode); -void ( APIENTRY * qglNormal3b )(GLbyte nx, GLbyte ny, GLbyte nz); -void ( APIENTRY * qglNormal3bv )(const GLbyte *v); -void ( APIENTRY * qglNormal3d )(GLdouble nx, GLdouble ny, GLdouble nz); -void ( APIENTRY * qglNormal3dv )(const GLdouble *v); -void ( APIENTRY * qglNormal3f )(GLfloat nx, GLfloat ny, GLfloat nz); -void ( APIENTRY * qglNormal3fv )(const GLfloat *v); -void ( APIENTRY * qglNormal3i )(GLint nx, GLint ny, GLint nz); -void ( APIENTRY * qglNormal3iv )(const GLint *v); -void ( APIENTRY * qglNormal3s )(GLshort nx, GLshort ny, GLshort nz); -void ( APIENTRY * qglNormal3sv )(const GLshort *v); -void ( APIENTRY * qglNormalPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglOrtho )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -void ( APIENTRY * qglPassThrough )(GLfloat token); -void ( APIENTRY * qglPixelMapfv )(GLenum m, GLsizei mapsize, const GLfloat *values); //rwwRMG - map->m (avoid map type conflict) -void ( APIENTRY * qglPixelMapuiv )(GLenum m, GLsizei mapsize, const GLuint *values); //rwwRMG - map->m (avoid map type conflict) -void ( APIENTRY * qglPixelMapusv )(GLenum m, GLsizei mapsize, const GLushort *values); //rwwRMG - map->m (avoid map type conflict) -void ( APIENTRY * qglPixelStoref )(GLenum pname, GLfloat param); -void ( APIENTRY * qglPixelStorei )(GLenum pname, GLint param); -void ( APIENTRY * qglPixelTransferf )(GLenum pname, GLfloat param); -void ( APIENTRY * qglPixelTransferi )(GLenum pname, GLint param); -void ( APIENTRY * qglPixelZoom )(GLfloat xfactor, GLfloat yfactor); -void ( APIENTRY * qglPointSize )(GLfloat size); -void ( APIENTRY * qglPolygonMode )(GLenum face, GLenum mode); -void ( APIENTRY * qglPolygonOffset )(GLfloat factor, GLfloat units); -void ( APIENTRY * qglPolygonStipple )(const GLubyte *mask); -void ( APIENTRY * qglPopAttrib )(void); -void ( APIENTRY * qglPopClientAttrib )(void); -void ( APIENTRY * qglPopMatrix )(void); -void ( APIENTRY * qglPopName )(void); -void ( APIENTRY * qglPrioritizeTextures )(GLsizei n, const GLuint *textures, const GLclampf *priorities); -void ( APIENTRY * qglPushAttrib )(GLbitfield mask); -void ( APIENTRY * qglPushClientAttrib )(GLbitfield mask); -void ( APIENTRY * qglPushMatrix )(void); -void ( APIENTRY * qglPushName )(GLuint name); -void ( APIENTRY * qglRasterPos2d )(GLdouble x, GLdouble y); -void ( APIENTRY * qglRasterPos2dv )(const GLdouble *v); -void ( APIENTRY * qglRasterPos2f )(GLfloat x, GLfloat y); -void ( APIENTRY * qglRasterPos2fv )(const GLfloat *v); -void ( APIENTRY * qglRasterPos2i )(GLint x, GLint y); -void ( APIENTRY * qglRasterPos2iv )(const GLint *v); -void ( APIENTRY * qglRasterPos2s )(GLshort x, GLshort y); -void ( APIENTRY * qglRasterPos2sv )(const GLshort *v); -void ( APIENTRY * qglRasterPos3d )(GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglRasterPos3dv )(const GLdouble *v); -void ( APIENTRY * qglRasterPos3f )(GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglRasterPos3fv )(const GLfloat *v); -void ( APIENTRY * qglRasterPos3i )(GLint x, GLint y, GLint z); -void ( APIENTRY * qglRasterPos3iv )(const GLint *v); -void ( APIENTRY * qglRasterPos3s )(GLshort x, GLshort y, GLshort z); -void ( APIENTRY * qglRasterPos3sv )(const GLshort *v); -void ( APIENTRY * qglRasterPos4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -void ( APIENTRY * qglRasterPos4dv )(const GLdouble *v); -void ( APIENTRY * qglRasterPos4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -void ( APIENTRY * qglRasterPos4fv )(const GLfloat *v); -void ( APIENTRY * qglRasterPos4i )(GLint x, GLint y, GLint z, GLint w); -void ( APIENTRY * qglRasterPos4iv )(const GLint *v); -void ( APIENTRY * qglRasterPos4s )(GLshort x, GLshort y, GLshort z, GLshort w); -void ( APIENTRY * qglRasterPos4sv )(const GLshort *v); -void ( APIENTRY * qglReadBuffer )(GLenum mode); -void ( APIENTRY * qglReadPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); -void ( APIENTRY * qglRectd )(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -void ( APIENTRY * qglRectdv )(const GLdouble *v1, const GLdouble *v2); -void ( APIENTRY * qglRectf )(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -void ( APIENTRY * qglRectfv )(const GLfloat *v1, const GLfloat *v2); -void ( APIENTRY * qglRecti )(GLint x1, GLint y1, GLint x2, GLint y2); -void ( APIENTRY * qglRectiv )(const GLint *v1, const GLint *v2); -void ( APIENTRY * qglRects )(GLshort x1, GLshort y1, GLshort x2, GLshort y2); -void ( APIENTRY * qglRectsv )(const GLshort *v1, const GLshort *v2); -GLint ( APIENTRY * qglRenderMode )(GLenum mode); -void ( APIENTRY * qglRotated )(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglRotatef )(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglScaled )(GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglScalef )(GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglScissor )(GLint x, GLint y, GLsizei width, GLsizei height); -void ( APIENTRY * qglSelectBuffer )(GLsizei size, GLuint *buffer); -void ( APIENTRY * qglShadeModel )(GLenum mode); -void ( APIENTRY * qglStencilFunc )(GLenum func, GLint ref, GLuint mask); -void ( APIENTRY * qglStencilMask )(GLuint mask); -void ( APIENTRY * qglStencilOp )(GLenum fail, GLenum zfail, GLenum zpass); -void ( APIENTRY * qglTexCoord1d )(GLdouble s); -void ( APIENTRY * qglTexCoord1dv )(const GLdouble *v); -void ( APIENTRY * qglTexCoord1f )(GLfloat s); -void ( APIENTRY * qglTexCoord1fv )(const GLfloat *v); -void ( APIENTRY * qglTexCoord1i )(GLint s); -void ( APIENTRY * qglTexCoord1iv )(const GLint *v); -void ( APIENTRY * qglTexCoord1s )(GLshort s); -void ( APIENTRY * qglTexCoord1sv )(const GLshort *v); -void ( APIENTRY * qglTexCoord2d )(GLdouble s, GLdouble t); -void ( APIENTRY * qglTexCoord2dv )(const GLdouble *v); -void ( APIENTRY * qglTexCoord2f )(GLfloat s, GLfloat t); -void ( APIENTRY * qglTexCoord2fv )(const GLfloat *v); -void ( APIENTRY * qglTexCoord2i )(GLint s, GLint t); -void ( APIENTRY * qglTexCoord2iv )(const GLint *v); -void ( APIENTRY * qglTexCoord2s )(GLshort s, GLshort t); -void ( APIENTRY * qglTexCoord2sv )(const GLshort *v); -void ( APIENTRY * qglTexCoord3d )(GLdouble s, GLdouble t, GLdouble r); -void ( APIENTRY * qglTexCoord3dv )(const GLdouble *v); -void ( APIENTRY * qglTexCoord3f )(GLfloat s, GLfloat t, GLfloat r); -void ( APIENTRY * qglTexCoord3fv )(const GLfloat *v); -void ( APIENTRY * qglTexCoord3i )(GLint s, GLint t, GLint r); -void ( APIENTRY * qglTexCoord3iv )(const GLint *v); -void ( APIENTRY * qglTexCoord3s )(GLshort s, GLshort t, GLshort r); -void ( APIENTRY * qglTexCoord3sv )(const GLshort *v); -void ( APIENTRY * qglTexCoord4d )(GLdouble s, GLdouble t, GLdouble r, GLdouble q); -void ( APIENTRY * qglTexCoord4dv )(const GLdouble *v); -void ( APIENTRY * qglTexCoord4f )(GLfloat s, GLfloat t, GLfloat r, GLfloat q); -void ( APIENTRY * qglTexCoord4fv )(const GLfloat *v); -void ( APIENTRY * qglTexCoord4i )(GLint s, GLint t, GLint r, GLint q); -void ( APIENTRY * qglTexCoord4iv )(const GLint *v); -void ( APIENTRY * qglTexCoord4s )(GLshort s, GLshort t, GLshort r, GLshort q); -void ( APIENTRY * qglTexCoord4sv )(const GLshort *v); -void ( APIENTRY * qglTexCoordPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglTexEnvf )(GLenum target, GLenum pname, GLfloat param); -void ( APIENTRY * qglTexEnvfv )(GLenum target, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglTexEnvi )(GLenum target, GLenum pname, GLint param); -void ( APIENTRY * qglTexEnviv )(GLenum target, GLenum pname, const GLint *params); -void ( APIENTRY * qglTexGend )(GLenum coord, GLenum pname, GLdouble param); -void ( APIENTRY * qglTexGendv )(GLenum coord, GLenum pname, const GLdouble *params); -void ( APIENTRY * qglTexGenf )(GLenum coord, GLenum pname, GLfloat param); -void ( APIENTRY * qglTexGenfv )(GLenum coord, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglTexGeni )(GLenum coord, GLenum pname, GLint param); -void ( APIENTRY * qglTexGeniv )(GLenum coord, GLenum pname, const GLint *params); -void ( APIENTRY * qglTexImage1D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglTexImage2D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglTexParameterf )(GLenum target, GLenum pname, GLfloat param); -void ( APIENTRY * qglTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglTexParameteri )(GLenum target, GLenum pname, GLint param); -void ( APIENTRY * qglTexParameteriv )(GLenum target, GLenum pname, const GLint *params); -void ( APIENTRY * qglTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglTranslated )(GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglTranslatef )(GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglVertex2d )(GLdouble x, GLdouble y); -void ( APIENTRY * qglVertex2dv )(const GLdouble *v); -void ( APIENTRY * qglVertex2f )(GLfloat x, GLfloat y); -void ( APIENTRY * qglVertex2fv )(const GLfloat *v); -void ( APIENTRY * qglVertex2i )(GLint x, GLint y); -void ( APIENTRY * qglVertex2iv )(const GLint *v); -void ( APIENTRY * qglVertex2s )(GLshort x, GLshort y); -void ( APIENTRY * qglVertex2sv )(const GLshort *v); -void ( APIENTRY * qglVertex3d )(GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglVertex3dv )(const GLdouble *v); -void ( APIENTRY * qglVertex3f )(GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglVertex3fv )(const GLfloat *v); -void ( APIENTRY * qglVertex3i )(GLint x, GLint y, GLint z); -void ( APIENTRY * qglVertex3iv )(const GLint *v); -void ( APIENTRY * qglVertex3s )(GLshort x, GLshort y, GLshort z); -void ( APIENTRY * qglVertex3sv )(const GLshort *v); -void ( APIENTRY * qglVertex4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -void ( APIENTRY * qglVertex4dv )(const GLdouble *v); -void ( APIENTRY * qglVertex4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -void ( APIENTRY * qglVertex4fv )(const GLfloat *v); -void ( APIENTRY * qglVertex4i )(GLint x, GLint y, GLint z, GLint w); -void ( APIENTRY * qglVertex4iv )(const GLint *v); -void ( APIENTRY * qglVertex4s )(GLshort x, GLshort y, GLshort z, GLshort w); -void ( APIENTRY * qglVertex4sv )(const GLshort *v); -void ( APIENTRY * qglVertexPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglViewport )(GLint x, GLint y, GLsizei width, GLsizei height); - - - -static void ( APIENTRY * dllAccum )(GLenum op, GLfloat value); -static void ( APIENTRY * dllAlphaFunc )(GLenum func, GLclampf ref); -GLboolean ( APIENTRY * dllAreTexturesResident )(GLsizei n, const GLuint *textures, GLboolean *residences); -static void ( APIENTRY * dllArrayElement )(GLint i); -static void ( APIENTRY * dllBegin )(GLenum mode); -static void ( APIENTRY * dllBindTexture )(GLenum target, GLuint texture); -static void ( APIENTRY * dllBitmap )(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); -static void ( APIENTRY * dllBlendFunc )(GLenum sfactor, GLenum dfactor); -static void ( APIENTRY * dllCallList )(GLuint list); -static void ( APIENTRY * dllCallLists )(GLsizei n, GLenum type, const GLvoid *lists); -static void ( APIENTRY * dllClear )(GLbitfield mask); -static void ( APIENTRY * dllClearAccum )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -static void ( APIENTRY * dllClearColor )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -static void ( APIENTRY * dllClearDepth )(GLclampd depth); -static void ( APIENTRY * dllClearIndex )(GLfloat c); -static void ( APIENTRY * dllClearStencil )(GLint s); -static void ( APIENTRY * dllClipPlane )(GLenum plane, const GLdouble *equation); -static void ( APIENTRY * dllColor3b )(GLbyte red, GLbyte green, GLbyte blue); -static void ( APIENTRY * dllColor3bv )(const GLbyte *v); -static void ( APIENTRY * dllColor3d )(GLdouble red, GLdouble green, GLdouble blue); -static void ( APIENTRY * dllColor3dv )(const GLdouble *v); -static void ( APIENTRY * dllColor3f )(GLfloat red, GLfloat green, GLfloat blue); -static void ( APIENTRY * dllColor3fv )(const GLfloat *v); -static void ( APIENTRY * dllColor3i )(GLint red, GLint green, GLint blue); -static void ( APIENTRY * dllColor3iv )(const GLint *v); -static void ( APIENTRY * dllColor3s )(GLshort red, GLshort green, GLshort blue); -static void ( APIENTRY * dllColor3sv )(const GLshort *v); -static void ( APIENTRY * dllColor3ub )(GLubyte red, GLubyte green, GLubyte blue); -static void ( APIENTRY * dllColor3ubv )(const GLubyte *v); -static void ( APIENTRY * dllColor3ui )(GLuint red, GLuint green, GLuint blue); -static void ( APIENTRY * dllColor3uiv )(const GLuint *v); -static void ( APIENTRY * dllColor3us )(GLushort red, GLushort green, GLushort blue); -static void ( APIENTRY * dllColor3usv )(const GLushort *v); -static void ( APIENTRY * dllColor4b )(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -static void ( APIENTRY * dllColor4bv )(const GLbyte *v); -static void ( APIENTRY * dllColor4d )(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -static void ( APIENTRY * dllColor4dv )(const GLdouble *v); -static void ( APIENTRY * dllColor4f )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -static void ( APIENTRY * dllColor4fv )(const GLfloat *v); -static void ( APIENTRY * dllColor4i )(GLint red, GLint green, GLint blue, GLint alpha); -static void ( APIENTRY * dllColor4iv )(const GLint *v); -static void ( APIENTRY * dllColor4s )(GLshort red, GLshort green, GLshort blue, GLshort alpha); -static void ( APIENTRY * dllColor4sv )(const GLshort *v); -static void ( APIENTRY * dllColor4ub )(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -static void ( APIENTRY * dllColor4ubv )(const GLubyte *v); -static void ( APIENTRY * dllColor4ui )(GLuint red, GLuint green, GLuint blue, GLuint alpha); -static void ( APIENTRY * dllColor4uiv )(const GLuint *v); -static void ( APIENTRY * dllColor4us )(GLushort red, GLushort green, GLushort blue, GLushort alpha); -static void ( APIENTRY * dllColor4usv )(const GLushort *v); -static void ( APIENTRY * dllColorMask )(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -static void ( APIENTRY * dllColorMaterial )(GLenum face, GLenum mode); -static void ( APIENTRY * dllColorPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllCopyPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -static void ( APIENTRY * dllCopyTexImage1D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -static void ( APIENTRY * dllCopyTexImage2D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -static void ( APIENTRY * dllCopyTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -static void ( APIENTRY * dllCopyTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -static void ( APIENTRY * dllCullFace )(GLenum mode); -static void ( APIENTRY * dllDeleteLists )(GLuint list, GLsizei range); -static void ( APIENTRY * dllDeleteTextures )(GLsizei n, const GLuint *textures); -static void ( APIENTRY * dllDepthFunc )(GLenum func); -static void ( APIENTRY * dllDepthMask )(GLboolean flag); -static void ( APIENTRY * dllDepthRange )(GLclampd zNear, GLclampd zFar); -static void ( APIENTRY * dllDisable )(GLenum cap); -static void ( APIENTRY * dllDisableClientState )(GLenum array); -static void ( APIENTRY * dllDrawArrays )(GLenum mode, GLint first, GLsizei count); -static void ( APIENTRY * dllDrawBuffer )(GLenum mode); -static void ( APIENTRY * dllDrawElements )(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -static void ( APIENTRY * dllDrawPixels )(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllEdgeFlag )(GLboolean flag); -static void ( APIENTRY * dllEdgeFlagPointer )(GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllEdgeFlagv )(const GLboolean *flag); -static void ( APIENTRY * dllEnable )(GLenum cap); -static void ( APIENTRY * dllEnableClientState )(GLenum array); -static void ( APIENTRY * dllEnd )(void); -static void ( APIENTRY * dllEndList )(void); -static void ( APIENTRY * dllEvalCoord1d )(GLdouble u); -static void ( APIENTRY * dllEvalCoord1dv )(const GLdouble *u); -static void ( APIENTRY * dllEvalCoord1f )(GLfloat u); -static void ( APIENTRY * dllEvalCoord1fv )(const GLfloat *u); -static void ( APIENTRY * dllEvalCoord2d )(GLdouble u, GLdouble v); -static void ( APIENTRY * dllEvalCoord2dv )(const GLdouble *u); -static void ( APIENTRY * dllEvalCoord2f )(GLfloat u, GLfloat v); -static void ( APIENTRY * dllEvalCoord2fv )(const GLfloat *u); -static void ( APIENTRY * dllEvalMesh1 )(GLenum mode, GLint i1, GLint i2); -static void ( APIENTRY * dllEvalMesh2 )(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -static void ( APIENTRY * dllEvalPoint1 )(GLint i); -static void ( APIENTRY * dllEvalPoint2 )(GLint i, GLint j); -static void ( APIENTRY * dllFeedbackBuffer )(GLsizei size, GLenum type, GLfloat *buffer); -static void ( APIENTRY * dllFinish )(void); -static void ( APIENTRY * dllFlush )(void); -static void ( APIENTRY * dllFogf )(GLenum pname, GLfloat param); -static void ( APIENTRY * dllFogfv )(GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllFogi )(GLenum pname, GLint param); -static void ( APIENTRY * dllFogiv )(GLenum pname, const GLint *params); -static void ( APIENTRY * dllFrontFace )(GLenum mode); -static void ( APIENTRY * dllFrustum )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLuint ( APIENTRY * dllGenLists )(GLsizei range); -static void ( APIENTRY * dllGenTextures )(GLsizei n, GLuint *textures); -static void ( APIENTRY * dllGetBooleanv )(GLenum pname, GLboolean *params); -static void ( APIENTRY * dllGetClipPlane )(GLenum plane, GLdouble *equation); -static void ( APIENTRY * dllGetDoublev )(GLenum pname, GLdouble *params); -GLenum ( APIENTRY * dllGetError )(void); -static void ( APIENTRY * dllGetFloatv )(GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetIntegerv )(GLenum pname, GLint *params); -static void ( APIENTRY * dllGetLightfv )(GLenum light, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetLightiv )(GLenum light, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetMapdv )(GLenum target, GLenum query, GLdouble *v); -static void ( APIENTRY * dllGetMapfv )(GLenum target, GLenum query, GLfloat *v); -static void ( APIENTRY * dllGetMapiv )(GLenum target, GLenum query, GLint *v); -static void ( APIENTRY * dllGetMaterialfv )(GLenum face, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetMaterialiv )(GLenum face, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetPixelMapfv )(GLenum map, GLfloat *values); -static void ( APIENTRY * dllGetPixelMapuiv )(GLenum map, GLuint *values); -static void ( APIENTRY * dllGetPixelMapusv )(GLenum map, GLushort *values); -static void ( APIENTRY * dllGetPointerv )(GLenum pname, GLvoid* *params); -static void ( APIENTRY * dllGetPolygonStipple )(GLubyte *mask); -const GLubyte * ( APIENTRY * dllGetString )(GLenum name); -static void ( APIENTRY * dllGetTexEnvfv )(GLenum target, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetTexEnviv )(GLenum target, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetTexGendv )(GLenum coord, GLenum pname, GLdouble *params); -static void ( APIENTRY * dllGetTexGenfv )(GLenum coord, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetTexGeniv )(GLenum coord, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetTexImage )(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -static void ( APIENTRY * dllGetTexLevelParameterfv )(GLenum target, GLint level, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetTexLevelParameteriv )(GLenum target, GLint level, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetTexParameterfv )(GLenum target, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetTexParameteriv )(GLenum target, GLenum pname, GLint *params); -static void ( APIENTRY * dllHint )(GLenum target, GLenum mode); -static void ( APIENTRY * dllIndexMask )(GLuint mask); -static void ( APIENTRY * dllIndexPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllIndexd )(GLdouble c); -static void ( APIENTRY * dllIndexdv )(const GLdouble *c); -static void ( APIENTRY * dllIndexf )(GLfloat c); -static void ( APIENTRY * dllIndexfv )(const GLfloat *c); -static void ( APIENTRY * dllIndexi )(GLint c); -static void ( APIENTRY * dllIndexiv )(const GLint *c); -static void ( APIENTRY * dllIndexs )(GLshort c); -static void ( APIENTRY * dllIndexsv )(const GLshort *c); -static void ( APIENTRY * dllIndexub )(GLubyte c); -static void ( APIENTRY * dllIndexubv )(const GLubyte *c); -static void ( APIENTRY * dllInitNames )(void); -static void ( APIENTRY * dllInterleavedArrays )(GLenum format, GLsizei stride, const GLvoid *pointer); -GLboolean ( APIENTRY * dllIsEnabled )(GLenum cap); -GLboolean ( APIENTRY * dllIsList )(GLuint list); -GLboolean ( APIENTRY * dllIsTexture )(GLuint texture); -static void ( APIENTRY * dllLightModelf )(GLenum pname, GLfloat param); -static void ( APIENTRY * dllLightModelfv )(GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllLightModeli )(GLenum pname, GLint param); -static void ( APIENTRY * dllLightModeliv )(GLenum pname, const GLint *params); -static void ( APIENTRY * dllLightf )(GLenum light, GLenum pname, GLfloat param); -static void ( APIENTRY * dllLightfv )(GLenum light, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllLighti )(GLenum light, GLenum pname, GLint param); -static void ( APIENTRY * dllLightiv )(GLenum light, GLenum pname, const GLint *params); -static void ( APIENTRY * dllLineStipple )(GLint factor, GLushort pattern); -static void ( APIENTRY * dllLineWidth )(GLfloat width); -static void ( APIENTRY * dllListBase )(GLuint base); -static void ( APIENTRY * dllLoadIdentity )(void); -static void ( APIENTRY * dllLoadMatrixd )(const GLdouble *m); -static void ( APIENTRY * dllLoadMatrixf )(const GLfloat *m); -static void ( APIENTRY * dllLoadName )(GLuint name); -static void ( APIENTRY * dllLogicOp )(GLenum opcode); -static void ( APIENTRY * dllMap1d )(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -static void ( APIENTRY * dllMap1f )(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -static void ( APIENTRY * dllMap2d )(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -static void ( APIENTRY * dllMap2f )(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -static void ( APIENTRY * dllMapGrid1d )(GLint un, GLdouble u1, GLdouble u2); -static void ( APIENTRY * dllMapGrid1f )(GLint un, GLfloat u1, GLfloat u2); -static void ( APIENTRY * dllMapGrid2d )(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -static void ( APIENTRY * dllMapGrid2f )(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -static void ( APIENTRY * dllMaterialf )(GLenum face, GLenum pname, GLfloat param); -static void ( APIENTRY * dllMaterialfv )(GLenum face, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllMateriali )(GLenum face, GLenum pname, GLint param); -static void ( APIENTRY * dllMaterialiv )(GLenum face, GLenum pname, const GLint *params); -static void ( APIENTRY * dllMatrixMode )(GLenum mode); -static void ( APIENTRY * dllMultMatrixd )(const GLdouble *m); -static void ( APIENTRY * dllMultMatrixf )(const GLfloat *m); -static void ( APIENTRY * dllNewList )(GLuint list, GLenum mode); -static void ( APIENTRY * dllNormal3b )(GLbyte nx, GLbyte ny, GLbyte nz); -static void ( APIENTRY * dllNormal3bv )(const GLbyte *v); -static void ( APIENTRY * dllNormal3d )(GLdouble nx, GLdouble ny, GLdouble nz); -static void ( APIENTRY * dllNormal3dv )(const GLdouble *v); -static void ( APIENTRY * dllNormal3f )(GLfloat nx, GLfloat ny, GLfloat nz); -static void ( APIENTRY * dllNormal3fv )(const GLfloat *v); -static void ( APIENTRY * dllNormal3i )(GLint nx, GLint ny, GLint nz); -static void ( APIENTRY * dllNormal3iv )(const GLint *v); -static void ( APIENTRY * dllNormal3s )(GLshort nx, GLshort ny, GLshort nz); -static void ( APIENTRY * dllNormal3sv )(const GLshort *v); -static void ( APIENTRY * dllNormalPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllOrtho )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -static void ( APIENTRY * dllPassThrough )(GLfloat token); -static void ( APIENTRY * dllPixelMapfv )(GLenum map, GLsizei mapsize, const GLfloat *values); -static void ( APIENTRY * dllPixelMapuiv )(GLenum map, GLsizei mapsize, const GLuint *values); -static void ( APIENTRY * dllPixelMapusv )(GLenum map, GLsizei mapsize, const GLushort *values); -static void ( APIENTRY * dllPixelStoref )(GLenum pname, GLfloat param); -static void ( APIENTRY * dllPixelStorei )(GLenum pname, GLint param); -static void ( APIENTRY * dllPixelTransferf )(GLenum pname, GLfloat param); -static void ( APIENTRY * dllPixelTransferi )(GLenum pname, GLint param); -static void ( APIENTRY * dllPixelZoom )(GLfloat xfactor, GLfloat yfactor); -static void ( APIENTRY * dllPointSize )(GLfloat size); -static void ( APIENTRY * dllPolygonMode )(GLenum face, GLenum mode); -static void ( APIENTRY * dllPolygonOffset )(GLfloat factor, GLfloat units); -static void ( APIENTRY * dllPolygonStipple )(const GLubyte *mask); -static void ( APIENTRY * dllPopAttrib )(void); -static void ( APIENTRY * dllPopClientAttrib )(void); -static void ( APIENTRY * dllPopMatrix )(void); -static void ( APIENTRY * dllPopName )(void); -static void ( APIENTRY * dllPrioritizeTextures )(GLsizei n, const GLuint *textures, const GLclampf *priorities); -static void ( APIENTRY * dllPushAttrib )(GLbitfield mask); -static void ( APIENTRY * dllPushClientAttrib )(GLbitfield mask); -static void ( APIENTRY * dllPushMatrix )(void); -static void ( APIENTRY * dllPushName )(GLuint name); -static void ( APIENTRY * dllRasterPos2d )(GLdouble x, GLdouble y); -static void ( APIENTRY * dllRasterPos2dv )(const GLdouble *v); -static void ( APIENTRY * dllRasterPos2f )(GLfloat x, GLfloat y); -static void ( APIENTRY * dllRasterPos2fv )(const GLfloat *v); -static void ( APIENTRY * dllRasterPos2i )(GLint x, GLint y); -static void ( APIENTRY * dllRasterPos2iv )(const GLint *v); -static void ( APIENTRY * dllRasterPos2s )(GLshort x, GLshort y); -static void ( APIENTRY * dllRasterPos2sv )(const GLshort *v); -static void ( APIENTRY * dllRasterPos3d )(GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllRasterPos3dv )(const GLdouble *v); -static void ( APIENTRY * dllRasterPos3f )(GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllRasterPos3fv )(const GLfloat *v); -static void ( APIENTRY * dllRasterPos3i )(GLint x, GLint y, GLint z); -static void ( APIENTRY * dllRasterPos3iv )(const GLint *v); -static void ( APIENTRY * dllRasterPos3s )(GLshort x, GLshort y, GLshort z); -static void ( APIENTRY * dllRasterPos3sv )(const GLshort *v); -static void ( APIENTRY * dllRasterPos4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -static void ( APIENTRY * dllRasterPos4dv )(const GLdouble *v); -static void ( APIENTRY * dllRasterPos4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -static void ( APIENTRY * dllRasterPos4fv )(const GLfloat *v); -static void ( APIENTRY * dllRasterPos4i )(GLint x, GLint y, GLint z, GLint w); -static void ( APIENTRY * dllRasterPos4iv )(const GLint *v); -static void ( APIENTRY * dllRasterPos4s )(GLshort x, GLshort y, GLshort z, GLshort w); -static void ( APIENTRY * dllRasterPos4sv )(const GLshort *v); -static void ( APIENTRY * dllReadBuffer )(GLenum mode); -static void ( APIENTRY * dllReadPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); -static void ( APIENTRY * dllRectd )(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -static void ( APIENTRY * dllRectdv )(const GLdouble *v1, const GLdouble *v2); -static void ( APIENTRY * dllRectf )(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -static void ( APIENTRY * dllRectfv )(const GLfloat *v1, const GLfloat *v2); -static void ( APIENTRY * dllRecti )(GLint x1, GLint y1, GLint x2, GLint y2); -static void ( APIENTRY * dllRectiv )(const GLint *v1, const GLint *v2); -static void ( APIENTRY * dllRects )(GLshort x1, GLshort y1, GLshort x2, GLshort y2); -static void ( APIENTRY * dllRectsv )(const GLshort *v1, const GLshort *v2); -GLint ( APIENTRY * dllRenderMode )(GLenum mode); -static void ( APIENTRY * dllRotated )(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllRotatef )(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllScaled )(GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllScalef )(GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllScissor )(GLint x, GLint y, GLsizei width, GLsizei height); -static void ( APIENTRY * dllSelectBuffer )(GLsizei size, GLuint *buffer); -static void ( APIENTRY * dllShadeModel )(GLenum mode); -static void ( APIENTRY * dllStencilFunc )(GLenum func, GLint ref, GLuint mask); -static void ( APIENTRY * dllStencilMask )(GLuint mask); -static void ( APIENTRY * dllStencilOp )(GLenum fail, GLenum zfail, GLenum zpass); -static void ( APIENTRY * dllTexCoord1d )(GLdouble s); -static void ( APIENTRY * dllTexCoord1dv )(const GLdouble *v); -static void ( APIENTRY * dllTexCoord1f )(GLfloat s); -static void ( APIENTRY * dllTexCoord1fv )(const GLfloat *v); -static void ( APIENTRY * dllTexCoord1i )(GLint s); -static void ( APIENTRY * dllTexCoord1iv )(const GLint *v); -static void ( APIENTRY * dllTexCoord1s )(GLshort s); -static void ( APIENTRY * dllTexCoord1sv )(const GLshort *v); -static void ( APIENTRY * dllTexCoord2d )(GLdouble s, GLdouble t); -static void ( APIENTRY * dllTexCoord2dv )(const GLdouble *v); -static void ( APIENTRY * dllTexCoord2f )(GLfloat s, GLfloat t); -static void ( APIENTRY * dllTexCoord2fv )(const GLfloat *v); -static void ( APIENTRY * dllTexCoord2i )(GLint s, GLint t); -static void ( APIENTRY * dllTexCoord2iv )(const GLint *v); -static void ( APIENTRY * dllTexCoord2s )(GLshort s, GLshort t); -static void ( APIENTRY * dllTexCoord2sv )(const GLshort *v); -static void ( APIENTRY * dllTexCoord3d )(GLdouble s, GLdouble t, GLdouble r); -static void ( APIENTRY * dllTexCoord3dv )(const GLdouble *v); -static void ( APIENTRY * dllTexCoord3f )(GLfloat s, GLfloat t, GLfloat r); -static void ( APIENTRY * dllTexCoord3fv )(const GLfloat *v); -static void ( APIENTRY * dllTexCoord3i )(GLint s, GLint t, GLint r); -static void ( APIENTRY * dllTexCoord3iv )(const GLint *v); -static void ( APIENTRY * dllTexCoord3s )(GLshort s, GLshort t, GLshort r); -static void ( APIENTRY * dllTexCoord3sv )(const GLshort *v); -static void ( APIENTRY * dllTexCoord4d )(GLdouble s, GLdouble t, GLdouble r, GLdouble q); -static void ( APIENTRY * dllTexCoord4dv )(const GLdouble *v); -static void ( APIENTRY * dllTexCoord4f )(GLfloat s, GLfloat t, GLfloat r, GLfloat q); -static void ( APIENTRY * dllTexCoord4fv )(const GLfloat *v); -static void ( APIENTRY * dllTexCoord4i )(GLint s, GLint t, GLint r, GLint q); -static void ( APIENTRY * dllTexCoord4iv )(const GLint *v); -static void ( APIENTRY * dllTexCoord4s )(GLshort s, GLshort t, GLshort r, GLshort q); -static void ( APIENTRY * dllTexCoord4sv )(const GLshort *v); -static void ( APIENTRY * dllTexCoordPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllTexEnvf )(GLenum target, GLenum pname, GLfloat param); -static void ( APIENTRY * dllTexEnvfv )(GLenum target, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllTexEnvi )(GLenum target, GLenum pname, GLint param); -static void ( APIENTRY * dllTexEnviv )(GLenum target, GLenum pname, const GLint *params); -static void ( APIENTRY * dllTexGend )(GLenum coord, GLenum pname, GLdouble param); -static void ( APIENTRY * dllTexGendv )(GLenum coord, GLenum pname, const GLdouble *params); -static void ( APIENTRY * dllTexGenf )(GLenum coord, GLenum pname, GLfloat param); -static void ( APIENTRY * dllTexGenfv )(GLenum coord, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllTexGeni )(GLenum coord, GLenum pname, GLint param); -static void ( APIENTRY * dllTexGeniv )(GLenum coord, GLenum pname, const GLint *params); -static void ( APIENTRY * dllTexImage1D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllTexImage2D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllTexParameterf )(GLenum target, GLenum pname, GLfloat param); -static void ( APIENTRY * dllTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllTexParameteri )(GLenum target, GLenum pname, GLint param); -static void ( APIENTRY * dllTexParameteriv )(GLenum target, GLenum pname, const GLint *params); -static void ( APIENTRY * dllTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllTranslated )(GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllTranslatef )(GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllVertex2d )(GLdouble x, GLdouble y); -static void ( APIENTRY * dllVertex2dv )(const GLdouble *v); -static void ( APIENTRY * dllVertex2f )(GLfloat x, GLfloat y); -static void ( APIENTRY * dllVertex2fv )(const GLfloat *v); -static void ( APIENTRY * dllVertex2i )(GLint x, GLint y); -static void ( APIENTRY * dllVertex2iv )(const GLint *v); -static void ( APIENTRY * dllVertex2s )(GLshort x, GLshort y); -static void ( APIENTRY * dllVertex2sv )(const GLshort *v); -static void ( APIENTRY * dllVertex3d )(GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllVertex3dv )(const GLdouble *v); -static void ( APIENTRY * dllVertex3f )(GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllVertex3fv )(const GLfloat *v); -static void ( APIENTRY * dllVertex3i )(GLint x, GLint y, GLint z); -static void ( APIENTRY * dllVertex3iv )(const GLint *v); -static void ( APIENTRY * dllVertex3s )(GLshort x, GLshort y, GLshort z); -static void ( APIENTRY * dllVertex3sv )(const GLshort *v); -static void ( APIENTRY * dllVertex4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -static void ( APIENTRY * dllVertex4dv )(const GLdouble *v); -static void ( APIENTRY * dllVertex4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -static void ( APIENTRY * dllVertex4fv )(const GLfloat *v); -static void ( APIENTRY * dllVertex4i )(GLint x, GLint y, GLint z, GLint w); -static void ( APIENTRY * dllVertex4iv )(const GLint *v); -static void ( APIENTRY * dllVertex4s )(GLshort x, GLshort y, GLshort z, GLshort w); -static void ( APIENTRY * dllVertex4sv )(const GLshort *v); -static void ( APIENTRY * dllVertexPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllViewport )(GLint x, GLint y, GLsizei width, GLsizei height); - -static const char * BooleanToString( GLboolean b ) -{ - if ( b == GL_FALSE ) - return "GL_FALSE"; - else if ( b == GL_TRUE ) - return "GL_TRUE"; - else - return "OUT OF RANGE FOR BOOLEAN"; -} - -static const char * FuncToString( GLenum f ) -{ - switch ( f ) - { - case GL_ALWAYS: - return "GL_ALWAYS"; - case GL_NEVER: - return "GL_NEVER"; - case GL_LEQUAL: - return "GL_LEQUAL"; - case GL_LESS: - return "GL_LESS"; - case GL_EQUAL: - return "GL_EQUAL"; - case GL_GREATER: - return "GL_GREATER"; - case GL_GEQUAL: - return "GL_GEQUAL"; - case GL_NOTEQUAL: - return "GL_NOTEQUAL"; - default: - return "!!! UNKNOWN !!!"; - } -} - -static const char * PrimToString( GLenum mode ) -{ - static char prim[1024]; - - if ( mode == GL_TRIANGLES ) - strcpy( prim, "GL_TRIANGLES" ); - else if ( mode == GL_TRIANGLE_STRIP ) - strcpy( prim, "GL_TRIANGLE_STRIP" ); - else if ( mode == GL_TRIANGLE_FAN ) - strcpy( prim, "GL_TRIANGLE_FAN" ); - else if ( mode == GL_QUADS ) - strcpy( prim, "GL_QUADS" ); - else if ( mode == GL_QUAD_STRIP ) - strcpy( prim, "GL_QUAD_STRIP" ); - else if ( mode == GL_POLYGON ) - strcpy( prim, "GL_POLYGON" ); - else if ( mode == GL_POINTS ) - strcpy( prim, "GL_POINTS" ); - else if ( mode == GL_LINES ) - strcpy( prim, "GL_LINES" ); - else if ( mode == GL_LINE_STRIP ) - strcpy( prim, "GL_LINE_STRIP" ); - else if ( mode == GL_LINE_LOOP ) - strcpy( prim, "GL_LINE_LOOP" ); - else - sprintf( prim, "0x%x", mode ); - - return prim; -} - -static const char * CapToString( GLenum cap ) -{ - static char buffer[1024]; - - switch ( cap ) - { - case GL_TEXTURE_2D: - return "GL_TEXTURE_2D"; - case GL_BLEND: - return "GL_BLEND"; - case GL_DEPTH_TEST: - return "GL_DEPTH_TEST"; - case GL_CULL_FACE: - return "GL_CULL_FACE"; - case GL_CLIP_PLANE0: - return "GL_CLIP_PLANE0"; - case GL_COLOR_ARRAY: - return "GL_COLOR_ARRAY"; - case GL_TEXTURE_COORD_ARRAY: - return "GL_TEXTURE_COORD_ARRAY"; - case GL_VERTEX_ARRAY: - return "GL_VERTEX_ARRAY"; - case GL_ALPHA_TEST: - return "GL_ALPHA_TEST"; - case GL_STENCIL_TEST: - return "GL_STENCIL_TEST"; - default: - sprintf( buffer, "0x%x", cap ); - } - - return buffer; -} - -static const char * TypeToString( GLenum t ) -{ - switch ( t ) - { - case GL_BYTE: - return "GL_BYTE"; - case GL_UNSIGNED_BYTE: - return "GL_UNSIGNED_BYTE"; - case GL_SHORT: - return "GL_SHORT"; - case GL_UNSIGNED_SHORT: - return "GL_UNSIGNED_SHORT"; - case GL_INT: - return "GL_INT"; - case GL_UNSIGNED_INT: - return "GL_UNSIGNED_INT"; - case GL_FLOAT: - return "GL_FLOAT"; - case GL_DOUBLE: - return "GL_DOUBLE"; - default: - return "!!! UNKNOWN !!!"; - } -} - -static void APIENTRY logAccum(GLenum op, GLfloat value) -{ - fprintf( glw_state.log_fp, "glAccum\n" ); - dllAccum( op, value ); -} - -static void APIENTRY logAlphaFunc(GLenum func, GLclampf ref) -{ - fprintf( glw_state.log_fp, "glAlphaFunc( 0x%x, %f )\n", func, ref ); - dllAlphaFunc( func, ref ); -} - -static GLboolean APIENTRY logAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences) -{ - fprintf( glw_state.log_fp, "glAreTexturesResident\n" ); - return dllAreTexturesResident( n, textures, residences ); -} - -static void APIENTRY logArrayElement(GLint i) -{ - fprintf( glw_state.log_fp, "glArrayElement\n" ); - dllArrayElement( i ); -} - -static void APIENTRY logBegin(GLenum mode) -{ - fprintf( glw_state.log_fp, "glBegin( %s )\n", PrimToString( mode )); - dllBegin( mode ); -} - -static void APIENTRY logBindTexture(GLenum target, GLuint texture) -{ - fprintf( glw_state.log_fp, "glBindTexture( 0x%x, %u )\n", target, texture ); - dllBindTexture( target, texture ); -} - -static void APIENTRY logBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap) -{ - fprintf( glw_state.log_fp, "glBitmap\n" ); - dllBitmap( width, height, xorig, yorig, xmove, ymove, bitmap ); -} - -static void BlendToName( char *n, GLenum f ) -{ - switch ( f ) - { - case GL_ONE: - strcpy( n, "GL_ONE" ); - break; - case GL_ZERO: - strcpy( n, "GL_ZERO" ); - break; - case GL_SRC_ALPHA: - strcpy( n, "GL_SRC_ALPHA" ); - break; - case GL_ONE_MINUS_SRC_ALPHA: - strcpy( n, "GL_ONE_MINUS_SRC_ALPHA" ); - break; - case GL_DST_COLOR: - strcpy( n, "GL_DST_COLOR" ); - break; - case GL_ONE_MINUS_DST_COLOR: - strcpy( n, "GL_ONE_MINUS_DST_COLOR" ); - break; - case GL_DST_ALPHA: - strcpy( n, "GL_DST_ALPHA" ); - break; - default: - sprintf( n, "0x%x", f ); - } -} -static void APIENTRY logBlendFunc(GLenum sfactor, GLenum dfactor) -{ - char sf[128], df[128]; - - BlendToName( sf, sfactor ); - BlendToName( df, dfactor ); - - fprintf( glw_state.log_fp, "glBlendFunc( %s, %s )\n", sf, df ); - dllBlendFunc( sfactor, dfactor ); -} - -static void APIENTRY logCallList(GLuint list) -{ - fprintf( glw_state.log_fp, "glCallList( %u )\n", list ); - dllCallList( list ); -} - -static void APIENTRY logCallLists(GLsizei n, GLenum type, const void *lists) -{ - fprintf( glw_state.log_fp, "glCallLists\n" ); - dllCallLists( n, type, lists ); -} - -static void APIENTRY logClear(GLbitfield mask) -{ - fprintf( glw_state.log_fp, "glClear( 0x%x = ", mask ); - - if ( mask & GL_COLOR_BUFFER_BIT ) - fprintf( glw_state.log_fp, "GL_COLOR_BUFFER_BIT " ); - if ( mask & GL_DEPTH_BUFFER_BIT ) - fprintf( glw_state.log_fp, "GL_DEPTH_BUFFER_BIT " ); - if ( mask & GL_STENCIL_BUFFER_BIT ) - fprintf( glw_state.log_fp, "GL_STENCIL_BUFFER_BIT " ); - if ( mask & GL_ACCUM_BUFFER_BIT ) - fprintf( glw_state.log_fp, "GL_ACCUM_BUFFER_BIT " ); - - fprintf( glw_state.log_fp, ")\n" ); - dllClear( mask ); -} - -static void APIENTRY logClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) -{ - fprintf( glw_state.log_fp, "glClearAccum\n" ); - dllClearAccum( red, green, blue, alpha ); -} - -static void APIENTRY logClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) -{ - fprintf( glw_state.log_fp, "glClearColor\n" ); - dllClearColor( red, green, blue, alpha ); -} - -static void APIENTRY logClearDepth(GLclampd depth) -{ - fprintf( glw_state.log_fp, "glClearDepth( %f )\n", ( float ) depth ); - dllClearDepth( depth ); -} - -static void APIENTRY logClearIndex(GLfloat c) -{ - fprintf( glw_state.log_fp, "glClearIndex\n" ); - dllClearIndex( c ); -} - -static void APIENTRY logClearStencil(GLint s) -{ - fprintf( glw_state.log_fp, "glClearStencil( %d )\n", s ); - dllClearStencil( s ); -} - -static void APIENTRY logClipPlane(GLenum plane, const GLdouble *equation) -{ - fprintf( glw_state.log_fp, "glClipPlane\n" ); - dllClipPlane( plane, equation ); -} - -static void APIENTRY logColor3b(GLbyte red, GLbyte green, GLbyte blue) -{ - fprintf( glw_state.log_fp, "glColor3b\n" ); - dllColor3b( red, green, blue ); -} - -static void APIENTRY logColor3bv(const GLbyte *v) -{ - fprintf( glw_state.log_fp, "glColor3bv\n" ); - dllColor3bv( v ); -} - -static void APIENTRY logColor3d(GLdouble red, GLdouble green, GLdouble blue) -{ - fprintf( glw_state.log_fp, "glColor3d\n" ); - dllColor3d( red, green, blue ); -} - -static void APIENTRY logColor3dv(const GLdouble *v) -{ - fprintf( glw_state.log_fp, "glColor3dv\n" ); - dllColor3dv( v ); -} - -static void APIENTRY logColor3f(GLfloat red, GLfloat green, GLfloat blue) -{ - fprintf( glw_state.log_fp, "glColor3f\n" ); - dllColor3f( red, green, blue ); -} - -static void APIENTRY logColor3fv(const GLfloat *v) -{ - fprintf( glw_state.log_fp, "glColor3fv\n" ); - dllColor3fv( v ); -} - -static void APIENTRY logColor3i(GLint red, GLint green, GLint blue) -{ - fprintf( glw_state.log_fp, "glColor3i\n" ); - dllColor3i( red, green, blue ); -} - -static void APIENTRY logColor3iv(const GLint *v) -{ - fprintf( glw_state.log_fp, "glColor3iv\n" ); - dllColor3iv( v ); -} - -static void APIENTRY logColor3s(GLshort red, GLshort green, GLshort blue) -{ - fprintf( glw_state.log_fp, "glColor3s\n" ); - dllColor3s( red, green, blue ); -} - -static void APIENTRY logColor3sv(const GLshort *v) -{ - fprintf( glw_state.log_fp, "glColor3sv\n" ); - dllColor3sv( v ); -} - -static void APIENTRY logColor3ub(GLubyte red, GLubyte green, GLubyte blue) -{ - fprintf( glw_state.log_fp, "glColor3ub\n" ); - dllColor3ub( red, green, blue ); -} - -static void APIENTRY logColor3ubv(const GLubyte *v) -{ - fprintf( glw_state.log_fp, "glColor3ubv\n" ); - dllColor3ubv( v ); -} - -#define SIG( x ) fprintf( glw_state.log_fp, x "\n" ) - -static void APIENTRY logColor3ui(GLuint red, GLuint green, GLuint blue) -{ - SIG( "glColor3ui" ); - dllColor3ui( red, green, blue ); -} - -static void APIENTRY logColor3uiv(const GLuint *v) -{ - SIG( "glColor3uiv" ); - dllColor3uiv( v ); -} - -static void APIENTRY logColor3us(GLushort red, GLushort green, GLushort blue) -{ - SIG( "glColor3us" ); - dllColor3us( red, green, blue ); -} - -static void APIENTRY logColor3usv(const GLushort *v) -{ - SIG( "glColor3usv" ); - dllColor3usv( v ); -} - -static void APIENTRY logColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha) -{ - SIG( "glColor4b" ); - dllColor4b( red, green, blue, alpha ); -} - -static void APIENTRY logColor4bv(const GLbyte *v) -{ - SIG( "glColor4bv" ); - dllColor4bv( v ); -} - -static void APIENTRY logColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha) -{ - SIG( "glColor4d" ); - dllColor4d( red, green, blue, alpha ); -} -static void APIENTRY logColor4dv(const GLdouble *v) -{ - SIG( "glColor4dv" ); - dllColor4dv( v ); -} -static void APIENTRY logColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) -{ - fprintf( glw_state.log_fp, "glColor4f( %f,%f,%f,%f )\n", red, green, blue, alpha ); - dllColor4f( red, green, blue, alpha ); -} -static void APIENTRY logColor4fv(const GLfloat *v) -{ - fprintf( glw_state.log_fp, "glColor4fv( %f,%f,%f,%f )\n", v[0], v[1], v[2], v[3] ); - dllColor4fv( v ); -} -static void APIENTRY logColor4i(GLint red, GLint green, GLint blue, GLint alpha) -{ - SIG( "glColor4i" ); - dllColor4i( red, green, blue, alpha ); -} -static void APIENTRY logColor4iv(const GLint *v) -{ - SIG( "glColor4iv" ); - dllColor4iv( v ); -} -static void APIENTRY logColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha) -{ - SIG( "glColor4s" ); - dllColor4s( red, green, blue, alpha ); -} -static void APIENTRY logColor4sv(const GLshort *v) -{ - SIG( "glColor4sv" ); - dllColor4sv( v ); -} -static void APIENTRY logColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) -{ - SIG( "glColor4b" ); - dllColor4b( red, green, blue, alpha ); -} -static void APIENTRY logColor4ubv(const GLubyte *v) -{ - SIG( "glColor4ubv" ); - dllColor4ubv( v ); -} -static void APIENTRY logColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha) -{ - SIG( "glColor4ui" ); - dllColor4ui( red, green, blue, alpha ); -} -static void APIENTRY logColor4uiv(const GLuint *v) -{ - SIG( "glColor4uiv" ); - dllColor4uiv( v ); -} -static void APIENTRY logColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha) -{ - SIG( "glColor4us" ); - dllColor4us( red, green, blue, alpha ); -} -static void APIENTRY logColor4usv(const GLushort *v) -{ - SIG( "glColor4usv" ); - dllColor4usv( v ); -} -static void APIENTRY logColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) -{ - SIG( "glColorMask" ); - dllColorMask( red, green, blue, alpha ); -} -static void APIENTRY logColorMaterial(GLenum face, GLenum mode) -{ - SIG( "glColorMaterial" ); - dllColorMaterial( face, mode ); -} - -static void APIENTRY logColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer) -{ - fprintf( glw_state.log_fp, "glColorPointer( %d, %s, %d, MEM )\n", size, TypeToString( type ), stride ); - dllColorPointer( size, type, stride, pointer ); -} - -static void APIENTRY logCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type) -{ - SIG( "glCopyPixels" ); - dllCopyPixels( x, y, width, height, type ); -} - -static void APIENTRY logCopyTexImage1D(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border) -{ - SIG( "glCopyTexImage1D" ); - dllCopyTexImage1D( target, level, internalFormat, x, y, width, border ); -} - -static void APIENTRY logCopyTexImage2D(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) -{ - SIG( "glCopyTexImage2D" ); - dllCopyTexImage2D( target, level, internalFormat, x, y, width, height, border ); -} - -static void APIENTRY logCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) -{ - SIG( "glCopyTexSubImage1D" ); - dllCopyTexSubImage1D( target, level, xoffset, x, y, width ); -} - -static void APIENTRY logCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) -{ - SIG( "glCopyTexSubImage2D" ); - dllCopyTexSubImage2D( target, level, xoffset, yoffset, x, y, width, height ); -} - -static void APIENTRY logCullFace(GLenum mode) -{ - fprintf( glw_state.log_fp, "glCullFace( %s )\n", ( mode == GL_FRONT ) ? "GL_FRONT" : "GL_BACK" ); - dllCullFace( mode ); -} - -static void APIENTRY logDeleteLists(GLuint list, GLsizei range) -{ - SIG( "glDeleteLists" ); - dllDeleteLists( list, range ); -} - -static void APIENTRY logDeleteTextures(GLsizei n, const GLuint *textures) -{ - SIG( "glDeleteTextures" ); - dllDeleteTextures( n, textures ); -} - -static void APIENTRY logDepthFunc(GLenum func) -{ - fprintf( glw_state.log_fp, "glDepthFunc( %s )\n", FuncToString( func ) ); - dllDepthFunc( func ); -} - -static void APIENTRY logDepthMask(GLboolean flag) -{ - fprintf( glw_state.log_fp, "glDepthMask( %s )\n", BooleanToString( flag ) ); - dllDepthMask( flag ); -} - -static void APIENTRY logDepthRange(GLclampd zNear, GLclampd zFar) -{ - fprintf( glw_state.log_fp, "glDepthRange( %f, %f )\n", ( float ) zNear, ( float ) zFar ); - dllDepthRange( zNear, zFar ); -} - -static void APIENTRY logDisable(GLenum cap) -{ - fprintf( glw_state.log_fp, "glDisable( %s )\n", CapToString( cap ) ); - dllDisable( cap ); -} - -static void APIENTRY logDisableClientState(GLenum array) -{ - fprintf( glw_state.log_fp, "glDisableClientState( %s )\n", CapToString( array ) ); - dllDisableClientState( array ); -} - -static void APIENTRY logDrawArrays(GLenum mode, GLint first, GLsizei count) -{ - SIG( "glDrawArrays" ); - dllDrawArrays( mode, first, count ); -} - -static void APIENTRY logDrawBuffer(GLenum mode) -{ - SIG( "glDrawBuffer" ); - dllDrawBuffer( mode ); -} - -static void APIENTRY logDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices) -{ - fprintf( glw_state.log_fp, "glDrawElements( %s, %d, %s, MEM )\n", PrimToString( mode ), count, TypeToString( type ) ); - dllDrawElements( mode, count, type, indices ); -} - -static void APIENTRY logDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) -{ - SIG( "glDrawPixels" ); - dllDrawPixels( width, height, format, type, pixels ); -} - -static void APIENTRY logEdgeFlag(GLboolean flag) -{ - SIG( "glEdgeFlag" ); - dllEdgeFlag( flag ); -} - -static void APIENTRY logEdgeFlagPointer(GLsizei stride, const void *pointer) -{ - SIG( "glEdgeFlagPointer" ); - dllEdgeFlagPointer( stride, pointer ); -} - -static void APIENTRY logEdgeFlagv(const GLboolean *flag) -{ - SIG( "glEdgeFlagv" ); - dllEdgeFlagv( flag ); -} - -static void APIENTRY logEnable(GLenum cap) -{ - fprintf( glw_state.log_fp, "glEnable( %s )\n", CapToString( cap ) ); - dllEnable( cap ); -} - -static void APIENTRY logEnableClientState(GLenum array) -{ - fprintf( glw_state.log_fp, "glEnableClientState( %s )\n", CapToString( array ) ); - dllEnableClientState( array ); -} - -static void APIENTRY logEnd(void) -{ - SIG( "glEnd" ); - dllEnd(); -} - -static void APIENTRY logEndList(void) -{ - SIG( "glEndList" ); - dllEndList(); -} - -static void APIENTRY logEvalCoord1d(GLdouble u) -{ - SIG( "glEvalCoord1d" ); - dllEvalCoord1d( u ); -} - -static void APIENTRY logEvalCoord1dv(const GLdouble *u) -{ - SIG( "glEvalCoord1dv" ); - dllEvalCoord1dv( u ); -} - -static void APIENTRY logEvalCoord1f(GLfloat u) -{ - SIG( "glEvalCoord1f" ); - dllEvalCoord1f( u ); -} - -static void APIENTRY logEvalCoord1fv(const GLfloat *u) -{ - SIG( "glEvalCoord1fv" ); - dllEvalCoord1fv( u ); -} -static void APIENTRY logEvalCoord2d(GLdouble u, GLdouble v) -{ - SIG( "glEvalCoord2d" ); - dllEvalCoord2d( u, v ); -} -static void APIENTRY logEvalCoord2dv(const GLdouble *u) -{ - SIG( "glEvalCoord2dv" ); - dllEvalCoord2dv( u ); -} -static void APIENTRY logEvalCoord2f(GLfloat u, GLfloat v) -{ - SIG( "glEvalCoord2f" ); - dllEvalCoord2f( u, v ); -} -static void APIENTRY logEvalCoord2fv(const GLfloat *u) -{ - SIG( "glEvalCoord2fv" ); - dllEvalCoord2fv( u ); -} - -static void APIENTRY logEvalMesh1(GLenum mode, GLint i1, GLint i2) -{ - SIG( "glEvalMesh1" ); - dllEvalMesh1( mode, i1, i2 ); -} -static void APIENTRY logEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2) -{ - SIG( "glEvalMesh2" ); - dllEvalMesh2( mode, i1, i2, j1, j2 ); -} -static void APIENTRY logEvalPoint1(GLint i) -{ - SIG( "glEvalPoint1" ); - dllEvalPoint1( i ); -} -static void APIENTRY logEvalPoint2(GLint i, GLint j) -{ - SIG( "glEvalPoint2" ); - dllEvalPoint2( i, j ); -} - -static void APIENTRY logFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer) -{ - SIG( "glFeedbackBuffer" ); - dllFeedbackBuffer( size, type, buffer ); -} - -static void APIENTRY logFinish(void) -{ - SIG( "glFinish" ); - dllFinish(); -} - -static void APIENTRY logFlush(void) -{ - SIG( "glFlush" ); - dllFlush(); -} - -static void APIENTRY logFogf(GLenum pname, GLfloat param) -{ - SIG( "glFogf" ); - dllFogf( pname, param ); -} - -static void APIENTRY logFogfv(GLenum pname, const GLfloat *params) -{ - SIG( "glFogfv" ); - dllFogfv( pname, params ); -} - -static void APIENTRY logFogi(GLenum pname, GLint param) -{ - SIG( "glFogi" ); - dllFogi( pname, param ); -} - -static void APIENTRY logFogiv(GLenum pname, const GLint *params) -{ - SIG( "glFogiv" ); - dllFogiv( pname, params ); -} - -static void APIENTRY logFrontFace(GLenum mode) -{ - SIG( "glFrontFace" ); - dllFrontFace( mode ); -} - -static void APIENTRY logFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) -{ - SIG( "glFrustum" ); - dllFrustum( left, right, bottom, top, zNear, zFar ); -} - -static GLuint APIENTRY logGenLists(GLsizei range) -{ - SIG( "glGenLists" ); - return dllGenLists( range ); -} - -static void APIENTRY logGenTextures(GLsizei n, GLuint *textures) -{ - SIG( "glGenTextures" ); - dllGenTextures( n, textures ); -} - -static void APIENTRY logGetBooleanv(GLenum pname, GLboolean *params) -{ - SIG( "glGetBooleanv" ); - dllGetBooleanv( pname, params ); -} - -static void APIENTRY logGetClipPlane(GLenum plane, GLdouble *equation) -{ - SIG( "glGetClipPlane" ); - dllGetClipPlane( plane, equation ); -} - -static void APIENTRY logGetDoublev(GLenum pname, GLdouble *params) -{ - SIG( "glGetDoublev" ); - dllGetDoublev( pname, params ); -} - -static GLenum APIENTRY logGetError(void) -{ - SIG( "glGetError" ); - return dllGetError(); -} - -static void APIENTRY logGetFloatv(GLenum pname, GLfloat *params) -{ - SIG( "glGetFloatv" ); - dllGetFloatv( pname, params ); -} - -static void APIENTRY logGetIntegerv(GLenum pname, GLint *params) -{ - SIG( "glGetIntegerv" ); - dllGetIntegerv( pname, params ); -} - -static void APIENTRY logGetLightfv(GLenum light, GLenum pname, GLfloat *params) -{ - SIG( "glGetLightfv" ); - dllGetLightfv( light, pname, params ); -} - -static void APIENTRY logGetLightiv(GLenum light, GLenum pname, GLint *params) -{ - SIG( "glGetLightiv" ); - dllGetLightiv( light, pname, params ); -} - -static void APIENTRY logGetMapdv(GLenum target, GLenum query, GLdouble *v) -{ - SIG( "glGetMapdv" ); - dllGetMapdv( target, query, v ); -} - -static void APIENTRY logGetMapfv(GLenum target, GLenum query, GLfloat *v) -{ - SIG( "glGetMapfv" ); - dllGetMapfv( target, query, v ); -} - -static void APIENTRY logGetMapiv(GLenum target, GLenum query, GLint *v) -{ - SIG( "glGetMapiv" ); - dllGetMapiv( target, query, v ); -} - -static void APIENTRY logGetMaterialfv(GLenum face, GLenum pname, GLfloat *params) -{ - SIG( "glGetMaterialfv" ); - dllGetMaterialfv( face, pname, params ); -} - -static void APIENTRY logGetMaterialiv(GLenum face, GLenum pname, GLint *params) -{ - SIG( "glGetMaterialiv" ); - dllGetMaterialiv( face, pname, params ); -} - -static void APIENTRY logGetPixelMapfv(GLenum map, GLfloat *values) -{ - SIG( "glGetPixelMapfv" ); - dllGetPixelMapfv( map, values ); -} - -static void APIENTRY logGetPixelMapuiv(GLenum map, GLuint *values) -{ - SIG( "glGetPixelMapuiv" ); - dllGetPixelMapuiv( map, values ); -} - -static void APIENTRY logGetPixelMapusv(GLenum map, GLushort *values) -{ - SIG( "glGetPixelMapusv" ); - dllGetPixelMapusv( map, values ); -} - -static void APIENTRY logGetPointerv(GLenum pname, GLvoid* *params) -{ - SIG( "glGetPointerv" ); - dllGetPointerv( pname, params ); -} - -static void APIENTRY logGetPolygonStipple(GLubyte *mask) -{ - SIG( "glGetPolygonStipple" ); - dllGetPolygonStipple( mask ); -} - -static const GLubyte * APIENTRY logGetString(GLenum name) -{ - SIG( "glGetString" ); - return dllGetString( name ); -} - -static void APIENTRY logGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params) -{ - SIG( "glGetTexEnvfv" ); - dllGetTexEnvfv( target, pname, params ); -} - -static void APIENTRY logGetTexEnviv(GLenum target, GLenum pname, GLint *params) -{ - SIG( "glGetTexEnviv" ); - dllGetTexEnviv( target, pname, params ); -} - -static void APIENTRY logGetTexGendv(GLenum coord, GLenum pname, GLdouble *params) -{ - SIG( "glGetTexGendv" ); - dllGetTexGendv( coord, pname, params ); -} - -static void APIENTRY logGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params) -{ - SIG( "glGetTexGenfv" ); - dllGetTexGenfv( coord, pname, params ); -} - -static void APIENTRY logGetTexGeniv(GLenum coord, GLenum pname, GLint *params) -{ - SIG( "glGetTexGeniv" ); - dllGetTexGeniv( coord, pname, params ); -} - -static void APIENTRY logGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels) -{ - SIG( "glGetTexImage" ); - dllGetTexImage( target, level, format, type, pixels ); -} -static void APIENTRY logGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params ) -{ - SIG( "glGetTexLevelParameterfv" ); - dllGetTexLevelParameterfv( target, level, pname, params ); -} - -static void APIENTRY logGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params) -{ - SIG( "glGetTexLevelParameteriv" ); - dllGetTexLevelParameteriv( target, level, pname, params ); -} - -static void APIENTRY logGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params) -{ - SIG( "glGetTexParameterfv" ); - dllGetTexParameterfv( target, pname, params ); -} - -static void APIENTRY logGetTexParameteriv(GLenum target, GLenum pname, GLint *params) -{ - SIG( "glGetTexParameteriv" ); - dllGetTexParameteriv( target, pname, params ); -} - -static void APIENTRY logHint(GLenum target, GLenum mode) -{ - fprintf( glw_state.log_fp, "glHint( 0x%x, 0x%x )\n", target, mode ); - dllHint( target, mode ); -} - -static void APIENTRY logIndexMask(GLuint mask) -{ - SIG( "glIndexMask" ); - dllIndexMask( mask ); -} - -static void APIENTRY logIndexPointer(GLenum type, GLsizei stride, const void *pointer) -{ - SIG( "glIndexPointer" ); - dllIndexPointer( type, stride, pointer ); -} - -static void APIENTRY logIndexd(GLdouble c) -{ - SIG( "glIndexd" ); - dllIndexd( c ); -} - -static void APIENTRY logIndexdv(const GLdouble *c) -{ - SIG( "glIndexdv" ); - dllIndexdv( c ); -} - -static void APIENTRY logIndexf(GLfloat c) -{ - SIG( "glIndexf" ); - dllIndexf( c ); -} - -static void APIENTRY logIndexfv(const GLfloat *c) -{ - SIG( "glIndexfv" ); - dllIndexfv( c ); -} - -static void APIENTRY logIndexi(GLint c) -{ - SIG( "glIndexi" ); - dllIndexi( c ); -} - -static void APIENTRY logIndexiv(const GLint *c) -{ - SIG( "glIndexiv" ); - dllIndexiv( c ); -} - -static void APIENTRY logIndexs(GLshort c) -{ - SIG( "glIndexs" ); - dllIndexs( c ); -} - -static void APIENTRY logIndexsv(const GLshort *c) -{ - SIG( "glIndexsv" ); - dllIndexsv( c ); -} - -static void APIENTRY logIndexub(GLubyte c) -{ - SIG( "glIndexub" ); - dllIndexub( c ); -} - -static void APIENTRY logIndexubv(const GLubyte *c) -{ - SIG( "glIndexubv" ); - dllIndexubv( c ); -} - -static void APIENTRY logInitNames(void) -{ - SIG( "glInitNames" ); - dllInitNames(); -} - -static void APIENTRY logInterleavedArrays(GLenum format, GLsizei stride, const void *pointer) -{ - SIG( "glInterleavedArrays" ); - dllInterleavedArrays( format, stride, pointer ); -} - -static GLboolean APIENTRY logIsEnabled(GLenum cap) -{ - SIG( "glIsEnabled" ); - return dllIsEnabled( cap ); -} -static GLboolean APIENTRY logIsList(GLuint list) -{ - SIG( "glIsList" ); - return dllIsList( list ); -} -static GLboolean APIENTRY logIsTexture(GLuint texture) -{ - SIG( "glIsTexture" ); - return dllIsTexture( texture ); -} - -static void APIENTRY logLightModelf(GLenum pname, GLfloat param) -{ - SIG( "glLightModelf" ); - dllLightModelf( pname, param ); -} - -static void APIENTRY logLightModelfv(GLenum pname, const GLfloat *params) -{ - SIG( "glLightModelfv" ); - dllLightModelfv( pname, params ); -} - -static void APIENTRY logLightModeli(GLenum pname, GLint param) -{ - SIG( "glLightModeli" ); - dllLightModeli( pname, param ); - -} - -static void APIENTRY logLightModeliv(GLenum pname, const GLint *params) -{ - SIG( "glLightModeliv" ); - dllLightModeliv( pname, params ); -} - -static void APIENTRY logLightf(GLenum light, GLenum pname, GLfloat param) -{ - SIG( "glLightf" ); - dllLightf( light, pname, param ); -} - -static void APIENTRY logLightfv(GLenum light, GLenum pname, const GLfloat *params) -{ - SIG( "glLightfv" ); - dllLightfv( light, pname, params ); -} - -static void APIENTRY logLighti(GLenum light, GLenum pname, GLint param) -{ - SIG( "glLighti" ); - dllLighti( light, pname, param ); -} - -static void APIENTRY logLightiv(GLenum light, GLenum pname, const GLint *params) -{ - SIG( "glLightiv" ); - dllLightiv( light, pname, params ); -} - -static void APIENTRY logLineStipple(GLint factor, GLushort pattern) -{ - SIG( "glLineStipple" ); - dllLineStipple( factor, pattern ); -} - -static void APIENTRY logLineWidth(GLfloat width) -{ - SIG( "glLineWidth" ); - dllLineWidth( width ); -} - -static void APIENTRY logListBase(GLuint base) -{ - SIG( "glListBase" ); - dllListBase( base ); -} - -static void APIENTRY logLoadIdentity(void) -{ - SIG( "glLoadIdentity" ); - dllLoadIdentity(); -} - -static void APIENTRY logLoadMatrixd(const GLdouble *m) -{ - SIG( "glLoadMatrixd" ); - dllLoadMatrixd( m ); -} - -static void APIENTRY logLoadMatrixf(const GLfloat *m) -{ - SIG( "glLoadMatrixf" ); - dllLoadMatrixf( m ); -} - -static void APIENTRY logLoadName(GLuint name) -{ - SIG( "glLoadName" ); - dllLoadName( name ); -} - -static void APIENTRY logLogicOp(GLenum opcode) -{ - SIG( "glLogicOp" ); - dllLogicOp( opcode ); -} - -static void APIENTRY logMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points) -{ - SIG( "glMap1d" ); - dllMap1d( target, u1, u2, stride, order, points ); -} - -static void APIENTRY logMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points) -{ - SIG( "glMap1f" ); - dllMap1f( target, u1, u2, stride, order, points ); -} - -static void APIENTRY logMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points) -{ - SIG( "glMap2d" ); - dllMap2d( target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points ); -} - -static void APIENTRY logMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points) -{ - SIG( "glMap2f" ); - dllMap2f( target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points ); -} - -static void APIENTRY logMapGrid1d(GLint un, GLdouble u1, GLdouble u2) -{ - SIG( "glMapGrid1d" ); - dllMapGrid1d( un, u1, u2 ); -} - -static void APIENTRY logMapGrid1f(GLint un, GLfloat u1, GLfloat u2) -{ - SIG( "glMapGrid1f" ); - dllMapGrid1f( un, u1, u2 ); -} - -static void APIENTRY logMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2) -{ - SIG( "glMapGrid2d" ); - dllMapGrid2d( un, u1, u2, vn, v1, v2 ); -} -static void APIENTRY logMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2) -{ - SIG( "glMapGrid2f" ); - dllMapGrid2f( un, u1, u2, vn, v1, v2 ); -} -static void APIENTRY logMaterialf(GLenum face, GLenum pname, GLfloat param) -{ - SIG( "glMaterialf" ); - dllMaterialf( face, pname, param ); -} -static void APIENTRY logMaterialfv(GLenum face, GLenum pname, const GLfloat *params) -{ - SIG( "glMaterialfv" ); - dllMaterialfv( face, pname, params ); -} - -static void APIENTRY logMateriali(GLenum face, GLenum pname, GLint param) -{ - SIG( "glMateriali" ); - dllMateriali( face, pname, param ); -} - -static void APIENTRY logMaterialiv(GLenum face, GLenum pname, const GLint *params) -{ - SIG( "glMaterialiv" ); - dllMaterialiv( face, pname, params ); -} - -static void APIENTRY logMatrixMode(GLenum mode) -{ - SIG( "glMatrixMode" ); - dllMatrixMode( mode ); -} - -static void APIENTRY logMultMatrixd(const GLdouble *m) -{ - SIG( "glMultMatrixd" ); - dllMultMatrixd( m ); -} - -static void APIENTRY logMultMatrixf(const GLfloat *m) -{ - SIG( "glMultMatrixf" ); - dllMultMatrixf( m ); -} - -static void APIENTRY logNewList(GLuint list, GLenum mode) -{ - SIG( "glNewList" ); - dllNewList( list, mode ); -} - -static void APIENTRY logNormal3b(GLbyte nx, GLbyte ny, GLbyte nz) -{ - SIG ("glNormal3b" ); - dllNormal3b( nx, ny, nz ); -} - -static void APIENTRY logNormal3bv(const GLbyte *v) -{ - SIG( "glNormal3bv" ); - dllNormal3bv( v ); -} - -static void APIENTRY logNormal3d(GLdouble nx, GLdouble ny, GLdouble nz) -{ - SIG( "glNormal3d" ); - dllNormal3d( nx, ny, nz ); -} - -static void APIENTRY logNormal3dv(const GLdouble *v) -{ - SIG( "glNormal3dv" ); - dllNormal3dv( v ); -} - -static void APIENTRY logNormal3f(GLfloat nx, GLfloat ny, GLfloat nz) -{ - SIG( "glNormal3f" ); - dllNormal3f( nx, ny, nz ); -} - -static void APIENTRY logNormal3fv(const GLfloat *v) -{ - SIG( "glNormal3fv" ); - dllNormal3fv( v ); -} -static void APIENTRY logNormal3i(GLint nx, GLint ny, GLint nz) -{ - SIG( "glNormal3i" ); - dllNormal3i( nx, ny, nz ); -} -static void APIENTRY logNormal3iv(const GLint *v) -{ - SIG( "glNormal3iv" ); - dllNormal3iv( v ); -} -static void APIENTRY logNormal3s(GLshort nx, GLshort ny, GLshort nz) -{ - SIG( "glNormal3s" ); - dllNormal3s( nx, ny, nz ); -} -static void APIENTRY logNormal3sv(const GLshort *v) -{ - SIG( "glNormal3sv" ); - dllNormal3sv( v ); -} -static void APIENTRY logNormalPointer(GLenum type, GLsizei stride, const void *pointer) -{ - SIG( "glNormalPointer" ); - dllNormalPointer( type, stride, pointer ); -} -static void APIENTRY logOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) -{ - SIG( "glOrtho" ); - dllOrtho( left, right, bottom, top, zNear, zFar ); -} - -static void APIENTRY logPassThrough(GLfloat token) -{ - SIG( "glPassThrough" ); - dllPassThrough( token ); -} - -static void APIENTRY logPixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values) -{ - SIG( "glPixelMapfv" ); - dllPixelMapfv( map, mapsize, values ); -} - -static void APIENTRY logPixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values) -{ - SIG( "glPixelMapuiv" ); - dllPixelMapuiv( map, mapsize, values ); -} - -static void APIENTRY logPixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values) -{ - SIG( "glPixelMapusv" ); - dllPixelMapusv( map, mapsize, values ); -} -static void APIENTRY logPixelStoref(GLenum pname, GLfloat param) -{ - SIG( "glPixelStoref" ); - dllPixelStoref( pname, param ); -} -static void APIENTRY logPixelStorei(GLenum pname, GLint param) -{ - SIG( "glPixelStorei" ); - dllPixelStorei( pname, param ); -} -static void APIENTRY logPixelTransferf(GLenum pname, GLfloat param) -{ - SIG( "glPixelTransferf" ); - dllPixelTransferf( pname, param ); -} - -static void APIENTRY logPixelTransferi(GLenum pname, GLint param) -{ - SIG( "glPixelTransferi" ); - dllPixelTransferi( pname, param ); -} - -static void APIENTRY logPixelZoom(GLfloat xfactor, GLfloat yfactor) -{ - SIG( "glPixelZoom" ); - dllPixelZoom( xfactor, yfactor ); -} - -static void APIENTRY logPointSize(GLfloat size) -{ - SIG( "glPointSize" ); - dllPointSize( size ); -} - -static void APIENTRY logPolygonMode(GLenum face, GLenum mode) -{ - fprintf( glw_state.log_fp, "glPolygonMode( 0x%x, 0x%x )\n", face, mode ); - dllPolygonMode( face, mode ); -} - -static void APIENTRY logPolygonOffset(GLfloat factor, GLfloat units) -{ - SIG( "glPolygonOffset" ); - dllPolygonOffset( factor, units ); -} -static void APIENTRY logPolygonStipple(const GLubyte *mask ) -{ - SIG( "glPolygonStipple" ); - dllPolygonStipple( mask ); -} -static void APIENTRY logPopAttrib(void) -{ - SIG( "glPopAttrib" ); - dllPopAttrib(); -} - -static void APIENTRY logPopClientAttrib(void) -{ - SIG( "glPopClientAttrib" ); - dllPopClientAttrib(); -} - -static void APIENTRY logPopMatrix(void) -{ - SIG( "glPopMatrix" ); - dllPopMatrix(); -} - -static void APIENTRY logPopName(void) -{ - SIG( "glPopName" ); - dllPopName(); -} - -static void APIENTRY logPrioritizeTextures(GLsizei n, const GLuint *textures, const GLclampf *priorities) -{ - SIG( "glPrioritizeTextures" ); - dllPrioritizeTextures( n, textures, priorities ); -} - -static void APIENTRY logPushAttrib(GLbitfield mask) -{ - SIG( "glPushAttrib" ); - dllPushAttrib( mask ); -} - -static void APIENTRY logPushClientAttrib(GLbitfield mask) -{ - SIG( "glPushClientAttrib" ); - dllPushClientAttrib( mask ); -} - -static void APIENTRY logPushMatrix(void) -{ - SIG( "glPushMatrix" ); - dllPushMatrix(); -} - -static void APIENTRY logPushName(GLuint name) -{ - SIG( "glPushName" ); - dllPushName( name ); -} - -static void APIENTRY logRasterPos2d(GLdouble x, GLdouble y) -{ - SIG ("glRasterPot2d" ); - dllRasterPos2d( x, y ); -} - -static void APIENTRY logRasterPos2dv(const GLdouble *v) -{ - SIG( "glRasterPos2dv" ); - dllRasterPos2dv( v ); -} - -static void APIENTRY logRasterPos2f(GLfloat x, GLfloat y) -{ - SIG( "glRasterPos2f" ); - dllRasterPos2f( x, y ); -} -static void APIENTRY logRasterPos2fv(const GLfloat *v) -{ - SIG( "glRasterPos2dv" ); - dllRasterPos2fv( v ); -} -static void APIENTRY logRasterPos2i(GLint x, GLint y) -{ - SIG( "glRasterPos2if" ); - dllRasterPos2i( x, y ); -} -static void APIENTRY logRasterPos2iv(const GLint *v) -{ - SIG( "glRasterPos2iv" ); - dllRasterPos2iv( v ); -} -static void APIENTRY logRasterPos2s(GLshort x, GLshort y) -{ - SIG( "glRasterPos2s" ); - dllRasterPos2s( x, y ); -} -static void APIENTRY logRasterPos2sv(const GLshort *v) -{ - SIG( "glRasterPos2sv" ); - dllRasterPos2sv( v ); -} -static void APIENTRY logRasterPos3d(GLdouble x, GLdouble y, GLdouble z) -{ - SIG( "glRasterPos3d" ); - dllRasterPos3d( x, y, z ); -} -static void APIENTRY logRasterPos3dv(const GLdouble *v) -{ - SIG( "glRasterPos3dv" ); - dllRasterPos3dv( v ); -} -static void APIENTRY logRasterPos3f(GLfloat x, GLfloat y, GLfloat z) -{ - SIG( "glRasterPos3f" ); - dllRasterPos3f( x, y, z ); -} -static void APIENTRY logRasterPos3fv(const GLfloat *v) -{ - SIG( "glRasterPos3fv" ); - dllRasterPos3fv( v ); -} -static void APIENTRY logRasterPos3i(GLint x, GLint y, GLint z) -{ - SIG( "glRasterPos3i" ); - dllRasterPos3i( x, y, z ); -} -static void APIENTRY logRasterPos3iv(const GLint *v) -{ - SIG( "glRasterPos3iv" ); - dllRasterPos3iv( v ); -} -static void APIENTRY logRasterPos3s(GLshort x, GLshort y, GLshort z) -{ - SIG( "glRasterPos3s" ); - dllRasterPos3s( x, y, z ); -} -static void APIENTRY logRasterPos3sv(const GLshort *v) -{ - SIG( "glRasterPos3sv" ); - dllRasterPos3sv( v ); -} -static void APIENTRY logRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) -{ - SIG( "glRasterPos4d" ); - dllRasterPos4d( x, y, z, w ); -} -static void APIENTRY logRasterPos4dv(const GLdouble *v) -{ - SIG( "glRasterPos4dv" ); - dllRasterPos4dv( v ); -} -static void APIENTRY logRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ - SIG( "glRasterPos4f" ); - dllRasterPos4f( x, y, z, w ); -} -static void APIENTRY logRasterPos4fv(const GLfloat *v) -{ - SIG( "glRasterPos4fv" ); - dllRasterPos4fv( v ); -} -static void APIENTRY logRasterPos4i(GLint x, GLint y, GLint z, GLint w) -{ - SIG( "glRasterPos4i" ); - dllRasterPos4i( x, y, z, w ); -} -static void APIENTRY logRasterPos4iv(const GLint *v) -{ - SIG( "glRasterPos4iv" ); - dllRasterPos4iv( v ); -} -static void APIENTRY logRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w) -{ - SIG( "glRasterPos4s" ); - dllRasterPos4s( x, y, z, w ); -} -static void APIENTRY logRasterPos4sv(const GLshort *v) -{ - SIG( "glRasterPos4sv" ); - dllRasterPos4sv( v ); -} -static void APIENTRY logReadBuffer(GLenum mode) -{ - SIG( "glReadBuffer" ); - dllReadBuffer( mode ); -} -static void APIENTRY logReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels) -{ - SIG( "glReadPixels" ); - dllReadPixels( x, y, width, height, format, type, pixels ); -} - -static void APIENTRY logRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) -{ - SIG( "glRectd" ); - dllRectd( x1, y1, x2, y2 ); -} - -static void APIENTRY logRectdv(const GLdouble *v1, const GLdouble *v2) -{ - SIG( "glRectdv" ); - dllRectdv( v1, v2 ); -} - -static void APIENTRY logRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) -{ - SIG( "glRectf" ); - dllRectf( x1, y1, x2, y2 ); -} - -static void APIENTRY logRectfv(const GLfloat *v1, const GLfloat *v2) -{ - SIG( "glRectfv" ); - dllRectfv( v1, v2 ); -} -static void APIENTRY logRecti(GLint x1, GLint y1, GLint x2, GLint y2) -{ - SIG( "glRecti" ); - dllRecti( x1, y1, x2, y2 ); -} -static void APIENTRY logRectiv(const GLint *v1, const GLint *v2) -{ - SIG( "glRectiv" ); - dllRectiv( v1, v2 ); -} -static void APIENTRY logRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2) -{ - SIG( "glRects" ); - dllRects( x1, y1, x2, y2 ); -} -static void APIENTRY logRectsv(const GLshort *v1, const GLshort *v2) -{ - SIG( "glRectsv" ); - dllRectsv( v1, v2 ); -} -static GLint APIENTRY logRenderMode(GLenum mode) -{ - SIG( "glRenderMode" ); - return dllRenderMode( mode ); -} -static void APIENTRY logRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z) -{ - SIG( "glRotated" ); - dllRotated( angle, x, y, z ); -} - -static void APIENTRY logRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) -{ - SIG( "glRotatef" ); - dllRotatef( angle, x, y, z ); -} - -static void APIENTRY logScaled(GLdouble x, GLdouble y, GLdouble z) -{ - SIG( "glScaled" ); - dllScaled( x, y, z ); -} - -static void APIENTRY logScalef(GLfloat x, GLfloat y, GLfloat z) -{ - SIG( "glScalef" ); - dllScalef( x, y, z ); -} - -static void APIENTRY logScissor(GLint x, GLint y, GLsizei width, GLsizei height) -{ - fprintf( glw_state.log_fp, "glScissor( %d, %d, %d, %d )\n", x, y, width, height ); - dllScissor( x, y, width, height ); -} - -static void APIENTRY logSelectBuffer(GLsizei size, GLuint *buffer) -{ - SIG( "glSelectBuffer" ); - dllSelectBuffer( size, buffer ); -} - -static void APIENTRY logShadeModel(GLenum mode) -{ - SIG( "glShadeModel" ); - dllShadeModel( mode ); -} - -static void APIENTRY logStencilFunc(GLenum func, GLint ref, GLuint mask) -{ - SIG( "glStencilFunc" ); - dllStencilFunc( func, ref, mask ); -} - -static void APIENTRY logStencilMask(GLuint mask) -{ - SIG( "glStencilMask" ); - dllStencilMask( mask ); -} - -static void APIENTRY logStencilOp(GLenum fail, GLenum zfail, GLenum zpass) -{ - SIG( "glStencilOp" ); - dllStencilOp( fail, zfail, zpass ); -} - -static void APIENTRY logTexCoord1d(GLdouble s) -{ - SIG( "glTexCoord1d" ); - dllTexCoord1d( s ); -} - -static void APIENTRY logTexCoord1dv(const GLdouble *v) -{ - SIG( "glTexCoord1dv" ); - dllTexCoord1dv( v ); -} - -static void APIENTRY logTexCoord1f(GLfloat s) -{ - SIG( "glTexCoord1f" ); - dllTexCoord1f( s ); -} -static void APIENTRY logTexCoord1fv(const GLfloat *v) -{ - SIG( "glTexCoord1fv" ); - dllTexCoord1fv( v ); -} -static void APIENTRY logTexCoord1i(GLint s) -{ - SIG( "glTexCoord1i" ); - dllTexCoord1i( s ); -} -static void APIENTRY logTexCoord1iv(const GLint *v) -{ - SIG( "glTexCoord1iv" ); - dllTexCoord1iv( v ); -} -static void APIENTRY logTexCoord1s(GLshort s) -{ - SIG( "glTexCoord1s" ); - dllTexCoord1s( s ); -} -static void APIENTRY logTexCoord1sv(const GLshort *v) -{ - SIG( "glTexCoord1sv" ); - dllTexCoord1sv( v ); -} -static void APIENTRY logTexCoord2d(GLdouble s, GLdouble t) -{ - SIG( "glTexCoord2d" ); - dllTexCoord2d( s, t ); -} - -static void APIENTRY logTexCoord2dv(const GLdouble *v) -{ - SIG( "glTexCoord2dv" ); - dllTexCoord2dv( v ); -} -static void APIENTRY logTexCoord2f(GLfloat s, GLfloat t) -{ - SIG( "glTexCoord2f" ); - dllTexCoord2f( s, t ); -} -static void APIENTRY logTexCoord2fv(const GLfloat *v) -{ - SIG( "glTexCoord2fv" ); - dllTexCoord2fv( v ); -} -static void APIENTRY logTexCoord2i(GLint s, GLint t) -{ - SIG( "glTexCoord2i" ); - dllTexCoord2i( s, t ); -} -static void APIENTRY logTexCoord2iv(const GLint *v) -{ - SIG( "glTexCoord2iv" ); - dllTexCoord2iv( v ); -} -static void APIENTRY logTexCoord2s(GLshort s, GLshort t) -{ - SIG( "glTexCoord2s" ); - dllTexCoord2s( s, t ); -} -static void APIENTRY logTexCoord2sv(const GLshort *v) -{ - SIG( "glTexCoord2sv" ); - dllTexCoord2sv( v ); -} -static void APIENTRY logTexCoord3d(GLdouble s, GLdouble t, GLdouble r) -{ - SIG( "glTexCoord3d" ); - dllTexCoord3d( s, t, r ); -} -static void APIENTRY logTexCoord3dv(const GLdouble *v) -{ - SIG( "glTexCoord3dv" ); - dllTexCoord3dv( v ); -} -static void APIENTRY logTexCoord3f(GLfloat s, GLfloat t, GLfloat r) -{ - SIG( "glTexCoord3f" ); - dllTexCoord3f( s, t, r ); -} -static void APIENTRY logTexCoord3fv(const GLfloat *v) -{ - SIG( "glTexCoord3fv" ); - dllTexCoord3fv( v ); -} -static void APIENTRY logTexCoord3i(GLint s, GLint t, GLint r) -{ - SIG( "glTexCoord3i" ); - dllTexCoord3i( s, t, r ); -} -static void APIENTRY logTexCoord3iv(const GLint *v) -{ - SIG( "glTexCoord3iv" ); - dllTexCoord3iv( v ); -} -static void APIENTRY logTexCoord3s(GLshort s, GLshort t, GLshort r) -{ - SIG( "glTexCoord3s" ); - dllTexCoord3s( s, t, r ); -} -static void APIENTRY logTexCoord3sv(const GLshort *v) -{ - SIG( "glTexCoord3sv" ); - dllTexCoord3sv( v ); -} -static void APIENTRY logTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q) -{ - SIG( "glTexCoord4d" ); - dllTexCoord4d( s, t, r, q ); -} -static void APIENTRY logTexCoord4dv(const GLdouble *v) -{ - SIG( "glTexCoord4dv" ); - dllTexCoord4dv( v ); -} -static void APIENTRY logTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q) -{ - SIG( "glTexCoord4f" ); - dllTexCoord4f( s, t, r, q ); -} -static void APIENTRY logTexCoord4fv(const GLfloat *v) -{ - SIG( "glTexCoord4fv" ); - dllTexCoord4fv( v ); -} -static void APIENTRY logTexCoord4i(GLint s, GLint t, GLint r, GLint q) -{ - SIG( "glTexCoord4i" ); - dllTexCoord4i( s, t, r, q ); -} -static void APIENTRY logTexCoord4iv(const GLint *v) -{ - SIG( "glTexCoord4iv" ); - dllTexCoord4iv( v ); -} -static void APIENTRY logTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q) -{ - SIG( "glTexCoord4s" ); - dllTexCoord4s( s, t, r, q ); -} -static void APIENTRY logTexCoord4sv(const GLshort *v) -{ - SIG( "glTexCoord4sv" ); - dllTexCoord4sv( v ); -} -static void APIENTRY logTexCoordPointer(GLint size, GLenum type, GLsizei stride, const void *pointer) -{ - fprintf( glw_state.log_fp, "glTexCoordPointer( %d, %s, %d, MEM )\n", size, TypeToString( type ), stride ); - dllTexCoordPointer( size, type, stride, pointer ); -} - -static void APIENTRY logTexEnvf(GLenum target, GLenum pname, GLfloat param) -{ - fprintf( glw_state.log_fp, "glTexEnvf( 0x%x, 0x%x, %f )\n", target, pname, param ); - dllTexEnvf( target, pname, param ); -} - -static void APIENTRY logTexEnvfv(GLenum target, GLenum pname, const GLfloat *params) -{ - SIG( "glTexEnvfv" ); - dllTexEnvfv( target, pname, params ); -} - -static void APIENTRY logTexEnvi(GLenum target, GLenum pname, GLint param) -{ - fprintf( glw_state.log_fp, "glTexEnvi( 0x%x, 0x%x, 0x%x )\n", target, pname, param ); - dllTexEnvi( target, pname, param ); -} -static void APIENTRY logTexEnviv(GLenum target, GLenum pname, const GLint *params) -{ - SIG( "glTexEnviv" ); - dllTexEnviv( target, pname, params ); -} - -static void APIENTRY logTexGend(GLenum coord, GLenum pname, GLdouble param) -{ - SIG( "glTexGend" ); - dllTexGend( coord, pname, param ); -} - -static void APIENTRY logTexGendv(GLenum coord, GLenum pname, const GLdouble *params) -{ - SIG( "glTexGendv" ); - dllTexGendv( coord, pname, params ); -} - -static void APIENTRY logTexGenf(GLenum coord, GLenum pname, GLfloat param) -{ - SIG( "glTexGenf" ); - dllTexGenf( coord, pname, param ); -} -static void APIENTRY logTexGenfv(GLenum coord, GLenum pname, const GLfloat *params) -{ - SIG( "glTexGenfv" ); - dllTexGenfv( coord, pname, params ); -} -static void APIENTRY logTexGeni(GLenum coord, GLenum pname, GLint param) -{ - SIG( "glTexGeni" ); - dllTexGeni( coord, pname, param ); -} -static void APIENTRY logTexGeniv(GLenum coord, GLenum pname, const GLint *params) -{ - SIG( "glTexGeniv" ); - dllTexGeniv( coord, pname, params ); -} -static void APIENTRY logTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels) -{ - SIG( "glTexImage1D" ); - dllTexImage1D( target, level, internalformat, width, border, format, type, pixels ); -} -static void APIENTRY logTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels) -{ - SIG( "glTexImage2D" ); - dllTexImage2D( target, level, internalformat, width, height, border, format, type, pixels ); -} - -static void APIENTRY logTexParameterf(GLenum target, GLenum pname, GLfloat param) -{ - fprintf( glw_state.log_fp, "glTexParameterf( 0x%x, 0x%x, %f )\n", target, pname, param ); - dllTexParameterf( target, pname, param ); -} - -static void APIENTRY logTexParameterfv(GLenum target, GLenum pname, const GLfloat *params) -{ - SIG( "glTexParameterfv" ); - dllTexParameterfv( target, pname, params ); -} -static void APIENTRY logTexParameteri(GLenum target, GLenum pname, GLint param) -{ - fprintf( glw_state.log_fp, "glTexParameteri( 0x%x, 0x%x, 0x%x )\n", target, pname, param ); - dllTexParameteri( target, pname, param ); -} -static void APIENTRY logTexParameteriv(GLenum target, GLenum pname, const GLint *params) -{ - SIG( "glTexParameteriv" ); - dllTexParameteriv( target, pname, params ); -} -static void APIENTRY logTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels) -{ - SIG( "glTexSubImage1D" ); - dllTexSubImage1D( target, level, xoffset, width, format, type, pixels ); -} -static void APIENTRY logTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) -{ - SIG( "glTexSubImage2D" ); - dllTexSubImage2D( target, level, xoffset, yoffset, width, height, format, type, pixels ); -} -static void APIENTRY logTranslated(GLdouble x, GLdouble y, GLdouble z) -{ - SIG( "glTranslated" ); - dllTranslated( x, y, z ); -} - -static void APIENTRY logTranslatef(GLfloat x, GLfloat y, GLfloat z) -{ - SIG( "glTranslatef" ); - dllTranslatef( x, y, z ); -} - -static void APIENTRY logVertex2d(GLdouble x, GLdouble y) -{ - SIG( "glVertex2d" ); - dllVertex2d( x, y ); -} - -static void APIENTRY logVertex2dv(const GLdouble *v) -{ - SIG( "glVertex2dv" ); - dllVertex2dv( v ); -} -static void APIENTRY logVertex2f(GLfloat x, GLfloat y) -{ - SIG( "glVertex2f" ); - dllVertex2f( x, y ); -} -static void APIENTRY logVertex2fv(const GLfloat *v) -{ - SIG( "glVertex2fv" ); - dllVertex2fv( v ); -} -static void APIENTRY logVertex2i(GLint x, GLint y) -{ - SIG( "glVertex2i" ); - dllVertex2i( x, y ); -} -static void APIENTRY logVertex2iv(const GLint *v) -{ - SIG( "glVertex2iv" ); - dllVertex2iv( v ); -} -static void APIENTRY logVertex2s(GLshort x, GLshort y) -{ - SIG( "glVertex2s" ); - dllVertex2s( x, y ); -} -static void APIENTRY logVertex2sv(const GLshort *v) -{ - SIG( "glVertex2sv" ); - dllVertex2sv( v ); -} -static void APIENTRY logVertex3d(GLdouble x, GLdouble y, GLdouble z) -{ - SIG( "glVertex3d" ); - dllVertex3d( x, y, z ); -} -static void APIENTRY logVertex3dv(const GLdouble *v) -{ - SIG( "glVertex3dv" ); - dllVertex3dv( v ); -} -static void APIENTRY logVertex3f(GLfloat x, GLfloat y, GLfloat z) -{ - SIG( "glVertex3f" ); - dllVertex3f( x, y, z ); -} -static void APIENTRY logVertex3fv(const GLfloat *v) -{ - SIG( "glVertex3fv" ); - dllVertex3fv( v ); -} -static void APIENTRY logVertex3i(GLint x, GLint y, GLint z) -{ - SIG( "glVertex3i" ); - dllVertex3i( x, y, z ); -} -static void APIENTRY logVertex3iv(const GLint *v) -{ - SIG( "glVertex3iv" ); - dllVertex3iv( v ); -} -static void APIENTRY logVertex3s(GLshort x, GLshort y, GLshort z) -{ - SIG( "glVertex3s" ); - dllVertex3s( x, y, z ); -} -static void APIENTRY logVertex3sv(const GLshort *v) -{ - SIG( "glVertex3sv" ); - dllVertex3sv( v ); -} -static void APIENTRY logVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) -{ - SIG( "glVertex4d" ); - dllVertex4d( x, y, z, w ); -} -static void APIENTRY logVertex4dv(const GLdouble *v) -{ - SIG( "glVertex4dv" ); - dllVertex4dv( v ); -} -static void APIENTRY logVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ - SIG( "glVertex4f" ); - dllVertex4f( x, y, z, w ); -} -static void APIENTRY logVertex4fv(const GLfloat *v) -{ - SIG( "glVertex4fv" ); - dllVertex4fv( v ); -} -static void APIENTRY logVertex4i(GLint x, GLint y, GLint z, GLint w) -{ - SIG( "glVertex4i" ); - dllVertex4i( x, y, z, w ); -} -static void APIENTRY logVertex4iv(const GLint *v) -{ - SIG( "glVertex4iv" ); - dllVertex4iv( v ); -} -static void APIENTRY logVertex4s(GLshort x, GLshort y, GLshort z, GLshort w) -{ - SIG( "glVertex4s" ); - dllVertex4s( x, y, z, w ); -} -static void APIENTRY logVertex4sv(const GLshort *v) -{ - SIG( "glVertex4sv" ); - dllVertex4sv( v ); -} -static void APIENTRY logVertexPointer(GLint size, GLenum type, GLsizei stride, const void *pointer) -{ - fprintf( glw_state.log_fp, "glVertexPointer( %d, %s, %d, MEM )\n", size, TypeToString( type ), stride ); - dllVertexPointer( size, type, stride, pointer ); -} -static void APIENTRY logViewport(GLint x, GLint y, GLsizei width, GLsizei height) -{ - fprintf( glw_state.log_fp, "glViewport( %d, %d, %d, %d )\n", x, y, width, height ); - dllViewport( x, y, width, height ); -} - -/* -** QGL_Shutdown -** -** Unloads the specified DLL then nulls out all the proc pointers. This -** is only called during a hard shutdown of the OGL subsystem (e.g. vid_restart). -*/ -void QGL_Shutdown( void ) -{ -// Com_Printf ("...shutting down QGL\n" ); - - if ( glw_state.hinstOpenGL ) - { -// Com_Printf ("...unloading OpenGL DLL\n" ); - FreeLibrary( glw_state.hinstOpenGL ); - } - - glw_state.hinstOpenGL = NULL; - - qglAccum = NULL; - qglAlphaFunc = NULL; - qglAreTexturesResident = NULL; - qglArrayElement = NULL; - qglBegin = NULL; - qglBindTexture = NULL; - qglBitmap = NULL; - qglBlendFunc = NULL; - qglCallList = NULL; - qglCallLists = NULL; - qglClear = NULL; - qglClearAccum = NULL; - qglClearColor = NULL; - qglClearDepth = NULL; - qglClearIndex = NULL; - qglClearStencil = NULL; - qglClipPlane = NULL; - qglColor3b = NULL; - qglColor3bv = NULL; - qglColor3d = NULL; - qglColor3dv = NULL; - qglColor3f = NULL; - qglColor3fv = NULL; - qglColor3i = NULL; - qglColor3iv = NULL; - qglColor3s = NULL; - qglColor3sv = NULL; - qglColor3ub = NULL; - qglColor3ubv = NULL; - qglColor3ui = NULL; - qglColor3uiv = NULL; - qglColor3us = NULL; - qglColor3usv = NULL; - qglColor4b = NULL; - qglColor4bv = NULL; - qglColor4d = NULL; - qglColor4dv = NULL; - qglColor4f = NULL; - qglColor4fv = NULL; - qglColor4i = NULL; - qglColor4iv = NULL; - qglColor4s = NULL; - qglColor4sv = NULL; - qglColor4ub = NULL; - qglColor4ubv = NULL; - qglColor4ui = NULL; - qglColor4uiv = NULL; - qglColor4us = NULL; - qglColor4usv = NULL; - qglColorMask = NULL; - qglColorMaterial = NULL; - qglColorPointer = NULL; - qglCopyPixels = NULL; - qglCopyTexImage1D = NULL; - qglCopyTexImage2D = NULL; - qglCopyTexSubImage1D = NULL; - qglCopyTexSubImage2D = NULL; - qglCullFace = NULL; - qglDeleteLists = NULL; - qglDeleteTextures = NULL; - qglDepthFunc = NULL; - qglDepthMask = NULL; - qglDepthRange = NULL; - qglDisable = NULL; - qglDisableClientState = NULL; - qglDrawArrays = NULL; - qglDrawBuffer = NULL; - qglDrawElements = NULL; - qglDrawPixels = NULL; - qglEdgeFlag = NULL; - qglEdgeFlagPointer = NULL; - qglEdgeFlagv = NULL; - qglEnable = NULL; - qglEnableClientState = NULL; - qglEnd = NULL; - qglEndList = NULL; - qglEvalCoord1d = NULL; - qglEvalCoord1dv = NULL; - qglEvalCoord1f = NULL; - qglEvalCoord1fv = NULL; - qglEvalCoord2d = NULL; - qglEvalCoord2dv = NULL; - qglEvalCoord2f = NULL; - qglEvalCoord2fv = NULL; - qglEvalMesh1 = NULL; - qglEvalMesh2 = NULL; - qglEvalPoint1 = NULL; - qglEvalPoint2 = NULL; - qglFeedbackBuffer = NULL; - qglFinish = NULL; - qglFlush = NULL; - qglFogf = NULL; - qglFogfv = NULL; - qglFogi = NULL; - qglFogiv = NULL; - qglFrontFace = NULL; - qglFrustum = NULL; - qglGenLists = NULL; - qglGenTextures = NULL; - qglGetBooleanv = NULL; - qglGetClipPlane = NULL; - qglGetDoublev = NULL; - qglGetError = NULL; - qglGetFloatv = NULL; - qglGetIntegerv = NULL; - qglGetLightfv = NULL; - qglGetLightiv = NULL; - qglGetMapdv = NULL; - qglGetMapfv = NULL; - qglGetMapiv = NULL; - qglGetMaterialfv = NULL; - qglGetMaterialiv = NULL; - qglGetPixelMapfv = NULL; - qglGetPixelMapuiv = NULL; - qglGetPixelMapusv = NULL; - qglGetPointerv = NULL; - qglGetPolygonStipple = NULL; - qglGetString = NULL; - qglGetTexEnvfv = NULL; - qglGetTexEnviv = NULL; - qglGetTexGendv = NULL; - qglGetTexGenfv = NULL; - qglGetTexGeniv = NULL; - qglGetTexImage = NULL; - qglGetTexLevelParameterfv = NULL; - qglGetTexLevelParameteriv = NULL; - qglGetTexParameterfv = NULL; - qglGetTexParameteriv = NULL; - qglHint = NULL; - qglIndexMask = NULL; - qglIndexPointer = NULL; - qglIndexd = NULL; - qglIndexdv = NULL; - qglIndexf = NULL; - qglIndexfv = NULL; - qglIndexi = NULL; - qglIndexiv = NULL; - qglIndexs = NULL; - qglIndexsv = NULL; - qglIndexub = NULL; - qglIndexubv = NULL; - qglInitNames = NULL; - qglInterleavedArrays = NULL; - qglIsEnabled = NULL; - qglIsList = NULL; - qglIsTexture = NULL; - qglLightModelf = NULL; - qglLightModelfv = NULL; - qglLightModeli = NULL; - qglLightModeliv = NULL; - qglLightf = NULL; - qglLightfv = NULL; - qglLighti = NULL; - qglLightiv = NULL; - qglLineStipple = NULL; - qglLineWidth = NULL; - qglListBase = NULL; - qglLoadIdentity = NULL; - qglLoadMatrixd = NULL; - qglLoadMatrixf = NULL; - qglLoadName = NULL; - qglLogicOp = NULL; - qglMap1d = NULL; - qglMap1f = NULL; - qglMap2d = NULL; - qglMap2f = NULL; - qglMapGrid1d = NULL; - qglMapGrid1f = NULL; - qglMapGrid2d = NULL; - qglMapGrid2f = NULL; - qglMaterialf = NULL; - qglMaterialfv = NULL; - qglMateriali = NULL; - qglMaterialiv = NULL; - qglMatrixMode = NULL; - qglMultMatrixd = NULL; - qglMultMatrixf = NULL; - qglNewList = NULL; - qglNormal3b = NULL; - qglNormal3bv = NULL; - qglNormal3d = NULL; - qglNormal3dv = NULL; - qglNormal3f = NULL; - qglNormal3fv = NULL; - qglNormal3i = NULL; - qglNormal3iv = NULL; - qglNormal3s = NULL; - qglNormal3sv = NULL; - qglNormalPointer = NULL; - qglOrtho = NULL; - qglPassThrough = NULL; - qglPixelMapfv = NULL; - qglPixelMapuiv = NULL; - qglPixelMapusv = NULL; - qglPixelStoref = NULL; - qglPixelStorei = NULL; - qglPixelTransferf = NULL; - qglPixelTransferi = NULL; - qglPixelZoom = NULL; - qglPointSize = NULL; - qglPolygonMode = NULL; - qglPolygonOffset = NULL; - qglPolygonStipple = NULL; - qglPopAttrib = NULL; - qglPopClientAttrib = NULL; - qglPopMatrix = NULL; - qglPopName = NULL; - qglPrioritizeTextures = NULL; - qglPushAttrib = NULL; - qglPushClientAttrib = NULL; - qglPushMatrix = NULL; - qglPushName = NULL; - qglRasterPos2d = NULL; - qglRasterPos2dv = NULL; - qglRasterPos2f = NULL; - qglRasterPos2fv = NULL; - qglRasterPos2i = NULL; - qglRasterPos2iv = NULL; - qglRasterPos2s = NULL; - qglRasterPos2sv = NULL; - qglRasterPos3d = NULL; - qglRasterPos3dv = NULL; - qglRasterPos3f = NULL; - qglRasterPos3fv = NULL; - qglRasterPos3i = NULL; - qglRasterPos3iv = NULL; - qglRasterPos3s = NULL; - qglRasterPos3sv = NULL; - qglRasterPos4d = NULL; - qglRasterPos4dv = NULL; - qglRasterPos4f = NULL; - qglRasterPos4fv = NULL; - qglRasterPos4i = NULL; - qglRasterPos4iv = NULL; - qglRasterPos4s = NULL; - qglRasterPos4sv = NULL; - qglReadBuffer = NULL; - qglReadPixels = NULL; - qglRectd = NULL; - qglRectdv = NULL; - qglRectf = NULL; - qglRectfv = NULL; - qglRecti = NULL; - qglRectiv = NULL; - qglRects = NULL; - qglRectsv = NULL; - qglRenderMode = NULL; - qglRotated = NULL; - qglRotatef = NULL; - qglScaled = NULL; - qglScalef = NULL; - qglScissor = NULL; - qglSelectBuffer = NULL; - qglShadeModel = NULL; - qglStencilFunc = NULL; - qglStencilMask = NULL; - qglStencilOp = NULL; - qglTexCoord1d = NULL; - qglTexCoord1dv = NULL; - qglTexCoord1f = NULL; - qglTexCoord1fv = NULL; - qglTexCoord1i = NULL; - qglTexCoord1iv = NULL; - qglTexCoord1s = NULL; - qglTexCoord1sv = NULL; - qglTexCoord2d = NULL; - qglTexCoord2dv = NULL; - qglTexCoord2f = NULL; - qglTexCoord2fv = NULL; - qglTexCoord2i = NULL; - qglTexCoord2iv = NULL; - qglTexCoord2s = NULL; - qglTexCoord2sv = NULL; - qglTexCoord3d = NULL; - qglTexCoord3dv = NULL; - qglTexCoord3f = NULL; - qglTexCoord3fv = NULL; - qglTexCoord3i = NULL; - qglTexCoord3iv = NULL; - qglTexCoord3s = NULL; - qglTexCoord3sv = NULL; - qglTexCoord4d = NULL; - qglTexCoord4dv = NULL; - qglTexCoord4f = NULL; - qglTexCoord4fv = NULL; - qglTexCoord4i = NULL; - qglTexCoord4iv = NULL; - qglTexCoord4s = NULL; - qglTexCoord4sv = NULL; - qglTexCoordPointer = NULL; - qglTexEnvf = NULL; - qglTexEnvfv = NULL; - qglTexEnvi = NULL; - qglTexEnviv = NULL; - qglTexGend = NULL; - qglTexGendv = NULL; - qglTexGenf = NULL; - qglTexGenfv = NULL; - qglTexGeni = NULL; - qglTexGeniv = NULL; - qglTexImage1D = NULL; - qglTexImage2D = NULL; - qglTexParameterf = NULL; - qglTexParameterfv = NULL; - qglTexParameteri = NULL; - qglTexParameteriv = NULL; - qglTexSubImage1D = NULL; - qglTexSubImage2D = NULL; - qglTranslated = NULL; - qglTranslatef = NULL; - qglVertex2d = NULL; - qglVertex2dv = NULL; - qglVertex2f = NULL; - qglVertex2fv = NULL; - qglVertex2i = NULL; - qglVertex2iv = NULL; - qglVertex2s = NULL; - qglVertex2sv = NULL; - qglVertex3d = NULL; - qglVertex3dv = NULL; - qglVertex3f = NULL; - qglVertex3fv = NULL; - qglVertex3i = NULL; - qglVertex3iv = NULL; - qglVertex3s = NULL; - qglVertex3sv = NULL; - qglVertex4d = NULL; - qglVertex4dv = NULL; - qglVertex4f = NULL; - qglVertex4fv = NULL; - qglVertex4i = NULL; - qglVertex4iv = NULL; - qglVertex4s = NULL; - qglVertex4sv = NULL; - qglVertexPointer = NULL; - qglViewport = NULL; - - qwglCopyContext = NULL; - qwglCreateContext = NULL; - qwglCreateLayerContext = NULL; - qwglDeleteContext = NULL; - qwglDescribeLayerPlane = NULL; - qwglGetCurrentContext = NULL; - qwglGetCurrentDC = NULL; - qwglGetLayerPaletteEntries = NULL; - qwglGetProcAddress = NULL; - qwglMakeCurrent = NULL; - qwglRealizeLayerPalette = NULL; - qwglSetLayerPaletteEntries = NULL; - qwglShareLists = NULL; - qwglSwapLayerBuffers = NULL; - qwglUseFontBitmaps = NULL; - qwglUseFontOutlines = NULL; -} - -# pragma warning (disable : 4113 4133 4047 ) -# define GPA( a ) GetProcAddress( glw_state.hinstOpenGL, a ) - -/* -** QGL_Init -** -** This is responsible for binding our qgl function pointers to -** the appropriate GL stuff. In Windows this means doing a -** LoadLibrary and a bunch of calls to GetProcAddress. On other -** operating systems we need to do the right thing, whatever that -** might be. -*/ -qboolean QGL_Init( const char *dllname ) -{ - assert( glw_state.hinstOpenGL == 0 ); - - Com_Printf ("...initializing QGL\n" ); - -// Com_Printf ("...calling LoadLibrary( '%s.dll' ): ", dllname ); - - if ( ( glw_state.hinstOpenGL = LoadLibrary( dllname ) ) == 0 ) - { - DWORD dw = GetLastError(); - Com_Printf ("failed %u\n", dw ); - return qfalse; - } - Com_Printf ("succeeded\n" ); - - qglAccum = dllAccum = (void (APIENTRY *)(unsigned int,float))GPA( "glAccum" ); - qglAlphaFunc = dllAlphaFunc = (void (APIENTRY *)(unsigned int,float))GPA( "glAlphaFunc" ); - qglAreTexturesResident = dllAreTexturesResident = (unsigned char (APIENTRY *)(int,const unsigned int *,unsigned char *))GPA( "glAreTexturesResident" ); - qglArrayElement = dllArrayElement = (void (APIENTRY *)(int))GPA( "glArrayElement" ); - qglBegin = dllBegin = (void (APIENTRY *)(unsigned int))GPA( "glBegin" ); - qglBindTexture = dllBindTexture = (void (APIENTRY *)(unsigned int,unsigned int))GPA( "glBindTexture" ); - qglBitmap = dllBitmap = (void (APIENTRY *)(int,int,float,float,float,float,const unsigned char *))GPA( "glBitmap" ); - qglBlendFunc = dllBlendFunc = (void (APIENTRY *)(unsigned int,unsigned int))GPA( "glBlendFunc" ); - qglCallList = dllCallList = (void (APIENTRY *)(unsigned int))GPA( "glCallList" ); - qglCallLists = dllCallLists = (void (APIENTRY *)(int,unsigned int,const void *))GPA( "glCallLists" ); - qglClear = dllClear = (void (APIENTRY *)(unsigned int))GPA( "glClear" ); - qglClearAccum = dllClearAccum = (void (APIENTRY *)(float,float,float,float))GPA( "glClearAccum" ); - qglClearColor = dllClearColor = (void (APIENTRY *)(float,float,float,float))GPA( "glClearColor" ); - qglClearDepth = dllClearDepth = (void (APIENTRY *)(double))GPA( "glClearDepth" ); - qglClearIndex = dllClearIndex = (void (APIENTRY *)(float))GPA( "glClearIndex" ); - qglClearStencil = dllClearStencil = (void (APIENTRY *)(int))GPA( "glClearStencil" ); - qglClipPlane = dllClipPlane = (void (APIENTRY *)(unsigned int,const double *))GPA( "glClipPlane" ); - qglColor3b = dllColor3b = (void (APIENTRY *)(signed char,signed char,signed char))GPA( "glColor3b" ); - qglColor3bv = dllColor3bv = (void (APIENTRY *)(const signed char *))GPA( "glColor3bv" ); - qglColor3d = dllColor3d = (void (APIENTRY *)(double,double,double))GPA( "glColor3d" ); - qglColor3dv = dllColor3dv = (void (APIENTRY *)(const double *))GPA( "glColor3dv" ); - qglColor3f = dllColor3f = (void (APIENTRY *)(float,float,float))GPA( "glColor3f" ); - qglColor3fv = dllColor3fv = (void (APIENTRY *)(const float *))GPA( "glColor3fv" ); - qglColor3i = dllColor3i = (void (APIENTRY *)(int,int,int))GPA( "glColor3i" ); - qglColor3iv = dllColor3iv = (void (APIENTRY *)(const int *))GPA( "glColor3iv" ); - qglColor3s = dllColor3s = (void (APIENTRY *)(short,short,short))GPA( "glColor3s" ); - qglColor3sv = dllColor3sv = (void (APIENTRY *)(const short *))GPA( "glColor3sv" ); - qglColor3ub = dllColor3ub = (void (APIENTRY *)(unsigned char,unsigned char,unsigned char))GPA( "glColor3ub" ); - qglColor3ubv = dllColor3ubv = (void (APIENTRY *)(const unsigned char *))GPA( "glColor3ubv" ); - qglColor3ui = dllColor3ui = (void (APIENTRY *)(unsigned int,unsigned int,unsigned int))GPA( "glColor3ui" ); - qglColor3uiv = dllColor3uiv = (void (APIENTRY *)(const unsigned int *))GPA( "glColor3uiv" ); - qglColor3us = dllColor3us = (void (APIENTRY *)(unsigned short,unsigned short,unsigned short))GPA( "glColor3us" ); - qglColor3usv = dllColor3usv = (void (APIENTRY *)(const unsigned short *))GPA( "glColor3usv" ); - qglColor4b = dllColor4b = (void (APIENTRY *)(signed char,signed char,signed char,signed char))GPA( "glColor4b" ); - qglColor4bv = dllColor4bv = (void (APIENTRY *)(const signed char *))GPA( "glColor4bv" ); - qglColor4d = dllColor4d = (void (APIENTRY *)(double,double,double,double))GPA( "glColor4d" ); - qglColor4dv = dllColor4dv = (void (APIENTRY *)(const double *))GPA( "glColor4dv" ); - qglColor4f = dllColor4f = (void (APIENTRY *)(float,float,float,float))GPA( "glColor4f" ); - qglColor4fv = dllColor4fv = (void (APIENTRY *)(const float *))GPA( "glColor4fv" ); - qglColor4i = dllColor4i = (void (APIENTRY *)(int,int,int,int))GPA( "glColor4i" ); - qglColor4iv = dllColor4iv = (void (APIENTRY *)(const int *))GPA( "glColor4iv" ); - qglColor4s = dllColor4s = (void (APIENTRY *)(short,short,short,short))GPA( "glColor4s" ); - qglColor4sv = dllColor4sv = (void (APIENTRY *)(const short *))GPA( "glColor4sv" ); - qglColor4ub = dllColor4ub = (void (APIENTRY *)(unsigned char,unsigned char,unsigned char,unsigned char))GPA( "glColor4ub" ); - qglColor4ubv = dllColor4ubv = (void (APIENTRY *)(const unsigned char *))GPA( "glColor4ubv" ); - qglColor4ui = dllColor4ui = (void (APIENTRY *)(unsigned int,unsigned int,unsigned int,unsigned int))GPA( "glColor4ui" ); - qglColor4uiv = dllColor4uiv = (void (APIENTRY *)(const unsigned int *))GPA( "glColor4uiv" ); - qglColor4us = dllColor4us = (void (APIENTRY *)(unsigned short,unsigned short,unsigned short,unsigned short))GPA( "glColor4us" ); - qglColor4usv = dllColor4usv = (void (APIENTRY *)(const unsigned short *))GPA( "glColor4usv" ); - qglColorMask = dllColorMask = (void (APIENTRY *)(unsigned char,unsigned char,unsigned char,unsigned char))GPA( "glColorMask" ); - qglColorMaterial = dllColorMaterial = (void (APIENTRY *)(unsigned int,unsigned int))GPA( "glColorMaterial" ); - qglColorPointer = dllColorPointer = (void (APIENTRY *)(int,unsigned int,int,const void *))GPA( "glColorPointer" ); - qglCopyPixels = dllCopyPixels = (void (APIENTRY *)(int,int,int,int,unsigned int))GPA( "glCopyPixels" ); - qglCopyTexImage1D = dllCopyTexImage1D = (void (APIENTRY *)(unsigned int,int,unsigned int,int,int,int,int))GPA( "glCopyTexImage1D" ); - qglCopyTexImage2D = dllCopyTexImage2D = (void (APIENTRY *)(unsigned int,int,unsigned int,int,int,int,int,int))GPA( "glCopyTexImage2D" ); - qglCopyTexSubImage1D = dllCopyTexSubImage1D = (void (APIENTRY *)(unsigned int,int,int,int,int,int))GPA( "glCopyTexSubImage1D" ); - qglCopyTexSubImage2D = dllCopyTexSubImage2D = (void (APIENTRY *)(unsigned int,int,int,int,int,int,int,int))GPA( "glCopyTexSubImage2D" ); - qglCullFace = dllCullFace = (void (APIENTRY *)(unsigned int))GPA( "glCullFace" ); - qglDeleteLists = dllDeleteLists = (void (APIENTRY *)(unsigned int,int))GPA( "glDeleteLists" ); - qglDeleteTextures = dllDeleteTextures = (void (APIENTRY *)(int,const unsigned int *))GPA( "glDeleteTextures" ); - qglDepthFunc = dllDepthFunc = (void (APIENTRY *)(unsigned int))GPA( "glDepthFunc" ); - qglDepthMask = dllDepthMask = (void (APIENTRY *)(unsigned char))GPA( "glDepthMask" ); - qglDepthRange = dllDepthRange = (void (APIENTRY *)(double,double))GPA( "glDepthRange" ); - qglDisable = dllDisable = (void (APIENTRY *)(unsigned int))GPA( "glDisable" ); - qglDisableClientState = dllDisableClientState = (void (APIENTRY *)(unsigned int))GPA( "glDisableClientState" ); - qglDrawArrays = dllDrawArrays = (void (APIENTRY *)(unsigned int,int,int))GPA( "glDrawArrays" ); - qglDrawBuffer = dllDrawBuffer = (void (APIENTRY *)(unsigned int))GPA( "glDrawBuffer" ); - qglDrawElements = dllDrawElements = (void (APIENTRY *)(unsigned int,int,unsigned int,const void *))GPA( "glDrawElements" ); - qglDrawPixels = dllDrawPixels = (void (APIENTRY *)(int,int,unsigned int,unsigned int,const void *))GPA( "glDrawPixels" ); - qglEdgeFlag = dllEdgeFlag = (void (APIENTRY *)(unsigned char))GPA( "glEdgeFlag" ); - qglEdgeFlagPointer = dllEdgeFlagPointer = (void (APIENTRY *)(int,const void *))GPA( "glEdgeFlagPointer" ); - qglEdgeFlagv = dllEdgeFlagv = (void (APIENTRY *)(const unsigned char *))GPA( "glEdgeFlagv" ); - qglEnable = dllEnable = (void (APIENTRY *)(unsigned int))GPA( "glEnable" ); - qglEnableClientState = dllEnableClientState = (void (APIENTRY *)(unsigned int))GPA( "glEnableClientState" ); - qglEnd = dllEnd = (void (APIENTRY *)(void))GPA( "glEnd" ); - qglEndList = dllEndList = (void (APIENTRY *)(void))GPA( "glEndList" ); - qglEvalCoord1d = dllEvalCoord1d = (void (APIENTRY *)(double))GPA( "glEvalCoord1d" ); - qglEvalCoord1dv = dllEvalCoord1dv = (void (APIENTRY *)(const double *))GPA( "glEvalCoord1dv" ); - qglEvalCoord1f = dllEvalCoord1f = (void (APIENTRY *)(float))GPA( "glEvalCoord1f" ); - qglEvalCoord1fv = dllEvalCoord1fv = (void (APIENTRY *)(const float *))GPA( "glEvalCoord1fv" ); - qglEvalCoord2d = dllEvalCoord2d = (void (APIENTRY *)(double,double))GPA( "glEvalCoord2d" ); - qglEvalCoord2dv = dllEvalCoord2dv = (void (APIENTRY *)(const double *))GPA( "glEvalCoord2dv" ); - qglEvalCoord2f = dllEvalCoord2f = (void (APIENTRY *)(float,float))GPA( "glEvalCoord2f" ); - qglEvalCoord2fv = dllEvalCoord2fv = (void (APIENTRY *)(const float *))GPA( "glEvalCoord2fv" ); - qglEvalMesh1 = dllEvalMesh1 = (void (APIENTRY *)(unsigned int,int,int))GPA( "glEvalMesh1" ); - qglEvalMesh2 = dllEvalMesh2 = (void (APIENTRY *)(unsigned int,int,int,int,int))GPA( "glEvalMesh2" ); - qglEvalPoint1 = dllEvalPoint1 = (void (APIENTRY *)(int))GPA( "glEvalPoint1" ); - qglEvalPoint2 = dllEvalPoint2 = (void (APIENTRY *)(int,int))GPA( "glEvalPoint2" ); - qglFeedbackBuffer = dllFeedbackBuffer = (void (APIENTRY *)(int,unsigned int,float *))GPA( "glFeedbackBuffer" ); - qglFinish = dllFinish = (void (APIENTRY *)(void))GPA( "glFinish" ); - qglFlush = dllFlush = (void (APIENTRY *)(void))GPA( "glFlush" ); - qglFogf = dllFogf = (void (APIENTRY *)(unsigned int,float))GPA( "glFogf" ); - qglFogfv = dllFogfv = (void (APIENTRY *)(unsigned int,const float *))GPA( "glFogfv" ); - qglFogi = dllFogi = (void (APIENTRY *)(unsigned int,int))GPA( "glFogi" ); - qglFogiv = dllFogiv = (void (APIENTRY *)(unsigned int,const int *))GPA( "glFogiv" ); - qglFrontFace = dllFrontFace = (void (APIENTRY *)(unsigned int))GPA( "glFrontFace" ); - qglFrustum = dllFrustum = (void (APIENTRY *)(double,double,double,double,double,double))GPA( "glFrustum" ); - qglGenLists = dllGenLists = ( GLuint (APIENTRY * )(int) ) GPA( "glGenLists" ); - qglGenTextures = dllGenTextures = (void (APIENTRY *)(int,unsigned int *))GPA( "glGenTextures" ); - qglGetBooleanv = dllGetBooleanv = (void (APIENTRY *)(unsigned int,unsigned char *))GPA( "glGetBooleanv" ); - qglGetClipPlane = dllGetClipPlane = (void (APIENTRY *)(unsigned int,double *))GPA( "glGetClipPlane" ); - qglGetDoublev = dllGetDoublev = (void (APIENTRY *)(unsigned int,double *))GPA( "glGetDoublev" ); - qglGetError = dllGetError = ( GLenum (APIENTRY * )(void) ) GPA( "glGetError" ); - qglGetFloatv = dllGetFloatv = (void (APIENTRY *)(unsigned int,float *))GPA( "glGetFloatv" ); - qglGetIntegerv = dllGetIntegerv = (void (APIENTRY *)(unsigned int,int *))GPA( "glGetIntegerv" ); - qglGetLightfv = dllGetLightfv = (void (APIENTRY *)(unsigned int,unsigned int,float *))GPA( "glGetLightfv" ); - qglGetLightiv = dllGetLightiv = (void (APIENTRY *)(unsigned int,unsigned int,int *))GPA( "glGetLightiv" ); - qglGetMapdv = dllGetMapdv = (void (APIENTRY *)(unsigned int,unsigned int,double *))GPA( "glGetMapdv" ); - qglGetMapfv = dllGetMapfv = (void (APIENTRY *)(unsigned int,unsigned int,float *))GPA( "glGetMapfv" ); - qglGetMapiv = dllGetMapiv = (void (APIENTRY *)(unsigned int,unsigned int,int *))GPA( "glGetMapiv" ); - qglGetMaterialfv = dllGetMaterialfv = (void (APIENTRY *)(unsigned int,unsigned int,float *))GPA( "glGetMaterialfv" ); - qglGetMaterialiv = dllGetMaterialiv = (void (APIENTRY *)(unsigned int,unsigned int,int *))GPA( "glGetMaterialiv" ); - qglGetPixelMapfv = dllGetPixelMapfv = (void (APIENTRY *)(unsigned int,float *))GPA( "glGetPixelMapfv" ); - qglGetPixelMapuiv = dllGetPixelMapuiv = (void (APIENTRY *)(unsigned int,unsigned int *))GPA( "glGetPixelMapuiv" ); - qglGetPixelMapusv = dllGetPixelMapusv = (void (APIENTRY *)(unsigned int,unsigned short *))GPA( "glGetPixelMapusv" ); - qglGetPointerv = dllGetPointerv = (void (APIENTRY *)(unsigned int,void ** ))GPA( "glGetPointerv" ); - qglGetPolygonStipple = dllGetPolygonStipple = (void (APIENTRY *)(unsigned char *))GPA( "glGetPolygonStipple" ); - qglGetString = dllGetString = (const unsigned char *(APIENTRY *)(unsigned int))GPA( "glGetString" ); - qglGetTexEnvfv = dllGetTexEnvfv = (void (APIENTRY *)(unsigned int,unsigned int,float *))GPA( "glGetTexEnvfv" ); - qglGetTexEnviv = dllGetTexEnviv = (void (APIENTRY *)(unsigned int,unsigned int,int *))GPA( "glGetTexEnviv" ); - qglGetTexGendv = dllGetTexGendv = (void (APIENTRY *)(unsigned int,unsigned int,double *))GPA( "glGetTexGendv" ); - qglGetTexGenfv = dllGetTexGenfv = (void (APIENTRY *)(unsigned int,unsigned int,float *))GPA( "glGetTexGenfv" ); - qglGetTexGeniv = dllGetTexGeniv = (void (APIENTRY *)(unsigned int,unsigned int,int *))GPA( "glGetTexGeniv" ); - qglGetTexImage = dllGetTexImage = (void (APIENTRY *)(unsigned int,int,unsigned int,unsigned int,void *))GPA( "glGetTexImage" ); - qglGetTexParameterfv = dllGetTexParameterfv = (void (APIENTRY *)(unsigned int,unsigned int,float *))GPA( "glGetTexParameterfv" ); - qglGetTexParameteriv = dllGetTexParameteriv = (void (APIENTRY *)(unsigned int,unsigned int,int *))GPA( "glGetTexParameteriv" ); - qglHint = dllHint = (void (APIENTRY *)(unsigned int,unsigned int))GPA( "glHint" ); - qglIndexMask = dllIndexMask = (void (APIENTRY *)(unsigned int))GPA( "glIndexMask" ); - qglIndexPointer = dllIndexPointer = (void (APIENTRY *)(unsigned int,int,const void *))GPA( "glIndexPointer" ); - qglIndexd = dllIndexd = (void (APIENTRY *)(double))GPA( "glIndexd" ); - qglIndexdv = dllIndexdv = (void (APIENTRY *)(const double *))GPA( "glIndexdv" ); - qglIndexf = dllIndexf = (void (APIENTRY *)(float))GPA( "glIndexf" ); - qglIndexfv = dllIndexfv = (void (APIENTRY *)(const float *))GPA( "glIndexfv" ); - qglIndexi = dllIndexi = (void (APIENTRY *)(int))GPA( "glIndexi" ); - qglIndexiv = dllIndexiv = (void (APIENTRY *)(const int *))GPA( "glIndexiv" ); - qglIndexs = dllIndexs = (void (APIENTRY *)(short))GPA( "glIndexs" ); - qglIndexsv = dllIndexsv = (void (APIENTRY *)(const short *))GPA( "glIndexsv" ); - qglIndexub = dllIndexub = (void (APIENTRY *)(unsigned char))GPA( "glIndexub" ); - qglIndexubv = dllIndexubv = (void (APIENTRY *)(const unsigned char *))GPA( "glIndexubv" ); - qglInitNames = dllInitNames = (void (APIENTRY *)(void))GPA( "glInitNames" ); - qglInterleavedArrays = dllInterleavedArrays = (void (APIENTRY *)(unsigned int,int,const void *))GPA( "glInterleavedArrays" ); - qglIsEnabled = dllIsEnabled = (unsigned char (APIENTRY *)(unsigned int))GPA( "glIsEnabled" ); - qglIsList = dllIsList = (unsigned char (APIENTRY *)(unsigned int))GPA( "glIsList" ); - qglIsTexture = dllIsTexture = (unsigned char (APIENTRY *)(unsigned int))GPA( "glIsTexture" ); - qglLightModelf = dllLightModelf = (void (APIENTRY *)(unsigned int,float))GPA( "glLightModelf" ); - qglLightModelfv = dllLightModelfv = (void (APIENTRY *)(unsigned int,const float *))GPA( "glLightModelfv" ); - qglLightModeli = dllLightModeli = (void (APIENTRY *)(unsigned int,int))GPA( "glLightModeli" ); - qglLightModeliv = dllLightModeliv = (void (APIENTRY *)(unsigned int,const int *))GPA( "glLightModeliv" ); - qglLightf = dllLightf = (void (APIENTRY *)(unsigned int,unsigned int,float))GPA( "glLightf" ); - qglLightfv = dllLightfv = (void (APIENTRY *)(unsigned int,unsigned int,const float *))GPA( "glLightfv" ); - qglLighti = dllLighti = (void (APIENTRY *)(unsigned int,unsigned int,int))GPA( "glLighti" ); - qglLightiv = dllLightiv = (void (APIENTRY *)(unsigned int,unsigned int,const int *))GPA( "glLightiv" ); - qglLineStipple = dllLineStipple = (void (APIENTRY *)(int,unsigned short))GPA( "glLineStipple" ); - qglLineWidth = dllLineWidth = (void (APIENTRY *)(float))GPA( "glLineWidth" ); - qglListBase = dllListBase = (void (APIENTRY *)(unsigned int))GPA( "glListBase" ); - qglLoadIdentity = dllLoadIdentity = (void (APIENTRY *)(void))GPA( "glLoadIdentity" ); - qglLoadMatrixd = dllLoadMatrixd = (void (APIENTRY *)(const double *))GPA( "glLoadMatrixd" ); - qglLoadMatrixf = dllLoadMatrixf = (void (APIENTRY *)(const float *))GPA( "glLoadMatrixf" ); - qglLoadName = dllLoadName = (void (APIENTRY *)(unsigned int))GPA( "glLoadName" ); - qglLogicOp = dllLogicOp = (void (APIENTRY *)(unsigned int))GPA( "glLogicOp" ); - qglMap1d = dllMap1d = (void (APIENTRY *)(unsigned int,double,double,int,int,const double *))GPA( "glMap1d" ); - qglMap1f = dllMap1f = (void (APIENTRY *)(unsigned int,float,float,int,int,const float *))GPA( "glMap1f" ); - qglMap2d = dllMap2d = (void (APIENTRY *)(unsigned int,double,double,int,int,double,double,int,int,const double *))GPA( "glMap2d" ); - qglMap2f = dllMap2f = (void (APIENTRY *)(unsigned int,float,float,int,int,float,float,int,int,const float *))GPA( "glMap2f" ); - qglMapGrid1d = dllMapGrid1d = (void (APIENTRY *)(int,double,double))GPA( "glMapGrid1d" ); - qglMapGrid1f = dllMapGrid1f = (void (APIENTRY *)(int,float,float))GPA( "glMapGrid1f" ); - qglMapGrid2d = dllMapGrid2d = (void (APIENTRY *)(int,double,double,int,double,double))GPA( "glMapGrid2d" ); - qglMapGrid2f = dllMapGrid2f = (void (APIENTRY *)(int,float,float,int,float,float))GPA( "glMapGrid2f" ); - qglMaterialf = dllMaterialf = (void (APIENTRY *)(unsigned int,unsigned int,float))GPA( "glMaterialf" ); - qglMaterialfv = dllMaterialfv = (void (APIENTRY *)(unsigned int,unsigned int,const float *))GPA( "glMaterialfv" ); - qglMateriali = dllMateriali = (void (APIENTRY *)(unsigned int,unsigned int,int))GPA( "glMateriali" ); - qglMaterialiv = dllMaterialiv = (void (APIENTRY *)(unsigned int,unsigned int,const int *))GPA( "glMaterialiv" ); - qglMatrixMode = dllMatrixMode = (void (APIENTRY *)(unsigned int))GPA( "glMatrixMode" ); - qglMultMatrixd = dllMultMatrixd = (void (APIENTRY *)(const double *))GPA( "glMultMatrixd" ); - qglMultMatrixf = dllMultMatrixf = (void (APIENTRY *)(const float *))GPA( "glMultMatrixf" ); - qglNewList = dllNewList = (void (APIENTRY *)(unsigned int,unsigned int))GPA( "glNewList" ); - qglNormal3b = dllNormal3b = (void (APIENTRY *)(signed char,signed char,signed char))GPA( "glNormal3b" ); - qglNormal3bv = dllNormal3bv = (void (APIENTRY *)(const signed char *))GPA( "glNormal3bv" ); - qglNormal3d = dllNormal3d = (void (APIENTRY *)(double,double,double))GPA( "glNormal3d" ); - qglNormal3dv = dllNormal3dv = (void (APIENTRY *)(const double *))GPA( "glNormal3dv" ); - qglNormal3f = dllNormal3f = (void (APIENTRY *)(float,float,float))GPA( "glNormal3f" ); - qglNormal3fv = dllNormal3fv = (void (APIENTRY *)(const float *))GPA( "glNormal3fv" ); - qglNormal3i = dllNormal3i = (void (APIENTRY *)(int,int,int))GPA( "glNormal3i" ); - qglNormal3iv = dllNormal3iv = (void (APIENTRY *)(const int *))GPA( "glNormal3iv" ); - qglNormal3s = dllNormal3s = (void (APIENTRY *)(short,short,short))GPA( "glNormal3s" ); - qglNormal3sv = dllNormal3sv = (void (APIENTRY *)(const short *))GPA( "glNormal3sv" ); - qglNormalPointer = dllNormalPointer = (void (APIENTRY *)(unsigned int,int,const void *))GPA( "glNormalPointer" ); - qglOrtho = dllOrtho = (void (APIENTRY *)(double,double,double,double,double,double))GPA( "glOrtho" ); - qglPassThrough = dllPassThrough = (void (APIENTRY *)(float))GPA( "glPassThrough" ); - qglPixelMapfv = dllPixelMapfv = (void (APIENTRY *)(unsigned int,int,const float *))GPA( "glPixelMapfv" ); - qglPixelMapuiv = dllPixelMapuiv = (void (APIENTRY *)(unsigned int,int,const unsigned int *))GPA( "glPixelMapuiv" ); - qglPixelMapusv = dllPixelMapusv = (void (APIENTRY *)(unsigned int,int,const unsigned short *))GPA( "glPixelMapusv" ); - qglPixelStoref = dllPixelStoref = (void (APIENTRY *)(unsigned int,float))GPA( "glPixelStoref" ); - qglPixelStorei = dllPixelStorei = (void (APIENTRY *)(unsigned int,int))GPA( "glPixelStorei" ); - qglPixelTransferf = dllPixelTransferf = (void (APIENTRY *)(unsigned int,float))GPA( "glPixelTransferf" ); - qglPixelTransferi = dllPixelTransferi = (void (APIENTRY *)(unsigned int,int))GPA( "glPixelTransferi" ); - qglPixelZoom = dllPixelZoom = (void (APIENTRY *)(float,float))GPA( "glPixelZoom" ); - qglPointSize = dllPointSize = (void (APIENTRY *)(float))GPA( "glPointSize" ); - qglPolygonMode = dllPolygonMode = (void (APIENTRY *)(unsigned int,unsigned int))GPA( "glPolygonMode" ); - qglPolygonOffset = dllPolygonOffset = (void (APIENTRY *)(float,float))GPA( "glPolygonOffset" ); - qglPolygonStipple = dllPolygonStipple = (void (APIENTRY *)(const unsigned char *))GPA( "glPolygonStipple" ); - qglPopAttrib = dllPopAttrib = (void (APIENTRY *)(void))GPA( "glPopAttrib" ); - qglPopClientAttrib = dllPopClientAttrib = (void (APIENTRY *)(void))GPA( "glPopClientAttrib" ); - qglPopMatrix = dllPopMatrix = (void (APIENTRY *)(void))GPA( "glPopMatrix" ); - qglPopName = dllPopName = (void (APIENTRY *)(void))GPA( "glPopName" ); - qglPrioritizeTextures = dllPrioritizeTextures = (void (APIENTRY *)(int,const unsigned int *,const float *))GPA( "glPrioritizeTextures" ); - qglPushAttrib = dllPushAttrib = (void (APIENTRY *)(unsigned int))GPA( "glPushAttrib" ); - qglPushClientAttrib = dllPushClientAttrib = (void (APIENTRY *)(unsigned int))GPA( "glPushClientAttrib" ); - qglPushMatrix = dllPushMatrix = (void (APIENTRY *)(void))GPA( "glPushMatrix" ); - qglPushName = dllPushName = (void (APIENTRY *)(unsigned int))GPA( "glPushName" ); - qglRasterPos2d = dllRasterPos2d = (void (APIENTRY *)(double,double))GPA( "glRasterPos2d" ); - qglRasterPos2dv = dllRasterPos2dv = (void (APIENTRY *)(const double *))GPA( "glRasterPos2dv" ); - qglRasterPos2f = dllRasterPos2f = (void (APIENTRY *)(float,float))GPA( "glRasterPos2f" ); - qglRasterPos2fv = dllRasterPos2fv = (void (APIENTRY *)(const float *))GPA( "glRasterPos2fv" ); - qglRasterPos2i = dllRasterPos2i = (void (APIENTRY *)(int,int))GPA( "glRasterPos2i" ); - qglRasterPos2iv = dllRasterPos2iv = (void (APIENTRY *)(const int *))GPA( "glRasterPos2iv" ); - qglRasterPos2s = dllRasterPos2s = (void (APIENTRY *)(short,short))GPA( "glRasterPos2s" ); - qglRasterPos2sv = dllRasterPos2sv = (void (APIENTRY *)(const short *))GPA( "glRasterPos2sv" ); - qglRasterPos3d = dllRasterPos3d = (void (APIENTRY *)(double,double,double))GPA( "glRasterPos3d" ); - qglRasterPos3dv = dllRasterPos3dv = (void (APIENTRY *)(const double *))GPA( "glRasterPos3dv" ); - qglRasterPos3f = dllRasterPos3f = (void (APIENTRY *)(float,float,float))GPA( "glRasterPos3f" ); - qglRasterPos3fv = dllRasterPos3fv = (void (APIENTRY *)(const float *))GPA( "glRasterPos3fv" ); - qglRasterPos3i = dllRasterPos3i = (void (APIENTRY *)(int,int,int))GPA( "glRasterPos3i" ); - qglRasterPos3iv = dllRasterPos3iv = (void (APIENTRY *)(const int *))GPA( "glRasterPos3iv" ); - qglRasterPos3s = dllRasterPos3s = (void (APIENTRY *)(short,short,short))GPA( "glRasterPos3s" ); - qglRasterPos3sv = dllRasterPos3sv = (void (APIENTRY *)(const short *))GPA( "glRasterPos3sv" ); - qglRasterPos4d = dllRasterPos4d = (void (APIENTRY *)(double,double,double,double))GPA( "glRasterPos4d" ); - qglRasterPos4dv = dllRasterPos4dv = (void (APIENTRY *)(const double *))GPA( "glRasterPos4dv" ); - qglRasterPos4f = dllRasterPos4f = (void (APIENTRY *)(float,float,float,float))GPA( "glRasterPos4f" ); - qglRasterPos4fv = dllRasterPos4fv = (void (APIENTRY *)(const float *))GPA( "glRasterPos4fv" ); - qglRasterPos4i = dllRasterPos4i = (void (APIENTRY *)(int,int,int,int))GPA( "glRasterPos4i" ); - qglRasterPos4iv = dllRasterPos4iv = (void (APIENTRY *)(const int *))GPA( "glRasterPos4iv" ); - qglRasterPos4s = dllRasterPos4s = (void (APIENTRY *)(short,short,short,short))GPA( "glRasterPos4s" ); - qglRasterPos4sv = dllRasterPos4sv = (void (APIENTRY *)(const short *))GPA( "glRasterPos4sv" ); - qglReadBuffer = dllReadBuffer = (void (APIENTRY *)(unsigned int))GPA( "glReadBuffer" ); - qglReadPixels = dllReadPixels = (void (APIENTRY *)(int,int,int,int,unsigned int,unsigned int,void *))GPA( "glReadPixels" ); - qglRectd = dllRectd = (void (APIENTRY *)(double,double,double,double))GPA( "glRectd" ); - qglRectdv = dllRectdv = (void (APIENTRY *)(const double *,const double *))GPA( "glRectdv" ); - qglRectf = dllRectf = (void (APIENTRY *)(float,float,float,float))GPA( "glRectf" ); - qglRectfv = dllRectfv = (void (APIENTRY *)(const float *,const float *))GPA( "glRectfv" ); - qglRecti = dllRecti = (void (APIENTRY *)(int,int,int,int))GPA( "glRecti" ); - qglRectiv = dllRectiv = (void (APIENTRY *)(const int *,const int *))GPA( "glRectiv" ); - qglRects = dllRects = (void (APIENTRY *)(short,short,short,short))GPA( "glRects" ); - qglRectsv = dllRectsv = (void (APIENTRY *)(const short *,const short *))GPA( "glRectsv" ); - qglRenderMode = dllRenderMode = (int (APIENTRY *)(unsigned int))GPA( "glRenderMode" ); - qglRotated = dllRotated = (void (APIENTRY *)(double,double,double,double))GPA( "glRotated" ); - qglRotatef = dllRotatef = (void (APIENTRY *)(float,float,float,float))GPA( "glRotatef" ); - qglScaled = dllScaled = (void (APIENTRY *)(double,double,double))GPA( "glScaled" ); - qglScalef = dllScalef = (void (APIENTRY *)(float,float,float))GPA( "glScalef" ); - qglScissor = dllScissor = (void (APIENTRY *)(int,int,int,int))GPA( "glScissor" ); - qglSelectBuffer = dllSelectBuffer = (void (APIENTRY *)(int,unsigned int *))GPA( "glSelectBuffer" ); - qglShadeModel = dllShadeModel = (void (APIENTRY *)(unsigned int))GPA( "glShadeModel" ); - qglStencilFunc = dllStencilFunc = (void (APIENTRY *)(unsigned int,int,unsigned int))GPA( "glStencilFunc" ); - qglStencilMask = dllStencilMask = (void (APIENTRY *)(unsigned int))GPA( "glStencilMask" ); - qglStencilOp = dllStencilOp = (void (APIENTRY *)(unsigned int,unsigned int,unsigned int))GPA( "glStencilOp" ); - qglTexCoord1d = dllTexCoord1d = (void (APIENTRY *)(double))GPA( "glTexCoord1d" ); - qglTexCoord1dv = dllTexCoord1dv = (void (APIENTRY *)(const double *))GPA( "glTexCoord1dv" ); - qglTexCoord1f = dllTexCoord1f = (void (APIENTRY *)(float))GPA( "glTexCoord1f" ); - qglTexCoord1fv = dllTexCoord1fv = (void (APIENTRY *)(const float *))GPA( "glTexCoord1fv" ); - qglTexCoord1i = dllTexCoord1i = (void (APIENTRY *)(int))GPA( "glTexCoord1i" ); - qglTexCoord1iv = dllTexCoord1iv = (void (APIENTRY *)(const int *))GPA( "glTexCoord1iv" ); - qglTexCoord1s = dllTexCoord1s = (void (APIENTRY *)(short))GPA( "glTexCoord1s" ); - qglTexCoord1sv = dllTexCoord1sv = (void (APIENTRY *)(const short *))GPA( "glTexCoord1sv" ); - qglTexCoord2d = dllTexCoord2d = (void (APIENTRY *)(double,double))GPA( "glTexCoord2d" ); - qglTexCoord2dv = dllTexCoord2dv = (void (APIENTRY *)(const double *))GPA( "glTexCoord2dv" ); - qglTexCoord2f = dllTexCoord2f = (void (APIENTRY *)(float,float))GPA( "glTexCoord2f" ); - qglTexCoord2fv = dllTexCoord2fv = (void (APIENTRY *)(const float *))GPA( "glTexCoord2fv" ); - qglTexCoord2i = dllTexCoord2i = (void (APIENTRY *)(int,int))GPA( "glTexCoord2i" ); - qglTexCoord2iv = dllTexCoord2iv = (void (APIENTRY *)(const int *))GPA( "glTexCoord2iv" ); - qglTexCoord2s = dllTexCoord2s = (void (APIENTRY *)(short,short))GPA( "glTexCoord2s" ); - qglTexCoord2sv = dllTexCoord2sv = (void (APIENTRY *)(const short *))GPA( "glTexCoord2sv" ); - qglTexCoord3d = dllTexCoord3d = (void (APIENTRY *)(double,double,double))GPA( "glTexCoord3d" ); - qglTexCoord3dv = dllTexCoord3dv = (void (APIENTRY *)(const double *))GPA( "glTexCoord3dv" ); - qglTexCoord3f = dllTexCoord3f = (void (APIENTRY *)(float,float,float))GPA( "glTexCoord3f" ); - qglTexCoord3fv = dllTexCoord3fv = (void (APIENTRY *)(const float *))GPA( "glTexCoord3fv" ); - qglTexCoord3i = dllTexCoord3i = (void (APIENTRY *)(int,int,int))GPA( "glTexCoord3i" ); - qglTexCoord3iv = dllTexCoord3iv = (void (APIENTRY *)(const int *))GPA( "glTexCoord3iv" ); - qglTexCoord3s = dllTexCoord3s = (void (APIENTRY *)(short,short,short))GPA( "glTexCoord3s" ); - qglTexCoord3sv = dllTexCoord3sv = (void (APIENTRY *)(const short *))GPA( "glTexCoord3sv" ); - qglTexCoord4d = dllTexCoord4d = (void (APIENTRY *)(double,double,double,double))GPA( "glTexCoord4d" ); - qglTexCoord4dv = dllTexCoord4dv = (void (APIENTRY *)(const double *))GPA( "glTexCoord4dv" ); - qglTexCoord4f = dllTexCoord4f = (void (APIENTRY *)(float,float,float,float))GPA( "glTexCoord4f" ); - qglTexCoord4fv = dllTexCoord4fv = (void (APIENTRY *)(const float *))GPA( "glTexCoord4fv" ); - qglTexCoord4i = dllTexCoord4i = (void (APIENTRY *)(int,int,int,int))GPA( "glTexCoord4i" ); - qglTexCoord4iv = dllTexCoord4iv = (void (APIENTRY *)(const int *))GPA( "glTexCoord4iv" ); - qglTexCoord4s = dllTexCoord4s = (void (APIENTRY *)(short,short,short,short))GPA( "glTexCoord4s" ); - qglTexCoord4sv = dllTexCoord4sv = (void (APIENTRY *)(const short *))GPA( "glTexCoord4sv" ); - qglTexCoordPointer = dllTexCoordPointer = (void (APIENTRY *)(int,unsigned int,int,const void *))GPA( "glTexCoordPointer" ); - qglTexEnvf = dllTexEnvf = (void (APIENTRY *)(unsigned int,unsigned int,float))GPA( "glTexEnvf" ); - qglTexEnvfv = dllTexEnvfv = (void (APIENTRY *)(unsigned int,unsigned int,const float *))GPA( "glTexEnvfv" ); - qglTexEnvi = dllTexEnvi = (void (APIENTRY *)(unsigned int,unsigned int,int))GPA( "glTexEnvi" ); - qglTexEnviv = dllTexEnviv = (void (APIENTRY *)(unsigned int,unsigned int,const int *))GPA( "glTexEnviv" ); - qglTexGend = dllTexGend = (void (APIENTRY *)(unsigned int,unsigned int,double))GPA( "glTexGend" ); - qglTexGendv = dllTexGendv = (void (APIENTRY *)(unsigned int,unsigned int,const double *))GPA( "glTexGendv" ); - qglTexGenf = dllTexGenf = (void (APIENTRY *)(unsigned int,unsigned int,float))GPA( "glTexGenf" ); - qglTexGenfv = dllTexGenfv = (void (APIENTRY *)(unsigned int,unsigned int,const float *))GPA( "glTexGenfv" ); - qglTexGeni = dllTexGeni = (void (APIENTRY *)(unsigned int,unsigned int,int))GPA( "glTexGeni" ); - qglTexGeniv = dllTexGeniv = (void (APIENTRY *)(unsigned int,unsigned int,const int *))GPA( "glTexGeniv" ); - qglTexImage1D = dllTexImage1D = (void (APIENTRY *)(unsigned int,int,int,int,int,unsigned int,unsigned int,const void *))GPA( "glTexImage1D" ); - qglTexImage2D = dllTexImage2D = (void (APIENTRY *)(unsigned int,int,int,int,int,int,unsigned int,unsigned int,const void *))GPA( "glTexImage2D" ); - qglTexParameterf = dllTexParameterf = (void (APIENTRY *)(unsigned int,unsigned int,float))GPA( "glTexParameterf" ); - qglTexParameterfv = dllTexParameterfv = (void (APIENTRY *)(unsigned int,unsigned int,const float *))GPA( "glTexParameterfv" ); - qglTexParameteri = dllTexParameteri = (void (APIENTRY *)(unsigned int,unsigned int,int))GPA( "glTexParameteri" ); - qglTexParameteriv = dllTexParameteriv = (void (APIENTRY *)(unsigned int,unsigned int,const int *))GPA( "glTexParameteriv" ); - qglTexSubImage1D = dllTexSubImage1D = (void (APIENTRY *)(unsigned int,int,int,int,unsigned int,unsigned int,const void *))GPA( "glTexSubImage1D" ); - qglTexSubImage2D = dllTexSubImage2D = (void (APIENTRY *)(unsigned int,int,int,int,int,int,unsigned int,unsigned int,const void *))GPA( "glTexSubImage2D" ); - qglTranslated = dllTranslated = (void (APIENTRY *)(double,double,double))GPA( "glTranslated" ); - qglTranslatef = dllTranslatef = (void (APIENTRY *)(float,float,float))GPA( "glTranslatef" ); - qglVertex2d = dllVertex2d = (void (APIENTRY *)(double,double))GPA( "glVertex2d" ); - qglVertex2dv = dllVertex2dv = (void (APIENTRY *)(const double *))GPA( "glVertex2dv" ); - qglVertex2f = dllVertex2f = (void (APIENTRY *)(float,float))GPA( "glVertex2f" ); - qglVertex2fv = dllVertex2fv = (void (APIENTRY *)(const float *))GPA( "glVertex2fv" ); - qglVertex2i = dllVertex2i = (void (APIENTRY *)(int,int))GPA( "glVertex2i" ); - qglVertex2iv = dllVertex2iv = (void (APIENTRY *)(const int *))GPA( "glVertex2iv" ); - qglVertex2s = dllVertex2s = (void (APIENTRY *)(short,short))GPA( "glVertex2s" ); - qglVertex2sv = dllVertex2sv = (void (APIENTRY *)(const short *))GPA( "glVertex2sv" ); - qglVertex3d = dllVertex3d = (void (APIENTRY *)(double,double,double))GPA( "glVertex3d" ); - qglVertex3dv = dllVertex3dv = (void (APIENTRY *)(const double *))GPA( "glVertex3dv" ); - qglVertex3f = dllVertex3f = (void (APIENTRY *)(float,float,float))GPA( "glVertex3f" ); - qglVertex3fv = dllVertex3fv = (void (APIENTRY *)(const float *))GPA( "glVertex3fv" ); - qglVertex3i = dllVertex3i = (void (APIENTRY *)(int,int,int))GPA( "glVertex3i" ); - qglVertex3iv = dllVertex3iv = (void (APIENTRY *)(const int *))GPA( "glVertex3iv" ); - qglVertex3s = dllVertex3s = (void (APIENTRY *)(short,short,short))GPA( "glVertex3s" ); - qglVertex3sv = dllVertex3sv = (void (APIENTRY *)(const short *))GPA( "glVertex3sv" ); - qglVertex4d = dllVertex4d = (void (APIENTRY *)(double,double,double,double))GPA( "glVertex4d" ); - qglVertex4dv = dllVertex4dv = (void (APIENTRY *)(const double *))GPA( "glVertex4dv" ); - qglVertex4f = dllVertex4f = (void (APIENTRY *)(float,float,float,float))GPA( "glVertex4f" ); - qglVertex4fv = dllVertex4fv = (void (APIENTRY *)(const float *))GPA( "glVertex4fv" ); - qglVertex4i = dllVertex4i = (void (APIENTRY *)(int,int,int,int))GPA( "glVertex4i" ); - qglVertex4iv = dllVertex4iv = (void (APIENTRY *)(const int *))GPA( "glVertex4iv" ); - qglVertex4s = dllVertex4s = (void (APIENTRY *)(short,short,short,short))GPA( "glVertex4s" ); - qglVertex4sv = dllVertex4sv = (void (APIENTRY *)(const short *))GPA( "glVertex4sv" ); - qglVertexPointer = dllVertexPointer = (void (APIENTRY *)(int,unsigned int,int,const void *))GPA( "glVertexPointer" ); - qglViewport = dllViewport = (void (APIENTRY *)(int,int,int,int))GPA( "glViewport" ); - - qwglCopyContext = (BOOL (WINAPI *)(HGLRC, HGLRC, UINT))GPA( "wglCopyContext" ); - qwglCreateContext = (HGLRC (WINAPI *)(HDC))GPA( "wglCreateContext" ); - qwglCreateLayerContext = (HGLRC (WINAPI *)(HDC, int))GPA( "wglCreateLayerContext" ); - qwglDeleteContext = (BOOL (WINAPI *)(HGLRC))GPA( "wglDeleteContext" ); - qwglDescribeLayerPlane = (BOOL (WINAPI *)(HDC, int, int, UINT, LPLAYERPLANEDESCRIPTOR))GPA( "wglDescribeLayerPlane" ); - qwglGetCurrentContext = (HGLRC (WINAPI *)(VOID))GPA( "wglGetCurrentContext" ); - qwglGetCurrentDC = (HDC (WINAPI *)(VOID))GPA( "wglGetCurrentDC" ); - qwglGetLayerPaletteEntries = (int (WINAPI *)(HDC, int, int, int, COLORREF *))GPA( "wglGetLayerPaletteEntries" ); - qwglGetProcAddress = (PROC (WINAPI *)(LPCSTR))GPA( "wglGetProcAddress" ); - qwglMakeCurrent = (BOOL (WINAPI *)(HDC, HGLRC))GPA( "wglMakeCurrent" ); - qwglRealizeLayerPalette = (BOOL (WINAPI *)(HDC, int, BOOL))GPA( "wglRealizeLayerPalette" ); - qwglSetLayerPaletteEntries = (int (WINAPI *)(HDC, int, int, int, const COLORREF *))GPA( "wglSetLayerPaletteEntries" ); - qwglShareLists = (BOOL (WINAPI *)(HGLRC, HGLRC))GPA( "wglShareLists" ); - qwglSwapLayerBuffers = (BOOL (WINAPI *)(HDC, UINT))GPA( "wglSwapLayerBuffers" ); - qwglUseFontBitmaps = (BOOL (WINAPI *)(HDC, DWORD, DWORD, DWORD))GPA( "wglUseFontBitmapsA" ); - qwglUseFontOutlines = (BOOL (WINAPI *)(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int, LPGLYPHMETRICSFLOAT))GPA( "wglUseFontOutlinesA" ); - - qwglSwapIntervalEXT = 0; - qglActiveTextureARB = 0; - qglClientActiveTextureARB = 0; - qglMultiTexCoord2fARB = 0; - qglLockArraysEXT = 0; - qglUnlockArraysEXT = 0; - - // check logging - QGL_EnableLogging( (qboolean)r_logFile->integer ); - - return qtrue; -} - -void QGL_EnableLogging( qboolean enable ) -{ - static qboolean isEnabled; - - // return if we're already active - if ( isEnabled && enable ) { - // decrement log counter and stop if it has reached 0 - ri->Cvar_Set( "r_logFile", va("%d", r_logFile->integer - 1 ) ); - if ( r_logFile->integer ) { - return; - } - enable = qfalse; - } - - // return if we're already disabled - if ( !enable && !isEnabled ) - return; - - isEnabled = enable; - - if ( enable ) - { - if ( !glw_state.log_fp ) - { - struct tm *newtime; - time_t aclock; - char buffer[1024]; - cvar_t *basedir; - - time( &aclock ); - newtime = localtime( &aclock ); - - basedir = ri->Cvar_Get( "fs_basepath", "", 0 ); - Com_sprintf( buffer, sizeof(buffer), "%s/gl.log", basedir->string ); - glw_state.log_fp = fopen( buffer, "wt" ); - - fprintf( glw_state.log_fp, "%s\n", asctime( newtime ) ); - } - - qglAccum = logAccum; - qglAlphaFunc = logAlphaFunc; - qglAreTexturesResident = logAreTexturesResident; - qglArrayElement = logArrayElement; - qglBegin = logBegin; - qglBindTexture = logBindTexture; - qglBitmap = logBitmap; - qglBlendFunc = logBlendFunc; - qglCallList = logCallList; - qglCallLists = logCallLists; - qglClear = logClear; - qglClearAccum = logClearAccum; - qglClearColor = logClearColor; - qglClearDepth = logClearDepth; - qglClearIndex = logClearIndex; - qglClearStencil = logClearStencil; - qglClipPlane = logClipPlane; - qglColor3b = logColor3b; - qglColor3bv = logColor3bv; - qglColor3d = logColor3d; - qglColor3dv = logColor3dv; - qglColor3f = logColor3f; - qglColor3fv = logColor3fv; - qglColor3i = logColor3i; - qglColor3iv = logColor3iv; - qglColor3s = logColor3s; - qglColor3sv = logColor3sv; - qglColor3ub = logColor3ub; - qglColor3ubv = logColor3ubv; - qglColor3ui = logColor3ui; - qglColor3uiv = logColor3uiv; - qglColor3us = logColor3us; - qglColor3usv = logColor3usv; - qglColor4b = logColor4b; - qglColor4bv = logColor4bv; - qglColor4d = logColor4d; - qglColor4dv = logColor4dv; - qglColor4f = logColor4f; - qglColor4fv = logColor4fv; - qglColor4i = logColor4i; - qglColor4iv = logColor4iv; - qglColor4s = logColor4s; - qglColor4sv = logColor4sv; - qglColor4ub = logColor4ub; - qglColor4ubv = logColor4ubv; - qglColor4ui = logColor4ui; - qglColor4uiv = logColor4uiv; - qglColor4us = logColor4us; - qglColor4usv = logColor4usv; - qglColorMask = logColorMask; - qglColorMaterial = logColorMaterial; - qglColorPointer = logColorPointer; - qglCopyPixels = logCopyPixels; - qglCopyTexImage1D = logCopyTexImage1D; - qglCopyTexImage2D = logCopyTexImage2D; - qglCopyTexSubImage1D = logCopyTexSubImage1D; - qglCopyTexSubImage2D = logCopyTexSubImage2D; - qglCullFace = logCullFace; - qglDeleteLists = logDeleteLists ; - qglDeleteTextures = logDeleteTextures ; - qglDepthFunc = logDepthFunc ; - qglDepthMask = logDepthMask ; - qglDepthRange = logDepthRange ; - qglDisable = logDisable ; - qglDisableClientState = logDisableClientState ; - qglDrawArrays = logDrawArrays ; - qglDrawBuffer = logDrawBuffer ; - qglDrawElements = logDrawElements ; - qglDrawPixels = logDrawPixels ; - qglEdgeFlag = logEdgeFlag ; - qglEdgeFlagPointer = logEdgeFlagPointer ; - qglEdgeFlagv = logEdgeFlagv ; - qglEnable = logEnable ; - qglEnableClientState = logEnableClientState ; - qglEnd = logEnd ; - qglEndList = logEndList ; - qglEvalCoord1d = logEvalCoord1d ; - qglEvalCoord1dv = logEvalCoord1dv ; - qglEvalCoord1f = logEvalCoord1f ; - qglEvalCoord1fv = logEvalCoord1fv ; - qglEvalCoord2d = logEvalCoord2d ; - qglEvalCoord2dv = logEvalCoord2dv ; - qglEvalCoord2f = logEvalCoord2f ; - qglEvalCoord2fv = logEvalCoord2fv ; - qglEvalMesh1 = logEvalMesh1 ; - qglEvalMesh2 = logEvalMesh2 ; - qglEvalPoint1 = logEvalPoint1 ; - qglEvalPoint2 = logEvalPoint2 ; - qglFeedbackBuffer = logFeedbackBuffer ; - qglFinish = logFinish ; - qglFlush = logFlush ; - qglFogf = logFogf ; - qglFogfv = logFogfv ; - qglFogi = logFogi ; - qglFogiv = logFogiv ; - qglFrontFace = logFrontFace ; - qglFrustum = logFrustum ; - qglGenLists = logGenLists ; - qglGenTextures = logGenTextures ; - qglGetBooleanv = logGetBooleanv ; - qglGetClipPlane = logGetClipPlane ; - qglGetDoublev = logGetDoublev ; - qglGetError = logGetError ; - qglGetFloatv = logGetFloatv ; - qglGetIntegerv = logGetIntegerv ; - qglGetLightfv = logGetLightfv ; - qglGetLightiv = logGetLightiv ; - qglGetMapdv = logGetMapdv ; - qglGetMapfv = logGetMapfv ; - qglGetMapiv = logGetMapiv ; - qglGetMaterialfv = logGetMaterialfv ; - qglGetMaterialiv = logGetMaterialiv ; - qglGetPixelMapfv = logGetPixelMapfv ; - qglGetPixelMapuiv = logGetPixelMapuiv ; - qglGetPixelMapusv = logGetPixelMapusv ; - qglGetPointerv = logGetPointerv ; - qglGetPolygonStipple = logGetPolygonStipple ; - qglGetString = logGetString ; - qglGetTexEnvfv = logGetTexEnvfv ; - qglGetTexEnviv = logGetTexEnviv ; - qglGetTexGendv = logGetTexGendv ; - qglGetTexGenfv = logGetTexGenfv ; - qglGetTexGeniv = logGetTexGeniv ; - qglGetTexImage = logGetTexImage ; - qglGetTexLevelParameterfv = logGetTexLevelParameterfv ; - qglGetTexLevelParameteriv = logGetTexLevelParameteriv ; - qglGetTexParameterfv = logGetTexParameterfv ; - qglGetTexParameteriv = logGetTexParameteriv ; - qglHint = logHint ; - qglIndexMask = logIndexMask ; - qglIndexPointer = logIndexPointer ; - qglIndexd = logIndexd ; - qglIndexdv = logIndexdv ; - qglIndexf = logIndexf ; - qglIndexfv = logIndexfv ; - qglIndexi = logIndexi ; - qglIndexiv = logIndexiv ; - qglIndexs = logIndexs ; - qglIndexsv = logIndexsv ; - qglIndexub = logIndexub ; - qglIndexubv = logIndexubv ; - qglInitNames = logInitNames ; - qglInterleavedArrays = logInterleavedArrays ; - qglIsEnabled = logIsEnabled ; - qglIsList = logIsList ; - qglIsTexture = logIsTexture ; - qglLightModelf = logLightModelf ; - qglLightModelfv = logLightModelfv ; - qglLightModeli = logLightModeli ; - qglLightModeliv = logLightModeliv ; - qglLightf = logLightf ; - qglLightfv = logLightfv ; - qglLighti = logLighti ; - qglLightiv = logLightiv ; - qglLineStipple = logLineStipple ; - qglLineWidth = logLineWidth ; - qglListBase = logListBase ; - qglLoadIdentity = logLoadIdentity ; - qglLoadMatrixd = logLoadMatrixd ; - qglLoadMatrixf = logLoadMatrixf ; - qglLoadName = logLoadName ; - qglLogicOp = logLogicOp ; - qglMap1d = logMap1d ; - qglMap1f = logMap1f ; - qglMap2d = logMap2d ; - qglMap2f = logMap2f ; - qglMapGrid1d = logMapGrid1d ; - qglMapGrid1f = logMapGrid1f ; - qglMapGrid2d = logMapGrid2d ; - qglMapGrid2f = logMapGrid2f ; - qglMaterialf = logMaterialf ; - qglMaterialfv = logMaterialfv ; - qglMateriali = logMateriali ; - qglMaterialiv = logMaterialiv ; - qglMatrixMode = logMatrixMode ; - qglMultMatrixd = logMultMatrixd ; - qglMultMatrixf = logMultMatrixf ; - qglNewList = logNewList ; - qglNormal3b = logNormal3b ; - qglNormal3bv = logNormal3bv ; - qglNormal3d = logNormal3d ; - qglNormal3dv = logNormal3dv ; - qglNormal3f = logNormal3f ; - qglNormal3fv = logNormal3fv ; - qglNormal3i = logNormal3i ; - qglNormal3iv = logNormal3iv ; - qglNormal3s = logNormal3s ; - qglNormal3sv = logNormal3sv ; - qglNormalPointer = logNormalPointer ; - qglOrtho = logOrtho ; - qglPassThrough = logPassThrough ; - qglPixelMapfv = logPixelMapfv ; - qglPixelMapuiv = logPixelMapuiv ; - qglPixelMapusv = logPixelMapusv ; - qglPixelStoref = logPixelStoref ; - qglPixelStorei = logPixelStorei ; - qglPixelTransferf = logPixelTransferf ; - qglPixelTransferi = logPixelTransferi ; - qglPixelZoom = logPixelZoom ; - qglPointSize = logPointSize ; - qglPolygonMode = logPolygonMode ; - qglPolygonOffset = logPolygonOffset ; - qglPolygonStipple = logPolygonStipple ; - qglPopAttrib = logPopAttrib ; - qglPopClientAttrib = logPopClientAttrib ; - qglPopMatrix = logPopMatrix ; - qglPopName = logPopName ; - qglPrioritizeTextures = logPrioritizeTextures ; - qglPushAttrib = logPushAttrib ; - qglPushClientAttrib = logPushClientAttrib ; - qglPushMatrix = logPushMatrix ; - qglPushName = logPushName ; - qglRasterPos2d = logRasterPos2d ; - qglRasterPos2dv = logRasterPos2dv ; - qglRasterPos2f = logRasterPos2f ; - qglRasterPos2fv = logRasterPos2fv ; - qglRasterPos2i = logRasterPos2i ; - qglRasterPos2iv = logRasterPos2iv ; - qglRasterPos2s = logRasterPos2s ; - qglRasterPos2sv = logRasterPos2sv ; - qglRasterPos3d = logRasterPos3d ; - qglRasterPos3dv = logRasterPos3dv ; - qglRasterPos3f = logRasterPos3f ; - qglRasterPos3fv = logRasterPos3fv ; - qglRasterPos3i = logRasterPos3i ; - qglRasterPos3iv = logRasterPos3iv ; - qglRasterPos3s = logRasterPos3s ; - qglRasterPos3sv = logRasterPos3sv ; - qglRasterPos4d = logRasterPos4d ; - qglRasterPos4dv = logRasterPos4dv ; - qglRasterPos4f = logRasterPos4f ; - qglRasterPos4fv = logRasterPos4fv ; - qglRasterPos4i = logRasterPos4i ; - qglRasterPos4iv = logRasterPos4iv ; - qglRasterPos4s = logRasterPos4s ; - qglRasterPos4sv = logRasterPos4sv ; - qglReadBuffer = logReadBuffer ; - qglReadPixels = logReadPixels ; - qglRectd = logRectd ; - qglRectdv = logRectdv ; - qglRectf = logRectf ; - qglRectfv = logRectfv ; - qglRecti = logRecti ; - qglRectiv = logRectiv ; - qglRects = logRects ; - qglRectsv = logRectsv ; - qglRenderMode = logRenderMode ; - qglRotated = logRotated ; - qglRotatef = logRotatef ; - qglScaled = logScaled ; - qglScalef = logScalef ; - qglScissor = logScissor ; - qglSelectBuffer = logSelectBuffer ; - qglShadeModel = logShadeModel ; - qglStencilFunc = logStencilFunc ; - qglStencilMask = logStencilMask ; - qglStencilOp = logStencilOp ; - qglTexCoord1d = logTexCoord1d ; - qglTexCoord1dv = logTexCoord1dv ; - qglTexCoord1f = logTexCoord1f ; - qglTexCoord1fv = logTexCoord1fv ; - qglTexCoord1i = logTexCoord1i ; - qglTexCoord1iv = logTexCoord1iv ; - qglTexCoord1s = logTexCoord1s ; - qglTexCoord1sv = logTexCoord1sv ; - qglTexCoord2d = logTexCoord2d ; - qglTexCoord2dv = logTexCoord2dv ; - qglTexCoord2f = logTexCoord2f ; - qglTexCoord2fv = logTexCoord2fv ; - qglTexCoord2i = logTexCoord2i ; - qglTexCoord2iv = logTexCoord2iv ; - qglTexCoord2s = logTexCoord2s ; - qglTexCoord2sv = logTexCoord2sv ; - qglTexCoord3d = logTexCoord3d ; - qglTexCoord3dv = logTexCoord3dv ; - qglTexCoord3f = logTexCoord3f ; - qglTexCoord3fv = logTexCoord3fv ; - qglTexCoord3i = logTexCoord3i ; - qglTexCoord3iv = logTexCoord3iv ; - qglTexCoord3s = logTexCoord3s ; - qglTexCoord3sv = logTexCoord3sv ; - qglTexCoord4d = logTexCoord4d ; - qglTexCoord4dv = logTexCoord4dv ; - qglTexCoord4f = logTexCoord4f ; - qglTexCoord4fv = logTexCoord4fv ; - qglTexCoord4i = logTexCoord4i ; - qglTexCoord4iv = logTexCoord4iv ; - qglTexCoord4s = logTexCoord4s ; - qglTexCoord4sv = logTexCoord4sv ; - qglTexCoordPointer = logTexCoordPointer ; - qglTexEnvf = logTexEnvf ; - qglTexEnvfv = logTexEnvfv ; - qglTexEnvi = logTexEnvi ; - qglTexEnviv = logTexEnviv ; - qglTexGend = logTexGend ; - qglTexGendv = logTexGendv ; - qglTexGenf = logTexGenf ; - qglTexGenfv = logTexGenfv ; - qglTexGeni = logTexGeni ; - qglTexGeniv = logTexGeniv ; - qglTexImage1D = logTexImage1D ; - qglTexImage2D = logTexImage2D ; - qglTexParameterf = logTexParameterf ; - qglTexParameterfv = logTexParameterfv ; - qglTexParameteri = logTexParameteri ; - qglTexParameteriv = logTexParameteriv ; - qglTexSubImage1D = logTexSubImage1D ; - qglTexSubImage2D = logTexSubImage2D ; - qglTranslated = logTranslated ; - qglTranslatef = logTranslatef ; - qglVertex2d = logVertex2d ; - qglVertex2dv = logVertex2dv ; - qglVertex2f = logVertex2f ; - qglVertex2fv = logVertex2fv ; - qglVertex2i = logVertex2i ; - qglVertex2iv = logVertex2iv ; - qglVertex2s = logVertex2s ; - qglVertex2sv = logVertex2sv ; - qglVertex3d = logVertex3d ; - qglVertex3dv = logVertex3dv ; - qglVertex3f = logVertex3f ; - qglVertex3fv = logVertex3fv ; - qglVertex3i = logVertex3i ; - qglVertex3iv = logVertex3iv ; - qglVertex3s = logVertex3s ; - qglVertex3sv = logVertex3sv ; - qglVertex4d = logVertex4d ; - qglVertex4dv = logVertex4dv ; - qglVertex4f = logVertex4f ; - qglVertex4fv = logVertex4fv ; - qglVertex4i = logVertex4i ; - qglVertex4iv = logVertex4iv ; - qglVertex4s = logVertex4s ; - qglVertex4sv = logVertex4sv ; - qglVertexPointer = logVertexPointer ; - qglViewport = logViewport ; - } - else - { - if ( glw_state.log_fp ) { - fprintf( glw_state.log_fp, "*** CLOSING LOG ***\n" ); - fclose( glw_state.log_fp ); - glw_state.log_fp = NULL; - } - qglAccum = dllAccum; - qglAlphaFunc = dllAlphaFunc; - qglAreTexturesResident = dllAreTexturesResident; - qglArrayElement = dllArrayElement; - qglBegin = dllBegin; - qglBindTexture = dllBindTexture; - qglBitmap = dllBitmap; - qglBlendFunc = dllBlendFunc; - qglCallList = dllCallList; - qglCallLists = dllCallLists; - qglClear = dllClear; - qglClearAccum = dllClearAccum; - qglClearColor = dllClearColor; - qglClearDepth = dllClearDepth; - qglClearIndex = dllClearIndex; - qglClearStencil = dllClearStencil; - qglClipPlane = dllClipPlane; - qglColor3b = dllColor3b; - qglColor3bv = dllColor3bv; - qglColor3d = dllColor3d; - qglColor3dv = dllColor3dv; - qglColor3f = dllColor3f; - qglColor3fv = dllColor3fv; - qglColor3i = dllColor3i; - qglColor3iv = dllColor3iv; - qglColor3s = dllColor3s; - qglColor3sv = dllColor3sv; - qglColor3ub = dllColor3ub; - qglColor3ubv = dllColor3ubv; - qglColor3ui = dllColor3ui; - qglColor3uiv = dllColor3uiv; - qglColor3us = dllColor3us; - qglColor3usv = dllColor3usv; - qglColor4b = dllColor4b; - qglColor4bv = dllColor4bv; - qglColor4d = dllColor4d; - qglColor4dv = dllColor4dv; - qglColor4f = dllColor4f; - qglColor4fv = dllColor4fv; - qglColor4i = dllColor4i; - qglColor4iv = dllColor4iv; - qglColor4s = dllColor4s; - qglColor4sv = dllColor4sv; - qglColor4ub = dllColor4ub; - qglColor4ubv = dllColor4ubv; - qglColor4ui = dllColor4ui; - qglColor4uiv = dllColor4uiv; - qglColor4us = dllColor4us; - qglColor4usv = dllColor4usv; - qglColorMask = dllColorMask; - qglColorMaterial = dllColorMaterial; - qglColorPointer = dllColorPointer; - qglCopyPixels = dllCopyPixels; - qglCopyTexImage1D = dllCopyTexImage1D; - qglCopyTexImage2D = dllCopyTexImage2D; - qglCopyTexSubImage1D = dllCopyTexSubImage1D; - qglCopyTexSubImage2D = dllCopyTexSubImage2D; - qglCullFace = dllCullFace; - qglDeleteLists = dllDeleteLists ; - qglDeleteTextures = dllDeleteTextures ; - qglDepthFunc = dllDepthFunc ; - qglDepthMask = dllDepthMask ; - qglDepthRange = dllDepthRange ; - qglDisable = dllDisable ; - qglDisableClientState = dllDisableClientState ; - qglDrawArrays = dllDrawArrays ; - qglDrawBuffer = dllDrawBuffer ; - qglDrawElements = dllDrawElements ; - qglDrawPixels = dllDrawPixels ; - qglEdgeFlag = dllEdgeFlag ; - qglEdgeFlagPointer = dllEdgeFlagPointer ; - qglEdgeFlagv = dllEdgeFlagv ; - qglEnable = dllEnable ; - qglEnableClientState = dllEnableClientState ; - qglEnd = dllEnd ; - qglEndList = dllEndList ; - qglEvalCoord1d = dllEvalCoord1d ; - qglEvalCoord1dv = dllEvalCoord1dv ; - qglEvalCoord1f = dllEvalCoord1f ; - qglEvalCoord1fv = dllEvalCoord1fv ; - qglEvalCoord2d = dllEvalCoord2d ; - qglEvalCoord2dv = dllEvalCoord2dv ; - qglEvalCoord2f = dllEvalCoord2f ; - qglEvalCoord2fv = dllEvalCoord2fv ; - qglEvalMesh1 = dllEvalMesh1 ; - qglEvalMesh2 = dllEvalMesh2 ; - qglEvalPoint1 = dllEvalPoint1 ; - qglEvalPoint2 = dllEvalPoint2 ; - qglFeedbackBuffer = dllFeedbackBuffer ; - qglFinish = dllFinish ; - qglFlush = dllFlush ; - qglFogf = dllFogf ; - qglFogfv = dllFogfv ; - qglFogi = dllFogi ; - qglFogiv = dllFogiv ; - qglFrontFace = dllFrontFace ; - qglFrustum = dllFrustum ; - qglGenLists = dllGenLists ; - qglGenTextures = dllGenTextures ; - qglGetBooleanv = dllGetBooleanv ; - qglGetClipPlane = dllGetClipPlane ; - qglGetDoublev = dllGetDoublev ; - qglGetError = dllGetError ; - qglGetFloatv = dllGetFloatv ; - qglGetIntegerv = dllGetIntegerv ; - qglGetLightfv = dllGetLightfv ; - qglGetLightiv = dllGetLightiv ; - qglGetMapdv = dllGetMapdv ; - qglGetMapfv = dllGetMapfv ; - qglGetMapiv = dllGetMapiv ; - qglGetMaterialfv = dllGetMaterialfv ; - qglGetMaterialiv = dllGetMaterialiv ; - qglGetPixelMapfv = dllGetPixelMapfv ; - qglGetPixelMapuiv = dllGetPixelMapuiv ; - qglGetPixelMapusv = dllGetPixelMapusv ; - qglGetPointerv = dllGetPointerv ; - qglGetPolygonStipple = dllGetPolygonStipple ; - qglGetString = dllGetString ; - qglGetTexEnvfv = dllGetTexEnvfv ; - qglGetTexEnviv = dllGetTexEnviv ; - qglGetTexGendv = dllGetTexGendv ; - qglGetTexGenfv = dllGetTexGenfv ; - qglGetTexGeniv = dllGetTexGeniv ; - qglGetTexImage = dllGetTexImage ; - qglGetTexLevelParameterfv = dllGetTexLevelParameterfv ; - qglGetTexLevelParameteriv = dllGetTexLevelParameteriv ; - qglGetTexParameterfv = dllGetTexParameterfv ; - qglGetTexParameteriv = dllGetTexParameteriv ; - qglHint = dllHint ; - qglIndexMask = dllIndexMask ; - qglIndexPointer = dllIndexPointer ; - qglIndexd = dllIndexd ; - qglIndexdv = dllIndexdv ; - qglIndexf = dllIndexf ; - qglIndexfv = dllIndexfv ; - qglIndexi = dllIndexi ; - qglIndexiv = dllIndexiv ; - qglIndexs = dllIndexs ; - qglIndexsv = dllIndexsv ; - qglIndexub = dllIndexub ; - qglIndexubv = dllIndexubv ; - qglInitNames = dllInitNames ; - qglInterleavedArrays = dllInterleavedArrays ; - qglIsEnabled = dllIsEnabled ; - qglIsList = dllIsList ; - qglIsTexture = dllIsTexture ; - qglLightModelf = dllLightModelf ; - qglLightModelfv = dllLightModelfv ; - qglLightModeli = dllLightModeli ; - qglLightModeliv = dllLightModeliv ; - qglLightf = dllLightf ; - qglLightfv = dllLightfv ; - qglLighti = dllLighti ; - qglLightiv = dllLightiv ; - qglLineStipple = dllLineStipple ; - qglLineWidth = dllLineWidth ; - qglListBase = dllListBase ; - qglLoadIdentity = dllLoadIdentity ; - qglLoadMatrixd = dllLoadMatrixd ; - qglLoadMatrixf = dllLoadMatrixf ; - qglLoadName = dllLoadName ; - qglLogicOp = dllLogicOp ; - qglMap1d = dllMap1d ; - qglMap1f = dllMap1f ; - qglMap2d = dllMap2d ; - qglMap2f = dllMap2f ; - qglMapGrid1d = dllMapGrid1d ; - qglMapGrid1f = dllMapGrid1f ; - qglMapGrid2d = dllMapGrid2d ; - qglMapGrid2f = dllMapGrid2f ; - qglMaterialf = dllMaterialf ; - qglMaterialfv = dllMaterialfv ; - qglMateriali = dllMateriali ; - qglMaterialiv = dllMaterialiv ; - qglMatrixMode = dllMatrixMode ; - qglMultMatrixd = dllMultMatrixd ; - qglMultMatrixf = dllMultMatrixf ; - qglNewList = dllNewList ; - qglNormal3b = dllNormal3b ; - qglNormal3bv = dllNormal3bv ; - qglNormal3d = dllNormal3d ; - qglNormal3dv = dllNormal3dv ; - qglNormal3f = dllNormal3f ; - qglNormal3fv = dllNormal3fv ; - qglNormal3i = dllNormal3i ; - qglNormal3iv = dllNormal3iv ; - qglNormal3s = dllNormal3s ; - qglNormal3sv = dllNormal3sv ; - qglNormalPointer = dllNormalPointer ; - qglOrtho = dllOrtho ; - qglPassThrough = dllPassThrough ; - qglPixelMapfv = dllPixelMapfv ; - qglPixelMapuiv = dllPixelMapuiv ; - qglPixelMapusv = dllPixelMapusv ; - qglPixelStoref = dllPixelStoref ; - qglPixelStorei = dllPixelStorei ; - qglPixelTransferf = dllPixelTransferf ; - qglPixelTransferi = dllPixelTransferi ; - qglPixelZoom = dllPixelZoom ; - qglPointSize = dllPointSize ; - qglPolygonMode = dllPolygonMode ; - qglPolygonOffset = dllPolygonOffset ; - qglPolygonStipple = dllPolygonStipple ; - qglPopAttrib = dllPopAttrib ; - qglPopClientAttrib = dllPopClientAttrib ; - qglPopMatrix = dllPopMatrix ; - qglPopName = dllPopName ; - qglPrioritizeTextures = dllPrioritizeTextures ; - qglPushAttrib = dllPushAttrib ; - qglPushClientAttrib = dllPushClientAttrib ; - qglPushMatrix = dllPushMatrix ; - qglPushName = dllPushName ; - qglRasterPos2d = dllRasterPos2d ; - qglRasterPos2dv = dllRasterPos2dv ; - qglRasterPos2f = dllRasterPos2f ; - qglRasterPos2fv = dllRasterPos2fv ; - qglRasterPos2i = dllRasterPos2i ; - qglRasterPos2iv = dllRasterPos2iv ; - qglRasterPos2s = dllRasterPos2s ; - qglRasterPos2sv = dllRasterPos2sv ; - qglRasterPos3d = dllRasterPos3d ; - qglRasterPos3dv = dllRasterPos3dv ; - qglRasterPos3f = dllRasterPos3f ; - qglRasterPos3fv = dllRasterPos3fv ; - qglRasterPos3i = dllRasterPos3i ; - qglRasterPos3iv = dllRasterPos3iv ; - qglRasterPos3s = dllRasterPos3s ; - qglRasterPos3sv = dllRasterPos3sv ; - qglRasterPos4d = dllRasterPos4d ; - qglRasterPos4dv = dllRasterPos4dv ; - qglRasterPos4f = dllRasterPos4f ; - qglRasterPos4fv = dllRasterPos4fv ; - qglRasterPos4i = dllRasterPos4i ; - qglRasterPos4iv = dllRasterPos4iv ; - qglRasterPos4s = dllRasterPos4s ; - qglRasterPos4sv = dllRasterPos4sv ; - qglReadBuffer = dllReadBuffer ; - qglReadPixels = dllReadPixels ; - qglRectd = dllRectd ; - qglRectdv = dllRectdv ; - qglRectf = dllRectf ; - qglRectfv = dllRectfv ; - qglRecti = dllRecti ; - qglRectiv = dllRectiv ; - qglRects = dllRects ; - qglRectsv = dllRectsv ; - qglRenderMode = dllRenderMode ; - qglRotated = dllRotated ; - qglRotatef = dllRotatef ; - qglScaled = dllScaled ; - qglScalef = dllScalef ; - qglScissor = dllScissor ; - qglSelectBuffer = dllSelectBuffer ; - qglShadeModel = dllShadeModel ; - qglStencilFunc = dllStencilFunc ; - qglStencilMask = dllStencilMask ; - qglStencilOp = dllStencilOp ; - qglTexCoord1d = dllTexCoord1d ; - qglTexCoord1dv = dllTexCoord1dv ; - qglTexCoord1f = dllTexCoord1f ; - qglTexCoord1fv = dllTexCoord1fv ; - qglTexCoord1i = dllTexCoord1i ; - qglTexCoord1iv = dllTexCoord1iv ; - qglTexCoord1s = dllTexCoord1s ; - qglTexCoord1sv = dllTexCoord1sv ; - qglTexCoord2d = dllTexCoord2d ; - qglTexCoord2dv = dllTexCoord2dv ; - qglTexCoord2f = dllTexCoord2f ; - qglTexCoord2fv = dllTexCoord2fv ; - qglTexCoord2i = dllTexCoord2i ; - qglTexCoord2iv = dllTexCoord2iv ; - qglTexCoord2s = dllTexCoord2s ; - qglTexCoord2sv = dllTexCoord2sv ; - qglTexCoord3d = dllTexCoord3d ; - qglTexCoord3dv = dllTexCoord3dv ; - qglTexCoord3f = dllTexCoord3f ; - qglTexCoord3fv = dllTexCoord3fv ; - qglTexCoord3i = dllTexCoord3i ; - qglTexCoord3iv = dllTexCoord3iv ; - qglTexCoord3s = dllTexCoord3s ; - qglTexCoord3sv = dllTexCoord3sv ; - qglTexCoord4d = dllTexCoord4d ; - qglTexCoord4dv = dllTexCoord4dv ; - qglTexCoord4f = dllTexCoord4f ; - qglTexCoord4fv = dllTexCoord4fv ; - qglTexCoord4i = dllTexCoord4i ; - qglTexCoord4iv = dllTexCoord4iv ; - qglTexCoord4s = dllTexCoord4s ; - qglTexCoord4sv = dllTexCoord4sv ; - qglTexCoordPointer = dllTexCoordPointer ; - qglTexEnvf = dllTexEnvf ; - qglTexEnvfv = dllTexEnvfv ; - qglTexEnvi = dllTexEnvi ; - qglTexEnviv = dllTexEnviv ; - qglTexGend = dllTexGend ; - qglTexGendv = dllTexGendv ; - qglTexGenf = dllTexGenf ; - qglTexGenfv = dllTexGenfv ; - qglTexGeni = dllTexGeni ; - qglTexGeniv = dllTexGeniv ; - qglTexImage1D = dllTexImage1D ; - qglTexImage2D = dllTexImage2D ; - qglTexParameterf = dllTexParameterf ; - qglTexParameterfv = dllTexParameterfv ; - qglTexParameteri = dllTexParameteri ; - qglTexParameteriv = dllTexParameteriv ; - qglTexSubImage1D = dllTexSubImage1D ; - qglTexSubImage2D = dllTexSubImage2D ; - qglTranslated = dllTranslated ; - qglTranslatef = dllTranslatef ; - qglVertex2d = dllVertex2d ; - qglVertex2dv = dllVertex2dv ; - qglVertex2f = dllVertex2f ; - qglVertex2fv = dllVertex2fv ; - qglVertex2i = dllVertex2i ; - qglVertex2iv = dllVertex2iv ; - qglVertex2s = dllVertex2s ; - qglVertex2sv = dllVertex2sv ; - qglVertex3d = dllVertex3d ; - qglVertex3dv = dllVertex3dv ; - qglVertex3f = dllVertex3f ; - qglVertex3fv = dllVertex3fv ; - qglVertex3i = dllVertex3i ; - qglVertex3iv = dllVertex3iv ; - qglVertex3s = dllVertex3s ; - qglVertex3sv = dllVertex3sv ; - qglVertex4d = dllVertex4d ; - qglVertex4dv = dllVertex4dv ; - qglVertex4f = dllVertex4f ; - qglVertex4fv = dllVertex4fv ; - qglVertex4i = dllVertex4i ; - qglVertex4iv = dllVertex4iv ; - qglVertex4s = dllVertex4s ; - qglVertex4sv = dllVertex4sv ; - qglVertexPointer = dllVertexPointer ; - qglViewport = dllViewport ; - } -} - -#pragma warning (default : 4113 4133 4047 ) - - - diff --git a/codemp/win32/win_shared.cpp b/codemp/win32/win_shared.cpp deleted file mode 100644 index 24c25d795c..0000000000 --- a/codemp/win32/win_shared.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "win_local.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "qcommon/qcommon.h" - - - -static char binaryPath[ MAX_OSPATH ] = { 0 }; -static char installPath[ MAX_OSPATH ] = { 0 }; - -//============================================ - - - - - - diff --git a/codemp/win32/win_snd.cpp b/codemp/win32/win_snd.cpp deleted file mode 100644 index cbcd413a7d..0000000000 --- a/codemp/win32/win_snd.cpp +++ /dev/null @@ -1,385 +0,0 @@ -#include - -#include "client/snd_local.h" -#include "win_local.h" - -HRESULT (WINAPI *pDirectSoundCreate)(GUID FAR *lpGUID, LPDIRECTSOUND FAR *lplpDS, IUnknown FAR *pUnkOuter); -#define iDirectSoundCreate(a,b,c) pDirectSoundCreate(a,b,c) - -#define SECONDARY_BUFFER_SIZE 0x10000 - -#ifdef USE_OPENAL -extern int s_UseOpenAL; -#endif - -static qboolean dsound_init; -static int sample16; -static DWORD gSndBufSize; -static DWORD locksize; -static LPDIRECTSOUND pDS; -static LPDIRECTSOUNDBUFFER pDSBuf, pDSPBuf; -static HINSTANCE hInstDS; - - -static const char *DSoundError( int error ) { - switch ( error ) { - case DSERR_BUFFERLOST: - return "DSERR_BUFFERLOST"; - case DSERR_INVALIDCALL: - return "DSERR_INVALIDCALLS"; - case DSERR_INVALIDPARAM: - return "DSERR_INVALIDPARAM"; - case DSERR_PRIOLEVELNEEDED: - return "DSERR_PRIOLEVELNEEDED"; - case DSERR_ALLOCATED: - return "DSERR_ALLOCATED"; - case DSERR_UNINITIALIZED: - return "DSERR_UNINITIALIZED"; - case DSERR_UNSUPPORTED: - return "DSERR_UNSUPPORTED "; - } - - return "unknown"; -} - -/* -================== -SNDDMA_Shutdown -================== -*/ -void SNDDMA_Shutdown( void ) { - Com_DPrintf( "Shutting down sound system\n" ); - - if ( pDS ) { - Com_DPrintf( "Destroying DS buffers\n" ); - if ( pDS ) - { - Com_DPrintf( "...setting NORMAL coop level\n" ); - // FIXME JA was DSSCL_NORMAL and Q3 says DSSCL_PRIORITY but the printf says setting normal - pDS->SetCooperativeLevel( g_wv.hWnd, DSSCL_PRIORITY ); - } - - if ( pDSBuf ) - { - Com_DPrintf( "...stopping and releasing sound buffer\n" ); - pDSBuf->Stop( ); - pDSBuf->Release( ); - } - - // only release primary buffer if it's not also the mixing buffer we just released - if ( pDSPBuf && ( pDSBuf != pDSPBuf ) ) - { - Com_DPrintf( "...releasing primary buffer\n" ); - pDSPBuf->Release( ); - } - pDSBuf = NULL; - pDSPBuf = NULL; - - dma.buffer = NULL; - - Com_DPrintf( "...releasing DS object\n" ); - pDS->Release( ); - } - - if ( hInstDS ) { - Com_DPrintf( "...freeing DSOUND.DLL\n" ); - FreeLibrary( hInstDS ); - hInstDS = NULL; - } - - pDS = NULL; - pDSBuf = NULL; - pDSPBuf = NULL; - dsound_init = qfalse; - memset ((void *)&dma, 0, sizeof (dma)); - CoUninitialize( ); -} - -/* -================== -SNDDMA_Init - -Initialize direct sound -Returns false if failed -================== -*/ -qboolean SNDDMA_Init(void) { - - memset ((void *)&dma, 0, sizeof (dma)); - dsound_init = qfalse; - - CoInitialize(NULL); - - if ( !SNDDMA_InitDS () ) { - return qfalse; - } - - dsound_init = qtrue; - - Com_DPrintf("Completed successfully\n" ); - - return qtrue; -} - -#undef DEFINE_GUID - -#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - EXTERN_C const GUID name \ - = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } - -// DirectSound Component GUID {47D4D946-62E8-11CF-93BC-444553540000} -DEFINE_GUID(CLSID_DirectSound, 0x47d4d946, 0x62e8, 0x11cf, 0x93, 0xbc, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0); - -// DirectSound 8.0 Component GUID {3901CC3F-84B5-4FA4-BA35-AA8172B8A09B} -DEFINE_GUID(CLSID_DirectSound8, 0x3901cc3f, 0x84b5, 0x4fa4, 0xba, 0x35, 0xaa, 0x81, 0x72, 0xb8, 0xa0, 0x9b); - -DEFINE_GUID(IID_IDirectSound8, 0xC50A7E93, 0xF395, 0x4834, 0x9E, 0xF6, 0x7F, 0xA9, 0x9D, 0xE5, 0x09, 0x66); -DEFINE_GUID(IID_IDirectSound, 0x279AFA83, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60); - - -int SNDDMA_InitDS () -{ - HRESULT hresult; - DSBUFFERDESC dsbuf; - DSBCAPS dsbcaps; - WAVEFORMATEX format; - int use8; - - Com_Printf( "Initializing DirectSound\n"); - - use8 = 1; - // Create IDirectSound using the primary sound device - if( FAILED( hresult = CoCreateInstance(CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, IID_IDirectSound8, (void **)&pDS))) { - use8 = 0; - if( FAILED( hresult = CoCreateInstance(CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, IID_IDirectSound, (void **)&pDS))) { - Com_Printf ("failed\n"); - SNDDMA_Shutdown (); - return qfalse; - } - } - - hresult = pDS->Initialize( NULL); - - Com_DPrintf( "ok\n" ); - - Com_DPrintf("...setting DSSCL_PRIORITY coop level: " ); - - if ( DS_OK != pDS->SetCooperativeLevel( g_wv.hWnd, DSSCL_PRIORITY ) ) { - Com_Printf ("failed\n"); - SNDDMA_Shutdown (); - return qfalse; - } - Com_DPrintf("ok\n" ); - - - // create the secondary buffer we'll actually work with - dma.channels = 2; - dma.samplebits = 16; - - if (s_khz->integer == 44) - dma.speed = 44100; - else if (s_khz->integer == 22) - dma.speed = 22050; - else - dma.speed = 11025; - - memset (&format, 0, sizeof(format)); - format.wFormatTag = WAVE_FORMAT_PCM; - format.nChannels = dma.channels; - format.wBitsPerSample = dma.samplebits; - format.nSamplesPerSec = dma.speed; - format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8; - format.cbSize = 0; - format.nAvgBytesPerSec = format.nSamplesPerSec*format.nBlockAlign; - - memset (&dsbuf, 0, sizeof(dsbuf)); - dsbuf.dwSize = sizeof(DSBUFFERDESC); - - // Micah: take advantage of 2D hardware.if available. - dsbuf.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_LOCHARDWARE; - if (use8) { - dsbuf.dwFlags |= DSBCAPS_GETCURRENTPOSITION2; - } -//#define idDSBCAPS_GETCURRENTPOSITION2 0x00010000 - dsbuf.dwBufferBytes = SECONDARY_BUFFER_SIZE; - dsbuf.lpwfxFormat = &format; - - memset(&dsbcaps, 0, sizeof(dsbcaps)); - dsbcaps.dwSize = sizeof(dsbcaps); - - Com_DPrintf( "...creating secondary buffer: " ); - if (DS_OK == pDS->CreateSoundBuffer(&dsbuf, &pDSBuf, NULL)) { - Com_Printf( "locked hardware. ok\n" ); - } - else { - // Couldn't get hardware, fallback to software. - dsbuf.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_LOCSOFTWARE; - if (use8) { - dsbuf.dwFlags |= DSBCAPS_GETCURRENTPOSITION2; - } - if (DS_OK != pDS->CreateSoundBuffer(&dsbuf, &pDSBuf, NULL)) { - Com_Printf( "failed\n" ); - SNDDMA_Shutdown (); - return qfalse; - } - Com_DPrintf( "forced to software. ok\n" ); - } - - // Make sure mixer is active - if ( DS_OK != pDSBuf->Play(0, 0, DSBPLAY_LOOPING) ) { - Com_Printf ("*** Looped sound play failed ***\n"); - SNDDMA_Shutdown (); - return qfalse; - } - - // get the returned buffer size - if ( DS_OK != pDSBuf->GetCaps (&dsbcaps) ) { - Com_Printf ("*** GetCaps failed ***\n"); - SNDDMA_Shutdown (); - return qfalse; - } - - gSndBufSize = dsbcaps.dwBufferBytes; - - dma.channels = format.nChannels; - dma.samplebits = format.wBitsPerSample; - dma.speed = format.nSamplesPerSec; - dma.samples = gSndBufSize/(dma.samplebits/8); - dma.submission_chunk = 1; - dma.buffer = NULL; // must be locked first - - sample16 = (dma.samplebits/8) - 1; - - SNDDMA_BeginPainting (); - if (dma.buffer) - memset(dma.buffer, 0, dma.samples * dma.samplebits/8); - SNDDMA_Submit (); - return 1; -} -/* -============== -SNDDMA_GetDMAPos - -return the current sample position (in mono samples read) -inside the recirculating dma buffer, so the mixing code will know -how many sample are required to fill it up. -=============== -*/ -int SNDDMA_GetDMAPos( void ) { - MMTIME mmtime; - int s; - DWORD dwWrite; - - if ( !dsound_init ) { - return 0; - } - - mmtime.wType = TIME_SAMPLES; - pDSBuf->GetCurrentPosition(&mmtime.u.sample, &dwWrite); - - s = mmtime.u.sample; - - s >>= sample16; - - s &= (dma.samples-1); - - return s; -} - -/* -============== -SNDDMA_BeginPainting - -Makes sure dma.buffer is valid -=============== -*/ -void SNDDMA_BeginPainting( void ) { - int reps; - DWORD dwSize2; - DWORD *pbuf, *pbuf2; - HRESULT hresult; - DWORD dwStatus; - - if ( !pDSBuf ) { - return; - } - - // if the buffer was lost or stopped, restore it and/or restart it - if ( pDSBuf->GetStatus (&dwStatus) != DS_OK ) { - Com_Printf ("Couldn't get sound buffer status\n"); - } - - if (dwStatus & DSBSTATUS_BUFFERLOST) - pDSBuf->Restore (); - - if (!(dwStatus & DSBSTATUS_PLAYING)) - pDSBuf->Play(0, 0, DSBPLAY_LOOPING); - - // lock the dsound buffer - - reps = 0; - dma.buffer = NULL; - - while ((hresult = pDSBuf->Lock(0, gSndBufSize, (void **)&pbuf, &locksize, - (void **)&pbuf2, &dwSize2, 0)) != DS_OK) - { - if (hresult != DSERR_BUFFERLOST) - { - Com_Printf( "SNDDMA_BeginPainting: Lock failed with error '%s'\n", DSoundError( hresult ) ); - S_Shutdown (); - return; - } - else - { - pDSBuf->Restore( ); - } - - if (++reps > 2) - return; - } - dma.buffer = (unsigned char *)pbuf; -} - -/* -============== -SNDDMA_Submit - -Send sound to device if buffer isn't really the dma buffer -Also unlocks the dsound buffer -=============== -*/ -void SNDDMA_Submit( void ) { - // unlock the dsound buffer - if ( pDSBuf ) { - pDSBuf->Unlock(dma.buffer, locksize, NULL, 0); - } -} - - -/* -================= -SNDDMA_Activate - -When we change windows we need to do this -================= -*/ -void SNDDMA_Activate( qboolean bAppActive ) -{ -#ifdef USE_OPENAL - if (s_UseOpenAL) - { - S_AL_MuteAllSounds((qboolean)!bAppActive); - } -#endif - - if ( !pDS ) { - return; - } - - if ( DS_OK != pDS->SetCooperativeLevel( g_wv.hWnd, DSSCL_PRIORITY ) ) { - Com_Printf ("sound SetCooperativeLevel failed\n"); - SNDDMA_Shutdown (); - } -} - - diff --git a/codemp/win32/win_syscon.cpp b/codemp/win32/win_syscon.cpp deleted file mode 100644 index 33804dd59c..0000000000 --- a/codemp/win32/win_syscon.cpp +++ /dev/null @@ -1,593 +0,0 @@ -// win_syscon.h -#include "client/client.h" -#include "win_local.h" - -#include "resource.h" -#include -#include -#include -#include -#include -#include -#include - -enum { - COPY_ID = 1, - QUIT_ID, - CLEAR_ID, - - ERRORBOX_ID = 10, - ERRORTEXT_ID, - - EDIT_ID = 100, - INPUT_ID -}; - -typedef struct WinConData_s { - HWND hWnd; - HWND hwndBuffer; - - HWND hwndButtonClear; - HWND hwndButtonCopy; - HWND hwndButtonQuit; - - HWND hwndErrorBox; - HWND hwndErrorText; - - HBITMAP hbmLogo; - HBITMAP hbmClearBitmap; - - HBRUSH hbrEditBackground; - HBRUSH hbrErrorBackground; - - HFONT hfBufferFont; - HFONT hfButtonFont; - - HWND hwndInputLine; - - char errorString[80]; - - char consoleText[512], returnedText[512]; - int visLevel; - qboolean quitOnClose; - int windowWidth, windowHeight; - - WNDPROC SysInputLineWndProc; - - // console - field_t g_consoleField; - int nextHistoryLine; // the last line in the history buffer, not masked - int historyLine; // the line being displayed from history buffer will be <= nextHistoryLine - field_t historyEditLines[COMMAND_HISTORY]; - -} WinConData; - -static WinConData s_wcd; - -static LRESULT CALLBACK ConWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) -{ - const char *cmdString; - static qboolean s_timePolarity; - - switch (uMsg) - { - case WM_ACTIVATE: - if ( LOWORD( wParam ) != WA_INACTIVE ) - { - SetFocus( s_wcd.hwndInputLine ); - } - - if ( com_viewlog && ( com_dedicated && !com_dedicated->integer ) ) - { - // if the viewlog is open, check to see if it's being minimized - if ( com_viewlog->integer == 1 ) - { - if ( HIWORD( wParam ) ) // minimized flag - { - Cvar_Set( "viewlog", "2" ); - } - } - else if ( com_viewlog->integer == 2 ) - { - if ( !HIWORD( wParam ) ) // minimized flag - { - Cvar_Set( "viewlog", "1" ); - } - } - } - break; - - case WM_CLOSE: - if ( ( com_dedicated && com_dedicated->integer ) ) - { - cmdString = CopyString( "quit" ); - Sys_QueEvent( 0, SE_CONSOLE, 0, 0, strlen( cmdString ) + 1, (void *)cmdString ); - } - else if ( s_wcd.quitOnClose ) - { - PostQuitMessage( 0 ); - } - else - { - Sys_ShowConsole( 0, qfalse ); - Cvar_Set( "viewlog", "0" ); - } - return FALSE; - - case WM_CTLCOLORSTATIC: - if ( ( HWND ) lParam == s_wcd.hwndBuffer ) - { - SetBkColor( ( HDC ) wParam, RGB( 0, 0, 0 ) ); - SetTextColor( ( HDC ) wParam, RGB( 249, 249, 000 ) ); - return ( LRESULT ) s_wcd.hbrEditBackground; - } - else if ( ( HWND ) lParam == s_wcd.hwndErrorBox ) - { - if ( s_timePolarity & 1 ) - { - SetBkColor( ( HDC ) wParam, RGB( 0x80, 0x80, 0x80 ) ); - SetTextColor( ( HDC ) wParam, RGB( 0xff, 0x00, 0x00 ) ); - } - else - { - SetBkColor( ( HDC ) wParam, RGB( 0x80, 0x80, 0x80 ) ); - SetTextColor( ( HDC ) wParam, RGB( 0x00, 0x00, 0x00 ) ); - } - return ( LRESULT ) s_wcd.hbrErrorBackground; - } - return FALSE; - - case WM_COMMAND: - if ( wParam == COPY_ID ) - { - SendMessage( s_wcd.hwndBuffer, EM_SETSEL, 0, -1 ); - SendMessage( s_wcd.hwndBuffer, WM_COPY, 0, 0 ); - } - else if ( wParam == QUIT_ID ) - { - if ( s_wcd.quitOnClose ) - { - PostQuitMessage( 0 ); - } - else - { - cmdString = CopyString( "quit" ); - Sys_QueEvent( 0, SE_CONSOLE, 0, 0, strlen( cmdString ) + 1, (void *)cmdString ); - } - } - else if ( wParam == CLEAR_ID ) - { - SendMessage( s_wcd.hwndBuffer, EM_SETSEL, 0, -1 ); - SendMessage( s_wcd.hwndBuffer, EM_REPLACESEL, FALSE, ( LPARAM ) "" ); - UpdateWindow( s_wcd.hwndBuffer ); - } - break; - case WM_CREATE: - s_wcd.hbrEditBackground = CreateSolidBrush( RGB( 0x00, 0x00, 0x00 ) ); - s_wcd.hbrErrorBackground = CreateSolidBrush( RGB( 0x80, 0x80, 0x80 ) ); - SetTimer( hWnd, 1, 1000, NULL ); - break; - case WM_ERASEBKGND: - return DefWindowProc( hWnd, uMsg, wParam, lParam ); - case WM_TIMER: - if ( wParam == 1 ) - { - s_timePolarity = (qboolean)!s_timePolarity; - if ( s_wcd.hwndErrorBox ) - { - InvalidateRect( s_wcd.hwndErrorBox, NULL, FALSE ); - } - } - break; - } - - return DefWindowProc( hWnd, uMsg, wParam, lParam ); -} - -static LRESULT CALLBACK InputLineWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) -{ - switch ( uMsg ) - { - case WM_KILLFOCUS: - if ( ( HWND ) wParam == s_wcd.hWnd || - ( HWND ) wParam == s_wcd.hwndErrorBox ) - { - SetFocus( hWnd ); - return 0; - } - break; - - case WM_CHAR: - GetWindowText( s_wcd.hwndInputLine, s_wcd.g_consoleField.buffer, sizeof( s_wcd.g_consoleField.buffer ) ); - SendMessage( s_wcd.hwndInputLine, EM_GETSEL, (WPARAM) NULL, (LPARAM) &s_wcd.g_consoleField.cursor ); - - if ( wParam == VK_RETURN ) - { - strncat( s_wcd.consoleText, s_wcd.g_consoleField.buffer, sizeof( s_wcd.consoleText ) - strlen( s_wcd.consoleText ) - 5 ); - strcat( s_wcd.consoleText, "\n" ); - SetWindowText( s_wcd.hwndInputLine, "" ); - - Sys_Print( va( "%c%s\n", CONSOLE_PROMPT_CHAR, s_wcd.g_consoleField.buffer ) ); - - // empty lines just scroll the console without adding to history - if ( !s_wcd.g_consoleField.buffer[0] ) - return 0; - - // copy line to history buffer - s_wcd.historyEditLines[s_wcd.nextHistoryLine % COMMAND_HISTORY] = s_wcd.g_consoleField; - s_wcd.nextHistoryLine++; - s_wcd.historyLine = s_wcd.nextHistoryLine; - Field_Clear( &s_wcd.g_consoleField ); - s_wcd.g_consoleField.widthInChars = g_console_field_width; - - return 0; - } - - if ( wParam == VK_TAB ) - { - Field_AutoComplete( &s_wcd.g_consoleField ); - SetWindowText( s_wcd.hwndInputLine, s_wcd.g_consoleField.buffer ); - SendMessage( s_wcd.hwndInputLine, EM_SETSEL, s_wcd.g_consoleField.cursor, s_wcd.g_consoleField.cursor ); - return 0; - } - break; - case WM_KEYDOWN: - // history scrolling - if ( wParam == VK_UP ) - {// scroll up: arrow-up - if ( s_wcd.nextHistoryLine - s_wcd.historyLine < COMMAND_HISTORY && s_wcd.historyLine > 0 ) - s_wcd.historyLine--; - s_wcd.g_consoleField = s_wcd.historyEditLines[s_wcd.historyLine % COMMAND_HISTORY]; - SetWindowText( s_wcd.hwndInputLine, s_wcd.g_consoleField.buffer ); - SendMessage( s_wcd.hwndInputLine, EM_SETSEL, s_wcd.g_consoleField.cursor, s_wcd.g_consoleField.cursor ); - - return 0; - } - - if ( wParam == VK_DOWN ) - {// scroll down: arrow-down - s_wcd.historyLine++; - if (s_wcd.historyLine >= s_wcd.nextHistoryLine) { - s_wcd.historyLine = s_wcd.nextHistoryLine; - Field_Clear( &s_wcd.g_consoleField ); - s_wcd.g_consoleField.widthInChars = g_console_field_width; - SetWindowText( s_wcd.hwndInputLine, s_wcd.g_consoleField.buffer ); - SendMessage( s_wcd.hwndInputLine, EM_SETSEL, s_wcd.g_consoleField.cursor, s_wcd.g_consoleField.cursor ); - return 0; - } - s_wcd.g_consoleField = s_wcd.historyEditLines[s_wcd.historyLine % COMMAND_HISTORY]; - SetWindowText( s_wcd.hwndInputLine, s_wcd.g_consoleField.buffer ); - SendMessage( s_wcd.hwndInputLine, EM_SETSEL, s_wcd.g_consoleField.cursor, s_wcd.g_consoleField.cursor ); - - return 0; - } - break; - } - - return CallWindowProc( s_wcd.SysInputLineWndProc, hWnd, uMsg, wParam, lParam ); -} - -/* -** Sys_CreateConsole -*/ -void Sys_CreateConsole( void ) -{ - HDC hDC; - WNDCLASS wc; - RECT rect; - const char *DEDCLASS = "JAMP WinConsole"; - int nHeight; - int swidth, sheight; - DWORD DEDSTYLE = WS_POPUPWINDOW | WS_CAPTION | WS_MINIMIZEBOX; - - memset( &wc, 0, sizeof( wc ) ); - - wc.style = 0; - wc.lpfnWndProc = (WNDPROC) ConWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = g_wv.hInstance; - wc.hIcon = LoadIcon( g_wv.hInstance, MAKEINTRESOURCE(IDI_ICON1)); - wc.hCursor = LoadCursor (NULL,IDC_ARROW); - wc.hbrBackground = (HBRUSH)COLOR_INACTIVEBORDER; - wc.lpszMenuName = 0; - wc.lpszClassName = DEDCLASS; - - if ( !RegisterClass (&wc) ) { - return; - } - - rect.left = 0; - rect.right = 600; - rect.top = 0; - rect.bottom = 450; - AdjustWindowRect( &rect, DEDSTYLE, FALSE ); - - hDC = GetDC( GetDesktopWindow() ); - swidth = GetDeviceCaps( hDC, HORZRES ); - sheight = GetDeviceCaps( hDC, VERTRES ); - ReleaseDC( GetDesktopWindow(), hDC ); - - s_wcd.windowWidth = rect.right - rect.left + 1; - s_wcd.windowHeight = rect.bottom - rect.top + 1; - - s_wcd.hWnd = CreateWindowEx( 0, - DEDCLASS, - CLIENT_CONSOLE_TITLE, - DEDSTYLE, - ( swidth - 600 ) / 2, ( sheight - 450 ) / 2 , rect.right - rect.left + 1, rect.bottom - rect.top + 1, - NULL, - NULL, - g_wv.hInstance, - NULL ); - - if ( s_wcd.hWnd == NULL ) - { - return; - } - - // - // create fonts - // - hDC = GetDC( s_wcd.hWnd ); - nHeight = -MulDiv( 8, GetDeviceCaps( hDC, LOGPIXELSY), 72); - - s_wcd.hfBufferFont = CreateFont( nHeight, - 0, - 0, - 0, - FW_LIGHT, - 0, - 0, - 0, - DEFAULT_CHARSET, - OUT_DEFAULT_PRECIS, - CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, - FF_MODERN | FIXED_PITCH, - "Courier New" ); - - ReleaseDC( s_wcd.hWnd, hDC ); - - // - // create the input line - // - s_wcd.hwndInputLine = CreateWindow( "edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | - ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, - 6, 400, s_wcd.windowWidth-20, 20, - s_wcd.hWnd, - ( HMENU ) INPUT_ID, // child window ID - g_wv.hInstance, NULL ); - - // - // create the buttons - // - s_wcd.hwndButtonCopy = CreateWindow( "button", NULL, BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON | WS_TABSTOP, - 5, 425, 72, 24, - s_wcd.hWnd, - ( HMENU ) COPY_ID, // child window ID - g_wv.hInstance, NULL ); - SendMessage( s_wcd.hwndButtonCopy, WM_SETTEXT, 0, ( LPARAM ) "Copy" ); - - s_wcd.hwndButtonClear = CreateWindow( "button", NULL, BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON | WS_TABSTOP, - 82, 425, 72, 24, - s_wcd.hWnd, - ( HMENU ) CLEAR_ID, // child window ID - g_wv.hInstance, NULL ); - SendMessage( s_wcd.hwndButtonClear, WM_SETTEXT, 0, ( LPARAM ) "Clear" ); - - s_wcd.hwndButtonQuit = CreateWindow( "button", NULL, BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON | WS_TABSTOP, - s_wcd.windowWidth-92, 425, 72, 24, - s_wcd.hWnd, - ( HMENU ) QUIT_ID, // child window ID - g_wv.hInstance, NULL ); - SendMessage( s_wcd.hwndButtonQuit, WM_SETTEXT, 0, ( LPARAM ) "Quit" ); - - - // - // create the scrollbuffer - // - s_wcd.hwndBuffer = CreateWindow( "edit", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | - ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_TABSTOP, - 6, 40, s_wcd.windowWidth-20, 354, - s_wcd.hWnd, - ( HMENU ) EDIT_ID, // child window ID - g_wv.hInstance, NULL ); - SendMessage( s_wcd.hwndBuffer, WM_SETFONT, ( WPARAM ) s_wcd.hfBufferFont, 0 ); - - s_wcd.SysInputLineWndProc = ( WNDPROC ) SetWindowLongPtr( s_wcd.hwndInputLine, GWLP_WNDPROC, ( LONG_PTR ) InputLineWndProc ); - SendMessage( s_wcd.hwndInputLine, WM_SETFONT, ( WPARAM ) s_wcd.hfBufferFont, 0 ); - SendMessage( s_wcd.hwndBuffer, EM_LIMITTEXT, ( WPARAM ) 0x7fff, 0 ); - - ShowWindow( s_wcd.hWnd, SW_SHOWDEFAULT); - UpdateWindow( s_wcd.hWnd ); - SetForegroundWindow( s_wcd.hWnd ); - SetFocus( s_wcd.hwndInputLine ); - - Field_Clear( &s_wcd.g_consoleField ); - s_wcd.g_consoleField.widthInChars = g_console_field_width; - for ( int i = 0 ; i < COMMAND_HISTORY ; i++ ) { - Field_Clear( &s_wcd.historyEditLines[i] ); - s_wcd.historyEditLines[i].widthInChars = g_console_field_width; - } - - s_wcd.visLevel = 1; -} - -/* -** Sys_DestroyConsole -*/ -void Sys_DestroyConsole( void ) -{ - if ( s_wcd.hWnd ) - { - DeleteObject(s_wcd.hbrEditBackground); - DeleteObject(s_wcd.hbrErrorBackground); - DeleteObject(s_wcd.hfBufferFont); - - ShowWindow( s_wcd.hWnd, SW_HIDE ); - CloseWindow( s_wcd.hWnd ); - DestroyWindow( s_wcd.hWnd ); - s_wcd.hWnd = 0; - } -} - -/* -** Sys_ShowConsole -*/ -void Sys_ShowConsole( int visLevel, qboolean quitOnClose ) -{ - s_wcd.quitOnClose = quitOnClose; - - if ( visLevel == s_wcd.visLevel ) - { - return; - } - - s_wcd.visLevel = visLevel; - - if ( !s_wcd.hWnd ) - { - return; - } - - switch ( visLevel ) - { - case 0: - ShowWindow( s_wcd.hWnd, SW_HIDE ); - break; - case 1: - ShowWindow( s_wcd.hWnd, SW_SHOWNORMAL ); - SendMessage( s_wcd.hwndBuffer, EM_LINESCROLL, 0, 0xffff ); - break; - case 2: - ShowWindow( s_wcd.hWnd, SW_MINIMIZE ); - break; - default: - Sys_Error( "Invalid visLevel %d sent to Sys_ShowConsole\n", visLevel ); - break; - } -} - -/* -** Sys_ConsoleInput -*/ -char *Sys_ConsoleInput( void ) -{ - if ( s_wcd.consoleText[0] == 0 ) - { - return NULL; - } - - strcpy( s_wcd.returnedText, s_wcd.consoleText ); - s_wcd.consoleText[0] = 0; - - return s_wcd.returnedText; -} - -/* -** Conbuf_AppendText -*/ -void Conbuf_AppendText( const char *pMsg ) -{ -#define CONSOLE_BUFFER_SIZE 16384 - if ( !s_wcd.hWnd ) { - return; - } - char buffer[CONSOLE_BUFFER_SIZE*4]; - char *b = buffer; - const char *msg; - int bufLen; - int i = 0; - static unsigned long s_totalChars; - - // - // if the message is REALLY long, use just the last portion of it - // - if ( strlen( pMsg ) > CONSOLE_BUFFER_SIZE - 1 ) - { - msg = pMsg + strlen( pMsg ) - CONSOLE_BUFFER_SIZE + 1; - } - else - { - msg = pMsg; - } - - // - // copy into an intermediate buffer - // - while ( msg[i] && ( ( b - buffer ) < sizeof( buffer ) - 1 ) ) - { - if ( msg[i] == '\n' && msg[i+1] == '\r' ) - { - b[0] = '\r'; - b[1] = '\n'; - b += 2; - i++; - } - else if ( msg[i] == '\r' ) - { - b[0] = '\r'; - b[1] = '\n'; - b += 2; - } - else if ( msg[i] == '\n' ) - { - b[0] = '\r'; - b[1] = '\n'; - b += 2; - } - else if ( Q_IsColorStringExt( &msg[i] ) ) - { - i++; - } - else - { - *b= msg[i]; - b++; - } - i++; - } - *b = 0; - bufLen = b - buffer; - - s_totalChars += bufLen; - - // - // replace selection instead of appending if we're overflowing - // - if ( s_totalChars > 0x7fff ) - { - SendMessage( s_wcd.hwndBuffer, EM_SETSEL, 0, -1 ); - s_totalChars = bufLen; - } - - // - // put this text into the windows console - // - SendMessage( s_wcd.hwndBuffer, EM_LINESCROLL, 0, 0xffff ); - SendMessage( s_wcd.hwndBuffer, EM_SCROLLCARET, 0, 0 ); - SendMessage( s_wcd.hwndBuffer, EM_REPLACESEL, 0, (LPARAM) buffer ); -} - -/* -** Sys_SetErrorText -*/ -void Sys_SetErrorText( const char *buf ) -{ - Q_strncpyz( s_wcd.errorString, buf, sizeof( s_wcd.errorString ) ); - - if ( !s_wcd.hwndErrorBox ) - { - s_wcd.hwndErrorBox = CreateWindow( "static", NULL, WS_CHILD | WS_VISIBLE | SS_SUNKEN, - 6, 5, s_wcd.windowWidth-20, 30, - s_wcd.hWnd, - ( HMENU ) ERRORBOX_ID, // child window ID - g_wv.hInstance, NULL ); - SendMessage( s_wcd.hwndErrorBox, WM_SETFONT, ( WPARAM ) s_wcd.hfBufferFont, 0 ); - SetWindowText( s_wcd.hwndErrorBox, s_wcd.errorString ); - - DestroyWindow( s_wcd.hwndInputLine ); - s_wcd.hwndInputLine = NULL; - } -} diff --git a/codemp/win32/win_wndproc.cpp b/codemp/win32/win_wndproc.cpp deleted file mode 100644 index 207d81bc02..0000000000 --- a/codemp/win32/win_wndproc.cpp +++ /dev/null @@ -1,492 +0,0 @@ -#include "client/client.h" -#include "win_local.h" - -WinVars_t g_wv; - -// The only directly referenced keycode - the console key (which gives different ascii codes depending on locale) -#define CONSOLE_SCAN_CODE 0x29 - -#ifndef WM_MOUSEWHEEL -#define WM_MOUSEWHEEL (WM_MOUSELAST+1) // message that will be supported by the OS -#endif - -static UINT MSH_MOUSEWHEEL; - -// Console variables that we need to access from this module -cvar_t *vid_xpos; // X coordinate of window position -cvar_t *vid_ypos; // Y coordinate of window position - -LONG WINAPI MainWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); - -/* -================== -VID_AppActivate -================== -*/ -static void VID_AppActivate(BOOL fActive, BOOL minimize) -{ - g_wv.isMinimized = (qboolean)minimize; - - Com_DPrintf("VID_AppActivate: %i\n", fActive ); - - Key_ClearStates(); - - // we don't want to act like we're active if we're minimized - if (fActive && !g_wv.isMinimized ) - { - g_wv.activeApp = qtrue; - } - else - { - g_wv.activeApp = qfalse; - } - - // minimize/restore mouse-capture on demand - if (!g_wv.activeApp ) - { - IN_Activate (qfalse); - } - else - { - IN_Activate (qtrue); - } -} - -//========================================================================== - - -static byte virtualKeyConvert[0x92][2] = -{ - { 0, 0 }, - { A_MOUSE1, A_MOUSE1 }, // VK_LBUTTON 01 Left mouse button - { A_MOUSE2, A_MOUSE2 }, // VK_RBUTTON 02 Right mouse button - { 0, 0 }, // VK_CANCEL 03 Control-break processing - { A_MOUSE3, A_MOUSE3 }, // VK_MBUTTON 04 Middle mouse button (three-button mouse) - { A_MOUSE4, A_MOUSE4 }, // VK_XBUTTON1 05 Windows 2000/XP: X1 mouse button - { A_MOUSE5, A_MOUSE5 }, // VK_XBUTTON2 06 Windows 2000/XP: X2 mouse button - { 0, 0 }, // 07 Undefined - { A_BACKSPACE, A_BACKSPACE }, // VK_BACK 08 BACKSPACE key - { A_TAB, A_TAB }, // VK_TAB 09 TAB key - { 0, 0 }, // 0A Reserved - { 0, 0 }, // 0B Reserved - { A_KP_5, 0 }, // VK_CLEAR 0C CLEAR key - { A_ENTER, A_KP_ENTER }, // VK_RETURN 0D ENTER key - { 0, 0 }, // 0E Undefined - { 0, 0 }, // 0F Undefined - { A_SHIFT, A_SHIFT }, // VK_SHIFT 10 SHIFT key - { A_CTRL, A_CTRL }, // VK_CONTROL 11 CTRL key - { A_ALT, A_ALT }, // VK_MENU 12 ALT key - { A_PAUSE, A_PAUSE }, // VK_PAUSE 13 PAUSE key - { A_CAPSLOCK, A_CAPSLOCK }, // VK_CAPITAL 14 CAPS LOCK key - { 0, 0 }, // VK_KANA 15 IME Kana mode - { 0, 0 }, // 16 Undefined - { 0, 0 }, // VK_JUNJA 17 IME Junja mode - { 0, 0 }, // VK_FINAL 18 IME final mode - { 0, 0 }, // VK_KANJI 19 IME Kanji mode - { 0, 0 }, // 1A Undefined - { A_ESCAPE, A_ESCAPE }, // VK_ESCAPE 1B ESC key - { 0, 0 }, // VK_CONVERT 1C IME convert - { 0, 0 }, // VK_NONCONVERT 1D IME nonconvert - { 0, 0 }, // VK_ACCEPT 1E IME accept - { 0, 0 }, // VK_MODECHANGE 1F IME mode change request - { A_SPACE, A_SPACE }, // VK_SPACE 20 SPACEBAR - { A_KP_9, A_PAGE_UP }, // VK_PRIOR 21 PAGE UP key - { A_KP_3, A_PAGE_DOWN }, // VK_NEXT 22 PAGE DOWN key - { A_KP_1, A_END }, // VK_END 23 END key - { A_KP_7, A_HOME }, // VK_HOME 24 HOME key - { A_KP_4, A_CURSOR_LEFT }, // VK_LEFT 25 LEFT ARROW key - { A_KP_8, A_CURSOR_UP }, // VK_UP 26 UP ARROW key - { A_KP_6, A_CURSOR_RIGHT }, // VK_RIGHT 27 RIGHT ARROW key - { A_KP_2, A_CURSOR_DOWN }, // VK_DOWN 28 DOWN ARROW key - { 0, 0 }, // VK_SELECT 29 SELECT key - { 0, 0 }, // VK_PRINT 2A PRINT key - { 0, 0 }, // VK_EXECUTE 2B EXECUTE key - { A_PRINTSCREEN, A_PRINTSCREEN }, // VK_SNAPSHOT 2C PRINT SCREEN key - { A_KP_0, A_INSERT }, // VK_INSERT 2D INS key - { A_KP_PERIOD, A_DELETE }, // VK_DELETE 2E DEL key - { 0, 0 }, // VK_HELP 2F HELP key - { A_0, A_0 }, // 30 0 key - { A_1, A_1 }, // 31 1 key - { A_2, A_2 }, // 32 2 key - { A_3, A_3 }, // 33 3 key - { A_4, A_4 }, // 34 4 key - { A_5, A_5 }, // 35 5 key - { A_6, A_6 }, // 36 6 key - { A_7, A_7 }, // 37 7 key - { A_8, A_8 }, // 38 8 key - { A_9, A_9 }, // 39 9 key - { 0, 0 }, // 3A Undefined - { 0, 0 }, // 3B Undefined - { 0, 0 }, // 3C Undefined - { 0, 0 }, // 3D Undefined - { 0, 0 }, // 3E Undefined - { 0, 0 }, // 3F Undefined - { 0, 0 }, // 40 Undefined - { A_CAP_A, A_CAP_A }, // 41 A key - { A_CAP_B, A_CAP_B }, // 42 B key - { A_CAP_C, A_CAP_C }, // 43 C key - { A_CAP_D, A_CAP_D }, // 44 D key - { A_CAP_E, A_CAP_E }, // 45 E key - { A_CAP_F, A_CAP_F }, // 46 F key - { A_CAP_G, A_CAP_G }, // 47 G key - { A_CAP_H, A_CAP_H }, // 48 H key - { A_CAP_I, A_CAP_I }, // 49 I key - { A_CAP_J, A_CAP_J }, // 4A J key - { A_CAP_K, A_CAP_K }, // 4B K key - { A_CAP_L, A_CAP_L }, // 4C L key - { A_CAP_M, A_CAP_M }, // 4D M key - { A_CAP_N, A_CAP_N }, // 4E N key - { A_CAP_O, A_CAP_O }, // 4F O key - { A_CAP_P, A_CAP_P }, // 50 P key - { A_CAP_Q, A_CAP_Q }, // 51 Q key - { A_CAP_R, A_CAP_R }, // 52 R key - { A_CAP_S, A_CAP_S }, // 53 S key - { A_CAP_T, A_CAP_T }, // 54 T key - { A_CAP_U, A_CAP_U }, // 55 U key - { A_CAP_V, A_CAP_V }, // 56 V key - { A_CAP_W, A_CAP_W }, // 57 W key - { A_CAP_X, A_CAP_X }, // 58 X key - { A_CAP_Y, A_CAP_Y }, // 59 Y key - { A_CAP_Z, A_CAP_Z }, // 5A Z key - { 0, 0 }, // VK_LWIN 5B Left Windows key (Microsoft® Natural® keyboard) - { 0, 0 }, // VK_RWIN 5C Right Windows key (Natural keyboard) - { 0, 0 }, // VK_APPS 5D Applications key (Natural keyboard) - { 0, 0 }, // 5E Reserved - { 0, 0 }, // VK_SLEEP 5F Computer Sleep key - { A_KP_0, A_KP_0 }, // VK_NUMPAD0 60 Numeric keypad 0 key - { A_KP_1, A_KP_1 }, // VK_NUMPAD1 61 Numeric keypad 1 key - { A_KP_2, A_KP_2 }, // VK_NUMPAD2 62 Numeric keypad 2 key - { A_KP_3, A_KP_3 }, // VK_NUMPAD3 63 Numeric keypad 3 key - { A_KP_4, A_KP_4 }, // VK_NUMPAD4 64 Numeric keypad 4 key - { A_KP_5, A_KP_5 }, // VK_NUMPAD5 65 Numeric keypad 5 key - { A_KP_6, A_KP_6 }, // VK_NUMPAD6 66 Numeric keypad 6 key - { A_KP_7, A_KP_7 }, // VK_NUMPAD7 67 Numeric keypad 7 key - { A_KP_8, A_KP_8 }, // VK_NUMPAD8 68 Numeric keypad 8 key - { A_KP_9, A_KP_9 }, // VK_NUMPAD9 69 Numeric keypad 9 key - { A_MULTIPLY, A_MULTIPLY }, // VK_MULTIPLY 6A Multiply key - { A_KP_PLUS, A_KP_PLUS }, // VK_ADD 6B Add key - { 0, 0 }, // VK_SEPARATOR 6C Separator key - { A_KP_MINUS, A_KP_MINUS }, // VK_SUBTRACT 6D Subtract key - { A_KP_PERIOD, A_KP_PERIOD }, // VK_DECIMAL 6E Decimal key - { A_DIVIDE, A_DIVIDE }, // VK_DIVIDE 6F Divide key - { A_F1, A_F1 }, // VK_F1 70 F1 key - { A_F2, A_F2 }, // VK_F2 71 F2 key - { A_F3, A_F3 }, // VK_F3 72 F3 key - { A_F4, A_F4 }, // VK_F4 73 F4 key - { A_F5, A_F5 }, // VK_F5 74 F5 key - { A_F6, A_F6 }, // VK_F6 75 F6 key - { A_F7, A_F7 }, // VK_F7 76 F7 key - { A_F8, A_F8 }, // VK_F8 77 F8 key - { A_F9, A_F9 }, // VK_F9 78 F9 key - { A_F10, A_F10 }, // VK_F10 79 F10 key - { A_F11, A_F11 }, // VK_F11 7A F11 key - { A_F12, A_F12 }, // VK_F12 7B F12 key - { 0, 0 }, // VK_F13 7C F13 key - { 0, 0 }, // VK_F14 7D F14 key - { 0, 0 }, // VK_F15 7E F15 key - { 0, 0 }, // VK_F16 7F F16 key - { 0, 0 }, // VK_F17 80H F17 key - { 0, 0 }, // VK_F18 81H F18 key - { 0, 0 }, // VK_F19 82H F19 key - { 0, 0 }, // VK_F20 83H F20 key - { 0, 0 }, // VK_F21 84H F21 key - { 0, 0 }, // VK_F22 85H F22 key - { 0, 0 }, // VK_F23 86H F23 key - { 0, 0 }, // VK_F24 87H F24 key - { 0, 0 }, // 88 Unassigned - { 0, 0 }, // 89 Unassigned - { 0, 0 }, // 8A Unassigned - { 0, 0 }, // 8B Unassigned - { 0, 0 }, // 8C Unassigned - { 0, 0 }, // 8D Unassigned - { 0, 0 }, // 8E Unassigned - { 0, 0 }, // 8F Unassigned - { A_NUMLOCK, A_NUMLOCK }, // VK_NUMLOCK 90 NUM LOCK key - { A_SCROLLLOCK, A_SCROLLLOCK } // VK_SCROLL 91 -}; - -/* -======= -MapKey - -Map from windows to quake keynums -======= -*/ -static int MapKey (ulong key, word wParam) -{ - ulong result, scan, extended; - - // Check for the console key (hard code to the key you would expect) - scan = ( key >> 16 ) & 0xff; - if(scan == CONSOLE_SCAN_CODE) - { - return(A_CONSOLE); - } - - // Try to convert the virtual key directly - result = 0; - extended = (key >> 24) & 1; - if(wParam > 0 && wParam <= VK_SCROLL) - { - // yeuch, but oh well... - // - if ( wParam >= VK_NUMPAD0 && wParam <= VK_NUMPAD9 ) - { - bool bNumlockOn = !!(GetKeyState( VK_NUMLOCK ) & 1); - if ( bNumlockOn ) - { - wParam = 0x30 + (wParam - VK_NUMPAD0); // convert to standard 0..9 - } - } - result = virtualKeyConvert[wParam][extended]; - } - // Get the unshifted ascii code (if any) - if(!result) - { - result = MapVirtualKey(wParam, 2) & 0xff; - } - // Output any debug prints -// if(in_debug && in_debug->integer & 1) -// { -// Com_Printf("WM_KEY: %x : %x : %x\n", key, wParam, result); -// } - return(result); -} - - -/* -==================== -MainWndProc - -main window procedure -==================== -*/ - -#define WM_BUTTON4DOWN (WM_MOUSELAST+2) -#define WM_BUTTON4UP (WM_MOUSELAST+3) -#define MK_BUTTON4L 0x0020 -#define MK_BUTTON4R 0x0040 - -LONG WINAPI MainWndProc ( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - byte code; - - if ( uMsg == MSH_MOUSEWHEEL ) - { - if ( ( ( int ) wParam ) > 0 ) - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, A_MWHEELUP, qtrue, 0, NULL ); - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, A_MWHEELUP, qfalse, 0, NULL ); - } - else - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, A_MWHEELDOWN, qtrue, 0, NULL ); - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, A_MWHEELDOWN, qfalse, 0, NULL ); - } - return DefWindowProc (hWnd, uMsg, wParam, lParam); - } - - switch (uMsg) - { - case WM_MOUSEWHEEL: - // - // - // this chunk of code theoretically only works under NT4 and Win98 - // since this message doesn't exist under Win95 - // - if ( ( short ) HIWORD( wParam ) > 0 ) - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, A_MWHEELUP, qtrue, 0, NULL ); - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, A_MWHEELUP, qfalse, 0, NULL ); - } - else - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, A_MWHEELDOWN, qtrue, 0, NULL ); - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, A_MWHEELDOWN, qfalse, 0, NULL ); - } - break; - - case WM_CREATE: - - g_wv.hWnd = hWnd; - - vid_xpos = Cvar_Get ("vid_xpos", "3", CVAR_ARCHIVE); - vid_ypos = Cvar_Get ("vid_ypos", "22", CVAR_ARCHIVE); - - MSH_MOUSEWHEEL = RegisterWindowMessage("MSWHEEL_ROLLMSG"); - - break; - case WM_DESTROY: - // let sound and input know about this? - g_wv.hWnd = NULL; - break; - - case WM_CLOSE: - Cbuf_ExecuteText( EXEC_APPEND, "quit" ); - break; - - case WM_ACTIVATE: - { - int fActive, fMinimized; - - fActive = LOWORD(wParam); - fMinimized = (BOOL) HIWORD(wParam); - - Cvar_SetValue( "com_unfocused", (fActive == WA_INACTIVE)); - Cvar_SetValue( "com_minimized", fMinimized); - - VID_AppActivate( fActive != WA_INACTIVE, fMinimized); - SNDDMA_Activate( (qboolean)(fActive != WA_INACTIVE && !fMinimized) ); - } - break; - - case WM_MOVE: - { - int xPos, yPos; - RECT r; - int style; - - if (!Cvar_VariableIntegerValue("r_fullscreen") ) - { - xPos = (short) LOWORD(lParam); // horizontal position - yPos = (short) HIWORD(lParam); // vertical position - - r.left = 0; - r.top = 0; - r.right = 1; - r.bottom = 1; - - style = GetWindowLongPtr( hWnd, GWL_STYLE ); - AdjustWindowRect( &r, style, FALSE ); - - Cvar_SetValue( "vid_xpos", xPos + r.left); - Cvar_SetValue( "vid_ypos", yPos + r.top); - vid_xpos->modified = qfalse; - vid_ypos->modified = qfalse; - if ( g_wv.activeApp ) - { - IN_Activate (qtrue); - } - } - } - break; - -// this is complicated because Win32 seems to pack multiple mouse events into -// one update sometimes, so we always check all states and look for events - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - case WM_MBUTTONDOWN: - case WM_MBUTTONUP: - case WM_MOUSEMOVE: - case WM_BUTTON4DOWN: - case WM_BUTTON4UP: - { - int temp; - - temp = 0; - - if (wParam & MK_LBUTTON) - temp |= 1; - - if (wParam & MK_RBUTTON) - temp |= 2; - - if (wParam & MK_MBUTTON) - temp |= 4; - - if (wParam & MK_BUTTON4L) - temp |= 8; - - if (wParam & MK_BUTTON4R) - temp |= 16; - - IN_MouseEvent (temp); - } - break; - - case WM_INPUT: - { - UINT rawSize; - if ( GetRawInputData( (HRAWINPUT) lParam, RID_INPUT, NULL, &rawSize, sizeof(RAWINPUTHEADER) ) == -1 ) - break; - - RAWINPUT raw; - if ( GetRawInputData( (HRAWINPUT) lParam, RID_INPUT, &raw, &rawSize, sizeof(RAWINPUTHEADER) ) != rawSize ) - break; - - if ( ( raw.header.dwType != RIM_TYPEMOUSE ) || ( raw.data.mouse.usFlags != MOUSE_MOVE_RELATIVE ) ) - break; - - int xPosRelative = raw.data.mouse.lLastX; - int yPosRelative = raw.data.mouse.lLastY; - IN_RawMouseEvent( xPosRelative, yPosRelative ); - } - break; - - case WM_SYSCOMMAND: - if ( (wParam&0xFFF0) == SC_SCREENSAVE || (wParam&0xFFF0) == SC_MONITORPOWER || (wParam&0xFFF0) == SC_KEYMENU ) - { - return 0; - } - break; - - case WM_SYSKEYDOWN: - if ( wParam == VK_RETURN ) - { - if ( cl_allowAltEnter && cl_allowAltEnter->integer ) - { - Cvar_SetValue( "r_fullscreen", !Cvar_VariableIntegerValue("r_fullscreen") ); - Cbuf_AddText( "vid_restart\n" ); - } - return 0; - } - // fall through - case WM_KEYDOWN: - code = MapKey( lParam, wParam ); - if(code) - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, code, qtrue, 0, NULL ); - } - break; - - case WM_SYSKEYUP: - case WM_KEYUP: - code = MapKey( lParam, wParam ); - if(code) - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, code, qfalse, 0, NULL ); - } - break; - - case WM_CHAR: - if(((lParam >> 16) & 0xff) != CONSOLE_SCAN_CODE) - { - Sys_QueEvent( g_wv.sysMsgTime, SE_CHAR, wParam, 0, 0, NULL ); - } - // Output any debug prints -// if(in_debug && in_debug->integer & 2) -// { -// Com_Printf("WM_CHAR: %x\n", wParam); -// } - break; - - case WM_POWERBROADCAST: - if (wParam == PBT_APMQUERYSUSPEND) - { -#ifndef FINAL_BUILD - Com_Printf("Cannot go into hibernate / standby mode while game is running!\n"); -#endif - return BROADCAST_QUERY_DENY; - } - break; - } - - return DefWindowProc( hWnd, uMsg, wParam, lParam ); -} - From 1d8cc26dcb589841ed8128817ab33940c50e129a Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sat, 27 Aug 2016 00:08:43 +0100 Subject: [PATCH 309/445] MP: Fix crash when setting skin on invalid model Fix a crash when setting a skin in an invalid model. This situation can arise when a menu attempts to change the model and the skin in the same script, but when the skin change is applied before the model change. --- codemp/client/cl_uiapi.cpp | 290 +++++++++++++++++++++++++++++++++-- codemp/rd-vanilla/G2_API.cpp | 8 +- 2 files changed, 282 insertions(+), 16 deletions(-) diff --git a/codemp/client/cl_uiapi.cpp b/codemp/client/cl_uiapi.cpp index 1389707166..56fb6160e5 100644 --- a/codemp/client/cl_uiapi.cpp +++ b/codemp/client/cl_uiapi.cpp @@ -237,36 +237,68 @@ static void CL_R_ShaderNameFromIndex( char *name, int index ) { } static void CL_G2API_ListModelSurfaces( void *ghlInfo ) { + if ( !ghlInfo ) { + return; + } + re->G2API_ListSurfaces( (CGhoul2Info *)ghlInfo ); } static void CL_G2API_ListModelBones( void *ghlInfo, int frame ) { + if ( !ghlInfo ) { + return; + } + re->G2API_ListBones( (CGhoul2Info *)ghlInfo, frame ); } static void CL_G2API_SetGhoul2ModelIndexes( void *ghoul2, qhandle_t *modelList, qhandle_t *skinList ) { + if ( !ghoul2 ) { + return; + } + re->G2API_SetGhoul2ModelIndexes( *((CGhoul2Info_v *)ghoul2), modelList, skinList ); } static qboolean CL_G2API_HaveWeGhoul2Models( void *ghoul2) { + if ( !ghoul2 ) { + return qfalse; + } + return re->G2API_HaveWeGhoul2Models( *((CGhoul2Info_v *)ghoul2) ); } static qboolean CL_G2API_GetBoltMatrix( void *ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix, const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale ) { + if ( !ghoul2 ) { + return qfalse; + + } return re->G2API_GetBoltMatrix( *((CGhoul2Info_v *)ghoul2), modelIndex, boltIndex, matrix, angles, position, frameNum, modelList, scale ); } static qboolean CL_G2API_GetBoltMatrix_NoReconstruct( void *ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix, const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale ) { + if ( !ghoul2 ) { + return qfalse; + } + re->G2API_BoltMatrixReconstruction( qfalse ); return re->G2API_GetBoltMatrix( *((CGhoul2Info_v *)ghoul2), modelIndex, boltIndex, matrix, angles, position, frameNum, modelList, scale ); } static qboolean CL_G2API_GetBoltMatrix_NoRecNoRot( void *ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix, const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale ) { + if ( !ghoul2 ) { + return qfalse; + } + re->G2API_BoltMatrixSPMethod( qtrue ); return re->G2API_GetBoltMatrix( *((CGhoul2Info_v *)ghoul2), modelIndex, boltIndex, matrix, angles, position, frameNum, modelList, scale ); } static int CL_G2API_InitGhoul2Model( void **ghoul2Ptr, const char *fileName, int modelIndex, qhandle_t customSkin, qhandle_t customShader, int modelFlags, int lodBias ) { + if ( !ghoul2Ptr ) { + return 0; + } + #ifdef _FULL_G2_LEAK_CHECKING g_G2AllocServer = 0; #endif @@ -274,60 +306,242 @@ static int CL_G2API_InitGhoul2Model( void **ghoul2Ptr, const char *fileName, int } static qboolean CL_G2API_SetSkin( void *ghoul2, int modelIndex, qhandle_t customSkin, qhandle_t renderSkin ) { + if ( !ghoul2 ) { + return qfalse; + } + CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2); return re->G2API_SetSkin( g2, modelIndex, customSkin, renderSkin ); } -static void CL_G2API_CollisionDetect( CollisionRecord_t *collRecMap, void* ghoul2, const vec3_t angles, const vec3_t position, int frameNumber, int entNum, vec3_t rayStart, vec3_t rayEnd, vec3_t scale, int traceFlags, int useLod, float fRadius ) { - re->G2API_CollisionDetect( collRecMap, *((CGhoul2Info_v *)ghoul2), angles, position, frameNumber, entNum, rayStart, rayEnd, scale, G2VertSpaceClient, traceFlags, useLod, fRadius ); +static void CL_G2API_CollisionDetect( + CollisionRecord_t *collRecMap, + void* ghoul2, + const vec3_t angles, + const vec3_t position, + int frameNumber, + int entNum, + vec3_t rayStart, + vec3_t rayEnd, + vec3_t scale, + int traceFlags, + int useLod, + float fRadius ) +{ + if ( !ghoul2 ) { + return; + } + + re->G2API_CollisionDetect( + collRecMap, + *((CGhoul2Info_v *)ghoul2), + angles, + position, + frameNumber, + entNum, + rayStart, + rayEnd, + scale, + G2VertSpaceClient, + traceFlags, + useLod, + fRadius); } -static void CL_G2API_CollisionDetectCache( CollisionRecord_t *collRecMap, void* ghoul2, const vec3_t angles, const vec3_t position, int frameNumber, int entNum, vec3_t rayStart, vec3_t rayEnd, vec3_t scale, int traceFlags, int useLod, float fRadius ) { - re->G2API_CollisionDetectCache( collRecMap, *((CGhoul2Info_v *)ghoul2), angles, position, frameNumber, entNum, rayStart, rayEnd, scale, G2VertSpaceClient, traceFlags, useLod, fRadius ); +static void CL_G2API_CollisionDetectCache( + CollisionRecord_t *collRecMap, + void* ghoul2, + const vec3_t angles, + const vec3_t position, + int frameNumber, + int entNum, + vec3_t rayStart, + vec3_t rayEnd, + vec3_t scale, + int traceFlags, + int useLod, + float fRadius) +{ + if ( !ghoul2 ) { + return; + } + + re->G2API_CollisionDetectCache( + collRecMap, + *((CGhoul2Info_v *)ghoul2), + angles, + position, + frameNumber, + entNum, + rayStart, + rayEnd, + scale, + G2VertSpaceClient, + traceFlags, + useLod, + fRadius); } static void CL_G2API_CleanGhoul2Models( void **ghoul2Ptr ) { + if ( !ghoul2Ptr ) { + return; + } + #ifdef _FULL_G2_LEAK_CHECKING g_G2AllocServer = 0; #endif re->G2API_CleanGhoul2Models( (CGhoul2Info_v **)ghoul2Ptr ); } -static qboolean CL_G2API_SetBoneAngles( void *ghoul2, int modelIndex, const char *boneName, const vec3_t angles, const int flags, const int up, const int right, const int forward, qhandle_t *modelList, int blendTime , int currentTime ) { - return re->G2API_SetBoneAngles( *((CGhoul2Info_v *)ghoul2), modelIndex, boneName, angles, flags, (const Eorientations)up, (const Eorientations)right, (const Eorientations)forward, modelList, blendTime , currentTime ); +static qboolean CL_G2API_SetBoneAngles( + void *ghoul2, + int modelIndex, + const char *boneName, + const vec3_t angles, + const int flags, + const int up, + const int right, + const int forward, + qhandle_t *modelList, + int blendTime , + int currentTime) +{ + if ( !ghoul2 ) { + return qfalse; + } + + return re->G2API_SetBoneAngles( + *((CGhoul2Info_v *)ghoul2), + modelIndex, + boneName, + angles, + flags, + (const Eorientations)up, + (const Eorientations)right, + (const Eorientations)forward, + modelList, + blendTime, + currentTime); } -static qboolean CL_G2API_SetBoneAnim( void *ghoul2, const int modelIndex, const char *boneName, const int startFrame, const int endFrame, const int flags, const float animSpeed, const int currentTime, const float setFrame, const int blendTime ) { - return re->G2API_SetBoneAnim( *((CGhoul2Info_v *)ghoul2), modelIndex, boneName, startFrame, endFrame, flags, animSpeed, currentTime, setFrame, blendTime ); +static qboolean CL_G2API_SetBoneAnim( + void *ghoul2, + const int modelIndex, + const char *boneName, + const int startFrame, + const int endFrame, + const int flags, + const float animSpeed, + const int currentTime, + const float setFrame, + const int blendTime) +{ + if ( !ghoul2 ) { + return qfalse; + } + + return re->G2API_SetBoneAnim( + *((CGhoul2Info_v *)ghoul2), + modelIndex, + boneName, + startFrame, + endFrame, + flags, + animSpeed, + currentTime, + setFrame, + blendTime); } -static qboolean CL_G2API_GetBoneAnim( void *ghoul2, const char *boneName, const int currentTime, float *currentFrame, int *startFrame, int *endFrame, int *flags, float *animSpeed, int *modelList, const int modelIndex ) { +static qboolean CL_G2API_GetBoneAnim( + void *ghoul2, + const char *boneName, + const int currentTime, + float *currentFrame, + int *startFrame, + int *endFrame, + int *flags, + float *animSpeed, + int *modelList, + const int modelIndex) +{ + if ( !ghoul2 ) { + return qfalse; + } + CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2); - return re->G2API_GetBoneAnim( g2, modelIndex, boneName, currentTime, currentFrame, startFrame, endFrame, flags, animSpeed, modelList ); + return re->G2API_GetBoneAnim( + g2, + modelIndex, + boneName, + currentTime, + currentFrame, + startFrame, + endFrame, + flags, + animSpeed, + modelList); } -static qboolean CL_G2API_GetBoneFrame( void *ghoul2, const char *boneName, const int currentTime, float *currentFrame, int *modelList, const int modelIndex ) { +static qboolean CL_G2API_GetBoneFrame( + void *ghoul2, + const char *boneName, + const int currentTime, + float *currentFrame, + int *modelList, + const int modelIndex) +{ + if ( !ghoul2 ) { + return qfalse; + } + CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2); int iDontCare1 = 0, iDontCare2 = 0, iDontCare3 = 0; float fDontCare1 = 0; - return re->G2API_GetBoneAnim(g2, modelIndex, boneName, currentTime, currentFrame, &iDontCare1, &iDontCare2, &iDontCare3, &fDontCare1, modelList); + return re->G2API_GetBoneAnim( + g2, + modelIndex, + boneName, + currentTime, + currentFrame, + &iDontCare1, + &iDontCare2, + &iDontCare3, + &fDontCare1, + modelList); } static void CL_G2API_GetGLAName( void *ghoul2, int modelIndex, char *fillBuf ) { + if ( !ghoul2 ) { + return; + } + char *tmp = re->G2API_GetGLAName( *((CGhoul2Info_v *)ghoul2), modelIndex ); strcpy( fillBuf, tmp ); } static int CL_G2API_CopyGhoul2Instance( void *g2From, void *g2To, int modelIndex ) { + if ( !g2From || !g2To ) { + return 0; + } + return re->G2API_CopyGhoul2Instance( *((CGhoul2Info_v *)g2From), *((CGhoul2Info_v *)g2To), modelIndex ); } static void CL_G2API_CopySpecificGhoul2Model( void *g2From, int modelFrom, void *g2To, int modelTo ) { + if ( !g2From || !g2To ) { + return; + } + re->G2API_CopySpecificG2Model( *((CGhoul2Info_v *)g2From), modelFrom, *((CGhoul2Info_v *)g2To), modelTo ); } static void CL_G2API_DuplicateGhoul2Instance( void *g2From, void **g2To ) { + if ( !g2From || !g2To ) { + return; + } + #ifdef _FULL_G2_LEAK_CHECKING g_G2AllocServer = 0; #endif @@ -335,10 +549,18 @@ static void CL_G2API_DuplicateGhoul2Instance( void *g2From, void **g2To ) { } static qboolean CL_G2API_HasGhoul2ModelOnIndex( void *ghlInfo, int modelIndex ) { + if ( !ghlInfo ) { + return qfalse; + } + return re->G2API_HasGhoul2ModelOnIndex( (CGhoul2Info_v **)ghlInfo, modelIndex ); } static qboolean CL_G2API_RemoveGhoul2Model( void *ghlInfo, int modelIndex ) { + if ( !ghlInfo ) { + return qfalse; + } + #ifdef _FULL_G2_LEAK_CHECKING g_G2AllocServer = 0; #endif @@ -346,22 +568,42 @@ static qboolean CL_G2API_RemoveGhoul2Model( void *ghlInfo, int modelIndex ) { } static int CL_G2API_AddBolt( void *ghoul2, int modelIndex, const char *boneName ) { + if ( !ghoul2 ) { + return -1; + } + return re->G2API_AddBolt( *((CGhoul2Info_v *)ghoul2), modelIndex, boneName ); } static void CL_G2API_SetBoltInfo( void *ghoul2, int modelIndex, int boltInfo ) { + if ( !ghoul2 ) { + return; + } + re->G2API_SetBoltInfo( *((CGhoul2Info_v *)ghoul2), modelIndex, boltInfo ); } static qboolean CL_G2API_SetRootSurface( void *ghoul2, const int modelIndex, const char *surfaceName ) { + if ( !ghoul2 ) { + return qfalse; + } + return re->G2API_SetRootSurface( *((CGhoul2Info_v *)ghoul2), modelIndex, surfaceName ); } static qboolean CL_G2API_SetSurfaceOnOff( void *ghoul2, const char *surfaceName, const int flags ) { + if ( !ghoul2 ) { + return qfalse; + } + return re->G2API_SetSurfaceOnOff( *((CGhoul2Info_v *)ghoul2), surfaceName, flags ); } static qboolean CL_G2API_SetNewOrigin( void *ghoul2, const int boltIndex ) { + if ( !ghoul2 ) { + return qfalse; + } + return re->G2API_SetNewOrigin( *((CGhoul2Info_v *)ghoul2), boltIndex ); } @@ -374,6 +616,10 @@ static void CL_G2API_SetTime( int time, int clock ) { } static void CL_G2API_SetRagDoll( void *ghoul2, sharedRagDollParams_t *params ) { + if ( !ghoul2 ) { + return; + } + CRagDollParams rdParams; if ( !params ) { @@ -404,6 +650,10 @@ static void CL_G2API_SetRagDoll( void *ghoul2, sharedRagDollParams_t *params ) { } static void CL_G2API_AnimateG2Models( void *ghoul2, int time, sharedRagDollUpdateParams_t *params ) { + if ( !ghoul2 ) { + return; + } + CRagDollUpdateParams rduParams; if ( !params ) @@ -421,20 +671,36 @@ static void CL_G2API_AnimateG2Models( void *ghoul2, int time, sharedRagDollUpdat } static qboolean CL_G2API_SetBoneIKState( void *ghoul2, int time, const char *boneName, int ikState, sharedSetBoneIKStateParams_t *params ) { + if ( !ghoul2 ) { + return qfalse; + } + return re->G2API_SetBoneIKState( *((CGhoul2Info_v *)ghoul2), time, boneName, ikState, params ); } static qboolean CL_G2API_IKMove( void *ghoul2, int time, sharedIKMoveParams_t *params ) { + if ( !ghoul2 ) { + return qfalse; + } + return re->G2API_IKMove( *((CGhoul2Info_v *)ghoul2), time, params ); } static void CL_G2API_GetSurfaceName( void *ghoul2, int surfNumber, int modelIndex, char *fillBuf ) { + if ( !ghoul2 ) { + return; + } + CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2); char *tmp = re->G2API_GetSurfaceName( g2, modelIndex, surfNumber ); strcpy( fillBuf, tmp ); } static qboolean CL_G2API_AttachG2Model( void *ghoul2From, int modelIndexFrom, void *ghoul2To, int toBoltIndex, int toModel ) { + if ( !ghoul2From || !ghoul2To ) { + return qfalse; + } + CGhoul2Info_v *g2From = ((CGhoul2Info_v *)ghoul2From); CGhoul2Info_v *g2To = ((CGhoul2Info_v *)ghoul2To); diff --git a/codemp/rd-vanilla/G2_API.cpp b/codemp/rd-vanilla/G2_API.cpp index 9ea0ef98c5..31ba96cd7d 100644 --- a/codemp/rd-vanilla/G2_API.cpp +++ b/codemp/rd-vanilla/G2_API.cpp @@ -865,7 +865,7 @@ int G2API_InitGhoul2Model(CGhoul2Info_v **ghoul2Ptr, const char *fileName, int m qboolean G2API_SetLodBias(CGhoul2Info *ghlInfo, int lodBias) { - if (ghlInfo) + if (G2_SetupModelPointers(ghlInfo)) { ghlInfo->mLodBias = lodBias; return qtrue; @@ -878,7 +878,7 @@ qboolean G2API_SetSkin(CGhoul2Info_v& ghoul2, int modelIndex, qhandle_t customSk { CGhoul2Info *ghlInfo = &ghoul2[modelIndex]; - if (ghlInfo) + if (G2_SetupModelPointers(ghlInfo)) { ghlInfo->mCustomSkin = customSkin; if (renderSkin) @@ -893,7 +893,7 @@ qboolean G2API_SetSkin(CGhoul2Info_v& ghoul2, int modelIndex, qhandle_t customSk qboolean G2API_SetShader(CGhoul2Info *ghlInfo, qhandle_t customShader) { - if (ghlInfo) + if (G2_SetupModelPointers(ghlInfo)) { ghlInfo->mCustomShader = customShader; return qtrue; @@ -921,7 +921,7 @@ qboolean G2API_SetSurfaceOnOff(CGhoul2Info_v &ghoul2, const char *surfaceName, c int G2API_GetSurfaceOnOff(CGhoul2Info *ghlInfo, const char *surfaceName) { - if (ghlInfo) + if (G2_SetupModelPointers(ghlInfo)) { return G2_IsSurfaceOff(ghlInfo, ghlInfo->mSlist, surfaceName); } From 26343fe6204cdbaa4ad2d6b4201948c9e2d11bf4 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sat, 27 Aug 2016 00:11:17 +0100 Subject: [PATCH 310/445] SP: Check CGhoul2Info pointer more thoroughly --- code/rd-vanilla/G2_API.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/rd-vanilla/G2_API.cpp b/code/rd-vanilla/G2_API.cpp index c5394c33ba..1fddbfaa99 100644 --- a/code/rd-vanilla/G2_API.cpp +++ b/code/rd-vanilla/G2_API.cpp @@ -827,7 +827,7 @@ int G2API_InitGhoul2Model(CGhoul2Info_v &ghoul2, const char *fileName, int, qhan qboolean G2API_SetLodBias(CGhoul2Info *ghlInfo, int lodBias) { G2ERROR(ghlInfo,"NULL ghlInfo"); - if (ghlInfo) + if (G2_SetupModelPointers(ghlInfo)) { ghlInfo->mLodBias = lodBias; return qtrue; @@ -839,14 +839,14 @@ qboolean G2API_SetSkin(CGhoul2Info *ghlInfo, qhandle_t customSkin, qhandle_t ren { G2ERROR(ghlInfo,"NULL ghlInfo"); #ifdef JK2_MODE - if (ghlInfo) + if (G2_SetupModelPointers(ghlInfo)) { ghlInfo->mCustomSkin = customSkin; return qtrue; } return qfalse; #else - if (ghlInfo) + if (G2_SetupModelPointers(ghlInfo)) { ghlInfo->mCustomSkin = customSkin; if (renderSkin) @@ -863,7 +863,7 @@ extern void G2API_SetSurfaceOnOffFromSkin (CGhoul2Info *ghlInfo, qhandle_t rende qboolean G2API_SetShader(CGhoul2Info *ghlInfo, qhandle_t customShader) { G2ERROR(ghlInfo,"NULL ghlInfo"); - if (ghlInfo) + if (G2_SetupModelPointers(ghlInfo)) { ghlInfo->mCustomShader = customShader; return qtrue; From 3dfb4db41efe4eba0755c59eafa4b71782249540 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sat, 27 Aug 2016 11:22:23 +0100 Subject: [PATCH 311/445] MP: Don't load skin file multiple times --- codemp/rd-vanilla/tr_skin.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/codemp/rd-vanilla/tr_skin.cpp b/codemp/rd-vanilla/tr_skin.cpp index f54e8beaa7..b2d0e443ce 100644 --- a/codemp/rd-vanilla/tr_skin.cpp +++ b/codemp/rd-vanilla/tr_skin.cpp @@ -234,13 +234,14 @@ qhandle_t RE_RegisterSkin( const char *name ) { if ( RE_SplitSkins(name, (char*)&skinhead, (char*)&skintorso, (char*)&skinlower ) ) {//three part hSkin = RE_RegisterIndividualSkin(skinhead, hSkin); - if (hSkin) + if (hSkin && strcmp(skinhead, skintorso)) { hSkin = RE_RegisterIndividualSkin(skintorso, hSkin); - if (hSkin) - { - hSkin = RE_RegisterIndividualSkin(skinlower, hSkin); - } + } + + if (hSkin && strcmp(skinhead, skinlower) && strcmp(skintorso, skinlower)) + { + hSkin = RE_RegisterIndividualSkin(skinlower, hSkin); } } else From c84c0e48dce84485f318acd226b967419a8eae88 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sat, 27 Aug 2016 11:23:36 +0100 Subject: [PATCH 312/445] SP: Don't load skin file multiple times --- code/rd-vanilla/tr_skin.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/code/rd-vanilla/tr_skin.cpp b/code/rd-vanilla/tr_skin.cpp index 92dbff92f5..48e474a881 100644 --- a/code/rd-vanilla/tr_skin.cpp +++ b/code/rd-vanilla/tr_skin.cpp @@ -413,13 +413,14 @@ qhandle_t RE_RegisterSkin( const char *name) { if ( RE_SplitSkins(name, (char*)&skinhead, (char*)&skintorso, (char*)&skinlower ) ) {//three part hSkin = RE_RegisterIndividualSkin(skinhead, hSkin); - if (hSkin) + if (hSkin && strcmp(skinhead, skintorso)) { hSkin = RE_RegisterIndividualSkin(skintorso, hSkin); - if (hSkin) - { - hSkin = RE_RegisterIndividualSkin(skinlower, hSkin); - } + } + + if (hSkin && strcmp(skinhead, skinlower) && strcmp(skintorso, skinlower)) + { + hSkin = RE_RegisterIndividualSkin(skinlower, hSkin); } } else From 9915a6cafc0a14ecf447cbc7214d4f7e34d8e886 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sat, 27 Aug 2016 13:26:52 +0100 Subject: [PATCH 313/445] Shared: Fix #831 - footstep rotation incorrect The improved version of RotatePointAroundVector caused the vector to be rotated the opposite direction compared to the original version. This meant that footsteps would be correct at 0 and 180 degrees, but would be rotated the wrong way for any other angle. --- shared/qcommon/q_math.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/qcommon/q_math.c b/shared/qcommon/q_math.c index 94a50a7c18..7401bb6d09 100644 --- a/shared/qcommon/q_math.c +++ b/shared/qcommon/q_math.c @@ -577,7 +577,7 @@ void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float m[3][3]; float c, s, t; - degrees = DEG2RAD( degrees ); + degrees = -DEG2RAD( degrees ); s = sinf( degrees ); c = cosf( degrees ); t = 1 - c; From 91336ebfe751e75cf35ca335befff5bb1b731c4f Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sat, 27 Aug 2016 18:22:54 +0100 Subject: [PATCH 314/445] MP: Increase num dirs handled for player species This commit increases the directory list buffer when scanning models/ subfolders, from 2kb to 16kb. --- codemp/ui/ui_main.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/codemp/ui/ui_main.c b/codemp/ui/ui_main.c index 6d9515a96c..a9888d57e7 100644 --- a/codemp/ui/ui_main.c +++ b/codemp/ui/ui_main.c @@ -9633,8 +9633,10 @@ UI_BuildPlayerModel_List */ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) { + static const size_t DIR_LIST_SIZE = 16384; + int numdirs; - char dirlist[2048]; + char *dirlist = malloc(DIR_LIST_SIZE); char* dirptr; int dirlen; int i; @@ -9646,15 +9648,14 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) uiInfo.playerSpecies = (playerSpeciesInfo_t *)malloc(uiInfo.playerSpeciesMax * sizeof(playerSpeciesInfo_t)); // iterate directory of all player models - numdirs = trap->FS_GetFileList("models/players", "/", dirlist, 2048 ); + numdirs = trap->FS_GetFileList("models/players", "/", dirlist, DIR_LIST_SIZE ); dirptr = dirlist; for (i=0; iFS_Open(fpath, &f, FS_READ); if (f) { + char filelist[2048]; playerSpeciesInfo_t *species; char skinname[64]; int numfiles; @@ -9718,7 +9720,7 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) free(buffer); - numfiles = trap->FS_GetFileList( va("models/players/%s",dirptr), ".skin", filelist, 2048 ); + numfiles = trap->FS_GetFileList( va("models/players/%s",dirptr), ".skin", filelist, sizeof(filelist) ); fileptr = filelist; for (j=0; j Date: Sat, 27 Aug 2016 19:22:15 +0100 Subject: [PATCH 315/445] MP: Add error checking if malloc fails --- codemp/ui/ui_main.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/codemp/ui/ui_main.c b/codemp/ui/ui_main.c index a9888d57e7..862da52301 100644 --- a/codemp/ui/ui_main.c +++ b/codemp/ui/ui_main.c @@ -9636,19 +9636,32 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) static const size_t DIR_LIST_SIZE = 16384; int numdirs; - char *dirlist = malloc(DIR_LIST_SIZE); + size_t dirListSize = DIR_LIST_SIZE; + char stackDirList[8192]; + char *dirlist; char* dirptr; int dirlen; int i; int j; + dirlist = malloc(DIR_LIST_SIZE); + if ( !dirlist ) + { + Com_Printf(S_COLOR_YELLOW "WARNING: Failed to allocate %u bytes of memory for player model " + "directory list. Using stack allocated buffer of %u bytes instead.", + DIR_LIST_SIZE, sizeof(stackDirList)); + + dirlist = stackDirList; + dirListSize = sizeof(stackDirList); + } + uiInfo.playerSpeciesCount = 0; uiInfo.playerSpeciesIndex = 0; uiInfo.playerSpeciesMax = 8; uiInfo.playerSpecies = (playerSpeciesInfo_t *)malloc(uiInfo.playerSpeciesMax * sizeof(playerSpeciesInfo_t)); // iterate directory of all player models - numdirs = trap->FS_GetFileList("models/players", "/", dirlist, DIR_LIST_SIZE ); + numdirs = trap->FS_GetFileList("models/players", "/", dirlist, dirListSize ); dirptr = dirlist; for (i=0; i Date: Sat, 27 Aug 2016 19:25:18 +0100 Subject: [PATCH 316/445] SP: Increase dir list buffer for player model list This commit increases the directory list buffer when scanning models/ subfolders, from 2kb to 16kb. In the event that the memory could not be allocated for the buffer, it will fall back to using a stack allocated 8kb buffer. --- code/ui/ui_main.cpp | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 67c01e0bcb..c7cc23df72 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -2364,28 +2364,42 @@ PlayerModel_BuildList */ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) { + static const size_t DIR_LIST_SIZE = 16384; + int numdirs; - char dirlist[2048]; + size_t dirListSize = DIR_LIST_SIZE; + char stackDirList[8192]; + char *dirlist; char* dirptr; int dirlen; int i; const int building = Cvar_VariableIntegerValue("com_buildscript"); + dirlist = (char *)malloc(DIR_LIST_SIZE); + if ( !dirlist ) + { + Com_Printf(S_COLOR_YELLOW "WARNING: Failed to allocate %u bytes of memory for player model " + "directory list. Using stack allocated buffer of %u bytes instead.", + DIR_LIST_SIZE, sizeof(stackDirList)); + + dirlist = stackDirList; + dirListSize = sizeof(stackDirList); + } + uiInfo.playerSpeciesCount = 0; uiInfo.playerSpeciesIndex = 0; uiInfo.playerSpeciesMax = 8; uiInfo.playerSpecies = (playerSpeciesInfo_t *)malloc(uiInfo.playerSpeciesMax * sizeof(playerSpeciesInfo_t)); // iterate directory of all player models - numdirs = ui.FS_GetFileList("models/players", "/", dirlist, 2048 ); + numdirs = ui.FS_GetFileList("models/players", "/", dirlist, dirListSize ); dirptr = dirlist; for (i=0; i buffer(filelen + 1); @@ -2435,7 +2450,7 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) int numfiles; int iSkinParts=0; - numfiles = ui.FS_GetFileList( va("models/players/%s",dirptr), ".skin", filelist, 2048 ); + numfiles = ui.FS_GetFileList( va("models/players/%s",dirptr), ".skin", filelist, sizeof(filelist) ); fileptr = filelist; for (j=0; j Date: Mon, 29 Aug 2016 15:12:07 +0300 Subject: [PATCH 317/445] Remove define --- code/rd-vanilla/G2_misc.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index 069b8ab63c..b1aaad3702 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -1770,15 +1770,10 @@ void *G2_FindSurface(const model_s *mod, int index, int lod) return (void *)current; } -#if 1 + #define SURFACE_SAVE_BLOCK_SIZE sizeof(surfaceInfo_t) #define BOLT_SAVE_BLOCK_SIZE sizeof(boltInfo_t) #define BONE_SAVE_BLOCK_SIZE sizeof(boneInfo_t) -#else -const auto SURFACE_SAVE_BLOCK_SIZE = static_cast(sizeof(SgSurfaceInfo)); -const auto BOLT_SAVE_BLOCK_SIZE = static_cast(sizeof(SgBoltInfo)); -const auto BONE_SAVE_BLOCK_SIZE = static_cast(sizeof(SgBoneInfo)); -#endif void G2_SaveGhoul2Models( From 5ba419855eb42eee7c5e7a17784fc3bcdc62a37d Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Mon, 29 Aug 2016 16:12:40 +0300 Subject: [PATCH 318/445] SG: Reduce usage of keyword 'auto' to minimum --- code/game/G_Timer.cpp | 4 +- code/game/g_savegame.cpp | 18 +++---- code/icarus/IcarusImplementation.cpp | 8 +-- code/rd-vanilla/G2_misc.cpp | 22 ++++---- code/server/sv_savegame.cpp | 10 ++-- codeJK2/game/g_savegame.cpp | 2 +- codeJK2/icarus/Sequence.cpp | 2 +- codeJK2/icarus/TaskManager.cpp | 2 +- shared/qcommon/ojk_saved_game.cpp | 70 +++++++++++++------------- shared/qcommon/ojk_saved_game_helper.h | 42 ++++++++-------- 10 files changed, 87 insertions(+), 93 deletions(-) diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index 90b5e3ba6e..e7254c766b 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -240,10 +240,10 @@ void TIMER_Load( void ) saved_game.read_chunk( INT_ID('T', 'M', 'I', 'D')); - auto sg_buffer_data = static_cast( + const char* sg_buffer_data = static_cast( saved_game.get_buffer_data()); - const auto sg_buffer_size = saved_game.get_buffer_size(); + const int sg_buffer_size = saved_game.get_buffer_size(); std::uninitialized_copy_n( sg_buffer_data, diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index a6c15b70f1..8a41940b02 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -515,7 +515,7 @@ static void EnumerateFields( { strList.clear(); - auto pbData = reinterpret_cast( + const byte* pbData = reinterpret_cast( src_instance); // enumerate all the fields... @@ -742,7 +742,7 @@ void saberInfoRetail_t::sg_export( //forbid all other styles dst.stylesForbidden = 0; - for (auto styleNum = SS_NONE + 1; styleNum < SS_NUM_SABER_STYLES; ++styleNum) + for (int styleNum = SS_NONE + 1; styleNum < SS_NUM_SABER_STYLES; ++styleNum) { if (styleNum != style) { @@ -768,14 +768,10 @@ static void copy_retail_gclient_to_current( const RetailGClient& src, gclient_t& dst) { - const auto src_pre_size = offsetof(RetailGClient, ps.saber[0]); - - const auto src_post_offset = - offsetof(RetailGClient, ps.dualSabers); - - const auto src_post_size = sizeof(RetailGClient) - src_post_offset; - - const auto dst_post_offset = offsetof(gclient_t, ps.dualSabers); + constexpr size_t src_pre_size = offsetof(RetailGClient, ps.saber[0]); + constexpr size_t src_post_offset = offsetof(RetailGClient, ps.dualSabers); + constexpr size_t src_post_size = sizeof(RetailGClient) - src_post_offset; + constexpr size_t dst_post_offset = offsetof(gclient_t, ps.dualSabers); ::memcpy( reinterpret_cast(&dst), @@ -801,7 +797,7 @@ static void EvaluateFields( byte* pbOriginalRefData, unsigned int ulChid) { - auto& instance = *pbData; + T& instance = *pbData; ojk::SavedGameHelper saved_game( ::gi.saved_game); diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index 2fe169ae32..ad66f77ac5 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -713,10 +713,10 @@ int CIcarus::Load() saved_game.read_chunk( INT_ID('I','S','E','Q')); - auto sg_buffer_data = static_cast( + const unsigned char* sg_buffer_data = static_cast( saved_game.get_buffer_data()); - const auto sg_buffer_size = saved_game.get_buffer_size(); + const int sg_buffer_size = saved_game.get_buffer_size(); std::uninitialized_copy_n( sg_buffer_data, @@ -846,10 +846,10 @@ void CIcarus::BufferRead( void *pDstBuff, unsigned long ulNumBytesToRead ) saved_game.read_chunk( INT_ID('I', 'S', 'E', 'Q')); - auto sg_buffer_data = static_cast( + const unsigned char* sg_buffer_data = static_cast( saved_game.get_buffer_data()); - const auto sg_buffer_size = saved_game.get_buffer_size(); + const int sg_buffer_size = saved_game.get_buffer_size(); std::uninitialized_copy_n( sg_buffer_data, diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index b1aaad3702..5d0b0fa748 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -1807,51 +1807,51 @@ void G2_SaveGhoul2Models( // save out how many ghoul2 models we have - auto model_count = ghoul2.size(); + const int model_count = static_cast(ghoul2.size()); saved_game.write( model_count); - for (decltype(model_count) i = 0; i < model_count; ++i) + for (int i = 0; i < model_count; ++i) { // first save out the ghoul2 details themselves ghoul2[i].sg_export( saved_game); // save out how many surfaces we have - auto surface_count = ghoul2[i].mSlist.size(); + const int surface_count = static_cast(ghoul2[i].mSlist.size()); saved_game.write( surface_count); // now save the all the surface list info - for (decltype(surface_count) x = 0; x < surface_count; ++x) + for (int x = 0; x < surface_count; ++x) { ghoul2[i].mSlist[x].sg_export( saved_game); } // save out how many bones we have - auto bone_count = ghoul2[i].mBlist.size(); + const int bone_count = static_cast(ghoul2[i].mBlist.size()); saved_game.write( bone_count); // now save the all the bone list info - for (decltype(bone_count) x = 0; x < bone_count; ++x) + for (int x = 0; x < bone_count; ++x) { ghoul2[i].mBlist[x].sg_export( saved_game); } // save out how many bolts we have - auto bolt_count = ghoul2[i].mBltlist.size(); + const int bolt_count = static_cast(ghoul2[i].mBltlist.size()); saved_game.write( bolt_count); // lastly save the all the bolt list info - for (decltype(bolt_count) x = 0; x < bolt_count; ++x) + for (int x = 0; x < bolt_count; ++x) { ghoul2[i].mBltlist[x].sg_export( saved_game); @@ -1925,7 +1925,7 @@ void G2_LoadGhoul2Model( } // give us enough surfaces to load up the data - auto surface_count = 0; + int surface_count = 0; saved_game.read( surface_count); @@ -1940,7 +1940,7 @@ void G2_LoadGhoul2Model( } // give us enough bones to load up the data - auto bone_count = 0; + int bone_count = 0; saved_game.read( bone_count); @@ -1956,7 +1956,7 @@ void G2_LoadGhoul2Model( } // give us enough bolts to load up the data - auto bolt_count = 0; + int bolt_count = 0; saved_game.read( bolt_count); diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 8dcedcd538..a92af6fca5 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -749,7 +749,7 @@ int SG_GetSaveGameComment( char* sComment, char* sMapName) { - auto ret = 0; + int ret = 0; auto& saved_game = ojk::SavedGame::get_instance(); @@ -789,7 +789,7 @@ int SG_GetSaveGameComment( // Read timestamp // - auto tFileTime = ::SG_GetTime(0); + time_t tFileTime = ::SG_GetTime(0); if (is_succeed) { @@ -1196,7 +1196,7 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) } ge->WriteLevel(qbAutosave); // always done now, but ent saver only does player if auto - auto is_write_failed = saved_game.is_failed(); + bool is_write_failed = saved_game.is_failed(); saved_game.close(); @@ -1233,7 +1233,7 @@ qboolean SG_ReadSavegame( ojk::SavedGameHelper sgh( &saved_game); - const auto iPrevTestSave = ::sv_testsave->integer; + const int iPrevTestSave = ::sv_testsave->integer; ojk::ScopeGuard scope_guard( [&]() @@ -1297,7 +1297,7 @@ qboolean SG_ReadSavegame( ::SG_ReadCvars(); // read game state - const auto qbAutosave = ::ReadGame(); + const int qbAutosave = ::ReadGame(); ::eSavedGameJustLoaded = (qbAutosave ? eAUTO : eFULL); diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index cd0ee509d0..84569466c3 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -456,7 +456,7 @@ static void EnumerateFields( { strList.clear(); - auto pbData = reinterpret_cast( + byte* pbData = reinterpret_cast( src_instance); // enumerate all the fields... diff --git a/codeJK2/icarus/Sequence.cpp b/codeJK2/icarus/Sequence.cpp index ba43675912..d3d8da50fc 100644 --- a/codeJK2/icarus/Sequence.cpp +++ b/codeJK2/icarus/Sequence.cpp @@ -386,7 +386,7 @@ int CSequence::SaveCommand( CBlock *block ) size); //Save out the raw data - auto raw_data = static_cast(bm->GetData()); + const uint8_t* raw_data = static_cast(bm->GetData()); saved_game.write_chunk( INT_ID('B', 'M', 'E', 'M'), diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index 7a247ba780..f20984b05d 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -1683,7 +1683,7 @@ int CTaskManager::SaveCommand( CBlock *block ) size); //Save out the raw data - auto raw_data = static_cast(bm->GetData()); + const uint8_t* raw_data = static_cast(bm->GetData()); saved_game.write_chunk( INT_ID('B', 'M', 'E', 'M'), diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index ede9b5a256..9b3fda2c36 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -39,7 +39,7 @@ bool SavedGame::open( close(); - const auto file_path = generate_path( + const std::string file_path = generate_path( base_file_name); bool is_succeed = true; @@ -116,7 +116,7 @@ bool SavedGame::create( remove( base_file_name); - const auto file_path = generate_path( + const std::string file_path = generate_path( base_file_name); file_handle_ = ::FS_FOpenFileWrite( @@ -124,7 +124,7 @@ bool SavedGame::create( if (file_handle_ == 0) { - const auto error_message = + const std::string error_message = S_COLOR_RED "Failed to create a saved game file: \"" + file_path + "\"."; @@ -138,7 +138,7 @@ bool SavedGame::create( is_writable_ = true; - const auto sg_version = iSAVEGAME_VERSION; + constexpr int sg_version = iSAVEGAME_VERSION; SavedGameHelper sgsh(this); @@ -192,7 +192,7 @@ bool SavedGame::read_chunk( io_buffer_offset_ = 0; - const auto chunk_id_string = get_chunk_id_string( + const std::string chunk_id_string = get_chunk_id_string( chunk_id); ::Com_DPrintf( @@ -202,7 +202,7 @@ bool SavedGame::read_chunk( uint32_t ulLoadedChid = 0; uint32_t uiLoadedLength = 0; - auto uiLoaded = ::FS_Read( + int uiLoaded = ::FS_Read( &ulLoadedChid, static_cast(sizeof(ulLoadedChid)), file_handle_); @@ -225,7 +225,7 @@ bool SavedGame::read_chunk( { is_failed_ = true; - const auto loaded_chunk_id_string = get_chunk_id_string( + const std::string loaded_chunk_id_string = get_chunk_id_string( ulLoadedChid); error_message_ = @@ -316,7 +316,7 @@ bool SavedGame::read_chunk( // Make sure the checksums match... // - const auto uiCksum = ::Com_BlockChecksum( + const uint32_t uiCksum = ::Com_BlockChecksum( io_buffer_.data(), static_cast(io_buffer_.size())); @@ -394,7 +394,7 @@ bool SavedGame::write_chunk( } - const auto chunk_id_string = get_chunk_id_string( + const std::string chunk_id_string = get_chunk_id_string( chunk_id); ::Com_DPrintf( @@ -406,9 +406,9 @@ bool SavedGame::write_chunk( return true; } - const auto src_size = static_cast(io_buffer_.size()); + const int src_size = static_cast(io_buffer_.size()); - const auto uiCksum = Com_BlockChecksum( + const uint32_t uiCksum = Com_BlockChecksum( io_buffer_.data(), src_size); @@ -417,7 +417,7 @@ bool SavedGame::write_chunk( static_cast(sizeof(chunk_id)), file_handle_); - auto iCompressedLength = -1; + int iCompressedLength = -1; if (::sv_compress_saved_games->integer != 0) { @@ -432,12 +432,12 @@ bool SavedGame::write_chunk( } #ifdef JK2_MODE - const auto uiMagic = get_jo_magic_value(); + const int uiMagic = get_jo_magic_value(); #endif // JK2_MODE if (iCompressedLength > 0) { - const auto iLength = -static_cast(io_buffer_.size()); + const int iLength = -static_cast(io_buffer_.size()); uiSaved += ::FS_Write( &iLength, @@ -500,7 +500,7 @@ bool SavedGame::write_chunk( } else { - const auto iLength = static_cast(io_buffer_.size()); + const uint32_t iLength = static_cast(io_buffer_.size()); uiSaved += ::FS_Write( &iLength, @@ -660,7 +660,7 @@ bool SavedGame::write( return true; } - const auto new_buffer_size = io_buffer_offset_ + src_size; + const size_t new_buffer_size = io_buffer_offset_ + src_size; io_buffer_.resize( new_buffer_size); @@ -714,8 +714,8 @@ bool SavedGame::skip( return true; } - const auto new_offset = io_buffer_offset_ + count; - const auto buffer_size = io_buffer_.size(); + const size_t new_offset = io_buffer_offset_ + count; + const size_t buffer_size = io_buffer_.size(); if (new_offset > buffer_size) { @@ -766,13 +766,13 @@ void SavedGame::rename( const std::string& old_base_file_name, const std::string& new_base_file_name) { - const auto&& old_path = generate_path( + const std::string old_path = generate_path( old_base_file_name); - const auto&& new_path = generate_path( + const std::string new_path = generate_path( new_base_file_name); - const auto rename_result = ::FS_MoveUserGenFile( + const int rename_result = ::FS_MoveUserGenFile( old_path.c_str(), new_path.c_str()); @@ -788,7 +788,7 @@ void SavedGame::rename( void SavedGame::remove( const std::string& base_file_name) { - const auto&& path = generate_path( + const std::string path = generate_path( base_file_name); ::FS_DeleteUserGenFile( @@ -826,17 +826,17 @@ void SavedGame::compress( const Buffer& src_buffer, Buffer& dst_buffer) { - const auto src_size = static_cast(src_buffer.size()); + const int src_size = static_cast(src_buffer.size()); dst_buffer.resize(2 * src_size); - auto src_count = 0; - auto dst_index = 0; + int src_count = 0; + int dst_index = 0; while (src_count < src_size) { - auto src_index = src_count; - auto b = src_buffer[src_index++]; + int src_index = src_count; + uint8_t b = src_buffer[src_index++]; while (src_index < src_size && (src_index - src_count) < 127 && @@ -865,7 +865,7 @@ void SavedGame::compress( dst_buffer[dst_index++] = static_cast(src_count - src_index); - for (auto i = src_count; i < src_index; ++i) + for (int i = src_count; i < src_index; ++i) { dst_buffer[dst_index++] = src_buffer[i]; } @@ -889,14 +889,14 @@ void SavedGame::decompress( const Buffer& src_buffer, Buffer& dst_buffer) { - auto src_index = 0; - auto dst_index = 0; + int src_index = 0; + int dst_index = 0; - auto remain_size = static_cast(dst_buffer.size()); + int remain_size = static_cast(dst_buffer.size()); while (remain_size > 0) { - auto count = static_cast(src_buffer[src_index++]); + int8_t count = static_cast(src_buffer[src_index++]); if (count > 0) { @@ -928,7 +928,7 @@ void SavedGame::decompress( std::string SavedGame::generate_path( const std::string& base_file_name) { - auto normalized_file_name = base_file_name; + std::string normalized_file_name = base_file_name; std::replace( normalized_file_name.begin(), @@ -936,9 +936,7 @@ std::string SavedGame::generate_path( '/', '_'); - auto&& path = "saves/" + normalized_file_name + ".sav"; - - return path; + return "saves/" + normalized_file_name + ".sav"; } std::string SavedGame::get_chunk_id_string( diff --git a/shared/qcommon/ojk_saved_game_helper.h b/shared/qcommon/ojk_saved_game_helper.h index b3c9754e82..00a7997366 100644 --- a/shared/qcommon/ojk_saved_game_helper.h +++ b/shared/qcommon/ojk_saved_game_helper.h @@ -198,7 +198,7 @@ void SavedGameHelper::write_chunk_and_size( { saved_game_->save_buffer(); - auto data_size = saved_game_->get_buffer_size(); + const int data_size = saved_game_->get_buffer_size(); saved_game_->reset_buffer(); @@ -311,7 +311,7 @@ bool SavedGameHelper::try_read( TDst& dst_value, BooleanTag) { - constexpr auto src_size = static_cast(sizeof(TSrc)); + constexpr int src_size = static_cast(sizeof(TSrc)); TSrc src_value; @@ -335,7 +335,7 @@ bool SavedGameHelper::try_read( TDst& dst_value, NumericTag) { - constexpr auto src_size = static_cast(sizeof(TSrc)); + constexpr int src_size = static_cast(sizeof(TSrc)); TSrc src_value; @@ -370,7 +370,7 @@ bool SavedGameHelper::try_read( std::uintptr_t >::type; - auto dst_number = DstNumeric(); + DstNumeric dst_number; if (!try_read( dst_number, @@ -445,26 +445,26 @@ bool SavedGameHelper::try_read( TSrc >::type; - constexpr auto is_src_pure_numeric = + constexpr bool is_src_pure_numeric = std::is_arithmetic::value && (!std::is_same::value) && (!std::is_enum::value); - constexpr auto is_dst_pure_numeric = + constexpr bool is_dst_pure_numeric = std::is_arithmetic::value && (!std::is_same::value) && (!std::is_enum::value); - constexpr auto is_src_float_point = + constexpr bool is_src_float_point = std::is_floating_point::value; - constexpr auto is_dst_float_point = + constexpr bool is_dst_float_point = std::is_floating_point::value; - constexpr auto has_same_size = + constexpr bool has_same_size = (sizeof(Src) == sizeof(TDst)); - constexpr auto use_inplace = + constexpr bool use_inplace = is_src_pure_numeric && is_dst_pure_numeric && ((!is_src_float_point && !is_dst_float_point) || @@ -509,7 +509,7 @@ bool SavedGameHelper::try_read( int dst_count, InplaceTag) { - const auto dst_size = dst_count * static_cast(sizeof(TDst)); + const int dst_size = dst_count * static_cast(sizeof(TDst)); if (!saved_game_->read( dst_values, @@ -604,9 +604,9 @@ void SavedGameHelper::write( const TSrc& src_value, NumericTag) { - constexpr auto dst_size = static_cast(sizeof(TDst)); + constexpr int dst_size = static_cast(sizeof(TDst)); - auto dst_value = static_cast(src_value); + const TDst dst_value = static_cast(src_value); // FIXME Byte order // @@ -627,7 +627,7 @@ void SavedGameHelper::write( std::uintptr_t >::type; - auto dst_number = reinterpret_cast(src_value); + const DstNumeric dst_number = reinterpret_cast(src_value); write( dst_number, @@ -692,26 +692,26 @@ void SavedGameHelper::write( TSrc, TDst>::type; - constexpr auto is_src_pure_numeric = + constexpr bool is_src_pure_numeric = std::is_arithmetic::value && (!std::is_same::value) && (!std::is_enum::value); - constexpr auto is_dst_pure_numeric = + constexpr bool is_dst_pure_numeric = std::is_arithmetic::value && (!std::is_same::value) && (!std::is_enum::value); - constexpr auto is_src_float_point = + constexpr bool is_src_float_point = std::is_floating_point::value; - constexpr auto is_dst_float_point = + constexpr bool is_dst_float_point = std::is_floating_point::value; - constexpr auto has_same_size = + constexpr bool has_same_size = (sizeof(TSrc) == sizeof(Dst)); - constexpr auto use_inplace = + constexpr bool use_inplace = is_src_pure_numeric && is_dst_pure_numeric && ((!is_src_float_point && !is_dst_float_point) || @@ -736,7 +736,7 @@ void SavedGameHelper::write( int src_count, InplaceTag) { - const auto src_size = src_count * static_cast(sizeof(TSrc)); + const int src_size = src_count * static_cast(sizeof(TSrc)); saved_game_->write( src_values, From 9251b66232df84720a38df3212bbfd3b6c7eba85 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Mon, 29 Aug 2016 17:08:29 +0300 Subject: [PATCH 319/445] SG: Replace spaces with tabs --- code/client/cl_main.cpp | 2 +- codeJK2/game/Q3_Interface.cpp | 2 +- codeJK2/icarus/TaskManager.cpp | 2 +- codeJK2/icarus/interface.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/client/cl_main.cpp b/code/client/cl_main.cpp index d8f3891e75..50311130a0 100644 --- a/code/client/cl_main.cpp +++ b/code/client/cl_main.cpp @@ -1181,7 +1181,7 @@ void CL_InitRef( void ) { rit.SV_PointContents = SV_PointContents; - rit.saved_game = &ojk::SavedGame::get_instance(); + rit.saved_game = &ojk::SavedGame::get_instance(); ret = GetRefAPI( REF_API_VERSION, &rit ); diff --git a/codeJK2/game/Q3_Interface.cpp b/codeJK2/game/Q3_Interface.cpp index 7a6a73c9fa..232132942d 100644 --- a/codeJK2/game/Q3_Interface.cpp +++ b/codeJK2/game/Q3_Interface.cpp @@ -9263,7 +9263,7 @@ void Interface_Init( interface_export_t *pe ) //Save / Load functions pe->I_LinkEntity = ICARUS_LinkEntity; - pe->saved_game = gi.saved_game; + pe->saved_game = gi.saved_game; gclient_t *client; client = &level.clients[0]; diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index f20984b05d..2364146574 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -1683,7 +1683,7 @@ int CTaskManager::SaveCommand( CBlock *block ) size); //Save out the raw data - const uint8_t* raw_data = static_cast(bm->GetData()); + const uint8_t* raw_data = static_cast(bm->GetData()); saved_game.write_chunk( INT_ID('B', 'M', 'E', 'M'), diff --git a/codeJK2/icarus/interface.h b/codeJK2/icarus/interface.h index 39cc91567a..8b83fa00fe 100644 --- a/codeJK2/icarus/interface.h +++ b/codeJK2/icarus/interface.h @@ -85,7 +85,7 @@ typedef struct interface_export_s int (*I_ReadSaveData)( unsigned int chid, void *address, int length, void **addressptr/* = NULL */); int (*I_LinkEntity)( int entID, CSequencer *sequencer, CTaskManager *taskManager ); - ojk::ISavedGame* saved_game; + ojk::ISavedGame* saved_game; } interface_export_t; #endif //__INTERFACE__ From 30125a5c2c35b51de083da419650d708befdbed7 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Mon, 29 Aug 2016 19:45:54 +0300 Subject: [PATCH 320/445] SG: Revise read_chunk and write_chunk --- shared/qcommon/ojk_saved_game.cpp | 224 +++++++++++++++--------------- 1 file changed, 112 insertions(+), 112 deletions(-) diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index 9b3fda2c36..8215a5e71f 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -199,34 +199,34 @@ bool SavedGame::read_chunk( "Attempting read of chunk %s\n", chunk_id_string.c_str()); - uint32_t ulLoadedChid = 0; - uint32_t uiLoadedLength = 0; + uint32_t loaded_chunk_id = 0; + uint32_t loaded_data_size = 0; - int uiLoaded = ::FS_Read( - &ulLoadedChid, - static_cast(sizeof(ulLoadedChid)), + int loaded_chunk_size = ::FS_Read( + &loaded_chunk_id, + static_cast(sizeof(loaded_chunk_id)), file_handle_); - uiLoaded += ::FS_Read( - &uiLoadedLength, - static_cast(sizeof(uiLoadedLength)), + loaded_chunk_size += ::FS_Read( + &loaded_data_size, + static_cast(sizeof(loaded_data_size)), file_handle_); - const bool bBlockIsCompressed = (static_cast(uiLoadedLength) < 0); + const bool is_compressed = (static_cast(loaded_data_size) < 0); - if (bBlockIsCompressed) + if (is_compressed) { - uiLoadedLength = -static_cast(uiLoadedLength); + loaded_data_size = -static_cast(loaded_data_size); } // Make sure we are loading the correct chunk... // - if (ulLoadedChid != chunk_id) + if (loaded_chunk_id != chunk_id) { is_failed_ = true; const std::string loaded_chunk_id_string = get_chunk_id_string( - ulLoadedChid); + loaded_chunk_id); error_message_ = "Loaded chunk ID (" + @@ -238,38 +238,38 @@ bool SavedGame::read_chunk( return false; } - uint32_t uiLoadedCksum = 0; + uint32_t loaded_checksum = 0; #ifdef JK2_MODE // Get checksum... // - uiLoaded += ::FS_Read( - &uiLoadedCksum, - static_cast(sizeof(uiLoadedCksum)), + loaded_chunk_size += ::FS_Read( + &loaded_checksum, + static_cast(sizeof(loaded_checksum)), file_handle_); #endif // JK2_MODE // Load in data and magic number... // - uint32_t uiCompressedLength = 0; + uint32_t compressed_size = 0; - if (bBlockIsCompressed) + if (is_compressed) { - uiLoaded += ::FS_Read( - &uiCompressedLength, - static_cast(sizeof(uiCompressedLength)), + loaded_chunk_size += ::FS_Read( + &compressed_size, + static_cast(sizeof(compressed_size)), file_handle_); rle_buffer_.resize( - uiCompressedLength); + compressed_size); - uiLoaded += ::FS_Read( + loaded_chunk_size += ::FS_Read( rle_buffer_.data(), - uiCompressedLength, + compressed_size, file_handle_); io_buffer_.resize( - uiLoadedLength); + loaded_data_size); decompress( rle_buffer_, @@ -278,23 +278,23 @@ bool SavedGame::read_chunk( else { io_buffer_.resize( - uiLoadedLength); + loaded_data_size); - uiLoaded += ::FS_Read( + loaded_chunk_size += ::FS_Read( io_buffer_.data(), - uiLoadedLength, + loaded_data_size, file_handle_); } #ifdef JK2_MODE - uint32_t uiLoadedMagic = 0; + uint32_t loaded_magic_value = 0; - uiLoaded += ::FS_Read( - &uiLoadedMagic, - static_cast(sizeof(uiLoadedMagic)), + loaded_chunk_size += ::FS_Read( + &loaded_magic_value, + static_cast(sizeof(loaded_magic_value)), file_handle_); - if (uiLoadedMagic != get_jo_magic_value()) + if (loaded_magic_value != get_jo_magic_value()) { is_failed_ = true; @@ -303,24 +303,22 @@ bool SavedGame::read_chunk( return false; } -#endif // JK2_MODE - -#ifndef JK2_MODE +#else // Get checksum... // - uiLoaded += ::FS_Read( - &uiLoadedCksum, - static_cast(sizeof(uiLoadedCksum)), + loaded_chunk_size += ::FS_Read( + &loaded_checksum, + static_cast(sizeof(loaded_checksum)), file_handle_); -#endif // !JK2_MODE +#endif // JK2_MODE // Make sure the checksums match... // - const uint32_t uiCksum = ::Com_BlockChecksum( + const uint32_t checksum = ::Com_BlockChecksum( io_buffer_.data(), static_cast(io_buffer_.size())); - if (uiLoadedCksum != uiCksum) + if (loaded_checksum != checksum) { is_failed_ = true; @@ -331,16 +329,18 @@ bool SavedGame::read_chunk( } // Make sure we didn't encounter any read errors... - if (uiLoaded != - sizeof(ulLoadedChid) + - sizeof(uiLoadedLength) + - sizeof(uiLoadedCksum) + - (bBlockIsCompressed ? sizeof(uiCompressedLength) : 0) + - (bBlockIsCompressed ? uiCompressedLength : io_buffer_.size()) + + std::size_t ref_chunk_size = + sizeof(loaded_chunk_id) + + sizeof(loaded_data_size) + + sizeof(loaded_checksum) + + (is_compressed ? sizeof(compressed_size) : 0) + + (is_compressed ? compressed_size : io_buffer_.size()); + #ifdef JK2_MODE - sizeof(uiLoadedMagic) + + ref_chunk_size += sizeof(uiLoadedMagic); #endif - 0) + + if (loaded_chunk_size != ref_chunk_size) { is_failed_ = true; @@ -408,16 +408,16 @@ bool SavedGame::write_chunk( const int src_size = static_cast(io_buffer_.size()); - const uint32_t uiCksum = Com_BlockChecksum( + const uint32_t checksum = Com_BlockChecksum( io_buffer_.data(), src_size); - uint32_t uiSaved = ::FS_Write( + uint32_t saved_chunk_size = ::FS_Write( &chunk_id, static_cast(sizeof(chunk_id)), file_handle_); - int iCompressedLength = -1; + int compressed_size = -1; if (::sv_compress_saved_games->integer != 0) { @@ -427,64 +427,64 @@ bool SavedGame::write_chunk( if (rle_buffer_.size() < io_buffer_.size()) { - iCompressedLength = static_cast(rle_buffer_.size()); + compressed_size = static_cast(rle_buffer_.size()); } } #ifdef JK2_MODE - const int uiMagic = get_jo_magic_value(); + const uint32_t magic_value = get_jo_magic_value(); #endif // JK2_MODE - if (iCompressedLength > 0) + if (compressed_size > 0) { - const int iLength = -static_cast(io_buffer_.size()); + const int size = -static_cast(io_buffer_.size()); - uiSaved += ::FS_Write( - &iLength, - static_cast(sizeof(iLength)), + saved_chunk_size += ::FS_Write( + &size, + static_cast(sizeof(size)), file_handle_); #ifdef JK2_MODE - uiSaved += ::FS_Write( - &uiCksum, - static_cast(sizeof(uiCksum)), + saved_chunk_size += ::FS_Write( + &checksum, + static_cast(sizeof(checksum)), file_handle_); #endif // JK2_MODE - uiSaved += ::FS_Write( - &iCompressedLength, - static_cast(sizeof(iCompressedLength)), + saved_chunk_size += ::FS_Write( + &compressed_size, + static_cast(sizeof(compressed_size)), file_handle_); - uiSaved += ::FS_Write( + saved_chunk_size += ::FS_Write( rle_buffer_.data(), - iCompressedLength, + compressed_size, file_handle_); #ifdef JK2_MODE - uiSaved += ::FS_Write( - &uiMagic, - static_cast(sizeof(uiMagic)), + saved_chunk_size += ::FS_Write( + &magic_value, + static_cast(sizeof(magic_value)), file_handle_); -#endif // JK2_MODE - -#ifndef JK2_MODE - uiSaved += ::FS_Write( - &uiCksum, - static_cast(sizeof(uiCksum)), +#else + saved_chunk_size += ::FS_Write( + &checksum, + static_cast(sizeof(checksum)), file_handle_); -#endif // !JK2_MODE +#endif // JK2_MODE - if (uiSaved != + std::size_t ref_chunk_size = sizeof(chunk_id) + - sizeof(iLength) + - sizeof(uiCksum) + - sizeof(iCompressedLength) + - iCompressedLength + + sizeof(size) + + sizeof(checksum) + + sizeof(compressed_size) + + compressed_size; + #ifdef JK2_MODE - sizeof(uiMagic) + + ref_chunk_size += sizeof(magic_value); #endif // JK2_MODE - 0) + + if (saved_chunk_size != ref_chunk_size) { is_failed_ = true; @@ -500,48 +500,48 @@ bool SavedGame::write_chunk( } else { - const uint32_t iLength = static_cast(io_buffer_.size()); + const uint32_t size = static_cast(io_buffer_.size()); - uiSaved += ::FS_Write( - &iLength, - static_cast(sizeof(iLength)), + saved_chunk_size += ::FS_Write( + &size, + static_cast(sizeof(size)), file_handle_); #ifdef JK2_MODE - uiSaved += ::FS_Write( - &uiCksum, - static_cast(sizeof(uiCksum)), + saved_chunk_size += ::FS_Write( + &checksum, + static_cast(sizeof(checksum)), file_handle_); #endif // JK2_MODE - uiSaved += ::FS_Write( + saved_chunk_size += ::FS_Write( io_buffer_.data(), - iLength, + size, file_handle_); #ifdef JK2_MODE - uiSaved += ::FS_Write( + saved_chunk_size += ::FS_Write( &uiMagic, static_cast(sizeof(uiMagic)), file_handle_); -#endif // JK2_MODE - -#ifndef JK2_MODE - uiSaved += ::FS_Write( - &uiCksum, - static_cast(sizeof(uiCksum)), +#else + saved_chunk_size += ::FS_Write( + &checksum, + static_cast(sizeof(checksum)), file_handle_); -#endif // !JK2_MODE +#endif // JK2_MODE - if (uiSaved != + std::size_t ref_chunk_size = sizeof(chunk_id) + - sizeof(iLength) + - sizeof(uiCksum) + - iLength + + sizeof(size) + + sizeof(checksum) + + size; + #ifdef JK2_MODE - sizeof(uiMagic) + + ref_chunk_size += sizeof(magic_value); #endif // JK2_MODE - 0) + + if (saved_chunk_size != ref_chunk_size) { is_failed_ = true; @@ -660,7 +660,7 @@ bool SavedGame::write( return true; } - const size_t new_buffer_size = io_buffer_offset_ + src_size; + const std::size_t new_buffer_size = io_buffer_offset_ + src_size; io_buffer_.resize( new_buffer_size); @@ -714,8 +714,8 @@ bool SavedGame::skip( return true; } - const size_t new_offset = io_buffer_offset_ + count; - const size_t buffer_size = io_buffer_.size(); + const std::size_t new_offset = io_buffer_offset_ + count; + const std::size_t buffer_size = io_buffer_.size(); if (new_offset > buffer_size) { From aa4a48e0503f509ea76d4af23fab9cc02335fede Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Mon, 29 Aug 2016 20:03:39 +0300 Subject: [PATCH 321/445] SG: Reduce further usage of 'auto' keyword --- code/server/sv_savegame.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index a92af6fca5..7901014644 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -120,7 +120,7 @@ void SG_WipeSavegame( // void SG_Shutdown() { - auto& saved_game = ojk::SavedGame::get_instance(); + ojk::SavedGame& saved_game = ojk::SavedGame::get_instance(); saved_game.close(); @@ -751,7 +751,7 @@ int SG_GetSaveGameComment( { int ret = 0; - auto& saved_game = ojk::SavedGame::get_instance(); + ojk::SavedGame& saved_game = ojk::SavedGame::get_instance(); ojk::SavedGameHelper sgh( &ojk::SavedGame::get_instance()); @@ -987,7 +987,7 @@ qboolean SG_GetSaveImage( return false; } - auto& saved_game = ojk::SavedGame::get_instance(); + ojk::SavedGame& saved_game = ojk::SavedGame::get_instance(); if (!saved_game.open(base_name)) { @@ -1149,7 +1149,7 @@ qboolean SG_WriteSavegame(const char *psPathlessBaseName, qboolean qbAutosave) SG_StoreSaveGameComment(va("--> %s <--",psMapName)); } - auto& saved_game = ojk::SavedGame::get_instance(); + ojk::SavedGame& saved_game = ojk::SavedGame::get_instance(); if(!saved_game.create( "current" )) { @@ -1228,7 +1228,7 @@ qboolean SG_ReadSavegame( "0"); #endif - auto& saved_game = ojk::SavedGame::get_instance(); + ojk::SavedGame& saved_game = ojk::SavedGame::get_instance(); ojk::SavedGameHelper sgh( &saved_game); From 0a70a1022479c841e501ce9e4275fcf0c813fe9e Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Mon, 29 Aug 2016 20:42:06 +0300 Subject: [PATCH 322/445] SG: Fix variable name --- shared/qcommon/ojk_saved_game.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index 8215a5e71f..ae62998597 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -337,7 +337,7 @@ bool SavedGame::read_chunk( (is_compressed ? compressed_size : io_buffer_.size()); #ifdef JK2_MODE - ref_chunk_size += sizeof(uiLoadedMagic); + ref_chunk_size += sizeof(loaded_magic_value); #endif if (loaded_chunk_size != ref_chunk_size) @@ -521,8 +521,8 @@ bool SavedGame::write_chunk( #ifdef JK2_MODE saved_chunk_size += ::FS_Write( - &uiMagic, - static_cast(sizeof(uiMagic)), + &magic_value, + static_cast(sizeof(magic_value)), file_handle_); #else saved_chunk_size += ::FS_Write( From 7c12aae3f082eba9dda282e9d66155e5a853dff8 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Mon, 29 Aug 2016 20:42:59 +0300 Subject: [PATCH 323/445] SG: Uncomment ragdoll --- code/game/ghoul2_shared.h | 2 -- code/rd-vanilla/G2_API.cpp | 10 ---------- code/rd-vanilla/G2_bones.cpp | 8 -------- code/rd-vanilla/tr_ghoul2.cpp | 27 --------------------------- 4 files changed, 47 deletions(-) diff --git a/code/game/ghoul2_shared.h b/code/game/ghoul2_shared.h index 8103eaaf6d..3427e78694 100644 --- a/code/game/ghoul2_shared.h +++ b/code/game/ghoul2_shared.h @@ -127,7 +127,6 @@ struct boneInfo_t int boneBlendStart; // time bone angle blend with normal animation began mdxaBone_t newMatrix; // This is the lerped matrix that Ghoul2 uses on the client side - does not go across the network -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN int lastTimeUpdated; // if non-zero this is all intialized int lastContents; @@ -192,7 +191,6 @@ struct boneInfo_t int airTime; //base is in air, be more quick and sensitive about collisions //rww - RAGDOLL_END -#endif // !JK2_MODE boneInfo_t(): boneNumber(-1), diff --git a/code/rd-vanilla/G2_API.cpp b/code/rd-vanilla/G2_API.cpp index 433ea7b1bf..5e4a63b6ae 100644 --- a/code/rd-vanilla/G2_API.cpp +++ b/code/rd-vanilla/G2_API.cpp @@ -1413,15 +1413,6 @@ qboolean G2API_StopBoneAngles(CGhoul2Info *ghlInfo, const char *boneName) return ret; } -#ifdef JK2_MODE -void G2API_SetRagDoll( - CGhoul2Info_v& ghoul2, - CRagDollParams* parms) -{ - static_cast(ghoul2); - static_cast(parms); -} -#else //rww - RAGDOLL_BEGIN class CRagDollParams; void G2_SetRagDoll(CGhoul2Info_v &ghoul2V,CRagDollParams *parms); @@ -1430,7 +1421,6 @@ void G2API_SetRagDoll(CGhoul2Info_v &ghoul2,CRagDollParams *parms) G2_SetRagDoll(ghoul2,parms); } //rww - RAGDOLL_END -#endif // JK2_MODE qboolean G2API_RemoveBone(CGhoul2Info *ghlInfo, const char *boneName) { diff --git a/code/rd-vanilla/G2_bones.cpp b/code/rd-vanilla/G2_bones.cpp index 8ab9a432cc..053940b817 100644 --- a/code/rd-vanilla/G2_bones.cpp +++ b/code/rd-vanilla/G2_bones.cpp @@ -39,12 +39,10 @@ along with this program; if not, see . #include "../ghoul2/G2.h" #endif -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN #include #include "../ghoul2/ghoul2_gore.h" //rww - RAGDOLL_END -#endif // !JK2_MODE extern cvar_t *r_Ghoul2BlendMultiplier; @@ -96,11 +94,9 @@ int G2_Add_Bone (const model_t *mod, boneInfo_v &blist, const char *boneName) mdxaSkelOffsets_t *offsets; boneInfo_t tempBone; -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN memset(&tempBone, 0, sizeof(tempBone)); //rww - RAGDOLL_END -#endif // !JK2_MODE offsets = (mdxaSkelOffsets_t *)((byte *)mod->mdxa + sizeof(mdxaHeader_t)); @@ -1050,7 +1046,6 @@ qboolean G2_Stop_Bone_Angles(CGhoul2Info *ghlInfo, boneInfo_v &blist, const char return qfalse; } -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN /* @@ -4760,7 +4755,6 @@ qboolean G2_IKMove(CGhoul2Info_v &ghoul2, int time, sharedIKMoveParams_t *params #endif return qtrue; } -#endif // !JK2_MODE // set the bone list to all unused so the bone transformation routine ignores it. void G2_Init_Bone_List(boneInfo_v &blist, int numBones) @@ -4781,7 +4775,6 @@ int G2_Get_Bone_Index(CGhoul2Info *ghoul2, const char *boneName, qboolean bAddIf } } -#ifndef JK2_MODE void G2_FreeRag(void) { if(rag) { @@ -4789,4 +4782,3 @@ void G2_FreeRag(void) rag = NULL; } } -#endif // !JK2_MODE diff --git a/code/rd-vanilla/tr_ghoul2.cpp b/code/rd-vanilla/tr_ghoul2.cpp index cc3cdba753..9dae867d7a 100644 --- a/code/rd-vanilla/tr_ghoul2.cpp +++ b/code/rd-vanilla/tr_ghoul2.cpp @@ -70,11 +70,9 @@ void G2Time_ReportTimers(void) } #endif -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN #include //rww - RAGDOLL_END -#endif // !JK2_MODE extern cvar_t *r_Ghoul2UnSqash; extern cvar_t *r_Ghoul2AnimSmooth; @@ -103,11 +101,9 @@ const static mdxaBone_t identityMatrix = class CTransformBone { public: -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN int touchRender; //rww - RAGDOLL_END -#endif // !JK2_MODE mdxaBone_t boneMatrix; //final matrix int parent; // only set once @@ -116,11 +112,9 @@ class CTransformBone { touch=0; -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN touchRender = 0; //rww - RAGDOLL_END -#endif // !JK2_MODE } }; @@ -165,7 +159,6 @@ class CBoneCache } } -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN void SmoothLow(int index) { @@ -210,7 +203,6 @@ class CBoneCache #endif// _DEBUG } //rww - RAGDOLL_END -#endif // !JK2_MODE public: int frameSize; @@ -232,13 +224,11 @@ class CBoneCache int mCurrentTouch; -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN int mCurrentTouchRender; int mLastTouch; int mLastLastTouch; //rww - RAGDOLL_END -#endif // !JK2_MODE // for render smoothing bool mSmoothingActive; @@ -274,13 +264,10 @@ class CBoneCache } mCurrentTouch=3; -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN mLastTouch=2; mLastLastTouch=1; //rww - RAGDOLL_END -#endif // !JK2_MODE - } ~CBoneCache () { @@ -369,7 +356,6 @@ class CBoneCache return mFinalBones[index].boneMatrix; } -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN const inline mdxaBone_t &EvalRender(int index) { @@ -406,7 +392,6 @@ class CBoneCache return mFinalBones[index].parent; } //rww - RAGDOLL_END -#endif // !JK2_MODE // Added by BTO (VV) - This is probably broken // Need to add in smoothing step? @@ -441,7 +426,6 @@ static inline float G2_GetVertBoneWeightNotSlow( const mdxmVertex_t *pVert, cons return fBoneWeight; } -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN const mdxaHeader_t *G2_GetModA(CGhoul2Info &ghoul2) { @@ -656,7 +640,6 @@ int G2_GetParentBoneMatrixLow(CGhoul2Info &ghoul2,int boneNum,const vec3_t scale return parent; } //rww - RAGDOLL_END -#endif // !JK2_MODE void RemoveBoneCache(CBoneCache *boneCache) { @@ -1215,7 +1198,6 @@ void G2_TimingModel(boneInfo_t &bone,int currentTime,int numFramesInFile,int &cu */ } -#ifndef JK2_MODE //basically construct a seperate skeleton with full hierarchy to store a matrix //off which will give us the desired settling position given the frame in the skeleton //that should be used -rww @@ -1343,7 +1325,6 @@ void G2_RagGetAnimMatrix(CGhoul2Info &ghoul2, const int boneNum, mdxaBone_t &mat matrix = bone.animFrameMatrix; } -#endif // !JK2_MODE // transform each individual bone's information - making sure to use any override information provided, both for angles and for animations, as // well as multiplying each bone's matrix by it's parents matrix @@ -1885,7 +1866,6 @@ void G2_TransformGhoulBones(boneInfo_v &rootBoneList,mdxaBone_t &rootMatrix, CGh float val=r_Ghoul2AnimSmooth->value; if (smooth&&val>0.0f&&val<1.0f) { -#ifndef JK2_MODE ghoul2.mBoneCache->mLastTouch=ghoul2.mBoneCache->mLastLastTouch; if(ghoul2.mFlags & GHOUL2_RAG_STARTED) @@ -1913,7 +1893,6 @@ void G2_TransformGhoulBones(boneInfo_v &rootBoneList,mdxaBone_t &rootMatrix, CGh } } } -#endif // !JK2_MODE ghoul2.mBoneCache->mSmoothFactor=val; ghoul2.mBoneCache->mSmoothingActive=true; @@ -1928,7 +1907,6 @@ void G2_TransformGhoulBones(boneInfo_v &rootBoneList,mdxaBone_t &rootMatrix, CGh } ghoul2.mBoneCache->mCurrentTouch++; -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN if (HackadelicOnClient) { @@ -1940,7 +1918,6 @@ void G2_TransformGhoulBones(boneInfo_v &rootBoneList,mdxaBone_t &rootMatrix, CGh ghoul2.mBoneCache->mCurrentTouchRender=0; } //rww - RAGDOLL_END -#endif // !JK2_MODE // ghoul2.mBoneCache->mWraithID=0; ghoul2.mBoneCache->frameSize = 0;// can be deleted in new G2 format //(int)( &((mdxaFrame_t *)0)->boneIndexes[ ghoul2.aHeader->numBones ] ); @@ -3021,7 +2998,6 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) for ( j = 0; j < numVerts; j++, baseVertex++,v++ ) { #ifdef JK2_MODE - // FIXME BBi bone = &bones->Eval(piBoneReferences[G2_GetVertBoneIndex( v, 0 )]); #else bone = &bones->EvalRender(piBoneReferences[G2_GetVertBoneIndex( v, 0 )]); @@ -3043,7 +3019,6 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) if (iNumWeights==2) { #ifdef JK2_MODE - // FIXME BBi bone2 = &bones->Eval(piBoneReferences[G2_GetVertBoneIndex( v, 1 )]); #else bone2 = &bones->EvalRender(piBoneReferences[G2_GetVertBoneIndex( v, 1 )]); @@ -3077,7 +3052,6 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) for (k=1; k < iNumWeights-1 ; k++) { #ifdef JK2_MODE - // FIXME BBi bone = &bones->Eval(piBoneReferences[G2_GetVertBoneIndex( v, k )]); #else bone = &bones->EvalRender(piBoneReferences[G2_GetVertBoneIndex( v, k )]); @@ -3092,7 +3066,6 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) } #ifdef JK2_MODE - // FIXME BBi bone = &bones->Eval(piBoneReferences[G2_GetVertBoneIndex( v, k )]); #else bone = &bones->EvalRender(piBoneReferences[G2_GetVertBoneIndex( v, k )]); From d500e0912e77be468d07f9e85df16acc7746ff34 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Mon, 29 Aug 2016 20:47:06 +0300 Subject: [PATCH 324/445] SG: Remove renderer header in CMake script --- code/game/CMakeLists.txt | 1 - codeJK2/game/CMakeLists.txt | 1 - 2 files changed, 2 deletions(-) diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 8000d20dad..989e462c76 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -260,7 +260,6 @@ set(SPGameCommonFiles "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" - "${SPDir}/rd-common/mdx_format.h" "${SharedDir}/qcommon/ojk_i_saved_game.h" "${SharedDir}/qcommon/ojk_saved_game_helper.h" "${SharedDir}/qcommon/ojk_saved_game_helper_fwd.h" diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index c56ca0fb63..e610d7ebe7 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -232,7 +232,6 @@ set(JK2SPGameCommonFiles "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SPDir}/qcommon/strippublic.h" - "${SPDir}/rd-common/mdx_format.h" "${SharedDir}/qcommon/ojk_i_saved_game.h" "${SharedDir}/qcommon/ojk_saved_game_helper.h" "${SharedDir}/qcommon/ojk_saved_game_helper_fwd.h" From f60b8e928930f13105c36081ec6e05b49b9deab0 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Mon, 29 Aug 2016 20:54:12 +0300 Subject: [PATCH 325/445] SG: Increase renderer API version --- code/rd-common/tr_public.h | 2 +- codeJK2/game/g_public.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/rd-common/tr_public.h b/code/rd-common/tr_public.h index a978d7d13e..a1553f49d8 100644 --- a/code/rd-common/tr_public.h +++ b/code/rd-common/tr_public.h @@ -30,7 +30,7 @@ along with this program; if not, see . #include "../ghoul2/G2.h" #include "../ghoul2/ghoul2_gore.h" -#define REF_API_VERSION 16 +#define REF_API_VERSION 17 typedef struct { void (QDECL *Printf) ( int printLevel, const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); diff --git a/codeJK2/game/g_public.h b/codeJK2/game/g_public.h index b4384b68b1..e9660e6553 100644 --- a/codeJK2/game/g_public.h +++ b/codeJK2/game/g_public.h @@ -25,7 +25,7 @@ along with this program; if not, see . #define __G_PUBLIC_H__ // g_public.h -- game module information visible to server -#define GAME_API_VERSION 10 // Bumped up to 8, since we support JA's engine now --eez +#define GAME_API_VERSION 10 // entity->svFlags // the server does not know how to interpret most of the values From d490600467755b56bf8a91d22daa1fd0449f7192 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Mon, 29 Aug 2016 21:46:51 +0300 Subject: [PATCH 326/445] SG: Uncomment ragdoll code --- code/rd-vanilla/G2_API.cpp | 84 -------------------------------------- 1 file changed, 84 deletions(-) diff --git a/code/rd-vanilla/G2_API.cpp b/code/rd-vanilla/G2_API.cpp index 5e4a63b6ae..f6ae767940 100644 --- a/code/rd-vanilla/G2_API.cpp +++ b/code/rd-vanilla/G2_API.cpp @@ -41,11 +41,9 @@ along with this program; if not, see . #endif #endif -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN #include "../ghoul2/ghoul2_gore.h" //rww - RAGDOLL_END -#endif // !JK2_MODE extern mdxaBone_t worldMatrix; extern mdxaBone_t worldMatrixInv; @@ -974,12 +972,10 @@ qboolean G2API_RemoveGhoul2Model(CGhoul2Info_v &ghlInfo, const int modelIndex) return qtrue; } -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN #define GHOUL2_RAG_STARTED 0x0010 #define GHOUL2_RAG_FORCESOLVE 0x1000 //api-override, determine if ragdoll should be forced to continue solving even if it thinks it is settled //rww - RAGDOLL_END -#endif // !JK2_MODE int G2API_GetAnimIndex(CGhoul2Info *ghlInfo) { @@ -1022,14 +1018,12 @@ qboolean G2API_SetAnimIndex(CGhoul2Info *ghlInfo, const int index) qboolean G2API_SetBoneAnimIndex(CGhoul2Info *ghlInfo, const int index, const int startFrame, const int endFrame, const int flags, const float animSpeed, const int AcurrentTime, const float setFrame, const int blendTime) { -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN if (ghlInfo && (ghlInfo->mFlags & GHOUL2_RAG_STARTED)) { return qfalse; } //rww - RAGDOLL_END -#endif // !JK2_MODE qboolean ret=qfalse; if (G2_SetupModelPointers(ghlInfo)) @@ -1076,14 +1070,12 @@ qboolean G2API_SetBoneAnimIndex(CGhoul2Info *ghlInfo, const int index, const int qboolean G2API_SetBoneAnim(CGhoul2Info *ghlInfo, const char *boneName, const int startFrame, const int endFrame, const int flags, const float animSpeed, const int AcurrentTime, const float setFrame, const int blendTime) { -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN if (ghlInfo && ghlInfo->mFlags & GHOUL2_RAG_STARTED) { return qfalse; } //rww - RAGDOLL_END -#endif // !JK2_MODE qboolean ret=qfalse; G2ERROR(boneName,"NULL boneName"); @@ -1296,14 +1288,12 @@ qboolean G2API_SetBoneAnglesIndex(CGhoul2Info *ghlInfo, const int index, const v const Eorientations yaw, const Eorientations pitch, const Eorientations roll, qhandle_t *, int blendTime, int AcurrentTime) { -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN if (ghlInfo && ghlInfo->mFlags & GHOUL2_RAG_STARTED) { return qfalse; } //rww - RAGDOLL_END -#endif // !JK2_MODE qboolean ret=qfalse; if (G2_SetupModelPointers(ghlInfo)) @@ -1325,14 +1315,12 @@ qboolean G2API_SetBoneAngles(CGhoul2Info *ghlInfo, const char *boneName, const v const Eorientations up, const Eorientations left, const Eorientations forward, qhandle_t *, int blendTime, int AcurrentTime ) { -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN if (ghlInfo && ghlInfo->mFlags & GHOUL2_RAG_STARTED) { return qfalse; } //rww - RAGDOLL_END -#endif // !JK2_MODE qboolean ret=qfalse; G2ERROR(boneName,"NULL boneName"); @@ -1437,22 +1425,15 @@ qboolean G2API_RemoveBone(CGhoul2Info *ghlInfo, const char *boneName) return ret; } -#ifndef JK2_MODE //rww - RAGDOLL_BEGIN #ifdef _DEBUG extern int ragTraceTime; extern int ragSSCount; extern int ragTraceCount; #endif -#endif // !JK2_MODE void G2API_AnimateG2Models(CGhoul2Info_v &ghoul2, int AcurrentTime,CRagDollUpdateParams *params) { -#ifdef JK2_MODE - static_cast(ghoul2); - static_cast(AcurrentTime); - static_cast(params); -#else int model; int currentTime=G2API_GetTime(AcurrentTime); @@ -1476,11 +1457,9 @@ void G2API_AnimateG2Models(CGhoul2Info_v &ghoul2, int AcurrentTime,CRagDollUpdat // assert(ragTraceTime < 15); //assert(ragTraceCount < 600); #endif -#endif // JK2_MODE } //rww - RAGDOLL_END -#ifndef JK2_MODE int G2_Find_Bone_Rag(CGhoul2Info *ghlInfo, boneInfo_v &blist, const char *boneName); #define RAG_PCJ (0x00001) #define RAG_EFFECTOR (0x00100) @@ -1511,18 +1490,9 @@ static inline boneInfo_t *G2_GetRagBoneConveniently(CGhoul2Info_v &ghoul2, const return bone; } -#endif // !JK2_MODE qboolean G2API_RagPCJConstraint(CGhoul2Info_v &ghoul2, const char *boneName, vec3_t min, vec3_t max) { -#ifdef JK2_MODE - static_cast(ghoul2); - static_cast(boneName); - static_cast(min); - static_cast(max); - - return false; -#else boneInfo_t *bone = G2_GetRagBoneConveniently(ghoul2, boneName); if (!bone) @@ -1539,18 +1509,10 @@ qboolean G2API_RagPCJConstraint(CGhoul2Info_v &ghoul2, const char *boneName, vec VectorCopy(max, bone->maxAngles); return qtrue; -#endif // JK2_MODE } qboolean G2API_RagPCJGradientSpeed(CGhoul2Info_v &ghoul2, const char *boneName, const float speed) { -#ifdef JK2_MODE - static_cast(ghoul2); - static_cast(boneName); - static_cast(speed); - - return false; -#else boneInfo_t *bone = G2_GetRagBoneConveniently(ghoul2, boneName); if (!bone) @@ -1566,18 +1528,10 @@ qboolean G2API_RagPCJGradientSpeed(CGhoul2Info_v &ghoul2, const char *boneName, bone->overGradSpeed = speed; return qtrue; -#endif // JK2_MODE } qboolean G2API_RagEffectorGoal(CGhoul2Info_v &ghoul2, const char *boneName, vec3_t pos) { -#ifdef JK2_MODE - static_cast(ghoul2); - static_cast(boneName); - static_cast(pos); - - return false; -#else boneInfo_t *bone = G2_GetRagBoneConveniently(ghoul2, boneName); if (!bone) @@ -1600,7 +1554,6 @@ qboolean G2API_RagEffectorGoal(CGhoul2Info_v &ghoul2, const char *boneName, vec3 bone->hasOverGoal = true; } return qtrue; -#endif // JK2_MODE } qboolean G2API_GetRagBonePos(CGhoul2Info_v &ghoul2, const char *boneName, vec3_t pos, vec3_t entAngles, vec3_t entPos, vec3_t entScale) @@ -1610,13 +1563,6 @@ qboolean G2API_GetRagBonePos(CGhoul2Info_v &ghoul2, const char *boneName, vec3_t qboolean G2API_RagEffectorKick(CGhoul2Info_v &ghoul2, const char *boneName, vec3_t velocity) { -#ifdef JK2_MODE - static_cast(ghoul2); - static_cast(boneName); - static_cast(velocity); - - return false; -#else boneInfo_t *bone = G2_GetRagBoneConveniently(ghoul2, boneName); if (!bone) @@ -1634,17 +1580,10 @@ qboolean G2API_RagEffectorKick(CGhoul2Info_v &ghoul2, const char *boneName, vec3 bone->physicsSettled = false; return qtrue; -#endif // JK2_MODE } qboolean G2API_RagForceSolve(CGhoul2Info_v &ghoul2, qboolean force) { -#ifdef JK2_MODE - static_cast(ghoul2); - static_cast(force); - - return false; -#else assert(ghoul2.size()); CGhoul2Info *ghlInfo = &ghoul2[0]; @@ -1663,43 +1602,20 @@ qboolean G2API_RagForceSolve(CGhoul2Info_v &ghoul2, qboolean force) } return qtrue; -#endif // JK2_MODE } -#ifndef JK2_MODE qboolean G2_SetBoneIKState(CGhoul2Info_v &ghoul2, int time, const char *boneName, int ikState, sharedSetBoneIKStateParams_t *params); -#endif // !JK2_MODE qboolean G2API_SetBoneIKState(CGhoul2Info_v &ghoul2, int time, const char *boneName, int ikState, sharedSetBoneIKStateParams_t *params) { -#ifdef JK2_MODE - static_cast(ghoul2); - static_cast(time); - static_cast(boneName); - static_cast(ikState); - static_cast(params); - - return false; -#else return G2_SetBoneIKState(ghoul2, time, boneName, ikState, params); -#endif // JK2_MODE } -#ifndef JK2_MODE qboolean G2_IKMove(CGhoul2Info_v &ghoul2, int time, sharedIKMoveParams_t *params); -#endif // !JK2_MODE qboolean G2API_IKMove(CGhoul2Info_v &ghoul2, int time, sharedIKMoveParams_t *params) { -#ifdef JK2_MODE - static_cast(ghoul2); - static_cast(time); - static_cast(params); - - return false; -#else return G2_IKMove(ghoul2, time, params); -#endif // !JK2_MODE } qboolean G2API_RemoveBolt(CGhoul2Info *ghlInfo, const int index) From 66683dd7d2fb3846015086441e2a4153d60d6c39 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Tue, 30 Aug 2016 20:56:08 +0300 Subject: [PATCH 327/445] Fix merge --- code/game/g_savegame.cpp | 2 +- code/server/sv_savegame.cpp | 14 ++++++------- shared/qcommon/ojk_saved_game.cpp | 2 +- shared/qcommon/ojk_saved_game_helper.h | 16 +++++++-------- shared/qcommon/q_math.h | 27 ++++++++++++++++++++++++++ 5 files changed, 44 insertions(+), 17 deletions(-) diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index c1e0224f4e..24b5d789bf 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -680,7 +680,7 @@ void saberInfoRetail_t::sg_export( { ::WP_SaberSetDefaults( &dst, - false); + qfalse); if (!activeBlocking) { diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 2fe4cd1b53..053196d3cc 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -907,7 +907,7 @@ static bool SG_ReadScreenshot( jpeg_data = static_cast(::Z_Malloc( static_cast(screenshot_length + 4096), TAG_TEMP_WORKSPACE, - false)); + qfalse)); } // @@ -984,14 +984,14 @@ qboolean SG_GetSaveImage( { if (!base_name) { - return false; + return qfalse; } ojk::SavedGame& saved_game = ojk::SavedGame::get_instance(); if (!saved_game.open(base_name)) { - return false; + return qfalse; } bool is_succeed = true; @@ -1017,7 +1017,7 @@ qboolean SG_GetSaveImage( saved_game.close(); - return is_succeed; + return is_succeed ? qtrue : qfalse; } @@ -1297,7 +1297,7 @@ qboolean SG_ReadSavegame( ::SG_ReadCvars(); // read game state - const int qbAutosave = ::ReadGame(); + const qboolean qbAutosave = ::ReadGame(); ::eSavedGameJustLoaded = (qbAutosave ? eAUTO : eFULL); @@ -1305,7 +1305,7 @@ qboolean SG_ReadSavegame( ::SV_SpawnServer( sMapCmd, eForceReload_NOTHING, - (::eSavedGameJustLoaded != eFULL)); + (::eSavedGameJustLoaded != eFULL ? qtrue : qfalse)); // read in all the level data... // @@ -1328,7 +1328,7 @@ qboolean SG_ReadSavegame( qbAutosave, qbLoadTransition); - return true; + return qtrue; } void SG_TestSave(void) diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index ae62998597..79704a0a01 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -47,7 +47,7 @@ bool SavedGame::open( static_cast(::FS_FOpenFileRead( file_path.c_str(), &file_handle_, - true)); + qtrue)); if (file_handle_ == 0) { diff --git a/shared/qcommon/ojk_saved_game_helper.h b/shared/qcommon/ojk_saved_game_helper.h index 00a7997366..0cf8426bc9 100644 --- a/shared/qcommon/ojk_saved_game_helper.h +++ b/shared/qcommon/ojk_saved_game_helper.h @@ -432,9 +432,8 @@ bool SavedGameHelper::try_read( int dst_count) { static_assert( - (std::is_arithmetic::value && - !std::is_same::value && - !std::is_enum::value) || + std::is_arithmetic::value || + std::is_enum::value || std::is_pointer::value || std::is_class::value, "Unsupported types."); @@ -531,7 +530,8 @@ bool SavedGameHelper::try_read( CastTag) { using Tag = typename std::conditional< - std::is_arithmetic::value, + std::is_arithmetic::value || + std::is_enum::value, NumericTag, typename std::conditional< std::is_pointer::value, @@ -680,9 +680,8 @@ void SavedGameHelper::write( int src_count) { static_assert( - (std::is_arithmetic::value && - !std::is_same::value && - !std::is_enum::value) || + std::is_arithmetic::value || + std::is_enum::value || std::is_pointer::value || std::is_class::value, "Unsupported types."); @@ -753,7 +752,8 @@ void SavedGameHelper::write( CastTag) { using Tag = typename std::conditional< - std::is_arithmetic::value, + std::is_arithmetic::value || + std::is_enum::value, NumericTag, typename std::conditional< std::is_pointer::value, diff --git a/shared/qcommon/q_math.h b/shared/qcommon/q_math.h index e4399d65da..4005e58a32 100644 --- a/shared/qcommon/q_math.h +++ b/shared/qcommon/q_math.h @@ -24,6 +24,10 @@ along with this program; if not, see . #include "q_platform.h" +#ifdef __cplusplus +#include "ojk_saved_game_helper_fwd.h" +#endif // __cplusplus + #if defined(__cplusplus) extern "C" { #endif @@ -180,6 +184,29 @@ typedef struct cplane_s { byte type; // for fast side tests: 0,1,2 = axial, 3 = nonaxial byte signbits; // signx + (signy<<1) + (signz<<2), used as lookup during collision byte pad[2]; + + +#ifdef __cplusplus + void sg_export( + ojk::SavedGameHelper& saved_game) const + { + saved_game.write(normal); + saved_game.write(dist); + saved_game.write(type); + saved_game.write(signbits); + saved_game.write(pad); + } + + void sg_import( + ojk::SavedGameHelper& saved_game) + { + saved_game.read(normal); + saved_game.read(dist); + saved_game.read(type); + saved_game.read(signbits); + saved_game.read(pad); + } +#endif // __cplusplus } cplane_t; void SetPlaneSignbits( cplane_t *out ); From 8f2c8d9ab551ab596c46b246b2f52327a93e9182 Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Wed, 31 Aug 2016 21:03:02 +0300 Subject: [PATCH 328/445] SG: Move cplane_t's archive methods into separate header --- code/game/CMakeLists.txt | 1 + code/rd-vanilla/CMakeLists.txt | 1 + codeJK2/game/CMakeLists.txt | 1 + .../qcommon/ojk_saved_game_class_archivers.h | 54 ++++++++++++++++ shared/qcommon/ojk_saved_game_helper.h | 61 +++++++++++++++++++ shared/qcommon/ojk_saved_game_helper_fwd.h | 57 +++++++++++++++++ shared/qcommon/q_math.h | 26 -------- 7 files changed, 175 insertions(+), 26 deletions(-) create mode 100644 shared/qcommon/ojk_saved_game_class_archivers.h diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index c54a67f7ec..c86eb4239c 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -260,6 +260,7 @@ set(SPGameCommonFiles "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SharedDir}/qcommon/ojk_i_saved_game.h" + "${SharedDir}/qcommon/ojk_saved_game_class_archivers.h" "${SharedDir}/qcommon/ojk_saved_game_helper.h" "${SharedDir}/qcommon/ojk_saved_game_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index 1dc0b57f36..e25c389d88 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -78,6 +78,7 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SharedDir}/qcommon/ojk_i_saved_game.h" + "${SharedDir}/qcommon/ojk_saved_game_class_archivers.h" "${SharedDir}/qcommon/ojk_saved_game_helper.h" "${SharedDir}/qcommon/ojk_saved_game_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index a757e293e7..782071ac9c 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -232,6 +232,7 @@ set(JK2SPGameCommonFiles "${SPDir}/qcommon/q_shared.h" "${SPDir}/qcommon/strippublic.h" "${SharedDir}/qcommon/ojk_i_saved_game.h" + "${SharedDir}/qcommon/ojk_saved_game_class_archivers.h" "${SharedDir}/qcommon/ojk_saved_game_helper.h" "${SharedDir}/qcommon/ojk_saved_game_helper_fwd.h" "${SharedDir}/qcommon/ojk_scope_guard.h" diff --git a/shared/qcommon/ojk_saved_game_class_archivers.h b/shared/qcommon/ojk_saved_game_class_archivers.h new file mode 100644 index 0000000000..8f4f8cec88 --- /dev/null +++ b/shared/qcommon/ojk_saved_game_class_archivers.h @@ -0,0 +1,54 @@ +// +// Saved game specialized archivers +// + + +#ifndef OJK_SAVED_GAME_CLASS_ARCHIVERS_INCLUDED +#define OJK_SAVED_GAME_CLASS_ARCHIVERS_INCLUDED + + +#include "q_math.h" +#include "ojk_saved_game_helper_fwd.h" + + +namespace ojk +{ + + +template<> +class SavedGameClassArchiver +{ +public: + static constexpr bool is_implemented() + { + return true; + } + + static void sg_export( + SavedGameHelper& saved_game, + const cplane_t& instance) + { + saved_game.write(instance.normal); + saved_game.write(instance.dist); + saved_game.write(instance.type); + saved_game.write(instance.signbits); + saved_game.write(instance.pad); + } + + static void sg_import( + SavedGameHelper& saved_game, + cplane_t& instance) + { + saved_game.read(instance.normal); + saved_game.read(instance.dist); + saved_game.read(instance.type); + saved_game.read(instance.signbits); + saved_game.read(instance.pad); + } +}; + + +} // ojk + + +#endif // OJK_SAVED_GAME_CLASS_ARCHIVERS_INCLUDED diff --git a/shared/qcommon/ojk_saved_game_helper.h b/shared/qcommon/ojk_saved_game_helper.h index 0cf8426bc9..bab0227618 100644 --- a/shared/qcommon/ojk_saved_game_helper.h +++ b/shared/qcommon/ojk_saved_game_helper.h @@ -11,6 +11,7 @@ #include #include "ojk_saved_game_helper_fwd.h" #include "ojk_scope_guard.h" +#include "ojk_saved_game_class_archivers.h" namespace ojk @@ -393,12 +394,43 @@ bool SavedGameHelper::try_read( std::is_same::value, "Unsupported types."); + using Tag = typename std::conditional< + SavedGameClassArchiver::is_implemented(), + ExternalTag, + InternalTag + >::type; + + return try_read( + dst_value, + ClassTag(), + Tag()); +} + +template +bool SavedGameHelper::try_read( + TDst& dst_value, + ClassTag, + InternalTag) +{ dst_value.sg_import( *this); return !saved_game_->is_failed(); } +template +bool SavedGameHelper::try_read( + TDst& dst_value, + ClassTag, + ExternalTag) +{ + SavedGameClassArchiver::sg_import( + *this, + dst_value); + + return !saved_game_->is_failed(); +} + template bool SavedGameHelper::try_read( TDst(&dst_values)[TCount], @@ -643,10 +675,39 @@ void SavedGameHelper::write( std::is_same::value, "Unsupported types."); + using Tag = typename std::conditional< + SavedGameClassArchiver::is_implemented(), + ExternalTag, + InternalTag + >::type; + + write( + src_value, + ClassTag(), + Tag()); +} + +template +void SavedGameHelper::write( + const TSrc& src_value, + ClassTag, + InternalTag) +{ src_value.sg_export( *this); } +template +void SavedGameHelper::write( + const TSrc& src_value, + ClassTag, + ExternalTag) +{ + SavedGameClassArchiver::sg_export( + *this, + src_value); +} + template void SavedGameHelper::write( const TSrc(&src_values)[TCount], diff --git a/shared/qcommon/ojk_saved_game_helper_fwd.h b/shared/qcommon/ojk_saved_game_helper_fwd.h index 387398d59e..6c065592f1 100644 --- a/shared/qcommon/ojk_saved_game_helper_fwd.h +++ b/shared/qcommon/ojk_saved_game_helper_fwd.h @@ -174,6 +174,8 @@ class SavedGameHelper class Array2dTag { public: }; class InplaceTag { public: }; class CastTag { public: }; + class InternalTag { public: }; + class ExternalTag { public: }; template @@ -196,6 +198,18 @@ class SavedGameHelper TDst& dst_value, ClassTag); + template + bool try_read( + TDst& dst_value, + ClassTag, + InternalTag); + + template + bool try_read( + TDst& dst_value, + ClassTag, + ExternalTag); + template bool try_read( TDst(&dst_values)[TCount], @@ -235,6 +249,18 @@ class SavedGameHelper const TSrc& src_value, ClassTag); + template + void write( + const TSrc& src_value, + ClassTag, + InternalTag); + + template + void write( + const TSrc& src_value, + ClassTag, + ExternalTag); + template void write( const TSrc(&src_values)[TCount], @@ -260,6 +286,37 @@ class SavedGameHelper }; // SavedGameHelper +template +class SavedGameClassArchiver +{ +public: + static constexpr bool is_implemented() + { + return false; + } + + static void sg_export( + SavedGameHelper& saved_game, + const T& instance) + { + static_cast(saved_game); + static_cast(instance); + + static_assert(false, "Not implemented."); + } + + static void sg_import( + SavedGameHelper& saved_game, + T& instance) + { + static_cast(saved_game); + static_cast(instance); + + static_assert(false, "Not implemented."); + } +}; + + } // ojk diff --git a/shared/qcommon/q_math.h b/shared/qcommon/q_math.h index 4005e58a32..bf337f45e8 100644 --- a/shared/qcommon/q_math.h +++ b/shared/qcommon/q_math.h @@ -24,9 +24,6 @@ along with this program; if not, see . #include "q_platform.h" -#ifdef __cplusplus -#include "ojk_saved_game_helper_fwd.h" -#endif // __cplusplus #if defined(__cplusplus) extern "C" { @@ -184,29 +181,6 @@ typedef struct cplane_s { byte type; // for fast side tests: 0,1,2 = axial, 3 = nonaxial byte signbits; // signx + (signy<<1) + (signz<<2), used as lookup during collision byte pad[2]; - - -#ifdef __cplusplus - void sg_export( - ojk::SavedGameHelper& saved_game) const - { - saved_game.write(normal); - saved_game.write(dist); - saved_game.write(type); - saved_game.write(signbits); - saved_game.write(pad); - } - - void sg_import( - ojk::SavedGameHelper& saved_game) - { - saved_game.read(normal); - saved_game.read(dist); - saved_game.read(type); - saved_game.read(signbits); - saved_game.read(pad); - } -#endif // __cplusplus } cplane_t; void SetPlaneSignbits( cplane_t *out ); From 0e3c1e651a5ae00c0ff06f54119d4c20d49ffbcc Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Thu, 1 Sep 2016 11:12:52 +0300 Subject: [PATCH 329/445] SG: Move source code into SP common dir --- code/CMakeLists.txt | 12 ++++++------ code/game/CMakeLists.txt | 10 +++++----- {shared => code}/qcommon/ojk_i_saved_game.h | 0 {shared => code}/qcommon/ojk_saved_game.cpp | 0 {shared => code}/qcommon/ojk_saved_game.h | 0 .../qcommon/ojk_saved_game_class_archivers.h | 2 +- {shared => code}/qcommon/ojk_saved_game_helper.h | 0 {shared => code}/qcommon/ojk_saved_game_helper_fwd.h | 0 {shared => code}/qcommon/ojk_scope_guard.h | 0 code/qcommon/q_shared.h | 2 +- code/rd-vanilla/CMakeLists.txt | 10 +++++----- codeJK2/cgame/cg_main.cpp | 2 +- codeJK2/game/CMakeLists.txt | 10 +++++----- codeJK2/game/G_Timer.cpp | 2 +- codeJK2/game/Q3_Registers.cpp | 2 +- codeJK2/game/g_main.cpp | 2 +- codeJK2/game/g_objectives.cpp | 2 +- codeJK2/game/g_roff.cpp | 2 +- codeJK2/game/g_savegame.cpp | 2 +- codeJK2/icarus/Instance.cpp | 2 +- codeJK2/icarus/Sequence.cpp | 2 +- codeJK2/icarus/Sequencer.cpp | 2 +- codeJK2/icarus/TaskManager.cpp | 2 +- 23 files changed, 34 insertions(+), 34 deletions(-) rename {shared => code}/qcommon/ojk_i_saved_game.h (100%) rename {shared => code}/qcommon/ojk_saved_game.cpp (100%) rename {shared => code}/qcommon/ojk_saved_game.h (100%) rename {shared => code}/qcommon/ojk_saved_game_class_archivers.h (97%) rename {shared => code}/qcommon/ojk_saved_game_helper.h (100%) rename {shared => code}/qcommon/ojk_saved_game_helper_fwd.h (100%) rename {shared => code}/qcommon/ojk_scope_guard.h (100%) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index b3d3339842..34525c4542 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -173,12 +173,12 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SPDir}/qcommon/timing.h" "${SPDir}/qcommon/MiniHeap.h" - "${SharedDir}/qcommon/ojk_i_saved_game.h" - "${SharedDir}/qcommon/ojk_saved_game.h" - "${SharedDir}/qcommon/ojk_saved_game.cpp" - "${SharedDir}/qcommon/ojk_saved_game_helper.h" - "${SharedDir}/qcommon/ojk_saved_game_helper_fwd.h" - "${SharedDir}/qcommon/ojk_scope_guard.h" + "${SPDir}/qcommon/ojk_i_saved_game.h" + "${SPDir}/qcommon/ojk_saved_game.h" + "${SPDir}/qcommon/ojk_saved_game.cpp" + "${SPDir}/qcommon/ojk_saved_game_helper.h" + "${SPDir}/qcommon/ojk_saved_game_helper_fwd.h" + "${SPDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index c86eb4239c..4c0a81c9da 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -259,11 +259,11 @@ set(SPGameCommonFiles "${SPDir}/qcommon/timing.h" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" - "${SharedDir}/qcommon/ojk_i_saved_game.h" - "${SharedDir}/qcommon/ojk_saved_game_class_archivers.h" - "${SharedDir}/qcommon/ojk_saved_game_helper.h" - "${SharedDir}/qcommon/ojk_saved_game_helper_fwd.h" - "${SharedDir}/qcommon/ojk_scope_guard.h" + "${SPDir}/qcommon/ojk_i_saved_game.h" + "${SPDir}/qcommon/ojk_saved_game_class_archivers.h" + "${SPDir}/qcommon/ojk_saved_game_helper.h" + "${SPDir}/qcommon/ojk_saved_game_helper_fwd.h" + "${SPDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) source_group("common" FILES ${SPGameCommonFiles}) diff --git a/shared/qcommon/ojk_i_saved_game.h b/code/qcommon/ojk_i_saved_game.h similarity index 100% rename from shared/qcommon/ojk_i_saved_game.h rename to code/qcommon/ojk_i_saved_game.h diff --git a/shared/qcommon/ojk_saved_game.cpp b/code/qcommon/ojk_saved_game.cpp similarity index 100% rename from shared/qcommon/ojk_saved_game.cpp rename to code/qcommon/ojk_saved_game.cpp diff --git a/shared/qcommon/ojk_saved_game.h b/code/qcommon/ojk_saved_game.h similarity index 100% rename from shared/qcommon/ojk_saved_game.h rename to code/qcommon/ojk_saved_game.h diff --git a/shared/qcommon/ojk_saved_game_class_archivers.h b/code/qcommon/ojk_saved_game_class_archivers.h similarity index 97% rename from shared/qcommon/ojk_saved_game_class_archivers.h rename to code/qcommon/ojk_saved_game_class_archivers.h index 8f4f8cec88..70a5da99e4 100644 --- a/shared/qcommon/ojk_saved_game_class_archivers.h +++ b/code/qcommon/ojk_saved_game_class_archivers.h @@ -7,7 +7,7 @@ #define OJK_SAVED_GAME_CLASS_ARCHIVERS_INCLUDED -#include "q_math.h" +#include "qcommon/q_math.h" #include "ojk_saved_game_helper_fwd.h" diff --git a/shared/qcommon/ojk_saved_game_helper.h b/code/qcommon/ojk_saved_game_helper.h similarity index 100% rename from shared/qcommon/ojk_saved_game_helper.h rename to code/qcommon/ojk_saved_game_helper.h diff --git a/shared/qcommon/ojk_saved_game_helper_fwd.h b/code/qcommon/ojk_saved_game_helper_fwd.h similarity index 100% rename from shared/qcommon/ojk_saved_game_helper_fwd.h rename to code/qcommon/ojk_saved_game_helper_fwd.h diff --git a/shared/qcommon/ojk_scope_guard.h b/code/qcommon/ojk_scope_guard.h similarity index 100% rename from shared/qcommon/ojk_scope_guard.h rename to code/qcommon/ojk_scope_guard.h diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 98e4bdbf26..20e4aaadb3 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -161,7 +161,7 @@ along with this program; if not, see . #endif #include "qcommon/q_platform.h" -#include "qcommon/ojk_saved_game_helper_fwd.h" +#include "ojk_saved_game_helper_fwd.h" // ================================================================ diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index e25c389d88..8b90b57ca2 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -77,11 +77,11 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) "${SPDir}/qcommon/matcomp.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" - "${SharedDir}/qcommon/ojk_i_saved_game.h" - "${SharedDir}/qcommon/ojk_saved_game_class_archivers.h" - "${SharedDir}/qcommon/ojk_saved_game_helper.h" - "${SharedDir}/qcommon/ojk_saved_game_helper_fwd.h" - "${SharedDir}/qcommon/ojk_scope_guard.h" + "${SPDir}/qcommon/ojk_i_saved_game.h" + "${SPDir}/qcommon/ojk_saved_game_class_archivers.h" + "${SPDir}/qcommon/ojk_saved_game_helper.h" + "${SPDir}/qcommon/ojk_saved_game_helper_fwd.h" + "${SPDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) source_group("common" FILES ${SPRDVanillaCommonFiles}) diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index 365c33496f..128de985de 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -28,7 +28,7 @@ along with this program; if not, see . #include "../../code/client/vmachine.h" #include "../../code/qcommon/sstring.h" -#include "qcommon/ojk_saved_game_helper.h" +#include "../code/qcommon/ojk_saved_game_helper.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h typedef std::map< sstring_t, unsigned char, std::less, std::allocator< unsigned char > > namePrecache_m; diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index 782071ac9c..3215eea606 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -231,11 +231,11 @@ set(JK2SPGameCommonFiles "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SPDir}/qcommon/strippublic.h" - "${SharedDir}/qcommon/ojk_i_saved_game.h" - "${SharedDir}/qcommon/ojk_saved_game_class_archivers.h" - "${SharedDir}/qcommon/ojk_saved_game_helper.h" - "${SharedDir}/qcommon/ojk_saved_game_helper_fwd.h" - "${SharedDir}/qcommon/ojk_scope_guard.h" + "${SPDir}/qcommon/ojk_i_saved_game.h" + "${SPDir}/qcommon/ojk_saved_game_class_archivers.h" + "${SPDir}/qcommon/ojk_saved_game_helper.h" + "${SPDir}/qcommon/ojk_saved_game_helper_fwd.h" + "${SPDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) source_group("common" FILES ${JK2SPGameCommonFiles}) diff --git a/codeJK2/game/G_Timer.cpp b/codeJK2/game/G_Timer.cpp index 9d38ac80e4..36d634186c 100644 --- a/codeJK2/game/G_Timer.cpp +++ b/codeJK2/game/G_Timer.cpp @@ -23,7 +23,7 @@ along with this program; if not, see . #include "g_local.h" #include "../../code/Rufl/hstring.h" -#include "qcommon/ojk_saved_game_helper.h" +#include "../code/qcommon/ojk_saved_game_helper.h" #define MAX_GTIMERS 16384 diff --git a/codeJK2/game/Q3_Registers.cpp b/codeJK2/game/Q3_Registers.cpp index 760632c8bf..c91e73adb9 100644 --- a/codeJK2/game/Q3_Registers.cpp +++ b/codeJK2/game/Q3_Registers.cpp @@ -24,7 +24,7 @@ along with this program; if not, see . #include "g_local.h" #include "Q3_Registers.h" -#include "qcommon/ojk_saved_game_helper.h" +#include "../code/qcommon/ojk_saved_game_helper.h" extern void Q3_DebugPrint( int level, const char *format, ... ); diff --git a/codeJK2/game/g_main.cpp b/codeJK2/game/g_main.cpp index b34a18d076..ef7817372b 100644 --- a/codeJK2/game/g_main.cpp +++ b/codeJK2/game/g_main.cpp @@ -35,7 +35,7 @@ along with this program; if not, see . #include "objectives.h" #include "../cgame/cg_local.h" // yeah I know this is naughty, but we're shipping soon... #include "time.h" -#include "qcommon/ojk_saved_game_helper.h" +#include "../code/qcommon/ojk_saved_game_helper.h" extern CNavigator navigator; diff --git a/codeJK2/game/g_objectives.cpp b/codeJK2/game/g_objectives.cpp index 34e258b34a..c5291543c9 100644 --- a/codeJK2/game/g_objectives.cpp +++ b/codeJK2/game/g_objectives.cpp @@ -31,7 +31,7 @@ along with this program; if not, see . #define G_OBJECTIVES_CPP #include "objectives.h" -#include "qcommon/ojk_saved_game_helper.h" +#include "../code/qcommon/ojk_saved_game_helper.h" qboolean missionInfo_Updated; diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp index 0dc86ece04..24fe2aced5 100644 --- a/codeJK2/game/g_roff.cpp +++ b/codeJK2/game/g_roff.cpp @@ -25,7 +25,7 @@ along with this program; if not, see . #include "g_local.h" #include "g_roff.h" #include "g_icarus.h" -#include "qcommon/ojk_saved_game_helper.h" +#include "../code/qcommon/ojk_saved_game_helper.h" // The list of precached ROFFs roff_list_t roffs[MAX_ROFFS]; diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index 579abb99b8..200f4f1316 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -33,7 +33,7 @@ along with this program; if not, see . #include "../cgame/cg_camera.h" #include "g_icarus.h" #include "../../code/qcommon/sstring.h" -#include "qcommon/ojk_saved_game_helper.h" +#include "../code/qcommon/ojk_saved_game_helper.h" extern void OBJ_LoadTacticalInfo(void); diff --git a/codeJK2/icarus/Instance.cpp b/codeJK2/icarus/Instance.cpp index a3b4ebe498..7f84f77d7e 100644 --- a/codeJK2/icarus/Instance.cpp +++ b/codeJK2/icarus/Instance.cpp @@ -29,7 +29,7 @@ along with this program; if not, see . #include "instance.h" #include -#include "qcommon/ojk_saved_game_helper.h" +#include "../code/qcommon/ojk_saved_game_helper.h" // Instance diff --git a/codeJK2/icarus/Sequence.cpp b/codeJK2/icarus/Sequence.cpp index d3d8da50fc..5f3a03a4d7 100644 --- a/codeJK2/icarus/Sequence.cpp +++ b/codeJK2/icarus/Sequence.cpp @@ -28,7 +28,7 @@ along with this program; if not, see . #include "icarus.h" #include -#include "qcommon/ojk_saved_game_helper.h" +#include "../code/qcommon/ojk_saved_game_helper.h" CSequence::CSequence( void ) { diff --git a/codeJK2/icarus/Sequencer.cpp b/codeJK2/icarus/Sequencer.cpp index acfb0b30b7..22edc5a909 100644 --- a/codeJK2/icarus/Sequencer.cpp +++ b/codeJK2/icarus/Sequencer.cpp @@ -30,7 +30,7 @@ along with this program; if not, see . #include "g_shared.h" #include "assert.h" -#include "qcommon/ojk_saved_game_helper.h" +#include "../code/qcommon/ojk_saved_game_helper.h" // Sequencer diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index 4d1e1c669e..83ea2565e7 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -31,7 +31,7 @@ along with this program; if not, see . #include -#include "qcommon/ojk_saved_game_helper.h" +#include "../code/qcommon/ojk_saved_game_helper.h" #define ICARUS_VALIDATE(a) if ( a == false ) return TASK_FAILED; From 0a65fd6a7237f66369e2b3a339b633e0e5f42be3 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sat, 10 Sep 2016 19:42:42 -0500 Subject: [PATCH 330/445] Shared: Improved console key support by default. New cvar: cl_consoleUseScanCode (defaults to 1) When this is on it attempts to use whatever the key left of the 1 on all keyboard layouts known by SDL. Caveat: Any language that has a caret symbol (^) as that key will require the shift key again. (AFAIK this is all German layouts) --- code/client/cl_main.cpp | 2 ++ code/client/client.h | 1 + codemp/client/cl_main.cpp | 2 ++ codemp/client/client.h | 1 + shared/sdl/sdl_input.cpp | 22 +++++++++++++++++++--- 5 files changed, 25 insertions(+), 3 deletions(-) diff --git a/code/client/cl_main.cpp b/code/client/cl_main.cpp index 95ab4c8c5e..b37d281095 100644 --- a/code/client/cl_main.cpp +++ b/code/client/cl_main.cpp @@ -76,6 +76,7 @@ cvar_t *cl_allowAltEnter; cvar_t *cl_inGameVideo; cvar_t *cl_consoleKeys; +cvar_t *cl_consoleUseScanCode; clientActive_t cl; clientConnection_t clc; @@ -1272,6 +1273,7 @@ void CL_Init( void ) { // ~ and `, as keys and characters cl_consoleKeys = Cvar_Get( "cl_consoleKeys", "~ ` 0x7e 0x60 0xb2", CVAR_ARCHIVE); + cl_consoleUseScanCode = Cvar_Get( "cl_consoleUseScanCode", "1", CVAR_ARCHIVE ); // userinfo #ifdef JK2_MODE diff --git a/code/client/client.h b/code/client/client.h index 3e57d5c4d9..178fe2a2b3 100644 --- a/code/client/client.h +++ b/code/client/client.h @@ -278,6 +278,7 @@ extern cvar_t *m_filter; extern cvar_t *cl_activeAction; extern cvar_t *cl_consoleKeys; +extern cvar_t *cl_consoleUseScanCode; //================================================= diff --git a/codemp/client/cl_main.cpp b/codemp/client/cl_main.cpp index 1ba46ad180..1d07d60575 100644 --- a/codemp/client/cl_main.cpp +++ b/codemp/client/cl_main.cpp @@ -99,6 +99,7 @@ cvar_t *cl_guidServerUniq; cvar_t *cl_autolodscale; cvar_t *cl_consoleKeys; +cvar_t *cl_consoleUseScanCode; cvar_t *cl_lanForcePackets; @@ -2762,6 +2763,7 @@ void CL_Init( void ) { // ~ and `, as keys and characters cl_consoleKeys = Cvar_Get( "cl_consoleKeys", "~ ` 0x7e 0x60 0xb2", CVAR_ARCHIVE, "Which keys are used to toggle the console"); + cl_consoleUseScanCode = Cvar_Get( "cl_consoleUseScanCode", "1", CVAR_ARCHIVE, "Use native console key detection" ); // userinfo Cvar_Get ("name", "Padawan", CVAR_USERINFO | CVAR_ARCHIVE, "Player name" ); diff --git a/codemp/client/client.h b/codemp/client/client.h index bf3e325902..3c132735ac 100644 --- a/codemp/client/client.h +++ b/codemp/client/client.h @@ -409,6 +409,7 @@ extern cvar_t *cl_conXOffset; extern cvar_t *cl_inGameVideo; extern cvar_t *cl_consoleKeys; +extern cvar_t *cl_consoleUseScanCode; extern cvar_t *cl_lanForcePackets; diff --git a/shared/sdl/sdl_input.cpp b/shared/sdl/sdl_input.cpp index 02097f515e..2626cc623d 100644 --- a/shared/sdl/sdl_input.cpp +++ b/shared/sdl/sdl_input.cpp @@ -372,10 +372,26 @@ static fakeAscii_t IN_TranslateSDLToJKKey( SDL_Keysym *keysym, qboolean down ) { if( in_keyboardDebug->integer ) IN_PrintKey( keysym, key, down ); - if( IN_IsConsoleKey( key, 0 ) && !kg.keys[A_ALT].down ) + if ( cl_consoleUseScanCode->integer ) { - // Console keys can't be bound or generate characters - key = A_CONSOLE; + if ( keysym->scancode == SDL_SCANCODE_GRAVE ) + { + SDL_Keycode translated = SDL_GetKeyFromScancode( SDL_SCANCODE_GRAVE ); + + if ( (translated != SDLK_CARET) || (translated == SDLK_CARET && (keysym->mod & KMOD_SHIFT)) ) + { + // Console keys can't be bound or generate characters + key = A_CONSOLE; + } + } + } + else + { + if ( IN_IsConsoleKey( key, 0 ) ) + { + // Console keys can't be bound or generate characters + key = A_CONSOLE; + } } return key; From c986357591c7dec681cbd47aabc09f3271f52407 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sat, 10 Sep 2016 23:21:22 -0500 Subject: [PATCH 331/445] [SP] Merged pool and paged pool allocators from MP's efx scheduler to SP from @Xycaleth. For relevant commit logs see: e497b801379fe580cd0251feab753c0da5787222 afeb21c9a750695d9fe17e674d512976599e7649 e5960a459509c29b69f4ef2b9065064a2549bae4 --- code/cgame/FxScheduler.cpp | 141 +++++++++++++++-------------- code/cgame/FxScheduler.h | 181 ++++++++++++++++++++++++++++++++++++- 2 files changed, 248 insertions(+), 74 deletions(-) diff --git a/code/cgame/FxScheduler.cpp b/code/cgame/FxScheduler.cpp index 63515c9c25..dea9d9410f 100644 --- a/code/cgame/FxScheduler.cpp +++ b/code/cgame/FxScheduler.cpp @@ -330,7 +330,7 @@ void CFxScheduler::Clean(bool bRemoveTemplates /*= true*/, int idToPreserve /*= next = itr; ++next; - delete *itr; + mScheduledEffectsPool.Free (*itr); mFxSchedule.erase(itr); itr = next; @@ -830,7 +830,6 @@ void CFxScheduler::PlayEffect( const char *file, int clientID, bool isPortal ) CPrimitiveTemplate *prim; int i = 0; int count = 0, delay = 0; - SScheduledEffect *sfx; float factor = 0.0f; if ( id < 1 || id >= FX_MAX_EFFECTS || !mEffectTemplates[id].mInUse ) @@ -883,9 +882,14 @@ void CFxScheduler::PlayEffect( const char *file, int clientID, bool isPortal ) } else { - // We have to create a new scheduled effect so that we can create it at a later point - // you should avoid this because it's much more expensive - sfx = new SScheduledEffect; + SScheduledEffect *sfx = mScheduledEffectsPool.Alloc(); + + if ( sfx == NULL ) + { + Com_Error (ERR_DROP, "ERROR: Failed to allocate EFX from memory pool."); + return; + } + sfx->mStartTime = theFxHelper.mTime + delay; sfx->mpTemplate = prim; sfx->mClientID = clientID; @@ -1190,10 +1194,14 @@ void CFxScheduler::PlayEffect( int id, vec3_t origin, vec3_t axis[3], const int } else { - // We have to create a new scheduled effect so that we can create it at a later point - // you should avoid this because it's much more expensive - SScheduledEffect *sfx; - sfx = new SScheduledEffect; + SScheduledEffect *sfx = mScheduledEffectsPool.Alloc(); + + if ( sfx == NULL ) + { + Com_Error (ERR_DROP, "ERROR: Failed to allocate EFX from memory pool."); + return; + } + sfx->mStartTime = theFxHelper.mTime + delay; sfx->mpTemplate = prim; sfx->mClientID = -1; @@ -1340,85 +1348,80 @@ void CFxScheduler::AddScheduledEffects( bool portal ) AddLoopedEffects(); } - itr = mFxSchedule.begin(); - - while ( itr != mFxSchedule.end() ) + for ( itr = mFxSchedule.begin(); itr != mFxSchedule.end(); /* do nothing */ ) { - next = itr; - ++next; + SScheduledEffect *effect = *itr; - if (portal == (*itr)->mPortalEffect) + if (portal == effect->mPortalEffect && effect->mStartTime <= theFxHelper.mTime ) { - if ( *(*itr) <= theFxHelper.mTime ) + if ( effect->mClientID >= 0 ) { - if ( (*itr)->mClientID >= 0 ) + CreateEffect( effect->mpTemplate, effect->mClientID, + theFxHelper.mTime - effect->mStartTime ); + } + else if (effect->mBoltNum == -1) + {// normal effect + if ( effect->mEntNum != -1 ) // -1 { - CreateEffect( (*itr)->mpTemplate, (*itr)->mClientID, - theFxHelper.mTime - (*itr)->mStartTime ); - } - else if ((*itr)->mBoltNum == -1) - {// normal effect - if ( (*itr)->mEntNum != -1 ) - { - // Find out where the entity currently is - CreateEffect( (*itr)->mpTemplate, - cg_entities[(*itr)->mEntNum].lerpOrigin, (*itr)->mAxis, - theFxHelper.mTime - (*itr)->mStartTime ); - } - else - { - CreateEffect( (*itr)->mpTemplate, - (*itr)->mOrigin, (*itr)->mAxis, - theFxHelper.mTime - (*itr)->mStartTime ); - } + // Find out where the entity currently is + CreateEffect( effect->mpTemplate, + cg_entities[effect->mEntNum].lerpOrigin, effect->mAxis, + theFxHelper.mTime - (*itr)->mStartTime ); } else - { //bolted on effect - // do we need to go and re-get the bolt matrix again? Since it takes time lets try to do it only once - if (((*itr)->mModelNum != oldModelNum) || ((*itr)->mEntNum != oldEntNum) || ((*itr)->mBoltNum != oldBoltIndex)) + { + CreateEffect( effect->mpTemplate, + effect->mOrigin, effect->mAxis, + theFxHelper.mTime - effect->mStartTime ); + } + } + else + { //bolted on effect + // do we need to go and re-get the bolt matrix again? Since it takes time lets try to do it only once + if ((effect->mModelNum != oldModelNum) || (effect->mEntNum != oldEntNum) || (effect->mBoltNum != oldBoltIndex)) + { + const centity_t ¢ = cg_entities[effect->mEntNum]; + if (cent.gent->ghoul2.IsValid()) { - const centity_t ¢ = cg_entities[(*itr)->mEntNum]; - if (cent.gent->ghoul2.IsValid()) + if (effect->mModelNum>=0&&effect->mModelNumghoul2.size()) { - if ((*itr)->mModelNum>=0&&(*itr)->mModelNumghoul2.size()) + if (cent.gent->ghoul2[effect->mModelNum].mModelindex>=0) { - if (cent.gent->ghoul2[(*itr)->mModelNum].mModelindex>=0) - { - doesBoltExist = (qboolean)(theFxHelper.GetOriginAxisFromBolt(cent, (*itr)->mModelNum, (*itr)->mBoltNum, origin, axis) != 0); - } + doesBoltExist = (qboolean)(theFxHelper.GetOriginAxisFromBolt(cent, effect->mModelNum, effect->mBoltNum, origin, axis) != 0); } } - - oldModelNum = (*itr)->mModelNum; - oldEntNum = (*itr)->mEntNum; - oldBoltIndex = (*itr)->mBoltNum; } - // only do this if we found the bolt - if (doesBoltExist) + oldModelNum = effect->mModelNum; + oldEntNum = effect->mEntNum; + oldBoltIndex = effect->mBoltNum; + } + + // only do this if we found the bolt + if (doesBoltExist) + { + if (effect->mIsRelative ) { - if ((*itr)->mIsRelative ) - { - CreateEffect( (*itr)->mpTemplate, - vec3_origin, axis, - 0, (*itr)->mEntNum, (*itr)->mModelNum, (*itr)->mBoltNum ); - } - else - { - CreateEffect( (*itr)->mpTemplate, - origin, axis, - theFxHelper.mTime - (*itr)->mStartTime ); - } + CreateEffect( effect->mpTemplate, + vec3_origin, axis, + 0, effect->mEntNum, effect->mModelNum, effect->mBoltNum ); + } + else + { + CreateEffect( effect->mpTemplate, + origin, axis, + theFxHelper.mTime - effect->mStartTime ); } } - - // Get 'em out of there. - delete *itr; - mFxSchedule.erase(itr); } - } - itr = next; + mScheduledEffectsPool.Free( effect ); + itr = mFxSchedule.erase( itr ); + } + else + { + ++itr; + } } // Add all active effects into the scene diff --git a/code/cgame/FxScheduler.h b/code/cgame/FxScheduler.h index 5c3ff91d96..76d440284d 100644 --- a/code/cgame/FxScheduler.h +++ b/code/cgame/FxScheduler.h @@ -31,6 +31,8 @@ typedef sstring_t fxString_t; #include "../game/genericparser2.h" #include "qcommon/safe/string.h" +#include + #ifndef FX_SCHEDULER_H_INC #define FX_SCHEDULER_H_INC @@ -386,7 +388,180 @@ struct SEffectTemplate void operator=(const SEffectTemplate &that); }; +template +class PoolAllocator +{ +public: + PoolAllocator() + : pool (new T[N]) + , freeAndAllocated (new int[N]) + , numFree (N) + , highWatermark (0) + { + for ( int i = 0; i < N; i++ ) + { + freeAndAllocated[i] = i; + } + } + T *Alloc() + { + if ( numFree == 0 ) + { + return NULL; + } + + T *ptr = new (&pool[freeAndAllocated[0]]) T; + + std::rotate (freeAndAllocated, freeAndAllocated + 1, freeAndAllocated + N); + numFree--; + + highWatermark = Q_max(highWatermark, N - numFree); + + return ptr; + } + + void TransferTo ( PoolAllocator& allocator ) + { + allocator.freeAndAllocated = freeAndAllocated; + allocator.highWatermark = highWatermark; + allocator.numFree = numFree; + allocator.pool = pool; + + highWatermark = 0; + numFree = N; + freeAndAllocated = NULL; + pool = NULL; + } + + bool OwnsPtr ( const T *ptr ) const + { + return ptr >= pool && ptr < (pool + N); + } + + void Free ( T *ptr ) + { + for ( int i = numFree; i < N; i++ ) + { + T *p = &pool[freeAndAllocated[i]]; + + if ( p == ptr ) + { + if ( i > numFree ) + { + std::rotate (freeAndAllocated + numFree, freeAndAllocated + i, freeAndAllocated + i + 1); + } + + p->~T(); + numFree++; + + break; + } + } + } + + int GetHighWatermark() const { return highWatermark; } + + ~PoolAllocator() + { + for ( int i = numFree; i < N; i++ ) + { + T *p = &pool[freeAndAllocated[i]]; + + p->~T(); + } + + delete [] freeAndAllocated; + delete [] pool; + } + +private: + PoolAllocator ( const PoolAllocator& ); + PoolAllocator& operator = ( const PoolAllocator& ); + + T *pool; + + // The first 'numFree' elements are the indexes of the free slots. + // The remaining elements are the indexes of the allocated slots. + int *freeAndAllocated; + int numFree; + + int highWatermark; +}; + +template +class PagedPoolAllocator +{ + public: + PagedPoolAllocator () + : numPages (1) + , pages (new PoolAllocator[1]()) + { + } + + T *Alloc () + { + T *ptr = NULL; + for ( int i = 0; i < numPages && ptr == NULL; i++ ) + { + ptr = pages[i].Alloc (); + } + + if ( ptr == NULL ) + { + PoolAllocator *newPages = new PoolAllocator[numPages + 1] (); + for ( int i = 0; i < numPages; i++ ) + { + pages[i].TransferTo (newPages[i]); + } + + delete[] pages; + pages = newPages; + + ptr = pages[numPages].Alloc (); + if ( ptr == NULL ) + { + return NULL; + } + + numPages++; + } + + return ptr; + } + + void Free ( T *ptr ) + { + for ( int i = 0; i < numPages; i++ ) + { + if ( pages[i].OwnsPtr (ptr) ) + { + pages[i].Free (ptr); + break; + } + } + } + + int GetHighWatermark () const + { + int total = 0; + for ( int i = 0; i < numPages; i++ ) + { + total += pages[i].GetHighWatermark (); + } + + return total; + } + + ~PagedPoolAllocator () + { + delete[] pages; + } + + private: + int numPages; + PoolAllocator *pages; +}; //----------------------------------------------------------------- // @@ -428,11 +603,6 @@ class CFxScheduler bool mIsRelative; // bolt this puppy on keep it updated vec3_t mOrigin; vec3_t mAxis[3]; - - bool operator <= (const int time) const - { - return mStartTime <= time; - } }; /* Looped Effects get stored and reschedule at mRepeatRate */ @@ -457,6 +627,7 @@ class CFxScheduler // List of scheduled effects that will need to be created at the correct time. TScheduledEffect mFxSchedule; + PagedPoolAllocator mScheduledEffectsPool; // Private function prototypes SEffectTemplate *GetNewEffectTemplate( int *id, const char *file ); From 712627afab20aaa772d062a8fc8aeb5d3efa6152 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sun, 11 Sep 2016 00:00:11 -0500 Subject: [PATCH 332/445] [JK2SP] Merged pool and paged pool allocators from MP's efx scheduler to JK2SP from @Xycaleth. For relevant commit logs see: e497b801379fe580cd0251feab753c0da5787222 afeb21c9a750695d9fe17e674d512976599e7649 e5960a459509c29b69f4ef2b9065064a2549bae4 --- codeJK2/cgame/FxScheduler.cpp | 88 +++++++++-------- codeJK2/cgame/FxScheduler.h | 181 +++++++++++++++++++++++++++++++++- 2 files changed, 223 insertions(+), 46 deletions(-) diff --git a/codeJK2/cgame/FxScheduler.cpp b/codeJK2/cgame/FxScheduler.cpp index 676d967a00..1aa018eff4 100644 --- a/codeJK2/cgame/FxScheduler.cpp +++ b/codeJK2/cgame/FxScheduler.cpp @@ -103,7 +103,7 @@ void CFxScheduler::Clean(bool bRemoveTemplates /*= true*/, int idToPreserve /*= next = itr; ++next; - delete *itr; + mScheduledEffectsPool.Free (*itr); mFxSchedule.erase(itr); itr = next; @@ -594,7 +594,6 @@ void CFxScheduler::PlayEffect( const char *file, int clientID ) CPrimitiveTemplate *prim; int i = 0; int count = 0, delay = 0; - SScheduledEffect *sfx; float factor = 0.0f; if ( id < 1 || id >= FX_MAX_EFFECTS || !mEffectTemplates[id].mInUse ) @@ -647,9 +646,14 @@ void CFxScheduler::PlayEffect( const char *file, int clientID ) } else { - // We have to create a new scheduled effect so that we can create it at a later point - // you should avoid this because it's much more expensive - sfx = new SScheduledEffect; + SScheduledEffect *sfx = mScheduledEffectsPool.Alloc(); + + if ( sfx == NULL ) + { + Com_Error (ERR_DROP, "ERROR: Failed to allocate EFX from memory pool."); + return; + } + sfx->mStartTime = theFxHelper.mTime + delay; sfx->mpTemplate = prim; sfx->mClientID = clientID; @@ -840,7 +844,6 @@ void CFxScheduler::PlayEffect( int id, vec3_t origin, vec3_t axis[3], const int CPrimitiveTemplate *prim; int i = 0; int count = 0, delay = 0; - SScheduledEffect *sfx; float factor = 0.0f; bool forceScheduling = false; @@ -929,9 +932,14 @@ void CFxScheduler::PlayEffect( int id, vec3_t origin, vec3_t axis[3], const int } else { - // We have to create a new scheduled effect so that we can create it at a later point - // you should avoid this because it's much more expensive - sfx = new SScheduledEffect; + SScheduledEffect *sfx = mScheduledEffectsPool.Alloc(); + + if ( sfx == NULL ) + { + Com_Error (ERR_DROP, "ERROR: Failed to allocate EFX from memory pool."); + return; + } + sfx->mStartTime = theFxHelper.mTime + delay; sfx->mpTemplate = prim; sfx->mClientID = -1; @@ -1068,34 +1076,31 @@ void CFxScheduler::AddScheduledEffects( void ) int oldEntNum = -1, oldBoltIndex = -1, oldModelNum = -1; qboolean doesBoltExist = qfalse; - itr = mFxSchedule.begin(); - - while ( itr != mFxSchedule.end() ) + for ( itr = mFxSchedule.begin(); itr != mFxSchedule.end(); /* do nothing */ ) { - next = itr; - ++next; + SScheduledEffect *effect = *itr; - if ( *(*itr) <= theFxHelper.mTime ) + if ( effect->mStartTime <= theFxHelper.mTime ) { - if ( (*itr)->mClientID >= 0 ) + if ( effect->mClientID >= 0 ) { - CreateEffect( (*itr)->mpTemplate, (*itr)->mClientID, - theFxHelper.mTime - (*itr)->mStartTime ); + CreateEffect( effect->mpTemplate, effect->mClientID, + theFxHelper.mTime - effect->mStartTime ); } - else if ((*itr)->mBoltNum == -1) + else if (effect->mBoltNum == -1) {// ok, are we spawning a bolt on effect or a normal one? - if ( (*itr)->mEntNum != -1 ) + if ( effect->mEntNum != -1 ) { // Find out where the entity currently is - CreateEffect( (*itr)->mpTemplate, - cg_entities[(*itr)->mEntNum].lerpOrigin, (*itr)->mAxis, - theFxHelper.mTime - (*itr)->mStartTime ); + CreateEffect( effect->mpTemplate, + cg_entities[effect->mEntNum].lerpOrigin, effect->mAxis, + theFxHelper.mTime - effect->mStartTime ); } else { - CreateEffect( (*itr)->mpTemplate, - (*itr)->mOrigin, (*itr)->mAxis, - theFxHelper.mTime - (*itr)->mStartTime ); + CreateEffect( effect->mpTemplate, + effect->mOrigin, effect->mAxis, + theFxHelper.mTime - effect->mStartTime ); } } else @@ -1105,17 +1110,17 @@ void CFxScheduler::AddScheduledEffects( void ) doesBoltExist=qfalse; // do we need to go and re-get the bolt matrix again? Since it takes time lets try and do it only once - if (((*itr)->mModelNum != oldModelNum) || ((*itr)->mEntNum != oldEntNum) || ((*itr)->mBoltNum != oldBoltIndex)) + if ((effect->mModelNum != oldModelNum) || (effect->mEntNum != oldEntNum) || (effect->mBoltNum != oldBoltIndex)) { - if (cg_entities[(*itr)->mEntNum].gent->ghoul2.IsValid()) + if (cg_entities[effect->mEntNum].gent->ghoul2.IsValid()) { - if ((*itr)->mModelNum>=0&&(*itr)->mModelNummEntNum].gent->ghoul2.size()) + if (effect->mModelNum>=0&&effect->mModelNummEntNum].gent->ghoul2.size()) { - if (cg_entities[(*itr)->mEntNum].gent->ghoul2[(*itr)->mModelNum].mModelindex>=0) + if (cg_entities[effect->mEntNum].gent->ghoul2[effect->mModelNum].mModelindex>=0) { // go away and get me the bolt position for this frame please - doesBoltExist = gi.G2API_GetBoltMatrix(cg_entities[(*itr)->mEntNum].gent->ghoul2, (*itr)->mModelNum, (*itr)->mBoltNum, &boltMatrix, cg_entities[(*itr)->mEntNum].lerpAngles, cg_entities[(*itr)->mEntNum].lerpOrigin, cg.time, cgs.model_draw, cg_entities[(*itr)->mEntNum].currentState.modelScale); + doesBoltExist = gi.G2API_GetBoltMatrix(cg_entities[effect->mEntNum].gent->ghoul2, effect->mModelNum, effect->mBoltNum, &boltMatrix, cg_entities[effect->mEntNum].lerpAngles, cg_entities[effect->mEntNum].lerpOrigin, cg.time, cgs.model_draw, cg_entities[effect->mEntNum].currentState.modelScale); // set up the axis and origin we need for the actual effect spawning origin[0] = boltMatrix.matrix[0][3]; origin[1] = boltMatrix.matrix[1][3]; @@ -1136,26 +1141,27 @@ void CFxScheduler::AddScheduledEffects( void ) } } - oldModelNum = (*itr)->mModelNum; - oldEntNum = (*itr)->mEntNum; - oldBoltIndex = (*itr)->mBoltNum; + oldModelNum = effect->mModelNum; + oldEntNum = effect->mEntNum; + oldBoltIndex = effect->mBoltNum; } // only do this if we found the bolt if (doesBoltExist) { - CreateEffect( (*itr)->mpTemplate, + CreateEffect( effect->mpTemplate, origin, axis, - theFxHelper.mTime - (*itr)->mStartTime ); + theFxHelper.mTime - effect->mStartTime ); } } - // Get 'em out of there. - delete *itr; - mFxSchedule.erase(itr); + mScheduledEffectsPool.Free( effect ); + itr = mFxSchedule.erase( itr ); + } + else + { + ++itr; } - - itr = next; } // Add all active effects into the scene diff --git a/codeJK2/cgame/FxScheduler.h b/codeJK2/cgame/FxScheduler.h index 5e6eb36263..6d6e0c8e4f 100644 --- a/codeJK2/cgame/FxScheduler.h +++ b/codeJK2/cgame/FxScheduler.h @@ -31,6 +31,8 @@ typedef sstring_t fxString_t; #include "../game/genericparser2.h" #include "qcommon/safe/string.h" +#include + #ifndef FX_SCHEDULER_H_INC #define FX_SCHEDULER_H_INC @@ -382,7 +384,180 @@ struct SEffectTemplate void operator=(const SEffectTemplate &that); }; +template +class PoolAllocator +{ +public: + PoolAllocator() + : pool (new T[N]) + , freeAndAllocated (new int[N]) + , numFree (N) + , highWatermark (0) + { + for ( int i = 0; i < N; i++ ) + { + freeAndAllocated[i] = i; + } + } + T *Alloc() + { + if ( numFree == 0 ) + { + return NULL; + } + + T *ptr = new (&pool[freeAndAllocated[0]]) T; + + std::rotate (freeAndAllocated, freeAndAllocated + 1, freeAndAllocated + N); + numFree--; + + highWatermark = Q_max(highWatermark, N - numFree); + + return ptr; + } + + void TransferTo ( PoolAllocator& allocator ) + { + allocator.freeAndAllocated = freeAndAllocated; + allocator.highWatermark = highWatermark; + allocator.numFree = numFree; + allocator.pool = pool; + + highWatermark = 0; + numFree = N; + freeAndAllocated = NULL; + pool = NULL; + } + + bool OwnsPtr ( const T *ptr ) const + { + return ptr >= pool && ptr < (pool + N); + } + + void Free ( T *ptr ) + { + for ( int i = numFree; i < N; i++ ) + { + T *p = &pool[freeAndAllocated[i]]; + + if ( p == ptr ) + { + if ( i > numFree ) + { + std::rotate (freeAndAllocated + numFree, freeAndAllocated + i, freeAndAllocated + i + 1); + } + + p->~T(); + numFree++; + + break; + } + } + } + + int GetHighWatermark() const { return highWatermark; } + + ~PoolAllocator() + { + for ( int i = numFree; i < N; i++ ) + { + T *p = &pool[freeAndAllocated[i]]; + + p->~T(); + } + + delete [] freeAndAllocated; + delete [] pool; + } + +private: + PoolAllocator ( const PoolAllocator& ); + PoolAllocator& operator = ( const PoolAllocator& ); + + T *pool; + + // The first 'numFree' elements are the indexes of the free slots. + // The remaining elements are the indexes of the allocated slots. + int *freeAndAllocated; + int numFree; + + int highWatermark; +}; + +template +class PagedPoolAllocator +{ + public: + PagedPoolAllocator () + : numPages (1) + , pages (new PoolAllocator[1]()) + { + } + + T *Alloc () + { + T *ptr = NULL; + for ( int i = 0; i < numPages && ptr == NULL; i++ ) + { + ptr = pages[i].Alloc (); + } + + if ( ptr == NULL ) + { + PoolAllocator *newPages = new PoolAllocator[numPages + 1] (); + for ( int i = 0; i < numPages; i++ ) + { + pages[i].TransferTo (newPages[i]); + } + + delete[] pages; + pages = newPages; + + ptr = pages[numPages].Alloc (); + if ( ptr == NULL ) + { + return NULL; + } + + numPages++; + } + + return ptr; + } + + void Free ( T *ptr ) + { + for ( int i = 0; i < numPages; i++ ) + { + if ( pages[i].OwnsPtr (ptr) ) + { + pages[i].Free (ptr); + break; + } + } + } + + int GetHighWatermark () const + { + int total = 0; + for ( int i = 0; i < numPages; i++ ) + { + total += pages[i].GetHighWatermark (); + } + + return total; + } + + ~PagedPoolAllocator () + { + delete[] pages; + } + + private: + int numPages; + PoolAllocator *pages; +}; //----------------------------------------------------------------- // @@ -408,11 +583,6 @@ class CFxScheduler int mClientID; // FIXME: redundant?? vec3_t mOrigin; vec3_t mAxis[3]; - - bool operator <= (const int time) const - { - return mStartTime <= time; - } }; // this makes looking up the index based on the string name much easier @@ -427,6 +597,7 @@ class CFxScheduler // List of scheduled effects that will need to be created at the correct time. TScheduledEffect mFxSchedule; + PagedPoolAllocator mScheduledEffectsPool; // Private function prototypes SEffectTemplate *GetNewEffectTemplate( int *id, const char *file ); From dfd7413b7e7613adcea63b0cd3b908e4418d8551 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 22 Sep 2016 08:43:34 +0100 Subject: [PATCH 333/445] Suppress compiler warning for unused BufferToHexString This function is only called when debugging challenges. --- codemp/server/sv_challenge.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/codemp/server/sv_challenge.cpp b/codemp/server/sv_challenge.cpp index 3bca98baad..1331af85f0 100644 --- a/codemp/server/sv_challenge.cpp +++ b/codemp/server/sv_challenge.cpp @@ -30,6 +30,7 @@ static const size_t SECRET_KEY_LENGTH = MD5_DIGEST_SIZE; // Key length equal to static qboolean challengerInitialized = qfalse; static hmacMD5Context_t challenger; +#ifdef DEBUG_SV_CHALLENGE /* ==================== BufferToHexString @@ -52,6 +53,7 @@ static const char *BufferToHexString(byte *buffer, size_t bufferLen) hexString[bufferLen * 2] = '\0'; return hexString; } +#endif /* ==================== From 8ea096c529c525db3bd2babe3c1a9cc0e230e58d Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 22 Sep 2016 08:32:54 +0100 Subject: [PATCH 334/445] botlib: print long int correctly value has type long, or equivalently signed long int. In C, abs(some_long) returns int (to get a long result you would have to use labs(some_long) due to lack of overloading), but in C++ it returns long. --- codemp/botlib/l_precomp.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/codemp/botlib/l_precomp.cpp b/codemp/botlib/l_precomp.cpp index 9560f97ce7..34c094fce0 100644 --- a/codemp/botlib/l_precomp.cpp +++ b/codemp/botlib/l_precomp.cpp @@ -2510,7 +2510,7 @@ int PC_Directive_eval(source_t *source) token.whitespace_p = source->scriptstack->script_p; token.endwhitespace_p = source->scriptstack->script_p; token.linescrossed = 0; - sprintf(token.string, "%d", abs(value)); + sprintf(token.string, "%ld", abs(value)); token.type = TT_NUMBER; token.subtype = TT_INTEGER|TT_LONG|TT_DECIMAL; PC_UnreadSourceToken(source, &token); @@ -2615,7 +2615,7 @@ int PC_DollarDirective_evalint(source_t *source) token.whitespace_p = source->scriptstack->script_p; token.endwhitespace_p = source->scriptstack->script_p; token.linescrossed = 0; - sprintf(token.string, "%d", abs(value)); + sprintf(token.string, "%ld", abs(value)); token.type = TT_NUMBER; token.subtype = TT_INTEGER|TT_LONG|TT_DECIMAL; From 37ba2b6b09f5d594665bb887ce39444a63ae18d1 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Wed, 21 Sep 2016 12:59:58 +0100 Subject: [PATCH 335/445] Declare platform-independent byteswapping functions QINLINE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In addition to enabling inlining for these very simple functions, this suppresses warnings from gcc 6: …/shared/qcommon/q_platform.h:302:13: warning: 'void CopyShortSwap(void*, const void*)' defined but not used [-Wunused-function] --- shared/qcommon/q_platform.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shared/qcommon/q_platform.h b/shared/qcommon/q_platform.h index 3ff6e9ce77..0d60290e41 100644 --- a/shared/qcommon/q_platform.h +++ b/shared/qcommon/q_platform.h @@ -299,17 +299,17 @@ static inline uint32_t LongSwap(uint32_t v) } #endif -static void CopyShortSwap( void *dest, const void *src ) +static QINLINE void CopyShortSwap( void *dest, const void *src ) { *(uint16_t*)dest = ShortSwap(*(uint16_t*)src); } -static void CopyLongSwap( void *dest, const void *src ) +static QINLINE void CopyLongSwap( void *dest, const void *src ) { *(uint32_t*)dest = LongSwap(*(uint32_t*)src); } -static float FloatSwap(float f) +static QINLINE float FloatSwap(float f) { float out; CopyLongSwap(&out, &f); From 55526ff8b3ec0df46a820d90a0925b40f4407113 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sun, 20 Mar 2016 13:47:36 +0000 Subject: [PATCH 336/445] Fix a typo in Siege mode: attemtping -> attempting --- codemp/game/ai_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codemp/game/ai_main.c b/codemp/game/ai_main.c index 24910a17f1..f068349586 100644 --- a/codemp/game/ai_main.c +++ b/codemp/game/ai_main.c @@ -131,7 +131,7 @@ char *ctfStateDescriptions[] = { char *siegeStateDescriptions[] = { "I'm not occupied", - "I'm attemtping to complete the current objective", + "I'm attempting to complete the current objective", "I'm preventing the enemy from completing their objective" }; From dcc12603bd9afa3788ff1559bdc5cdc6ce2e68f4 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 22 Sep 2016 08:40:39 +0100 Subject: [PATCH 337/445] Use same mechanism to say "no servers found" as to say how many we found This avoids an array underflow: if no servers were found, we would write to foundPlayerServerNames[-1], which is undefined behaviour, but with a reasonable assumption of the stack layout is likely to result in a write to foundPlayerServerAddresses[MAX - 1]. --- codemp/ui/ui_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codemp/ui/ui_main.c b/codemp/ui/ui_main.c index 862da52301..1f17346f3c 100644 --- a/codemp/ui/ui_main.c +++ b/codemp/ui/ui_main.c @@ -7830,7 +7830,7 @@ static void UI_BuildFindPlayerList(qboolean force) { // add a line that shows the number of servers found if (!uiInfo.numFoundPlayerServers) { - Com_sprintf(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1], sizeof(uiInfo.foundPlayerServerAddresses[0]), "no servers found"); + trap->Cvar_Set( "ui_playerServersFound", "no servers found" ); } else { From 47403da163017f45a535ae1a0641846fe5ab8f9a Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 26 Sep 2016 14:55:24 -0500 Subject: [PATCH 338/445] MP: Retain localization of no servers with player name found. --- codemp/ui/ui_main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/codemp/ui/ui_main.c b/codemp/ui/ui_main.c index 1f17346f3c..40fa5def78 100644 --- a/codemp/ui/ui_main.c +++ b/codemp/ui/ui_main.c @@ -7827,14 +7827,17 @@ static void UI_BuildFindPlayerList(qboolean force) { uiInfo.nextFindPlayerRefresh = uiInfo.uiDC.realTime + 25; } else { + trap->SE_GetStringTextString("MENUS_SERVERS_FOUNDWITH", holdSPString, sizeof(holdSPString)); // add a line that shows the number of servers found if (!uiInfo.numFoundPlayerServers) { - trap->Cvar_Set( "ui_playerServersFound", "no servers found" ); + trap->Cvar_Set( "ui_playerServersFound", va( holdSPString, + 0, + "s", + uiInfo.findPlayerName) ); } else { - trap->SE_GetStringTextString("MENUS_SERVERS_FOUNDWITH", holdSPString, sizeof(holdSPString)); trap->Cvar_Set( "ui_playerServersFound", va( holdSPString, uiInfo.numFoundPlayerServers-1, uiInfo.numFoundPlayerServers == 2 ? "":"s", From ffa7ab7825ed1c841a536f9d5e06cfe71381aa02 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sat, 1 Oct 2016 22:52:28 -0500 Subject: [PATCH 339/445] Shared: Move vector2D functions into q_math to avoid redundancy. --- code/cgame/FxPrimitives.cpp | 2 +- code/cgame/FxSystem.h | 20 -------------- code/cgame/FxUtil.cpp | 2 +- code/cgame/cg_effects.cpp | 8 +++--- code/cgame/cg_players.cpp | 8 +++--- code/rd-vanilla/tr_surface.cpp | 32 +++++++---------------- codeJK2/cgame/FxPrimitives.cpp | 2 +- codeJK2/cgame/FxSystem.h | 20 -------------- codeJK2/cgame/FxUtil.cpp | 2 +- codeJK2/cgame/cg_effects.cpp | 8 +++--- codeJK2/cgame/cg_players.cpp | 8 +++--- codemp/cgame/cg_effects.c | 14 +++------- codemp/client/FxPrimitives.cpp | 2 +- codemp/client/FxScheduler.cpp | 2 +- codemp/client/FxSystem.cpp | 2 +- codemp/client/FxSystem.h | 32 +---------------------- codemp/client/FxUtil.cpp | 2 +- shared/qcommon/q_math.c | 48 ++++++++++++++++++++++++++++++++++ shared/qcommon/q_math.h | 25 ++++++++++++++++++ 19 files changed, 112 insertions(+), 127 deletions(-) diff --git a/code/cgame/FxPrimitives.cpp b/code/cgame/FxPrimitives.cpp index f902da058e..74dc874a88 100644 --- a/code/cgame/FxPrimitives.cpp +++ b/code/cgame/FxPrimitives.cpp @@ -1893,7 +1893,7 @@ void CPoly::Draw() verts[i].modulate[k] = mRefEnt.shaderRGBA[k]; // Copy the ST coords - Vector2Copy( mST[i], verts[i].st ); + VectorCopy2( mST[i], verts[i].st ); } // Add this poly diff --git a/code/cgame/FxSystem.h b/code/cgame/FxSystem.h index 0b65d7205d..3a81749aa1 100644 --- a/code/cgame/FxSystem.h +++ b/code/cgame/FxSystem.h @@ -36,28 +36,8 @@ along with this program; if not, see . extern vmCvar_t fx_debug; extern vmCvar_t fx_freeze; -inline void Vector2Clear(vec2_t a) -{ - a[0] = 0.0f; - a[1] = 0.0f; -} - -inline void Vector2Set(vec2_t a,float b,float c) -{ - a[0] = b; - a[1] = c; -} - -inline void Vector2Copy(vec2_t src,vec2_t dst) -{ - dst[0] = src[0]; - dst[1] = src[1]; -} - - extern void CG_CalcEntityLerpPositions( centity_t * ); - struct SFxHelper { int mTime; diff --git a/code/cgame/FxUtil.cpp b/code/cgame/FxUtil.cpp index 8bb9c87a12..499dad065c 100644 --- a/code/cgame/FxUtil.cpp +++ b/code/cgame/FxUtil.cpp @@ -1137,7 +1137,7 @@ CPoly *FX_AddPoly( vec3_t *verts, vec2_t *st, int numVerts, for ( int i = 0; i < numVerts; i++ ) { VectorCopy( verts[i], fx->mOrg[i] ); - Vector2Copy( st[i], fx->mST[i] ); + VectorCopy2( st[i], fx->mST[i] ); } fx->SetVel( vel ); diff --git a/code/cgame/cg_effects.cpp b/code/cgame/cg_effects.cpp index 8c6afc41a5..bd58dc4fa1 100644 --- a/code/cgame/cg_effects.cpp +++ b/code/cgame/cg_effects.cpp @@ -874,7 +874,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl zz = z; } - Vector2Set( biPoints[0], xx, zz ); + VectorSet2( biPoints[0], xx, zz ); if ( t + 1 > 0 && t + 1 < mxWidth ) { @@ -894,7 +894,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl zz = z; } - Vector2Set( biPoints[1], xx + stepWidth, zz ); + VectorSet2( biPoints[1], xx + stepWidth, zz ); if ( t + 1 > 0 && t + 1 < mxWidth ) { @@ -914,7 +914,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl zz = z; } - Vector2Set( biPoints[2], xx + stepWidth, zz + stepHeight); + VectorSet2( biPoints[2], xx + stepWidth, zz + stepHeight); if ( t > 0 && t < mxWidth ) { @@ -934,7 +934,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl zz = z; } - Vector2Set( biPoints[3], xx, zz + stepHeight ); + VectorSet2( biPoints[3], xx, zz + stepHeight ); CG_CalcBiLerp( verts, subVerts, biPoints ); diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index c0fa06c4ef..fb0b6638d4 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -4862,10 +4862,10 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen tent.reType = RT_LATHE; // Setting up the 2d control points, these get swept around to make a 3D lathed model - Vector2Set( tent.axis[0], 0.5, 0 ); // start point of curve - Vector2Set( tent.axis[1], 50, 85 ); // control point 1 - Vector2Set( tent.axis[2], 135, -100 ); // control point 2 - Vector2Set( tent.oldorigin, 0, -90 ); // end point of curve + VectorSet2( tent.axis[0], 0.5, 0 ); // start point of curve + VectorSet2( tent.axis[1], 50, 85 ); // control point 1 + VectorSet2( tent.axis[2], 135, -100 ); // control point 2 + VectorSet2( tent.oldorigin, 0, -90 ); // end point of curve if ( gent->client->poisonTime && gent->client->poisonTime + 1000 > cg.time ) { diff --git a/code/rd-vanilla/tr_surface.cpp b/code/rd-vanilla/tr_surface.cpp index de693ea5d3..89982fde5b 100644 --- a/code/rd-vanilla/tr_surface.cpp +++ b/code/rd-vanilla/tr_surface.cpp @@ -1580,18 +1580,6 @@ void RB_SurfaceGrid( srfGridMesh_t *cv ) { } } -static inline void Vector2Set(vec2_t a,float b,float c) -{ - a[0] = b; - a[1] = c; -} - -static inline void Vector2Copy(vec2_t src,vec2_t dst) -{ - dst[0] = src[0]; - dst[1] = src[1]; -} - #define LATHE_SEG_STEP 10 #define BEZIER_STEP 0.05f // must be in the range of 0 to 1 @@ -1621,7 +1609,7 @@ static void RB_SurfaceLathe() pain = ( 1.0f - pain ) * 0.08f; } - Vector2Set( l_oldpt, e->axis[0][0], e->axis[0][1] ); + VectorSet2( l_oldpt, e->axis[0][0], e->axis[0][1] ); // do scalability stuff...r_lodbias 0-3 int lod = r_lodbias->integer + 1; @@ -1648,14 +1636,14 @@ static void RB_SurfaceLathe() l_oldpt2[i] = mum13 * e->axis[0][i] + group1 * e->axis[1][i] + group2 * e->axis[2][i] + mu3 * e->oldorigin[i]; } - Vector2Set( oldpt, l_oldpt[0], 0 ); - Vector2Set( oldpt2, l_oldpt2[0], 0 ); + VectorSet2( oldpt, l_oldpt[0], 0 ); + VectorSet2( oldpt2, l_oldpt2[0], 0 ); // lathe patch section around in a complete circle for ( t = latheStep; t <= 360; t += latheStep ) { - Vector2Set( pt, l_oldpt[0], 0 ); - Vector2Set( pt2, l_oldpt2[0], 0 ); + VectorSet2( pt, l_oldpt[0], 0 ); + VectorSet2( pt2, l_oldpt2[0], 0 ); s = sin( DEG2RAD( t )); c = cos( DEG2RAD( t )); @@ -1733,12 +1721,12 @@ static void RB_SurfaceLathe() tess.indexes[tess.numIndexes++] = vbase; // Shuffle new points to old - Vector2Copy( pt, oldpt ); - Vector2Copy( pt2, oldpt2 ); + VectorCopy2( pt, oldpt ); + VectorCopy2( pt2, oldpt2 ); } // shuffle lathe points - Vector2Copy( l_oldpt2, l_oldpt ); + VectorCopy2( l_oldpt2, l_oldpt ); } } @@ -1902,8 +1890,8 @@ static void RB_SurfaceClouds() tess.indexes[tess.numIndexes++] = vbase; // Shuffle new points to old - Vector2Copy( pt, oldpt ); - Vector2Copy( pt2, oldpt2 ); + VectorCopy2( pt, oldpt ); + VectorCopy2( pt2, oldpt2 ); } } } diff --git a/codeJK2/cgame/FxPrimitives.cpp b/codeJK2/cgame/FxPrimitives.cpp index a53dde92b7..9cda3a5991 100644 --- a/codeJK2/cgame/FxPrimitives.cpp +++ b/codeJK2/cgame/FxPrimitives.cpp @@ -1639,7 +1639,7 @@ void CPoly::Draw() verts[i].modulate[3] = mRefEnt.shaderRGBA[3]; // Copy the ST coords - Vector2Copy( mST[i], verts[i].st ); + VectorCopy2( mST[i], verts[i].st ); } // Add this poly diff --git a/codeJK2/cgame/FxSystem.h b/codeJK2/cgame/FxSystem.h index e1bd1df724..565e321f51 100644 --- a/codeJK2/cgame/FxSystem.h +++ b/codeJK2/cgame/FxSystem.h @@ -36,28 +36,8 @@ along with this program; if not, see . extern vmCvar_t fx_debug; extern vmCvar_t fx_freeze; -inline void Vector2Clear(vec2_t a) -{ - a[0] = 0.0f; - a[1] = 0.0f; -} - -inline void Vector2Set(vec2_t a,float b,float c) -{ - a[0] = b; - a[1] = c; -} - -inline void Vector2Copy(vec2_t src,vec2_t dst) -{ - dst[0] = src[0]; - dst[1] = src[1]; -} - - extern void CG_CalcEntityLerpPositions( centity_t * ); - struct SFxHelper { int mTime; diff --git a/codeJK2/cgame/FxUtil.cpp b/codeJK2/cgame/FxUtil.cpp index 436e115167..8df8097c86 100644 --- a/codeJK2/cgame/FxUtil.cpp +++ b/codeJK2/cgame/FxUtil.cpp @@ -1309,7 +1309,7 @@ CPoly *FX_AddPoly( vec3_t *verts, vec2_t *st, int numVerts, for ( int i = 0; i < numVerts; i++ ) { VectorCopy( verts[i], fx->mOrg[i] ); - Vector2Copy( st[i], fx->mST[i] ); + VectorCopy2( st[i], fx->mST[i] ); } fx->SetVel( vel ); diff --git a/codeJK2/cgame/cg_effects.cpp b/codeJK2/cgame/cg_effects.cpp index ddf80862b8..eb2dd990d6 100644 --- a/codeJK2/cgame/cg_effects.cpp +++ b/codeJK2/cgame/cg_effects.cpp @@ -842,7 +842,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl zz = z; } - Vector2Set( biPoints[0], xx, zz ); + VectorSet2( biPoints[0], xx, zz ); if ( t + 1 > 0 && t + 1 < mxWidth ) { @@ -862,7 +862,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl zz = z; } - Vector2Set( biPoints[1], xx + stepWidth, zz ); + VectorSet2( biPoints[1], xx + stepWidth, zz ); if ( t + 1 > 0 && t + 1 < mxWidth ) { @@ -882,7 +882,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl zz = z; } - Vector2Set( biPoints[2], xx + stepWidth, zz + stepHeight); + VectorSet2( biPoints[2], xx + stepWidth, zz + stepHeight); if ( t > 0 && t < mxWidth ) { @@ -902,7 +902,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl zz = z; } - Vector2Set( biPoints[3], xx, zz + stepHeight ); + VectorSet2( biPoints[3], xx, zz + stepHeight ); CG_CalcBiLerp( verts, subVerts, biPoints ); diff --git a/codeJK2/cgame/cg_players.cpp b/codeJK2/cgame/cg_players.cpp index 48ae0c4d2b..0c521cf646 100644 --- a/codeJK2/cgame/cg_players.cpp +++ b/codeJK2/cgame/cg_players.cpp @@ -3604,10 +3604,10 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen tent.reType = RT_LATHE; // Setting up the 2d control points, these get swept around to make a 3D lathed model - Vector2Set( tent.axis[0], 0.5, 0 ); // start point of curve - Vector2Set( tent.axis[1], 50, 85 ); // control point 1 - Vector2Set( tent.axis[2], 135, -100 ); // control point 2 - Vector2Set( tent.oldorigin, 0, -90 ); // end point of curve + VectorSet2( tent.axis[0], 0.5, 0 ); // start point of curve + VectorSet2( tent.axis[1], 50, 85 ); // control point 1 + VectorSet2( tent.axis[2], 135, -100 ); // control point 2 + VectorSet2( tent.oldorigin, 0, -90 ); // end point of curve if ( gent->client->poisonTime && gent->client->poisonTime + 1000 > cg.time ) { diff --git a/codemp/cgame/cg_effects.c b/codemp/cgame/cg_effects.c index 03defa5061..3a1cee61b8 100644 --- a/codemp/cgame/cg_effects.c +++ b/codemp/cgame/cg_effects.c @@ -425,12 +425,6 @@ void CG_InitGlass( void ) } } -void Vector2Set(vec2_t a,float b,float c) -{ - a[0] = b; - a[1] = c; -} - #define TIME_DECAY_SLOW 0.1f #define TIME_DECAY_MED 0.04f #define TIME_DECAY_FAST 0.009f @@ -538,7 +532,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl zz = z; } - Vector2Set( biPoints[0], xx, zz ); + VectorSet2( biPoints[0], xx, zz ); if ( t + 1 > 0 && t + 1 < mxWidth ) { @@ -558,7 +552,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl zz = z; } - Vector2Set( biPoints[1], xx + stepWidth, zz ); + VectorSet2( biPoints[1], xx + stepWidth, zz ); if ( t + 1 > 0 && t + 1 < mxWidth ) { @@ -578,7 +572,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl zz = z; } - Vector2Set( biPoints[2], xx + stepWidth, zz + stepHeight); + VectorSet2( biPoints[2], xx + stepWidth, zz + stepHeight); if ( t > 0 && t < mxWidth ) { @@ -598,7 +592,7 @@ void CG_DoGlass( vec3_t verts[4], vec3_t normal, vec3_t dmgPt, vec3_t dmgDir, fl zz = z; } - Vector2Set( biPoints[3], xx, zz + stepHeight ); + VectorSet2( biPoints[3], xx, zz + stepHeight ); CG_CalcBiLerp( verts, subVerts, biPoints ); diff --git a/codemp/client/FxPrimitives.cpp b/codemp/client/FxPrimitives.cpp index 38818ae6c9..1497924f6a 100644 --- a/codemp/client/FxPrimitives.cpp +++ b/codemp/client/FxPrimitives.cpp @@ -1815,7 +1815,7 @@ void CPoly::Draw(void) verts[i].modulate[k] = mRefEnt.shaderRGBA[k]; // Copy the ST coords - Vector2Copy( mST[i], verts[i].st ); + VectorCopy2( mST[i], verts[i].st ); } // Add this poly diff --git a/codemp/client/FxScheduler.cpp b/codemp/client/FxScheduler.cpp index 215a1c7f78..15a3ecce5c 100644 --- a/codemp/client/FxScheduler.cpp +++ b/codemp/client/FxScheduler.cpp @@ -928,7 +928,7 @@ void CFxScheduler::PlayEffect( int id, vec3_t origin, matrix3_t axis, const int if ( sfx == NULL ) { - Com_Error (ERR_DROP, "ERROR: Failed to allocate EFX from memory pool.\n"); + Com_Error (ERR_DROP, "ERROR: Failed to allocate EFX from memory pool."); return; } diff --git a/codemp/client/FxSystem.cpp b/codemp/client/FxSystem.cpp index 79fb2f83d0..f54d9915f2 100644 --- a/codemp/client/FxSystem.cpp +++ b/codemp/client/FxSystem.cpp @@ -36,7 +36,7 @@ cvar_t *fx_nearCull; // Stuff for the FxHelper //------------------------------------------------------ -SFxHelper::SFxHelper(void) : +SFxHelper::SFxHelper() : mTime(0), mOldTime(0), mFrameTime(0), diff --git a/codemp/client/FxSystem.h b/codemp/client/FxSystem.h index 38ea37d656..d42750ffa9 100644 --- a/codemp/client/FxSystem.h +++ b/codemp/client/FxSystem.h @@ -34,36 +34,6 @@ extern cvar_t *fx_freeze; extern cvar_t *fx_countScale; extern cvar_t *fx_nearCull; -inline void Vector2Clear(vec2_t a) -{ - a[0] = 0.0f; - a[1] = 0.0f; -} - -inline void Vector2Set(vec2_t a,float b,float c) -{ - a[0] = b; - a[1] = c; -} - -inline void Vector2Copy(vec2_t src,vec2_t dst) -{ - dst[0] = src[0]; - dst[1] = src[1]; -} - -inline void Vector2MA(vec2_t src, float m, vec2_t v, vec2_t dst) -{ - dst[0] = src[0] + (m*v[0]); - dst[1] = src[1] + (m*v[1]); -} - -inline void Vector2Scale(vec2_t src,float b,vec2_t dst) -{ - dst[0] = src[0] * b; - dst[1] = src[1] * b; -} - class SFxHelper { public: @@ -79,7 +49,7 @@ class SFxHelper #endif public: - SFxHelper(void); + SFxHelper(); inline int GetTime(void) { return mTime; } inline int GetFrameTime(void) { return mFrameTime; } diff --git a/codemp/client/FxUtil.cpp b/codemp/client/FxUtil.cpp index f98e87e93c..ca709d0075 100644 --- a/codemp/client/FxUtil.cpp +++ b/codemp/client/FxUtil.cpp @@ -1037,7 +1037,7 @@ CPoly *FX_AddPoly( vec3_t *verts, vec2_t *st, int numVerts, for ( int i = 0; i < numVerts; i++ ) { VectorCopy( verts[i], fx->mOrg[i] ); - Vector2Copy( st[i], fx->mST[i] ); + VectorCopy2( st[i], fx->mST[i] ); } fx->SetVel( vel ); diff --git a/shared/qcommon/q_math.c b/shared/qcommon/q_math.c index 7401bb6d09..b15b3dbaf4 100644 --- a/shared/qcommon/q_math.c +++ b/shared/qcommon/q_math.c @@ -1016,6 +1016,54 @@ void AnglesToAxis( const vec3_t angles, matrix3_t axis ) { } +/////////////////////////////////////////////////////////////////////////// +// +// VEC2 +// +/////////////////////////////////////////////////////////////////////////// +vec2_t vec2_zero = {0,0}; + +void VectorAdd2( const vec2_t vec1, const vec2_t vec2, vec2_t vecOut ) +{ + vecOut[0] = vec1[0]+vec2[0]; + vecOut[1] = vec1[1]+vec2[1]; +} + +void VectorSubtract2( const vec2_t vec1, const vec2_t vec2, vec2_t vecOut ) +{ + vecOut[0] = vec1[0]-vec2[0]; + vecOut[1] = vec1[1]-vec2[1]; +} + +void VectorScale2( const vec2_t vecIn, float scale, vec2_t vecOut ) +{ + vecOut[0] = vecIn[0]*scale; + vecOut[1] = vecIn[1]*scale; +} + +void VectorMA2( const vec2_t vec1, float scale, const vec2_t vec2, vec2_t vecOut ) +{ + vecOut[0] = vec1[0] + scale*vec2[0]; + vecOut[1] = vec1[1] + scale*vec2[1]; +} + +void VectorSet2( vec2_t vec, float x, float y ) +{ + vec[0]=x; vec[1]=y; +} + +void VectorClear2( vec2_t vec ) +{ + vec[0] = vec[1] = 0.0f; +} + +void VectorCopy2( const vec2_t vecIn, vec2_t vecOut ) +{ + vecOut[0] = vecIn[0]; + vecOut[1] = vecIn[1]; +} + + /////////////////////////////////////////////////////////////////////////// // // VEC3 diff --git a/shared/qcommon/q_math.h b/shared/qcommon/q_math.h index e4399d65da..74cbefbebe 100644 --- a/shared/qcommon/q_math.h +++ b/shared/qcommon/q_math.h @@ -199,6 +199,31 @@ void AxisCopy( matrix3_t in, matrix3_t out ); void AnglesToAxis( const vec3_t angles, matrix3_t axis ); +/////////////////////////////////////////////////////////////////////////// +// +// VEC2 +// +/////////////////////////////////////////////////////////////////////////// +extern vec2_t vec3_zero; + +#define VectorScale2M(v, factor, dst) \ + (dst)[0] = (v[0]) * (factor), \ + (dst)[1] = (v[1]) * (factor) +#define VectorCopy2M(src, dst) \ + (dst)[0] = (src[0]), \ + (dst)[1] = (src[1]) +#define VectorClear2M(dst) \ + memset((dst), 0, sizeof((dst)[0]) * 2) + +void VectorAdd2( const vec2_t vec1, const vec2_t vec2, vec2_t vecOut ); +void VectorSubtract2( const vec2_t vec1, const vec2_t vec2, vec2_t vec2_t ); +void VectorScale2( const vec2_t vecIn, float scale, vec2_t vecOut ); +void VectorMA2( const vec2_t vec1, float scale, const vec2_t vec2, vec2_t vecOut ); +void VectorSet2( vec2_t vec, float x, float y ); +void VectorClear2( vec2_t vec ); +void VectorCopy2( const vec2_t vecIn, vec2_t vecOut ); + + /////////////////////////////////////////////////////////////////////////// // // VEC3 From abd4b5263a4dc404057ab00afcdd991f188828bc Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sun, 2 Oct 2016 22:14:16 -0500 Subject: [PATCH 340/445] MP: Make the shared common files appear in the visual studio projects for multiplayer client and dedicated server. --- codemp/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/codemp/CMakeLists.txt b/codemp/CMakeLists.txt index df471face6..2bd4aa4028 100644 --- a/codemp/CMakeLists.txt +++ b/codemp/CMakeLists.txt @@ -255,6 +255,8 @@ if(BuildMPEngine OR BuildMPDed) "${MPDir}/qcommon/timing.h" "${MPDir}/qcommon/vm.cpp" "${MPDir}/qcommon/z_memman_pc.cpp" + + ${SharedCommonFiles} ) if(WIN32) set(MPEngineAndDedCommonFiles ${MPEngineAndDedCommonFiles}) From 91bcc2897ee08dab0f250520d03c0594b8a2d4bb Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 9 Oct 2016 13:04:48 +0300 Subject: [PATCH 341/445] SG: Fix compiling errors and warnings --- code/game/G_Timer.cpp | 4 ++-- code/game/Q3_Interface.cpp | 10 +++++----- code/game/g_roff.cpp | 4 ++-- code/game/g_savegame.cpp | 4 ++-- code/game/g_vehicles.h | 4 ++-- code/icarus/IcarusImplementation.cpp | 2 +- code/qcommon/ojk_saved_game.cpp | 2 +- code/qcommon/ojk_saved_game_helper.h | 2 -- code/qcommon/ojk_saved_game_helper_fwd.h | 4 ++-- code/rd-vanilla/G2_misc.cpp | 5 +++++ code/server/sv_savegame.cpp | 6 +++--- codeJK2/game/G_Timer.cpp | 4 ++-- codeJK2/game/Q3_Registers.cpp | 10 +++++----- codeJK2/game/g_roff.cpp | 2 +- codeJK2/game/g_savegame.cpp | 4 ++-- codeJK2/icarus/Instance.cpp | 10 +++++----- codeJK2/icarus/Sequence.cpp | 12 +++++++++--- codeJK2/icarus/Sequencer.cpp | 4 ++-- codeJK2/icarus/TaskManager.cpp | 14 +++++++------- shared/sys/sys_win32.cpp | 2 +- 20 files changed, 59 insertions(+), 50 deletions(-) diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index 90f2e87caa..d72f5259fe 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -222,7 +222,7 @@ void TIMER_Load( void ) for ( j = 0, ent = &g_entities[0]; j < MAX_GENTITIES; j++, ent++ ) { - unsigned char numTimers; + unsigned char numTimers = 0; saved_game.read_chunk( INT_ID('T', 'I', 'M', 'E'), @@ -231,7 +231,7 @@ void TIMER_Load( void ) //Read back all entries for ( int i = 0; i < numTimers; i++ ) { - int time; + int time = 0; char tempBuffer[1024]; // Still ugly. Setting ourselves up for 007 AUF all over again. =) assert (sizeof(g_timers[0]->time) == sizeof(time) );//make sure we're reading the same size as we wrote diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index d589472485..56feeeb015 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -7308,7 +7308,7 @@ VariableLoadFloats void CQuake3GameInterface::VariableLoadFloats( varFloat_m &fmap ) { - int numFloats; + int numFloats = 0; char tempBuffer[1024]; ojk::SavedGameHelper saved_game( @@ -7320,7 +7320,7 @@ void CQuake3GameInterface::VariableLoadFloats( varFloat_m &fmap ) for ( int i = 0; i < numFloats; i++ ) { - int idSize; + int idSize = 0; saved_game.read_chunk( INT_ID('F', 'I', 'D', 'L'), @@ -7333,7 +7333,7 @@ void CQuake3GameInterface::VariableLoadFloats( varFloat_m &fmap ) tempBuffer[ idSize ] = 0; - float val; + float val = 0.0F; saved_game.read_chunk( INT_ID('F', 'V', 'A', 'L'), @@ -7352,7 +7352,7 @@ VariableLoadStrings void CQuake3GameInterface::VariableLoadStrings( int type, varString_m &fmap ) { - int numFloats; + int numFloats = 0; char tempBuffer[1024]; char tempBuffer2[1024]; @@ -7365,7 +7365,7 @@ void CQuake3GameInterface::VariableLoadStrings( int type, varString_m &fmap ) for ( int i = 0; i < numFloats; i++ ) { - int idSize; + int idSize = 0; saved_game.read_chunk( INT_ID('S', 'I', 'D', 'L'), diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp index 84e2599130..fe1f79fa2d 100644 --- a/code/game/g_roff.cpp +++ b/code/game/g_roff.cpp @@ -649,7 +649,7 @@ void G_Roff( gentity_t *ent ) void G_SaveCachedRoffs() { - int i, len; + int i, len = 0; ojk::SavedGameHelper saved_game( ::gi.saved_game); @@ -685,7 +685,7 @@ void G_SaveCachedRoffs() void G_LoadCachedRoffs() { - int i, count, len; + int i, count = 0, len = 0; char buffer[MAX_QPATH]; ojk::SavedGameHelper saved_game( diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index 24b5d789bf..ca27583982 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -989,7 +989,7 @@ static void WriteGEntities(qboolean qbAutosave) static void ReadGEntities(qboolean qbAutosave) { - int iCount; + int iCount = 0; int i; ojk::SavedGameHelper saved_game( @@ -1002,7 +1002,7 @@ static void ReadGEntities(qboolean qbAutosave) int iPreviousEntRead = -1; for (i=0; i( INT_ID('E', 'D', 'N', 'M'), diff --git a/code/game/g_vehicles.h b/code/game/g_vehicles.h index 3c74a1fbd4..6296e0deea 100644 --- a/code/game/g_vehicles.h +++ b/code/game/g_vehicles.h @@ -693,7 +693,7 @@ struct Vehicle_t float m_safeJumpMountRightDot; - void Vehicle_t::sg_export( + void sg_export( ojk::SavedGameHelper& saved_game) const { saved_game.write(m_pPilot); @@ -740,7 +740,7 @@ struct Vehicle_t saved_game.write(m_safeJumpMountRightDot); } - void Vehicle_t::sg_import( + void sg_import( ojk::SavedGameHelper& saved_game) { saved_game.read(m_pPilot); diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index ad66f77ac5..26004b3b4a 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -695,7 +695,7 @@ int CIcarus::Load() Free(); //Check to make sure we're at the ICARUS save block - double version; + double version = 0.0; saved_game.read_chunk( INT_ID('I', 'C', 'A', 'R'), diff --git a/code/qcommon/ojk_saved_game.cpp b/code/qcommon/ojk_saved_game.cpp index 79704a0a01..bd275997c1 100644 --- a/code/qcommon/ojk_saved_game.cpp +++ b/code/qcommon/ojk_saved_game.cpp @@ -340,7 +340,7 @@ bool SavedGame::read_chunk( ref_chunk_size += sizeof(loaded_magic_value); #endif - if (loaded_chunk_size != ref_chunk_size) + if (loaded_chunk_size != static_cast(ref_chunk_size)) { is_failed_ = true; diff --git a/code/qcommon/ojk_saved_game_helper.h b/code/qcommon/ojk_saved_game_helper.h index bab0227618..280cd0e277 100644 --- a/code/qcommon/ojk_saved_game_helper.h +++ b/code/qcommon/ojk_saved_game_helper.h @@ -312,8 +312,6 @@ bool SavedGameHelper::try_read( TDst& dst_value, BooleanTag) { - constexpr int src_size = static_cast(sizeof(TSrc)); - TSrc src_value; if (!saved_game_->read( diff --git a/code/qcommon/ojk_saved_game_helper_fwd.h b/code/qcommon/ojk_saved_game_helper_fwd.h index 6c065592f1..b36b674021 100644 --- a/code/qcommon/ojk_saved_game_helper_fwd.h +++ b/code/qcommon/ojk_saved_game_helper_fwd.h @@ -302,7 +302,7 @@ class SavedGameClassArchiver static_cast(saved_game); static_cast(instance); - static_assert(false, "Not implemented."); + throw "Not implemented."; } static void sg_import( @@ -312,7 +312,7 @@ class SavedGameClassArchiver static_cast(saved_game); static_cast(instance); - static_assert(false, "Not implemented."); + throw "Not implemented."; } }; diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index 5d0b0fa748..9a6162fabf 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -573,7 +573,10 @@ void G2_TransformModel(CGhoul2Info_v &ghoul2, const int frameNum, vec3_t scale, { int i, lod; vec3_t correctScale; + +#if !defined(JK2_MODE) || defined(_G2_GORE) qboolean firstModelOnly = qfalse; +#endif // !JK2_MODE || _G2_GORE #ifndef JK2_MODE if ( cg_g2MarksAllModels == NULL ) @@ -1560,7 +1563,9 @@ void G2_TraceModels(CGhoul2Info_v &ghoul2, vec3_t rayStart, vec3_t rayEnd, CColl int i, lod; skin_t *skin; shader_t *cust_shader; +#if !defined(JK2_MODE) || defined(_G2_GORE) qboolean firstModelOnly = qfalse; +#endif // !JK2_MODE || _G2_GORE int firstModel = 0; #ifndef JK2_MODE diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 053196d3cc..1f49def9f1 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -574,7 +574,7 @@ void SG_WriteCvars(void) void SG_ReadCvars() { - int iCount; + int iCount = 0; std::string psName; const char* psValue; @@ -668,7 +668,7 @@ void SG_ReadServerConfigStrings( void ) // now read the replacement ones... // - int iCount; + int iCount = 0; ojk::SavedGameHelper saved_game( &ojk::SavedGame::get_instance()); @@ -681,7 +681,7 @@ void SG_ReadServerConfigStrings( void ) for (int i = 0; i( diff --git a/codeJK2/game/G_Timer.cpp b/codeJK2/game/G_Timer.cpp index 36d634186c..b074b6a35c 100644 --- a/codeJK2/game/G_Timer.cpp +++ b/codeJK2/game/G_Timer.cpp @@ -232,7 +232,7 @@ void TIMER_Load( void ) for ( j = 0, ent = &g_entities[0]; j < MAX_GENTITIES; j++, ent++ ) { - int numTimers; + int numTimers = 0; saved_game.read_chunk( INT_ID('T', 'I', 'M', 'E'), @@ -245,7 +245,7 @@ void TIMER_Load( void ) //Read back all entries for ( int i = 0; i < numTimers; i++ ) { - int length, time; + int length = 0, time = 0; char tempBuffer[1024]; // Still ugly. Setting ourselves up for 007 AUF all over again. =) assert (sizeof(g_timers[0]->time) == sizeof(time) );//make sure we're reading the same size as we wrote diff --git a/codeJK2/game/Q3_Registers.cpp b/codeJK2/game/Q3_Registers.cpp index c91e73adb9..7797b5f1e2 100644 --- a/codeJK2/game/Q3_Registers.cpp +++ b/codeJK2/game/Q3_Registers.cpp @@ -390,7 +390,7 @@ Q3_VariableLoadFloats void Q3_VariableLoadFloats( varFloat_m &fmap ) { - int numFloats; + int numFloats = 0; char tempBuffer[1024]; ojk::SavedGameHelper saved_game( @@ -402,7 +402,7 @@ void Q3_VariableLoadFloats( varFloat_m &fmap ) for ( int i = 0; i < numFloats; i++ ) { - int idSize; + int idSize = 0; saved_game.read_chunk( INT_ID('F', 'I', 'D', 'L'), @@ -415,7 +415,7 @@ void Q3_VariableLoadFloats( varFloat_m &fmap ) tempBuffer[ idSize ] = 0; - float val; + float val = 0.0F; saved_game.read_chunk( INT_ID('F', 'V', 'A', 'L'), @@ -434,7 +434,7 @@ Q3_VariableLoadStrings void Q3_VariableLoadStrings( int type, varString_m &fmap ) { - int numFloats; + int numFloats = 0; char tempBuffer[1024]; char tempBuffer2[1024]; @@ -447,7 +447,7 @@ void Q3_VariableLoadStrings( int type, varString_m &fmap ) for ( int i = 0; i < numFloats; i++ ) { - int idSize; + int idSize = 0; saved_game.read_chunk( INT_ID('S', 'I', 'D', 'L'), diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp index 24fe2aced5..7eb1bd15c8 100644 --- a/codeJK2/game/g_roff.cpp +++ b/codeJK2/game/g_roff.cpp @@ -660,7 +660,7 @@ void G_SaveCachedRoffs() void G_LoadCachedRoffs() { - int i, count, len; + int i, count = 0, len = 0; char buffer[MAX_QPATH]; ojk::SavedGameHelper saved_game( diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index 200f4f1316..672f6de4ba 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -762,7 +762,7 @@ static void WriteGEntities(qboolean qbAutosave) static void ReadGEntities(qboolean qbAutosave) { - int iCount; + int iCount = 0; int i; ojk::SavedGameHelper saved_game( @@ -775,7 +775,7 @@ static void ReadGEntities(qboolean qbAutosave) int iPreviousEntRead = -1; for (i=0; i( INT_ID('E', 'D', 'N', 'M'), diff --git a/codeJK2/icarus/Instance.cpp b/codeJK2/icarus/Instance.cpp index 7f84f77d7e..7aec690b14 100644 --- a/codeJK2/icarus/Instance.cpp +++ b/codeJK2/icarus/Instance.cpp @@ -473,7 +473,7 @@ LoadSignals int ICARUS_Instance::LoadSignals( void ) { - int numSignals; + int numSignals = 0; ojk::SavedGameHelper saved_game( m_interface->saved_game); @@ -485,7 +485,7 @@ int ICARUS_Instance::LoadSignals( void ) for ( int i = 0; i < numSignals; i++ ) { char buffer[1024]; - int length; + int length = 0; //Get the size of the string saved_game.read_chunk( @@ -536,7 +536,7 @@ LoadSequence int ICARUS_Instance::LoadSequences( void ) { CSequence *sequence; - int numSequences; + int numSequences = 0; ojk::SavedGameHelper saved_game( m_interface->saved_game); @@ -588,7 +588,7 @@ LoadSequencers int ICARUS_Instance::LoadSequencers( void ) { CSequencer *sequencer; - int numSequencers; + int numSequencers = 0; ojk::SavedGameHelper saved_game( m_interface->saved_game); @@ -624,7 +624,7 @@ int ICARUS_Instance::Load( void ) Free(); //Check to make sure we're at the ICARUS save block - double version; + double version = 0.0; ojk::SavedGameHelper saved_game( m_interface->saved_game); diff --git a/codeJK2/icarus/Sequence.cpp b/codeJK2/icarus/Sequence.cpp index 5f3a03a4d7..325984eee2 100644 --- a/codeJK2/icarus/Sequence.cpp +++ b/codeJK2/icarus/Sequence.cpp @@ -473,10 +473,10 @@ Load int CSequence::Load( void ) { - unsigned char flags; + unsigned char flags = 0; CSequence *sequence; CBlock *block; - int id, numMembers; + int id = 0, numMembers = 0; int i; int bID, bSize; @@ -560,6 +560,8 @@ int CSequence::Load( void ) block->SetFlags( flags ); + numMembers = 0; + //Get the number of block members saved_game.read_chunk( INT_ID('B', 'N', 'U', 'M'), @@ -567,11 +569,15 @@ int CSequence::Load( void ) for ( int j = 0; j < numMembers; j++ ) { + bID = 0; + //Get the member ID saved_game.read_chunk( INT_ID('B', 'M', 'I', 'D'), bID); - + + bSize = 0; + //Get the member size saved_game.read_chunk( INT_ID('B', 'S', 'I', 'Z'), diff --git a/codeJK2/icarus/Sequencer.cpp b/codeJK2/icarus/Sequencer.cpp index 22edc5a909..fb6f3db1d9 100644 --- a/codeJK2/icarus/Sequencer.cpp +++ b/codeJK2/icarus/Sequencer.cpp @@ -2424,7 +2424,7 @@ int CSequencer::Load( void ) CTaskGroup *taskGroup; CSequence *seq; - int numSequences, seqID, taskID, numTasks; + int numSequences = 0, seqID = 0, taskID = 0, numTasks = 0; //Get the number of sequences to read saved_game.read_chunk( @@ -2482,7 +2482,7 @@ int CSequencer::Load( void ) m_taskSequences[ taskGroup ] = seq; } - int curGroupID; + int curGroupID = 0; //Get the current task group saved_game.read_chunk( diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index 83ea2565e7..feb0014b33 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -1876,15 +1876,15 @@ Load void CTaskManager::Load( void ) { - unsigned char flags; + unsigned char flags = 0; CTaskGroup *taskGroup; CBlock *block; CTask *task; - uint32_t timeStamp; - bool completed; + uint32_t timeStamp = 0; + bool completed = false; void *bData; - int id, numTasks, numMembers; - int bID, bSize; + int id = 0, numTasks = 0, numMembers = 0; + int bID = 0, bSize = 0; int i; ojk::SavedGameHelper saved_game( @@ -2018,7 +2018,7 @@ void CTaskManager::Load( void ) } //Load the task groups - int numTaskGroups; + int numTaskGroups = 0; saved_game.read_chunk( INT_ID('T', 'G', '#', 'G'), @@ -2101,7 +2101,7 @@ void CTaskManager::Load( void ) for ( i = 0; i < numTaskGroups; i++ ) { char name[1024]; - int length; + int length = 0; //Get the size of the string saved_game.read_chunk( diff --git a/shared/sys/sys_win32.cpp b/shared/sys/sys_win32.cpp index 23b79c729e..53ca529fbf 100644 --- a/shared/sys/sys_win32.cpp +++ b/shared/sys/sys_win32.cpp @@ -167,7 +167,7 @@ char *Sys_DefaultHomePath( void ) if( !SUCCEEDED( SHGetFolderPath( NULL, CSIDL_PERSONAL, NULL, 0, homeDirectory ) ) ) { Com_Printf( "Unable to determine your home directory.\n" ); - return false; + return NULL; } Com_sprintf( homePath, sizeof( homePath ), "%s%cMy Games%c", homeDirectory, PATH_SEP, PATH_SEP ); From 0a268e7d9f65bf3ce21aa7639ffbfbddad8f594d Mon Sep 17 00:00:00 2001 From: bibendovsky Date: Sun, 9 Oct 2016 17:41:17 +0300 Subject: [PATCH 342/445] SG: Fix compiling warnings --- code/server/sv_savegame.cpp | 2 +- codeJK2/icarus/Sequence.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/server/sv_savegame.cpp b/code/server/sv_savegame.cpp index 1f49def9f1..f9191e2903 100644 --- a/code/server/sv_savegame.cpp +++ b/code/server/sv_savegame.cpp @@ -453,7 +453,7 @@ static void WriteGame(qboolean autosave) static qboolean ReadGame (void) { - qboolean qbAutoSave; + qboolean qbAutoSave = qfalse; ojk::SavedGameHelper saved_game( &ojk::SavedGame::get_instance()); diff --git a/codeJK2/icarus/Sequence.cpp b/codeJK2/icarus/Sequence.cpp index 325984eee2..f2ab7507e4 100644 --- a/codeJK2/icarus/Sequence.cpp +++ b/codeJK2/icarus/Sequence.cpp @@ -534,7 +534,7 @@ int CSequence::Load( void ) INT_ID('S', 'I', 'T', 'R'), m_iterations); - int numCommands; + int numCommands = 0; //Get the number of commands saved_game.read_chunk( From 7d52f7d16ec4a0e19fc78b16829ca7bc9848d087 Mon Sep 17 00:00:00 2001 From: Alex Lo Date: Wed, 19 Oct 2016 19:32:27 +0100 Subject: [PATCH 343/445] Refine the appveyor config a bit --- appveyor.yml | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index a0e95b7171..8b39d12e76 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -10,11 +10,11 @@ shallow_clone: true #GitHub specific (ignores clone_depth) #do not build on tags skip_tags: true -os: Visual Studio 2015 # Windows Server 2012 +os: Visual Studio 2013 environment: - VisualStudioVersion: "14.0" - CMAKE_GENERATOR: "Visual Studio 14 2015" + VisualStudioVersion: "12.0" + CMAKE_GENERATOR: "Visual Studio 12 2013" matrix: - CMAKE_BUILD_TYPE: "Debug" - CMAKE_BUILD_TYPE: "Release" @@ -27,7 +27,7 @@ platform: - x64 configuration: - #- Debug + - Debug - Release #scripts that are called at very beginning, before repo cloning @@ -58,15 +58,11 @@ before_build: - cmd: cd build - cmd: cmake -G "%CMAKE_GENERATOR%" "-DCMAKE_BUILD_TYPE=%CMAKE_BUILD_TYPE%" "%APPVEYOR_BUILD_FOLDER%" - cmd: ls - #- mkdir ..\nmakebuild - #- cd ..\nmakebuild - #- cmd: cmake -G "NMake Makefiles" "-DCMAKE_BUILD_TYPE=%CMAKE_BUILD_TYPE%" "%APPVEYOR_BUILD_FOLDER%" - #- cmd: ls build: parallel: true project: C:\projects\OpenJK\build\OpenJK.sln - verbosity: minimal #quiet|minimal|normal|detailed + verbosity: normal #scripts to run after build after_build: From f9f8dfaec22965c21052c4e71b02de28d90ab069 Mon Sep 17 00:00:00 2001 From: Alex Lo Date: Wed, 19 Oct 2016 19:35:28 +0100 Subject: [PATCH 344/445] Don't specify CMAKE_BUILD_TYPE in a matrix CMAKE_BUILD_TYPE is unused for multi-configuration MSVC project files. --- appveyor.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 8b39d12e76..4b48b9637b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,9 +15,6 @@ os: Visual Studio 2013 environment: VisualStudioVersion: "12.0" CMAKE_GENERATOR: "Visual Studio 12 2013" - matrix: - - CMAKE_BUILD_TYPE: "Debug" - - CMAKE_BUILD_TYPE: "Release" matrix: fast_finish: false #finish build once one of the jobs fails From c0f6ba665f2466d1a29b475e423134a03a5659d6 Mon Sep 17 00:00:00 2001 From: Alex Lo Date: Wed, 19 Oct 2016 19:37:08 +0100 Subject: [PATCH 345/445] Delete use of CMAKE_BUILD_TYPE from appveyor.yml --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 4b48b9637b..62a112e887 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -48,12 +48,12 @@ before_build: - cmd: cd %APPVEYOR_BUILD_FOLDER% #- set #debug: view all environment variables - cmd: if "%Platform%"=="x64" set "CMAKE_GENERATOR=%CMAKE_GENERATOR% Win64" - - cmd: echo "Generator='%CMAKE_GENERATOR%', CMAKE_BUILD_TYPE='%CMAKE_BUILD_TYPE%'" + - cmd: echo "Generator='%CMAKE_GENERATOR%'" - cmd: echo "Platform='%Platform%'" - cmd: if exist build rmdir /q /s build #remove build dir - mkdir build - cmd: cd build - - cmd: cmake -G "%CMAKE_GENERATOR%" "-DCMAKE_BUILD_TYPE=%CMAKE_BUILD_TYPE%" "%APPVEYOR_BUILD_FOLDER%" + - cmd: cmake -G "%CMAKE_GENERATOR%" "%APPVEYOR_BUILD_FOLDER%" - cmd: ls build: From f4ddf75fe9f3221eefde31f49affc23bc6a8a455 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Thu, 20 Oct 2016 20:00:29 -0500 Subject: [PATCH 346/445] SP: Cleanup g_svcmds.cpp a bit Made this file more C++11 compliant. Added linear search list for commands to cleanup the clusterfuck of ConsoleCommand Function. SetForceAll will only give all saberstyles if you specify an argument. playerTeam command now tells you your current team when no arguments are specified. Added `secrets` command to tell the player how many secrets have been found out of the total. Added stub `difficulty` command with different cvar options between each difficulty listed in comments. Added possibility to check for if player is alive but none currently use this feature. --- code/cgame/cg_servercmds.cpp | 2 +- code/game/g_svcmds.cpp | 628 +++++++++++++++-------------------- code/qcommon/q_shared.cpp | 24 ++ code/qcommon/q_shared.h | 9 + 4 files changed, 297 insertions(+), 366 deletions(-) diff --git a/code/cgame/cg_servercmds.cpp b/code/cgame/cg_servercmds.cpp index 30d19ebb14..9875caf623 100644 --- a/code/cgame/cg_servercmds.cpp +++ b/code/cgame/cg_servercmds.cpp @@ -203,7 +203,7 @@ typedef struct serverCommand_s { void (*func)(void); } serverCommand_t; -int svcmdcmp( const void *a, const void *b ) { +static int svcmdcmp( const void *a, const void *b ) { return Q_stricmp( (const char *)a, ((serverCommand_t*)b)->cmd ); } diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index 9473d17018..475701d6c3 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -557,31 +557,31 @@ void Svcmd_SaberAttackCycle_f( void ) switch ( saberAnimLevel ) { case SS_FAST: - gi.Printf( S_COLOR_BLUE"Lightsaber Combat Style: Fast\n" ); + gi.Printf( S_COLOR_BLUE "Lightsaber Combat Style: Fast\n" ); //LIGHTSABERCOMBATSTYLE_FAST break; case SS_MEDIUM: - gi.Printf( S_COLOR_YELLOW"Lightsaber Combat Style: Medium\n" ); + gi.Printf( S_COLOR_YELLOW "Lightsaber Combat Style: Medium\n" ); //LIGHTSABERCOMBATSTYLE_MEDIUM break; case SS_STRONG: - gi.Printf( S_COLOR_RED"Lightsaber Combat Style: Strong\n" ); + gi.Printf( S_COLOR_RED "Lightsaber Combat Style: Strong\n" ); //LIGHTSABERCOMBATSTYLE_STRONG break; case SS_DESANN: - gi.Printf( S_COLOR_CYAN"Lightsaber Combat Style: Desann\n" ); + gi.Printf( S_COLOR_CYAN "Lightsaber Combat Style: Desann\n" ); //LIGHTSABERCOMBATSTYLE_DESANN break; case SS_TAVION: - gi.Printf( S_COLOR_MAGENTA"Lightsaber Combat Style: Tavion\n" ); + gi.Printf( S_COLOR_MAGENTA "Lightsaber Combat Style: Tavion\n" ); //LIGHTSABERCOMBATSTYLE_TAVION break; case SS_DUAL: - gi.Printf( S_COLOR_MAGENTA"Lightsaber Combat Style: Dual\n" ); + gi.Printf( S_COLOR_MAGENTA "Lightsaber Combat Style: Dual\n" ); //LIGHTSABERCOMBATSTYLE_TAVION break; case SS_STAFF: - gi.Printf( S_COLOR_MAGENTA"Lightsaber Combat Style: Staff\n" ); + gi.Printf( S_COLOR_MAGENTA" Lightsaber Combat Style: Staff\n" ); //LIGHTSABERCOMBATSTYLE_TAVION break; } @@ -622,437 +622,335 @@ void G_GrabEntity( gentity_t *grabber, const char *target ) } } -/* -================= -ConsoleCommand -================= -*/ -qboolean ConsoleCommand( void ) { - const char *cmd; +static void Svcmd_ICARUS_f( void ) +{ + Quake3Game()->Svcmd(); +} - cmd = gi.argv(0); +template +static void Svcmd_ForceSetLevel_f(void) +{ + Svcmd_ForceSetLevel_f(power); +} - if ( Q_stricmp (cmd, "entitylist") == 0 ) +static void Svcmd_SetForceAll_f(void) +{ + for ( int i = FP_HEAL; i < NUM_FORCE_POWERS; i++ ) { - Svcmd_EntityList_f(); - return qtrue; + Svcmd_ForceSetLevel_f( i ); } - if (Q_stricmp (cmd, "game_memory") == 0) { - Svcmd_GameMem_f(); - return qtrue; - } - - if (Q_stricmp (cmd, "nav") == 0) + if( gi.argc() > 1 ) { - if ( !g_cheats->integer ) + for ( int i = SS_NONE+1; i < SS_NUM_SABER_STYLES; i++ ) { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; + g_entities[0].client->ps.saberStylesKnown |= (1<integer ) - { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; - } - Svcmd_NPC_f (); - return qtrue; + g_entities[0].client->ps.saberStylesKnown |= (1<integer ) + const char *cmd3 = gi.argv(2); + if ( cmd3 && cmd3[0] ) { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; + gentity_t *found = NULL; + if ( (found = G_Find(NULL, FOFS(targetname), cmd2 ) ) != NULL ) + { + Quake3Game()->RunScript( found, cmd3 ); + } + else + { + //can't find cmd2 + gi.Printf( S_COLOR_RED "runscript: can't find targetname %s\n", cmd2 ); + } } - Svcmd_Use_f (); - return qtrue; - } - - if ( Q_stricmp( cmd, "ICARUS" ) == 0 ) - { - if ( !g_cheats->integer ) + else { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; + Quake3Game()->RunScript( &g_entities[0], cmd2 ); } - - Quake3Game()->Svcmd(); - - return qtrue; } - - if ( Q_stricmp( cmd, "saberColor" ) == 0 ) + else { - if ( !g_cheats->integer ) - { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; - } - Svcmd_SaberColor_f(); - return qtrue; + gi.Printf( S_COLOR_RED "usage: runscript scriptname\n" ); } +} + +static void Svcmd_PlayerTeam_f(void) +{ + const char *cmd2 = gi.argv(1); - if ( Q_stricmp( cmd, "saber" ) == 0 ) + if ( !*cmd2 || !cmd2[0] ) { - if ( !g_cheats->integer ) + gi.Printf( S_COLOR_RED "'playerteam' - change player team, requires a team name!\n" ); + gi.Printf( S_COLOR_RED "Current team is: %s\n", GetStringForID( TeamTable, g_entities[0].client->playerTeam ) ); + gi.Printf( S_COLOR_RED "Valid team names are:\n"); + for ( int n = (TEAM_FREE + 1); n < TEAM_NUM_TEAMS; n++ ) { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; + gi.Printf( S_COLOR_RED "%s\n", GetStringForID( TeamTable, n ) ); } - Svcmd_Saber_f(); - return qtrue; } - - if ( Q_stricmp( cmd, "saberblade" ) == 0 ) + else { - if ( !g_cheats->integer ) + team_t team; + + team = (team_t)GetIDForString( TeamTable, cmd2 ); + if ( team == (team_t)-1 ) { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; + gi.Printf( S_COLOR_RED "'playerteam' unrecognized team name %s!\n", cmd2 ); + gi.Printf( S_COLOR_RED "Current team is: %s\n", GetStringForID( TeamTable, g_entities[0].client->playerTeam ) ); + gi.Printf( S_COLOR_RED "Valid team names are:\n"); + for ( int n = TEAM_FREE; n < TEAM_NUM_TEAMS; n++ ) + { + gi.Printf( S_COLOR_RED "%s\n", GetStringForID( TeamTable, n ) ); + } + } + else + { + g_entities[0].client->playerTeam = team; + //FIXME: convert Imperial, Malon, Hirogen and Klingon to Scavenger? } - Svcmd_SaberBlade_f(); - return qtrue; } +} - if ( Q_stricmp( cmd, "setForceJump" ) == 0 ) - { - Svcmd_ForceSetLevel_f( FP_LEVITATION ); - return qtrue; - } - if ( Q_stricmp( cmd, "setSaberThrow" ) == 0 ) - { - Svcmd_ForceSetLevel_f( FP_SABERTHROW ); - return qtrue; - } - if ( Q_stricmp( cmd, "setForceHeal" ) == 0 ) - { - Svcmd_ForceSetLevel_f( FP_HEAL ); - return qtrue; - } - if ( Q_stricmp( cmd, "setForcePush" ) == 0 ) - { - Svcmd_ForceSetLevel_f( FP_PUSH ); - return qtrue; - } - if ( Q_stricmp( cmd, "setForcePull" ) == 0 ) - { - Svcmd_ForceSetLevel_f( FP_PULL ); - return qtrue; - } - if ( Q_stricmp( cmd, "setForceSpeed" ) == 0 ) - { - Svcmd_ForceSetLevel_f( FP_SPEED ); - return qtrue; - } - if ( Q_stricmp( cmd, "setForceGrip" ) == 0 ) +static void Svcmd_Control_f(void) +{ + const char *cmd2 = gi.argv(1); + if ( !*cmd2 || !cmd2[0] ) { - Svcmd_ForceSetLevel_f( FP_GRIP ); - return qtrue; + if ( !G_ClearViewEntity( &g_entities[0] ) ) + { + gi.Printf( S_COLOR_RED "control \n", cmd2 ); + } } - if ( Q_stricmp( cmd, "setForceLightning" ) == 0 ) + else { - Svcmd_ForceSetLevel_f( FP_LIGHTNING ); - return qtrue; + Q3_SetViewEntity( 0, cmd2 ); } - if ( Q_stricmp( cmd, "setMindTrick" ) == 0 ) +} + +static void Svcmd_Grab_f(void) +{ + const char *cmd2 = gi.argv(1); + if ( !*cmd2 || !cmd2[0] ) { - Svcmd_ForceSetLevel_f( FP_TELEPATHY ); - return qtrue; + if ( !G_ReleaseEntity( &g_entities[0] ) ) + { + gi.Printf( S_COLOR_RED "grab \n", cmd2 ); + } } - if ( Q_stricmp( cmd, "setSaberDefense" ) == 0 ) + else { - Svcmd_ForceSetLevel_f( FP_SABER_DEFENSE ); - return qtrue; + G_GrabEntity( &g_entities[0], cmd2 ); } - if ( Q_stricmp( cmd, "setSaberOffense" ) == 0 ) - { - Svcmd_ForceSetLevel_f( FP_SABER_OFFENSE ); - return qtrue; - } - if ( Q_stricmp( cmd, "setForceRage" ) == 0 ) +} + +static void Svcmd_Knockdown_f(void) +{ + G_Knockdown( &g_entities[0], &g_entities[0], vec3_origin, 300, qtrue ); +} + +static void Svcmd_PlayerModel_f(void) +{ + if ( gi.argc() == 1 ) { - Svcmd_ForceSetLevel_f( FP_RAGE ); - return qtrue; + gi.Printf( S_COLOR_RED "USAGE: playerModel \n playerModel \n playerModel player (builds player from customized menu settings)" S_COLOR_WHITE "\n" ); + gi.Printf( "playerModel = %s ", va("%s %s %s %s\n", g_char_model->string, g_char_skin_head->string, g_char_skin_torso->string, g_char_skin_legs->string ) ); } - if ( Q_stricmp( cmd, "setForceDrain" ) == 0 ) + else if ( gi.argc() == 2 ) { - Svcmd_ForceSetLevel_f( FP_DRAIN ); - return qtrue; + G_ChangePlayerModel( &g_entities[0], gi.argv(1) ); } - if ( Q_stricmp( cmd, "setForceProtect" ) == 0 ) + else if ( gi.argc() == 5 ) { - Svcmd_ForceSetLevel_f( FP_PROTECT ); - return qtrue; + //instead of setting it directly via a command, we now store it in cvars + //G_ChangePlayerModel( &g_entities[0], va("%s|%s|%s|%s", gi.argv(1), gi.argv(2), gi.argv(3), gi.argv(4)) ); + gi.cvar_set("g_char_model", gi.argv(1) ); + gi.cvar_set("g_char_skin_head", gi.argv(2) ); + gi.cvar_set("g_char_skin_torso", gi.argv(3) ); + gi.cvar_set("g_char_skin_legs", gi.argv(4) ); + G_InitPlayerFromCvars( &g_entities[0] ); } - if ( Q_stricmp( cmd, "setForceAbsorb" ) == 0 ) +} + +static void Svcmd_PlayerTint_f(void) +{ + if ( gi.argc() == 4 ) { - Svcmd_ForceSetLevel_f( FP_ABSORB ); - return qtrue; + g_entities[0].client->renderInfo.customRGBA[0] = atoi(gi.argv(1)); + g_entities[0].client->renderInfo.customRGBA[1] = atoi(gi.argv(2)); + g_entities[0].client->renderInfo.customRGBA[2] = atoi(gi.argv(3)); + gi.cvar_set("g_char_color_red", gi.argv(1) ); + gi.cvar_set("g_char_color_green", gi.argv(2) ); + gi.cvar_set("g_char_color_blue", gi.argv(3) ); } - if ( Q_stricmp( cmd, "setForceSight" ) == 0 ) + else { - Svcmd_ForceSetLevel_f( FP_SEE ); - return qtrue; + gi.Printf( S_COLOR_RED "USAGE: playerTint \n" ); + gi.Printf( "playerTint = %s\n", va("%d %d %d", g_char_color_red->integer, g_char_color_green->integer, g_char_color_blue->integer ) ); } - if ( Q_stricmp( cmd, "setForceAll" ) == 0 ) - { - if ( !g_cheats->integer ) - { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; - } +} - for ( int i = FP_HEAL; i < NUM_FORCE_POWERS; i++ ) +static void Svcmd_IKnowKungfu_f(void) +{ + gi.cvar_set( "g_debugMelee", "1" ); + G_SetWeapon( &g_entities[0], WP_MELEE ); + for ( int i = FP_FIRST; i < NUM_FORCE_POWERS; i++ ) + { + g_entities[0].client->ps.forcePowersKnown |= ( 1 << i ); + if ( i == FP_TELEPATHY ) { - Svcmd_ForceSetLevel_f( i ); + g_entities[0].client->ps.forcePowerLevel[i] = FORCE_LEVEL_4; } - for ( int i = SS_NONE+1; i < SS_NUM_SABER_STYLES; i++ ) + else { - g_entities[0].client->ps.saberStylesKnown |= (1<ps.forcePowerLevel[i] = FORCE_LEVEL_3; } - return qtrue; } - if ( Q_stricmp( cmd, "setSaberAll" ) == 0 ) - { - if ( !g_cheats->integer ) - { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; - } +} - Svcmd_ForceSetLevel_f( FP_SABERTHROW ); - Svcmd_ForceSetLevel_f( FP_SABER_DEFENSE ); - Svcmd_ForceSetLevel_f( FP_SABER_OFFENSE ); - for ( int i = SS_NONE+1; i < SS_NUM_SABER_STYLES; i++ ) - { - g_entities[0].client->ps.saberStylesKnown |= (1<client->sess.missionStats.totalSecrets < 1) + { + gi.Printf( "There are" S_COLOR_RED " NO " S_COLOR_WHITE "secrets on this map!\n" ); } - if ( Q_stricmp( cmd, "saberAttackCycle" ) == 0 ) + else if(pl->client->sess.missionStats.secretsFound == pl->client->sess.missionStats.totalSecrets) { - Svcmd_SaberAttackCycle_f(); - return qtrue; + gi.Printf( "You've found all " S_COLOR_GREEN "%i" S_COLOR_WHITE " secrets on this map!\n", pl->client->sess.missionStats.secretsFound ); } - if ( Q_stricmp( cmd, "runscript" ) == 0 ) + else { - if ( !g_cheats->integer ) - { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; - } - const char *cmd2 = gi.argv(1); - - if ( cmd2 && cmd2[0] ) - { - const char *cmd3 = gi.argv(2); - if ( cmd3 && cmd3[0] ) - { - gentity_t *found = NULL; - if ( (found = G_Find(NULL, FOFS(targetname), cmd2 ) ) != NULL ) - { - Quake3Game()->RunScript( found, cmd3 ); - } - else - { - //can't find cmd2 - gi.Printf( S_COLOR_RED"runscript: can't find targetname %s\n", cmd2 ); - } - } - else - { - Quake3Game()->RunScript( &g_entities[0], cmd2 ); - } - } - else - { - gi.Printf( S_COLOR_RED"usage: runscript scriptname\n" ); - } - //FIXME: else warning - return qtrue; + gi.Printf( "You've found " S_COLOR_GREEN "%i" S_COLOR_WHITE " out of " S_COLOR_GREEN "%i" S_COLOR_WHITE " secrets!\n", pl->client->sess.missionStats.secretsFound, pl->client->sess.missionStats.totalSecrets ); } +} - if ( Q_stricmp( cmd, "playerteam" ) == 0 ) - { - if ( !g_cheats->integer ) - { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; - } - const char *cmd2 = gi.argv(1); - int n; +// PADAWAN - g_spskill 0 + cg_crosshairForceHint 1 + handicap 100 +// JEDI - g_spskill 1 + cg_crosshairForceHint 1 + handicap 100 +// JEDI KNIGHT - g_spskill 2 + cg_crosshairForceHint 0 + handicapp 100 +// JEDI MASTER - g_spskill 2 + cg_crosshairForceHint 0 + handicap 50 - if ( !*cmd2 || !cmd2[0] ) - { - gi.Printf( S_COLOR_RED"'playerteam' - change player team, requires a team name!\n" ); - gi.Printf( S_COLOR_RED"Valid team names are:\n"); - for ( n = (TEAM_FREE + 1); n < TEAM_NUM_TEAMS; n++ ) - { - gi.Printf( S_COLOR_RED"%s\n", GetStringForID( TeamTable, n ) ); - } - } - else - { - team_t team; +static void Svcmd_Difficulty_f(void) +{ + gi.Printf( S_COLOR_RED "This command is not yet implemented!" S_COLOR_WHITE "\n" ); +} - team = (team_t)GetIDForString( TeamTable, cmd2 ); - if ( team == (team_t)-1 ) - { - gi.Printf( S_COLOR_RED"'playerteam' unrecognized team name %s!\n", cmd2 ); - gi.Printf( S_COLOR_RED"Valid team names are:\n"); - for ( n = TEAM_FREE; n < TEAM_NUM_TEAMS; n++ ) - { - gi.Printf( S_COLOR_RED"%s\n", GetStringForID( TeamTable, n ) ); - } - } - else - { - g_entities[0].client->playerTeam = team; - //FIXME: convert Imperial, Malon, Hirogen and Klingon to Scavenger? - } - } - return qtrue; - } +#define CMD_NONE (0x00000000u) +#define CMD_CHEAT (0x00000001u) +#define CMD_ALIVE (0x00000002u) - if ( Q_stricmp( cmd, "control" ) == 0 ) - { - if ( !g_cheats->integer ) - { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; - } - const char *cmd2 = gi.argv(1); - if ( !*cmd2 || !cmd2[0] ) - { - if ( !G_ClearViewEntity( &g_entities[0] ) ) - { - gi.Printf( S_COLOR_RED"control \n", cmd2 ); - } - } - else - { - Q3_SetViewEntity( 0, cmd2 ); - } - return qtrue; - } +typedef struct svcmd_s { + const char *name; + void (*func)(void); + uint32_t flags; +} svcmd_t; - if ( Q_stricmp( cmd, "grab" ) == 0 ) - { - if ( !g_cheats->integer ) - { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; - } - const char *cmd2 = gi.argv(1); - if ( !*cmd2 || !cmd2[0] ) - { - if ( !G_ReleaseEntity( &g_entities[0] ) ) - { - gi.Printf( S_COLOR_RED"grab \n", cmd2 ); - } - } - else - { - G_GrabEntity( &g_entities[0], cmd2 ); - } - return qtrue; - } +static int svcmdcmp( const void *a, const void *b ) { + return Q_stricmp( (const char *)a, ((svcmd_t*)b)->name ); +} - if ( Q_stricmp( cmd, "knockdown" ) == 0 ) - { - if ( !g_cheats->integer ) - { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; - } - G_Knockdown( &g_entities[0], &g_entities[0], vec3_origin, 300, qtrue ); - return qtrue; - } +// FIXME some of these should be made CMD_ALIVE too! +static svcmd_t svcmds[] = { + { "entitylist", Svcmd_EntityList_f, CMD_NONE }, + { "game_memory", Svcmd_GameMem_f, CMD_NONE }, + + { "nav", Svcmd_Nav_f, CMD_CHEAT }, + { "npc", Svcmd_NPC_f, CMD_CHEAT }, + { "use", Svcmd_Use_f, CMD_CHEAT }, + { "ICARUS", Svcmd_ICARUS_f, CMD_CHEAT }, + + { "saberColor", Svcmd_SaberColor_f, CMD_CHEAT }, + { "saber", Svcmd_Saber_f, CMD_CHEAT }, + { "saberBlade", Svcmd_SaberBlade_f, CMD_CHEAT }, + + { "setForceJump", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setSaberThrow", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceHeal", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForcePush", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForcePull", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceSpeed", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceGrip", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceLightning", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setMindTrick", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setSaberDefense", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setSaberOffense", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceRage", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceDrain", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceProtect", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceAbsorb", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceSight", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceAll", Svcmd_SetForceAll_f, CMD_CHEAT }, + { "setSaberAll", Svcmd_SetSaberAll_f, CMD_CHEAT }, + + { "saberAttackCycle", Svcmd_SaberAttackCycle_f, CMD_NONE }, + + { "runscript", Svcmd_RunScript_f, CMD_CHEAT }, + + { "playerTeam", Svcmd_PlayerTeam_f, CMD_CHEAT }, + + { "control", Svcmd_Control_f, CMD_CHEAT }, + { "grab", Svcmd_Grab_f, CMD_CHEAT }, + { "knockdown", Svcmd_Knockdown_f, CMD_CHEAT }, + { "playerModel", Svcmd_PlayerModel_f, CMD_NONE }, + { "playerTint", Svcmd_PlayerTint_f, CMD_NONE }, + + { "nexttestaxes", G_NextTestAxes, CMD_NONE }, + + { "exitview", Svcmd_ExitView_f, CMD_NONE }, + + { "iknowkungfu", Svcmd_IKnowKungfu_f, CMD_CHEAT }, + + { "secrets", Svcmd_Secrets_f, CMD_NONE }, + { "difficulty", Svcmd_Difficulty_f, CMD_NONE }, + + //{ "say", Svcmd_Say_f, qtrue }, + //{ "toggleallowvote", Svcmd_ToggleAllowVote_f, qfalse }, + //{ "toggleuserinfovalidation", Svcmd_ToggleUserinfoValidation_f, qfalse }, +}; +static const size_t numsvcmds = ARRAY_LEN( svcmds ); - if ( Q_stricmp( cmd, "playerModel" ) == 0 ) - { - if ( gi.argc() == 1 ) - { - gi.Printf( S_COLOR_RED"USAGE: playerModel \n playerModel \n playerModel player (builds player from customized menu settings)\n" ); - gi.Printf( "playerModel = %s ", va("%s %s %s %s\n", g_char_model->string, g_char_skin_head->string, g_char_skin_torso->string, g_char_skin_legs->string ) ); - } - else if ( gi.argc() == 2 ) - { - G_ChangePlayerModel( &g_entities[0], gi.argv(1) ); - } - else if ( gi.argc() == 5 ) - { - //instead of setting it directly via a command, we now store it in cvars - //G_ChangePlayerModel( &g_entities[0], va("%s|%s|%s|%s", gi.argv(1), gi.argv(2), gi.argv(3), gi.argv(4)) ); - gi.cvar_set("g_char_model", gi.argv(1) ); - gi.cvar_set("g_char_skin_head", gi.argv(2) ); - gi.cvar_set("g_char_skin_torso", gi.argv(3) ); - gi.cvar_set("g_char_skin_legs", gi.argv(4) ); - G_InitPlayerFromCvars( &g_entities[0] ); - } - return qtrue; - } +/* +================= +ConsoleCommand +================= +*/ +qboolean ConsoleCommand( void ) { + const char *cmd = gi.argv(0); + const svcmd_t *command = (const svcmd_t *)Q_LinearSearch( cmd, svcmds, numsvcmds, sizeof( svcmds[0] ), svcmdcmp ); - if ( Q_stricmp( cmd, "playerTint" ) == 0 ) + if ( !command ) + return qfalse; + + if ( (command->flags & CMD_CHEAT) + && !g_cheats->integer ) { - if ( gi.argc() == 4 ) - { - g_entities[0].client->renderInfo.customRGBA[0] = atoi(gi.argv(1)); - g_entities[0].client->renderInfo.customRGBA[1] = atoi(gi.argv(2)); - g_entities[0].client->renderInfo.customRGBA[2] = atoi(gi.argv(3)); - gi.cvar_set("g_char_color_red", gi.argv(1) ); - gi.cvar_set("g_char_color_green", gi.argv(2) ); - gi.cvar_set("g_char_color_blue", gi.argv(3) ); - } - else - { - gi.Printf( S_COLOR_RED"USAGE: playerTint \n" ); - gi.Printf( "playerTint = %s\n", va("%d %d %d", g_char_color_red->integer, g_char_color_green->integer, g_char_color_blue->integer ) ); - } + gi.Printf( "Cheats are not enabled on this server.\n" ); return qtrue; } - if ( Q_stricmp( cmd, "nexttestaxes" ) == 0 ) - { - G_NextTestAxes(); - } - - if ( Q_stricmp( cmd, "exitview" ) == 0 ) - { - Svcmd_ExitView_f(); - } - - if (Q_stricmp (cmd, "iknowkungfu") == 0) + else if ( (command->flags & CMD_ALIVE) + && (g_entities[0].health <= 0) ) { - if ( !g_cheats->integer ) - { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; - } - - gi.cvar_set( "g_debugMelee", "1" ); - G_SetWeapon( &g_entities[0], WP_MELEE ); - for ( int i = FP_FIRST; i < NUM_FORCE_POWERS; i++ ) - { - g_entities[0].client->ps.forcePowersKnown |= ( 1 << i ); - if ( i == FP_TELEPATHY ) - { - g_entities[0].client->ps.forcePowerLevel[i] = FORCE_LEVEL_4; - } - else - { - g_entities[0].client->ps.forcePowerLevel[i] = FORCE_LEVEL_3; - } - } + gi.Printf( "You must be alive to use this command.\n" ); + return qtrue; } - - return qfalse; + else + command->func(); + return qtrue; } diff --git a/code/qcommon/q_shared.cpp b/code/qcommon/q_shared.cpp index 9c33eae5fc..6eb1a67097 100644 --- a/code/qcommon/q_shared.cpp +++ b/code/qcommon/q_shared.cpp @@ -1023,3 +1023,27 @@ const char *GetStringForID( const stringID_table_t *table, int id ) return NULL; } + +qboolean Q_InBitflags( const uint32_t *bits, int index, uint32_t bitsPerByte ) { + return ( bits[index / bitsPerByte] & (1 << (index % bitsPerByte)) ) ? qtrue : qfalse; +} + +void Q_AddToBitflags( uint32_t *bits, int index, uint32_t bitsPerByte ) { + bits[index / bitsPerByte] |= (1 << (index % bitsPerByte)); +} + +void Q_RemoveFromBitflags( uint32_t *bits, int index, uint32_t bitsPerByte ) { + bits[index / bitsPerByte] &= ~(1 << (index % bitsPerByte)); +} + +void *Q_LinearSearch( const void *key, const void *ptr, size_t count, + size_t size, cmpFunc_t cmp ) +{ + size_t i; + for ( i = 0; i < count; i++ ) + { + if ( cmp( key, ptr ) == 0 ) return (void *)ptr; + ptr = (const char *)ptr + size; + } + return NULL; +} \ No newline at end of file diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 20e4aaadb3..2bd355d5d0 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -2752,4 +2752,13 @@ typedef enum } ForceReload_e; +qboolean Q_InBitflags( const uint32_t *bits, int index, uint32_t bitsPerByte ); +void Q_AddToBitflags( uint32_t *bits, int index, uint32_t bitsPerByte ); +void Q_RemoveFromBitflags( uint32_t *bits, int index, uint32_t bitsPerByte ); + +typedef int( *cmpFunc_t )(const void *a, const void *b); + +void *Q_LinearSearch( const void *key, const void *ptr, size_t count, + size_t size, cmpFunc_t cmp ); + #endif // __Q_SHARED_H From d31b847861217cc2d7fa00a73dca21917270c719 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Thu, 20 Oct 2016 20:58:02 -0500 Subject: [PATCH 347/445] SP: Added WIP difficulty command Currently only displays current difficulty. Ability to set the difficulty from this command will come later. --- code/game/g_svcmds.cpp | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index 475701d6c3..1ef83885c8 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -843,12 +843,46 @@ static void Svcmd_Secrets_f(void) // PADAWAN - g_spskill 0 + cg_crosshairForceHint 1 + handicap 100 // JEDI - g_spskill 1 + cg_crosshairForceHint 1 + handicap 100 -// JEDI KNIGHT - g_spskill 2 + cg_crosshairForceHint 0 + handicapp 100 +// JEDI KNIGHT - g_spskill 2 + cg_crosshairForceHint 0 + handicap 100 // JEDI MASTER - g_spskill 2 + cg_crosshairForceHint 0 + handicap 50 +extern cvar_t *g_spskill; static void Svcmd_Difficulty_f(void) { - gi.Printf( S_COLOR_RED "This command is not yet implemented!" S_COLOR_WHITE "\n" ); + if(gi.argc() == 1) + { + if(g_spskill->integer == 0) + { + gi.Printf( S_COLOR_GREEN "Current Difficulty: Padawan" S_COLOR_WHITE "\n" ); + } + else if(g_spskill->integer == 1) + { + gi.Printf( S_COLOR_GREEN "Current Difficulty: Jedi" S_COLOR_WHITE "\n" ); + } + else if(g_spskill->integer == 2) + { + int crosshairHint = gi.Cvar_VariableIntegerValue("cg_crosshairForceHint"); + int handicap = gi.Cvar_VariableIntegerValue("handicap"); + if(handicap == 100 && crosshairHint == 0) + { + gi.Printf( S_COLOR_GREEN "Current Difficulty: Jedi Knight" S_COLOR_WHITE "\n" ); + } + else if(handicap == 50 && crosshairHint == 0) + { + gi.Printf( S_COLOR_GREEN "Current Difficulty: Jedi Master" S_COLOR_WHITE "\n" ); + } + else + { + gi.Printf( S_COLOR_GREEN "Current Difficulty: Jedi Knight (Custom)" S_COLOR_WHITE "\n" ); + gi.Printf( S_COLOR_GREEN "Crosshair Force Hint: %i" S_COLOR_WHITE "\n", crosshairHint != 0 ? 1 : 0 ); + gi.Printf( S_COLOR_GREEN "Handicap: %i" S_COLOR_WHITE "\n", handicap ); + } + } + else + { + gi.Printf( S_COLOR_RED "Invalid difficulty cvar set! g_spskill (%i) [0-2] is valid range only" S_COLOR_WHITE "\n", g_spskill->integer ); + } + } } #define CMD_NONE (0x00000000u) From c80a08ba4ff0694a93d1dff3fd3c7bb9ceeaff7e Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sat, 27 Aug 2016 19:53:50 +0100 Subject: [PATCH 348/445] SP: Fix crash when game API version doesn't match Can't access 'ge' fields once the DLL has unloaded since it points to memory owned by the DLL (which has now been unloaded). --- code/server/sv_game.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/server/sv_game.cpp b/code/server/sv_game.cpp index b78146c423..8cd596fbe7 100644 --- a/code/server/sv_game.cpp +++ b/code/server/sv_game.cpp @@ -1068,8 +1068,9 @@ void SV_InitGameProgs (void) { if (ge->apiversion != GAME_API_VERSION) { + int apiVersion = ge->apiversion; Sys_UnloadDll( gameLibrary ); - Com_Error (ERR_DROP, "game is version %i, not %i", ge->apiversion, GAME_API_VERSION); + Com_Error (ERR_DROP, "game is version %i, not %i", apiVersion, GAME_API_VERSION); } //hook up the client while we're here From c9f44bdd7a7393f851a2d55d21e04cdd99de4c86 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Fri, 21 Oct 2016 22:33:03 +0100 Subject: [PATCH 349/445] Remove constexpr usage VS2013 does not support the constexpr keyword so it has been removed. --- code/game/g_savegame.cpp | 8 ++--- code/qcommon/ojk_saved_game.cpp | 4 +-- code/qcommon/ojk_saved_game.h | 2 +- code/qcommon/ojk_saved_game_class_archivers.h | 5 +-- code/qcommon/ojk_saved_game_helper.h | 32 +++++++++---------- code/qcommon/ojk_saved_game_helper_fwd.h | 7 ++-- 6 files changed, 26 insertions(+), 32 deletions(-) diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index ca27583982..0b3d0dbed4 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -768,10 +768,10 @@ static void copy_retail_gclient_to_current( const RetailGClient& src, gclient_t& dst) { - constexpr size_t src_pre_size = offsetof(RetailGClient, ps.saber[0]); - constexpr size_t src_post_offset = offsetof(RetailGClient, ps.dualSabers); - constexpr size_t src_post_size = sizeof(RetailGClient) - src_post_offset; - constexpr size_t dst_post_offset = offsetof(gclient_t, ps.dualSabers); + const size_t src_pre_size = offsetof(RetailGClient, ps.saber[0]); + const size_t src_post_offset = offsetof(RetailGClient, ps.dualSabers); + const size_t src_post_size = sizeof(RetailGClient) - src_post_offset; + const size_t dst_post_offset = offsetof(gclient_t, ps.dualSabers); ::memcpy( reinterpret_cast(&dst), diff --git a/code/qcommon/ojk_saved_game.cpp b/code/qcommon/ojk_saved_game.cpp index bd275997c1..9d479f175b 100644 --- a/code/qcommon/ojk_saved_game.cpp +++ b/code/qcommon/ojk_saved_game.cpp @@ -138,7 +138,7 @@ bool SavedGame::create( is_writable_ = true; - constexpr int sg_version = iSAVEGAME_VERSION; + const int sg_version = iSAVEGAME_VERSION; SavedGameHelper sgsh(this); @@ -963,7 +963,7 @@ void SavedGame::reset_buffer_offset() io_buffer_offset_ = 0; } -constexpr uint32_t SavedGame::get_jo_magic_value() +const uint32_t SavedGame::get_jo_magic_value() { return 0x1234ABCD; } diff --git a/code/qcommon/ojk_saved_game.h b/code/qcommon/ojk_saved_game.h index 543a8a5473..ea9f88bb89 100644 --- a/code/qcommon/ojk_saved_game.h +++ b/code/qcommon/ojk_saved_game.h @@ -183,7 +183,7 @@ class SavedGame : static std::string get_chunk_id_string( uint32_t chunk_id); - static constexpr uint32_t get_jo_magic_value(); + static const uint32_t get_jo_magic_value(); }; // SavedGame diff --git a/code/qcommon/ojk_saved_game_class_archivers.h b/code/qcommon/ojk_saved_game_class_archivers.h index 70a5da99e4..cfd4743744 100644 --- a/code/qcommon/ojk_saved_game_class_archivers.h +++ b/code/qcommon/ojk_saved_game_class_archivers.h @@ -19,10 +19,7 @@ template<> class SavedGameClassArchiver { public: - static constexpr bool is_implemented() - { - return true; - } + enum { is_implemented = true }; static void sg_export( SavedGameHelper& saved_game, diff --git a/code/qcommon/ojk_saved_game_helper.h b/code/qcommon/ojk_saved_game_helper.h index 280cd0e277..750dde476b 100644 --- a/code/qcommon/ojk_saved_game_helper.h +++ b/code/qcommon/ojk_saved_game_helper.h @@ -334,7 +334,7 @@ bool SavedGameHelper::try_read( TDst& dst_value, NumericTag) { - constexpr int src_size = static_cast(sizeof(TSrc)); + const int src_size = static_cast(sizeof(TSrc)); TSrc src_value; @@ -393,7 +393,7 @@ bool SavedGameHelper::try_read( "Unsupported types."); using Tag = typename std::conditional< - SavedGameClassArchiver::is_implemented(), + SavedGameClassArchiver::is_implemented, ExternalTag, InternalTag >::type; @@ -474,26 +474,26 @@ bool SavedGameHelper::try_read( TSrc >::type; - constexpr bool is_src_pure_numeric = + const bool is_src_pure_numeric = std::is_arithmetic::value && (!std::is_same::value) && (!std::is_enum::value); - constexpr bool is_dst_pure_numeric = + const bool is_dst_pure_numeric = std::is_arithmetic::value && (!std::is_same::value) && (!std::is_enum::value); - constexpr bool is_src_float_point = + const bool is_src_float_point = std::is_floating_point::value; - constexpr bool is_dst_float_point = + const bool is_dst_float_point = std::is_floating_point::value; - constexpr bool has_same_size = + const bool has_same_size = (sizeof(Src) == sizeof(TDst)); - constexpr bool use_inplace = + const bool use_inplace = is_src_pure_numeric && is_dst_pure_numeric && ((!is_src_float_point && !is_dst_float_point) || @@ -634,7 +634,7 @@ void SavedGameHelper::write( const TSrc& src_value, NumericTag) { - constexpr int dst_size = static_cast(sizeof(TDst)); + const int dst_size = static_cast(sizeof(TDst)); const TDst dst_value = static_cast(src_value); @@ -674,7 +674,7 @@ void SavedGameHelper::write( "Unsupported types."); using Tag = typename std::conditional< - SavedGameClassArchiver::is_implemented(), + SavedGameClassArchiver::is_implemented, ExternalTag, InternalTag >::type; @@ -750,26 +750,26 @@ void SavedGameHelper::write( TSrc, TDst>::type; - constexpr bool is_src_pure_numeric = + const bool is_src_pure_numeric = std::is_arithmetic::value && (!std::is_same::value) && (!std::is_enum::value); - constexpr bool is_dst_pure_numeric = + const bool is_dst_pure_numeric = std::is_arithmetic::value && (!std::is_same::value) && (!std::is_enum::value); - constexpr bool is_src_float_point = + const bool is_src_float_point = std::is_floating_point::value; - constexpr bool is_dst_float_point = + const bool is_dst_float_point = std::is_floating_point::value; - constexpr bool has_same_size = + const bool has_same_size = (sizeof(TSrc) == sizeof(Dst)); - constexpr bool use_inplace = + const bool use_inplace = is_src_pure_numeric && is_dst_pure_numeric && ((!is_src_float_point && !is_dst_float_point) || diff --git a/code/qcommon/ojk_saved_game_helper_fwd.h b/code/qcommon/ojk_saved_game_helper_fwd.h index b36b674021..60b360fcbc 100644 --- a/code/qcommon/ojk_saved_game_helper_fwd.h +++ b/code/qcommon/ojk_saved_game_helper_fwd.h @@ -290,11 +290,8 @@ template class SavedGameClassArchiver { public: - static constexpr bool is_implemented() - { - return false; - } - + enum { is_implemented = false }; + static void sg_export( SavedGameHelper& saved_game, const T& instance) From f832cf69ff74c800c1f7f45b20107cbb98bccc2d Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sat, 22 Oct 2016 14:31:57 -0500 Subject: [PATCH 350/445] SP: Don't try to open invalid file names in UI model loader Previously `models/players//PlayerChoice.txt` was attempting to be loaded. This difference was already in the MP codebase so it appears to be a slight oversight in the codebases. --- code/ui/ui_main.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 19e3554a69..2fd0aae54f 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -2422,7 +2422,15 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) dirlen = strlen(dirptr); - if (dirlen && dirptr[dirlen-1]=='/') dirptr[dirlen-1]='\0'; + if (dirlen) + { + if (dirptr[dirlen-1]=='/') + dirptr[dirlen-1]='\0'; + } + else + { + continue; + } if (!strcmp(dirptr,".") || !strcmp(dirptr,"..")) continue; From 3df77749b0ca5c354d952103a6161182bd237f2b Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sun, 23 Oct 2016 19:04:32 -0500 Subject: [PATCH 351/445] JK2: Merge in improved g_svcmds.cpp specialized for JK2 Some changes were made to accomodate for JK2 version of these commands which is different of course. --- codeJK2/cgame/cg_servercmds.cpp | 2 +- codeJK2/game/g_ICARUS.cpp | 2 +- codeJK2/game/g_svcmds.cpp | 451 ++++++++++++++++---------------- 3 files changed, 225 insertions(+), 230 deletions(-) diff --git a/codeJK2/cgame/cg_servercmds.cpp b/codeJK2/cgame/cg_servercmds.cpp index 9a8598289b..d4ddc0ef92 100644 --- a/codeJK2/cgame/cg_servercmds.cpp +++ b/codeJK2/cgame/cg_servercmds.cpp @@ -256,7 +256,7 @@ typedef struct serverCommand_s { void( *func )(void); } serverCommand_t; -int svcmdcmp( const void *a, const void *b ) { +static int svcmdcmp( const void *a, const void *b ) { return Q_stricmp( (const char *)a, ((serverCommand_t*)b)->cmd ); } diff --git a/codeJK2/game/g_ICARUS.cpp b/codeJK2/game/g_ICARUS.cpp index 6adf2e0318..e89ff765d0 100644 --- a/codeJK2/game/g_ICARUS.cpp +++ b/codeJK2/game/g_ICARUS.cpp @@ -638,7 +638,7 @@ Svcmd_ICARUS_f void Svcmd_ICARUS_f( void ) { - char *cmd = gi.argv( 1 ); + const char *cmd = gi.argv( 1 ); if ( Q_stricmp( cmd, "log" ) == 0 ) { diff --git a/codeJK2/game/g_svcmds.cpp b/codeJK2/game/g_svcmds.cpp index 83b28a27d4..40d45801dc 100644 --- a/codeJK2/game/g_svcmds.cpp +++ b/codeJK2/game/g_svcmds.cpp @@ -49,25 +49,46 @@ void Svcmd_EntityList_f (void) { gi.Printf("%3i:", e); switch ( check->s.eType ) { case ET_GENERAL: - gi.Printf("ET_GENERAL "); + gi.Printf( "ET_GENERAL " ); break; case ET_PLAYER: - gi.Printf("ET_PLAYER "); + gi.Printf( "ET_PLAYER " ); break; case ET_ITEM: - gi.Printf("ET_ITEM "); + gi.Printf( "ET_ITEM " ); break; case ET_MISSILE: - gi.Printf("ET_MISSILE "); + gi.Printf( "ET_MISSILE " ); break; case ET_MOVER: - gi.Printf("ET_MOVER "); + gi.Printf( "ET_MOVER " ); break; case ET_BEAM: - gi.Printf("ET_BEAM "); + gi.Printf( "ET_BEAM " ); + break; + case ET_PORTAL: + gi.Printf( "ET_PORTAL " ); + break; + case ET_SPEAKER: + gi.Printf( "ET_SPEAKER " ); + break; + case ET_PUSH_TRIGGER: + gi.Printf( "ET_PUSH_TRIGGER " ); + break; + case ET_TELEPORT_TRIGGER: + gi.Printf( "ET_TELEPORT_TRIGGER " ); + break; + case ET_INVISIBLE: + gi.Printf( "ET_INVISIBLE " ); + break; + case ET_THINKER: + gi.Printf( "ET_THINKER " ); + break; + case ET_CLOUD: + gi.Printf( "ET_CLOUD " ); break; default: - gi.Printf("#%i", check->s.eType); + gi.Printf( "%-3i ", check->s.eType ); break; } @@ -328,306 +349,280 @@ void Svcmd_SaberAttackCycle_f( void ) switch ( saberAnimLevel ) { case FORCE_LEVEL_1: - gi.Printf( S_COLOR_BLUE"Lightsaber Combat Style: Fast\n" ); + gi.Printf( S_COLOR_BLUE "Lightsaber Combat Style: Fast\n" ); //LIGHTSABERCOMBATSTYLE_FAST break; case FORCE_LEVEL_2: - gi.Printf( S_COLOR_YELLOW"Lightsaber Combat Style: Medium\n" ); + gi.Printf( S_COLOR_YELLOW "Lightsaber Combat Style: Medium\n" ); //LIGHTSABERCOMBATSTYLE_MEDIUM break; case FORCE_LEVEL_3: - gi.Printf( S_COLOR_RED"Lightsaber Combat Style: Strong\n" ); + gi.Printf( S_COLOR_RED "Lightsaber Combat Style: Strong\n" ); //LIGHTSABERCOMBATSTYLE_STRONG break; case FORCE_LEVEL_4: - gi.Printf( S_COLOR_CYAN"Lightsaber Combat Style: Desann\n" ); + gi.Printf( S_COLOR_CYAN "Lightsaber Combat Style: Desann\n" ); //LIGHTSABERCOMBATSTYLE_DESANN break; case FORCE_LEVEL_5: - gi.Printf( S_COLOR_MAGENTA"Lightsaber Combat Style: Tavion\n" ); + gi.Printf( S_COLOR_MAGENTA "Lightsaber Combat Style: Tavion\n" ); //LIGHTSABERCOMBATSTYLE_TAVION break; } //gi.Printf("\n"); #endif } -/* -================= -ConsoleCommand -================= -*/ -qboolean ConsoleCommand( void ) { - const char *cmd; - - cmd = gi.argv(0); +template +static void Svcmd_ForceSetLevel_f(void) +{ + Svcmd_ForceSetLevel_f(power); +} - if ( Q_stricmp (cmd, "entitylist") == 0 ) +static void Svcmd_SetForceAll_f(void) +{ + for ( int i = FP_HEAL; i <= FP_SABER_OFFENSE; i++ ) { - Svcmd_EntityList_f(); - return qtrue; + Svcmd_ForceSetLevel_f( i ); } +} - if (Q_stricmp (cmd, "game_memory") == 0) { - Svcmd_GameMem_f(); - return qtrue; - } +static void Svcmd_SetSaberAll_f(void) +{ + Svcmd_ForceSetLevel_f( FP_SABERTHROW ); + Svcmd_ForceSetLevel_f( FP_SABER_DEFENSE ); + Svcmd_ForceSetLevel_f( FP_SABER_OFFENSE ); +} -// if (Q_stricmp (cmd, "addbot") == 0) { -// Svcmd_AddBot_f(); -// return qtrue; -// } +static void Svcmd_RunScript_f(void) +{ + const char *cmd2 = gi.argv(1); - if (Q_stricmp (cmd, "nav") == 0) + if ( cmd2 && cmd2[0] ) { - if ( !g_cheats->integer ) + const char *cmd3 = gi.argv(2); + if ( cmd3 && cmd3[0] ) { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; + gentity_t *found = NULL; + if ( (found = G_Find(NULL, FOFS(targetname), cmd2 ) ) != NULL ) + { + ICARUS_RunScript( found, cmd3 ); + } + else + { + //can't find cmd2 + gi.Printf( S_COLOR_RED "runscript: can't find targetname %s\n", cmd2 ); + } } - Svcmd_Nav_f (); - return qtrue; - } - - if (Q_stricmp (cmd, "npc") == 0) - { - if ( !g_cheats->integer ) + else { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; + ICARUS_RunScript( &g_entities[0], cmd2 ); } - Svcmd_NPC_f (); - return qtrue; } - - if (Q_stricmp (cmd, "use") == 0) + else { - if ( !g_cheats->integer ) - { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; - } - Svcmd_Use_f (); - return qtrue; + gi.Printf( S_COLOR_RED "usage: runscript scriptname\n" ); } +} + +static void Svcmd_PlayerTeam_f(void) +{ + const char *cmd2 = gi.argv(1); - if ( Q_stricmp( cmd, "ICARUS" ) == 0 ) + if ( !*cmd2 || !cmd2[0] ) { - if ( !g_cheats->integer ) + gi.Printf( S_COLOR_RED "'playerteam' - change player team, requires a team name!\n" ); + gi.Printf( S_COLOR_RED "Current team is: %s\n", TeamNames[g_entities[0].client->playerTeam] ); + gi.Printf( S_COLOR_RED "Valid team names are:\n"); + for ( int n = (TEAM_FREE + 1); n < TEAM_NUM_TEAMS; n++ ) { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; + gi.Printf( S_COLOR_RED "%s\n", TeamNames[n] ); } - Svcmd_ICARUS_f(); - return qtrue; } - - if ( Q_stricmp( cmd, "saberColor" ) == 0 ) + else { - if ( !g_cheats->integer ) + team_t team = TranslateTeamName( cmd2 ); + + if ( team == TEAM_FREE ) { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; + gi.Printf( S_COLOR_RED "'playerteam' unrecognized team name %s!\n", cmd2 ); + gi.Printf( S_COLOR_RED "Current team is: %s\n", TeamNames[g_entities[0].client->playerTeam] ); + gi.Printf( S_COLOR_RED "Valid team names are:\n"); + for ( int n = TEAM_FREE; n < TEAM_NUM_TEAMS; n++ ) + { + gi.Printf( S_COLOR_RED "%s\n", TeamNames[n] ); + } + } + else + { + g_entities[0].client->playerTeam = team; + //FIXME: convert Imperial, Malon, Hirogen and Klingon to Scavenger? } - Svcmd_SaberColor_f(); - return qtrue; } +} - if ( Q_stricmp( cmd, "setForceJump" ) == 0 ) - { - Svcmd_ForceSetLevel_f( FP_LEVITATION ); - return qtrue; - } - if ( Q_stricmp( cmd, "setSaberThrow" ) == 0 ) - { - Svcmd_ForceSetLevel_f( FP_SABERTHROW ); - return qtrue; - } - if ( Q_stricmp( cmd, "setForceHeal" ) == 0 ) - { - Svcmd_ForceSetLevel_f( FP_HEAL ); - return qtrue; - } - if ( Q_stricmp( cmd, "setForcePush" ) == 0 ) - { - Svcmd_ForceSetLevel_f( FP_PUSH ); - return qtrue; - } - if ( Q_stricmp( cmd, "setForcePull" ) == 0 ) - { - Svcmd_ForceSetLevel_f( FP_PULL ); - return qtrue; - } - if ( Q_stricmp( cmd, "setForceSpeed" ) == 0 ) - { - Svcmd_ForceSetLevel_f( FP_SPEED ); - return qtrue; - } - if ( Q_stricmp( cmd, "setForceGrip" ) == 0 ) +static void Svcmd_Control_f(void) +{ + const char *cmd2 = gi.argv(1); + if ( !*cmd2 || !cmd2[0] ) { - Svcmd_ForceSetLevel_f( FP_GRIP ); - return qtrue; + if ( !G_ClearViewEntity( &g_entities[0] ) ) + { + gi.Printf( S_COLOR_RED "control \n", cmd2 ); + } } - if ( Q_stricmp( cmd, "setForceLightning" ) == 0 ) + else { - Svcmd_ForceSetLevel_f( FP_LIGHTNING ); - return qtrue; + Q3_SetViewEntity( 0, cmd2 ); } - if ( Q_stricmp( cmd, "setMindTrick" ) == 0 ) +} + +static void Svcmd_Secrets_f(void) +{ + const gentity_t *pl = &g_entities[0]; + if(pl->client->sess.missionStats.totalSecrets < 1) { - Svcmd_ForceSetLevel_f( FP_TELEPATHY ); - return qtrue; + gi.Printf( "There are" S_COLOR_RED " NO " S_COLOR_WHITE "secrets on this map!\n" ); } - if ( Q_stricmp( cmd, "setSaberDefense" ) == 0 ) + else if(pl->client->sess.missionStats.secretsFound == pl->client->sess.missionStats.totalSecrets) { - Svcmd_ForceSetLevel_f( FP_SABER_DEFENSE ); - return qtrue; + gi.Printf( "You've found all " S_COLOR_GREEN "%i" S_COLOR_WHITE " secrets on this map!\n", pl->client->sess.missionStats.secretsFound ); } - if ( Q_stricmp( cmd, "setSaberOffense" ) == 0 ) + else { - Svcmd_ForceSetLevel_f( FP_SABER_OFFENSE ); - return qtrue; + gi.Printf( "You've found " S_COLOR_GREEN "%i" S_COLOR_WHITE " out of " S_COLOR_GREEN "%i" S_COLOR_WHITE " secrets!\n", pl->client->sess.missionStats.secretsFound, pl->client->sess.missionStats.totalSecrets ); } - if ( Q_stricmp( cmd, "setForceAll" ) == 0 ) - { - if ( !g_cheats->integer ) - { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\"" ); - return qtrue; - } +} - for ( int i = FP_HEAL; i <= FP_SABER_OFFENSE; i++ ) - { - Svcmd_ForceSetLevel_f( i ); - } - return qtrue; - } - if ( Q_stricmp( cmd, "setSaberAll" ) == 0 ) +// PADAWAN - g_spskill 0 + cg_crosshairForceHint 1 + handicap 100 +// JEDI - g_spskill 1 + cg_crosshairForceHint 1 + handicap 100 +// JEDI KNIGHT - g_spskill 2 + cg_crosshairForceHint 0 + handicap 100 +// JEDI MASTER - g_spskill 2 + cg_crosshairForceHint 0 + handicap 50 + +extern cvar_t *g_spskill; +static void Svcmd_Difficulty_f(void) +{ + if(gi.argc() == 1) { - if ( !g_cheats->integer ) + if(g_spskill->integer == 0) { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\"" ); - return qtrue; + gi.Printf( S_COLOR_GREEN "Current Difficulty: Padawan" S_COLOR_WHITE "\n" ); } - - Svcmd_ForceSetLevel_f( FP_SABERTHROW ); - Svcmd_ForceSetLevel_f( FP_SABER_DEFENSE ); - Svcmd_ForceSetLevel_f( FP_SABER_OFFENSE ); - return qtrue; - } - if ( Q_stricmp( cmd, "saberAttackCycle" ) == 0 ) - { - Svcmd_SaberAttackCycle_f(); - return qtrue; - } - if ( Q_stricmp( cmd, "runscript" ) == 0 ) - { - if ( !g_cheats->integer ) + else if(g_spskill->integer == 1) { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; + gi.Printf( S_COLOR_GREEN "Current Difficulty: Jedi" S_COLOR_WHITE "\n" ); } - const char *cmd2 = gi.argv(1); - - if ( cmd2 && cmd2[0] ) + else if(g_spskill->integer == 2) { - const char *cmd3 = gi.argv(2); - if ( cmd3 && cmd3[0] ) + int crosshairHint = gi.Cvar_VariableIntegerValue("cg_crosshairForceHint"); + int handicap = gi.Cvar_VariableIntegerValue("handicap"); + if(handicap == 100 && crosshairHint == 0) + { + gi.Printf( S_COLOR_GREEN "Current Difficulty: Jedi Knight" S_COLOR_WHITE "\n" ); + } + else if(handicap == 50 && crosshairHint == 0) { - gentity_t *found = NULL; - if ( (found = G_Find(NULL, FOFS(targetname), cmd2 ) ) != NULL ) - { - ICARUS_RunScript( found, va( "%s/%s", Q3_SCRIPT_DIR, cmd3 ) ); - } - else - { - //can't find cmd2 - gi.Printf( S_COLOR_RED"runscript: can't find targetname %s\n", cmd2 ); - } + gi.Printf( S_COLOR_GREEN "Current Difficulty: Jedi Master" S_COLOR_WHITE "\n" ); } else { - ICARUS_RunScript( &g_entities[0], va( "%s/%s", Q3_SCRIPT_DIR, cmd2 ) ); + gi.Printf( S_COLOR_GREEN "Current Difficulty: Jedi Knight (Custom)" S_COLOR_WHITE "\n" ); + gi.Printf( S_COLOR_GREEN "Crosshair Force Hint: %i" S_COLOR_WHITE "\n", crosshairHint != 0 ? 1 : 0 ); + gi.Printf( S_COLOR_GREEN "Handicap: %i" S_COLOR_WHITE "\n", handicap ); } } else { - gi.Printf( S_COLOR_RED"usage: runscript scriptname\n" ); + gi.Printf( S_COLOR_RED "Invalid difficulty cvar set! g_spskill (%i) [0-2] is valid range only" S_COLOR_WHITE "\n", g_spskill->integer ); } - //FIXME: else warning - return qtrue; } +} - if ( Q_stricmp( cmd, "playerteam" ) == 0 ) - { - if ( !g_cheats->integer ) - { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; - } - const char *cmd2 = gi.argv(1); - int n; +#define CMD_NONE (0x00000000u) +#define CMD_CHEAT (0x00000001u) +#define CMD_ALIVE (0x00000002u) - if ( !*cmd2 || !cmd2[0] ) - { - gi.Printf( S_COLOR_RED"'playerteam' - change player team, requires a team name!\n" ); - gi.Printf( S_COLOR_RED"Valid team names are:\n"); - for ( n = (TEAM_FREE + 1); n < TEAM_NUM_TEAMS; n++ ) - { - gi.Printf( S_COLOR_RED"%s\n", TeamNames[n] ); - } - } - else - { - team_t team; +typedef struct svcmd_s { + const char *name; + void (*func)(void); + uint32_t flags; +} svcmd_t; - team = TranslateTeamName( cmd2 ); - if ( team == TEAM_FREE ) - { - gi.Printf( S_COLOR_RED"'playerteam' unrecognized team name %s!\n", cmd2 ); - gi.Printf( S_COLOR_RED"Valid team names are:\n"); - for ( n = (TEAM_FREE + 1); n < TEAM_NUM_TEAMS; n++ ) - { - gi.Printf( S_COLOR_RED"%s\n", TeamNames[n] ); - } - } - else - { - g_entities[0].client->playerTeam = team; - //FIXME: convert Imperial, Malon, Hirogen and Klingon to Scavenger? - } - } - return qtrue; - } +static int svcmdcmp( const void *a, const void *b ) { + return Q_stricmp( (const char *)a, ((svcmd_t*)b)->name ); +} + +// FIXME some of these should be made CMD_ALIVE too! +static svcmd_t svcmds[] = { + { "entitylist", Svcmd_EntityList_f, CMD_NONE }, + { "game_memory", Svcmd_GameMem_f, CMD_NONE }, + + { "nav", Svcmd_Nav_f, CMD_CHEAT }, + { "npc", Svcmd_NPC_f, CMD_CHEAT }, + { "use", Svcmd_Use_f, CMD_CHEAT }, + { "ICARUS", Svcmd_ICARUS_f, CMD_CHEAT }, + + { "saberColor", Svcmd_SaberColor_f, CMD_CHEAT }, + + { "setForceJump", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setSaberThrow", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceHeal", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForcePush", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForcePull", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceSpeed", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceGrip", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceLightning", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setMindTrick", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setSaberDefense", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setSaberOffense", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceAll", Svcmd_SetForceAll_f, CMD_CHEAT }, + { "setSaberAll", Svcmd_SetSaberAll_f, CMD_CHEAT }, + + { "saberAttackCycle", Svcmd_SaberAttackCycle_f, CMD_NONE }, + + { "runscript", Svcmd_RunScript_f, CMD_CHEAT }, + + { "playerTeam", Svcmd_PlayerTeam_f, CMD_CHEAT }, + + { "control", Svcmd_Control_f, CMD_CHEAT }, - if ( Q_stricmp( cmd, "control" ) == 0 ) + { "exitview", Svcmd_ExitView_f, CMD_NONE }, + + { "secrets", Svcmd_Secrets_f, CMD_NONE }, + { "difficulty", Svcmd_Difficulty_f, CMD_NONE }, + + //{ "say", Svcmd_Say_f, qtrue }, + //{ "toggleallowvote", Svcmd_ToggleAllowVote_f, qfalse }, + //{ "toggleuserinfovalidation", Svcmd_ToggleUserinfoValidation_f, qfalse }, +}; +static const size_t numsvcmds = ARRAY_LEN( svcmds ); + +/* +================= +ConsoleCommand +================= +*/ +qboolean ConsoleCommand( void ) { + const char *cmd = gi.argv(0); + const svcmd_t *command = (const svcmd_t *)Q_LinearSearch( cmd, svcmds, numsvcmds, sizeof( svcmds[0] ), svcmdcmp ); + + if ( !command ) + return qfalse; + + if ( (command->flags & CMD_CHEAT) + && !g_cheats->integer ) { - if ( !g_cheats->integer ) - { - gi.SendServerCommand( 0, "print \"Cheats are not enabled on this server.\n\""); - return qtrue; - } - const char *cmd2 = gi.argv(1); - if ( !*cmd2 || !cmd2[0] ) - { - if ( !G_ClearViewEntity( &g_entities[0] ) ) - { - gi.Printf( S_COLOR_RED"control \n", cmd2 ); - } - } - else - { - Q3_SetViewEntity( 0, cmd2 ); - } + gi.Printf( "Cheats are not enabled on this server.\n" ); return qtrue; } - - if ( Q_stricmp( cmd, "exitview" ) == 0 ) + else if ( (command->flags & CMD_ALIVE) + && (g_entities[0].health <= 0) ) { - Svcmd_ExitView_f(); + gi.Printf( "You must be alive to use this command.\n" ); return qtrue; } - - return qfalse; + else + command->func(); + return qtrue; } From 761654897b42a7754a4808f4d0dd4d46372c2a25 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 24 Oct 2016 12:04:14 -0500 Subject: [PATCH 352/445] Shared: Fixed clang compile using invalid warning flag declarator --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d6130ba727..7a17d4d764 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -272,7 +272,8 @@ elseif (("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") OR ("${CMAKE_C_COMPILER_ID}" S endif() elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-writable-strings") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-write-strings") + #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-writable-strings") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-comment") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-invalid-offsetof") endif() From 4eb26a88b6178df1b3cbb66b5430bae1a8f628fc Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 24 Oct 2016 21:33:35 -0500 Subject: [PATCH 353/445] SP: Stop using bsearch and use Q_LinearSearch in client side This was already done in g_svcmds.cpp and already finished in MP but hadn't been merged to the SP codebases yet. --- code/cgame/cg_consolecmds.cpp | 2 +- code/cgame/cg_servercmds.cpp | 2 +- codeJK2/cgame/cg_consolecmds.cpp | 2 +- codeJK2/cgame/cg_servercmds.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/cgame/cg_consolecmds.cpp b/code/cgame/cg_consolecmds.cpp index 454ffbffae..26448320ec 100644 --- a/code/cgame/cg_consolecmds.cpp +++ b/code/cgame/cg_consolecmds.cpp @@ -269,7 +269,7 @@ Cmd_Argc() / Cmd_Argv() qboolean CG_ConsoleCommand( void ) { consoleCommand_t *command = NULL; - command = (consoleCommand_t *)bsearch( CG_Argv( 0 ), commands, numCommands, sizeof( commands[0] ), cmdcmp ); + command = (consoleCommand_t *)Q_LinearSearch( CG_Argv( 0 ), commands, numCommands, sizeof( commands[0] ), cmdcmp ); if ( !command ) return qfalse; diff --git a/code/cgame/cg_servercmds.cpp b/code/cgame/cg_servercmds.cpp index 9875caf623..390fe61141 100644 --- a/code/cgame/cg_servercmds.cpp +++ b/code/cgame/cg_servercmds.cpp @@ -239,7 +239,7 @@ static void CG_ServerCommand( void ) { return; } - command = (serverCommand_t *)bsearch( cmd, commands, numCommands, sizeof( commands[0] ), svcmdcmp ); + command = (serverCommand_t *)Q_LinearSearch( cmd, commands, numCommands, sizeof( commands[0] ), svcmdcmp ); if ( command ) { command->func(); diff --git a/codeJK2/cgame/cg_consolecmds.cpp b/codeJK2/cgame/cg_consolecmds.cpp index 9fbe14cdf4..3a408b0cdc 100644 --- a/codeJK2/cgame/cg_consolecmds.cpp +++ b/codeJK2/cgame/cg_consolecmds.cpp @@ -254,7 +254,7 @@ Cmd_Argc() / Cmd_Argv() qboolean CG_ConsoleCommand( void ) { consoleCommand_t *command = NULL; - command = (consoleCommand_t *)bsearch( CG_Argv( 0 ), commands, numCommands, sizeof( commands[0] ), cmdcmp ); + command = (consoleCommand_t *)Q_LinearSearch( CG_Argv( 0 ), commands, numCommands, sizeof( commands[0] ), cmdcmp ); if ( !command ) return qfalse; diff --git a/codeJK2/cgame/cg_servercmds.cpp b/codeJK2/cgame/cg_servercmds.cpp index d4ddc0ef92..b5c4d3226e 100644 --- a/codeJK2/cgame/cg_servercmds.cpp +++ b/codeJK2/cgame/cg_servercmds.cpp @@ -292,7 +292,7 @@ static void CG_ServerCommand( void ) { return; } - command = (serverCommand_t *)bsearch( cmd, commands, numCommands, sizeof( commands[0] ), svcmdcmp ); + command = (serverCommand_t *)Q_LinearSearch( cmd, commands, numCommands, sizeof( commands[0] ), svcmdcmp ); if ( command ) { command->func(); From b376600ab9ac09af59b32961c66965c5ab59a92d Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 24 Oct 2016 21:34:37 -0500 Subject: [PATCH 354/445] SP: Add tab completion for new commands Adds `difficult`y and `secrets` to tab completion. --- code/cgame/cg_consolecmds.cpp | 2 ++ codeJK2/cgame/cg_consolecmds.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/code/cgame/cg_consolecmds.cpp b/code/cgame/cg_consolecmds.cpp index 26448320ec..a990b79622 100644 --- a/code/cgame/cg_consolecmds.cpp +++ b/code/cgame/cg_consolecmds.cpp @@ -281,6 +281,7 @@ qboolean CG_ConsoleCommand( void ) { static const char *gcmds[] = { "bow", "entitylist", + "difficulty", "flourish", "force_absorb", "force_distract", @@ -310,6 +311,7 @@ static const char *gcmds[] = { "saberAttackCycle", "saberColor", "saberblade", + "secrets", "setForceAll", "setSaberAll", "setobjective", diff --git a/codeJK2/cgame/cg_consolecmds.cpp b/codeJK2/cgame/cg_consolecmds.cpp index 3a408b0cdc..6a67a67b55 100644 --- a/codeJK2/cgame/cg_consolecmds.cpp +++ b/codeJK2/cgame/cg_consolecmds.cpp @@ -265,6 +265,7 @@ qboolean CG_ConsoleCommand( void ) { static const char *gcmds[] = { "entitylist", + "difficulty", "force_distract", "force_grip", "force_heal", @@ -283,6 +284,7 @@ static const char *gcmds[] = { "runscript", "saberAttackCycle", "saberColor", + "secrets", "setForceAll", "setSaberAll", "setobjective", From c97a368aa7f8e3846431101ef9845d5ae2d25a2f Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 24 Oct 2016 23:05:28 -0500 Subject: [PATCH 355/445] JK2: Fix rendering of weapon icons Fixed rendering of weapon icons in datapad and scroll wheel. Previously, Raven neglected to actually check the player's ammo counts. --- codeJK2/cgame/cg_weapons.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/codeJK2/cgame/cg_weapons.cpp b/codeJK2/cgame/cg_weapons.cpp index 4b5366b5be..6bfbbd5a85 100644 --- a/codeJK2/cgame/cg_weapons.cpp +++ b/codeJK2/cgame/cg_weapons.cpp @@ -1267,7 +1267,7 @@ int CG_WeaponCheck( int weaponIndex ) { int value; - if ( weaponIndex == WP_SABER) + if ( weaponIndex == WP_SABER || weaponIndex == WP_STUN_BATON ) { return qtrue; } @@ -1276,14 +1276,20 @@ int CG_WeaponCheck( int weaponIndex ) ? weaponData[weaponIndex].energyPerShot : weaponData[weaponIndex].altEnergyPerShot; - if (value > 0) + if( !cg.snap ) { - value = qtrue; + return qfalse; } - else + + // check how much energy(ammo) it takes to fire this weapon against how much ammo we have + if ( value > cg.snap->ps.ammo[weaponData[weaponIndex].ammoIndex] ) { value = qfalse; } + else + { + value = qtrue; + } return value; } From 93bffc438c501c386b889c755ab6beb29bdd4000 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Tue, 25 Oct 2016 14:00:27 -0500 Subject: [PATCH 356/445] Shared: Implement menu hacks to workaround buggy menus All: Disable the EAX options on Non Windows 32-bit platforms. All: Fix Sound Quality missing the "Very High" (s_khz 44) option. SP: Fix subtitle missing "All voiceovers" (g_subtitles 1) option. JK2SP: Fix anisotropic filtering being an ON/OFF switch instead of a slider for range value. MP: Extend favorite address IP field to IPv6 max length. MP: Extend player name fields to at least MAX_NAME_LENGTH (32). --- code/ui/ui_shared.cpp | 230 +++++++++++++++++++++++++++++++++--------- code/ui/ui_shared.h | 8 +- codemp/ui/ui_main.c | 4 +- codemp/ui/ui_shared.c | 135 ++++++++++++++++++------- codemp/ui/ui_shared.h | 8 +- 5 files changed, 295 insertions(+), 90 deletions(-) diff --git a/code/ui/ui_shared.cpp b/code/ui/ui_shared.cpp index 5aa60c60d6..00614b1d14 100644 --- a/code/ui/ui_shared.cpp +++ b/code/ui/ui_shared.cpp @@ -1027,25 +1027,131 @@ qboolean MenuParse_fadeCycle( itemDef_t *item) return qtrue; } +/* +=============== +Item_ApplyHacks +Hacks to fix issues with Team Arena menu scripts +=============== +*/ +static void Item_ApplyHacks( itemDef_t *item ) { +#if !defined(_WIN32) || ( defined(_WIN32) && defined(idx64) ) + // Fix length of favorite address in createfavorite.menu + if ( item->type == ITEM_TYPE_MULTI && item->cvar && !Q_stricmp( item->cvar, "s_UseOpenAL" ) ) { + if( item->parent ) + { + menuDef_t *parent = (menuDef_t *)item->parent; + VectorSet4( parent->disableColor, 0.5f, 0.5f, 0.5f, 1.0f ); + item->disabled = qtrue; + // Just in case it had focus + item->window.flags &= ~WINDOW_MOUSEOVER; + Com_Printf( "Disabling eax field because current platform does not support EAX.\n"); + } + } + + if ( item->type == ITEM_TYPE_TEXT && item->window.name && !Q_stricmp( item->window.name, "eax_icon") && item->cvarTest && !Q_stricmp( item->cvarTest, "s_UseOpenAL" ) && item->enableCvar && item->cvarFlags & CVAR_HIDE ) { + if( item->parent ) + { + menuDef_t *parent = (menuDef_t *)item->parent; + VectorSet4( parent->disableColor, 0.5f, 0.5f, 0.5f, 1.0f ); + item->disabled = item->disabledHidden = qtrue; + // Just in case it had focus + item->window.flags &= ~WINDOW_MOUSEOVER; + Com_Printf( "Hiding eax_icon object because current platform does not support EAX.\n"); + } + } +#endif + + if ( item->type == ITEM_TYPE_MULTI && item->window.name && !Q_stricmp( item->window.name, "sound_quality") ) { + multiDef_t *multiPtr = (multiDef_t *)item->typeData; + int i; + qboolean found = qfalse; + for( i = 0; i < multiPtr->count; i++ ) + { + if ( multiPtr->cvarValue[i] == 44 ) + { + found = qtrue; + break; + } + } + if ( !found && multiPtr->count < MAX_MULTI_CVARS ) + { +#ifdef JK2_MODE + multiPtr->cvarList[multiPtr->count] = String_Alloc("@MENUS0_VERY_HIGH"); +#else + multiPtr->cvarList[multiPtr->count] = String_Alloc("@MENUS_VERY_HIGH"); +#endif + multiPtr->cvarValue[multiPtr->count] = 44; + multiPtr->count++; + Com_Printf( "Extended sound quality field to contain very high option.\n"); + } + } + + if ( item->type == ITEM_TYPE_MULTI && item->window.name && !Q_stricmp( item->window.name, "voice") && item->cvar && !Q_stricmp( item->cvar, "g_subtitles" ) ) { + multiDef_t *multiPtr = (multiDef_t *)item->typeData; + int i; + qboolean found = qfalse; + for( i = 0; i < multiPtr->count; i++ ) + { + if ( multiPtr->cvarValue[i] == 1 ) + { + found = qtrue; + break; + } + } + if ( !found && multiPtr->count < MAX_MULTI_CVARS ) + { +#ifdef JK2_MODE + multiPtr->cvarList[multiPtr->count] = String_Alloc("@MENUS3_ALL_VOICEOVERS"); +#else + multiPtr->cvarList[multiPtr->count] = String_Alloc("@MENUS_ALL_VOICEOVERS"); +#endif + multiPtr->cvarValue[multiPtr->count] = 1; + multiPtr->count++; + Com_Printf( "Extended subtitles field to contain all voiceovers option.\n"); + } + } + +#ifdef JK2_MODE + if ( item->type == ITEM_TYPE_MULTI && item->window.name && !Q_stricmp( item->window.name, "video_mode") && item->cvar && !Q_stricmp( item->cvar, "r_ext_texture_filter_anisotropic" ) ) { + { + memset(item->typeData, 0, sizeof(multiDef_t)); + } + editFieldDef_t *editPtr = NULL; + + item->cvarFlags = CVAR_DISABLE; + item->type = ITEM_TYPE_SLIDER; + + Item_ValidateTypeData(item); + + editPtr = (editFieldDef_t *)item->typeData; + editPtr->minVal = 0.5f; + editPtr->maxVal = cls.glconfig.maxTextureFilterAnisotropy; + editPtr->defVal = 1.0f; + Com_Printf( "Converted anisotropic filter field to slider.\n"); + } +#endif +} /* ================ MenuParse_itemDef ================ */ -qboolean MenuParse_itemDef( itemDef_t *item) +qboolean MenuParse_itemDef( itemDef_t *item ) { menuDef_t *menu = (menuDef_t*)item; if (menu->itemCount < MAX_MENUITEMS) { - menu->items[menu->itemCount] = (struct itemDef_s *) UI_Alloc(sizeof(itemDef_t)); - Item_Init(menu->items[menu->itemCount]); - if (!Item_Parse(menu->items[menu->itemCount])) + itemDef_t *newItem = menu->items[menu->itemCount] = (struct itemDef_s *) UI_Alloc(sizeof(itemDef_t)); + Item_Init(newItem); + if (!Item_Parse(newItem)) { return qfalse; } - Item_InitControls(menu->items[menu->itemCount]); - menu->items[menu->itemCount++]->parent = menu; + Item_InitControls( newItem ); + newItem->parent = menu->items[menu->itemCount]->parent = menu; + menu->itemCount++; + Item_ApplyHacks( newItem ); } else { @@ -1851,6 +1957,25 @@ void Menu_OrbitItemByName(menuDef_t *menu, const char *p, float x, float y, floa } } +void Menu_ItemDisable(menuDef_t *menu, const char *name, qboolean disableFlag) +{ + int j,count; + itemDef_t *itemFound; + + count = Menu_ItemsMatchingGroup(menu, name); + // Loop through all items that have this name + for (j = 0; j < count; j++) + { + itemFound = Menu_GetMatchingItemByNumber( menu, j, name); + if (itemFound != NULL) + { + itemFound->disabled = disableFlag; + // Just in case it had focus + itemFound->window.flags &= ~WINDOW_MOUSEOVER; + } + } +} + /* ================= Rect_Parse @@ -6156,6 +6281,11 @@ void Item_TextColor(itemDef_t *item, vec4_t *newColor) memcpy(newColor, &item->window.foreColor, sizeof(vec4_t)); } + if (item->disabled) + { + memcpy(newColor, &parent->disableColor, sizeof(vec4_t)); + } + // items can be enabled and disabled based on cvars if (item->enableCvar && *item->enableCvar && item->cvarTest && *item->cvarTest) { @@ -7295,6 +7425,9 @@ void Item_OwnerDraw_Paint(itemDef_t *item) LerpColor(item->window.foreColor,lowLight,color,0.5+0.5*sin((float)(DC->realTime / PULSE_DIVISOR))); } + if ( item->disabled ) + memcpy( color, parent->disableColor, sizeof( vec4_t ) ); + if (item->cvarFlags & (CVAR_ENABLE | CVAR_DISABLE) && !Item_EnableShowViaCvar(item, CVAR_ENABLE)) { memcpy(color, parent->disableColor, sizeof(vec4_t)); @@ -7316,25 +7449,11 @@ void Item_OwnerDraw_Paint(itemDef_t *item) void Item_YesNo_Paint(itemDef_t *item) { - vec4_t newColor, lowLight; + vec4_t color; float value; - menuDef_t *parent = (menuDef_t*)item->parent; value = (item->cvar) ? DC->getCVarValue(item->cvar) : 0; - if (item->window.flags & WINDOW_HASFOCUS) - { - lowLight[0] = 0.8 * parent->focusColor[0]; - lowLight[1] = 0.8 * parent->focusColor[1]; - lowLight[2] = 0.8 * parent->focusColor[2]; - lowLight[3] = 0.8 * parent->focusColor[3]; - LerpColor(parent->focusColor,lowLight,newColor,0.5+0.5*sin((float)(DC->realTime / PULSE_DIVISOR))); - } - else - { - memcpy(&newColor, &item->window.foreColor, sizeof(vec4_t)); - } - #ifdef JK2_MODE const char *psYes = ui.SP_GetStringTextString( "MENUS0_YES" ); const char *psNo = ui.SP_GetStringTextString( "MENUS0_NO" ); @@ -7349,15 +7468,15 @@ void Item_YesNo_Paint(itemDef_t *item) else yesnovalue = (value != 0) ? psYes : psNo; + Item_TextColor(item, &color); if (item->text) { Item_Text_Paint(item); - DC->drawText(item->textRect.x + item->textRect.w + 8, item->textRect.y, item->textscale, newColor, yesnovalue, 0, item->textStyle, item->font); - + DC->drawText(item->textRect.x + item->textRect.w + 8, item->textRect.y, item->textscale, color, yesnovalue, 0, item->textStyle, item->font); } else { - DC->drawText(item->textRect.x, item->textRect.y, item->textscale, newColor, yesnovalue , 0, item->textStyle, item->font); + DC->drawText(item->textRect.x, item->textRect.y, item->textscale, color, yesnovalue , 0, item->textStyle, item->font); } } @@ -7369,22 +7488,8 @@ Item_Multi_Paint */ void Item_Multi_Paint(itemDef_t *item) { - vec4_t newColor, lowLight; + vec4_t color; const char *text = ""; - menuDef_t *parent = (menuDef_t*)item->parent; - - if (item->window.flags & WINDOW_HASFOCUS) - { - lowLight[0] = 0.8 * parent->focusColor[0]; - lowLight[1] = 0.8 * parent->focusColor[1]; - lowLight[2] = 0.8 * parent->focusColor[2]; - lowLight[3] = 0.8 * parent->focusColor[3]; - LerpColor(parent->focusColor,lowLight,newColor,0.5+0.5*sin((float)(DC->realTime / PULSE_DIVISOR))); - } - else - { - memcpy(&newColor, &item->window.foreColor, sizeof(vec4_t)); - } text = Item_Multi_Setting(item); if (*text == '@') // string reference @@ -7392,16 +7497,16 @@ void Item_Multi_Paint(itemDef_t *item) text = SE_GetString( &text[1] ); } - + Item_TextColor(item, &color); if (item->text) { Item_Text_Paint(item); - DC->drawText(item->textRect.x + item->textRect.w + 8, item->textRect.y, item->textscale, newColor, text, 0, item->textStyle, item->font); + DC->drawText(item->textRect.x + item->textRect.w + 8, item->textRect.y, item->textscale, color, text, 0, item->textStyle, item->font); } else { //JLF added xoffset - DC->drawText(item->textRect.x +item->xoffset, item->textRect.y, item->textscale, newColor, text, 0, item->textStyle, item->font); + DC->drawText(item->textRect.x +item->xoffset, item->textRect.y, item->textscale, color, text, 0, item->textStyle, item->font); } } @@ -8088,6 +8193,11 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) } } + if (item->disabled && item->disabledHidden) + { + return qfalse; + } + if (item->cvarFlags & (CVAR_SHOW | CVAR_HIDE)) { if (!Item_EnableShowViaCvar(item, CVAR_SHOW)) @@ -8337,10 +8447,9 @@ Window_Paint */ void Window_Paint(Window *w, float fadeAmount, float fadeClamp, float fadeCycle) { - //float bordersize = 0; - vec4_t color; - rectDef_t fillRect = w->rect; - + //float bordersize = 0; + vec4_t color; + rectDef_t fillRect = w->rect; if (uis.debugMode) { @@ -8985,6 +9094,12 @@ void Item_MouseEnter(itemDef_t *item, float x, float y) // r.y -= r.h; // NOt sure why this is here, but I commented it out. // in the text rect? + // items can be enabled and disabled + if (item->disabled) + { + return; + } + // items can be enabled and disabled based on cvars if (item->cvarFlags & (CVAR_ENABLE | CVAR_DISABLE) && !Item_EnableShowViaCvar(item, CVAR_ENABLE)) { @@ -9061,6 +9176,12 @@ qboolean Item_SetFocus(itemDef_t *item, float x, float y) } menuDef_t *parent = (menuDef_t*)item->parent; + // items can be enabled and disabled + if (item->disabled) + { + return qfalse; + } + // items can be enabled and disabled based on cvars if (item->cvarFlags & (CVAR_ENABLE | CVAR_DISABLE) && !Item_EnableShowViaCvar(item, CVAR_ENABLE)) { @@ -9234,6 +9355,11 @@ void Menu_HandleMouseMove(menuDef_t *menu, float x, float y) continue; } + if (menu->items[i]->disabled) + { + continue; + } + // items can be enabled and disabled based on cvars if (menu->items[i]->cvarFlags & (CVAR_ENABLE | CVAR_DISABLE) && !Item_EnableShowViaCvar(menu->items[i], CVAR_ENABLE)) { @@ -11096,12 +11222,22 @@ void Menu_HandleKey(menuDef_t *menu, int key, qboolean down) } } + // Ignore if disabled + if (item && item->disabled) + { + return; + } + if (item != NULL) { if (Item_HandleKey(item, key, down)) //JLFLISTBOX { - Item_Action(item); + // It is possible for an item to be disable after Item_HandleKey is run (like in Voice Chat) + if (!item->disabled) + { + Item_Action(item); + } inHandler = qfalse; return; } diff --git a/code/ui/ui_shared.h b/code/ui/ui_shared.h index 53151f3fca..a661370136 100644 --- a/code/ui/ui_shared.h +++ b/code/ui/ui_shared.h @@ -395,7 +395,8 @@ typedef struct itemDef_s { int font; // FONT_SMALL,FONT_MEDIUM,FONT_LARGE int invertYesNo; int xoffset; - + qboolean disabled; // Does this item ignore mouse and keyboard focus + qboolean disabledHidden; // hide the item when 'disabled' is true (for generic image items) } itemDef_t; typedef struct { @@ -471,6 +472,11 @@ qboolean Menus_AnyFullScreenVisible(void); void Menus_CloseAll(void); int Menu_Count(void); itemDef_t *Menu_FindItemByName(menuDef_t *menu, const char *p); +void Menu_ShowGroup (menuDef_t *menu, const char *itemName, qboolean showFlag); +void Menu_ItemDisable(menuDef_t *menu, const char *name, qboolean disableFlag); +int Menu_ItemsMatchingGroup(menuDef_t *menu, const char *name); +itemDef_t *Menu_GetMatchingItemByNumber(menuDef_t *menu, int index, const char *name); + void Menu_HandleKey(menuDef_t *menu, int key, qboolean down); void Menu_New(char *buffer); void Menus_OpenByName(const char *p); diff --git a/codemp/ui/ui_main.c b/codemp/ui/ui_main.c index 40fa5def78..ad767d8161 100644 --- a/codemp/ui/ui_main.c +++ b/codemp/ui/ui_main.c @@ -6828,7 +6828,7 @@ static void UI_RunMenuScript(char **args) Menu_SetItemBackground(menu, item->window.name, string2); // Re-enable this button - Menu_ItemDisable(menu,(char *) item->window.name, qfalse); + Menu_ItemDisable(menu, item->window.name, qfalse); } // Set the new item to the given background @@ -6845,7 +6845,7 @@ static void UI_RunMenuScript(char **args) trap->Cvar_VariableStringBuffer( cvarLitArg, string, sizeof(string) ); Menu_SetItemBackground(menu, item->window.name, string); // Disable button - Menu_ItemDisable(menu,(char *) item->window.name, qtrue); + Menu_ItemDisable(menu, item->window.name, qtrue); } } } diff --git a/codemp/ui/ui_shared.c b/codemp/ui/ui_shared.c index 225c65cf90..b10c6fef22 100644 --- a/codemp/ui/ui_shared.c +++ b/codemp/ui/ui_shared.c @@ -1317,7 +1317,7 @@ qboolean Script_SetItemRect(itemDef_t *item, char **args) return qtrue; } -void Menu_ShowGroup (menuDef_t *menu, char *groupName, qboolean showFlag) +void Menu_ShowGroup (menuDef_t *menu, const char *groupName, qboolean showFlag) { itemDef_t *item; int count,j; @@ -1710,7 +1710,7 @@ void Menu_OrbitItemByName(menuDef_t *menu, const char *p, float x, float y, floa } } -void Menu_ItemDisable(menuDef_t *menu, char *name,int disableFlag) +void Menu_ItemDisable(menuDef_t *menu, const char *name, qboolean disableFlag) { int j,count; itemDef_t *itemFound; @@ -4691,8 +4691,6 @@ void Item_Text_Paint(itemDef_t *item) { } } - - void Item_TextField_Paint(itemDef_t *item) { char buff[1024]; vec4_t newColor, lowLight; @@ -4736,23 +4734,12 @@ void Item_TextField_Paint(itemDef_t *item) { void Item_YesNo_Paint(itemDef_t *item) { char sYES[20]; char sNO[20]; - vec4_t newColor, lowLight; + vec4_t color; float value; - menuDef_t *parent = (menuDef_t*)item->parent; const char *yesnovalue; value = (item->cvar) ? DC->getCVarValue(item->cvar) : 0; - if (item->window.flags & WINDOW_HASFOCUS) { - lowLight[0] = 0.8 * parent->focusColor[0]; - lowLight[1] = 0.8 * parent->focusColor[1]; - lowLight[2] = 0.8 * parent->focusColor[2]; - lowLight[3] = 0.8 * parent->focusColor[3]; - LerpColor(parent->focusColor,lowLight,newColor,0.5+0.5*sin((float)(DC->realTime / PULSE_DIVISOR))); - } else { - memcpy(&newColor, &item->window.foreColor, sizeof(vec4_t)); - } - trap->SE_GetStringTextString("MENUS_YES",sYES, sizeof(sYES)); trap->SE_GetStringTextString("MENUS_NO", sNO, sizeof(sNO)); @@ -4762,14 +4749,15 @@ void Item_YesNo_Paint(itemDef_t *item) { else yesnovalue = (value != 0) ? sYES : sNO; + Item_TextColor(item, &color); if (item->text) { Item_Text_Paint(item); - DC->drawText(item->textRect.x + item->textRect.w + 8, item->textRect.y, item->textscale, newColor, yesnovalue, 0, 0, item->textStyle, item->iMenuFont); + DC->drawText(item->textRect.x + item->textRect.w + 8, item->textRect.y, item->textscale, color, yesnovalue, 0, 0, item->textStyle, item->iMenuFont); } else { - DC->drawText(item->textRect.x, item->textRect.y, item->textscale, newColor, yesnovalue , 0, 0, item->textStyle, item->iMenuFont); + DC->drawText(item->textRect.x, item->textRect.y, item->textscale, color, yesnovalue , 0, 0, item->textStyle, item->iMenuFont); } /* JLF ORIGINAL CODE @@ -4785,21 +4773,10 @@ void Item_YesNo_Paint(itemDef_t *item) { } void Item_Multi_Paint(itemDef_t *item) { - vec4_t newColor, lowLight; + vec4_t color; const char *text = ""; - menuDef_t *parent = (menuDef_t*)item->parent; char temp[MAX_STRING_CHARS]; - if (item->window.flags & WINDOW_HASFOCUS) { - lowLight[0] = 0.8 * parent->focusColor[0]; - lowLight[1] = 0.8 * parent->focusColor[1]; - lowLight[2] = 0.8 * parent->focusColor[2]; - lowLight[3] = 0.8 * parent->focusColor[3]; - LerpColor(parent->focusColor,lowLight,newColor,0.5+0.5*sin((float)(DC->realTime / PULSE_DIVISOR))); - } else { - memcpy(&newColor, &item->window.foreColor, sizeof(vec4_t)); - } - text = Item_Multi_Setting(item); if (*text == '@') // string reference { @@ -4813,12 +4790,13 @@ void Item_Multi_Paint(itemDef_t *item) { text = temp; } + Item_TextColor(item, &color); if (item->text) { Item_Text_Paint(item); - DC->drawText(item->textRect.x + item->textRect.w + 8, item->textRect.y, item->textscale, newColor, text, 0, 0, item->textStyle,item->iMenuFont); + DC->drawText(item->textRect.x + item->textRect.w + 8, item->textRect.y, item->textscale, color, text, 0, 0, item->textStyle,item->iMenuFont); } else { //JLF added xoffset - DC->drawText(item->textRect.x+item->xoffset, item->textRect.y, item->textscale, newColor, text, 0, 0, item->textStyle,item->iMenuFont); + DC->drawText(item->textRect.x+item->xoffset, item->textRect.y, item->textscale, color, text, 0, 0, item->textStyle,item->iMenuFont); } } @@ -8458,6 +8436,86 @@ void Item_SetupKeywordHash(void) { } } +/* +=============== +Item_ApplyHacks +Hacks to fix issues with Team Arena menu scripts +=============== +*/ +static void Item_ApplyHacks( itemDef_t *item ) { +#if !defined(_WIN32) || ( defined(_WIN32) && defined(idx64) ) + if ( item->type == ITEM_TYPE_MULTI && item->cvar && !Q_stricmp( item->cvar, "s_UseOpenAL" ) ) { + if( item->parent ) + { + menuDef_t *parent = (menuDef_t *)item->parent; + VectorSet4( parent->disableColor, 0.5f, 0.5f, 0.5f, 1.0f ); + item->disabled = qtrue; + // Just in case it had focus + item->window.flags &= ~WINDOW_MOUSEOVER; + Com_Printf( "Disabling eax field because current platform does not support EAX.\n"); + } + } + + if ( item->type == ITEM_TYPE_TEXT && item->window.name && !Q_stricmp( item->window.name, "eax_icon") && item->cvarTest && !Q_stricmp( item->cvarTest, "s_UseOpenAL" ) && item->enableCvar && item->cvarFlags & CVAR_HIDE ) { + if( item->parent ) + { + menuDef_t *parent = (menuDef_t *)item->parent; + VectorSet4( parent->disableColor, 0.5f, 0.5f, 0.5f, 1.0f ); + item->disabled = item->disabledHidden = qtrue; + // Just in case it had focus + item->window.flags &= ~WINDOW_MOUSEOVER; + Com_Printf( "Hiding eax_icon object because current platform does not support EAX.\n"); + } + } +#endif + + // Fix length of favorite address in createfavorite.menu + if ( item->type == ITEM_TYPE_EDITFIELD && item->cvar && !Q_stricmp( item->cvar, "ui_favoriteAddress" ) ) { + editFieldDef_t *editField = item->typeData.edit; + + // enough to hold an IPv6 address plus null + if ( editField->maxChars < 48 ) { + Com_Printf( "Extended create favorite address edit field length to hold an IPv6 address\n" ); + editField->maxChars = 48; + } + } + + if ( item->type == ITEM_TYPE_EDITFIELD && item->cvar && ( !Q_stricmp( item->cvar, "ui_Name" ) || !Q_stricmp( item->cvar, "ui_findplayer" ) ) ) { + editFieldDef_t *editField = item->typeData.edit; + + // enough to hold a full player name + if ( editField->maxChars < MAX_NAME_LENGTH ) { + if ( editField->maxPaintChars > editField->maxChars ) { + editField->maxPaintChars = editField->maxChars; + } + + Com_Printf( "Extended player name field using cvar %s to %d characters\n", item->cvar, MAX_NAME_LENGTH ); + editField->maxChars = MAX_NAME_LENGTH; + } + } + + if ( item->type == ITEM_TYPE_MULTI && item->window.name && !Q_stricmp( item->window.name, "sound_quality") ) { + multiDef_t *multiPtr = item->typeData.multi; + int i; + qboolean found = qfalse; + for( i = 0; i < multiPtr->count; i++ ) + { + if ( multiPtr->cvarValue[i] == 44 ) + { + found = qtrue; + break; + } + } + if ( !found && multiPtr->count < MAX_MULTI_CVARS ) + { + multiPtr->cvarList[multiPtr->count] = String_Alloc("@MENUS_VERY_HIGH"); + multiPtr->cvarValue[multiPtr->count] = 44; + multiPtr->count++; + Com_Printf( "Extended sound quality field to contain very high setting.\n"); + } + } +} + /* =============== Item_Parse @@ -9142,13 +9200,16 @@ qboolean MenuParse_fadeCycle( itemDef_t *item, int handle ) { qboolean MenuParse_itemDef( itemDef_t *item, int handle ) { menuDef_t *menu = (menuDef_t*)item; if (menu->itemCount < MAX_MENUITEMS) { - menu->items[menu->itemCount] = (itemDef_t *) UI_Alloc(sizeof(itemDef_t)); - Item_Init(menu->items[menu->itemCount]); - if (!Item_Parse(handle, menu->items[menu->itemCount])) { + itemDef_t *newItem = menu->items[menu->itemCount] = (itemDef_t *) UI_Alloc(sizeof(itemDef_t)); + Item_Init(newItem); + if (!Item_Parse(handle, newItem)) + { return qfalse; } - Item_InitControls(menu->items[menu->itemCount]); - menu->items[menu->itemCount++]->parent = menu; + Item_InitControls( newItem ); + newItem->parent = menu->items[menu->itemCount]->parent = menu; + menu->itemCount++; + Item_ApplyHacks( newItem ); } return qtrue; } diff --git a/codemp/ui/ui_shared.h b/codemp/ui/ui_shared.h index 56a0ee795d..dcaac98066 100644 --- a/codemp/ui/ui_shared.h +++ b/codemp/ui/ui_shared.h @@ -199,7 +199,7 @@ typedef struct editFieldDef_s { int paintOffset; // } editFieldDef_t; -#define MAX_MULTI_CVARS 32 +#define MAX_MULTI_CVARS 64//32 typedef struct multiDef_s { const char *cvarList[MAX_MULTI_CVARS]; @@ -313,6 +313,8 @@ typedef struct itemDef_s { qboolean disabled; // Does this item ignore mouse and keyboard focus int invertYesNo; int xoffset; + + qboolean disabledHidden; // hide the item when 'disabled' is true (for generic image items) } itemDef_t; typedef struct menuDef_s { @@ -520,8 +522,8 @@ void Menu_Reset(void); qboolean Menus_AnyFullScreenVisible( void ); void Menus_Activate(menuDef_t *menu); itemDef_t *Menu_FindItemByName(menuDef_t *menu, const char *p); -void Menu_ShowGroup (menuDef_t *menu, char *itemName, qboolean showFlag); -void Menu_ItemDisable(menuDef_t *menu, char *name,int disableFlag); +void Menu_ShowGroup (menuDef_t *menu, const char *itemName, qboolean showFlag); +void Menu_ItemDisable(menuDef_t *menu, const char *name, qboolean disableFlag); int Menu_ItemsMatchingGroup(menuDef_t *menu, const char *name); itemDef_t *Menu_GetMatchingItemByNumber(menuDef_t *menu, int index, const char *name); From e5b98faa2084dda02fcac4329d60a48be7a308b6 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sun, 25 Sep 2016 22:11:27 +0100 Subject: [PATCH 357/445] Consistently use "static QINLINE" for inline C code The portable idiom for type-safe macro-like constructs in C is to use "static inline" where C99 inline is supported, or "static __inline" on compilers that implement that keyword as a compiler-specific extension (at least gcc, clang and MSVC do), falling back to just "static" as a last resort on terrible compilers from the distant past. Using "static QINLINE" everywhere means there is no point in defining QINLINE to "static inline" on clang, so stop doing that; QINLINE now consistently expands to Standard C/C++ inline, or __inline on MSVC, or to nothing if we don't know how to inline functions on this compiler. This silences warnings about redundant qualifiers (static static inline) for all the functions that were already inline. There are a couple of uses of non-static QINLINE in C++ code; I've left those intact, since inline has different (more useful) semantics in C++, and as far as I'm aware all reasonable C++ compilers implement it correctly. --- codemp/game/NPC_move.c | 4 ++-- codemp/game/bg_pmove.c | 2 +- shared/qcommon/q_platform.h | 6 +----- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/codemp/game/NPC_move.c b/codemp/game/NPC_move.c index 7fe0842767..5809909167 100644 --- a/codemp/game/NPC_move.c +++ b/codemp/game/NPC_move.c @@ -95,7 +95,7 @@ NPC_CheckCombatMove ------------------------- */ -QINLINE qboolean NPC_CheckCombatMove( void ) +static QINLINE qboolean NPC_CheckCombatMove( void ) { //return NPCInfo->combatMove; if ( ( NPCS.NPCInfo->goalEntity && NPCS.NPC->enemy && NPCS.NPCInfo->goalEntity == NPCS.NPC->enemy ) || ( NPCS.NPCInfo->combatMove ) ) @@ -143,7 +143,7 @@ NPC_GetMoveInformation ------------------------- */ -QINLINE qboolean NPC_GetMoveInformation( vec3_t dir, float *distance ) +static QINLINE qboolean NPC_GetMoveInformation( vec3_t dir, float *distance ) { //NOTENOTE: Use path stacks! diff --git a/codemp/game/bg_pmove.c b/codemp/game/bg_pmove.c index 9b0b9ee2f9..62ac9c8772 100644 --- a/codemp/game/bg_pmove.c +++ b/codemp/game/bg_pmove.c @@ -259,7 +259,7 @@ qboolean BG_KnockDownable(playerState_t *ps) } //hacky assumption check, assume any client non-humanoid is a rocket trooper -qboolean QINLINE PM_IsRocketTrooper(void) +static QINLINE qboolean PM_IsRocketTrooper(void) { /* if (pm->ps->clientNum < MAX_CLIENTS && diff --git a/shared/qcommon/q_platform.h b/shared/qcommon/q_platform.h index 0d60290e41..ee5392e8d9 100644 --- a/shared/qcommon/q_platform.h +++ b/shared/qcommon/q_platform.h @@ -123,11 +123,7 @@ along with this program; if not, see . #define OS_STRING "kFreeBSD" #endif - #ifdef __clang__ - #define QINLINE static inline - #else - #define QINLINE inline - #endif + #define QINLINE inline #define PATH_SEP '/' From d956ce30faf79a60176b079fea9687a5a9123738 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Fri, 28 Oct 2016 10:23:06 +0100 Subject: [PATCH 358/445] g_svcmds: fix typo in avoiding non-C++11-compliant string syntax --- code/game/g_svcmds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index 1ef83885c8..6c2174af9b 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -581,7 +581,7 @@ void Svcmd_SaberAttackCycle_f( void ) //LIGHTSABERCOMBATSTYLE_TAVION break; case SS_STAFF: - gi.Printf( S_COLOR_MAGENTA" Lightsaber Combat Style: Staff\n" ); + gi.Printf( S_COLOR_MAGENTA "Lightsaber Combat Style: Staff\n" ); //LIGHTSABERCOMBATSTYLE_TAVION break; } From 9aea7956e06c06e8ac0f7ed813c0e481da1a7779 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Fri, 28 Oct 2016 11:37:21 +0100 Subject: [PATCH 359/445] savegames: bounds-check some string lengths to prevent buffer overflow --- code/game/G_Timer.cpp | 17 ++++++++++---- code/game/Q3_Interface.cpp | 15 ++++++++++++ code/game/g_roff.cpp | 3 +++ code/icarus/IcarusImplementation.cpp | 34 ++++++++++++++++++++-------- codeJK2/game/Q3_Registers.cpp | 15 ++++++++++++ codeJK2/game/g_roff.cpp | 5 ++++ 6 files changed, 74 insertions(+), 15 deletions(-) diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index d72f5259fe..192594d109 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -243,12 +243,19 @@ void TIMER_Load( void ) const char* sg_buffer_data = static_cast( saved_game.get_buffer_data()); - const int sg_buffer_size = saved_game.get_buffer_size(); + int sg_buffer_size = saved_game.get_buffer_size(); - std::uninitialized_copy_n( - sg_buffer_data, - sg_buffer_size, - tempBuffer); + if (sg_buffer_size < 0 || static_cast(sg_buffer_size) >= sizeof(tempBuffer)) + { + sg_buffer_size = 0; + } + else + { + std::uninitialized_copy_n( + sg_buffer_data, + sg_buffer_size, + tempBuffer); + } tempBuffer[sg_buffer_size] = '\0'; diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 56feeeb015..2c740d48bb 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -7326,6 +7326,11 @@ void CQuake3GameInterface::VariableLoadFloats( varFloat_m &fmap ) INT_ID('F', 'I', 'D', 'L'), idSize); + if (idSize < 0 || static_cast(idSize) >= sizeof(tempBuffer)) + { + idSize = 0; + } + saved_game.read_chunk( INT_ID('F', 'I', 'D', 'S'), tempBuffer, @@ -7371,6 +7376,11 @@ void CQuake3GameInterface::VariableLoadStrings( int type, varString_m &fmap ) INT_ID('S', 'I', 'D', 'L'), idSize); + if (idSize < 0 || static_cast(idSize) >= sizeof(tempBuffer)) + { + idSize = 0; + } + saved_game.read_chunk( INT_ID('S', 'I', 'D', 'S'), tempBuffer, @@ -7382,6 +7392,11 @@ void CQuake3GameInterface::VariableLoadStrings( int type, varString_m &fmap ) INT_ID('S', 'V', 'S', 'Z'), idSize); + if (idSize < 0 || static_cast(idSize) >= sizeof(tempBuffer2)) + { + idSize = 0; + } + saved_game.read_chunk( INT_ID('S', 'V', 'A', 'L'), tempBuffer2, diff --git a/code/game/g_roff.cpp b/code/game/g_roff.cpp index fe1f79fa2d..9ec25adfc2 100644 --- a/code/game/g_roff.cpp +++ b/code/game/g_roff.cpp @@ -703,6 +703,9 @@ void G_LoadCachedRoffs() INT_ID('S', 'L', 'E', 'N'), len); + if (len < 0 || static_cast(len) >= sizeof(buffer)) + len = 0; + saved_game.read_chunk( INT_ID('R', 'S', 'T', 'R'), buffer, diff --git a/code/icarus/IcarusImplementation.cpp b/code/icarus/IcarusImplementation.cpp index 26004b3b4a..7d2fc8fc9d 100644 --- a/code/icarus/IcarusImplementation.cpp +++ b/code/icarus/IcarusImplementation.cpp @@ -716,12 +716,19 @@ int CIcarus::Load() const unsigned char* sg_buffer_data = static_cast( saved_game.get_buffer_data()); - const int sg_buffer_size = saved_game.get_buffer_size(); + int sg_buffer_size = saved_game.get_buffer_size(); - std::uninitialized_copy_n( - sg_buffer_data, - sg_buffer_size, - m_byBuffer); + if (sg_buffer_size < 0 || static_cast(sg_buffer_size) >= sizeof(m_byBuffer)) + { + sg_buffer_size = 0; + } + else + { + std::uninitialized_copy_n( + sg_buffer_data, + sg_buffer_size, + m_byBuffer); + } //Load all signals if ( LoadSignals() == false ) @@ -849,12 +856,19 @@ void CIcarus::BufferRead( void *pDstBuff, unsigned long ulNumBytesToRead ) const unsigned char* sg_buffer_data = static_cast( saved_game.get_buffer_data()); - const int sg_buffer_size = saved_game.get_buffer_size(); + int sg_buffer_size = saved_game.get_buffer_size(); - std::uninitialized_copy_n( - sg_buffer_data, - sg_buffer_size, - m_byBuffer); + if (sg_buffer_size < 0 || static_cast(sg_buffer_size) >= sizeof(m_byBuffer)) + { + sg_buffer_size = 0; + } + else + { + std::uninitialized_copy_n( + sg_buffer_data, + sg_buffer_size, + m_byBuffer); + } m_ulBytesRead = 0; //reset buffer } diff --git a/codeJK2/game/Q3_Registers.cpp b/codeJK2/game/Q3_Registers.cpp index 7797b5f1e2..25c99cd133 100644 --- a/codeJK2/game/Q3_Registers.cpp +++ b/codeJK2/game/Q3_Registers.cpp @@ -408,6 +408,11 @@ void Q3_VariableLoadFloats( varFloat_m &fmap ) INT_ID('F', 'I', 'D', 'L'), idSize); + if (idSize < 0 || static_cast(idSize) >= sizeof(tempBuffer)) + { + idSize = 0; + } + saved_game.read_chunk( INT_ID('F', 'I', 'D', 'S'), tempBuffer, @@ -453,6 +458,11 @@ void Q3_VariableLoadStrings( int type, varString_m &fmap ) INT_ID('S', 'I', 'D', 'L'), idSize); + if (idSize < 0 || static_cast(idSize) >= sizeof(tempBuffer)) + { + idSize = 0; + } + saved_game.read_chunk( INT_ID('S', 'I', 'D', 'S'), tempBuffer, @@ -464,6 +474,11 @@ void Q3_VariableLoadStrings( int type, varString_m &fmap ) INT_ID('S', 'V', 'S', 'Z'), idSize); + if (idSize < 0 || static_cast(idSize) >= sizeof(tempBuffer2)) + { + idSize = 0; + } + saved_game.read_chunk( INT_ID('S', 'V', 'A', 'L'), tempBuffer2, diff --git a/codeJK2/game/g_roff.cpp b/codeJK2/game/g_roff.cpp index 7eb1bd15c8..b5c0240f8f 100644 --- a/codeJK2/game/g_roff.cpp +++ b/codeJK2/game/g_roff.cpp @@ -678,6 +678,11 @@ void G_LoadCachedRoffs() INT_ID('S', 'L', 'E', 'N'), len); + if (len < 0 || static_cast(len) >= sizeof(buffer)) + { + len = 0; + } + saved_game.read_chunk( INT_ID('R', 'S', 'T', 'R'), buffer, From 00d77610dbcd07ed131e40136f50bc749df9d4fc Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Fri, 28 Oct 2016 11:41:39 +0100 Subject: [PATCH 360/445] Use conventional formatting to avoid -Wmisleading-indentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With clang 3.8: .../codemp/client/cl_cin.cpp: In function ‘short unsigned int yuv_to_rgb(long int, long int, long int)’: .../codemp/client/cl_cin.cpp:591:2: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation] if (r<0) r = 0; if (g<0) g = 0; if (b<0) b = 0; ^~ .../codemp/client/cl_cin.cpp:591:18: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘if’ if (r<0) r = 0; if (g<0) g = 0; if (b<0) b = 0; ^~ --- code/client/cl_cin.cpp | 28 ++++++++++++++++++++++++---- codemp/client/cl_cin.cpp | 28 ++++++++++++++++++++++++---- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/code/client/cl_cin.cpp b/code/client/cl_cin.cpp index 337cc64a03..7cf2db8c2f 100644 --- a/code/client/cl_cin.cpp +++ b/code/client/cl_cin.cpp @@ -592,8 +592,18 @@ static unsigned short yuv_to_rgb( long y, long u, long v ) g = (YY + ROQ_UG_tab[u] + ROQ_VG_tab[v]) >> 8; b = (YY + ROQ_UB_tab[u]) >> 9; - if (r<0) r = 0; if (g<0) g = 0; if (b<0) b = 0; - if (r > 31) r = 31; if (g > 63) g = 63; if (b > 31) b = 31; + if (r<0) + r = 0; + if (g<0) + g = 0; + if (b<0) + b = 0; + if (r > 31) + r = 31; + if (g > 63) + g = 63; + if (b > 31) + b = 31; return (unsigned short)((r<<11)+(g<<5)+(b)); } @@ -614,8 +624,18 @@ static unsigned int yuv_to_rgb24( long y, long u, long v ) g = (YY + ROQ_UG_tab[u] + ROQ_VG_tab[v]) >> 6; b = (YY + ROQ_UB_tab[u]) >> 6; - if (r<0) r = 0; if (g<0) g = 0; if (b<0) b = 0; - if (r > 255) r = 255; if (g > 255) g = 255; if (b > 255) b = 255; + if (r<0) + r = 0; + if (g<0) + g = 0; + if (b<0) + b = 0; + if (r > 255) + r = 255; + if (g > 255) + g = 255; + if (b > 255) + b = 255; return LittleLong ((r)|(g<<8)|(b<<16)|(255<<24)); } diff --git a/codemp/client/cl_cin.cpp b/codemp/client/cl_cin.cpp index 2d65b44d57..fde74076ab 100644 --- a/codemp/client/cl_cin.cpp +++ b/codemp/client/cl_cin.cpp @@ -588,8 +588,18 @@ static unsigned short yuv_to_rgb( long y, long u, long v ) g = (YY + ROQ_UG_tab[u] + ROQ_VG_tab[v]) >> 8; b = (YY + ROQ_UB_tab[u]) >> 9; - if (r<0) r = 0; if (g<0) g = 0; if (b<0) b = 0; - if (r > 31) r = 31; if (g > 63) g = 63; if (b > 31) b = 31; + if (r<0) + r = 0; + if (g<0) + g = 0; + if (b<0) + b = 0; + if (r > 31) + r = 31; + if (g > 63) + g = 63; + if (b > 31) + b = 31; return (unsigned short)((r<<11)+(g<<5)+(b)); } @@ -609,8 +619,18 @@ static unsigned int yuv_to_rgb24( long y, long u, long v ) g = (YY + ROQ_UG_tab[u] + ROQ_VG_tab[v]) >> 6; b = (YY + ROQ_UB_tab[u]) >> 6; - if (r<0) r = 0; if (g<0) g = 0; if (b<0) b = 0; - if (r > 255) r = 255; if (g > 255) g = 255; if (b > 255) b = 255; + if (r<0) + r = 0; + if (g<0) + g = 0; + if (b<0) + b = 0; + if (r > 255) + r = 255; + if (g > 255) + g = 255; + if (b > 255) + b = 255; return LittleLong ((r)|(g<<8)|(b<<16)|(255<<24)); } From fb6fe9972100179150fd5f430fd0e13914065459 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 22 Sep 2016 08:29:35 +0100 Subject: [PATCH 361/445] Avoid compiler warning when sscanf writes qboolean through %i .../code/game/g_client.cpp:760:6: warning: format '%i' expects argument of type 'int*', but argument 26 has type 'qboolean*' [-Wformat=] --- code/game/g_client.cpp | 36 ++++++++++++++++++++---------------- code/game/g_session.cpp | 4 +++- codeJK2/game/g_client.cpp | 4 +++- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index 278645ffa4..9c05053db6 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -696,6 +696,8 @@ static void Player_RestoreFromPrevLevel(gentity_t *ent, SavedGameJustLoaded_e eS if (strlen(s)) // actually this would be safe anyway because of the way sscanf() works, but this is clearer {// |general info |-force powers |-saber 1 |-saber 2 |-general saber + int saber1BladeActive[8]; + int saber2BladeActive[8]; unsigned int saber1BladeColor[8]; unsigned int saber2BladeColor[8]; @@ -718,14 +720,14 @@ static void Player_RestoreFromPrevLevel(gentity_t *ent, SavedGameJustLoaded_e eS &client->ps.forcePowerRegenAmount, //saber 1 data saber0Name, - &client->ps.saber[0].blade[0].active, - &client->ps.saber[0].blade[1].active, - &client->ps.saber[0].blade[2].active, - &client->ps.saber[0].blade[3].active, - &client->ps.saber[0].blade[4].active, - &client->ps.saber[0].blade[5].active, - &client->ps.saber[0].blade[6].active, - &client->ps.saber[0].blade[7].active, + &saber1BladeActive[0], + &saber1BladeActive[1], + &saber1BladeActive[2], + &saber1BladeActive[3], + &saber1BladeActive[4], + &saber1BladeActive[5], + &saber1BladeActive[6], + &saber1BladeActive[7], &saber1BladeColor[0], &saber1BladeColor[1], &saber1BladeColor[2], @@ -736,14 +738,14 @@ static void Player_RestoreFromPrevLevel(gentity_t *ent, SavedGameJustLoaded_e eS &saber1BladeColor[7], //saber 2 data saber1Name, - &client->ps.saber[1].blade[0].active, - &client->ps.saber[1].blade[1].active, - &client->ps.saber[1].blade[2].active, - &client->ps.saber[1].blade[3].active, - &client->ps.saber[1].blade[4].active, - &client->ps.saber[1].blade[5].active, - &client->ps.saber[1].blade[6].active, - &client->ps.saber[1].blade[7].active, + &saber2BladeActive[0], + &saber2BladeActive[1], + &saber2BladeActive[2], + &saber2BladeActive[3], + &saber2BladeActive[4], + &saber2BladeActive[5], + &saber2BladeActive[6], + &saber2BladeActive[7], &saber2BladeColor[0], &saber2BladeColor[1], &saber2BladeColor[2], @@ -760,7 +762,9 @@ static void Player_RestoreFromPrevLevel(gentity_t *ent, SavedGameJustLoaded_e eS ); for (int j = 0; j < 8; j++) { + client->ps.saber[0].blade[j].active = saber1BladeActive[j] ? qtrue : qfalse; client->ps.saber[0].blade[j].color = (saber_colors_t)saber1BladeColor[j]; + client->ps.saber[1].blade[j].active = saber2BladeActive[j] ? qtrue : qfalse; client->ps.saber[1].blade[j].color = (saber_colors_t)saber2BladeColor[j]; } diff --git a/code/game/g_session.cpp b/code/game/g_session.cpp index 09f6f602ca..6cde682b0c 100644 --- a/code/game/g_session.cpp +++ b/code/game/g_session.cpp @@ -116,6 +116,7 @@ void G_ReadSessionData( gclient_t *client ) { char s[MAX_STRING_CHARS]; const char *var; int i; + int lightsideDisplay; var = va( "session%i", client - level.clients ); gi.Cvar_VariableStringBuffer( var, s, sizeof(s) ); @@ -145,8 +146,9 @@ void G_ReadSessionData( gclient_t *client ) { // Now load the LIGHTSIDE objective. That's the only cross level objective. sscanf( var, "%i %i", - &client->sess.mission_objectives[LIGHTSIDE_OBJ].display, + &lightsideDisplay, &client->sess.mission_objectives[LIGHTSIDE_OBJ].status); + client->sess.mission_objectives[LIGHTSIDE_OBJ].display = lightsideDisplay ? qtrue : qfalse; var = va( "missionstats%i", client - level.clients ); gi.Cvar_VariableStringBuffer( var, s, sizeof(s) ); diff --git a/codeJK2/game/g_client.cpp b/codeJK2/game/g_client.cpp index 3522f95a32..9367b3358a 100644 --- a/codeJK2/game/g_client.cpp +++ b/codeJK2/game/g_client.cpp @@ -696,6 +696,7 @@ void Player_RestoreFromPrevLevel(gentity_t *ent) { char s[MAX_STRING_CHARS]; const char *var; + int saberActive; gi.Cvar_VariableStringBuffer( sCVARNAME_PLAYERSAVE, s, sizeof(s) ); @@ -714,11 +715,12 @@ void Player_RestoreFromPrevLevel(gentity_t *ent) &client->ps.viewangles[2], &client->ps.forcePowersKnown, &client->ps.forcePower, - &client->ps.saberActive, + &saberActive, &client->ps.saberAnimLevel, &client->ps.saberLockEnemy, &client->ps.saberLockTime ); + client->ps.saberActive = (saberActive ? qtrue : qfalse); ent->health = client->ps.stats[STAT_HEALTH]; // slight issue with ths for the moment in that although it'll correctly restore angles it doesn't take into account From 947dc64db5805fb9a1feb9aabf4164648aee60c3 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Fri, 28 Oct 2016 11:42:53 +0100 Subject: [PATCH 362/445] Remove unused variable in JK2 mode --- code/server/sv_snapshot.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/server/sv_snapshot.cpp b/code/server/sv_snapshot.cpp index 7af54abd02..149a0eb3d9 100644 --- a/code/server/sv_snapshot.cpp +++ b/code/server/sv_snapshot.cpp @@ -349,7 +349,9 @@ static void SV_AddEntitiesVisibleFromPoint( vec3_t origin, clientSnapshot_t *fra int leafnum; const byte *clientpvs; const byte *bitvector; +#ifndef JK2_MODE qboolean sightOn = qfalse; +#endif // during an error shutdown message we may need to transmit // the shutdown message after the server has shutdown, so From 9ca249cb2d4874f85f4cdaf654dfe538a007295c Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sun, 20 Nov 2016 11:16:34 +0000 Subject: [PATCH 363/445] Run install target after building in appveyor --- appveyor.yml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 62a112e887..ae5c05a6e7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -35,11 +35,6 @@ init: #- cmake --help #debug: view available generators - python --version #for tests, todo (try starting the built executables) -#scripts that run after cloning repository -install: - #Add cl.exe in path (for nmake) - #'"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64' - #where to clone the git repository to clone_folder: C:\projects\OpenJK @@ -51,9 +46,9 @@ before_build: - cmd: echo "Generator='%CMAKE_GENERATOR%'" - cmd: echo "Platform='%Platform%'" - cmd: if exist build rmdir /q /s build #remove build dir - - mkdir build + - cmd: mkdir build - cmd: cd build - - cmd: cmake -G "%CMAKE_GENERATOR%" "%APPVEYOR_BUILD_FOLDER%" + - cmd: cmake -DCMAKE_INSTALL_PREFIX=install -G "%CMAKE_GENERATOR%" "%APPVEYOR_BUILD_FOLDER%" - cmd: ls build: @@ -63,3 +58,5 @@ build: #scripts to run after build after_build: + - cmd: cd build + - cmd: cmake --build . --target INSTALL From 39baf07dc629914dba0d6396e9abc69f850e853d Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sun, 20 Nov 2016 11:22:36 +0000 Subject: [PATCH 364/445] Fix after_build target in appveyor script --- appveyor.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index ae5c05a6e7..13cbcfb1e7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -58,5 +58,4 @@ build: #scripts to run after build after_build: - - cmd: cd build - cmd: cmake --build . --target INSTALL From e4d3732454d2d9de54ce5a5a094f1e6ed278813d Mon Sep 17 00:00:00 2001 From: dusty22 Date: Mon, 19 Dec 2016 12:24:25 -0500 Subject: [PATCH 365/445] multi-weapon support; code cleanup --- code/game/AI_BobaFett.cpp | 167 ++++++++++++++------------- code/game/NPC.cpp | 112 ++++++++++++++++++- code/game/NPC_combat.cpp | 136 ++++++++++++++++------ code/game/NPC_stats.cpp | 34 +----- code/game/b_local.h | 3 +- code/game/b_public.h | 63 ----------- code/game/g_shared.h | 4 +- code/game/g_weapon.cpp | 1 + code/game/wp_saber.cpp | 230 +++++++++++++++++--------------------- code/game/wp_saber.h | 3 - 10 files changed, 398 insertions(+), 355 deletions(-) diff --git a/code/game/AI_BobaFett.cpp b/code/game/AI_BobaFett.cpp index 9c89b69c2d..35ef0a0940 100644 --- a/code/game/AI_BobaFett.cpp +++ b/code/game/AI_BobaFett.cpp @@ -102,6 +102,12 @@ extern void G_Knockdown( gentity_t *self, gentity_t *attacker, const vec3_t pus extern void CG_DrawEdge( vec3_t start, vec3_t end, int type ); +extern qboolean heavyWeap(int); +extern qboolean blasterWeap(int); + +extern int ChooseBestWeapon(gentity_t* ent); +extern int ChooseWeaponRandom(gentity_t *ent, int wpnGroup); + //////////////////////////////////////////////////////////////////////////////////////// // External Data //////////////////////////////////////////////////////////////////////////////////////// @@ -654,56 +660,57 @@ void Boba_Fire() //------------------------------------------------------------------------ if (ucmd.buttons&BUTTON_ATTACK) { - switch (NPC->s.weapon) + if (heavyWeap(NPC->s.weapon)) { - case WP_ROCKET_LAUNCHER: - TIMER_Set( NPC, "nextAttackDelay", Q_irand(1000, 2000)); + if (NPC->s.weapon == WP_ROCKET_LAUNCHER) + TIMER_Set(NPC, "nextAttackDelay", Q_irand(1000, 2000)); // Occasionally Shoot A Homing Missile //------------------------------------- - if (!Q_irand(0,3)) + if (!Q_irand(0, 3)) { ucmd.buttons &= ~BUTTON_ATTACK; - ucmd.buttons |= BUTTON_ALT_ATTACK; - NPC->client->fireDelay = Q_irand( 1000, 3000 ); + ucmd.buttons |= BUTTON_ALT_ATTACK; + if (NPC->s.weapon == WP_ROCKET_LAUNCHER) + NPC->client->fireDelay = Q_irand(1000, 3000); } - break; - - case WP_DISRUPTOR: + + } + else if (NPC->s.weapon == WP_DISRUPTOR) + { TIMER_Set(NPC, "nextAttackDelay", Q_irand(1000, 4000)); // Occasionally Alt-Fire //----------------------- - if (!Q_irand(0,3)) + if (!Q_irand(0, 3)) { ucmd.buttons &= ~BUTTON_ATTACK; - ucmd.buttons |= BUTTON_ALT_ATTACK; - NPC->client->fireDelay = Q_irand( 1000, 3000 ); + ucmd.buttons |= BUTTON_ALT_ATTACK; + NPC->client->fireDelay = Q_irand(1000, 3000); } - break; - - case WP_BLASTER: - + } + else + {//blaster-type weapon if (TIMER_Done(NPC, "nextBlasterAltFireDecide")) { - if (Q_irand(0, (NPC->count*2)+3)>2) + if (Q_irand(0, (NPC->count * 2) + 3)>2) { - TIMER_Set(NPC, "nextBlasterAltFireDecide", Q_irand(3000, 8000)); + TIMER_Set(NPC, "nextBlasterAltFireDecide", Q_irand(3000, 8000)); if (!(NPCInfo->scriptFlags&SCF_ALT_FIRE)) { Boba_Printf("ALT FIRE On"); NPCInfo->scriptFlags |= SCF_ALT_FIRE; - NPC_ChangeWeapon(WP_BLASTER); // Update Delay Timers + NPC_ChangeWeapon(NPC->s.weapon); // Update Delay Timers } } else { TIMER_Set(NPC, "nextBlasterAltFireDecide", Q_irand(2000, 5000)); - if ( (NPCInfo->scriptFlags&SCF_ALT_FIRE)) + if ((NPCInfo->scriptFlags&SCF_ALT_FIRE)) { Boba_Printf("ALT FIRE Off"); - NPCInfo->scriptFlags &=~SCF_ALT_FIRE; - NPC_ChangeWeapon(WP_BLASTER); // Update Delay Timers + NPCInfo->scriptFlags &= ~SCF_ALT_FIRE; + NPC_ChangeWeapon(NPC->s.weapon); // Update Delay Timers } } } @@ -713,9 +720,8 @@ void Boba_Fire() if (NPCInfo->scriptFlags&SCF_ALT_FIRE) { ucmd.buttons &= ~BUTTON_ATTACK; - ucmd.buttons |= BUTTON_ALT_ATTACK; + ucmd.buttons |= BUTTON_ALT_ATTACK; } - break; } } } @@ -724,15 +730,24 @@ void Boba_Fire() //////////////////////////////////////////////////////////////////////////////////////// // Call this function to see if Fett should fire his current weapon //////////////////////////////////////////////////////////////////////////////////////// -void Boba_FireDecide( void ) +//helper function +qboolean isBobaClass(int className) +{ + if (NPC->client->NPC_class == CLASS_BOBAFETT || NPC->client->NPC_class == CLASS_MANDA || NPC->client->NPC_class == CLASS_COMMANDO) + return qtrue; + + return qfalse; +} + +void Boba_FireDecide(void) { // Any Reason Not To Shoot? //-------------------------- if (!NPC || // Only NPCs !NPC->client || // Only Clients - (NPC->client->NPC_class != CLASS_BOBAFETT || NPC->client->NPC_class != CLASS_MANDA || NPC->client->NPC_class != CLASS_COMMANDO) || // Only Boba + !isBobaClass(NPC->client->NPC_class) || // Only Boba !NPC->enemy || // Only If There Is An Enemy - NPC->s.weapon==WP_NONE || // Only If Using A Valid Weapon + NPC->s.weapon == WP_NONE || // Only If Using A Valid Weapon !TIMER_Done(NPC, "nextAttackDelay") || // Only If Ready To Shoot Again !Boba_CanSeeEnemy(NPC) // Only If Enemy Recently Seen ) @@ -742,24 +757,16 @@ void Boba_FireDecide( void ) // Now Check Weapon Specific Parameters To See If We Should Shoot Or Not //----------------------------------------------------------------------- - switch (NPC->s.weapon) + if (heavyWeap(NPC->s.weapon)) { - case WP_ROCKET_LAUNCHER: - if (Distance(NPC->currentOrigin, NPC->enemy->currentOrigin)>400.0f) + if (Distance(NPC->currentOrigin, NPC->enemy->currentOrigin) > 400.0f) { Boba_Fire(); } - break; - - case WP_DISRUPTOR: - // TODO: Add Conditions Here - Boba_Fire(); - break; - - case WP_BLASTER: - // TODO: Add Conditions Here + } + else + { Boba_Fire(); - break; } } @@ -810,7 +817,7 @@ void Boba_TacticsSelect() { // If It's Been Long Enough Since Our Last Flame Blast, Try To Torch The Enemy //----------------------------------------------------------------------------- - if (TIMER_Done(NPC, "nextFlameDelay")) + if (TIMER_Done(NPC, "nextFlameDelay") && (NPC->client->NPC_class == CLASS_BOBAFETT || NPC->client->NPC_class == CLASS_MANDA)) { nextState = BTS_FLAMETHROW; } @@ -853,7 +860,7 @@ void Boba_TacticsSelect() } - if (SnipePointsNear && TIMER_Done(NPC, "Boba_NoSniperTime")) + if (SnipePointsNear && TIMER_Done(NPC, "Boba_NoSniperTime") && HaveWeapon(NPC, WP_DISRUPTOR)) { TIMER_Set(NPC, "Boba_NoSniperTime", 120000); // Don't snipe again for a while TIMER_Set(NPC, "Boba_TacticsSelect", Q_irand(35000, 45000));// More patience here @@ -870,62 +877,50 @@ void Boba_TacticsSelect() } } - switch (nextState) { - case BTS_FLAMETHROW: - if ((!NPC->client->NPC_class == CLASS_BOBAFETT && !NPC->client->NPC_class == CLASS_MANDA)) - { - nextState = BTS_RIFLE; - break; - } - case BTS_MISSILE: - if (!HaveWeapon(WP_ROCKET_LAUNCHER)) - { - nextState = BTS_RIFLE; - break; - } - case BTS_SNIPER: - if (!HaveWeapon(WP_DISRUPTOR)) - { - nextState = BTS_RIFLE; - break; - } - } - - // The Next State Has Been Selected, Now Change Weapon If Necessary //------------------------------------------------------------------ - if (nextState!=NPCInfo->localState) + NPCInfo->localState = nextState; + int weapon = 0; + + switch (NPCInfo->localState) { - NPCInfo->localState = nextState; - switch (NPCInfo->localState) + case BTS_SNIPER: + if (HaveWeapon(NPC, WP_DISRUPTOR)) { - case BTS_FLAMETHROW: - Boba_Printf("NEW TACTIC: Flame Thrower"); - Boba_ChangeWeapon(WP_NONE); - Boba_DoFlameThrower(NPC); + Boba_Printf("NEW TACTIC: Sniper"); + Boba_ChangeWeapon(WP_DISRUPTOR); break; - - case BTS_RIFLE: + } + + case BTS_RIFLE: + weapon = ChooseWeaponRandom(NPC, WEAPS_BLASTER); + if (weapon) + { Boba_Printf("NEW TACTIC: Rifle"); - Boba_ChangeWeapon(WP_BLASTER); + Boba_ChangeWeapon(weapon); break; + } //if no blasters overflow to next case - case BTS_MISSILE: + case BTS_MISSILE: + weapon = ChooseWeaponRandom(NPC, WEAPS_HEAVY); + if (weapon) + { Boba_Printf("NEW TACTIC: Rocket Launcher"); - Boba_ChangeWeapon(WP_ROCKET_LAUNCHER); + Boba_ChangeWeapon(weapon); break; + } //if no heavy weaps overflow to next case - case BTS_SNIPER: - Boba_Printf("NEW TACTIC: Sniper"); - Boba_ChangeWeapon(WP_DISRUPTOR); - break; + case BTS_FLAMETHROW: //kinda stuck at this point if doesn't have flamethrower + Boba_Printf("NEW TACTIC: Flame Thrower"); + Boba_ChangeWeapon(WP_NONE); + Boba_DoFlameThrower(NPC); + break; - case BTS_AMBUSHWAIT: - Boba_Printf("NEW TACTIC: Ambush"); - Boba_ChangeWeapon(WP_NONE); - break; - } - } + case BTS_AMBUSHWAIT: + Boba_Printf("NEW TACTIC: Ambush"); + Boba_ChangeWeapon(WP_NONE); + break; + } } diff --git a/code/game/NPC.cpp b/code/game/NPC.cpp index 735dea8b0b..13afb91011 100644 --- a/code/game/NPC.cpp +++ b/code/game/NPC.cpp @@ -56,7 +56,6 @@ extern bool Boba_Flee(); extern bool Boba_Tactics(); extern void BubbleShield_Update(); extern qboolean PM_LockedAnim( int anim ); -extern qboolean NPC_JediClassGood(gentity_t *self); extern cvar_t *g_dismemberment; extern cvar_t *g_saberRealisticCombat; @@ -87,6 +86,108 @@ static bState_t G_CurrentBState( gNPC_t *gNPC ); extern int eventClearTime; +/* +what is an NPC's preferred weapon to switch to when they pick up a new weapon, or +lose their current weapon, assuming they have more than one weapon? +*/ +int allWeaponOrder[MAX_WEAPONS] = +{ + WP_CONCUSSION, + WP_ROCKET_LAUNCHER, + WP_THERMAL, + WP_DEMP2, + WP_FLECHETTE, + WP_BOWCASTER, + WP_REPEATER, + WP_NOGHRI_STICK, + WP_TUSKEN_STAFF, + WP_BLASTER, + WP_BLASTER_PISTOL, + WP_BRYAR_PISTOL, + WP_DISRUPTOR, + WP_SABER, //probably a sword and we're probably not a Jedi, so blaster weapons are preferred + WP_TUSKEN_STAFF, + WP_STUN_BATON, + WP_MELEE, + WP_NONE, + WP_NONE, + WP_NONE, + WP_NONE, + WP_NONE, + WP_NONE, + WP_NONE, + WP_NONE, + WP_NONE, + WP_NONE, + WP_NONE, + WP_NONE, + WP_NONE, + WP_NONE, + WP_NONE +}; + +qboolean NPC_JediClass(int className) { + switch (className) { + case CLASS_JEDI: + case CLASS_REBORN: + case CLASS_SHADOWTROOPER: + case CLASS_ALORA: + case CLASS_DESANN: + case CLASS_LUKE: + case CLASS_KYLE: + case CLASS_TAVION: + case CLASS_MORGANKATARN: + return qtrue; + default: + return qfalse; + } +} + +qboolean NPC_JediClassGood(int className) { + switch (className) { + case CLASS_JEDI: + case CLASS_LUKE: + case CLASS_KYLE: + case CLASS_MORGANKATARN: + return qtrue; + default: + return qfalse; + } +} + +qboolean NPC_JediClassNonBoss(int className) { + switch (className) { + case CLASS_JEDI: + case CLASS_REBORN: + return qtrue; + default: + return qfalse; + } +} + +qboolean NPC_JediClassSemiBoss(int className) { + switch (className) { + case CLASS_ALORA: + case CLASS_SHADOWTROOPER: + return qtrue; + } + + return qfalse; +} + +qboolean NPC_JediClassBoss(int className) { + switch (className) { + case CLASS_DESANN: + case CLASS_LUKE: + case CLASS_KYLE: + case CLASS_TAVION: + case CLASS_MORGANKATARN: + return qtrue; + default: + return qfalse; + } +} + void CorpsePhysics( gentity_t *self ) { // run the bot through the server like it was a real client @@ -1900,7 +2001,8 @@ void NPC_RunBehavior( int team, int bState ) {//jedi NPC_BehaviorSet_Jedi( bState ); } - else if ( NPC->client->NPC_class == CLASS_REBORN && NPC->client->ps.weapon == WP_MELEE ) + else if ( (NPC->client->NPC_class == CLASS_REBORN && NPC->client->ps.weapon == WP_MELEE) + || (NPC->client->ps.weapon == WP_MELEE && (NPC->NPC->stats.meleeKicks || NPC->NPC->stats.meleeKatas))) //only jedi AI supports these right now {//force-only reborn NPC_BehaviorSet_Jedi( bState ); } @@ -2165,6 +2267,8 @@ NPC Behavior state thinking =============== */ +extern qboolean NPC_JediClassGood(int className); + void NPC_ExecuteBState ( gentity_t *self)//, int msec ) { bState_t bState; @@ -2238,7 +2342,7 @@ void NPC_ExecuteBState ( gentity_t *self)//, int msec ) && (NPC->client->playerTeam != TEAM_FREE || (NPC->client->NPC_class == CLASS_TUSKEN && Q_irand( 0, 4 )))//not a rampaging creature or I'm a tusken and I feel generous (temporarily) && NPC->enemy->NPC && (NPC->enemy->NPC->surrenderTime > level.time || (NPC->enemy->NPC->scriptFlags&SCF_FORCED_MARCH) - || (NPC_JediClassGood(NPC) && (NPC->enemy->s.weapon == WP_NONE || (NPC->enemy->s.weapon == WP_MELEE && !NPC->enemy))))) + || (NPC_JediClassGood(NPC->client->NPC_class) && (NPC->enemy->s.weapon == WP_NONE || (NPC->enemy->s.weapon == WP_MELEE && !NPC->enemy))))) {//don't shoot someone who's surrendering if you're a good guy, especially if you're a Jedi ucmd.buttons &= ~BUTTON_ATTACK; ucmd.buttons &= ~BUTTON_ALT_ATTACK; @@ -2303,7 +2407,7 @@ void NPC_ExecuteBState ( gentity_t *self)//, int msec ) } if (NPC->client->playerTeam != TEAM_PLAYER //not an enemy - && NPC_JediClassGood(NPC) + && NPC_JediClassGood(NPC->client->NPC_class) && NPC->enemy->NPC && (NPC->enemy->NPC->surrenderTime > level.time || (NPC->enemy->NPC->scriptFlags&SCF_FORCED_MARCH) || NPC->enemy->s.weapon == WP_NONE || (NPC->enemy->s.weapon == WP_MELEE && !NPC->enemy))) {//redundancy for Jedi because they like to attack anyway diff --git a/code/game/NPC_combat.cpp b/code/game/NPC_combat.cpp index 34aa9efd50..d6c68a5c49 100644 --- a/code/game/NPC_combat.cpp +++ b/code/game/NPC_combat.cpp @@ -36,7 +36,11 @@ extern void NPC_Jedi_RateNewEnemy( gentity_t *self, gentity_t *enemy ); extern qboolean PM_DroidMelee( int npc_class ); extern int delayedShutDown; extern qboolean G_ValidEnemy( gentity_t *self, gentity_t *enemy ); -extern qboolean NPC_JediClassGood(gentity_t *self); + +extern qboolean blasterWeap(int wp); +extern qboolean lightBlasterWeap(int wp); +extern qboolean heavyBlasterWeap(int wp); +extern qboolean heavyWeap(int wp); void ChangeWeapon( gentity_t *ent, int newWeapon ); @@ -638,51 +642,93 @@ void G_SetEnemy( gentity_t *self, gentity_t *enemy ) self->enemy = enemy; } - -/* -int ChooseBestWeapon( void ) +qboolean HaveWeapon(gentity_t* ent, int weapon) { - int n; - int weapon; + return (ent->client->ps.stats[STAT_WEAPONS] & (1 << weapon)); +} - // check weapons in the NPC's weapon preference order - for ( n = 0; n < MAX_WEAPONS; n++ ) +/* + these funcs deals with NPC multi-weapon support. + currently supported: + - choose next "best" weapon + - choose a random weapon, optionally by "group" (heavy, blaster, melee, Boba-types do this) +*/ +qboolean WeaponInGroup(int weapon, int wpnGroup, int altFire = 0) +{//this and the funcs it calls do the heavy lifting for weapon grouping + if ((heavyWeap(weapon) && wpnGroup == WEAPS_HEAVY) + || (lightBlasterWeap(weapon) && wpnGroup == WEAPS_LIGHTBLASTER) + || (heavyBlasterWeap(weapon) && wpnGroup == WEAPS_HEAVYBLASTER) + || (blasterWeap(weapon) && wpnGroup == WEAPS_BLASTER) + || wpnGroup == WEAPS_ALL) { - weapon = NPCInfo->weaponOrder[n]; + return qtrue; + } - if ( weapon == WP_NONE ) - { - break; - } + return qfalse; +} - if ( !HaveWeapon( weapon ) ) - { - continue; - } +struct wpnList { //a helper struct + int list[MAX_WEAPONS]; + int listSize = 0; +}; - if ( client->ps.ammo[weaponData[weapon].ammoIndex] ) +extern int allWeaponOrder[]; +wpnList getWeaponList(gentity_t *ent, int wpnGroup) +{//give a list of what weapons this client has + int i = 0; + int weapon; + wpnList w; + + for (int n = 0; n < MAX_WEAPONS; n++) + { + weapon = allWeaponOrder[n]; + + if (HaveWeapon(ent, weapon) && WeaponInGroup(weapon, wpnGroup)) { - return weapon; + w.list[i] = weapon; + w.listSize++; + i++; } } - // check weapons serially (mainly in case a weapon is not on the NPC's list) - for ( weapon = 1; weapon < WP_NUM_WEAPONS; weapon++ ) + while (i < MAX_WEAPONS) { //just incase + w.list[i] = WP_NONE; + i++; + } + + return w; +} + +int ChooseWeaponRandom(gentity_t *ent, int wpnGroup) +{ + wpnList w = getWeaponList(ent, wpnGroup); + + if (w.listSize) + return w.list[Q_irand(0, w.listSize)]; + else + return WP_NONE; +} + +int ChooseBestWeapon(gentity_t* ent) +{ + int n; + int weapon; + + // check weapons in the NPC's weapon preference order + for (n = 0; n < MAX_WEAPONS; n++) { - if ( !HaveWeapon( weapon ) ) + weapon = allWeaponOrder[n]; + + if (!HaveWeapon(ent, weapon)) { continue; } - if ( client->ps.ammo[weaponData[weapon].ammoIndex] ) - { - return weapon; - } + return weapon; } - return client->ps.weapon; + return WP_NONE; } -*/ void ChangeWeapon( gentity_t *ent, int newWeapon ) { @@ -1066,6 +1112,31 @@ void NPC_ChangeWeapon( int newWeapon ) } } } + +void NPC_ChangeWeapon(gentity_t* NPC, int newWeapon) +{ + qboolean changing = qfalse; + if (newWeapon != NPC->client->ps.weapon) + { + changing = qtrue; + } + if (changing) + { + G_RemoveWeaponModels(NPC); + } + ChangeWeapon(NPC, newWeapon); + if (changing && NPC->client->ps.weapon != WP_NONE) + { + if (NPC->client->ps.weapon == WP_SABER) + { + WP_SaberAddG2SaberModels(NPC); + } + else + { + G_CreateG2AttachedWeaponModel(NPC, weaponData[NPC->client->ps.weapon].weaponMdl, NPC->handRBolt, 0); + } + } +} /* void NPC_ApplyWeaponFireDelay(void) How long, if at all, in msec the actual fire should delay from the time the attack was started @@ -1259,15 +1330,6 @@ void WeaponThink( qboolean inCombat ) ShootThink(); } -/* -HaveWeapon -*/ - -qboolean HaveWeapon( int weapon ) -{ - return ( client->ps.stats[STAT_WEAPONS] & ( 1 << weapon ) ); -} - qboolean EntIsGlass (gentity_t *check) { if(check->classname && diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index ea0275beda..0a476fd41f 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -1937,6 +1937,7 @@ extern qboolean blasterWeap(int wp); extern qboolean lightBlasterWeap(int wp); extern qboolean heavyBlasterWeap(int wp); extern qboolean heavyWeap(int wp); +extern cvar_t* g_handicap_matchNPChp; qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { @@ -1971,20 +1972,6 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) if ( NPC->NPC ) { stats = &NPC->NPC->stats; -/* - NPC->NPC->allWeaponOrder[0] = WP_BRYAR_PISTOL; - NPC->NPC->allWeaponOrder[1] = WP_SABER; - NPC->NPC->allWeaponOrder[2] = WP_IMOD; - NPC->NPC->allWeaponOrder[3] = WP_SCAVENGER_RIFLE; - NPC->NPC->allWeaponOrder[4] = WP_TRICORDER; - NPC->NPC->allWeaponOrder[6] = WP_NONE; - NPC->NPC->allWeaponOrder[6] = WP_NONE; - NPC->NPC->allWeaponOrder[7] = WP_NONE; -*/ - NPC->NPC->weapList = new wpnList(); - NPC->NPC->lightBlasterWeaps = new wpnList(); - NPC->NPC->heavyBlasterWeaps = new wpnList(); - NPC->NPC->heavyWeaps = new wpnList(); // fill in defaults stats->sex = SEX_MALE; @@ -3089,7 +3076,10 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } else if ( parsingPlayer ) { - NPC->client->ps.stats[STAT_MAX_HEALTH] = NPC->client->pers.maxHealth = NPC->max_health = n; + if (g_handicap_matchNPChp->integer) + NPC->client->ps.stats[STAT_MAX_HEALTH] = NPC->client->pers.maxHealth = NPC->max_health = n; + else + NPC->client->ps.stats[STAT_MAX_HEALTH] = NPC->client->pers.maxHealth; } continue; } @@ -3549,19 +3539,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { RegisterItem( FindItemForWeapon( (weapon_t)(weap) ) ); //precache the weapon NPC->client->ps.ammo[weaponData[weap].ammoIndex] = ammoData[weaponData[weap].ammoIndex].max; - } - - if (!parsingPlayer) - { - /* - if (lightBlasterWeap(weap)) NPC->NPC->lightBlasterWeaps->add(weap); - if (heavyBlasterWeap(weap)) NPC->NPC->heavyBlasterWeaps->add(weap); - if (heavyWeap(weap)) NPC->NPC->heavyWeaps->add(weap); - - NPC->NPC->weapList->add(weap); - */ - } - + } } continue; } diff --git a/code/game/b_local.h b/code/game/b_local.h index 8093b64b0c..74f0fb2c84 100644 --- a/code/game/b_local.h +++ b/code/game/b_local.h @@ -113,11 +113,10 @@ extern void NPC_StartFlee( gentity_t *enemy, vec3_t dangerPoint, int dangerLevel extern void G_StartFlee( gentity_t *self, gentity_t *enemy, vec3_t dangerPoint, int dangerLevel, int fleeTimeMin, int fleeTimeMax ); //NPC_combat -extern int ChooseBestWeapon( void ); extern void NPC_ChangeWeapon( int newWeapon ); extern void ShootThink( void ); extern void WeaponThink( qboolean inCombat ); -extern qboolean HaveWeapon( int weapon ); +extern qboolean HaveWeapon( gentity_t* ent, int weapon ); extern qboolean CanShoot ( gentity_t *ent, gentity_t *shooter ); extern void NPC_CheckPossibleEnemy( gentity_t *other, visibility_t vis ); extern gentity_t *NPC_PickEnemy (gentity_t *closestTo, int enemyTeam, qboolean checkVis, qboolean findPlayersFirst, qboolean findClosest); diff --git a/code/game/b_public.h b/code/game/b_public.h index 7c36e8564c..627b9b9a75 100644 --- a/code/game/b_public.h +++ b/code/game/b_public.h @@ -93,7 +93,6 @@ along with this program; if not, see . #define SCF_SAFE_REMOVE 0x80000000 //Remove NPC when it's safe (when player isn't looking) - //#ifdef __DEBUG //Debug flag definitions @@ -167,63 +166,6 @@ typedef struct gNPCstats_e } gNPCstats_t; - -struct wpnNode { - wpnNode* nextWeap; - int thisWeap; - - wpnNode(int wp) { - this->thisWeap = wp; - this->nextWeap = NULL; - } -}; - -struct wpnList { //NPCs use these to make a list of weaps they have, so they can choose from if need to switch weaps - wpnNode* head; - int size; - - wpnList() { - this->head = NULL; - this->size = 0; - } - - void add(int wp) { - if (size == 0) { - this->head = new wpnNode(wp); - this->size = 1; - } - else { - wpnNode nodeToInsertAfter = *head; - for (int i = 1; i < size; i++) { - nodeToInsertAfter = *(nodeToInsertAfter.nextWeap); - } - - nodeToInsertAfter.nextWeap = new wpnNode(wp); - size++; - } - } - - wpnNode* findAndReturn(int index) { - if (size == 0) return NULL; - else { - wpnNode* nodeToReturn = head; - for (int i = 1; i < size; i++) { - nodeToReturn = nodeToReturn->nextWeap; - } - - return nodeToReturn; - } - } - - int pickRand() { - if (size == 0) return -1; - else { - int choice = Q_irand(1, size); - return findAndReturn(choice)->thisWeap; - } - } -}; - #define MAX_ENEMY_POS_LAG 2400 #define ENEMY_POS_LAG_INTERVAL 100 #define ENEMY_POS_LAG_STEPS (MAX_ENEMY_POS_LAG/ENEMY_POS_LAG_INTERVAL) @@ -399,11 +341,6 @@ typedef struct int ffireDebounce; int ffireFadeDebounce; - //Dusty additions - wpnList* weapList; - wpnList* lightBlasterWeaps; - wpnList* heavyBlasterWeaps; - wpnList* heavyWeaps; } gNPC_t; void G_SquadPathsInit(void); diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 336559f1b4..a4859a013a 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -483,9 +483,9 @@ struct gclient_s { //new fields int saberReactivateTime; //time after something deactivates a saber for AI to turn it back on - int breakLimit; + int breakLimit; //how many defense points int breakRecoveryTime; //how long left to recover a defense point - int breakCounter; //how many strong attacks have we blocked recently? + int breakCounter; //how many defense points have we used/strong attacks have we blocked recently? //qboolean saberDropped; //did we drop our saber throw? }; diff --git a/code/game/g_weapon.cpp b/code/game/g_weapon.cpp index 2f2792f06e..f62344de65 100644 --- a/code/game/g_weapon.cpp +++ b/code/game/g_weapon.cpp @@ -1709,6 +1709,7 @@ qboolean heavyWeap(int wp) case WP_FLECHETTE: case WP_ROCKET_LAUNCHER: case WP_CONCUSSION: + case WP_THERMAL: return true; } diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 4436e98e68..2275fe4653 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -79,6 +79,7 @@ extern cvar_t *g_char_parryBonus; extern cvar_t *g_char_breakParryBonus; extern cvar_t *g_playerCheatPowers; +extern cvar_t *g_saberNewThrows; extern qboolean WP_SaberBladeUseSecondBladeStyle(saberInfo_t *saber, int bladeNum); extern qboolean WP_SaberBladeDoTransitionDamage(saberInfo_t *saber, int bladeNum); @@ -168,6 +169,13 @@ extern qboolean PM_LockedAnim(int anim); extern qboolean Rosh_BeingHealed(gentity_t *self); extern qboolean G_OkayToLean(playerState_t *ps, usercmd_t *cmd, qboolean interruptOkay); +extern int ChooseBestWeapon(gentity_t* ent); +extern int ChooseWeaponRandom(); +extern int ChooseBlasterRandom(); +extern int ChooseLightBlasterRandom(); +extern int ChooseHeavyBlasterRandom(); +extern int ChooseHeavyWeapRandom(); + int WP_AbsorbConversion(gentity_t *attacked, int atdAbsLevel, gentity_t *attacker, int atPower, int atPowerLevel, int atForceSpent); void WP_ForcePowerStart(gentity_t *self, forcePowers_t forcePower, int overrideAmt); void WP_ForcePowerStop(gentity_t *self, forcePowers_t forcePower); @@ -204,69 +212,7 @@ qboolean g_noClashFlare = qfalse; int g_saberFlashTime = 0; -qboolean NPC_JediClass(gentity_t *self) { - switch (self->client->NPC_class) { - case CLASS_JEDI: - case CLASS_REBORN: - case CLASS_SHADOWTROOPER: - case CLASS_ALORA: - case CLASS_DESANN: - case CLASS_LUKE: - case CLASS_KYLE: - case CLASS_TAVION: - case CLASS_MORGANKATARN: - return qtrue; - default: - return qfalse; - } -} - -qboolean NPC_JediClassGood(gentity_t *self) { - switch (self->client->NPC_class) { - case CLASS_JEDI: - case CLASS_LUKE: - case CLASS_KYLE: - case CLASS_MORGANKATARN: - return qtrue; - default: - return qfalse; - } -} - -qboolean NPC_JediClassNonBoss(gentity_t *self) { - switch (self->client->NPC_class) { - case CLASS_JEDI: - case CLASS_REBORN: - return qtrue; - default: - return qfalse; - } -} - -qboolean NPC_JediClassSemiBoss(gentity_t *self) { - switch (self->client->NPC_class) { - case CLASS_ALORA: - case CLASS_SHADOWTROOPER: - return qtrue; - } - - return qfalse; -} - -qboolean NPC_JediClassBoss(gentity_t *self) { - switch (self->client->NPC_class) { - case CLASS_DESANN: - case CLASS_LUKE: - case CLASS_KYLE: - case CLASS_TAVION: - case CLASS_MORGANKATARN: - return qtrue; - default: - return qfalse; - } -} - -qboolean PM_WalkingOrIdle(gentity_t *self) +qboolean WP_SaberCanRegenBlockPoints(gentity_t *self) { //mainly for checking if we can guard well or regen block points if ((PM_WalkingAnim(self->client->ps.legsAnim) || PM_StandingAnim(self->client->ps.legsAnim) @@ -280,6 +226,7 @@ qboolean PM_WalkingOrIdle(gentity_t *self) return qfalse; } +/* void WP_CheckPlayerSaberEvents(gentity_t *self) {//the player needs this because his saberEventFlags aren't cleared by the code in AI_Jedi.cpp like for NPCs if (self->s.number) @@ -296,9 +243,7 @@ void WP_CheckPlayerSaberEvents(gentity_t *self) self->client->ps.saberEventFlags &= ~SEF_EVENTS; } } - - - +*/ vec3_t g_saberFlashPos = { 0, 0, 0 }; @@ -8319,16 +8264,24 @@ qboolean WP_SaberLaunch(gentity_t *self, gentity_t *saber, qboolean thrown, qboo {//FIXME: make a table? default: case FORCE_LEVEL_1: - saber->s.apos.trDelta[1] = 800; //600 + saber->s.apos.trDelta[1] = 600; break; case FORCE_LEVEL_2: - saber->s.apos.trDelta[1] = 900; //800 + saber->s.apos.trDelta[1] = 800; break; case FORCE_LEVEL_3: - saber->s.apos.trDelta[1] = 1200; //1200 + saber->s.apos.trDelta[1] = 1200; break; } + if (g_saberNewThrows->integer) + { + if (!self->client->ps.SaberStaff()) + { + saber->s.apos.trDelta[1] += 300; + } + } + //Take it out of my hand self->client->ps.saberInFlight = qtrue; self->client->ps.saberEntityState = SES_LEAVING; @@ -9054,14 +9007,25 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) vec3_t traceTo, entDir; qboolean dodgeOnlySabers = qfalse; + if (!self->s.number && !g_playerCheatPowers->integer) + { + return; + } + if (self->NPC && (self->NPC->scriptFlags&SCF_IGNORE_ALERTS)) {//don't react to things flying at me... return; } + + if (self->NPC && !NPC_JediClass(self->client->NPC_class)) + {//can't do this auto-handling if I'm not a Jedi-type + return; + } + if (self->health <= 0) {//dead push/evade return; - } + } if (PM_InKnockDown(&self->client->ps)) {//can't dodge when knocked down @@ -9073,9 +9037,8 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) return; } - if (self->NPC->rank > RANK_LT) //lower rank melee users can't do this stuff - { - /* + if ((!self->s.number && g_playerCheatPowers->integer) || self->NPC->rank > RANK_LT) //lower rank melee users can't do this stuff + { if (g_debugMelee->integer && (ucmd->buttons & BUTTON_USE) && cg.renderingThirdPerson @@ -9084,8 +9047,7 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) { } else - { - + { if (self->client->ps.forcePowersActive&(1 << FP_LIGHTNING)) {//can't block while zapping return; @@ -9104,10 +9066,8 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) if (self->client->ps.forcePowersActive&(1 << FP_GRIP)) {//can't block while gripping (FIXME: or should it break the grip? Pain should break the grip, I think...) return; - } - + } } - */ fwdangles[1] = self->client->ps.viewangles[1]; AngleVectors(fwdangles, forward, NULL, NULL); @@ -9178,7 +9138,7 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) } else { - if (ent->s.pos.trType == TR_STATIONARY && !self->s.number) + if (ent->s.pos.trType == TR_STATIONARY && !self->s.number && !g_playerCheatPowers->integer) {//nothing you can do with a stationary missile if you're the player continue; } @@ -9191,9 +9151,10 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) //FIXME: handle detpacks, proximity mines and tripmines if (ent->s.weapon == WP_THERMAL) {//thermal detonator! - if (self->NPC && dist < ent->splashRadius) + if ((self->NPC || g_playerCheatPowers->integer) && dist < ent->splashRadius) { - if (dist < ent->splashRadius && + if (self->NPC && + dist < ent->splashRadius && ent->nextthink < level.time + 600 && ent->count && self->client->ps.groundEntityNum != ENTITYNUM_NONE && @@ -9220,7 +9181,7 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) //FIXME: handle tripmines and detpacks somehow... // maybe do a force-gesture that makes them explode? // But what if we're within it's splashradius? - if (!self->s.number) + if (!self->s.number && !g_playerCheatPowers->integer) {//players don't auto-handle these at all continue; } @@ -9272,7 +9233,8 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) } } } - else if (dist < ent->splashRadius + else if (self->NPC + && dist < ent->splashRadius && self->client->ps.groundEntityNum != ENTITYNUM_NONE && (DotProduct(dir, forward) < SABER_REFLECT_MISSILE_CONE || !WP_ForcePowerUsable(self, FP_PUSH, 0))) @@ -9284,7 +9246,14 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) if (!ent->owner || !OnSameTeam(self, ent->owner)) { //FIXME: check forcePushRadius[NPC->client->ps.forcePowerLevel[FP_PUSH]] - ForceThrow(self, qfalse); + if (!self->s.number && self->client->ps.forcePowerLevel[FP_PUSH] == 1 && dist >= 192) + { + //player with push 1 has to wait until it's closer otherwise the push misses + } + else + { + ForceThrow(self, qfalse); + } } } //otherwise, can't block it, so we're screwed @@ -9294,7 +9263,7 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) } //Reactions to Thrown Sabers - else if (!self->s.number) + else if (self->s.number || (!self->s.number && g_playerCheatPowers->integer)) {//player never auto-blocks thrown sabers continue; }//NPCs always try to block sabers coming from behind! @@ -10251,29 +10220,18 @@ qboolean G_CheckEnemyPresence(gentity_t *ent, int dir, float radius, float toler //OTHER JEDI POWERS========================================================================= extern gentity_t *TossClientItems(gentity_t *self); extern void ChangeWeapon(gentity_t *ent, int newWeapon); +extern int RemoveWeapon(gentity_t *ent, int wpnToRemove); +extern void NPC_ChangeWeapon(gentity_t* dropper, int newWeapon); void WP_DropWeapon(gentity_t *dropper, vec3_t velocity) { if (!dropper || !dropper->client) { return; } - int replaceWeap = WP_NONE; int oldWeap = dropper->s.weapon; gentity_t *weapon = TossClientItems(dropper); - if (oldWeap == WP_THERMAL && dropper->NPC) - {//Hmm, maybe all NPCs should go into melee? Not too many, though, or they mob you and look silly - replaceWeap = WP_MELEE; - } - if (dropper->ghoul2.IsValid()) - { - if (dropper->weaponModel[0] > 0) - {//NOTE: guess you never drop the left-hand weapon, eh? - gi.G2API_RemoveGhoul2Model(dropper->ghoul2, dropper->weaponModel[0]); - dropper->weaponModel[0] = -1; - } - } - //FIXME: does this work on the player? - dropper->client->ps.stats[STAT_WEAPONS] |= (1 << replaceWeap); + + if (!dropper->s.number) { if (oldWeap == WP_THERMAL) @@ -10284,18 +10242,42 @@ void WP_DropWeapon(gentity_t *dropper, vec3_t velocity) { dropper->client->ps.stats[STAT_WEAPONS] &= ~(1 << oldWeap); } - CG_ChangeWeapon(replaceWeap); } else { dropper->client->ps.stats[STAT_WEAPONS] &= ~(1 << oldWeap); } - ChangeWeapon(dropper, replaceWeap); - dropper->s.weapon = replaceWeap; + + int replaceWeap; if (dropper->NPC) { - dropper->NPC->last_ucmd.weapon = replaceWeap; + replaceWeap = ChooseBestWeapon(dropper); + } + else + { + replaceWeap = WP_NONE; + CG_ChangeWeapon(replaceWeap); + } + + if (dropper->ghoul2.IsValid()) + { + if (dropper->weaponModel[0] > 0) + {//NOTE: guess you never drop the left-hand weapon, eh? + gi.G2API_RemoveGhoul2Model(dropper->ghoul2, dropper->weaponModel[0]); + dropper->weaponModel[0] = -1; + } + } + + NPC_ChangeWeapon(dropper, replaceWeap); + if (replaceWeap == WP_NONE) + { + dropper->s.weapon = replaceWeap; + if (dropper->NPC) + { + dropper->NPC->last_ucmd.weapon = replaceWeap; + } } + if (weapon != NULL && velocity && !VectorCompare(velocity, vec3_origin)) {//weapon should have a direction to it's throw VectorScale(velocity, 3, weapon->s.pos.trDelta);//NOTE: Presumes it is moving already...? @@ -10992,17 +10974,7 @@ void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) if (self->health <= 0) { return; - } - - if (!WP_ForcePowerUsable(self, FP_PUSH, 0) && !pull) - {//don't know this power - return; - } - - if (!WP_ForcePowerUsable(self, FP_PULL, 0) && pull) - {//don't know this power - return; - } + } if (self->client->ps.leanofs) {//can't force-throw while leaning @@ -12082,7 +12054,7 @@ void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) } if (pull) { - if (self->NPC) + if (self->NPC || g_playerCheatPowers->integer > 1) {//NPCs can push more often //FIXME: vary by rank and game skill? self->client->ps.forcePowerDebounce[FP_PULL] = level.time + 200; @@ -12094,7 +12066,7 @@ void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) } else { - if (self->NPC) + if (self->NPC || g_playerCheatPowers->integer > 1) {//NPCs can push more often //FIXME: vary by rank and game skill? self->client->ps.forcePowerDebounce[FP_PUSH] = level.time + 200; @@ -14805,7 +14777,7 @@ int WP_AbsorbConversion(gentity_t *attacked, int atdAbsLevel, gentity_t *attacke void WP_SaberBlockPointsRegenerate(gentity_t *self) { qboolean canRegen = qfalse; - if (PM_WalkingOrIdle(self)) + if (WP_SaberCanRegenBlockPoints(self)) { canRegen = qtrue; } @@ -14838,7 +14810,7 @@ void WP_SaberBlockPointsRegenerate(gentity_t *self) qboolean WP_SaberBlockCooldownDone(gentity_t *self) {//lets you cheat on the return animations for better defense - if (!PM_WalkingOrIdle(self)) + if (!WP_SaberCanRegenBlockPoints(self)) //must be in a defensive state { return qfalse; } @@ -15590,18 +15562,18 @@ void WP_ForceForceThrow(gentity_t *thrower) { return; } - if (thrower->NPC->stats.restrictJediPowers) - { - return; - } qboolean removePush = qfalse; qboolean relock = qfalse; - if (!(thrower->client->ps.forcePowersKnown&(1 << FP_PUSH))) + if (!(thrower->client->ps.forcePowersKnown&(1 << FP_PUSH)) && !thrower->NPC->stats.restrictJediPowers) {//give them push just for this specific purpose thrower->client->ps.forcePowersKnown |= (1 << FP_PUSH); thrower->client->ps.forcePowerLevel[FP_PUSH] = FORCE_LEVEL_1; removePush = qtrue; } + else + { + return; + } if (thrower->NPC && (thrower->NPC->aiFlags&NPCAI_HEAL_ROSH) @@ -15879,8 +15851,7 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ && !Jedi_CultistDestroyer(gripEnt) && !Q_irand(0, 100 - (gripEnt->NPC->stats.evasion * 8) - (g_spskill->integer * 20))) {//a jedi who broke free FIXME: maybe have some minimum grip length- a reaction time? - if (!(gripEnt->NPC->stats.restrictJediPowers)) WP_ForceForceThrow(gripEnt); - else ForceThrow(gripEnt, 0); + WP_ForceForceThrow(gripEnt); if (gripEnt->NPC->rank >= RANK_COMMANDER //saber reactivation AI here. || (gripEnt->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) @@ -15889,7 +15860,7 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ } else //if (gripEnt->NPC->rank >= RANK_LT_COMM) { //weaker/less skilled guys are stunned after a grip for longer - gripEnt->client->saberReactivateTime = level.time + 500; + gripEnt->client->saberReactivateTime = level.time + 800; } /*else { @@ -16334,8 +16305,7 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ && level.time - (self->client->ps.forcePowerDebounce[FP_DRAIN]>self->client->ps.forcePowerLevel[FP_DRAIN] * 500)//at level 1, I always get at least 500ms of drain, at level 3 I get 1500ms && !Q_irand(0, 100 - (drainEnt->NPC->stats.evasion * 8) - (g_spskill->integer * 15))) {//a jedi who broke free FIXME: maybe have some minimum grip length- a reaction time? - if (!(drainEnt->NPC->stats.restrictJediPowers)) WP_ForceForceThrow(drainEnt); - else ForceThrow(drainEnt, 0); + WP_ForceForceThrow(drainEnt); //FIXME: I need to go into some pushed back anim... //saber reactivate time - same rules as for Grip @@ -16346,7 +16316,7 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ } else /*if (drainEnt->NPC->rank >= RANK_LT_COMM)*/ { //weaker/less skilled guys are stunned after a grip for longer - drainEnt->client->saberReactivateTime = level.time + 1000; + drainEnt->client->saberReactivateTime = level.time + 800; } /*else { diff --git a/code/game/wp_saber.h b/code/game/wp_saber.h index 03c26e9372..32a401ca0b 100644 --- a/code/game/wp_saber.h +++ b/code/game/wp_saber.h @@ -219,9 +219,6 @@ extern qboolean G_EnoughPowerForSpecialMove( int forcePower, int cost, qboolean extern void G_DrainPowerForSpecialMove( gentity_t *self, forcePowers_t fp, int cost, qboolean kataMove = qfalse ); extern int G_CostForSpecialMove( int cost, qboolean kataMove = qfalse ); extern gentity_t *G_DropSaberItem( const char *saberType, saber_colors_t saberColor, vec3_t saberPos, vec3_t saberVel, vec3_t saberAngles, gentity_t *copySaber = NULL ); -extern qboolean NPC_JediClass(gentity_t *self); -extern qboolean NPC_JediClassNonBoss(gentity_t *self); -extern qboolean NPC_JediClassBoss(gentity_t *self); typedef enum { From a7c9130e4a92fd3796a335fd322a76a60bccbd94 Mon Sep 17 00:00:00 2001 From: dusty22 Date: Mon, 19 Dec 2016 12:32:00 -0500 Subject: [PATCH 366/445] documentation update, bug fixes, forgot two files --- CHANGELOG.txt | 116 ------- CHANGELOG.txt.orig | 278 ---------------- changesfromOpenJK.txt | 147 +++++++++ changestodo.txt | 11 + code/game/g_main.cpp | 8 + code/game/g_missile.cpp | 9 +- code/game/weapons.h | 10 + code/game/wp_melee.cpp | 17 +- code/game/wp_rocket_launcher.cpp | 2 +- weaponshelp.txt | 551 +++++++++++++++++++++++++++++++ 10 files changed, 749 insertions(+), 400 deletions(-) delete mode 100644 CHANGELOG.txt delete mode 100644 CHANGELOG.txt.orig create mode 100644 changesfromOpenJK.txt create mode 100644 changestodo.txt create mode 100644 weaponshelp.txt diff --git a/CHANGELOG.txt b/CHANGELOG.txt deleted file mode 100644 index d9dc6b2262..0000000000 --- a/CHANGELOG.txt +++ /dev/null @@ -1,116 +0,0 @@ -New Cvars ------------------------------------------------------------------------------------------------------------------------------- -g_autoRoll* - default is 1, if 1 default JA behavior, if 0 you have to be holding USE to roll -g_char_forcePowerMax* - requires level restart, controls number of player force points -g_char_forceRegen* - requires level restart, controls force point regen rate of player -g_char_parryBonus* - same as .sab file setting but applied on savegame load for player -g_char_breakParryBonus* - same as .sab file setting but applied on game load for player -g_handicap* - can go up to 200 now -g_saberDamageScale* - this scales saber damage, and is saved with your savegame. This effect stacks on top of the effect caused by g_saberMoreRealistic. -g_saberDeflectAutoAim* - if 0, blaster deflections are not auto-aimed but go in the direction of the crosshair with randomness -based on Saber Defense level -g_saberForceDrains - if 1 special moves drain the amount of FP from the next cvar, katas not affected -g_saberForceDrainAmount - if g_saberForceDrains is 1, special moves drain this amount of FP, katas not affected -g_saberLockSuperBreaks* - if 1 default JA behavior of saber locks, if 0 no super breaks (1-hit KOs) ever happen after saber locks -g_saberMoreRealistic* - no longer write-protected -g_weaponVelocity*, g_weaponAltVelocity* - use this to multiply the speed of most projectiles - -Gameplay mechanics ------------------------------------------------------------------------------------------------------------------------------- -Force powers (activated with g_forceNewPowers 1) ------------------------------------------------------------------------------------------------------------------------------- -- Force Jump height for all levels increased by 25% -- Force Pull level 1 pulls weapons only, level 2 can knockdown, level 3 can pull toward you a little bit -- ***Force Sense gives limited snipershot dodging ability (you might need to hold down Use) -- Force Speed decreases FP cost of sniper shot dodging at Level 3 (for auto-dodging anyway) -- **Force Protect 1/2/3 gives only 10/20/40% damage reduction against saber attacks instead of 25/50/75% -- Force Heal costs slightly fewer force points at Level 3 if I remember correctly - -NPC AI ------------------------------------------------------------------------------------------------------------------------------- -Jedi AI changes... -- Improvements to AI governing use of JA-exclusive abilities and powers... -only use Force Rage if close to the player and if have > 25% HP, only kick if close to the player, -only use saber attack katas if close to the player -- NPC Jedi recover from knockdown very fast on high difficulties (no easy marios for the win) -- NPC Jedi re-activate their sabers faster after being gripped or drained based on difficulty and NPC rank -- NPC Jedi will try very hard to dodge your attacks if you knock their saber throw to the ground (before they were more apt to just stand there) -- Light Jedi with non-dark Jedi AI (class_reborn, class_desann, etc.) classes don't attack surrendered or unarmed enemies -- Force Cultists react properly to explosives/sniper shots/saber throws -- Force Cultists punch sometimes -- Non-saber NPCs with Class_Reborn try extra hard to dodge saber attacks -- Non-saber NPCs with Class_Reborn cannot cartwheel without Force Jump 1 - -General NPC AI changes... -- **Grenadier Grans will still try punching sometimes even if your saber is drawn -- **NPCs surrender more like JK2 (more consistent, once they decide to surrender they will usually stay surrendered) -- Allied NPCs receive 150%/125%/100% HP for Padawan/Jedi/Jedi Knight difficulties now instead of 100%/125%/150% like enemies -- Assassin Droids now fire while shielded -- Class_Rodian/Class Imperial at commander rank use alt-fire with WP_BLASTER - - -Saber System (activated with g_saberNewCombat 1) ------------------------------------------------------------------------------------------------------------------------------- -- Saber Offense gives a base "attack power" (AP) (+2/+4/+6) -- Saber Defense gives a base "defense power" (DP) (+2/+4/+6) and a number of block points (BP, is equal to 1 + your SD level IIRC) -- "attack power" is modified by saber style (-2/0/+2/-1/+1/-1/+1 for Fast/Med/Strong/Duals/Staff/Tavion/Desann) -- Desann style is as strong as Red if you are CLASS_DESANN, otherwise it does not cause knockdown as often as Red, and is slightly -weaker -- style attack chaining altered: -can only chain 2 slashes if running, staff and duals cannot chain infinitely (5 slash maximum now), chain counts are also not -random (Medium can always chain 5 slashes while walking for example) - -How saber combat then works: -- AP > DP = attack blocked but lose a number of BP equivalent to AP - DP -- all BP lost = guard crushed -- BPs regenerate about 1 per second if walking/standing still (total BP = your Saber Def. level + 1 if I remember correctly) -- special attacks ignore BP: either crush guard or are blocked partially - -Other saber-related changes -- player's ability to parry saber attacks and blaster fire is improved while walking or standing still for Medium and Strong -styles -- Saber Defense 0 cannot block blaster fire (or was it just a super narrow arc? can't remember...) -- A saber with autoblocking 0 now has a narrow blocking arc for the player (so you can't cheat and block super easy) -- Holding Use and standing still will let you try to manual block blaster bolts as it currently does in Base JA, however the arc is super narrow - -Melee changes --------------------------------------------------------------------------------------------------------------------------------- -- Player can use kicks with any saber type by default, you must use +forcefocus to saberthrow (bind this to a key, maybe your mousewheel click-down) -- Player's melee abilities determined by Saber Offense level (1 = punches and kicks, 2 = katas, 3 = spin kicks) -- if you're not cheating (using g_debugMelee or iknowkungfu)... Player melee katas have less range, must be aimed more precisely, and do not work on certain types of enemies -- Spin/Flip kicks are only enabled for Saber Offense 3 but do slightly more damage -- Spin Kicks are possible on demand by holding Use and pressing the Alt Attack button, however costs 10 FP (the auto version doesn't cost any) -- **Knockdown to Jedi happens only if your Saber Offense >= their Saber Defense -- Player punches do 7/5 damage now instead of 6/3 and aren't randomized -- **Force Speed punching is more consistent now and less cheap (never did actually test) -- **Heavy/Slow Melee punching is specifically associated with Chewbacca, Class_Gran, and Class_Trandoshan, other NPC types will punch -more quickly but weakly if given WP_MELEE - -Other additions ----------------------------------------------------------------------------------------------------------------------------- -- visual effect for blocking Force Lightning with your lightsaber (it's subtle but there, it just plays a reverse-direction version of the Lightning level 1 effect, will make this a separate file) -- rolls and acrobatics are possible in 1st Person now - -Future ideas ----------------------------------------------------------------------------------------------------------------------------- -Things to do - -- *savegame screenshots -- *extra fields in Weapons.dat such as NPCDamageMult, NPCAltDamageMult, saber ignition/deignition time -- *camera controls (1st, 2nd, 3rd, 4th person) -- better AI for NPCs deciding to surrender - -- balance staff and duals blocking -- finish new NPC fields -- make sure saber combat stats save correctly -- saber flags as cvars for player - -Sidelined: -- *separate cvar for player HP and Shields -- reborn masters with debounce to limit constant saber throwing + lightning -- *NPCs avoid cliffs -- force push strong version, mindtrick changes -- doing a full slash when starting saber off regardless of movement - -* would like to implement into OpenJK -** not completely tested but should work -*** incomplete/unfinished/not working completely \ No newline at end of file diff --git a/CHANGELOG.txt.orig b/CHANGELOG.txt.orig deleted file mode 100644 index bfc07ae99b..0000000000 --- a/CHANGELOG.txt.orig +++ /dev/null @@ -1,278 +0,0 @@ -(Dusty's Patch changelog) -cvars to-do: -separate cvars into global and savegame versions, have global take priority? -camera cvars? -cvars for force push blur effects? - -increased modability: -- separate lightning block effect into own .efx file -- external file for controlling force push/pull/absorb/protect effects -- Class_Wookiee, Class_Cultist -- weapons.dat stuff (npcDamageMult, npcSpeedMult) -- alt-fire field works for .npc files? -- other .npc fields: -fastPunches, kicks, freeMovement, aggression = punching... -- - -other: -- kick knockdown based on hit location -- better Jedi AI -- NPCs avoid walls and cliffs -- better saber throws, strong force push - -Test: -- cultist punch delay -- gran punch decisions vs. saber wielder -- npc surrender -- lightning block effect -- force protect saber damage -- faster non-heavy punches - ------------------------------------------------------------------------ -Only larger/more important changes recorded here: -new cvars: -g_autoRoll - been there for a while, now works 100% correctly, if 1 -default JA behavior, if 0 you have to be holding USE to roll -g_char_forcePowerMax - requires level restart, like the NPC setting but for the player -g_char_forceRegen - requires level restart, like NPC setting but for player -g_char_parryBonus - like the .sab file setting but applied on game load for player -g_char_breakParryBonus - like the .sab file setting but applied on game load for player -all these affect the player's stats -g_handicap - goes up to 200 now -g_saberDamageScale - this scales saber damage, and is saved with your savegame -g_saberForceDrains - if 1 special moves drain the amount of FP from the -next cvar, katas not affected -g_saberForceDrainAmount - if g_saberForceDrains is 1, special moves -drain this amount of FP, katas not affected -g_saberLockSuperBreaks - if 1 default JA behavior of saber locks, if 0 -no super breaks (1-hit KOs) ever happen after saber locks -g_saberLockStyle - dummy cvar. Later maybe make it so superbreaks happen -under certain conditions -g_saberMoreRealistic - no longer write-protected -g_weaponVelocity, g_weaponAltVelocity - use this to multiply the speed of most projectiles - -Gameplay mechanics - -Force powers -- (with g_forceNewPowers 1) -- Force Jump height for all levels increased by 25% -- Force Pull level 1 pulls weapons only, level 2 can knockdown, level 3 can pull toward you somewhat -- Force Sense gives limited snipershot dodging ability -- Force Speed decreases cost of sniper shot dodging at Level 3 -- Force Protect 1/2/3 gives only 10/20/40% damage reduction against saber attacks instead of 25/50/75% - -NPC AI -- -- Improvements to NPC AI pertaining to the use of JA-exclusive abilities; -NPCs only use Force Rage if close to the player and if have > 25% HP, only kick if close to the player, -only use katas if close to the player -- NPC Jedi will try very hard to dodge your attacks if you knock their saber throw to the ground -- NPC Jedi get up much more quickly on higher difficulties (no easy marios for the win) -- NPC Jedi will activate their saber very quickly after being gripped or drained based on difficulty and rank -- Force Cultists react properly to explosives, sniper shots, and saber throws now -- Non-saber wielding NPCs with Class_Reborn try extra hard to dodge saber attacks and throws (because they can't block) -- Light Jedi with non-dark Jedi AI (class_reborn, class_desann, etc.) classes don't attack surrendered or unarmed enemies now -- Grenadier Grans will alternate punches/thermal detonators even if your saber is out if you are really close to -them. -- NPCs surrender better... (to-do) -NPC other -- -- Allied NPCs receive 150%/125%/100% HP for Padawan/Jedi/Jedi Knight difficulties now instead of 100/125/150 like enemy -npcs -- Assassin Droids now fire even with their shields up -- Class_Rodian with E11 and Class_Imperial at commander rank use alt-fire now always - - -Saber System: *(with g_saberNewCombat 1) -* saber offense and defense increase your offense and defensive strength in parries: - - offense controls your power level (+2/4/6), and is modified by saber style (-2/0/+2/-1/+1/-1/+1 for fast/med/strong/duals - /staff/tavion/desann), defense controls your defense strength (+2/4/6, not affected by saber style) - - if an attack powerlevel is greater than defense strength, you can still block it but you lose some block points - - if you lose enough block points, your guard is crushed; block points regenerate while walking/standing still and not attacking - - special attacks don't drain block points but either break through completely or are blocked partially -* red/strong can be blocked now, but is faster and less unwieldy (and more realistic I think) -* staff and duals cannot chain - -- at higher difficulties, blaster bolts are deflected in the direction of the crosshair instead of being auto-aimed -- your ability to parry saber attacks (TO DO) and deflect blaster fire is slightly improved while walking/standing still -- you do a full slash even if starting with your saber off -- TO DO -- Desann style is full strength if you are CLASS_DESANN, otherwise it is a cross between medium/strong -(it has the same power level as staff, and can knock down enemies but is unlikely to) -- attack chain amounts tweaked slightly, not random now (not completely), can only chain 2 slashes if running, -staff and duals cannot chain infinitely (5 slash maximum now) -- staff power is nerfed so it is not as strong as strong style now, but slightly more powerful than medium -- staff sabers are now thrown double-bladed - -Melee changes: -- Player gets a weaker version of melee katas now based on saber offense level (1 - punches and kicks, 2 - katas, 3 - spin kicks) -- Player melee katas have less range, must be aimed more precisely, and do not work on certain types of enemies -- Spin kicks and the like are enabled for Saber Offense 3 and do slightly more damage -- Can do spin kicks on demand by holding Use and pressing the kick button, however this costs Force power -- kicks knocking down an enemy jedi depends on your saber offense vs. their saber defense -- Player punches do 7/5 damage now instead of 6/3 and aren't randomized now -- Force Speed punching is more consistent now and less cheap -- test -- Heavy melee is specifically associated with Chewbacca, Class_Gran, and Class_Trandoshan, other NPC types will punch -more quickly but weaker if given WP_MELEE -- test & fix - -Other additions - -- Save games allow for screenshots now like JK2 -- fix -- Visual effect for blocking Force Lightning with your lightsaber -- handicap can go up to 200 -- r_dynamicglowintensity cvar is saved and written to jaconfig now -- rolls and acrobatics are possible in 1st person view - - -Things to do - -- Savegame screenshots working in the loading screen - got broken -- handicap cvar going past 100, separate cvar for player HP and Shields - partial done -- Reborn masters with constant saber throwing + lightning -- NPCs avoid cliffs? -- not able -- NPCDamageMult, NPCAltDamageMult, saber ignition/deignition time fields in weapons.dat -- Force push strong version, mindtrick changes - not done -- Doing a full slash when starting saber off - not done -- camera controls (1st, 2nd, 3rd, 4th person) -- Fix NPCs surrendering - -------------------------------------------------------------------------------------------------------------------------- -(OpenJK changelog) -This file will generally summarise the Github repo commit history -Key: - removed, + added, * modified - -[SP/MP] * OpenJK now writes configs/screenshots/etc to fs_homepath directory. No longer have to run as administrator on Windows. (Multi-User support) -[SP] + Now searches for jagamex86.dll in the mod's folder, too, meaning SP Code mods are possible. -[SP/MP] * Increased Command Buffer from 16384 to 128*1024 -[SP/MP] * Increased max cvars from 1224 to 8192 -[MP] * Fixed several parsers that broke with characters which wrapped to being negative. -[SP/MP] + Added mouse-wheel to console -[MP] + Added misc security fixes to allow servers to deal with connectionless packets. -[MP] * Added security fixes to prevent servers from spoofing clients with connect packets. -[MP] * Added security fixes to prevent anyone from spoofing clients with print packets. -[MP] * Fixed clients being able to set IP via cvar. -[MP] * Drastically improved status (server) command -[MP] * Tweaked forcetoggle rcon command. -[SP/MP] + Add r_noborder option (windowed mode feature). -[SP/MP] + Add r_centerWindow option (windowed mode feature). -[SP/MP] + Add r_mode -2 option to use desktop resolution. -[MP] * Dedicated server binaries now correctly print sectioned prints without adding newlines erroneously. -[SP] * Fixed a nasty memory issue with clipboard pasting -[MP] * gamecode: Fixed very bad out of bounds access in G_LogWeaponFire with NPCs. -[MP] + gamecode: Added pmove_float cvar (default off) for no velocity snapping resulting in framerate-dependent jump heights. -[SP] * Fixed MiniHeapSize issue -[SP/MP] * Fixed incorrect alphagen enum usage. -[SP/MP] * Fixed widescreen resolution changes causing black screen when UI restarted. -[SP/MP] * Fixed crash when trying to run custom resolutions with a listen server. -[MP] * Fixed client crash related to ragnos NPC -[SP] * Fixed intro cinematic only displaying as white screen when on non 4:3 aspect ratio. -[MP] * gamecode: Fixes some voting issues relating to clients disconnecting and/or switching teams. -[MP] * gamecode: Fixed some voting issues relating to bad percentage calculation for passing/failing. -[MP] * Fixed some item prediction errors in team games. (Item prediction still sucks in general though) -[SP/MP] * Fixed potential out of bounds in sound code. -[SP] * Fixed buffer overflow in filesystem code which prevented use of some maps (atlantica). Raven made a Com_Error to prevent this from happening, we removed that as well. -[SP] * Rosh no longer randomly dies due to falling damage on the first level. -[SP/MP] * Fixed Gamma Clamp on WinXP+ -[SP/MP] * Fixed weather system incorrectly throwing up a warning with shader data if weather system was unable to parse a vector correctly. -[MP] * Fixed buffer overflow in client side rcon command. -[MP] * Fixes color code stacking in names where colors were supposed to be stripped. (This relates to engine and gamecode for full effect) -[SP/MP] * Windows now uses correct memory status code for > 2gb when checking if low on physical memory. -[MP] * Fixes names that contain * or ** at start incorrectly showing up in notify top box and chat box when sending messages. -[MP] * Server side / viewlog console now strips the [skipnotify] and * properly too. -[MP] + (Un)pausing the game in solo play now results in smoother transition. -[SP/MP] * Tweaks to the cvar code to make it more strict in terms of read only/cheats/init. Fixes a lot of broken rules with cvars. -[MP] + Cheats are now defaulted to 1 in menu. Do not be alarmed, starting normally will disable them or connecting to a non-cheat server. This allows cheats to work properly while playing back demos. -[SP/MP] * Fixed cvar commands that allow you to "cg_thirdPerson !" prevent you from typing out longer strings starting with a ! as the value. -[SP/MP] * FX Flashes now properly scale to fov and window aspect. -[MP] + Add sv_lanForceRate (Defaults to 1) Feature was already enabled, but not toggleable. -[MP] * Timescale frametime fixes. Frametime < 1 is no longer possible (bad things happen) -[MP] * globalservers master server command now supports multiple master servers with the sv_master1..5 cvars -[SP/MP] - MPlayer code removed. -[MP] * Tweaked serverbrowser client engine code. -[MP] * Pure server code cleanups client and server. -[SP/MP] * Fixed a lot of formatting security holes. -[SP/MP] * Several Out-of-bounds memory access and memory leaks fixed. -[MP] + Added fontlist command. Useful for when making mods with custom fonts. -[MP] + New serverside kick commands kickall kickbots and kicknum (alias to clientkick). -[SP/MP] * Improved command line parsing based off of ioquake3 patches. -[SP/MP] * Improved echo command by preserving colors based off of ioquake3 patches. -[SP/MP] * Improved GL_Extensions printing using ioquake3 fix to prevent crashes on newer cards. -[SP/MP] * Removed cheat protection from r_we cmd, r_dynamicGlow* cvars -[MP] * Fixed invalid r_textureBitsLM resulting in fullbright mode without cheats -[SP/MP] - Removed CD Check Code -[MP] - Removed demo restriction code. -[SP/MP] - Removed Anti-Tamper Code. -[SP/MP] - Removed force feedback code -[SP/MP] * Shift-Escape will now also open the console as an alternate (e.g.: keyboard doesn't support the normal console key) -[SP/MP] * Escape key will now close the console before anything else if the console is open -[SP/MP] * Removed shift key requirement to open console -[SP/MP] + Raw Mouse Input added to windows (in_mouse 2). An in_restart required if changed while game is running. -[MP] + gamecode: /clientlist displays clients by id/name and if they are a bot. (Shows real client id unlike serverstatus) -[SP/MP] + Updated the JPG library -[MP] * svsay command prints to dedicated console -[SP/MP] * Alt-tab works properly -[MP] * Cvars will be sorted alphabetically when saved to disk -[MP] + Added ja_guid userinfo field to uniquely track players for statistics -[MP] + gamecode: Added cg_fovAspectAdjust to correct field of view on non-4:3 aspect ratios -[MP] + gamecode: Added cg_fovViewmodel to adjust the field of view for first-person weapons -[SP/MP] * Drastically improved command/cvar tab-completion including auto-completion of arguments (e.g. map mp/ffa1) -[MP] + Added cvar_modified to show which cvars have been changed from default values -[SP] + NPCs support alternate saber colours -[MP] * gamecode: Fixed saber lock crash -[MP] * gamecode: Force updates of clients at a fixed interval to prevent certain exploits. -[MP] * gamecode: Prevent fast teamswitch exploit -[MP] * gamecode: Disable "scoreboard" team -[MP] * gamecode: Fix some looping sound issues -[MP] * gamecode: Fix spectators being stuck when they stop following dead/disintegrated players -[SP] * Fix force absorb capping to 100 instead of maximum force points -[MP] * gamecode: Precache weapons on map_restart if g_weaponDisable changes -[MP] * gamecode: Properly detect server settings (weapon/force disable) -[SP/MP] * Fix Windows issue where pressing alt key in windowed mode caused a temporary freeze -[MP] * gamecode: Optimised .sab parsing and fixed some potential memory corruption -[MP] * gamecode: Filter multiple '@' characters in a name resulting in a localised string lookup (translation) -[MP] + gamecode: Added cg_chatBeep and cg_teamChatBeep to toggle the chat message sound -[MP] * gamecode: Default/missing model+saber is now "kyle" -[MP] * gamecode: Fixed tournament queueing (for duel/power duel) -[MP] * gamecode: Fixed issues where spectators had trouble flying through doors close together -[MP] + gamecode: Added JK2 gametypes -[MP] + Added s_doppler sound effect for moving sound sources (rockets) -[MP] * gamecode: Fix cg_smoothClients affecting local player negatively -[MP] * gamecode: Rewrote callvote code to allow disabling specific votes, added more options (e.g. display map list) -[MP] + gamecode: Add server command toggleallowvote to easily adjust the bit values of g_allowVote -[MP] + gamecode: Add userinfo validation options (g_userinfoValidate) -[MP] + gamecode: Add server command toggleuserinfovalidation to easily adjust the bit values of g_userinfoValidate -[SP] + gamecode: Added cg_smoothCamera (default 1) -[SP] + gamecode: Added cg_dynamicCrosshair (default 1) -[MP] + Added support for surfaceSprites flattened in MP. (Fixes surface sprites on t2_trip) -[SP/MP] * Fixed never fading shadow in text -[SP] * MAX_SHADER_FILES bumped to 4096 from 1024 to match MP -[MP] + Added in-engine ban code from ioquake3. Cmds: sv_rehashbans, sv_listbans, sv_banaddr, sv_exceptaddr, sv_bandel, sv_exceptdel, sv_flushbans. CVar: sv_banFile -[SP/MP] * Fix up font renderer glyph positioning -[MP] + addFavorite -[SP/MP] * gamecode: Fixed overstrike mode when using any UI edit box -[SP/MP] * gamecode: Fix crash when standing on an NPC who has been knocked down -[MP] + gamecode: fx_wind entity -[MP] * gamecode: fx_rain entity supports most options from SP now. LIGHTNING/shaking not supported, acidrain doesn't actually hurt -[MP] * gamecode: more customRGBA options from SP on NPCs -[MP] + engine/gamecode: Force Sight surfaces (cgame modification required) -[MP] + gamecode: Human Merc NPC spawner -[SP/MP] * Fixed a hang with some weird music sample rates -[SP/MP] * Fixed a crash at startup when r_dynamicGlow was set to 2 -[SP] * Fix some invalid chunk length errors on x86_64 platforms -[SP/MP] + Clipboard paste support added to the platforms which use SDL2 -[MP] + Add ability to paste in text files in the UI -[SP/MP] * Refactor binds code in the UI -[SP/MP] * Fix Out-Of-Bounds access in CM_EdgePlaneNum -[SP/MP] * Clamp scr_conspeed to be in the range 1-100 -[MP] * gamecode: Make target_location entities logical (no gentity space used in most cases) -[SP/MP] - Removed RMG code -[SP] * Fallback location for jagame mod bin is now OpenJK instead of base -[MP] + Add cl_motdServer1..5 cvars. cl_motd points to which one is used or 0 to turn off -[MP] + Add QuakeLive style mouse accel option (cl_mouseAccelStyle, cl_mouseAccelOffset) -[MP] * gamecode: Fix 2d screen tints with some effects being too dark (protect/abosrb/rage/ysalamiri/inlava/inwater/inslime) -[MP] + gamecode: Filter out servers with invalid chars in their information from the browser (ui_browserFilterInvalidInfo) -[MP] + gamecode: UI now supports multiple master servers -[MP] + Server side demo recording per client (from their pov) support -[MP] * CVar code in engine is more robust. Protects against clients setting systeminfo cvars they should not etc. More accurate warning messages when servers/vms/clients set cvars they should not. -[SP] + Add modelscale and modelscale_vec support to misc_model_ghoul -[MP] * gamecode: Fix teamoverlay not making you look dead in siege when in limbo -[MP] + Add sv_blockJumpSelect cvar to help prevent use of modded clients using an exploit with FP_LEVITATION with old mods -[MP] * Fix exploit with usercmd bytes set to -128 -[SP/MP] + Add stopmusic command -[SP] * Fix external lightmap support -[MP] + Add external lightmap support from SP -[SP/MP] * General buffer safety cleanup -[SP/MP] * Fix stencil shadows not working if a model has more than 500 vertexes. diff --git a/changesfromOpenJK.txt b/changesfromOpenJK.txt new file mode 100644 index 0000000000..8c1f749d62 --- /dev/null +++ b/changesfromOpenJK.txt @@ -0,0 +1,147 @@ +Changes from base JA/OpenJK... + +v1.2 latest changes: +- g_playerCheatPowers should work with saber off now +- g_debugmelee at -1 prevents player from using any advanced melee abilities +- g_moonJump cvar added +- working on cultist AI, boba fett AI, grenadier AI, and melee AI +- working on multi-weapon support +- working on NPCs switching to melee when deciding to surrender +- bug with rocket launcher damage should be fixed +- version, dll, and game folder structure altered +- frame rates should be better (use release build) +- fix bug with saber deflect aiming (revert g_missile.cpp) +- fix bug with boba firing slowly (use release build?) +- fix bug with npc health/armor + + +New Cvars +------------------------------------------------------------------------------------------------------------------------------ +g_autoRoll - default=1, if 0 hold Use to roll +g_char_forcePowerMax - default=100, controls total player FP, requires level restart +g_char_forceRegen - default=100ms, controls player FP regen rate, requires level restart +g_char_parryBonus - default=0, applied to player without needing a custom saber, requires level restart +g_char_breakParryBonus - default=0, applied to player without needing a custom saber, requires level restart +g_handicap - goes up to 200 now +g_saberDamageScale - scales saber damage, and is saved with your savegame, stacks with g_saberMoreRealistic. +g_saberDeflectAutoAim - if 0, blaster deflections must be aimed with crosshair, easier to aim with better Saber Defense +g_saberForceDrains - if 1 special moves drain the amount of FP of the cvar below, katas not affected +g_saberForceDrainAmount - if above cvar is 1, special moves drain this amount of FP, katas not affected +g_saberLockSuperBreaks - if 0 no super breaks (1-hit KOs) ever happen after saber locks +g_saberMoreRealistic - no longer write-protected +g_weaponVelocity, g_weaponAltVelocity - multiply the speed of most player and NPC weapon projectiles + +Cheat Codes +------------------------------------------------------------------------------------------------------------------------------ +- g_playerCheatPowers: +If 1, player can auto-push explosives, always dodges sniper shots, has increased jumping ability and resistance to force powers. +If 2, all previous effects plus FP usage is cut in half. +If 3, unlimited fp and take no fall damage +Set when before you load your game to get all effects. "iknowkungfu" now toggles g_playerCheatPowers to 1 +- g_moonJump: +flip this on to do some crazy jumping. + +Gameplay mechanics +------------------------------------------------------------------------------------------------------------------------------ +Force powers (activated with g_forceNewPowers 1) +------------------------------------------------------------------------------------------------------------------------------ +- Force Jump: height for all levels increased by 25% +- Force Pull: level 1 pulls weapons only, level 2 can knockdown, level 3 can pull toward you a little bit +- ***Force Sense: gives limited snipershot dodging ability (you might need to hold down Use) +- Force Speed: decreases FP cost of sniper shot dodging at Level 3 (for auto-dodging anyway) +- **Force Protect 1/2/3: gives only 10/20/40% damage reduction against saber attacks instead of 25/50/75% +- Force Heal: costs slightly fewer force points at Level 3 + +NPC AI +------------------------------------------------------------------------------------------------------------------------------ +NPC Jedi changes: +- smarter use of new JA abilities; only use Force Rage if close and have >25% HP, and only kick/use saber katas if close (except CLASS_REBORN, they like to taunt you and show off sometimes when far away) +- Less exploitable; if you disarm their saber throw (rather than just stand there), recover from knockdown faster, and activate their saber more quickly after being gripped/drained (all these effects generally increase with difficulty and NPC rank). Light Jedi don't attack surrendered/unarmed enemies (unless they have a dark side class like CLASS_REBORN, CLASS_DESANN etc.) +- Also, now have their level of acrobatics determined by their move stat; 3 allows rolls and lean dodges, 4 allows cartwheels and flipping out of knockdown, this way you can restrict an NPC to be less acrobatic and more "technical" + +Force-only Cultists: react properly to explosives, sniper shots, and saber throws; *sometimes use quick punches if close, and in general try harder to dodge saber attacks/throws + +CLASS_BOBA, CLASS_MANDA, and CLASS_COMMANDO: (these have NOT been thoroughly tested...) +- only an NPC with "undying 1" or the name boba_fett is invincible now +- CLASS_MANDA acts like CLASS_BOBA but without a jetpack +- CLASS_COMMANDO acts like CLASS_BOBA but without a jetpack or flamethrower + +Multi-weapon system: +- NPCs should now change to the next best weapon they have when you disarm them +- the boba-based classes support most player weapons now, and weapons are chosen randomly (can have more than 1 similar type of weapon) + +Other changes: +- Grenadier Grans will use Melee sometimes even if the player is using a saber +- **NPCs surrender more like JK2 (more consistent animation, once they decide to surrender near player they stay surrendered, but when you leave they will get sneaky) +- Allied NPCs receive 150%/125%/100% HP for Padawan/Jedi/Jedi Knight difficulties now instead of 100%/125%/150% like enemies +- Assassin Droids now fire even with their shields up +- Class_Rodian with E11, and Class_Imperial at commander rank use alt-fire now always (like in JK2) +- fixed a bug: Stormtroopers using Flechette and Repeater can now switch back to alt-fire if they switched to primary fire because the player was too close + + +Saber System (activated with g_saberNewCombat 1) +------------------------------------------------------------------------------------------------------------------------------ +- Saber Offense gives a base "attack strength/AS" (+2/+4/+6) +- Saber Defense gives a base "defense strength/DS" (+2/+4/+6) and a number of defense points (DP;= 1 + SD level) +- AS is modified by saber style (-2/0/+2/-1/+1/-1/+1 for Fast/Med/Strong/Duals/Staff/Tavion/Desann) + +How saber combat then works: +- AS > DS = attack blocked but lose DP equivalent to AS - DS +- all DP lost = guard crushed +- DPs regenerate about 1 per second if walking/standing still +- special attacks ignore DP: either crush guard or are blocked partially + +Other Changes: +- player's defense with Medium and Strong styles is improved (you can deflect slashes and blaster fire more rapidly, but still not as quickly as NPCs) +- Saber Defense 0 no longer makes you invincible to blaster fire, but blaster fire will pass through your saber +- a custom saber with "autoblocking 0" now has narrow block arc for the player (otherwise blocking is ridiculously easy); +holding Use and standing still will allow you to block in this fashion at any time + +Melee changes +-------------------------------------------------------------------------------------------------------------------------------- +- Player can kick with any saber type, use +forcefocus to saberthrow (bind this to a key, maybe your mousewheel click-down) +- Player's melee abilities determined by Saber Offense (1 = punches and kicks, 2 = katas, 3 = spin kicks) +- if you're not cheating (using g_debugMelee or iknowkungfu)... Player melee katas have less range, must be aimed more precisely, and do not work on certain types of enemies +- Spin/Flip kicks do slightly more damage +- Spin Kicks are possible on demand with Use+AltAttack, however costs 10 FP (the auto version doesn't cost any) +- **To kick over a Jedi, must have Saber Offense >= their Saber Defense +- Player punches do 7/5 damage instead of 6/3, and aren't randomized +- **Force Speed punching should be more consistent and less cheap (never did actually test) +- **Heavy/Slow Melee is specifically associated with Chewbacca, CLASS_GRAN, and CLASS_TRANDOSHAN. Other NPC types will punch +more quickly but weakly if given WP_MELEE + +Other Minor Features +---------------------------------------------------------------------------------------------------------------------------- +- visual effect for lightsaber-blocking Force Lightning, .efx file to use determined by "cg_lightningBlockEffect" +- rolls and acrobatics are possible in 1st Person now + +New Modding Features +------------------------------------------------------------------------------------------------------------------------------ +- some new fields you can put in NPC files... + dualPistols 1 -- gives an NPC dual pistols if have WP_BLASTER_PISTOL + cortosis 1 -- cuts damage in half from lightsabers, stacks on top of any other damage reductions + blastArmor 1 -- cuts damage in half from explosives and heavy weapons, stacks on top of any other damage reductions + magPlating 1 -- cuts damage in half from blasters, stacks on top of any other damage reductions + restrictJediPowers 1 -- restricts an NPC from using force powers they don't actually have (force pushing without Push 1 for example) + altFire 1 -- this actually works now + dontFlee 1 -- forces SCF_DONT_FLEE (an icarus script thing) + dontFire 1 -- forces SCF_DONT_FIRE (like how melee cultists don't punch) + rareFire 1 -- same AI as SCF_DONT_FIRE but allows punching sometimes with melee + heavyMelee 1 -- forces heavy melee regardless of class + +- new fields are in the weapons.dat: +1.) velocity, altVelocity: use an integer number (no decimals) +2.) npcDmgMult, npcAltDmgMult, npcFireTimeMult, npcAltFireTimeMult: multipliers that use a decimal (like 0.7, 1.5, 2.3 etc.) +*read the weaponshelp.txt for overview default values for these things are + +Future ideas +---------------------------------------------------------------------------------------------------------------------------- +Things to do - +- *savegame screenshots +- *separate cvar for player HP and Shields +- force push strong version, mindtrick changes +- *camera controls (1st, 2nd, 3rd, 4th person) + + +** not completely tested but should work +*** incomplete/unfinished/not working completely \ No newline at end of file diff --git a/changestodo.txt b/changestodo.txt new file mode 100644 index 0000000000..ee655b4c2d --- /dev/null +++ b/changestodo.txt @@ -0,0 +1,11 @@ +- multiweapon support +- parse .sab fields from NPC files and cvars (player) +- camera control (smart 3rd person, 2nd person) +- finish saber system; test save games, fix specials + +creative stuff: +- jedi stats +- saber throws +- strong force push +- force sense/speed dodging +- npcs run at close range with weapon \ No newline at end of file diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 35a5d6ad69..306842cd85 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -237,10 +237,14 @@ cvar_t *g_char_forceAffinity; //make into ui_cvars? cvar_t *g_char_forceFocus; cvar_t *g_char_forceSensitivity; +//cvar_t *g_handicap_hp; +//cvar_t *g_handicap_armor; cvar_t *g_handicap_maxArmor; +cvar_t *g_handicap_matchNPChp; cvar_t *g_saberDeflectAutoAim; cvar_t *g_playerCheatPowers; cvar_t *g_moonJump; +cvar_t *g_saberNewThrows; /* cvar_t *g_char_moveSpeedScale; 1.0 - you move faster / slower when using this saber @@ -781,10 +785,14 @@ void G_InitCvars( void ) { g_weaponVelocity = gi.cvar("g_weaponVelocity", "1.0", CVAR_ARCHIVE | CVAR_CHEAT); g_weaponAltVelocity = gi.cvar("g_weaponAltVelocity", "1.0", CVAR_ARCHIVE | CVAR_CHEAT); + //g_handicap_hp = gi.cvar("handicap_hp", "100", CVAR_ARCHIVE | CVAR_SAVEGAME | CVAR_NORESTART | CVAR_USERINFO); + //g_handicap_armor = gi.cvar("handicap_armor", "100", CVAR_ARCHIVE | CVAR_SAVEGAME | CVAR_NORESTART | CVAR_USERINFO); g_handicap_maxArmor = gi.cvar("handicap_maxArmor", "100", CVAR_ARCHIVE | CVAR_SAVEGAME | CVAR_NORESTART); + g_handicap_matchNPChp = gi.cvar("handicap_matchNPChp", "0", CVAR_CHEAT | CVAR_ARCHIVE | CVAR_SAVEGAME | CVAR_NORESTART); g_saberDeflectAutoAim = gi.cvar("g_saberDeflectAutoAim", "0", CVAR_SAVEGAME); g_playerCheatPowers = gi.cvar("g_playerCheatPowers", "0", CVAR_ARCHIVE | CVAR_SAVEGAME | CVAR_CHEAT); g_moonJump = gi.cvar("g_moonJump", "0", CVAR_ARCHIVE | CVAR_CHEAT); + g_saberNewThrows = gi.cvar("g_saberNewThrows", "1", CVAR_ARCHIVE); } /* diff --git a/code/game/g_missile.cpp b/code/game/g_missile.cpp index c3b19c43cf..785d6f8d19 100644 --- a/code/game/g_missile.cpp +++ b/code/game/g_missile.cpp @@ -40,7 +40,7 @@ extern qboolean PM_SaberInIdle(int move); extern qboolean PM_SaberInAttack(int move); extern qboolean PM_SaberInTransitionAny(int move); extern qboolean PM_SaberInSpecialAttack(int anim); -extern qboolean PM_WalkingOrIdle(gentity_t *self); +//extern qboolean PM_WalkingOrIdle(gentity_t *self); //------------------------------------------------------------------------- void G_MissileBounceEffect(gentity_t *ent, vec3_t org, vec3_t dir, qboolean hitWorld) @@ -183,16 +183,17 @@ void G_ReflectMissile(gentity_t *ent, gentity_t *missile, vec3_t forward, forceP {//but need to be blocking for perfect reflection on higher difficulties perfectReflection = qfalse; } - + /* if (!PM_WalkingOrIdle(owner) || !PM_SaberInParry(owner->client->ps.saberMove)) {//but need to be blocking for perfect reflection on higher difficulties perfectReflection = qfalse; } + */ } if (perfectReflection) { - if (!g_saberDeflectAutoAim->integer || owner->s.clientNum >= MAX_CLIENTS) //either by autoaim (lower difficulties) + if (g_saberDeflectAutoAim->integer || owner->s.clientNum >= MAX_CLIENTS) //either by autoaim (lower difficulties) { gentity_t *enemy; if (owner->enemy && Q_irand(0, 3)) @@ -268,7 +269,7 @@ void G_ReflectMissile(gentity_t *ent, gentity_t *missile, vec3_t forward, forceP } if (!reflected) { - if (!g_saberDeflectAutoAim->integer || owner->s.clientNum >= MAX_CLIENTS) + if (g_saberDeflectAutoAim->integer || owner->s.clientNum >= MAX_CLIENTS) { if (missile->owner && missile->s.weapon != WP_SABER) {//bounce back at them if you can diff --git a/code/game/weapons.h b/code/game/weapons.h index 00bafb7186..0e4c166c3d 100644 --- a/code/game/weapons.h +++ b/code/game/weapons.h @@ -83,6 +83,16 @@ typedef enum //# weapon_e WP_NUM_WEAPONS } weapon_t; +typedef enum { + WEAPS_ALL, + WEAPS_BLASTER, + WEAPS_HEAVY, + WEAPS_LIGHTBLASTER, + WEAPS_HEAVYBLASTER, + WEAPS_EXPLOSIVE, + WEAPS_OTHER +} weaponGroup; + #define FIRST_WEAPON WP_SABER // this is the first weapon for next and prev weapon switching #define MAX_PLAYER_WEAPONS WP_STUN_BATON // this is the max you can switch to and get with the give all. - FIXME: it's actually this one *minus* one... why? diff --git a/code/game/wp_melee.cpp b/code/game/wp_melee.cpp index 0112d13ac7..48dc365bb1 100644 --- a/code/game/wp_melee.cpp +++ b/code/game/wp_melee.cpp @@ -33,7 +33,7 @@ void WP_Melee( gentity_t *ent ) trace_t tr; vec3_t mins, maxs, end; int damage = weaponData[WP_MELEE].altDamage; - float range = ent->s.number ? 48 : 32; + float range = ent->s.number ? 64 : 32; VectorMA( muzzle, range, forwardVec, end ); @@ -76,4 +76,19 @@ void WP_Melee( gentity_t *ent ) G_Damage( tr_ent, ent, ent, forwardVec, tr.endpos, damage, dflags, MOD_MELEE ); } +} + +extern void NPC_ChangeWeapon(gentity_t* ent, int wp); +void WP_MeleeTime(gentity_t *meleer) +{ //were going to try melee attacks + if (!meleer || !meleer->client || !meleer->s.number) + { + return; + } + + meleer->client->ps.stats[STAT_WEAPONS] |= 1 << WP_MELEE; + + NPC_ChangeWeapon(meleer, WP_MELEE); + meleer->s.weapon = WP_MELEE; + meleer->NPC->last_ucmd.weapon = WP_MELEE; } \ No newline at end of file diff --git a/code/game/wp_rocket_launcher.cpp b/code/game/wp_rocket_launcher.cpp index b0c8b241f6..291cab53f7 100644 --- a/code/game/wp_rocket_launcher.cpp +++ b/code/game/wp_rocket_launcher.cpp @@ -211,7 +211,7 @@ void WP_FireRocket( gentity_t *ent, qboolean alt_fire ) damage = damage/2; } - damage = weaponData[WP_ROCKET_LAUNCHER].npcDmgMult; + damage *= weaponData[WP_ROCKET_LAUNCHER].npcDmgMult; } if ( alt_fire ) diff --git a/weaponshelp.txt b/weaponshelp.txt new file mode 100644 index 0000000000..3a677cf8e5 --- /dev/null +++ b/weaponshelp.txt @@ -0,0 +1,551 @@ +//These are the values read from the weapons.dat; values are self-explanatory except for WP_MELEE: +------------------------------------------------------------------------------------------------------- + int damage; //MELEE: right punch dmg + int altDamage; //MELEE: left punch dmg + int splashDamage; //MELEE: regular kick dmg + int altSplashDamage; //MELEE: mid-air/special kick dmg + float splashRadius; //MELEE: how much to multiply punch dmg for heavy punches + float altSplashRadius; + int velocity; //MELEE: dmg randomness is +/- this amount for all kicks + int altVelocity; //MELEE: dmg randomness is +/- this amount for heavy punches + float npcDmgMult; //scales the damage NPCs do with primary fire + float npcAltDmgMult; //scales the damage NPCs do with alt fire + float npcFireTimeMult; //scales the average rate of fire of NPCs using primary fire + float npcAltFireTimeMult; //scales the average rate of fire of NPCs using alt fire + + + + + +// These constants are used to fill in default values in the code: +------------------------------------------------------------------------------------------------------- +// Melee +//-------- +#define RIGHT_PUNCH_DAMAGE 6 +#define LEFT_PUNCH_DAMAGE 3 +#define HEAVY_MELEE_MULT 4.0 +#define HEAVY_MELEE_RANDOMNESS 0 +#define KICK_DAMAGE 5 +#define SPECIAL_KICK_DAMAGE 10 +#define KICK_DAMAGE_RANDOMNESS 1 + + +// Lightsaber +//-------- +#define IGNITION_TIME 1800 +#define BRYAR_PISTOL_DAMAGE 14 +#define BRYAR_CHARGE_UNIT 200.0f // bryar charging gives us one more unit every 200ms--if you change this, you'll have to do the same in bg_pmove + +// Bryar Pistol +//-------- +#define BRYAR_PISTOL_VEL 1800 +#define BRYAR_PISTOL_DAMAGE 14 +#define BRYAR_CHARGE_UNIT 200.0f // bryar charging gives us one more unit every 200ms--if you change this, you'll have to do the same in bg_pmove + +// E11 Blaster +//--------- +#define BLASTER_MAIN_SPREAD 0.5f +#define BLASTER_ALT_SPREAD 1.5f +#define BLASTER_NPC_SPREAD 0.5f +#define BLASTER_VELOCITY 2300 +#define BLASTER_NPC_VEL_CUT 0.5f +#define BLASTER_NPC_HARD_VEL_CUT 0.7f +#define BLASTER_DAMAGE 20 +#define BLASTER_NPC_DAMAGE_EASY 6 +#define BLASTER_NPC_DAMAGE_NORMAL 12 // 14 +#define BLASTER_NPC_DAMAGE_HARD 16 // 18 + +// Tenloss Disruptor +//---------- +#define DISRUPTOR_MAIN_DAMAGE 14 +#define DISRUPTOR_NPC_MAIN_DAMAGE_EASY 5 +#define DISRUPTOR_NPC_MAIN_DAMAGE_MEDIUM 10 +#define DISRUPTOR_NPC_MAIN_DAMAGE_HARD 15 + +#define DISRUPTOR_ALT_DAMAGE 12 +#define DISRUPTOR_NPC_ALT_DAMAGE_EASY 15 +#define DISRUPTOR_NPC_ALT_DAMAGE_MEDIUM 25 +#define DISRUPTOR_NPC_ALT_DAMAGE_HARD 30 +#define DISRUPTOR_ALT_TRACES 3 // can go through a max of 3 entities +#define DISRUPTOR_CHARGE_UNIT 150.0f // distruptor charging gives us one more unit every 150ms--if you change this, you'll have to do the same in bg_pmove + +// Wookie Bowcaster +//---------- +#define BOWCASTER_DAMAGE 45 +#define BOWCASTER_VELOCITY 1300 +#define BOWCASTER_NPC_DAMAGE_EASY 12 +#define BOWCASTER_NPC_DAMAGE_NORMAL 24 +#define BOWCASTER_NPC_DAMAGE_HARD 36 +#define BOWCASTER_SPLASH_DAMAGE 0 +#define BOWCASTER_SPLASH_RADIUS 0 +#define BOWCASTER_SIZE 2 + +#define BOWCASTER_ALT_SPREAD 5.0f +#define BOWCASTER_VEL_RANGE 0.3f +#define BOWCASTER_CHARGE_UNIT 200.0f // bowcaster charging gives us one more unit every 200ms--if you change this, you'll have to do the same in bg_pmove + +// Heavy Repeater +//---------- +#define REPEATER_SPREAD 1.4f +#define REPEATER_NPC_SPREAD 0.7f +#define REPEATER_DAMAGE 8 +#define REPEATER_VELOCITY 1600 +#define REPEATER_NPC_DAMAGE_EASY 2 +#define REPEATER_NPC_DAMAGE_NORMAL 4 +#define REPEATER_NPC_DAMAGE_HARD 6 + +#define REPEATER_ALT_SIZE 3 // half of bbox size +#define REPEATER_ALT_DAMAGE 60 +#define REPEATER_ALT_SPLASH_DAMAGE 60 +#define REPEATER_ALT_SPLASH_RADIUS 128 +#define REPEATER_ALT_VELOCITY 1100 +#define REPEATER_ALT_NPC_DAMAGE_EASY 15 +#define REPEATER_ALT_NPC_DAMAGE_NORMAL 30 +#define REPEATER_ALT_NPC_DAMAGE_HARD 45 + +// DEMP2 +//---------- +#define DEMP2_DAMAGE 15 +#define DEMP2_VELOCITY 1800 +#define DEMP2_NPC_DAMAGE_EASY 6 +#define DEMP2_NPC_DAMAGE_NORMAL 12 +#define DEMP2_NPC_DAMAGE_HARD 18 +#define DEMP2_SIZE 2 // half of bbox size + +#define DEMP2_ALT_DAMAGE 15 +#define DEMP2_CHARGE_UNIT 500.0f // demp2 charging gives us one more unit every 500ms--if you change this, you'll have to do the same in bg_pmove +#define DEMP2_ALT_RANGE 4096 +#define DEMP2_ALT_SPLASHRADIUS 256 + +// Golan Arms Flechette +//--------- +#define FLECHETTE_SHOTS 6 +#define FLECHETTE_SPREAD 4.0f +#define FLECHETTE_DAMAGE 15 +#define FLECHETTE_VEL 3500 +#define FLECHETTE_SIZE 1 + +#define FLECHETTE_ALT_DAMAGE 20 +#define FLECHETTE_ALT_SPLASH_DAM 20 +#define FLECHETTE_ALT_SPLASH_RAD 128 + +// NOT CURRENTLY USED +#define FLECHETTE_MINE_RADIUS_CHECK 200 +#define FLECHETTE_MINE_VEL 1000 +#define FLECHETTE_MINE_DAMAGE 100 +#define FLECHETTE_MINE_SPLASH_DAMAGE 200 +#define FLECHETTE_MINE_SPLASH_RADIUS 200 + +// Personal Rocket Launcher +//--------- +#define ROCKET_VELOCITY 900 +#define ROCKET_DAMAGE 100 +#define ROCKET_SPLASH_DAMAGE 100 +#define ROCKET_SPLASH_RADIUS 160 +#define ROCKET_NPC_DAMAGE_EASY 20 +#define ROCKET_NPC_DAMAGE_NORMAL 40 +#define ROCKET_NPC_DAMAGE_HARD 60 +#define ROCKET_SIZE 3 + +#define ROCKET_ALT_VELOCITY (ROCKET_VELOCITY*0.5) +#define ROCKET_ALT_THINK_TIME 100 + +// Concussion Rifle +//--------- +//primary +#define CONC_VELOCITY 3000 +#define CONC_DAMAGE 150 +#define CONC_NPC_SPREAD 0.7f +#define CONC_NPC_DAMAGE_EASY 15 +#define CONC_NPC_DAMAGE_NORMAL 30 +#define CONC_NPC_DAMAGE_HARD 50 +#define CONC_SPLASH_DAMAGE 50 +#define CONC_SPLASH_RADIUS 300 +//alt +#define CONC_ALT_DAMAGE 225//100 +#define CONC_ALT_NPC_DAMAGE_EASY 10 +#define CONC_ALT_NPC_DAMAGE_MEDIUM 20 +#define CONC_ALT_NPC_DAMAGE_HARD 30 + +// Emplaced Gun +//-------------- +#define EMPLACED_VEL 6000 // very fast +#define EMPLACED_DAMAGE 150 // and very damaging +#define EMPLACED_SIZE 5 // make it easier to hit things + +// ATST Main Gun +//-------------- +#define ATST_MAIN_VEL 4000 // +#define ATST_MAIN_DAMAGE 25 // +#define ATST_MAIN_SIZE 3 // make it easier to hit things + +// ATST Side Gun +//--------------- +#define ATST_SIDE_MAIN_DAMAGE 75 +#define ATST_SIDE_MAIN_VELOCITY 1300 +#define ATST_SIDE_MAIN_NPC_DAMAGE_EASY 30 +#define ATST_SIDE_MAIN_NPC_DAMAGE_NORMAL 40 +#define ATST_SIDE_MAIN_NPC_DAMAGE_HARD 50 +#define ATST_SIDE_MAIN_SIZE 4 +#define ATST_SIDE_MAIN_SPLASH_DAMAGE 10 // yeah, pretty small, either zero out or make it worth having? +#define ATST_SIDE_MAIN_SPLASH_RADIUS 16 // yeah, pretty small, either zero out or make it worth having? + +#define ATST_SIDE_ALT_VELOCITY 1100 +#define ATST_SIDE_ALT_NPC_VELOCITY 600 +#define ATST_SIDE_ALT_DAMAGE 130 + +#define ATST_SIDE_ROCKET_NPC_DAMAGE_EASY 30 +#define ATST_SIDE_ROCKET_NPC_DAMAGE_NORMAL 50 +#define ATST_SIDE_ROCKET_NPC_DAMAGE_HARD 90 + +#define ATST_SIDE_ALT_SPLASH_DAMAGE 130 +#define ATST_SIDE_ALT_SPLASH_RADIUS 200 +#define ATST_SIDE_ALT_ROCKET_SIZE 5 +#define ATST_SIDE_ALT_ROCKET_SPLASH_SCALE 0.5f // scales splash for NPC's + +// Stun Baton +//-------------- +#define STUN_BATON_DAMAGE 22 +#define STUN_BATON_ALT_DAMAGE 22 +#define STUN_BATON_RANGE 25 + +// Laser Trip Mine +//-------------- +#define LT_DAMAGE 150 +#define LT_SPLASH_RAD 256.0f +#define LT_SPLASH_DAM 90 + +#define LT_VELOCITY 250.0f +#define LT_ALT_VELOCITY 1000.0f + +#define PROX_MINE_RADIUS_CHECK 190 + +#define LT_SIZE 3.0f +#define LT_ALT_TIME 2000 +#define LT_ACTIVATION_DELAY 1000 +#define LT_DELAY_TIME 50 + +// Thermal Detonator +//-------------- +#define TD_DAMAGE 100 +#define TD_NPC_DAMAGE_CUT 0.6f // NPC thrown dets deliver only 60% of the damage that a player thrown one does +#define TD_SPLASH_RAD 128 +#define TD_SPLASH_DAM 90 +#define TD_VELOCITY 900 +#define TD_MIN_CHARGE 0.15f +#define TD_TIME 4000 +#define TD_THINK_TIME 300 // don't think too often? +#define TD_TEST_RAD (TD_SPLASH_RAD * 0.8f) // no sense in auto-blowing up if exactly on the radius edge--it would hardly do any damage +#define TD_ALT_TIME 3000 + +#define TD_ALT_DAMAGE 100 +#define TD_ALT_SPLASH_RAD 128 +#define TD_ALT_SPLASH_DAM 90 +#define TD_ALT_VELOCITY 600 +#define TD_ALT_MIN_CHARGE 0.15f +#define TD_ALT_TIME 3000 + +// Tusken Rifle Shot +//-------------- +#define TUSKEN_RIFLE_VEL 3000 // fast +#define TUSKEN_RIFLE_DAMAGE_EASY 20 // damaging +#define TUSKEN_RIFLE_DAMAGE_MEDIUM 30 // very damaging +#define TUSKEN_RIFLE_DAMAGE_HARD 50 // extremely damaging + +// Noghri Stick +//-------------- +#define NOGHRI_STICK_VEL 1200 +#define NOGHRI_STICK_DAMAGE 10 +#define NOGHRI_STICK_DAMAGE_EASY 1 +#define NOGHRI_STICK_DAMAGE_MEDIUM 5 +#define NOGHRI_STICK_DAMAGE_HARD 10 + + +// These functions fill in the fields for you if you don't put them in the weapons.dat: +------------------------------------------------------------------------------------------------------- +const int defaultDamage[] = { + 0, // WP_NONE + 0, // WP_SABER // handled elsewhere + BRYAR_PISTOL_DAMAGE, // WP_BLASTER_PISTOL + BLASTER_DAMAGE, // WP_BLASTER + DISRUPTOR_MAIN_DAMAGE, // WP_DISRUPTOR + BOWCASTER_DAMAGE, // WP_BOWCASTER + REPEATER_DAMAGE, // WP_REPEATER + DEMP2_DAMAGE, // WP_DEMP2 + FLECHETTE_DAMAGE, // WP_FLECHETTE + ROCKET_DAMAGE, // WP_ROCKET_LAUNCHER + TD_DAMAGE, // WP_THERMAL + LT_DAMAGE, // WP_TRIP_MINE + FLECHETTE_MINE_DAMAGE, // WP_DET_PACK // HACK, this is what the code sez. + CONC_DAMAGE, // WP_CONCUSSION + + RIGHT_PUNCH_DAMAGE, // WP_MELEE + + ATST_MAIN_DAMAGE, // WP_ATST_MAIN + ATST_SIDE_MAIN_DAMAGE, // WP_ATST_SIDE + + STUN_BATON_DAMAGE, // WP_STUN_BATON + + BRYAR_PISTOL_DAMAGE, // WP_BRYAR_PISTOL + EMPLACED_DAMAGE, // WP_EMPLACED_GUN + BRYAR_PISTOL_DAMAGE, // WP_BOT_LASER + 0, // WP_TURRET // handled elsewhere + EMPLACED_DAMAGE, // WP_TIE_FIGHTER + EMPLACED_DAMAGE, // WP_RAPID_FIRE_CONC, + + BRYAR_PISTOL_DAMAGE, // WP_JAWA + 0, // WP_TUSKEN_RIFLE + 0, // WP_TUSKEN_STAFF + 0, // WP_SCEPTER + 0, // WP_NOGHRI_STICK +}; + +const int defaultAltDamage[] = { + 0, // WP_NONE + 0, // WP_SABER // handled elsewhere + BRYAR_PISTOL_DAMAGE, // WP_BLASTER_PISTOL + BLASTER_DAMAGE, // WP_BLASTER + DISRUPTOR_ALT_DAMAGE, // WP_DISRUPTOR + BOWCASTER_DAMAGE, // WP_BOWCASTER + REPEATER_ALT_DAMAGE, // WP_REPEATER + DEMP2_ALT_DAMAGE, // WP_DEMP2 + FLECHETTE_ALT_DAMAGE, // WP_FLECHETTE + ROCKET_DAMAGE, // WP_ROCKET_LAUNCHER + TD_ALT_DAMAGE, // WP_THERMAL + LT_DAMAGE, // WP_TRIP_MINE + FLECHETTE_MINE_DAMAGE, // WP_DET_PACK // HACK, this is what the code sez. + CONC_ALT_DAMAGE, // WP_CONCUSION + + LEFT_PUNCH_DAMAGE, // WP_MELEE + + ATST_MAIN_DAMAGE, // WP_ATST_MAIN + ATST_SIDE_ALT_DAMAGE, // WP_ATST_SIDE + + STUN_BATON_ALT_DAMAGE, // WP_STUN_BATON + + BRYAR_PISTOL_DAMAGE, // WP_BRYAR_PISTOL + EMPLACED_DAMAGE, // WP_EMPLACED_GUN + BRYAR_PISTOL_DAMAGE, // WP_BOT_LASER + 0, // WP_TURRET // handled elsewhere + EMPLACED_DAMAGE, // WP_TIE_FIGHTER + 0, // WP_RAPID_FIRE_CONC // repeater alt damage is used instead + + BRYAR_PISTOL_DAMAGE, // WP_JAWA + 0, // WP_TUSKEN_RIFLE + 0, // WP_TUSKEN_STAFF + 0, // WP_SCEPTER + 0, // WP_NOGHRI_STICK +}; + +const int defaultSplashDamage[] = { + 0, // WP_NONE + 0, // WP_SABER + 0, // WP_BLASTER_PISTOL + 0, // WP_BLASTER + 0, // WP_DISRUPTOR + BOWCASTER_SPLASH_DAMAGE, // WP_BOWCASTER + 0, // WP_REPEATER + 0, // WP_DEMP2 + 0, // WP_FLECHETTE + ROCKET_SPLASH_DAMAGE, // WP_ROCKET_LAUNCHER + TD_SPLASH_DAM, // WP_THERMAL + LT_SPLASH_DAM, // WP_TRIP_MINE + FLECHETTE_MINE_SPLASH_DAMAGE, // WP_DET_PACK // HACK, this is what the code sez. + CONC_SPLASH_DAMAGE, // WP_CONCUSSION + + KICK_DAMAGE, // WP_MELEE + + 0, // WP_ATST_MAIN + ATST_SIDE_MAIN_SPLASH_DAMAGE, // WP_ATST_SIDE + + 0, // WP_STUN_BATON + + 0, // WP_BRYAR_PISTOL + 0, // WP_EMPLACED_GUN + 0, // WP_BOT_LASER + 0, // WP_TURRET + 0, // WP_TIE_FIGHTER + 0, // WP_RAPID_FIRE_CONC + 0, // WP_JAWA + 0, // WP_TUSKEN_RIFLE + 0, // WP_TUSKEN_STAFF + 0, // WP_SCEPTER + 0, // WP_NOGHRI_STICK +}; + +const float defaultSplashRadius[] = { + 0.0f, // WP_NONE + 0.0f, // WP_SABER + 0.0f, // WP_BLASTER_PISTOL + 0.0f, // WP_BLASTER + 0.0f, // WP_DISRUPTOR + BOWCASTER_SPLASH_RADIUS, // WP_BOWCASTER + 0.0f, // WP_REPEATER + 0.0f, // WP_DEMP2 + 0.0f, // WP_FLECHETTE + ROCKET_SPLASH_RADIUS, // WP_ROCKET_LAUNCHER + TD_SPLASH_RAD, // WP_THERMAL + LT_SPLASH_RAD, // WP_TRIP_MINE + FLECHETTE_MINE_SPLASH_RADIUS, // WP_DET_PACK // HACK, this is what the code sez. + CONC_SPLASH_RADIUS, // WP_CONCUSSION + + HEAVY_MELEE_MULT, // WP_MELEE + + 0.0f, // WP_ATST_MAIN + ATST_SIDE_MAIN_SPLASH_RADIUS, // WP_ATST_SIDE + + 0.0f, // WP_STUN_BATON + + 0.0f, // WP_BRYAR_PISTOL + 0.0f, // WP_EMPLACED_GUN + 0.0f, // WP_BOT_LASER + 0.0f, // WP_TURRET + 0.0f, // WP_TIE_FIGHTER + 0.0f, // WP_RAPID_FIRE_CONC + + 0.0f, // WP_JAWA + 0.0f, // WP_TUSKEN_RIFLE + 0.0f, // WP_TUSKEN_STAFF + 0.0f, // WP_SCEPTER + 0.0f, // WP_NOGHRI_STICK +}; + +const int defaultAltSplashDamage[] = { + 0, // WP_NONE + 0, // WP_SABER // handled elsewhere + 0, // WP_BLASTER_PISTOL + 0, // WP_BLASTER + 0, // WP_DISRUPTOR + BOWCASTER_SPLASH_DAMAGE, // WP_BOWCASTER + REPEATER_ALT_SPLASH_DAMAGE, // WP_REPEATER + DEMP2_ALT_DAMAGE, // WP_DEMP2 + FLECHETTE_ALT_SPLASH_DAM, // WP_FLECHETTE + ROCKET_SPLASH_DAMAGE, // WP_ROCKET_LAUNCHER + TD_ALT_SPLASH_DAM, // WP_THERMAL + TD_ALT_SPLASH_DAM, // WP_TRIP_MINE + FLECHETTE_MINE_SPLASH_DAMAGE, // WP_DET_PACK // HACK, this is what the code sez. + 0, // WP_CONCUSSION + + SPECIAL_KICK_DAMAGE, // WP_MELEE + + 0, // WP_ATST_MAIN + ATST_SIDE_ALT_SPLASH_DAMAGE, // WP_ATST_SIDE + + 0, // WP_STUN_BATON + + 0, // WP_BRYAR_PISTOL + 0, // WP_EMPLACED_GUN + 0, // WP_BOT_LASER + 0, // WP_TURRET // handled elsewhere + 0, // WP_TIE_FIGHTER + 0, // WP_RAPID_FIRE_CONC + + 0, // WP_JAWA + 0, // WP_TUSKEN_RIFLE + 0, // WP_TUSKEN_STAFF + 0, // WP_SCEPTER + 0, // WP_NOGHRI_STICK +}; + +const float defaultAltSplashRadius[] = { + 0.0f, // WP_NONE + 0.0f, // WP_SABER // handled elsewhere + 0.0f, // WP_BLASTER_PISTOL + 0.0f, // WP_BLASTER + 0.0f, // WP_DISRUPTOR + BOWCASTER_SPLASH_RADIUS, // WP_BOWCASTER + REPEATER_ALT_SPLASH_RADIUS, // WP_REPEATER + DEMP2_ALT_SPLASHRADIUS, // WP_DEMP2 + FLECHETTE_ALT_SPLASH_RAD, // WP_FLECHETTE + ROCKET_SPLASH_RADIUS, // WP_ROCKET_LAUNCHER + TD_ALT_SPLASH_RAD, // WP_THERMAL + LT_SPLASH_RAD, // WP_TRIP_MINE + FLECHETTE_ALT_SPLASH_RAD, // WP_DET_PACK // HACK, this is what the code sez. + 0.0f, // WP_CONCUSSION + + 0.0f, // WP_MELEE + + 0.0f, // WP_ATST_MAIN + ATST_SIDE_ALT_SPLASH_RADIUS, // WP_ATST_SIDE + + 0.0f, // WP_STUN_BATON + + 0.0f, // WP_BRYAR_PISTOL + 0.0f, // WP_EMPLACED_GUN + 0.0f, // WP_BOT_LASER + 0.0f, // WP_TURRET // handled elsewhere + 0.0f, // WP_TIE_FIGHTER + 0.0f, // WP_RAPID_FIRE_CONC + + 0.0f, // WP_JAWA + 0.0f, // WP_TUSKEN_RIFLE + 0.0f, // WP_TUSKEN_STAFF + 0.0f, // WP_SCEPTER + 0.0f, // WP_NOGHRI_STICK +}; + +const int defaultVelocity[WP_NUM_WEAPONS] = +{ + 0,//WP_NONE, + 0,//WP_SABER, // NOTE: lots of code assumes this is the first weapon (... which is crap) so be careful -Ste. + BRYAR_PISTOL_VEL,//WP_BLASTER_PISTOL, + BLASTER_VELOCITY,//WP_BLASTER, + Q3_INFINITE,//WP_DISRUPTOR, + BOWCASTER_VELOCITY,//WP_BOWCASTER, + REPEATER_VELOCITY,//WP_REPEATER, + DEMP2_VELOCITY, //WP_DEMP2, + FLECHETTE_VEL,//WP_FLECHETTE, + ROCKET_VELOCITY,//WP_ROCKET_LAUNCHER, + TD_VELOCITY,//WP_THERMAL, + 0,//WP_TRIP_MINE, + 0,//WP_DET_PACK, + CONC_VELOCITY,//WP_CONCUSSION, + KICK_DAMAGE_RANDOMNESS,//WP_MELEE, // Any ol' melee attack + 0,//WP_STUN_BATON, + BRYAR_PISTOL_VEL,//WP_BRYAR_PISTOL, + EMPLACED_VEL,//WP_EMPLACED_GUN, + BRYAR_PISTOL_VEL,//WP_BOT_LASER, // Probe droid - Laser blast + 0,//WP_TURRET, // turret guns + ATST_MAIN_VEL,//WP_ATST_MAIN, + ATST_SIDE_MAIN_VELOCITY,//WP_ATST_SIDE, + EMPLACED_VEL,//WP_TIE_FIGHTER, + EMPLACED_VEL,//WP_RAPID_FIRE_CONC, + 0,//WP_JAWA, + TUSKEN_RIFLE_VEL,//WP_TUSKEN_RIFLE, + 0,//WP_TUSKEN_STAFF, + 0,//WP_SCEPTER, + 0,//WP_NOGHRI_STICK, +}; + +const int defaultAltVelocity[WP_NUM_WEAPONS] = +{ + 0,//WP_NONE, + 0,//WP_SABER, // NOTE: lots of code assumes this is the first weapon (... which is crap) so be careful -Ste. + BRYAR_PISTOL_VEL,//WP_BLASTER_PISTOL, + BLASTER_VELOCITY,//WP_BLASTER, + Q3_INFINITE,//WP_DISRUPTOR, + BOWCASTER_VELOCITY,//WP_BOWCASTER, + REPEATER_ALT_VELOCITY,//WP_REPEATER, + DEMP2_ALT_RANGE,//WP_DEMP2, + FLECHETTE_MINE_VEL,//WP_FLECHETTE, + ROCKET_ALT_VELOCITY,//WP_ROCKET_LAUNCHER, + TD_ALT_VELOCITY,//WP_THERMAL, + 0,//WP_TRIP_MINE, + 0,//WP_DET_PACK, + Q3_INFINITE,//WP_CONCUSSION, + HEAVY_MELEE_RANDOMNESS,//WP_MELEE, // Any ol' melee attack + 0,//WP_STUN_BATON, + BRYAR_PISTOL_VEL,//WP_BRYAR_PISTOL, + EMPLACED_VEL,//WP_EMPLACED_GUN, + BRYAR_PISTOL_VEL,//WP_BOT_LASER, // Probe droid - Laser blast + 0,//WP_TURRET, // turret guns + ATST_MAIN_VEL,//WP_ATST_MAIN, + ATST_SIDE_ALT_NPC_VELOCITY,//WP_ATST_SIDE, + EMPLACED_VEL,//WP_TIE_FIGHTER, + REPEATER_ALT_VELOCITY,//WP_RAPID_FIRE_CONC, + 0,//WP_JAWA, + TUSKEN_RIFLE_VEL,//WP_TUSKEN_RIFLE, + 0,//WP_TUSKEN_STAFF, + 0,//WP_SCEPTER, + 0,//WP_NOGHRI_STICK, +}; \ No newline at end of file From 4b29ce8651f7f07d39fd0c0579b9a9cc366f4141 Mon Sep 17 00:00:00 2001 From: dusty22 Date: Mon, 19 Dec 2016 17:44:25 -0500 Subject: [PATCH 367/445] Other AI changes; melee updates; beginning of experimental NPC fields --- code/cgame/cg_players.cpp | 5 +- code/game/AI_Grenadier.cpp | 32 ++++------- code/game/AI_Jedi.cpp | 114 +++++++++++++++++++++++-------------- code/game/NPC_behavior.cpp | 31 +++++++++- code/game/bg_pangles.cpp | 5 +- code/game/bg_panimate.cpp | 4 +- code/game/bg_pmove.cpp | 25 +++++++- code/game/g_active.cpp | 5 +- 8 files changed, 142 insertions(+), 79 deletions(-) diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index c1a300e466..a25a339997 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -990,7 +990,10 @@ static void CG_PlayerAnimEventDo( centity_t *cent, animevent_t *animEvent ) { if (cent->gent->client->ps.torsoAnim == BOTH_KYLE_PA_1 || cent->gent->client->ps.torsoAnim == BOTH_KYLE_PA_2 - || cent->gent->client->ps.torsoAnim == BOTH_KYLE_PA_3) + || cent->gent->client->ps.torsoAnim == BOTH_KYLE_PA_3 + || cent->gent->client->ps.torsoAnim == BOTH_PLAYER_PA_1 + || cent->gent->client->ps.torsoAnim == BOTH_PLAYER_PA_2 + || cent->gent->client->ps.torsoAnim == BOTH_PLAYER_PA_3) { if (Q_stristr(s, "force") && cent->gent && cent->gent->flags&FL_MELEEKATA_NOFORCEFX) { diff --git a/code/game/AI_Grenadier.cpp b/code/game/AI_Grenadier.cpp index d606d5a133..6605eb1902 100644 --- a/code/game/AI_Grenadier.cpp +++ b/code/game/AI_Grenadier.cpp @@ -48,7 +48,7 @@ extern qboolean FlyingCreature( gentity_t *ent ); #define REALIZE_THRESHOLD 0.6f #define CAUTIOUS_THRESHOLD ( REALIZE_THRESHOLD * 0.75 ) -#define MELEE_CHANCE 1000000 +#define MELEE_CHANCE 1800 qboolean NPC_CheckPlayerTeamStealth( void ); @@ -519,10 +519,9 @@ void NPC_BSGrenadier_Attack( void ) } //See if we should switch to melee attack - if ( (enemyDist < 16384 && enemyUsingSaber) - || (enemyDist < 64*64 && !Q_irand(0,50))) //chance to try punching if player is super close - // 50% chance if enemy very close to use melee on saber wielding enemy - {//enemy is close and not using saber or very close and random chance + if ( (enemyDist < 16384 && !enemyUsingSaber) + || (enemyDist < 64*64 && !Q_irand(0, MELEE_CHANCE) && TIMER_Done(NPC, "sleepTime"))) + {//enemy is close and not using saber or very close and random chance and we weren't just using melee if ( NPC->client->ps.weapon == WP_THERMAL ) {//grenadier trace_t trace; @@ -532,9 +531,9 @@ void NPC_BSGrenadier_Attack( void ) //reset fire-timing variables if (NPCInfo->aiFlags&NPCAI_HEAVY_MELEE) { - if (enemyUsingSaber && !Q_irand(0,MELEE_CHANCE) /*&& TIMER_Done(NPC, "sleepTime")*/) + if (enemyUsingSaber) { - TIMER_Set(NPC, "sleepTime", Q_irand(2000, 5000));//keep using melee for a short while + TIMER_Set(NPC, "sleepTime", Q_irand(1000, 2500));//keep using melee for a short while NPC_ChangeWeapon(WP_MELEE); if (!(NPCInfo->scriptFlags&SCF_CHASE_ENEMIES))//NPCInfo->behaviorState == BS_STAND_AND_SHOOT ) {//FIXME: should we be overriding scriptFlags? @@ -554,24 +553,17 @@ void NPC_BSGrenadier_Attack( void ) } } } - else if ( enemyDist > 65536 || enemyUsingSaber )//256 - {//enemy is far or using saber + else if (enemyDist > 65536 || (enemyUsingSaber && TIMER_Done(NPC, "sleepTime")))//256 + {//enemy is far or using saber and sleep time is done if ( NPC->client->ps.weapon == WP_MELEE && (NPC->client->ps.stats[STAT_WEAPONS]&(1< 0 ) + if ( enemy_dist > 0 + || (enemy_dist > 128 && NPC->client->NPC_class == CLASS_REBORN && !Q_irand(0,3))) //reborn like to show off a little { return qfalse; } @@ -1330,8 +1331,8 @@ void Kyle_TryGrab( void ) qboolean Kyle_CanDoGrab( void ) { if ( (NPC->client->NPC_class == CLASS_KYLE && (NPC->spawnflags&1)) - || NPCInfo->stats.saberMeleeKatas) - {//Boss Kyle + || (NPCInfo->stats.saberMeleeKatas && NPC->s.weapon == WP_SABER) || (NPCInfo->stats.meleeKatas && NPC->s.weapon == WP_MELEE)) + {//Boss Kyle or NPC with special fields if ( NPC->enemy && NPC->enemy->client ) {//have a valid enemy if ( TIMER_Done( NPC, "grabEnemyDebounce" ) ) @@ -1404,7 +1405,7 @@ static void Jedi_CombatDistance( int enemy_dist ) TIMER_Set( NPC, "attackDelay", Q_irand( 0, 1000 ) ); } - if ( NPC->client->NPC_class == CLASS_BOBAFETT || NPC->client->NPC_class == CLASS_MANDA ) + if (NPC->client->NPC_class == CLASS_BOBAFETT || NPC->client->NPC_class == CLASS_MANDA || NPC->client->NPC_class == CLASS_COMMANDO) { if ( !TIMER_Done( NPC, "flameTime" ) ) { @@ -1568,7 +1569,11 @@ static void Jedi_CombatDistance( int enemy_dist ) if ( G_PickAutoMultiKick( NPC, qfalse, qtrue ) != LS_NONE || (G_CanKickEntity(NPC, NPC->enemy ) && G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE ) ) {//kicked! - TIMER_Set( NPC, "kickDebounce", Q_irand( 3000, 10000 ) ); + int kickFreqIncrease = NPC->NPC->stats.meleeKicks - 1; + if (kickFreqIncrease > 0) + TIMER_Set(NPC, "kickDebounce", Q_irand(3000, 10000 - kickFreqIncrease*1000)); + else + TIMER_Set(NPC, "kickDebounce", (Q_irand(3000, 10000))); return; } } @@ -1608,7 +1613,11 @@ static void Jedi_CombatDistance( int enemy_dist ) if ( G_PickAutoMultiKick( NPC, qfalse, qtrue ) != LS_NONE || (G_CanKickEntity(NPC, NPC->enemy ) && G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE ) ) {//kicked! - TIMER_Set( NPC, "kickDebounce", Q_irand( 3000, 10000 ) ); + int kickFreqIncrease = NPC->NPC->stats.meleeKicks - 1; + if (kickFreqIncrease > 0) + TIMER_Set(NPC, "kickDebounce", Q_irand(3000, 10000 - kickFreqIncrease * 1000)); + else + TIMER_Set(NPC, "kickDebounce", (Q_irand(3000, 10000))); return; } } @@ -1636,7 +1645,11 @@ static void Jedi_CombatDistance( int enemy_dist ) if ( G_PickAutoMultiKick( NPC, qfalse, qtrue ) != LS_NONE || (G_CanKickEntity(NPC, NPC->enemy ) && G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE ) ) {//kicked! - TIMER_Set( NPC, "kickDebounce", Q_irand( 3000, 10000 ) ); + int kickFreqIncrease = NPC->NPC->stats.meleeKicks - 1; + if (kickFreqIncrease > 0) + TIMER_Set(NPC, "kickDebounce", Q_irand(3000, 10000 - kickFreqIncrease * 1000)); + else + TIMER_Set(NPC, "kickDebounce", (Q_irand(3000, 10000))); return; } } @@ -1969,7 +1982,11 @@ static void Jedi_CombatDistance( int enemy_dist ) if ( G_PickAutoMultiKick( NPC, qfalse, qtrue ) != LS_NONE || (G_CanKickEntity(NPC, NPC->enemy ) && G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE ) ) {//kicked! - TIMER_Set( NPC, "kickDebounce", Q_irand( 3000, 10000 ) ); + int kickFreqIncrease = NPC->NPC->stats.meleeKicks - 1; + if (kickFreqIncrease > 0) + TIMER_Set(NPC, "kickDebounce", Q_irand(3000, 10000 - kickFreqIncrease * 1000)); + else + TIMER_Set(NPC, "kickDebounce", (Q_irand(3000, 10000))); return; } } @@ -2485,7 +2502,7 @@ evasionType_t Jedi_CheckFlipEvasions( gentity_t *self, float rightdot, float zdi && !PM_InRoll( &self->client->ps ) && !PM_InKnockDown( &self->client->ps ) && !PM_SaberInSpecialAttack( self->client->ps.torsoAnim ) - && self->NPC->stats.move >= 3) + && self->NPC->stats.move > 3) { vec3_t fwd, right, traceto, mins = {self->mins[0],self->mins[1],self->mins[2]+STEPSIZE}, maxs = {self->maxs[0],self->maxs[1],24}, fwdAngles = {0, self->client->ps.viewangles[YAW], 0}; trace_t trace; @@ -2508,8 +2525,7 @@ evasionType_t Jedi_CheckFlipEvasions( gentity_t *self, float rightdot, float zdi allowCartWheels = qfalse; } } - if (self->client->ps.forcePowerLevel[FP_LEVITATION] < FORCE_LEVEL_1 - || self->NPC->stats.move < 4) + if (self->client->ps.forcePowerLevel[FP_LEVITATION] < FORCE_LEVEL_1 && self->s.weapon != WP_SABER) { //can't do no-handed cartwheels without a bit of force jumping ability or teh moves allowCartWheels = qfalse; } @@ -3144,7 +3160,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc {//either it will miss by a bit (and 25% chance) OR our saber is not in-hand OR saber is off if ( self->NPC && (self->NPC->rank == RANK_CREWMAN || self->NPC->rank >= RANK_LT_JG) - && self->NPC->stats.move >= 3) + && self->NPC->stats.move > 3) {//acrobat or fencer or above if ( self->client->ps.groundEntityNum != ENTITYNUM_NONE &&//on the ground !(self->client->ps.pm_flags&PMF_DUCKED)&&cmd->upmove>=0&&TIMER_Done( self, "duck" )//not ducking @@ -3169,7 +3185,7 @@ evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc if ((self->client->NPC_class == CLASS_BOBAFETT || self->client->NPC_class == CLASS_MANDA || self->client->NPC_class == CLASS_COMMANDO //boba fett || (self->client->NPC_class == CLASS_REBORN && self->s.weapon != WP_SABER) //non-saber reborn (cultist) ) - && self->NPC->stats.move >= 3 + //&& self->NPC->stats.move >= 3 && !Q_irand( 0, 2 ) ) { @@ -4449,7 +4465,11 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en ) ) {//kicked - TIMER_Set( NPC, "kickDebounce", Q_irand( 3000, 10000 ) ); + int kickFreqIncrease = NPC->NPC->stats.meleeKicks - 1; + if (kickFreqIncrease > 0) + TIMER_Set(NPC, "kickDebounce", Q_irand(3000, 10000 - kickFreqIncrease * 1000)); + else + TIMER_Set(NPC, "kickDebounce", (Q_irand(3000, 10000))); } else if ( (NPCInfo->rank == RANK_ENSIGN || NPCInfo->rank > RANK_LT_JG) && TIMER_Done( NPC, "parryTime" ) ) {//FIXME: check forcePushRadius[NPC->client->ps.forcePowerLevel[FP_PUSH]] @@ -4475,9 +4495,13 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en if ( !Q_irand( 0, 5 ) || !Jedi_Strafe( 300, 1000, 0, 1000, qfalse ) ) {//certain chance they will pick an alternative evasion //if couldn't strafe, try a different kind of evasion... - if ((NPC->s.weapon == WP_SABER || NPCInfo->stats.meleeKicks) && Jedi_DecideKick(enemy_dist) && G_CanKickEntity(NPC, NPC->enemy) && G_PickAutoKick(NPC, NPC->enemy, qtrue) != LS_NONE) + if ((NPC->s.weapon == WP_SABER || /*NPCInfo->stats.meleeKicks*/ NPC->s.weapon == WP_MELEE) && Jedi_DecideKick(enemy_dist) && G_CanKickEntity(NPC, NPC->enemy) && G_PickAutoKick(NPC, NPC->enemy, qtrue) != LS_NONE) {//kicked! - TIMER_Set( NPC, "kickDebounce", Q_irand( 3000, 10000 ) ); + int kickFreqIncrease = NPC->NPC->stats.meleeKicks - 1; + if (kickFreqIncrease > 0) + TIMER_Set(NPC, "kickDebounce", Q_irand(3000, 10000 - kickFreqIncrease * 1000)); + else + TIMER_Set(NPC, "kickDebounce", (Q_irand(3000, 10000))); } else if ( shooting_lightning || throwing_saber || enemy_dist < 80 ) { @@ -5397,11 +5421,6 @@ static qboolean Jedi_AttackDecide( int enemy_dist ) return qfalse; } - if (!TIMER_Done(NPC, "attackDelay") && NPC->s.weapon == WP_MELEE) - { - return qfalse; - } - if ( Jedi_CultistDestroyer( NPC ) ) {//destroyer if ( enemy_dist <= 32 ) @@ -5496,32 +5515,37 @@ static qboolean Jedi_AttackDecide( int enemy_dist ) return qfalse; } - if ( (NPCInfo->scriptFlags&SCF_DONT_FIRE && NPCInfo->stats.rareFire) ) - {//melee cultists punch rarely - if (NPC->s.weapon == WP_MELEE - && enemy_dist <= 0 - && ucmd.forwardmove >= 0 //if moving backwards punch tends to miss - && (NPC->client->ps.groundEntityNum != ENTITYNUM_NONE - && NPC->enemy->client->ps.groundEntityNum != ENTITYNUM_NONE)) //both on ground - { - if (!(NPC->client->ps.forcePowerDebounce[FP_PUSH] > level.time || NPC->client->ps.forcePowerDebounce[FP_PULL] > level.time - || NPC->client->ps.forcePowerDebounce[FP_DRAIN] > level.time || NPC->client->ps.forcePowerDebounce[FP_LIGHTNING] > level.time)) - {//not in the middle of pushing, pulling, draining, or zapping - if ((level.time - NPC->client->ps.forcePowerDebounce[FP_PUSH] < 1000 - || level.time - NPC->client->ps.forcePowerDebounce[FP_PUSH] < 1000)) - {//we already tried to push/pull and aren't using another force power + + if (NPC->s.weapon == WP_MELEE + && enemy_dist < -20 + && ucmd.forwardmove >= 0 //if moving backwards punch tends to miss + && (NPC->client->ps.groundEntityNum != ENTITYNUM_NONE + && NPC->enemy->client->ps.groundEntityNum != ENTITYNUM_NONE)) //both on ground + { + if (!(NPC->client->ps.forcePowerDebounce[FP_PUSH] > level.time || NPC->client->ps.forcePowerDebounce[FP_PULL] > level.time + || NPC->client->ps.forcePowerDebounce[FP_DRAIN] > level.time || NPC->client->ps.forcePowerDebounce[FP_LIGHTNING] > level.time)) + {//not in the middle of pushing, pulling, draining, or zapping + if ((level.time - NPC->client->ps.forcePowerDebounce[FP_PUSH] < 1000 + || level.time - NPC->client->ps.forcePowerDebounce[FP_PUSH] < 1000)) + {//we already tried to push/pull and aren't using another force power + if ((NPCInfo->scriptFlags&SCF_DONT_FIRE && NPCInfo->stats.rareFire)) + {//melee cultists punch *rarely* if (!Q_irand(0, 6) - NPCInfo->stats.aggression) { - TIMER_Set(NPC, "attackDelay", Q_irand(1000, 3000)); //single punches only, don't try again for a while + TIMER_Set(NPC, "parryTime", 4000); //single punches only, don't try again for a while } } - } - } - else { - return qfalse; - } - + else + { + //no delays or anything, punch normally + } + } + } + } + else { //no punching + return qfalse; } + if ( !(ucmd.buttons&BUTTON_ATTACK) && !(ucmd.buttons&BUTTON_ALT_ATTACK) @@ -6737,8 +6761,10 @@ qboolean Jedi_CheckKataAttack( void ) if ( Q_irand( 0, g_spskill->integer+1 ) //50% chance on easy, 66% on medium, 75% on hard && !Q_irand( 0, 9 ) )//10% chance overall {//base on skill level - if ( enemy_in_range || (enemy_near && enemy_approaching) ) //need to actually be close to the enemy - { + if ( enemy_in_range //enemy is in saber range + || (enemy_near && enemy_approaching) //is moving into range + || (NPC->client->NPC_class == CLASS_REBORN && !enemy_near && !enemy_approaching && !enemy_in_range) ) + {//reborn like to show off a little... ucmd.upmove = 0; VectorClear( NPC->client->ps.moveDir ); if ( g_saberNewControlScheme->integer ) diff --git a/code/game/NPC_behavior.cpp b/code/game/NPC_behavior.cpp index a8ae9410a8..34122e23ff 100644 --- a/code/game/NPC_behavior.cpp +++ b/code/game/NPC_behavior.cpp @@ -1577,8 +1577,34 @@ void NPC_Surrender( void ) } } -extern int NPC_CheckMultipleEnemies(gentity_t *closestTo, int enemyTeam, qboolean checkVis); +qboolean NPC_CheckUseMelee(gentity_t* NPC, int relNumEnemies) +{ + int chance = relNumEnemies; + + if (NPC->health < 25 || (NPC->health < 0.25*NPC->max_health && NPC->enemy->client->ps.weapon == WP_SABER)) + { + chance -= 4; + } + + if (NPC->enemy->enemy && DistanceSquared(NPC->currentOrigin, NPC->enemy->currentOrigin) < 64 * 64) + {//enemy is close and distracted + chance++; + } + if (NPC->enemy->painDebounceTime < level.time - 3000) //enemy in pain + chance++; + if (NPC->enemy->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] < level.time - 1000) //enemy busy being attacked + chance++; + if (NPC->NPC->aiFlags&NPCAI_HEAVY_MELEE || NPC->client->NPC_class == CLASS_WOOKIEE) + chance++; + + chance += NPC->NPC->stats.aggression - 3; + + return chance; +} + +extern int NPC_CheckMultipleEnemies(gentity_t *closestTo, int enemyTeam, qboolean checkVis); +extern void WP_MeleeTime(gentity_t* meleer); qboolean NPC_CheckSurrender(qboolean noEscape = qfalse) { if (!g_AIsurrender->integer @@ -1608,8 +1634,7 @@ qboolean NPC_CheckSurrender(qboolean noEscape = qfalse) if (numEnemies == 1 && (NPC->enemy->s.weapon == WP_MELEE || NPC->enemy->s.weapon == WP_NONE)) {//maybe we should try to melee fight? Or at least don't officially surrender... just kind of stand there - //FIXME: If the enemy is attacking me with melee I should fight back or run... - return qfalse; + WP_MeleeTime(NPC); } if (noEscape) diff --git a/code/game/bg_pangles.cpp b/code/game/bg_pangles.cpp index 92a59ef96e..c61667be8f 100644 --- a/code/game/bg_pangles.cpp +++ b/code/game/bg_pangles.cpp @@ -729,9 +729,6 @@ qboolean PM_AdjustAnglesForSaberLock( gentity_t *ent, usercmd_t *ucmd ) return qfalse; } -extern qboolean NPC_JediClass(gentity_t *self); -extern qboolean NPC_JediClassBoss(gentity_t *self); -extern qboolean NPC_JediClassNonBoss(gentity_t *self); int G_MinGetUpTime( gentity_t *ent ) { if ( ent @@ -766,7 +763,7 @@ int G_MinGetUpTime( gentity_t *ent ) return getUpTime; } } - else if (ent->NPC && NPC_JediClass(ent)) + else if (ent->NPC && NPC_JediClass(ent->client->NPC_class)) {//you must have Jedi reflexes... int getUpTime = 250; if (ent->NPC->rank > RANK_ENSIGN) diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index 776787ced6..8cd058f98c 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -5406,7 +5406,7 @@ void PM_SetAnimFinal(int *torsoAnim, int *legsAnim, if (*torsoAnim == BOTH_MELEE1 || *torsoAnim == BOTH_MELEE2) {//non-heavy punches are faster FIXME: Give player heavy punch cheat? if (gent->s.number == 0 || !(gent->NPC->aiFlags&NPCAI_HEAVY_MELEE)) { - timeScaleMod *= 1.25; + timeScaleMod *= 1.5; } } @@ -5948,7 +5948,7 @@ void PM_TorsoAnimLightsaber() || pm->ps->legsAnim == BOTH_WALKBACK_DUAL) && pm->ps->saberBlockingTime < cg.time) {//running w/1-handed weapon uses full-body anim - PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL, 1000); } else { diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 6ca5d891c6..0e2529b7c4 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -11237,6 +11237,15 @@ qboolean PM_CheckAltKickAttack(void) return qfalse; } +qboolean PM_CheckAltKickAttackMelee(void) +{//only used by a melee npc for now + if (!PM_FlippingAnim(pm->ps->legsAnim) || pm->ps->legsAnimTimer <= 250) + { + return qtrue; + } + return qfalse; +} + qboolean PM_CheckUpsideDownAttack(void) { if (pm->ps->saberMove != LS_READY) @@ -13797,7 +13806,7 @@ static void PM_Weapon(void) int anim = -1; if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && !(g_debugMelee->integer < 0) ) - {//saber offense + {//player melee usage if ((pm->cmd.buttons&BUTTON_ALT_ATTACK)) { if ((pm->cmd.buttons&BUTTON_ATTACK) && pm->ps->forcePowerLevel[FP_SABER_OFFENSE] > 1 @@ -13828,8 +13837,18 @@ static void PM_Weapon(void) } } else - { - anim = PM_PickAnim(pm->gent, BOTH_MELEE1, BOTH_MELEE2); //is this even used? + {//NPC trying to punch or kick + if (pm->ps->saberMoveNext) //must be kicking... or doing something related to a kata??? + { + //if (!(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD)) + // { + PM_WeaponLightsaber(); //kind of an ugly hack, but hey, technically kicks are saber moves... + // } + } + else + { + anim = PM_PickAnim(pm->gent, BOTH_MELEE1, BOTH_MELEE2); //is this even used? + } } if (anim != -1) { diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index bca44d7304..e624a824a2 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -51,6 +51,7 @@ extern void WP_ForcePowersUpdate( gentity_t *self, usercmd_t *ucmd ); extern void WP_SaberBlockPointsRegenerate(gentity_t * self); extern void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd); extern void WP_CheckPlayerSaberEvents(gentity_t *self); +extern qboolean NPC_JediClass(int className); extern gentity_t *SeekerAcquiresTarget ( gentity_t *ent, vec3_t pos ); extern void FireSeeker( gentity_t *owner, gentity_t *target, vec3_t origin, vec3_t dir ); @@ -2943,7 +2944,7 @@ qboolean G_CheckClampUcmd( gentity_t *ent, usercmd_t *ucmd ) VectorClear( ent->client->ps.moveDir ); } overridAngles = PM_AdjustAnglesForGrapple( ent, ucmd )?qtrue:overridAngles; - //if ( g_debugMelee->integer ) + if ( g_debugMelee->integer > -1 ) {//actually do some damage during sequence int damage = 0; int dflags = (DAMAGE_NO_KNOCKBACK|DAMAGE_NO_ARMOR|DAMAGE_NO_KILL); @@ -5337,7 +5338,7 @@ extern cvar_t *g_skippingcin; { WP_SaberStartMissileBlockCheck(ent, ucmd); } - else if (ent->s.number) + else if (NPC_JediClass(ent->client->NPC_class) || !ent->s.number) {//we may be a non-saber force user Jedi_MeleeEvasionDefense(ent, ucmd); } From 9ad71374451a1a100d83fcad59bf9f089fcc7ea5 Mon Sep 17 00:00:00 2001 From: dusty22 Date: Mon, 19 Dec 2016 17:45:32 -0500 Subject: [PATCH 368/445] EXE stuff; last little bit related to g_handicap_maxArmor --- code/client/cl_main.cpp | 2 +- code/game/g_local.h | 2 +- code/qcommon/q_shared.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/client/cl_main.cpp b/code/client/cl_main.cpp index 95ab4c8c5e..621d25a58c 100644 --- a/code/client/cl_main.cpp +++ b/code/client/cl_main.cpp @@ -1072,7 +1072,7 @@ static CMiniHeap *GetG2VertSpaceServer( void ) { #ifdef JK2_MODE #define DEFAULT_RENDER_LIBRARY "rdjosp-vanilla" #else -#define DEFAULT_RENDER_LIBRARY "rdsp-vanilla" +#define DEFAULT_RENDER_LIBRARY "rdsp-vanilla-dp" #endif void CL_InitRef( void ) { diff --git a/code/game/g_local.h b/code/game/g_local.h index cf9131e431..c7bd3c784b 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -37,7 +37,7 @@ along with this program; if not, see . //================================================================== // the "gameversion" client command will print this plus compile date -#define GAMEVERSION "Dusty's Patch" +#define GAMEVERSION "OpenJK-DP" #define BODY_QUEUE_SIZE 8 diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index afa3f73ee6..0374a3ef04 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -77,7 +77,7 @@ along with this program; if not, see . #endif #define BASEGAME "base" -#define OPENJKGAME "Dusty's Patch" +#define OPENJKGAME "OpenJK-DP" #define Q3CONFIG_NAME PRODUCT_NAME ".cfg" From 7bd66c0b6a4d060b7a01d01a6a8441639330c2ca Mon Sep 17 00:00:00 2001 From: dusty22 Date: Mon, 19 Dec 2016 17:46:17 -0500 Subject: [PATCH 369/445] oops left out --- code/game/g_items.cpp | 8 ++++---- code/qcommon/q_shared.h | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/game/g_items.cpp b/code/game/g_items.cpp index 79daac206d..bc67a3b876 100644 --- a/code/game/g_items.cpp +++ b/code/game/g_items.cpp @@ -587,9 +587,9 @@ int ITM_AddArmor (gentity_t *ent, int count) ent->client->ps.stats[STAT_ARMOR] += count; - if (ent->client->ps.stats[STAT_ARMOR] > ent->client->ps.stats[STAT_MAX_HEALTH]) + if (ent->client->ps.stats[STAT_ARMOR] > g_handicap_maxArmor->integer) { - ent->client->ps.stats[STAT_ARMOR] = ent->client->ps.stats[STAT_MAX_HEALTH]; + ent->client->ps.stats[STAT_ARMOR] = g_handicap_maxArmor->integer; return qfalse; } @@ -603,8 +603,8 @@ int Pickup_Armor( gentity_t *ent, gentity_t *other ) { other->client->ps.powerups[PW_BATTLESUIT] = Q3_INFINITE; other->client->ps.stats[STAT_ARMOR] += ent->item->quantity; - if ( other->client->ps.stats[STAT_ARMOR] > other->client->ps.stats[STAT_MAX_HEALTH] ) { - other->client->ps.stats[STAT_ARMOR] = other->client->ps.stats[STAT_MAX_HEALTH]; + if ( other->client->ps.stats[STAT_ARMOR] > g_handicap_maxArmor->integer ) { + other->client->ps.stats[STAT_ARMOR] = g_handicap_maxArmor->integer; } return 30; diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 0374a3ef04..5b8b61e0cd 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -69,10 +69,10 @@ along with this program; if not, see . #else #define PRODUCT_NAME "dp_sp" -#define CLIENT_WINDOW_TITLE "Dusty's Patch" -#define CLIENT_CONSOLE_TITLE "DP Console" +#define CLIENT_WINDOW_TITLE "OpenJK (DP)" +#define CLIENT_CONSOLE_TITLE "OpenJK (DP) Console" #define HOMEPATH_NAME_UNIX "dp" -#define HOMEPATH_NAME_WIN "Dusty's Patch" +#define HOMEPATH_NAME_WIN "OpenJK-DP" #define HOMEPATH_NAME_MACOSX HOMEPATH_NAME_WIN #endif From bea6c175b1c6fa7fa79b1ca798744c9859834f05 Mon Sep 17 00:00:00 2001 From: dusty22 Date: Mon, 19 Dec 2016 18:27:46 -0500 Subject: [PATCH 370/445] compile fix --- code/game/bg_pangles.cpp | 1 + code/game/wp_saber.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/code/game/bg_pangles.cpp b/code/game/bg_pangles.cpp index c61667be8f..9a77781763 100644 --- a/code/game/bg_pangles.cpp +++ b/code/game/bg_pangles.cpp @@ -729,6 +729,7 @@ qboolean PM_AdjustAnglesForSaberLock( gentity_t *ent, usercmd_t *ucmd ) return qfalse; } +extern qboolean NPC_JediClass(int className); int G_MinGetUpTime( gentity_t *ent ) { if ( ent diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 2275fe4653..85d1022321 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -8992,6 +8992,7 @@ void WP_SaberBlockNonRandom(gentity_t *self, vec3_t hitloc, qboolean missileBloc } } +extern qboolean NPC_JediClass(int className); void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) { //allows melee force users to push/dodge explosives and saber throws which is normally tied to a saber block check From 6161dac1bfc40fdc8689431b5376250740651f5b Mon Sep 17 00:00:00 2001 From: Ensiform Date: Fri, 23 Dec 2016 18:18:47 -0600 Subject: [PATCH 371/445] Shared: Probable fix for Sys_QueEvent overflow spam Based off of diff found in https://github.com/ioquake/ioq3/issues/191 Direct link to diff at: https://github.com/ioquake/ioq3/files/378067/fix.txt What this does is merges mouse movements into a single queued event. The engine already handles deltas which allows this to work. See comment number 2 on the above ioq3 issue for more details. Refs jkanewmod/NewJK@f7cda44a1c07e4a2bad8f892f59226f10dc36a31 This is a better fix than just hiding the prints. --- shared/sys/sys_event.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/shared/sys/sys_event.cpp b/shared/sys/sys_event.cpp index 39dc5c5a1b..268a7727e2 100644 --- a/shared/sys/sys_event.cpp +++ b/shared/sys/sys_event.cpp @@ -91,6 +91,31 @@ void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptr static bool printedWarning = false; #endif + // try to combine all sequential mouse moves in one event + if ( type == SE_MOUSE ) + { + // get previous event from queue + ev = &eventQue[ ( eventHead + MASK_QUED_EVENTS - 1 ) & MASK_QUED_EVENTS ]; + if ( ev->evType == SE_MOUSE ) + { + if ( eventTail == eventHead && eventTail ) + { + ev->evValue = 0; + ev->evValue2 = 0; + eventTail--; + } + + if ( time == 0 ) + time = Sys_Milliseconds(); + + ev->evValue += value; + ev->evValue2 += value2; + ev->evTime = time; + + return; + } + } + ev = &eventQue[ eventHead & MASK_QUED_EVENTS ]; if ( eventHead - eventTail >= MAX_QUED_EVENTS ) { From 7613c10787fc9a3da2b5acd9a79f0ca7ec261312 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sat, 24 Dec 2016 17:09:09 -0600 Subject: [PATCH 372/445] Revert "Shared: Probable fix for Sys_QueEvent overflow spam" This reverts commit 6161dac1bfc40fdc8689431b5376250740651f5b. --- shared/sys/sys_event.cpp | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/shared/sys/sys_event.cpp b/shared/sys/sys_event.cpp index 268a7727e2..39dc5c5a1b 100644 --- a/shared/sys/sys_event.cpp +++ b/shared/sys/sys_event.cpp @@ -91,31 +91,6 @@ void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptr static bool printedWarning = false; #endif - // try to combine all sequential mouse moves in one event - if ( type == SE_MOUSE ) - { - // get previous event from queue - ev = &eventQue[ ( eventHead + MASK_QUED_EVENTS - 1 ) & MASK_QUED_EVENTS ]; - if ( ev->evType == SE_MOUSE ) - { - if ( eventTail == eventHead && eventTail ) - { - ev->evValue = 0; - ev->evValue2 = 0; - eventTail--; - } - - if ( time == 0 ) - time = Sys_Milliseconds(); - - ev->evValue += value; - ev->evValue2 += value2; - ev->evTime = time; - - return; - } - } - ev = &eventQue[ eventHead & MASK_QUED_EVENTS ]; if ( eventHead - eventTail >= MAX_QUED_EVENTS ) { From 7d35f8c153720797fe003f55ea3e3c054dd36c17 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sun, 18 Aug 2013 22:00:19 +0100 Subject: [PATCH 373/445] RGB Sabers merge old commits: basic work, cleanup, UI support, much better implementation, second saber UI support. fixed bug where 2nd saber didn't show colour correctly. Added "saberColorRGB" for .sab and .npc as well as saber2ColorRGB3 etc. The new parameter will override any equivalent values such as saber2Color3 so that a suitable colour can be set for base and also the "right" RGB colour --- code/cgame/cg_main.cpp | 3 + code/cgame/cg_media.h | 2 + code/cgame/cg_players.cpp | 21 +++++ code/cgame/cg_weapons.cpp | 2 + code/game/NPC_stats.cpp | 120 +++++++++++++++++++++++++-- code/game/g_items.cpp | 11 ++- code/game/wp_saberLoad.cpp | 166 +++++++++++++++++++++++++++++++++++-- code/qcommon/q_shared.h | 4 +- code/ui/ui_main.cpp | 61 +++++++++++++- code/ui/ui_saber.cpp | 66 +++++++++++++-- shared/qcommon/q_string.c | 65 ++++++++++++++- shared/qcommon/q_string.h | 2 + 12 files changed, 500 insertions(+), 23 deletions(-) diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index ef1ce0e825..c4bab971ff 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -459,6 +459,9 @@ static cvarTable_t cvarTable[] = { { &cg_fovViewmodelAdjust, "cg_fovViewmodelAdjust", "1", CVAR_ARCHIVE }, { &cg_scaleVehicleSensitivity, "cg_scaleVehicleSensitivity", "1", CVAR_ARCHIVE }, + + + }; static const size_t cvarTableSize = ARRAY_LEN( cvarTable ); diff --git a/code/cgame/cg_media.h b/code/cgame/cg_media.h index 6e045f3187..dcaa75a7a3 100644 --- a/code/cgame/cg_media.h +++ b/code/cgame/cg_media.h @@ -174,6 +174,8 @@ typedef struct { qhandle_t blueSaberCoreShader; qhandle_t purpleSaberGlowShader; qhandle_t purpleSaberCoreShader; + qhandle_t rgbSaberGlowShader; + qhandle_t rgbSaberCoreShader; qhandle_t explosionModel; qhandle_t surfaceExplosionShader; diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index 18d528f036..912df4af15 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -41,6 +41,7 @@ extern qboolean WP_SaberBladeUseSecondBladeStyle( saberInfo_t *saber, int bladeN extern void WP_SaberSwingSound( gentity_t *ent, int saberNum, swingType_t swingType ); extern vmCvar_t cg_debugHealthBars; + /* player entities generate a great deal of information from implicit ques @@ -5626,6 +5627,9 @@ static void CG_RGBForSaberColor( saber_colors_t color, vec3_t rgb ) case SABER_PURPLE: VectorSet( rgb, 0.9f, 0.2f, 1.0f ); break; + default://SABER_RGB + VectorSet( rgb, ((color) & 0xff)/255.0f, ((color >> 8) & 0xff)/255.0f, ((color >> 16) & 0xff)/255.0f ); + break; } } @@ -5785,6 +5789,10 @@ static void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax glow = cgs.media.purpleSaberGlowShader; blade = cgs.media.purpleSaberCoreShader; break; + default://SABER_RGB + glow = cgs.media.rgbSaberGlowShader; + blade = cgs.media.rgbSaberCoreShader; + break; } // always add a light because sabers cast a nice glow before they slice you in half!! or something... @@ -5825,6 +5833,13 @@ static void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax saber.customShader = glow; saber.shaderRGBA[0] = saber.shaderRGBA[1] = saber.shaderRGBA[2] = saber.shaderRGBA[3] = 0xff; saber.renderfx = rfx; + + if (color >= SABER_RGB) + { + saber.shaderRGBA[0] = ((color) & 0xff); + saber.shaderRGBA[1] = ((color >> 8) & 0xff); + saber.shaderRGBA[2] = ((color >> 16) & 0xff); + } cgi_R_AddRefEntityToScene( &saber ); @@ -6616,6 +6631,12 @@ Ghoul2 Insert End case SABER_PURPLE: VectorSet( rgb1, 220.0f, 0.0f, 255.0f ); break; + default://SABER_RGB + VectorSet( rgb1, ((client->ps.saber[saberNum].blade[bladeNum].color) & 0xff), + ((client->ps.saber[saberNum].blade[bladeNum].color >> 8) & 0xff), + ((client->ps.saber[saberNum].blade[bladeNum].color >> 16) & 0xff) ); + break; + } } diff --git a/code/cgame/cg_weapons.cpp b/code/cgame/cg_weapons.cpp index dc90ee497e..ea0ad9e6b0 100644 --- a/code/cgame/cg_weapons.cpp +++ b/code/cgame/cg_weapons.cpp @@ -361,6 +361,8 @@ void CG_RegisterWeapon( int weaponNum ) { cgs.media.blueSaberCoreShader = cgi_R_RegisterShader( "gfx/effects/sabers/blue_line" ); cgs.media.purpleSaberGlowShader = cgi_R_RegisterShader( "gfx/effects/sabers/purple_glow" ); cgs.media.purpleSaberCoreShader = cgi_R_RegisterShader( "gfx/effects/sabers/purple_line" ); + cgs.media.rgbSaberGlowShader = cgi_R_RegisterShader( "gfx/effects/sabers/rgb_glow" ); + cgs.media.rgbSaberCoreShader = cgi_R_RegisterShader( "gfx/effects/sabers/rgb_line" ); cgs.media.forceCoronaShader = cgi_R_RegisterShaderNoMip( "gfx/hud/force_swirl" ); diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index 1e3ea43cbb..37d739aadc 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -297,7 +297,14 @@ saber_colors_t TranslateSaberColor( const char *name ) { return ((saber_colors_t)(Q_irand( SABER_ORANGE, SABER_PURPLE ))); } - return SABER_BLUE; + float colors[3]; + Q_parseSaberColor(name, colors); + int colourArray[3]; + for (int i = 0; i < 3; i++) + { + colourArray[i] = (int)(colors[i] * 255); + } + return (saber_colors_t)((colourArray[0]) + (colourArray[1] << 8) + (colourArray[2] << 16) + (1 << 24)); } /* static int MethodNameToNumber( const char *name ) { @@ -1949,6 +1956,10 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) char surfOn[1024]={0}; qboolean parsingPlayer = qfalse; + + qboolean forcedRGBSaberColours[MAX_SABERS][MAX_BLADES] = {{qfalse, qfalse, qfalse, qfalse, qfalse, qfalse, qfalse, qfalse}, + {qfalse, qfalse, qfalse, qfalse, qfalse, qfalse, qfalse, qfalse}}; + strcpy(customSkin,"default"); if ( !NPCName || !NPCName[0]) { @@ -3693,7 +3704,10 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) saber_colors_t color = TranslateSaberColor( value ); for ( n = 0; n < MAX_BLADES; n++ ) { - NPC->client->ps.saber[0].blade[n].color = color; + if (!forcedRGBSaberColours[0][n]) + { + NPC->client->ps.saber[0].blade[n].color = color; + } } } else if (strlen(token)==11) @@ -3708,7 +3722,10 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { continue; } - NPC->client->ps.saber[0].blade[index].color = TranslateSaberColor( value ); + if (!forcedRGBSaberColours[0][index]) + { + NPC->client->ps.saber[0].blade[index].color = TranslateSaberColor( value ); + } } else { @@ -3734,7 +3751,10 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) saber_colors_t color = TranslateSaberColor( value ); for ( n = 0; n < MAX_BLADES; n++ ) { - NPC->client->ps.saber[1].blade[n].color = color; + if (!forcedRGBSaberColours[1][n]) + { + NPC->client->ps.saber[1].blade[n].color = color; + } } } else if (strlen(token)==12) @@ -3749,7 +3769,10 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { continue; } - NPC->client->ps.saber[1].blade[n].color = TranslateSaberColor( value ); + if (!forcedRGBSaberColours[1][n]) + { + NPC->client->ps.saber[1].blade[n].color = TranslateSaberColor( value ); + } } else { @@ -3757,7 +3780,92 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) } continue; } - + + // saberColor + if ( !Q_stricmpn( token, "saberColorRGB", 13) ) + { + if ( !NPC->client ) + { + continue; + } + + if (strlen(token)==13) + { + if ( COM_ParseString( &p, &value ) ) + { + continue; + } + saber_colors_t color = TranslateSaberColor( value ); + forcedRGBSaberColours[0][0] = qtrue; + for ( n = 0; n < MAX_BLADES; n++ ) + { + NPC->client->ps.saber[0].blade[n].color = color; + } + } + else if (strlen(token)==14) + { + int index = atoi(&token[13])-1; + if (index > 7 || index < 1 ) + { + gi.Printf( S_COLOR_YELLOW"WARNING: bad saberColorRGB '%s' in %s\n", token, NPCName ); + continue; + } + if ( COM_ParseString( &p, &value ) ) + { + continue; + } + forcedRGBSaberColours[0][index] = qtrue; + NPC->client->ps.saber[0].blade[index].color = TranslateSaberColor( value ); + } + else + { + gi.Printf( S_COLOR_YELLOW"WARNING: bad saberColorRGB '%s' in %s\n", token, NPCName ); + } + continue; + } + + + if ( !Q_stricmpn( token, "saber2ColorRGB", 14 ) ) + { + if ( !NPC->client ) + { + continue; + } + + if (strlen(token)==14) + { + if ( COM_ParseString( &p, &value ) ) + { + continue; + } + forcedRGBSaberColours[1][0] = qtrue; + saber_colors_t color = TranslateSaberColor( value ); + for ( n = 0; n < MAX_BLADES; n++ ) + { + NPC->client->ps.saber[1].blade[n].color = color; + } + } + else if (strlen(token)==15) + { + n = atoi(&token[14])-1; + if (n > 7 || n < 1 ) + { + gi.Printf( S_COLOR_YELLOW"WARNING: bad saber2ColorRGB '%s' in %s\n", token, NPCName ); + continue; + } + if ( COM_ParseString( &p, &value ) ) + { + continue; + } + forcedRGBSaberColours[1][n] = qtrue; + NPC->client->ps.saber[1].blade[n].color = TranslateSaberColor( value ); + } + else + { + gi.Printf( S_COLOR_YELLOW"WARNING: bad saber2ColorRGB '%s' in %s\n", token, NPCName ); + } + continue; + } //saber length if ( !Q_stricmpn( token, "saberLength", 11) ) diff --git a/code/game/g_items.cpp b/code/game/g_items.cpp index 96ecfb166f..35cde23c85 100644 --- a/code/game/g_items.cpp +++ b/code/game/g_items.cpp @@ -280,7 +280,16 @@ gentity_t *G_DropSaberItem( const char *saberType, saber_colors_t saberColor, ve newItem->spawnflags |= 64;/*ITMSF_NOGLOW*/ newItem->NPC_type = G_NewString( saberType );//saberType //FIXME: transfer per-blade color somehow? - newItem->NPC_targetname = (char *)saberColorStringForColor[saberColor]; + if (saberColor >= SABER_RGB) + { + char rgbColor[8]; + Com_sprintf(rgbColor, 8, "x%02x%02x%02x", saberColor & 0xff, (saberColor >> 8) & 0xff, (saberColor >> 16) & 0xff); + newItem->NPC_targetname = rgbColor; + } + else + { + newItem->NPC_targetname = (char *)saberColorStringForColor[saberColor]; + } newItem->count = 1; newItem->flags = FL_DROPPED_ITEM; G_SpawnItem( newItem, FindItemForWeapon( WP_SABER ) ); diff --git a/code/game/wp_saberLoad.cpp b/code/game/wp_saberLoad.cpp index c298d1d456..31ba5e1878 100644 --- a/code/game/wp_saberLoad.cpp +++ b/code/game/wp_saberLoad.cpp @@ -478,6 +478,8 @@ void WP_SaberSetDefaults( saberInfo_t *saber, qboolean setColors = qtrue ) //========================================================================================================================================= } +qboolean forcedRGBColours[MAX_BLADES]; + static void Saber_ParseName( saberInfo_t *saber, const char **p ) { const char *value; if ( COM_ParseString( p, &value ) ) @@ -551,7 +553,12 @@ static void Saber_ParseSaberColor( saberInfo_t *saber, const char **p ) { color = TranslateSaberColor( value ); for ( i=0; iblade[i].color = color; + { + if (!forcedRGBColours[i]) + { + saber->blade[i].color = color; + } + } } static void Saber_ParseSaberColor2( saberInfo_t *saber, const char **p ) { const char *value; @@ -566,7 +573,10 @@ static void Saber_ParseSaberColor2( saberInfo_t *saber, const char **p ) { return; color = TranslateSaberColor( value ); - saber->blade[1].color = color; + if (!forcedRGBColours[1]) + { + saber->blade[1].color = color; + } } static void Saber_ParseSaberColor3( saberInfo_t *saber, const char **p ) { const char *value; @@ -581,7 +591,10 @@ static void Saber_ParseSaberColor3( saberInfo_t *saber, const char **p ) { return; color = TranslateSaberColor( value ); - saber->blade[2].color = color; + if (!forcedRGBColours[2]) + { + saber->blade[2].color = color; + } } static void Saber_ParseSaberColor4( saberInfo_t *saber, const char **p ) { const char *value; @@ -596,7 +609,10 @@ static void Saber_ParseSaberColor4( saberInfo_t *saber, const char **p ) { return; color = TranslateSaberColor( value ); - saber->blade[3].color = color; + if (!forcedRGBColours[3]) + { + saber->blade[3].color = color; + } } static void Saber_ParseSaberColor5( saberInfo_t *saber, const char **p ) { const char *value; @@ -611,7 +627,10 @@ static void Saber_ParseSaberColor5( saberInfo_t *saber, const char **p ) { return; color = TranslateSaberColor( value ); - saber->blade[4].color = color; + if (!forcedRGBColours[4]) + { + saber->blade[4].color = color; + } } static void Saber_ParseSaberColor6( saberInfo_t *saber, const char **p ) { const char *value; @@ -626,7 +645,10 @@ static void Saber_ParseSaberColor6( saberInfo_t *saber, const char **p ) { return; color = TranslateSaberColor( value ); - saber->blade[5].color = color; + if (!forcedRGBColours[5]) + { + saber->blade[5].color = color; + } } static void Saber_ParseSaberColor7( saberInfo_t *saber, const char **p ) { const char *value; @@ -640,9 +662,129 @@ static void Saber_ParseSaberColor7( saberInfo_t *saber, const char **p ) { if ( !Saber_SetColor ) return; + color = TranslateSaberColor( value ); + if (!forcedRGBColours[6]) + { + saber->blade[6].color = color; + } +} +static void Saber_ParseSaberRGBColor( saberInfo_t *saber, const char **p ) { + const char *value; + int i=0; + saber_colors_t color; + + if ( COM_ParseString( p, &value ) ) + return; + + // don't actually want to set the colors + // read the color out anyway just to advance the *p pointer + if ( !Saber_SetColor ) + return; + + color = TranslateSaberColor( value ); + for ( i=0; iblade[i].color = color; + } + forcedRGBColours[0] = qtrue; +} +static void Saber_ParseSaberRGBColor2( saberInfo_t *saber, const char **p ) { + const char *value; + saber_colors_t color; + + if ( COM_ParseString( p, &value ) ) + return; + + // don't actually want to set the colors + // read the color out anyway just to advance the *p pointer + if ( !Saber_SetColor ) + return; + + color = TranslateSaberColor( value ); + saber->blade[1].color = color; + forcedRGBColours[1] = qtrue; +} +static void Saber_ParseSaberRGBColor3( saberInfo_t *saber, const char **p ) { + const char *value; + saber_colors_t color; + + if ( COM_ParseString( p, &value ) ) + return; + + // don't actually want to set the colors + // read the color out anyway just to advance the *p pointer + if ( !Saber_SetColor ) + return; + + color = TranslateSaberColor( value ); + saber->blade[2].color = color; + forcedRGBColours[2] = qtrue; +} +static void Saber_ParseSaberRGBColor4( saberInfo_t *saber, const char **p ) { + const char *value; + saber_colors_t color; + + if ( COM_ParseString( p, &value ) ) + return; + + // don't actually want to set the colors + // read the color out anyway just to advance the *p pointer + if ( !Saber_SetColor ) + return; + + color = TranslateSaberColor( value ); + saber->blade[3].color = color; + forcedRGBColours[3] = qtrue; +} +static void Saber_ParseSaberRGBColor5( saberInfo_t *saber, const char **p ) { + const char *value; + saber_colors_t color; + + if ( COM_ParseString( p, &value ) ) + return; + + // don't actually want to set the colors + // read the color out anyway just to advance the *p pointer + if ( !Saber_SetColor ) + return; + + color = TranslateSaberColor( value ); + saber->blade[4].color = color; + forcedRGBColours[4] = qtrue; +} +static void Saber_ParseSaberRGBColor6( saberInfo_t *saber, const char **p ) { + const char *value; + saber_colors_t color; + + if ( COM_ParseString( p, &value ) ) + return; + + // don't actually want to set the colors + // read the color out anyway just to advance the *p pointer + if ( !Saber_SetColor ) + return; + + color = TranslateSaberColor( value ); + saber->blade[5].color = color; + forcedRGBColours[5] = qtrue; +} +static void Saber_ParseSaberRGBColor7( saberInfo_t *saber, const char **p ) { + const char *value; + saber_colors_t color; + + if ( COM_ParseString( p, &value ) ) + return; + + // don't actually want to set the colors + // read the color out anyway just to advance the *p pointer + if ( !Saber_SetColor ) + return; + color = TranslateSaberColor( value ); saber->blade[6].color = color; + forcedRGBColours[6] = qtrue; } + static void Saber_ParseSaberLength( saberInfo_t *saber, const char **p ) { int i=0; float f; @@ -1835,6 +1977,13 @@ static keywordHash_t saberParseKeywords[] = { { "saberColor5", Saber_ParseSaberColor5, NULL }, { "saberColor6", Saber_ParseSaberColor6, NULL }, { "saberColor7", Saber_ParseSaberColor7, NULL }, + { "saberColorRGB", Saber_ParseSaberRGBColor, NULL }, + { "saberColorRGB2", Saber_ParseSaberRGBColor2, NULL }, + { "saberColorRGB3", Saber_ParseSaberRGBColor3, NULL }, + { "saberColorRGB4", Saber_ParseSaberRGBColor4, NULL }, + { "saberColorRGB5", Saber_ParseSaberRGBColor5, NULL }, + { "saberColorRGB6", Saber_ParseSaberRGBColor6, NULL }, + { "saberColorRGB7", Saber_ParseSaberRGBColor7, NULL }, { "saberLength", Saber_ParseSaberLength, NULL }, { "saberLength2", Saber_ParseSaberLength2, NULL }, { "saberLength3", Saber_ParseSaberLength3, NULL }, @@ -1991,6 +2140,11 @@ qboolean WP_SaberParseParms( const char *SaberName, saberInfo_t *saber, qboolean const char *token; const char *p; keywordHash_t *key; + + for ( int i = 0; i < MAX_BLADES; i++ ) + { + forcedRGBColours[i] = qfalse; + } // make sure the hash table has been setup if ( !hashSetup ) diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 2bd355d5d0..a6dc5c2d3d 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -328,8 +328,8 @@ typedef enum SABER_YELLOW, SABER_GREEN, SABER_BLUE, - SABER_PURPLE - + SABER_PURPLE, + SABER_RGB = (1 << 24) } saber_colors_t; #define MAX_BATTERIES 2500 diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 2fd0aae54f..85c2ebfe32 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -381,7 +381,15 @@ vmCvar_t ui_char_color_green; vmCvar_t ui_char_color_blue; vmCvar_t ui_PrecacheModels; -static cvarTable_t cvarTable[] = +vmCvar_t ui_rgb_saber_red; +vmCvar_t ui_rgb_saber_green; +vmCvar_t ui_rgb_saber_blue; + +vmCvar_t ui_rgb_saber2_red; +vmCvar_t ui_rgb_saber2_green; +vmCvar_t ui_rgb_saber2_blue; + +static cvarTable_t cvarTable[] = { { &ui_menuFiles, "ui_menuFiles", "ui/menus.txt", CVAR_ARCHIVE }, #ifdef JK2_MODE @@ -408,6 +416,13 @@ static cvarTable_t cvarTable[] = { &ui_char_color_blue, "ui_char_color_blue", "", 0}, { &ui_PrecacheModels, "ui_PrecacheModels", "1", CVAR_ARCHIVE}, + + { &ui_rgb_saber_red, "ui_rgb_saber_red", "", 0}, + { &ui_rgb_saber_blue, "ui_rgb_saber_blue", "", 0}, + { &ui_rgb_saber_green, "ui_rgb_saber_green", "", 0}, + { &ui_rgb_saber2_red, "ui_rgb_saber2_red", "", 0}, + { &ui_rgb_saber2_blue, "ui_rgb_saber2_blue", "", 0}, + { &ui_rgb_saber2_green, "ui_rgb_saber2_green", "", 0}, }; #define FP_UPDATED_NONE -1 @@ -4290,6 +4305,8 @@ static void UI_GetCharacterCvars ( void ) } } +extern saber_colors_t TranslateSaberColor( const char *name ); + static void UI_UpdateSaberCvars ( void ) { Cvar_Set ( "g_saber_type", Cvar_VariableString ( "ui_saber_type" ) ); @@ -4297,6 +4314,25 @@ static void UI_UpdateSaberCvars ( void ) Cvar_Set ( "g_saber2", Cvar_VariableString ( "ui_saber2" ) ); Cvar_Set ( "g_saber_color", Cvar_VariableString ( "ui_saber_color" ) ); Cvar_Set ( "g_saber2_color", Cvar_VariableString ( "ui_saber2_color" ) ); + + if (TranslateSaberColor(Cvar_VariableString("ui_saber_color")) >= SABER_RGB) + { + char rgbColor[8]; + Com_sprintf(rgbColor, 8, "x%02x%02x%02x", Cvar_VariableIntegerValue("ui_rgb_saber_red"), + (Cvar_VariableIntegerValue("ui_rgb_saber_green")), + (Cvar_VariableIntegerValue("ui_rgb_saber_blue"))); + Cvar_Set( "g_saber_color", rgbColor ); + } + + if (TranslateSaberColor(Cvar_VariableString("ui_saber2_color")) >= SABER_RGB) + { + char rgbColor[8]; + Com_sprintf(rgbColor, 8, "x%02x%02x%02x", Cvar_VariableIntegerValue("ui_rgb_saber2_red"), + (Cvar_VariableIntegerValue("ui_rgb_saber2_green")), + (Cvar_VariableIntegerValue("ui_rgb_saber2_blue"))); + Cvar_Set( "g_saber2_color", rgbColor ); + } + } #ifndef JK2_MODE @@ -6120,7 +6156,28 @@ static void UI_GetSaberCvars ( void ) Cvar_Set ( "ui_saber2", Cvar_VariableString ( "g_saber2" ) ); Cvar_Set ( "ui_saber_color", Cvar_VariableString ( "g_saber_color" ) ); Cvar_Set ( "ui_saber2_color", Cvar_VariableString ( "g_saber2_color" ) ); - + Cvar_Set ( "ui_saber2_color", Cvar_VariableString ( "g_saber2_color" ) ); + + saber_colors_t saberColour = TranslateSaberColor(Cvar_VariableString( "ui_saber_color" )); + + if (saberColour >= SABER_RGB) + { + + Cvar_SetValue ( "ui_rgb_saber_red", (saberColour & 0xff) ); + Cvar_SetValue ( "ui_rgb_saber_green", ((saberColour >> 8) & 0xff) ); + Cvar_SetValue ( "ui_rgb_saber_blue", ((saberColour >> 16) & 0xff) ); + } + + saber_colors_t saber2Colour = TranslateSaberColor(Cvar_VariableString( "ui_saber2_color" )); + + if (saber2Colour >= SABER_RGB) + { + + Cvar_SetValue ( "ui_rgb_saber2_red", (saber2Colour & 0xff) ); + Cvar_SetValue ( "ui_rgb_saber2_green", ((saber2Colour >> 8) & 0xff) ); + Cvar_SetValue ( "ui_rgb_saber2_blue", ((saber2Colour >> 16) & 0xff) ); + } + Cvar_Set ( "ui_newfightingstyle", "0"); } diff --git a/code/ui/ui_saber.cpp b/code/ui/ui_saber.cpp index 9da09ca3cb..cda324878b 100644 --- a/code/ui/ui_saber.cpp +++ b/code/ui/ui_saber.cpp @@ -39,6 +39,13 @@ USER INTERFACE SABER LOADING & DISPLAY CODE char SaberParms[MAX_SABER_DATA_SIZE]; qboolean ui_saber_parms_parsed = qfalse; +extern vmCvar_t ui_rgb_saber_red; +extern vmCvar_t ui_rgb_saber_green; +extern vmCvar_t ui_rgb_saber_blue; +extern vmCvar_t ui_rgb_saber2_red; +extern vmCvar_t ui_rgb_saber2_green; +extern vmCvar_t ui_rgb_saber2_blue; + static qhandle_t redSaberGlowShader; static qhandle_t redSaberCoreShader; static qhandle_t orangeSaberGlowShader; @@ -51,6 +58,8 @@ static qhandle_t blueSaberGlowShader; static qhandle_t blueSaberCoreShader; static qhandle_t purpleSaberGlowShader; static qhandle_t purpleSaberCoreShader; +static qhandle_t rgbSaberGlowShader; +static qhandle_t rgbSaberCoreShader; void UI_CacheSaberGlowGraphics( void ) {//FIXME: these get fucked by vid_restarts redSaberGlowShader = re.RegisterShader( "gfx/effects/sabers/red_glow" ); @@ -65,6 +74,8 @@ void UI_CacheSaberGlowGraphics( void ) blueSaberCoreShader = re.RegisterShader( "gfx/effects/sabers/blue_line" ); purpleSaberGlowShader = re.RegisterShader( "gfx/effects/sabers/purple_glow" ); purpleSaberCoreShader = re.RegisterShader( "gfx/effects/sabers/purple_line" ); + rgbSaberGlowShader = re.RegisterShader( "gfx/effects/sabers/rgb_glow" ); + rgbSaberCoreShader = re.RegisterShader( "gfx/effects/sabers/rgb_line" ); } qboolean UI_ParseLiteral( const char **data, const char *string ) @@ -338,7 +349,7 @@ void UI_SaberLoadParms( void ) } } -void UI_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float radius, saber_colors_t color ) +void UI_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float radius, saber_colors_t color, int whichSaber ) { vec3_t mid, rgb={1,1,1}; qhandle_t blade = 0, glow = 0; @@ -386,6 +397,18 @@ void UI_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float blade = purpleSaberCoreShader; VectorSet( rgb, 0.9f, 0.2f, 1.0f ); break; + default: + glow = rgbSaberGlowShader; + blade = rgbSaberCoreShader; + if (whichSaber == 0) + { + VectorSet( rgb, ui_rgb_saber_red.integer/255.0f, ui_rgb_saber_green.integer/255.0f, ui_rgb_saber_blue.integer/255.0f ); + } + else + { + VectorSet( rgb, ui_rgb_saber2_red.integer/255.0f, ui_rgb_saber2_green.integer/255.0f, ui_rgb_saber2_blue.integer/255.0f ); + } + break; } // always add a light because sabers cast a nice glow before they slice you in half!! or something... @@ -426,6 +449,22 @@ void UI_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float saber.customShader = glow; saber.shaderRGBA[0] = saber.shaderRGBA[1] = saber.shaderRGBA[2] = saber.shaderRGBA[3] = 0xff; //saber.renderfx = rfx; + + if (color >= SABER_RGB) + { + if (whichSaber == 0) + { + saber.shaderRGBA[0] = ui_rgb_saber_red.integer; + saber.shaderRGBA[1] = ui_rgb_saber_green.integer; + saber.shaderRGBA[2] = ui_rgb_saber_blue.integer; + } + else + { + saber.shaderRGBA[0] = ui_rgb_saber2_red.integer; + saber.shaderRGBA[1] = ui_rgb_saber2_green.integer; + saber.shaderRGBA[2] = ui_rgb_saber2_blue.integer; + } + } DC->addRefEntityToScene( &saber ); @@ -471,7 +510,14 @@ saber_colors_t TranslateSaberColor( const char *name ) { return ((saber_colors_t)(Q_irand( SABER_ORANGE, SABER_PURPLE ))); } - return SABER_BLUE; + float colors[3]; + Q_parseSaberColor(name, colors); + int colourArray[3]; + for (int i = 0; i < 3; i++) + { + colourArray[i] = (int)(colors[i] * 255); + } + return (saber_colors_t)((colourArray[0]) + (colourArray[1] << 8) + (colourArray[2] << 16) + (1 << 24)); } saberType_t TranslateSaberType( const char *name ) @@ -531,7 +577,8 @@ void UI_SaberDrawBlade( itemDef_t *item, char *saberName, int saberModel, saberT { char bladeColorString[MAX_QPATH]; vec3_t angles={0}; - + int whichSaber = 0; + if ( item->flags&(ITF_ISANYSABER) && item->flags&(ITF_ISCHARACTER) ) { //it's bolted to a dude! angles[YAW] = curYaw; @@ -549,9 +596,18 @@ void UI_SaberDrawBlade( itemDef_t *item, char *saberName, int saberModel, saberT if ( (item->flags&ITF_ISSABER) && saberModel < 2 ) { - DC->getCVarString( "ui_saber_color", bladeColorString, sizeof(bladeColorString) ); + whichSaber = 0; } else//if ( item->flags&ITF_ISSABER2 ) - presumed + { + whichSaber = 1; + } + + if ( whichSaber == 0 ) + { + DC->getCVarString( "ui_saber_color", bladeColorString, sizeof(bladeColorString) ); + } + else//if ( whichSaber == 1 ) - presumed { DC->getCVarString( "ui_saber2_color", bladeColorString, sizeof(bladeColorString) ); } @@ -750,7 +806,7 @@ void UI_SaberDrawBlade( itemDef_t *item, char *saberName, int saberModel, saberT return; } - UI_DoSaber( bladeOrigin, axis[0], bladeLength, bladeLength, bladeRadius, bladeColor ); + UI_DoSaber( bladeOrigin, axis[0], bladeLength, bladeLength, bladeRadius, bladeColor, whichSaber ); } extern qboolean ItemParse_asset_model_go( itemDef_t *item, const char *name ); diff --git a/shared/qcommon/q_string.c b/shared/qcommon/q_string.c index a936fe2864..7edb0f6e38 100644 --- a/shared/qcommon/q_string.c +++ b/shared/qcommon/q_string.c @@ -432,4 +432,67 @@ int Q_vsnprintf(char *str, size_t size, const char *format, va_list ap) return retval; } -#endif \ No newline at end of file +#endif + +//ent's colour parsing +//Can either parse xAABBCC hex or associate letter to colour +int Q_parseSaberColor( const char *p, float *color ) { + char c = *p++; + if ( ( c >= 'a' && c < 'u') || (c >= 'A' && c < 'U') ) { + int deg; + float angle, v; + if (!color) + return 1; + deg = (((c|32) - 'a') * 360) / 24; + angle = (DEG2RAD(deg % 120)); + v = ((cos(angle) / cos((M_PI / 3) - angle)) + 1) / 3; + if ( deg <= 120) { + color[0] = v; + color[1] = 1-v; + color[2] = 0; + } else if ( deg <= 240) { + color[0] = 0; + color[1] = v; + color[2] = 1-v; + } else { + color[0] = 1-v; + color[1] = 0; + color[2] = v; + } + return 1; + } else if ( c == 'u' || c == 'U' || c == 'v' || c == 'V' + || c == 'w' || c == 'W' || c == 'x' || c == 'X' + || c == 'y' || c == 'Y' || c == 'z' || c == 'Z') { + int i; + int val; + for (i = 0;i<6;i++) { + int readHex; + c = p[i]; + if ( c >= '0' && c<= '9') { + readHex = c - '0'; + } else if ( c >= 'a' && c<= 'f') { + readHex = 0xa + c - 'a'; + } else if ( c >= 'A' && c<= 'F') { + readHex = 0xa + c - 'A'; + } else { + if (color) { + color[0] = color[1] = color[2] = 1.0f; + } + return 1; + } + if (!color) + continue; + if ( i & 1) { + val|= readHex; + color[i >> 1] = val * (1 / 255.0f); + } else { + val = readHex << 4; + } + } + return 7; + } + if (color) { + color[0] = color[1] = color[2] = 1.0f; + } + return 0; +} diff --git a/shared/qcommon/q_string.h b/shared/qcommon/q_string.h index 5228e80299..e4c967245b 100644 --- a/shared/qcommon/q_string.h +++ b/shared/qcommon/q_string.h @@ -46,6 +46,8 @@ void Q_strstrip( char *string, const char *strip, const char *repl ); #else // not using MSVC #define Q_vsnprintf vsnprintf #endif + +int Q_parseSaberColor( const char *p, float *color ); #if defined(__cplusplus) } // extern "C" From c64a1678ba80839b4ae26e283d6d72637e8f484f Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sat, 7 Jan 2017 15:00:43 +0000 Subject: [PATCH 374/445] SFX Sabers merge of commits, including fixes. glow/core size cvars added. --- code/cgame/cg_main.cpp | 13 +- code/cgame/cg_media.h | 5 + code/cgame/cg_players.cpp | 577 +++++++++++++++++++++++++++++++++++++- code/qcommon/q_shared.h | 4 +- 4 files changed, 584 insertions(+), 15 deletions(-) diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index c4bab971ff..4f8be101b1 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -341,6 +341,10 @@ vmCvar_t cg_fovViewmodelAdjust; vmCvar_t cg_scaleVehicleSensitivity; +vmCvar_t cg_SFXSabers; +vmCvar_t cg_SFXSabersGlowSize; +vmCvar_t cg_SFXSabersCoreSize; + typedef struct { vmCvar_t *vmCvar; const char *cvarName; @@ -460,6 +464,9 @@ static cvarTable_t cvarTable[] = { { &cg_scaleVehicleSensitivity, "cg_scaleVehicleSensitivity", "1", CVAR_ARCHIVE }, + { &cg_SFXSabers, "cg_SFXSabers", "0", CVAR_ARCHIVE }, + { &cg_SFXSabersGlowSize, "cg_SFXSabersGlowSize", "1.0", CVAR_ARCHIVE }, + { &cg_SFXSabersCoreSize, "cg_SFXSabersCoreSize", "1.0", CVAR_ARCHIVE }, }; @@ -1387,7 +1394,11 @@ static void CG_RegisterGraphics( void ) { //gore decal shaders -rww cgs.media.bdecal_burnmark1 = cgi_R_RegisterShader( "gfx/damage/burnmark1" ); cgs.media.bdecal_saberglowmark = cgi_R_RegisterShader( "gfx/damage/saberglowmark" ); - + + cgs.media.SaberTrailShader = cgi_R_RegisterShader( "SFX_Sabers/saber_trail" ); + cgs.media.SaberBladeShader = cgi_R_RegisterShader( "SFX_Sabers/saber_blade" ); + cgs.media.SaberEndShader = cgi_R_RegisterShader( "SFX_Sabers/saber_end" ); + cg.loadLCARSStage = 5; CG_LoadingString( "game media models" ); diff --git a/code/cgame/cg_media.h b/code/cgame/cg_media.h index dcaa75a7a3..afedec1fb0 100644 --- a/code/cgame/cg_media.h +++ b/code/cgame/cg_media.h @@ -259,6 +259,11 @@ typedef struct { qhandle_t forceShell; qhandle_t sightShell; qhandle_t drainShader; + + //SFX Sabers + qhandle_t SaberTrailShader; + qhandle_t SaberBladeShader; + qhandle_t SaberEndShader; // sounds sfxHandle_t disintegrateSound; diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index 912df4af15..831d0bcebd 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -42,6 +42,10 @@ extern void WP_SaberSwingSound( gentity_t *ent, int saberNum, swingType_t swingT extern vmCvar_t cg_debugHealthBars; +extern vmCvar_t cg_SFXSabers; +extern vmCvar_t cg_SFXSabersGlowSize; +extern vmCvar_t cg_SFXSabersCoreSize; + /* player entities generate a great deal of information from implicit ques @@ -5747,6 +5751,375 @@ static void CG_DoSaberLight( saberInfo_t *saber ) } } +void CG_DoSFXSaber( vec3_t blade_muz, vec3_t blade_tip, vec3_t trail_tip, vec3_t trail_muz, float lengthMax, float radius, saber_colors_t color, int rfx, qboolean doLight ) +{ + vec3_t dif, mid, blade_dir, end_dir, trail_dir, base_dir; + float radiusmult, effectradius, coreradius, effectalpha, AngleScale; + float blade_len, end_len, trail_len, base_len, DisTip, DisMuz, DisDif; + float glowscale = 0.5; + float v1, v2, len; + + qhandle_t glow = 0; + refEntity_t saber; + + VectorSubtract( blade_tip, blade_muz, blade_dir ); + VectorSubtract( trail_tip, trail_muz, trail_dir ); + blade_len = VectorLength(blade_dir); + trail_len = VectorLength(trail_dir); + VectorNormalize(blade_dir); + VectorNormalize(trail_dir); + + if ( blade_len < MIN_SABERBLADE_DRAW_LENGTH ) + { + return; + } + + VectorSubtract( trail_tip, blade_tip, end_dir ); + VectorSubtract( trail_muz, blade_muz, base_dir ); + end_len = VectorLength(end_dir); + base_len = VectorLength(base_dir); + VectorNormalize(end_dir); + VectorNormalize(base_dir); + + switch( color ) + { + case SABER_RED: + glow = cgs.media.redSaberGlowShader; + break; + case SABER_ORANGE: + glow = cgs.media.orangeSaberGlowShader; + break; + case SABER_YELLOW: + glow = cgs.media.yellowSaberGlowShader; + break; + case SABER_GREEN: + glow = cgs.media.greenSaberGlowShader; + break; + case SABER_PURPLE: + glow = cgs.media.purpleSaberGlowShader; + break; + case SABER_BLUE: + glow = cgs.media.blueSaberGlowShader; + break; + default://SABER_RGB + glow = cgs.media.rgbSaberGlowShader; + break; + } + + VectorMA( blade_muz, blade_len * 0.5f, blade_dir, mid ); + + if (doLight) + { + vec3_t rgb={1,1,1}; + CG_RGBForSaberColor( color, rgb ); + VectorScale( rgb, 0.66f, rgb ); + cgi_R_AddLightToScene( mid, (blade_len*2.0f) + (random()*10.0f), rgb[0], rgb[1], rgb[2] ); + } + + //Distance Scale + { + VectorSubtract( mid, cg.refdef.vieworg, dif ); + len = VectorLength( dif ); + if ( len > 4000 ) + { + len = 4000; + } + else if ( len < 1 ) + { + len = 1; + } + + v1 = ((len+400) / 400); + v2 = ((len+4000) / 4000); + + if(end_len > 1 || base_len > 1) + { + if(end_len > base_len) + glowscale = (end_len+4)*0.1; + else + glowscale = (base_len+4)*0.1; + + if(glowscale > 1.0) + glowscale = 1.0; + } + effectalpha = glowscale; + } + + //Angle Scale + { + VectorSubtract( blade_tip, cg.refdef.vieworg, dif ); + DisTip = VectorLength( dif ); + + VectorSubtract( blade_muz, cg.refdef.vieworg, dif ); + DisMuz = VectorLength( dif ); + + if(DisTip > DisMuz) + { + DisDif = DisTip - DisMuz; + } + else if(DisTip < DisMuz) + { + DisDif = DisMuz - DisTip; + } + else + { + DisDif = 0; + } + + AngleScale = 1.2 - (DisDif/blade_len)*(DisDif/blade_len); + + if(AngleScale > 1.0) + AngleScale = 1.0; + if(AngleScale < 0.2) + AngleScale = 0.2; + + effectalpha *= AngleScale; + + AngleScale += 0.3; + + if(AngleScale > 1.0) + AngleScale = 1.0; + if(AngleScale < 0.4) + AngleScale = 0.4; + } + + memset( &saber, 0, sizeof( refEntity_t )); + + if (blade_len < lengthMax) + { + radiusmult = 0.5 + ((blade_len / lengthMax)/2); + } + else + { + radiusmult = 1.0; + } + + effectradius = ((radius * 1.6 * v1) + Q_flrand(-1.0f, 1.0f) * 0.1f)*radiusmult*cg_SFXSabersGlowSize.value; + coreradius = ((radius * 0.4 * v2) + Q_flrand(-1.0f, 1.0f) * 0.1f)*radiusmult*cg_SFXSabersCoreSize.value; + + { + saber.renderfx = rfx; + if(blade_len-((effectradius*AngleScale)/2) > 0) + { + saber.radius = effectradius*AngleScale; + saber.saberLength = (blade_len - (saber.radius/2)); + VectorCopy( blade_muz, saber.origin ); + VectorCopy( blade_dir, saber.axis[0] ); + saber.reType = RT_SABER_GLOW; + saber.customShader = glow; + saber.shaderRGBA[0] = 0xff * effectalpha; + saber.shaderRGBA[1] = 0xff * effectalpha; + saber.shaderRGBA[2] = 0xff * effectalpha; + saber.shaderRGBA[3] = 0xff * effectalpha; + + if (color >= SABER_RGB) + { + saber.shaderRGBA[0] = ((color) & 0xff) * effectalpha; + saber.shaderRGBA[1] = ((color >> 8) & 0xff) * effectalpha; + saber.shaderRGBA[2] = ((color >> 16) & 0xff) * effectalpha; + } + + cgi_R_AddRefEntityToScene( &saber ); + } + + // Do the hot core + VectorMA( blade_muz, blade_len, blade_dir, saber.origin ); + VectorMA( blade_muz, -1, blade_dir, saber.oldorigin ); + + saber.customShader = cgs.media.SaberBladeShader; + saber.reType = RT_LINE; + + saber.radius = coreradius; + + saber.shaderTexCoord[0] = saber.shaderTexCoord[1] = 1.0f; + saber.shaderRGBA[0] = saber.shaderRGBA[1] = saber.shaderRGBA[2] = saber.shaderRGBA[3] = 0xff; + + cgi_R_AddRefEntityToScene( &saber ); + } + + { + saber.renderfx = rfx; + if(trail_len-((effectradius*AngleScale)/2) > 0) + { + saber.radius = effectradius*AngleScale; + saber.saberLength = (trail_len - (saber.radius/2)); + VectorCopy( trail_muz, saber.origin ); + VectorCopy( trail_dir, saber.axis[0] ); + saber.reType = RT_SABER_GLOW; + saber.customShader = glow; + saber.shaderRGBA[0] = 0xff * effectalpha; + saber.shaderRGBA[1] = 0xff * effectalpha; + saber.shaderRGBA[2] = 0xff * effectalpha; + saber.shaderRGBA[3] = 0xff * effectalpha; + + if (color >= SABER_RGB) + { + saber.shaderRGBA[0] = ((color) & 0xff) * effectalpha; + saber.shaderRGBA[1] = ((color >> 8) & 0xff) * effectalpha; + saber.shaderRGBA[2] = ((color >> 16) & 0xff) * effectalpha; + } + + cgi_R_AddRefEntityToScene( &saber ); + } + + // Do the hot core + VectorMA( trail_muz, trail_len, trail_dir, saber.origin ); + VectorMA( trail_muz, -1, trail_dir, saber.oldorigin ); + + saber.customShader = cgs.media.SaberBladeShader; + saber.reType = RT_LINE; + + saber.radius = coreradius; + + saber.shaderTexCoord[0] = saber.shaderTexCoord[1] = 1.0f; + saber.shaderRGBA[0] = saber.shaderRGBA[1] = saber.shaderRGBA[2] = saber.shaderRGBA[3] = 0xff; + + cgi_R_AddRefEntityToScene( &saber ); + } + + VectorMA( blade_muz, blade_len - 0.5, blade_dir, blade_tip ); + VectorMA( trail_muz, trail_len - 0.5, trail_dir, trail_tip ); + + if(base_len > 2) + { + saber.renderfx = rfx; + if(base_len-(effectradius*AngleScale) > 0) + { + saber.radius = effectradius*AngleScale; + saber.saberLength = (base_len - (effectradius*AngleScale)); + VectorMA( blade_muz, ((effectradius*AngleScale)/2), base_dir, saber.origin ); + VectorCopy( base_dir, saber.axis[0] ); + saber.reType = RT_SABER_GLOW; + saber.customShader = glow; + saber.shaderRGBA[0] = 0xff * effectalpha; + saber.shaderRGBA[1] = 0xff * effectalpha; + saber.shaderRGBA[2] = 0xff * effectalpha; + saber.shaderRGBA[3] = 0xff * effectalpha; + + if (color >= SABER_RGB) + { + saber.shaderRGBA[0] = ((color) & 0xff) * effectalpha; + saber.shaderRGBA[1] = ((color >> 8) & 0xff) * effectalpha; + saber.shaderRGBA[2] = ((color >> 16) & 0xff) * effectalpha; + } + + cgi_R_AddRefEntityToScene( &saber ); + } + + // Do the hot core + VectorMA( blade_muz, base_len, base_dir, saber.origin ); + VectorMA( blade_muz, -0.1, base_dir, saber.oldorigin ); + + saber.customShader = cgs.media.SaberBladeShader; + saber.reType = RT_LINE; + + saber.radius = coreradius; + saber.saberLength = base_len; + + saber.shaderTexCoord[0] = saber.shaderTexCoord[1] = 1.0f; + saber.shaderRGBA[0] = saber.shaderRGBA[1] = saber.shaderRGBA[2] = saber.shaderRGBA[3] = 0xff; + + cgi_R_AddRefEntityToScene( &saber ); + } + + if(end_len > 1) + { + { + VectorSubtract( blade_tip, cg.refdef.vieworg, dif ); + DisTip = VectorLength( dif ); + + VectorSubtract( trail_tip, cg.refdef.vieworg, dif ); + DisMuz = VectorLength( dif ); + + if(DisTip > DisMuz) + { + DisDif = DisTip - DisMuz; + } + else if(DisTip < DisMuz) + { + DisDif = DisMuz - DisTip; + } + else + { + DisDif = 0; + } + + if(DisDif > end_len * 0.9) + { + effectalpha *= 0.3; + } + else if(DisDif > end_len * 0.8) + { + effectalpha *= 0.5; + } + else if(DisDif > end_len * 0.7) + { + effectalpha *= 0.7; + } + } + + + saber.renderfx = rfx; + if(end_len-(effectradius*AngleScale) > 0) + { + saber.radius = effectradius*AngleScale; + saber.saberLength = (end_len - (effectradius*AngleScale)); + VectorMA( blade_tip, ((effectradius*AngleScale)/2), end_dir, saber.origin ); + VectorCopy( end_dir, saber.axis[0] ); + saber.reType = RT_SABER_GLOW; + saber.customShader = glow; + saber.shaderRGBA[0] = 0xff * effectalpha; + saber.shaderRGBA[1] = 0xff * effectalpha; + saber.shaderRGBA[2] = 0xff * effectalpha; + saber.shaderRGBA[3] = 0xff * effectalpha; + + if (color >= SABER_RGB) + { + saber.shaderRGBA[0] = ((color) & 0xff) * effectalpha; + saber.shaderRGBA[1] = ((color >> 8) & 0xff) * effectalpha; + saber.shaderRGBA[2] = ((color >> 16) & 0xff) * effectalpha; + } + + cgi_R_AddRefEntityToScene( &saber ); + } + + // Do the hot core + VectorMA( blade_tip, end_len, end_dir, saber.origin ); + VectorMA( blade_tip, -0.1, end_dir, saber.oldorigin ); + + saber.customShader = cgs.media.SaberEndShader; + saber.reType = RT_LINE; + + if(end_len > 9) + { + AngleScale = 5; + } + else if(end_len < 3) + { + AngleScale = 1; + } + else + { + AngleScale = end_len/5; + } + + { + AngleScale -= (((DisDif/end_len)*(DisDif/end_len))*AngleScale); + + if(AngleScale < 0.8) + AngleScale = 0.8; + } + + saber.radius = (coreradius * AngleScale); + saber.saberLength = end_len; + + saber.shaderTexCoord[0] = saber.shaderTexCoord[1] = 1.0f; + saber.shaderRGBA[0] = saber.shaderRGBA[1] = saber.shaderRGBA[2] = saber.shaderRGBA[3] = 0xff; + + cgi_R_AddRefEntityToScene( &saber ); + } +} + static void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float radius, saber_colors_t color, int rfx, qboolean doLight ) { vec3_t mid; @@ -6584,6 +6957,17 @@ Ghoul2 Insert End return; } + qboolean noDlight = qfalse; + if ( client->ps.saber[saberNum].numBlades >= 3 + || (!WP_SaberBladeUseSecondBladeStyle( &client->ps.saber[saberNum], bladeNum ) && (client->ps.saber[saberNum].saberFlags2&SFL2_NO_DLIGHT) ) + || ( WP_SaberBladeUseSecondBladeStyle( &client->ps.saber[saberNum], bladeNum ) && (client->ps.saber[saberNum].saberFlags2&SFL2_NO_DLIGHT2) ) + ) + { + noDlight = qtrue; + } + +if (cg_SFXSabers.integer == 0) +{ if ( (!WP_SaberBladeUseSecondBladeStyle( &client->ps.saber[saberNum], bladeNum ) && client->ps.saber[saberNum].trailStyle < 2 ) || ( WP_SaberBladeUseSecondBladeStyle( &client->ps.saber[saberNum], bladeNum ) && client->ps.saber[saberNum].trailStyle2 < 2 ) ) {//okay to draw the trail @@ -6722,24 +7106,14 @@ Ghoul2 Insert End saberTrail->lastTime = cg.time; } } - if ( cent->gent->client->ps.saber[saberNum].type == SABER_SITH_SWORD) { // don't need to do nuthin else return; } - - qboolean noDlight = qfalse; - if ( client->ps.saber[saberNum].numBlades >= 3 - || (!WP_SaberBladeUseSecondBladeStyle( &client->ps.saber[saberNum], bladeNum ) && (client->ps.saber[saberNum].saberFlags2&SFL2_NO_DLIGHT) ) - || ( WP_SaberBladeUseSecondBladeStyle( &client->ps.saber[saberNum], bladeNum ) && (client->ps.saber[saberNum].saberFlags2&SFL2_NO_DLIGHT2) ) - ) - { - noDlight = qtrue; - } - + if ( (!WP_SaberBladeUseSecondBladeStyle( &client->ps.saber[saberNum], bladeNum ) && (client->ps.saber[saberNum].saberFlags2&SFL2_NO_BLADE) ) - || ( WP_SaberBladeUseSecondBladeStyle( &client->ps.saber[saberNum], bladeNum ) && (client->ps.saber[saberNum].saberFlags2&SFL2_NO_BLADE2) ) ) + || ( WP_SaberBladeUseSecondBladeStyle( &client->ps.saber[saberNum], bladeNum ) && (client->ps.saber[saberNum].saberFlags2&SFL2_NO_BLADE2) ) ) {//don't draw a blade if ( !noDlight ) {//but still do dlight @@ -6756,6 +7130,185 @@ Ghoul2 Insert End client->ps.saber[saberNum].blade[bladeNum].color, renderfx, (qboolean)!noDlight ); } +else +{ + + saberTrail_t *saberTrail = &client->ps.saber[saberNum].blade[bladeNum].trail; + saberTrail->duration = 0; + + if ( saberTrail->lastTime > cg.time ) + {//after a pause, cg.time jumps ahead in time for one frame + //and lastTime gets set to that and will freak out, so, since + //it's never valid for saberTrail->lastTime to be > cg.time, + //cap it to cg.time here + saberTrail->lastTime = cg.time; + } + + if(!saberTrail->base || !saberTrail->tip || !saberTrail->dualtip || !saberTrail->dualbase || !saberTrail->lastTime/* || !saberTrail->inAction*/) + { + VectorCopy( org_, saberTrail->base ); + VectorMA( end, -1.5f, axis_[0], saberTrail->tip ); + VectorCopy( saberTrail->tip, saberTrail->dualtip ); + VectorCopy( saberTrail->base, saberTrail->dualbase ); + saberTrail->lastTime = cg.time; + saberTrail->inAction = cg.time; + return; + } + else if ( cg.time > saberTrail->lastTime ) + { + float dirlen0, dirlen1, dirlen2, lagscale; + vec3_t dir0, dir1, dir2; + + VectorCopy( saberTrail->base, saberTrail->dualbase ); + VectorCopy( saberTrail->tip, saberTrail->dualtip ); + + VectorCopy( org_, saberTrail->base ); + VectorMA( end, -1.5f, axis_[0], saberTrail->tip ); + + VectorSubtract( saberTrail->dualtip, saberTrail->tip, dir0 ); + VectorSubtract( saberTrail->dualbase, saberTrail->base, dir1 ); + VectorSubtract( saberTrail->dualtip, saberTrail->dualbase, dir2 ); + + dirlen0 = VectorLength(dir0); + dirlen1 = VectorLength(dir1); + dirlen2 = VectorLength(dir2); + + if ( saberMoveData[client->ps.saberMove].trailLength == 0 ) + { + dirlen0 *= 0.5; + dirlen1 *= 0.3; + } + else + { + dirlen0 *= 1.0; + dirlen1 *= 0.5; + } + + lagscale = (cg.time - saberTrail->lastTime); + lagscale = 1-(lagscale*3/200); + + if(lagscale < 0.1) + lagscale = 0.1; + + VectorNormalize( dir0 ); + VectorNormalize( dir1 ); + + VectorMA( saberTrail->tip, dirlen0*lagscale, dir0, saberTrail->dualtip ); + VectorMA( saberTrail->base, dirlen1*lagscale, dir1, saberTrail->dualbase ); + VectorSubtract( saberTrail->dualtip, saberTrail->dualbase, dir1 ); + VectorNormalize( dir1 ); + + VectorMA( saberTrail->dualbase, dirlen2, dir1, saberTrail->dualtip ); + + saberTrail->lastTime = cg.time; + } + + vec3_t rgb1={255.0f,255.0f,255.0f}; + + switch( client->ps.saber[saberNum].blade[bladeNum].color ) + { + case SABER_RED: + VectorSet( rgb1, 255.0f, 0.0f, 0.0f ); + break; + case SABER_ORANGE: + VectorSet( rgb1, 253.0f, 125.0f, 80.0f ); + break; + case SABER_YELLOW: + VectorSet( rgb1, 250.0f, 250.0f, 160.0f ); + break; + case SABER_GREEN: + VectorSet( rgb1, 100.0f, 240.0f, 100.0f ); + break; + case SABER_PURPLE: + VectorSet( rgb1, 196.0f, 0.0f, 196.0f ); + break; + case SABER_BLUE: + VectorSet( rgb1, 0.0f, 0.0f, 255.0f ); + break; + default://SABER_RGB + VectorSet( rgb1, ((client->ps.saber[saberNum].blade[bladeNum].color) & 0xff), + ((client->ps.saber[saberNum].blade[bladeNum].color >> 8) & 0xff), + ((client->ps.saber[saberNum].blade[bladeNum].color >> 16) & 0xff) ); + break; + } + + CTrail *fx = new CTrail; + + VectorCopy( saberTrail->base, fx->mVerts[0].origin ); + VectorCopy( saberTrail->tip, fx->mVerts[1].origin ); + VectorCopy( saberTrail->dualtip, fx->mVerts[2].origin ); + VectorCopy( saberTrail->dualbase, fx->mVerts[3].origin ); + + + if ( !(cent->gent->client->ps.saber[saberNum].type == SABER_SITH_SWORD || client->ps.saber[saberNum].saberFlags2&SFL2_NO_BLADE) ) + { + CG_DoSFXSaber( saberTrail->base, saberTrail->tip, saberTrail->dualtip, saberTrail->dualbase, (client->ps.saber[saberNum].blade[bladeNum].lengthMax), (client->ps.saber[saberNum].blade[bladeNum].radius), client->ps.saber[saberNum].blade[bladeNum].color, renderfx, (qboolean)!noDlight ); + } + + if ( cg.time > saberTrail->inAction ) + { + saberTrail->inAction = cg.time; + + if ( cent->gent->client->ps.saber[saberNum].type == SABER_SITH_SWORD || client->ps.saber[saberNum].trailStyle == 1 ) + { + fx->mShader = cgs.media.swordTrailShader; + VectorSet( rgb1, 32.0f, 32.0f, 32.0f ); // make the sith sword trail pretty faint + } + else + { + fx->mShader = cgs.media.SaberTrailShader; + } + fx->SetFlags( FX_USE_ALPHA ); + + // New muzzle + VectorCopy( rgb1, fx->mVerts[0].rgb ); + fx->mVerts[0].alpha = 255.0f; + + fx->mVerts[0].ST[0] = 0.0f; + fx->mVerts[0].ST[1] = 4.0f; + fx->mVerts[0].destST[0] = 4.0f; + fx->mVerts[0].destST[1] = 4.0f; + + // new tip + VectorCopy( rgb1, fx->mVerts[1].rgb ); + fx->mVerts[1].alpha = 255.0f; + + fx->mVerts[1].ST[0] = 0.0f; + fx->mVerts[1].ST[1] = 0.0f; + fx->mVerts[1].destST[0] = 4.0f; + fx->mVerts[1].destST[1] = 0.0f; + + // old tip + VectorCopy( rgb1, fx->mVerts[2].rgb ); + fx->mVerts[2].alpha = 255.0f; + + fx->mVerts[2].ST[0] = 4.0f; + fx->mVerts[2].ST[1] = 0.0f; + fx->mVerts[2].destST[0] = 4.0f; + fx->mVerts[2].destST[1] = 0.0f; + + // old muzzle + VectorCopy( rgb1, fx->mVerts[3].rgb ); + fx->mVerts[3].alpha = 255.0f; + + fx->mVerts[3].ST[0] = 4.0f; + fx->mVerts[3].ST[1] = 4.0f; + fx->mVerts[3].destST[0] = 4.0f; + fx->mVerts[3].destST[1] = 4.0f; + + FX_AddPrimitive( (CEffect**)&fx, 0 ); + } + + if ( (client->ps.saber[saberNum].saberFlags2&SFL2_NO_BLADE) ) + { + if ( !noDlight ) + { + CG_DoSaberLight( &client->ps.saber[saberNum] ); + } + } + +} +} void CG_AddSaberBlade( centity_t *cent, centity_t *scent, refEntity_t *saber, int renderfx, int modelIndex, vec3_t origin, vec3_t angles ) { diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index a6dc5c2d3d..4c8ffa2ae6 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -824,8 +824,8 @@ typedef struct int inAction; // controls whether should we even consider starting one int duration; // how long each trail seg stays in existence int lastTime; // time a saber segement was last stored - vec3_t base; - vec3_t tip; + vec3_t base, dualbase; + vec3_t tip, dualtip; // Marks stuff qboolean haveOldPos[2]; From 58c30a3372271f26b42e5760f6c32f49300339d4 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sat, 7 Jan 2017 14:46:37 +0000 Subject: [PATCH 375/445] Colour choices 2: playerchoice2.txt file --- code/ui/menudef.h | 1 + code/ui/ui_local.h | 3 ++ code/ui/ui_main.cpp | 99 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+) diff --git a/code/ui/menudef.h b/code/ui/menudef.h index 63d09704c5..35eba263dc 100644 --- a/code/ui/menudef.h +++ b/code/ui/menudef.h @@ -97,6 +97,7 @@ along with this program; if not, see . #define FEEDER_MOVES 0x15 // moves for the data pad moves screen #define FEEDER_MOVES_TITLES 0x16 // move titles for the data pad moves screen #define FEEDER_LANGUAGES 0x17 // the list of languages +#define FEEDER_COLORCHOICES2 0x18 // more text/actions from playerchoice2.txt! #define UI_VERSION 200 diff --git a/code/ui/ui_local.h b/code/ui/ui_local.h index e39c4f902d..6c2011e786 100644 --- a/code/ui/ui_local.h +++ b/code/ui/ui_local.h @@ -147,7 +147,10 @@ typedef struct { skinName_t *SkinLeg; int ColorMax; int ColorCount; + int Color2Max; + int Color2Count; playerColor_t *Color; + playerColor_t *Color2; } playerSpeciesInfo_t; typedef struct { diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 85c2ebfe32..3847b19b48 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -703,6 +703,14 @@ const char *UI_FeederItemText(float feederID, int index, int column, qhandle_t * return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color[index].shader; } } + else if (feederID == FEEDER_COLORCHOICES2) + { + if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color2Count) + { + *handle = ui.R_RegisterShaderNoMip( uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color2[index].shader); + return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color2[index].shader; + } + } else if (feederID == FEEDER_MODS) { if (index >= 0 && index < uiInfo.modCount) @@ -754,6 +762,13 @@ qhandle_t UI_FeederItemImage(float feederID, int index) return ui.R_RegisterShaderNoMip( uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color[index].shader); } } + else if (feederID == FEEDER_COLORCHOICES2) + { + if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color2Count) + { + return ui.R_RegisterShaderNoMip( uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color2[index].shader); + } + } /* else if (feederID == FEEDER_ALLMAPS || feederID == FEEDER_MAPS) { int actual; @@ -1825,6 +1840,10 @@ static int UI_FeederCount(float feederID) { return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].ColorCount; } + else if (feederID == FEEDER_COLORCHOICES2) + { + return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color2Count; + } return 0; } @@ -1991,6 +2010,14 @@ extern void Item_RunScript(itemDef_t *item, const char *s); //from ui_shared; Item_RunScript(item, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color[index].actionText); } } + else if (feederID == FEEDER_COLORCHOICES2) + { + extern void Item_RunScript(itemDef_t *item, const char *s); //from ui_shared; + if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color2Count) + { + Item_RunScript(item, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color2[index].actionText); + } + } /* else if (feederID == FEEDER_CINEMATICS) { uiInfo.movieIndex = index; @@ -2337,6 +2364,60 @@ static qboolean UI_ParseColorData(char* buf, playerSpeciesInfo_t &species) return qtrue;//never get here } +static qboolean UI_ParseColor2Data(char* buf, playerSpeciesInfo_t &species) +{ + const char *token; + const char *p; + + p = buf; + COM_BeginParseSession(); + species.Color2Count = 0; + species.Color2Max = 16; + species.Color2 = (playerColor_t *)malloc(species.Color2Max * sizeof(playerColor_t)); + + while ( p ) + { + token = COM_ParseExt( &p, qtrue ); //looking for the shader + if ( token[0] == 0 ) + { + COM_EndParseSession( ); + return (qboolean)!(species.Color2Count == 0); + } + + if (species.Color2Count >= species.Color2Max) + { + species.Color2Max *= 2; + species.Color2 = (playerColor_t *)realloc(species.Color2, species.Color2Max * sizeof(playerColor_t)); + } + + memset(&species.Color2[species.Color2Count], 0, sizeof(playerColor_t)); + + Q_strncpyz( species.Color2[species.Color2Count].shader, token, MAX_QPATH ); + + token = COM_ParseExt( &p, qtrue ); //looking for action block { + if ( token[0] != '{' ) + { + COM_EndParseSession( ); + return qfalse; + } + + token = COM_ParseExt( &p, qtrue ); //looking for action commands + while (token[0] != '}') + { + if ( token[0] == 0) + { //EOF + COM_EndParseSession( ); + return qfalse; + } + Q_strcat(species.Color2[species.Color2Count].actionText, ACTION_BUFFER_SIZE, token); + Q_strcat(species.Color2[species.Color2Count].actionText, ACTION_BUFFER_SIZE, " "); + token = COM_ParseExt( &p, qtrue ); //looking for action commands or final } + } + species.Color2Count++; //next color please + } + COM_EndParseSession( ); + return qtrue;//never get here +} /* ================= bIsImageFile @@ -2377,6 +2458,7 @@ static void UI_FreeSpecies( playerSpeciesInfo_t *species ) free(species->SkinTorso); free(species->SkinLeg); free(species->Color); + free(species->Color2); memset(species, 0, sizeof(playerSpeciesInfo_t)); } @@ -2487,6 +2569,22 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) species->SkinTorso = (skinName_t *)malloc(species->SkinTorsoMax * sizeof(skinName_t)); species->SkinLeg = (skinName_t *)malloc(species->SkinLegMax * sizeof(skinName_t)); + Com_sprintf(fpath, 2048, "models/players/%s/PlayerChoice2.txt", dirptr); + filelen = ui.FS_FOpenFile(fpath, &f, FS_READ); + + species->Color2Count = 0; + + if (f) + { + ui.FS_Read(&buffer, filelen, f); + ui.FS_FCloseFile(f); + buffer[filelen] = 0; //ensure trailing NULL + if (!UI_ParseColor2Data(buffer.data(),*species)) + { + ui.Printf( "UI_BuildPlayerModel_List: Errors parsing '%s'\n", fpath ); + } + } + int j; char skinname[64]; int numfiles; @@ -6257,6 +6355,7 @@ static void UI_UpdateCharacter( qboolean changedModel ) UI_FeederSelection(FEEDER_PLAYER_SKIN_TORSO, 0, item); UI_FeederSelection(FEEDER_PLAYER_SKIN_LEGS, 0, item); UI_FeederSelection(FEEDER_COLORCHOICES, 0, item); + UI_FeederSelection(FEEDER_COLORCHOICES2, 0, item); } UI_UpdateCharacterSkin(); } From f23295027d8a1b28cbce9ba7e627694ac11d83dc Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sun, 25 Aug 2013 02:28:21 +0100 Subject: [PATCH 376/445] Headswaps Merge of several commits, mostly bugfixes. Includes UI support. NPCs can have headswaps using "playerHeadModel" and "customHeadSkin" in the .npc file. --- code/cgame/cg_consolecmds.cpp | 1 + code/cgame/cg_players.cpp | 108 +++++++++++++++++-- code/game/NPC_stats.cpp | 39 ++++++- code/game/Q3_Interface.cpp | 6 ++ code/game/bg_pangles.cpp | 11 +- code/game/bg_panimate.cpp | 46 +++++++- code/game/bg_pmove.cpp | 15 +++ code/game/g_client.cpp | 186 ++++++++++++++++++++++++++++++++ code/game/g_main.cpp | 11 ++ code/game/g_shared.h | 10 ++ code/game/g_svcmds.cpp | 22 ++++ code/rd-vanilla/tr_ghoul2.cpp | 6 +- code/ui/ui_atoms.cpp | 5 +- code/ui/ui_local.h | 7 ++ code/ui/ui_main.cpp | 196 +++++++++++++++++++++++++++++++++- code/ui/ui_saber.cpp | 47 ++++++-- code/ui/ui_shared.cpp | 90 +++++++++++++++- code/ui/ui_shared.h | 5 + 18 files changed, 784 insertions(+), 27 deletions(-) diff --git a/code/cgame/cg_consolecmds.cpp b/code/cgame/cg_consolecmds.cpp index a990b79622..30501049e3 100644 --- a/code/cgame/cg_consolecmds.cpp +++ b/code/cgame/cg_consolecmds.cpp @@ -296,6 +296,7 @@ static const char *gcmds[] = { "give", "gloat", "god", + "headplayermodel", "invuse", "kill", "meditate", diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index 831d0bcebd..cbfa3ba91a 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -135,7 +135,7 @@ qboolean CG_RegisterClientModelname( clientInfo_t *ci, const char *headModelName static void CG_PlayerFootsteps( centity_t *const cent, footstepType_t footStepType ); static void CG_PlayerAnimEvents( int animFileIndex, qboolean torso, int oldFrame, int frame, int entNum ); extern void BG_G2SetBoneAngles( centity_t *cent, gentity_t *gent, int boneIndex, const vec3_t angles, const int flags, - const Eorientations up, const Eorientations left, const Eorientations forward, qhandle_t *modelList ); + const Eorientations up, const Eorientations left, const Eorientations forward, qhandle_t *modelList, qboolean isHead = qfalse ); extern void FX_BorgDeathSparkParticles( vec3_t origin, vec3_t angles, vec3_t vel, vec3_t user ); extern qboolean PM_SaberInSpecialAttack( int anim ); extern qboolean PM_SaberInAttack( int move ); @@ -2201,8 +2201,13 @@ static void CG_G2ClientSpineAngles( centity_t *cent, vec3_t viewAngles, const ve } else { - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, ulAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, ulAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); BG_G2SetBoneAngles( cent, cent->gent, cent->gent->lowerLumbarBone, llAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + if (cent->gent->headModel > 0) + { + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->headUpperLumbarBone, ulAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw, qtrue); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->headLowerLumbarBone, llAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw, qtrue); + } } } @@ -2402,8 +2407,15 @@ static void CG_G2ClientNeckAngles( centity_t *cent, const vec3_t lookAngles, vec else { BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, headAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, neckAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, neckAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, thoracicAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw); + + if (cent->gent->headModel > 0) + { + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->headCraniumBone, headAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw, qtrue ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->headCervicalBone, neckAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw, qtrue); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->headThoracicBone, thoracicAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw, qtrue); + } } } @@ -2509,14 +2521,27 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) cent->lerpAngles[PITCH] = cent->lerpAngles[ROLL] = 0; VectorCopy( cent->lerpAngles, angles ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->craniumBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + + if ( cent->gent->headModel > 0) + { + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->headCraniumBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw, qtrue ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->headCervicalBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw, qtrue ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->headThoracicBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw, qtrue ); + } cent->pe.torso.pitchAngle = 0; cent->pe.torso.yawAngle = 0; - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); BG_G2SetBoneAngles( cent, cent->gent, cent->gent->lowerLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + + if (cent->gent->headModel > 0) + { + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->headUpperLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw, qtrue ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->headLowerLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw , qtrue); + } cent->pe.legs.pitchAngle = angles[0]; cent->pe.legs.yawAngle = angles[1]; @@ -2534,6 +2559,11 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) { gi.G2API_StopBoneAnimIndex( ¢->gent->ghoul2[cent->gent->playerModel], cent->gent->hipsBone ); } + + if ( cent->gent->headModel > 0 && cent->gent->headHipsBone != -1) + { + gi.G2API_StopBoneAnimIndex( ¢->gent->ghoul2[cent->gent->headModel], cent->gent->headHipsBone ); + } VectorCopy( cent->lerpAngles, angles ); @@ -2541,10 +2571,23 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) BG_G2SetBoneAngles( cent, cent->gent, cent->gent->cervicalBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); BG_G2SetBoneAngles( cent, cent->gent, cent->gent->thoracicBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + if ( cent->gent->headModel > 0) + { + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->headCraniumBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw, qtrue ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->headCervicalBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw, qtrue ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->headThoracicBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw, qtrue ); + } + cent->pe.torso.pitchAngle = 0; cent->pe.torso.yawAngle = 0; - BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->upperLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); BG_G2SetBoneAngles( cent, cent->gent, cent->gent->lowerLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw ); + + if (cent->gent->headModel > 0) + { + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->headUpperLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw, qtrue ); + BG_G2SetBoneAngles( cent, cent->gent, cent->gent->headLowerLumbarBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, cgs.model_draw, qtrue ); + } cent->pe.legs.pitchAngle = angles[0]; cent->pe.legs.yawAngle = angles[1]; @@ -2685,6 +2728,10 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) if ( angles[YAW] == cent->pe.legs.yawAngle ) { gi.G2API_StopBoneAnimIndex( ¢->gent->ghoul2[cent->gent->playerModel], cent->gent->hipsBone ); + if ( cent->gent->headModel > 0 && cent->gent->headHipsBone >= 0 ) + { + gi.G2API_StopBoneAnimIndex( ¢->gent->ghoul2[cent->gent->headModel], cent->gent->headHipsBone ); + } } else if ( VectorCompare( vec3_origin, cent->gent->client->ps.velocity ) ) {//FIXME: because of LegsYawFromMovement, we play the turnAnims when we stop running, which looks really bad. @@ -2700,16 +2747,30 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) gi.G2API_SetBoneAnimIndex( ¢->gent->ghoul2[cent->gent->playerModel], cent->gent->hipsBone, animations[turnAnim].firstFrame, animations[turnAnim].firstFrame+animations[turnAnim].numFrames, BONE_ANIM_OVERRIDE_LOOP/*|BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND*/, animSpeed, cg.time, -1, 100 ); + if ( cent->gent->headModel > 0 && cent->gent->headHipsBone >= 0 ) + { + gi.G2API_SetBoneAnimIndex( ¢->gent->ghoul2[cent->gent->headModel], cent->gent->headHipsBone, + animations[turnAnim].firstFrame, animations[turnAnim].firstFrame+animations[turnAnim].numFrames, + BONE_ANIM_OVERRIDE_LOOP/*|BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND*/, animSpeed, cg.time, -1, 100 ); + } } } else { gi.G2API_StopBoneAnimIndex( ¢->gent->ghoul2[cent->gent->playerModel], cent->gent->hipsBone ); + if ( cent->gent->headModel > 0 && cent->gent->headHipsBone >= 0 ) + { + gi.G2API_StopBoneAnimIndex( ¢->gent->ghoul2[cent->gent->headModel], cent->gent->headHipsBone ); + } } } else { gi.G2API_StopBoneAnimIndex( ¢->gent->ghoul2[cent->gent->playerModel], cent->gent->hipsBone ); + if ( cent->gent->headModel > 0 && cent->gent->headHipsBone >= 0 ) + { + gi.G2API_StopBoneAnimIndex( ¢->gent->ghoul2[cent->gent->headModel], cent->gent->headHipsBone ); + } } } @@ -5062,7 +5123,7 @@ static void CG_G2SetHeadBlink( centity_t *cent, qboolean bStart ) { return; } - + vec3_t desiredAngles = {0}; int blendTime = 80; qboolean bWink = qfalse; @@ -5078,6 +5139,17 @@ static void CG_G2SetHeadBlink( centity_t *cent, qboolean bStart ) } gi.G2API_SetBoneAnglesIndex( &gent->ghoul2[gent->playerModel], hLeye, desiredAngles, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, blendTime, cg.time ); + + if (gent->headModel > 0) + { + const int headLeye = gi.G2API_GetBoneIndex( &gent->ghoul2[gent->headModel], "leye", qtrue ); + if (headLeye != -1) + { + gi.G2API_SetBoneAnglesIndex( &gent->ghoul2[gent->headModel], headLeye, desiredAngles, + BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, blendTime, cg.time ); + } + } + const int hReye = gi.G2API_GetBoneIndex( &gent->ghoul2[0], "reye", qtrue ); if (hReye == -1) { @@ -5085,8 +5157,20 @@ static void CG_G2SetHeadBlink( centity_t *cent, qboolean bStart ) } if (!bWink) - gi.G2API_SetBoneAnglesIndex( &gent->ghoul2[gent->playerModel], hReye, desiredAngles, + { + gi.G2API_SetBoneAnglesIndex( &gent->ghoul2[gent->playerModel], hReye, desiredAngles, BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, blendTime, cg.time ); + + if (gent->headModel > 0) + { + const int headReye = gi.G2API_GetBoneIndex( &gent->ghoul2[gent->headModel], "reye", qtrue ); + if (headReye != -1) + { + gi.G2API_SetBoneAnglesIndex( &gent->ghoul2[gent->headModel], headReye, desiredAngles, + BONE_ANGLES_POSTMULT, POSITIVE_Y, POSITIVE_Z, POSITIVE_X, NULL, blendTime, cg.time ); + } + } + } } /* @@ -5137,6 +5221,12 @@ static void CG_G2SetHeadAnim( centity_t *cent, int anim ) gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], cent->gent->faceBone, firstFrame, lastFrame, animFlags, animSpeed, cg.time, -1, blendTime); } + + if (gent->headModel > 0) + { + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->headModel], cent->gent->headFaceBone, + firstFrame, lastFrame, animFlags, animSpeed, cg.time, -1, blendTime); + } } static qboolean CG_G2PlayerHeadAnims( centity_t *cent ) diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index 37d739aadc..f1fe2d7d24 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -1937,6 +1937,7 @@ void NPC_BuildRandom( gentity_t *NPC ) extern void G_MatchPlayerWeapon( gentity_t *ent ); extern void G_InitPlayerFromCvars( gentity_t *ent ); extern void G_SetG2PlayerModel( gentity_t * const ent, const char *modelName, const char *customSkin, const char *surfOff, const char *surfOn ); +extern void G_ChangeHeadModel( gentity_t *ent, const char *newModel ); qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) { const char *token; @@ -1948,6 +1949,8 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) char sound[MAX_QPATH]; char playerModel[MAX_QPATH]; char customSkin[MAX_QPATH]; + char playerHeadModel[MAX_QPATH] = {0}; + char customHeadSkin[MAX_QPATH] = {0}; clientInfo_t *ci = &NPC->client->clientInfo; renderInfo_t *ri = &NPC->client->renderInfo; gNPCstats_t *stats = NULL; @@ -2561,7 +2564,29 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) Q_strncpyz( customSkin, value, sizeof(customSkin)); continue; } - + + // playerModel + if ( !Q_stricmp( token, "playerHeadModel" ) ) + { + if ( COM_ParseString( &p, &value ) ) + { + continue; + } + Q_strncpyz( playerHeadModel, value, sizeof(playerHeadModel)); + continue; + } + + // customSkin + if ( !Q_stricmp( token, "customHeadSkin" ) ) + { + if ( COM_ParseString( &p, &value ) ) + { + continue; + } + Q_strncpyz( customHeadSkin, value, sizeof(customHeadSkin)); + continue; + } + // surfOff if ( !Q_stricmp( token, "surfOff" ) ) { @@ -4170,6 +4195,18 @@ Ghoul2 Insert Start } G_SetG2PlayerModel( NPC, playerModel, customSkin, surfOff, surfOn ); + + if ( playerHeadModel && playerHeadModel[0] ) + { + if (customHeadSkin && customHeadSkin[0]) + { + G_ChangeHeadModel( NPC, va("%s|%s", playerHeadModel, customHeadSkin) ); + } + else + { + G_ChangeHeadModel( NPC, va("%s|default", playerHeadModel) ); + } + } } } /* diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 2c740d48bb..2a95880775 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -9533,6 +9533,9 @@ extern cvar_t *g_char_model; extern cvar_t *g_char_skin_head; extern cvar_t *g_char_skin_torso; extern cvar_t *g_char_skin_legs; +extern void G_SetHeadSurfaceOnOff( gentity_t *ent ); +extern void G_SetHeadSkin( gentity_t *ent ); + case SET_WINTER_GEAR: // Created: 03/26/03 by AReis. { // If this is a (fake) Player NPC or this IS the Player... @@ -9557,6 +9560,9 @@ extern cvar_t *g_char_skin_legs; { gi.G2API_SetSkin( &ent->ghoul2[ent->playerModel], G_SkinIndex( strSkin ), iSkinID ); } + + G_SetHeadSurfaceOnOff( ent ); + G_SetHeadSkin( ent ); } break; } diff --git a/code/game/bg_pangles.cpp b/code/game/bg_pangles.cpp index 052dc31cf0..0e5ec60774 100644 --- a/code/game/bg_pangles.cpp +++ b/code/game/bg_pangles.cpp @@ -368,11 +368,18 @@ void PM_IKUpdate( gentity_t *ent ) void BG_G2SetBoneAngles( centity_t *cent, gentity_t *gent, int boneIndex, const vec3_t angles, const int flags, - const Eorientations up, const Eorientations right, const Eorientations forward, qhandle_t *modelList ) + const Eorientations up, const Eorientations right, const Eorientations forward, qhandle_t *modelList, qboolean isHead ) { if (boneIndex!=-1) { - gi.G2API_SetBoneAnglesIndex( ¢->gent->ghoul2[0], boneIndex, angles, flags, up, right, forward, modelList, 0, 0 ); + if (isHead && cent->gent->headModel > 0) + { + gi.G2API_SetBoneAnglesIndex( ¢->gent->ghoul2[cent->gent->headModel], boneIndex, angles, flags, up, right, forward, modelList, 0, 0 ); + } + else + { + gi.G2API_SetBoneAnglesIndex( ¢->gent->ghoul2[0], boneIndex, angles, flags, up, right, forward, modelList, 0, 0 ); + } } } diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index b6813299d8..3bf91a5634 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -4960,7 +4960,7 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, { animCurrent = torsCurrent; } - + gi.G2API_SetAnimIndex(&gent->ghoul2[gent->playerModel], curAnim.glaIndex); gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], torsBone, animStart, @@ -4982,6 +4982,33 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, animCurrent, blendTime); } + + if (gent->headModel > 0) + { + gi.G2API_SetAnimIndex(&gent->ghoul2[gent->headModel], curAnim.glaIndex); + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->headModel], gent->headLowerLumbarBone, + animStart, + animEnd, + (torsOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), + animSpeed, + actualTime, + animCurrent, + blendTime); + + if (gent->headMotionBone!=-1) + { + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->headModel], gent->headMotionBone, + animStart, + animEnd, + (torsOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), + animSpeed, + actualTime, + animCurrent, + blendTime); + } + + } + animCurrent = oldAnimCurrent; @@ -5003,7 +5030,7 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, { animCurrent = bodyCurrent; } - + gi.G2API_SetAnimIndex(&gent->ghoul2[gent->playerModel], curAnim.glaIndex); gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], bodyBone, animStart, @@ -5013,6 +5040,21 @@ void PM_SetAnimFinal(int *torsoAnim,int *legsAnim, actualTime, animCurrent, blendTime); + + if (gent->headModel > 0) + { + gi.G2API_SetAnimIndex(&gent->ghoul2[gent->headModel], curAnim.glaIndex); + + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->headModel], gent->headRootBone, + animStart, + animEnd, + (bodyOnAnimNow && !animRestart)?(animFlags&~BONE_ANIM_BLEND):(animFlags), + animSpeed, + actualTime, + animCurrent, + blendTime); + + } // If This Animation Is To Be Locked And Held, Calculate The Duration And Set The Timer //-------------------------------------------------------------------------------------- diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 3857f0721a..772445a396 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -9902,11 +9902,26 @@ void PM_SetAnimFrame( gentity_t *gent, int frame, qboolean torso, qboolean legs frame, frame+1, BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND, 1, actualTime, frame, 150 ); } } + if ( torso && gent->headModel > 0 && gent->headLowerLumbarBone != -1) + { + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->headModel], gent->headLowerLumbarBone, //gent->upperLumbarBone + frame, frame+1, BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND, 1, actualTime, frame, 150 ); + if ( gent->motionBone != -1 ) + { + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->headModel], gent->headMotionBone, //gent->upperLumbarBone + frame, frame+1, BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND, 1, actualTime, frame, 150 ); + } + } if ( legs && gent->rootBone != -1 ) { gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->rootBone, frame, frame+1, BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND, 1, actualTime, frame, 150 ); } + if ( legs && gent->headModel > 0 && gent->headRootBone != -1 ) + { + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->headModel], gent->headRootBone, + frame, frame+1, BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND, 1, actualTime, frame, 150 ); + } } int PM_SaberLockWinAnim( saberLockResult_t result, int breakType ) diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index 9c05053db6..80222aa116 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -50,6 +50,9 @@ extern cvar_t *g_saber_color; extern cvar_t *g_saber2_color; extern cvar_t *g_saberDarkSideSaberColor; +extern cvar_t *g_char_head_model; +extern cvar_t *g_char_head_skin; + // g_client.c -- client functions that don't happen every frame float DEFAULT_MINS_0 = -16; @@ -1799,6 +1802,15 @@ void G_SetG2PlayerModel( gentity_t * const ent, const char *modelName, const cha Ghoul2 Insert End */ +void G_RemoveHeadModel( gentity_t *ent ) +{ + if ( ent->headModel >= 0 && ent->headModel != ent->playerModel && ent->ghoul2.size() ) + { + gi.G2API_RemoveGhoul2Model( ent->ghoul2, ent->headModel ); + ent->headModel = -1; + } +} + void G_RemovePlayerModel( gentity_t *ent ) { if ( ent->playerModel >= 0 && ent->ghoul2.size() ) @@ -1847,6 +1859,7 @@ void G_AddWeaponModels( gentity_t *ent ) extern saber_colors_t TranslateSaberColor( const char *name ); extern void WP_RemoveSaber( gentity_t *ent, int saberNum ); void G_ChangePlayerModel( gentity_t *ent, const char *newModel ); +void G_ChangeHeadModel( gentity_t *ent, const char *newModel ); void G_SetSabersFromCVars( gentity_t *ent ) { if ( g_saber->string @@ -1939,6 +1952,11 @@ void G_InitPlayerFromCvars( gentity_t *ent ) else G_ChangePlayerModel( ent, va("%s|%s|%s|%s", g_char_model->string, g_char_skin_head->string, g_char_skin_torso->string, g_char_skin_legs->string) ); + if (g_char_head_model->string && g_char_head_model->string[0]) + { + G_ChangeHeadModel( ent, va("%s|%s", g_char_head_model->string, g_char_head_skin->string) ); + } + //FIXME: parse these 2 from some cvar or require playermodel to be in a *.npc? if( ent->NPC_type && gi.bIsFromZone(ent->NPC_type, TAG_G_ALLOC) ) { gi.Free(ent->NPC_type); @@ -1981,6 +1999,168 @@ void G_InitPlayerFromCvars( gentity_t *ent ) } } +void G_SetHeadSkin( gentity_t *ent ) +{ + + if (g_char_head_model->string && g_char_head_model->string[0]) + { + if (g_char_head_skin->string && g_char_head_skin->string[0]) + { + G_ChangeHeadModel( ent, va("%s|%s", g_char_head_model->string, g_char_head_skin->string) ); + } + else + { + G_ChangeHeadModel( ent, va("%s|default", g_char_head_model->string) ); + } + } + +/* char skinName[MAX_QPATH]; + if (g_char_head_model->string && g_char_head_model->string[0]) + { + if (g_char_head_skin->string && g_char_head_skin->string[0]) + { + Com_sprintf( skinName, sizeof( skinName ), "models/players/%s/model_%s.skin", g_char_head_model->string, g_char_head_skin->string ); + } + else + { + Com_sprintf( skinName, sizeof( skinName ), "models/players/%s/model_default.skin", g_char_head_model->string ); + } + + } + + // lets see if it's out there + int skin = gi.RE_RegisterSkin( skinName ); + + //What if it's a 3-parter or one part of a 3-parter? + if (!skin && g_char_head_skin->string && g_char_head_skin->string[0]) + { + if (strchr(g_char_head_skin->string, '|')) + { + Com_sprintf( skinName, sizeof( skinName ), "models/players/%s/|%s", g_char_head_model->string, g_char_head_skin->string ); + } + else + { + Com_sprintf( skinName, sizeof( skinName ), "models/players/%s/%s.skin", g_char_head_model->string, g_char_head_skin->string ); + } + skin = gi.RE_RegisterSkin( skinName ); + } + + if ( skin ) + {//what if this returns 0 because *one* part of a multi-skin didn't load? + // put it in the config strings + // and set the ghoul2 model to use it + gi.G2API_SetSkin( &ent->ghoul2[ent->headModel], G_SkinIndex( skinName ), skin ); + }*/ +} + +void G_SetHeadSurfaceOnOff( gentity_t *ent ) +{ + if (g_char_head_model->string && g_char_head_model->string[0]) + { + gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->playerModel], "head", G2SURFACEFLAG_NODESCENDANTS); + gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->playerModel], "torso_cap_head", 0x00); + } +} + +void G_ChangeHeadModel( gentity_t *ent, const char *newModel ) +{ + if ( !ent || !ent->client || !newModel ) + { + return; + } + + G_RemoveHeadModel( ent ); + + char name[MAX_QPATH]; + strcpy(name, newModel); + char *p = strchr(name, '|'); + + if ( p ) + { + *p = 0; + p++; + } + + char skinName[MAX_QPATH]; + vec3_t angles = {0,0,0}; + + if ( p && p[0] ) + { + Com_sprintf( skinName, sizeof( skinName ), "models/players/%s/model_%s.skin", name, p ); + } + else + { + Com_sprintf( skinName, sizeof( skinName ), "models/players/%s/model_default.skin", name ); + } + + int skin = gi.RE_RegisterSkin( skinName ); + + //What if it's a 3-parter or one part of a 3-parter? + if (!skin && p && p[0]) + { + if (strchr(p, '|')) + { + Com_sprintf( skinName, sizeof( skinName ), "models/players/%s/|%s", name, p ); + } + else + { + Com_sprintf( skinName, sizeof( skinName ), "models/players/%s/%s.skin", name, p ); + } + skin = gi.RE_RegisterSkin( skinName ); + } + + if (!skin) { + return; + } + + //now generate the ghoul2 model this client should be. + //NOTE: it still loads the default skin's tga's because they're referenced in the .glm. + ent->headModel = gi.G2API_InitGhoul2Model( ent->ghoul2, va("models/players/%s/model.glm", name), G_ModelIndex( va("models/players/%s/model.glm", name) ), G_SkinIndex( skinName ), NULL_HANDLE, 0, 0 ); + + if (ent->headModel == -1) + { + return; + } + + gi.G2API_SetSkin( &ent->ghoul2[ent->headModel], G_SkinIndex( skinName ), skin );//this is going to set the surfs on/off matching the skin file + +// int getBolt = gi.G2API_AddBolt(&ent->ghoul2[ent->headModel], "cranium"); + gi.G2API_SetRootSurface(ent->ghoul2, ent->headModel, "head"); +// gi.G2API_AttachG2Model(&ent->ghoul2[ent->headModel], &ent->ghoul2[ent->playerModel], ent->motionBone, ent->playerModel); + + ent->headRootBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->headModel], "model_root", qtrue ); + + ent->headMotionBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->headModel], "Motion", qtrue ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->headModel], ent->headMotionBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_X, NEGATIVE_Y, NULL, 0, 0 ); + + ent->headLowerLumbarBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->headModel], "lower_lumbar", qtrue ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->headModel], ent->headLowerLumbarBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + + ent->headFaceBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->headModel], "face", qtrue ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->headModel], ent->headFaceBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + + ent->headHipsBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->headModel], "pelvis", qtrue ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->headModel], ent->headHipsBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + + ent->headUpperLumbarBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->headModel], "upper_lumbar", qtrue ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->headModel], ent->headUpperLumbarBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + + ent->headCraniumBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->headModel], "cranium", qtrue ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->headModel], ent->headCraniumBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + + ent->headCervicalBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->headModel], "cervical", qtrue ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->headModel], ent->headCervicalBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + + ent->headThoracicBone = gi.G2API_GetBoneIndex( &ent->ghoul2[ent->headModel], "thoracic", qtrue ); + gi.G2API_SetBoneAnglesIndex( &ent->ghoul2[ent->headModel], ent->headThoracicBone, angles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0 ); + + +// gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->headModel], "hips", G2SURFACEFLAG_NODESCENDANTS); +// gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->headModel], "head", 0x0); + G_SetHeadSurfaceOnOff( ent ); + gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->headModel], "head_cap_torso", 0x00);//show caps so don't get such bad seams +} + void G_ChangePlayerModel( gentity_t *ent, const char *newModel ) { if ( !ent || !ent->client || !newModel ) @@ -1989,6 +2169,8 @@ void G_ChangePlayerModel( gentity_t *ent, const char *newModel ) } G_RemovePlayerModel( ent ); + G_RemoveHeadModel( ent ); + if ( Q_stricmp( "player", newModel ) == 0 ) { G_InitPlayerFromCvars( ent ); @@ -2174,6 +2356,8 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded { G_LoadAnimFileSet( ent, ent->NPC_type ); G_SetSkin( ent ); + G_SetHeadSurfaceOnOff( ent ); + G_SetHeadSkin( ent ); } //setup sabers @@ -2373,6 +2557,8 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded { G_LoadAnimFileSet( ent, ent->NPC_type ); G_SetSkin( ent ); + G_SetHeadSurfaceOnOff( ent ); + G_SetHeadSkin( ent ); } G_ReloadSaberData( ent ); //force power levels should already be set diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 8ae2c6d4c4..13d7665cfd 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -215,6 +215,9 @@ cvar_t *g_saber_color; cvar_t *g_saber2_color; cvar_t *g_saberDarkSideSaberColor; +cvar_t *g_char_head_model; +cvar_t *g_char_head_skin; + // kef -- used with DebugTraceForNPC cvar_t *g_npcdebug; @@ -695,6 +698,9 @@ void G_InitCvars( void ) { g_saber2_color = gi.cvar( "g_saber2_color", "yellow", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); g_saberDarkSideSaberColor = gi.cvar( "g_saberDarkSideSaberColor", "0", CVAR_ARCHIVE ); //when you turn evil, it turns your saber red! + g_char_head_model = gi.cvar( "g_char_head_model", "", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_char_head_skin = gi.cvar( "g_char_head_skin", "", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_broadsword = gi.cvar( "broadsword", "1", 0); g_allowBunnyhopping = gi.cvar( "g_allowBunnyhopping", "0", 0 ); @@ -1146,6 +1152,11 @@ static void G_Animate ( gentity_t *self ) gi.G2API_SetBoneAnimIndex( &self->ghoul2[self->playerModel], self->rootBone, self->startFrame, self->endFrame, BONE_ANIM_OVERRIDE_FREEZE, 1.0f, cg.time, -1, -1 ); + if ( self->headModel > 0) + { + gi.G2API_SetBoneAnimIndex( &self->ghoul2[self->headModel], self->headRootBone, + self->startFrame, self->endFrame, BONE_ANIM_OVERRIDE_FREEZE, 1.0f, cg.time, -1, -1 ); + } return; } diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 673e705b26..3ffbdef720 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -1165,6 +1165,16 @@ Ghoul2 Insert End team_t noDamageTeam; // Ghoul2 Animation info + short headModel; + short headRootBone; + short headMotionBone; + short headCraniumBone; + short headCervicalBone; + short headThoracicBone; + short headUpperLumbarBone; + short headLowerLumbarBone; + short headHipsBone; + short headFaceBone; short playerModel; short weaponModel[MAX_INHAND_WEAPONS]; short handRBolt; diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index 6c2174af9b..dcc45618a3 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -30,6 +30,7 @@ along with this program; if not, see . extern void G_NextTestAxes( void ); extern void G_ChangePlayerModel( gentity_t *ent, const char *newModel ); +extern void G_ChangeHeadModel( gentity_t *ent, const char *newModel ); extern void G_InitPlayerFromCvars( gentity_t *ent ); extern void Q3_SetViewEntity(int entID, const char *name); extern qboolean G_ClearViewEntity( gentity_t *ent ); @@ -885,6 +886,25 @@ static void Svcmd_Difficulty_f(void) } } +static void Svcmd_HeadPlayerModel_f(void) +{ + if ( gi.argc() == 2 ) + { + //this is debug type option! + G_ChangeHeadModel(&g_entities[0], gi.argv(1)); + } + else if ( gi.argc() == 3 ) + { + gi.cvar_set("g_char_head_model", gi.argv(1) ); + gi.cvar_set("g_char_head_skin", gi.argv(2) ); + G_InitPlayerFromCvars( &g_entities[0] ); + } + else + { + gi.Printf( S_COLOR_RED"USAGE: headPlayerModel " ); + } +} + #define CMD_NONE (0x00000000u) #define CMD_CHEAT (0x00000001u) #define CMD_ALIVE (0x00000002u) @@ -952,6 +972,8 @@ static svcmd_t svcmds[] = { { "secrets", Svcmd_Secrets_f, CMD_NONE }, { "difficulty", Svcmd_Difficulty_f, CMD_NONE }, + + { "headPlayerModel", Svcmd_HeadPlayerModel_f, CMD_NONE }, //{ "say", Svcmd_Say_f, qtrue }, //{ "toggleallowvote", Svcmd_ToggleAllowVote_f, qfalse }, diff --git a/code/rd-vanilla/tr_ghoul2.cpp b/code/rd-vanilla/tr_ghoul2.cpp index 24110b2987..a80c862432 100644 --- a/code/rd-vanilla/tr_ghoul2.cpp +++ b/code/rd-vanilla/tr_ghoul2.cpp @@ -2649,7 +2649,11 @@ void R_AddGhoulSurfaces( trRefEntity_t *ent ) { { cust_shader = NULL; // figure out the custom skin thing - if (ent->e.customSkin) + if (ent->e.customSkin&& ghoul2[i].mCustomSkin) + { + skin = R_GetSkinByHandle(ghoul2[i].mCustomSkin ); + } + else if (ent->e.customSkin) { skin = R_GetSkinByHandle(ent->e.customSkin ); } diff --git a/code/ui/ui_atoms.cpp b/code/ui/ui_atoms.cpp index 69ccfb6e3b..5c344fc6ad 100644 --- a/code/ui/ui_atoms.cpp +++ b/code/ui/ui_atoms.cpp @@ -286,7 +286,10 @@ void UI_Init( int apiVersion, uiimport_t *uiimport, qboolean inGameLoad ) ui.Cvar_Create( "g_saber2", "", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); ui.Cvar_Create( "g_saber_color", "yellow", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); ui.Cvar_Create( "g_saber2_color", "yellow", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); - + + ui.Cvar_Create( "g_char_head_model", "", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + ui.Cvar_Create( "g_char_head_skin", "", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + ui.Cvar_Create( "ui_forcepower_inc", "0", CVAR_ROM|CVAR_SAVEGAME|CVAR_NORESTART); ui.Cvar_Create( "tier_storyinfo", "0", CVAR_ROM|CVAR_SAVEGAME|CVAR_NORESTART); ui.Cvar_Create( "tiers_complete", "", CVAR_ROM|CVAR_SAVEGAME|CVAR_NORESTART); diff --git a/code/ui/ui_local.h b/code/ui/ui_local.h index 6c2011e786..04ae3c0408 100644 --- a/code/ui/ui_local.h +++ b/code/ui/ui_local.h @@ -123,12 +123,18 @@ typedef struct { } modInfo_t; #define SKIN_LENGTH 16 +#define MODEL_LENGTH 32 #define ACTION_BUFFER_SIZE 128 typedef struct { char name[SKIN_LENGTH]; } skinName_t; +typedef struct { + char model[MODEL_LENGTH]; + char skin[SKIN_LENGTH]; +} headSwap_t; + typedef struct { char shader[MAX_QPATH]; char actionText[ACTION_BUFFER_SIZE]; @@ -151,6 +157,7 @@ typedef struct { int Color2Count; playerColor_t *Color; playerColor_t *Color2; + headSwap_t *HeadSwap; } playerSpeciesInfo_t; typedef struct { diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 3847b19b48..475754b0cb 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -52,6 +52,7 @@ extern stringID_table_t animTable [MAX_ANIMATIONS+1]; extern qboolean ItemParse_model_g2anim_go( itemDef_t *item, const char *animName ); extern qboolean ItemParse_asset_model_go( itemDef_t *item, const char *name ); +extern qboolean ItemParse_asset_model_go_head( itemDef_t *item, const char *name, qboolean cleanuponly ); extern qboolean ItemParse_model_g2skin_go( itemDef_t *item, const char *skinName ); extern qboolean UI_SaberModelForSaber( const char *saberName, char *saberModel ); extern qboolean UI_SaberSkinForSaber( const char *saberName, char *saberSkin ); @@ -389,6 +390,9 @@ vmCvar_t ui_rgb_saber2_red; vmCvar_t ui_rgb_saber2_green; vmCvar_t ui_rgb_saber2_blue; +vmCvar_t ui_char_head_model; +vmCvar_t ui_char_head_skin; + static cvarTable_t cvarTable[] = { { &ui_menuFiles, "ui_menuFiles", "ui/menus.txt", CVAR_ARCHIVE }, @@ -423,6 +427,9 @@ static cvarTable_t cvarTable[] = { &ui_rgb_saber2_red, "ui_rgb_saber2_red", "", 0}, { &ui_rgb_saber2_blue, "ui_rgb_saber2_blue", "", 0}, { &ui_rgb_saber2_green, "ui_rgb_saber2_green", "", 0}, + + { &ui_char_head_model, "ui_char_head_model", "",0}, //these are filled in by the "g_*" versions on load + { &ui_char_head_skin, "ui_char_head_skin", "",0}, //the "g_*" versions are initialized in UI_Init, ui_atoms.cpp }; #define FP_UPDATED_NONE -1 @@ -864,6 +871,8 @@ static qboolean UI_DeferMenuScript ( const char **args ) UI_RunMenuScript =============== */ +extern qboolean ItemParse_model_g2skin_go_head( itemDef_t *item, const char *skinName ); +extern void ItemParse_swapheads( itemDef_t *item ); static qboolean UI_RunMenuScript ( const char **args ) { const char *name, *name2,*mapName,*menuName,*warningMenuName; @@ -1182,6 +1191,46 @@ static qboolean UI_RunMenuScript ( const char **args ) ); ItemParse_model_g2skin_go( item, skin ); + + if (Cvar_VariableString( "ui_char_head_model" )[0]) + { + Com_sprintf( skin, sizeof( skin ), "models/players/%s/model.glm", Cvar_VariableString ( "ui_char_head_model" ) ); + ItemParse_asset_model_go_head( item, skin, qfalse ); + } + else + { + ItemParse_asset_model_go_head( item, NULL, qtrue ); + } + + if (Cvar_VariableString( "ui_char_head_model" )[0]) + { + if (Cvar_VariableString( "ui_char_head_skin" )[0]) + { + Com_sprintf( skin, sizeof( skin), "models/players/%s/model_%s.skin", Cvar_VariableString("ui_char_head_model"), Cvar_VariableString("ui_char_head_skin")); + if (!DC->registerSkin( skin )) + { + //What if it's a 3-parter or one part of a 3-parter? + if (strchr(Cvar_VariableString( "ui_char_head_skin" ), '|')) + { + Com_sprintf( skin, sizeof( skin ), "models/players/%s/|%s", Cvar_VariableString("ui_char_head_model"), Cvar_VariableString("ui_char_head_skin")); + } + else + { + Com_sprintf( skin, sizeof( skin ), "models/players/%s/%s.skin", Cvar_VariableString("ui_char_head_model"), Cvar_VariableString("ui_char_head_skin")); + } + } + } + else + { + Com_sprintf( skin, sizeof( skin), "models/players/%s/model_default.skin", Cvar_VariableString("ui_char_head_model")); + } + ItemParse_model_g2skin_go_head( item, skin ); + } + + if (Cvar_VariableString( "ui_char_head_model" )[0]) + { + ItemParse_swapheads( item ); + } UI_SaberAttachToChar( item ); } } @@ -1881,6 +1930,10 @@ static void UI_FeederSelection(float feederID, int index, itemDef_t *item) { ItemParse_model_g2anim_go( item, datapadMoveData[uiInfo.movesTitleIndex][index].anim ); uiInfo.moveAnimTime = DC->g2hilev_SetAnim(&item->ghoul2[0], "model_root", modelPtr->g2anim, qtrue); + if (Cvar_VariableString( "ui_char_head_model" )[0]) + { + DC->g2hilev_SetAnim(&item->ghoul2[1], "model_root", modelPtr->g2anim, qtrue); + } uiInfo.moveAnimTime += uiInfo.uiDC.realTime; @@ -1962,6 +2015,10 @@ static void UI_FeederSelection(float feederID, int index, itemDef_t *item) { ItemParse_model_g2anim_go( item, uiInfo.movesBaseAnim ); uiInfo.moveAnimTime = DC->g2hilev_SetAnim(&item->ghoul2[0], "model_root", modelPtr->g2anim, qtrue); + if (Cvar_VariableString( "ui_char_head_model" )[0]) + { + DC->g2hilev_SetAnim(&item->ghoul2[1], "model_root", modelPtr->g2anim, qtrue); + } } } } @@ -1986,6 +2043,24 @@ static void UI_FeederSelection(float feederID, int index, itemDef_t *item) if (index >= 0 && index < uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHeadCount) { Cvar_Set("ui_char_skin_head", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].SkinHead[index].name); + + if (uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].HeadSwap[index].model[0]) + { + Cvar_Set("ui_char_head_model", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].HeadSwap[index].model); + } + else + { + Cvar_Set("ui_char_head_model", ""); + } + + if (uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].HeadSwap[index].skin[0]) + { + Cvar_Set("ui_char_head_skin", uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].HeadSwap[index].skin); + } + else + { + Cvar_Set("ui_char_head_skin", ""); + } } } else if (feederID == FEEDER_PLAYER_SKIN_TORSO) @@ -2418,6 +2493,62 @@ static qboolean UI_ParseColor2Data(char* buf, playerSpeciesInfo_t &species) COM_EndParseSession( ); return qtrue;//never get here } +static qboolean UI_ParseHeadSwapData(char* buf, playerSpeciesInfo_t &species) +{ + const char *token; + const char *p; + + int count = species.SkinHeadCount - 1; + + p = buf; + COM_BeginParseSession(); + + if ( !p ) + { + return qfalse; + } + token = COM_ParseExt( &p, qtrue ); //looking for action block { + if ( token[0] != '{' ) + { + COM_EndParseSession( ); + return qfalse; + } + + token = COM_ParseExt( &p, qtrue ); //looking for model & skin commands! + while (token[0] != '}') + { + if ( token[0] == 0) + { //EOF + COM_EndParseSession( ); + return qfalse; + } + if ( !Q_stricmp( token, "model" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( species.HeadSwap[count].model, token, MODEL_LENGTH ); + } + if ( !Q_stricmp( token, "skin" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( species.HeadSwap[count].skin, token, SKIN_LENGTH ); + } + token = COM_ParseExt( &p, qtrue ); //looking for action commands or final } + } + + COM_EndParseSession( ); + return qtrue;//never get here +} + /* ================= bIsImageFile @@ -2457,6 +2588,7 @@ static void UI_FreeSpecies( playerSpeciesInfo_t *species ) free(species->SkinHead); free(species->SkinTorso); free(species->SkinLeg); + free(species->HeadSwap); free(species->Color); free(species->Color2); memset(species, 0, sizeof(playerSpeciesInfo_t)); @@ -2566,6 +2698,7 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) species->SkinLegMax = 8; species->SkinHead = (skinName_t *)malloc(species->SkinHeadMax * sizeof(skinName_t)); + species->HeadSwap = (headSwap_t *)malloc(species->SkinHeadMax * sizeof(headSwap_t)); species->SkinTorso = (skinName_t *)malloc(species->SkinTorsoMax * sizeof(skinName_t)); species->SkinLeg = (skinName_t *)malloc(species->SkinLegMax * sizeof(skinName_t)); @@ -2615,9 +2748,19 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) { species->SkinHeadMax *= 2; species->SkinHead = (skinName_t *)realloc(species->SkinHead, species->SkinHeadMax*sizeof(skinName_t)); + species->HeadSwap = (headSwap_t *)realloc(species->HeadSwap, species->SkinHeadMax*sizeof(headSwap_t)); } + memset(&species->HeadSwap[species->SkinHeadCount], 0, sizeof(headSwap_t)); Q_strncpyz(species->SkinHead[species->SkinHeadCount++].name, skinname, SKIN_LENGTH); iSkinParts |= 1<<0; + int headSwapFileLen = ui.FS_FOpenFile(va("models/players/%s/%s.headswap",dirptr,skinname), &f, FS_READ); + if (f) + { + ui.FS_Read(&buffer, headSwapFileLen, f); + ui.FS_FCloseFile(f); + buffer[headSwapFileLen] = 0; + UI_ParseHeadSwapData(buffer.data(),*species); + } } else if (Q_stricmpn(skinname,"torso_",6) == 0) { @@ -2774,6 +2917,10 @@ void _UI_Init( qboolean inGameLoad ) uiInfo.uiDC.g2_GiveMeVectorFromMatrix = re.G2API_GiveMeVectorFromMatrix; uiInfo.uiDC.g2hilev_SetAnim = UI_G2SetAnim; + + uiInfo.uiDC.g2_SetSurfaceOnOff = re.G2API_SetSurfaceOnOff; + + uiInfo.uiDC.g2_SetRootSurface = re.G2API_SetRootSurface; UI_BuildPlayerModel_List(inGameLoad); @@ -4380,6 +4527,8 @@ static void UI_UpdateCharacterCvars ( void ) Cvar_Set ( "g_char_color_red", Cvar_VariableString ( "ui_char_color_red" ) ); Cvar_Set ( "g_char_color_green", Cvar_VariableString ( "ui_char_color_green" ) ); Cvar_Set ( "g_char_color_blue", Cvar_VariableString ( "ui_char_color_blue" ) ); + Cvar_Set ( "g_char_head_model", Cvar_VariableString ( "ui_char_head_model" ) ); + Cvar_Set ( "g_char_head_skin", Cvar_VariableString ( "ui_char_head_skin" ) ); } static void UI_GetCharacterCvars ( void ) @@ -4391,6 +4540,9 @@ static void UI_GetCharacterCvars ( void ) Cvar_Set ( "ui_char_color_green", Cvar_VariableString ( "g_char_color_green" ) ); Cvar_Set ( "ui_char_color_blue", Cvar_VariableString ( "g_char_color_blue" ) ); + Cvar_Set ( "ui_char_head_model", Cvar_VariableString ( "g_char_head_model" ) ); + Cvar_Set ( "ui_char_head_skin", Cvar_VariableString ( "g_char_head_skin" ) ); + const char* model = Cvar_VariableString ( "g_char_model" ); Cvar_Set ( "ui_char_model", model ); @@ -6312,6 +6464,18 @@ static void UI_UpdateCharacterSkin( void ) { Com_Error( ERR_FATAL, "UI_UpdateCharacterSkin: Could not find item (character) in menu (%s)", menu->window.name); } + + + if (Cvar_VariableString( "ui_char_head_model" )[0]) + { + Com_sprintf( skin, sizeof( skin ), "models/players/%s/model.glm", Cvar_VariableString ( "ui_char_head_model" ) ); + ItemParse_asset_model_go_head( item, skin, qfalse ); + } + else + { + ItemParse_asset_model_go_head( item, NULL, qtrue ); + } + Com_sprintf( skin, sizeof( skin ), "models/players/%s/|%s|%s|%s", Cvar_VariableString ( "ui_char_model"), @@ -6321,6 +6485,36 @@ static void UI_UpdateCharacterSkin( void ) ); ItemParse_model_g2skin_go( item, skin ); + + if (Cvar_VariableString( "ui_char_head_model" )[0]) + { + if (Cvar_VariableString( "ui_char_head_skin" )[0]) + { + Com_sprintf( skin, sizeof( skin), "models/players/%s/model_%s.skin", Cvar_VariableString("ui_char_head_model"), Cvar_VariableString("ui_char_head_skin")); + if (!DC->registerSkin( skin )) + { + //What if it's a 3-parter or one part of a 3-parter? + if (strchr(Cvar_VariableString( "ui_char_head_skin" ), '|')) + { + Com_sprintf( skin, sizeof( skin ), "models/players/%s/|%s", Cvar_VariableString("ui_char_head_model"), Cvar_VariableString("ui_char_head_skin")); + } + else + { + Com_sprintf( skin, sizeof( skin ), "models/players/%s/%s.skin", Cvar_VariableString("ui_char_head_model"), Cvar_VariableString("ui_char_head_skin")); + } + } + } + else + { + Com_sprintf( skin, sizeof( skin), "models/players/%s/model_default.skin", Cvar_VariableString("ui_char_head_model")); + } + ItemParse_model_g2skin_go_head( item, skin ); + } + + if (Cvar_VariableString( "ui_char_head_model" )[0]) + { + ItemParse_swapheads( item ); + } } static void UI_UpdateCharacter( qboolean changedModel ) @@ -6347,7 +6541,7 @@ static void UI_UpdateCharacter( qboolean changedModel ) Com_sprintf( modelPath, sizeof( modelPath ), "models/players/%s/model.glm", Cvar_VariableString ( "ui_char_model" ) ); ItemParse_asset_model_go( item, modelPath ); - + if ( changedModel ) {//set all skins to first skin since we don't know you always have all skins //FIXME: could try to keep the same spot in each list as you swtich models diff --git a/code/ui/ui_saber.cpp b/code/ui/ui_saber.cpp index cda324878b..1909d486c6 100644 --- a/code/ui/ui_saber.cpp +++ b/code/ui/ui_saber.cpp @@ -578,6 +578,7 @@ void UI_SaberDrawBlade( itemDef_t *item, char *saberName, int saberModel, saberT char bladeColorString[MAX_QPATH]; vec3_t angles={0}; int whichSaber = 0; + int secondSaberModel; if ( item->flags&(ITF_ISANYSABER) && item->flags&(ITF_ISCHARACTER) ) { //it's bolted to a dude! @@ -594,7 +595,16 @@ void UI_SaberDrawBlade( itemDef_t *item, char *saberName, int saberModel, saberT return; } - if ( (item->flags&ITF_ISSABER) && saberModel < 2 ) + if (Cvar_VariableString( "ui_char_head_model" )[0]) + { + secondSaberModel = 3; + } + else + { + secondSaberModel = 2; + } + + if ( (item->flags&ITF_ISSABER) && saberModel < secondSaberModel ) { whichSaber = 0; } @@ -878,7 +888,14 @@ void UI_SaberDrawBlades( itemDef_t *item, vec3_t origin, float curYaw ) if ( (item->flags&ITF_ISCHARACTER) )//hacked sabermoves sabers in character's hand { UI_GetSaberForMenu( saber, saberNum ); - saberModel = saberNum + 1; + if (Cvar_VariableString( "ui_char_head_model" )[0]) + { + saberModel = saberNum + 2; + } + else + { + saberModel = saberNum + 1; + } } else if ( (item->flags&ITF_ISSABER) ) { @@ -919,13 +936,27 @@ 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 (Cvar_VariableString( "ui_char_head_model" )[0]) + { + if ( item->ghoul2.size() > 3 && item->ghoul2[3].mModelindex >=0 ) + {//remove any extra models + DC->g2_RemoveGhoul2Model(item->ghoul2, 3); + } + 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); + else + { + 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*/ ) diff --git a/code/ui/ui_shared.cpp b/code/ui/ui_shared.cpp index 00614b1d14..2eee1f42ae 100644 --- a/code/ui/ui_shared.cpp +++ b/code/ui/ui_shared.cpp @@ -3190,6 +3190,10 @@ qboolean ItemParse_asset_model_go( itemDef_t *item, const char *name ) { //it's a ghoul2 model then if ( item->ghoul2.size() && item->ghoul2[0].mModelindex >= 0) { + if ( item->ghoul2.size() > 1 && item->ghoul2[1].mModelindex >= 0) + { + DC->g2_RemoveGhoul2Model( item->ghoul2, 1 ); + } DC->g2_RemoveGhoul2Model( item->ghoul2, 0 ); item->flags &= ~ITF_G2VALID; } @@ -3216,7 +3220,46 @@ qboolean ItemParse_asset_model_go( itemDef_t *item, const char *name ) return qtrue; } -qboolean ItemParse_asset_model( itemDef_t *item ) +qboolean ItemParse_asset_model_go_head( itemDef_t *item, const char *name, qboolean cleanuponly ) +{ + modelDef_t *modelPtr; + Item_ValidateTypeData(item); + modelPtr = (modelDef_t*)item->typeData; + + //Cleanup also done in ItemParse_asset_model_go + if ( item->ghoul2.size() > 1 && item->ghoul2[1].mModelindex >= 0 ) + { + DC->g2_RemoveGhoul2Model( item->ghoul2, 1 ); + } + + if ( cleanuponly ) + { + return qtrue; + } + + if (!Q_stricmp(&name[strlen(name) - 4], ".glm")) + { //it's a ghoul2 model then + int g2Model = DC->g2_InitGhoul2Model(item->ghoul2, name, 0, 0, 0, 0, 0); + //NOTE: it still loads the default skin's tga's because they're referenced in the .glm. + + if (g2Model >= 0) + { + if (modelPtr->g2anim) + { //does the menu request this model be playing an animation? + DC->g2hilev_SetAnim(&item->ghoul2[1], "model_root", modelPtr->g2anim, qfalse); + //need to sync the head and body! + DC->g2hilev_SetAnim(&item->ghoul2[0], "model_root", modelPtr->g2anim, qfalse); + } + if ( modelPtr->g2skin2 ) + { + DC->g2_SetSkin( &item->ghoul2[1], modelPtr->g2skin2, modelPtr->g2skin2 );//this is going to set the surfs on/off matching the skin file + } + } + } + return qtrue; +} + +qboolean ItemParse_asset_model( itemDef_t *item ) { const char *temp; Item_ValidateTypeData(item); @@ -3413,7 +3456,46 @@ qboolean ItemParse_model_g2skin_go( itemDef_t *item, const char *skinName ) return qtrue; } -qboolean ItemParse_model_g2skin( itemDef_t *item ) +qboolean ItemParse_model_g2skin_go_head( itemDef_t *item, const char *skinName ) +{ + modelDef_t *modelPtr; + + Item_ValidateTypeData(item); + modelPtr = (modelDef_t*)item->typeData; + + if (!skinName || !skinName[0]) + { //it was parsed cor~rectly so still return true. + modelPtr->g2skin2 = 0; + DC->g2_SetSkin( &item->ghoul2[1], -1, 0 );//turn off custom skin + return qtrue; + } + + modelPtr->g2skin2 = DC->registerSkin(skinName); +// Com_Printf("loaded skin %d\n", modelPtr->g2skin2); + if ( item->ghoul2.IsValid() && item->ghoul2.size() > 1 && item->ghoul2[1].mModelindex >= 0 ) + { + DC->g2_SetSkin( &item->ghoul2[1], modelPtr->g2skin2, modelPtr->g2skin2 );//this is going to set the surfs on/off matching the skin file + } +// Com_Printf("forced skin %d\n", item->ghoul2[1].mCustomSkin); + + return qtrue; +} + +void ItemParse_swapheads( itemDef_t *item ) +{ + if ( item->ghoul2.IsValid() ) + { + DC->g2_SetSurfaceOnOff( &item->ghoul2[0], "head", G2SURFACEFLAG_NODESCENDANTS); + DC->g2_SetSurfaceOnOff( &item->ghoul2[0], "torso_cap_head", 0x00); + if (item->ghoul2[1].mValid && item->ghoul2[1].mModelindex >= 0) + { + DC->g2_SetRootSurface( item->ghoul2, 1, "head"); + DC->g2_SetSurfaceOnOff( &item->ghoul2[1], "head_cap_torso", 0x00);//show caps so don't get such bad seams + } + } +} + +qboolean ItemParse_model_g2skin( itemDef_t *item ) { const char *skinName; @@ -7263,6 +7345,10 @@ void Item_Model_Paint(itemDef_t *item) break; } } + if (Cvar_VariableString( "ui_char_head_model" )[0]) + { + DC->g2hilev_SetAnim(&item->ghoul2[1], "model_root", modelPtr->g2anim, qtrue); + } } // setup the refdef diff --git a/code/ui/ui_shared.h b/code/ui/ui_shared.h index a661370136..1cf6409842 100644 --- a/code/ui/ui_shared.h +++ b/code/ui/ui_shared.h @@ -218,6 +218,10 @@ typedef struct { qboolean (*g2_GetBoltMatrix)(CGhoul2Info_v &ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix, const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, const vec3_t scale); void (*g2_GiveMeVectorFromMatrix)(mdxaBone_t &boltMatrix, Eorientations flags, vec3_t &vec); + + qboolean (*g2_SetSurfaceOnOff)(CGhoul2Info *ghlInfo, const char *surfaceName, const int flags); + + qboolean (*g2_SetRootSurface)(CGhoul2Info_v &ghlInfo, const int modelIndex, const char *surfaceName); //Utility functions that don't immediately redirect to ghoul2 functions int (*g2hilev_SetAnim)(CGhoul2Info *ghlInfo, const char *boneName, int animNum, const qboolean freeze); @@ -339,6 +343,7 @@ typedef struct modelDef_s { //Transition extras vec3_t g2mins2, g2maxs2, g2minsEffect, g2maxsEffect; float fov_x2, fov_y2, fov_Effectx, fov_Effecty; + int g2skin2; } modelDef_t; #define ITF_G2VALID 0x0001 // indicates whether or not g2 instance is valid. From 9934642ae7471e5a215c6d317612063f40b74a37 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Tue, 3 Sep 2013 23:12:58 +0100 Subject: [PATCH 377/445] UI: Added integer valued slider --- code/ui/menudef.h | 1 + code/ui/ui_shared.cpp | 124 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 122 insertions(+), 3 deletions(-) diff --git a/code/ui/menudef.h b/code/ui/menudef.h index 35eba263dc..c965b505df 100644 --- a/code/ui/menudef.h +++ b/code/ui/menudef.h @@ -35,6 +35,7 @@ along with this program; if not, see . #define ITEM_TYPE_MULTI 12 // multiple list setting, enumerated #define ITEM_TYPE_BIND 13 // multiple list setting, enumerated #define ITEM_TYPE_TEXTSCROLL 14 // scrolling text +#define ITEM_TYPE_SLIDER_INTEGER 15 #define ITEM_ALIGN_LEFT 0 // left alignment diff --git a/code/ui/ui_shared.cpp b/code/ui/ui_shared.cpp index 2eee1f42ae..a374c08e59 100644 --- a/code/ui/ui_shared.cpp +++ b/code/ui/ui_shared.cpp @@ -176,6 +176,7 @@ const char *types [] = { "ITEM_TYPE_MULTI", "ITEM_TYPE_BIND", "ITEM_TYPE_TEXTSCROLL", +"ITEM_TYPE_SLIDER_INTEGER", NULL }; @@ -4471,6 +4472,7 @@ qboolean ItemParse_cvar( itemDef_t *item) case ITEM_TYPE_YESNO: case ITEM_TYPE_BIND: case ITEM_TYPE_SLIDER: + case ITEM_TYPE_SLIDER_INTEGER: case ITEM_TYPE_TEXT: case ITEM_TYPE_TEXTSCROLL: editPtr = (editFieldDef_t*)item->typeData; @@ -4870,8 +4872,8 @@ void Item_ValidateTypeData(itemDef_t *item) { item->typeData = UI_Alloc(sizeof(listBoxDef_t)); memset(item->typeData, 0, sizeof(listBoxDef_t)); - } - else if (item->type == ITEM_TYPE_EDITFIELD || item->type == ITEM_TYPE_NUMERICFIELD || item->type == ITEM_TYPE_YESNO || item->type == ITEM_TYPE_BIND || item->type == ITEM_TYPE_SLIDER || item->type == ITEM_TYPE_TEXT) + } + else if (item->type == ITEM_TYPE_EDITFIELD || item->type == ITEM_TYPE_NUMERICFIELD || item->type == ITEM_TYPE_YESNO || item->type == ITEM_TYPE_BIND || item->type == ITEM_TYPE_SLIDER || item->type == ITEM_TYPE_SLIDER_INTEGER || item->type == ITEM_TYPE_TEXT) { item->typeData = UI_Alloc(sizeof(editFieldDef_t)); memset(item->typeData, 0, sizeof(editFieldDef_t)); @@ -8445,6 +8447,7 @@ static qboolean Item_Paint(itemDef_t *item, qboolean bDraw) Item_Bind_Paint(item); break; case ITEM_TYPE_SLIDER: + case ITEM_TYPE_SLIDER_INTEGER: Item_Slider_Paint(item); break; default: @@ -10684,6 +10687,45 @@ int Item_Slider_OverSlider(itemDef_t *item, float x, float y) return 0; } +/* + ================= + Scroll_Slider_Integer_ThumbFunc + ================= + */ +static void Scroll_Slider_Integer_ThumbFunc(void *p) +{ + float x, value, cursorx; + int intValue; + scrollInfo_t *si = (scrollInfo_t*)p; + editFieldDef_t *editDef = (struct editFieldDef_s *) si->item->typeData; + + if (si->item->text) + { + x = si->item->textRect.x + si->item->textRect.w + 8; + } + else + { + x = si->item->window.rect.x; + } + + cursorx = DC->cursorx; + + if (cursorx < x) + { + cursorx = x; + } + else if (cursorx > x + SLIDER_WIDTH) + { + cursorx = x + SLIDER_WIDTH; + } + value = cursorx - x; + value /= SLIDER_WIDTH; + value *= (editDef->maxVal - editDef->minVal); + value += editDef->minVal; + intValue = (int) value; + DC->setCVar(si->item->cvar, va("%d", intValue)); +} + /* ================= Scroll_Slider_ThumbFunc @@ -10802,6 +10844,21 @@ void Item_StartCapture(itemDef_t *item, int key) } break; } + case ITEM_TYPE_SLIDER_INTEGER: + { + flags = Item_Slider_OverSlider(item, DC->cursorx, DC->cursory); + if (flags & WINDOW_LB_THUMB) + { + scrollInfo.scrollKey = key; + scrollInfo.item = item; + scrollInfo.xStart = DC->cursorx; + scrollInfo.yStart = DC->cursory; + captureData = &scrollInfo; + captureFunc = &Scroll_Slider_Integer_ThumbFunc; + itemCapture = item; + } + break; + } } } @@ -11084,6 +11141,64 @@ qboolean Item_Slider_HandleKey(itemDef_t *item, int key, qboolean down) return qfalse; } +/* + ================= + Item_Slider_HandleKey + ================= + */ +qboolean Item_Slider_Integer_HandleKey(itemDef_t *item, int key, qboolean down) +{ + //DC->Print("slider handle key\n"); + //JLF MPMOVED + + float x, value, width, work; + + if (item->window.flags & WINDOW_HASFOCUS && item->cvar && Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory)) + { + + if (key == A_MOUSE1 || key == A_ENTER || key == A_MOUSE2 || key == A_MOUSE3) + { + editFieldDef_t *editDef = (editFieldDef_s *) item->typeData; + if (editDef) + { + rectDef_t testRect; + width = SLIDER_WIDTH; + if (item->text) + { + x = item->textRect.x + item->textRect.w + 8; + } + else + { + x = item->window.rect.x; + } + + testRect = item->window.rect; + testRect.x = x; + value = (float)SLIDER_THUMB_WIDTH / 2; + testRect.x -= value; + //DC->Print("slider x: %f\n", testRect.x); + testRect.w = (SLIDER_WIDTH + (float)SLIDER_THUMB_WIDTH / 2); + //DC->Print("slider w: %f\n", testRect.w); + if (Rect_ContainsPoint(&testRect, DC->cursorx, DC->cursory)) + { + work = DC->cursorx - x; + value = work / width; + value *= (editDef->maxVal - editDef->minVal); + // vm fuckage + // value = (((float)(DC->cursorx - x)/ SLIDER_WIDTH) * (editDef->maxVal - editDef->minVal)); + value += editDef->minVal; + int intValue = (int) value; + DC->setCVar(item->cvar, va("%d", intValue)); + return qtrue; + } + } + } + } + + //DC->Print("slider handle key exit\n"); + return qfalse; +} + /* ================= Item_HandleKey @@ -11152,6 +11267,9 @@ qboolean Item_HandleKey(itemDef_t *item, int key, qboolean down) case ITEM_TYPE_SLIDER: return Item_Slider_HandleKey(item, key, down); break; + case ITEM_TYPE_SLIDER_INTEGER: + return Item_Slider_Integer_HandleKey(item, key, down); + break; //JLF MPMOVED case ITEM_TYPE_TEXT: return Item_Text_HandleKey(item, key); @@ -11429,7 +11547,7 @@ void Menu_HandleKey(menuDef_t *menu, int key, qboolean down) should just process the action and not support the accept functionality. */ //JLFACCEPT - else if ( item->type == ITEM_TYPE_MULTI || item->type == ITEM_TYPE_YESNO || item->type == ITEM_TYPE_SLIDER) + else if ( item->type == ITEM_TYPE_MULTI || item->type == ITEM_TYPE_YESNO || item->type == ITEM_TYPE_SLIDER || item->type == ITEM_TYPE_SLIDER_INTEGER ) { if (Item_HandleAccept(item)) From d4f3006cdeb308cd73b994d0459dfd3ff134c40d Mon Sep 17 00:00:00 2001 From: redsaurus Date: Tue, 24 Dec 2013 13:25:04 +0000 Subject: [PATCH 378/445] General: rename products and add icons --- CMakeLists.txt | 6 +++--- code/CMakeLists.txt | 5 +++-- code/client/cl_cgame.cpp | 2 +- code/client/cl_main.cpp | 2 +- code/game/CMakeLists.txt | 6 +++--- code/game/g_local.h | 2 +- code/macosx/English.lproj/InfoPlist.strings | Bin 224 -> 276 bytes code/macosx/JKEnhanced.icns | Bin 0 -> 57778 bytes code/macosx/OpenJK.icns | Bin 246869 -> 0 bytes code/macosx/OpenJKInfo.plist | 2 +- code/qcommon/files.cpp | 2 +- code/qcommon/q_shared.h | 12 ++++++------ code/qcommon/stv_version.h | 6 +++--- code/rd-common/tr_public.h | 3 ++- code/server/sv_game.cpp | 2 +- code/win32/AutoVersion.h | 2 +- code/win32/jkenhanced.ico | Bin 0 -> 285478 bytes code/win32/winquake.rc | 8 ++++---- 18 files changed, 31 insertions(+), 29 deletions(-) create mode 100644 code/macosx/JKEnhanced.icns delete mode 100644 code/macosx/OpenJK.icns create mode 100644 code/win32/jkenhanced.ico diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a17d4d764..6232aece9d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -143,9 +143,9 @@ message("Git revision is ${GIT_SHA1}") # Binary names -set(SPEngine "openjk_sp.${Architecture}") -set(SPGame "jagame${Architecture}") -set(SPRDVanillaRenderer "rdsp-vanilla_${Architecture}") +set(SPEngine "ja_enhanced.${Architecture}") +set(SPGame "jaenhancedgame${Architecture}") +set(SPRDVanillaRenderer "rdcustomsp-vanilla_${Architecture}") set(MPEngine "openjk.${Architecture}") set(MPVanillaRenderer "rd-vanilla_${Architecture}") set(MPDed "openjkded.${Architecture}") diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 34525c4542..292bd2a3a4 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -321,6 +321,7 @@ if(BuildSPEngine OR BuildJK2SPEngine) if(WIN32) set(SPEngineWin32Files + "${SPDir}/win32/jkenhanced.ico" "${SPDir}/win32/resource.h" "${SPDir}/win32/winquake.rc" ) @@ -371,8 +372,8 @@ if(BuildSPEngine OR BuildJK2SPEngine) # project macro so we can invoke it twice: for jk2 and for ja function(add_sp_project ProjectName Label SPDirName InstallDir Component) if(MakeApplicationBundles) - set_source_files_properties(${SPDirName}/macosx/OpenJK.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) - set(SPEngineFiles ${SPEngineFiles} ${SPDirName}/macosx/OpenJK.icns) + set_source_files_properties(${SPDirName}/macosx/JKEnhanced.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + set(SPEngineFiles ${SPEngineFiles} ${SPDirName}/macosx/JKEnhanced.icns) set_source_files_properties(${SPDirName}/macosx/English.lproj/InfoPlist.strings PROPERTIES MACOSX_PACKAGE_LOCATION Resources/English.lproj) set(SPEngineFiles ${SPEngineFiles} ${SPDirName}/macosx/English.lproj/InfoPlist.strings) endif(MakeApplicationBundles) diff --git a/code/client/cl_cgame.cpp b/code/client/cl_cgame.cpp index 70b6534353..c70e8d929c 100644 --- a/code/client/cl_cgame.cpp +++ b/code/client/cl_cgame.cpp @@ -70,7 +70,7 @@ qboolean CL_InitCGameVM( void *gameLibrary ) #ifdef JK2_MODE const char *gamename = "jospgame"; #else - const char *gamename = "jagame"; + const char *gamename = "jaenhancedgame"; #endif Com_Printf( "CL_InitCGameVM: client game entry point not found in %s" ARCH_STRING DLL_EXT ": %s\n", diff --git a/code/client/cl_main.cpp b/code/client/cl_main.cpp index f4b7acc0e8..e4913ebe52 100644 --- a/code/client/cl_main.cpp +++ b/code/client/cl_main.cpp @@ -1074,7 +1074,7 @@ static CMiniHeap *GetG2VertSpaceServer( void ) { #ifdef JK2_MODE #define DEFAULT_RENDER_LIBRARY "rdjosp-vanilla" #else -#define DEFAULT_RENDER_LIBRARY "rdsp-vanilla" +#define DEFAULT_RENDER_LIBRARY "rdcustomsp-vanilla" #endif void CL_InitRef( void ) { diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 4c0a81c9da..eae085742c 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -385,18 +385,18 @@ endif() if(WIN32) install(TARGETS ${SPGame} RUNTIME - DESTINATION "${JKAInstallDir}/OpenJK" + DESTINATION "${JKAInstallDir}/jaenhanced" COMPONENT ${JKASPClientComponent}) else(WIN32) if(MakeApplicationBundles AND BuildSPEngine) install(TARGETS ${SPGame} LIBRARY - DESTINATION "${JKAInstallDir}/${SPEngine}.app/Contents/MacOS/OpenJK" + DESTINATION "${JKAInstallDir}/${SPEngine}.app/Contents/MacOS/jaenhanced" COMPONENT ${JKASPClientComponent}) else() install(TARGETS ${SPGame} LIBRARY - DESTINATION "${JKAInstallDir}/OpenJK" + DESTINATION "${JKAInstallDir}/jaenhanced" COMPONENT ${JKASPClientComponent}) endif() endif() diff --git a/code/game/g_local.h b/code/game/g_local.h index 73acc265e4..0894035b3c 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -37,7 +37,7 @@ along with this program; if not, see . //================================================================== // the "gameversion" client command will print this plus compile date -#define GAMEVERSION "OpenJK" +#define GAMEVERSION "Jedi Academy: Enhanced" #define BODY_QUEUE_SIZE 8 diff --git a/code/macosx/English.lproj/InfoPlist.strings b/code/macosx/English.lproj/InfoPlist.strings index d7a1d4ad2f8bddb18d3f7304319b76bea56ee757..7eff2959b7db0b37b834f3d6dace242d50b2ffee 100755 GIT binary patch delta 104 zcmaFBIE86KowgT4DnklGCW8WlBSSJnB9NWRkjqfXU07>ZzT>t<8 diff --git a/code/macosx/JKEnhanced.icns b/code/macosx/JKEnhanced.icns new file mode 100644 index 0000000000000000000000000000000000000000..2cec61d6abf349529cb9a13120731e055c843d79 GIT binary patch literal 57778 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 literal 0 HcmV?d00001 diff --git a/code/macosx/OpenJK.icns b/code/macosx/OpenJK.icns deleted file mode 100644 index 9bb472bab4e5c9f566ac0fb8a9e44be71a3f2dc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246869 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 z8)s~4477V%Uq9oCFBundleGetInfoString ${MACOSX_BUNDLE_INFO_STRING} CFBundleIconFile - OpenJK.icns + JKEnhanced.icns CFBundleIdentifier ${MACOSX_BUNDLE_GUI_IDENTIFIER} CFBundleInfoDictionaryVersion diff --git a/code/qcommon/files.cpp b/code/qcommon/files.cpp index 24e9290891..d6934ff39b 100644 --- a/code/qcommon/files.cpp +++ b/code/qcommon/files.cpp @@ -2866,7 +2866,7 @@ void FS_Startup( const char *gameName ) { homePath = fs_basepath->string; } fs_homepath = Cvar_Get ("fs_homepath", homePath, CVAR_INIT|CVAR_PROTECTED ); - fs_gamedirvar = Cvar_Get ("fs_game", "", CVAR_INIT|CVAR_SYSTEMINFO ); + fs_gamedirvar = Cvar_Get ("fs_game", "jaenhanced", CVAR_INIT|CVAR_SYSTEMINFO ); fs_dirbeforepak = Cvar_Get("fs_dirbeforepak", "0", CVAR_INIT|CVAR_PROTECTED); diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 4c8ffa2ae6..414dc90cd4 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -73,17 +73,17 @@ along with this program; if not, see . #define HOMEPATH_NAME_WIN "OpenJO" #define HOMEPATH_NAME_MACOSX HOMEPATH_NAME_WIN #else -#define PRODUCT_NAME "openjk_sp" +#define PRODUCT_NAME "jaenhanced_sp" -#define CLIENT_WINDOW_TITLE "OpenJK (SP)" -#define CLIENT_CONSOLE_TITLE "OpenJK Console (SP)" -#define HOMEPATH_NAME_UNIX "openjk" -#define HOMEPATH_NAME_WIN "OpenJK" +#define CLIENT_WINDOW_TITLE "Jedi Academy: Enhanced" +#define CLIENT_CONSOLE_TITLE "Jedi Academy: Enhanced Console" +#define HOMEPATH_NAME_UNIX "jaenhanced" +#define HOMEPATH_NAME_WIN "JAEnhanced" #define HOMEPATH_NAME_MACOSX HOMEPATH_NAME_WIN #endif #define BASEGAME "base" -#define OPENJKGAME "OpenJK" +#define OPENJKGAME "jaenhanced" #define Q3CONFIG_NAME PRODUCT_NAME ".cfg" diff --git a/code/qcommon/stv_version.h b/code/qcommon/stv_version.h index be9f98c098..47453c0df4 100644 --- a/code/qcommon/stv_version.h +++ b/code/qcommon/stv_version.h @@ -24,11 +24,11 @@ along with this program; if not, see . #include "../win32/AutoVersion.h" #ifdef _DEBUG - #define Q3_VERSION "(debug)OpenJK: v" VERSION_STRING_DOTTED + #define Q3_VERSION "(debug)Jedi Academy: Enhanced: v" VERSION_STRING_DOTTED #elif defined FINAL_BUILD - #define Q3_VERSION "OpenJK: v" VERSION_STRING_DOTTED + #define Q3_VERSION "Jedi Academy: Enhanced: v" VERSION_STRING_DOTTED #else - #define Q3_VERSION "(internal)OpenJK: v" VERSION_STRING_DOTTED + #define Q3_VERSION "(internal)Jedi Academy: Enhanced: v" VERSION_STRING_DOTTED #endif // end diff --git a/code/rd-common/tr_public.h b/code/rd-common/tr_public.h index 1ea046db64..82387c7a84 100644 --- a/code/rd-common/tr_public.h +++ b/code/rd-common/tr_public.h @@ -30,7 +30,8 @@ along with this program; if not, see . #include "../ghoul2/G2.h" #include "../ghoul2/ghoul2_gore.h" -#define REF_API_VERSION 17 +#define JAE_REF_API_OFFSET 128 +#define REF_API_VERSION 17 + JAE_REF_API_OFFSET typedef struct { void (QDECL *Printf) ( int printLevel, const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); diff --git a/code/server/sv_game.cpp b/code/server/sv_game.cpp index 8cd596fbe7..9c692f5402 100644 --- a/code/server/sv_game.cpp +++ b/code/server/sv_game.cpp @@ -1051,7 +1051,7 @@ void SV_InitGameProgs (void) { #ifdef JK2_MODE const char *gamename = "jospgame"; #else - const char *gamename = "jagame"; + const char *gamename = "jaenhancedgame"; #endif GetGameAPIProc *GetGameAPI; diff --git a/code/win32/AutoVersion.h b/code/win32/AutoVersion.h index 841c109e4b..838c42054b 100644 --- a/code/win32/AutoVersion.h +++ b/code/win32/AutoVersion.h @@ -24,7 +24,7 @@ This file is part of Jedi Academy. #define VERSION_INTERNAL_BUILD 1 #define VERSION_STRING "1, 0, 1, 1" -#define VERSION_STRING_DOTTED "1.0.1.1" +#define VERSION_STRING_DOTTED "1.0" #define VERSION_BUILD_NUMBER 80 diff --git a/code/win32/jkenhanced.ico b/code/win32/jkenhanced.ico new file mode 100644 index 0000000000000000000000000000000000000000..6528732f857b6e2cf03e089470c7ec1b5d91099f GIT binary patch literal 285478 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 literal 0 HcmV?d00001 diff --git a/code/win32/winquake.rc b/code/win32/winquake.rc index 8be20e493c..ca20a56e58 100644 --- a/code/win32/winquake.rc +++ b/code/win32/winquake.rc @@ -53,7 +53,7 @@ END // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -IDI_ICON1 ICON "starwars.ico" +IDI_ICON1 ICON "jkenhanced.ico" ///////////////////////////////////////////////////////////////////////////// // @@ -80,12 +80,12 @@ BEGIN BEGIN VALUE "Comments", "Raven Software" VALUE "CompanyName", "Activision Inc" - VALUE "FileDescription", "OpenJK Singleplayer" + VALUE "FileDescription", "Jedi Academy: Enhanced" VALUE "FileVersion", VERSION_STRING VALUE "InternalName", "JASP" - VALUE "LegalCopyright", "Copyright (C) 2013" + VALUE "LegalCopyright", "Copyright (C) 2015" VALUE "OriginalFilename", "jasp.exe" - VALUE "ProductName", "OpenJK Singleplayer" + VALUE "ProductName", "Jedi Academy: Enhanced" VALUE "ProductVersion", VERSION_STRING END END From 477c831e3a84a74ff4b2ce2c32fd35ac830427d2 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sat, 7 Jan 2017 15:19:26 +0000 Subject: [PATCH 379/445] SP: Support for entity keys with /spawn e.g. spawn fx_runner fxFile the/file --- code/game/g_cmds.cpp | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/code/game/g_cmds.cpp b/code/game/g_cmds.cpp index 2c36f48464..3395a3ce8d 100644 --- a/code/game/g_cmds.cpp +++ b/code/game/g_cmds.cpp @@ -611,8 +611,8 @@ UserSpawn */ extern qboolean G_CallSpawn( gentity_t *ent ); - -void UserSpawn( gentity_t *ent, const char *name ) +extern void G_ParseField( const char *key, const char *value, gentity_t *ent ); +void UserSpawn( gentity_t *ent, const char *name, int numargs ) { vec3_t origin; vec3_t vf; @@ -621,6 +621,14 @@ void UserSpawn( gentity_t *ent, const char *name ) //Spawn the ent ent2 = G_Spawn(); + + int numSpawnVars = numargs / 2; + + //entity keys now supported + for ( int i = 0 ; i < numSpawnVars ; i++ ) { + G_ParseField( gi.argv(2 + i * 2), gi.argv(3 + i * 2), ent2 ); + } + ent2->classname = G_NewString( name ); //TODO: This should ultimately make sure this is a safe spawn! @@ -654,13 +662,23 @@ Cmd_Spawn void Cmd_Spawn( gentity_t *ent ) { + int numArgs; char *name; - - name = ConcatArgs( 1 ); - + + numArgs = gi.argc(); + + if (numArgs > 1) + { + name = gi.argv(1); + } + else + { + name = ""; + } + gi.SendServerCommand( ent-g_entities, "print \"Spawning '%s'\n\"", name ); - UserSpawn( ent, name ); + UserSpawn( ent, name, numArgs - 2 ); } /* From ff2f371931ca8b8375e664801bb603d696e94aca Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sat, 7 Jan 2017 13:59:41 +0000 Subject: [PATCH 380/445] Extra entity tints: support for additional colour slots Allows for extra customisable player colour. --- code/cgame/cg_players.cpp | 8 +++ code/game/g_client.cpp | 24 ++++++++ code/game/g_main.cpp | 9 +++ code/game/g_shared.h | 1 + code/game/g_svcmds.cpp | 23 ++++++++ code/rd-common/tr_types.h | 3 + code/rd-vanilla/tr_local.h | 7 +++ code/rd-vanilla/tr_shade.cpp | 19 +++++++ code/rd-vanilla/tr_shade_calc.cpp | 91 +++++++++++++++++++++++++++++++ code/rd-vanilla/tr_shader.cpp | 30 +++++++++- code/ui/ui_atoms.cpp | 4 ++ code/ui/ui_main.cpp | 18 ++++++ code/ui/ui_shared.cpp | 8 +++ 13 files changed, 243 insertions(+), 2 deletions(-) diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index cbfa3ba91a..b2c0d01a76 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -4699,6 +4699,14 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen ent->shaderRGBA[1] = gent->client->renderInfo.customRGBA[1]; ent->shaderRGBA[2] = gent->client->renderInfo.customRGBA[2]; ent->shaderRGBA[3] = gent->client->renderInfo.customRGBA[3]; + + for (int index = 0; index < MAX_NEW_ENT_RGB; index++) + { + ent->newShaderRGBA[index][0] = gent->client->renderInfo.newCustomRGBA[index][0]; + ent->newShaderRGBA[index][1] = gent->client->renderInfo.newCustomRGBA[index][1]; + ent->newShaderRGBA[index][2] = gent->client->renderInfo.newCustomRGBA[index][2]; + ent->newShaderRGBA[index][3] = gent->client->renderInfo.newCustomRGBA[index][3]; + } // If certain states are active, we don't want to add in the regular body if ( !gent->client->ps.powerups[PW_CLOAKED] && diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index 80222aa116..4d4d373da9 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -53,6 +53,10 @@ extern cvar_t *g_saberDarkSideSaberColor; extern cvar_t *g_char_head_model; extern cvar_t *g_char_head_skin; +extern cvar_t *g_char_color_2_red; +extern cvar_t *g_char_color_2_green; +extern cvar_t *g_char_color_2_blue; + // g_client.c -- client functions that don't happen every frame float DEFAULT_MINS_0 = -16; @@ -893,6 +897,16 @@ static void G_SetSkin( gentity_t *ent ) ent->client->renderInfo.customRGBA[2] = g_char_color_blue->integer; ent->client->renderInfo.customRGBA[3] = 255; } + + if ( g_char_color_2_red->integer + || g_char_color_2_green->integer + || g_char_color_2_blue->integer ) + { + ent->client->renderInfo.newCustomRGBA[0][0] = g_char_color_2_red->integer; + ent->client->renderInfo.newCustomRGBA[0][1] = g_char_color_2_green->integer; + ent->client->renderInfo.newCustomRGBA[0][2] = g_char_color_2_blue->integer; + ent->client->renderInfo.newCustomRGBA[0][3] = 255; + } } qboolean G_StandardHumanoid( gentity_t *self ) @@ -1997,6 +2011,16 @@ void G_InitPlayerFromCvars( gentity_t *ent ) ent->client->renderInfo.customRGBA[2] = g_char_color_blue->integer; ent->client->renderInfo.customRGBA[3] = 255; } + + if ( g_char_color_2_red->integer + || g_char_color_2_green->integer + || g_char_color_2_blue->integer ) + { + ent->client->renderInfo.newCustomRGBA[0][0] = g_char_color_2_red->integer; + ent->client->renderInfo.newCustomRGBA[0][1] = g_char_color_2_green->integer; + ent->client->renderInfo.newCustomRGBA[0][2] = g_char_color_2_blue->integer; + ent->client->renderInfo.newCustomRGBA[0][3] = 255; + } } void G_SetHeadSkin( gentity_t *ent ) diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 13d7665cfd..c0b3edceef 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -218,6 +218,10 @@ cvar_t *g_saberDarkSideSaberColor; cvar_t *g_char_head_model; cvar_t *g_char_head_skin; +cvar_t *g_char_color_2_red; +cvar_t *g_char_color_2_green; +cvar_t *g_char_color_2_blue; + // kef -- used with DebugTraceForNPC cvar_t *g_npcdebug; @@ -700,6 +704,11 @@ void G_InitCvars( void ) { g_char_head_model = gi.cvar( "g_char_head_model", "", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); g_char_head_skin = gi.cvar( "g_char_head_skin", "", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + + g_char_color_2_red = gi.cvar( "g_char_color_2_red", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_char_color_2_green = gi.cvar( "g_char_color_2_green", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_char_color_2_blue = gi.cvar( "g_char_color_2_blue", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_broadsword = gi.cvar( "broadsword", "1", 0); diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 3ffbdef720..739e4443b8 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -230,6 +230,7 @@ class renderInfo_t //Fields to apply to entire model set, individual model's equivalents will modify this value byte customRGBA[4];//Red Green Blue, 0 = don't apply + byte newCustomRGBA[MAX_NEW_ENT_RGB][4]; //Allow up to 4 PCJ lookup values to be stored here. //The resolve to configstrings which contain the name of the diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index dcc45618a3..a45c8894db 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -905,6 +905,27 @@ static void Svcmd_HeadPlayerModel_f(void) } } +static void Svcmd_NewPlayerTint_f(void) +{ + if ( gi.argc() == 5 && ((unsigned int)atoi(gi.argv(1)) < MAX_NEW_ENT_RGB)) + { + unsigned int tintIndex = atoi(gi.argv(1)); + g_entities[0].client->renderInfo.newCustomRGBA[tintIndex][0] = atoi(gi.argv(2)); + g_entities[0].client->renderInfo.newCustomRGBA[tintIndex][1] = atoi(gi.argv(3)); + g_entities[0].client->renderInfo.newCustomRGBA[tintIndex][2] = atoi(gi.argv(4)); + if (tintIndex == 0) + { + gi.cvar_set("g_char_color_2_red", gi.argv(2) ); + gi.cvar_set("g_char_color_2_green", gi.argv(3) ); + gi.cvar_set("g_char_color_2_blue", gi.argv(4) ); + } + } + else + { + gi.Printf( S_COLOR_RED"USAGE: newPlayerTint \n" ); + } +} + #define CMD_NONE (0x00000000u) #define CMD_CHEAT (0x00000001u) #define CMD_ALIVE (0x00000002u) @@ -974,6 +995,8 @@ static svcmd_t svcmds[] = { { "difficulty", Svcmd_Difficulty_f, CMD_NONE }, { "headPlayerModel", Svcmd_HeadPlayerModel_f, CMD_NONE }, + + { "newPlayerTint", Svcmd_NewPlayerTint_f, CMD_NONE }, //{ "say", Svcmd_Say_f, qtrue }, //{ "toggleallowvote", Svcmd_ToggleAllowVote_f, qfalse }, diff --git a/code/rd-common/tr_types.h b/code/rd-common/tr_types.h index c7d5df4e4d..67149626a7 100644 --- a/code/rd-common/tr_types.h +++ b/code/rd-common/tr_types.h @@ -87,6 +87,8 @@ along with this program; if not, see . #define RDF_doFullbright 64 // Light Amp goggles #define RDF_ForceSightOn 128 // using force sight +#define MAX_NEW_ENT_RGB 1 + extern int skyboxportal; extern int drawskyboxportal; @@ -175,6 +177,7 @@ Ghoul2 Insert Start /* Ghoul2 Insert End */ + byte newShaderRGBA[MAX_NEW_ENT_RGB][4]; // colors used by colorSrc=vertex shaders } refEntity_t; diff --git a/code/rd-vanilla/tr_local.h b/code/rd-vanilla/tr_local.h index 27cb88fe7d..c1cd4c5cca 100644 --- a/code/rd-vanilla/tr_local.h +++ b/code/rd-vanilla/tr_local.h @@ -237,6 +237,8 @@ typedef enum { CGEN_FOG, // standard fog CGEN_CONST, // fixed color CGEN_LIGHTMAPSTYLE, + CGEN_ENTITY_NEW, + CGEN_LIGHTING_DIFFUSE_ENTITY_NEW, } colorGen_t; typedef enum { @@ -397,6 +399,9 @@ typedef struct { // Whether this object emits a glow or not. bool glow; + + // Which rgbGen entity index stage corresponds to. + unsigned int rgbGenEntIndex; } shaderStage_t; struct shaderCommands_s; @@ -1662,6 +1667,7 @@ void RB_CalcFogTexCoords( float *dstTexCoords ); void RB_CalcTurbulentTexCoords( const waveForm_t *wf, float *dstTexCoords ); void RB_CalcWaveColor( const waveForm_t *wf, unsigned char *dstColors ); +void RB_CalcColorFromEntityNew( unsigned char *dstColors, int index ); void RB_CalcColorFromEntity( unsigned char *dstColors ); void RB_CalcColorFromOneMinusEntity( unsigned char *dstColors ); void RB_CalcWaveAlpha( const waveForm_t *wf, unsigned char *dstColors ); @@ -1674,6 +1680,7 @@ void RB_CalcModulateRGBAsByFog( unsigned char *dstColors ); void RB_CalcDiffuseColor( unsigned char *colors ); void RB_CalcDiffuseEntityColor( unsigned char *colors ); +void RB_CalcDiffuseEntityColorNew( unsigned char *colors, int index ); void RB_CalcDisintegrateColors( unsigned char *colors, colorGen_t rgbGen ); void RB_CalcDisintegrateVertDeform( void ); /* diff --git a/code/rd-vanilla/tr_shade.cpp b/code/rd-vanilla/tr_shade.cpp index 48f3ed1332..dac05d899f 100644 --- a/code/rd-vanilla/tr_shade.cpp +++ b/code/rd-vanilla/tr_shade.cpp @@ -1528,6 +1528,25 @@ static void ComputeColors( shaderStage_t *pStage, alphaGen_t forceAlphaGen, colo baDest->ui = baSource->ui; } break; + case CGEN_ENTITY_NEW: + RB_CalcColorFromEntityNew( ( unsigned char * ) tess.svars.colors, pStage->rgbGenEntIndex ); + if ( forceAlphaGen == AGEN_IDENTITY && + backEnd.currentEntity->e.newShaderRGBA[0][3] == 0xff + ) + { + forceAlphaGen = AGEN_SKIP; //already got it in this set since it does all 4 components + } + break; + case CGEN_LIGHTING_DIFFUSE_ENTITY_NEW: + RB_CalcDiffuseEntityColorNew( ( unsigned char * ) tess.svars.colors, pStage->rgbGenEntIndex ); + + if ( forceAlphaGen == AGEN_IDENTITY && + backEnd.currentEntity->e.shaderRGBA[3] == 0xff + ) + { + forceAlphaGen = AGEN_SKIP; //already got it in this set since it does all 4 components + } + break; } // diff --git a/code/rd-vanilla/tr_shade_calc.cpp b/code/rd-vanilla/tr_shade_calc.cpp index 5df2dbef44..d43fc306f3 100644 --- a/code/rd-vanilla/tr_shade_calc.cpp +++ b/code/rd-vanilla/tr_shade_calc.cpp @@ -604,6 +604,26 @@ COLORS ==================================================================== */ +/* + ** RB_CalcColorFromEntity + */ + +void RB_CalcColorFromEntityNew( unsigned char *dstColors, int index ) +{ + int i; + int *pColors = ( int * ) dstColors; + int c; + + if ( !backEnd.currentEntity ) + return; + + c = * ( int * ) backEnd.currentEntity->e.newShaderRGBA[index]; + + for ( i = 0; i < tess.numVertexes; i++, pColors++ ) + { + *pColors = c; + } +} /* ** RB_CalcColorFromEntity @@ -1155,6 +1175,77 @@ void RB_CalcDiffuseColor( unsigned char *colors ) } } +/* + ** RB_CalcDiffuseColorEntity + ** + ** The basic vertex lighting calc * Entity Color + */ +void RB_CalcDiffuseEntityColorNew( unsigned char *colors, int index ) +{ + int i; + float *v, *normal; + float incoming; + trRefEntity_t *ent; + int ambientLightInt; + vec3_t ambientLight; + vec3_t lightDir; + vec3_t directedLight; + int numVertexes; + float j,r,g,b; + + if ( !backEnd.currentEntity ) + {//error, use the normal lighting + RB_CalcDiffuseColor(colors); + } + + ent = backEnd.currentEntity; + VectorCopy( ent->ambientLight, ambientLight ); + VectorCopy( ent->directedLight, directedLight ); + VectorCopy( ent->lightDir, lightDir ); + + r = backEnd.currentEntity->e.newShaderRGBA[index][0]/255.0f; + g = backEnd.currentEntity->e.newShaderRGBA[index][1]/255.0f; + b = backEnd.currentEntity->e.newShaderRGBA[index][2]/255.0f; + + ((byte *)&ambientLightInt)[0] = Q_ftol( r*ent->ambientLight[0] ); + ((byte *)&ambientLightInt)[1] = Q_ftol( g*ent->ambientLight[1] ); + ((byte *)&ambientLightInt)[2] = Q_ftol( b*ent->ambientLight[2] ); + ((byte *)&ambientLightInt)[3] = backEnd.currentEntity->e.shaderRGBA[3]; + + v = tess.xyz[0]; + normal = tess.normal[0]; + + numVertexes = tess.numVertexes; + + for ( i = 0 ; i < numVertexes ; i++, v += 4, normal += 4) + { + incoming = DotProduct (normal, lightDir); + if ( incoming <= 0 ) { + *(int *)&colors[i*4] = ambientLightInt; + continue; + } + j = ( ambientLight[0] + incoming * directedLight[0] ); + if ( j > 255 ) { + j = 255; + } + colors[i*4+0] = Q_ftol(j*r); + + j = ( ambientLight[1] + incoming * directedLight[1] ); + if ( j > 255 ) { + j = 255; + } + colors[i*4+1] = Q_ftol(j*g); + + j = ( ambientLight[2] + incoming * directedLight[2] ); + if ( j > 255 ) { + j = 255; + } + colors[i*4+2] = Q_ftol(j*b); + + colors[i*4+3] = backEnd.currentEntity->e.newShaderRGBA[index][3]; + } +} + /* ** RB_CalcDiffuseColorEntity ** diff --git a/code/rd-vanilla/tr_shader.cpp b/code/rd-vanilla/tr_shader.cpp index 0ebcdf6551..bde79729d2 100644 --- a/code/rd-vanilla/tr_shader.cpp +++ b/code/rd-vanilla/tr_shader.cpp @@ -1477,7 +1477,20 @@ static qboolean ParseStage( shaderStage_t *stage, const char **text ) } else if ( !Q_stricmp( token, "entity" ) ) { - stage->rgbGen = CGEN_ENTITY; + token = COM_ParseExt( text, qfalse ); + if ( token[0] == 0 ) + { + stage->rgbGen = CGEN_ENTITY; + } + else + { + stage->rgbGen = CGEN_ENTITY_NEW; + stage->rgbGenEntIndex = atoi( token ); + if (stage->rgbGenEntIndex >= MAX_NEW_ENT_RGB) + { + stage->rgbGenEntIndex = MAX_NEW_ENT_RGB - 1; + } + } } else if ( !Q_stricmp( token, "oneMinusEntity" ) ) { @@ -1512,7 +1525,20 @@ static qboolean ParseStage( shaderStage_t *stage, const char **text ) { ri.Printf( PRINT_ERROR, "ERROR: rgbGen lightingDiffuseEntity used on a misc_model! in shader '%s'\n", shader.name ); } - stage->rgbGen = CGEN_LIGHTING_DIFFUSE_ENTITY; + token = COM_ParseExt( text, qfalse ); + if ( token[0] == 0 ) + { + stage->rgbGen = CGEN_LIGHTING_DIFFUSE_ENTITY; + } + else + { + stage->rgbGen = CGEN_LIGHTING_DIFFUSE_ENTITY_NEW; + stage->rgbGenEntIndex = atoi( token ); + if (stage->rgbGenEntIndex >= MAX_NEW_ENT_RGB) + { + stage->rgbGenEntIndex = MAX_NEW_ENT_RGB - 1; + } + } } else if ( !Q_stricmp( token, "oneMinusVertex" ) ) { diff --git a/code/ui/ui_atoms.cpp b/code/ui/ui_atoms.cpp index 5c344fc6ad..150ebae3e0 100644 --- a/code/ui/ui_atoms.cpp +++ b/code/ui/ui_atoms.cpp @@ -290,6 +290,10 @@ void UI_Init( int apiVersion, uiimport_t *uiimport, qboolean inGameLoad ) ui.Cvar_Create( "g_char_head_model", "", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); ui.Cvar_Create( "g_char_head_skin", "", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + ui.Cvar_Create( "g_char_color_2_red", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + ui.Cvar_Create( "g_char_color_2_green", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + ui.Cvar_Create( "g_char_color_2_blue", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + ui.Cvar_Create( "ui_forcepower_inc", "0", CVAR_ROM|CVAR_SAVEGAME|CVAR_NORESTART); ui.Cvar_Create( "tier_storyinfo", "0", CVAR_ROM|CVAR_SAVEGAME|CVAR_NORESTART); ui.Cvar_Create( "tiers_complete", "", CVAR_ROM|CVAR_SAVEGAME|CVAR_NORESTART); diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 475754b0cb..f3d59e52bf 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -393,6 +393,10 @@ vmCvar_t ui_rgb_saber2_blue; vmCvar_t ui_char_head_model; vmCvar_t ui_char_head_skin; +vmCvar_t ui_char_color_2_red; +vmCvar_t ui_char_color_2_green; +vmCvar_t ui_char_color_2_blue + static cvarTable_t cvarTable[] = { { &ui_menuFiles, "ui_menuFiles", "ui/menus.txt", CVAR_ARCHIVE }, @@ -430,6 +434,11 @@ static cvarTable_t cvarTable[] = { &ui_char_head_model, "ui_char_head_model", "",0}, //these are filled in by the "g_*" versions on load { &ui_char_head_skin, "ui_char_head_skin", "",0}, //the "g_*" versions are initialized in UI_Init, ui_atoms.cpp + + { &ui_char_color_2_red, "ui_char_color_2_red", "", 0}, + { &ui_char_color_2_green, "ui_char_color_2_green", "", 0}, + { &ui_char_color_2_blue, "ui_char_color_2_blue", "", 0}, + }; #define FP_UPDATED_NONE -1 @@ -4527,8 +4536,13 @@ static void UI_UpdateCharacterCvars ( void ) Cvar_Set ( "g_char_color_red", Cvar_VariableString ( "ui_char_color_red" ) ); Cvar_Set ( "g_char_color_green", Cvar_VariableString ( "ui_char_color_green" ) ); Cvar_Set ( "g_char_color_blue", Cvar_VariableString ( "ui_char_color_blue" ) ); + Cvar_Set ( "g_char_head_model", Cvar_VariableString ( "ui_char_head_model" ) ); Cvar_Set ( "g_char_head_skin", Cvar_VariableString ( "ui_char_head_skin" ) ); + + Cvar_Set ( "g_char_color_2_red", Cvar_VariableString ( "ui_char_color_2_red" ) ); + Cvar_Set ( "g_char_color_2_green", Cvar_VariableString ( "ui_char_color_2_green" ) ); + Cvar_Set ( "g_char_color_2_blue", Cvar_VariableString ( "ui_char_color_2_blue" ) ); } static void UI_GetCharacterCvars ( void ) @@ -4542,6 +4556,10 @@ static void UI_GetCharacterCvars ( void ) Cvar_Set ( "ui_char_head_model", Cvar_VariableString ( "g_char_head_model" ) ); Cvar_Set ( "ui_char_head_skin", Cvar_VariableString ( "g_char_head_skin" ) ); + + Cvar_Set ( "ui_char_color_2_red", Cvar_VariableString ( "g_char_color_2_red" ) ); + Cvar_Set ( "ui_char_color_2_green", Cvar_VariableString ( "g_char_color_2_green" ) ); + Cvar_Set ( "ui_char_color_2_blue", Cvar_VariableString ( "g_char_color_2_blue" ) ); const char* model = Cvar_VariableString ( "g_char_model" ); Cvar_Set ( "ui_char_model", model ); diff --git a/code/ui/ui_shared.cpp b/code/ui/ui_shared.cpp index a374c08e59..be849d4c18 100644 --- a/code/ui/ui_shared.cpp +++ b/code/ui/ui_shared.cpp @@ -47,6 +47,10 @@ extern vmCvar_t ui_char_color_red; extern vmCvar_t ui_char_color_green; extern vmCvar_t ui_char_color_blue; +extern vmCvar_t ui_char_color_2_red; +extern vmCvar_t ui_char_color_2_green; +extern vmCvar_t ui_char_color_2_blue; + void *UI_Alloc( int size ); void Controls_GetConfig( void ); @@ -7435,6 +7439,10 @@ void Item_Model_Paint(itemDef_t *item) ent.shaderRGBA[1] = ui_char_color_green.integer; ent.shaderRGBA[2] = ui_char_color_blue.integer; ent.shaderRGBA[3] = 255; + ent.newShaderRGBA[0][0] = ui_char_color_2_red.integer; + ent.newShaderRGBA[0][1] = ui_char_color_2_green.integer; + ent.newShaderRGBA[0][2] = ui_char_color_2_blue.integer; + ent.newShaderRGBA[0][3] = 255; UI_TalkingHead(item); } if ( item->flags&ITF_ISANYSABER ) From d1e2f6f09b85268132eb07c9eea78ed506995f90 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sat, 7 Jan 2017 17:22:43 +0000 Subject: [PATCH 381/445] Holsters: Saber holstering Merge of commits including fixes. Holstered sabers face down. If g_flippedHoslters is 1, they face up. Added tag_holsterorigin. You can choose where to holster a saber now (back, hips, none). Also removed the twirl when putting saber away. e.g. .sab file line: "holsterPlace none". defaults to 'hips' unless it's a sith sword. Added lhip option for sab files: option to holster saber on left hip. --- code/cgame/cg_weapons.cpp | 6 ++ code/game/NPC_combat.cpp | 2 + code/game/NPC_spawn.cpp | 4 + code/game/Q3_Interface.cpp | 2 + code/game/bg_panimate.cpp | 5 +- code/game/bg_pmove.cpp | 55 ++++++++++- code/game/g_active.cpp | 2 + code/game/g_client.cpp | 21 ++++ code/game/g_emplaced.cpp | 2 + code/game/g_items.cpp | 2 + code/game/g_local.h | 1 + code/game/g_main.cpp | 4 +- code/game/g_public.h | 3 + code/game/g_shared.h | 2 + code/game/g_svcmds.cpp | 22 +++++ code/game/wp_saber.cpp | 184 +++++++++++++++++++++++++++++++++++ code/game/wp_saber.h | 2 + code/game/wp_saberLoad.cpp | 35 +++++++ code/ghoul2/G2.h | 7 +- code/qcommon/q_shared.h | 11 +++ code/rd-common/tr_public.h | 3 + code/rd-vanilla/G2_API.cpp | 34 +++++-- code/rd-vanilla/G2_bones.cpp | 24 ++++- code/rd-vanilla/tr_init.cpp | 1 + code/server/sv_game.cpp | 8 ++ 25 files changed, 419 insertions(+), 23 deletions(-) diff --git a/code/cgame/cg_weapons.cpp b/code/cgame/cg_weapons.cpp index ea0ad9e6b0..a89b96d1bc 100644 --- a/code/cgame/cg_weapons.cpp +++ b/code/cgame/cg_weapons.cpp @@ -2609,6 +2609,12 @@ void CG_Weapon_f( void ) else {//turn them both on cg_entities[0].gent->client->ps.SaberActivate(); + //if we'd holstered the second saber, best make sure it's in the left hand! + if ( cg_entities[0].gent->client->ps.dualSabers ) + { + G_RemoveHolsterModels( cg_entities[0].gent ); + WP_SaberAddG2SaberModels( cg_entities[0].gent, qtrue ); + } } } } diff --git a/code/game/NPC_combat.cpp b/code/game/NPC_combat.cpp index fc60f59f76..4494ad7a94 100644 --- a/code/game/NPC_combat.cpp +++ b/code/game/NPC_combat.cpp @@ -1039,10 +1039,12 @@ void NPC_ChangeWeapon( int newWeapon ) if ( NPC->client->ps.weapon == WP_SABER ) { WP_SaberAddG2SaberModels( NPC ); + G_RemoveHolsterModels( NPC ); } else { G_CreateG2AttachedWeaponModel( NPC, weaponData[NPC->client->ps.weapon].weaponMdl, NPC->handRBolt, 0 ); + WP_SaberAddHolsteredG2SaberModels( NPC ); } } } diff --git a/code/game/NPC_spawn.cpp b/code/game/NPC_spawn.cpp index 7e3f820a89..d834d4e3ec 100644 --- a/code/game/NPC_spawn.cpp +++ b/code/game/NPC_spawn.cpp @@ -380,6 +380,7 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) if ( ent->client->ps.weapon == WP_SABER ) {//this is our current weapon, add the models now WP_SaberAddG2SaberModels( ent ); + G_RemoveHolsterModels( ent ); } Jedi_ClearTimers( ent ); } @@ -452,6 +453,7 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) && (!(ent->NPC->aiFlags&NPCAI_MATCHPLAYERWEAPON)||!ent->weaponModel[0]) )//they do this themselves { G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].weaponMdl, ent->handRBolt, 0 ); + WP_SaberAddHolsteredG2SaberModels( ent ); } switch ( ent->client->ps.weapon ) { @@ -553,6 +555,7 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) && (!(ent->NPC->aiFlags&NPCAI_MATCHPLAYERWEAPON)||!ent->weaponModel[0]) )//they do this themselves { G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].weaponMdl, ent->handRBolt, 0 ); + WP_SaberAddHolsteredG2SaberModels( ent ); } switch ( ent->client->ps.weapon ) { @@ -629,6 +632,7 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) && (!(ent->NPC->aiFlags&NPCAI_MATCHPLAYERWEAPON)||!ent->weaponModel[0]) )//they do this themselves { G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].weaponMdl, ent->handRBolt, 0 ); + WP_SaberAddHolsteredG2SaberModels( ent ); } break; } diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 2a95880775..e6e9b389f4 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -3267,10 +3267,12 @@ void G_SetWeapon( gentity_t *self, int wp ) WP_SaberInitBladeData( self ); } WP_SaberAddG2SaberModels( self ); + G_RemoveHolsterModels( self ); } else { G_CreateG2AttachedWeaponModel( self, weaponData[wp].weaponMdl, self->handRBolt, 0 ); + WP_SaberAddHolsteredG2SaberModels( self ); } } diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index 3bf91a5634..815cf82608 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -5226,7 +5226,10 @@ void PM_TorsoAnimLightsaber() { if (!G_IsRidingVehicle(pm->gent)) { - PM_SetSaberMove(LS_DRAW); + if (pm->ps->saber[0].holsterPlace != HOLSTER_BACK) + { + PM_SetSaberMove(LS_DRAW); + } } return; } diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 772445a396..fd8008b56c 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -8945,7 +8945,7 @@ static void PM_BeginWeaponChange( int weapon ) { } if (!G_IsRidingVehicle(pm->gent)) { - PM_SetSaberMove(LS_PUTAWAY); + // PM_SetSaberMove(LS_PUTAWAY); } } //put this back in because saberActive isn't being set somewhere else anymore @@ -9003,6 +9003,8 @@ static void PM_FinishWeaponChange( void ) { if ( pm->gent ) {// remove gun if we had it. G_RemoveWeaponModels( pm->gent ); + //and remove holstered saber models + G_RemoveHolsterModels( pm->gent ); } if ( !pm->ps->saberInFlight || pm->ps->dualSabers ) @@ -9043,7 +9045,14 @@ static void PM_FinishWeaponChange( void ) { {//actually did switch weapons, play anim if (!G_IsRidingVehicle(pm->gent)) { - PM_SetSaberMove(LS_DRAW); + if ( pm->ps->saber[0].holsterPlace == HOLSTER_BACK ) + { + //TODO: nice draw move from back holster + } + else + { + PM_SetSaberMove(LS_DRAW); + } } } } @@ -9053,6 +9062,8 @@ static void PM_FinishWeaponChange( void ) { { // remove the sabre if we had it. G_RemoveWeaponModels( pm->gent ); + //holster sabers + WP_SaberAddHolsteredG2SaberModels( pm->gent ); if (weaponData[weapon].weaponMdl[0]) { //might be NONE, so check if it has a model G_CreateG2AttachedWeaponModel( pm->gent, weaponData[weapon].weaponMdl, pm->gent->handRBolt, 0 ); } @@ -9265,7 +9276,20 @@ void PM_SetSaberMove(saberMoveName_t newMove) pm->ps->saberMove = newMove; return; } - if ( pm->ps->saber[0].drawAnim != -1 ) + if ( pm->ps->saber[0].holsterPlace == HOLSTER_LHIP && !pm->ps->dualSabers && pm->ps->saber[0].drawAnim == -1 ) + { + //TODO: left hip draw anim + } + else if ( pm->ps->saber[0].holsterPlace == HOLSTER_LHIP + && pm->ps->dualSabers + && ((pm->ps->saber[1].holsterPlace == HOLSTER_LHIP) || (pm->ps->saber[1].holsterPlace == HOLSTER_HIPS)) + && !(pm->ps->saber[0].stylesForbidden&(1<ps->saber[1].stylesForbidden&(1<ps->saber[0].drawAnim != -1 ) { anim = pm->ps->saber[0].drawAnim; } @@ -9274,6 +9298,11 @@ void PM_SetSaberMove(saberMoveName_t newMove) { anim = pm->ps->saber[1].drawAnim; } + else if ( pm->ps->saber[0].holsterPlace == HOLSTER_BACK ) + { + //TODO: nice back draw anim + anim = BOTH_S1_S7; + } else if ( pm->ps->saber[0].stylesLearned==(1<ps->saber[0].putawayAnim != -1 ) + if ( pm->ps->saber[0].holsterPlace == HOLSTER_LHIP && !pm->ps->dualSabers && pm->ps->saber[0].putawayAnim == -1 ) + { + //TODO: left hip putaway anim + } + else if ( pm->ps->saber[0].holsterPlace == HOLSTER_LHIP + && pm->ps->dualSabers + && ((pm->ps->saber[1].holsterPlace == HOLSTER_LHIP) || (pm->ps->saber[1].holsterPlace == HOLSTER_HIPS)) + && !(pm->ps->saber[0].stylesForbidden&(1<ps->saber[1].stylesForbidden&(1<ps->saber[1].Active() ) + { + anim = BOTH_S6_S1; + //TODO: nice cross putaway anim + } + else if ( pm->ps->saber[0].putawayAnim != -1 ) { anim = pm->ps->saber[0].putawayAnim; } @@ -9300,6 +9343,10 @@ void PM_SetSaberMove(saberMoveName_t newMove) { anim = pm->ps->saber[1].putawayAnim; } + else if ( pm->ps->saber[0].holsterPlace == HOLSTER_BACK ) + { + anim = BOTH_S7_S1; + } else if ( pm->ps->saber[0].stylesLearned==(1<ps->saber[0].blade[1].active ) { diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index f79a8c2b72..04de06a106 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -1644,6 +1644,7 @@ void G_MatchPlayerWeapon( gentity_t *ent ) //FIXME: AddSound/Sight Event int numSabers = WP_SaberInitBladeData( ent ); WP_SaberAddG2SaberModels( ent ); + G_RemoveHolsterModels( ent ); for ( int saberNum = 0; saberNum < numSabers; saberNum++ ) { //G_CreateG2AttachedWeaponModel( ent, ent->client->ps.saber[saberNum].model, ent->handRBolt, 0 ); @@ -1660,6 +1661,7 @@ void G_MatchPlayerWeapon( gentity_t *ent ) else { G_CreateG2AttachedWeaponModel( ent, weaponData[newWeap].weaponMdl, ent->handRBolt, 0 ); + WP_SaberAddHolsteredG2SaberModels( ent ); } } } diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index 4d4d373da9..f56ef58af1 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -1851,6 +1851,23 @@ void G_RemoveWeaponModels( gentity_t *ent ) } } +void G_RemoveHolsterModels( gentity_t *ent ) +{ + if ( ent->ghoul2.size() ) + { + if ( ent->holsterModel[0] > 0 ) + { + gi.G2API_RemoveGhoul2Model( ent->ghoul2, ent->holsterModel[0] ); + ent->holsterModel[0] = -1; + } + if ( ent->holsterModel[1] > 0 ) + { + gi.G2API_RemoveGhoul2Model( ent->ghoul2, ent->holsterModel[1] ); + ent->holsterModel[1] = -1; + } + } +} + void G_AddWeaponModels( gentity_t *ent ) { if ( !ent || !ent->client ) @@ -1862,10 +1879,12 @@ void G_AddWeaponModels( gentity_t *ent ) if ( ent->client->ps.weapon == WP_SABER ) { WP_SaberAddG2SaberModels( ent ); + G_RemoveHolsterModels( ent ); } else if ( ent->client->ps.weapon != WP_NONE ) { G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].weaponMdl, ent->handRBolt, 0 ); + WP_SaberAddHolsteredG2SaberModels( ent ); } } } @@ -2630,11 +2649,13 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded && ent->client->ps.weapon == WP_SABER )//current weapon is saber {//add the proper models WP_SaberAddG2SaberModels( ent ); + G_RemoveHolsterModels( ent ); } } if ( ent->weaponModel[0] == -1 && ent->client->ps.weapon != WP_NONE ) { G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].weaponMdl, ent->handRBolt, 0 ); + WP_SaberAddHolsteredG2SaberModels( ent ); } { diff --git a/code/game/g_emplaced.cpp b/code/game/g_emplaced.cpp index 9ef53cf6e3..49e1d4b39e 100644 --- a/code/game/g_emplaced.cpp +++ b/code/game/g_emplaced.cpp @@ -1033,10 +1033,12 @@ extern void CG_ChangeWeapon( int num ); if ( ent->client->ps.weapon == WP_SABER ) { WP_SaberAddG2SaberModels( ent ); + G_RemoveHolsterModels( ent ); } else { G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].weaponMdl, ent->handRBolt, 0 ); + WP_SaberAddHolsteredG2SaberModels( ent ); } if ( ent->s.number < MAX_CLIENTS ) diff --git a/code/game/g_items.cpp b/code/game/g_items.cpp index 35cde23c85..b834c059bd 100644 --- a/code/game/g_items.cpp +++ b/code/game/g_items.cpp @@ -509,10 +509,12 @@ int Pickup_Weapon (gentity_t *ent, gentity_t *other) { other->client->ps.SaberActivate(); WP_SaberAddG2SaberModels( other ); + G_RemoveHolsterModels( ent ); } else { G_CreateG2AttachedWeaponModel( other, weaponData[ent->item->giTag].weaponMdl, other->handRBolt, 0 ); + WP_SaberAddHolsteredG2SaberModels( ent ); } } } diff --git a/code/game/g_local.h b/code/game/g_local.h index 0894035b3c..d1a44b3f71 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -531,6 +531,7 @@ void player_die (gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int void AddScore( gentity_t *ent, int score ); qboolean SpotWouldTelefrag( gentity_t *spot, team_t checkteam ); void G_RemoveWeaponModels( gentity_t *ent ); +void G_RemoveHolsterModels( gentity_t *ent ); // // g_svcmds.c diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index c0b3edceef..9e2d4e6d5f 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -231,6 +231,7 @@ cvar_t *g_navSafetyChecks; cvar_t *g_broadsword; cvar_t *g_allowBunnyhopping; +cvar_t *g_flippedHolsters; qboolean stop_icarus = qfalse; @@ -721,7 +722,8 @@ void G_InitCvars( void ) { gi.cvar( "ui_prisonerobj_maxtotal", "0", CVAR_ROM|CVAR_SAVEGAME|CVAR_NORESTART); gi.cvar( "g_clearstats", "1", CVAR_ROM|CVAR_NORESTART); - + + g_flippedHolsters = gi.cvar( "g_flippedHolsters", "0", CVAR_ARCHIVE );//if 1, saber faces up when holstered not down } /* ============ diff --git a/code/game/g_public.h b/code/game/g_public.h index 8ca8785dfb..0081161af1 100644 --- a/code/game/g_public.h +++ b/code/game/g_public.h @@ -270,6 +270,9 @@ Ghoul2 Insert Start qboolean (*G2API_SetBoneAngles)(CGhoul2Info *ghlInfo, const char *boneName, const vec3_t angles, const int flags, const Eorientations up, const Eorientations right, const Eorientations forward, qhandle_t *modelList, int blendTime , int blendStart ); + qboolean (*G2API_SetBoneAnglesOffset)(CGhoul2Info *ghlInfo, const char *boneName, const vec3_t angles, const int flags, + const Eorientations up, const Eorientations left, const Eorientations forward, qhandle_t *modelList, + int blendTime, int AcurrentTime, const vec3_t offset); qboolean (*G2API_SetBoneAnglesIndex)(CGhoul2Info *ghlInfo, const int index, const vec3_t angles, const int flags, const Eorientations yaw, const Eorientations pitch, const Eorientations roll, qhandle_t *modelList, int blendTime, int currentTime ); diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 739e4443b8..3282ec07f8 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -965,6 +965,7 @@ class parms_t #define MAX_FAILED_NODES 8 #define MAX_INHAND_WEAPONS 2 +#define MAX_HOLSTER_WEAPONS 2 typedef struct centity_s centity_t; @@ -1176,6 +1177,7 @@ Ghoul2 Insert End short headLowerLumbarBone; short headHipsBone; short headFaceBone; + short holsterModel[MAX_HOLSTER_WEAPONS]; short playerModel; short weaponModel[MAX_INHAND_WEAPONS]; short handRBolt; diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index a45c8894db..05ee788e0f 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -411,16 +411,38 @@ void Svcmd_SaberAttackCycle_f( void ) G_SoundIndexOnEnt( self, CHAN_WEAPON, self->client->ps.saber[1].soundOff ); } } + if (!self->client->ps.saber[1].Active()) + { + G_RemoveWeaponModels( self ); + G_RemoveHolsterModels( self ); + if ( !self->client->ps.saberInFlight ) + { + WP_SaberAddG2SaberModels( self, qfalse ); + } + WP_SaberAddHolsteredG2SaberModels( self, qtrue ); + } } else if ( !self->client->ps.saber[0].ActiveManualOnly() ) {//first one is off, too, so just turn that one on if ( !self->client->ps.saberInFlight ) {//but only if it's in your hand! + if (!self->client->ps.saber[1].Active()) + { + G_RemoveWeaponModels( self ); + G_RemoveHolsterModels( self ); + if ( !self->client->ps.saberInFlight ) + { + WP_SaberAddG2SaberModels( self, qfalse ); + } + WP_SaberAddHolsteredG2SaberModels( self, qtrue ); + } self->client->ps.saber[0].Activate(); } } else {//turn on the second one + G_RemoveHolsterModels( self ); + WP_SaberAddG2SaberModels( self, qtrue ); self->client->ps.saber[1].Activate(); } return; diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 956bf02b9a..eb436879f5 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -163,6 +163,7 @@ extern cvar_t *g_saberAutoBlocking; extern cvar_t *g_saberRealisticCombat; extern cvar_t *g_saberDamageCapping; extern cvar_t *g_saberNewControlScheme; +extern cvar_t *g_flippedHolsters; extern int g_crosshairEntNum; qboolean g_saberNoEffects = qfalse; @@ -358,6 +359,76 @@ stringID_table_t SaberStyleTable[] = //SABER INITIALIZATION====================================================================== +void G_CreateG2HolsteredWeaponModel( gentity_t *ent, const char *psWeaponModel, int boltNum, int weaponNum, vec3_t angles, vec3_t offset ) +{ + if (!psWeaponModel) + { + assert (psWeaponModel); + return; + } + if ( ent->playerModel == -1 ) + { + return; + } + if ( boltNum == -1 ) + { + return; + } + + if ( weaponNum < 0 || weaponNum >= MAX_INHAND_WEAPONS ) + { + return; + } + char weaponModel[64]; + + strcpy (weaponModel, psWeaponModel); + if (char *spot = strstr(weaponModel, ".md3") ) { + *spot = 0; + spot = strstr(weaponModel, "_w");//i'm using the in view weapon array instead of scanning the item list, so put the _w back on + if (!spot&&!strstr(weaponModel, "noweap")) + { + strcat (weaponModel, "_w"); + } + strcat (weaponModel, ".glm"); //and change to ghoul2 + } + + // give us a saber model + int wModelIndex = G_ModelIndex( weaponModel ); + if ( wModelIndex ) + { + ent->holsterModel[weaponNum] = gi.G2API_InitGhoul2Model(ent->ghoul2, weaponModel, wModelIndex, NULL_HANDLE, NULL_HANDLE, 0, 0 ); + if ( ent->holsterModel[weaponNum] != -1 ) + { + // attach it to the hip. need some correction of rotation first though! + int holsterorigin = gi.G2API_AddBolt(&ent->ghoul2[ent->holsterModel[weaponNum]], "*holsterorigin"); + mdxaBone_t boltMatrix2; + if (holsterorigin != -1) + { + vec3_t origin = {0, 0, 0}; + gi.G2API_GetBoltMatrix(ent->ghoul2, ent->holsterModel[weaponNum], holsterorigin, &boltMatrix2, + origin, origin, 0, + NULL, ent->s.modelScale); + } + gi.G2API_AttachG2Model(&ent->ghoul2[ent->holsterModel[weaponNum]], &ent->ghoul2[ent->playerModel], + boltNum, ent->playerModel); + if (holsterorigin == -1) + { + gi.G2API_SetBoneAnglesOffset(&ent->ghoul2[ent->holsterModel[weaponNum]], "ModView internal default", angles, BONE_ANGLES_PREMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0, offset); + } + else + { + boltMatrix2.matrix[1][3] -= 1.0f;//TODO: this is no good for back holstered weapons + gi.G2API_SetBoneAnglesMatrix(&ent->ghoul2[ent->holsterModel[weaponNum]], "ModView internal default", boltMatrix2, BONE_ANGLES_PREMULT, + NULL, 0, 0); + + } + gi.G2API_AddBolt(&ent->ghoul2[ent->holsterModel[weaponNum]], "*flash"); + //gi.G2API_SetLodBias( &ent->ghoul2[ent->weaponModel[weaponNum]], 0 ); + } + } + +} + void G_CreateG2AttachedWeaponModel( gentity_t *ent, const char *psWeaponModel, int boltNum, int weaponNum ) { if (!psWeaponModel) @@ -474,6 +545,119 @@ void WP_SaberAddG2SaberModels( gentity_t *ent, int specificSaberNum ) } } +void WP_SaberAddHolsteredG2SaberModels( gentity_t *ent, int specificSaberNum ) +{ + int saberNum = 0, maxSaber = 1; + if (!(ent && ent->client && (ent->client->ps.stats[STAT_WEAPONS] & ( 1 << WP_SABER )))) + { + return; + } + if ( specificSaberNum != -1 && specificSaberNum <= maxSaber ) + { + saberNum = maxSaber = specificSaberNum; + } + for ( ; saberNum <= maxSaber; saberNum++ ) + { + if ( ent->holsterModel[saberNum] > 0 ) + {//we already have a weapon model in this slot + //remove it + gi.G2API_SetSkin( &ent->ghoul2[ent->holsterModel[saberNum]], -1, 0 ); + gi.G2API_RemoveGhoul2Model( ent->ghoul2, ent->holsterModel[saberNum] ); + ent->holsterModel[saberNum] = -1; + } + if ( saberNum > 0 ) + {//second saber + if ( !ent->client->ps.dualSabers ) + {//only have one saber or riding a vehicle and can only use one saber + return; + } + } + else if ( saberNum == 0 ) + {//first saber + if ( ent->client->ps.saberInFlight ) + {//it's still out there somewhere, don't add it + //FIXME: call it back? + continue; + } + } + else if ( ent->client->ps.saber[saberNum].holsterPlace == HOLSTER_NONE ) + { + continue; + } + int handBolt = -1; + holster_locations_t holsterPlace = ent->client->ps.saber[saberNum].holsterPlace; + vec3_t offset = { 0.0f, 0.0f, 0.0f }; + vec3_t angles = { 0.0f, 0.0f, 0.0f }; + if ( holsterPlace == HOLSTER_HIPS ) + { + angles[PITCH] = 180.0f; + angles[YAW] = 0.0f; + angles[ROLL] = 180.0f; + if (g_flippedHolsters && g_flippedHolsters->integer > 0) + { + angles[YAW] = 180.0f; + } + VectorSet(offset, 0.0f, -1.0f, -5.0f); + } + else if ( holsterPlace == HOLSTER_BACK ) + { + angles[YAW] = 180.0f; + angles[PITCH] = 22.5f; + VectorSet(offset, 0.0f, -2.0f, 4.0f); + } + if ( saberNum == 0 ) + { + if ( holsterPlace == HOLSTER_LHIP ) + { + handBolt = gi.G2API_AddBolt( &ent->ghoul2[ent->playerModel], "*hip_l" ); + } + else if ( holsterPlace == HOLSTER_HIPS ) + { + handBolt = gi.G2API_AddBolt( &ent->ghoul2[ent->playerModel], "*hip_r" ); + } + else if ( holsterPlace == HOLSTER_BACK ) + { + handBolt = gi.G2API_AddBolt( &ent->ghoul2[ent->playerModel], "*back" ); + } + } + else + { + if ( holsterPlace == HOLSTER_HIPS || holsterPlace == HOLSTER_LHIP ) + { + if ( ent->client->ps.saber[0].holsterPlace == HOLSTER_LHIP ) + { + handBolt = gi.G2API_AddBolt( &ent->ghoul2[ent->playerModel], "*hip_r" ); + } + else + { + handBolt = gi.G2API_AddBolt( &ent->ghoul2[ent->playerModel], "*hip_l" ); + } + } + else if ( holsterPlace == HOLSTER_BACK ) + { + if ( ent->client->ps.saber[0].holsterPlace == HOLSTER_BACK ) + { + continue; + } + handBolt = gi.G2API_AddBolt( &ent->ghoul2[ent->playerModel], "*back" ); + } + } + G_CreateG2HolsteredWeaponModel( ent, ent->client->ps.saber[saberNum].model, handBolt, saberNum, angles, offset ); + + if ( ent->client->ps.saber[saberNum].skin != NULL ) + {//if this saber has a customSkin, use it + // lets see if it's out there + int saberSkin = gi.RE_RegisterSkin( ent->client->ps.saber[saberNum].skin ); + if ( saberSkin ) + { + // put it in the config strings + // and set the ghoul2 model to use it + gi.G2API_SetSkin( &ent->ghoul2[ent->holsterModel[saberNum]], G_SkinIndex( ent->client->ps.saber[saberNum].skin ), saberSkin ); + } + } + } +} + //---------------------------------------------------------- void G_Throw( gentity_t *targ, const vec3_t newDir, float push ) //---------------------------------------------------------- diff --git a/code/game/wp_saber.h b/code/game/wp_saber.h index 042f01fc19..eb15ae0c12 100644 --- a/code/game/wp_saber.h +++ b/code/game/wp_saber.h @@ -199,8 +199,10 @@ enum extern void WP_InitForcePowers( gentity_t *ent ); extern int WP_GetVelocityForForceJump( gentity_t *self, vec3_t jumpVel, usercmd_t *ucmd ); extern int WP_SaberInitBladeData( gentity_t *ent ); +extern void G_CreateG2HolsteredWeaponModel( gentity_t *ent, const char *weaponModel, int boltNum, int weaponNum, vec3_t angles, vec3_t offset ); extern void G_CreateG2AttachedWeaponModel( gentity_t *ent, const char *weaponModel, int boltNum, int weaponNum ); extern void WP_SaberAddG2SaberModels( gentity_t *ent, int specificSaberNum = -1 ); +extern void WP_SaberAddHolsteredG2SaberModels( gentity_t *ent, int specificSaberNum = -1 ); extern qboolean WP_SaberParseParms( const char *SaberName, saberInfo_t *saber, qboolean setColors = qtrue ); extern qboolean WP_BreakSaber( gentity_t *ent, const char *surfName, saberType_t saberType = SABER_NONE ); extern void ForceThrow( gentity_t *self, qboolean pull, qboolean fake = qfalse ); diff --git a/code/game/wp_saberLoad.cpp b/code/game/wp_saberLoad.cpp index 31ba5e1878..eb86a18738 100644 --- a/code/game/wp_saberLoad.cpp +++ b/code/game/wp_saberLoad.cpp @@ -144,6 +144,18 @@ stringID_table_t SaberMoveTable[] = { "", -1 } }; +stringID_table_t HolsterTable[] = +{ + ENUM2STRING(HOLSTER_NONE), + ENUM2STRING(HOLSTER_HIPS), + ENUM2STRING(HOLSTER_BACK), + { "none", HOLSTER_NONE }, + { "hips", HOLSTER_HIPS }, + { "back", HOLSTER_BACK }, + { "lhip", HOLSTER_LHIP }, + { "", -1 } +}; + saber_styles_t TranslateSaberStyle( const char *name ) { if ( !Q_stricmp( name, "fast" ) ) return SS_FAST; @@ -476,6 +488,7 @@ void WP_SaberSetDefaults( saberInfo_t *saber, qboolean setColors = qtrue ) saber->splashDamage2 = 0; //0 - amount of splashDamage, 100% at a distance of 0, 0% at a distance = splashRadius saber->splashKnockback2 = 0.0f; //0 - amount of splashKnockback, 100% at a distance of 0, 0% at a distance = splashRadius //========================================================================================================================================= + saber->holsterPlace = HOLSTER_INVALID; } qboolean forcedRGBColours[MAX_BLADES]; @@ -1911,6 +1924,15 @@ static void Saber_ParseNoClashFlare2( saberInfo_t *saber, const char **p ) { if ( n ) saber->saberFlags2 |= SFL2_NO_CLASH_FLARE2; } +static void Saber_ParseHolsterPlace( saberInfo_t *saber, const char **p ) { + const char *value; + int holsterType; + if ( COM_ParseString( p, &value ) ) + return; + holsterType = GetIDForString( HolsterTable, value ); + if ( holsterType >= HOLSTER_NONE && holsterType <= HOLSTER_BACK ) + saber->holsterPlace = (holster_locations_t)holsterType; +} /* =============== @@ -2120,6 +2142,7 @@ static keywordHash_t saberParseKeywords[] = { { "bladeEffect2", Saber_ParseBladeEffect2, NULL }, { "noClashFlare", Saber_ParseNoClashFlare, NULL }, { "noClashFlare2", Saber_ParseNoClashFlare2, NULL }, + { "holsterPlace", Saber_ParseHolsterPlace, NULL }, { NULL, NULL, NULL } }; static keywordHash_t *saberParseKeywordHash[KEYWORDHASH_SIZE]; @@ -2213,6 +2236,18 @@ qboolean WP_SaberParseParms( const char *SaberName, saberInfo_t *saber, qboolean {//precache all the sith sword sounds Saber_SithSwordPrecache(); } + + if ( saber->holsterPlace == HOLSTER_INVALID ) + { + if ( saber->type == SABER_SITH_SWORD ) + { + saber->holsterPlace = HOLSTER_BACK; + } + else + { + saber->holsterPlace = HOLSTER_HIPS; + } + } return qtrue; } diff --git a/code/ghoul2/G2.h b/code/ghoul2/G2.h index 38640f62e3..23f7acbe6c 100644 --- a/code/ghoul2/G2.h +++ b/code/ghoul2/G2.h @@ -58,7 +58,7 @@ int G2_IsSurfaceRendered(CGhoul2Info *ghlInfo, const char *surfaceName, surfac // internal bone calls - G2_Bones.cpp qboolean G2_Set_Bone_Angles(CGhoul2Info *ghlInfo, boneInfo_v &blist, const char *boneName, const float *angles, const int flags, const Eorientations up, const Eorientations left, const Eorientations forward, - const int blendTime, const int currentTime); + const int blendTime, const int currentTime, const vec3_t offset); qboolean G2_Remove_Bone (CGhoul2Info *ghlInfo, boneInfo_v &blist, const char *boneName); qboolean G2_Remove_Bone_Index (boneInfo_v &blist, int index); qboolean G2_Set_Bone_Anim(CGhoul2Info *ghlInfo, boneInfo_v &blist, const char *boneName, const int startFrame, @@ -84,7 +84,7 @@ int G2_Get_Bone_Index(CGhoul2Info *ghoul2, const char *boneName, qboolean bAdd qboolean G2_Set_Bone_Angles_Index(CGhoul2Info *ghlInfo, boneInfo_v &blist, const int index, const float *angles, const int flags, const Eorientations yaw, const Eorientations pitch, const Eorientations roll, - const int blendTime, const int currentTime); + const int blendTime, const int currentTime, const vec3_t offset); qboolean G2_Set_Bone_Angles_Matrix_Index(boneInfo_v &blist, const int index, const mdxaBone_t &matrix, const int flags, const int blendTime, const int currentTime); @@ -157,6 +157,9 @@ qboolean G2API_StopBoneAnim(CGhoul2Info *ghlInfo, const char *boneName); qboolean G2API_SetBoneAngles(CGhoul2Info *ghlInfo, const char *boneName, const vec3_t angles, const int flags, const Eorientations up, const Eorientations right, const Eorientations forward, qhandle_t *modelList, int blendTime = 0, int currentTime = 0); +qboolean G2API_SetBoneAnglesOffset(CGhoul2Info *ghlInfo, const char *boneName, const vec3_t angles, const int flags, + const Eorientations up, const Eorientations right, const Eorientations forward, qhandle_t *modelList, + int blendTime = 0, int currentTime = 0, const vec3_t offset = NULL); qboolean G2API_StopBoneAngles(CGhoul2Info *ghlInfo, const char *boneName); qboolean G2API_RemoveBone(CGhoul2Info *ghlInfo, const char *boneName); qboolean G2API_RemoveBolt(CGhoul2Info *ghlInfo, const int index); diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 414dc90cd4..cd88d8d38a 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -937,6 +937,15 @@ typedef enum SS_NUM_SABER_STYLES } saber_styles_t; +typedef enum +{ + HOLSTER_INVALID = -1, + HOLSTER_NONE = 0, + HOLSTER_HIPS, + HOLSTER_BACK, + HOLSTER_LHIP +} holster_locations_t; + //SABER FLAGS //Old bools converted to a flag now #define SFL_NOT_LOCKABLE (1<<0)//can't get into a saberlock @@ -1043,6 +1052,8 @@ typedef struct int meditateAnim; //-1 - anim to use when hit "meditate" int flourishAnim; //-1 - anim to use when hit "flourish" int gloatAnim; //-1 - anim to use when hit "gloat" + + holster_locations_t holsterPlace; //***NOTE: you can only have a maximum of 2 "styles" of blades, so this next value, "bladeStyle2Start" is the number of the first blade to use these value on... all blades before this use the normal values above, all blades at and after this number use the secondary values below*** int bladeStyle2Start; //0 - if set, blades from this number and higher use the following values (otherwise, they use the normal values already set) diff --git a/code/rd-common/tr_public.h b/code/rd-common/tr_public.h index 82387c7a84..94fba5338c 100644 --- a/code/rd-common/tr_public.h +++ b/code/rd-common/tr_public.h @@ -343,6 +343,9 @@ typedef struct { qboolean (*G2API_SetBoneAngles)(CGhoul2Info *ghlInfo, const char *boneName, const vec3_t angles, const int flags, const Eorientations up, const Eorientations left, const Eorientations forward, qhandle_t *modelList, int blendTime, int AcurrentTime); + qboolean (*G2API_SetBoneAnglesOffset)(CGhoul2Info *ghlInfo, const char *boneName, const vec3_t angles, const int flags, + const Eorientations up, const Eorientations left, const Eorientations forward, qhandle_t *modelList, + int blendTime, int AcurrentTime, const vec3_t offset); qboolean (*G2API_SetBoneAnglesIndex)(CGhoul2Info *ghlInfo, const int index, const vec3_t angles, const int flags, const Eorientations yaw, const Eorientations pitch, const Eorientations roll, qhandle_t *modelList, int blendTime, int AcurrentTime); diff --git a/code/rd-vanilla/G2_API.cpp b/code/rd-vanilla/G2_API.cpp index 8f11a936a8..b0ef2257c7 100644 --- a/code/rd-vanilla/G2_API.cpp +++ b/code/rd-vanilla/G2_API.cpp @@ -1284,9 +1284,9 @@ qboolean G2API_StopBoneAnim(CGhoul2Info *ghlInfo, const char *boneName) return ret; } -qboolean G2API_SetBoneAnglesIndex(CGhoul2Info *ghlInfo, const int index, const vec3_t angles, const int flags, - const Eorientations yaw, const Eorientations pitch, const Eorientations roll, - qhandle_t *, int blendTime, int AcurrentTime) +qboolean G2API_SetBoneAnglesOffsetIndex(CGhoul2Info *ghlInfo, const int index, const vec3_t angles, const int flags, + const Eorientations yaw, const Eorientations pitch, const Eorientations roll, + qhandle_t *, int blendTime, int AcurrentTime, const vec3_t offset ) { //rww - RAGDOLL_BEGIN if (ghlInfo && ghlInfo->mFlags & GHOUL2_RAG_STARTED) @@ -1294,7 +1294,7 @@ qboolean G2API_SetBoneAnglesIndex(CGhoul2Info *ghlInfo, const int index, const v return qfalse; } //rww - RAGDOLL_END - + qboolean ret=qfalse; if (G2_SetupModelPointers(ghlInfo)) { @@ -1304,16 +1304,23 @@ qboolean G2API_SetBoneAnglesIndex(CGhoul2Info *ghlInfo, const int index, const v G2ERROR(index>=0&&index<(int)ghlInfo->mBlist.size(),"G2API_SetBoneAnglesIndex:Invalid bone index"); if (index>=0&&index<(int)ghlInfo->mBlist.size()) { - ret=G2_Set_Bone_Angles_Index(ghlInfo, ghlInfo->mBlist, index, angles, flags, yaw, pitch, roll,blendTime, currentTime); + ret=G2_Set_Bone_Angles_Index(ghlInfo, ghlInfo->mBlist, index, angles, flags, yaw, pitch, roll,blendTime, currentTime, offset); } } G2WARNING(ret,"G2API_SetBoneAnglesIndex Failed"); return ret; } -qboolean G2API_SetBoneAngles(CGhoul2Info *ghlInfo, const char *boneName, const vec3_t angles, const int flags, - const Eorientations up, const Eorientations left, const Eorientations forward, +qboolean G2API_SetBoneAnglesIndex(CGhoul2Info *ghlInfo, const int index, const vec3_t angles, const int flags, + const Eorientations yaw, const Eorientations pitch, const Eorientations roll, qhandle_t *, int blendTime, int AcurrentTime ) +{ + return G2API_SetBoneAnglesOffsetIndex(ghlInfo, index, angles, flags, yaw, pitch, roll, 0, blendTime, AcurrentTime, NULL); +} + +qboolean G2API_SetBoneAnglesOffset(CGhoul2Info *ghlInfo, const char *boneName, const vec3_t angles, const int flags, + const Eorientations up, const Eorientations left, const Eorientations forward, + qhandle_t *, int blendTime, int AcurrentTime, const vec3_t offset ) { //rww - RAGDOLL_BEGIN if (ghlInfo && ghlInfo->mFlags & GHOUL2_RAG_STARTED) @@ -1321,20 +1328,27 @@ qboolean G2API_SetBoneAngles(CGhoul2Info *ghlInfo, const char *boneName, const v return qfalse; } //rww - RAGDOLL_END - + qboolean ret=qfalse; G2ERROR(boneName,"NULL boneName"); if (boneName&&G2_SetupModelPointers(ghlInfo)) { int currentTime=G2API_GetTime(AcurrentTime); - // ensure we flush the cache + // ensure we flush the cache ghlInfo->mSkelFrameNum = 0; - ret=G2_Set_Bone_Angles(ghlInfo, ghlInfo->mBlist, boneName, angles, flags, up, left, forward, blendTime, currentTime); + ret=G2_Set_Bone_Angles(ghlInfo, ghlInfo->mBlist, boneName, angles, flags, up, left, forward, blendTime, currentTime, offset); } G2WARNING(ret,"G2API_SetBoneAngles Failed"); return ret; } +qboolean G2API_SetBoneAngles(CGhoul2Info *ghlInfo, const char *boneName, const vec3_t angles, const int flags, + const Eorientations up, const Eorientations left, const Eorientations forward, + qhandle_t *, int blendTime, int AcurrentTime) +{ + return G2API_SetBoneAnglesOffset(ghlInfo, boneName, angles, flags, up, left, forward, 0, blendTime, AcurrentTime, NULL); +} + qboolean G2API_SetBoneAnglesMatrixIndex(CGhoul2Info *ghlInfo, const int index, const mdxaBone_t &matrix, const int flags, qhandle_t *, int blendTime, int AcurrentTime) { diff --git a/code/rd-vanilla/G2_bones.cpp b/code/rd-vanilla/G2_bones.cpp index beb4bb309f..51f9f1eaba 100644 --- a/code/rd-vanilla/G2_bones.cpp +++ b/code/rd-vanilla/G2_bones.cpp @@ -229,7 +229,7 @@ qboolean G2_Stop_Bone_Index( boneInfo_v &blist, int index, int flags) // generate a matrix for a given bone given some new angles for it. void G2_Generate_Matrix(const model_t *mod, boneInfo_v &blist, int index, const float *angles, int flags, - const Eorientations up, const Eorientations left, const Eorientations forward) + const Eorientations up, const Eorientations left, const Eorientations forward, const vec3_t offset = NULL) { mdxaSkel_t *skel; mdxaSkelOffsets_t *offsets; @@ -319,6 +319,13 @@ void G2_Generate_Matrix(const model_t *mod, boneInfo_v &blist, int index, const } Create_Matrix(newAngles, boneOverride); + + if (offset) + { + boneOverride->matrix[0][3] = offset[0]; + boneOverride->matrix[1][3] = offset[1]; + boneOverride->matrix[2][3] = offset[2]; + } // figure out where the bone hirearchy info is offsets = (mdxaSkelOffsets_t *)((byte *)mod->mdxa + sizeof(mdxaHeader_t)); @@ -339,6 +346,13 @@ void G2_Generate_Matrix(const model_t *mod, boneInfo_v &blist, int index, const } Create_Matrix(newAngles, &temp1); + + if (offset) + { + temp1.matrix[0][3] = offset[0]; + temp1.matrix[1][3] = offset[1]; + temp1.matrix[2][3] = offset[2]; + } permutation.matrix[0][0] = permutation.matrix[0][1] = permutation.matrix[0][2] = permutation.matrix[0][3] = 0; permutation.matrix[1][0] = permutation.matrix[1][1] = permutation.matrix[1][2] = permutation.matrix[1][3] = 0; @@ -450,7 +464,7 @@ qboolean G2_Remove_Bone (CGhoul2Info *ghlInfo, boneInfo_v &blist, const char *bo qboolean G2_Set_Bone_Angles_Index(CGhoul2Info *ghlInfo, boneInfo_v &blist, const int index, const float *angles, const int flags, const Eorientations yaw, const Eorientations pitch, const Eorientations roll, - const int blendTime, const int currentTime) + const int blendTime, const int currentTime, const vec3_t offset) { if (index<0||(index >= (int)blist.size()) || (blist[index].boneNumber == -1)) @@ -466,7 +480,7 @@ qboolean G2_Set_Bone_Angles_Index(CGhoul2Info *ghlInfo, boneInfo_v &blist, const #if DEBUG_PCJ OutputDebugString(va("%8x %2d %6d (%6.2f,%6.2f,%6.2f) %d %d %d %d\n",(int)ghlInfo,index,currentTime,angles[0],angles[1],angles[2],yaw,pitch,roll,flags)); #endif - G2_Generate_Matrix(ghlInfo->animModel, blist, index, angles, flags, yaw, pitch, roll); + G2_Generate_Matrix(ghlInfo->animModel, blist, index, angles, flags, yaw, pitch, roll, offset); return qtrue; } @@ -474,7 +488,7 @@ qboolean G2_Set_Bone_Angles_Index(CGhoul2Info *ghlInfo, boneInfo_v &blist, const // Given a model handle, and a bone name, we want to set angles specifically for overriding qboolean G2_Set_Bone_Angles(CGhoul2Info *ghlInfo, boneInfo_v &blist, const char *boneName, const float *angles, const int flags, const Eorientations up, const Eorientations left, const Eorientations forward, - const int blendTime, const int currentTime) + const int blendTime, const int currentTime, const vec3_t offset) { int index = G2_Find_Bone(ghlInfo, blist, boneName); if (index == -1) @@ -488,7 +502,7 @@ qboolean G2_Set_Bone_Angles(CGhoul2Info *ghlInfo, boneInfo_v &blist, const char blist[index].boneBlendStart = currentTime; blist[index].boneBlendTime = blendTime; - G2_Generate_Matrix(ghlInfo->animModel, blist, index, angles, flags, up, left, forward); + G2_Generate_Matrix(ghlInfo->animModel, blist, index, angles, flags, up, left, forward, offset); return qtrue; } return qfalse; diff --git a/code/rd-vanilla/tr_init.cpp b/code/rd-vanilla/tr_init.cpp index 7d24ef5e45..f61f97048e 100644 --- a/code/rd-vanilla/tr_init.cpp +++ b/code/rd-vanilla/tr_init.cpp @@ -2144,6 +2144,7 @@ extern "C" Q_EXPORT refexport_t* QDECL GetRefAPI ( int apiVersion, refimport_t * G2EX(SetBoneAnim); G2EX(SetBoneAnimIndex); G2EX(SetBoneAngles); + G2EX(SetBoneAnglesOffset); G2EX(SetBoneAnglesIndex); G2EX(SetBoneAnglesMatrix); G2EX(SetBoneIKState); diff --git a/code/server/sv_game.cpp b/code/server/sv_game.cpp index 9c692f5402..5b5c826637 100644 --- a/code/server/sv_game.cpp +++ b/code/server/sv_game.cpp @@ -711,6 +711,13 @@ static qboolean SV_G2API_SetBoneAngles(CGhoul2Info *ghlInfo, const char *boneNam modelList, blendTime, AcurrentTime ); } +static qboolean SV_G2API_SetBoneAnglesOffset(CGhoul2Info *ghlInfo, const char *boneName, const vec3_t angles, const int flags, + const Eorientations up, const Eorientations right, const Eorientations forward, qhandle_t *modelList, + int blendTime, int currentTime, const vec3_t offset) +{ + return re.G2API_SetBoneAnglesOffset( ghlInfo, boneName, angles, flags, up, right, forward, modelList, blendTime, currentTime, offset); +} + static qboolean SV_G2API_SetBoneAnglesIndex(CGhoul2Info *ghlInfo, const int index, const vec3_t angles, const int flags, const Eorientations yaw, const Eorientations pitch, const Eorientations roll, qhandle_t *modelList, int blendTime, int AcurrentTime) @@ -969,6 +976,7 @@ void SV_InitGameProgs (void) { import.G2API_HaveWeGhoul2Models = SV_G2API_HaveWeGhoul2Models; import.G2API_InitGhoul2Model = SV_G2API_InitGhoul2Model; import.G2API_SetBoneAngles = SV_G2API_SetBoneAngles; + import.G2API_SetBoneAnglesOffset = SV_G2API_SetBoneAnglesOffset; import.G2API_SetBoneAnglesMatrix = SV_G2API_SetBoneAnglesMatrix; import.G2API_SetBoneAnim = SV_G2API_SetBoneAnim; import.G2API_SetSkin = SV_G2API_SetSkin; From b1684e9395d73dd3b6ee363be7f8b966432f8c58 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Wed, 8 Jan 2014 22:58:08 +0000 Subject: [PATCH 382/445] Custom sabers: Add customisable sabers a bit like customisable species. Can set custom saber using /customSaber command. Have 5 slots available. Includes UI support for sabers. This commit is merged from many old commits (mostly fixes). --- code/cgame/cg_consolecmds.cpp | 1 + code/game/g_client.cpp | 71 ++ code/game/g_items.cpp | 49 +- code/game/g_main.cpp | 12 +- code/game/g_shared.h | 1 + code/game/g_svcmds.cpp | 70 +- code/rd-vanilla/tr_skin.cpp | 117 +++- code/ui/menudef.h | 12 + code/ui/ui_local.h | 26 + code/ui/ui_main.cpp | 1237 +++++++++++++++++++++++++++++++-- code/ui/ui_saber.cpp | 107 ++- 11 files changed, 1641 insertions(+), 62 deletions(-) diff --git a/code/cgame/cg_consolecmds.cpp b/code/cgame/cg_consolecmds.cpp index 30501049e3..3e4982cbba 100644 --- a/code/cgame/cg_consolecmds.cpp +++ b/code/cgame/cg_consolecmds.cpp @@ -280,6 +280,7 @@ qboolean CG_ConsoleCommand( void ) { static const char *gcmds[] = { "bow", + "customsaber", "entitylist", "difficulty", "flourish", diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index f56ef58af1..7a58a78840 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -57,6 +57,9 @@ extern cvar_t *g_char_color_2_red; extern cvar_t *g_char_color_2_green; extern cvar_t *g_char_color_2_blue; +extern cvar_t *g_saber_skin[MAX_SABER_PARTS]; +extern cvar_t *g_saber2_skin[MAX_SABER_PARTS]; + // g_client.c -- client functions that don't happen every frame float DEFAULT_MINS_0 = -16; @@ -1909,6 +1912,39 @@ void G_SetSabersFromCVars( gentity_t *ent ) { ent->client->ps.saberStylesKnown |= ent->client->ps.saber[0].singleBladeStyle; } + //Custom saber stuff! + if (ent->client->ps.saber[0].name && ent->client->ps.saber[0].name[0] && Q_stristr(ent->client->ps.saber[0].name, "saberbuilder") && ent->client->ps.saber[0].model) + { + char skinRoot[MAX_QPATH] = {0}; + Q_strncpyz(skinRoot, ent->client->ps.saber[0].model, MAX_QPATH); + int l = strlen(skinRoot); + while (l > 0 && skinRoot[l] != '/') + { //parse back to first / + l--; + } + + if (skinRoot[l] == '/') + { + l++; + skinRoot[l] = 0; + + Q_strcat(skinRoot, MAX_QPATH, "|_"); + + for (int j = 0; j < MAX_SABER_PARTS; j++) + { + Q_strcat(skinRoot, MAX_QPATH, "|"); + if (g_saber_skin[j] && g_saber_skin[j]->string && g_saber_skin[j]->string[0]) + { + Q_strcat(skinRoot, MAX_QPATH, g_saber_skin[j]->string); + } + } + + if(ent->client->ps.saber[0].skin && gi.bIsFromZone(ent->client->ps.saber[0].skin, TAG_G_ALLOC) ) { + gi.Free(ent->client->ps.saber[0].skin); + } + ent->client->ps.saber[0].skin = G_NewString(skinRoot); + } + } } if ( player @@ -1946,6 +1982,41 @@ void G_SetSabersFromCVars( gentity_t *ent ) { ent->client->ps.saberStylesKnown |= ent->client->ps.saber[1].singleBladeStyle; } + + //Custom saber stuff! + if (ent->client->ps.saber[1].name && ent->client->ps.saber[1].name[0] && Q_stristr(ent->client->ps.saber[1].name, "saberbuilder") && ent->client->ps.saber[1].model) + { + char skinRoot[MAX_QPATH] = {0}; + Q_strncpyz(skinRoot, ent->client->ps.saber[1].model, MAX_QPATH); + int l = strlen(skinRoot); + while (l > 0 && skinRoot[l] != '/') + { //parse back to first / + l--; + } + + if (skinRoot[l] == '/') + { + l++; + skinRoot[l] = 0; + + Q_strcat(skinRoot, MAX_QPATH, "|_"); + + for (int j = 0; j < MAX_SABER_PARTS; j++) + { + Q_strcat(skinRoot, MAX_QPATH, "|"); + if (g_saber2_skin[j] && g_saber2_skin[j]->string && g_saber2_skin[j]->string[0]) + { + Q_strcat(skinRoot, MAX_QPATH, g_saber2_skin[j]->string); + } + } + + if(ent->client->ps.saber[1].skin && gi.bIsFromZone(ent->client->ps.saber[1].skin, TAG_G_ALLOC) ) { + gi.Free(ent->client->ps.saber[1].skin); + } + ent->client->ps.saber[1].skin = G_NewString(skinRoot); + } + } + if ( (ent->client->ps.saber[1].saberFlags&SFL_TWO_HANDED) ) {//tsk tsk, can't use a twoHanded saber as second saber WP_RemoveSaber( ent, 1 ); diff --git a/code/game/g_items.cpp b/code/game/g_items.cpp index b834c059bd..c32bec6e8b 100644 --- a/code/game/g_items.cpp +++ b/code/game/g_items.cpp @@ -1107,6 +1107,7 @@ free fall from their spawn points */ extern int delayedShutDown; extern cvar_t *g_saber; +extern cvar_t *g_saber_skin[MAX_SABER_PARTS]; void FinishSpawningItem( gentity_t *ent ) { trace_t tr; vec3_t dest; @@ -1159,6 +1160,39 @@ void FinishSpawningItem( gentity_t *ent ) { && Q_stricmp( "NULL", g_saber->string ) ) {//player's saber WP_SaberParseParms( g_saber->string, &itemSaber ); + //Custom saber stuff! + if (Q_stristr(itemSaber.name, "saberbuilder")) + { + char skinRoot[MAX_QPATH] = {0}; + Q_strncpyz(skinRoot, itemSaber.model, MAX_QPATH); + int l = strlen(skinRoot); + while (l > 0 && skinRoot[l] != '/') + { //parse back to first / + l--; + } + + if (skinRoot[l] == '/') + { + l++; + skinRoot[l] = 0; + + Q_strcat(skinRoot, MAX_QPATH, "|_"); + + for (int j = 0; j < MAX_SABER_PARTS; j++) + { + Q_strcat(skinRoot, MAX_QPATH, "|"); + if (g_saber_skin[j] && g_saber_skin[j]->string && g_saber_skin[j]->string[0]) + { + Q_strcat(skinRoot, MAX_QPATH, g_saber_skin[j]->string); + } + } + + if(itemSaber.skin && gi.bIsFromZone(itemSaber.skin, TAG_G_ALLOC) ) { + gi.Free(itemSaber.skin); + } + itemSaber.skin = G_NewString(skinRoot); + } + } } else {//specific saber @@ -1166,7 +1200,20 @@ void FinishSpawningItem( gentity_t *ent ) { } //NOTE: should I keep this string around for any reason? Will I ever need it later? //ent->??? = G_NewString( itemSaber.model ); - gi.G2API_InitGhoul2Model( ent->ghoul2, itemSaber.model, G_ModelIndex( itemSaber.model ), NULL_HANDLE, NULL_HANDLE, 0, 0); + int g2Model = gi.G2API_InitGhoul2Model( ent->ghoul2, itemSaber.model, G_ModelIndex( itemSaber.model ), NULL_HANDLE, NULL_HANDLE, 0, 0); + + if ( itemSaber.skin != NULL ) + {//if this saber has a customSkin, use it + // lets see if it's out there + int saberSkin = gi.RE_RegisterSkin( itemSaber.skin ); + if ( saberSkin ) + { + // put it in the config strings + // and set the ghoul2 model to use it + gi.G2API_SetSkin( &ent->ghoul2[g2Model], G_SkinIndex( itemSaber.skin ), saberSkin ); + } + } + WP_SaberFreeStrings(itemSaber); } else diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 9e2d4e6d5f..2b376237fe 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -222,6 +222,10 @@ cvar_t *g_char_color_2_red; cvar_t *g_char_color_2_green; cvar_t *g_char_color_2_blue; +cvar_t *g_saber_skin[MAX_SABER_PARTS]; +cvar_t *g_saber2_skin[MAX_SABER_PARTS]; + + // kef -- used with DebugTraceForNPC cvar_t *g_npcdebug; @@ -709,7 +713,13 @@ void G_InitCvars( void ) { g_char_color_2_red = gi.cvar( "g_char_color_2_red", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); g_char_color_2_green = gi.cvar( "g_char_color_2_green", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); g_char_color_2_blue = gi.cvar( "g_char_color_2_blue", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); - + + for (int i = 0; i < MAX_SABER_PARTS; i++) + { + g_saber_skin[i] = gi.cvar( va("g_saber_skin%d", (i+1)), "", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_saber2_skin[i] = gi.cvar( va("g_saber2_skin%d", (i+1)), "", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + } + g_broadsword = gi.cvar( "broadsword", "1", 0); diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 3282ec07f8..791e455102 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -966,6 +966,7 @@ class parms_t #define MAX_FAILED_NODES 8 #define MAX_INHAND_WEAPONS 2 #define MAX_HOLSTER_WEAPONS 2 +#define MAX_SABER_PARTS 5 typedef struct centity_s centity_t; diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index 05ee788e0f..701c2298e2 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -42,6 +42,8 @@ extern saber_colors_t TranslateSaberColor( const char *name ); extern qboolean WP_SaberBladeUseSecondBladeStyle( saberInfo_t *saber, int bladeNum ); extern qboolean WP_UseFirstValidSaberStyle( gentity_t *ent, int *saberAnimLevel ); +extern void G_SetSabersFromCVars( gentity_t *ent ); + extern void G_SetWeapon( gentity_t *self, int wp ); extern stringID_table_t WPTable[]; @@ -948,6 +950,40 @@ static void Svcmd_NewPlayerTint_f(void) } } +static void Svcmd_CustomSaber_f(void) +{ + if ( gi.argc() == 1 ) + { + gi.Printf( S_COLOR_RED"USAGE: customSaber \n" ); + } + else if ( gi.argc() == 7 ) + { + if (atoi(gi.argv(1)) == 1) + { + gi.cvar_set("g_saber2_skin1", gi.argv(2) ); + gi.cvar_set("g_saber2_skin2", gi.argv(3) ); + gi.cvar_set("g_saber2_skin3", gi.argv(4) ); + gi.cvar_set("g_saber2_skin4", gi.argv(5) ); + gi.cvar_set("g_saber2_skin5", gi.argv(6) ); + } + else + { + gi.cvar_set("g_saber_skin1", gi.argv(2) ); + gi.cvar_set("g_saber_skin2", gi.argv(3) ); + gi.cvar_set("g_saber_skin3", gi.argv(4) ); + gi.cvar_set("g_saber_skin4", gi.argv(5) ); + gi.cvar_set("g_saber_skin5", gi.argv(6) ); + } + + G_SetSabersFromCVars(&g_entities[0]); + + if ((&g_entities[0])->client->ps.weapon == WP_SABER) + { + WP_SaberAddG2SaberModels(&g_entities[0]); + } + } +} + #define CMD_NONE (0x00000000u) #define CMD_CHEAT (0x00000001u) #define CMD_ALIVE (0x00000002u) @@ -1019,6 +1055,8 @@ static svcmd_t svcmds[] = { { "headPlayerModel", Svcmd_HeadPlayerModel_f, CMD_NONE }, { "newPlayerTint", Svcmd_NewPlayerTint_f, CMD_NONE }, + + { "customSaber", Svcmd_CustomSaber_f, CMD_NONE }, //{ "say", Svcmd_Say_f, qtrue }, //{ "toggleallowvote", Svcmd_ToggleAllowVote_f, qfalse }, @@ -1047,7 +1085,37 @@ qboolean ConsoleCommand( void ) { else if ( (command->flags & CMD_ALIVE) && (g_entities[0].health <= 0) ) { - gi.Printf( "You must be alive to use this command.\n" ); + if ( gi.argc() == 1 ) + { + gi.Printf( S_COLOR_RED"USAGE: customSaber \n" ); + } + else if ( gi.argc() == 7 ) + { + if (atoi(gi.argv(1)) == 1) + { + gi.cvar_set("g_saber2_skin_1", gi.argv(2) ); + gi.cvar_set("g_saber2_skin_2", gi.argv(3) ); + gi.cvar_set("g_saber2_skin_3", gi.argv(4) ); + gi.cvar_set("g_saber2_skin_4", gi.argv(5) ); + gi.cvar_set("g_saber2_skin_5", gi.argv(6) ); + } + else + { + gi.cvar_set("g_saber_skin_1", gi.argv(2) ); + gi.cvar_set("g_saber_skin_2", gi.argv(3) ); + gi.cvar_set("g_saber_skin_3", gi.argv(4) ); + gi.cvar_set("g_saber_skin_4", gi.argv(5) ); + gi.cvar_set("g_saber_skin_5", gi.argv(6) ); + } + + G_SetSabersFromCVars(&g_entities[0]); + + if ((&g_entities[0])->client->ps.weapon == WP_SABER) + { + WP_SaberAddG2SaberModels(&g_entities[0]); + } + + } return qtrue; } else diff --git a/code/rd-vanilla/tr_skin.cpp b/code/rd-vanilla/tr_skin.cpp index 48e474a881..1a1be979ab 100644 --- a/code/rd-vanilla/tr_skin.cpp +++ b/code/rd-vanilla/tr_skin.cpp @@ -263,6 +263,94 @@ bool RE_SplitSkins(const char *INname, char *skinhead, char *skintorso, char *sk return false; } +/* + =============== + RE_SplitSkinsNew + input = skinname, possibly being a macro for five skins + return= true if five part skins found + output= qualified names to five skins if return is true, undefined if false + =============== + */ +bool RE_SplitSkinsNew(const char *INname, char *skinhead, char *skintorso, char *skinlower, char *skin4, char *skin5) +{ //INname= "models/weapons2/saber/|_|skin1|skin2|skin3|skin4|skin5"; + if (strstr(INname, "|_|")) + { + char name[MAX_QPATH]; + strcpy(name, INname); + char *p = strstr(name, "|_|"); + *p=0; + p+=3; + //fill in the base path + strcpy (skinhead, name); + strcpy (skintorso, name); + strcpy (skinlower, name); + strcpy (skin4, name); + strcpy (skin5, name); + + //now get the the individual files + + //advance to second + char *p2 = strchr(p, '|'); + if (!p2) + { + strcat (skinhead, p); + strcat (skinhead, ".skin"); + return true; + } + *p2=0; + p2++; + strcat (skinhead, p); + strcat (skinhead, ".skin"); + + + //advance to third + p = strchr(p2, '|'); + if (!p) + { + strcat (skintorso,p2); + strcat (skintorso, ".skin"); + return true; + } + *p=0; + p++; + strcat (skintorso,p2); + strcat (skintorso, ".skin"); + + //fourth... + p2 = strchr(p, '|'); + if (!p2) + { + strcat (skinlower, p); + strcat (skinlower, ".skin"); + return true; + } + *p2=0; + p2++; + strcat (skinlower, p); + strcat (skinlower, ".skin"); + + //fifth... + p = strchr(p2, '|'); + if (!p) + { + strcat (skin4,p2); + strcat (skin4, ".skin"); + return true; + } + *p=0; + p++; + strcat (skin4,p2); + strcat (skin4, ".skin"); + + + strcat (skin5,p); + strcat (skin5, ".skin"); + + return true; + } + return false; +} + // given a name, go get the skin we want and return qhandle_t RE_RegisterIndividualSkin( const char *name , qhandle_t hSkin) { @@ -410,7 +498,34 @@ qhandle_t RE_RegisterSkin( const char *name) { char skinhead[MAX_QPATH]={0}; char skintorso[MAX_QPATH]={0}; char skinlower[MAX_QPATH]={0}; - if ( RE_SplitSkins(name, (char*)&skinhead, (char*)&skintorso, (char*)&skinlower ) ) + char skin4[MAX_QPATH] = {0}; + char skin5[MAX_QPATH] = {0}; + if ( RE_SplitSkinsNew(name, (char*)&skinhead, (char*)&skintorso, (char*)&skinlower, (char*)&skin4, (char*)&skin5 ) ) + {//up to five part + qhandle_t appendSkin; + hSkin = RE_RegisterIndividualSkin(skinhead, hSkin); + appendSkin = RE_RegisterIndividualSkin(skintorso, hSkin); + if (hSkin && appendSkin) + { + hSkin = appendSkin; + appendSkin = RE_RegisterIndividualSkin(skinlower, hSkin); + if (hSkin && appendSkin) + { + hSkin = appendSkin; + appendSkin = RE_RegisterIndividualSkin(skin4, hSkin); + if (hSkin && appendSkin) + { + hSkin = appendSkin; + appendSkin = RE_RegisterIndividualSkin(skin5, hSkin); + if (hSkin && appendSkin) + { + hSkin = appendSkin; + } + } + } + } + } + else if ( RE_SplitSkins(name, (char*)&skinhead, (char*)&skintorso, (char*)&skinlower ) ) {//three part hSkin = RE_RegisterIndividualSkin(skinhead, hSkin); if (hSkin && strcmp(skinhead, skintorso)) diff --git a/code/ui/menudef.h b/code/ui/menudef.h index c965b505df..afe5f09a25 100644 --- a/code/ui/menudef.h +++ b/code/ui/menudef.h @@ -100,6 +100,18 @@ along with this program; if not, see . #define FEEDER_LANGUAGES 0x17 // the list of languages #define FEEDER_COLORCHOICES2 0x18 // more text/actions from playerchoice2.txt! +#define FEEDER_SABER_SKIN_1 0x19 +#define FEEDER_SABER_SKIN_2 0x1a +#define FEEDER_SABER_SKIN_3 0x1b +#define FEEDER_SABER_SKIN_4 0x1c +#define FEEDER_SABER_SKIN_5 0x1d + +#define FEEDER_SABER2_SKIN_1 0x1e +#define FEEDER_SABER2_SKIN_2 0x1f +#define FEEDER_SABER2_SKIN_3 0x20 +#define FEEDER_SABER2_SKIN_4 0x21 +#define FEEDER_SABER2_SKIN_5 0x22 + #define UI_VERSION 200 #define UI_HANDICAP 200 diff --git a/code/ui/ui_local.h b/code/ui/ui_local.h index 04ae3c0408..a4f7a960af 100644 --- a/code/ui/ui_local.h +++ b/code/ui/ui_local.h @@ -160,6 +160,26 @@ typedef struct { headSwap_t *HeadSwap; } playerSpeciesInfo_t; +typedef struct { + char name[32]; + char desc[64]; + int count; + int max; + skinName_t *skins; +} saberPartSkin_t; + +typedef struct { + char SaberName[64]; + char SaberLongName[64]; + char FolderName[MAX_QPATH]; + saberPartSkin_t Skin1; + saberPartSkin_t Skin2; + saberPartSkin_t Skin3; + saberPartSkin_t Skin4; + saberPartSkin_t Skin5; + qboolean isStaff; +} customSaberInfo_t; + typedef struct { displayContextDef_t uiDC; @@ -174,6 +194,12 @@ typedef struct { int playerSpeciesCount; playerSpeciesInfo_t *playerSpecies; int playerSpeciesIndex; + + int customSabersMax; + int customSabersCount; + customSaberInfo_t *customSabers; + int customSabersIndex; + int customSabers2Index; char deferredScript [ MAX_DEFERRED_SCRIPT ]; diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index f3d59e52bf..6b26eb0875 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -55,7 +55,7 @@ extern qboolean ItemParse_asset_model_go( itemDef_t *item, const char *name ); extern qboolean ItemParse_asset_model_go_head( itemDef_t *item, const char *name, qboolean cleanuponly ); extern qboolean ItemParse_model_g2skin_go( itemDef_t *item, const char *skinName ); extern qboolean UI_SaberModelForSaber( const char *saberName, char *saberModel ); -extern qboolean UI_SaberSkinForSaber( const char *saberName, char *saberSkin ); +extern qboolean UI_SaberSkinForSaber( const char *saberName, char *saberSkin, qboolean secondSaber ); extern void UI_SaberAttachToChar( itemDef_t *item ); extern qboolean PC_Script_Parse(const char **out); @@ -134,8 +134,10 @@ static void UI_GiveInventory ( const int itemIndex, const int amount ); static void UI_ForcePowerWeaponsButton(qboolean activeFlag); static void UI_UpdateCharacterSkin( void ); static void UI_UpdateCharacter( qboolean changedModel ); +static void UI_CorrectSaberList( void ); static void UI_UpdateSaberType( void ); -static void UI_UpdateSaberHilt( qboolean secondSaber ); +static void UI_UpdateSaberHilt( qboolean secondSaber, qboolean changedModel ); +static void UI_UpdateCustomSaber( qboolean secondSaber ); //static void UI_UpdateSaberColor( qboolean secondSaber ); static void UI_InitWeaponSelect( void ); static void UI_WeaponHelpActive( void ); @@ -393,6 +395,17 @@ vmCvar_t ui_rgb_saber2_blue; vmCvar_t ui_char_head_model; vmCvar_t ui_char_head_skin; +vmCvar_t ui_saber_skin1; +vmCvar_t ui_saber_skin2; +vmCvar_t ui_saber_skin3; +vmCvar_t ui_saber_skin4; +vmCvar_t ui_saber_skin5; +vmCvar_t ui_saber2_skin1; +vmCvar_t ui_saber2_skin2; +vmCvar_t ui_saber2_skin3; +vmCvar_t ui_saber2_skin4; +vmCvar_t ui_saber2_skin5; + vmCvar_t ui_char_color_2_red; vmCvar_t ui_char_color_2_green; vmCvar_t ui_char_color_2_blue @@ -438,6 +451,25 @@ static cvarTable_t cvarTable[] = { &ui_char_color_2_red, "ui_char_color_2_red", "", 0}, { &ui_char_color_2_green, "ui_char_color_2_green", "", 0}, { &ui_char_color_2_blue, "ui_char_color_2_blue", "", 0}, + + { &ui_rgb_saber_red, "ui_rgb_saber_red", "", 0}, + { &ui_rgb_saber_blue, "ui_rgb_saber_blue", "", 0}, + { &ui_rgb_saber_green, "ui_rgb_saber_green", "", 0}, + { &ui_rgb_saber2_red, "ui_rgb_saber2_red", "", 0}, + { &ui_rgb_saber2_blue, "ui_rgb_saber2_blue", "", 0}, + { &ui_rgb_saber2_green, "ui_rgb_saber2_green", "", 0}, + + { &ui_saber_skin1, "ui_saber_skin1", "", 0}, + { &ui_saber_skin2, "ui_saber_skin2", "", 0}, + { &ui_saber_skin3, "ui_saber_skin3", "", 0}, + { &ui_saber_skin4, "ui_saber_skin4", "", 0}, + { &ui_saber_skin5, "ui_saber_skin5", "", 0}, + { &ui_saber2_skin1, "ui_saber2_skin1", "", 0}, + { &ui_saber2_skin2, "ui_saber2_skin2", "", 0}, + { &ui_saber2_skin3, "ui_saber2_skin3", "", 0}, + { &ui_saber2_skin4, "ui_saber2_skin4", "", 0}, + { &ui_saber2_skin5, "ui_saber2_skin5", "", 0}, + }; @@ -727,6 +759,86 @@ const char *UI_FeederItemText(float feederID, int index, int column, qhandle_t * return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color2[index].shader; } } + else if (feederID == FEEDER_SABER_SKIN_1) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabersIndex].Skin1.count) + { + *handle = ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabersIndex].FolderName, uiInfo.customSabers[uiInfo.customSabersIndex].Skin1.skins[index].name)); + return uiInfo.customSabers[uiInfo.customSabersIndex].Skin1.skins[index].name; + } + } + else if (feederID == FEEDER_SABER_SKIN_2) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabersIndex].Skin2.count) + { + *handle = ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabersIndex].FolderName, uiInfo.customSabers[uiInfo.customSabersIndex].Skin2.skins[index].name)); + return uiInfo.customSabers[uiInfo.customSabersIndex].Skin2.skins[index].name; + } + } + else if (feederID == FEEDER_SABER_SKIN_3) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabersIndex].Skin3.count) + { + *handle = ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabersIndex].FolderName, uiInfo.customSabers[uiInfo.customSabersIndex].Skin3.skins[index].name)); + return uiInfo.customSabers[uiInfo.customSabersIndex].Skin3.skins[index].name; + } + } + else if (feederID == FEEDER_SABER_SKIN_4) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabersIndex].Skin4.count) + { + *handle = ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabersIndex].FolderName, uiInfo.customSabers[uiInfo.customSabersIndex].Skin4.skins[index].name)); + return uiInfo.customSabers[uiInfo.customSabersIndex].Skin4.skins[index].name; + } + } + else if (feederID == FEEDER_SABER_SKIN_5) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabersIndex].Skin5.count) + { + *handle = ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabersIndex].FolderName, uiInfo.customSabers[uiInfo.customSabersIndex].Skin5.skins[index].name)); + return uiInfo.customSabers[uiInfo.customSabersIndex].Skin5.skins[index].name; + } + } + else if (feederID == FEEDER_SABER2_SKIN_1) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabers2Index].Skin1.count) + { + *handle = ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabers2Index].FolderName, uiInfo.customSabers[uiInfo.customSabers2Index].Skin1.skins[index].name)); + return uiInfo.customSabers[uiInfo.customSabers2Index].Skin1.skins[index].name; + } + } + else if (feederID == FEEDER_SABER2_SKIN_2) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabers2Index].Skin2.count) + { + *handle = ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabers2Index].FolderName, uiInfo.customSabers[uiInfo.customSabers2Index].Skin2.skins[index].name)); + return uiInfo.customSabers[uiInfo.customSabers2Index].Skin2.skins[index].name; + } + } + else if (feederID == FEEDER_SABER2_SKIN_3) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabers2Index].Skin3.count) + { + *handle = ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabers2Index].FolderName, uiInfo.customSabers[uiInfo.customSabers2Index].Skin3.skins[index].name)); + return uiInfo.customSabers[uiInfo.customSabers2Index].Skin3.skins[index].name; + } + } + else if (feederID == FEEDER_SABER2_SKIN_4) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabers2Index].Skin4.count) + { + *handle = ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabers2Index].FolderName, uiInfo.customSabers[uiInfo.customSabers2Index].Skin4.skins[index].name)); + return uiInfo.customSabers[uiInfo.customSabers2Index].Skin4.skins[index].name; + } + } + else if (feederID == FEEDER_SABER2_SKIN_5) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabers2Index].Skin5.count) + { + *handle = ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabers2Index].FolderName, uiInfo.customSabers[uiInfo.customSabers2Index].Skin5.skins[index].name)); + return uiInfo.customSabers[uiInfo.customSabers2Index].Skin5.skins[index].name; + } + } else if (feederID == FEEDER_MODS) { if (index >= 0 && index < uiInfo.modCount) @@ -785,6 +897,76 @@ qhandle_t UI_FeederItemImage(float feederID, int index) return ui.R_RegisterShaderNoMip( uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color2[index].shader); } } + else if (feederID == FEEDER_SABER_SKIN_1) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabersIndex].Skin1.count) + { + return ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabersIndex].FolderName, uiInfo.customSabers[uiInfo.customSabersIndex].Skin1.skins[index].name)); + } + } + else if (feederID == FEEDER_SABER_SKIN_2) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabersIndex].Skin2.count) + { + return ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabersIndex].FolderName, uiInfo.customSabers[uiInfo.customSabersIndex].Skin2.skins[index].name)); + } + } + else if (feederID == FEEDER_SABER_SKIN_3) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabersIndex].Skin3.count) + { + return ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabersIndex].FolderName, uiInfo.customSabers[uiInfo.customSabersIndex].Skin3.skins[index].name)); + } + } + else if (feederID == FEEDER_SABER_SKIN_4) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabersIndex].Skin4.count) + { + return ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabersIndex].FolderName, uiInfo.customSabers[uiInfo.customSabersIndex].Skin4.skins[index].name)); + } + } + else if (feederID == FEEDER_SABER_SKIN_5) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabersIndex].Skin5.count) + { + return ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabersIndex].FolderName, uiInfo.customSabers[uiInfo.customSabersIndex].Skin5.skins[index].name)); + } + } + else if (feederID == FEEDER_SABER2_SKIN_1) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabers2Index].Skin1.count) + { + return ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabers2Index].FolderName, uiInfo.customSabers[uiInfo.customSabers2Index].Skin1.skins[index].name)); + } + } + else if (feederID == FEEDER_SABER2_SKIN_2) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabers2Index].Skin2.count) + { + return ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabers2Index].FolderName, uiInfo.customSabers[uiInfo.customSabers2Index].Skin2.skins[index].name)); + } + } + else if (feederID == FEEDER_SABER2_SKIN_3) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabers2Index].Skin3.count) + { + return ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabers2Index].FolderName, uiInfo.customSabers[uiInfo.customSabers2Index].Skin3.skins[index].name)); + } + } + else if (feederID == FEEDER_SABER2_SKIN_4) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabers2Index].Skin4.count) + { + return ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabers2Index].FolderName, uiInfo.customSabers[uiInfo.customSabers2Index].Skin4.skins[index].name)); + } + } + else if (feederID == FEEDER_SABER2_SKIN_5) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabers2Index].Skin5.count) + { + return ui.R_RegisterShaderNoMip(va("models/weapons2/%s/icon_%s.jpg", uiInfo.customSabers[uiInfo.customSabers2Index].FolderName, uiInfo.customSabers[uiInfo.customSabers2Index].Skin5.skins[index].name)); + } + } /* else if (feederID == FEEDER_ALLMAPS || feederID == FEEDER_MAPS) { int actual; @@ -1261,13 +1443,21 @@ static qboolean UI_RunMenuScript ( const char **args ) { UI_UpdateCharacterSkin(); } + else if (Q_stricmp(name, "correctsaberlist") == 0) + { + UI_CorrectSaberList(); + } else if (Q_stricmp(name, "saber_type") == 0) { UI_UpdateSaberType(); } else if (Q_stricmp(name, "saber_hilt") == 0) { - UI_UpdateSaberHilt( qfalse ); + UI_UpdateSaberHilt( qfalse, qtrue ); + } + else if (Q_stricmp(name, "saber_hilt_nochange") == 0) + { + UI_UpdateSaberHilt( qfalse, qfalse ); } else if (Q_stricmp(name, "saber_color") == 0) { @@ -1275,7 +1465,11 @@ static qboolean UI_RunMenuScript ( const char **args ) } else if (Q_stricmp(name, "saber2_hilt") == 0) { - UI_UpdateSaberHilt( qtrue ); + UI_UpdateSaberHilt( qtrue, qtrue ); + } + else if (Q_stricmp(name, "saber2_hilt_nochange") == 0) + { + UI_UpdateSaberHilt( qtrue, qfalse ); } else if (Q_stricmp(name, "saber2_color") == 0) { @@ -1305,6 +1499,14 @@ static qboolean UI_RunMenuScript ( const char **args ) UI_ResetSaberCvars(); } } + else if (Q_stricmp(name, "saber_custom") == 0) + { + UI_UpdateCustomSaber(qfalse); + } + else if (Q_stricmp(name, "saber2_custom") == 0) + { + UI_UpdateCustomSaber(qtrue); + } #ifndef JK2_MODE else if (Q_stricmp(name, "updatefightingstylechoices") == 0) { @@ -1902,6 +2104,46 @@ static int UI_FeederCount(float feederID) { return uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color2Count; } + else if (feederID == FEEDER_SABER_SKIN_1) + { + return uiInfo.customSabers[uiInfo.customSabersIndex].Skin1.count; + } + else if (feederID == FEEDER_SABER_SKIN_2) + { + return uiInfo.customSabers[uiInfo.customSabersIndex].Skin2.count; + } + else if (feederID == FEEDER_SABER_SKIN_3) + { + return uiInfo.customSabers[uiInfo.customSabersIndex].Skin3.count; + } + else if (feederID == FEEDER_SABER_SKIN_4) + { + return uiInfo.customSabers[uiInfo.customSabersIndex].Skin4.count; + } + else if (feederID == FEEDER_SABER_SKIN_5) + { + return uiInfo.customSabers[uiInfo.customSabersIndex].Skin5.count; + } + else if (feederID == FEEDER_SABER2_SKIN_1) + { + return uiInfo.customSabers[uiInfo.customSabers2Index].Skin1.count; + } + else if (feederID == FEEDER_SABER2_SKIN_2) + { + return uiInfo.customSabers[uiInfo.customSabers2Index].Skin2.count; + } + else if (feederID == FEEDER_SABER2_SKIN_3) + { + return uiInfo.customSabers[uiInfo.customSabers2Index].Skin3.count; + } + else if (feederID == FEEDER_SABER2_SKIN_4) + { + return uiInfo.customSabers[uiInfo.customSabers2Index].Skin4.count; + } + else if (feederID == FEEDER_SABER2_SKIN_5) + { + return uiInfo.customSabers[uiInfo.customSabers2Index].Skin5.count; + } return 0; } @@ -2102,6 +2344,76 @@ extern void Item_RunScript(itemDef_t *item, const char *s); //from ui_shared; Item_RunScript(item, uiInfo.playerSpecies[uiInfo.playerSpeciesIndex].Color2[index].actionText); } } + else if (feederID == FEEDER_SABER_SKIN_1) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabersIndex].Skin1.count) + { + Cvar_Set("ui_saber_skin1", uiInfo.customSabers[uiInfo.customSabersIndex].Skin1.skins[index].name); + } + } + else if (feederID == FEEDER_SABER_SKIN_2) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabersIndex].Skin2.count) + { + Cvar_Set("ui_saber_skin2", uiInfo.customSabers[uiInfo.customSabersIndex].Skin2.skins[index].name); + } + } + else if (feederID == FEEDER_SABER_SKIN_3) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabersIndex].Skin3.count) + { + Cvar_Set("ui_saber_skin3", uiInfo.customSabers[uiInfo.customSabersIndex].Skin3.skins[index].name); + } + } + else if (feederID == FEEDER_SABER_SKIN_4) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabersIndex].Skin4.count) + { + Cvar_Set("ui_saber_skin4", uiInfo.customSabers[uiInfo.customSabersIndex].Skin4.skins[index].name); + } + } + else if (feederID == FEEDER_SABER_SKIN_5) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabersIndex].Skin5.count) + { + Cvar_Set("ui_saber_skin5", uiInfo.customSabers[uiInfo.customSabersIndex].Skin5.skins[index].name); + } + } + else if (feederID == FEEDER_SABER2_SKIN_1) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabers2Index].Skin1.count) + { + Cvar_Set("ui_saber2_skin1", uiInfo.customSabers[uiInfo.customSabers2Index].Skin1.skins[index].name); + } + } + else if (feederID == FEEDER_SABER2_SKIN_2) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabers2Index].Skin2.count) + { + Cvar_Set("ui_saber2_skin2", uiInfo.customSabers[uiInfo.customSabers2Index].Skin2.skins[index].name); + } + } + else if (feederID == FEEDER_SABER2_SKIN_3) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabers2Index].Skin3.count) + { + Cvar_Set("ui_saber2_skin3", uiInfo.customSabers[uiInfo.customSabers2Index].Skin3.skins[index].name); + } + } + else if (feederID == FEEDER_SABER2_SKIN_4) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabers2Index].Skin4.count) + { + Cvar_Set("ui_saber2_skin4", uiInfo.customSabers[uiInfo.customSabers2Index].Skin4.skins[index].name); + } + } + else if (feederID == FEEDER_SABER2_SKIN_5) + { + if (index >= 0 && index < uiInfo.customSabers[uiInfo.customSabers2Index].Skin5.count) + { + Cvar_Set("ui_saber2_skin5", uiInfo.customSabers[uiInfo.customSabers2Index].Skin5.skins[index].name); + } + } /* else if (feederID == FEEDER_CINEMATICS) { uiInfo.movieIndex = index; @@ -2539,57 +2851,482 @@ static qboolean UI_ParseHeadSwapData(char* buf, playerSpeciesInfo_t &species) COM_EndParseSession(); return qfalse; } - Q_strncpyz( species.HeadSwap[count].model, token, MODEL_LENGTH ); - } - if ( !Q_stricmp( token, "skin" ) ) - { - token = COM_ParseExt( &p, qtrue ); - if ( token[0] == 0 ) - { - COM_EndParseSession(); - return qfalse; + Q_strncpyz( species.HeadSwap[count].model, token, MODEL_LENGTH ); + } + if ( !Q_stricmp( token, "skin" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( species.HeadSwap[count].skin, token, SKIN_LENGTH ); + } + token = COM_ParseExt( &p, qtrue ); //looking for action commands or final } + } + + COM_EndParseSession( ); + return qtrue;//never get here +} + +/* +================= +bIsImageFile +builds path and scans for valid image extentions +================= +*/ +static qboolean IsImageFile(const char* dirptr, const char* skinname, qboolean building) +{ + char fpath[MAX_QPATH]; + int f; + + + Com_sprintf(fpath, MAX_QPATH, "models/players/%s/icon_%s.jpg", dirptr, skinname); + ui.FS_FOpenFile(fpath, &f, FS_READ); + if (!f) + { //not there, try png + Com_sprintf(fpath, MAX_QPATH, "models/players/%s/icon_%s.png", dirptr, skinname); + ui.FS_FOpenFile(fpath, &f, FS_READ); + } + if (!f) + { //not there, try tga + Com_sprintf(fpath, MAX_QPATH, "models/players/%s/icon_%s.tga", dirptr, skinname); + ui.FS_FOpenFile(fpath, &f, FS_READ); + } + if (f) + { + ui.FS_FCloseFile(f); + if ( building ) ui.R_RegisterShaderNoMip(fpath); + return qtrue; + } + + return qfalse; +} + +static bool bIsSaberImageFile(const char* dirptr, const char* skinname) +{ + char fpath[MAX_QPATH]; + qhandle_t handle; + + + Com_sprintf(fpath, MAX_QPATH, "models/weapons2/%s/icon_%s.tga", dirptr, skinname); + + handle = ui.R_RegisterShaderNoMip(fpath); + + if (handle > 0) + { + return true; + } + + return false; +} + +static qboolean UI_ParseCustomSaberData(char* buf, customSaberInfo_t &saber, char* skin1root, char* skin2root, char* skin3root, char* skin4root, char* skin5root) +{ + const char *token; + const char *p; + int n; + + saber.isStaff = qfalse; + + p = buf; + COM_BeginParseSession(); + + if ( !p ) + { + return qfalse; + } + + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( saber.SaberName, token, sizeof(saber.SaberName) ); + + token = COM_ParseExt( &p, qtrue ); //looking for action block { + if ( token[0] != '{' ) + { + COM_EndParseSession( ); + return qfalse; + } + + token = COM_ParseExt( &p, qtrue ); //looking for model & skin commands! + while (token[0] != '}') + { + if ( token[0] == 0) + { //EOF + COM_EndParseSession( ); + return qfalse; + } + if ( !Q_stricmp( token, "saberlongname" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( saber.SaberLongName, token, sizeof(saber.SaberLongName) ); + } + if ( !Q_stricmp( token, "foldername" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( saber.FolderName, token, sizeof(saber.FolderName) ); + } + if ( !Q_stricmp( token, "skin1" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( skin1root, token, 16 ); + Q_strcat( skin1root, 16, "_"); + } + if ( !Q_stricmp( token, "skin2" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( skin2root, token, 16 ); + Q_strcat( skin2root, 16, "_"); + } + if ( !Q_stricmp( token, "skin3" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( skin3root, token, 16 ); + Q_strcat( skin3root, 16, "_"); + } + if ( !Q_stricmp( token, "skin4" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( skin4root, token, 16 ); + Q_strcat( skin4root, 16, "_"); + } + if ( !Q_stricmp( token, "skin5" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( skin5root, token, 16 ); + Q_strcat( skin5root, 16, "_"); + } + if ( !Q_stricmp( token, "skin1name" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( saber.Skin1.name, token, sizeof(saber.Skin1.name) ); + } + if ( !Q_stricmp( token, "skin1desc" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( saber.Skin1.desc, token, sizeof(saber.Skin1.desc) ); + } + if ( !Q_stricmp( token, "skin2name" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( saber.Skin2.name, token, sizeof(saber.Skin2.name) ); + } + if ( !Q_stricmp( token, "skin2desc" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( saber.Skin2.desc, token, sizeof(saber.Skin2.desc) ); + } + if ( !Q_stricmp( token, "skin3name" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( saber.Skin3.name, token, sizeof(saber.Skin3.name) ); + } + if ( !Q_stricmp( token, "skin3desc" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( saber.Skin3.desc, token, sizeof(saber.Skin3.desc) ); + } + if ( !Q_stricmp( token, "skin4name" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( saber.Skin4.name, token, sizeof(saber.Skin4.name) ); + } + if ( !Q_stricmp( token, "skin4desc" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( saber.Skin4.desc, token, sizeof(saber.Skin4.desc) ); + } + if ( !Q_stricmp( token, "skin5name" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( saber.Skin5.name, token, sizeof(saber.Skin5.name) ); + } + if ( !Q_stricmp( token, "skin5desc" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + Q_strncpyz( saber.Skin5.desc, token, sizeof(saber.Skin5.desc) ); + } + if ( !Q_stricmp( token, "isStaff" ) ) + { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + { + COM_EndParseSession(); + return qfalse; + } + + if ( COM_ParseInt( &p, &n ) ) + { + continue; + } + saber.isStaff = (n != 0)?qtrue:qfalse; + } + + token = COM_ParseExt( &p, qtrue ); //looking for action commands or final } + } + + COM_EndParseSession( ); + return qtrue;//never get here +} + +static void UI_FreeCustomSaber( customSaberInfo_t *saber ) +{ + free(saber->Skin1.skins); + free(saber->Skin2.skins); + free(saber->Skin3.skins); + free(saber->Skin4.skins); + free(saber->Skin5.skins); + memset(saber, 0, sizeof(customSaberInfo_t)); +} + +void UI_FreeAllCustomSabers( void ) +{ + int i; + + for (i = 0; i < uiInfo.customSabersCount; i++) + { + UI_FreeCustomSaber(&uiInfo.customSabers[i]); + } + free(uiInfo.customSabers); +} + +static void UI_BuildCustomSaber_List() +{ + int fileCnt; + char csabListBuf[2048]; + char* holdChar; + int csabFNLen, len; + fileHandle_t f; + + uiInfo.customSabersIndex = 0; + uiInfo.customSabers2Index = 0; + uiInfo.customSabersCount = 0; + uiInfo.customSabersMax = 8; + uiInfo.customSabers = (customSaberInfo_t *)malloc(uiInfo.customSabersMax * sizeof(customSaberInfo_t)); + + fileCnt = ui.FS_GetFileList("ext_data/sabers", ".csab", csabListBuf, 2048 ); + holdChar = csabListBuf; + for (int i=0; i= uiInfo.customSabersMax) + { + uiInfo.customSabersMax *= 2; + uiInfo.customSabers = (customSaberInfo_t *)realloc(uiInfo.customSabers, uiInfo.customSabersMax * sizeof(customSaberInfo_t)); + } + + customSaberInfo_t *saber = &uiInfo.customSabers[uiInfo.customSabersCount]; + + memset(saber, 0, sizeof(customSaberInfo_t)); + + if (!UI_ParseCustomSaberData(buffer, *saber, Skin1Root, Skin2Root, Skin3Root, Skin4Root, Skin5Root)) + { + Com_Printf( "UI_BuildCustomSaber_List: error parsing file: %s\n", holdChar); + continue; + } + //now do the skin loading stuff + + saber->Skin1.max = 8; + saber->Skin2.max = 8; + saber->Skin3.max = 8; + saber->Skin4.max = 8; + saber->Skin5.max = 8; + + saber->Skin1.skins = (skinName_t *)malloc(saber->Skin1.max * sizeof(skinName_t)); + saber->Skin2.skins = (skinName_t *)malloc(saber->Skin2.max * sizeof(skinName_t)); + saber->Skin3.skins = (skinName_t *)malloc(saber->Skin3.max * sizeof(skinName_t)); + saber->Skin4.skins = (skinName_t *)malloc(saber->Skin4.max * sizeof(skinName_t)); + saber->Skin5.skins = (skinName_t *)malloc(saber->Skin5.max * sizeof(skinName_t)); + + char filelist[2048]; + char* fileptr; + int j; + char skinname[64]; + int numfiles; + int iSkinParts=0; + int filelen; + + numfiles = ui.FS_GetFileList( va("models/weapons2/%s",uiInfo.customSabers[uiInfo.customSabersCount].FolderName), ".skin", filelist, 2048 ); + fileptr = filelist; + for (j=0; jSkin1.count >= saber->Skin1.max) + { + saber->Skin1.max *= 2; + saber->Skin1.skins = (skinName_t *)realloc(saber->Skin1.skins, saber->Skin1.max * sizeof(skinName_t)); + } + Q_strncpyz(saber->Skin1.skins[saber->Skin1.count++].name, skinname, SKIN_LENGTH); + iSkinParts |= 1<<0; + } + else if (Q_stricmpn(skinname,Skin2Root,strlen(Skin2Root)) == 0) + { + if (saber->Skin2.count >= saber->Skin2.max) + { + saber->Skin2.max *= 2; + saber->Skin2.skins = (skinName_t *)realloc(saber->Skin2.skins, saber->Skin2.max * sizeof(skinName_t)); + } + Q_strncpyz(saber->Skin2.skins[saber->Skin2.count++].name, skinname, SKIN_LENGTH); + iSkinParts |= 1<<1; + } + else if (Q_stricmpn(skinname,Skin3Root,strlen(Skin3Root)) == 0) + { + if (saber->Skin3.count >= saber->Skin3.max) + { + saber->Skin3.max *= 2; + saber->Skin3.skins = (skinName_t *)realloc(saber->Skin3.skins, saber->Skin3.max * sizeof(skinName_t)); + } + Q_strncpyz(saber->Skin3.skins[saber->Skin3.count++].name, skinname, SKIN_LENGTH); + iSkinParts |= 1<<2; + } + else if (Q_stricmpn(skinname,Skin4Root,strlen(Skin4Root)) == 0) + { + if (saber->Skin4.count >= saber->Skin4.max) + { + saber->Skin4.max *= 2; + saber->Skin4.skins = (skinName_t *)realloc(saber->Skin4.skins, saber->Skin4.max * sizeof(skinName_t)); + } + Q_strncpyz(saber->Skin4.skins[saber->Skin4.count++].name, skinname, SKIN_LENGTH); + iSkinParts |= 1<<3; + } + else if (Q_stricmpn(skinname,Skin5Root,strlen(Skin5Root)) == 0) + { + if (saber->Skin5.count >= saber->Skin5.max) + { + saber->Skin5.max *= 2; + saber->Skin5.skins = (skinName_t *)realloc(saber->Skin5.skins, saber->Skin5.max * sizeof(skinName_t)); + } + Q_strncpyz(saber->Skin5.skins[saber->Skin5.count++].name, skinname, SKIN_LENGTH); + iSkinParts |= 1<<4; + } + } + } + + if (iSkinParts != 31)//todo: allow for only some parts to be required. + { //didn't get a skin for each, then skip this model. + UI_FreeCustomSaber(saber); + continue; } - Q_strncpyz( species.HeadSwap[count].skin, token, SKIN_LENGTH ); + uiInfo.customSabersCount++; } - token = COM_ParseExt( &p, qtrue ); //looking for action commands or final } - } - - COM_EndParseSession( ); - return qtrue;//never get here -} - -/* -================= -bIsImageFile -builds path and scans for valid image extentions -================= -*/ -static qboolean IsImageFile(const char* dirptr, const char* skinname, qboolean building) -{ - char fpath[MAX_QPATH]; - int f; - - - Com_sprintf(fpath, MAX_QPATH, "models/players/%s/icon_%s.jpg", dirptr, skinname); - ui.FS_FOpenFile(fpath, &f, FS_READ); - if (!f) - { //not there, try png - Com_sprintf(fpath, MAX_QPATH, "models/players/%s/icon_%s.png", dirptr, skinname); - ui.FS_FOpenFile(fpath, &f, FS_READ); - } - if (!f) - { //not there, try tga - Com_sprintf(fpath, MAX_QPATH, "models/players/%s/icon_%s.tga", dirptr, skinname); - ui.FS_FOpenFile(fpath, &f, FS_READ); - } - if (f) - { - ui.FS_FCloseFile(f); - if ( building ) ui.R_RegisterShaderNoMip(fpath); - return qtrue; } - - return qfalse; } static void UI_FreeSpecies( playerSpeciesInfo_t *species ) @@ -2827,6 +3564,7 @@ UI_Shutdown void UI_Shutdown( void ) { UI_FreeAllSpecies(); + UI_FreeAllCustomSabers(); } /* @@ -2932,6 +3670,8 @@ void _UI_Init( qboolean inGameLoad ) uiInfo.uiDC.g2_SetRootSurface = re.G2API_SetRootSurface; UI_BuildPlayerModel_List(inGameLoad); + + UI_BuildCustomSaber_List(); String_Init(); @@ -4600,6 +5340,18 @@ static void UI_UpdateSaberCvars ( void ) (Cvar_VariableIntegerValue("ui_rgb_saber2_blue"))); Cvar_Set( "g_saber2_color", rgbColor ); } + + Cvar_Set ( "g_saber_skin1", Cvar_VariableString ( "ui_saber_skin1" ) ); + Cvar_Set ( "g_saber_skin2", Cvar_VariableString ( "ui_saber_skin2" ) ); + Cvar_Set ( "g_saber_skin3", Cvar_VariableString ( "ui_saber_skin3" ) ); + Cvar_Set ( "g_saber_skin4", Cvar_VariableString ( "ui_saber_skin4" ) ); + Cvar_Set ( "g_saber_skin5", Cvar_VariableString ( "ui_saber_skin5" ) ); + + Cvar_Set ( "g_saber2_skin1", Cvar_VariableString ( "ui_saber2_skin1" ) ); + Cvar_Set ( "g_saber2_skin2", Cvar_VariableString ( "ui_saber2_skin2" ) ); + Cvar_Set ( "g_saber2_skin3", Cvar_VariableString ( "ui_saber2_skin3" ) ); + Cvar_Set ( "g_saber2_skin4", Cvar_VariableString ( "ui_saber2_skin4" ) ); + Cvar_Set ( "g_saber2_skin5", Cvar_VariableString ( "ui_saber2_skin5" ) ); } @@ -6447,6 +7199,18 @@ static void UI_GetSaberCvars ( void ) } Cvar_Set ( "ui_newfightingstyle", "0"); + + Cvar_Set ( "ui_saber_skin1", Cvar_VariableString ( "g_saber_skin1" ) ); + Cvar_Set ( "ui_saber_skin2", Cvar_VariableString ( "g_saber_skin2" ) ); + Cvar_Set ( "ui_saber_skin3", Cvar_VariableString ( "g_saber_skin3" ) ); + Cvar_Set ( "ui_saber_skin4", Cvar_VariableString ( "g_saber_skin4" ) ); + Cvar_Set ( "ui_saber_skin5", Cvar_VariableString ( "g_saber_skin5" ) ); + + Cvar_Set ( "ui_saber2_skin1", Cvar_VariableString ( "g_saber2_skin1" ) ); + Cvar_Set ( "ui_saber2_skin2", Cvar_VariableString ( "g_saber2_skin2" ) ); + Cvar_Set ( "ui_saber2_skin3", Cvar_VariableString ( "g_saber2_skin3" ) ); + Cvar_Set ( "ui_saber2_skin4", Cvar_VariableString ( "g_saber2_skin4" ) ); + Cvar_Set ( "ui_saber2_skin5", Cvar_VariableString ( "g_saber2_skin5" ) ); } @@ -6572,6 +7336,90 @@ static void UI_UpdateCharacter( qboolean changedModel ) UI_UpdateCharacterSkin(); } +static void UI_CorrectSaberList ( void ) +{ + menuDef_t *menu; + itemDef_t *item; + multiDef_t *multiPtr; + + menu = Menu_GetFocused(); + + if (!menu) + { + return; + } + + item = (itemDef_t *) Menu_FindItemByName(menu, "hiltbut" ); + + multiPtr = (multiDef_t*)item->typeData; + + if (multiPtr->count >= MAX_MULTI_CVARS) + { + return; + } + for (int i = 0; i < uiInfo.customSabersCount; i++) + { + if (uiInfo.customSabers[i].isStaff) + { + continue; + } + multiPtr->cvarList[multiPtr->count] = uiInfo.customSabers[i].SaberLongName; + multiPtr->cvarStr[multiPtr->count] = uiInfo.customSabers[i].SaberName; + multiPtr->count++; + if (multiPtr->count >= MAX_MULTI_CVARS) + { + break; + } + } + + //TODO: dual sabers / staff saber + item = (itemDef_t *) Menu_FindItemByName(menu, "hiltbut2" ); + + multiPtr = (multiDef_t*)item->typeData; + + if (multiPtr->count >= MAX_MULTI_CVARS) + { + return; + } + for (int i = 0; i < uiInfo.customSabersCount; i++) + { + if (uiInfo.customSabers[i].isStaff) + { + continue; + } + multiPtr->cvarList[multiPtr->count] = uiInfo.customSabers[i].SaberLongName; + multiPtr->cvarStr[multiPtr->count] = uiInfo.customSabers[i].SaberName; + multiPtr->count++; + if (multiPtr->count >= MAX_MULTI_CVARS) + { + break; + } + } + + item = (itemDef_t *) Menu_FindItemByName(menu, "hiltbut_staves" ); + + multiPtr = (multiDef_t*)item->typeData; + + if (multiPtr->count >= MAX_MULTI_CVARS) + { + return; + } + for (int i = 0; i < uiInfo.customSabersCount; i++) + { + if (!uiInfo.customSabers[i].isStaff) + { + continue; + } + multiPtr->cvarList[multiPtr->count] = uiInfo.customSabers[i].SaberLongName; + multiPtr->cvarStr[multiPtr->count] = uiInfo.customSabers[i].SaberName; + multiPtr->count++; + if (multiPtr->count >= MAX_MULTI_CVARS) + { + break; + } + } +} + void UI_UpdateSaberType( void ) { char sType[MAX_QPATH]; @@ -6582,11 +7430,15 @@ void UI_UpdateSaberType( void ) DC->setCVar( "ui_saber2", "" ); } } - -static void UI_UpdateSaberHilt( qboolean secondSaber ) +extern int menuCount; +extern menuDef_t Menus[MAX_MENUS]; // defined menus +extern int Menu_ItemsMatchingGroup(menuDef_t *menu, const char *name); +extern void Menu_ShowItemByName(menuDef_t *menu, const char *p, qboolean bShow); +static void UI_UpdateSaberHilt( qboolean secondSaber, qboolean changedModel ) { menuDef_t *menu; itemDef_t *item; + itemDef_t *listBoxItem; char model[MAX_QPATH]; char modelPath[MAX_QPATH]; char skinPath[MAX_QPATH]; @@ -6614,9 +7466,88 @@ static void UI_UpdateSaberHilt( qboolean secondSaber ) if(!item) { - Com_Error( ERR_FATAL, "UI_UpdateSaberHilt: Could not find item (%s) in menu (%s)", itemName, menu->window.name); + for (int i = 0; i < menuCount; i++) + { + if (!Q_stricmp(Menus[i].window.name, "saberMenu")) + { + menu = &Menus[i]; + continue; + } + } + + item = (itemDef_s *) Menu_FindItemByName(menu, itemName ); + + if (!item) + { + Com_Error( ERR_FATAL, "UI_UpdateSaberHilt: Could not find item (%s) in menu (%s)", itemName, menu->window.name); + } } DC->getCVarString( saberCvarName, model, sizeof(model) ); + + if (changedModel) + { + if(!secondSaber) + { + uiInfo.customSabersIndex = -1; + for (int i = 0; i < uiInfo.customSabersCount; i++) + { + if (uiInfo.customSabers[i].SaberName[0] && !Q_stricmp(uiInfo.customSabers[i].SaberName, model)) + { + uiInfo.customSabersIndex = i; + break; + } + } + + if (uiInfo.customSabersIndex < 0) + { + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "customicon"); + if (listBoxItem) + { + listBoxItem->window.flags &= ~WINDOW_VISIBLE; + } + uiInfo.customSabersIndex = 0; + } + else + { + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "customicon"); + if (listBoxItem) + { + listBoxItem->window.flags |= WINDOW_VISIBLE; + } + } + } + else + { + uiInfo.customSabers2Index = -1; + for (int i = 0; i < uiInfo.customSabersCount; i++) + { + if (uiInfo.customSabers[i].SaberName[0] && !Q_stricmp(uiInfo.customSabers[i].SaberName, model)) + { + uiInfo.customSabers2Index = i; + break; + } + } + + if (uiInfo.customSabers2Index < 0) + { + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "customicon2"); + if (listBoxItem) + { + listBoxItem->window.flags &= ~WINDOW_VISIBLE; + } + uiInfo.customSabers2Index = 0; + } + else + { + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "customicon2"); + if (listBoxItem) + { + listBoxItem->window.flags |= WINDOW_VISIBLE; + } + } + } + } + //read this from the sabers.cfg if ( UI_SaberModelForSaber( model, modelPath ) ) {//successfully found a model @@ -6624,7 +7555,7 @@ static void UI_UpdateSaberHilt( qboolean secondSaber ) //get the customSkin, if any //COM_StripExtension( modelPath, skinPath, sizeof(skinPath) ); //COM_DefaultExtension( skinPath, sizeof( skinPath ), ".skin" ); - if ( UI_SaberSkinForSaber( model, skinPath ) ) + if ( UI_SaberSkinForSaber( model, skinPath, secondSaber ) ) { ItemParse_model_g2skin_go( item, skinPath );//apply the skin } @@ -6635,6 +7566,200 @@ static void UI_UpdateSaberHilt( qboolean secondSaber ) } } +static void UI_UpdateCustomSaber( qboolean secondSaber ) +{ + menuDef_t *menu; + itemDef_t *listBoxItem; + char model[MAX_QPATH]; + menu = Menu_GetFocused(); // Get current menu (either video or ingame video, I would assume) + + if (!menu) + { + return; + } + + const char *saberCvarName; + if ( secondSaber ) + { + saberCvarName = "ui_saber2"; + } + else + { + saberCvarName = "ui_saber"; + } + + DC->getCVarString( saberCvarName, model, sizeof(model) ); + + if (secondSaber) + { + uiInfo.customSabers2Index = -1; + + for (int i = 0; i < uiInfo.customSabersCount; i++) + { + if (uiInfo.customSabers[i].SaberName[0] && !Q_stricmp(uiInfo.customSabers[i].SaberName, model)) + { + uiInfo.customSabers2Index = i; + break; + } + } + + if (uiInfo.customSabers2Index < 0) + { + uiInfo.customSabers2Index = 0; + return; + } + + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin1listbox"); + if (listBoxItem) + { + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabers2Index].Skin1.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin2listbox"); + if (listBoxItem) + { + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabers2Index].Skin2.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin3listbox"); + if (listBoxItem) + { + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabers2Index].Skin3.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin4listbox"); + if (listBoxItem) + { + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabers2Index].Skin4.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin5listbox"); + if (listBoxItem) + { + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabers2Index].Skin5.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin1but"); + if (listBoxItem) + { + listBoxItem->text = uiInfo.customSabers[uiInfo.customSabers2Index].Skin1.name; + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabers2Index].Skin1.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin2but"); + if (listBoxItem) + { + listBoxItem->text = uiInfo.customSabers[uiInfo.customSabers2Index].Skin2.name; + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabers2Index].Skin2.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin3but"); + if (listBoxItem) + { + listBoxItem->text = uiInfo.customSabers[uiInfo.customSabers2Index].Skin3.name; + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabers2Index].Skin3.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin4but"); + if (listBoxItem) + { + listBoxItem->text = uiInfo.customSabers[uiInfo.customSabers2Index].Skin4.name; + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabers2Index].Skin4.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin5but"); + if (listBoxItem) + { + listBoxItem->text = uiInfo.customSabers[uiInfo.customSabers2Index].Skin5.name; + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabers2Index].Skin5.desc; + } + if (Menu_ItemsMatchingGroup(menu, "saberskin_menus") > 0) + { + Menu_ShowItemByName(menu, "saberskin_menus", qtrue); + UI_FeederSelection(FEEDER_SABER2_SKIN_1, 0, listBoxItem); //fixme, this is not really the right item!! + UI_FeederSelection(FEEDER_SABER2_SKIN_2, 0, listBoxItem); + UI_FeederSelection(FEEDER_SABER2_SKIN_3, 0, listBoxItem); + UI_FeederSelection(FEEDER_SABER2_SKIN_4, 0, listBoxItem); + UI_FeederSelection(FEEDER_SABER2_SKIN_5, 0, listBoxItem); + } + } + else + { + uiInfo.customSabersIndex = -1; + + for (int i = 0; i < uiInfo.customSabersCount; i++) + { + if (uiInfo.customSabers[i].SaberName[0] && !Q_stricmp(uiInfo.customSabers[i].SaberName, model)) + { + uiInfo.customSabersIndex = i; + break; + } + } + + if (uiInfo.customSabersIndex < 0) + { + uiInfo.customSabersIndex = 0; + return; + } + + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin1listbox"); + if (listBoxItem) + { + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabersIndex].Skin1.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin2listbox"); + if (listBoxItem) + { + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabersIndex].Skin2.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin3listbox"); + if (listBoxItem) + { + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabersIndex].Skin3.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin4listbox"); + if (listBoxItem) + { + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabersIndex].Skin4.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin5listbox"); + if (listBoxItem) + { + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabersIndex].Skin5.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin1but"); + if (listBoxItem) + { + listBoxItem->text = uiInfo.customSabers[uiInfo.customSabersIndex].Skin1.name; + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabersIndex].Skin1.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin2but"); + if (listBoxItem) + { + listBoxItem->text = uiInfo.customSabers[uiInfo.customSabersIndex].Skin2.name; + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabersIndex].Skin2.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin3but"); + if (listBoxItem) + { + listBoxItem->text = uiInfo.customSabers[uiInfo.customSabersIndex].Skin3.name; + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabersIndex].Skin3.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin4but"); + if (listBoxItem) + { + listBoxItem->text = uiInfo.customSabers[uiInfo.customSabersIndex].Skin4.name; + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabersIndex].Skin4.desc; + } + listBoxItem = (itemDef_s *) Menu_FindItemByName(menu, "skin5but"); + if (listBoxItem) + { + listBoxItem->text = uiInfo.customSabers[uiInfo.customSabersIndex].Skin5.name; + listBoxItem->descText = uiInfo.customSabers[uiInfo.customSabersIndex].Skin5.desc; + } + if (Menu_ItemsMatchingGroup(menu, "saberskin_menus") > 0) + { + Menu_ShowItemByName(menu, "saberskin_menus", qtrue); + UI_FeederSelection(FEEDER_SABER_SKIN_1, 0, listBoxItem); //fixme, this is not really the right item!! + UI_FeederSelection(FEEDER_SABER_SKIN_2, 0, listBoxItem); + UI_FeederSelection(FEEDER_SABER_SKIN_3, 0, listBoxItem); + UI_FeederSelection(FEEDER_SABER_SKIN_4, 0, listBoxItem); + UI_FeederSelection(FEEDER_SABER_SKIN_5, 0, listBoxItem); + } + } +} + /* static void UI_UpdateSaberColor( qboolean secondSaber ) { diff --git a/code/ui/ui_saber.cpp b/code/ui/ui_saber.cpp index 1909d486c6..cd3c1dcef4 100644 --- a/code/ui/ui_saber.cpp +++ b/code/ui/ui_saber.cpp @@ -46,6 +46,17 @@ extern vmCvar_t ui_rgb_saber2_red; extern vmCvar_t ui_rgb_saber2_green; extern vmCvar_t ui_rgb_saber2_blue; +extern vmCvar_t ui_saber_skin1; +extern vmCvar_t ui_saber_skin2; +extern vmCvar_t ui_saber_skin3; +extern vmCvar_t ui_saber_skin4; +extern vmCvar_t ui_saber_skin5; +extern vmCvar_t ui_saber2_skin1; +extern vmCvar_t ui_saber2_skin2; +extern vmCvar_t ui_saber2_skin3; +extern vmCvar_t ui_saber2_skin4; +extern vmCvar_t ui_saber2_skin5; + static qhandle_t redSaberGlowShader; static qhandle_t redSaberCoreShader; static qhandle_t orangeSaberGlowShader; @@ -60,6 +71,7 @@ static qhandle_t purpleSaberGlowShader; static qhandle_t purpleSaberCoreShader; static qhandle_t rgbSaberGlowShader; static qhandle_t rgbSaberCoreShader; + void UI_CacheSaberGlowGraphics( void ) {//FIXME: these get fucked by vid_restarts redSaberGlowShader = re.RegisterShader( "gfx/effects/sabers/red_glow" ); @@ -187,8 +199,99 @@ qboolean UI_SaberModelForSaber( const char *saberName, char *saberModel ) return UI_SaberParseParm( saberName, "saberModel", saberModel ); } -qboolean UI_SaberSkinForSaber( const char *saberName, char *saberSkin ) +qboolean UI_SaberSkinForSaber( const char *saberName, char *saberSkin, qboolean secondSaber ) { + qboolean isCustomSaber = qfalse; + for (int i = 0; i < uiInfo.customSabersCount; i++) + { + if (uiInfo.customSabers[i].SaberName && uiInfo.customSabers[i].SaberName[0] && !Q_stricmp(saberName, uiInfo.customSabers[i].SaberName)) + { + isCustomSaber = qtrue; + break; + } + } + if (isCustomSaber) + { + char skinRoot[MAX_QPATH]; + if (!UI_SaberModelForSaber(saberName, skinRoot)) + { + return qfalse; + } + + int l = strlen(skinRoot); + while (l > 0 && skinRoot[l] != '/') + { //parse back to first / + l--; + } + + if (skinRoot[l] == '/') + { + l++; + skinRoot[l] = 0; + + { + Q_strcat(skinRoot, MAX_QPATH, "|_"); + Q_strcat(skinRoot, MAX_QPATH, "|"); + if (secondSaber) + { + if (Cvar_VariableString("ui_saber2_skin1") && Cvar_VariableString("ui_saber2_skin1")[0]) + { + Q_strcat(skinRoot, MAX_QPATH, Cvar_VariableString("ui_saber2_skin1")); + } + Q_strcat(skinRoot, MAX_QPATH, "|"); + if (Cvar_VariableString("ui_saber2_skin2") && Cvar_VariableString("ui_saber2_skin2")[0]) + { + Q_strcat(skinRoot, MAX_QPATH, Cvar_VariableString("ui_saber2_skin2")); + } + Q_strcat(skinRoot, MAX_QPATH, "|"); + if (Cvar_VariableString("ui_saber2_skin3") && Cvar_VariableString("ui_saber2_skin3")[0]) + { + Q_strcat(skinRoot, MAX_QPATH, Cvar_VariableString("ui_saber2_skin3")); + } + Q_strcat(skinRoot, MAX_QPATH, "|"); + if (Cvar_VariableString("ui_saber2_skin4") && Cvar_VariableString("ui_saber2_skin4")[0]) + { + Q_strcat(skinRoot, MAX_QPATH, Cvar_VariableString("ui_saber2_skin4")); + } + Q_strcat(skinRoot, MAX_QPATH, "|"); + if (Cvar_VariableString("ui_saber2_skin5") && Cvar_VariableString("ui_saber2_skin5")[0]) + { + Q_strcat(skinRoot, MAX_QPATH, Cvar_VariableString("ui_saber2_skin5")); + } + } + else + { + if (Cvar_VariableString("ui_saber_skin1") && Cvar_VariableString("ui_saber_skin1")[0]) + { + Q_strcat(skinRoot, MAX_QPATH, Cvar_VariableString("ui_saber_skin1")); + } + Q_strcat(skinRoot, MAX_QPATH, "|"); + if (Cvar_VariableString("ui_saber_skin2") && Cvar_VariableString("ui_saber_skin2")[0]) + { + Q_strcat(skinRoot, MAX_QPATH, Cvar_VariableString("ui_saber_skin2")); + } + Q_strcat(skinRoot, MAX_QPATH, "|"); + if (Cvar_VariableString("ui_saber_skin3") && Cvar_VariableString("ui_saber_skin3")[0]) + { + Q_strcat(skinRoot, MAX_QPATH, Cvar_VariableString("ui_saber_skin3")); + } + Q_strcat(skinRoot, MAX_QPATH, "|"); + if (Cvar_VariableString("ui_saber_skin4") && Cvar_VariableString("ui_saber_skin4")[0]) + { + Q_strcat(skinRoot, MAX_QPATH, Cvar_VariableString("ui_saber_skin4")); + } + Q_strcat(skinRoot, MAX_QPATH, "|"); + if (Cvar_VariableString("ui_saber_skin5") && Cvar_VariableString("ui_saber_skin5")[0]) + { + Q_strcat(skinRoot, MAX_QPATH, Cvar_VariableString("ui_saber_skin5")); + } + } + } + Q_strncpyz(saberSkin, skinRoot, MAX_QPATH); + return qtrue; + + } + } return UI_SaberParseParm( saberName, "customSkin", saberSkin ); } @@ -979,7 +1082,7 @@ void UI_SaberAttachToChar( itemDef_t *item ) if (g2Saber) { //get the customSkin, if any - if ( UI_SaberSkinForSaber( saber, skinPath ) ) + if ( UI_SaberSkinForSaber( saber, skinPath, (saberNum == 1)?qtrue:qfalse ) ) { 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 From e7ed3c5a2d778f36350faea9202e2c228dea1984 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sat, 7 Jan 2017 18:22:36 +0000 Subject: [PATCH 383/445] Saber: Added g_noIgniteTwirl if set to 1, no twirlwhen just turning the saber on and off --- code/game/bg_panimate.cpp | 41 +++++++++++++++++++++++++++++++++------ code/game/bg_pmove.cpp | 11 +++-------- code/game/g_main.cpp | 3 +++ 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index 815cf82608..d3601981ac 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -51,6 +51,7 @@ extern cvar_t *g_saberAnimSpeed; extern cvar_t *g_saberAutoAim; extern cvar_t *g_speederControlScheme; extern cvar_t *g_saberNewControlScheme; +extern cvar_t *g_noIgniteTwirl; extern qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f ); extern void WP_ForcePowerDrain( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); @@ -5226,10 +5227,31 @@ void PM_TorsoAnimLightsaber() { if (!G_IsRidingVehicle(pm->gent)) { - if (pm->ps->saber[0].holsterPlace != HOLSTER_BACK) + if (!g_noIgniteTwirl->integer) { PM_SetSaberMove(LS_DRAW); } + else + { + if ( (PM_RunningAnim( pm->ps->legsAnim ) + || pm->ps->legsAnim == BOTH_WALK_STAFF + || pm->ps->legsAnim == BOTH_WALK_DUAL + || pm->ps->legsAnim == BOTH_WALKBACK_STAFF + || pm->ps->legsAnim == BOTH_WALKBACK_DUAL ) + && pm->ps->saberBlockingTime < cg.time ) + {//running w/1-handed weapon uses full-body anim + int setFlags = SETANIM_FLAG_NORMAL; + if ( PM_LandingAnim( pm->ps->torsoAnim ) ) + { + setFlags = SETANIM_FLAG_OVERRIDE; + } + PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,setFlags); + } + else + { + PM_SetSaberMove(LS_READY); + } + } } return; } @@ -5237,7 +5259,14 @@ void PM_TorsoAnimLightsaber() { if (!G_IsRidingVehicle(pm->gent)) { - PM_SetSaberMove(LS_PUTAWAY); + if (!g_noIgniteTwirl->integer) + { + PM_SetSaberMove(LS_PUTAWAY); + } + else + { + //should never get here... + } } return; } @@ -5259,7 +5288,7 @@ void PM_TorsoAnimLightsaber() pm->ps->weaponstate == WEAPON_CHARGING || pm->ps->weaponstate == WEAPON_CHARGING_ALT ) {//ready - if ( pm->ps->weapon == WP_SABER && (pm->ps->SaberLength()) ) + if ( pm->ps->weapon == WP_SABER && (pm->ps->SaberLength()) && (pm->ps->SaberActive() || !g_noIgniteTwirl->integer)) {//saber is on // Select the proper idle Lightsaber attack move from the chart. if (pm->ps->saberMove > LS_READY && pm->ps->saberMove < LS_MOVE_MAX) @@ -5671,7 +5700,7 @@ void PM_TorsoAnimation( void ) if (pm->ps->weapon == WP_SABER ) // WP_LIGHTSABER { qboolean saberInAir = qfalse; - if ( pm->ps->SaberLength() && !pm->ps->saberInFlight ) + if ( pm->ps->SaberLength() && !pm->ps->saberInFlight && (pm->ps->SaberActive() || !g_noIgniteTwirl->integer) ) { PM_TorsoAnimLightsaber(); } @@ -5732,7 +5761,7 @@ void PM_TorsoAnimation( void ) { if ( PM_InSlopeAnim( pm->ps->legsAnim ) ) {//HMM... this probably breaks the saber putaway and select anims - if ( pm->ps->SaberLength() > 0 ) + if ( pm->ps->SaberLength() > 0 && (pm->ps->SaberActive() || !g_noIgniteTwirl->integer) ) { PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND2,SETANIM_FLAG_NORMAL); } @@ -5814,7 +5843,7 @@ void PM_TorsoAnimation( void ) pm->ps->weaponstate == WEAPON_CHARGING || pm->ps->weaponstate == WEAPON_CHARGING_ALT ) { - if ( pm->ps->weapon == WP_SABER && pm->ps->SaberLength() ) + if ( pm->ps->weapon == WP_SABER && pm->ps->SaberLength() && (pm->ps->SaberActive() || !g_noIgniteTwirl->integer)) { PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_NORMAL);//TORSO_WEAPONREADY1 } diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index fd8008b56c..7912a70b46 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -146,6 +146,7 @@ extern cvar_t *g_debugMelee; extern cvar_t *g_saberNewControlScheme; extern cvar_t *g_stepSlideFix; extern cvar_t *g_saberAutoBlocking; +extern cvar_t *g_noIgniteTwirl; static void PM_SetWaterLevelAtPoint( vec3_t org, int *waterlevel, int *watertype ); @@ -8229,6 +8230,7 @@ static void PM_Footsteps( void ) } else if ( (pm->ps->weapon == WP_SABER &&pm->ps->SaberLength()>0 + && (pm->ps->SaberActive() || !g_noIgniteTwirl->integer) &&!pm->ps->saberInFlight &&!PM_SaberDrawPutawayAnim( pm->ps->legsAnim )) ) { @@ -9045,14 +9047,7 @@ static void PM_FinishWeaponChange( void ) { {//actually did switch weapons, play anim if (!G_IsRidingVehicle(pm->gent)) { - if ( pm->ps->saber[0].holsterPlace == HOLSTER_BACK ) - { - //TODO: nice draw move from back holster - } - else - { - PM_SetSaberMove(LS_DRAW); - } + PM_SetSaberMove(LS_DRAW); } } } diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 2b376237fe..639352b54c 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -236,6 +236,7 @@ cvar_t *g_broadsword; cvar_t *g_allowBunnyhopping; cvar_t *g_flippedHolsters; +cvar_t *g_noIgniteTwirl; qboolean stop_icarus = qfalse; @@ -734,6 +735,8 @@ void G_InitCvars( void ) { gi.cvar( "g_clearstats", "1", CVAR_ROM|CVAR_NORESTART); g_flippedHolsters = gi.cvar( "g_flippedHolsters", "0", CVAR_ARCHIVE );//if 1, saber faces up when holstered not down + + g_noIgniteTwirl = gi.cvar( "g_noIgniteTwirl", "0", CVAR_ARCHIVE );//if 1, don't do ignite twirl } /* ============ From 436fee92abe4f34784bccdc480dfb997fe8d429e Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sat, 7 Jan 2017 18:23:42 +0000 Subject: [PATCH 384/445] Saber: Do not immediately put saber in hand when using "saber" command --- code/game/wp_saberLoad.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/code/game/wp_saberLoad.cpp b/code/game/wp_saberLoad.cpp index eb86a18738..ca24e0b1ec 100644 --- a/code/game/wp_saberLoad.cpp +++ b/code/game/wp_saberLoad.cpp @@ -2332,9 +2332,17 @@ void WP_SetSaber( gentity_t *ent, int saberNum, const char *saberName ) } } */ - WP_SaberAddG2SaberModels( ent, saberNum ); - ent->client->ps.saber[saberNum].SetLength( 0.0f ); - ent->client->ps.saber[saberNum].Activate(); + if (ent->client->ps.weapon == WP_SABER) + { + WP_SaberAddG2SaberModels( ent, saberNum ); + ent->client->ps.saber[saberNum].SetLength( 0.0f ); + ent->client->ps.saber[saberNum].Activate(); + } + else + { + G_RemoveHolsterModels( ent ); + WP_SaberAddHolsteredG2SaberModels( ent ); + } if ( ent->client->ps.saber[saberNum].stylesLearned ) {//change to the style we're supposed to be using From d2f73f04376119647f15d158b7ccc28211a13603 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Wed, 1 Jun 2016 15:21:08 +0100 Subject: [PATCH 385/445] Custom sabers: use blade colour in shaders makes saber blade colour accessible in shaders (rgbGen blade). also adds rgbGen hilt - will be set in cvars. probably needs to be completely redone in the future. --- code/cgame/cg_players.cpp | 96 +++++++++++++++++++++++----------- code/game/g_client.cpp | 16 +++--- code/game/g_public.h | 2 + code/game/g_shared.h | 2 +- code/game/g_svcmds.cpp | 4 +- code/game/ghoul2_shared.h | 12 ++++- code/game/wp_saber.cpp | 4 ++ code/ghoul2/G2.h | 2 + code/rd-common/tr_public.h | 2 + code/rd-common/tr_types.h | 12 ++++- code/rd-vanilla/G2_API.cpp | 8 +++ code/rd-vanilla/tr_backend.cpp | 10 +++- code/rd-vanilla/tr_ghoul2.cpp | 12 +++-- code/rd-vanilla/tr_init.cpp | 1 + code/rd-vanilla/tr_local.h | 11 ++-- code/rd-vanilla/tr_main.cpp | 5 +- code/rd-vanilla/tr_shade.cpp | 65 ++++++++++++++++------- code/rd-vanilla/tr_shader.cpp | 28 ++++++++++ code/server/sv_game.cpp | 8 +++ 19 files changed, 227 insertions(+), 73 deletions(-) diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index b2c0d01a76..40df13b24d 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -4658,6 +4658,34 @@ void CG_AddForceSightShell( refEntity_t *ent, centity_t *cent ) cgi_R_AddRefEntityToScene( ent ); } +static void CG_RGBForSaberColor( saber_colors_t color, vec3_t rgb ) +{ + switch( color ) + { + case SABER_RED: + VectorSet( rgb, 1.0f, 0.2f, 0.2f ); + break; + case SABER_ORANGE: + VectorSet( rgb, 1.0f, 0.5f, 0.1f ); + break; + case SABER_YELLOW: + VectorSet( rgb, 1.0f, 1.0f, 0.2f ); + break; + case SABER_GREEN: + VectorSet( rgb, 0.2f, 1.0f, 0.2f ); + break; + case SABER_BLUE: + VectorSet( rgb, 0.2f, 0.4f, 1.0f ); + break; + case SABER_PURPLE: + VectorSet( rgb, 0.9f, 0.2f, 1.0f ); + break; + default://SABER_RGB + VectorSet( rgb, ((color) & 0xff)/255.0f, ((color >> 8) & 0xff)/255.0f, ((color >> 16) & 0xff)/255.0f ); + break; + } +} + /* =============== CG_AddRefEntityWithPowerups @@ -4700,14 +4728,50 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen ent->shaderRGBA[2] = gent->client->renderInfo.customRGBA[2]; ent->shaderRGBA[3] = gent->client->renderInfo.customRGBA[3]; - for (int index = 0; index < MAX_NEW_ENT_RGB; index++) + for (int index = 0; index < MAX_CVAR_TINT; index++) { ent->newShaderRGBA[index][0] = gent->client->renderInfo.newCustomRGBA[index][0]; ent->newShaderRGBA[index][1] = gent->client->renderInfo.newCustomRGBA[index][1]; ent->newShaderRGBA[index][2] = gent->client->renderInfo.newCustomRGBA[index][2]; ent->newShaderRGBA[index][3] = gent->client->renderInfo.newCustomRGBA[index][3]; } - + + //get the saber colours + if (gent->client->ps.weapons[WP_SABER]) + { + vec3_t rgb={1,1,1}; + if ( gent->client->ps.saber[0].crystals & SABER_CRYSTAL_BLACK ) + { + ent->newShaderRGBA[TINT_BLADE1][0] = 0; + ent->newShaderRGBA[TINT_BLADE1][1] = 0; + ent->newShaderRGBA[TINT_BLADE1][2] = 0; + } + else + { + CG_RGBForSaberColor( gent->client->ps.saber[0].blade[0].color, rgb ); + ent->newShaderRGBA[TINT_BLADE1][0] = 0xff * rgb[0]; + ent->newShaderRGBA[TINT_BLADE1][1] = 0xff * rgb[1]; + ent->newShaderRGBA[TINT_BLADE1][2] = 0xff * rgb[2]; + } + + if (gent->client->ps.dualSabers) + { + if ( gent->client->ps.saber[0].crystals & SABER_CRYSTAL_BLACK ) + { + ent->newShaderRGBA[TINT_BLADE2][0] = 0; + ent->newShaderRGBA[TINT_BLADE2][1] = 0; + ent->newShaderRGBA[TINT_BLADE2][2] = 0; + } + else + { + CG_RGBForSaberColor( gent->client->ps.saber[1].blade[0].color, rgb ); + ent->newShaderRGBA[TINT_BLADE2][0] = 0xff * rgb[0]; + ent->newShaderRGBA[TINT_BLADE2][1] = 0xff * rgb[1]; + ent->newShaderRGBA[TINT_BLADE2][2] = 0xff * rgb[2]; + } + } + } + // If certain states are active, we don't want to add in the regular body if ( !gent->client->ps.powerups[PW_CLOAKED] && !gent->client->ps.powerups[PW_UNCLOAKING] && @@ -5707,34 +5771,6 @@ void CG_SaberDoWeaponHitMarks( gclient_t *client, gentity_t *saberEnt, gentity_t } } -static void CG_RGBForSaberColor( saber_colors_t color, vec3_t rgb ) -{ - switch( color ) - { - case SABER_RED: - VectorSet( rgb, 1.0f, 0.2f, 0.2f ); - break; - case SABER_ORANGE: - VectorSet( rgb, 1.0f, 0.5f, 0.1f ); - break; - case SABER_YELLOW: - VectorSet( rgb, 1.0f, 1.0f, 0.2f ); - break; - case SABER_GREEN: - VectorSet( rgb, 0.2f, 1.0f, 0.2f ); - break; - case SABER_BLUE: - VectorSet( rgb, 0.2f, 0.4f, 1.0f ); - break; - case SABER_PURPLE: - VectorSet( rgb, 0.9f, 0.2f, 1.0f ); - break; - default://SABER_RGB - VectorSet( rgb, ((color) & 0xff)/255.0f, ((color >> 8) & 0xff)/255.0f, ((color >> 16) & 0xff)/255.0f ); - break; - } -} - static void CG_DoSaberLight( saberInfo_t *saber ) { int firstBlade = 0; diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index 7a58a78840..8359a93fa4 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -905,10 +905,10 @@ static void G_SetSkin( gentity_t *ent ) || g_char_color_2_green->integer || g_char_color_2_blue->integer ) { - ent->client->renderInfo.newCustomRGBA[0][0] = g_char_color_2_red->integer; - ent->client->renderInfo.newCustomRGBA[0][1] = g_char_color_2_green->integer; - ent->client->renderInfo.newCustomRGBA[0][2] = g_char_color_2_blue->integer; - ent->client->renderInfo.newCustomRGBA[0][3] = 255; + ent->client->renderInfo.newCustomRGBA[TINT_NEW_ENT][0] = g_char_color_2_red->integer; + ent->client->renderInfo.newCustomRGBA[TINT_NEW_ENT][1] = g_char_color_2_green->integer; + ent->client->renderInfo.newCustomRGBA[TINT_NEW_ENT][2] = g_char_color_2_blue->integer; + ent->client->renderInfo.newCustomRGBA[TINT_NEW_ENT][3] = 255; } } @@ -2106,10 +2106,10 @@ void G_InitPlayerFromCvars( gentity_t *ent ) || g_char_color_2_green->integer || g_char_color_2_blue->integer ) { - ent->client->renderInfo.newCustomRGBA[0][0] = g_char_color_2_red->integer; - ent->client->renderInfo.newCustomRGBA[0][1] = g_char_color_2_green->integer; - ent->client->renderInfo.newCustomRGBA[0][2] = g_char_color_2_blue->integer; - ent->client->renderInfo.newCustomRGBA[0][3] = 255; + ent->client->renderInfo.newCustomRGBA[TINT_NEW_ENT][0] = g_char_color_2_red->integer; + ent->client->renderInfo.newCustomRGBA[TINT_NEW_ENT][1] = g_char_color_2_green->integer; + ent->client->renderInfo.newCustomRGBA[TINT_NEW_ENT][2] = g_char_color_2_blue->integer; + ent->client->renderInfo.newCustomRGBA[TINT_NEW_ENT][3] = 255; } } diff --git a/code/game/g_public.h b/code/game/g_public.h index 0081161af1..1ee9e5c9aa 100644 --- a/code/game/g_public.h +++ b/code/game/g_public.h @@ -363,6 +363,8 @@ Ghoul2 Insert Start void (*G2API_AddSkinGore)(CGhoul2Info_v &ghoul2,SSkinGoreData &gore); void (*G2API_ClearSkinGore)( CGhoul2Info_v &ghoul2 ); + void (*G2API_SetTintType)(CGhoul2Info *ghlInfo, g2Tints_t tintType); + void (*RMG_Init)(int terrainID); int (*CM_RegisterTerrain)(const char *info); diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 791e455102..acc6f66c67 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -230,7 +230,7 @@ class renderInfo_t //Fields to apply to entire model set, individual model's equivalents will modify this value byte customRGBA[4];//Red Green Blue, 0 = don't apply - byte newCustomRGBA[MAX_NEW_ENT_RGB][4]; + byte newCustomRGBA[MAX_CVAR_TINT][4]; //Allow up to 4 PCJ lookup values to be stored here. //The resolve to configstrings which contain the name of the diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index 701c2298e2..3d513f4a8e 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -931,7 +931,7 @@ static void Svcmd_HeadPlayerModel_f(void) static void Svcmd_NewPlayerTint_f(void) { - if ( gi.argc() == 5 && ((unsigned int)atoi(gi.argv(1)) < MAX_NEW_ENT_RGB)) + if ( gi.argc() == 5 && ((unsigned int)atoi(gi.argv(1)) < MAX_CVAR_TINT)) { unsigned int tintIndex = atoi(gi.argv(1)); g_entities[0].client->renderInfo.newCustomRGBA[tintIndex][0] = atoi(gi.argv(2)); @@ -946,7 +946,7 @@ static void Svcmd_NewPlayerTint_f(void) } else { - gi.Printf( S_COLOR_RED"USAGE: newPlayerTint \n" ); + gi.Printf( S_COLOR_RED"USAGE: newPlayerTint \n" ); } } diff --git a/code/game/ghoul2_shared.h b/code/game/ghoul2_shared.h index 3427e78694..e694b2ece2 100644 --- a/code/game/ghoul2_shared.h +++ b/code/game/ghoul2_shared.h @@ -34,6 +34,13 @@ along with this program; if not, see . void G2API_SetTime(int currentTime,int clock); int G2API_GetTime(int argTime); // this may or may not return arg depending on ghoul2_time cvar +typedef enum +{ + G2_TINT_DEFAULT, + G2_TINT_SABER, + G2_TINT_SABER2, + G2_TINT_MAX +} g2Tints_t; //=================================================================== // @@ -481,6 +488,8 @@ class CGhoul2Info const model_s *animModel; int currentAnimModelSize; const mdxaHeader_t *aHeader; + + g2Tints_t tintType; CGhoul2Info(): mModelindex(-1), @@ -507,7 +516,8 @@ class CGhoul2Info currentModelSize(0), animModel(0), currentAnimModelSize(0), - aHeader(0) + aHeader(0), + tintType(G2_TINT_DEFAULT) { mFileName[0] = 0; } diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index eb436879f5..8e4d2ca4ed 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -531,6 +531,8 @@ void WP_SaberAddG2SaberModels( gentity_t *ent, int specificSaberNum ) } G_CreateG2AttachedWeaponModel( ent, ent->client->ps.saber[saberNum].model, handBolt, saberNum ); + gi.G2API_SetTintType( &ent->ghoul2[ent->weaponModel[saberNum]], saberNum ? G2_TINT_SABER2 : G2_TINT_SABER ); + if ( ent->client->ps.saber[saberNum].skin != NULL ) {//if this saber has a customSkin, use it // lets see if it's out there @@ -644,6 +646,8 @@ void WP_SaberAddHolsteredG2SaberModels( gentity_t *ent, int specificSaberNum ) } G_CreateG2HolsteredWeaponModel( ent, ent->client->ps.saber[saberNum].model, handBolt, saberNum, angles, offset ); + gi.G2API_SetTintType( &ent->ghoul2[ent->holsterModel[saberNum]], saberNum ? G2_TINT_SABER2 : G2_TINT_SABER ); + if ( ent->client->ps.saber[saberNum].skin != NULL ) {//if this saber has a customSkin, use it // lets see if it's out there diff --git a/code/ghoul2/G2.h b/code/ghoul2/G2.h index 23f7acbe6c..3d4d1df9d4 100644 --- a/code/ghoul2/G2.h +++ b/code/ghoul2/G2.h @@ -226,4 +226,6 @@ void G2API_AddSkinGore(CGhoul2Info_v &ghoul2,SSkinGoreData &gore); void G2API_ClearSkinGore ( CGhoul2Info_v &ghoul2 ); //#endif +void G2API_SetTintType(CGhoul2Info *ghlInfo, g2Tints_t tintType); + #endif // G2_H_INC \ No newline at end of file diff --git a/code/rd-common/tr_public.h b/code/rd-common/tr_public.h index 94fba5338c..06e22ce030 100644 --- a/code/rd-common/tr_public.h +++ b/code/rd-common/tr_public.h @@ -374,6 +374,8 @@ typedef struct { void (*G2API_AddSkinGore)(CGhoul2Info_v &ghoul2, SSkinGoreData &gore); void (*G2API_ClearSkinGore)(CGhoul2Info_v &ghoul2); #endif + + void (*G2API_SetTintType)(CGhoul2Info *ghlInfo, g2Tints_t tintType); // Performance analysis (perform anal) void (*G2Time_ResetTimers)(void); diff --git a/code/rd-common/tr_types.h b/code/rd-common/tr_types.h index 67149626a7..cfc75ee92c 100644 --- a/code/rd-common/tr_types.h +++ b/code/rd-common/tr_types.h @@ -87,8 +87,16 @@ along with this program; if not, see . #define RDF_doFullbright 64 // Light Amp goggles #define RDF_ForceSightOn 128 // using force sight -#define MAX_NEW_ENT_RGB 1 - +typedef enum +{ + TINT_NEW_ENT, + TINT_HILT1, + TINT_HILT2, + MAX_CVAR_TINT, + TINT_BLADE1 = MAX_CVAR_TINT, + TINT_BLADE2, + MAX_NEW_ENT_RGB +} rgbTintsNew_t; extern int skyboxportal; extern int drawskyboxportal; diff --git a/code/rd-vanilla/G2_API.cpp b/code/rd-vanilla/G2_API.cpp index b0ef2257c7..f5d32412bb 100644 --- a/code/rd-vanilla/G2_API.cpp +++ b/code/rd-vanilla/G2_API.cpp @@ -2355,4 +2355,12 @@ bool G2_SetupModelPointers(CGhoul2Info_v &ghoul2) // returns true if any model i return ret; } +void G2API_SetTintType(CGhoul2Info *ghlInfo, g2Tints_t tintType) +{ + if (G2_SetupModelPointers(ghlInfo)) + { + ghlInfo->tintType = tintType; + } +} + diff --git a/code/rd-vanilla/tr_backend.cpp b/code/rd-vanilla/tr_backend.cpp index 741bb95b17..b90ae812dd 100644 --- a/code/rd-vanilla/tr_backend.cpp +++ b/code/rd-vanilla/tr_backend.cpp @@ -654,6 +654,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { trRefEntity_t *curEnt; postRender_t *pRender; bool didShadowPass = false; + g2Tints_t tintType, oldTintType; if (g_bRenderGlowingObjects) { //only shadow on initial passes @@ -674,18 +675,21 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { oldDepthRange = qfalse; oldDlighted = qfalse; oldSort = (unsigned int) -1; + oldTintType = G2_TINT_DEFAULT; depthRange = qfalse; backEnd.pc.c_surfaces += numDrawSurfs; for (i = 0, drawSurf = drawSurfs ; i < numDrawSurfs ; i++, drawSurf++) { - if ( drawSurf->sort == oldSort ) { + if ( drawSurf->sort == oldSort && drawSurf->tintType == oldTintType ) { // fast path, same as previous sort rb_surfaceTable[ *drawSurf->surface ]( drawSurf->surface ); continue; } R_DecomposeSort( drawSurf->sort, &entityNum, &shader, &fogNum, &dlighted ); + tintType = drawSurf->tintType; + // If we're rendering glowing objects, but this shader has no stages with glow, skip it! if ( g_bRenderGlowingObjects && !shader->hasGlow ) { @@ -743,6 +747,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { entityNum = oldEntityNum; fogNum = oldFogNum; dlighted = oldDlighted; + tintType = oldTintType; oldSort = (unsigned int)-1; //invalidate this thing, cause we may want to postrender more surfs of the same sort @@ -751,7 +756,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { } } - if (shader != oldShader || fogNum != oldFogNum || dlighted != oldDlighted + if (tintType != oldTintType || shader != oldShader || fogNum != oldFogNum || dlighted != oldDlighted || ( entityNum != oldEntityNum && !shader->entityMergable ) ) { if (oldShader != NULL) { @@ -767,6 +772,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { oldShader = shader; oldFogNum = fogNum; oldDlighted = dlighted; + oldTintType = tintType; } // diff --git a/code/rd-vanilla/tr_ghoul2.cpp b/code/rd-vanilla/tr_ghoul2.cpp index a80c862432..5ad5ada5cd 100644 --- a/code/rd-vanilla/tr_ghoul2.cpp +++ b/code/rd-vanilla/tr_ghoul2.cpp @@ -671,6 +671,7 @@ class CRenderSurface shader_t *gore_shader; CGoreSet *gore_set; #endif + g2Tints_t tintType; CRenderSurface( int initsurfaceNum, @@ -703,10 +704,11 @@ class CRenderSurface #ifdef _G2_GORE boltList(initboltList), gore_shader(initgore_shader), - gore_set(initgore_set) + gore_set(initgore_set), #else - boltList(initboltList) + boltList(initboltList), #endif + tintType(G2_TINT_DEFAULT) {} }; @@ -2342,7 +2344,8 @@ void RenderSurfaces(CRenderSurface &RS) CRenderableSurface *newSurf = AllocRS(); newSurf->surfaceData = surface; newSurf->boneCache = RS.boneCache; - R_AddDrawSurf( (surfaceType_t *)newSurf, shader, RS.fogNum, qfalse ); + newSurf->tintType = RS.tintType; + R_AddDrawSurf( (surfaceType_t *)newSurf, shader, RS.fogNum, qfalse, RS.tintType ); #ifdef _G2_GORE if (RS.gore_set && drawGore) @@ -2702,6 +2705,7 @@ void R_AddGhoulSurfaces( trRefEntity_t *ent ) { { RS.renderfx |= RF_NOSHADOW; } + RS.tintType = ghoul2[i].tintType; RenderSurfaces(RS); } } @@ -2794,6 +2798,8 @@ void RB_SurfaceGhoul( CRenderableSurface *surf ) mdxmVertexTexCoord_t *pTexCoords; int *piBoneReferences; + tess.tintType = surf->tintType; + #ifdef _G2_GORE if (surf->alternateTex) { diff --git a/code/rd-vanilla/tr_init.cpp b/code/rd-vanilla/tr_init.cpp index f61f97048e..021119abbc 100644 --- a/code/rd-vanilla/tr_init.cpp +++ b/code/rd-vanilla/tr_init.cpp @@ -2167,6 +2167,7 @@ extern "C" Q_EXPORT refexport_t* QDECL GetRefAPI ( int apiVersion, refimport_t * G2EX(AddSkinGore); G2EX(ClearSkinGore); #endif + G2EX(SetTintType); #ifdef G2_PERFORMANCE_ANALYSIS re.G2Time_ReportTimers = G2Time_ReportTimers; diff --git a/code/rd-vanilla/tr_local.h b/code/rd-vanilla/tr_local.h index c1cd4c5cca..be3a9a8996 100644 --- a/code/rd-vanilla/tr_local.h +++ b/code/rd-vanilla/tr_local.h @@ -590,6 +590,7 @@ Ghoul2 Insert End typedef struct drawSurf_s { unsigned sort; // bit combination for fast compares surfaceType_t *surface; // any of surface*_t + g2Tints_t tintType; } drawSurf_t; #define MAX_FACE_POINTS 64 @@ -1244,7 +1245,7 @@ void R_AddPolygonSurfaces( void ); void R_DecomposeSort( unsigned sort, int *entityNum, shader_t **shader, int *fogNum, int *dlightMap ); -void R_AddDrawSurf( const surfaceType_t *surface, const shader_t *shader, int fogIndex, int dlightMap ); +void R_AddDrawSurf( const surfaceType_t *surface, const shader_t *shader, int fogIndex, int dlightMap, g2Tints_t tintType = G2_TINT_DEFAULT ); #define CULL_IN 0 // completely unclipped @@ -1441,6 +1442,8 @@ struct shaderCommands_s //rww - doing a fade, don't compute shader color/alpha overrides bool fading; + + g2Tints_t tintType; }; #ifdef _MSC_VER @@ -1600,6 +1603,7 @@ class CRenderableSurface float fade; float impactTime; // this is a number between 0 and 1 that dictates the progression of the bullet impact #endif + g2Tints_t tintType; #ifdef _G2_GORE CRenderableSurface& operator= ( const CRenderableSurface& src ) @@ -1620,10 +1624,11 @@ CRenderableSurface(): #ifdef _G2_GORE surfaceData(0), alternateTex(0), - goreChain(0) + goreChain(0), #else - surfaceData(0) + surfaceData(0), #endif + tintType(G2_TINT_DEFAULT) {} void Init() diff --git a/code/rd-vanilla/tr_main.cpp b/code/rd-vanilla/tr_main.cpp index da619736ae..2266fe17a7 100644 --- a/code/rd-vanilla/tr_main.cpp +++ b/code/rd-vanilla/tr_main.cpp @@ -1159,7 +1159,7 @@ static void R_RadixSort( drawSurf_t *source, int size ) R_AddDrawSurf ================= */ -void R_AddDrawSurf( const surfaceType_t *surface, const shader_t *shader, int fogIndex, int dlightMap ) +void R_AddDrawSurf( const surfaceType_t *surface, const shader_t *shader, int fogIndex, int dlightMap, g2Tints_t tintType ) { int index; @@ -1176,12 +1176,13 @@ void R_AddDrawSurf( const surfaceType_t *surface, const shader_t *shader, int fo { //if shader is only seen with ForceSight and we don't have ForceSight on, then don't draw return; } - + // the sort data is packed into a single 32 bit value so it can be // compared quickly during the qsorting process tr.refdef.drawSurfs[index].sort = (shader->sortedIndex << QSORT_SHADERNUM_SHIFT) | tr.shiftedEntityNum | ( fogIndex << QSORT_FOGNUM_SHIFT ) | (int)dlightMap; tr.refdef.drawSurfs[index].surface = (surfaceType_t *)surface; + tr.refdef.drawSurfs[index].tintType = tintType; tr.refdef.numDrawSurfs++; } diff --git a/code/rd-vanilla/tr_shade.cpp b/code/rd-vanilla/tr_shade.cpp index dac05d899f..3cdbadef36 100644 --- a/code/rd-vanilla/tr_shade.cpp +++ b/code/rd-vanilla/tr_shade.cpp @@ -441,6 +441,8 @@ void RB_BeginSurface( shader_t *shader, int fogNum ) { tess.fading = false; + tess.tintType = G2_TINT_DEFAULT; + tess.registration++; } @@ -1369,6 +1371,8 @@ ComputeColors static void ComputeColors( shaderStage_t *pStage, alphaGen_t forceAlphaGen, colorGen_t forceRGBGen ) { int i; + + int tintIndexOffset = 0; if ( tess.shader != tr.projectionShadowShader && tess.shader != tr.shadowShader && ( backEnd.currentEntity->e.renderfx & (RF_DISINTEGRATE1|RF_DISINTEGRATE2))) @@ -1423,6 +1427,29 @@ static void ComputeColors( shaderStage_t *pStage, alphaGen_t forceAlphaGen, colo { forceAlphaGen = pStage->alphaGen; } + + if ( pStage->rgbGenEntIndex == TINT_BLADE1 ) + { + switch( tess.tintType ) + { + case G2_TINT_SABER2: + tintIndexOffset = 1; + break; + default: + break; + } + } + else if ( pStage->rgbGenEntIndex == TINT_HILT1 ) + { + switch( tess.tintType ) + { + case G2_TINT_SABER2: + tintIndexOffset = 1; + break; + default: + break; + } + } switch ( forceRGBGen ) { @@ -1528,25 +1555,25 @@ static void ComputeColors( shaderStage_t *pStage, alphaGen_t forceAlphaGen, colo baDest->ui = baSource->ui; } break; - case CGEN_ENTITY_NEW: - RB_CalcColorFromEntityNew( ( unsigned char * ) tess.svars.colors, pStage->rgbGenEntIndex ); - if ( forceAlphaGen == AGEN_IDENTITY && - backEnd.currentEntity->e.newShaderRGBA[0][3] == 0xff - ) - { - forceAlphaGen = AGEN_SKIP; //already got it in this set since it does all 4 components - } - break; - case CGEN_LIGHTING_DIFFUSE_ENTITY_NEW: - RB_CalcDiffuseEntityColorNew( ( unsigned char * ) tess.svars.colors, pStage->rgbGenEntIndex ); - - if ( forceAlphaGen == AGEN_IDENTITY && - backEnd.currentEntity->e.shaderRGBA[3] == 0xff - ) - { - forceAlphaGen = AGEN_SKIP; //already got it in this set since it does all 4 components - } - break; + case CGEN_ENTITY_NEW: + RB_CalcColorFromEntityNew( ( unsigned char * ) tess.svars.colors, pStage->rgbGenEntIndex + tintIndexOffset ); + if ( forceAlphaGen == AGEN_IDENTITY && + backEnd.currentEntity->e.newShaderRGBA[0][3] == 0xff + ) + { + forceAlphaGen = AGEN_SKIP; //already got it in this set since it does all 4 components + } + break; + case CGEN_LIGHTING_DIFFUSE_ENTITY_NEW: + RB_CalcDiffuseEntityColorNew( ( unsigned char * ) tess.svars.colors, pStage->rgbGenEntIndex + tintIndexOffset); + + if ( forceAlphaGen == AGEN_IDENTITY && + backEnd.currentEntity->e.shaderRGBA[3] == 0xff + ) + { + forceAlphaGen = AGEN_SKIP; //already got it in this set since it does all 4 components + } + break; } // diff --git a/code/rd-vanilla/tr_shader.cpp b/code/rd-vanilla/tr_shader.cpp index bde79729d2..bda8ee272f 100644 --- a/code/rd-vanilla/tr_shader.cpp +++ b/code/rd-vanilla/tr_shader.cpp @@ -1496,6 +1496,16 @@ static qboolean ParseStage( shaderStage_t *stage, const char **text ) { stage->rgbGen = CGEN_ONE_MINUS_ENTITY; } + else if ( !Q_stricmp( token, "hilt" ) ) + { + stage->rgbGen = CGEN_ENTITY_NEW; + stage->rgbGenEntIndex = TINT_HILT1; + } + else if ( !Q_stricmp( token, "blade" ) ) + { + stage->rgbGen = CGEN_ENTITY_NEW; + stage->rgbGenEntIndex = TINT_BLADE1; + } else if ( !Q_stricmp( token, "vertex" ) ) { if (shader.lightmapIndex[0] == LIGHTMAP_NONE) @@ -1540,6 +1550,24 @@ static qboolean ParseStage( shaderStage_t *stage, const char **text ) } } } + else if ( !Q_stricmp( token, "lightingDiffuseHilt" ) ) + { + if (shader.lightmapIndex[0] != LIGHTMAP_NONE) + { + ri.Printf( PRINT_ERROR, "ERROR: rgbGen lightingDiffuseHilt used on a misc_model! in shader '%s'\n", shader.name ); + } + stage->rgbGen = CGEN_LIGHTING_DIFFUSE_ENTITY_NEW; + stage->rgbGenEntIndex = TINT_HILT1; + } + else if ( !Q_stricmp( token, "lightingDiffuseBlade" ) ) + { + if (shader.lightmapIndex[0] != LIGHTMAP_NONE) + { + ri.Printf( PRINT_ERROR, "ERROR: rgbGen lightingDiffuseBlade used on a misc_model! in shader '%s'\n", shader.name ); + } + stage->rgbGen = CGEN_LIGHTING_DIFFUSE_ENTITY_NEW; + stage->rgbGenEntIndex = TINT_BLADE1; + } else if ( !Q_stricmp( token, "oneMinusVertex" ) ) { stage->rgbGen = CGEN_ONE_MINUS_VERTEX; diff --git a/code/server/sv_game.cpp b/code/server/sv_game.cpp index 5b5c826637..f8cd83a20b 100644 --- a/code/server/sv_game.cpp +++ b/code/server/sv_game.cpp @@ -830,6 +830,12 @@ static void SV_G2API_ClearSkinGore( } #endif +static void SV_G2API_SetTintType( CGhoul2Info *ghlInfo, g2Tints_t tintType ) +{ + return re.G2API_SetTintType( ghlInfo, tintType ); +} + + static IGhoul2InfoArray& SV_TheGhoul2InfoArray( void ) { return re.TheGhoul2InfoArray(); @@ -1042,6 +1048,8 @@ void SV_InitGameProgs (void) { import.G2API_AddSkinGore = SV_G2API_AddSkinGore; import.G2API_ClearSkinGore = SV_G2API_ClearSkinGore; + import.G2API_SetTintType = SV_G2API_SetTintType; + import.SetActiveSubBSP = SV_SetActiveSubBSP; import.RE_RegisterSkin = SV_RE_RegisterSkin; From 3a8aac383bac6f450928525ab646765d1c36f4be Mon Sep 17 00:00:00 2001 From: redsaurus Date: Wed, 1 Jun 2016 16:24:14 +0100 Subject: [PATCH 386/445] Custom sabers: blade/hilt colours work in UI Includes small fixes --- code/game/g_client.cpp | 48 +++++++++++++ code/game/g_main.cpp | 16 +++++ code/game/g_svcmds.cpp | 14 +++- code/rd-vanilla/tr_shade.cpp | 2 +- code/ui/ui_atoms.cpp | 8 +++ code/ui/ui_main.cpp | 35 +++++++++- code/ui/ui_saber.cpp | 1 + code/ui/ui_shared.cpp | 130 +++++++++++++++++++++++++++++++++-- 8 files changed, 246 insertions(+), 8 deletions(-) diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index 8359a93fa4..f10f978369 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -57,6 +57,14 @@ extern cvar_t *g_char_color_2_red; extern cvar_t *g_char_color_2_green; extern cvar_t *g_char_color_2_blue; +extern cvar_t *g_hilt_color_red; +extern cvar_t *g_hilt_color_green; +extern cvar_t *g_hilt_color_blue; + +extern cvar_t *g_hilt2_color_red; +extern cvar_t *g_hilt2_color_green; +extern cvar_t *g_hilt2_color_blue; + extern cvar_t *g_saber_skin[MAX_SABER_PARTS]; extern cvar_t *g_saber2_skin[MAX_SABER_PARTS]; @@ -910,6 +918,26 @@ static void G_SetSkin( gentity_t *ent ) ent->client->renderInfo.newCustomRGBA[TINT_NEW_ENT][2] = g_char_color_2_blue->integer; ent->client->renderInfo.newCustomRGBA[TINT_NEW_ENT][3] = 255; } + + if ( g_hilt_color_red->integer + || g_hilt_color_green->integer + || g_hilt_color_blue->integer ) + { + ent->client->renderInfo.newCustomRGBA[TINT_HILT1][0] = g_hilt_color_red->integer; + ent->client->renderInfo.newCustomRGBA[TINT_HILT1][1] = g_hilt_color_green->integer; + ent->client->renderInfo.newCustomRGBA[TINT_HILT1][2] = g_hilt_color_blue->integer; + ent->client->renderInfo.newCustomRGBA[TINT_HILT1][3] = 255; + } + + if ( g_hilt2_color_red->integer + || g_hilt2_color_green->integer + || g_hilt2_color_blue->integer ) + { + ent->client->renderInfo.newCustomRGBA[TINT_HILT2][0] = g_hilt2_color_red->integer; + ent->client->renderInfo.newCustomRGBA[TINT_HILT2][1] = g_hilt2_color_green->integer; + ent->client->renderInfo.newCustomRGBA[TINT_HILT2][2] = g_hilt2_color_blue->integer; + ent->client->renderInfo.newCustomRGBA[TINT_HILT2][3] = 255; + } } qboolean G_StandardHumanoid( gentity_t *self ) @@ -2111,6 +2139,26 @@ void G_InitPlayerFromCvars( gentity_t *ent ) ent->client->renderInfo.newCustomRGBA[TINT_NEW_ENT][2] = g_char_color_2_blue->integer; ent->client->renderInfo.newCustomRGBA[TINT_NEW_ENT][3] = 255; } + + if ( g_hilt_color_red->integer + || g_hilt_color_green->integer + || g_hilt_color_blue->integer ) + { + ent->client->renderInfo.newCustomRGBA[TINT_HILT1][0] = g_hilt_color_red->integer; + ent->client->renderInfo.newCustomRGBA[TINT_HILT1][1] = g_hilt_color_green->integer; + ent->client->renderInfo.newCustomRGBA[TINT_HILT1][2] = g_hilt_color_blue->integer; + ent->client->renderInfo.newCustomRGBA[TINT_HILT1][3] = 255; + } + + if ( g_hilt2_color_red->integer + || g_hilt2_color_green->integer + || g_hilt2_color_blue->integer ) + { + ent->client->renderInfo.newCustomRGBA[TINT_HILT2][0] = g_hilt2_color_red->integer; + ent->client->renderInfo.newCustomRGBA[TINT_HILT2][1] = g_hilt2_color_green->integer; + ent->client->renderInfo.newCustomRGBA[TINT_HILT2][2] = g_hilt2_color_blue->integer; + ent->client->renderInfo.newCustomRGBA[TINT_HILT2][3] = 255; + } } void G_SetHeadSkin( gentity_t *ent ) diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 639352b54c..69a1092d82 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -222,6 +222,14 @@ cvar_t *g_char_color_2_red; cvar_t *g_char_color_2_green; cvar_t *g_char_color_2_blue; +cvar_t *g_hilt_color_red; +cvar_t *g_hilt_color_green; +cvar_t *g_hilt_color_blue; + +cvar_t *g_hilt2_color_red; +cvar_t *g_hilt2_color_green; +cvar_t *g_hilt2_color_blue; + cvar_t *g_saber_skin[MAX_SABER_PARTS]; cvar_t *g_saber2_skin[MAX_SABER_PARTS]; @@ -715,6 +723,14 @@ void G_InitCvars( void ) { g_char_color_2_green = gi.cvar( "g_char_color_2_green", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); g_char_color_2_blue = gi.cvar( "g_char_color_2_blue", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_hilt_color_red = gi.cvar( "g_hilt_color_red", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_hilt_color_green = gi.cvar( "g_hilt_color_green", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_hilt_color_blue = gi.cvar( "g_hilt_color_blue", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + + g_hilt2_color_red = gi.cvar( "g_hilt2_color_red", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_hilt2_color_green = gi.cvar( "g_hilt2_color_green", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + g_hilt2_color_blue = gi.cvar( "g_hilt2_color_blue", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + for (int i = 0; i < MAX_SABER_PARTS; i++) { g_saber_skin[i] = gi.cvar( va("g_saber_skin%d", (i+1)), "", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index 3d513f4a8e..a27ef141ca 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -937,12 +937,24 @@ static void Svcmd_NewPlayerTint_f(void) g_entities[0].client->renderInfo.newCustomRGBA[tintIndex][0] = atoi(gi.argv(2)); g_entities[0].client->renderInfo.newCustomRGBA[tintIndex][1] = atoi(gi.argv(3)); g_entities[0].client->renderInfo.newCustomRGBA[tintIndex][2] = atoi(gi.argv(4)); - if (tintIndex == 0) + if (tintIndex == TINT_NEW_ENT) { gi.cvar_set("g_char_color_2_red", gi.argv(2) ); gi.cvar_set("g_char_color_2_green", gi.argv(3) ); gi.cvar_set("g_char_color_2_blue", gi.argv(4) ); } + else if (tintIndex == TINT_HILT1) + { + gi.cvar_set("g_hilt_color_red", gi.argv(2) ); + gi.cvar_set("g_hilt_color_green", gi.argv(3) ); + gi.cvar_set("g_hilt_color_blue", gi.argv(4) ); + } + else if (tintIndex == TINT_HILT2) + { + gi.cvar_set("g_hilt2_color_red", gi.argv(2) ); + gi.cvar_set("g_hilt2_color_green", gi.argv(3) ); + gi.cvar_set("g_hilt2_color_blue", gi.argv(4) ); + } } else { diff --git a/code/rd-vanilla/tr_shade.cpp b/code/rd-vanilla/tr_shade.cpp index 3cdbadef36..8446c2099c 100644 --- a/code/rd-vanilla/tr_shade.cpp +++ b/code/rd-vanilla/tr_shade.cpp @@ -1558,7 +1558,7 @@ static void ComputeColors( shaderStage_t *pStage, alphaGen_t forceAlphaGen, colo case CGEN_ENTITY_NEW: RB_CalcColorFromEntityNew( ( unsigned char * ) tess.svars.colors, pStage->rgbGenEntIndex + tintIndexOffset ); if ( forceAlphaGen == AGEN_IDENTITY && - backEnd.currentEntity->e.newShaderRGBA[0][3] == 0xff + backEnd.currentEntity->e.newShaderRGBA[pStage->rgbGenEntIndex + tintIndexOffset][3] == 0xff ) { forceAlphaGen = AGEN_SKIP; //already got it in this set since it does all 4 components diff --git a/code/ui/ui_atoms.cpp b/code/ui/ui_atoms.cpp index 150ebae3e0..d278bbfcc8 100644 --- a/code/ui/ui_atoms.cpp +++ b/code/ui/ui_atoms.cpp @@ -293,6 +293,14 @@ void UI_Init( int apiVersion, uiimport_t *uiimport, qboolean inGameLoad ) ui.Cvar_Create( "g_char_color_2_red", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); ui.Cvar_Create( "g_char_color_2_green", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); ui.Cvar_Create( "g_char_color_2_blue", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + + ui.Cvar_Create( "g_hilt_color_red", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + ui.Cvar_Create( "g_hilt_color_green", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + ui.Cvar_Create( "g_hilt_color_blue", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + + ui.Cvar_Create( "g_hilt2_color_red", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + ui.Cvar_Create( "g_hilt2_color_green", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); + ui.Cvar_Create( "g_hilt2_color_blue", "255", CVAR_ARCHIVE|CVAR_SAVEGAME|CVAR_NORESTART ); ui.Cvar_Create( "ui_forcepower_inc", "0", CVAR_ROM|CVAR_SAVEGAME|CVAR_NORESTART); ui.Cvar_Create( "tier_storyinfo", "0", CVAR_ROM|CVAR_SAVEGAME|CVAR_NORESTART); diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 6b26eb0875..9546e070fe 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -408,7 +408,15 @@ vmCvar_t ui_saber2_skin5; vmCvar_t ui_char_color_2_red; vmCvar_t ui_char_color_2_green; -vmCvar_t ui_char_color_2_blue +vmCvar_t ui_char_color_2_blue; + +vmCvar_t ui_hilt_color_red; +vmCvar_t ui_hilt_color_green; +vmCvar_t ui_hilt_color_blue; + +vmCvar_t ui_hilt2_color_red; +vmCvar_t ui_hilt2_color_green; +vmCvar_t ui_hilt2_color_blue; static cvarTable_t cvarTable[] = { @@ -459,6 +467,14 @@ static cvarTable_t cvarTable[] = { &ui_rgb_saber2_blue, "ui_rgb_saber2_blue", "", 0}, { &ui_rgb_saber2_green, "ui_rgb_saber2_green", "", 0}, + { &ui_hilt_color_red, "ui_hilt_color_red", "", 0}, + { &ui_hilt_color_green, "ui_hilt_color_green", "", 0}, + { &ui_hilt_color_blue, "ui_hilt_color_blue", "", 0}, + + { &ui_hilt2_color_red, "ui_hilt2_color_red", "", 0}, + { &ui_hilt2_color_green, "ui_hilt2_color_green", "", 0}, + { &ui_hilt2_color_blue, "ui_hilt2_color_blue", "", 0}, + { &ui_saber_skin1, "ui_saber_skin1", "", 0}, { &ui_saber_skin2, "ui_saber_skin2", "", 0}, { &ui_saber_skin3, "ui_saber_skin3", "", 0}, @@ -5352,7 +5368,14 @@ static void UI_UpdateSaberCvars ( void ) Cvar_Set ( "g_saber2_skin3", Cvar_VariableString ( "ui_saber2_skin3" ) ); Cvar_Set ( "g_saber2_skin4", Cvar_VariableString ( "ui_saber2_skin4" ) ); Cvar_Set ( "g_saber2_skin5", Cvar_VariableString ( "ui_saber2_skin5" ) ); - + + Cvar_Set ( "g_hilt_color_red", Cvar_VariableString ( "ui_hilt_color_red" ) ); + Cvar_Set ( "g_hilt_color_blue", Cvar_VariableString ( "ui_hilt_color_blue" ) ); + Cvar_Set ( "g_hilt_color_green", Cvar_VariableString ( "ui_hilt_color_green" ) ); + + Cvar_Set ( "g_hilt2_color_red", Cvar_VariableString ( "ui_hilt2_color_red" ) ); + Cvar_Set ( "g_hilt2_color_blue", Cvar_VariableString ( "ui_hilt2_color_blue" ) ); + Cvar_Set ( "g_hilt2_color_green", Cvar_VariableString ( "ui_hilt2_color_green" ) ); } #ifndef JK2_MODE @@ -7211,6 +7234,14 @@ static void UI_GetSaberCvars ( void ) Cvar_Set ( "ui_saber2_skin3", Cvar_VariableString ( "g_saber2_skin3" ) ); Cvar_Set ( "ui_saber2_skin4", Cvar_VariableString ( "g_saber2_skin4" ) ); Cvar_Set ( "ui_saber2_skin5", Cvar_VariableString ( "g_saber2_skin5" ) ); + + Cvar_Set ( "ui_hilt_color_red", Cvar_VariableString ( "g_hilt_color_red" ) ); + Cvar_Set ( "ui_hilt_color_blue", Cvar_VariableString ( "g_hilt_color_blue" ) ); + Cvar_Set ( "ui_hilt_color_green", Cvar_VariableString ( "g_hilt_color_green" ) ); + + Cvar_Set ( "ui_hilt2_color_red", Cvar_VariableString ( "g_hilt2_color_red" ) ); + Cvar_Set ( "ui_hilt2_color_blue", Cvar_VariableString ( "g_hilt2_color_blue" ) ); + Cvar_Set ( "ui_hilt2_color_green", Cvar_VariableString ( "g_hilt2_color_green" ) ); } diff --git a/code/ui/ui_saber.cpp b/code/ui/ui_saber.cpp index cd3c1dcef4..0dbb76c495 100644 --- a/code/ui/ui_saber.cpp +++ b/code/ui/ui_saber.cpp @@ -1101,6 +1101,7 @@ void UI_SaberAttachToChar( itemDef_t *item ) boltNum = DC->g2_AddBolt(&item->ghoul2[0], "*l_hand"); } re.G2API_AttachG2Model(&item->ghoul2[g2Saber], &item->ghoul2[0], boltNum, 0); + re.G2API_SetTintType(&item->ghoul2[g2Saber], saberNum ? G2_TINT_SABER2 : G2_TINT_SABER); } } } diff --git a/code/ui/ui_shared.cpp b/code/ui/ui_shared.cpp index be849d4c18..136e689f9c 100644 --- a/code/ui/ui_shared.cpp +++ b/code/ui/ui_shared.cpp @@ -51,6 +51,22 @@ extern vmCvar_t ui_char_color_2_red; extern vmCvar_t ui_char_color_2_green; extern vmCvar_t ui_char_color_2_blue; +extern vmCvar_t ui_hilt_color_red; +extern vmCvar_t ui_hilt_color_green; +extern vmCvar_t ui_hilt_color_blue; + +extern vmCvar_t ui_hilt2_color_red; +extern vmCvar_t ui_hilt2_color_green; +extern vmCvar_t ui_hilt2_color_blue; + +extern vmCvar_t ui_rgb_saber_red; +extern vmCvar_t ui_rgb_saber_green; +extern vmCvar_t ui_rgb_saber_blue; + +extern vmCvar_t ui_rgb_saber2_red; +extern vmCvar_t ui_rgb_saber2_green; +extern vmCvar_t ui_rgb_saber2_blue; + void *UI_Alloc( int size ); void Controls_GetConfig( void ); @@ -7193,6 +7209,79 @@ Item_Model_Paint ================= */ extern void UI_SaberDrawBlades( itemDef_t *item, vec3_t origin, float curYaw ); +extern saber_colors_t TranslateSaberColor( const char *name ); + +void UI_RGBForSaber( byte *rgba, int whichSaber ) +{ + char bladeColorString[MAX_QPATH]; + + if ( whichSaber == 0 ) + { + DC->getCVarString( "ui_saber_color", bladeColorString, sizeof(bladeColorString) ); + } + else//if ( whichSaber == 1 ) - presumed + { + DC->getCVarString( "ui_saber2_color", bladeColorString, sizeof(bladeColorString) ); + } + + saber_colors_t bladeColor = TranslateSaberColor( bladeColorString ); + + switch( bladeColor ) + { + case SABER_RED: + rgba[0] = 255; + rgba[1] = 51; + rgba[2] = 51; + rgba[3] = 255; + break; + case SABER_ORANGE: + rgba[0] = 255; + rgba[1] = 128; + rgba[2] = 25; + rgba[3] = 255; + break; + case SABER_YELLOW: + rgba[0] = 255; + rgba[1] = 255; + rgba[2] = 51; + rgba[3] = 255; + break; + case SABER_GREEN: + rgba[0] = 51; + rgba[1] = 255; + rgba[2] = 51; + rgba[3] = 255; + break; + case SABER_BLUE: + rgba[0] = 51; + rgba[2] = 102; + rgba[3] = 255; + rgba[3] = 255; + break; + case SABER_PURPLE: + rgba[0] = 230; + rgba[1] = 51; + rgba[2] = 255; + rgba[3] = 255; + break; + default://SABER_RGB + if (whichSaber == 1) + { + rgba[0] = ui_rgb_saber2_red.integer; + rgba[1] = ui_rgb_saber2_green.integer; + rgba[2] = ui_rgb_saber2_blue.integer; + rgba[3] = 255; + } + else + { + rgba[0] = ui_rgb_saber_red.integer; + rgba[1] = ui_rgb_saber_green.integer; + rgba[2] = ui_rgb_saber_blue.integer; + rgba[3] = 255; + } + break; + } +} void Item_Model_Paint(itemDef_t *item) { @@ -7439,14 +7528,47 @@ void Item_Model_Paint(itemDef_t *item) ent.shaderRGBA[1] = ui_char_color_green.integer; ent.shaderRGBA[2] = ui_char_color_blue.integer; ent.shaderRGBA[3] = 255; - ent.newShaderRGBA[0][0] = ui_char_color_2_red.integer; - ent.newShaderRGBA[0][1] = ui_char_color_2_green.integer; - ent.newShaderRGBA[0][2] = ui_char_color_2_blue.integer; - ent.newShaderRGBA[0][3] = 255; + ent.newShaderRGBA[TINT_NEW_ENT][0] = ui_char_color_2_red.integer; + ent.newShaderRGBA[TINT_NEW_ENT][1] = ui_char_color_2_green.integer; + ent.newShaderRGBA[TINT_NEW_ENT][2] = ui_char_color_2_blue.integer; + ent.newShaderRGBA[TINT_NEW_ENT][3] = 255; UI_TalkingHead(item); } if ( item->flags&ITF_ISANYSABER ) {//UGH, draw the saber blade! + if ( item->flags&ITF_ISCHARACTER ) + { + ent.newShaderRGBA[TINT_HILT1][0] = ui_hilt_color_red.integer; + ent.newShaderRGBA[TINT_HILT1][1] = ui_hilt_color_green.integer; + ent.newShaderRGBA[TINT_HILT1][2] = ui_hilt_color_blue.integer; + ent.newShaderRGBA[TINT_HILT1][3] = 255; + + ent.newShaderRGBA[TINT_HILT2][0] = ui_hilt2_color_red.integer; + ent.newShaderRGBA[TINT_HILT2][1] = ui_hilt2_color_green.integer; + ent.newShaderRGBA[TINT_HILT2][2] = ui_hilt2_color_blue.integer; + ent.newShaderRGBA[TINT_HILT2][3] = 255; + + UI_RGBForSaber(ent.newShaderRGBA[TINT_BLADE1], 0); + UI_RGBForSaber(ent.newShaderRGBA[TINT_BLADE2], 1); + } + else if ( item->flags&ITF_ISSABER ) + { + ent.newShaderRGBA[TINT_HILT1][0] = ui_hilt_color_red.integer; + ent.newShaderRGBA[TINT_HILT1][1] = ui_hilt_color_green.integer; + ent.newShaderRGBA[TINT_HILT1][2] = ui_hilt_color_blue.integer; + ent.newShaderRGBA[TINT_HILT1][3] = 255; + + UI_RGBForSaber(ent.newShaderRGBA[TINT_BLADE1], 0); + } + else if ( item->flags&ITF_ISSABER2 ) + { + ent.newShaderRGBA[TINT_HILT1][0] = ui_hilt2_color_red.integer; + ent.newShaderRGBA[TINT_HILT1][1] = ui_hilt2_color_green.integer; + ent.newShaderRGBA[TINT_HILT1][2] = ui_hilt2_color_blue.integer; + ent.newShaderRGBA[TINT_HILT1][3] = 255; + + UI_RGBForSaber(ent.newShaderRGBA[TINT_BLADE1], 1); + } UI_SaberDrawBlades( item, origin, curYaw ); } } From 12c7d1920de30ebfdc6a6814b01653b73695bc79 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sun, 10 Aug 2014 16:07:49 +0100 Subject: [PATCH 387/445] UI: added "toggledecoration" uiscript toggles if a given item is regarded as decoration or not --- code/ui/ui_shared.cpp | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/code/ui/ui_shared.cpp b/code/ui/ui_shared.cpp index 136e689f9c..7d596e5b32 100644 --- a/code/ui/ui_shared.cpp +++ b/code/ui/ui_shared.cpp @@ -1978,6 +1978,28 @@ void Menu_OrbitItemByName(menuDef_t *menu, const char *p, float x, float y, floa } } +void Menu_ToggleDecorationByName(menuDef_t *menu, const char *p) +{ + itemDef_t *item; + int i; + int count = Menu_ItemsMatchingGroup(menu, p); + for (i = 0; i < count; i++) + { + item = Menu_GetMatchingItemByNumber(menu, i, p); + if (item != NULL) + { + if (item->window.flags & WINDOW_DECORATION) + { + item->window.flags &= ~WINDOW_DECORATION; + } + else + { + item->window.flags |= WINDOW_DECORATION; + } + } + } +} + void Menu_ItemDisable(menuDef_t *menu, const char *name, qboolean disableFlag) { int j,count; @@ -2958,6 +2980,18 @@ qboolean Script_Orbit(itemDef_t *item, const char **args) return qtrue; } +qboolean Script_ToggleDecoration(itemDef_t *item, const char **args) +{ + const char *name; + + if (String_Parse(args, &name)) + { + Menu_ToggleDecorationByName((menuDef_t *) item->parent, name); + } + + return qtrue; +} + commandDef_t commandList[] = { @@ -2993,7 +3027,8 @@ commandDef_t commandList[] = {"delay", &Script_Delay}, // works on this (script) {"transition3", &Script_Transition3}, // model exclusive transition {"incrementfeeder", &Script_IncrementFeeder}, - {"decrementfeeder", &Script_DecrementFeeder} + {"decrementfeeder", &Script_DecrementFeeder}, + {"toggledecoration", &Script_ToggleDecoration} }; int scriptCommandCount = sizeof(commandList) / sizeof(commandDef_t); From 105eb012cf53a3fc5eb2b448ae8997489c3fc124 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Tue, 12 Aug 2014 03:25:50 +0100 Subject: [PATCH 388/445] Saberthrow: now a forcepower runs off +button9 defining BUTTON_SABERTHROW to 128 gives old, alt attack behaviour --- code/cgame/cg_local.h | 2 +- code/cgame/cg_main.cpp | 4 ++++ code/game/bg_pmove.cpp | 12 ++++++++++++ code/game/bg_public.h | 1 + code/game/wp_saber.cpp | 6 +++--- code/qcommon/q_shared.h | 2 ++ 6 files changed, 23 insertions(+), 4 deletions(-) diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index 19b8f11dda..47cb350dad 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -517,7 +517,7 @@ Ghoul2 Insert End } cg_t; -#define MAX_SHOWPOWERS 12 +#define MAX_SHOWPOWERS 13 extern int showPowers[MAX_SHOWPOWERS]; extern const char *showPowersName[MAX_SHOWPOWERS]; extern int force_icons[NUM_FORCE_POWERS]; diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 4f8be101b1..83c33a7535 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -3686,6 +3686,8 @@ int showPowers[MAX_SHOWPOWERS] = FP_LIGHTNING, FP_RAGE, FP_GRIP, + + FP_SABERTHROW, }; const char *showPowersName[MAX_SHOWPOWERS] = @@ -3704,6 +3706,8 @@ const char *showPowersName[MAX_SHOWPOWERS] = "SP_INGAME_LIGHTNING2", "SP_INGAME_DARK_RAGE2", "SP_INGAME_GRIP2", + + "SP_INGAME_SABER_THROW2", }; // Keep these with groups light side, core, and dark side diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 7912a70b46..089d83beee 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -14329,6 +14329,9 @@ void PM_CheckForceUseButton( gentity_t *ent, usercmd_t *ucmd ) // FIXME! Failing at WP_ForcePowerUsable(). -AReis ucmd->buttons |= BUTTON_FORCE_DRAIN; break; + case FP_SABERTHROW: + ucmd->buttons |= BUTTON_SABERTHROW; + break; // default: // Com_Printf( "Use Force: Unhandled force: %d\n", showPowers[cg.forcepowerSelect]); // break; @@ -15113,6 +15116,15 @@ void Pmove( pmove_t *pmove ) { pm->ps->pm_flags &= ~PMF_FORCE_FOCUS_HELD; } + + if ( pm->cmd.buttons & BUTTON_SABERTHROW ) + { + pm->ps->pm_flags |= PMF_SABERTHROW_HELD; + } + else + { + pm->ps->pm_flags &= ~PMF_SABERTHROW_HELD; + } if ( pm->gent )//&& pm->gent->s.number == 0 )//player only? { diff --git a/code/game/bg_public.h b/code/game/bg_public.h index 82937a53b6..459829d432 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -123,6 +123,7 @@ typedef enum { #define PMF_BUMPED (1<<17)//131072 // Bumped into something #define PMF_FORCE_FOCUS_HELD (1<<18)//262144 // Holding down the saberthrow/kick button #define PMF_FIX_MINS (1<<19)//524288 // Mins raised for dual forward jump, fix them +#define PMF_SABERTHROW_HELD (1<<20) #define PMF_ALL_TIMES (PMF_TIME_WATERJUMP|PMF_TIME_LAND|PMF_TIME_KNOCKBACK|PMF_TIME_NOFRICTION) #define MAXTOUCH 32 diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 8e4d2ca4ed..f8074617be 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -7219,7 +7219,7 @@ void WP_SaberThrow( gentity_t *self, usercmd_t *ucmd ) {//don't even have it out return; } - else if ( (ucmd->buttons&BUTTON_ALT_ATTACK) && !(self->client->ps.pm_flags&PMF_ALT_ATTACK_HELD) ) + else if ( (ucmd->buttons&BUTTON_SABERTHROW) && !(self->client->ps.pm_flags&PMF_SABERTHROW_HELD) ) {//still holding it, not still holding attack from a previous throw, so throw it. if ( !(self->client->ps.saberEventFlags&SEF_INWATER) && WP_SaberLaunch( self, saberent, qtrue ) ) { @@ -7367,7 +7367,7 @@ void WP_SaberThrow( gentity_t *self, usercmd_t *ucmd ) {//saber still flying forward if ( self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_2 ) {//still holding it out - if ( !(ucmd->buttons&BUTTON_ALT_ATTACK) && self->client->ps.forcePowerDebounce[FP_SABERTHROW] < level.time ) + if ( !(ucmd->buttons&BUTTON_SABERTHROW) && self->client->ps.forcePowerDebounce[FP_SABERTHROW] < level.time ) {//done throwing, return to me if ( self->client->ps.saber[0].Active() ) {//still on @@ -7389,7 +7389,7 @@ void WP_SaberThrow( gentity_t *self, usercmd_t *ucmd ) } else { - if ( !(ucmd->buttons&BUTTON_ALT_ATTACK) && self->client->ps.forcePowerDebounce[FP_SABERTHROW] < level.time ) + if ( !(ucmd->buttons&BUTTON_SABERTHROW) && self->client->ps.forcePowerDebounce[FP_SABERTHROW] < level.time ) {//not holding button and has been out at least 1 second, return to me if ( self->client->ps.saber[0].Active() ) {//still on diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index cd88d8d38a..b29c882da4 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -2275,6 +2275,8 @@ using playerState_t = PlayerStateBase; #define BUTTON_FORCE_FOCUS 256 // any key whatsoever +#define BUTTON_SABERTHROW 512 // set to 128 for base behaviour! + #define MOVE_RUN 120 // if forwardmove or rightmove are >= MOVE_RUN, // then BUTTON_WALKING should be set From 9579a8185223fedce2426875d24308492484e2f9 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Tue, 12 Aug 2014 03:13:14 +0100 Subject: [PATCH 389/445] Katarn Saberstyle: WIP version of gun/saber dual wielding Added WP_SaberFireGun. A bit hacky, but does work and includes muzzle flashes. --- code/cgame/cg_draw.cpp | 15 ++++++ code/cgame/cg_local.h | 1 + code/cgame/cg_players.cpp | 27 ++++++++++- code/game/bg_panimate.cpp | 13 +++++- code/game/bg_pmove.cpp | 33 ++++++++++++-- code/game/g_cmds.cpp | 7 ++- code/game/g_svcmds.cpp | 4 ++ code/game/wp_saber.cpp | 93 ++++++++++++++++++++++++++++++++++++-- code/game/wp_saberLoad.cpp | 1 + code/qcommon/q_shared.h | 1 + 10 files changed, 184 insertions(+), 11 deletions(-) diff --git a/code/cgame/cg_draw.cpp b/code/cgame/cg_draw.cpp index d0fba72ef0..9bca763d77 100644 --- a/code/cgame/cg_draw.cpp +++ b/code/cgame/cg_draw.cpp @@ -297,6 +297,11 @@ static void CG_DrawSaberStyle(const centity_t *cent,const int xPos,const int yPo } cgi_R_SetColor( otherHUDBits[index].color); + if (cg.saberAnimLevelPending == SS_KATARN) + { + cgi_R_SetColor( otherHUDBits[OHB_ARMORAMOUNT].color ); + index = OHB_SABERSTYLE_MEDIUM; + } CG_DrawPic( otherHUDBits[index].xPos, @@ -3057,6 +3062,16 @@ static void CG_ScanForCrosshairEntity( qboolean scanAll ) } AngleVectors( cg_entities[cg.snap->ps.viewEntity].lerpAngles, d_f, d_rt, d_up ); } + //temporary fix for third person aiming with gun/saber dual wield. shots should come from left hand anyway + else if (cg.snap->ps.weapon == WP_SABER && cg.snap->ps.viewEntity == 0 && cg_entities[0].gent->client->ps.saberAnimLevel == SS_KATARN) + { + extern void CalcMuzzlePoint( gentity_t *const ent, vec3_t forward, vec3_t right, vec3_t up, vec3_t muzzlePoint, float lead_in ); + AngleVectors( cg_entities[0].lerpAngles, d_f, d_rt, d_up ); + int oldWeapon = g_entities[0].s.weapon; + g_entities[0].s.weapon = WP_BRYAR_PISTOL;//Should be whichever weapon is being dual wielded, not always set to bryar! + CalcMuzzlePoint( &g_entities[0], d_f, d_rt, d_up, start , 0 ); + g_entities[0].s.weapon = oldWeapon; + } else { VectorCopy( g_entities[0].client->renderInfo.eyePoint, start ); diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index 47cb350dad..72eed6f1b7 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -158,6 +158,7 @@ struct centity_s qboolean currentValid; // true if cg.frame holds this entity int muzzleFlashTime; // move to playerEntity? + int muzzleFlashWeapon; qboolean altFire; // move to playerEntity? int previousEvent; diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index 40df13b24d..3ccf942f07 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -8144,6 +8144,10 @@ extern vmCvar_t cg_thirdPersonAlpha; && (cent->gent->client->ps.saber[saberNum].blade[bladeNum].length > 0 || cent->gent->client->ps.saberInFlight) ) { calcedMp = qtrue; + if (cent->gent->client->ps.saberAnimLevel == SS_KATARN) + { + calcedMp = qfalse; + } } } } @@ -8398,6 +8402,21 @@ extern vmCvar_t cg_thirdPersonAlpha; gi.G2API_GiveMeVectorFromMatrix( boltMatrix, NEGATIVE_Y, oldMD ); } } + else if ((cent->gent->client->ps.saberAnimLevel == SS_KATARN) + && cent->gent->s.weapon == WP_SABER + && cent->gent->weaponModel[1] + && cent->gent->weaponModel[1] != -1 + && ( cent->gent->ghoul2.size() > cent->gent->weaponModel[1] ) + && ( cent->gent->ghoul2[cent->gent->weaponModel[1]].mModelindex != -1))//one in each hand + { + mdxaBone_t boltMatrix; + // figure out where the actual model muzzle is + gi.G2API_GetBoltMatrix( cent->gent->ghoul2, cent->gent->weaponModel[1], 0, &boltMatrix, tempAngles, ent.origin, cg.time, cgs.model_draw, cent->currentState.modelScale ); + // work the matrix axis stuff into the original axis and origins used. + gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, cent->gent->client->renderInfo.muzzlePoint ); + gi.G2API_GiveMeVectorFromMatrix( boltMatrix, NEGATIVE_Y, cent->gent->client->renderInfo.muzzleDir ); + + } else if (( cent->gent->weaponModel[0] != -1) && ( cent->gent->ghoul2.size() > cent->gent->weaponModel[0] ) && ( cent->gent->ghoul2[cent->gent->weaponModel[0]].mModelindex != -1)) @@ -8450,7 +8469,13 @@ extern vmCvar_t cg_thirdPersonAlpha; const char *effect = NULL; cent->muzzleFlashTime = 0; - + + if (cent->muzzleFlashWeapon) + { + wData = &weaponData[cent->muzzleFlashWeapon]; + cent->muzzleFlashWeapon = 0; + } + // Try and get a default muzzle so we have one to fall back on if ( wData->mMuzzleEffect[0] ) { diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index d3601981ac..9ee0176c2f 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -603,6 +603,7 @@ int PM_PowerLevelForSaberAnim( playerState_t *ps, int saberNum ) case SS_STAFF: case SS_DUAL: case SS_MEDIUM: + case SS_KATARN: return FORCE_LEVEL_2; break; case SS_FAST: @@ -1979,6 +1980,15 @@ qboolean PM_SaberKataDone( int curmove = LS_NONE, int newmove = LS_NONE ) {//desann and tavion can link up as many attacks as they want return qfalse; } + + if ( pm->ps->saberAnimLevel == SS_KATARN ) + { + if (pm->ps->saberAttackChainCount > 0) + { + return qtrue; + } + return qfalse; + } //FIXME: instead of random, apply some sort of logical conditions to whether or // not you can chain? Like if you were completely missed, you can't chain as much, or...? // And/Or based on FP_SABER_OFFENSE level? So number of attacks you can chain @@ -3919,7 +3929,8 @@ saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int c else { if ( pm->ps->saberAnimLevel == SS_FAST || - pm->ps->saberAnimLevel == SS_TAVION ) + pm->ps->saberAnimLevel == SS_TAVION || + pm->ps->saberAnimLevel == SS_KATARN ) {//player is in fast attacks, so come right back down from the same spot newmove = PM_AttackMoveForQuad( saberMoveData[curmove].endQuad ); } diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 089d83beee..175f55693e 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -8253,6 +8253,7 @@ static void PM_Footsteps( void ) { case SS_FAST: case SS_TAVION: + case SS_KATARN: legsAnim = BOTH_SABERFAST_STANCE; break; case SS_STRONG: @@ -9104,6 +9105,9 @@ int PM_ReadyPoseForSaberAnimLevel( void ) case SS_STAFF: anim = BOTH_SABERSTAFF_STANCE; break; + case SS_KATARN: + anim = BOTH_STAND6; + break; case SS_FAST: case SS_TAVION: anim = BOTH_SABERFAST_STANCE; @@ -9379,7 +9383,14 @@ void PM_SetSaberMove(saberMoveName_t newMove) } else {//add the appropriate animLevel - anim += (pm->ps->saberAnimLevel-FORCE_LEVEL_1) * SABER_ANIM_GROUP_SIZE; + if (pm->ps->saberAnimLevel < SS_KATARN) + { + anim += (pm->ps->saberAnimLevel-FORCE_LEVEL_1) * SABER_ANIM_GROUP_SIZE; + } + else + { + anim += (pm->ps->saberAnimLevel-FORCE_LEVEL_1-1) * SABER_ANIM_GROUP_SIZE; + } } } else if ( (pm->ps->saberAnimLevel == SS_DUAL @@ -9418,7 +9429,14 @@ void PM_SetSaberMove(saberMoveName_t newMove) } else {//add the appropriate animLevel - anim += (pm->ps->saberAnimLevel-FORCE_LEVEL_1) * SABER_ANIM_GROUP_SIZE; + if (pm->ps->saberAnimLevel < SS_KATARN) + { + anim += (pm->ps->saberAnimLevel-FORCE_LEVEL_1) * SABER_ANIM_GROUP_SIZE; + } + else + { + anim += (pm->ps->saberAnimLevel-FORCE_LEVEL_1-1) * SABER_ANIM_GROUP_SIZE; + } } } /* @@ -9436,7 +9454,14 @@ void PM_SetSaberMove(saberMoveName_t newMove) } else {//increment the anim to the next level of saber anims - anim += (pm->ps->saberAnimLevel-FORCE_LEVEL_1) * SABER_ANIM_GROUP_SIZE; + if (pm->ps->saberAnimLevel < SS_KATARN) + { + anim += (pm->ps->saberAnimLevel-FORCE_LEVEL_1) * SABER_ANIM_GROUP_SIZE; + } + else + { + anim += (pm->ps->saberAnimLevel-FORCE_LEVEL_1-1) * SABER_ANIM_GROUP_SIZE; + } } } else if ( newMove == LS_KICK_F_AIR @@ -9599,6 +9624,7 @@ void PM_SetSaberMove(saberMoveName_t newMove) break; case SS_TAVION: case SS_FAST: + case SS_KATARN: WP_SaberSwingSound( pm->gent, 0, SWING_FAST ); break; } @@ -12469,6 +12495,7 @@ void PM_WeaponLightsaber(void) { case SS_FAST: case SS_TAVION: + case SS_KATARN: PM_SetSaberMove( LS_A1_SPECIAL ); break; case SS_MEDIUM: diff --git a/code/game/g_cmds.cpp b/code/game/g_cmds.cpp index 3395a3ce8d..4008ba08ee 100644 --- a/code/game/g_cmds.cpp +++ b/code/game/g_cmds.cpp @@ -1120,6 +1120,7 @@ void G_SetTauntAnim( gentity_t *ent, int taunt ) case SS_MEDIUM: case SS_STRONG: case SS_DESANN: + case SS_KATARN: anim = BOTH_ENGAGETAUNT; break; case SS_DUAL: @@ -1214,6 +1215,7 @@ void G_SetTauntAnim( gentity_t *ent, int taunt ) { case SS_FAST: case SS_TAVION: + case SS_KATARN: anim = BOTH_SHOWOFF_FAST; break; case SS_MEDIUM: @@ -1251,6 +1253,7 @@ void G_SetTauntAnim( gentity_t *ent, int taunt ) { case SS_FAST: case SS_TAVION: + case SS_KATARN: anim = BOTH_VICTORY_FAST; break; case SS_MEDIUM: @@ -1490,7 +1493,7 @@ void ClientCommand( int clientNum ) { if ( gi.argc() < 2 ) { gi.SendServerCommand( ent-g_entities, va("print \"usage: addsaberstyle \n\"")); - gi.SendServerCommand( ent-g_entities, va("print \"Valid styles: SS_FAST, SS_MEDIUM, SS_STRONG, SS_DESANN, SS_TAVION, SS_DUAL and SS_STAFF\n\"")); + gi.SendServerCommand( ent-g_entities, va("print \"Valid styles: SS_FAST, SS_MEDIUM, SS_STRONG, SS_DESANN, SS_TAVION, SS_KATARN, SS_DUAL and SS_STAFF\n\"")); return; } @@ -1510,7 +1513,7 @@ void ClientCommand( int clientNum ) { if ( gi.argc() < 2 ) { gi.SendServerCommand( ent-g_entities, va("print \"usage: setsaberstyle \n\"")); - gi.SendServerCommand( ent-g_entities, va("print \"Valid styles: SS_FAST, SS_MEDIUM, SS_STRONG, SS_DESANN, SS_TAVION, SS_DUAL and SS_STAFF\n\"")); + gi.SendServerCommand( ent-g_entities, va("print \"Valid styles: SS_FAST, SS_MEDIUM, SS_STRONG, SS_DESANN, SS_TAVION, SS_KATARN, SS_DUAL and SS_STAFF\n\"")); return; } diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index a27ef141ca..f838d79df9 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -601,6 +601,10 @@ void Svcmd_SaberAttackCycle_f( void ) gi.Printf( S_COLOR_MAGENTA "Lightsaber Combat Style: Tavion\n" ); //LIGHTSABERCOMBATSTYLE_TAVION break; + case SS_KATARN: + gi.Printf( S_COLOR_MAGENTA"Lightsaber Combat Style: Katarn\n" ); + //LIGHTSABERCOMBATSTYLE_TAVION + break; case SS_DUAL: gi.Printf( S_COLOR_MAGENTA "Lightsaber Combat Style: Dual\n" ); //LIGHTSABERCOMBATSTYLE_TAVION diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index f8074617be..915b39c4a0 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -350,6 +350,8 @@ stringID_table_t SaberStyleTable[] = { "desann",SS_DESANN }, ENUM2STRING(SS_TAVION), { "tavion",SS_TAVION }, + ENUM2STRING(SS_KATARN), + { "katarn",SS_KATARN }, ENUM2STRING(SS_DUAL), { "dual",SS_DUAL }, ENUM2STRING(SS_STAFF), @@ -422,6 +424,7 @@ void G_CreateG2HolsteredWeaponModel( gentity_t *ent, const char *psWeaponModel, NULL, 0, 0); } + // set up a bolt on the end so we can get where the sabre muzzle is - we can assume this is always bolt 0 gi.G2API_AddBolt(&ent->ghoul2[ent->holsterModel[weaponNum]], "*flash"); //gi.G2API_SetLodBias( &ent->ghoul2[ent->weaponModel[weaponNum]], 0 ); } @@ -3142,8 +3145,8 @@ int G_SaberLockAnim( int attackerSaberStyle, int defenderSaberStyle, int topOrSi int baseAnim = -1; if ( lockOrBreakOrSuperBreak == SABERLOCK_LOCK ) {//special case: if we're using the same style and locking - if ( attackerSaberStyle == defenderSaberStyle - || (attackerSaberStyle>=SS_FAST&&attackerSaberStyle<=SS_TAVION&&defenderSaberStyle>=SS_FAST&&defenderSaberStyle<=SS_TAVION) ) + if ( attackerSaberStyle == defenderSaberStyle + || (attackerSaberStyle>=SS_FAST&&attackerSaberStyle<=SS_KATARN&&defenderSaberStyle>=SS_FAST&&defenderSaberStyle<=SS_KATARN) ) {//using same style if ( winOrLose == SABERLOCK_LOSE ) {//you want the defender's stance... @@ -3390,9 +3393,9 @@ qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLo } //FIXME: attStart% and idealDist will change per saber lock anim pairing... do we need a big table like in bg_panimate.cpp? if ( attacker->client->ps.saberAnimLevel >= SS_FAST - && attacker->client->ps.saberAnimLevel <= SS_TAVION + && attacker->client->ps.saberAnimLevel <= SS_KATARN && defender->client->ps.saberAnimLevel >= SS_FAST - && defender->client->ps.saberAnimLevel <= SS_TAVION ) + && defender->client->ps.saberAnimLevel <= SS_KATARN ) {//2 single sabers? Just do it the old way... switch ( lockMode ) { @@ -7423,6 +7426,85 @@ void WP_SaberThrow( gentity_t *self, usercmd_t *ucmd ) } } +extern void G_CreateG2AttachedWeaponModel( gentity_t *ent, const char *weaponModel, int boltNum, int weaponNum ); +void WP_SaberFireGun( gentity_t *self, usercmd_t *ucmd, int whichGun ) +{ + int addTime, oldWeapon; + qboolean chargedShot = qfalse; + + if ( self->health <= 0 ) + { + return; + } + + if ( !self->s.number && (cg.zoomMode || in_camera) ) + {//can't shoot when zoomed in or in cinematic + return; + } + + if ( self->client->ps.leanofs ) + { + return; + } + + if ( self->client->ps.weaponTime > 0 ) + { + return; + } + + if ( self->client->ps.saberAnimLevel != SS_KATARN ) + { + return; + } + + if ( self->s.weapon != WP_SABER ) + { + return; + } + + if ( !(self->client->ps.stats[STAT_WEAPONS] & (1<buttons & BUTTON_ALT_ATTACK) ) + { + return; + } + + if ( !self->weaponModel[1] || (self->weaponModel[1] == -1) ) + { + G_CreateG2AttachedWeaponModel( self, weaponData[whichGun].weaponMdl, self->handLBolt, 1 ); + } + + addTime = weaponData[whichGun].fireTime; + self->client->ps.weaponTime += addTime; + self->client->ps.lastShotTime = level.time; +//TODO:proper addTime scaling + + if ( whichGun == WP_BRYAR_PISTOL && self->client->ps.saberLockTime > level.time ) + { + //shoot your way out of saberlocks! + G_StartMatrixEffect( self ); + chargedShot = qtrue; + self->client->ps.weaponChargeTime = level.time - 10*BRYAR_CHARGE_UNIT; + } + + self->client->ps.saberBlocked = BLOCKED_NONE; + self->client->ps.saberMove = self->client->ps.saberBounceMove = LS_READY; + NPC_SetAnim( self, SETANIM_TORSO, BOTH_FORCELIGHTNING, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART ); + + oldWeapon = self->s.weapon; + self->s.weapon = whichGun; + FireWeapon(self, chargedShot); + + cg_entities[self->s.number].muzzleFlashTime = level.time; + cg_entities[self->s.number].muzzleFlashWeapon = whichGun; + + self->s.weapon = oldWeapon; +} + + //SABER BLOCKING============================================================================ //SABER BLOCKING============================================================================ @@ -8063,6 +8145,9 @@ void WP_SaberUpdate( gentity_t *self, usercmd_t *ucmd ) return; } + // Check if we want to fire the pistol + WP_SaberFireGun(self, ucmd, WP_BRYAR_PISTOL); + // Check if we are throwing it, launch it if needed, update position if needed. WP_SaberThrow(self, ucmd); diff --git a/code/game/wp_saberLoad.cpp b/code/game/wp_saberLoad.cpp index ca24e0b1ec..6f13ca48d8 100644 --- a/code/game/wp_saberLoad.cpp +++ b/code/game/wp_saberLoad.cpp @@ -163,6 +163,7 @@ saber_styles_t TranslateSaberStyle( const char *name ) { if ( !Q_stricmp( name, "strong" ) ) return SS_STRONG; if ( !Q_stricmp( name, "desann" ) ) return SS_DESANN; if ( !Q_stricmp( name, "tavion" ) ) return SS_TAVION; + if ( !Q_stricmp( name, "katarn" ) ) return SS_KATARN; if ( !Q_stricmp( name, "dual" ) ) return SS_DUAL; if ( !Q_stricmp( name, "staff" ) ) return SS_STAFF; diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index b29c882da4..001eedba98 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -932,6 +932,7 @@ typedef enum SS_STRONG, SS_DESANN, SS_TAVION, + SS_KATARN, SS_DUAL, SS_STAFF, SS_NUM_SABER_STYLES From 921cd84d9b73ed3dad9abddf162ff87785a608ba Mon Sep 17 00:00:00 2001 From: redsaurus Date: Thu, 18 Dec 2014 21:35:16 +0000 Subject: [PATCH 390/445] Ignition Flare: Option to draw flare when turning saber on --- code/cgame/cg_main.cpp | 3 +++ code/cgame/cg_players.cpp | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 83c33a7535..a55dc8cc4a 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -345,6 +345,8 @@ vmCvar_t cg_SFXSabers; vmCvar_t cg_SFXSabersGlowSize; vmCvar_t cg_SFXSabersCoreSize; +vmCvar_t cg_ignitionFlare; + typedef struct { vmCvar_t *vmCvar; const char *cvarName; @@ -468,6 +470,7 @@ static cvarTable_t cvarTable[] = { { &cg_SFXSabersGlowSize, "cg_SFXSabersGlowSize", "1.0", CVAR_ARCHIVE }, { &cg_SFXSabersCoreSize, "cg_SFXSabersCoreSize", "1.0", CVAR_ARCHIVE }, + { &cg_ignitionFlare, "cg_ignitionFlare", "0", CVAR_ARCHIVE }, }; diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index 3ccf942f07..a6d6584f4c 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -46,6 +46,8 @@ extern vmCvar_t cg_SFXSabers; extern vmCvar_t cg_SFXSabersGlowSize; extern vmCvar_t cg_SFXSabersCoreSize; +extern vmCvar_t cg_ignitionFlare; + /* player entities generate a great deal of information from implicit ques @@ -8080,6 +8082,26 @@ extern vmCvar_t cg_thirdPersonAlpha; cg_saberOnSoundTime[cent->currentState.number] = cg.time;//so we don't play multiple on sounds at one time } } + if (( cg_ignitionFlare.integer == 1 || + (cg_ignitionFlare.integer > 0 && cg_SFXSabers.integer == 0)) && !(cent->gent->client->ps.saber[saberNum].type == SABER_SITH_SWORD || cent->gent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_BLADE)) + { + vec3_t org_; + vec3_t RGB = {1.0f,0.75f,0.0f}; + + CG_RGBForSaberColor( cent->gent->client->ps.saber[saberNum].blade[bladeNum].color, RGB ); + char *tagName = va( "*blade%d", bladeNum+1 ); + int bolt = gi.G2API_AddBolt( ¢->gent->ghoul2[cent->gent->weaponModel[saberNum]], tagName ); + mdxaBone_t boltMatrix; + gi.G2API_GetBoltMatrix(cent->gent->ghoul2, cent->gent->weaponModel[saberNum], bolt, &boltMatrix, tempAngles, ent.origin, cg.time, cgs.model_draw, cent->currentState.modelScale); + + // work the matrix axis stuff into the original axis and origins used. + gi.G2API_GiveMeVectorFromMatrix(boltMatrix, ORIGIN, org_); + + qhandle_t shader = cgi_R_RegisterShader( "gfx/effects/flare1" ); + + FX_AddSprite( org_, cent->gent->client->ps.velocity, NULL, 40.0f, 0.0f, 1.0f, 0.7f, RGB, RGB, random() * 360, 0.0f, 100.0f, shader, FX_USE_ALPHA ); + } + } if ( cg.frametime > 0 ) { From bae73e85a4a3c239ff4e11a7dae679e94537cae7 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Wed, 24 Dec 2014 21:48:45 +0000 Subject: [PATCH 391/445] Saber crystals: Black lightsaber blades and unstable blades will use some of the JKG assets. todo: allow for unstable blades to also be black lightsaber blades, and fix the tip poking out of the top when moving SFX sabers --- code/cgame/cg_consolecmds.cpp | 1 + code/cgame/cg_main.cpp | 4 ++ code/cgame/cg_media.h | 11 ++++ code/cgame/cg_players.cpp | 104 ++++++++++++++++++++++++++++++---- code/cgame/cg_weapons.cpp | 7 +++ code/game/g_svcmds.cpp | 29 ++++++++++ code/qcommon/q_shared.h | 9 +++ 7 files changed, 154 insertions(+), 11 deletions(-) diff --git a/code/cgame/cg_consolecmds.cpp b/code/cgame/cg_consolecmds.cpp index 3e4982cbba..b936b8a5e5 100644 --- a/code/cgame/cg_consolecmds.cpp +++ b/code/cgame/cg_consolecmds.cpp @@ -312,6 +312,7 @@ static const char *gcmds[] = { "saber", "saberAttackCycle", "saberColor", + "saberCrystal", "saberblade", "secrets", "setForceAll", diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index a55dc8cc4a..8b77ad9903 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -1402,6 +1402,10 @@ static void CG_RegisterGraphics( void ) { cgs.media.SaberBladeShader = cgi_R_RegisterShader( "SFX_Sabers/saber_blade" ); cgs.media.SaberEndShader = cgi_R_RegisterShader( "SFX_Sabers/saber_end" ); + cgs.media.blackSaberTrailShader = cgi_R_RegisterShader( "SFX_Sabers/black_trail" ); + cgs.media.blackSaberBladeShader = cgi_R_RegisterShader( "SFX_Sabers/black_blade" ); + cgs.media.blackSaberEndShader = cgi_R_RegisterShader( "SFX_Sabers/black_end" ); + cg.loadLCARSStage = 5; CG_LoadingString( "game media models" ); diff --git a/code/cgame/cg_media.h b/code/cgame/cg_media.h index afedec1fb0..21771b0efa 100644 --- a/code/cgame/cg_media.h +++ b/code/cgame/cg_media.h @@ -176,6 +176,13 @@ typedef struct { qhandle_t purpleSaberCoreShader; qhandle_t rgbSaberGlowShader; qhandle_t rgbSaberCoreShader; + + qhandle_t blackSaberBlurShader; + qhandle_t blackSaberGlowShader; + qhandle_t blackSaberCoreShader; + + qhandle_t unstableBlurShader; + qhandle_t rgbUnstableCoreShader; qhandle_t explosionModel; qhandle_t surfaceExplosionShader; @@ -264,6 +271,10 @@ typedef struct { qhandle_t SaberTrailShader; qhandle_t SaberBladeShader; qhandle_t SaberEndShader; + + qhandle_t blackSaberTrailShader; + qhandle_t blackSaberBladeShader; + qhandle_t blackSaberEndShader; // sounds sfxHandle_t disintegrateSound; diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index a6d6584f4c..0315ea806b 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -5887,7 +5887,7 @@ static void CG_DoSaberLight( saberInfo_t *saber ) } } -void CG_DoSFXSaber( vec3_t blade_muz, vec3_t blade_tip, vec3_t trail_tip, vec3_t trail_muz, float lengthMax, float radius, saber_colors_t color, int rfx, qboolean doLight ) +void CG_DoSFXSaber( vec3_t blade_muz, vec3_t blade_tip, vec3_t trail_tip, vec3_t trail_muz, float lengthMax, float radius, saber_colors_t color, int rfx, qboolean doLight, saber_crystals_t crystals ) { vec3_t dif, mid, blade_dir, end_dir, trail_dir, base_dir; float radiusmult, effectradius, coreradius, effectalpha, AngleScale; @@ -5942,14 +5942,25 @@ void CG_DoSFXSaber( vec3_t blade_muz, vec3_t blade_tip, vec3_t trail_tip, vec3_t break; } + if ( crystals & SABER_CRYSTAL_BLACK ) + { + glow = cgs.media.blackSaberGlowShader; + } + VectorMA( blade_muz, blade_len * 0.5f, blade_dir, mid ); if (doLight) { - vec3_t rgb={1,1,1}; - CG_RGBForSaberColor( color, rgb ); - VectorScale( rgb, 0.66f, rgb ); - cgi_R_AddLightToScene( mid, (blade_len*2.0f) + (random()*10.0f), rgb[0], rgb[1], rgb[2] ); + if ( crystals & SABER_CRYSTAL_BLACK ) + { + } + else + { + vec3_t rgb={1,1,1}; + CG_RGBForSaberColor( color, rgb ); + VectorScale( rgb, 0.66f, rgb ); + cgi_R_AddLightToScene( mid, (blade_len*2.0f) + (random()*10.0f), rgb[0], rgb[1], rgb[2] ); + } } //Distance Scale @@ -6032,6 +6043,10 @@ void CG_DoSFXSaber( vec3_t blade_muz, vec3_t blade_tip, vec3_t trail_tip, vec3_t effectradius = ((radius * 1.6 * v1) + Q_flrand(-1.0f, 1.0f) * 0.1f)*radiusmult*cg_SFXSabersGlowSize.value; coreradius = ((radius * 0.4 * v2) + Q_flrand(-1.0f, 1.0f) * 0.1f)*radiusmult*cg_SFXSabersCoreSize.value; + if ( crystals & SABER_CRYSTAL_UNSTABLE ) + { + coreradius *= 0.9; + } { saber.renderfx = rfx; @@ -6063,6 +6078,15 @@ void CG_DoSFXSaber( vec3_t blade_muz, vec3_t blade_tip, vec3_t trail_tip, vec3_t VectorMA( blade_muz, -1, blade_dir, saber.oldorigin ); saber.customShader = cgs.media.SaberBladeShader; + if ( crystals & SABER_CRYSTAL_BLACK ) + { + saber.customShader = cgs.media.blackSaberBladeShader; + } + else if ( crystals & SABER_CRYSTAL_UNSTABLE ) + { + saber.customShader = cgs.media.rgbUnstableCoreShader; + } + saber.reType = RT_LINE; saber.radius = coreradius; @@ -6103,6 +6127,14 @@ void CG_DoSFXSaber( vec3_t blade_muz, vec3_t blade_tip, vec3_t trail_tip, vec3_t VectorMA( trail_muz, -1, trail_dir, saber.oldorigin ); saber.customShader = cgs.media.SaberBladeShader; + if ( crystals & SABER_CRYSTAL_BLACK ) + { + saber.customShader = cgs.media.blackSaberBladeShader; + } + else if ( crystals & SABER_CRYSTAL_UNSTABLE ) + { + saber.customShader = cgs.media.rgbUnstableCoreShader; + } saber.reType = RT_LINE; saber.radius = coreradius; @@ -6147,6 +6179,14 @@ void CG_DoSFXSaber( vec3_t blade_muz, vec3_t blade_tip, vec3_t trail_tip, vec3_t VectorMA( blade_muz, -0.1, base_dir, saber.oldorigin ); saber.customShader = cgs.media.SaberBladeShader; + if ( crystals & SABER_CRYSTAL_BLACK ) + { + saber.customShader = cgs.media.blackSaberBladeShader; + } + else if ( crystals & SABER_CRYSTAL_UNSTABLE ) + { + saber.customShader = cgs.media.rgbUnstableCoreShader; + } saber.reType = RT_LINE; saber.radius = coreradius; @@ -6224,6 +6264,11 @@ void CG_DoSFXSaber( vec3_t blade_muz, vec3_t blade_tip, vec3_t trail_tip, vec3_t VectorMA( blade_tip, -0.1, end_dir, saber.oldorigin ); saber.customShader = cgs.media.SaberEndShader; + if ( crystals & SABER_CRYSTAL_BLACK ) + { + saber.customShader = cgs.media.blackSaberEndShader; + } + saber.reType = RT_LINE; if(end_len > 9) @@ -6256,7 +6301,7 @@ void CG_DoSFXSaber( vec3_t blade_muz, vec3_t blade_tip, vec3_t trail_tip, vec3_t } } -static void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float radius, saber_colors_t color, int rfx, qboolean doLight ) +static void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float radius, saber_colors_t color, int rfx, qboolean doLight, saber_crystals_t crystals ) { vec3_t mid; qhandle_t blade = 0, glow = 0; @@ -6303,13 +6348,30 @@ static void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax blade = cgs.media.rgbSaberCoreShader; break; } + + if ( crystals & SABER_CRYSTAL_BLACK ) + { + glow = cgs.media.blackSaberGlowShader; + blade = cgs.media.blackSaberCoreShader; + } + else if ( crystals & SABER_CRYSTAL_UNSTABLE ) + { + glow = cgs.media.rgbSaberGlowShader; + blade = cgs.media.rgbUnstableCoreShader; + } // 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! - vec3_t rgb={1,1,1}; - CG_RGBForSaberColor( color, rgb ); - cgi_R_AddLightToScene( mid, (length*1.4f) + (Q_flrand(0.0f, 1.0f)*3.0f), rgb[0], rgb[1], rgb[2] ); + if ( crystals & SABER_CRYSTAL_BLACK ) + { + } + else + { + vec3_t rgb={1,1,1}; + CG_RGBForSaberColor( color, rgb ); + cgi_R_AddLightToScene( mid, (length*1.4f) + (Q_flrand(0.0f, 1.0f)*3.0f), rgb[0], rgb[1], rgb[2] ); + } } memset( &saber, 0, sizeof( refEntity_t )); @@ -7179,6 +7241,16 @@ if (cg_SFXSabers.integer == 0) duration = saberTrail->duration/2.0f; // stay around twice as long VectorSet( rgb1, 32.0f, 32.0f, 32.0f ); // make the sith sword trail pretty faint } + else if ( cent->gent->client->ps.saber[saberNum].crystals & SABER_CRYSTAL_BLACK ) + { + fx->mShader = cgs.media.blackSaberBlurShader; + duration = saberTrail->duration/5.0f; + } + else if ( cent->gent->client->ps.saber[saberNum].crystals & SABER_CRYSTAL_UNSTABLE ) + { + fx->mShader = cgs.media.unstableBlurShader; + duration = saberTrail->duration/5.0f; + } else { fx->mShader = cgs.media.saberBlurShader; @@ -7264,7 +7336,8 @@ if (cg_SFXSabers.integer == 0) client->ps.saber[saberNum].blade[bladeNum].lengthMax, client->ps.saber[saberNum].blade[bladeNum].radius, client->ps.saber[saberNum].blade[bladeNum].color, - renderfx, (qboolean)!noDlight ); + renderfx, (qboolean)!noDlight, + client->ps.saber[saberNum].crystals ); } else { @@ -7378,7 +7451,7 @@ else if ( !(cent->gent->client->ps.saber[saberNum].type == SABER_SITH_SWORD || client->ps.saber[saberNum].saberFlags2&SFL2_NO_BLADE) ) { - CG_DoSFXSaber( saberTrail->base, saberTrail->tip, saberTrail->dualtip, saberTrail->dualbase, (client->ps.saber[saberNum].blade[bladeNum].lengthMax), (client->ps.saber[saberNum].blade[bladeNum].radius), client->ps.saber[saberNum].blade[bladeNum].color, renderfx, (qboolean)!noDlight ); + CG_DoSFXSaber( saberTrail->base, saberTrail->tip, saberTrail->dualtip, saberTrail->dualbase, (client->ps.saber[saberNum].blade[bladeNum].lengthMax), (client->ps.saber[saberNum].blade[bladeNum].radius), client->ps.saber[saberNum].blade[bladeNum].color, renderfx, (qboolean)!noDlight, client->ps.saber[saberNum].crystals ); } if ( cg.time > saberTrail->inAction ) @@ -7390,6 +7463,10 @@ else fx->mShader = cgs.media.swordTrailShader; VectorSet( rgb1, 32.0f, 32.0f, 32.0f ); // make the sith sword trail pretty faint } + else if ( cent->gent->client->ps.saber[saberNum].crystals & SABER_CRYSTAL_BLACK ) + { + fx->mShader = cgs.media.blackSaberTrailShader; + } else { fx->mShader = cgs.media.SaberTrailShader; @@ -8099,6 +8176,11 @@ extern vmCvar_t cg_thirdPersonAlpha; qhandle_t shader = cgi_R_RegisterShader( "gfx/effects/flare1" ); + if ( cent->gent->client->ps.saber[saberNum].crystals & SABER_CRYSTAL_BLACK ) + { + shader = cgi_R_RegisterShader( "gfx/effects/sabers/flare1black" ); + } + FX_AddSprite( org_, cent->gent->client->ps.velocity, NULL, 40.0f, 0.0f, 1.0f, 0.7f, RGB, RGB, random() * 360, 0.0f, 100.0f, shader, FX_USE_ALPHA ); } diff --git a/code/cgame/cg_weapons.cpp b/code/cgame/cg_weapons.cpp index a89b96d1bc..46c95883b5 100644 --- a/code/cgame/cg_weapons.cpp +++ b/code/cgame/cg_weapons.cpp @@ -363,6 +363,13 @@ void CG_RegisterWeapon( int weaponNum ) { cgs.media.purpleSaberCoreShader = cgi_R_RegisterShader( "gfx/effects/sabers/purple_line" ); cgs.media.rgbSaberGlowShader = cgi_R_RegisterShader( "gfx/effects/sabers/rgb_glow" ); cgs.media.rgbSaberCoreShader = cgi_R_RegisterShader( "gfx/effects/sabers/rgb_line" ); + + cgs.media.blackSaberGlowShader = cgi_R_RegisterShader( "gfx/effects/sabers/black_glow" ); + cgs.media.blackSaberCoreShader = cgi_R_RegisterShader( "gfx/effects/sabers/black_line" ); + cgs.media.blackSaberBlurShader = cgi_R_RegisterShader("gfx/effects/sabers/blackSaberBlur"); + + cgs.media.rgbUnstableCoreShader = cgi_R_RegisterShader("gfx/effects/sabers/jkg/blade_unstable"); + cgs.media.unstableBlurShader = cgi_R_RegisterShader("gfx/effects/sabers/jkg/trail_unstable"); cgs.media.forceCoronaShader = cgi_R_RegisterShaderNoMip( "gfx/hud/force_swirl" ); diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index f838d79df9..d78b352c1e 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -302,6 +302,33 @@ static void Svcmd_SaberColor_f() } } +static void Svcmd_SaberCrystal_f() +{ + int saberNum = atoi(gi.argv(1)); + + saberNum--; + + gentity_t *self = G_GetSelfForPlayerCmd(); + + if ( saberNum == 0 || saberNum == 1 ) + { + if (!Q_stricmp(gi.argv(2), "black")) + { + self->client->ps.saber[saberNum].crystals = (saber_crystals_t)(self->client->ps.saber[saberNum].crystals^SABER_CRYSTAL_BLACK); + return; + } + else if (!Q_stricmp(gi.argv(2), "unstable")) + { + self->client->ps.saber[saberNum].crystals = (saber_crystals_t)(self->client->ps.saber[saberNum].crystals^SABER_CRYSTAL_UNSTABLE); + return; + } + } + + gi.Printf( "Usage: saberCrystal \n" ); + gi.Printf( "valid saberNums: 1 or 2\n" ); + gi.Printf( "valid crystals: black and unstable\n" ); +} + struct SetForceCmd { const char *desc; const char *cmdname; @@ -1073,6 +1100,8 @@ static svcmd_t svcmds[] = { { "newPlayerTint", Svcmd_NewPlayerTint_f, CMD_NONE }, { "customSaber", Svcmd_CustomSaber_f, CMD_NONE }, + + { "saberCrystal", Svcmd_SaberCrystal_f, CMD_CHEAT }, //{ "say", Svcmd_Say_f, qtrue }, //{ "toggleallowvote", Svcmd_ToggleAllowVote_f, qfalse }, diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 001eedba98..63c6b9b412 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -938,6 +938,13 @@ typedef enum SS_NUM_SABER_STYLES } saber_styles_t; +typedef enum +{ + SABER_CRYSTAL_DEFAULT = 0, + SABER_CRYSTAL_BLACK = (1 << 0), + SABER_CRYSTAL_UNSTABLE = (1 << 1) +} saber_crystals_t; + typedef enum { HOLSTER_INVALID = -1, @@ -1054,6 +1061,8 @@ typedef struct int flourishAnim; //-1 - anim to use when hit "flourish" int gloatAnim; //-1 - anim to use when hit "gloat" + saber_crystals_t crystals; + holster_locations_t holsterPlace; //***NOTE: you can only have a maximum of 2 "styles" of blades, so this next value, "bladeStyle2Start" is the number of the first blade to use these value on... all blades before this use the normal values above, all blades at and after this number use the secondary values below*** From c22b49514c68ebf0d8a4e8cb14138e6c42845694 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sat, 27 Dec 2014 11:38:47 +0000 Subject: [PATCH 392/445] Eweb: Detachable eweb! --- code/cgame/cg_event.cpp | 9 ++++++-- code/game/bg_pmove.cpp | 49 ++++++++++++++++++++++++++++++++++++++++ code/game/g_emplaced.cpp | 29 +++++++++++++++++++++--- code/game/g_items.cpp | 9 ++++++++ code/game/g_svcmds.cpp | 2 +- code/game/wp_saber.cpp | 12 +++++++++- 6 files changed, 103 insertions(+), 7 deletions(-) diff --git a/code/cgame/cg_event.cpp b/code/cgame/cg_event.cpp index 635dfe14d9..6b2b27e580 100644 --- a/code/cgame/cg_event.cpp +++ b/code/cgame/cg_event.cpp @@ -115,7 +115,7 @@ void CG_ItemPickup( int itemNum, qboolean bHadItem ) { const int nCurWpn = cg.predicted_player_state.weapon; const int nNewWpn = bg_itemlist[itemNum].giTag; - if ( nCurWpn == WP_SABER || bHadItem) + if ( (nCurWpn == WP_SABER && nNewWpn != WP_EMPLACED_GUN) || bHadItem) {//never switch away from the saber! return; } @@ -129,7 +129,12 @@ void CG_ItemPickup( int itemNum, qboolean bHadItem ) { // NOTE: automatically switching to any weapon you pick up is stupid and annoying and we won't do it. // - if ( nNewWpn == WP_SABER ) + if ( nNewWpn == WP_EMPLACED_GUN ) + { + SetWeaponSelectTime(); + cg.weaponSelect = nNewWpn; + } + else if ( nNewWpn == WP_SABER ) {//always switch to saber SetWeaponSelectTime(); cg.weaponSelect = nNewWpn; diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 175f55693e..be5492ba52 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -8987,6 +8987,21 @@ static void PM_FinishWeaponChange( void ) { { trueSwitch = qfalse; } + + if ( trueSwitch && pm->ps->weapon == WP_EMPLACED_GUN && !(pm->ps->eFlags & EF_LOCKED_TO_WEAPON) ) + { + gitem_t *item; + item = FindItemForWeapon( WP_EMPLACED_GUN ); + gentity_t *dropped = Drop_Item(pm->gent, item, 0, qfalse); + dropped->count = pm->ps->ammo[AMMO_EMPLACED]; + gi.G2API_InitGhoul2Model( dropped->ghoul2, "models/map_objects/hoth/eweb_model.glm", G_ModelIndex( "models/map_objects/hoth/eweb_model.glm" ), NULL_HANDLE, NULL_HANDLE, 0, 0); + gi.G2API_SetSurfaceOnOff(&dropped->ghoul2[0], "eweb_cannon", 0x00000002); + dropped->s.radius = 10; + dropped->delay = level.time + 1000; + pm->ps->ammo[AMMO_EMPLACED] = 0; + pm->ps->stats[STAT_WEAPONS] &= ~(1 << WP_EMPLACED_GUN); + } + //int oldWeap = pm->ps->weapon; pm->ps->weapon = weapon; pm->ps->weaponstate = WEAPON_RAISING; @@ -8995,6 +9010,40 @@ static void PM_FinishWeaponChange( void ) { if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ATST ) {//do nothing } + else if ( weapon == WP_EMPLACED_GUN && !(pm->ps->eFlags & EF_LOCKED_TO_WEAPON) ) + { + if ( pm->gent ) + { + // remove the sabre if we had it. + G_RemoveWeaponModels( pm->gent ); + //holster sabers + WP_SaberAddHolsteredG2SaberModels( pm->gent ); + G_CreateG2AttachedWeaponModel( pm->gent, "models/map_objects/hoth/eweb_model.glm", pm->gent->handRBolt, 0 ); + } + + if ( !(pm->ps->eFlags&EF_HELD_BY_WAMPA) ) + { + if ( pm->ps->weapon != WP_THERMAL + && pm->ps->weapon != WP_TRIP_MINE + && pm->ps->weapon != WP_DET_PACK + && !G_IsRidingVehicle(pm->gent)) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_RAISEWEAP1,SETANIM_FLAG_HOLD); + } + } + + if ( pm->ps->clientNum < MAX_CLIENTS + && cg_gunAutoFirst.integer + && !PM_RidingVehicle() + // && oldWeap == WP_SABER + && weapon != WP_NONE ) + { + gi.cvar_set( "cg_thirdperson", "0" ); + } + pm->ps->saberMove = LS_NONE; + pm->ps->saberBlocking = BLK_NO; + pm->ps->saberBlocked = BLOCKED_NONE; + } else if ( weapon == WP_SABER ) {//turn on the lightsaber //FIXME: somehow sometimes I still end up with 2 weapons in hand... usually if I diff --git a/code/game/g_emplaced.cpp b/code/game/g_emplaced.cpp index 49e1d4b39e..43d7fb05b0 100644 --- a/code/game/g_emplaced.cpp +++ b/code/game/g_emplaced.cpp @@ -375,7 +375,7 @@ extern void ChangeWeapon( gentity_t *ent, int newWeapon ); { // we don't want for it to draw the weapon select stuff cg.weaponSelect = WP_EMPLACED_GUN; - CG_CenterPrint( "@SP_INGAME_EXIT_VIEW", SCREEN_HEIGHT * 0.95 ); + CG_CenterPrint( "@SPMOD_EWEB_EXIT", SCREEN_HEIGHT * 0.95 ); } VectorCopy( activator->currentOrigin, self->pos4 );//keep this around so we know when to make them play the strafe anim @@ -890,7 +890,7 @@ void G_UpdateEmplacedWeaponData( gentity_t *ent ) } } -void ExitEmplacedWeapon( gentity_t *ent ) +void ExitEmplacedWeapon( gentity_t *ent, qboolean detach = qfalse ) { // requesting to unlock from the weapon // We'll leave the gun pointed in the direction it was last facing, though we'll cut out the pitch @@ -1021,6 +1021,12 @@ extern void CG_ChangeWeapon( int num ); { // when we lock or unlock from the the gun, we get our old weapon back ent->client->ps.weapon = ent->owner->s.weapon; + //player can pull the eweb gun away + if ( !ent->s.number && detach ) + { + ent->client->ps.weapon = WP_EMPLACED_GUN; + ent->client->ps.ammo[AMMO_EMPLACED] = 100; + } if ( ent->NPC ) {//BTW, if a saber-using NPC ever gets off of an emplaced gun/eweb, this will not work, look at NPC_ChangeWeapon for the proper way @@ -1030,7 +1036,12 @@ extern void CG_ChangeWeapon( int num ); { G_RemoveWeaponModels( ent ); CG_ChangeWeapon( ent->client->ps.weapon ); - if ( ent->client->ps.weapon == WP_SABER ) + if ( ent->client->ps.weapon == WP_EMPLACED_GUN && detach ) + { + G_CreateG2AttachedWeaponModel( ent, "models/map_objects/hoth/eweb_model.glm", ent->handRBolt, 0 ); + WP_SaberAddHolsteredG2SaberModels( ent ); + } + else if ( ent->client->ps.weapon == WP_SABER ) { WP_SaberAddG2SaberModels( ent ); G_RemoveHolsterModels( ent ); @@ -1081,6 +1092,10 @@ extern void CG_ChangeWeapon( int num ); if ( !ent->NPC ) { // by keeping the owner, a dead npc can be pushed out of the chair without colliding with it + if ( ent->health > 0 && detach ) + { + GEntity_DieFunc(ent->owner, ent->owner, ent->owner, 100, MOD_UNKNOWN); + } ent->owner = NULL; } } @@ -1108,6 +1123,14 @@ void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ) (*ucmd)->upmove = 0; } } + //detach eweb! + else if (( (*ucmd)->buttons & BUTTON_USE_FORCE ) && ent->owner && ent->owner->delay + 500 < level.time && ent->owner->e_UseFunc == useF_eweb_use) + { + ent->owner->s.loopSound = 0; + G_Sound( ent, G_SoundIndex( "sound/weapons/eweb/eweb_dismount.mp3" )); + ExitEmplacedWeapon( ent, qtrue ); + (*ucmd)->buttons &= ~BUTTON_USE_FORCE; + } else { // this is a crappy way to put sounds on a moving eweb.... diff --git a/code/game/g_items.cpp b/code/game/g_items.cpp index c32bec6e8b..63077a77a8 100644 --- a/code/game/g_items.cpp +++ b/code/game/g_items.cpp @@ -825,6 +825,15 @@ void Touch_Item (gentity_t *ent, gentity_t *other, trace_t *trace) { return; } } + + if ( ent->item->giType == IT_WEAPON + && ent->item->giTag == WP_EMPLACED_GUN ) + {//portable eweb + if ( ent->delay > level.time ) + {//just picked it up, don't pick up again right away + return; + } + } if ( other->s.number < MAX_CLIENTS && (ent->spawnflags&ITMSF_USEPICKUP) ) diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index d78b352c1e..27e35bf1c3 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -132,7 +132,7 @@ void Svcmd_EntityList_f (void) { //--------------------------- extern void G_StopCinematicSkip( void ); extern void G_StartCinematicSkip( void ); -extern void ExitEmplacedWeapon( gentity_t *ent ); +extern void ExitEmplacedWeapon( gentity_t *ent, qboolean detach = qfalse ); static void Svcmd_ExitView_f( void ) { extern cvar_t *g_skippingcin; diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 915b39c4a0..d296b75cf6 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -481,7 +481,17 @@ void G_CreateG2AttachedWeaponModel( gentity_t *ent, const char *psWeaponModel, i gi.G2API_AttachG2Model(&ent->ghoul2[ent->weaponModel[weaponNum]], &ent->ghoul2[ent->playerModel], boltNum, ent->playerModel); // set up a bolt on the end so we can get where the sabre muzzle is - we can assume this is always bolt 0 - gi.G2API_AddBolt(&ent->ghoul2[ent->weaponModel[weaponNum]], "*flash"); + if (gi.G2API_AddBolt(&ent->ghoul2[ent->weaponModel[weaponNum]], "*cannonflash") != -1) + { + vec3_t gunAngles = { 0.0f, 0.0f, 0.0f }; + vec3_t offset = { 0.0f, 0.0f, -10.0f }; + gi.G2API_SetSurfaceOnOff(&ent->ghoul2[ent->weaponModel[weaponNum]], "eweb_cannon", 0x00000002); + gi.G2API_SetBoneAnglesOffset(&ent->ghoul2[ent->weaponModel[weaponNum]], "base", gunAngles, BONE_ANGLES_PREMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, 0, offset); + } + else + { + gi.G2API_AddBolt(&ent->ghoul2[ent->weaponModel[weaponNum]], "*flash"); + } //gi.G2API_SetLodBias( &ent->ghoul2[ent->weaponModel[weaponNum]], 0 ); } } From 0b4158de468be9b63a0e9d5dd69518c77e79413c Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sat, 27 Dec 2014 16:58:25 +0000 Subject: [PATCH 393/445] GLM view models: eezstreet's GLM viewmodels --- code/cgame/animtable.h | 45 ++++ code/cgame/cg_local.h | 1 + code/cgame/cg_main.cpp | 4 + code/cgame/cg_weapons.cpp | 456 ++++++++++++++++++++++++++++++++----- code/game/NPC_combat.cpp | 6 +- code/game/NPC_spawn.cpp | 10 +- code/game/NPC_stats.cpp | 14 +- code/game/Q3_Interface.cpp | 2 +- code/game/anims.h | 59 +++++ code/game/bg_pmove.cpp | 8 +- code/game/g_active.cpp | 4 +- code/game/g_client.cpp | 4 +- code/game/g_emplaced.cpp | 2 +- code/game/g_items.cpp | 2 +- code/game/g_shared.h | 9 + code/game/g_weaponLoad.cpp | 68 ++++++ code/game/weapons.h | 38 ++-- code/game/wp_saber.cpp | 2 +- 18 files changed, 623 insertions(+), 111 deletions(-) diff --git a/code/cgame/animtable.h b/code/cgame/animtable.h index c4353fb453..e71e54c98f 100644 --- a/code/cgame/animtable.h +++ b/code/cgame/animtable.h @@ -1812,3 +1812,48 @@ stringID_table_t animTable [MAX_ANIMATIONS+1] = //must be terminated { NULL,-1 } }; + +stringID_table_t vmAnimTable [MAX_VIEWMODEL_ANIMATIONS+1] = { + ENUM2STRING(VM_READY), + ENUM2STRING(VM_IDLE), + ENUM2STRING(VM_RAISE), + ENUM2STRING(VM_LOWER), + ENUM2STRING(VM_FIRE), + ENUM2STRING(VM_MELEE), + ENUM2STRING(VM_RELOAD), + + // Force powers + ENUM2STRING(VM_FPUSH), + ENUM2STRING(VM_FPULL), + ENUM2STRING(VM_FGRIP), + ENUM2STRING(VM_FGRIP_HOLD), + ENUM2STRING(VM_FGRIP_RELEASE), + ENUM2STRING(VM_FGRIP_THROW), + ENUM2STRING(VM_FHEAL_QUICK), + ENUM2STRING(VM_FHEAL_START), + ENUM2STRING(VM_FHEAL_STOP), + ENUM2STRING(VM_FLIGHTNING), + ENUM2STRING(VM_FLIGHTNING_START), + ENUM2STRING(VM_FLIGHTNING_HOLD), + ENUM2STRING(VM_FLIGHTNING_RELEASE), + ENUM2STRING(VM_FRESISTPUSH), + ENUM2STRING(VM_FMINDTRICK1), + ENUM2STRING(VM_FMINDTRICK2), + + // JA stuff + ENUM2STRING(VM_2H_FLIGHTNING), + ENUM2STRING(VM_2H_FLIGHTNING_HOLD), + ENUM2STRING(VM_2H_FLIGHTNING_RELEASE), + ENUM2STRING(VM_FDRAIN), + ENUM2STRING(VM_FDRAIN_START), + ENUM2STRING(VM_FDRAIN_HOLD), + ENUM2STRING(VM_FDRAIN_RELEASE), + ENUM2STRING(VM_FPROTECT), + ENUM2STRING(VM_FPROTECT_FAST), + ENUM2STRING(VM_FRAGE), + ENUM2STRING(VM_FABSORB), + ENUM2STRING(VM_FABSORB_START), + ENUM2STRING(VM_FABSORB_END), + + { NULL,-1 } +}; \ No newline at end of file diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index 72eed6f1b7..b8958c5812 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -825,6 +825,7 @@ void CG_DPPrevForcePower_f( void ); void CG_RegisterWeapon( int weaponNum ); +void CG_DeregisterWeapon( int weaponNum ); void CG_RegisterItemVisuals( int itemNum ); void CG_RegisterItemSounds( int itemNum ); diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 8b77ad9903..495780a4da 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -2206,6 +2206,10 @@ void CG_Shutdown( void ) { in_camera = false; FX_Free(); + + for (int i = 0; i < WP_NUM_WEAPONS; i++) { + CG_DeregisterWeapon(i); + } } //// DEBUG STUFF diff --git a/code/cgame/cg_weapons.cpp b/code/cgame/cg_weapons.cpp index 46c95883b5..e4261b9bec 100644 --- a/code/cgame/cg_weapons.cpp +++ b/code/cgame/cg_weapons.cpp @@ -37,6 +37,7 @@ extern void G_SoundOnEnt( gentity_t *ent, soundChannel_t channel, const char *so const char *CG_DisplayBoxedText(int iBoxX, int iBoxY, int iBoxWidth, int iBoxHeight, const char *psText, int iFontHandle, float fScale, const vec4_t v4Color); +void CG_LoadViewmodelAnimations (CGhoul2Info* ghl2, const char *modelName, viewModelAnimSet_t* ptAnims); /* ================= @@ -80,29 +81,27 @@ void CG_RegisterWeapon( int weaponNum ) { } CG_RegisterItemVisuals( item - bg_itemlist ); + + Q_strncpyz( path, weaponData[weaponNum].weaponMdl, sizeof(path) ); // set up in view weapon model - weaponInfo->weaponModel = cgi_R_RegisterModel( weaponData[weaponNum].weaponMdl ); - {//in case the weaponmodel isn't _w, precache the _w.glm - char weaponModel[64]; - - Q_strncpyz (weaponModel, weaponData[weaponNum].weaponMdl, sizeof(weaponModel)); - if (char *spot = strstr(weaponModel, ".md3") ) + if (Q_stristr(path, ".glm")) { + //EXPERIMENTAL: GHOUL2 viewmodels + weaponInfo->bUsesGhoul2 = true; + } + + if (!weaponInfo->bUsesGhoul2) + { + weaponInfo->weaponModel = cgi_R_RegisterModel( weaponData[weaponNum].weaponMdl ); + + if ( weaponInfo->weaponModel == 0 ) { - *spot = 0; - spot = strstr(weaponModel, "_w");//i'm using the in view weapon array instead of scanning the item list, so put the _w back on - if (!spot) - { - Q_strcat (weaponModel, sizeof(weaponModel), "_w"); - } - Q_strcat (weaponModel, sizeof(weaponModel), ".glm"); //and change to ghoul2 + CG_Error( "Couldn't find weapon model %s for weapon %s\n", weaponData[weaponNum].weaponMdl, weaponData[weaponNum].classname); + return; } - gi.G2API_PrecacheGhoul2Model( weaponModel ); // correct way is item->world_model } - - if ( weaponInfo->weaponModel == 0 ) - { - CG_Error( "Couldn't find weapon model %s for weapon %s\n", weaponData[weaponNum].weaponMdl, weaponData[weaponNum].classname); - return; + + {//precache the _w.glm + gi.G2API_PrecacheGhoul2Model( weaponData[weaponNum].worldModel ); // correct way is item->world_model } // calc midpoint for rotation @@ -150,14 +149,34 @@ void CG_RegisterWeapon( int weaponNum ) { weaponInfo->weaponWorldModel = weaponInfo->weaponModel; } - // set up the hand that holds the in view weapon - assuming we have one Q_strncpyz( path, weaponData[weaponNum].weaponMdl, sizeof(path) ); - COM_StripExtension( path, path, sizeof(path) ); - Q_strcat( path, sizeof(path), "_hand.md3" ); - weaponInfo->handsModel = cgi_R_RegisterModel( path ); - - if ( !weaponInfo->handsModel ) { - weaponInfo->handsModel = cgi_R_RegisterModel( "models/weapons2/briar_pistol/briar_pistol_hand.md3" ); + if ( weaponInfo->bUsesGhoul2 ) { + // Init the ghoul2 model + weaponInfo->g2_skin = gi.RE_RegisterSkin(weaponData[weaponNum].skinPath); + weaponInfo->g2_index = gi.G2API_InitGhoul2Model(weaponInfo->ghoul2, path, + G_ModelIndex(path), G_SkinIndex(weaponData[weaponNum].skinPath), NULL, 0, 0); + gi.G2API_SetSkin(&weaponInfo->ghoul2[weaponInfo->g2_index], 0, weaponInfo->g2_skin); + // Add flash bolt + weaponInfo->g2_flashbolt = gi.G2API_AddBolt(&weaponInfo->ghoul2[weaponInfo->g2_index], "*flash"); + weaponInfo->g2_effectsbolt = gi.G2API_AddBolt(&weaponInfo->ghoul2[weaponInfo->g2_index], "*l_hand"); + if(!weaponData[weaponNum].bNoHandModel) + weaponInfo->handsModel = cgi_R_RegisterModel( "models/weapons2/briar_pistol/briar_pistol_hand.md3" ); + + // Load the animation.cfg + CG_LoadViewmodelAnimations(&weaponInfo->ghoul2[weaponInfo->g2_index], path, &weaponInfo->g2_anims); + } + else { + // Normal -- MD3 viewmodels + // set up the hand that holds the in view weapon - assuming we have one + if(!weaponData[weaponNum].bNoHandModel) { + COM_StripExtension( path, path, sizeof(path) ); + Q_strcat( path, sizeof(path), "_hand.md3" ); + weaponInfo->handsModel = cgi_R_RegisterModel( path ); + + if ( !weaponInfo->handsModel ) { + weaponInfo->handsModel = cgi_R_RegisterModel( "models/weapons2/briar_pistol/briar_pistol_hand.md3" ); + } + } } // register the sounds for the weapon @@ -630,6 +649,136 @@ void CG_RegisterWeapon( int weaponNum ) { } } +/* +================= +CG_DeregisterWeapon + +Clean up Ghoul2 instances (if they exist) +================= +*/ +void CG_DeregisterWeapon (int weaponNum) { + weaponInfo_t *weaponInfo = &cg_weapons[weaponNum]; + if(!gi.G2API_HaveWeGhoul2Models(weaponInfo->ghoul2)) + return; + gi.G2API_RemoveBolt(&weaponInfo->ghoul2[weaponInfo->g2_index], weaponInfo->g2_flashbolt); + gi.G2API_RemoveBolt(&weaponInfo->ghoul2[weaponInfo->g2_index], weaponInfo->g2_effectsbolt); + gi.G2API_CleanGhoul2Models(weaponInfo->ghoul2); +} + +/* + ================= + CG_LoadViewmodelAnimations + Loads animation.cfg for viewmodel + ================= + */ + +void CG_LoadViewmodelAnimations (CGhoul2Info* ghl2, const char *modelName, viewModelAnimSet_t* ptAnims) { + + // Basic NULL checks, nothin' fishy better be in here... + if(!ghl2 || !modelName || !ptAnims) { + return; + } + + // Get the GLA's path. + char *GLAname = gi.G2API_GetGLAName( ghl2 ); + if ( !GLAname ) { + return; + } + + // From the GLA's path, determine the path to animation.cfg and stuff the value into animName. + char animName[MAX_QPATH]; + char *slash = NULL; + + Q_strncpyz( animName, GLAname, sizeof( animName ) ); + slash = strrchr( animName, '/' ); + if ( slash ) + { + *slash = 0; + } + Q_strcat( animName, sizeof(animName), "/animation.cfg" ); + + + // Load the file (erroring out if none found) + fileHandle_t f; + int len = cgi_FS_FOpenFile(animName, &f, FS_READ); + if(f == -1) { + Com_Printf("^1ERROR: Failed to load %s: file not found\n", animName); + return; + } + else if(len <= 0) { + Com_Printf("^1ERROR: Failed to load %s: file blank or not found\n", animName); + cgi_FS_FCloseFile(f); + return; + } + + // Read the file, and close it. + char buffer[16535]; + cgi_FS_Read(buffer, len, f); + cgi_FS_FCloseFile(f); + buffer[len] = 0; + + // Set initial data in the animation.cfg data bufffer. + // This is slightly optimized from base's method - we do this in one step by ZeroMemory as opposed to looping. + Q_strncpyz(ptAnims->filename, animName, sizeof(ptAnims->filename)); + // FIXME: shouldn't just sizeof(ptAnims->animations) do? + memset(ptAnims->animations, 0, sizeof(animation_t) * MAX_VIEWMODEL_ANIMATIONS); + + + // Actually parse the file, woot. + // This is more or less ripped from MP, bad styling and all. + char *token; + const char *s = (const char*)buffer; + + COM_BeginParseSession(); + while(1) { + token = COM_Parse(&s); + if (!token || !token[0]) { + break; + } + + int animNum = GetIDForString(vmAnimTable, token); + if (animNum == -1) { + if (Q_stricmp(token, "ROOT")) { + Com_Printf(S_COLOR_RED"WARNING: Unknown token %s in %s\n", token, ptAnims->filename); + } + continue; + } + + token = COM_Parse(&s); + if (!token || !token[0]) { + break; + } + ptAnims->animations[animNum].firstFrame = atoi(token); + + token = COM_Parse(&s); + if (!token || !token[0]) { + break; + } + ptAnims->animations[animNum].numFrames = atoi(token); + + token = COM_Parse(&s); + if (!token || !token[0]) { + break; + } + ptAnims->animations[animNum].loopFrames = atoi(token); + + token = COM_Parse(&s); + if (!token || !token[0]) { + break; + } + float fps = atof(token); + if(fps == 0) + fps = 1; + if(fps < 0) + ptAnims->animations[animNum].frameLerp = floor(1000.0f / fps); + else + ptAnims->animations[animNum].frameLerp = ceil(1000.0f / fps); + + //ptAnims->animations[animNum].initialLerp = ceil(1000.0f / fabs(fps)); + } + COM_EndParseSession(); +} + /* ================= CG_RegisterItemVisuals @@ -967,6 +1116,134 @@ static void CG_DoMuzzleFlash( centity_t *cent, vec3_t org, vec3_t dir, weaponDat Ghoul2 Insert End */ +/* + ============== + CG_AnimateViewmodel + Only for GHOUL 2 weapons --eez + ============== + */ + +static int lastAnimPlayed = 0; + +int CG_MapTorsoToG2VMAnimation(playerState_t *ps) { + switch(ps->torsoAnim) { + case TORSO_WEAPONREADY1: + case TORSO_WEAPONREADY2: + case TORSO_WEAPONREADY3: + case TORSO_WEAPONREADY4: +// case TORSO_WEAPONREADY5: +// case TORSO_WEAPONREADY6: +// case TORSO_WEAPONREADY7: +// case TORSO_WEAPONREADY8: +// case TORSO_WEAPONREADY9: + case TORSO_WEAPONREADY10: +// case TORSO_WEAPONREADY11: +// case TORSO_WEAPONREADY12: +// case TORSO_WEAPONIDLE1: + case TORSO_WEAPONIDLE2: + case TORSO_WEAPONIDLE3: + case TORSO_WEAPONIDLE4: +// case TORSO_WEAPONIDLE5: +// case TORSO_WEAPONIDLE6: +// case TORSO_WEAPONIDLE7: +// case TORSO_WEAPONIDLE8: +// case TORSO_WEAPONIDLE9: + case TORSO_WEAPONIDLE10: +// case TORSO_WEAPONIDLE11: +// case TORSO_WEAPONIDLE12: + default: + return VM_READY; + case BOTH_STAND1IDLE1: + case BOTH_STAND2IDLE1: + case BOTH_STAND3IDLE1: +// case BOTH_STAND4IDLE1: + case BOTH_STAND5IDLE1: + return VM_IDLE; + case TORSO_DROPWEAP1: + return VM_LOWER; + case TORSO_RAISEWEAP1: + return VM_RAISE; + case BOTH_ATTACK1: + case BOTH_ATTACK2: + case BOTH_ATTACK3: + case BOTH_ATTACK4: + return VM_FIRE; + case BOTH_RESISTPUSH: + return VM_FRESISTPUSH; + case BOTH_FORCEPUSH: + return VM_FPUSH; + case BOTH_FORCEPULL: + return VM_FPULL; + case BOTH_MINDTRICK1: + return VM_FMINDTRICK1; + case BOTH_MINDTRICK2: + return VM_FMINDTRICK2; + case BOTH_FORCELIGHTNING: + return VM_FLIGHTNING; + case BOTH_FORCELIGHTNING_START: + return VM_FLIGHTNING_START; + case BOTH_FORCELIGHTNING_HOLD: + return VM_FLIGHTNING_HOLD; + case BOTH_FORCELIGHTNING_RELEASE: + return VM_FLIGHTNING_RELEASE; + case BOTH_FORCEHEAL_START: + return VM_FHEAL_START; + case BOTH_FORCEHEAL_STOP: + return VM_FHEAL_STOP; + case BOTH_FORCEHEAL_QUICK: + return VM_FHEAL_QUICK; + case BOTH_FORCEGRIP1: + case BOTH_FORCEGRIP3: + return VM_FGRIP; + case BOTH_FORCEGRIP3THROW: + return VM_FGRIP_THROW; + case BOTH_FORCEGRIP_RELEASE: + return VM_FGRIP_RELEASE; + case BOTH_FORCEGRIP_HOLD: + return VM_FGRIP_HOLD; + } +} + +extern void CG_ForcePushBlur(const vec3_t org, qboolean darkSide = qfalse); +void CG_AnimateViewmodel( centity_t* cent, playerState_t *ps ) { + CG_RegisterWeapon(ps->weapon); + weaponInfo_t* weapon = &cg_weapons[ps->weapon]; + int desiredAnim = CG_MapTorsoToG2VMAnimation(ps); + int flags = BONE_ANIM_OVERRIDE; + + switch(desiredAnim) { + case VM_FIRE: + if(cent->muzzleFlashTime <= 0) + return; + break; + case VM_2H_FLIGHTNING_HOLD: + case VM_FDRAIN_HOLD: + case VM_FGRIP_HOLD: + case VM_FLIGHTNING_HOLD: + flags = BONE_ANIM_OVERRIDE_FREEZE; + if(ps->torsoAnim == lastAnimPlayed) + return; + break; + case VM_READY: + flags = BONE_ANIM_OVERRIDE_LOOP; + if(ps->torsoAnim == lastAnimPlayed) + return; + break; + default: + if(ps->torsoAnim == lastAnimPlayed) + return; + break; + } + + lastAnimPlayed = ps->torsoAnim; + + gi.G2API_SetBoneAnim(&weapon->ghoul2[weapon->g2_index], "model_root", + weapon->g2_anims.animations[desiredAnim].firstFrame, + weapon->g2_anims.animations[desiredAnim].firstFrame+weapon->g2_anims.animations[desiredAnim].numFrames, + flags, 100.0f/weapon->g2_anims.animations[desiredAnim].frameLerp, + cg.time, weapon->g2_anims.animations[desiredAnim].firstFrame, -1); +} + /* ============== CG_AddViewWeapon @@ -1151,7 +1428,7 @@ void CG_AddViewWeapon( playerState_t *ps ) } else #endif - { + if ( !weapon->bUsesGhoul2 ) { // get clientinfo for animation map const clientInfo_t *ci = ¢->gent->client->clientInfo; int torsoAnim = cent->gent->client->ps.torsoAnim;//pe.torso.animationNumber; @@ -1176,6 +1453,10 @@ void CG_AddViewWeapon( playerState_t *ps ) hand.backlerp=0.0f; } } + else { + // Using ghoul2 (question mark?) + CG_AnimateViewmodel(cent, ps); + } // add the weapon(s) - FIXME: allow for 2 weapons generically, not just 2 sabers? int numSabers = 1; @@ -1187,15 +1468,26 @@ void CG_AddViewWeapon( playerState_t *ps ) { refEntity_t gun; memset (&gun, 0, sizeof(gun)); + AnglesToAxis( angles, gun.axis ); - gun.hModel = weapon->weaponModel; - if (!gun.hModel) + if ( !weapon->bUsesGhoul2 ) { + gun.hModel = weapon->weaponModel; + if (!gun.hModel) + { + return; + } + } + else { - return; + gun.ghoul2 = const_cast(&weapon->ghoul2); + gun.radius = 60; + gun.customSkin = weapon->g2_skin; + VectorCopy(hand.axis[0], gun.axis[0]); } - - AnglesToAxis( angles, gun.axis ); - CG_PositionEntityOnTag( &gun, &hand, weapon->handsModel, "tag_weapon"); + if(!wData->bNoHandModel) + CG_PositionEntityOnTag( &gun, &hand, weapon->handsModel, "tag_weapon"); + else + VectorCopy(hand.origin, gun.origin); gun.renderfx = RF_DEPTHHACK | RF_FIRST_PERSON; @@ -1246,42 +1538,83 @@ void CG_AddViewWeapon( playerState_t *ps ) } */ // add the spinning barrel[s] - for (int i = 0; (i < wData->numBarrels); i++) - { - refEntity_t barrel; - memset( &barrel, 0, sizeof( barrel ) ); - barrel.hModel = weapon->barrelModel[i]; - - //VectorCopy( parent->lightingOrigin, barrel.lightingOrigin ); - //barrel.shadowPlane = parent->shadowPlane; - barrel.renderfx = gun.renderfx; - angles[YAW] = 0; - angles[PITCH] = 0; - // if ( ps->weapon == WP_TETRION_DISRUPTOR) { - // angles[ROLL] = CG_MachinegunSpinAngle( cent ); - // } else { - angles[ROLL] = 0;//CG_MachinegunSpinAngle( cent ); - // } - - AnglesToAxis( angles, barrel.axis ); - if (!i) - { - CG_PositionRotatedEntityOnTag( &barrel, &hand, weapon->handsModel, "tag_barrel", NULL ); - } else + if ( !weapon->bUsesGhoul2 ) + { + for (int i = 0; (i < wData->numBarrels); i++) { - CG_PositionRotatedEntityOnTag( &barrel, &hand, weapon->handsModel, va("tag_barrel%d",i+1), NULL ); - } + refEntity_t barrel; + memset( &barrel, 0, sizeof( barrel ) ); + barrel.hModel = weapon->barrelModel[i]; + + //VectorCopy( parent->lightingOrigin, barrel.lightingOrigin ); + //barrel.shadowPlane = parent->shadowPlane; + barrel.renderfx = gun.renderfx; + angles[YAW] = 0; + angles[PITCH] = 0; + // if ( ps->weapon == WP_TETRION_DISRUPTOR) { + // angles[ROLL] = CG_MachinegunSpinAngle( cent ); + // } else { + angles[ROLL] = 0;//CG_MachinegunSpinAngle( cent ); + // } + + AnglesToAxis( angles, barrel.axis ); + if (!i) + { + CG_PositionRotatedEntityOnTag( &barrel, &hand, weapon->handsModel, "tag_barrel", NULL ); + } else + { + CG_PositionRotatedEntityOnTag( &barrel, &hand, weapon->handsModel, va("tag_barrel%d",i+1), NULL ); + } - cgi_R_AddRefEntityToScene( &barrel ); + cgi_R_AddRefEntityToScene( &barrel ); + } } memset (&flash, 0, sizeof(flash)); // Seems like we should always do this in case we have an animating muzzle flash....that way we can always store the correct muzzle dir, etc. - CG_PositionEntityOnTag( &flash, &gun, gun.hModel, "tag_flash"); - - CG_DoMuzzleFlash( cent, flash.origin, flash.axis[0], wData ); + if ( !weapon->bUsesGhoul2 ) + { + CG_PositionEntityOnTag( &flash, &gun, gun.hModel, "tag_flash"); + CG_DoMuzzleFlash( cent, flash.origin, flash.axis[0], wData ); + } + else { + CGhoul2Info_v& s = *gun.ghoul2; + mdxaBone_t boltMatrix; + vec3_t setAngles; + + VectorSet(setAngles, cent->lerpAngles[PITCH], cent->lerpAngles[YAW], 0); + + gi.G2API_GetBoltMatrix (s, weapon->g2_index, weapon->g2_flashbolt, &boltMatrix, setAngles, gun.origin, + (cg.time?cg.time:level.time), NULL, gun.modelScale); + gi.G2API_GiveMeVectorFromMatrix(boltMatrix, ORIGIN, flash.origin); + VectorCopy(cg.snap->ps.viewangles, flash.angles); + + gi.G2API_GiveMeVectorFromMatrix(boltMatrix, POSITIVE_X, flash.axis[0]); + gi.G2API_GiveMeVectorFromMatrix(boltMatrix, POSITIVE_Y, flash.axis[1]); + gi.G2API_GiveMeVectorFromMatrix(boltMatrix, POSITIVE_Z, flash.axis[2]); + + // Play effects if requested + if(ps->powerups[PW_FORCE_PUSH] > cg.time || + ps->forcePowersActive & (1 << FP_GRIP)) { + vec3_t effectOrigin; + VectorSet(setAngles, cent->lerpAngles[PITCH], cent->lerpAngles[YAW], 0); + gi.G2API_GetBoltMatrix(s, weapon->g2_index, weapon->g2_effectsbolt, &boltMatrix, setAngles, gun.origin, + (cg.time ? cg.time : level.time), NULL, gun.modelScale); + gi.G2API_GiveMeVectorFromMatrix(boltMatrix, ORIGIN, effectOrigin); + CG_ForcePushBlur(effectOrigin); + } + + // The effect position gets broken with differences in FOV. This should (hopefully) fix that. + if(cg_fovViewmodel.integer) { + float fracDistFOV = tanf(cg.refdef.fov_x * (M_PI / 180) * 0.5f); + float fracWeapFOV = (1.0f / fracDistFOV) * tanf(actualFOV * (M_PI / 180) * 0.5f); + VectorScale(flash.axis[0], fracWeapFOV, flash.axis[0]); + } + CG_DoMuzzleFlash( cent, flash.origin, flash.angles, wData ); + } + if ( cent->gent && cent->gent->client ) { if ( saberNum == 0 ) @@ -1296,6 +1629,7 @@ void CG_AddViewWeapon( playerState_t *ps ) } } + // Do special charge bits //----------------------- if (( ps->weaponstate == WEAPON_CHARGING_ALT && ps->weapon == WP_BRYAR_PISTOL ) diff --git a/code/game/NPC_combat.cpp b/code/game/NPC_combat.cpp index 4494ad7a94..9b5f7c68d8 100644 --- a/code/game/NPC_combat.cpp +++ b/code/game/NPC_combat.cpp @@ -609,14 +609,14 @@ void G_SetEnemy( gentity_t *self, gentity_t *enemy ) ChangeWeapon( self, WP_BLASTER ); self->client->ps.weapon = WP_BLASTER; self->client->ps.weaponstate = WEAPON_READY; - G_CreateG2AttachedWeaponModel( self, weaponData[WP_BLASTER].weaponMdl, self->handRBolt, 0 ); + G_CreateG2AttachedWeaponModel( self, weaponData[WP_BLASTER].worldModel, self->handRBolt, 0 ); } else if ( self->client->ps.stats[STAT_WEAPONS] & ( 1 << WP_BLASTER_PISTOL ) ) { ChangeWeapon( self, WP_BLASTER_PISTOL ); self->client->ps.weapon = WP_BLASTER_PISTOL; self->client->ps.weaponstate = WEAPON_READY; - G_CreateG2AttachedWeaponModel( self, weaponData[WP_BLASTER_PISTOL].weaponMdl, self->handRBolt, 0 ); + G_CreateG2AttachedWeaponModel( self, weaponData[WP_BLASTER_PISTOL].worldModel, self->handRBolt, 0 ); } } return; @@ -1043,7 +1043,7 @@ void NPC_ChangeWeapon( int newWeapon ) } else { - G_CreateG2AttachedWeaponModel( NPC, weaponData[NPC->client->ps.weapon].weaponMdl, NPC->handRBolt, 0 ); + G_CreateG2AttachedWeaponModel( NPC, weaponData[NPC->client->ps.weapon].worldModel, NPC->handRBolt, 0 ); WP_SaberAddHolsteredG2SaberModels( NPC ); } } diff --git a/code/game/NPC_spawn.cpp b/code/game/NPC_spawn.cpp index d834d4e3ec..1cf153f4d7 100644 --- a/code/game/NPC_spawn.cpp +++ b/code/game/NPC_spawn.cpp @@ -452,7 +452,7 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) && ent->client->ps.weapon != WP_SABER //sabers done above && (!(ent->NPC->aiFlags&NPCAI_MATCHPLAYERWEAPON)||!ent->weaponModel[0]) )//they do this themselves { - G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].weaponMdl, ent->handRBolt, 0 ); + G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].worldModel, ent->handRBolt, 0 ); WP_SaberAddHolsteredG2SaberModels( ent ); } switch ( ent->client->ps.weapon ) @@ -554,7 +554,7 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) && ent->client->ps.weapon != WP_SABER//sabers done above && (!(ent->NPC->aiFlags&NPCAI_MATCHPLAYERWEAPON)||!ent->weaponModel[0]) )//they do this themselves { - G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].weaponMdl, ent->handRBolt, 0 ); + G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].worldModel, ent->handRBolt, 0 ); WP_SaberAddHolsteredG2SaberModels( ent ); } switch ( ent->client->ps.weapon ) @@ -567,7 +567,7 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) && ent->NPC->rank >= RANK_LT_COMM && (!(ent->NPC->aiFlags&NPCAI_MATCHPLAYERWEAPON)||!ent->weaponModel[0]) )//they do this themselves {//dual blaster pistols, so add the left-hand one, too - G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].weaponMdl, ent->handLBolt, 1 ); + G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].worldModel, ent->handLBolt, 1 ); } break; case WP_DISRUPTOR: @@ -631,7 +631,7 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) && ent->client->ps.weapon != WP_SABER//sabers done above && (!(ent->NPC->aiFlags&NPCAI_MATCHPLAYERWEAPON)||!ent->weaponModel[0]) )//they do this themselves { - G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].weaponMdl, ent->handRBolt, 0 ); + G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].worldModel, ent->handRBolt, 0 ); WP_SaberAddHolsteredG2SaberModels( ent ); } break; @@ -667,7 +667,7 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) { if ( !ent->weaponModel[1] ) {//we have the scepter, so put it in our left hand if we don't already have a second weapon - G_CreateG2AttachedWeaponModel( ent, weaponData[WP_SCEPTER].weaponMdl, ent->handLBolt, 1 ); + G_CreateG2AttachedWeaponModel( ent, weaponData[WP_SCEPTER].worldModel, ent->handLBolt, 1 ); } ent->genericBolt1 = gi.G2API_AddBolt(&ent->ghoul2[ent->weaponModel[1]], "*flash"); } diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index f1fe2d7d24..aad14a3163 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -1383,19 +1383,7 @@ void NPC_PrecacheWeapons( team_t playerTeam, int spawnflags, char *NPCtype ) CG_RegisterItemSounds( (item-bg_itemlist) ); CG_RegisterItemVisuals( (item-bg_itemlist) ); //precache the in-hand/in-world ghoul2 weapon model - - char weaponModel[64]; - - strcpy (weaponModel, weaponData[curWeap].weaponMdl); - if (char *spot = strstr(weaponModel, ".md3") ) { - *spot = 0; - spot = strstr(weaponModel, "_w");//i'm using the in view weapon array instead of scanning the item list, so put the _w back on - if (!spot) { - strcat (weaponModel, "_w"); - } - strcat (weaponModel, ".glm"); //and change to ghoul2 - } - gi.G2API_PrecacheGhoul2Model( weaponModel ); // correct way is item->world_model + gi.G2API_PrecacheGhoul2Model( weaponData[curWeap].worldModel ); // correct way is item->world_model } } } diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index e6e9b389f4..08cf191ce8 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -3271,7 +3271,7 @@ void G_SetWeapon( gentity_t *self, int wp ) } else { - G_CreateG2AttachedWeaponModel( self, weaponData[wp].weaponMdl, self->handRBolt, 0 ); + G_CreateG2AttachedWeaponModel( self, weaponData[wp].worldModel, self->handRBolt, 0 ); WP_SaberAddHolsteredG2SaberModels( self ); } } diff --git a/code/game/anims.h b/code/game/anims.h index e234f5f73b..4aff70f494 100644 --- a/code/game/anims.h +++ b/code/game/anims.h @@ -1817,6 +1817,65 @@ typedef enum //# animNumber_e #define SABER_ANIM_GROUP_SIZE (BOTH_A2_T__B_ - BOTH_A1_T__B_) +/* + ====================================== + Viewmodel Animations + ====================================== + */ + +enum { + // Basic + VM_READY, + VM_IDLE, + VM_RAISE, + VM_LOWER, + VM_FIRE, + VM_MELEE, + VM_RELOAD, + + // Force powers + VM_FPUSH, + VM_FPULL, + VM_FGRIP, + VM_FGRIP_HOLD, + VM_FGRIP_RELEASE, + VM_FGRIP_THROW, + VM_FHEAL_QUICK, + VM_FHEAL_START, + VM_FHEAL_STOP, + VM_FLIGHTNING, + VM_FLIGHTNING_START, + VM_FLIGHTNING_HOLD, + VM_FLIGHTNING_RELEASE, + VM_FRESISTPUSH, + VM_FMINDTRICK1, + VM_FMINDTRICK2, + + // JA stuff + VM_2H_FLIGHTNING, + VM_2H_FLIGHTNING_HOLD, + VM_2H_FLIGHTNING_RELEASE, + VM_FDRAIN, + VM_FDRAIN_START, + VM_FDRAIN_HOLD, + VM_FDRAIN_RELEASE, + VM_FPROTECT, + VM_FPROTECT_FAST, + VM_FRAGE, + VM_FABSORB, + VM_FABSORB_START, + VM_FABSORB_END, + + MAX_VIEWMODEL_ANIMATIONS +}; + +typedef struct +{ + char filename[MAX_QPATH]; + animation_t animations[MAX_VIEWMODEL_ANIMATIONS]; +} viewModelAnimSet_t; + +extern stringID_table_t vmAnimTable [MAX_VIEWMODEL_ANIMATIONS+1]; #endif// #ifndef __ANIMS_H__ diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index be5492ba52..30bd2b63e0 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -9109,8 +9109,8 @@ static void PM_FinishWeaponChange( void ) { G_RemoveWeaponModels( pm->gent ); //holster sabers WP_SaberAddHolsteredG2SaberModels( pm->gent ); - if (weaponData[weapon].weaponMdl[0]) { //might be NONE, so check if it has a model - G_CreateG2AttachedWeaponModel( pm->gent, weaponData[weapon].weaponMdl, pm->gent->handRBolt, 0 ); + if (weaponData[weapon].worldModel[0]) { //might be NONE, so check if it has a model + G_CreateG2AttachedWeaponModel( pm->gent, weaponData[weapon].worldModel, pm->gent->handRBolt, 0 ); } } @@ -13629,8 +13629,8 @@ static void PM_Weapon( void ) {//add the thermal model back in our hand // remove anything if we have anything already G_RemoveWeaponModels( pm->gent ); - if (weaponData[pm->ps->weapon].weaponMdl[0]) { //might be NONE, so check if it has a model - G_CreateG2AttachedWeaponModel( pm->gent, weaponData[pm->ps->weapon].weaponMdl, pm->gent->handRBolt, 0 ); + if (weaponData[pm->ps->weapon].worldModel[0]) { //might be NONE, so check if it has a model + G_CreateG2AttachedWeaponModel( pm->gent, weaponData[pm->ps->weapon].worldModel, pm->gent->handRBolt, 0 ); //make it sound like we took another one out from... uh.. somewhere... if ( cg.time > 0 ) {//this way we don't get that annoying change weapon sound every time a map starts diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index 04de06a106..facaace772 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -1660,7 +1660,7 @@ void G_MatchPlayerWeapon( gentity_t *ent ) } else { - G_CreateG2AttachedWeaponModel( ent, weaponData[newWeap].weaponMdl, ent->handRBolt, 0 ); + G_CreateG2AttachedWeaponModel( ent, weaponData[newWeap].worldModel, ent->handRBolt, 0 ); WP_SaberAddHolsteredG2SaberModels( ent ); } } @@ -4288,7 +4288,7 @@ void G_CheckClientIdle( gentity_t *ent, usercmd_t *ucmd ) { return; } - if ( !ent->s.number && ( !cg.renderingThirdPerson || cg.zoomMode ) ) + if ( !ent->s.number && ( /*!cg.renderingThirdPerson ||*/ cg.zoomMode ) ) { if ( ent->client->idleTime < level.time ) { diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index f10f978369..9fc84c88b3 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -1914,7 +1914,7 @@ void G_AddWeaponModels( gentity_t *ent ) } else if ( ent->client->ps.weapon != WP_NONE ) { - G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].weaponMdl, ent->handRBolt, 0 ); + G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].worldModel, ent->handRBolt, 0 ); WP_SaberAddHolsteredG2SaberModels( ent ); } } @@ -2773,7 +2773,7 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded } if ( ent->weaponModel[0] == -1 && ent->client->ps.weapon != WP_NONE ) { - G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].weaponMdl, ent->handRBolt, 0 ); + G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].worldModel, ent->handRBolt, 0 ); WP_SaberAddHolsteredG2SaberModels( ent ); } diff --git a/code/game/g_emplaced.cpp b/code/game/g_emplaced.cpp index 43d7fb05b0..c91d4a8936 100644 --- a/code/game/g_emplaced.cpp +++ b/code/game/g_emplaced.cpp @@ -1048,7 +1048,7 @@ extern void CG_ChangeWeapon( int num ); } else { - G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].weaponMdl, ent->handRBolt, 0 ); + G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].worldModel, ent->handRBolt, 0 ); WP_SaberAddHolsteredG2SaberModels( ent ); } diff --git a/code/game/g_items.cpp b/code/game/g_items.cpp index 63077a77a8..33e08b9591 100644 --- a/code/game/g_items.cpp +++ b/code/game/g_items.cpp @@ -513,7 +513,7 @@ int Pickup_Weapon (gentity_t *ent, gentity_t *other) } else { - G_CreateG2AttachedWeaponModel( other, weaponData[ent->item->giTag].weaponMdl, other->handRBolt, 0 ); + G_CreateG2AttachedWeaponModel( other, weaponData[ent->item->giTag].worldModel, other->handRBolt, 0 ); WP_SaberAddHolsteredG2SaberModels( ent ); } } diff --git a/code/game/g_shared.h b/code/game/g_shared.h index acc6f66c67..6248f96c6f 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -32,6 +32,7 @@ along with this program; if not, see . #include "g_vehicles.h" #include "hitlocs.h" #include "bset.h" +#include "anims.h" #define FOFS(x) offsetof(gentity_t, x) @@ -1721,6 +1722,14 @@ typedef struct weaponInfo_s { sfxHandle_t altChargeSound; sfxHandle_t selectSound; // sound played when weapon is selected + + bool bUsesGhoul2; //g2 viewmodels from eezstreet + CGhoul2Info_v ghoul2; + qhandle_t g2_flashbolt; + qhandle_t g2_effectsbolt; + int g2_index; + int g2_skin; + viewModelAnimSet_t g2_anims; } weaponInfo_t; extern sfxHandle_t CAS_GetBModelSound( const char *name, int stage ); diff --git a/code/game/g_weaponLoad.cpp b/code/game/g_weaponLoad.cpp index 75f1e82c69..53d9d400b1 100644 --- a/code/game/g_weaponLoad.cpp +++ b/code/game/g_weaponLoad.cpp @@ -162,6 +162,10 @@ void WPN_SplashRadius(const char **holdBuf); void WPN_AltSplashDamage(const char **holdBuf); void WPN_AltSplashRadius(const char **holdBuf); +void WPN_WorldModel(const char **holdBuf); +void WPN_NoHandModel(const char **holdBuf); +void WPN_SkinFile(const char **holdBuf); + // Legacy weapons.dat force fields void WPN_FuncSkip(const char **holdBuf); @@ -441,6 +445,10 @@ wpnParms_t WpnParms[] = { "splashRadius", WPN_SplashRadius }, { "altSplashDamage", WPN_AltSplashDamage }, { "altSplashRadius", WPN_AltSplashRadius }, + + { "noHandModel", WPN_NoHandModel }, + { "skinFile", WPN_SkinFile }, + { "worldModel", WPN_WorldModel }, // Old legacy files contain these, so we skip them to shut up warnings { "firingforce", WPN_FuncSkip }, @@ -579,6 +587,28 @@ void WPN_WeaponModel(const char **holdBuf) Q_strncpyz(weaponData[wpnParms.weaponNum].weaponMdl,tokenStr,len); } +//-------------------------------------------- +void WPN_WorldModel(const char **holdBuf) +{ + int len; + const char *tokenStr; + + if ( COM_ParseString(holdBuf,&tokenStr)) + { + return; + } + + len = strlen(tokenStr); + len++; + if (len > 64) + { + len = 64; + gi.Printf(S_COLOR_YELLOW"WARNING: worldModel too long in external WEAPONS.DAT '%s'\n", tokenStr); + } + + Q_strncpyz(weaponData[wpnParms.weaponNum].worldModel,tokenStr,len); +} + //-------------------------------------------- void WPN_WeaponIcon(const char **holdBuf) { @@ -1434,6 +1464,44 @@ void WPN_AltSplashRadius(const char **holdBuf) weaponData[wpnParms.weaponNum].altSplashRadius = tokenFlt; } +//-------------------------------------------- + +void WPN_NoHandModel(const char **holdBuf) +{ + int tokenInt; + + if( COM_ParseInt(holdBuf,&tokenInt)) + { + SkipRestOfLine(holdBuf); + return; + } + + weaponData[wpnParms.weaponNum].bNoHandModel = tokenInt ? true : false; +} + +//-------------------------------------------- + +void WPN_SkinFile(const char **holdBuf) +{ + const char *tokenStr; + + if ( COM_ParseString(holdBuf,&tokenStr)) + { + return; + } + size_t len = strlen( tokenStr ); + + len++; + if (len > MAX_QPATH) + { + len = MAX_QPATH; + gi.Printf(S_COLOR_YELLOW"WARNING: SkinFile '%s' too long in external WEAPONS.DAT\n", tokenStr); + } + + Q_strncpyz(weaponData[wpnParms.weaponNum].skinPath,tokenStr,len); +} + + //-------------------------------------------- static void WP_ParseParms(const char *buffer) { diff --git a/code/game/weapons.h b/code/game/weapons.h index 7845cd5dd5..d6d869ae95 100644 --- a/code/game/weapons.h +++ b/code/game/weapons.h @@ -106,15 +106,16 @@ typedef enum //# ammo_e typedef struct weaponData_s { char classname[32]; // Spawning name - char weaponMdl[64]; // Weapon Model - char firingSnd[64]; // Sound made when fired - char altFiringSnd[64]; // Sound made when alt-fired + char weaponMdl[MAX_QPATH]; // Weapon Model + char worldModel[MAX_QPATH]; // World Model + char firingSnd[MAX_QPATH]; // Sound made when fired + char altFiringSnd[MAX_QPATH]; // Sound made when alt-fired // char flashSnd[64]; // Sound made by flash // char altFlashSnd[64]; // Sound made by an alt-flash - char stopSnd[64]; // Sound made when weapon stops firing - char chargeSnd[64]; // sound to start when the weapon initiates the charging sequence - char altChargeSnd[64]; // alt sound to start when the weapon initiates the charging sequence - char selectSnd[64]; // the sound to play when this weapon gets selected + char stopSnd[MAX_QPATH]; // Sound made when weapon stops firing + char chargeSnd[MAX_QPATH]; // sound to start when the weapon initiates the charging sequence + char altChargeSnd[MAX_QPATH]; // alt sound to start when the weapon initiates the charging sequence + char selectSnd[MAX_QPATH]; // the sound to play when this weapon gets selected int ammoIndex; // Index to proper ammo slot int ammoLow; // Count when ammo is low @@ -127,27 +128,27 @@ typedef struct weaponData_s int altFireTime; // Amount of time between alt-firings int altRange; // Range of alt-fire - char weaponIcon[64]; // Name of weapon icon file + char weaponIcon[MAX_QPATH]; // Name of weapon icon file int numBarrels; // how many barrels should we expect for this weapon? - char missileMdl[64]; // Missile Model - char missileSound[64]; // Missile flight sound + char missileMdl[MAX_QPATH]; // Missile Model + char missileSound[MAX_QPATH]; // Missile flight sound float missileDlight; // what is says vec3_t missileDlightColor; // ditto - char alt_missileMdl[64]; // Missile Model - char alt_missileSound[64]; // Missile sound + char alt_missileMdl[MAX_QPATH]; // Missile Model + char alt_missileSound[MAX_QPATH]; // Missile sound float alt_missileDlight; // what is says vec3_t alt_missileDlightColor; // ditto - char missileHitSound[64]; // Missile impact sound - char altmissileHitSound[64]; // alt Missile impact sound + char missileHitSound[MAX_QPATH]; // Missile impact sound + char altmissileHitSound[MAX_QPATH]; // alt Missile impact sound void *func; void *altfunc; - char mMuzzleEffect[64]; + char mMuzzleEffect[MAX_QPATH]; int mMuzzleEffectID; - char mAltMuzzleEffect[64]; + char mAltMuzzleEffect[MAX_QPATH]; int mAltMuzzleEffectID; int damage; @@ -156,13 +157,16 @@ typedef struct weaponData_s int altSplashDamage; float splashRadius; float altSplashRadius; + + bool bNoHandModel; + char skinPath[MAX_QPATH]; } weaponData_t; typedef struct ammoData_s { - char icon[64]; // Name of ammo icon file + char icon[MAX_QPATH]; // Name of ammo icon file int max; // Max amount player can hold of ammo } ammoData_t; diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index d296b75cf6..a2dabcd73f 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -7484,7 +7484,7 @@ void WP_SaberFireGun( gentity_t *self, usercmd_t *ucmd, int whichGun ) if ( !self->weaponModel[1] || (self->weaponModel[1] == -1) ) { - G_CreateG2AttachedWeaponModel( self, weaponData[whichGun].weaponMdl, self->handLBolt, 1 ); + G_CreateG2AttachedWeaponModel( self, weaponData[whichGun].worldModel, self->handLBolt, 1 ); } addTime = weaponData[whichGun].fireTime; From 534daca2cf04a722cc08239c8c740ded162813ab Mon Sep 17 00:00:00 2001 From: redsaurus Date: Mon, 29 Dec 2014 12:33:41 +0000 Subject: [PATCH 394/445] Ships: trigger_space --- code/game/g_active.cpp | 2 +- code/game/g_functions.cpp | 3 ++- code/game/g_functions.h | 2 ++ code/game/g_trigger.cpp | 7 ++++--- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index facaace772..da1524cd02 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -5216,7 +5216,7 @@ extern cvar_t *g_skippingcin; //FIXME: if global gravity changes this should update everyone's personal gravity... if ( !(ent->svFlags & SVF_CUSTOM_GRAVITY) ) { - if (ent->client->inSpaceIndex) + if (ent->client->inSpaceIndex && ent->client->inSpaceIndex != ENTITYNUM_NONE) { //in space, so no gravity... client->ps.gravity = 0.0f; } diff --git a/code/game/g_functions.cpp b/code/game/g_functions.cpp index 822f4413e5..9b862eb6ff 100644 --- a/code/game/g_functions.cpp +++ b/code/game/g_functions.cpp @@ -234,7 +234,8 @@ void GEntity_TouchFunc(gentity_t *self, gentity_t *other, trace_t *trace) TOUCHCASE( prox_mine_stick ) TOUCHCASE( func_rotating_touch ) TOUCHCASE( TouchTieBomb ) - + TOUCHCASE( space_touch ) + default: Com_Error(ERR_DROP, "GEntity_TouchFunc: case %d not handled!\n",self->e_TouchFunc); } diff --git a/code/game/g_functions.h b/code/game/g_functions.h index 07a4d24bba..467de798c9 100644 --- a/code/game/g_functions.h +++ b/code/game/g_functions.h @@ -327,6 +327,7 @@ typedef enum touchF_prox_mine_stick, touchF_func_rotating_touch, touchF_TouchTieBomb, + touchF_space_touch, } touchFunc_t; // TOUCH functions... @@ -350,6 +351,7 @@ extern void prox_mine_stick( gentity_t *self, gentity_t *other, trace_t *trace ) extern void func_rotating_touch (gentity_t *self, gentity_t *other, trace_t *trace); extern void TouchTieBomb( gentity_t *self, gentity_t *other, trace_t *trace ); extern void TieFighterUse( gentity_t *self, gentity_t *other, gentity_t *activator ); +extern void space_touch( gentity_t *self, gentity_t *other, trace_t *trace ); // void (*use)(gentity_t *self, gentity_t *other, gentity_t *activator); typedef enum diff --git a/code/game/g_trigger.cpp b/code/game/g_trigger.cpp index f1118c96bf..5122bec09a 100644 --- a/code/game/g_trigger.cpp +++ b/code/game/g_trigger.cpp @@ -1332,6 +1332,8 @@ void space_touch( gentity_t *self, gentity_t *other, trace_t *trace ) if (veh->inuse && veh->client && veh->m_pVehicle && veh->m_pVehicle->m_pVehicleInfo->hideRider) { //if they are "inside" a vehicle, then let that protect them from THE HORRORS OF SPACE. + other->client->inSpaceSuffocation = 0; + other->client->inSpaceIndex = ENTITYNUM_NONE; return; } } @@ -1358,9 +1360,8 @@ void SP_trigger_space(gentity_t *self) { InitTrigger(self); self->contents = CONTENTS_TRIGGER; - - //FIXME: implement!!! - //self->e_TouchFunc = touchF_space_touch; + + self->e_TouchFunc = touchF_space_touch; gi.linkentity(self); } From f72fdc8c6f4373895a5d571d5a91705114c77425 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Mon, 29 Dec 2014 12:51:34 +0000 Subject: [PATCH 395/445] Ships: trigger_shipboundary --- code/game/bg_public.h | 5 ++++ code/game/g_functions.cpp | 5 +++- code/game/g_functions.h | 6 +++++ code/game/g_trigger.cpp | 49 ++++++++++++++++++++++++++++++++++++++- 4 files changed, 63 insertions(+), 2 deletions(-) diff --git a/code/game/bg_public.h b/code/game/bg_public.h index 459829d432..1e404ce0e6 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -763,4 +763,9 @@ void PlayerStateToEntityState( playerState_t *ps, entityState_t *s ); qboolean BG_PlayerTouchesItem( playerState_t *ps, entityState_t *item, int atTime ); +#define HYPERSPACE_TIME 4000 //For hyperspace triggers +#define HYPERSPACE_TELEPORT_FRAC 0.75f +#define HYPERSPACE_SPEED 10000.0f//was 30000 +#define HYPERSPACE_TURN_RATE 45.0f + #endif//#ifndef __BG_PUBLIC_H__ diff --git a/code/game/g_functions.cpp b/code/game/g_functions.cpp index 9b862eb6ff..1746c6f2b8 100644 --- a/code/game/g_functions.cpp +++ b/code/game/g_functions.cpp @@ -138,7 +138,9 @@ void GEntity_ThinkFunc(gentity_t *self) THINKCASE( misc_weapon_shooter_fire ) THINKCASE( beacon_think ) - + + THINKCASE( shipboundary_think ) + default: Com_Error(ERR_DROP, "GEntity_ThinkFunc: case %d not handled!\n",self->e_ThinkFunc); break; @@ -235,6 +237,7 @@ void GEntity_TouchFunc(gentity_t *self, gentity_t *other, trace_t *trace) TOUCHCASE( func_rotating_touch ) TOUCHCASE( TouchTieBomb ) TOUCHCASE( space_touch ) + TOUCHCASE( shipboundary_touch ) default: Com_Error(ERR_DROP, "GEntity_TouchFunc: case %d not handled!\n",self->e_TouchFunc); diff --git a/code/game/g_functions.h b/code/game/g_functions.h index 467de798c9..f13872e6d9 100644 --- a/code/game/g_functions.h +++ b/code/game/g_functions.h @@ -141,6 +141,8 @@ typedef enum //rww - added for sky portals thinkF_G_PortalifyEntities, + + thinkF_shipboundary_think, } thinkFunc_t; @@ -249,6 +251,8 @@ extern void misc_weapon_shooter_fire( gentity_t *self ); extern void beacon_think ( gentity_t *self ); +extern void shipboundary_think ( gentity_t *ent ); + // void (*clThink)(centity_s *cent); //Think func for equivalent centity typedef enum @@ -328,6 +332,7 @@ typedef enum touchF_func_rotating_touch, touchF_TouchTieBomb, touchF_space_touch, + touchF_shipboundary_touch, } touchFunc_t; // TOUCH functions... @@ -352,6 +357,7 @@ extern void func_rotating_touch (gentity_t *self, gentity_t *other, trace_t * extern void TouchTieBomb( gentity_t *self, gentity_t *other, trace_t *trace ); extern void TieFighterUse( gentity_t *self, gentity_t *other, gentity_t *activator ); extern void space_touch( gentity_t *self, gentity_t *other, trace_t *trace ); +extern void shipboundary_touch( gentity_t *self, gentity_t *other, trace_t *trace ); // void (*use)(gentity_t *self, gentity_t *other, gentity_t *activator); typedef enum diff --git a/code/game/g_trigger.cpp b/code/game/g_trigger.cpp index 5122bec09a..b404278768 100644 --- a/code/game/g_trigger.cpp +++ b/code/game/g_trigger.cpp @@ -1376,6 +1376,11 @@ void shipboundary_touch( gentity_t *self, gentity_t *other, trace_t *trace ) { //only let vehicles touch return; } + + if ( other->client->ps.hyperSpaceTime && level.time - other->client->ps.hyperSpaceTime < HYPERSPACE_TIME ) + {//don't interfere with hyperspacing ships + return; + } ent = G_Find (NULL, FOFS(targetname), self->target); if (!ent || !ent->inuse) @@ -1389,9 +1394,49 @@ void shipboundary_touch( gentity_t *self, gentity_t *other, trace_t *trace ) G_Damage(other, other, other, NULL, other->client->ps.origin, 99999, DAMAGE_NO_PROTECTION, MOD_SUICIDE); return; } + + //make sure this sucker is linked so the prediction knows where to go + gi.linkentity(self); other->client->ps.vehTurnaroundIndex = ent->s.number; other->client->ps.vehTurnaroundTime = level.time + self->count; + + //keep up the detailed checks for another 2 seconds + self->bounceCount = level.time + 2000; +} + +void shipboundary_think(gentity_t *ent) +{ + gentity_t *entityList[MAX_GENTITIES]; + int numListedEntities; + int i = 0; + gentity_t *listedEnt; + + ent->nextthink = level.time + 100; + + if (ent->bounceCount < level.time) + { //don't need to be doing this check, no one has touched recently + return; + } + + numListedEntities = gi.EntitiesInBox( ent->absmin, ent->absmax, entityList, MAX_GENTITIES ); + while (i < numListedEntities) + { + listedEnt = entityList[i]; + if (listedEnt->inuse && listedEnt->client && listedEnt->s.m_iVehicleNum) + { + if (listedEnt->NPC && + listedEnt->client->NPC_class == CLASS_VEHICLE) + { + Vehicle_t *pVeh = listedEnt->m_pVehicle; + if (pVeh && pVeh->m_pVehicleInfo->type == VH_FIGHTER) + { + shipboundary_touch(ent, listedEnt, NULL); + } + } + } + i++; + } } /*QUAKED trigger_shipboundary (.5 .5 .5) ? @@ -1418,7 +1463,9 @@ void SP_trigger_shipboundary(gentity_t *self) } //FIXME: implement! - //self->e_TouchFunc = touchF_shipboundary_touch; + self->e_TouchFunc = touchF_shipboundary_touch; + self->nextthink = level.time + 500; + self->e_ThinkFunc = thinkF_shipboundary_think; gi.linkentity(self); } From 0b0f6507451811de926228057f61a1af388a1376 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Mon, 29 Dec 2014 17:46:19 +0000 Subject: [PATCH 396/445] Ships: fixes; started work on trigger_hyperspace --- code/game/FighterNPC.cpp | 4 -- code/game/bg_pmove.cpp | 87 +++++++++++++++++++++- code/game/bg_public.h | 3 + code/game/bg_slidemove.cpp | 2 +- code/game/g_functions.cpp | 1 + code/game/g_functions.h | 2 + code/game/g_mover.cpp | 9 +++ code/game/g_spawn.cpp | 2 + code/game/g_trigger.cpp | 144 +++++++++++++++++++++++++++++++++++-- code/qcommon/q_shared.h | 17 ++++- 10 files changed, 258 insertions(+), 13 deletions(-) diff --git a/code/game/FighterNPC.cpp b/code/game/FighterNPC.cpp index dfab7bd2af..6919bb028f 100644 --- a/code/game/FighterNPC.cpp +++ b/code/game/FighterNPC.cpp @@ -403,7 +403,6 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) playerState_t *parentPS = &parent->client->ps; #endif -#ifdef _JK2MP if ( parentPS->hyperSpaceTime && curTime - parentPS->hyperSpaceTime < HYPERSPACE_TIME ) {//Going to Hyperspace @@ -442,7 +441,6 @@ static void ProcessMoveCommands( Vehicle_t *pVeh ) } return; } -#endif if ( pVeh->m_iDropTime >= curTime ) {//no speed, just drop @@ -1231,7 +1229,6 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) isDead = (qboolean)(parentPS->stats[STAT_HEALTH] <= 0 ); #endif -#ifdef _JK2MP if ( parentPS->hyperSpaceTime && (curTime - parentPS->hyperSpaceTime) < HYPERSPACE_TIME ) {//Going to Hyperspace @@ -1239,7 +1236,6 @@ static void ProcessOrientCommands( Vehicle_t *pVeh ) VectorCopy( riderPS->viewangles, parentPS->viewangles ); return; } -#endif if ( pVeh->m_iDropTime >= curTime ) {//you can only YAW during this diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 30bd2b63e0..dccb527153 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -14815,7 +14815,7 @@ void PM_CheckInVehicleSaberAttackAnim( void ) //force the vehicle to turn and travel to its forced destination point void PM_VehForcedTurning( gentity_t *veh ) { - gentity_t *dst = &g_entities[pm->ps->vehTurnaroundIndex]; + gentity_t *dst = &g_entities[veh->client->ps.vehTurnaroundIndex]; float pitchD, yawD; vec3_t dir; @@ -14848,6 +14848,81 @@ void PM_VehForcedTurning( gentity_t *veh ) //PM_SetPMViewAngle(pm->ps, pm->ps->viewangles, &pm->cmd); SetClientViewAngle(pm->gent, pm->ps->viewangles); } + +void PM_VehFaceHyperspacePoint(gentity_t *veh) +{ + + if (!veh || !veh->m_pVehicle) + { + return; + } + else + { + float timeFrac = ((float)(pm->cmd.serverTime-veh->client->ps.hyperSpaceTime))/HYPERSPACE_TIME; + float turnRate, aDelta; + int i, matchedAxes = 0; + + pm->cmd.upmove = veh->m_pVehicle->m_ucmd.upmove = 127; + pm->cmd.forwardmove = veh->m_pVehicle->m_ucmd.forwardmove = 0; + pm->cmd.rightmove = veh->m_pVehicle->m_ucmd.rightmove = 0; + + turnRate = (90.0f*pml.frametime); + for ( i = 0; i < 3; i++ ) + { + aDelta = AngleSubtract(veh->client->ps.hyperSpaceAngles[i], veh->m_pVehicle->m_vOrientation[i]); + if ( fabs( aDelta ) < turnRate ) + {//all is good + pm->ps->viewangles[i] = veh->client->ps.hyperSpaceAngles[i]; + matchedAxes++; + } + else + { + aDelta = AngleSubtract(veh->client->ps.hyperSpaceAngles[i], pm->ps->viewangles[i]); + if ( fabs( aDelta ) < turnRate ) + { + pm->ps->viewangles[i] = veh->client->ps.hyperSpaceAngles[i]; + } + else if ( aDelta > 0 ) + { + if ( i == YAW ) + { + pm->ps->viewangles[i] = AngleNormalize360( pm->ps->viewangles[i]+turnRate ); + } + else + { + pm->ps->viewangles[i] = AngleNormalize180( pm->ps->viewangles[i]+turnRate ); + } + } + else + { + if ( i == YAW ) + { + pm->ps->viewangles[i] = AngleNormalize360( pm->ps->viewangles[i]-turnRate ); + } + else + { + pm->ps->viewangles[i] = AngleNormalize180( pm->ps->viewangles[i]-turnRate ); + } + } + } + } + + SetClientViewAngle(pm->gent, pm->ps->viewangles); + + if ( timeFrac < HYPERSPACE_TELEPORT_FRAC ) + {//haven't gone through yet + if ( matchedAxes < 3 ) + {//not facing the right dir yet + //keep hyperspace time up to date + veh->client->ps.hyperSpaceTime += pml.msec; + } + else if ( !(veh->client->ps.eFlags2&EF2_HYPERSPACE)) + {//flag us as ready to hyperspace! + veh->client->ps.eFlags2 |= EF2_HYPERSPACE; + } + } + } +} /* ================ Pmove @@ -14919,9 +14994,15 @@ void Pmove( pmove_t *pmove ) } else if ( pm->gent && PM_RidingVehicle() ) { - if ( pm->ps->vehTurnaroundIndex - && pm->ps->vehTurnaroundTime > pm->cmd.serverTime ) + if ( (&g_entities[pm->gent->s.m_iVehicleNum])->client && + (pm->cmd.serverTime-(&g_entities[pm->gent->s.m_iVehicleNum])->client->ps.hyperSpaceTime) < HYPERSPACE_TIME) + { //going into hyperspace, turn to face the right angles + PM_VehFaceHyperspacePoint( &g_entities[pm->gent->s.m_iVehicleNum] ); + } + else if ( (&g_entities[pm->gent->s.m_iVehicleNum])->client && (&g_entities[pm->gent->s.m_iVehicleNum])->client->ps.vehTurnaroundIndex + && (&g_entities[pm->gent->s.m_iVehicleNum])->client->ps.vehTurnaroundTime > pm->cmd.serverTime ) { //riding this vehicle, turn my view too + Com_Printf("forced turning!\n"); PM_VehForcedTurning( &g_entities[pm->gent->s.m_iVehicleNum] ); } } diff --git a/code/game/bg_public.h b/code/game/bg_public.h index 1e404ce0e6..bd69d96c5b 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -242,6 +242,9 @@ typedef enum { #define EF_FORCE_DRAINED 0x40000000 // Force drained effect #define EF_BLOCKED_MOVER 0x80000000 // for movers that are blocked - shared with previous +//These new EF2_??? flags were added for NPCs, they really should not be used often. Taken from MP. +#define EF2_HYPERSPACE (1<<5) // Used to both start the hyperspace effect on the predicted client and to let the vehicle know it can now jump into hyperspace (after turning to face the proper angle) + typedef enum { PW_NONE, PW_QUAD,// This can go away diff --git a/code/game/bg_slidemove.cpp b/code/game/bg_slidemove.cpp index 52d1fb4e0f..f962e9b240 100644 --- a/code/game/bg_slidemove.cpp +++ b/code/game/bg_slidemove.cpp @@ -199,7 +199,7 @@ qboolean PM_SlideMove( float gravMod ) { continue; } - if (pm->gent->client && + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE && trace.plane.normal[2]gent->m_pVehicle->m_pVehicleInfo->maxSlope ) diff --git a/code/game/g_functions.cpp b/code/game/g_functions.cpp index 1746c6f2b8..c21c3a5980 100644 --- a/code/game/g_functions.cpp +++ b/code/game/g_functions.cpp @@ -238,6 +238,7 @@ void GEntity_TouchFunc(gentity_t *self, gentity_t *other, trace_t *trace) TOUCHCASE( TouchTieBomb ) TOUCHCASE( space_touch ) TOUCHCASE( shipboundary_touch ) + TOUCHCASE( hyperspace_touch ) default: Com_Error(ERR_DROP, "GEntity_TouchFunc: case %d not handled!\n",self->e_TouchFunc); diff --git a/code/game/g_functions.h b/code/game/g_functions.h index f13872e6d9..fd0ed9121e 100644 --- a/code/game/g_functions.h +++ b/code/game/g_functions.h @@ -333,6 +333,7 @@ typedef enum touchF_TouchTieBomb, touchF_space_touch, touchF_shipboundary_touch, + touchF_hyperspace_touch, } touchFunc_t; // TOUCH functions... @@ -358,6 +359,7 @@ extern void TouchTieBomb( gentity_t *self, gentity_t *other, trace_t *trace ); extern void TieFighterUse( gentity_t *self, gentity_t *other, gentity_t *activator ); extern void space_touch( gentity_t *self, gentity_t *other, trace_t *trace ); extern void shipboundary_touch( gentity_t *self, gentity_t *other, trace_t *trace ); +extern void hyperspace_touch( gentity_t *self, gentity_t *other, trace_t *trace ); // void (*use)(gentity_t *self, gentity_t *other, gentity_t *activator); typedef enum diff --git a/code/game/g_mover.cpp b/code/game/g_mover.cpp index 47919bd955..288a6f4450 100644 --- a/code/game/g_mover.cpp +++ b/code/game/g_mover.cpp @@ -2218,6 +2218,15 @@ void SP_func_static( gentity_t *ent ) ent->damage = 2; } } + + int test; + G_SpawnInt( "hyperspace", "0", &test ); + if ( test ) + { + //ent->r.svFlags |= SVF_BROADCAST; // I need to rotate something that is huge and it's touching too many area portals... + ent->s.eFlags2 |= EF2_HYPERSPACE; + } + gi.linkentity( ent ); if (level.mBSPInstanceDepth) diff --git a/code/game/g_spawn.cpp b/code/game/g_spawn.cpp index d279621b0e..0a0aa74359 100644 --- a/code/game/g_spawn.cpp +++ b/code/game/g_spawn.cpp @@ -415,6 +415,7 @@ void SP_trigger_location( gentity_t *ent ); void SP_trigger_visible( gentity_t *self ); void SP_trigger_space(gentity_t *self); void SP_trigger_shipboundary(gentity_t *self); +void SP_trigger_hyperspace(gentity_t *self); void SP_target_give (gentity_t *ent); void SP_target_delay (gentity_t *ent); @@ -653,6 +654,7 @@ spawn_t spawns[] = { {"trigger_visible", SP_trigger_visible}, {"trigger_space", SP_trigger_space}, {"trigger_shipboundary", SP_trigger_shipboundary}, + { "trigger_hyperspace", SP_trigger_hyperspace }, {"target_give", SP_target_give}, {"target_delay", SP_target_delay}, diff --git a/code/game/g_trigger.cpp b/code/game/g_trigger.cpp index b404278768..98df918a38 100644 --- a/code/game/g_trigger.cpp +++ b/code/game/g_trigger.cpp @@ -1324,8 +1324,7 @@ void space_touch( gentity_t *self, gentity_t *other, trace_t *trace ) return; } - if (other->s.m_iVehicleNum - && other->s.m_iVehicleNum <= MAX_CLIENTS ) + if (other->s.m_iVehicleNum) {//a player client inside a vehicle gentity_t *veh = &g_entities[other->s.m_iVehicleNum]; @@ -1396,10 +1395,10 @@ void shipboundary_touch( gentity_t *self, gentity_t *other, trace_t *trace ) } //make sure this sucker is linked so the prediction knows where to go - gi.linkentity(self); + gi.linkentity(ent); other->client->ps.vehTurnaroundIndex = ent->s.number; - other->client->ps.vehTurnaroundTime = level.time + self->count; + other->client->ps.vehTurnaroundTime = level.time + (self->count*2); //keep up the detailed checks for another 2 seconds self->bounceCount = level.time + 2000; @@ -1469,6 +1468,143 @@ void SP_trigger_shipboundary(gentity_t *self) gi.linkentity(self); } + +void hyperspace_touch( gentity_t *self, gentity_t *other, trace_t *trace ) +{ + gentity_t *ent; + + if (!other || !other->inuse || !other->client || + other->s.number < MAX_CLIENTS || + !other->m_pVehicle) + { //only let vehicles touch + return; + } + + if ( other->client->ps.hyperSpaceTime && level.time - other->client->ps.hyperSpaceTime < HYPERSPACE_TIME ) + {//already hyperspacing, just keep us moving + if ( other->client->ps.eFlags2&EF2_HYPERSPACE ) + {//they've started the hyperspace but haven't been teleported yet + float timeFrac = ((float)(level.time-other->client->ps.hyperSpaceTime))/HYPERSPACE_TIME; + if ( timeFrac >= HYPERSPACE_TELEPORT_FRAC ) + {//half-way, now teleport them! + vec3_t diff, fwd, right, up, newOrg; + float fDiff, rDiff, uDiff; + //take off the flag so we only do this once + other->client->ps.eFlags &= ~qfalse; + //Get the offset from the local position + ent = G_Find (NULL, FOFS(targetname), self->target); + if (!ent || !ent->inuse) + { //this is bad + G_Error( "trigger_hyperspace has invalid target '%s'\n", self->target ); + return; + } + VectorSubtract( other->client->ps.origin, ent->s.origin, diff ); + AngleVectors( ent->s.angles, fwd, right, up ); + fDiff = DotProduct( fwd, diff ); + rDiff = DotProduct( right, diff ); + uDiff = DotProduct( up, diff ); + //Now get the base position of the destination + ent = G_Find (NULL, FOFS(targetname), self->target2); + if (!ent || !ent->inuse) + { //this is bad + G_Error( "trigger_hyperspace has invalid target2 '%s'\n", self->target2 ); + return; + } + VectorCopy( ent->s.origin, newOrg ); + //finally, add the offset into the new origin + AngleVectors( ent->s.angles, fwd, right, up ); + VectorMA( newOrg, fDiff, fwd, newOrg ); + VectorMA( newOrg, rDiff, right, newOrg ); + VectorMA( newOrg, uDiff, up, newOrg ); + //trap->Print("hyperspace from %s to %s\n", vtos(other->client->ps.origin), vtos(newOrg) ); + //now put them in the offset position, facing the angles that position wants them to be facing + TeleportPlayer( other, newOrg, ent->s.angles ); + if ( other->m_pVehicle && other->m_pVehicle->m_pPilot ) + {//teleport the pilot, too + TeleportPlayer( (gentity_t*)other->m_pVehicle->m_pPilot, newOrg, ent->s.angles ); + //FIXME: and the passengers? + } + //make them face the new angle + //other->client->ps.hyperSpaceIndex = ent->s.number; + VectorCopy( ent->s.angles, other->client->ps.hyperSpaceAngles ); + //sound + G_SoundOnEnt( other, CHAN_LOCAL, "sound/vehicles/common/hyperend.wav"); + } + } + return; + } + else + { + ent = G_Find (NULL, FOFS(targetname), self->target); + if (!ent || !ent->inuse) + { //this is bad + G_Error( "trigger_hyperspace has invalid target '%s'\n", self->target ); + return; + } + + if (!other->s.m_iVehicleNum || other->m_pVehicle->m_iRemovedSurfaces) + { //if a vehicle touches a boundary without a pilot in it or with parts missing, just blow the thing up + G_Damage(other, other, other, NULL, other->client->ps.origin, 99999, DAMAGE_NO_PROTECTION, MOD_SUICIDE); + return; + } + //other->client->ps.hyperSpaceIndex = ent->s.number; + VectorCopy( ent->s.angles, other->client->ps.hyperSpaceAngles ); + other->client->ps.hyperSpaceTime = level.time; + } +} + +/* + void trigger_hyperspace_find_targets( gentity_t *self ) + { + gentity_t *targEnt = NULL; + targEnt = G_Find (NULL, FOFS(targetname), self->target); + if (!targEnt || !targEnt->inuse) + { //this is bad + trap->Error( ERR_DROP, "trigger_hyperspace has invalid target '%s'\n", self->target ); + return; + } + targEnt->r.svFlags |= SVF_BROADCAST;//crap, need to tell the cgame about the target_position + targEnt = G_Find (NULL, FOFS(targetname), self->target2); + if (!targEnt || !targEnt->inuse) + { //this is bad + trap->Error( ERR_DROP, "trigger_hyperspace has invalid target2 '%s'\n", self->target2 ); + return; + } + targEnt->r.svFlags |= SVF_BROADCAST;//crap, need to tell the cgame about the target_position + } + */ +/*QUAKED trigger_hyperspace (.5 .5 .5) ? + Ship will turn to face the angles of the first target_position then fly forward, playing the hyperspace effect, then pop out at a relative point around the target + + "target" whatever position the ship teleports from in relation to the target_position specified here, that's the relative position the ship will spawn at around the target2 target_position + "target2" name of target_position to teleport the ship to (will be relative to it's origin) + */ +void SP_trigger_hyperspace(gentity_t *self) +{ + //register the hyperspace end sound (start sounds are customized) + G_SoundIndex( "sound/vehicles/common/hyperend.wav" ); + + InitTrigger(self); + self->contents = CONTENTS_TRIGGER; + + if (!self->target || !self->target[0]) + { + G_Error( "trigger_hyperspace without a target." ); + } + if (!self->target2 || !self->target2[0]) + { + G_Error( "trigger_hyperspace without a target2." ); + } + + self->delay = Distance( self->absmax, self->absmin );//my size + + self->e_TouchFunc = touchF_hyperspace_touch; + + gi.linkentity(self); + + //self->think = trigger_hyperspace_find_targets; + //self->nextthink = level.time + FRAMETIME; +} /* ============================================================================== diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 63c6b9b412..1fa67f1d5a 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -1627,6 +1627,7 @@ class PlayerStateBase // used to twist the legs during strafing int eFlags; // copied to entityState_t->eFlags + int eFlags2; int eventSequence; // pmove generated events int events[MAX_PS_EVENTS]; @@ -1919,9 +1920,12 @@ class PlayerStateBase //NOTE: not really used in SP, just for Fighter Vehicle damage stuff int brokenLimbs; int electrifyTime; + + //when hyperspacing, you just go forward really fast for HYPERSPACE_TIME + int hyperSpaceTime; + vec3_t hyperSpaceAngles; #endif // !JK2_MODE - void sg_export( ojk::SavedGameHelper& saved_game) const { @@ -1947,6 +1951,7 @@ class PlayerStateBase saved_game.write(torsoAnimTimer); saved_game.write(movementDir); saved_game.write(eFlags); + saved_game.write(eFlags2); saved_game.write(eventSequence); saved_game.write(events); saved_game.write(eventParms); @@ -2088,6 +2093,9 @@ class PlayerStateBase saved_game.write(vehTurnaroundTime); saved_game.write(brokenLimbs); saved_game.write(electrifyTime); + + saved_game.write(hyperSpaceTime); + saved_game.write(hyperSpaceAngles); #endif // !JK2_MODE } @@ -2116,6 +2124,7 @@ class PlayerStateBase saved_game.read(torsoAnimTimer); saved_game.read(movementDir); saved_game.read(eFlags); + saved_game.read(eFlags2); saved_game.read(eventSequence); saved_game.read(events); saved_game.read(eventParms); @@ -2257,6 +2266,9 @@ class PlayerStateBase saved_game.read(vehTurnaroundTime); saved_game.read(brokenLimbs); saved_game.read(electrifyTime); + + saved_game.read(hyperSpaceTime); + saved_game.read(hyperSpaceAngles); #endif // !JK2_MODE } }; // PlayerStateBase @@ -2404,6 +2416,7 @@ typedef struct entityState_s {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!! int number; // entity index int eType; // entityType_t int eFlags; + int eFlags2; trajectory_t pos; // for calculating position trajectory_t apos; // for calculating angles @@ -2483,6 +2496,7 @@ Ghoul2 Insert End saved_game.write(number); saved_game.write(eType); saved_game.write(eFlags); + saved_game.write(eFlags2); saved_game.write<>(pos); saved_game.write<>(apos); saved_game.write(time); @@ -2539,6 +2553,7 @@ Ghoul2 Insert End saved_game.read(number); saved_game.read(eType); saved_game.read(eFlags); + saved_game.read(eFlags2); saved_game.read<>(pos); saved_game.read<>(apos); saved_game.read(time); From d8dcf67f6f85d4c6f928793102ec3810e8160738 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Mon, 29 Dec 2014 18:36:51 +0000 Subject: [PATCH 397/445] Ships: started on trigger_asteroid_field probably has problems --- code/game/Q3_Interface.cpp | 2 +- code/game/g_functions.cpp | 1 + code/game/g_functions.h | 2 + code/game/g_spawn.cpp | 2 + code/game/g_trigger.cpp | 190 +++++++++++++++++++++++++++++++++++++ 5 files changed, 196 insertions(+), 1 deletion(-) diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 08cf191ce8..86a72f348a 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -1670,7 +1670,7 @@ Q3_Lerp2Origin Lerps the origin to the destination value ============= */ -static void Q3_Lerp2Origin( int taskID, int entID, vec3_t origin, float duration ) +void Q3_Lerp2Origin( int taskID, int entID, vec3_t origin, float duration ) { gentity_t *ent = &g_entities[entID]; diff --git a/code/game/g_functions.cpp b/code/game/g_functions.cpp index c21c3a5980..216dabe38a 100644 --- a/code/game/g_functions.cpp +++ b/code/game/g_functions.cpp @@ -140,6 +140,7 @@ void GEntity_ThinkFunc(gentity_t *self) THINKCASE( beacon_think ) THINKCASE( shipboundary_think ) + THINKCASE( asteroid_field_think ) default: Com_Error(ERR_DROP, "GEntity_ThinkFunc: case %d not handled!\n",self->e_ThinkFunc); diff --git a/code/game/g_functions.h b/code/game/g_functions.h index fd0ed9121e..44a3e30017 100644 --- a/code/game/g_functions.h +++ b/code/game/g_functions.h @@ -143,6 +143,7 @@ typedef enum thinkF_G_PortalifyEntities, thinkF_shipboundary_think, + thinkF_asteroid_field_think, } thinkFunc_t; @@ -252,6 +253,7 @@ extern void misc_weapon_shooter_fire( gentity_t *self ); extern void beacon_think ( gentity_t *self ); extern void shipboundary_think ( gentity_t *ent ); +extern void asteroid_field_think ( gentity_t *self ); // void (*clThink)(centity_s *cent); //Think func for equivalent centity diff --git a/code/game/g_spawn.cpp b/code/game/g_spawn.cpp index 0a0aa74359..0ff508c9cd 100644 --- a/code/game/g_spawn.cpp +++ b/code/game/g_spawn.cpp @@ -416,6 +416,7 @@ void SP_trigger_visible( gentity_t *self ); void SP_trigger_space(gentity_t *self); void SP_trigger_shipboundary(gentity_t *self); void SP_trigger_hyperspace(gentity_t *self); +void SP_trigger_asteroid_field(gentity_t *self); void SP_target_give (gentity_t *ent); void SP_target_delay (gentity_t *ent); @@ -655,6 +656,7 @@ spawn_t spawns[] = { {"trigger_space", SP_trigger_space}, {"trigger_shipboundary", SP_trigger_shipboundary}, { "trigger_hyperspace", SP_trigger_hyperspace }, + { "trigger_asteroid_field", SP_trigger_asteroid_field }, {"target_give", SP_target_give}, {"target_delay", SP_target_delay}, diff --git a/code/game/g_trigger.cpp b/code/game/g_trigger.cpp index 98df918a38..3a1ad1c6ad 100644 --- a/code/game/g_trigger.cpp +++ b/code/game/g_trigger.cpp @@ -1605,6 +1605,196 @@ void SP_trigger_hyperspace(gentity_t *self) //self->think = trigger_hyperspace_find_targets; //self->nextthink = level.time + FRAMETIME; } + +gentity_t *asteroid_pick_random_asteroid( gentity_t *self ) +{ + int t_count = 0, pick; + gentity_t *t = NULL; + + while ( (t = G_Find (t, FOFS(targetname), self->target)) != NULL ) + { + if (t != self) + { + t_count++; + } + } + + if(!t_count) + { + return NULL; + } + + if(t_count == 1) + { + return t; + } + + //FIXME: need a seed + pick = Q_irand(1, t_count); + t_count = 0; + while ( (t = G_Find (t, FOFS(targetname), self->target)) != NULL ) + { + if (t != self) + { + t_count++; + } + else + { + continue; + } + + if(t_count == pick) + { + return t; + } + } + return NULL; +} + +int asteroid_count_num_asteroids( gentity_t *self ) +{ + int i, count = 0; + + for ( i = MAX_CLIENTS; i < ENTITYNUM_WORLD; i++ ) + { + if ( !g_entities[i].inuse ) + { + continue; + } + if ( g_entities[i].owner == self ) + { + count++; + } + } + return count; +} + +extern void SP_func_rotating (gentity_t *ent); +extern void Q3_Lerp2Origin( int taskID, int entID, vec3_t origin, float duration ); +void asteroid_field_think(gentity_t *self) +{ + int numAsteroids = asteroid_count_num_asteroids( self ); + + self->nextthink = level.time + 500; + + if ( numAsteroids < self->count ) + { + //need to spawn a new asteroid + gentity_t *newAsteroid = G_Spawn(); + if ( newAsteroid ) + { + vec3_t startSpot, endSpot, startAngles; + float dist, speed = Q_flrand( self->speed * 0.25f, self->speed * 2.0f ); + int capAxis, axis, time = 0; + gentity_t *copyAsteroid = asteroid_pick_random_asteroid( self ); + if ( copyAsteroid ) + { + newAsteroid->model = G_NewString(copyAsteroid->model); + newAsteroid->model2 = copyAsteroid->model2; + newAsteroid->health = copyAsteroid->health; + newAsteroid->spawnflags = copyAsteroid->spawnflags; + newAsteroid->mass = copyAsteroid->mass; + newAsteroid->damage = copyAsteroid->damage; + newAsteroid->speed = copyAsteroid->speed; + + G_SetOrigin( newAsteroid, copyAsteroid->s.origin ); + G_SetAngles( newAsteroid, copyAsteroid->s.angles ); + newAsteroid->classname = "func_rotating"; + + SP_func_rotating( newAsteroid ); + + VectorCopy(copyAsteroid->s.modelScale, newAsteroid->s.modelScale); + VectorSet(newAsteroid->s.modelScale, 2.0, 2.0, 2.0); + //newAsteroid->maxHealth = newAsteroid->health; + newAsteroid->radius = copyAsteroid->radius; + newAsteroid->material = copyAsteroid->material; + //CacheChunkEffects( self->material ); + + //keep track of it + newAsteroid->owner = self; + + //move it + capAxis = Q_irand( 0, 2 ); + for ( axis = 0; axis < 3; axis++ ) + { + if ( axis == capAxis ) + { + if ( Q_irand( 0, 1 ) ) + { + startSpot[axis] = self->mins[axis]; + endSpot[axis] = self->maxs[axis]; + } + else + { + startSpot[axis] = self->maxs[axis]; + endSpot[axis] = self->mins[axis]; + } + } + else + { + startSpot[axis] = self->mins[axis]+(Q_flrand(0,1.0f)*(self->maxs[axis]-self->mins[axis])); + endSpot[axis] = self->mins[axis]+(Q_flrand(0,1.0f)*(self->maxs[axis]-self->mins[axis])); + } + } + //FIXME: maybe trace from start to end to make sure nothing is in the way? How big of a trace? + + G_SetOrigin( newAsteroid, startSpot ); + dist = Distance( endSpot, startSpot ); + time = ceil(dist/speed)*1000; + Q3_Lerp2Origin( -1, newAsteroid->s.number, endSpot, time ); + + //spin it + startAngles[0] = Q_flrand( -360, 360 ); + startAngles[1] = Q_flrand( -360, 360 ); + startAngles[2] = Q_flrand( -360, 360 ); + G_SetAngles( newAsteroid, startAngles ); + newAsteroid->s.apos.trDelta[0] = Q_flrand( -100, 100 ); + newAsteroid->s.apos.trDelta[1] = Q_flrand( -100, 100 ); + newAsteroid->s.apos.trDelta[2] = Q_flrand( -100, 100 ); + newAsteroid->s.apos.trTime = level.time; + newAsteroid->s.apos.trType = TR_LINEAR; + + //remove itself when done + newAsteroid->e_ThinkFunc = thinkF_G_FreeEntity; + newAsteroid->nextthink = level.time+time; + + //think again sooner if need even more + if ( numAsteroids+1 < self->count ) + {//still need at least one more + //spawn it in 100ms + self->nextthink = level.time + 100; + } + } + } + } +} + +/*QUAKED trigger_asteroid_field (.5 .5 .5) ? + speed - how fast, on average, the asteroid moves + count - how many asteroids, max, to have at one time + target - target this at func_rotating asteroids + */ +void SP_trigger_asteroid_field(gentity_t *self) +{ + gi.SetBrushModel( self, self->model ); + self->contents = 0; + + if ( !self->count ) + { + self->health = 20; + } + + if ( !self->speed ) + { + self->speed = 10000; + } + + self->e_ThinkFunc = thinkF_asteroid_field_think; + self->nextthink = level.time + 100; + + gi.linkentity(self); +} + /* ============================================================================== From aef736271329356f2b4468f765834aa2daac3c42 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sat, 7 Jan 2017 19:30:00 +0000 Subject: [PATCH 398/445] Ships: keep at least autosave compatibility for now --- code/game/g_mover.cpp | 2 +- code/qcommon/q_shared.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/g_mover.cpp b/code/game/g_mover.cpp index 288a6f4450..e039a5aca1 100644 --- a/code/game/g_mover.cpp +++ b/code/game/g_mover.cpp @@ -2224,7 +2224,7 @@ void SP_func_static( gentity_t *ent ) if ( test ) { //ent->r.svFlags |= SVF_BROADCAST; // I need to rotate something that is huge and it's touching too many area portals... - ent->s.eFlags2 |= EF2_HYPERSPACE; + // ent->s.eFlags2 |= EF2_HYPERSPACE; } gi.linkentity( ent ); diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 1fa67f1d5a..0c4af48cc4 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -2416,7 +2416,7 @@ typedef struct entityState_s {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!! int number; // entity index int eType; // entityType_t int eFlags; - int eFlags2; +// int eFlags2; trajectory_t pos; // for calculating position trajectory_t apos; // for calculating angles @@ -2496,7 +2496,7 @@ Ghoul2 Insert End saved_game.write(number); saved_game.write(eType); saved_game.write(eFlags); - saved_game.write(eFlags2); +// saved_game.write(eFlags2); saved_game.write<>(pos); saved_game.write<>(apos); saved_game.write(time); @@ -2553,7 +2553,7 @@ Ghoul2 Insert End saved_game.read(number); saved_game.read(eType); saved_game.read(eFlags); - saved_game.read(eFlags2); +// saved_game.read(eFlags2); saved_game.read<>(pos); saved_game.read<>(apos); saved_game.read(time); From a9d5c9a540db736ff824508290ab832a9ac9fdb5 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Mon, 5 Jan 2015 13:59:28 +0000 Subject: [PATCH 399/445] Added .eent files for extra map entities Located at mapentities/mapname.eent, e.g. mapentities/t3_rift.eent or mapentities/mp/ffa3.eent --- code/game/g_main.cpp | 3 +++ code/game/g_spawn.cpp | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 69a1092d82..d5c8dfbcb5 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -767,6 +767,7 @@ InitGame int giMapChecksum; SavedGameJustLoaded_e g_eSavedGameJustLoaded; qboolean g_qbLoadTransition = qfalse; +void G_LoadExtraEntitiesFile( void ); void InitGame( const char *mapname, const char *spawntarget, int checkSum, const char *entities, int levelTime, int randomSeed, int globalTime, SavedGameJustLoaded_e eSavedGameJustLoaded, qboolean qbLoadTransition ) { //rww - default this to 0, we will auto-set it to 1 if we run into a terrain ent @@ -841,6 +842,8 @@ void InitGame( const char *mapname, const char *spawntarget, int checkSum, cons // parse the key/value pairs and spawn gentities G_SpawnEntitiesFromString( entities ); + + G_LoadExtraEntitiesFile(); // general initialization G_FindTeams(); diff --git a/code/game/g_spawn.cpp b/code/game/g_spawn.cpp index 0ff508c9cd..42808951b9 100644 --- a/code/game/g_spawn.cpp +++ b/code/game/g_spawn.cpp @@ -1632,6 +1632,25 @@ void G_SubBSPSpawnEntitiesFromString(const char *entityString, vec3_t posOffset, } } +void G_SpawnExtraEntitiesFromString( const char *entityString ) { + const char *entities; + + entities = entityString; + + // allow calls to G_Spawn*() + spawning = qtrue; + NPCsPrecached = qfalse; + numSpawnVars = 0; + + // parse ents + while( G_ParseSpawnVars( &entities ) ) + { + G_SpawnGEntityFromSpawnVars(); + } + + spawning = qfalse; // any future calls to G_Spawn*() will be errors +} + void G_SpawnEntitiesFromString( const char *entityString ) { const char *entities; @@ -1692,3 +1711,21 @@ void G_SpawnEntitiesFromString( const char *entityString ) { } } +void G_LoadExtraEntitiesFile( void ) +{ + int len; + char *buffer; + + len = gi.FS_ReadFile( va( "mapentities/%s.eent", level.mapname), (void **) &buffer ); + + if ( len == -1 ) + { + return; + } + + G_SpawnExtraEntitiesFromString( buffer ); + + gi.FS_FreeFile( buffer ); +} + + From 4962e05bc5626bb5a5c61a28b9ca9c72b9090da9 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Fri, 23 Oct 2015 17:46:15 +0100 Subject: [PATCH 400/445] SFX Sabers: little fix --- code/cgame/cg_players.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index 0315ea806b..e6536bc0c7 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -5959,7 +5959,7 @@ void CG_DoSFXSaber( vec3_t blade_muz, vec3_t blade_tip, vec3_t trail_tip, vec3_t vec3_t rgb={1,1,1}; CG_RGBForSaberColor( color, rgb ); VectorScale( rgb, 0.66f, rgb ); - cgi_R_AddLightToScene( mid, (blade_len*2.0f) + (random()*10.0f), rgb[0], rgb[1], rgb[2] ); + cgi_R_AddLightToScene( mid, (blade_len*2.0f) + (Q_flrand(0.0f, 1.0f)*10.0f), rgb[0], rgb[1], rgb[2] ); } } From 0e9407eadbdde03dd15a33197d8feb3805152f0b Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sat, 7 Jan 2017 21:11:42 +0000 Subject: [PATCH 401/445] Ignition Flare: little fix --- code/cgame/cg_players.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index e6536bc0c7..e08d824d6a 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -8181,7 +8181,7 @@ extern vmCvar_t cg_thirdPersonAlpha; shader = cgi_R_RegisterShader( "gfx/effects/sabers/flare1black" ); } - FX_AddSprite( org_, cent->gent->client->ps.velocity, NULL, 40.0f, 0.0f, 1.0f, 0.7f, RGB, RGB, random() * 360, 0.0f, 100.0f, shader, FX_USE_ALPHA ); + FX_AddSprite( org_, cent->gent->client->ps.velocity, NULL, 40.0f, 0.0f, 1.0f, 0.7f, RGB, RGB, Q_flrand(0.0f, 1.0f) * 360, 0.0f, 100.0f, shader, FX_USE_ALPHA ); } } From 815a5c516c081ebb03d3986d8ed9822d05de2beb Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sat, 7 Jan 2017 22:06:42 +0000 Subject: [PATCH 402/445] General: add to gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d776da2678..8ec032c4db 100644 --- a/.gitignore +++ b/.gitignore @@ -172,4 +172,6 @@ pip-log.txt ## Unix ############# *.o -*.so \ No newline at end of file +*.so + +xcode From 390258a121ad86d0cfa5382124024b121e7d5fc1 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sun, 19 Apr 2015 19:38:04 +0100 Subject: [PATCH 403/445] Eweb: fixed third person model issues; don't block forcepowers --- code/game/g_client.cpp | 20 +++++++++++++++++--- code/game/wp_saber.cpp | 6 +++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index 9fc84c88b3..d79df1794a 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -1914,7 +1914,14 @@ void G_AddWeaponModels( gentity_t *ent ) } else if ( ent->client->ps.weapon != WP_NONE ) { - G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].worldModel, ent->handRBolt, 0 ); + if ( ent->client->ps.weapon == WP_EMPLACED_GUN && !(ent->client->ps.eFlags & EF_LOCKED_TO_WEAPON) ) + { + G_CreateG2AttachedWeaponModel( ent, "models/map_objects/hoth/eweb_model.glm", ent->handRBolt, 0 ); + } + else + { + G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].worldModel, ent->handRBolt, 0 ); + } WP_SaberAddHolsteredG2SaberModels( ent ); } } @@ -2773,10 +2780,17 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded } if ( ent->weaponModel[0] == -1 && ent->client->ps.weapon != WP_NONE ) { - G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].worldModel, ent->handRBolt, 0 ); + if ( ent->client->ps.weapon == WP_EMPLACED_GUN && !(ent->client->ps.eFlags & EF_LOCKED_TO_WEAPON) ) + { + G_CreateG2AttachedWeaponModel( ent, "models/map_objects/hoth/eweb_model.glm", ent->handRBolt, 0 ); + } + else + { + G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].worldModel, ent->handRBolt, 0 ); + } WP_SaberAddHolsteredG2SaberModels( ent ); } - + { // fire the targets of the spawn point G_UseTargets( spawnPoint, ent ); diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index a2dabcd73f..36adad4503 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -9047,7 +9047,7 @@ qboolean WP_ForceThrowable( gentity_t *ent, gentity_t *forwardEnt, gentity_t *se {//can't push ATST or Galak or Rancor or Wampa return qfalse; } - else if ( ent->s.weapon == WP_EMPLACED_GUN ) + else if ( ent->s.weapon == WP_EMPLACED_GUN && ent->client->ps.eFlags & EF_LOCKED_TO_WEAPON ) {//FIXME: maybe can pull them out? return qfalse; } @@ -11013,7 +11013,7 @@ void ForceGrip( gentity_t *self ) default: break; } - if ( traceEnt->s.weapon == WP_EMPLACED_GUN ) + if ( traceEnt->s.weapon == WP_EMPLACED_GUN && traceEnt->client->ps.eFlags & EF_LOCKED_TO_WEAPON ) {//FIXME: maybe can pull them out? return; } @@ -11778,7 +11778,7 @@ qboolean ForceDrain2( gentity_t *self ) default: break; } - if ( traceEnt->s.weapon == WP_EMPLACED_GUN ) + if ( traceEnt->s.weapon == WP_EMPLACED_GUN && traceEnt->client->ps.eFlags & EF_LOCKED_TO_WEAPON ) {//FIXME: maybe can pull them out? return qfalse; } From 396b2a97a546089c9c93b85c0036278f6bb4b7e4 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sun, 19 Apr 2015 20:16:16 +0100 Subject: [PATCH 404/445] Weapons: player can now use tusken rifle & noghri stick Consists of several merged commits. Alters when a weapon is player usable. --- code/cgame/cg_event.cpp | 5 ++ code/cgame/cg_main.cpp | 36 +++++++++++-- code/cgame/cg_scoreboard.cpp | 5 +- code/cgame/cg_weapons.cpp | 99 ++++++++++++++++++++++------------- code/game/g_client.cpp | 6 +-- code/game/g_combat.cpp | 8 ++- code/game/g_target.cpp | 5 +- code/game/g_trigger.cpp | 2 +- code/game/g_weapon.cpp | 5 +- code/game/g_weaponLoad.cpp | 52 ++++++++++++++++++ code/game/weapons.h | 3 +- code/game/wp_melee.cpp | 9 +++- code/game/wp_noghri_stick.cpp | 17 +++++- 13 files changed, 198 insertions(+), 54 deletions(-) diff --git a/code/cgame/cg_event.cpp b/code/cgame/cg_event.cpp index 6b2b27e580..41c4dcf17d 100644 --- a/code/cgame/cg_event.cpp +++ b/code/cgame/cg_event.cpp @@ -106,6 +106,11 @@ void CG_ItemPickup( int itemNum, qboolean bHadItem ) { cgi_Cvar_Set( "cg_WeaponPickupText", va("%s %s\n", text, data)); cg.weaponPickupTextTime = cg.time + 5000; } + else if ( cgi_SP_GetStringTextString( va("SPMOD_INGAME_%s",bg_itemlist[itemNum].classname ), data, sizeof( data ))) + { + cgi_Cvar_Set( "cg_WeaponPickupText", va("%s %s\n", text, data)); + cg.weaponPickupTextTime = cg.time + 5000; + } } } diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 495780a4da..140a6ab653 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -3430,6 +3430,17 @@ void CG_DrawInventorySelect( void ) cgi_R_Font_DrawString( x, (SCREEN_HEIGHT - 24), data, textColor, cgs.media.qhFontSmall, -1, 1.0f); } + else + { + Com_sprintf( itemName, sizeof(itemName), "SPMOD_INGAME_%s", item->classname ); + if ( cgi_SP_GetStringTextString( itemName, data, sizeof( data ))) + { + int w = cgi_R_Font_StrLenPixels( data, cgs.media.qhFontSmall, 1.0f ); + int x = ( SCREEN_WIDTH - w ) / 2; + + cgi_R_Font_DrawString( x, (SCREEN_HEIGHT - 24), data, textColor, cgs.media.qhFontSmall, -1, 1.0f); + } + } } } } @@ -3648,7 +3659,10 @@ void CG_DrawDataPadInventorySelect( void ) // draw the weapon description if ((cg.DataPadInventorySelect>=0) && (cg.DataPadInventorySelect<13)) { - cgi_SP_GetStringTextString( va("SP_INGAME_%s",inventoryDesc[cg.DataPadInventorySelect]), text, sizeof(text) ); + if (!cgi_SP_GetStringTextString( va("SP_INGAME_%s",inventoryDesc[cg.DataPadInventorySelect]), text, sizeof(text) )) + { + cgi_SP_GetStringTextString( va("SPMOD_INGAME_%s",inventoryDesc[cg.DataPadInventorySelect]), text, sizeof(text) ); + } if (text[0]) { @@ -4358,19 +4372,31 @@ void CG_DrawDataPadForceSelect( void ) } } - cgi_SP_GetStringTextString( va("SP_INGAME_%s",forcepowerDesc[cg.DataPadforcepowerSelect]), text, sizeof(text) ); + if (!cgi_SP_GetStringTextString( va("SP_INGAME_%s",forcepowerDesc[cg.DataPadforcepowerSelect]), text, sizeof(text) )) + { + cgi_SP_GetStringTextString( va("SPMOD_INGAME_%s",forcepowerDesc[cg.DataPadforcepowerSelect]), text, sizeof(text) ); + } if (player->client->ps.forcePowerLevel[showDataPadPowers[cg.DataPadforcepowerSelect]]==1) { - cgi_SP_GetStringTextString( va("SP_INGAME_%s",forcepowerLvl1Desc[cg.DataPadforcepowerSelect]), text2, sizeof(text2) ); + if (!cgi_SP_GetStringTextString( va("SP_INGAME_%s",forcepowerLvl1Desc[cg.DataPadforcepowerSelect]), text2, sizeof(text2) )) + { + cgi_SP_GetStringTextString( va("SPMOD_INGAME_%s",forcepowerLvl1Desc[cg.DataPadforcepowerSelect]), text2, sizeof(text2) ); + } } else if (player->client->ps.forcePowerLevel[showDataPadPowers[cg.DataPadforcepowerSelect]]==2) { - cgi_SP_GetStringTextString( va("SP_INGAME_%s",forcepowerLvl2Desc[cg.DataPadforcepowerSelect]), text2, sizeof(text2) ); + if (!cgi_SP_GetStringTextString( va("SP_INGAME_%s",forcepowerLvl2Desc[cg.DataPadforcepowerSelect]), text2, sizeof(text2) )) + { + cgi_SP_GetStringTextString( va("SPMOD_INGAME_%s",forcepowerLvl2Desc[cg.DataPadforcepowerSelect]), text2, sizeof(text2) ); + } } else { - cgi_SP_GetStringTextString( va("SP_INGAME_%s",forcepowerLvl3Desc[cg.DataPadforcepowerSelect]), text2, sizeof(text2) ); + if (!cgi_SP_GetStringTextString( va("SP_INGAME_%s",forcepowerLvl3Desc[cg.DataPadforcepowerSelect]), text2, sizeof(text2) )) + { + cgi_SP_GetStringTextString( va("SPMOD_INGAME_%s",forcepowerLvl3Desc[cg.DataPadforcepowerSelect]), text2, sizeof(text2) ); + } } if (text[0]) diff --git a/code/cgame/cg_scoreboard.cpp b/code/cgame/cg_scoreboard.cpp index b4e54e97fd..806331783e 100644 --- a/code/cgame/cg_scoreboard.cpp +++ b/code/cgame/cg_scoreboard.cpp @@ -236,7 +236,10 @@ w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); if ( wpn ) { gitem_t *wItem= FindItemForWeapon( (weapon_t)wpn); - cgi_SP_GetStringTextString( va("SP_INGAME_%s",wItem->classname ), text, sizeof( text )); + if (!cgi_SP_GetStringTextString( va("SP_INGAME_%s",wItem->classname ), text, sizeof( text ))) + { + cgi_SP_GetStringTextString( va("SPMOD_INGAME_%s",wItem->classname ), text, sizeof( text )); + } // cgi_R_Font_DrawString(x+w, y, va("%d",wpn), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w, y, text, colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); } diff --git a/code/cgame/cg_weapons.cpp b/code/cgame/cg_weapons.cpp index e4261b9bec..fb098dbb1b 100644 --- a/code/cgame/cg_weapons.cpp +++ b/code/cgame/cg_weapons.cpp @@ -1757,7 +1757,7 @@ int CG_WeaponCheck( int weaponIndex ) int cgi_UI_GetItemText(char *menuFile,char *itemName, char *text); -const char *weaponDesc[13] = +const char *weaponDesc[WP_NUM_WEAPONS - 1] = { "SABER_DESC", "NEW_BLASTER_PISTOL_DESC", @@ -1772,6 +1772,21 @@ const char *weaponDesc[13] = "TRIP_MINE_DESC", "DET_PACK_DESC", "CONCUSSION_DESC", +"MELEE_DESC", +"ATST_MAIN_DESC", +"ATST_SIDE_DESC", +"STUN_BATON_DESC", +"BLASTER_PISTOL_DESC", +"EMPLACED_GUN_DESC", +"BOT_LASER_DESC", +"TURRET_DESC", +"TIE_FIGHTER_DESC", +"RAPID_CONCUSSION_DESC", +"JAWA_DESC", +"TUSKEN_RIFLE_DESC", +"TUSKEN_STAFF_DESC", +"SCEPTER_DESC", +"NOGHRI_STICK_DESC", }; /* @@ -1798,7 +1813,7 @@ void CG_DrawDataPadWeaponSelect( void ) // count the number of weapons owned weaponCount = 0; - for ( i = 1 ; i < 16 ; i++ ) + for ( i = 1 ; i < WP_NUM_WEAPONS ; i++ ) { if ( weaponBitFlag & ( 1 << i ) ) { @@ -1836,9 +1851,9 @@ void CG_DrawDataPadWeaponSelect( void ) { cg.DataPadWeaponSelect = FIRST_WEAPON; } - else if (cg.DataPadWeaponSelect>13) + else if (cg.DataPadWeaponSelect>=WP_NUM_WEAPONS) { - cg.DataPadWeaponSelect = 13; + cg.DataPadWeaponSelect = WP_NUM_WEAPONS - 1; } // What weapon does the player currently have selected @@ -1852,8 +1867,8 @@ void CG_DrawDataPadWeaponSelect( void ) } if (weaponSelectI<1) { - weaponSelectI = 13; - } + weaponSelectI = WP_NUM_WEAPONS - 1; + } const int smallIconSize = 40; const int bigIconSize = 80; @@ -1882,7 +1897,7 @@ void CG_DrawDataPadWeaponSelect( void ) if (weaponSelectI<1) { - weaponSelectI = 13; + weaponSelectI = WP_NUM_WEAPONS - 1; } if ( !(weaponBitFlag & ( 1 << weaponSelectI ))) // Does he have this weapon? @@ -1951,7 +1966,7 @@ void CG_DrawDataPadWeaponSelect( void ) weaponSelectI = cg.DataPadWeaponSelect + 1; } - if (weaponSelectI> 13) + if (weaponSelectI>= WP_NUM_WEAPONS) { weaponSelectI = 1; } @@ -1970,7 +1985,7 @@ void CG_DrawDataPadWeaponSelect( void ) { weaponSelectI = WP_CONCUSSION; } - if (weaponSelectI>13) + if (weaponSelectI>= WP_NUM_WEAPONS) { weaponSelectI = 1; } @@ -2014,7 +2029,10 @@ void CG_DrawDataPadWeaponSelect( void ) } // Print the weapon description - cgi_SP_GetStringTextString( va("SP_INGAME_%s",weaponDesc[cg.DataPadWeaponSelect-1]), text, sizeof(text) ); + if (!cgi_SP_GetStringTextString( va("SP_INGAME_%s",weaponDesc[cg.DataPadWeaponSelect-1]), text, sizeof(text) )) + { + cgi_SP_GetStringTextString( va("SPMOD_INGAME_%s",weaponDesc[cg.DataPadWeaponSelect-1]), text, sizeof(text) ); + } if (text[0]) { @@ -2149,10 +2167,11 @@ void CG_DrawWeaponSelect( void ) // count the number of weapons owned count = 0; isOnVeh = (G_IsRidingVehicle(cg_entities[0].gent)!=0); - for ( i = 1 ; i < MAX_PLAYER_WEAPONS ; i++ ) + for ( i = 1 ; i < WP_NUM_WEAPONS ; i++ ) { if ((bits & ( 1 << i )) && - (!isOnVeh || i==WP_NONE || i==WP_SABER || i==WP_BLASTER)) + playerUsableWeapons[i] && + (!isOnVeh || i==WP_NONE || i==WP_SABER || i==WP_BLASTER)) { count++; } @@ -2193,7 +2212,7 @@ void CG_DrawWeaponSelect( void ) } if (i<1) { - i = MAX_PLAYER_WEAPONS; + i = WP_NUM_WEAPONS; } smallIconSize = 40; @@ -2231,10 +2250,10 @@ void CG_DrawWeaponSelect( void ) } if (i<1) { - i = MAX_PLAYER_WEAPONS; + i = WP_NUM_WEAPONS; } - if ( !(bits & ( 1 << i ))) // Does he have this weapon? + if ( !(bits & ( 1 << i ) && playerUsableWeapons[i]) ) // Does he have this weapon? { if ( i == WP_CONCUSSION ) { @@ -2309,7 +2328,7 @@ void CG_DrawWeaponSelect( void ) { i = cg.weaponSelect + 1; } - if (i> MAX_PLAYER_WEAPONS) + if (i>= WP_NUM_WEAPONS) { i = 1; } @@ -2330,12 +2349,12 @@ void CG_DrawWeaponSelect( void ) { i = WP_CONCUSSION; } - if (i>MAX_PLAYER_WEAPONS) + if (i>= WP_NUM_WEAPONS) { i = 1; } - if ( !(bits & ( 1 << i ))) // Does he have this weapon? + if ( !(bits & ( 1 << i ) && playerUsableWeapons[i])) // Does he have this weapon? { if ( i == WP_CONCUSSION ) { @@ -2397,6 +2416,12 @@ void CG_DrawWeaponSelect( void ) int x = ( SCREEN_WIDTH - w ) / 2; cgi_R_Font_DrawString(x, (SCREEN_HEIGHT - 24)+yOffset, text, textColor, cgs.media.qhFontSmall, -1, 1.0f); } + else if ( cgi_SP_GetStringTextString( va("SPMOD_INGAME_%s",item->classname), text, sizeof( text ))) + { + int w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 1.0f); + int x = ( SCREEN_WIDTH - w ) / 2; + cgi_R_Font_DrawString(x, (SCREEN_HEIGHT - 24)+yOffset, text, textColor, cgs.media.qhFontSmall, -1, 1.0f); + } } cgi_R_SetColor( NULL ); @@ -2412,8 +2437,8 @@ qboolean CG_WeaponSelectable( int i, int original, qboolean dpMode ) { int usage_for_weap; - if (i > MAX_PLAYER_WEAPONS) - { + if (i >= WP_NUM_WEAPONS || !playerUsableWeapons[i]) + { #ifndef FINAL_BUILD Com_Printf("CG_WeaponSelectable() passed illegal index of %d!\n",i); #endif @@ -2563,7 +2588,7 @@ void CG_NextWeapon_f( void ) { firstWeapon = 0; // include WP_NONE here } - for ( i = 0 ; i <= MAX_PLAYER_WEAPONS ; i++ ) + for ( i = 0 ; i < WP_NUM_WEAPONS ; i++ ) { //*SIGH*... Hack to put concussion rifle before rocketlauncher @@ -2577,15 +2602,15 @@ void CG_NextWeapon_f( void ) { } else if ( cg.weaponSelect == WP_DET_PACK ) { - cg.weaponSelect = firstWeapon; + cg.weaponSelect = WP_MELEE; } else { cg.weaponSelect++; } - if ( cg.weaponSelect < firstWeapon || cg.weaponSelect > MAX_PLAYER_WEAPONS) { - cg.weaponSelect = firstWeapon; + if ( cg.weaponSelect < firstWeapon || cg.weaponSelect >= WP_NUM_WEAPONS) { + cg.weaponSelect = firstWeapon; } if ( CG_WeaponSelectable( cg.weaponSelect, original, qfalse ) ) @@ -2619,7 +2644,7 @@ void CG_DPNextWeapon_f( void ) { original = cg.DataPadWeaponSelect; - for ( i = 0 ; i <= MAX_PLAYER_WEAPONS ; i++ ) + for ( i = 0 ; i < WP_NUM_WEAPONS ; i++ ) { //*SIGH*... Hack to put concussion rifle before rocketlauncher @@ -2633,15 +2658,15 @@ void CG_DPNextWeapon_f( void ) { } else if ( cg.DataPadWeaponSelect == WP_DET_PACK ) { - cg.DataPadWeaponSelect = FIRST_WEAPON; + cg.DataPadWeaponSelect = WP_MELEE; } else { cg.DataPadWeaponSelect++; } - if ( cg.DataPadWeaponSelect < FIRST_WEAPON || cg.DataPadWeaponSelect > MAX_PLAYER_WEAPONS) { - cg.DataPadWeaponSelect = FIRST_WEAPON; + if ( cg.DataPadWeaponSelect < FIRST_WEAPON || cg.DataPadWeaponSelect >= WP_NUM_WEAPONS ) { + cg.DataPadWeaponSelect = FIRST_WEAPON; } if ( CG_WeaponSelectable( cg.DataPadWeaponSelect, original, qtrue ) ) @@ -2677,7 +2702,7 @@ void CG_DPPrevWeapon_f( void ) original = cg.DataPadWeaponSelect; - for ( i = 0 ; i <= MAX_PLAYER_WEAPONS ; i++ ) + for ( i = 0 ; i < WP_NUM_WEAPONS ; i++ ) { //*SIGH*... Hack to put concussion rifle before rocketlauncher @@ -2698,9 +2723,9 @@ void CG_DPPrevWeapon_f( void ) cg.DataPadWeaponSelect--; } - if ( cg.DataPadWeaponSelect < FIRST_WEAPON || cg.DataPadWeaponSelect > MAX_PLAYER_WEAPONS) - { - cg.DataPadWeaponSelect = MAX_PLAYER_WEAPONS; + if ( cg.DataPadWeaponSelect < FIRST_WEAPON || cg.DataPadWeaponSelect >= WP_NUM_WEAPONS ) + { + cg.DataPadWeaponSelect = WP_NUM_WEAPONS; } if ( CG_WeaponSelectable( cg.DataPadWeaponSelect, original, qtrue ) ) @@ -2767,8 +2792,8 @@ void CG_PrevWeapon_f( void ) { firstWeapon = 0; // include WP_NONE here } - for ( i = 0 ; i <= MAX_PLAYER_WEAPONS ; i++ ) { - + for ( i = 0 ; i < WP_NUM_WEAPONS ; i++ ) { + //*SIGH*... Hack to put concussion rifle before rocketlauncher if ( cg.weaponSelect == WP_ROCKET_LAUNCHER ) { @@ -2788,8 +2813,8 @@ void CG_PrevWeapon_f( void ) { } - if ( cg.weaponSelect < firstWeapon || cg.weaponSelect > MAX_PLAYER_WEAPONS) { - cg.weaponSelect = MAX_PLAYER_WEAPONS; + if ( cg.weaponSelect < firstWeapon || cg.weaponSelect >= WP_NUM_WEAPONS ) { + cg.weaponSelect = WP_NUM_WEAPONS; } if ( CG_WeaponSelectable( cg.weaponSelect, original, qfalse ) ) @@ -3101,7 +3126,7 @@ void CG_FireWeapon( centity_t *cent, qboolean alt_fire ) CG_Error( "CG_FireWeapon: ent->weapon >= WP_NUM_WEAPONS" ); return; } - if ( ent->weapon == WP_TUSKEN_RIFLE && cent->gent->client) + if ( (ent->weapon == WP_TUSKEN_RIFLE || ent->weapon == WP_NOGHRI_STICK) && cent->gent->client) { if (cent->gent->client->ps.torsoAnim==BOTH_TUSKENATTACK1 || cent->gent->client->ps.torsoAnim==BOTH_TUSKENATTACK2 || diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index d79df1794a..3400f88880 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -669,7 +669,7 @@ void Player_CacheFromPrevLevel(void) &ibits //client->ps.stats[STAT_ITEMS] ); - for ( i = 1 ; i < 16 ; i++ ) + for ( i = 1 ; i < WP_NUM_WEAPONS ; i++ ) { if ( bits & ( 1 << i ) ) { @@ -2631,9 +2631,9 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded // force the base weapon up client->ps.weaponstate = WEAPON_READY; - for ( i = FIRST_WEAPON; i < MAX_PLAYER_WEAPONS; i++ ) // don't give ammo for explosives + for ( i = FIRST_WEAPON; i < WP_NUM_WEAPONS; i++ ) // don't give ammo for explosives { - if ( (client->ps.stats[STAT_WEAPONS]&(1<ps.stats[STAT_WEAPONS]&(1<ps.ammo[weaponData[i].ammoIndex] = ammoData[weaponData[i].ammoIndex].max; } diff --git a/code/game/g_combat.cpp b/code/game/g_combat.cpp index 2bea30525a..1e28a726b3 100644 --- a/code/game/g_combat.cpp +++ b/code/game/g_combat.cpp @@ -186,7 +186,7 @@ gentity_t *TossClientItems( gentity_t *self ) || weapon == WP_MELEE ) {//never drop these } - else if ( weapon > WP_SABER && weapon <= MAX_PLAYER_WEAPONS )//&& self->client->ps.ammo[ weaponData[weapon].ammoIndex ] + else if ( weapon > WP_SABER && weapon < WP_NUM_WEAPONS && playerUsableWeapons[weapon] )//&& self->client->ps.ammo[ weaponData[weapon].ammoIndex ] { self->s.weapon = WP_NONE; @@ -257,6 +257,12 @@ gentity_t *TossClientItems( gentity_t *self ) case WP_STUN_BATON: dropped->count = 20; break; + case WP_TUSKEN_RIFLE: + dropped->count = 20; + break; + case WP_NOGHRI_STICK: + dropped->count = 15; + break; default: dropped->count = 0; break; diff --git a/code/game/g_target.cpp b/code/game/g_target.cpp index 9d18d77706..c2b58f53fd 100644 --- a/code/game/g_target.cpp +++ b/code/game/g_target.cpp @@ -962,7 +962,10 @@ void set_mission_stats_cvars( void ) if ( wpn ) { gitem_t *wItem= FindItemForWeapon( (weapon_t)wpn); - cgi_SP_GetStringTextString( va("SP_INGAME_%s",wItem->classname ), text, sizeof( text )); + if (!cgi_SP_GetStringTextString( va("SP_INGAME_%s",wItem->classname ), text, sizeof( text ))) + { + cgi_SP_GetStringTextString( va("SPMOD_INGAME_%s",wItem->classname ), text, sizeof( text )); + } gi.cvar_set("ui_stats_fave", va("%s",text)); //pass this on to the menu } diff --git a/code/game/g_trigger.cpp b/code/game/g_trigger.cpp index 3a1ad1c6ad..55722d7462 100644 --- a/code/game/g_trigger.cpp +++ b/code/game/g_trigger.cpp @@ -286,7 +286,7 @@ void Touch_Multi( gentity_t *self, gentity_t *other, trace_t *trace ) //FIXME: do we care about the sniper rifle or not? - if( other->s.number == 0 && ( other->client->ps.weapon > MAX_PLAYER_WEAPONS || other->client->ps.weapon <= WP_NONE ) ) + if( other->s.number == 0 && ( other->client->ps.weapon >= WP_NUM_WEAPONS || other->client->ps.weapon <= WP_NONE || !playerUsableWeapons[other->client->ps.weapon]) ) {//don't care about non-player weapons if this is the player return; } diff --git a/code/game/g_weapon.cpp b/code/game/g_weapon.cpp index a5979e7c71..5a86251c6f 100644 --- a/code/game/g_weapon.cpp +++ b/code/game/g_weapon.cpp @@ -1532,7 +1532,10 @@ void FireWeapon( gentity_t *ent, qboolean alt_fire ) { WP_FireNoghriStick( ent ); } - //else does melee attack/damage/func + else + { + WP_Melee( ent ); + } break; case WP_TUSKEN_STAFF: diff --git a/code/game/g_weaponLoad.cpp b/code/game/g_weaponLoad.cpp index 53d9d400b1..4ef7ae1c22 100644 --- a/code/game/g_weaponLoad.cpp +++ b/code/game/g_weaponLoad.cpp @@ -106,6 +106,58 @@ func_t funcs[] = { {NULL, NULL} }; +qboolean playerUsableWeapons[WP_NUM_WEAPONS] = +{ + qtrue,//WP_NONE, + + // Player weapons + qtrue,//WP_SABER, + qtrue,//WP_BLASTER_PISTOL, // player and NPC weapon + qtrue,//WP_BLASTER, // player and NPC weapon + qtrue,//WP_DISRUPTOR, // player and NPC weapon + qtrue,//WP_BOWCASTER, // NPC weapon - player can pick this up, but never starts with them + qtrue,//WP_REPEATER, // NPC weapon - player can pick this up, but never starts with them + qtrue,//WP_DEMP2, // NPC weapon - player can pick this up, but never starts with them + qtrue,//WP_FLECHETTE, // NPC weapon - player can pick this up, but never starts with them + qtrue,//WP_ROCKET_LAUNCHER, // NPC weapon - player can pick this up, but never starts with them + qtrue,//WP_THERMAL, // player and NPC weapon + qtrue,//WP_TRIP_MINE, // NPC weapon - player can pick this up, but never starts with them + qtrue,//WP_DET_PACK, // NPC weapon - player can pick this up, but never starts with them + qtrue,//WP_CONCUSSION, // NPC weapon - player can pick this up, but never starts with them + + //extras + qtrue,//WP_MELEE, // player and NPC weapon - Any ol' melee attack + + //when in atst + qtrue,//WP_ATST_MAIN, + qtrue,//WP_ATST_SIDE, + + // These can never be gotten directly by the player + qtrue,//WP_STUN_BATON, // stupid weapon, should remove + + //NPC weapons + qtrue,//WP_BRYAR_PISTOL, // NPC weapon - player can pick this up, but never starts with them + + qfalse,//WP_EMPLACED_GUN, + + qfalse,//WP_BOT_LASER, // Probe droid - Laser blast + + qfalse,//WP_TURRET, // turret guns + + qfalse,//WP_TIE_FIGHTER, + + qfalse,//WP_RAPID_FIRE_CONC, + + qfalse,//WP_JAWA, + qtrue,//WP_TUSKEN_RIFLE, + qfalse,//WP_TUSKEN_STAFF, + qfalse,//WP_SCEPTER, + qtrue,//WP_NOGHRI_STICK, + + //# #eol + //WP_NUM_WEAPONS +}; + //qboolean COM_ParseInt( char **data, int *i ); //qboolean COM_ParseString( char **data, char **s ); //qboolean COM_ParseFloat( char **data, float *f ); diff --git a/code/game/weapons.h b/code/game/weapons.h index d6d869ae95..47aea919f5 100644 --- a/code/game/weapons.h +++ b/code/game/weapons.h @@ -84,7 +84,8 @@ typedef enum //# weapon_e } weapon_t; #define FIRST_WEAPON WP_SABER // this is the first weapon for next and prev weapon switching -#define MAX_PLAYER_WEAPONS WP_STUN_BATON // this is the max you can switch to and get with the give all. - FIXME: it's actually this one *minus* one... why? + +extern qboolean playerUsableWeapons[WP_NUM_WEAPONS]; // AMMO_NONE must be first and AMMO_MAX must be last, cause weapon load validates based off of these vals typedef enum //# ammo_e diff --git a/code/game/wp_melee.cpp b/code/game/wp_melee.cpp index a010be95c6..ef15c8a972 100644 --- a/code/game/wp_melee.cpp +++ b/code/game/wp_melee.cpp @@ -68,7 +68,14 @@ void WP_Melee( gentity_t *ent ) if ( tr_ent && tr_ent->takedamage ) { int dflags = DAMAGE_NO_KNOCKBACK; - G_PlayEffect( G_EffectIndex( "melee/punch_impact" ), tr.endpos, forwardVec ); + if (ent->s.weapon == WP_NOGHRI_STICK || ent->s.weapon == WP_TUSKEN_RIFLE) + { + G_Sound( tr_ent, G_SoundIndex( va( "sound/weapons/tusken_staff/stickhit%d.wav", Q_irand( 1, 4 ) ) ) ); + } + else + { + G_PlayEffect( G_EffectIndex( "melee/punch_impact" ), tr.endpos, forwardVec ); + } //G_Sound( tr_ent, G_SoundIndex( va("sound/weapons/melee/punch%d", Q_irand(1, 4)) ) ); if ( ent->NPC && (ent->NPC->aiFlags&NPCAI_HEAVY_MELEE) ) { //4x damage for heavy melee class diff --git a/code/game/wp_noghri_stick.cpp b/code/game/wp_noghri_stick.cpp index a96aac6064..d2c07567fc 100644 --- a/code/game/wp_noghri_stick.cpp +++ b/code/game/wp_noghri_stick.cpp @@ -38,8 +38,17 @@ void WP_FireNoghriStick( gentity_t *ent ) {//force sight 2+ gives perfect aim //FIXME: maybe force sight level 3 autoaims some? // add some slop to the main-fire direction - angs[PITCH] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f - angs[YAW] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + if (ent->NPC) + { + angs[PITCH] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + angs[YAW] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f + } + else + { + // add some slop to the main-fire direction + angs[PITCH] += Q_flrand(-1.0f, 1.0f) * BLASTER_MAIN_SPREAD; + angs[YAW] += Q_flrand(-1.0f, 1.0f) * BLASTER_MAIN_SPREAD; + } } AngleVectors( angs, dir, NULL, NULL ); @@ -72,6 +81,10 @@ void WP_FireNoghriStick( gentity_t *ent ) missile->damage = 10; } } + else + { + missile->damage = 10; + } // if ( ent->client ) // { From 3bff181e812d941e99085f71c446e090bc54e166 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Mon, 20 Apr 2015 18:00:47 +0100 Subject: [PATCH 405/445] Saber crystals: Fix non-RGB unstable sabers --- code/cgame/cg_players.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index e08d824d6a..fcac6b2705 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -6411,6 +6411,14 @@ static void CG_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax saber.shaderRGBA[1] = ((color >> 8) & 0xff); saber.shaderRGBA[2] = ((color >> 16) & 0xff); } + else if ( (crystals & SABER_CRYSTAL_UNSTABLE) && !(crystals & SABER_CRYSTAL_BLACK) ) + { + vec3_t rgb={1,1,1}; + CG_RGBForSaberColor( color, rgb ); + saber.shaderRGBA[0] = 0xff * rgb[0]; + saber.shaderRGBA[1] = 0xff * rgb[1]; + saber.shaderRGBA[2] = 0xff * rgb[2]; + } cgi_R_AddRefEntityToScene( &saber ); From 4fd8777aedfe7612c2c7b77ba6bf037c850ff5fb Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sun, 19 Apr 2015 17:06:16 +0100 Subject: [PATCH 406/445] Forcepowers: New forcepowers added. Stasis, blinding, destruction and insanity added (blinding just a stub). Binding +saber_throw no longer breaks it. Also added deadly sight, repulse and invulnerability (only deadly sight does anything for now). --- code/cgame/cg_consolecmds.cpp | 7 + code/cgame/cg_local.h | 4 +- code/cgame/cg_main.cpp | 70 ++++ code/cgame/cg_players.cpp | 13 + code/client/cl_input.cpp | 23 + code/game/AI_Animal.cpp | 4 +- code/game/AI_GalakMech.cpp | 2 +- code/game/AI_Grenadier.cpp | 2 +- code/game/AI_Howler.cpp | 2 +- code/game/AI_Jedi.cpp | 4 +- code/game/AI_Rancor.cpp | 2 +- code/game/AI_SaberDroid.cpp | 2 +- code/game/AI_Sniper.cpp | 2 +- code/game/AI_Stormtrooper.cpp | 8 +- code/game/AI_Tusken.cpp | 2 +- code/game/AI_Utils.cpp | 3 + code/game/AI_Wampa.cpp | 2 +- code/game/NPC.cpp | 22 +- code/game/NPC_behavior.cpp | 4 +- code/game/NPC_combat.cpp | 7 +- code/game/NPC_reactions.cpp | 13 +- code/game/NPC_stats.cpp | 8 + code/game/NPC_utils.cpp | 51 +++ code/game/Q3_Interface.cpp | 45 ++ code/game/Q3_Interface.h | 15 + code/game/b_public.h | 3 + code/game/bg_panimate.cpp | 7 +- code/game/bg_pmove.cpp | 40 +- code/game/bg_public.h | 2 + code/game/g_active.cpp | 29 ++ code/game/g_cmds.cpp | 42 ++ code/game/g_combat.cpp | 51 ++- code/game/g_main.cpp | 2 +- code/game/g_svcmds.cpp | 14 + code/game/g_target.cpp | 8 + code/game/wp_saber.cpp | 763 +++++++++++++++++++++++++++++++++- code/qcommon/q_shared.h | 24 ++ code/ui/ui_main.cpp | 48 ++- code/ui/ui_shared.cpp | 10 + 39 files changed, 1309 insertions(+), 51 deletions(-) diff --git a/code/cgame/cg_consolecmds.cpp b/code/cgame/cg_consolecmds.cpp index b936b8a5e5..e1dae16922 100644 --- a/code/cgame/cg_consolecmds.cpp +++ b/code/cgame/cg_consolecmds.cpp @@ -285,14 +285,21 @@ static const char *gcmds[] = { "difficulty", "flourish", "force_absorb", + "force_blinding", + "force_deadlysight", + "force_destruction", "force_distract", "force_grip", "force_heal", + "force_insanity", + "force_invulnerability", "force_protect", "force_pull", "force_rage", + "force_repulse", "force_sight", "force_speed", + "force_stasis", "force_throw", "give", "gloat", diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index b8958c5812..f3864d481e 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -518,11 +518,11 @@ Ghoul2 Insert End } cg_t; -#define MAX_SHOWPOWERS 13 +#define MAX_SHOWPOWERS 20 extern int showPowers[MAX_SHOWPOWERS]; extern const char *showPowersName[MAX_SHOWPOWERS]; extern int force_icons[NUM_FORCE_POWERS]; -#define MAX_DPSHOWPOWERS 16 +#define MAX_DPSHOWPOWERS 23 //============================================================================== diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 140a6ab653..d646c5364f 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -2160,6 +2160,13 @@ void CG_Init( int serverCommandSequence ) { "gfx/mp/f_icon_lt_absorb", //FP_ABSORB, "gfx/mp/f_icon_dk_drain", //FP_DRAIN, "gfx/mp/f_icon_sight", //FP_SEE, + "gfx/mp/f_icon_dk_destruction", //FP_DESTRUCTION, + "gfx/mp/f_icon_dk_insanity", //FP_INSANITY, + "gfx/mp/f_icon_lt_stasis", //FP_STASIS, + "gfx/mp/f_icon_lt_blinding", //FP_BLINDING, + "gfx/mp/f_icon_dk_deadlysight", //FP_DEADLYSIGHT + "gfx/mp/f_icon_repulse", //FP_REPULSE + "gfx/mp/f_icon_lt_invulnerability", //FP_INVULNERABILITY }; // Precache inventory icons @@ -3701,17 +3708,26 @@ int showPowers[MAX_SHOWPOWERS] = FP_HEAL, FP_PROTECT, FP_TELEPATHY, + + FP_STASIS, + FP_BLINDING, + FP_INVULNERABILITY, FP_SPEED, FP_PUSH, FP_PULL, FP_SEE, + FP_REPULSE, FP_DRAIN, FP_LIGHTNING, FP_RAGE, FP_GRIP, + FP_DESTRUCTION, + FP_INSANITY, + FP_DEADLYSIGHT, + FP_SABERTHROW, }; @@ -3721,17 +3737,26 @@ const char *showPowersName[MAX_SHOWPOWERS] = "SP_INGAME_HEAL2", "SP_INGAME_PROTECT2", "SP_INGAME_MINDTRICK2", + + "SPMOD_INGAME_STASIS2", + "SPMOD_INGAME_BLINDING2", + "SPMOD_INGAME_INVULNERABILITY2", "SP_INGAME_SPEED2", "SP_INGAME_PUSH2", "SP_INGAME_PULL2", "SP_INGAME_SEEING2", + "SPMOD_INGAME_REPULSE2", "SP_INGAME_DRAIN2", "SP_INGAME_LIGHTNING2", "SP_INGAME_DARK_RAGE2", "SP_INGAME_GRIP2", + "SPMOD_INGAME_DESTRUCTION2", + "SPMOD_INGAME_INSANITY2", + "SPMOD_INGAME_DEADLYSIGHT2", + "SP_INGAME_SABER_THROW2", }; @@ -3743,6 +3768,10 @@ int showDataPadPowers[MAX_DPSHOWPOWERS] = FP_HEAL, FP_PROTECT, FP_TELEPATHY, + + FP_STASIS, + FP_BLINDING, + FP_INVULNERABILITY, // Core Powers FP_LEVITATION, @@ -3753,12 +3782,17 @@ int showDataPadPowers[MAX_DPSHOWPOWERS] = FP_SABER_DEFENSE, FP_SABER_OFFENSE, FP_SEE, + FP_REPULSE, //Dark Side FP_DRAIN, FP_LIGHTNING, FP_RAGE, FP_GRIP, + + FP_DESTRUCTION, + FP_INSANITY, + FP_DEADLYSIGHT, }; /* @@ -4119,6 +4153,10 @@ const char *forcepowerDesc[NUM_FORCE_POWERS] = "FORCE_HEAL_DESC", "FORCE_PROTECT_DESC", "FORCE_MIND_TRICK_DESC", + +"FORCE_STASIS_DESC", +"FORCE_BLINDING_DESC", +"FORCE_INVULNERABILITY_DESC", "FORCE_JUMP_DESC", "FORCE_SPEED_DESC", @@ -4128,11 +4166,16 @@ const char *forcepowerDesc[NUM_FORCE_POWERS] = "FORCE_SABER_DEFENSE_DESC", "FORCE_SABER_OFFENSE_DESC", "FORCE_SENSE_DESC", +"FORCE_REPULSE_DESC", "FORCE_DRAIN_DESC", "FORCE_LIGHTNING_DESC", "FORCE_RAGE_DESC", "FORCE_GRIP_DESC", + +"FORCE_DESTRUCTION_DESC", +"FORCE_INSANITY_DESC", +"FORCE_DEADLYSIGHT_DESC", }; @@ -4143,6 +4186,10 @@ const char *forcepowerLvl1Desc[NUM_FORCE_POWERS] = "FORCE_PROTECT_LVL1_DESC", "FORCE_MIND_TRICK_LVL1_DESC", +"FORCE_STASIS_LVL1_DESC", +"FORCE_BLINDING_LVL1_DESC", +"FORCE_INVULNERABILITY_LVL1_DESC", + "FORCE_JUMP_LVL1_DESC", "FORCE_SPEED_LVL1_DESC", "FORCE_PUSH_LVL1_DESC", @@ -4151,11 +4198,16 @@ const char *forcepowerLvl1Desc[NUM_FORCE_POWERS] = "FORCE_SABER_DEFENSE_LVL1_DESC", "FORCE_SABER_OFFENSE_LVL1_DESC", "FORCE_SENSE_LVL1_DESC", +"FORCE_REPULSE_LVL1_DESC", "FORCE_DRAIN_LVL1_DESC", "FORCE_LIGHTNING_LVL1_DESC", "FORCE_RAGE_LVL1_DESC", "FORCE_GRIP_LVL1_DESC", + +"FORCE_DESTRUCTION_LVL1_DESC", +"FORCE_INSANITY_LVL1_DESC", +"FORCE_DEADLYSIGHT_LVL1_DESC", }; const char *forcepowerLvl2Desc[NUM_FORCE_POWERS] = @@ -4164,6 +4216,10 @@ const char *forcepowerLvl2Desc[NUM_FORCE_POWERS] = "FORCE_HEAL_LVL2_DESC", "FORCE_PROTECT_LVL2_DESC", "FORCE_MIND_TRICK_LVL2_DESC", + +"FORCE_STASIS_LVL2_DESC", +"FORCE_BLINDING_LVL2_DESC", +"FORCE_INVULNERABILITY_LVL2_DESC", "FORCE_JUMP_LVL2_DESC", "FORCE_SPEED_LVL2_DESC", @@ -4173,11 +4229,16 @@ const char *forcepowerLvl2Desc[NUM_FORCE_POWERS] = "FORCE_SABER_DEFENSE_LVL2_DESC", "FORCE_SABER_OFFENSE_LVL2_DESC", "FORCE_SENSE_LVL2_DESC", +"FORCE_REPULSE_LVL2_DESC", "FORCE_DRAIN_LVL2_DESC", "FORCE_LIGHTNING_LVL2_DESC", "FORCE_RAGE_LVL2_DESC", "FORCE_GRIP_LVL2_DESC", + +"FORCE_DESTRUCTION_LVL2_DESC", +"FORCE_INSANITY_LVL2_DESC", +"FORCE_DEADLYSIGHT_LVL2_DESC", }; const char *forcepowerLvl3Desc[NUM_FORCE_POWERS] = @@ -4187,6 +4248,10 @@ const char *forcepowerLvl3Desc[NUM_FORCE_POWERS] = "FORCE_PROTECT_LVL3_DESC", "FORCE_MIND_TRICK_LVL3_DESC", +"FORCE_STASIS_LVL3_DESC", +"FORCE_BLINDING_LVL3_DESC", +"FORCE_INVULNERABILITY_LVL3_DESC", + "FORCE_JUMP_LVL3_DESC", "FORCE_SPEED_LVL3_DESC", "FORCE_PUSH_LVL3_DESC", @@ -4195,11 +4260,16 @@ const char *forcepowerLvl3Desc[NUM_FORCE_POWERS] = "FORCE_SABER_DEFENSE_LVL3_DESC", "FORCE_SABER_OFFENSE_LVL3_DESC", "FORCE_SENSE_LVL3_DESC", +"FORCE_REPULSE_LVL3_DESC", "FORCE_DRAIN_LVL3_DESC", "FORCE_LIGHTNING_LVL3_DESC", "FORCE_RAGE_LVL3_DESC", "FORCE_GRIP_LVL3_DESC", + +"FORCE_DESTRUCTION_LVL3_DESC", +"FORCE_INSANITY_LVL3_DESC", +"FORCE_DEADLYSIGHT_LVL3_DESC", }; /* diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index fcac6b2705..097d463c44 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -5175,6 +5175,19 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen cgi_R_AddRefEntityToScene( ent); } + + if ( cent->gent->client->ps.stasisTime > (cg.time?cg.time:level.time) ) + { //stasis is represented by grey.. + ent->shaderRGBA[0] = 100; + ent->shaderRGBA[1] = 100; + ent->shaderRGBA[2] = 100; + ent->shaderRGBA[3] = 254; + + ent->renderfx &= ~RF_RGB_TINT; + ent->customShader = cgs.media.playerShieldDamage; + + cgi_R_AddRefEntityToScene( ent ); + } } diff --git a/code/client/cl_input.cpp b/code/client/cl_input.cpp index 940517600b..751a17adae 100644 --- a/code/client/cl_input.cpp +++ b/code/client/cl_input.cpp @@ -126,6 +126,27 @@ static void IN_UseGivenForce(void) case FP_HEAL: genCmdNum = GENCMD_FORCE_HEAL; break; + case FP_DESTRUCTION: + genCmdNum = GENCMD_FORCE_DESTRUCTION; + break; + case FP_INSANITY: + genCmdNum = GENCMD_FORCE_INSANITY; + break; + case FP_STASIS: + genCmdNum = GENCMD_FORCE_STASIS; + break; + case FP_BLINDING: + genCmdNum = GENCMD_FORCE_BLINDING; + break; + case FP_DEADLYSIGHT: + genCmdNum = GENCMD_FORCE_DEADLYSIGHT; + break; + case FP_REPULSE: + genCmdNum = GENCMD_FORCE_REPULSE; + break; + case FP_INVULNERABILITY: + genCmdNum = GENCMD_FORCE_INVULNERABILITY; + break; default: assert(0); break; @@ -993,6 +1014,8 @@ void CL_InitInput( void ) { Cmd_AddCommand ("+block", IN_Button8Down);//manual blocking Cmd_AddCommand ("-block", IN_Button8Up); #endif + Cmd_AddCommand ("+saber_throw", IN_Button9Down); + Cmd_AddCommand ("-saber_throw", IN_Button9Up); Cmd_AddCommand ("+button0", IN_Button0Down); Cmd_AddCommand ("-button0", IN_Button0Up); diff --git a/code/game/AI_Animal.cpp b/code/game/AI_Animal.cpp index 4626ff4d1f..965347df00 100644 --- a/code/game/AI_Animal.cpp +++ b/code/game/AI_Animal.cpp @@ -198,8 +198,8 @@ void NPC_BSAnimal_Default( void ) bool EvadeThreat = (level.timeinvestigateSoundDebounceTime); - bool CharmedDocile = (level.timeconfusionTime); - bool CharmedApproach = (level.timecharmedTime); + bool CharmedDocile = (level.timeconfusionTime)||(level.timeinsanityTime); + bool CharmedApproach = (level.timecharmedTime)||(level.timedarkCharmedTime); diff --git a/code/game/AI_GalakMech.cpp b/code/game/AI_GalakMech.cpp index a8b4d1bf8c..9f0714e7dc 100644 --- a/code/game/AI_GalakMech.cpp +++ b/code/game/AI_GalakMech.cpp @@ -272,7 +272,7 @@ bool Pilot_MasterUpdate() { ucmd.upmove = 127; - if (NPCInfo->greetEnt && NPCInfo->greetEnt->m_pVehicle && level.timeconfusionTime) + if (NPCInfo->greetEnt && NPCInfo->greetEnt->m_pVehicle && (level.timeconfusionTime||level.timeinsanityTime)) { Vehicle_t* pVeh = NPCInfo->greetEnt->m_pVehicle; if (!(pVeh->m_ulFlags&VEH_OUTOFCONTROL)) diff --git a/code/game/AI_Grenadier.cpp b/code/game/AI_Grenadier.cpp index 6932d0913d..3e29e4185c 100644 --- a/code/game/AI_Grenadier.cpp +++ b/code/game/AI_Grenadier.cpp @@ -205,7 +205,7 @@ NPC_BSGrenadier_Patrol void NPC_BSGrenadier_Patrol( void ) {//FIXME: pick up on bodies of dead buddies? - if ( NPCInfo->confusionTime < level.time ) + if ( (NPCInfo->confusionTimeinsanityTimescriptFlags&SCF_LOOK_FOR_ENEMIES ) diff --git a/code/game/AI_Howler.cpp b/code/game/AI_Howler.cpp index e3a6d664be..c5cc16ef70 100644 --- a/code/game/AI_Howler.cpp +++ b/code/game/AI_Howler.cpp @@ -738,7 +738,7 @@ void NPC_BSHowler_Default( void ) { gentity_t *sav_enemy = NPC->enemy;//FIXME: what about NPC->lastEnemy? NPC->enemy = NULL; - gentity_t *newEnemy = NPC_CheckEnemy( (qboolean)(NPCInfo->confusionTime < level.time), qfalse, qfalse ); + gentity_t *newEnemy = NPC_CheckEnemy( (qboolean)((NPCInfo->confusionTimeinsanityTimeenemy = sav_enemy; if ( newEnemy && newEnemy != sav_enemy ) {//picked up a new enemy! diff --git a/code/game/AI_Jedi.cpp b/code/game/AI_Jedi.cpp index 1c508c5784..9b543ef96f 100644 --- a/code/game/AI_Jedi.cpp +++ b/code/game/AI_Jedi.cpp @@ -6826,7 +6826,7 @@ static void Jedi_Attack( void ) } else if ( NPC->enemy && NPC->enemy->NPC - && NPC->enemy->NPC->charmedTime > level.time ) + && (NPC->enemy->NPC->charmedTime > level.time || NPC->enemy->NPC->darkCharmedTime > level.time) ) {//my enemy was charmed if ( OnSameTeam( NPC, NPC->enemy ) ) {//has been charmed to be on my team @@ -7647,7 +7647,7 @@ void NPC_BSJedi_Default( void ) //FIXME: build a list of all local enemies (since we have to find best anyway) for other AI factors- like when to use group attacks, determine when to change tactics, when surrounded, when blocked by another in the enemy group, etc. Should we build this group list or let the enemies maintain their own list and we just access it? gentity_t *sav_enemy = NPC->enemy;//FIXME: what about NPC->lastEnemy? NPC->enemy = NULL; - gentity_t *newEnemy = NPC_CheckEnemy( (qboolean)(NPCInfo->confusionTime < level.time), qfalse, qfalse ); + gentity_t *newEnemy = NPC_CheckEnemy( (qboolean)((NPCInfo->confusionTimeinsanityTimeenemy = sav_enemy; if ( newEnemy && newEnemy != sav_enemy ) {//picked up a new enemy! diff --git a/code/game/AI_Rancor.cpp b/code/game/AI_Rancor.cpp index 803636dfe3..f276e4e310 100644 --- a/code/game/AI_Rancor.cpp +++ b/code/game/AI_Rancor.cpp @@ -1621,7 +1621,7 @@ void NPC_BSRancor_Default( void ) { gentity_t *sav_enemy = NPC->enemy;//FIXME: what about NPC->lastEnemy? NPC->enemy = NULL; - gentity_t *newEnemy = NPC_CheckEnemy( (qboolean)(NPCInfo->confusionTime < level.time), qfalse, qfalse ); + gentity_t *newEnemy = NPC_CheckEnemy( (qboolean)((NPCInfo->confusionTimeinsanityTimeenemy = sav_enemy; if ( newEnemy && newEnemy != sav_enemy ) {//picked up a new enemy! diff --git a/code/game/AI_SaberDroid.cpp b/code/game/AI_SaberDroid.cpp index 7a6996c099..78eb11e636 100644 --- a/code/game/AI_SaberDroid.cpp +++ b/code/game/AI_SaberDroid.cpp @@ -110,7 +110,7 @@ NPC_BSSaberDroid_Patrol void NPC_BSSaberDroid_Patrol( void ) {//FIXME: pick up on bodies of dead buddies? - if ( NPCInfo->confusionTime < level.time ) + if ( (NPCInfo->confusionTimeinsanityTimescriptFlags&SCF_LOOK_FOR_ENEMIES ) diff --git a/code/game/AI_Sniper.cpp b/code/game/AI_Sniper.cpp index 6dae655077..0eca5ac7e7 100644 --- a/code/game/AI_Sniper.cpp +++ b/code/game/AI_Sniper.cpp @@ -214,7 +214,7 @@ void NPC_BSSniper_Patrol( void ) {//FIXME: pick up on bodies of dead buddies? NPC->count = 0; - if ( NPCInfo->confusionTime < level.time ) + if ( (NPCInfo->confusionTimeinsanityTimescriptFlags&SCF_LOOK_FOR_ENEMIES ) diff --git a/code/game/AI_Stormtrooper.cpp b/code/game/AI_Stormtrooper.cpp index bf278a5deb..acce4e3b81 100644 --- a/code/game/AI_Stormtrooper.cpp +++ b/code/game/AI_Stormtrooper.cpp @@ -875,7 +875,7 @@ NPC_ST_InvestigateEvent static qboolean NPC_ST_InvestigateEvent( int eventID, bool extraSuspicious ) { //If they've given themselves away, just take them as an enemy - if ( NPCInfo->confusionTime < level.time ) + if ( (NPCInfo->confusionTimeinsanityTimescriptFlags&SCF_LOOK_FOR_ENEMIES) ) { @@ -1104,7 +1104,7 @@ void NPC_BSST_Investigate( void ) WeaponThink( qtrue ); } - if ( NPCInfo->confusionTime < level.time ) + if ( (NPCInfo->confusionTimeinsanityTimescriptFlags&SCF_LOOK_FOR_ENEMIES ) { @@ -1127,7 +1127,7 @@ void NPC_BSST_Investigate( void ) //There is an event to look at if ( alertEvent >= 0 ) { - if ( NPCInfo->confusionTime < level.time ) + if ( (NPCInfo->confusionTimeinsanityTimeconfusionTime < level.time ) + if ( (NPCInfo->confusionTimeinsanityTimescriptFlags&SCF_LOOK_FOR_ENEMIES ) diff --git a/code/game/AI_Tusken.cpp b/code/game/AI_Tusken.cpp index bf6df7334a..6462720fdf 100644 --- a/code/game/AI_Tusken.cpp +++ b/code/game/AI_Tusken.cpp @@ -175,7 +175,7 @@ NPC_BSTusken_Patrol void NPC_BSTusken_Patrol( void ) {//FIXME: pick up on bodies of dead buddies? - if ( NPCInfo->confusionTime < level.time ) + if ( (NPCInfo->confusionTimeinsanityTimescriptFlags&SCF_LOOK_FOR_ENEMIES ) diff --git a/code/game/AI_Utils.cpp b/code/game/AI_Utils.cpp index bbb1b8313d..8a9924e78f 100644 --- a/code/game/AI_Utils.cpp +++ b/code/game/AI_Utils.cpp @@ -335,6 +335,9 @@ qboolean AI_ValidateGroupMember( AIGroupInfo_t *group, gentity_t *member ) //must be aware if ( member->NPC->confusionTime > level.time ) return qfalse; + + if ( member->NPC->insanityTime > level.time ) + return qfalse; //must be allowed to join groups if ( member->NPC->scriptFlags&SCF_NO_GROUPS ) diff --git a/code/game/AI_Wampa.cpp b/code/game/AI_Wampa.cpp index 57195d3015..90f6d20634 100644 --- a/code/game/AI_Wampa.cpp +++ b/code/game/AI_Wampa.cpp @@ -878,7 +878,7 @@ void NPC_BSWampa_Default( void ) { gentity_t *sav_enemy = NPC->enemy;//FIXME: what about NPC->lastEnemy? NPC->enemy = NULL; - gentity_t *newEnemy = NPC_CheckEnemy( (qboolean)(NPCInfo->confusionTime < level.time), qfalse, qfalse ); + gentity_t *newEnemy = NPC_CheckEnemy( (qboolean)((NPCInfo->confusionTimeinsanityTimeenemy = sav_enemy; if ( newEnemy && newEnemy != sav_enemy ) {//picked up a new enemy! diff --git a/code/game/NPC.cpp b/code/game/NPC.cpp index 328d9a2dbe..0315b44bcf 100644 --- a/code/game/NPC.cpp +++ b/code/game/NPC.cpp @@ -48,6 +48,7 @@ extern void Mark1_dying( gentity_t *self ); extern void NPC_BSCinematic( void ); extern int GetTime ( int lastTime ); extern void G_CheckCharmed( gentity_t *self ); +extern void G_CheckInsanity( gentity_t *self ); extern qboolean Boba_Flying( gentity_t *self ); extern qboolean RT_Flying( gentity_t *self ); extern qboolean Jedi_CultistDestroyer( gentity_t *self ); @@ -979,7 +980,7 @@ void NPC_ApplyScriptFlags (void) { if ( NPCInfo->scriptFlags & SCF_CROUCHED ) { - if ( NPCInfo->charmedTime > level.time && (ucmd.forwardmove || ucmd.rightmove) ) + if ( (NPCInfo->charmedTime > level.time || NPCInfo->darkCharmedTime > level.time) && (ucmd.forwardmove || ucmd.rightmove) ) {//ugh, if charmed and moving, ignore the crouched command } else @@ -994,7 +995,7 @@ void NPC_ApplyScriptFlags (void) } else if(NPCInfo->scriptFlags & SCF_WALKING) { - if ( NPCInfo->charmedTime > level.time && (ucmd.forwardmove || ucmd.rightmove) ) + if ( (NPCInfo->charmedTime > level.time || NPCInfo->darkCharmedTime > level.time) && (ucmd.forwardmove || ucmd.rightmove) ) {//ugh, if charmed and moving, ignore the walking command } else @@ -1880,6 +1881,7 @@ void NPC_RunBehavior( int team, int bState ) { NPC_BSEmplaced(); G_CheckCharmed( NPC ); + G_CheckInsanity( NPC ); return; } else if ( NPC->client->NPC_class == CLASS_HOWLER ) @@ -1936,6 +1938,7 @@ void NPC_RunBehavior( int team, int bState ) NPC_BehaviorSet_Stormtrooper( bState ); } G_CheckCharmed( NPC ); + G_CheckInsanity( NPC ); } else if ( NPC->client->NPC_class == CLASS_RANCOR ) { @@ -1949,6 +1952,7 @@ void NPC_RunBehavior( int team, int bState ) { NPC_BehaviorSet_Wampa( bState ); G_CheckCharmed( NPC ); + G_CheckInsanity( NPC ); } else if ( NPCInfo->scriptFlags & SCF_FORCED_MARCH ) {//being forced to march @@ -1960,12 +1964,14 @@ void NPC_RunBehavior( int team, int bState ) { NPC_BehaviorSet_Sniper( bState ); G_CheckCharmed( NPC ); + G_CheckInsanity( NPC ); return; } else { NPC_BehaviorSet_Tusken( bState ); G_CheckCharmed( NPC ); + G_CheckInsanity( NPC ); return; } } @@ -1973,15 +1979,18 @@ void NPC_RunBehavior( int team, int bState ) { NPC_BehaviorSet_Tusken( bState ); G_CheckCharmed( NPC ); + G_CheckInsanity( NPC ); return; } else if ( NPC->client->ps.weapon == WP_NOGHRI_STICK ) { NPC_BehaviorSet_Stormtrooper( bState ); G_CheckCharmed( NPC ); + G_CheckInsanity( NPC ); } else { + G_CheckInsanity( NPC ); switch( team ) { @@ -2122,7 +2131,7 @@ void NPC_RunBehavior( int team, int bState ) } else { - if ( NPCInfo->charmedTime > level.time ) + if ( (NPCInfo->charmedTime > level.time || NPCInfo->darkCharmedTime > level.time) ) { NPC_BehaviorSet_Charmed( bState ); } @@ -2378,7 +2387,7 @@ void NPC_Think ( gentity_t *self)//, int msec ) VectorCopy( self->client->ps.moveDir, oldMoveDir ); VectorClear( self->client->ps.moveDir ); // see if NPC ai is frozen - if ( debugNPCFreeze->integer || (NPC->svFlags&SVF_ICARUS_FREEZE) ) + if ( debugNPCFreeze->integer || (NPC->svFlags&SVF_ICARUS_FREEZE) || (self && self->client && self->client->ps.stasisTime > level.time)) { NPC_UpdateAngles( qtrue, qtrue ); ClientThink(self->s.number, &ucmd); @@ -2630,6 +2639,11 @@ void NPC_SetAnim(gentity_t *ent,int setAnimParts,int anim,int setAnimFlags, int { return; } + + if ( ent->client->ps.stasisTime > level.time ) + { + return; + } if(ent->client) {//Players, NPCs diff --git a/code/game/NPC_behavior.cpp b/code/game/NPC_behavior.cpp index 249bc3c17d..1a1060d40a 100644 --- a/code/game/NPC_behavior.cpp +++ b/code/game/NPC_behavior.cpp @@ -593,7 +593,7 @@ void NPC_BSFollowLeader_UpdateEnemy(void) { if ( !NPC->enemy ) {//no enemy, find one - NPC_CheckEnemy( (qboolean)(NPCInfo->confusionTimeconfusionTimeinsanityTimeenemy ) {//just found one NPCInfo->enemyCheckDebounceTime = level.time + Q_irand( 3000, 10000 ); @@ -651,7 +651,7 @@ void NPC_BSFollowLeader_UpdateEnemy(void) } else if ( NPC->client->ps.weapon && NPCInfo->enemyCheckDebounceTime < level.time ) { - NPC_CheckEnemy( (qboolean)(NPCInfo->confusionTimetempBehavior!=BS_FOLLOW_LEADER), qfalse );//don't find new enemy if this is tempbehav + NPC_CheckEnemy( (qboolean)(((NPCInfo->confusionTimeinsanityTimetempBehavior!=BS_FOLLOW_LEADER), qfalse );//don't find new enemy if this is tempbehav } } } diff --git a/code/game/NPC_combat.cpp b/code/game/NPC_combat.cpp index 9b5f7c68d8..95214cdb13 100644 --- a/code/game/NPC_combat.cpp +++ b/code/game/NPC_combat.cpp @@ -434,6 +434,11 @@ void G_SetEnemy( gentity_t *self, gentity_t *enemy ) {//can't pick up enemies if confused return; } + + if ( self->NPC->insanityTime > level.time ) + {//can't pick up enemies if confused + return; + } #ifdef _DEBUG if ( self->s.number ) @@ -449,7 +454,7 @@ void G_SetEnemy( gentity_t *self, gentity_t *enemy ) if ( self->client && self->NPC && enemy->client && enemy->client->playerTeam == self->client->playerTeam ) {//Probably a damn script! - if ( self->NPC->charmedTime > level.time ) + if ( self->NPC->charmedTime > level.time || self->NPC->darkCharmedTime > level.time ) {//Probably a damn script! return; } diff --git a/code/game/NPC_reactions.cpp b/code/game/NPC_reactions.cpp index 643bc7dd93..389cf09a6b 100644 --- a/code/game/NPC_reactions.cpp +++ b/code/game/NPC_reactions.cpp @@ -479,7 +479,7 @@ void NPC_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, const ve } else if ( self->NPC && !other->s.number )//should be assumed, but... {//dammit, stop that! - if ( self->NPC->charmedTime > level.time ) + if ( self->NPC->charmedTime > level.time || self->NPC->darkCharmedTime > level.time ) {//mindtricked return; } @@ -533,9 +533,20 @@ void NPC_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, const ve if ( NPCInfo->ignorePain == qfalse ) { NPCInfo->confusionTime = 0;//clear any charm or confusion, regardless + if (NPCInfo->insanityTime && NPCInfo->insanityTime > level.time) + { + NPCInfo->insanityTime = 0; + NPC->client->ps.torsoAnimTimer = 0; + NPC->client->ps.weaponTime -= level.time - NPCInfo->insanityTime; + if (NPC->client->ps.weaponTime < 0) + { + NPC->client->ps.weaponTime = 0; + } + } if ( NPC->ghoul2.size() && NPC->headBolt != -1 ) { G_StopEffect("force/confusion", NPC->playerModel, NPC->headBolt, NPC->s.number ); + G_StopEffect("force/drain_hand", NPC->playerModel, NPC->headBolt, NPC->s.number ); } if ( damage != -1 ) {//-1 == don't play pain anim diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index aad14a3163..1405ff72c0 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -88,6 +88,14 @@ stringID_table_t FPTable[] = ENUM2STRING(FP_ABSORB), ENUM2STRING(FP_DRAIN), ENUM2STRING(FP_SEE), + //new bonus powers + ENUM2STRING(FP_DESTRUCTION), + ENUM2STRING(FP_INSANITY), + ENUM2STRING(FP_STASIS), + ENUM2STRING(FP_BLINDING), + ENUM2STRING(FP_DEADLYSIGHT), + ENUM2STRING(FP_REPULSE), + ENUM2STRING(FP_INVULNERABILITY), { "", -1 } }; diff --git a/code/game/NPC_utils.cpp b/code/game/NPC_utils.cpp index 816e2fa2d5..2ed3b3c670 100644 --- a/code/game/NPC_utils.cpp +++ b/code/game/NPC_utils.cpp @@ -27,6 +27,7 @@ along with this program; if not, see . #include "g_navigator.h" #include "../cgame/cg_local.h" #include "g_nav.h" +#include "g_functions.h" extern Vehicle_t *G_IsRidingVehicle( gentity_t *pEnt ); @@ -1269,6 +1270,12 @@ qboolean NPC_FindEnemy( qboolean checkAlerts = qfalse ) G_ClearEnemy( NPC ); return qfalse; } + + if( NPCInfo->insanityTime > level.time ) + { + G_ClearEnemy( NPC ); + return qfalse; + } //Don't want a new enemy if ( ( NPC_ValidEnemy( NPC->enemy ) ) && ( NPC->svFlags & SVF_LOCKEDENEMY ) ) @@ -1521,6 +1528,7 @@ NPC_CheckCharmed ------------------------- */ extern void G_AddVoiceEvent( gentity_t *self, int event, int speakDebounceTime ); +extern qboolean PM_HasAnimation( gentity_t *ent, int animation ); void G_CheckCharmed( gentity_t *self ) { if ( self @@ -1547,6 +1555,49 @@ void G_CheckCharmed( gentity_t *self ) G_AddVoiceEvent( self, Q_irand(EV_CONFUSE1, EV_CONFUSE3), 2000 ); } } + else if ( self + && self->client + && self->client->playerTeam == TEAM_PLAYER + && self->NPC + && self->NPC->darkCharmedTime + && (self->NPC->darkCharmedTime < level.time ||self->health <= 0) ) + {//we were charmed, set us back! + //NOTE: presumptions here... + team_t savTeam = self->client->enemyTeam; + self->client->enemyTeam = self->client->playerTeam; + self->client->playerTeam = savTeam; + self->client->leader = NULL; + self->NPC->darkCharmedTime = 0; + if ( self->health > 0 ) + { + if ( self->NPC->tempBehavior == BS_FOLLOW_LEADER ) + { + self->NPC->tempBehavior = BS_DEFAULT; + } + G_ClearEnemy( self ); + } + if (self->health > 0) + { + self->health = 0; + GEntity_DieFunc( self, self, self, self->max_health, MOD_DESTRUCTION); + } + } +} + +void G_CheckInsanity( gentity_t *self ) +{ + if ( self + && self->client + && self->NPC + && self->NPC->insanityTime + && self->NPC->insanityTime > level.time + && (self->client->ps.torsoAnim != BOTH_SONICPAIN_HOLD) + && PM_HasAnimation( self, BOTH_SONICPAIN_HOLD ) ) + { + NPC_SetAnim( self, SETANIM_LEGS, BOTH_SONICPAIN_HOLD, SETANIM_FLAG_NORMAL|SETANIM_FLAG_RESTART ); + NPC_SetAnim( self, SETANIM_TORSO, BOTH_SONICPAIN_HOLD, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART ); + self->client->ps.torsoAnimTimer += self->NPC->insanityTime - level.time; + } } diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 86a72f348a..3e11879f1c 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -419,6 +419,13 @@ stringID_table_t setTable[] = ENUM2STRING(SET_FORCE_ABSORB_LEVEL), ENUM2STRING(SET_FORCE_DRAIN_LEVEL), ENUM2STRING(SET_FORCE_SIGHT_LEVEL), + ENUM2STRING(SET_FORCE_DESTRUCTION_LEVEL), + ENUM2STRING(SET_FORCE_INSANITY_LEVEL), + ENUM2STRING(SET_FORCE_STASIS_LEVEL), + ENUM2STRING(SET_FORCE_BLINDING_LEVEL), + ENUM2STRING(SET_FORCE_DEADLYSIGHT_LEVEL), + ENUM2STRING(SET_FORCE_REPULSE_LEVEL), + ENUM2STRING(SET_FORCE_INVULNERABILITY_LEVEL), ENUM2STRING(SET_SABER1_COLOR1), ENUM2STRING(SET_SABER1_COLOR2), ENUM2STRING(SET_SABER2_COLOR1), @@ -485,6 +492,13 @@ stringID_table_t setTable[] = ENUM2STRING(SET_FORCE_PROTECT), ENUM2STRING(SET_FORCE_ABSORB), ENUM2STRING(SET_FORCE_DRAIN), + ENUM2STRING(SET_FORCE_DESTRUCTION), + ENUM2STRING(SET_FORCE_INSANITY), + ENUM2STRING(SET_FORCE_STASIS), + ENUM2STRING(SET_FORCE_BLINDING), + ENUM2STRING(SET_FORCE_DEADLYSIGHT), + ENUM2STRING(SET_FORCE_REPULSE), + ENUM2STRING(SET_FORCE_INVULNERABILITY), ENUM2STRING(SET_WINTER_GEAR), ENUM2STRING(SET_NO_ANGLES), ENUM2STRING(SET_SABER_ORIGIN), @@ -4817,9 +4831,11 @@ static void Q3_SetNoMindTrick( int entID, qboolean add) { ent->NPC->scriptFlags |= SCF_NO_MIND_TRICK; ent->NPC->confusionTime = 0; + ent->NPC->insanityTime = 0; if ( ent->ghoul2.size() && ent->headBolt != -1 ) { G_StopEffect("force/confusion", ent->playerModel, ent->headBolt, ent->s.number ); + G_StopEffect("force/drain_hand", ent->playerModel, ent->headBolt, ent->s.number ); } } else @@ -9442,6 +9458,13 @@ extern void LockDoors(gentity_t *const ent); case SET_FORCE_ABSORB_LEVEL: case SET_FORCE_DRAIN_LEVEL: case SET_FORCE_SIGHT_LEVEL: + case SET_FORCE_DESTRUCTION_LEVEL: + case SET_FORCE_INSANITY_LEVEL: + case SET_FORCE_STASIS_LEVEL: + case SET_FORCE_BLINDING_LEVEL: + case SET_FORCE_DEADLYSIGHT_LEVEL: + case SET_FORCE_REPULSE_LEVEL: + case SET_FORCE_INVULNERABILITY_LEVEL: int_data = atoi((char *) data); Q3_SetForcePowerLevel( entID, (toSet-SET_FORCE_HEAL_LEVEL), int_data ); break; @@ -9530,6 +9553,28 @@ extern void Saboteur_Cloak( gentity_t *self ); case SET_FORCE_DRAIN: Q3_SetForcePower( entID, FP_DRAIN, (qboolean)(Q_stricmp("true",(char*)data)==0) ); break; + case SET_FORCE_DESTRUCTION: + Q3_SetForcePower( entID, FP_DESTRUCTION, (qboolean)(Q_stricmp("true",(char*)data)==0) ); + break; + case SET_FORCE_INSANITY: + Q3_SetForcePower( entID, FP_INSANITY, (qboolean)(Q_stricmp("true",(char*)data)==0) ); + break; + case SET_FORCE_STASIS: + Q3_SetForcePower( entID, FP_STASIS, (qboolean)(Q_stricmp("true",(char*)data)==0) ); + break; + case SET_FORCE_BLINDING: + Q3_SetForcePower( entID, FP_BLINDING, (qboolean)(Q_stricmp("true",(char*)data)==0) ); + break; + case SET_FORCE_DEADLYSIGHT: + Q3_SetForcePower( entID, FP_DEADLYSIGHT, (qboolean)(Q_stricmp("true",(char*)data)==0) ); + break; + case SET_FORCE_REPULSE: + Q3_SetForcePower( entID, FP_REPULSE, (qboolean)(Q_stricmp("true",(char*)data)==0) ); + break; + case SET_FORCE_INVULNERABILITY: + Q3_SetForcePower( entID, FP_INVULNERABILITY, (qboolean)(Q_stricmp("true",(char*)data)==0) ); + break; + extern cvar_t *g_char_model; extern cvar_t *g_char_skin_head; diff --git a/code/game/Q3_Interface.h b/code/game/Q3_Interface.h index ca9b03dae4..b4ecd00261 100644 --- a/code/game/Q3_Interface.h +++ b/code/game/Q3_Interface.h @@ -262,6 +262,14 @@ typedef enum //# setType_e SET_FORCE_PROTECT,//## %t="BOOL_TYPES" # Causes this ent to start a force protect at whatever level of force protect they have SET_FORCE_ABSORB,//## %t="BOOL_TYPES" # Causes this ent to do start a force absorb at whatever level of force absorb they have SET_FORCE_DRAIN,//## %t="BOOL_TYPES" # Causes this ent to start force draining their enemy at whatever level of force drain they have (will drain until scripted to stop) + SET_FORCE_DESTRUCTION, + SET_FORCE_INSANITY, + SET_FORCE_STASIS, + SET_FORCE_BLINDING, + SET_FORCE_DEADLYSIGHT, + SET_FORCE_REPULSE, + SET_FORCE_INVULNERABILITY, + SET_WINTER_GEAR, //## %t="BOOL_TYPES" # Set the player to wear his/her winter gear (skins torso_g1 and lower_e1), or restore the default skins. SET_NO_ANGLES, //## %t="BOOL_TYPES" # This NPC/player will not have any bone angle overrides or pitch or roll (should only be used in cinematics) @@ -298,6 +306,13 @@ typedef enum //# setType_e SET_FORCE_ABSORB_LEVEL,//## %t="FORCE_LEVELS" # Change force power level SET_FORCE_DRAIN_LEVEL,//## %t="FORCE_LEVELS" # Change force power level SET_FORCE_SIGHT_LEVEL,//## %t="FORCE_LEVELS" # Change force power level + SET_FORCE_DESTRUCTION_LEVEL, + SET_FORCE_INSANITY_LEVEL, + SET_FORCE_STASIS_LEVEL, + SET_FORCE_BLINDING_LEVEL, + SET_FORCE_DEADLYSIGHT_LEVEL, + SET_FORCE_REPULSE_LEVEL, + SET_FORCE_INVULNERABILITY_LEVEL, SET_SABER1_COLOR1, //## %t="SABER_COLORS" # Set color of first blade of first saber SET_SABER1_COLOR2, //## %t="SABER_COLORS" # Set color of second blade of first saber SET_SABER2_COLOR1, //## %t="SABER_COLORS" # Set color of first blade of first saber diff --git a/code/game/b_public.h b/code/game/b_public.h index 4f081098ca..2490fea617 100644 --- a/code/game/b_public.h +++ b/code/game/b_public.h @@ -372,6 +372,9 @@ class gNPC_t int controlledTime; //controlled by player int surrenderTime; //Hands up int kneelTime; //kneeling (for troopers) + + int insanityTime; //Insanity! + int darkCharmedTime; //Charmed to enemy team (dark version) //Lagging enemy position - FIXME: seems awful wasteful... vec3_t enemyLaggedPos[ENEMY_POS_LAG_STEPS]; diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index 9ee0176c2f..43e79fa1cc 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -5114,12 +5114,17 @@ void PM_SetAnim(pmove_t *pm,int setAnimParts,int anim,int setAnimFlags, int blen {//FIXME: sometimes we'll want to set anims when your dead... twitches, impacts, etc. return; } - + if ( pm->gent == NULL ) { return; } + if ( pm->ps->stasisTime > level.time ) + { + return; + } + if ( !pm->gent || pm->gent->health > 0 ) {//don't lock anims if the guy is dead if ( pm->ps->torsoAnimTimer diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index dccb527153..f44034b91a 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -14345,6 +14345,14 @@ extern void ForceRage( gentity_t *self ); extern void ForceProtect( gentity_t *self ); extern void ForceAbsorb( gentity_t *self ); extern void ForceSeeing( gentity_t *self ); +extern void ForceDestruction( gentity_t *self ); +extern void ForceInsanity( gentity_t *self ); +extern void ForceStasis( gentity_t *self ); +extern void ForceBlinding( gentity_t *self ); +extern void ForceDeadlySight( gentity_t *self ); +extern void ForceRepulse( gentity_t *self ); +extern void ForceInvulnerability( gentity_t *self ); + void PM_CheckForceUseButton( gentity_t *ent, usercmd_t *ucmd ) { if ( !ent ) @@ -14387,6 +14395,27 @@ void PM_CheckForceUseButton( gentity_t *ent, usercmd_t *ucmd ) case FP_SEE: //duration - detect/see hidden enemies ForceSeeing( ent ); break; + case FP_DESTRUCTION: + ForceDestruction( ent ); + break; + case FP_INSANITY: + ForceInsanity( ent ); + break; + case FP_STASIS: + ForceStasis( ent ); + break; + case FP_BLINDING: + ForceBlinding( ent ); + break; + case FP_DEADLYSIGHT: + ForceDeadlySight( ent ); + break; + case FP_REPULSE: + ForceRepulse( ent ); + break; + case FP_INVULNERABILITY: + ForceInvulnerability( ent ); + break; } } //these stay are okay to call every frame button is down @@ -15052,7 +15081,7 @@ void Pmove( pmove_t *pmove ) if (pm->ps->pm_type == PM_FREEZE) { return; // no movement at all } - + if ( pm->ps->pm_type == PM_INTERMISSION ) { return; // no movement at all } @@ -15307,7 +15336,6 @@ void Pmove( pmove_t *pmove ) } } - // ANIMATION //================================ @@ -15340,12 +15368,16 @@ void Pmove( pmove_t *pmove ) else // TEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMP { // footstep events / legs animations - PM_Footsteps(); + if (pm->ps->stasisTime < level.time) { + PM_Footsteps(); + } } // torso animation if ( !pVeh ) {//not riding a vehicle - PM_TorsoAnimation(); + if (pm->ps->stasisTime < level.time) { + PM_TorsoAnimation(); + } } // entering / leaving water splashes diff --git a/code/game/bg_public.h b/code/game/bg_public.h index bd69d96c5b..0ab8116504 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -638,6 +638,8 @@ typedef enum { MOD_SUICIDE, MOD_TRIGGER_HURT, MOD_GAS, + + MOD_DESTRUCTION, NUM_MODS, diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index da1524cd02..10bc2ead31 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -4696,6 +4696,14 @@ extern void ForceSeeing(gentity_t *ent); extern void ForceTelepathy(gentity_t *ent); extern void ForceAbsorb(gentity_t *ent); extern void ForceHeal(gentity_t *ent); +extern void ForceDestruction( gentity_t *ent ); +extern void ForceInsanity( gentity_t *ent ); +extern void ForceStasis( gentity_t *ent ); +extern void ForceBlinding( gentity_t *ent ); +extern void ForceDeadlySight( gentity_t *ent ); +extern void ForceRepulse( gentity_t *ent ); +extern void ForceInvulnerability( gentity_t *ent ); + static void ProcessGenericCmd(gentity_t *ent, byte cmd) { switch(cmd) { @@ -4737,6 +4745,27 @@ static void ProcessGenericCmd(gentity_t *ent, byte cmd) case GENCMD_FORCE_SEEING: ForceSeeing(ent); break; + case GENCMD_FORCE_DESTRUCTION: + ForceDestruction(ent); + break; + case GENCMD_FORCE_INSANITY: + ForceInsanity(ent); + break; + case GENCMD_FORCE_STASIS: + ForceStasis(ent); + break; + case GENCMD_FORCE_BLINDING: + ForceBlinding(ent); + break; + case GENCMD_FORCE_DEADLYSIGHT: + ForceDeadlySight(ent); + break; + case GENCMD_FORCE_REPULSE: + ForceRepulse(ent); + break; + case GENCMD_FORCE_INVULNERABILITY: + ForceInvulnerability(ent); + break; } } diff --git a/code/game/g_cmds.cpp b/code/game/g_cmds.cpp index 4008ba08ee..b11247bd6b 100644 --- a/code/game/g_cmds.cpp +++ b/code/game/g_cmds.cpp @@ -39,6 +39,13 @@ extern void ForceRage( gentity_t *self ); extern void ForceProtect( gentity_t *self ); extern void ForceAbsorb( gentity_t *self ); extern void ForceSeeing( gentity_t *self ); +extern void ForceDestruction( gentity_t *self ); +extern void ForceInsanity( gentity_t *self ); +extern void ForceStasis( gentity_t *self ); +extern void ForceBlinding( gentity_t *self ); +extern void ForceDeadlySight( gentity_t *self ); +extern void ForceRepulse( gentity_t *self ); +extern void ForceInvulnerability( gentity_t *self ); extern void G_CreateG2AttachedWeaponModel( gentity_t *ent, const char *psWeaponModel, int boltNum, int weaponNum ); extern void G_StartMatrixEffect( gentity_t *ent, int meFlags = 0, int length = 1000, float timeScale = 0.0f, int spinTime = 0 ); extern void ItemUse_Bacta(gentity_t *ent); @@ -1483,6 +1490,41 @@ void ClientCommand( int clientNum ) { ent = G_GetSelfForPlayerCmd(); ForceSeeing(ent); } + else if (Q_stricmp (cmd, "force_destruction") == 0) + { + ent = G_GetSelfForPlayerCmd(); + ForceDestruction(ent); + } + else if (Q_stricmp (cmd, "force_insanity") == 0) + { + ent = G_GetSelfForPlayerCmd(); + ForceInsanity(ent); + } + else if (Q_stricmp (cmd, "force_stasis") == 0) + { + ent = G_GetSelfForPlayerCmd(); + ForceStasis(ent); + } + else if (Q_stricmp (cmd, "force_blinding") == 0) + { + ent = G_GetSelfForPlayerCmd(); + ForceBlinding(ent); + } + else if (Q_stricmp (cmd, "force_deadlysight") == 0) + { + ent = G_GetSelfForPlayerCmd(); + ForceDeadlySight(ent); + } + else if (Q_stricmp (cmd, "force_repulse") == 0) + { + ent = G_GetSelfForPlayerCmd(); + ForceRepulse(ent); + } + else if (Q_stricmp (cmd, "force_invulnerability") == 0) + { + ent = G_GetSelfForPlayerCmd(); + ForceInvulnerability(ent); + } else if (Q_stricmp (cmd, "addsaberstyle") == 0) { ent = G_GetSelfForPlayerCmd(); diff --git a/code/game/g_combat.cpp b/code/game/g_combat.cpp index 1e28a726b3..6a2b92a30d 100644 --- a/code/game/g_combat.cpp +++ b/code/game/g_combat.cpp @@ -3916,7 +3916,8 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); || meansOfDeath == MOD_CRUSH || meansOfDeath == MOD_IMPACT || meansOfDeath == MOD_FALLING - || meansOfDeath == MOD_EXPLOSIVE_SPLASH ) ) + || meansOfDeath == MOD_EXPLOSIVE_SPLASH + || meansOfDeath == MOD_DESTRUCTION ) ) {//drop it TossClientItems( self ); self->client->ps.weapon = self->s.weapon = WP_NONE; @@ -3954,7 +3955,7 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); {//killed a client if ( self->client->playerTeam == TEAM_ENEMY || self->client->playerTeam == TEAM_FREE - || (self->NPC && self->NPC->charmedTime > level.time) ) + || (self->NPC && (self->NPC->charmedTime > level.time || self->NPC->darkCharmedTime > level.time) ) ) {//killed an enemy attacker->client->sess.missionStats.enemiesKilled++; } @@ -4147,6 +4148,8 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); self->NPC->desiredPitch = 0; self->NPC->confusionTime = 0; self->NPC->charmedTime = 0; + self->NPC->insanityTime = 0; + self->NPC->darkCharmedTime = 0; if ( self->ghoul2.size() ) { if ( self->chestBolt != -1 ) @@ -4156,10 +4159,12 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); if ( self->headBolt != -1 ) { G_StopEffect("force/confusion", self->playerModel, self->headBolt, self->s.number ); + G_StopEffect("force/drain_hand", self->playerModel, self->headBolt, self->s.number ); } WP_StopForceHealEffects( self ); } } + self->client->ps.stasisTime = 0; VectorCopy( self->currentAngles, self->client->ps.viewangles ); //FACING========================================================== if ( player && player->client && player->client->ps.viewEntity == self->s.number ) @@ -4563,7 +4568,8 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); && meansOfDeath!=MOD_LASERTRIP && meansOfDeath!=MOD_LASERTRIP_ALT && meansOfDeath!=MOD_EXPLOSIVE - && meansOfDeath!=MOD_EXPLOSIVE_SPLASH ) + && meansOfDeath!=MOD_EXPLOSIVE_SPLASH + && meansOfDeath!=MOD_DESTRUCTION ) {//no sound when killed by headshot (explosions don't count) G_AlertTeam( self, attacker, 512, 0 ); if ( gi.VoiceVolume[self->s.number] ) @@ -5108,7 +5114,8 @@ void G_CheckKnockdown( gentity_t *targ, gentity_t *attacker, vec3_t newDir, int &&mod!=MOD_LASERTRIP &&mod!=MOD_LASERTRIP_ALT &&mod!=MOD_EXPLOSIVE - &&mod!=MOD_EXPLOSIVE_SPLASH ) + &&mod!=MOD_EXPLOSIVE_SPLASH + &&mod!=MOD_DESTRUCTION ) { return; } @@ -5418,7 +5425,8 @@ qboolean G_NonLocationSpecificDamage( int meansOfDeath ) || meansOfDeath == MOD_FORCE_GRIP || meansOfDeath == MOD_KNOCKOUT || meansOfDeath == MOD_CRUSH - || meansOfDeath == MOD_EXPLOSIVE_SPLASH ) + || meansOfDeath == MOD_EXPLOSIVE_SPLASH + || meansOfDeath == MOD_DESTRUCTION ) { return qtrue; } @@ -5747,7 +5755,8 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, const || mod == MOD_LASERTRIP_ALT || mod == MOD_EXPLOSIVE_SPLASH || mod == MOD_ENERGY_SPLASH - || mod == MOD_SABER ) + || mod == MOD_SABER + || mod == MOD_DESTRUCTION ) {//galak without shields takes quarter damage from explosives and lightsaber damage = ceil((float)damage/4.0f); } @@ -5916,7 +5925,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, const if ( targ->client && attacker->client && targ->client->playerTeam == attacker->client->playerTeam - && (!targ->NPC || !targ->NPC->charmedTime) ) + && (!targ->NPC || (!targ->NPC->charmedTime && !targ->NPC->darkCharmedTime)) ) {//complain, but don't turn on them G_FriendlyFireReaction( targ, attacker, dflags ); } @@ -5966,9 +5975,27 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, const } } //absorb - /* + if ( (targ->client->ps.forcePowersActive & (1 << FP_ABSORB)) ) { + if ( mod == MOD_DESTRUCTION ) + { + switch (targ->client->ps.forcePowerLevel[FP_ABSORB]) { + case FORCE_LEVEL_1: + damage *= 0.5f; + break; + case FORCE_LEVEL_2: + damage *= 0.25f; + break; + case FORCE_LEVEL_3: + damage *= 0.1f; + break; + default: + damage = 0; + break; + } + } + /* if ( mod == MOD_FORCE_LIGHTNING || mod == MOD_FORCE_GRIP || mod == MOD_FORCE_DRAIN ) @@ -5984,9 +6011,9 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, const //make absorb sound G_SoundOnEnt( targ, CHAN_ITEM, "sound/weapons/force/absorbhit.wav" ); targ->client->ps.forcePower += absorbed; - } + }*/ } - */ + } knockback = damage; @@ -6074,7 +6101,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, const if ( targ->client && attacker->client && targ->client->playerTeam == attacker->client->playerTeam - && (!targ->NPC || !targ->NPC->charmedTime) ) + && (!targ->NPC || (!targ->NPC->charmedTime && !targ->NPC->darkCharmedTime)) ) {//complain, but don't turn on them G_FriendlyFireReaction( targ, attacker, dflags ); } @@ -6655,7 +6682,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, const if ( yellAtAttacker ) { - if ( !targ->NPC || !targ->NPC->charmedTime ) + if ( !targ->NPC || (!targ->NPC->charmedTime && !targ->NPC->darkCharmedTime) ) { G_FriendlyFireReaction( targ, attacker, dflags ); } diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index d5c8dfbcb5..24fb3c992b 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -390,7 +390,7 @@ static void G_DynamicMusicUpdate( void ) } LOScalced = clearLOS = qfalse; - if ( (ent->enemy==player&&(!ent->NPC||ent->NPC->confusionTimeclient&&ent->client->ps.weaponTime) || (!ent->client&&ent->attackDebounceTime>level.time)) + if ( (ent->enemy==player&&(!ent->NPC||((ent->NPC->confusionTimeNPC->insanityTimeclient&&ent->client->ps.weaponTime) || (!ent->client&&ent->attackDebounceTime>level.time)) {//mad if ( ent->health > 0 ) {//alive diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index 27e35bf1c3..bb78c1e4ce 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -352,6 +352,13 @@ SetForceCmd SetForceTable[NUM_FORCE_POWERS] = { { "forceAbsorb", "setForceAbsorb", FORCE_LEVEL_3 }, { "forceDrain", "setForceDrain", FORCE_LEVEL_3 }, { "forceSight", "setForceSight", FORCE_LEVEL_3 }, + { "forceDestruction", "setForceDestruction", FORCE_LEVEL_3 }, + { "forceInsanity", "setForceInsanity", FORCE_LEVEL_3 }, + { "forceStasis", "setForceStasis", FORCE_LEVEL_3 }, + { "forceBlinding", "setForceBlinding", FORCE_LEVEL_3 }, + { "forceDeadlySight", "setForceDeadlySight", FORCE_LEVEL_3 }, + { "forceRepulse", "setForceRepulse", FORCE_LEVEL_3 }, + { "forceInvulnerability", "setForceInvulnerability", FORCE_LEVEL_3 }, }; static void Svcmd_ForceSetLevel_f( int forcePower ) @@ -1071,6 +1078,13 @@ static svcmd_t svcmds[] = { { "setForceProtect", Svcmd_ForceSetLevel_f, CMD_CHEAT }, { "setForceAbsorb", Svcmd_ForceSetLevel_f, CMD_CHEAT }, { "setForceSight", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceDestruction", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceInsanity", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceStasis", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceBlinding", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceDeadlySight", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceRepulse", Svcmd_ForceSetLevel_f, CMD_CHEAT }, + { "setForceInvulnerability", Svcmd_ForceSetLevel_f, CMD_CHEAT }, { "setForceAll", Svcmd_SetForceAll_f, CMD_CHEAT }, { "setSaberAll", Svcmd_SetSaberAll_f, CMD_CHEAT }, diff --git a/code/game/g_target.cpp b/code/game/g_target.cpp index c2b58f53fd..27417fa1dc 100644 --- a/code/game/g_target.cpp +++ b/code/game/g_target.cpp @@ -1002,6 +1002,14 @@ void set_mission_stats_cvars( void ) gi.cvar_set("ui_stats_lightning", va("%d",client->sess.missionStats.forceUsed[FP_LIGHTNING])); gi.cvar_set("ui_stats_rage", va("%d",client->sess.missionStats.forceUsed[FP_RAGE])); + gi.cvar_set("ui_stats_destruction", va("%d",client->sess.missionStats.forceUsed[FP_DESTRUCTION])); + gi.cvar_set("ui_stats_insanity", va("%d",client->sess.missionStats.forceUsed[FP_INSANITY])); + gi.cvar_set("ui_stats_stasis", va("%d",client->sess.missionStats.forceUsed[FP_STASIS])); + gi.cvar_set("ui_stats_blinding", va("%d",client->sess.missionStats.forceUsed[FP_BLINDING])); + + gi.cvar_set("ui_stats_deadlysight", va("%d",client->sess.missionStats.forceUsed[FP_DEADLYSIGHT])); + gi.cvar_set("ui_stats_repulse", va("%d",client->sess.missionStats.forceUsed[FP_REPULSE])); + gi.cvar_set("ui_stats_invulnerability", va("%d",client->sess.missionStats.forceUsed[FP_INVULNERABILITY])); } #include "../cgame/cg_media.h" //access to cgs diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 36adad4503..c8e2ec2ad5 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -190,6 +190,13 @@ int forcePowerDarkLight[NUM_FORCE_POWERS] = //0 == neutral FORCE_LIGHTSIDE,//FP_ABSORB,//duration FORCE_DARKSIDE,//FP_DRAIN,//hold/duration 0,//FP_SEE,//duration + FORCE_DARKSIDE,//FP_DESTRUCTION + FORCE_DARKSIDE,//FP_INSANITY + FORCE_LIGHTSIDE,//FP_STASIS + FORCE_LIGHTSIDE,//FP_BLINDING + FORCE_DARKSIDE,//FP_DEADLYSIGHT + 0,//FP_REPULSE + FORCE_LIGHTSIDE,//FP_INVULNERABILITY //NUM_FORCE_POWERS }; @@ -211,7 +218,14 @@ int forcePowerNeeded[NUM_FORCE_POWERS] = 30,//FP_PROTECT,//duration - protect against physical/energy (level 1 stops blaster/energy bolts, level 2 stops projectiles, level 3 protects against explosions) 30,//FP_ABSORB,//duration - protect against dark force powers (grip, lightning, drain) 1,//FP_DRAIN,//hold/duration - drain force power for health - 20//FP_SEE,//duration - detect/see hidden enemies + 20,//FP_SEE,//duration - detect/see hidden enemies + 40,//FP_DESTRUCTION + 50,//FP_INSANITY + 35,//FP_STASIS + 20,//FP_BLINDING + 90,//FP_DEADLYSIGHT + 40,//FP_REPULSE + 100,//FP_INVULNERABILITY //NUM_FORCE_POWERS }; @@ -303,6 +317,22 @@ int mindTrickTime[NUM_FORCE_POWER_LEVELS] = 30000//15000 }; +int insanityTime[NUM_FORCE_POWER_LEVELS] = +{ + 0,//none + 5000,//5000, + 10000,//10000, + 15000//15000 +}; + +int stasisTime[NUM_FORCE_POWER_LEVELS] = +{ + 0,//none + 5000,//5000, + 10000,//10000, + 15000//15000 +}; + //NOTE: keep in synch with table below!!! int saberThrowDist[NUM_FORCE_POWER_LEVELS] = { @@ -10317,7 +10347,8 @@ void WP_DebounceForceDeactivateTime( gentity_t *self ) || self->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1<client->ps.forceAllowDeactivateTime = level.time + 500; } @@ -10671,7 +10702,9 @@ void ForceTelepathy( gentity_t *self ) } if ( targetLive && traceEnt->NPC - && traceEnt->health > 0 ) + && traceEnt->health > 0 + && traceEnt->NPC->darkCharmedTime < level.time + && traceEnt->NPC->insanityTime < level.time ) {//hit an organic non-player if ( G_ActivateBehavior( traceEnt, BSET_MINDTRICK ) ) {//activated a script on him @@ -12842,6 +12875,547 @@ void ForceJump( gentity_t *self, usercmd_t *ucmd ) self->client->ps.forceJumpCharge = 0; } +#define DESTRUCTION_VELOCITY 600 +#define DESTRUCTION_DAMAGE 40 +#define DESTRUCTION_SPLASH_DAMAGE 30 +#define DESTRUCTION_SPLASH_RADIUS 160 +#define DESTRUCTION_NPC_DAMAGE_EASY 10 +#define DESTRUCTION_NPC_DAMAGE_NORMAL 20 +#define DESTRUCTION_NPC_DAMAGE_HARD 30 +#define DESTRUCTION_SIZE 3 + +gentity_t *CreateMissile( vec3_t org, vec3_t dir, float vel, int life, gentity_t *owner, qboolean altFire = qfalse ); +//--------------------------------------------------------- +void WP_FireDestruction( gentity_t *ent, int forceLevel ) +//--------------------------------------------------------- +{ + vec3_t start, forward; + int damage = DESTRUCTION_DAMAGE; + float vel = DESTRUCTION_VELOCITY; + + if ( forceLevel == FORCE_LEVEL_2 ) + { + vel *= 1.5f; + } + else if ( forceLevel == FORCE_LEVEL_3 ) + { + vel *= 2.0f; + } + + AngleVectors( ent->client->ps.viewangles, forward, NULL, NULL ); + VectorNormalize( forward ); + + VectorCopy( ent->client->renderInfo.eyePoint, start ); + + gentity_t *missile = CreateMissile( start, forward, vel, 10000, ent, qfalse ); + + missile->classname = "rocket_proj"; + missile->s.weapon = WP_CONCUSSION; + missile->mass = 10; + + // Do the damages + if ( ent->s.number != 0 ) + { + if ( g_spskill->integer == 0 ) + { + damage = DESTRUCTION_NPC_DAMAGE_EASY; + } + else if ( g_spskill->integer == 1 ) + { + damage = DESTRUCTION_NPC_DAMAGE_NORMAL; + } + else + { + damage = DESTRUCTION_NPC_DAMAGE_HARD; + } + } + + // Make it easier to hit things + VectorSet( missile->maxs, DESTRUCTION_SIZE, DESTRUCTION_SIZE, DESTRUCTION_SIZE ); + VectorScale( missile->maxs, -1, missile->mins ); + + missile->damage = damage * (1.0f + forceLevel)/2.0f; + missile->dflags = DAMAGE_DEATH_KNOCKBACK; + + missile->methodOfDeath = MOD_DESTRUCTION; + missile->splashMethodOfDeath = MOD_DESTRUCTION;// ?SPLASH; + + missile->clipmask = MASK_SHOT | CONTENTS_LIGHTSABER; + missile->splashDamage = DESTRUCTION_SPLASH_DAMAGE * (1.0f + forceLevel)/2.0f; + missile->splashRadius = DESTRUCTION_SPLASH_RADIUS * (1.0f + forceLevel)/2.0f;; + + // we don't want it to ever bounce + missile->bounceCount = 0; +} + +void ForceDestruction( gentity_t *self ) +{ + int anim, soundIndex; + if ( self->health <= 0 ) + { + return; + } + if ( !WP_ForcePowerUsable( self, FP_DESTRUCTION, 0 ) ) + { + return; + } + if ( self->client->ps.forcePowerDebounce[FP_DESTRUCTION] > level.time ) + {//already using destruction + return; + } + if ( !self->s.number && (cg.zoomMode || in_camera) ) + {//can't destruction when zoomed in or in cinematic + return; + } + if ( self->client->ps.saberLockTime > level.time ) + {//FIXME: can this be a way to break out? + return; + } + + CG_RegisterWeapon( WP_CONCUSSION ); // Temporary! Will have new effects etc soon. + + anim = BOTH_FORCEPUSH; + soundIndex = G_SoundIndex( "sound/weapons/force/rage.wav" ); + + int parts = SETANIM_TORSO; + if ( !PM_InKnockDown( &self->client->ps ) ) + { + if ( !VectorLengthSquared( self->client->ps.velocity ) && !(self->client->ps.pm_flags&PMF_DUCKED)) + { + parts = SETANIM_BOTH; + } + } + NPC_SetAnim( self, parts, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART ); + self->client->ps.saberMove = self->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in + self->client->ps.saberBlocked = BLOCKED_NONE; + + if ( self->handLBolt != -1 ) + { + G_PlayEffect( G_EffectIndex( "force/drain_hand" ), self->playerModel, self->handLBolt, self->s.number, self->currentOrigin, 200, qtrue ); + } + + G_Sound( self, soundIndex ); + + WP_FireDestruction( self, self->client->ps.forcePowerLevel[FP_DESTRUCTION] ); + + WP_ForcePowerStart( self, FP_DESTRUCTION, 0 ); + + self->client->ps.weaponTime = 1000; + if ( self->client->ps.forcePowersActive&(1<client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value ); + } + self->client->ps.forcePowerDebounce[FP_DESTRUCTION] = level.time + self->client->ps.torsoAnimTimer + 500; +} + +extern qboolean PM_HasAnimation( gentity_t *ent, int animation ); +void ForceInsanity( gentity_t *self ) +{ + trace_t tr; + vec3_t end, forward; + gentity_t *traceEnt; + qboolean targetLive = qfalse; + + if ( self->health <= 0 ) + { + return; + } + if ( !WP_ForcePowerUsable( self, FP_INSANITY, 0 ) ) + { + return; + } + + if ( self->client->ps.weaponTime >= 800 ) + {//just did one! + return; + } + if ( self->client->ps.saberLockTime > level.time ) + {//FIXME: can this be a way to break out? + return; + } + + //Pretty heavily based on mind trick + + AngleVectors( self->client->ps.viewangles, forward, NULL, NULL ); + VectorNormalize( forward ); + VectorMA( self->client->renderInfo.eyePoint, 2048, forward, end ); + + //Cause a distraction if enemy is not fighting + gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_OPAQUE|CONTENTS_BODY, (EG2_Collision)0, 0 ); + if ( tr.entityNum == ENTITYNUM_NONE || tr.fraction == 1.0 || tr.allsolid || tr.startsolid ) + { + return; + } + + traceEnt = &g_entities[tr.entityNum]; + + if( traceEnt->NPC && traceEnt->NPC->scriptFlags & SCF_NO_FORCE ) + { + return; + } + + if ( traceEnt && traceEnt->client ) + { + switch ( traceEnt->client->NPC_class ) + { + case CLASS_GALAKMECH://cant grip him, he's in armor + case CLASS_ATST://much too big to grip! + //no droids either + case CLASS_PROBE: + case CLASS_GONK: + case CLASS_R2D2: + case CLASS_R5D2: + case CLASS_MARK1: + case CLASS_MARK2: + case CLASS_MOUSE: + case CLASS_SEEKER: + case CLASS_REMOTE: + case CLASS_PROTOCOL: + case CLASS_ASSASSIN_DROID: + case CLASS_SABER_DROID: + case CLASS_BOBAFETT: + break; + case CLASS_RANCOR: + if ( !(traceEnt->spawnflags&1) ) + { + targetLive = qtrue; + } + break; + default: + targetLive = qtrue; + break; + } + } + if ( targetLive + && traceEnt->NPC + && traceEnt->health > 0 + && traceEnt->NPC->charmedTime < level.time + && traceEnt->NPC->confusionTime < level.time ) + {//hit an organic non-player + int override = 0; + if ( (traceEnt->NPC->scriptFlags&SCF_NO_MIND_TRICK) ) + { + if ( traceEnt->client->NPC_class == CLASS_GALAKMECH ) + { + G_AddVoiceEvent( traceEnt, Q_irand( EV_CONFUSE1, EV_CONFUSE3 ), Q_irand( 3000, 5000 ) ); + } + } + else if ( traceEnt->s.weapon != WP_SABER + && traceEnt->client->NPC_class != CLASS_REBORN ) + {//haha! Jedi aren't easily confused! + if ( self->client->ps.forcePowerLevel[FP_INSANITY] > FORCE_LEVEL_2 + && traceEnt->s.weapon != WP_NONE //don't charm people who aren't capable of fighting... like ugnaughts and droids, just confuse them + && traceEnt->client->NPC_class != CLASS_TUSKEN//don't charm them, just confuse them + && traceEnt->client->NPC_class != CLASS_NOGHRI//don't charm them, just confuse them + && !Pilot_AnyVehiclesRegistered() //also, don't charm guys when bikes are near + ) + {//turn them to our side + //if insanity 3 and aiming at an enemy need more force power + override = 50; + if ( self->client->ps.forcePower < 50 ) + { + return; + } + if ( traceEnt->enemy ) + { + G_ClearEnemy( traceEnt ); + } + if ( traceEnt->NPC ) + { + //traceEnt->NPC->tempBehavior = BS_FOLLOW_LEADER; + traceEnt->client->leader = self; + } + //FIXME: maybe pick an enemy right here? + //FIXME: does nothing to TEAM_FREE and TEAM_NEUTRALs!!! + team_t saveTeam = traceEnt->client->enemyTeam; + traceEnt->client->enemyTeam = traceEnt->client->playerTeam; + traceEnt->client->playerTeam = saveTeam; + //FIXME: need a *charmed* timer on this...? Or do TEAM_PLAYERS assume that "confusion" means they should switch to team_enemy when done? + traceEnt->NPC->darkCharmedTime = level.time + insanityTime[self->client->ps.forcePowerLevel[FP_TELEPATHY]]; + if ( traceEnt->ghoul2.size() && traceEnt->headBolt != -1 ) + {//FIXME: what if already playing effect? + G_PlayEffect( G_EffectIndex( "force/drain_hand" ), traceEnt->playerModel, traceEnt->headBolt, traceEnt->s.number, traceEnt->currentOrigin, insanityTime[self->client->ps.forcePowerLevel[FP_INSANITY]], qtrue ); + } + if ( PM_HasAnimation( traceEnt, BOTH_SONICPAIN_HOLD ) ) + { + NPC_SetAnim( traceEnt, SETANIM_LEGS, BOTH_SONICPAIN_HOLD, SETANIM_FLAG_NORMAL ); + NPC_SetAnim( traceEnt, SETANIM_TORSO, BOTH_SONICPAIN_HOLD, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + traceEnt->client->ps.torsoAnimTimer += 200; + traceEnt->client->ps.weaponTime = traceEnt->client->ps.torsoAnimTimer; + } + } + else + {//just insanity them + if ( PM_HasAnimation( traceEnt, BOTH_SONICPAIN_HOLD ) ) + { + NPC_SetAnim( traceEnt, SETANIM_LEGS, BOTH_SONICPAIN_HOLD, SETANIM_FLAG_NORMAL ); + NPC_SetAnim( traceEnt, SETANIM_TORSO, BOTH_SONICPAIN_HOLD, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + traceEnt->client->ps.torsoAnimTimer += insanityTime[self->client->ps.forcePowerLevel[FP_INSANITY]]; + traceEnt->client->ps.weaponTime = traceEnt->client->ps.torsoAnimTimer; + } + traceEnt->NPC->insanityTime = level.time + insanityTime[self->client->ps.forcePowerLevel[FP_INSANITY]];//confused for 5-10 seconds + if ( traceEnt->enemy ) + { + G_ClearEnemy( traceEnt ); + } + if ( traceEnt->ghoul2.size() && traceEnt->headBolt != -1 ) + {//FIXME: what if already playing effect? + G_PlayEffect( G_EffectIndex( "force/drain_hand" ), traceEnt->playerModel, traceEnt->headBolt, traceEnt->s.number, traceEnt->currentOrigin, insanityTime[self->client->ps.forcePowerLevel[FP_INSANITY]], qtrue ); + } + } + } + else + { + NPC_Jedi_PlayConfusionSound( traceEnt ); + } + WP_ForcePowerStart( self, FP_INSANITY, override ); + vec3_t eyeDir; + AngleVectors( traceEnt->client->renderInfo.eyeAngles, eyeDir, NULL, NULL ); + VectorNormalize( eyeDir ); + G_PlayEffect( "force/drain_hand", traceEnt->client->renderInfo.eyePoint, eyeDir ); + + //make sure this plays and that you cannot press fire for about 1 second after this + //FIXME: BOTH_FORCEMINDTRICK or BOTH_FORCEDISTRACT + NPC_SetAnim( self, SETANIM_TORSO, BOTH_MINDTRICK1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD ); + //FIXME: build-up or delay this until in proper part of anim + } + + WP_ForcePowerStart( self, FP_INSANITY, 0 ); + + self->client->ps.saberMove = self->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in + self->client->ps.saberBlocked = BLOCKED_NONE; + self->client->ps.weaponTime = 1000; + if ( self->client->ps.forcePowersActive&(1<client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value ); + } +} + +extern void PM_SetTorsoAnimTimer( gentity_t *ent, int *torsoAnimTimer, int time ); +void ForceStasis( gentity_t *self ) +{ + trace_t tr; + vec3_t end, forward; + gentity_t *traceEnt; + int anim, soundIndex; + float currentFrame, animSpeed; + int junk; + + if ( self->health <= 0 ) + { + return; + } + if ( !WP_ForcePowerUsable( self, FP_STASIS, 0 ) ) + { + return; + } + + if ( self->client->ps.forcePowerDebounce[FP_STASIS] > level.time ) + {//already using destruction + return; + } + if ( !self->s.number && (cg.zoomMode || in_camera) ) + {//can't destruction when zoomed in or in cinematic + return; + } + + if ( self->client->ps.saberLockTime > level.time ) + {//FIXME: can this be a way to break out? + return; + } + + AngleVectors( self->client->ps.viewangles, forward, NULL, NULL ); + VectorNormalize( forward ); + VectorMA( self->client->renderInfo.eyePoint, 2048, forward, end ); + + //Stasis the enemy! + gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_OPAQUE|CONTENTS_BODY, (EG2_Collision)0, 0 ); + if ( tr.entityNum == ENTITYNUM_NONE || tr.fraction == 1.0 || tr.allsolid || tr.startsolid ) + { + return; + } + + traceEnt = &g_entities[tr.entityNum]; + + if( traceEnt->NPC && traceEnt->NPC->scriptFlags & SCF_NO_FORCE ) + { + return; + } + + if(traceEnt->health > 0 && + traceEnt->s.weapon != WP_SABER && traceEnt->client->NPC_class != CLASS_REBORN) + { + //doesn't affect jedi for now...but affects everything else?? + if (traceEnt->client) + { + traceEnt->client->ps.stasisTime = level.time + stasisTime[self->client->ps.forcePowerLevel[FP_STASIS]];//stuck for 5-10 seconds + } + gi.G2API_GetBoneAnimIndex( &traceEnt->ghoul2[traceEnt->playerModel], traceEnt->rootBone, + level.time, ¤tFrame, &junk, &junk, &junk, &animSpeed, NULL ); + gi.G2API_SetBoneAnimIndex( &traceEnt->ghoul2[traceEnt->playerModel], traceEnt->rootBone, + currentFrame, currentFrame, + BONE_ANIM_OVERRIDE_FREEZE/*|BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND*/, animSpeed, level.time, -1, 100 ); + } + + anim = BOTH_FORCEPUSH; + soundIndex = G_SoundIndex( "sound/weapons/force/protecthit.wav" ); + + int parts = SETANIM_TORSO; + if ( !PM_InKnockDown( &self->client->ps ) ) + { + if ( !VectorLengthSquared( self->client->ps.velocity ) && !(self->client->ps.pm_flags&PMF_DUCKED)) + { + parts = SETANIM_BOTH; + } + } + NPC_SetAnim( self, parts, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART ); + self->client->ps.saberMove = self->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in + self->client->ps.saberBlocked = BLOCKED_NONE; + + G_Sound( self, soundIndex ); + + WP_ForcePowerStart( self, FP_STASIS, 0 ); + + self->client->ps.weaponTime = 1000; + if ( self->client->ps.forcePowersActive&(1<client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value ); + } + self->client->ps.forcePowerDebounce[FP_STASIS] = level.time + self->client->ps.torsoAnimTimer + 500; +} + +void ForceBlinding( gentity_t *self ) +{ + if ( self->health <= 0 ) + { + return; + } + if ( !WP_ForcePowerUsable( self, FP_BLINDING, 0 ) ) + { + return; + } + + if ( self->client->ps.weaponTime >= 800 ) + {//just did one! + return; + } + if ( self->client->ps.saberLockTime > level.time ) + {//FIXME: can this be a way to break out? + return; + } + + gi.Printf(S_COLOR_BLUE "Used Force Blinding\n"); + + //TODO: CODE + + WP_ForcePowerStart( self, FP_BLINDING, 0 ); + + self->client->ps.saberMove = self->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in + self->client->ps.saberBlocked = BLOCKED_NONE; + self->client->ps.weaponTime = 1000; + if ( self->client->ps.forcePowersActive&(1<client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value ); + } +} + +void ForceDeadlySight( gentity_t *self ) +{ + + if ( self->health <= 0 ) + { + return; + } + + if (self->client->ps.forceAllowDeactivateTime < level.time && + (self->client->ps.forcePowersActive & (1 << FP_DEADLYSIGHT)) ) + { + WP_ForcePowerStop( self, FP_DEADLYSIGHT ); + return; + } + + if ( !WP_ForcePowerUsable( self, FP_DEADLYSIGHT, 0 ) ) + { + return; + } + + WP_DebounceForceDeactivateTime( self ); + + WP_ForcePowerStart( self, FP_DEADLYSIGHT, 0 ); + + //TODO: CODE +} + +void ForceRepulse( gentity_t *self ) +{ + if ( self->health <= 0 ) + { + return; + } + if ( !WP_ForcePowerUsable( self, FP_REPULSE, 0 ) ) + { + return; + } + + if ( self->client->ps.weaponTime >= 800 ) + {//just did one! + return; + } + if ( self->client->ps.saberLockTime > level.time ) + {//FIXME: can this be a way to break out? + return; + } + + gi.Printf(S_COLOR_WHITE "Used Force Repulse\n"); + + //TODO: CODE + + WP_ForcePowerStart( self, FP_REPULSE, 0 ); + + self->client->ps.saberMove = self->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in + self->client->ps.saberBlocked = BLOCKED_NONE; + self->client->ps.weaponTime = 1000; + if ( self->client->ps.forcePowersActive&(1<client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value ); + } +} + +void ForceInvulnerability( gentity_t *self ) +{ + if ( self->health <= 0 ) + { + return; + } + if ( !WP_ForcePowerUsable( self, FP_INVULNERABILITY, 0 ) ) + { + return; + } + + if ( self->client->ps.weaponTime >= 800 ) + {//just did one! + return; + } + if ( self->client->ps.saberLockTime > level.time ) + {//FIXME: can this be a way to break out? + return; + } + + gi.Printf(S_COLOR_BLUE "Used Force Invulnerability\n"); + + //TODO: CODE + + WP_ForcePowerStart( self, FP_INVULNERABILITY, 0 ); + + self->client->ps.saberMove = self->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in + self->client->ps.saberBlocked = BLOCKED_NONE; + self->client->ps.weaponTime = 1000; + if ( self->client->ps.forcePowersActive&(1<client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value ); + } +} + int WP_AbsorbConversion(gentity_t *attacked, int atdAbsLevel, gentity_t *attacker, int atPower, int atPowerLevel, int atForceSpent) { int getLevel = 0; @@ -13057,6 +13631,24 @@ void WP_ForcePowerStart( gentity_t *self, forcePowers_t forcePower, int override G_SoundOnEnt( self, CHAN_ITEM, "sound/weapons/force/see.mp3" ); self->s.loopSound = G_SoundIndex( "sound/weapons/force/seeloop.wav" ); break; + case FP_DESTRUCTION: + break; + case FP_INSANITY: + break; + case FP_STASIS: + break; + case FP_BLINDING: + break; + case FP_DEADLYSIGHT: + duration = 5000; + self->client->ps.forcePowersActive |= ( 1 << forcePower ); + G_SoundOnEnt( self, CHAN_ITEM, "sound/weapons/force/rage.mp3" ); + self->s.loopSound = G_SoundIndex( "sound/weapons/force/rageloop.wav" ); + break; + case FP_REPULSE: + break; + case FP_INVULNERABILITY: + break; default: break; } @@ -13582,6 +14174,21 @@ void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ) case FP_SEE: self->s.loopSound = 0; break; + case FP_DESTRUCTION: + break; + case FP_INSANITY: + break; + case FP_STASIS: + break; + case FP_BLINDING: + break; + case FP_DEADLYSIGHT: + self->s.loopSound = 0; + break; + case FP_REPULSE: + break; + case FP_INVULNERABILITY: + break; default: break; } @@ -14435,6 +15042,112 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd break; case FP_SEE: break; + case FP_DESTRUCTION: + break; + case FP_INSANITY: + break; + case FP_STASIS: + break; + case FP_BLINDING: + break; + case FP_DEADLYSIGHT: + if (self->client->ps.deadlySightLastChecked < level.time) + { + vec3_t forward, mins, maxs; + int e, numListedEntities; + gentity_t *entityList[MAX_GENTITIES]; + gentity_t *check = NULL; + float dist, bestDist = Q3_INFINITE; + float minDot = 0.5f; + trace_t tr; + + int addTime = 400; + int radius = 1024; + + if (self->client->ps.forcePowerLevel[FP_DEADLYSIGHT] == FORCE_LEVEL_1) + { + addTime = 250; + radius = 1024; + } + else if (self->client->ps.forcePowerLevel[FP_DEADLYSIGHT] == FORCE_LEVEL_2) + { + addTime = 150; + radius = 1536; + } + else if (self->client->ps.forcePowerLevel[FP_DEADLYSIGHT] == FORCE_LEVEL_3) + { + addTime = 50; + radius = 2048; + } + self->client->ps.deadlySightLastChecked = level.time + addTime; + + AngleVectors( self->client->ps.viewangles, forward, NULL, NULL ); + + for ( e = 0 ; e < 3 ; e++ ) + { + mins[e] = self->currentOrigin[e] - radius; + maxs[e] = self->currentOrigin[e] + radius; + } + numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); + + for ( e = 0 ; e < numListedEntities ; e++ ) + { + check = entityList[e]; + if ( check == self ) + {//me + continue; + } + if ( !(check->inuse) ) + {//freed + continue; + } + if ( !check->client ) + {//not a client - FIXME: what about turrets? + continue; + } + + if ( check->health <= 0 ) + {//dead + continue; + } + + if ( !gi.inPVS( check->currentOrigin, self->currentOrigin ) ) + {//can't potentially see them + continue; + } + + VectorSubtract( check->currentOrigin, self->currentOrigin, dir ); + dist = VectorNormalize( dir ); + + if ( DotProduct( dir, forward ) < minDot ) + {//not in front + continue; + } + + //really should have a clear LOS to this thing... + gi.trace( &tr, self->currentOrigin, vec3_origin, vec3_origin, check->currentOrigin, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 ); + if ( tr.fraction < 1.0f && tr.entityNum != check->s.number ) + {//must have clear shot + continue; + } + + G_Damage( check, self, self, 0, check->client->renderInfo.headPoint, 10, DAMAGE_NO_KNOCKBACK, MOD_SNIPER); + + if ( check->ghoul2.size() && check->headBolt != -1 ) + {//FIXME: what if already playing effect? + G_PlayEffect( G_EffectIndex( "volumetric/black_smoke" ), check->playerModel, check->headBolt, check->s.number, check->currentOrigin, addTime, qtrue ); + } + + //self->health = 0; + //GEntity_DieFunc( self, self, self, self->max_health, MOD_DESTRUCTION); + + } + } + break; + case FP_REPULSE: + break; + case FP_INVULNERABILITY: + break; default: break; } @@ -14521,6 +15234,38 @@ void WP_CheckForcedPowers( gentity_t *self, usercmd_t *ucmd ) case FP_SEE: //nothing break; + case FP_DESTRUCTION: + ForceDestruction( self ); + //do only once + self->client->ps.forcePowersForced &= ~(1<client->ps.forcePowersForced &= ~(1<client->ps.forcePowersForced &= ~(1<client->ps.forcePowersForced &= ~(1<client->ps.forcePowersForced &= ~(1<client->ps.forcePowersForced &= ~(1<client->ps.forcePowersForced &= ~(1<client->ps.forcePowersKnown = ( 1 << FP_HEAL )|( 1 << FP_LEVITATION )|( 1 << FP_SPEED )|( 1 << FP_PUSH )|( 1 << FP_PULL )|( 1 << FP_TELEPATHY )|( 1 << FP_GRIP )|( 1 << FP_LIGHTNING)|( 1 << FP_SABERTHROW)|( 1 << FP_SABER_DEFENSE )|( 1 << FP_SABER_OFFENSE )|( 1<< FP_RAGE )|( 1<< FP_DRAIN )|( 1<< FP_PROTECT )|( 1<< FP_ABSORB )|( 1<< FP_SEE ); + ent->client->ps.forcePowersKnown = ( 1 << FP_HEAL )|( 1 << FP_LEVITATION )|( 1 << FP_SPEED )|( 1 << FP_PUSH )|( 1 << FP_PULL )|( 1 << FP_TELEPATHY )|( 1 << FP_GRIP )|( 1 << FP_LIGHTNING)|( 1 << FP_SABERTHROW)|( 1 << FP_SABER_DEFENSE )|( 1 << FP_SABER_OFFENSE )|( 1<< FP_RAGE )|( 1<< FP_DRAIN )|( 1<< FP_PROTECT )|( 1<< FP_ABSORB )|( 1<< FP_SEE )|( 1 << FP_DESTRUCTION ) + |( 1 << FP_INSANITY )|( 1 << FP_STASIS )|( 1 << FP_BLINDING )|(1 << FP_DEADLYSIGHT)|(1 << FP_REPULSE)|(1 << FP_INVULNERABILITY); ent->client->ps.forcePowerLevel[FP_HEAL] = FORCE_LEVEL_2; ent->client->ps.forcePowerLevel[FP_LEVITATION] = FORCE_LEVEL_2; ent->client->ps.forcePowerLevel[FP_PUSH] = FORCE_LEVEL_1; @@ -14717,6 +15463,15 @@ void WP_InitForcePowers( gentity_t *ent ) ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] = FORCE_LEVEL_3; ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] = FORCE_LEVEL_3; ent->client->ps.forcePowerLevel[FP_GRIP] = FORCE_LEVEL_2; + + ent->client->ps.forcePowerLevel[FP_DESTRUCTION] = FORCE_LEVEL_2; + ent->client->ps.forcePowerLevel[FP_INSANITY] = FORCE_LEVEL_2; + ent->client->ps.forcePowerLevel[FP_STASIS] = FORCE_LEVEL_2; + ent->client->ps.forcePowerLevel[FP_BLINDING] = FORCE_LEVEL_1; + + ent->client->ps.forcePowerLevel[FP_DEADLYSIGHT] = FORCE_LEVEL_1; + ent->client->ps.forcePowerLevel[FP_REPULSE] = FORCE_LEVEL_1; + ent->client->ps.forcePowerLevel[FP_INVULNERABILITY] = FORCE_LEVEL_1; } } } diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 0c4af48cc4..a105fae3db 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -758,6 +758,14 @@ typedef enum FP_ABSORB,//duration - protect against dark force powers (grip, lightning, drain - maybe push/pull, too?) FP_DRAIN,//hold/duration - drain force power for health FP_SEE,//duration - detect/see hidden enemies + //extra powers! + FP_DESTRUCTION,//instant + FP_INSANITY,//instant + FP_STASIS,//duration + instant? + FP_BLINDING,//instant + FP_DEADLYSIGHT,//duration + FP_REPULSE,//hold/duration + FP_INVULNERABILITY,//duration #endif // !JK2_MODE NUM_FORCE_POWERS @@ -1924,6 +1932,9 @@ class PlayerStateBase //when hyperspacing, you just go forward really fast for HYPERSPACE_TIME int hyperSpaceTime; vec3_t hyperSpaceAngles; + + int stasisTime; + int deadlySightLastChecked; #endif // !JK2_MODE void sg_export( @@ -2096,6 +2107,9 @@ class PlayerStateBase saved_game.write(hyperSpaceTime); saved_game.write(hyperSpaceAngles); + + saved_game.write(stasisTime); + saved_game.write(deadlySightLastChecked); #endif // !JK2_MODE } @@ -2269,6 +2283,9 @@ class PlayerStateBase saved_game.read(hyperSpaceTime); saved_game.read(hyperSpaceAngles); + + saved_game.read(stasisTime); + saved_game.read(deadlySightLastChecked); #endif // !JK2_MODE } }; // PlayerStateBase @@ -2317,6 +2334,13 @@ typedef enum GENCMD_FORCE_ABSORB, GENCMD_FORCE_DRAIN, GENCMD_FORCE_SEEING, + GENCMD_FORCE_DESTRUCTION, + GENCMD_FORCE_INSANITY, + GENCMD_FORCE_STASIS, + GENCMD_FORCE_BLINDING, + GENCMD_FORCE_DEADLYSIGHT, + GENCMD_FORCE_REPULSE, + GENCMD_FORCE_INVULNERABILITY, } genCmds_t; diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 9546e070fe..0c75b41524 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -1896,12 +1896,18 @@ static void UI_CalcForceStatus(void) lightSide = pState->forcePowerLevel[FP_HEAL] + pState->forcePowerLevel[FP_TELEPATHY] + pState->forcePowerLevel[FP_PROTECT] + - pState->forcePowerLevel[FP_ABSORB]; + pState->forcePowerLevel[FP_ABSORB] + + pState->forcePowerLevel[FP_STASIS] + + pState->forcePowerLevel[FP_BLINDING] + + pState->forcePowerLevel[FP_INVULNERABILITY]; darkSide = pState->forcePowerLevel[FP_GRIP] + pState->forcePowerLevel[FP_LIGHTNING] + pState->forcePowerLevel[FP_RAGE] + - pState->forcePowerLevel[FP_DRAIN]; + pState->forcePowerLevel[FP_DRAIN] + + pState->forcePowerLevel[FP_DESTRUCTION] + + pState->forcePowerLevel[FP_INSANITY] + + pState->forcePowerLevel[FP_DEADLYSIGHT]; total = lightSide + darkSide; @@ -5479,7 +5485,7 @@ static void UI_UpdateFightingStyleChoices ( void ) } #endif // !JK2_MODE -#define MAX_POWER_ENUMS 16 +#define MAX_POWER_ENUMS 23 typedef struct { const char *title; @@ -5497,6 +5503,9 @@ static powerEnum_t powerEnums[MAX_POWER_ENUMS] = #ifndef JK2_MODE { "protect", FP_PROTECT }, + { "stasis", FP_STASIS }, + { "blinding", FP_BLINDING }, + { "invulnerability", FP_INVULNERABILITY }, #endif // !JK2_MODE // Core powers @@ -5512,6 +5521,9 @@ static powerEnum_t powerEnums[MAX_POWER_ENUMS] = { "sabdef", FP_SABER_DEFENSE }, { "saboff", FP_SABER_OFFENSE }, { "sabthrow", FP_SABERTHROW }, +#ifndef JK2_MODE + { "repulse", FP_REPULSE }, +#endif // !JK2_MODE // Dark powers #ifndef JK2_MODE @@ -5523,6 +5535,9 @@ static powerEnum_t powerEnums[MAX_POWER_ENUMS] = #ifndef JK2_MODE { "rage", FP_RAGE }, + { "destruction", FP_DESTRUCTION }, + { "insanity", FP_INSANITY }, + { "deadlysight", FP_DEADLYSIGHT }, #endif // !JK2_MODE }; @@ -5791,6 +5806,15 @@ static void UI_DemoSetForceLevels( void ) uiInfo.forcePowerLevel[FP_DRAIN]=0; uiInfo.forcePowerLevel[FP_LIGHTNING]=0; uiInfo.forcePowerLevel[FP_RAGE]=0; + + uiInfo.forcePowerLevel[FP_INSANITY]=0; + uiInfo.forcePowerLevel[FP_DESTRUCTION]=0; + uiInfo.forcePowerLevel[FP_STASIS]=0; + uiInfo.forcePowerLevel[FP_BLINDING]=0; + + uiInfo.forcePowerLevel[FP_DEADLYSIGHT]=0; + uiInfo.forcePowerLevel[FP_REPULSE]=0; + uiInfo.forcePowerLevel[FP_INVULNERABILITY]=0; } else { @@ -5816,6 +5840,15 @@ static void UI_DemoSetForceLevels( void ) uiInfo.forcePowerLevel[FP_ABSORB]=0; uiInfo.forcePowerLevel[FP_DRAIN]=0; uiInfo.forcePowerLevel[FP_RAGE]=0; + + uiInfo.forcePowerLevel[FP_INSANITY]=0; + uiInfo.forcePowerLevel[FP_DESTRUCTION]=0; + uiInfo.forcePowerLevel[FP_STASIS]=0; + uiInfo.forcePowerLevel[FP_BLINDING]=0; + + uiInfo.forcePowerLevel[FP_DEADLYSIGHT]=0; + uiInfo.forcePowerLevel[FP_REPULSE]=0; + uiInfo.forcePowerLevel[FP_INVULNERABILITY]=0; } if (pState) @@ -5829,6 +5862,15 @@ static void UI_DemoSetForceLevels( void ) uiInfo.forcePowerLevel[FP_ABSORB]=Q_max(pState->forcePowerLevel[FP_ABSORB], uiInfo.forcePowerLevel[FP_ABSORB]); uiInfo.forcePowerLevel[FP_DRAIN]=Q_max(pState->forcePowerLevel[FP_DRAIN], uiInfo.forcePowerLevel[FP_DRAIN]); uiInfo.forcePowerLevel[FP_RAGE]=Q_max(pState->forcePowerLevel[FP_RAGE], uiInfo.forcePowerLevel[FP_RAGE]); + + uiInfo.forcePowerLevel[FP_INSANITY]=Q_max(pState->forcePowerLevel[FP_INSANITY], uiInfo.forcePowerLevel[FP_INSANITY]); + uiInfo.forcePowerLevel[FP_DESTRUCTION]=Q_max(pState->forcePowerLevel[FP_DESTRUCTION], uiInfo.forcePowerLevel[FP_DESTRUCTION]); + uiInfo.forcePowerLevel[FP_STASIS]=Q_max(pState->forcePowerLevel[FP_STASIS], uiInfo.forcePowerLevel[FP_STASIS]); + uiInfo.forcePowerLevel[FP_BLINDING]=Q_max(pState->forcePowerLevel[FP_BLINDING], uiInfo.forcePowerLevel[FP_BLINDING]); + + uiInfo.forcePowerLevel[FP_DEADLYSIGHT]=Q_max(pState->forcePowerLevel[FP_DEADLYSIGHT], uiInfo.forcePowerLevel[FP_DEADLYSIGHT]); + uiInfo.forcePowerLevel[FP_REPULSE]=Q_max(pState->forcePowerLevel[FP_REPULSE], uiInfo.forcePowerLevel[FP_REPULSE]); + uiInfo.forcePowerLevel[FP_INVULNERABILITY]=Q_max(pState->forcePowerLevel[FP_INVULNERABILITY], uiInfo.forcePowerLevel[FP_INVULNERABILITY]); } } #endif // !JK2_MODE diff --git a/code/ui/ui_shared.cpp b/code/ui/ui_shared.cpp index 7d596e5b32..e773834a2c 100644 --- a/code/ui/ui_shared.cpp +++ b/code/ui/ui_shared.cpp @@ -5618,6 +5618,7 @@ static const char *g_bindCommands[] = { "+moveright", "+moveup", "+right", + "+saber_throw", "+speed", "+strafe", "+use", @@ -5628,18 +5629,27 @@ static const char *g_bindCommands[] = { "exitview", #ifndef JK2_MODE "force_absorb", + "force_blinding", + "force_destruction", + "force_deadlysight", #endif "force_distract", "force_heal", #ifndef JK2_MODE + "force_insanity", + "force_invulnerability", "force_protect", #endif "force_pull", #ifndef JK2_MODE "force_rage", + "force_repulse", "force_sight", #endif "force_speed", +#ifndef JK2_MODE + "force_stasis", +#endif "force_throw", "forcenext", "forceprev", From 3b87a92960465bbe42e0864f51a7f4fe5694628c Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sat, 7 Jan 2017 22:50:56 +0000 Subject: [PATCH 407/445] UI: RGB sliders in character creation menu --- code/ui/ui_main.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 0c75b41524..0afa92d7a3 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -2738,6 +2738,11 @@ static qboolean UI_ParseColorData(char* buf, playerSpeciesInfo_t &species) species.ColorMax = 16; species.Color = (playerColor_t *)malloc(species.ColorMax * sizeof(playerColor_t)); + //Always have RGB colour choice first! + Q_strncpyz(species.Color[0].shader, "gfx/menus/players/rgbtint", 64); + Q_strncpyz(species.Color[0].actionText, "open character_rgb\n", 128); + species.ColorCount++; + while ( p ) { token = COM_ParseExt( &p, qtrue ); //looking for the shader @@ -7403,8 +7408,8 @@ static void UI_UpdateCharacter( qboolean changedModel ) UI_FeederSelection(FEEDER_PLAYER_SKIN_HEAD, 0, item); //fixme, this is not really the right item!! UI_FeederSelection(FEEDER_PLAYER_SKIN_TORSO, 0, item); UI_FeederSelection(FEEDER_PLAYER_SKIN_LEGS, 0, item); - UI_FeederSelection(FEEDER_COLORCHOICES, 0, item); - UI_FeederSelection(FEEDER_COLORCHOICES2, 0, item); + //UI_FeederSelection(FEEDER_COLORCHOICES, 0, item); //Don't bother with these for now - allow colours left over from last species + //UI_FeederSelection(FEEDER_COLORCHOICES2, 0, item); } UI_UpdateCharacterSkin(); } From d2bae256186aac1c8d0cfc3aaaecfdbeff1a82ba Mon Sep 17 00:00:00 2001 From: redsaurus Date: Fri, 22 May 2015 21:17:46 +0100 Subject: [PATCH 408/445] Trueview Thanks to razorace and the Open Jedi Project for allowing use of the code under GPL. This is a merge of several commits, mostly fixe, and also adds eezstreet's cg_truebobbing. --- code/cgame/cg_draw.cpp | 5 + code/cgame/cg_local.h | 17 ++ code/cgame/cg_main.cpp | 34 +++ code/cgame/cg_players.cpp | 541 ++++++++++++++++++++++++++++++++++++- code/cgame/cg_trueview.cpp | 247 +++++++++++++++++ code/cgame/cg_view.cpp | 54 +++- code/cgame/cg_weapons.cpp | 3 + code/game/CMakeLists.txt | 1 + code/game/bg_local.h | 2 + code/game/bg_pangles.cpp | 2 +- code/game/bg_panimate.cpp | 8 +- code/game/bg_pmove.cpp | 21 +- code/game/g_active.cpp | 4 + 13 files changed, 908 insertions(+), 31 deletions(-) create mode 100644 code/cgame/cg_trueview.cpp diff --git a/code/cgame/cg_draw.cpp b/code/cgame/cg_draw.cpp index 9bca763d77..868f539c24 100644 --- a/code/cgame/cg_draw.cpp +++ b/code/cgame/cg_draw.cpp @@ -3289,6 +3289,11 @@ static void CG_DrawRocketLocking( int lockEntNum, int lockTime ) { sz -= ( cg.overrides.fov - cg_zoomFov ) / 80.0f; } + else if ( !cg.renderingThirdPerson && (cg_trueguns.integer || cg.snap->ps.weapon == WP_SABER + || cg.snap->ps.weapon == WP_MELEE) && cg_truefov.value ) + { + sz -= ( cg_truefov.value - cg_zoomFov ) / 80.0f; + } else { sz -= ( cg_fov.value - cg_zoomFov ) / 80.0f; diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index f3864d481e..b2de3e4c2c 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -658,6 +658,19 @@ extern vmCvar_t cg_fovViewmodelAdjust; extern vmCvar_t cg_scaleVehicleSensitivity; +extern vmCvar_t cg_trueguns; +extern vmCvar_t cg_fpls; + +extern vmCvar_t cg_trueroll; +extern vmCvar_t cg_trueflip; +extern vmCvar_t cg_truespin; +extern vmCvar_t cg_truemoveroll; +extern vmCvar_t cg_truesaberonly; +extern vmCvar_t cg_trueeyeposition; +extern vmCvar_t cg_trueinvertsaber; +extern vmCvar_t cg_truefov; +extern vmCvar_t cg_truebobbing; + void CG_NewClientinfo( int clientNum ); // // cg_main.c @@ -1235,4 +1248,8 @@ void CG_ClearLightStyles( void ); void CG_RunLightStyles( void ); void CG_SetLightstyle( int i ); +//trueview stuff +void CG_TrueViewInit( void ); +void CG_AdjustEyePos (const char *modelName); + #endif //__CG_LOCAL_H__ diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index d646c5364f..0828e9daa8 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -347,6 +347,19 @@ vmCvar_t cg_SFXSabersCoreSize; vmCvar_t cg_ignitionFlare; +vmCvar_t cg_trueguns; +vmCvar_t cg_fpls; + +vmCvar_t cg_trueroll; +vmCvar_t cg_trueflip; +vmCvar_t cg_truespin; +vmCvar_t cg_truemoveroll; +vmCvar_t cg_truesaberonly; +vmCvar_t cg_trueeyeposition; +vmCvar_t cg_trueinvertsaber; +vmCvar_t cg_truefov; +vmCvar_t cg_truebobbing; + typedef struct { vmCvar_t *vmCvar; const char *cvarName; @@ -471,6 +484,19 @@ static cvarTable_t cvarTable[] = { { &cg_SFXSabersCoreSize, "cg_SFXSabersCoreSize", "1.0", CVAR_ARCHIVE }, { &cg_ignitionFlare, "cg_ignitionFlare", "0", CVAR_ARCHIVE }, + + //True View Control cvars + { &cg_trueguns, "cg_trueguns", "0", CVAR_ARCHIVE }, + { &cg_fpls, "cg_fpls", "0", CVAR_ARCHIVE }, + { &cg_trueroll, "cg_trueroll", "0", CVAR_ARCHIVE }, + { &cg_trueflip, "cg_trueflip", "0", CVAR_ARCHIVE }, + { &cg_truespin, "cg_truespin", "0", CVAR_ARCHIVE }, + { &cg_truemoveroll, "cg_truemoveroll", "0", CVAR_ARCHIVE }, + { &cg_truesaberonly, "cg_truesaberonly", "0", CVAR_ARCHIVE }, + { &cg_trueeyeposition, "cg_trueeyeposition", "0.0", 0}, + { &cg_trueinvertsaber, "cg_trueinvertsaber", "0", CVAR_ARCHIVE}, + { &cg_truefov, "cg_truefov", "80", CVAR_ARCHIVE}, + { &cg_truebobbing, "cg_truebobbing", "1", CVAR_ARCHIVE}, }; @@ -555,6 +581,12 @@ int CG_GetCameraPos( vec3_t camerapos ) { VectorCopy( cg.refdef.vieworg, camerapos ); return 1; } + else if ( cg_trueguns.integer && !cg.zoomMode ) + {//in third person + //FIXME: what about hacks that render in third person regardless of this value? + VectorCopy( cg.refdef.vieworg, camerapos ); + return 1; + } return 0; } @@ -2192,6 +2224,8 @@ void CG_Init( int serverCommandSequence ) { CG_GameStateReceived(); CG_InitConsoleCommands(); + + CG_TrueViewInit(); cg.weaponPickupTextTime = 0; diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index 097d463c44..e18acc9902 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -48,6 +48,9 @@ extern vmCvar_t cg_SFXSabersCoreSize; extern vmCvar_t cg_ignitionFlare; +//True View Camera Position Check Function +extern void CheckCameraLocation( vec3_t OldeyeOrigin ); + /* player entities generate a great deal of information from implicit ques @@ -1665,7 +1668,7 @@ static void CG_BreathPuffs( centity_t *cent, vec3_t angles, vec3_t origin ) if ( !client || cg_drawBreath.integer == 0 - || !cg.renderingThirdPerson + || (!cg.renderingThirdPerson && !(cg_trueguns.integer || client->ps.weapon == WP_MELEE || client->ps.weapon == WP_SABER )) || client->ps.pm_type == PM_DEAD || client->breathPuffTime > cg.time ) { @@ -3112,7 +3115,7 @@ static void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], v int i; qboolean looking = qfalse, talking = qfalse; - if ( cg.renderingThirdPerson && cent->gent && cent->gent->s.number == 0 ) + if ( (cg.renderingThirdPerson || (cg_trueguns.integer && !cg.zoomMode) || cent->gent->client->ps.weapon == WP_SABER || cent->gent->client->ps.weapon == WP_MELEE) && cent->gent && cent->gent->s.number == 0 ) { // If we are rendering third person, we should just force the player body to always fully face // whatever way they are looking, otherwise, you can end up with gun shots coming off of the @@ -4739,7 +4742,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen } //get the saber colours - if (gent->client->ps.weapons[WP_SABER]) + if (1/*gent->client->ps.weapons[WP_SABER]*/) { vec3_t rgb={1,1,1}; if ( gent->client->ps.saber[0].crystals & SABER_CRYSTAL_BLACK ) @@ -7574,6 +7577,407 @@ static void CG_AddSaberBlades( centity_t *cent, int renderfx, vec3_t origin, vec */ //--------------- END SABER STUFF -------- +/* + ================ + GetSelfLegAnimPoint + ================ + */ +//Get the point in the leg animation and return a percentage of the current point in the anim between 0 and the total anim length (0.0f - 1.0f) +float GetSelfLegAnimPoint(void) +{ + float current = 0.0f; + int end = 0; + int start = 0; + if (!!gi.G2API_GetBoneAnimIndex(& + cg_entities[cg.snap->ps.viewEntity].gent->ghoul2[cg_entities[cg.snap->ps.viewEntity].gent->playerModel], + cg_entities[cg.snap->ps.viewEntity].gent->rootBone, + level.time, + ¤t, + &start, + &end, + NULL, + NULL, + NULL)) + { + float percentComplete = (current-start)/(end-start); + + return percentComplete; + } + + return 0.0f; + +} + + +/* + ================ + GetSelfTorsoAnimPoint + + ================ + */ +//Get the point in the torso animation and return a percentage of the current point in the anim between 0 and the total anim length (0.0f - 1.0f) +float GetSelfTorsoAnimPoint(void) +{ + float current = 0.0f; + int end = 0; + int start = 0; + if (!!gi.G2API_GetBoneAnimIndex(& + cg_entities[cg.snap->ps.viewEntity].gent->ghoul2[cg_entities[cg.snap->ps.viewEntity].gent->playerModel], + cg_entities[cg.snap->ps.viewEntity].gent->lowerLumbarBone, + level.time, + ¤t, + &start, + &end, + NULL, + NULL, + NULL)) + { + float percentComplete = (current-start)/(end-start); + + return percentComplete; + } + + return 0.0f; +} + + +/* + =============== + SmoothTrueView + + Purpose: Uses the currently setup model-based First Person View to calculation the final viewangles. Features the + following: + 1. Simulates allowable eye movement by makes a deadzone around the inputed viewangles vs the desired + viewangles of cg.refdef.viewangles + 2. Prevents the sudden view flipping during moves where your camera is suppose to flip 360 on the pitch (x) + pitch (x) axis. + =============== + */ + +void SmoothTrueView(vec3_t eyeAngles) +{ + float LegAnimPoint = GetSelfLegAnimPoint(); + float TorsoAnimPoint = GetSelfTorsoAnimPoint(); + + //counter + int i; + + //cg.refdef.viewangles in relation to eyeAngles + float AngDiff; + + qboolean eyeRange = qtrue; + qboolean UseRefDef = qfalse; + qboolean DidSpecial = qfalse; + + //Debug messages + //CG_Printf("eyeAngles: %f, %f, %f\n", eyeAngles[0], eyeAngles[1], eyeAngles[2]); + //CG_Printf("cg.refdef.viewangles: %f, %f, %f\n", cg.refdefViewAngles[0], cg.refdefViewAngles[1], cg.refdefViewAngles[2]); + + + + //RAFIXME: See if I can find a link this to the prediction stuff. I think the snap is of just the last gamestate snap + + //Rolls + if ( cg_trueroll.integer ) + { + if ( ( (cg.snap->ps.legsAnim) == BOTH_WALL_RUN_LEFT ) + || ( (cg.snap->ps.legsAnim) == BOTH_WALL_RUN_RIGHT ) + || ( (cg.snap->ps.legsAnim) == BOTH_WALL_RUN_LEFT_STOP ) + || ( (cg.snap->ps.legsAnim) == BOTH_WALL_RUN_RIGHT_STOP ) + || ( (cg.snap->ps.legsAnim) == BOTH_WALL_RUN_LEFT_FLIP ) + || ( (cg.snap->ps.legsAnim) == BOTH_WALL_RUN_RIGHT_FLIP ) + || ( (cg.snap->ps.legsAnim) == BOTH_WALL_FLIP_LEFT ) + || ( (cg.snap->ps.legsAnim) == BOTH_WALL_FLIP_RIGHT ) ) + {//Roll moves that look good with eye range + eyeRange = qtrue; + DidSpecial = qtrue; + } + else if ( cg_trueroll.integer == 1 ) + {//Use simple roll for the more complicated rolls + if ( ( (cg.snap->ps.legsAnim) == BOTH_FLIP_L ) + || ( (cg.snap->ps.legsAnim) == BOTH_ROLL_L ) ) + {//Left rolls + VectorCopy( cg.refdefViewAngles, eyeAngles ); + eyeAngles[2] += AngleNormalize180( (360 * LegAnimPoint) ); + AngleNormalize180( eyeAngles[2] ); + eyeRange = qfalse; + DidSpecial = qtrue; + } + else if( ((cg.snap->ps.legsAnim) == BOTH_FLIP_R) + || ((cg.snap->ps.legsAnim) == BOTH_ROLL_R) ) + {//Right rolls + VectorCopy( cg.refdefViewAngles, eyeAngles ); + eyeAngles[2] += AngleNormalize180( ( 360 - (360 * LegAnimPoint) ) ); + AngleNormalize180( eyeAngles[2] ); + eyeRange = qfalse; + DidSpecial = qtrue; + } + } + else + {//You're here because you're using cg_trueroll.integer == 2 + if ( ((cg.snap->ps.legsAnim) == BOTH_FLIP_L) + || ((cg.snap->ps.legsAnim) == BOTH_ROLL_L) + || ((cg.snap->ps.legsAnim) == BOTH_FLIP_R) + || ((cg.snap->ps.legsAnim) == BOTH_ROLL_R) ) + {//Roll animation, lock the eyemovement + eyeRange = qfalse; + DidSpecial = qtrue; + } + } + } + else if ( ((cg.snap->ps.legsAnim) == BOTH_WALL_RUN_LEFT) + || ((cg.snap->ps.legsAnim) == BOTH_WALL_RUN_RIGHT) + || ((cg.snap->ps.legsAnim) == BOTH_WALL_RUN_LEFT_STOP) + || ((cg.snap->ps.legsAnim) == BOTH_WALL_RUN_RIGHT_STOP) + || ((cg.snap->ps.legsAnim) == BOTH_WALL_RUN_LEFT_FLIP) + || ((cg.snap->ps.legsAnim) == BOTH_WALL_RUN_RIGHT_FLIP) + || ((cg.snap->ps.legsAnim) == BOTH_WALL_FLIP_LEFT) + || ((cg.snap->ps.legsAnim) == BOTH_WALL_FLIP_RIGHT) + || ((cg.snap->ps.legsAnim) == BOTH_FLIP_L) + || ((cg.snap->ps.legsAnim) == BOTH_ROLL_L) + || ((cg.snap->ps.legsAnim) == BOTH_FLIP_R) + || ((cg.snap->ps.legsAnim) == BOTH_ROLL_R) ) + {//you don't want rolling so use cg.refdef.viewangles as the view + UseRefDef = qtrue; + } + + //Flips + if( cg_trueflip.integer ) + { + if( cg.snap->ps.legsAnim == BOTH_WALL_FLIP_BACK1 ) + {//Flip moves that look good with the eyemovement locked + eyeRange = qfalse; + DidSpecial = qtrue; + } + else if ( cg_trueflip.integer == 1 ) + {//Use simple flip for the more complicated flips + if ( ((cg.snap->ps.legsAnim) == BOTH_FLIP_F) + || ((cg.snap->ps.legsAnim) == BOTH_ROLL_F) ) + {//forward flips + VectorCopy( cg.refdefViewAngles, eyeAngles ); + eyeAngles[0] += AngleNormalize180( 360 - (360 * LegAnimPoint) ); + AngleNormalize180( eyeAngles[0] ); + eyeRange = qfalse; + DidSpecial = qtrue; + } + else if ( ((cg.snap->ps.legsAnim) == BOTH_FLIP_B) + || ((cg.snap->ps.legsAnim) == BOTH_ROLL_B) + || ((cg.snap->ps.legsAnim) == BOTH_FLIP_BACK1) ) + {//back flips + VectorCopy( cg.refdefViewAngles, eyeAngles ); + eyeAngles[0] += AngleNormalize180( (360 * LegAnimPoint) ); + AngleNormalize180( eyeAngles[0] ); + eyeRange = qfalse; + DidSpecial = qtrue; + } + } + else + {//You're here because you're using cg_trueflip.integer = 2 + if ( ( (cg.snap->ps.legsAnim) == BOTH_FLIP_F ) + || ( (cg.snap->ps.legsAnim) == BOTH_ROLL_F ) + || ( (cg.snap->ps.legsAnim) == BOTH_FLIP_B ) + || ( (cg.snap->ps.legsAnim) == BOTH_ROLL_B ) + || ( (cg.snap->ps.legsAnim) == BOTH_FLIP_BACK1 ) ) + {//Flip animation and using cg_trueflip.integer = 2, lock the eyemovement + eyeRange = qfalse; + DidSpecial = qtrue; + } + } + } + else if ( ((cg.snap->ps.legsAnim) == BOTH_WALL_FLIP_BACK1) + || ((cg.snap->ps.legsAnim) == BOTH_FLIP_F) + || ((cg.snap->ps.legsAnim) == BOTH_ROLL_F) + || ((cg.snap->ps.legsAnim) == BOTH_FLIP_B) + || ((cg.snap->ps.legsAnim) == BOTH_ROLL_B) + || ((cg.snap->ps.legsAnim) == BOTH_FLIP_BACK1) ) + {//you don't want flipping so use cg.refdef.viewangles as the view + UseRefDef = qtrue; + } + + + + if ( cg_truespin.integer ) + { + if ( cg_truespin.integer == 1 ) + {//Do a simulated Spin for the more complicated spins + if ( ((cg.snap->ps.torsoAnim) == BOTH_T1_TL_BR) + || ((cg.snap->ps.torsoAnim) == BOTH_T1__L_BR) + || ((cg.snap->ps.torsoAnim) == BOTH_T1__L__R) + || ((cg.snap->ps.torsoAnim) == BOTH_T1_BL_BR) + || ((cg.snap->ps.torsoAnim) == BOTH_T1_BL__R) + || ((cg.snap->ps.torsoAnim) == BOTH_T1_BL_TR) + || ((cg.snap->ps.torsoAnim) == BOTH_T2__L_BR) + || ((cg.snap->ps.torsoAnim) == BOTH_T2_BL_BR) + || ((cg.snap->ps.torsoAnim) == BOTH_T2_BL__R) + || ((cg.snap->ps.torsoAnim) == BOTH_T3__L_BR) + || ((cg.snap->ps.torsoAnim) == BOTH_T3_BL_BR) + || ((cg.snap->ps.torsoAnim) == BOTH_T3_BL__R) + || ((cg.snap->ps.torsoAnim) == BOTH_T4__L_BR) + || ((cg.snap->ps.torsoAnim) == BOTH_T4_BL_BR) + || ((cg.snap->ps.torsoAnim) == BOTH_T4_BL__R) + || ((cg.snap->ps.torsoAnim) == BOTH_T5_TL_BR) + || ((cg.snap->ps.torsoAnim) == BOTH_T5__L_BR) + || ((cg.snap->ps.torsoAnim) == BOTH_T5__L__R) + || ((cg.snap->ps.torsoAnim) == BOTH_T5_BL_BR) + || ((cg.snap->ps.torsoAnim) == BOTH_T5_BL__R) + || ((cg.snap->ps.torsoAnim) == BOTH_T5_BL_TR) + || ((cg.snap->ps.torsoAnim) == BOTH_ATTACK_BACK) + || ((cg.snap->ps.torsoAnim) == BOTH_CROUCHATTACKBACK1) + || ((cg.snap->ps.torsoAnim) == BOTH_BUTTERFLY_LEFT) + //This technically has 2 spins and seems to have been labeled wrong + || ((cg.snap->ps.legsAnim) == BOTH_FJSS_TR_BL) ) + {//Left Spins + VectorCopy( cg.refdefViewAngles, eyeAngles ); + eyeAngles[1] += AngleNormalize180( (360 - (360 * TorsoAnimPoint)) ); + AngleNormalize180( eyeAngles[1] ); + eyeRange = qfalse; + DidSpecial = qtrue; + } + else if ( ((cg.snap->ps.torsoAnim) == BOTH_T1_BR_BL) + || ((cg.snap->ps.torsoAnim) == BOTH_T1__R__L) + || ((cg.snap->ps.torsoAnim) == BOTH_T1__R_BL) + || ((cg.snap->ps.torsoAnim) == BOTH_T1_TR_BL) + || ((cg.snap->ps.torsoAnim) == BOTH_T1_BR_TL) + || ((cg.snap->ps.torsoAnim) == BOTH_T1_BR__L) + || ((cg.snap->ps.torsoAnim) == BOTH_T2_BR__L) + || ((cg.snap->ps.torsoAnim) == BOTH_T2_BR_BL) + || ((cg.snap->ps.torsoAnim) == BOTH_T2__R_BL) + || ((cg.snap->ps.torsoAnim) == BOTH_T3_BR__L) + || ((cg.snap->ps.torsoAnim) == BOTH_T3_BR_BL) + || ((cg.snap->ps.torsoAnim) == BOTH_T3__R_BL) + || ((cg.snap->ps.torsoAnim) == BOTH_T4_BR__L) + || ((cg.snap->ps.torsoAnim) == BOTH_T4_BR_BL) + || ((cg.snap->ps.torsoAnim) == BOTH_T4__R_BL) + || ((cg.snap->ps.torsoAnim) == BOTH_T5_BR_BL) + || ((cg.snap->ps.torsoAnim) == BOTH_T5__R__L) + || ((cg.snap->ps.torsoAnim) == BOTH_T5__R_BL) + || ((cg.snap->ps.torsoAnim) == BOTH_T5_TR_BL) + || ((cg.snap->ps.torsoAnim) == BOTH_T5_BR_TL) + || ((cg.snap->ps.torsoAnim) == BOTH_T5_BR__L) + //This technically has 2 spins + || ((cg.snap->ps.legsAnim) == BOTH_BUTTERFLY_RIGHT) + //This technically has 2 spins and seems to have been labeled wrong + || ((cg.snap->ps.legsAnim) == BOTH_FJSS_TL_BR) ) + {//Right Spins + VectorCopy( cg.refdefViewAngles, eyeAngles ); + eyeAngles[1] += AngleNormalize180( (360 * TorsoAnimPoint) ); + AngleNormalize180( eyeAngles[1] ); + eyeRange = qfalse; + DidSpecial = qtrue; + } + } + else + {//You're here because you're using cg_truespin.integer == 2 + if ( PM_SpinningSaberAnim( (cg.snap->ps.torsoAnim) ) + && ((cg.snap->ps.torsoAnim) != BOTH_JUMPFLIPSLASHDOWN1) + && ((cg.snap->ps.torsoAnim) != BOTH_JUMPFLIPSTABDOWN) ) + {//Flip animation and using cg_trueflip.integer = 2, lock the eyemovement + eyeRange = qfalse; + DidSpecial = qtrue; + } + } + } + else if ( PM_SpinningSaberAnim( (cg.snap->ps.torsoAnim) ) + && ((cg.snap->ps.torsoAnim) != BOTH_JUMPFLIPSLASHDOWN1) + && ((cg.snap->ps.torsoAnim) != BOTH_JUMPFLIPSTABDOWN) ) + {//you don't want spinning so use cg.refdef.viewangles as the view + UseRefDef = qtrue; + } + else if ( (cg.snap->ps.legsAnim) == BOTH_JUMPATTACK6) + { + UseRefDef = qtrue; + } + + //Prevent camera flicker while landing. + if ( ((cg.snap->ps.legsAnim) == BOTH_LAND1) + || ((cg.snap->ps.legsAnim) == BOTH_LAND2) + || ((cg.snap->ps.legsAnim) == BOTH_LANDBACK1) + || ((cg.snap->ps.legsAnim) == BOTH_LANDLEFT1) + || ((cg.snap->ps.legsAnim) == BOTH_LANDRIGHT1) ) + { + UseRefDef = qtrue; + } + + //Prevent the camera flicker while switching to the saber. + if ( ( (cg.snap->ps.torsoAnim) == BOTH_STAND2TO1 ) + || ( (cg.snap->ps.torsoAnim) == BOTH_STAND1TO2 ) ) + { + UseRefDef = qtrue; + } + + //special camera view for blue backstab + if ( (cg.snap->ps.torsoAnim) == BOTH_A2_STABBACK1) + { + eyeRange = qfalse; + DidSpecial = qtrue; + } + + if ( ( (cg.snap->ps.torsoAnim) == BOTH_JUMPFLIPSLASHDOWN1) + || ( (cg.snap->ps.torsoAnim) == BOTH_JUMPFLIPSLASHDOWN1) ) + { + eyeRange = qfalse; + DidSpecial = qtrue; + } + + + if ( UseRefDef ) + { + VectorCopy( cg.refdefViewAngles, eyeAngles ); + } + else + { + //Movement Roll dampener + if ( !DidSpecial ) + { + if ( !cg_truemoveroll.integer ) + { + eyeAngles[2] = cg.refdefViewAngles[2]; + } + else if ( cg_truemoveroll.integer == 1 ) + {//dampen the movement leaning + eyeAngles[2] *= .5; + } + } + + //eye movement + if ( eyeRange ) + {//allow eye motion + for (i = 0; i < 2; i++ ) + { + int fov; + if ( cg_truefov.integer ) + { + fov = cg_truefov.value; + } + else + { + fov = cg_fov.value; + } + + AngDiff = eyeAngles[i] - cg.refdefViewAngles[i]; + + AngDiff = AngleNormalize180( AngDiff ); + if ( fabs( AngDiff ) > fov ) + { + if ( AngDiff < 0 ) + { + eyeAngles[i] += fov; + } + else + { + eyeAngles[i] -= fov; + } + } + else + { + eyeAngles[i] = cg.refdefViewAngles[i]; + } + AngleNormalize180( eyeAngles[i] ); + } + } + } +} + /* =============== CG_Player @@ -7662,7 +8066,7 @@ void CG_Player( centity_t *cent ) { return; } - if(cent->currentState.number == 0 && !cg.renderingThirdPerson )//!cg_thirdPerson.integer ) + if(cent->currentState.number == 0 && !cg.renderingThirdPerson && (!cg_trueguns.integer || cg.zoomMode))//!cg_thirdPerson.integer ) { calcedMp = qtrue; } @@ -7713,7 +8117,7 @@ Ghoul2 Insert Start {//no viewentity if ( cent->currentState.number == cg.snap->ps.clientNum ) {//I am the player - if ( cg.snap->ps.weapon != WP_SABER && cg.snap->ps.weapon != WP_MELEE ) + if ( cg.zoomMode || (!cg_trueguns.integer && cg.snap->ps.weapon != WP_SABER && cg.snap->ps.weapon != WP_MELEE) || (cg.snap->ps.weapon == WP_SABER && cg_truesaberonly.integer) ) {//not using saber or fists ent.renderfx = RF_THIRD_PERSON; // only draw in mirrors } @@ -7721,7 +8125,7 @@ Ghoul2 Insert Start } else if ( cent->currentState.number == cg.snap->ps.viewEntity ) {//I am the view entity - if ( cg.snap->ps.weapon != WP_SABER && cg.snap->ps.weapon != WP_MELEE ) + if ( cg.zoomMode || (!cg_trueguns.integer && cg.snap->ps.weapon != WP_SABER && cg.snap->ps.weapon != WP_MELEE) || (cg.snap->ps.weapon == WP_SABER && cg_truesaberonly.integer) ) {//not using first person saber test or, if so, not using saber ent.renderfx = RF_THIRD_PERSON; // only draw in mirrors } @@ -8063,6 +8467,7 @@ extern vmCvar_t cg_thirdPersonAlpha; if ( cent->currentState.number != 0 || cg.renderingThirdPerson || cg.snap->ps.stats[STAT_HEALTH] <= 0 + || ( cg_trueguns.integer && !cg.zoomMode ) || ( !cg.renderingThirdPerson && (cg.snap->ps.weapon == WP_SABER||cg.snap->ps.weapon == WP_MELEE) )//First person saber ) {//in some third person mode or NPC @@ -8113,6 +8518,121 @@ extern vmCvar_t cg_thirdPersonAlpha; gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, cent->gent->client->renderInfo.footRPoint ); } + //[TrueView] + //Restrict True View Model changes to the player and do the True View camera view work. + if (cg.snap && cent->currentState.number == cg.snap->ps.viewEntity && cg_truebobbing.integer) + { + if ( !cg.renderingThirdPerson && (cg_trueguns.integer || cent->currentState.weapon == WP_SABER + || cent->currentState.weapon == WP_MELEE) && !cg.zoomMode) + { + //gent->ghoul2[cent->gent->playerModel], "*head_eyes"); + if( !gi.G2API_GetBoltMatrix(cent->gent->ghoul2, cent->gent->playerModel, eyesBolt, &eyeMatrix, tempAngles, cent->lerpOrigin, + cg.time, cgs.model_draw, cent->currentState.modelScale) ) + {//Something prevented you from getting the "*head_eyes" information. The model probably doesn't have a + //*head_eyes tag surface. Try using *head_front instead + + eyesBolt = gi.G2API_AddBolt(¢->gent->ghoul2[cent->gent->playerModel], "*head_front"); + if( !gi.G2API_GetBoltMatrix(cent->gent->ghoul2, cent->gent->playerModel, eyesBolt, &eyeMatrix, tempAngles, cent->lerpOrigin, + cg.time, cgs.model_draw, cent->currentState.modelScale) ) + { + eyesBolt = gi.G2API_AddBolt(¢->gent->ghoul2[cent->gent->playerModel], "reye"); + boneBased = qtrue; + if( !gi.G2API_GetBoltMatrix(cent->gent->ghoul2, cent->gent->playerModel, eyesBolt, &eyeMatrix, tempAngles, cent->lerpOrigin, + cg.time, cgs.model_draw, cent->currentState.modelScale) ) + { +/* if( !trueviewwarning ) + {//first failure. Do a single warning then turn the warnings off. + CG_Printf("WARNING: This Model seems to have missing the *head_eyes and *head_front tag surfaces. True View Disabled.\n"); + trueviewwarning = qtrue; + }*/ + + goto SkipTrueView; + } + } + } + + //Set the original eye Origin + VectorCopy( cg.refdef.vieworg, OldeyeOrigin); + + //set the player's view origin + gi.G2API_GiveMeVectorFromMatrix(eyeMatrix, ORIGIN, cg.refdef.vieworg); + + //Find the orientation of the eye tag surface + //I based this on coordsys.h that I found at http://www.xs4all.nl/~hkuiper/cwmtx/html/coordsys_8h-source.html + //According to the file, Harry Kuiper, Will DeVore deserve credit for making that file that I based this on. + + if(boneBased) + {//the eye bone has different default axis orientation than the tag surfaces. + EyeAxis[0][0] = eyeMatrix.matrix[0][1]; + EyeAxis[1][0] = eyeMatrix.matrix[1][1]; + EyeAxis[2][0] = eyeMatrix.matrix[2][1]; + + EyeAxis[0][1] = eyeMatrix.matrix[0][0]; + EyeAxis[1][1] = eyeMatrix.matrix[1][0]; + EyeAxis[2][1] = eyeMatrix.matrix[2][0]; + + EyeAxis[0][2] = -eyeMatrix.matrix[0][2]; + EyeAxis[1][2] = -eyeMatrix.matrix[1][2]; + EyeAxis[2][2] = -eyeMatrix.matrix[2][2]; + } + else + { + EyeAxis[0][0] = eyeMatrix.matrix[0][0]; + EyeAxis[1][0] = eyeMatrix.matrix[1][0]; + EyeAxis[2][0] = eyeMatrix.matrix[2][0]; + + EyeAxis[0][1] = eyeMatrix.matrix[0][1]; + EyeAxis[1][1] = eyeMatrix.matrix[1][1]; + EyeAxis[2][1] = eyeMatrix.matrix[2][1]; + + EyeAxis[0][2] = eyeMatrix.matrix[0][2]; + EyeAxis[1][2] = eyeMatrix.matrix[1][2]; + EyeAxis[2][2] = eyeMatrix.matrix[2][2]; + } + + eyeAngles[YAW] = ( atan2(EyeAxis[1][0], EyeAxis[0][0]) * 180 / M_PI ); + + //I want asin but it's not setup in the libraries so I'm useing the statement asin x = (M_PI / 2) - acos x + eyeAngles[PITCH] = ( ( (M_PI / 2) - acos (-EyeAxis[2][0]) ) * 180 / M_PI ); + eyeAngles[ROLL] = ( atan2(EyeAxis[2][1], EyeAxis[2][2]) * 180 / M_PI ); + + //END Find the orientation of the eye tag surface + + //Shift the camera origin by cg_trueeyeposition + AngleVectors( eyeAngles, EyeAxis[0], NULL, NULL ); + VectorMA( cg.refdef.vieworg, cg_trueeyeposition.value, EyeAxis[0], cg.refdef.vieworg ); + + //Trace to see if the bolt eye origin is ok to move to. If it's not, place it at the last safe position. + CheckCameraLocation( OldeyeOrigin ); + + //Singleplayer TrueView fix (ghoul2 axes calculated differently to in MP!) + eyeAngles[YAW] -= 90; + + //Do all the Eye "movement" and simplified moves here. + SmoothTrueView(eyeAngles); + + //set the player view angles + VectorCopy( eyeAngles, cg.refdefViewAngles ); + + //set the player view axis + AnglesToAxis( eyeAngles, cg.refdef.viewaxis ); + + } + } + +SkipTrueView: + //Handle saber if ( cent->gent && cent->gent->client @@ -8308,7 +8828,8 @@ extern vmCvar_t cg_thirdPersonAlpha; if ( cent->currentState.number != 0 || cg.renderingThirdPerson || cg.snap->ps.stats[STAT_HEALTH] <= 0 - || ( !cg.renderingThirdPerson && (cg.snap->ps.weapon == WP_SABER||cg.snap->ps.weapon == WP_MELEE) )//First person saber + || ( !cg.renderingThirdPerson && (cg.snap->ps.weapon == WP_SABER||cg.snap->ps.weapon == WP_MELEE) ) //First person saber + || ( cg_trueguns.integer && !cg.zoomMode ) ) {//if NPC, third person, or dead, unless using saber //Get eyePoint & eyeAngles @@ -8859,7 +9380,7 @@ Ghoul2 Insert End {//no viewentity if ( cent->currentState.number == cg.snap->ps.clientNum ) {//I am the player - if ( cg.snap->ps.weapon != WP_SABER && cg.snap->ps.weapon != WP_MELEE ) + if ( cg.zoomMode || (!cg_trueguns.integer && cg.snap->ps.weapon != WP_SABER && cg.snap->ps.weapon != WP_MELEE) || (cg.snap->ps.weapon == WP_SABER && cg_truesaberonly.integer) ) {//not using saber or fists renderfx = RF_THIRD_PERSON; // only draw in mirrors } @@ -8867,7 +9388,7 @@ Ghoul2 Insert End } else if ( cent->currentState.number == cg.snap->ps.viewEntity ) {//I am the view entity - if ( cg.snap->ps.weapon != WP_SABER && cg.snap->ps.weapon != WP_MELEE ) + if ( cg.zoomMode || (!cg_trueguns.integer && cg.snap->ps.weapon != WP_SABER && cg.snap->ps.weapon != WP_MELEE) || (cg.snap->ps.weapon == WP_SABER && cg_truesaberonly.integer) ) {//not using saber or fists renderfx = RF_THIRD_PERSON; // only draw in mirrors } @@ -9209,7 +9730,7 @@ Ghoul2 Insert End } //FIXME: for debug, allow to draw a cone of the NPC's FOV... - if ( cent->currentState.number == 0 && cg.renderingThirdPerson ) + if ( cent->currentState.number == 0 && (cg.renderingThirdPerson || (cg_trueguns.integer && !cg.zoomMode)) ) { playerState_t *ps = &cg.predicted_player_state; diff --git a/code/cgame/cg_trueview.cpp b/code/cgame/cg_trueview.cpp new file mode 100644 index 0000000000..b03bb98a07 --- /dev/null +++ b/code/cgame/cg_trueview.cpp @@ -0,0 +1,247 @@ +/* + =========================================================================== + Copyright (C) 2000 - 2013, Raven Software, Inc. + Copyright (C) 2001 - 2013, Activision, Inc. + Copyright (C) 2013 - 2015, OpenJK contributors + + This file is part of the OpenJK source code. + + OpenJK is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . + =========================================================================== + */ + +#include "cg_headers.h" + +#define SIEGECHAR_TAB 9 //perhaps a bit hacky, but I don't think there's any define existing for "tab" + +#define MAX_TRUEVIEW_INFO_SIZE 8192 +char true_view_info[MAX_TRUEVIEW_INFO_SIZE]; +int true_view_valid; + +int BG_SiegeGetPairedValue(char *buf, char *key, char *outbuf) +{ + int i = 0; + int j; + int k; + char checkKey[4096]; + + while (buf[i]) + { + if (buf[i] != ' ' && buf[i] != '{' && buf[i] != '}' && buf[i] != '\n' && buf[i] != '\r') + { //we're on a valid character + if (buf[i] == '/' && + buf[i+1] == '/') + { //this is a comment, so skip over it + while (buf[i] && buf[i] != '\n' && buf[i] != '\r') + { + i++; + } + } + else + { //parse to the next space/endline/eos and check this value against our key value. + j = 0; + + while (buf[i] != ' ' && buf[i] != '\n' && buf[i] != '\r' && buf[i] != SIEGECHAR_TAB && buf[i]) + { + if (buf[i] == '/' && buf[i+1] == '/') + { //hit a comment, break out. + break; + } + + checkKey[j] = buf[i]; + j++; + i++; + } + checkKey[j] = 0; + + k = i; + + while (buf[k] && (buf[k] == ' ' || buf[k] == '\n' || buf[k] == '\r')) + { + k++; + } + + if (buf[k] == '{') + { //this is not the start of a value but rather of a group. We don't want to look in subgroups so skip over the whole thing. + int openB = 0; + + while (buf[i] && (buf[i] != '}' || openB)) + { + if (buf[i] == '{') + { + openB++; + } + else if (buf[i] == '}') + { + openB--; + } + + if (openB < 0) + { + Com_Error(ERR_DROP, "Unexpected closing bracket (too many) while parsing to end of group '%s'", checkKey); + } + + if (buf[i] == '}' && !openB) + { //this is the end of the group + break; + } + i++; + } + + if (buf[i] == '}') + { + i++; + } + } + else + { + //Is this the one we want? + if (buf[i] != '/' || buf[i+1] != '/') + { //make sure we didn't stop on a comment, if we did then this is considered an error in the file. + if (!Q_stricmp(checkKey, key)) + { //guess so. Parse along to the next valid character, then put that into the output buffer and return 1. + while ((buf[i] == ' ' || buf[i] == '\n' || buf[i] == '\r' || buf[i] == SIEGECHAR_TAB) && buf[i]) + { + i++; + } + + if (buf[i]) + { //We're at the start of the value now. + qboolean parseToQuote = qfalse; + + if (buf[i] == '\"') + { //if the value is in quotes, then stop at the next quote instead of ' ' + i++; + parseToQuote = qtrue; + } + + j = 0; + while ( ((!parseToQuote && buf[i] != ' ' && buf[i] != '\n' && buf[i] != '\r') || (parseToQuote && buf[i] != '\"')) ) + { + if (buf[i] == '/' && + buf[i+1] == '/') + { //hit a comment after the value? This isn't an ideal way to be writing things, but we'll support it anyway. + break; + } + outbuf[j] = buf[i]; + j++; + i++; + + if (!buf[i]) + { + if (parseToQuote) + { + Com_Error(ERR_DROP, "Unexpected EOF while looking for endquote, error finding paired value for '%s'", key); + } + else + { + Com_Error(ERR_DROP, "Unexpected EOF while looking for space or endline, error finding paired value for '%s'", key); + } + } + } + outbuf[j] = 0; + + return 1; //we got it, so return 1. + } + else + { + Com_Error(ERR_DROP, "Error parsing file, unexpected EOF while looking for valud '%s'", key); + } + } + else + { //if that wasn't the desired key, then make sure we parse to the end of the line, so we don't mistake a value for a key + while (buf[i] && buf[i] != '\n') + { + i++; + } + } + } + else + { + Com_Error(ERR_DROP, "Error parsing file, found comment, expected value for '%s'", key); + } + } + } + } + + if (!buf[i]) + { + break; + } + i++; + } + + return 0; //guess we never found it. +} + +//Loads in the True View auto eye positioning data so you don't have to worry about disk access later in the +//game +//Based on CG_InitSagaMode and tck's tck_InitBuffer +void CG_TrueViewInit( void ) +{ + int len = 0; + fileHandle_t f; + + + len = gi.FS_FOpenFile("trueview.cfg", &f, FS_READ); + + if (!f) + { + CG_Printf("Error: File Not Found: trueview.cfg\n"); + true_view_valid = 0; + return; + } + + if( len >= MAX_TRUEVIEW_INFO_SIZE ) + { + CG_Printf("Error: trueview.cfg is over the trueview.cfg filesize limit.\n"); + gi.FS_FCloseFile( f ); + true_view_valid = 0; + return; + } + + + gi.FS_Read(true_view_info, len, f); + + true_view_valid = 1; + + gi.FS_FCloseFile( f ); + + return; + +} + +void CG_AdjustEyePos (const char *modelName) +{ + //eye position + char eyepos[MAX_QPATH]; + + if ( true_view_valid ) + { + + if( BG_SiegeGetPairedValue(true_view_info, (char*) modelName, eyepos) ) + { + CG_Printf("True View Eye Adjust Loaded for %s.\n", modelName); + gi.cvar_set( "cg_trueeyeposition", eyepos ); + } + else + {//Couldn't find an entry for the desired model. Not nessicarily a bad thing. + gi.cvar_set( "cg_trueeyeposition", "0" ); + } + } + else + {//The model eye position list is messed up. Default to 0.0 for the eye position + gi.cvar_set( "cg_trueeyeposition", "0" ); + } + +} \ No newline at end of file diff --git a/code/cgame/cg_view.cpp b/code/cgame/cg_view.cpp index 3523e64355..a7b9dd2b15 100644 --- a/code/cgame/cg_view.cpp +++ b/code/cgame/cg_view.cpp @@ -1324,17 +1324,26 @@ float CG_ForceSpeedFOV( void ) float timeLeft = player->client->ps.forcePowerDuration[FP_SPEED] - cg.time; float length = FORCE_SPEED_DURATION*forceSpeedValue[player->client->ps.forcePowerLevel[FP_SPEED]]; float amt = forceSpeedFOVMod[player->client->ps.forcePowerLevel[FP_SPEED]]; + if ( !cg.renderingThirdPerson && ((!cg.zoomMode && cg_trueguns.integer) || cg.snap->ps.weapon == WP_SABER + || cg.snap->ps.weapon == WP_MELEE) && cg_truefov.value ) + { + fov = cg_truefov.value; + } + else + { + fov = cg_fov.value; + } if ( timeLeft < 500 ) {//start going back - fov = cg_fov.value + (timeLeft)/500*amt; + fov = fov + (timeLeft)/500*amt; } else if ( length - timeLeft < 1000 ) {//start zooming in - fov = cg_fov.value + (length - timeLeft)/1000*amt; + fov = fov + (length - timeLeft)/1000*amt; } else {//stay at this FOV - fov = cg_fov.value+amt; + fov = fov+amt; } return fov; } @@ -1394,6 +1403,11 @@ static qboolean CG_CalcFov( void ) { { fov_x = cg.overrides.fov; } + else if ( !cg.renderingThirdPerson && ((!cg.zoomMode && cg_trueguns.integer) || cg.snap->ps.weapon == WP_SABER + || cg.snap->ps.weapon == WP_MELEE) && cg_truefov.value ) + { + fov_x = cg_truefov.value; + } else { fov_x = cg_fov.value; @@ -1665,7 +1679,7 @@ static qboolean CG_CalcViewValues( void ) { } } - if ( (cg.renderingThirdPerson||cg.snap->ps.weapon == WP_SABER||cg.snap->ps.weapon == WP_MELEE) + if ( (cg.renderingThirdPerson) && !cg.zoomMode && !viewEntIsCam ) { @@ -1677,7 +1691,7 @@ static qboolean CG_CalcViewValues( void ) { // else // { // First person saber - if ( !cg.renderingThirdPerson ) + /*if ( !cg.renderingThirdPerson ) { if ( cg.snap->ps.weapon == WP_SABER||cg.snap->ps.weapon == WP_MELEE ) { @@ -1687,7 +1701,7 @@ static qboolean CG_CalcViewValues( void ) { AngleVectors( cg.refdefViewAngles, dir, NULL, NULL ); VectorMA( cg.refdef.vieworg, -2, dir, cg.refdef.vieworg ); } - } + }*/ CG_OffsetThirdPersonView(); // } } @@ -2092,8 +2106,22 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView ) { || (cg.snap->ps.stats[STAT_HEALTH] <= 0) || (cg.snap->ps.eFlags&EF_HELD_BY_SAND_CREATURE) || ((g_entities[0].client&&g_entities[0].client->NPC_class==CLASS_ATST) - || (cg.snap->ps.weapon == WP_SABER || cg.snap->ps.weapon == WP_MELEE) )); + || ((cg.snap->ps.weapon == WP_SABER || cg.snap->ps.weapon == WP_MELEE) && !cg_fpls.integer) )); + + if (cg_fpls.integer && cg_trueinvertsaber.integer == 2 && (cg.snap->ps.weapon == WP_SABER || cg.snap->ps.weapon == WP_MELEE)) + {//force thirdperson for sabers/melee if in cg_trueinvertsaber.integer == 2 + cg.renderingThirdPerson = qtrue; + } + else if (cg_fpls.integer && cg_trueinvertsaber.integer == 1 && !cg_thirdPerson.integer && (cg.snap->ps.weapon == WP_SABER || cg.snap->ps.weapon == WP_MELEE)) + { + cg.renderingThirdPerson = qtrue; + } + else if (cg_fpls.integer && cg_trueinvertsaber.integer == 1 && cg_thirdPerson.integer && (cg.snap->ps.weapon == WP_SABER || cg.snap->ps.weapon == WP_MELEE)) + { + cg.renderingThirdPerson = qfalse; + } + if ( cg.zoomMode ) { // zoomed characters should never do third person stuff?? @@ -2261,3 +2289,15 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView ) { */ } +//Checks to see if the current camera position is valid based on the last known safe location. If it's not safe, place +//the camera at the last position safe location +void CheckCameraLocation( vec3_t OldeyeOrigin ) +{ + trace_t trace; + + CG_Trace(&trace, OldeyeOrigin, cameramins, cameramaxs, cg.refdef.vieworg, cg.snap->ps.clientNum, MASK_CAMERACLIP); + if (trace.fraction <= 1.0) + { + VectorCopy(trace.endpos, cg.refdef.vieworg); + } +} diff --git a/code/cgame/cg_weapons.cpp b/code/cgame/cg_weapons.cpp index fb098dbb1b..b4a83924c8 100644 --- a/code/cgame/cg_weapons.cpp +++ b/code/cgame/cg_weapons.cpp @@ -1267,6 +1267,9 @@ void CG_AddViewWeapon( playerState_t *ps ) // no gun if in third person view if ( cg.renderingThirdPerson ) return; + + if ( cg_trueguns.integer && !cg.zoomMode ) + return; if ( ps->pm_type == PM_INTERMISSION ) return; diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index eae085742c..22570ae24a 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -209,6 +209,7 @@ set(SPGameCGameFiles "${SPDir}/cgame/cg_snapshot.cpp" "${SPDir}/cgame/cg_syscalls.cpp" "${SPDir}/cgame/cg_text.cpp" + "${SPDir}/cgame/cg_trueview.cpp" "${SPDir}/cgame/cg_view.cpp" "${SPDir}/cgame/cg_weapons.cpp" "${SPDir}/cgame/FX_ATSTMain.cpp" diff --git a/code/game/bg_local.h b/code/game/bg_local.h index 88e1e4eb76..a54085e4ec 100644 --- a/code/game/bg_local.h +++ b/code/game/bg_local.h @@ -78,6 +78,8 @@ void PM_AddEvent( int newEvent ); qboolean PM_SlideMove( float gravity ); void PM_StepSlideMove( float gravity ); +extern qboolean BG_AllowThirdPersonSpecialMove( playerState_t *ps ); + #endif diff --git a/code/game/bg_pangles.cpp b/code/game/bg_pangles.cpp index 0e5ec60774..d92f216dd1 100644 --- a/code/game/bg_pangles.cpp +++ b/code/game/bg_pangles.cpp @@ -1598,7 +1598,7 @@ void PM_UpdateViewAngles( playerState_t *ps, usercmd_t *cmd, gentity_t *gent ) { //only in the real pmove if ( (cmd->buttons & BUTTON_USE) ) {//check leaning - if ( cg.renderingThirdPerson ) + if ( BG_AllowThirdPersonSpecialMove( ps ) ) {//third person lean if ( G_OkayToLean( ps, cmd, qtrue ) && (cmd->rightmove || (cmd->forwardmove && g_debugMelee->integer ) ) )//pushing a direction diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index 43e79fa1cc..e3ec573b5b 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -2374,7 +2374,7 @@ saberMoveName_t PM_AttackForEnemyPos( qboolean allowFB, qboolean allowStabDown ) } //this is the default only if they're *right* in front... if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) - || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) ) + || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && BG_AllowThirdPersonSpecialMove( pm->ps ) && !cg.zoomMode) ) {//NPC or player not in 1st person if ( PM_CheckFlipOverAttackMove( qtrue ) ) {//enemy must be close and in front @@ -2455,7 +2455,7 @@ saberMoveName_t PM_AttackForEnemyPos( qboolean allowFB, qboolean allowStabDown ) else if ( pm->ps->saberAnimLevel != SS_FAST && pm->ps->saberAnimLevel != SS_STAFF ) {//higher level back spin-attacks - if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) ) + if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && BG_AllowThirdPersonSpecialMove( pm->ps ) && !cg.zoomMode) ) { if ( (pm->ps->pm_flags&PMF_DUCKED) || pm->cmd.upmove < 0 ) { @@ -3659,7 +3659,7 @@ saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int c { return stabDownMove; } - if ( ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) )//player in third person, not zoomed in + if ( ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && BG_AllowThirdPersonSpecialMove( pm-> ps ) && !cg.zoomMode) )//player in third person, not zoomed in {//player in thirdperson, not zoomed in //flip-over attack logic if ( !noSpecials && PM_CheckFlipOverAttackMove( qfalse ) ) @@ -3765,7 +3765,7 @@ saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int c } } else if ( (pm->ps->clientNum&&!PM_ControlledByPlayer()) //NPC - || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode) )//player in third person, not zooomed + || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && BG_AllowThirdPersonSpecialMove( pm->ps ) && !cg.zoomMode) )//player in third person, not zooomed {//NPC or player in third person, not zoomed if ( PM_CheckBackflipAttackMove() ) { diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index f44034b91a..6e068783a8 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -223,7 +223,10 @@ qboolean BG_UnrestrainedPitchRoll( playerState_t *ps, Vehicle_t *pVeh ) return qfalse; } - +qboolean BG_AllowThirdPersonSpecialMove( playerState_t *ps ) +{ + return (qboolean)((cg.renderingThirdPerson || cg_trueguns.integer || ps->weapon == WP_SABER || ps->weapon == WP_MELEE) && !cg.zoomMode); +} /* =============== PM_AddEvent @@ -1270,7 +1273,7 @@ static qboolean PM_CheckJump( void ) pm->ps->legsAnim != BOTH_ALORA_FLIP_1 && pm->ps->legsAnim != BOTH_ALORA_FLIP_2 && pm->ps->legsAnim != BOTH_ALORA_FLIP_3 - && cg.renderingThirdPerson//third person only + && BG_AllowThirdPersonSpecialMove( pm->ps )//third person only && !cg.zoomMode //not zoomed in && !(pm->ps->saber[0].saberFlags&SFL_NO_FLIPS)//okay to do flips with this saber && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_FLIPS) )//okay to do flips with this saber @@ -1484,7 +1487,7 @@ static qboolean PM_CheckJump( void ) //&& !PM_InKnockDown( pm->ps )//not in a knockdown && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period && pm->gent && WP_ForcePowerAvailable( pm->gent, FP_LEVITATION, 0 ) //have enough force power to jump - && ((pm->ps->clientNum&&!PM_ControlledByPlayer())||((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) )) )// yes this locked weapons check also includes force powers, if we need a separate check later I'll make one + && ((pm->ps->clientNum&&!PM_ControlledByPlayer())||((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && BG_AllowThirdPersonSpecialMove( pm->ps ) && !cg.zoomMode && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) )) )// yes this locked weapons check also includes force powers, if we need a separate check later I'll make one { if ( pm->gent->NPC && pm->gent->NPC->rank != RANK_CREWMAN && pm->gent->NPC->rank <= RANK_LT_JG ) {//reborn who are not acrobats can't do any of these acrobatics @@ -2361,7 +2364,7 @@ static qboolean PM_CheckJump( void ) && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period && pm->ps->weapon == WP_SABER && (pm->ps->weaponTime > 0||(pm->cmd.buttons&BUTTON_ATTACK)) - && ((pm->ps->clientNum&&!PM_ControlledByPlayer())||((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode)) ) + && ((pm->ps->clientNum&&!PM_ControlledByPlayer())||((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && BG_AllowThirdPersonSpecialMove( pm->ps ) && !cg.zoomMode)) ) {//okay, we just jumped and we're in an attack if ( !PM_RollingAnim( pm->ps->legsAnim ) && !PM_InKnockDown( pm->ps ) @@ -3125,7 +3128,7 @@ static void PM_WalkMove( void ) { if ( g_debugMelee->integer ) { if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//player - && cg.renderingThirdPerson//in third person + && BG_AllowThirdPersonSpecialMove( pm->ps )//in third person && ((pm->cmd.buttons&BUTTON_USE)||pm->ps->leanStopDebounceTime)//holding use or leaning //&& (pm->ps->forcePowersActive&(1<ps->groundEntityNum != ENTITYNUM_NONE//on ground @@ -3795,7 +3798,7 @@ static qboolean PM_TryRoll( void ) return qfalse; } } - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && (!cg.renderingThirdPerson || cg.zoomMode) ) + if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && (!BG_AllowThirdPersonSpecialMove( pm->ps )) ) {//player can't do this in 1st person return qfalse; } @@ -5698,7 +5701,7 @@ static void PM_CheckDuck (void) if ( pm->ps->clientNum < MAX_CLIENTS && (pm->gent->client->NPC_class == CLASS_ATST ||pm->gent->client->NPC_class == CLASS_RANCOR) - && !cg.renderingThirdPerson ) + && !BG_AllowThirdPersonSpecialMove( pm->ps ) ) { standheight = crouchheight = 128; } @@ -7453,7 +7456,7 @@ qboolean PM_AdjustStandAnimForSlope( void ) return qfalse; } if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) - && (!cg.renderingThirdPerson || cg.zoomMode) ) + && (!BG_AllowThirdPersonSpecialMove( pm->ps )) ) {//first person doesn't do this return qfalse; } @@ -13969,7 +13972,7 @@ static void PM_Weapon( void ) } else { - if ( cg.renderingThirdPerson ) + if ( BG_AllowThirdPersonSpecialMove( pm->ps ) ) { if ( PM_StandingAnim( pm->ps->legsAnim ) || pm->ps->legsAnim == BOTH_THERMAL_READY ) diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index 10bc2ead31..5eb6275023 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -4288,6 +4288,10 @@ void G_CheckClientIdle( gentity_t *ent, usercmd_t *ucmd ) { return; } + if ( !ent->s.number && (cg_trueguns.integer || (!cg.renderingThirdPerson && (ent->client->ps.weapon == WP_SABER || ent->client->ps.weapon == WP_MELEE)) ) ) + { + return; + } if ( !ent->s.number && ( /*!cg.renderingThirdPerson ||*/ cg.zoomMode ) ) { if ( ent->client->idleTime < level.time ) From 1f0088ccd8dbfe1f6f6ec9dce719f920af1e47cd Mon Sep 17 00:00:00 2001 From: redsaurus Date: Thu, 28 May 2015 01:54:38 +0100 Subject: [PATCH 409/445] Weapons: supports arbitrary MAX_WEAPONS now Upped MAX_WEAPONS to 64 and added 5 new weaps --- code/cgame/cg_consolecmds.cpp | 2 +- code/cgame/cg_info.cpp | 53 +++++++++++++++++-------- code/cgame/cg_playerstate.cpp | 34 ---------------- code/cgame/cg_predict.cpp | 2 +- code/cgame/cg_weapons.cpp | 66 +++++++++++++++++++++++-------- code/game/AI_Grenadier.cpp | 2 +- code/game/AI_Jedi.cpp | 8 ++-- code/game/NPC_combat.cpp | 27 +++++++++++-- code/game/NPC_spawn.cpp | 9 +++-- code/game/NPC_stats.cpp | 2 +- code/game/NPC_utils.cpp | 7 +++- code/game/Q3_Interface.cpp | 19 ++++++--- code/game/SpeederNPC.cpp | 2 +- code/game/bg_misc.cpp | 8 ++-- code/game/bg_panimate.cpp | 27 ++++++++++++- code/game/bg_pmove.cpp | 16 ++++++-- code/game/g_active.cpp | 6 ++- code/game/g_client.cpp | 74 +++++++++++++++++++++++++---------- code/game/g_cmds.cpp | 14 +++++-- code/game/g_combat.cpp | 11 +++++- code/game/g_emplaced.cpp | 6 +-- code/game/g_itemLoad.cpp | 21 ++++++++++ code/game/g_items.cpp | 12 +++--- code/game/g_items.h | 6 +++ code/game/g_vehicles.cpp | 12 +++--- code/game/g_weapon.cpp | 14 +++++++ code/game/g_weaponLoad.cpp | 53 +++++++++++++++++++++++++ code/game/weapons.h | 8 ++++ code/game/wp_saber.cpp | 10 ++--- code/qcommon/msg.cpp | 40 +++++++++++++++++-- code/qcommon/q_shared.h | 8 +++- code/server/sv_ccmds.cpp | 12 +++++- code/ui/ui_main.cpp | 15 ++++--- 33 files changed, 451 insertions(+), 155 deletions(-) diff --git a/code/cgame/cg_consolecmds.cpp b/code/cgame/cg_consolecmds.cpp index e1dae16922..4faae97b0c 100644 --- a/code/cgame/cg_consolecmds.cpp +++ b/code/cgame/cg_consolecmds.cpp @@ -146,7 +146,7 @@ void CG_ToggleBinoculars( void ) cg.zoomTime = cg.time; cgi_S_StartSound( NULL, cg.snap->ps.clientNum, CHAN_AUTO, cgs.media.zoomEnd ); - if( cg.weaponSelect == WP_NONE && cg.snap->ps.stats[STAT_WEAPONS] & ( 1 << WP_SABER ) ) + if( cg.weaponSelect == WP_NONE && cg.snap->ps.weapons[WP_SABER] ) { // FIXME: this is pretty damn ugly but whatever cg.weaponSelect = WP_SABER; diff --git a/code/cgame/cg_info.cpp b/code/cgame/cg_info.cpp index 17abcfee02..41ee06f801 100644 --- a/code/cgame/cg_info.cpp +++ b/code/cgame/cg_info.cpp @@ -436,11 +436,11 @@ int CG_WeaponCheck( int weaponIndex ); // For printing load screen icons const int MAXLOADICONSPERROW = 8; // Max icons displayed per row -const int MAXLOADWEAPONS = 16; +const int MAXLOADWEAPONS = WP_NUM_WEAPONS; const int MAXLOAD_FORCEICONSIZE = 40; // Size of force power icons const int MAXLOAD_FORCEICONPAD = 12; // Padding space between icons -static int CG_DrawLoadWeaponsPrintRow( const char *itemName, int weaponsBits,int rowIconCnt, int startIndex) +static int CG_DrawLoadWeaponsPrintRow( const char *itemName, char *weapons,int rowIconCnt, int startIndex) { int i,endIndex=0, printedIconCnt=0; int iconSize; @@ -473,7 +473,7 @@ static int CG_DrawLoadWeaponsPrintRow( const char *itemName, int weaponsBits,int for (i=startIndex;ips.stats[STAT_HEALTH], &iDummy, // &client->ps.stats[STAT_ARMOR], - &*weaponBits,// &client->ps.stats[STAT_WEAPONS], &iDummy, // &client->ps.stats[STAT_ITEMS], &iDummy, // &client->ps.weapon, &iDummy, // &client->ps.weaponstate, @@ -692,6 +692,26 @@ static void CG_GetLoadScreenInfo(int *weaponBits,int *forceBits) ); } + + gi.Cvar_VariableStringBuffer( "playerweaps", s, sizeof(s) ); + i=0; + if (s[0]) + { + var = strtok( s, " " ); + while( var != NULL ) + { + /* While there are tokens in "s" */ + weapons[i++] = atoi(var); + /* Get next token: */ + var = strtok( NULL, " " ); + } + assert (i==WP_NUM_WEAPONS); + } + else + { + weapons[0] = -1; + } + // the new JK2 stuff - force powers, etc... // @@ -719,7 +739,8 @@ static void CG_DrawLoadingScreen( qhandle_t levelshot ,const char *mapName) int xPos,yPos,width,height; vec4_t color; qhandle_t background; - int weapons=0, forcepowers=0; + int forcepowers=0; + char weapons[WP_NUM_WEAPONS]; // Get mission briefing for load screen if (cgi_SP_GetStringTextString( va("BRIEFINGS_%s",mapName), NULL, 0 ) == 0) @@ -770,10 +791,10 @@ static void CG_DrawLoadingScreen( qhandle_t levelshot ,const char *mapName) } // Get player weapons and force power info - CG_GetLoadScreenInfo(&weapons,&forcepowers); + CG_GetLoadScreenInfo(weapons,&forcepowers); // Print weapon icons - if (weapons) + if (weapons[0] > -1) { CG_DrawLoadWeapons(weapons); } diff --git a/code/cgame/cg_playerstate.cpp b/code/cgame/cg_playerstate.cpp index 3d75db3e57..b151b26e5b 100644 --- a/code/cgame/cg_playerstate.cpp +++ b/code/cgame/cg_playerstate.cpp @@ -46,40 +46,6 @@ void CG_CheckAmmo( void ) int previous; // int weapons; -#if 0 - - // see about how many seconds of ammo we have remaining - weapons = cg.snap->ps.stats[ STAT_WEAPONS ]; - total = 0; - - for ( i = WP_SABER; i < WP_NUM_WEAPONS i++ ) - { - if ( ! ( weapons & ( 1 << i ) ) ) - continue; - - /* - switch ( i ) - { - case WP_ROCKET_LAUNCHER: - case WP_GRENADE_LAUNCHER: - case WP_RAILGUN: - case WP_SHOTGUN: - total += cg.snap->ps.ammo[i] * 1000; - break; - default: - total += cg.snap->ps.ammo[i] * 200; - break; - } - */ - - if ( total >= 5000 ) - { - cg.lowAmmoWarning = 0; - return; - } - } -#endif - // Don't bother drawing the ammo warning when have no weapon selected if ( cg.weaponSelect == WP_NONE ) { diff --git a/code/cgame/cg_predict.cpp b/code/cgame/cg_predict.cpp index e0c57f7519..cf89330651 100644 --- a/code/cgame/cg_predict.cpp +++ b/code/cgame/cg_predict.cpp @@ -536,7 +536,7 @@ void CG_TouchItem( centity_t *cent ) { // if its a weapon, give them some predicted ammo so the autoswitch will work if ( item->giType == IT_WEAPON ) { int ammotype = weaponData[item->giTag].ammoIndex; - cg.predicted_player_state.stats[ STAT_WEAPONS ] |= 1 << item->giTag; + cg.predicted_player_state.weapons[item->giTag] = 1; if ( !cg.predicted_player_state.ammo[ ammotype] ) { cg.predicted_player_state.ammo[ ammotype ] = 1; } diff --git a/code/cgame/cg_weapons.cpp b/code/cgame/cg_weapons.cpp index b4a83924c8..630ea3c834 100644 --- a/code/cgame/cg_weapons.cpp +++ b/code/cgame/cg_weapons.cpp @@ -646,6 +646,21 @@ void CG_RegisterWeapon( int weaponNum ) { case WP_TIE_FIGHTER: theFxScheduler.RegisterEffect( "ships/imp_blastershot" ); break; + + case WP_E5_CARBINE: + case WP_DC15S_CARBINE: + case WP_SONIC_BLASTER: + case WP_DC15A_RIFLE: + case WP_Z6_ROTARY: + cgs.effects.blasterShotEffect = theFxScheduler.RegisterEffect( "blaster/shot" ); + theFxScheduler.RegisterEffect( "blaster/NPCshot" ); + // cgs.effects.blasterOverchargeEffect = theFxScheduler.RegisterEffect( "blaster/overcharge" ); + cgs.effects.blasterWallImpactEffect = theFxScheduler.RegisterEffect( "blaster/wall_impact" ); + cgs.effects.blasterFleshImpactEffect = theFxScheduler.RegisterEffect( "blaster/flesh_impact" ); + theFxScheduler.RegisterEffect( "blaster/deflect" ); + theFxScheduler.RegisterEffect( "blaster/smoke_bolton" ); // note: this will be called game side + break; + } } @@ -1790,6 +1805,13 @@ const char *weaponDesc[WP_NUM_WEAPONS - 1] = "TUSKEN_STAFF_DESC", "SCEPTER_DESC", "NOGHRI_STICK_DESC", + +"SONIC_BLASTER_DESC", + +"E5_CARBINE_DESC", +"DC15S_CARBINE_DESC", +"DC15A_RIFLE_DESC", +"Z6_ROTARY_DESC", }; /* @@ -1802,7 +1824,7 @@ Allows user to cycle through the various weapons currently owned and view the de void CG_DrawDataPadWeaponSelect( void ) { int i; - int weaponBitFlag,weaponCount,weaponSelectI; + int weaponCount,weaponSelectI; int holdX; int sideLeftIconCnt,sideRightIconCnt; int holdCount,iconCnt; @@ -1812,13 +1834,11 @@ void CG_DrawDataPadWeaponSelect( void ) // showing weapon select clears pickup item display, but not the blend blob cg.itemPickupTime = 0; - weaponBitFlag = cg.snap->ps.stats[ STAT_WEAPONS ]; - // count the number of weapons owned weaponCount = 0; for ( i = 1 ; i < WP_NUM_WEAPONS ; i++ ) { - if ( weaponBitFlag & ( 1 << i ) ) + if ( cg.snap->ps.weapons[i] ) { weaponCount++; } @@ -1903,7 +1923,7 @@ void CG_DrawDataPadWeaponSelect( void ) weaponSelectI = WP_NUM_WEAPONS - 1; } - if ( !(weaponBitFlag & ( 1 << weaponSelectI ))) // Does he have this weapon? + if ( !(cg.snap->ps.weapons[weaponSelectI])) // Does he have this weapon? { if ( weaponSelectI == WP_CONCUSSION ) { @@ -1993,7 +2013,7 @@ void CG_DrawDataPadWeaponSelect( void ) weaponSelectI = 1; } - if ( !(weaponBitFlag & ( 1 << weaponSelectI ))) // Does he have this weapon? + if ( !(cg.snap->ps.weapons[weaponSelectI])) // Does he have this weapon? { if ( weaponSelectI == WP_CONCUSSION ) { @@ -2136,7 +2156,6 @@ extern bool G_IsRidingTurboVehicle( gentity_t *ent ); void CG_DrawWeaponSelect( void ) { int i; - int bits; int count; int smallIconSize,bigIconSize; int holdX,x,y,x2,y2,w2,h2,pad; @@ -2165,14 +2184,12 @@ void CG_DrawWeaponSelect( void ) // showing weapon select clears pickup item display, but not the blend blob //cg.itemPickupTime = 0; - bits = cg.snap->ps.stats[ STAT_WEAPONS ]; - // count the number of weapons owned count = 0; isOnVeh = (G_IsRidingVehicle(cg_entities[0].gent)!=0); for ( i = 1 ; i < WP_NUM_WEAPONS ; i++ ) { - if ((bits & ( 1 << i )) && + if ((cg.snap->ps.weapons[i]) && playerUsableWeapons[i] && (!isOnVeh || i==WP_NONE || i==WP_SABER || i==WP_BLASTER)) { @@ -2256,7 +2273,7 @@ void CG_DrawWeaponSelect( void ) i = WP_NUM_WEAPONS; } - if ( !(bits & ( 1 << i ) && playerUsableWeapons[i]) ) // Does he have this weapon? + if ( !(cg.snap->ps.weapons[i] && playerUsableWeapons[i]) ) // Does he have this weapon? { if ( i == WP_CONCUSSION ) { @@ -2357,7 +2374,7 @@ void CG_DrawWeaponSelect( void ) i = 1; } - if ( !(bits & ( 1 << i ) && playerUsableWeapons[i])) // Does he have this weapon? + if ( !(cg.snap->ps.weapons[i] && playerUsableWeapons[i])) // Does he have this weapon? { if ( i == WP_CONCUSSION ) { @@ -2483,7 +2500,7 @@ qboolean CG_WeaponSelectable( int i, int original, qboolean dpMode ) } } - if (!(cg.snap->ps.stats[ STAT_WEAPONS ] & ( 1 << i ))) + if (!(cg.snap->ps.weapons[i])) { // Don't have this weapon to start with. return qfalse; @@ -2851,7 +2868,7 @@ void CG_ChangeWeapon( int num ) return; } - if ( player->client != NULL && !(player->client->ps.stats[STAT_WEAPONS] & ( 1 << num )) ) + if ( player->client != NULL && !(player->client->ps.weapons[num]) ) { return; // don't have the weapon } @@ -2939,9 +2956,9 @@ void CG_Weapon_f( void ) if ( num == WP_SABER ) {//lightsaber - if ( ! ( cg.snap->ps.stats[STAT_WEAPONS] & ( 1 << num ) ) ) + if ( ! ( cg.snap->ps.weapons[num] ) ) {//don't have saber, try stun baton - if ( ( cg.snap->ps.stats[STAT_WEAPONS] & ( 1 << WP_STUN_BATON ) ) ) + if ( ( cg.snap->ps.weapons[WP_STUN_BATON] ) ) { num = WP_STUN_BATON; } @@ -3407,6 +3424,15 @@ void CG_MissileHitWall( centity_t *cent, int weapon, vec3_t origin, vec3_t dir, case WP_NOGHRI_STICK: FX_NoghriShotWeaponHitWall( origin, dir ); break; + + case WP_E5_CARBINE: + case WP_DC15S_CARBINE: + case WP_SONIC_BLASTER: + case WP_DC15A_RIFLE: + case WP_Z6_ROTARY: + FX_BlasterWeaponHitWall( origin, dir ); + break; + } } @@ -3547,5 +3573,13 @@ void CG_MissileHitPlayer( centity_t *cent, int weapon, vec3_t origin, vec3_t dir case WP_NOGHRI_STICK: FX_NoghriShotWeaponHitPlayer( other, origin, dir, humanoid ); break; + + case WP_E5_CARBINE: + case WP_DC15S_CARBINE: + case WP_SONIC_BLASTER: + case WP_DC15A_RIFLE: + case WP_Z6_ROTARY: + FX_BlasterWeaponHitPlayer( other, origin, dir, humanoid ); + break; } } diff --git a/code/game/AI_Grenadier.cpp b/code/game/AI_Grenadier.cpp index 3e29e4185c..f631311db2 100644 --- a/code/game/AI_Grenadier.cpp +++ b/code/game/AI_Grenadier.cpp @@ -530,7 +530,7 @@ void NPC_BSGrenadier_Attack( void ) } else if ( enemyDist > 65536 || (NPC->enemy->client && NPC->enemy->client->ps.weapon == WP_SABER && NPC->enemy->client->ps.SaberActive()) )//256 {//enemy is far or using saber - if ( NPC->client->ps.weapon == WP_MELEE && (NPC->client->ps.stats[STAT_WEAPONS]&(1<client->ps.weapon == WP_MELEE && (NPC->client->ps.weapons[WP_THERMAL]) ) {//fisticuffs, make switch to thermal if have it //reset fire-timing variables NPC_ChangeWeapon( WP_THERMAL ); diff --git a/code/game/AI_Jedi.cpp b/code/game/AI_Jedi.cpp index 9b543ef96f..96595e55ac 100644 --- a/code/game/AI_Jedi.cpp +++ b/code/game/AI_Jedi.cpp @@ -1585,7 +1585,7 @@ static void Jedi_CombatDistance( int enemy_dist ) Kyle_TryGrab(); return; } - else if ( NPC->client->ps.stats[STAT_WEAPONS]&(1<client->ps.weapons[WP_SCEPTER] && !Q_irand( 0, 20 ) ) { Tavion_StartScepterSlam(); @@ -1613,7 +1613,7 @@ static void Jedi_CombatDistance( int enemy_dist ) Kyle_TryGrab(); return; } - else if ( NPC->client->ps.stats[STAT_WEAPONS]&(1<client->ps.weapons[WP_SCEPTER] && !Q_irand( 0, 20 ) ) { Tavion_StartScepterSlam(); @@ -1793,7 +1793,7 @@ static void Jedi_CombatDistance( int enemy_dist ) { ForceThrow( NPC, qtrue ); } - else if ( NPC->client->ps.stats[STAT_WEAPONS]&(1<client->ps.weapons[WP_SCEPTER] && !Q_irand( 0, 20 ) ) { Tavion_StartScepterBeam(); @@ -5188,7 +5188,7 @@ static void Jedi_CombatIdle( int enemy_dist ) {//never taunt while raging or recovering from rage return; } - if ( NPC->client->ps.stats[STAT_WEAPONS]&(1<client->ps.weapons[WP_SCEPTER] ) {//never taunt when holding scepter return; } diff --git a/code/game/NPC_combat.cpp b/code/game/NPC_combat.cpp index 95214cdb13..6b430985c8 100644 --- a/code/game/NPC_combat.cpp +++ b/code/game/NPC_combat.cpp @@ -344,6 +344,13 @@ void G_AttackDelay( gentity_t *self, gentity_t *enemy ) case WP_NOGHRI_STICK: attDelay += Q_irand( 0, 500 ); break; + case WP_SONIC_BLASTER: + case WP_E5_CARBINE: + case WP_DC15S_CARBINE: + case WP_DC15A_RIFLE: + case WP_Z6_ROTARY: + attDelay -= Q_irand( 0, 500 ); + break; /* case WP_DEMP2: break; @@ -609,14 +616,14 @@ void G_SetEnemy( gentity_t *self, gentity_t *enemy ) //FIXME: this is a disgusting hack that is supposed to make the Imperials start with their weapon holstered- need a better way if ( self->client->ps.weapon == WP_NONE && !Q_stricmpn( self->NPC_type, "imp", 3 ) && !(self->NPC->scriptFlags & SCF_FORCED_MARCH) ) { - if ( self->client->ps.stats[STAT_WEAPONS] & ( 1 << WP_BLASTER ) ) + if ( self->client->ps.weapons[WP_BLASTER] ) { ChangeWeapon( self, WP_BLASTER ); self->client->ps.weapon = WP_BLASTER; self->client->ps.weaponstate = WEAPON_READY; G_CreateG2AttachedWeaponModel( self, weaponData[WP_BLASTER].worldModel, self->handRBolt, 0 ); } - else if ( self->client->ps.stats[STAT_WEAPONS] & ( 1 << WP_BLASTER_PISTOL ) ) + else if ( self->client->ps.weapons[WP_BLASTER_PISTOL] ) { ChangeWeapon( self, WP_BLASTER_PISTOL ); self->client->ps.weapon = WP_BLASTER_PISTOL; @@ -1020,6 +1027,20 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) else ent->NPC->burstSpacing = 750;//attack debounce break; + + case WP_SONIC_BLASTER: + case WP_E5_CARBINE: + case WP_DC15S_CARBINE: + case WP_DC15A_RIFLE: + case WP_Z6_ROTARY: + if ( g_spskill->integer == 0 ) + ent->NPC->burstSpacing = 1000;//attack debounce + else if ( g_spskill->integer == 1 ) + ent->NPC->burstSpacing = 750;//attack debounce + else + ent->NPC->burstSpacing = 500;//attack debounce + break; + default: ent->NPC->aiFlags &= ~NPCAI_BURST_WEAPON; @@ -1251,7 +1272,7 @@ HaveWeapon qboolean HaveWeapon( int weapon ) { - return (qboolean)( client->ps.stats[STAT_WEAPONS] & ( 1 << weapon ) ); + return ( (qboolean)(client->ps.weapons[weapon] != 0) ); } qboolean EntIsGlass (gentity_t *check) diff --git a/code/game/NPC_spawn.cpp b/code/game/NPC_spawn.cpp index 1cf153f4d7..b6dbf1b014 100644 --- a/code/game/NPC_spawn.cpp +++ b/code/game/NPC_spawn.cpp @@ -663,7 +663,7 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) Vehicle_Register(ent); } - if ( ent->client->ps.stats[STAT_WEAPONS]&(1<client->ps.weapons[WP_SCEPTER] ) { if ( !ent->weaponModel[1] ) {//we have the scepter, so put it in our left hand if we don't already have a second weapon @@ -928,12 +928,15 @@ void NPC_SetWeapons( gentity_t *ent ) int bestWeap = WP_NONE; int weapons = NPC_WeaponsForTeam( ent->client->playerTeam, ent->spawnflags, ent->NPC_type ); - ent->client->ps.stats[STAT_WEAPONS] = 0; + for ( int i = 0; i < MAX_WEAPONS; i++ ) + { + ent->client->ps.weapons[i] = 0; + } for ( int curWeap = WP_SABER; curWeap < WP_NUM_WEAPONS; curWeap++ ) { if ( (weapons & ( 1 << curWeap )) ) { - ent->client->ps.stats[STAT_WEAPONS] |= ( 1 << curWeap ); + ent->client->ps.weapons[curWeap] = 1; RegisterItem( FindItemForWeapon( (weapon_t)(curWeap) ) ); //precache the weapon ent->NPC->currentAmmo = ent->client->ps.ammo[weaponData[curWeap].ammoIndex] = 100;//FIXME: max ammo diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index 1405ff72c0..6834840d97 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -3555,7 +3555,7 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC ) if ( weap >= WP_NONE && weap < WP_NUM_WEAPONS ) { NPC->client->ps.weapon = weap; - NPC->client->ps.stats[STAT_WEAPONS] |= ( 1 << weap ); + NPC->client->ps.weapons[weap] = 1; if ( weap > WP_NONE ) { RegisterItem( FindItemForWeapon( (weapon_t)(weap) ) ); //precache the weapon diff --git a/code/game/NPC_utils.cpp b/code/game/NPC_utils.cpp index 2ed3b3c670..7b64efcd97 100644 --- a/code/game/NPC_utils.cpp +++ b/code/game/NPC_utils.cpp @@ -281,7 +281,12 @@ qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw ) NPC->s.weapon==WP_REPEATER || NPC->s.weapon==WP_FLECHETTE || NPC->s.weapon==WP_BRYAR_PISTOL || - NPC->s.weapon==WP_NOGHRI_STICK) + NPC->s.weapon==WP_NOGHRI_STICK || + NPC->s.weapon==WP_SONIC_BLASTER || + NPC->s.weapon==WP_E5_CARBINE || + NPC->s.weapon==WP_DC15S_CARBINE || + NPC->s.weapon==WP_DC15A_RIFLE || + NPC->s.weapon==WP_Z6_ROTARY) { yawSpeed *= 10.0f; } diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 3e11879f1c..81e63df3c4 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -161,6 +161,11 @@ stringID_table_t WPTable[] = ENUM2STRING(WP_TUSKEN_STAFF), ENUM2STRING(WP_SCEPTER), ENUM2STRING(WP_NOGHRI_STICK), + ENUM2STRING(WP_SONIC_BLASTER), + ENUM2STRING(WP_E5_CARBINE), + ENUM2STRING(WP_DC15S_CARBINE), + ENUM2STRING(WP_DC15A_RIFLE), + ENUM2STRING(WP_Z6_ROTARY), { "", 0 } }; @@ -3248,13 +3253,17 @@ void G_SetWeapon( gentity_t *self, int wp ) gitem_t *item = FindItemForWeapon( (weapon_t) wp); RegisterItem( item ); //make sure the weapon is cached in case this runs at startup - if ( self->client->ps.stats[STAT_WEAPONS]&( 1 << wp ) ) + if ( self->client->ps.weapons[wp] ) { hadWeapon = qtrue; } if ( self->NPC ) {//Should NPCs have only 1 weapon at a time? - self->client->ps.stats[STAT_WEAPONS] = ( 1 << wp ); + for ( int i = 0; i < MAX_WEAPONS; i++ ) + { + self->client->ps.weapons[i] = 0; + } + self->client->ps.weapons[wp] = 1; self->client->ps.ammo[weaponData[wp].ammoIndex] = 999; ChangeWeapon( self, wp ); @@ -3264,7 +3273,7 @@ void G_SetWeapon( gentity_t *self, int wp ) } else { - self->client->ps.stats[STAT_WEAPONS] |= ( 1 << wp ); + self->client->ps.weapons[wp] = 1; self->client->ps.ammo[weaponData[wp].ammoIndex] = ammoData[weaponData[wp].ammoIndex].max; G_AddEvent( self, EV_ITEM_PICKUP, (item - bg_itemlist) ); @@ -6426,7 +6435,7 @@ static void Q3_SetSaberActive( int entID, qboolean active ) if ( ent->client->ps.weapon != WP_SABER ) { - if ( (ent->client->ps.stats[STAT_WEAPONS]&(1<client->ps.weapons[WP_SABER]) ) {//change to it right now if ( ent->NPC ) { @@ -6490,7 +6499,7 @@ static void Q3_SetSaberBladeActive( int entID, int iSaber, int iBlade, qboolean if ( ent->client->ps.weapon != WP_SABER ) { - if ( (ent->client->ps.stats[STAT_WEAPONS]&(1<client->ps.weapons[WP_SABER]) ) {//change to it right now if ( ent->NPC ) { diff --git a/code/game/SpeederNPC.cpp b/code/game/SpeederNPC.cpp index 80f8464dd5..fbce5bfe97 100644 --- a/code/game/SpeederNPC.cpp +++ b/code/game/SpeederNPC.cpp @@ -864,7 +864,7 @@ void AnimateRiders( Vehicle_t *pVeh ) { if (pVeh->m_pPilot->s.numberm_pPilot->client->ps.stats[ STAT_WEAPONS ] |= 1; // Riding means you get WP_NONE + pVeh->m_pPilot->client->ps.weapons[WP_NONE] = 1; // Riding means you get WP_NONE CG_ChangeWeapon(WP_NONE); } diff --git a/code/game/bg_misc.cpp b/code/game/bg_misc.cpp index 8bf42c7f28..583b0bbe07 100644 --- a/code/game/bg_misc.cpp +++ b/code/game/bg_misc.cpp @@ -348,7 +348,7 @@ qboolean BG_CanItemBeGrabbed( const entityState_t *ent, const playerState_t *ps case IT_WEAPON: // See if we already have this weapon. - if ( !(ps->stats[ STAT_WEAPONS ] & ( 1 << item->giTag ))) + if ( !(ps->weapons[item->giTag]) ) { // Don't have this weapon yet, so pick it up. return qtrue; @@ -375,19 +375,19 @@ qboolean BG_CanItemBeGrabbed( const entityState_t *ent, const playerState_t *ps switch( item->giTag ) { case AMMO_THERMAL: - if( !(ps->stats[STAT_WEAPONS] & ( 1 << WP_THERMAL ) ) ) + if( !(ps->weapons[WP_THERMAL] ) ) { return qtrue; } break; case AMMO_DETPACK: - if( !(ps->stats[STAT_WEAPONS] & ( 1 << WP_DET_PACK ) ) ) + if( !(ps->weapons[WP_DET_PACK] ) ) { return qtrue; } break; case AMMO_TRIPMINE: - if( !(ps->stats[STAT_WEAPONS] & ( 1 << WP_TRIP_MINE ) ) ) + if( !(ps->weapons[WP_TRIP_MINE] ) ) { return qtrue; } diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index e3ec573b5b..3a5315a7ce 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -4482,7 +4482,7 @@ void PM_SaberStartTransAnim( int saberAnimLevel, int anim, float *animSpeed, gen } if ( gent && gent->client - && gent->client->ps.stats[STAT_WEAPONS]&(1<client->ps.weapons[WP_SCEPTER] && gent->client->ps.dualSabers && saberAnimLevel == SS_DUAL && gent->weaponModel[1] ) @@ -6079,6 +6079,15 @@ void PM_TorsoAnimation( void ) //PM_SetAnim(pm,SETANIM_LEGS,BOTH_ATTACK2,SETANIM_FLAG_NORMAL); break; + case WP_E5_CARBINE: + case WP_DC15S_CARBINE: + case WP_SONIC_BLASTER: + case WP_DC15A_RIFLE: + case WP_Z6_ROTARY: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + //PM_SetAnim(pm,SETANIM_LEGS,BOTH_ATTACK2,SETANIM_FLAG_NORMAL); + break; + case WP_BLASTER: PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); //PM_SetAnim(pm,SETANIM_LEGS,BOTH_ATTACK2,SETANIM_FLAG_NORMAL); @@ -6377,6 +6386,22 @@ void PM_TorsoAnimation( void ) PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND3, SETANIM_FLAG_NORMAL); } break; + + case WP_E5_CARBINE: + case WP_DC15S_CARBINE: + case WP_SONIC_BLASTER: + case WP_DC15A_RIFLE: + case WP_Z6_ROTARY: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + case WP_NOGHRI_STICK: if ( weaponBusy ) diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 6e068783a8..94859f0322 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -8898,7 +8898,7 @@ static void PM_BeginWeaponChange( int weapon ) { return; } - if ( !( pm->ps->stats[STAT_WEAPONS] & ( 1 << weapon ) ) ) { + if ( !( pm->ps->weapons[weapon] ) ) { return; } @@ -8982,7 +8982,7 @@ static void PM_FinishWeaponChange( void ) { weapon = WP_NONE; } - if ( !( pm->ps->stats[STAT_WEAPONS] & ( 1 << weapon ) ) ) { + if ( !( pm->ps->weapons[weapon] ) ) { weapon = WP_NONE; } @@ -9002,7 +9002,7 @@ static void PM_FinishWeaponChange( void ) { dropped->s.radius = 10; dropped->delay = level.time + 1000; pm->ps->ammo[AMMO_EMPLACED] = 0; - pm->ps->stats[STAT_WEAPONS] &= ~(1 << WP_EMPLACED_GUN); + pm->ps->weapons[WP_EMPLACED_GUN] = 0; } //int oldWeap = pm->ps->weapon; @@ -12086,7 +12086,7 @@ void PM_WeaponLightsaber(void) } } - if ( pm->ps->stats[STAT_WEAPONS]&(1<ps->weapons[WP_SCEPTER] && !pm->ps->dualSabers && pm->gent && pm->gent->weaponModel[1] ) @@ -13941,6 +13941,14 @@ static void PM_Weapon( void ) } break; + case WP_E5_CARBINE: + case WP_DC15S_CARBINE: + case WP_SONIC_BLASTER: + case WP_DC15A_RIFLE: + case WP_Z6_ROTARY: + PM_SetAnim( pm, SETANIM_TORSO, BOTH_ATTACK3, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART); + break; + case WP_BLASTER: PM_SetAnim( pm, SETANIM_TORSO, BOTH_ATTACK3, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART); break; diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index 5eb6275023..87ba4e14be 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -1634,7 +1634,11 @@ void G_MatchPlayerWeapon( gentity_t *ent ) if ( newWeap != WP_NONE && ent->client->ps.weapon != newWeap ) { G_RemoveWeaponModels( ent ); - ent->client->ps.stats[STAT_WEAPONS] = ( 1 << newWeap ); + for ( int i = 0; i < MAX_WEAPONS; i++ ) + { + ent->client->ps.weapons[i] = 0; + } + ent->client->ps.weapons[newWeap] = 1; ent->client->ps.ammo[weaponData[newWeap].ammoIndex] = 999; ChangeWeapon( ent, newWeap ); ent->client->ps.weapon = newWeap; diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index 3400f88880..bb385bc01c 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -654,29 +654,21 @@ Player_CacheFromPrevLevel void Player_CacheFromPrevLevel(void) { char s[MAX_STRING_CHARS]; + const char *var; int i; gi.Cvar_VariableStringBuffer( sCVARNAME_PLAYERSAVE, s, sizeof(s) ); if (s[0]) // actually this would be safe anyway because of the way sscanf() works, but this is clearer { - int iDummy, bits, ibits; + int iDummy, ibits; - sscanf( s, "%i %i %i %i", + sscanf( s, "%i %i %i", &iDummy,//client->ps.stats[STAT_HEALTH], &iDummy,//client->ps.stats[STAT_ARMOR], - &bits, //client->ps.stats[STAT_WEAPONS] &ibits //client->ps.stats[STAT_ITEMS] ); - for ( i = 1 ; i < WP_NUM_WEAPONS ; i++ ) - { - if ( bits & ( 1 << i ) ) - { - RegisterItem( FindItemForWeapon( (weapon_t)i ) ); - } - } - extern gitem_t *FindItemForInventory( int inv ); for ( i = 1 ; i < 16 ; i++ ) @@ -687,6 +679,28 @@ extern gitem_t *FindItemForInventory( int inv ); } } } + + gi.Cvar_VariableStringBuffer( "playerweaps", s, sizeof(s) ); + i=0; + var = strtok( s, " " ); + while( var != NULL ) + { + /* While there are tokens in "s" */ + if ( atoi(var) > 0 ) + { + if (i == WP_NONE) //don't register! + { + i++; + } + else + { + RegisterItem( FindItemForWeapon( (weapon_t)i++ ) ); + } + } + /* Get next token: */ + var = strtok( NULL, " " ); + } + assert (i==WP_NUM_WEAPONS); } /* @@ -719,10 +733,9 @@ static void Player_RestoreFromPrevLevel(gentity_t *ent, SavedGameJustLoaded_e eS unsigned int saber1BladeColor[8]; unsigned int saber2BladeColor[8]; - sscanf( s, "%i %i %i %i %i %i %i %f %f %f %i %i %i %i %i %s %i %i %i %i %i %i %i %i %u %u %u %u %u %u %u %u %s %i %i %i %i %i %i %i %i %u %u %u %u %u %u %u %u %i %i %i %i", + sscanf( s, "%i %i %i %i %i %i %f %f %f %i %i %i %i %i %s %i %i %i %i %i %i %i %i %u %u %u %u %u %u %u %u %s %i %i %i %i %i %i %i %i %u %u %u %u %u %u %u %u %i %i %i %i", &client->ps.stats[STAT_HEALTH], &client->ps.stats[STAT_ARMOR], - &client->ps.stats[STAT_WEAPONS], &client->ps.stats[STAT_ITEMS], &client->ps.weapon, &client->ps.weaponstate, @@ -819,6 +832,19 @@ static void Player_RestoreFromPrevLevel(gentity_t *ent, SavedGameJustLoaded_e eS // // SetClientViewAngle( ent, ent->client->ps.viewangles); + //weapons + gi.Cvar_VariableStringBuffer( "playerweaps", s, sizeof(s) ); + i=0; + var = strtok( s, " " ); + while( var != NULL ) + { + /* While there are tokens in "s" */ + client->ps.weapons[i++] = atoi(var); + /* Get next token: */ + var = strtok( NULL, " " ); + } + assert (i==WP_NUM_WEAPONS); + //ammo gi.Cvar_VariableStringBuffer( "playerammo", s, sizeof(s) ); i=0; @@ -2613,19 +2639,23 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded // give default weapons //these are precached in g_items, ClearRegisteredItems() - client->ps.stats[STAT_WEAPONS] = ( 1 << WP_NONE ); + for ( int i = 0; i < MAX_WEAPONS; i++ ) + { + client->ps.weapons[i] = 0; + } + client->ps.weapons[WP_NONE] = 1; //client->ps.inventory[INV_ELECTROBINOCULARS] = 1; //ent->client->ps.inventory[INV_BACTA_CANISTER] = 1; // give EITHER the saber or the stun baton..never both if ( spawnPoint->spawnflags & 32 ) // STUN_BATON { - client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_STUN_BATON ); + client->ps.weapons[WP_STUN_BATON] = 1; client->ps.weapon = WP_STUN_BATON; } else { // give the saber because most test maps will not have the STUN BATON flag set - client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_SABER ); //this is precached in SP_info_player_deathmatch + client->ps.weapons[WP_SABER] = 1; //this is precached in SP_info_player_deathmatch client->ps.weapon = WP_SABER; } // force the base weapon up @@ -2633,7 +2663,7 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded for ( i = FIRST_WEAPON; i < WP_NUM_WEAPONS; i++ ) // don't give ammo for explosives { - if ( playerUsableWeapons[i] && (client->ps.stats[STAT_WEAPONS]&(1<ps.weapons[i]) ) {//if starting with this weapon, gimme max ammo for it client->ps.ammo[weaponData[i].ammoIndex] = ammoData[weaponData[i].ammoIndex].max; } @@ -2761,14 +2791,18 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded if ( spawnPoint->spawnflags & 64 ) //NOWEAPON {//player starts with absolutely no weapons - ent->client->ps.stats[STAT_WEAPONS] = ( 1 << WP_NONE ); + for ( int i = 0; i < MAX_WEAPONS; i++ ) + { + ent->client->ps.weapons[i] = 0; + } + ent->client->ps.weapons[WP_NONE] = 1; ent->client->ps.ammo[weaponData[WP_NONE].ammoIndex] = 32000; ent->client->ps.weapon = WP_NONE; ent->client->ps.weaponstate = WEAPON_READY; ent->client->ps.dualSabers = qfalse; } - if ( ent->client->ps.stats[STAT_WEAPONS] & ( 1 << WP_SABER ) ) + if ( ent->client->ps.weapons[WP_SABER] ) {//set up so has lightsaber WP_SaberInitBladeData( ent ); if ( (ent->weaponModel[0] <= 0 || (ent->weaponModel[1]<=0&&ent->client->ps.dualSabers)) //one or both of the saber models is not initialized @@ -2824,7 +2858,7 @@ qboolean ClientSpawn(gentity_t *ent, SavedGameJustLoaded_e eSavedGameJustLoaded G_CheckPlayerDarkSide(); } - if ( (ent->client->ps.stats[STAT_WEAPONS]&(1<client->ps.weapons[WP_SABER]) && !ent->client->ps.saberStylesKnown ) {//um, if you have a saber, you need at least 1 style to use it with... ent->client->ps.saberStylesKnown |= (1<client->ps.stats[STAT_WEAPONS] = (1 << (WP_MELEE)) - ( 1 << WP_NONE ); + for ( int i = 0; i < WP_MELEE; i++ ) + { + ent->client->ps.weapons[i] = 1; + } if ( !give_all ) return; } if ( !give_all && !Q_stricmp( name, "weaponnum" ) ) { - ent->client->ps.stats[STAT_WEAPONS] |= (1 << atoi( args )); + ent->client->ps.weapons[ atoi(args) ] = 1; return; } if ( !give_all && !Q_stricmp( name, "eweaps" ) ) //for developing, gives you all the weapons, including enemy { - ent->client->ps.stats[STAT_WEAPONS] = (unsigned)(1 << WP_NUM_WEAPONS) - ( 1 << WP_NONE ); // NOTE: this wasn't giving the last weapon in the list + for ( int i = 0; i < WP_NUM_WEAPONS; i++ ) + { + ent->client->ps.weapons[i] = 1; + } return; } @@ -1374,7 +1380,7 @@ void Cmd_SaberDrop_f( gentity_t *ent, int saberNum ) && ent->weaponModel[1] <= 0 ) {//no sabers left! //remove saber from inventory - ent->client->ps.stats[STAT_WEAPONS] &= ~(1<client->ps.weapons[WP_SABER] = 0; //change weapons if ( ent->s.number < MAX_CLIENTS ) {//player diff --git a/code/game/g_combat.cpp b/code/game/g_combat.cpp index 6a2b92a30d..142218e1a9 100644 --- a/code/game/g_combat.cpp +++ b/code/game/g_combat.cpp @@ -263,6 +263,13 @@ gentity_t *TossClientItems( gentity_t *self ) case WP_NOGHRI_STICK: dropped->count = 15; break; + case WP_E5_CARBINE: + case WP_DC15S_CARBINE: + case WP_SONIC_BLASTER: + case WP_DC15A_RIFLE: + case WP_Z6_ROTARY: + dropped->count = 15; + break; default: dropped->count = 0; break; @@ -3862,7 +3869,7 @@ extern void RunEmplacedWeapon( gentity_t *ent, usercmd_t **ucmd ); } } } - if ( (self->client->ps.stats[STAT_WEAPONS]&(1<client->ps.weapons[WP_SCEPTER]) ) { G_StopEffect( G_EffectIndex( "scepter/beam_warmup.efx" ), self->weaponModel[1], self->genericBolt1, self->s.number ); G_StopEffect( G_EffectIndex( "scepter/beam.efx" ), self->weaponModel[1], self->genericBolt1, self->s.number ); @@ -4746,7 +4753,7 @@ void PlayerPain( gentity_t *self, gentity_t *inflictor, gentity_t *other, const if ( blasterTest && chargerTest ) {//lost both side guns //take away that weapon - self->client->ps.stats[STAT_WEAPONS] &= ~( 1 << WP_ATST_SIDE ); + self->client->ps.weapons[WP_ATST_SIDE] = 0; //switch to primary guns if ( self->client->ps.weapon == WP_ATST_SIDE ) { diff --git a/code/game/g_emplaced.cpp b/code/game/g_emplaced.cpp index c91d4a8936..ecf4e666fc 100644 --- a/code/game/g_emplaced.cpp +++ b/code/game/g_emplaced.cpp @@ -358,7 +358,7 @@ void eweb_use( gentity_t *self, gentity_t *other, gentity_t *activator ) // swap the users weapon with the emplaced gun and add the ammo the gun has to the player activator->client->ps.weapon = self->s.weapon; Add_Ammo( activator, WP_EMPLACED_GUN, self->count ); - activator->client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_EMPLACED_GUN ); + activator->client->ps.weapons[WP_EMPLACED_GUN] = 1; // Allow us to point from one to the other activator->owner = self; // kind of dumb, but when we are locked to the weapon, we are owned by it. @@ -581,7 +581,7 @@ void emplaced_gun_use( gentity_t *self, gentity_t *other, gentity_t *activator ) // swap the users weapon with the emplaced gun and add the ammo the gun has to the player activator->client->ps.weapon = self->s.weapon; Add_Ammo( activator, WP_EMPLACED_GUN, self->count ); - activator->client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_EMPLACED_GUN ); + activator->client->ps.weapons[WP_EMPLACED_GUN] = 1; // Allow us to point from one to the other activator->owner = self; // kind of dumb, but when we are locked to the weapon, we are owned by it. @@ -996,7 +996,7 @@ void ExitEmplacedWeapon( gentity_t *ent, qboolean detach = qfalse ) } // Remove the emplaced gun from our inventory - ent->client->ps.stats[STAT_WEAPONS] &= ~( 1 << WP_EMPLACED_GUN ); + ent->client->ps.weapons[WP_EMPLACED_GUN] = 0; extern void ChangeWeapon( gentity_t *ent, int newWeapon ); extern void CG_ChangeWeapon( int num ); diff --git a/code/game/g_itemLoad.cpp b/code/game/g_itemLoad.cpp index d0cca821d5..bd3c58e8ae 100644 --- a/code/game/g_itemLoad.cpp +++ b/code/game/g_itemLoad.cpp @@ -157,6 +157,17 @@ static void IT_Name(const char **holdBuf) itemNum = ITM_SCEPTER_PICKUP; else if (!Q_stricmp(tokenStr,"ITM_NOGHRI_STICK_PICKUP")) itemNum = ITM_NOGHRI_STICK_PICKUP; + else if (!Q_stricmp(tokenStr,"ITM_SONIC_BLASTER_PICKUP")) + itemNum = ITM_SONIC_BLASTER_PICKUP; + else if (!Q_stricmp(tokenStr,"ITM_E5_PICKUP")) + itemNum = ITM_E5_PICKUP; + else if (!Q_stricmp(tokenStr,"ITM_DC15S_PICKUP")) + itemNum = ITM_DC15S_PICKUP; + else if (!Q_stricmp(tokenStr,"ITM_DC15A_PICKUP")) + itemNum = ITM_DC15A_PICKUP; + else if (!Q_stricmp(tokenStr,"ITM_Z6_PICKUP")) + itemNum = ITM_Z6_PICKUP; + //ammo else if (!Q_stricmp(tokenStr,"ITM_AMMO_FORCE_PICKUP")) itemNum = ITM_AMMO_FORCE_PICKUP; @@ -374,6 +385,16 @@ static void IT_Tag(const char **holdBuf) tag = WP_SCEPTER; else if (!Q_stricmp(tokenStr,"WP_NOGHRI_STICK")) tag = WP_NOGHRI_STICK; + else if (!Q_stricmp(tokenStr,"WP_SONIC_BLASTER")) + tag = WP_SONIC_BLASTER; + else if (!Q_stricmp(tokenStr,"WP_E5_CARBINE")) + tag = WP_E5_CARBINE; + else if (!Q_stricmp(tokenStr,"WP_DC15S_CARBINE")) + tag = WP_DC15S_CARBINE; + else if (!Q_stricmp(tokenStr,"WP_DC15A_RIFLE")) + tag = WP_DC15A_RIFLE; + else if (!Q_stricmp(tokenStr,"WP_Z6_ROTARY")) + tag = WP_Z6_ROTARY; else if (!Q_stricmp(tokenStr,"AMMO_FORCE")) tag = AMMO_FORCE; else if (!Q_stricmp(tokenStr,"AMMO_BLASTER")) diff --git a/code/game/g_items.cpp b/code/game/g_items.cpp index 33e08b9591..4f0022a89c 100644 --- a/code/game/g_items.cpp +++ b/code/game/g_items.cpp @@ -146,13 +146,13 @@ int Add_Ammo2 (gentity_t *ent, int ammoType, int count) switch( ammoType ) { case AMMO_THERMAL: - ent->client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_THERMAL ); + ent->client->ps.weapons[WP_THERMAL] = 1; break; case AMMO_DETPACK: - ent->client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_DET_PACK ); + ent->client->ps.weapons[WP_DET_PACK] = 1; break; case AMMO_TRIPMINE: - ent->client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_TRIP_MINE ); + ent->client->ps.weapons[WP_TRIP_MINE] = 1; break; } @@ -482,11 +482,11 @@ int Pickup_Weapon (gentity_t *ent, gentity_t *other) } // add the weapon - if ( other->client->ps.stats[STAT_WEAPONS] & ( 1 << ent->item->giTag ) ) + if ( other->client->ps.weapons[ent->item->giTag] ) { hadWeapon = qtrue; } - other->client->ps.stats[STAT_WEAPONS] |= ( 1 << ent->item->giTag ); + other->client->ps.weapons[ent->item->giTag] = 1; if ( ent->item->giTag == WP_SABER && (!hadWeapon || ent->NPC_type != NULL) ) {//didn't have a saber or it is specifying a certain kind of saber to use @@ -859,7 +859,7 @@ void Touch_Item (gentity_t *ent, gentity_t *other, trace_t *trace) { TIMER_Set( other, "attackDelay", 600 ); respawn = 0; } - if ( other->client->ps.stats[STAT_WEAPONS] & ( 1 << ent->item->giTag ) ) + if ( other->client->ps.weapons[ent->item->giTag] ) { bHadWeapon = qtrue; } diff --git a/code/game/g_items.h b/code/game/g_items.h index 259417f89a..742b5f65d9 100644 --- a/code/game/g_items.h +++ b/code/game/g_items.h @@ -61,6 +61,12 @@ ITM_TUSKEN_STAFF_PICKUP, ITM_SCEPTER_PICKUP, ITM_NOGHRI_STICK_PICKUP, +ITM_SONIC_BLASTER_PICKUP, +ITM_E5_PICKUP, +ITM_DC15S_PICKUP, +ITM_DC15A_PICKUP, +ITM_Z6_PICKUP, + ITM_AMMO_FORCE_PICKUP, ITM_AMMO_BLASTER_PICKUP, ITM_AMMO_POWERCELL_PICKUP, diff --git a/code/game/g_vehicles.cpp b/code/game/g_vehicles.cpp index 2db37c0065..9351770451 100644 --- a/code/game/g_vehicles.cpp +++ b/code/game/g_vehicles.cpp @@ -418,10 +418,11 @@ void G_DriveATST( gentity_t *pEnt, gentity_t *atst ) //G_SetG2PlayerModel( pEnt, pEnt->NPC_type, NULL, NULL, NULL ); //FIXME: reset/4 their weapon - pEnt->client->ps.stats[STAT_WEAPONS] &= ~(( 1 << WP_ATST_MAIN )|( 1 << WP_ATST_SIDE )); + pEnt->client->ps.weapons[WP_ATST_MAIN] = 0; + pEnt->client->ps.weapons[WP_ATST_SIDE] = 0; pEnt->client->ps.ammo[weaponData[WP_ATST_MAIN].ammoIndex] = 0; pEnt->client->ps.ammo[weaponData[WP_ATST_SIDE].ammoIndex] = 0; - if ( pEnt->client->ps.stats[STAT_WEAPONS] & (1<client->ps.weapons[WP_BLASTER] ) { CG_ChangeWeapon( WP_BLASTER ); //camera @@ -476,7 +477,8 @@ void G_DriveATST( gentity_t *pEnt, gentity_t *atst ) item = FindItemForWeapon( WP_ATST_SIDE ); //precache the weapon CG_RegisterItemSounds( (item-bg_itemlist) ); CG_RegisterItemVisuals( (item-bg_itemlist) ); - pEnt->client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_ATST_MAIN )|( 1 << WP_ATST_SIDE ); + pEnt->client->ps.weapons[WP_ATST_MAIN] = 1; + pEnt->client->ps.weapons[WP_ATST_SIDE] = 1; pEnt->client->ps.ammo[weaponData[WP_ATST_MAIN].ammoIndex] = ammoData[weaponData[WP_ATST_MAIN].ammoIndex].max; pEnt->client->ps.ammo[weaponData[WP_ATST_SIDE].ammoIndex] = ammoData[weaponData[WP_ATST_SIDE].ammoIndex].max; CG_ChangeWeapon( WP_ATST_MAIN ); @@ -806,7 +808,7 @@ bool Board( Vehicle_t *pVeh, bgEntity_t *pEnt ) #ifndef _JK2MP //rwwFIXMEFIXMEFIXME if (ent->s.numberclient->ps.stats[ STAT_WEAPONS ] |= (1<client->ps.weapons[WP_NONE] = 1; } if ( (ent->client->ps.weapon != WP_SABER && ent->client->ps.weapon != WP_BLASTER) || !(pVeh->m_pVehicleInfo->type == VH_ANIMAL || pVeh->m_pVehicleInfo->type == VH_SPEEDER)) @@ -1632,7 +1634,7 @@ bool Initialize( Vehicle_t *pVeh ) //initialize to blaster, just since it's a basic weapon and there's no lightsaber crap...? parent->client->ps.weapon = WP_BLASTER; parent->client->ps.weaponstate = WEAPON_READY; - parent->client->ps.stats[STAT_WEAPONS] |= (1<client->ps.weapons[WP_BLASTER] = 1; //Initialize to landed (wings closed, gears down) animation { diff --git a/code/game/g_weapon.cpp b/code/game/g_weapon.cpp index 5a86251c6f..bcd5983fba 100644 --- a/code/game/g_weapon.cpp +++ b/code/game/g_weapon.cpp @@ -76,6 +76,12 @@ float weaponSpeed[WP_NUM_WEAPONS][2] = { 0,0 },//WP_TUSKEN_STAFF, { 0,0 },//WP_SCEPTER, { 0,0 },//WP_NOGHRI_STICK, + { 0,0 },//WP_SONIC_BLASTER, + { 0,0 },//WP_E5_CARBINE, + { 0,0 },//WP_DC15S_CARBINE, + { 0,0 },//WP_DC15A_RIFLE, + { 0,0 },//WP_Z6_ROTARY, + }; float WP_SpeedOfMissileForWeapon( int wp, qboolean alt_fire ) @@ -1537,6 +1543,14 @@ void FireWeapon( gentity_t *ent, qboolean alt_fire ) WP_Melee( ent ); } break; + + case WP_SONIC_BLASTER: + case WP_Z6_ROTARY: + case WP_E5_CARBINE: + case WP_DC15A_RIFLE: + case WP_DC15S_CARBINE: + WP_FireBlaster( ent, alt_fire ); + break; case WP_TUSKEN_STAFF: default: diff --git a/code/game/g_weaponLoad.cpp b/code/game/g_weaponLoad.cpp index 4ef7ae1c22..d04ab4060b 100644 --- a/code/game/g_weaponLoad.cpp +++ b/code/game/g_weaponLoad.cpp @@ -154,6 +154,13 @@ qboolean playerUsableWeapons[WP_NUM_WEAPONS] = qfalse,//WP_SCEPTER, qtrue,//WP_NOGHRI_STICK, + qtrue,//WP_SONIC_BLASTER, + + qtrue,//WP_E5_CARBINE, + qtrue,//WP_DC15S_CARBINE, + qtrue,//WP_DC15A_RIFLE, + qtrue,//WP_Z6_ROTARY, + //# #eol //WP_NUM_WEAPONS }; @@ -263,6 +270,12 @@ const int defaultDamage[] = { 0, // WP_TUSKEN_STAFF 0, // WP_SCEPTER 0, // WP_NOGHRI_STICK + 0, // WP_SONIC_BLASTER, + + 0, // WP_E5_CARBINE, + 0, // WP_DC15S_CARBINE, + 0, // WP_DC15A_RIFLE, + 0, // WP_Z6_ROTARY, }; const int defaultAltDamage[] = { @@ -300,6 +313,12 @@ const int defaultAltDamage[] = { 0, // WP_TUSKEN_STAFF 0, // WP_SCEPTER 0, // WP_NOGHRI_STICK + 0, // WP_SONIC_BLASTER, + + 0, // WP_E5_CARBINE, + 0, // WP_DC15S_CARBINE, + 0, // WP_DC15A_RIFLE, + 0, // WP_Z6_ROTARY, }; const int defaultSplashDamage[] = { @@ -337,6 +356,12 @@ const int defaultSplashDamage[] = { 0, // WP_TUSKEN_STAFF 0, // WP_SCEPTER 0, // WP_NOGHRI_STICK + 0, // WP_SONIC_BLASTER, + + 0, // WP_E5_CARBINE, + 0, // WP_DC15S_CARBINE, + 0, // WP_DC15A_RIFLE, + 0, // WP_Z6_ROTARY, }; const float defaultSplashRadius[] = { @@ -374,6 +399,12 @@ const float defaultSplashRadius[] = { 0.0f, // WP_TUSKEN_STAFF 0.0f, // WP_SCEPTER 0.0f, // WP_NOGHRI_STICK + 0.0f, // WP_SONIC_BLASTER, + + 0.0f, // WP_E5_CARBINE, + 0.0f, // WP_DC15S_CARBINE, + 0.0f, // WP_DC15A_RIFLE, + 0.0f, // WP_Z6_ROTARY, }; const int defaultAltSplashDamage[] = { @@ -411,6 +442,12 @@ const int defaultAltSplashDamage[] = { 0, // WP_TUSKEN_STAFF 0, // WP_SCEPTER 0, // WP_NOGHRI_STICK + 0, // WP_SONIC_BLASTER, + + 0, // WP_E5_CARBINE, + 0, // WP_DC15S_CARBINE, + 0, // WP_DC15A_RIFLE, + 0, // WP_Z6_ROTARY, }; const float defaultAltSplashRadius[] = { @@ -448,6 +485,12 @@ const float defaultAltSplashRadius[] = { 0.0f, // WP_TUSKEN_STAFF 0.0f, // WP_SCEPTER 0.0f, // WP_NOGHRI_STICK + 0.0f, // WP_SONIC_BLASTER, + + 0.0f, // WP_E5_CARBINE, + 0.0f, // WP_DC15S_CARBINE, + 0.0f, // WP_DC15A_RIFLE, + 0.0f, // WP_Z6_ROTARY, }; wpnParms_t WpnParms[] = @@ -585,6 +628,16 @@ void WPN_WeaponType( const char **holdBuf) weaponNum = WP_SCEPTER; else if (!Q_stricmp(tokenStr,"WP_NOGHRI_STICK")) weaponNum = WP_NOGHRI_STICK; + else if (!Q_stricmp(tokenStr,"WP_SONIC_BLASTER")) + weaponNum = WP_SONIC_BLASTER; + else if (!Q_stricmp(tokenStr,"WP_E5_CARBINE")) + weaponNum = WP_E5_CARBINE; + else if (!Q_stricmp(tokenStr,"WP_DC15S_CARBINE")) + weaponNum = WP_DC15S_CARBINE; + else if (!Q_stricmp(tokenStr,"WP_DC15A_RIFLE")) + weaponNum = WP_DC15A_RIFLE; + else if (!Q_stricmp(tokenStr,"WP_Z6_ROTARY")) + weaponNum = WP_Z6_ROTARY; else { weaponNum = 0; diff --git a/code/game/weapons.h b/code/game/weapons.h index 47aea919f5..466412de7c 100644 --- a/code/game/weapons.h +++ b/code/game/weapons.h @@ -78,6 +78,14 @@ typedef enum //# weapon_e WP_TUSKEN_STAFF, WP_SCEPTER, WP_NOGHRI_STICK, + + WP_SONIC_BLASTER, + + WP_E5_CARBINE, + WP_DC15S_CARBINE, + WP_DC15A_RIFLE, + WP_Z6_ROTARY, + //# #eol WP_NUM_WEAPONS diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index c8e2ec2ad5..a7b3eef93f 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -593,7 +593,7 @@ void WP_SaberAddG2SaberModels( gentity_t *ent, int specificSaberNum ) void WP_SaberAddHolsteredG2SaberModels( gentity_t *ent, int specificSaberNum ) { int saberNum = 0, maxSaber = 1; - if (!(ent && ent->client && (ent->client->ps.stats[STAT_WEAPONS] & ( 1 << WP_SABER )))) + if (!(ent && ent->client && (ent->client->ps.weapons[WP_SABER]))) { return; } @@ -7502,7 +7502,7 @@ void WP_SaberFireGun( gentity_t *self, usercmd_t *ucmd, int whichGun ) return; } - if ( !(self->client->ps.stats[STAT_WEAPONS] & (1<client->ps.weapons[whichGun]) ) { return; } @@ -8571,7 +8571,7 @@ void WP_DropWeapon( gentity_t *dropper, vec3_t velocity ) } } //FIXME: does this work on the player? - dropper->client->ps.stats[STAT_WEAPONS] |= ( 1 << replaceWeap ); + dropper->client->ps.weapons[replaceWeap] = 1; if ( !dropper->s.number ) { if ( oldWeap == WP_THERMAL ) @@ -8580,13 +8580,13 @@ void WP_DropWeapon( gentity_t *dropper, vec3_t velocity ) } else { - dropper->client->ps.stats[STAT_WEAPONS] &= ~( 1 << oldWeap ); + dropper->client->ps.weapons[oldWeap] = 0; } CG_ChangeWeapon( replaceWeap ); } else { - dropper->client->ps.stats[STAT_WEAPONS] &= ~( 1 << oldWeap ); + dropper->client->ps.weapons[oldWeap] = 0; } ChangeWeapon( dropper, replaceWeap ); dropper->s.weapon = replaceWeap; diff --git a/code/qcommon/msg.cpp b/code/qcommon/msg.cpp index 8740abe380..3d55fcb95d 100644 --- a/code/qcommon/msg.cpp +++ b/code/qcommon/msg.cpp @@ -990,7 +990,7 @@ static const netField_t playerStateFields[] = { PSF(externalEvent), 8 }, { PSF(externalEventParm), 8 }, { PSF(clientNum), 32 }, -{ PSF(weapon), 5 }, +{ PSF(weapon), 6 }, { PSF(weaponstate), 4 }, { PSF(batteryCharge), 16 }, { PSF(viewangles[0]), 0 }, @@ -1036,11 +1036,12 @@ MSG_WriteDeltaPlayerstate ============= */ void MSG_WriteDeltaPlayerstate( msg_t *msg, playerState_t *from, playerState_t *to ) { - int i; + int i, j; playerState_t dummy; int statsbits; int persistantbits; int ammobits; + int weaponbits[MAX_WEAPONBITS]; int powerupbits; int numFields; int c; @@ -1122,6 +1123,26 @@ void MSG_WriteDeltaPlayerstate( msg_t *msg, playerState_t *from, playerState_t * } else { MSG_WriteBits( msg, 0, 1 ); // no change } + + for ( j = 0; j < MAX_WEAPONBITS; j++ ) + { + weaponbits[j] = 0; + for ( i = 32*j; i < MAX_WEAPONS; i++ ) { + if (to->weapons[i] != from->weapons[i]) { + weaponbits[j] |= 1<<(i - 32*j); + } + } + if ( weaponbits[j] ) + { + MSG_WriteBits( msg, 1, 1 ); // changed + MSG_WriteLong( msg, weaponbits[j] ); + for (i = 32*j; i < MAX_WEAPONS; i++) + if (weaponbits[j] & (1<<(i - 32*j)) ) + MSG_WriteSShort (msg, to->weapons[i]); + } else { + MSG_WriteBits( msg, 0, 1 ); // no change + } + } powerupbits = 0; for (i=0 ; iweapons[i] = MSG_ReadSShort(msg); + } + } + } + } // parse powerups if ( MSG_ReadBits( msg, 1 ) ) { diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index a105fae3db..58a5e9d562 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -800,8 +800,9 @@ typedef enum #define MAX_PERSISTANT 16 #define MAX_POWERUPS 16 -#define MAX_WEAPONS 32 -#define MAX_AMMO 10 +#define MAX_WEAPONS 64 +#define MAX_WEAPONBITS 1 + (MAX_WEAPONS - 1)/32 +#define MAX_AMMO 10 #define MAX_INVENTORY 15 // See INV_MAX #define MAX_SECURITY_KEYS 5 #define MAX_SECURITY_KEY_MESSSAGE 24 @@ -1667,6 +1668,7 @@ class PlayerStateBase int ammo[MAX_AMMO]; int inventory[MAX_INVENTORY]; // Count of each inventory item. char security_key_message[MAX_SECURITY_KEYS][MAX_SECURITY_KEY_MESSSAGE]; // Security key types + char weapons[MAX_WEAPONS]; vec3_t serverViewOrg; @@ -1986,6 +1988,7 @@ class PlayerStateBase saved_game.write(ammo); saved_game.write(inventory); saved_game.write(security_key_message); + saved_game.write(weapons); saved_game.write(serverViewOrg); saved_game.write(saberInFlight); @@ -2162,6 +2165,7 @@ class PlayerStateBase saved_game.read(ammo); saved_game.read(inventory); saved_game.read(security_key_message); + saved_game.write(weapons); saved_game.read(serverViewOrg); saved_game.read(saberInFlight); diff --git a/code/server/sv_ccmds.cpp b/code/server/sv_ccmds.cpp index 67b079ae02..e3b0306e66 100644 --- a/code/server/sv_ccmds.cpp +++ b/code/server/sv_ccmds.cpp @@ -131,10 +131,9 @@ void SV_Player_EndOfLevelSave(void) ); #else // |general info |-force powers |-saber 1 |-saber 2 |-general saber - s = va("%i %i %i %i %i %i %i %f %f %f %i %i %i %i %i %s %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %s %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i", + s = va("%i %i %i %i %i %i %f %f %f %i %i %i %i %i %s %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %s %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i", pState->stats[STAT_HEALTH], pState->stats[STAT_ARMOR], - pState->stats[STAT_WEAPONS], pState->stats[STAT_ITEMS], pState->weapon, pState->weaponstate, @@ -193,6 +192,14 @@ void SV_Player_EndOfLevelSave(void) #endif Cvar_Set( sCVARNAME_PLAYERSAVE, s ); +#ifndef JK2_MODE + s2 = ""; + for (i=0;i< WP_NUM_WEAPONS; i++) + { + s2 = va("%s %i",s2, pState->weapons[i]); + } + Cvar_Set( "playerweaps", s2 ); +#endif //ammo s2 = ""; for (i=0;i< AMMO_MAX; i++) @@ -259,6 +266,7 @@ extern void SCR_UnprecacheScreenshot(); static void SV_Map_f( void ) { Cvar_Set( sCVARNAME_PLAYERSAVE, ""); + Cvar_Set( "playerweaps", ""); Cvar_Set( "spawntarget", "" ); Cvar_Set("tier_storyinfo", "0"); Cvar_Set("tiers_complete", ""); diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 0afa92d7a3..adab4f0002 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -6621,7 +6621,10 @@ static void UI_ClearWeapons ( void ) playerState_t* pState = cl->gentity->client; // Clear out any weapons for the player - pState->stats[ STAT_WEAPONS ] = 0; + for ( int i = 0; i < MAX_WEAPONS; i++ ) + { + pState->weapons[i] = 0; + } pState->weapon = WP_NONE; @@ -6645,7 +6648,7 @@ static void UI_GiveWeapon ( const int weaponIndex ) if (weaponIndexstats[ STAT_WEAPONS ] |= ( 1 << weaponIndex ); + pState->weapons[weaponIndex] = 1; } } } @@ -6807,7 +6810,7 @@ static void UI_AddWeaponSelection ( const int weaponIndex, const int ammoIndex, if ((weaponIndex>0) && (weaponIndexstats[ STAT_WEAPONS ] |= ( 1 << weaponIndex ); + pState->weapons[weaponIndex] = 1; } // Give them ammo too @@ -6912,7 +6915,7 @@ static void UI_RemoveWeaponSelection ( const int weaponSelectionIndex ) if ((weaponIndex>0) && (weaponIndexstats[ STAT_WEAPONS ] &= ~( 1 << weaponIndex ); + pState->weapons[weaponIndex] = 0; } // Remove ammo too @@ -7098,7 +7101,7 @@ static void UI_AddThrowWeaponSelection ( const int weaponIndex, const int ammoIn if ((weaponIndex>0) && (weaponIndexstats[ STAT_WEAPONS ] |= ( 1 << weaponIndex ); + pState->weapons[weaponIndex] = 1; } // Give them ammo too @@ -7177,7 +7180,7 @@ static void UI_RemoveThrowWeaponSelection ( void ) if ((uiInfo.selectedThrowWeapon>0) && (uiInfo.selectedThrowWeaponstats[ STAT_WEAPONS ] &= ~( 1 << uiInfo.selectedThrowWeapon ); + pState->weapons[uiInfo.selectedThrowWeapon] = 0; } // Remove ammo too From 97746c73734486b2689d5be01b708ad595b7bd14 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Wed, 29 Jul 2015 16:26:23 +0100 Subject: [PATCH 410/445] Eweb/weapons: Eweb and gun melee are third person --- code/cgame/cg_view.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/code/cgame/cg_view.cpp b/code/cgame/cg_view.cpp index a7b9dd2b15..243e758ecd 100644 --- a/code/cgame/cg_view.cpp +++ b/code/cgame/cg_view.cpp @@ -2101,12 +2101,13 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView ) { cg.zoomMode = 0; } // decide on third person view - cg.renderingThirdPerson = (qboolean)( - cg_thirdPerson.integer - || (cg.snap->ps.stats[STAT_HEALTH] <= 0) - || (cg.snap->ps.eFlags&EF_HELD_BY_SAND_CREATURE) - || ((g_entities[0].client&&g_entities[0].client->NPC_class==CLASS_ATST) - || ((cg.snap->ps.weapon == WP_SABER || cg.snap->ps.weapon == WP_MELEE) && !cg_fpls.integer) )); + cg.renderingThirdPerson = (qboolean)(cg_thirdPerson.integer + || (cg.snap->ps.stats[STAT_HEALTH] <= 0) + || (cg.snap->ps.eFlags&EF_HELD_BY_SAND_CREATURE) + || ((g_entities[0].client&&g_entities[0].client->NPC_class==CLASS_ATST) + || ((cg.snap->ps.weapon == WP_SABER || cg.snap->ps.weapon == WP_MELEE) && !cg_fpls.integer) + || (cg.snap->ps.weapon == WP_EMPLACED_GUN && !(cg.snap->ps.eFlags & EF_LOCKED_TO_WEAPON)) + || (!cg_trueguns.integer && (cg.snap->ps.weapon == WP_TUSKEN_RIFLE || cg.snap->ps.weapon == WP_NOGHRI_STICK) && cg.snap->ps.torsoAnim >= BOTH_TUSKENATTACK1 && cg.snap->ps.torsoAnim <= BOTH_TUSKENATTACK3))); if (cg_fpls.integer && cg_trueinvertsaber.integer == 2 && (cg.snap->ps.weapon == WP_SABER || cg.snap->ps.weapon == WP_MELEE)) {//force thirdperson for sabers/melee if in cg_trueinvertsaber.integer == 2 From 72aedcc7b3c5a78bf6831ced67fb76ec9fa95e24 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Wed, 26 Aug 2015 17:56:11 +0100 Subject: [PATCH 411/445] SFX Sabers: now shown in the menus if turned on --- code/ui/ui_main.cpp | 9 ++- code/ui/ui_saber.cpp | 184 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 175 insertions(+), 18 deletions(-) diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index adab4f0002..950917ab9c 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -406,10 +406,13 @@ vmCvar_t ui_saber2_skin3; vmCvar_t ui_saber2_skin4; vmCvar_t ui_saber2_skin5; +vmCvar_t ui_SFXSabers; +vmCvar_t ui_SFXSabersGlowSize; +vmCvar_t ui_SFXSabersCoreSize; + vmCvar_t ui_char_color_2_red; vmCvar_t ui_char_color_2_green; vmCvar_t ui_char_color_2_blue; - vmCvar_t ui_hilt_color_red; vmCvar_t ui_hilt_color_green; vmCvar_t ui_hilt_color_blue; @@ -485,6 +488,10 @@ static cvarTable_t cvarTable[] = { &ui_saber2_skin3, "ui_saber2_skin3", "", 0}, { &ui_saber2_skin4, "ui_saber2_skin4", "", 0}, { &ui_saber2_skin5, "ui_saber2_skin5", "", 0}, + + { &ui_SFXSabers, "cg_SFXSabers", "0", CVAR_ARCHIVE }, + { &ui_SFXSabersGlowSize, "cg_SFXSabersGlowSize", "1.0", CVAR_ARCHIVE }, + { &ui_SFXSabersCoreSize, "cg_SFXSabersCoreSize", "1.0", CVAR_ARCHIVE }, }; diff --git a/code/ui/ui_saber.cpp b/code/ui/ui_saber.cpp index 0dbb76c495..16a9e12bb0 100644 --- a/code/ui/ui_saber.cpp +++ b/code/ui/ui_saber.cpp @@ -57,6 +57,10 @@ extern vmCvar_t ui_saber2_skin3; extern vmCvar_t ui_saber2_skin4; extern vmCvar_t ui_saber2_skin5; +extern vmCvar_t ui_SFXSabers; +extern vmCvar_t ui_SFXSabersGlowSize; +extern vmCvar_t ui_SFXSabersCoreSize; + static qhandle_t redSaberGlowShader; static qhandle_t redSaberCoreShader; static qhandle_t orangeSaberGlowShader; @@ -71,6 +75,11 @@ static qhandle_t purpleSaberGlowShader; static qhandle_t purpleSaberCoreShader; static qhandle_t rgbSaberGlowShader; static qhandle_t rgbSaberCoreShader; +static qhandle_t blackSaberGlowShader; +static qhandle_t blackSaberCoreShader; +static qhandle_t rgbUnstableCoreShader; +static qhandle_t SaberBladeShader; +static qhandle_t blackSaberBladeShader; void UI_CacheSaberGlowGraphics( void ) {//FIXME: these get fucked by vid_restarts @@ -88,6 +97,11 @@ void UI_CacheSaberGlowGraphics( void ) purpleSaberCoreShader = re.RegisterShader( "gfx/effects/sabers/purple_line" ); rgbSaberGlowShader = re.RegisterShader( "gfx/effects/sabers/rgb_glow" ); rgbSaberCoreShader = re.RegisterShader( "gfx/effects/sabers/rgb_line" ); + blackSaberGlowShader = re.RegisterShader( "gfx/effects/sabers/black_glow" ); + blackSaberCoreShader = re.RegisterShader( "gfx/effects/sabers/black_line" ); + rgbUnstableCoreShader = re.RegisterShader("gfx/effects/sabers/jkg/blade_unstable"); + SaberBladeShader = re.RegisterShader( "SFX_Sabers/saber_blade" ); + blackSaberBladeShader = re.RegisterShader( "SFX_Sabers/black_blade" ); } qboolean UI_ParseLiteral( const char **data, const char *string ) @@ -452,7 +466,135 @@ void UI_SaberLoadParms( void ) } } -void UI_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float radius, saber_colors_t color, int whichSaber ) +void UI_DoSFXSaber( vec3_t blade_muz, vec3_t blade_dir, float lengthMax, float radius, saber_colors_t color, saber_crystals_t crystals, int whichSaber ) +{ + vec3_t mid; + float radiusmult, effectradius, coreradius; + float blade_len; + float effectalpha = 0.8f; + float AngleScale = 1.0f; + + qhandle_t glow = 0; + refEntity_t saber; + + blade_len = lengthMax; + + if ( blade_len < 0.5f ) + { + return; + } + + switch( color ) + { + case SABER_RED: + glow = redSaberGlowShader; + break; + case SABER_ORANGE: + glow = orangeSaberGlowShader; + break; + case SABER_YELLOW: + glow = yellowSaberGlowShader; + break; + case SABER_GREEN: + glow = greenSaberGlowShader; + break; + case SABER_PURPLE: + glow = purpleSaberGlowShader; + break; + case SABER_BLUE: + glow = blueSaberGlowShader; + break; + default://SABER_RGB + glow = rgbSaberGlowShader; + break; + } + + if ( crystals & SABER_CRYSTAL_BLACK ) + { + glow = blackSaberGlowShader; + } + + VectorMA( blade_muz, blade_len * 0.5f, blade_dir, mid ); + + memset( &saber, 0, sizeof( refEntity_t )); + + if (blade_len < lengthMax) + { + radiusmult = 0.5 + ((blade_len / lengthMax)/2); + } + else + { + radiusmult = 1.0; + } + + effectradius = ((radius * 1.6) + Q_flrand(-1.0f, 1.0f) * 0.1f)*radiusmult*ui_SFXSabersGlowSize.value; + coreradius = ((radius * 0.4) + Q_flrand(-1.0f, 1.0f) * 0.1f)*radiusmult*ui_SFXSabersCoreSize.value; + + if ( crystals & SABER_CRYSTAL_UNSTABLE ) + { + coreradius *= 0.9; + } + + { + //saber.renderfx = rfx; + if(blade_len-((effectradius*AngleScale)/2) > 0) + { + saber.radius = effectradius*AngleScale; + saber.saberLength = (blade_len - (saber.radius/2)); + VectorCopy( blade_muz, saber.origin ); + VectorCopy( blade_dir, saber.axis[0] ); + saber.reType = RT_SABER_GLOW; + saber.customShader = glow; + saber.shaderRGBA[0] = 0xff * effectalpha; + saber.shaderRGBA[1] = 0xff * effectalpha; + saber.shaderRGBA[2] = 0xff * effectalpha; + saber.shaderRGBA[3] = 0xff * effectalpha; + + if (color >= SABER_RGB) + { + if (whichSaber == 0) + { + saber.shaderRGBA[0] = ui_rgb_saber_red.integer * effectalpha; + saber.shaderRGBA[1] = ui_rgb_saber_green.integer * effectalpha; + saber.shaderRGBA[2] = ui_rgb_saber_blue.integer * effectalpha; + } + else + { + saber.shaderRGBA[0] = ui_rgb_saber2_red.integer * effectalpha; + saber.shaderRGBA[1] = ui_rgb_saber2_green.integer * effectalpha; + saber.shaderRGBA[2] = ui_rgb_saber2_blue.integer * effectalpha; + } + } + + DC->addRefEntityToScene( &saber ); + } + + // Do the hot core + VectorMA( blade_muz, blade_len, blade_dir, saber.origin ); + VectorMA( blade_muz, -1, blade_dir, saber.oldorigin ); + + saber.customShader = SaberBladeShader; + if ( crystals & SABER_CRYSTAL_BLACK ) + { + saber.customShader = blackSaberBladeShader; + } + else if ( crystals & SABER_CRYSTAL_UNSTABLE ) + { + saber.customShader = rgbUnstableCoreShader; + } + + saber.reType = RT_LINE; + + saber.radius = coreradius; + + saber.shaderTexCoord[0] = saber.shaderTexCoord[1] = 1.0f; + saber.shaderRGBA[0] = saber.shaderRGBA[1] = saber.shaderRGBA[2] = saber.shaderRGBA[3] = 0xff; + + DC->addRefEntityToScene( &saber ); + } +} + +void UI_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float radius, saber_colors_t color, saber_crystals_t crystals, int whichSaber ) { vec3_t mid, rgb={1,1,1}; qhandle_t blade = 0, glow = 0; @@ -503,24 +645,19 @@ void UI_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float default: glow = rgbSaberGlowShader; blade = rgbSaberCoreShader; - if (whichSaber == 0) - { - VectorSet( rgb, ui_rgb_saber_red.integer/255.0f, ui_rgb_saber_green.integer/255.0f, ui_rgb_saber_blue.integer/255.0f ); - } - else - { - VectorSet( rgb, ui_rgb_saber2_red.integer/255.0f, ui_rgb_saber2_green.integer/255.0f, ui_rgb_saber2_blue.integer/255.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) + (Q_flrand(0.0f, 1.0f)*8.0f), rgb[0], rgb[1], rgb[2] ); + + if ( crystals & SABER_CRYSTAL_BLACK ) + { + glow = blackSaberGlowShader; + blade = blackSaberCoreShader; + } + else if ( crystals & SABER_CRYSTAL_UNSTABLE ) + { + glow = rgbSaberGlowShader; + blade = rgbUnstableCoreShader; } - */ memset( &saber, 0, sizeof( refEntity_t )); @@ -568,6 +705,12 @@ void UI_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float saber.shaderRGBA[2] = ui_rgb_saber2_blue.integer; } } + else if ( (crystals & SABER_CRYSTAL_UNSTABLE) && !(crystals & SABER_CRYSTAL_BLACK) ) + { + saber.shaderRGBA[0] = 0xff * rgb[0]; + saber.shaderRGBA[1] = 0xff * rgb[1]; + saber.shaderRGBA[2] = 0xff * rgb[2]; + } DC->addRefEntityToScene( &saber ); @@ -919,7 +1062,14 @@ void UI_SaberDrawBlade( itemDef_t *item, char *saberName, int saberModel, saberT return; } - UI_DoSaber( bladeOrigin, axis[0], bladeLength, bladeLength, bladeRadius, bladeColor, whichSaber ); + if (ui_SFXSabers.integer) + { + UI_DoSFXSaber( bladeOrigin, axis[0], bladeLength, bladeRadius, bladeColor, SABER_CRYSTAL_DEFAULT, whichSaber); + } + else + { + UI_DoSaber( bladeOrigin, axis[0], bladeLength, bladeLength, bladeRadius, bladeColor, SABER_CRYSTAL_DEFAULT, whichSaber ); + } } extern qboolean ItemParse_asset_model_go( itemDef_t *item, const char *name ); From 4f94b6eaf9e3f997a226e282a37c397af686295c Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sun, 8 Jan 2017 15:57:37 +0000 Subject: [PATCH 412/445] Weapons: making decent progress on 5 new weaps Includes work on sonic blaster - also bumped MAX_POWERUPS to 32 --- code/cgame/FX_Clone.cpp | 109 ++++++++ code/cgame/cg_event.cpp | 9 +- code/cgame/cg_local.h | 5 + code/cgame/cg_media.h | 5 + code/cgame/cg_players.cpp | 27 +- code/cgame/cg_weapons.cpp | 44 +++- code/game/CMakeLists.txt | 2 + code/game/NPC_combat.cpp | 54 +++- code/game/bg_panimate.cpp | 61 ++++- code/game/bg_pmove.cpp | 16 +- code/game/bg_public.h | 2 + code/game/g_combat.cpp | 14 +- code/game/g_weapon.cpp | 35 ++- code/game/g_weaponLoad.cpp | 21 +- code/game/w_local.h | 3 +- code/game/wp_blaster_pistol.cpp | 9 +- code/game/wp_blaster_rifle.cpp | 13 +- code/game/wp_disruptor.cpp | 6 + code/game/wp_repeater.cpp | 6 + code/game/wp_sonic_blaster.cpp | 450 ++++++++++++++++++++++++++++++++ code/qcommon/msg.cpp | 4 +- code/qcommon/q_shared.h | 2 +- 22 files changed, 843 insertions(+), 54 deletions(-) create mode 100644 code/cgame/FX_Clone.cpp create mode 100644 code/game/wp_sonic_blaster.cpp diff --git a/code/cgame/FX_Clone.cpp b/code/cgame/FX_Clone.cpp new file mode 100644 index 0000000000..6a878fe62a --- /dev/null +++ b/code/cgame/FX_Clone.cpp @@ -0,0 +1,109 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +// Clone Weapons + +#include "cg_headers.h" + +#include "cg_local.h" +#include "cg_media.h" +#include "FxScheduler.h" + +/* +------------------------- +FX_CloneBlasterProjectileThink +------------------------- +*/ + +void FX_CloneBlasterProjectileThink( centity_t *cent, const struct weaponInfo_s *weapon ) +{ + vec3_t forward; + + if (cent->currentState.eFlags & EF_USE_ANGLEDELTA) + { + AngleVectors(cent->currentState.angles, forward, 0, 0); + } + else + { + if ( VectorNormalize2( cent->gent->s.pos.trDelta, forward ) == 0.0f ) + { + if ( VectorNormalize2( cent->currentState.pos.trDelta, forward ) == 0.0f ) + { + forward[2] = 1.0f; + } + } + } + + // hack the scale of the forward vector if we were just fired or bounced...this will shorten up the tail for a split second so tails don't clip so harshly + int dif = cg.time - cent->gent->s.pos.trTime; + + if ( dif < 75 ) + { + if ( dif < 0 ) + { + dif = 0; + } + + float scale = ( dif / 75.0f ) * 0.95f + 0.05f; + + VectorScale( forward, scale, forward ); + } + + theFxScheduler.PlayEffect( cgs.effects.cloneBlasterShotEffect, cent->lerpOrigin, forward ); +} + +/* +------------------------- +FX_CloneBlasterAltFireThink +------------------------- +*/ +void FX_CloneBlasterAltFireThink( centity_t *cent, const struct weaponInfo_s *weapon ) +{ + FX_CloneBlasterProjectileThink( cent, weapon ); +} + +/* +------------------------- +FX_CloneBlasterWeaponHitWall +------------------------- +*/ +void FX_CloneBlasterWeaponHitWall( vec3_t origin, vec3_t normal ) +{ + theFxScheduler.PlayEffect( cgs.effects.cloneBlasterWallImpactEffect, origin, normal ); +} + +/* +------------------------- +FX_CloneBlasterWeaponHitPlayer +------------------------- +*/ +void FX_CloneBlasterWeaponHitPlayer( gentity_t *hit, vec3_t origin, vec3_t normal, qboolean humanoid ) +{ + //temporary? just testing out the damage skin stuff -rww + if ( hit && hit->client && hit->ghoul2.size() ) + { + CG_AddGhoul2Mark(cgs.media.bdecal_burnmark1, flrand(3.5, 4.0), origin, normal, hit->s.number, + hit->client->ps.origin, hit->client->renderInfo.legsYaw, hit->ghoul2, hit->s.modelScale, Q_irand(10000, 13000)); + } + + theFxScheduler.PlayEffect( cgs.effects.cloneBlasterFleshImpactEffect, origin, normal ); +} diff --git a/code/cgame/cg_event.cpp b/code/cgame/cg_event.cpp index 41c4dcf17d..142a39bb86 100644 --- a/code/cgame/cg_event.cpp +++ b/code/cgame/cg_event.cpp @@ -546,7 +546,14 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { case EV_DISRUPTOR_MAIN_SHOT: DEBUGNAME("EV_DISRUPTOR_MAIN_SHOT"); - FX_DisruptorMainShot( cent->currentState.origin2, cent->lerpOrigin ); + if ( cent->currentState.weapon == WP_SONIC_BLASTER ) + { + FX_KothosBeam( cent->currentState.origin2, cent->lerpOrigin ); + } + else + { + FX_DisruptorMainShot( cent->currentState.origin2, cent->lerpOrigin ); + } break; case EV_DISRUPTOR_SNIPER_SHOT: diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index b2de3e4c2c..7cf945631d 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -1179,6 +1179,11 @@ void FX_NoghriShotProjectileThink( centity_t *cent, const struct weaponInfo_s *w void FX_NoghriShotWeaponHitWall( vec3_t origin, vec3_t normal ); void FX_NoghriShotWeaponHitPlayer( gentity_t *hit, vec3_t origin, vec3_t normal, qboolean humanoid ); +void FX_CloneBlasterProjectileThink( centity_t *cent, const struct weaponInfo_s *weapon ); +void FX_CloneBlasterAltFireThink( centity_t *cent, const struct weaponInfo_s *weapon ); +void FX_CloneBlasterWeaponHitWall( vec3_t origin, vec3_t normal ); +void FX_CloneBlasterWeaponHitPlayer( gentity_t *hit, vec3_t origin, vec3_t normal, qboolean humanoid ); + void CG_BounceEffect( centity_t *cent, int weapon, vec3_t origin, vec3_t normal ); void CG_MissileStick( centity_t *cent, int weapon, vec3_t origin ); diff --git a/code/cgame/cg_media.h b/code/cgame/cg_media.h index 21771b0efa..c47973e8ab 100644 --- a/code/cgame/cg_media.h +++ b/code/cgame/cg_media.h @@ -357,6 +357,11 @@ typedef struct fxHandle_t flechetteShotDeathEffect; fxHandle_t flechetteFleshImpactEffect; fxHandle_t flechetteRicochetEffect; + + // CLONE BLASTER + fxHandle_t cloneBlasterShotEffect; + fxHandle_t cloneBlasterWallImpactEffect; + fxHandle_t cloneBlasterFleshImpactEffect; //FORCE fxHandle_t forceConfusion; diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index e18acc9902..3ea52c5515 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -4108,7 +4108,7 @@ extern void FX_DEMP2_AltBeam( vec3_t start, vec3_t end, vec3_t normal, //qboolea //------------------------------------------- #define REFRACT_EFFECT_DURATION 500 void CG_ForcePushBlur( const vec3_t org, qboolean darkSide = qfalse ); -static void CG_ForcePushRefraction( vec3_t org, centity_t *cent ) +static void CG_ForcePushRefraction( vec3_t org, centity_t *cent, float scaleFactor, vec3_t colour ) { refEntity_t ent; vec3_t ang; @@ -4208,6 +4208,11 @@ static void CG_ForcePushRefraction( vec3_t org, centity_t *cent ) ent.radius = 32; } + if (scaleFactor) + { + scale *= scaleFactor; + } + VectorScale(ent.axis[0], scale, ent.axis[0]); VectorScale(ent.axis[1], scale, ent.axis[1]); VectorScale(ent.axis[2], scale, ent.axis[2]); @@ -4223,6 +4228,12 @@ static void CG_ForcePushRefraction( vec3_t org, centity_t *cent ) ent.shaderRGBA[2] = 255.0f; ent.shaderRGBA[3] = alpha; + if (colour) + { + ent.shaderRGBA[0] = colour[0]; + ent.shaderRGBA[1] = colour[1]; + ent.shaderRGBA[2] = colour[2]; + } cgi_R_AddRefEntityToScene( &ent ); } @@ -9277,11 +9288,21 @@ extern vmCvar_t cg_thirdPersonAlpha; //"refraction" effect -rww if ( cent->gent->client->ps.powerups[PW_FORCE_PUSH] > cg.time ) { - CG_ForcePushRefraction(cent->gent->client->renderInfo.handLPoint, cent); + CG_ForcePushRefraction(cent->gent->client->renderInfo.handLPoint, cent, 1.0f, NULL); } else if ( cent->gent->client->ps.powerups[PW_FORCE_PUSH_RHAND] > cg.time ) { - CG_ForcePushRefraction(cent->gent->client->renderInfo.handRPoint, cent); + CG_ForcePushRefraction(cent->gent->client->renderInfo.handRPoint, cent, 1.0f, NULL); + } + else if ( cent->gent->client->ps.powerups[PW_REFRACT_MUZZLE] > cg.time ) + { + vec3_t orange; + VectorScale(colorTable[CT_VLTORANGE], 255.0f, orange); + CG_ForcePushRefraction(cent->gent->client->renderInfo.muzzlePoint, cent, 1.0f, orange); + } + else if ( cent->gent->client->ps.powerups[PW_FORCE_REPULSE] > cg.time ) + { + CG_ForcePushRefraction(cent->gent->client->renderInfo.crotchPoint, cent, 2.0f, NULL); } else { diff --git a/code/cgame/cg_weapons.cpp b/code/cgame/cg_weapons.cpp index 630ea3c834..8885012dfd 100644 --- a/code/cgame/cg_weapons.cpp +++ b/code/cgame/cg_weapons.cpp @@ -648,17 +648,30 @@ void CG_RegisterWeapon( int weaponNum ) { break; case WP_E5_CARBINE: - case WP_DC15S_CARBINE: - case WP_SONIC_BLASTER: - case WP_DC15A_RIFLE: - case WP_Z6_ROTARY: cgs.effects.blasterShotEffect = theFxScheduler.RegisterEffect( "blaster/shot" ); theFxScheduler.RegisterEffect( "blaster/NPCshot" ); - // cgs.effects.blasterOverchargeEffect = theFxScheduler.RegisterEffect( "blaster/overcharge" ); cgs.effects.blasterWallImpactEffect = theFxScheduler.RegisterEffect( "blaster/wall_impact" ); cgs.effects.blasterFleshImpactEffect = theFxScheduler.RegisterEffect( "blaster/flesh_impact" ); - theFxScheduler.RegisterEffect( "blaster/deflect" ); - theFxScheduler.RegisterEffect( "blaster/smoke_bolton" ); // note: this will be called game side + break; + + case WP_DC15S_CARBINE: + case WP_Z6_ROTARY: + case WP_DC15A_RIFLE: + cgs.effects.cloneBlasterShotEffect = theFxScheduler.RegisterEffect( "clone/shot" ); + cgs.effects.cloneBlasterWallImpactEffect = theFxScheduler.RegisterEffect( "blaster/wall_impact" ); + cgs.effects.cloneBlasterFleshImpactEffect = theFxScheduler.RegisterEffect( "blaster/flesh_impact" ); + break; + + case WP_SONIC_BLASTER: + theFxScheduler.RegisterEffect( "disruptor/wall_impact" ); + theFxScheduler.RegisterEffect( "disruptor/flesh_impact" ); + theFxScheduler.RegisterEffect( "disruptor/line_cap" ); + theFxScheduler.RegisterEffect( "disruptor/death_smoke" ); + + cgi_R_RegisterShader( "gfx/misc/dr1" ); + cgi_R_RegisterShader( "gfx/misc/whiteline2" ); + cgi_R_RegisterShader( "gfx/effects/smokeTrail" ); + cgi_R_RegisterShader( "gfx/effects/burn" ); break; } @@ -3426,13 +3439,14 @@ void CG_MissileHitWall( centity_t *cent, int weapon, vec3_t origin, vec3_t dir, break; case WP_E5_CARBINE: - case WP_DC15S_CARBINE: - case WP_SONIC_BLASTER: - case WP_DC15A_RIFLE: - case WP_Z6_ROTARY: FX_BlasterWeaponHitWall( origin, dir ); break; + case WP_DC15S_CARBINE: + case WP_Z6_ROTARY: + case WP_DC15A_RIFLE: + FX_CloneBlasterWeaponHitWall( origin, dir ); + break; } } @@ -3575,11 +3589,13 @@ void CG_MissileHitPlayer( centity_t *cent, int weapon, vec3_t origin, vec3_t dir break; case WP_E5_CARBINE: + FX_BlasterWeaponHitPlayer( other, origin, dir, humanoid ); + break; + case WP_DC15S_CARBINE: - case WP_SONIC_BLASTER: - case WP_DC15A_RIFLE: case WP_Z6_ROTARY: - FX_BlasterWeaponHitPlayer( other, origin, dir, humanoid ); + case WP_DC15A_RIFLE: + FX_CloneBlasterWeaponHitPlayer( other, origin, dir, humanoid ); break; } } diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 22570ae24a..f6d1126d77 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -132,6 +132,7 @@ set(SPGameGameFiles "${SPDir}/game/wp_rocket_launcher.cpp" "${SPDir}/game/wp_saber.cpp" "${SPDir}/game/wp_saberLoad.cpp" + "${SPDir}/game/wp_sonic_blaster.cpp" "${SPDir}/game/wp_stun_baton.cpp" "${SPDir}/game/wp_thermal.cpp" "${SPDir}/game/wp_trip_mine.cpp" @@ -216,6 +217,7 @@ set(SPGameCGameFiles "${SPDir}/cgame/FX_Blaster.cpp" "${SPDir}/cgame/FX_Bowcaster.cpp" "${SPDir}/cgame/FX_BryarPistol.cpp" + "${SPDir}/cgame/FX_Clone.cpp" "${SPDir}/cgame/FX_Concussion.cpp" "${SPDir}/cgame/FX_DEMP2.cpp" "${SPDir}/cgame/FX_Disruptor.cpp" diff --git a/code/game/NPC_combat.cpp b/code/game/NPC_combat.cpp index 6b430985c8..30bbe89d17 100644 --- a/code/game/NPC_combat.cpp +++ b/code/game/NPC_combat.cpp @@ -344,13 +344,20 @@ void G_AttackDelay( gentity_t *self, gentity_t *enemy ) case WP_NOGHRI_STICK: attDelay += Q_irand( 0, 500 ); break; - case WP_SONIC_BLASTER: case WP_E5_CARBINE: + attDelay -= Q_irand( 0, 500 ); + break; case WP_DC15S_CARBINE: - case WP_DC15A_RIFLE: - case WP_Z6_ROTARY: attDelay -= Q_irand( 0, 500 ); break; + case WP_Z6_ROTARY: + attDelay += Q_irand( 0, 500 ); + break; + case WP_DC15A_RIFLE: + break; + case WP_SONIC_BLASTER: + return; + break; /* case WP_DEMP2: break; @@ -1028,11 +1035,48 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) ent->NPC->burstSpacing = 750;//attack debounce break; - case WP_SONIC_BLASTER: case WP_E5_CARBINE: + ent->NPC->aiFlags &= ~NPCAI_BURST_WEAPON; + if ( g_spskill->integer == 0 ) + ent->NPC->burstSpacing = 1000;//attack debounce + else if ( g_spskill->integer == 1 ) + ent->NPC->burstSpacing = 750;//attack debounce + else + ent->NPC->burstSpacing = 500;//attack debounce + break; + case WP_DC15S_CARBINE: - case WP_DC15A_RIFLE: + ent->NPC->aiFlags &= ~NPCAI_BURST_WEAPON; + if ( g_spskill->integer == 0 ) + ent->NPC->burstSpacing = 1000;//attack debounce + else if ( g_spskill->integer == 1 ) + ent->NPC->burstSpacing = 750;//attack debounce + else + ent->NPC->burstSpacing = 500;//attack debounce + break; + case WP_Z6_ROTARY: + ent->NPC->aiFlags |= NPCAI_BURST_WEAPON; + ent->NPC->burstMin = 3; +#ifdef BASE_SAVE_COMPAT + ent->NPC->burstMean = 6; +#endif + ent->NPC->burstMax = 10; + if ( g_spskill->integer == 0 ) + ent->NPC->burstSpacing = 1500;//attack debounce + else if ( g_spskill->integer == 1 ) + ent->NPC->burstSpacing = 1000;//attack debounce + else + ent->NPC->burstSpacing = 500;//attack debounce + break; + + case WP_SONIC_BLASTER: + ent->NPC->aiFlags &= ~NPCAI_BURST_WEAPON; + ent->NPC->burstSpacing = 1000;//attackdebounce + break; + + case WP_DC15A_RIFLE: + ent->NPC->aiFlags &= ~NPCAI_BURST_WEAPON; if ( g_spskill->integer == 0 ) ent->NPC->burstSpacing = 1000;//attack debounce else if ( g_spskill->integer == 1 ) diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index 3a5315a7ce..f0923b3902 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -6080,12 +6080,23 @@ void PM_TorsoAnimation( void ) break; case WP_E5_CARBINE: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + break; + case WP_DC15S_CARBINE: - case WP_SONIC_BLASTER: - case WP_DC15A_RIFLE: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + break; + case WP_Z6_ROTARY: PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); - //PM_SetAnim(pm,SETANIM_LEGS,BOTH_ATTACK2,SETANIM_FLAG_NORMAL); + break; + + case WP_DC15A_RIFLE: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + break; + + case WP_SONIC_BLASTER: + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); break; case WP_BLASTER: @@ -6388,9 +6399,27 @@ void PM_TorsoAnimation( void ) break; case WP_E5_CARBINE: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + case WP_DC15S_CARBINE: - case WP_SONIC_BLASTER: - case WP_DC15A_RIFLE: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + case WP_Z6_ROTARY: if ( weaponBusy ) { @@ -6402,6 +6431,28 @@ void PM_TorsoAnimation( void ) } break; + case WP_DC15A_RIFLE: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + + case WP_SONIC_BLASTER: + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + break; + case WP_NOGHRI_STICK: if ( weaponBusy ) diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 94859f0322..44a87753d0 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -13942,12 +13942,24 @@ static void PM_Weapon( void ) break; case WP_E5_CARBINE: + PM_SetAnim( pm, SETANIM_TORSO, BOTH_ATTACK3, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART); + break; + case WP_DC15S_CARBINE: - case WP_SONIC_BLASTER: - case WP_DC15A_RIFLE: + PM_SetAnim( pm, SETANIM_TORSO, BOTH_ATTACK3, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART); + break; + case WP_Z6_ROTARY: PM_SetAnim( pm, SETANIM_TORSO, BOTH_ATTACK3, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART); break; + + case WP_DC15A_RIFLE: + PM_SetAnim( pm, SETANIM_TORSO, BOTH_ATTACK3, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART); + break; + + case WP_SONIC_BLASTER: + PM_SetAnim( pm, SETANIM_TORSO, BOTH_ATTACK3, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART); + break; case WP_BLASTER: PM_SetAnim( pm, SETANIM_TORSO, BOTH_ATTACK3, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART); diff --git a/code/game/bg_public.h b/code/game/bg_public.h index 0ab8116504..4782ef3d71 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -262,6 +262,8 @@ typedef enum { PW_INVINCIBLE, PW_FORCE_PUSH, PW_FORCE_PUSH_RHAND, + PW_REFRACT_MUZZLE, + PW_FORCE_REPULSE, PW_NUM_POWERUPS } powerup_t; diff --git a/code/game/g_combat.cpp b/code/game/g_combat.cpp index 142218e1a9..825eb071ba 100644 --- a/code/game/g_combat.cpp +++ b/code/game/g_combat.cpp @@ -264,12 +264,20 @@ gentity_t *TossClientItems( gentity_t *self ) dropped->count = 15; break; case WP_E5_CARBINE: + dropped->count = 15; + break; case WP_DC15S_CARBINE: - case WP_SONIC_BLASTER: - case WP_DC15A_RIFLE: - case WP_Z6_ROTARY: dropped->count = 15; break; + case WP_Z6_ROTARY: + dropped->count = 20; + break; + case WP_DC15A_RIFLE: + dropped->count = 20; + break; + case WP_SONIC_BLASTER: + dropped->count = 20; + break; default: dropped->count = 0; break; diff --git a/code/game/g_weapon.cpp b/code/game/g_weapon.cpp index bcd5983fba..d76296f50d 100644 --- a/code/game/g_weapon.cpp +++ b/code/game/g_weapon.cpp @@ -76,11 +76,11 @@ float weaponSpeed[WP_NUM_WEAPONS][2] = { 0,0 },//WP_TUSKEN_STAFF, { 0,0 },//WP_SCEPTER, { 0,0 },//WP_NOGHRI_STICK, - { 0,0 },//WP_SONIC_BLASTER, - { 0,0 },//WP_E5_CARBINE, - { 0,0 },//WP_DC15S_CARBINE, - { 0,0 },//WP_DC15A_RIFLE, - { 0,0 },//WP_Z6_ROTARY, + { Q3_INFINITE,Q3_INFINITE },//WP_SONIC_BLASTER, + { BLASTER_VELOCITY,BLASTER_VELOCITY },//WP_E5_CARBINE, + { BLASTER_VELOCITY,BLASTER_VELOCITY },//WP_DC15S_CARBINE, + { BRYAR_PISTOL_VEL,BRYAR_PISTOL_VEL },//WP_DC15A_RIFLE, + { REPEATER_VELOCITY,REPEATER_VELOCITY },//WP_Z6_ROTARY, }; @@ -1544,13 +1544,32 @@ void FireWeapon( gentity_t *ent, qboolean alt_fire ) } break; - case WP_SONIC_BLASTER: - case WP_Z6_ROTARY: case WP_E5_CARBINE: - case WP_DC15A_RIFLE: + WP_FireBlaster( ent, alt_fire ); + break; + case WP_DC15S_CARBINE: WP_FireBlaster( ent, alt_fire ); break; + + case WP_Z6_ROTARY: + WP_FireRepeater( ent, qfalse ); + break; + + case WP_DC15A_RIFLE: + WP_FireBryarPistol( ent, qfalse ); + break; + + case WP_SONIC_BLASTER: + if ( !alt_fire ) + { + WP_FireDisruptor( ent, qfalse ); + } + else + { + WP_SonicBlast( ent ); + } + break; case WP_TUSKEN_STAFF: default: diff --git a/code/game/g_weaponLoad.cpp b/code/game/g_weaponLoad.cpp index d04ab4060b..68a9100375 100644 --- a/code/game/g_weaponLoad.cpp +++ b/code/game/g_weaponLoad.cpp @@ -80,6 +80,11 @@ void FX_TuskenShotProjectileThink( centity_t *cent, const struct weaponInfo_s *w //Noghri projectile void FX_NoghriShotProjectileThink( centity_t *cent, const struct weaponInfo_s *weapon ); +//Clone projectile +void FX_CloneBlasterProjectileThink( centity_t *cent, const struct weaponInfo_s *weapon ); +void FX_CloneBlasterAltFireThink( centity_t *cent, const struct weaponInfo_s *weapon ); + + // Table used to attach an extern missile function string to the actual cgame function func_t funcs[] = { {"bryar_func", FX_BryarProjectileThink}, @@ -87,6 +92,8 @@ func_t funcs[] = { {"blaster_func", FX_BlasterProjectileThink}, {"blaster_alt_func", FX_BlasterAltFireThink}, {"bowcaster_func", FX_BowcasterProjectileThink}, + {"cloneblaster_func", FX_CloneBlasterProjectileThink}, + {"cloneblaster_alt_func", FX_CloneBlasterAltFireThink}, {"repeater_func", FX_RepeaterProjectileThink}, {"repeater_alt_func", FX_RepeaterAltProjectileThink}, {"demp2_func", FX_DEMP2_ProjectileThink}, @@ -270,12 +277,12 @@ const int defaultDamage[] = { 0, // WP_TUSKEN_STAFF 0, // WP_SCEPTER 0, // WP_NOGHRI_STICK - 0, // WP_SONIC_BLASTER, + DISRUPTOR_MAIN_DAMAGE, // WP_SONIC_BLASTER, - 0, // WP_E5_CARBINE, - 0, // WP_DC15S_CARBINE, - 0, // WP_DC15A_RIFLE, - 0, // WP_Z6_ROTARY, + BLASTER_DAMAGE, // WP_E5_CARBINE, + BLASTER_DAMAGE, // WP_DC15S_CARBINE, + BRYAR_PISTOL_DAMAGE, // WP_DC15A_RIFLE, + REPEATER_DAMAGE, // WP_Z6_ROTARY, }; const int defaultAltDamage[] = { @@ -315,8 +322,8 @@ const int defaultAltDamage[] = { 0, // WP_NOGHRI_STICK 0, // WP_SONIC_BLASTER, - 0, // WP_E5_CARBINE, - 0, // WP_DC15S_CARBINE, + BLASTER_DAMAGE, // WP_E5_CARBINE, + BLASTER_DAMAGE, // WP_DC15S_CARBINE, 0, // WP_DC15A_RIFLE, 0, // WP_Z6_ROTARY, }; diff --git a/code/game/w_local.h b/code/game/w_local.h index 5f6ce51b58..b46329920f 100644 --- a/code/game/w_local.h +++ b/code/game/w_local.h @@ -84,4 +84,5 @@ gentity_t *WP_DropThermal( gentity_t *ent ); void touchLaserTrap( gentity_t *ent, gentity_t *other, trace_t *trace ); void CreateLaserTrap( gentity_t *laserTrap, vec3_t start, gentity_t *owner ); void WP_PlaceLaserTrap( gentity_t *ent, qboolean alt_fire ); -void WP_FireTuskenRifle( gentity_t *ent ); \ No newline at end of file +void WP_FireTuskenRifle( gentity_t *ent ); +void WP_SonicBlast( gentity_t *self ); \ No newline at end of file diff --git a/code/game/wp_blaster_pistol.cpp b/code/game/wp_blaster_pistol.cpp index cede5bbd16..a61920c1db 100644 --- a/code/game/wp_blaster_pistol.cpp +++ b/code/game/wp_blaster_pistol.cpp @@ -70,7 +70,13 @@ void WP_FireBryarPistol( gentity_t *ent, qboolean alt_fire ) gentity_t *missile = CreateMissile( start, forwardVec, BRYAR_PISTOL_VEL, 10000, ent, alt_fire ); missile->classname = "bryar_proj"; - if ( ent->s.weapon == WP_BLASTER_PISTOL + + if ( ent->s.weapon == WP_DC15A_RIFLE ) + { + missile->s.weapon = WP_DC15A_RIFLE; + damage = weaponData[WP_DC15A_RIFLE].damage; + } + else if ( ent->s.weapon == WP_BLASTER_PISTOL || ent->s.weapon == WP_JAWA ) {//*SIGH*... I hate our weapon system... missile->s.weapon = ent->s.weapon; @@ -79,6 +85,7 @@ void WP_FireBryarPistol( gentity_t *ent, qboolean alt_fire ) { missile->s.weapon = WP_BRYAR_PISTOL; } + if ( alt_fire ) { diff --git a/code/game/wp_blaster_rifle.cpp b/code/game/wp_blaster_rifle.cpp index 87545617c9..92eebb13e5 100644 --- a/code/game/wp_blaster_rifle.cpp +++ b/code/game/wp_blaster_rifle.cpp @@ -37,7 +37,7 @@ void WP_FireBlasterMissile( gentity_t *ent, vec3_t start, vec3_t dir, qboolean a { int velocity = BLASTER_VELOCITY; int damage = altFire ? weaponData[WP_BLASTER].altDamage : weaponData[WP_BLASTER].damage; - + if ( ent && ent->client && ent->client->NPC_class == CLASS_VEHICLE ) { damage *= 3; @@ -84,6 +84,17 @@ void WP_FireBlasterMissile( gentity_t *ent, vec3_t start, vec3_t dir, qboolean a damage = BLASTER_NPC_DAMAGE_HARD; } } + + if ( ent->s.weapon == WP_E5_CARBINE ) + { + damage = altFire ? weaponData[WP_E5_CARBINE].altDamage : weaponData[WP_E5_CARBINE].damage; + missile->s.weapon = WP_E5_CARBINE; + } + else if ( ent->s.weapon == WP_DC15S_CARBINE ) + { + damage = altFire ? weaponData[WP_DC15S_CARBINE].altDamage : weaponData[WP_DC15S_CARBINE].damage; + missile->s.weapon = WP_DC15S_CARBINE; + } // if ( ent->client ) // { diff --git a/code/game/wp_disruptor.cpp b/code/game/wp_disruptor.cpp index 6cebd8de6f..ba2574a8c5 100644 --- a/code/game/wp_disruptor.cpp +++ b/code/game/wp_disruptor.cpp @@ -97,9 +97,15 @@ static void WP_DisruptorMainFire( gentity_t *ent ) render_impact = qfalse; } + if ( ent->s.weapon == WP_SONIC_BLASTER ) + { + damage = weaponData[WP_SONIC_BLASTER].damage; + } + // always render a shot beam, doing this the old way because I don't much feel like overriding the effect. tent = G_TempEntity( tr.endpos, EV_DISRUPTOR_MAIN_SHOT ); tent->svFlags |= SVF_BROADCAST; + tent->s.weapon = ent->s.weapon; VectorCopy( muzzle, tent->s.origin2 ); if ( render_impact ) diff --git a/code/game/wp_repeater.cpp b/code/game/wp_repeater.cpp index 792732978b..534e99ccd9 100644 --- a/code/game/wp_repeater.cpp +++ b/code/game/wp_repeater.cpp @@ -63,6 +63,12 @@ static void WP_RepeaterMainFire( gentity_t *ent, vec3_t dir ) damage = REPEATER_NPC_DAMAGE_HARD; } } + + if ( ent->s.weapon == WP_Z6_ROTARY ) + { + missile->s.weapon = WP_Z6_ROTARY; + damage = weaponData[WP_Z6_ROTARY].damage; + } // if ( ent->client && ent->client->ps.powerups[PW_WEAPON_OVERCHARGE] > 0 && ent->client->ps.powerups[PW_WEAPON_OVERCHARGE] > cg.time ) // { diff --git a/code/game/wp_sonic_blaster.cpp b/code/game/wp_sonic_blaster.cpp new file mode 100644 index 0000000000..5871732c94 --- /dev/null +++ b/code/game/wp_sonic_blaster.cpp @@ -0,0 +1,450 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#include "g_local.h" +#include "b_local.h" +#include "g_functions.h" +#include "wp_saber.h" +#include "w_local.h" + +#define SONIC_BLAST_RADIUS 512 +#define SONIC_BLAST_CONE 0.8f +extern qboolean WP_ForceThrowable( gentity_t *ent, gentity_t *forwardEnt, gentity_t *self, qboolean pull, float cone, float radius, vec3_t forward ); +extern qboolean Rosh_BeingHealed( gentity_t *self ); +extern void G_KnockOffVehicle( gentity_t *pRider, gentity_t *self, qboolean bPull ); +extern void WP_ForceKnockdown( gentity_t *self, gentity_t *pusher, qboolean pull, qboolean strongKnockdown, qboolean breakSaberLock ); +extern qboolean Jedi_WaitingAmbush( gentity_t *self ); +extern void G_ReflectMissile( gentity_t *ent, gentity_t *missile, vec3_t forward ); +extern qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f ); +extern void WP_KnockdownTurret( gentity_t *self, gentity_t *pas ); +void WP_SaberDrop( gentity_t *self, gentity_t *saber ); +void WP_SaberReturn( gentity_t *self, gentity_t *saber ); +void WP_SonicBlast( gentity_t *self ) +{//FIXME: pass in a target ent so we (an NPC) can push/pull just one targeted ent. + //shove things in front of you away + float dist; + gentity_t *ent, *forwardEnt = NULL; + gentity_t *entityList[MAX_GENTITIES]; + gentity_t *push_list[MAX_GENTITIES]; + int numListedEntities = 0; + vec3_t mins, maxs; + vec3_t v; + int i, e; + int ent_count = 0; + int radius; + vec3_t center, ent_org, size, forward, right, end, dir, fwdangles = {0}; + float dot1, cone; + trace_t tr; + + + radius = SONIC_BLAST_RADIUS; + + self->client->ps.powerups[PW_REFRACT_MUZZLE] = level.time + 1000; + self->client->pushEffectFadeTime = 0; + + VectorCopy( self->client->ps.viewangles, fwdangles ); + //fwdangles[1] = self->client->ps.viewangles[1]; + AngleVectors( fwdangles, forward, right, NULL ); + VectorCopy( self->currentOrigin, center ); + + cone = SONIC_BLAST_CONE; + + if ( !numListedEntities ) + { + for ( i = 0 ; i < 3 ; i++ ) + { + mins[i] = center[i] - radius; + maxs[i] = center[i] + radius; + } + + numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); + + for ( e = 0 ; e < numListedEntities ; e++ ) + { + ent = entityList[ e ]; + + if ( !WP_ForceThrowable( ent, forwardEnt, self, qfalse, cone, radius, forward ) ) + { + continue; + } + + //this is all to see if we need to start a saber attack, if it's in flight, this doesn't matter + // find the distance from the edge of the bounding box + for ( i = 0 ; i < 3 ; i++ ) + { + if ( center[i] < ent->absmin[i] ) + { + v[i] = ent->absmin[i] - center[i]; + } else if ( center[i] > ent->absmax[i] ) + { + v[i] = center[i] - ent->absmax[i]; + } else + { + v[i] = 0; + } + } + + VectorSubtract( ent->absmax, ent->absmin, size ); + VectorMA( ent->absmin, 0.5, size, ent_org ); + + //see if they're in front of me + VectorSubtract( ent_org, center, dir ); + VectorNormalize( dir ); + if ( cone < 1.0f ) + {//must be within the forward cone + if ( ent->s.eType == ET_MISSILE )//&& ent->s.eType != ET_ITEM && ent->e_ThinkFunc != thinkF_G_RunObject ) + {//missiles are easier to force-push, never require direct trace (FIXME: maybe also items and general physics objects) + if ( (dot1 = DotProduct( dir, forward )) < cone-0.3f ) + continue; + } + else if ( (dot1 = DotProduct( dir, forward )) < cone ) + { + continue; + } + } + else if ( ent->s.eType == ET_MISSILE ) + {//a missile and we're at force level 1... just use a small cone, but not ridiculously small + if ( (dot1 = DotProduct( dir, forward )) < 0.75f ) + { + continue; + } + }//else is an NPC or brush entity that our forward trace would have to hit + + dist = VectorLength( v ); + + //Now check and see if we can actually deflect it + //method1 + //if within a certain range, deflect it + if ( ent->s.eType == ET_MISSILE && cone >= 1.0f ) + {//smaller radius on missile checks at force push 1 + if ( dist >= 192 ) + { + continue; + } + } + else if ( dist >= radius ) + { + continue; + } + + //in PVS? + if ( !ent->bmodel && !gi.inPVS( ent_org, self->client->renderInfo.eyePoint ) ) + {//must be in PVS + continue; + } + + if ( ent != forwardEnt ) + {//don't need to trace against forwardEnt again + //really should have a clear LOS to this thing... + gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, ent_org, self->s.number, MASK_FORCE_PUSH, (EG2_Collision)0, 0 );//was MASK_SHOT, but changed to match above trace and crosshair trace + if ( tr.fraction < 1.0f && tr.entityNum != ent->s.number ) + {//must have clear LOS + continue; + } + } + + // ok, we are within the radius, add us to the incoming list + push_list[ent_count] = ent; + ent_count++; + } + } + + if ( ent_count ) + { + for ( int x = 0; x < ent_count; x++ ) + { + if ( push_list[x]->client ) + { + vec3_t pushDir; + float knockback = 200; + + if ( Rosh_BeingHealed( push_list[x] ) ) + { + continue; + } + + if ( push_list[x]->client && Jedi_WaitingAmbush( push_list[x] ) ) + { + WP_ForceKnockdown( push_list[x], self, qfalse, qtrue, qfalse ); + continue; + } + + G_KnockOffVehicle( push_list[x], self, qfalse ); + + { + //UGH: FIXME: for enemy jedi, they should probably always do force pull 3, and not your weapon (if player?)! + //shove them + if ( push_list[x]->NPC + && push_list[x]->NPC->jumpState == JS_JUMPING ) + {//don't interrupt a scripted jump + //WP_ResistForcePush( push_list[x], self, qfalse ); + push_list[x]->forcePushTime = level.time + 600; // let the push effect last for 600 ms + continue; + } + + if ( push_list[x]->s.number + && (push_list[x]->message || (push_list[x]->flags&FL_NO_KNOCKBACK)) ) + {//an NPC who has a key + //don't push me... FIXME: maybe can pull the key off me? + WP_ForceKnockdown( push_list[x], self, qfalse, qfalse, qfalse ); + continue; + } + { + VectorSubtract( push_list[x]->currentOrigin, self->currentOrigin, pushDir ); + knockback -= VectorNormalize( pushDir ); + if ( knockback < 100 ) + { + knockback = 100; + } + } + + //actually push/pull the enemy + G_Throw( push_list[x], pushDir, knockback ); + //make it so they don't actually hurt me when pulled at me... + push_list[x]->forcePuller = self->s.number; + + if ( push_list[x]->client->ps.groundEntityNum != ENTITYNUM_NONE ) + {//if on the ground, make sure they get shoved up some + if ( push_list[x]->client->ps.velocity[2] < knockback ) + { + push_list[x]->client->ps.velocity[2] = knockback; + } + } + + if ( push_list[x]->health > 0 ) + {//target is still alive + if ( !push_list[x]->s.number ) + {//player, have to force an anim on him + WP_ForceKnockdown( push_list[x], self, qfalse, (qboolean)(knockback>150), qfalse ); + } + else + {//NPC and force-push/pull at level 2 or higher + WP_ForceKnockdown( push_list[x], self, qfalse, (qboolean)(knockback>100), qfalse ); + } + } + push_list[x]->forcePushTime = level.time + 600; // let the push effect last for 600 ms + } + } + else + { + if ( push_list[x]->s.weapon == WP_SABER && (push_list[x]->contents&CONTENTS_LIGHTSABER) ) + {//a thrown saber, just send it back + /* + if ( pull ) + {//steal it? + } + else */if ( push_list[x]->owner && push_list[x]->owner->client && push_list[x]->owner->client->ps.SaberActive() && push_list[x]->s.pos.trType == TR_LINEAR && push_list[x]->owner->client->ps.saberEntityState != SES_RETURNING ) + {//it's on and being controlled + //FIXME: prevent it from damaging me? + if ( self->s.number == 0 || Q_irand( 0, 2 ) ) + {//certain chance of throwing it aside and turning it off? + //give it some velocity away from me + //FIXME: maybe actually push or pull it? + if ( Q_irand( 0, 1 ) ) + { + VectorScale( right, -1, right ); + } + G_ReflectMissile( self, push_list[x], right ); + //FIXME: isn't turning off!!! + WP_SaberDrop( push_list[x]->owner, push_list[x] ); + } + else + { + WP_SaberReturn( push_list[x]->owner, push_list[x] ); + } + //different effect? + } + } + else if ( push_list[x]->s.eType == ET_MISSILE + && push_list[x]->s.pos.trType != TR_STATIONARY + && (push_list[x]->s.pos.trType != TR_INTERPOLATE||push_list[x]->s.weapon != WP_THERMAL) )//rolling and stationary thermal detonators are dealt with below + { + vec3_t dir2Me; + VectorSubtract( self->currentOrigin, push_list[x]->currentOrigin, dir2Me ); + float dot = DotProduct( push_list[x]->s.pos.trDelta, dir2Me ); + { + if ( push_list[x]->s.eFlags&EF_MISSILE_STICK ) + {//caught a sticky in-air + push_list[x]->s.eType = ET_MISSILE; + push_list[x]->s.eFlags &= ~EF_MISSILE_STICK; + push_list[x]->s.eFlags |= EF_BOUNCE_HALF; + push_list[x]->splashDamage /= 3; + push_list[x]->splashRadius /= 3; + push_list[x]->e_ThinkFunc = thinkF_WP_Explode; + push_list[x]->nextthink = level.time + Q_irand( 500, 3000 ); + } + if ( dot >= 0 ) + {//it's heading towards me + G_ReflectMissile( self, push_list[x], forward ); + } + else + { + VectorScale( push_list[x]->s.pos.trDelta, 1.25f, push_list[x]->s.pos.trDelta ); + } + //deflect sound + //G_Sound( push_list[x], G_SoundIndex( va("sound/weapons/blaster/reflect%d.wav", Q_irand( 1, 3 ) ) ) ); + //push_list[x]->forcePushTime = level.time + 600; // let the push effect last for 600 ms + } + if ( push_list[x]->s.eType == ET_MISSILE + && push_list[x]->s.weapon == WP_ROCKET_LAUNCHER + && push_list[x]->damage < 60 ) + {//pushing away a rocket raises it's damage to the max for NPCs + push_list[x]->damage = 60; + } + } + else if ( push_list[x]->svFlags & SVF_GLASS_BRUSH ) + {//break the glass + trace_t tr; + vec3_t pushDir; + float damage = 800; + + AngleVectors( self->client->ps.viewangles, forward, NULL, NULL ); + VectorNormalize( forward ); + VectorMA( self->client->renderInfo.eyePoint, radius, forward, end ); + gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 ); + if ( tr.entityNum != push_list[x]->s.number || tr.fraction == 1.0 || tr.allsolid || tr.startsolid ) + {//must be pointing right at it + continue; + } + + { + VectorSubtract( tr.endpos, self->client->renderInfo.eyePoint, pushDir ); + } + damage -= VectorNormalize( pushDir ); + if ( damage < 200 ) + { + damage = 200; + } + VectorScale( pushDir, damage, pushDir ); + + G_Damage( push_list[x], self, self, pushDir, tr.endpos, damage, 0, MOD_UNKNOWN ); + } + else if ( push_list[x]->s.eType == ET_MISSILE/*thermal resting on ground*/ + || push_list[x]->s.eType == ET_ITEM + || push_list[x]->e_ThinkFunc == thinkF_G_RunObject || Q_stricmp( "limb", push_list[x]->classname ) == 0 ) + {//general object, toss it + vec3_t pushDir, kvel; + float knockback = 200; + float mass = 200; + + { + if ( self->enemy //I have an enemy + && push_list[x]->s.eType != ET_ITEM //not an item + && self->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2 //have push 3 or greater + && InFront(push_list[x]->currentOrigin, self->currentOrigin, self->currentAngles, 0.25f)//object is generally in front of me + && InFront(self->enemy->currentOrigin, self->currentOrigin, self->currentAngles, 0.75f)//enemy is pretty much right in front of me + && InFront(push_list[x]->currentOrigin, self->enemy->currentOrigin, self->enemy->currentAngles, 0.25f)//object is generally in front of enemy + //FIXME: check dist to enemy and clear LOS to enemy and clear Path between object and enemy? + && ( (self->NPC&&(Q_irand(0,RANK_CAPTAIN)NPC->rank) )//NPC with enough skill + ||( self->s.numbermass > TARGETED_OBJECT_PUSH_MASS_MAX ) + {//already pushed too many things + //FIXME: pick closest? + continue; + } + targetedObjectMassTotal += push_list[x]->mass; + */ + VectorSubtract( self->enemy->currentOrigin, push_list[x]->currentOrigin, pushDir ); + } + else + { + VectorSubtract( push_list[x]->currentOrigin, self->currentOrigin, pushDir ); + } + knockback -= VectorNormalize( pushDir ); + if ( knockback < 100 ) + { + knockback = 100; + } + } + //FIXME: if pull a FL_FORCE_PULLABLE_ONLY, clear the flag, assuming it's no longer in solid? or check? + VectorCopy( push_list[x]->currentOrigin, push_list[x]->s.pos.trBase ); + push_list[x]->s.pos.trTime = level.time; // move a bit on the very first frame + if ( push_list[x]->s.pos.trType != TR_INTERPOLATE ) + {//don't do this to rolling missiles + push_list[x]->s.pos.trType = TR_GRAVITY; + } + + if ( push_list[x]->e_ThinkFunc == thinkF_G_RunObject && push_list[x]->physicsBounce ) + {//it's a pushable misc_model_breakable, use it's mass instead of our one-size-fits-all mass + mass = push_list[x]->physicsBounce;//same as push_list[x]->mass, right? + } + if ( mass < 50 ) + {//??? + mass = 50; + } + if ( g_gravity->value > 0 ) + { + VectorScale( pushDir, g_knockback->value * knockback / mass * 0.8, kvel ); + kvel[2] = pushDir[2] * g_knockback->value * knockback / mass * 1.5; + } + else + { + VectorScale( pushDir, g_knockback->value * knockback / mass, kvel ); + } + VectorAdd( push_list[x]->s.pos.trDelta, kvel, push_list[x]->s.pos.trDelta ); + if ( g_gravity->value > 0 ) + { + if ( push_list[x]->s.pos.trDelta[2] < knockback ) + { + push_list[x]->s.pos.trDelta[2] = knockback; + } + } + //no trDuration? + if ( push_list[x]->e_ThinkFunc != thinkF_G_RunObject ) + {//objects spin themselves? + //spin it + //FIXME: messing with roll ruins the rotational center??? + push_list[x]->s.apos.trTime = level.time; + push_list[x]->s.apos.trType = TR_LINEAR; + VectorClear( push_list[x]->s.apos.trDelta ); + push_list[x]->s.apos.trDelta[1] = Q_irand( -800, 800 ); + } + + if ( Q_stricmp( "limb", push_list[x]->classname ) == 0 ) + {//make sure it runs it's physics + push_list[x]->e_ThinkFunc = thinkF_LimbThink; + push_list[x]->nextthink = level.time + FRAMETIME; + } + push_list[x]->forcePushTime = level.time + 600; // let the push effect last for 600 ms + push_list[x]->forcePuller = self->s.number;//remember this regardless + if ( push_list[x]->item && push_list[x]->item->giTag == INV_SECURITY_KEY ) + { + AddSightEvent( player, push_list[x]->currentOrigin, 128, AEL_DISCOVERED );//security keys are more important + } + else + { + AddSightEvent( player, push_list[x]->currentOrigin, 128, AEL_SUSPICIOUS );//hmm... or should this always be discovered? + } + } + else if ( push_list[x]->s.weapon == WP_TURRET + && !Q_stricmp( "PAS", push_list[x]->classname ) + && push_list[x]->s.apos.trType == TR_STATIONARY ) + {//a portable turret + WP_KnockdownTurret( self, push_list[x] ); + } + } + } + } +} diff --git a/code/qcommon/msg.cpp b/code/qcommon/msg.cpp index 3d55fcb95d..51e8722a25 100644 --- a/code/qcommon/msg.cpp +++ b/code/qcommon/msg.cpp @@ -1152,7 +1152,7 @@ void MSG_WriteDeltaPlayerstate( msg_t *msg, playerState_t *from, playerState_t * } if ( powerupbits ) { MSG_WriteBits( msg, 1, 1 ); // changed - MSG_WriteShort( msg, powerupbits ); + MSG_WriteLong( msg, powerupbits ); for (i=0 ; ipowerups[i] ); @@ -1288,7 +1288,7 @@ void MSG_ReadDeltaPlayerstate (msg_t *msg, playerState_t *from, playerState_t *t // parse powerups if ( MSG_ReadBits( msg, 1 ) ) { LOG("PS_POWERUPS"); - bits = MSG_ReadShort (msg); + bits = MSG_ReadLong (msg); for (i=0 ; ipowerups[i] = MSG_ReadLong(msg); diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 58a5e9d562..78674f06ab 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -799,7 +799,7 @@ typedef enum // #define MAX_PERSISTANT 16 -#define MAX_POWERUPS 16 +#define MAX_POWERUPS 32 #define MAX_WEAPONS 64 #define MAX_WEAPONBITS 1 + (MAX_WEAPONS - 1)/32 #define MAX_AMMO 10 From 898bd6e4871b9a48baeb825ceb12d516ea7d2958 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sun, 8 Jan 2017 15:58:10 +0000 Subject: [PATCH 413/445] UI: FIXME FIXME FIXME --- code/ui/ui_main.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 950917ab9c..11b6d50c75 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -3452,8 +3452,8 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) char filelist[2048]; playerSpeciesInfo_t *species = NULL; - std::vector buffer(filelen + 1); - ui.FS_Read(&buffer[0], filelen, f); + char buffer[2048]; + ui.FS_Read(&buffer, filelen, f); ui.FS_FCloseFile(f); buffer[filelen] = 0; @@ -3468,7 +3468,7 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) memset(species, 0, sizeof(playerSpeciesInfo_t)); Q_strncpyz( species->Name, dirptr, MAX_QPATH ); - if (!UI_ParseColorData(buffer.data(),*species)) + if (!UI_ParseColorData(buffer,*species)) { ui.Printf( "UI_BuildPlayerModel_List: Errors parsing '%s'\n", fpath ); } @@ -3492,7 +3492,7 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) ui.FS_Read(&buffer, filelen, f); ui.FS_FCloseFile(f); buffer[filelen] = 0; //ensure trailing NULL - if (!UI_ParseColor2Data(buffer.data(),*species)) + if (!UI_ParseColor2Data(buffer,*species)) { ui.Printf( "UI_BuildPlayerModel_List: Errors parsing '%s'\n", fpath ); } @@ -3539,7 +3539,7 @@ static void UI_BuildPlayerModel_List( qboolean inGameLoad ) ui.FS_Read(&buffer, headSwapFileLen, f); ui.FS_FCloseFile(f); buffer[headSwapFileLen] = 0; - UI_ParseHeadSwapData(buffer.data(),*species); + UI_ParseHeadSwapData(buffer,*species); } } else if (Q_stricmpn(skinname,"torso_",6) == 0) From 36c143682bcfb47c7f9df7d6c0769f11b2537ea2 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Thu, 3 Dec 2015 15:18:39 +0000 Subject: [PATCH 414/445] Eweb: restrict jumping, rolling and speed --- code/game/bg_pmove.cpp | 9 +++++++++ code/game/g_active.cpp | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 44a87753d0..4d31237d6f 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -1084,6 +1084,11 @@ static qboolean PM_CheckJump( void ) {//can't jump when in a kicking anim return qfalse; } + + if ( pm->ps->weapon == WP_EMPLACED_GUN && !(pm->ps->eFlags & EF_LOCKED_TO_WEAPON)) + { + return qfalse; + } /* if ( pm->cmd.buttons & BUTTON_FORCEJUMP ) { @@ -3806,6 +3811,10 @@ static qboolean PM_TryRoll( void ) { return qfalse; } + if ( pm->ps->weapon == WP_EMPLACED_GUN && !(pm->ps->eFlags & EF_LOCKED_TO_WEAPON)) + { + return qfalse; + } if ( (pm->ps->saber[0].saberFlags&SFL_NO_ROLLS) ) { return qfalse; diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index 87ba4e14be..d056d7c3fa 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -4677,6 +4677,15 @@ void ClientAlterSpeed(gentity_t *ent, usercmd_t *ucmd, qboolean controlledByPlay { client->ps.speed *= 0.75; } + + if ( client->ps.weapon == WP_EMPLACED_GUN && !(client->ps.eFlags & EF_LOCKED_TO_WEAPON) ) + { + if (!(ucmd->buttons & BUTTON_WALKING)) + { + ucmd->buttons |= BUTTON_WALKING; + client->ps.speed *= 0.5; + } + } if ( client->ps.weapon == WP_SABER ) { From 2341f3302ce6fbbf1db221f27bbe9e8d064beacb Mon Sep 17 00:00:00 2001 From: redsaurus Date: Thu, 3 Dec 2015 20:47:16 +0000 Subject: [PATCH 415/445] Forcepowers: AI & other improvements NPCs now use destruction and stasis forcepowers if they have them. Stasis can now be used on the player and should work a little better. Disable some unimplemented powers for release. Destruction uses custom projectile. It's no longer pushable, but does less damage to forceusers. Version of repulse. Fix stasis crash. --- code/cgame/FX_Destruction.cpp | 68 ++++ code/cgame/cg_consolecmds.cpp | 1 - code/cgame/cg_ents.cpp | 12 + code/cgame/cg_local.h | 4 + code/cgame/cg_media.h | 5 + code/cgame/cg_players.cpp | 18 +- code/cgame/cg_predict.cpp | 2 + code/cgame/cg_weapons.cpp | 24 +- code/client/cl_input.cpp | 3 + code/game/AI_Jedi.cpp | 12 + code/game/CMakeLists.txt | 2 + code/game/bg_pangles.cpp | 20 +- code/game/bg_panimate.cpp | 3 +- code/game/bg_pmove.cpp | 16 +- code/game/bg_public.h | 1 + code/game/fp_repulse.cpp | 715 +++++++++++++++++++++++++++++++++ code/game/g_active.cpp | 16 +- code/game/g_cmds.cpp | 5 - code/game/g_combat.cpp | 46 +++ code/game/wp_saber.cpp | 192 +++++++-- code/game/wp_sonic_blaster.cpp | 4 +- code/qcommon/msg.cpp | 2 + code/qcommon/q_shared.h | 5 + code/ui/ui_shared.cpp | 2 +- 24 files changed, 1100 insertions(+), 78 deletions(-) create mode 100644 code/cgame/FX_Destruction.cpp create mode 100644 code/game/fp_repulse.cpp diff --git a/code/cgame/FX_Destruction.cpp b/code/cgame/FX_Destruction.cpp new file mode 100644 index 0000000000..c33a91a893 --- /dev/null +++ b/code/cgame/FX_Destruction.cpp @@ -0,0 +1,68 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +// Force Destruction Effects + +#include "cg_headers.h" + +#include "cg_media.h" +#include "FxScheduler.h" + +/* +--------------------------- +FX_DestructionProjectileThink +--------------------------- +*/ + +void FX_DestructionProjectileThink( centity_t *cent, const struct weaponInfo_s *weapon ) +{ + vec3_t forward; + + if ( VectorNormalize2( cent->currentState.pos.trDelta, forward ) == 0.0f ) + { + forward[2] = 1.0f; + } + + theFxScheduler.PlayEffect( cgs.effects.destructionProjectile, cent->lerpOrigin, forward ); +} + +/* +--------------------------- +FX_DestructionHitWall +--------------------------- +*/ + +void FX_DestructionHitWall( vec3_t origin, vec3_t normal ) +{ + theFxScheduler.PlayEffect( cgs.effects.destructionHit, origin, normal ); +} + +/* +--------------------------- +FX_DestructionHitPlayer +--------------------------- +*/ + +void FX_DestructionHitPlayer( vec3_t origin, vec3_t normal, qboolean humanoid ) +{ + theFxScheduler.PlayEffect( cgs.effects.destructionHit, origin, normal ); +} diff --git a/code/cgame/cg_consolecmds.cpp b/code/cgame/cg_consolecmds.cpp index 4faae97b0c..beee63c588 100644 --- a/code/cgame/cg_consolecmds.cpp +++ b/code/cgame/cg_consolecmds.cpp @@ -296,7 +296,6 @@ static const char *gcmds[] = { "force_protect", "force_pull", "force_rage", - "force_repulse", "force_sight", "force_speed", "force_stasis", diff --git a/code/cgame/cg_ents.cpp b/code/cgame/cg_ents.cpp index 4c8ea97538..098933556c 100644 --- a/code/cgame/cg_ents.cpp +++ b/code/cgame/cg_ents.cpp @@ -1174,6 +1174,18 @@ static void CG_Missile( centity_t *cent ) { return; } } + else if (s1->powerups & (1<weapon == WP_CONCUSSION ) + { + FX_DestructionProjectileThink( cent, weapon ); + cgi_R_AddLightToScene(cent->lerpOrigin, 125, + 1.0, 0.25, 0.75 ); + cgi_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, vec3_origin, cgs.media.destructionSound); + return; + + } + } else if ( cent->gent->alt_fire ) { // add trails diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index 7cf945631d..d4f3b296d1 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -1184,6 +1184,10 @@ void FX_CloneBlasterAltFireThink( centity_t *cent, const struct weaponInfo_s *we void FX_CloneBlasterWeaponHitWall( vec3_t origin, vec3_t normal ); void FX_CloneBlasterWeaponHitPlayer( gentity_t *hit, vec3_t origin, vec3_t normal, qboolean humanoid ); +void FX_DestructionProjectileThink( centity_t *cent, const struct weaponInfo_s *weapon ); +void FX_DestructionHitWall( vec3_t origin, vec3_t normal ); +void FX_DestructionHitPlayer( vec3_t origin, vec3_t normal, qboolean humanoid ); + void CG_BounceEffect( centity_t *cent, int weapon, vec3_t origin, vec3_t normal ); void CG_MissileStick( centity_t *cent, int weapon, vec3_t origin ); diff --git a/code/cgame/cg_media.h b/code/cgame/cg_media.h index c47973e8ab..cd72986f28 100644 --- a/code/cgame/cg_media.h +++ b/code/cgame/cg_media.h @@ -324,6 +324,8 @@ typedef struct { //new stuff for Jedi Academy sfxHandle_t drainSound; + + sfxHandle_t destructionSound; } cgMedia_t; @@ -374,6 +376,9 @@ typedef struct fxHandle_t forceDrain; fxHandle_t forceDrainWide; fxHandle_t forceDrained; + + fxHandle_t destructionProjectile; + fxHandle_t destructionHit; //footstep effects fxHandle_t footstepMud; diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index 3ea52c5515..7d69ee0049 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -2521,7 +2521,8 @@ static void CG_G2PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t angles ) qboolean looking = qfalse, talking = qfalse; if ( cent->gent - && (cent->gent->flags&FL_NO_ANGLES) ) + && ((cent->gent->flags&FL_NO_ANGLES) + || (cent->gent->client && cent->gent->client->ps.stasisTime > cg.time ))) {//flatten out all bone angles we might have been overriding cent->lerpAngles[PITCH] = cent->lerpAngles[ROLL] = 0; VectorCopy( cent->lerpAngles, angles ); @@ -4144,7 +4145,11 @@ static void CG_ForcePushRefraction( vec3_t org, centity_t *cent, float scaleFact } //scale from 1.0f to 0.1f then hold at 0.1 for the rest of the duration - if (cent->gent->client->ps.forcePowersActive & ( 1 << FP_PULL ) ) + if (cent->gent->client->ps.forcePowersActive & ( 1 << FP_REPULSE ) ) + { + scale = 1.0f; + } + else if (cent->gent->client->ps.forcePowersActive & ( 1 << FP_PULL ) ) { scale = (float)(REFRACT_EFFECT_DURATION-tDif)*0.003f; } @@ -4162,7 +4167,14 @@ static void CG_ForcePushRefraction( vec3_t org, centity_t *cent, float scaleFact } //start alpha at 244, fade to 10 - alpha = (float)tDif*0.488f; + if (cent->gent->client->ps.forcePowersActive & ( 1 << FP_REPULSE ) ) + { + alpha = 244.0f; + } + else + { + alpha = (float)tDif*0.488f; + } if (alpha > 244.0f) { diff --git a/code/cgame/cg_predict.cpp b/code/cgame/cg_predict.cpp index cf89330651..32166b53c4 100644 --- a/code/cgame/cg_predict.cpp +++ b/code/cgame/cg_predict.cpp @@ -637,6 +637,7 @@ to ease the jerk. ================= */ extern qboolean player_locked; +extern qboolean PlayerAffectedByStasis( void ); void CG_PredictPlayerState( void ) { int cmdNum, current; playerState_t oldPlayerState; @@ -748,6 +749,7 @@ void CG_PredictPlayerState( void ) { gentity_t *ent = &g_entities[0];//cheating and dirty, I know, but this is a SP game so prediction can cheat if ( player_locked || + PlayerAffectedByStasis() || (ent && !ent->s.number&&ent->aimDebounceTime>level.time) || (ent && ent->client && ent->client->ps.pm_time && (ent->client->ps.pm_flags&PMF_TIME_KNOCKBACK)) || (ent && ent->forcePushTime > level.time) ) diff --git a/code/cgame/cg_weapons.cpp b/code/cgame/cg_weapons.cpp index 8885012dfd..308e2f2428 100644 --- a/code/cgame/cg_weapons.cpp +++ b/code/cgame/cg_weapons.cpp @@ -261,7 +261,11 @@ void CG_RegisterWeapon( int weaponNum ) { cgs.effects.forceDrain = theFxScheduler.RegisterEffect( "mp/drain" ); cgs.effects.forceDrainWide = theFxScheduler.RegisterEffect( "mp/drainwide" ); //cgs.effects.forceDrained = theFxScheduler.RegisterEffect( "mp/drainhit"); - + + cgs.effects.destructionProjectile = theFxScheduler.RegisterEffect( "destruction/shot" ); + cgs.effects.destructionHit = theFxScheduler.RegisterEffect( "destruction/explosion" ); + cgs.media.destructionSound = cgi_S_RegisterSound( "sound/weapons/concussion/missleloop.wav" ); + //saber sounds //cgi_S_RegisterSound( "sound/weapons/saber/saberon.wav" ); //cgi_S_RegisterSound( "sound/weapons/saber/enemy_saber_on.wav" ); @@ -3391,7 +3395,14 @@ void CG_MissileHitWall( centity_t *cent, int weapon, vec3_t origin, vec3_t dir, break; case WP_CONCUSSION: - FX_ConcHitWall( origin, dir ); + if (cent->currentState.powerups & (1<currentState.powerups & (1<enemy && NPC->enemy->client && NPC->enemy->client->ps.stasisTime < level.time) + { + ForceStasis( NPC ); + TIMER_Set( NPC, "attackDelay", NPC->client->ps.weaponTime ); + } + else if ( WP_ForcePowerUsable( NPC, FP_DESTRUCTION, 0 ) && Q_irand(0, 1)) + { + ForceDestruction( NPC ); + TIMER_Set( NPC, "attackDelay", NPC->client->ps.weaponTime ); + } else { if ( WP_ForcePowerUsable( NPC, FP_SABERTHROW, 0 ) diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index f6d1126d77..a878533c5b 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -63,6 +63,7 @@ set(SPGameGameFiles "${SPDir}/game/AI_Tusken.cpp" "${SPDir}/game/AI_Utils.cpp" "${SPDir}/game/AI_Wampa.cpp" + "${SPDir}/game/fp_repulse.cpp" "${SPDir}/game/g_active.cpp" "${SPDir}/game/g_breakable.cpp" "${SPDir}/game/g_camera.cpp" @@ -219,6 +220,7 @@ set(SPGameCGameFiles "${SPDir}/cgame/FX_BryarPistol.cpp" "${SPDir}/cgame/FX_Clone.cpp" "${SPDir}/cgame/FX_Concussion.cpp" + "${SPDir}/cgame/FX_Destruction.cpp" "${SPDir}/cgame/FX_DEMP2.cpp" "${SPDir}/cgame/FX_Disruptor.cpp" "${SPDir}/cgame/FX_Emplaced.cpp" diff --git a/code/game/bg_pangles.cpp b/code/game/bg_pangles.cpp index d92f216dd1..f791b025d4 100644 --- a/code/game/bg_pangles.cpp +++ b/code/game/bg_pangles.cpp @@ -49,6 +49,7 @@ extern qboolean PM_InGetUpNoRoll( playerState_t *ps ); extern Vehicle_t *G_IsRidingVehicle( gentity_t *ent ); extern void WP_ForcePowerDrain( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); extern qboolean G_ControlledByPlayer( gentity_t *self ); +extern qboolean PlayerAffectedByStasis( void ); extern qboolean cg_usingInFrontOf; extern qboolean player_locked; @@ -517,7 +518,7 @@ qboolean PM_AdjustAngleForWallRun( gentity_t *ent, usercmd_t *ucmd, qboolean doM {//still a vertical wall there //FIXME: don't pull around 90 turns //FIXME: simulate stepping up steps here, somehow? - if ( (ent->s.number>=MAX_CLIENTS&&!G_ControlledByPlayer(ent)) || !player_locked ) + if ( (ent->s.number>=MAX_CLIENTS&&!G_ControlledByPlayer(ent)) || (!player_locked && !PlayerAffectedByStasis()) ) { if ( ent->client->ps.legsAnim == BOTH_WALL_RUN_RIGHT ) { @@ -543,7 +544,7 @@ qboolean PM_AdjustAngleForWallRun( gentity_t *ent, usercmd_t *ucmd, qboolean doM SetClientViewAngle( ent, ent->client->ps.viewangles ); } ucmd->angles[YAW] = ANGLE2SHORT( ent->client->ps.viewangles[YAW] ) - ent->client->ps.delta_angles[YAW]; - if ( (ent->s.number&&!G_ControlledByPlayer(ent)) || !player_locked ) + if ( (ent->s.number&&!G_ControlledByPlayer(ent)) || (!player_locked && !PlayerAffectedByStasis()) ) { if ( doMove ) { @@ -652,7 +653,7 @@ qboolean PM_AdjustAnglesForSpinningFlip( gentity_t *ent, usercmd_t *ucmd, qboole //push me if ( ent->client->ps.legsAnimTimer > 300 )//&& ent->client->ps.groundEntityNum == ENTITYNUM_NONE ) {//haven't landed or reached end of anim yet - if ( (ent->s.number>=MAX_CLIENTS&&!G_ControlledByPlayer(ent)) || !player_locked ) + if ( (ent->s.number>=MAX_CLIENTS&&!G_ControlledByPlayer(ent)) || (!player_locked && !PlayerAffectedByStasis()) ) { vec3_t pushDir, pushAngles = {0,ent->angle,0}; AngleVectors( pushAngles, pushDir, NULL, NULL ); @@ -900,7 +901,7 @@ qboolean PM_AdjustAngleForWallRunUp( gentity_t *ent, usercmd_t *ucmd, qboolean d {//all clear, keep going //FIXME: don't pull around 90 turns //FIXME: simulate stepping up steps here, somehow? - if ( (ent->s.number>=MAX_CLIENTS&&!G_ControlledByPlayer(ent)) || !player_locked ) + if ( (ent->s.number>=MAX_CLIENTS&&!G_ControlledByPlayer(ent)) || (!player_locked && !PlayerAffectedByStasis()) ) { ucmd->forwardmove = 127; } @@ -919,7 +920,7 @@ qboolean PM_AdjustAngleForWallRunUp( gentity_t *ent, usercmd_t *ucmd, qboolean d SetClientViewAngle( ent, ent->client->ps.viewangles ); } ucmd->angles[YAW] = ANGLE2SHORT( ent->client->ps.viewangles[YAW] ) - ent->client->ps.delta_angles[YAW]; - if ( (ent->s.number>=MAX_CLIENTS&&!G_ControlledByPlayer(ent)) || !player_locked ) + if ( (ent->s.number>=MAX_CLIENTS&&!G_ControlledByPlayer(ent)) || (!player_locked && !PlayerAffectedByStasis()) ) { if ( doMove ) { @@ -1059,7 +1060,7 @@ qboolean PM_AdjustAngleForWallJump( gentity_t *ent, usercmd_t *ucmd, qboolean do SetClientViewAngle( ent, ent->client->ps.viewangles ); } ucmd->angles[YAW] = ANGLE2SHORT( ent->client->ps.viewangles[YAW] ) - ent->client->ps.delta_angles[YAW]; - if ( (ent->s.number>=MAX_CLIENTS&&!G_ControlledByPlayer(ent)) || !player_locked ) + if ( (ent->s.number>=MAX_CLIENTS&&!G_ControlledByPlayer(ent)) || (!player_locked && !PlayerAffectedByStasis()) ) { if ( doMove ) { @@ -1356,7 +1357,7 @@ qboolean G_OkayToLean( playerState_t *ps, usercmd_t *cmd, qboolean interruptOkay && !ps->legsAnimTimer//not in any held legs anim && !ps->torsoAnimTimer) //not in any held torso anim ) - && !(cmd->buttons&(BUTTON_ATTACK|BUTTON_ALT_ATTACK|BUTTON_FORCE_LIGHTNING|BUTTON_USE_FORCE|BUTTON_FORCE_DRAIN|BUTTON_FORCEGRIP))//not trying to attack + && !(cmd->buttons&(BUTTON_ATTACK|BUTTON_ALT_ATTACK|BUTTON_FORCE_LIGHTNING|BUTTON_USE_FORCE|BUTTON_FORCE_DRAIN|BUTTON_FORCEGRIP|BUTTON_REPULSE))//not trying to attack //&& (ps->forcePowersActive&(1<velocity, vec3_origin )//not moving && !cg_usingInFrontOf )//use button wouldn't be used for anything else @@ -1402,6 +1403,11 @@ void PM_UpdateViewAngles( playerState_t *ps, usercmd_t *cmd, gentity_t *gent ) return; // no view changes at all } + if ( ps->stasisTime > level.time ) + { + return; + } + // if ( player_locked ) // {//can't turn // return; diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index f0923b3902..d17369794a 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -4588,6 +4588,7 @@ void PM_SaberStartTransAnim( int anim, int entNum, int saberOffenseLevel, float } */ extern qboolean player_locked; +extern qboolean PlayerAffectedByStasis( void ); extern qboolean MatrixMode; float PM_GetTimeScaleMod( gentity_t *gent ) { @@ -4598,7 +4599,7 @@ float PM_GetTimeScaleMod( gentity_t *gent ) && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_ATTACK && gent->client->ps.legsAnim != BOTH_FORCELONGLEAP_LAND ) { - if ( gent && gent->s.clientNum == 0 && !player_locked && gent->client->ps.forcePowersActive&(1<s.clientNum == 0 && !player_locked && !PlayerAffectedByStasis() && gent->client->ps.forcePowersActive&(1<value); } diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 4d31237d6f..fe1e455d18 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -134,6 +134,8 @@ qboolean PM_InReboundJump( int anim ); qboolean PM_ForceJumpingAnim( int anim ); void PM_CmdForRoll( playerState_t *ps, usercmd_t *pCmd ); +extern qboolean PlayerAffectedByStasis( void ); + extern int parryDebounce[]; extern qboolean cg_usingInFrontOf; extern qboolean player_locked; @@ -12993,7 +12995,7 @@ void PM_WeaponLightsaber(void) { if ( !MatrixMode ) {//Special test for Matrix Mode (tm) - if ( pm->ps->clientNum == 0 && !player_locked && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<ps->clientNum == 0 && !player_locked && !PlayerAffectedByStasis() && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<value; } @@ -14187,7 +14189,7 @@ static void PM_Weapon( void ) { if ( !MatrixMode ) {//Special test for Matrix Mode (tm) - if ( pm->ps->clientNum == 0 && !player_locked && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<ps->clientNum == 0 && !player_locked && !PlayerAffectedByStasis() && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<value; } @@ -14353,7 +14355,7 @@ static void PM_VehicleWeapon( void ) { if ( !MatrixMode ) {//Special test for Matrix Mode (tm) - if ( pm->ps->clientNum == 0 && !player_locked && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<ps->clientNum == 0 && !player_locked && !PlayerAffectedByStasis() && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<value; } @@ -14442,9 +14444,6 @@ void PM_CheckForceUseButton( gentity_t *ent, usercmd_t *ucmd ) case FP_DEADLYSIGHT: ForceDeadlySight( ent ); break; - case FP_REPULSE: - ForceRepulse( ent ); - break; case FP_INVULNERABILITY: ForceInvulnerability( ent ); break; @@ -14469,6 +14468,9 @@ void PM_CheckForceUseButton( gentity_t *ent, usercmd_t *ucmd ) case FP_SABERTHROW: ucmd->buttons |= BUTTON_SABERTHROW; break; + case FP_REPULSE: + ucmd->buttons |= BUTTON_REPULSE; + break; // default: // Com_Printf( "Use Force: Unhandled force: %d\n", showPowers[cg.forcepowerSelect]); // break; @@ -14584,7 +14586,7 @@ void PM_SetSpecialMoveValues (void ) { if ( !MatrixMode ) { - if ( pm->ps->clientNum == 0 && !player_locked && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<ps->clientNum == 0 && !player_locked && !PlayerAffectedByStasis() && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<value); } diff --git a/code/game/bg_public.h b/code/game/bg_public.h index 4782ef3d71..53537ce337 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -264,6 +264,7 @@ typedef enum { PW_FORCE_PUSH_RHAND, PW_REFRACT_MUZZLE, PW_FORCE_REPULSE, + PW_FORCE_PROJECTILE, PW_NUM_POWERUPS } powerup_t; diff --git a/code/game/fp_repulse.cpp b/code/game/fp_repulse.cpp new file mode 100644 index 0000000000..e2113f90f0 --- /dev/null +++ b/code/game/fp_repulse.cpp @@ -0,0 +1,715 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#include "g_local.h" +#include "anims.h" +#include "b_local.h" +#include "bg_local.h" +#include "g_functions.h" +#include "wp_saber.h" +#include "g_vehicles.h" +#include "../qcommon/tri_coll_test.h" +#include "../cgame/cg_local.h" + +extern qboolean WP_ForcePowerUsable( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); +extern qboolean WP_ForceThrowable( gentity_t *ent, gentity_t *forwardEnt, gentity_t *self, qboolean pull, float cone, float radius, vec3_t forward ); +extern void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ); +extern void WP_ForceThrowHazardTrooper( gentity_t *self, gentity_t *trooper, qboolean pull ); +extern void WP_ResistForcePush( gentity_t *self, gentity_t *pusher, qboolean noPenalty ); +extern int WP_AbsorbConversion(gentity_t *attacked, int atdAbsLevel, gentity_t *attacker, int atPower, int atPowerLevel, int atForceSpent); +extern qboolean ShouldPlayerResistForceThrow( gentity_t *player, gentity_t *attacker, qboolean pull ); +extern qboolean Rosh_BeingHealed( gentity_t *self ); +extern void G_KnockOffVehicle( gentity_t *pRider, gentity_t *self, qboolean bPull ); +extern void WP_ForceKnockdown( gentity_t *self, gentity_t *pusher, qboolean pull, qboolean strongKnockdown, qboolean breakSaberLock ); +extern qboolean Jedi_WaitingAmbush( gentity_t *self ); +extern void G_ReflectMissile( gentity_t *ent, gentity_t *missile, vec3_t forward ); +extern qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f ); +extern void WP_KnockdownTurret( gentity_t *self, gentity_t *pas ); +extern void WP_SaberDrop( gentity_t *self, gentity_t *saber ); +extern void WP_SaberReturn( gentity_t *self, gentity_t *saber ); +extern qboolean PM_InKnockDown( playerState_t *ps ); +extern void WP_ForcePowerDrain( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); + +extern cvar_t *g_timescale; + +extern int forcePowerNeeded[NUM_FORCE_POWERS]; + +void RepulseDamage( gentity_t *self, gentity_t *enemy, vec3_t location, int damageLevel ) +{ + switch (damageLevel) { + case FORCE_LEVEL_1: + G_Damage( enemy, self, self, NULL, location, 10, DAMAGE_NO_KNOCKBACK, MOD_UNKNOWN ); + break; + case FORCE_LEVEL_2: + G_Damage( enemy, self, self, NULL, location, 25, DAMAGE_NO_KNOCKBACK, MOD_UNKNOWN ); + break; + case FORCE_LEVEL_3: + G_Damage( enemy, self, self, NULL, location, 50, DAMAGE_NO_KNOCKBACK, MOD_UNKNOWN ); + break; + default: + break; + } +} + +void ForceRepulseThrow( gentity_t *self, int chargeTime ) +{ + //shove things around you away + qboolean fake = false; + float dist; + gentity_t *ent, *forwardEnt = NULL; + gentity_t *entityList[MAX_GENTITIES]; + gentity_t *push_list[MAX_GENTITIES]; + int numListedEntities = 0; + vec3_t mins, maxs; + vec3_t v; + int i, e; + int ent_count = 0; + int radius; + vec3_t center, ent_org, size, forward, right, end, dir, fwdangles = {0}; + trace_t tr; + int anim, hold, soundIndex, cost; + int damageLevel = FORCE_LEVEL_0; + + if ( self->health <= 0 ) + { + return; + } + if ( self->client->ps.leanofs ) + {//can't force-throw while leaning + return; + } + if ( self->client->ps.forcePowerDebounce[FP_REPULSE] > level.time ) + {//already pushing- now you can't haul someone across the room, sorry + return; + } + if ( !self->s.number && (cg.zoomMode || in_camera) ) + {//can't force throw/pull when zoomed in or in cinematic + return; + } + if ( self->client->ps.saberLockTime > level.time ) + { + if ( self->client->ps.forcePowerLevel[FP_REPULSE] < FORCE_LEVEL_3 ) + {//this can be a way to break out + return; + } + //else, I'm breaking my half of the saberlock + self->client->ps.saberLockTime = 0; + self->client->ps.saberLockEnemy = ENTITYNUM_NONE; + } + + if ( self->client->ps.legsAnim == BOTH_KNOCKDOWN3 + || (self->client->ps.torsoAnim == BOTH_FORCE_GETUP_F1 && self->client->ps.torsoAnimTimer > 400) + || (self->client->ps.torsoAnim == BOTH_FORCE_GETUP_F2 && self->client->ps.torsoAnimTimer > 900) + || (self->client->ps.torsoAnim == BOTH_GETUP3 && self->client->ps.torsoAnimTimer > 500) + || (self->client->ps.torsoAnim == BOTH_GETUP4 && self->client->ps.torsoAnimTimer > 300) + || (self->client->ps.torsoAnim == BOTH_GETUP5 && self->client->ps.torsoAnimTimer > 500) ) + {//we're face-down, so we'd only be force-push/pulling the floor + return; + } + + radius = forcePushPullRadius[self->client->ps.forcePowerLevel[FP_REPULSE]]; + + if ( !radius ) + {//no ability to do this yet + return; + } + + if ( chargeTime > 2500.0f ) + { + damageLevel = FORCE_LEVEL_3; + } + else if ( chargeTime > 1250.0f ) + { + damageLevel = FORCE_LEVEL_2; + } + else if ( chargeTime > 500.0f ) + { + damageLevel = FORCE_LEVEL_1; + } + + cost = forcePowerNeeded[FP_REPULSE]; + if ( !WP_ForcePowerUsable( self, FP_REPULSE, cost ) ) + { + return; + } + //make sure this plays and that you cannot press fire for about 1 second after this + anim = BOTH_FORCE_2HANDEDLIGHTNING_HOLD; + soundIndex = G_SoundIndex( "sound/weapons/force/repulse.wav" ); + hold = 650; + + int parts = SETANIM_TORSO; + if ( !PM_InKnockDown( &self->client->ps ) ) + { + if ( self->client->ps.saberLockTime > level.time ) + { + self->client->ps.saberLockTime = 0; + self->painDebounceTime = level.time + 2000; + hold += 1000; + parts = SETANIM_BOTH; + } + } + NPC_SetAnim( self, parts, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART ); + self->client->ps.saberMove = self->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in + self->client->ps.saberBlocked = BLOCKED_NONE; + if ( self->client->ps.forcePowersActive&(1<value ); + } + self->client->ps.weaponTime = hold;//was 1000, but want to swing sooner + //do effect... FIXME: build-up or delay this until in proper part of anim + self->client->ps.powerups[PW_FORCE_REPULSE] = level.time + self->client->ps.torsoAnimTimer + 500; + //reset to 0 in case it's still > 0 from a previous push + self->client->pushEffectFadeTime = 0; + + G_Sound( self, soundIndex ); + + VectorCopy( self->client->ps.viewangles, fwdangles ); + //fwdangles[1] = self->client->ps.viewangles[1]; + AngleVectors( fwdangles, forward, right, NULL ); + VectorCopy( self->currentOrigin, center ); + + if ( !numListedEntities ) + { + for ( i = 0 ; i < 3 ; i++ ) + { + mins[i] = center[i] - radius; + maxs[i] = center[i] + radius; + } + + numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); + + for ( e = 0 ; e < numListedEntities ; e++ ) + { + ent = entityList[ e ]; + + if ( !WP_ForceThrowable( ent, forwardEnt, self, qfalse, 0.0f, radius, forward ) ) + { + continue; + } + + //this is all to see if we need to start a saber attack, if it's in flight, this doesn't matter + // find the distance from the edge of the bounding box + for ( i = 0 ; i < 3 ; i++ ) + { + if ( center[i] < ent->absmin[i] ) + { + v[i] = ent->absmin[i] - center[i]; + } else if ( center[i] > ent->absmax[i] ) + { + v[i] = center[i] - ent->absmax[i]; + } else + { + v[i] = 0; + } + } + + VectorSubtract( ent->absmax, ent->absmin, size ); + VectorMA( ent->absmin, 0.5, size, ent_org ); + + //see if they're in front of me + VectorSubtract( ent_org, center, dir ); + VectorNormalize( dir ); + + dist = VectorLength( v ); + + if ( dist >= radius ) + { + continue; + } + + //in PVS? + if ( !ent->bmodel && !gi.inPVS( ent_org, self->client->renderInfo.eyePoint ) ) + {//must be in PVS + continue; + } + + if ( ent != forwardEnt ) + {//don't need to trace against forwardEnt again + //really should have a clear LOS to this thing... + gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, ent_org, self->s.number, MASK_FORCE_PUSH, (EG2_Collision)0, 0 );//was MASK_SHOT, but changed to match above trace and crosshair trace + if ( tr.fraction < 1.0f && tr.entityNum != ent->s.number ) + {//must have clear LOS + continue; + } + } + + // ok, we are within the radius, add us to the incoming list + push_list[ent_count] = ent; + ent_count++; + } + } + + for ( int x = 0; x < ent_count; x++ ) + { + if ( push_list[x]->client ) + { + vec3_t pushDir; + float knockback = 200; + + //SIGH band-aid... + if ( push_list[x]->s.number >= MAX_CLIENTS + && self->s.number < MAX_CLIENTS ) + { + if ( (push_list[x]->client->ps.forcePowersActive&(1<client->ps.forcePowerDebounce[FP_GRIP] < level.time + && push_list[x]->client->ps.forceGripEntityNum == self->s.number ) + { + WP_ForcePowerStop( push_list[x], FP_GRIP ); + } + if ( (push_list[x]->client->ps.forcePowersActive&(1<client->ps.forcePowerDebounce[FP_DRAIN] < level.time + && push_list[x]->client->ps.forceDrainEntityNum == self->s.number ) + { + WP_ForcePowerStop( push_list[x], FP_DRAIN ); + } + } + + if ( Rosh_BeingHealed( push_list[x] ) ) + { + continue; + } + if ( push_list[x]->client->NPC_class == CLASS_HAZARD_TROOPER + && push_list[x]->health > 0 ) + {//living hazard troopers resist push/pull + WP_ForceThrowHazardTrooper( self, push_list[x], qfalse ); + continue; + } + if ( fake ) + {//always resist + WP_ResistForcePush( push_list[x], self, qfalse ); + continue; + } + + int powerLevel, powerUse; + powerLevel = self->client->ps.forcePowerLevel[FP_REPULSE]; + powerUse = FP_REPULSE; + + int modPowerLevel = WP_AbsorbConversion( push_list[x], push_list[x]->client->ps.forcePowerLevel[FP_ABSORB], self, powerUse, powerLevel, forcePowerNeeded[self->client->ps.forcePowerLevel[powerUse]] ); + if (push_list[x]->client->NPC_class==CLASS_ASSASSIN_DROID || + push_list[x]->client->NPC_class==CLASS_HAZARD_TROOPER) + { + modPowerLevel = 0; // devides throw by 10 + } + + //First, if this is the player we're push/pulling, see if he can counter it + if ( modPowerLevel != -1 + && InFront( self->currentOrigin, push_list[x]->client->renderInfo.eyePoint, push_list[x]->client->ps.viewangles, 0.3f ) ) + {//absorbed and I'm in front of them + //counter it + if ( push_list[x]->client->ps.forcePowerLevel[FP_ABSORB] > FORCE_LEVEL_2 ) + {//no reaction at all + } + else + { + WP_ResistForcePush( push_list[x], self, qfalse ); + push_list[x]->client->ps.saberMove = push_list[x]->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in + push_list[x]->client->ps.saberBlocked = BLOCKED_NONE; + } + continue; + } + else if ( !push_list[x]->s.number ) + {//player + if ( ShouldPlayerResistForceThrow(push_list[x], self, qfalse) ) + { + WP_ResistForcePush( push_list[x], self, qfalse ); + push_list[x]->client->ps.saberMove = push_list[x]->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in + push_list[x]->client->ps.saberBlocked = BLOCKED_NONE; + continue; + } + } + else if ( push_list[x]->client && Jedi_WaitingAmbush( push_list[x] ) ) + { + WP_ForceKnockdown( push_list[x], self, qfalse, qtrue, qfalse ); + RepulseDamage( self, push_list[x], tr.endpos, damageLevel ); + continue; + } + + G_KnockOffVehicle( push_list[x], self, qfalse ); + + if ( push_list[x]->client->ps.forceDrainEntityNum == self->s.number + && (self->s.eFlags&EF_FORCE_DRAINED) ) + {//stop them from draining me now, dammit! + WP_ForcePowerStop( push_list[x], FP_DRAIN ); + } + + //okay, everyone else (or player who couldn't resist it)... + if ( ((self->s.number == 0 && Q_irand( 0, 2 ) ) || Q_irand( 0, 2 ) ) && push_list[x]->client && push_list[x]->health > 0 //a living client + && push_list[x]->client->ps.weapon == WP_SABER //Jedi + && push_list[x]->health > 0 //alive + && push_list[x]->client->ps.forceRageRecoveryTime < level.time //not recobering from rage + && ((self->client->NPC_class != CLASS_DESANN&&Q_stricmp("Yoda",self->NPC_type)) || !Q_irand( 0, 2 ) )//only 30% chance of resisting a Desann push + && push_list[x]->client->ps.groundEntityNum != ENTITYNUM_NONE //on the ground + && InFront( self->currentOrigin, push_list[x]->currentOrigin, push_list[x]->client->ps.viewangles, 0.3f ) //I'm in front of him + && ( push_list[x]->client->ps.powerups[PW_FORCE_PUSH] > level.time ||//he's pushing too + (push_list[x]->s.number != 0 && push_list[x]->client->ps.weaponTime < level.time)//not the player and not attacking (NPC jedi auto-defend against pushes) + ) + ) + {//Jedi don't get pushed, they resist as long as they aren't already attacking and are on the ground + if ( push_list[x]->client->ps.saberLockTime > level.time ) + {//they're in a lock + if ( push_list[x]->client->ps.saberLockEnemy != self->s.number ) + {//they're not in a lock with me + continue; + } + else if ( self->client->ps.forcePowerLevel[FP_REPULSE] < FORCE_LEVEL_3 || + push_list[x]->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2 ) + {//they're in a lock with me, but my push is too weak + continue; + } + else + {//we will knock them down + self->painDebounceTime = 0; + self->client->ps.weaponTime = 500; + if ( self->client->ps.forcePowersActive&(1<client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value ); + } + } + } + int resistChance = Q_irand(0, 2); + if ( push_list[x]->s.number >= MAX_CLIENTS ) + {//NPC + if ( g_spskill->integer == 1 ) + {//stupid tweak for graham + resistChance = Q_irand(0, 3); + } + } + if ( modPowerLevel == -1 + && self->client->ps.forcePowerLevel[FP_REPULSE] > FORCE_LEVEL_2 + && !resistChance + && push_list[x]->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_3 ) + {//a level 3 push can even knock down a jedi + if ( PM_InKnockDown( &push_list[x]->client->ps ) ) + {//can't knock them down again + continue; + } + WP_ForceKnockdown( push_list[x], self, qfalse, qfalse, qtrue ); + RepulseDamage( self, push_list[x], tr.endpos, damageLevel ); + } + else + { + WP_ResistForcePush( push_list[x], self, qfalse ); + } + } + else + { + //UGH: FIXME: for enemy jedi, they should probably always do force pull 3, and not your weapon (if player?)! + //shove them + if ( push_list[x]->NPC + && push_list[x]->NPC->jumpState == JS_JUMPING ) + {//don't interrupt a scripted jump + //WP_ResistForcePush( push_list[x], self, qfalse ); + push_list[x]->forcePushTime = level.time + 600; // let the push effect last for 600 ms + continue; + } + + if ( push_list[x]->s.number + && (push_list[x]->message || (push_list[x]->flags&FL_NO_KNOCKBACK)) ) + {//an NPC who has a key + //don't push me... FIXME: maybe can pull the key off me? + WP_ForceKnockdown( push_list[x], self, qfalse, qfalse, qfalse ); + RepulseDamage( self, push_list[x], tr.endpos, damageLevel ); + continue; + } + { + VectorSubtract( push_list[x]->currentOrigin, self->currentOrigin, pushDir ); + knockback -= VectorNormalize( pushDir ); + if ( knockback < 100 ) + { + knockback = 100; + } + //scale for push level + if ( self->client->ps.forcePowerLevel[FP_REPULSE] < FORCE_LEVEL_2 ) + {//maybe just knock them down + knockback /= 3; + } + else if ( self->client->ps.forcePowerLevel[FP_REPULSE] > FORCE_LEVEL_2 ) + {//super-hard push + //Hmm, maybe in this case can even nudge/knockdown a jedi? Especially if close? + //knockback *= 5; + } + } + + if ( modPowerLevel != -1 ) + { + if ( !modPowerLevel ) + { + knockback /= 10.0f; + } + else if ( modPowerLevel == 1 ) + { + knockback /= 6.0f; + } + else// if ( modPowerLevel == 2 ) + { + knockback /= 2.0f; + } + } + //actually push/pull the enemy + G_Throw( push_list[x], pushDir, knockback ); + //make it so they don't actually hurt me when pulled at me... + push_list[x]->forcePuller = self->s.number; + + if ( push_list[x]->client->ps.groundEntityNum != ENTITYNUM_NONE ) + {//if on the ground, make sure they get shoved up some + if ( push_list[x]->client->ps.velocity[2] < knockback ) + { + push_list[x]->client->ps.velocity[2] = knockback; + } + } + + if ( push_list[x]->health > 0 ) + {//target is still alive + if ( (push_list[x]->s.number||(cg.renderingThirdPerson&&!cg.zoomMode)) //NPC or 3rd person player + && ((self->client->ps.forcePowerLevel[FP_REPULSE] < FORCE_LEVEL_2 && push_list[x]->client->ps.forcePowerLevel[FP_PUSH] < FORCE_LEVEL_1)) ) + {//NPC or third person player (without force push/pull skill), and force push/pull level is at 1 + WP_ForceKnockdown( push_list[x], self, qfalse, (knockback>150), qfalse ); + RepulseDamage( self, push_list[x], tr.endpos, damageLevel ); + } + else if ( !push_list[x]->s.number ) + {//player, have to force an anim on him + WP_ForceKnockdown( push_list[x], self, qfalse, (knockback>150), qfalse ); + RepulseDamage( self, push_list[x], tr.endpos, damageLevel ); + } + else + {//NPC and force-push/pull at level 2 or higher + WP_ForceKnockdown( push_list[x], self, qfalse, (knockback>100), qfalse ); + RepulseDamage( self, push_list[x], tr.endpos, damageLevel ); + } + } + push_list[x]->forcePushTime = level.time + 600; // let the push effect last for 600 ms + } + } + else if ( !fake ) + {//not a fake push/pull + if ( push_list[x]->s.weapon == WP_SABER && (push_list[x]->contents&CONTENTS_LIGHTSABER) ) + {//a thrown saber, just send it back + /* + if ( pull ) + {//steal it? + } + else */if ( push_list[x]->owner && push_list[x]->owner->client && push_list[x]->owner->client->ps.SaberActive() && push_list[x]->s.pos.trType == TR_LINEAR && push_list[x]->owner->client->ps.saberEntityState != SES_RETURNING ) + {//it's on and being controlled + //FIXME: prevent it from damaging me? + if ( self->s.number == 0 || Q_irand( 0, 2 ) ) + {//certain chance of throwing it aside and turning it off? + //give it some velocity away from me + //FIXME: maybe actually push or pull it? + if ( Q_irand( 0, 1 ) ) + { + VectorScale( right, -1, right ); + } + G_ReflectMissile( self, push_list[x], right ); + //FIXME: isn't turning off!!! + WP_SaberDrop( push_list[x]->owner, push_list[x] ); + } + else + { + WP_SaberReturn( push_list[x]->owner, push_list[x] ); + } + //different effect? + } + } + else if ( push_list[x]->s.eType == ET_MISSILE + && push_list[x]->s.pos.trType != TR_STATIONARY + && (push_list[x]->s.pos.trType != TR_INTERPOLATE||push_list[x]->s.weapon != WP_THERMAL) )//rolling and stationary thermal detonators are dealt with below + { + vec3_t dir2Me; + VectorSubtract( self->currentOrigin, push_list[x]->currentOrigin, dir2Me ); + float dot = DotProduct( push_list[x]->s.pos.trDelta, dir2Me ); + + if ( push_list[x]->s.eFlags&EF_MISSILE_STICK ) + {//caught a sticky in-air + push_list[x]->s.eType = ET_MISSILE; + push_list[x]->s.eFlags &= ~EF_MISSILE_STICK; + push_list[x]->s.eFlags |= EF_BOUNCE_HALF; + push_list[x]->splashDamage /= 3; + push_list[x]->splashRadius /= 3; + push_list[x]->e_ThinkFunc = thinkF_WP_Explode; + push_list[x]->nextthink = level.time + Q_irand( 500, 3000 ); + } + if ( dot >= 0 ) + {//it's heading towards me + G_ReflectMissile( self, push_list[x], forward ); + } + else + { + VectorScale( push_list[x]->s.pos.trDelta, 1.25f, push_list[x]->s.pos.trDelta ); + } + //deflect sound + //G_Sound( push_list[x], G_SoundIndex( va("sound/weapons/blaster/reflect%d.wav", Q_irand( 1, 3 ) ) ) ); + //push_list[x]->forcePushTime = level.time + 600; // let the push effect last for 600 ms + + if ( push_list[x]->s.eType == ET_MISSILE + && push_list[x]->s.weapon == WP_ROCKET_LAUNCHER + && push_list[x]->damage < 60 ) + {//pushing away a rocket raises it's damage to the max for NPCs + push_list[x]->damage = 60; + } + } + else if ( push_list[x]->svFlags & SVF_GLASS_BRUSH ) + {//break the glass + trace_t tr; + vec3_t pushDir; + float damage = 800; + + AngleVectors( self->client->ps.viewangles, forward, NULL, NULL ); + VectorNormalize( forward ); + VectorMA( self->client->renderInfo.eyePoint, radius, forward, end ); + gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 ); + if ( tr.entityNum != push_list[x]->s.number || tr.fraction == 1.0 || tr.allsolid || tr.startsolid ) + {//must be pointing right at it + continue; + } + + + VectorSubtract( tr.endpos, self->client->renderInfo.eyePoint, pushDir ); + + damage -= VectorNormalize( pushDir ); + if ( damage < 200 ) + { + damage = 200; + } + VectorScale( pushDir, damage, pushDir ); + + G_Damage( push_list[x], self, self, pushDir, tr.endpos, damage, 0, MOD_UNKNOWN ); + } + else if ( push_list[x]->s.eType == ET_MISSILE/*thermal resting on ground*/ + || push_list[x]->s.eType == ET_ITEM + || push_list[x]->e_ThinkFunc == thinkF_G_RunObject || Q_stricmp( "limb", push_list[x]->classname ) == 0 ) + {//general object, toss it + vec3_t pushDir, kvel; + float knockback = 200; + float mass = 200; + + if ( self->enemy //I have an enemy + && push_list[x]->s.eType != ET_ITEM //not an item + && self->client->ps.forcePowerLevel[FP_REPULSE] > FORCE_LEVEL_2 //have push 3 or greater + && InFront(push_list[x]->currentOrigin, self->currentOrigin, self->currentAngles, 0.25f)//object is generally in front of me + && InFront(self->enemy->currentOrigin, self->currentOrigin, self->currentAngles, 0.75f)//enemy is pretty much right in front of me + && InFront(push_list[x]->currentOrigin, self->enemy->currentOrigin, self->enemy->currentAngles, 0.25f)//object is generally in front of enemy + //FIXME: check dist to enemy and clear LOS to enemy and clear Path between object and enemy? + && ( (self->NPC&&(Q_irand(0,RANK_CAPTAIN)NPC->rank) )//NPC with enough skill + ||( self->s.numbermass > TARGETED_OBJECT_PUSH_MASS_MAX ) + {//already pushed too many things + //FIXME: pick closest? + continue; + } + targetedObjectMassTotal += push_list[x]->mass; + */ + VectorSubtract( self->enemy->currentOrigin, push_list[x]->currentOrigin, pushDir ); + } + else + { + VectorSubtract( push_list[x]->currentOrigin, self->currentOrigin, pushDir ); + } + knockback -= VectorNormalize( pushDir ); + if ( knockback < 100 ) + { + knockback = 100; + } + + //FIXME: if pull a FL_FORCE_PULLABLE_ONLY, clear the flag, assuming it's no longer in solid? or check? + VectorCopy( push_list[x]->currentOrigin, push_list[x]->s.pos.trBase ); + push_list[x]->s.pos.trTime = level.time; // move a bit on the very first frame + if ( push_list[x]->s.pos.trType != TR_INTERPOLATE ) + {//don't do this to rolling missiles + push_list[x]->s.pos.trType = TR_GRAVITY; + } + + if ( push_list[x]->e_ThinkFunc == thinkF_G_RunObject && push_list[x]->physicsBounce ) + {//it's a pushable misc_model_breakable, use it's mass instead of our one-size-fits-all mass + mass = push_list[x]->physicsBounce;//same as push_list[x]->mass, right? + } + if ( mass < 50 ) + {//??? + mass = 50; + } + if ( g_gravity->value > 0 ) + { + VectorScale( pushDir, g_knockback->value * knockback / mass * 0.8, kvel ); + kvel[2] = pushDir[2] * g_knockback->value * knockback / mass * 1.5; + } + else + { + VectorScale( pushDir, g_knockback->value * knockback / mass, kvel ); + } + VectorAdd( push_list[x]->s.pos.trDelta, kvel, push_list[x]->s.pos.trDelta ); + if ( g_gravity->value > 0 ) + { + if ( push_list[x]->s.pos.trDelta[2] < knockback ) + { + push_list[x]->s.pos.trDelta[2] = knockback; + } + } + //no trDuration? + if ( push_list[x]->e_ThinkFunc != thinkF_G_RunObject ) + {//objects spin themselves? + //spin it + //FIXME: messing with roll ruins the rotational center??? + push_list[x]->s.apos.trTime = level.time; + push_list[x]->s.apos.trType = TR_LINEAR; + VectorClear( push_list[x]->s.apos.trDelta ); + push_list[x]->s.apos.trDelta[1] = Q_irand( -800, 800 ); + } + + if ( Q_stricmp( "limb", push_list[x]->classname ) == 0 ) + {//make sure it runs it's physics + push_list[x]->e_ThinkFunc = thinkF_LimbThink; + push_list[x]->nextthink = level.time + FRAMETIME; + } + push_list[x]->forcePushTime = level.time + 600; // let the push effect last for 600 ms + push_list[x]->forcePuller = self->s.number;//remember this regardless + if ( push_list[x]->item && push_list[x]->item->giTag == INV_SECURITY_KEY ) + { + AddSightEvent( player, push_list[x]->currentOrigin, 128, AEL_DISCOVERED );//security keys are more important + } + else + { + AddSightEvent( player, push_list[x]->currentOrigin, 128, AEL_SUSPICIOUS );//hmm... or should this always be discovered? + } + } + else if ( push_list[x]->s.weapon == WP_TURRET + && !Q_stricmp( "PAS", push_list[x]->classname ) + && push_list[x]->s.apos.trType == TR_STATIONARY ) + {//a portable turret + WP_KnockdownTurret( self, push_list[x] ); + } + } + } + + WP_ForcePowerDrain(self, FP_REPULSE, cost); + + if ( self->NPC ) + {//NPCs can push more often + //FIXME: vary by rank and game skill? + self->client->ps.forcePowerDebounce[FP_REPULSE] = level.time + 200; + } + else + { + self->client->ps.forcePowerDebounce[FP_REPULSE] = level.time + self->client->ps.torsoAnimTimer + 500; + } +} diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index d056d7c3fa..b44319b64a 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -107,6 +107,8 @@ extern qboolean PM_LockedAnim( int anim ); extern qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLockMode_t lockMode ); extern qboolean G_JediInNormalAI( gentity_t *ent ); +extern qboolean PlayerAffectedByStasis( void ); + extern bool in_camera; extern qboolean player_locked; extern qboolean stop_icarus; @@ -2552,7 +2554,7 @@ qboolean G_CheckClampUcmd( gentity_t *ent, usercmd_t *ucmd ) if ( ent->client->ps.saberMove == LS_A_LUNGE ) {//can't move during lunge ucmd->rightmove = ucmd->upmove = 0; - if ( ent->client->ps.legsAnimTimer > 500 && (ent->s.number || !player_locked) ) + if ( ent->client->ps.legsAnimTimer > 500 && (ent->s.number || (!player_locked && !PlayerAffectedByStasis())) ) { ucmd->forwardmove = 127; } @@ -2583,7 +2585,7 @@ qboolean G_CheckClampUcmd( gentity_t *ent, usercmd_t *ucmd ) if ( ent->client->ps.saberMove == LS_A_JUMP_T__B_ ) {//can't move during leap - if ( ent->client->ps.groundEntityNum != ENTITYNUM_NONE || (!ent->s.number && player_locked) ) + if ( ent->client->ps.groundEntityNum != ENTITYNUM_NONE || (!ent->s.number && (player_locked || PlayerAffectedByStasis())) ) {//hit the ground ucmd->forwardmove = 0; } @@ -3893,6 +3895,7 @@ qboolean G_CheckClampUcmd( gentity_t *ent, usercmd_t *ucmd ) || (ucmd->buttons&BUTTON_FORCEGRIP) || (ucmd->buttons&BUTTON_FORCE_LIGHTNING) || (ucmd->buttons&BUTTON_FORCE_DRAIN) + || (ucmd->buttons&BUTTON_REPULSE) || ucmd->upmove ) {//stop the anim if ( ent->client->ps.legsAnim == BOTH_MEDITATE @@ -3969,7 +3972,7 @@ qboolean G_CheckClampUcmd( gentity_t *ent, usercmd_t *ucmd ) if ( PM_InRoll( &ent->client->ps ) ) { - if ( ent->s.number >= MAX_CLIENTS || !player_locked ) + if ( ent->s.number >= MAX_CLIENTS || (!player_locked && !PlayerAffectedByStasis()) ) { //FIXME: NPCs should try to face us during this roll, so they roll around us...? PM_CmdForRoll( &ent->client->ps, ucmd ); @@ -3997,7 +4000,7 @@ qboolean G_CheckClampUcmd( gentity_t *ent, usercmd_t *ucmd ) {//invalid now VectorClear( ent->client->ps.moveDir ); } - if ( ent->s.number || !player_locked ) + if ( ent->s.number || (!player_locked && !PlayerAffectedByStasis()) ) { switch ( ent->client->ps.legsAnim ) { @@ -4029,7 +4032,7 @@ qboolean G_CheckClampUcmd( gentity_t *ent, usercmd_t *ucmd ) {//invalid now VectorClear( ent->client->ps.moveDir ); } - if ( ent->s.number || !player_locked ) + if ( ent->s.number || (!player_locked && !PlayerAffectedByStasis()) ) { if ( ent->client->ps.legsAnimTimer > 450 ) { @@ -4939,6 +4942,7 @@ extern cvar_t *g_skippingcin; } if ( (player_locked + || PlayerAffectedByStasis() || (ent->client->ps.eFlags&EF_FORCE_GRIPPED) || (ent->client->ps.eFlags&EF_FORCE_DRAINED) || (ent->client->ps.legsAnim==BOTH_PLAYER_PA_1) @@ -4946,7 +4950,7 @@ extern cvar_t *g_skippingcin; || (ent->client->ps.legsAnim==BOTH_PLAYER_PA_3)) && ent->client->ps.pm_type < PM_DEAD ) // unless dead {//lock out player control - if ( !player_locked ) + if ( !player_locked && !PlayerAffectedByStasis() ) { VectorClearM( ucmd->angles ); } diff --git a/code/game/g_cmds.cpp b/code/game/g_cmds.cpp index 0cdae14721..e80370b535 100644 --- a/code/game/g_cmds.cpp +++ b/code/game/g_cmds.cpp @@ -1521,11 +1521,6 @@ void ClientCommand( int clientNum ) { ent = G_GetSelfForPlayerCmd(); ForceDeadlySight(ent); } - else if (Q_stricmp (cmd, "force_repulse") == 0) - { - ent = G_GetSelfForPlayerCmd(); - ForceRepulse(ent); - } else if (Q_stricmp (cmd, "force_invulnerability") == 0) { ent = G_GetSelfForPlayerCmd(); diff --git a/code/game/g_combat.cpp b/code/game/g_combat.cpp index 825eb071ba..ef60842a6c 100644 --- a/code/game/g_combat.cpp +++ b/code/game/g_combat.cpp @@ -5485,6 +5485,28 @@ qboolean G_ImmuneToGas( gentity_t *ent ) return qfalse; } +qboolean G_IsJediClass( gclient_t *client ) +{ + if (!client) + { + return qfalse; + } + switch(client->NPC_class) + { + case CLASS_ALORA: + case CLASS_DESANN: + case CLASS_JEDI: + case CLASS_KYLE: + case CLASS_LUKE: + case CLASS_REBORN: + case CLASS_SHADOWTROOPER: + case CLASS_TAVION: + return qtrue; + default: + return qfalse; + } +} + extern Vehicle_t *G_IsRidingVehicle( gentity_t *ent ); extern void G_StartRoll( gentity_t *ent, int anim ); extern void WP_ForcePowerStart( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); @@ -5802,6 +5824,30 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, const damage *= 6;// more damage to turret things } } + + if ( targ->s.number >= MAX_CLIENTS && mod == MOD_DESTRUCTION ) //Destruction should do less damage to enemies + { + if ( targ->s.weapon == WP_SABER || G_IsJediClass(client)) + { + if (client) + { + switch(client->ps.forcePowerLevel[FP_SABER_DEFENSE]) + { + case FORCE_LEVEL_3: + damage *= 0.4; + break; + case FORCE_LEVEL_2: + damage *= 0.6; + break; + case FORCE_LEVEL_1: + damage *= 0.8; + break; + default: + break; + } + } + } + } if (targ && targ->client diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index a7b3eef93f..f0ecac525a 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -224,7 +224,7 @@ int forcePowerNeeded[NUM_FORCE_POWERS] = 35,//FP_STASIS 20,//FP_BLINDING 90,//FP_DEADLYSIGHT - 40,//FP_REPULSE + 20,//FP_REPULSE 100,//FP_INVULNERABILITY //NUM_FORCE_POWERS }; @@ -7963,7 +7963,7 @@ void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ) } continue; } - else if ( ent->splashDamage && ent->splashRadius ) + else if ( ent->splashDamage && ent->splashRadius && !(ent->s.powerups & (1<s.weapon ) {//only missiles with mass are force-pushable + case WP_CONCUSSION: + //Don't push Destruction projectiles + if (ent->s.powerups & (1<health <= 0 ) { @@ -12911,6 +12917,7 @@ void WP_FireDestruction( gentity_t *ent, int forceLevel ) missile->classname = "rocket_proj"; missile->s.weapon = WP_CONCUSSION; + missile->s.powerups |= (1<mass = 10; // Do the damages @@ -12972,8 +12979,6 @@ void ForceDestruction( gentity_t *self ) return; } - CG_RegisterWeapon( WP_CONCUSSION ); // Temporary! Will have new effects etc soon. - anim = BOTH_FORCEPUSH; soundIndex = G_SoundIndex( "sound/weapons/force/rage.wav" ); @@ -13191,6 +13196,16 @@ void ForceInsanity( gentity_t *self ) } } +qboolean PlayerAffectedByStasis( void ) +{ + gentity_t *ent = &g_entities[0]; + if (ent && ent->client && ent->client->ps.stasisTime > (cg.time ? cg.time : level.time)) + { + return qtrue; + } + return qfalse; +} + extern void PM_SetTorsoAnimTimer( gentity_t *ent, int *torsoAnimTimer, int time ); void ForceStasis( gentity_t *self ) { @@ -13199,7 +13214,7 @@ void ForceStasis( gentity_t *self ) gentity_t *traceEnt; int anim, soundIndex; float currentFrame, animSpeed; - int junk; + int junk, actualTime; if ( self->health <= 0 ) { @@ -13243,18 +13258,46 @@ void ForceStasis( gentity_t *self ) } if(traceEnt->health > 0 && - traceEnt->s.weapon != WP_SABER && traceEnt->client->NPC_class != CLASS_REBORN) + traceEnt->s.weapon != WP_SABER && traceEnt->client && traceEnt->client->NPC_class != CLASS_REBORN) { - //doesn't affect jedi for now...but affects everything else?? - if (traceEnt->client) + int modPowerLevel = WP_AbsorbConversion(traceEnt, traceEnt->client->ps.forcePowerLevel[FP_ABSORB], self, FP_STASIS, self->client->ps.forcePowerLevel[FP_STASIS], forcePowerNeeded[FP_STASIS]); + int actualPowerLevel; + if (modPowerLevel == -1) + { + actualPowerLevel = self->client->ps.forcePowerLevel[FP_STASIS]; + } + else { - traceEnt->client->ps.stasisTime = level.time + stasisTime[self->client->ps.forcePowerLevel[FP_STASIS]];//stuck for 5-10 seconds + actualPowerLevel = modPowerLevel; + } + + if (actualPowerLevel > 0) + { + //doesn't affect jedi for now...but affects everything else?? + if (traceEnt->client) + { + traceEnt->client->ps.stasisTime = level.time + stasisTime[actualPowerLevel];//stuck for 5-10 seconds + VectorClear(traceEnt->client->ps.velocity); + } + + if ( gi.G2API_HaveWeGhoul2Models( traceEnt->ghoul2 ) ) + { + actualTime = (cg.time?cg.time:level.time); + gi.G2API_GetBoneAnimIndex( &traceEnt->ghoul2[traceEnt->playerModel], traceEnt->rootBone, + level.time, ¤tFrame, &junk, &junk, &junk, &animSpeed, NULL ); + + gi.G2API_SetBoneAnimIndex( &traceEnt->ghoul2[traceEnt->playerModel], traceEnt->rootBone, + currentFrame, currentFrame+1, + BONE_ANIM_OVERRIDE_FREEZE/*|BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND*/, animSpeed, level.time, currentFrame, 100 ); + if (traceEnt->headModel > 0) + { + gi.G2API_SetBoneAnimIndex( &traceEnt->ghoul2[traceEnt->headModel], traceEnt->headRootBone, + currentFrame, currentFrame+1, + BONE_ANIM_OVERRIDE_FREEZE/*|BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND*/, animSpeed, level.time, currentFrame, 100 ); + } + } } - gi.G2API_GetBoneAnimIndex( &traceEnt->ghoul2[traceEnt->playerModel], traceEnt->rootBone, - level.time, ¤tFrame, &junk, &junk, &junk, &animSpeed, NULL ); - gi.G2API_SetBoneAnimIndex( &traceEnt->ghoul2[traceEnt->playerModel], traceEnt->rootBone, - currentFrame, currentFrame, - BONE_ANIM_OVERRIDE_FREEZE/*|BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND*/, animSpeed, level.time, -1, 100 ); + } anim = BOTH_FORCEPUSH; @@ -13352,33 +13395,48 @@ void ForceRepulse( gentity_t *self ) { return; } - if ( !WP_ForcePowerUsable( self, FP_REPULSE, 0 ) ) + if ( !self->s.number && (cg.zoomMode || in_camera) ) + {//can't repulse when zoomed in or in cinematic + return; + } + if ( self->client->ps.leanofs ) + {//can't repulse while leaning + return; + } + if ( !WP_ForcePowerUsable( self, FP_REPULSE, 40 ) ) { return; } - - if ( self->client->ps.weaponTime >= 800 ) - {//just did one! + if ( self->client->ps.repulseChargeStart ) + { return; } if ( self->client->ps.saberLockTime > level.time ) {//FIXME: can this be a way to break out? return; } + // Make sure to turn off Force Protection and Force Absorb. + if (self->client->ps.forcePowersActive & (1 << FP_PROTECT) ) + { + WP_ForcePowerStop( self, FP_PROTECT ); + } + if (self->client->ps.forcePowersActive & (1 << FP_ABSORB) ) + { + WP_ForcePowerStop( self, FP_ABSORB ); + } - gi.Printf(S_COLOR_WHITE "Used Force Repulse\n"); - - //TODO: CODE + self->client->ps.repulseChargeStart = level.time; - WP_ForcePowerStart( self, FP_REPULSE, 0 ); + NPC_SetAnim( self, SETANIM_TORSO, BOTH_SWIM_IDLE1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); self->client->ps.saberMove = self->client->ps.saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in self->client->ps.saberBlocked = BLOCKED_NONE; - self->client->ps.weaponTime = 1000; - if ( self->client->ps.forcePowersActive&(1<client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value ); - } + + self->s.loopSound = G_SoundIndex( "sound/weapons/force/lightning2.wav" ); + + //FIXME: build-up or delay this until in proper part of anim + self->client->ps.weaponTime = self->client->ps.torsoAnimTimer; + WP_ForcePowerStart( self, FP_REPULSE, 1 ); } void ForceInvulnerability( gentity_t *self ) @@ -13425,7 +13483,9 @@ int WP_AbsorbConversion(gentity_t *attacked, int atdAbsLevel, gentity_t *attacke atPower != FP_DRAIN && atPower != FP_GRIP && atPower != FP_PUSH && - atPower != FP_PULL) + atPower != FP_PULL && + atPower != FP_REPULSE && + atPower != FP_STASIS) { //Only these powers can be absorbed return -1; } @@ -13646,6 +13706,9 @@ void WP_ForcePowerStart( gentity_t *self, forcePowers_t forcePower, int override self->s.loopSound = G_SoundIndex( "sound/weapons/force/rageloop.wav" ); break; case FP_REPULSE: + self->client->ps.forcePowersActive |= ( 1 << forcePower ); + self->client->ps.powerups[PW_FORCE_REPULSE] = Q3_INFINITE; + self->client->pushEffectFadeTime = 0; break; case FP_INVULNERABILITY: break; @@ -13836,6 +13899,7 @@ qboolean WP_ForcePowerUsable( gentity_t *self, forcePowers_t forcePower, int ove return WP_ForcePowerAvailable( self, forcePower, overrideAmt ); } +extern void ForceRepulseThrow( gentity_t *self, int chargeTime ); void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ) { gentity_t *gripEnt; @@ -14186,6 +14250,14 @@ void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ) self->s.loopSound = 0; break; case FP_REPULSE: + self->client->ps.powerups[PW_FORCE_REPULSE] = 0; + if (self->client->ps.repulseChargeStart) + { + self->s.loopSound = 0; + ForceRepulseThrow(self, level.time - self->client->ps.repulseChargeStart); +// Com_Printf("charge time: %d\n", level.time - self->client->ps.repulseChargeStart); + self->client->ps.repulseChargeStart = 0; + } break; case FP_INVULNERABILITY: break; @@ -15145,6 +15217,37 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd } break; case FP_REPULSE: + if ( (!self->s.number && !(cmd->buttons&BUTTON_REPULSE)) ) + { + WP_ForcePowerStop( self, FP_REPULSE ); + return; + } + else if ( self->client->ps.repulseChargeStart && WP_ForcePowerAvailable(self, FP_REPULSE, forcePowerNeeded[FP_REPULSE] + 5) ) + { + NPC_SetAnim( self, SETANIM_BOTH, BOTH_SWIM_IDLE1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + if ( self->client->ps.torsoAnimTimer < 100 ){//we were already playing this anim, we didn't want to restart it, but we want to hold it for at least 100ms, sooo.... + + self->client->ps.torsoAnimTimer = 100; + } + if ( self->client->ps.legsAnimTimer < 100 ){//we were already playing this anim, we didn't want to restart it, but we want to hold it for at least 100ms, sooo.... + + self->client->ps.legsAnimTimer = 100; + } + if ( !Q_irand( 0, 4 ) ) + { + WP_ForcePowerDrain(self, FP_REPULSE, 1); + } + VectorClear(self->client->ps.velocity); + cmd->forwardmove = 0; + cmd->rightmove = 0; + cmd->upmove = 0; + VectorClear(self->client->ps.moveDir); + } + else + { + WP_ForcePowerStop( self, FP_REPULSE ); + return; + } break; case FP_INVULNERABILITY: break; @@ -15191,18 +15294,18 @@ void WP_CheckForcedPowers( gentity_t *self, usercmd_t *ucmd ) self->client->ps.forcePowersForced &= ~(1<buttons &= ~(BUTTON_ATTACK|BUTTON_ALT_ATTACK|BUTTON_FORCE_FOCUS|BUTTON_FORCE_DRAIN|BUTTON_FORCE_LIGHTNING); + ucmd->buttons &= ~(BUTTON_ATTACK|BUTTON_ALT_ATTACK|BUTTON_FORCE_FOCUS|BUTTON_FORCE_DRAIN|BUTTON_FORCE_LIGHTNING|BUTTON_SABERTHROW|BUTTON_REPULSE); ucmd->buttons |= BUTTON_FORCEGRIP; //holds until cleared break; case FP_LIGHTNING: - ucmd->buttons &= ~(BUTTON_ATTACK|BUTTON_ALT_ATTACK|BUTTON_FORCE_FOCUS|BUTTON_FORCEGRIP|BUTTON_FORCE_DRAIN); + ucmd->buttons &= ~(BUTTON_ATTACK|BUTTON_ALT_ATTACK|BUTTON_FORCE_FOCUS|BUTTON_FORCEGRIP|BUTTON_FORCE_DRAIN|BUTTON_SABERTHROW|BUTTON_REPULSE); ucmd->buttons |= BUTTON_FORCE_LIGHTNING; //holds until cleared break; case FP_SABERTHROW: - ucmd->buttons &= ~(BUTTON_ATTACK|BUTTON_FORCE_FOCUS|BUTTON_FORCEGRIP|BUTTON_FORCE_DRAIN|BUTTON_FORCE_LIGHTNING); - ucmd->buttons |= BUTTON_ALT_ATTACK; + ucmd->buttons &= ~(BUTTON_ATTACK|BUTTON_ALT_ATTACK|BUTTON_FORCE_FOCUS|BUTTON_FORCEGRIP|BUTTON_FORCE_DRAIN|BUTTON_FORCE_LIGHTNING|BUTTON_REPULSE); + ucmd->buttons |= BUTTON_SABERTHROW; //holds until cleared? break; case FP_SABER_DEFENSE: @@ -15227,7 +15330,7 @@ void WP_CheckForcedPowers( gentity_t *self, usercmd_t *ucmd ) self->client->ps.forcePowersForced &= ~(1<buttons &= ~(BUTTON_ATTACK|BUTTON_ALT_ATTACK|BUTTON_FORCE_FOCUS|BUTTON_FORCEGRIP|BUTTON_FORCE_LIGHTNING); + ucmd->buttons &= ~(BUTTON_ATTACK|BUTTON_ALT_ATTACK|BUTTON_FORCE_FOCUS|BUTTON_FORCEGRIP|BUTTON_FORCE_LIGHTNING|BUTTON_SABERTHROW|BUTTON_REPULSE); ucmd->buttons |= BUTTON_FORCE_DRAIN; //holds until cleared break; @@ -15259,8 +15362,8 @@ void WP_CheckForcedPowers( gentity_t *self, usercmd_t *ucmd ) self->client->ps.forcePowersForced &= ~(1<client->ps.forcePowersForced &= ~(1<buttons &= ~(BUTTON_ATTACK|BUTTON_ALT_ATTACK|BUTTON_FORCE_FOCUS|BUTTON_FORCEGRIP|BUTTON_FORCE_LIGHTNING|BUTTON_SABERTHROW|BUTTON_FORCE_DRAIN); + ucmd->buttons |= BUTTON_REPULSE; break; case FP_INVULNERABILITY: ForceInvulnerability( self ); @@ -15327,6 +15430,11 @@ void WP_ForcePowersUpdate( gentity_t *self, usercmd_t *ucmd ) } } } + + if ( ucmd->buttons & BUTTON_REPULSE ) + { + ForceRepulse( self ); + } if ( ucmd->buttons & BUTTON_FORCEGRIP ) { @@ -15444,7 +15552,7 @@ void WP_InitForcePowers( gentity_t *ent ) else { ent->client->ps.forcePowersKnown = ( 1 << FP_HEAL )|( 1 << FP_LEVITATION )|( 1 << FP_SPEED )|( 1 << FP_PUSH )|( 1 << FP_PULL )|( 1 << FP_TELEPATHY )|( 1 << FP_GRIP )|( 1 << FP_LIGHTNING)|( 1 << FP_SABERTHROW)|( 1 << FP_SABER_DEFENSE )|( 1 << FP_SABER_OFFENSE )|( 1<< FP_RAGE )|( 1<< FP_DRAIN )|( 1<< FP_PROTECT )|( 1<< FP_ABSORB )|( 1<< FP_SEE )|( 1 << FP_DESTRUCTION ) - |( 1 << FP_INSANITY )|( 1 << FP_STASIS )|( 1 << FP_BLINDING )|(1 << FP_DEADLYSIGHT)|(1 << FP_REPULSE)|(1 << FP_INVULNERABILITY); + |( 1 << FP_INSANITY )|( 1 << FP_STASIS )/*|( 1 << FP_BLINDING )|(1 << FP_DEADLYSIGHT)|(1 << FP_REPULSE)|(1 << FP_INVULNERABILITY)*/; ent->client->ps.forcePowerLevel[FP_HEAL] = FORCE_LEVEL_2; ent->client->ps.forcePowerLevel[FP_LEVITATION] = FORCE_LEVEL_2; ent->client->ps.forcePowerLevel[FP_PUSH] = FORCE_LEVEL_1; @@ -15467,11 +15575,11 @@ void WP_InitForcePowers( gentity_t *ent ) ent->client->ps.forcePowerLevel[FP_DESTRUCTION] = FORCE_LEVEL_2; ent->client->ps.forcePowerLevel[FP_INSANITY] = FORCE_LEVEL_2; ent->client->ps.forcePowerLevel[FP_STASIS] = FORCE_LEVEL_2; - ent->client->ps.forcePowerLevel[FP_BLINDING] = FORCE_LEVEL_1; + ent->client->ps.forcePowerLevel[FP_BLINDING] = FORCE_LEVEL_0; - ent->client->ps.forcePowerLevel[FP_DEADLYSIGHT] = FORCE_LEVEL_1; - ent->client->ps.forcePowerLevel[FP_REPULSE] = FORCE_LEVEL_1; - ent->client->ps.forcePowerLevel[FP_INVULNERABILITY] = FORCE_LEVEL_1; + ent->client->ps.forcePowerLevel[FP_DEADLYSIGHT] = FORCE_LEVEL_0; + ent->client->ps.forcePowerLevel[FP_REPULSE] = FORCE_LEVEL_0; + ent->client->ps.forcePowerLevel[FP_INVULNERABILITY] = FORCE_LEVEL_0; } } } diff --git a/code/game/wp_sonic_blaster.cpp b/code/game/wp_sonic_blaster.cpp index 5871732c94..afcf1b208b 100644 --- a/code/game/wp_sonic_blaster.cpp +++ b/code/game/wp_sonic_blaster.cpp @@ -36,8 +36,8 @@ extern qboolean Jedi_WaitingAmbush( gentity_t *self ); extern void G_ReflectMissile( gentity_t *ent, gentity_t *missile, vec3_t forward ); extern qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f ); extern void WP_KnockdownTurret( gentity_t *self, gentity_t *pas ); -void WP_SaberDrop( gentity_t *self, gentity_t *saber ); -void WP_SaberReturn( gentity_t *self, gentity_t *saber ); +extern void WP_SaberDrop( gentity_t *self, gentity_t *saber ); +extern void WP_SaberReturn( gentity_t *self, gentity_t *saber ); void WP_SonicBlast( gentity_t *self ) {//FIXME: pass in a target ent so we (an NPC) can push/pull just one targeted ent. //shove things in front of you away diff --git a/code/qcommon/msg.cpp b/code/qcommon/msg.cpp index 51e8722a25..606fdf1f25 100644 --- a/code/qcommon/msg.cpp +++ b/code/qcommon/msg.cpp @@ -1026,6 +1026,8 @@ static const netField_t playerStateFields[] = #ifndef JK2_MODE { PSF(forceRageRecoveryTime), 32 }, + +{ PSF(stasisTime), 32 }, #endif // !JK2_MODE }; diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 78674f06ab..a38da637f2 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -1937,6 +1937,7 @@ class PlayerStateBase int stasisTime; int deadlySightLastChecked; + int repulseChargeStart; #endif // !JK2_MODE void sg_export( @@ -2113,6 +2114,7 @@ class PlayerStateBase saved_game.write(stasisTime); saved_game.write(deadlySightLastChecked); + saved_game.write(repulseChargeStart); #endif // !JK2_MODE } @@ -2290,6 +2292,7 @@ class PlayerStateBase saved_game.read(stasisTime); saved_game.read(deadlySightLastChecked); + saved_game.read(repulseChargeStart); #endif // !JK2_MODE } }; // PlayerStateBase @@ -2320,6 +2323,8 @@ using playerState_t = PlayerStateBase; #define BUTTON_SABERTHROW 512 // set to 128 for base behaviour! +#define BUTTON_REPULSE 1024 + #define MOVE_RUN 120 // if forwardmove or rightmove are >= MOVE_RUN, // then BUTTON_WALKING should be set diff --git a/code/ui/ui_shared.cpp b/code/ui/ui_shared.cpp index e773834a2c..32d7cdd647 100644 --- a/code/ui/ui_shared.cpp +++ b/code/ui/ui_shared.cpp @@ -5608,6 +5608,7 @@ static const char *g_bindCommands[] = { #endif "+force_grip", "+force_lightning", + "+force_repulse", "+forward", "+left", "+lookdown", @@ -5643,7 +5644,6 @@ static const char *g_bindCommands[] = { "force_pull", #ifndef JK2_MODE "force_rage", - "force_repulse", "force_sight", #endif "force_speed", From 6245a42dd184812acd3c6b09710a6cef74851994 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Thu, 3 Dec 2015 23:21:57 +0000 Subject: [PATCH 416/445] Radar: this adds a radar based on the MP version. It allows setting a custom radar icon for NPCs and misc_statics using the "icon" key in the spawner entity, and adds misc_radar_icons. --- code/cgame/cg_draw.cpp | 309 +++++++++++++++++++++++++++++++++++++ code/cgame/cg_ents.cpp | 32 +++- code/cgame/cg_local.h | 5 +- code/cgame/cg_main.cpp | 88 ++++++++++- code/cgame/cg_media.h | 20 +++ code/cgame/cg_players.cpp | 3 + code/game/NPC_spawn.cpp | 12 ++ code/game/Q3_Interface.cpp | 22 ++- code/game/Q3_Interface.h | 3 + code/game/bg_public.h | 1 + code/game/g_functions.cpp | 1 + code/game/g_functions.h | 2 + code/game/g_local.h | 1 + code/game/g_misc.cpp | 43 ++++++ code/game/g_mover.cpp | 6 + code/game/g_shared.h | 4 + code/game/g_spawn.cpp | 5 + code/game/g_utils.cpp | 5 + code/qcommon/q_shared.h | 10 +- 19 files changed, 566 insertions(+), 6 deletions(-) diff --git a/code/cgame/cg_draw.cpp b/code/cgame/cg_draw.cpp index 868f539c24..09341376d8 100644 --- a/code/cgame/cg_draw.cpp +++ b/code/cgame/cg_draw.cpp @@ -3493,6 +3493,312 @@ static float CG_DrawTimer( float y ) { return y + BIGCHAR_HEIGHT + 10; } +/* + ===================== + CG_DrawRadar + ===================== + */ +float cg_radarRange = 2500.0f; + +#define RADAR_RADIUS 60 +#define RADAR_X (580 - RADAR_RADIUS) +#define RADAR_CHAT_DURATION 6000 +#define RADAR_MISSILE_RANGE 3000.0f +#define RADAR_ASTEROID_RANGE 10000.0f +#define RADAR_MIN_ASTEROID_SURF_WARN_DIST 1200.0f + +float CG_DrawRadar ( float y ) +{ + vec4_t color; + float arrow_w; + float arrow_h; + int i; + float arrowBaseScale; + float zScale; + int xOffset = 0; + + if (!cg.snap) + { + return y; + } + + // Make sure the radar should be showing + if ( cg.snap->ps.stats[STAT_HEALTH] <= 0 ) + { + return y; + } + + if ((cg.snap->ps.viewEntity>0&&cg.snap->ps.viewEntity 0 ) + { + CG_DrawPic( RADAR_X + xOffset + RADAR_RADIUS*0.2f, y + RADAR_RADIUS*0.2f, RADAR_RADIUS*1.6f, RADAR_RADIUS*1.6f, cgs.media.radarMaskShader ); + + vec2_t texBottomLeft; + vec2_t texTopRight; + + float xScale = 1.0f / (cgs.radarMap.bottomRight[0] - cgs.radarMap.topLeft[0]); + float yScale = 1.0f / (cgs.radarMap.topLeft[1] - cgs.radarMap.bottomRight[1]); + + texBottomLeft[0] = (cg.predicted_player_state.origin[0] - cg_radarRange - cgs.radarMap.topLeft[0])*xScale; + texBottomLeft[1] = (cg.predicted_player_state.origin[1] - cg_radarRange - cgs.radarMap.bottomRight[1])*yScale; + texTopRight[0] = (cg.predicted_player_state.origin[0] + cg_radarRange - cgs.radarMap.topLeft[0])*xScale; + texTopRight[1] = (cg.predicted_player_state.origin[1] + cg_radarRange - cgs.radarMap.bottomRight[1])*yScale; + cgi_R_DrawRotatePic2( RADAR_X + RADAR_RADIUS, RADAR_RADIUS + y, RADAR_RADIUS*2, RADAR_RADIUS*2, texBottomLeft[0], (1 - texTopRight[1]), texTopRight[0], (1 - texBottomLeft[1]), -90 + cg.predicted_player_state.viewangles[YAW], cgs.radarMap.minimapImage[0] ); + } + + // Draw the radar background image + color[0] = color[1] = color[2] = 1.0f; + color[3] = 0.6f; + cgi_R_SetColor ( color ); + CG_DrawPic( RADAR_X + xOffset, y, RADAR_RADIUS*2, RADAR_RADIUS*2, cgs.media.radarShader ); + + // Draw all of the radar entities. Draw them backwards so players are drawn last + for ( i = cg.radarEntityCount -1 ; i >= 0 ; i-- ) + { + vec3_t dirLook; + vec3_t dirPlayer; + float angleLook; + float anglePlayer; + float angle; + float distance, actualDist; + centity_t* cent; + qboolean farAway = qfalse; + + cent = &cg_entities[cg.radarEntities[i]]; + + // Get the distances first + VectorSubtract ( cg.predicted_player_state.origin, cent->lerpOrigin, dirPlayer ); + dirPlayer[2] = 0; + actualDist = distance = VectorNormalize ( dirPlayer ); + + if ( distance > cg_radarRange * 0.8f) + { + if ( (cent->currentState.eFlags2 & EF2_RADAROBJECT) )//still want to draw the direction + { + distance = cg_radarRange*0.8f; + farAway = qtrue; + } + else + { + continue; + } + } + + distance = distance / cg_radarRange; + distance *= RADAR_RADIUS; + + AngleVectors ( cg.predicted_player_state.viewangles, dirLook, NULL, NULL ); + + dirLook[2] = 0; + anglePlayer = atan2(dirPlayer[0],dirPlayer[1]); + VectorNormalize ( dirLook ); + angleLook = atan2(dirLook[0],dirLook[1]); + angle = angleLook - anglePlayer; + + switch ( cent->currentState.eType ) + { + default: + { + float x; + float ly; + qhandle_t shader; + vec4_t color; + + x = (float)RADAR_X + (float)RADAR_RADIUS + (float)sin (angle) * distance; + ly = y + (float)RADAR_RADIUS + (float)cos (angle) * distance; + + arrowBaseScale = 9.0f; + shader = 0; + zScale = 1.0f; + + if ( !farAway ) + { + //we want to scale the thing up/down based on the relative Z (up/down) positioning + if (cent->lerpOrigin[2] > cg.predicted_player_state.origin[2]) + { //higher, scale up (between 16 and 24) + float dif = (cent->lerpOrigin[2] - cg.predicted_player_state.origin[2]); + + //max out to 1.5x scale at 512 units above local player's height + dif /= 1024.0f; + if (dif > 0.5f) + { + dif = 0.5f; + } + zScale += dif; + } + else if (cent->lerpOrigin[2] < cg.predicted_player_state.origin[2]) + { //lower, scale down (between 16 and 8) + float dif = (cg.predicted_player_state.origin[2] - cent->lerpOrigin[2]); + + //half scale at 512 units below local player's height + dif /= 1024.0f; + if (dif > 0.5f) + { + dif = 0.5f; + } + zScale -= dif; + } + } + + arrowBaseScale *= zScale; + + color[0] = color[1] = color[2] = color[3] = 1.0f; + + // generic enemy index specifies a shader to use for the radar entity. + if ( cent->currentState.radarIcon ) + { + shader = cgs.media.radarIcons[cent->currentState.radarIcon]; + } + else + { + shader = cgs.media.siegeItemShader; + } + + if ( shader ) + { + // Pulse the alpha if time2 is set. time2 gets set when the entity takes pain + if ( (cent->currentState.time2 && cg.time - cent->currentState.time2 < 5000) || + (cent->currentState.time2 == 0xFFFFFFFF) ) + { + if ( (cg.time / 200) & 1 ) + { + color[3] = 0.1f + 0.9f * (float) (cg.time % 200) / 200.0f; + } + else + { + color[3] = 1.0f - 0.9f * (float) (cg.time % 200) / 200.0f; + } + } + + cgi_R_SetColor ( color ); + CG_DrawPic ( x - 4 + xOffset, ly - 4, arrowBaseScale, arrowBaseScale, shader ); + } + } + break; + + + case ET_PLAYER: + { + qhandle_t shader; + vec4_t color; + + gentity_t *radarEnt = &g_entities[ cent->currentState.number ]; + + + if (radarEnt->client->ps.stats[STAT_HEALTH] <= 0) + { + continue; + } + + switch ( radarEnt->client->playerTeam ) + { + case TEAM_ENEMY: + VectorCopy ( colorTable[CT_DKORANGE], color ); + break; + case TEAM_NEUTRAL: + VectorCopy ( colorTable[CT_YELLOW], color ); + break; + case TEAM_PLAYER: + VectorCopy ( colorTable[CT_GREEN], color ); + break; + default: + VectorCopy ( colorTable[CT_DKORANGE], color ); + break; + } + + color[3] = 1.0f; + + arrowBaseScale = 16.0f; + zScale = 1.0f; + + cgi_R_SetColor ( color ); + + if ( cent->currentState.radarIcon ) + { + shader = cgs.media.radarIcons[cent->currentState.radarIcon]; + } + else + { + shader = cgs.media.mAutomapPlayerIcon; + } + + if ( !farAway ) + { + //we want to scale the thing up/down based on the relative Z (up/down) positioning + if (cent->lerpOrigin[2] > cg.predicted_player_state.origin[2]) + { //higher, scale up (between 16 and 32) + float dif = (cent->lerpOrigin[2] - cg.predicted_player_state.origin[2]); + + //max out to 2x scale at 1024 units above local player's height + dif /= 1024.0f; + if (dif > 1.0f) + { + dif = 1.0f; + } + zScale += dif; + } + else if (cent->lerpOrigin[2] < cg.predicted_player_state.origin[2]) + { //lower, scale down (between 16 and 8) + float dif = (cg.predicted_player_state.origin[2] - cent->lerpOrigin[2]); + + //half scale at 512 units below local player's height + dif /= 1024.0f; + if (dif > 0.5f) + { + dif = 0.5f; + } + zScale -= dif; + } + } + + arrowBaseScale *= zScale; + + arrow_w = arrowBaseScale * RADAR_RADIUS / 128; + arrow_h = arrowBaseScale * RADAR_RADIUS / 128; + + if ( cent->currentState.radarIcon ) + { + arrow_w *= 2.0f; + arrow_h *= 2.0f; + CG_DrawPic(0, 0, 0, 0, cgs.media.whiteShader); + CG_DrawRotatePic2( RADAR_X + RADAR_RADIUS + sin (angle) * distance + xOffset, + y + RADAR_RADIUS + cos (angle) * distance, + arrow_w, arrow_h, + 0, shader ); + } + else + { + CG_DrawPic(0, 0, 0, 0, cgs.media.whiteShader); + CG_DrawRotatePic2( RADAR_X + RADAR_RADIUS + sin (angle) * distance + xOffset, + y + RADAR_RADIUS + cos (angle) * distance, + arrow_w, arrow_h, + (360 - cent->lerpAngles[YAW]) + cg.predicted_player_state.viewangles[YAW], shader ); + } + break; + } + } + } + + arrowBaseScale = 16.0f; + + arrow_w = arrowBaseScale * RADAR_RADIUS / 128; + arrow_h = arrowBaseScale * RADAR_RADIUS / 128; + + cgi_R_SetColor ( colorTable[CT_WHITE] ); + CG_DrawRotatePic2( RADAR_X + RADAR_RADIUS + xOffset, y + RADAR_RADIUS, arrow_w, arrow_h, + 0, cgs.media.mAutomapPlayerIcon ); + + return y+(RADAR_RADIUS*2); +} /* ================= @@ -4053,6 +4359,9 @@ static void CG_Draw2D( void ) if (cg_drawTimer.integer) { y=CG_DrawTimer(y); } + if (cg_drawRadar.integer) { + y=CG_DrawRadar(y); + } // don't draw center string if scoreboard is up if ( !CG_DrawScoreboard() ) { diff --git a/code/cgame/cg_ents.cpp b/code/cgame/cg_ents.cpp index 098933556c..de5ab0f7c8 100644 --- a/code/cgame/cg_ents.cpp +++ b/code/cgame/cg_ents.cpp @@ -307,6 +307,16 @@ void ScaleModelAxis(refEntity_t *ent) Ghoul2 Insert End */ +void CG_AddRadarEnt(centity_t *cent) +{ + static const size_t numRadarEnts = ARRAY_LEN( cg.radarEntities ); + if (cg.radarEntityCount >= numRadarEnts) + { + return; + } + cg.radarEntities[cg.radarEntityCount++] = cent->currentState.number; +} + /* ================== CG_General @@ -317,7 +327,14 @@ static void CG_General( centity_t *cent ) refEntity_t ent; entityState_t *s1; +//Check if it's a radar entity + if (cent->currentState.eFlags2 & EF2_RADAROBJECT) + { + CG_AddRadarEnt(cent); + } + s1 = ¢->currentState; + /* Ghoul2 Insert Start */ @@ -339,7 +356,7 @@ Ghoul2 Insert End memset (&ent, 0, sizeof(ent)); // set frame - + if ( cent->currentState.eFlags & EF_DISABLE_SHADER_ANIM ) { // by setting the shader time to the current time, we can force an animating shader to not animate @@ -1115,6 +1132,12 @@ static void CG_Missile( centity_t *cent ) { if ( s1->weapon >= WP_NUM_WEAPONS ) { s1->weapon = 0; } + + if (cent->currentState.eFlags2 & EF2_RADAROBJECT) + { + CG_AddRadarEnt(cent); + } + weapon = &cg_weapons[s1->weapon]; wData = &weaponData[s1->weapon]; @@ -1324,6 +1347,10 @@ Ghoul2 Insert Start /* Ghoul2 Insert End */ + if (cent->currentState.eFlags2 & EF2_RADAROBJECT) + { + CG_AddRadarEnt(cent); + } ent.renderfx = RF_NOSHADOW; @@ -2502,6 +2529,9 @@ void CG_AddPacketEntities( qboolean isPortal ) { AnglesToAxis( cg.autoAngles, cg.autoAxis ); AnglesToAxis( cg.autoAnglesFast, cg.autoAxisFast ); + + // Reset radar entities + cg.radarEntityCount = 0; // generate and add the entity from the playerstate ps = &cg.predicted_player_state; diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index d4f3b296d1..0d54d90876 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -514,7 +514,9 @@ Ghoul2 Insert Start Ghoul2 Insert End */ overrides_t overrides; //for overriding certain third-person camera properties - + + short radarEntityCount; + short radarEntities[32]; } cg_t; @@ -660,6 +662,7 @@ extern vmCvar_t cg_scaleVehicleSensitivity; extern vmCvar_t cg_trueguns; extern vmCvar_t cg_fpls; +extern vmCvar_t cg_drawRadar; extern vmCvar_t cg_trueroll; extern vmCvar_t cg_trueflip; diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 0828e9daa8..15c7a4cc08 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -350,6 +350,8 @@ vmCvar_t cg_ignitionFlare; vmCvar_t cg_trueguns; vmCvar_t cg_fpls; +vmCvar_t cg_drawRadar; + vmCvar_t cg_trueroll; vmCvar_t cg_trueflip; vmCvar_t cg_truespin; @@ -485,6 +487,8 @@ static cvarTable_t cvarTable[] = { { &cg_ignitionFlare, "cg_ignitionFlare", "0", CVAR_ARCHIVE }, + { &cg_drawRadar, "cg_drawRadar", "1", CVAR_ARCHIVE }, + //True View Control cvars { &cg_trueguns, "cg_trueguns", "0", CVAR_ARCHIVE }, { &cg_fpls, "cg_fpls", "0", CVAR_ARCHIVE }, @@ -1169,7 +1173,7 @@ static void CG_RegisterEffects( void ) cgi_R_WorldEffectCommand( effectName ); } - + // Set up the glass effects mini-system. CG_InitGlass(); @@ -1311,6 +1315,66 @@ HUDMenuItem_t otherHUDBits[] = "gfx/mp/f_icon_saber_throw" //FP_SABERTHROW }; */ + +extern int BG_SiegeGetPairedValue(char *buf, char *key, char *outbuf); + +void CG_LoadMinimapImages( void ) +{ + int len = 0; + fileHandle_t f; + char minimapData[1024]; + char readBuffer[MAX_QPATH]; + char fileName[MAX_QPATH]; + + cgs.radarMap.numMinimapImages = 0; + + const char *info = CG_ConfigString( CS_SERVERINFO ); + const char *s = Info_ValueForKey( info, "mapname" ); + + Com_sprintf(fileName, sizeof(fileName), "minimaps/%s.mmp", s); + + len = gi.FS_FOpenFile(fileName, &f, FS_READ); + + if (!f) + { + return; + } + + if (len >= 1024) + { + gi.FS_FCloseFile( f ); + return; + } + + gi.FS_Read(minimapData, len, f); + gi.FS_FCloseFile( f ); + + if ( !BG_SiegeGetPairedValue(minimapData, "bottomRight", readBuffer) ) + { + return; + } + sscanf( readBuffer, "%f %f", &cgs.radarMap.bottomRight[0], &cgs.radarMap.bottomRight[1]); + + if ( !BG_SiegeGetPairedValue(minimapData, "topLeft", readBuffer) ) + { + return; + } + sscanf( readBuffer, "%f %f", &cgs.radarMap.topLeft[0], &cgs.radarMap.topLeft[1]); + + if ( !BG_SiegeGetPairedValue(minimapData, "image", readBuffer) ) + { + return; + } + cgs.radarMap.minimapImage[0] = cgi_R_RegisterShaderNoMip( readBuffer ); + + if ( BG_SiegeGetPairedValue(minimapData, "height", readBuffer) ) + { + cgs.radarMap.minimapHeights[0] = atof(readBuffer); + } + + cgs.radarMap.numMinimapImages = 1; +} + extern void CG_NPC_Precache ( gentity_t *spawner ); qboolean NPCsPrecached = qfalse; /* @@ -1381,6 +1445,8 @@ static void CG_RegisterGraphics( void ) { CG_LoadingString( cgs.mapname ); cgi_R_LoadWorldMap( cgs.mapname ); + + CG_LoadMinimapImages(); cg.loadLCARSStage = 4; CG_LoadingString( "game media shaders" ); @@ -1391,6 +1457,11 @@ static void CG_RegisterGraphics( void ) { cgs.media.smallnumberShaders[i] = cgi_R_RegisterShaderNoMip( sb_t_nums[i] ); cgs.media.chunkyNumberShaders[i] = cgi_R_RegisterShaderNoMip( sb_c_nums[i] ); } + + cgs.media.radarShader = cgi_R_RegisterShaderNoMip ( "gfx/menus/radar/radar.png" ); + cgs.media.siegeItemShader = cgi_R_RegisterShaderNoMip ( "gfx/menus/radar/goalitem_new" ); + cgs.media.mAutomapPlayerIcon = cgi_R_RegisterShaderNoMip ( "gfx/menus/radar/arrow_w_new" ); + cgs.media.radarMaskShader = cgi_R_RegisterShaderNoMip ( "gfx/menus/spradar/mask" ); // FIXME: conditionally do this?? Something must be wrong with inventory item caching..? cgi_R_RegisterModel( "models/items/remote.md3" ); @@ -1809,6 +1880,21 @@ Ghoul2 Insert End // Send off the terrainInfo to the renderer cgi_RE_InitRendererTerrain( terrainInfo ); } + + const char *iconName; + + for ( i = 1 ; i < MAX_ICONS ; i++ ) + { + iconName = ( char *)CG_ConfigString( CS_ICONS + i ); + + if ( !iconName[0] ) + { + break; + } + + cgs.media.radarIcons[i] = cgi_R_RegisterShaderNoMip( iconName ); + } + } //=========================================================================== diff --git a/code/cgame/cg_media.h b/code/cgame/cg_media.h index cd72986f28..8cbfa1b81d 100644 --- a/code/cgame/cg_media.h +++ b/code/cgame/cg_media.h @@ -275,6 +275,14 @@ typedef struct { qhandle_t blackSaberTrailShader; qhandle_t blackSaberBladeShader; qhandle_t blackSaberEndShader; + + //Radar + qhandle_t radarShader; + qhandle_t siegeItemShader; + qhandle_t mAutomapPlayerIcon; + qhandle_t radarMaskShader; + + qhandle_t radarIcons[MAX_ICONS]; // sounds sfxHandle_t disintegrateSound; @@ -393,6 +401,16 @@ typedef struct fxHandle_t landingGravel; } cgEffects_t; +#define MAX_MINIMAPS 1 +typedef struct +{ + int numMinimapImages; + qhandle_t minimapImage[MAX_MINIMAPS]; + float minimapHeights[MAX_MINIMAPS]; + vec2_t topLeft; + vec2_t bottomRight; +} cgRadarMap_t; + // The client game static (cgs) structure hold everything // loaded or calculated from the gamestate. It will NOT @@ -434,6 +452,8 @@ typedef struct { // effects cgEffects_t effects; + + cgRadarMap_t radarMap; } cgs_t; diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index 7d69ee0049..a5b1dfaf80 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -8049,6 +8049,7 @@ CG_Player extern qboolean G_GetRootSurfNameWithVariant( gentity_t *ent, const char *rootSurfName, char *returnSurfName, int returnSize ); extern qboolean G_ControlledByPlayer( gentity_t *self ); extern qboolean G_RagDoll(gentity_t *ent, vec3_t forcedAngles); +extern void CG_AddRadarEnt(centity_t *cent); int cg_saberOnSoundTime[MAX_GENTITIES] = {0}; void CG_Player( centity_t *cent ) { @@ -8100,6 +8101,8 @@ void CG_Player( centity_t *cent ) { { return; } + + CG_AddRadarEnt(cent); G_RagDoll(cent->gent, cent->lerpAngles); diff --git a/code/game/NPC_spawn.cpp b/code/game/NPC_spawn.cpp index b6dbf1b014..d48e1636de 100644 --- a/code/game/NPC_spawn.cpp +++ b/code/game/NPC_spawn.cpp @@ -1552,6 +1552,13 @@ gentity_t *NPC_Spawn_Do( gentity_t *ent, qboolean fullSpawnNow ) newent->message = G_NewString(ent->message);//copy the key name newent->flags |= FL_NO_KNOCKBACK;//don't fall off ledges } + + if ( ent->radarIcon && ent->radarIcon[0] ) + { + newent->svFlags |= SVF_BROADCAST; + newent->s.eFlags2 |= EF2_RADAROBJECT; + newent->s.radarIcon = G_IconIndex(ent->radarIcon); + } // If this is a vehicle we need to see what kind it is so we properlly allocate it. if ( Q_stricmp( ent->classname, "NPC_Vehicle" ) == 0 ) @@ -2037,6 +2044,11 @@ void SP_NPC_spawner( gentity_t *self) { self->svFlags |= SVF_NPC_PRECACHE; } + + if ( self->radarIcon && self->radarIcon[0] ) + { + G_IconIndex(self->radarIcon); + } //We have to load the animation.cfg now because spawnscripts are going to want to set anims and we need to know their length and if they're valid NPC_PrecacheAnimationCFG( self->NPC_type ); diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 81e63df3c4..0935b6e71a 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -508,6 +508,8 @@ stringID_table_t setTable[] = ENUM2STRING(SET_NO_ANGLES), ENUM2STRING(SET_SABER_ORIGIN), ENUM2STRING(SET_SKIN), + ENUM2STRING(SET_RADAR_ICON), + ENUM2STRING(SET_RADAR_OBJECT), { "", SET_ } }; @@ -9649,7 +9651,25 @@ extern void G_SetHeadSkin( gentity_t *ent ); } } break; - + case SET_RADAR_OBJECT: + if ( entID >= 0 && entID < ENTITYNUM_WORLD ) + { + if ( (Q_stricmp("true",(char*)data)==0) ) + { + g_entities[entID].s.eFlags2 |= EF2_RADAROBJECT; + } + else + { + g_entities[entID].s.eFlags2 &= ~EF2_RADAROBJECT; + } + } + break; + case SET_RADAR_ICON: + if ( entID >= 0 && entID < ENTITYNUM_WORLD ) + { + ent->s.radarIcon = G_IconIndex((char*)data); + } + break; default: //DebugPrint( WL_ERROR, "Set: '%s' is not a valid set field\n", type_name ); SetVar( taskID, entID, type_name, data ); diff --git a/code/game/Q3_Interface.h b/code/game/Q3_Interface.h index b4ecd00261..81018237b2 100644 --- a/code/game/Q3_Interface.h +++ b/code/game/Q3_Interface.h @@ -342,6 +342,9 @@ typedef enum //# setType_e //in-bhc tables SET_LEAN,//## %t="LEAN_TYPES" # Lean left, right or stop leaning + + SET_RADAR_ICON, + SET_RADAR_OBJECT, //# #eol SET_ diff --git a/code/game/bg_public.h b/code/game/bg_public.h index 53537ce337..2469a95d10 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -243,6 +243,7 @@ typedef enum { #define EF_BLOCKED_MOVER 0x80000000 // for movers that are blocked - shared with previous //These new EF2_??? flags were added for NPCs, they really should not be used often. Taken from MP. +#define EF2_RADAROBJECT (1<<0) // Show entity in radar / minimap #define EF2_HYPERSPACE (1<<5) // Used to both start the hyperspace effect on the predicted client and to let the vehicle know it can now jump into hyperspace (after turning to face the proper angle) typedef enum { diff --git a/code/game/g_functions.cpp b/code/game/g_functions.cpp index 216dabe38a..0d52e213dc 100644 --- a/code/game/g_functions.cpp +++ b/code/game/g_functions.cpp @@ -336,6 +336,7 @@ void GEntity_UseFunc(gentity_t *self, gentity_t *other, gentity_t *activator) USECASE( misc_weapon_shooter_use ) USECASE( eweb_use ) USECASE( TieFighterUse ); + USECASE( radar_icon_use ); default: Com_Error(ERR_DROP, "GEntity_UseFunc: case %d not handled!\n",self->e_UseFunc); diff --git a/code/game/g_functions.h b/code/game/g_functions.h index 44a3e30017..6305f49523 100644 --- a/code/game/g_functions.h +++ b/code/game/g_functions.h @@ -446,6 +446,7 @@ typedef enum useF_misc_weapon_shooter_use, useF_eweb_use, useF_TieFighterUse, + useF_radar_icon_use, } useFunc_t; // USE functions... @@ -528,6 +529,7 @@ extern void item_spawn_use ( gentity_t *self, gentity_t *other, gentity_t *act extern void NPC_VehicleSpawnUse ( gentity_t *self, gentity_t *other, gentity_t *activator ); extern void misc_weapon_shooter_use ( gentity_t *self, gentity_t *other, gentity_t *activator ); extern void eweb_use ( gentity_t *self, gentity_t *other, gentity_t *activator ); +extern void radar_icon_use ( gentity_t *self, gentity_t *other, gentity_t *activator ); // void (*pain)(gentity_t *self, gentity_t *attacker, int damage,int mod,int hitLoc); typedef enum diff --git a/code/game/g_local.h b/code/game/g_local.h index d1a44b3f71..cc3935188b 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -403,6 +403,7 @@ void SaveRegisteredItems( void ); // int G_ModelIndex( const char *name ); int G_SoundIndex( const char *name ); +int G_IconIndex( const char* name ); /* Ghoul2 Insert Start */ diff --git a/code/game/g_misc.cpp b/code/game/g_misc.cpp index 345b635b43..276efdf00c 100644 --- a/code/game/g_misc.cpp +++ b/code/game/g_misc.cpp @@ -3158,3 +3158,46 @@ void SP_misc_cubemap( gentity_t *ent ) { G_FreeEntity( ent ); } + +/*QUAKED misc_radar_icon (0 0.5 0) (-4 -4 -4) (4 4 4) STARTOFF + Draws a radar icon + + STARTOFF - Starts off + icon - which icon to display + + toggles on and off when targeted + */ + +void radar_icon_use ( gentity_t *ent, gentity_t *other, gentity_t *activator ) +{ + G_ActivateBehavior(ent,BSET_USE); + + ent->misc_dlight_active = (qboolean)!ent->misc_dlight_active; //toggle + if (ent->misc_dlight_active) + { + ent->svFlags |= SVF_BROADCAST; + ent->s.eFlags2 |= EF2_RADAROBJECT; + } + else + { + ent->svFlags &= ~SVF_BROADCAST; + ent->s.eFlags2 &= ~EF2_RADAROBJECT; + } +} + +void SP_misc_radar_icon( gentity_t *self ){ + G_SetOrigin( self, self->s.origin ); + G_SetAngles( self, self->s.angles ); + if ( self->radarIcon && self->radarIcon[0] ) + { + self->s.radarIcon = G_IconIndex( self->radarIcon ); + } + self->e_UseFunc = useF_radar_icon_use; + self->misc_dlight_active = qfalse; + if ( !(self->spawnflags & 1) ) + {//Turn myself on now + GEntity_UseFunc( self, self, self ); + } + gi.linkentity(self); +} + diff --git a/code/game/g_mover.cpp b/code/game/g_mover.cpp index e039a5aca1..2af48918d9 100644 --- a/code/game/g_mover.cpp +++ b/code/game/g_mover.cpp @@ -2202,6 +2202,12 @@ void SP_func_static( gentity_t *ent ) { // yes this is very very evil, but for now (pre-alpha) it's a solution ent->svFlags |= SVF_BROADCAST; // I need to rotate something that is huge and it's touching too many area portals... } + + if ( ent->radarIcon && ent->radarIcon[0] ) + { + ent->s.eFlags2 |= EF2_RADAROBJECT; + ent->s.radarIcon = G_IconIndex(ent->radarIcon); + } if ( ent->spawnflags & 4/*SWITCH_SHADER*/ ) { diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 6248f96c6f..fa7d75c965 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -1294,6 +1294,8 @@ Ghoul2 Insert End //Force effects int forcePushTime; int forcePuller; //who force-pulled me (so we don't damage them if we hit them) + + char *radarIcon; void sg_export( @@ -1483,6 +1485,7 @@ Ghoul2 Insert End saved_game.write(lightLevel); saved_game.write(forcePushTime); saved_game.write(forcePuller); + saved_game.write(radarIcon); } void sg_import( @@ -1672,6 +1675,7 @@ Ghoul2 Insert End saved_game.read(lightLevel); saved_game.read(forcePushTime); saved_game.read(forcePuller); + saved_game.read(radarIcon); } }; #endif //#ifdef GAME_INCLUDE diff --git a/code/game/g_spawn.cpp b/code/game/g_spawn.cpp index 42808951b9..4192f628a7 100644 --- a/code/game/g_spawn.cpp +++ b/code/game/g_spawn.cpp @@ -348,6 +348,7 @@ field_t fields[] = { {"soundSet", FOFS(soundSet), F_LSTRING}, {"mass", FOFS(mass), F_FLOAT}, //really only used for pushable misc_model_breakables + {"icon", FOFS(radarIcon), F_LSTRING}, //q3map stuff {"scale", 0, F_IGNORE}, @@ -620,6 +621,8 @@ void SP_emplaced_gun( gentity_t *self ); void SP_misc_turbobattery( gentity_t *base ); +void SP_misc_radar_icon( gentity_t *self ); + spawn_t spawns[] = { {"info_player_start", SP_info_player_start}, @@ -860,6 +863,8 @@ spawn_t spawns[] = { {"emplaced_gun", SP_emplaced_gun}, {"emplaced_eweb", SP_emplaced_eweb}, + + {"misc_radar_icon", SP_misc_radar_icon}, {NULL, NULL} }; diff --git a/code/game/g_utils.cpp b/code/game/g_utils.cpp index 9273fad527..4572076cd9 100644 --- a/code/game/g_utils.cpp +++ b/code/game/g_utils.cpp @@ -119,6 +119,11 @@ int G_BSPIndex( char *name ) return G_FindConfigstringIndex (name, CS_BSP_MODELS, MAX_SUB_BSP, qtrue); } +int G_IconIndex( const char *name ) { + assert( name && name[0] ); + return G_FindConfigstringIndex (name, CS_ICONS, MAX_ICONS, qtrue); +} + #define FX_ENT_RADIUS 32 //----------------------------- diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index a38da637f2..ad26df2bfd 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -651,6 +651,8 @@ typedef struct { #define MAX_WORLD_FX 66 // was 16 // was 4 #endif // JK2_MODE +#define MAX_ICONS 32 + /* Ghoul2 Insert Start */ @@ -723,7 +725,8 @@ Ghoul2 Insert End */ #define CS_DYNAMIC_MUSIC_STATE (CS_CHARSKINS + MAX_CHARSKINS) #define CS_WORLD_FX (CS_DYNAMIC_MUSIC_STATE + 1) -#define CS_MAX (CS_WORLD_FX + MAX_WORLD_FX) +#define CS_ICONS (CS_WORLD_FX + MAX_WORLD_FX) +#define CS_MAX (CS_ICONS + MAX_ICONS) #if (CS_MAX) > MAX_CONFIGSTRINGS #error overflow: (CS_MAX) > MAX_CONFIGSTRINGS @@ -2449,7 +2452,7 @@ typedef struct entityState_s {// !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!! int number; // entity index int eType; // entityType_t int eFlags; -// int eFlags2; + int eFlags2; trajectory_t pos; // for calculating position trajectory_t apos; // for calculating angles @@ -2520,6 +2523,7 @@ Ghoul2 Insert End #ifndef JK2_MODE qboolean isPortalEnt; + int radarIcon; #endif // !JK2_MODE @@ -2577,6 +2581,7 @@ Ghoul2 Insert End #ifndef JK2_MODE saved_game.write(isPortalEnt); + saved_game.write(radarIcon); #endif // !JK2_MODE } @@ -2634,6 +2639,7 @@ Ghoul2 Insert End #ifndef JK2_MODE saved_game.read(isPortalEnt); + saved_game.read(radarIcon); #endif // !JK2_MODE } } entityState_t; From 782bd7396eb6ae70cecb468a9df222772f2b7725 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sun, 8 Jan 2017 16:05:18 +0000 Subject: [PATCH 417/445] Melee: punches chain normally with g_debugmelee 1 --- code/game/bg_pmove.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index fe1e455d18..b2a854c423 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -13834,7 +13834,7 @@ static void PM_Weapon( void ) PM_CheckKick(); } } - else if ( !(pm->ps->pm_flags&PMF_ATTACK_HELD) ) + else// if ( !(pm->ps->pm_flags&PMF_ATTACK_HELD) ) { anim = PM_PickAnim( pm->gent, BOTH_MELEE1, BOTH_MELEE2 ); } @@ -14154,6 +14154,10 @@ static void PM_Weapon( void ) switch( pm->ps->weapon) { + case WP_MELEE: + //melee with g_debugmelee on + addTime = pm->ps->torsoAnimTimer; + break; case WP_REPEATER: // repeater is supposed to do smoke after sustained bursts pm->ps->weaponShotCount++; From e046a5c6c6c4697254593bb1fba65a2035d6eb8e Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sun, 8 Jan 2017 17:21:55 +0000 Subject: [PATCH 418/445] Boba: Added wrist blaster and vibroblade (originally secret santa) --- code/game/AI_BobaFett.cpp | 218 ++++++++++++++++++++++++++++++++++++++ code/game/AI_BobaFett.h | 21 ++++ code/game/wp_melee.cpp | 16 ++- code/game/wp_saber.cpp | 37 ++++++- 4 files changed, 289 insertions(+), 3 deletions(-) create mode 100644 code/game/AI_BobaFett.h diff --git a/code/game/AI_BobaFett.cpp b/code/game/AI_BobaFett.cpp index 8c5925e254..3f16e01288 100644 --- a/code/game/AI_BobaFett.cpp +++ b/code/game/AI_BobaFett.cpp @@ -34,6 +34,7 @@ along with this program; if not, see . //////////////////////////////////////////////////////////////////////////////////////// #include "b_local.h" #include "../Ravl/CVec.h" +#include "../cgame/cg_local.h" //////////////////////////////////////////////////////////////////////////////////////// @@ -221,6 +222,7 @@ enum EBobaTacticsState //////////////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////////////// +extern void Saber_SithSwordPrecache( void ); void Boba_Precache( void ) { G_SoundIndex( "sound/chars/boba/bf_blast-off.wav" ); @@ -241,6 +243,9 @@ void Boba_Precache( void ) BobaHadDeathScript = false; BobaActive = true; BobaFootStepCount = 0; + + RegisterItem( FindItemForWeapon( WP_EMPLACED_GUN )); //precache the weapon + Saber_SithSwordPrecache(); } //////////////////////////////////////////////////////////////////////////////////////// @@ -584,6 +589,219 @@ void Boba_DoFlameThrower( gentity_t *self ) } } +#include "AI_BobaFett.h" + +wristWeapon_t missileStates[4] = { + {BOBA_MISSILE_ROCKET, FP_FIRST, WP_ROCKET_LAUNCHER, qfalse, 1, BOBA_FLAMEDURATION, 150, BOTH_FORCELIGHTNING_HOLD, qfalse, qtrue, qtrue}, + {BOBA_MISSILE_LASER, FP_GRIP, WP_EMPLACED_GUN, qfalse, 5, BOBA_FLAMEDURATION, 150, BOTH_FORCELIGHTNING_HOLD, qfalse, qtrue, qtrue}, + {BOBA_MISSILE_DART, FP_FIRST, WP_DISRUPTOR, qfalse, 1, 1500, 200, BOTH_PULL_IMPALE_STAB, qfalse, qfalse, qtrue}, + {BOBA_MISSILE_VIBROBLADE, FP_DRAIN, WP_MELEE, qfalse, 1, 1000, 100, BOTH_PULL_IMPALE_STAB, qfalse, qfalse, qfalse} +}; + +void Boba_VibrobladePunch( gentity_t *self ) +{ + int dummyForcePower = FP_DRAIN; + int addTime, oldWeapon; + if ( !self->client->ps.forcePowerDuration[dummyForcePower] ) + { + NPC_SetAnim( self, SETANIM_TORSO, BOTH_PULL_IMPALE_STAB, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + self->client->ps.torsoAnimTimer = 1000; + self->client->ps.forcePowerDuration[dummyForcePower] = 1; + G_SoundOnEnt( self, CHAN_WEAPON, va( "sound/weapons/sword/swing%d.wav", Q_irand( 1, 4 ) ) ); + } + + if ( self->client->ps.torsoAnimTimer > 900 ) + { + return; + } + + if ( self->client->ps.weaponTime > 0 ) + { + return; + } + + if ( self->client->ps.torsoAnimTimer < 50 ) + { + self->client->ps.forcePowerDuration[dummyForcePower] = 0; + self->client->ps.torsoAnimTimer = 0; + return; + } + + mdxaBone_t boltMatrix; + vec3_t muzzlePoint; + vec3_t muzzleDir; + gi.G2API_GetBoltMatrix( self->ghoul2, self->playerModel, self->handRBolt, &boltMatrix, self->currentAngles, self->currentOrigin, (cg.time?cg.time:level.time), + NULL, self->s.modelScale ); + // work the matrix axis stuff into the original axis and origins used. + gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, muzzlePoint ); + gi.G2API_GiveMeVectorFromMatrix( boltMatrix, NEGATIVE_Y, muzzleDir ); + + VectorCopy(muzzlePoint, self->client->renderInfo.muzzlePoint); + VectorCopy(muzzleDir, self->client->renderInfo.muzzleDir); + + oldWeapon = self->s.weapon; + self->s.weapon = WP_MELEE; + + addTime = weaponData[WP_MELEE].fireTime; + self->client->ps.weaponTime += self->client->ps.torsoAnimTimer; + + FireWeapon(self, qfalse); + + self->s.weapon = oldWeapon; + +} + +void Boba_FireWristMissile( gentity_t *self, int whichMissile ) +{ + int addTime, oldWeapon; + qboolean altFire; + int dummyForcePower; + static int shotsFired = 0;//only 5 shots allowed for wristlaser; only 1 for missile launcher or dart + + if ( whichMissile == BOBA_MISSILE_VIBROBLADE ) + { + Boba_VibrobladePunch( self ); + return; + } + + if ( self->s.number >= MAX_CLIENTS ) + { + return; + } + + if ( !self->client ) + { + return; + } + + if ( self->health <= 0 ) + { + return; + } + + if ( self->client->ps.leanofs ) + { + return; + } + + if ( cg.zoomMode || in_camera ) + { + return; + } + + dummyForcePower = missileStates[whichMissile].dummyForcePower; + + if ( !self->client->ps.forcePowerDuration[dummyForcePower] ) + { + NPC_SetAnim( self, SETANIM_TORSO, missileStates[whichMissile].fireAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + self->client->ps.torsoAnimTimer = missileStates[whichMissile].animTimer; + self->client->ps.forcePowerDuration[dummyForcePower] = 1; + shotsFired = 0; + } + + if ( self->client->ps.torsoAnimTimer > missileStates[whichMissile].animTimer - missileStates[whichMissile].animDelay ) + { + return; + } + + if ( self->client->ps.weaponTime > 0 ) + { + return; + } + + if ( missileStates[whichMissile].hold ) + { + if ( self->client->ps.torsoAnimTimer < 150 ) + { + self->client->ps.forcePowerDuration[dummyForcePower] = 150; + return; + } + } + else + { + if ( self->client->ps.torsoAnimTimer < 50 ) + { + self->client->ps.forcePowerDuration[dummyForcePower] = 0; + self->client->ps.torsoAnimTimer = 0; + return; + } + } + + if ( shotsFired >= missileStates[whichMissile].maxShots ) + { + vec3_t ORIGIN = {0, 0, 0}; + G_PlayEffect( G_EffectIndex("repeater/muzzle_smoke"), self->playerModel, missileStates[whichMissile].leftBolt ? self->genericBolt3 : self->handRBolt, self->s.number, ORIGIN); + //play smoke + return; + } + + oldWeapon = self->s.weapon; + + self->s.weapon = missileStates[whichMissile].whichWeapon; + altFire = missileStates[whichMissile].altFire; + if (missileStates[whichMissile].fullyCharged) + { + self->client->ps.weaponChargeTime = 0; + } + + addTime = weaponData[self->s.weapon].fireTime; + self->client->ps.weaponTime += addTime; + self->client->ps.lastShotTime = level.time; + + const weaponData_t *wData = NULL; + const char *effect = NULL; + + wData = &weaponData[self->s.weapon]; + + // Try and get a default muzzle so we have one to fall back on + if ( wData->mMuzzleEffect[0] ) + { + effect = &wData->mMuzzleEffect[0]; + } + + if ( altFire ) + { + // We're alt-firing, so see if we need to override with a custom alt-fire effect + if ( wData->mAltMuzzleEffect[0] ) + { + effect = &wData->mAltMuzzleEffect[0]; + } + } + + if ( effect ) + { + + mdxaBone_t boltMatrix; + vec3_t muzzlePoint; + vec3_t muzzleDir; + gi.G2API_GetBoltMatrix( self->ghoul2, self->playerModel, missileStates[whichMissile].leftBolt ? self->genericBolt3 : self->handRBolt, &boltMatrix, self->currentAngles, self->currentOrigin, (cg.time?cg.time:level.time), + NULL, self->s.modelScale ); + // work the matrix axis stuff into the original axis and origins used. + gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, muzzlePoint ); + gi.G2API_GiveMeVectorFromMatrix( boltMatrix, NEGATIVE_Y, muzzleDir ); + + VectorCopy(muzzlePoint, self->client->renderInfo.muzzlePoint); + VectorCopy(muzzleDir, self->client->renderInfo.muzzleDir); + + G_PlayEffect( effect, muzzlePoint, muzzleDir ); + } + + FireWeapon(self, altFire); + shotsFired++; + + self->s.weapon = oldWeapon; + +} + +void Boba_EndWristMissile( gentity_t *self, int whichMissile ) +{ + if (missileStates[whichMissile].hold) + { + self->client->ps.forcePowerDuration[missileStates[whichMissile].dummyForcePower] = 0; + self->client->ps.torsoAnimTimer = 0; + } +} + //////////////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////////////// diff --git a/code/game/AI_BobaFett.h b/code/game/AI_BobaFett.h new file mode 100644 index 0000000000..6c2dc02dde --- /dev/null +++ b/code/game/AI_BobaFett.h @@ -0,0 +1,21 @@ +#define BOBA_MISSILE_ROCKET 0 +#define BOBA_MISSILE_LASER 1 +#define BOBA_MISSILE_DART 2 +#define BOBA_MISSILE_VIBROBLADE 3 + +extern void Boba_FireWristMissile( gentity_t *self, int whichMissile ); +extern void Boba_EndWristMissile( gentity_t *self, int whichMissile ); + +typedef struct wristWeapon_s { + int theMissile; + int dummyForcePower; + int whichWeapon; + qboolean altFire; + int maxShots; + int animTimer; + int animDelay; + int fireAnim; + qboolean fullyCharged; + qboolean leftBolt; + qboolean hold; +} wristWeapon_t; diff --git a/code/game/wp_melee.cpp b/code/game/wp_melee.cpp index ef15c8a972..de4c007745 100644 --- a/code/game/wp_melee.cpp +++ b/code/game/wp_melee.cpp @@ -26,6 +26,10 @@ along with this program; if not, see . #include "wp_saber.h" #include "w_local.h" +#include "AI_BobaFett.h" + +extern wristWeapon_t missileStates[4]; + void WP_Melee( gentity_t *ent ) //--------------------------------------------------------- { @@ -34,6 +38,7 @@ void WP_Melee( gentity_t *ent ) vec3_t mins, maxs, end; int damage = ent->s.number ? (g_spskill->integer*2)+1 : 3; float range = ent->s.number ? 64 : 32; + qboolean isBobaPlayer = ( !ent->s.number && ent->client->NPC_class == CLASS_BOBAFETT && ent->client->ps.forcePowerDuration[missileStates[BOBA_MISSILE_VIBROBLADE].dummyForcePower]) ? qtrue : qfalse; VectorMA( muzzle, range, forwardVec, end ); @@ -64,11 +69,20 @@ void WP_Melee( gentity_t *ent ) damage *= Q_irand( 1, 2 ); } } + + if (isBobaPlayer) + { + damage = 50; + } if ( tr_ent && tr_ent->takedamage ) { int dflags = DAMAGE_NO_KNOCKBACK; - if (ent->s.weapon == WP_NOGHRI_STICK || ent->s.weapon == WP_TUSKEN_RIFLE) + if (isBobaPlayer) + { + G_Sound( ent, G_SoundIndex( va( "sound/weapons/sword/stab%d.wav", Q_irand( 1, 4 ) ) ) ); + } + else if (ent->s.weapon == WP_NOGHRI_STICK || ent->s.weapon == WP_TUSKEN_RIFLE) { G_Sound( tr_ent, G_SoundIndex( va( "sound/weapons/tusken_staff/stickhit%d.wav", Q_irand( 1, 4 ) ) ) ); } diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index f0ecac525a..c953746b0b 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -29,6 +29,7 @@ along with this program; if not, see . #include "g_vehicles.h" #include "../qcommon/tri_coll_test.h" #include "../cgame/cg_local.h" +#include "AI_BobaFett.h" #define JK2_RAGDOLL_GRIPNOHEALTH @@ -15436,7 +15437,21 @@ void WP_ForcePowersUpdate( gentity_t *self, usercmd_t *ucmd ) ForceRepulse( self ); } - if ( ucmd->buttons & BUTTON_FORCEGRIP ) + if ( !self->s.number + && self->client->NPC_class == CLASS_BOBAFETT ) + {//Boba Fett + if ( ucmd->buttons & BUTTON_FORCEGRIP ) + {//start wrist laser + Boba_FireWristMissile( self, BOBA_MISSILE_LASER ); + return; + } + else if ( self->client->ps.forcePowerDuration[FP_GRIP] ) + { + Boba_EndWristMissile( self, BOBA_MISSILE_LASER ); + return; + } + } + else if ( ucmd->buttons & BUTTON_FORCEGRIP ) { ForceGrip( self ); } @@ -15461,7 +15476,25 @@ void WP_ForcePowersUpdate( gentity_t *self, usercmd_t *ucmd ) ForceLightning( self ); } - if ( ucmd->buttons & BUTTON_FORCE_DRAIN ) + if ( !self->s.number + && self->client->NPC_class == CLASS_BOBAFETT ) + {//Boba Fett + if ( ucmd->buttons & BUTTON_FORCE_DRAIN ) + {//start wrist rocket + Boba_FireWristMissile( self, BOBA_MISSILE_VIBROBLADE ); + //Boba_VibrobladePunch( self ); + return; + } + else if ( self->client->ps.forcePowerDuration[FP_DRAIN] ) + { + Boba_EndWristMissile( self, BOBA_MISSILE_VIBROBLADE ); + //self->client->ps.forcePowerDuration[FP_DRAIN] = 0; + //self->client->ps.torsoAnimTimer = 0; + + return; + } + } + else if ( ucmd->buttons & BUTTON_FORCE_DRAIN ) { if ( !ForceDrain2( self ) ) {//can't drain-grip someone right in front From 37635bc10b4aae62e7a370b08971418872c78af1 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sun, 8 Jan 2017 16:19:03 +0000 Subject: [PATCH 419/445] cvar tweaks for release cvar tweaks for release --- code/cgame/cg_main.cpp | 4 ++-- code/ui/ui_main.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 15c7a4cc08..aeecd592f2 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -481,11 +481,11 @@ static cvarTable_t cvarTable[] = { { &cg_scaleVehicleSensitivity, "cg_scaleVehicleSensitivity", "1", CVAR_ARCHIVE }, - { &cg_SFXSabers, "cg_SFXSabers", "0", CVAR_ARCHIVE }, + { &cg_SFXSabers, "cg_SFXSabers", "1", CVAR_ARCHIVE }, { &cg_SFXSabersGlowSize, "cg_SFXSabersGlowSize", "1.0", CVAR_ARCHIVE }, { &cg_SFXSabersCoreSize, "cg_SFXSabersCoreSize", "1.0", CVAR_ARCHIVE }, - { &cg_ignitionFlare, "cg_ignitionFlare", "0", CVAR_ARCHIVE }, + { &cg_ignitionFlare, "cg_ignitionFlare", "1", CVAR_ARCHIVE }, { &cg_drawRadar, "cg_drawRadar", "1", CVAR_ARCHIVE }, diff --git a/code/ui/ui_main.cpp b/code/ui/ui_main.cpp index 11b6d50c75..cca3149fc3 100644 --- a/code/ui/ui_main.cpp +++ b/code/ui/ui_main.cpp @@ -489,7 +489,7 @@ static cvarTable_t cvarTable[] = { &ui_saber2_skin4, "ui_saber2_skin4", "", 0}, { &ui_saber2_skin5, "ui_saber2_skin5", "", 0}, - { &ui_SFXSabers, "cg_SFXSabers", "0", CVAR_ARCHIVE }, + { &ui_SFXSabers, "cg_SFXSabers", "1", CVAR_ARCHIVE }, { &ui_SFXSabersGlowSize, "cg_SFXSabersGlowSize", "1.0", CVAR_ARCHIVE }, { &ui_SFXSabersCoreSize, "cg_SFXSabersCoreSize", "1.0", CVAR_ARCHIVE }, From 5f7845af2a72df516f96f6b2747d863df33df2b9 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sun, 13 Dec 2015 14:40:10 +0000 Subject: [PATCH 420/445] Ignition flare: can specify custom flare "ignitionFlare" and "ignitionFlare2" in .sab file. For black saber blade, "ignitionFlareBlack" and "ignitionFlareBlack2" --- code/cgame/cg_main.cpp | 35 ++++++++++++++++++++++++++++++ code/cgame/cg_media.h | 3 +++ code/cgame/cg_players.cpp | 37 +++++++++++++++++++++++++++++--- code/game/NPC_stats.cpp | 16 ++++++++++++++ code/game/wp_saberLoad.cpp | 44 ++++++++++++++++++++++++++++++++++++++ code/qcommon/q_shared.h | 4 ++++ 6 files changed, 136 insertions(+), 3 deletions(-) diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index aeecd592f2..2c53c9c145 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -1509,6 +1509,9 @@ static void CG_RegisterGraphics( void ) { cgs.media.blackSaberBladeShader = cgi_R_RegisterShader( "SFX_Sabers/black_blade" ); cgs.media.blackSaberEndShader = cgi_R_RegisterShader( "SFX_Sabers/black_end" ); + cgs.media.ignitionFlare = cgi_R_RegisterShader( "gfx/effects/flare1" ); + cgs.media.blackIgnitionFlare = cgi_R_RegisterShader( "gfx/effects/sabers/flare1black" ); + cg.loadLCARSStage = 5; CG_LoadingString( "game media models" ); @@ -1765,6 +1768,22 @@ Ghoul2 Insert End { cgi_R_RegisterShader( g_entities[i].client->ps.saber[0].g2WeaponMarkShader2 ); } + if ( g_entities[i].client->ps.saber[0].ignitionFlare[0] ) + { + cgi_R_RegisterShader( g_entities[i].client->ps.saber[0].ignitionFlare ); + } + if ( g_entities[i].client->ps.saber[0].ignitionFlare2[0] ) + { + cgi_R_RegisterShader( g_entities[i].client->ps.saber[0].ignitionFlare2 ); + } + if ( g_entities[i].client->ps.saber[0].blackIgnitionFlare[0] ) + { + cgi_R_RegisterShader( g_entities[i].client->ps.saber[0].blackIgnitionFlare ); + } + if ( g_entities[i].client->ps.saber[0].blackIgnitionFlare2[0] ) + { + cgi_R_RegisterShader( g_entities[i].client->ps.saber[0].blackIgnitionFlare2 ); + } if ( g_entities[i].client->ps.saber[1].g2MarksShader[0] ) { cgi_R_RegisterShader( g_entities[i].client->ps.saber[1].g2MarksShader ); @@ -1781,6 +1800,22 @@ Ghoul2 Insert End { cgi_R_RegisterShader( g_entities[i].client->ps.saber[1].g2WeaponMarkShader2 ); } + if ( g_entities[i].client->ps.saber[1].ignitionFlare[0] ) + { + cgi_R_RegisterShader( g_entities[i].client->ps.saber[1].ignitionFlare ); + } + if ( g_entities[i].client->ps.saber[1].ignitionFlare2[0] ) + { + cgi_R_RegisterShader( g_entities[i].client->ps.saber[1].ignitionFlare2 ); + } + if ( g_entities[i].client->ps.saber[1].blackIgnitionFlare[0] ) + { + cgi_R_RegisterShader( g_entities[i].client->ps.saber[1].blackIgnitionFlare ); + } + if ( g_entities[i].client->ps.saber[1].blackIgnitionFlare2[0] ) + { + cgi_R_RegisterShader( g_entities[i].client->ps.saber[1].blackIgnitionFlare2 ); + } CG_RegisterNPCCustomSounds( &g_entities[i].client->clientInfo ); //CG_RegisterNPCEffects( g_entities[i].client->playerTeam ); } diff --git a/code/cgame/cg_media.h b/code/cgame/cg_media.h index 8cbfa1b81d..5dfb1a5ca2 100644 --- a/code/cgame/cg_media.h +++ b/code/cgame/cg_media.h @@ -276,6 +276,9 @@ typedef struct { qhandle_t blackSaberBladeShader; qhandle_t blackSaberEndShader; + qhandle_t ignitionFlare; + qhandle_t blackIgnitionFlare; + //Radar qhandle_t radarShader; qhandle_t siegeItemShader; diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index a5b1dfaf80..4bfa677334 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -8731,6 +8731,7 @@ extern vmCvar_t cg_thirdPersonAlpha; { vec3_t org_; vec3_t RGB = {1.0f,0.75f,0.0f}; + qhandle_t shader = cgs.media.ignitionFlare; CG_RGBForSaberColor( cent->gent->client->ps.saber[saberNum].blade[bladeNum].color, RGB ); char *tagName = va( "*blade%d", bladeNum+1 ); @@ -8741,11 +8742,41 @@ extern vmCvar_t cg_thirdPersonAlpha; // work the matrix axis stuff into the original axis and origins used. gi.G2API_GiveMeVectorFromMatrix(boltMatrix, ORIGIN, org_); - qhandle_t shader = cgi_R_RegisterShader( "gfx/effects/flare1" ); - if ( cent->gent->client->ps.saber[saberNum].crystals & SABER_CRYSTAL_BLACK ) { - shader = cgi_R_RegisterShader( "gfx/effects/sabers/flare1black" ); + shader = cgs.media.blackIgnitionFlare; + + if ( WP_SaberBladeUseSecondBladeStyle(¢->gent->client->ps.saber[saberNum], bladeNum )) + { + if ( cent->gent->client->ps.saber[saberNum].blackIgnitionFlare2[0] ) + { + shader = cgi_R_RegisterShader( cent->gent->client->ps.saber[saberNum].blackIgnitionFlare2 ); + } + } + else + { + if ( cent->gent->client->ps.saber[saberNum].blackIgnitionFlare[0] ) + { + shader = cgi_R_RegisterShader( cent->gent->client->ps.saber[saberNum].blackIgnitionFlare ); + } + } + } + else + { + if ( WP_SaberBladeUseSecondBladeStyle(¢->gent->client->ps.saber[saberNum], bladeNum )) + { + if ( cent->gent->client->ps.saber[saberNum].ignitionFlare2[0] ) + { + shader = cgi_R_RegisterShader( cent->gent->client->ps.saber[saberNum].ignitionFlare2 ); + } + } + else + { + if ( cent->gent->client->ps.saber[saberNum].ignitionFlare[0] ) + { + shader = cgi_R_RegisterShader( cent->gent->client->ps.saber[saberNum].ignitionFlare ); + } + } } FX_AddSprite( org_, cent->gent->client->ps.velocity, NULL, 40.0f, 0.0f, 1.0f, 0.7f, RGB, RGB, Q_flrand(0.0f, 1.0f) * 360, 0.0f, 100.0f, shader, FX_USE_ALPHA ); diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index 6834840d97..9fae79b5e2 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -1864,6 +1864,22 @@ void CG_NPC_Precache ( gentity_t *spawner ) { cgi_R_RegisterShader( saber.g2WeaponMarkShader2 ); } + if ( saber.ignitionFlare[0] ) + { + cgi_R_RegisterShader( saber.ignitionFlare ); + } + if ( saber.ignitionFlare2[0] ) + { + cgi_R_RegisterShader( saber.ignitionFlare2 ); + } + if ( saber.blackIgnitionFlare[0] ) + { + cgi_R_RegisterShader( saber.blackIgnitionFlare ); + } + if ( saber.blackIgnitionFlare2[0] ) + { + cgi_R_RegisterShader( saber.blackIgnitionFlare2 ); + } continue; } diff --git a/code/game/wp_saberLoad.cpp b/code/game/wp_saberLoad.cpp index 6f13ca48d8..501095d790 100644 --- a/code/game/wp_saberLoad.cpp +++ b/code/game/wp_saberLoad.cpp @@ -490,6 +490,10 @@ void WP_SaberSetDefaults( saberInfo_t *saber, qboolean setColors = qtrue ) saber->splashKnockback2 = 0.0f; //0 - amount of splashKnockback, 100% at a distance of 0, 0% at a distance = splashRadius //========================================================================================================================================= saber->holsterPlace = HOLSTER_INVALID; + saber->ignitionFlare[0] = 0; + saber->ignitionFlare2[0] = 0; + saber->blackIgnitionFlare[0] = 0; + saber->blackIgnitionFlare2[0] = 0; } qboolean forcedRGBColours[MAX_BLADES]; @@ -1934,6 +1938,42 @@ static void Saber_ParseHolsterPlace( saberInfo_t *saber, const char **p ) { if ( holsterType >= HOLSTER_NONE && holsterType <= HOLSTER_BACK ) saber->holsterPlace = (holster_locations_t)holsterType; } +static void Saber_ParseIgnitionFlare( saberInfo_t *saber, const char **p ) { + const char *value; + if ( COM_ParseString( p, &value ) ) { + SkipRestOfLine( p ); + return; + } + Q_strncpyz( saber->ignitionFlare, value, sizeof( saber->ignitionFlare ), qtrue ); + //NOTE: registers this on cgame side where it registers all client assets +} +static void Saber_ParseIgnitionFlare2( saberInfo_t *saber, const char **p ) { + const char *value; + if ( COM_ParseString( p, &value ) ) { + SkipRestOfLine( p ); + return; + } + Q_strncpyz( saber->ignitionFlare2, value, sizeof( saber->ignitionFlare2 ), qtrue ); + //NOTE: registers this on cgame side where it registers all client assets +} +static void Saber_ParseIgnitionFlareBlack( saberInfo_t *saber, const char **p ) { + const char *value; + if ( COM_ParseString( p, &value ) ) { + SkipRestOfLine( p ); + return; + } + Q_strncpyz( saber->blackIgnitionFlare, value, sizeof( saber->blackIgnitionFlare ), qtrue ); + //NOTE: registers this on cgame side where it registers all client assets +} +static void Saber_ParseIgnitionFlareBlack2( saberInfo_t *saber, const char **p ) { + const char *value; + if ( COM_ParseString( p, &value ) ) { + SkipRestOfLine( p ); + return; + } + Q_strncpyz( saber->blackIgnitionFlare2, value, sizeof( saber->blackIgnitionFlare2 ), qtrue ); + //NOTE: registers this on cgame side where it registers all client assets +} /* =============== @@ -2144,6 +2184,10 @@ static keywordHash_t saberParseKeywords[] = { { "noClashFlare", Saber_ParseNoClashFlare, NULL }, { "noClashFlare2", Saber_ParseNoClashFlare2, NULL }, { "holsterPlace", Saber_ParseHolsterPlace, NULL }, + { "ignitionFlare", Saber_ParseIgnitionFlare, NULL }, + { "ignitionFlare2", Saber_ParseIgnitionFlare2, NULL }, + { "ignitionFlareBlack", Saber_ParseIgnitionFlareBlack, NULL }, + { "ignitionFlareBlack2", Saber_ParseIgnitionFlareBlack2, NULL }, { NULL, NULL, NULL } }; static keywordHash_t *saberParseKeywordHash[KEYWORDHASH_SIZE]; diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index ad26df2bfd..65b467b83f 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -1076,6 +1076,10 @@ typedef struct saber_crystals_t crystals; holster_locations_t holsterPlace; + char ignitionFlare[MAX_QPATH]; + char ignitionFlare2[MAX_QPATH]; + char blackIgnitionFlare[MAX_QPATH]; + char blackIgnitionFlare2[MAX_QPATH]; //***NOTE: you can only have a maximum of 2 "styles" of blades, so this next value, "bladeStyle2Start" is the number of the first blade to use these value on... all blades before this use the normal values above, all blades at and after this number use the secondary values below*** int bladeStyle2Start; //0 - if set, blades from this number and higher use the following values (otherwise, they use the normal values already set) From d73dda777190d4a865354e0dd5160d1a6b29f7f0 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sun, 13 Dec 2015 15:32:34 +0000 Subject: [PATCH 421/445] Added g_forceRegenTime cvar like in MP. only controls force regen for player --- code/game/g_main.cpp | 4 ++++ code/game/wp_saber.cpp | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 24fb3c992b..560f2049c1 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -246,6 +246,8 @@ cvar_t *g_allowBunnyhopping; cvar_t *g_flippedHolsters; cvar_t *g_noIgniteTwirl; +cvar_t *g_forceRegenTime; + qboolean stop_icarus = qfalse; extern char *G_GetLocationForEnt( gentity_t *ent ); @@ -753,6 +755,8 @@ void G_InitCvars( void ) { g_flippedHolsters = gi.cvar( "g_flippedHolsters", "0", CVAR_ARCHIVE );//if 1, saber faces up when holstered not down g_noIgniteTwirl = gi.cvar( "g_noIgniteTwirl", "0", CVAR_ARCHIVE );//if 1, don't do ignite twirl + + g_forceRegenTime = gi.cvar( "g_forceRegenTime", "100", CVAR_ARCHIVE );//Force regen time cvar similar to MP } /* ============ diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index c953746b0b..33cd7dfc38 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -61,6 +61,7 @@ extern cvar_t *g_debugMelee; extern cvar_t *g_saberRestrictForce; extern cvar_t *g_saberPickuppableDroppedSabers; extern cvar_t *debug_subdivision; +extern cvar_t *g_forceRegenTime; extern qboolean WP_SaberBladeUseSecondBladeStyle( saberInfo_t *saber, int bladeNum ); @@ -15542,11 +15543,20 @@ void WP_ForcePowersUpdate( gentity_t *self, usercmd_t *ucmd ) {//when not using the force, regenerate at 10 points per second if ( self->client->ps.forcePowerRegenDebounceTime < level.time ) { + int regenTime; WP_ForcePowerRegenerate( self, self->client->ps.forcePowerRegenAmount ); - self->client->ps.forcePowerRegenDebounceTime = level.time + self->client->ps.forcePowerRegenRate; + if (!self->s.number && self->client->NPC_class == CLASS_PLAYER) + { + regenTime = Q_max(g_forceRegenTime->integer, 1); + } + else + { + regenTime = self->client->ps.forcePowerRegenRate; + } + self->client->ps.forcePowerRegenDebounceTime = level.time + regenTime; if ( self->client->ps.forceRageRecoveryTime >= level.time ) {//regen half as fast - self->client->ps.forcePowerRegenDebounceTime += self->client->ps.forcePowerRegenRate; + self->client->ps.forcePowerRegenDebounceTime += regenTime; } } } From 12b8a24c9b24983bb441ecad5449aa600422cdbd Mon Sep 17 00:00:00 2001 From: redsaurus Date: Mon, 14 Dec 2015 17:15:56 +0000 Subject: [PATCH 422/445] Galak Mech support Galak Mech tweaks --- code/cgame/cg_main.cpp | 2 +- code/cgame/cg_players.cpp | 6 +- code/game/AI_GalakMech.cpp | 1656 +++++++++++++++++++++++------------- code/game/AI_Vehicle.cpp | 766 +++++++++++++++++ code/game/CMakeLists.txt | 1 + code/game/NPC.cpp | 9 + code/game/NPC_spawn.cpp | 5 + code/game/NPC_stats.cpp | 6 + code/game/anims.h | 8 + code/game/bg_panimate.cpp | 30 +- code/game/g_client.cpp | 10 + code/game/g_functions.cpp | 1 + code/game/g_functions.h | 1 + 13 files changed, 1914 insertions(+), 587 deletions(-) create mode 100644 code/game/AI_Vehicle.cpp diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 2c53c9c145..db7cca94df 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -1484,7 +1484,7 @@ static void CG_RegisterGraphics( void ) { // FIXME: do these conditionally cgi_R_RegisterShader( "gfx/2d/workingCamera" ); cgi_R_RegisterShader( "gfx/2d/brokenCamera" ); - //cgi_R_RegisterShader( "gfx/effects/irid_shield" ); // for galak, but he doesn't have his own weapon so I can't register the shader there. + cgi_R_RegisterShader( "gfx/effects/irid_shield" ); // for galak, but he doesn't have his own weapon so I can't register the shader there. //interface for ( i = 0 ; i < NUM_CROSSHAIRS ; i++ ) { diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index 4bfa677334..dea7cd13b9 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -5019,9 +5019,9 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen // Galak Mech shield bubble //------------------------------------------------------ - if ( powerups & ( 1 << PW_GALAK_SHIELD )) + if ( powerups & ( 1 << PW_GALAK_SHIELD ) && cent->gent->client->NPC_class == CLASS_GALAKMECH ) { -/* refEntity_t tent; + refEntity_t tent; memset( &tent, 0, sizeof( refEntity_t )); @@ -5048,7 +5048,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen tent.endTime = gent->fx_time + 1000; // if you want the shell to build around the guy, pass in a time that is 1000ms after the start of the turn-on-effect tent.customShader = cgi_R_RegisterShader( "gfx/effects/irid_shield" ); - cgi_R_AddRefEntityToScene( &tent );*/ + cgi_R_AddRefEntityToScene( &tent ); } // Invincibility -- effect needs work diff --git a/code/game/AI_GalakMech.cpp b/code/game/AI_GalakMech.cpp index 9f0714e7dc..021df9284e 100644 --- a/code/game/AI_GalakMech.cpp +++ b/code/game/AI_GalakMech.cpp @@ -19,748 +19,1254 @@ You should have received a copy of the GNU General Public License along with this program; if not, see . =========================================================================== */ - -//////////////////////////////////////////////////////////////////////////////////////// -// RAVEN SOFTWARE - STAR WARS: JK III -// (c) 2002 Activision -// -// April 3, 2003 - This file has been commandeered for use by AI vehicle pilots. -// -//////////////////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////////////////// -// Includes -//////////////////////////////////////////////////////////////////////////////////////// #include "b_local.h" +#include "g_nav.h" #include "anims.h" #include "g_navigator.h" -#include "g_vehicles.h" +#include "../cgame/cg_local.h" #include "g_functions.h" -#if !defined(RATL_VECTOR_VS_INC) - #include "../Ratl/vector_vs.h" -#endif - - -//////////////////////////////////////////////////////////////////////////////////////// -// Defines -//////////////////////////////////////////////////////////////////////////////////////// -#define MAX_VEHICLES_REGISTERED 100 - -#define ATTACK_FWD 0.95f -#define ATTACK_SIDE 0.20f -#define AIM_SIDE 0.60f -#define FUTURE_PRED_DIST 20.0f -#define FUTURE_SIDE_DIST 60.0f -#define ATTACK_FLANK_SLOWING 1000.0f -#define RAM_DIST 150.0f -#define MIN_STAY_VIEWABLE_TIME 20000 - - -//////////////////////////////////////////////////////////////////////////////////////// -// Externs -//////////////////////////////////////////////////////////////////////////////////////// -extern Vehicle_t *G_IsRidingVehicle( gentity_t *ent ); +extern qboolean G_StandardHumanoid( gentity_t *ent ); +extern void G_AddVoiceEvent( gentity_t *self, int event, int speakDebounceTime ); +extern qboolean Q3_TaskIDPending( gentity_t *ent, taskID_t taskType ); +extern void NPC_AimAdjust( int change ); +extern qboolean WP_LobFire( gentity_t *self, vec3_t start, vec3_t target, vec3_t mins, vec3_t maxs, int clipmask, + vec3_t velocity, qboolean tracePath, int ignoreEntNum, int enemyNum, + float minSpeed, float maxSpeed, float idealSpeed, qboolean mustHit ); +extern qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f ); extern void G_SoundAtSpot( vec3_t org, int soundIndex, qboolean broadcast ); -extern void CG_DrawEdge( vec3_t start, vec3_t end, int type ); - - - -trace_t mPilotViewTrace; -int mPilotViewTraceCount; -int mActivePilotCount; -ratl::vector_vs mRegistered; - - - -//////////////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////////////// -void Pilot_Reset(void) +extern void G_SoundOnEnt (gentity_t *ent, soundChannel_t channel, const char *soundPath); +extern qboolean PM_CrouchAnim( int anim ); +//extern void NPC_Mark1_Part_Explode(gentity_t *self,int bolt); + +#define ARMOR_EFFECT_TIME 500 +#define MELEE_DIST_SQUARED 6400//80*80 +#define MIN_LOB_DIST_SQUARED 65536//256*256 +#define MAX_LOB_DIST_SQUARED 200704//448*448 +#define REPEATER_ALT_SIZE 3 // half of bbox size +#define GENERATOR_HEALTH 25 +#define TURN_ON 0x00000000 +#define TURN_OFF 0x00000100 +#define GALAK_SHIELD_HEALTH 500 + +static vec3_t shieldMins = {-60, -60, -24 }; +static vec3_t shieldMaxs = {60, 60, 80}; + +extern qboolean NPC_CheckPlayerTeamStealth( void ); + +static qboolean enemyLOS; +static qboolean enemyCS; +static qboolean hitAlly; +static qboolean faceEnemy; +static qboolean AImove; +static qboolean shoot; +static float enemyDist; +static vec3_t impactPos; + +void NPC_GalakMech_Precache( void ) { - mPilotViewTraceCount = 0; - mActivePilotCount = 0; - mRegistered.clear(); + G_SoundIndex( "sound/weapons/galak/skewerhit.wav" ); + G_SoundIndex( "sound/weapons/galak/lasercharge.wav" ); + G_SoundIndex( "sound/weapons/galak/lasercutting.wav" ); + G_SoundIndex( "sound/weapons/galak/laserdamage.wav" ); + + G_EffectIndex( "galak/trace_beam" ); + G_EffectIndex( "galak/beam_warmup" ); +// G_EffectIndex( "small_chunks"); + G_EffectIndex( "env/med_explode2"); + G_EffectIndex( "env/small_explode2"); + G_EffectIndex( "galak/explode"); + G_EffectIndex( "blaster/smoke_bolton"); +// G_EffectIndex( "env/exp_trail_comp"); } -//////////////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////////////// -int Pilot_ActivePilotCount() +void NPC_GalakMech_Init( gentity_t *ent ) { - return mActivePilotCount; + if (ent->NPC->behaviorState != BS_CINEMATIC) + { + ent->client->ps.stats[STAT_ARMOR] = GALAK_SHIELD_HEALTH; + ent->NPC->investigateCount = ent->NPC->investigateDebounceTime = 0; + ent->flags |= FL_SHIELDED;//reflect normal shots + ent->client->ps.powerups[PW_GALAK_SHIELD] = Q3_INFINITE;//temp, for effect + ent->fx_time = level.time; + VectorSet( ent->mins, -60, -60, -24 ); + VectorSet( ent->maxs, 60, 60, 80 ); + ent->flags |= FL_NO_KNOCKBACK;//don't get pushed + TIMER_Set( ent, "attackDelay", 0 ); //FIXME: Slant for difficulty levels + TIMER_Set( ent, "flee", 0 ); + TIMER_Set( ent, "smackTime", 0 ); + TIMER_Set( ent, "beamDelay", 0 ); + TIMER_Set( ent, "noLob", 0 ); + TIMER_Set( ent, "noRapid", 0 ); + TIMER_Set( ent, "talkDebounce", 0 ); + gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->playerModel], "torso_shield_off", TURN_ON ); + gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->playerModel], "torso_galakface_off", TURN_OFF ); + gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->playerModel], "torso_galakhead_off", TURN_OFF ); + gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->playerModel], "torso_eyes_mouth_off", TURN_OFF ); + gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->playerModel], "torso_collar_off", TURN_OFF ); + gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->playerModel], "torso_galaktorso_off", TURN_OFF ); + } + else + { +// gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->playerModel], "helmet", TURN_OFF ); + gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->playerModel], "torso_shield_off", TURN_OFF ); + gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->playerModel], "torso_galakface_off", TURN_ON ); + gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->playerModel], "torso_galakhead_off", TURN_ON ); + gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->playerModel], "torso_eyes_mouth_off", TURN_ON ); + gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->playerModel], "torso_collar_off", TURN_ON ); + gi.G2API_SetSurfaceOnOff( &ent->ghoul2[ent->playerModel], "torso_galaktorso_off", TURN_ON ); + } + } -//////////////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////////////// -void Pilot_Update(void) +//----------------------------------------------------------------- +static void GM_CreateExplosion( gentity_t *self, const int boltID, qboolean doSmall = qfalse ) { - mActivePilotCount = 0; - mRegistered.clear(); - for (int i=0; i=0 ) { - if (g_entities[i].inuse && - g_entities[i].client && - g_entities[i].NPC && - g_entities[i].NPC->greetEnt && - g_entities[i].NPC->greetEnt->owner==(&g_entities[i]) - ) + mdxaBone_t boltMatrix; + vec3_t org, dir; + + gi.G2API_GetBoltMatrix( self->ghoul2, self->playerModel, + boltID, + &boltMatrix, self->currentAngles, self->currentOrigin, level.time, + NULL, self->s.modelScale ); + + gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, org ); + gi.G2API_GiveMeVectorFromMatrix( boltMatrix, NEGATIVE_Y, dir ); + + if ( doSmall ) { - mActivePilotCount++; - } - if ( g_entities[i].inuse && - g_entities[i].client && - g_entities[i].m_pVehicle && - !g_entities[i].owner && - g_entities[i].health>0 && - g_entities[i].m_pVehicle->m_pVehicleInfo->type==VH_SPEEDER && - !mRegistered.full()) + G_PlayEffect( "env/small_explode2", org, dir ); + } + else { - mRegistered.push_back(&g_entities[i]); + G_PlayEffect( "env/med_explode2", org, dir ); } - } +} +/* +------------------------- +GM_Dying +------------------------- +*/ - if (player && - player->inuse && - TIMER_Done(player, "FlybySoundArchitectureDebounce")) - { - TIMER_Set(player, "FlybySoundArchitectureDebounce", 300); - - Vehicle_t* pVeh = G_IsRidingVehicle(player); - - if (pVeh && - (pVeh->m_pVehicleInfo->soundFlyBy || pVeh->m_pVehicleInfo->soundFlyBy2) && - //fabsf(pVeh->m_pParentEntity->currentAngles[2])<15.0f && - VectorLength(pVeh->m_pParentEntity->client->ps.velocity)>500.0f) +void GM_Dying( gentity_t *self ) +{ + if ( level.time - self->s.time < 4000 ) + {//FIXME: need a real effect + self->s.powerups |= ( 1 << PW_SHOCKED ); + self->client->ps.powerups[PW_SHOCKED] = level.time + 1000; + if ( TIMER_Done( self, "dyingExplosion" ) ) { - vec3_t projectedPosition; - vec3_t projectedDirection; - vec3_t projectedRight; - vec3_t anglesNoRoll; - - VectorCopy(pVeh->m_pParentEntity->currentAngles, anglesNoRoll); - anglesNoRoll[2] = 0; - AngleVectors(anglesNoRoll, projectedDirection, projectedRight, 0); - - VectorMA(player->currentOrigin, 1.2f, pVeh->m_pParentEntity->client->ps.velocity, projectedPosition); - VectorMA(projectedPosition, Q_flrand(-200.0f, 200.0f), projectedRight, projectedPosition); - - gi.trace(&mPilotViewTrace, - player->currentOrigin, - 0, - 0, - projectedPosition, - player->s.number, - MASK_SHOT, (EG2_Collision)0, 0); - - if ((mPilotViewTrace.allsolid==qfalse) && - (mPilotViewTrace.startsolid==qfalse) && - (mPilotViewTrace.fraction<0.99f) && - (mPilotViewTrace.plane.normal[2]<0.5f) && - (DotProduct(projectedDirection, mPilotViewTrace.plane.normal)<-0.5f) - ) + int newBolt; + switch ( Q_irand( 1, 14 ) ) { - // CG_DrawEdge(player->currentOrigin, mPilotViewTrace.endpos, EDGE_IMPACT_POSSIBLE); - TIMER_Set(player, "FlybySoundArchitectureDebounce", Q_irand(1000, 2000)); - - int soundFlyBy = pVeh->m_pVehicleInfo->soundFlyBy; - if (pVeh->m_pVehicleInfo->soundFlyBy2 && (!soundFlyBy || !Q_irand(0,1))) - { - soundFlyBy = pVeh->m_pVehicleInfo->soundFlyBy2; + // Find place to generate explosion + case 1: + if (!gi.G2API_GetSurfaceRenderStatus( &self->ghoul2[self->playerModel], "r_hand" )) + {//r_hand still there + GM_CreateExplosion( self, self->handRBolt, qtrue ); + gi.G2API_SetSurfaceOnOff( &self->ghoul2[self->playerModel], "r_hand", TURN_OFF ); } - G_SoundAtSpot(mPilotViewTrace.endpos, soundFlyBy, qtrue); - } - else - { - // CG_DrawEdge(player->currentOrigin, mPilotViewTrace.endpos, EDGE_IMPACT_SAFE); + else if (!gi.G2API_GetSurfaceRenderStatus( &self->ghoul2[self->playerModel], "r_arm_middle" )) + {//r_arm_middle still there + newBolt = gi.G2API_AddBolt( &self->ghoul2[self->playerModel], "*r_arm_elbow" ); + gi.G2API_SetSurfaceOnOff( &self->ghoul2[self->playerModel], "r_arm_middle", TURN_OFF ); + } + break; + case 2: + //FIXME: do only once? + if (!gi.G2API_GetSurfaceRenderStatus( &self->ghoul2[self->playerModel], "l_hand" )) + {//l_hand still there + GM_CreateExplosion( self, self->handLBolt ); + gi.G2API_SetSurfaceOnOff( &self->ghoul2[self->playerModel], "l_hand", TURN_OFF ); + } + else if (!gi.G2API_GetSurfaceRenderStatus( &self->ghoul2[self->playerModel], "l_arm_wrist" )) + {//l_arm_wrist still there + newBolt = gi.G2API_AddBolt( &self->ghoul2[self->playerModel], "*l_arm_cap_l_hand" ); + gi.G2API_SetSurfaceOnOff( &self->ghoul2[self->playerModel], "l_arm_wrist", TURN_OFF ); + } + else if (!gi.G2API_GetSurfaceRenderStatus( &self->ghoul2[self->playerModel], "l_arm_middle" )) + {//l_arm_middle still there + newBolt = gi.G2API_AddBolt( &self->ghoul2[self->playerModel], "*l_arm_cap_l_hand" ); + gi.G2API_SetSurfaceOnOff( &self->ghoul2[self->playerModel], "l_arm_middle", TURN_OFF ); + } + else if (!gi.G2API_GetSurfaceRenderStatus( &self->ghoul2[self->playerModel], "l_arm_augment" )) + {//l_arm_augment still there + newBolt = gi.G2API_AddBolt( &self->ghoul2[self->playerModel], "*l_arm_elbow" ); + gi.G2API_SetSurfaceOnOff( &self->ghoul2[self->playerModel], "l_arm_augment", TURN_OFF ); + } + break; + case 3: + case 4: + newBolt = gi.G2API_AddBolt( &self->ghoul2[self->playerModel], "*hip_fr" ); + GM_CreateExplosion( self, newBolt ); + break; + case 5: + case 6: + newBolt = gi.G2API_AddBolt( &self->ghoul2[self->playerModel], "*shldr_l" ); + GM_CreateExplosion( self, newBolt ); + break; + case 7: + case 8: + newBolt = gi.G2API_AddBolt( &self->ghoul2[self->playerModel], "*uchest_r" ); + GM_CreateExplosion( self, newBolt ); + break; + case 9: + case 10: + GM_CreateExplosion( self, self->headBolt ); + break; + case 11: + newBolt = gi.G2API_AddBolt( &self->ghoul2[self->playerModel], "*l_leg_knee" ); + GM_CreateExplosion( self, newBolt, qtrue ); + break; + case 12: + newBolt = gi.G2API_AddBolt( &self->ghoul2[self->playerModel], "*r_leg_knee" ); + GM_CreateExplosion( self, newBolt, qtrue ); + break; + case 13: + newBolt = gi.G2API_AddBolt( &self->ghoul2[self->playerModel], "*l_leg_foot" ); + GM_CreateExplosion( self, newBolt, qtrue ); + break; + case 14: + newBolt = gi.G2API_AddBolt( &self->ghoul2[self->playerModel], "*r_leg_foot" ); + GM_CreateExplosion( self, newBolt, qtrue ); + break; } + + TIMER_Set( self, "dyingExplosion", Q_irand( 300, 1100 ) ); } } + else + {//one final, huge explosion + G_PlayEffect( "galak/explode", self->currentOrigin ); +// G_PlayEffect( "small_chunks", self->currentOrigin ); +// G_PlayEffect( "env/exp_trail_comp", self->currentOrigin, self->currentAngles ); + self->nextthink = level.time + FRAMETIME; + self->e_ThinkFunc = thinkF_G_FreeEntity; + } } -//////////////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////////////// -bool Pilot_AnyVehiclesRegistered() -{ - return (!mRegistered.empty()); -} - - - - - -//////////////////////////////////////////////////////////////////////////////////////// -// Vehicle Registration -// -// Any vehicles that can be ridden by NPCs should be registered here -// -//////////////////////////////////////////////////////////////////////////////////////// -void Vehicle_Register(gentity_t *ent) -{ -} - +/* +------------------------- +NPC_GM_Pain +------------------------- +*/ -//////////////////////////////////////////////////////////////////////////////////////// -// Vehicle Remove From The List Of Valid -//////////////////////////////////////////////////////////////////////////////////////// -void Vehicle_Remove(gentity_t *ent) +extern void NPC_SetPainEvent( gentity_t *self ); +void NPC_GM_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, const vec3_t point, int damage, int mod,int hitLoc ) { -} + if ( self->client->ps.powerups[PW_GALAK_SHIELD] == 0 ) + {//shield is currently down + //FIXME: allow for radius damage? + if ( (hitLoc==HL_GENERIC1) && (self->locationDamage[HL_GENERIC1] > GENERATOR_HEALTH) ) + { + int newBolt = gi.G2API_AddBolt( &self->ghoul2[self->playerModel], "*antenna_base" ); + if ( newBolt != -1 ) + { + GM_CreateExplosion( self, newBolt ); + } -//////////////////////////////////////////////////////////////////////////////////////// -// Vehicle_Find -// -// Will look through all registered vehicles and choose the closest one that the given -// entity can get to. -// -//////////////////////////////////////////////////////////////////////////////////////// -gentity_t* Vehicle_Find(gentity_t *ent) -{ - gentity_t* closest = 0; - float closestDist = 0; - float curDist = 0; + gi.G2API_SetSurfaceOnOff( &self->ghoul2[self->playerModel], "torso_shield_off", TURN_OFF ); + gi.G2API_SetSurfaceOnOff( &self->ghoul2[self->playerModel], "torso_antenna", TURN_OFF ); + gi.G2API_SetSurfaceOnOff( &self->ghoul2[self->playerModel], "torso_antenna_base_cap_off", TURN_ON ); + self->client->ps.powerups[PW_GALAK_SHIELD] = 0;//temp, for effect + self->client->ps.stats[STAT_ARMOR] = 0;//no more armor + self->NPC->investigateDebounceTime = 0;//stop recharging + NPC_SetAnim( self, SETANIM_BOTH, BOTH_ALERT1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + TIMER_Set( self, "attackDelay", self->client->ps.torsoAnimTimer ); + G_AddEvent( self, Q_irand( EV_DEATH1, EV_DEATH3 ), self->health ); + } + } + else + {//store the point for shield impact + if ( point ) + { + VectorCopy( point, self->pos4 ); + self->client->poisonTime = level.time; + } + } - for (int i=0; iowner) + if ( !self->lockCount && !self->client->ps.torsoAnimTimer ) + {//don't interrupt laser sweep attack or other special attacks/moves + if ( self->count < 4 && self->health > 100 && hitLoc != HL_GENERIC1 ) { - curDist = Distance(mRegistered[i]->currentOrigin, ent->currentOrigin); - if (curDist<1000 && (!closest || curDistdelay < level.time ) { - if (NAV::InSameRegion(ent, mRegistered[i])) + int speech; + switch( self->count ) { - closest = mRegistered[i]; - closestDist = curDist; + default: + case 0: + speech = EV_PUSHED1; + break; + case 1: + speech = EV_PUSHED2; + break; + case 2: + speech = EV_PUSHED3; + break; + case 3: + speech = EV_DETECTED1; + break; } + self->count++; + self->NPC->blockedSpeechDebounceTime = 0; + G_AddVoiceEvent( self, speech, Q_irand( 3000, 5000 ) ); + self->delay = level.time + Q_irand( 5000, 7000 ); } } + else + { + NPC_Pain( self, inflictor, attacker, point, damage, mod, hitLoc ); + } } - - return closest; -} - - - -void Pilot_Update_Enemy(); -void Pilot_Steer_Vehicle(); -void Pilot_Goto_Vehicle(); - - - - - - -//////////////////////////////////////////////////////////////////////////////////////// -// Pilot_MasterUpdate() - Master think function for Pilot NPCs -// -// Will return true if the character is either driving a vehicle or on his way to get -// onto one. -//////////////////////////////////////////////////////////////////////////////////////// -bool Pilot_MasterUpdate() -{ - if (!NPC->enemy) + else if ( hitLoc == HL_GENERIC1 ) { - // If Still On A Vehicle, Jump Off - //--------------------------------- - if (NPCInfo->greetEnt) - { - ucmd.upmove = 127; + NPC_SetPainEvent( self ); + self->s.powerups |= ( 1 << PW_SHOCKED ); + self->client->ps.powerups[PW_SHOCKED] = level.time + Q_irand( 500, 2500 ); + } - if (NPCInfo->greetEnt && NPCInfo->greetEnt->m_pVehicle && (level.timeconfusionTime||level.timeinsanityTime)) + if ( inflictor && inflictor->lastEnemy == self ) + {//He force-pushed my own lobfires back at me + if ( mod == MOD_REPEATER_ALT && !Q_irand( 0, 2 ) ) + { + if ( TIMER_Done( self, "noRapid" ) ) { - Vehicle_t* pVeh = NPCInfo->greetEnt->m_pVehicle; - if (!(pVeh->m_ulFlags&VEH_OUTOFCONTROL)) - { - gentity_t* parent = pVeh->m_pParentEntity; - float CurSpeed = VectorLength(parent->client->ps.velocity); - pVeh->m_pVehicleInfo->StartDeathDelay(pVeh, 10000); - pVeh->m_ulFlags |= (VEH_OUTOFCONTROL); - VectorScale(parent->client->ps.velocity, 1.25f, parent->pos3); - if (CurSpeedm_pVehicleInfo->speedMax) - { - VectorNormalize(parent->pos3); - if (fabsf(parent->pos3[2])<0.25f) - { - VectorScale(parent->pos3, (pVeh->m_pVehicleInfo->speedMax * 1.25f), parent->pos3); - } - else - { - VectorScale(parent->client->ps.velocity, 1.25f, parent->pos3); - } - } - } + self->NPC->scriptFlags &= ~SCF_ALT_FIRE; + self->alt_fire = qfalse; + TIMER_Set( self, "noLob", Q_irand( 2000, 6000 ) ); } - - if (NPCInfo->greetEnt->owner==NPC) - { - return true; + else + {//hopefully this will make us fire the laser + TIMER_Set( self, "noLob", Q_irand( 1000, 2000 ) ); } - NPCInfo->greetEnt = 0; - } - - // Otherwise Nothing To See Here - //------------------------------- - return false; - } - - - // If We Already Have A Target Vehicle, Make Sure It Is Still Valid - //------------------------------------------------------------------ - if (NPCInfo->greetEnt) - { - if (!NPCInfo->greetEnt->inuse || - !NPCInfo->greetEnt->m_pVehicle || - !NPCInfo->greetEnt->m_pVehicle->m_pVehicleInfo) - { - NPCInfo->greetEnt = Vehicle_Find(NPC); } - else + else if ( mod == MOD_REPEATER && !Q_irand( 0, 5 ) ) { - if (NPCInfo->greetEnt->owner && NPCInfo->greetEnt->owner!=NPC) + if ( TIMER_Done( self, "noLob" ) ) { - NPCInfo->greetEnt = Vehicle_Find(NPC); + self->NPC->scriptFlags |= SCF_ALT_FIRE; + self->alt_fire = qtrue; + TIMER_Set( self, "noRapid", Q_irand( 2000, 6000 ) ); + } + else + {//hopefully this will make us fire the laser + TIMER_Set( self, "noRapid", Q_irand( 1000, 2000 ) ); } } } +} - // If We Have An Enemy, Try To Find A Vehicle Nearby - //--------------------------------------------------- - else - { - NPCInfo->greetEnt = Vehicle_Find(NPC); +/* +------------------------- +GM_HoldPosition +------------------------- +*/ + +static void GM_HoldPosition( void ) +{ + NPC_FreeCombatPoint( NPCInfo->combatPoint, qtrue ); + if ( !Q3_TaskIDPending( NPC, TID_MOVE_NAV ) ) + {//don't have a script waiting for me to get to my point, okay to stop trying and stand + NPCInfo->goalEntity = NULL; } +} - // If No Vehicle Available, Continue As Usual - //-------------------------------------------- - if (!NPCInfo->greetEnt) - { - return false; +/* +------------------------- +GM_Move +------------------------- +*/ +static qboolean GM_Move( void ) +{ + NPCInfo->combatMove = qtrue;//always move straight toward our goal + + qboolean moved = NPC_MoveToGoal( qtrue ); +// navInfo_t info; + + //Get the move info +// NAV_GetLastMove( info ); + + //FIXME: if we bump into another one of our guys and can't get around him, just stop! + //If we hit our target, then stop and fire! +// if ( frameNavInfo.flags & NIF_COLLISION ) +// { +// if ( info.blocker == NPC->enemy ) +// { +// GM_HoldPosition(); +// } +// } + + //If our move failed, then reset + if ( moved == qfalse ) + {//FIXME: if we're going to a combat point, need to pick a different one + if ( !Q3_TaskIDPending( NPC, TID_MOVE_NAV ) ) + {//can't transfer movegoal or stop when a script we're running is waiting to complete + GM_HoldPosition(); + } } + return moved; +} +/* +------------------------- +NPC_BSGM_Patrol +------------------------- +*/ - if (NPCInfo->greetEnt->owner==NPC) +void NPC_BSGM_Patrol( void ) +{ + if ( NPC_CheckPlayerTeamStealth() ) { - Pilot_Steer_Vehicle(); + NPC_UpdateAngles( qtrue, qtrue ); + return; } - else + + //If we have somewhere to go, then do that + if ( UpdateGoal() ) { - Pilot_Goto_Vehicle(); + ucmd.buttons |= BUTTON_WALKING; + NPC_MoveToGoal( qtrue ); } - Pilot_Update_Enemy(); - return true; + NPC_UpdateAngles( qtrue, qtrue ); } +/* +------------------------- +GM_CheckMoveState +------------------------- +*/ +extern qboolean NAV_HitNavGoal( vec3_t point, vec3_t mins, vec3_t maxs, vec3_t dest, int radius, qboolean flying ); +static void GM_CheckMoveState( void ) +{ + if ( Q3_TaskIDPending( NPC, TID_MOVE_NAV ) ) + {//moving toward a goal that a script is waiting on, so don't stop for anything! + AImove = qtrue; + } + //See if we're moving towards a goal, not the enemy + if ( ( NPCInfo->goalEntity != NPC->enemy ) && ( NPCInfo->goalEntity != NULL ) ) + { + //Did we make it? + if ( NAV_HitNavGoal( NPC->currentOrigin, NPC->mins, NPC->maxs, NPCInfo->goalEntity->currentOrigin, 16, qfalse ) || + ( !Q3_TaskIDPending( NPC, TID_MOVE_NAV ) && enemyLOS && enemyDist <= 10000 ) ) + {//either hit our navgoal or our navgoal was not a crucial (scripted) one (maybe a combat point) and we're scouting and found our enemy + NPC_ReachedGoal(); + //don't attack right away + TIMER_Set( NPC, "attackDelay", Q_irand( 250, 500 ) ); //FIXME: Slant for difficulty levels + return; + } + } +} +/* +------------------------- +GM_CheckFireState +------------------------- +*/ - -//////////////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////////////// -void Pilot_Update_Enemy() +static void GM_CheckFireState( void ) { - if (!TIMER_Exists(NPC, "PilotRemoveTime")) - { - TIMER_Set(NPC, "PilotRemoveTime", MIN_STAY_VIEWABLE_TIME); + if ( enemyCS ) + {//if have a clear shot, always try + return; } - if (TIMER_Done(NPC, "NextPilotCheckEnemyTime")) + if ( !VectorCompare( NPC->client->ps.velocity, vec3_origin ) ) + {//if moving at all, don't do this + return; + } + + //See if we should continue to fire on their last position + if ( !hitAlly && NPCInfo->enemyLastSeenTime > 0 ) { - TIMER_Set(NPC, "NextPilotCheckEnemyTime", Q_irand(1000,2000)); - if (NPC->enemy && Distance(NPC->currentOrigin, NPC->enemy->currentOrigin)>1000.0f) + if ( level.time - NPCInfo->enemyLastSeenTime < 10000 ) { - mPilotViewTraceCount ++; - gi.trace(&mPilotViewTrace, - NPC->currentOrigin, - 0, - 0, - NPC->enemy->currentOrigin, - NPC->s.number, - MASK_SHOT, - (EG2_Collision)0, 0); - - if ((mPilotViewTrace.allsolid==qfalse) && - (mPilotViewTrace.startsolid==qfalse ) && - ((mPilotViewTrace.entityNum==NPC->enemy->s.number)||(mPilotViewTrace.entityNum==NPC->enemy->s.m_iVehicleNum))) + if ( !Q_irand( 0, 10 ) ) { - TIMER_Set(NPC, "PilotRemoveTime", MIN_STAY_VIEWABLE_TIME); + //Fire on the last known position + vec3_t muzzle, dir, angles; + qboolean tooClose = qfalse; + qboolean tooFar = qfalse; + + CalcEntitySpot( NPC, SPOT_HEAD, muzzle ); + if ( VectorCompare( impactPos, vec3_origin ) ) + {//never checked ShotEntity this frame, so must do a trace... + trace_t tr; + //vec3_t mins = {-2,-2,-2}, maxs = {2,2,2}; + vec3_t forward, end; + AngleVectors( NPC->client->ps.viewangles, forward, NULL, NULL ); + VectorMA( muzzle, 8192, forward, end ); + gi.trace( &tr, muzzle, vec3_origin, vec3_origin, end, NPC->s.number, MASK_SHOT, G2_NOCOLLIDE, 0 ); + VectorCopy( tr.endpos, impactPos ); + } + + //see if impact would be too close to me + float distThreshold = 16384/*128*128*/;//default + if ( NPC->s.weapon == WP_REPEATER ) + { + if ( NPCInfo->scriptFlags&SCF_ALT_FIRE ) + { + distThreshold = 65536/*256*256*/; + } + } + + float dist = DistanceSquared( impactPos, muzzle ); + + if ( dist < distThreshold ) + {//impact would be too close to me + tooClose = qtrue; + } + else if ( level.time - NPCInfo->enemyLastSeenTime > 5000 ) + {//we've haven't seen them in the last 5 seconds + //see if it's too far from where he is + distThreshold = 65536/*256*256*/;//default + if ( NPC->s.weapon == WP_REPEATER ) + { + if ( NPCInfo->scriptFlags&SCF_ALT_FIRE ) + { + distThreshold = 262144/*512*512*/; + } + } + dist = DistanceSquared( impactPos, NPCInfo->enemyLastSeenLocation ); + if ( dist > distThreshold ) + {//impact would be too far from enemy + tooFar = qtrue; + } + } + + if ( !tooClose && !tooFar ) + {//okay too shoot at last pos + VectorSubtract( NPCInfo->enemyLastSeenLocation, muzzle, dir ); + VectorNormalize( dir ); + vectoangles( dir, angles ); + + NPCInfo->desiredYaw = angles[YAW]; + NPCInfo->desiredPitch = angles[PITCH]; + + shoot = qtrue; + faceEnemy = qfalse; + return; + } } } - else - { - TIMER_Set(NPC, "PilotRemoveTime", MIN_STAY_VIEWABLE_TIME); - } } +} - if (TIMER_Done(NPC, "PilotRemoveTime")) - { - if (NPCInfo->greetEnt->owner==NPC) - { - NPCInfo->greetEnt->e_ThinkFunc = thinkF_G_FreeEntity; - NPCInfo->greetEnt->nextthink = level.time; - } - NPC->e_ThinkFunc = thinkF_G_FreeEntity; - NPC->nextthink = level.time; +void NPC_GM_StartLaser( void ) +{ + if ( !NPC->lockCount ) + {//haven't already started a laser attack + //warm up for the beam attack + NPC_SetAnim( NPC, SETANIM_TORSO, TORSO_RAISEWEAP2, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + TIMER_Set( NPC, "beamDelay", NPC->client->ps.torsoAnimTimer ); + TIMER_Set( NPC, "attackDelay", NPC->client->ps.torsoAnimTimer+3000 ); + NPC->lockCount = 1; + //turn on warmup effect + G_PlayEffect( "galak/beam_warmup", NPC->s.number ); + G_SoundOnEnt( NPC, CHAN_AUTO, "sound/weapons/galak/lasercharge.wav" ); } } +void GM_StartGloat( void ) +{ + NPC->wait = 0; + gi.G2API_SetSurfaceOnOff( &NPC->ghoul2[NPC->playerModel], "torso_galakface_off", TURN_ON ); + gi.G2API_SetSurfaceOnOff( &NPC->ghoul2[NPC->playerModel], "torso_galakhead_off", TURN_ON ); + gi.G2API_SetSurfaceOnOff( &NPC->ghoul2[NPC->playerModel], "torso_eyes_mouth_off", TURN_ON ); + gi.G2API_SetSurfaceOnOff( &NPC->ghoul2[NPC->playerModel], "torso_collar_off", TURN_ON ); + gi.G2API_SetSurfaceOnOff( &NPC->ghoul2[NPC->playerModel], "torso_galaktorso_off", TURN_ON ); + NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_STAND2TO1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC->client->ps.legsAnimTimer += 500; + NPC->client->ps.torsoAnimTimer += 500; +} +/* +------------------------- +NPC_BSGM_Attack +------------------------- +*/ -//////////////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////////////// -void Pilot_Goto_Vehicle() +void NPC_BSGM_Attack( void ) { - STEER::Activate(NPC); + //Don't do anything if we're hurt + if ( NPC->painDebounceTime > level.time ) { - if (STEER::Reached(NPC, NPCInfo->greetEnt, 80.0f)) + NPC_UpdateAngles( qtrue, qtrue ); + return; + } + + //FIXME: if killed enemy, use victory anim + if ( NPC->enemy && NPC->enemy->health <= 0 + && !NPC->enemy->s.number ) + {//my enemy is dead + if ( NPC->client->ps.torsoAnim == BOTH_STAND2TO1 ) { - NPC_Use(NPCInfo->greetEnt, NPC, NPC); + if ( NPC->client->ps.torsoAnimTimer <= 500 ) + { + G_AddVoiceEvent( NPC, Q_irand( EV_VICTORY1, EV_VICTORY3 ), 3000 ); + NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_TRIUMPHANT1START, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC->client->ps.legsAnimTimer += 500; + NPC->client->ps.torsoAnimTimer += 500; + } } - else if (NAV::OnNeighboringPoints(NPC, NPCInfo->greetEnt)) + else if ( NPC->client->ps.torsoAnim == BOTH_TRIUMPHANT1START ) { - STEER::Persue(NPC, NPCInfo->greetEnt, 50.0f, 0.0f, 30.0f, 0.0f, true); + if ( NPC->client->ps.torsoAnimTimer <= 500 ) + { + NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_TRIUMPHANT1STARTGESTURE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC->client->ps.legsAnimTimer += 500; + NPC->client->ps.torsoAnimTimer += 500; + } } - else + else if ( NPC->client->ps.torsoAnim == BOTH_TRIUMPHANT1STARTGESTURE ) + { + if ( NPC->client->ps.torsoAnimTimer <= 500 ) + { + NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_TRIUMPHANT1STOP, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC->client->ps.legsAnimTimer += 500; + NPC->client->ps.torsoAnimTimer += 500; + } + } + else if ( NPC->client->ps.torsoAnim == BOTH_TRIUMPHANT1STOP ) + { + if ( NPC->client->ps.torsoAnimTimer <= 500 ) + { + NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_STAND1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC->client->ps.legsAnimTimer = -1; + NPC->client->ps.torsoAnimTimer = -1; + } + } + else if ( NPC->wait ) { - if (!NAV::GoTo(NPC, NPCInfo->greetEnt)) + if ( TIMER_Done( NPC, "gloatTime" ) ) { - STEER::Stop(NPC); + GM_StartGloat(); + } + else if ( DistanceHorizontalSquared( NPC->client->renderInfo.eyePoint, NPC->enemy->currentOrigin ) > 4096 && (NPCInfo->scriptFlags&SCF_CHASE_ENEMIES) )//64 squared + { + NPCInfo->goalEntity = NPC->enemy; + GM_Move(); + } + else + {//got there + GM_StartGloat(); } } + NPC_FaceEnemy( qtrue ); + NPC_UpdateAngles( qtrue, qtrue ); + return; } - STEER::AvoidCollisions(NPC); - STEER::DeActivate(NPC, &ucmd); - NPC_UpdateAngles(qtrue, qtrue); -} - -extern bool VEH_StartStrafeRam(Vehicle_t *pVeh, bool Right); - -//////////////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////////////// -void Pilot_Steer_Vehicle() -{ - if (!NPC->enemy || !NPC->enemy->client) + //If we don't have an enemy, just idle + if ( NPC_CheckEnemyExt() == qfalse || !NPC->enemy ) { + NPC->enemy = NULL; + NPC_BSGM_Patrol(); return; } + enemyLOS = enemyCS = qfalse; + AImove = qtrue; + faceEnemy = qfalse; + shoot = qfalse; + hitAlly = qfalse; + VectorClear( impactPos ); + enemyDist = DistanceSquared( NPC->currentOrigin, NPC->enemy->currentOrigin ); - - - - -// SETUP -//======= - // Setup Actor Data - //------------------ - CVec3 ActorPos(NPC->currentOrigin); - CVec3 ActorAngles(NPC->currentAngles); - ActorAngles[2] = 0; - Vehicle_t* ActorVeh = NPCInfo->greetEnt->m_pVehicle; - bool ActorInTurbo = (ActorVeh->m_iTurboTime>level.time); - float ActorSpeed = (ActorVeh)?(VectorLength(ActorVeh->m_pParentEntity->client->ps.velocity)):(NPC->client->ps.speed); - - - // If my vehicle is spinning out of control, just hold on, we're going to die!!!!! - //--------------------------------------------------------------------------------- - if (ActorVeh && (ActorVeh->m_ulFlags & VEH_OUTOFCONTROL)) + if ( NPC->client->ps.torsoAnim == BOTH_ATTACK4 || + NPC->client->ps.torsoAnim == BOTH_ATTACK5 ) { - if (NPC->client->ps.weapon!=WP_NONE) - { - NPC_ChangeWeapon(WP_NONE); + shoot = qfalse; + if ( TIMER_Done( NPC, "smackTime" ) && !NPCInfo->blockedDebounceTime ) + {//time to smack + //recheck enemyDist and InFront + if ( enemyDist < MELEE_DIST_SQUARED && InFront( NPC->enemy->currentOrigin, NPC->currentOrigin, NPC->client->ps.viewangles, 0.3f ) ) + { + vec3_t smackDir; + VectorSubtract( NPC->enemy->currentOrigin, NPC->currentOrigin, smackDir ); + smackDir[2] += 30; + VectorNormalize( smackDir ); + //hurt them + G_Sound( NPC->enemy, G_SoundIndex( "sound/weapons/galak/skewerhit.wav" ) ); + G_Damage( NPC->enemy, NPC, NPC, smackDir, NPC->currentOrigin, (g_spskill->integer+1)*Q_irand( 5, 10), DAMAGE_NO_ARMOR|DAMAGE_NO_KNOCKBACK, MOD_CRUSH ); + if ( NPC->client->ps.torsoAnim == BOTH_ATTACK4 ) + {//smackdown + int knockAnim = BOTH_KNOCKDOWN1; + if ( PM_CrouchAnim( NPC->enemy->client->ps.legsAnim ) ) + {//knockdown from crouch + knockAnim = BOTH_KNOCKDOWN4; + } + //throw them + smackDir[2] = 1; + VectorNormalize( smackDir ); + G_Throw( NPC->enemy, smackDir, 50 ); + NPC_SetAnim( NPC->enemy, SETANIM_BOTH, knockAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + else + {//uppercut + //throw them + G_Throw( NPC->enemy, smackDir, 100 ); + //make them backflip + NPC_SetAnim( NPC->enemy, SETANIM_BOTH, BOTH_KNOCKDOWN5, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + //done with the damage + NPCInfo->blockedDebounceTime = 1; + } } - ucmd.buttons &=~BUTTON_ATTACK; - ucmd.buttons &=~BUTTON_ALT_ATTACK; - return; } - - CVec3 ActorDirection; - AngleVectors(ActorAngles.v, ActorDirection.v, 0, 0); - - CVec3 ActorFuturePos(ActorPos); - ActorFuturePos.ScaleAdd(ActorDirection, FUTURE_PRED_DIST); - - bool ActorDoTurbo = false; - bool ActorAccelerate = false; - bool ActorAimAtTarget= true; - float ActorYawOffset = 0.0f; - - - // Setup Enemy Data - //------------------ - CVec3 EnemyPos(NPC->enemy->currentOrigin); - CVec3 EnemyAngles(NPC->enemy->currentAngles); - EnemyAngles[2] = 0; - Vehicle_t* EnemyVeh = (NPC->enemy->s.m_iVehicleNum)?(g_entities[NPC->enemy->s.m_iVehicleNum].m_pVehicle):(0); - bool EnemyInTurbo = (EnemyVeh && EnemyVeh->m_iTurboTime>level.time); - float EnemySpeed = (EnemyVeh)?(EnemyVeh->m_pParentEntity->client->ps.speed):(NPC->enemy->resultspeed); - bool EnemySlideBreak = (EnemyVeh && (EnemyVeh->m_ulFlags&VEH_SLIDEBREAKING || EnemyVeh->m_ulFlags&VEH_STRAFERAM)); - bool EnemyDead = (NPC->enemy->health<=0); - - bool ActorFlank = (NPCInfo->lastAvoidSteerSideDebouncer>level.time && EnemyVeh && EnemySpeed>10.0f); - - CVec3 EnemyDirection; - CVec3 EnemyRight; - AngleVectors(EnemyAngles.v, EnemyDirection.v, EnemyRight.v, 0); - - CVec3 EnemyFuturePos(EnemyPos); - EnemyFuturePos.ScaleAdd(EnemyDirection, FUTURE_PRED_DIST); - - ESide EnemySide = ActorPos.LRTest(EnemyPos, EnemyFuturePos); - CVec3 EnemyFlankPos(EnemyFuturePos); - EnemyFlankPos.ScaleAdd(EnemyRight, (EnemySide==Side_Right)?(FUTURE_SIDE_DIST):(-FUTURE_SIDE_DIST)); - - // Debug Draw Enemy Data - //----------------------- - if (false) - { - CG_DrawEdge(EnemyPos.v, EnemyFuturePos.v, EDGE_IMPACT_SAFE); - CG_DrawEdge(EnemyFuturePos.v, EnemyFlankPos.v, EDGE_IMPACT_SAFE); + else if ( NPC->lockCount ) //already shooting laser + {//sometimes use the laser beam attack, but only after he's taken down our generator + shoot = qfalse; + if ( NPC->lockCount == 1 ) + {//charging up + if ( TIMER_Done( NPC, "beamDelay" ) ) + {//time to start the beam + int laserAnim; + if ( Q_irand( 0, 1 ) ) + { + laserAnim = BOTH_ATTACK2; + } + else + { + laserAnim = BOTH_ATTACK7; + } + NPC_SetAnim( NPC, SETANIM_BOTH, laserAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + TIMER_Set( NPC, "attackDelay", NPC->client->ps.torsoAnimTimer + Q_irand( 1000, 3000 ) ); + //turn on beam effect + NPC->lockCount = 2; + G_PlayEffect( "galak/trace_beam", NPC->s.number ); + NPC->s.loopSound = G_SoundIndex( "sound/weapons/galak/lasercutting.wav" ); + if ( !NPCInfo->coverTarg ) + {//for moving looping sound at end of trace + NPCInfo->coverTarg = G_Spawn(); + if ( NPCInfo->coverTarg ) + { + G_SetOrigin( NPCInfo->coverTarg, NPC->client->renderInfo.muzzlePoint ); + NPCInfo->coverTarg->svFlags |= SVF_BROADCAST; + NPCInfo->coverTarg->s.loopSound = G_SoundIndex( "sound/weapons/galak/lasercutting.wav" ); + } + } + } + } + else + {//in the actual attack now + if ( !NPC->client->ps.torsoAnimTimer ) + {//attack done! + NPC->lockCount = 0; + G_FreeEntity( NPCInfo->coverTarg ); + NPC->s.loopSound = 0; + NPC_SetAnim( NPC, SETANIM_TORSO, TORSO_DROPWEAP2, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + TIMER_Set( NPC, "attackDelay", NPC->client->ps.torsoAnimTimer ); + } + else + {//attack still going + //do the trace and damage + trace_t trace; + vec3_t end, mins={-3,-3,-3}, maxs={3,3,3}; + VectorMA( NPC->client->renderInfo.muzzlePoint, 1024, NPC->client->renderInfo.muzzleDir, end ); + gi.trace( &trace, NPC->client->renderInfo.muzzlePoint, mins, maxs, end, NPC->s.number, MASK_SHOT, G2_NOCOLLIDE, 0 ); + if ( trace.allsolid || trace.startsolid ) + {//oops, in a wall + if ( NPCInfo->coverTarg ) + { + G_SetOrigin( NPCInfo->coverTarg, NPC->client->renderInfo.muzzlePoint ); + } + } + else + {//clear + if ( trace.fraction < 1.0f ) + {//hit something + gentity_t *traceEnt = &g_entities[trace.entityNum]; + if ( traceEnt && traceEnt->takedamage ) + {//damage it + G_SoundAtSpot( trace.endpos, G_SoundIndex( "sound/weapons/galak/laserdamage.wav" ), qfalse ); + G_Damage( traceEnt, NPC, NPC, NPC->client->renderInfo.muzzleDir, trace.endpos, 10, 0, MOD_ENERGY ); + } + } + if ( NPCInfo->coverTarg ) + { + G_SetOrigin( NPCInfo->coverTarg, trace.endpos ); + } + if ( !Q_irand( 0, 5 ) ) + { + G_SoundAtSpot( trace.endpos, G_SoundIndex( "sound/weapons/galak/laserdamage.wav" ), qfalse ); + } + } + } + } + } + else + {//Okay, we're not in a special attack, see if we should switch weapons or start a special attack + /* + if ( NPC->s.weapon == WP_REPEATER + && !(NPCInfo->scriptFlags & SCF_ALT_FIRE)//using rapid-fire + && NPC->enemy->s.weapon == WP_SABER //enemy using saber + && NPC->client && (NPC->client->ps.saberEventFlags&SEF_DEFLECTED) + && !Q_irand( 0, 50 ) ) + {//he's deflecting my shots, switch to the laser or the lob fire for a while + TIMER_Set( NPC, "noRapid", Q_irand( 2000, 6000 ) ); + NPCInfo->scriptFlags |= SCF_ALT_FIRE; + NPC->alt_fire = qtrue; + if ( NPC->locationDamage[HL_GENERIC1] > GENERATOR_HEALTH && (Q_irand( 0, 1 )||enemyDist < MAX_LOB_DIST_SQUARED) ) + {//shield down, use laser + NPC_GM_StartLaser(); + } + } + else*/ + if ( !NPC->client->ps.powerups[PW_GALAK_SHIELD] + && enemyDist < MELEE_DIST_SQUARED + && InFront( NPC->enemy->currentOrigin, NPC->currentOrigin, NPC->client->ps.viewangles, 0.3f ) + && G_StandardHumanoid( NPC->enemy ) )//within 80 and in front + {//our shield is down, and enemy within 80, if very close, use melee attack to slap away + if ( TIMER_Done( NPC, "attackDelay" ) ) + { + //animate me + int swingAnim; + if ( NPC->locationDamage[HL_GENERIC1] > GENERATOR_HEALTH ) + {//generator down, use random melee + swingAnim = Q_irand( BOTH_ATTACK4, BOTH_ATTACK5 );//smackdown or uppercut + } + else + {//always knock-away + swingAnim = BOTH_ATTACK5;//uppercut + } + //FIXME: swing sound + NPC_SetAnim( NPC, SETANIM_BOTH, swingAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + TIMER_Set( NPC, "attackDelay", NPC->client->ps.torsoAnimTimer + Q_irand( 1000, 3000 ) ); + //delay the hurt until the proper point in the anim + TIMER_Set( NPC, "smackTime", 600 ); + NPCInfo->blockedDebounceTime = 0; + //FIXME: say something? + } + } + else if ( !NPC->lockCount && NPC->locationDamage[HL_GENERIC1] > GENERATOR_HEALTH + && TIMER_Done( NPC, "attackDelay" ) + && InFront( NPC->enemy->currentOrigin, NPC->currentOrigin, NPC->client->ps.viewangles, 0.3f ) + && ((!Q_irand( 0, 10*(2-g_spskill->integer))&& enemyDist > MIN_LOB_DIST_SQUARED&& enemyDist < MAX_LOB_DIST_SQUARED) + ||(!TIMER_Done( NPC, "noLob" )&&!TIMER_Done( NPC, "noRapid" ))) + && NPC->enemy->s.weapon != WP_TURRET ) + {//sometimes use the laser beam attack, but only after he's taken down our generator + shoot = qfalse; + NPC_GM_StartLaser(); + } + else if ( enemyDist < MIN_LOB_DIST_SQUARED + && (NPC->enemy->s.weapon != WP_TURRET || Q_stricmp( "PAS", NPC->enemy->classname )) + && TIMER_Done( NPC, "noRapid" ) )//256 + {//enemy within 256 + if ( (NPC->client->ps.weapon == WP_REPEATER) && (NPCInfo->scriptFlags & SCF_ALT_FIRE) ) + {//shooting an explosive, but enemy too close, switch to primary fire + NPCInfo->scriptFlags &= ~SCF_ALT_FIRE; + NPC->alt_fire = qfalse; + //FIXME: use weap raise & lower anims + NPC_ChangeWeapon( WP_REPEATER ); + } + } + else if ( (enemyDist > MAX_LOB_DIST_SQUARED || (NPC->enemy->s.weapon == WP_TURRET && !Q_stricmp( "PAS", NPC->enemy->classname ))) + && TIMER_Done( NPC, "noLob" ) )//448 + {//enemy more than 448 away and we are ready to try lob fire again + if ( (NPC->client->ps.weapon == WP_REPEATER) && !(NPCInfo->scriptFlags & SCF_ALT_FIRE) ) + {//enemy far enough away to use lobby explosives + NPCInfo->scriptFlags |= SCF_ALT_FIRE; + NPC->alt_fire = qtrue; + //FIXME: use weap raise & lower anims + NPC_ChangeWeapon( WP_REPEATER ); + } + } } - - // Setup Move And Aim Directions - //------------------------------- - CVec3 MoveDirection((ActorFlank)?(EnemyFlankPos):(EnemyFuturePos)); - MoveDirection -= ActorPos; - float MoveDistance = MoveDirection.SafeNorm(); - float MoveAccuracy = MoveDirection.Dot(ActorDirection); - - CVec3 AimDirection(EnemyPos); - AimDirection -= ActorPos; - float AimDistance = AimDirection.SafeNorm(); - float AimAccuracy = AimDirection.Dot(ActorDirection); - - - - if (!ActorFlank && TIMER_Done(NPC, "FlankAttackCheck")) + //can we see our target? + if ( NPC_ClearLOS( NPC->enemy ) ) { - TIMER_Set(NPC, "FlankAttackCheck", Q_irand(1000, 3000)); - if (MoveDistance<4000 && Q_irand(0, 1)==0) + NPCInfo->enemyLastSeenTime = level.time;//used here for aim debouncing, not always a clear LOS + enemyLOS = qtrue; + + if ( NPC->client->ps.weapon == WP_NONE ) { - NPCInfo->lastAvoidSteerSideDebouncer = level.time + Q_irand(8000, 14000); + enemyCS = qfalse;//not true, but should stop us from firing + NPC_AimAdjust( -1 );//adjust aim worse longer we have no weapon + } + else + {//can we shoot our target? + if ( ((NPC->client->ps.weapon == WP_REPEATER && (NPCInfo->scriptFlags&SCF_ALT_FIRE))) && enemyDist < MIN_LOB_DIST_SQUARED )//256 + { + enemyCS = qfalse;//not true, but should stop us from firing + hitAlly = qtrue;//us! + //FIXME: if too close, run away! + } + else + { + int hit = NPC_ShotEntity( NPC->enemy, impactPos ); + gentity_t *hitEnt = &g_entities[hit]; + if ( hit == NPC->enemy->s.number + || ( hitEnt && hitEnt->client && hitEnt->client->playerTeam == NPC->client->enemyTeam ) + || ( hitEnt && hitEnt->takedamage ) ) + {//can hit enemy or will hit glass or other breakable, so shoot anyway + enemyCS = qtrue; + NPC_AimAdjust( 2 );//adjust aim better longer we have clear shot at enemy + VectorCopy( NPC->enemy->currentOrigin, NPCInfo->enemyLastSeenLocation ); + } + else + {//Hmm, have to get around this bastard + NPC_AimAdjust( 1 );//adjust aim better longer we can see enemy + if ( hitEnt && hitEnt->client && hitEnt->client->playerTeam == NPC->client->playerTeam ) + {//would hit an ally, don't fire!!! + hitAlly = qtrue; + } + else + {//Check and see where our shot *would* hit... if it's not close to the enemy (within 256?), then don't fire + } + } + } } } - - - - // Fly By Sounds - //--------------- - if ((ActorVeh->m_pVehicleInfo->soundFlyBy || ActorVeh->m_pVehicleInfo->soundFlyBy2) && - EnemyVeh && - MoveDistance<800 && - ActorSpeed>500.0f && - TIMER_Done(NPC, "FlybySoundDebouncer") - ) + else if ( gi.inPVS( NPC->enemy->currentOrigin, NPC->currentOrigin ) ) { - if (EnemySpeed<100.0f || (ActorDirection.Dot(EnemyDirection)*(MoveDistance/800.0f))<-0.5f) + if ( TIMER_Done( NPC, "talkDebounce" ) && !Q_irand( 0, 10 ) ) { - TIMER_Set(NPC, "FlybySoundDebouncer", 2000); - int soundFlyBy = ActorVeh->m_pVehicleInfo->soundFlyBy; - if (ActorVeh->m_pVehicleInfo->soundFlyBy2 && (!soundFlyBy || !Q_irand(0,1))) + if ( NPCInfo->enemyCheckDebounceTime < 8 ) { - soundFlyBy = ActorVeh->m_pVehicleInfo->soundFlyBy2; + int speech = -1; + switch( NPCInfo->enemyCheckDebounceTime ) + { + case 0: + case 1: + case 2: + speech = EV_CHASE1 + NPCInfo->enemyCheckDebounceTime; + break; + case 3: + case 4: + case 5: + speech = EV_COVER1 + NPCInfo->enemyCheckDebounceTime-3; + break; + case 6: + case 7: + speech = EV_ESCAPING1 + NPCInfo->enemyCheckDebounceTime-6; + break; + } + NPCInfo->enemyCheckDebounceTime++; + if ( speech != -1 ) + { + G_AddVoiceEvent( NPC, speech, Q_irand( 3000, 5000 ) ); + TIMER_Set( NPC, "talkDebounce", Q_irand( 5000, 7000 ) ); + } } - G_Sound(ActorVeh->m_pParentEntity, soundFlyBy); } - } + NPCInfo->enemyLastSeenTime = level.time; + int hit = NPC_ShotEntity( NPC->enemy, impactPos ); + gentity_t *hitEnt = &g_entities[hit]; + if ( hit == NPC->enemy->s.number + || ( hitEnt && hitEnt->client && hitEnt->client->playerTeam == NPC->client->enemyTeam ) + || ( hitEnt && hitEnt->takedamage ) ) + {//can hit enemy or will hit glass or other breakable, so shoot anyway + enemyCS = qtrue; + } + else + { + faceEnemy = qtrue; + NPC_AimAdjust( -1 );//adjust aim worse longer we cannot see enemy + } + } -// FLY PAST BEHAVIOR -//=================== - if (EnemySlideBreak || !TIMER_Done(NPC, "MinHoldDirectionTime")) + if ( enemyLOS ) + { + faceEnemy = qtrue; + } + else { - if (TIMER_Done(NPC, "MinHoldDirectionTime")) + if ( !NPCInfo->goalEntity ) { - TIMER_Set(NPC, "MinHoldDirectionTime", 500); // Hold For At Least 500 ms + NPCInfo->goalEntity = NPC->enemy; + } + if ( NPCInfo->goalEntity == NPC->enemy ) + {//for now, always chase the enemy + AImove = qtrue; } - ActorAccelerate = true; // Go - ActorAimAtTarget = false; // Don't Alter Our Aim Direction - ucmd.buttons &=~BUTTON_VEH_SPEED; // Let Normal Vehicle Controls Go } - - -// FLANKING BEHAVIOR -//=================== - else if (ActorFlank) + if ( enemyCS ) { - ActorAccelerate = true; - ActorDoTurbo = (MoveDistance>2500 || EnemyInTurbo); - ucmd.buttons |= BUTTON_VEH_SPEED; // Tells PMove to use the ps.speed we calculate here, not the one from g_vehicles.c - + shoot = qtrue; + //NPCInfo->enemyCheckDebounceTime = level.time;//actually used here as a last actual LOS + } + else + { + if ( !NPCInfo->goalEntity ) + { + NPCInfo->goalEntity = NPC->enemy; + } + if ( NPCInfo->goalEntity == NPC->enemy ) + {//for now, always chase the enemy + AImove = qtrue; + } + } - // For Flanking, We Calculate The Speed By Hand, Rather Than Using Pure Accelerate / No Accelerate Functionality - //--------------------------------------------------------------------------------------------------------------- - NPC->client->ps.speed = ActorVeh->m_pVehicleInfo->speedMax * ((ActorInTurbo)?(1.35f):(1.15f)); + //Check for movement to take care of + GM_CheckMoveState(); + //See if we should override shooting decision with any special considerations + GM_CheckFireState(); - // If In Slowing Distance, Scale Down The Speed As We Approach Our Move Target - //----------------------------------------------------------------------------- - if (MoveDistanceclient->ps.speed *= (MoveDistance/ATTACK_FLANK_SLOWING); - NPC->client->ps.speed += EnemySpeed; - - // Match Enemy Speed - //------------------- - if (NPC->client->ps.speed<5.0f && EnemySpeed<5.0f) - { - NPC->client->ps.speed = EnemySpeed; + if ( NPC->client->ps.weapon == WP_REPEATER && (NPCInfo->scriptFlags&SCF_ALT_FIRE) && shoot && TIMER_Done( NPC, "attackDelay" ) ) + { + vec3_t muzzle; + vec3_t angles; + vec3_t target; + vec3_t velocity = {0,0,0}; + vec3_t mins = {-REPEATER_ALT_SIZE,-REPEATER_ALT_SIZE,-REPEATER_ALT_SIZE}, maxs = {REPEATER_ALT_SIZE,REPEATER_ALT_SIZE,REPEATER_ALT_SIZE}; + + CalcEntitySpot( NPC, SPOT_WEAPON, muzzle ); + + VectorCopy( NPC->enemy->currentOrigin, target ); + + target[0] += Q_flrand( -5, 5 )+(Q_flrand(-1.0f, 1.0f)*(6-NPCInfo->currentAim)*2); + target[1] += Q_flrand( -5, 5 )+(Q_flrand(-1.0f, 1.0f)*(6-NPCInfo->currentAim)*2); + target[2] += Q_flrand( -5, 5 )+(Q_flrand(-1.0f, 1.0f)*(6-NPCInfo->currentAim)*2); + + //Find the desired angles + qboolean clearshot = WP_LobFire( NPC, muzzle, target, mins, maxs, MASK_SHOT|CONTENTS_LIGHTSABER, + velocity, qtrue, NPC->s.number, NPC->enemy->s.number, + 300, 1100, 1500, qtrue ); + if ( VectorCompare( vec3_origin, velocity ) || (!clearshot&&enemyLOS&&enemyCS) ) + {//no clear lob shot and no lob shot that will hit something breakable + if ( enemyLOS && enemyCS && TIMER_Done( NPC, "noRapid" ) ) + {//have a clear straight shot, so switch to primary + NPCInfo->scriptFlags &= ~SCF_ALT_FIRE; + NPC->alt_fire = qfalse; + NPC_ChangeWeapon( WP_REPEATER ); + //keep this weap for a bit + TIMER_Set( NPC, "noLob", Q_irand( 500, 1000 ) ); } - - // Extra Slow Down When Out In Front - //----------------------------------- - if (MoveAccuracy<0.0f) + else { - NPC->client->ps.speed *= (MoveAccuracy + 1.0f); + shoot = qfalse; } + } + else + { + vectoangles( velocity, angles ); + NPCInfo->desiredYaw = AngleNormalize360( angles[YAW] ); + NPCInfo->desiredPitch = AngleNormalize360( angles[PITCH] ); - MoveDirection *= (MoveDistance/ATTACK_FLANK_SLOWING); - EnemyDirection *= 1.0f - (MoveDistance/ATTACK_FLANK_SLOWING); - MoveDirection += EnemyDirection; - - if (TIMER_Done(NPC, "RamCheck")) - { - TIMER_Set(NPC, "RamCheck", Q_irand(1000, 3000)); - if (MoveDistanceclient->hiddenDir ); + NPC->client->hiddenDist = VectorNormalize ( NPC->client->hiddenDir ); } } + else if ( faceEnemy ) + {//face the enemy + NPC_FaceEnemy( qtrue ); + } - -// NORMAL CHASE BEHAVIOR -//======================= - else + if ( !TIMER_Done( NPC, "standTime" ) ) { - if (!EnemyVeh && AimAccuracy>0.99f && MoveDistance<500 && !EnemyDead) + AImove = qfalse; + } + if ( !(NPCInfo->scriptFlags&SCF_CHASE_ENEMIES) ) + {//not supposed to chase my enemies + if ( NPCInfo->goalEntity == NPC->enemy ) + {//goal is my entity, so don't move + AImove = qfalse; + } + } + + if ( AImove && !NPC->lockCount ) + {//move toward goal + if ( NPCInfo->goalEntity + && NPC->client->ps.legsAnim != BOTH_ALERT1 + && NPC->client->ps.legsAnim != BOTH_ATTACK2 + && NPC->client->ps.legsAnim != BOTH_ATTACK4 + && NPC->client->ps.legsAnim != BOTH_ATTACK5 + && NPC->client->ps.legsAnim != BOTH_ATTACK7 ) { - ActorAccelerate = true; - ActorDoTurbo = false; + AImove = GM_Move(); } else { - ActorAccelerate = ((MoveDistance>500 && EnemySpeed>20.0f) || MoveDistance>1000); - ActorDoTurbo = (MoveDistance>3000 && EnemySpeed>20.0f); + AImove = qfalse; } - ucmd.buttons &=~BUTTON_VEH_SPEED; } + if ( !TIMER_Done( NPC, "flee" ) ) + {//running away + faceEnemy = qfalse; + } + //FIXME: check scf_face_move_dir here? - -// APPLY RESULTS -//======================= - // Decide Turbo - //-------------- - if (ActorDoTurbo || ActorInTurbo) - { - ucmd.buttons |= BUTTON_ALT_ATTACK; + if ( !faceEnemy ) + {//we want to face in the dir we're running + if ( !AImove ) + {//if we haven't moved, we should look in the direction we last looked? + VectorCopy( NPC->client->ps.viewangles, NPCInfo->lastPathAngles ); + } + if ( AImove ) + {//don't run away and shoot + NPCInfo->desiredYaw = NPCInfo->lastPathAngles[YAW]; + NPCInfo->desiredPitch = 0; + shoot = qfalse; + } } - else + NPC_UpdateAngles( qtrue, qtrue ); + + if ( NPCInfo->scriptFlags & SCF_DONT_FIRE ) { - ucmd.buttons &=~BUTTON_ALT_ATTACK; + shoot = qfalse; } - // Decide Acceleration - //--------------------- - ucmd.forwardmove = (ActorAccelerate)?(127):(0); - - - - // Decide To Shoot - //----------------- - ucmd.buttons &=~BUTTON_ATTACK; - ucmd.rightmove = 0; - if (AimDistance<2000 && !EnemyDead) + if ( NPC->enemy && NPC->enemy->enemy ) { - // If Doing A Ram Attack - //----------------------- - if (ActorYawOffset!=0) + if ( NPC->enemy->s.weapon == WP_SABER && NPC->enemy->enemy->s.weapon == WP_SABER ) + {//don't shoot at an enemy jedi who is fighting another jedi, for fear of injuring one or causing rogue blaster deflections (a la Obi Wan/Vader duel at end of ANH) + shoot = qfalse; + } + } + //FIXME: don't shoot right away! + if ( shoot ) + {//try to shoot if it's time + if ( TIMER_Done( NPC, "attackDelay" ) ) { - if (NPC->client->ps.weapon!=WP_NONE) + if( !(NPCInfo->scriptFlags & SCF_FIRE_WEAPON) ) // we've already fired, no need to do it again here { - NPC_ChangeWeapon(WP_NONE); + WeaponThink( qtrue ); } - ucmd.buttons &=~BUTTON_ATTACK; } - else if (AimAccuracy>ATTACK_FWD) - { - if (NPC->client->ps.weapon!=WP_NONE) + } + + //also: + if ( NPC->enemy->s.weapon == WP_TURRET && !Q_stricmp( "PAS", NPC->enemy->classname ) ) + {//crush turrets + if ( G_BoundsOverlap( NPC->absmin, NPC->absmax, NPC->enemy->absmin, NPC->enemy->absmax ) ) + {//have to do this test because placed turrets are not solid to NPCs (so they don't obstruct navigation) + if ( NPC->client->ps.powerups[PW_GALAK_SHIELD] > 0 ) { - NPC_ChangeWeapon(WP_NONE); + NPC->client->ps.powerups[PW_BATTLESUIT] = level.time + ARMOR_EFFECT_TIME; + G_Damage( NPC->enemy, NPC, NPC, NULL, NPC->currentOrigin, 100, DAMAGE_NO_KNOCKBACK, MOD_ELECTROCUTE ); + } + else + { + G_Damage( NPC->enemy, NPC, NPC, NULL, NPC->currentOrigin, 100, DAMAGE_NO_KNOCKBACK, MOD_CRUSH ); } - ucmd.buttons |= BUTTON_ATTACK; } - else if (AimAccuracy-AIM_SIDE) - { - if (NPC->client->ps.weapon!=WP_BLASTER) + } + else if ( NPCInfo->touchedByPlayer != NULL && NPCInfo->touchedByPlayer == NPC->enemy ) + {//touched enemy + if ( NPC->client->ps.powerups[PW_GALAK_SHIELD] > 0 ) + {//zap him! + //animate me + NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_ATTACK6, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + TIMER_Set( NPC, "attackDelay", NPC->client->ps.torsoAnimTimer ); + TIMER_Set( NPC, "standTime", NPC->client->ps.legsAnimTimer ); + //FIXME: debounce this? + NPCInfo->touchedByPlayer = NULL; + //FIXME: some shield effect? + NPC->client->ps.powerups[PW_BATTLESUIT] = level.time + ARMOR_EFFECT_TIME; + vec3_t smackDir; + VectorSubtract( NPC->enemy->currentOrigin, NPC->currentOrigin, smackDir ); + smackDir[2] += 30; + VectorNormalize( smackDir ); + G_Damage( NPC->enemy, NPC, NPC, smackDir, NPC->currentOrigin, (g_spskill->integer+1)*Q_irand( 5, 10), DAMAGE_NO_KNOCKBACK, MOD_ELECTROCUTE ); + //throw them + G_Throw( NPC->enemy, smackDir, 100 ); + NPC->enemy->s.powerups |= ( 1 << PW_SHOCKED ); + if ( NPC->enemy->client ) { - NPC_ChangeWeapon(WP_BLASTER); + NPC->enemy->client->ps.powerups[PW_SHOCKED] = level.time + 1000; } + //stop any attacks + ucmd.buttons = 0; + } + } - if (AimAccuracy-ATTACK_SIDE) + if ( NPCInfo->movementSpeech < 3 && NPCInfo->blockedSpeechDebounceTime <= level.time ) + { + if ( NPC->enemy && NPC->enemy->health > 0 && NPC->enemy->painDebounceTime > level.time ) + { + if ( NPC->enemy->health < 50 && NPCInfo->movementSpeech == 2 ) { - //if (!TIMER_Done(NPC, "RiderAltAttack")) - //{ - // ucmd.buttons |= BUTTON_ALT_ATTACK; - //} - //else - //{ - ucmd.buttons |= BUTTON_ATTACK; - - /* if (TIMER_Done(NPC, "RiderAltAttackCheck")) - { - TIMER_Set(NPC, "RiderAltAttackCheck", Q_irand(1000, 3000)); - if (Q_irand(0, 2)==0) - { - TIMER_Set(NPC, "RiderAltAttack", 300); - } - }*/ - //} - WeaponThink(qtrue); + G_AddVoiceEvent( NPC, EV_ANGER2, Q_irand( 2000, 4000 ) ); + NPCInfo->movementSpeech = 3; + } + else if ( NPC->enemy->health < 75 && NPCInfo->movementSpeech == 1 ) + { + G_AddVoiceEvent( NPC, EV_ANGER1, Q_irand( 2000, 4000 ) ); + NPCInfo->movementSpeech = 2; + } + else if ( NPC->enemy->health < 100 && NPCInfo->movementSpeech == 0 ) + { + G_AddVoiceEvent( NPC, EV_ANGER3, Q_irand( 2000, 4000 ) ); + NPCInfo->movementSpeech = 1; } - ucmd.rightmove = (EnemySide==Side_Left)?( 127):(-127); } - else - { - if (NPC->client->ps.weapon!=WP_NONE) + } +} + +void NPC_BSGM_Default( void ) +{ + if( NPCInfo->scriptFlags & SCF_FIRE_WEAPON ) + { + WeaponThink( qtrue ); + } + + if ( NPC->client->ps.stats[STAT_ARMOR] <= 0 ) + {//armor gone + if ( !NPCInfo->investigateDebounceTime ) + {//start regenerating the armor + gi.G2API_SetSurfaceOnOff( &NPC->ghoul2[NPC->playerModel], "torso_shield_off", TURN_OFF ); + NPC->flags &= ~FL_SHIELDED;//no more reflections + VectorSet( NPC->mins, -20, -20, -24 ); + VectorSet( NPC->maxs, 20, 20, 64 ); + NPC->client->crouchheight = NPC->client->standheight = 64; + if ( NPC->locationDamage[HL_GENERIC1] < GENERATOR_HEALTH ) + {//still have the generator bolt-on + if ( NPCInfo->investigateCount < 12 ) + { + NPCInfo->investigateCount++; + } + NPCInfo->investigateDebounceTime = level.time + (NPCInfo->investigateCount * 5000); + } + } + else if ( NPCInfo->investigateDebounceTime < level.time ) + {//armor regenerated, turn shield back on + //do a trace and make sure we can turn this back on? + trace_t tr; + gi.trace( &tr, NPC->currentOrigin, shieldMins, shieldMaxs, NPC->currentOrigin, NPC->s.number, NPC->clipmask, G2_NOCOLLIDE, 0 ); + if ( !tr.startsolid ) { - NPC_ChangeWeapon(WP_NONE); + VectorCopy( shieldMins, NPC->mins ); + VectorCopy( shieldMaxs, NPC->maxs ); + NPC->client->crouchheight = NPC->client->standheight = shieldMaxs[2]; + NPC->client->ps.stats[STAT_ARMOR] = GALAK_SHIELD_HEALTH; + NPCInfo->investigateDebounceTime = 0; + NPC->flags |= FL_SHIELDED;//reflect normal shots + NPC->fx_time = level.time; + gi.G2API_SetSurfaceOnOff( &NPC->ghoul2[NPC->playerModel], "torso_shield_off", TURN_ON ); } } } + if ( NPC->client->ps.stats[STAT_ARMOR] > 0 ) + {//armor present + NPC->client->ps.powerups[PW_GALAK_SHIELD] = Q3_INFINITE;//temp, for effect + gi.G2API_SetSurfaceOnOff( &NPC->ghoul2[NPC->playerModel], "torso_shield_off", TURN_ON ); + } else { - if (NPC->client->ps.weapon!=WP_NONE) - { - NPC_ChangeWeapon(WP_NONE); - } + gi.G2API_SetSurfaceOnOff( &NPC->ghoul2[NPC->playerModel], "torso_shield_off", TURN_OFF ); } - - // Aim At Target - //--------------- - if (ActorAimAtTarget) - { - MoveDirection.VecToAng(); - NPCInfo->desiredPitch = AngleNormalize360(MoveDirection[PITCH]); - NPCInfo->desiredYaw = AngleNormalize360(MoveDirection[YAW] + ActorYawOffset); + if( !NPC->enemy ) + {//don't have an enemy, look for one + NPC_BSGM_Patrol(); + } + else //if ( NPC->enemy ) + {//have an enemy + NPC_BSGM_Attack(); } - NPC_UpdateAngles(qtrue, qtrue); } - diff --git a/code/game/AI_Vehicle.cpp b/code/game/AI_Vehicle.cpp new file mode 100644 index 0000000000..9f0714e7dc --- /dev/null +++ b/code/game/AI_Vehicle.cpp @@ -0,0 +1,766 @@ +/* +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +//////////////////////////////////////////////////////////////////////////////////////// +// RAVEN SOFTWARE - STAR WARS: JK III +// (c) 2002 Activision +// +// April 3, 2003 - This file has been commandeered for use by AI vehicle pilots. +// +//////////////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////////////// +// Includes +//////////////////////////////////////////////////////////////////////////////////////// +#include "b_local.h" +#include "anims.h" +#include "g_navigator.h" +#include "g_vehicles.h" +#include "g_functions.h" +#if !defined(RATL_VECTOR_VS_INC) + #include "../Ratl/vector_vs.h" +#endif + + +//////////////////////////////////////////////////////////////////////////////////////// +// Defines +//////////////////////////////////////////////////////////////////////////////////////// +#define MAX_VEHICLES_REGISTERED 100 + +#define ATTACK_FWD 0.95f +#define ATTACK_SIDE 0.20f +#define AIM_SIDE 0.60f +#define FUTURE_PRED_DIST 20.0f +#define FUTURE_SIDE_DIST 60.0f +#define ATTACK_FLANK_SLOWING 1000.0f +#define RAM_DIST 150.0f +#define MIN_STAY_VIEWABLE_TIME 20000 + + + +//////////////////////////////////////////////////////////////////////////////////////// +// Externs +//////////////////////////////////////////////////////////////////////////////////////// +extern Vehicle_t *G_IsRidingVehicle( gentity_t *ent ); +extern void G_SoundAtSpot( vec3_t org, int soundIndex, qboolean broadcast ); +extern void CG_DrawEdge( vec3_t start, vec3_t end, int type ); + + + +trace_t mPilotViewTrace; +int mPilotViewTraceCount; +int mActivePilotCount; +ratl::vector_vs mRegistered; + + + +//////////////////////////////////////////////////////////////////////////////////////// +// +//////////////////////////////////////////////////////////////////////////////////////// +void Pilot_Reset(void) +{ + mPilotViewTraceCount = 0; + mActivePilotCount = 0; + mRegistered.clear(); +} + +//////////////////////////////////////////////////////////////////////////////////////// +// +//////////////////////////////////////////////////////////////////////////////////////// +int Pilot_ActivePilotCount() +{ + return mActivePilotCount; +} + +//////////////////////////////////////////////////////////////////////////////////////// +// +//////////////////////////////////////////////////////////////////////////////////////// +void Pilot_Update(void) +{ + mActivePilotCount = 0; + mRegistered.clear(); + for (int i=0; igreetEnt && + g_entities[i].NPC->greetEnt->owner==(&g_entities[i]) + ) + { + mActivePilotCount++; + } + if ( g_entities[i].inuse && + g_entities[i].client && + g_entities[i].m_pVehicle && + !g_entities[i].owner && + g_entities[i].health>0 && + g_entities[i].m_pVehicle->m_pVehicleInfo->type==VH_SPEEDER && + !mRegistered.full()) + { + mRegistered.push_back(&g_entities[i]); + } + + } + + + if (player && + player->inuse && + TIMER_Done(player, "FlybySoundArchitectureDebounce")) + { + TIMER_Set(player, "FlybySoundArchitectureDebounce", 300); + + Vehicle_t* pVeh = G_IsRidingVehicle(player); + + if (pVeh && + (pVeh->m_pVehicleInfo->soundFlyBy || pVeh->m_pVehicleInfo->soundFlyBy2) && + //fabsf(pVeh->m_pParentEntity->currentAngles[2])<15.0f && + VectorLength(pVeh->m_pParentEntity->client->ps.velocity)>500.0f) + { + vec3_t projectedPosition; + vec3_t projectedDirection; + vec3_t projectedRight; + vec3_t anglesNoRoll; + + VectorCopy(pVeh->m_pParentEntity->currentAngles, anglesNoRoll); + anglesNoRoll[2] = 0; + AngleVectors(anglesNoRoll, projectedDirection, projectedRight, 0); + + VectorMA(player->currentOrigin, 1.2f, pVeh->m_pParentEntity->client->ps.velocity, projectedPosition); + VectorMA(projectedPosition, Q_flrand(-200.0f, 200.0f), projectedRight, projectedPosition); + + gi.trace(&mPilotViewTrace, + player->currentOrigin, + 0, + 0, + projectedPosition, + player->s.number, + MASK_SHOT, (EG2_Collision)0, 0); + + if ((mPilotViewTrace.allsolid==qfalse) && + (mPilotViewTrace.startsolid==qfalse) && + (mPilotViewTrace.fraction<0.99f) && + (mPilotViewTrace.plane.normal[2]<0.5f) && + (DotProduct(projectedDirection, mPilotViewTrace.plane.normal)<-0.5f) + ) + { + // CG_DrawEdge(player->currentOrigin, mPilotViewTrace.endpos, EDGE_IMPACT_POSSIBLE); + TIMER_Set(player, "FlybySoundArchitectureDebounce", Q_irand(1000, 2000)); + + int soundFlyBy = pVeh->m_pVehicleInfo->soundFlyBy; + if (pVeh->m_pVehicleInfo->soundFlyBy2 && (!soundFlyBy || !Q_irand(0,1))) + { + soundFlyBy = pVeh->m_pVehicleInfo->soundFlyBy2; + } + G_SoundAtSpot(mPilotViewTrace.endpos, soundFlyBy, qtrue); + } + else + { + // CG_DrawEdge(player->currentOrigin, mPilotViewTrace.endpos, EDGE_IMPACT_SAFE); + } + } + } +} + +//////////////////////////////////////////////////////////////////////////////////////// +// +//////////////////////////////////////////////////////////////////////////////////////// +bool Pilot_AnyVehiclesRegistered() +{ + return (!mRegistered.empty()); +} + + + + + +//////////////////////////////////////////////////////////////////////////////////////// +// Vehicle Registration +// +// Any vehicles that can be ridden by NPCs should be registered here +// +//////////////////////////////////////////////////////////////////////////////////////// +void Vehicle_Register(gentity_t *ent) +{ +} + + +//////////////////////////////////////////////////////////////////////////////////////// +// Vehicle Remove From The List Of Valid +//////////////////////////////////////////////////////////////////////////////////////// +void Vehicle_Remove(gentity_t *ent) +{ +} + +//////////////////////////////////////////////////////////////////////////////////////// +// Vehicle_Find +// +// Will look through all registered vehicles and choose the closest one that the given +// entity can get to. +// +//////////////////////////////////////////////////////////////////////////////////////// +gentity_t* Vehicle_Find(gentity_t *ent) +{ + gentity_t* closest = 0; + float closestDist = 0; + float curDist = 0; + + + for (int i=0; iowner) + { + curDist = Distance(mRegistered[i]->currentOrigin, ent->currentOrigin); + if (curDist<1000 && (!closest || curDistenemy) + { + // If Still On A Vehicle, Jump Off + //--------------------------------- + if (NPCInfo->greetEnt) + { + ucmd.upmove = 127; + + if (NPCInfo->greetEnt && NPCInfo->greetEnt->m_pVehicle && (level.timeconfusionTime||level.timeinsanityTime)) + { + Vehicle_t* pVeh = NPCInfo->greetEnt->m_pVehicle; + if (!(pVeh->m_ulFlags&VEH_OUTOFCONTROL)) + { + gentity_t* parent = pVeh->m_pParentEntity; + float CurSpeed = VectorLength(parent->client->ps.velocity); + pVeh->m_pVehicleInfo->StartDeathDelay(pVeh, 10000); + pVeh->m_ulFlags |= (VEH_OUTOFCONTROL); + VectorScale(parent->client->ps.velocity, 1.25f, parent->pos3); + if (CurSpeedm_pVehicleInfo->speedMax) + { + VectorNormalize(parent->pos3); + if (fabsf(parent->pos3[2])<0.25f) + { + VectorScale(parent->pos3, (pVeh->m_pVehicleInfo->speedMax * 1.25f), parent->pos3); + } + else + { + VectorScale(parent->client->ps.velocity, 1.25f, parent->pos3); + } + } + } + } + + if (NPCInfo->greetEnt->owner==NPC) + { + return true; + } + NPCInfo->greetEnt = 0; + } + + // Otherwise Nothing To See Here + //------------------------------- + return false; + } + + + // If We Already Have A Target Vehicle, Make Sure It Is Still Valid + //------------------------------------------------------------------ + if (NPCInfo->greetEnt) + { + if (!NPCInfo->greetEnt->inuse || + !NPCInfo->greetEnt->m_pVehicle || + !NPCInfo->greetEnt->m_pVehicle->m_pVehicleInfo) + { + NPCInfo->greetEnt = Vehicle_Find(NPC); + } + else + { + if (NPCInfo->greetEnt->owner && NPCInfo->greetEnt->owner!=NPC) + { + NPCInfo->greetEnt = Vehicle_Find(NPC); + } + } + } + + // If We Have An Enemy, Try To Find A Vehicle Nearby + //--------------------------------------------------- + else + { + NPCInfo->greetEnt = Vehicle_Find(NPC); + } + + // If No Vehicle Available, Continue As Usual + //-------------------------------------------- + if (!NPCInfo->greetEnt) + { + return false; + } + + + + if (NPCInfo->greetEnt->owner==NPC) + { + Pilot_Steer_Vehicle(); + } + else + { + Pilot_Goto_Vehicle(); + } + + Pilot_Update_Enemy(); + return true; +} + + + + + + +//////////////////////////////////////////////////////////////////////////////////////// +// +//////////////////////////////////////////////////////////////////////////////////////// +void Pilot_Update_Enemy() +{ + if (!TIMER_Exists(NPC, "PilotRemoveTime")) + { + TIMER_Set(NPC, "PilotRemoveTime", MIN_STAY_VIEWABLE_TIME); + } + + if (TIMER_Done(NPC, "NextPilotCheckEnemyTime")) + { + TIMER_Set(NPC, "NextPilotCheckEnemyTime", Q_irand(1000,2000)); + if (NPC->enemy && Distance(NPC->currentOrigin, NPC->enemy->currentOrigin)>1000.0f) + { + mPilotViewTraceCount ++; + gi.trace(&mPilotViewTrace, + NPC->currentOrigin, + 0, + 0, + NPC->enemy->currentOrigin, + NPC->s.number, + MASK_SHOT, + (EG2_Collision)0, 0); + + if ((mPilotViewTrace.allsolid==qfalse) && + (mPilotViewTrace.startsolid==qfalse ) && + ((mPilotViewTrace.entityNum==NPC->enemy->s.number)||(mPilotViewTrace.entityNum==NPC->enemy->s.m_iVehicleNum))) + { + TIMER_Set(NPC, "PilotRemoveTime", MIN_STAY_VIEWABLE_TIME); + } + } + else + { + TIMER_Set(NPC, "PilotRemoveTime", MIN_STAY_VIEWABLE_TIME); + } + } + + if (TIMER_Done(NPC, "PilotRemoveTime")) + { + if (NPCInfo->greetEnt->owner==NPC) + { + NPCInfo->greetEnt->e_ThinkFunc = thinkF_G_FreeEntity; + NPCInfo->greetEnt->nextthink = level.time; + } + NPC->e_ThinkFunc = thinkF_G_FreeEntity; + NPC->nextthink = level.time; + } +} + + +//////////////////////////////////////////////////////////////////////////////////////// +// +//////////////////////////////////////////////////////////////////////////////////////// +void Pilot_Goto_Vehicle() +{ + STEER::Activate(NPC); + { + if (STEER::Reached(NPC, NPCInfo->greetEnt, 80.0f)) + { + NPC_Use(NPCInfo->greetEnt, NPC, NPC); + } + else if (NAV::OnNeighboringPoints(NPC, NPCInfo->greetEnt)) + { + STEER::Persue(NPC, NPCInfo->greetEnt, 50.0f, 0.0f, 30.0f, 0.0f, true); + } + else + { + if (!NAV::GoTo(NPC, NPCInfo->greetEnt)) + { + STEER::Stop(NPC); + } + } + } + STEER::AvoidCollisions(NPC); + STEER::DeActivate(NPC, &ucmd); + NPC_UpdateAngles(qtrue, qtrue); +} + +extern bool VEH_StartStrafeRam(Vehicle_t *pVeh, bool Right); + +//////////////////////////////////////////////////////////////////////////////////////// +// +//////////////////////////////////////////////////////////////////////////////////////// +void Pilot_Steer_Vehicle() +{ + if (!NPC->enemy || !NPC->enemy->client) + { + return; + } + + + + + + +// SETUP +//======= + // Setup Actor Data + //------------------ + CVec3 ActorPos(NPC->currentOrigin); + CVec3 ActorAngles(NPC->currentAngles); + ActorAngles[2] = 0; + Vehicle_t* ActorVeh = NPCInfo->greetEnt->m_pVehicle; + bool ActorInTurbo = (ActorVeh->m_iTurboTime>level.time); + float ActorSpeed = (ActorVeh)?(VectorLength(ActorVeh->m_pParentEntity->client->ps.velocity)):(NPC->client->ps.speed); + + + // If my vehicle is spinning out of control, just hold on, we're going to die!!!!! + //--------------------------------------------------------------------------------- + if (ActorVeh && (ActorVeh->m_ulFlags & VEH_OUTOFCONTROL)) + { + if (NPC->client->ps.weapon!=WP_NONE) + { + NPC_ChangeWeapon(WP_NONE); + } + ucmd.buttons &=~BUTTON_ATTACK; + ucmd.buttons &=~BUTTON_ALT_ATTACK; + return; + } + + CVec3 ActorDirection; + AngleVectors(ActorAngles.v, ActorDirection.v, 0, 0); + + CVec3 ActorFuturePos(ActorPos); + ActorFuturePos.ScaleAdd(ActorDirection, FUTURE_PRED_DIST); + + bool ActorDoTurbo = false; + bool ActorAccelerate = false; + bool ActorAimAtTarget= true; + float ActorYawOffset = 0.0f; + + + // Setup Enemy Data + //------------------ + CVec3 EnemyPos(NPC->enemy->currentOrigin); + CVec3 EnemyAngles(NPC->enemy->currentAngles); + EnemyAngles[2] = 0; + Vehicle_t* EnemyVeh = (NPC->enemy->s.m_iVehicleNum)?(g_entities[NPC->enemy->s.m_iVehicleNum].m_pVehicle):(0); + bool EnemyInTurbo = (EnemyVeh && EnemyVeh->m_iTurboTime>level.time); + float EnemySpeed = (EnemyVeh)?(EnemyVeh->m_pParentEntity->client->ps.speed):(NPC->enemy->resultspeed); + bool EnemySlideBreak = (EnemyVeh && (EnemyVeh->m_ulFlags&VEH_SLIDEBREAKING || EnemyVeh->m_ulFlags&VEH_STRAFERAM)); + bool EnemyDead = (NPC->enemy->health<=0); + + bool ActorFlank = (NPCInfo->lastAvoidSteerSideDebouncer>level.time && EnemyVeh && EnemySpeed>10.0f); + + CVec3 EnemyDirection; + CVec3 EnemyRight; + AngleVectors(EnemyAngles.v, EnemyDirection.v, EnemyRight.v, 0); + + CVec3 EnemyFuturePos(EnemyPos); + EnemyFuturePos.ScaleAdd(EnemyDirection, FUTURE_PRED_DIST); + + ESide EnemySide = ActorPos.LRTest(EnemyPos, EnemyFuturePos); + CVec3 EnemyFlankPos(EnemyFuturePos); + EnemyFlankPos.ScaleAdd(EnemyRight, (EnemySide==Side_Right)?(FUTURE_SIDE_DIST):(-FUTURE_SIDE_DIST)); + + // Debug Draw Enemy Data + //----------------------- + if (false) + { + CG_DrawEdge(EnemyPos.v, EnemyFuturePos.v, EDGE_IMPACT_SAFE); + CG_DrawEdge(EnemyFuturePos.v, EnemyFlankPos.v, EDGE_IMPACT_SAFE); + } + + + // Setup Move And Aim Directions + //------------------------------- + CVec3 MoveDirection((ActorFlank)?(EnemyFlankPos):(EnemyFuturePos)); + MoveDirection -= ActorPos; + float MoveDistance = MoveDirection.SafeNorm(); + float MoveAccuracy = MoveDirection.Dot(ActorDirection); + + CVec3 AimDirection(EnemyPos); + AimDirection -= ActorPos; + float AimDistance = AimDirection.SafeNorm(); + float AimAccuracy = AimDirection.Dot(ActorDirection); + + + + if (!ActorFlank && TIMER_Done(NPC, "FlankAttackCheck")) + { + TIMER_Set(NPC, "FlankAttackCheck", Q_irand(1000, 3000)); + if (MoveDistance<4000 && Q_irand(0, 1)==0) + { + NPCInfo->lastAvoidSteerSideDebouncer = level.time + Q_irand(8000, 14000); + } + } + + + + // Fly By Sounds + //--------------- + if ((ActorVeh->m_pVehicleInfo->soundFlyBy || ActorVeh->m_pVehicleInfo->soundFlyBy2) && + EnemyVeh && + MoveDistance<800 && + ActorSpeed>500.0f && + TIMER_Done(NPC, "FlybySoundDebouncer") + ) + { + if (EnemySpeed<100.0f || (ActorDirection.Dot(EnemyDirection)*(MoveDistance/800.0f))<-0.5f) + { + TIMER_Set(NPC, "FlybySoundDebouncer", 2000); + int soundFlyBy = ActorVeh->m_pVehicleInfo->soundFlyBy; + if (ActorVeh->m_pVehicleInfo->soundFlyBy2 && (!soundFlyBy || !Q_irand(0,1))) + { + soundFlyBy = ActorVeh->m_pVehicleInfo->soundFlyBy2; + } + G_Sound(ActorVeh->m_pParentEntity, soundFlyBy); + } + } + + + +// FLY PAST BEHAVIOR +//=================== + if (EnemySlideBreak || !TIMER_Done(NPC, "MinHoldDirectionTime")) + { + if (TIMER_Done(NPC, "MinHoldDirectionTime")) + { + TIMER_Set(NPC, "MinHoldDirectionTime", 500); // Hold For At Least 500 ms + } + ActorAccelerate = true; // Go + ActorAimAtTarget = false; // Don't Alter Our Aim Direction + ucmd.buttons &=~BUTTON_VEH_SPEED; // Let Normal Vehicle Controls Go + } + + +// FLANKING BEHAVIOR +//=================== + else if (ActorFlank) + { + ActorAccelerate = true; + ActorDoTurbo = (MoveDistance>2500 || EnemyInTurbo); + ucmd.buttons |= BUTTON_VEH_SPEED; // Tells PMove to use the ps.speed we calculate here, not the one from g_vehicles.c + + + // For Flanking, We Calculate The Speed By Hand, Rather Than Using Pure Accelerate / No Accelerate Functionality + //--------------------------------------------------------------------------------------------------------------- + NPC->client->ps.speed = ActorVeh->m_pVehicleInfo->speedMax * ((ActorInTurbo)?(1.35f):(1.15f)); + + + // If In Slowing Distance, Scale Down The Speed As We Approach Our Move Target + //----------------------------------------------------------------------------- + if (MoveDistanceclient->ps.speed *= (MoveDistance/ATTACK_FLANK_SLOWING); + NPC->client->ps.speed += EnemySpeed; + + // Match Enemy Speed + //------------------- + if (NPC->client->ps.speed<5.0f && EnemySpeed<5.0f) + { + NPC->client->ps.speed = EnemySpeed; + } + + // Extra Slow Down When Out In Front + //----------------------------------- + if (MoveAccuracy<0.0f) + { + NPC->client->ps.speed *= (MoveAccuracy + 1.0f); + } + + + MoveDirection *= (MoveDistance/ATTACK_FLANK_SLOWING); + EnemyDirection *= 1.0f - (MoveDistance/ATTACK_FLANK_SLOWING); + MoveDirection += EnemyDirection; + + if (TIMER_Done(NPC, "RamCheck")) + { + TIMER_Set(NPC, "RamCheck", Q_irand(1000, 3000)); + if (MoveDistance0.99f && MoveDistance<500 && !EnemyDead) + { + ActorAccelerate = true; + ActorDoTurbo = false; + } + else + { + ActorAccelerate = ((MoveDistance>500 && EnemySpeed>20.0f) || MoveDistance>1000); + ActorDoTurbo = (MoveDistance>3000 && EnemySpeed>20.0f); + } + ucmd.buttons &=~BUTTON_VEH_SPEED; + } + + + + +// APPLY RESULTS +//======================= + // Decide Turbo + //-------------- + if (ActorDoTurbo || ActorInTurbo) + { + ucmd.buttons |= BUTTON_ALT_ATTACK; + } + else + { + ucmd.buttons &=~BUTTON_ALT_ATTACK; + } + + // Decide Acceleration + //--------------------- + ucmd.forwardmove = (ActorAccelerate)?(127):(0); + + + + // Decide To Shoot + //----------------- + ucmd.buttons &=~BUTTON_ATTACK; + ucmd.rightmove = 0; + if (AimDistance<2000 && !EnemyDead) + { + // If Doing A Ram Attack + //----------------------- + if (ActorYawOffset!=0) + { + if (NPC->client->ps.weapon!=WP_NONE) + { + NPC_ChangeWeapon(WP_NONE); + } + ucmd.buttons &=~BUTTON_ATTACK; + } + else if (AimAccuracy>ATTACK_FWD) + { + if (NPC->client->ps.weapon!=WP_NONE) + { + NPC_ChangeWeapon(WP_NONE); + } + ucmd.buttons |= BUTTON_ATTACK; + } + else if (AimAccuracy-AIM_SIDE) + { + if (NPC->client->ps.weapon!=WP_BLASTER) + { + NPC_ChangeWeapon(WP_BLASTER); + } + + if (AimAccuracy-ATTACK_SIDE) + { + //if (!TIMER_Done(NPC, "RiderAltAttack")) + //{ + // ucmd.buttons |= BUTTON_ALT_ATTACK; + //} + //else + //{ + ucmd.buttons |= BUTTON_ATTACK; + + /* if (TIMER_Done(NPC, "RiderAltAttackCheck")) + { + TIMER_Set(NPC, "RiderAltAttackCheck", Q_irand(1000, 3000)); + if (Q_irand(0, 2)==0) + { + TIMER_Set(NPC, "RiderAltAttack", 300); + } + }*/ + //} + WeaponThink(qtrue); + } + ucmd.rightmove = (EnemySide==Side_Left)?( 127):(-127); + } + else + { + if (NPC->client->ps.weapon!=WP_NONE) + { + NPC_ChangeWeapon(WP_NONE); + } + } + } + else + { + if (NPC->client->ps.weapon!=WP_NONE) + { + NPC_ChangeWeapon(WP_NONE); + } + } + + + // Aim At Target + //--------------- + if (ActorAimAtTarget) + { + MoveDirection.VecToAng(); + NPCInfo->desiredPitch = AngleNormalize360(MoveDirection[PITCH]); + NPCInfo->desiredYaw = AngleNormalize360(MoveDirection[YAW] + ActorYawOffset); + } + NPC_UpdateAngles(qtrue, qtrue); +} + diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index a878533c5b..cc9f6f53cc 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -62,6 +62,7 @@ set(SPGameGameFiles "${SPDir}/game/AI_Stormtrooper.cpp" "${SPDir}/game/AI_Tusken.cpp" "${SPDir}/game/AI_Utils.cpp" + "${SPDir}/game/AI_Vehicle.cpp" "${SPDir}/game/AI_Wampa.cpp" "${SPDir}/game/fp_repulse.cpp" "${SPDir}/game/g_active.cpp" diff --git a/code/game/NPC.cpp b/code/game/NPC.cpp index 0315b44bcf..a0d06546db 100644 --- a/code/game/NPC.cpp +++ b/code/game/NPC.cpp @@ -87,6 +87,7 @@ static bState_t G_CurrentBState( gNPC_t *gNPC ); extern int eventClearTime; +extern void GM_Dying( gentity_t *self ); void CorpsePhysics( gentity_t *self ) { // run the bot through the server like it was a real client @@ -94,6 +95,10 @@ void CorpsePhysics( gentity_t *self ) ClientThink( self->s.number, &ucmd ); VectorCopy( self->s.origin, self->s.origin2 ); + if ( self->client->NPC_class == CLASS_GALAKMECH ) + { + GM_Dying( self ); + } //FIXME: match my pitch and roll for the slope of my groundPlane if ( self->client->ps.groundEntityNum != ENTITYNUM_NONE && !(self->flags&FL_DISINTEGRATED) ) {//on the ground @@ -1856,6 +1861,7 @@ extern void NPC_BSSD_Default( void ); extern void NPC_BehaviorSet_Trooper( int bState ); extern bool NPC_IsTrooper( gentity_t *ent ); extern bool Pilot_MasterUpdate(); +extern void NPC_BSGM_Default( void ); void NPC_RunBehavior( int team, int bState ) { @@ -2037,6 +2043,9 @@ void NPC_RunBehavior( int team, int bState ) case CLASS_MARK2: NPC_BehaviorSet_Mark2( bState ); return; + case CLASS_GALAKMECH: + NPC_BSGM_Default(); + return; default: break; } diff --git a/code/game/NPC_spawn.cpp b/code/game/NPC_spawn.cpp index d48e1636de..b3f109beb3 100644 --- a/code/game/NPC_spawn.cpp +++ b/code/game/NPC_spawn.cpp @@ -240,6 +240,7 @@ void G_ClassSetDontFlee( gentity_t *self ) extern void Vehicle_Register(gentity_t *ent); extern void RT_FlyStart( gentity_t *self ); extern void SandCreature_ClearTimers( gentity_t *ent ); +extern void NPC_GalakMech_Init( gentity_t *ent ); void NPC_SetMiscDefaultData( gentity_t *ent ) { if ( ent->spawnflags & SFB_CINEMATIC ) @@ -481,6 +482,10 @@ void NPC_SetMiscDefaultData( gentity_t *ent ) } break; } + if ( !Q_stricmp( "galak_mech", ent->NPC_type ) ) + {//starts with armor + NPC_GalakMech_Init( ent ); + } } if ( ent->client->NPC_class == CLASS_PLAYER || ent->client->NPC_class == CLASS_VEHICLE diff --git a/code/game/NPC_stats.cpp b/code/game/NPC_stats.cpp index 9fae79b5e2..ae3503ba87 100644 --- a/code/game/NPC_stats.cpp +++ b/code/game/NPC_stats.cpp @@ -183,6 +183,7 @@ stringID_table_t ClassTable[] = ENUM2STRING(CLASS_ASSASSIN_DROID), ENUM2STRING(CLASS_HAZARD_TROOPER), ENUM2STRING(CLASS_VEHICLE), + { "CLASS_GALAK_MECH", CLASS_GALAKMECH }, { "", -1 } }; @@ -1431,6 +1432,7 @@ extern void NPC_Rosh_Dark_Precache( void ); extern void NPC_Tusken_Precache( void ); extern void NPC_Saboteur_Precache( void ); extern void NPC_CultistDestroyer_Precache( void ); +extern void NPC_GalakMech_Precache( void ); void NPC_Jawa_Precache( void ) { for ( int i = 1; i < 7; i++ ) @@ -1528,6 +1530,10 @@ void NPC_PrecacheByClassName( const char* type ) { NPC_Protocol_Precache(); } + else if ( !Q_stricmp( "galak_mech", type )) + { + NPC_GalakMech_Precache(); + } else if ( !Q_stricmp( "boba_fett", type )) { Boba_Precache(); diff --git a/code/game/anims.h b/code/game/anims.h index 4aff70f494..05ebe31892 100644 --- a/code/game/anims.h +++ b/code/game/anims.h @@ -1640,6 +1640,10 @@ typedef enum //# animNumber_e BOTH_SIT6, BOTH_SIT7, + BOTH_ALERT1, + BOTH_TRIUMPHANT1START, + BOTH_TRIUMPHANT1STARTGESTURE, + BOTH_TRIUMPHANT1STOP, //================================================= //ANIMS IN WHICH ONLY THE UPPER OBJECTS ARE IN MD3 @@ -1670,6 +1674,10 @@ typedef enum //# animNumber_e TORSO_HANDSIGNAL3, TORSO_HANDSIGNAL4, TORSO_HANDSIGNAL5, + + TORSO_RAISEWEAP2, + TORSO_DROPWEAP2, + TORSO_WEAPONIDLE1, //================================================= diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index d17369794a..d34d6cc8c8 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -6535,14 +6535,28 @@ void PM_TorsoAnimation( void ) break; case WP_REPEATER: - if ( weaponBusy ) - { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); - } - else - { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); - } + if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_GALAKMECH ) + {// + if ( pm->gent->alt_fire ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE1,SETANIM_FLAG_NORMAL); + } + } + else + { + if ( weaponBusy ) + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL); + } + else + { + PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } + } break; case WP_TRIP_MINE: case WP_DET_PACK: diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index bb385bc01c..c068ce992f 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -1364,6 +1364,16 @@ qboolean G_SetG2PlayerModelInfo( gentity_t *ent, const char *modelName, const ch { ent->handRBolt = ent->headBolt = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*head_f1"); } + else if ( !Q_stricmp( "galak_mech", modelName )) + { + ent->genericBolt1 = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*antenna_effect"); + ent->headBolt = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*head_eyes"); + ent->torsoBolt = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "torso"); + ent->crotchBolt = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "hips"); + ent->handRBolt = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*flasha"); + ent->genericBolt3 = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*flashb"); + ent->handLBolt = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*flashc"); + } else if ( !Q_stricmp( "rancor", modelName ) || !Q_stricmp( "mutant_rancor", modelName )) { diff --git a/code/game/g_functions.cpp b/code/game/g_functions.cpp index 0d52e213dc..ae5f78f51e 100644 --- a/code/game/g_functions.cpp +++ b/code/game/g_functions.cpp @@ -378,6 +378,7 @@ void GEntity_PainFunc(gentity_t *self, gentity_t *inflictor, gentity_t *attacker PAINCASE( CrystalCratePain ) PAINCASE( TurretPain ) PAINCASE( eweb_pain ) + PAINCASE( NPC_GM_Pain ) default: Com_Error(ERR_DROP, "GEntity_PainFunc: case %d not handled!\n",self->e_PainFunc); diff --git a/code/game/g_functions.h b/code/game/g_functions.h index 6305f49523..e1e71b901e 100644 --- a/code/game/g_functions.h +++ b/code/game/g_functions.h @@ -586,6 +586,7 @@ extern void NPC_Seeker_Pain (gentity_t *self, gentity_t *inflictor, gentity_t extern void NPC_Remote_Pain (gentity_t *self, gentity_t *inflictor, gentity_t *attacker, const vec3_t point, int damage, int mod,int hitLoc=HL_NONE); extern void emplaced_gun_pain (gentity_t *self, gentity_t *inflictor, gentity_t *attacker, const vec3_t point, int damage, int mod,int hitLoc=HL_NONE); extern void NPC_Mark1_Pain (gentity_t *self, gentity_t *inflictor, gentity_t *attacker, const vec3_t point, int damage, int mod,int hitLoc=HL_NONE); +extern void NPC_GM_Pain (gentity_t *self, gentity_t *inflictor, gentity_t *attacker, const vec3_t point, int damage, int mod,int hitLoc=HL_NONE); extern void NPC_Sentry_Pain (gentity_t *self, gentity_t *inflictor, gentity_t *attacker, const vec3_t point, int damage, int mod,int hitLoc=HL_NONE); extern void NPC_Mark2_Pain (gentity_t *self, gentity_t *inflictor, gentity_t *attacker, const vec3_t point, int damage, int mod,int hitLoc=HL_NONE); extern void PlayerPain (gentity_t *self, gentity_t *inflictor, gentity_t *attacker, const vec3_t point, int damage, int mod,int hitLoc=HL_NONE); From ca3a28a03cd7e27f9014a2e3eacd781dc9f78c85 Mon Sep 17 00:00:00 2001 From: redsaurus Date: Mon, 21 Dec 2015 19:32:28 +0000 Subject: [PATCH 423/445] Better mod support: look in fs_basegame for dlls Set fs_game back to "" and fs_basegame to "jaenhanced" --- code/qcommon/files.cpp | 7 ++++--- shared/sys/sys_main.cpp | 19 +++++++++++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/code/qcommon/files.cpp b/code/qcommon/files.cpp index d6934ff39b..43b8bf3898 100644 --- a/code/qcommon/files.cpp +++ b/code/qcommon/files.cpp @@ -2860,14 +2860,14 @@ void FS_Startup( const char *gameName ) { fs_copyfiles = Cvar_Get( "fs_copyfiles", "0", CVAR_INIT ); fs_cdpath = Cvar_Get ("fs_cdpath", "", CVAR_INIT|CVAR_PROTECTED ); fs_basepath = Cvar_Get ("fs_basepath", Sys_DefaultInstallPath(), CVAR_INIT|CVAR_PROTECTED ); - fs_basegame = Cvar_Get ("fs_basegame", "", CVAR_INIT ); + fs_basegame = Cvar_Get ("fs_basegame", OPENJKGAME, CVAR_INIT|CVAR_SYSTEMINFO ); homePath = Sys_DefaultHomePath(); if (!homePath || !homePath[0]) { homePath = fs_basepath->string; } fs_homepath = Cvar_Get ("fs_homepath", homePath, CVAR_INIT|CVAR_PROTECTED ); - fs_gamedirvar = Cvar_Get ("fs_game", "jaenhanced", CVAR_INIT|CVAR_SYSTEMINFO ); - + fs_gamedirvar = Cvar_Get ("fs_game", "", CVAR_INIT|CVAR_SYSTEMINFO ); + fs_dirbeforepak = Cvar_Get("fs_dirbeforepak", "0", CVAR_INIT|CVAR_PROTECTED); // add search path elements in reverse priority order @@ -2956,6 +2956,7 @@ void FS_InitFilesystem( void ) { Com_StartupVariable( "fs_game" ); Com_StartupVariable( "fs_copyfiles" ); Com_StartupVariable( "fs_dirbeforepak" ); + Com_StartupVariable( "fs_basegame" ); #ifdef MACOS_X Com_StartupVariable( "fs_apppath" ); #endif diff --git a/shared/sys/sys_main.cpp b/shared/sys/sys_main.cpp index dafe319576..c374433289 100644 --- a/shared/sys/sys_main.cpp +++ b/shared/sys/sys_main.cpp @@ -367,11 +367,11 @@ enum SearchPathFlag { SEARCH_PATH_MOD = 1 << 0, SEARCH_PATH_BASE = 1 << 1, - SEARCH_PATH_OPENJK = 1 << 2, + SEARCH_PATH_JKE = 1 << 2, SEARCH_PATH_ROOT = 1 << 3 }; -static void *Sys_LoadDllFromPaths( const char *filename, const char *gamedir, const char **searchPaths, +static void *Sys_LoadDllFromPaths( const char *filename, const char *gamedir, const char *jkedir, const char **searchPaths, size_t numPaths, uint32_t searchFlags, const char *callerName ) { char *fn; @@ -411,7 +411,7 @@ static void *Sys_LoadDllFromPaths( const char *filename, const char *gamedir, co } } - if ( searchFlags & SEARCH_PATH_OPENJK ) + if ( searchFlags & SEARCH_PATH_JKE ) { for ( size_t i = 0; i < numPaths; i++ ) { @@ -419,7 +419,7 @@ static void *Sys_LoadDllFromPaths( const char *filename, const char *gamedir, co if ( !libDir[0] ) continue; - fn = FS_BuildOSPath( libDir, OPENJKGAME, filename ); + fn = FS_BuildOSPath( libDir, jkedir, filename ); libHandle = Sys_LoadLibrary( fn ); if ( libHandle ) return libHandle; @@ -496,6 +496,7 @@ void *Sys_LoadLegacyGameDll( const char *name, VMMainProc **vmMain, SystemCallPr char *homepath = Cvar_VariableString( "fs_homepath" ); char *cdpath = Cvar_VariableString( "fs_cdpath" ); char *gamedir = Cvar_VariableString( "fs_game" ); + char *jkedir = Cvar_VariableString( "fs_basegame" ); #ifdef MACOS_X char *apppath = Cvar_VariableString( "fs_apppath" ); #endif @@ -510,7 +511,7 @@ void *Sys_LoadLegacyGameDll( const char *name, VMMainProc **vmMain, SystemCallPr }; size_t numPaths = ARRAY_LEN( searchPaths ); - libHandle = Sys_LoadDllFromPaths( filename, gamedir, searchPaths, numPaths, SEARCH_PATH_BASE | SEARCH_PATH_MOD, __FUNCTION__ ); + libHandle = Sys_LoadDllFromPaths( filename, gamedir, jkedir, searchPaths, numPaths, SEARCH_PATH_BASE | SEARCH_PATH_MOD, __FUNCTION__ ); if ( !libHandle ) return NULL; } @@ -554,6 +555,7 @@ void *Sys_LoadSPGameDll( const char *name, GetGameAPIProc **GetGameAPI ) char *homepath = Cvar_VariableString( "fs_homepath" ); char *cdpath = Cvar_VariableString( "fs_cdpath" ); char *gamedir = Cvar_VariableString( "fs_game" ); + char *jkedir = Cvar_VariableString( "fs_basegame" ); #ifdef MACOS_X char *apppath = Cvar_VariableString( "fs_apppath" ); #endif @@ -568,8 +570,8 @@ void *Sys_LoadSPGameDll( const char *name, GetGameAPIProc **GetGameAPI ) }; size_t numPaths = ARRAY_LEN( searchPaths ); - libHandle = Sys_LoadDllFromPaths( filename, gamedir, searchPaths, numPaths, - SEARCH_PATH_BASE | SEARCH_PATH_MOD | SEARCH_PATH_OPENJK | SEARCH_PATH_ROOT, + libHandle = Sys_LoadDllFromPaths( filename, gamedir, jkedir, searchPaths, numPaths, + SEARCH_PATH_BASE | SEARCH_PATH_MOD | SEARCH_PATH_JKE | SEARCH_PATH_ROOT, __FUNCTION__ ); if ( !libHandle ) return NULL; @@ -627,6 +629,7 @@ void *Sys_LoadGameDll( const char *name, GetModuleAPIProc **moduleAPI ) char *homepath = Cvar_VariableString( "fs_homepath" ); char *cdpath = Cvar_VariableString( "fs_cdpath" ); char *gamedir = Cvar_VariableString( "fs_game" ); + char *jkedir = Cvar_VariableString( "fs_basegame" ); #ifdef MACOS_X char *apppath = Cvar_VariableString( "fs_apppath" ); #endif @@ -641,7 +644,7 @@ void *Sys_LoadGameDll( const char *name, GetModuleAPIProc **moduleAPI ) }; size_t numPaths = ARRAY_LEN( searchPaths ); - libHandle = Sys_LoadDllFromPaths( filename, gamedir, searchPaths, numPaths, SEARCH_PATH_BASE | SEARCH_PATH_MOD, __FUNCTION__ ); + libHandle = Sys_LoadDllFromPaths( filename, gamedir, jkedir, searchPaths, numPaths, SEARCH_PATH_BASE | SEARCH_PATH_MOD, __FUNCTION__ ); if ( !libHandle ) return NULL; } From b5210de8f98c4d537a4fbc3b71848d138f498beb Mon Sep 17 00:00:00 2001 From: redsaurus Date: Wed, 25 May 2016 00:09:19 +0100 Subject: [PATCH 424/445] Forcepowers: saberthrow with altattack unless using katarn saberstyle. new saberthrow bind always works. --- code/game/wp_saber.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 33cd7dfc38..16cb7f0c67 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -7264,7 +7264,8 @@ void WP_SaberThrow( gentity_t *self, usercmd_t *ucmd ) {//don't even have it out return; } - else if ( (ucmd->buttons&BUTTON_SABERTHROW) && !(self->client->ps.pm_flags&PMF_SABERTHROW_HELD) ) + else if ( ((ucmd->buttons&BUTTON_SABERTHROW) && !(self->client->ps.pm_flags&PMF_SABERTHROW_HELD)) + || (self->client->ps.saberAnimLevel != SS_KATARN && (ucmd->buttons&BUTTON_ALT_ATTACK) && !(self->client->ps.pm_flags&PMF_ALT_ATTACK_HELD))) {//still holding it, not still holding attack from a previous throw, so throw it. if ( !(self->client->ps.saberEventFlags&SEF_INWATER) && WP_SaberLaunch( self, saberent, qtrue ) ) { @@ -7412,7 +7413,7 @@ void WP_SaberThrow( gentity_t *self, usercmd_t *ucmd ) {//saber still flying forward if ( self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_2 ) {//still holding it out - if ( !(ucmd->buttons&BUTTON_SABERTHROW) && self->client->ps.forcePowerDebounce[FP_SABERTHROW] < level.time ) + if ( !(ucmd->buttons&BUTTON_SABERTHROW) && !(self->client->ps.saberAnimLevel != SS_KATARN && ucmd->buttons&BUTTON_ALT_ATTACK) && self->client->ps.forcePowerDebounce[FP_SABERTHROW] < level.time ) {//done throwing, return to me if ( self->client->ps.saber[0].Active() ) {//still on @@ -7434,7 +7435,7 @@ void WP_SaberThrow( gentity_t *self, usercmd_t *ucmd ) } else { - if ( !(ucmd->buttons&BUTTON_SABERTHROW) && self->client->ps.forcePowerDebounce[FP_SABERTHROW] < level.time ) + if ( !(ucmd->buttons&BUTTON_SABERTHROW) && !(self->client->ps.saberAnimLevel != SS_KATARN && ucmd->buttons&BUTTON_ALT_ATTACK) && self->client->ps.forcePowerDebounce[FP_SABERTHROW] < level.time ) {//not holding button and has been out at least 1 second, return to me if ( self->client->ps.saber[0].Active() ) {//still on From 5f313c5c85cae073cc28cf2b559b5d313d8098bb Mon Sep 17 00:00:00 2001 From: redsaurus Date: Sun, 8 Jan 2017 16:44:32 +0000 Subject: [PATCH 425/445] AI Workshop: eezstreet's AI workshop --- code/cgame/cg_draw.cpp | 3 + code/game/CMakeLists.txt | 1 + code/game/G_Timer.cpp | 18 + code/game/Q3_Interface.cpp | 101 ++++ code/game/ai.h | 3 +- code/game/g_cmds.cpp | 1 + code/game/g_local.h | 11 + code/game/g_main.cpp | 2 + code/game/jke_aiworkshop.cpp | 957 +++++++++++++++++++++++++++++++++++ 9 files changed, 1096 insertions(+), 1 deletion(-) create mode 100644 code/game/jke_aiworkshop.cpp diff --git a/code/cgame/cg_draw.cpp b/code/cgame/cg_draw.cpp index 09341376d8..9f2da29794 100644 --- a/code/cgame/cg_draw.cpp +++ b/code/cgame/cg_draw.cpp @@ -1827,10 +1827,13 @@ static void CG_DrawSimpleForcePower( const centity_t *cent ) CG_DrawHUD ================ */ +extern void WorkshopDrawClientsideInformation(); static void CG_DrawHUD( centity_t *cent ) { int value; int sectionXPos,sectionYPos,sectionWidth,sectionHeight; + + WorkshopDrawClientsideInformation(); if ( cg_hudFiles.integer ) { diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index cc9f6f53cc..86bb5a4515 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -185,6 +185,7 @@ set(SPGameGameFiles "${SPDir}/game/w_local.h" "${SPDir}/game/wp_saber.h" "${SPDir}/game/g_vehicles.h" + "${SPDir}/game/jke_aiworkshop.cpp" ) source_group("game" FILES ${SPGameGameFiles}) set(SPGameFiles ${SPGameFiles} ${SPGameGameFiles}) diff --git a/code/game/G_Timer.cpp b/code/game/G_Timer.cpp index 192594d109..5b7377c467 100644 --- a/code/game/G_Timer.cpp +++ b/code/game/G_Timer.cpp @@ -454,3 +454,21 @@ qboolean TIMER_Start( gentity_t *self, const char *identifier, int duration ) } return qfalse; } + +/* + ------------------------- + TIMER_List + ------------------------- + */ +std::vector > TIMER_List(gentity_t* ent) { + std::vector > returnValue; + gtimer_t *p = g_timers[ent->s.number]; + + while (p) { + std::pair pair = std::make_pair(p->id.c_str(), p->time - level.time); + returnValue.push_back(pair); + p = p->next; + } + + return returnValue; +} diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 0935b6e71a..d99da487b9 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -99,10 +99,111 @@ stringID_table_t BSTable[] = ENUM2STRING(BS_CINEMATIC),//# Does nothing but face it's angles and move to a goal if it has one ENUM2STRING(BS_FLEE),//# Run toward the nav goal, avoiding danger //the rest are internal only + // ... but we should list them anyway, otherwise workshop behavior will screw up + ENUM2STRING(BS_WAIT), + ENUM2STRING(BS_STAND_GUARD), + ENUM2STRING(BS_PATROL), + ENUM2STRING(BS_INVESTIGATE), + ENUM2STRING(BS_HUNT_AND_KILL), + ENUM2STRING(BS_FLEE), { "", -1 } }; +stringID_table_t NPCClassTable[] = +{ + ENUM2STRING(CLASS_NONE), + ENUM2STRING(CLASS_ATST), + ENUM2STRING(CLASS_BARTENDER), + ENUM2STRING(CLASS_BESPIN_COP), + ENUM2STRING(CLASS_CLAW), + ENUM2STRING(CLASS_COMMANDO), + ENUM2STRING(CLASS_DESANN), + ENUM2STRING(CLASS_FISH), + ENUM2STRING(CLASS_FLIER2), + ENUM2STRING(CLASS_GALAK), + ENUM2STRING(CLASS_GLIDER), + ENUM2STRING(CLASS_GONK), + ENUM2STRING(CLASS_GRAN), + ENUM2STRING(CLASS_HOWLER), + ENUM2STRING(CLASS_RANCOR), + ENUM2STRING(CLASS_SAND_CREATURE), + ENUM2STRING(CLASS_WAMPA), + ENUM2STRING(CLASS_IMPERIAL), + ENUM2STRING(CLASS_IMPWORKER), + ENUM2STRING(CLASS_INTERROGATOR), + ENUM2STRING(CLASS_JAN), + ENUM2STRING(CLASS_JEDI), + ENUM2STRING(CLASS_KYLE), + ENUM2STRING(CLASS_LANDO), + ENUM2STRING(CLASS_LIZARD), + ENUM2STRING(CLASS_LUKE), + ENUM2STRING(CLASS_MARK1), + ENUM2STRING(CLASS_MARK2), + ENUM2STRING(CLASS_GALAKMECH), + ENUM2STRING(CLASS_MINEMONSTER), + ENUM2STRING(CLASS_MONMOTHA), + ENUM2STRING(CLASS_MORGANKATARN), + ENUM2STRING(CLASS_MOUSE), + ENUM2STRING(CLASS_MURJJ), + ENUM2STRING(CLASS_PRISONER), + ENUM2STRING(CLASS_PROBE), + ENUM2STRING(CLASS_PROTOCOL), + ENUM2STRING(CLASS_R2D2), + ENUM2STRING(CLASS_R5D2), + ENUM2STRING(CLASS_REBEL), + ENUM2STRING(CLASS_REBORN), + ENUM2STRING(CLASS_REELO), + ENUM2STRING(CLASS_REMOTE), + ENUM2STRING(CLASS_RODIAN), + ENUM2STRING(CLASS_SEEKER), + ENUM2STRING(CLASS_SENTRY), + ENUM2STRING(CLASS_SHADOWTROOPER), + ENUM2STRING(CLASS_SABOTEUR), + ENUM2STRING(CLASS_STORMTROOPER), + ENUM2STRING(CLASS_SWAMP), + ENUM2STRING(CLASS_SWAMPTROOPER), + ENUM2STRING(CLASS_NOGHRI), + ENUM2STRING(CLASS_TAVION), + ENUM2STRING(CLASS_ALORA), + ENUM2STRING(CLASS_TRANDOSHAN), + ENUM2STRING(CLASS_UGNAUGHT), + ENUM2STRING(CLASS_JAWA), + ENUM2STRING(CLASS_WEEQUAY), + ENUM2STRING(CLASS_TUSKEN), + ENUM2STRING(CLASS_BOBAFETT), + ENUM2STRING(CLASS_ROCKETTROOPER), + ENUM2STRING(CLASS_SABER_DROID), + ENUM2STRING(CLASS_ASSASSIN_DROID), + ENUM2STRING(CLASS_HAZARD_TROOPER), + ENUM2STRING(CLASS_PLAYER), + ENUM2STRING(CLASS_VEHICLE), + + + { "", -1 }, +}; + +stringID_table_t RankTable[] = +{ + ENUM2STRING(RANK_CIVILIAN), + ENUM2STRING(RANK_CREWMAN), + ENUM2STRING(RANK_ENSIGN), + ENUM2STRING(RANK_LT_JG), + ENUM2STRING(RANK_LT), + ENUM2STRING(RANK_LT_COMM), + ENUM2STRING(RANK_COMMANDER), + ENUM2STRING(RANK_CAPTAIN), + + { "", -1 }, +}; +stringID_table_t MoveTypeTable[] = +{ + ENUM2STRING(MT_STATIC), + ENUM2STRING(MT_WALK), + ENUM2STRING(MT_RUNJUMP), + ENUM2STRING(MT_FLYSWIM), + { "", -1 } +}; stringID_table_t BSETTable[] = { diff --git a/code/game/ai.h b/code/game/ai.h index bcce390981..329dfe8c84 100644 --- a/code/game/ai.h +++ b/code/game/ai.h @@ -59,7 +59,8 @@ typedef enum //# rank_e RANK_LT, RANK_LT_COMM, RANK_COMMANDER, - RANK_CAPTAIN + RANK_CAPTAIN, + RANK_MAX } rank_t; qboolean NPC_CheckPlayerTeamStealth( void ); diff --git a/code/game/g_cmds.cpp b/code/game/g_cmds.cpp index e80370b535..e848d07620 100644 --- a/code/game/g_cmds.cpp +++ b/code/game/g_cmds.cpp @@ -1676,6 +1676,7 @@ void ClientCommand( int clientNum ) { Cmd_SaberDrop_f( ent, saberNum ); } } + else if (TryWorkshopCommand(ent)) {} else { gi.SendServerCommand( clientNum, va("print \"Unknown command %s\n\"", cmd ) ); diff --git a/code/game/g_local.h b/code/game/g_local.h index cc3935188b..82b56b2007 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -34,6 +34,9 @@ along with this program; if not, see . #include "anims.h" #include "dmstates.h" +#include +#include + //================================================================== // the "gameversion" client command will print this plus compile date @@ -644,6 +647,13 @@ void G_InitSessionData( gclient_t *client, char *userinfo ); void G_InitWorldSession( void ); void G_WriteSessionData( void ); +// +// jke_aiworkshop.cpp +// +extern qboolean inAIWorkshop; +void WorkshopToggle(); +void WorkshopThink(); +qboolean TryWorkshopCommand(gentity_t* ent); // // NPC_senses.cpp @@ -714,6 +724,7 @@ qboolean TIMER_Start( gentity_t *self, const char *identifier, int duration ); qboolean TIMER_Done2( gentity_t *ent, const char *identifier, qboolean remove = qfalse ); qboolean TIMER_Exists( gentity_t *ent, const char *identifier ); void TIMER_Remove( gentity_t *ent, const char *identifier ); +std::vector > TIMER_List(gentity_t* ent); float NPC_GetHFOVPercentage( vec3_t spot, vec3_t from, vec3_t facing, float hFOV ); float NPC_GetVFOVPercentage( vec3_t spot, vec3_t from, vec3_t facing, float vFOV ); diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 560f2049c1..cc7c0068fa 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -1987,6 +1987,8 @@ void G_RunFrame( int levelTime ) { //Look to clear out old events ClearPlayerAlertEvents(); + + WorkshopThink(); //Run the frame for all entities // for ( i = 0, ent = &g_entities[0]; i < globals.num_entities ; i++, ent++) diff --git a/code/game/jke_aiworkshop.cpp b/code/game/jke_aiworkshop.cpp new file mode 100644 index 0000000000..f44578c6a8 --- /dev/null +++ b/code/game/jke_aiworkshop.cpp @@ -0,0 +1,957 @@ +#include "g_local.h" +#include "cgame/cg_local.h" +#include "cgame/cg_media.h" + +#define DRAWBOX_REFRESH 500 // How long it takes to redraw the boxes +#define BOX_VERTICES 8 + +qboolean inAIWorkshop = qfalse; +qboolean showDisplay = qtrue; + +int drawBoxesTime = 0; +int selectedAI = ENTITYNUM_NONE; + +extern stringID_table_t BSTable[]; +extern stringID_table_t BSETTable[]; +extern stringID_table_t teamTable[]; +extern stringID_table_t NPCClassTable[]; +extern stringID_table_t RankTable[]; +extern stringID_table_t MoveTypeTable[]; +extern stringID_table_t FPTable[]; + +#define OL_S 0.5f +#define OL_Y 30 +#define OL_H 6 +static void WorkshopDrawEntityInformation(gentity_t* ent, int x, const char* title) { + int add = OL_H; + vec4_t textcolor = { 0.4f, 0.4f, 0.8f, 1.0f }; + + cgi_R_Font_DrawString(x, OL_Y, title, textcolor, cgs.media.qhFontSmall, -1, OL_S); + + cgi_R_Font_DrawString(x, OL_Y + add, va("NPC_type: %s", ent->NPC_type), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + + cgi_R_Font_DrawString(x, OL_Y + add, va("health: %i/%i", ent->health, ent->max_health), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + + if (ent->script_targetname) { + cgi_R_Font_DrawString(x, OL_Y + add, va("script_targetname: %s", ent->script_targetname), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + } + + if (ent->NPC->goalEntity) { + cgi_R_Font_DrawString(x, OL_Y + add, va("goalEnt = %i", ent->NPC->goalEntity->s.number), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + } + cgi_R_Font_DrawString(x, OL_Y + add, va("bs = %s", BSTable[ent->NPC->behaviorState].name), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + if (ent->NPC->combatMove) { + cgi_R_Font_DrawString(x, OL_Y + add, "-- in combat move --", textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + } + + cgi_R_Font_DrawString(x, OL_Y + add, va("class = %s", NPCClassTable[ent->client->NPC_class].name), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + cgi_R_Font_DrawString(x, OL_Y + add, va("rank = %s (%i)", RankTable[ent->NPC->rank].name, ent->NPC->rank), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + + if (ent->NPC->scriptFlags) { + cgi_R_Font_DrawString(x, OL_Y + add, va("scriptFlags: %i", ent->NPC->scriptFlags), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + } + if (ent->NPC->aiFlags) { + cgi_R_Font_DrawString(x, OL_Y + add, va("aiFlags: %i", ent->NPC->aiFlags), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + } + + if (ent->client->noclip) { + cgi_R_Font_DrawString(x, OL_Y + add, "cheat: NOCLIP", textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + } + + if (ent->flags & FL_GODMODE) { + cgi_R_Font_DrawString(x, OL_Y + add, "cheat: GODMODE", textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + } + + if (ent->flags & FL_NOTARGET) { + cgi_R_Font_DrawString(x, OL_Y + add, "cheat: NOTARGET", textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + } + + if (ent->flags & FL_UNDYING) { + cgi_R_Font_DrawString(x, OL_Y + add, "cheat: UNDEAD", textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + } + + cgi_R_Font_DrawString(x, OL_Y + add, va("playerTeam: %s", teamTable[ent->client->playerTeam].name), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + + cgi_R_Font_DrawString(x, OL_Y + add, va("enemyTeam: %s", teamTable[ent->client->enemyTeam].name), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + + cgi_R_Font_DrawString(x, OL_Y + add, "-- assigned scripts --", textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + + for (int i = BSET_SPAWN; i < NUM_BSETS; i++) { + if (ent->behaviorSet[i]) { + cgi_R_Font_DrawString(x, OL_Y + add, va("%s: %s", BSETTable[i].name, ent->behaviorSet[i]), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + } + } + + if (ent->parms) { + cgi_R_Font_DrawString(x, OL_Y + add, "-- parms --", textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + for (int i = 0; i < MAX_PARMS; i++) { + if (ent->parms->parm[i][0]) { + cgi_R_Font_DrawString(x, OL_Y + add, va("parm%i : %s", i + 1, ent->parms->parm[i]), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + } + } + } + + if (ent->NPC->group && ent->NPC->group->numGroup > 1) { + cgi_R_Font_DrawString(x, OL_Y + add, "-- squad data --", textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + cgi_R_Font_DrawString(x, OL_Y + add, va("morale: %i", ent->NPC->group->morale), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + cgi_R_Font_DrawString(x, OL_Y + add, va("morale debounce: %i", ent->NPC->group->moraleDebounce), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + cgi_R_Font_DrawString(x, OL_Y + add, va("last seen enemy: %i milliseconds", level.time - ent->NPC->group->lastSeenEnemyTime), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + if (ent->NPC->group->commander) { + cgi_R_Font_DrawString(x, OL_Y + add, va("commander: %i", ent->NPC->group->commander->s.number), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + } + + cgi_R_Font_DrawString(x, OL_Y + add, "-- squad members --", textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + for (int i = 0; i < ent->NPC->group->numGroup; i++) { + AIGroupMember_t* memberAI = &ent->NPC->group->member[i]; + int memberNum = memberAI->number; + gentity_t* member = &g_entities[memberNum]; + char* memberText = va("* entity %i, closestBuddy: %i, class: %s, rank: %s (%i), health: %i/%i", + memberNum, memberAI->closestBuddy, NPCClassTable[member->client->NPC_class].name, + RankTable[member->NPC->rank].name, member->NPC->rank, member->health, member->max_health); + cgi_R_Font_DrawString(x, OL_Y + add, memberText, textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + } + } + + cgi_R_Font_DrawString(x, OL_Y + add, "-- currently active timers --", textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + auto timers = TIMER_List(ent); + for (auto it = timers.begin(); it != timers.end(); ++it) { + if (it->second >= 0) { + cgi_R_Font_DrawString(x, OL_Y + add, va("%s : %i", it->first.c_str(), it->second), textcolor, cgs.media.qhFontSmall, -1, OL_S); + add += OL_H; + } + } +} + +// +// Draw textual information about the NPC in our crosshairs and also the currently selected one +// +void WorkshopDrawClientsideInformation() { + if (inAIWorkshop == qfalse) { + return; + } + if (showDisplay == qfalse) { + return; + } + // Draw the information for the NPC that is in our crosshairs + if (cg.crosshairClientNum != ENTITYNUM_NONE && cg.crosshairClientNum != 0 && g_entities[cg.crosshairClientNum].client) { + gentity_t* crossEnt = &g_entities[cg.crosshairClientNum]; + WorkshopDrawEntityInformation(crossEnt, 10, "Crosshair AI"); + } + + // Draw the information for the AI that we have selected + if (selectedAI != ENTITYNUM_NONE) { + gentity_t* selectedEnt = &g_entities[selectedAI]; + WorkshopDrawEntityInformation(selectedEnt, 500, "Selected AI"); + } +} + +// +// Draws a box around the bounding box of the entity +// +void WorkshopDrawEntBox(gentity_t* ent, int colorOverride = -1) { + unsigned color = 0x666666; // G_SoundOnEnt(ent, "satan.mp3"); + if (colorOverride == -1 && selectedAI == ent->s.number) { + // Draw a box around our goal ent + if (ent->NPC->goalEntity != NULL) { + WorkshopDrawEntBox(ent->NPC->goalEntity, color); + } + color = 0x0000FFFF; // Yellow = selected AI + } + else if (colorOverride == -1 && ent->client->playerTeam == TEAM_ENEMY) { + color = 0x000000FF; // Red = enemy + } + else if (colorOverride == -1 && ent->client->playerTeam == TEAM_PLAYER) { + color = 0x0000FF00; // Green = ally + } + else if (colorOverride == -1 && ent->client->playerTeam == TEAM_NEUTRAL) { + color = 0x00FF0000; // Blue = neutral + } + else if (colorOverride != -1) { + color = colorOverride; + } + + // This is going to look like a mess and I can't really comment on this, but I drew this out manually and it works. + vec3_t vertices[BOX_VERTICES] = { 0 }; + for (int i = 0; i < BOX_VERTICES; i++) { + VectorCopy(ent->currentOrigin, vertices[i]); + } + + for (int i = 4; i < BOX_VERTICES; i++) { + vertices[i][2] += ent->mins[2]; + } + for (int i = 0; i < 4; i++) { + vertices[i][2] += ent->maxs[2]; + } + vertices[0][0] += ent->mins[0]; + vertices[1][0] += ent->mins[0]; + vertices[4][0] += ent->mins[0]; + vertices[5][0] += ent->mins[0]; + vertices[2][0] += ent->maxs[0]; + vertices[3][0] += ent->maxs[0]; + vertices[6][0] += ent->maxs[0]; + vertices[7][0] += ent->maxs[0]; + vertices[0][1] += ent->mins[1]; + vertices[2][1] += ent->mins[1]; + vertices[4][1] += ent->mins[1]; + vertices[6][1] += ent->mins[1]; + vertices[1][1] += ent->maxs[1]; + vertices[3][1] += ent->maxs[1]; + vertices[5][1] += ent->maxs[1]; + vertices[7][1] += ent->maxs[1]; + + G_DebugLine(vertices[0], vertices[1], DRAWBOX_REFRESH, color, qtrue); + G_DebugLine(vertices[2], vertices[3], DRAWBOX_REFRESH, color, qtrue); + G_DebugLine(vertices[0], vertices[2], DRAWBOX_REFRESH, color, qtrue); + G_DebugLine(vertices[1], vertices[3], DRAWBOX_REFRESH, color, qtrue); + G_DebugLine(vertices[0], vertices[4], DRAWBOX_REFRESH, color, qtrue); + G_DebugLine(vertices[1], vertices[5], DRAWBOX_REFRESH, color, qtrue); + G_DebugLine(vertices[2], vertices[6], DRAWBOX_REFRESH, color, qtrue); + G_DebugLine(vertices[3], vertices[7], DRAWBOX_REFRESH, color, qtrue); + G_DebugLine(vertices[4], vertices[5], DRAWBOX_REFRESH, color, qtrue); + G_DebugLine(vertices[6], vertices[7], DRAWBOX_REFRESH, color, qtrue); + G_DebugLine(vertices[4], vertices[6], DRAWBOX_REFRESH, color, qtrue); + G_DebugLine(vertices[5], vertices[7], DRAWBOX_REFRESH, color, qtrue); +} + +// +// Occurs every frame +// +void WorkshopThink() { + if (!inAIWorkshop) { + return; + } + + // If the selected AI is dead, deselect it + if (selectedAI != ENTITYNUM_NONE) { + gentity_t* ent = &g_entities[selectedAI]; + if (ent->health <= 0) { + selectedAI = ENTITYNUM_NONE; + } + } + if (drawBoxesTime < level.time && showDisplay) { + for (int i = 1; i < globals.num_entities; i++) { + if (!PInUse(i)) { + continue; + } + + gentity_t* found = &g_entities[i]; + if (!found->client) { + continue; + } + + WorkshopDrawEntBox(found); + drawBoxesTime = level.time + DRAWBOX_REFRESH - 50; // -50 so we get an extra frame to draw, so the boxes don't blink + } + } +} + +// +// Workshop mode just got toggled by console command +// +void WorkshopToggle(gentity_t* ent) { + inAIWorkshop = (qboolean)!inAIWorkshop; + + if (inAIWorkshop) { + // Workshop mode just got enabled + gi.Printf("AI Workshop enabled\n"); + } + else { + // Workshop mode just got disabled + gi.Printf("AI Workshop disabled\n"); + } +} + +////////////////////// +// +// Below are various commands that we can do +// +////////////////////// + +void WorkshopSelect_f(gentity_t* ent) { + vec3_t src, dest, vf; + trace_t trace; + VectorCopy(ent->client->renderInfo.eyePoint, src); + AngleVectors(ent->client->ps.viewangles, vf, NULL, NULL);//ent->client->renderInfo.eyeAngles was cg.refdef.viewangles, basically + //extend to find end of use trace + VectorMA(src, 32967.0f, vf, dest); + + //Trace ahead to find a valid target + gi.trace(&trace, src, vec3_origin, vec3_origin, dest, ent->s.number, MASK_OPAQUE | CONTENTS_SOLID | CONTENTS_BODY | CONTENTS_CORPSE, G2_NOCOLLIDE, 0); + if (trace.fraction == 1.0f || trace.entityNum < 1) + { + return; + } + + gentity_t* target = &g_entities[trace.entityNum]; + if (target->client) { + selectedAI = target->s.number; + } + else { + gi.Printf("No NPC in crosshair\n"); + } +} + +// Deselect currently selected NPC +void WorkshopDeselect_f(gentity_t* ent) { + selectedAI = ENTITYNUM_NONE; +} + +// View all behavior states +void Workshop_List_BehaviorState_f(gentity_t* ent) { + for (int i = 0; i < NUM_BSTATES; i++) { + gi.Printf(va("%s\n", BSTable[i].name)); + } +} + +// View all teams +void Workshop_List_Team_f(gentity_t* ent) { + for (int i = 0; i < TEAM_NUM_TEAMS; i++) { + gi.Printf(va("%s\n", teamTable[i].name)); + } +} + +// View all ranks +void Workshop_List_Ranks_f(gentity_t* ent) { + for (int i = 0; i < RANK_MAX; i++) { + gi.Printf(va("%s\n", RankTable[i].name)); + } +} + +// View all classes +void Workshop_List_Classes_f(gentity_t* ent) { + for (int i = 0; i < CLASS_NUM_CLASSES; i++) { + gi.Printf(va("%s\n", NPCClassTable[i].name)); + } +} + +// View all movetypes +void Workshop_List_Movetypes_f(gentity_t* ent) { + for (int i = 0; i <= MT_FLYSWIM; i++) { + gi.Printf(va("%s\n", MoveTypeTable[i].name)); + } +} + +// View all forcepowers +void Workshop_List_ForcePowers_f(gentity_t* ent) { + for (int i = 0; i <= FP_SABER_OFFENSE; i++) { + gi.Printf(va("%s\n", FPTable[i].name)); + } +} + +// View all behaviorsets +void Workshop_List_BehaviorSets_f(gentity_t* ent) { + for (int i = BSET_SPAWN; i < NUM_BSETS; i++) { + gi.Printf(va("%s\n", BSETTable[i].name)); + } +} + +// List all scriptflags +#define PRINTFLAG(x) gi.Printf("" #x " = %i\n", x) +void Workshop_List_Scriptflags_f(gentity_t* ent) { + PRINTFLAG(SCF_CROUCHED); + PRINTFLAG(SCF_WALKING); + PRINTFLAG(SCF_MORELIGHT); + PRINTFLAG(SCF_LEAN_RIGHT); + PRINTFLAG(SCF_LEAN_LEFT); + PRINTFLAG(SCF_RUNNING); + PRINTFLAG(SCF_ALT_FIRE); + PRINTFLAG(SCF_NO_RESPONSE); + PRINTFLAG(SCF_FFDEATH); + PRINTFLAG(SCF_NO_COMBAT_TALK); + PRINTFLAG(SCF_CHASE_ENEMIES); + PRINTFLAG(SCF_LOOK_FOR_ENEMIES); + PRINTFLAG(SCF_FACE_MOVE_DIR); + PRINTFLAG(SCF_IGNORE_ALERTS); + PRINTFLAG(SCF_DONT_FIRE); + PRINTFLAG(SCF_DONT_FLEE); + PRINTFLAG(SCF_FORCED_MARCH); + PRINTFLAG(SCF_NO_GROUPS); + PRINTFLAG(SCF_FIRE_WEAPON); + PRINTFLAG(SCF_NO_MIND_TRICK); + PRINTFLAG(SCF_USE_CP_NEAREST); + PRINTFLAG(SCF_NO_FORCE); + PRINTFLAG(SCF_NO_FALLTODEATH); + PRINTFLAG(SCF_NO_ACROBATICS); + PRINTFLAG(SCF_USE_SUBTITLES); + PRINTFLAG(SCF_NO_ALERT_TALK); +} + +// List all aiflags +void Workshop_List_AIFlags_f(gentity_t* ent) { + PRINTFLAG(NPCAI_CHECK_WEAPON); + PRINTFLAG(NPCAI_BURST_WEAPON); + PRINTFLAG(NPCAI_MOVING); + PRINTFLAG(NPCAI_TOUCHED_GOAL); + PRINTFLAG(NPCAI_PUSHED); + PRINTFLAG(NPCAI_NO_COLL_AVOID); + PRINTFLAG(NPCAI_BLOCKED); + PRINTFLAG(NPCAI_OFF_PATH); + PRINTFLAG(NPCAI_IN_SQUADPOINT); + PRINTFLAG(NPCAI_STRAIGHT_TO_DESTPOS); + PRINTFLAG(NPCAI_NO_SLOWDOWN); + PRINTFLAG(NPCAI_LOST); + PRINTFLAG(NPCAI_SHIELDS); + PRINTFLAG(NPCAI_GREET_ALLIES); + PRINTFLAG(NPCAI_FORM_TELE_NAV); + PRINTFLAG(NPCAI_ENROUTE_TO_HOMEWP); + PRINTFLAG(NPCAI_MATCHPLAYERWEAPON); + PRINTFLAG(NPCAI_DIE_ON_IMPACT); +} + +// Set a raw timer +void Workshop_Set_Timer_f(gentity_t* ent) { + if (gi.argc() != 3) { + gi.Printf("usage: workshop_set_timer \n"); + return; + } + const char* timerName = gi.argv(1); + int ms = atoi(gi.argv(2)); + TIMER_Set(&g_entities[selectedAI], timerName, ms); +} + +// View all timers, including ones which are dead +void Workshop_View_Timers_f(gentity_t* ent) { + auto timers = TIMER_List(&g_entities[selectedAI]); + for (auto it = timers.begin(); it != timers.end(); ++it) { + gi.Printf("%s\t\t:\t\t%i\n", it->first.c_str(), it->second); + } +} + +// Set Behavior State +void Workshop_Set_BehaviorState_f(gentity_t* ent) { + if (gi.argc() != 2) { + gi.Printf("usage: workshop_set_bstate \n"); + return; + } + int bState = GetIDForString(BSTable, gi.argv(1)); + if (bState == -1) { + gi.Printf("Invalid bstate\n"); + return; + } + g_entities[selectedAI].NPC->behaviorState = (bState_t)bState; +} + +// Set goal entity +void Workshop_Set_GoalEntity_f(gentity_t* ent) { + if (gi.argc() == 2) { + // There's a second argument. Use that. + if (!Q_stricmp(gi.argv(1), "me")) { + g_entities[selectedAI].NPC->goalEntity = g_entities; + return; + } + else { + g_entities[selectedAI].NPC->goalEntity = &g_entities[atoi(gi.argv(1))]; + } + if (g_entities[selectedAI].NPC->lastGoalEntity != NULL) { + gi.Printf("New goal entity: %i (last goal entity was %i)\n", g_entities[selectedAI].NPC->goalEntity->s.number, g_entities[selectedAI].NPC->lastGoalEntity->s.number); + } + else { + gi.Printf("New goal entity: %i\n", g_entities[selectedAI].NPC->goalEntity->s.number); + } + } + + vec3_t src, dest, vf; + trace_t trace; + VectorCopy(ent->client->renderInfo.eyePoint, src); + AngleVectors(ent->client->ps.viewangles, vf, NULL, NULL);//ent->client->renderInfo.eyeAngles was cg.refdef.viewangles, basically + //extend to find end of use trace + VectorMA(src, 32967.0f, vf, dest); + + //Trace ahead to find a valid target + gi.trace(&trace, src, vec3_origin, vec3_origin, dest, ent->s.number, MASK_OPAQUE | CONTENTS_SOLID | CONTENTS_BODY | CONTENTS_ITEM | CONTENTS_CORPSE, G2_NOCOLLIDE, 0); + if (trace.fraction == 1.0f || trace.entityNum < 1 || trace.entityNum == ENTITYNUM_NONE || trace.entityNum == ENTITYNUM_WORLD) + { + gi.Printf("Invalid entity\n"); + return; + } + + gentity_t* target = &g_entities[trace.entityNum]; + gentity_t* selected = &g_entities[selectedAI]; + selected->NPC->lastGoalEntity = selected->NPC->goalEntity; + selected->NPC->goalEntity = target; + if (selected->NPC->lastGoalEntity != NULL) { + gi.Printf("New goal entity: %i (last goal entity was %i)\n", selected->NPC->goalEntity->s.number, selected->NPC->lastGoalEntity->s.number); + } + else { + gi.Printf("New goal entity: %i\n", selected->NPC->goalEntity->s.number); + } +} + +// Set enemy +void Workshop_Set_Enemy_f(gentity_t* ent) { + if (gi.argc() == 2) { + // There's a second argument. Use that. + if (!Q_stricmp(gi.argv(1), "me")) { + g_entities[selectedAI].lastEnemy = g_entities[selectedAI].enemy; + g_entities[selectedAI].enemy = g_entities; + } + else { + g_entities[selectedAI].enemy = &g_entities[atoi(gi.argv(1))]; + } + if (g_entities[selectedAI].lastEnemy != NULL) { + gi.Printf("New enemy: %i (last enemy was %i)\n", g_entities[selectedAI].enemy->s.number, g_entities[selectedAI].lastEnemy->s.number); + } + else { + gi.Printf("New enemy: %i\n", g_entities[selectedAI].enemy->s.number); + } + } + + vec3_t src, dest, vf; + trace_t trace; + VectorCopy(ent->client->renderInfo.eyePoint, src); + AngleVectors(ent->client->ps.viewangles, vf, NULL, NULL);//ent->client->renderInfo.eyeAngles was cg.refdef.viewangles, basically + //extend to find end of use trace + VectorMA(src, 32967.0f, vf, dest); + + //Trace ahead to find a valid target + gi.trace(&trace, src, vec3_origin, vec3_origin, dest, ent->s.number, MASK_OPAQUE | CONTENTS_SOLID | CONTENTS_BODY | CONTENTS_ITEM | CONTENTS_CORPSE, G2_NOCOLLIDE, 0); + if (trace.fraction == 1.0f || trace.entityNum < 1 || trace.entityNum == ENTITYNUM_NONE || trace.entityNum == ENTITYNUM_WORLD) + { + gi.Printf("Invalid entity\n"); + return; + } + + gentity_t* target = &g_entities[trace.entityNum]; + gentity_t* selected = &g_entities[selectedAI]; + selected->lastEnemy = selected->enemy; + selected->enemy = target; + if (selected->lastEnemy != NULL) { + gi.Printf("New enemy: %i (last enemy was %i)\n", selected->enemy->s.number, selected->lastEnemy->s.number); + } + else { + gi.Printf("New enemy: %i\n", selected->enemy->s.number); + } +} + +// Set scriptflags +void Workshop_Set_Scriptflags_f(gentity_t* ent) { + if (gi.argc() != 2) { + gi.Printf("usage: workshop_set_scriptflags
      2. bpI1pFYaJ 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

      (k%$#4!I~Ku?h`R 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�Rft)gkrH-T=KYGXM?H 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�CN@HA_sJYpYkqavAmSSe5 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%0D{tKdJ8 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 WDHcx)({?=lle+4CmEzmhf&T}nMuv+3 literal 0 HcmV?d00001 diff --git a/shared/icons/OpenJK_Icon_128.png b/shared/icons/OpenJK_Icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..31664f661416761871de9377ddd0b5bb55dd4e32 GIT binary patch literal 15714 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 Ja>P`&^>2GAQ>Op` literal 0 HcmV?d00001 diff --git a/shared/icons/OpenJK_Icon_32.png b/shared/icons/OpenJK_Icon_32.png new file mode 100644 index 0000000000000000000000000000000000000000..526dbd218cdfc54f38d2c6d9908f24aa06ded916 GIT binary patch literal 2678 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 OCrBmxl1d4oNq+%^B!JHV literal 0 HcmV?d00001 diff --git a/shared/icons/OpenJK_Icon_64.png b/shared/icons/OpenJK_Icon_64.png new file mode 100644 index 0000000000000000000000000000000000000000..6d6fd089bf5bc067672baa63ecdc310ed75c3c6e GIT binary patch literal 6056 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 bkP=XYBl+Q$c%1v^-?^sh1C=r*MCgA3PIMe$ literal 0 HcmV?d00001 diff --git a/shared/icons/icon.ico b/shared/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1978a752399938283fbcc66f14cb6b614dd9a597 GIT binary patch literal 3262 zcmd5;_g7O{5DqD?q=%43fJ7vSAWFv|MHDb1N0R`88dL}p-T)XR=z;U=N(jP(Zo8w(R_a#h1a`W-8MTm{7G}1^L~ga-T0_$Q_xxl4CT%cDnRP5rzz6>??^hXKJlDo~ZVDAvp2~rs)-0B7 zSZsa&Zew>#eN2E@z(yv`G%zm{qS}q2%J8(O?@d~+?|;(Kc%dqL89>$P z5-w?#hJn7abidZhgP%VA-BA8}pfe}Tl~GZ+>-DRb2e&I-#FJ+MqY&i|c+Kgo@v*U! znHqNq#%G~kGqCI=#q%ef*;rFYyJdT0+3QhbZc>P&(BuY(j`-N)+Qh|Ad+&8L*Ou%Iu0F7` ztL;`-`|YN(BjN6BTdwI8&lI4U>lO?T_IEZ{t?=QosN`>{ClJ^)vRW>D(AqF!c)ll2 zK7)^f4Tu4@SmaDEN{bj7Hr5^8P;(&i;r-6C{Dc&RXqK2}uA&kix+~UesQ>Y!dpB14 zi#c@4_xLOtS?Me2xl=!^f3`<6-;57tP+}ZKI4u9H&&0a?sP6Wb+LD9&)(5!QQZb5& z3aJ_Y#gj)J*VS?nxcWUl4I_uTvRdj&UK;hp+17le7VSKEjFvCNF0@U~ZgC8?^Nc!ppqa%jO+TC&eQm``vYU%gR zn@6Akf-F;42N(yR=WSEL5ul=`5Nx@WEo!gP;UUmZxmFF#FZC2yF-$n%Jd_~aZq1(` z-fxZawdcd8laMp9BkT@>FFuqGC2M7n6c~egB82{^aMkzsRUh6^nx($qaXZYN2W1we zkfc_W*hR9}!}`JX2D z?48>5r0p^CrmEulqODbVv7IefGc^ADcO~Uz?F8)u4pAPQPAk3o|1 z5XAzQJ;}+P^>8_pI|FH8;?v7RA{w_8g5|>T{4M4x10&0pW@CrvrA~q#ZMyb6} zc%^U)FIO%n~$chxZ8Xc8afl7qzFtC@EbFT z0*G3r42h3i7#-@iQKJ;G|I7cMaEhU2Ffjt3Nrv{v!U#}0ewp)coHswh761rrn?L5d KF{$PMZ15kAg)o)? literal 0 HcmV?d00001 diff --git a/shared/icons/license.txt b/shared/icons/license.txt new file mode 100644 index 0000000000..a74ecb91ec --- /dev/null +++ b/shared/icons/license.txt @@ -0,0 +1,28 @@ +The OpenJK icon was made by Antonio Aiello and is released under +the MIT/X11 license, as quoted here. + +code*/macosx/OpenJK.icns, code/win32/starwars.ico, +codemp/win32/icon.ico and shared/sdl/sdl_icon.h are derived works +under the same terms. + +---- + +Copyright (c) 2013 Antonio Aiello + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/shared/icons/ocgDGfu.png b/shared/icons/ocgDGfu.png new file mode 100644 index 0000000000000000000000000000000000000000..f07e04704bcb361015b54f98bc381aa6fbfd7c87 GIT binary patch literal 7788 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 literal 0 HcmV?d00001 diff --git a/shared/sdl/sdl_icon.h b/shared/sdl/sdl_icon.h new file mode 100644 index 0000000000..4bd88bf581 --- /dev/null +++ b/shared/sdl/sdl_icon.h @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2013 Antonio Aiello + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* GIMP RGBA C-Source image dump (sdl_icon.c) */ + +static const struct { + uint32_t width; + uint32_t height; + uint32_t bytes_per_pixel; /* 3:RGB, 4:RGBA */ + uint8_t pixel_data[32 * 32 * 4 + 1]; +} CLIENT_WINDOW_ICON = { + 32, 32, 4, + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\1\1\377\1\2" + "\3\377\1\3\4\377\1\3\4\377\1\2\3\377\0\1\2\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\1\1\377\3\7\12\377\7\16\23\377\7\21\31\377\10\22\32\377\6\16\25" + "\377\3\10\12\377\0\2\2\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\2\4\5\377\10\22\33\377;" + "HS\377EVc\3770DT\377P\\e\377\10\24\35\377\2\5\7\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\3\7\12\377\16!0\377\214\227\240\377Zu\212\377Gg\200\377\250\260\266\377" + "\15\"3\377\4\12\15\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\1\377\2\3\5\377\3\10\13\377\11\24\34\377\27""3J\377" + "\215\234\251\377]\201\235\377Ku\226\377\253\264\274\377\25""5O\377\12\26" + "\37\377\3\7\12\377\1\3\4\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\1\3\4\377" + "\4\11\15\377\10\23\32\377\11\30$\377\25'6\377[o~\377\247\260\267\377\213" + "\236\255\377\203\230\251\377\273\302\307\377au\205\377\23(7\377\11\27!\377" + "\7\20\27\377\3\10\13\377\1\2\3\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\1\5\6\377\7\17\26\377\15\36,\377!" + "4D\377\200\211\217\377q~\210\377.Oi\377\213\234\252\377]\202\240\377My\233" + "\377\255\267\276\377'Mk\377s\177\211\377~\207\215\377\25(8\377\14\34'\377" + "\6\15\23\377\2\3\5\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\2\5\7\377\10\23\33\377\15%7\377ev\202\377\232\242\251\377\32/@\377" + "\16\40""0\377\30""8P\377\216\235\251\377^\201\233\377Nv\225\377\266\275\304" + "\377\26""9U\377\17#3\377\35""1@\377\261\267\273\377Tes\377\15#3\377\7\20" + "\27\377\2\4\5\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\1\3\4\377\10\22\32" + "\377\16)>\377\211\227\240\377\216\232\244\377\22-A\377\12\27\40\377\12\25" + "\36\377\27""4K\377\203\224\241\377^\201\234\377Mt\223\377\271\277\304\377" + "\22/G\377\12\25\36\377\12\26\40\377\21+?\377\267\276\303\377w\206\223\377" + "\16':\377\6\17\26\377\1\2\3\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\1\1\377\6\14\21\377\22" + "*<\377q\204\222\377\256\267\275\377\30""8Q\377\13\30#\377\3\6\11\377\11\23" + "\33\377\32""7O\377\343\344\346\377b\206\243\377Ow\226\377\274\302\307\377" + "\21.E\377\7\17\25\377\3\6\11\377\14\32$\377\31""8Q\377\325\332\334\377aw" + "\207\377\21&7\377\5\12\16\377\0\0\1\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\2\5\7\377\15\35*\3773Rj\377" + "\324\327\331\377@_w\377\20$4\377\4\10\13\377\0\2\2\377\12\26\40\377\35?Y" + "\377\337\341\343\377c\212\250\377Ox\230\377\300\305\311\377\21/F\377\7\16" + "\24\377\0\1\1\377\4\11\15\377\21&5\377Ql\202\377\350\352\352\377%E^\377\14" + "\32%\377\2\3\6\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\6\15\22\377\24""2J\377\236\253\264\377\250\263" + "\273\377\27:W\377\11\22\32\377\0\1\2\377\0\1\1\377\13\30\"\377\36B]\377\337" + "\341\343\377d\213\252\377Py\231\377\303\310\314\377\23""4N\377\12\26\37\377" + "\3\6\10\377\1\4\6\377\11\24\34\377\25:W\377\273\302\310\377\240\256\271\377" + "\23/E\377\5\13\20\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\1\3\3\377\14\31$\377.Pk\377\320\324\327\377t\215\240\377" + "\24-A\377\4\10\14\377\0\0\0\377\0\1\1\377\13\30\"\377\36B^\377\337\341\343" + "\377d\214\252\377Pz\233\377\307\313\315\377\34Il\377!8K\377\13\26\37\377" + "\3\10\13\377\4\11\15\377\25/C\377\202\227\251\377\335\337\341\377#Fb\377" + "\13\27!\377\1\2\3\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\3\5\7\377\22'8\377v\216\240\377\310\314\320\377Jk\206\377\20!0\377" + "\2\3\5\377\0\0\0\377\0\1\1\377\13\30\"\377\36B^\377\337\341\343\377d\214" + "\252\377R|\236\377\312\315\317\3771i\224\377\320\325\331\377\13\37""0\377" + "\6\15\22\377\2\4\6\377\20#2\377Qq\212\377\314\321\325\377u\215\240\377\21" + "%5\377\2\5\7\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\4\11\15\377\24""2H\377\236\255\270\377\324\327\332\377(On\377\15\33" + "&\377\1\2\2\377\0\0\0\377\0\1\1\377\13\30\"\377\36B^\377\337\341\343\377" + "d\213\253\377R\177\242\377\276\303\307\377\243\260\272\377\273\301\306\377" + "\20(:\377\5\14\20\377\1\2\3\377\15\34'\377,Sp\377\323\327\332\377\241\257" + "\273\377\24""0F\377\4\10\14\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\5\14\21\377\25""6R\377\263\273\303\377\330\332\334\377" + "\35Ef\377\13\30\"\377\0\1\1\377\0\0\0\377\1\3\4\377\15\34)\377!Hf\377\340" + "\341\343\377d\213\252\377S\201\244\377\272\277\303\377\217\236\251\377-U" + "s\377\16\37,\377\3\6\11\377\0\1\1\377\13\30\"\377\35Fe\377\330\332\334\377" + "\265\276\305\377\24""6Q\377\5\14\20\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\6\14\22\377\25""8S\377\265\275\303\377\332\334" + "\335\377\35Ff\377\13\30\"\377\0\1\1\377\1\2\2\377\6\15\22\377\26""1F\377" + "=f\205\377\321\324\327\377e\213\250\377S\177\242\377\303\307\312\377Y~\232" + "\377\36Ik\377\15\35)\377\3\6\10\377\0\1\2\377\13\30\"\377\35Ef\377\327\331" + "\333\377\267\276\305\377\25""8T\377\6\14\22\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\5\12\16\377\25""4L\377\246\263\275\377" + "\326\330\333\377.Tr\377\15\34'\377\2\4\6\377\6\15\23\377\22*<\377;^z\377" + "\300\306\312\377\244\260\271\377?o\225\377Q|\236\377\300\304\310\377\254" + "\265\273\377\202\227\250\377\23""3L\377\11\25\36\377\3\6\11\377\15\33&\377" + "*Qo\377\323\326\331\377\246\263\274\377\25""4N\377\5\13\17\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\3\7\11\377\23+=\377\202" + "\231\252\377\312\317\323\377Uu\216\377\21$4\377\7\21\30\377\22*<\377@_x\377" + "\303\311\314\377\236\253\265\377\226\251\267\377f\212\246\377Q|\235\377\314" + "\316\317\377\177\232\260\377\330\332\335\377\217\240\256\377\20""0I\377\12" + "\26\40\377\21$4\377Mn\210\377\306\313\317\377\204\231\252\377\24-@\377\3" + "\7\12\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\1\3" + "\4\377\15\34(\3777Zv\377\324\326\331\377\212\240\257\377\27""5L\377\21&7" + "\377F`t\377\306\312\316\377\233\252\265\377/i\225\377\341\341\342\377c\211" + "\247\377Q|\236\377\337\336\335\377#d\226\377\212\242\265\377\325\330\333" + "\377\231\246\260\377\20*>\377\30""6M\377y\221\243\377\311\316\321\377Cd}" + "\377\16\36+\377\1\3\5\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\1\1\377\6\17\25\377\25""5N\377\251\265\277\377\312\317\323\377" + "\27@a\377\21""3N\377\304\307\313\377\217\235\247\377&Uy\377(X~\377\337\341" + "\342\377d\214\252\377R}\240\377\341\341\341\377\33In\377\36Ii\377{\217\236" + "\377\331\332\333\377\20""3M\377\31Cd\377\262\272\301\377\251\263\273\377" + "\26""9T\377\10\20\27\377\0\1\1\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\2\5\7\377\15\35*\377/Pj\377\336\337\341\377" + "g\202\227\377\30>]\377z\204\214\377\24/D\377\26""1E\377\37Ge\377\337\341" + "\343\377d\214\253\377S~\240\377\343\343\344\377\25;X\377\22):\377\16&8\377" + "`mx\377\27;V\377Mm\206\377\315\321\324\377=]u\377\17!/\377\3\6\11\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\1\1\377\5\13\20\377\20&7\377Un\201\377\343\344\345\377%Hb\377\24." + "B\377\13\30!\377\16\37,\377\35A]\377\337\341\343\377d\214\253\377S~\241\377" + "\344\345\345\377\26""9T\377\15\33&\377\10\22\32\377\21&7\377\32>Y\377\274" + "\303\307\377ez\212\377\21*>\377\6\15\23\377\0\1\2\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\1" + "\2\3\377\6\16\24\377\17%6\377Qfw\377\314\317\322\377\33""4F\377\15\34)\377" + "\20$4\377\37Eb\377\337\341\343\377e\215\254\377S\200\243\377\346\346\347" + "\377\31>[\377\17!/\377\13\30#\377\17(;\377\242\252\261\377ew\205\377\20)" + "=\377\7\21\30\377\1\3\4\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\1\3\4\377" + "\6\15\23\377\14\36*\377'Vi\377\202\216" + "\227\377\26)8\377\6\15\21\377\0\0\1\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\2\3\5\377\6\16\22\377" + "\10\24\36\377\11\27!\377\12\27!\377\10\24\35\377\6\16\24\377\2\4\6\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\1\2\3\377\1\3\4\377\2\4\6\377\2\4\6\377\1" + "\3\5\377\1\2\3\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377", +}; + diff --git a/codemp/sdl/sdl_input.cpp b/shared/sdl/sdl_input.cpp similarity index 70% rename from codemp/sdl/sdl_input.cpp rename to shared/sdl/sdl_input.cpp index 089f3390a8..7e2bf27297 100644 --- a/codemp/sdl/sdl_input.cpp +++ b/shared/sdl/sdl_input.cpp @@ -1,3 +1,24 @@ +/* +=========================================================================== +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include #include "qcommon/qcommon.h" #include "qcommon/q_shared.h" @@ -19,8 +40,6 @@ static cvar_t *in_joystickThreshold = NULL; static cvar_t *in_joystickNo = NULL; static cvar_t *in_joystickUseAnalog = NULL; -static int vidRestartTime = 0; - static SDL_Window *SDL_window = NULL; #define CTRL(a) ((a)-'a'+1) @@ -155,6 +174,83 @@ static qboolean IN_IsConsoleKey( fakeAscii_t key, int character ) return qfalse; } +#if defined(_WIN32) +#define WIN32_LEAN_AND_MEAN +#include +#endif + +static bool IN_NumLockEnabled( void ) +{ +#if defined(_WIN32) + return (GetKeyState( VK_NUMLOCK ) & 1) != 0; +#else + // @fixme : doesn't give proper state if numlock is on before app startup + return (SDL_GetModState() & KMOD_NUM) != 0; +#endif +} + +static void IN_TranslateNumpad( SDL_Keysym *keysym, fakeAscii_t *key ) +{ + if ( IN_NumLockEnabled() ) + { + switch ( keysym->sym ) + { + case SDLK_KP_0: + keysym->scancode = SDL_SCANCODE_0; + keysym->sym = SDLK_0; + *key = A_0; + break; + case SDLK_KP_1: + keysym->scancode = SDL_SCANCODE_1; + keysym->sym = SDLK_1; + *key = A_1; + break; + case SDLK_KP_2: + keysym->scancode = SDL_SCANCODE_2; + keysym->sym = SDLK_2; + *key = A_2; + break; + case SDLK_KP_3: + keysym->scancode = SDL_SCANCODE_3; + keysym->sym = SDLK_3; + *key = A_3; + break; + case SDLK_KP_4: + keysym->scancode = SDL_SCANCODE_4; + keysym->sym = SDLK_4; + *key = A_4; + break; + case SDLK_KP_5: + keysym->scancode = SDL_SCANCODE_5; + keysym->sym = SDLK_5; + *key = A_5; + break; + case SDLK_KP_6: + keysym->scancode = SDL_SCANCODE_6; + keysym->sym = SDLK_6; + *key = A_6; + break; + case SDLK_KP_7: + keysym->scancode = SDL_SCANCODE_7; + keysym->sym = SDLK_7; + *key = A_7; + break; + case SDLK_KP_8: + keysym->scancode = SDL_SCANCODE_8; + keysym->sym = SDLK_8; + *key = A_8; + break; + case SDLK_KP_9: + keysym->scancode = SDL_SCANCODE_9; + keysym->sym = SDLK_9; + *key = A_9; + break; + default: + break; + } + } +} + /* =============== IN_TranslateSDLToJKKey @@ -170,6 +266,8 @@ static fakeAscii_t IN_TranslateSDLToJKKey( SDL_Keysym *keysym, qboolean down ) { } else { + IN_TranslateNumpad( keysym, &key ); + switch( keysym->sym ) { case SDLK_PAGEUP: key = A_PAGE_UP; break; @@ -231,6 +329,40 @@ static fakeAscii_t IN_TranslateSDLToJKKey( SDL_Keysym *keysym, qboolean down ) { case SDLK_NUMLOCKCLEAR: key = A_NUMLOCK; break; case SDLK_CAPSLOCK: key = A_CAPSLOCK; break; + case L'\u00D7': key = A_MULTIPLY; break; + case L'\u00E0': key = A_LOW_AGRAVE; break; + case L'\u00E1': key = A_LOW_AACUTE; break; + case L'\u00E2': key = A_LOW_ACIRCUMFLEX; break; + case L'\u00E3': key = A_LOW_ATILDE; break; + case L'\u00E4': key = A_LOW_ADIERESIS; break; + case L'\u00E5': key = A_LOW_ARING; break; + case L'\u00E6': key = A_LOW_AE; break; + case L'\u00E7': key = A_LOW_CCEDILLA; break; + case L'\u00E8': key = A_LOW_EGRAVE; break; + case L'\u00E9': key = A_LOW_EACUTE; break; + case L'\u00EA': key = A_LOW_ECIRCUMFLEX; break; + case L'\u00EB': key = A_LOW_EDIERESIS; break; + case L'\u00EC': key = A_LOW_IGRAVE; break; + case L'\u00ED': key = A_LOW_IACUTE; break; + case L'\u00EE': key = A_LOW_ICIRCUMFLEX; break; + case L'\u00EF': key = A_LOW_IDIERESIS; break; + case L'\u00F0': key = A_LOW_ETH; break; + case L'\u00F1': key = A_LOW_NTILDE; break; + case L'\u00F2': key = A_LOW_OGRAVE; break; + case L'\u00F3': key = A_LOW_OACUTE; break; + case L'\u00F4': key = A_LOW_OCIRCUMFLEX; break; + case L'\u00F5': key = A_LOW_OTILDE; break; + case L'\u00F6': key = A_LOW_ODIERESIS; break; + case L'\u00F7': key = A_DIVIDE; break; + case L'\u00F8': key = A_LOW_OSLASH; break; + case L'\u00F9': key = A_LOW_UGRAVE; break; + case L'\u00FA': key = A_LOW_UACUTE; break; + case L'\u00FB': key = A_LOW_UCIRCUMFLEX; break; + case L'\u00FC': key = A_LOW_UDIERESIS; break; + case L'\u00FD': key = A_LOW_YACUTE; break; + case L'\u00FE': key = A_LOW_THORN; break; + case L'\u00FF': key = A_LOW_YDIERESIS; break; + default: break; } @@ -335,20 +467,6 @@ static void IN_DeactivateMouse( void ) } } -/* -=============== -IN_InitKeyLockStates -=============== -*/ -void IN_InitKeyLockStates( void ) -{ - const unsigned char *keystate = SDL_GetKeyboardState(NULL); - - kg.keys[A_SCROLLLOCK].down = (qboolean)!!(keystate[SDL_SCANCODE_SCROLLLOCK]); - kg.keys[A_NUMLOCK].down = (qboolean)!!(keystate[SDL_SCANCODE_NUMLOCKCLEAR]); - kg.keys[A_CAPSLOCK].down = (qboolean)!!(keystate[SDL_SCANCODE_CAPSLOCK]); -} - // We translate axes movement into keypresses static int joy_keys[16] = { A_CURSOR_LEFT, A_CURSOR_RIGHT, @@ -455,8 +573,6 @@ static void IN_InitJoystick( void ) void IN_Init( void *windowData ) { - int appState; - if( !SDL_WasInit( SDL_INIT_VIDEO ) ) { Com_Error( ERR_FATAL, "IN_Init called before SDL_Init( SDL_INIT_VIDEO )" ); @@ -482,21 +598,178 @@ void IN_Init( void *windowData ) mouseAvailable = (qboolean)( in_mouse->value != 0 ); IN_DeactivateMouse( ); - appState = SDL_GetWindowFlags( SDL_window ); - Cvar_SetValue( "com_unfocused", !( appState & SDL_WINDOW_INPUT_FOCUS ) ); - Cvar_SetValue( "com_minimized", appState & SDL_WINDOW_MINIMIZED ); - - IN_InitKeyLockStates( ); + int appState = SDL_GetWindowFlags( SDL_window ); + Cvar_SetValue( "com_unfocused", ( appState & SDL_WINDOW_INPUT_FOCUS ) == 0 ); + Cvar_SetValue( "com_minimized", ( appState & SDL_WINDOW_MINIMIZED ) != 0 ); IN_InitJoystick( ); Com_DPrintf( "------------------------------------\n" ); } +uint8_t ConvertUTF32ToExpectedCharset( uint32_t utf32 ) +{ + switch ( utf32 ) + { + // Cyrillic characters - mapped to Windows-1251 encoding + case 0x0410: return 192; + case 0x0411: return 193; + case 0x0412: return 194; + case 0x0413: return 195; + case 0x0414: return 196; + case 0x0415: return 197; + case 0x0416: return 198; + case 0x0417: return 199; + case 0x0418: return 200; + case 0x0419: return 201; + case 0x041A: return 202; + case 0x041B: return 203; + case 0x041C: return 204; + case 0x041D: return 205; + case 0x041E: return 206; + case 0x041F: return 207; + case 0x0420: return 208; + case 0x0421: return 209; + case 0x0422: return 210; + case 0x0423: return 211; + case 0x0424: return 212; + case 0x0425: return 213; + case 0x0426: return 214; + case 0x0427: return 215; + case 0x0428: return 216; + case 0x0429: return 217; + case 0x042A: return 218; + case 0x042B: return 219; + case 0x042C: return 220; + case 0x042D: return 221; + case 0x042E: return 222; + case 0x042F: return 223; + case 0x0430: return 224; + case 0x0431: return 225; + case 0x0432: return 226; + case 0x0433: return 227; + case 0x0434: return 228; + case 0x0435: return 229; + case 0x0436: return 230; + case 0x0437: return 231; + case 0x0438: return 232; + case 0x0439: return 233; + case 0x043A: return 234; + case 0x043B: return 235; + case 0x043C: return 236; + case 0x043D: return 237; + case 0x043E: return 238; + case 0x043F: return 239; + case 0x0440: return 240; + case 0x0441: return 241; + case 0x0442: return 242; + case 0x0443: return 243; + case 0x0444: return 244; + case 0x0445: return 245; + case 0x0446: return 246; + case 0x0447: return 247; + case 0x0448: return 248; + case 0x0449: return 249; + case 0x044A: return 250; + case 0x044B: return 251; + case 0x044C: return 252; + case 0x044D: return 253; + case 0x044E: return 254; + case 0x044F: return 255; + + // Eastern european characters - polish, czech, etc use Windows-1250 encoding + case 0x0160: return 138; + case 0x015A: return 140; + case 0x0164: return 141; + case 0x017D: return 142; + case 0x0179: return 143; + case 0x0161: return 154; + case 0x015B: return 156; + case 0x0165: return 157; + case 0x017E: return 158; + case 0x017A: return 159; + case 0x0141: return 163; + case 0x0104: return 165; + case 0x015E: return 170; + case 0x017B: return 175; + case 0x0142: return 179; + case 0x0105: return 185; + case 0x015F: return 186; + case 0x013D: return 188; + case 0x013E: return 190; + case 0x017C: return 191; + case 0x0154: return 192; + case 0x00C1: return 193; + case 0x00C2: return 194; + case 0x0102: return 195; + case 0x00C4: return 196; + case 0x0139: return 197; + case 0x0106: return 198; + case 0x00C7: return 199; + case 0x010C: return 200; + case 0x00C9: return 201; + case 0x0118: return 202; + case 0x00CB: return 203; + case 0x011A: return 204; + case 0x00CD: return 205; + case 0x00CE: return 206; + case 0x010E: return 207; + case 0x0110: return 208; + case 0x0143: return 209; + case 0x0147: return 210; + case 0x00D3: return 211; + case 0x00D4: return 212; + case 0x0150: return 213; + case 0x00D6: return 214; + case 0x0158: return 216; + case 0x016E: return 217; + case 0x00DA: return 218; + case 0x0170: return 219; + case 0x00DC: return 220; + case 0x00DD: return 221; + case 0x0162: return 222; + case 0x00DF: return 223; + case 0x0155: return 224; + case 0x00E1: return 225; + case 0x00E2: return 226; + case 0x0103: return 227; + case 0x00E4: return 228; + case 0x013A: return 229; + case 0x0107: return 230; + case 0x00E7: return 231; + case 0x010D: return 232; + case 0x00E9: return 233; + case 0x0119: return 234; + case 0x00EB: return 235; + case 0x011B: return 236; + case 0x00ED: return 237; + case 0x00EE: return 238; + case 0x010F: return 239; + case 0x0111: return 240; + case 0x0144: return 241; + case 0x0148: return 242; + case 0x00F3: return 243; + case 0x00F4: return 244; + case 0x0151: return 245; + case 0x00F6: return 246; + case 0x0159: return 248; + case 0x016F: return 249; + case 0x00FA: return 250; + case 0x0171: return 251; + case 0x00FC: return 252; + case 0x00FD: return 253; + case 0x0163: return 254; + case 0x02D9: return 255; + + default: return (uint8_t)utf32; + } +} + /* =============== IN_ProcessEvents =============== */ +void SNDDMA_Activate( qboolean activate ); static void IN_ProcessEvents( void ) { SDL_Event e; @@ -539,34 +812,7 @@ static void IN_ProcessEvents( void ) // Quick and dirty UTF-8 to UTF-32 conversion while( *c ) { - int utf32 = 0; - - if( ( *c & 0x80 ) == 0 ) - utf32 = *c++; - else if( ( *c & 0xE0 ) == 0xC0 ) // 110x xxxx - { - utf32 |= ( *c++ & 0x1F ) << 6; - utf32 |= ( *c++ & 0x3F ); - } - else if( ( *c & 0xF0 ) == 0xE0 ) // 1110 xxxx - { - utf32 |= ( *c++ & 0x0F ) << 12; - utf32 |= ( *c++ & 0x3F ) << 6; - utf32 |= ( *c++ & 0x3F ); - } - else if( ( *c & 0xF8 ) == 0xF0 ) // 1111 0xxx - { - utf32 |= ( *c++ & 0x07 ) << 18; - utf32 |= ( *c++ & 0x3F ) << 6; - utf32 |= ( *c++ & 0x3F ) << 6; - utf32 |= ( *c++ & 0x3F ); - } - else - { - Com_DPrintf( "Unrecognised UTF-8 lead byte: 0x%x\n", (unsigned int)*c ); - c++; - } - + uint32_t utf32 = ConvertUTF8ToUTF32( c, &c ); if( utf32 != 0 ) { if( IN_IsConsoleKey( A_NULL, utf32 ) ) @@ -575,15 +821,22 @@ static void IN_ProcessEvents( void ) Sys_QueEvent( 0, SE_KEY, A_CONSOLE, qfalse, 0, NULL ); } else - Sys_QueEvent( 0, SE_CHAR, utf32, 0, 0, NULL ); + { + uint8_t encoded = ConvertUTF32ToExpectedCharset( utf32 ); + Sys_QueEvent( 0, SE_CHAR, encoded, 0, 0, NULL ); + } } } } break; case SDL_MOUSEMOTION: - if( mouseActive ) + if ( mouseActive ) + { + if ( !e.motion.xrel && !e.motion.yrel ) + break; Sys_QueEvent( 0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL ); + } break; case SDL_MOUSEBUTTONDOWN: @@ -624,29 +877,22 @@ static void IN_ProcessEvents( void ) case SDL_WINDOWEVENT: switch( e.window.event ) { - case SDL_WINDOWEVENT_RESIZED: - { - char width[32], height[32]; - if (!Cvar_VariableIntegerValue("r_restartOnResize")) - break; - Com_sprintf( width, sizeof( width ), "%d", e.window.data1 ); - Com_sprintf( height, sizeof( height ), "%d", e.window.data2 ); - Cvar_Set( "r_customwidth", width ); - Cvar_Set( "r_customheight", height ); - Cvar_Set( "r_mode", "-1" ); - - // Wait until user stops dragging for 1 second, so - // we aren't constantly recreating the GL context while - // he tries to drag... - vidRestartTime = Sys_Milliseconds( ) + Cvar_VariableIntegerValue("r_resizeDelay"); - } - break; - case SDL_WINDOWEVENT_MINIMIZED: Cvar_SetValue( "com_minimized", 1 ); break; case SDL_WINDOWEVENT_RESTORED: case SDL_WINDOWEVENT_MAXIMIZED: Cvar_SetValue( "com_minimized", 0 ); break; - case SDL_WINDOWEVENT_FOCUS_LOST: Cvar_SetValue( "com_unfocused", 1 ); break; - case SDL_WINDOWEVENT_FOCUS_GAINED: Cvar_SetValue( "com_unfocused", 0 ); break; + case SDL_WINDOWEVENT_FOCUS_LOST: + { + Cvar_SetValue( "com_unfocused", 1 ); + SNDDMA_Activate( qfalse ); + break; + } + + case SDL_WINDOWEVENT_FOCUS_GAINED: + { + Cvar_SetValue( "com_unfocused", 0 ); + SNDDMA_Activate( qtrue ); + break; + } } break; @@ -865,7 +1111,6 @@ void IN_Frame (void) { qboolean loading; IN_JoyMove( ); - IN_ProcessEvents( ); // If not DISCONNECTED (main menu) or ACTIVE (in game), we're loading loading = (qboolean)( cls.state != CA_DISCONNECTED && cls.state != CA_ACTIVE ); @@ -888,12 +1133,7 @@ void IN_Frame (void) { else IN_ActivateMouse( ); - // In case we had to delay actual restart of video system - if( ( vidRestartTime != 0 ) && ( vidRestartTime < Sys_Milliseconds( ) ) ) - { - vidRestartTime = 0; - Cbuf_AddText( "vid_restart\n" ); - } + IN_ProcessEvents( ); } /* diff --git a/codemp/sdl/sdl_qgl.h b/shared/sdl/sdl_qgl.h similarity index 86% rename from codemp/sdl/sdl_qgl.h rename to shared/sdl/sdl_qgl.h index 1cb7630261..4d2014aace 100644 --- a/codemp/sdl/sdl_qgl.h +++ b/shared/sdl/sdl_qgl.h @@ -1,3 +1,24 @@ +/* +=========================================================================== +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #pragma once #include @@ -337,27 +358,24 @@ #define qglVertexPointer glVertexPointer #define qglViewport glViewport -extern void (APIENTRYP qglActiveTextureARB) (GLenum texture); -extern void (APIENTRYP qglClientActiveTextureARB) (GLenum texture); -extern void (APIENTRYP qglMultiTexCoord2fARB) (GLenum target, GLfloat s, GLfloat t); +extern PFNGLACTIVETEXTUREARBPROC qglActiveTextureARB; +extern PFNGLCLIENTACTIVETEXTUREARBPROC qglClientActiveTextureARB; +extern PFNGLMULTITEXCOORD2FARBPROC qglMultiTexCoord2fARB; -extern void (APIENTRYP qglCombinerParameterfvNV) (GLenum pname,const GLfloat *params); -extern void (APIENTRYP qglCombinerParameterivNV) (GLenum pname,const GLint *params); -extern void (APIENTRYP qglCombinerParameterfNV) (GLenum pname,GLfloat param); -extern void (APIENTRYP qglCombinerParameteriNV) (GLenum pname,GLint param); -extern void (APIENTRYP qglCombinerInputNV) (GLenum stage,GLenum portion,GLenum variable,GLenum input,GLenum mapping, - GLenum componentUsage); -extern void (APIENTRYP qglCombinerOutputNV) (GLenum stage,GLenum portion,GLenum abOutput,GLenum cdOutput,GLenum sumOutput, - GLenum scale, GLenum bias,GLboolean abDotProduct,GLboolean cdDotProduct, - GLboolean muxSum); +extern PFNGLCOMBINERPARAMETERFVNVPROC qglCombinerParameterfvNV; +extern PFNGLCOMBINERPARAMETERIVNVPROC qglCombinerParameterivNV; +extern PFNGLCOMBINERPARAMETERFNVPROC qglCombinerParameterfNV; +extern PFNGLCOMBINERPARAMETERINVPROC qglCombinerParameteriNV; +extern PFNGLCOMBINERINPUTNVPROC qglCombinerInputNV; +extern PFNGLCOMBINEROUTPUTNVPROC qglCombinerOutputNV; -extern void (APIENTRYP qglFinalCombinerInputNV) (GLenum variable,GLenum input,GLenum mapping,GLenum componentUsage); -extern void (APIENTRYP qglGetCombinerInputParameterfvNV) (GLenum stage,GLenum portion,GLenum variable,GLenum pname,GLfloat *params); -extern void (APIENTRYP qglGetCombinerInputParameterivNV) (GLenum stage,GLenum portion,GLenum variable,GLenum pname,GLint *params); -extern void (APIENTRYP qglGetCombinerOutputParameterfvNV) (GLenum stage,GLenum portion,GLenum pname,GLfloat *params); -extern void (APIENTRYP qglGetCombinerOutputParameterivNV) (GLenum stage,GLenum portion,GLenum pname,GLint *params); -extern void (APIENTRYP qglGetFinalCombinerInputParameterfvNV) (GLenum variable,GLenum pname,GLfloat *params); -extern void (APIENTRYP qglGetFinalCombinerInputParameterivNV) (GLenum variable,GLenum pname,GLint *params); +extern PFNGLFINALCOMBINERINPUTNVPROC qglFinalCombinerInputNV; +extern PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC qglGetCombinerInputParameterfvNV; +extern PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC qglGetCombinerInputParameterivNV; +extern PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC qglGetCombinerOutputParameterfvNV; +extern PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC qglGetCombinerOutputParameterivNV; +extern PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC qglGetFinalCombinerInputParameterfvNV; +extern PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC qglGetFinalCombinerInputParameterivNV; extern PFNGLPROGRAMSTRINGARBPROC qglProgramStringARB; extern PFNGLBINDPROGRAMARBPROC qglBindProgramARB; @@ -379,8 +397,8 @@ extern PFNGLGETPROGRAMIVARBPROC qglGetProgramivARB; extern PFNGLGETPROGRAMSTRINGARBPROC qglGetProgramStringARB; extern PFNGLISPROGRAMARBPROC qglIsProgramARB; -extern void ( * qglLockArraysEXT)( int, int); -extern void ( * qglUnlockArraysEXT) ( void ); +extern PFNGLLOCKARRAYSEXTPROC qglLockArraysEXT; +extern PFNGLUNLOCKARRAYSEXTPROC qglUnlockArraysEXT; #define GL_TEXTURE_RECTANGLE_EXT GL_TEXTURE_RECTANGLE_ARB diff --git a/codemp/sdl/sdl_snd.cpp b/shared/sdl/sdl_sound.cpp similarity index 96% rename from codemp/sdl/sdl_snd.cpp rename to shared/sdl/sdl_sound.cpp index 8d6a7e0de8..ec89ab9445 100644 --- a/codemp/sdl/sdl_snd.cpp +++ b/shared/sdl/sdl_sound.cpp @@ -291,3 +291,20 @@ void SNDDMA_BeginPainting (void) { SDL_LockAudio(); } + +#ifdef USE_OPENAL +extern int s_UseOpenAL; +#endif + +// (De)activates sound playback +void SNDDMA_Activate( qboolean activate ) +{ +#ifdef USE_OPENAL + if ( s_UseOpenAL ) + { + S_AL_MuteAllSounds( (qboolean)!activate ); + } +#endif + + SDL_PauseAudio( !activate ); +} diff --git a/shared/sdl/sdl_window.cpp b/shared/sdl/sdl_window.cpp new file mode 100644 index 0000000000..c18e9e5034 --- /dev/null +++ b/shared/sdl/sdl_window.cpp @@ -0,0 +1,813 @@ +/* +=========================================================================== +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#include +#include +#include "qcommon/qcommon.h" +#include "rd-common/tr_types.h" +#include "sys/sys_local.h" +#include "sdl_icon.h" + +enum rserr_t +{ + RSERR_OK, + + RSERR_INVALID_FULLSCREEN, + RSERR_INVALID_MODE, + + RSERR_UNKNOWN +}; + +static SDL_Window *screen = NULL; +static SDL_GLContext opengl_context; +static float displayAspect; + +cvar_t *r_sdlDriver; + +// Window cvars +cvar_t *r_fullscreen = 0; +cvar_t *r_noborder; +cvar_t *r_centerWindow; +cvar_t *r_customwidth; +cvar_t *r_customheight; +cvar_t *r_swapInterval; +cvar_t *r_stereo; +cvar_t *r_mode; +cvar_t *r_displayRefresh; + +// Window surface cvars +cvar_t *r_stencilbits; +cvar_t *r_depthbits; +cvar_t *r_colorbits; +cvar_t *r_ignorehwgamma; +cvar_t *r_ext_multisample; + +/* +** R_GetModeInfo +*/ +typedef struct vidmode_s +{ + const char *description; + int width, height; +} vidmode_t; + +const vidmode_t r_vidModes[] = { + { "Mode 0: 320x240", 320, 240 }, + { "Mode 1: 400x300", 400, 300 }, + { "Mode 2: 512x384", 512, 384 }, + { "Mode 3: 640x480", 640, 480 }, + { "Mode 4: 800x600", 800, 600 }, + { "Mode 5: 960x720", 960, 720 }, + { "Mode 6: 1024x768", 1024, 768 }, + { "Mode 7: 1152x864", 1152, 864 }, + { "Mode 8: 1280x1024", 1280, 1024 }, + { "Mode 9: 1600x1200", 1600, 1200 }, + { "Mode 10: 2048x1536", 2048, 1536 }, + { "Mode 11: 856x480 (wide)", 856, 480 }, + { "Mode 12: 2400x600(surround)",2400,600 } +}; +static const int s_numVidModes = ARRAY_LEN( r_vidModes ); + +#define R_MODE_FALLBACK (4) // 640x480 + +qboolean R_GetModeInfo( int *width, int *height, int mode ) { + const vidmode_t *vm; + + if ( mode < -1 ) { + return qfalse; + } + if ( mode >= s_numVidModes ) { + return qfalse; + } + + if ( mode == -1 ) { + *width = r_customwidth->integer; + *height = r_customheight->integer; + return qtrue; + } + + vm = &r_vidModes[mode]; + + *width = vm->width; + *height = vm->height; + + return qtrue; +} + +/* +** R_ModeList_f +*/ +static void R_ModeList_f( void ) +{ + int i; + + Com_Printf( "\n" ); + Com_Printf( "Mode -2: Use desktop resolution\n" ); + Com_Printf( "Mode -1: Use r_customWidth and r_customHeight variables\n" ); + for ( i = 0; i < s_numVidModes; i++ ) + { + Com_Printf( "%s\n", r_vidModes[i].description ); + } + Com_Printf( "\n" ); +} + +/* +=============== +GLimp_Minimize + +Minimize the game so that user is back at the desktop +=============== +*/ +void GLimp_Minimize(void) +{ + SDL_MinimizeWindow( screen ); +} + +void WIN_Present( window_t *window ) +{ + if ( window->api == GRAPHICS_API_OPENGL ) + { + SDL_GL_SwapWindow(screen); + + if ( r_swapInterval->modified ) + { + r_swapInterval->modified = qfalse; + SDL_GL_SetSwapInterval( r_swapInterval->integer ); + } + } +} + +/* +=============== +GLimp_CompareModes +=============== +*/ +static int GLimp_CompareModes( const void *a, const void *b ) +{ + const float ASPECT_EPSILON = 0.001f; + SDL_Rect *modeA = (SDL_Rect *)a; + SDL_Rect *modeB = (SDL_Rect *)b; + float aspectA = (float)modeA->w / (float)modeA->h; + float aspectB = (float)modeB->w / (float)modeB->h; + int areaA = modeA->w * modeA->h; + int areaB = modeB->w * modeB->h; + float aspectDiffA = fabs( aspectA - displayAspect ); + float aspectDiffB = fabs( aspectB - displayAspect ); + float aspectDiffsDiff = aspectDiffA - aspectDiffB; + + if( aspectDiffsDiff > ASPECT_EPSILON ) + return 1; + else if( aspectDiffsDiff < -ASPECT_EPSILON ) + return -1; + else + return areaA - areaB; +} + +/* +=============== +GLimp_DetectAvailableModes +=============== +*/ +static bool GLimp_DetectAvailableModes(void) +{ + int i, j; + char buf[ MAX_STRING_CHARS ] = { 0 }; + SDL_Rect modes[ 128 ]; + int numModes = 0; + + int display = SDL_GetWindowDisplayIndex( screen ); + SDL_DisplayMode windowMode; + + if( SDL_GetWindowDisplayMode( screen, &windowMode ) < 0 ) + { + Com_Printf( "Couldn't get window display mode, no resolutions detected (%s).\n", SDL_GetError() ); + return false; + } + + int numDisplayModes = SDL_GetNumDisplayModes( display ); + for( i = 0; i < numDisplayModes; i++ ) + { + SDL_DisplayMode mode; + + if( SDL_GetDisplayMode( display, i, &mode ) < 0 ) + continue; + + if( !mode.w || !mode.h ) + { + Com_Printf( "Display supports any resolution\n" ); + return true; + } + + if( windowMode.format != mode.format ) + continue; + + // SDL can give the same resolution with different refresh rates. + // Only list resolution once. + for( j = 0; j < numModes; j++ ) + { + if( mode.w == modes[ j ].w && mode.h == modes[ j ].h ) + break; + } + + if( j != numModes ) + continue; + + modes[ numModes ].w = mode.w; + modes[ numModes ].h = mode.h; + numModes++; + } + + if( numModes > 1 ) + qsort( modes, numModes, sizeof( SDL_Rect ), GLimp_CompareModes ); + + for( i = 0; i < numModes; i++ ) + { + const char *newModeString = va( "%ux%u ", modes[ i ].w, modes[ i ].h ); + + if( strlen( newModeString ) < (int)sizeof( buf ) - strlen( buf ) ) + Q_strcat( buf, sizeof( buf ), newModeString ); + else + Com_Printf( "Skipping mode %ux%u, buffer too small\n", modes[ i ].w, modes[ i ].h ); + } + + if( *buf ) + { + buf[ strlen( buf ) - 1 ] = 0; + Com_Printf( "Available modes: '%s'\n", buf ); + Cvar_Set( "r_availableModes", buf ); + } + + return true; +} + +/* +=============== +GLimp_SetMode +=============== +*/ +static rserr_t GLimp_SetMode(glconfig_t *glConfig, const windowDesc_t *windowDesc, const char *windowTitle, int mode, qboolean fullscreen, qboolean noborder) +{ + int perChannelColorBits; + int colorBits, depthBits, stencilBits; + int samples; + int i = 0; + SDL_Surface *icon = NULL; + Uint32 flags = SDL_WINDOW_SHOWN; + SDL_DisplayMode desktopMode; + int display = 0; + int x = SDL_WINDOWPOS_UNDEFINED, y = SDL_WINDOWPOS_UNDEFINED; + + if ( windowDesc->api == GRAPHICS_API_OPENGL ) + { + flags |= SDL_WINDOW_OPENGL; + } + + Com_Printf( "Initializing display\n"); + + icon = SDL_CreateRGBSurfaceFrom( + (void *)CLIENT_WINDOW_ICON.pixel_data, + CLIENT_WINDOW_ICON.width, + CLIENT_WINDOW_ICON.height, + CLIENT_WINDOW_ICON.bytes_per_pixel * 8, + CLIENT_WINDOW_ICON.bytes_per_pixel * CLIENT_WINDOW_ICON.width, +#ifdef Q3_LITTLE_ENDIAN + 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 +#else + 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF +#endif + ); + + // If a window exists, note its display index + if( screen != NULL ) + display = SDL_GetWindowDisplayIndex( screen ); + + if( SDL_GetDesktopDisplayMode( display, &desktopMode ) == 0 ) + { + displayAspect = (float)desktopMode.w / (float)desktopMode.h; + + Com_Printf( "Display aspect: %.3f\n", displayAspect ); + } + else + { + Com_Memset( &desktopMode, 0, sizeof( SDL_DisplayMode ) ); + + Com_Printf( "Cannot determine display aspect, assuming 1.333\n" ); + } + + Com_Printf( "...setting mode %d:", mode ); + + if (mode == -2) + { + // use desktop video resolution + if( desktopMode.h > 0 ) + { + glConfig->vidWidth = desktopMode.w; + glConfig->vidHeight = desktopMode.h; + } + else + { + glConfig->vidWidth = 640; + glConfig->vidHeight = 480; + Com_Printf( "Cannot determine display resolution, assuming 640x480\n" ); + } + + //glConfig.windowAspect = (float)glConfig.vidWidth / (float)glConfig.vidHeight; + } + else if ( !R_GetModeInfo( &glConfig->vidWidth, &glConfig->vidHeight, /*&glConfig.windowAspect,*/ mode ) ) + { + Com_Printf( " invalid mode\n" ); + SDL_FreeSurface( icon ); + return RSERR_INVALID_MODE; + } + Com_Printf( " %d %d\n", glConfig->vidWidth, glConfig->vidHeight); + + // Center window + if( r_centerWindow->integer && !fullscreen ) + { + x = ( desktopMode.w / 2 ) - ( glConfig->vidWidth / 2 ); + y = ( desktopMode.h / 2 ) - ( glConfig->vidHeight / 2 ); + } + + // Destroy existing state if it exists + if( opengl_context != NULL ) + { + SDL_GL_DeleteContext( opengl_context ); + opengl_context = NULL; + } + + if( screen != NULL ) + { + SDL_GetWindowPosition( screen, &x, &y ); + Com_DPrintf( "Existing window at %dx%d before being destroyed\n", x, y ); + SDL_DestroyWindow( screen ); + screen = NULL; + } + + if( fullscreen ) + { + flags |= SDL_WINDOW_FULLSCREEN; + glConfig->isFullscreen = qtrue; + } + else + { + if( noborder ) + flags |= SDL_WINDOW_BORDERLESS; + + glConfig->isFullscreen = qfalse; + } + + colorBits = r_colorbits->integer; + if ((!colorBits) || (colorBits >= 32)) + colorBits = 24; + + if (!r_depthbits->integer) + depthBits = 24; + else + depthBits = r_depthbits->integer; + + stencilBits = r_stencilbits->integer; + samples = r_ext_multisample->integer; + + if ( windowDesc->api == GRAPHICS_API_OPENGL ) + { + for (i = 0; i < 16; i++) + { + int testColorBits, testDepthBits, testStencilBits; + + // 0 - default + // 1 - minus colorBits + // 2 - minus depthBits + // 3 - minus stencil + if ((i % 4) == 0 && i) + { + // one pass, reduce + switch (i / 4) + { + case 2 : + if (colorBits == 24) + colorBits = 16; + break; + case 1 : + if (depthBits == 24) + depthBits = 16; + else if (depthBits == 16) + depthBits = 8; + case 3 : + if (stencilBits == 24) + stencilBits = 16; + else if (stencilBits == 16) + stencilBits = 8; + } + } + + testColorBits = colorBits; + testDepthBits = depthBits; + testStencilBits = stencilBits; + + if ((i % 4) == 3) + { // reduce colorBits + if (testColorBits == 24) + testColorBits = 16; + } + + if ((i % 4) == 2) + { // reduce depthBits + if (testDepthBits == 24) + testDepthBits = 16; + else if (testDepthBits == 16) + testDepthBits = 8; + } + + if ((i % 4) == 1) + { // reduce stencilBits + if (testStencilBits == 24) + testStencilBits = 16; + else if (testStencilBits == 16) + testStencilBits = 8; + else + testStencilBits = 0; + } + + if (testColorBits == 24) + perChannelColorBits = 8; + else + perChannelColorBits = 4; + + SDL_GL_SetAttribute( SDL_GL_RED_SIZE, perChannelColorBits ); + SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, perChannelColorBits ); + SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, perChannelColorBits ); + SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, testDepthBits ); + SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, testStencilBits ); + + SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, samples ? 1 : 0 ); + SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, samples ); + + if ( windowDesc->gl.majorVersion ) + { + int compactVersion = windowDesc->gl.majorVersion * 100 + windowDesc->gl.minorVersion * 10; + + SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, windowDesc->gl.majorVersion ); + SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, windowDesc->gl.minorVersion ); + + if ( windowDesc->gl.profile == GLPROFILE_ES || compactVersion >= 320 ) + { + int profile; + switch ( windowDesc->gl.profile ) + { + default: + case GLPROFILE_COMPATIBILITY: + profile = SDL_GL_CONTEXT_PROFILE_COMPATIBILITY; + break; + + case GLPROFILE_CORE: + profile = SDL_GL_CONTEXT_PROFILE_CORE; + break; + + case GLPROFILE_ES: + profile = SDL_GL_CONTEXT_PROFILE_ES; + break; + } + + SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, profile ); + } + } + + if ( windowDesc->gl.contextFlags & GLCONTEXT_DEBUG ) + { + SDL_GL_SetAttribute( SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG ); + } + + if(r_stereo->integer) + { + glConfig->stereoEnabled = qtrue; + SDL_GL_SetAttribute(SDL_GL_STEREO, 1); + } + else + { + glConfig->stereoEnabled = qfalse; + SDL_GL_SetAttribute(SDL_GL_STEREO, 0); + } + + SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); + SDL_GL_SetAttribute( SDL_GL_ACCELERATED_VISUAL, 1 ); + + if( ( screen = SDL_CreateWindow( windowTitle, x, y, + glConfig->vidWidth, glConfig->vidHeight, flags ) ) == NULL ) + { + Com_DPrintf( "SDL_CreateWindow failed: %s\n", SDL_GetError( ) ); + continue; + } + +#ifndef MACOS_X + SDL_SetWindowIcon( screen, icon ); +#endif + + if( fullscreen ) + { + SDL_DisplayMode mode; + + switch( testColorBits ) + { + case 16: mode.format = SDL_PIXELFORMAT_RGB565; break; + case 24: mode.format = SDL_PIXELFORMAT_RGB24; break; + default: Com_DPrintf( "testColorBits is %d, can't fullscreen\n", testColorBits ); continue; + } + + mode.w = glConfig->vidWidth; + mode.h = glConfig->vidHeight; + mode.refresh_rate = glConfig->displayFrequency = r_displayRefresh->integer; + mode.driverdata = NULL; + + if( SDL_SetWindowDisplayMode( screen, &mode ) < 0 ) + { + Com_DPrintf( "SDL_SetWindowDisplayMode failed: %s\n", SDL_GetError( ) ); + continue; + } + } + + if( ( opengl_context = SDL_GL_CreateContext( screen ) ) == NULL ) + { + Com_Printf( "SDL_GL_CreateContext failed: %s\n", SDL_GetError( ) ); + continue; + } + + SDL_GL_SetSwapInterval( r_swapInterval->integer ); + + glConfig->colorBits = testColorBits; + glConfig->depthBits = testDepthBits; + glConfig->stencilBits = testStencilBits; + + Com_Printf( "Using %d color bits, %d depth, %d stencil display.\n", + glConfig->colorBits, glConfig->depthBits, glConfig->stencilBits ); + break; + } + } + else + { + // Just create a regular window + if( ( screen = SDL_CreateWindow( windowTitle, x, y, + glConfig->vidWidth, glConfig->vidHeight, flags ) ) == NULL ) + { + Com_DPrintf( "SDL_CreateWindow failed: %s\n", SDL_GetError( ) ); + } + else + { +#ifndef MACOS_X + SDL_SetWindowIcon( screen, icon ); +#endif + if( fullscreen ) + { + if( SDL_SetWindowDisplayMode( screen, NULL ) < 0 ) + { + Com_DPrintf( "SDL_SetWindowDisplayMode failed: %s\n", SDL_GetError( ) ); + } + } + } + } + + SDL_FreeSurface( icon ); + + if (!GLimp_DetectAvailableModes()) + { + return RSERR_UNKNOWN; + } + + return RSERR_OK; +} + +/* +=============== +GLimp_StartDriverAndSetMode +=============== +*/ +static qboolean GLimp_StartDriverAndSetMode(glconfig_t *glConfig, const windowDesc_t *windowDesc, int mode, qboolean fullscreen, qboolean noborder) +{ + rserr_t err; + + if (!SDL_WasInit(SDL_INIT_VIDEO)) + { + const char *driverName; + + if (SDL_Init(SDL_INIT_VIDEO) == -1) + { + Com_Printf( "SDL_Init( SDL_INIT_VIDEO ) FAILED (%s)\n", SDL_GetError()); + return qfalse; + } + + driverName = SDL_GetCurrentVideoDriver(); + + if (!driverName) + { + Com_Error( ERR_FATAL, "No video driver initialized" ); + return qfalse; + } + + Com_Printf( "SDL using driver \"%s\"\n", driverName ); + Cvar_Set( "r_sdlDriver", driverName ); + } + + if (SDL_GetNumVideoDisplays() <= 0) + { + Com_Error( ERR_FATAL, "SDL_GetNumVideoDisplays() FAILED (%s)", SDL_GetError() ); + } + + if (fullscreen && Cvar_VariableIntegerValue( "in_nograb" ) ) + { + Com_Printf( "Fullscreen not allowed with in_nograb 1\n"); + Cvar_Set( "r_fullscreen", "0" ); + r_fullscreen->modified = qfalse; + fullscreen = qfalse; + } + + err = GLimp_SetMode(glConfig, windowDesc, CLIENT_WINDOW_TITLE, mode, fullscreen, noborder); + + switch ( err ) + { + case RSERR_INVALID_FULLSCREEN: + Com_Printf( "...WARNING: fullscreen unavailable in this mode\n" ); + return qfalse; + case RSERR_INVALID_MODE: + Com_Printf( "...WARNING: could not set the given mode (%d)\n", mode ); + return qfalse; + case RSERR_UNKNOWN: + Com_Printf( "...ERROR: no display modes could be found.\n" ); + return qfalse; + default: + break; + } + + return qtrue; +} + +window_t WIN_Init( const windowDesc_t *windowDesc, glconfig_t *glConfig ) +{ + Cmd_AddCommand("modelist", R_ModeList_f); + Cmd_AddCommand("minimize", GLimp_Minimize); + + r_sdlDriver = Cvar_Get( "r_sdlDriver", "", CVAR_ROM ); + + // Window cvars + r_fullscreen = Cvar_Get( "r_fullscreen", "0", CVAR_ARCHIVE|CVAR_LATCH ); + r_noborder = Cvar_Get( "r_noborder", "0", CVAR_ARCHIVE|CVAR_LATCH ); + r_centerWindow = Cvar_Get( "r_centerWindow", "0", CVAR_ARCHIVE|CVAR_LATCH ); + r_customwidth = Cvar_Get( "r_customwidth", "1600", CVAR_ARCHIVE|CVAR_LATCH ); + r_customheight = Cvar_Get( "r_customheight", "1024", CVAR_ARCHIVE|CVAR_LATCH ); + r_swapInterval = Cvar_Get( "r_swapInterval", "0", CVAR_ARCHIVE ); + r_stereo = Cvar_Get( "r_stereo", "0", CVAR_ARCHIVE|CVAR_LATCH ); + r_mode = Cvar_Get( "r_mode", "4", CVAR_ARCHIVE|CVAR_LATCH ); + r_displayRefresh = Cvar_Get( "r_displayRefresh", "0", CVAR_LATCH ); + Cvar_CheckRange( r_displayRefresh, 0, 240, qtrue ); + + // Window render surface cvars + r_stencilbits = Cvar_Get( "r_stencilbits", "8", CVAR_ARCHIVE|CVAR_LATCH ); + r_depthbits = Cvar_Get( "r_depthbits", "0", CVAR_ARCHIVE|CVAR_LATCH ); + r_colorbits = Cvar_Get( "r_colorbits", "0", CVAR_ARCHIVE|CVAR_LATCH ); + r_ignorehwgamma = Cvar_Get( "r_ignorehwgamma", "0", CVAR_ARCHIVE|CVAR_LATCH ); + r_ext_multisample = Cvar_Get( "r_ext_multisample", "0", CVAR_ARCHIVE|CVAR_LATCH ); + + // Create the window and set up the context + if(!GLimp_StartDriverAndSetMode( glConfig, windowDesc, r_mode->integer, + (qboolean)r_fullscreen->integer, (qboolean)r_noborder->integer )) + { + if( r_mode->integer != R_MODE_FALLBACK ) + { + Com_Printf( "Setting r_mode %d failed, falling back on r_mode %d\n", r_mode->integer, R_MODE_FALLBACK ); + + if (!GLimp_StartDriverAndSetMode( glConfig, windowDesc, R_MODE_FALLBACK, qfalse, qfalse )) + { + // Nothing worked, give up + Com_Error( ERR_FATAL, "GLimp_Init() - could not load OpenGL subsystem" ); + } + } + } + + glConfig->deviceSupportsGamma = + (qboolean)(!r_ignorehwgamma->integer && SDL_SetWindowBrightness( screen, 1.0f ) >= 0); + + Cvar_Get( "r_availableModes", "", CVAR_ROM ); + + // This depends on SDL_INIT_VIDEO, hence having it here + IN_Init( screen ); + + // window_t is only really useful for Windows if the renderer wants to create a D3D context. + window_t window = {}; + + window.api = windowDesc->api; + +#if defined(_WIN32) + SDL_SysWMinfo info; + SDL_VERSION(&info.version); + + if ( SDL_GetWindowWMInfo(screen, &info) ) + { + switch(info.subsystem) { + case SDL_SYSWM_WINDOWS: + window.handle = info.info.win.window; + break; + + default: + break; + } + } +#endif + + return window; +} + +/* +=============== +GLimp_Shutdown +=============== +*/ +void WIN_Shutdown( void ) +{ + Cmd_RemoveCommand("modelist"); + Cmd_RemoveCommand("minimize"); + + IN_Shutdown(); + + SDL_QuitSubSystem( SDL_INIT_VIDEO ); + screen = NULL; +} + +void GLimp_EnableLogging( qboolean enable ) +{ +} + +void GLimp_LogComment( char *comment ) +{ +} + +void WIN_SetGamma( glconfig_t *glConfig, byte red[256], byte green[256], byte blue[256] ) +{ + Uint16 table[3][256]; + int i, j; + + if( !glConfig->deviceSupportsGamma || r_ignorehwgamma->integer > 0 ) + return; + + for (i = 0; i < 256; i++) + { + table[0][i] = ( ( ( Uint16 ) red[i] ) << 8 ) | red[i]; + table[1][i] = ( ( ( Uint16 ) green[i] ) << 8 ) | green[i]; + table[2][i] = ( ( ( Uint16 ) blue[i] ) << 8 ) | blue[i]; + } + +#if defined(_WIN32) + // Win2K and newer put this odd restriction on gamma ramps... + { + OSVERSIONINFO vinfo; + + vinfo.dwOSVersionInfoSize = sizeof( vinfo ); + GetVersionEx( &vinfo ); + if( vinfo.dwMajorVersion >= 5 && vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) + { + Com_DPrintf( "performing gamma clamp.\n" ); + for( j = 0 ; j < 3 ; j++ ) + { + for( i = 0 ; i < 128 ; i++ ) + { + table[j][i] = Q_min(table[j][i], (128 + i) << 8); + } + + table[j][127] = Q_min(table[j][127], 254 << 8); + } + } + } +#endif + + // enforce constantly increasing + for (j = 0; j < 3; j++) + { + for (i = 1; i < 256; i++) + { + if (table[j][i] < table[j][i-1]) + table[j][i] = table[j][i-1]; + } + } + + SDL_SetWindowGammaRamp(screen, table[0], table[1], table[2]); +} + +void *WIN_GL_GetProcAddress( const char *proc ) +{ + return SDL_GL_GetProcAddress( proc ); +} diff --git a/shared/sys/con_local.h b/shared/sys/con_local.h new file mode 100644 index 0000000000..a207823b3e --- /dev/null +++ b/shared/sys/con_local.h @@ -0,0 +1,34 @@ +/* +=========================================================================== +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#pragma once + +#include + +/* con_passive.cpp | con_win32.cpp | con_tty.cpp */ +void CON_Shutdown( void ); +void CON_Init( void ); +char *CON_Input( void ); +void CON_Print( const char *msg ); + +/* con_log.cpp */ +void ConsoleLogAppend( const char *string ); +void ConsoleLogWriteOut( FILE *fp ); diff --git a/shared/sys/con_log.cpp b/shared/sys/con_log.cpp new file mode 100644 index 0000000000..0725bd4c8a --- /dev/null +++ b/shared/sys/con_log.cpp @@ -0,0 +1,78 @@ +/* +=========================================================================== +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#include "con_local.h" +#include +#include + + +/* +======================================================================== + +CONSOLE LOG + +======================================================================== +*/ +#define MAX_CONSOLE_LOG_SIZE (65535) + +struct ConsoleLog +{ + // Cicular buffer of characters. Be careful, there is no null terminator. + // You're expected to use the console log length to know where the end + // of the string is. + char text[MAX_CONSOLE_LOG_SIZE]; + + // Where to start writing the next string + int writeHead; + + // Length of buffer + int length; +}; + +static ConsoleLog consoleLog; + +void ConsoleLogAppend( const char *string ) +{ + for ( int i = 0; string[i]; i++ ) + { + consoleLog.text[consoleLog.writeHead] = string[i]; + consoleLog.writeHead = (consoleLog.writeHead + 1) % MAX_CONSOLE_LOG_SIZE; + + consoleLog.length++; + if ( consoleLog.length > MAX_CONSOLE_LOG_SIZE ) + { + consoleLog.length = MAX_CONSOLE_LOG_SIZE; + } + } +} + +void ConsoleLogWriteOut( FILE *fp ) +{ + assert( fp ); + + if ( consoleLog.length == MAX_CONSOLE_LOG_SIZE && + consoleLog.writeHead != MAX_CONSOLE_LOG_SIZE ) + { + fwrite( consoleLog.text + consoleLog.writeHead, MAX_CONSOLE_LOG_SIZE - consoleLog.writeHead, 1, fp ); + } + + fwrite( consoleLog.text, consoleLog.writeHead, 1, fp ); +} diff --git a/codemp/macosx/macosx_glimp.h b/shared/sys/con_passive.cpp old mode 100755 new mode 100644 similarity index 59% rename from codemp/macosx/macosx_glimp.h rename to shared/sys/con_passive.cpp index 8ae2fc18ac..a5ac6ae1f2 --- a/codemp/macosx/macosx_glimp.h +++ b/shared/sys/con_passive.cpp @@ -1,5 +1,3 @@ -#pragma once - /* =========================================================================== Copyright (C) 1999-2005 Id Software, Inc. @@ -17,23 +15,52 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with Foobar; if not, write to the Free Software +along with Quake III Arena source code; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA =========================================================================== */ -#include -#include -#include -#ifndef GL_EXT_abgr -#include -#endif - -// This can be defined to use the CGLMacro.h support which avoids looking up -// the current context. -//#define USE_CGLMACROS - -#ifdef USE_CGLMACROS -#include "macosx_local.h" -#define cgl_ctx glw_state._cgl_ctx -#include -#endif + +#include "qcommon/q_shared.h" +#include "sys_public.h" +#include + +/* +================== +CON_Shutdown +================== +*/ +void CON_Shutdown( void ) +{ +} + +/* +================== +CON_Init +================== +*/ +void CON_Init( void ) +{ +} + +/* +================== +CON_Input +================== +*/ +char *CON_Input( void ) +{ + return NULL; +} + +/* +================== +CON_Print +================== +*/ +void CON_Print( const char *msg ) +{ + char cmsg[MAXPRINTMSG] = { 0 }; + Q_strncpyz( cmsg, msg, sizeof( cmsg ) ); + Q_StripColor( cmsg ); + printf( "%s", cmsg ); +} diff --git a/shared/sys/con_tty.cpp b/shared/sys/con_tty.cpp new file mode 100644 index 0000000000..812a7248d7 --- /dev/null +++ b/shared/sys/con_tty.cpp @@ -0,0 +1,535 @@ +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Quake III Arena source code is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Quake III Arena source code; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "qcommon/q_shared.h" +#include "qcommon/qcommon.h" +#include "sys_local.h" +#include "con_local.h" + +#include +#include +#include +#include +#include + +/* +============================================================= +tty console routines + +NOTE: if the user is editing a line when something gets printed to the early +console then it won't look good so we provide CON_Hide and CON_Show to be +called before and after a stdout or stderr output +============================================================= +*/ + +extern qboolean stdinIsATTY; +static qboolean stdin_active; +// general flag to tell about tty console mode +static qboolean ttycon_on = qfalse; +static int ttycon_hide = 0; +static int ttycon_show_overdue = 0; + +// some key codes that the terminal may be using, initialised on start up +static int TTY_erase; +static int TTY_eof; + +static struct termios TTY_tc; + +static field_t TTY_con; + +// This is somewhat of aduplicate of the graphical console history +// but it's safer more modular to have our own here +#define CON_HISTORY 32 +static field_t ttyEditLines[ CON_HISTORY ]; +static int hist_current = -1, hist_count = 0; + +#ifndef DEDICATED +// Don't use "]" as it would be the same as in-game console, +// this makes it clear where input came from. +#define TTY_CONSOLE_PROMPT "tty]" +#else +#define TTY_CONSOLE_PROMPT "]" +#endif + +/* +================== +CON_FlushIn + +Flush stdin, I suspect some terminals are sending a LOT of shit +FIXME relevant? +================== +*/ +static void CON_FlushIn( void ) +{ + char key; + while (read(STDIN_FILENO, &key, 1)!=-1); +} + +/* +================== +CON_Back + +Output a backspace + +NOTE: it seems on some terminals just sending '\b' is not enough so instead we +send "\b \b" +(FIXME there may be a way to find out if '\b' alone would work though) +================== +*/ +static void CON_Back( void ) +{ + char key; + size_t UNUSED_VAR size; + + key = '\b'; + size = write(STDOUT_FILENO, &key, 1); + key = ' '; + size = write(STDOUT_FILENO, &key, 1); + key = '\b'; + size = write(STDOUT_FILENO, &key, 1); +} + +/* +================== +CON_Hide + +Clear the display of the line currently edited +bring cursor back to beginning of line +================== +*/ +static void CON_Hide( void ) +{ + if( ttycon_on ) + { + int i; + if (ttycon_hide) + { + ttycon_hide++; + return; + } + if (TTY_con.cursor>0) + { + for (i=0; i 0; i--) { + CON_Back(); + } + ttycon_hide++; + } +} + +/* +================== +CON_Show + +Show the current line +FIXME need to position the cursor if needed? +================== +*/ +static void CON_Show( void ) +{ + if( ttycon_on ) + { + int i; + + assert(ttycon_hide>0); + ttycon_hide--; + if (ttycon_hide == 0) + { + size_t UNUSED_VAR size; + size = write(STDOUT_FILENO, TTY_CONSOLE_PROMPT, strlen(TTY_CONSOLE_PROMPT)); + if (TTY_con.cursor) + { + for (i=0; icursor) + return; + + assert(hist_count <= CON_HISTORY); + assert(hist_count >= 0); + assert(hist_current >= -1); + assert(hist_current <= hist_count); + // make some room + for (i=CON_HISTORY-1; i>0; i--) + { + ttyEditLines[i] = ttyEditLines[i-1]; + } + ttyEditLines[0] = *field; + if (hist_count= 0); + assert(hist_current >= -1); + assert(hist_current <= hist_count); + hist_prev = hist_current + 1; + if (hist_prev >= hist_count) + { + return NULL; + } + hist_current++; + return &(ttyEditLines[hist_current]); +} + +/* +================== +Hist_Next +================== +*/ +field_t *Hist_Next( void ) +{ + assert(hist_count <= CON_HISTORY); + assert(hist_count >= 0); + assert(hist_current >= -1); + assert(hist_current <= hist_count); + if (hist_current >= 0) + { + hist_current--; + } + if (hist_current == -1) + { + return NULL; + } + return &(ttyEditLines[hist_current]); +} + +/* +================== +CON_SigCont +Reinitialize console input after receiving SIGCONT, as on Linux the terminal seems to lose all +set attributes if user did CTRL+Z and then does fg again. +================== +*/ + +void CON_SigCont(int signum) +{ + CON_Init(); +} + +/* +================== +CON_Init + +Initialize the console input (tty mode if possible) +================== +*/ +void CON_Init( void ) +{ + struct termios tc; + + // If the process is backgrounded (running non interactively) + // then SIGTTIN or SIGTOU is emitted, if not caught, turns into a SIGSTP + signal(SIGTTIN, SIG_IGN); + signal(SIGTTOU, SIG_IGN); + + // If SIGCONT is received, reinitialize console + signal(SIGCONT, CON_SigCont); + + // Make stdin reads non-blocking + fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL, 0) | O_NONBLOCK ); + + if (!stdinIsATTY) + { + Com_Printf("tty console mode disabled\n"); + ttycon_on = qfalse; + stdin_active = qtrue; + return; + } + + Field_Clear(&TTY_con); + tcgetattr (STDIN_FILENO, &TTY_tc); + TTY_erase = TTY_tc.c_cc[VERASE]; + TTY_eof = TTY_tc.c_cc[VEOF]; + tc = TTY_tc; + + /* + ECHO: don't echo input characters + ICANON: enable canonical mode. This enables the special + characters EOF, EOL, EOL2, ERASE, KILL, REPRINT, + STATUS, and WERASE, and buffers by lines. + ISIG: when any of the characters INTR, QUIT, SUSP, or + DSUSP are received, generate the corresponding signal + */ + tc.c_lflag &= ~(ECHO | ICANON); + + /* + ISTRIP strip off bit 8 + INPCK enable input parity checking + */ + tc.c_iflag &= ~(ISTRIP | INPCK); + tc.c_cc[VMIN] = 1; + tc.c_cc[VTIME] = 0; + tcsetattr (STDIN_FILENO, TCSADRAIN, &tc); + ttycon_on = qtrue; + ttycon_hide = 1; // Mark as hidden, so prompt is shown in CON_Show + CON_Show(); +} + +/* +================== +CON_Input +================== +*/ +char *CON_Input( void ) +{ + // we use this when sending back commands + static char text[MAX_EDIT_LINE]; + int avail; + char key; + field_t *history; + size_t UNUSED_VAR size; + + if(ttycon_on) + { + avail = read(STDIN_FILENO, &key, 1); + if (avail != -1) + { + // we have something + // backspace? + // NOTE TTimo testing a lot of values .. seems it's the only way to get it to work everywhere + if ((key == TTY_erase) || (key == 127) || (key == 8)) + { + if (TTY_con.cursor > 0) + { + TTY_con.cursor--; + TTY_con.buffer[TTY_con.cursor] = '\0'; + CON_Back(); + } + return NULL; + } + // check if this is a control char + if ((key) && (key) < ' ') + { + if (key == '\n') + { +#ifndef DEDICATED + if (TTY_con.buffer[0] == '/' || TTY_con.buffer[0] == '\\') { + Q_strncpyz(text, TTY_con.buffer + 1, sizeof(text)); + } else if (TTY_con.cursor) { + Q_strncpyz(text, TTY_con.buffer, sizeof(text)); + } else { + text[0] = '\0'; + } + + // push it in history + Hist_Add(&TTY_con); + CON_Hide(); + Com_Printf("%s%s\n", TTY_CONSOLE_PROMPT, TTY_con.buffer); + Field_Clear(&TTY_con); + CON_Show(); +#else + // push it in history + Hist_Add(&TTY_con); + Q_strncpyz(text, TTY_con.buffer, sizeof(text)); + Field_Clear(&TTY_con); + key = '\n'; + size = write(STDOUT_FILENO, &key, 1); + size = write(STDOUT_FILENO, TTY_CONSOLE_PROMPT, strlen(TTY_CONSOLE_PROMPT)); +#endif + return text; + } + if (key == '\t') + { + CON_Hide(); + Field_AutoComplete( &TTY_con ); + CON_Show(); + return NULL; + } + avail = read(STDIN_FILENO, &key, 1); + if (avail != -1) + { + // VT 100 keys + if (key == '[' || key == 'O') + { + avail = read(STDIN_FILENO, &key, 1); + if (avail != -1) + { + switch (key) + { + case 'A': + history = Hist_Prev(); + if (history) + { + CON_Hide(); + TTY_con = *history; + CON_Show(); + } + CON_FlushIn(); + return NULL; + break; + case 'B': + history = Hist_Next(); + CON_Hide(); + if (history) + { + TTY_con = *history; + } else + { + Field_Clear(&TTY_con); + } + CON_Show(); + CON_FlushIn(); + return NULL; + break; + case 'C': + return NULL; + case 'D': + return NULL; + } + } + } + } + Com_DPrintf("droping ISCTL sequence: %d, TTY_erase: %d\n", key, TTY_erase); + CON_FlushIn(); + return NULL; + } + if (TTY_con.cursor >= (int)sizeof(text) - 1) + return NULL; + // push regular character + TTY_con.buffer[TTY_con.cursor] = key; + TTY_con.cursor++; // next char will always be '\0' + // print the current line (this is differential) + size = write(STDOUT_FILENO, &key, 1); + } + + return NULL; + } + else if (stdin_active) + { + int len; + fd_set fdset; + struct timeval timeout; + + FD_ZERO(&fdset); + FD_SET(STDIN_FILENO, &fdset); // stdin + timeout.tv_sec = 0; + timeout.tv_usec = 0; + if(select (STDIN_FILENO + 1, &fdset, NULL, NULL, &timeout) == -1 || !FD_ISSET(STDIN_FILENO, &fdset)) + return NULL; + + len = read(STDIN_FILENO, text, sizeof(text)); + if (len == 0) + { // eof! + stdin_active = qfalse; + return NULL; + } + + if (len < 1) + return NULL; + text[len-1] = 0; // rip off the /n and terminate + + return text; + } + return NULL; +} + +/* +================== +CON_Print +================== +*/ +void CON_Print( const char *msg ) +{ + if (!msg[0]) + return; + + CON_Hide( ); + + if( com_ansiColor && com_ansiColor->integer ) + Sys_AnsiColorPrint( msg ); + else + fputs( msg, stderr ); + + if (!ttycon_on) { + // CON_Hide didn't do anything. + return; + } + + // Only print prompt when msg ends with a newline, otherwise the console + // might get garbled when output does not fit on one line. + if (msg[strlen(msg) - 1] == '\n') { + CON_Show(); + + // Run CON_Show the number of times it was deferred. + while (ttycon_show_overdue > 0) { + CON_Show(); + ttycon_show_overdue--; + } + } + else + { + // Defer calling CON_Show + ttycon_show_overdue++; + } +} diff --git a/shared/sys/con_win32.cpp b/shared/sys/con_win32.cpp new file mode 100644 index 0000000000..7b38aae367 --- /dev/null +++ b/shared/sys/con_win32.cpp @@ -0,0 +1,555 @@ +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Quake III Arena source code is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Quake III Arena source code; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "qcommon/q_shared.h" +#include "qcommon/qcommon.h" +#include "sys_local.h" +#include "con_local.h" +#include + +#define QCONSOLE_HISTORY 32 + +static WORD qconsole_attrib; +static WORD qconsole_backgroundAttrib; + +// saved console status +static DWORD qconsole_orig_mode; +static CONSOLE_CURSOR_INFO qconsole_orig_cursorinfo; + +// cmd history +static char qconsole_history[ QCONSOLE_HISTORY ][ MAX_EDIT_LINE ]; +static int qconsole_history_pos = -1; +static int qconsole_history_lines = 0; +static int qconsole_history_oldest = 0; + +// current edit buffer +static char qconsole_line[ MAX_EDIT_LINE ]; +static int qconsole_linelen = 0; +static bool qconsole_drawinput = true; +static int qconsole_cursor; + +static HANDLE qconsole_hout; +static HANDLE qconsole_hin; + +/* +================== +CON_ColorCharToAttrib + +Convert Quake color character to Windows text attrib +================== +*/ +static WORD CON_ColorCharToAttrib( char color ) { + WORD attrib; + + if ( color == COLOR_WHITE ) + { + // use console's foreground and background colors + attrib = qconsole_attrib; + } + else + { + float *rgba = g_color_table[ ColorIndex( color ) ]; + + // set foreground color + attrib = ( rgba[0] >= 0.5 ? FOREGROUND_RED : 0 ) | + ( rgba[1] >= 0.5 ? FOREGROUND_GREEN : 0 ) | + ( rgba[2] >= 0.5 ? FOREGROUND_BLUE : 0 ) | + ( rgba[3] >= 0.5 ? FOREGROUND_INTENSITY : 0 ); + + // use console's background color + attrib |= qconsole_backgroundAttrib; + } + + return attrib; +} + +/* +================== +CON_CtrlHandler + +The Windows Console doesn't use signals for terminating the application +with Ctrl-C, logging off, window closing, etc. Instead it uses a special +handler routine. Fortunately, the values for Ctrl signals don't seem to +overlap with true signal codes that Windows provides, so calling +Sys_SigHandler() with those numbers should be safe for generating unique +shutdown messages. +================== +*/ +static BOOL WINAPI CON_CtrlHandler( DWORD sig ) +{ + Sys_SigHandler( sig ); + return TRUE; +} + +/* +================== +CON_HistAdd +================== +*/ +static void CON_HistAdd( void ) +{ + Q_strncpyz( qconsole_history[ qconsole_history_oldest ], qconsole_line, + sizeof( qconsole_history[ qconsole_history_oldest ] ) ); + + if( qconsole_history_lines < QCONSOLE_HISTORY ) + qconsole_history_lines++; + + if( qconsole_history_oldest >= QCONSOLE_HISTORY - 1 ) + qconsole_history_oldest = 0; + else + qconsole_history_oldest++; + + qconsole_history_pos = qconsole_history_oldest; +} + +/* +================== +CON_HistPrev +================== +*/ +static void CON_HistPrev( void ) +{ + int pos; + + pos = ( qconsole_history_pos < 1 ) ? ( QCONSOLE_HISTORY - 1 ) : ( qconsole_history_pos - 1 ); + + // don' t allow looping through history + if( pos == qconsole_history_oldest || pos >= qconsole_history_lines ) + return; + + qconsole_history_pos = pos; + Q_strncpyz( qconsole_line, qconsole_history[ qconsole_history_pos ], sizeof( qconsole_line ) ); + qconsole_linelen = strlen( qconsole_line ); + qconsole_cursor = qconsole_linelen; +} + +/* +================== +CON_HistNext +================== +*/ +static void CON_HistNext( void ) +{ + int pos; + + // don' t allow looping through history + if( qconsole_history_pos == qconsole_history_oldest ) + return; + + pos = ( qconsole_history_pos >= QCONSOLE_HISTORY - 1 ) ? 0 : ( qconsole_history_pos + 1 ); + + // clear the edit buffer if they try to advance to a future command + if( pos == qconsole_history_oldest ) + { + qconsole_history_pos = pos; + qconsole_line[ 0 ] = '\0'; + qconsole_linelen = 0; + qconsole_cursor = qconsole_linelen; + return; + } + + qconsole_history_pos = pos; + Q_strncpyz( qconsole_line, qconsole_history[ qconsole_history_pos ], sizeof( qconsole_line ) ); + qconsole_linelen = strlen( qconsole_line ); + qconsole_cursor = qconsole_linelen; +} + + +/* +================== +CON_Show +================== +*/ +static void CON_Show( void ) +{ + CONSOLE_SCREEN_BUFFER_INFO binfo; + COORD writeSize = { MAX_EDIT_LINE, 1 }; + COORD writePos = { 0, 0 }; + SMALL_RECT writeArea = { 0, 0, 0, 0 }; + COORD cursorPos; + int i; + CHAR_INFO line[ MAX_EDIT_LINE ]; + WORD attrib; + + GetConsoleScreenBufferInfo( qconsole_hout, &binfo ); + + // if we're in the middle of printf, don't bother writing the buffer + if( !qconsole_drawinput ) + return; + + writeArea.Left = 0; + writeArea.Top = binfo.dwCursorPosition.Y; + writeArea.Bottom = binfo.dwCursorPosition.Y; + writeArea.Right = MAX_EDIT_LINE; + + // set color to white + attrib = CON_ColorCharToAttrib( COLOR_WHITE ); + + // build a space-padded CHAR_INFO array + for( i = 0; i < MAX_EDIT_LINE; i++ ) + { + if( i < qconsole_linelen ) + { + if( i + 1 < qconsole_linelen && Q_IsColorString( qconsole_line + i ) ) + attrib = CON_ColorCharToAttrib( *( qconsole_line + i + 1 ) ); + + line[ i ].Char.AsciiChar = qconsole_line[ i ]; + } + else + line[ i ].Char.AsciiChar = ' '; + + line[ i ].Attributes = attrib; + } + + if( qconsole_linelen > binfo.srWindow.Right ) + { + WriteConsoleOutput( qconsole_hout, + line + (qconsole_linelen - binfo.srWindow.Right ), + writeSize, writePos, &writeArea ); + } + else + { + WriteConsoleOutput( qconsole_hout, line, writeSize, + writePos, &writeArea ); + } + + // set curor position + cursorPos.Y = binfo.dwCursorPosition.Y; + cursorPos.X = qconsole_cursor < qconsole_linelen + ? qconsole_cursor + : qconsole_linelen > binfo.srWindow.Right + ? binfo.srWindow.Right + : qconsole_linelen; + + SetConsoleCursorPosition( qconsole_hout, cursorPos ); +} + +/* +================== +CON_Hide +================== +*/ +static void CON_Hide( void ) +{ + int realLen; + + realLen = qconsole_linelen; + + // remove input line from console output buffer + qconsole_linelen = 0; + CON_Show( ); + + qconsole_linelen = realLen; +} + + +/* +================== +CON_Shutdown +================== +*/ +void CON_Shutdown( void ) +{ + CON_Hide( ); + SetConsoleMode( qconsole_hin, qconsole_orig_mode ); + SetConsoleCursorInfo( qconsole_hout, &qconsole_orig_cursorinfo ); + SetConsoleTextAttribute( qconsole_hout, qconsole_attrib ); + CloseHandle( qconsole_hout ); + CloseHandle( qconsole_hin ); +} + +/* +================== +CON_Init +================== +*/ +void CON_Init( void ) +{ + CONSOLE_SCREEN_BUFFER_INFO info; + int i; + + // handle Ctrl-C or other console termination + SetConsoleCtrlHandler( CON_CtrlHandler, TRUE ); + + qconsole_hin = GetStdHandle( STD_INPUT_HANDLE ); + if( qconsole_hin == INVALID_HANDLE_VALUE ) + return; + + qconsole_hout = GetStdHandle( STD_OUTPUT_HANDLE ); + if( qconsole_hout == INVALID_HANDLE_VALUE ) + return; + + GetConsoleMode( qconsole_hin, &qconsole_orig_mode ); + + // allow mouse wheel scrolling + SetConsoleMode( qconsole_hin, qconsole_orig_mode & ~ENABLE_MOUSE_INPUT ); + + FlushConsoleInputBuffer( qconsole_hin ); + + GetConsoleScreenBufferInfo( qconsole_hout, &info ); + qconsole_attrib = info.wAttributes; + qconsole_backgroundAttrib = qconsole_attrib & (BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY); + + SetConsoleTitle(CLIENT_WINDOW_TITLE " Dedicated Server Console"); + + // initialize history + for( i = 0; i < QCONSOLE_HISTORY; i++ ) + qconsole_history[ i ][ 0 ] = '\0'; + + // set text color to white + SetConsoleTextAttribute( qconsole_hout, CON_ColorCharToAttrib( COLOR_WHITE ) ); +} + +/* +================== +CON_Input +================== +*/ +char *CON_Input( void ) +{ + INPUT_RECORD buff[ MAX_EDIT_LINE ]; + DWORD count = 0, events = 0; + WORD key = 0; + int i; + int newlinepos = -1; + + if( !GetNumberOfConsoleInputEvents( qconsole_hin, &events ) ) + return NULL; + + if( events < 1 ) + return NULL; + + // if we have overflowed, start dropping oldest input events + if( events >= MAX_EDIT_LINE ) + { + ReadConsoleInput( qconsole_hin, buff, 1, &events ); + return NULL; + } + + if( !ReadConsoleInput( qconsole_hin, buff, events, &count ) ) + return NULL; + + FlushConsoleInputBuffer( qconsole_hin ); + + for( i = 0; i < count; i++ ) + { + if( buff[ i ].EventType != KEY_EVENT ) + continue; + if( !buff[ i ].Event.KeyEvent.bKeyDown ) + continue; + + key = buff[ i ].Event.KeyEvent.wVirtualKeyCode; + + bool keyHandled = true; + switch ( key ) + { + case VK_RETURN: + newlinepos = i; + qconsole_cursor = 0; + break; + + case VK_UP: + CON_HistPrev(); + break; + + case VK_DOWN: + CON_HistNext(); + break; + + case VK_LEFT: + qconsole_cursor--; + if ( qconsole_cursor < 0 ) + { + qconsole_cursor = 0; + } + break; + + case VK_RIGHT: + qconsole_cursor++; + if ( qconsole_cursor > qconsole_linelen ) + { + qconsole_cursor = qconsole_linelen; + } + break; + + case VK_HOME: + qconsole_cursor = 0; + break; + + case VK_END: + qconsole_cursor = qconsole_linelen; + break; + + case VK_TAB: + { + field_t f; + + Q_strncpyz( f.buffer, qconsole_line, sizeof( f.buffer ) ); + Field_AutoComplete( &f ); + Q_strncpyz( qconsole_line, f.buffer, sizeof( qconsole_line ) ); + qconsole_linelen = strlen( qconsole_line ); + qconsole_cursor = qconsole_linelen; + + break; + } + + default: + keyHandled = false; + break; + } + + if ( keyHandled ) + { + break; + } + + if( qconsole_linelen < sizeof( qconsole_line ) - 1 ) + { + char c = buff[ i ].Event.KeyEvent.uChar.AsciiChar; + + if( key == VK_BACK ) + { + if ( qconsole_cursor > 0 ) + { + int newlen = ( qconsole_linelen > 0 ) ? qconsole_linelen - 1 : 0; + if ( qconsole_cursor < qconsole_linelen ) + { + memmove( qconsole_line + qconsole_cursor - 1, + qconsole_line + qconsole_cursor, + qconsole_linelen - qconsole_cursor ); + } + + qconsole_line[ newlen ] = '\0'; + qconsole_linelen = newlen; + qconsole_cursor--; + } + } + else if( c ) + { + if ( qconsole_linelen > qconsole_cursor ) + { + memmove( qconsole_line + qconsole_cursor + 1, + qconsole_line + qconsole_cursor, + qconsole_linelen - qconsole_cursor ); + } + + qconsole_line[ qconsole_cursor++ ] = c; + + qconsole_linelen++; + qconsole_line[ qconsole_linelen ] = '\0'; + } + } + } + + if( newlinepos < 0) { + CON_Show(); + return NULL; + } + + if( !qconsole_linelen ) + { + CON_Show(); + Com_Printf( "\n" ); + return NULL; + } + + qconsole_linelen = 0; + CON_Show(); + + CON_HistAdd(); + Com_Printf( "%s\n", qconsole_line ); + + return qconsole_line; +} + +/* +================= +CON_WindowsColorPrint + +Set text colors based on Q3 color codes +================= +*/ +void CON_WindowsColorPrint( const char *msg ) +{ + static char buffer[ MAXPRINTMSG ]; + int length = 0; + + while( *msg ) + { + qconsole_drawinput = ( *msg == '\n' ); + + if( Q_IsColorString( msg ) || *msg == '\n' ) + { + // First empty the buffer + if( length > 0 ) + { + buffer[ length ] = '\0'; + fputs( buffer, stderr ); + length = 0; + } + + if( *msg == '\n' ) + { + // Reset color and then add the newline + SetConsoleTextAttribute( qconsole_hout, CON_ColorCharToAttrib( COLOR_WHITE ) ); + fputs( "\n", stderr ); + msg++; + } + else + { + // Set the color + SetConsoleTextAttribute( qconsole_hout, CON_ColorCharToAttrib( *( msg + 1 ) ) ); + msg += 2; + } + } + else + { + if( length >= MAXPRINTMSG - 1 ) + break; + + buffer[ length ] = *msg; + length++; + msg++; + } + } + + // Empty anything still left in the buffer + if( length > 0 ) + { + buffer[ length ] = '\0'; + fputs( buffer, stderr ); + } +} + +/* +================== +CON_Print +================== +*/ +void CON_Print( const char *msg ) +{ + CON_Hide( ); + + CON_WindowsColorPrint( msg ); + + CON_Show( ); +} diff --git a/shared/sys/snapvector.cpp b/shared/sys/snapvector.cpp new file mode 100644 index 0000000000..2c547615b5 --- /dev/null +++ b/shared/sys/snapvector.cpp @@ -0,0 +1,65 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#include +#if _MSC_VER +# include +# pragma fenv_access (on) +#else +# include +#endif + +#if _MSC_VER +static inline float roundfloat(float n) +{ + return (n < 0.0f) ? ceilf(n - 0.5f) : floorf(n + 0.5f); +} +#endif + +extern "C" +void Sys_SnapVector(float *v) +{ +#if _MSC_VER + unsigned int oldcontrol; + unsigned int newcontrol; + + _controlfp_s(&oldcontrol, 0, 0); + _controlfp_s(&newcontrol, _RC_NEAR, _MCW_RC); + + v[0] = roundfloat(v[0]); + v[1] = roundfloat(v[1]); + v[2] = roundfloat(v[2]); + + _controlfp_s(&newcontrol, oldcontrol, _MCW_RC); +#else + // pure C99 + int oldround = fegetround(); + fesetround(FE_TONEAREST); + + v[0] = nearbyintf(v[0]); + v[1] = nearbyintf(v[1]); + v[2] = nearbyintf(v[2]); + + fesetround(oldround); +#endif +} diff --git a/shared/sys/sys_event.cpp b/shared/sys/sys_event.cpp new file mode 100644 index 0000000000..2f03bd2fea --- /dev/null +++ b/shared/sys/sys_event.cpp @@ -0,0 +1,137 @@ +/* +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#include "qcommon/qcommon.h" +#include "sys_local.h" +#include "sys_public.h" + +/* +======================================================================== + +EVENT LOOP + +======================================================================== +*/ + +#define MAX_QUED_EVENTS 256 +#define MASK_QUED_EVENTS ( MAX_QUED_EVENTS - 1 ) + +static sysEvent_t eventQue[MAX_QUED_EVENTS] = {}; +static int eventHead = 0, eventTail = 0; +#if !defined(_JK2EXE) +static byte sys_packetReceived[MAX_MSGLEN] = {}; +#endif + +sysEvent_t Sys_GetEvent( void ) { + sysEvent_t ev; + char *s; +#if !defined(_JK2EXE) + netadr_t adr; + msg_t netmsg; +#endif + + // return if we have data + if ( eventHead > eventTail ) { + eventTail++; + return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ]; + } + + // check for console commands + s = Sys_ConsoleInput(); + if ( s ) { + char *b; + int len; + + len = strlen( s ) + 1; + b = (char *)Z_Malloc( len,TAG_EVENT,qfalse ); + strcpy( b, s ); + Sys_QueEvent( 0, SE_CONSOLE, 0, 0, len, b ); + } + +#if !defined(_JK2EXE) + // check for network packets + MSG_Init( &netmsg, sys_packetReceived, sizeof( sys_packetReceived ) ); + if ( Sys_GetPacket ( &adr, &netmsg ) ) { + netadr_t *buf; + int len; + + // copy out to a seperate buffer for qeueing + len = sizeof( netadr_t ) + netmsg.cursize; + buf = (netadr_t *)Z_Malloc( len,TAG_EVENT,qfalse ); + *buf = adr; + memcpy( buf+1, netmsg.data, netmsg.cursize ); + Sys_QueEvent( 0, SE_PACKET, 0, 0, len, buf ); + } +#endif + + // return if we have data + if ( eventHead > eventTail ) { + eventTail++; + return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ]; + } + + // create an empty event to return + + memset( &ev, 0, sizeof( ev ) ); + ev.evTime = Sys_Milliseconds(); + + return ev; +} + +/* +================ +Sys_QueEvent + +A time of 0 will get the current time +Ptr should either be null, or point to a block of data that can +be freed by the game later. +================ +*/ +void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptrLength, void *ptr ) { + sysEvent_t *ev; + + ev = &eventQue[ eventHead & MASK_QUED_EVENTS ]; + + if ( eventHead - eventTail >= MAX_QUED_EVENTS ) { + Com_Printf("Sys_QueEvent: overflow (event type %i)\n", type); + // we are discarding an event, but don't leak memory + if ( ev->evPtr ) { + Z_Free( ev->evPtr ); + } + eventTail++; + } + + eventHead++; + + if ( time == 0 ) { + time = Sys_Milliseconds(); + } + + ev->evTime = time; + ev->evType = type; + ev->evValue = value; + ev->evValue2 = value2; + ev->evPtrLength = ptrLength; + ev->evPtr = ptr; +} diff --git a/shared/sys/sys_loadlib.h b/shared/sys/sys_loadlib.h new file mode 100644 index 0000000000..97d2ef4f74 --- /dev/null +++ b/shared/sys/sys_loadlib.h @@ -0,0 +1,47 @@ +/* +=========================================================================== +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#pragma once + +#ifdef DEDICATED +# ifdef _WIN32 +# include +# define Sys_LoadLibrary(f) (void*)LoadLibrary(f) +# define Sys_UnloadLibrary(h) FreeLibrary((HMODULE)h) +# define Sys_LoadFunction(h,fn) (void*)GetProcAddress((HMODULE)h,fn) +# define Sys_LibraryError() "unknown" +# else +# include +# define Sys_LoadLibrary(f) dlopen(f,RTLD_NOW) +# define Sys_UnloadLibrary(h) dlclose(h) +# define Sys_LoadFunction(h,fn) dlsym(h,fn) +# define Sys_LibraryError() dlerror() +# endif +#else +# include +# include +# define Sys_LoadLibrary(f) SDL_LoadObject(f) +# define Sys_UnloadLibrary(h) SDL_UnloadObject(h) +# define Sys_LoadFunction(h,fn) SDL_LoadFunction(h,fn) +# define Sys_LibraryError() SDL_GetError() +#endif + +void * QDECL Sys_LoadDll(const char *name, qboolean useSystemLib); diff --git a/shared/sys/sys_local.h b/shared/sys/sys_local.h new file mode 100644 index 0000000000..19f12af4be --- /dev/null +++ b/shared/sys/sys_local.h @@ -0,0 +1,41 @@ +/* +=========================================================================== +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#pragma once + +#include "qcommon/qcommon.h" + +void IN_Init( void *windowData ); +void IN_Frame( void ); +void IN_Shutdown( void ); +void IN_Restart( void ); + +void Sys_PlatformInit( void ); +void Sys_PlatformExit( void ); +qboolean Sys_GetPacket( netadr_t *net_from, msg_t *net_message ); +char *Sys_ConsoleInput( void ); +void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptrLength, void *ptr ); +void Sys_SigHandler( int signal ); +#ifndef _WIN32 +void Sys_AnsiColorPrint( const char *msg ); +#endif + +bool Sys_UnpackDLL( const char *name ); diff --git a/shared/sys/sys_main.cpp b/shared/sys/sys_main.cpp new file mode 100644 index 0000000000..f5a70e93a5 --- /dev/null +++ b/shared/sys/sys_main.cpp @@ -0,0 +1,748 @@ +/* +=========================================================================== +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#include +#include +#include +#include +#include +#define __STDC_FORMAT_MACROS +#include +#include "qcommon/qcommon.h" +#include "sys_local.h" +#include "sys_loadlib.h" +#include "sys_public.h" +#include "con_local.h" + +static char binaryPath[ MAX_OSPATH ] = { 0 }; +static char installPath[ MAX_OSPATH ] = { 0 }; + +#ifndef DEDICATED +cvar_t *com_minimized; +cvar_t *com_unfocused; +#endif + +/* +================= +Sys_SetBinaryPath +================= +*/ +void Sys_SetBinaryPath(const char *path) +{ + Q_strncpyz(binaryPath, path, sizeof(binaryPath)); +} + +/* +================= +Sys_BinaryPath +================= +*/ +char *Sys_BinaryPath(void) +{ + return binaryPath; +} + +/* +================= +Sys_SetDefaultInstallPath +================= +*/ +void Sys_SetDefaultInstallPath(const char *path) +{ + Q_strncpyz(installPath, path, sizeof(installPath)); +} + +/* +================= +Sys_DefaultInstallPath +================= +*/ +char *Sys_DefaultInstallPath(void) +{ + if (*installPath) + return installPath; + else + return Sys_Cwd(); +} + +/* +================= +Sys_DefaultAppPath +================= +*/ +char *Sys_DefaultAppPath(void) +{ + return Sys_BinaryPath(); +} + +/* +================== +Sys_GetClipboardData +================== +*/ +char *Sys_GetClipboardData( void ) { +#ifdef DEDICATED + return NULL; +#else + if ( !SDL_HasClipboardText() ) + return NULL; + + char *cbText = SDL_GetClipboardText(); + size_t len = strlen( cbText ) + 1; + + char *buf = (char *)Z_Malloc( len, TAG_CLIPBOARD ); + Q_strncpyz( buf, cbText, len ); + + SDL_free( cbText ); + return buf; +#endif +} + +/* +================= +Sys_ConsoleInput + +Handle new console input +================= +*/ +char *Sys_ConsoleInput(void) +{ + return CON_Input( ); +} + +void Sys_Print( const char *msg ) { + // TTimo - prefix for text that shows up in console but not in notify + // backported from RTCW + if ( !Q_strncmp( msg, "[skipnotify]", 12 ) ) { + msg += 12; + } + if ( msg[0] == '*' ) { + msg += 1; + } + ConsoleLogAppend( msg ); + CON_Print( msg ); +} + +/* +================ +Sys_Init + +Called after the common systems (cvars, files, etc) +are initialized +================ +*/ +void Sys_Init( void ) { + Cmd_AddCommand ("in_restart", IN_Restart); + Cvar_Get( "arch", OS_STRING " " ARCH_STRING, CVAR_ROM ); + Cvar_Get( "username", Sys_GetCurrentUser(), CVAR_ROM ); +#ifndef DEDICATED + com_unfocused = Cvar_Get( "com_unfocused", "0", CVAR_ROM ); + com_minimized = Cvar_Get( "com_minimized", "0", CVAR_ROM ); +#endif +} + +static void NORETURN Sys_Exit( int ex ) { + IN_Shutdown(); +#ifndef DEDICATED + SDL_Quit(); +#endif + + NET_Shutdown(); + + Sys_PlatformExit(); + + Com_ShutdownHunkMemory(); + Com_ShutdownZoneMemory(); + + CON_Shutdown(); + + exit( ex ); +} + +#if !defined(DEDICATED) +static void Sys_ErrorDialog( const char *error ) +{ + time_t rawtime; + char timeStr[32] = {}; // should really only reach ~19 chars + char crashLogPath[MAX_OSPATH]; + + time( &rawtime ); + strftime( timeStr, sizeof( timeStr ), "%Y-%m-%d_%H-%M-%S", localtime( &rawtime ) ); // or gmtime + Com_sprintf( crashLogPath, sizeof( crashLogPath ), + "%s%ccrashlog-%s.txt", + Sys_DefaultHomePath(), PATH_SEP, timeStr ); + + Sys_Mkdir( Sys_DefaultHomePath() ); + + FILE *fp = fopen( crashLogPath, "w" ); + if ( fp ) + { + ConsoleLogWriteOut( fp ); + fclose( fp ); + + const char *errorMessage = va( "%s\n\nThe crash log was written to %s", error, crashLogPath ); + if ( SDL_ShowSimpleMessageBox( SDL_MESSAGEBOX_ERROR, "Error", errorMessage, NULL ) < 0 ) + { + fprintf( stderr, "%s", errorMessage ); + } + } + else + { + // Getting pretty desperate now + ConsoleLogWriteOut( stderr ); + fflush( stderr ); + + const char *errorMessage = va( "%s\nCould not write the crash log file, but we printed it to stderr.\n" + "Try running the game using a command line interface.", error ); + if ( SDL_ShowSimpleMessageBox( SDL_MESSAGEBOX_ERROR, "Error", errorMessage, NULL ) < 0 ) + { + // We really have hit rock bottom here :( + fprintf( stderr, "%s", errorMessage ); + } + } +} +#endif + +void NORETURN QDECL Sys_Error( const char *error, ... ) +{ + va_list argptr; + char string[1024]; + + va_start (argptr,error); + Q_vsnprintf (string, sizeof(string), error, argptr); + va_end (argptr); + + Sys_Print( string ); + + // Only print Sys_ErrorDialog for client binary. The dedicated + // server binary is meant to be a command line program so you would + // expect to see the error printed. +#if !defined(DEDICATED) + Sys_ErrorDialog( string ); +#endif + + Sys_Exit( 3 ); +} + +void NORETURN Sys_Quit (void) { + Sys_Exit(0); +} + +/* +============ +Sys_FileTime + +returns -1 if not present +============ +*/ +time_t Sys_FileTime( const char *path ) +{ + struct stat buf; + + if ( stat( path, &buf ) == -1 ) + return -1; + + return buf.st_mtime; +} + +/* +================= +Sys_UnloadDll +================= +*/ +void Sys_UnloadDll( void *dllHandle ) +{ + if( !dllHandle ) + { + Com_Printf("Sys_UnloadDll(NULL)\n"); + return; + } + + Sys_UnloadLibrary(dllHandle); +} + +/* +================= +Sys_LoadDll + +First try to load library name from system library path, +from executable path, then fs_basepath. +================= +*/ +void *Sys_LoadDll( const char *name, qboolean useSystemLib ) +{ + void *dllhandle = NULL; + + if ( useSystemLib ) + { + Com_Printf( "Trying to load \"%s\"...\n", name ); + + dllhandle = Sys_LoadLibrary( name ); + if ( dllhandle ) + return dllhandle; + + Com_Printf( "%s(%s) failed: \"%s\"\n", __FUNCTION__, name, Sys_LibraryError() ); + } + + const char *binarypath = Sys_BinaryPath(); + const char *basepath = Cvar_VariableString( "fs_basepath" ); + + if ( !*binarypath ) + binarypath = "."; + + const char *searchPaths[] = { + binarypath, + basepath, + }; + const size_t numPaths = ARRAY_LEN( searchPaths ); + + for ( size_t i = 0; i < numPaths; i++ ) + { + const char *libDir = searchPaths[i]; + if ( !libDir[0] ) + continue; + + Com_Printf( "Trying to load \"%s\" from \"%s\"...\n", name, libDir ); + char *fn = va( "%s%c%s", libDir, PATH_SEP, name ); + dllhandle = Sys_LoadLibrary( fn ); + if ( dllhandle ) + return dllhandle; + + Com_Printf( "%s(%s) failed: \"%s\"\n", __FUNCTION__, fn, Sys_LibraryError() ); + } + return NULL; +} + +#if defined(MACOS_X) && !defined(_JK2EXE) +void *Sys_LoadMachOBundle( const char *name ) +{ + if ( !FS_LoadMachOBundle(name) ) + return NULL; + + char *homepath = Cvar_VariableString( "fs_homepath" ); + char *gamedir = Cvar_VariableString( "fs_game" ); + char dllName[MAX_QPATH]; + + Com_sprintf( dllName, sizeof(dllName), "%s_pk3" DLL_EXT, name ); + + //load the unzipped library + char *fn = FS_BuildOSPath( homepath, gamedir, dllName ); + + void *libHandle = Sys_LoadLibrary( fn ); + + if ( libHandle != NULL ) { + Com_Printf( "Loaded pk3 bundle %s.\n", name ); + } + + return libHandle; +} +#endif + +enum SearchPathFlag +{ + SEARCH_PATH_MOD = 1 << 0, + SEARCH_PATH_BASE = 1 << 1, + SEARCH_PATH_OPENJK = 1 << 2, + SEARCH_PATH_ROOT = 1 << 3 +}; + +static void *Sys_LoadDllFromPaths( const char *filename, const char *gamedir, const char **searchPaths, + size_t numPaths, uint32_t searchFlags, const char *callerName ) +{ + char *fn; + void *libHandle; + + if ( searchFlags & SEARCH_PATH_MOD ) + { + for ( size_t i = 0; i < numPaths; i++ ) + { + const char *libDir = searchPaths[i]; + if ( !libDir[0] ) + continue; + + fn = FS_BuildOSPath( libDir, gamedir, filename ); + libHandle = Sys_LoadLibrary( fn ); + if ( libHandle ) + return libHandle; + + Com_Printf( "%s(%s) failed: \"%s\"\n", callerName, fn, Sys_LibraryError() ); + } + } + + if ( searchFlags & SEARCH_PATH_BASE ) + { + for ( size_t i = 0; i < numPaths; i++ ) + { + const char *libDir = searchPaths[i]; + if ( !libDir[0] ) + continue; + + fn = FS_BuildOSPath( libDir, BASEGAME, filename ); + libHandle = Sys_LoadLibrary( fn ); + if ( libHandle ) + return libHandle; + + Com_Printf( "%s(%s) failed: \"%s\"\n", callerName, fn, Sys_LibraryError() ); + } + } + + if ( searchFlags & SEARCH_PATH_OPENJK ) + { + for ( size_t i = 0; i < numPaths; i++ ) + { + const char *libDir = searchPaths[i]; + if ( !libDir[0] ) + continue; + + fn = FS_BuildOSPath( libDir, OPENJKGAME, filename ); + libHandle = Sys_LoadLibrary( fn ); + if ( libHandle ) + return libHandle; + + Com_Printf( "%s(%s) failed: \"%s\"\n", callerName, fn, Sys_LibraryError() ); + } + } + + if ( searchFlags & SEARCH_PATH_ROOT ) + { + for ( size_t i = 0; i < numPaths; i++ ) + { + const char *libDir = searchPaths[i]; + if ( !libDir[0] ) + continue; + + fn = va( "%s%c%s", libDir, PATH_SEP, filename ); + libHandle = Sys_LoadLibrary( fn ); + if ( libHandle ) + return libHandle; + + Com_Printf( "%s(%s) failed: \"%s\"\n", callerName, fn, Sys_LibraryError() ); + } + } + + return NULL; +} + +void *Sys_LoadLegacyGameDll( const char *name, VMMainProc **vmMain, SystemCallProc *systemcalls ) +{ + void *libHandle = NULL; + char filename[MAX_OSPATH]; + + Com_sprintf (filename, sizeof(filename), "%s" ARCH_STRING DLL_EXT, name); + + if (!Sys_UnpackDLL(filename)) + { + Com_DPrintf( "Sys_LoadLegacyGameDll: Failed to unpack %s from PK3.\n", filename ); + return NULL; + } + +#if defined(MACOS_X) && !defined(_JK2EXE) + //First, look for the old-style mac .bundle that's inside a pk3 + //It's actually zipped, and the zipfile has the same name as 'name' + libHandle = Sys_LoadMachOBundle( name ); +#endif + + if (!libHandle) { + char *basepath = Cvar_VariableString( "fs_basepath" ); + char *homepath = Cvar_VariableString( "fs_homepath" ); + char *cdpath = Cvar_VariableString( "fs_cdpath" ); + char *gamedir = Cvar_VariableString( "fs_game" ); +#ifdef MACOS_X + char *apppath = Cvar_VariableString( "fs_apppath" ); +#endif + + const char *searchPaths[] = { + homepath, +#ifdef MACOS_X + apppath, +#endif + basepath, + cdpath, + }; + size_t numPaths = ARRAY_LEN( searchPaths ); + + libHandle = Sys_LoadDllFromPaths( filename, gamedir, searchPaths, numPaths, SEARCH_PATH_BASE | SEARCH_PATH_MOD, __FUNCTION__ ); + if ( !libHandle ) + return NULL; + } + + typedef void QDECL DllEntryProc( SystemCallProc *syscallptr ); + + DllEntryProc *dllEntry = (DllEntryProc *)Sys_LoadFunction( libHandle, "dllEntry" ); + *vmMain = (VMMainProc *)Sys_LoadFunction( libHandle, "vmMain" ); + + if ( !*vmMain || !dllEntry ) { + Com_DPrintf ( "Sys_LoadLegacyGameDll(%s) failed to find vmMain function:\n...%s!\n", name, Sys_LibraryError() ); + Sys_UnloadLibrary( libHandle ); + return NULL; + } + + Com_DPrintf ( "Sys_LoadLegacyGameDll(%s) found vmMain function at 0x%" PRIxPTR "\n", name, *vmMain ); + dllEntry( systemcalls ); + + return libHandle; +} + +void *Sys_LoadSPGameDll( const char *name, GetGameAPIProc **GetGameAPI ) +{ + void *libHandle = NULL; + char filename[MAX_OSPATH]; + + assert( GetGameAPI ); + + Com_sprintf (filename, sizeof(filename), "%s" ARCH_STRING DLL_EXT, name); + +#if defined(MACOS_X) && !defined(_JK2EXE) + //First, look for the old-style mac .bundle that's inside a pk3 + //It's actually zipped, and the zipfile has the same name as 'name' + libHandle = Sys_LoadMachOBundle( name ); +#endif + + if (!libHandle) { + char *basepath = Cvar_VariableString( "fs_basepath" ); + char *homepath = Cvar_VariableString( "fs_homepath" ); + char *cdpath = Cvar_VariableString( "fs_cdpath" ); + char *gamedir = Cvar_VariableString( "fs_game" ); +#ifdef MACOS_X + char *apppath = Cvar_VariableString( "fs_apppath" ); +#endif + + const char *searchPaths[] = { + homepath, +#ifdef MACOS_X + apppath, +#endif + basepath, + cdpath, + }; + size_t numPaths = ARRAY_LEN( searchPaths ); + + libHandle = Sys_LoadDllFromPaths( filename, gamedir, searchPaths, numPaths, + SEARCH_PATH_BASE | SEARCH_PATH_MOD | SEARCH_PATH_OPENJK | SEARCH_PATH_ROOT, + __FUNCTION__ ); + if ( !libHandle ) + return NULL; + } + + *GetGameAPI = (GetGameAPIProc *)Sys_LoadFunction( libHandle, "GetGameAPI" ); + if ( !*GetGameAPI ) { + Com_DPrintf ( "%s(%s) failed to find GetGameAPI function:\n...%s!\n", __FUNCTION__, name, Sys_LibraryError() ); + Sys_UnloadLibrary( libHandle ); + return NULL; + } + + return libHandle; +} + +void *Sys_LoadGameDll( const char *name, GetModuleAPIProc **moduleAPI ) +{ + void *libHandle = NULL; + char filename[MAX_OSPATH]; + + Com_sprintf (filename, sizeof(filename), "%s" ARCH_STRING DLL_EXT, name); + + if (!Sys_UnpackDLL(filename)) + { + Com_DPrintf( "Sys_LoadGameDll: Failed to unpack %s from PK3.\n", filename ); + return NULL; + } + +#if defined(MACOS_X) && !defined(_JK2EXE) + //First, look for the old-style mac .bundle that's inside a pk3 + //It's actually zipped, and the zipfile has the same name as 'name' + libHandle = Sys_LoadMachOBundle( name ); +#endif + + if (!libHandle) { + char *basepath = Cvar_VariableString( "fs_basepath" ); + char *homepath = Cvar_VariableString( "fs_homepath" ); + char *cdpath = Cvar_VariableString( "fs_cdpath" ); + char *gamedir = Cvar_VariableString( "fs_game" ); +#ifdef MACOS_X + char *apppath = Cvar_VariableString( "fs_apppath" ); +#endif + + const char *searchPaths[] = { + homepath, +#ifdef MACOS_X + apppath, +#endif + basepath, + cdpath, + }; + size_t numPaths = ARRAY_LEN( searchPaths ); + + libHandle = Sys_LoadDllFromPaths( filename, gamedir, searchPaths, numPaths, SEARCH_PATH_BASE | SEARCH_PATH_MOD, __FUNCTION__ ); + if ( !libHandle ) + return NULL; + } + + *moduleAPI = (GetModuleAPIProc *)Sys_LoadFunction( libHandle, "GetModuleAPI" ); + if ( !*moduleAPI ) { + Com_DPrintf ( "Sys_LoadGameDll(%s) failed to find GetModuleAPI function:\n...%s!\n", name, Sys_LibraryError() ); + Sys_UnloadLibrary( libHandle ); + return NULL; + } + + return libHandle; +} + +/* +================= +Sys_SigHandler +================= +*/ +void Sys_SigHandler( int signal ) +{ + static qboolean signalcaught = qfalse; + + if( signalcaught ) + { + fprintf( stderr, "DOUBLE SIGNAL FAULT: Received signal %d, exiting...\n", + signal ); + } + else + { + signalcaught = qtrue; + //VM_Forced_Unload_Start(); +#ifndef DEDICATED + CL_Shutdown(); + //CL_Shutdown(va("Received signal %d", signal), qtrue, qtrue); +#endif + SV_Shutdown(va("Received signal %d", signal) ); + //VM_Forced_Unload_Done(); + } + + if( signal == SIGTERM || signal == SIGINT ) + Sys_Exit( 1 ); + else + Sys_Exit( 2 ); +} + +#ifdef MACOS_X +/* + ================= + Sys_StripAppBundle + + Discovers if passed dir is suffixed with the directory structure of a Mac OS X + .app bundle. If it is, the .app directory structure is stripped off the end and + the result is returned. If not, dir is returned untouched. + ================= + */ +char *Sys_StripAppBundle( char *dir ) +{ + static char cwd[MAX_OSPATH]; + + Q_strncpyz(cwd, dir, sizeof(cwd)); + if(strcmp(Sys_Basename(cwd), "MacOS")) + return dir; + Q_strncpyz(cwd, Sys_Dirname(cwd), sizeof(cwd)); + if(strcmp(Sys_Basename(cwd), "Contents")) + return dir; + Q_strncpyz(cwd, Sys_Dirname(cwd), sizeof(cwd)); + if(!strstr(Sys_Basename(cwd), ".app")) + return dir; + Q_strncpyz(cwd, Sys_Dirname(cwd), sizeof(cwd)); + return cwd; +} +#endif + +#ifndef DEFAULT_BASEDIR +# ifdef MACOS_X +# define DEFAULT_BASEDIR Sys_StripAppBundle(Sys_BinaryPath()) +# else +# define DEFAULT_BASEDIR Sys_BinaryPath() +# endif +#endif + +int main ( int argc, char* argv[] ) +{ + int i; + char commandLine[ MAX_STRING_CHARS ] = { 0 }; + + Sys_PlatformInit(); + CON_Init(); + + // get the initial time base + Sys_Milliseconds(); + +#ifdef MACOS_X + // This is passed if we are launched by double-clicking + if ( argc >= 2 && Q_strncmp ( argv[1], "-psn", 4 ) == 0 ) + argc = 1; +#endif + + Sys_SetBinaryPath( Sys_Dirname( argv[ 0 ] ) ); + Sys_SetDefaultInstallPath( DEFAULT_BASEDIR ); + + // Concatenate the command line for passing to Com_Init + for( i = 1; i < argc; i++ ) + { + const bool containsSpaces = (strchr(argv[i], ' ') != NULL); + if (containsSpaces) + Q_strcat( commandLine, sizeof( commandLine ), "\"" ); + + Q_strcat( commandLine, sizeof( commandLine ), argv[ i ] ); + + if (containsSpaces) + Q_strcat( commandLine, sizeof( commandLine ), "\"" ); + + Q_strcat( commandLine, sizeof( commandLine ), " " ); + } + + Com_Init (commandLine); + + NET_Init(); + + // main game loop + while (1) + { + bool shouldSleep = false; + +#if !defined(_JK2EXE) + if ( com_dedicated->integer ) + { + shouldSleep = true; + } +#endif + +#if !defined(DEDICATED) + if ( com_minimized->integer ) + { + shouldSleep = true; + } +#endif + + if ( shouldSleep ) + { + Sys_Sleep( 5 ); + } + + // make sure mouse and joystick are only called once a frame + IN_Frame(); + + // run the game + Com_Frame(); + } + + // never gets here + return 0; +} diff --git a/shared/sys/sys_public.h b/shared/sys/sys_public.h new file mode 100644 index 0000000000..866fda57f9 --- /dev/null +++ b/shared/sys/sys_public.h @@ -0,0 +1,204 @@ +/* +=========================================================================== +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#pragma once + +#include "qcommon/q_shared.h" + +#define MAXPRINTMSG 4096 + +typedef enum netadrtype_s +{ + NA_BAD = 0, // an address lookup failed + NA_BOT, + NA_LOOPBACK, + NA_BROADCAST, + NA_IP +} netadrtype_t; + +typedef struct netadr_s +{ + netadrtype_t type; + + byte ip[4]; + unsigned short port; +} netadr_t; + +/* +============================================================== + +NON-PORTABLE SYSTEM SERVICES + +============================================================== +*/ + +typedef enum { + AXIS_SIDE, + AXIS_FORWARD, + AXIS_UP, + AXIS_ROLL, + AXIS_YAW, + AXIS_PITCH, + MAX_JOYSTICK_AXIS +} joystickAxis_t; + +typedef enum { + // bk001129 - make sure SE_NONE is zero + SE_NONE = 0, // evTime is still valid + SE_KEY, // evValue is a key code, evValue2 is the down flag + SE_CHAR, // evValue is an ascii char + SE_MOUSE, // evValue and evValue2 are reletive signed x / y moves + SE_JOYSTICK_AXIS, // evValue is an axis number and evValue2 is the current state (-127 to 127) + SE_CONSOLE, // evPtr is a char* + SE_PACKET // evPtr is a netadr_t followed by data bytes to evPtrLength +} sysEventType_t; + +typedef struct sysEvent_s { + int evTime; + sysEventType_t evType; + int evValue, evValue2; + int evPtrLength; // bytes of data pointed to by evPtr, for journaling + void *evPtr; // this must be manually freed if not NULL +} sysEvent_t; + +#ifndef DEDICATED +extern cvar_t *com_minimized; +extern cvar_t *com_unfocused; +#endif + +sysEvent_t Sys_GetEvent( void ); + +void Sys_Init (void); + +// general development dll loading for virtual machine testing +typedef void *GetGameAPIProc( void *); +typedef intptr_t QDECL VMMainProc( int, ... ); +typedef intptr_t QDECL SystemCallProc( intptr_t, ... ); +typedef void * QDECL GetModuleAPIProc( int, ... ); + +void *Sys_LoadSPGameDll( const char *name, GetGameAPIProc **GetGameAPI ); +void * QDECL Sys_LoadDll(const char *name, qboolean useSystemLib); +void * QDECL Sys_LoadLegacyGameDll( const char *name, VMMainProc **vmMain, SystemCallProc *systemcalls ); +void * QDECL Sys_LoadGameDll( const char *name, GetModuleAPIProc **moduleAPI ); +void Sys_UnloadDll( void *dllHandle ); + +char *Sys_GetCurrentUser( void ); + +void NORETURN QDECL Sys_Error( const char *error, ... ); +void NORETURN Sys_Quit (void); +char *Sys_GetClipboardData( void ); // note that this isn't journaled... + +void Sys_Print( const char *msg ); + +// Sys_Milliseconds should only be used for profiling purposes, +// any game related timing information should come from event timestamps +int Sys_Milliseconds (bool baseTime = false); +int Sys_Milliseconds2(void); +void Sys_Sleep( int msec ); + +extern "C" void Sys_SnapVector( float *v ); + +bool Sys_RandomBytes( byte *string, int len ); + +void Sys_SetErrorText( const char *text ); + +void Sys_SendPacket( int length, const void *data, netadr_t to ); + +qboolean Sys_StringToAdr( const char *s, netadr_t *a ); +//Does NOT parse port numbers, only base addresses. + +qboolean Sys_IsLANAddress (netadr_t adr); +void Sys_ShowIP(void); + +qboolean Sys_Mkdir( const char *path ); +char *Sys_Cwd( void ); +void Sys_SetDefaultInstallPath(const char *path); +char *Sys_DefaultInstallPath(void); + +#ifdef MACOS_X +char *Sys_DefaultAppPath(void); +#endif + +char *Sys_DefaultHomePath(void); +const char *Sys_Dirname( char *path ); +const char *Sys_Basename( char *path ); + +bool Sys_PathCmp( const char *path1, const char *path2 ); + +char **Sys_ListFiles( const char *directory, const char *extension, char *filter, int *numfiles, qboolean wantsubs ); +void Sys_FreeFileList( char **fileList ); +//rwwRMG - changed to fileList to not conflict with list type + +time_t Sys_FileTime( const char *path ); + +qboolean Sys_LowPhysicalMemory(); + +void Sys_SetProcessorAffinity( void ); + +typedef enum graphicsApi_e +{ + GRAPHICS_API_GENERIC, + + // Only OpenGL needs special treatment.. + GRAPHICS_API_OPENGL, +} graphicsApi_t; + +// Graphics API +typedef struct window_s +{ + void *handle; // OS-dependent window handle + graphicsApi_t api; +} window_t; + +typedef enum glProfile_e +{ + GLPROFILE_COMPATIBILITY, + GLPROFILE_CORE, + GLPROFILE_ES, +} glProfile_t; + +typedef enum glContextFlag_e +{ + GLCONTEXT_DEBUG = (1 << 1), +} glContextFlag_t; + +typedef struct windowDesc_s +{ + graphicsApi_t api; + + // Only used if api == GRAPHICS_API_OPENGL + struct gl_ + { + int majorVersion; + int minorVersion; + glProfile_t profile; + uint32_t contextFlags; + } gl; +} windowDesc_t; + +typedef struct glconfig_s glconfig_t; +window_t WIN_Init( const windowDesc_t *desc, glconfig_t *glConfig ); +void WIN_Present( window_t *window ); +void WIN_SetGamma( glconfig_t *glConfig, byte red[256], byte green[256], byte blue[256] ); +void WIN_Shutdown( void ); +void * WIN_GL_GetProcAddress( const char *proc ); + +uint8_t ConvertUTF32ToExpectedCharset( uint32_t utf32 ); diff --git a/codemp/sys/sys_unix.cpp b/shared/sys/sys_unix.cpp similarity index 64% rename from codemp/sys/sys_unix.cpp rename to shared/sys/sys_unix.cpp index b20f2eb7f8..49487426e6 100644 --- a/codemp/sys/sys_unix.cpp +++ b/shared/sys/sys_unix.cpp @@ -1,3 +1,24 @@ +/* +=========================================================================== +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + #include #include #include @@ -10,24 +31,38 @@ #include #include #include +#include #include "qcommon/qcommon.h" #include "qcommon/q_shared.h" #include "sys_local.h" -#ifndef DEDICATED - #include -#endif - -#define MAX_QUED_EVENTS 256 -#define MASK_QUED_EVENTS ( MAX_QUED_EVENTS - 1 ) - qboolean stdin_active = qtrue; qboolean stdinIsATTY = qfalse; // Used to determine where to store user-specific files static char homePath[ MAX_OSPATH ] = { 0 }; +void Sys_PlatformInit( void ) +{ + const char* term = getenv( "TERM" ); + + signal( SIGHUP, Sys_SigHandler ); + signal( SIGQUIT, Sys_SigHandler ); + signal( SIGTRAP, Sys_SigHandler ); + signal( SIGIOT, Sys_SigHandler ); + signal( SIGBUS, Sys_SigHandler ); + + if (isatty( STDIN_FILENO ) && !( term && ( !strcmp( term, "raw" ) || !strcmp( term, "dumb" ) ) )) + stdinIsATTY = qtrue; + else + stdinIsATTY = qfalse; +} + +void Sys_PlatformExit( void ) +{ +} + /* ================ Sys_Milliseconds @@ -71,35 +106,27 @@ int Sys_Milliseconds2( void ) return Sys_Milliseconds(false); } -void Sys_SetEnv(const char *name, const char *value) -{ - if(value && *value) - setenv(name, value, 1); - else - unsetenv(name); -} - /* ================== Sys_RandomBytes ================== */ -qboolean Sys_RandomBytes( byte *string, int len ) +bool Sys_RandomBytes( byte *string, int len ) { FILE *fp; fp = fopen( "/dev/urandom", "r" ); if( !fp ) - return qfalse; + return false; if( !fread( string, sizeof( byte ), len, fp ) ) { fclose( fp ); - return qfalse; + return false; } fclose( fp ); - return qtrue; + return true; } /* @@ -117,29 +144,6 @@ char *Sys_GetCurrentUser( void ) return p->pw_name; } -/* -================== -Sys_GetClipboardData -================== -*/ -char *Sys_GetClipboardData( void ) { -#ifdef DEDICATED - return NULL; -#else - if ( !SDL_HasClipboardText() ) - return NULL; - - char *cbText = SDL_GetClipboardText(); - size_t len = strlen( cbText ) + 1; - - char *buf = (char *)Z_Malloc( len, TAG_CLIPBOARD ); - Q_strncpyz( buf, cbText, len ); - - SDL_free( cbText ); - return buf; -#endif -} - #define MEM_THRESHOLD 96*1024*1024 /* @@ -174,73 +178,6 @@ const char *Sys_Dirname( char *path ) return dirname( path ); } -/* -======================================================================== - -EVENT LOOP - -======================================================================== -*/ - -#define MAX_QUED_EVENTS 256 -#define MASK_QUED_EVENTS ( MAX_QUED_EVENTS - 1 ) - -sysEvent_t eventQue[MAX_QUED_EVENTS]; -int eventHead, eventTail; -byte sys_packetReceived[MAX_MSGLEN]; - -sysEvent_t Sys_GetEvent( void ) { - sysEvent_t ev; - char *s; - msg_t netmsg; - netadr_t adr; - - // return if we have data - if ( eventHead > eventTail ) { - eventTail++; - return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ]; - } - - // check for console commands - s = Sys_ConsoleInput(); - if ( s ) { - char *b; - int len; - - len = strlen( s ) + 1; - b = (char *)Z_Malloc( len,TAG_EVENT,qfalse ); - strcpy( b, s ); - Sys_QueEvent( 0, SE_CONSOLE, 0, 0, len, b ); - } - - // check for network packets - MSG_Init( &netmsg, sys_packetReceived, sizeof( sys_packetReceived ) ); - if ( Sys_GetPacket ( &adr, &netmsg ) ) { - netadr_t *buf; - int len; - - // copy out to a seperate buffer for qeueing - len = sizeof( netadr_t ) + netmsg.cursize; - buf = (netadr_t *)Z_Malloc( len,TAG_EVENT,qfalse ); - *buf = adr; - memcpy( buf+1, netmsg.data, netmsg.cursize ); - Sys_QueEvent( 0, SE_PACKET, 0, 0, len, buf ); - } - - // return if we have data - if ( eventHead > eventTail ) { - eventTail++; - return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ]; - } - - // create an empty event to return - - memset( &ev, 0, sizeof( ev ) ); - ev.evTime = Sys_Milliseconds(); - - return ev; -} - /* ============================================================== @@ -504,15 +441,6 @@ bool Sys_PathCmp( const char *path1, const char *path2 ) return false; } -void Sys_ShowConsole( int visLevel, qboolean quitOnClose ) -{ -} - -void Sys_SetDefaultHomePath(const char *path) -{ - Q_strncpyz(homePath, path, sizeof(homePath)); -} - /* ================== Sys_DefaultHomePath @@ -523,18 +451,17 @@ char *Sys_DefaultHomePath(void) { char *p; - if( !*homePath && com_homepath != NULL ) + if ( !homePath[0] ) { - if( ( p = getenv( "HOME" ) ) != NULL ) + if ( (p = getenv( "HOME" )) != NULL ) { - Com_sprintf(homePath, sizeof(homePath), "%s%c", p, PATH_SEP); - Q_strcat(homePath, sizeof(homePath), - "Library/Application Support/"); + Com_sprintf( homePath, sizeof( homePath ), "%s%c", p, PATH_SEP ); + Q_strcat( homePath, sizeof( homePath ), "Library/Application Support/" ); - if(com_homepath->string[0]) - Q_strcat(homePath, sizeof(homePath), com_homepath->string); + if ( com_homepath && com_homepath->string[0] ) + Q_strcat( homePath, sizeof( homePath ), com_homepath->string ); else - Q_strcat(homePath, sizeof(homePath), HOMEPATH_NAME_MACOSX); + Q_strcat( homePath, sizeof( homePath ), HOMEPATH_NAME_MACOSX ); } } @@ -545,26 +472,26 @@ char *Sys_DefaultHomePath(void) { char *p; - if( !*homePath && com_homepath != NULL ) + if ( !homePath[0] ) { - if( ( p = getenv( "XDG_DATA_HOME" ) ) != NULL ) + if ( (p = getenv( "XDG_DATA_HOME" )) != NULL ) { - Com_sprintf(homePath, sizeof(homePath), "%s%c", p, PATH_SEP); - if(com_homepath->string[0]) - Q_strcat(homePath, sizeof(homePath), com_homepath->string); + Com_sprintf( homePath, sizeof( homePath ), "%s%c", p, PATH_SEP ); + if ( com_homepath && com_homepath->string[0] ) + Q_strcat( homePath, sizeof( homePath ), com_homepath->string ); else - Q_strcat(homePath, sizeof(homePath), HOMEPATH_NAME_UNIX); + Q_strcat( homePath, sizeof( homePath ), HOMEPATH_NAME_UNIX ); return homePath; } - if( ( p = getenv( "HOME" ) ) != NULL ) + if ( (p = getenv( "HOME" )) != NULL ) { - Com_sprintf(homePath, sizeof(homePath), "%s%c.local%cshare%c", p, PATH_SEP, PATH_SEP, PATH_SEP); - if(com_homepath->string[0]) - Q_strcat(homePath, sizeof(homePath), com_homepath->string); + Com_sprintf( homePath, sizeof( homePath ), "%s%c.local%cshare%c", p, PATH_SEP, PATH_SEP, PATH_SEP ); + if ( com_homepath && com_homepath->string[0] ) + Q_strcat( homePath, sizeof( homePath ), com_homepath->string ); else - Q_strcat(homePath, sizeof(homePath), HOMEPATH_NAME_UNIX); + Q_strcat( homePath, sizeof( homePath ), HOMEPATH_NAME_UNIX ); return homePath; } @@ -574,77 +501,6 @@ char *Sys_DefaultHomePath(void) } #endif -char *Sys_ConsoleInput(void) -{ - static char text[256]; - int len; - fd_set fdset; - struct timeval timeout; - - if (!com_dedicated || !com_dedicated->value) - return NULL; - - if (!stdin_active) - return NULL; - - FD_ZERO(&fdset); - FD_SET(0, &fdset); // stdin - timeout.tv_sec = 0; - timeout.tv_usec = 0; - if (select (1, &fdset, NULL, NULL, &timeout) == -1 || !FD_ISSET(0, &fdset)) - return NULL; - - len = read (0, text, sizeof(text)); - if (len == 0) { // eof! - stdin_active = qfalse; - return NULL; - } - - if (len < 1) - return NULL; - text[len-1] = 0; // rip off the /n and terminate - - return text; -} - -/* -================ -Sys_QueEvent - -A time of 0 will get the current time -Ptr should either be null, or point to a block of data that can -be freed by the game later. -================ -*/ -void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptrLength, void *ptr ) { - sysEvent_t *ev; - - ev = &eventQue[ eventHead & MASK_QUED_EVENTS ]; - - // bk000305 - was missing - if ( eventHead - eventTail >= MAX_QUED_EVENTS ) { - Com_Printf("Sys_QueEvent: overflow\n"); - // we are discarding an event, but don't leak memory - if ( ev->evPtr ) { - Z_Free( ev->evPtr ); - } - eventTail++; - } - - eventHead++; - - if ( time == 0 ) { - time = Sys_Milliseconds(); - } - - ev->evTime = time; - ev->evType = type; - ev->evValue = value; - ev->evValue2 = value2; - ev->evPtrLength = ptrLength; - ev->evPtr = ptr; -} - void Sys_SetProcessorAffinity( void ) { #if defined(__linux__) uint32_t cores; @@ -652,10 +508,10 @@ void Sys_SetProcessorAffinity( void ) { if ( sscanf( com_affinity->string, "%X", &cores ) != 1 ) cores = 1; // set to first core only + const long numCores = sysconf( _SC_NPROCESSORS_ONLN ); if ( !cores ) - return; + cores = (1 << numCores) - 1; // use all cores - const long numCores = sysconf( _SC_NPROCESSORS_ONLN ); cpu_set_t set; CPU_ZERO( &set ); for ( int i = 0; i < numCores; i++ ) { @@ -669,3 +525,79 @@ void Sys_SetProcessorAffinity( void ) { //TODO: Apple's APIs for this are weird but exist on a per-thread level. Good enough for us. #endif } + +bool Sys_UnpackDLL(const char *name) +{ + return true; +} + +/* +================= +Sys_AnsiColorPrint + +Transform Q3 colour codes to ANSI escape sequences +================= +*/ +void Sys_AnsiColorPrint( const char *msg ) +{ + static char buffer[MAXPRINTMSG]; + int length = 0; + static int q3ToAnsi[Q_COLOR_BITS+1] = + { + 30, // COLOR_BLACK + 31, // COLOR_RED + 32, // COLOR_GREEN + 33, // COLOR_YELLOW + 34, // COLOR_BLUE + 36, // COLOR_CYAN + 35, // COLOR_MAGENTA + 0, // COLOR_WHITE + 33, // COLOR_ORANGE // FIXME + 30, // COLOR_GREY + }; + + while ( *msg ) + { + if ( Q_IsColorStringExt( msg ) || *msg == '\n' ) + { + // First empty the buffer + if ( length > 0 ) + { + buffer[length] = '\0'; + fputs( buffer, stderr ); + length = 0; + } + + if ( *msg == '\n' ) + { + // Issue a reset and then the newline + fputs( "\033[0m\n", stderr ); + msg++; + } + else + { + // Print the color code + Com_sprintf( buffer, sizeof( buffer ), "\033[%dm", + q3ToAnsi[ColorIndex( *(msg + 1) )] ); + fputs( buffer, stderr ); + msg += 2; + } + } + else + { + if ( length >= MAXPRINTMSG - 1 ) + break; + + buffer[length] = *msg; + length++; + msg++; + } + } + + // Empty anything still left in the buffer + if ( length > 0 ) + { + buffer[length] = '\0'; + fputs( buffer, stderr ); + } +} diff --git a/shared/sys/sys_win32.cpp b/shared/sys/sys_win32.cpp new file mode 100644 index 0000000000..c8142d2cb9 --- /dev/null +++ b/shared/sys/sys_win32.cpp @@ -0,0 +1,587 @@ +/* +=========================================================================== +Copyright (C) 2005 - 2015, ioquake3 contributors +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== +*/ + +#include "sys_local.h" +#include +#include +#include +#include + +#define MEM_THRESHOLD (128*1024*1024) + +// Used to determine where to store user-specific files +static char homePath[ MAX_OSPATH ] = { 0 }; + +static UINT timerResolution = 0; + +/* +============== +Sys_Basename +============== +*/ +const char *Sys_Basename( char *path ) +{ + static char base[ MAX_OSPATH ] = { 0 }; + int length; + + length = strlen( path ) - 1; + + // Skip trailing slashes + while( length > 0 && path[ length ] == '\\' ) + length--; + + while( length > 0 && path[ length - 1 ] != '\\' ) + length--; + + Q_strncpyz( base, &path[ length ], sizeof( base ) ); + + length = strlen( base ) - 1; + + // Strip trailing slashes + while( length > 0 && base[ length ] == '\\' ) + base[ length-- ] = '\0'; + + return base; +} + +/* +============== +Sys_Dirname +============== +*/ +const char *Sys_Dirname( char *path ) +{ + static char dir[ MAX_OSPATH ] = { 0 }; + int length; + + Q_strncpyz( dir, path, sizeof( dir ) ); + length = strlen( dir ) - 1; + + while( length > 0 && dir[ length ] != '\\' ) + length--; + + dir[ length ] = '\0'; + + return dir; +} + +/* +================ +Sys_Milliseconds +================ +*/ +int Sys_Milliseconds (bool baseTime) +{ + static int sys_timeBase = timeGetTime(); + int sys_curtime; + + sys_curtime = timeGetTime(); + if(!baseTime) + { + sys_curtime -= sys_timeBase; + } + + return sys_curtime; +} + +int Sys_Milliseconds2( void ) +{ + return Sys_Milliseconds(false); +} + +/* +================ +Sys_RandomBytes +================ +*/ +bool Sys_RandomBytes( byte *string, int len ) +{ + HCRYPTPROV prov; + + if( !CryptAcquireContext( &prov, NULL, NULL, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ) ) { + + return false; + } + + if( !CryptGenRandom( prov, len, (BYTE *)string ) ) { + CryptReleaseContext( prov, 0 ); + return false; + } + CryptReleaseContext( prov, 0 ); + return true; +} + +/* +================== +Sys_GetCurrentUser +================== +*/ +char *Sys_GetCurrentUser( void ) +{ + static char s_userName[1024]; + DWORD size = sizeof( s_userName ); + + if ( !GetUserName( s_userName, &size ) ) + strcpy( s_userName, "player" ); + + if ( !s_userName[0] ) + { + strcpy( s_userName, "player" ); + } + + return s_userName; +} + +/* +* Builds the path for the user's game directory +*/ +char *Sys_DefaultHomePath( void ) +{ +#if defined(_PORTABLE_VERSION) + Com_Printf( "Portable install requested, skipping homepath support\n" ); + return NULL; +#else + if ( !homePath[0] ) + { + TCHAR homeDirectory[MAX_PATH]; + + if( !SUCCEEDED( SHGetFolderPath( NULL, CSIDL_PERSONAL, NULL, 0, homeDirectory ) ) ) + { + Com_Printf( "Unable to determine your home directory.\n" ); + return false; + } + + Com_sprintf( homePath, sizeof( homePath ), "%s%cMy Games%c", homeDirectory, PATH_SEP, PATH_SEP ); + if ( com_homepath && com_homepath->string[0] ) + Q_strcat( homePath, sizeof( homePath ), com_homepath->string ); + else + Q_strcat( homePath, sizeof( homePath ), HOMEPATH_NAME_WIN ); + } + + return homePath; +#endif +} + +static const char *GetErrorString( DWORD error ) { + static char buf[MAX_STRING_CHARS]; + buf[0] = '\0'; + + if ( error ) { + LPVOID lpMsgBuf; + DWORD bufLen = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, error, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), (LPTSTR)&lpMsgBuf, 0, NULL ); + if ( bufLen ) { + LPCSTR lpMsgStr = (LPCSTR)lpMsgBuf; + Q_strncpyz( buf, lpMsgStr, Q_min( (size_t)(lpMsgStr + bufLen), sizeof(buf) ) ); + LocalFree( lpMsgBuf ); + } + } + return buf; +} + +void Sys_SetProcessorAffinity( void ) { + DWORD_PTR processMask, processAffinityMask, systemAffinityMask; + HANDLE handle = GetCurrentProcess(); + + if ( !GetProcessAffinityMask( handle, &processAffinityMask, &systemAffinityMask ) ) + return; + + if ( sscanf( com_affinity->string, "%X", &processMask ) != 1 ) + processMask = 1; // set to first core only + + if ( !processMask ) + processMask = systemAffinityMask; // use all the cores available to the system + + if ( processMask == processAffinityMask ) + return; // no change + + if ( !SetProcessAffinityMask( handle, processMask ) ) + Com_DPrintf( "Setting affinity mask failed (%s)\n", GetErrorString( GetLastError() ) ); +} + +/* +================== +Sys_LowPhysicalMemory() +================== +*/ + +qboolean Sys_LowPhysicalMemory(void) { + static MEMORYSTATUSEX stat; + static qboolean bAsked = qfalse; + static cvar_t* sys_lowmem = Cvar_Get( "sys_lowmem", "0", 0 ); + + if (!bAsked) // just in case it takes a little time for GlobalMemoryStatusEx() to gather stats on + { // stuff we don't care about such as virtual mem etc. + bAsked = qtrue; + + stat.dwLength = sizeof (stat); + GlobalMemoryStatusEx (&stat); + } + if (sys_lowmem->integer) + { + return qtrue; + } + return (stat.ullTotalPhys <= MEM_THRESHOLD) ? qtrue : qfalse; +} + +/* +============== +Sys_Mkdir +============== +*/ +qboolean Sys_Mkdir( const char *path ) { + if( !CreateDirectory( path, NULL ) ) + { + if( GetLastError( ) != ERROR_ALREADY_EXISTS ) + return qfalse; + } + return qtrue; +} + +/* +============== +Sys_Cwd +============== +*/ +char *Sys_Cwd( void ) { + static char cwd[MAX_OSPATH]; + + _getcwd( cwd, sizeof( cwd ) - 1 ); + cwd[MAX_OSPATH-1] = 0; + + return cwd; +} + +/* Resolves path names and determines if they are the same */ +/* For use with full OS paths not quake paths */ +/* Returns true if resulting paths are valid and the same, otherwise false */ +bool Sys_PathCmp( const char *path1, const char *path2 ) { + char *r1, *r2; + + r1 = _fullpath(NULL, path1, MAX_OSPATH); + r2 = _fullpath(NULL, path2, MAX_OSPATH); + + if(r1 && r2 && !Q_stricmp(r1, r2)) + { + free(r1); + free(r2); + return true; + } + + free(r1); + free(r2); + return false; +} + +/* +============================================================== + +DIRECTORY SCANNING + +============================================================== +*/ + +#define MAX_FOUND_FILES 0x1000 + +void Sys_ListFilteredFiles( const char *basedir, char *subdirs, char *filter, char **psList, int *numfiles ) { + char search[MAX_OSPATH], newsubdirs[MAX_OSPATH]; + char filename[MAX_OSPATH]; + intptr_t findhandle; + struct _finddata_t findinfo; + + if ( *numfiles >= MAX_FOUND_FILES - 1 ) { + return; + } + + if (strlen(subdirs)) { + Com_sprintf( search, sizeof(search), "%s\\%s\\*", basedir, subdirs ); + } + else { + Com_sprintf( search, sizeof(search), "%s\\*", basedir ); + } + + findhandle = _findfirst (search, &findinfo); + if (findhandle == -1) { + return; + } + + do { + if (findinfo.attrib & _A_SUBDIR) { + if (Q_stricmp(findinfo.name, ".") && Q_stricmp(findinfo.name, "..")) { + if (strlen(subdirs)) { + Com_sprintf( newsubdirs, sizeof(newsubdirs), "%s\\%s", subdirs, findinfo.name); + } + else { + Com_sprintf( newsubdirs, sizeof(newsubdirs), "%s", findinfo.name); + } + Sys_ListFilteredFiles( basedir, newsubdirs, filter, psList, numfiles ); + } + } + if ( *numfiles >= MAX_FOUND_FILES - 1 ) { + break; + } + Com_sprintf( filename, sizeof(filename), "%s\\%s", subdirs, findinfo.name ); + if (!Com_FilterPath( filter, filename, qfalse )) + continue; + psList[ *numfiles ] = CopyString( filename ); + (*numfiles)++; + } while ( _findnext (findhandle, &findinfo) != -1 ); + + _findclose (findhandle); +} + +static qboolean strgtr(const char *s0, const char *s1) { + int l0, l1, i; + + l0 = strlen(s0); + l1 = strlen(s1); + + if (l1 s0[i]) { + return qtrue; + } + if (s1[i] < s0[i]) { + return qfalse; + } + } + return qfalse; +} + +char **Sys_ListFiles( const char *directory, const char *extension, char *filter, int *numfiles, qboolean wantsubs ) { + char search[MAX_OSPATH]; + int nfiles; + char **listCopy; + char *list[MAX_FOUND_FILES]; + struct _finddata_t findinfo; + intptr_t findhandle; + int flag; + int i; + + if (filter) { + + nfiles = 0; + Sys_ListFilteredFiles( directory, "", filter, list, &nfiles ); + + list[ nfiles ] = 0; + *numfiles = nfiles; + + if (!nfiles) + return NULL; + + listCopy = (char **)Z_Malloc( ( nfiles + 1 ) * sizeof( *listCopy ), TAG_LISTFILES ); + for ( i = 0 ; i < nfiles ; i++ ) { + listCopy[i] = list[i]; + } + listCopy[i] = NULL; + + return listCopy; + } + + if ( !extension) { + extension = ""; + } + + // passing a slash as extension will find directories + if ( extension[0] == '/' && extension[1] == 0 ) { + extension = ""; + flag = 0; + } else { + flag = _A_SUBDIR; + } + + Com_sprintf( search, sizeof(search), "%s\\*%s", directory, extension ); + + // search + nfiles = 0; + + findhandle = _findfirst (search, &findinfo); + if (findhandle == -1) { + *numfiles = 0; + return NULL; + } + + do { + if ( (!wantsubs && flag ^ ( findinfo.attrib & _A_SUBDIR )) || (wantsubs && findinfo.attrib & _A_SUBDIR) ) { + if ( nfiles == MAX_FOUND_FILES - 1 ) { + break; + } + list[ nfiles ] = CopyString( findinfo.name ); + nfiles++; + } + } while ( _findnext (findhandle, &findinfo) != -1 ); + + list[ nfiles ] = 0; + + _findclose (findhandle); + + // return a copy of the list + *numfiles = nfiles; + + if ( !nfiles ) { + return NULL; + } + + listCopy = (char **)Z_Malloc( ( nfiles + 1 ) * sizeof( *listCopy ), TAG_LISTFILES ); + for ( i = 0 ; i < nfiles ; i++ ) { + listCopy[i] = list[i]; + } + listCopy[i] = NULL; + + do { + flag = 0; + for(i=1; i 1 ) + { + Com_Printf( "Warning: Minimum supported timer resolution is %ums " + "on this system, recommended resolution 1ms\n", timerResolution ); + } + + timeBeginPeriod( timerResolution ); + } + else + timerResolution = 0; +} + +/* +================ +Sys_PlatformExit + +Platform-specific exit code +================ +*/ +void Sys_PlatformExit( void ) +{ + if ( timerResolution ) + timeEndPeriod( timerResolution ); +} + +void Sys_Sleep( int msec ) +{ + if ( msec == 0 ) + return; + +#ifdef DEDICATED + if ( msec < 0 ) + WaitForSingleObject( GetStdHandle( STD_INPUT_HANDLE ), INFINITE ); + else + WaitForSingleObject( GetStdHandle( STD_INPUT_HANDLE ), msec ); +#else + // Client Sys_Sleep doesn't support waiting on stdin + if ( msec < 0 ) + return; + + Sleep( msec ); +#endif +} diff --git a/codemp/sys/unix_local.h b/shared/sys/unix_local.h similarity index 100% rename from codemp/sys/unix_local.h rename to shared/sys/unix_local.h From 00981307e1da4d2bd37bb5ff9e93fa3261f52464 Mon Sep 17 00:00:00 2001 From: dusty22 Date: Tue, 7 Jul 2015 19:26:58 -0400 Subject: [PATCH 010/445] Still finishing pull request? How come these files didn't go through? --- code/game/bg_pmove.cpp | 8998 ++++++++++++++++++++-------------------- code/game/wp_saber.cpp | 3690 ++++++++-------- 2 files changed, 6354 insertions(+), 6334 deletions(-) diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 19fb98408c..8c12396d1a 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -1,22 +1,26 @@ /* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +=========================================================================== +Copyright (C) 1999 - 2005, Id Software, Inc. +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors + +This file is part of the OpenJK source code. + +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software -// this include must remain at the top of every bg_xxxx CPP file #include "common_headers.h" #include "../rd-common/tr_public.h" @@ -32,8 +36,8 @@ This file is part of Jedi Academy. #define GAME_INCLUDE #include "../qcommon/q_shared.h" #include "g_shared.h" -#include "bg_local.h" -#include "g_local.h" +#include "bg_local.h" +#include "g_local.h" #include "g_functions.h" #include "anims.h" #include "../cgame/cg_local.h" // yeah I know this is naughty, but we're shipping soon... @@ -42,94 +46,94 @@ This file is part of Jedi Academy. #include "g_vehicles.h" #include -extern qboolean G_DoDismemberment( gentity_t *self, vec3_t point, int mod, int damage, int hitLoc, qboolean force = qfalse ); -extern qboolean G_EntIsUnlockedDoor( int entityNum ); -extern qboolean G_EntIsDoor( int entityNum ); -extern qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f ); -extern void G_AddVoiceEvent( gentity_t *self, int event, int speakDebounceTime ); -extern qboolean Q3_TaskIDPending( gentity_t *ent, taskID_t taskType ); -extern qboolean WP_SaberLose( gentity_t *self, vec3_t throwDir ); -extern int Jedi_ReCalcParryTime( gentity_t *self, evasionType_t evasionType ); -extern qboolean PM_HasAnimation( gentity_t *ent, int animation ); -extern saberMoveName_t PM_SaberAnimTransitionMove( saberMoveName_t curmove, saberMoveName_t newmove ); -extern saberMoveName_t PM_AttackMoveForQuad( int quad ); -extern qboolean PM_SaberInTransition( int move ); -extern qboolean PM_SaberInTransitionAny( int move ); -extern qboolean PM_SaberInBounce( int move ); -extern qboolean PM_SaberInSpecialAttack( int anim ); -extern qboolean PM_SaberInAttack( int move ); -extern qboolean PM_InAnimForSaberMove( int anim, int saberMove ); -extern saberMoveName_t PM_SaberBounceForAttack( int move ); -extern saberMoveName_t PM_SaberAttackForMovement( int forwardmove, int rightmove, int curmove ); -extern saberMoveName_t PM_BrokenParryForParry( int move ); -extern saberMoveName_t PM_KnockawayForParry( int move ); -extern qboolean PM_SaberInParry( int move ); -extern qboolean PM_SaberInKnockaway( int move ); -extern qboolean PM_SaberInBrokenParry( int move ); -extern qboolean PM_SaberInReflect( int move ); -extern qboolean PM_SaberInIdle( int move ); -extern qboolean PM_SaberInStart( int move ); -extern qboolean PM_SaberInReturn( int move ); -extern qboolean PM_SaberKataDone( int curmove, int newmove ); -extern qboolean PM_SaberInSpecial( int move ); -extern qboolean PM_InDeathAnim ( void ); -extern qboolean PM_StandingAnim( int anim ); -extern qboolean PM_KickMove( int move ); -extern qboolean PM_KickingAnim( int anim ); -extern qboolean PM_InAirKickingAnim( int anim ); -extern qboolean PM_SuperBreakLoseAnim( int anim ); -extern qboolean PM_SuperBreakWinAnim( int anim ); -extern qboolean PM_InCartwheel( int anim ); -extern qboolean PM_InButterfly( int anim ); -extern qboolean PM_CanRollFromSoulCal( playerState_t *ps ); -extern saberMoveName_t PM_SaberFlipOverAttackMove( void ); -extern qboolean PM_CheckFlipOverAttackMove( qboolean checkEnemy ); -extern saberMoveName_t PM_SaberJumpForwardAttackMove( void ); -extern qboolean PM_CheckJumpForwardAttackMove( void ); -extern saberMoveName_t PM_SaberBackflipAttackMove( void ); -extern qboolean PM_CheckBackflipAttackMove( void ); -extern saberMoveName_t PM_SaberDualJumpAttackMove( void ); -extern qboolean PM_CheckDualJumpAttackMove( void ); -extern saberMoveName_t PM_SaberLungeAttackMove( qboolean fallbackToNormalLunge ); -extern qboolean PM_CheckLungeAttackMove( void ); -extern qboolean PM_InSecondaryStyle( void ); -extern qboolean PM_KnockDownAnimExtended( int anim ); -extern void G_StartMatrixEffect( gentity_t *ent, int meFlags = 0, int length = 1000, float timeScale = 0.0f, int spinTime = 0 ); -extern void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ); -extern qboolean WP_ForcePowerAvailable( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); -extern void WP_ForcePowerDrain( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); -extern float G_ForceWallJumpStrength( void ); -extern int G_CheckRollSafety( gentity_t *self, int anim, float testDist ); -extern saberMoveName_t PM_CheckDualSpinProtect( void ); -extern saberMoveName_t PM_CheckPullAttack( void ); -extern qboolean JET_Flying( gentity_t *self ); -extern void JET_FlyStart( gentity_t *self ); -extern void JET_FlyStop( gentity_t *self ); -extern qboolean PM_LockedAnim( int anim ); -extern qboolean G_TryingKataAttack( gentity_t *self, usercmd_t *cmd ); -extern qboolean G_TryingCartwheel( gentity_t *self, usercmd_t *cmd ); -extern qboolean G_TryingSpecial( gentity_t *self, usercmd_t *cmd ); -extern qboolean G_TryingJumpAttack( gentity_t *self, usercmd_t *cmd ); -extern qboolean G_TryingJumpForwardAttack( gentity_t *self, usercmd_t *cmd ); +extern qboolean G_DoDismemberment(gentity_t *self, vec3_t point, int mod, int damage, int hitLoc, qboolean force = qfalse); +extern qboolean G_EntIsUnlockedDoor(int entityNum); +extern qboolean G_EntIsDoor(int entityNum); +extern qboolean InFront(vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f); +extern void G_AddVoiceEvent(gentity_t *self, int event, int speakDebounceTime); +extern qboolean Q3_TaskIDPending(gentity_t *ent, taskID_t taskType); +extern qboolean WP_SaberLose(gentity_t *self, vec3_t throwDir); +extern int Jedi_ReCalcParryTime(gentity_t *self, evasionType_t evasionType); +extern qboolean PM_HasAnimation(gentity_t *ent, int animation); +extern saberMoveName_t PM_SaberAnimTransitionMove(saberMoveName_t curmove, saberMoveName_t newmove); +extern saberMoveName_t PM_AttackMoveForQuad(int quad); +extern qboolean PM_SaberInTransition(int move); +extern qboolean PM_SaberInTransitionAny(int move); +extern qboolean PM_SaberInBounce(int move); +extern qboolean PM_SaberInSpecialAttack(int anim); +extern qboolean PM_SaberInAttack(int move); +extern qboolean PM_InAnimForSaberMove(int anim, int saberMove); +extern saberMoveName_t PM_SaberBounceForAttack(int move); +extern saberMoveName_t PM_SaberAttackForMovement(int forwardmove, int rightmove, int curmove); +extern saberMoveName_t PM_BrokenParryForParry(int move); +extern saberMoveName_t PM_KnockawayForParry(int move); +extern qboolean PM_SaberInParry(int move); +extern qboolean PM_SaberInKnockaway(int move); +extern qboolean PM_SaberInBrokenParry(int move); +extern qboolean PM_SaberInReflect(int move); +extern qboolean PM_SaberInIdle(int move); +extern qboolean PM_SaberInStart(int move); +extern qboolean PM_SaberInReturn(int move); +extern qboolean PM_SaberKataDone(int curmove, int newmove); +extern qboolean PM_SaberInSpecial(int move); +extern qboolean PM_InDeathAnim(void); +extern qboolean PM_StandingAnim(int anim); +extern qboolean PM_KickMove(int move); +extern qboolean PM_KickingAnim(int anim); +extern qboolean PM_InAirKickingAnim(int anim); +extern qboolean PM_SuperBreakLoseAnim(int anim); +extern qboolean PM_SuperBreakWinAnim(int anim); +extern qboolean PM_InCartwheel(int anim); +extern qboolean PM_InButterfly(int anim); +extern qboolean PM_CanRollFromSoulCal(playerState_t *ps); +extern saberMoveName_t PM_SaberFlipOverAttackMove(void); +extern qboolean PM_CheckFlipOverAttackMove(qboolean checkEnemy); +extern saberMoveName_t PM_SaberJumpForwardAttackMove(void); +extern qboolean PM_CheckJumpForwardAttackMove(void); +extern saberMoveName_t PM_SaberBackflipAttackMove(void); +extern qboolean PM_CheckBackflipAttackMove(void); +extern saberMoveName_t PM_SaberDualJumpAttackMove(void); +extern qboolean PM_CheckDualJumpAttackMove(void); +extern saberMoveName_t PM_SaberLungeAttackMove(qboolean fallbackToNormalLunge); +extern qboolean PM_CheckLungeAttackMove(void); +extern qboolean PM_InSecondaryStyle(void); +extern qboolean PM_KnockDownAnimExtended(int anim); +extern void G_StartMatrixEffect(gentity_t *ent, int meFlags = 0, int length = 1000, float timeScale = 0.0f, int spinTime = 0); +extern void WP_ForcePowerStop(gentity_t *self, forcePowers_t forcePower); +extern qboolean WP_ForcePowerAvailable(gentity_t *self, forcePowers_t forcePower, int overrideAmt); +extern void WP_ForcePowerDrain(gentity_t *self, forcePowers_t forcePower, int overrideAmt); +extern float G_ForceWallJumpStrength(void); +extern int G_CheckRollSafety(gentity_t *self, int anim, float testDist); +extern saberMoveName_t PM_CheckDualSpinProtect(void); +extern saberMoveName_t PM_CheckPullAttack(void); +extern qboolean JET_Flying(gentity_t *self); +extern void JET_FlyStart(gentity_t *self); +extern void JET_FlyStop(gentity_t *self); +extern qboolean PM_LockedAnim(int anim); +extern qboolean G_TryingKataAttack(gentity_t *self, usercmd_t *cmd); +extern qboolean G_TryingCartwheel(gentity_t *self, usercmd_t *cmd); +extern qboolean G_TryingSpecial(gentity_t *self, usercmd_t *cmd); +extern qboolean G_TryingJumpAttack(gentity_t *self, usercmd_t *cmd); +extern qboolean G_TryingJumpForwardAttack(gentity_t *self, usercmd_t *cmd); extern qboolean WP_ForcePowerUsable(gentity_t *self, forcePowers_t forcePower, int overrideAmt); -extern void WP_SaberSwingSound( gentity_t *ent, int saberNum, swingType_t swingType ); -extern qboolean WP_UseFirstValidSaberStyle( gentity_t *ent, int *saberAnimLevel ); -extern qboolean WP_SaberStyleValidForSaber( gentity_t *ent, int saberAnimLevel ); - -qboolean PM_InKnockDown( playerState_t *ps ); -qboolean PM_InKnockDownOnGround( playerState_t *ps ); -qboolean PM_InGetUp( playerState_t *ps ); -qboolean PM_InRoll( playerState_t *ps ); -qboolean PM_SpinningSaberAnim( int anim ); -qboolean PM_GettingUpFromKnockDown( float standheight, float crouchheight ); -qboolean PM_SpinningAnim( int anim ); -qboolean PM_FlippingAnim( int anim ); -qboolean PM_PainAnim( int anim ); -qboolean PM_RollingAnim( int anim ); -qboolean PM_SwimmingAnim( int anim ); -qboolean PM_InReboundJump( int anim ); -qboolean PM_ForceJumpingAnim( int anim ); -void PM_CmdForRoll( playerState_t *ps, usercmd_t *pCmd ); +extern void WP_SaberSwingSound(gentity_t *ent, int saberNum, swingType_t swingType); +extern qboolean WP_UseFirstValidSaberStyle(gentity_t *ent, int *saberAnimLevel); +extern qboolean WP_SaberStyleValidForSaber(gentity_t *ent, int saberAnimLevel); + +qboolean PM_InKnockDown(playerState_t *ps); +qboolean PM_InKnockDownOnGround(playerState_t *ps); +qboolean PM_InGetUp(playerState_t *ps); +qboolean PM_InRoll(playerState_t *ps); +qboolean PM_SpinningSaberAnim(int anim); +qboolean PM_GettingUpFromKnockDown(float standheight, float crouchheight); +qboolean PM_SpinningAnim(int anim); +qboolean PM_FlippingAnim(int anim); +qboolean PM_PainAnim(int anim); +qboolean PM_RollingAnim(int anim); +qboolean PM_SwimmingAnim(int anim); +qboolean PM_InReboundJump(int anim); +qboolean PM_ForceJumpingAnim(int anim); +void PM_CmdForRoll(playerState_t *ps, usercmd_t *pCmd); extern int parryDebounce[]; extern qboolean cg_usingInFrontOf; @@ -145,7 +149,7 @@ extern cvar_t *g_stepSlideFix; extern cvar_t *g_saberAutoBlocking; extern cvar_t *g_autoRoll; -static void PM_SetWaterLevelAtPoint( vec3_t org, int *waterlevel, int *watertype ); +static void PM_SetWaterLevelAtPoint(vec3_t org, int *waterlevel, int *watertype); #define FLY_NONE 0 #define FLY_NORMAL 1 @@ -177,45 +181,45 @@ const float pm_airDecelRate = 1.35f; //Used for air decelleration away from curr int c_pmove = 0; -extern void PM_SetTorsoAnimTimer( gentity_t *ent, int *torsoAnimTimer, int time ); -extern void PM_SetLegsAnimTimer( gentity_t *ent, int *legsAnimTimer, int time ); -extern void PM_TorsoAnimation( void ); -extern int PM_TorsoAnimForFrame( gentity_t *ent, int torsoFrame ); -extern int PM_AnimLength( int index, animNumber_t anim ); -extern qboolean PM_InDeathAnim ( void ); -extern qboolean PM_InOnGroundAnim ( playerState_t *ps ); +extern void PM_SetTorsoAnimTimer(gentity_t *ent, int *torsoAnimTimer, int time); +extern void PM_SetLegsAnimTimer(gentity_t *ent, int *legsAnimTimer, int time); +extern void PM_TorsoAnimation(void); +extern int PM_TorsoAnimForFrame(gentity_t *ent, int torsoFrame); +extern int PM_AnimLength(int index, animNumber_t anim); +extern qboolean PM_InDeathAnim(void); +extern qboolean PM_InOnGroundAnim(playerState_t *ps); extern weaponInfo_t cg_weapons[MAX_WEAPONS]; -extern int PM_PickAnim( gentity_t *self, int minAnim, int maxAnim ); +extern int PM_PickAnim(gentity_t *self, int minAnim, int maxAnim); -extern void DoImpact( gentity_t *self, gentity_t *other, qboolean damageSelf, trace_t *trace ); +extern void DoImpact(gentity_t *self, gentity_t *other, qboolean damageSelf, trace_t *trace); #define PHASER_RECHARGE_TIME 100 extern saberMoveName_t transitionMove[Q_NUM_QUADS][Q_NUM_QUADS]; -extern Vehicle_t *G_IsRidingVehicle( gentity_t *ent ); -Vehicle_t *PM_RidingVehicle( void ) +extern Vehicle_t *G_IsRidingVehicle(gentity_t *ent); +Vehicle_t *PM_RidingVehicle(void) { - return (G_IsRidingVehicle( pm->gent )); + return (G_IsRidingVehicle(pm->gent)); } -extern qboolean G_ControlledByPlayer( gentity_t *self ); -qboolean PM_ControlledByPlayer( void ) +extern qboolean G_ControlledByPlayer(gentity_t *self); +qboolean PM_ControlledByPlayer(void) { - return G_ControlledByPlayer( pm->gent ); + return G_ControlledByPlayer(pm->gent); } -qboolean BG_UnrestrainedPitchRoll( playerState_t *ps, Vehicle_t *pVeh ) +qboolean BG_UnrestrainedPitchRoll(playerState_t *ps, Vehicle_t *pVeh) { -/* + /* if ( 0 && ps->clientNum < MAX_CLIENTS //real client - && ps->m_iVehicleNum//in a vehicle - && pVeh //valid vehicle data pointer - && pVeh->m_pVehicleInfo//valid vehicle info - && pVeh->m_pVehicleInfo->type == VH_FIGHTER )//fighter - //FIXME: specify per vehicle instead of assuming true for all fighters - //FIXME: map/server setting? + && ps->m_iVehicleNum//in a vehicle + && pVeh //valid vehicle data pointer + && pVeh->m_pVehicleInfo//valid vehicle info + && pVeh->m_pVehicleInfo->type == VH_FIGHTER )//fighter + //FIXME: specify per vehicle instead of assuming true for all fighters + //FIXME: map/server setting? {//can roll and pitch without limitation! - return qtrue; + return qtrue; }*/ return qfalse; } @@ -227,125 +231,125 @@ PM_AddEvent =============== */ -void PM_AddEvent( int newEvent ) +void PM_AddEvent(int newEvent) { - AddEventToPlayerstate( newEvent, 0, pm->ps ); + AddEventToPlayerstate(newEvent, 0, pm->ps); } -qboolean PM_PredictJumpSafe( vec3_t jumpHorizDir, float jumpHorizSpeed, float jumpVertSpeed, int predictTimeLength ) +qboolean PM_PredictJumpSafe(vec3_t jumpHorizDir, float jumpHorizSpeed, float jumpVertSpeed, int predictTimeLength) { return qtrue; } -void PM_GrabWallForJump( int anim ) +void PM_GrabWallForJump(int anim) {//NOTE!!! assumes an appropriate anim is being passed in!!! - PM_SetAnim( pm, SETANIM_BOTH, anim, SETANIM_FLAG_RESTART|SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 0 ); - PM_AddEvent( EV_JUMP );//make sound for grab + PM_SetAnim(pm, SETANIM_BOTH, anim, SETANIM_FLAG_RESTART | SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD, 0); + PM_AddEvent(EV_JUMP);//make sound for grab pm->ps->pm_flags |= PMF_STUCK_TO_WALL; } -qboolean PM_CheckGrabWall( trace_t *trace ) +qboolean PM_CheckGrabWall(trace_t *trace) { - if ( !pm->gent || !pm->gent->client ) + if (!pm->gent || !pm->gent->client) { return qfalse; } - if ( pm->gent->health <= 0 ) + if (pm->gent->health <= 0) {//must be alive return qfalse; } - if ( pm->gent->client->ps.groundEntityNum != ENTITYNUM_NONE ) + if (pm->gent->client->ps.groundEntityNum != ENTITYNUM_NONE) {//must be in air return qfalse; } - if ( trace->plane.normal[2] != 0 ) + if (trace->plane.normal[2] != 0) {//must be a flat wall return qfalse; } - if ( !trace->plane.normal[0] && !trace->plane.normal[1] ) + if (!trace->plane.normal[0] && !trace->plane.normal[1]) {//invalid normal return qfalse; } - if ( (trace->contents&(CONTENTS_PLAYERCLIP|CONTENTS_MONSTERCLIP)) ) + if ((trace->contents&(CONTENTS_PLAYERCLIP | CONTENTS_MONSTERCLIP))) {//can't jump off of clip brushes return qfalse; } - if ( pm->gent->client->ps.forcePowerLevel[FP_LEVITATION] < FORCE_LEVEL_1 ) + if (pm->gent->client->ps.forcePowerLevel[FP_LEVITATION] < FORCE_LEVEL_1) {//must have at least FJ 1 return qfalse; } - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) - && pm->gent->client->ps.forcePowerLevel[FP_LEVITATION] < FORCE_LEVEL_3 ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + && pm->gent->client->ps.forcePowerLevel[FP_LEVITATION] < FORCE_LEVEL_3) {//player must have force jump 3 return qfalse; } - if ( (pm->ps->saber[0].saberFlags&SFL_NO_WALL_GRAB) ) + if ((pm->ps->saber[0].saberFlags&SFL_NO_WALL_GRAB)) { return qfalse; } - if ( pm->ps->dualSabers - && (pm->ps->saber[1].saberFlags&SFL_NO_WALL_GRAB) ) + if (pm->ps->dualSabers + && (pm->ps->saber[1].saberFlags&SFL_NO_WALL_GRAB)) { return qfalse; } - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer())) {//player //only if we were in a longjump - if ( pm->ps->legsAnim != BOTH_FORCELONGLEAP_START - && pm->ps->legsAnim != BOTH_FORCELONGLEAP_ATTACK ) + if (pm->ps->legsAnim != BOTH_FORCELONGLEAP_START + && pm->ps->legsAnim != BOTH_FORCELONGLEAP_ATTACK) { return qfalse; } //hit a flat wall during our long jump, see if we should grab it vec3_t moveDir; - VectorCopy( pm->ps->velocity, moveDir ); - VectorNormalize( moveDir ); - if ( DotProduct( moveDir, trace->plane.normal ) > -0.65f ) + VectorCopy(pm->ps->velocity, moveDir); + VectorNormalize(moveDir); + if (DotProduct(moveDir, trace->plane.normal) > -0.65f) {//not enough of a direct impact, just slide off return qfalse; } - if ( fabs(trace->plane.normal[2]) > MAX_WALL_GRAB_SLOPE ) + if (fabs(trace->plane.normal[2]) > MAX_WALL_GRAB_SLOPE) { return qfalse; } //grab it! //FIXME: stop Matrix effect! - VectorClear( pm->ps->velocity ); + VectorClear(pm->ps->velocity); //FIXME: stop slidemove! //NOTE: we know it's forward, so... - PM_GrabWallForJump( BOTH_FORCEWALLREBOUND_FORWARD ); + PM_GrabWallForJump(BOTH_FORCEWALLREBOUND_FORWARD); return qtrue; } else {//NPCs - if ( PM_InReboundJump( pm->ps->legsAnim ) ) + if (PM_InReboundJump(pm->ps->legsAnim)) {//already in a rebound! return qfalse; } - if ( (pm->ps->eFlags&EF_FORCE_GRIPPED) ) + if ((pm->ps->eFlags&EF_FORCE_GRIPPED)) {//being gripped! return qfalse; } /* if ( pm->gent->painDebounceTime > level.time ) {//can't move! - return qfalse; + return qfalse; } if ( (pm->ps->pm_flags&PMF_TIME_KNOCKBACK) ) {//being thrown back! - return qfalse; + return qfalse; } */ - if ( pm->gent->NPC && (pm->gent->NPC->aiFlags&NPCAI_DIE_ON_IMPACT) ) + if (pm->gent->NPC && (pm->gent->NPC->aiFlags&NPCAI_DIE_ON_IMPACT)) {//faling to our death! return qfalse; } //FIXME: random chance, based on skill/rank? - if ( pm->ps->legsAnim != BOTH_FORCELONGLEAP_START - && pm->ps->legsAnim != BOTH_FORCELONGLEAP_ATTACK ) + if (pm->ps->legsAnim != BOTH_FORCELONGLEAP_START + && pm->ps->legsAnim != BOTH_FORCELONGLEAP_ATTACK) {//not in a long-jump - if ( !pm->gent->enemy ) + if (!pm->gent->enemy) {//no enemy return qfalse; } @@ -354,10 +358,10 @@ qboolean PM_CheckGrabWall( trace_t *trace ) //if ( pm->gent->enemy->currentOrigin[2] < (pm->ps->origin[2]-128) ) {//enemy is way below us vec3_t enemyDir; - VectorSubtract( pm->gent->enemy->currentOrigin, pm->ps->origin, enemyDir ); + VectorSubtract(pm->gent->enemy->currentOrigin, pm->ps->origin, enemyDir); enemyDir[2] = 0; - VectorNormalize( enemyDir ); - if ( DotProduct( enemyDir, trace->plane.normal ) < 0.65f ) + VectorNormalize(enemyDir); + if (DotProduct(enemyDir, trace->plane.normal) < 0.65f) {//jumping off this wall would not launch me in the general direction of my enemy return qfalse; } @@ -365,19 +369,19 @@ qboolean PM_CheckGrabWall( trace_t *trace ) } } //FIXME: check for ground close beneath us? - //FIXME: check for obstructions in the dir we're going to jump + //FIXME: check for obstructions in the dir we're going to jump // - including "do not enter" brushes! //hit a flat wall during our long jump, see if we should grab it vec3_t moveDir; - VectorCopy( pm->ps->velocity, moveDir ); - VectorNormalize( moveDir ); - if ( DotProduct( moveDir, trace->plane.normal ) > -0.65f ) + VectorCopy(pm->ps->velocity, moveDir); + VectorNormalize(moveDir); + if (DotProduct(moveDir, trace->plane.normal) > -0.65f) {//not enough of a direct impact, just slide off return qfalse; } //Okay, now see if jumping off this thing would send us into a do not enter brush - if ( !PM_PredictJumpSafe( trace->plane.normal, JUMP_OFF_WALL_SPEED, G_ForceWallJumpStrength(), 1500 ) ) + if (!PM_PredictJumpSafe(trace->plane.normal, JUMP_OFF_WALL_SPEED, G_ForceWallJumpStrength(), 1500)) {//we would hit a do not enter brush, so don't grab the wall return qfalse; } @@ -386,15 +390,15 @@ qboolean PM_CheckGrabWall( trace_t *trace ) //Pick the proper anim int anim = BOTH_FORCEWALLREBOUND_FORWARD; vec3_t facingAngles, wallDir, fwdDir, rtDir; - VectorSubtract( trace->endpos, pm->gent->lastOrigin, wallDir ); + VectorSubtract(trace->endpos, pm->gent->lastOrigin, wallDir); wallDir[2] = 0; - VectorNormalize( wallDir ); - VectorSet( facingAngles, 0, pm->ps->viewangles[YAW], 0 ); - AngleVectors( facingAngles, fwdDir, rtDir, NULL ); - float fDot = DotProduct( fwdDir, wallDir ); - if ( fabs( fDot ) >= 0.5f ) + VectorNormalize(wallDir); + VectorSet(facingAngles, 0, pm->ps->viewangles[YAW], 0); + AngleVectors(facingAngles, fwdDir, rtDir, NULL); + float fDot = DotProduct(fwdDir, wallDir); + if (fabs(fDot) >= 0.5f) {//hit a wall in front/behind - if ( fDot > 0.0f ) + if (fDot > 0.0f) {//in front anim = BOTH_FORCEWALLREBOUND_FORWARD; } @@ -403,7 +407,7 @@ qboolean PM_CheckGrabWall( trace_t *trace ) anim = BOTH_FORCEWALLREBOUND_BACK; } } - else if ( DotProduct( rtDir, wallDir ) > 0 ) + else if (DotProduct(rtDir, wallDir) > 0) {//hit a wall on the right anim = BOTH_FORCEWALLREBOUND_RIGHT; } @@ -411,9 +415,9 @@ qboolean PM_CheckGrabWall( trace_t *trace ) {//hit a wall on the left anim = BOTH_FORCEWALLREBOUND_LEFT; } - VectorClear( pm->ps->velocity ); + VectorClear(pm->ps->velocity); //FIXME: stop slidemove! - PM_GrabWallForJump( anim ); + PM_GrabWallForJump(anim); return qtrue; } //return qfalse; @@ -424,38 +428,38 @@ qboolean PM_ClientImpact( trace_t *trace, qboolean damageSelf ) =============== */ -qboolean PM_ClientImpact( trace_t *trace, qboolean damageSelf ) +qboolean PM_ClientImpact(trace_t *trace, qboolean damageSelf) { gentity_t *traceEnt; int otherEntityNum = trace->entityNum; - if ( !pm->gent ) + if (!pm->gent) { return qfalse; } traceEnt = &g_entities[otherEntityNum]; - if ( otherEntityNum == ENTITYNUM_WORLD - || (traceEnt->bmodel && traceEnt->s.pos.trType == TR_STATIONARY ) ) + if (otherEntityNum == ENTITYNUM_WORLD + || (traceEnt->bmodel && traceEnt->s.pos.trType == TR_STATIONARY)) {//hit world or a non-moving brush - if ( PM_CheckGrabWall( trace ) ) + if (PM_CheckGrabWall(trace)) {//stopped on the wall return qtrue; } } - if( (VectorLength( pm->ps->velocity )*(pm->gent->mass/10)) >= 100 && (pm->gent->client->NPC_class == CLASS_VEHICLE || pm->ps->lastOnGround+100material>=MAT_GLASS&&pm->gent->lastImpact+100<=level.time)) + if ((VectorLength(pm->ps->velocity)*(pm->gent->mass / 10)) >= 100 && (pm->gent->client->NPC_class == CLASS_VEHICLE || pm->ps->lastOnGround + 100material>=MAT_GLASS&&pm->gent->lastImpact+100<=level.time)) { - DoImpact( pm->gent, &g_entities[otherEntityNum], damageSelf, trace ); + DoImpact(pm->gent, &g_entities[otherEntityNum], damageSelf, trace); } - if ( otherEntityNum >= ENTITYNUM_WORLD ) + if (otherEntityNum >= ENTITYNUM_WORLD) { return qfalse; } - if ( !traceEnt || !(traceEnt->contents&pm->tracemask) ) + if (!traceEnt || !(traceEnt->contents&pm->tracemask)) {//it's dead or not in my way anymore return qtrue; } @@ -467,19 +471,19 @@ qboolean PM_ClientImpact( trace_t *trace, qboolean damageSelf ) PM_AddTouchEnt =============== */ -void PM_AddTouchEnt( int entityNum ) { +void PM_AddTouchEnt(int entityNum) { int i; - if ( entityNum == ENTITYNUM_WORLD ) { + if (entityNum == ENTITYNUM_WORLD) { return; } - if ( pm->numtouch == MAXTOUCH ) { + if (pm->numtouch == MAXTOUCH) { return; } // see if it is already added - for ( i = 0 ; i < pm->numtouch ; i++ ) { - if ( pm->touchents[ i ] == entityNum ) { + for (i = 0; i < pm->numtouch; i++) { + if (pm->touchents[i] == entityNum) { return; } } @@ -498,40 +502,41 @@ PM_ClipVelocity Slide off of the impacting surface - This will pull you down onto slopes if heading away from - them and push you up them as you go up them. - Also stops you when you hit walls. +This will pull you down onto slopes if heading away from +them and push you up them as you go up them. +Also stops you when you hit walls. ================== */ -void PM_ClipVelocity( vec3_t in, vec3_t normal, vec3_t out, float overbounce ) { +void PM_ClipVelocity(vec3_t in, vec3_t normal, vec3_t out, float overbounce) { float backoff; float change; float oldInZ; int i; - - if ( (pm->ps->pm_flags&PMF_STUCK_TO_WALL) ) + + if ((pm->ps->pm_flags&PMF_STUCK_TO_WALL)) {//no sliding! - VectorCopy( in, out ); + VectorCopy(in, out); return; } oldInZ = in[2]; - backoff = DotProduct (in, normal); - - if ( backoff < 0 ) { + backoff = DotProduct(in, normal); + + if (backoff < 0) { backoff *= overbounce; - } else { + } + else { backoff /= overbounce; } - for ( i=0 ; i<3 ; i++ ) + for (i = 0; i<3; i++) { - change = normal[i]*backoff; + change = normal[i] * backoff; /* if ( i == 2 && Flying == FLY_HOVER && change > 0 ) {//don't pull a hovercraft down - change = 0; + change = 0; } else */ @@ -539,12 +544,12 @@ void PM_ClipVelocity( vec3_t in, vec3_t normal, vec3_t out, float overbounce ) { out[i] = in[i] - change; } } - if ( g_stepSlideFix->integer ) + if (g_stepSlideFix->integer) { - if ( pm->ps->clientNum < MAX_CLIENTS//normal player - && normal[2] < MIN_WALK_NORMAL )//sliding against a steep slope + if (pm->ps->clientNum < MAX_CLIENTS//normal player + && normal[2] < MIN_WALK_NORMAL)//sliding against a steep slope { - if ( pm->ps->groundEntityNum != ENTITYNUM_NONE )//on the ground + if (pm->ps->groundEntityNum != ENTITYNUM_NONE)//on the ground {//if walking on the ground, don't slide up slopes that are too steep to walk on out[2] = oldInZ; } @@ -560,16 +565,16 @@ PM_Friction Handles both ground friction and water friction ================== */ -static void PM_Friction( void ) { +static void PM_Friction(void) { vec3_t vec; float *vel; float speed, newspeed, control; float drop, friction = pm->ps->friction; - + vel = pm->ps->velocity; - - VectorCopy( vel, vec ); - if ( pml.walking ) { + + VectorCopy(vel, vec); + if (pml.walking) { vec[2] = 0; // ignore slope movement } @@ -584,64 +589,64 @@ static void PM_Friction( void ) { drop = 0; // apply ground friction, even if on ladder - if ( pm->gent - && pm->gent->client + if (pm->gent + && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE && pm->gent->m_pVehicle - && pm->gent->m_pVehicle->m_pVehicleInfo->type != VH_ANIMAL ) + && pm->gent->m_pVehicle->m_pVehicleInfo->type != VH_ANIMAL) { friction = pm->gent->m_pVehicle->m_pVehicleInfo->friction; - if ( pm->gent->m_pVehicle && pm->gent->m_pVehicle->m_pVehicleInfo->hoverHeight > 0 ) + if (pm->gent->m_pVehicle && pm->gent->m_pVehicle->m_pVehicleInfo->hoverHeight > 0) {//in a hovering vehicle, have air control - if ( pm->gent->m_pVehicle->m_ulFlags & VEH_FLYING ) + if (pm->gent->m_pVehicle->m_ulFlags & VEH_FLYING) { friction = 0.10f; } } - if ( !(pm->ps->pm_flags & PMF_TIME_KNOCKBACK) && !(pm->ps->pm_flags & PMF_TIME_NOFRICTION) ) + if (!(pm->ps->pm_flags & PMF_TIME_KNOCKBACK) && !(pm->ps->pm_flags & PMF_TIME_NOFRICTION)) { control = speed < pm_stopspeed ? pm_stopspeed : speed; drop += control*friction*pml.frametime; /* if ( Flying == FLY_HOVER ) { - if ( pm->cmd.rightmove ) - {//if turning, increase friction - control *= 2.0f; - } - if ( pm->ps->groundEntityNum < ENTITYNUM_NONE ) - {//on the ground - drop += control*friction*pml.frametime; - } - else if ( pml.groundPlane ) - {//on a slope - drop += control*friction*2.0f*pml.frametime; - } - else - {//in air - drop += control*2.0f*friction*pml.frametime; - } + if ( pm->cmd.rightmove ) + {//if turning, increase friction + control *= 2.0f; + } + if ( pm->ps->groundEntityNum < ENTITYNUM_NONE ) + {//on the ground + drop += control*friction*pml.frametime; + } + else if ( pml.groundPlane ) + {//on a slope + drop += control*friction*2.0f*pml.frametime; + } + else + {//in air + drop += control*2.0f*friction*pml.frametime; + } } */ } } - else if ( Flying != FLY_NORMAL ) + else if (Flying != FLY_NORMAL) { - if ( (pm->watertype & CONTENTS_LADDER) || pm->waterlevel <= 1 ) + if ((pm->watertype & CONTENTS_LADDER) || pm->waterlevel <= 1) { - if ( (pm->watertype & CONTENTS_LADDER) || (pml.walking && !(pml.groundTrace.surfaceFlags & SURF_SLICK)) ) + if ((pm->watertype & CONTENTS_LADDER) || (pml.walking && !(pml.groundTrace.surfaceFlags & SURF_SLICK))) { - // if getting knocked back, no friction - if ( !(pm->ps->pm_flags & PMF_TIME_KNOCKBACK) && !(pm->ps->pm_flags & PMF_TIME_NOFRICTION) ) + // if getting knocked back, no friction + if (!(pm->ps->pm_flags & PMF_TIME_KNOCKBACK) && !(pm->ps->pm_flags & PMF_TIME_NOFRICTION)) { - if ( pm->ps->legsAnim == BOTH_FORCELONGLEAP_START + if (pm->ps->legsAnim == BOTH_FORCELONGLEAP_START || pm->ps->legsAnim == BOTH_FORCELONGLEAP_ATTACK - || pm->ps->legsAnim == BOTH_FORCELONGLEAP_LAND ) + || pm->ps->legsAnim == BOTH_FORCELONGLEAP_LAND) {//super forward jump - if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + if (pm->ps->groundEntityNum != ENTITYNUM_NONE) {//not in air - if ( pm->cmd.forwardmove < 0 ) + if (pm->cmd.forwardmove < 0) {//trying to hold back some friction *= 0.5f;//0.25f; } @@ -650,10 +655,10 @@ static void PM_Friction( void ) { friction *= 0.2f;//0.1f; } pm->cmd.forwardmove = pm->cmd.rightmove = 0; - if ( pml.groundPlane && pm->ps->legsAnim == BOTH_FORCELONGLEAP_LAND ) + if (pml.groundPlane && pm->ps->legsAnim == BOTH_FORCELONGLEAP_LAND) { //slide effect - G_PlayEffect( "env/slide_dust", pml.groundTrace.endpos, pml.groundTrace.plane.normal ); + G_PlayEffect("env/slide_dust", pml.groundTrace.endpos, pml.groundTrace.plane.normal); //FIXME: slide sound } } @@ -661,10 +666,10 @@ static void PM_Friction( void ) { /* else if ( pm->cmd.buttons & BUTTON_USE ) {//If the use key is pressed. slow the player more quickly - if ( pm->gent->client->NPC_class != CLASS_VEHICLE ) // if not in a vehicle... - {//in a vehicle, use key makes you turbo-boost - friction *= pm_frictionModifier; - } + if ( pm->gent->client->NPC_class != CLASS_VEHICLE ) // if not in a vehicle... + {//in a vehicle, use key makes you turbo-boost + friction *= pm_frictionModifier; + } } */ @@ -674,17 +679,17 @@ static void PM_Friction( void ) { } } } - else if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) - && pm->gent - && pm->gent->client - && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) && pm->gent->client->moveType == MT_FLYSWIM ) + else if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + && pm->gent + && pm->gent->client + && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) && pm->gent->client->moveType == MT_FLYSWIM) {//player as Boba drop += speed*pm_waterfriction*pml.frametime; } - - if ( Flying == FLY_VEHICLE ) + + if (Flying == FLY_VEHICLE) { - if ( !(pm->ps->pm_flags & PMF_TIME_KNOCKBACK) && !(pm->ps->pm_flags & PMF_TIME_NOFRICTION) ) + if (!(pm->ps->pm_flags & PMF_TIME_KNOCKBACK) && !(pm->ps->pm_flags & PMF_TIME_NOFRICTION)) { control = speed < pm_stopspeed ? pm_stopspeed : speed; drop += control*friction*pml.frametime; @@ -692,16 +697,16 @@ static void PM_Friction( void ) { } // apply water friction even if just wading - if ( !waterForceJump ) + if (!waterForceJump) { - if ( pm->waterlevel && !(pm->watertype & CONTENTS_LADDER)) + if (pm->waterlevel && !(pm->watertype & CONTENTS_LADDER)) { drop += speed*pm_waterfriction*pm->waterlevel*pml.frametime; } } - + // apply flying friction - if ( pm->ps->pm_type == PM_SPECTATOR ) + if (pm->ps->pm_type == PM_SPECTATOR) { drop += speed*pm_flightfriction*pml.frametime; } @@ -727,25 +732,25 @@ Handles user intended acceleration ============== */ -static void PM_Accelerate( vec3_t wishdir, float wishspeed, float accel ) +static void PM_Accelerate(vec3_t wishdir, float wishspeed, float accel) { int i; float addspeed, accelspeed, currentspeed; - currentspeed = DotProduct (pm->ps->velocity, wishdir); + currentspeed = DotProduct(pm->ps->velocity, wishdir); addspeed = wishspeed - currentspeed; - + if (addspeed <= 0) { return; } - accelspeed = ( accel * pml.frametime ) * wishspeed; + accelspeed = (accel * pml.frametime) * wishspeed; if (accelspeed > addspeed) { accelspeed = addspeed; } - for (i=0 ; i<3 ; i++) { - pm->ps->velocity[i] += accelspeed * wishdir[i]; + for (i = 0; i<3; i++) { + pm->ps->velocity[i] += accelspeed * wishdir[i]; } } @@ -758,28 +763,28 @@ This allows the clients to use axial -127 to 127 values for all directions without getting a sqrt(2) distortion in speed. ============ */ -static float PM_CmdScale( usercmd_t *cmd ) +static float PM_CmdScale(usercmd_t *cmd) { int max; float total; float scale; - max = abs( cmd->forwardmove ); - - if ( abs( cmd->rightmove ) > max ) { - max = abs( cmd->rightmove ); + max = abs(cmd->forwardmove); + + if (abs(cmd->rightmove) > max) { + max = abs(cmd->rightmove); } - if ( abs( cmd->upmove ) > max ) { - max = abs( cmd->upmove ); + if (abs(cmd->upmove) > max) { + max = abs(cmd->upmove); } - if ( !max ) { + if (!max) { return 0; } - total = sqrt( (float)(( cmd->forwardmove * cmd->forwardmove ) - + ( cmd->rightmove * cmd->rightmove ) - + ( cmd->upmove * cmd->upmove )) ); - - scale = (float) pm->ps->speed * max / ( 127.0f * total ); + total = sqrt((float)((cmd->forwardmove * cmd->forwardmove) + + (cmd->rightmove * cmd->rightmove) + + (cmd->upmove * cmd->upmove))); + + scale = (float)pm->ps->speed * max / (127.0f * total); return scale; } @@ -793,34 +798,43 @@ Determine the rotation of the legs reletive to the facing dir ================ */ -static void PM_SetMovementDir( void ) { - if ( pm->cmd.forwardmove || pm->cmd.rightmove ) { - if ( pm->cmd.rightmove == 0 && pm->cmd.forwardmove > 0 ) { +static void PM_SetMovementDir(void) { + if (pm->cmd.forwardmove || pm->cmd.rightmove) { + if (pm->cmd.rightmove == 0 && pm->cmd.forwardmove > 0) { pm->ps->movementDir = 0; - } else if ( pm->cmd.rightmove < 0 && pm->cmd.forwardmove > 0 ) { + } + else if (pm->cmd.rightmove < 0 && pm->cmd.forwardmove > 0) { pm->ps->movementDir = 1; - } else if ( pm->cmd.rightmove < 0 && pm->cmd.forwardmove == 0 ) { + } + else if (pm->cmd.rightmove < 0 && pm->cmd.forwardmove == 0) { pm->ps->movementDir = 2; - } else if ( pm->cmd.rightmove < 0 && pm->cmd.forwardmove < 0 ) { + } + else if (pm->cmd.rightmove < 0 && pm->cmd.forwardmove < 0) { pm->ps->movementDir = 3; - } else if ( pm->cmd.rightmove == 0 && pm->cmd.forwardmove < 0 ) { + } + else if (pm->cmd.rightmove == 0 && pm->cmd.forwardmove < 0) { pm->ps->movementDir = 4; - } else if ( pm->cmd.rightmove > 0 && pm->cmd.forwardmove < 0 ) { + } + else if (pm->cmd.rightmove > 0 && pm->cmd.forwardmove < 0) { pm->ps->movementDir = 5; - } else if ( pm->cmd.rightmove > 0 && pm->cmd.forwardmove == 0 ) { + } + else if (pm->cmd.rightmove > 0 && pm->cmd.forwardmove == 0) { pm->ps->movementDir = 6; - } else if ( pm->cmd.rightmove > 0 && pm->cmd.forwardmove > 0 ) { + } + else if (pm->cmd.rightmove > 0 && pm->cmd.forwardmove > 0) { pm->ps->movementDir = 7; } - } else { + } + else { // if they aren't actively going directly sideways, // change the animation to the diagonal so they // don't stop too crooked - if ( pm->ps->movementDir == 2 ) { + if (pm->ps->movementDir == 2) { pm->ps->movementDir = 1; - } else if ( pm->ps->movementDir == 6 ) { + } + else if (pm->ps->movementDir == 6) { pm->ps->movementDir = 7; - } + } } } @@ -831,9 +845,9 @@ PM_CheckJump ============= */ #define METROID_JUMP 1 -qboolean PM_InReboundJump( int anim ) +qboolean PM_InReboundJump(int anim) { - switch ( anim ) + switch (anim) { case BOTH_FORCEWALLREBOUND_FORWARD: case BOTH_FORCEWALLREBOUND_LEFT: @@ -845,9 +859,9 @@ qboolean PM_InReboundJump( int anim ) return qfalse; } -qboolean PM_InReboundHold( int anim ) +qboolean PM_InReboundHold(int anim) { - switch ( anim ) + switch (anim) { case BOTH_FORCEWALLHOLD_FORWARD: case BOTH_FORCEWALLHOLD_LEFT: @@ -859,9 +873,9 @@ qboolean PM_InReboundHold( int anim ) return qfalse; } -qboolean PM_InReboundRelease( int anim ) +qboolean PM_InReboundRelease(int anim) { - switch ( anim ) + switch (anim) { case BOTH_FORCEWALLRELEASE_FORWARD: case BOTH_FORCEWALLRELEASE_LEFT: @@ -873,9 +887,9 @@ qboolean PM_InReboundRelease( int anim ) return qfalse; } -qboolean PM_InBackFlip( int anim ) +qboolean PM_InBackFlip(int anim) { - switch ( anim ) + switch (anim) { case BOTH_FLIP_BACK1: case BOTH_FLIP_BACK2: @@ -887,9 +901,9 @@ qboolean PM_InBackFlip( int anim ) return qfalse; } -qboolean PM_InSpecialJump( int anim ) +qboolean PM_InSpecialJump(int anim) { - switch ( anim ) + switch (anim) { case BOTH_WALL_RUN_RIGHT: case BOTH_WALL_RUN_RIGHT_STOP: @@ -928,38 +942,38 @@ qboolean PM_InSpecialJump( int anim ) case BOTH_A7_SOULCAL: return qtrue; } - if ( PM_InReboundJump( anim ) ) + if (PM_InReboundJump(anim)) { return qtrue; } - if ( PM_InReboundHold( anim ) ) + if (PM_InReboundHold(anim)) { return qtrue; } - if ( PM_InReboundRelease( anim ) ) + if (PM_InReboundRelease(anim)) { return qtrue; } - if ( PM_InBackFlip( anim ) ) + if (PM_InBackFlip(anim)) { return qtrue; } return qfalse; } -extern void CG_PlayerLockedWeaponSpeech( int jumping ); -qboolean PM_ForceJumpingUp( gentity_t *gent ) +extern void CG_PlayerLockedWeaponSpeech(int jumping); +qboolean PM_ForceJumpingUp(gentity_t *gent) { - if ( !gent || !gent->client ) + if (!gent || !gent->client) { return qfalse; } - if ( gent->NPC ) + if (gent->NPC) {//this is ONLY for the player - if ( player - && player->client - && player->client->ps.viewEntity == gent->s.number ) + if (player + && player->client + && player->client->ps.viewEntity == gent->s.number) {//okay to jump if an NPC controlled by the player } else @@ -968,33 +982,33 @@ qboolean PM_ForceJumpingUp( gentity_t *gent ) } } - if ( !(gent->client->ps.forcePowersActive&(1<client->ps.forceJumpCharge ) + if (!(gent->client->ps.forcePowersActive&(1 << FP_LEVITATION)) && gent->client->ps.forceJumpCharge) {//already jumped and let go return qfalse; } - if ( PM_InSpecialJump( gent->client->ps.legsAnim ) ) + if (PM_InSpecialJump(gent->client->ps.legsAnim)) { return qfalse; } - if ( PM_InKnockDown( &gent->client->ps ) ) + if (PM_InKnockDown(&gent->client->ps)) { return qfalse; } - - if ( (gent->s.numbers.numberclient->ps.groundEntityNum == ENTITYNUM_NONE //in air - && ( (gent->client->ps.pm_flags&PMF_JUMPING) && gent->client->ps.velocity[2] > 0 )//jumped & going up or at water surface///*(gent->client->ps.waterHeightLevel==WHL_SHOULDERS&&gent->client->usercmd.upmove>0) ||*/ + if (gent->client->ps.groundEntityNum == ENTITYNUM_NONE //in air + && ((gent->client->ps.pm_flags&PMF_JUMPING) && gent->client->ps.velocity[2] > 0)//jumped & going up or at water surface///*(gent->client->ps.waterHeightLevel==WHL_SHOULDERS&&gent->client->usercmd.upmove>0) ||*/ && gent->client->ps.forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0 //force-jump capable - && !(gent->client->ps.pm_flags&PMF_TRIGGER_PUSHED) )//not pushed by a trigger + && !(gent->client->ps.pm_flags&PMF_TRIGGER_PUSHED))//not pushed by a trigger { - if( gent->flags & FL_LOCK_PLAYER_WEAPONS ) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one + if (gent->flags & FL_LOCK_PLAYER_WEAPONS) // yes this locked weapons check also includes force powers, if we need a separate check later I'll make one { - CG_PlayerLockedWeaponSpeech( qtrue ); + CG_PlayerLockedWeaponSpeech(qtrue); return qfalse; } return qtrue; @@ -1002,25 +1016,25 @@ qboolean PM_ForceJumpingUp( gentity_t *gent ) return qfalse; } -static void PM_JumpForDir( void ) +static void PM_JumpForDir(void) { int anim = BOTH_JUMP1; - if ( pm->cmd.forwardmove > 0 ) + if (pm->cmd.forwardmove > 0) { anim = BOTH_JUMP1; pm->ps->pm_flags &= ~PMF_BACKWARDS_JUMP; - } - else if ( pm->cmd.forwardmove < 0 ) + } + else if (pm->cmd.forwardmove < 0) { anim = BOTH_JUMPBACK1; pm->ps->pm_flags |= PMF_BACKWARDS_JUMP; } - else if ( pm->cmd.rightmove > 0 ) + else if (pm->cmd.rightmove > 0) { anim = BOTH_JUMPRIGHT1; pm->ps->pm_flags &= ~PMF_BACKWARDS_JUMP; } - else if ( pm->cmd.rightmove < 0 ) + else if (pm->cmd.rightmove < 0) { anim = BOTH_JUMPLEFT1; pm->ps->pm_flags &= ~PMF_BACKWARDS_JUMP; @@ -1030,126 +1044,126 @@ static void PM_JumpForDir( void ) anim = BOTH_JUMP1; pm->ps->pm_flags &= ~PMF_BACKWARDS_JUMP; } - if(!PM_InDeathAnim()) + if (!PM_InDeathAnim()) { - PM_SetAnim(pm,SETANIM_LEGS,anim,SETANIM_FLAG_OVERRIDE, 100); // Only blend over 100ms + PM_SetAnim(pm, SETANIM_LEGS, anim, SETANIM_FLAG_OVERRIDE, 100); // Only blend over 100ms } } -qboolean PM_GentCantJump( gentity_t *gent ) +qboolean PM_GentCantJump(gentity_t *gent) {//FIXME: ugh, hacky, set a flag on NPC or something, please... - if ( gent && gent->client && - ( gent->client->NPC_class == CLASS_ATST || - gent->client->NPC_class == CLASS_GONK || - gent->client->NPC_class == CLASS_MARK1 || - gent->client->NPC_class == CLASS_MARK2 || - gent->client->NPC_class == CLASS_MOUSE || - gent->client->NPC_class == CLASS_PROBE || - gent->client->NPC_class == CLASS_PROTOCOL || - gent->client->NPC_class == CLASS_R2D2 || - gent->client->NPC_class == CLASS_R5D2 || - gent->client->NPC_class == CLASS_SEEKER || - gent->client->NPC_class == CLASS_REMOTE || - gent->client->NPC_class == CLASS_SENTRY ) ) + if (gent && gent->client && + (gent->client->NPC_class == CLASS_ATST || + gent->client->NPC_class == CLASS_GONK || + gent->client->NPC_class == CLASS_MARK1 || + gent->client->NPC_class == CLASS_MARK2 || + gent->client->NPC_class == CLASS_MOUSE || + gent->client->NPC_class == CLASS_PROBE || + gent->client->NPC_class == CLASS_PROTOCOL || + gent->client->NPC_class == CLASS_R2D2 || + gent->client->NPC_class == CLASS_R5D2 || + gent->client->NPC_class == CLASS_SEEKER || + gent->client->NPC_class == CLASS_REMOTE || + gent->client->NPC_class == CLASS_SENTRY)) { return qtrue; } return qfalse; } -static qboolean PM_CheckJump( void ) +static qboolean PM_CheckJump(void) { //Don't allow jump until all buttons are up - if ( pm->ps->pm_flags & PMF_RESPAWNED ) { - return qfalse; + if (pm->ps->pm_flags & PMF_RESPAWNED) { + return qfalse; } - if ( PM_InKnockDown( pm->ps ) || PM_InRoll( pm->ps ) ) + if (PM_InKnockDown(pm->ps) || PM_InRoll(pm->ps)) {//in knockdown - return qfalse; + return qfalse; } - if ( PM_GentCantJump( pm->gent ) ) + if (PM_GentCantJump(pm->gent)) { - return qfalse; + return qfalse; } - if ( PM_KickingAnim( pm->ps->legsAnim ) && !PM_InAirKickingAnim( pm->ps->legsAnim ) ) + if (PM_KickingAnim(pm->ps->legsAnim) && !PM_InAirKickingAnim(pm->ps->legsAnim)) {//can't jump when in a kicking anim return qfalse; } /* if ( pm->cmd.buttons & BUTTON_FORCEJUMP ) { - pm->ps->pm_flags |= PMF_JUMP_HELD; + pm->ps->pm_flags |= PMF_JUMP_HELD; } */ #if METROID_JUMP - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) - && pm->gent && pm->gent->client - && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + && pm->gent && pm->gent->client + && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER)) {//player playing as boba fett - if ( pm->cmd.upmove > 0 ) + if (pm->cmd.upmove > 0) {//turn on/go up - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE && !(pm->ps->pm_flags&PMF_JUMP_HELD) ) + if (pm->ps->groundEntityNum == ENTITYNUM_NONE && !(pm->ps->pm_flags&PMF_JUMP_HELD)) {//double-tap - must activate while in air - if ( !JET_Flying( pm->gent ) ) + if (!JET_Flying(pm->gent)) { - JET_FlyStart( pm->gent ); + JET_FlyStart(pm->gent); } } } - else if ( pm->cmd.upmove < 0 ) + else if (pm->cmd.upmove < 0) {//turn it off (or should we just go down)? /* if ( JET_Flying( pm->gent ) ) { - JET_FlyStop( pm->gent ); + JET_FlyStop( pm->gent ); } */ } } - else if ( pm->waterlevel < 3 )//|| (pm->ps->waterHeightLevel==WHL_SHOULDERS&&pm->cmd.upmove>0) ) + else if (pm->waterlevel < 3)//|| (pm->ps->waterHeightLevel==WHL_SHOULDERS&&pm->cmd.upmove>0) ) { - if ( pm->ps->gravity > 0 ) + if (pm->ps->gravity > 0) {//can't do this in zero-G - if ( pm->ps->legsAnim == BOTH_FORCELONGLEAP_START + if (pm->ps->legsAnim == BOTH_FORCELONGLEAP_START || pm->ps->legsAnim == BOTH_FORCELONGLEAP_ATTACK - || pm->ps->legsAnim == BOTH_FORCELONGLEAP_LAND ) + || pm->ps->legsAnim == BOTH_FORCELONGLEAP_LAND) {//in the middle of a force long-jump /* - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE - && pm->cmd.upmove > 0 - && pm->cmd.forwardmove > 0 ) + if ( pm->ps->groundEntityNum == ENTITYNUM_NONE + && pm->cmd.upmove > 0 + && pm->cmd.forwardmove > 0 ) */ - if ( (pm->ps->legsAnim == BOTH_FORCELONGLEAP_START || pm->ps->legsAnim == BOTH_FORCELONGLEAP_ATTACK) - && pm->ps->legsAnimTimer > 0 ) + if ((pm->ps->legsAnim == BOTH_FORCELONGLEAP_START || pm->ps->legsAnim == BOTH_FORCELONGLEAP_ATTACK) + && pm->ps->legsAnimTimer > 0) {//in the air //FIXME: need an actual set time so it doesn't matter when the attack happens //FIXME: make sure we don't jump further than force jump 3 allows vec3_t jFwdAngs, jFwdVec; - VectorSet( jFwdAngs, 0, pm->ps->viewangles[YAW], 0 ); - AngleVectors( jFwdAngs, jFwdVec, NULL, NULL ); + VectorSet(jFwdAngs, 0, pm->ps->viewangles[YAW], 0); + AngleVectors(jFwdAngs, jFwdVec, NULL, NULL); float oldZVel = pm->ps->velocity[2]; - if ( pm->ps->legsAnimTimer > 150 && oldZVel < 0 ) + if (pm->ps->legsAnimTimer > 150 && oldZVel < 0) { oldZVel = 0; } - VectorScale( jFwdVec, FORCE_LONG_LEAP_SPEED, pm->ps->velocity ); + VectorScale(jFwdVec, FORCE_LONG_LEAP_SPEED, pm->ps->velocity); pm->ps->velocity[2] = oldZVel; pm->ps->pm_flags |= PMF_JUMP_HELD; - pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; - pm->ps->forcePowersActive |= (1<ps->pm_flags |= PMF_JUMPING | PMF_SLOW_MO_FALL; + pm->ps->forcePowersActive |= (1 << FP_LEVITATION); return qtrue; } else {//landing-slide - if ( pm->ps->legsAnim == BOTH_FORCELONGLEAP_START - || pm->ps->legsAnim == BOTH_FORCELONGLEAP_ATTACK ) + if (pm->ps->legsAnim == BOTH_FORCELONGLEAP_START + || pm->ps->legsAnim == BOTH_FORCELONGLEAP_ATTACK) {//still in start anim, but it's run out - pm->ps->forcePowersActive |= (1<ps->groundEntityNum == ENTITYNUM_NONE ) + pm->ps->forcePowersActive |= (1 << FP_LEVITATION); + if (pm->ps->groundEntityNum == ENTITYNUM_NONE) {//still in air? //hold it for another 50ms //PM_SetAnim( pm, SETANIM_BOTH, BOTH_FORCELONGLEAP_START, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); @@ -1158,104 +1172,104 @@ static qboolean PM_CheckJump( void ) else {//in land-slide anim //FIXME: force some forward movement? Less if holding back? - } - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE//still in air - && pm->ps->origin[2] < pm->ps->jumpZStart )//dropped below original jump start - {//slow down - pm->ps->velocity[0] *= 0.75f; - pm->ps->velocity[1] *= 0.75f; - if ( (pm->ps->velocity[0]+pm->ps->velocity[1])*0.5f<=10.0f ) + } + if (pm->ps->groundEntityNum == ENTITYNUM_NONE//still in air + && pm->ps->origin[2] < pm->ps->jumpZStart)//dropped below original jump start + {//slow down + pm->ps->velocity[0] *= 0.75f; + pm->ps->velocity[1] *= 0.75f; + if ((pm->ps->velocity[0] + pm->ps->velocity[1])*0.5f <= 10.0f) {//falling straight down - PM_SetAnim( pm, SETANIM_BOTH, BOTH_FORCEINAIR1, SETANIM_FLAG_OVERRIDE ); + PM_SetAnim(pm, SETANIM_BOTH, BOTH_FORCEINAIR1, SETANIM_FLAG_OVERRIDE); } } return qfalse; } } - else if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) //player-only for now + else if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) //player-only for now && pm->cmd.upmove > 0 //trying to jump && pm->ps->forcePowerLevel[FP_LEVITATION] >= FORCE_LEVEL_3 //force jump 3 or better && pm->ps->forcePower >= FORCE_LONGJUMP_POWER //this costs 20 force to do - && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1 << FP_SPEED)) //force-speed is on && pm->cmd.forwardmove > 0 //pushing forward && !pm->cmd.rightmove //not strafing && pm->ps->groundEntityNum != ENTITYNUM_NONE//not in mid-air && !(pm->ps->pm_flags&PMF_JUMP_HELD) //&& (float)(level.time-pm->ps->lastStationary) >= (3000.0f*g_timescale->value)//have to have a 3 second running start - relative to force speed slowdown - && (level.time-pm->ps->forcePowerDebounce[FP_SPEED]) <= 250//have to have just started the force speed within the last half second - && pm->gent ) + && (level.time - pm->ps->forcePowerDebounce[FP_SPEED]) <= 250//have to have just started the force speed within the last half second + && pm->gent) {//start a force long-jump! vec3_t jFwdAngs, jFwdVec; //BOTH_FORCELONGLEAP_ATTACK if holding attack, too? - PM_SetAnim( pm, SETANIM_BOTH, BOTH_FORCELONGLEAP_START, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - VectorSet( jFwdAngs, 0, pm->ps->viewangles[YAW], 0 ); - AngleVectors( jFwdAngs, jFwdVec, NULL, NULL ); - VectorScale( jFwdVec, FORCE_LONG_LEAP_SPEED, pm->ps->velocity ); + PM_SetAnim(pm, SETANIM_BOTH, BOTH_FORCELONGLEAP_START, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + VectorSet(jFwdAngs, 0, pm->ps->viewangles[YAW], 0); + AngleVectors(jFwdAngs, jFwdVec, NULL, NULL); + VectorScale(jFwdVec, FORCE_LONG_LEAP_SPEED, pm->ps->velocity); pm->ps->velocity[2] = 320; pml.groundPlane = qfalse; pml.walking = qfalse; pm->ps->groundEntityNum = ENTITYNUM_NONE; pm->ps->jumpZStart = pm->ps->origin[2]; pm->ps->pm_flags |= PMF_JUMP_HELD; - pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; + pm->ps->pm_flags |= PMF_JUMPING | PMF_SLOW_MO_FALL; //start force jump - pm->ps->forcePowersActive |= (1<ps->forcePowersActive |= (1 << FP_LEVITATION); pm->cmd.upmove = 0; // keep track of force jump stat - if(pm->ps->clientNum == 0) - { - if( pm->gent && pm->gent->client ) + if (pm->ps->clientNum == 0) + { + if (pm->gent && pm->gent->client) { pm->gent->client->sess.missionStats.forceUsed[(int)FP_LEVITATION]++; } } - G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); - WP_ForcePowerStop( pm->gent, FP_SPEED ); - WP_ForcePowerDrain( pm->gent, FP_LEVITATION, FORCE_LONGJUMP_POWER );//drain the required force power - G_StartMatrixEffect( pm->gent, 0, pm->ps->legsAnimTimer+500 ); + G_SoundOnEnt(pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav"); + WP_ForcePowerStop(pm->gent, FP_SPEED); + WP_ForcePowerDrain(pm->gent, FP_LEVITATION, FORCE_LONGJUMP_POWER);//drain the required force power + G_StartMatrixEffect(pm->gent, 0, pm->ps->legsAnimTimer + 500); return qtrue; } - else if ( PM_InCartwheel( pm->ps->legsAnim ) - || PM_InButterfly( pm->ps->legsAnim ) ) + else if (PM_InCartwheel(pm->ps->legsAnim) + || PM_InButterfly(pm->ps->legsAnim)) {//can't keep jumping up in cartwheels, ariels and butterflies } //FIXME: still able to pogo-jump... - else if ( PM_ForceJumpingUp( pm->gent ) && (pm->ps->pm_flags&PMF_JUMP_HELD) )//||pm->ps->waterHeightLevel==WHL_SHOULDERS) ) + else if (PM_ForceJumpingUp(pm->gent) && (pm->ps->pm_flags&PMF_JUMP_HELD))//||pm->ps->waterHeightLevel==WHL_SHOULDERS) ) {//force jumping && holding jump /* if ( !pm->ps->forceJumpZStart && (pm->ps->waterHeightLevel==WHL_SHOULDERS&&pm->cmd.upmove>0) ) { - pm->ps->forceJumpZStart = pm->ps->origin[2]; + pm->ps->forceJumpZStart = pm->ps->origin[2]; } */ float curHeight = pm->ps->origin[2] - pm->ps->forceJumpZStart; //check for max force jump level and cap off & cut z vel - if ( ( curHeight<=forceJumpHeight[0] ||//still below minimum jump height - (pm->ps->forcePower&&pm->cmd.upmove>=10) ) &&////still have force power available and still trying to jump up - curHeight < forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]] )//still below maximum jump height + if ((curHeight <= forceJumpHeight[0] ||//still below minimum jump height + (pm->ps->forcePower&&pm->cmd.upmove >= 10)) &&////still have force power available and still trying to jump up + curHeight < forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]])//still below maximum jump height {//can still go up //FIXME: after a certain amount of time of held jump, play force jump sound and flip if a dir is being held //FIXME: if hit a wall... should we cut velocity or allow them to slide up it? //FIXME: constantly drain force power at a rate by which the usage for maximum height would use up the full cost of force jump - if ( curHeight > forceJumpHeight[0] ) + if (curHeight > forceJumpHeight[0]) {//passed normal jump height *2? - if ( !(pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1 << FP_LEVITATION)))//haven't started forcejump yet { //start force jump - pm->ps->forcePowersActive |= (1<gent ) + pm->ps->forcePowersActive |= (1 << FP_LEVITATION); + if (pm->gent) { - G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); + G_SoundOnEnt(pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav"); // keep track of force jump stat - if(pm->ps->clientNum == 0 && pm->gent->client) + if (pm->ps->clientNum == 0 && pm->gent->client) { pm->gent->client->sess.missionStats.forceUsed[(int)FP_LEVITATION]++; } } //play flip //FIXME: do this only when they stop the jump (below) or when they're just about to hit the peak of the jump - if ( PM_InAirKickingAnim( pm->ps->legsAnim ) - && pm->ps->legsAnimTimer ) + if (PM_InAirKickingAnim(pm->ps->legsAnim) + && pm->ps->legsAnimTimer) {//still in kick } else if ((pm->cmd.forwardmove || pm->cmd.rightmove) && //pushing in a dir @@ -1263,104 +1277,104 @@ static qboolean PM_CheckJump( void ) pm->ps->legsAnim != BOTH_FLIP_F && pm->ps->legsAnim != BOTH_FLIP_B && pm->ps->legsAnim != BOTH_FLIP_R && - pm->ps->legsAnim != BOTH_FLIP_L && + pm->ps->legsAnim != BOTH_FLIP_L && pm->ps->legsAnim != BOTH_ALORA_FLIP_1 && pm->ps->legsAnim != BOTH_ALORA_FLIP_2 && pm->ps->legsAnim != BOTH_ALORA_FLIP_3 && cg.renderingThirdPerson//third person only && !cg.zoomMode //not zoomed in && !(pm->ps->saber[0].saberFlags&SFL_NO_FLIPS)//okay to do flips with this saber - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_FLIPS) )//okay to do flips with this saber + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_FLIPS))//okay to do flips with this saber ) {//FIXME: this could end up playing twice if the jump is very long... int anim = BOTH_FORCEINAIR1; int parts = SETANIM_BOTH; - if ( pm->cmd.forwardmove > 0 ) + if (pm->cmd.forwardmove > 0) { /* if ( pm->ps->forcePowerLevel[FP_LEVITATION] < FORCE_LEVEL_2 ) { - anim = BOTH_ARIAL_F1; + anim = BOTH_ARIAL_F1; } else */ - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ALORA && Q_irand( 0, 3 ) ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ALORA && Q_irand(0, 3)) { - anim = Q_irand( BOTH_ALORA_FLIP_1, BOTH_ALORA_FLIP_3 ); + anim = Q_irand(BOTH_ALORA_FLIP_1, BOTH_ALORA_FLIP_3); } else { anim = BOTH_FLIP_F; } } - else if ( pm->cmd.forwardmove < 0 ) + else if (pm->cmd.forwardmove < 0) { anim = BOTH_FLIP_B; } - else if ( pm->cmd.rightmove > 0 ) + else if (pm->cmd.rightmove > 0) { anim = BOTH_FLIP_R; } - else if ( pm->cmd.rightmove < 0 ) + else if (pm->cmd.rightmove < 0) { anim = BOTH_FLIP_L; } - if ( pm->ps->weaponTime ) + if (pm->ps->weaponTime) {//FIXME: really only care if we're in a saber attack anim... parts = SETANIM_LEGS; } - PM_SetAnim( pm, parts, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, parts, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } - else if ( pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 ) + else if (pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1) {//FIXME: really want to know how far off ground we are, probably... - vec3_t facingFwd, facingRight, facingAngles = {0, pm->ps->viewangles[YAW], 0}; + vec3_t facingFwd, facingRight, facingAngles = { 0, pm->ps->viewangles[YAW], 0 }; int anim = -1; - AngleVectors( facingAngles, facingFwd, facingRight, NULL ); - float dotR = DotProduct( facingRight, pm->ps->velocity ); - float dotF = DotProduct( facingFwd, pm->ps->velocity ); - if ( fabs(dotR) > fabs(dotF) * 1.5 ) + AngleVectors(facingAngles, facingFwd, facingRight, NULL); + float dotR = DotProduct(facingRight, pm->ps->velocity); + float dotF = DotProduct(facingFwd, pm->ps->velocity); + if (fabs(dotR) > fabs(dotF) * 1.5) { - if ( dotR > 150 ) + if (dotR > 150) { anim = BOTH_FORCEJUMPRIGHT1; } - else if ( dotR < -150 ) + else if (dotR < -150) { anim = BOTH_FORCEJUMPLEFT1; } } else { - if ( dotF > 150 ) + if (dotF > 150) { anim = BOTH_FORCEJUMP1; } - else if ( dotF < -150 ) + else if (dotF < -150) { anim = BOTH_FORCEJUMPBACK1; } } - if ( anim != -1 ) + if (anim != -1) { int parts = SETANIM_BOTH; - if ( pm->ps->weaponTime ) + if (pm->ps->weaponTime) {//FIXME: really only care if we're in a saber attack anim... parts = SETANIM_LEGS; } - PM_SetAnim( pm, parts, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, parts, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } } } else { - if ( !pm->ps->legsAnimTimer ) + if (!pm->ps->legsAnimTimer) {//not in the middle of a legsAnim int anim = pm->ps->legsAnim; int newAnim = -1; - switch ( anim ) + switch (anim) { case BOTH_FORCEJUMP1: newAnim = BOTH_FORCELAND1;//BOTH_FORCEINAIR1; @@ -1375,29 +1389,29 @@ static qboolean PM_CheckJump( void ) newAnim = BOTH_FORCELANDRIGHT1;//BOTH_FORCEINAIRRIGHT1; break; } - if ( newAnim != -1 ) + if (newAnim != -1) { int parts = SETANIM_BOTH; - if ( pm->ps->weaponTime ) + if (pm->ps->weaponTime) {//FIXME: really only care if we're in a saber attack anim... parts = SETANIM_LEGS; } - PM_SetAnim( pm, parts, newAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, parts, newAnim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } } } } //need to scale this down, start with height velocity (based on max force jump height) and scale down to regular jump vel - pm->ps->velocity[2] = (forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]]-curHeight)/forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]]*forceJumpStrength[pm->ps->forcePowerLevel[FP_LEVITATION]];//JUMP_VELOCITY; + pm->ps->velocity[2] = (forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]] - curHeight) / forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]] * forceJumpStrength[pm->ps->forcePowerLevel[FP_LEVITATION]];//JUMP_VELOCITY; pm->ps->velocity[2] /= 10; pm->ps->velocity[2] += JUMP_VELOCITY; pm->ps->pm_flags |= PMF_JUMP_HELD; } - else if ( curHeight > forceJumpHeight[0] && curHeight < forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]] - forceJumpHeight[0] ) + else if (curHeight > forceJumpHeight[0] && curHeight < forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]] - forceJumpHeight[0]) {//still have some headroom, don't totally stop it - if ( pm->ps->velocity[2] > JUMP_VELOCITY ) + if (pm->ps->velocity[2] > JUMP_VELOCITY) { pm->ps->velocity[2] = JUMP_VELOCITY; } @@ -1415,112 +1429,112 @@ static qboolean PM_CheckJump( void ) #endif //Not jumping - if ( pm->cmd.upmove < 10 ) { + if (pm->cmd.upmove < 10) { return qfalse; } // must wait for jump to be released - if ( pm->ps->pm_flags & PMF_JUMP_HELD ) + if (pm->ps->pm_flags & PMF_JUMP_HELD) { // clear upmove so cmdscale doesn't lower running speed pm->cmd.upmove = 0; return qfalse; } - if ( pm->ps->gravity <= 0 ) + if (pm->ps->gravity <= 0) {//in low grav, you push in the dir you're facing as long as there is something behind you to shove off of vec3_t forward, back; trace_t trace; - AngleVectors( pm->ps->viewangles, forward, NULL, NULL ); - VectorMA( pm->ps->origin, -8, forward, back ); - pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, back, pm->ps->clientNum, pm->tracemask&~(CONTENTS_PLAYERCLIP|CONTENTS_MONSTERCLIP), (EG2_Collision)0, 0 ); + AngleVectors(pm->ps->viewangles, forward, NULL, NULL); + VectorMA(pm->ps->origin, -8, forward, back); + pm->trace(&trace, pm->ps->origin, pm->mins, pm->maxs, back, pm->ps->clientNum, pm->tracemask&~(CONTENTS_PLAYERCLIP | CONTENTS_MONSTERCLIP), (EG2_Collision)0, 0); pm->cmd.upmove = 0; - if ( trace.fraction < 1.0f ) + if (trace.fraction < 1.0f) { - VectorMA( pm->ps->velocity, JUMP_VELOCITY/2, forward, pm->ps->velocity ); + VectorMA(pm->ps->velocity, JUMP_VELOCITY / 2, forward, pm->ps->velocity); //FIXME: kicking off wall anim? At least check what anim we're in? - PM_SetAnim(pm,SETANIM_LEGS,BOTH_FORCEJUMP1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_FORCEJUMP1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_RESTART); } else {//else no surf close enough to push off of return qfalse; } - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) + if (pm->ps->groundEntityNum == ENTITYNUM_NONE) {//need to set some things and return //Jumping pm->ps->forceJumpZStart = 0; pml.groundPlane = qfalse; pml.walking = qfalse; - pm->ps->pm_flags |= (PMF_JUMPING|PMF_JUMP_HELD); + pm->ps->pm_flags |= (PMF_JUMPING | PMF_JUMP_HELD); pm->ps->groundEntityNum = ENTITYNUM_NONE; pm->ps->jumpZStart = pm->ps->origin[2]; - if ( pm->gent ) + if (pm->gent) { - if ( !Q3_TaskIDPending( pm->gent, TID_CHAN_VOICE ) ) + if (!Q3_TaskIDPending(pm->gent, TID_CHAN_VOICE)) { - PM_AddEvent( EV_JUMP ); + PM_AddEvent(EV_JUMP); } } else { - PM_AddEvent( EV_JUMP ); + PM_AddEvent(EV_JUMP); } - + return qtrue; }//else no surf close enough to push off of } - else if ( pm->cmd.upmove > 0 //want to jump + else if (pm->cmd.upmove > 0 //want to jump && pm->waterlevel < 2 //not in water above ankles && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0 //have force jump ability && !(pm->ps->pm_flags&PMF_JUMP_HELD)//not holding jump from a previous jump //&& !PM_InKnockDown( pm->ps )//not in a knockdown && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period - && pm->gent && WP_ForcePowerAvailable( pm->gent, FP_LEVITATION, 0 ) //have enough force power to jump - && ((pm->ps->clientNum&&!PM_ControlledByPlayer())||((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS) )) )// yes this locked weapons check also includes force powers, if we need a separate check later I'll make one + && pm->gent && WP_ForcePowerAvailable(pm->gent, FP_LEVITATION, 0) //have enough force power to jump + && ((pm->ps->clientNum&&!PM_ControlledByPlayer()) || ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode && !(pm->gent->flags&FL_LOCK_PLAYER_WEAPONS))))// yes this locked weapons check also includes force powers, if we need a separate check later I'll make one { - if ( pm->gent->NPC && pm->gent->NPC->rank != RANK_CREWMAN && pm->gent->NPC->rank <= RANK_LT_JG ) + if (pm->gent->NPC && pm->gent->NPC->rank != RANK_CREWMAN && pm->gent->NPC->rank <= RANK_LT_JG) {//reborn who are not acrobats can't do any of these acrobatics //FIXME: extern these abilities in the .npc file! } - else if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + else if (pm->ps->groundEntityNum != ENTITYNUM_NONE) {//on the ground //check for left-wall and right-wall special jumps int anim = -1; float vertPush = 0; int forcePowerCostOverride = 0; - + // Cartwheels/ariels/butterflies - if ( (pm->ps->weapon==WP_SABER&&G_TryingCartwheel(pm->gent,&pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/&&(pm->cmd.buttons&BUTTON_ATTACK))//using saber and holding focus + attack -// ||(pm->ps->weapon!=WP_SABER&&((pm->cmd.buttons&BUTTON_ATTACK)||(pm->cmd.buttons&BUTTON_ALT_ATTACK)) ) )//using any other weapon and hitting either attack button - && (((pm->ps->clientNum>=MAX_CLIENTS&&!PM_ControlledByPlayer())&&pm->cmd.upmove > 0&& pm->ps->velocity[2] >= 0 )//jumping NPC, going up already - ||((pm->ps->clientNumgent,&pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/))//focus-holding player - && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_LR )/*pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_LR*/ )// have enough power + if ((pm->ps->weapon == WP_SABER&&G_TryingCartwheel(pm->gent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/ && (pm->cmd.buttons&BUTTON_ATTACK))//using saber and holding focus + attack + // ||(pm->ps->weapon!=WP_SABER&&((pm->cmd.buttons&BUTTON_ATTACK)||(pm->cmd.buttons&BUTTON_ALT_ATTACK)) ) )//using any other weapon and hitting either attack button + && (((pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) && pm->cmd.upmove > 0 && pm->ps->velocity[2] >= 0)//jumping NPC, going up already + || ((pm->ps->clientNumgent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/))//focus-holding player + && G_EnoughPowerForSpecialMove(pm->ps->forcePower, SABER_ALT_ATTACK_POWER_LR)/*pm->ps->forcePower >= SABER_ALT_ATTACK_POWER_LR*/)// have enough power {//holding attack and jumping - if ( pm->cmd.rightmove > 0 ) + if (pm->cmd.rightmove > 0) { // If they're using the staff we do different anims. - if ( pm->ps->saberAnimLevel == SS_STAFF - && pm->ps->weapon == WP_SABER ) + if (pm->ps->saberAnimLevel == SS_STAFF + && pm->ps->weapon == WP_SABER) { - if ( (pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) - || pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_2 ) + if ((pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) + || pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_2) { anim = BOTH_BUTTERFLY_RIGHT; - forcePowerCostOverride = G_CostForSpecialMove( SABER_ALT_ATTACK_POWER_LR ); + forcePowerCostOverride = G_CostForSpecialMove(SABER_ALT_ATTACK_POWER_LR); } } - else if ( (pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) - || pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 ) + else if ((pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) + || pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1) { - if ( !(pm->ps->saber[0].saberFlags&SFL_NO_CARTWHEELS) - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_CARTWHEELS)) ) + if (!(pm->ps->saber[0].saberFlags&SFL_NO_CARTWHEELS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_CARTWHEELS))) {//okay to do cartwheels with this saber - if ( pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer() ) + if (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) {//player: since we're on the ground, always do a cartwheel /* anim = BOTH_CARTWHEEL_RIGHT; @@ -1530,40 +1544,40 @@ static qboolean PM_CheckJump( void ) else { vertPush = JUMP_VELOCITY; - if ( Q_irand( 0, 1 ) ) + if (Q_irand(0, 1)) { anim = BOTH_ARIAL_RIGHT; - forcePowerCostOverride = G_CostForSpecialMove( SABER_ALT_ATTACK_POWER_LR ); + forcePowerCostOverride = G_CostForSpecialMove(SABER_ALT_ATTACK_POWER_LR); } else { anim = BOTH_CARTWHEEL_RIGHT; - forcePowerCostOverride = G_CostForSpecialMove( SABER_ALT_ATTACK_POWER_LR ); + forcePowerCostOverride = G_CostForSpecialMove(SABER_ALT_ATTACK_POWER_LR); } } } } } - else if ( pm->cmd.rightmove < 0 ) + else if (pm->cmd.rightmove < 0) { // If they're using the staff we do different anims. - if ( pm->ps->saberAnimLevel == SS_STAFF - && pm->ps->weapon == WP_SABER ) + if (pm->ps->saberAnimLevel == SS_STAFF + && pm->ps->weapon == WP_SABER) { - if ( (pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) - || pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_2 ) + if ((pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) + || pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_2) { anim = BOTH_BUTTERFLY_LEFT; - forcePowerCostOverride = G_CostForSpecialMove( SABER_ALT_ATTACK_POWER_LR ); + forcePowerCostOverride = G_CostForSpecialMove(SABER_ALT_ATTACK_POWER_LR); } } - else if ( (pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) - || pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 ) + else if ((pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) + || pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1) { - if ( !(pm->ps->saber[0].saberFlags&SFL_NO_CARTWHEELS) - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_CARTWHEELS)) ) + if (!(pm->ps->saber[0].saberFlags&SFL_NO_CARTWHEELS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_CARTWHEELS))) {//okay to do cartwheels with this saber - if ( pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer() ) + if (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) {//player: since we're on the ground, always do a cartwheel /* anim = BOTH_CARTWHEEL_LEFT; @@ -1573,124 +1587,124 @@ static qboolean PM_CheckJump( void ) else { vertPush = JUMP_VELOCITY; - if ( Q_irand( 0, 1 ) ) + if (Q_irand(0, 1)) { anim = BOTH_ARIAL_LEFT; - forcePowerCostOverride = G_CostForSpecialMove( SABER_ALT_ATTACK_POWER_LR ); + forcePowerCostOverride = G_CostForSpecialMove(SABER_ALT_ATTACK_POWER_LR); } else { anim = BOTH_CARTWHEEL_LEFT; - forcePowerCostOverride = G_CostForSpecialMove( SABER_ALT_ATTACK_POWER_LR ); + forcePowerCostOverride = G_CostForSpecialMove(SABER_ALT_ATTACK_POWER_LR); } } } } } } - else if ( pm->cmd.rightmove > 0 && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 ) + else if (pm->cmd.rightmove > 0 && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1) {//strafing right - if ( pm->cmd.forwardmove > 0 ) + if (pm->cmd.forwardmove > 0) {//wall-run - if ( !(pm->ps->saber[0].saberFlags&SFL_NO_WALL_RUNS) - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_WALL_RUNS)) ) + if (!(pm->ps->saber[0].saberFlags&SFL_NO_WALL_RUNS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_WALL_RUNS))) {//okay to do wall-runs with this saber - vertPush = forceJumpStrength[FORCE_LEVEL_2]/2.0f; + vertPush = forceJumpStrength[FORCE_LEVEL_2] / 2.0f; anim = BOTH_WALL_RUN_RIGHT; } } - else if ( pm->cmd.forwardmove == 0 ) + else if (pm->cmd.forwardmove == 0) {//wall-flip - if ( !(pm->ps->saber[0].saberFlags&SFL_NO_WALL_FLIPS) - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_WALL_FLIPS)) ) + if (!(pm->ps->saber[0].saberFlags&SFL_NO_WALL_FLIPS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_WALL_FLIPS))) {//okay to do wall-flips with this saber - vertPush = forceJumpStrength[FORCE_LEVEL_2]/2.25f; + vertPush = forceJumpStrength[FORCE_LEVEL_2] / 2.25f; anim = BOTH_WALL_FLIP_RIGHT; } } } - else if ( pm->cmd.rightmove < 0 && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 ) + else if (pm->cmd.rightmove < 0 && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1) {//strafing left - if ( pm->cmd.forwardmove > 0 ) + if (pm->cmd.forwardmove > 0) {//wall-run - if ( !(pm->ps->saber[0].saberFlags&SFL_NO_WALL_RUNS) - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_WALL_RUNS)) ) + if (!(pm->ps->saber[0].saberFlags&SFL_NO_WALL_RUNS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_WALL_RUNS))) {//okay to do wall-runs with this saber - vertPush = forceJumpStrength[FORCE_LEVEL_2]/2.0f; + vertPush = forceJumpStrength[FORCE_LEVEL_2] / 2.0f; anim = BOTH_WALL_RUN_LEFT; } } - else if ( pm->cmd.forwardmove == 0 ) + else if (pm->cmd.forwardmove == 0) {//wall-flip - if ( !(pm->ps->saber[0].saberFlags&SFL_NO_WALL_FLIPS) - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_WALL_FLIPS)) ) + if (!(pm->ps->saber[0].saberFlags&SFL_NO_WALL_FLIPS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_WALL_FLIPS))) {//okay to do wall-flips with this saber - vertPush = forceJumpStrength[FORCE_LEVEL_2]/2.25f; + vertPush = forceJumpStrength[FORCE_LEVEL_2] / 2.25f; anim = BOTH_WALL_FLIP_LEFT; } } } else if ( /*pm->ps->clientNum >= MAX_CLIENTS//not the player - && !PM_ControlledByPlayer() //not controlled by player - &&*/ pm->cmd.forwardmove > 0 //pushing forward - && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 )//have jump 2 or higher + && !PM_ControlledByPlayer() //not controlled by player + &&*/ pm->cmd.forwardmove > 0 //pushing forward + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1)//have jump 2 or higher {//step off wall, flip backwards - if ( VectorLengthSquared( pm->ps->velocity ) > 40000 /*200*200*/) + if (VectorLengthSquared(pm->ps->velocity) > 40000 /*200*200*/) {//have to be moving... FIXME: make sure it's opposite the wall... or at least forward? - if ( pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_2 ) + if (pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_2) {//run all the way up wwall - if ( !(pm->ps->saber[0].saberFlags&SFL_NO_WALL_RUNS) - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_WALL_RUNS)) ) + if (!(pm->ps->saber[0].saberFlags&SFL_NO_WALL_RUNS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_WALL_RUNS))) {//okay to do wall-runs with this saber - vertPush = forceJumpStrength[FORCE_LEVEL_2]/2.0f; + vertPush = forceJumpStrength[FORCE_LEVEL_2] / 2.0f; anim = BOTH_FORCEWALLRUNFLIP_START; } } else {//run just a couple steps up - if ( !(pm->ps->saber[0].saberFlags&SFL_NO_WALL_FLIPS) - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_WALL_FLIPS)) ) + if (!(pm->ps->saber[0].saberFlags&SFL_NO_WALL_FLIPS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_WALL_FLIPS))) {//okay to do wall-flips with this saber - vertPush = forceJumpStrength[FORCE_LEVEL_2]/2.25f; + vertPush = forceJumpStrength[FORCE_LEVEL_2] / 2.25f; anim = BOTH_WALL_FLIP_BACK1; } } } } - else if ( pm->cmd.forwardmove < 0 //pushing back + else if (pm->cmd.forwardmove < 0 //pushing back //&& pm->ps->clientNum//not the player - && !(pm->cmd.buttons&BUTTON_ATTACK) )//not attacking + && !(pm->cmd.buttons&BUTTON_ATTACK))//not attacking {//back-jump does backflip... FIXME: always?! What about just doing a normal jump backwards? - if ( pm->ps->velocity[2] >= 0 ) + if (pm->ps->velocity[2] >= 0) {//must be going up already - if ( !(pm->ps->saber[0].saberFlags&SFL_NO_FLIPS) - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_FLIPS)) ) + if (!(pm->ps->saber[0].saberFlags&SFL_NO_FLIPS) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_FLIPS))) {//okay to do backstabs with this saber vertPush = JUMP_VELOCITY; - if ( pm->gent->client && pm->gent->client->NPC_class == CLASS_ALORA && !Q_irand( 0, 2 ) ) + if (pm->gent->client && pm->gent->client->NPC_class == CLASS_ALORA && !Q_irand(0, 2)) { anim = BOTH_ALORA_FLIP_B; } else { - anim = PM_PickAnim( pm->gent, BOTH_FLIP_BACK1, BOTH_FLIP_BACK3 ); + anim = PM_PickAnim(pm->gent, BOTH_FLIP_BACK1, BOTH_FLIP_BACK3); } } } } - else if ( VectorLengthSquared( pm->ps->velocity ) < 256 /*16 squared*/) + else if (VectorLengthSquared(pm->ps->velocity) < 256 /*16 squared*/) {//not moving - if ( pm->ps->weapon == WP_SABER && (pm->cmd.buttons & BUTTON_ATTACK) ) + if (pm->ps->weapon == WP_SABER && (pm->cmd.buttons & BUTTON_ATTACK)) { saberMoveName_t overrideJumpAttackUpMove = LS_INVALID; - if ( pm->ps->saber[0].jumpAtkUpMove != LS_INVALID ) + if (pm->ps->saber[0].jumpAtkUpMove != LS_INVALID) { - if ( pm->ps->saber[0].jumpAtkUpMove != LS_NONE ) + if (pm->ps->saber[0].jumpAtkUpMove != LS_NONE) {//actually overriding overrideJumpAttackUpMove = (saberMoveName_t)pm->ps->saber[0].jumpAtkUpMove; } - else if ( pm->ps->dualSabers - && pm->ps->saber[1].jumpAtkUpMove > LS_NONE ) + else if (pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkUpMove > LS_NONE) {//would be cancelling it, but check the second saber, too overrideJumpAttackUpMove = (saberMoveName_t)pm->ps->saber[1].jumpAtkUpMove; } @@ -1699,144 +1713,144 @@ static qboolean PM_CheckJump( void ) overrideJumpAttackUpMove = LS_NONE; } } - else if ( pm->ps->dualSabers - && pm->ps->saber[1].jumpAtkUpMove != LS_INVALID ) + else if (pm->ps->dualSabers + && pm->ps->saber[1].jumpAtkUpMove != LS_INVALID) {//first saber not overridden, check second overrideJumpAttackUpMove = (saberMoveName_t)pm->ps->saber[0].jumpAtkUpMove; } - if ( overrideJumpAttackUpMove != LS_INVALID ) + if (overrideJumpAttackUpMove != LS_INVALID) {//do this move instead - if ( overrideJumpAttackUpMove != LS_NONE ) + if (overrideJumpAttackUpMove != LS_NONE) { anim = saberMoveData[overrideJumpAttackUpMove].animToUse; } } - else if ( pm->ps->saberAnimLevel == SS_MEDIUM ) + else if (pm->ps->saberAnimLevel == SS_MEDIUM) { /* //Only tavion does these now if ( pm->ps->clientNum && Q_irand( 0, 1 ) ) {//butterfly... FIXME: does direction matter? - vertPush = JUMP_VELOCITY; - if ( Q_irand( 0, 1 ) ) - { - anim = BOTH_BUTTERFLY_LEFT; - } - else - { - anim = BOTH_BUTTERFLY_RIGHT; - } + vertPush = JUMP_VELOCITY; + if ( Q_irand( 0, 1 ) ) + { + anim = BOTH_BUTTERFLY_LEFT; + } + else + { + anim = BOTH_BUTTERFLY_RIGHT; + } } - else - */if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() )//NOTE: pretty much useless, so player never does these + else + */if (pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer())//NOTE: pretty much useless, so player never does these {//jump-spin FIXME: does direction matter? - vertPush = forceJumpStrength[FORCE_LEVEL_2]/1.5f; - if ( pm->gent->client && pm->gent->client->NPC_class == CLASS_ALORA ) + vertPush = forceJumpStrength[FORCE_LEVEL_2] / 1.5f; + if (pm->gent->client && pm->gent->client->NPC_class == CLASS_ALORA) { anim = BOTH_ALORA_SPIN; } else { - anim = Q_irand( BOTH_FJSS_TR_BL, BOTH_FJSS_TL_BR ); + anim = Q_irand(BOTH_FJSS_TR_BL, BOTH_FJSS_TL_BR); } } } } } - if ( anim != -1 && PM_HasAnimation( pm->gent, anim ) ) + if (anim != -1 && PM_HasAnimation(pm->gent, anim)) { - vec3_t fwd, right, traceto, mins = {pm->mins[0],pm->mins[1],0}, maxs = {pm->maxs[0],pm->maxs[1],24}, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; + vec3_t fwd, right, traceto, mins = { pm->mins[0], pm->mins[1], 0 }, maxs = { pm->maxs[0], pm->maxs[1], 24 }, fwdAngles = { 0, pm->ps->viewangles[YAW], 0 }; trace_t trace; qboolean doTrace = qfalse; int contents = CONTENTS_SOLID; - AngleVectors( fwdAngles, fwd, right, NULL ); + AngleVectors(fwdAngles, fwd, right, NULL); //trace-check for a wall, if necc. - switch ( anim ) + switch (anim) { case BOTH_WALL_FLIP_LEFT: - if ( g_debugMelee->integer ) + if (g_debugMelee->integer) { contents |= CONTENTS_BODY; } //NOTE: purposely falls through to next case! case BOTH_WALL_RUN_LEFT: doTrace = qtrue; - VectorMA( pm->ps->origin, -16, right, traceto ); + VectorMA(pm->ps->origin, -16, right, traceto); break; case BOTH_WALL_FLIP_RIGHT: - if ( g_debugMelee->integer ) + if (g_debugMelee->integer) { contents |= CONTENTS_BODY; } //NOTE: purposely falls through to next case! case BOTH_WALL_RUN_RIGHT: doTrace = qtrue; - VectorMA( pm->ps->origin, 16, right, traceto ); + VectorMA(pm->ps->origin, 16, right, traceto); break; case BOTH_WALL_FLIP_BACK1: - if ( g_debugMelee->integer ) + if (g_debugMelee->integer) { contents |= CONTENTS_BODY; } doTrace = qtrue; - VectorMA( pm->ps->origin, 32, fwd, traceto );//was 16 + VectorMA(pm->ps->origin, 32, fwd, traceto);//was 16 break; - + case BOTH_FORCEWALLRUNFLIP_START: - if ( g_debugMelee->integer ) + if (g_debugMelee->integer) { contents |= CONTENTS_BODY; } doTrace = qtrue; - VectorMA( pm->ps->origin, 32, fwd, traceto );//was 16 + VectorMA(pm->ps->origin, 32, fwd, traceto);//was 16 break; } - vec3_t idealNormal={0}, wallNormal={0}; - if ( doTrace ) + vec3_t idealNormal = { 0 }, wallNormal = { 0 }; + if (doTrace) { //FIXME: all these jump ones should check for head clearance - pm->trace( &trace, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, contents, (EG2_Collision)0, 0 ); - VectorCopy( trace.plane.normal, wallNormal ); - VectorNormalize( wallNormal ); - VectorSubtract( pm->ps->origin, traceto, idealNormal ); - VectorNormalize( idealNormal ); - if ( anim == BOTH_WALL_FLIP_LEFT ) + pm->trace(&trace, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, contents, (EG2_Collision)0, 0); + VectorCopy(trace.plane.normal, wallNormal); + VectorNormalize(wallNormal); + VectorSubtract(pm->ps->origin, traceto, idealNormal); + VectorNormalize(idealNormal); + if (anim == BOTH_WALL_FLIP_LEFT) {//sigh.. check for bottomless pit to the right trace_t trace2; vec3_t start; - VectorMA( pm->ps->origin, 128, right, traceto ); - pm->trace( &trace2, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, contents, (EG2_Collision)0, 0 ); - if ( !trace2.allsolid && !trace2.startsolid ) + VectorMA(pm->ps->origin, 128, right, traceto); + pm->trace(&trace2, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, contents, (EG2_Collision)0, 0); + if (!trace2.allsolid && !trace2.startsolid) { - VectorCopy( trace2.endpos, traceto ); - VectorCopy( traceto, start ); + VectorCopy(trace2.endpos, traceto); + VectorCopy(traceto, start); traceto[2] -= 384; - pm->trace( &trace2, start, mins, maxs, traceto, pm->ps->clientNum, contents, (EG2_Collision)0, 0 ); - if ( !trace2.allsolid && !trace2.startsolid && trace2.fraction >= 1.0f ) + pm->trace(&trace2, start, mins, maxs, traceto, pm->ps->clientNum, contents, (EG2_Collision)0, 0); + if (!trace2.allsolid && !trace2.startsolid && trace2.fraction >= 1.0f) {//bottomless pit! trace.fraction = 1.0f;//way to stop it from doing the side-flip } } } - else if ( anim == BOTH_WALL_FLIP_RIGHT ) + else if (anim == BOTH_WALL_FLIP_RIGHT) {//sigh.. check for bottomless pit to the left trace_t trace2; vec3_t start; - VectorMA( pm->ps->origin, -128, right, traceto ); - pm->trace( &trace2, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, contents, (EG2_Collision)0, 0 ); - if ( !trace2.allsolid && !trace2.startsolid ) + VectorMA(pm->ps->origin, -128, right, traceto); + pm->trace(&trace2, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, contents, (EG2_Collision)0, 0); + if (!trace2.allsolid && !trace2.startsolid) { - VectorCopy( trace2.endpos, traceto ); - VectorCopy( traceto, start ); + VectorCopy(trace2.endpos, traceto); + VectorCopy(traceto, start); traceto[2] -= 384; - pm->trace( &trace2, start, mins, maxs, traceto, pm->ps->clientNum, contents, (EG2_Collision)0, 0 ); - if ( !trace2.allsolid && !trace2.startsolid && trace2.fraction >= 1.0f ) + pm->trace(&trace2, start, mins, maxs, traceto, pm->ps->clientNum, contents, (EG2_Collision)0, 0); + if (!trace2.allsolid && !trace2.startsolid && trace2.fraction >= 1.0f) {//bottomless pit! trace.fraction = 1.0f;//way to stop it from doing the side-flip } @@ -1844,54 +1858,54 @@ static qboolean PM_CheckJump( void ) } else { - if ( anim == BOTH_WALL_FLIP_BACK1 - || anim == BOTH_FORCEWALLRUNFLIP_START ) + if (anim == BOTH_WALL_FLIP_BACK1 + || anim == BOTH_FORCEWALLRUNFLIP_START) {//trace up and forward a little to make sure the wall it at least 64 tall - if ( (contents&CONTENTS_BODY)//included entitied + if ((contents&CONTENTS_BODY)//included entitied && (trace.contents&CONTENTS_BODY) //hit an entity - && g_entities[trace.entityNum].client )//hit a client + && g_entities[trace.entityNum].client)//hit a client {//no need to trace up, it's all good... - if ( PM_InOnGroundAnim( &g_entities[trace.entityNum].client->ps ) )//on the ground, no jump + if (PM_InOnGroundAnim(&g_entities[trace.entityNum].client->ps))//on the ground, no jump {//can't jump off guys on ground trace.fraction = 1.0f;//way to stop if from doing the jump } - else if ( anim == BOTH_FORCEWALLRUNFLIP_START ) + else if (anim == BOTH_FORCEWALLRUNFLIP_START) {//instead of wall-running up, do the backflip anim = BOTH_WALL_FLIP_BACK1; - vertPush = forceJumpStrength[FORCE_LEVEL_2]/2.25f; + vertPush = forceJumpStrength[FORCE_LEVEL_2] / 2.25f; } } - else if ( anim == BOTH_WALL_FLIP_BACK1 ) + else if (anim == BOTH_WALL_FLIP_BACK1) { trace_t trace2; vec3_t start; - VectorCopy( pm->ps->origin, start ); + VectorCopy(pm->ps->origin, start); start[2] += 64; - VectorMA( start, 32, fwd, traceto ); - pm->trace( &trace2, start, mins, maxs, traceto, pm->ps->clientNum, contents, (EG2_Collision)0, 0 ); - if ( trace2.allsolid - || trace2.startsolid - || trace2.fraction >= 1.0f ) + VectorMA(start, 32, fwd, traceto); + pm->trace(&trace2, start, mins, maxs, traceto, pm->ps->clientNum, contents, (EG2_Collision)0, 0); + if (trace2.allsolid + || trace2.startsolid + || trace2.fraction >= 1.0f) {//no room above or no wall in front at that height trace.fraction = 1.0f;//way to stop if from doing the jump } } } - if ( trace.fraction < 1.0f ) + if (trace.fraction < 1.0f) {//still valid to jump - if ( anim == BOTH_WALL_FLIP_BACK1 ) + if (anim == BOTH_WALL_FLIP_BACK1) {//sigh.. check for bottomless pit to the rear trace_t trace2; vec3_t start; - VectorMA( pm->ps->origin, -128, fwd, traceto ); - pm->trace( &trace2, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, contents, (EG2_Collision)0, 0 ); - if ( !trace2.allsolid && !trace2.startsolid ) + VectorMA(pm->ps->origin, -128, fwd, traceto); + pm->trace(&trace2, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, contents, (EG2_Collision)0, 0); + if (!trace2.allsolid && !trace2.startsolid) { - VectorCopy( trace2.endpos, traceto ); - VectorCopy( traceto, start ); + VectorCopy(trace2.endpos, traceto); + VectorCopy(traceto, start); traceto[2] -= 384; - pm->trace( &trace2, start, mins, maxs, traceto, pm->ps->clientNum, contents, (EG2_Collision)0, 0 ); - if ( !trace2.allsolid && !trace2.startsolid && trace2.fraction >= 1.0f ) + pm->trace(&trace2, start, mins, maxs, traceto, pm->ps->clientNum, contents, (EG2_Collision)0, 0); + if (!trace2.allsolid && !trace2.startsolid && trace2.fraction >= 1.0f) {//bottomless pit! trace.fraction = 1.0f;//way to stop it from doing the side-flip } @@ -1901,446 +1915,446 @@ static qboolean PM_CheckJump( void ) } } gentity_t *traceEnt = &g_entities[trace.entityNum]; - - if ( !doTrace || (trace.fraction < 1.0f&&((trace.entityNums.solid!=SOLID_BMODEL)||DotProduct(wallNormal,idealNormal)>0.7)) ) + + if (!doTrace || (trace.fraction < 1.0f && ((trace.entityNums.solid != SOLID_BMODEL) || DotProduct(wallNormal, idealNormal)>0.7))) {//there is a wall there - if ( (anim != BOTH_WALL_RUN_LEFT - && anim != BOTH_WALL_RUN_RIGHT - && anim != BOTH_FORCEWALLRUNFLIP_START) - || (wallNormal[2] >= 0.0f && wallNormal[2] <= MAX_WALL_RUN_Z_NORMAL) ) - {//wall-runs can only run on relatively flat walls, sorry. - if ( anim == BOTH_ARIAL_LEFT || anim == BOTH_CARTWHEEL_LEFT ) + if ((anim != BOTH_WALL_RUN_LEFT + && anim != BOTH_WALL_RUN_RIGHT + && anim != BOTH_FORCEWALLRUNFLIP_START) + || (wallNormal[2] >= 0.0f && wallNormal[2] <= MAX_WALL_RUN_Z_NORMAL)) + {//wall-runs can only run on relatively flat walls, sorry. + if (anim == BOTH_ARIAL_LEFT || anim == BOTH_CARTWHEEL_LEFT) { pm->ps->velocity[0] = pm->ps->velocity[1] = 0; - VectorMA( pm->ps->velocity, -185, right, pm->ps->velocity ); + VectorMA(pm->ps->velocity, -185, right, pm->ps->velocity); } - else if ( anim == BOTH_ARIAL_RIGHT || anim == BOTH_CARTWHEEL_RIGHT ) + else if (anim == BOTH_ARIAL_RIGHT || anim == BOTH_CARTWHEEL_RIGHT) { pm->ps->velocity[0] = pm->ps->velocity[1] = 0; - VectorMA( pm->ps->velocity, 185, right, pm->ps->velocity ); + VectorMA(pm->ps->velocity, 185, right, pm->ps->velocity); } - else if ( anim == BOTH_BUTTERFLY_LEFT ) + else if (anim == BOTH_BUTTERFLY_LEFT) { - pm->ps->velocity[0] = pm->ps->velocity[1] = 0; - VectorMA( pm->ps->velocity, -190, right, pm->ps->velocity ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA(pm->ps->velocity, -190, right, pm->ps->velocity); } - else if ( anim == BOTH_BUTTERFLY_RIGHT ) + else if (anim == BOTH_BUTTERFLY_RIGHT) { pm->ps->velocity[0] = pm->ps->velocity[1] = 0; - VectorMA( pm->ps->velocity, 190, right, pm->ps->velocity ); + VectorMA(pm->ps->velocity, 190, right, pm->ps->velocity); } //move me to side - else if ( anim == BOTH_WALL_FLIP_LEFT ) + else if (anim == BOTH_WALL_FLIP_LEFT) { pm->ps->velocity[0] = pm->ps->velocity[1] = 0; - VectorMA( pm->ps->velocity, 150, right, pm->ps->velocity ); + VectorMA(pm->ps->velocity, 150, right, pm->ps->velocity); } - else if ( anim == BOTH_WALL_FLIP_RIGHT ) + else if (anim == BOTH_WALL_FLIP_RIGHT) { pm->ps->velocity[0] = pm->ps->velocity[1] = 0; - VectorMA( pm->ps->velocity, -150, right, pm->ps->velocity ); + VectorMA(pm->ps->velocity, -150, right, pm->ps->velocity); } - else if ( anim == BOTH_FLIP_BACK1 - || anim == BOTH_FLIP_BACK2 - || anim == BOTH_FLIP_BACK3 + else if (anim == BOTH_FLIP_BACK1 + || anim == BOTH_FLIP_BACK2 + || anim == BOTH_FLIP_BACK3 || anim == BOTH_ALORA_FLIP_B - || anim == BOTH_WALL_FLIP_BACK1 ) + || anim == BOTH_WALL_FLIP_BACK1) { pm->ps->velocity[0] = pm->ps->velocity[1] = 0; - VectorMA( pm->ps->velocity, -150, fwd, pm->ps->velocity ); + VectorMA(pm->ps->velocity, -150, fwd, pm->ps->velocity); } //kick if jumping off an ent - if ( doTrace - && anim != BOTH_WALL_RUN_LEFT - && anim != BOTH_WALL_RUN_RIGHT + if (doTrace + && anim != BOTH_WALL_RUN_LEFT + && anim != BOTH_WALL_RUN_RIGHT && anim != BOTH_FORCEWALLRUNFLIP_START) { - if ( pm->gent && trace.entityNum < ENTITYNUM_WORLD ) + if (pm->gent && trace.entityNum < ENTITYNUM_WORLD) { - if ( traceEnt - && traceEnt->client - && traceEnt->health > 0 + if (traceEnt + && traceEnt->client + && traceEnt->health > 0 && traceEnt->takedamage && traceEnt->client->NPC_class != CLASS_GALAKMECH && traceEnt->client->NPC_class != CLASS_DESANN - && !(traceEnt->flags&FL_NO_KNOCKBACK) ) + && !(traceEnt->flags&FL_NO_KNOCKBACK)) {//push them away and do pain vec3_t oppDir, fxDir; - float strength = VectorNormalize2( pm->ps->velocity, oppDir ); - VectorScale( oppDir, -1, oppDir ); + float strength = VectorNormalize2(pm->ps->velocity, oppDir); + VectorScale(oppDir, -1, oppDir); //FIXME: need knockdown anim - G_Damage( traceEnt, pm->gent, pm->gent, oppDir, traceEnt->currentOrigin, 10, DAMAGE_NO_ARMOR|DAMAGE_NO_HIT_LOC|DAMAGE_NO_KNOCKBACK, MOD_MELEE ); - VectorCopy( fwd, fxDir ); - VectorScale( fxDir, -1, fxDir ); - G_PlayEffect( G_EffectIndex( "melee/kick_impact" ), trace.endpos, fxDir ); + G_Damage(traceEnt, pm->gent, pm->gent, oppDir, traceEnt->currentOrigin, 10, DAMAGE_NO_ARMOR | DAMAGE_NO_HIT_LOC | DAMAGE_NO_KNOCKBACK, MOD_MELEE); + VectorCopy(fwd, fxDir); + VectorScale(fxDir, -1, fxDir); + G_PlayEffect(G_EffectIndex("melee/kick_impact"), trace.endpos, fxDir); //G_Sound( traceEnt, G_SoundIndex( va("sound/weapons/melee/punch%d", Q_irand(1, 4)) ) ); - if ( traceEnt->health > 0 ) + if (traceEnt->health > 0) {//didn't kill him - if ( (traceEnt->s.number==0&&!Q_irand(0,g_spskill->integer)) - || (traceEnt->NPC!=NULL&&Q_irand(RANK_CIVILIAN,traceEnt->NPC->rank)+Q_irand(-2,2)s.number == 0 && !Q_irand(0, g_spskill->integer)) + || (traceEnt->NPC != NULL&&Q_irand(RANK_CIVILIAN, traceEnt->NPC->rank) + Q_irand(-2, 2)ps->velocity[2] = vertPush; } //animate me - if ( anim == BOTH_BUTTERFLY_RIGHT ) + if (anim == BOTH_BUTTERFLY_RIGHT) { - PM_SetSaberMove( LS_BUTTERFLY_RIGHT ); + PM_SetSaberMove(LS_BUTTERFLY_RIGHT); } - else if ( anim == BOTH_BUTTERFLY_LEFT ) + else if (anim == BOTH_BUTTERFLY_LEFT) { - PM_SetSaberMove( LS_BUTTERFLY_LEFT ); + PM_SetSaberMove(LS_BUTTERFLY_LEFT); } else {//not a proper saberMove, so do set all the details manually int parts = SETANIM_LEGS; if ( /*anim == BOTH_BUTTERFLY_LEFT || - anim == BOTH_BUTTERFLY_RIGHT ||*/ - anim == BOTH_FJSS_TR_BL || - anim == BOTH_FJSS_TL_BR ) + anim == BOTH_BUTTERFLY_RIGHT ||*/ + anim == BOTH_FJSS_TR_BL || + anim == BOTH_FJSS_TL_BR) { parts = SETANIM_BOTH; - pm->cmd.buttons&=~BUTTON_ATTACK; + pm->cmd.buttons &= ~BUTTON_ATTACK; pm->ps->saberMove = LS_NONE; - pm->gent->client->ps.SaberActivateTrail( 300 ); + pm->gent->client->ps.SaberActivateTrail(300); } - else if ( !pm->ps->weaponTime ) + else if (!pm->ps->weaponTime) { parts = SETANIM_BOTH; } - PM_SetAnim( pm, parts, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 0 ); + PM_SetAnim(pm, parts, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD, 0); if ( /*anim == BOTH_BUTTERFLY_LEFT - || anim == BOTH_BUTTERFLY_RIGHT - ||*/ anim == BOTH_FJSS_TR_BL - || anim == BOTH_FJSS_TL_BR - || anim == BOTH_FORCEWALLRUNFLIP_START ) + || anim == BOTH_BUTTERFLY_RIGHT + ||*/ anim == BOTH_FJSS_TR_BL + || anim == BOTH_FJSS_TL_BR + || anim == BOTH_FORCEWALLRUNFLIP_START) { pm->ps->weaponTime = pm->ps->torsoAnimTimer; } - else if ( anim == BOTH_WALL_FLIP_LEFT - || anim == BOTH_WALL_FLIP_RIGHT - || anim == BOTH_WALL_FLIP_BACK1 ) + else if (anim == BOTH_WALL_FLIP_LEFT + || anim == BOTH_WALL_FLIP_RIGHT + || anim == BOTH_WALL_FLIP_BACK1) {//let us do some more moves after this pm->ps->saberAttackChainCount = 0; } } pm->ps->forceJumpZStart = pm->ps->origin[2];//so we don't take damage if we land at same height - pm->ps->pm_flags |= (PMF_JUMPING|PMF_SLOW_MO_FALL); + pm->ps->pm_flags |= (PMF_JUMPING | PMF_SLOW_MO_FALL); pm->cmd.upmove = 0; - G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); - WP_ForcePowerDrain( pm->gent, FP_LEVITATION, forcePowerCostOverride ); + G_SoundOnEnt(pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav"); + WP_ForcePowerDrain(pm->gent, FP_LEVITATION, forcePowerCostOverride); } } } } - else + else {//in the air int legsAnim = pm->ps->legsAnim; - if ( legsAnim == BOTH_WALL_RUN_LEFT || legsAnim == BOTH_WALL_RUN_RIGHT ) + if (legsAnim == BOTH_WALL_RUN_LEFT || legsAnim == BOTH_WALL_RUN_RIGHT) {//running on a wall - vec3_t right, traceto, mins = {pm->mins[0],pm->mins[0],0}, maxs = {pm->maxs[0],pm->maxs[0],24}, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; + vec3_t right, traceto, mins = { pm->mins[0], pm->mins[0], 0 }, maxs = { pm->maxs[0], pm->maxs[0], 24 }, fwdAngles = { 0, pm->ps->viewangles[YAW], 0 }; trace_t trace; int anim = -1; - AngleVectors( fwdAngles, NULL, right, NULL ); + AngleVectors(fwdAngles, NULL, right, NULL); - if ( legsAnim == BOTH_WALL_RUN_LEFT ) + if (legsAnim == BOTH_WALL_RUN_LEFT) { - if ( pm->ps->legsAnimTimer > 400 ) + if (pm->ps->legsAnimTimer > 400) {//not at the end of the anim - float animLen = PM_AnimLength( pm->gent->client->clientInfo.animFileIndex, BOTH_WALL_RUN_LEFT ); - if ( pm->ps->legsAnimTimer < animLen - 400 ) + float animLen = PM_AnimLength(pm->gent->client->clientInfo.animFileIndex, BOTH_WALL_RUN_LEFT); + if (pm->ps->legsAnimTimer < animLen - 400) {//not at start of anim - VectorMA( pm->ps->origin, -16, right, traceto ); + VectorMA(pm->ps->origin, -16, right, traceto); anim = BOTH_WALL_RUN_LEFT_FLIP; } } } - else if ( legsAnim == BOTH_WALL_RUN_RIGHT ) + else if (legsAnim == BOTH_WALL_RUN_RIGHT) { - if ( pm->ps->legsAnimTimer > 400 ) + if (pm->ps->legsAnimTimer > 400) {//not at the end of the anim - float animLen = PM_AnimLength( pm->gent->client->clientInfo.animFileIndex, BOTH_WALL_RUN_RIGHT ); - if ( pm->ps->legsAnimTimer < animLen - 400 ) + float animLen = PM_AnimLength(pm->gent->client->clientInfo.animFileIndex, BOTH_WALL_RUN_RIGHT); + if (pm->ps->legsAnimTimer < animLen - 400) {//not at start of anim - VectorMA( pm->ps->origin, 16, right, traceto ); + VectorMA(pm->ps->origin, 16, right, traceto); anim = BOTH_WALL_RUN_RIGHT_FLIP; } } } - if ( anim != -1 ) + if (anim != -1) { - pm->trace( &trace, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, CONTENTS_SOLID|CONTENTS_BODY, (EG2_Collision)0, 0 ); - if ( trace.fraction < 1.0f ) + pm->trace(&trace, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, CONTENTS_SOLID | CONTENTS_BODY, (EG2_Collision)0, 0); + if (trace.fraction < 1.0f) {//flip off wall - if ( anim == BOTH_WALL_RUN_LEFT_FLIP ) + if (anim == BOTH_WALL_RUN_LEFT_FLIP) { pm->ps->velocity[0] *= 0.5f; pm->ps->velocity[1] *= 0.5f; - VectorMA( pm->ps->velocity, 150, right, pm->ps->velocity ); + VectorMA(pm->ps->velocity, 150, right, pm->ps->velocity); } - else if ( anim == BOTH_WALL_RUN_RIGHT_FLIP ) + else if (anim == BOTH_WALL_RUN_RIGHT_FLIP) { pm->ps->velocity[0] *= 0.5f; pm->ps->velocity[1] *= 0.5f; - VectorMA( pm->ps->velocity, -150, right, pm->ps->velocity ); + VectorMA(pm->ps->velocity, -150, right, pm->ps->velocity); } - PM_SetAnim( pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 0 ); - pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; + PM_SetAnim(pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD, 0); + pm->ps->pm_flags |= PMF_JUMPING | PMF_SLOW_MO_FALL; pm->cmd.upmove = 0; } } - if ( pm->cmd.upmove != 0 ) + if (pm->cmd.upmove != 0) {//jump failed, so don't try to do normal jump code, just return return qfalse; } } - else if ( pm->ps->legsAnim == BOTH_FORCEWALLRUNFLIP_START ) + else if (pm->ps->legsAnim == BOTH_FORCEWALLRUNFLIP_START) {//want to jump off wall - vec3_t fwd, traceto, mins = {pm->mins[0],pm->mins[0],0}, maxs = {pm->maxs[0],pm->maxs[0],24}, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; + vec3_t fwd, traceto, mins = { pm->mins[0], pm->mins[0], 0 }, maxs = { pm->maxs[0], pm->maxs[0], 24 }, fwdAngles = { 0, pm->ps->viewangles[YAW], 0 }; trace_t trace; int anim = -1; - AngleVectors( fwdAngles, fwd, NULL, NULL ); + AngleVectors(fwdAngles, fwd, NULL, NULL); - float animLen = PM_AnimLength( pm->gent->client->clientInfo.animFileIndex, BOTH_FORCEWALLRUNFLIP_START ); - if ( pm->ps->legsAnimTimer < animLen - 250 )//was 400 + float animLen = PM_AnimLength(pm->gent->client->clientInfo.animFileIndex, BOTH_FORCEWALLRUNFLIP_START); + if (pm->ps->legsAnimTimer < animLen - 250)//was 400 {//not at start of anim - VectorMA( pm->ps->origin, 16, fwd, traceto ); + VectorMA(pm->ps->origin, 16, fwd, traceto); anim = BOTH_FORCEWALLRUNFLIP_END; } - if ( anim != -1 ) + if (anim != -1) { - pm->trace( &trace, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, CONTENTS_SOLID|CONTENTS_BODY, (EG2_Collision)0, 0 ); - if ( trace.fraction < 1.0f ) + pm->trace(&trace, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, CONTENTS_SOLID | CONTENTS_BODY, (EG2_Collision)0, 0); + if (trace.fraction < 1.0f) {//flip off wall pm->ps->velocity[0] *= 0.5f; pm->ps->velocity[1] *= 0.5f; - VectorMA( pm->ps->velocity, WALL_RUN_UP_BACKFLIP_SPEED, fwd, pm->ps->velocity ); + VectorMA(pm->ps->velocity, WALL_RUN_UP_BACKFLIP_SPEED, fwd, pm->ps->velocity); pm->ps->velocity[2] += 200; int parts = SETANIM_LEGS; - if ( !pm->ps->weaponTime ) + if (!pm->ps->weaponTime) {//not attacking, set anim on both parts = SETANIM_BOTH; } - PM_SetAnim( pm, parts, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 0 ); + PM_SetAnim(pm, parts, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD, 0); //FIXME: do damage to traceEnt, like above? - pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; + pm->ps->pm_flags |= PMF_JUMPING | PMF_SLOW_MO_FALL; pm->cmd.upmove = 0; - PM_AddEvent( EV_JUMP ); + PM_AddEvent(EV_JUMP); } } - if ( pm->cmd.upmove != 0 ) + if (pm->cmd.upmove != 0) {//jump failed, so don't try to do normal jump code, just return return qfalse; } } /* - else if ( pm->cmd.forwardmove < 0 - && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 - && !(pm->ps->pm_flags&PMF_JUMP_HELD) //not holding jump - && (level.time - pm->ps->lastOnGround) <= 250 //just jumped - )//&& !(pm->cmd.buttons&BUTTON_ATTACK) ) + else if ( pm->cmd.forwardmove < 0 + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 + && !(pm->ps->pm_flags&PMF_JUMP_HELD) //not holding jump + && (level.time - pm->ps->lastOnGround) <= 250 //just jumped + )//&& !(pm->cmd.buttons&BUTTON_ATTACK) ) {//double-tap back-jump does backflip - vec3_t fwd, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; + vec3_t fwd, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; - AngleVectors( fwdAngles, fwd, NULL, NULL ); - pm->ps->velocity[0] = pm->ps->velocity[1] = 0; - VectorMA( pm->ps->velocity, -150, fwd, pm->ps->velocity ); - //pm->ps->velocity[2] = JUMP_VELOCITY; - int parts = SETANIM_LEGS; - if ( !pm->ps->weaponTime ) - { - parts = SETANIM_BOTH; - } - PM_SetAnim( pm, parts, PM_PickAnim( pm->gent, BOTH_FLIP_BACK1, BOTH_FLIP_BACK3 ), SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 0 ); - pm->ps->forceJumpZStart = pm->ps->origin[2];//so we don't take damage if we land at same height - pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; - pm->cmd.upmove = 0; - G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); - WP_ForcePowerDrain( pm->gent, FP_LEVITATION, 0 ); + AngleVectors( fwdAngles, fwd, NULL, NULL ); + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + VectorMA( pm->ps->velocity, -150, fwd, pm->ps->velocity ); + //pm->ps->velocity[2] = JUMP_VELOCITY; + int parts = SETANIM_LEGS; + if ( !pm->ps->weaponTime ) + { + parts = SETANIM_BOTH; + } + PM_SetAnim( pm, parts, PM_PickAnim( pm->gent, BOTH_FLIP_BACK1, BOTH_FLIP_BACK3 ), SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 0 ); + pm->ps->forceJumpZStart = pm->ps->origin[2];//so we don't take damage if we land at same height + pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; + pm->cmd.upmove = 0; + G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); + WP_ForcePowerDrain( pm->gent, FP_LEVITATION, 0 ); } */ /* else if ( pm->cmd.forwardmove > 0 //pushing forward - && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period - && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //have force jump 2 or higher - && (level.time - pm->ps->lastOnGround) <= 250//just jumped - && (pm->ps->legsAnim == BOTH_JUMP1 || pm->ps->legsAnim == BOTH_INAIR1 )//not in a flip or spin or anything + && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_1 //have force jump 2 or higher + && (level.time - pm->ps->lastOnGround) <= 250//just jumped + && (pm->ps->legsAnim == BOTH_JUMP1 || pm->ps->legsAnim == BOTH_INAIR1 )//not in a flip or spin or anything {//run up wall, flip backwards - //FIXME: have to be moving... make sure it's opposite the wall... or at least forward? - int wallWalkAnim = BOTH_WALL_FLIP_BACK1; - int parts = SETANIM_LEGS; - int contents = CONTENTS_SOLID; - qboolean kick = qtrue; - if ( pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_2 ) - { - wallWalkAnim = BOTH_FORCEWALLRUNFLIP_START; - parts = SETANIM_BOTH; - kick = qfalse; - } - else - { - contents |= CONTENTS_BODY; - if ( !pm->ps->weaponTime ) - { - parts = SETANIM_BOTH; - } - } - if ( PM_HasAnimation( pm->gent, wallWalkAnim ) ) - { - vec3_t fwd, traceto, mins = {pm->mins[0],pm->mins[1],0}, maxs = {pm->maxs[0],pm->maxs[1],24}, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; - trace_t trace; - vec3_t idealNormal; + //FIXME: have to be moving... make sure it's opposite the wall... or at least forward? + int wallWalkAnim = BOTH_WALL_FLIP_BACK1; + int parts = SETANIM_LEGS; + int contents = CONTENTS_SOLID; + qboolean kick = qtrue; + if ( pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_2 ) + { + wallWalkAnim = BOTH_FORCEWALLRUNFLIP_START; + parts = SETANIM_BOTH; + kick = qfalse; + } + else + { + contents |= CONTENTS_BODY; + if ( !pm->ps->weaponTime ) + { + parts = SETANIM_BOTH; + } + } + if ( PM_HasAnimation( pm->gent, wallWalkAnim ) ) + { + vec3_t fwd, traceto, mins = {pm->mins[0],pm->mins[1],0}, maxs = {pm->maxs[0],pm->maxs[1],24}, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; + trace_t trace; + vec3_t idealNormal; - AngleVectors( fwdAngles, fwd, NULL, NULL ); - VectorMA( pm->ps->origin, 32, fwd, traceto ); + AngleVectors( fwdAngles, fwd, NULL, NULL ); + VectorMA( pm->ps->origin, 32, fwd, traceto ); - pm->trace( &trace, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, contents );//FIXME: clip brushes too? - VectorSubtract( pm->ps->origin, traceto, idealNormal ); - VectorNormalize( idealNormal ); - gentity_t *traceEnt = &g_entities[trace.entityNum]; - - if ( trace.fraction < 1.0f - &&((trace.entityNums.solid!=SOLID_BMODEL)||DotProduct(trace.plane.normal,idealNormal)>0.7) ) - {//there is a wall there - pm->ps->velocity[0] = pm->ps->velocity[1] = 0; - if ( wallWalkAnim == BOTH_FORCEWALLRUNFLIP_START ) - { - pm->ps->velocity[2] = forceJumpStrength[FORCE_LEVEL_3]/2.0f; - } - else - { - VectorMA( pm->ps->velocity, -150, fwd, pm->ps->velocity ); - } - //animate me - PM_SetAnim( pm, parts, wallWalkAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 0 ); - pm->ps->forceJumpZStart = pm->ps->origin[2];//so we don't take damage if we land at same height - pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; - pm->cmd.upmove = 0; - G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); - WP_ForcePowerDrain( pm->gent, FP_LEVITATION, 0 ); - //kick if jumping off an ent - if ( kick && pm->gent && trace.entityNum < ENTITYNUM_WORLD ) - { - if ( traceEnt - && traceEnt->client - && traceEnt->health > 0 - && traceEnt->takedamage - && traceEnt->client->NPC_class != CLASS_GALAKMECH - && traceEnt->client->NPC_class != CLASS_DESANN - && !(traceEnt->flags&FL_NO_KNOCKBACK) ) - {//push them away and do pain - vec3_t oppDir; - float strength = VectorNormalize2( pm->ps->velocity, oppDir ); - VectorScale( oppDir, -1, oppDir ); - //FIXME: need knockdown anim - G_Damage( traceEnt, pm->gent, pm->gent, oppDir, traceEnt->currentOrigin, 10, DAMAGE_NO_ARMOR|DAMAGE_NO_HIT_LOC|DAMAGE_NO_KNOCKBACK, MOD_MELEE ); - G_Sound( traceEnt, G_SoundIndex( va("sound/weapons/melee/punch%d", Q_irand(1, 4)) ) ); - if ( trace.fraction <= 0.5f ) - {//close to him - if ( traceEnt->health > 0 ) - {//didn't kill him - if ( (traceEnt->s.number==0&&!Q_irand(0,g_spskill->integer)) - || (traceEnt->NPC!=NULL&&Q_irand(RANK_CIVILIAN,traceEnt->NPC->rank)+Q_irand(-2,2)trace( &trace, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, contents );//FIXME: clip brushes too? + VectorSubtract( pm->ps->origin, traceto, idealNormal ); + VectorNormalize( idealNormal ); + gentity_t *traceEnt = &g_entities[trace.entityNum]; + + if ( trace.fraction < 1.0f + &&((trace.entityNums.solid!=SOLID_BMODEL)||DotProduct(trace.plane.normal,idealNormal)>0.7) ) + {//there is a wall there + pm->ps->velocity[0] = pm->ps->velocity[1] = 0; + if ( wallWalkAnim == BOTH_FORCEWALLRUNFLIP_START ) + { + pm->ps->velocity[2] = forceJumpStrength[FORCE_LEVEL_3]/2.0f; + } + else + { + VectorMA( pm->ps->velocity, -150, fwd, pm->ps->velocity ); + } + //animate me + PM_SetAnim( pm, parts, wallWalkAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 0 ); + pm->ps->forceJumpZStart = pm->ps->origin[2];//so we don't take damage if we land at same height + pm->ps->pm_flags |= PMF_JUMPING|PMF_SLOW_MO_FALL; + pm->cmd.upmove = 0; + G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); + WP_ForcePowerDrain( pm->gent, FP_LEVITATION, 0 ); + //kick if jumping off an ent + if ( kick && pm->gent && trace.entityNum < ENTITYNUM_WORLD ) + { + if ( traceEnt + && traceEnt->client + && traceEnt->health > 0 + && traceEnt->takedamage + && traceEnt->client->NPC_class != CLASS_GALAKMECH + && traceEnt->client->NPC_class != CLASS_DESANN + && !(traceEnt->flags&FL_NO_KNOCKBACK) ) + {//push them away and do pain + vec3_t oppDir; + float strength = VectorNormalize2( pm->ps->velocity, oppDir ); + VectorScale( oppDir, -1, oppDir ); + //FIXME: need knockdown anim + G_Damage( traceEnt, pm->gent, pm->gent, oppDir, traceEnt->currentOrigin, 10, DAMAGE_NO_ARMOR|DAMAGE_NO_HIT_LOC|DAMAGE_NO_KNOCKBACK, MOD_MELEE ); + G_Sound( traceEnt, G_SoundIndex( va("sound/weapons/melee/punch%d", Q_irand(1, 4)) ) ); + if ( trace.fraction <= 0.5f ) + {//close to him + if ( traceEnt->health > 0 ) + {//didn't kill him + if ( (traceEnt->s.number==0&&!Q_irand(0,g_spskill->integer)) + || (traceEnt->NPC!=NULL&&Q_irand(RANK_CIVILIAN,traceEnt->NPC->rank)+Q_irand(-2,2)ps->legsAnimTimer<=100 - ||!PM_InSpecialJump( legsAnim )//not in a special jump anim - ||PM_InReboundJump( legsAnim )//we're already in a rebound - ||PM_InBackFlip( legsAnim ) )//a backflip (needed so you can jump off a wall behind you) - //&& pm->ps->velocity[2] <= 0 - && pm->ps->velocity[2] > -1200 //not falling down very fast - && !(pm->ps->pm_flags&PMF_JUMP_HELD)//have to have released jump since last press - && (pm->cmd.forwardmove||pm->cmd.rightmove)//pushing in a direction - //&& pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period - && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_2//level 3 jump or better - && pm->ps->forcePower > 10 //have enough force power to do another one - && (level.time-pm->ps->lastOnGround) > 250 //haven't been on the ground in the last 1/4 of a second - && (!(pm->ps->pm_flags&PMF_JUMPING)//not jumping - || ( (level.time-pm->ps->lastOnGround) > 250 //we are jumping, but have been in the air for at least half a second - &&( g_debugMelee->integer//if you know kung fu, no height cap on wall-grab-jumps - || ((pm->ps->origin[2]-pm->ps->forceJumpZStart) < (forceJumpHeightMax[FORCE_LEVEL_3]-(G_ForceWallJumpStrength()/2.0f))) )//can fit at least one more wall jump in (yes, using "magic numbers"... for now) - ) - ) - //&& (pm->ps->legsAnim == BOTH_JUMP1 || pm->ps->legsAnim == BOTH_INAIR1 ) )//not in a flip or spin or anything - ) + else if ((pm->ps->legsAnimTimer <= 100 + || !PM_InSpecialJump(legsAnim)//not in a special jump anim + || PM_InReboundJump(legsAnim)//we're already in a rebound + || PM_InBackFlip(legsAnim))//a backflip (needed so you can jump off a wall behind you) + //&& pm->ps->velocity[2] <= 0 + && pm->ps->velocity[2] > -1200 //not falling down very fast + && !(pm->ps->pm_flags&PMF_JUMP_HELD)//have to have released jump since last press + && (pm->cmd.forwardmove || pm->cmd.rightmove)//pushing in a direction + //&& pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_2//level 3 jump or better + && pm->ps->forcePower > 10 //have enough force power to do another one + && (level.time - pm->ps->lastOnGround) > 250 //haven't been on the ground in the last 1/4 of a second + && (!(pm->ps->pm_flags&PMF_JUMPING)//not jumping + || ((level.time - pm->ps->lastOnGround) > 250 //we are jumping, but have been in the air for at least half a second + && (g_debugMelee->integer//if you know kung fu, no height cap on wall-grab-jumps + || ((pm->ps->origin[2] - pm->ps->forceJumpZStart) < (forceJumpHeightMax[FORCE_LEVEL_3] - (G_ForceWallJumpStrength() / 2.0f))))//can fit at least one more wall jump in (yes, using "magic numbers"... for now) + ) + ) + //&& (pm->ps->legsAnim == BOTH_JUMP1 || pm->ps->legsAnim == BOTH_INAIR1 ) )//not in a flip or spin or anything + ) {//see if we're pushing at a wall and jump off it if so - if ( !(pm->ps->saber[0].saberFlags&SFL_NO_WALL_GRAB) - && ( !pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_WALL_GRAB) ) ) + if (!(pm->ps->saber[0].saberFlags&SFL_NO_WALL_GRAB) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_WALL_GRAB))) {//okay to do wall-grabs with this saber //FIXME: make sure we have enough force power //FIXME: check to see if we can go any higher //FIXME: limit to a certain number of these in a row? //FIXME: maybe don't require a ucmd direction, just check all 4? //FIXME: should stick to the wall for a second, then push off... - vec3_t checkDir, traceto, mins = {pm->mins[0],pm->mins[1],0}, maxs = {pm->maxs[0],pm->maxs[1],24}, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; + vec3_t checkDir, traceto, mins = { pm->mins[0], pm->mins[1], 0 }, maxs = { pm->maxs[0], pm->maxs[1], 24 }, fwdAngles = { 0, pm->ps->viewangles[YAW], 0 }; trace_t trace; vec3_t idealNormal; int anim = -1; - if ( pm->cmd.rightmove ) + if (pm->cmd.rightmove) { - if ( pm->cmd.rightmove > 0 ) + if (pm->cmd.rightmove > 0) { anim = BOTH_FORCEWALLREBOUND_RIGHT; - AngleVectors( fwdAngles, NULL, checkDir, NULL ); + AngleVectors(fwdAngles, NULL, checkDir, NULL); } - else if ( pm->cmd.rightmove < 0 ) + else if (pm->cmd.rightmove < 0) { anim = BOTH_FORCEWALLREBOUND_LEFT; - AngleVectors( fwdAngles, NULL, checkDir, NULL ); - VectorScale( checkDir, -1, checkDir ); + AngleVectors(fwdAngles, NULL, checkDir, NULL); + VectorScale(checkDir, -1, checkDir); } } - else if ( pm->cmd.forwardmove > 0 ) + else if (pm->cmd.forwardmove > 0) { anim = BOTH_FORCEWALLREBOUND_FORWARD; - AngleVectors( fwdAngles, checkDir, NULL, NULL ); + AngleVectors(fwdAngles, checkDir, NULL, NULL); } - else if ( pm->cmd.forwardmove < 0 ) + else if (pm->cmd.forwardmove < 0) { anim = BOTH_FORCEWALLREBOUND_BACK; - AngleVectors( fwdAngles, checkDir, NULL, NULL ); - VectorScale( checkDir, -1, checkDir ); + AngleVectors(fwdAngles, checkDir, NULL, NULL); + VectorScale(checkDir, -1, checkDir); } - if ( anim != -1 ) + if (anim != -1) {//trace in the dir we're pushing in and see if there's a vertical wall there - VectorMA( pm->ps->origin, 16, checkDir, traceto );//was 8 - pm->trace( &trace, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, CONTENTS_SOLID, (EG2_Collision)0, 0 );//FIXME: clip brushes too? - VectorSubtract( pm->ps->origin, traceto, idealNormal ); - VectorNormalize( idealNormal ); + VectorMA(pm->ps->origin, 16, checkDir, traceto);//was 8 + pm->trace(&trace, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, CONTENTS_SOLID, (EG2_Collision)0, 0);//FIXME: clip brushes too? + VectorSubtract(pm->ps->origin, traceto, idealNormal); + VectorNormalize(idealNormal); gentity_t *traceEnt = &g_entities[trace.entityNum]; - if ( trace.fraction < 1.0f + if (trace.fraction < 1.0f && fabs(trace.plane.normal[2]) <= MAX_WALL_GRAB_SLOPE - &&((trace.entityNums.solid!=SOLID_BMODEL)||DotProduct(trace.plane.normal,idealNormal)>0.7) ) + && ((trace.entityNums.solid != SOLID_BMODEL) || DotProduct(trace.plane.normal, idealNormal)>0.7)) {//there is a wall there - float dot = DotProduct( pm->ps->velocity, trace.plane.normal ); - if ( dot < 1.0f ) + float dot = DotProduct(pm->ps->velocity, trace.plane.normal); + if (dot < 1.0f) {//can't be heading *away* from the wall! //grab it! - PM_GrabWallForJump( anim ); + PM_GrabWallForJump(anim); } } } @@ -2353,70 +2367,70 @@ static qboolean PM_CheckJump( void ) } } - if ( pm->gent - //&& pm->cmd.upmove > 0 + if (pm->gent + //&& pm->cmd.upmove > 0 && pm->ps->forceRageRecoveryTime < pm->cmd.serverTime //not in a force Rage recovery period && pm->ps->weapon == WP_SABER - && (pm->ps->weaponTime > 0||(pm->cmd.buttons&BUTTON_ATTACK)) - && ((pm->ps->clientNum&&!PM_ControlledByPlayer())||((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode)) ) + && (pm->ps->weaponTime > 0 || (pm->cmd.buttons&BUTTON_ATTACK)) + && ((pm->ps->clientNum&&!PM_ControlledByPlayer()) || ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && cg.renderingThirdPerson && !cg.zoomMode))) {//okay, we just jumped and we're in an attack - if ( !PM_RollingAnim( pm->ps->legsAnim ) - && !PM_InKnockDown( pm->ps ) + if (!PM_RollingAnim(pm->ps->legsAnim) + && !PM_InKnockDown(pm->ps) && !PM_InDeathAnim() - && !PM_PainAnim( pm->ps->torsoAnim ) - && !PM_FlippingAnim( pm->ps->legsAnim ) - && !PM_SpinningAnim( pm->ps->legsAnim ) - && !PM_SaberInSpecialAttack( pm->ps->torsoAnim ) ) + && !PM_PainAnim(pm->ps->torsoAnim) + && !PM_FlippingAnim(pm->ps->legsAnim) + && !PM_SpinningAnim(pm->ps->legsAnim) + && !PM_SaberInSpecialAttack(pm->ps->torsoAnim)) {//HMM... do NPCs need this logic? - if ( !PM_SaberInTransitionAny( pm->ps->saberMove ) //not going to/from/between an attack anim - && !PM_SaberInAttack( pm->ps->saberMove ) //not in attack anim + if (!PM_SaberInTransitionAny(pm->ps->saberMove) //not going to/from/between an attack anim + && !PM_SaberInAttack(pm->ps->saberMove) //not in attack anim && pm->ps->weaponTime <= 0//not busy - && (pm->cmd.buttons&BUTTON_ATTACK) )//want to attack + && (pm->cmd.buttons&BUTTON_ATTACK))//want to attack {//not in an attack or finishing/starting/transitioning one - if ( PM_CheckBackflipAttackMove() ) + if (PM_CheckBackflipAttackMove()) { - PM_SetSaberMove( PM_SaberBackflipAttackMove() );//backflip attack + PM_SetSaberMove(PM_SaberBackflipAttackMove());//backflip attack } /* else if ( PM_CheckSaberDualJumpAttackMove() ) { - PM_SetSaberMove( PM_SaberDualJumpAttackMove() );//jump forward sideways flip attack + PM_SetSaberMove( PM_SaberDualJumpAttackMove() );//jump forward sideways flip attack } */ } /* else if ( ( PM_SaberInTransitionAny( pm->ps->saberMove ) || PM_SaberInAttack( pm->ps->saberMove ) ) - && PM_InAnimForSaberMove( pm->ps->torsoAnim, pm->ps->saberMove ) ) + && PM_InAnimForSaberMove( pm->ps->torsoAnim, pm->ps->saberMove ) ) {//not in an anim we shouldn't interrupt - //see if it's not too late to start a special jump-attack - float animLength = PM_AnimLength( g_entities[pm->ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)pm->ps->torsoAnim ); - if ( animLength - pm->ps->torsoAnimTimer < 500 ) - {//just started the saberMove - //check for special-case jump attacks - if ( PM_CheckFlipOverAttackMove( qtrue ) ) - { - PM_SetSaberMove( PM_SaberFlipOverAttackMove() ); - } - else if ( PM_CheckJumpAttackMove() ) - { - PM_SetSaberMove( PM_SaberJumpAttackMove() ); - } - } + //see if it's not too late to start a special jump-attack + float animLength = PM_AnimLength( g_entities[pm->ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)pm->ps->torsoAnim ); + if ( animLength - pm->ps->torsoAnimTimer < 500 ) + {//just started the saberMove + //check for special-case jump attacks + if ( PM_CheckFlipOverAttackMove( qtrue ) ) + { + PM_SetSaberMove( PM_SaberFlipOverAttackMove() ); + } + else if ( PM_CheckJumpAttackMove() ) + { + PM_SetSaberMove( PM_SaberJumpAttackMove() ); + } + } } */ } } - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) + if (pm->ps->groundEntityNum == ENTITYNUM_NONE) { return qfalse; } - if ( pm->cmd.upmove > 0 ) + if (pm->cmd.upmove > 0) {//no special jumps /* gentity_t *groundEnt = &g_entities[pm->ps->groundEntityNum]; if ( groundEnt && groundEnt->NPC ) {//Can't jump off of someone's head - return qfalse; + return qfalse; } */ @@ -2425,11 +2439,11 @@ static qboolean PM_CheckJump( void ) pm->ps->pm_flags |= PMF_JUMPING; } - if ( d_JediAI->integer ) + if (d_JediAI->integer) { - if ( pm->ps->clientNum && pm->ps->weapon == WP_SABER ) + if (pm->ps->clientNum && pm->ps->weapon == WP_SABER) { - Com_Printf( "jumping\n" ); + Com_Printf("jumping\n"); } } //Jumping @@ -2439,20 +2453,20 @@ static qboolean PM_CheckJump( void ) pm->ps->groundEntityNum = ENTITYNUM_NONE; pm->ps->jumpZStart = pm->ps->origin[2]; - if ( pm->gent ) + if (pm->gent) { - if ( !Q3_TaskIDPending( pm->gent, TID_CHAN_VOICE ) ) + if (!Q3_TaskIDPending(pm->gent, TID_CHAN_VOICE)) { - PM_AddEvent( EV_JUMP ); + PM_AddEvent(EV_JUMP); } } else { - PM_AddEvent( EV_JUMP ); + PM_AddEvent(EV_JUMP); } //Set the animations - if ( pm->ps->gravity > 0 && !PM_InSpecialJump( pm->ps->legsAnim ) && !PM_InGetUp( pm->ps ) ) + if (pm->ps->gravity > 0 && !PM_InSpecialJump(pm->ps->legsAnim) && !PM_InGetUp(pm->ps)) { PM_JumpForDir(); } @@ -2465,7 +2479,7 @@ static qboolean PM_CheckJump( void ) PM_CheckWaterJump ============= */ -static qboolean PM_CheckWaterJump( void ) { +static qboolean PM_CheckWaterJump(void) { vec3_t spot; int cont; vec3_t flatforward; @@ -2474,16 +2488,16 @@ static qboolean PM_CheckWaterJump( void ) { return qfalse; } - if ( pm->cmd.forwardmove <= 0 && pm->cmd.upmove <= 0 ) + if (pm->cmd.forwardmove <= 0 && pm->cmd.upmove <= 0) {//they must not want to get out? return qfalse; } // check for water jump - if ( pm->waterlevel != 2 ) { + if (pm->waterlevel != 2) { return qfalse; } - if ( pm->watertype & CONTENTS_LADDER ) { + if (pm->watertype & CONTENTS_LADDER) { if (pm->ps->velocity[2] <= 0) return qfalse; } @@ -2491,24 +2505,24 @@ static qboolean PM_CheckWaterJump( void ) { flatforward[0] = pml.forward[0]; flatforward[1] = pml.forward[1]; flatforward[2] = 0; - VectorNormalize( flatforward ); + VectorNormalize(flatforward); - VectorMA( pm->ps->origin, 30, flatforward, spot ); + VectorMA(pm->ps->origin, 30, flatforward, spot); spot[2] += 24; - cont = pm->pointcontents (spot, pm->ps->clientNum ); - if ( !(cont & CONTENTS_SOLID) ) { + cont = pm->pointcontents(spot, pm->ps->clientNum); + if (!(cont & CONTENTS_SOLID)) { return qfalse; } - + spot[2] += 16; - cont = pm->pointcontents( spot, pm->ps->clientNum ); - if ( cont&(CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_WATER|CONTENTS_SLIME|CONTENTS_LAVA|CONTENTS_BODY) ) { + cont = pm->pointcontents(spot, pm->ps->clientNum); + if (cont&(CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA | CONTENTS_BODY)) { return qfalse; } // jump out of water - VectorScale( pml.forward, 200, pm->ps->velocity ); - pm->ps->velocity[2] = 350+((pm->ps->waterheight-pm->ps->origin[2])*2); + VectorScale(pml.forward, 200, pm->ps->velocity); + pm->ps->velocity[2] = 350 + ((pm->ps->waterheight - pm->ps->origin[2]) * 2); pm->ps->pm_flags |= PMF_TIME_WATERJUMP; pm->ps->pm_time = 2000; @@ -2526,14 +2540,14 @@ PM_WaterJumpMove Flying out of the water =================== */ -static void PM_WaterJumpMove( void ) +static void PM_WaterJumpMove(void) { // waterjump has no control, but falls - PM_StepSlideMove( 1 ); + PM_StepSlideMove(1); pm->ps->velocity[2] -= pm->ps->gravity * pml.frametime; - if (pm->ps->velocity[2] < 0) + if (pm->ps->velocity[2] < 0) { // cancel as soon as we are falling down again pm->ps->pm_flags &= ~PMF_ALL_TIMES; @@ -2547,7 +2561,7 @@ PM_WaterMove =================== */ -static void PM_WaterMove( void ) { +static void PM_WaterMove(void) { int i; vec3_t wishvel; float wishspeed; @@ -2555,68 +2569,72 @@ static void PM_WaterMove( void ) { float scale; float vel; - if ( PM_CheckWaterJump() ) { + if (PM_CheckWaterJump()) { PM_WaterJumpMove(); return; } - else if ( pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0 && pm->waterlevel < 3 ) + else if (pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0 && pm->waterlevel < 3) { - if ( PM_CheckJump () ) { + if (PM_CheckJump()) { // jumped away return; } } #if 0 // jump = head for surface - if ( pm->cmd.upmove >= 10 ) { + if (pm->cmd.upmove >= 10) { if (pm->ps->velocity[2] > -300) { - if ( pm->watertype == CONTENTS_WATER ) { + if (pm->watertype == CONTENTS_WATER) { pm->ps->velocity[2] = 100; - } else if (pm->watertype == CONTENTS_SLIME) { + } + else if (pm->watertype == CONTENTS_SLIME) { pm->ps->velocity[2] = 80; - } else { + } + else { pm->ps->velocity[2] = 50; } } } #endif - PM_Friction (); + PM_Friction(); - scale = PM_CmdScale( &pm->cmd ); + scale = PM_CmdScale(&pm->cmd); // // user intentions // - if ( !scale ) { + if (!scale) { wishvel[0] = 0; wishvel[1] = 0; - if ( pm->watertype & CONTENTS_LADDER ) { + if (pm->watertype & CONTENTS_LADDER) { wishvel[2] = 0; - } else { + } + else { wishvel[2] = -60; // sink towards bottom } - } else { - for (i=0 ; i<3 ; i++) { - wishvel[i] = scale * pml.forward[i]*pm->cmd.forwardmove + scale * pml.right[i]*pm->cmd.rightmove; + } + else { + for (i = 0; i<3; i++) { + wishvel[i] = scale * pml.forward[i] * pm->cmd.forwardmove + scale * pml.right[i] * pm->cmd.rightmove; } wishvel[2] += scale * pm->cmd.upmove; - if ( !(pm->watertype&CONTENTS_LADDER) ) //ladder + if (!(pm->watertype&CONTENTS_LADDER)) //ladder { - float depth = (pm->ps->origin[2]+pm->gent->client->standheight)-pm->ps->waterheight; - if ( depth >= 12 ) + float depth = (pm->ps->origin[2] + pm->gent->client->standheight) - pm->ps->waterheight; + if (depth >= 12) {//too high! wishvel[2] -= 120; // sink towards bottom - if ( wishvel[2] > 0 ) + if (wishvel[2] > 0) { wishvel[2] = 0; } } - else if ( pm->ps->waterHeightLevel >= WHL_UNDER )//!depth && pm->waterlevel == 3 ) + else if (pm->ps->waterHeightLevel >= WHL_UNDER)//!depth && pm->waterlevel == 3 ) { } - else if ( depth < 12 ) + else if (depth < 12) {//still deep wishvel[2] -= 60; // sink towards bottom - if ( wishvel[2] > 30 ) + if (wishvel[2] > 30) { wishvel[2] = 30; } @@ -2624,38 +2642,39 @@ static void PM_WaterMove( void ) { } } - VectorCopy (wishvel, wishdir); + VectorCopy(wishvel, wishdir); wishspeed = VectorNormalize(wishdir); - if ( pm->watertype & CONTENTS_LADDER ) //ladder + if (pm->watertype & CONTENTS_LADDER) //ladder { - if ( wishspeed > pm->ps->speed * pm_ladderScale ) { + if (wishspeed > pm->ps->speed * pm_ladderScale) { wishspeed = pm->ps->speed * pm_ladderScale; } - PM_Accelerate( wishdir, wishspeed, pm_flyaccelerate ); - } else { - if ( pm->ps->gravity < 0 ) + PM_Accelerate(wishdir, wishspeed, pm_flyaccelerate); + } + else { + if (pm->ps->gravity < 0) {//float up pm->ps->velocity[2] -= pm->ps->gravity * pml.frametime; } - if ( wishspeed > pm->ps->speed * pm_swimScale ) { + if (wishspeed > pm->ps->speed * pm_swimScale) { wishspeed = pm->ps->speed * pm_swimScale; } - PM_Accelerate( wishdir, wishspeed, pm_wateraccelerate ); + PM_Accelerate(wishdir, wishspeed, pm_wateraccelerate); } // make sure we can go up slopes easily under water - if ( pml.groundPlane && DotProduct( pm->ps->velocity, pml.groundTrace.plane.normal ) < 0 ) { + if (pml.groundPlane && DotProduct(pm->ps->velocity, pml.groundTrace.plane.normal) < 0) { vel = VectorLength(pm->ps->velocity); // slide along the ground plane - PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal, - pm->ps->velocity, OVERCLIP ); + PM_ClipVelocity(pm->ps->velocity, pml.groundTrace.plane.normal, + pm->ps->velocity, OVERCLIP); VectorNormalize(pm->ps->velocity); VectorScale(pm->ps->velocity, vel, pm->ps->velocity); } - PM_SlideMove( qfalse ); + PM_SlideMove(qfalse); } @@ -2665,7 +2684,7 @@ PM_FlyVehicleMove =================== */ -static void PM_FlyVehicleMove( void ) +static void PM_FlyVehicleMove(void) { int i; vec3_t wishvel; @@ -2681,39 +2700,39 @@ static void PM_FlyVehicleMove( void ) //smove = pm->cmd.rightmove; // normal slowdown - if ( pm->ps->gravity && pm->ps->velocity[2] < 0 && pm->ps->groundEntityNum == ENTITYNUM_NONE ) + if (pm->ps->gravity && pm->ps->velocity[2] < 0 && pm->ps->groundEntityNum == ENTITYNUM_NONE) {//falling zVel = pm->ps->velocity[2]; - PM_Friction (); + PM_Friction(); pm->ps->velocity[2] = zVel; } else { - PM_Friction (); - if ( pm->ps->velocity[2] < 0 && pm->ps->groundEntityNum != ENTITYNUM_NONE ) + PM_Friction(); + if (pm->ps->velocity[2] < 0 && pm->ps->groundEntityNum != ENTITYNUM_NONE) { pm->ps->velocity[2] = 0; // ignore slope movement } } - scale = PM_CmdScale( &pm->cmd ); + scale = PM_CmdScale(&pm->cmd); // Get The WishVel And WishSpeed - //------------------------------- - if ( pm->ps->clientNum && (USENEWNAVSYSTEM || !VectorCompare( pm->ps->moveDir, vec3_origin )) ) + //------------------------------- + if (pm->ps->clientNum && (USENEWNAVSYSTEM || !VectorCompare(pm->ps->moveDir, vec3_origin))) {//NPC - + // If The UCmds Were Set, But Never Converted Into A MoveDir, Then Make The WishDir From UCmds //-------------------------------------------------------------------------------------------- - if ((fmove!=0.0f || smove!=0.0f) && VectorCompare(pm->ps->moveDir, vec3_origin)) + if ((fmove != 0.0f || smove != 0.0f) && VectorCompare(pm->ps->moveDir, vec3_origin)) { //gi.Printf("Generating MoveDir\n"); - for ( i = 0 ; i < 3 ; i++ ) + for (i = 0; i < 3; i++) { - wishvel[i] = pml.forward[i]*fmove + pml.right[i]*smove; + wishvel[i] = pml.forward[i] * fmove + pml.right[i] * smove; } - VectorCopy( wishvel, wishdir ); + VectorCopy(wishvel, wishdir); wishspeed = VectorNormalize(wishdir); wishspeed *= scale; } @@ -2722,38 +2741,38 @@ static void PM_FlyVehicleMove( void ) else { wishspeed = pm->ps->speed; - VectorScale( pm->ps->moveDir, pm->ps->speed, wishvel ); - VectorCopy( pm->ps->moveDir, wishdir ); + VectorScale(pm->ps->moveDir, pm->ps->speed, wishvel); + VectorCopy(pm->ps->moveDir, wishdir); } } else { - for ( i = 0 ; i < 3 ; i++ ) { - wishvel[i] = pml.forward[i]*fmove + pml.right[i]*smove; + for (i = 0; i < 3; i++) { + wishvel[i] = pml.forward[i] * fmove + pml.right[i] * smove; } // when going up or down slopes the wish velocity should Not be zero - // wishvel[2] = 0; + // wishvel[2] = 0; - VectorCopy (wishvel, wishdir); + VectorCopy(wishvel, wishdir); wishspeed = VectorNormalize(wishdir); wishspeed *= scale; } // Handle negative speed. - if ( wishspeed < 0 ) + if (wishspeed < 0) { wishspeed = wishspeed * -1.0f; - VectorScale( wishvel, -1.0f, wishvel ); - VectorScale( wishdir, -1.0f, wishdir ); + VectorScale(wishvel, -1.0f, wishvel); + VectorScale(wishdir, -1.0f, wishdir); } - VectorCopy( wishvel, wishdir ); - wishspeed = VectorNormalize( wishdir ); + VectorCopy(wishvel, wishdir); + wishspeed = VectorNormalize(wishdir); - PM_Accelerate( wishdir, wishspeed, 100 ); + PM_Accelerate(wishdir, wishspeed, 100); - PM_StepSlideMove( 1 ); + PM_StepSlideMove(1); } /* @@ -2763,7 +2782,7 @@ PM_FlyMove Only with the flight powerup =================== */ -static void PM_FlyMove( void ) +static void PM_FlyMove(void) { int i; vec3_t wishvel; @@ -2775,18 +2794,18 @@ static void PM_FlyMove( void ) qboolean jetPackMove = qfalse; // normal slowdown - PM_Friction (); + PM_Friction(); - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) - && pm->gent - && pm->gent->client - && (pm->gent->client->NPC_class == CLASS_BOBAFETT||pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) && pm->gent->client->moveType == MT_FLYSWIM ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + && pm->gent + && pm->gent->client + && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) && pm->gent->client->moveType == MT_FLYSWIM) {//jetpack accel accel = pm_flyaccelerate; jetPackMove = qtrue; } - else if ( pm->ps->gravity <= 0 - && ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || (pm->gent&&pm->gent->client&&pm->gent->client->moveType == MT_RUNJUMP)) ) + else if (pm->ps->gravity <= 0 + && ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) || (pm->gent&&pm->gent->client&&pm->gent->client->moveType == MT_RUNJUMP))) { PM_CheckJump(); accel = 1.0f; @@ -2799,56 +2818,56 @@ static void PM_FlyMove( void ) accel = pm_flyaccelerate; } - scale = PM_CmdScale( &pm->cmd ); + scale = PM_CmdScale(&pm->cmd); // // user intentions // - if ( !scale ) + if (!scale) { wishvel[0] = 0; wishvel[1] = 0; wishvel[2] = 0; - } + } else { - for (i=0 ; i<3 ; i++) + for (i = 0; i<3; i++) { - wishvel[i] = scale * pml.forward[i]*pm->cmd.forwardmove + scale * pml.right[i]*pm->cmd.rightmove; + wishvel[i] = scale * pml.forward[i] * pm->cmd.forwardmove + scale * pml.right[i] * pm->cmd.rightmove; } - if ( jetPackMove ) + if (jetPackMove) { wishvel[2] += pm->cmd.upmove; } - else if ( lowGravMove ) + else if (lowGravMove) { wishvel[2] += scale * pm->cmd.upmove; - VectorScale( wishvel, 0.5f, wishvel ); + VectorScale(wishvel, 0.5f, wishvel); } } - VectorCopy( wishvel, wishdir ); - wishspeed = VectorNormalize( wishdir ); + VectorCopy(wishvel, wishdir); + wishspeed = VectorNormalize(wishdir); - PM_Accelerate( wishdir, wishspeed, accel ); + PM_Accelerate(wishdir, wishspeed, accel); - PM_StepSlideMove( 1 ); + PM_StepSlideMove(1); } -qboolean PM_GroundSlideOkay( float zNormal ) +qboolean PM_GroundSlideOkay(float zNormal) { - if ( zNormal > 0 ) + if (zNormal > 0) { - if ( pm->ps->velocity[2] > 0 ) + if (pm->ps->velocity[2] > 0) { - if ( pm->ps->legsAnim == BOTH_WALL_RUN_RIGHT - || pm->ps->legsAnim == BOTH_WALL_RUN_LEFT + if (pm->ps->legsAnim == BOTH_WALL_RUN_RIGHT + || pm->ps->legsAnim == BOTH_WALL_RUN_LEFT || pm->ps->legsAnim == BOTH_WALL_RUN_RIGHT_STOP - || pm->ps->legsAnim == BOTH_WALL_RUN_LEFT_STOP - || pm->ps->legsAnim == BOTH_FORCEWALLRUNFLIP_START + || pm->ps->legsAnim == BOTH_WALL_RUN_LEFT_STOP + || pm->ps->legsAnim == BOTH_FORCEWALLRUNFLIP_START || pm->ps->legsAnim == BOTH_FORCELONGLEAP_START || pm->ps->legsAnim == BOTH_FORCELONGLEAP_ATTACK || pm->ps->legsAnim == BOTH_FORCELONGLEAP_LAND - || PM_InReboundJump( pm->ps->legsAnim )) + || PM_InReboundJump(pm->ps->legsAnim)) { return qfalse; } @@ -2862,13 +2881,12 @@ PM_AirMove =================== */ -static void PM_AirMove( void ) { +static void PM_AirMove(void) { int i; vec3_t wishvel; float fmove, smove; vec3_t wishdir; float wishspeed; - float scale; usercmd_t cmd; float gravMod = 1.0f; @@ -2882,7 +2900,7 @@ static void PM_AirMove( void ) { smove = pm->cmd.rightmove; cmd = pm->cmd; - scale = PM_CmdScale( &cmd ); + PM_CmdScale(&cmd); // set the movementDir so clients can rotate the legs for strafing PM_SetMovementDir(); @@ -2890,33 +2908,33 @@ static void PM_AirMove( void ) { // project moves down to flat plane pml.forward[2] = 0; pml.right[2] = 0; - VectorNormalize (pml.forward); - VectorNormalize (pml.right); + VectorNormalize(pml.forward); + VectorNormalize(pml.right); Vehicle_t *pVeh = NULL; - if ( pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE ) + if (pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE) { pVeh = pm->gent->m_pVehicle; } - if ( pVeh && pVeh->m_pVehicleInfo->hoverHeight > 0 ) + if (pVeh && pVeh->m_pVehicleInfo->hoverHeight > 0) {//in a hovering vehicle, have air control // Flying Or Breaking, No Control //-------------------------------- - if ( pVeh->m_ulFlags&VEH_FLYING || pVeh->m_ulFlags&VEH_SLIDEBREAKING) + if (pVeh->m_ulFlags&VEH_FLYING || pVeh->m_ulFlags&VEH_SLIDEBREAKING) { wishspeed = 0.0f; - VectorClear( wishvel ); - VectorClear( wishdir ); + VectorClear(wishvel); + VectorClear(wishdir); } // Out Of Control - Maintain pos3 Velocity //----------------------------------------- else if ((pVeh->m_ulFlags&VEH_OUTOFCONTROL) || (pVeh->m_ulFlags&VEH_STRAFERAM)) { - VectorCopy(pm->gent->pos3, wishvel); + VectorCopy(pm->gent->pos3, wishvel); VectorCopy(wishvel, wishdir); wishspeed = VectorNormalize(wishdir); } @@ -2935,91 +2953,91 @@ static void PM_AirMove( void ) { else { wishspeed = pm->ps->speed; - VectorScale( pm->ps->moveDir, pm->ps->speed, wishvel ); - VectorCopy( pm->ps->moveDir, wishdir ); + VectorScale(pm->ps->moveDir, pm->ps->speed, wishvel); + VectorCopy(pm->ps->moveDir, wishdir); } } - else if ( (pm->ps->pm_flags&PMF_SLOW_MO_FALL) ) + else if ((pm->ps->pm_flags&PMF_SLOW_MO_FALL)) {//no air-control - VectorClear( wishvel ); + VectorClear(wishvel); } else { - for ( i = 0 ; i < 2 ; i++ ) + for (i = 0; i < 2; i++) { - wishvel[i] = pml.forward[i]*fmove + pml.right[i]*smove; + wishvel[i] = pml.forward[i] * fmove + pml.right[i] * smove; } wishvel[2] = 0; } - VectorCopy (wishvel, wishdir); - wishspeed = VectorNormalize(wishdir); + VectorCopy(wishvel, wishdir); + wishspeed = VectorNormalize(wishdir); - if ( ( DotProduct (pm->ps->velocity, wishdir) ) < 0.0f ) + if ((DotProduct(pm->ps->velocity, wishdir)) < 0.0f) {//Encourage deceleration away from the current velocity wishspeed *= pm_airDecelRate; } // not on ground, so little effect on velocity float accelerate = pm_airaccelerate; - if ( pVeh && pVeh->m_pVehicleInfo->type == VH_SPEEDER ) + if (pVeh && pVeh->m_pVehicleInfo->type == VH_SPEEDER) {//speeders have more control in air //in mid-air accelerate = pVeh->m_pVehicleInfo->acceleration; - if ( pml.groundPlane ) + if (pml.groundPlane) {//on a slope of some kind, shouldn't have much control and should slide a lot accelerate *= 0.5f; } - if (pVeh->m_ulFlags & VEH_SLIDEBREAKING) + if (pVeh->m_ulFlags & VEH_SLIDEBREAKING) { VectorScale(pm->ps->velocity, 0.80f, pm->ps->velocity); } if (pm->ps->velocity[2]>1000.0f) - { + { pm->ps->velocity[2] = 1000.0f; } } - PM_Accelerate( wishdir, wishspeed, accelerate ); + PM_Accelerate(wishdir, wishspeed, accelerate); // we may have a ground plane that is very steep, even // though we don't have a groundentity // slide along the steep plane - if ( pml.groundPlane ) + if (pml.groundPlane) { - if ( PM_GroundSlideOkay( pml.groundTrace.plane.normal[2] ) ) + if (PM_GroundSlideOkay(pml.groundTrace.plane.normal[2])) { - PM_ClipVelocity( pm->ps->velocity, pml.groundTrace.plane.normal, - pm->ps->velocity, OVERCLIP ); + PM_ClipVelocity(pm->ps->velocity, pml.groundTrace.plane.normal, + pm->ps->velocity, OVERCLIP); } } - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) - && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0 - && pm->ps->forceJumpZStart - && pm->ps->velocity[2] > 0 ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0 + && pm->ps->forceJumpZStart + && pm->ps->velocity[2] > 0) {//I am force jumping and I'm not holding the button anymore - float curHeight = pm->ps->origin[2] - pm->ps->forceJumpZStart + (pm->ps->velocity[2]*pml.frametime); + float curHeight = pm->ps->origin[2] - pm->ps->forceJumpZStart + (pm->ps->velocity[2] * pml.frametime); float maxJumpHeight = forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]]; - if ( curHeight >= maxJumpHeight ) + if (curHeight >= maxJumpHeight) {//reached top, cut velocity pm->ps->velocity[2] = 0; } } - if ( (pm->ps->pm_flags&PMF_STUCK_TO_WALL) ) + if ((pm->ps->pm_flags&PMF_STUCK_TO_WALL)) { gravMod = 0.0f; } - PM_StepSlideMove( gravMod ); + PM_StepSlideMove(gravMod); - if (pVeh && pm->ps->pm_flags&PMF_BUMPED) + if (pVeh && pm->ps->pm_flags&PMF_BUMPED) { -/* + /* // Turn Vehicle In Direction Of Collision //---------------------------------------- vec3_t nAngles; - vectoangles(pm->ps->velocity, nAngles); + vectoangles(pm->ps->velocity, nAngles); nAngles[0] = pVeh->m_pParentEntity->client->ps.viewangles[0]; nAngles[2] = pVeh->m_pParentEntity->client->ps.viewangles[2]; @@ -3030,17 +3048,17 @@ static void PM_AirMove( void ) { SetClientViewAngle( pVeh->m_pParentEntity, nAngles ); if (pVeh->m_pPilot) { - SetClientViewAngle( pVeh->m_pPilot, nAngles ); - } + SetClientViewAngle( pVeh->m_pPilot, nAngles ); + } VectorCopy(nAngles, pVeh->m_vPrevOrientation); VectorCopy(nAngles, pVeh->m_vOrientation); pVeh->m_vAngularVelocity = 0.0f; -*/ + */ // Reduce "Bounce Up Wall" Velocity //---------------------------------- - if (pm->ps->velocity[2]>0) + if (pm->ps->velocity[2]>0) { pm->ps->velocity[2] *= 0.1f; } @@ -3054,7 +3072,7 @@ PM_WalkMove =================== */ -static void PM_WalkMove( void ) { +static void PM_WalkMove(void) { int i; vec3_t wishvel; float fmove, smove; @@ -3065,69 +3083,71 @@ static void PM_WalkMove( void ) { float accelerate; float vel; - if ( pm->ps->gravity < 0 ) + if (pm->ps->gravity < 0) {//float away pm->ps->velocity[2] -= pm->ps->gravity * pml.frametime; pm->ps->groundEntityNum = ENTITYNUM_NONE; pml.groundPlane = qfalse; pml.walking = qfalse; - if ( pm->waterlevel > 1 ) { + if (pm->waterlevel > 1) { PM_WaterMove(); - } else { + } + else { PM_AirMove(); } return; } - if ( pm->waterlevel > 2 && DotProduct( pml.forward, pml.groundTrace.plane.normal ) > 0 ) { + if (pm->waterlevel > 2 && DotProduct(pml.forward, pml.groundTrace.plane.normal) > 0) { // begin swimming PM_WaterMove(); return; } - if ( PM_CheckJump () ) { + if (PM_CheckJump()) { // jumped away - if ( pm->waterlevel > 1 ) { + if (pm->waterlevel > 1) { PM_WaterMove(); - } else { + } + else { PM_AirMove(); } return; } - if ( pm->ps->groundEntityNum != ENTITYNUM_NONE &&//on ground + if (pm->ps->groundEntityNum != ENTITYNUM_NONE &&//on ground pm->ps->velocity[2] <= 0 &&//not going up - pm->ps->pm_flags&PMF_TIME_KNOCKBACK )//knockback fimter on (stops friction) + pm->ps->pm_flags&PMF_TIME_KNOCKBACK)//knockback fimter on (stops friction) { pm->ps->pm_flags &= ~PMF_TIME_KNOCKBACK; } qboolean slide = qfalse; - if ( pm->ps->pm_type == PM_DEAD ) + if (pm->ps->pm_type == PM_DEAD) {//corpse - if ( g_entities[pm->ps->groundEntityNum].client ) + if (g_entities[pm->ps->groundEntityNum].client) {//on a client - if ( g_entities[pm->ps->groundEntityNum].health > 0 ) + if (g_entities[pm->ps->groundEntityNum].health > 0) {//a living client //no friction slide = qtrue; } } } - if ( !slide ) + if (!slide) { - PM_Friction (); + PM_Friction(); } - if ( g_debugMelee->integer ) + if (g_debugMelee->integer) { - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//player + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer())//player && cg.renderingThirdPerson//in third person - && ((pm->cmd.buttons&BUTTON_USE)||pm->ps->leanStopDebounceTime)//holding use or leaning + && ((pm->cmd.buttons&BUTTON_USE) || pm->ps->leanStopDebounceTime)//holding use or leaning //&& (pm->ps->forcePowersActive&(1<ps->groundEntityNum != ENTITYNUM_NONE//on ground - && !cg_usingInFrontOf )//nothing to use + && !cg_usingInFrontOf)//nothing to use {//holding use stops you from moving return; } @@ -3136,7 +3156,7 @@ static void PM_WalkMove( void ) { smove = pm->cmd.rightmove; cmd = pm->cmd; - scale = PM_CmdScale( &cmd ); + scale = PM_CmdScale(&cmd); // set the movementDir so clients can rotate the legs for strafing PM_SetMovementDir(); @@ -3146,51 +3166,51 @@ static void PM_WalkMove( void ) { pml.right[2] = 0; // project the forward and right directions onto the ground plane - PM_ClipVelocity (pml.forward, pml.groundTrace.plane.normal, pml.forward, OVERCLIP ); - PM_ClipVelocity (pml.right, pml.groundTrace.plane.normal, pml.right, OVERCLIP ); + PM_ClipVelocity(pml.forward, pml.groundTrace.plane.normal, pml.forward, OVERCLIP); + PM_ClipVelocity(pml.right, pml.groundTrace.plane.normal, pml.right, OVERCLIP); // - VectorNormalize (pml.forward); - VectorNormalize (pml.right); + VectorNormalize(pml.forward); + VectorNormalize(pml.right); -/* if ( ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE ) && pm->gent->NPC ) + /* if ( ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE ) && pm->gent->NPC ) {//speeder control scheme - vec3_t vfwd, vrt; - AngleVectors( ((CVehicleNPC *)pm->gent->NPC)->m_vOrientation, vfwd, vrt, NULL ); + vec3_t vfwd, vrt; + AngleVectors( ((CVehicleNPC *)pm->gent->NPC)->m_vOrientation, vfwd, vrt, NULL ); - float speed = pm->ps->speed; - if ( fmove < 0 ) - {//going backwards - if ( speed < 0 ) - {//speed is negative, but since our command is reverse, make speed positive - speed = fabs( speed ); - } - else if ( speed > 0 ) - {//trying to move back but speed is still positive, so keep moving forward (we'll slow down eventually) - speed *= -1; - } - } - VectorScale( vfwd, speed*fmove/127.0f, wishvel ); - //VectorMA( wishvel, pm->ps->speed*smove/127.0f, vrt, wishvel ); - wishspeed = VectorNormalize2( wishvel, wishdir ); + float speed = pm->ps->speed; + if ( fmove < 0 ) + {//going backwards + if ( speed < 0 ) + {//speed is negative, but since our command is reverse, make speed positive + speed = fabs( speed ); + } + else if ( speed > 0 ) + {//trying to move back but speed is still positive, so keep moving forward (we'll slow down eventually) + speed *= -1; + } + } + VectorScale( vfwd, speed*fmove/127.0f, wishvel ); + //VectorMA( wishvel, pm->ps->speed*smove/127.0f, vrt, wishvel ); + wishspeed = VectorNormalize2( wishvel, wishdir ); } else*/ // Get The WishVel And WishSpeed - //------------------------------- - if ( pm->ps->clientNum && (USENEWNAVSYSTEM || !VectorCompare( pm->ps->moveDir, vec3_origin )) ) + //------------------------------- + if (pm->ps->clientNum && (USENEWNAVSYSTEM || !VectorCompare(pm->ps->moveDir, vec3_origin))) {//NPC - + // If The UCmds Were Set, But Never Converted Into A MoveDir, Then Make The WishDir From UCmds //-------------------------------------------------------------------------------------------- - if ((fmove!=0.0f || smove!=0.0f) && VectorCompare(pm->ps->moveDir, vec3_origin)) + if ((fmove != 0.0f || smove != 0.0f) && VectorCompare(pm->ps->moveDir, vec3_origin)) { //gi.Printf("Generating MoveDir\n"); - for ( i = 0 ; i < 3 ; i++ ) + for (i = 0; i < 3; i++) { - wishvel[i] = pml.forward[i]*fmove + pml.right[i]*smove; + wishvel[i] = pml.forward[i] * fmove + pml.right[i] * smove; } - VectorCopy( wishvel, wishdir ); + VectorCopy(wishvel, wishdir); wishspeed = VectorNormalize(wishdir); wishspeed *= scale; } @@ -3199,63 +3219,63 @@ static void PM_WalkMove( void ) { else { wishspeed = pm->ps->speed; - VectorScale( pm->ps->moveDir, pm->ps->speed, wishvel ); - VectorCopy( pm->ps->moveDir, wishdir ); + VectorScale(pm->ps->moveDir, pm->ps->speed, wishvel); + VectorCopy(pm->ps->moveDir, wishdir); } } else { - for ( i = 0 ; i < 3 ; i++ ) { - wishvel[i] = pml.forward[i]*fmove + pml.right[i]*smove; + for (i = 0; i < 3; i++) { + wishvel[i] = pml.forward[i] * fmove + pml.right[i] * smove; } // when going up or down slopes the wish velocity should Not be zero - // wishvel[2] = 0; + // wishvel[2] = 0; - VectorCopy (wishvel, wishdir); + VectorCopy(wishvel, wishdir); wishspeed = VectorNormalize(wishdir); wishspeed *= scale; } // Handle negative speed. - if ( wishspeed < 0 ) + if (wishspeed < 0) { wishspeed = wishspeed * -1.0f; - VectorScale( wishvel, -1.0f, wishvel ); - VectorScale( wishdir, -1.0f, wishdir ); + VectorScale(wishvel, -1.0f, wishvel); + VectorScale(wishdir, -1.0f, wishdir); } // clamp the speed lower if ducking - if ( pm->ps->pm_flags & PMF_DUCKED && !PM_InKnockDown( pm->ps ) ) + if (pm->ps->pm_flags & PMF_DUCKED && !PM_InKnockDown(pm->ps)) { - if ( wishspeed > pm->ps->speed * pm_duckScale ) + if (wishspeed > pm->ps->speed * pm_duckScale) { wishspeed = pm->ps->speed * pm_duckScale; } } // clamp the speed lower if wading or walking on the bottom - if ( pm->waterlevel ) { + if (pm->waterlevel) { float waterScale; waterScale = pm->waterlevel / 3.0; - waterScale = 1.0 - ( 1.0 - pm_swimScale ) * waterScale; - if ( wishspeed > pm->ps->speed * waterScale ) { + waterScale = 1.0 - (1.0 - pm_swimScale) * waterScale; + if (wishspeed > pm->ps->speed * waterScale) { wishspeed = pm->ps->speed * waterScale; } } // when a player gets hit, they temporarily lose // full control, which allows them to be moved a bit - if ( Flying == FLY_HOVER ) + if (Flying == FLY_HOVER) { accelerate = pm_vehicleaccelerate; } - else if ( ( pml.groundTrace.surfaceFlags & SURF_SLICK ) || (pm->ps->pm_flags&PMF_TIME_KNOCKBACK) || (pm->ps->pm_flags&PMF_TIME_NOFRICTION) ) + else if ((pml.groundTrace.surfaceFlags & SURF_SLICK) || (pm->ps->pm_flags&PMF_TIME_KNOCKBACK) || (pm->ps->pm_flags&PMF_TIME_NOFRICTION)) { accelerate = pm_airaccelerate; - } - else + } + else { accelerate = pm_accelerate; @@ -3271,7 +3291,7 @@ static void PM_WalkMove( void ) { if (gi.WE_IsOutside(pm->gent->currentOrigin)) { VectorScale(windDir, -1.0f, windDir); - accelerate *= (1.0f - (DotProduct(wishdir, windDir)*0.55f)); + accelerate *= (1.0f - (DotProduct(wishdir, windDir)*0.55f)); } } } @@ -3279,49 +3299,50 @@ static void PM_WalkMove( void ) { //=================================================== } - PM_Accelerate (wishdir, wishspeed, accelerate); + PM_Accelerate(wishdir, wishspeed, accelerate); //Com_Printf("velocity = %1.1f %1.1f %1.1f\n", pm->ps->velocity[0], pm->ps->velocity[1], pm->ps->velocity[2]); //Com_Printf("velocity1 = %1.1f\n", VectorLength(pm->ps->velocity)); - if ( ( pml.groundTrace.surfaceFlags & SURF_SLICK ) || pm->ps->pm_flags & PMF_TIME_KNOCKBACK || (pm->ps->pm_flags&PMF_TIME_NOFRICTION) ) { - if ( pm->ps->gravity >= 0 && pm->ps->groundEntityNum != ENTITYNUM_NONE && !VectorLengthSquared( pm->ps->velocity ) && pml.groundTrace.plane.normal[2] == 1.0 ) + if ((pml.groundTrace.surfaceFlags & SURF_SLICK) || pm->ps->pm_flags & PMF_TIME_KNOCKBACK || (pm->ps->pm_flags&PMF_TIME_NOFRICTION)) { + if (pm->ps->gravity >= 0 && pm->ps->groundEntityNum != ENTITYNUM_NONE && !VectorLengthSquared(pm->ps->velocity) && pml.groundTrace.plane.normal[2] == 1.0) {//on ground and not moving and on level ground, no reason to do stupid fucking gravity with the clipvelocity!!!! } else { - if ( !(pm->ps->eFlags&EF_FORCE_GRIPPED) && !(pm->ps->eFlags&EF_FORCE_DRAINED) ) + if (!(pm->ps->eFlags&EF_FORCE_GRIPPED) && !(pm->ps->eFlags&EF_FORCE_DRAINED)) { pm->ps->velocity[2] -= pm->ps->gravity * pml.frametime; } } - } else { + } + else { // don't reset the z velocity for slopes -// pm->ps->velocity[2] = 0; + // pm->ps->velocity[2] = 0; } vel = VectorLength(pm->ps->velocity); // slide along the ground plane - PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal, - pm->ps->velocity, OVERCLIP ); + PM_ClipVelocity(pm->ps->velocity, pml.groundTrace.plane.normal, + pm->ps->velocity, OVERCLIP); // don't decrease velocity when going up or down a slope VectorNormalize(pm->ps->velocity); VectorScale(pm->ps->velocity, vel, pm->ps->velocity); // don't do anything if standing still - if ( !pm->ps->velocity[0] && !pm->ps->velocity[1] ) { + if (!pm->ps->velocity[0] && !pm->ps->velocity[1]) { return; } - if ( pm->ps->gravity <= 0 ) + if (pm->ps->gravity <= 0) {//need to apply gravity since we're going to float up from ground - PM_StepSlideMove( 1 ); + PM_StepSlideMove(1); } else { - PM_StepSlideMove( 0 ); + PM_StepSlideMove(0); } //Com_Printf("velocity2 = %1.1f\n", VectorLength(pm->ps->velocity)); @@ -3334,33 +3355,34 @@ static void PM_WalkMove( void ) { PM_DeadMove ============== */ -static void PM_DeadMove( void ) { +static void PM_DeadMove(void) { float forward; // If this is a vehicle, tell him he's dead, but give him a little while to do his things. -/* if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE && pm->gent->NPC && pm->gent->health != -99999 ) + /* if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE && pm->gent->NPC && pm->gent->health != -99999 ) { - pm->gent->health = 1; - ((CVehicleNPC *)pm->gent->NPC)->StartDeathDelay( 0 ); + pm->gent->health = 1; + ((CVehicleNPC *)pm->gent->NPC)->StartDeathDelay( 0 ); } else { - pm->gent->health = 0; + pm->gent->health = 0; }*/ - - if ( !pml.walking ) { + + if (!pml.walking) { return; } // extra friction - forward = VectorLength (pm->ps->velocity); + forward = VectorLength(pm->ps->velocity); forward -= 20; - if ( forward <= 0 ) { - VectorClear (pm->ps->velocity); - } else { - VectorNormalize (pm->ps->velocity); - VectorScale (pm->ps->velocity, forward, pm->ps->velocity); + if (forward <= 0) { + VectorClear(pm->ps->velocity); + } + else { + VectorNormalize(pm->ps->velocity); + VectorScale(pm->ps->velocity, forward, pm->ps->velocity); } } @@ -3370,7 +3392,7 @@ static void PM_DeadMove( void ) { PM_NoclipMove =============== */ -static void PM_NoclipMove( void ) { +static void PM_NoclipMove(void) { float speed, drop, friction, control, newspeed; int i; vec3_t wishvel; @@ -3379,22 +3401,22 @@ static void PM_NoclipMove( void ) { float wishspeed; float scale; - if(pm->gent && pm->gent->client) + if (pm->gent && pm->gent->client) { pm->ps->viewheight = pm->gent->client->standheight + STANDARD_VIEWHEIGHT_OFFSET; -// if ( !pm->gent->mins[0] || !pm->gent->mins[1] || !pm->gent->mins[2] || !pm->gent->maxs[0] || !pm->gent->maxs[1] || !pm->gent->maxs[2] ) -// { -// assert(0); -// } + // if ( !pm->gent->mins[0] || !pm->gent->mins[1] || !pm->gent->mins[2] || !pm->gent->maxs[0] || !pm->gent->maxs[1] || !pm->gent->maxs[2] ) + // { + // assert(0); + // } - VectorCopy( pm->gent->mins, pm->mins ); - VectorCopy( pm->gent->maxs, pm->maxs ); + VectorCopy(pm->gent->mins, pm->mins); + VectorCopy(pm->gent->maxs, pm->maxs); } else { pm->ps->viewheight = DEFAULT_MAXS_2 + STANDARD_VIEWHEIGHT_OFFSET;//DEFAULT_VIEWHEIGHT; - if ( !DEFAULT_MINS_0 || !DEFAULT_MINS_1 || !DEFAULT_MAXS_0 || !DEFAULT_MAXS_1 || !DEFAULT_MINS_2 || !DEFAULT_MAXS_2 ) + if (!DEFAULT_MINS_0 || !DEFAULT_MINS_1 || !DEFAULT_MAXS_0 || !DEFAULT_MAXS_1 || !DEFAULT_MINS_2 || !DEFAULT_MAXS_2) { assert(0); } @@ -3410,10 +3432,10 @@ static void PM_NoclipMove( void ) { // friction - speed = VectorLength (pm->ps->velocity); + speed = VectorLength(pm->ps->velocity); if (speed < 1) { - VectorCopy (vec3_origin, pm->ps->velocity); + VectorCopy(vec3_origin, pm->ps->velocity); } else { @@ -3429,11 +3451,11 @@ static void PM_NoclipMove( void ) { newspeed = 0; newspeed /= speed; - VectorScale (pm->ps->velocity, newspeed, pm->ps->velocity); + VectorScale(pm->ps->velocity, newspeed, pm->ps->velocity); } // accelerate - scale = PM_CmdScale( &pm->cmd ); + scale = PM_CmdScale(&pm->cmd); if (pm->cmd.buttons & BUTTON_ATTACK) { //turbo boost scale *= 10; } @@ -3443,39 +3465,39 @@ static void PM_NoclipMove( void ) { fmove = pm->cmd.forwardmove; smove = pm->cmd.rightmove; - - for (i=0 ; i<3 ; i++) - wishvel[i] = pml.forward[i]*fmove + pml.right[i]*smove; + + for (i = 0; i<3; i++) + wishvel[i] = pml.forward[i] * fmove + pml.right[i] * smove; wishvel[2] += pm->cmd.upmove; - VectorCopy (wishvel, wishdir); + VectorCopy(wishvel, wishdir); wishspeed = VectorNormalize(wishdir); wishspeed *= scale; - PM_Accelerate( wishdir, wishspeed, pm_accelerate ); + PM_Accelerate(wishdir, wishspeed, pm_accelerate); // move - VectorMA (pm->ps->origin, pml.frametime, pm->ps->velocity, pm->ps->origin); + VectorMA(pm->ps->origin, pml.frametime, pm->ps->velocity, pm->ps->origin); } //============================================================================ -static float PM_DamageForDelta( int delta ) +static float PM_DamageForDelta(int delta) { float damage = delta; - if ( pm->gent->NPC ) + if (pm->gent->NPC) { - if ( pm->ps->weapon == WP_SABER - || (pm->gent->client && pm->gent->client->NPC_class == CLASS_REBORN) ) + if (pm->ps->weapon == WP_SABER + || (pm->gent->client && pm->gent->client->NPC_class == CLASS_REBORN)) {//FIXME: for now Jedi take no falling damage, but really they should if pushed off? damage = 0; } } - else if ( pm->ps->clientNum < MAX_CLIENTS ) + else if (pm->ps->clientNum < MAX_CLIENTS) { - if ( damage < 50 ) + if (damage < 50) { - if ( damage > 24 ) + if (damage > 24) { damage = damage - 25; } @@ -3488,25 +3510,25 @@ static float PM_DamageForDelta( int delta ) return damage * 0.5f; } -static void PM_CrashLandDamage( int damage ) +static void PM_CrashLandDamage(int damage) { - if ( pm->gent ) + if (pm->gent) { int dflags = DAMAGE_NO_ARMOR; - if ( pm->gent->NPC && (pm->gent->NPC->aiFlags&NPCAI_DIE_ON_IMPACT) ) + if (pm->gent->NPC && (pm->gent->NPC->aiFlags&NPCAI_DIE_ON_IMPACT)) { damage = 1000; dflags |= DAMAGE_DIE_ON_IMPACT; } - else if ( !(pm->gent->flags&FL_NO_IMPACT_DMG) ) + else if (!(pm->gent->flags&FL_NO_IMPACT_DMG)) { - damage = PM_DamageForDelta( damage ); + damage = PM_DamageForDelta(damage); } - if ( damage ) + if (damage) { pm->gent->painDebounceTime = level.time + 200; // no normal pain sound - G_Damage( pm->gent, NULL, player, NULL, NULL, damage, dflags, MOD_FALLING ); + G_Damage(pm->gent, NULL, player, NULL, NULL, damage, dflags, MOD_FALLING); } } } @@ -3514,66 +3536,66 @@ static void PM_CrashLandDamage( int damage ) /* static float PM_CrashLandDelta( vec3_t org, vec3_t prevOrg, vec3_t prev_vel, float grav, int waterlevel ) { - float delta; - float dist; - float vel, acc; - float t; - float a, b, c, den; +float delta; +float dist; +float vel, acc; +float t; +float a, b, c, den; - // calculate the exact velocity on landing - dist = org[2] - prevOrg[2]; - vel = prev_vel[2]; - acc = -grav; +// calculate the exact velocity on landing +dist = org[2] - prevOrg[2]; +vel = prev_vel[2]; +acc = -grav; - a = acc / 2; - b = vel; - c = -dist; +a = acc / 2; +b = vel; +c = -dist; - den = b * b - 4 * a * c; - if ( den < 0 ) - { - return 0; - } - t = (-b - sqrt( den ) ) / ( 2 * a ); +den = b * b - 4 * a * c; +if ( den < 0 ) +{ +return 0; +} +t = (-b - sqrt( den ) ) / ( 2 * a ); - delta = vel + t * acc; - delta = delta*delta * 0.0001; +delta = vel + t * acc; +delta = delta*delta * 0.0001; - // never take falling damage if completely underwater - if ( waterlevel == 3 ) - { - return 0; - } - // reduce falling damage if there is standing water - if ( waterlevel == 2 ) - { - delta *= 0.25; - } - if ( waterlevel == 1 ) - { - delta *= 0.5; - } +// never take falling damage if completely underwater +if ( waterlevel == 3 ) +{ +return 0; +} +// reduce falling damage if there is standing water +if ( waterlevel == 2 ) +{ +delta *= 0.25; +} +if ( waterlevel == 1 ) +{ +delta *= 0.5; +} - return delta; +return delta; } */ -static float PM_CrashLandDelta( vec3_t prev_vel, int waterlevel ) +static float PM_CrashLandDelta(vec3_t prev_vel, int waterlevel) { float delta; - if ( pm->waterlevel == 3 ) + if (pm->waterlevel == 3) { return 0; } - delta = fabs(prev_vel[2])/10;//VectorLength( prev_vel ) + delta = fabs(prev_vel[2]) / 10;//VectorLength( prev_vel ) // reduce falling damage if there is standing water - if ( pm->waterlevel == 2 ) + if (pm->waterlevel == 2) { delta *= 0.25; } - if ( pm->waterlevel == 1 ) + if (pm->waterlevel == 1) { delta *= 0.5; } @@ -3581,26 +3603,26 @@ static float PM_CrashLandDelta( vec3_t prev_vel, int waterlevel ) return delta; } -int PM_GetLandingAnim( void ) +int PM_GetLandingAnim(void) { int anim = pm->ps->legsAnim; - + //special cases: - if ( anim == BOTH_FLIP_ATTACK7 - || anim == BOTH_FLIP_HOLD7 ) + if (anim == BOTH_FLIP_ATTACK7 + || anim == BOTH_FLIP_HOLD7) { - return BOTH_FLIP_LAND; + return BOTH_FLIP_LAND; } - else if ( anim == BOTH_FLIP_LAND ) + else if (anim == BOTH_FLIP_LAND) { //stick landings some pm->ps->velocity[0] *= 0.5f; pm->ps->velocity[1] *= 0.5f; return BOTH_LAND1; } - else if ( PM_InAirKickingAnim( anim ) ) + else if (PM_InAirKickingAnim(anim)) { - switch ( anim ) + switch (anim) { case BOTH_A7_KICK_F_AIR: return BOTH_FORCELAND1; @@ -3617,11 +3639,11 @@ int PM_GetLandingAnim( void ) } } - if ( PM_SpinningAnim( anim ) || PM_SaberInSpecialAttack( anim ) ) + if (PM_SpinningAnim(anim) || PM_SaberInSpecialAttack(anim)) { return -1; } - switch ( anim ) + switch (anim) { case BOTH_FORCEJUMPLEFT1: case BOTH_FORCEINAIRLEFT1: @@ -3725,13 +3747,13 @@ int PM_GetLandingAnim( void ) break; case BOTH_WALL_RUN_LEFT://# case BOTH_WALL_RUN_RIGHT://# - if ( pm->ps->legsAnimTimer > 500 ) + if (pm->ps->legsAnimTimer > 500) {//only land at end of anim return -1; } //NOTE: falls through on purpose! default: - if ( pm->ps->pm_flags & PMF_BACKWARDS_JUMP ) + if (pm->ps->pm_flags & PMF_BACKWARDS_JUMP) { anim = BOTH_LANDBACK1; } @@ -3747,22 +3769,22 @@ int PM_GetLandingAnim( void ) return anim; } -void G_StartRoll( gentity_t *ent, int anim ) +void G_StartRoll(gentity_t *ent, int anim) { - NPC_SetAnim(ent,SETANIM_BOTH,anim,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_HOLDLESS); + NPC_SetAnim(ent, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_HOLDLESS); ent->client->ps.weaponTime = ent->client->ps.torsoAnimTimer - 200;//just to make sure it's cleared when roll is done - G_AddEvent( ent, EV_ROLL, 0 ); + G_AddEvent(ent, EV_ROLL, 0); ent->client->ps.saberMove = LS_NONE; } -static qboolean PM_TryRoll( void ) +static qboolean PM_TryRoll(void) { float rollDist = 192;//was 64; - if ( PM_SaberInAttack( pm->ps->saberMove ) || PM_SaberInSpecialAttack( pm->ps->torsoAnim ) - || PM_SpinningSaberAnim( pm->ps->legsAnim ) - || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())&&PM_SaberInStart( pm->ps->saberMove )) ) + if (PM_SaberInAttack(pm->ps->saberMove) || PM_SaberInSpecialAttack(pm->ps->torsoAnim) + || PM_SpinningSaberAnim(pm->ps->legsAnim) + || ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && PM_SaberInStart(pm->ps->saberMove))) {//attacking or spinning (or, if player, starting an attack) - if ( PM_CanRollFromSoulCal( pm->ps ) ) + if (PM_CanRollFromSoulCal(pm->ps)) {//hehe } else @@ -3770,46 +3792,46 @@ static qboolean PM_TryRoll( void ) return qfalse; } } - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && (cg.renderingThirdPerson || cg.zoomMode) ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && (/*!cg.renderingThirdPerson ||*/ cg.zoomMode)) {//player can't do this in 1st person // now you can - Dusty ;) return qfalse; } - if ( !pm->gent ) + if (!pm->gent) { return qfalse; } - if ( (pm->ps->saber[0].saberFlags&SFL_NO_ROLLS) ) + if ((pm->ps->saber[0].saberFlags&SFL_NO_ROLLS)) { return qfalse; } - if ( pm->ps->dualSabers - && (pm->ps->saber[1].saberFlags&SFL_NO_ROLLS) ) + if (pm->ps->dualSabers + && (pm->ps->saber[1].saberFlags&SFL_NO_ROLLS)) { return qfalse; } - if ( pm->ps->clientNum && pm->gent->NPC ) + if (pm->ps->clientNum && pm->gent->NPC) {//NPC - if ( pm->gent->NPC->scriptFlags&SCF_NO_ACROBATICS ) + if (pm->gent->NPC->scriptFlags&SCF_NO_ACROBATICS) {//scripted to never do acrobatics return qfalse; } - if ( pm->ps->weapon == WP_SABER ) + if (pm->ps->weapon == WP_SABER) {//jedi/reborn - if ( pm->gent->NPC->rank != RANK_CREWMAN && pm->gent->NPC->rank < RANK_LT_JG ) + if (pm->gent->NPC->rank != RANK_CREWMAN && pm->gent->NPC->rank < RANK_LT_JG) {//reborn/jedi who are not acrobats or fencers can't do any of these acrobatics return qfalse; } } else {//non-jedi/reborn - if ( pm->ps->weapon != WP_NONE )//not empty-handed...who would that be??? + if (pm->ps->weapon != WP_NONE)//not empty-handed...who would that be??? {//only jedi/reborn NPCs should be able to do rolls (with a few exceptions) - if ( !pm->gent - || !pm->gent->client + if (!pm->gent + || !pm->gent->client || (pm->gent->client->NPC_class != CLASS_BOBAFETT //boba can roll with it, baby - && pm->gent->client->NPC_class != CLASS_REBORN //reborn using weapons other than saber can still roll + && pm->gent->client->NPC_class != CLASS_REBORN //reborn using weapons other than saber can still roll )) {//can't roll return qfalse; @@ -3818,48 +3840,51 @@ static qboolean PM_TryRoll( void ) } } - vec3_t fwd, right, traceto, mins = {pm->mins[0],pm->mins[1],pm->mins[2]+STEPSIZE}, maxs = {pm->maxs[0],pm->maxs[1],pm->gent->client->crouchheight}, fwdAngles = {0, pm->ps->viewangles[YAW], 0}; + vec3_t fwd, right, traceto, + mins = { pm->mins[0], pm->mins[1], pm->mins[2] + STEPSIZE }, + maxs = { pm->maxs[0], pm->maxs[1], (float)pm->gent->client->crouchheight }, + fwdAngles = { 0, pm->ps->viewangles[YAW], 0 }; trace_t trace; int anim = -1; - AngleVectors( fwdAngles, fwd, right, NULL ); + AngleVectors(fwdAngles, fwd, right, NULL); //FIXME: trace ahead for clearance to roll - if ( pm->cmd.forwardmove ) + if (pm->cmd.forwardmove) { - if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) + if (pm->ps->pm_flags & PMF_BACKWARDS_RUN) { anim = BOTH_ROLL_B; - VectorMA( pm->ps->origin, -rollDist, fwd, traceto ); + VectorMA(pm->ps->origin, -rollDist, fwd, traceto); } else { anim = BOTH_ROLL_F; - VectorMA( pm->ps->origin, rollDist, fwd, traceto ); + VectorMA(pm->ps->origin, rollDist, fwd, traceto); } } - else if ( pm->cmd.rightmove > 0 ) + else if (pm->cmd.rightmove > 0) { anim = BOTH_ROLL_R; - VectorMA( pm->ps->origin, rollDist, right, traceto ); + VectorMA(pm->ps->origin, rollDist, right, traceto); } - else if ( pm->cmd.rightmove < 0 ) + else if (pm->cmd.rightmove < 0) { anim = BOTH_ROLL_L; - VectorMA( pm->ps->origin, -rollDist, right, traceto ); + VectorMA(pm->ps->origin, -rollDist, right, traceto); } else {//??? } - if ( anim != -1 ) + if (anim != -1) { qboolean roll = qfalse; int clipmask = CONTENTS_SOLID; - if ( pm->ps->clientNum ) + if (pm->ps->clientNum) { - clipmask |= (CONTENTS_MONSTERCLIP|CONTENTS_BOTCLIP); + clipmask |= (CONTENTS_MONSTERCLIP | CONTENTS_BOTCLIP); } else { - if ( pm->gent && pm->gent->enemy && pm->gent->enemy->health > 0 ) + if (pm->gent && pm->gent->enemy && pm->gent->enemy->health > 0) {//player can always roll in combat roll = qtrue; } @@ -3868,67 +3893,67 @@ static qboolean PM_TryRoll( void ) clipmask |= CONTENTS_PLAYERCLIP; } } - if ( !roll ) + if (!roll) { - pm->trace( &trace, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, clipmask, (EG2_Collision)0, 0 ); - if ( trace.fraction >= 1.0f ) + pm->trace(&trace, pm->ps->origin, mins, maxs, traceto, pm->ps->clientNum, clipmask, (EG2_Collision)0, 0); + if (trace.fraction >= 1.0f) {//okay, clear, check for a bottomless drop vec3_t top; - VectorCopy( traceto, top ); + VectorCopy(traceto, top); traceto[2] -= 256; - pm->trace( &trace, top, mins, maxs, traceto, pm->ps->clientNum, CONTENTS_SOLID, (EG2_Collision)0, 0 ); - if ( trace.fraction < 1.0f ) + pm->trace(&trace, top, mins, maxs, traceto, pm->ps->clientNum, CONTENTS_SOLID, (EG2_Collision)0, 0); + if (trace.fraction < 1.0f) {//not a bottomless drop roll = qtrue; } } else {//hit an architectural obstruction - if ( pm->ps->clientNum ) + if (pm->ps->clientNum) {//NPCs don't care about rolling into walls, just off ledges - if ( !(trace.contents&CONTENTS_BOTCLIP) ) + if (!(trace.contents&CONTENTS_BOTCLIP)) { roll = qtrue; } } - else if ( G_EntIsDoor( trace.entityNum ) ) + else if (G_EntIsDoor(trace.entityNum)) {//okay to roll into a door - if ( G_EntIsUnlockedDoor( trace.entityNum ) ) + if (G_EntIsUnlockedDoor(trace.entityNum)) {//if it's an auto-door roll = qtrue; } } - else + else {//check other conditions gentity_t *traceEnt = &g_entities[trace.entityNum]; - if ( traceEnt && (traceEnt->svFlags&SVF_GLASS_BRUSH) ) + if (traceEnt && (traceEnt->svFlags&SVF_GLASS_BRUSH)) {//okay to roll through glass roll = qtrue; } } } } - if ( roll ) + if (roll) { - G_StartRoll( pm->gent, anim ); + G_StartRoll(pm->gent, anim); return qtrue; } } return qfalse; } -extern void CG_LandingEffect( vec3_t origin, vec3_t normal, int material ); -static void PM_CrashLandEffect( void ) +extern void CG_LandingEffect(vec3_t origin, vec3_t normal, int material); +static void PM_CrashLandEffect(void) { - if ( pm->waterlevel ) + if (pm->waterlevel) { return; } - float delta = fabs(pml.previous_velocity[2])/10;//VectorLength( pml.previous_velocity );? - if ( delta >= 30 ) + float delta = fabs(pml.previous_velocity[2]) / 10;//VectorLength( pml.previous_velocity );? + if (delta >= 30) { - vec3_t bottom = {pm->ps->origin[0],pm->ps->origin[1],pm->ps->origin[2]+pm->mins[2]+1}; - CG_LandingEffect( bottom, pml.groundTrace.plane.normal, (pml.groundTrace.surfaceFlags&MATERIAL_MASK) ); + vec3_t bottom = { pm->ps->origin[0], pm->ps->origin[1], pm->ps->origin[2] + pm->mins[2] + 1 }; + CG_LandingEffect(bottom, pml.groundTrace.plane.normal, (pml.groundTrace.surfaceFlags&MATERIAL_MASK)); } } /* @@ -3938,76 +3963,76 @@ PM_CrashLand Check for hard landings that generate sound events ================= */ -static void PM_CrashLand( void ) +static void PM_CrashLand(void) { float delta = 0; qboolean forceLanding = qfalse; - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE) { - if ( pm->gent->m_pVehicle->m_pVehicleInfo->type != VH_ANIMAL ) + if (pm->gent->m_pVehicle->m_pVehicleInfo->type != VH_ANIMAL) { - float dot = DotProduct( pm->ps->velocity, pml.groundTrace.plane.normal ); + float dot = DotProduct(pm->ps->velocity, pml.groundTrace.plane.normal); //Com_Printf("%i:crashland %4.2f\n", c_pmove, pm->ps->velocity[2]); - if ( dot < -100.0f ) + if (dot < -100.0f) { //NOTE: never hits this anyway - if ( pm->gent->m_pVehicle->m_pVehicleInfo->iImpactFX ) + if (pm->gent->m_pVehicle->m_pVehicleInfo->iImpactFX) {//make sparks - if ( !Q_irand( 0, 3 ) ) + if (!Q_irand(0, 3)) {//FIXME: debounce - G_PlayEffect( pm->gent->m_pVehicle->m_pVehicleInfo->iImpactFX, pm->ps->origin, pml.groundTrace.plane.normal ); + G_PlayEffect(pm->gent->m_pVehicle->m_pVehicleInfo->iImpactFX, pm->ps->origin, pml.groundTrace.plane.normal); } } - int damage = floor(fabs(dot+100)/10.0f); - if ( damage >= 0 ) + int damage = floor(fabs(dot + 100) / 10.0f); + if (damage >= 0) { - G_Damage( pm->gent, NULL, NULL, NULL, NULL, damage, 0, MOD_FALLING ); + G_Damage(pm->gent, NULL, NULL, NULL, NULL, damage, 0, MOD_FALLING); } } } return; } - if ( (pm->ps->pm_flags&PMF_TRIGGER_PUSHED) ) + if ((pm->ps->pm_flags&PMF_TRIGGER_PUSHED)) { delta = 21;//? forceLanding = qtrue; } else { - if ( pm->gent && pm->gent->NPC && pm->gent->NPC->aiFlags & NPCAI_DIE_ON_IMPACT ) + if (pm->gent && pm->gent->NPC && pm->gent->NPC->aiFlags & NPCAI_DIE_ON_IMPACT) {//have to do death on impact if we are falling to our death, FIXME: should we avoid any additional damage this func? - PM_CrashLandDamage( 1000 ); + PM_CrashLandDamage(1000); } - else if ( pm->gent - && pm->gent->client - && (pm->gent->client->NPC_class == CLASS_BOBAFETT||pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) ) + else if (pm->gent + && pm->gent->client + && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER)) { - if ( JET_Flying( pm->gent ) ) + if (JET_Flying(pm->gent)) { - if ( pm->gent->client->NPC_class == CLASS_BOBAFETT - || (pm->gent->client->NPC_class == CLASS_ROCKETTROOPER&&pm->gent->NPC&&pm->gent->NPC->rankgent->client->NPC_class == CLASS_BOBAFETT + || (pm->gent->client->NPC_class == CLASS_ROCKETTROOPER&&pm->gent->NPC&&pm->gent->NPC->rankgent ); + JET_FlyStop(pm->gent); } else { - pm->ps->velocity[2] += Q_flrand( 100, 200 ); + pm->ps->velocity[2] += Q_flrand(100, 200); } - PM_AddEvent( EV_FALL_SHORT ); + PM_AddEvent(EV_FALL_SHORT); } - if ( pm->ps->forceJumpZStart ) + if (pm->ps->forceJumpZStart) {//we were force-jumping forceLanding = qtrue; } delta = 1; } - else if ( pm->ps->jumpZStart && (pm->ps->forcePowerLevel[FP_LEVITATION] >= FORCE_LEVEL_1||(pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())) ) + else if (pm->ps->jumpZStart && (pm->ps->forcePowerLevel[FP_LEVITATION] >= FORCE_LEVEL_1 || (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()))) {//we were force-jumping - if ( pm->ps->origin[2] >= pm->ps->jumpZStart ) + if (pm->ps->origin[2] >= pm->ps->jumpZStart) {//we landed at same height or higher than we landed - if ( pm->ps->forceJumpZStart ) + if (pm->ps->forceJumpZStart) {//we were force-jumping forceLanding = qtrue; } @@ -4015,37 +4040,37 @@ static void PM_CrashLand( void ) } else {//take off some of it, at least - delta = (pm->ps->jumpZStart-pm->ps->origin[2]); + delta = (pm->ps->jumpZStart - pm->ps->origin[2]); float dropAllow = forceJumpHeight[pm->ps->forcePowerLevel[FP_LEVITATION]]; - if ( dropAllow < 128 ) + if (dropAllow < 128) {//always allow a drop from 128, at least dropAllow = 128; } - if ( delta > forceJumpHeight[FORCE_LEVEL_1] ) + if (delta > forceJumpHeight[FORCE_LEVEL_1]) {//will have to use force jump ability to absorb some of it forceLanding = qtrue;//absorbed some - just to force the correct animation to play below } - delta = (delta - dropAllow)/2; + delta = (delta - dropAllow) / 2; } - if ( delta < 1 ) + if (delta < 1) { delta = 1; } } - if ( !delta ) + if (!delta) { - delta = PM_CrashLandDelta( pml.previous_velocity, pm->waterlevel ); + delta = PM_CrashLandDelta(pml.previous_velocity, pm->waterlevel); } } PM_CrashLandEffect(); - if ( (pm->ps->pm_flags&PMF_DUCKED) && (level.time-pm->ps->lastOnGround)>500 ) + if ((pm->ps->pm_flags&PMF_DUCKED) && (level.time - pm->ps->lastOnGround)>500) {//must be crouched and have been inthe air for half a second minimum - if( !PM_InOnGroundAnim( pm->ps ) && !PM_InKnockDown( pm->ps ) ) + if (!PM_InOnGroundAnim(pm->ps) && !PM_InKnockDown(pm->ps)) {//roll! - if ( PM_TryRoll() ) + if (PM_TryRoll()) {//absorb some impact delta *= 0.5f; } @@ -4053,27 +4078,27 @@ static void PM_CrashLand( void ) } // If he just entered the water (from a fall presumably), absorb some of the impact. - if ( pm->waterlevel >= 2 ) + if (pm->waterlevel >= 2) { delta *= 0.4f; } - - if ( delta < 1 ) + + if (delta < 1) { - AddSoundEvent( pm->gent, pm->ps->origin, 32, AEL_MINOR, qfalse, qtrue ); + AddSoundEvent(pm->gent, pm->ps->origin, 32, AEL_MINOR, qfalse, qtrue); return; } qboolean deadFallSound = qfalse; - if( !PM_InDeathAnim() ) + if (!PM_InDeathAnim()) { - if ( PM_InAirKickingAnim( pm->ps->legsAnim ) - && pm->ps->torsoAnim == pm->ps->legsAnim ) + if (PM_InAirKickingAnim(pm->ps->legsAnim) + && pm->ps->torsoAnim == pm->ps->legsAnim) { int anim = PM_GetLandingAnim(); - if ( anim != -1 ) + if (anim != -1) {//interrupting a kick clears everything - PM_SetAnim( pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 100 ); // Only blend over 100ms + PM_SetAnim(pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD, 100); // Only blend over 100ms pm->ps->saberMove = LS_READY; pm->ps->weaponTime = 0; //stick landings some @@ -4081,75 +4106,75 @@ static void PM_CrashLand( void ) pm->ps->velocity[1] *= 0.5f; } } - else if ( pm->gent - && pm->gent->client - && pm->gent->client->NPC_class == CLASS_ROCKETTROOPER ) + else if (pm->gent + && pm->gent->client + && pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) {//rockettroopers are simpler int anim = PM_GetLandingAnim(); - if ( anim != -1 ) + if (anim != -1) { - if ( pm->gent->NPC - && pm->gent->NPC->rank < RANK_LT ) + if (pm->gent->NPC + && pm->gent->NPC->rank < RANK_LT) {//special case: ground-based rocket troopers *always* play land anim on whole body - PM_SetAnim( pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 100 ); // Only blend over 100ms + PM_SetAnim(pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD, 100); // Only blend over 100ms } else { - PM_SetAnim( pm, SETANIM_LEGS, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 100 ); // Only blend over 100ms + PM_SetAnim(pm, SETANIM_LEGS, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD, 100); // Only blend over 100ms } } } - else if ( pm->cmd.upmove >= 0 && !PM_InKnockDown( pm->ps ) && !PM_InRoll( pm->ps )) + else if (pm->cmd.upmove >= 0 && !PM_InKnockDown(pm->ps) && !PM_InRoll(pm->ps)) {//not crouching - if ( delta > 10 - || pm->ps->pm_flags & PMF_BACKWARDS_JUMP - || (pm->ps->forcePowersActive&(1< 10 + || pm->ps->pm_flags & PMF_BACKWARDS_JUMP + || (pm->ps->forcePowersActive&(1 << FP_LEVITATION)) + || forceLanding) //EV_FALL_SHORT or jumping back or force-land {// decide which landing animation to use - if ( pm->gent - && pm->gent->client - && (pm->gent->client->NPC_class == CLASS_RANCOR || pm->gent->client->NPC_class == CLASS_WAMPA ) ) + if (pm->gent + && pm->gent->client + && (pm->gent->client->NPC_class == CLASS_RANCOR || pm->gent->client->NPC_class == CLASS_WAMPA)) { } else { int anim = PM_GetLandingAnim(); - if ( anim != -1 ) + if (anim != -1) { - if ( PM_FlippingAnim( pm->ps->torsoAnim ) - || PM_SpinningAnim( pm->ps->torsoAnim ) - || pm->ps->torsoAnim == BOTH_FLIP_LAND ) + if (PM_FlippingAnim(pm->ps->torsoAnim) + || PM_SpinningAnim(pm->ps->torsoAnim) + || pm->ps->torsoAnim == BOTH_FLIP_LAND) {//interrupt these if we're going to play a land pm->ps->torsoAnimTimer = 0; } - if ( anim == BOTH_FORCELONGLEAP_LAND ) + if (anim == BOTH_FORCELONGLEAP_LAND) { - if ( pm->gent ) + if (pm->gent) { - G_SoundOnEnt( pm->gent, CHAN_AUTO, "sound/player/slide.wav" ); + G_SoundOnEnt(pm->gent, CHAN_AUTO, "sound/player/slide.wav"); } - PM_SetAnim( pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 100 ); // Only blend over 100ms + PM_SetAnim(pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD, 100); // Only blend over 100ms } - else if ( anim == BOTH_FLIP_LAND - || (pm->ps->torsoAnim == BOTH_FLIP_LAND) ) + else if (anim == BOTH_FLIP_LAND + || (pm->ps->torsoAnim == BOTH_FLIP_LAND)) { - PM_SetAnim( pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 100 ); // Only blend over 100ms + PM_SetAnim(pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD, 100); // Only blend over 100ms } - else if ( PM_InAirKickingAnim( pm->ps->legsAnim ) - && pm->ps->torsoAnim == pm->ps->legsAnim ) + else if (PM_InAirKickingAnim(pm->ps->legsAnim) + && pm->ps->torsoAnim == pm->ps->legsAnim) {//interrupting a kick clears everything - PM_SetAnim( pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 100 ); // Only blend over 100ms + PM_SetAnim(pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD, 100); // Only blend over 100ms pm->ps->saberMove = LS_READY; pm->ps->weaponTime = 0; } - else if ( PM_ForceJumpingAnim( pm->ps->legsAnim ) - && pm->ps->torsoAnim == pm->ps->legsAnim ) + else if (PM_ForceJumpingAnim(pm->ps->legsAnim) + && pm->ps->torsoAnim == pm->ps->legsAnim) {//special case: if land during one of these, set the torso, too, if it's not doing something else - PM_SetAnim( pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 100 ); // Only blend over 100ms + PM_SetAnim(pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD, 100); // Only blend over 100ms } else { - PM_SetAnim( pm, SETANIM_LEGS, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 100 ); // Only blend over 100ms + PM_SetAnim(pm, SETANIM_LEGS, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD, 100); // Only blend over 100ms } } } @@ -4160,173 +4185,173 @@ static void PM_CrashLand( void ) { pm->ps->gravity = 1.0; //PM_CrashLandDamage( delta ); - if ( pm->gent ) - { + if (pm->gent) + { if ((!(pml.groundTrace.surfaceFlags & SURF_NODAMAGE)) && -// (!(pml.groundTrace.contents & CONTENTS_NODROP)) && - (!(pm->pointcontents(pm->ps->origin,pm->ps->clientNum) & CONTENTS_NODROP))) + // (!(pml.groundTrace.contents & CONTENTS_NODROP)) && + (!(pm->pointcontents(pm->ps->origin, pm->ps->clientNum) & CONTENTS_NODROP))) { - if ( pm->waterlevel < 2 ) + if (pm->waterlevel < 2) {//don't play fallsplat when impact in the water deadFallSound = qtrue; - if ( !(pm->ps->eFlags&EF_NODRAW) ) + if (!(pm->ps->eFlags&EF_NODRAW)) {//no sound if no draw - if ( delta >= 75 ) + if (delta >= 75) { - G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/player/fallsplat.wav" ); + G_SoundOnEnt(pm->gent, CHAN_BODY, "sound/player/fallsplat.wav"); } else { - G_SoundOnEnt( pm->gent, CHAN_BODY, va("sound/player/bodyfall_human%d.wav",Q_irand(1,3)) ); + G_SoundOnEnt(pm->gent, CHAN_BODY, va("sound/player/bodyfall_human%d.wav", Q_irand(1, 3))); } } } else { - G_SoundOnEnt( pm->gent, CHAN_BODY, va("sound/player/bodyfall_water%d.wav",Q_irand(1,3)) ); + G_SoundOnEnt(pm->gent, CHAN_BODY, va("sound/player/bodyfall_water%d.wav", Q_irand(1, 3))); } - if ( gi.VoiceVolume[pm->ps->clientNum] - && pm->gent->NPC && (pm->gent->NPC->aiFlags&NPCAI_DIE_ON_IMPACT) ) + if (gi.VoiceVolume[pm->ps->clientNum] + && pm->gent->NPC && (pm->gent->NPC->aiFlags&NPCAI_DIE_ON_IMPACT)) {//I was talking, so cut it off... with a jump sound? - if ( !(pm->ps->eFlags&EF_NODRAW) ) + if (!(pm->ps->eFlags&EF_NODRAW)) {//no sound if no draw - G_SoundOnEnt( pm->gent, CHAN_VOICE_ATTEN, "*pain100.wav" ); + G_SoundOnEnt(pm->gent, CHAN_VOICE_ATTEN, "*pain100.wav"); } } } } - if( pm->ps->legsAnim == BOTH_FALLDEATH1 || pm->ps->legsAnim == BOTH_FALLDEATH1INAIR) + if (pm->ps->legsAnim == BOTH_FALLDEATH1 || pm->ps->legsAnim == BOTH_FALLDEATH1INAIR) {//FIXME: add a little bounce? //FIXME: cut voice channel? int old_pm_type = pm->ps->pm_type; pm->ps->pm_type = PM_NORMAL; //Hack because for some reason PM_SetAnim just returns if you're dead...??? - PM_SetAnim(pm, SETANIM_BOTH, BOTH_FALLDEATH1LAND, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_BOTH, BOTH_FALLDEATH1LAND, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); pm->ps->pm_type = old_pm_type; - AddSoundEvent( pm->gent, pm->ps->origin, 256, AEL_SUSPICIOUS, qfalse, qtrue ); + AddSoundEvent(pm->gent, pm->ps->origin, 256, AEL_SUSPICIOUS, qfalse, qtrue); return; } - } + } // create a local entity event to play the sound - if ( pm->gent && pm->gent->client && pm->gent->client->respawnTime >= level.time - 500 ) + if (pm->gent && pm->gent->client && pm->gent->client->respawnTime >= level.time - 500) {//just spawned in, don't make a noise return; } - if ( delta >= 75 ) + if (delta >= 75) { - if ( !deadFallSound ) + if (!deadFallSound) { - if ( !(pm->ps->eFlags&EF_NODRAW) ) + if (!(pm->ps->eFlags&EF_NODRAW)) {//no sound if no draw - PM_AddEvent( EV_FALL_FAR ); + PM_AddEvent(EV_FALL_FAR); } } - if ( !(pml.groundTrace.surfaceFlags & SURF_NODAMAGE) ) + if (!(pml.groundTrace.surfaceFlags & SURF_NODAMAGE)) { - PM_CrashLandDamage( delta ); + PM_CrashLandDamage(delta); } - if ( pm->gent ) + if (pm->gent) { - if ( pm->gent->s.number == 0 ) + if (pm->gent->s.number == 0) { vec3_t bottom; - VectorCopy( pm->ps->origin, bottom ); + VectorCopy(pm->ps->origin, bottom); bottom[2] += pm->mins[2]; - // if ( pm->gent->client && pm->gent->client->playerTeam != TEAM_DISGUISE ) + // if ( pm->gent->client && pm->gent->client->playerTeam != TEAM_DISGUISE ) { - AddSoundEvent( pm->gent, bottom, 256, AEL_SUSPICIOUS, qfalse, qtrue ); + AddSoundEvent(pm->gent, bottom, 256, AEL_SUSPICIOUS, qfalse, qtrue); } } - else if ( pm->ps->stats[STAT_HEALTH] <= 0 && pm->gent && pm->gent->enemy ) + else if (pm->ps->stats[STAT_HEALTH] <= 0 && pm->gent && pm->gent->enemy) { - AddSoundEvent( pm->gent->enemy, pm->ps->origin, 256, AEL_DISCOVERED, qfalse, qtrue ); + AddSoundEvent(pm->gent->enemy, pm->ps->origin, 256, AEL_DISCOVERED, qfalse, qtrue); } } - } - else if ( delta >= 50 ) + } + else if (delta >= 50) { // this is a pain grunt, so don't play it if dead - if ( pm->ps->stats[STAT_HEALTH] > 0 ) + if (pm->ps->stats[STAT_HEALTH] > 0) { - if ( !deadFallSound ) + if (!deadFallSound) { - if ( !(pm->ps->eFlags&EF_NODRAW) ) + if (!(pm->ps->eFlags&EF_NODRAW)) {//no sound if no draw - PM_AddEvent( EV_FALL_MEDIUM );//damage is dealt in g_active, ClientEvents + PM_AddEvent(EV_FALL_MEDIUM);//damage is dealt in g_active, ClientEvents } } - if ( pm->gent ) + if (pm->gent) { - if ( !(pml.groundTrace.surfaceFlags & SURF_NODAMAGE) ) + if (!(pml.groundTrace.surfaceFlags & SURF_NODAMAGE)) { - PM_CrashLandDamage( delta ); + PM_CrashLandDamage(delta); } - if ( pm->gent->s.number == 0 ) + if (pm->gent->s.number == 0) { vec3_t bottom; - VectorCopy( pm->ps->origin, bottom ); + VectorCopy(pm->ps->origin, bottom); bottom[2] += pm->mins[2]; - // if ( pm->gent->client && pm->gent->client->playerTeam != TEAM_DISGUISE ) + // if ( pm->gent->client && pm->gent->client->playerTeam != TEAM_DISGUISE ) { - AddSoundEvent( pm->gent, bottom, 256, AEL_MINOR, qfalse, qtrue ); + AddSoundEvent(pm->gent, bottom, 256, AEL_MINOR, qfalse, qtrue); } } } } - } - else if ( delta >= 30 ) + } + else if (delta >= 30) { - if ( !deadFallSound ) + if (!deadFallSound) { - if ( !(pm->ps->eFlags&EF_NODRAW) ) + if (!(pm->ps->eFlags&EF_NODRAW)) {//no sound if no draw - PM_AddEvent( EV_FALL_SHORT ); + PM_AddEvent(EV_FALL_SHORT); } } - if ( pm->gent ) + if (pm->gent) { - if ( pm->gent->s.number == 0 ) + if (pm->gent->s.number == 0) { vec3_t bottom; - VectorCopy( pm->ps->origin, bottom ); + VectorCopy(pm->ps->origin, bottom); bottom[2] += pm->mins[2]; - // if ( pm->gent->client && pm->gent->client->playerTeam != TEAM_DISGUISE ) + // if ( pm->gent->client && pm->gent->client->playerTeam != TEAM_DISGUISE ) { - AddSoundEvent( pm->gent, bottom, 128, AEL_MINOR, qfalse, qtrue ); + AddSoundEvent(pm->gent, bottom, 128, AEL_MINOR, qfalse, qtrue); } } else { - if ( !(pml.groundTrace.surfaceFlags & SURF_NODAMAGE) ) + if (!(pml.groundTrace.surfaceFlags & SURF_NODAMAGE)) { - PM_CrashLandDamage( delta ); + PM_CrashLandDamage(delta); } } } - } - else + } + else { - if ( !deadFallSound ) + if (!deadFallSound) { - if ( !(pm->ps->pm_flags&PMF_DUCKED) || !Q_irand( 0, 3 ) ) + if (!(pm->ps->pm_flags&PMF_DUCKED) || !Q_irand(0, 3)) {//only 25% chance of making landing alert when ducked - AddSoundEvent( pm->gent, pm->ps->origin, 32, AEL_MINOR, qfalse, qtrue ); + AddSoundEvent(pm->gent, pm->ps->origin, 32, AEL_MINOR, qfalse, qtrue); } - if ( !(pm->ps->eFlags&EF_NODRAW) ) + if (!(pm->ps->eFlags&EF_NODRAW)) {//no sound if no draw - if ( forceLanding ) + if (forceLanding) {//we were force-jumping - PM_AddEvent( EV_FALL_SHORT ); + PM_AddEvent(EV_FALL_SHORT); } else { -//moved to cg_player PM_AddEvent( PM_FootstepForSurface() ); + //moved to cg_player PM_AddEvent( PM_FootstepForSurface() ); } } } @@ -4334,7 +4359,7 @@ static void PM_CrashLand( void ) // start footstep cycle over pm->ps->bobCycle = 0; - if ( pm->gent && pm->gent->client ) + if (pm->gent && pm->gent->client) {//stop the force push effect when you land pm->gent->forcePushTime = 0; } @@ -4347,8 +4372,8 @@ static void PM_CrashLand( void ) PM_CorrectAllSolid ============= */ -static void PM_CorrectAllSolid( void ) { - if ( pm->debugLevel ) { +static void PM_CorrectAllSolid(void) { + if (pm->debugLevel) { Com_Printf("%i:allsolid\n", c_pmove); //NOTENOTE: If this ever happens, I'd really like to see this print! } @@ -4359,24 +4384,24 @@ static void PM_CorrectAllSolid( void ) { pml.walking = qfalse; } -qboolean FlyingCreature( gentity_t *ent ) +qboolean FlyingCreature(gentity_t *ent) { - if ( ent->client->ps.gravity <= 0 && (ent->svFlags&SVF_CUSTOM_GRAVITY) ) + if (ent->client->ps.gravity <= 0 && (ent->svFlags&SVF_CUSTOM_GRAVITY)) { return qtrue; } return qfalse; } -qboolean PM_RocketeersAvoidDangerousFalls( void ) +qboolean PM_RocketeersAvoidDangerousFalls(void) { - if ( pm->gent->NPC - && pm->gent->client - && (pm->gent->client->NPC_class == CLASS_BOBAFETT||pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) ) + if (pm->gent->NPC + && pm->gent->client + && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER)) {//fixme: fall through if jetpack broken? - if ( JET_Flying( pm->gent ) ) + if (JET_Flying(pm->gent)) { - if ( pm->gent->client->NPC_class == CLASS_BOBAFETT ) + if (pm->gent->client->NPC_class == CLASS_BOBAFETT) { pm->gent->client->jetPackTime = level.time + 2000; //Wait, what if the effect is already playing, how do we know??? @@ -4389,46 +4414,46 @@ qboolean PM_RocketeersAvoidDangerousFalls( void ) } else { - TIMER_Set( pm->gent, "jetRecharge", 0 ); - JET_FlyStart( pm->gent ); + TIMER_Set(pm->gent, "jetRecharge", 0); + JET_FlyStart(pm->gent); } return qtrue; } return qfalse; } -static void PM_FallToDeath( void ) +static void PM_FallToDeath(void) { - if ( !pm->gent ) + if (!pm->gent) { return; } - if ( PM_RocketeersAvoidDangerousFalls() ) + if (PM_RocketeersAvoidDangerousFalls()) { return; } // If this is a vehicle, more precisely an animal... - if ( pm->gent->client->NPC_class == CLASS_VEHICLE && pm->gent->m_pVehicle->m_pVehicleInfo->type == VH_ANIMAL ) + if (pm->gent->client->NPC_class == CLASS_VEHICLE && pm->gent->m_pVehicle->m_pVehicleInfo->type == VH_ANIMAL) { Vehicle_t *pVeh = pm->gent->m_pVehicle; - pVeh->m_pVehicleInfo->EjectAll( pVeh ); + pVeh->m_pVehicleInfo->EjectAll(pVeh); } else { - if ( PM_HasAnimation( pm->gent, BOTH_FALLDEATH1 ) ) + if (PM_HasAnimation(pm->gent, BOTH_FALLDEATH1)) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_FALLDEATH1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_FALLDEATH1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } else { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_DEATH1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_DEATH1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } - G_SoundOnEnt( pm->gent, CHAN_VOICE, "*falling1.wav" );//CHAN_VOICE_ATTEN + G_SoundOnEnt(pm->gent, CHAN_VOICE, "*falling1.wav");//CHAN_VOICE_ATTEN } - if ( pm->gent->NPC ) + if (pm->gent->NPC) { pm->gent->NPC->aiFlags |= NPCAI_DIE_ON_IMPACT; pm->gent->NPC->nextBStateThink = Q3_INFINITE; @@ -4436,9 +4461,9 @@ static void PM_FallToDeath( void ) pm->ps->friction = 1; } -int PM_ForceJumpAnimForJumpAnim( int anim ) +int PM_ForceJumpAnimForJumpAnim(int anim) { - switch( anim ) + switch (anim) { case BOTH_JUMP1: //# Jump - wind-up and leave ground anim = BOTH_FORCEJUMP1; //# Jump - wind-up and leave ground @@ -4480,41 +4505,41 @@ int PM_ForceJumpAnimForJumpAnim( int anim ) return anim; } -static void PM_SetVehicleAngles( vec3_t normal ) +static void PM_SetVehicleAngles(vec3_t normal) { - if ( !pm->gent->client || pm->gent->client->NPC_class != CLASS_VEHICLE ) + if (!pm->gent->client || pm->gent->client->NPC_class != CLASS_VEHICLE) return; Vehicle_t *pVeh = pm->gent->m_pVehicle; - + //float curVehicleBankingSpeed; float vehicleBankingSpeed = pVeh->m_pVehicleInfo->bankingSpeed;//0.25f vec3_t vAngles; - if ( vehicleBankingSpeed <= 0 - || ( pVeh->m_pVehicleInfo->pitchLimit <= 0 && pVeh->m_pVehicleInfo->rollLimit <= 0 ) ) + if (vehicleBankingSpeed <= 0 + || (pVeh->m_pVehicleInfo->pitchLimit <= 0 && pVeh->m_pVehicleInfo->rollLimit <= 0)) {//don't bother, this vehicle doesn't bank return; } //FIXME: do 3 traces to define a plane and use that... smoothes it out some, too... //pitch_roll_for_slope( pm->gent, normal, vAngles ); //FIXME: maybe have some pitch control in water and/or air? - + //center of gravity affects pitch in air/water (FIXME: what about roll?) //float pitchBias = 90.0f*pVeh->m_pVehicleInfo->centerOfGravity[0];//if centerOfGravity is all the way back (-1.0f), vehicle pitches up 90 degrees when in air - VectorClear( vAngles ); + VectorClear(vAngles); - if (pm->waterlevel>0 || (normal && (pml.groundTrace.contents&(CONTENTS_WATER|CONTENTS_SLIME|CONTENTS_LAVA)))) + if (pm->waterlevel>0 || (normal && (pml.groundTrace.contents&(CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA)))) {//in water - // vAngles[PITCH] += (pm->ps->viewangles[PITCH]-vAngles[PITCH])*0.75f + (pitchBias*0.5); + // vAngles[PITCH] += (pm->ps->viewangles[PITCH]-vAngles[PITCH])*0.75f + (pitchBias*0.5); } - else if ( normal ) + else if (normal) {//have a valid surface below me - pitch_roll_for_slope( pm->gent, normal, vAngles ); + pitch_roll_for_slope(pm->gent, normal, vAngles); float deltaPitch = (vAngles[PITCH] - pVeh->m_vOrientation[PITCH]); - if (deltaPitch< -10.0f) + if (deltaPitch< -10.0f) { vAngles[PITCH] = pVeh->m_vOrientation[PITCH] - 10.0f; } @@ -4526,10 +4551,10 @@ static void PM_SetVehicleAngles( vec3_t normal ) else {//in air, let pitch match view...? //FIXME: take center of gravity into account - vAngles[PITCH] = pVeh->m_vOrientation[PITCH] - 1; + vAngles[PITCH] = pVeh->m_vOrientation[PITCH] - 1; if (vAngles[PITCH]<-15) { - vAngles[PITCH]=-15; + vAngles[PITCH] = -15; } //don't bank so fast when in the air vehicleBankingSpeed *= 0.125f; @@ -4544,23 +4569,23 @@ static void PM_SetVehicleAngles( vec3_t normal ) { //vAngles[ROLL] = pVeh->m_vOrientation[ROLL] + 5; } - else if ( pVeh->m_pVehicleInfo->rollLimit > 0 ) + else if (pVeh->m_pVehicleInfo->rollLimit > 0) { //roll when banking vec3_t velocity; float speed; - VectorCopy( pm->ps->velocity, velocity ); - speed = VectorNormalize( velocity ); - if ( speed>0.01f ) + VectorCopy(pm->ps->velocity, velocity); + speed = VectorNormalize(velocity); + if (speed>0.01f) { vec3_t rt, tempVAngles; float side, dotp; - VectorCopy( pVeh->m_vOrientation, tempVAngles ); + VectorCopy(pVeh->m_vOrientation, tempVAngles); tempVAngles[ROLL] = 0; - AngleVectors( tempVAngles, NULL, rt, NULL ); - dotp = DotProduct( velocity, rt ); + AngleVectors(tempVAngles, NULL, rt, NULL); + dotp = DotProduct(velocity, rt); //if (fabsf(dotp)>0.5f) { speed *= dotp; @@ -4578,31 +4603,31 @@ static void PM_SetVehicleAngles( vec3_t normal ) speed /= pVeh->m_pVehicleInfo->speedMax; } - /// if (pm->cmd.forwardmove==0) - // { - // speed *= 0.5; - // } - // if (pm->cmd.forwardmove<0) - // { - // speed *= 0.1f; - // } + /// if (pm->cmd.forwardmove==0) + // { + // speed *= 0.5; + // } + // if (pm->cmd.forwardmove<0) + // { + // speed *= 0.1f; + // } if (pVeh->m_ulFlags & VEH_SLIDEBREAKING) { speed *= 3.0f; } - - side = speed * 75.0f; - // if (pVeh->m_ulFlags & VEH_STRAFERAM) - // { - // vAngles[ROLL] += side; - // } - // else + + side = speed * 75.0f; + // if (pVeh->m_ulFlags & VEH_STRAFERAM) + // { + // vAngles[ROLL] += side; + // } + // else { - vAngles[ROLL] -= side; + vAngles[ROLL] -= side; } - //gi.Printf("VAngles(%f)", vAngles[2]); + //gi.Printf("VAngles(%f)", vAngles[2]); } if (fabsf(vAngles[ROLL])<0.001f) { @@ -4612,36 +4637,36 @@ static void PM_SetVehicleAngles( vec3_t normal ) } //cap - if ( vAngles[PITCH] > pVeh->m_pVehicleInfo->pitchLimit ) + if (vAngles[PITCH] > pVeh->m_pVehicleInfo->pitchLimit) { vAngles[PITCH] = pVeh->m_pVehicleInfo->pitchLimit; } - else if ( vAngles[PITCH] < -pVeh->m_pVehicleInfo->pitchLimit ) + else if (vAngles[PITCH] < -pVeh->m_pVehicleInfo->pitchLimit) { vAngles[PITCH] = -pVeh->m_pVehicleInfo->pitchLimit; } if (!(pVeh->m_ulFlags & VEH_SPINNING)) { - if ( vAngles[ROLL] > pVeh->m_pVehicleInfo->rollLimit ) + if (vAngles[ROLL] > pVeh->m_pVehicleInfo->rollLimit) { vAngles[ROLL] = pVeh->m_pVehicleInfo->rollLimit; } - else if ( vAngles[ROLL] < -pVeh->m_pVehicleInfo->rollLimit ) + else if (vAngles[ROLL] < -pVeh->m_pVehicleInfo->rollLimit) { vAngles[ROLL] = -pVeh->m_pVehicleInfo->rollLimit; } } - + //do it - for ( int i = 0; i < 3; i++ ) + for (int i = 0; i < 3; i++) { - if ( i == YAW ) + if (i == YAW) {//yawing done elsewhere continue; } - if ( i == ROLL && pVeh->m_ulFlags & VEH_STRAFERAM) + if (i == ROLL && pVeh->m_ulFlags & VEH_STRAFERAM) {//during strafe ram, roll is done elsewhere continue; } @@ -4649,92 +4674,92 @@ static void PM_SetVehicleAngles( vec3_t normal ) /* else if ( i == PITCH ) { - curVehicleBankingSpeed = vehicleBankingSpeed*fabs(AngleNormalize180(AngleSubtract( vAngles[PITCH], pVeh->m_vOrientation[PITCH] )))/(g_vehicleInfo[pm->ps->vehicleIndex].pitchLimit/2.0f); + curVehicleBankingSpeed = vehicleBankingSpeed*fabs(AngleNormalize180(AngleSubtract( vAngles[PITCH], pVeh->m_vOrientation[PITCH] )))/(g_vehicleInfo[pm->ps->vehicleIndex].pitchLimit/2.0f); } else if ( i == ROLL ) { - curVehicleBankingSpeed = vehicleBankingSpeed*fabs(AngleNormalize180(AngleSubtract( vAngles[ROLL], pVeh->m_vOrientation[ROLL] )))/(g_vehicleInfo[pm->ps->vehicleIndex].rollLimit/2.0f); + curVehicleBankingSpeed = vehicleBankingSpeed*fabs(AngleNormalize180(AngleSubtract( vAngles[ROLL], pVeh->m_vOrientation[ROLL] )))/(g_vehicleInfo[pm->ps->vehicleIndex].rollLimit/2.0f); } if ( curVehicleBankingSpeed ) */ { - // if ( pVeh->m_vOrientation[i] >= vAngles[i] + vehicleBankingSpeed ) - // { - // pVeh->m_vOrientation[i] -= vehicleBankingSpeed; - // } - // else if ( pVeh->m_vOrientation[i] <= vAngles[i] - vehicleBankingSpeed ) - // { - // pVeh->m_vOrientation[i] += vehicleBankingSpeed; - // } - // else + // if ( pVeh->m_vOrientation[i] >= vAngles[i] + vehicleBankingSpeed ) + // { + // pVeh->m_vOrientation[i] -= vehicleBankingSpeed; + // } + // else if ( pVeh->m_vOrientation[i] <= vAngles[i] - vehicleBankingSpeed ) + // { + // pVeh->m_vOrientation[i] += vehicleBankingSpeed; + // } + // else { pVeh->m_vOrientation[i] = vAngles[i]; } } } - //gi.Printf("Orientation(%f)", pVeh->m_vOrientation[2]); + //gi.Printf("Orientation(%f)", pVeh->m_vOrientation[2]); } -void BG_ExternThisSoICanRecompileInDebug( Vehicle_t *pVeh, playerState_t *riderPS ) +void BG_ExternThisSoICanRecompileInDebug(Vehicle_t *pVeh, playerState_t *riderPS) {/* - float pitchSubtract, pitchDelta, yawDelta; - //Com_Printf( S_COLOR_RED"PITCH: %4.2f, YAW: %4.2f, ROLL: %4.2f\n", riderPS->viewangles[0],riderPS->viewangles[1],riderPS->viewangles[2]); - yawDelta = AngleSubtract(riderPS->viewangles[YAW],pVeh->m_vPrevRiderViewAngles[YAW]); -#ifndef QAGAME - if ( !cg_paused.integer ) - { - //Com_Printf( "%d - yawDelta %4.2f\n", pm->cmd.serverTime, yawDelta ); - } -#endif - yawDelta *= (4.0f*pVeh->m_fTimeModifier); - pVeh->m_vOrientation[ROLL] -= yawDelta; - - pitchDelta = AngleSubtract(riderPS->viewangles[PITCH],pVeh->m_vPrevRiderViewAngles[PITCH]); - pitchDelta *= (2.0f*pVeh->m_fTimeModifier); - pitchSubtract = pitchDelta * (fabs(pVeh->m_vOrientation[ROLL])/90.0f); - pVeh->m_vOrientation[PITCH] += pitchDelta-pitchSubtract; - if ( pVeh->m_vOrientation[ROLL] > 0 ) - { - pVeh->m_vOrientation[YAW] += pitchSubtract; - } - else - { - pVeh->m_vOrientation[YAW] -= pitchSubtract; - } - pVeh->m_vOrientation[PITCH] = AngleNormalize180( pVeh->m_vOrientation[PITCH] ); - pVeh->m_vOrientation[YAW] = AngleNormalize360( pVeh->m_vOrientation[YAW] ); - pVeh->m_vOrientation[ROLL] = AngleNormalize180( pVeh->m_vOrientation[ROLL] ); - - VectorCopy( riderPS->viewangles, pVeh->m_vPrevRiderViewAngles );*/ -} - -void BG_VehicleTurnRateForSpeed( Vehicle_t *pVeh, float speed, float *mPitchOverride, float *mYawOverride ) -{ - if ( pVeh && pVeh->m_pVehicleInfo ) + float pitchSubtract, pitchDelta, yawDelta; + //Com_Printf( S_COLOR_RED"PITCH: %4.2f, YAW: %4.2f, ROLL: %4.2f\n", riderPS->viewangles[0],riderPS->viewangles[1],riderPS->viewangles[2]); + yawDelta = AngleSubtract(riderPS->viewangles[YAW],pVeh->m_vPrevRiderViewAngles[YAW]); + #ifndef QAGAME + if ( !cg_paused.integer ) + { + //Com_Printf( "%d - yawDelta %4.2f\n", pm->cmd.serverTime, yawDelta ); + } + #endif + yawDelta *= (4.0f*pVeh->m_fTimeModifier); + pVeh->m_vOrientation[ROLL] -= yawDelta; + + pitchDelta = AngleSubtract(riderPS->viewangles[PITCH],pVeh->m_vPrevRiderViewAngles[PITCH]); + pitchDelta *= (2.0f*pVeh->m_fTimeModifier); + pitchSubtract = pitchDelta * (fabs(pVeh->m_vOrientation[ROLL])/90.0f); + pVeh->m_vOrientation[PITCH] += pitchDelta-pitchSubtract; + if ( pVeh->m_vOrientation[ROLL] > 0 ) + { + pVeh->m_vOrientation[YAW] += pitchSubtract; + } + else + { + pVeh->m_vOrientation[YAW] -= pitchSubtract; + } + pVeh->m_vOrientation[PITCH] = AngleNormalize180( pVeh->m_vOrientation[PITCH] ); + pVeh->m_vOrientation[YAW] = AngleNormalize360( pVeh->m_vOrientation[YAW] ); + pVeh->m_vOrientation[ROLL] = AngleNormalize180( pVeh->m_vOrientation[ROLL] ); + + VectorCopy( riderPS->viewangles, pVeh->m_vPrevRiderViewAngles );*/ +} + +void BG_VehicleTurnRateForSpeed(Vehicle_t *pVeh, float speed, float *mPitchOverride, float *mYawOverride) +{ + if (pVeh && pVeh->m_pVehicleInfo) { float speedFrac = 1.0f; - if ( pVeh->m_pVehicleInfo->speedDependantTurning ) + if (pVeh->m_pVehicleInfo->speedDependantTurning) { - if ( pVeh->m_LandTrace.fraction >= 1.0f - || pVeh->m_LandTrace.plane.normal[2] < MIN_LANDING_SLOPE ) + if (pVeh->m_LandTrace.fraction >= 1.0f + || pVeh->m_LandTrace.plane.normal[2] < MIN_LANDING_SLOPE) { - speedFrac = (speed/(pVeh->m_pVehicleInfo->speedMax*0.75f)); - if ( speedFrac < 0.25f ) + speedFrac = (speed / (pVeh->m_pVehicleInfo->speedMax*0.75f)); + if (speedFrac < 0.25f) { speedFrac = 0.25f; } - else if ( speedFrac > 1.0f ) + else if (speedFrac > 1.0f) { speedFrac = 1.0f; } } } - if ( pVeh->m_pVehicleInfo->mousePitch ) + if (pVeh->m_pVehicleInfo->mousePitch) { *mPitchOverride = pVeh->m_pVehicleInfo->mousePitch*speedFrac; } - if ( pVeh->m_pVehicleInfo->mouseYaw ) + if (pVeh->m_pVehicleInfo->mouseYaw) { *mYawOverride = pVeh->m_pVehicleInfo->mouseYaw*speedFrac; } @@ -4747,103 +4772,103 @@ PM_GroundTraceMissed The ground trace didn't hit a surface, so we are in freefall ============= */ -static void PM_GroundTraceMissed( void ) { +static void PM_GroundTraceMissed(void) { trace_t trace; vec3_t point; qboolean cliff_fall = qfalse; - if ( Flying != FLY_HOVER ) + if (Flying != FLY_HOVER) { - if ( !(pm->ps->eFlags&EF_FORCE_DRAINED) ) + if (!(pm->ps->eFlags&EF_FORCE_DRAINED)) { //FIXME: if in a contents_falldeath brush, play the falling death anim and sound? - if ( pm->ps->clientNum != 0 && pm->gent && pm->gent->NPC && pm->gent->client && pm->gent->client->NPC_class != CLASS_DESANN )//desann never falls to his death + if (pm->ps->clientNum != 0 && pm->gent && pm->gent->NPC && pm->gent->client && pm->gent->client->NPC_class != CLASS_DESANN)//desann never falls to his death { - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) + if (pm->ps->groundEntityNum == ENTITYNUM_NONE) { - if ( pm->ps->stats[STAT_HEALTH] > 0 - && !(pm->gent->NPC->aiFlags&NPCAI_DIE_ON_IMPACT) + if (pm->ps->stats[STAT_HEALTH] > 0 + && !(pm->gent->NPC->aiFlags&NPCAI_DIE_ON_IMPACT) && !(pm->gent->NPC->aiFlags&NPCAI_JUMP) // doing a path jump && !(pm->gent->NPC->scriptFlags&SCF_NO_FALLTODEATH) - && pm->gent->NPC->behaviorState != BS_JUMP )//not being scripted to jump + && pm->gent->NPC->behaviorState != BS_JUMP)//not being scripted to jump { - if ( (level.time - pm->gent->client->respawnTime > 2000)//been in the world for at least 2 seconds + if ((level.time - pm->gent->client->respawnTime > 2000)//been in the world for at least 2 seconds && (!pm->gent->NPC->timeOfDeath || level.time - pm->gent->NPC->timeOfDeath < 1000) && pm->gent->e_ThinkFunc != thinkF_NPC_RemoveBody //Have to do this now because timeOfDeath is used by thinkF_NPC_RemoveBody to debounce removal checks - && !(pm->gent->client->ps.forcePowersActive&(1<gent->client->ps.forcePowersActive&(1 << FP_LEVITATION))) { - if ( !FlyingCreature( pm->gent ) - && g_gravity->value > 0 ) + if (!FlyingCreature(pm->gent) + && g_gravity->value > 0) { - if ( !(pm->gent->flags&FL_UNDYING) - && !(pm->gent->flags&FL_GODMODE) ) + if (!(pm->gent->flags&FL_UNDYING) + && !(pm->gent->flags&FL_GODMODE)) { - if ( !(pm->ps->eFlags&EF_FORCE_GRIPPED) - && !(pm->ps->eFlags&EF_FORCE_DRAINED) - && !(pm->ps->pm_flags&PMF_TRIGGER_PUSHED) ) + if (!(pm->ps->eFlags&EF_FORCE_GRIPPED) + && !(pm->ps->eFlags&EF_FORCE_DRAINED) + && !(pm->ps->pm_flags&PMF_TRIGGER_PUSHED)) { - if ( !pm->ps->forceJumpZStart || pm->ps->forceJumpZStart > pm->ps->origin[2] )// && fabs(pm->ps->velocity[0])<10 && fabs(pm->ps->velocity[1])<10 && pm->ps->velocity[2]<0)//either not force-jumping or force-jumped and now fell below original jump start height + if (!pm->ps->forceJumpZStart || pm->ps->forceJumpZStart > pm->ps->origin[2])// && fabs(pm->ps->velocity[0])<10 && fabs(pm->ps->velocity[1])<10 && pm->ps->velocity[2]<0)//either not force-jumping or force-jumped and now fell below original jump start height { - /*if ( pm->ps->legsAnim = BOTH_FALLDEATH1 - && pm->ps->legsAnim != BOTH_DEATH1 + /*if ( pm->ps->legsAnim = BOTH_FALLDEATH1 + && pm->ps->legsAnim != BOTH_DEATH1 && PM_HasAnimation( pm->gent, BOTH_FALLDEATH1 )*/ //New method: predict impact, 400 ahead vec3_t vel; float time; - VectorCopy( pm->ps->velocity, vel ); - float speed = VectorLength( vel ); - if ( !speed ) + VectorCopy(pm->ps->velocity, vel); + float speed = VectorLength(vel); + if (!speed) {//damn divide by zero speed = 1; } - time = 400/speed; + time = 400 / speed; vel[2] -= 0.5 * time * pm->ps->gravity; - speed = VectorLength( vel ); - if ( !speed ) + speed = VectorLength(vel); + if (!speed) {//damn divide by zero speed = 1; } - time = 400/speed; - VectorScale( vel, time, vel ); - VectorAdd( pm->ps->origin, vel, point ); + time = 400 / speed; + VectorScale(vel, time, vel); + VectorAdd(pm->ps->origin, vel, point); - pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask, (EG2_Collision)0, 0 ); + pm->trace(&trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask, (EG2_Collision)0, 0); - if ( (trace.contents&CONTENTS_LAVA) - && PM_RocketeersAvoidDangerousFalls() ) + if ((trace.contents&CONTENTS_LAVA) + && PM_RocketeersAvoidDangerousFalls()) {//got out of it } - else if ( !trace.allsolid && !trace.startsolid && (pm->ps->origin[2] - trace.endpos[2]) >= 128 )//>=128 so we don't die on steps! + else if (!trace.allsolid && !trace.startsolid && (pm->ps->origin[2] - trace.endpos[2]) >= 128)//>=128 so we don't die on steps! { - if ( trace.fraction == 1.0 ) + if (trace.fraction == 1.0) {//didn't hit, we're probably going to die - if ( pm->ps->velocity[2] < 0 && pm->ps->origin[2] - point[2] > 256 ) + if (pm->ps->velocity[2] < 0 && pm->ps->origin[2] - point[2] > 256) {//going down, into a bottomless pit, apparently PM_FallToDeath(); cliff_fall = qtrue; } } - else if ( trace.entityNum < ENTITYNUM_NONE - && pm->ps->weapon != WP_SABER - && (!pm->gent || !pm->gent->client || (pm->gent->client->NPC_class != CLASS_BOBAFETT&&pm->gent->client->NPC_class!=CLASS_REBORN&&pm->gent->client->NPC_class!=CLASS_ROCKETTROOPER)) ) + else if (trace.entityNum < ENTITYNUM_NONE + && pm->ps->weapon != WP_SABER + && (!pm->gent || !pm->gent->client || (pm->gent->client->NPC_class != CLASS_BOBAFETT&&pm->gent->client->NPC_class != CLASS_REBORN&&pm->gent->client->NPC_class != CLASS_ROCKETTROOPER))) {//Jedi don't scream and die if they're heading for a hard impact gentity_t *traceEnt = &g_entities[trace.entityNum]; - if ( trace.entityNum == ENTITYNUM_WORLD || (traceEnt && traceEnt->bmodel) ) + if (trace.entityNum == ENTITYNUM_WORLD || (traceEnt && traceEnt->bmodel)) {//hit architecture, find impact force float dmg; - VectorCopy( pm->ps->velocity, vel ); - time = Distance( trace.endpos, pm->ps->origin )/VectorLength( vel ); + VectorCopy(pm->ps->velocity, vel); + time = Distance(trace.endpos, pm->ps->origin) / VectorLength(vel); vel[2] -= 0.5 * time * pm->ps->gravity; - if ( trace.plane.normal[2] > 0.5 ) + if (trace.plane.normal[2] > 0.5) {//use falling damage int waterlevel, junk; - PM_SetWaterLevelAtPoint( trace.endpos, &waterlevel, &junk ); - dmg = PM_CrashLandDelta( vel, waterlevel ); - if ( dmg >= 30 ) + PM_SetWaterLevelAtPoint(trace.endpos, &waterlevel, &junk); + dmg = PM_CrashLandDelta(vel, waterlevel); + if (dmg >= 30) {//there is a minimum fall threshhold - dmg = PM_DamageForDelta( dmg ); + dmg = PM_DamageForDelta(dmg); } else { @@ -4853,30 +4878,30 @@ static void PM_GroundTraceMissed( void ) { else {//use impact damage //guestimate - if ( pm->gent->client && pm->gent->client->ps.forceJumpZStart ) + if (pm->gent->client && pm->gent->client->ps.forceJumpZStart) {//we were force-jumping - if ( pm->gent->currentOrigin[2] >= pm->gent->client->ps.forceJumpZStart ) + if (pm->gent->currentOrigin[2] >= pm->gent->client->ps.forceJumpZStart) {//we landed at same height or higher than we landed dmg = 0; } else {//FIXME: take off some of it, at least? - dmg = (pm->gent->client->ps.forceJumpZStart-pm->gent->currentOrigin[2])/3; + dmg = (pm->gent->client->ps.forceJumpZStart - pm->gent->currentOrigin[2]) / 3; } } - dmg = 10 * VectorLength( pm->ps->velocity ); - if ( pm->ps->clientNum < MAX_CLIENTS ) + dmg = 10 * VectorLength(pm->ps->velocity); + if (pm->ps->clientNum < MAX_CLIENTS) { dmg /= 2; } dmg *= 0.01875f;//magic number } - float maxDmg = pm->ps->stats[STAT_HEALTH]>20?pm->ps->stats[STAT_HEALTH]:20;//a fall that would do less than 20 points of damage should never make us scream to our deaths - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_HOWLER ) + float maxDmg = pm->ps->stats[STAT_HEALTH]>20 ? pm->ps->stats[STAT_HEALTH] : 20;//a fall that would do less than 20 points of damage should never make us scream to our deaths + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_HOWLER) {//howlers can survive long falls, despire their health maxDmg *= 5; } - if ( dmg >= pm->ps->stats[STAT_HEALTH] )//armor? + if (dmg >= pm->ps->stats[STAT_HEALTH])//armor? { PM_FallToDeath(); cliff_fall = qtrue; @@ -4884,7 +4909,7 @@ static void PM_GroundTraceMissed( void ) { } } } - + /* vec3_t start; //okay, kind of expensive temp hack here, but let's check to see if we should scream @@ -4892,7 +4917,7 @@ static void PM_GroundTraceMissed( void ) { VectorCopy( pm->ps->origin, start ); if ( pm->ps->forceJumpZStart < start[2] ) {//Jedi who are force-jumping should only do this from landing point down? - start[2] = pm->ps->forceJumpZStart; + start[2] = pm->ps->forceJumpZStart; } VectorCopy( start, point ); point[2] -= 400;//320 @@ -4900,8 +4925,8 @@ static void PM_GroundTraceMissed( void ) { //FIXME: somehow, people can still get stuck on ledges and not splat when hit...? if ( !trace.allsolid && !trace.startsolid && trace.fraction == 1.0 ) { - PM_FallToDeath(); - cliff_fall = qtrue; + PM_FallToDeath(); + cliff_fall = qtrue; } */ } @@ -4912,94 +4937,94 @@ static void PM_GroundTraceMissed( void ) { } } } - if ( !cliff_fall ) + if (!cliff_fall) { - if ( pm->ps->legsAnim == BOTH_FORCELONGLEAP_START + if (pm->ps->legsAnim == BOTH_FORCELONGLEAP_START || pm->ps->legsAnim == BOTH_FORCELONGLEAP_ATTACK || pm->ps->legsAnim == BOTH_FORCEWALLRUNFLIP_START - || pm->ps->legsAnim == BOTH_FLIP_LAND ) + || pm->ps->legsAnim == BOTH_FLIP_LAND) {//let it stay on this anim } - else if ( PM_KnockDownAnimExtended( pm->ps->legsAnim ) ) + else if (PM_KnockDownAnimExtended(pm->ps->legsAnim)) {//no in-air anims when in knockdown anim } - else if ( ( pm->ps->legsAnim == BOTH_WALL_RUN_RIGHT + else if ((pm->ps->legsAnim == BOTH_WALL_RUN_RIGHT || pm->ps->legsAnim == BOTH_WALL_RUN_LEFT || pm->ps->legsAnim == BOTH_WALL_RUN_RIGHT_STOP || pm->ps->legsAnim == BOTH_WALL_RUN_LEFT_STOP || pm->ps->legsAnim == BOTH_WALL_RUN_RIGHT_FLIP || pm->ps->legsAnim == BOTH_WALL_RUN_LEFT_FLIP || pm->ps->legsAnim == BOTH_WALL_FLIP_RIGHT - || pm->ps->legsAnim == BOTH_WALL_FLIP_LEFT + || pm->ps->legsAnim == BOTH_WALL_FLIP_LEFT || pm->ps->legsAnim == BOTH_FORCEWALLREBOUND_FORWARD || pm->ps->legsAnim == BOTH_FORCEWALLREBOUND_LEFT || pm->ps->legsAnim == BOTH_FORCEWALLREBOUND_BACK || pm->ps->legsAnim == BOTH_FORCEWALLREBOUND_RIGHT - || pm->ps->legsAnim == BOTH_CEILING_DROP ) - && !pm->ps->legsAnimTimer ) + || pm->ps->legsAnim == BOTH_CEILING_DROP) + && !pm->ps->legsAnimTimer) {//if flip anim is done, okay to use inair - PM_SetAnim( pm, SETANIM_LEGS, BOTH_FORCEINAIR1, SETANIM_FLAG_OVERRIDE, 350 ); // Only blend over 100ms + PM_SetAnim(pm, SETANIM_LEGS, BOTH_FORCEINAIR1, SETANIM_FLAG_OVERRIDE, 350); // Only blend over 100ms } - else if ( pm->ps->legsAnim == BOTH_FLIP_ATTACK7 - || pm->ps->legsAnim == BOTH_FLIP_HOLD7 ) + else if (pm->ps->legsAnim == BOTH_FLIP_ATTACK7 + || pm->ps->legsAnim == BOTH_FLIP_HOLD7) { - if ( !pm->ps->legsAnimTimer ) + if (!pm->ps->legsAnimTimer) {//done? - PM_SetAnim( pm, SETANIM_BOTH, BOTH_FLIP_HOLD7, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 350 ); // Only blend over 100ms + PM_SetAnim(pm, SETANIM_BOTH, BOTH_FLIP_HOLD7, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD, 350); // Only blend over 100ms } } - else if ( PM_InCartwheel( pm->ps->legsAnim ) ) + else if (PM_InCartwheel(pm->ps->legsAnim)) { - if ( pm->ps->legsAnimTimer > 0 ) + if (pm->ps->legsAnimTimer > 0) {//still playing on bottom } else { - PM_SetAnim( pm, SETANIM_BOTH, BOTH_INAIR1, SETANIM_FLAG_NORMAL, 350 ); + PM_SetAnim(pm, SETANIM_BOTH, BOTH_INAIR1, SETANIM_FLAG_NORMAL, 350); } } - else if ( PM_InAirKickingAnim( pm->ps->legsAnim ) ) + else if (PM_InAirKickingAnim(pm->ps->legsAnim)) { - if ( pm->ps->legsAnimTimer > 0 ) + if (pm->ps->legsAnimTimer > 0) {//still playing on bottom } else { - PM_SetAnim( pm, SETANIM_BOTH, BOTH_INAIR1, SETANIM_FLAG_NORMAL, 350 ); + PM_SetAnim(pm, SETANIM_BOTH, BOTH_INAIR1, SETANIM_FLAG_NORMAL, 350); pm->ps->saberMove = LS_READY; pm->ps->weaponTime = 0; } } - else if ( !PM_InRoll( pm->ps ) - && !PM_SpinningAnim( pm->ps->legsAnim ) - && !PM_FlippingAnim( pm->ps->legsAnim ) - && !PM_InSpecialJump( pm->ps->legsAnim ) ) + else if (!PM_InRoll(pm->ps) + && !PM_SpinningAnim(pm->ps->legsAnim) + && !PM_FlippingAnim(pm->ps->legsAnim) + && !PM_InSpecialJump(pm->ps->legsAnim)) { - if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + if (pm->ps->groundEntityNum != ENTITYNUM_NONE) { // we just transitioned into freefall - if ( pm->debugLevel ) + if (pm->debugLevel) { Com_Printf("%i:lift\n", c_pmove); } // if they aren't in a jumping animation and the ground is a ways away, force into it // if we didn't do the trace, the player would be backflipping down staircases - VectorCopy( pm->ps->origin, point ); + VectorCopy(pm->ps->origin, point); point[2] -= 64; - pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask, (EG2_Collision)0, 0); - if ( trace.fraction == 1.0 ) + pm->trace(&trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask, (EG2_Collision)0, 0); + if (trace.fraction == 1.0) {//FIXME: if velocity[2] < 0 and didn't jump, use some falling anim - if ( pm->ps->velocity[2] <= 0 && !(pm->ps->pm_flags&PMF_JUMP_HELD)) + if (pm->ps->velocity[2] <= 0 && !(pm->ps->pm_flags&PMF_JUMP_HELD)) { - if(!PM_InDeathAnim()) + if (!PM_InDeathAnim()) { // If we're a vehicle, set our falling flag. - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE) { // We're flying in the air. - if ( pm->gent->m_pVehicle->m_pVehicleInfo->type == VH_ANIMAL ) + if (pm->gent->m_pVehicle->m_pVehicleInfo->type == VH_ANIMAL) { pm->gent->m_pVehicle->m_ulFlags |= VEH_FLYING; } @@ -5009,31 +5034,31 @@ static void PM_GroundTraceMissed( void ) { vec3_t moveDir, lookAngles, lookDir, lookRight; int anim = BOTH_INAIR1; - VectorCopy( pm->ps->velocity, moveDir ); + VectorCopy(pm->ps->velocity, moveDir); moveDir[2] = 0; - VectorNormalize( moveDir ); + VectorNormalize(moveDir); - VectorCopy( pm->ps->viewangles, lookAngles ); + VectorCopy(pm->ps->viewangles, lookAngles); lookAngles[PITCH] = lookAngles[ROLL] = 0; - AngleVectors( lookAngles, lookDir, lookRight, NULL ); + AngleVectors(lookAngles, lookDir, lookRight, NULL); - float dot = DotProduct( moveDir, lookDir ); - if ( dot > 0.5 ) + float dot = DotProduct(moveDir, lookDir); + if (dot > 0.5) {//redundant anim = BOTH_INAIR1; } - else if ( dot < -0.5 ) + else if (dot < -0.5) { anim = BOTH_INAIRBACK1; } else { - dot = DotProduct( moveDir, lookRight ); - if ( dot > 0.5 ) + dot = DotProduct(moveDir, lookRight); + if (dot > 0.5) { anim = BOTH_INAIRRIGHT1; } - else if ( dot < -0.5 ) + else if (dot < -0.5) { anim = BOTH_INAIRLEFT1; } @@ -5042,30 +5067,30 @@ static void PM_GroundTraceMissed( void ) { anim = BOTH_INAIR1; } } - if ( pm->ps->forcePowersActive & ( 1 << FP_LEVITATION ) ) + if (pm->ps->forcePowersActive & (1 << FP_LEVITATION)) { - anim = PM_ForceJumpAnimForJumpAnim( anim ); + anim = PM_ForceJumpAnimForJumpAnim(anim); } - PM_SetAnim( pm, SETANIM_LEGS, anim, SETANIM_FLAG_OVERRIDE, 100 ); // Only blend over 100ms + PM_SetAnim(pm, SETANIM_LEGS, anim, SETANIM_FLAG_OVERRIDE, 100); // Only blend over 100ms } } pm->ps->pm_flags &= ~PMF_BACKWARDS_JUMP; } - else if ( !(pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1 << FP_LEVITATION))) { - if ( pm->cmd.forwardmove >= 0 ) + if (pm->cmd.forwardmove >= 0) { - if(!PM_InDeathAnim()) + if (!PM_InDeathAnim()) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_JUMP1,SETANIM_FLAG_OVERRIDE, 100); // Only blend over 100ms + PM_SetAnim(pm, SETANIM_LEGS, BOTH_JUMP1, SETANIM_FLAG_OVERRIDE, 100); // Only blend over 100ms } pm->ps->pm_flags &= ~PMF_BACKWARDS_JUMP; - } - else if ( pm->cmd.forwardmove < 0 ) + } + else if (pm->cmd.forwardmove < 0) { - if(!PM_InDeathAnim()) + if (!PM_InDeathAnim()) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_JUMPBACK1,SETANIM_FLAG_OVERRIDE, 100); // Only blend over 100ms + PM_SetAnim(pm, SETANIM_LEGS, BOTH_JUMPBACK1, SETANIM_FLAG_OVERRIDE, 100); // Only blend over 100ms } pm->ps->pm_flags |= PMF_BACKWARDS_JUMP; } @@ -5074,10 +5099,10 @@ static void PM_GroundTraceMissed( void ) { else { // If we're a vehicle, set our falling flag. - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE) { // We're on the ground. - if ( pm->gent->m_pVehicle->m_pVehicleInfo->type == VH_ANIMAL ) + if (pm->gent->m_pVehicle->m_pVehicleInfo->type == VH_ANIMAL) { pm->gent->m_pVehicle->m_ulFlags &= ~VEH_FLYING; } @@ -5088,7 +5113,7 @@ static void PM_GroundTraceMissed( void ) { } } - if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + if (pm->ps->groundEntityNum != ENTITYNUM_NONE) { pm->ps->jumpZStart = pm->ps->origin[2]; } @@ -5104,15 +5129,15 @@ static void PM_GroundTraceMissed( void ) { PM_GroundTrace ============= */ -static void PM_GroundTrace( void ) { +static void PM_GroundTrace(void) { vec3_t point; trace_t trace; - if ( (pm->ps->eFlags&EF_LOCKED_TO_WEAPON) + if ((pm->ps->eFlags&EF_LOCKED_TO_WEAPON) || (pm->ps->eFlags&EF_HELD_BY_RANCOR) || (pm->ps->eFlags&EF_HELD_BY_WAMPA) || (pm->ps->eFlags&EF_HELD_BY_SAND_CREATURE) - || PM_RidingVehicle() ) + || PM_RidingVehicle()) { pml.groundPlane = qtrue; pml.walking = qtrue; @@ -5135,10 +5160,10 @@ static void PM_GroundTrace( void ) { */ return; } - else if ( pm->ps->legsAnimTimer > 300 - && (pm->ps->legsAnim == BOTH_WALL_RUN_RIGHT - || pm->ps->legsAnim == BOTH_WALL_RUN_LEFT - || pm->ps->legsAnim == BOTH_FORCEWALLRUNFLIP_START) ) + else if (pm->ps->legsAnimTimer > 300 + && (pm->ps->legsAnim == BOTH_WALL_RUN_RIGHT + || pm->ps->legsAnim == BOTH_WALL_RUN_LEFT + || pm->ps->legsAnim == BOTH_FORCEWALLRUNFLIP_START)) {//wall-running forces you to be in the air pml.groundPlane = qfalse; pml.walking = qfalse; @@ -5147,7 +5172,7 @@ static void PM_GroundTrace( void ) { } float minNormal = (float)MIN_WALK_NORMAL; - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE) {//FIXME: extern this as part of vehicle data minNormal = pm->gent->m_pVehicle->m_pVehicleInfo->maxSlope; } @@ -5156,17 +5181,17 @@ static void PM_GroundTrace( void ) { point[1] = pm->ps->origin[1]; point[2] = pm->ps->origin[2] - 0.25f; - pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask, (EG2_Collision)0, 0); + pm->trace(&trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask, (EG2_Collision)0, 0); pml.groundTrace = trace; // do something corrective if the trace starts in a solid... - if ( trace.allsolid ) { + if (trace.allsolid) { PM_CorrectAllSolid(); return; } // if the trace didn't hit anything, we are in free fall - if ( trace.fraction == 1.0 || g_gravity->value <= 0 ) + if (trace.fraction == 1.0 || g_gravity->value <= 0) { PM_GroundTraceMissed(); pml.groundPlane = qfalse; @@ -5174,43 +5199,43 @@ static void PM_GroundTrace( void ) { /* if ( pm->ps->vehicleIndex != VEHICLE_NONE ) { - PM_SetVehicleAngles( NULL ); + PM_SetVehicleAngles( NULL ); } */ return; } // Not a vehicle and not riding one. - if ( pm->gent - && pm->gent->client + if (pm->gent + && pm->gent->client && pm->gent->client->NPC_class != CLASS_SAND_CREATURE - && (pm->gent->client->NPC_class != CLASS_VEHICLE && !PM_RidingVehicle() ) ) + && (pm->gent->client->NPC_class != CLASS_VEHICLE && !PM_RidingVehicle())) { // check if getting thrown off the ground - if ( ((pm->ps->velocity[2]>0&&(pm->ps->pm_flags&PMF_TIME_KNOCKBACK))||pm->ps->velocity[2]>100) && DotProduct( pm->ps->velocity, trace.plane.normal ) > 10 ) + if (((pm->ps->velocity[2]>0 && (pm->ps->pm_flags&PMF_TIME_KNOCKBACK)) || pm->ps->velocity[2]>100) && DotProduct(pm->ps->velocity, trace.plane.normal) > 10) {//either thrown off ground (PMF_TIME_KNOCKBACK) or going off the ground at a large velocity - if ( pm->debugLevel ) { + if (pm->debugLevel) { Com_Printf("%i:kickoff\n", c_pmove); } // go into jump animation - if ( PM_FlippingAnim( pm->ps->legsAnim) ) + if (PM_FlippingAnim(pm->ps->legsAnim)) {//we're flipping } - else if ( PM_InSpecialJump( pm->ps->legsAnim ) ) + else if (PM_InSpecialJump(pm->ps->legsAnim)) {//special jumps } - else if ( PM_InKnockDown( pm->ps ) ) + else if (PM_InKnockDown(pm->ps)) {//in knockdown } - else if ( PM_InRoll( pm->ps ) ) + else if (PM_InRoll(pm->ps)) {//in knockdown } - else if ( PM_KickingAnim( pm->ps->legsAnim ) ) + else if (PM_KickingAnim(pm->ps->legsAnim)) {//in kick } - else if ( pm->gent - && pm->gent->client - && (pm->gent->client->NPC_class == CLASS_RANCOR || pm->gent->client->NPC_class == CLASS_WAMPA) ) + else if (pm->gent + && pm->gent->client + && (pm->gent->client->NPC_class == CLASS_RANCOR || pm->gent->client->NPC_class == CLASS_WAMPA)) { } else @@ -5224,17 +5249,17 @@ static void PM_GroundTrace( void ) { return; } } - + /* if ( pm->ps->vehicleIndex != VEHICLE_NONE ) { - PM_SetVehicleAngles( trace.plane.normal ); + PM_SetVehicleAngles( trace.plane.normal ); } */ // slopes that are too steep will not be considered onground - if ( trace.plane.normal[2] < minNormal ) { - if ( pm->debugLevel ) { + if (trace.plane.normal[2] < minNormal) { + if (pm->debugLevel) { Com_Printf("%i:steep\n", c_pmove); } // FIXME: if they can't slide down the slope, let them @@ -5256,24 +5281,24 @@ static void PM_GroundTrace( void ) { pm->ps->pm_time = 0; } - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) { + if (pm->ps->groundEntityNum == ENTITYNUM_NONE) { // just hit the ground - if ( pm->debugLevel ) { + if (pm->debugLevel) { Com_Printf("%i:Land\n", c_pmove); } - + //if ( !PM_ClientImpact( trace.entityNum, qtrue ) ) { PM_CrashLand(); // don't do landing time if we were just going down a slope - if ( pml.previous_velocity[2] < -200 ) { + if (pml.previous_velocity[2] < -200) { // don't allow another jump for a little while pm->ps->pm_flags |= PMF_TIME_LAND; pm->ps->pm_time = 250; } if (!pm->cmd.forwardmove && !pm->cmd.rightmove) { - if ( Flying != FLY_HOVER ) + if (Flying != FLY_HOVER) { pm->ps->velocity[2] = 0; //wouldn't normally want this because of slopes, but we aren't tyring to move... } @@ -5283,23 +5308,23 @@ static void PM_GroundTrace( void ) { pm->ps->groundEntityNum = trace.entityNum; pm->ps->lastOnGround = level.time; - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer())) {//if a player, clear the jumping "flag" so can't double-jump pm->ps->forceJumpCharge = 0; } // don't reset the z velocity for slopes -// pm->ps->velocity[2] = 0; + // pm->ps->velocity[2] = 0; - PM_AddTouchEnt( trace.entityNum ); + PM_AddTouchEnt(trace.entityNum); } int LastMatrixJumpTime = 0; #define DEBUGMATRIXJUMP 0 -void PM_HoverTrace( void ) +void PM_HoverTrace(void) { - if ( !pm->gent || !pm->gent->client || pm->gent->client->NPC_class != CLASS_VEHICLE ) + if (!pm->gent || !pm->gent->client || pm->gent->client->NPC_class != CLASS_VEHICLE) { return; } @@ -5312,35 +5337,35 @@ void PM_HoverTrace( void ) pml.groundPlane = qfalse; - float relativeWaterLevel = (pm->ps->waterheight - (pm->ps->origin[2]+pm->mins[2])); - if ( pm->waterlevel && relativeWaterLevel >= 0 ) + float relativeWaterLevel = (pm->ps->waterheight - (pm->ps->origin[2] + pm->mins[2])); + if (pm->waterlevel && relativeWaterLevel >= 0) {//in water - if ( pVeh->m_pVehicleInfo->bouyancy <= 0.0f ) + if (pVeh->m_pVehicleInfo->bouyancy <= 0.0f) {//sink like a rock } else {//rise up - float floatHeight = (pVeh->m_pVehicleInfo->bouyancy * ((pm->maxs[2]-pm->mins[2])*0.5f)) - (hoverHeight*0.5f);//1.0f should make you float half-in, half-out of water - if ( relativeWaterLevel > floatHeight ) + float floatHeight = (pVeh->m_pVehicleInfo->bouyancy * ((pm->maxs[2] - pm->mins[2])*0.5f)) - (hoverHeight*0.5f);//1.0f should make you float half-in, half-out of water + if (relativeWaterLevel > floatHeight) {//too low, should rise up pm->ps->velocity[2] += (relativeWaterLevel - floatHeight) * pVeh->m_fTimeModifier; } } - if ( pm->ps->waterheight < pm->ps->origin[2]+pm->maxs[2] ) + if (pm->ps->waterheight < pm->ps->origin[2] + pm->maxs[2]) {//part of us is sticking out of water - if ( fabs(pm->ps->velocity[0]) + fabs(pm->ps->velocity[1]) > 100 ) + if (fabs(pm->ps->velocity[0]) + fabs(pm->ps->velocity[1]) > 100) {//moving at a decent speed - if ( Q_irand( pml.frametime, 100 ) >= 50 ) + if (Q_irand(pml.frametime, 100) >= 50) {//splash vAng[PITCH] = vAng[ROLL] = 0; vAng[YAW] = pVeh->m_vOrientation[YAW]; - AngleVectors( vAng, fxAxis[2], fxAxis[1], fxAxis[0] ); + AngleVectors(vAng, fxAxis[2], fxAxis[1], fxAxis[0]); vec3_t wakeOrg; - VectorCopy( pm->ps->origin, wakeOrg ); + VectorCopy(pm->ps->origin, wakeOrg); wakeOrg[2] = pm->ps->waterheight; - if ( pVeh->m_pVehicleInfo->iWakeFX ) + if (pVeh->m_pVehicleInfo->iWakeFX) { - G_PlayEffect( pVeh->m_pVehicleInfo->iWakeFX, wakeOrg, fxAxis ); + G_PlayEffect(pVeh->m_pVehicleInfo->iWakeFX, wakeOrg, fxAxis); } } } @@ -5361,49 +5386,49 @@ void PM_HoverTrace( void ) //NOTE: if bouyancy is 2.0f or higher, you float over water like it's solid ground. // if it's 1.0f, you sink halfway into water. If it's 0, you sink... - if ( pVeh->m_pVehicleInfo->bouyancy >= 2.0f ) + if (pVeh->m_pVehicleInfo->bouyancy >= 2.0f) {//sit on water - traceContents |= (CONTENTS_WATER|CONTENTS_SLIME|CONTENTS_LAVA); + traceContents |= (CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA); } - pm->trace( trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, traceContents, (EG2_Collision)0, 0 ); - if ( trace->plane.normal[2] >= minNormal ) + pm->trace(trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, traceContents, (EG2_Collision)0, 0); + if (trace->plane.normal[2] >= minNormal) {//not a steep slope, so push us up - if ( trace->fraction < 0.3f ) + if (trace->fraction < 0.3f) {//push up off ground - float hoverForce = pVeh->m_pVehicleInfo->hoverStrength; - pm->ps->velocity[2] += (0.3f-trace->fraction)*hoverForce*pVeh->m_fTimeModifier; + float hoverForce = pVeh->m_pVehicleInfo->hoverStrength; + pm->ps->velocity[2] += (0.3f - trace->fraction)*hoverForce*pVeh->m_fTimeModifier; - // if (pm->ps->velocity[2]>60.0f) - // { - // pm->ps->velocity[2] = 60.0f; - // } + // if (pm->ps->velocity[2]>60.0f) + // { + // pm->ps->velocity[2] = 60.0f; + // } - if ( (trace->contents&(CONTENTS_WATER|CONTENTS_SLIME|CONTENTS_LAVA)) ) + if ((trace->contents&(CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA))) {//hovering on water, make a spash if moving - if ( fabs(pm->ps->velocity[0]) + fabs(pm->ps->velocity[1]) > 100 ) + if (fabs(pm->ps->velocity[0]) + fabs(pm->ps->velocity[1]) > 100) {//moving at a decent speed - if ( Q_irand( pml.frametime, 100 ) >= 50 ) + if (Q_irand(pml.frametime, 100) >= 50) {//splash vAng[PITCH] = vAng[ROLL] = 0; vAng[YAW] = pVeh->m_vOrientation[YAW]; - AngleVectors( vAng, fxAxis[2], fxAxis[1], fxAxis[0] ); - if ( pVeh->m_pVehicleInfo->iWakeFX ) + AngleVectors(vAng, fxAxis[2], fxAxis[1], fxAxis[0]); + if (pVeh->m_pVehicleInfo->iWakeFX) { - G_PlayEffect( pVeh->m_pVehicleInfo->iWakeFX, trace->endpos, fxAxis ); + G_PlayEffect(pVeh->m_pVehicleInfo->iWakeFX, trace->endpos, fxAxis); } } } } - + if (pVeh->m_ulFlags & VEH_SLIDEBREAKING) { - if ( Q_irand( pml.frametime, 100 ) >= 50 ) + if (Q_irand(pml.frametime, 100) >= 50) {//dust VectorClear(fxAxis[0]); - fxAxis[0][2] = 1; + fxAxis[0][2] = 1; VectorCopy(pm->ps->velocity, fxAxis[1]); - fxAxis[1][2] *= 0.01f; + fxAxis[1][2] *= 0.01f; VectorMA(pm->ps->origin, 0.25f, fxAxis[1], point); G_PlayEffect("ships/swoop_dust", point, fxAxis[0]); } @@ -5412,25 +5437,25 @@ void PM_HoverTrace( void ) } } } - if ( pml.groundPlane ) + if (pml.groundPlane) { - PM_SetVehicleAngles( pml.groundTrace.plane.normal ); + PM_SetVehicleAngles(pml.groundTrace.plane.normal); // We're on the ground. -// if (pVeh->m_ulFlags&VEH_FLYING && level.timem_iTurboTime) -// { -// pVeh->m_iTurboTime = 0; // stop turbo -// } + // if (pVeh->m_ulFlags&VEH_FLYING && level.timem_iTurboTime) + // { + // pVeh->m_iTurboTime = 0; // stop turbo + // } pVeh->m_ulFlags &= ~VEH_FLYING; pVeh->m_vAngularVelocity = 0.0f; } else { - PM_SetVehicleAngles( NULL ); + PM_SetVehicleAngles(NULL); // We're flying in the air. pVeh->m_ulFlags |= VEH_FLYING; //groundTrace - if (pVeh->m_vAngularVelocity==0.0f) + if (pVeh->m_vAngularVelocity == 0.0f) { pVeh->m_vAngularVelocity = pVeh->m_vOrientation[YAW] - pVeh->m_vPrevOrientation[YAW]; if (pVeh->m_vAngularVelocity<-15.0f) @@ -5439,45 +5464,45 @@ void PM_HoverTrace( void ) } if (pVeh->m_vAngularVelocity> 15.0f) { - pVeh->m_vAngularVelocity = 15.0f; + pVeh->m_vAngularVelocity = 15.0f; } // BEGIN MATRIX MODE INIT FOR JUMP //================================= - if (pm->gent && - pm->gent->owner && - (pm->gent->owner->s.numbergent->owner)) && - pVeh->m_pVehicleInfo->type==VH_SPEEDER && - level.time>(LastMatrixJumpTime+5000) && VectorLength(pm->ps->velocity)>30.0f) - { - LastMatrixJumpTime = level.time; - vec3_t predictedApx; + if (pm->gent && + pm->gent->owner && + (pm->gent->owner->s.numbergent->owner)) && + pVeh->m_pVehicleInfo->type == VH_SPEEDER && + level.time>(LastMatrixJumpTime + 5000) && VectorLength(pm->ps->velocity)>30.0f) + { + LastMatrixJumpTime = level.time; + vec3_t predictedApx; vec3_t predictedFallVelocity; vec3_t predictedLandPosition; - VectorScale(pm->ps->velocity, 2.0f, predictedFallVelocity); // take friction into account - predictedFallVelocity[2] = -(pm->ps->gravity * 1.1f); // take gravity into account + VectorScale(pm->ps->velocity, 2.0f, predictedFallVelocity); // take friction into account + predictedFallVelocity[2] = -(pm->ps->gravity * 1.1f); // take gravity into account - VectorMA(pm->ps->origin, 0.25f, pm->ps->velocity, predictedApx); - VectorMA(predictedApx, 0.25f, predictedFallVelocity, predictedLandPosition); + VectorMA(pm->ps->origin, 0.25f, pm->ps->velocity, predictedApx); + VectorMA(predictedApx, 0.25f, predictedFallVelocity, predictedLandPosition); trace_t trace2; - gi.trace( &trace2, predictedApx, pm->mins, pm->maxs, predictedLandPosition, pm->ps->clientNum, traceContents, (EG2_Collision)0, 0); - if (!trace2.startsolid && !trace2.allsolid && trace2.fraction>0.75 && Q_irand(0, 3)==0) + gi.trace(&trace2, predictedApx, pm->mins, pm->maxs, predictedLandPosition, pm->ps->clientNum, traceContents, (EG2_Collision)0, 0); + if (!trace2.startsolid && !trace2.allsolid && trace2.fraction>0.75 && Q_irand(0, 3) == 0) { LastMatrixJumpTime += 20000; - G_StartMatrixEffect(pm->gent, MEF_HIT_GROUND_STOP); -// CG_DrawEdge(pm->ps->origin, predictedApx, EDGE_WHITE_TWOSECOND); -// CG_DrawEdge(predictedApx, predictedLandPosition, EDGE_WHITE_TWOSECOND); + G_StartMatrixEffect(pm->gent, MEF_HIT_GROUND_STOP); + // CG_DrawEdge(pm->ps->origin, predictedApx, EDGE_WHITE_TWOSECOND); + // CG_DrawEdge(predictedApx, predictedLandPosition, EDGE_WHITE_TWOSECOND); } -// else -// { -// CG_DrawEdge(pm->ps->origin, predictedApx, EDGE_RED_TWOSECOND); -// CG_DrawEdge(predictedApx, predictedLandPosition, EDGE_RED_TWOSECOND); -// } + // else + // { + // CG_DrawEdge(pm->ps->origin, predictedApx, EDGE_RED_TWOSECOND); + // CG_DrawEdge(predictedApx, predictedLandPosition, EDGE_RED_TWOSECOND); + // } } //================================= } @@ -5491,7 +5516,7 @@ void PM_HoverTrace( void ) PM_SetWaterLevelAtPoint FIXME: avoid this twice? certainly if not moving ============= */ -static void PM_SetWaterLevelAtPoint( vec3_t org, int *waterlevel, int *watertype ) +static void PM_SetWaterLevelAtPoint(vec3_t org, int *waterlevel, int *watertype) { vec3_t point; int cont; @@ -5506,12 +5531,12 @@ static void PM_SetWaterLevelAtPoint( vec3_t org, int *waterlevel, int *watertype point[0] = org[0]; point[1] = org[1]; - point[2] = org[2] + DEFAULT_MINS_2 + 1; - if (gi.totalMapContents() & (MASK_WATER|CONTENTS_LADDER)) + point[2] = org[2] + DEFAULT_MINS_2 + 1; + if (gi.totalMapContents() & (MASK_WATER | CONTENTS_LADDER)) { - cont = pm->pointcontents( point, pm->ps->clientNum ); + cont = pm->pointcontents(point, pm->ps->clientNum); - if ( cont & (MASK_WATER|CONTENTS_LADDER) ) + if (cont & (MASK_WATER | CONTENTS_LADDER)) { sample2 = pm->ps->viewheight - DEFAULT_MINS_2; sample1 = sample2 / 2; @@ -5519,13 +5544,13 @@ static void PM_SetWaterLevelAtPoint( vec3_t org, int *waterlevel, int *watertype *watertype = cont; *waterlevel = 1; point[2] = org[2] + DEFAULT_MINS_2 + sample1; - cont = pm->pointcontents( point, pm->ps->clientNum ); - if ( cont & (MASK_WATER|CONTENTS_LADDER) ) + cont = pm->pointcontents(point, pm->ps->clientNum); + if (cont & (MASK_WATER | CONTENTS_LADDER)) { *waterlevel = 2; point[2] = org[2] + DEFAULT_MINS_2 + sample2; - cont = pm->pointcontents( point, pm->ps->clientNum ); - if ( cont & (MASK_WATER|CONTENTS_LADDER) ) + cont = pm->pointcontents(point, pm->ps->clientNum); + if (cont & (MASK_WATER | CONTENTS_LADDER)) { *waterlevel = 3; } @@ -5534,10 +5559,10 @@ static void PM_SetWaterLevelAtPoint( vec3_t org, int *waterlevel, int *watertype } } -void PM_SetWaterHeight( void ) +void PM_SetWaterHeight(void) { pm->ps->waterHeightLevel = WHL_NONE; - if ( pm->waterlevel < 1 ) + if (pm->waterlevel < 1) { pm->ps->waterheight = pm->ps->origin[2] + DEFAULT_MINS_2 - 4; return; @@ -5545,22 +5570,22 @@ void PM_SetWaterHeight( void ) trace_t trace; vec3_t top, bottom; - VectorCopy( pm->ps->origin, top ); - VectorCopy( pm->ps->origin, bottom ); + VectorCopy(pm->ps->origin, top); + VectorCopy(pm->ps->origin, bottom); top[2] += pm->gent->client->standheight; bottom[2] += DEFAULT_MINS_2; - gi.trace( &trace, top, pm->mins, pm->maxs, bottom, pm->ps->clientNum, MASK_WATER, (EG2_Collision)0, 0 ); + gi.trace(&trace, top, pm->mins, pm->maxs, bottom, pm->ps->clientNum, MASK_WATER, (EG2_Collision)0, 0); - if ( trace.startsolid ) + if (trace.startsolid) {//under water pm->ps->waterheight = top[2] + 4; } - else if ( trace.fraction < 1.0f ) + else if (trace.fraction < 1.0f) {//partially in and partially out of water - pm->ps->waterheight = trace.endpos[2]+pm->mins[2]; + pm->ps->waterheight = trace.endpos[2] + pm->mins[2]; } - else if ( trace.contents&MASK_WATER ) + else if (trace.contents&MASK_WATER) {//water is above me pm->ps->waterheight = top[2] + 4; } @@ -5568,40 +5593,40 @@ void PM_SetWaterHeight( void ) {//water is below me pm->ps->waterheight = bottom[2] - 4; } - float distFromEyes = (pm->ps->origin[2]+pm->gent->client->standheight)-pm->ps->waterheight; + float distFromEyes = (pm->ps->origin[2] + pm->gent->client->standheight) - pm->ps->waterheight; - if ( distFromEyes < 0 ) + if (distFromEyes < 0) { pm->ps->waterHeightLevel = WHL_UNDER; } - else if ( distFromEyes < 6 ) + else if (distFromEyes < 6) { pm->ps->waterHeightLevel = WHL_HEAD; } - else if ( distFromEyes < 18 ) + else if (distFromEyes < 18) { pm->ps->waterHeightLevel = WHL_SHOULDERS; } - else if ( distFromEyes < pm->gent->client->standheight-8 ) + else if (distFromEyes < pm->gent->client->standheight - 8) {//at least 8 above origin pm->ps->waterHeightLevel = WHL_TORSO; } - else + else { - float distFromOrg = pm->ps->origin[2]-pm->ps->waterheight; - if ( distFromOrg < 6 ) + float distFromOrg = pm->ps->origin[2] - pm->ps->waterheight; + if (distFromOrg < 6) { pm->ps->waterHeightLevel = WHL_WAIST; } - else if ( distFromOrg < 16 ) + else if (distFromOrg < 16) { pm->ps->waterHeightLevel = WHL_KNEES; } - else if ( distFromOrg > fabs(pm->mins[2]) ) + else if (distFromOrg > fabs(pm->mins[2])) { pm->ps->waterHeightLevel = WHL_NONE; } - else + else { pm->ps->waterHeightLevel = WHL_ANKLES; } @@ -5616,21 +5641,21 @@ PM_SetBounds Sets mins, maxs ============== */ -static void PM_SetBounds (void) +static void PM_SetBounds(void) { - if ( pm->gent && pm->gent->client ) + if (pm->gent && pm->gent->client) { - if ( !pm->gent->mins[0] || !pm->gent->mins[1] || !pm->gent->mins[2] || !pm->gent->maxs[0] || !pm->gent->maxs[1] || !pm->gent->maxs[2] ) + if (!pm->gent->mins[0] || !pm->gent->mins[1] || !pm->gent->mins[2] || !pm->gent->maxs[0] || !pm->gent->maxs[1] || !pm->gent->maxs[2]) { //assert(0); } - VectorCopy( pm->gent->mins, pm->mins ); - VectorCopy( pm->gent->maxs, pm->maxs ); + VectorCopy(pm->gent->mins, pm->mins); + VectorCopy(pm->gent->maxs, pm->maxs); } else { - if ( !DEFAULT_MINS_0 || !DEFAULT_MINS_1 || !DEFAULT_MAXS_0 || !DEFAULT_MAXS_1 || !DEFAULT_MINS_2 || !DEFAULT_MAXS_2 ) + if (!DEFAULT_MINS_0 || !DEFAULT_MINS_1 || !DEFAULT_MAXS_0 || !DEFAULT_MAXS_1 || !DEFAULT_MINS_2 || !DEFAULT_MAXS_2) { assert(0); } @@ -5653,23 +5678,23 @@ PM_CheckDuck Sets mins, maxs, and pm->ps->viewheight ============== */ -static void PM_CheckDuck (void) +static void PM_CheckDuck(void) { trace_t trace; int standheight; int crouchheight; int oldHeight; - if ( pm->gent && pm->gent->client ) + if (pm->gent && pm->gent->client) { - if ( !pm->gent->mins[0] || !pm->gent->mins[1] || !pm->gent->mins[2] || !pm->gent->maxs[0] || !pm->gent->maxs[1] || !pm->gent->maxs[2] ) + if (!pm->gent->mins[0] || !pm->gent->mins[1] || !pm->gent->mins[2] || !pm->gent->maxs[0] || !pm->gent->maxs[1] || !pm->gent->maxs[2]) { //assert(0); } - if ( pm->ps->clientNum < MAX_CLIENTS - && (pm->gent->client->NPC_class == CLASS_ATST ||pm->gent->client->NPC_class == CLASS_RANCOR) - && !cg.renderingThirdPerson ) + if (pm->ps->clientNum < MAX_CLIENTS + && (pm->gent->client->NPC_class == CLASS_ATST || pm->gent->client->NPC_class == CLASS_RANCOR) + && !cg.renderingThirdPerson) { standheight = crouchheight = 128; } @@ -5681,7 +5706,7 @@ static void PM_CheckDuck (void) } else { - if ( !DEFAULT_MINS_0 || !DEFAULT_MINS_1 || !DEFAULT_MAXS_0 || !DEFAULT_MAXS_1 || !DEFAULT_MINS_2 || !DEFAULT_MAXS_2 ) + if (!DEFAULT_MINS_0 || !DEFAULT_MINS_1 || !DEFAULT_MAXS_0 || !DEFAULT_MAXS_1 || !DEFAULT_MINS_2 || !DEFAULT_MAXS_2) { assert(0); } @@ -5690,7 +5715,7 @@ static void PM_CheckDuck (void) crouchheight = CROUCH_MAXS_2; } - if ( PM_RidingVehicle() || (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE) ) + if (PM_RidingVehicle() || (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE)) {//riding a vehicle or are a vehicle //no ducking or rolling when on a vehicle //right? not even on ones that you just ride on top of? @@ -5698,15 +5723,15 @@ static void PM_CheckDuck (void) pm->maxs[2] = standheight; //FIXME: have a crouchviewheight and standviewheight on ent? pm->ps->viewheight = standheight + STANDARD_VIEWHEIGHT_OFFSET;//DEFAULT_VIEWHEIGHT; - //NOTE: we don't clear the pm->cmd.upmove here because + //NOTE: we don't clear the pm->cmd.upmove here because //the vehicle code may need it later... but, for riders, //it should have already been copied over to the vehicle, right? return; } - if ( PM_InGetUp( pm->ps ) ) + if (PM_InGetUp(pm->ps)) {//can't do any kind of crouching when getting up - if ( pm->ps->legsAnim == BOTH_GETUP_CROUCH_B1 || pm->ps->legsAnim == BOTH_GETUP_CROUCH_F1 ) + if (pm->ps->legsAnim == BOTH_GETUP_CROUCH_B1 || pm->ps->legsAnim == BOTH_GETUP_CROUCH_F1) {//crouched still pm->ps->pm_flags |= PMF_DUCKED; pm->maxs[2] = crouchheight; @@ -5717,16 +5742,16 @@ static void PM_CheckDuck (void) oldHeight = pm->maxs[2]; - if ( PM_InRoll( pm->ps ) ) + if (PM_InRoll(pm->ps)) { /* if ( pm->ps->clientNum && pm->gent && pm->gent->client ) { - pm->maxs[2] = pm->gent->client->renderInfo.eyePoint[2]-pm->ps->origin[2] + 4; - if ( crouchheight > pm->maxs[2] ) - { - pm->maxs[2] = crouchheight; - } + pm->maxs[2] = pm->gent->client->renderInfo.eyePoint[2]-pm->ps->origin[2] + 4; + if ( crouchheight > pm->maxs[2] ) + { + pm->maxs[2] = crouchheight; + } } else */ @@ -5737,14 +5762,14 @@ static void PM_CheckDuck (void) pm->ps->pm_flags |= PMF_DUCKED; return; } - if ( PM_GettingUpFromKnockDown( standheight, crouchheight ) ) + if (PM_GettingUpFromKnockDown(standheight, crouchheight)) { pm->ps->viewheight = crouchheight + STANDARD_VIEWHEIGHT_OFFSET; return; } - if ( PM_InKnockDown( pm->ps ) ) + if (PM_InKnockDown(pm->ps)) {//forced crouch - if ( pm->gent && pm->gent->client ) + if (pm->gent && pm->gent->client) {//interrupted any potential delayed weapon fires pm->gent->client->fireDelay = 0; } @@ -5753,42 +5778,42 @@ static void PM_CheckDuck (void) pm->ps->pm_flags |= PMF_DUCKED; return; } - if ( pm->cmd.upmove < 0 ) + if (pm->cmd.upmove < 0) { // trying to duck pm->maxs[2] = crouchheight; pm->ps->viewheight = crouchheight + STANDARD_VIEWHEIGHT_OFFSET;//CROUCH_VIEWHEIGHT; - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE && !PM_SwimmingAnim( pm->ps->legsAnim ) ) + if (pm->ps->groundEntityNum == ENTITYNUM_NONE && !PM_SwimmingAnim(pm->ps->legsAnim)) {//Not ducked already and trying to duck in mid-air //will raise your feet, unducking whilst in air will drop feet - if ( !(pm->ps->pm_flags&PMF_DUCKED) ) + if (!(pm->ps->pm_flags&PMF_DUCKED)) { pm->ps->eFlags ^= EF_TELEPORT_BIT; } - if ( pm->gent ) + if (pm->gent) { pm->ps->origin[2] += oldHeight - pm->maxs[2];//diff will be zero if were already ducking //Don't worry, we know we fit in a smaller size } } pm->ps->pm_flags |= PMF_DUCKED; - if ( d_JediAI->integer ) + if (d_JediAI->integer) { - if ( pm->ps->clientNum && pm->ps->weapon == WP_SABER ) + if (pm->ps->clientNum && pm->ps->weapon == WP_SABER) { - Com_Printf( "ducking\n" ); + Com_Printf("ducking\n"); } } } else { // want to stop ducking, stand up if possible - if ( pm->ps->pm_flags & PMF_DUCKED ) + if (pm->ps->pm_flags & PMF_DUCKED) {//Was ducking - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) + if (pm->ps->groundEntityNum == ENTITYNUM_NONE) {//unducking whilst in air will try to drop feet pm->maxs[2] = standheight; pm->ps->origin[2] += oldHeight - pm->maxs[2]; - pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, pm->ps->origin, pm->ps->clientNum, pm->tracemask, (EG2_Collision)0, 0 ); - if ( !trace.allsolid ) + pm->trace(&trace, pm->ps->origin, pm->mins, pm->maxs, pm->ps->origin, pm->ps->clientNum, pm->tracemask, (EG2_Collision)0, 0); + if (!trace.allsolid) { pm->ps->eFlags ^= EF_TELEPORT_BIT; pm->ps->pm_flags &= ~PMF_DUCKED; @@ -5805,15 +5830,15 @@ static void PM_CheckDuck (void) { // try to stand up pm->maxs[2] = standheight; - pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, pm->ps->origin, pm->ps->clientNum, pm->tracemask, (EG2_Collision)0, 0 ); - if ( !trace.allsolid ) + pm->trace(&trace, pm->ps->origin, pm->mins, pm->maxs, pm->ps->origin, pm->ps->clientNum, pm->tracemask, (EG2_Collision)0, 0); + if (!trace.allsolid) { pm->ps->pm_flags &= ~PMF_DUCKED; } } } - if ( pm->ps->pm_flags & PMF_DUCKED ) + if (pm->ps->pm_flags & PMF_DUCKED) {//Still ducking pm->maxs[2] = crouchheight; pm->ps->viewheight = crouchheight + STANDARD_VIEWHEIGHT_OFFSET;//CROUCH_VIEWHEIGHT; @@ -5830,9 +5855,9 @@ static void PM_CheckDuck (void) //=================================================================== -qboolean PM_SaberLockAnim( int anim ) +qboolean PM_SaberLockAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_BF2LOCK: //# case BOTH_BF1LOCK: //# @@ -5843,9 +5868,9 @@ qboolean PM_SaberLockAnim( int anim ) return qfalse; } -qboolean PM_ForceAnim( int anim ) +qboolean PM_ForceAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_CHOKE1: //being choked...??? case BOTH_GESTURE1: //taunting... @@ -5864,7 +5889,7 @@ qboolean PM_ForceAnim( int anim ) case BOTH_FORCEGRIP1: //# temp force-grip anim (actually re-using push) case BOTH_FORCEGRIP_HOLD: //# temp force-grip anim (actually re-using push) case BOTH_FORCEGRIP_RELEASE: //# temp force-grip anim (actually re-using push) - //case BOTH_FORCEGRIP3: //# force-gripping + //case BOTH_FORCEGRIP3: //# force-gripping case BOTH_FORCE_RAGE: case BOTH_FORCE_2HANDEDLIGHTNING: case BOTH_FORCE_2HANDEDLIGHTNING_START: @@ -5885,18 +5910,18 @@ qboolean PM_ForceAnim( int anim ) return qfalse; } -qboolean PM_InSaberAnim( int anim ) +qboolean PM_InSaberAnim(int anim) { - if ( anim >= BOTH_A1_T__B_ && anim <= BOTH_H1_S1_BR ) + if (anim >= BOTH_A1_T__B_ && anim <= BOTH_H1_S1_BR) { return qtrue; } return qfalse; } -qboolean PM_InForceGetUp( playerState_t *ps ) +qboolean PM_InForceGetUp(playerState_t *ps) { - switch ( ps->legsAnim ) + switch (ps->legsAnim) { case BOTH_FORCE_GETUP_F1: case BOTH_FORCE_GETUP_F2: @@ -5914,7 +5939,7 @@ qboolean PM_InForceGetUp( playerState_t *ps ) case BOTH_GETUP_FROLL_F: case BOTH_GETUP_FROLL_L: case BOTH_GETUP_FROLL_R: - if ( ps->legsAnimTimer ) + if (ps->legsAnimTimer) { return qtrue; } @@ -5923,9 +5948,9 @@ qboolean PM_InForceGetUp( playerState_t *ps ) return qfalse; } -qboolean PM_InGetUp( playerState_t *ps ) +qboolean PM_InGetUp(playerState_t *ps) { - switch ( ps->legsAnim ) + switch (ps->legsAnim) { case BOTH_GETUP1: case BOTH_GETUP2: @@ -5942,22 +5967,22 @@ qboolean PM_InGetUp( playerState_t *ps ) case BOTH_GETUP_FROLL_F: case BOTH_GETUP_FROLL_L: case BOTH_GETUP_FROLL_R: - if ( ps->legsAnimTimer ) + if (ps->legsAnimTimer) { return qtrue; } break; default: - return PM_InForceGetUp( ps ); + return PM_InForceGetUp(ps); break; } //what the hell, redundant, but... return qfalse; } -qboolean PM_InGetUpNoRoll( playerState_t *ps ) +qboolean PM_InGetUpNoRoll(playerState_t *ps) { - switch ( ps->legsAnim ) + switch (ps->legsAnim) { case BOTH_GETUP1: case BOTH_GETUP2: @@ -5974,7 +5999,7 @@ qboolean PM_InGetUpNoRoll( playerState_t *ps ) case BOTH_FORCE_GETUP_B4: case BOTH_FORCE_GETUP_B5: case BOTH_FORCE_GETUP_B6: - if ( ps->legsAnimTimer ) + if (ps->legsAnimTimer) { return qtrue; } @@ -5983,74 +6008,74 @@ qboolean PM_InGetUpNoRoll( playerState_t *ps ) return qfalse; } -qboolean PM_InKnockDown( playerState_t *ps ) +qboolean PM_InKnockDown(playerState_t *ps) { - switch ( ps->legsAnim ) + switch (ps->legsAnim) { case BOTH_KNOCKDOWN1: case BOTH_KNOCKDOWN2: case BOTH_KNOCKDOWN3: case BOTH_KNOCKDOWN4: case BOTH_KNOCKDOWN5: - //special anims: + //special anims: case BOTH_RELEASED: return qtrue; break; case BOTH_LK_DL_ST_T_SB_1_L: - if ( ps->legsAnimTimer < 550 ) + if (ps->legsAnimTimer < 550) { return qtrue; } break; case BOTH_PLAYER_PA_3_FLY: - if ( ps->legsAnimTimer < 300 ) + if (ps->legsAnimTimer < 300) { return qtrue; } /* - else if ( ps->clientNum < MAX_CLIENTS - && ps->legsAnimTimer < 300 + PLAYER_KNOCKDOWN_HOLD_EXTRA_TIME ) + else if ( ps->clientNum < MAX_CLIENTS + && ps->legsAnimTimer < 300 + PLAYER_KNOCKDOWN_HOLD_EXTRA_TIME ) { - return qtrue; + return qtrue; } */ break; default: - return PM_InGetUp( ps ); + return PM_InGetUp(ps); break; } return qfalse; } -qboolean PM_InKnockDownNoGetup( playerState_t *ps ) +qboolean PM_InKnockDownNoGetup(playerState_t *ps) { - switch ( ps->legsAnim ) + switch (ps->legsAnim) { case BOTH_KNOCKDOWN1: case BOTH_KNOCKDOWN2: case BOTH_KNOCKDOWN3: case BOTH_KNOCKDOWN4: case BOTH_KNOCKDOWN5: - //special anims: + //special anims: case BOTH_RELEASED: return qtrue; break; case BOTH_LK_DL_ST_T_SB_1_L: - if ( ps->legsAnimTimer < 550 ) + if (ps->legsAnimTimer < 550) { return qtrue; } break; case BOTH_PLAYER_PA_3_FLY: - if ( ps->legsAnimTimer < 300 ) + if (ps->legsAnimTimer < 300) { return qtrue; } /* - else if ( ps->clientNum < MAX_CLIENTS - && ps->legsAnimTimer < 300 + PLAYER_KNOCKDOWN_HOLD_EXTRA_TIME ) + else if ( ps->clientNum < MAX_CLIENTS + && ps->legsAnimTimer < 300 + PLAYER_KNOCKDOWN_HOLD_EXTRA_TIME ) { - return qtrue; + return qtrue; } */ break; @@ -6058,9 +6083,9 @@ qboolean PM_InKnockDownNoGetup( playerState_t *ps ) return qfalse; } -qboolean PM_InKnockDownOnGround( playerState_t *ps ) +qboolean PM_InKnockDownOnGround(playerState_t *ps) { - switch ( ps->legsAnim ) + switch (ps->legsAnim) { case BOTH_KNOCKDOWN1: case BOTH_KNOCKDOWN2: @@ -6069,9 +6094,9 @@ qboolean PM_InKnockDownOnGround( playerState_t *ps ) case BOTH_KNOCKDOWN5: case BOTH_RELEASED: //if ( PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)ps->legsAnim ) - ps->legsAnimTimer > 300 ) - {//at end of fall down anim - return qtrue; - } + {//at end of fall down anim + return qtrue; + } break; case BOTH_GETUP1: case BOTH_GETUP2: @@ -6088,7 +6113,7 @@ qboolean PM_InKnockDownOnGround( playerState_t *ps ) case BOTH_FORCE_GETUP_B4: case BOTH_FORCE_GETUP_B5: case BOTH_FORCE_GETUP_B6: - if ( PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)ps->legsAnim ) - ps->legsAnimTimer < 500 ) + if (PM_AnimLength(g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)ps->legsAnim) - ps->legsAnimTimer < 500) {//at beginning of getup anim return qtrue; } @@ -6101,27 +6126,27 @@ qboolean PM_InKnockDownOnGround( playerState_t *ps ) case BOTH_GETUP_FROLL_F: case BOTH_GETUP_FROLL_L: case BOTH_GETUP_FROLL_R: - if ( PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)ps->legsAnim ) - ps->legsAnimTimer < 500 ) + if (PM_AnimLength(g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)ps->legsAnim) - ps->legsAnimTimer < 500) {//at beginning of getup anim return qtrue; } break; case BOTH_LK_DL_ST_T_SB_1_L: - if ( ps->legsAnimTimer < 1000 ) + if (ps->legsAnimTimer < 1000) { return qtrue; } break; case BOTH_PLAYER_PA_3_FLY: - if ( ps->legsAnimTimer < 300 ) + if (ps->legsAnimTimer < 300) { return qtrue; } /* - else if ( ps->clientNum < MAX_CLIENTS - && ps->legsAnimTimer < 300 + PLAYER_KNOCKDOWN_HOLD_EXTRA_TIME ) + else if ( ps->clientNum < MAX_CLIENTS + && ps->legsAnimTimer < 300 + PLAYER_KNOCKDOWN_HOLD_EXTRA_TIME ) { - return qtrue; + return qtrue; } */ break; @@ -6129,12 +6154,12 @@ qboolean PM_InKnockDownOnGround( playerState_t *ps ) return qfalse; } -qboolean PM_CrouchGetup( float crouchheight ) +qboolean PM_CrouchGetup(float crouchheight) { pm->maxs[2] = crouchheight; pm->ps->viewheight = crouchheight + STANDARD_VIEWHEIGHT_OFFSET; int anim = -1; - switch ( pm->ps->legsAnim ) + switch (pm->ps->legsAnim) { case BOTH_KNOCKDOWN1: case BOTH_KNOCKDOWN2: @@ -6149,56 +6174,56 @@ qboolean PM_CrouchGetup( float crouchheight ) anim = BOTH_GETUP_CROUCH_F1; break; } - if ( anim == -1 ) + if (anim == -1) {//WTF? stay down? pm->ps->legsAnimTimer = 100;//hold this anim for another 10th of a second return qfalse; } else {//get up into crouch anim - if ( PM_LockedAnim( pm->ps->torsoAnim ) ) + if (PM_LockedAnim(pm->ps->torsoAnim)) {//need to be able to override this anim pm->ps->torsoAnimTimer = 0; } - if ( PM_LockedAnim( pm->ps->legsAnim ) ) + if (PM_LockedAnim(pm->ps->legsAnim)) {//need to be able to override this anim pm->ps->legsAnimTimer = 0; } - PM_SetAnim( pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_HOLDLESS ); + PM_SetAnim(pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_HOLDLESS); pm->ps->saberMove = pm->ps->saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in pm->ps->saberBlocked = BLOCKED_NONE; return qtrue; } } -extern qboolean PM_GoingToAttackDown( playerState_t *ps ); -qboolean PM_CheckRollGetup( void ) +extern qboolean PM_GoingToAttackDown(playerState_t *ps); +qboolean PM_CheckRollGetup(void) { - if ( pm->ps->legsAnim == BOTH_KNOCKDOWN1 + if (pm->ps->legsAnim == BOTH_KNOCKDOWN1 || pm->ps->legsAnim == BOTH_KNOCKDOWN2 || pm->ps->legsAnim == BOTH_KNOCKDOWN3 || pm->ps->legsAnim == BOTH_KNOCKDOWN4 - || pm->ps->legsAnim == BOTH_KNOCKDOWN5 + || pm->ps->legsAnim == BOTH_KNOCKDOWN5 || pm->ps->legsAnim == BOTH_LK_DL_ST_T_SB_1_L || pm->ps->legsAnim == BOTH_PLAYER_PA_3_FLY - || pm->ps->legsAnim == BOTH_RELEASED ) + || pm->ps->legsAnim == BOTH_RELEASED) {//lying on back or front - if ( ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && ( pm->cmd.rightmove || (pm->cmd.forwardmove&&pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0) ) )//player pressing left or right - || ( (pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) && pm->gent->NPC//an NPC - && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0//have at least force jump 1 - && pm->gent->enemy //I have an enemy - && pm->gent->enemy->client//a client - && pm->gent->enemy->enemy == pm->gent//he's mad at me! - && (PM_GoingToAttackDown( &pm->gent->enemy->client->ps )||!Q_irand(0,2))//he's attacking downward! (or we just feel like doing it this time) - && ((pm->gent->client&&pm->gent->client->NPC_class==CLASS_ALORA)||Q_irand( 0, RANK_CAPTAIN )gent->NPC->rank) ) )//higher rank I am, more likely I am to roll away! + if (((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && (pm->cmd.rightmove || (pm->cmd.forwardmove&&pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0)))//player pressing left or right + || ((pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) && pm->gent->NPC//an NPC + && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0//have at least force jump 1 + && pm->gent->enemy //I have an enemy + && pm->gent->enemy->client//a client + && pm->gent->enemy->enemy == pm->gent//he's mad at me! + && (PM_GoingToAttackDown(&pm->gent->enemy->client->ps) || !Q_irand(0, 2))//he's attacking downward! (or we just feel like doing it this time) + && ((pm->gent->client&&pm->gent->client->NPC_class == CLASS_ALORA) || Q_irand(0, RANK_CAPTAIN)gent->NPC->rank)))//higher rank I am, more likely I am to roll away! {//roll away! int anim; qboolean forceGetUp = qfalse; - if ( pm->cmd.forwardmove > 0 ) + if (pm->cmd.forwardmove > 0) { - if ( pm->ps->legsAnim == BOTH_KNOCKDOWN3 - || pm->ps->legsAnim == BOTH_KNOCKDOWN5 - || pm->ps->legsAnim == BOTH_LK_DL_ST_T_SB_1_L ) + if (pm->ps->legsAnim == BOTH_KNOCKDOWN3 + || pm->ps->legsAnim == BOTH_KNOCKDOWN5 + || pm->ps->legsAnim == BOTH_LK_DL_ST_T_SB_1_L) { anim = BOTH_GETUP_FROLL_F; } @@ -6208,11 +6233,11 @@ qboolean PM_CheckRollGetup( void ) } forceGetUp = qtrue; } - else if ( pm->cmd.forwardmove < 0 ) + else if (pm->cmd.forwardmove < 0) { - if ( pm->ps->legsAnim == BOTH_KNOCKDOWN3 + if (pm->ps->legsAnim == BOTH_KNOCKDOWN3 || pm->ps->legsAnim == BOTH_KNOCKDOWN5 - || pm->ps->legsAnim == BOTH_LK_DL_ST_T_SB_1_L ) + || pm->ps->legsAnim == BOTH_LK_DL_ST_T_SB_1_L) { anim = BOTH_GETUP_FROLL_B; } @@ -6222,11 +6247,11 @@ qboolean PM_CheckRollGetup( void ) } forceGetUp = qtrue; } - else if ( pm->cmd.rightmove > 0 ) + else if (pm->cmd.rightmove > 0) { - if ( pm->ps->legsAnim == BOTH_KNOCKDOWN3 + if (pm->ps->legsAnim == BOTH_KNOCKDOWN3 || pm->ps->legsAnim == BOTH_KNOCKDOWN5 - || pm->ps->legsAnim == BOTH_LK_DL_ST_T_SB_1_L ) + || pm->ps->legsAnim == BOTH_LK_DL_ST_T_SB_1_L) { anim = BOTH_GETUP_FROLL_R; } @@ -6235,11 +6260,11 @@ qboolean PM_CheckRollGetup( void ) anim = BOTH_GETUP_BROLL_R; } } - else if ( pm->cmd.rightmove < 0 ) + else if (pm->cmd.rightmove < 0) { - if ( pm->ps->legsAnim == BOTH_KNOCKDOWN3 + if (pm->ps->legsAnim == BOTH_KNOCKDOWN3 || pm->ps->legsAnim == BOTH_KNOCKDOWN5 - || pm->ps->legsAnim == BOTH_LK_DL_ST_T_SB_1_L ) + || pm->ps->legsAnim == BOTH_LK_DL_ST_T_SB_1_L) { anim = BOTH_GETUP_FROLL_L; } @@ -6250,34 +6275,34 @@ qboolean PM_CheckRollGetup( void ) } else { - if ( pm->ps->legsAnim == BOTH_KNOCKDOWN3 + if (pm->ps->legsAnim == BOTH_KNOCKDOWN3 || pm->ps->legsAnim == BOTH_KNOCKDOWN5 - || pm->ps->legsAnim == BOTH_LK_DL_ST_T_SB_1_L ) + || pm->ps->legsAnim == BOTH_LK_DL_ST_T_SB_1_L) {//on your front - anim = Q_irand( BOTH_GETUP_FROLL_B, BOTH_GETUP_FROLL_R ); + anim = Q_irand(BOTH_GETUP_FROLL_B, BOTH_GETUP_FROLL_R); } else { - anim = Q_irand( BOTH_GETUP_BROLL_B, BOTH_GETUP_BROLL_R ); + anim = Q_irand(BOTH_GETUP_BROLL_B, BOTH_GETUP_BROLL_R); } } - if ( (pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) ) + if ((pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer())) { - if ( !G_CheckRollSafety( pm->gent, anim, 64 ) ) + if (!G_CheckRollSafety(pm->gent, anim, 64)) {//oops, try other one - if ( pm->ps->legsAnim == BOTH_KNOCKDOWN3 + if (pm->ps->legsAnim == BOTH_KNOCKDOWN3 || pm->ps->legsAnim == BOTH_KNOCKDOWN5 - || pm->ps->legsAnim == BOTH_LK_DL_ST_T_SB_1_L ) + || pm->ps->legsAnim == BOTH_LK_DL_ST_T_SB_1_L) { - if ( anim == BOTH_GETUP_FROLL_R ) + if (anim == BOTH_GETUP_FROLL_R) { anim = BOTH_GETUP_FROLL_L; } - else if ( anim == BOTH_GETUP_FROLL_F ) + else if (anim == BOTH_GETUP_FROLL_F) { anim = BOTH_GETUP_FROLL_B; } - else if ( anim == BOTH_GETUP_FROLL_B ) + else if (anim == BOTH_GETUP_FROLL_B) { anim = BOTH_GETUP_FROLL_F; } @@ -6285,22 +6310,22 @@ qboolean PM_CheckRollGetup( void ) { anim = BOTH_GETUP_FROLL_L; } - if ( !G_CheckRollSafety( pm->gent, anim, 64 ) ) + if (!G_CheckRollSafety(pm->gent, anim, 64)) {//neither side is clear, screw it return qfalse; } } else { - if ( anim == BOTH_GETUP_BROLL_R ) + if (anim == BOTH_GETUP_BROLL_R) { anim = BOTH_GETUP_BROLL_L; } - else if ( anim == BOTH_GETUP_BROLL_F ) + else if (anim == BOTH_GETUP_BROLL_F) { anim = BOTH_GETUP_BROLL_B; } - else if ( anim == BOTH_GETUP_FROLL_B ) + else if (anim == BOTH_GETUP_FROLL_B) { anim = BOTH_GETUP_BROLL_F; } @@ -6308,7 +6333,7 @@ qboolean PM_CheckRollGetup( void ) { anim = BOTH_GETUP_BROLL_L; } - if ( !G_CheckRollSafety( pm->gent, anim, 64 ) ) + if (!G_CheckRollSafety(pm->gent, anim, 64)) {//neither side is clear, screw it return qfalse; } @@ -6316,28 +6341,28 @@ qboolean PM_CheckRollGetup( void ) } } pm->cmd.rightmove = pm->cmd.forwardmove = 0; - if ( PM_LockedAnim( pm->ps->torsoAnim ) ) + if (PM_LockedAnim(pm->ps->torsoAnim)) {//need to be able to override this anim pm->ps->torsoAnimTimer = 0; } - if ( PM_LockedAnim( pm->ps->legsAnim ) ) + if (PM_LockedAnim(pm->ps->legsAnim)) {//need to be able to override this anim pm->ps->legsAnimTimer = 0; } - PM_SetAnim( pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_HOLDLESS ); + PM_SetAnim(pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_HOLDLESS); pm->ps->weaponTime = pm->ps->torsoAnimTimer - 300;//don't attack until near end of this anim pm->ps->saberMove = pm->ps->saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in pm->ps->saberBlocked = BLOCKED_NONE; - if ( forceGetUp ) + if (forceGetUp) { - if ( pm->gent && pm->gent->client && pm->gent->client->playerTeam == TEAM_ENEMY + if (pm->gent && pm->gent->client && pm->gent->client->playerTeam == TEAM_ENEMY && pm->gent->NPC && pm->gent->NPC->blockedSpeechDebounceTime < level.time - && !Q_irand( 0, 1 ) ) + && !Q_irand(0, 1)) { - PM_AddEvent( Q_irand( EV_COMBAT1, EV_COMBAT3 ) ); + PM_AddEvent(Q_irand(EV_COMBAT1, EV_COMBAT3)); pm->gent->NPC->blockedSpeechDebounceTime = level.time + 1000; } - G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); + G_SoundOnEnt(pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav"); //launch off ground? pm->ps->weaponTime = 300;//just to make sure it's cleared } @@ -6347,64 +6372,64 @@ qboolean PM_CheckRollGetup( void ) return qfalse; } -extern int G_MinGetUpTime( gentity_t *ent ); -qboolean PM_GettingUpFromKnockDown( float standheight, float crouchheight ) +extern int G_MinGetUpTime(gentity_t *ent); +qboolean PM_GettingUpFromKnockDown(float standheight, float crouchheight) { int legsAnim = pm->ps->legsAnim; - if ( legsAnim == BOTH_KNOCKDOWN1 - ||legsAnim == BOTH_KNOCKDOWN2 - ||legsAnim == BOTH_KNOCKDOWN3 - ||legsAnim == BOTH_KNOCKDOWN4 - ||legsAnim == BOTH_KNOCKDOWN5 - ||legsAnim == BOTH_PLAYER_PA_3_FLY - ||legsAnim == BOTH_LK_DL_ST_T_SB_1_L - ||legsAnim == BOTH_RELEASED ) + if (legsAnim == BOTH_KNOCKDOWN1 + || legsAnim == BOTH_KNOCKDOWN2 + || legsAnim == BOTH_KNOCKDOWN3 + || legsAnim == BOTH_KNOCKDOWN4 + || legsAnim == BOTH_KNOCKDOWN5 + || legsAnim == BOTH_PLAYER_PA_3_FLY + || legsAnim == BOTH_LK_DL_ST_T_SB_1_L + || legsAnim == BOTH_RELEASED) {//in a knockdown - int minTimeLeft = G_MinGetUpTime( pm->gent ); - if ( pm->ps->legsAnimTimer <= minTimeLeft ) + int minTimeLeft = G_MinGetUpTime(pm->gent); + if (pm->ps->legsAnimTimer <= minTimeLeft) {//if only a quarter of a second left, allow roll-aways - if ( PM_CheckRollGetup() ) + if (PM_CheckRollGetup()) { pm->cmd.rightmove = pm->cmd.forwardmove = 0; return qtrue; } } - if ( TIMER_Exists( pm->gent, "noGetUpStraight" ) ) + if (TIMER_Exists(pm->gent, "noGetUpStraight")) { - if ( !TIMER_Done2( pm->gent, "noGetUpStraight", qtrue ) ) + if (!TIMER_Done2(pm->gent, "noGetUpStraight", qtrue)) {//not allowed to do straight get-ups for another few seconds - if ( pm->ps->legsAnimTimer <= minTimeLeft ) + if (pm->ps->legsAnimTimer <= minTimeLeft) {//hold it for a bit - pm->ps->legsAnimTimer = minTimeLeft+1; + pm->ps->legsAnimTimer = minTimeLeft + 1; } } } - if ( !pm->ps->legsAnimTimer || (pm->ps->legsAnimTimer<=minTimeLeft&&(pm->cmd.upmove>0||(pm->gent&&pm->gent->client&&pm->gent->client->NPC_class==CLASS_ALORA))) ) + if (!pm->ps->legsAnimTimer || (pm->ps->legsAnimTimer <= minTimeLeft && (pm->cmd.upmove>0 || (pm->gent&&pm->gent->client&&pm->gent->client->NPC_class == CLASS_ALORA)))) {//done with the knockdown - FIXME: somehow this is allowing an *instant* getup...??? //FIXME: if trying to crouch (holding button?), just get up into a crouch? - if ( pm->cmd.upmove < 0 ) + if (pm->cmd.upmove < 0) { - return PM_CrouchGetup( crouchheight ); + return PM_CrouchGetup(crouchheight); } else { trace_t trace; // try to stand up pm->maxs[2] = standheight; - pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, pm->ps->origin, pm->ps->clientNum, pm->tracemask, (EG2_Collision)0, 0 ); - if ( !trace.allsolid ) + pm->trace(&trace, pm->ps->origin, pm->mins, pm->maxs, pm->ps->origin, pm->ps->clientNum, pm->tracemask, (EG2_Collision)0, 0); + if (!trace.allsolid) {//stand up int anim = BOTH_GETUP1; qboolean forceGetUp = qfalse; pm->maxs[2] = standheight; pm->ps->viewheight = standheight + STANDARD_VIEWHEIGHT_OFFSET; //NOTE: the force power checks will stop fencers and grunts from getting up using force jump - switch ( pm->ps->legsAnim ) + switch (pm->ps->legsAnim) { case BOTH_KNOCKDOWN1: - if ( (pm->ps->clientNum&&pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0) || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())&&pm->cmd.upmove>0&&pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0) )//FORCE_LEVEL_1) )FORCE_LEVEL_1) ) + if ((pm->ps->clientNum&&pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0) || ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && pm->cmd.upmove>0 && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0))//FORCE_LEVEL_1) )FORCE_LEVEL_1) ) { - anim = Q_irand( BOTH_FORCE_GETUP_B1, BOTH_FORCE_GETUP_B6 );//NOTE: BOTH_FORCE_GETUP_B5 takes soe steps forward at end + anim = Q_irand(BOTH_FORCE_GETUP_B1, BOTH_FORCE_GETUP_B6);//NOTE: BOTH_FORCE_GETUP_B5 takes soe steps forward at end forceGetUp = qtrue; } else @@ -6414,9 +6439,9 @@ qboolean PM_GettingUpFromKnockDown( float standheight, float crouchheight ) break; case BOTH_KNOCKDOWN2: case BOTH_PLAYER_PA_3_FLY: - if ( (pm->ps->clientNum&&pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0) || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())&&pm->cmd.upmove>0&&pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0) )//FORCE_LEVEL_1) )FORCE_LEVEL_1) ) + if ((pm->ps->clientNum&&pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0) || ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && pm->cmd.upmove>0 && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0))//FORCE_LEVEL_1) )FORCE_LEVEL_1) ) { - anim = Q_irand( BOTH_FORCE_GETUP_B1, BOTH_FORCE_GETUP_B6 );//NOTE: BOTH_FORCE_GETUP_B5 takes soe steps forward at end + anim = Q_irand(BOTH_FORCE_GETUP_B1, BOTH_FORCE_GETUP_B6);//NOTE: BOTH_FORCE_GETUP_B5 takes soe steps forward at end forceGetUp = qtrue; } else @@ -6425,9 +6450,9 @@ qboolean PM_GettingUpFromKnockDown( float standheight, float crouchheight ) } break; case BOTH_KNOCKDOWN3: - if ( (pm->ps->clientNum&&pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0) || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())&&pm->cmd.upmove>0&&pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0) )//FORCE_LEVEL_1) ) + if ((pm->ps->clientNum&&pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0) || ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && pm->cmd.upmove>0 && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0))//FORCE_LEVEL_1) ) { - anim = Q_irand( BOTH_FORCE_GETUP_F1, BOTH_FORCE_GETUP_F2 ); + anim = Q_irand(BOTH_FORCE_GETUP_F1, BOTH_FORCE_GETUP_F2); forceGetUp = qtrue; } else @@ -6437,9 +6462,9 @@ qboolean PM_GettingUpFromKnockDown( float standheight, float crouchheight ) break; case BOTH_KNOCKDOWN4: case BOTH_RELEASED: - if ( (pm->ps->clientNum&&pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0) || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())&&pm->cmd.upmove>0&&pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0) )//FORCE_LEVEL_1) )FORCE_LEVEL_1) ) + if ((pm->ps->clientNum&&pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0) || ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && pm->cmd.upmove>0 && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0))//FORCE_LEVEL_1) )FORCE_LEVEL_1) ) { - anim = Q_irand( BOTH_FORCE_GETUP_B1, BOTH_FORCE_GETUP_B6 );//NOTE: BOTH_FORCE_GETUP_B5 takes soe steps forward at end + anim = Q_irand(BOTH_FORCE_GETUP_B1, BOTH_FORCE_GETUP_B6);//NOTE: BOTH_FORCE_GETUP_B5 takes soe steps forward at end forceGetUp = qtrue; } else @@ -6449,9 +6474,9 @@ qboolean PM_GettingUpFromKnockDown( float standheight, float crouchheight ) break; case BOTH_KNOCKDOWN5: case BOTH_LK_DL_ST_T_SB_1_L: - if ( (pm->ps->clientNum&&pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0) || ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())&&pm->cmd.upmove>0&&pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0) )//FORCE_LEVEL_1) )FORCE_LEVEL_1) ) + if ((pm->ps->clientNum&&pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0) || ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && pm->cmd.upmove>0 && pm->ps->forcePowerLevel[FP_LEVITATION] > FORCE_LEVEL_0))//FORCE_LEVEL_1) )FORCE_LEVEL_1) ) { - anim = Q_irand( BOTH_FORCE_GETUP_F1, BOTH_FORCE_GETUP_F2 ); + anim = Q_irand(BOTH_FORCE_GETUP_F1, BOTH_FORCE_GETUP_F2); forceGetUp = qtrue; } else @@ -6461,43 +6486,43 @@ qboolean PM_GettingUpFromKnockDown( float standheight, float crouchheight ) break; } //Com_Printf( "getupanim = %s\n", animTable[anim].name ); - if ( forceGetUp ) + if (forceGetUp) { - if ( pm->gent && pm->gent->client && pm->gent->client->playerTeam == TEAM_ENEMY + if (pm->gent && pm->gent->client && pm->gent->client->playerTeam == TEAM_ENEMY && pm->gent->NPC && pm->gent->NPC->blockedSpeechDebounceTime < level.time - && !Q_irand( 0, 1 ) ) + && !Q_irand(0, 1)) { - PM_AddEvent( Q_irand( EV_COMBAT1, EV_COMBAT3 ) ); + PM_AddEvent(Q_irand(EV_COMBAT1, EV_COMBAT3)); pm->gent->NPC->blockedSpeechDebounceTime = level.time + 1000; } - G_SoundOnEnt( pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); + G_SoundOnEnt(pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav"); //launch off ground? pm->ps->weaponTime = 300;//just to make sure it's cleared } - if ( PM_LockedAnim( pm->ps->torsoAnim ) ) + if (PM_LockedAnim(pm->ps->torsoAnim)) {//need to be able to override this anim pm->ps->torsoAnimTimer = 0; } - if ( PM_LockedAnim( pm->ps->legsAnim ) ) + if (PM_LockedAnim(pm->ps->legsAnim)) {//need to be able to override this anim pm->ps->legsAnimTimer = 0; } - PM_SetAnim( pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_HOLDLESS ); + PM_SetAnim(pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_HOLDLESS); pm->ps->saberMove = pm->ps->saberBounceMove = LS_READY;//don't finish whatever saber anim you may have been in pm->ps->saberBlocked = BLOCKED_NONE; return qtrue; } else { - return PM_CrouchGetup( crouchheight ); + return PM_CrouchGetup(crouchheight); } } } else { - if ( pm->ps->legsAnim == BOTH_LK_DL_ST_T_SB_1_L ) + if (pm->ps->legsAnim == BOTH_LK_DL_ST_T_SB_1_L) { - PM_CmdForRoll( pm->ps, &pm->cmd ); + PM_CmdForRoll(pm->ps, &pm->cmd); } else { @@ -6508,9 +6533,9 @@ qboolean PM_GettingUpFromKnockDown( float standheight, float crouchheight ) return qfalse; } -void PM_CmdForRoll( playerState_t *ps, usercmd_t *pCmd ) +void PM_CmdForRoll(playerState_t *ps, usercmd_t *pCmd) { - switch ( ps->legsAnim ) + switch (ps->legsAnim) { case BOTH_ROLL_F: pCmd->forwardmove = 127; @@ -6536,7 +6561,7 @@ void PM_CmdForRoll( playerState_t *ps, usercmd_t *pCmd ) break; case BOTH_GETUP_FROLL_R: - if ( ps->legsAnimTimer <= 250 ) + if (ps->legsAnimTimer <= 250) {//end of anim pCmd->forwardmove = pCmd->rightmove = 0; } @@ -6555,7 +6580,7 @@ void PM_CmdForRoll( playerState_t *ps, usercmd_t *pCmd ) break; case BOTH_GETUP_FROLL_L: - if ( ps->legsAnimTimer <= 250 ) + if (ps->legsAnimTimer <= 250) {//end of anim pCmd->forwardmove = pCmd->rightmove = 0; } @@ -6568,11 +6593,11 @@ void PM_CmdForRoll( playerState_t *ps, usercmd_t *pCmd ) break; case BOTH_GETUP_BROLL_B: - if ( ps->torsoAnimTimer <= 250 ) + if (ps->torsoAnimTimer <= 250) {//end of anim pCmd->forwardmove = pCmd->rightmove = 0; } - else if ( PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)ps->legsAnim ) - ps->torsoAnimTimer < 350 ) + else if (PM_AnimLength(g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)ps->legsAnim) - ps->torsoAnimTimer < 350) {//beginning of anim pCmd->forwardmove = pCmd->rightmove = 0; } @@ -6586,11 +6611,11 @@ void PM_CmdForRoll( playerState_t *ps, usercmd_t *pCmd ) break; case BOTH_GETUP_FROLL_B: - if ( ps->torsoAnimTimer <= 100 ) + if (ps->torsoAnimTimer <= 100) {//end of anim pCmd->forwardmove = pCmd->rightmove = 0; } - else if ( PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)ps->legsAnim ) - ps->torsoAnimTimer < 200 ) + else if (PM_AnimLength(g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)ps->legsAnim) - ps->torsoAnimTimer < 200) {//beginning of anim pCmd->forwardmove = pCmd->rightmove = 0; } @@ -6604,11 +6629,11 @@ void PM_CmdForRoll( playerState_t *ps, usercmd_t *pCmd ) break; case BOTH_GETUP_BROLL_F: - if ( ps->torsoAnimTimer <= 550 ) + if (ps->torsoAnimTimer <= 550) {//end of anim pCmd->forwardmove = pCmd->rightmove = 0; } - else if ( PM_AnimLength( g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)ps->legsAnim ) - ps->torsoAnimTimer < 150 ) + else if (PM_AnimLength(g_entities[ps->clientNum].client->clientInfo.animFileIndex, (animNumber_t)ps->legsAnim) - ps->torsoAnimTimer < 150) {//beginning of anim pCmd->forwardmove = pCmd->rightmove = 0; } @@ -6621,7 +6646,7 @@ void PM_CmdForRoll( playerState_t *ps, usercmd_t *pCmd ) break; case BOTH_GETUP_FROLL_F: - if ( ps->torsoAnimTimer <= 100 ) + if (ps->torsoAnimTimer <= 100) {//end of anim pCmd->forwardmove = pCmd->rightmove = 0; } @@ -6635,8 +6660,8 @@ void PM_CmdForRoll( playerState_t *ps, usercmd_t *pCmd ) break; case BOTH_LK_DL_ST_T_SB_1_L: //kicked backwards - if ( ps->legsAnimTimer < 3050//at least 10 frames in - && ps->legsAnimTimer > 550 )//at least 6 frames from end + if (ps->legsAnimTimer < 3050//at least 10 frames in + && ps->legsAnimTimer > 550)//at least 6 frames from end {//move backwards pCmd->forwardmove = -64; pCmd->rightmove = 0; @@ -6651,9 +6676,9 @@ void PM_CmdForRoll( playerState_t *ps, usercmd_t *pCmd ) pCmd->upmove = 0; } -qboolean PM_InRollIgnoreTimer( playerState_t *ps ) +qboolean PM_InRollIgnoreTimer(playerState_t *ps) { - switch ( ps->legsAnim ) + switch (ps->legsAnim) { case BOTH_ROLL_F: case BOTH_ROLL_B: @@ -6672,9 +6697,9 @@ qboolean PM_InRollIgnoreTimer( playerState_t *ps ) return qfalse; } -qboolean PM_InRoll( playerState_t *ps ) +qboolean PM_InRoll(playerState_t *ps) { - if ( ps->legsAnimTimer && PM_InRollIgnoreTimer( ps ) ) + if (ps->legsAnimTimer && PM_InRollIgnoreTimer(ps)) { return qtrue; } @@ -6682,9 +6707,9 @@ qboolean PM_InRoll( playerState_t *ps ) return qfalse; } -qboolean PM_CrouchAnim( int anim ) +qboolean PM_CrouchAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_SIT1: //# Normal chair sit. case BOTH_SIT2: //# Lotus position. @@ -6698,7 +6723,7 @@ qboolean PM_CrouchAnim( int anim ) case BOTH_KNEES1: //# Tavion on her knees case BOTH_CROUCHATTACKBACK1://FIXME: not if in middle of anim? case BOTH_ROLL_STAB: - //??? + //??? case BOTH_STAND_TO_KNEEL: case BOTH_KNEEL_TO_STAND: case BOTH_TURNCROUCH1: @@ -6711,28 +6736,28 @@ qboolean PM_CrouchAnim( int anim ) return qfalse; } -qboolean PM_PainAnim( int anim ) -{ - switch ( anim ) - { - case BOTH_PAIN1: //# First take pain anim - case BOTH_PAIN2: //# Second take pain anim - case BOTH_PAIN3: //# Third take pain anim - case BOTH_PAIN4: //# Fourth take pain anim - case BOTH_PAIN5: //# Fifth take pain anim - from behind - case BOTH_PAIN6: //# Sixth take pain anim - from behind - case BOTH_PAIN7: //# Seventh take pain anim - from behind - case BOTH_PAIN8: //# Eigth take pain anim - from behind - case BOTH_PAIN9: //# - case BOTH_PAIN10: //# - case BOTH_PAIN11: //# - case BOTH_PAIN12: //# - case BOTH_PAIN13: //# - case BOTH_PAIN14: //# - case BOTH_PAIN15: //# - case BOTH_PAIN16: //# - case BOTH_PAIN17: //# - case BOTH_PAIN18: //# +qboolean PM_PainAnim(int anim) +{ + switch (anim) + { + case BOTH_PAIN1: //# First take pain anim + case BOTH_PAIN2: //# Second take pain anim + case BOTH_PAIN3: //# Third take pain anim + case BOTH_PAIN4: //# Fourth take pain anim + case BOTH_PAIN5: //# Fifth take pain anim - from behind + case BOTH_PAIN6: //# Sixth take pain anim - from behind + case BOTH_PAIN7: //# Seventh take pain anim - from behind + case BOTH_PAIN8: //# Eigth take pain anim - from behind + case BOTH_PAIN9: //# + case BOTH_PAIN10: //# + case BOTH_PAIN11: //# + case BOTH_PAIN12: //# + case BOTH_PAIN13: //# + case BOTH_PAIN14: //# + case BOTH_PAIN15: //# + case BOTH_PAIN16: //# + case BOTH_PAIN17: //# + case BOTH_PAIN18: //# return qtrue; break; } @@ -6740,9 +6765,9 @@ qboolean PM_PainAnim( int anim ) } -qboolean PM_DodgeHoldAnim( int anim ) +qboolean PM_DodgeHoldAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_DODGE_HOLD_FL: case BOTH_DODGE_HOLD_FR: @@ -6756,9 +6781,9 @@ qboolean PM_DodgeHoldAnim( int anim ) return qfalse; } -qboolean PM_DodgeAnim( int anim ) +qboolean PM_DodgeAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_DODGE_FL: //# lean-dodge forward left case BOTH_DODGE_FR: //# lean-dodge forward right @@ -6769,37 +6794,37 @@ qboolean PM_DodgeAnim( int anim ) return qtrue; break; default: - return PM_DodgeHoldAnim( anim ); + return PM_DodgeHoldAnim(anim); break; } //return qfalse; } -qboolean PM_ForceJumpingAnim( int anim ) +qboolean PM_ForceJumpingAnim(int anim) { - switch ( anim ) + switch (anim) { - case BOTH_FORCEJUMP1: //# Jump - wind-up and leave ground - case BOTH_FORCEINAIR1: //# In air loop (from jump) - case BOTH_FORCELAND1: //# Landing (from in air loop) - case BOTH_FORCEJUMPBACK1: //# Jump backwards - wind-up and leave ground - case BOTH_FORCEINAIRBACK1: //# In air loop (from jump back) - case BOTH_FORCELANDBACK1: //# Landing backwards(from in air loop) - case BOTH_FORCEJUMPLEFT1: //# Jump left - wind-up and leave ground - case BOTH_FORCEINAIRLEFT1: //# In air loop (from jump left) - case BOTH_FORCELANDLEFT1: //# Landing left(from in air loop) - case BOTH_FORCEJUMPRIGHT1: //# Jump right - wind-up and leave ground - case BOTH_FORCEINAIRRIGHT1: //# In air loop (from jump right) - case BOTH_FORCELANDRIGHT1: //# Landing right(from in air loop) + case BOTH_FORCEJUMP1: //# Jump - wind-up and leave ground + case BOTH_FORCEINAIR1: //# In air loop (from jump) + case BOTH_FORCELAND1: //# Landing (from in air loop) + case BOTH_FORCEJUMPBACK1: //# Jump backwards - wind-up and leave ground + case BOTH_FORCEINAIRBACK1: //# In air loop (from jump back) + case BOTH_FORCELANDBACK1: //# Landing backwards(from in air loop) + case BOTH_FORCEJUMPLEFT1: //# Jump left - wind-up and leave ground + case BOTH_FORCEINAIRLEFT1: //# In air loop (from jump left) + case BOTH_FORCELANDLEFT1: //# Landing left(from in air loop) + case BOTH_FORCEJUMPRIGHT1: //# Jump right - wind-up and leave ground + case BOTH_FORCEINAIRRIGHT1: //# In air loop (from jump right) + case BOTH_FORCELANDRIGHT1: //# Landing right(from in air loop) return qtrue; break; } return qfalse; } -qboolean PM_JumpingAnim( int anim ) +qboolean PM_JumpingAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_JUMP1: //# Jump - wind-up and leave ground case BOTH_INAIR1: //# In air loop (from jump) @@ -6817,38 +6842,38 @@ qboolean PM_JumpingAnim( int anim ) return qtrue; break; default: - if ( PM_InAirKickingAnim( anim ) ) + if (PM_InAirKickingAnim(anim)) { return qtrue; } - return PM_ForceJumpingAnim( anim ); + return PM_ForceJumpingAnim(anim); break; } //return qfalse; } -qboolean PM_LandingAnim( int anim ) +qboolean PM_LandingAnim(int anim) { - switch ( anim ) + switch (anim) { - case BOTH_LAND1: //# Landing (from in air loop) - case BOTH_LAND2: //# Landing Hard (from a great height) - case BOTH_LANDBACK1: //# Landing backwards(from in air loop) - case BOTH_LANDLEFT1: //# Landing left(from in air loop) - case BOTH_LANDRIGHT1: //# Landing right(from in air loop) - case BOTH_FORCELAND1: //# Landing (from in air loop) - case BOTH_FORCELANDBACK1: //# Landing backwards(from in air loop) - case BOTH_FORCELANDLEFT1: //# Landing left(from in air loop) - case BOTH_FORCELANDRIGHT1: //# Landing right(from in air loop) + case BOTH_LAND1: //# Landing (from in air loop) + case BOTH_LAND2: //# Landing Hard (from a great height) + case BOTH_LANDBACK1: //# Landing backwards(from in air loop) + case BOTH_LANDLEFT1: //# Landing left(from in air loop) + case BOTH_LANDRIGHT1: //# Landing right(from in air loop) + case BOTH_FORCELAND1: //# Landing (from in air loop) + case BOTH_FORCELANDBACK1: //# Landing backwards(from in air loop) + case BOTH_FORCELANDLEFT1: //# Landing left(from in air loop) + case BOTH_FORCELANDRIGHT1: //# Landing right(from in air loop) return qtrue; break; } return qfalse; } -qboolean PM_FlippingAnim( int anim ) +qboolean PM_FlippingAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_FLIP_F: //# Flip forward case BOTH_FLIP_B: //# Flip backwards @@ -6866,7 +6891,7 @@ qboolean PM_FlippingAnim( int anim ) case BOTH_FLIP_BACK3: case BOTH_WALL_FLIP_BACK1: case BOTH_ALORA_FLIP_B: - //Not really flips, but... + //Not really flips, but... case BOTH_WALL_RUN_RIGHT: case BOTH_WALL_RUN_LEFT: case BOTH_WALL_RUN_RIGHT_STOP: @@ -6875,7 +6900,7 @@ qboolean PM_FlippingAnim( int anim ) case BOTH_BUTTERFLY_RIGHT: case BOTH_BUTTERFLY_FL1: case BOTH_BUTTERFLY_FR1: - // + // case BOTH_ARIAL_LEFT: case BOTH_ARIAL_RIGHT: case BOTH_ARIAL_F1: @@ -6885,7 +6910,7 @@ qboolean PM_FlippingAnim( int anim ) case BOTH_JUMPFLIPSTABDOWN: case BOTH_JUMPATTACK6: case BOTH_JUMPATTACK7: - //JKA + //JKA case BOTH_FORCEWALLRUNFLIP_END: case BOTH_FORCEWALLRUNFLIP_ALT: case BOTH_FLIP_ATTACK7: @@ -6896,9 +6921,9 @@ qboolean PM_FlippingAnim( int anim ) return qfalse; } -qboolean PM_WalkingAnim( int anim ) +qboolean PM_WalkingAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_WALK1: //# Normal walk case BOTH_WALK2: //# Normal walk with saber @@ -6917,18 +6942,18 @@ qboolean PM_WalkingAnim( int anim ) return qfalse; } -qboolean PM_RunningAnim( int anim ) +qboolean PM_RunningAnim(int anim) { - switch ( anim ) + switch (anim) { - case BOTH_RUN1: - case BOTH_RUN2: + case BOTH_RUN1: + case BOTH_RUN2: case BOTH_RUN4: - case BOTH_RUN_STAFF: + case BOTH_RUN_STAFF: case BOTH_RUN_DUAL: - case BOTH_RUNBACK1: - case BOTH_RUNBACK2: - case BOTH_RUNBACK_STAFF: + case BOTH_RUNBACK1: + case BOTH_RUNBACK2: + case BOTH_RUNBACK_STAFF: case BOTH_RUN1START: //# Start into full run1 case BOTH_RUN1STOP: //# Stop from full run1 case BOTH_RUNSTRAFE_LEFT1: //# Sidestep left: should loop @@ -6939,9 +6964,9 @@ qboolean PM_RunningAnim( int anim ) return qfalse; } -qboolean PM_RollingAnim( int anim ) +qboolean PM_RollingAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_ROLL_F: //# Roll forward case BOTH_ROLL_B: //# Roll backward @@ -6961,9 +6986,9 @@ qboolean PM_RollingAnim( int anim ) return qfalse; } -qboolean PM_SwimmingAnim( int anim ) +qboolean PM_SwimmingAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_SWIM_IDLE1: //# Swimming Idle 1 case BOTH_SWIMFORWARD: //# Swim forward loop @@ -6974,11 +6999,11 @@ qboolean PM_SwimmingAnim( int anim ) return qfalse; } -qboolean PM_LeapingSaberAnim( int anim ) +qboolean PM_LeapingSaberAnim(int anim) { - switch ( anim ) + switch (anim) { - //level 7 + //level 7 case BOTH_T7_BR_TL: case BOTH_T7__L_BR: case BOTH_T7__L__R: @@ -6991,11 +7016,11 @@ qboolean PM_LeapingSaberAnim( int anim ) return qfalse; } -qboolean PM_SpinningSaberAnim( int anim ) +qboolean PM_SpinningSaberAnim(int anim) { - switch ( anim ) + switch (anim) { - //level 1 - FIXME: level 1 will have *no* spins + //level 1 - FIXME: level 1 will have *no* spins case BOTH_T1_BR_BL: case BOTH_T1__R__L: case BOTH_T1__R_BL: @@ -7008,28 +7033,28 @@ qboolean PM_SpinningSaberAnim( int anim ) case BOTH_T1_BL_BR: case BOTH_T1_BL__R: case BOTH_T1_BL_TR: - //level 2 + //level 2 case BOTH_T2_BR__L: case BOTH_T2_BR_BL: case BOTH_T2__R_BL: case BOTH_T2__L_BR: case BOTH_T2_BL_BR: case BOTH_T2_BL__R: - //level 3 + //level 3 case BOTH_T3_BR__L: case BOTH_T3_BR_BL: case BOTH_T3__R_BL: case BOTH_T3__L_BR: case BOTH_T3_BL_BR: case BOTH_T3_BL__R: - //level 4 + //level 4 case BOTH_T4_BR__L: case BOTH_T4_BR_BL: case BOTH_T4__R_BL: case BOTH_T4__L_BR: case BOTH_T4_BL_BR: case BOTH_T4_BL__R: - //level 5 + //level 5 case BOTH_T5_BR_BL: case BOTH_T5__R__L: case BOTH_T5__R_BL: @@ -7042,7 +7067,7 @@ qboolean PM_SpinningSaberAnim( int anim ) case BOTH_T5_BL_BR: case BOTH_T5_BL__R: case BOTH_T5_BL_TR: - //level 6 + //level 6 case BOTH_T6_BR_TL: case BOTH_T6__R_TL: case BOTH_T6__R__L: @@ -7065,7 +7090,7 @@ qboolean PM_SpinningSaberAnim( int anim ) case BOTH_T6_BL_BR: case BOTH_T6_BL__R: case BOTH_T6_BL_TR: - //level 7 + //level 7 case BOTH_T7_BR_TL: case BOTH_T7_BR__L: case BOTH_T7_BR_BL: @@ -7083,8 +7108,8 @@ qboolean PM_SpinningSaberAnim( int anim ) case BOTH_T7_T__BR: case BOTH_T7__L_TR: case BOTH_V7_BL_S7: - //special - //case BOTH_A2_STABBACK1: + //special + //case BOTH_A2_STABBACK1: case BOTH_ATTACK_BACK: case BOTH_CROUCHATTACKBACK1: case BOTH_BUTTERFLY_LEFT: @@ -7099,69 +7124,69 @@ qboolean PM_SpinningSaberAnim( int anim ) return qfalse; } -qboolean PM_SpinningAnim( int anim ) +qboolean PM_SpinningAnim(int anim) { /* switch ( anim ) { //FIXME: list any other spinning anims default: - break; + break; } */ - return PM_SpinningSaberAnim( anim ); + return PM_SpinningSaberAnim(anim); } -void PM_ResetAnkleAngles( void ) +void PM_ResetAnkleAngles(void) { - if ( !pm->gent || !pm->gent->client || pm->gent->client->NPC_class != CLASS_ATST ) + if (!pm->gent || !pm->gent->client || pm->gent->client->NPC_class != CLASS_ATST) { return; } - if ( pm->gent->footLBone != -1 ) + if (pm->gent->footLBone != -1) { - gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footLBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex(&pm->gent->ghoul2[0], pm->gent->footLBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0); } - if ( pm->gent->footRBone != -1 ) + if (pm->gent->footRBone != -1) { - gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footRBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex(&pm->gent->ghoul2[0], pm->gent->footRBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0); } } -void PM_AnglesForSlope( const float yaw, const vec3_t slope, vec3_t angles ) +void PM_AnglesForSlope(const float yaw, const vec3_t slope, vec3_t angles) { vec3_t nvf, ovf, ovr, new_angles; float pitch, mod, dot; - VectorSet( angles, 0, yaw, 0 ); - AngleVectors( angles, ovf, ovr, NULL ); + VectorSet(angles, 0, yaw, 0); + AngleVectors(angles, ovf, ovr, NULL); - vectoangles( slope, new_angles ); + vectoangles(slope, new_angles); pitch = new_angles[PITCH] + 90; new_angles[ROLL] = new_angles[PITCH] = 0; - AngleVectors( new_angles, nvf, NULL, NULL ); + AngleVectors(new_angles, nvf, NULL, NULL); - mod = DotProduct( nvf, ovr ); + mod = DotProduct(nvf, ovr); - if ( mod < 0 ) + if (mod < 0) mod = -1; else mod = 1; - dot = DotProduct( nvf, ovf ); + dot = DotProduct(nvf, ovf); angles[YAW] = 0; angles[PITCH] = dot * pitch; - angles[ROLL] = ((1-Q_fabs(dot)) * pitch * mod); + angles[ROLL] = ((1 - Q_fabs(dot)) * pitch * mod); } -void PM_FootSlopeTrace( float *pDiff, float *pInterval ) +void PM_FootSlopeTrace(float *pDiff, float *pInterval) { vec3_t footLOrg, footROrg, footLBot, footRBot; trace_t trace; float diff, interval; - if ( pm->gent->client->NPC_class == CLASS_ATST ) + if (pm->gent->client->NPC_class == CLASS_ATST) { interval = 10; } @@ -7170,29 +7195,29 @@ void PM_FootSlopeTrace( float *pDiff, float *pInterval ) interval = 4;//? } - if ( pm->gent->footLBolt == -1 || pm->gent->footRBolt == -1 ) + if (pm->gent->footLBolt == -1 || pm->gent->footRBolt == -1) { - if ( pDiff != NULL ) + if (pDiff != NULL) { *pDiff = 0; } - if ( pInterval != NULL ) + if (pInterval != NULL) { *pInterval = interval; } return; } #if 1 - for ( int i = 0; i < 3; i++ ) + for (int i = 0; i < 3; i++) { - if ( Q_isnan( pm->gent->client->renderInfo.footLPoint[i] ) - || Q_isnan( pm->gent->client->renderInfo.footRPoint[i] ) ) + if (Q_isnan(pm->gent->client->renderInfo.footLPoint[i]) + || Q_isnan(pm->gent->client->renderInfo.footRPoint[i])) { - if ( pDiff != NULL ) + if (pDiff != NULL) { *pDiff = 0; } - if ( pInterval != NULL ) + if (pInterval != NULL) { *pInterval = interval; } @@ -7203,104 +7228,104 @@ void PM_FootSlopeTrace( float *pDiff, float *pInterval ) //FIXME: these really should have been gotten on the cgame, but I guess sometimes they're not and we end up with qnan numbers! mdxaBone_t boltMatrix; - vec3_t G2Angles = {0, pm->gent->client->ps.legsYaw, 0}; + vec3_t G2Angles = { 0, pm->gent->client->ps.legsYaw, 0 }; //get the feet - gi.G2API_GetBoltMatrix( pm->gent->ghoul2, pm->gent->playerModel, pm->gent->footLBolt, - &boltMatrix, G2Angles, pm->ps->origin, (cg.time?cg.time:level.time), - NULL, pm->gent->s.modelScale ); - gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, pm->gent->client->renderInfo.footLPoint ); - - gi.G2API_GetBoltMatrix( pm->gent->ghoul2, pm->gent->playerModel, pm->gent->footRBolt, - &boltMatrix, G2Angles, pm->ps->origin, (cg.time?cg.time:level.time), - NULL, pm->gent->s.modelScale ); - gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, pm->gent->client->renderInfo.footRPoint ); + gi.G2API_GetBoltMatrix(pm->gent->ghoul2, pm->gent->playerModel, pm->gent->footLBolt, + &boltMatrix, G2Angles, pm->ps->origin, (cg.time ? cg.time : level.time), + NULL, pm->gent->s.modelScale); + gi.G2API_GiveMeVectorFromMatrix(boltMatrix, ORIGIN, pm->gent->client->renderInfo.footLPoint); + + gi.G2API_GetBoltMatrix(pm->gent->ghoul2, pm->gent->playerModel, pm->gent->footRBolt, + &boltMatrix, G2Angles, pm->ps->origin, (cg.time ? cg.time : level.time), + NULL, pm->gent->s.modelScale); + gi.G2API_GiveMeVectorFromMatrix(boltMatrix, ORIGIN, pm->gent->client->renderInfo.footRPoint); #endif - //NOTE: on AT-STs, rotating the foot moves this point, so it will wiggle... + //NOTE: on AT-STs, rotating the foot moves this point, so it will wiggle... // we have to do this extra work (more G2 transforms) to stop the wiggle... is it worth it? /* if ( pm->gent->client->NPC_class == CLASS_ATST ) { - mdxaBone_t boltMatrix; - vec3_t G2Angles = {0, pm->gent->client->ps.legsYaw, 0}; - //get the feet - gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footLBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL ); - gi.G2API_GetBoltMatrix( pm->gent->ghoul2, pm->gent->playerModel, pm->gent->footLBolt, - &boltMatrix, G2Angles, pm->ps->origin, (cg.time?cg.time:level.time), - NULL, pm->gent->s.modelScale ); - gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, pm->gent->client->renderInfo.footLPoint ); - - gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footRBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL ); - gi.G2API_GetBoltMatrix( pm->gent->ghoul2, pm->gent->playerModel, pm->gent->footRBolt, - &boltMatrix, G2Angles, pm->ps->origin, (cg.time?cg.time:level.time), - NULL, pm->gent->s.modelScale ); - gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, pm->gent->client->renderInfo.footRPoint ); + mdxaBone_t boltMatrix; + vec3_t G2Angles = {0, pm->gent->client->ps.legsYaw, 0}; + //get the feet + gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footLBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL ); + gi.G2API_GetBoltMatrix( pm->gent->ghoul2, pm->gent->playerModel, pm->gent->footLBolt, + &boltMatrix, G2Angles, pm->ps->origin, (cg.time?cg.time:level.time), + NULL, pm->gent->s.modelScale ); + gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, pm->gent->client->renderInfo.footLPoint ); + + gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footRBone, vec3_origin, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL ); + gi.G2API_GetBoltMatrix( pm->gent->ghoul2, pm->gent->playerModel, pm->gent->footRBolt, + &boltMatrix, G2Angles, pm->ps->origin, (cg.time?cg.time:level.time), + NULL, pm->gent->s.modelScale ); + gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, pm->gent->client->renderInfo.footRPoint ); } */ //get these on the cgame and store it, save ourselves a ghoul2 construct skel call - VectorCopy( pm->gent->client->renderInfo.footLPoint, footLOrg ); - VectorCopy( pm->gent->client->renderInfo.footRPoint, footROrg ); + VectorCopy(pm->gent->client->renderInfo.footLPoint, footLOrg); + VectorCopy(pm->gent->client->renderInfo.footRPoint, footROrg); //step 2: adjust foot tag z height to bottom of bbox+1 footLOrg[2] = pm->gent->currentOrigin[2] + pm->gent->mins[2] + 1; footROrg[2] = pm->gent->currentOrigin[2] + pm->gent->mins[2] + 1; - VectorSet( footLBot, footLOrg[0], footLOrg[1], footLOrg[2] - interval*10 ); - VectorSet( footRBot, footROrg[0], footROrg[1], footROrg[2] - interval*10 ); + VectorSet(footLBot, footLOrg[0], footLOrg[1], footLOrg[2] - interval * 10); + VectorSet(footRBot, footROrg[0], footROrg[1], footROrg[2] - interval * 10); //step 3: trace down from each, find difference vec3_t footMins, footMaxs; vec3_t footLSlope, footRSlope; - if ( pm->gent->client->NPC_class == CLASS_ATST ) + if (pm->gent->client->NPC_class == CLASS_ATST) { - VectorSet( footMins, -16, -16, 0 ); - VectorSet( footMaxs, 16, 16, 1 ); + VectorSet(footMins, -16, -16, 0); + VectorSet(footMaxs, 16, 16, 1); } else { - VectorSet( footMins, -3, -3, 0 ); - VectorSet( footMaxs, 3, 3, 1 ); + VectorSet(footMins, -3, -3, 0); + VectorSet(footMaxs, 3, 3, 1); } - pm->trace( &trace, footLOrg, footMins, footMaxs, footLBot, pm->ps->clientNum, pm->tracemask, (EG2_Collision)0, 0 ); - VectorCopy( trace.endpos, footLBot ); - VectorCopy( trace.plane.normal, footLSlope ); + pm->trace(&trace, footLOrg, footMins, footMaxs, footLBot, pm->ps->clientNum, pm->tracemask, (EG2_Collision)0, 0); + VectorCopy(trace.endpos, footLBot); + VectorCopy(trace.plane.normal, footLSlope); - pm->trace( &trace, footROrg, footMins, footMaxs, footRBot, pm->ps->clientNum, pm->tracemask, (EG2_Collision)0, 0 ); - VectorCopy( trace.endpos, footRBot ); - VectorCopy( trace.plane.normal, footRSlope ); + pm->trace(&trace, footROrg, footMins, footMaxs, footRBot, pm->ps->clientNum, pm->tracemask, (EG2_Collision)0, 0); + VectorCopy(trace.endpos, footRBot); + VectorCopy(trace.plane.normal, footRSlope); diff = footLBot[2] - footRBot[2]; //optional step: for atst, tilt the footpads to match the slopes under it... - if ( pm->gent->client->NPC_class == CLASS_ATST ) + if (pm->gent->client->NPC_class == CLASS_ATST) { vec3_t footAngles; - if ( !VectorCompare( footLSlope, vec3_origin ) ) + if (!VectorCompare(footLSlope, vec3_origin)) {//rotate the ATST's left foot pad to match the slope - PM_AnglesForSlope( pm->gent->client->renderInfo.legsYaw, footLSlope, footAngles ); + PM_AnglesForSlope(pm->gent->client->renderInfo.legsYaw, footLSlope, footAngles); //Hmm... lerp this? - gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footLBone, footAngles, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex(&pm->gent->ghoul2[0], pm->gent->footLBone, footAngles, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0); } - if ( !VectorCompare( footRSlope, vec3_origin ) ) + if (!VectorCompare(footRSlope, vec3_origin)) {//rotate the ATST's right foot pad to match the slope - PM_AnglesForSlope( pm->gent->client->renderInfo.legsYaw, footRSlope, footAngles ); + PM_AnglesForSlope(pm->gent->client->renderInfo.legsYaw, footRSlope, footAngles); //Hmm... lerp this? - gi.G2API_SetBoneAnglesIndex( &pm->gent->ghoul2[0], pm->gent->footRBone, footAngles, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0 ); + gi.G2API_SetBoneAnglesIndex(&pm->gent->ghoul2[0], pm->gent->footRBone, footAngles, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, NEGATIVE_X, NULL, 0, 0); } } - if ( pDiff != NULL ) + if (pDiff != NULL) { *pDiff = diff; } - if ( pInterval != NULL ) + if (pInterval != NULL) { *pInterval = interval; } } -qboolean PM_InSlopeAnim( int anim ) +qboolean PM_InSlopeAnim(int anim) { - switch ( anim ) + switch (anim) { case LEGS_LEFTUP1: //# On a slope with left foot 4 higher than right case LEGS_LEFTUP2: //# On a slope with left foot 8 higher than right @@ -7378,9 +7403,9 @@ qboolean PM_InSlopeAnim( int anim ) return qfalse; } -qboolean PM_SaberStanceAnim( int anim ) +qboolean PM_SaberStanceAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_STAND1://not really a saberstance anim, actually... "saber off" stance case BOTH_STAND2://single-saber, medium style @@ -7394,9 +7419,9 @@ qboolean PM_SaberStanceAnim( int anim ) return qfalse; } -qboolean PM_SaberDrawPutawayAnim( int anim ) +qboolean PM_SaberDrawPutawayAnim(int anim) { - switch ( anim ) + switch (anim) { case BOTH_STAND1TO2: case BOTH_STAND2TO1: @@ -7411,71 +7436,71 @@ qboolean PM_SaberDrawPutawayAnim( int anim ) } #define SLOPE_RECALC_INT 100 -extern qboolean G_StandardHumanoid( gentity_t *self ); -qboolean PM_AdjustStandAnimForSlope( void ) +extern qboolean G_StandardHumanoid(gentity_t *self); +qboolean PM_AdjustStandAnimForSlope(void) { - if ( !pm->gent || !pm->gent->client ) + if (!pm->gent || !pm->gent->client) { return qfalse; } - if ( pm->gent->client->NPC_class != CLASS_ATST - && (!pm->gent||!G_StandardHumanoid( pm->gent )) ) + if (pm->gent->client->NPC_class != CLASS_ATST + && (!pm->gent || !G_StandardHumanoid(pm->gent))) {//only ATST and player does this return qfalse; } - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) - && (!cg.renderingThirdPerson || cg.zoomMode) ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + && (!cg.renderingThirdPerson || cg.zoomMode)) {//first person doesn't do this return qfalse; } - if ( pm->gent->footLBolt == -1 || pm->gent->footRBolt == -1 ) + if (pm->gent->footLBolt == -1 || pm->gent->footRBolt == -1) {//need these bolts! return qfalse; } //step 1: find the 2 foot tags float diff; float interval; - PM_FootSlopeTrace( &diff, &interval ); + PM_FootSlopeTrace(&diff, &interval); //step 4: based on difference, choose one of the left/right slope-match intervals int destAnim; - if ( diff >= interval*5 ) + if (diff >= interval * 5) { destAnim = LEGS_LEFTUP5; } - else if ( diff >= interval*4 ) + else if (diff >= interval * 4) { destAnim = LEGS_LEFTUP4; } - else if ( diff >= interval*3 ) + else if (diff >= interval * 3) { destAnim = LEGS_LEFTUP3; } - else if ( diff >= interval*2 ) + else if (diff >= interval * 2) { destAnim = LEGS_LEFTUP2; } - else if ( diff >= interval ) + else if (diff >= interval) { destAnim = LEGS_LEFTUP1; } - else if ( diff <= interval*-5 ) + else if (diff <= interval*-5) { destAnim = LEGS_RIGHTUP5; } - else if ( diff <= interval*-4 ) + else if (diff <= interval*-4) { destAnim = LEGS_RIGHTUP4; } - else if ( diff <= interval*-3 ) + else if (diff <= interval*-3) { destAnim = LEGS_RIGHTUP3; } - else if ( diff <= interval*-2 ) + else if (diff <= interval*-2) { destAnim = LEGS_RIGHTUP2; } - else if ( diff <= interval*-1 ) + else if (diff <= interval*-1) { destAnim = LEGS_RIGHTUP1; } @@ -7485,10 +7510,10 @@ qboolean PM_AdjustStandAnimForSlope( void ) } int legsAnim = pm->ps->legsAnim; - if ( pm->gent->client->NPC_class != CLASS_ATST ) + if (pm->gent->client->NPC_class != CLASS_ATST) { //adjust for current legs anim - switch ( legsAnim ) + switch (legsAnim) { case BOTH_STAND1: case LEGS_S1_LUP1: @@ -7501,7 +7526,7 @@ qboolean PM_AdjustStandAnimForSlope( void ) case LEGS_S1_RUP3: case LEGS_S1_RUP4: case LEGS_S1_RUP5: - destAnim = LEGS_S1_LUP1 + (destAnim-LEGS_LEFTUP1); + destAnim = LEGS_S1_LUP1 + (destAnim - LEGS_LEFTUP1); break; case BOTH_STAND2: case BOTH_SABERFAST_STANCE: @@ -7531,7 +7556,7 @@ qboolean PM_AdjustStandAnimForSlope( void ) case LEGS_S3_RUP3: case LEGS_S3_RUP4: case LEGS_S3_RUP5: - destAnim = LEGS_S3_LUP1 + (destAnim-LEGS_LEFTUP1); + destAnim = LEGS_S3_LUP1 + (destAnim - LEGS_LEFTUP1); break; case BOTH_STAND4: case LEGS_S4_LUP1: @@ -7544,7 +7569,7 @@ qboolean PM_AdjustStandAnimForSlope( void ) case LEGS_S4_RUP3: case LEGS_S4_RUP4: case LEGS_S4_RUP5: - destAnim = LEGS_S4_LUP1 + (destAnim-LEGS_LEFTUP1); + destAnim = LEGS_S4_LUP1 + (destAnim - LEGS_LEFTUP1); break; case BOTH_STAND5: case LEGS_S5_LUP1: @@ -7557,7 +7582,7 @@ qboolean PM_AdjustStandAnimForSlope( void ) case LEGS_S5_RUP3: case LEGS_S5_RUP4: case LEGS_S5_RUP5: - destAnim = LEGS_S5_LUP1 + (destAnim-LEGS_LEFTUP1); + destAnim = LEGS_S5_LUP1 + (destAnim - LEGS_LEFTUP1); break; case BOTH_SABERDUAL_STANCE: case LEGS_S6_LUP1: @@ -7570,7 +7595,7 @@ qboolean PM_AdjustStandAnimForSlope( void ) case LEGS_S6_RUP3: case LEGS_S6_RUP4: case LEGS_S6_RUP5: - destAnim = LEGS_S6_LUP1 + (destAnim-LEGS_LEFTUP1); + destAnim = LEGS_S6_LUP1 + (destAnim - LEGS_LEFTUP1); break; case BOTH_SABERSTAFF_STANCE: case LEGS_S7_LUP1: @@ -7583,7 +7608,7 @@ qboolean PM_AdjustStandAnimForSlope( void ) case LEGS_S7_RUP3: case LEGS_S7_RUP4: case LEGS_S7_RUP5: - destAnim = LEGS_S7_LUP1 + (destAnim-LEGS_LEFTUP1); + destAnim = LEGS_S7_LUP1 + (destAnim - LEGS_LEFTUP1); break; case BOTH_STAND6: default: @@ -7593,20 +7618,20 @@ qboolean PM_AdjustStandAnimForSlope( void ) } //step 5: based on the chosen interval and the current legsAnim, pick the correct anim //step 6: increment/decrement to the dest anim, not instant - if ( (legsAnim >= LEGS_LEFTUP1 && legsAnim <= LEGS_LEFTUP5) + if ((legsAnim >= LEGS_LEFTUP1 && legsAnim <= LEGS_LEFTUP5) || (legsAnim >= LEGS_S1_LUP1 && legsAnim <= LEGS_S1_LUP5) || (legsAnim >= LEGS_S3_LUP1 && legsAnim <= LEGS_S3_LUP5) || (legsAnim >= LEGS_S4_LUP1 && legsAnim <= LEGS_S4_LUP5) || (legsAnim >= LEGS_S5_LUP1 && legsAnim <= LEGS_S5_LUP5) || (legsAnim >= LEGS_S6_LUP1 && legsAnim <= LEGS_S6_LUP5) - || (legsAnim >= LEGS_S7_LUP1 && legsAnim <= LEGS_S7_LUP5) ) + || (legsAnim >= LEGS_S7_LUP1 && legsAnim <= LEGS_S7_LUP5)) {//already in left-side up - if ( destAnim > legsAnim && pm->gent->client->slopeRecalcTime < level.time ) + if (destAnim > legsAnim && pm->gent->client->slopeRecalcTime < level.time) { legsAnim++; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; } - else if ( destAnim < legsAnim && pm->gent->client->slopeRecalcTime < level.time ) + else if (destAnim < legsAnim && pm->gent->client->slopeRecalcTime < level.time) { legsAnim--; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; @@ -7616,20 +7641,20 @@ qboolean PM_AdjustStandAnimForSlope( void ) destAnim = legsAnim; } } - else if ( (legsAnim >= LEGS_RIGHTUP1 && legsAnim <= LEGS_RIGHTUP5) + else if ((legsAnim >= LEGS_RIGHTUP1 && legsAnim <= LEGS_RIGHTUP5) || (legsAnim >= LEGS_S1_RUP1 && legsAnim <= LEGS_S1_RUP5) || (legsAnim >= LEGS_S3_RUP1 && legsAnim <= LEGS_S3_RUP5) || (legsAnim >= LEGS_S4_RUP1 && legsAnim <= LEGS_S4_RUP5) || (legsAnim >= LEGS_S5_RUP1 && legsAnim <= LEGS_S5_RUP5) || (legsAnim >= LEGS_S6_RUP1 && legsAnim <= LEGS_S6_RUP5) - || (legsAnim >= LEGS_S7_RUP1 && legsAnim <= LEGS_S7_RUP5) ) + || (legsAnim >= LEGS_S7_RUP1 && legsAnim <= LEGS_S7_RUP5)) {//already in right-side up - if ( destAnim > legsAnim && pm->gent->client->slopeRecalcTime < level.time ) + if (destAnim > legsAnim && pm->gent->client->slopeRecalcTime < level.time) { legsAnim++; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; } - else if ( destAnim < legsAnim && pm->gent->client->slopeRecalcTime < level.time ) + else if (destAnim < legsAnim && pm->gent->client->slopeRecalcTime < level.time) { legsAnim--; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; @@ -7641,16 +7666,16 @@ qboolean PM_AdjustStandAnimForSlope( void ) } else {//in a stand of some sort? - if ( pm->gent->client->NPC_class == CLASS_ATST ) + if (pm->gent->client->NPC_class == CLASS_ATST) { - if ( legsAnim == BOTH_STAND1 || legsAnim == BOTH_STAND2 || legsAnim == BOTH_CROUCH1IDLE ) + if (legsAnim == BOTH_STAND1 || legsAnim == BOTH_STAND2 || legsAnim == BOTH_CROUCH1IDLE) { - if ( destAnim >= LEGS_LEFTUP1 && destAnim <= LEGS_LEFTUP5 ) + if (destAnim >= LEGS_LEFTUP1 && destAnim <= LEGS_LEFTUP5) {//going into left side up destAnim = LEGS_LEFTUP1; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; } - else if ( destAnim >= LEGS_RIGHTUP1 && destAnim <= LEGS_RIGHTUP5 ) + else if (destAnim >= LEGS_RIGHTUP1 && destAnim <= LEGS_RIGHTUP5) {//going into right side up destAnim = LEGS_RIGHTUP1; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; @@ -7663,15 +7688,15 @@ qboolean PM_AdjustStandAnimForSlope( void ) } else { - switch ( legsAnim ) + switch (legsAnim) { case BOTH_STAND1: - if ( destAnim >= LEGS_S1_LUP1 && destAnim <= LEGS_S1_LUP5 ) + if (destAnim >= LEGS_S1_LUP1 && destAnim <= LEGS_S1_LUP5) {//going into left side up destAnim = LEGS_S1_LUP1; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; } - else if ( destAnim >= LEGS_S1_RUP1 && destAnim <= LEGS_S1_RUP5 ) + else if (destAnim >= LEGS_S1_RUP1 && destAnim <= LEGS_S1_RUP5) {//going into right side up destAnim = LEGS_S1_RUP1; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; @@ -7685,12 +7710,12 @@ qboolean PM_AdjustStandAnimForSlope( void ) case BOTH_SABERFAST_STANCE: case BOTH_SABERSLOW_STANCE: case BOTH_CROUCH1IDLE: - if ( destAnim >= LEGS_LEFTUP1 && destAnim <= LEGS_LEFTUP5 ) + if (destAnim >= LEGS_LEFTUP1 && destAnim <= LEGS_LEFTUP5) {//going into left side up destAnim = LEGS_LEFTUP1; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; } - else if ( destAnim >= LEGS_RIGHTUP1 && destAnim <= LEGS_RIGHTUP5 ) + else if (destAnim >= LEGS_RIGHTUP1 && destAnim <= LEGS_RIGHTUP5) {//going into right side up destAnim = LEGS_RIGHTUP1; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; @@ -7701,12 +7726,12 @@ qboolean PM_AdjustStandAnimForSlope( void ) } break; case BOTH_STAND3: - if ( destAnim >= LEGS_S3_LUP1 && destAnim <= LEGS_S3_LUP5 ) + if (destAnim >= LEGS_S3_LUP1 && destAnim <= LEGS_S3_LUP5) {//going into left side up destAnim = LEGS_S3_LUP1; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; } - else if ( destAnim >= LEGS_S3_RUP1 && destAnim <= LEGS_S3_RUP5 ) + else if (destAnim >= LEGS_S3_RUP1 && destAnim <= LEGS_S3_RUP5) {//going into right side up destAnim = LEGS_S3_RUP1; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; @@ -7717,12 +7742,12 @@ qboolean PM_AdjustStandAnimForSlope( void ) } break; case BOTH_STAND4: - if ( destAnim >= LEGS_S4_LUP1 && destAnim <= LEGS_S4_LUP5 ) + if (destAnim >= LEGS_S4_LUP1 && destAnim <= LEGS_S4_LUP5) {//going into left side up destAnim = LEGS_S4_LUP1; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; } - else if ( destAnim >= LEGS_S4_RUP1 && destAnim <= LEGS_S4_RUP5 ) + else if (destAnim >= LEGS_S4_RUP1 && destAnim <= LEGS_S4_RUP5) {//going into right side up destAnim = LEGS_S4_RUP1; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; @@ -7733,12 +7758,12 @@ qboolean PM_AdjustStandAnimForSlope( void ) } break; case BOTH_STAND5: - if ( destAnim >= LEGS_S5_LUP1 && destAnim <= LEGS_S5_LUP5 ) + if (destAnim >= LEGS_S5_LUP1 && destAnim <= LEGS_S5_LUP5) {//going into left side up destAnim = LEGS_S5_LUP1; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; } - else if ( destAnim >= LEGS_S5_RUP1 && destAnim <= LEGS_S5_RUP5 ) + else if (destAnim >= LEGS_S5_RUP1 && destAnim <= LEGS_S5_RUP5) {//going into right side up destAnim = LEGS_S5_RUP1; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; @@ -7749,12 +7774,12 @@ qboolean PM_AdjustStandAnimForSlope( void ) } break; case BOTH_SABERDUAL_STANCE: - if ( destAnim >= LEGS_S6_LUP1 && destAnim <= LEGS_S6_LUP5 ) + if (destAnim >= LEGS_S6_LUP1 && destAnim <= LEGS_S6_LUP5) {//going into left side up destAnim = LEGS_S6_LUP1; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; } - else if ( destAnim >= LEGS_S6_RUP1 && destAnim <= LEGS_S6_RUP5 ) + else if (destAnim >= LEGS_S6_RUP1 && destAnim <= LEGS_S6_RUP5) {//going into right side up destAnim = LEGS_S6_RUP1; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; @@ -7765,12 +7790,12 @@ qboolean PM_AdjustStandAnimForSlope( void ) } break; case BOTH_SABERSTAFF_STANCE: - if ( destAnim >= LEGS_S7_LUP1 && destAnim <= LEGS_S7_LUP5 ) + if (destAnim >= LEGS_S7_LUP1 && destAnim <= LEGS_S7_LUP5) {//going into left side up destAnim = LEGS_S7_LUP1; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; } - else if ( destAnim >= LEGS_S7_RUP1 && destAnim <= LEGS_S7_RUP5 ) + else if (destAnim >= LEGS_S7_RUP1 && destAnim <= LEGS_S7_RUP5) {//going into right side up destAnim = LEGS_S7_RUP1; pm->gent->client->slopeRecalcTime = level.time + SLOPE_RECALC_INT; @@ -7788,108 +7813,108 @@ qboolean PM_AdjustStandAnimForSlope( void ) } } //step 7: set the anim - PM_SetAnim( pm, SETANIM_LEGS, destAnim, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_LEGS, destAnim, SETANIM_FLAG_NORMAL); return qtrue; } -void PM_JetPackAnim( void ) +void PM_JetPackAnim(void) { - if ( !PM_ForceJumpingAnim( pm->ps->legsAnim ) )//haven't started forcejump yet + if (!PM_ForceJumpingAnim(pm->ps->legsAnim))//haven't started forcejump yet { - vec3_t facingFwd, facingRight, facingAngles = {0, pm->ps->viewangles[YAW], 0}; + vec3_t facingFwd, facingRight, facingAngles = { 0, pm->ps->viewangles[YAW], 0 }; int anim = BOTH_FORCEJUMP1; - AngleVectors( facingAngles, facingFwd, facingRight, NULL ); - float dotR = DotProduct( facingRight, pm->ps->velocity ); - float dotF = DotProduct( facingFwd, pm->ps->velocity ); - if ( fabs(dotR) > fabs(dotF) * 1.5 ) + AngleVectors(facingAngles, facingFwd, facingRight, NULL); + float dotR = DotProduct(facingRight, pm->ps->velocity); + float dotF = DotProduct(facingFwd, pm->ps->velocity); + if (fabs(dotR) > fabs(dotF) * 1.5) { - if ( dotR > 150 ) + if (dotR > 150) { anim = BOTH_FORCEJUMPRIGHT1; } - else if ( dotR < -150 ) + else if (dotR < -150) { anim = BOTH_FORCEJUMPLEFT1; } } else { - if ( dotF > 150 ) + if (dotF > 150) { anim = BOTH_FORCEJUMP1; } - else if ( dotF < -150 ) + else if (dotF < -150) { anim = BOTH_FORCEJUMPBACK1; } } int parts = SETANIM_BOTH; - if ( pm->ps->weaponTime ) + if (pm->ps->weaponTime) {//FIXME: really only care if we're in a saber attack anim... parts = SETANIM_LEGS; } - PM_SetAnim( pm, parts, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, parts, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } /* else { - if ( !pm->ps->legsAnimTimer ) - {//not in the middle of a legsAnim - int anim = pm->ps->legsAnim; - int newAnim = -1; - switch ( anim ) - { - case BOTH_FORCEJUMP1: - newAnim = BOTH_FORCELAND1;//BOTH_FORCEINAIR1; - break; - case BOTH_FORCEJUMPBACK1: - newAnim = BOTH_FORCELANDBACK1;//BOTH_FORCEINAIRBACK1; - break; - case BOTH_FORCEJUMPLEFT1: - newAnim = BOTH_FORCELANDLEFT1;//BOTH_FORCEINAIRLEFT1; - break; - case BOTH_FORCEJUMPRIGHT1: - newAnim = BOTH_FORCELANDRIGHT1;//BOTH_FORCEINAIRRIGHT1; - break; - } - if ( newAnim != -1 ) - { - int parts = SETANIM_BOTH; - if ( pm->ps->weaponTime ) - {//FIXME: really only care if we're in a saber attack anim... - parts = SETANIM_LEGS; - } + if ( !pm->ps->legsAnimTimer ) + {//not in the middle of a legsAnim + int anim = pm->ps->legsAnim; + int newAnim = -1; + switch ( anim ) + { + case BOTH_FORCEJUMP1: + newAnim = BOTH_FORCELAND1;//BOTH_FORCEINAIR1; + break; + case BOTH_FORCEJUMPBACK1: + newAnim = BOTH_FORCELANDBACK1;//BOTH_FORCEINAIRBACK1; + break; + case BOTH_FORCEJUMPLEFT1: + newAnim = BOTH_FORCELANDLEFT1;//BOTH_FORCEINAIRLEFT1; + break; + case BOTH_FORCEJUMPRIGHT1: + newAnim = BOTH_FORCELANDRIGHT1;//BOTH_FORCEINAIRRIGHT1; + break; + } + if ( newAnim != -1 ) + { + int parts = SETANIM_BOTH; + if ( pm->ps->weaponTime ) + {//FIXME: really only care if we're in a saber attack anim... + parts = SETANIM_LEGS; + } - PM_SetAnim( pm, parts, newAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - } - } + PM_SetAnim( pm, parts, newAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + } + } } */ } -void PM_SwimFloatAnim( void ) +void PM_SwimFloatAnim(void) { int legsAnim = pm->ps->legsAnim; //FIXME: no start or stop anims - if ( pm->cmd.forwardmove || pm->cmd.rightmove || pm->cmd.upmove ) + if (pm->cmd.forwardmove || pm->cmd.rightmove || pm->cmd.upmove) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_SWIMFORWARD,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_SWIMFORWARD, SETANIM_FLAG_NORMAL); } else {//stopping - if ( legsAnim == BOTH_SWIMFORWARD ) - {//I was swimming - if ( !pm->ps->legsAnimTimer ) + if (legsAnim == BOTH_SWIMFORWARD) + {//I was swimming + if (!pm->ps->legsAnimTimer) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_SWIM_IDLE1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_SWIM_IDLE1, SETANIM_FLAG_NORMAL); } } else {//idle - if ( !(pm->ps->pm_flags&PMF_DUCKED) && pm->cmd.upmove >= 0 ) + if (!(pm->ps->pm_flags&PMF_DUCKED) && pm->cmd.upmove >= 0) {//not crouching - PM_SetAnim(pm,SETANIM_LEGS,BOTH_SWIM_IDLE1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_SWIM_IDLE1, SETANIM_FLAG_NORMAL); } } } @@ -7900,7 +7925,7 @@ void PM_SwimFloatAnim( void ) PM_Footsteps =============== */ -static void PM_Footsteps( void ) +static void PM_Footsteps(void) { float bobmove; int old, oldAnim; @@ -7909,19 +7934,19 @@ static void PM_Footsteps( void ) qboolean flipping = qfalse; int setAnimFlags = SETANIM_FLAG_NORMAL; - if( pm->gent == NULL || pm->gent->client == NULL ) + if (pm->gent == NULL || pm->gent->client == NULL) return; - if ( (pm->ps->eFlags&EF_HELD_BY_WAMPA) ) + if ((pm->ps->eFlags&EF_HELD_BY_WAMPA)) { - PM_SetAnim( pm, SETANIM_BOTH, BOTH_HANG_IDLE, SETANIM_FLAG_NORMAL ); - if ( pm->ps->legsAnim == BOTH_HANG_IDLE ) + PM_SetAnim(pm, SETANIM_BOTH, BOTH_HANG_IDLE, SETANIM_FLAG_NORMAL); + if (pm->ps->legsAnim == BOTH_HANG_IDLE) { - if ( pm->ps->torsoAnimTimer < 100 ) + if (pm->ps->torsoAnimTimer < 100) { pm->ps->torsoAnimTimer = 100; } - if ( pm->ps->legsAnimTimer < 100 ) + if (pm->ps->legsAnimTimer < 100) { pm->ps->legsAnimTimer = 100; } @@ -7929,21 +7954,21 @@ static void PM_Footsteps( void ) return; } - if ( PM_SpinningSaberAnim( pm->ps->legsAnim ) && pm->ps->legsAnimTimer ) + if (PM_SpinningSaberAnim(pm->ps->legsAnim) && pm->ps->legsAnimTimer) {//spinning return; } - if ( PM_InKnockDown( pm->ps ) || PM_InRoll( pm->ps )) + if (PM_InKnockDown(pm->ps) || PM_InRoll(pm->ps)) {//in knockdown return; } - if ( (pm->ps->eFlags&EF_FORCE_DRAINED) ) + if ((pm->ps->eFlags&EF_FORCE_DRAINED)) {//being drained //PM_SetAnim( pm, SETANIM_LEGS, BOTH_HUGGEE1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); return; } - if ( (pm->ps->forcePowersActive&(1<ps->forceDrainEntityNum < ENTITYNUM_WORLD ) + if ((pm->ps->forcePowersActive&(1 << FP_DRAIN)) + && pm->ps->forceDrainEntityNum < ENTITYNUM_WORLD) {//draining //PM_SetAnim( pm, SETANIM_LEGS, BOTH_HUGGER1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); return; @@ -7953,7 +7978,7 @@ static void PM_Footsteps( void ) return; } - if( pm->gent->NPC != NULL ) + if (pm->gent->NPC != NULL) { validNPC = qtrue; } @@ -7965,34 +7990,34 @@ static void PM_Footsteps( void ) // calculate speed and cycle to be used for // all cyclic walking effects // - pm->xyspeed = sqrt( pm->ps->velocity[0] * pm->ps->velocity[0] - + pm->ps->velocity[1] * pm->ps->velocity[1] ); + pm->xyspeed = sqrt(pm->ps->velocity[0] * pm->ps->velocity[0] + + pm->ps->velocity[1] * pm->ps->velocity[1]); - if ( pm->ps->legsAnim == BOTH_FLIP_F || + if (pm->ps->legsAnim == BOTH_FLIP_F || pm->ps->legsAnim == BOTH_FLIP_B || pm->ps->legsAnim == BOTH_FLIP_L || pm->ps->legsAnim == BOTH_FLIP_R || pm->ps->legsAnim == BOTH_ALORA_FLIP_1 || pm->ps->legsAnim == BOTH_ALORA_FLIP_2 || - pm->ps->legsAnim == BOTH_ALORA_FLIP_3 ) + pm->ps->legsAnim == BOTH_ALORA_FLIP_3) { flipping = qtrue; } - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE - || ( pm->watertype & CONTENTS_LADDER ) - || pm->ps->waterHeightLevel >= WHL_TORSO ) + if (pm->ps->groundEntityNum == ENTITYNUM_NONE + || (pm->watertype & CONTENTS_LADDER) + || pm->ps->waterHeightLevel >= WHL_TORSO) {//in air or submerged in water or in ladder // airborne leaves position in cycle intact, but doesn't advance - if ( pm->waterlevel > 0 ) + if (pm->waterlevel > 0) { - if ( pm->watertype & CONTENTS_LADDER ) + if (pm->watertype & CONTENTS_LADDER) {//FIXME: check for watertype, save waterlevel for whether to play //the get off ladder transition anim! - if ( pm->ps->velocity[2] ) + if (pm->ps->velocity[2]) {//going up or down it int anim; - if ( pm->ps->velocity[2] > 0 ) + if (pm->ps->velocity[2] > 0) { anim = BOTH_LADDER_UP1; } @@ -8000,10 +8025,10 @@ static void PM_Footsteps( void ) { anim = BOTH_LADDER_DWN1; } - PM_SetAnim( pm, SETANIM_LEGS, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - if ( pm->waterlevel >= 2 ) //arms on ladder + PM_SetAnim(pm, SETANIM_LEGS, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + if (pm->waterlevel >= 2) //arms on ladder { - PM_SetAnim( pm, SETANIM_TORSO, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_TORSO, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } if (fabs(pm->ps->velocity[2]) >5) { bobmove = 0.005 * fabs(pm->ps->velocity[2]); // climbing bobs slow @@ -8014,79 +8039,79 @@ static void PM_Footsteps( void ) } else { - PM_SetAnim( pm, SETANIM_LEGS, BOTH_LADDER_IDLE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART ); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_LADDER_IDLE, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_RESTART); pm->ps->legsAnimTimer += 300; - if ( pm->waterlevel >= 2 ) //arms on ladder + if (pm->waterlevel >= 2) //arms on ladder { - PM_SetAnim( pm, SETANIM_TORSO, BOTH_LADDER_IDLE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_LADDER_IDLE, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_RESTART); pm->ps->torsoAnimTimer += 300; } } return; } - else if ( pm->ps->waterHeightLevel >= WHL_TORSO - && ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) - ||pm->ps->weapon==WP_SABER||pm->ps->weapon==WP_NONE||pm->ps->weapon==WP_MELEE) )//pm->waterlevel > 1 ) //in deep water + else if (pm->ps->waterHeightLevel >= WHL_TORSO + && ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + || pm->ps->weapon == WP_SABER || pm->ps->weapon == WP_NONE || pm->ps->weapon == WP_MELEE))//pm->waterlevel > 1 ) //in deep water { - if ( !PM_ForceJumpingUp( pm->gent ) ) + if (!PM_ForceJumpingUp(pm->gent)) { - if ( pm->ps->groundEntityNum != ENTITYNUM_NONE && (pm->ps->pm_flags&PMF_DUCKED) ) + if (pm->ps->groundEntityNum != ENTITYNUM_NONE && (pm->ps->pm_flags&PMF_DUCKED)) { - if ( !flipping ) + if (!flipping) {//you can crouch under water if feet are on ground - if ( pm->cmd.forwardmove || pm->cmd.rightmove ) + if (pm->cmd.forwardmove || pm->cmd.rightmove) { - if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) + if (pm->ps->pm_flags & PMF_BACKWARDS_RUN) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_CROUCH1WALKBACK,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_CROUCH1WALKBACK, setAnimFlags); } else { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_CROUCH1WALK,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_CROUCH1WALK, setAnimFlags); } } else { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_CROUCH1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_CROUCH1, SETANIM_FLAG_NORMAL); } return; } } PM_SwimFloatAnim(); - if ( pm->ps->legsAnim != BOTH_SWIM_IDLE1 ) + if (pm->ps->legsAnim != BOTH_SWIM_IDLE1) {//moving old = pm->ps->bobCycle; bobmove = 0.15f; // swim is a slow cycle - pm->ps->bobCycle = (int)( old + bobmove * pml.msec ) & 255; + pm->ps->bobCycle = (int)(old + bobmove * pml.msec) & 255; // if we just crossed a cycle boundary, play an apropriate footstep event - if ( ( ( old + 64 ) ^ ( pm->ps->bobCycle + 64 ) ) & 128 ) + if (((old + 64) ^ (pm->ps->bobCycle + 64)) & 128) { - PM_AddEvent( EV_SWIM ); + PM_AddEvent(EV_SWIM); } } } return; } - else + else {//hmm, in water, but not high enough to swim //fall through to walk/run/stand - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) + if (pm->ps->groundEntityNum == ENTITYNUM_NONE) {//unless in the air //NOTE: this is a dupe of the code just below... for when you are not in the water at all - if ( pm->ps->pm_flags & PMF_DUCKED ) + if (pm->ps->pm_flags & PMF_DUCKED) { - if ( !flipping ) + if (!flipping) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_CROUCH1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_CROUCH1, SETANIM_FLAG_NORMAL); } } - else if ( pm->ps->gravity <= 0 )//FIXME: or just less than normal? + else if (pm->ps->gravity <= 0)//FIXME: or just less than normal? { - if ( pm->gent - && pm->gent->client - && (pm->gent->client->NPC_class == CLASS_BOBAFETT ||pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) - && pm->gent->client->moveType == MT_FLYSWIM ) + if (pm->gent + && pm->gent->client + && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) + && pm->gent->client->moveType == MT_FLYSWIM) {//flying around with jetpack //do something else? PM_JetPackAnim(); @@ -8100,21 +8125,21 @@ static void PM_Footsteps( void ) } } } - else + else { - if ( pm->ps->pm_flags & PMF_DUCKED ) + if (pm->ps->pm_flags & PMF_DUCKED) { - if ( !flipping ) + if (!flipping) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_CROUCH1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_CROUCH1, SETANIM_FLAG_NORMAL); } } - else if ( pm->ps->gravity <= 0 )//FIXME: or just less than normal? + else if (pm->ps->gravity <= 0)//FIXME: or just less than normal? { - if ( pm->gent - && pm->gent->client - && (pm->gent->client->NPC_class == CLASS_BOBAFETT||pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) - && pm->gent->client->moveType == MT_FLYSWIM ) + if (pm->gent + && pm->gent->client + && (pm->gent->client->NPC_class == CLASS_BOBAFETT || pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) + && pm->gent->client->moveType == MT_FLYSWIM) {//flying around with jetpack //do something else? PM_JetPackAnim(); @@ -8128,98 +8153,98 @@ static void PM_Footsteps( void ) } } - if ( PM_SwimmingAnim( pm->ps->legsAnim ) && pm->waterlevel < 2 ) + if (PM_SwimmingAnim(pm->ps->legsAnim) && pm->waterlevel < 2) {//legs are in swim anim, and not swimming, be sure to override it setAnimFlags |= SETANIM_FLAG_OVERRIDE; } // if not trying to move - if ( !pm->cmd.forwardmove && !pm->cmd.rightmove ) + if (!pm->cmd.forwardmove && !pm->cmd.rightmove) { - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ATST ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ATST) { - if ( !PM_AdjustStandAnimForSlope() ) + if (!PM_AdjustStandAnimForSlope()) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_STAND1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_STAND1, SETANIM_FLAG_NORMAL); } } - else if ( pm->ps->pm_flags & PMF_DUCKED ) + else if (pm->ps->pm_flags & PMF_DUCKED) { - if( !PM_InOnGroundAnim( pm->ps ) ) + if (!PM_InOnGroundAnim(pm->ps)) { - if ( !PM_AdjustStandAnimForSlope() ) + if (!PM_AdjustStandAnimForSlope()) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_CROUCH1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_CROUCH1, SETANIM_FLAG_NORMAL); } } - } + } else { - if ( pm->ps->legsAnimTimer && PM_LandingAnim( pm->ps->legsAnim ) ) + if (pm->ps->legsAnimTimer && PM_LandingAnim(pm->ps->legsAnim)) {//still in a landing anim, let it play return; } - if ( pm->ps->legsAnimTimer + if (pm->ps->legsAnimTimer && (pm->ps->legsAnim == BOTH_THERMAL_READY - ||pm->ps->legsAnim == BOTH_THERMAL_THROW - ||pm->ps->legsAnim == BOTH_ATTACK10) ) + || pm->ps->legsAnim == BOTH_THERMAL_THROW + || pm->ps->legsAnim == BOTH_ATTACK10)) {//still in a thermal anim, let it play return; } qboolean saberInAir = qtrue; - if ( pm->ps->saberInFlight ) + if (pm->ps->saberInFlight) {//guiding saber - if ( PM_SaberInBrokenParry( pm->ps->saberMove ) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim( pm->ps->torsoAnim ) ) + if (PM_SaberInBrokenParry(pm->ps->saberMove) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim(pm->ps->torsoAnim)) {//we're stuck in a broken parry saberInAir = qfalse; } - if ( pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0 )//player is 0 + if (pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0)//player is 0 {// - if ( &g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY ) + if (&g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY) {//fell to the ground and we're not trying to pull it back saberInAir = qfalse; } } } - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_GALAKMECH ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_GALAKMECH) {//NOTE: stand1 is with the helmet retracted, stand1to2 is the helmet going into place - PM_SetAnim( pm, SETANIM_BOTH, BOTH_STAND2, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_BOTH, BOTH_STAND2, SETANIM_FLAG_NORMAL); } - else if ( pm->ps->weapon == WP_SABER - && pm->ps->saberInFlight - && saberInAir + else if (pm->ps->weapon == WP_SABER + && pm->ps->saberInFlight + && saberInAir && (!pm->ps->dualSabers || !pm->ps->saber[1].Active())) { - if ( !PM_AdjustStandAnimForSlope() ) + if (!PM_AdjustStandAnimForSlope()) { - if ( pm->ps->legsAnim != BOTH_LOSE_SABER - || !pm->ps->legsAnimTimer ) + if (pm->ps->legsAnim != BOTH_LOSE_SABER + || !pm->ps->legsAnimTimer) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_SABERPULL,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_SABERPULL, SETANIM_FLAG_NORMAL); } } } - else if ( (pm->ps->weapon == WP_SABER + else if ((pm->ps->weapon == WP_SABER &&pm->ps->SaberLength()>0 - &&!pm->ps->saberInFlight - &&!PM_SaberDrawPutawayAnim( pm->ps->legsAnim )) ) + && !pm->ps->saberInFlight + &&!PM_SaberDrawPutawayAnim(pm->ps->legsAnim))) { - if ( !PM_AdjustStandAnimForSlope() ) + if (!PM_AdjustStandAnimForSlope()) { - int legsAnim; - if ( (pm->ps->torsoAnim == BOTH_SPINATTACK6 - || pm->ps->torsoAnim == BOTH_SPINATTACK7 - || PM_SaberInAttack( pm->ps->saberMove ) - || PM_SaberInTransitionAny( pm->ps->saberMove )) + int legsAnim; + if ((pm->ps->torsoAnim == BOTH_SPINATTACK6 + || pm->ps->torsoAnim == BOTH_SPINATTACK7 + || PM_SaberInAttack(pm->ps->saberMove) + || PM_SaberInTransitionAny(pm->ps->saberMove)) && pm->ps->legsAnim != BOTH_FORCELONGLEAP_LAND && (pm->ps->groundEntityNum == ENTITYNUM_NONE//in air - || (!PM_JumpingAnim( pm->ps->torsoAnim )&&!PM_InAirKickingAnim( pm->ps->torsoAnim ))) )//OR: on ground and torso not in a jump anim + || (!PM_JumpingAnim(pm->ps->torsoAnim) && !PM_InAirKickingAnim(pm->ps->torsoAnim))))//OR: on ground and torso not in a jump anim { legsAnim = pm->ps->torsoAnim; } else { - switch ( pm->ps->saberAnimLevel ) + switch (pm->ps->saberAnimLevel) { case SS_FAST: case SS_TAVION: @@ -8242,19 +8267,19 @@ static void PM_Footsteps( void ) break; } } - PM_SetAnim(pm,SETANIM_LEGS,legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, legsAnim, SETANIM_FLAG_NORMAL); } } - else if( (validNPC && pm->ps->weapon > WP_SABER && pm->ps->weapon < WP_DET_PACK ))// && pm->gent->client->race != RACE_BORG))//Being careful or carrying a 2-handed weapon + else if ((validNPC && pm->ps->weapon > WP_SABER && pm->ps->weapon < WP_DET_PACK))// && pm->gent->client->race != RACE_BORG))//Being careful or carrying a 2-handed weapon {//Squadmates use BOTH_STAND3 oldAnim = pm->ps->legsAnim; - if(oldAnim != BOTH_GUARD_LOOKAROUND1 && oldAnim != BOTH_GUARD_IDLE1 - && oldAnim != BOTH_STAND2TO4 - && oldAnim != BOTH_STAND4TO2 && oldAnim != BOTH_STAND4 ) + if (oldAnim != BOTH_GUARD_LOOKAROUND1 && oldAnim != BOTH_GUARD_IDLE1 + && oldAnim != BOTH_STAND2TO4 + && oldAnim != BOTH_STAND4TO2 && oldAnim != BOTH_STAND4) {//Don't auto-override the guard idles - if ( !PM_AdjustStandAnimForSlope() ) + if (!PM_AdjustStandAnimForSlope()) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_STAND3,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_STAND3, SETANIM_FLAG_NORMAL); //if(oldAnim != BOTH_STAND2 && pm->ps->legsAnim == BOTH_STAND2) //{ // pm->ps->legsAnimTimer = 500; @@ -8264,48 +8289,48 @@ static void PM_Footsteps( void ) } else { - if ( !PM_AdjustStandAnimForSlope() ) + if (!PM_AdjustStandAnimForSlope()) { // FIXME: Do we need this here... The imps stand is 4, not 1... - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_IMPERIAL ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_IMPERIAL) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_STAND4,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_STAND4, SETANIM_FLAG_NORMAL); } - else if ( pm->ps->weapon == WP_TUSKEN_STAFF ) + else if (pm->ps->weapon == WP_TUSKEN_STAFF) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_STAND1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_STAND1, SETANIM_FLAG_NORMAL); } else { - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR) { - if ( pm->gent->count ) + if (pm->gent->count) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_STAND4,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_STAND4, SETANIM_FLAG_NORMAL); } - else if ( pm->gent->enemy || pm->gent->wait ) + else if (pm->gent->enemy || pm->gent->wait) {//have an enemy or have had one since we spawned - PM_SetAnim(pm,SETANIM_LEGS,BOTH_STAND2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_STAND2, SETANIM_FLAG_NORMAL); } else { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_STAND1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_STAND1, SETANIM_FLAG_NORMAL); } } - else if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_WAMPA ) + else if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_WAMPA) { - if ( pm->gent->count ) + if (pm->gent->count) {//holding a victim - PM_SetAnim(pm,SETANIM_LEGS,BOTH_HOLD_IDLE/*BOTH_STAND2*/,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_HOLD_IDLE/*BOTH_STAND2*/, SETANIM_FLAG_NORMAL); } else {//not holding a victim - PM_SetAnim(pm,SETANIM_LEGS,BOTH_STAND1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_STAND1, SETANIM_FLAG_NORMAL); } } else { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_STAND1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_STAND1, SETANIM_FLAG_NORMAL); } } } @@ -8313,29 +8338,29 @@ static void PM_Footsteps( void ) } return; } - + //maybe call this every frame, even when moving? - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ATST ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ATST) { - PM_FootSlopeTrace( NULL, NULL ); + PM_FootSlopeTrace(NULL, NULL); } //trying to move laterally - if ( (pm->ps->eFlags&EF_IN_ATST) - || (pm->gent&&pm->gent->client&&pm->gent->client->NPC_class==CLASS_RANCOR)//does this catch NPCs, too? - || (pm->gent&&pm->gent->client&&pm->gent->client->NPC_class==CLASS_WAMPA) )//does this catch NPCs, too? + if ((pm->ps->eFlags&EF_IN_ATST) + || (pm->gent&&pm->gent->client&&pm->gent->client->NPC_class == CLASS_RANCOR)//does this catch NPCs, too? + || (pm->gent&&pm->gent->client&&pm->gent->client->NPC_class == CLASS_WAMPA))//does this catch NPCs, too? {//atst, Rancor & Wampa, only override turn anims on legs (no torso) - if ( pm->ps->legsAnim == BOTH_TURN_LEFT1 || - pm->ps->legsAnim == BOTH_TURN_RIGHT1 ) + if (pm->ps->legsAnim == BOTH_TURN_LEFT1 || + pm->ps->legsAnim == BOTH_TURN_RIGHT1) {//moving overrides turning setAnimFlags |= SETANIM_FLAG_OVERRIDE; } } else {//all other NPCs... - if ( (PM_InSaberAnim( pm->ps->legsAnim ) && !PM_SpinningSaberAnim( pm->ps->legsAnim )) - || PM_SaberStanceAnim( pm->ps->legsAnim ) - || PM_SaberDrawPutawayAnim( pm->ps->legsAnim ) + if ((PM_InSaberAnim(pm->ps->legsAnim) && !PM_SpinningSaberAnim(pm->ps->legsAnim)) + || PM_SaberStanceAnim(pm->ps->legsAnim) + || PM_SaberDrawPutawayAnim(pm->ps->legsAnim) || pm->ps->legsAnim == BOTH_SPINATTACK6//not a full-body spin, just spinning the saber || pm->ps->legsAnim == BOTH_SPINATTACK7//not a full-body spin, just spinning the saber || pm->ps->legsAnim == BOTH_BUTTON_HOLD @@ -8343,252 +8368,253 @@ static void PM_Footsteps( void ) || pm->ps->legsAnim == BOTH_THERMAL_READY || pm->ps->legsAnim == BOTH_THERMAL_THROW || pm->ps->legsAnim == BOTH_ATTACK10 - || PM_LandingAnim( pm->ps->legsAnim ) - || PM_PainAnim( pm->ps->legsAnim ) - || PM_ForceAnim( pm->ps->legsAnim )) + || PM_LandingAnim(pm->ps->legsAnim) + || PM_PainAnim(pm->ps->legsAnim) + || PM_ForceAnim(pm->ps->legsAnim)) {//legs are in a saber anim, and not spinning, be sure to override it setAnimFlags |= SETANIM_FLAG_OVERRIDE; } } - if ( pm->ps->pm_flags & PMF_DUCKED ) + if (pm->ps->pm_flags & PMF_DUCKED) { bobmove = 0.5; // ducked characters bob much faster - if( !PM_InOnGroundAnim( pm->ps ) //not on the ground - && ( !PM_InRollIgnoreTimer( pm->ps )||(!pm->ps->legsAnimTimer&&pm->cmd.upmove<0) ) )//not in a roll (or you just finished one and you're still holding crouch) + if (!PM_InOnGroundAnim(pm->ps) //not on the ground + && (!PM_InRollIgnoreTimer(pm->ps) || (!pm->ps->legsAnimTimer&&pm->cmd.upmove<0)))//not in a roll (or you just finished one and you're still holding crouch) { qboolean rolled = qfalse; - if ( ((PM_RunningAnim( pm->ps->legsAnim ) + + if (((PM_RunningAnim(pm->ps->legsAnim) || pm->ps->legsAnim == BOTH_FORCEHEAL_START - || PM_CanRollFromSoulCal( pm->ps )) && + || PM_CanRollFromSoulCal(pm->ps)) && (g_autoRoll->integer || pm->cmd.buttons&BUTTON_USE))) {//roll! rolled = PM_TryRoll(); } - if ( !rolled ) + if (!rolled) { - if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) + if (pm->ps->pm_flags & PMF_BACKWARDS_RUN) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_CROUCH1WALKBACK,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_CROUCH1WALKBACK, setAnimFlags); } else { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_CROUCH1WALK,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_CROUCH1WALK, setAnimFlags); } - if ( !Q_irand( 0, 19 ) ) + if (!Q_irand(0, 19)) {//5% chance of making an alert - AddSoundEvent( pm->gent, pm->ps->origin, 16, AEL_MINOR, qtrue, qtrue ); + AddSoundEvent(pm->gent, pm->ps->origin, 16, AEL_MINOR, qtrue, qtrue); } } else {//rolling is a little noisy - AddSoundEvent( pm->gent, pm->ps->origin, 128, AEL_MINOR, qtrue, qtrue ); + AddSoundEvent(pm->gent, pm->ps->origin, 128, AEL_MINOR, qtrue, qtrue); } } // ducked characters never play footsteps } - else if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) + else if (pm->ps->pm_flags & PMF_BACKWARDS_RUN) {//Moving backwards - if ( !( pm->cmd.buttons & BUTTON_WALKING ) ) + if (!(pm->cmd.buttons & BUTTON_WALKING)) {//running backwards bobmove = 0.4F; // faster speeds bob faster - if ( pm->ps->weapon == WP_SABER && pm->ps->SaberActive() ) + if (pm->ps->weapon == WP_SABER && pm->ps->SaberActive()) { /* if ( pm->ps->saberAnimLevel == SS_STAFF ) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_RUNBACK_STAFF,setAnimFlags); + PM_SetAnim(pm,SETANIM_LEGS,BOTH_RUNBACK_STAFF,setAnimFlags); } else */ { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_RUNBACK2,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_RUNBACK2, setAnimFlags); } } - else if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + else if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR) {//no run anim - PM_SetAnim(pm,SETANIM_LEGS,BOTH_WALKBACK1,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_WALKBACK1, setAnimFlags); } else { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_RUNBACK1,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_RUNBACK1, setAnimFlags); } footstep = qtrue; - } - else + } + else {//walking backwards bobmove = 0.3F; // faster speeds bob faster - if ( pm->ps->weapon == WP_SABER && pm->ps->SaberActive() ) + if (pm->ps->weapon == WP_SABER && pm->ps->SaberActive()) { - if ( pm->ps->saberAnimLevel == SS_DUAL ) + if (pm->ps->saberAnimLevel == SS_DUAL) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_WALKBACK_DUAL,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_WALKBACK_DUAL, setAnimFlags); } - else if ( pm->ps->saberAnimLevel == SS_STAFF ) + else if (pm->ps->saberAnimLevel == SS_STAFF) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_WALKBACK_STAFF,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_WALKBACK_STAFF, setAnimFlags); } else { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_WALKBACK2,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_WALKBACK2, setAnimFlags); } } else { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_WALKBACK1,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_WALKBACK1, setAnimFlags); } - if ( !Q_irand( 0, 9 ) ) + if (!Q_irand(0, 9)) {//10% chance of a small alert, mainly for the sand_creature - AddSoundEvent( pm->gent, pm->ps->origin, 16, AEL_MINOR, qtrue, qtrue ); + AddSoundEvent(pm->gent, pm->ps->origin, 16, AEL_MINOR, qtrue, qtrue); } } } - else + else { - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_GALAKMECH ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_GALAKMECH) { bobmove = 0.3F; // walking bobs slow - if ( pm->ps->weapon == WP_NONE ) + if (pm->ps->weapon == WP_NONE) {//helmet retracted - PM_SetAnim( pm, SETANIM_BOTH, BOTH_WALK1, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_BOTH, BOTH_WALK1, SETANIM_FLAG_NORMAL); } else {//helmet in place - PM_SetAnim( pm, SETANIM_BOTH, BOTH_WALK2, SETANIM_FLAG_NORMAL ); + PM_SetAnim(pm, SETANIM_BOTH, BOTH_WALK2, SETANIM_FLAG_NORMAL); } - AddSoundEvent( pm->gent, pm->ps->origin, 128, AEL_SUSPICIOUS, qtrue, qtrue ); + AddSoundEvent(pm->gent, pm->ps->origin, 128, AEL_SUSPICIOUS, qtrue, qtrue); } else { - if ( !( pm->cmd.buttons & BUTTON_WALKING ) ) + if (!(pm->cmd.buttons & BUTTON_WALKING)) {//running bobmove = 0.4F; // faster speeds bob faster - if ( pm->ps->weapon == WP_SABER && pm->ps->SaberActive() ) + if (pm->ps->weapon == WP_SABER && pm->ps->SaberActive()) { - if ( pm->ps->saberAnimLevel == SS_DUAL ) + if (pm->ps->saberAnimLevel == SS_DUAL) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_RUN_DUAL,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_RUN_DUAL, setAnimFlags); } - else if ( pm->ps->saberAnimLevel == SS_STAFF ) + else if (pm->ps->saberAnimLevel == SS_STAFF) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_RUN_STAFF,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_RUN_STAFF, setAnimFlags); } else { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_RUN2,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_RUN2, setAnimFlags); } } else { - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_JAWA ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_JAWA) { //if ( pm->gent->enemy && (pm->ps->weapon == WP_NONE || pm->ps->weapon == WP_MELEE) ) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_RUN4,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_RUN4, setAnimFlags); } /* else { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_RUN1,setAnimFlags); + PM_SetAnim(pm,SETANIM_LEGS,BOTH_RUN1,setAnimFlags); } */ } - else if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ATST ) + else if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ATST) { - if ( pm->ps->legsAnim != BOTH_RUN1 ) + if (pm->ps->legsAnim != BOTH_RUN1) { - if ( pm->ps->legsAnim != BOTH_RUN1START ) + if (pm->ps->legsAnim != BOTH_RUN1START) {//Hmm, he should really start slow and have to accelerate... also need to do this for stopping - PM_SetAnim( pm,SETANIM_LEGS, BOTH_RUN1START, setAnimFlags|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_RUN1START, setAnimFlags | SETANIM_FLAG_HOLD); } - else if ( !pm->ps->legsAnimTimer ) + else if (!pm->ps->legsAnimTimer) { - PM_SetAnim( pm, SETANIM_LEGS, BOTH_RUN1, setAnimFlags ); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_RUN1, setAnimFlags); } } else { - PM_SetAnim( pm, SETANIM_LEGS, BOTH_RUN1, setAnimFlags ); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_RUN1, setAnimFlags); } } - else if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_WAMPA ) + else if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_WAMPA) { - if ( pm->gent->NPC && pm->gent->NPC->stats.runSpeed == 300 ) + if (pm->gent->NPC && pm->gent->NPC->stats.runSpeed == 300) {//full on run, on all fours - PM_SetAnim(pm,SETANIM_LEGS,BOTH_RUN1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_RUN1, SETANIM_FLAG_NORMAL); } else {//regular, upright run - PM_SetAnim(pm,SETANIM_LEGS,BOTH_RUN2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_RUN2, SETANIM_FLAG_NORMAL); } } - else if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR ) + else if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_RANCOR) {//no run anim - PM_SetAnim( pm, SETANIM_LEGS, BOTH_WALK1, setAnimFlags ); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_WALK1, setAnimFlags); } else { - PM_SetAnim( pm, SETANIM_LEGS, BOTH_RUN1, setAnimFlags ); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_RUN1, setAnimFlags); } } footstep = qtrue; - } - else + } + else {//walking forward bobmove = 0.3F; // walking bobs slow - if ( pm->ps->weapon == WP_SABER && pm->ps->SaberActive() ) + if (pm->ps->weapon == WP_SABER && pm->ps->SaberActive()) { - if ( pm->ps->saberAnimLevel == SS_DUAL ) + if (pm->ps->saberAnimLevel == SS_DUAL) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_WALK_DUAL,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_WALK_DUAL, setAnimFlags); } - else if ( pm->ps->saberAnimLevel == SS_STAFF ) + else if (pm->ps->saberAnimLevel == SS_STAFF) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_WALK_STAFF,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_WALK_STAFF, setAnimFlags); } else { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_WALK2,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_WALK2, setAnimFlags); } } - else if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_WAMPA ) + else if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_WAMPA) { - if ( pm->gent->health <= 50 ) + if (pm->gent->health <= 50) {//hurt walk - PM_SetAnim(pm,SETANIM_LEGS,BOTH_WALK2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_WALK2, SETANIM_FLAG_NORMAL); } else {//normal walk - PM_SetAnim(pm,SETANIM_LEGS,BOTH_WALK1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_WALK1, SETANIM_FLAG_NORMAL); } } else { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_WALK1,setAnimFlags); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_WALK1, setAnimFlags); } //Enemy NPCs always make footsteps for the benefit of the player - if ( pm->gent - && pm->gent->NPC - && pm->gent->client - && pm->gent->client->playerTeam != TEAM_PLAYER ) + if (pm->gent + && pm->gent->NPC + && pm->gent->client + && pm->gent->client->playerTeam != TEAM_PLAYER) { footstep = qtrue; } - else if ( !Q_irand( 0, 9 ) ) + else if (!Q_irand(0, 9)) {//10% chance of a small alert, mainly for the sand_creature - AddSoundEvent( pm->gent, pm->ps->origin, 16, AEL_MINOR, qtrue, qtrue ); + AddSoundEvent(pm->gent, pm->ps->origin, 16, AEL_MINOR, qtrue, qtrue); } } } } - if(pm->gent != NULL) + if (pm->gent != NULL) { - if( pm->gent->client->renderInfo.legsFpsMod > 2 ) + if (pm->gent->client->renderInfo.legsFpsMod > 2) { pm->gent->client->renderInfo.legsFpsMod = 2; } - else if(pm->gent->client->renderInfo.legsFpsMod < 0.5) + else if (pm->gent->client->renderInfo.legsFpsMod < 0.5) { pm->gent->client->renderInfo.legsFpsMod = 0.5; } @@ -8598,100 +8624,101 @@ static void PM_Footsteps( void ) // check for footstep / splash sounds old = pm->ps->bobCycle; - pm->ps->bobCycle = (int)( old + bobmove * pml.msec ) & 255; + pm->ps->bobCycle = (int)(old + bobmove * pml.msec) & 255; // if we just crossed a cycle boundary, play an apropriate footstep event - if ( ( ( old + 64 ) ^ ( pm->ps->bobCycle + 64 ) ) & 128 ) + if (((old + 64) ^ (pm->ps->bobCycle + 64)) & 128) { - if ( pm->watertype & CONTENTS_LADDER ) + if (pm->watertype & CONTENTS_LADDER) { - if ( !pm->noFootsteps ) + if (!pm->noFootsteps) { if (pm->ps->groundEntityNum == ENTITYNUM_NONE) {// on ladder - PM_AddEvent( EV_FOOTSTEP_METAL ); - } else { + PM_AddEvent(EV_FOOTSTEP_METAL); + } + else { //PM_AddEvent( PM_FootstepForSurface() ); //still on ground } } - if ( pm->gent && pm->gent->s.number == 0 ) + if (pm->gent && pm->gent->s.number == 0) { -// if ( pm->gent->client && pm->gent->client->playerTeam != TEAM_DISGUISE ) + // if ( pm->gent->client && pm->gent->client->playerTeam != TEAM_DISGUISE ) { - AddSoundEvent( pm->gent, pm->ps->origin, 128, AEL_MINOR, qtrue ); + AddSoundEvent(pm->gent, pm->ps->origin, 128, AEL_MINOR, qtrue); } } } - else if ( pm->waterlevel == 0 ) + else if (pm->waterlevel == 0) { // on ground will only play sounds if running - if ( footstep ) + if (footstep) { - if ( !pm->noFootsteps ) + if (!pm->noFootsteps) { //PM_AddEvent( PM_FootstepForSurface() ); } - if ( pm->gent && pm->gent->s.number == 0 ) + if (pm->gent && pm->gent->s.number == 0) { vec3_t bottom; - VectorCopy( pm->ps->origin, bottom ); + VectorCopy(pm->ps->origin, bottom); bottom[2] += pm->mins[2]; -// if ( pm->gent->client && pm->gent->client->playerTeam != TEAM_DISGUISE ) + // if ( pm->gent->client && pm->gent->client->playerTeam != TEAM_DISGUISE ) { - AddSoundEvent( pm->gent, bottom, 256, AEL_MINOR, qtrue, qtrue ); + AddSoundEvent(pm->gent, bottom, 256, AEL_MINOR, qtrue, qtrue); } } } - } - else if ( pm->waterlevel == 1 ) + } + else if (pm->waterlevel == 1) { // splashing - if ( pm->ps->waterHeightLevel >= WHL_KNEES ) + if (pm->ps->waterHeightLevel >= WHL_KNEES) { - PM_AddEvent( EV_FOOTWADE ); + PM_AddEvent(EV_FOOTWADE); } else { - PM_AddEvent( EV_FOOTSPLASH ); + PM_AddEvent(EV_FOOTSPLASH); } - if ( pm->gent && pm->gent->s.number == 0 ) + if (pm->gent && pm->gent->s.number == 0) { vec3_t bottom; - VectorCopy( pm->ps->origin, bottom ); + VectorCopy(pm->ps->origin, bottom); bottom[2] += pm->mins[2]; -// if ( pm->gent->client && pm->gent->client->playerTeam != TEAM_DISGUISE ) + // if ( pm->gent->client && pm->gent->client->playerTeam != TEAM_DISGUISE ) { - AddSoundEvent( pm->gent, pm->ps->origin, 384, AEL_SUSPICIOUS, qfalse, qtrue );//was bottom - AddSightEvent( pm->gent, pm->ps->origin, 512, AEL_MINOR ); + AddSoundEvent(pm->gent, pm->ps->origin, 384, AEL_SUSPICIOUS, qfalse, qtrue);//was bottom + AddSightEvent(pm->gent, pm->ps->origin, 512, AEL_MINOR); } } - } - else if ( pm->waterlevel == 2 ) + } + else if (pm->waterlevel == 2) { // wading / swimming at surface /* if ( pm->ps->waterHeightLevel >= WHL_TORSO ) { - PM_AddEvent( EV_SWIM ); + PM_AddEvent( EV_SWIM ); } else */ { - PM_AddEvent( EV_FOOTWADE ); + PM_AddEvent(EV_FOOTWADE); } - if ( pm->gent && pm->gent->s.number == 0 ) + if (pm->gent && pm->gent->s.number == 0) { -// if ( pm->gent->client && pm->gent->client->playerTeam != TEAM_DISGUISE ) + // if ( pm->gent->client && pm->gent->client->playerTeam != TEAM_DISGUISE ) { - AddSoundEvent( pm->gent, pm->ps->origin, 256, AEL_MINOR, qfalse, qtrue ); - AddSightEvent( pm->gent, pm->ps->origin, 512, AEL_SUSPICIOUS ); + AddSoundEvent(pm->gent, pm->ps->origin, 256, AEL_MINOR, qfalse, qtrue); + AddSightEvent(pm->gent, pm->ps->origin, 512, AEL_SUSPICIOUS); } } } else {// or no sound when completely underwater...? - PM_AddEvent( EV_SWIM ); + PM_AddEvent(EV_SWIM); } } } @@ -8703,11 +8730,11 @@ PM_WaterEvents Generate sound events for entering and leaving water ============== */ -static void PM_WaterEvents( void ) { // FIXME? - +static void PM_WaterEvents(void) { // FIXME? + qboolean impact_splash = qfalse; - if ( pm->watertype & CONTENTS_LADDER ) //fake water for ladder + if (pm->watertype & CONTENTS_LADDER) //fake water for ladder { return; } @@ -8716,25 +8743,25 @@ static void PM_WaterEvents( void ) { // FIXME? // if (!pml.previous_waterlevel && pm->waterlevel) { - if ( (pm->watertype&CONTENTS_LAVA) ) + if ((pm->watertype&CONTENTS_LAVA)) { - PM_AddEvent( EV_LAVA_TOUCH ); + PM_AddEvent(EV_LAVA_TOUCH); } else { - PM_AddEvent( EV_WATER_TOUCH ); + PM_AddEvent(EV_WATER_TOUCH); } - if ( pm->gent ) + if (pm->gent) { - if ( VectorLengthSquared( pm->ps->velocity ) > 40000 ) + if (VectorLengthSquared(pm->ps->velocity) > 40000) { impact_splash = qtrue; } - if ( pm->ps->clientNum < MAX_CLIENTS ) + if (pm->ps->clientNum < MAX_CLIENTS) { - AddSoundEvent( pm->gent, pm->ps->origin, 384, AEL_SUSPICIOUS ); - AddSightEvent( pm->gent, pm->ps->origin, 512, AEL_SUSPICIOUS ); + AddSoundEvent(pm->gent, pm->ps->origin, 384, AEL_SUSPICIOUS); + AddSightEvent(pm->gent, pm->ps->origin, 512, AEL_SUSPICIOUS); } } } @@ -8744,56 +8771,56 @@ static void PM_WaterEvents( void ) { // FIXME? // if (pml.previous_waterlevel && !pm->waterlevel) { - if ( (pm->watertype&CONTENTS_LAVA) ) + if ((pm->watertype&CONTENTS_LAVA)) { - PM_AddEvent( EV_LAVA_LEAVE ); + PM_AddEvent(EV_LAVA_LEAVE); } else { - PM_AddEvent( EV_WATER_LEAVE ); + PM_AddEvent(EV_WATER_LEAVE); } - if ( pm->gent && VectorLengthSquared( pm->ps->velocity ) > 40000 ) + if (pm->gent && VectorLengthSquared(pm->ps->velocity) > 40000) { impact_splash = qtrue; } - if ( pm->gent && pm->ps->clientNum < MAX_CLIENTS ) + if (pm->gent && pm->ps->clientNum < MAX_CLIENTS) { - AddSoundEvent( pm->gent, pm->ps->origin, 384, AEL_SUSPICIOUS ); - AddSightEvent( pm->gent, pm->ps->origin, 512, AEL_SUSPICIOUS ); + AddSoundEvent(pm->gent, pm->ps->origin, 384, AEL_SUSPICIOUS); + AddSightEvent(pm->gent, pm->ps->origin, 512, AEL_SUSPICIOUS); } } - if ( impact_splash ) + if (impact_splash) { //play the splash effect trace_t tr; vec3_t axis[3], angs, start, end; - VectorSet( angs, 0, pm->gent->currentAngles[YAW], 0 ); - AngleVectors( angs, axis[2], axis[1], axis[0] ); + VectorSet(angs, 0, pm->gent->currentAngles[YAW], 0); + AngleVectors(angs, axis[2], axis[1], axis[0]); - VectorCopy( pm->ps->origin, start ); - VectorCopy( pm->ps->origin, end ); + VectorCopy(pm->ps->origin, start); + VectorCopy(pm->ps->origin, end); // FIXME: set start and end better start[2] += 10; end[2] -= 40; - gi.trace( &tr, start, vec3_origin, vec3_origin, end, pm->gent->s.number, MASK_WATER, (EG2_Collision)0, 0 ); + gi.trace(&tr, start, vec3_origin, vec3_origin, end, pm->gent->s.number, MASK_WATER, (EG2_Collision)0, 0); - if ( tr.fraction < 1.0f ) + if (tr.fraction < 1.0f) { - if ( (tr.contents&CONTENTS_LAVA) ) + if ((tr.contents&CONTENTS_LAVA)) { - G_PlayEffect( "env/lava_splash", tr.endpos, axis ); + G_PlayEffect("env/lava_splash", tr.endpos, axis); } - else if ( (tr.contents&CONTENTS_SLIME) ) + else if ((tr.contents&CONTENTS_SLIME)) { - G_PlayEffect( "env/acid_splash", tr.endpos, axis ); + G_PlayEffect("env/acid_splash", tr.endpos, axis); } else //must be water { - G_PlayEffect( "env/water_impact", tr.endpos, axis ); + G_PlayEffect("env/water_impact", tr.endpos, axis); } } } @@ -8802,19 +8829,19 @@ static void PM_WaterEvents( void ) { // FIXME? // check for head just going under water // if (pml.previous_waterlevel != 3 && pm->waterlevel == 3) { - if ( (pm->watertype&CONTENTS_LAVA) ) + if ((pm->watertype&CONTENTS_LAVA)) { - PM_AddEvent( EV_LAVA_UNDER ); + PM_AddEvent(EV_LAVA_UNDER); } else { - PM_AddEvent( EV_WATER_UNDER ); + PM_AddEvent(EV_WATER_UNDER); } - if ( pm->gent && pm->ps->clientNum < MAX_CLIENTS ) + if (pm->gent && pm->ps->clientNum < MAX_CLIENTS) { - AddSoundEvent( pm->gent, pm->ps->origin, 256, AEL_MINOR ); - AddSightEvent( pm->gent, pm->ps->origin, 384, AEL_MINOR ); + AddSoundEvent(pm->gent, pm->ps->origin, 256, AEL_MINOR); + AddSightEvent(pm->gent, pm->ps->origin, 384, AEL_MINOR); } } @@ -8822,25 +8849,25 @@ static void PM_WaterEvents( void ) { // FIXME? // check for head just coming out of water // if (pml.previous_waterlevel == 3 && pm->waterlevel != 3) { - if ( !pm->gent || !pm->gent->client || pm->gent->client->airOutTime < level.time + 2000 ) + if (!pm->gent || !pm->gent->client || pm->gent->client->airOutTime < level.time + 2000) {//only do this if we were drowning or about to start drowning - PM_AddEvent( EV_WATER_CLEAR ); + PM_AddEvent(EV_WATER_CLEAR); } else { - if ( (pm->watertype&CONTENTS_LAVA) ) + if ((pm->watertype&CONTENTS_LAVA)) { - PM_AddEvent( EV_LAVA_LEAVE ); + PM_AddEvent(EV_LAVA_LEAVE); } else { - PM_AddEvent( EV_WATER_LEAVE ); + PM_AddEvent(EV_WATER_LEAVE); } } - if ( pm->gent && pm->ps->clientNum < MAX_CLIENTS ) + if (pm->gent && pm->ps->clientNum < MAX_CLIENTS) { - AddSoundEvent( pm->gent, pm->ps->origin, 256, AEL_MINOR ); - AddSightEvent( pm->gent, pm->ps->origin, 384, AEL_SUSPICIOUS ); + AddSoundEvent(pm->gent, pm->ps->origin, 256, AEL_MINOR); + AddSightEvent(pm->gent, pm->ps->origin, 384, AEL_SUSPICIOUS); } } } @@ -8851,70 +8878,70 @@ static void PM_WaterEvents( void ) { // FIXME? PM_BeginWeaponChange =============== */ -static void PM_BeginWeaponChange( int weapon ) { +static void PM_BeginWeaponChange(int weapon) { - if ( pm->gent && pm->gent->client && pm->gent->client->pers.enterTime >= level.time - 500 ) + if (pm->gent && pm->gent->client && pm->gent->client->pers.enterTime >= level.time - 500) {//just entered map - if ( weapon == WP_NONE && pm->ps->weapon != weapon ) + if (weapon == WP_NONE && pm->ps->weapon != weapon) {//don't switch to weapon none if just entered map return; } } - if ( weapon < WP_NONE || weapon >= WP_NUM_WEAPONS ) { + if (weapon < WP_NONE || weapon >= WP_NUM_WEAPONS) { return; } - if ( !( pm->ps->stats[STAT_WEAPONS] & ( 1 << weapon ) ) ) { + if (!(pm->ps->stats[STAT_WEAPONS] & (1 << weapon))) { return; } - - if ( pm->ps->weaponstate == WEAPON_DROPPING ) { + + if (pm->ps->weaponstate == WEAPON_DROPPING) { return; } - if ( cg.time > 0 ) + if (cg.time > 0) {//this way we don't get that annoying change weapon sound every time a map starts - PM_AddEvent( EV_CHANGE_WEAPON ); + PM_AddEvent(EV_CHANGE_WEAPON); } pm->ps->weaponstate = WEAPON_DROPPING; pm->ps->weaponTime += 200; - if ( !(pm->ps->eFlags&EF_HELD_BY_WAMPA) && !G_IsRidingVehicle(pm->gent)) + if (!(pm->ps->eFlags&EF_HELD_BY_WAMPA) && !G_IsRidingVehicle(pm->gent)) { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_DROPWEAP1,SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_DROPWEAP1, SETANIM_FLAG_HOLD); } // turn of any kind of zooming when weapon switching....except the LA Goggles // eezstreet edit: also ignore if we change to WP_NONE..sorta hacky fix for binoculars using WP_SABER - if ( pm->ps->clientNum == 0 && cg.weaponSelect != WP_NONE ) + if (pm->ps->clientNum == 0 && cg.weaponSelect != WP_NONE) { - if ( cg.zoomMode > 0 && cg.zoomMode < 3 ) + if (cg.zoomMode > 0 && cg.zoomMode < 3) { cg.zoomMode = 0; cg.zoomTime = cg.time; } } - if ( pm->gent - && pm->gent->client - && (pm->gent->client->NPC_class == CLASS_ATST||pm->gent->client->NPC_class == CLASS_RANCOR) ) + if (pm->gent + && pm->gent->client + && (pm->gent->client->NPC_class == CLASS_ATST || pm->gent->client->NPC_class == CLASS_RANCOR)) { - if ( pm->ps->clientNum < MAX_CLIENTS ) + if (pm->ps->clientNum < MAX_CLIENTS) { - gi.cvar_set( "cg_thirdperson", "1" ); + gi.cvar_set("cg_thirdperson", "1"); } } - else if ( weapon == WP_SABER ) + else if (weapon == WP_SABER) {//going to switch to lightsaber } else { - if ( pm->ps->weapon == WP_SABER ) + if (pm->ps->weapon == WP_SABER) {//going to switch away from saber - if ( pm->gent ) + if (pm->gent) { - G_SoundOnEnt( pm->gent, CHAN_WEAPON, "sound/weapons/saber/saberoffquick.wav" ); + G_SoundOnEnt(pm->gent, CHAN_WEAPON, "sound/weapons/saber/saberoffquick.wav"); } if (!G_IsRidingVehicle(pm->gent)) { @@ -8923,7 +8950,7 @@ static void PM_BeginWeaponChange( int weapon ) { } //put this back in because saberActive isn't being set somewhere else anymore pm->ps->SaberDeactivate(); - pm->ps->SetSaberLength( 0.0f ); + pm->ps->SetSaberLength(0.0f); } } @@ -8933,27 +8960,27 @@ static void PM_BeginWeaponChange( int weapon ) { PM_FinishWeaponChange =============== */ -static void PM_FinishWeaponChange( void ) { +static void PM_FinishWeaponChange(void) { int weapon; qboolean trueSwitch = qtrue; - if ( pm->gent && pm->gent->client && pm->gent->client->pers.enterTime >= level.time - 500 ) + if (pm->gent && pm->gent->client && pm->gent->client->pers.enterTime >= level.time - 500) {//just entered map - if ( pm->cmd.weapon == WP_NONE && pm->ps->weapon != pm->cmd.weapon ) + if (pm->cmd.weapon == WP_NONE && pm->ps->weapon != pm->cmd.weapon) {//don't switch to weapon none if just entered map return; } } weapon = pm->cmd.weapon; - if ( weapon < WP_NONE || weapon >= WP_NUM_WEAPONS ) { + if (weapon < WP_NONE || weapon >= WP_NUM_WEAPONS) { weapon = WP_NONE; } - if ( !( pm->ps->stats[STAT_WEAPONS] & ( 1 << weapon ) ) ) { + if (!(pm->ps->stats[STAT_WEAPONS] & (1 << weapon))) { weapon = WP_NONE; } - if ( pm->ps->weapon == weapon ) + if (pm->ps->weapon == weapon) { trueSwitch = qfalse; } @@ -8962,10 +8989,10 @@ static void PM_FinishWeaponChange( void ) { pm->ps->weaponstate = WEAPON_RAISING; pm->ps->weaponTime += 250; - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ATST ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ATST) {//do nothing } - else if ( weapon == WP_SABER ) + else if (weapon == WP_SABER) {//turn on the lightsaber //FIXME: somehow sometimes I still end up with 2 weapons in hand... usually if I // cycle weapons fast enough that I end up in 1st person lightsaber, then @@ -8973,46 +9000,46 @@ static void PM_FinishWeaponChange( void ) { // making my saber drop to the ground... when I switch back to the saber, it // does not remove the current weapon model and then, when I pull the saber // back to my hand, I have 2 weaponModels active...? - if ( pm->gent ) + if (pm->gent) {// remove gun if we had it. - G_RemoveWeaponModels( pm->gent ); + G_RemoveWeaponModels(pm->gent); } - if ( !pm->ps->saberInFlight || pm->ps->dualSabers ) + if (!pm->ps->saberInFlight || pm->ps->dualSabers) {//if it's not in flight or lying around, turn it on! //FIXME: AddSound/Sight Event //FIXME: don't do this if just loaded a game - if ( trueSwitch ) + if (trueSwitch) {//actually did switch weapons, turn it on - if ( PM_RidingVehicle() ) + if (PM_RidingVehicle()) {//only turn on the first saber's first blade...? - pm->ps->SaberBladeActivate( 0, 0 ); + pm->ps->SaberBladeActivate(0, 0); } else { pm->ps->SaberActivate(); } - pm->ps->SetSaberLength( 0.0f ); + pm->ps->SetSaberLength(0.0f); } - if ( pm->gent ) + if (pm->gent) { - WP_SaberAddG2SaberModels( pm->gent ); + WP_SaberAddG2SaberModels(pm->gent); } } else {//FIXME: pull it back to us? } - if ( pm->gent ) + if (pm->gent) { - WP_SaberInitBladeData( pm->gent ); - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + WP_SaberInitBladeData(pm->gent); + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer())) { - gi.cvar_set( "cg_thirdperson", "1" ); + gi.cvar_set("cg_thirdperson", "1"); } } - if ( trueSwitch ) + if (trueSwitch) {//actually did switch weapons, play anim if (!G_IsRidingVehicle(pm->gent)) { @@ -9022,33 +9049,33 @@ static void PM_FinishWeaponChange( void ) { } else {//switched away from saber - if ( pm->gent ) + if (pm->gent) { // remove the sabre if we had it. - G_RemoveWeaponModels( pm->gent ); + G_RemoveWeaponModels(pm->gent); if (weaponData[weapon].weaponMdl[0]) { //might be NONE, so check if it has a model - G_CreateG2AttachedWeaponModel( pm->gent, weaponData[weapon].weaponMdl, pm->gent->handRBolt, 0 ); + G_CreateG2AttachedWeaponModel(pm->gent, weaponData[weapon].weaponMdl, pm->gent->handRBolt, 0); } } - if ( !(pm->ps->eFlags&EF_HELD_BY_WAMPA) ) + if (!(pm->ps->eFlags&EF_HELD_BY_WAMPA)) { - if ( pm->ps->weapon != WP_THERMAL + if (pm->ps->weapon != WP_THERMAL && pm->ps->weapon != WP_TRIP_MINE - && pm->ps->weapon != WP_DET_PACK + && pm->ps->weapon != WP_DET_PACK && !G_IsRidingVehicle(pm->gent)) - { - PM_SetAnim(pm,SETANIM_TORSO,TORSO_RAISEWEAP1,SETANIM_FLAG_HOLD); + { + PM_SetAnim(pm, SETANIM_TORSO, TORSO_RAISEWEAP1, SETANIM_FLAG_HOLD); } } - if ( pm->ps->clientNum < MAX_CLIENTS - && cg_gunAutoFirst.integer + if (pm->ps->clientNum < MAX_CLIENTS + && cg_gunAutoFirst.integer && !PM_RidingVehicle() -// && oldWeap == WP_SABER - && weapon != WP_NONE ) + // && oldWeap == WP_SABER + && weapon != WP_NONE) { - gi.cvar_set( "cg_thirdperson", "0" ); + gi.cvar_set("cg_thirdperson", "0"); } pm->ps->saberMove = LS_NONE; pm->ps->saberBlocking = BLK_NO; @@ -9056,14 +9083,14 @@ static void PM_FinishWeaponChange( void ) { } } -int PM_ReadyPoseForSaberAnimLevel( void ) +int PM_ReadyPoseForSaberAnimLevel(void) { int anim = BOTH_STAND2; - if (PM_RidingVehicle()) + if (PM_RidingVehicle()) { return -1; } - switch ( pm->ps->saberAnimLevel ) + switch (pm->ps->saberAnimLevel) { case SS_DUAL: anim = BOTH_SABERDUAL_STANCE; @@ -9088,34 +9115,34 @@ int PM_ReadyPoseForSaberAnimLevel( void ) return anim; } -qboolean PM_CanDoDualDoubleAttacks( void ) +qboolean PM_CanDoDualDoubleAttacks(void) { - if ( (pm->ps->saber[0].saberFlags&SFL_NO_MIRROR_ATTACKS) ) + if ((pm->ps->saber[0].saberFlags&SFL_NO_MIRROR_ATTACKS)) { return qfalse; } - if ( pm->ps->dualSabers - && (pm->ps->saber[1].saberFlags&SFL_NO_MIRROR_ATTACKS) ) + if (pm->ps->dualSabers + && (pm->ps->saber[1].saberFlags&SFL_NO_MIRROR_ATTACKS)) { return qfalse; } //NOTE: assumes you're using SS_DUAL style and have both sabers on... - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer())) {//player return qtrue; } - if ( pm->gent && pm->gent->NPC && pm->gent->NPC->rank >= Q_irand( RANK_LT_COMM, RANK_CAPTAIN+2 ) ) + if (pm->gent && pm->gent->NPC && pm->gent->NPC->rank >= Q_irand(RANK_LT_COMM, RANK_CAPTAIN + 2)) {//high-rank NPC return qtrue; } - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ALORA ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ALORA) {//Alora return qtrue; } return qfalse; } -void PM_SetJumped( float height, qboolean force ) +void PM_SetJumped(float height, qboolean force) { pm->ps->velocity[2] = height; pml.groundPlane = qfalse; @@ -9125,17 +9152,17 @@ void PM_SetJumped( float height, qboolean force ) pm->ps->pm_flags |= PMF_JUMPING; pm->cmd.upmove = 0; - if ( force ) + if (force) { pm->ps->jumpZStart = pm->ps->origin[2]; pm->ps->pm_flags |= PMF_SLOW_MO_FALL; //start force jump - pm->ps->forcePowersActive |= (1<gent, CHAN_BODY, "sound/weapons/force/jump.wav" ); + pm->ps->forcePowersActive |= (1 << FP_LEVITATION); + G_SoundOnEnt(pm->gent, CHAN_BODY, "sound/weapons/force/jump.wav"); } else { - PM_AddEvent( EV_JUMP ); + PM_AddEvent(EV_JUMP); } } @@ -9147,7 +9174,7 @@ void PM_SetSaberMove(saberMoveName_t newMove) int parts = SETANIM_TORSO; qboolean manualBlocking = qfalse; - if ( newMove < LS_NONE || newMove >= LS_MOVE_MAX ) + if (newMove < LS_NONE || newMove >= LS_MOVE_MAX) { assert(0); return; @@ -9156,73 +9183,73 @@ void PM_SetSaberMove(saberMoveName_t newMove) setflags = saberMoveData[newMove].animSetFlags; anim = saberMoveData[newMove].animToUse; - if ( (pm->ps->eFlags&EF_HELD_BY_WAMPA) ) + if ((pm->ps->eFlags&EF_HELD_BY_WAMPA)) {//no anim return; } - if ( cg_debugSaber.integer&0x01 && (newMove != LS_READY) ) + if (cg_debugSaber.integer & 0x01 && (newMove != LS_READY)) { - Com_Printf("SetSaberMove: From '%s' to '%s'\n", - saberMoveData[pm->ps->saberMove].name, - saberMoveData[newMove].name); - } - - if ( newMove == LS_READY || newMove == LS_A_FLIP_STAB || newMove == LS_A_FLIP_SLASH ) + Com_Printf("SetSaberMove: From '%s' to '%s'\n", + saberMoveData[pm->ps->saberMove].name, + saberMoveData[newMove].name); + } + + if (newMove == LS_READY || newMove == LS_A_FLIP_STAB || newMove == LS_A_FLIP_SLASH) {//finished with a kata (or in a special move) reset attack counter pm->ps->saberAttackChainCount = 0; } - else if ( PM_SaberInAttack( newMove ) ) + else if (PM_SaberInAttack(newMove)) {//continuing with a kata, increment attack counter //FIXME: maybe some contextual/style-specific logic in here pm->ps->saberAttackChainCount++; } - if ( newMove == LS_READY ) + if (newMove == LS_READY) { - if ( pm->ps->saberBlockingTime > cg.time ) + if (pm->ps->saberBlockingTime > cg.time) { manualBlocking = qtrue; - if ( !pm->ps->SaberActive() ) + if (!pm->ps->SaberActive()) {//turn on all blades and sabers if none are currently on - pm->ps->SaberActivate(); + pm->ps->SaberActivate(); } - if ( pm->ps->saber[0].type == SABER_CLAW ) + if (pm->ps->saber[0].type == SABER_CLAW) { anim = BOTH_INAIR1;//FIXME: is there a better anim for this? } - else if ( pm->ps->dualSabers && pm->ps->saber[1].Active() ) - { - anim = BOTH_INAIR1; + else if (pm->ps->dualSabers && pm->ps->saber[1].Active()) + { + anim = BOTH_INAIR1; } else { anim = BOTH_P1_S1_T_; } } - else if ( pm->ps->saber[0].readyAnim != -1 ) + else if (pm->ps->saber[0].readyAnim != -1) { anim = pm->ps->saber[0].readyAnim; } - else if ( pm->ps->dualSabers - && pm->ps->saber[1].readyAnim != -1 ) + else if (pm->ps->dualSabers + && pm->ps->saber[1].readyAnim != -1) { anim = pm->ps->saber[1].readyAnim; } - else if ( pm->ps->saber[0].type == SABER_ARC ) + else if (pm->ps->saber[0].type == SABER_ARC) {//FIXME: need it's own style? anim = BOTH_SABERFAST_STANCE; } - else if ( (pm->ps->dualSabers && pm->ps->saber[1].Active()) ) + else if ((pm->ps->dualSabers && pm->ps->saber[1].Active())) { anim = BOTH_SABERDUAL_STANCE; } - else if ( (pm->ps->SaberStaff() && (!pm->ps->saber[0].singleBladeStyle||pm->ps->saber[0].blade[1].active))//saber staff with more than first blade active - || pm->ps->saber[0].type == SABER_ARC ) + else if ((pm->ps->SaberStaff() && (!pm->ps->saber[0].singleBladeStyle || pm->ps->saber[0].blade[1].active))//saber staff with more than first blade active + || pm->ps->saber[0].type == SABER_ARC) { anim = BOTH_SABERSTAFF_STANCE; } - else if ( pm->ps->saber[0].type == SABER_LANCE || pm->ps->saber[0].type == SABER_TRIDENT ) + else if (pm->ps->saber[0].type == SABER_LANCE || pm->ps->saber[0].type == SABER_TRIDENT) {//FIXME: need some 2-handed forward-pointing anim anim = BOTH_STAND1; } @@ -9231,67 +9258,67 @@ void PM_SetSaberMove(saberMoveName_t newMove) anim = PM_ReadyPoseForSaberAnimLevel(); } } - else if ( newMove == LS_DRAW ) + else if (newMove == LS_DRAW) { - if ( PM_RunningAnim( pm->ps->torsoAnim ) ) + if (PM_RunningAnim(pm->ps->torsoAnim)) { pm->ps->saberMove = newMove; return; } - if ( pm->ps->saber[0].drawAnim != -1 ) + if (pm->ps->saber[0].drawAnim != -1) { anim = pm->ps->saber[0].drawAnim; } - else if ( pm->ps->dualSabers - && pm->ps->saber[1].drawAnim != -1 ) + else if (pm->ps->dualSabers + && pm->ps->saber[1].drawAnim != -1) { anim = pm->ps->saber[1].drawAnim; } - else if ( pm->ps->saber[0].stylesLearned==(1<ps->saber[0].stylesLearned == (1 << SS_STAFF)) { anim = BOTH_S1_S7; } - else if ( pm->ps->dualSabers - && !(pm->ps->saber[0].stylesForbidden&(1<ps->saber[1].stylesForbidden&(1<ps->dualSabers + && !(pm->ps->saber[0].stylesForbidden&(1 << SS_DUAL)) + && !(pm->ps->saber[1].stylesForbidden&(1 << SS_DUAL))) { anim = BOTH_S1_S6; } - if ( pm->ps->torsoAnim == BOTH_STAND1IDLE1 ) + if (pm->ps->torsoAnim == BOTH_STAND1IDLE1) { setflags |= SETANIM_FLAG_OVERRIDE; } } - else if ( newMove == LS_PUTAWAY ) + else if (newMove == LS_PUTAWAY) { - if ( pm->ps->saber[0].putawayAnim != -1 ) + if (pm->ps->saber[0].putawayAnim != -1) { anim = pm->ps->saber[0].putawayAnim; } - else if ( pm->ps->dualSabers - && pm->ps->saber[1].putawayAnim != -1 ) + else if (pm->ps->dualSabers + && pm->ps->saber[1].putawayAnim != -1) { anim = pm->ps->saber[1].putawayAnim; } - else if ( pm->ps->saber[0].stylesLearned==(1<ps->saber[0].blade[1].active ) + else if (pm->ps->saber[0].stylesLearned == (1 << SS_STAFF) + && pm->ps->saber[0].blade[1].active) { anim = BOTH_S7_S1; } - else if ( pm->ps->dualSabers - && !(pm->ps->saber[0].stylesForbidden&(1<ps->saber[1].stylesForbidden&(1<ps->saber[1].Active() ) + else if (pm->ps->dualSabers + && !(pm->ps->saber[0].stylesForbidden&(1 << SS_DUAL)) + && !(pm->ps->saber[1].stylesForbidden&(1 << SS_DUAL)) + && pm->ps->saber[1].Active()) { anim = BOTH_S6_S1; } - if ( PM_SaberStanceAnim( pm->ps->legsAnim ) && pm->ps->legsAnim != BOTH_STAND1 ) + if (PM_SaberStanceAnim(pm->ps->legsAnim) && pm->ps->legsAnim != BOTH_STAND1) { parts = SETANIM_BOTH; } else { - if ( PM_RunningAnim( pm->ps->torsoAnim ) ) + if (PM_RunningAnim(pm->ps->torsoAnim)) { pm->ps->saberMove = newMove; return; @@ -9300,47 +9327,47 @@ void PM_SetSaberMove(saberMoveName_t newMove) } //FIXME: also dual } - else if ( pm->ps->saberAnimLevel == SS_STAFF && newMove >= LS_S_TL2BR && newMove < LS_REFLECT_LL ) + else if (pm->ps->saberAnimLevel == SS_STAFF && newMove >= LS_S_TL2BR && newMove < LS_REFLECT_LL) {//staff has an entirely new set of anims, besides special attacks //FIXME: include ready and draw/putaway? //FIXME: get hand-made bounces and deflections? - if ( newMove >= LS_V1_BR && newMove <= LS_REFLECT_LL ) + if (newMove >= LS_V1_BR && newMove <= LS_REFLECT_LL) {//there aren't 1-7, just 1, 6 and 7, so just set it - anim = BOTH_P7_S7_T_ + (anim-BOTH_P1_S1_T_);//shift it up to the proper set + anim = BOTH_P7_S7_T_ + (anim - BOTH_P1_S1_T_);//shift it up to the proper set } else {//add the appropriate animLevel - anim += (pm->ps->saberAnimLevel-FORCE_LEVEL_1) * SABER_ANIM_GROUP_SIZE; + anim += (pm->ps->saberAnimLevel - FORCE_LEVEL_1) * SABER_ANIM_GROUP_SIZE; } } - else if ( (pm->ps->saberAnimLevel == SS_DUAL - || (pm->ps->dualSabers&& pm->ps->saber[1].Active())) - && newMove >= LS_S_TL2BR - && newMove < LS_REFLECT_LL ) + else if ((pm->ps->saberAnimLevel == SS_DUAL + || (pm->ps->dualSabers&& pm->ps->saber[1].Active())) + && newMove >= LS_S_TL2BR + && newMove < LS_REFLECT_LL) {//staff has an entirely new set of anims, besides special attacks //FIXME: include ready and draw/putaway? //FIXME: get hand-made bounces and deflections? //FIXME: only do the dual FB & LR attacks when on ground? - if ( newMove >= LS_V1_BR && newMove <= LS_REFLECT_LL ) + if (newMove >= LS_V1_BR && newMove <= LS_REFLECT_LL) {//there aren't 1-7, just 1, 6 and 7, so just set it - anim = BOTH_P6_S6_T_ + (anim-BOTH_P1_S1_T_);//shift it up to the proper set + anim = BOTH_P6_S6_T_ + (anim - BOTH_P1_S1_T_);//shift it up to the proper set } - else if ( ( newMove == LS_A_R2L || newMove == LS_S_R2L - || newMove == LS_A_L2R || newMove == LS_S_L2R ) + else if ((newMove == LS_A_R2L || newMove == LS_S_R2L + || newMove == LS_A_L2R || newMove == LS_S_L2R) && PM_CanDoDualDoubleAttacks() - && G_CheckEnemyPresence( pm->gent, DIR_RIGHT, 150.0f ) - && G_CheckEnemyPresence( pm->gent, DIR_LEFT, 150.0f ) ) + && G_CheckEnemyPresence(pm->gent, DIR_RIGHT, 150.0f) + && G_CheckEnemyPresence(pm->gent, DIR_LEFT, 150.0f)) {//enemy both on left and right newMove = LS_DUAL_LR; anim = saberMoveData[newMove].animToUse; //probably already moved, but... pm->cmd.rightmove = 0; } - else if ( (newMove == LS_A_T2B || newMove == LS_S_T2B - || newMove == LS_A_BACK || newMove == LS_A_BACK_CR ) + else if ((newMove == LS_A_T2B || newMove == LS_S_T2B + || newMove == LS_A_BACK || newMove == LS_A_BACK_CR) && PM_CanDoDualDoubleAttacks() - && G_CheckEnemyPresence( pm->gent, DIR_FRONT, 150.0f ) - && G_CheckEnemyPresence( pm->gent, DIR_BACK, 150.0f ) ) + && G_CheckEnemyPresence(pm->gent, DIR_FRONT, 150.0f) + && G_CheckEnemyPresence(pm->gent, DIR_BACK, 150.0f)) {//enemy both in front and back newMove = LS_DUAL_FB; anim = saberMoveData[newMove].animToUse; @@ -9349,56 +9376,56 @@ void PM_SetSaberMove(saberMoveName_t newMove) } else {//add the appropriate animLevel - anim += (pm->ps->saberAnimLevel-FORCE_LEVEL_1) * SABER_ANIM_GROUP_SIZE; + anim += (pm->ps->saberAnimLevel - FORCE_LEVEL_1) * SABER_ANIM_GROUP_SIZE; } } /* else if ( newMove == LS_DRAW && pm->ps->saberAnimLevel == SS_STAFF )//pm->ps->SaberStaff() ) {//hold saber out front as we turn it on - //FIXME: need a real "draw" anim for this (and put-away) - anim = BOTH_SABERSTAFF_STANCE; + //FIXME: need a real "draw" anim for this (and put-away) + anim = BOTH_SABERSTAFF_STANCE; } */ - else if ( pm->ps->saberAnimLevel > FORCE_LEVEL_1 && - !PM_SaberInIdle( newMove ) && !PM_SaberInParry( newMove ) && !PM_SaberInKnockaway( newMove ) && !PM_SaberInBrokenParry( newMove ) && !PM_SaberInReflect( newMove ) && !PM_SaberInSpecial( newMove )) - {//readies, parries and reflections have only 1 level - if ( pm->ps->saber[0].type == SABER_LANCE || pm->ps->saber[0].type == SABER_TRIDENT ) + else if (pm->ps->saberAnimLevel > FORCE_LEVEL_1 && + !PM_SaberInIdle(newMove) && !PM_SaberInParry(newMove) && !PM_SaberInKnockaway(newMove) && !PM_SaberInBrokenParry(newMove) && !PM_SaberInReflect(newMove) && !PM_SaberInSpecial(newMove)) + {//readies, parries and reflections have only 1 level + if (pm->ps->saber[0].type == SABER_LANCE || pm->ps->saber[0].type == SABER_TRIDENT) {//FIXME: hack for now - these use the fast anims, but slowed down. Should have own style } else {//increment the anim to the next level of saber anims - anim += (pm->ps->saberAnimLevel-FORCE_LEVEL_1) * SABER_ANIM_GROUP_SIZE; + anim += (pm->ps->saberAnimLevel - FORCE_LEVEL_1) * SABER_ANIM_GROUP_SIZE; } } - else if ( newMove == LS_KICK_F_AIR + else if (newMove == LS_KICK_F_AIR || newMove == LS_KICK_B_AIR || newMove == LS_KICK_R_AIR - || newMove == LS_KICK_L_AIR ) + || newMove == LS_KICK_L_AIR) { - if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + if (pm->ps->groundEntityNum != ENTITYNUM_NONE) { - PM_SetJumped( 200, qtrue ); + PM_SetJumped(200, qtrue); } } // If the move does the same animation as the last one, we need to force a restart... -// if ( saberMoveData[pm->ps->saberMove].animToUse == anim && newMove > LS_PUTAWAY) - if ( ( pm->ps->torsoAnim == anim || pm->ps->legsAnim == anim ) - && newMove > LS_PUTAWAY ) + // if ( saberMoveData[pm->ps->saberMove].animToUse == anim && newMove > LS_PUTAWAY) + if ((pm->ps->torsoAnim == anim || pm->ps->legsAnim == anim) + && newMove > LS_PUTAWAY) { setflags |= SETANIM_FLAG_RESTART; } - if ( (anim == BOTH_STAND1 && (pm->ps->saber[0].type == SABER_ARC || (pm->ps->dualSabers && pm->ps->saber[1].Active())) ) - || anim == BOTH_STAND2 + if ((anim == BOTH_STAND1 && (pm->ps->saber[0].type == SABER_ARC || (pm->ps->dualSabers && pm->ps->saber[1].Active()))) + || anim == BOTH_STAND2 //FIXME: temp hack to stop it from using run2 with staff || (0 && anim == BOTH_SABERSTAFF_STANCE) || anim == BOTH_SABERDUAL_STANCE || anim == BOTH_SABERFAST_STANCE - || anim == BOTH_SABERSLOW_STANCE ) + || anim == BOTH_SABERSLOW_STANCE) {//match torso anim to walk/run anim if newMove is just LS_READY //FIXME: play both_stand2_random1 when you've been idle for a while - switch ( pm->ps->legsAnim ) + switch (pm->ps->legsAnim) { case BOTH_WALK1: case BOTH_WALK2: @@ -9420,12 +9447,12 @@ void PM_SetSaberMove(saberMoveName_t newMove) } } - if ( !PM_RidingVehicle() ) + if (!PM_RidingVehicle()) { - if ( !manualBlocking ) + if (!manualBlocking) { - if ( newMove == LS_A_LUNGE - || newMove == LS_A_JUMP_T__B_ + if (newMove == LS_A_LUNGE + || newMove == LS_A_JUMP_T__B_ || newMove == LS_A_BACKSTAB || newMove == LS_A_BACK || newMove == LS_A_BACK_CR @@ -9453,32 +9480,32 @@ void PM_SetSaberMove(saberMoveName_t newMove) || newMove == LS_UPSIDE_DOWN_ATTACK || newMove == LS_PULL_ATTACK_STAB || newMove == LS_PULL_ATTACK_SWING - || PM_KickMove( newMove ) ) + || PM_KickMove(newMove)) { parts = SETANIM_BOTH; } - else if ( PM_SpinningSaberAnim( anim ) ) + else if (PM_SpinningSaberAnim(anim)) {//spins must be played on entire body parts = SETANIM_BOTH; } - else if ( (!pm->cmd.forwardmove&&!pm->cmd.rightmove&&!pm->cmd.upmove)) + else if ((!pm->cmd.forwardmove&&!pm->cmd.rightmove&&!pm->cmd.upmove)) {//not trying to run, duck or jump - if ( !PM_FlippingAnim( pm->ps->legsAnim ) && - !PM_InRoll( pm->ps ) && - !PM_InKnockDown( pm->ps ) && - !PM_JumpingAnim( pm->ps->legsAnim ) && - !PM_PainAnim( pm->ps->legsAnim ) && - !PM_InSpecialJump( pm->ps->legsAnim ) && - !PM_InSlopeAnim( pm->ps->legsAnim ) && + if (!PM_FlippingAnim(pm->ps->legsAnim) && + !PM_InRoll(pm->ps) && + !PM_InKnockDown(pm->ps) && + !PM_JumpingAnim(pm->ps->legsAnim) && + !PM_PainAnim(pm->ps->legsAnim) && + !PM_InSpecialJump(pm->ps->legsAnim) && + !PM_InSlopeAnim(pm->ps->legsAnim) && //!PM_CrouchAnim( pm->ps->legsAnim ) && //pm->cmd.upmove >= 0 && !(pm->ps->pm_flags & PMF_DUCKED) && - newMove != LS_PUTAWAY ) + newMove != LS_PUTAWAY) { parts = SETANIM_BOTH; } - else if ( !(pm->ps->pm_flags & PMF_DUCKED) - && ( newMove == LS_SPINATTACK_DUAL || newMove == LS_SPINATTACK ) ) + else if (!(pm->ps->pm_flags & PMF_DUCKED) + && (newMove == LS_SPINATTACK_DUAL || newMove == LS_SPINATTACK)) { parts = SETANIM_BOTH; } @@ -9493,98 +9520,98 @@ void PM_SetSaberMove(saberMoveName_t newMove) setflags &= ~SETANIM_FLAG_RESTART; } } - if (anim!=-1) + if (anim != -1) { - PM_SetAnim( pm, parts, anim, setflags, saberMoveData[newMove].blendTime ); + PM_SetAnim(pm, parts, anim, setflags, saberMoveData[newMove].blendTime); } - if ( pm->ps->torsoAnim == anim ) + if (pm->ps->torsoAnim == anim) {//successfully changed anims - //special check for *starting* a saber swing - if ( pm->gent && pm->ps->SaberLength() > 1 ) + //special check for *starting* a saber swing + if (pm->gent && pm->ps->SaberLength() > 1) { - if ( PM_SaberInAttack( newMove ) || PM_SaberInSpecialAttack( anim ) ) + if (PM_SaberInAttack(newMove) || PM_SaberInSpecialAttack(anim)) {//playing an attack - if ( pm->ps->saberMove != newMove ) + if (pm->ps->saberMove != newMove) {//wasn't playing that attack before - if ( PM_SaberInSpecialAttack( anim ) ) + if (PM_SaberInSpecialAttack(anim)) { - WP_SaberSwingSound( pm->gent, 0, SWING_FAST ); - if ( !PM_InCartwheel( pm->ps->torsoAnim ) ) + WP_SaberSwingSound(pm->gent, 0, SWING_FAST); + if (!PM_InCartwheel(pm->ps->torsoAnim)) {//can still attack during a cartwheel/arial pm->ps->weaponTime = pm->ps->torsoAnimTimer;//so we know our weapon is busy } } else { - switch ( pm->ps->saberAnimLevel ) + switch (pm->ps->saberAnimLevel) { case SS_DESANN: case SS_STRONG: - WP_SaberSwingSound( pm->gent, 0, SWING_STRONG ); + WP_SaberSwingSound(pm->gent, 0, SWING_STRONG); break; case SS_MEDIUM: case SS_DUAL: case SS_STAFF: - WP_SaberSwingSound( pm->gent, 0, SWING_MEDIUM ); + WP_SaberSwingSound(pm->gent, 0, SWING_MEDIUM); break; case SS_TAVION: case SS_FAST: - WP_SaberSwingSound( pm->gent, 0, SWING_FAST ); + WP_SaberSwingSound(pm->gent, 0, SWING_FAST); break; } } } - else if ( (setflags&SETANIM_FLAG_RESTART) && PM_SaberInSpecialAttack( anim ) ) + else if ((setflags&SETANIM_FLAG_RESTART) && PM_SaberInSpecialAttack(anim)) {//sigh, if restarted a special, then set the weaponTime *again* - if ( !PM_InCartwheel( pm->ps->torsoAnim ) ) + if (!PM_InCartwheel(pm->ps->torsoAnim)) {//can still attack during a cartwheel/arial pm->ps->weaponTime = pm->ps->torsoAnimTimer;//so we know our weapon is busy } } } - else if ( PM_SaberInStart( newMove ) ) + else if (PM_SaberInStart(newMove)) { //if ( g_saberRealisticCombat->integer < 1 ) {//don't damage on the first few frames of a start anim because it may pop from one position to some drastically different one, killing the enemy without hitting them. int damageDelay = 150; - if ( pm->ps->torsoAnimTimer < damageDelay ) + if (pm->ps->torsoAnimTimer < damageDelay) { damageDelay = pm->ps->torsoAnimTimer; } //ent->client->ps.saberDamageDebounceTime = level.time + damageDelay; } - if ( pm->ps->saberAnimLevel == SS_STRONG ) + if (pm->ps->saberAnimLevel == SS_STRONG) { - WP_SaberSwingSound( pm->gent, 0, SWING_FAST ); + WP_SaberSwingSound(pm->gent, 0, SWING_FAST); } } } /* //wtf... getting stuck with weaponTime set even though we're not in an attack...? - if ( PM_SaberInAttack( pm->ps->saberMove ) - && !PM_SaberInAttack( newMove ) ) + if ( PM_SaberInAttack( pm->ps->saberMove ) + && !PM_SaberInAttack( newMove ) ) { - pm->ps->weaponTime = 0; + pm->ps->weaponTime = 0; } */ //Some special attacks can be started when sabers are off, make sure we turn them on, first! - switch ( newMove ) + switch (newMove) {//make sure the saber is on! case LS_A_LUNGE: case LS_ROLL_STAB: - if ( PM_InSecondaryStyle() ) + if (PM_InSecondaryStyle()) {//staff as medium or dual as fast - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) {//only force on the first saber pm->ps->saber[0].Activate(); } - else if ( pm->ps->saber[0].numBlades > 1 ) + else if (pm->ps->saber[0].numBlades > 1) {//only force on the first saber's first blade - pm->ps->SaberBladeActivate(0,0); + pm->ps->SaberBladeActivate(0, 0); } } else @@ -9610,10 +9637,10 @@ void PM_SetSaberMove(saberMoveName_t newMove) pm->ps->saberMove = newMove; pm->ps->saberBlocking = saberMoveData[newMove].blocking; - if ( pm->ps->clientNum == 0 || PM_ControlledByPlayer() ) + if (pm->ps->clientNum == 0 || PM_ControlledByPlayer()) { - if ( pm->ps->saberBlocked >= BLOCKED_UPPER_RIGHT_PROJ && pm->ps->saberBlocked <= BLOCKED_TOP_PROJ - && newMove >= LS_REFLECT_UP && newMove <= LS_REFLECT_LL ) + if (pm->ps->saberBlocked >= BLOCKED_UPPER_RIGHT_PROJ && pm->ps->saberBlocked <= BLOCKED_TOP_PROJ + && newMove >= LS_REFLECT_UP && newMove <= LS_REFLECT_LL) {//don't clear it when blocking projectiles } else @@ -9621,20 +9648,20 @@ void PM_SetSaberMove(saberMoveName_t newMove) pm->ps->saberBlocked = BLOCKED_NONE; } } - else if ( pm->ps->saberBlocked <= BLOCKED_ATK_BOUNCE || !pm->ps->SaberActive() || (newMove < LS_PARRY_UR || newMove > LS_REFLECT_LL) ) + else if (pm->ps->saberBlocked <= BLOCKED_ATK_BOUNCE || !pm->ps->SaberActive() || (newMove < LS_PARRY_UR || newMove > LS_REFLECT_LL)) {//NPCs only clear blocked if not blocking? pm->ps->saberBlocked = BLOCKED_NONE; } - if ( pm->gent && pm->gent->client ) + if (pm->gent && pm->gent->client) { - if ( saberMoveData[newMove].trailLength > 0 ) + if (saberMoveData[newMove].trailLength > 0) { - pm->gent->client->ps.SaberActivateTrail( saberMoveData[newMove].trailLength ); // saber trail lasts for 75ms...feel free to change this if you want it longer or shorter + pm->gent->client->ps.SaberActivateTrail(saberMoveData[newMove].trailLength); // saber trail lasts for 75ms...feel free to change this if you want it longer or shorter } else { - pm->gent->client->ps.SaberDeactivateTrail( 0 ); + pm->gent->client->ps.SaberDeactivateTrail(0); } } } @@ -9650,22 +9677,22 @@ Generates a use event */ #define USE_DELAY 250 -void PM_Use( void ) +void PM_Use(void) { - if ( pm->ps->useTime > 0 ) + if (pm->ps->useTime > 0) { pm->ps->useTime -= pml.msec; - if ( pm->ps->useTime < 0 ) + if (pm->ps->useTime < 0) { pm->ps->useTime = 0; } } - if ( pm->ps->useTime > 0 ) { + if (pm->ps->useTime > 0) { return; } - if ( ! (pm->cmd.buttons & BUTTON_USE ) ) + if (!(pm->cmd.buttons & BUTTON_USE)) { pm->useEvent = 0; pm->ps->useTime = 0; @@ -9676,28 +9703,28 @@ void PM_Use( void ) pm->ps->useTime = USE_DELAY; } -extern saberMoveName_t PM_AttackForEnemyPos( qboolean allowFB, qboolean allowStabDown ); -saberMoveName_t PM_NPCSaberAttackFromQuad( int quad ) -{ - //FIXME: this should be an AI decision +extern saberMoveName_t PM_AttackForEnemyPos(qboolean allowFB, qboolean allowStabDown); +saberMoveName_t PM_NPCSaberAttackFromQuad(int quad) +{ + //FIXME: this should be an AI decision // It should be based on the enemy's current LS_ move, saberAnimLevel, // the jedi's difficulty level, rank and FP_OFFENSE skill... saberMoveName_t autoMove = LS_NONE; - if ( pm->gent && ((pm->gent->NPC && pm->gent->NPC->rank != RANK_ENSIGN && pm->gent->NPC->rank != RANK_CIVILIAN ) || (pm->gent->client && (pm->gent->client->NPC_class == CLASS_TAVION||pm->gent->client->NPC_class == CLASS_ALORA))) ) + if (pm->gent && ((pm->gent->NPC && pm->gent->NPC->rank != RANK_ENSIGN && pm->gent->NPC->rank != RANK_CIVILIAN) || (pm->gent->client && (pm->gent->client->NPC_class == CLASS_TAVION || pm->gent->client->NPC_class == CLASS_ALORA)))) { - autoMove = PM_AttackForEnemyPos( qtrue, qtrue ); + autoMove = PM_AttackForEnemyPos(qtrue, qtrue); } - if ( autoMove != LS_NONE && PM_SaberInSpecial( autoMove ) ) + if (autoMove != LS_NONE && PM_SaberInSpecial(autoMove)) {//if have opportunity to do a special attack, do one return autoMove; } else {//pick another one saberMoveName_t newmove = LS_NONE; - switch( quad ) + switch (quad) { case Q_T://blocked top - if ( Q_irand( 0, 1 ) ) + if (Q_irand(0, 1)) { newmove = LS_A_T2B; } @@ -9707,11 +9734,11 @@ saberMoveName_t PM_NPCSaberAttackFromQuad( int quad ) } break; case Q_TR: - if ( !Q_irand( 0, 2 ) ) + if (!Q_irand(0, 2)) { newmove = LS_A_R2L; } - else if ( !Q_irand( 0, 1 ) ) + else if (!Q_irand(0, 1)) { newmove = LS_A_TR2BL; } @@ -9721,11 +9748,11 @@ saberMoveName_t PM_NPCSaberAttackFromQuad( int quad ) } break; case Q_TL: - if ( !Q_irand( 0, 2 ) ) + if (!Q_irand(0, 2)) { newmove = LS_A_L2R; } - else if ( !Q_irand( 0, 1 ) ) + else if (!Q_irand(0, 1)) { newmove = LS_A_TL2BR; } @@ -9735,11 +9762,11 @@ saberMoveName_t PM_NPCSaberAttackFromQuad( int quad ) } break; case Q_BR: - if ( !Q_irand( 0, 2 ) ) + if (!Q_irand(0, 2)) { newmove = LS_A_BR2TL; } - else if ( !Q_irand( 0, 1 ) ) + else if (!Q_irand(0, 1)) { newmove = LS_T1_BR_TR; } @@ -9749,11 +9776,11 @@ saberMoveName_t PM_NPCSaberAttackFromQuad( int quad ) } break; case Q_BL: - if ( !Q_irand( 0, 2 ) ) + if (!Q_irand(0, 2)) { newmove = LS_A_BL2TR; } - else if ( !Q_irand( 0, 1 ) ) + else if (!Q_irand(0, 1)) { newmove = LS_T1_BL_TL; } @@ -9763,11 +9790,11 @@ saberMoveName_t PM_NPCSaberAttackFromQuad( int quad ) } break; case Q_L: - if ( !Q_irand( 0, 2 ) ) + if (!Q_irand(0, 2)) { newmove = LS_A_L2R; } - else if ( !Q_irand( 0, 1 ) ) + else if (!Q_irand(0, 1)) { newmove = LS_T1__L_T_; } @@ -9777,11 +9804,11 @@ saberMoveName_t PM_NPCSaberAttackFromQuad( int quad ) } break; case Q_R: - if ( !Q_irand( 0, 2 ) ) + if (!Q_irand(0, 2)) { newmove = LS_A_R2L; } - else if ( !Q_irand( 0, 1 ) ) + else if (!Q_irand(0, 1)) { newmove = LS_T1__R_T_; } @@ -9791,13 +9818,13 @@ saberMoveName_t PM_NPCSaberAttackFromQuad( int quad ) } break; case Q_B: - if ( pm->gent - && pm->gent->NPC - && pm->gent->NPC->rank >= RANK_LT_JG ) + if (pm->gent + && pm->gent->NPC + && pm->gent->NPC->rank >= RANK_LT_JG) {//fencers and above can do bottom-up attack - if ( Q_irand( 0, pm->gent->NPC->rank ) >= RANK_LT_JG ) + if (Q_irand(0, pm->gent->NPC->rank) >= RANK_LT_JG) {//but not overly likely - newmove = PM_SaberLungeAttackMove( qtrue ); + newmove = PM_SaberLungeAttackMove(qtrue); } } break; @@ -9808,15 +9835,15 @@ saberMoveName_t PM_NPCSaberAttackFromQuad( int quad ) } } -int PM_SaberMoveQuadrantForMovement( usercmd_t *ucmd ) +int PM_SaberMoveQuadrantForMovement(usercmd_t *ucmd) { - if ( ucmd->rightmove > 0 ) + if (ucmd->rightmove > 0) {//moving right - if ( ucmd->forwardmove > 0 ) + if (ucmd->forwardmove > 0) {//forward right = TL2BR slash return Q_TL; } - else if ( ucmd->forwardmove < 0 ) + else if (ucmd->forwardmove < 0) {//backward right = BL2TR uppercut return Q_BL; } @@ -9825,13 +9852,13 @@ int PM_SaberMoveQuadrantForMovement( usercmd_t *ucmd ) return Q_L; } } - else if ( ucmd->rightmove < 0 ) + else if (ucmd->rightmove < 0) {//moving left - if ( ucmd->forwardmove > 0 ) + if (ucmd->forwardmove > 0) {//forward left = TR2BL slash return Q_TR; } - else if ( ucmd->forwardmove < 0 ) + else if (ucmd->forwardmove < 0) {//backward left = BR2TL uppercut return Q_BR; } @@ -9842,11 +9869,11 @@ int PM_SaberMoveQuadrantForMovement( usercmd_t *ucmd ) } else {//not moving left or right - if ( ucmd->forwardmove > 0 ) + if (ucmd->forwardmove > 0) {//forward= T2B slash return Q_T; } - else if ( ucmd->forwardmove < 0 ) + else if (ucmd->forwardmove < 0) {//backward= T2B slash //or B2T uppercut? return Q_T; } @@ -9858,47 +9885,47 @@ int PM_SaberMoveQuadrantForMovement( usercmd_t *ucmd ) //return Q_R;//???? } -void PM_SetAnimFrame( gentity_t *gent, int frame, qboolean torso, qboolean legs ) +void PM_SetAnimFrame(gentity_t *gent, int frame, qboolean torso, qboolean legs) { - if ( !gi.G2API_HaveWeGhoul2Models( gent->ghoul2 ) ) + if (!gi.G2API_HaveWeGhoul2Models(gent->ghoul2)) { return; } - int actualTime = (cg.time?cg.time:level.time); - if ( torso && gent->lowerLumbarBone != -1 )//gent->upperLumbarBone + int actualTime = (cg.time ? cg.time : level.time); + if (torso && gent->lowerLumbarBone != -1)//gent->upperLumbarBone { gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->lowerLumbarBone, //gent->upperLumbarBone - frame, frame+1, BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND, 1, actualTime, frame, 150 ); - if ( gent->motionBone != -1 ) + frame, frame + 1, BONE_ANIM_OVERRIDE_FREEZE | BONE_ANIM_BLEND, 1, actualTime, frame, 150); + if (gent->motionBone != -1) { gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->motionBone, //gent->upperLumbarBone - frame, frame+1, BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND, 1, actualTime, frame, 150 ); + frame, frame + 1, BONE_ANIM_OVERRIDE_FREEZE | BONE_ANIM_BLEND, 1, actualTime, frame, 150); } } - if ( legs && gent->rootBone != -1 ) + if (legs && gent->rootBone != -1) { - gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->rootBone, - frame, frame+1, BONE_ANIM_OVERRIDE_FREEZE|BONE_ANIM_BLEND, 1, actualTime, frame, 150 ); + gi.G2API_SetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->rootBone, + frame, frame + 1, BONE_ANIM_OVERRIDE_FREEZE | BONE_ANIM_BLEND, 1, actualTime, frame, 150); } } -int PM_SaberLockWinAnim( saberLockResult_t result, int breakType ) +int PM_SaberLockWinAnim(saberLockResult_t result, int breakType) { int winAnim = -1; - switch ( pm->ps->torsoAnim ) + switch (pm->ps->torsoAnim) { -/* - default: -#ifndef FINAL_BUILD + /* + default: + #ifndef FINAL_BUILD Com_Printf( S_COLOR_RED"ERROR-PM_SaberLockBreak: %s not in saberlock anim, anim = (%d)%s\n", pm->gent->NPC_type, pm->ps->torsoAnim, animTable[pm->ps->torsoAnim].name ); -#endif -*/ + #endif + */ case BOTH_BF2LOCK: - if ( breakType == SABERLOCK_SUPERBREAK ) + if (breakType == SABERLOCK_SUPERBREAK) { winAnim = BOTH_LK_S_S_T_SB_1_W; } - else if ( result == LOCK_DRAW ) + else if (result == LOCK_DRAW) { winAnim = BOTH_BF1BREAK; } @@ -9909,11 +9936,11 @@ int PM_SaberLockWinAnim( saberLockResult_t result, int breakType ) } break; case BOTH_BF1LOCK: - if ( breakType == SABERLOCK_SUPERBREAK ) + if (breakType == SABERLOCK_SUPERBREAK) { winAnim = BOTH_LK_S_S_T_SB_1_W; } - else if ( result == LOCK_DRAW ) + else if (result == LOCK_DRAW) { winAnim = BOTH_KNOCKDOWN4; } @@ -9924,11 +9951,11 @@ int PM_SaberLockWinAnim( saberLockResult_t result, int breakType ) } break; case BOTH_CWCIRCLELOCK: - if ( breakType == SABERLOCK_SUPERBREAK ) + if (breakType == SABERLOCK_SUPERBREAK) { winAnim = BOTH_LK_S_S_S_SB_1_W; } - else if ( result == LOCK_DRAW ) + else if (result == LOCK_DRAW) { pm->ps->saberMove = pm->ps->saberBounceMove = LS_V1_BL; pm->ps->saberBlocked = BLOCKED_PARRY_BROKEN; @@ -9940,11 +9967,11 @@ int PM_SaberLockWinAnim( saberLockResult_t result, int breakType ) } break; case BOTH_CCWCIRCLELOCK: - if ( breakType == SABERLOCK_SUPERBREAK ) + if (breakType == SABERLOCK_SUPERBREAK) { winAnim = BOTH_LK_S_S_S_SB_1_W; } - else if ( result == LOCK_DRAW ) + else if (result == LOCK_DRAW) { pm->ps->saberMove = pm->ps->saberBounceMove = LS_V1_BR; pm->ps->saberBlocked = BLOCKED_PARRY_BROKEN; @@ -9959,44 +9986,44 @@ int PM_SaberLockWinAnim( saberLockResult_t result, int breakType ) //must be using new system: break; } - if ( winAnim != -1 ) + if (winAnim != -1) { - PM_SetAnim( pm, SETANIM_BOTH, winAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_BOTH, winAnim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); pm->ps->weaponTime = pm->ps->torsoAnimTimer; pm->ps->saberBlocked = BLOCKED_NONE; pm->ps->weaponstate = WEAPON_FIRING; - if ( breakType == SABERLOCK_SUPERBREAK - && winAnim != BOTH_LK_ST_DL_T_SB_1_W ) + if (breakType == SABERLOCK_SUPERBREAK + && winAnim != BOTH_LK_ST_DL_T_SB_1_W) {//going to attack with saber, do a saber trail - pm->ps->SaberActivateTrail( 200 ); + pm->ps->SaberActivateTrail(200); } } return winAnim; } -int PM_SaberLockLoseAnim( gentity_t *genemy, saberLockResult_t result, int breakType ) -{ +int PM_SaberLockLoseAnim(gentity_t *genemy, saberLockResult_t result, int breakType) +{ int loseAnim = -1; - switch ( genemy->client->ps.torsoAnim ) + switch (genemy->client->ps.torsoAnim) { -/* - default: -#ifndef FINAL_BUILD + /* + default: + #ifndef FINAL_BUILD Com_Printf( S_COLOR_RED"ERROR-PM_SaberLockBreak: %s not in saberlock anim, anim = (%d)%s\n", genemy->NPC_type, genemy->client->ps.torsoAnim, animTable[genemy->client->ps.torsoAnim].name ); -#endif -*/ + #endif + */ case BOTH_BF2LOCK: - if ( breakType == SABERLOCK_SUPERBREAK ) + if (breakType == SABERLOCK_SUPERBREAK) { loseAnim = BOTH_LK_S_S_T_SB_1_L; } - else if ( result == LOCK_DRAW ) + else if (result == LOCK_DRAW) { loseAnim = BOTH_BF1BREAK; } else { - if ( result == LOCK_STALEMATE ) + if (result == LOCK_STALEMATE) {//no-one won genemy->client->ps.saberMove = LS_K1_T_; loseAnim = BOTH_K1_S1_T_; @@ -10008,17 +10035,17 @@ int PM_SaberLockLoseAnim( gentity_t *genemy, saberLockResult_t result, int break } break; case BOTH_BF1LOCK: - if ( breakType == SABERLOCK_SUPERBREAK ) + if (breakType == SABERLOCK_SUPERBREAK) { loseAnim = BOTH_LK_S_S_T_SB_1_L; } - else if ( result == LOCK_DRAW ) + else if (result == LOCK_DRAW) { loseAnim = BOTH_KNOCKDOWN4; } else { - if ( result == LOCK_STALEMATE ) + if (result == LOCK_STALEMATE) {//no-one won genemy->client->ps.saberMove = LS_A_T2B; loseAnim = BOTH_A3_T__B_; @@ -10030,11 +10057,11 @@ int PM_SaberLockLoseAnim( gentity_t *genemy, saberLockResult_t result, int break } break; case BOTH_CWCIRCLELOCK: - if ( breakType == SABERLOCK_SUPERBREAK ) + if (breakType == SABERLOCK_SUPERBREAK) { loseAnim = BOTH_LK_S_S_S_SB_1_L; } - else if ( result == LOCK_DRAW ) + else if (result == LOCK_DRAW) { genemy->client->ps.saberMove = genemy->client->ps.saberBounceMove = LS_V1_BL; genemy->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; @@ -10042,7 +10069,7 @@ int PM_SaberLockLoseAnim( gentity_t *genemy, saberLockResult_t result, int break } else { - if ( result == LOCK_STALEMATE ) + if (result == LOCK_STALEMATE) {//no-one won loseAnim = BOTH_CCWCIRCLEBREAK; } @@ -10060,11 +10087,11 @@ int PM_SaberLockLoseAnim( gentity_t *genemy, saberLockResult_t result, int break } break; case BOTH_CCWCIRCLELOCK: - if ( breakType == SABERLOCK_SUPERBREAK ) + if (breakType == SABERLOCK_SUPERBREAK) { loseAnim = BOTH_LK_S_S_S_SB_1_L; } - else if ( result == LOCK_DRAW ) + else if (result == LOCK_DRAW) { genemy->client->ps.saberMove = genemy->client->ps.saberBounceMove = LS_V1_BR; genemy->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; @@ -10072,7 +10099,7 @@ int PM_SaberLockLoseAnim( gentity_t *genemy, saberLockResult_t result, int break } else { - if ( result == LOCK_STALEMATE ) + if (result == LOCK_STALEMATE) {//no-one won loseAnim = BOTH_CWCIRCLEBREAK; } @@ -10090,9 +10117,9 @@ int PM_SaberLockLoseAnim( gentity_t *genemy, saberLockResult_t result, int break } break; } - if ( loseAnim != -1 ) + if (loseAnim != -1) { - NPC_SetAnim( genemy, SETANIM_BOTH, loseAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(genemy, SETANIM_BOTH, loseAnim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); genemy->client->ps.weaponTime = genemy->client->ps.torsoAnimTimer;// + 250; genemy->client->ps.saberBlocked = BLOCKED_NONE; genemy->client->ps.weaponstate = WEAPON_READY; @@ -10100,10 +10127,10 @@ int PM_SaberLockLoseAnim( gentity_t *genemy, saberLockResult_t result, int break return loseAnim; } -int PM_SaberLockResultAnim( gentity_t *duelist, int lockOrBreakOrSuperBreak, int winOrLose ) +int PM_SaberLockResultAnim(gentity_t *duelist, int lockOrBreakOrSuperBreak, int winOrLose) { int baseAnim = duelist->client->ps.torsoAnim; - switch ( baseAnim ) + switch (baseAnim) { case BOTH_LK_S_S_S_L_2: //lock if I'm using single vs. a single and other intitiated baseAnim = BOTH_LK_S_S_S_L_1; @@ -10125,11 +10152,11 @@ int PM_SaberLockResultAnim( gentity_t *duelist, int lockOrBreakOrSuperBreak, int break; } //what kind of break? - if ( lockOrBreakOrSuperBreak == SABERLOCK_BREAK ) - { + if (lockOrBreakOrSuperBreak == SABERLOCK_BREAK) + { baseAnim -= 2; } - else if ( lockOrBreakOrSuperBreak == SABERLOCK_SUPERBREAK ) + else if (lockOrBreakOrSuperBreak == SABERLOCK_SUPERBREAK) { baseAnim += 1; } @@ -10138,19 +10165,19 @@ int PM_SaberLockResultAnim( gentity_t *duelist, int lockOrBreakOrSuperBreak, int return -1; } //win or lose? - if ( winOrLose == SABERLOCK_WIN ) + if (winOrLose == SABERLOCK_WIN) { baseAnim += 1; } //play the anim and hold it - NPC_SetAnim( duelist, SETANIM_BOTH, baseAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(duelist, SETANIM_BOTH, baseAnim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); - if ( lockOrBreakOrSuperBreak == SABERLOCK_SUPERBREAK - && winOrLose == SABERLOCK_LOSE ) + if (lockOrBreakOrSuperBreak == SABERLOCK_SUPERBREAK + && winOrLose == SABERLOCK_LOSE) {//if you lose a superbreak, you're defenseless //make saberent not block gentity_t *saberent = &g_entities[duelist->client->ps.saberEntityNum]; - if ( saberent ) + if (saberent) { VectorClear(saberent->mins); VectorClear(saberent->maxs); @@ -10165,29 +10192,29 @@ int PM_SaberLockResultAnim( gentity_t *duelist, int lockOrBreakOrSuperBreak, int //no attacking during this anim duelist->client->ps.weaponTime = duelist->client->ps.torsoAnimTimer; duelist->client->ps.saberBlocked = BLOCKED_NONE; - if ( lockOrBreakOrSuperBreak == SABERLOCK_SUPERBREAK + if (lockOrBreakOrSuperBreak == SABERLOCK_SUPERBREAK && winOrLose == SABERLOCK_WIN - && baseAnim != BOTH_LK_ST_DL_T_SB_1_W ) + && baseAnim != BOTH_LK_ST_DL_T_SB_1_W) {//going to attack with saber, do a saber trail - duelist->client->ps.SaberActivateTrail( 200 ); + duelist->client->ps.SaberActivateTrail(200); } return baseAnim; } -void PM_SaberLockBreak( gentity_t *gent, gentity_t *genemy, saberLockResult_t result, int victoryStrength ) +void PM_SaberLockBreak(gentity_t *gent, gentity_t *genemy, saberLockResult_t result, int victoryStrength) { int winAnim = -1, loseAnim = -1; int breakType = SABERLOCK_BREAK; qboolean singleVsSingle = qtrue; - - if ( result == LOCK_VICTORY - && Q_irand(0,7) < victoryStrength ) - { - if ( genemy + + if (result == LOCK_VICTORY + && Q_irand(0, 7) < victoryStrength) + { + if (genemy && genemy->NPC && ((genemy->NPC->aiFlags&NPCAI_BOSS_CHARACTER) - ||(genemy->NPC->aiFlags&NPCAI_SUBBOSS_CHARACTER) - ||(genemy->client&&genemy->client->NPC_class == CLASS_SHADOWTROOPER)) + || (genemy->NPC->aiFlags&NPCAI_SUBBOSS_CHARACTER) + || (genemy->client&&genemy->client->NPC_class == CLASS_SHADOWTROOPER)) && Q_irand(0, 4) ) {//less of a chance of getting a superbreak against a boss @@ -10202,85 +10229,85 @@ void PM_SaberLockBreak( gentity_t *gent, gentity_t *genemy, saberLockResult_t re { breakType = SABERLOCK_BREAK; } - winAnim = PM_SaberLockWinAnim( result, breakType ); - if ( winAnim != -1 ) + winAnim = PM_SaberLockWinAnim(result, breakType); + if (winAnim != -1) {//a single vs. single break - if ( genemy && genemy->client ) + if (genemy && genemy->client) { - loseAnim = PM_SaberLockLoseAnim( genemy, result, breakType ); + loseAnim = PM_SaberLockLoseAnim(genemy, result, breakType); } } else {//must be a saberlock that's not between single and single... singleVsSingle = qfalse; - winAnim = PM_SaberLockResultAnim( gent, breakType, SABERLOCK_WIN ); + winAnim = PM_SaberLockResultAnim(gent, breakType, SABERLOCK_WIN); pm->ps->weaponstate = WEAPON_FIRING; - if ( genemy && genemy->client ) + if (genemy && genemy->client) { - loseAnim = PM_SaberLockResultAnim( genemy, breakType, SABERLOCK_LOSE ); + loseAnim = PM_SaberLockResultAnim(genemy, breakType, SABERLOCK_LOSE); genemy->client->ps.weaponstate = WEAPON_READY; } } - if ( d_saberCombat->integer ) + if (d_saberCombat->integer) { - Com_Printf( "%s won saber lock, anim = %s!\n", gent->NPC_type, animTable[winAnim].name ); - Com_Printf( "%s lost saber lock, anim = %s!\n", genemy->NPC_type, animTable[loseAnim].name ); + Com_Printf("%s won saber lock, anim = %s!\n", gent->NPC_type, animTable[winAnim].name); + Com_Printf("%s lost saber lock, anim = %s!\n", genemy->NPC_type, animTable[loseAnim].name); } pm->ps->saberLockTime = genemy->client->ps.saberLockTime = 0; pm->ps->saberLockEnemy = genemy->client->ps.saberLockEnemy = ENTITYNUM_NONE; pm->ps->saberMoveNext = LS_NONE; - if ( genemy && genemy->client ) + if (genemy && genemy->client) { genemy->client->ps.saberMoveNext = LS_NONE; } - PM_AddEvent( EV_JUMP ); - if ( result == LOCK_STALEMATE ) + PM_AddEvent(EV_JUMP); + if (result == LOCK_STALEMATE) {//no-one won - G_AddEvent( genemy, EV_JUMP, 0 ); + G_AddEvent(genemy, EV_JUMP, 0); } else { - if ( pm->ps->clientNum ) + if (pm->ps->clientNum) {//an NPC pm->ps->saberEventFlags |= SEF_LOCK_WON;//tell the winner to press the advantage } //painDebounceTime will stop them from doing anything genemy->painDebounceTime = level.time + genemy->client->ps.torsoAnimTimer + 500; - if ( Q_irand( 0, 1 ) ) + if (Q_irand(0, 1)) { - G_AddEvent( genemy, EV_PAIN, Q_irand( 0, 75 ) ); + G_AddEvent(genemy, EV_PAIN, Q_irand(0, 75)); } else { - if ( genemy->NPC ) + if (genemy->NPC) { genemy->NPC->blockedSpeechDebounceTime = 0; } - G_AddVoiceEvent( genemy, Q_irand( EV_PUSHED1, EV_PUSHED3 ), 500 ); + G_AddVoiceEvent(genemy, Q_irand(EV_PUSHED1, EV_PUSHED3), 500); } - if ( result == LOCK_VICTORY ) + if (result == LOCK_VICTORY) {//one person won - if ( Q_irand( FORCE_LEVEL_1, FORCE_LEVEL_2 ) < pm->ps->forcePowerLevel[FP_SABER_OFFENSE] ) + if (Q_irand(FORCE_LEVEL_1, FORCE_LEVEL_2) < pm->ps->forcePowerLevel[FP_SABER_OFFENSE]) { - vec3_t throwDir = {0,0,350}; + vec3_t throwDir = { 0, 0, 350 }; int winMove = pm->ps->saberMove; - if ( !singleVsSingle ) + if (!singleVsSingle) {//all others have their own super breaks //so it doesn't try to set some other anim below winAnim = -1; } - else if ( winAnim == BOTH_LK_S_S_S_SB_1_W - || winAnim == BOTH_LK_S_S_T_SB_1_W ) + else if (winAnim == BOTH_LK_S_S_S_SB_1_W + || winAnim == BOTH_LK_S_S_T_SB_1_W) {//doing a superbreak on single-vs-single, don't do the old superbreaks this time //so it doesn't try to set some other anim below winAnim = -1; } else {//JK2-style - switch ( winAnim ) + switch (winAnim) { case BOTH_A3_T__B_: winAnim = BOTH_D1_TL___; @@ -10299,21 +10326,21 @@ void PM_SaberLockBreak( gentity_t *gent, gentity_t *genemy, saberLockResult_t re //FIXME: mod throwDir? break; } - if ( winAnim != BOTH_CCWCIRCLEBREAK ) + if (winAnim != BOTH_CCWCIRCLEBREAK) { - if ( (!genemy->s.number&&genemy->health<=25)//player low on health - ||(genemy->s.number&&genemy->client->NPC_class!=CLASS_KYLE&&genemy->client->NPC_class!=CLASS_LUKE&&genemy->client->NPC_class!=CLASS_TAVION&&genemy->client->NPC_class!=CLASS_ALORA&&genemy->client->NPC_class!=CLASS_DESANN)//any NPC that's not a boss character - ||(genemy->s.number&&genemy->health<=50) )//boss character with less than 50 health left + if ((!genemy->s.number&&genemy->health <= 25)//player low on health + || (genemy->s.number&&genemy->client->NPC_class != CLASS_KYLE&&genemy->client->NPC_class != CLASS_LUKE&&genemy->client->NPC_class != CLASS_TAVION&&genemy->client->NPC_class != CLASS_ALORA&&genemy->client->NPC_class != CLASS_DESANN)//any NPC that's not a boss character + || (genemy->s.number&&genemy->health <= 50))//boss character with less than 50 health left {//possibly knock saber out of hand OR cut hand off! - if ( Q_irand( 0, 25 ) < victoryStrength - && ((!genemy->s.number&&genemy->health<=10)||genemy->s.number) ) + if (Q_irand(0, 25) < victoryStrength + && ((!genemy->s.number&&genemy->health <= 10) || genemy->s.number)) { - NPC_SetAnim( genemy, SETANIM_BOTH, BOTH_RIGHTHANDCHOPPEDOFF, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD );//force this + NPC_SetAnim(genemy, SETANIM_BOTH, BOTH_RIGHTHANDCHOPPEDOFF, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD);//force this genemy->client->dismembered = false; - G_DoDismemberment( genemy, genemy->client->renderInfo.handRPoint, MOD_SABER, 1000, HL_HAND_RT, qtrue ); - G_Damage( genemy, gent, gent, throwDir, genemy->client->renderInfo.handRPoint, genemy->health+10, DAMAGE_NO_PROTECTION|DAMAGE_NO_ARMOR|DAMAGE_NO_KNOCKBACK|DAMAGE_NO_HIT_LOC, MOD_SABER, HL_NONE ); + G_DoDismemberment(genemy, genemy->client->renderInfo.handRPoint, MOD_SABER, 1000, HL_HAND_RT, qtrue); + G_Damage(genemy, gent, gent, throwDir, genemy->client->renderInfo.handRPoint, genemy->health + 10, DAMAGE_NO_PROTECTION | DAMAGE_NO_ARMOR | DAMAGE_NO_KNOCKBACK | DAMAGE_NO_HIT_LOC, MOD_SABER, HL_NONE); - PM_SetAnim( pm, SETANIM_BOTH, winAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_BOTH, winAnim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); pm->ps->weaponTime = pm->ps->torsoAnimTimer + 500; pm->ps->saberMove = winMove; pm->ps->saberBlocked = BLOCKED_NONE; @@ -10325,36 +10352,36 @@ void PM_SaberLockBreak( gentity_t *gent, gentity_t *genemy, saberLockResult_t re } //else see if we can knock the saber out of their hand //FIXME: for now, always disarm the right-hand saber - if ( !(genemy->client->ps.saber[0].saberFlags&SFL_NOT_DISARMABLE) ) + if (!(genemy->client->ps.saber[0].saberFlags&SFL_NOT_DISARMABLE)) { //add disarmBonus into this check - victoryStrength += pm->ps->SaberDisarmBonus( 0 )*2; - if ( (genemy->client->ps.saber[0].saberFlags&SFL_TWO_HANDED) - || (genemy->client->ps.dualSabers && genemy->client->ps.saber[1].Active()) ) + victoryStrength += pm->ps->SaberDisarmBonus(0) * 2; + if ((genemy->client->ps.saber[0].saberFlags&SFL_TWO_HANDED) + || (genemy->client->ps.dualSabers && genemy->client->ps.saber[1].Active())) {//defender gets a bonus for using a 2-handed saber or 2 sabers victoryStrength -= 2; } - if ( pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1 << FP_RAGE)) { victoryStrength += gent->client->ps.forcePowerLevel[FP_RAGE]; } - else if ( pm->ps->forceRageRecoveryTime > pm->cmd.serverTime ) + else if (pm->ps->forceRageRecoveryTime > pm->cmd.serverTime) { victoryStrength--; } - if ( genemy->client->ps.forceRageRecoveryTime > pm->cmd.serverTime ) + if (genemy->client->ps.forceRageRecoveryTime > pm->cmd.serverTime) { victoryStrength++; } - if ( Q_irand( 0, 10 ) < victoryStrength ) + if (Q_irand(0, 10) < victoryStrength) { - if ( !(genemy->client->ps.saber[0].saberFlags&SFL_TWO_HANDED) - || !Q_irand( 0, 1 ) ) + if (!(genemy->client->ps.saber[0].saberFlags&SFL_TWO_HANDED) + || !Q_irand(0, 1)) {//if it's a two-handed saber, it has a 50% chance of resisting a disarming - WP_SaberLose( genemy, throwDir ); - if ( winAnim != -1 ) + WP_SaberLose(genemy, throwDir); + if (winAnim != -1) { - PM_SetAnim( pm, SETANIM_BOTH, winAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_BOTH, winAnim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); pm->ps->weaponTime = pm->ps->torsoAnimTimer; pm->ps->saberMove = winMove; pm->ps->saberBlocked = BLOCKED_NONE; @@ -10368,59 +10395,59 @@ void PM_SaberLockBreak( gentity_t *gent, gentity_t *genemy, saberLockResult_t re } } -int G_SaberLockStrength( gentity_t *gent ) +int G_SaberLockStrength(gentity_t *gent) { int strength = gent->client->ps.saber[0].lockBonus; - if ( (gent->client->ps.saber[0].saberFlags&SFL_TWO_HANDED) ) + if ((gent->client->ps.saber[0].saberFlags&SFL_TWO_HANDED)) { strength += 1; } - if ( gent->client->ps.dualSabers && gent->client->ps.saber[1].Active() ) + if (gent->client->ps.dualSabers && gent->client->ps.saber[1].Active()) { strength += 1 + gent->client->ps.saber[1].lockBonus; } - if ( gent->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_RAGE)) { strength += gent->client->ps.forcePowerLevel[FP_RAGE]; } - else if ( gent->client->ps.forceRageRecoveryTime > pm->cmd.serverTime ) + else if (gent->client->ps.forceRageRecoveryTime > pm->cmd.serverTime) { strength--; } - if ( gent->s.number >= MAX_CLIENTS ) + if (gent->s.number >= MAX_CLIENTS) { - if ( gent->client->NPC_class == CLASS_DESANN || gent->client->NPC_class == CLASS_LUKE ) + if (gent->client->NPC_class == CLASS_DESANN || gent->client->NPC_class == CLASS_LUKE) { - strength += 5+Q_irand(0,g_spskill->integer); + strength += 5 + Q_irand(0, g_spskill->integer); } else { - strength += gent->client->ps.forcePowerLevel[FP_SABER_OFFENSE]+Q_irand(0,g_spskill->integer); - if ( gent->NPC ) + strength += gent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] + Q_irand(0, g_spskill->integer); + if (gent->NPC) { - if ( (gent->NPC->aiFlags&NPCAI_BOSS_CHARACTER) - || (gent->NPC->aiFlags&NPCAI_ROSH) - || gent->client->NPC_class == CLASS_SHADOWTROOPER ) + if ((gent->NPC->aiFlags&NPCAI_BOSS_CHARACTER) + || (gent->NPC->aiFlags&NPCAI_ROSH) + || gent->client->NPC_class == CLASS_SHADOWTROOPER) { - strength += Q_irand(0,2); + strength += Q_irand(0, 2); } - else if ( (gent->NPC->aiFlags&NPCAI_SUBBOSS_CHARACTER) ) + else if ((gent->NPC->aiFlags&NPCAI_SUBBOSS_CHARACTER)) { - strength += Q_irand(-1,1); + strength += Q_irand(-1, 1); } } } } - else + else {//player - strength += gent->client->ps.forcePowerLevel[FP_SABER_OFFENSE]+Q_irand(0,g_spskill->integer)+Q_irand(0,1); + strength += gent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] + Q_irand(0, g_spskill->integer) + Q_irand(0, 1); } return strength; } -qboolean PM_InSaberLockOld( int anim ) +qboolean PM_InSaberLockOld(int anim) { - switch ( anim ) + switch (anim) { case BOTH_BF2LOCK: case BOTH_BF1LOCK: @@ -10431,9 +10458,9 @@ qboolean PM_InSaberLockOld( int anim ) return qfalse; } -qboolean PM_InSaberLock( int anim ) +qboolean PM_InSaberLock(int anim) { - switch ( anim ) + switch (anim) { case BOTH_LK_S_DL_S_L_1: //lock if I'm using single vs. a dual case BOTH_LK_S_DL_T_L_1: //lock if I'm using single vs. a dual @@ -10462,197 +10489,200 @@ qboolean PM_InSaberLock( int anim ) return qtrue; break; default: - return PM_InSaberLockOld( anim ); + return PM_InSaberLockOld(anim); break; } //return qfalse; } -extern qboolean ValidAnimFileIndex ( int index ); -extern qboolean G_CheckIncrementLockAnim( int anim, int winOrLose ); -qboolean PM_SaberLocked( void ) -{ +extern qboolean ValidAnimFileIndex(int index); +extern qboolean G_CheckIncrementLockAnim(int anim, int winOrLose); +qboolean PM_SaberLocked(void) +{ //FIXME: maybe kick out of saberlock? - if ( pm->ps->saberLockEnemy == ENTITYNUM_NONE ) + if (pm->ps->saberLockEnemy == ENTITYNUM_NONE) { - if ( PM_InSaberLock( pm->ps->torsoAnim ) ) + if (PM_InSaberLock(pm->ps->torsoAnim)) {//wtf? Maybe enemy died? - PM_SaberLockWinAnim( LOCK_STALEMATE, SABERLOCK_BREAK ); + PM_SaberLockWinAnim(LOCK_STALEMATE, SABERLOCK_BREAK); } return qfalse; } gentity_t *gent = pm->gent; - if ( !gent ) + if (!gent) { return qfalse; } gentity_t *genemy = &g_entities[pm->ps->saberLockEnemy]; - if ( !genemy ) + if (!genemy) { return qfalse; } - if ( PM_InSaberLock( pm->ps->torsoAnim ) && PM_InSaberLock( genemy->client->ps.torsoAnim ) ) + if (PM_InSaberLock(pm->ps->torsoAnim) && PM_InSaberLock(genemy->client->ps.torsoAnim)) { - if ( pm->ps->saberLockTime <= level.time + 500 - && pm->ps->saberLockEnemy != ENTITYNUM_NONE ) + if (pm->ps->saberLockTime <= level.time + 500 + && pm->ps->saberLockEnemy != ENTITYNUM_NONE) {//lock just ended - int strength = G_SaberLockStrength( gent ); - int eStrength = G_SaberLockStrength( genemy ); - if ( strength > 1 && eStrength > 1 && !Q_irand( 0, abs(strength-eStrength)+1 ) ) + int strength = G_SaberLockStrength(gent); + int eStrength = G_SaberLockStrength(genemy); + if (strength > 1 && eStrength > 1 && !Q_irand(0, abs(strength - eStrength) + 1)) {//both knock each other down! - PM_SaberLockBreak( gent, genemy, LOCK_DRAW, 0 ); + PM_SaberLockBreak(gent, genemy, LOCK_DRAW, 0); } else {//both "win" - PM_SaberLockBreak( gent, genemy, LOCK_STALEMATE, 0 ); + PM_SaberLockBreak(gent, genemy, LOCK_STALEMATE, 0); } return qtrue; } - else if ( pm->ps->saberLockTime < level.time ) + else if (pm->ps->saberLockTime < level.time) {//done... tie breaker above should have handled this, but...? - if ( PM_InSaberLock( pm->ps->torsoAnim ) && pm->ps->torsoAnimTimer > 0 ) + if (PM_InSaberLock(pm->ps->torsoAnim) && pm->ps->torsoAnimTimer > 0) { pm->ps->torsoAnimTimer = 0; } - if ( PM_InSaberLock( pm->ps->legsAnim ) && pm->ps->legsAnimTimer > 0 ) + if (PM_InSaberLock(pm->ps->legsAnim) && pm->ps->legsAnimTimer > 0) { pm->ps->legsAnimTimer = 0; } return qfalse; } - else if ( pm->cmd.buttons & BUTTON_ATTACK ) + else if (pm->cmd.buttons & BUTTON_ATTACK) {//holding attack - if ( !(pm->ps->pm_flags&PMF_ATTACK_HELD) ) + if (!(pm->ps->pm_flags&PMF_ATTACK_HELD)) {//tapping int remaining = 0; - if( ValidAnimFileIndex( gent->client->clientInfo.animFileIndex ) ) + if (ValidAnimFileIndex(gent->client->clientInfo.animFileIndex)) { animation_t *anim; float currentFrame, junk2; int curFrame, junk; int strength = 1; anim = &level.knownAnimFileSets[gent->client->clientInfo.animFileIndex].animations[pm->ps->torsoAnim]; - qboolean ret; - ret=gi.G2API_GetBoneAnimIndex( &gent->ghoul2[gent->playerModel], gent->lowerLumbarBone, (cg.time?cg.time:level.time), ¤tFrame, &junk, &junk, &junk, &junk2, NULL ); +#ifdef _DEBUG + qboolean ret = +#endif + gi.G2API_GetBoneAnimIndex(&gent->ghoul2[gent->playerModel], gent->lowerLumbarBone, + (cg.time ? cg.time : level.time), ¤tFrame, &junk, &junk, &junk, &junk2, NULL); assert(ret); // this would be pretty bad, the below code seems to assume the call succeeds. -gil - - strength = G_SaberLockStrength( gent ); - if ( PM_InSaberLockOld( pm->ps->torsoAnim ) ) + + strength = G_SaberLockStrength(gent); + if (PM_InSaberLockOld(pm->ps->torsoAnim)) {//old locks - if ( pm->ps->torsoAnim == BOTH_CCWCIRCLELOCK || - pm->ps->torsoAnim == BOTH_BF2LOCK ) + if (pm->ps->torsoAnim == BOTH_CCWCIRCLELOCK || + pm->ps->torsoAnim == BOTH_BF2LOCK) { - curFrame = floor( currentFrame )-strength; + curFrame = floor(currentFrame) - strength; //drop my frame one - if ( curFrame <= anim->firstFrame ) + if (curFrame <= anim->firstFrame) {//I won! Break out - PM_SaberLockBreak( gent, genemy, LOCK_VICTORY, strength ); + PM_SaberLockBreak(gent, genemy, LOCK_VICTORY, strength); return qtrue; } else { - PM_SetAnimFrame( gent, curFrame, qtrue, qtrue ); - remaining = curFrame-anim->firstFrame; - if ( d_saberCombat->integer ) + PM_SetAnimFrame(gent, curFrame, qtrue, qtrue); + remaining = curFrame - anim->firstFrame; + if (d_saberCombat->integer) { - Com_Printf( "%s pushing in saber lock, %d frames to go!\n", gent->NPC_type, remaining ); + Com_Printf("%s pushing in saber lock, %d frames to go!\n", gent->NPC_type, remaining); } } } else { - curFrame = ceil( currentFrame )+strength; + curFrame = ceil(currentFrame) + strength; //advance my frame one - if ( curFrame >= anim->firstFrame+anim->numFrames ) + if (curFrame >= anim->firstFrame + anim->numFrames) {//I won! Break out - PM_SaberLockBreak( gent, genemy, LOCK_VICTORY, strength ); + PM_SaberLockBreak(gent, genemy, LOCK_VICTORY, strength); return qtrue; } else { - PM_SetAnimFrame( gent, curFrame, qtrue, qtrue ); - remaining = anim->firstFrame+anim->numFrames-curFrame; - if ( d_saberCombat->integer ) + PM_SetAnimFrame(gent, curFrame, qtrue, qtrue); + remaining = anim->firstFrame + anim->numFrames - curFrame; + if (d_saberCombat->integer) { - Com_Printf( "%s pushing in saber lock, %d frames to go!\n", gent->NPC_type, remaining ); + Com_Printf("%s pushing in saber lock, %d frames to go!\n", gent->NPC_type, remaining); } } } } else {//new locks - if ( G_CheckIncrementLockAnim( pm->ps->torsoAnim, SABERLOCK_WIN ) ) + if (G_CheckIncrementLockAnim(pm->ps->torsoAnim, SABERLOCK_WIN)) { - curFrame = ceil( currentFrame )+strength; + curFrame = ceil(currentFrame) + strength; //advance my frame one - if ( curFrame >= anim->firstFrame+anim->numFrames ) + if (curFrame >= anim->firstFrame + anim->numFrames) {//I won! Break out - PM_SaberLockBreak( gent, genemy, LOCK_VICTORY, strength ); + PM_SaberLockBreak(gent, genemy, LOCK_VICTORY, strength); return qtrue; } else { - PM_SetAnimFrame( gent, curFrame, qtrue, qtrue ); - remaining = anim->firstFrame+anim->numFrames-curFrame; - if ( d_saberCombat->integer ) + PM_SetAnimFrame(gent, curFrame, qtrue, qtrue); + remaining = anim->firstFrame + anim->numFrames - curFrame; + if (d_saberCombat->integer) { - Com_Printf( "%s pushing in saber lock, %d frames to go!\n", gent->NPC_type, remaining ); + Com_Printf("%s pushing in saber lock, %d frames to go!\n", gent->NPC_type, remaining); } } } else { - curFrame = floor( currentFrame )-strength; + curFrame = floor(currentFrame) - strength; //drop my frame one - if ( curFrame <= anim->firstFrame ) + if (curFrame <= anim->firstFrame) {//I won! Break out - PM_SaberLockBreak( gent, genemy, LOCK_VICTORY, strength ); + PM_SaberLockBreak(gent, genemy, LOCK_VICTORY, strength); return qtrue; } else { - PM_SetAnimFrame( gent, curFrame, qtrue, qtrue ); - remaining = curFrame-anim->firstFrame; - if ( d_saberCombat->integer ) + PM_SetAnimFrame(gent, curFrame, qtrue, qtrue); + remaining = curFrame - anim->firstFrame; + if (d_saberCombat->integer) { - Com_Printf( "%s pushing in saber lock, %d frames to go!\n", gent->NPC_type, remaining ); + Com_Printf("%s pushing in saber lock, %d frames to go!\n", gent->NPC_type, remaining); } } } } - if ( !Q_irand( 0, 2 ) ) + if (!Q_irand(0, 2)) { - if ( pm->ps->clientNum < MAX_CLIENTS ) + if (pm->ps->clientNum < MAX_CLIENTS) { - if ( !Q_irand( 0, 3 ) ) + if (!Q_irand(0, 3)) { - PM_AddEvent( EV_JUMP ); + PM_AddEvent(EV_JUMP); } else { - PM_AddEvent( Q_irand( EV_PUSHED1, EV_PUSHED3 ) ); + PM_AddEvent(Q_irand(EV_PUSHED1, EV_PUSHED3)); } } else { - if ( gent->NPC && gent->NPC->blockedSpeechDebounceTime < level.time ) + if (gent->NPC && gent->NPC->blockedSpeechDebounceTime < level.time) { - switch ( Q_irand( 0, 3 ) ) + switch (Q_irand(0, 3)) { case 0: - PM_AddEvent( EV_JUMP ); + PM_AddEvent(EV_JUMP); break; case 1: - PM_AddEvent( Q_irand( EV_ANGER1, EV_ANGER3 ) ); + PM_AddEvent(Q_irand(EV_ANGER1, EV_ANGER3)); gent->NPC->blockedSpeechDebounceTime = level.time + 3000; break; case 2: - PM_AddEvent( Q_irand( EV_TAUNT1, EV_TAUNT3 ) ); + PM_AddEvent(Q_irand(EV_TAUNT1, EV_TAUNT3)); gent->NPC->blockedSpeechDebounceTime = level.time + 3000; break; case 3: - PM_AddEvent( Q_irand( EV_GLOAT1, EV_GLOAT3 ) ); + PM_AddEvent(Q_irand(EV_GLOAT1, EV_GLOAT3)); gent->NPC->blockedSpeechDebounceTime = level.time + 3000; break; } @@ -10665,7 +10695,7 @@ qboolean PM_SaberLocked( void ) return qfalse; } - if( ValidAnimFileIndex( genemy->client->clientInfo.animFileIndex ) ) + if (ValidAnimFileIndex(genemy->client->clientInfo.animFileIndex)) { animation_t *anim; anim = &level.knownAnimFileSets[genemy->client->clientInfo.animFileIndex].animations[genemy->client->ps.torsoAnim]; @@ -10676,47 +10706,47 @@ qboolean PM_SaberLocked( void ) gi.G2API_GetBoneAnimIndex( &genemy->ghoul2[genemy->playerModel], genemy->lowerLumbarBone, (cg.time?cg.time:level.time), ¤tFrame, &junk, &junk, &junk, &junk2, NULL ); */ - if ( !Q_irand( 0, 2 ) ) + if (!Q_irand(0, 2)) { - switch ( Q_irand( 0, 3 ) ) + switch (Q_irand(0, 3)) { case 0: - G_AddEvent( genemy, EV_PAIN, floor((float)genemy->health/genemy->max_health*100.0f) ); + G_AddEvent(genemy, EV_PAIN, floor((float)genemy->health / genemy->max_health*100.0f)); break; case 1: - G_AddVoiceEvent( genemy, Q_irand( EV_PUSHED1, EV_PUSHED3 ), 500 ); + G_AddVoiceEvent(genemy, Q_irand(EV_PUSHED1, EV_PUSHED3), 500); break; case 2: - G_AddVoiceEvent( genemy, Q_irand( EV_CHOKE1, EV_CHOKE3 ), 500 ); + G_AddVoiceEvent(genemy, Q_irand(EV_CHOKE1, EV_CHOKE3), 500); break; case 3: - G_AddVoiceEvent( genemy, EV_PUSHFAIL, 2000 ); + G_AddVoiceEvent(genemy, EV_PUSHFAIL, 2000); break; } } - if ( PM_InSaberLockOld( genemy->client->ps.torsoAnim ) ) + if (PM_InSaberLockOld(genemy->client->ps.torsoAnim)) { - if ( genemy->client->ps.torsoAnim == BOTH_CCWCIRCLELOCK || - genemy->client->ps.torsoAnim == BOTH_BF2LOCK ) + if (genemy->client->ps.torsoAnim == BOTH_CCWCIRCLELOCK || + genemy->client->ps.torsoAnim == BOTH_BF2LOCK) { - PM_SetAnimFrame( genemy, anim->firstFrame+anim->numFrames-remaining, qtrue, qtrue ); + PM_SetAnimFrame(genemy, anim->firstFrame + anim->numFrames - remaining, qtrue, qtrue); } else { - PM_SetAnimFrame( genemy, anim->firstFrame+remaining, qtrue, qtrue ); + PM_SetAnimFrame(genemy, anim->firstFrame + remaining, qtrue, qtrue); } } else {//new locks //??? - if ( G_CheckIncrementLockAnim( genemy->client->ps.torsoAnim, SABERLOCK_LOSE ) ) + if (G_CheckIncrementLockAnim(genemy->client->ps.torsoAnim, SABERLOCK_LOSE)) { - PM_SetAnimFrame( genemy, anim->firstFrame+anim->numFrames-remaining, qtrue, qtrue ); + PM_SetAnimFrame(genemy, anim->firstFrame + anim->numFrames - remaining, qtrue, qtrue); } else { - PM_SetAnimFrame( genemy, anim->firstFrame+remaining, qtrue, qtrue ); + PM_SetAnimFrame(genemy, anim->firstFrame + remaining, qtrue, qtrue); } } } @@ -10732,35 +10762,35 @@ qboolean PM_SaberLocked( void ) } else {//something broke us out of it - if ( gent->painDebounceTime > level.time && genemy->painDebounceTime > level.time ) + if (gent->painDebounceTime > level.time && genemy->painDebounceTime > level.time) { - PM_SaberLockBreak( gent, genemy, LOCK_DRAW, 0 ); + PM_SaberLockBreak(gent, genemy, LOCK_DRAW, 0); } - else if ( gent->painDebounceTime > level.time ) + else if (gent->painDebounceTime > level.time) { - PM_SaberLockBreak( genemy, gent, LOCK_VICTORY, 0 ); + PM_SaberLockBreak(genemy, gent, LOCK_VICTORY, 0); } - else if ( genemy->painDebounceTime > level.time ) + else if (genemy->painDebounceTime > level.time) { - PM_SaberLockBreak( gent, genemy, LOCK_VICTORY, 0 ); + PM_SaberLockBreak(gent, genemy, LOCK_VICTORY, 0); } else { - PM_SaberLockBreak( gent, genemy, LOCK_STALEMATE, 0 ); + PM_SaberLockBreak(gent, genemy, LOCK_STALEMATE, 0); } } return qtrue; } -qboolean G_EnemyInKickRange( gentity_t *self, gentity_t *enemy ) +qboolean G_EnemyInKickRange(gentity_t *self, gentity_t *enemy) { - if ( !self || !enemy ) + if (!self || !enemy) { return qfalse; } - if ( fabs(self->currentOrigin[2]-enemy->currentOrigin[2]) < 32 ) + if (fabs(self->currentOrigin[2] - enemy->currentOrigin[2]) < 32) {//generally at same height - if ( DistanceHorizontal( self->currentOrigin, enemy->currentOrigin ) <= (STAFF_KICK_RANGE+8.0f+(self->maxs[0]*1.5f)+(enemy->maxs[0]*1.5f)) ) + if (DistanceHorizontal(self->currentOrigin, enemy->currentOrigin) <= (STAFF_KICK_RANGE + 8.0f + (self->maxs[0] * 1.5f) + (enemy->maxs[0] * 1.5f))) {//within kicking range! return qtrue; } @@ -10768,11 +10798,11 @@ qboolean G_EnemyInKickRange( gentity_t *self, gentity_t *enemy ) return qfalse; } -qboolean G_CanKickEntity( gentity_t *self, gentity_t *target ) +qboolean G_CanKickEntity(gentity_t *self, gentity_t *target) { - if ( target && target->client - && !PM_InKnockDown( &target->client->ps ) - && G_EnemyInKickRange( self, target ) ) + if (target && target->client + && !PM_InKnockDown(&target->client->ps) + && G_EnemyInKickRange(self, target)) { return qtrue; } @@ -10797,7 +10827,7 @@ float PM_GroundDistance(void) float G_GroundDistance(gentity_t *self) { - if ( !self ) + if (!self) {//wtf?!! return Q3_INFINITE; } @@ -10815,26 +10845,26 @@ float G_GroundDistance(gentity_t *self) return VectorLength(down); } -saberMoveName_t G_PickAutoKick( gentity_t *self, gentity_t *enemy, qboolean storeMove ) +saberMoveName_t G_PickAutoKick(gentity_t *self, gentity_t *enemy, qboolean storeMove) { saberMoveName_t kickMove = LS_NONE; - if ( !self || !self->client ) + if (!self || !self->client) { return LS_NONE; } - if ( !enemy ) + if (!enemy) { return LS_NONE; } - vec3_t v_fwd, v_rt, enemyDir, fwdAngs = {0,self->client->ps.viewangles[YAW],0}; - VectorSubtract( enemy->currentOrigin, self->currentOrigin, enemyDir ); - VectorNormalize( enemyDir );//not necessary, I guess, but doesn't happen often - AngleVectors( fwdAngs, v_fwd, v_rt, NULL ); - float fDot = DotProduct( enemyDir, v_fwd ); - float rDot = DotProduct( enemyDir, v_rt ); - if ( fabs( rDot ) > 0.5f && fabs( fDot ) < 0.5f ) + vec3_t v_fwd, v_rt, enemyDir, fwdAngs = { 0, self->client->ps.viewangles[YAW], 0 }; + VectorSubtract(enemy->currentOrigin, self->currentOrigin, enemyDir); + VectorNormalize(enemyDir);//not necessary, I guess, but doesn't happen often + AngleVectors(fwdAngs, v_fwd, v_rt, NULL); + float fDot = DotProduct(enemyDir, v_fwd); + float rDot = DotProduct(enemyDir, v_rt); + if (fabs(rDot) > 0.5f && fabs(fDot) < 0.5f) {//generally to one side - if ( rDot > 0 ) + if (rDot > 0) {//kick right kickMove = LS_KICK_R; } @@ -10843,9 +10873,9 @@ saberMoveName_t G_PickAutoKick( gentity_t *self, gentity_t *enemy, qboolean stor kickMove = LS_KICK_L; } } - else if ( fabs( fDot ) > 0.5f && fabs( rDot ) < 0.5f ) + else if (fabs(fDot) > 0.5f && fabs(rDot) < 0.5f) {//generally in front or behind us - if ( fDot > 0 ) + if (fDot > 0) {//kick fwd kickMove = LS_KICK_F; } @@ -10857,20 +10887,20 @@ saberMoveName_t G_PickAutoKick( gentity_t *self, gentity_t *enemy, qboolean stor else {//diagonal to us, kick would miss } - if ( kickMove != LS_NONE ) + if (kickMove != LS_NONE) {//have a valid one to do - if ( self->client->ps.groundEntityNum == ENTITYNUM_NONE ) + if (self->client->ps.groundEntityNum == ENTITYNUM_NONE) {//if in air, convert kick to an in-air kick - float gDist = G_GroundDistance( self ); + float gDist = G_GroundDistance(self); //let's only allow air kicks if a certain distance from the ground //it's silly to be able to do them right as you land. //also looks wrong to transition from a non-complete flip anim... - if ((!PM_FlippingAnim( self->client->ps.legsAnim ) || self->client->ps.legsAnimTimer <= 0) && + if ((!PM_FlippingAnim(self->client->ps.legsAnim) || self->client->ps.legsAnimTimer <= 0) && gDist > 64.0f && //strict minimum - gDist > (-self->client->ps.velocity[2])-64.0f //make sure we are high to ground relative to downward velocity as well + gDist > (-self->client->ps.velocity[2]) - 64.0f //make sure we are high to ground relative to downward velocity as well ) { - switch ( kickMove ) + switch (kickMove) { case LS_KICK_F: kickMove = LS_KICK_F_AIR; @@ -10891,13 +10921,13 @@ saberMoveName_t G_PickAutoKick( gentity_t *self, gentity_t *enemy, qboolean stor } else {//leave it as a normal kick unless we're too high up - if ( gDist > 128.0f || self->client->ps.velocity[2] >= 0 ) + if (gDist > 128.0f || self->client->ps.velocity[2] >= 0) { //off ground, but too close to ground kickMove = LS_NONE; } } } - if ( storeMove ) + if (storeMove) { self->client->ps.saberMoveNext = kickMove; } @@ -10905,18 +10935,18 @@ saberMoveName_t G_PickAutoKick( gentity_t *self, gentity_t *enemy, qboolean stor return kickMove; } -saberMoveName_t PM_PickAutoKick( gentity_t *enemy ) +saberMoveName_t PM_PickAutoKick(gentity_t *enemy) { - return G_PickAutoKick( pm->gent, enemy, qfalse ); + return G_PickAutoKick(pm->gent, enemy, qfalse); } -saberMoveName_t G_PickAutoMultiKick( gentity_t *self, qboolean allowSingles, qboolean storeMove ) +saberMoveName_t G_PickAutoMultiKick(gentity_t *self, qboolean allowSingles, qboolean storeMove) { gentity_t *ent; gentity_t *entityList[MAX_GENTITIES]; vec3_t mins, maxs; int i, e; - int radius = ((self->maxs[0]*1.5f)+(self->maxs[0]*1.5f)+STAFF_KICK_RANGE+24.0f);//a little wide on purpose + int radius = ((self->maxs[0] * 1.5f) + (self->maxs[0] * 1.5f) + STAFF_KICK_RANGE + 24.0f);//a little wide on purpose vec3_t center; saberMoveName_t kickMove, bestKick = LS_NONE; float distToEnt, bestDistToEnt = Q3_INFINITE; @@ -10926,55 +10956,55 @@ saberMoveName_t G_PickAutoMultiKick( gentity_t *self, qboolean allowSingles, qbo int enemiesRight = 0; int enemiesLeft = 0; int enemiesSpin = 0; - - if ( !self || !self->client ) + + if (!self || !self->client) { return LS_NONE; } - VectorCopy( self->currentOrigin, center ); + VectorCopy(self->currentOrigin, center); - for ( i = 0 ; i < 3 ; i++ ) + for (i = 0; i < 3; i++) { mins[i] = center[i] - radius; maxs[i] = center[i] + radius; } - int numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); + int numListedEntities = gi.EntitiesInBox(mins, maxs, entityList, MAX_GENTITIES); - for ( e = 0 ; e < numListedEntities ; e++ ) + for (e = 0; e < numListedEntities; e++) { - ent = entityList[ e ]; + ent = entityList[e]; if (ent == self) continue; if (ent->owner == self) continue; - if ( !(ent->inuse) ) + if (!(ent->inuse)) continue; //not a client? - if ( !ent->client ) + if (!ent->client) continue; //ally? - if ( ent->client->playerTeam == self->client->playerTeam ) + if (ent->client->playerTeam == self->client->playerTeam) continue; //dead? - if ( ent->health <= 0 ) + if (ent->health <= 0) continue; //too far? - distToEnt = DistanceSquared( ent->currentOrigin, center ); - if ( distToEnt > (radius*radius) ) + distToEnt = DistanceSquared(ent->currentOrigin, center); + if (distToEnt > (radius*radius)) continue; - kickMove = G_PickAutoKick( self, ent, qfalse ); - if ( kickMove == LS_KICK_F_AIR + kickMove = G_PickAutoKick(self, ent, qfalse); + if (kickMove == LS_KICK_F_AIR && kickMove == LS_KICK_B_AIR && kickMove == LS_KICK_R_AIR - && kickMove == LS_KICK_L_AIR ) + && kickMove == LS_KICK_L_AIR) {//in air? Can't do multikicks } else { - switch ( kickMove ) + switch (kickMove) { case LS_KICK_F: enemiesFront++; @@ -10993,10 +11023,10 @@ saberMoveName_t G_PickAutoMultiKick( gentity_t *self, qboolean allowSingles, qbo break; } } - if ( allowSingles ) + if (allowSingles) { - if ( kickMove != LS_NONE - && distToEnt < bestDistToEnt ) + if (kickMove != LS_NONE + && distToEnt < bestDistToEnt) { bestKick = kickMove; bestEnt = ent; @@ -11004,41 +11034,41 @@ saberMoveName_t G_PickAutoMultiKick( gentity_t *self, qboolean allowSingles, qbo } } kickMove = LS_NONE; - if ( self->client->ps.groundEntityNum != ENTITYNUM_NONE ) + if (self->client->ps.groundEntityNum != ENTITYNUM_NONE) {//can't do the multikicks in air - if ( enemiesFront && enemiesBack - && (enemiesFront+enemiesBack)-(enemiesRight+enemiesLeft)>1 ) + if (enemiesFront && enemiesBack + && (enemiesFront + enemiesBack) - (enemiesRight + enemiesLeft)>1) {//more enemies in front/back than left/right kickMove = LS_KICK_BF; } - else if ( enemiesRight && enemiesLeft - && (enemiesRight+enemiesLeft)-(enemiesFront+enemiesBack)>1 ) + else if (enemiesRight && enemiesLeft + && (enemiesRight + enemiesLeft) - (enemiesFront + enemiesBack)>1) {//more enemies on left & right than front/back kickMove = LS_KICK_RL; } - else if ( (enemiesFront || enemiesBack) && (enemiesRight || enemiesLeft) ) + else if ((enemiesFront || enemiesBack) && (enemiesRight || enemiesLeft)) {//at least 2 enemies around us, not aligned kickMove = LS_KICK_S; } - else if ( enemiesSpin > 1 ) + else if (enemiesSpin > 1) {//at least 2 enemies around us, not aligned kickMove = LS_KICK_S; } } - if ( kickMove == LS_NONE - && bestKick != LS_NONE ) + if (kickMove == LS_NONE + && bestKick != LS_NONE) {//no good multi-kick move, but we do have a nice single-kick we found kickMove = bestKick; //get mad at him so he knows he's being targetted - if ( (self->s.number < MAX_CLIENTS||G_ControlledByPlayer(self)) - && bestEnt != NULL ) + if ((self->s.number < MAX_CLIENTS || G_ControlledByPlayer(self)) + && bestEnt != NULL) {//player - G_SetEnemy( self, bestEnt ); + G_SetEnemy(self, bestEnt); } } - if ( kickMove != LS_NONE ) + if (kickMove != LS_NONE) { - if ( storeMove ) + if (storeMove) { self->client->ps.saberMoveNext = kickMove; } @@ -11046,50 +11076,50 @@ saberMoveName_t G_PickAutoMultiKick( gentity_t *self, qboolean allowSingles, qbo return kickMove; } -qboolean PM_PickAutoMultiKick( qboolean allowSingles ) +qboolean PM_PickAutoMultiKick(qboolean allowSingles) { - saberMoveName_t kickMove = G_PickAutoMultiKick( pm->gent, allowSingles, qfalse ); - if ( kickMove != LS_NONE ) + saberMoveName_t kickMove = G_PickAutoMultiKick(pm->gent, allowSingles, qfalse); + if (kickMove != LS_NONE) { - PM_SetSaberMove( kickMove ); + PM_SetSaberMove(kickMove); return qtrue; } return qfalse; } -qboolean PM_SaberThrowable( void ) +qboolean PM_SaberThrowable(void) { //player gets to kick if holding use - if ( (pm->cmd.buttons&BUTTON_USE) ) + if ((pm->cmd.buttons&BUTTON_USE)) { return qfalse; } //ugh, hard-coding this is bad... - if ( pm->ps->saberAnimLevel == SS_STAFF ) + if (pm->ps->saberAnimLevel == SS_STAFF) { return qfalse; } - + if (!(pm->ps->saber[0].saberFlags&SFL_NOT_THROWABLE) && !(pm->cmd.buttons&BUTTON_USE)) - {//yes, this saber is always throwable + {//yes, this saber is throwable except if the player wants to kick return qtrue; } //saber is not normally throwable - if ( (pm->ps->saber[0].saberFlags&SFL_SINGLE_BLADE_THROWABLE) ) + if ((pm->ps->saber[0].saberFlags&SFL_SINGLE_BLADE_THROWABLE)) {//it is throwable if only one blade is on - if ( pm->ps->saber[0].numBlades > 1 ) + if (pm->ps->saber[0].numBlades > 1) {//it has more than one blade int numBladesActive = 0; - for ( int i = 0; i < pm->ps->saber[0].numBlades; i++ ) + for (int i = 0; i < pm->ps->saber[0].numBlades; i++) { - if ( pm->ps->saber[0].blade[i].active ) + if (pm->ps->saber[0].blade[i].active) { numBladesActive++; } } - if ( numBladesActive == 1 ) + if (numBladesActive == 1) {//only 1 blade is on return qtrue; } @@ -11099,18 +11129,18 @@ qboolean PM_SaberThrowable( void ) return qfalse; } -qboolean PM_CheckAltKickAttack( void ) +qboolean PM_CheckAltKickAttack(void) { - if ( ((pm->cmd.buttons&BUTTON_ALT_ATTACK) - && (!(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD) ||PM_SaberInReturn(pm->ps->saberMove)) - && (!PM_FlippingAnim(pm->ps->legsAnim)||pm->ps->legsAnimTimer<=250) + if (((pm->cmd.buttons&BUTTON_ALT_ATTACK) + && (!(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD) || PM_SaberInReturn(pm->ps->saberMove)) + && (!PM_FlippingAnim(pm->ps->legsAnim) || pm->ps->legsAnimTimer <= 250) //&& PM_SaberThrowable() && (!WP_ForcePowerUsable(pm->gent, FP_SABERTHROW, 20)) //make sure saber throw is disabled before trying to kick && pm->ps->SaberActive() && !(pm->ps->saber[0].saberFlags&SFL_NO_KICKS)//okay to do kicks with this saber - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_KICKS) )//okay to do kicks with the 2nd saber + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_KICKS))//okay to do kicks with the 2nd saber ) - || ((pm->cmd.buttons&BUTTON_ALT_ATTACK) + || ((pm->cmd.buttons&BUTTON_ALT_ATTACK) && !(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD) && pm->cmd.buttons&BUTTON_USE)) { @@ -11119,33 +11149,33 @@ qboolean PM_CheckAltKickAttack( void ) return qfalse; } -qboolean PM_CheckUpsideDownAttack( void ) +qboolean PM_CheckUpsideDownAttack(void) { - if ( pm->ps->saberMove != LS_READY ) + if (pm->ps->saberMove != LS_READY) { return qfalse; } - if ( !(pm->cmd.buttons&BUTTON_ATTACK) ) + if (!(pm->cmd.buttons&BUTTON_ATTACK)) { return qfalse; } - if ( pm->ps->saberAnimLevel < SS_FAST - || pm->ps->saberAnimLevel > SS_STRONG ) + if (pm->ps->saberAnimLevel < SS_FAST + || pm->ps->saberAnimLevel > SS_STRONG) { return qfalse; } - if ( (pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) ) + if ((pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer())) {//FIXME: check ranks? return qfalse; } //FIXME: enemy below //FIXME: more than 64 off ground - if ( !g_debugMelee->integer ) + if (!g_debugMelee->integer) {//hmm, can't get this to work quite the way we wanted... secret move, then! return qfalse; } - switch( pm->ps->legsAnim ) + switch (pm->ps->legsAnim) { case BOTH_WALL_RUN_RIGHT_FLIP: case BOTH_WALL_RUN_LEFT_FLIP: @@ -11156,34 +11186,34 @@ qboolean PM_CheckUpsideDownAttack( void ) case BOTH_FLIP_BACK3: case BOTH_WALL_FLIP_BACK1: case BOTH_ALORA_FLIP_B: - //JKA + //JKA case BOTH_FORCEWALLRUNFLIP_END: - { - float animLength = PM_AnimLength( pm->gent->client->clientInfo.animFileIndex, (animNumber_t)pm->ps->legsAnim ); - float elapsedTime = (float)(animLength-pm->ps->legsAnimTimer); - float midPoint = animLength/2.0f; - if ( elapsedTime < midPoint-100.0f - || elapsedTime > midPoint+100.0f ) - {//only a 200ms window (in middle of anim) of opportunity to do this move in these anims - return qfalse; - } - } + { + float animLength = PM_AnimLength(pm->gent->client->clientInfo.animFileIndex, (animNumber_t)pm->ps->legsAnim); + float elapsedTime = (float)(animLength - pm->ps->legsAnimTimer); + float midPoint = animLength / 2.0f; + if (elapsedTime < midPoint - 100.0f + || elapsedTime > midPoint + 100.0f) + {//only a 200ms window (in middle of anim) of opportunity to do this move in these anims + return qfalse; + } + } //NOTE: falls through on purpose case BOTH_FLIP_HOLD7: pm->ps->pm_flags |= PMF_SLOW_MO_FALL; - PM_SetSaberMove( LS_UPSIDE_DOWN_ATTACK ); + PM_SetSaberMove(LS_UPSIDE_DOWN_ATTACK); return qtrue; break; } return qfalse; } -qboolean PM_SaberMoveOkayForKata( void ) +qboolean PM_SaberMoveOkayForKata(void) { - if ( g_saberNewControlScheme->integer ) + if (g_saberNewControlScheme->integer) { - if ( pm->ps->saberMove == LS_READY //not doing anything - || PM_SaberInReflect( pm->ps->saberMove ) )//interrupt a projectile blocking move + if (pm->ps->saberMove == LS_READY //not doing anything + || PM_SaberInReflect(pm->ps->saberMove))//interrupt a projectile blocking move { return qtrue; } @@ -11194,9 +11224,9 @@ qboolean PM_SaberMoveOkayForKata( void ) } else {//old control scheme, allow it to interrupt a start or ready - if ( pm->ps->saberMove == LS_READY - || PM_SaberInReflect( pm->ps->saberMove )//interrupt a projectile blocking move - || PM_SaberInStart( pm->ps->saberMove ) ) + if (pm->ps->saberMove == LS_READY + || PM_SaberInReflect(pm->ps->saberMove)//interrupt a projectile blocking move + || PM_SaberInStart(pm->ps->saberMove)) { return qtrue; } @@ -11207,13 +11237,13 @@ qboolean PM_SaberMoveOkayForKata( void ) } } -qboolean PM_CanDoKata( void ) +qboolean PM_CanDoKata(void) { - if ( PM_InSecondaryStyle() ) + if (PM_InSecondaryStyle()) { return qfalse; } - if ( !pm->ps->saberInFlight//not throwing saber + if (!pm->ps->saberInFlight//not throwing saber && PM_SaberMoveOkayForKata() /* && pm->ps->saberAnimLevel >= SS_FAST//fast, med or strong style @@ -11221,91 +11251,91 @@ qboolean PM_CanDoKata( void ) */ && pm->ps->groundEntityNum != ENTITYNUM_NONE//not in the air && (pm->cmd.buttons&BUTTON_ATTACK)//pressing attack - && pm->cmd.forwardmove >=0 //not moving back (used to be !pm->cmd.forwardmove) + && pm->cmd.forwardmove >= 0 //not moving back (used to be !pm->cmd.forwardmove) && !pm->cmd.rightmove//not moving r/l && pm->cmd.upmove <= 0//not jumping...? - && G_TryingKataAttack(pm->gent,&pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*///holding focus - && G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER, qtrue )/*pm->ps->forcePower >= SABER_ALT_ATTACK_POWER*/ )//SINGLE_SPECIAL_POWER )// have enough power + && G_TryingKataAttack(pm->gent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*///holding focus + && G_EnoughPowerForSpecialMove(pm->ps->forcePower, SABER_ALT_ATTACK_POWER, qtrue)/*pm->ps->forcePower >= SABER_ALT_ATTACK_POWER*/)//SINGLE_SPECIAL_POWER )// have enough power {//FIXME: check rage, etc... return qtrue; } return qfalse; } -void PM_SaberDroidWeapon( void ) +void PM_SaberDroidWeapon(void) { // make weapon function - if ( pm->ps->weaponTime > 0 ) { + if (pm->ps->weaponTime > 0) { pm->ps->weaponTime -= pml.msec; - if ( pm->ps->weaponTime <= 0 ) + if (pm->ps->weaponTime <= 0) { pm->ps->weaponTime = 0; } } // Now we react to a block action by the player's lightsaber. - if ( pm->ps->saberBlocked ) + if (pm->ps->saberBlocked) { - switch ( pm->ps->saberBlocked ) + switch (pm->ps->saberBlocked) { - case BLOCKED_PARRY_BROKEN: - PM_SetAnim( pm, SETANIM_BOTH, Q_irand(BOTH_PAIN1,BOTH_PAIN3), SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - pm->ps->weaponTime = pm->ps->legsAnimTimer; - break; - case BLOCKED_ATK_BOUNCE: - PM_SetAnim( pm, SETANIM_BOTH, Q_irand(BOTH_PAIN1,BOTH_PAIN3), SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - pm->ps->weaponTime = pm->ps->legsAnimTimer; - break; - case BLOCKED_UPPER_RIGHT: - case BLOCKED_UPPER_RIGHT_PROJ: - case BLOCKED_LOWER_RIGHT: - case BLOCKED_LOWER_RIGHT_PROJ: - PM_SetAnim( pm, SETANIM_BOTH, BOTH_P1_S1_TR, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - pm->ps->legsAnimTimer += Q_irand( 200, 1000 ); - pm->ps->weaponTime = pm->ps->legsAnimTimer; - break; - case BLOCKED_UPPER_LEFT: - case BLOCKED_UPPER_LEFT_PROJ: - case BLOCKED_LOWER_LEFT: - case BLOCKED_LOWER_LEFT_PROJ: - PM_SetAnim( pm, SETANIM_BOTH, BOTH_P1_S1_TL, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - pm->ps->legsAnimTimer += Q_irand( 200, 1000 ); - pm->ps->weaponTime = pm->ps->legsAnimTimer; - break; - case BLOCKED_TOP: - case BLOCKED_TOP_PROJ: - PM_SetAnim( pm, SETANIM_BOTH, BOTH_P1_S1_T_, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - pm->ps->legsAnimTimer += Q_irand( 200, 1000 ); - pm->ps->weaponTime = pm->ps->legsAnimTimer; - break; - default: - pm->ps->saberBlocked = BLOCKED_NONE; - break; + case BLOCKED_PARRY_BROKEN: + PM_SetAnim(pm, SETANIM_BOTH, Q_irand(BOTH_PAIN1, BOTH_PAIN3), SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + pm->ps->weaponTime = pm->ps->legsAnimTimer; + break; + case BLOCKED_ATK_BOUNCE: + PM_SetAnim(pm, SETANIM_BOTH, Q_irand(BOTH_PAIN1, BOTH_PAIN3), SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + pm->ps->weaponTime = pm->ps->legsAnimTimer; + break; + case BLOCKED_UPPER_RIGHT: + case BLOCKED_UPPER_RIGHT_PROJ: + case BLOCKED_LOWER_RIGHT: + case BLOCKED_LOWER_RIGHT_PROJ: + PM_SetAnim(pm, SETANIM_BOTH, BOTH_P1_S1_TR, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + pm->ps->legsAnimTimer += Q_irand(200, 1000); + pm->ps->weaponTime = pm->ps->legsAnimTimer; + break; + case BLOCKED_UPPER_LEFT: + case BLOCKED_UPPER_LEFT_PROJ: + case BLOCKED_LOWER_LEFT: + case BLOCKED_LOWER_LEFT_PROJ: + PM_SetAnim(pm, SETANIM_BOTH, BOTH_P1_S1_TL, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + pm->ps->legsAnimTimer += Q_irand(200, 1000); + pm->ps->weaponTime = pm->ps->legsAnimTimer; + break; + case BLOCKED_TOP: + case BLOCKED_TOP_PROJ: + PM_SetAnim(pm, SETANIM_BOTH, BOTH_P1_S1_T_, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + pm->ps->legsAnimTimer += Q_irand(200, 1000); + pm->ps->weaponTime = pm->ps->legsAnimTimer; + break; + default: + pm->ps->saberBlocked = BLOCKED_NONE; + break; } pm->ps->saberBlocked = BLOCKED_NONE; pm->ps->saberBounceMove = LS_NONE; pm->ps->weaponstate = WEAPON_READY; - + // Done with block, so stop these active weapon branches. return; } } -void PM_TryGrab( void ) +void PM_TryGrab(void) { - if ( pm->ps->groundEntityNum != ENTITYNUM_NONE + if (pm->ps->groundEntityNum != ENTITYNUM_NONE //&& !pm->ps->saberInFlight - && pm->ps->weaponTime <= 0 )//< 200 ) + && pm->ps->weaponTime <= 0)//< 200 ) { - PM_SetAnim( pm, SETANIM_BOTH, BOTH_KYLE_GRAB, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_BOTH, BOTH_KYLE_GRAB, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); pm->ps->torsoAnimTimer += 200; pm->ps->weaponTime = pm->ps->torsoAnimTimer; pm->ps->saberMove = pm->ps->saberMoveNext = LS_READY; - VectorClear( pm->ps->velocity ); - VectorClear( pm->ps->moveDir ); + VectorClear(pm->ps->velocity); + VectorClear(pm->ps->moveDir); pm->cmd.rightmove = pm->cmd.forwardmove = pm->cmd.upmove = 0; - if ( pm->gent ) + if (pm->gent) { pm->gent->painDebounceTime = level.time + pm->ps->torsoAnimTimer; } @@ -11313,11 +11343,11 @@ void PM_TryGrab( void ) } } -void PM_TryAirKick( saberMoveName_t kickMove ) +void PM_TryAirKick(saberMoveName_t kickMove) { - if ( pm->ps->groundEntityNum < ENTITYNUM_NONE ) + if (pm->ps->groundEntityNum < ENTITYNUM_NONE) {//just do it - PM_SetSaberMove( kickMove ); + PM_SetSaberMove(kickMove); } else { @@ -11325,33 +11355,33 @@ void PM_TryAirKick( saberMoveName_t kickMove ) //let's only allow air kicks if a certain distance from the ground //it's silly to be able to do them right as you land. //also looks wrong to transition from a non-complete flip anim... - if ((!PM_FlippingAnim( pm->ps->legsAnim ) || pm->ps->legsAnimTimer <= 0) && + if ((!PM_FlippingAnim(pm->ps->legsAnim) || pm->ps->legsAnimTimer <= 0) && gDist > 64.0f && //strict minimum - gDist > (-pm->ps->velocity[2])-64.0f //make sure we are high to ground relative to downward velocity as well + gDist > (-pm->ps->velocity[2]) - 64.0f //make sure we are high to ground relative to downward velocity as well ) { - PM_SetSaberMove( kickMove ); + PM_SetSaberMove(kickMove); } else {//leave it as a normal kick unless we're too high up - if ( gDist > 128.0f || pm->ps->velocity[2] >= 0 ) + if (gDist > 128.0f || pm->ps->velocity[2] >= 0) { //off ground, but too close to ground } else {//high close enough to ground to do a normal kick, convert it - switch ( kickMove ) + switch (kickMove) { case LS_KICK_F_AIR: - PM_SetSaberMove( LS_KICK_F ); + PM_SetSaberMove(LS_KICK_F); break; case LS_KICK_B_AIR: - PM_SetSaberMove( LS_KICK_B ); + PM_SetSaberMove(LS_KICK_B); break; case LS_KICK_R_AIR: - PM_SetSaberMove( LS_KICK_R ); + PM_SetSaberMove(LS_KICK_R); break; case LS_KICK_L_AIR: - PM_SetSaberMove( LS_KICK_L ); + PM_SetSaberMove(LS_KICK_L); break; default: break; @@ -11361,101 +11391,101 @@ void PM_TryAirKick( saberMoveName_t kickMove ) } } -void PM_CheckKick( void ) +void PM_CheckKick(void) { - if ( !PM_KickMove( pm->ps->saberMove )//not already in a kick + if (!PM_KickMove(pm->ps->saberMove)//not already in a kick && !(pm->ps->pm_flags&PMF_DUCKED)//not ducked - && (pm->cmd.upmove >= 0 ) )//not trying to duck + && (pm->cmd.upmove >= 0))//not trying to duck {//player kicks //FIXME: only if FP_SABER_OFFENSE >= 3 - if ( pm->cmd.rightmove ) + if (pm->cmd.rightmove) {//kick to side - if ( pm->cmd.rightmove > 0 ) + if (pm->cmd.rightmove > 0) {//kick right - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE - || pm->cmd.upmove > 0 ) + if (pm->ps->groundEntityNum == ENTITYNUM_NONE + || pm->cmd.upmove > 0) { - PM_TryAirKick( LS_KICK_R_AIR ); + PM_TryAirKick(LS_KICK_R_AIR); } else { - PM_SetSaberMove( LS_KICK_R ); + PM_SetSaberMove(LS_KICK_R); } } else {//kick left - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE - || pm->cmd.upmove > 0 ) + if (pm->ps->groundEntityNum == ENTITYNUM_NONE + || pm->cmd.upmove > 0) { - PM_TryAirKick( LS_KICK_L_AIR ); + PM_TryAirKick(LS_KICK_L_AIR); } else { - PM_SetSaberMove( LS_KICK_L ); + PM_SetSaberMove(LS_KICK_L); } } pm->cmd.rightmove = 0; } - else if ( pm->cmd.forwardmove ) + else if (pm->cmd.forwardmove) {//kick front/back - if ( pm->cmd.forwardmove > 0 ) + if (pm->cmd.forwardmove > 0) {//kick fwd - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE - || pm->cmd.upmove > 0 ) + if (pm->ps->groundEntityNum == ENTITYNUM_NONE + || pm->cmd.upmove > 0) { - PM_TryAirKick( LS_KICK_F_AIR ); + PM_TryAirKick(LS_KICK_F_AIR); } /* else if ( pm->ps->weapon == WP_SABER - && pm->ps->saberAnimLevel == SS_STAFF - && pm->gent - && G_CheckEnemyPresence( pm->gent, DIR_FRONT, 64, 0.8f ) ) + && pm->ps->saberAnimLevel == SS_STAFF + && pm->gent + && G_CheckEnemyPresence( pm->gent, DIR_FRONT, 64, 0.8f ) ) {//FIXME: don't jump while doing this move and don't do this move if in air - PM_SetSaberMove( LS_HILT_BASH ); + PM_SetSaberMove( LS_HILT_BASH ); } */ else { - PM_SetSaberMove( LS_KICK_F ); + PM_SetSaberMove(LS_KICK_F); } } - else if ( pm->ps->groundEntityNum == ENTITYNUM_NONE - || pm->cmd.upmove > 0 ) + else if (pm->ps->groundEntityNum == ENTITYNUM_NONE + || pm->cmd.upmove > 0) { - PM_TryAirKick( LS_KICK_B_AIR ); + PM_TryAirKick(LS_KICK_B_AIR); } else {//kick back - PM_SetSaberMove( LS_KICK_B ); + PM_SetSaberMove(LS_KICK_B); } pm->cmd.forwardmove = 0; } - else if ( pm->gent + else if (pm->gent && pm->gent->enemy - && G_CanKickEntity( pm->gent, pm->gent->enemy ) ) + && G_CanKickEntity(pm->gent, pm->gent->enemy)) {//auto-pick? if ( /*(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD) - && (pm->cmd.buttons&BUTTON_ATTACK) - &&*/ PM_PickAutoMultiKick( qfalse ) ) + && (pm->cmd.buttons&BUTTON_ATTACK) + &&*/ PM_PickAutoMultiKick(qfalse)) {//kicked! - if ( pm->ps->saberMove == LS_KICK_RL ) + if (pm->ps->saberMove == LS_KICK_RL) {//just pull back - if ( d_slowmodeath->integer > 3 ) + if (d_slowmodeath->integer > 3) { - G_StartMatrixEffect( pm->gent, MEF_NO_SPIN, pm->ps->legsAnimTimer+500 ); + G_StartMatrixEffect(pm->gent, MEF_NO_SPIN, pm->ps->legsAnimTimer + 500); } } else {//normal spin - if ( d_slowmodeath->integer > 3 ) + if (d_slowmodeath->integer > 3) { - G_StartMatrixEffect( pm->gent, 0, pm->ps->legsAnimTimer+500 ); + G_StartMatrixEffect(pm->gent, 0, pm->ps->legsAnimTimer + 500); } } - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE - &&( pm->ps->saberMove == LS_KICK_S - ||pm->ps->saberMove == LS_KICK_BF - ||pm->ps->saberMove == LS_KICK_RL ) ) + if (pm->ps->groundEntityNum == ENTITYNUM_NONE + && (pm->ps->saberMove == LS_KICK_S + || pm->ps->saberMove == LS_KICK_BF + || pm->ps->saberMove == LS_KICK_RL)) {//in the air and doing a jump-kick, which is a ground anim, so.... //cut z velocity...? pm->ps->velocity[2] = 0; @@ -11464,12 +11494,12 @@ void PM_CheckKick( void ) } else { - saberMoveName_t kickMove = PM_PickAutoKick( pm->gent->enemy ); - if ( kickMove != LS_NONE ) + saberMoveName_t kickMove = PM_PickAutoKick(pm->gent->enemy); + if (kickMove != LS_NONE) {//Matrix? - PM_SetSaberMove( kickMove ); + PM_SetSaberMove(kickMove); int meFlags = 0; - switch ( kickMove ) + switch (kickMove) { case LS_KICK_B://just pull back case LS_KICK_B_AIR://just pull back @@ -11482,19 +11512,19 @@ void PM_CheckKick( void ) default: break; } - if ( d_slowmodeath->integer > 3 ) + if (d_slowmodeath->integer > 3) { - G_StartMatrixEffect( pm->gent, meFlags, pm->ps->legsAnimTimer+500 ); + G_StartMatrixEffect(pm->gent, meFlags, pm->ps->legsAnimTimer + 500); } } } } else { - if ( PM_PickAutoMultiKick( qtrue ) ) + if (PM_PickAutoMultiKick(qtrue)) { int meFlags = 0; - switch ( pm->ps->saberMove ) + switch (pm->ps->saberMove) { case LS_KICK_RL://just pull back case LS_KICK_B://just pull back @@ -11508,14 +11538,14 @@ void PM_CheckKick( void ) default: break; } - if ( d_slowmodeath->integer > 3 ) + if (d_slowmodeath->integer > 3) { - G_StartMatrixEffect( pm->gent, meFlags, pm->ps->legsAnimTimer+500 ); + G_StartMatrixEffect(pm->gent, meFlags, pm->ps->legsAnimTimer + 500); } - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE - &&( pm->ps->saberMove == LS_KICK_S - ||pm->ps->saberMove == LS_KICK_BF - ||pm->ps->saberMove == LS_KICK_RL ) ) + if (pm->ps->groundEntityNum == ENTITYNUM_NONE + && (pm->ps->saberMove == LS_KICK_S + || pm->ps->saberMove == LS_KICK_BF + || pm->ps->saberMove == LS_KICK_RL)) {//in the air and doing a jump-kick, which is a ground anim, so.... //cut z velocity...? pm->ps->velocity[2] = 0; @@ -11526,27 +11556,27 @@ void PM_CheckKick( void ) } } -void PM_CheckClearSaberBlock( void ) +void PM_CheckClearSaberBlock(void) { - if ( pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer() ) + if (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) {//player - if ( pm->ps->saberBlocked >= BLOCKED_UPPER_RIGHT_PROJ && pm->ps->saberBlocked <= BLOCKED_TOP_PROJ ) + if (pm->ps->saberBlocked >= BLOCKED_UPPER_RIGHT_PROJ && pm->ps->saberBlocked <= BLOCKED_TOP_PROJ) {//blocking a projectile - if ( pm->ps->forcePowerDebounce[FP_SABER_DEFENSE] < level.time ) + if (pm->ps->forcePowerDebounce[FP_SABER_DEFENSE] < level.time) {//block is done or breaking out of it with an attack pm->ps->weaponTime = 0; pm->ps->saberBlocked = BLOCKED_NONE; } - else if ( (pm->cmd.buttons&BUTTON_ATTACK) ) + else if ((pm->cmd.buttons&BUTTON_ATTACK)) {//block is done or breaking out of it with an attack pm->ps->weaponTime = 0; pm->ps->saberBlocked = BLOCKED_NONE; } } - else if ( pm->ps->saberBlocked == BLOCKED_UPPER_LEFT - && pm->ps->powerups[PW_SHOCKED] > level.time ) + else if (pm->ps->saberBlocked == BLOCKED_UPPER_LEFT + && pm->ps->powerups[PW_SHOCKED] > level.time) {//probably blocking lightning - if ( (pm->cmd.buttons&BUTTON_ATTACK) ) + if ((pm->cmd.buttons&BUTTON_ATTACK)) {//trying to attack //allow the attack pm->ps->weaponTime = 0; @@ -11556,31 +11586,31 @@ void PM_CheckClearSaberBlock( void ) } } -qboolean PM_SaberBlocking( void ) +qboolean PM_SaberBlocking(void) { // Now we react to a block action by the player's lightsaber. - if ( pm->ps->saberBlocked ) + if (pm->ps->saberBlocked) { - if ( pm->ps->saberMove > LS_PUTAWAY && pm->ps->saberMove <= LS_A_BL2TR && pm->ps->saberBlocked != BLOCKED_PARRY_BROKEN && + if (pm->ps->saberMove > LS_PUTAWAY && pm->ps->saberMove <= LS_A_BL2TR && pm->ps->saberBlocked != BLOCKED_PARRY_BROKEN && (pm->ps->saberBlocked < BLOCKED_UPPER_RIGHT_PROJ || pm->ps->saberBlocked > BLOCKED_TOP_PROJ))//&& Q_irand( 0, 2 ) {//we parried another lightsaber while attacking, so treat it as a bounce pm->ps->saberBlocked = BLOCKED_ATK_BOUNCE; - } - else if ( pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer() )//player + } + else if (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer())//player { - if ( pm->ps->saberBlocked >= BLOCKED_UPPER_RIGHT_PROJ - && pm->ps->saberBlocked <= BLOCKED_TOP_PROJ ) + if (pm->ps->saberBlocked >= BLOCKED_UPPER_RIGHT_PROJ + && pm->ps->saberBlocked <= BLOCKED_TOP_PROJ) {//blocking a projectile - if ( (pm->cmd.buttons&BUTTON_ATTACK) ) + if ((pm->cmd.buttons&BUTTON_ATTACK)) {//trying to attack - if ( pm->ps->saberMove == LS_READY - || PM_SaberInReflect( pm->ps->saberMove ) ) + if (pm->ps->saberMove == LS_READY + || PM_SaberInReflect(pm->ps->saberMove)) {//not already busy or already in projectile deflection //trying to attack during projectile blocking, so do the attack instead pm->ps->saberBlocked = BLOCKED_NONE; pm->ps->saberBounceMove = LS_NONE; pm->ps->weaponstate = WEAPON_READY; - if ( PM_SaberInReflect( pm->ps->saberMove ) && pm->ps->weaponTime > 0 ) + if (PM_SaberInReflect(pm->ps->saberMove) && pm->ps->weaponTime > 0) {//interrupt the current deflection move pm->ps->weaponTime = 0; } @@ -11590,24 +11620,24 @@ qboolean PM_SaberBlocking( void ) } } /* - else if ( (pm->cmd.buttons&BUTTON_ATTACK) - && pm->ps->saberBlocked >= BLOCKED_UPPER_RIGHT - && pm->ps->saberBlocked <= BLOCKED_TOP - && !PM_SaberInKnockaway( pm->ps->saberBounceMove ) ) + else if ( (pm->cmd.buttons&BUTTON_ATTACK) + && pm->ps->saberBlocked >= BLOCKED_UPPER_RIGHT + && pm->ps->saberBlocked <= BLOCKED_TOP + && !PM_SaberInKnockaway( pm->ps->saberBounceMove ) ) {//if hitting attack during a parry (not already a knockaway) - if ( pm->ps->forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2 ) - {//have high saber defense, turn the parry into a knockaway? - //FIXME: this could actually be bad for us...? Leaves us open - pm->ps->saberBounceMove = PM_KnockawayForParry( pm->ps->saberBlocked ); - } + if ( pm->ps->forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2 ) + {//have high saber defense, turn the parry into a knockaway? + //FIXME: this could actually be bad for us...? Leaves us open + pm->ps->saberBounceMove = PM_KnockawayForParry( pm->ps->saberBlocked ); + } } */ - if ( pm->ps->saberBlocked != BLOCKED_ATK_BOUNCE ) + if (pm->ps->saberBlocked != BLOCKED_ATK_BOUNCE) {//can't attack for twice whatever your skill level's parry debounce time is - if ( pm->ps->clientNum == 0 || PM_ControlledByPlayer() ) + if (pm->ps->clientNum == 0 || PM_ControlledByPlayer()) {//player - if ( pm->ps->forcePowerLevel[FP_SABER_DEFENSE] <= FORCE_LEVEL_1 ) + if (pm->ps->forcePowerLevel[FP_SABER_DEFENSE] <= FORCE_LEVEL_1) { pm->ps->weaponTime = parryDebounce[pm->ps->forcePowerLevel[FP_SABER_DEFENSE]]; } @@ -11615,9 +11645,9 @@ qboolean PM_SaberBlocking( void ) else {//NPC //pm->ps->weaponTime = parryDebounce[pm->ps->forcePowerLevel[FP_SABER_DEFENSE]] * 2; - if ( pm->gent ) + if (pm->gent) { - pm->ps->weaponTime = Jedi_ReCalcParryTime( pm->gent, EVASION_PARRY ); + pm->ps->weaponTime = Jedi_ReCalcParryTime(pm->gent, EVASION_PARRY); } else {//WTF??? @@ -11625,258 +11655,258 @@ qboolean PM_SaberBlocking( void ) } } } - switch ( pm->ps->saberBlocked ) + switch (pm->ps->saberBlocked) { - case BLOCKED_PARRY_BROKEN: - //whatever parry we were is in now broken, play the appropriate knocked-away anim - { - saberMoveName_t nextMove; - if ( PM_SaberInBrokenParry( pm->ps->saberBounceMove ) ) - {//already have one...? - nextMove = (saberMoveName_t)pm->ps->saberBounceMove; - } - else - { - nextMove = PM_BrokenParryForParry( (saberMoveName_t)pm->ps->saberMove ); - } - if ( nextMove != LS_NONE ) - { - PM_SetSaberMove( nextMove ); - pm->ps->weaponTime = pm->ps->torsoAnimTimer; - } - else - {//Maybe in a knockaway? - } - //pm->ps->saberBounceMove = LS_NONE; - } - break; - case BLOCKED_ATK_BOUNCE: - // If there is absolutely no blocked move in the chart, don't even mess with the animation. - // OR if we are already in a block or parry. - if ( pm->ps->saberMove >= LS_T1_BR__R/*LS_BOUNCE_TOP*/ )//|| saberMoveData[pm->ps->saberMove].bounceMove == LS_NONE ) - {//an actual bounce? Other bounces before this are actually transitions? - pm->ps->saberBlocked = BLOCKED_NONE; - } - else if ( PM_SaberInBounce( pm->ps->saberMove ) || !PM_SaberInAttack( pm->ps->saberMove ) ) - {//already in the bounce, go into an attack or transition to ready.. should never get here since can't be blocked in a bounce! - int nextMove; + case BLOCKED_PARRY_BROKEN: + //whatever parry we were is in now broken, play the appropriate knocked-away anim + { + saberMoveName_t nextMove; + if (PM_SaberInBrokenParry(pm->ps->saberBounceMove)) + {//already have one...? + nextMove = (saberMoveName_t)pm->ps->saberBounceMove; + } + else + { + nextMove = PM_BrokenParryForParry((saberMoveName_t)pm->ps->saberMove); + } + if (nextMove != LS_NONE) + { + PM_SetSaberMove(nextMove); + pm->ps->weaponTime = pm->ps->torsoAnimTimer; + } + else + {//Maybe in a knockaway? + } + //pm->ps->saberBounceMove = LS_NONE; + } + break; + case BLOCKED_ATK_BOUNCE: + // If there is absolutely no blocked move in the chart, don't even mess with the animation. + // OR if we are already in a block or parry. + if (pm->ps->saberMove >= LS_T1_BR__R/*LS_BOUNCE_TOP*/)//|| saberMoveData[pm->ps->saberMove].bounceMove == LS_NONE ) + {//an actual bounce? Other bounces before this are actually transitions? + pm->ps->saberBlocked = BLOCKED_NONE; + } + else if (PM_SaberInBounce(pm->ps->saberMove) || !PM_SaberInAttack(pm->ps->saberMove)) + {//already in the bounce, go into an attack or transition to ready.. should never get here since can't be blocked in a bounce! + int nextMove; - if ( pm->cmd.buttons & BUTTON_ATTACK ) - {//transition to a new attack - if ( pm->ps->clientNum && !PM_ControlledByPlayer() ) - {//NPC - nextMove = saberMoveData[pm->ps->saberMove].chain_attack; - } - else - {//player - int newQuad = PM_SaberMoveQuadrantForMovement( &pm->cmd ); - while ( newQuad == saberMoveData[pm->ps->saberMove].startQuad ) - {//player is still in same attack quad, don't repeat that attack because it looks bad, - //FIXME: try to pick one that might look cool? - newQuad = Q_irand( Q_BR, Q_BL ); - //FIXME: sanity check, just in case? - }//else player is switching up anyway, take the new attack dir - nextMove = transitionMove[saberMoveData[pm->ps->saberMove].startQuad][newQuad]; - } + if (pm->cmd.buttons & BUTTON_ATTACK) + {//transition to a new attack + if (pm->ps->clientNum && !PM_ControlledByPlayer()) + {//NPC + nextMove = saberMoveData[pm->ps->saberMove].chain_attack; } else - {//return to ready - if ( pm->ps->clientNum && !PM_ControlledByPlayer() ) - {//NPC - nextMove = saberMoveData[pm->ps->saberMove].chain_idle; - } - else - {//player - if ( saberMoveData[pm->ps->saberMove].startQuad == Q_T ) - { - nextMove = LS_R_BL2TR; - } - else if ( saberMoveData[pm->ps->saberMove].startQuad < Q_T ) - { - nextMove = LS_R_TL2BR+(saberMoveName_t)(saberMoveData[pm->ps->saberMove].startQuad-Q_BR); - } - else// if ( saberMoveData[pm->ps->saberMove].startQuad > Q_T ) - { - nextMove = LS_R_BR2TL+(saberMoveName_t)(saberMoveData[pm->ps->saberMove].startQuad-Q_TL); - } - } + {//player + int newQuad = PM_SaberMoveQuadrantForMovement(&pm->cmd); + while (newQuad == saberMoveData[pm->ps->saberMove].startQuad) + {//player is still in same attack quad, don't repeat that attack because it looks bad, + //FIXME: try to pick one that might look cool? + newQuad = Q_irand(Q_BR, Q_BL); + //FIXME: sanity check, just in case? + }//else player is switching up anyway, take the new attack dir + nextMove = transitionMove[saberMoveData[pm->ps->saberMove].startQuad][newQuad]; } - PM_SetSaberMove( (saberMoveName_t)nextMove ); - pm->ps->weaponTime = pm->ps->torsoAnimTimer; } else - {//start the bounce move - saberMoveName_t bounceMove; - if ( pm->ps->saberBounceMove != LS_NONE ) - { - bounceMove = (saberMoveName_t)pm->ps->saberBounceMove; + {//return to ready + if (pm->ps->clientNum && !PM_ControlledByPlayer()) + {//NPC + nextMove = saberMoveData[pm->ps->saberMove].chain_idle; } else - { - bounceMove = PM_SaberBounceForAttack( (saberMoveName_t)pm->ps->saberMove ); + {//player + if (saberMoveData[pm->ps->saberMove].startQuad == Q_T) + { + nextMove = LS_R_BL2TR; + } + else if (saberMoveData[pm->ps->saberMove].startQuad < Q_T) + { + nextMove = LS_R_TL2BR + (saberMoveName_t)(saberMoveData[pm->ps->saberMove].startQuad - Q_BR); + } + else// if ( saberMoveData[pm->ps->saberMove].startQuad > Q_T ) + { + nextMove = LS_R_BR2TL + (saberMoveName_t)(saberMoveData[pm->ps->saberMove].startQuad - Q_TL); + } } - PM_SetSaberMove( bounceMove ); - pm->ps->weaponTime = pm->ps->torsoAnimTimer; - } - //clear the saberBounceMove - //pm->ps->saberBounceMove = LS_NONE; - - if (cg_debugSaber.integer>=2) - { - Com_Printf("Saber Block: Bounce\n"); } - break; - case BLOCKED_UPPER_RIGHT: - if ( pm->ps->saberBounceMove != LS_NONE ) + PM_SetSaberMove((saberMoveName_t)nextMove); + pm->ps->weaponTime = pm->ps->torsoAnimTimer; + } + else + {//start the bounce move + saberMoveName_t bounceMove; + if (pm->ps->saberBounceMove != LS_NONE) { - PM_SetSaberMove( (saberMoveName_t)pm->ps->saberBounceMove ); - //pm->ps->saberBounceMove = LS_NONE; - pm->ps->weaponTime = pm->ps->torsoAnimTimer; + bounceMove = (saberMoveName_t)pm->ps->saberBounceMove; } else { - PM_SetSaberMove( LS_PARRY_UR ); + bounceMove = PM_SaberBounceForAttack((saberMoveName_t)pm->ps->saberMove); } + PM_SetSaberMove(bounceMove); + pm->ps->weaponTime = pm->ps->torsoAnimTimer; + } + //clear the saberBounceMove + //pm->ps->saberBounceMove = LS_NONE; - if ( cg_debugSaber.integer >= 2 ) - { - Com_Printf( "Saber Block: Parry UR\n" ); - } - break; - case BLOCKED_UPPER_RIGHT_PROJ: - PM_SetSaberMove( LS_REFLECT_UR ); + if (cg_debugSaber.integer >= 2) + { + Com_Printf("Saber Block: Bounce\n"); + } + break; + case BLOCKED_UPPER_RIGHT: + if (pm->ps->saberBounceMove != LS_NONE) + { + PM_SetSaberMove((saberMoveName_t)pm->ps->saberBounceMove); + //pm->ps->saberBounceMove = LS_NONE; + pm->ps->weaponTime = pm->ps->torsoAnimTimer; + } + else + { + PM_SetSaberMove(LS_PARRY_UR); + } - if ( cg_debugSaber.integer >= 2 ) - { - Com_Printf("Saber Block: Deflect UR\n"); - } - break; - case BLOCKED_UPPER_LEFT: - if ( pm->ps->saberBounceMove != LS_NONE ) - { - PM_SetSaberMove( (saberMoveName_t)pm->ps->saberBounceMove ); - //pm->ps->saberBounceMove = LS_NONE; - pm->ps->weaponTime = pm->ps->torsoAnimTimer; - } - else - { - PM_SetSaberMove( LS_PARRY_UL ); - } + if (cg_debugSaber.integer >= 2) + { + Com_Printf("Saber Block: Parry UR\n"); + } + break; + case BLOCKED_UPPER_RIGHT_PROJ: + PM_SetSaberMove(LS_REFLECT_UR); - if ( cg_debugSaber.integer >= 2 ) - { - Com_Printf( "Saber Block: Parry UL\n" ); - } - break; - case BLOCKED_UPPER_LEFT_PROJ: - PM_SetSaberMove( LS_REFLECT_UL ); + if (cg_debugSaber.integer >= 2) + { + Com_Printf("Saber Block: Deflect UR\n"); + } + break; + case BLOCKED_UPPER_LEFT: + if (pm->ps->saberBounceMove != LS_NONE) + { + PM_SetSaberMove((saberMoveName_t)pm->ps->saberBounceMove); + //pm->ps->saberBounceMove = LS_NONE; + pm->ps->weaponTime = pm->ps->torsoAnimTimer; + } + else + { + PM_SetSaberMove(LS_PARRY_UL); + } - if ( cg_debugSaber.integer >= 2 ) - { - Com_Printf("Saber Block: Deflect UL\n"); - } - break; - case BLOCKED_LOWER_RIGHT: - if ( pm->ps->saberBounceMove != LS_NONE ) - { - PM_SetSaberMove( (saberMoveName_t)pm->ps->saberBounceMove ); - //pm->ps->saberBounceMove = LS_NONE; - pm->ps->weaponTime = pm->ps->torsoAnimTimer; - } - else - { - PM_SetSaberMove( LS_PARRY_LR ); - } + if (cg_debugSaber.integer >= 2) + { + Com_Printf("Saber Block: Parry UL\n"); + } + break; + case BLOCKED_UPPER_LEFT_PROJ: + PM_SetSaberMove(LS_REFLECT_UL); - if ( cg_debugSaber.integer >= 2 ) - { - Com_Printf("Saber Block: Parry LR\n"); - } - break; - case BLOCKED_LOWER_RIGHT_PROJ: - PM_SetSaberMove( LS_REFLECT_LR ); + if (cg_debugSaber.integer >= 2) + { + Com_Printf("Saber Block: Deflect UL\n"); + } + break; + case BLOCKED_LOWER_RIGHT: + if (pm->ps->saberBounceMove != LS_NONE) + { + PM_SetSaberMove((saberMoveName_t)pm->ps->saberBounceMove); + //pm->ps->saberBounceMove = LS_NONE; + pm->ps->weaponTime = pm->ps->torsoAnimTimer; + } + else + { + PM_SetSaberMove(LS_PARRY_LR); + } - if ( cg_debugSaber.integer >= 2 ) - { - Com_Printf("Saber Block: Deflect LR\n"); - } - break; - case BLOCKED_LOWER_LEFT: - if ( pm->ps->saberBounceMove != LS_NONE ) - { - PM_SetSaberMove( (saberMoveName_t)pm->ps->saberBounceMove ); - //pm->ps->saberBounceMove = LS_NONE; - pm->ps->weaponTime = pm->ps->torsoAnimTimer; - } - else - { - PM_SetSaberMove( LS_PARRY_LL ); - } + if (cg_debugSaber.integer >= 2) + { + Com_Printf("Saber Block: Parry LR\n"); + } + break; + case BLOCKED_LOWER_RIGHT_PROJ: + PM_SetSaberMove(LS_REFLECT_LR); - if ( cg_debugSaber.integer >= 2 ) - { - Com_Printf("Saber Block: Parry LL\n"); - } - break; - case BLOCKED_LOWER_LEFT_PROJ: - PM_SetSaberMove( LS_REFLECT_LL); + if (cg_debugSaber.integer >= 2) + { + Com_Printf("Saber Block: Deflect LR\n"); + } + break; + case BLOCKED_LOWER_LEFT: + if (pm->ps->saberBounceMove != LS_NONE) + { + PM_SetSaberMove((saberMoveName_t)pm->ps->saberBounceMove); + //pm->ps->saberBounceMove = LS_NONE; + pm->ps->weaponTime = pm->ps->torsoAnimTimer; + } + else + { + PM_SetSaberMove(LS_PARRY_LL); + } - if ( cg_debugSaber.integer >= 2 ) - { - Com_Printf("Saber Block: Deflect LL\n"); - } - break; - case BLOCKED_TOP: - if ( pm->ps->saberBounceMove != LS_NONE ) - { - PM_SetSaberMove( (saberMoveName_t)pm->ps->saberBounceMove ); - //pm->ps->saberBounceMove = LS_NONE; - pm->ps->weaponTime = pm->ps->torsoAnimTimer; - } - else - { - PM_SetSaberMove( LS_PARRY_UP ); - } + if (cg_debugSaber.integer >= 2) + { + Com_Printf("Saber Block: Parry LL\n"); + } + break; + case BLOCKED_LOWER_LEFT_PROJ: + PM_SetSaberMove(LS_REFLECT_LL); - if ( cg_debugSaber.integer >= 2 ) - { - Com_Printf("Saber Block: Parry Top\n"); - } - break; - case BLOCKED_TOP_PROJ: - PM_SetSaberMove( LS_REFLECT_UP ); + if (cg_debugSaber.integer >= 2) + { + Com_Printf("Saber Block: Deflect LL\n"); + } + break; + case BLOCKED_TOP: + if (pm->ps->saberBounceMove != LS_NONE) + { + PM_SetSaberMove((saberMoveName_t)pm->ps->saberBounceMove); + //pm->ps->saberBounceMove = LS_NONE; + pm->ps->weaponTime = pm->ps->torsoAnimTimer; + } + else + { + PM_SetSaberMove(LS_PARRY_UP); + } - if ( cg_debugSaber.integer >= 2 ) - { - Com_Printf("Saber Block: Deflect Top\n"); - } - break; - default: - pm->ps->saberBlocked = BLOCKED_NONE; - break; + if (cg_debugSaber.integer >= 2) + { + Com_Printf("Saber Block: Parry Top\n"); + } + break; + case BLOCKED_TOP_PROJ: + PM_SetSaberMove(LS_REFLECT_UP); + + if (cg_debugSaber.integer >= 2) + { + Com_Printf("Saber Block: Deflect Top\n"); + } + break; + default: + pm->ps->saberBlocked = BLOCKED_NONE; + break; } // Charging is like a lead-up before attacking again. This is an appropriate use, or we can create a new weaponstate for blocking pm->ps->saberBounceMove = LS_NONE; pm->ps->weaponstate = WEAPON_READY; - + // Done with block, so stop these active weapon branches. return qtrue; } return qfalse; } -qboolean PM_NPCCheckAttackRoll( void ) +qboolean PM_NPCCheckAttackRoll(void) { - if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer()//NPC + if (pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer()//NPC && pm->gent && pm->gent->NPC //&& Q_irand(-3,pm->gent->NPC->rank)>RANK_CREWMAN) - && ( pm->gent->NPC->rank > RANK_CREWMAN && !Q_irand(0,3-g_spskill->integer) ) + && (pm->gent->NPC->rank > RANK_CREWMAN && !Q_irand(0, 3 - g_spskill->integer)) && pm->gent->enemy - && fabs(pm->gent->enemy->currentOrigin[2]-pm->ps->origin[2])<32 - && DistanceHorizontalSquared(pm->gent->enemy->currentOrigin, pm->ps->origin ) < (128.0f*128.0f) - && InFOV( pm->gent->enemy->currentOrigin, pm->ps->origin, pm->ps->viewangles, 30, 90 ) ) + && fabs(pm->gent->enemy->currentOrigin[2] - pm->ps->origin[2])<32 + && DistanceHorizontalSquared(pm->gent->enemy->currentOrigin, pm->ps->origin) < (128.0f*128.0f) + && InFOV(pm->gent->enemy->currentOrigin, pm->ps->origin, pm->ps->viewangles, 30, 90)) {//stab! return qtrue; } @@ -11894,29 +11924,28 @@ While this is a little different than the Quake 3 code, there is no clean way of // Note that if the resultant animation is NONE, then the animation is essentially "idle", and is set in WP_TorsoAnim void PM_WeaponLightsaber(void) { - int addTime,amount; + int addTime; qboolean delayed_fire = qfalse, animLevelOverridden = qfalse; - weaponInfo_t *weapon; - int anim=-1; - int curmove, newmove=LS_NONE; + int anim = -1; + int curmove, newmove = LS_NONE; - if ( pm->gent - && pm->gent->client - && pm->gent->client->NPC_class == CLASS_SABER_DROID ) + if (pm->gent + && pm->gent->client + && pm->gent->client->NPC_class == CLASS_SABER_DROID) {//Saber droid does it's own attack logic PM_SaberDroidWeapon(); return; } // don't allow attack until all buttons are up - if ( pm->ps->pm_flags & PMF_RESPAWNED ) { + if (pm->ps->pm_flags & PMF_RESPAWNED) { return; } // check for dead player - if ( pm->ps->stats[STAT_HEALTH] <= 0 ) + if (pm->ps->stats[STAT_HEALTH] <= 0) { - if ( pm->gent ) + if (pm->gent) { pm->gent->s.loopSound = 0; } @@ -11924,149 +11953,149 @@ void PM_WeaponLightsaber(void) } // make weapon function - if ( pm->ps->weaponTime > 0 ) { + if (pm->ps->weaponTime > 0) { pm->ps->weaponTime -= pml.msec; - if ( pm->ps->weaponTime <= 0 ) + if (pm->ps->weaponTime <= 0) { pm->ps->weaponTime = 0; } } - if ( pm->ps->stats[STAT_WEAPONS]&(1<ps->dualSabers + if (pm->ps->stats[STAT_WEAPONS] & (1 << WP_SCEPTER) + && !pm->ps->dualSabers && pm->gent - && pm->gent->weaponModel[1] ) + && pm->gent->weaponModel[1]) {//holding scepter in left hand, use dual style pm->ps->saberAnimLevel = SS_DUAL; animLevelOverridden = qtrue; } - else if ( pm->ps->saber[0].singleBladeStyle != SS_NONE//SaberStaff() - && !pm->ps->dualSabers + else if (pm->ps->saber[0].singleBladeStyle != SS_NONE//SaberStaff() + && !pm->ps->dualSabers && pm->ps->saber[0].blade[0].active - && !pm->ps->saber[0].blade[1].active ) + && !pm->ps->saber[0].blade[1].active) {//using a staff, but only with first blade turned on, so use is as a normal saber...? //override so that single-blade staff must be used with specified style pm->ps->saberAnimLevel = pm->ps->saber[0].singleBladeStyle;//SS_STRONG; animLevelOverridden = qtrue; } - else if ( pm->gent + else if (pm->gent && cg.saberAnimLevelPending != pm->ps->saberAnimLevel - && WP_SaberStyleValidForSaber( pm->gent, cg.saberAnimLevelPending ) ) + && WP_SaberStyleValidForSaber(pm->gent, cg.saberAnimLevelPending)) {//go ahead and use the cg.saberAnimLevelPending below animLevelOverridden = qfalse; } - else if ( pm->gent - && ( WP_SaberStyleValidForSaber( pm->gent, pm->ps->saberAnimLevel ) - || WP_UseFirstValidSaberStyle( pm->gent, &pm->ps->saberAnimLevel ) ) ) + else if (pm->gent + && (WP_SaberStyleValidForSaber(pm->gent, pm->ps->saberAnimLevel) + || WP_UseFirstValidSaberStyle(pm->gent, &pm->ps->saberAnimLevel))) {//style we are using is not valid, switched us to a valid one animLevelOverridden = qtrue; } /* - else if ( pm->ps->saber[0].Active() - && pm->ps->saber[0].stylesAllowed ) + else if ( pm->ps->saber[0].Active() + && pm->ps->saber[0].stylesAllowed ) {//one of the sabers I'm using forces me to use one of a set of styles - if ( !(pm->ps->saber[0].stylesAllowed&(1<ps->saberAnimLevel)) ) - {//I'm not currently using a valid one - for ( int styleNum = SS_NONE+1; styleNum < SS_NUM_SABER_STYLES; styleNum++ ) - {//loop through and use the first valid one - if ( (pm->ps->saber[0].stylesAllowed&(1<ps->saberAnimLevel = styleNum; - animLevelOverridden = qtrue; - } - } - } + if ( !(pm->ps->saber[0].stylesAllowed&(1<ps->saberAnimLevel)) ) + {//I'm not currently using a valid one + for ( int styleNum = SS_NONE+1; styleNum < SS_NUM_SABER_STYLES; styleNum++ ) + {//loop through and use the first valid one + if ( (pm->ps->saber[0].stylesAllowed&(1<ps->saberAnimLevel = styleNum; + animLevelOverridden = qtrue; + } + } + } } */ - else if ( pm->ps->dualSabers ) + else if (pm->ps->dualSabers) { /* if ( pm->ps->saber[1].Active() - && pm->ps->saber[1].stylesAllowed ) + && pm->ps->saber[1].stylesAllowed ) {//one of the sabers I'm using forces me to use one of a set of styles - if ( !(pm->ps->saber[1].stylesAllowed&(1<ps->saberAnimLevel)) ) - {//I'm not currently using a valid one - for ( int styleNum = SS_NONE+1; styleNum < SS_NUM_SABER_STYLES; styleNum++ ) - {//loop through and use the first valid one - if ( (pm->ps->saber[1].stylesAllowed&(1<ps->saberAnimLevel = styleNum; - animLevelOverridden = qtrue; - } - } - } + if ( !(pm->ps->saber[1].stylesAllowed&(1<ps->saberAnimLevel)) ) + {//I'm not currently using a valid one + for ( int styleNum = SS_NONE+1; styleNum < SS_NUM_SABER_STYLES; styleNum++ ) + {//loop through and use the first valid one + if ( (pm->ps->saber[1].stylesAllowed&(1<ps->saberAnimLevel = styleNum; + animLevelOverridden = qtrue; + } + } + } } - else*/ if ( pm->ps->saber[1].Active() ) + else*/ if (pm->ps->saber[1].Active()) {//if second saber is on, must use dual style pm->ps->saberAnimLevel = SS_DUAL; animLevelOverridden = qtrue; } - else if ( pm->ps->saber[0].Active() ) + else if (pm->ps->saber[0].Active()) {//with only one saber on, use fast style pm->ps->saberAnimLevel = SS_FAST; - animLevelOverridden = qtrue; + animLevelOverridden = qtrue; } } - if ( !animLevelOverridden ) + if (!animLevelOverridden) { - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) - && cg.saberAnimLevelPending > SS_NONE - && cg.saberAnimLevelPending != pm->ps->saberAnimLevel ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + && cg.saberAnimLevelPending > SS_NONE + && cg.saberAnimLevelPending != pm->ps->saberAnimLevel) { - if ( !PM_SaberInStart( pm->ps->saberMove ) - && !PM_SaberInTransition( pm->ps->saberMove ) - && !PM_SaberInAttack( pm->ps->saberMove ) ) + if (!PM_SaberInStart(pm->ps->saberMove) + && !PM_SaberInTransition(pm->ps->saberMove) + && !PM_SaberInAttack(pm->ps->saberMove)) {//don't allow changes when in the middle of an attack set...(or delay the change until it's done) pm->ps->saberAnimLevel = cg.saberAnimLevelPending; } } } - else if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + else if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer())) {//if overrid the player's saberAnimLevel, let the cgame know cg.saberAnimLevelPending = pm->ps->saberAnimLevel; } /* if ( PM_InForceGetUp( pm->ps ) ) {//if mostly up, can start attack - if ( pm->ps->torsoAnimTimer > 800 ) - {//not up enough yet - // make weapon function - if ( pm->ps->weaponTime > 0 ) { - pm->ps->weaponTime -= pml.msec; - if ( pm->ps->weaponTime <= 0 ) - { - pm->ps->weaponTime = 0; - } - } - return; - } - else - { - if ( pm->cmd.buttons & BUTTON_ATTACK ) - {//let an attack interrupt the torso part of this force getup - pm->ps->weaponTime = 0; - } - } + if ( pm->ps->torsoAnimTimer > 800 ) + {//not up enough yet + // make weapon function + if ( pm->ps->weaponTime > 0 ) { + pm->ps->weaponTime -= pml.msec; + if ( pm->ps->weaponTime <= 0 ) + { + pm->ps->weaponTime = 0; + } + } + return; } - else + else + { + if ( pm->cmd.buttons & BUTTON_ATTACK ) + {//let an attack interrupt the torso part of this force getup + pm->ps->weaponTime = 0; + } + } + } + else */ - if ( PM_InKnockDown( pm->ps ) || PM_InRoll( pm->ps )) + if (PM_InKnockDown(pm->ps) || PM_InRoll(pm->ps)) {//in knockdown - if ( pm->ps->legsAnim == BOTH_ROLL_F - && pm->ps->legsAnimTimer <= 250 ) + if (pm->ps->legsAnim == BOTH_ROLL_F + && pm->ps->legsAnimTimer <= 250) { - if ( (pm->cmd.buttons&BUTTON_ATTACK) - || PM_NPCCheckAttackRoll() ) + if ((pm->cmd.buttons&BUTTON_ATTACK) + || PM_NPCCheckAttackRoll()) { - if ( G_EnoughPowerForSpecialMove( pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB ) ) + if (G_EnoughPowerForSpecialMove(pm->ps->forcePower, SABER_ALT_ATTACK_POWER_FB)) { - if ( !(pm->ps->saber[0].saberFlags&SFL_NO_ROLL_STAB) - && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_ROLL_STAB)) ) + if (!(pm->ps->saber[0].saberFlags&SFL_NO_ROLL_STAB) + && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_ROLL_STAB))) {//okay to do roll-stab - PM_SetSaberMove( LS_ROLL_STAB ); - if ( pm->gent ) + PM_SetSaberMove(LS_ROLL_STAB); + if (pm->gent) { - G_DrainPowerForSpecialMove( pm->gent, FP_SABER_OFFENSE, SABER_ALT_ATTACK_POWER_FB ); + G_DrainPowerForSpecialMove(pm->gent, FP_SABER_OFFENSE, SABER_ALT_ATTACK_POWER_FB); } } } @@ -12075,30 +12104,30 @@ void PM_WeaponLightsaber(void) return; } - if ( PM_SaberLocked() ) + if (PM_SaberLocked()) { pm->ps->saberMove = LS_NONE; return; } - if ( pm->ps->torsoAnim == BOTH_FORCELONGLEAP_LAND - || (pm->ps->torsoAnim == BOTH_FORCELONGLEAP_START && !(pm->cmd.buttons&BUTTON_ATTACK)) ) + if (pm->ps->torsoAnim == BOTH_FORCELONGLEAP_LAND + || (pm->ps->torsoAnim == BOTH_FORCELONGLEAP_START && !(pm->cmd.buttons&BUTTON_ATTACK))) {//if you're in the long-jump and you're not attacking (or are landing), you're not doing anything - if ( pm->ps->torsoAnimTimer ) + if (pm->ps->torsoAnimTimer) { return; } } - if ( pm->ps->legsAnim == BOTH_FLIP_HOLD7 - && !(pm->cmd.buttons&BUTTON_ATTACK) ) + if (pm->ps->legsAnim == BOTH_FLIP_HOLD7 + && !(pm->cmd.buttons&BUTTON_ATTACK)) {//if you're in the upside-down attack hold, don't do anything unless you're attacking return; } - if ( PM_KickingAnim( pm->ps->legsAnim ) ) + if (PM_KickingAnim(pm->ps->legsAnim)) { - if ( pm->ps->legsAnimTimer ) + if (pm->ps->legsAnimTimer) {//you're kicking, no interruptions return; } @@ -12107,51 +12136,51 @@ void PM_WeaponLightsaber(void) pm->ps->weaponTime = 0; } - if ( pm->ps->saberMoveNext != LS_NONE - && (pm->ps->saberMove == LS_READY||pm->ps->saberMove == LS_NONE))//ready for another one + if (pm->ps->saberMoveNext != LS_NONE + && (pm->ps->saberMove == LS_READY || pm->ps->saberMove == LS_NONE))//ready for another one {//something is forcing us to set a specific next saberMove //FIXME: if this is a NPC kick, re-verify it before executing it! - PM_SetSaberMove( (saberMoveName_t)pm->ps->saberMoveNext ); + PM_SetSaberMove((saberMoveName_t)pm->ps->saberMoveNext); pm->ps->saberMoveNext = LS_NONE;//clear it now that we played it return; } - if ( pm->ps->saberEventFlags&SEF_INWATER )//saber in water + if (pm->ps->saberEventFlags&SEF_INWATER)//saber in water { - pm->cmd.buttons &= ~(BUTTON_ATTACK|BUTTON_ALT_ATTACK|BUTTON_FORCE_FOCUS); + pm->cmd.buttons &= ~(BUTTON_ATTACK | BUTTON_ALT_ATTACK | BUTTON_FORCE_FOCUS); } qboolean saberInAir = qtrue; - if ( !PM_SaberInBrokenParry( pm->ps->saberMove ) && pm->ps->saberBlocked != BLOCKED_PARRY_BROKEN && !PM_DodgeAnim( pm->ps->torsoAnim ) && + if (!PM_SaberInBrokenParry(pm->ps->saberMove) && pm->ps->saberBlocked != BLOCKED_PARRY_BROKEN && !PM_DodgeAnim(pm->ps->torsoAnim) && pm->ps->weaponstate != WEAPON_CHARGING_ALT && pm->ps->weaponstate != WEAPON_CHARGING) {//we're not stuck in a broken parry - if ( pm->ps->saberInFlight ) + if (pm->ps->saberInFlight) {//guiding saber - if ( pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0 )//player is 0 + if (pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0)//player is 0 {// - if ( &g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY ) + if (&g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY) {//fell to the ground and we're not trying to pull it back saberInAir = qfalse; } } - if ( pm->ps->weaponTime <= 0 || pm->ps->weaponstate != WEAPON_FIRING ) + if (pm->ps->weaponTime <= 0 || pm->ps->weaponstate != WEAPON_FIRING) { - if ( pm->ps->weapon != pm->cmd.weapon ) + if (pm->ps->weapon != pm->cmd.weapon) { - PM_BeginWeaponChange( pm->cmd.weapon ); + PM_BeginWeaponChange(pm->cmd.weapon); } } - else if ( pm->ps->weapon == WP_SABER - && (!pm->ps->dualSabers || !pm->ps->saber[1].Active()) ) + else if (pm->ps->weapon == WP_SABER + && (!pm->ps->dualSabers || !pm->ps->saber[1].Active())) {//guiding saber - if ( saberInAir ) + if (saberInAir) { - if ( !PM_ForceAnim( pm->ps->torsoAnim ) || pm->ps->torsoAnimTimer < 300 ) + if (!PM_ForceAnim(pm->ps->torsoAnim) || pm->ps->torsoAnimTimer < 300) {//don't interrupt a force power anim - if ( pm->ps->torsoAnim != BOTH_LOSE_SABER - || !pm->ps->torsoAnimTimer ) + if (pm->ps->torsoAnim != BOTH_LOSE_SABER + || !pm->ps->torsoAnimTimer) { - PM_SetAnim( pm, SETANIM_TORSO, BOTH_SABERPULL, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_SABERPULL, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } } } @@ -12160,10 +12189,10 @@ void PM_WeaponLightsaber(void) } } - if ( pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0 ) + if (pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0) {//FIXME: this is going to fire off one frame before you expect, actually pm->gent->client->fireDelay -= pml.msec; - if ( pm->gent->client->fireDelay <= 0 ) + if (pm->gent->client->fireDelay <= 0) {//just finished delay timer pm->gent->client->fireDelay = 0; delayed_fire = qtrue; @@ -12172,50 +12201,50 @@ void PM_WeaponLightsaber(void) PM_CheckClearSaberBlock(); - if ( PM_LockedAnim( pm->ps->torsoAnim ) - && pm->ps->torsoAnimTimer ) + if (PM_LockedAnim(pm->ps->torsoAnim) + && pm->ps->torsoAnimTimer) {//can't interrupt these anims ever return; } - if ( PM_SuperBreakLoseAnim( pm->ps->torsoAnim ) - && pm->ps->torsoAnimTimer ) + if (PM_SuperBreakLoseAnim(pm->ps->torsoAnim) + && pm->ps->torsoAnimTimer) {//don't interrupt these anims return; } - if ( PM_SuperBreakWinAnim( pm->ps->torsoAnim ) - && pm->ps->torsoAnimTimer ) + if (PM_SuperBreakWinAnim(pm->ps->torsoAnim) + && pm->ps->torsoAnimTimer) {//don't interrupt these anims return; } - - if ( PM_SaberBlocking() ) + + if (PM_SaberBlocking()) {//busy blocking, don't do attacks return; } // check for weapon change // can't change if weapon is firing, but can change again if lowering or raising - if ( (pm->ps->weaponTime <= 0 || pm->ps->weaponstate != WEAPON_FIRING) && pm->ps->weaponstate != WEAPON_CHARGING_ALT && pm->ps->weaponstate != WEAPON_CHARGING) { - if ( pm->ps->weapon != pm->cmd.weapon ) { - PM_BeginWeaponChange( pm->cmd.weapon ); + if ((pm->ps->weaponTime <= 0 || pm->ps->weaponstate != WEAPON_FIRING) && pm->ps->weaponstate != WEAPON_CHARGING_ALT && pm->ps->weaponstate != WEAPON_CHARGING) { + if (pm->ps->weapon != pm->cmd.weapon) { + PM_BeginWeaponChange(pm->cmd.weapon); } } - if ( pm->ps->weaponTime > 0 ) + if (pm->ps->weaponTime > 0) { - //FIXME: allow some window of opportunity to change your attack - // if it just started and your directional input is different + //FIXME: allow some window of opportunity to change your attack + // if it just started and your directional input is different // than it was before... but only 100 milliseconds at most? //OR: Make it so that attacks don't start until 100ms after you // press the attack button...??? - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) //player - && PM_SaberInReturn( pm->ps->saberMove )//in a saber return move - FIXME: what about transitions? + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) //player + && PM_SaberInReturn(pm->ps->saberMove)//in a saber return move - FIXME: what about transitions? //&& pm->ps->torsoAnimTimer<=250//towards the end of a saber return anim && pm->ps->saberBlocked == BLOCKED_NONE//not interacting with any other saber && !(pm->cmd.buttons&BUTTON_ATTACK)//not trying to swing the saber - && (pm->cmd.forwardmove||pm->cmd.rightmove) )//trying to kick in a specific direction + && (pm->cmd.forwardmove || pm->cmd.rightmove))//trying to kick in a specific direction { - if ( PM_CheckAltKickAttack() )//trying to do a kick + if (PM_CheckAltKickAttack())//trying to do a kick {//allow them to do the kick now! pm->ps->weaponTime = 0; PM_CheckKick(); @@ -12224,25 +12253,25 @@ void PM_WeaponLightsaber(void) } else { - if ( !pm->cmd.rightmove + if (!pm->cmd.rightmove &&!pm->cmd.forwardmove - &&(pm->cmd.buttons&BUTTON_ATTACK) ) + && (pm->cmd.buttons&BUTTON_ATTACK)) { /* if ( PM_CheckDualSpinProtect() ) {//check to see if we're going to do the special dual push protect move - PM_SetSaberMove( LS_DUAL_SPIN_PROTECT ); - pm->ps->weaponstate = WEAPON_FIRING; - return; + PM_SetSaberMove( LS_DUAL_SPIN_PROTECT ); + pm->ps->weaponstate = WEAPON_FIRING; + return; } else */ - if ( !g_saberNewControlScheme->integer ) + if (!g_saberNewControlScheme->integer) { saberMoveName_t pullAtk = PM_CheckPullAttack(); - if ( pullAtk != LS_NONE ) + if (pullAtk != LS_NONE) { - PM_SetSaberMove( pullAtk ); + PM_SetSaberMove(pullAtk); pm->ps->weaponstate = WEAPON_FIRING; return; } @@ -12260,7 +12289,7 @@ void PM_WeaponLightsaber(void) // ********************************************************* // change weapon if time - if ( pm->ps->weaponstate == WEAPON_DROPPING ) { + if (pm->ps->weaponstate == WEAPON_DROPPING) { PM_FinishWeaponChange(); return; } @@ -12269,12 +12298,12 @@ void PM_WeaponLightsaber(void) // WEAPON_RAISING // ********************************************************* - if ( pm->ps->weaponstate == WEAPON_RAISING ) + if (pm->ps->weaponstate == WEAPON_RAISING) {//Just selected the weapon pm->ps->weaponstate = WEAPON_IDLE; - if(pm->gent && (pm->gent->s.numbergent))) + if (pm->gent && (pm->gent->s.numbergent))) { - switch ( pm->ps->legsAnim ) + switch (pm->ps->legsAnim) { case BOTH_WALK1: case BOTH_WALK2: @@ -12291,13 +12320,13 @@ void PM_WeaponLightsaber(void) case BOTH_RUNBACK1: case BOTH_RUNBACK2: case BOTH_RUNBACK_STAFF: - PM_SetAnim(pm,SETANIM_TORSO,pm->ps->legsAnim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, pm->ps->legsAnim, SETANIM_FLAG_NORMAL); break; default: int anim = PM_ReadyPoseForSaberAnimLevel(); - if (anim!=-1) + if (anim != -1) { - PM_SetAnim(pm,SETANIM_TORSO,anim,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, anim, SETANIM_FLAG_NORMAL); } break; } @@ -12305,31 +12334,31 @@ void PM_WeaponLightsaber(void) else { qboolean saberInAir = qtrue; - if ( pm->ps->saberInFlight ) + if (pm->ps->saberInFlight) {//guiding saber - if ( PM_SaberInBrokenParry( pm->ps->saberMove ) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim( pm->ps->torsoAnim ) ) + if (PM_SaberInBrokenParry(pm->ps->saberMove) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim(pm->ps->torsoAnim)) {//we're stuck in a broken parry saberInAir = qfalse; } - if ( pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0 )//player is 0 + if (pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0)//player is 0 {// - if ( &g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY ) + if (&g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY) {//fell to the ground and we're not trying to pull it back saberInAir = qfalse; } } } - if ( pm->ps->weapon == WP_SABER - && pm->ps->saberInFlight - && saberInAir + if (pm->ps->weapon == WP_SABER + && pm->ps->saberInFlight + && saberInAir && (!pm->ps->dualSabers || !pm->ps->saber[1].Active())) {//guiding saber - if ( !PM_ForceAnim( pm->ps->torsoAnim ) || pm->ps->torsoAnimTimer < 300 ) + if (!PM_ForceAnim(pm->ps->torsoAnim) || pm->ps->torsoAnimTimer < 300) {//don't interrupt a force power anim - if ( pm->ps->torsoAnim != BOTH_LOSE_SABER - || !pm->ps->torsoAnimTimer ) + if (pm->ps->torsoAnim != BOTH_LOSE_SABER + || !pm->ps->torsoAnimTimer) { - PM_SetAnim( pm, SETANIM_TORSO, BOTH_SABERPULL, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_SABERPULL, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } } } @@ -12347,24 +12376,24 @@ void PM_WeaponLightsaber(void) // Check for WEAPON ATTACK // ********************************************************* - if ( PM_CanDoKata() ) + if (PM_CanDoKata()) { saberMoveName_t overrideMove = LS_INVALID; //see if we have an overridden (or cancelled) kata move - if ( pm->ps->saber[0].kataMove != LS_INVALID ) + if (pm->ps->saber[0].kataMove != LS_INVALID) { - if ( pm->ps->saber[0].kataMove != LS_NONE ) + if (pm->ps->saber[0].kataMove != LS_NONE) { overrideMove = (saberMoveName_t)pm->ps->saber[0].kataMove; } } - if ( overrideMove == LS_INVALID ) + if (overrideMove == LS_INVALID) {//not overridden by first saber, check second - if ( pm->ps->dualSabers ) + if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].kataMove != LS_INVALID ) + if (pm->ps->saber[1].kataMove != LS_INVALID) { - if ( pm->ps->saber[1].kataMove != LS_NONE ) + if (pm->ps->saber[1].kataMove != LS_NONE) { overrideMove = (saberMoveName_t)pm->ps->saber[1].kataMove; } @@ -12372,74 +12401,74 @@ void PM_WeaponLightsaber(void) } } //no overrides, cancelled? - if ( overrideMove == LS_INVALID ) + if (overrideMove == LS_INVALID) { - if ( pm->ps->saber[0].kataMove == LS_NONE ) + if (pm->ps->saber[0].kataMove == LS_NONE) { overrideMove = LS_NONE; } - else if ( pm->ps->dualSabers ) + else if (pm->ps->dualSabers) { - if ( pm->ps->saber[1].kataMove == LS_NONE ) + if (pm->ps->saber[1].kataMove == LS_NONE) { overrideMove = LS_NONE; } } } - if ( overrideMove == LS_INVALID ) + if (overrideMove == LS_INVALID) {//not overridden //FIXME: make sure to turn on saber(s)! - switch ( pm->ps->saberAnimLevel ) + switch (pm->ps->saberAnimLevel) { case SS_FAST: case SS_TAVION: - PM_SetSaberMove( LS_A1_SPECIAL ); + PM_SetSaberMove(LS_A1_SPECIAL); break; case SS_MEDIUM: - PM_SetSaberMove( LS_A2_SPECIAL ); + PM_SetSaberMove(LS_A2_SPECIAL); break; case SS_STRONG: case SS_DESANN: - PM_SetSaberMove( LS_A3_SPECIAL ); + PM_SetSaberMove(LS_A3_SPECIAL); break; case SS_DUAL: - PM_SetSaberMove( LS_DUAL_SPIN_PROTECT );//PM_CheckDualSpinProtect(); + PM_SetSaberMove(LS_DUAL_SPIN_PROTECT);//PM_CheckDualSpinProtect(); break; case SS_STAFF: - PM_SetSaberMove( LS_STAFF_SOULCAL ); + PM_SetSaberMove(LS_STAFF_SOULCAL); break; } pm->ps->weaponstate = WEAPON_FIRING; - if ( pm->gent ) + if (pm->gent) { - G_DrainPowerForSpecialMove( pm->gent, FP_SABER_OFFENSE, SABER_ALT_ATTACK_POWER, qtrue );//FP_SPEED, SINGLE_SPECIAL_POWER ); + G_DrainPowerForSpecialMove(pm->gent, FP_SABER_OFFENSE, SABER_ALT_ATTACK_POWER, qtrue);//FP_SPEED, SINGLE_SPECIAL_POWER ); //G_StartMatrixEffect( pm->gent, MEF_REVERSE_SPIN, pm->ps->torsoAnimTimer ); } } - else if ( overrideMove != LS_NONE ) + else if (overrideMove != LS_NONE) { - PM_SetSaberMove( overrideMove ); + PM_SetSaberMove(overrideMove); pm->ps->weaponstate = WEAPON_FIRING; - if ( pm->gent ) + if (pm->gent) { - G_DrainPowerForSpecialMove( pm->gent, FP_SABER_OFFENSE, SABER_ALT_ATTACK_POWER, qtrue );//FP_SPEED, SINGLE_SPECIAL_POWER ); + G_DrainPowerForSpecialMove(pm->gent, FP_SABER_OFFENSE, SABER_ALT_ATTACK_POWER, qtrue);//FP_SPEED, SINGLE_SPECIAL_POWER ); //G_StartMatrixEffect( pm->gent, MEF_REVERSE_SPIN, pm->ps->torsoAnimTimer ); } } - if ( overrideMove != LS_NONE ) + if (overrideMove != LS_NONE) {//not cancelled return; } } - if ( PM_CheckAltKickAttack() ) + if (PM_CheckAltKickAttack()) {//trying to do a kick //FIXME: in-air kicks? - if ( pm->ps->saberAnimLevel == SS_STAFF - && (pm->ps->clientNum >= MAX_CLIENTS||PM_ControlledByPlayer()) ) + if (pm->ps->saberAnimLevel == SS_STAFF + && (pm->ps->clientNum >= MAX_CLIENTS || PM_ControlledByPlayer())) {//NPCs spin the staff //NOTE: only NPCs can do it the easy way... they kick directly, not through ucmds... - PM_SetSaberMove( LS_SPINATTACK ); + PM_SetSaberMove(LS_SPINATTACK); return; } else @@ -12451,17 +12480,15 @@ void PM_WeaponLightsaber(void) //this is never a valid regular saber attack button //pm->cmd.buttons &= ~BUTTON_FORCE_FOCUS; - if ( PM_CheckUpsideDownAttack() ) + if (PM_CheckUpsideDownAttack()) { return; } - weapon = &cg_weapons[pm->ps->weapon]; - - if(!delayed_fire) + if (!delayed_fire) { // Start with the current move, and cross index it with the current control states. - if ( pm->ps->saberMove > LS_NONE && pm->ps->saberMove < LS_MOVE_MAX ) + if (pm->ps->saberMove > LS_NONE && pm->ps->saberMove < LS_MOVE_MAX) { curmove = (saberMoveName_t)pm->ps->saberMove; } @@ -12469,43 +12496,43 @@ void PM_WeaponLightsaber(void) { curmove = LS_READY; } - if ( curmove == LS_A_JUMP_T__B_ || pm->ps->torsoAnim == BOTH_FORCELEAP2_T__B_ ) + if (curmove == LS_A_JUMP_T__B_ || pm->ps->torsoAnim == BOTH_FORCELEAP2_T__B_) {//must transition back to ready from this anim newmove = LS_R_T2B; } // check for fire - else if ( !(pm->cmd.buttons & BUTTON_ATTACK) )//(BUTTON_ATTACK|BUTTON_ALT_ATTACK|BUTTON_FORCE_FOCUS)) ) + else if (!(pm->cmd.buttons & BUTTON_ATTACK))//(BUTTON_ATTACK|BUTTON_ALT_ATTACK|BUTTON_FORCE_FOCUS)) ) {//not attacking pm->ps->weaponTime = 0; - - if ( pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0 ) + + if (pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0) {//Still firing pm->ps->weaponstate = WEAPON_FIRING; } - else if ( pm->ps->weaponstate != WEAPON_READY ) + else if (pm->ps->weaponstate != WEAPON_READY) { pm->ps->weaponstate = WEAPON_IDLE; } //Check for finishing an anim if necc. - if ( curmove >= LS_S_TL2BR && curmove <= LS_S_T2B ) + if (curmove >= LS_S_TL2BR && curmove <= LS_S_T2B) {//started a swing, must continue from here - newmove = LS_A_TL2BR + (curmove-LS_S_TL2BR); + newmove = LS_A_TL2BR + (curmove - LS_S_TL2BR); } - else if ( curmove >= LS_A_TL2BR && curmove <= LS_A_T2B ) + else if (curmove >= LS_A_TL2BR && curmove <= LS_A_T2B) {//finished an attack, must continue from here - newmove = LS_R_TL2BR + (curmove-LS_A_TL2BR); + newmove = LS_R_TL2BR + (curmove - LS_A_TL2BR); } - else if ( PM_SaberInTransition( curmove ) ) + else if (PM_SaberInTransition(curmove)) {//in a transition, must play sequential attack newmove = saberMoveData[curmove].chain_attack; } - else if ( PM_SaberInBounce( curmove ) ) + else if (PM_SaberInBounce(curmove)) {//in a bounce - if ( pm->ps->clientNum && !PM_ControlledByPlayer() ) + if (pm->ps->clientNum && !PM_ControlledByPlayer()) {//NPCs must play sequential attack //going into another attack... //allow endless chaining in level 1 attacks, several in level 2 and only one or a few in level 3 - if ( PM_SaberKataDone( LS_NONE, LS_NONE ) ) + if (PM_SaberKataDone(LS_NONE, LS_NONE)) {//done with this kata, must return to ready before attack again newmove = saberMoveData[curmove].chain_idle; } @@ -12523,9 +12550,9 @@ void PM_WeaponLightsaber(void) else {//FIXME: what about returning from a parry? //PM_SetSaberMove( LS_READY ); - if ( pm->ps->saberBlockingTime > cg.time ) + if (pm->ps->saberBlockingTime > cg.time) { - PM_SetSaberMove( LS_READY ); + PM_SetSaberMove(LS_READY); } return; } @@ -12534,36 +12561,36 @@ void PM_WeaponLightsaber(void) // *************************************************** // Pressing attack, so we must look up the proper attack move. qboolean saberInAir = qtrue; - if ( pm->ps->saberInFlight ) + if (pm->ps->saberInFlight) {//guiding saber - if ( PM_SaberInBrokenParry( pm->ps->saberMove ) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim( pm->ps->torsoAnim ) ) + if (PM_SaberInBrokenParry(pm->ps->saberMove) || pm->ps->saberBlocked == BLOCKED_PARRY_BROKEN || PM_DodgeAnim(pm->ps->torsoAnim)) {//we're stuck in a broken parry saberInAir = qfalse; } - if ( pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0 )//player is 0 + if (pm->ps->saberEntityNum < ENTITYNUM_NONE && pm->ps->saberEntityNum > 0)//player is 0 {// - if ( &g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY ) + if (&g_entities[pm->ps->saberEntityNum] != NULL && g_entities[pm->ps->saberEntityNum].s.pos.trType == TR_STATIONARY) {//fell to the ground and we're not trying to pull it back saberInAir = qfalse; } } } - if ( pm->ps->weapon == WP_SABER - && pm->ps->saberInFlight - && saberInAir + if (pm->ps->weapon == WP_SABER + && pm->ps->saberInFlight + && saberInAir && (!pm->ps->dualSabers || !pm->ps->saber[1].Active())) {//guiding saber - if ( !PM_ForceAnim( pm->ps->torsoAnim ) || pm->ps->torsoAnimTimer < 300 ) + if (!PM_ForceAnim(pm->ps->torsoAnim) || pm->ps->torsoAnimTimer < 300) {//don't interrupt a force power anim - if ( pm->ps->torsoAnim != BOTH_LOSE_SABER - || !pm->ps->torsoAnimTimer ) + if (pm->ps->torsoAnim != BOTH_LOSE_SABER + || !pm->ps->torsoAnimTimer) { - PM_SetAnim( pm, SETANIM_TORSO,BOTH_SABERPULL,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_SABERPULL, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } } } - else if ( pm->ps->weaponTime > 0 ) + else if (pm->ps->weaponTime > 0) { // Last attack is not yet complete. pm->ps->weaponstate = WEAPON_FIRING; return; @@ -12571,52 +12598,52 @@ void PM_WeaponLightsaber(void) else { int both = qfalse; - if ( pm->ps->torsoAnim == BOTH_FORCELONGLEAP_ATTACK - || pm->ps->torsoAnim == BOTH_FORCELONGLEAP_LAND ) + if (pm->ps->torsoAnim == BOTH_FORCELONGLEAP_ATTACK + || pm->ps->torsoAnim == BOTH_FORCELONGLEAP_LAND) {//can't attack in these anims return; } - else if ( pm->ps->torsoAnim == BOTH_FORCELONGLEAP_START ) + else if (pm->ps->torsoAnim == BOTH_FORCELONGLEAP_START) {//only 1 attack you can do from this anim - if ( pm->ps->torsoAnimTimer >= 200 ) + if (pm->ps->torsoAnimTimer >= 200) {//hit it early enough to do the attack - PM_SetSaberMove( LS_LEAP_ATTACK ); + PM_SetSaberMove(LS_LEAP_ATTACK); } return; } - if ( curmove >= LS_PARRY_UP && curmove <= LS_REFLECT_LL ) + if (curmove >= LS_PARRY_UP && curmove <= LS_REFLECT_LL) {//from a parry or reflection, can go directly into an attack - if ( pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer() ) + if (pm->ps->clientNum >= MAX_CLIENTS && !PM_ControlledByPlayer()) {//NPCs - newmove = PM_NPCSaberAttackFromQuad( saberMoveData[curmove].endQuad ); + newmove = PM_NPCSaberAttackFromQuad(saberMoveData[curmove].endQuad); } else { - newmove = PM_SaberAttackForMovement( pm->cmd.forwardmove, pm->cmd.rightmove, curmove ); + newmove = PM_SaberAttackForMovement(pm->cmd.forwardmove, pm->cmd.rightmove, curmove); } } - if ( newmove != LS_NONE ) + if (newmove != LS_NONE) {//have a valid, final LS_ move picked, so skip findingt he transition move and just get the anim - if (PM_HasAnimation( pm->gent, saberMoveData[newmove].animToUse)) + if (PM_HasAnimation(pm->gent, saberMoveData[newmove].animToUse)) { anim = saberMoveData[newmove].animToUse; } } //FIXME: diagonal dirs use the figure-eight attacks from ready pose? - if ( anim == -1 ) + if (anim == -1) { //FIXME: take FP_SABER_OFFENSE into account here somehow? - if ( PM_SaberInTransition( curmove ) ) + if (PM_SaberInTransition(curmove)) {//in a transition, must play sequential attack newmove = saberMoveData[curmove].chain_attack; } - else if ( curmove >= LS_S_TL2BR && curmove <= LS_S_T2B ) + else if (curmove >= LS_S_TL2BR && curmove <= LS_S_T2B) {//started a swing, must continue from here - newmove = LS_A_TL2BR + (curmove-LS_S_TL2BR); + newmove = LS_A_TL2BR + (curmove - LS_S_TL2BR); } - else if ( PM_SaberInBrokenParry( curmove ) ) + else if (PM_SaberInBrokenParry(curmove)) {//broken parries must always return to ready newmove = LS_READY; } @@ -12625,27 +12652,27 @@ void PM_WeaponLightsaber(void) /* if ( PM_SaberKataDone() ) {//we came from a bounce and cannot chain to another attack because our kata is done - newmove = saberMoveData[curmove].chain_idle; + newmove = saberMoveData[curmove].chain_idle; } else */ - if ( pm->ps->clientNum >= MAX_CLIENTS - && !PM_ControlledByPlayer() - && (Q_irand( 0, pm->ps->forcePowerLevel[FP_SABER_OFFENSE]-1 ) - || (pm->gent&&pm->gent->enemy&&pm->gent->enemy->client&&PM_InKnockDownOnGround(&pm->gent->enemy->client->ps))//enemy knocked down, use some logic - || ( pm->ps->saberAnimLevel == SS_FAST && pm->gent && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand( 0, 1 ) ) ) )//minor change to make fast-attack users use the special attacks more + if (pm->ps->clientNum >= MAX_CLIENTS + && !PM_ControlledByPlayer() + && (Q_irand(0, pm->ps->forcePowerLevel[FP_SABER_OFFENSE] - 1) + || (pm->gent&&pm->gent->enemy&&pm->gent->enemy->client&&PM_InKnockDownOnGround(&pm->gent->enemy->client->ps))//enemy knocked down, use some logic + || (pm->ps->saberAnimLevel == SS_FAST && pm->gent && pm->gent->NPC && pm->gent->NPC->rank >= RANK_LT_JG && Q_irand(0, 1))))//minor change to make fast-attack users use the special attacks more {//NPCs use more randomized attacks the more skilled they are - newmove = PM_NPCSaberAttackFromQuad( saberMoveData[curmove].endQuad ); + newmove = PM_NPCSaberAttackFromQuad(saberMoveData[curmove].endQuad); } else { - newmove = PM_SaberAttackForMovement( pm->cmd.forwardmove, pm->cmd.rightmove, curmove ); - if ( (PM_SaberInBounce( curmove )||PM_SaberInBrokenParry( curmove )) - && saberMoveData[newmove].startQuad == saberMoveData[curmove].endQuad ) + newmove = PM_SaberAttackForMovement(pm->cmd.forwardmove, pm->cmd.rightmove, curmove); + if ((PM_SaberInBounce(curmove) || PM_SaberInBrokenParry(curmove)) + && saberMoveData[newmove].startQuad == saberMoveData[curmove].endQuad) {//this attack would be a repeat of the last (which was blocked), so don't actually use it, use the default chain attack for this bounce newmove = saberMoveData[curmove].chain_attack; } } - if ( PM_SaberKataDone( curmove, newmove ) ) + if (PM_SaberKataDone(curmove, newmove)) {//cannot chain this time newmove = saberMoveData[curmove].chain_idle; } @@ -12653,17 +12680,17 @@ void PM_WeaponLightsaber(void) /* if ( newmove == LS_NONE ) {//FIXME: should we allow this? Are there some anims that you should never be able to chain into an attack? - //only curmove that might get in here is LS_NONE, LS_DRAW, LS_PUTAWAY and the LS_R_ returns... all of which are in Q_R - newmove = PM_AttackMoveForQuad( saberMoveData[curmove].endQuad ); + //only curmove that might get in here is LS_NONE, LS_DRAW, LS_PUTAWAY and the LS_R_ returns... all of which are in Q_R + newmove = PM_AttackMoveForQuad( saberMoveData[curmove].endQuad ); } */ - if ( newmove != LS_NONE ) + if (newmove != LS_NONE) { - if ( !PM_InCartwheel( pm->ps->legsAnim ) ) + if (!PM_InCartwheel(pm->ps->legsAnim)) {//don't do transitions when cartwheeling - could make you spin! //Now get the proper transition move - newmove = PM_SaberAnimTransitionMove( (saberMoveName_t)curmove, (saberMoveName_t)newmove ); - if ( PM_HasAnimation( pm->gent, saberMoveData[newmove].animToUse ) ) + newmove = PM_SaberAnimTransitionMove((saberMoveName_t)curmove, (saberMoveName_t)newmove); + if (PM_HasAnimation(pm->gent, saberMoveData[newmove].animToUse)) { anim = saberMoveData[newmove].animToUse; } @@ -12673,13 +12700,13 @@ void PM_WeaponLightsaber(void) if (anim == -1) {//not side-stepping, pick neutral anim - if ( !G_TryingSpecial(pm->gent,&pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/ ) + if (!G_TryingSpecial(pm->gent, &pm->cmd)/*(pm->cmd.buttons&BUTTON_FORCE_FOCUS)*/) {//but only if not trying one of the special attacks! - if ( PM_InCartwheel( pm->ps->legsAnim ) - && pm->ps->legsAnimTimer > 100 ) + if (PM_InCartwheel(pm->ps->legsAnim) + && pm->ps->legsAnimTimer > 100) {//if in the middle of a cartwheel, the chain attack is just a normal attack //NOTE: this should match the switch in PM_InCartwheel! - switch( pm->ps->legsAnim ) + switch (pm->ps->legsAnim) { case BOTH_ARIAL_LEFT://swing from l to r case BOTH_CARTWHEEL_LEFT: @@ -12690,7 +12717,7 @@ void PM_WeaponLightsaber(void) newmove = LS_A_R2L; break; case BOTH_ARIAL_F1://random l/r attack - if ( Q_irand( 0, 1 ) ) + if (Q_irand(0, 1)) { newmove = LS_A_L2R; } @@ -12706,25 +12733,25 @@ void PM_WeaponLightsaber(void) // Add randomness for prototype? newmove = saberMoveData[curmove].chain_attack; } - if ( newmove != LS_NONE ) + if (newmove != LS_NONE) { - if (PM_HasAnimation( pm->gent, saberMoveData[newmove].animToUse)) + if (PM_HasAnimation(pm->gent, saberMoveData[newmove].animToUse)) { - anim= saberMoveData[newmove].animToUse; + anim = saberMoveData[newmove].animToUse; } } } - if ( !pm->cmd.forwardmove && !pm->cmd.rightmove && pm->cmd.upmove >= 0 && pm->ps->groundEntityNum != ENTITYNUM_NONE ) + if (!pm->cmd.forwardmove && !pm->cmd.rightmove && pm->cmd.upmove >= 0 && pm->ps->groundEntityNum != ENTITYNUM_NONE) {//not moving at all, so set the anim on entire body both = qtrue; } - + } - if ( anim == -1) + if (anim == -1) { - switch ( pm->ps->legsAnim ) + switch (pm->ps->legsAnim) { case BOTH_WALK1: case BOTH_WALK2: @@ -12750,23 +12777,23 @@ void PM_WeaponLightsaber(void) newmove = LS_READY; } - if ( !pm->ps->SaberActive() ) + if (!pm->ps->SaberActive()) {//turn on the saber if it's not on pm->ps->SaberActivate(); } - PM_SetSaberMove( (saberMoveName_t)newmove ); + PM_SetSaberMove((saberMoveName_t)newmove); - if ( both && pm->ps->legsAnim != pm->ps->torsoAnim ) + if (both && pm->ps->legsAnim != pm->ps->torsoAnim) { - PM_SetAnim( pm,SETANIM_LEGS,pm->ps->torsoAnim,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_LEGS, pm->ps->torsoAnim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } - if ( pm->gent && pm->gent->client ) + if (pm->gent && pm->gent->client) { -// pm->gent->client->saberTrail.inAction = qtrue; -// pm->gent->client->saberTrail.duration = 75; // saber trail lasts for 75ms...feel free to change this if you want it longer or shorter + // pm->gent->client->saberTrail.inAction = qtrue; + // pm->gent->client->saberTrail.duration = 75; // saber trail lasts for 75ms...feel free to change this if you want it longer or shorter } - if ( !PM_InCartwheel( pm->ps->torsoAnim ) ) + if (!PM_InCartwheel(pm->ps->torsoAnim)) {//can still attack during a cartwheel/arial //don't fire again until anim is done pm->ps->weaponTime = pm->ps->torsoAnimTimer; @@ -12775,7 +12802,7 @@ void PM_WeaponLightsaber(void) //FIXME: this may be making it so sometimes you can't swing again right away... if ( newmove == LS_READY ) { - pm->ps->weaponTime = 500; + pm->ps->weaponTime = 500; } */ } @@ -12787,13 +12814,7 @@ void PM_WeaponLightsaber(void) pm->ps->weaponstate = WEAPON_FIRING; - /* - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) - amount = weaponData[pm->ps->weapon].altEnergyPerShot; - else*/ - amount = weaponData[pm->ps->weapon].energyPerShot; - - if ( pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0 ) + if (pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0) {//FIXME: this is going to fire off one frame before you expect, actually // Clear these out since we're not actually firing yet pm->ps->eFlags &= ~EF_FIRING; @@ -12803,46 +12824,46 @@ void PM_WeaponLightsaber(void) addTime = pm->ps->weaponTime; /*if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) { - PM_AddEvent( EV_ALT_FIRE ); - if ( !addTime ) - { - addTime = weaponData[pm->ps->weapon].altFireTime; - if ( g_timescale != NULL ) - { - if ( g_timescale->value < 1.0f ) - { - if ( !MatrixMode ) - {//Special test for Matrix Mode (tm) - if ( pm->ps->clientNum == 0 && !player_locked && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<value; - } - else if ( g_entities[pm->ps->clientNum].client && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<value; - } - } - } - } - } + PM_AddEvent( EV_ALT_FIRE ); + if ( !addTime ) + { + addTime = weaponData[pm->ps->weapon].altFireTime; + if ( g_timescale != NULL ) + { + if ( g_timescale->value < 1.0f ) + { + if ( !MatrixMode ) + {//Special test for Matrix Mode (tm) + if ( pm->ps->clientNum == 0 && !player_locked && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<value; + } + else if ( g_entities[pm->ps->clientNum].client && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<value; + } + } + } + } + } } else */{ - PM_AddEvent( EV_FIRE_WEAPON ); - if ( !addTime ) + PM_AddEvent(EV_FIRE_WEAPON); + if (!addTime) { addTime = weaponData[pm->ps->weapon].fireTime; - if ( g_timescale != NULL ) + if (g_timescale != NULL) { - if ( g_timescale->value < 1.0f ) + if (g_timescale->value < 1.0f) { - if ( !MatrixMode ) + if (!MatrixMode) {//Special test for Matrix Mode (tm) - if ( pm->ps->clientNum == 0 && !player_locked && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<ps->clientNum == 0 && !player_locked && (pm->ps->forcePowersActive&(1 << FP_SPEED) || pm->ps->forcePowersActive&(1 << FP_RAGE))) {//player always fires at normal speed addTime *= g_timescale->value; } - else if ( g_entities[pm->ps->clientNum].client - && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<ps->clientNum].client + && (pm->ps->forcePowersActive&(1 << FP_SPEED) || pm->ps->forcePowersActive&(1 << FP_RAGE))) { addTime *= g_timescale->value; } @@ -12862,65 +12883,65 @@ void PM_WeaponLightsaber(void) } //If the phaser has been fired, delay the next recharge time - if ( !PM_ControlledByPlayer() ) + if (!PM_ControlledByPlayer()) { - if( pm->gent && pm->gent->NPC != NULL ) + if (pm->gent && pm->gent->NPC != NULL) {//NPCs have their own refire logic //FIXME: this really should be universal... return; } } - if ( !PM_InCartwheel( pm->ps->torsoAnim ) ) + if (!PM_InCartwheel(pm->ps->torsoAnim)) {//can still attack during a cartwheel/arial pm->ps->weaponTime = addTime; } } //--------------------------------------- -static bool PM_DoChargedWeapons( void ) +static bool PM_DoChargedWeapons(void) //--------------------------------------- { qboolean charging = qfalse, - altFire = qfalse; + altFire = qfalse; //FIXME: make jedi aware they're being aimed at with a charged-up weapon (strafe and be evasive?) // If you want your weapon to be a charging weapon, just set this bit up - switch( pm->ps->weapon ) + switch (pm->ps->weapon) { - //------------------ + //------------------ case WP_BRYAR_PISTOL: case WP_BLASTER_PISTOL: // alt-fire charges the weapon - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) + if (pm->cmd.buttons & BUTTON_ALT_ATTACK) { charging = qtrue; altFire = qtrue; } break; - //------------------ + //------------------ case WP_DISRUPTOR: // alt-fire charges the weapon...but due to zooming being controlled by the alt-button, the main button actually charges...but only when zoomed. // lovely, eh? - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer())) { - if ( cg.zoomMode == 2 ) + if (cg.zoomMode == 2) { - if ( pm->cmd.buttons & BUTTON_ATTACK ) + if (pm->cmd.buttons & BUTTON_ATTACK) { charging = qtrue; altFire = qtrue; // believe it or not, it really is an alt-fire in this case! } } } - else if ( pm->gent && pm->gent->NPC ) + else if (pm->gent && pm->gent->NPC) { - if ( (pm->gent->NPC->scriptFlags&SCF_ALT_FIRE) ) + if ((pm->gent->NPC->scriptFlags&SCF_ALT_FIRE)) { - if ( pm->gent->fly_sound_debounce_time > level.time ) + if (pm->gent->fly_sound_debounce_time > level.time) { charging = qtrue; altFire = qtrue; @@ -12928,51 +12949,51 @@ static bool PM_DoChargedWeapons( void ) } } break; - - //------------------ + + //------------------ case WP_BOWCASTER: // main-fire charges the weapon - if ( pm->cmd.buttons & BUTTON_ATTACK ) + if (pm->cmd.buttons & BUTTON_ATTACK) { charging = qtrue; } break; - - //------------------ + + //------------------ case WP_DEMP2: // alt-fire charges the weapon - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) + if (pm->cmd.buttons & BUTTON_ALT_ATTACK) { charging = qtrue; altFire = qtrue; } break; - //------------------ + //------------------ case WP_ROCKET_LAUNCHER: // Not really a charge weapon, but we still want to delay fire until the button comes up so that we can // implement our alt-fire locking stuff - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) + if (pm->cmd.buttons & BUTTON_ALT_ATTACK) { charging = qtrue; altFire = qtrue; } break; - //------------------ + //------------------ case WP_THERMAL: - // FIXME: Really should have a wind-up anim for player + // FIXME: Really should have a wind-up anim for player // as he holds down the fire button to throw, then play // the actual throw when he lets go... - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) + if (pm->cmd.buttons & BUTTON_ALT_ATTACK) { altFire = qtrue; // override default of not being an alt-fire charging = qtrue; } - else if ( pm->cmd.buttons & BUTTON_ATTACK ) + else if (pm->cmd.buttons & BUTTON_ATTACK) { charging = qtrue; } @@ -12980,19 +13001,19 @@ static bool PM_DoChargedWeapons( void ) } // end switch - // set up the appropriate weapon state based on the button that's down. + // set up the appropriate weapon state based on the button that's down. // Note that we ALWAYS return if charging is set ( meaning the buttons are still down ) - if ( charging ) + if (charging) { - if ( altFire ) + if (altFire) { - if ( pm->ps->weaponstate != WEAPON_CHARGING_ALT && pm->ps->weaponstate != WEAPON_DROPPING ) + if (pm->ps->weaponstate != WEAPON_CHARGING_ALT && pm->ps->weaponstate != WEAPON_DROPPING) { - if ( pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] <= 0) + if (pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] <= 0) { - PM_AddEvent( EV_NOAMMO ); + PM_AddEvent(EV_NOAMMO); pm->ps->weaponTime += 500; return true; } @@ -13001,20 +13022,20 @@ static bool PM_DoChargedWeapons( void ) pm->ps->weaponstate = WEAPON_CHARGING_ALT; pm->ps->weaponChargeTime = level.time; - if ( cg_weapons[pm->ps->weapon].altChargeSound ) + if (cg_weapons[pm->ps->weapon].altChargeSound) { - G_SoundOnEnt( pm->gent, CHAN_WEAPON, weaponData[pm->ps->weapon].altChargeSnd ); + G_SoundOnEnt(pm->gent, CHAN_WEAPON, weaponData[pm->ps->weapon].altChargeSnd); } } } else { - if ( pm->ps->weaponstate != WEAPON_CHARGING && pm->ps->weaponstate != WEAPON_DROPPING ) + if (pm->ps->weaponstate != WEAPON_CHARGING && pm->ps->weaponstate != WEAPON_DROPPING) { - if ( pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] <= 0) + if (pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] <= 0) { - PM_AddEvent( EV_NOAMMO ); + PM_AddEvent(EV_NOAMMO); pm->ps->weaponTime += 500; return true; } @@ -13023,9 +13044,9 @@ static bool PM_DoChargedWeapons( void ) pm->ps->weaponstate = WEAPON_CHARGING; pm->ps->weaponChargeTime = level.time; - if ( cg_weapons[pm->ps->weapon].chargeSound && pm->gent && !pm->gent->NPC ) // HACK: !NPC mostly for bowcaster and weequay + if (cg_weapons[pm->ps->weapon].chargeSound && pm->gent && !pm->gent->NPC) // HACK: !NPC mostly for bowcaster and weequay { - G_SoundOnEnt( pm->gent, CHAN_WEAPON, weaponData[pm->ps->weapon].chargeSnd ); + G_SoundOnEnt(pm->gent, CHAN_WEAPON, weaponData[pm->ps->weapon].chargeSnd); } } } @@ -13035,19 +13056,19 @@ static bool PM_DoChargedWeapons( void ) // Only charging weapons should be able to set these states...so.... // let's see which fire mode we need to set up now that the buttons are up - if ( pm->ps->weaponstate == WEAPON_CHARGING ) + if (pm->ps->weaponstate == WEAPON_CHARGING) { // weapon has a charge, so let us do an attack // dumb, but since we shoot a charged weapon on button-up, we need to repress this button for now pm->cmd.buttons |= BUTTON_ATTACK; pm->ps->eFlags |= EF_FIRING; } - else if ( pm->ps->weaponstate == WEAPON_CHARGING_ALT ) + else if (pm->ps->weaponstate == WEAPON_CHARGING_ALT) { // weapon has a charge, so let us do an alt-attack // dumb, but since we shoot a charged weapon on button-up, we need to repress this button for now pm->cmd.buttons |= BUTTON_ALT_ATTACK; - pm->ps->eFlags |= (EF_FIRING|EF_ALT_FIRING); + pm->ps->eFlags |= (EF_FIRING | EF_ALT_FIRING); } return false; // continue with the rest of the weapon code @@ -13062,178 +13083,178 @@ static bool PM_DoChargedWeapons( void ) // Specific weapons can opt to modify the ammo usage based on charges, otherwise if no special case code // is handled below, regular ammo usage will happen //--------------------------------------- -static int PM_DoChargingAmmoUsage( int *amount ) +static int PM_DoChargingAmmoUsage(int *amount) //--------------------------------------- { int count = 0; - if ( pm->ps->weapon == WP_BOWCASTER && !( pm->cmd.buttons & BUTTON_ALT_ATTACK )) + if (pm->ps->weapon == WP_BOWCASTER && !(pm->cmd.buttons & BUTTON_ALT_ATTACK)) { // this code is duplicated ( I know, I know ) in G_weapon.cpp for the bowcaster alt-fire - count = ( level.time - pm->ps->weaponChargeTime ) / BOWCASTER_CHARGE_UNIT; + count = (level.time - pm->ps->weaponChargeTime) / BOWCASTER_CHARGE_UNIT; - if ( count < 1 ) + if (count < 1) { count = 1; } - else if ( count > 5 ) + else if (count > 5) { count = 5; } - if ( !(count & 1 )) + if (!(count & 1)) { // if we aren't odd, knock us down a level count--; } // Only bother with these checks if we don't have infinite ammo - if ( pm->ps->ammo[ weaponData[pm->ps->weapon].ammoIndex ] != -1 ) + if (pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] != -1) { int dif = pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] - *amount * count; // If we have enough ammo to do the full charged shot, we are ok - if ( dif < 0 ) + if (dif < 0) { // we are not ok, so hack our chargetime and ammo usage, note that DIF is going to be negative count += floor(dif / (float)*amount); - if ( count < 1 ) + if (count < 1) { count = 1; } // now get a real chargeTime so the duplicated code in g_weapon doesn't get freaked - pm->ps->weaponChargeTime = level.time - ( count * BOWCASTER_CHARGE_UNIT ); + pm->ps->weaponChargeTime = level.time - (count * BOWCASTER_CHARGE_UNIT); } - } + } // now that count is cool, get the real ammo usage *amount *= count; } - else if( ( pm->ps->weapon == WP_BRYAR_PISTOL && pm->cmd.buttons & BUTTON_ALT_ATTACK ) - || ( pm->ps->weapon == WP_BLASTER_PISTOL && pm->cmd.buttons & BUTTON_ALT_ATTACK ) ) + else if ((pm->ps->weapon == WP_BRYAR_PISTOL && pm->cmd.buttons & BUTTON_ALT_ATTACK) + || (pm->ps->weapon == WP_BLASTER_PISTOL && pm->cmd.buttons & BUTTON_ALT_ATTACK)) { // this code is duplicated ( I know, I know ) in G_weapon.cpp for the bryar alt-fire - count = ( level.time - pm->ps->weaponChargeTime ) / BRYAR_CHARGE_UNIT; + count = (level.time - pm->ps->weaponChargeTime) / BRYAR_CHARGE_UNIT; - if ( count < 1 ) + if (count < 1) { count = 1; } - else if ( count > 5 ) + else if (count > 5) { count = 5; } // Only bother with these checks if we don't have infinite ammo - if ( pm->ps->ammo[ weaponData[pm->ps->weapon].ammoIndex ] != -1 ) + if (pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] != -1) { int dif = pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] - *amount * count; // If we have enough ammo to do the full charged shot, we are ok - if ( dif < 0 ) + if (dif < 0) { // we are not ok, so hack our chargetime and ammo usage, note that DIF is going to be negative count += floor(dif / (float)*amount); - if ( count < 1 ) + if (count < 1) { count = 1; } // now get a real chargeTime so the duplicated code in g_weapon doesn't get freaked - pm->ps->weaponChargeTime = level.time - ( count * BRYAR_CHARGE_UNIT ); + pm->ps->weaponChargeTime = level.time - (count * BRYAR_CHARGE_UNIT); } - } + } // now that count is cool, get the real ammo usage *amount *= count; } - else if ( pm->ps->weapon == WP_DEMP2 && pm->cmd.buttons & BUTTON_ALT_ATTACK ) + else if (pm->ps->weapon == WP_DEMP2 && pm->cmd.buttons & BUTTON_ALT_ATTACK) { // this code is duplicated ( I know, I know ) in G_weapon.cpp for the demp2 alt-fire - count = ( level.time - pm->ps->weaponChargeTime ) / DEMP2_CHARGE_UNIT; + count = (level.time - pm->ps->weaponChargeTime) / DEMP2_CHARGE_UNIT; - if ( count < 1 ) + if (count < 1) { count = 1; } - else if ( count > 3 ) + else if (count > 3) { count = 3; } // Only bother with these checks if we don't have infinite ammo - if ( pm->ps->ammo[ weaponData[pm->ps->weapon].ammoIndex ] != -1 ) + if (pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] != -1) { int dif = pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] - *amount * count; // If we have enough ammo to do the full charged shot, we are ok - if ( dif < 0 ) + if (dif < 0) { // we are not ok, so hack our chargetime and ammo usage, note that DIF is going to be negative count += floor(dif / (float)*amount); - if ( count < 1 ) + if (count < 1) { count = 1; } // now get a real chargeTime so the duplicated code in g_weapon doesn't get freaked - pm->ps->weaponChargeTime = level.time - ( count * DEMP2_CHARGE_UNIT ); + pm->ps->weaponChargeTime = level.time - (count * DEMP2_CHARGE_UNIT); } - } + } // now that count is cool, get the real ammo usage *amount *= count; // this is an after-thought. should probably re-write the function to do this naturally. - if ( *amount > pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] ) + if (*amount > pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex]) { *amount = pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex]; } } - else if ( pm->ps->weapon == WP_DISRUPTOR && pm->cmd.buttons & BUTTON_ALT_ATTACK ) // BUTTON_ATTACK will have been mapped to BUTTON_ALT_ATTACK if we are zoomed + else if (pm->ps->weapon == WP_DISRUPTOR && pm->cmd.buttons & BUTTON_ALT_ATTACK) // BUTTON_ATTACK will have been mapped to BUTTON_ALT_ATTACK if we are zoomed { // this code is duplicated ( I know, I know ) in G_weapon.cpp for the disruptor alt-fire - count = ( level.time - pm->ps->weaponChargeTime ) / DISRUPTOR_CHARGE_UNIT; + count = (level.time - pm->ps->weaponChargeTime) / DISRUPTOR_CHARGE_UNIT; - if ( count < 1 ) + if (count < 1) { count = 1; } - else if ( count > 10 ) + else if (count > 10) { count = 10; } // Only bother with these checks if we don't have infinite ammo - if ( pm->ps->ammo[ weaponData[pm->ps->weapon].ammoIndex ] != -1 ) + if (pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] != -1) { int dif = pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] - *amount * count; // If we have enough ammo to do the full charged shot, we are ok - if ( dif < 0 ) + if (dif < 0) { // we are not ok, so hack our chargetime and ammo usage, note that DIF is going to be negative count += floor(dif / (float)*amount); - if ( count < 1 ) + if (count < 1) { count = 1; } // now get a real chargeTime so the duplicated code in g_weapon doesn't get freaked - pm->ps->weaponChargeTime = level.time - ( count * DISRUPTOR_CHARGE_UNIT ); + pm->ps->weaponChargeTime = level.time - (count * DISRUPTOR_CHARGE_UNIT); } - } + } // now that count is cool, get the real ammo usage *amount *= count; // this is an after-thought. should probably re-write the function to do this naturally. - if ( *amount > pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] ) + if (*amount > pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex]) { *amount = pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex]; } @@ -13242,25 +13263,25 @@ static int PM_DoChargingAmmoUsage( int *amount ) return count; } -qboolean PM_DroidMelee( int npc_class ) +qboolean PM_DroidMelee(int npc_class) { - if ( npc_class == CLASS_PROBE - || npc_class == CLASS_SEEKER - || npc_class == CLASS_INTERROGATOR - || npc_class == CLASS_SENTRY - || npc_class == CLASS_REMOTE ) + if (npc_class == CLASS_PROBE + || npc_class == CLASS_SEEKER + || npc_class == CLASS_INTERROGATOR + || npc_class == CLASS_SENTRY + || npc_class == CLASS_REMOTE) { return qtrue; } return qfalse; } -void PM_WeaponWampa( void ) +void PM_WeaponWampa(void) { // make weapon function - if ( pm->ps->weaponTime > 0 ) { + if (pm->ps->weaponTime > 0) { pm->ps->weaponTime -= pml.msec; - if ( pm->ps->weaponTime <= 0 ) + if (pm->ps->weaponTime <= 0) { pm->ps->weaponTime = 0; } @@ -13268,38 +13289,38 @@ void PM_WeaponWampa( void ) // check for weapon change // can't change if weapon is firing, but can change again if lowering or raising - if ( pm->ps->weaponTime <= 0 || pm->ps->weaponstate != WEAPON_FIRING ) { - if ( pm->ps->weapon != pm->cmd.weapon ) { - PM_BeginWeaponChange( pm->cmd.weapon ); + if (pm->ps->weaponTime <= 0 || pm->ps->weaponstate != WEAPON_FIRING) { + if (pm->ps->weapon != pm->cmd.weapon) { + PM_BeginWeaponChange(pm->cmd.weapon); } } - if ( pm->ps->weaponTime > 0 ) + if (pm->ps->weaponTime > 0) { return; } // change weapon if time - if ( pm->ps->weaponstate == WEAPON_DROPPING ) { + if (pm->ps->weaponstate == WEAPON_DROPPING) { PM_FinishWeaponChange(); return; } - if ( pm->ps->weapon == WP_SABER - && (pm->cmd.buttons&BUTTON_ATTACK) - && pm->ps->torsoAnim == BOTH_HANG_IDLE ) + if (pm->ps->weapon == WP_SABER + && (pm->cmd.buttons&BUTTON_ATTACK) + && pm->ps->torsoAnim == BOTH_HANG_IDLE) { pm->ps->SaberActivate(); - pm->ps->SaberActivateTrail( 150 ); - PM_SetAnim( pm, SETANIM_BOTH, BOTH_HANG_ATTACK, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + pm->ps->SaberActivateTrail(150); + PM_SetAnim(pm, SETANIM_BOTH, BOTH_HANG_ATTACK, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); pm->ps->weaponstate = WEAPON_FIRING; pm->ps->saberBlocked = BLOCKED_NONE; pm->ps->saberMove = LS_READY; pm->ps->saberMoveNext = LS_NONE; } - else if ( pm->ps->torsoAnim == BOTH_HANG_IDLE ) + else if (pm->ps->torsoAnim == BOTH_HANG_IDLE) { - pm->ps->SaberDeactivateTrail( 0 ); + pm->ps->SaberDeactivateTrail(0); pm->ps->weaponstate = WEAPON_READY; pm->ps->saberMove = LS_READY; pm->ps->saberMoveNext = LS_NONE; @@ -13312,48 +13333,48 @@ PM_Weapon Generates weapon events and modifes the weapon counter ============== */ -static void PM_Weapon( void ) +static void PM_Weapon(void) { int addTime, amount, trueCount = 1; int punch = 0; qboolean delayed_fire = qfalse; - if ( (pm->ps->eFlags&EF_HELD_BY_WAMPA) ) + if ((pm->ps->eFlags&EF_HELD_BY_WAMPA)) { PM_WeaponWampa(); return; } - if ( pm->ps->eFlags&EF_FORCE_DRAINED ) + if (pm->ps->eFlags&EF_FORCE_DRAINED) {//being drained return; } - if ( (pm->ps->forcePowersActive&(1<ps->forceDrainEntityNum < ENTITYNUM_WORLD ) + if ((pm->ps->forcePowersActive&(1 << FP_DRAIN)) + && pm->ps->forceDrainEntityNum < ENTITYNUM_WORLD) {//draining return; } - if (pm->ps->weapon == WP_SABER && (cg.zoomMode==3||!cg.zoomMode||pm->ps->clientNum) ) // WP_LIGHTSABER + if (pm->ps->weapon == WP_SABER && (cg.zoomMode == 3 || !cg.zoomMode || pm->ps->clientNum)) // WP_LIGHTSABER { // Separate logic for lightsaber, but not for player when zoomed PM_WeaponLightsaber(); - if ( pm->gent && pm->gent->client && pm->ps->saber[0].Active() && pm->ps->saberInFlight ) + if (pm->gent && pm->gent->client && pm->ps->saber[0].Active() && pm->ps->saberInFlight) {//FIXME: put saberTrail in playerState - if ( pm->gent->client->ps.saberEntityState == SES_RETURNING ) + if (pm->gent->client->ps.saberEntityState == SES_RETURNING) {//turn off the saber trail - pm->gent->client->ps.SaberDeactivateTrail( 75 ); + pm->gent->client->ps.SaberDeactivateTrail(75); } else {//turn on the saber trail - pm->gent->client->ps.SaberActivateTrail( 150 ); + pm->gent->client->ps.SaberActivateTrail(150); } } return; } - if ( PM_InKnockDown( pm->ps ) || PM_InRoll( pm->ps )) + if (PM_InKnockDown(pm->ps) || PM_InRoll(pm->ps)) {//in knockdown - if ( pm->ps->weaponTime > 0 ) { + if (pm->ps->weaponTime > 0) { pm->ps->weaponTime -= pml.msec; - if ( pm->ps->weaponTime <= 0 ) + if (pm->ps->weaponTime <= 0) { pm->ps->weaponTime = 0; } @@ -13361,56 +13382,56 @@ static void PM_Weapon( void ) return; } - if( pm->gent && pm->gent->client ) + if (pm->gent && pm->gent->client) { - if ( pm->gent->client->fireDelay > 0 ) + if (pm->gent->client->fireDelay > 0) {//FIXME: this is going to fire off one frame before you expect, actually pm->gent->client->fireDelay -= pml.msec; - if(pm->gent->client->fireDelay <= 0) + if (pm->gent->client->fireDelay <= 0) {//just finished delay timer - if ( pm->ps->clientNum && pm->ps->weapon == WP_ROCKET_LAUNCHER ) + if (pm->ps->clientNum && pm->ps->weapon == WP_ROCKET_LAUNCHER) { - G_SoundOnEnt( pm->gent, CHAN_WEAPON, "sound/weapons/rocket/lock.wav" ); + G_SoundOnEnt(pm->gent, CHAN_WEAPON, "sound/weapons/rocket/lock.wav"); pm->cmd.buttons |= BUTTON_ALT_ATTACK; } pm->gent->client->fireDelay = 0; delayed_fire = qtrue; - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && pm->ps->weapon == WP_THERMAL - && pm->gent->alt_fire ) + && pm->gent->alt_fire) { pm->cmd.buttons |= BUTTON_ALT_ATTACK; } } else { - if ( pm->ps->clientNum && pm->ps->weapon == WP_ROCKET_LAUNCHER && Q_irand( 0, 1 ) ) + if (pm->ps->clientNum && pm->ps->weapon == WP_ROCKET_LAUNCHER && Q_irand(0, 1)) { - G_SoundOnEnt( pm->gent, CHAN_WEAPON, "sound/weapons/rocket/tick.wav" ); + G_SoundOnEnt(pm->gent, CHAN_WEAPON, "sound/weapons/rocket/tick.wav"); } } } } - // don't allow attack until all buttons are up - if ( pm->ps->pm_flags & PMF_RESPAWNED ) { + // don't allow attack until all buttons are up + if (pm->ps->pm_flags & PMF_RESPAWNED) { return; } // check for dead player - if ( pm->ps->stats[STAT_HEALTH] <= 0 ) + if (pm->ps->stats[STAT_HEALTH] <= 0) { - if ( pm->gent && pm->gent->client ) + if (pm->gent && pm->gent->client) { // borg no longer exist, use NPC_class to check for any npc's that don't drop their weapons (if there are any) // Sigh..borg shouldn't drop their weapon attachments when they die. Also, never drop a lightsaber! - // if ( pm->gent->client->playerTeam != TEAM_BORG) + // if ( pm->gent->client->playerTeam != TEAM_BORG) { pm->ps->weapon = WP_NONE; } } - if ( pm->gent ) + if (pm->gent) { pm->gent->s.loopSound = 0; } @@ -13418,9 +13439,9 @@ static void PM_Weapon( void ) } // make weapon function - if ( pm->ps->weaponTime > 0 ) { + if (pm->ps->weaponTime > 0) { pm->ps->weaponTime -= pml.msec; - if ( pm->ps->weaponTime <= 0 ) + if (pm->ps->weaponTime <= 0) { pm->ps->weaponTime = 0; } @@ -13428,102 +13449,102 @@ static void PM_Weapon( void ) // check for weapon change // can't change if weapon is firing, but can change again if lowering or raising - if ( (pm->ps->weaponTime <= 0 || pm->ps->weaponstate != WEAPON_FIRING) && pm->ps->weaponstate != WEAPON_CHARGING_ALT && pm->ps->weaponstate != WEAPON_CHARGING) { - if ( pm->ps->weapon != pm->cmd.weapon && (!pm->ps->viewEntity || pm->ps->viewEntity >= ENTITYNUM_WORLD) && !PM_DoChargedWeapons()) { - PM_BeginWeaponChange( pm->cmd.weapon ); + if ((pm->ps->weaponTime <= 0 || pm->ps->weaponstate != WEAPON_FIRING) && pm->ps->weaponstate != WEAPON_CHARGING_ALT && pm->ps->weaponstate != WEAPON_CHARGING) { + if (pm->ps->weapon != pm->cmd.weapon && (!pm->ps->viewEntity || pm->ps->viewEntity >= ENTITYNUM_WORLD) && !PM_DoChargedWeapons()) { + PM_BeginWeaponChange(pm->cmd.weapon); } } - if ( pm->ps->weaponTime > 0 ) + if (pm->ps->weaponTime > 0) { return; } // change weapon if time - if ( pm->ps->weaponstate == WEAPON_DROPPING ) { + if (pm->ps->weaponstate == WEAPON_DROPPING) { PM_FinishWeaponChange(); return; } - if ( pm->ps->weapon == WP_NONE ) + if (pm->ps->weapon == WP_NONE) { return; } - if ( pm->ps->weaponstate == WEAPON_RAISING ) + if (pm->ps->weaponstate == WEAPON_RAISING) { //Just selected the weapon pm->ps->weaponstate = WEAPON_IDLE; - if(pm->gent && (pm->gent->s.numbergent))) + if (pm->gent && (pm->gent->s.numbergent))) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL); } else { - switch(pm->ps->weapon) + switch (pm->ps->weapon) { case WP_BRYAR_PISTOL: case WP_BLASTER_PISTOL: - if ( pm->gent - && pm->gent->weaponModel[1] > 0 ) + if (pm->gent + && pm->gent->weaponModel[1] > 0) {//dual pistols //FIXME: should be a better way of detecting a dual-pistols user so it's not hardcoded to the saboteurcommando... - PM_SetAnim(pm,SETANIM_TORSO,BOTH_STAND1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_STAND1, SETANIM_FLAG_NORMAL); } else {//single pistol - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE2,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONIDLE2, SETANIM_FLAG_NORMAL); } break; default: - PM_SetAnim(pm,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_TORSO, TORSO_WEAPONIDLE3, SETANIM_FLAG_NORMAL); break; } } return; } - if ( pm->gent ) + if (pm->gent) {//ready to throw thermal again, add it - if ( pm->ps->weapon == WP_THERMAL - && pm->gent->weaponModel[0] == -1 ) + if (pm->ps->weapon == WP_THERMAL + && pm->gent->weaponModel[0] == -1) {//add the thermal model back in our hand // remove anything if we have anything already - G_RemoveWeaponModels( pm->gent ); + G_RemoveWeaponModels(pm->gent); if (weaponData[pm->ps->weapon].weaponMdl[0]) { //might be NONE, so check if it has a model - G_CreateG2AttachedWeaponModel( pm->gent, weaponData[pm->ps->weapon].weaponMdl, pm->gent->handRBolt, 0 ); + G_CreateG2AttachedWeaponModel(pm->gent, weaponData[pm->ps->weapon].weaponMdl, pm->gent->handRBolt, 0); //make it sound like we took another one out from... uh.. somewhere... - if ( cg.time > 0 ) + if (cg.time > 0) {//this way we don't get that annoying change weapon sound every time a map starts - PM_AddEvent( EV_CHANGE_WEAPON ); + PM_AddEvent(EV_CHANGE_WEAPON); } } } } - if ( !delayed_fire ) + if (!delayed_fire) {//didn't just finish a fire delay - if ( PM_DoChargedWeapons()) + if (PM_DoChargedWeapons()) { // In some cases the charged weapon code may want us to short circuit the rest of the firing code return; } else { - if ( !pm->gent->client->fireDelay//not already waiting to fire - && (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer())//player + if (!pm->gent->client->fireDelay//not already waiting to fire + && (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer())//player && pm->ps->weapon == WP_THERMAL//holding thermal && pm->gent//gent && pm->gent->client//client - && (pm->cmd.buttons&(BUTTON_ATTACK|BUTTON_ALT_ATTACK)) )//holding fire + && (pm->cmd.buttons&(BUTTON_ATTACK | BUTTON_ALT_ATTACK)))//holding fire {//delay the actual firing of the missile until the anim has played some - if ( PM_StandingAnim( pm->ps->legsAnim ) - || pm->ps->legsAnim == BOTH_THERMAL_READY ) + if (PM_StandingAnim(pm->ps->legsAnim) + || pm->ps->legsAnim == BOTH_THERMAL_READY) { - PM_SetAnim( pm, SETANIM_LEGS, BOTH_THERMAL_THROW, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_THERMAL_THROW, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } - PM_SetAnim(pm,SETANIM_TORSO,BOTH_THERMAL_THROW,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_THERMAL_THROW, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); pm->gent->client->fireDelay = 300; pm->ps->weaponstate = WEAPON_FIRING; pm->gent->alt_fire = (qboolean)(pm->cmd.buttons&BUTTON_ALT_ATTACK); @@ -13532,18 +13553,18 @@ static void PM_Weapon( void ) } } - if(!delayed_fire) + if (!delayed_fire) { - if ( pm->ps->weapon == WP_MELEE && (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + if (pm->ps->weapon == WP_MELEE && (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer())) {//melee - if ( (pm->cmd.buttons&(BUTTON_ATTACK|BUTTON_ALT_ATTACK)) != (BUTTON_ATTACK|BUTTON_ALT_ATTACK) ) + if ((pm->cmd.buttons&(BUTTON_ATTACK | BUTTON_ALT_ATTACK)) != (BUTTON_ATTACK | BUTTON_ALT_ATTACK)) {//not holding both buttons - if ( (pm->cmd.buttons&BUTTON_ATTACK)&&(pm->ps->pm_flags&PMF_ATTACK_HELD) ) + if ((pm->cmd.buttons&BUTTON_ATTACK) && (pm->ps->pm_flags&PMF_ATTACK_HELD)) {//held button //clear it pm->cmd.buttons &= ~BUTTON_ATTACK; } - if ( (pm->cmd.buttons&BUTTON_ALT_ATTACK)&&(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD) ) + if ((pm->cmd.buttons&BUTTON_ALT_ATTACK) && (pm->ps->pm_flags&PMF_ALT_ATTACK_HELD)) {//held button //clear it pm->cmd.buttons &= ~BUTTON_ALT_ATTACK; @@ -13551,112 +13572,114 @@ static void PM_Weapon( void ) } } // check for fire - if ( !(pm->cmd.buttons & (BUTTON_ATTACK|BUTTON_ALT_ATTACK)) ) + if (!(pm->cmd.buttons & (BUTTON_ATTACK | BUTTON_ALT_ATTACK))) { pm->ps->weaponTime = 0; - - if ( pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0 ) + + if (pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0) {//Still firing pm->ps->weaponstate = WEAPON_FIRING; } - else if ( pm->ps->weaponstate != WEAPON_READY ) + else if (pm->ps->weaponstate != WEAPON_READY) { - if ( !pm->gent || !pm->gent->NPC || pm->gent->attackDebounceTime < level.time ) + if (!pm->gent || !pm->gent->NPC || pm->gent->attackDebounceTime < level.time) { pm->ps->weaponstate = WEAPON_IDLE; } } - - if ( pm->ps->weapon == WP_MELEE - && (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) - && PM_KickMove( pm->ps->saberMove ) ) + + if (pm->ps->weapon == WP_MELEE + && (pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + && PM_KickMove(pm->ps->saberMove)) {//melee, not attacking, clear move pm->ps->saberMove = LS_NONE; } return; } - if (pm->gent->s.m_iVehicleNum!=0) + if (pm->gent->s.m_iVehicleNum != 0) { // No Anims if on Veh } // start the animation even if out of ammo - else if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ROCKETTROOPER ) + else if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ROCKETTROOPER) { - if ( pm->gent->client->moveType == MT_FLYSWIM ) + if (pm->gent->client->moveType == MT_FLYSWIM) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK2, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); } else { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); } } - else if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_HAZARD_TROOPER ) +#ifndef BASE_SAVE_COMPAT + else if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_HAZARD_TROOPER) { // Kneel attack //-------------- - if( pm->cmd.upmove == -127 ) + if (pm->cmd.upmove == -127) { - PM_SetAnim(pm,SETANIM_TORSO, BOTH_KNEELATTACK, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_KNEELATTACK, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); } else { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); } // Standing attack //----------------- } - else if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ASSASSIN_DROID ) +#endif + else if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_ASSASSIN_DROID) { // Crouched Attack - if (PM_CrouchAnim(pm->gent->client->ps.legsAnim)) + if (PM_CrouchAnim(pm->gent->client->ps.legsAnim)) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLDLESS); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK2, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLDLESS); } // Standing Attack //----------------- else { - // if (PM_StandingAnim(pm->gent->client->ps.legsAnim)) - // { - // PM_SetAnim(pm,SETANIM_BOTH,BOTH_ATTACK3,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLDLESS); - // } - // else + // if (PM_StandingAnim(pm->gent->client->ps.legsAnim)) + // { + // PM_SetAnim(pm,SETANIM_BOTH,BOTH_ATTACK3,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLDLESS); + // } + // else { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK3,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLDLESS); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK3, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLDLESS); } } } else { - switch(pm->ps->weapon) + switch (pm->ps->weapon) { /* - case WP_SABER://1 - handed + case WP_SABER://1 - handed PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); break; - */ + */ case WP_BRYAR_PISTOL://1-handed case WP_BLASTER_PISTOL://1-handed - if ( pm->gent && pm->gent->weaponModel[1] > 0 ) + if (pm->gent && pm->gent->weaponModel[1] > 0) {//dual pistols - PM_SetAnim(pm,SETANIM_TORSO,BOTH_GUNSIT1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_GUNSIT1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); } else {//single pistol - PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK2, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); } break; - + case WP_MELEE: // since there's no RACE_BOTS, I listed all the droids that have might have melee attacks - dmv - if ( pm->gent && pm->gent->client ) + if (pm->gent && pm->gent->client) { - if ( PM_DroidMelee( pm->gent->client->NPC_class ) ) + if (PM_DroidMelee(pm->gent->client->NPC_class)) { if (punch == 0) { @@ -13668,43 +13691,43 @@ static void PM_Weapon( void ) PM_SetAnim(pm, SETANIM_BOTH, BOTH_MELEE2, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); punch = 0; } - + } else { int anim = -1; - if ( (pm->ps->clientNum < MAX_CLIENTS ||PM_ControlledByPlayer()) - && g_debugMelee->integer ) + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) + && g_debugMelee->integer) { - if ( (pm->cmd.buttons&BUTTON_ALT_ATTACK) ) + if ((pm->cmd.buttons&BUTTON_ALT_ATTACK)) { - if ( (pm->cmd.buttons&BUTTON_ATTACK) ) + if ((pm->cmd.buttons&BUTTON_ATTACK)) { PM_TryGrab(); } - else if ( !(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD) ) + else if (!(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD)) { PM_CheckKick(); } } - else if ( !(pm->ps->pm_flags&PMF_ATTACK_HELD) ) + else if (!(pm->ps->pm_flags&PMF_ATTACK_HELD)) { - anim = PM_PickAnim( pm->gent, BOTH_MELEE1, BOTH_MELEE2 ); + anim = PM_PickAnim(pm->gent, BOTH_MELEE1, BOTH_MELEE2); } } else { - anim = PM_PickAnim( pm->gent, BOTH_MELEE1, BOTH_MELEE2 ); + anim = PM_PickAnim(pm->gent, BOTH_MELEE1, BOTH_MELEE2); } - if ( anim != -1 ) + if (anim != -1) { - if ( VectorCompare( pm->ps->velocity, vec3_origin ) && pm->cmd.upmove >= 0 ) + if (VectorCompare(pm->ps->velocity, vec3_origin) && pm->cmd.upmove >= 0) { - PM_SetAnim( pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART ); + PM_SetAnim(pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_RESTART); } else { - PM_SetAnim( pm, SETANIM_TORSO, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART ); + PM_SetAnim(pm, SETANIM_TORSO, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_RESTART); } } } @@ -13712,36 +13735,36 @@ static void PM_Weapon( void ) break; case WP_TUSKEN_RIFLE: - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) + if (pm->cmd.buttons & BUTTON_ALT_ATTACK) {//shoot //in alt-fire, sniper mode - PM_SetAnim( pm, SETANIM_TORSO, BOTH_ATTACK4, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK4, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } else {//melee - int anim = PM_PickAnim( pm->gent, BOTH_TUSKENATTACK1, BOTH_TUSKENATTACK3 ); // Rifle - if ( VectorCompare( pm->ps->velocity, vec3_origin ) && pm->cmd.upmove >= 0 ) + int anim = PM_PickAnim(pm->gent, BOTH_TUSKENATTACK1, BOTH_TUSKENATTACK3); // Rifle + if (VectorCompare(pm->ps->velocity, vec3_origin) && pm->cmd.upmove >= 0) { - PM_SetAnim( pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART ); + PM_SetAnim(pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_RESTART); } else { - PM_SetAnim( pm, SETANIM_TORSO, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART ); + PM_SetAnim(pm, SETANIM_TORSO, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_RESTART); } } break; case WP_TUSKEN_STAFF: - if ( pm->gent && pm->gent->client ) + if (pm->gent && pm->gent->client) { int anim; - int flags = (SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART); - if ( (pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) ) + int flags = (SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_RESTART); + if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer())) {//player - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) + if (pm->cmd.buttons & BUTTON_ALT_ATTACK) { - if ( pm->cmd.buttons & BUTTON_ATTACK ) + if (pm->cmd.buttons & BUTTON_ATTACK) { anim = BOTH_TUSKENATTACK3; } @@ -13757,7 +13780,7 @@ static void PM_Weapon( void ) } else {// npc - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) + if (pm->cmd.buttons & BUTTON_ALT_ATTACK) { anim = BOTH_TUSKENLUNGE1; if (pm->ps->torsoAnimTimer>0) @@ -13767,87 +13790,87 @@ static void PM_Weapon( void ) } else { - anim = PM_PickAnim( pm->gent, BOTH_TUSKENATTACK1, BOTH_TUSKENATTACK3 ); + anim = PM_PickAnim(pm->gent, BOTH_TUSKENATTACK1, BOTH_TUSKENATTACK3); } } - if ( VectorCompare( pm->ps->velocity, vec3_origin ) && pm->cmd.upmove >= 0 ) + if (VectorCompare(pm->ps->velocity, vec3_origin) && pm->cmd.upmove >= 0) { - PM_SetAnim( pm, SETANIM_BOTH, anim, flags, 0); + PM_SetAnim(pm, SETANIM_BOTH, anim, flags, 0); } else { - PM_SetAnim( pm, SETANIM_TORSO, anim, flags, 0); + PM_SetAnim(pm, SETANIM_TORSO, anim, flags, 0); } } break; case WP_NOGHRI_STICK: - if ( pm->gent && pm->gent->client ) + if (pm->gent && pm->gent->client) { int anim; - if ( pm->cmd.buttons & BUTTON_ATTACK ) + if (pm->cmd.buttons & BUTTON_ATTACK) { anim = BOTH_ATTACK3; } else { - anim = PM_PickAnim( pm->gent, BOTH_TUSKENATTACK1, BOTH_TUSKENATTACK3 ); + anim = PM_PickAnim(pm->gent, BOTH_TUSKENATTACK1, BOTH_TUSKENATTACK3); } - if ( anim != BOTH_ATTACK3 && VectorCompare( pm->ps->velocity, vec3_origin ) && pm->cmd.upmove >= 0 ) + if (anim != BOTH_ATTACK3 && VectorCompare(pm->ps->velocity, vec3_origin) && pm->cmd.upmove >= 0) { - PM_SetAnim( pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART ); + PM_SetAnim(pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_RESTART); } else { - PM_SetAnim( pm, SETANIM_TORSO, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART ); + PM_SetAnim(pm, SETANIM_TORSO, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_RESTART); } } break; case WP_BLASTER: - PM_SetAnim( pm, SETANIM_TORSO, BOTH_ATTACK3, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK3, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_RESTART); break; case WP_DISRUPTOR: - if ( ((pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer())&& pm->gent && pm->gent->NPC && (pm->gent->NPC->scriptFlags&SCF_ALT_FIRE)) || - ((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) && cg.zoomMode == 2 ) ) + if (((pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) && pm->gent && pm->gent->NPC && (pm->gent->NPC->scriptFlags&SCF_ALT_FIRE)) || + ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) && cg.zoomMode == 2)) {//NPC or player in alt-fire, sniper mode - PM_SetAnim( pm, SETANIM_TORSO, BOTH_ATTACK4, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK4, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } else {//in primary fire mode - PM_SetAnim( pm, SETANIM_TORSO, BOTH_ATTACK3, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD|SETANIM_FLAG_RESTART); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK3, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_RESTART); } break; case WP_BOT_LASER: - PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); break; case WP_THERMAL: - if ( (pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) ) + if ((pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer())) { - if ( PM_StandingAnim( pm->ps->legsAnim ) ) + if (PM_StandingAnim(pm->ps->legsAnim)) { - PM_SetAnim( pm, SETANIM_LEGS, BOTH_ATTACK10, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_ATTACK10, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } - PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK10,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK10, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); } else { - if ( cg.renderingThirdPerson ) + if (cg.renderingThirdPerson) { - if ( PM_StandingAnim( pm->ps->legsAnim ) - || pm->ps->legsAnim == BOTH_THERMAL_READY ) + if (PM_StandingAnim(pm->ps->legsAnim) + || pm->ps->legsAnim == BOTH_THERMAL_READY) { - PM_SetAnim( pm, SETANIM_LEGS, BOTH_THERMAL_THROW, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_THERMAL_THROW, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); } - PM_SetAnim(pm,SETANIM_TORSO,BOTH_THERMAL_THROW,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//|SETANIM_FLAG_RESTART + PM_SetAnim(pm, SETANIM_TORSO, BOTH_THERMAL_THROW, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD);//|SETANIM_FLAG_RESTART } else { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK2, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); } } break; @@ -13861,36 +13884,36 @@ static void PM_Weapon( void ) break; case WP_REPEATER: - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_GALAKMECH ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_GALAKMECH) {// - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) + if (pm->cmd.buttons & BUTTON_ALT_ATTACK) { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK3,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK3, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); } else { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); } } else { - PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK3,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK3, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); } break; case WP_TRIP_MINE: case WP_DET_PACK: - PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK11,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK11, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); break; default://2-handed heavy weapon - PM_SetAnim(pm,SETANIM_TORSO,BOTH_ATTACK3,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_RESTART|SETANIM_FLAG_HOLD); + PM_SetAnim(pm, SETANIM_TORSO, BOTH_ATTACK3, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_RESTART | SETANIM_FLAG_HOLD); break; } } } - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) + if (pm->cmd.buttons & BUTTON_ALT_ATTACK) { amount = weaponData[pm->ps->weapon].altEnergyPerShot; } @@ -13899,35 +13922,35 @@ static void PM_Weapon( void ) amount = weaponData[pm->ps->weapon].energyPerShot; } - if ( (pm->ps->weaponstate == WEAPON_CHARGING) || (pm->ps->weaponstate == WEAPON_CHARGING_ALT) ) + if ((pm->ps->weaponstate == WEAPON_CHARGING) || (pm->ps->weaponstate == WEAPON_CHARGING_ALT)) { // charging weapons may want to do their own ammo logic. - trueCount = PM_DoChargingAmmoUsage( &amount ); + trueCount = PM_DoChargingAmmoUsage(&amount); } pm->ps->weaponstate = WEAPON_FIRING; // take an ammo away if not infinite - if ( pm->ps->ammo[ weaponData[pm->ps->weapon].ammoIndex ] != -1 ) + if (pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] != -1) { // enough energy to fire this weapon? - if ((pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] - amount) >= 0) + if ((pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] - amount) >= 0) { pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] -= amount; } else // Not enough energy { - if ( !( pm->ps->eFlags & EF_LOCKED_TO_WEAPON )) + if (!(pm->ps->eFlags & EF_LOCKED_TO_WEAPON)) { // Switch weapons - PM_AddEvent( EV_NOAMMO ); + PM_AddEvent(EV_NOAMMO); pm->ps->weaponTime += 500; } return; } } - if ( pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0 ) + if (pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0) {//FIXME: this is going to fire off one frame before you expect, actually // Clear these out since we're not actually firing yet pm->ps->eFlags &= ~EF_FIRING; @@ -13935,72 +13958,72 @@ static void PM_Weapon( void ) return; } - if ( pm->ps->weapon == WP_EMPLACED_GUN ) + if (pm->ps->weapon == WP_EMPLACED_GUN) { - if ( pm->gent + if (pm->gent && pm->gent->owner - && pm->gent->owner->e_UseFunc == useF_eweb_use ) + && pm->gent->owner->e_UseFunc == useF_eweb_use) {//eweb always shoots alt-fire, for proper effects and sounds - PM_AddEvent( EV_ALT_FIRE ); + PM_AddEvent(EV_ALT_FIRE); addTime = weaponData[pm->ps->weapon].altFireTime; } else {//emplaced gun always shoots normal fire - PM_AddEvent( EV_FIRE_WEAPON ); + PM_AddEvent(EV_FIRE_WEAPON); addTime = weaponData[pm->ps->weapon].fireTime; } } else if ( /*(pm->ps->weapon == WP_MELEE && (pm->ps->clientNum>=MAX_CLIENTS||!g_debugMelee->integer) ) //will commenting this fix firetime discrepancy for melee with kungfu? - ||*/ pm->ps->weapon == WP_TUSKEN_STAFF - || (pm->ps->weapon == WP_TUSKEN_RIFLE&&!(pm->cmd.buttons&BUTTON_ALT_ATTACK)) ) + ||*/ pm->ps->weapon == WP_TUSKEN_STAFF + || (pm->ps->weapon == WP_TUSKEN_RIFLE&&!(pm->cmd.buttons&BUTTON_ALT_ATTACK))) { - PM_AddEvent( EV_FIRE_WEAPON ); + PM_AddEvent(EV_FIRE_WEAPON); addTime = pm->ps->torsoAnimTimer; } - else if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) + else if (pm->cmd.buttons & BUTTON_ALT_ATTACK) { - PM_AddEvent( EV_ALT_FIRE ); + PM_AddEvent(EV_ALT_FIRE); addTime = weaponData[pm->ps->weapon].altFireTime; - if ( pm->ps->weapon == WP_THERMAL ) + if (pm->ps->weapon == WP_THERMAL) {//threw our thermal - if ( pm->gent ) + if (pm->gent) {// remove the thermal model if we had it. - G_RemoveWeaponModels( pm->gent ); - if ( (pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) ) + G_RemoveWeaponModels(pm->gent); + if ((pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer())) {//NPCs need to know when to put the thermal back in their hand - pm->ps->weaponTime = pm->ps->torsoAnimTimer-500; + pm->ps->weaponTime = pm->ps->torsoAnimTimer - 500; } } } } - else + else { - if ( pm->ps->clientNum //NPC + if (pm->ps->clientNum //NPC && !PM_ControlledByPlayer() //not under player control && pm->ps->weapon == WP_THERMAL //using thermals - && pm->ps->torsoAnim != BOTH_ATTACK10 )//not in the throw anim + && pm->ps->torsoAnim != BOTH_ATTACK10)//not in the throw anim {//oops, got knocked out of the anim, don't throw the thermal return; } - PM_AddEvent( EV_FIRE_WEAPON ); + PM_AddEvent(EV_FIRE_WEAPON); addTime = weaponData[pm->ps->weapon].fireTime; - switch( pm->ps->weapon) + switch (pm->ps->weapon) { case WP_REPEATER: // repeater is supposed to do smoke after sustained bursts pm->ps->weaponShotCount++; break; case WP_BOWCASTER: - addTime *= (( trueCount < 3 ) ? 0.35f : 1.0f );// if you only did a small charge shot with the bowcaster, use less time between shots + addTime *= ((trueCount < 3) ? 0.35f : 1.0f);// if you only did a small charge shot with the bowcaster, use less time between shots break; case WP_THERMAL: - if ( pm->gent ) + if (pm->gent) {// remove the thermal model if we had it. - G_RemoveWeaponModels( pm->gent ); - if ( (pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer()) ) + G_RemoveWeaponModels(pm->gent); + if ((pm->ps->clientNum >= MAX_CLIENTS&&!PM_ControlledByPlayer())) {//NPCs need to know when to put the thermal back in their hand - pm->ps->weaponTime = pm->ps->torsoAnimTimer-500; + pm->ps->weaponTime = pm->ps->torsoAnimTimer - 500; } } break; @@ -14008,26 +14031,26 @@ static void PM_Weapon( void ) } - if(!PM_ControlledByPlayer()) + if (!PM_ControlledByPlayer()) { - if(pm->gent && pm->gent->NPC != NULL ) + if (pm->gent && pm->gent->NPC != NULL) {//NPCs have their own refire logic return; } } - if ( g_timescale != NULL ) + if (g_timescale != NULL) { - if ( g_timescale->value < 1.0f ) + if (g_timescale->value < 1.0f) { - if ( !MatrixMode ) + if (!MatrixMode) {//Special test for Matrix Mode (tm) - if ( pm->ps->clientNum == 0 && !player_locked && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<ps->clientNum == 0 && !player_locked && (pm->ps->forcePowersActive&(1 << FP_SPEED) || pm->ps->forcePowersActive&(1 << FP_RAGE))) {//player always fires at normal speed addTime *= g_timescale->value; } - else if ( g_entities[pm->ps->clientNum].client - && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<ps->clientNum].client + && (pm->ps->forcePowersActive&(1 << FP_SPEED) || pm->ps->forcePowersActive&(1 << FP_RAGE))) { addTime *= g_timescale->value; } @@ -14037,16 +14060,16 @@ static void PM_Weapon( void ) pm->ps->weaponTime += addTime; pm->ps->lastShotTime = level.time;//so we know when the last time we fired our gun is - + // HACK!!!!! - if ( pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] <= 0 ) + if (pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] <= 0) { - if ( pm->ps->weapon == WP_THERMAL || pm->ps->weapon == WP_TRIP_MINE ) + if (pm->ps->weapon == WP_THERMAL || pm->ps->weapon == WP_TRIP_MINE) { // because these weapons have the ammo attached to the hand, we should switch weapons when the last one is thrown, otherwise it will look silly // NOTE: could also switch to an empty had version, but was told we aren't getting any new models at this point CG_OutOfAmmoChange(); - PM_SetAnim(pm,SETANIM_TORSO,TORSO_DROPWEAP1 + 2,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD); // hack weapon down! + PM_SetAnim(pm, SETANIM_TORSO, TORSO_DROPWEAP1 + 2, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); // hack weapon down! pm->ps->weaponTime = 50; } } @@ -14059,24 +14082,24 @@ PM_VehicleWeapon Generates weapon events and modifes the weapon counter ============== */ -static void PM_VehicleWeapon( void ) +static void PM_VehicleWeapon(void) { - int addTime = 0, amount; + int addTime = 0; qboolean delayed_fire = qfalse; - if ( pm->ps->weapon == WP_NONE ) - { + if (pm->ps->weapon == WP_NONE) + { return; } - if(pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0) + if (pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0) {//FIXME: this is going to fire off one frame before you expect, actually pm->gent->client->fireDelay -= pml.msec; - if(pm->gent->client->fireDelay <= 0) + if (pm->gent->client->fireDelay <= 0) {//just finished delay timer - if ( pm->ps->clientNum && pm->ps->weapon == WP_ROCKET_LAUNCHER ) + if (pm->ps->clientNum && pm->ps->weapon == WP_ROCKET_LAUNCHER) { - G_SoundOnEnt( pm->gent, CHAN_WEAPON, "sound/weapons/rocket/lock.wav" ); + G_SoundOnEnt(pm->gent, CHAN_WEAPON, "sound/weapons/rocket/lock.wav"); pm->cmd.buttons |= BUTTON_ALT_ATTACK; } pm->gent->client->fireDelay = 0; @@ -14084,32 +14107,32 @@ static void PM_VehicleWeapon( void ) } else { - if ( pm->ps->clientNum && pm->ps->weapon == WP_ROCKET_LAUNCHER && Q_irand( 0, 1 ) ) + if (pm->ps->clientNum && pm->ps->weapon == WP_ROCKET_LAUNCHER && Q_irand(0, 1)) { - G_SoundOnEnt( pm->gent, CHAN_WEAPON, "sound/weapons/rocket/tick.wav" ); + G_SoundOnEnt(pm->gent, CHAN_WEAPON, "sound/weapons/rocket/tick.wav"); } } } - // don't allow attack until all buttons are up - if ( pm->ps->pm_flags & PMF_RESPAWNED ) { + // don't allow attack until all buttons are up + if (pm->ps->pm_flags & PMF_RESPAWNED) { return; } // check for dead player - if ( pm->ps->stats[STAT_HEALTH] <= 0 ) + if (pm->ps->stats[STAT_HEALTH] <= 0) { - if ( pm->gent && pm->gent->client ) + if (pm->gent && pm->gent->client) { // borg no longer exist, use NPC_class to check for any npc's that don't drop their weapons (if there are any) // Sigh..borg shouldn't drop their weapon attachments when they die. Also, never drop a lightsaber! - // if ( pm->gent->client->playerTeam != TEAM_BORG) + // if ( pm->gent->client->playerTeam != TEAM_BORG) { - // pm->ps->weapon = WP_NONE; + // pm->ps->weapon = WP_NONE; } } - if ( pm->gent ) + if (pm->gent) { pm->gent->s.loopSound = 0; } @@ -14117,66 +14140,57 @@ static void PM_VehicleWeapon( void ) } // make weapon function - if ( pm->ps->weaponTime > 0 ) { + if (pm->ps->weaponTime > 0) { pm->ps->weaponTime -= pml.msec; - if ( pm->ps->weaponTime <= 0 ) + if (pm->ps->weaponTime <= 0) { pm->ps->weaponTime = 0; } } - if ( pm->ps->weaponTime > 0 ) + if (pm->ps->weaponTime > 0) { return; } // change weapon if time - if ( pm->ps->weaponstate == WEAPON_DROPPING ) { + if (pm->ps->weaponstate == WEAPON_DROPPING) { PM_FinishWeaponChange(); return; } - if ( PM_DoChargedWeapons()) + if (PM_DoChargedWeapons()) { // In some cases the charged weapon code may want us to short circuit the rest of the firing code return; } - if(!delayed_fire) + if (!delayed_fire) { // check for fire - if ( !(pm->cmd.buttons & (BUTTON_ATTACK|BUTTON_ALT_ATTACK)) ) + if (!(pm->cmd.buttons & (BUTTON_ATTACK | BUTTON_ALT_ATTACK))) { pm->ps->weaponTime = 0; - - if ( pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0 ) + + if (pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0) {//Still firing pm->ps->weaponstate = WEAPON_FIRING; } - else if ( pm->ps->weaponstate != WEAPON_READY ) + else if (pm->ps->weaponstate != WEAPON_READY) { - if ( !pm->gent || !pm->gent->NPC || pm->gent->attackDebounceTime < level.time ) + if (!pm->gent || !pm->gent->NPC || pm->gent->attackDebounceTime < level.time) { pm->ps->weaponstate = WEAPON_IDLE; } } - + return; } } - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) - { - amount = weaponData[pm->ps->weapon].altEnergyPerShot; - } - else - { - amount = weaponData[pm->ps->weapon].energyPerShot; - } - pm->ps->weaponstate = WEAPON_FIRING; - if ( pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0 ) + if (pm->gent && pm->gent->client && pm->gent->client->fireDelay > 0) {//FIXME: this is going to fire off one frame before you expect, actually // Clear these out since we're not actually firing yet pm->ps->eFlags &= ~EF_FIRING; @@ -14184,35 +14198,35 @@ static void PM_VehicleWeapon( void ) return; } - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) + if (pm->cmd.buttons & BUTTON_ALT_ATTACK) { - PM_AddEvent( EV_ALT_FIRE ); + PM_AddEvent(EV_ALT_FIRE); //addTime = weaponData[pm->ps->weapon].altFireTime; } - else + else { - PM_AddEvent( EV_FIRE_WEAPON ); + PM_AddEvent(EV_FIRE_WEAPON); // TODO: Use the real weapon fire time from the vehicle cfg file. //addTime = weaponData[pm->ps->weapon].fireTime; - } + } -/* if(pm->gent && pm->gent->NPC != NULL ) + /* if(pm->gent && pm->gent->NPC != NULL ) {//NPCs have their own refire logic - return; + return; }*/ - if ( g_timescale != NULL ) + if (g_timescale != NULL) { - if ( g_timescale->value < 1.0f ) + if (g_timescale->value < 1.0f) { - if ( !MatrixMode ) + if (!MatrixMode) {//Special test for Matrix Mode (tm) - if ( pm->ps->clientNum == 0 && !player_locked && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<ps->clientNum == 0 && !player_locked && (pm->ps->forcePowersActive&(1 << FP_SPEED) || pm->ps->forcePowersActive&(1 << FP_RAGE))) {//player always fires at normal speed addTime *= g_timescale->value; } - else if ( g_entities[pm->ps->clientNum].client - && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<ps->clientNum].client + && (pm->ps->forcePowersActive&(1 << FP_SPEED) || pm->ps->forcePowersActive&(1 << FP_RAGE))) { addTime *= g_timescale->value; } @@ -14225,58 +14239,58 @@ static void PM_VehicleWeapon( void ) } -extern void ForceHeal( gentity_t *self ); -extern void ForceTelepathy( gentity_t *self ); -extern void ForceRage( gentity_t *self ); -extern void ForceProtect( gentity_t *self ); -extern void ForceAbsorb( gentity_t *self ); -extern void ForceSeeing( gentity_t *self ); -void PM_CheckForceUseButton( gentity_t *ent, usercmd_t *ucmd ) +extern void ForceHeal(gentity_t *self); +extern void ForceTelepathy(gentity_t *self); +extern void ForceRage(gentity_t *self); +extern void ForceProtect(gentity_t *self); +extern void ForceAbsorb(gentity_t *self); +extern void ForceSeeing(gentity_t *self); +void PM_CheckForceUseButton(gentity_t *ent, usercmd_t *ucmd) { - if ( !ent ) + if (!ent) { return; } - if ( ucmd->buttons & BUTTON_USE_FORCE ) + if (ucmd->buttons & BUTTON_USE_FORCE) { if (!(ent->client->ps.pm_flags & PMF_USEFORCE_HELD)) { //impulse one shot - switch ( showPowers[cg.forcepowerSelect] ) + switch (showPowers[cg.forcepowerSelect]) { case FP_HEAL: - ForceHeal( ent ); + ForceHeal(ent); break; case FP_SPEED: - ForceSpeed( ent ); + ForceSpeed(ent); break; case FP_PUSH: - ForceThrow( ent, qfalse ); + ForceThrow(ent, qfalse); break; case FP_PULL: - ForceThrow( ent, qtrue ); + ForceThrow(ent, qtrue); break; case FP_TELEPATHY: - ForceTelepathy( ent ); + ForceTelepathy(ent); break; // Added 01/20/03 by AReis. // New Jedi Academy powers. case FP_RAGE: //duration - speed, invincibility and extra damage for short period, drains your health and leaves you weak and slow afterwards. - ForceRage( ent ); + ForceRage(ent); break; case FP_PROTECT: //duration - protect against physical/energy (level 1 stops blaster/energy bolts, level 2 stops projectiles, level 3 protects against explosions) - ForceProtect( ent ); + ForceProtect(ent); break; case FP_ABSORB: //duration - protect against dark force powers (grip, lightning, drain - maybe push/pull, too?) - ForceAbsorb( ent ); + ForceAbsorb(ent); break; case FP_SEE: //duration - detect/see hidden enemies - ForceSeeing( ent ); + ForceSeeing(ent); break; } } //these stay are okay to call every frame button is down - switch ( showPowers[cg.forcepowerSelect] ) + switch (showPowers[cg.forcepowerSelect]) { case FP_LEVITATION: ucmd->upmove = 127; @@ -14291,9 +14305,9 @@ void PM_CheckForceUseButton( gentity_t *ent, usercmd_t *ucmd ) // FIXME! Failing at WP_ForcePowerUsable(). -AReis ucmd->buttons |= BUTTON_FORCE_DRAIN; break; -// default: -// Com_Printf( "Use Force: Unhandled force: %d\n", showPowers[cg.forcepowerSelect]); -// break; + // default: + // Com_Printf( "Use Force: Unhandled force: %d\n", showPowers[cg.forcepowerSelect]); + // break; } ent->client->ps.pm_flags |= PMF_USEFORCE_HELD; } @@ -14313,20 +14327,20 @@ sends event to client for client side fx, not used /* static void PM_ForcePower(void) { - // check for item using - if ( pm->cmd.buttons & BUTTON_USE_FORCE ) - { - if ( ! ( pm->ps->pm_flags & PMF_USE_FORCE ) ) - { - pm->ps->pm_flags |= PMF_USE_FORCE; - PM_AddEvent( EV_USE_FORCE); - return; - } - } - else - { - pm->ps->pm_flags &= ~PMF_USE_FORCE; - } +// check for item using +if ( pm->cmd.buttons & BUTTON_USE_FORCE ) +{ +if ( ! ( pm->ps->pm_flags & PMF_USE_FORCE ) ) +{ +pm->ps->pm_flags |= PMF_USE_FORCE; +PM_AddEvent( EV_USE_FORCE); +return; +} +} +else +{ +pm->ps->pm_flags &= ~PMF_USE_FORCE; +} } */ @@ -14335,85 +14349,85 @@ static void PM_ForcePower(void) PM_DropTimers ================ */ -static void PM_DropTimers( void ) +static void PM_DropTimers(void) { // drop misc timing counter - if ( pm->ps->pm_time ) + if (pm->ps->pm_time) { - if ( pml.msec >= pm->ps->pm_time ) + if (pml.msec >= pm->ps->pm_time) { pm->ps->pm_flags &= ~PMF_ALL_TIMES; pm->ps->pm_time = 0; - } - else + } + else { pm->ps->pm_time -= pml.msec; } } // drop legs animation counter - if ( pm->ps->legsAnimTimer > 0 ) + if (pm->ps->legsAnimTimer > 0) { int newTime = pm->ps->legsAnimTimer - pml.msec; - if ( newTime < 0 ) + if (newTime < 0) { newTime = 0; } - PM_SetLegsAnimTimer( pm->gent, &pm->ps->legsAnimTimer, newTime ); + PM_SetLegsAnimTimer(pm->gent, &pm->ps->legsAnimTimer, newTime); } // drop torso animation counter - if ( pm->ps->torsoAnimTimer > 0 ) + if (pm->ps->torsoAnimTimer > 0) { int newTime = pm->ps->torsoAnimTimer - pml.msec; - if ( newTime < 0 ) + if (newTime < 0) { newTime = 0; } - PM_SetTorsoAnimTimer( pm->gent, &pm->ps->torsoAnimTimer, newTime ); + PM_SetTorsoAnimTimer(pm->gent, &pm->ps->torsoAnimTimer, newTime); } } -void PM_SetSpecialMoveValues (void ) +void PM_SetSpecialMoveValues(void) { Flying = 0; - if ( pm->gent ) + if (pm->gent) { - if ( pm->gent->client && pm->gent->client->moveType == MT_FLYSWIM ) + if (pm->gent->client && pm->gent->client->moveType == MT_FLYSWIM) { Flying = FLY_NORMAL; } - else if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE ) + else if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE) { - if ( pm->gent->m_pVehicle->m_pVehicleInfo->type == VH_FIGHTER ) + if (pm->gent->m_pVehicle->m_pVehicleInfo->type == VH_FIGHTER) { Flying = FLY_VEHICLE; } - else if ( pm->gent->m_pVehicle->m_pVehicleInfo->hoverHeight > 0 ) + else if (pm->gent->m_pVehicle->m_pVehicleInfo->hoverHeight > 0) {//FIXME: or just check for hoverHeight? Flying = FLY_HOVER; } } } - if ( g_timescale != NULL ) + if (g_timescale != NULL) { - if ( g_timescale->value < 1.0f ) + if (g_timescale->value < 1.0f) { - if ( !MatrixMode ) + if (!MatrixMode) { - if ( pm->ps->clientNum == 0 && !player_locked && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<ps->clientNum == 0 && !player_locked && (pm->ps->forcePowersActive&(1 << FP_SPEED) || pm->ps->forcePowersActive&(1 << FP_RAGE))) { - pml.frametime *= (1.0f/g_timescale->value); + pml.frametime *= (1.0f / g_timescale->value); } - else if ( g_entities[pm->ps->clientNum].client - && (pm->ps->forcePowersActive&(1<ps->forcePowersActive&(1<ps->clientNum].client + && (pm->ps->forcePowersActive&(1 << FP_SPEED) || pm->ps->forcePowersActive&(1 << FP_RAGE))) { - pml.frametime *= (1.0f/g_timescale->value); + pml.frametime *= (1.0f / g_timescale->value); } } } @@ -14423,46 +14437,46 @@ void PM_SetSpecialMoveValues (void ) extern float cg_zoomFov; //from cg_view.cpp //------------------------------------------- -void PM_AdjustAttackStates( pmove_t *pm ) +void PM_AdjustAttackStates(pmove_t *pm) //------------------------------------------- { int amount; - if ( !g_saberAutoBlocking->integer + if (!g_saberAutoBlocking->integer && !g_saberNewControlScheme->integer - && (pm->cmd.buttons&BUTTON_FORCE_FOCUS) ) + && (pm->cmd.buttons&BUTTON_FORCE_FOCUS)) { pm->ps->saberBlockingTime = pm->cmd.serverTime + 100; pm->cmd.buttons &= ~BUTTON_ATTACK; pm->cmd.buttons &= ~BUTTON_ALT_ATTACK; } // get ammo usage - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) + if (pm->cmd.buttons & BUTTON_ALT_ATTACK) { - amount = pm->ps->ammo[weaponData[ pm->ps->weapon ].ammoIndex] - weaponData[pm->ps->weapon].altEnergyPerShot; + amount = pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] - weaponData[pm->ps->weapon].altEnergyPerShot; } else { - amount = pm->ps->ammo[weaponData[ pm->ps->weapon ].ammoIndex] - weaponData[pm->ps->weapon].energyPerShot; + amount = pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] - weaponData[pm->ps->weapon].energyPerShot; } - if ( pm->ps->weapon == WP_SABER && (!cg.zoomMode||pm->ps->clientNum) ) + if (pm->ps->weapon == WP_SABER && (!cg.zoomMode || pm->ps->clientNum)) {//don't let the alt-attack be interpreted as an actual attack command - if ( pm->ps->saberInFlight ) + if (pm->ps->saberInFlight) { pm->cmd.buttons &= ~BUTTON_ALT_ATTACK; //FIXME: what about alt-attack modifier button? - if ( (!pm->ps->dualSabers || !pm->ps->saber[1].Active()) ) + if ((!pm->ps->dualSabers || !pm->ps->saber[1].Active())) {//saber not in hand, can't swing it pm->cmd.buttons &= ~BUTTON_ATTACK; } } //saber staff alt-attack does a special attack anim, non-throwable sabers do kicks - if ( pm->ps->saberAnimLevel != SS_STAFF - && !(pm->ps->saber[0].saberFlags&SFL_NOT_THROWABLE) ) + if (pm->ps->saberAnimLevel != SS_STAFF + && !(pm->ps->saber[0].saberFlags&SFL_NOT_THROWABLE)) {//using a throwable saber, so remove the saber throw button - if ( !g_saberNewControlScheme->integer - && PM_CanDoKata() ) + if (!g_saberNewControlScheme->integer + && PM_CanDoKata()) {//old control scheme - alt-attack + attack does kata } else @@ -14473,49 +14487,49 @@ void PM_AdjustAttackStates( pmove_t *pm ) } // disruptor alt-fire should toggle the zoom mode, but only bother doing this for the player? - if ( pm->ps->weapon == WP_DISRUPTOR && pm->gent && (pm->gent->s.numbergent)) && pm->ps->weaponstate != WEAPON_DROPPING ) + if (pm->ps->weapon == WP_DISRUPTOR && pm->gent && (pm->gent->s.numbergent)) && pm->ps->weaponstate != WEAPON_DROPPING) { // we are not alt-firing yet, but the alt-attack button was just pressed and // we either are ducking ( in which case we don't care if they are moving )...or they are not ducking...and also not moving right/forward. - if ( !(pm->ps->eFlags & EF_ALT_FIRING) && (pm->cmd.buttons & BUTTON_ALT_ATTACK) - && ( pm->cmd.upmove < 0 || ( !pm->cmd.forwardmove && !pm->cmd.rightmove ))) + if (!(pm->ps->eFlags & EF_ALT_FIRING) && (pm->cmd.buttons & BUTTON_ALT_ATTACK) + && (pm->cmd.upmove < 0 || (!pm->cmd.forwardmove && !pm->cmd.rightmove))) { // We just pressed the alt-fire key - if ( cg.zoomMode == 0 || cg.zoomMode == 3 ) + if (cg.zoomMode == 0 || cg.zoomMode == 3) { - G_SoundOnEnt( pm->gent, CHAN_AUTO, "sound/weapons/disruptor/zoomstart.wav" ); + G_SoundOnEnt(pm->gent, CHAN_AUTO, "sound/weapons/disruptor/zoomstart.wav"); // not already zooming, so do it now cg.zoomMode = 2; cg.zoomLocked = qfalse; cg_zoomFov = 80.0f;//(cg.overrides.active&CG_OVERRIDE_FOV) ? cg.overrides.fov : cg_fov.value; } - else if ( cg.zoomMode == 2 ) + else if (cg.zoomMode == 2) { - G_SoundOnEnt( pm->gent, CHAN_AUTO, "sound/weapons/disruptor/zoomend.wav" ); + G_SoundOnEnt(pm->gent, CHAN_AUTO, "sound/weapons/disruptor/zoomend.wav"); // already zooming, so must be wanting to turn it off cg.zoomMode = 0; cg.zoomTime = cg.time; cg.zoomLocked = qfalse; } } - else if ( !(pm->cmd.buttons & BUTTON_ALT_ATTACK )) + else if (!(pm->cmd.buttons & BUTTON_ALT_ATTACK)) { // Not pressing zoom any more - if ( cg.zoomMode == 2 ) + if (cg.zoomMode == 2) { // were zooming in, so now lock the zoom cg.zoomLocked = qtrue; } } - if ( pm->cmd.buttons & BUTTON_ATTACK ) + if (pm->cmd.buttons & BUTTON_ATTACK) { // If we are zoomed, we should switch the ammo usage to the alt-fire, otherwise, we'll // just use whatever ammo was selected from above - if ( cg.zoomMode == 2 ) + if (cg.zoomMode == 2) { - amount = pm->ps->ammo[weaponData[ pm->ps->weapon ].ammoIndex] - - weaponData[pm->ps->weapon].altEnergyPerShot; + amount = pm->ps->ammo[weaponData[pm->ps->weapon].ammoIndex] - + weaponData[pm->ps->weapon].altEnergyPerShot; } } else @@ -14527,15 +14541,15 @@ void PM_AdjustAttackStates( pmove_t *pm ) } // Check for binocular specific mode - if ( cg.zoomMode == 1 && pm->gent && (pm->gent->s.numbergent)) ) // + if (cg.zoomMode == 1 && pm->gent && (pm->gent->s.numbergent))) // { - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK && pm->ps->batteryCharge ) + if (pm->cmd.buttons & BUTTON_ALT_ATTACK && pm->ps->batteryCharge) { // zooming out cg.zoomLocked = qfalse; cg.zoomDir = 1; } - else if ( pm->cmd.buttons & BUTTON_ATTACK && pm->ps->batteryCharge ) + else if (pm->cmd.buttons & BUTTON_ATTACK && pm->ps->batteryCharge) { // zooming in cg.zoomLocked = qfalse; @@ -14550,16 +14564,16 @@ void PM_AdjustAttackStates( pmove_t *pm ) // kill buttons and associated firing flags so we can't fire pm->ps->eFlags &= ~EF_FIRING; pm->ps->eFlags &= ~EF_ALT_FIRING; - pm->cmd.buttons &= ~(BUTTON_ALT_ATTACK|BUTTON_ATTACK); + pm->cmd.buttons &= ~(BUTTON_ALT_ATTACK | BUTTON_ATTACK); } // set the firing flag for continuous beam weapons, phaser will fire even if out of ammo - if ( (( pm->cmd.buttons & BUTTON_ATTACK || pm->cmd.buttons & BUTTON_ALT_ATTACK ) && ( amount >= 0 || pm->ps->weapon == WP_SABER )) ) + if (((pm->cmd.buttons & BUTTON_ATTACK || pm->cmd.buttons & BUTTON_ALT_ATTACK) && (amount >= 0 || pm->ps->weapon == WP_SABER))) { - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) + if (pm->cmd.buttons & BUTTON_ALT_ATTACK) { pm->ps->eFlags |= EF_ALT_FIRING; - if ( pm->ps->clientNum < MAX_CLIENTS && pm->gent && (pm->ps->eFlags&EF_IN_ATST) ) + if (pm->ps->clientNum < MAX_CLIENTS && pm->gent && (pm->ps->eFlags&EF_IN_ATST)) {//switch ATST barrels pm->gent->alt_fire = qtrue; } @@ -14567,7 +14581,7 @@ void PM_AdjustAttackStates( pmove_t *pm ) else { pm->ps->eFlags &= ~EF_ALT_FIRING; - if ( pm->ps->clientNum < MAX_CLIENTS && pm->gent && (pm->ps->eFlags&EF_IN_ATST) ) + if (pm->ps->clientNum < MAX_CLIENTS && pm->gent && (pm->ps->eFlags&EF_IN_ATST)) {//switch ATST barrels pm->gent->alt_fire = qfalse; } @@ -14575,31 +14589,31 @@ void PM_AdjustAttackStates( pmove_t *pm ) // This flag should always get set, even when alt-firing pm->ps->eFlags |= EF_FIRING; - } - else + } + else { -// int iFlags = pm->ps->eFlags; + // int iFlags = pm->ps->eFlags; // Clear 'em out pm->ps->eFlags &= ~EF_FIRING; pm->ps->eFlags &= ~EF_ALT_FIRING; // if I don't check the flags before stopping FX then it switches them off too often, which tones down - // the stronger FFFX so you can hardly feel them. However, if you only do iton these flags then the + // the stronger FFFX so you can hardly feel them. However, if you only do iton these flags then the // repeat-fire weapons like tetrion and dreadnought don't switch off quick enough. So... // -/* // Might need this for beam type weapons + /* // Might need this for beam type weapons if ( pm->ps->weapon == WP_DREADNOUGHT || (iFlags & (EF_FIRING|EF_ALT_FIRING) ) { - cgi_FF_StopAllFX(); + cgi_FF_StopAllFX(); } */ } // disruptor should convert a main fire to an alt-fire if the gun is currently zoomed - if ( pm->ps->weapon == WP_DISRUPTOR && pm->gent && (pm->gent->s.numbergent)) ) + if (pm->ps->weapon == WP_DISRUPTOR && pm->gent && (pm->gent->s.numbergent))) { - if ( pm->cmd.buttons & BUTTON_ATTACK && cg.zoomMode == 2 ) + if (pm->cmd.buttons & BUTTON_ATTACK && cg.zoomMode == 2) { // converting the main fire to an alt-fire pm->cmd.buttons |= BUTTON_ALT_ATTACK; @@ -14613,10 +14627,10 @@ void PM_AdjustAttackStates( pmove_t *pm ) } } -qboolean PM_WeaponOkOnVehicle( int weapon ) +qboolean PM_WeaponOkOnVehicle(int weapon) { //FIXME: check g_vehicleInfo for our vehicle? - switch ( weapon ) + switch (weapon) { case WP_NONE: case WP_SABER: @@ -14628,25 +14642,25 @@ qboolean PM_WeaponOkOnVehicle( int weapon ) return qfalse; } -void PM_CheckInVehicleSaberAttackAnim( void ) +void PM_CheckInVehicleSaberAttackAnim(void) {//A bit of a hack, but makes the vehicle saber attacks act like any other saber attack... // make weapon function - if ( pm->ps->weaponTime > 0 ) { + if (pm->ps->weaponTime > 0) { pm->ps->weaponTime -= pml.msec; - if ( pm->ps->weaponTime <= 0 ) + if (pm->ps->weaponTime <= 0) { pm->ps->weaponTime = 0; } } PM_CheckClearSaberBlock(); -/* if ( PM_SaberBlocking() ) + /* if ( PM_SaberBlocking() ) {//busy blocking, don't do attacks - return; + return; } -*/ + */ saberMoveName_t saberMove = LS_INVALID; - switch ( pm->ps->torsoAnim ) + switch (pm->ps->torsoAnim) { case BOTH_VS_ATR_S: saberMove = LS_SWOOP_ATTACK_RIGHT; @@ -14661,33 +14675,33 @@ void PM_CheckInVehicleSaberAttackAnim( void ) saberMove = LS_TAUNTAUN_ATTACK_LEFT; break; } - if ( saberMove != LS_INVALID ) + if (saberMove != LS_INVALID) { - if ( pm->ps->saberMove == saberMove ) + if (pm->ps->saberMove == saberMove) {//already playing it - if ( !pm->ps->torsoAnimTimer ) + if (!pm->ps->torsoAnimTimer) {//anim was done, set it back to ready - PM_SetSaberMove( LS_READY ); + PM_SetSaberMove(LS_READY); pm->ps->saberMove = LS_READY; pm->ps->weaponstate = WEAPON_IDLE; if (pm->cmd.buttons&BUTTON_ATTACK) { - if ( !pm->ps->weaponTime ) + if (!pm->ps->weaponTime) { - PM_SetSaberMove( saberMove ); + PM_SetSaberMove(saberMove); pm->ps->weaponstate = WEAPON_FIRING; pm->ps->weaponTime = pm->ps->torsoAnimTimer; } } } } - else if ( pm->ps->torsoAnimTimer - && !pm->ps->weaponTime ) + else if (pm->ps->torsoAnimTimer + && !pm->ps->weaponTime) { - PM_SetSaberMove( LS_READY ); + PM_SetSaberMove(LS_READY); pm->ps->saberMove = LS_READY; pm->ps->weaponstate = WEAPON_IDLE; - PM_SetSaberMove( saberMove ); + PM_SetSaberMove(saberMove); pm->ps->weaponstate = WEAPON_FIRING; pm->ps->weaponTime = pm->ps->torsoAnimTimer; } @@ -14696,7 +14710,7 @@ void PM_CheckInVehicleSaberAttackAnim( void ) } //force the vehicle to turn and travel to its forced destination point -void PM_VehForcedTurning( gentity_t *veh ) +void PM_VehForcedTurning(gentity_t *veh) { gentity_t *dst = &g_entities[pm->ps->vehTurnaroundIndex]; float pitchD, yawD; @@ -14738,7 +14752,7 @@ Pmove Can be called by either the server or the client ================ */ -void Pmove( pmove_t *pmove ) +void Pmove(pmove_t *pmove) { Vehicle_t *pVeh = NULL; @@ -14758,96 +14772,98 @@ void Pmove( pmove_t *pmove ) // In certain situations, we may want to control which attack buttons are pressed and what kind of functionality // is attached to them - PM_AdjustAttackStates( pm ); + PM_AdjustAttackStates(pm); // clear the respawned flag if attack and use are cleared - if ( pm->ps->stats[STAT_HEALTH] > 0 && - !( pm->cmd.buttons & BUTTON_ATTACK ) ) + if (pm->ps->stats[STAT_HEALTH] > 0 && + !(pm->cmd.buttons & BUTTON_ATTACK)) { pm->ps->pm_flags &= ~PMF_RESPAWNED; } // clear all pmove local vars - memset (&pml, 0, sizeof(pml)); + memset(&pml, 0, sizeof(pml)); // determine the time pml.msec = pmove->cmd.serverTime - pm->ps->commandTime; - if ( pml.msec < 1 ) { + if (pml.msec < 1) { pml.msec = 1; - } else if ( pml.msec > 200 ) { + } + else if (pml.msec > 200) { pml.msec = 200; } - + pm->ps->commandTime = pmove->cmd.serverTime; // save old org in case we get stuck - VectorCopy (pm->ps->origin, pml.previous_origin); + VectorCopy(pm->ps->origin, pml.previous_origin); // save old velocity for crashlanding - VectorCopy (pm->ps->velocity, pml.previous_velocity); + VectorCopy(pm->ps->velocity, pml.previous_velocity); pml.frametime = pml.msec * 0.001; - - if ( pm->ps->clientNum >= MAX_CLIENTS && + + if (pm->ps->clientNum >= MAX_CLIENTS && pm->gent && pm->gent->client && - pm->gent->client->NPC_class == CLASS_VEHICLE ) + pm->gent->client->NPC_class == CLASS_VEHICLE) { //we are a vehicle pVeh = pm->gent->m_pVehicle; - assert( pVeh ); - if ( pVeh ) + assert(pVeh); + if (pVeh) { pVeh->m_fTimeModifier = (pml.frametime*60.0f);//at 16.67ms (60fps), should be 1.0f } } - else if ( pm->gent && PM_RidingVehicle() ) + else if (pm->gent && PM_RidingVehicle()) { - if ( pm->ps->vehTurnaroundIndex - && pm->ps->vehTurnaroundTime > pm->cmd.serverTime ) + if (pm->ps->vehTurnaroundIndex + && pm->ps->vehTurnaroundTime > pm->cmd.serverTime) { //riding this vehicle, turn my view too - PM_VehForcedTurning( &g_entities[pm->gent->s.m_iVehicleNum] ); + PM_VehForcedTurning(&g_entities[pm->gent->s.m_iVehicleNum]); } } PM_SetSpecialMoveValues(); // update the viewangles - PM_UpdateViewAngles( pm->ps, &pm->cmd, pm->gent); + PM_UpdateViewAngles(pm->ps, &pm->cmd, pm->gent); - AngleVectors ( pm->ps->viewangles, pml.forward, pml.right, pml.up ); + AngleVectors(pm->ps->viewangles, pml.forward, pml.right, pml.up); - if ( pm->cmd.upmove < 10 ) { + if (pm->cmd.upmove < 10) { // not holding jump pm->ps->pm_flags &= ~PMF_JUMP_HELD; } // decide if backpedaling animations should be used - if ( pm->cmd.forwardmove < 0 ) { + if (pm->cmd.forwardmove < 0) { pm->ps->pm_flags |= PMF_BACKWARDS_RUN; - } else if ( pm->cmd.forwardmove > 0 || ( pm->cmd.forwardmove == 0 && pm->cmd.rightmove ) ) { + } + else if (pm->cmd.forwardmove > 0 || (pm->cmd.forwardmove == 0 && pm->cmd.rightmove)) { pm->ps->pm_flags &= ~PMF_BACKWARDS_RUN; } - if ( pm->ps->pm_type >= PM_DEAD ) { + if (pm->ps->pm_type >= PM_DEAD) { pm->cmd.forwardmove = 0; pm->cmd.rightmove = 0; pm->cmd.upmove = 0; - if ( pm->ps->viewheight > -12 ) + if (pm->ps->viewheight > -12) {//slowly sink view to ground pm->ps->viewheight -= 1; } } - if ( pm->ps->pm_type == PM_SPECTATOR ) { - PM_CheckDuck (); - PM_FlyMove (); - PM_DropTimers (); + if (pm->ps->pm_type == PM_SPECTATOR) { + PM_CheckDuck(); + PM_FlyMove(); + PM_DropTimers(); return; } - if ( pm->ps->pm_type == PM_NOCLIP ) { - PM_NoclipMove (); - PM_DropTimers (); + if (pm->ps->pm_type == PM_NOCLIP) { + PM_NoclipMove(); + PM_DropTimers(); return; } @@ -14855,31 +14871,31 @@ void Pmove( pmove_t *pmove ) return; // no movement at all } - if ( pm->ps->pm_type == PM_INTERMISSION ) { + if (pm->ps->pm_type == PM_INTERMISSION) { return; // no movement at all } - if ( pm->ps->pm_flags & PMF_SLOW_MO_FALL ) + if (pm->ps->pm_flags & PMF_SLOW_MO_FALL) {//half grav pm->ps->gravity *= 0.5; } // set watertype, and waterlevel - PM_SetWaterLevelAtPoint( pm->ps->origin, &pm->waterlevel, &pm->watertype ); + PM_SetWaterLevelAtPoint(pm->ps->origin, &pm->waterlevel, &pm->watertype); PM_SetWaterHeight(); - if ( !(pm->watertype & CONTENTS_LADDER) ) + if (!(pm->watertype & CONTENTS_LADDER)) {//Don't want to remember this for ladders, is only for waterlevel change events (sounds) pml.previous_waterlevel = pmove->waterlevel; } waterForceJump = qfalse; - if ( pmove->waterlevel && pm->ps->clientNum ) + if (pmove->waterlevel && pm->ps->clientNum) { - if ( pm->ps->forceJumpZStart//force jumping - ||(pm->gent&&pm->gent->NPC && level.timegent->NPC->jumpTime)) //TIMER_Done(pm->gent, "forceJumpChasing" )) )//force-jumping + if (pm->ps->forceJumpZStart//force jumping + || (pm->gent&&pm->gent->NPC && level.timegent->NPC->jumpTime)) //TIMER_Done(pm->gent, "forceJumpChasing" )) )//force-jumping { waterForceJump = qtrue; } @@ -14888,56 +14904,56 @@ void Pmove( pmove_t *pmove ) // set mins, maxs, and viewheight PM_SetBounds(); - if ( !Flying && !(pm->watertype & CONTENTS_LADDER) && pm->ps->pm_type != PM_DEAD ) + if (!Flying && !(pm->watertype & CONTENTS_LADDER) && pm->ps->pm_type != PM_DEAD) {//NOTE: noclippers shouldn't jump or duck either, no? PM_CheckDuck(); } // set groundentity PM_GroundTrace(); - if ( Flying == FLY_HOVER ) + if (Flying == FLY_HOVER) {//never stick to the ground PM_HoverTrace(); } - if ( pm->ps->pm_type == PM_DEAD ) { - PM_DeadMove (); + if (pm->ps->pm_type == PM_DEAD) { + PM_DeadMove(); } - PM_DropTimers(); + PM_DropTimers(); /* if ( PM_RidingVehicle() ) { - PM_NoclipMove(); + PM_NoclipMove(); } - else */if ( pm->ps && ( (pm->ps->eFlags&EF_LOCKED_TO_WEAPON) - || (pm->ps->eFlags&EF_HELD_BY_RANCOR) - || (pm->ps->eFlags&EF_HELD_BY_WAMPA) - || (pm->ps->eFlags&EF_HELD_BY_SAND_CREATURE) ) ) + else */if (pm->ps && ((pm->ps->eFlags&EF_LOCKED_TO_WEAPON) + || (pm->ps->eFlags&EF_HELD_BY_RANCOR) + || (pm->ps->eFlags&EF_HELD_BY_WAMPA) + || (pm->ps->eFlags&EF_HELD_BY_SAND_CREATURE))) {//in an emplaced gun PM_NoclipMove(); } - else if ( Flying == FLY_NORMAL )//|| pm->ps->gravity <= 0 ) + else if (Flying == FLY_NORMAL)//|| pm->ps->gravity <= 0 ) { // flight powerup doesn't allow jump and has different friction PM_FlyMove(); - } - else if ( Flying == FLY_VEHICLE ) + } + else if (Flying == FLY_VEHICLE) { PM_FlyVehicleMove(); } - else if ( pm->ps->pm_flags & PMF_TIME_WATERJUMP ) + else if (pm->ps->pm_flags & PMF_TIME_WATERJUMP) { PM_WaterJumpMove(); - } - else if ( pm->waterlevel > 1 //in water - &&((pm->ps->clientNum < MAX_CLIENTS||PM_ControlledByPlayer()) || !waterForceJump) )//player or NPC not force jumping + } + else if (pm->waterlevel > 1 //in water + && ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) || !waterForceJump))//player or NPC not force jumping {//force-jumping NPCs should // swimming or in ladder PM_WaterMove(); } - else if (pm->gent && pm->gent->NPC && pm->gent->NPC->jumpTime!=0) + else if (pm->gent && pm->gent->NPC && pm->gent->NPC->jumpTime != 0) { ucmd.forwardmove = 0; ucmd.rightmove = 0; @@ -14947,29 +14963,29 @@ void Pmove( pmove_t *pmove ) PM_AirMove(); } - else if ( pml.walking ) + else if (pml.walking) {// walking on ground vec3_t oldOrg; - VectorCopy( pm->ps->origin, oldOrg ); + VectorCopy(pm->ps->origin, oldOrg); PM_WalkMove(); - float threshHold = 0.001f, movedDist = DistanceSquared( oldOrg, pm->ps->origin ); - if ( PM_StandingAnim( pm->ps->legsAnim ) || pm->ps->legsAnim == BOTH_CROUCH1 ) + float threshHold = 0.001f, movedDist = DistanceSquared(oldOrg, pm->ps->origin); + if (PM_StandingAnim(pm->ps->legsAnim) || pm->ps->legsAnim == BOTH_CROUCH1) { threshHold = 0.005f; } - if ( movedDist < threshHold ) + if (movedDist < threshHold) {//didn't move, play no legs anim - // pm->cmd.forwardmove = pm->cmd.rightmove = 0; + // pm->cmd.forwardmove = pm->cmd.rightmove = 0; } - } - else + } + else { - if ( pm->ps->gravity <= 0 ) + if (pm->ps->gravity <= 0) { PM_FlyMove(); } @@ -14983,16 +14999,16 @@ void Pmove( pmove_t *pmove ) //PM_Animate(); // If we didn't move at all, then why bother doing this again -MW. - if(!(VectorCompare(pm->ps->origin,pml.previous_origin))) + if (!(VectorCompare(pm->ps->origin, pml.previous_origin))) { PM_GroundTrace(); - if ( Flying == FLY_HOVER ) + if (Flying == FLY_HOVER) {//never stick to the ground PM_HoverTrace(); } } - if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + if (pm->ps->groundEntityNum != ENTITYNUM_NONE) {//on ground pm->ps->forceJumpZStart = 0; pm->ps->jumpZStart = 0; @@ -15000,19 +15016,19 @@ void Pmove( pmove_t *pmove ) pm->ps->pm_flags &= ~PMF_TRIGGER_PUSHED; pm->ps->pm_flags &= ~PMF_SLOW_MO_FALL; } - + // If we didn't move at all, then why bother doing this again -MW. // Note: ok, so long as we don't have water levels that change. - if(!(VectorCompare(pm->ps->origin,pml.previous_origin))) + if (!(VectorCompare(pm->ps->origin, pml.previous_origin))) { - PM_SetWaterLevelAtPoint( pm->ps->origin, &pm->waterlevel, &pm->watertype ); + PM_SetWaterLevelAtPoint(pm->ps->origin, &pm->waterlevel, &pm->watertype); PM_SetWaterHeight(); } -// PM_ForcePower(); sends event to client for client side fx, not used + // PM_ForcePower(); sends event to client for client side fx, not used // If we're a vehicle, do our special weapon function. - if ( pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE ) + if (pm->gent && pm->gent->client && pm->gent->client->NPC_class == CLASS_VEHICLE) { pVeh = pm->gent->m_pVehicle; @@ -15025,19 +15041,19 @@ void Pmove( pmove_t *pmove ) } } // If we are riding a vehicle... - else if ( PM_RidingVehicle() ) + else if (PM_RidingVehicle()) { - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) + if (pm->cmd.buttons & BUTTON_ALT_ATTACK) {// alt attack always does other stuff when riding a vehicle (turbo) } - else if ( (pm->ps->eFlags&EF_NODRAW) ) + else if ((pm->ps->eFlags&EF_NODRAW)) {//inside a vehicle? don't do any weapon stuff } - else if ( pm->ps->weapon == WP_BLASTER//using blaster - || pm->ps->weapon == WP_THERMAL//using thermal - || pm->ps->weaponstate == WEAPON_DROPPING//changing weapon - dropping - || pm->ps->weaponstate == WEAPON_RAISING//changing weapon - raising - || (pm->cmd.weapon != pm->ps->weapon && PM_WeaponOkOnVehicle( pm->cmd.weapon )) )//FIXME: make this a vehicle call to see if this new weapon is valid for this vehicle + else if (pm->ps->weapon == WP_BLASTER//using blaster + || pm->ps->weapon == WP_THERMAL//using thermal + || pm->ps->weaponstate == WEAPON_DROPPING//changing weapon - dropping + || pm->ps->weaponstate == WEAPON_RAISING//changing weapon - raising + || (pm->cmd.weapon != pm->ps->weapon && PM_WeaponOkOnVehicle(pm->cmd.weapon)))//FIXME: make this a vehicle call to see if this new weapon is valid for this vehicle {//either weilding a weapon we can fire with normal weapon logic, or trying to change to a valid weapon // call normal weapons code... should we override the normal fire anims with vehicle fire anims in here or in a subsequent call to VehicleWeapons or something? //Maybe break PM_Weapon into PM_Weapon and PM_WeaponAnimate (then call our own PM_VehicleWeaponAnimate)? @@ -15051,7 +15067,7 @@ void Pmove( pmove_t *pmove ) // weapons PM_Weapon(); } - if ( pm->cmd.buttons & BUTTON_ATTACK ) + if (pm->cmd.buttons & BUTTON_ATTACK) { pm->ps->pm_flags |= PMF_ATTACK_HELD; } @@ -15059,7 +15075,7 @@ void Pmove( pmove_t *pmove ) { pm->ps->pm_flags &= ~PMF_ATTACK_HELD; } - if ( pm->cmd.buttons & BUTTON_ALT_ATTACK ) + if (pm->cmd.buttons & BUTTON_ALT_ATTACK) { pm->ps->pm_flags |= PMF_ALT_ATTACK_HELD; } @@ -15067,7 +15083,7 @@ void Pmove( pmove_t *pmove ) { pm->ps->pm_flags &= ~PMF_ALT_ATTACK_HELD; } - if ( pm->cmd.buttons & BUTTON_FORCE_FOCUS ) + if (pm->cmd.buttons & BUTTON_FORCE_FOCUS) { pm->ps->pm_flags |= PMF_FORCE_FOCUS_HELD; } @@ -15076,7 +15092,7 @@ void Pmove( pmove_t *pmove ) pm->ps->pm_flags &= ~PMF_FORCE_FOCUS_HELD; } - if ( pm->gent )//&& pm->gent->s.number == 0 )//player only? + if (pm->gent)//&& pm->gent->s.number == 0 )//player only? { // Use PM_Use(); @@ -15084,7 +15100,7 @@ void Pmove( pmove_t *pmove ) // Calculate the resulting speed of the last pmove //------------------------------------------------- - if ( pm->gent ) + if (pm->gent) { pm->gent->resultspeed = ((Distance(pm->ps->origin, pm->gent->currentOrigin) / pml.msec) * 1000); if (pm->gent->resultspeed>5.0f) @@ -15105,28 +15121,28 @@ void Pmove( pmove_t *pmove ) //================================ // TEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMPTEMP - if ( pm->gent && pm->ps && pm->ps->eFlags & EF_LOCKED_TO_WEAPON ) + if (pm->gent && pm->ps && pm->ps->eFlags & EF_LOCKED_TO_WEAPON) { - if ( pm->gent->owner && pm->gent->owner->e_UseFunc == useF_emplaced_gun_use )//ugly way to tell, but... + if (pm->gent->owner && pm->gent->owner->e_UseFunc == useF_emplaced_gun_use)//ugly way to tell, but... {//full body - PM_SetAnim(pm,SETANIM_BOTH,BOTH_GUNSIT1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + PM_SetAnim(pm, SETANIM_BOTH, BOTH_GUNSIT1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL } else {//stand (or could be overridden by strafe anims) - PM_SetAnim(pm,SETANIM_LEGS,BOTH_STAND1,SETANIM_FLAG_NORMAL); + PM_SetAnim(pm, SETANIM_LEGS, BOTH_STAND1, SETANIM_FLAG_NORMAL); } } - else if ( pm->gent && pm->ps && (pm->ps->eFlags&EF_HELD_BY_RANCOR) ) + else if (pm->gent && pm->ps && (pm->ps->eFlags&EF_HELD_BY_RANCOR)) { - PM_SetAnim(pm,SETANIM_LEGS,BOTH_SWIM_IDLE1,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL + PM_SetAnim(pm, SETANIM_LEGS, BOTH_SWIM_IDLE1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD);//SETANIM_FLAG_NORMAL } // If we are a vehicle, animate... - else if ( pVeh ) + else if (pVeh) { - pVeh->m_pVehicleInfo->Animate( pVeh ); + pVeh->m_pVehicleInfo->Animate(pVeh); } // If we're riding a vehicle, don't do anything!. - else if ( ( pVeh = PM_RidingVehicle() ) != 0 ) + else if ((pVeh = PM_RidingVehicle()) != 0) { PM_CheckInVehicleSaberAttackAnim(); } @@ -15136,7 +15152,7 @@ void Pmove( pmove_t *pmove ) PM_Footsteps(); } // torso animation - if ( !pVeh ) + if (!pVeh) {//not riding a vehicle PM_TorsoAnimation(); } @@ -15147,15 +15163,15 @@ void Pmove( pmove_t *pmove ) // snap some parts of playerstate to save network bandwidth // SnapVector( pm->ps->velocity ); - if ( !pm->cmd.rightmove && !pm->cmd.forwardmove && pm->cmd.upmove <= 0 ) + if (!pm->cmd.rightmove && !pm->cmd.forwardmove && pm->cmd.upmove <= 0) { - if ( VectorCompare( pm->ps->velocity, vec3_origin ) ) + if (VectorCompare(pm->ps->velocity, vec3_origin)) { pm->ps->lastStationary = level.time; } } - if ( pm->ps->pm_flags & PMF_SLOW_MO_FALL ) + if (pm->ps->pm_flags & PMF_SLOW_MO_FALL) {//half grav pm->ps->gravity *= 2; } diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index f7bc772225..d65a5d5e84 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -1,20 +1,24 @@ /* -This file is part of Jedi Academy. +=========================================================================== +Copyright (C) 2000 - 2013, Raven Software, Inc. +Copyright (C) 2001 - 2013, Activision, Inc. +Copyright (C) 2013 - 2015, OpenJK contributors - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. +This file is part of the OpenJK source code. - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +OpenJK is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . +=========================================================================== */ -// Copyright 2001-2013 Raven Software #include "g_local.h" #include "anims.h" @@ -39,7 +43,7 @@ static float dmgFraction[MAX_SABER_VICTIMS]; static int hitLoc[MAX_SABER_VICTIMS]; static qboolean hitDismember[MAX_SABER_VICTIMS]; static int hitDismemberLoc[MAX_SABER_VICTIMS]; -static vec3_t saberHitLocation, saberHitNormal={0,0,1.0}; +static vec3_t saberHitLocation, saberHitNormal = { 0, 0, 1.0 }; static float saberHitFraction; static float sabersCrossed; static int saberHitEntity; @@ -59,109 +63,109 @@ extern cvar_t *g_saberPickuppableDroppedSabers; extern cvar_t *debug_subdivision; -extern qboolean WP_SaberBladeUseSecondBladeStyle( saberInfo_t *saber, int bladeNum ); -extern qboolean WP_SaberBladeDoTransitionDamage( saberInfo_t *saber, int bladeNum ); -extern qboolean Q3_TaskIDPending( gentity_t *ent, taskID_t taskType ); -extern qboolean G_ClearViewEntity( gentity_t *ent ); -extern void G_SetViewEntity( gentity_t *self, gentity_t *viewEntity ); -extern qboolean G_ControlledByPlayer( gentity_t *self ); -extern void G_AddVoiceEvent( gentity_t *self, int event, int speakDebounceTime ); -extern void CG_ChangeWeapon( int num ); -extern void CG_SaberDoWeaponHitMarks( gclient_t *client, gentity_t *saberEnt, gentity_t *hitEnt, int saberNum, int bladeNum, vec3_t hitPos, vec3_t hitDir, vec3_t uaxis, vec3_t splashBackDir, float sizeTimeScale ); -extern void G_AngerAlert( gentity_t *self ); -extern void G_ReflectMissile( gentity_t *ent, gentity_t *missile, vec3_t forward, forcePowers_t powerToUse ); -extern int G_CheckLedgeDive( gentity_t *self, float checkDist, const vec3_t checkVel, qboolean tryOpposite, qboolean tryPerp ); -extern void G_BounceMissile( gentity_t *ent, trace_t *trace ); -extern qboolean G_PointInBounds( const vec3_t point, const vec3_t mins, const vec3_t maxs ); -extern void NPC_UseResponse( gentity_t *self, gentity_t *user, qboolean useWhenDone ); -extern void WP_FireDreadnoughtBeam( gentity_t *ent ); -extern void G_MissileImpacted( gentity_t *ent, gentity_t *other, vec3_t impactPos, vec3_t normal, int hitLoc=HL_NONE ); -extern evasionType_t Jedi_SaberBlockGo( gentity_t *self, usercmd_t *cmd, vec3_t pHitloc, vec3_t phitDir, gentity_t *incoming, float dist = 0.0f ); -extern void Jedi_RageStop( gentity_t *self ); -extern int PM_PickAnim( gentity_t *self, int minAnim, int maxAnim ); -extern void NPC_SetPainEvent( gentity_t *self ); -extern qboolean PM_SwimmingAnim( int anim ); -extern qboolean PM_InAnimForSaberMove( int anim, int saberMove ); -extern qboolean PM_SpinningSaberAnim( int anim ); -extern qboolean PM_SaberInSpecialAttack( int anim ); -extern qboolean PM_SaberInAttack( int move ); -extern qboolean PM_SaberInAttackPure( int move ); -extern qboolean PM_SaberInTransition( int move ); -extern qboolean PM_SaberInStart( int move ); -extern qboolean PM_SaberInTransitionAny( int move ); -extern qboolean PM_SaberInReturn( int move ); -extern qboolean PM_SaberInBounce( int move ); -extern qboolean PM_SaberInParry( int move ); -extern qboolean PM_SaberInKnockaway( int move ); -extern qboolean PM_SaberInBrokenParry( int move ); -extern qboolean PM_SpinningSaberAnim( int anim ); -extern saberMoveName_t PM_SaberBounceForAttack( int move ); -extern saberMoveName_t PM_BrokenParryForAttack( int move ); -extern saberMoveName_t PM_KnockawayForParry( int move ); -extern qboolean PM_FlippingAnim( int anim ); -extern qboolean PM_RollingAnim( int anim ); -extern qboolean PM_CrouchAnim( int anim ); -extern qboolean PM_SaberInIdle( int move ); -extern qboolean PM_SaberInReflect( int move ); -extern qboolean PM_InSpecialJump( int anim ); -extern qboolean PM_InKnockDown( playerState_t *ps ); -extern qboolean PM_ForceUsingSaberAnim( int anim ); -extern qboolean PM_SuperBreakLoseAnim( int anim ); -extern qboolean PM_SuperBreakWinAnim( int anim ); -extern qboolean PM_SaberLockBreakAnim( int anim ); -extern qboolean PM_InOnGroundAnim ( playerState_t *ps ); -extern qboolean PM_KnockDownAnim( int anim ); -extern qboolean PM_SaberInKata( saberMoveName_t saberMove ); -extern qboolean PM_StabDownAnim( int anim ); -extern int PM_PowerLevelForSaberAnim( playerState_t *ps, int saberNum = 0 ); -extern void PM_VelocityForSaberMove( playerState_t *ps, vec3_t throwDir ); -extern qboolean PM_VelocityForBlockedMove( playerState_t *ps, vec3_t throwDir ); -extern qboolean PM_SaberCanInterruptMove( int move, int anim ); -extern int Jedi_ReCalcParryTime( gentity_t *self, evasionType_t evasionType ); -extern qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, int hitLoc ); -extern void Jedi_PlayDeflectSound( gentity_t *self ); -extern void Jedi_PlayBlockedPushSound( gentity_t *self ); -extern qboolean Jedi_WaitingAmbush( gentity_t *self ); -extern void Jedi_Ambush( gentity_t *self ); -extern qboolean Jedi_SaberBusy( gentity_t *self ); -extern qboolean Jedi_CultistDestroyer( gentity_t *self ); -extern qboolean Boba_Flying( gentity_t *self ); -extern void JET_FlyStart( gentity_t *self ); -extern void Boba_DoFlameThrower( gentity_t *self ); -extern void Boba_StopFlameThrower( gentity_t *self ); - -extern Vehicle_t *G_IsRidingVehicle( gentity_t *ent ); -extern int SaberDroid_PowerLevelForSaberAnim( gentity_t *self ); -extern qboolean G_ValidEnemy( gentity_t *self, gentity_t *enemy ); -extern void G_StartMatrixEffect( gentity_t *ent, int meFlags = 0, int length = 1000, float timeScale = 0.0f, int spinTime = 0 ); -extern int PM_AnimLength( int index, animNumber_t anim ); -extern void G_Knockdown( gentity_t *self, gentity_t *attacker, const vec3_t pushDir, float strength, qboolean breakSaberLock ); -extern void G_KnockOffVehicle( gentity_t *pRider, gentity_t *self, qboolean bPull ); -extern qboolean PM_LockedAnim( int anim ); -extern qboolean Rosh_BeingHealed( gentity_t *self ); -extern qboolean G_OkayToLean( playerState_t *ps, usercmd_t *cmd, qboolean interruptOkay ); +extern qboolean WP_SaberBladeUseSecondBladeStyle(saberInfo_t *saber, int bladeNum); +extern qboolean WP_SaberBladeDoTransitionDamage(saberInfo_t *saber, int bladeNum); +extern qboolean Q3_TaskIDPending(gentity_t *ent, taskID_t taskType); +extern qboolean G_ClearViewEntity(gentity_t *ent); +extern void G_SetViewEntity(gentity_t *self, gentity_t *viewEntity); +extern qboolean G_ControlledByPlayer(gentity_t *self); +extern void G_AddVoiceEvent(gentity_t *self, int event, int speakDebounceTime); +extern void CG_ChangeWeapon(int num); +extern void CG_SaberDoWeaponHitMarks(gclient_t *client, gentity_t *saberEnt, gentity_t *hitEnt, int saberNum, int bladeNum, vec3_t hitPos, vec3_t hitDir, vec3_t uaxis, vec3_t splashBackDir, float sizeTimeScale); +extern void G_AngerAlert(gentity_t *self); +extern void G_ReflectMissile(gentity_t *ent, gentity_t *missile, vec3_t forward, forcePowers_t powerToUse); +extern int G_CheckLedgeDive(gentity_t *self, float checkDist, const vec3_t checkVel, qboolean tryOpposite, qboolean tryPerp); +extern void G_BounceMissile(gentity_t *ent, trace_t *trace); +extern qboolean G_PointInBounds(const vec3_t point, const vec3_t mins, const vec3_t maxs); +extern void NPC_UseResponse(gentity_t *self, gentity_t *user, qboolean useWhenDone); +extern void WP_FireDreadnoughtBeam(gentity_t *ent); +extern void G_MissileImpacted(gentity_t *ent, gentity_t *other, vec3_t impactPos, vec3_t normal, int hitLoc = HL_NONE); +extern evasionType_t Jedi_SaberBlockGo(gentity_t *self, usercmd_t *cmd, vec3_t pHitloc, vec3_t phitDir, gentity_t *incoming, float dist = 0.0f); +extern void Jedi_RageStop(gentity_t *self); +extern int PM_PickAnim(gentity_t *self, int minAnim, int maxAnim); +extern void NPC_SetPainEvent(gentity_t *self); +extern qboolean PM_SwimmingAnim(int anim); +extern qboolean PM_InAnimForSaberMove(int anim, int saberMove); +extern qboolean PM_SpinningSaberAnim(int anim); +extern qboolean PM_SaberInSpecialAttack(int anim); +extern qboolean PM_SaberInAttack(int move); +extern qboolean PM_SaberInAttackPure(int move); +extern qboolean PM_SaberInTransition(int move); +extern qboolean PM_SaberInStart(int move); +extern qboolean PM_SaberInTransitionAny(int move); +extern qboolean PM_SaberInReturn(int move); +extern qboolean PM_SaberInBounce(int move); +extern qboolean PM_SaberInParry(int move); +extern qboolean PM_SaberInKnockaway(int move); +extern qboolean PM_SaberInBrokenParry(int move); +extern qboolean PM_SpinningSaberAnim(int anim); +extern saberMoveName_t PM_SaberBounceForAttack(int move); +extern saberMoveName_t PM_BrokenParryForAttack(int move); +extern saberMoveName_t PM_KnockawayForParry(int move); +extern qboolean PM_FlippingAnim(int anim); +extern qboolean PM_RollingAnim(int anim); +extern qboolean PM_CrouchAnim(int anim); +extern qboolean PM_SaberInIdle(int move); +extern qboolean PM_SaberInReflect(int move); +extern qboolean PM_InSpecialJump(int anim); +extern qboolean PM_InKnockDown(playerState_t *ps); +extern qboolean PM_ForceUsingSaberAnim(int anim); +extern qboolean PM_SuperBreakLoseAnim(int anim); +extern qboolean PM_SuperBreakWinAnim(int anim); +extern qboolean PM_SaberLockBreakAnim(int anim); +extern qboolean PM_InOnGroundAnim(playerState_t *ps); +extern qboolean PM_KnockDownAnim(int anim); +extern qboolean PM_SaberInKata(saberMoveName_t saberMove); +extern qboolean PM_StabDownAnim(int anim); +extern int PM_PowerLevelForSaberAnim(playerState_t *ps, int saberNum = 0); +extern void PM_VelocityForSaberMove(playerState_t *ps, vec3_t throwDir); +extern qboolean PM_VelocityForBlockedMove(playerState_t *ps, vec3_t throwDir); +extern qboolean PM_SaberCanInterruptMove(int move, int anim); +extern int Jedi_ReCalcParryTime(gentity_t *self, evasionType_t evasionType); +extern qboolean Jedi_DodgeEvasion(gentity_t *self, gentity_t *shooter, trace_t *tr, int hitLoc); +extern void Jedi_PlayDeflectSound(gentity_t *self); +extern void Jedi_PlayBlockedPushSound(gentity_t *self); +extern qboolean Jedi_WaitingAmbush(gentity_t *self); +extern void Jedi_Ambush(gentity_t *self); +extern qboolean Jedi_SaberBusy(gentity_t *self); +extern qboolean Jedi_CultistDestroyer(gentity_t *self); +extern qboolean Boba_Flying(gentity_t *self); +extern void JET_FlyStart(gentity_t *self); +extern void Boba_DoFlameThrower(gentity_t *self); +extern void Boba_StopFlameThrower(gentity_t *self); + +extern Vehicle_t *G_IsRidingVehicle(gentity_t *ent); +extern int SaberDroid_PowerLevelForSaberAnim(gentity_t *self); +extern qboolean G_ValidEnemy(gentity_t *self, gentity_t *enemy); +extern void G_StartMatrixEffect(gentity_t *ent, int meFlags = 0, int length = 1000, float timeScale = 0.0f, int spinTime = 0); +extern int PM_AnimLength(int index, animNumber_t anim); +extern void G_Knockdown(gentity_t *self, gentity_t *attacker, const vec3_t pushDir, float strength, qboolean breakSaberLock); +extern void G_KnockOffVehicle(gentity_t *pRider, gentity_t *self, qboolean bPull); +extern qboolean PM_LockedAnim(int anim); +extern qboolean Rosh_BeingHealed(gentity_t *self); +extern qboolean G_OkayToLean(playerState_t *ps, usercmd_t *cmd, qboolean interruptOkay); int WP_AbsorbConversion(gentity_t *attacked, int atdAbsLevel, gentity_t *attacker, int atPower, int atPowerLevel, int atForceSpent); -void WP_ForcePowerStart( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); -void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ); -qboolean WP_ForcePowerUsable( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); -void WP_SaberInFlightReflectCheck( gentity_t *self, usercmd_t *ucmd ); - -void WP_SaberDrop( gentity_t *self, gentity_t *saber ); -qboolean WP_SaberLose( gentity_t *self, vec3_t throwDir ); -void WP_SaberReturn( gentity_t *self, gentity_t *saber ); -void WP_SaberBlockNonRandom( gentity_t *self, vec3_t hitloc, qboolean missileBlock ); -qboolean WP_ForcePowerAvailable( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); -void WP_ForcePowerDrain( gentity_t *self, forcePowers_t forcePower, int overrideAmt ); -void WP_DeactivateSaber( gentity_t *self, qboolean clearLength = qfalse ); -qboolean FP_ForceDrainGrippableEnt( gentity_t *victim ); +void WP_ForcePowerStart(gentity_t *self, forcePowers_t forcePower, int overrideAmt); +void WP_ForcePowerStop(gentity_t *self, forcePowers_t forcePower); +qboolean WP_ForcePowerUsable(gentity_t *self, forcePowers_t forcePower, int overrideAmt); +void WP_SaberInFlightReflectCheck(gentity_t *self, usercmd_t *ucmd); + +void WP_SaberDrop(gentity_t *self, gentity_t *saber); +qboolean WP_SaberLose(gentity_t *self, vec3_t throwDir); +void WP_SaberReturn(gentity_t *self, gentity_t *saber); +void WP_SaberBlockNonRandom(gentity_t *self, vec3_t hitloc, qboolean missileBlock); +qboolean WP_ForcePowerAvailable(gentity_t *self, forcePowers_t forcePower, int overrideAmt); +void WP_ForcePowerDrain(gentity_t *self, forcePowers_t forcePower, int overrideAmt); +void WP_DeactivateSaber(gentity_t *self, qboolean clearLength = qfalse); +qboolean FP_ForceDrainGrippableEnt(gentity_t *victim); extern cvar_t *g_saberAutoBlocking; extern cvar_t *g_saberRealisticCombat; extern cvar_t *g_saberDamageCapping; extern cvar_t *g_saberNewControlScheme; extern cvar_t *g_saberNewCombat; -extern cvar_t *g_saberLocksEnabled; +extern cvar_t *g_saberLocksEnabled; extern cvar_t *g_saberDamageScale; extern int g_crosshairEntNum; @@ -171,11 +175,11 @@ int g_saberFlashTime = 0; //new variables - Dusty const int hitOwnerRecoveryInterval = 1500; //interval at which defense points are recovered, 1.5 seconds -/*extern int hitOwnerBreakLimit; +/*extern int hitOwnerBreakLimit; extern int hitOwnerRecoveryTime; //how long left to recover a defense point extern int hitOwnerBreakCounter; //keeping track of how many strong attacks the defender blocks in a //a short time period*/ -vec3_t g_saberFlashPos = {0,0,0}; +vec3_t g_saberFlashPos = { 0, 0, 0 }; int forcePowerDarkLight[NUM_FORCE_POWERS] = //0 == neutral { //nothing should be usable at rank 0.. @@ -199,7 +203,7 @@ int forcePowerDarkLight[NUM_FORCE_POWERS] = //0 == neutral //NUM_FORCE_POWERS }; -int forcePowerNeeded[NUM_FORCE_POWERS] = +int forcePowerNeeded[NUM_FORCE_POWERS] = { 0,//FP_HEAL,//instant 10,//FP_LEVITATION,//hold/duration @@ -221,7 +225,7 @@ int forcePowerNeeded[NUM_FORCE_POWERS] = //NUM_FORCE_POWERS }; -float forceJumpStrength[NUM_FORCE_POWER_LEVELS] = +float forceJumpStrength[NUM_FORCE_POWER_LEVELS] = { JUMP_VELOCITY,//normal jump 420, @@ -229,15 +233,15 @@ float forceJumpStrength[NUM_FORCE_POWER_LEVELS] = 840 }; -float forceJumpHeight[NUM_FORCE_POWER_LEVELS] = +float forceJumpHeight[NUM_FORCE_POWER_LEVELS] = { 32,//normal jump (+stepheight+crouchdiff = 66) - 96*1.25,//(+stepheight+crouchdiff = 130) - 192*1.25,//(+stepheight+crouchdiff = 226) - 384*1.25//(+stepheight+crouchdiff = 418) //384 + 96 * 1.25,//(+stepheight+crouchdiff = 130) + 192 * 1.25,//(+stepheight+crouchdiff = 226) + 384 * 1.25//(+stepheight+crouchdiff = 418) //384 }; -float forceJumpHeightMax[NUM_FORCE_POWER_LEVELS] = +float forceJumpHeightMax[NUM_FORCE_POWER_LEVELS] = { 66,//normal jump (32+stepheight(18)+crouchdiff(24) = 74) 130,//(96+stepheight(18)+crouchdiff(24) = 138) @@ -345,159 +349,159 @@ float saberAnimSpeedMod[NUM_FORCE_POWER_LEVELS] = stringID_table_t SaberStyleTable[] = { - { "NULL",SS_NONE }, + { "NULL", SS_NONE }, ENUM2STRING(SS_FAST), - { "fast",SS_FAST }, + { "fast", SS_FAST }, ENUM2STRING(SS_MEDIUM), - { "medium",SS_MEDIUM }, + { "medium", SS_MEDIUM }, ENUM2STRING(SS_STRONG), - { "strong",SS_STRONG }, + { "strong", SS_STRONG }, ENUM2STRING(SS_DESANN), - { "desann",SS_DESANN }, + { "desann", SS_DESANN }, ENUM2STRING(SS_TAVION), - { "tavion",SS_TAVION }, + { "tavion", SS_TAVION }, ENUM2STRING(SS_DUAL), - { "dual",SS_DUAL }, + { "dual", SS_DUAL }, ENUM2STRING(SS_STAFF), - { "staff",SS_STAFF }, + { "staff", SS_STAFF }, { "", 0 }, }; //SABER INITIALIZATION====================================================================== -void G_CreateG2AttachedWeaponModel( gentity_t *ent, const char *psWeaponModel, int boltNum, int weaponNum ) +void G_CreateG2AttachedWeaponModel(gentity_t *ent, const char *psWeaponModel, int boltNum, int weaponNum) { if (!psWeaponModel) { - assert (psWeaponModel); + assert(psWeaponModel); return; } - if ( ent->playerModel == -1 ) + if (ent->playerModel == -1) { return; } - if ( boltNum == -1 ) + if (boltNum == -1) { return; } - if ( ent && ent->client && ent->client->NPC_class == CLASS_GALAKMECH ) + if (ent && ent->client && ent->client->NPC_class == CLASS_GALAKMECH) {//hack for galakmech, no weaponmodel ent->weaponModel[0] = ent->weaponModel[1] = -1; return; } - if ( weaponNum < 0 || weaponNum >= MAX_INHAND_WEAPONS ) + if (weaponNum < 0 || weaponNum >= MAX_INHAND_WEAPONS) { return; } char weaponModel[64]; - strcpy (weaponModel, psWeaponModel); - if (char *spot = strstr(weaponModel, ".md3") ) { + strcpy(weaponModel, psWeaponModel); + if (char *spot = strstr(weaponModel, ".md3")) { *spot = 0; spot = strstr(weaponModel, "_w");//i'm using the in view weapon array instead of scanning the item list, so put the _w back on - if (!spot&&!strstr(weaponModel, "noweap")) + if (!spot&&!strstr(weaponModel, "noweap")) { - strcat (weaponModel, "_w"); + strcat(weaponModel, "_w"); } - strcat (weaponModel, ".glm"); //and change to ghoul2 + strcat(weaponModel, ".glm"); //and change to ghoul2 } // give us a saber model - int wModelIndex = G_ModelIndex( weaponModel ); - if ( wModelIndex ) + int wModelIndex = G_ModelIndex(weaponModel); + if (wModelIndex) { - ent->weaponModel[weaponNum] = gi.G2API_InitGhoul2Model(ent->ghoul2, weaponModel, wModelIndex, NULL_HANDLE, NULL_HANDLE, 0, 0 ); - if ( ent->weaponModel[weaponNum] != -1 ) + ent->weaponModel[weaponNum] = gi.G2API_InitGhoul2Model(ent->ghoul2, weaponModel, wModelIndex, NULL_HANDLE, NULL_HANDLE, 0, 0); + if (ent->weaponModel[weaponNum] != -1) { // attach it to the hand - gi.G2API_AttachG2Model(&ent->ghoul2[ent->weaponModel[weaponNum]], &ent->ghoul2[ent->playerModel], - boltNum, ent->playerModel); + gi.G2API_AttachG2Model(&ent->ghoul2[ent->weaponModel[weaponNum]], &ent->ghoul2[ent->playerModel], + boltNum, ent->playerModel); // set up a bolt on the end so we can get where the sabre muzzle is - we can assume this is always bolt 0 gi.G2API_AddBolt(&ent->ghoul2[ent->weaponModel[weaponNum]], "*flash"); - //gi.G2API_SetLodBias( &ent->ghoul2[ent->weaponModel[weaponNum]], 0 ); + //gi.G2API_SetLodBias( &ent->ghoul2[ent->weaponModel[weaponNum]], 0 ); } } } -void WP_SaberAddG2SaberModels( gentity_t *ent, int specificSaberNum ) +void WP_SaberAddG2SaberModels(gentity_t *ent, int specificSaberNum) { int saberNum = 0, maxSaber = 1; - if ( specificSaberNum != -1 && specificSaberNum <= maxSaber ) + if (specificSaberNum != -1 && specificSaberNum <= maxSaber) { saberNum = maxSaber = specificSaberNum; } - for ( ; saberNum <= maxSaber; saberNum++ ) + for (; saberNum <= maxSaber; saberNum++) { - if ( ent->weaponModel[saberNum] > 0 ) + if (ent->weaponModel[saberNum] > 0) {//we already have a weapon model in this slot //remove it - gi.G2API_SetSkin( &ent->ghoul2[ent->weaponModel[saberNum]], -1, 0 ); - gi.G2API_RemoveGhoul2Model( ent->ghoul2, ent->weaponModel[saberNum] ); + gi.G2API_SetSkin(&ent->ghoul2[ent->weaponModel[saberNum]], -1, 0); + gi.G2API_RemoveGhoul2Model(ent->ghoul2, ent->weaponModel[saberNum]); ent->weaponModel[saberNum] = -1; } - if ( saberNum > 0 ) + if (saberNum > 0) {//second saber - if ( !ent->client->ps.dualSabers - || G_IsRidingVehicle( ent ) ) + if (!ent->client->ps.dualSabers + || G_IsRidingVehicle(ent)) {//only have one saber or riding a vehicle and can only use one saber return; } } - else if ( saberNum == 0 ) + else if (saberNum == 0) {//first saber - if ( ent->client->ps.saberInFlight ) + if (ent->client->ps.saberInFlight) {//it's still out there somewhere, don't add it //FIXME: call it back? continue; } } int handBolt = ((saberNum == 0) ? ent->handRBolt : ent->handLBolt); - if ( (ent->client->ps.saber[saberNum].saberFlags&SFL_BOLT_TO_WRIST) ) + if ((ent->client->ps.saber[saberNum].saberFlags&SFL_BOLT_TO_WRIST)) {//special case, bolt to forearm - if ( saberNum == 0 ) + if (saberNum == 0) { - handBolt = gi.G2API_AddBolt( &ent->ghoul2[ent->playerModel], "*r_hand_cap_r_arm" ); + handBolt = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*r_hand_cap_r_arm"); } else { - handBolt = gi.G2API_AddBolt( &ent->ghoul2[ent->playerModel], "*l_hand_cap_l_arm" ); + handBolt = gi.G2API_AddBolt(&ent->ghoul2[ent->playerModel], "*l_hand_cap_l_arm"); } } - G_CreateG2AttachedWeaponModel( ent, ent->client->ps.saber[saberNum].model, handBolt, saberNum ); + G_CreateG2AttachedWeaponModel(ent, ent->client->ps.saber[saberNum].model, handBolt, saberNum); - if ( ent->client->ps.saber[saberNum].skin != NULL ) + if (ent->client->ps.saber[saberNum].skin != NULL) {//if this saber has a customSkin, use it // lets see if it's out there - int saberSkin = gi.RE_RegisterSkin( ent->client->ps.saber[saberNum].skin ); - if ( saberSkin ) + int saberSkin = gi.RE_RegisterSkin(ent->client->ps.saber[saberNum].skin); + if (saberSkin) { // put it in the config strings // and set the ghoul2 model to use it - gi.G2API_SetSkin( &ent->ghoul2[ent->weaponModel[saberNum]], G_SkinIndex( ent->client->ps.saber[saberNum].skin ), saberSkin ); + gi.G2API_SetSkin(&ent->ghoul2[ent->weaponModel[saberNum]], G_SkinIndex(ent->client->ps.saber[saberNum].skin), saberSkin); } } } } //---------------------------------------------------------- -void G_Throw( gentity_t *targ, const vec3_t newDir, float push ) +void G_Throw(gentity_t *targ, const vec3_t newDir, float push) //---------------------------------------------------------- { vec3_t kvel; float mass; - if ( targ - && targ->client - && ( targ->client->NPC_class == CLASS_ATST - || targ->client->NPC_class == CLASS_RANCOR - || targ->client->NPC_class == CLASS_SAND_CREATURE ) ) + if (targ + && targ->client + && (targ->client->NPC_class == CLASS_ATST + || targ->client->NPC_class == CLASS_RANCOR + || targ->client->NPC_class == CLASS_SAND_CREATURE)) {//much to large to *ever* throw return; } - if ( targ->physicsBounce > 0 ) //overide the mass + if (targ->physicsBounce > 0) //overide the mass { mass = targ->physicsBounce; } @@ -506,43 +510,43 @@ void G_Throw( gentity_t *targ, const vec3_t newDir, float push ) mass = 200; } - if ( g_gravity->value > 0 ) + if (g_gravity->value > 0) { - VectorScale( newDir, g_knockback->value * (float)push / mass * 0.8, kvel ); - if ( !targ->client || targ->client->ps.groundEntityNum != ENTITYNUM_NONE ) + VectorScale(newDir, g_knockback->value * (float)push / mass * 0.8, kvel); + if (!targ->client || targ->client->ps.groundEntityNum != ENTITYNUM_NONE) {//give them some z lift to get them off the ground kvel[2] = newDir[2] * g_knockback->value * (float)push / mass * 1.5; } } else { - VectorScale( newDir, g_knockback->value * (float)push / mass, kvel ); + VectorScale(newDir, g_knockback->value * (float)push / mass, kvel); } - if ( targ->client ) + if (targ->client) { - VectorAdd( targ->client->ps.velocity, kvel, targ->client->ps.velocity ); + VectorAdd(targ->client->ps.velocity, kvel, targ->client->ps.velocity); } - else if ( targ->s.pos.trType != TR_STATIONARY && targ->s.pos.trType != TR_LINEAR_STOP && targ->s.pos.trType != TR_NONLINEAR_STOP ) + else if (targ->s.pos.trType != TR_STATIONARY && targ->s.pos.trType != TR_LINEAR_STOP && targ->s.pos.trType != TR_NONLINEAR_STOP) { - VectorAdd( targ->s.pos.trDelta, kvel, targ->s.pos.trDelta ); - VectorCopy( targ->currentOrigin, targ->s.pos.trBase ); + VectorAdd(targ->s.pos.trDelta, kvel, targ->s.pos.trDelta); + VectorCopy(targ->currentOrigin, targ->s.pos.trBase); targ->s.pos.trTime = level.time; } // set the timer so that the other client can't cancel // out the movement immediately - if ( targ->client && !targ->client->ps.pm_time ) + if (targ->client && !targ->client->ps.pm_time) { int t; t = push * 2; - if ( t < 50 ) + if (t < 50) { t = 50; } - if ( t > 200 ) + if (t > 200) { t = 200; } @@ -551,11 +555,11 @@ void G_Throw( gentity_t *targ, const vec3_t newDir, float push ) } } -int WP_SetSaberModel( gclient_t *client, class_t npcClass ) +int WP_SetSaberModel(gclient_t *client, class_t npcClass) {//FIXME: read from NPCs.cfg - if ( client ) + if (client) { - switch ( npcClass ) + switch (npcClass) { case CLASS_DESANN://Desann client->ps.saber[0].model = "models/weapons2/saber_desann/saber_w.glm"; @@ -571,307 +575,307 @@ int WP_SetSaberModel( gclient_t *client, class_t npcClass ) client->ps.saber[0].model = "models/weapons2/saber_reborn/saber_w.glm"; break; } - return ( G_ModelIndex( client->ps.saber[0].model ) ); + return (G_ModelIndex(client->ps.saber[0].model)); } else { - switch ( npcClass ) + switch (npcClass) { case CLASS_DESANN://Desann - return ( G_ModelIndex( "models/weapons2/saber_desann/saber_w.glm" ) ); + return (G_ModelIndex("models/weapons2/saber_desann/saber_w.glm")); break; case CLASS_LUKE://Luke - return ( G_ModelIndex( "models/weapons2/saber_luke/saber_w.glm" ) ); + return (G_ModelIndex("models/weapons2/saber_luke/saber_w.glm")); break; case CLASS_PLAYER://Kyle NPC and player case CLASS_KYLE://Kyle NPC and player - return ( G_ModelIndex( "models/weapons2/saber/saber_w.glm" ) ); + return (G_ModelIndex("models/weapons2/saber/saber_w.glm")); break; default://reborn and tavion and everyone else - return ( G_ModelIndex( "models/weapons2/saber_reborn/saber_w.glm" ) ); + return (G_ModelIndex("models/weapons2/saber_reborn/saber_w.glm")); break; } } } -void WP_SetSaberEntModelSkin( gentity_t *ent, gentity_t *saberent ) +void WP_SetSaberEntModelSkin(gentity_t *ent, gentity_t *saberent) { int saberModel = 0; qboolean newModel = qfalse; //FIXME: get saberModel from NPCs.cfg - if ( !ent->client->ps.saber[0].model ) + if (!ent->client->ps.saber[0].model) { - saberModel = WP_SetSaberModel( ent->client, ent->client->NPC_class ); + saberModel = WP_SetSaberModel(ent->client, ent->client->NPC_class); } else { //got saberModel from NPCs.cfg - saberModel = G_ModelIndex( ent->client->ps.saber[0].model ); + saberModel = G_ModelIndex(ent->client->ps.saber[0].model); } - if ( saberModel && saberent->s.modelindex != saberModel ) + if (saberModel && saberent->s.modelindex != saberModel) { - if ( saberent->playerModel >= 0 ) + if (saberent->playerModel >= 0) {//remove the old one, if there is one - gi.G2API_RemoveGhoul2Model( saberent->ghoul2, saberent->playerModel ); + gi.G2API_RemoveGhoul2Model(saberent->ghoul2, saberent->playerModel); } //add the new one - saberent->playerModel = gi.G2API_InitGhoul2Model( saberent->ghoul2, ent->client->ps.saber[0].model, saberModel, NULL_HANDLE, NULL_HANDLE, 0, 0); - saberent->s.modelindex = saberModel; + saberent->playerModel = gi.G2API_InitGhoul2Model(saberent->ghoul2, ent->client->ps.saber[0].model, saberModel, NULL_HANDLE, NULL_HANDLE, 0, 0); + saberent->s.modelindex = saberModel; newModel = qtrue; } //set skin, too - if ( ent->client->ps.saber[0].skin == NULL ) + if (ent->client->ps.saber[0].skin == NULL) { - gi.G2API_SetSkin( &saberent->ghoul2[0], -1, 0 ); + gi.G2API_SetSkin(&saberent->ghoul2[0], -1, 0); } else {//if this saber has a customSkin, use it // lets see if it's out there - int saberSkin = gi.RE_RegisterSkin( ent->client->ps.saber[0].skin ); - if ( saberSkin && (newModel || saberent->s.modelindex2 != saberSkin) ) + int saberSkin = gi.RE_RegisterSkin(ent->client->ps.saber[0].skin); + if (saberSkin && (newModel || saberent->s.modelindex2 != saberSkin)) { // put it in the config strings // and set the ghoul2 model to use it - gi.G2API_SetSkin( &saberent->ghoul2[0], G_SkinIndex( ent->client->ps.saber[0].skin ), saberSkin ); + gi.G2API_SetSkin(&saberent->ghoul2[0], G_SkinIndex(ent->client->ps.saber[0].skin), saberSkin); saberent->s.modelindex2 = saberSkin; } } } -void WP_SaberFallSound( gentity_t *owner, gentity_t *saber ) +void WP_SaberFallSound(gentity_t *owner, gentity_t *saber) { - if ( !saber ) + if (!saber) { return; } - if ( owner && owner->client ) + if (owner && owner->client) {//have an owner, use their data (assume saberNum is 0 because only the 0 saber can be thrown) - if ( owner->client->ps.saber[0].fallSound[0] ) + if (owner->client->ps.saber[0].fallSound[0]) {//have an override - G_Sound( saber, owner->client->ps.saber[0].fallSound[Q_irand( 0, 2 )] ); + G_Sound(saber, owner->client->ps.saber[0].fallSound[Q_irand(0, 2)]); } - else if ( owner->client->ps.saber[0].type == SABER_SITH_SWORD ) + else if (owner->client->ps.saber[0].type == SABER_SITH_SWORD) {//is a sith sword - G_Sound( saber, G_SoundIndex( va( "sound/weapons/sword/fall%d.wav", Q_irand( 1, 7 ) ) ) ); + G_Sound(saber, G_SoundIndex(va("sound/weapons/sword/fall%d.wav", Q_irand(1, 7)))); } else {//normal saber - G_Sound( saber, G_SoundIndex( va( "sound/weapons/saber/bounce%d.wav", Q_irand( 1, 3 ) ) ) ); + G_Sound(saber, G_SoundIndex(va("sound/weapons/saber/bounce%d.wav", Q_irand(1, 3)))); } } - else if ( saber->NPC_type && saber->NPC_type[0] ) + else if (saber->NPC_type && saber->NPC_type[0]) {//have a saber name to look up saberInfo_t saberInfo; - if ( WP_SaberParseParms( saber->NPC_type, &saberInfo ) ) + if (WP_SaberParseParms(saber->NPC_type, &saberInfo)) {//found it - if ( saberInfo.fallSound[0] ) + if (saberInfo.fallSound[0]) {//have an override sound - G_Sound( saber, saberInfo.fallSound[Q_irand( 0, 2 )] ); + G_Sound(saber, saberInfo.fallSound[Q_irand(0, 2)]); } - else if ( saberInfo.type == SABER_SITH_SWORD ) + else if (saberInfo.type == SABER_SITH_SWORD) {//is a sith sword - G_Sound( saber, G_SoundIndex( va( "sound/weapons/sword/fall%d.wav", Q_irand( 1, 7 ) ) ) ); + G_Sound(saber, G_SoundIndex(va("sound/weapons/sword/fall%d.wav", Q_irand(1, 7)))); } else {//normal saber - G_Sound( saber, G_SoundIndex( va( "sound/weapons/saber/bounce%d.wav", Q_irand( 1, 3 ) ) ) ); + G_Sound(saber, G_SoundIndex(va("sound/weapons/saber/bounce%d.wav", Q_irand(1, 3)))); } } else {//can't find it - G_Sound( saber, G_SoundIndex( va( "sound/weapons/saber/bounce%d.wav", Q_irand( 1, 3 ) ) ) ); + G_Sound(saber, G_SoundIndex(va("sound/weapons/saber/bounce%d.wav", Q_irand(1, 3)))); } } else {//no saber name specified - G_Sound( saber, G_SoundIndex( va( "sound/weapons/saber/bounce%d.wav", Q_irand( 1, 3 ) ) ) ); + G_Sound(saber, G_SoundIndex(va("sound/weapons/saber/bounce%d.wav", Q_irand(1, 3)))); } } -void WP_SaberSwingSound( gentity_t *ent, int saberNum, swingType_t swingType ) +void WP_SaberSwingSound(gentity_t *ent, int saberNum, swingType_t swingType) { int index = 1; - if ( !ent || !ent->client ) + if (!ent || !ent->client) { return; } - if ( swingType == SWING_FAST ) + if (swingType == SWING_FAST) { - index = Q_irand( 1, 3 ); + index = Q_irand(1, 3); } - else if ( swingType == SWING_MEDIUM ) + else if (swingType == SWING_MEDIUM) { - index = Q_irand( 4, 6 ); + index = Q_irand(4, 6); } - else if ( swingType == SWING_STRONG ) + else if (swingType == SWING_STRONG) { - index = Q_irand( 7, 9 ); + index = Q_irand(7, 9); } - if ( ent->client->ps.saber[saberNum].swingSound[0] ) + if (ent->client->ps.saber[saberNum].swingSound[0]) { - G_SoundIndexOnEnt( ent, CHAN_WEAPON, ent->client->ps.saber[saberNum].swingSound[Q_irand( 0, 2 )] ); + G_SoundIndexOnEnt(ent, CHAN_WEAPON, ent->client->ps.saber[saberNum].swingSound[Q_irand(0, 2)]); } - else if ( ent->client->ps.saber[saberNum].type == SABER_SITH_SWORD ) + else if (ent->client->ps.saber[saberNum].type == SABER_SITH_SWORD) { - G_SoundOnEnt( ent, CHAN_WEAPON, va( "sound/weapons/sword/swing%d.wav", Q_irand( 1, 4 ) ) ); + G_SoundOnEnt(ent, CHAN_WEAPON, va("sound/weapons/sword/swing%d.wav", Q_irand(1, 4))); } else { - G_SoundOnEnt( ent, CHAN_WEAPON, va( "sound/weapons/saber/saberhup%d.wav", index ) ); + G_SoundOnEnt(ent, CHAN_WEAPON, va("sound/weapons/saber/saberhup%d.wav", index)); } } -void WP_SaberHitSound( gentity_t *ent, int saberNum, int bladeNum ) +void WP_SaberHitSound(gentity_t *ent, int saberNum, int bladeNum) { int index = 1; - if ( !ent || !ent->client ) + if (!ent || !ent->client) { return; } - index = Q_irand( 1, 3 ); + index = Q_irand(1, 3); - if ( !WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].hitSound[0] ) + if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].hitSound[0]) { - G_Sound( ent, ent->client->ps.saber[saberNum].hitSound[Q_irand( 0, 2 )] ); + G_Sound(ent, ent->client->ps.saber[saberNum].hitSound[Q_irand(0, 2)]); } - else if ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].hit2Sound[0] ) + else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].hit2Sound[0]) { - G_Sound( ent, ent->client->ps.saber[saberNum].hit2Sound[Q_irand( 0, 2 )] ); + G_Sound(ent, ent->client->ps.saber[saberNum].hit2Sound[Q_irand(0, 2)]); } - else if ( ent->client->ps.saber[saberNum].type == SABER_SITH_SWORD ) + else if (ent->client->ps.saber[saberNum].type == SABER_SITH_SWORD) { - G_Sound( ent, G_SoundIndex( va( "sound/weapons/sword/stab%d.wav", Q_irand( 1, 4 ) ) ) ); + G_Sound(ent, G_SoundIndex(va("sound/weapons/sword/stab%d.wav", Q_irand(1, 4)))); } else - { - G_Sound( ent, G_SoundIndex( va( "sound/weapons/saber/saberhit%d.wav", index ) ) ); + { + G_Sound(ent, G_SoundIndex(va("sound/weapons/saber/saberhit%d.wav", index))); } } -void WP_SaberBlockSound( gentity_t *ent, gentity_t *hitEnt, int saberNum, int bladeNum ) +void WP_SaberBlockSound(gentity_t *ent, gentity_t *hitEnt, int saberNum, int bladeNum) { int index = 1; - if ( !ent || !ent->client ) + if (!ent || !ent->client) { return; } - index = Q_irand( 1, 9 ); + index = Q_irand(1, 9); - if ( !WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].blockSound[0] ) + if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].blockSound[0]) { - G_Sound( ent, ent->client->ps.saber[saberNum].blockSound[Q_irand( 0, 2 )] ); + G_Sound(ent, ent->client->ps.saber[saberNum].blockSound[Q_irand(0, 2)]); } - else if ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].block2Sound[0] ) + else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].block2Sound[0]) { - G_Sound( ent, ent->client->ps.saber[saberNum].block2Sound[Q_irand( 0, 2 )] ); + G_Sound(ent, ent->client->ps.saber[saberNum].block2Sound[Q_irand(0, 2)]); } else - { - G_Sound( ent, G_SoundIndex( va( "sound/weapons/saber/saberblock%d.wav", index ) ) ); + { + G_Sound(ent, G_SoundIndex(va("sound/weapons/saber/saberblock%d.wav", index))); } } -void WP_SaberBounceOnWallSound( gentity_t *ent, int saberNum, int bladeNum ) +void WP_SaberBounceOnWallSound(gentity_t *ent, int saberNum, int bladeNum) { int index = 1; - if ( !ent || !ent->client ) + if (!ent || !ent->client) { return; } - index = Q_irand( 1, 9 ); + index = Q_irand(1, 9); - if ( !WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].bounceSound[0] ) + if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].bounceSound[0]) { - G_Sound( ent, ent->client->ps.saber[saberNum].bounceSound[Q_irand( 0, 2 )] ); + G_Sound(ent, ent->client->ps.saber[saberNum].bounceSound[Q_irand(0, 2)]); } - else if ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].bounce2Sound[0] ) + else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].bounce2Sound[0]) { - G_Sound( ent, ent->client->ps.saber[saberNum].bounce2Sound[Q_irand( 0, 2 )] ); + G_Sound(ent, ent->client->ps.saber[saberNum].bounce2Sound[Q_irand(0, 2)]); } - else if ( !WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].blockSound[0] ) + else if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].blockSound[0]) { - G_Sound( ent, ent->client->ps.saber[saberNum].blockSound[Q_irand( 0, 2 )] ); + G_Sound(ent, ent->client->ps.saber[saberNum].blockSound[Q_irand(0, 2)]); } - else if ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].block2Sound[0] ) + else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].block2Sound[0]) { - G_Sound( ent, ent->client->ps.saber[saberNum].block2Sound[Q_irand( 0, 2 )] ); + G_Sound(ent, ent->client->ps.saber[saberNum].block2Sound[Q_irand(0, 2)]); } else - { - G_Sound( ent, G_SoundIndex( va( "sound/weapons/saber/saberblock%d.wav", index ) ) ); + { + G_Sound(ent, G_SoundIndex(va("sound/weapons/saber/saberblock%d.wav", index))); } } -void WP_SaberBounceSound( gentity_t *ent, gentity_t *hitEnt, gentity_t *playOnEnt, int saberNum, int bladeNum, qboolean doForce ) +void WP_SaberBounceSound(gentity_t *ent, gentity_t *hitEnt, gentity_t *playOnEnt, int saberNum, int bladeNum, qboolean doForce) { int index = 1; - if ( !ent || !ent->client ) + if (!ent || !ent->client) { return; } - index = Q_irand( 1, 3 ); + index = Q_irand(1, 3); - if ( !playOnEnt ) + if (!playOnEnt) { playOnEnt = ent; } //NOTE: we don't allow overriding of the saberbounce sound, but since it's just a variant on the saberblock sound, we use that as the override - if ( !WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].blockSound[0] ) + if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].blockSound[0]) { - G_Sound( playOnEnt, ent->client->ps.saber[saberNum].blockSound[Q_irand( 0, 2 )] ); + G_Sound(playOnEnt, ent->client->ps.saber[saberNum].blockSound[Q_irand(0, 2)]); } - else if ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].block2Sound[0] ) + else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].block2Sound[0]) { - G_Sound( playOnEnt, ent->client->ps.saber[saberNum].block2Sound[Q_irand( 0, 2 )] ); + G_Sound(playOnEnt, ent->client->ps.saber[saberNum].block2Sound[Q_irand(0, 2)]); } else - { - G_Sound( playOnEnt, G_SoundIndex( va( "sound/weapons/saber/saberbounce%d.wav", index ) ) ); + { + G_Sound(playOnEnt, G_SoundIndex(va("sound/weapons/saber/saberbounce%d.wav", index))); } } -int WP_SaberInitBladeData( gentity_t *ent ) +int WP_SaberInitBladeData(gentity_t *ent) { - if ( !ent->client ) + if (!ent->client) { return 0; } - if ( 1 ) + if (1) { - VectorClear( ent->client->renderInfo.muzzlePoint ); - VectorClear( ent->client->renderInfo.muzzlePointOld ); + VectorClear(ent->client->renderInfo.muzzlePoint); + VectorClear(ent->client->renderInfo.muzzlePointOld); //VectorClear( ent->client->renderInfo.muzzlePointNext ); - VectorClear( ent->client->renderInfo.muzzleDir ); - VectorClear( ent->client->renderInfo.muzzleDirOld ); + VectorClear(ent->client->renderInfo.muzzleDir); + VectorClear(ent->client->renderInfo.muzzleDirOld); //VectorClear( ent->client->renderInfo.muzzleDirNext ); - for ( int saberNum = 0; saberNum < MAX_SABERS; saberNum++ ) + for (int saberNum = 0; saberNum < MAX_SABERS; saberNum++) { - for ( int bladeNum = 0; bladeNum < MAX_BLADES; bladeNum++ ) + for (int bladeNum = 0; bladeNum < MAX_BLADES; bladeNum++) { - VectorClear( ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint ); - VectorClear( ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePointOld ); - VectorClear( ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDir ); - VectorClear( ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDirOld ); + VectorClear(ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint); + VectorClear(ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePointOld); + VectorClear(ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDir); + VectorClear(ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDirOld); ent->client->ps.saber[saberNum].blade[bladeNum].lengthOld = ent->client->ps.saber[saberNum].blade[bladeNum].length = 0; - if ( !ent->client->ps.saber[saberNum].blade[bladeNum].lengthMax ) + if (!ent->client->ps.saber[saberNum].blade[bladeNum].lengthMax) { - if ( ent->client->NPC_class == CLASS_DESANN ) + if (ent->client->NPC_class == CLASS_DESANN) {//longer saber ent->client->ps.saber[saberNum].blade[bladeNum].lengthMax = 48; } - else if ( ent->client->NPC_class == CLASS_REBORN ) + else if (ent->client->NPC_class == CLASS_REBORN) {//shorter saber ent->client->ps.saber[saberNum].blade[bladeNum].lengthMax = 32; } @@ -884,70 +888,70 @@ int WP_SaberInitBladeData( gentity_t *ent ) } ent->client->ps.saberLockEnemy = ENTITYNUM_NONE; ent->client->ps.saberLockTime = 0; - if ( ent->s.number ) + if (ent->s.number) { - if ( !ent->client->ps.saberAnimLevel ) + if (!ent->client->ps.saberAnimLevel) { - if ( ent->client->NPC_class == CLASS_DESANN ) + if (ent->client->NPC_class == CLASS_DESANN) { ent->client->ps.saberAnimLevel = SS_DESANN; } - else if ( ent->client->NPC_class == CLASS_TAVION ) + else if (ent->client->NPC_class == CLASS_TAVION) { ent->client->ps.saberAnimLevel = SS_TAVION; } - else if ( ent->client->NPC_class == CLASS_ALORA ) + else if (ent->client->NPC_class == CLASS_ALORA) { ent->client->ps.saberAnimLevel = SS_DUAL; } //FIXME: CLASS_CULTIST instead of this Q_stricmpn? - else if ( !Q_stricmpn( "cultist", ent->NPC_type, 7 ) ) + else if (!Q_stricmpn("cultist", ent->NPC_type, 7)) {//should already be set in the .npc file - ent->client->ps.saberAnimLevel = Q_irand( SS_FAST, SS_STRONG ); + ent->client->ps.saberAnimLevel = Q_irand(SS_FAST, SS_STRONG); } - else if ( ent->NPC && ent->client->playerTeam == TEAM_ENEMY && (ent->NPC->rank == RANK_CIVILIAN || ent->NPC->rank == RANK_LT_JG) ) + else if (ent->NPC && ent->client->playerTeam == TEAM_ENEMY && (ent->NPC->rank == RANK_CIVILIAN || ent->NPC->rank == RANK_LT_JG)) {//grunt and fencer always uses quick attacks ent->client->ps.saberAnimLevel = SS_FAST; } - else if ( ent->NPC && ent->client->playerTeam == TEAM_ENEMY && (ent->NPC->rank == RANK_CREWMAN || ent->NPC->rank == RANK_ENSIGN) ) + else if (ent->NPC && ent->client->playerTeam == TEAM_ENEMY && (ent->NPC->rank == RANK_CREWMAN || ent->NPC->rank == RANK_ENSIGN)) {//acrobat & force-users always use medium attacks ent->client->ps.saberAnimLevel = SS_MEDIUM; } - else if ( ent->client->playerTeam == TEAM_ENEMY && ent->client->NPC_class == CLASS_SHADOWTROOPER ) + else if (ent->client->playerTeam == TEAM_ENEMY && ent->client->NPC_class == CLASS_SHADOWTROOPER) {//shadowtroopers - ent->client->ps.saberAnimLevel = Q_irand( SS_FAST, SS_STRONG ); + ent->client->ps.saberAnimLevel = Q_irand(SS_FAST, SS_STRONG); } - else if ( ent->NPC && ent->client->playerTeam == TEAM_ENEMY && ent->NPC->rank == RANK_LT ) + else if (ent->NPC && ent->client->playerTeam == TEAM_ENEMY && ent->NPC->rank == RANK_LT) {//boss always starts with strong attacks ent->client->ps.saberAnimLevel = SS_STRONG; } - else if ( ent->client->NPC_class == CLASS_PLAYER ) + else if (ent->client->NPC_class == CLASS_PLAYER) { ent->client->ps.saberAnimLevel = g_entities[0].client->ps.saberAnimLevel; } else {//? - ent->client->ps.saberAnimLevel = Q_irand( SS_FAST, SS_STRONG ); + ent->client->ps.saberAnimLevel = Q_irand(SS_FAST, SS_STRONG); } } } else { - if ( !ent->client->ps.saberAnimLevel ) + if (!ent->client->ps.saberAnimLevel) {//initialize, but don't reset if (ent->s.number < MAX_CLIENTS) { if (!ent->client->ps.saberStylesKnown) { - ent->client->ps.saberStylesKnown = (1<client->ps.saberStylesKnown = (1 << SS_MEDIUM); } - if (ent->client->ps.saberStylesKnown & (1<client->ps.saberStylesKnown & (1 << SS_FAST)) { ent->client->ps.saberAnimLevel = SS_FAST; } - else if (ent->client->ps.saberStylesKnown & (1<client->ps.saberStylesKnown & (1 << SS_STRONG)) { ent->client->ps.saberAnimLevel = SS_STRONG; } @@ -964,19 +968,19 @@ int WP_SaberInitBladeData( gentity_t *ent ) } cg.saberAnimLevelPending = ent->client->ps.saberAnimLevel; - if ( ent->client->sess.missionStats.weaponUsed[WP_SABER] <= 0 ) + if (ent->client->sess.missionStats.weaponUsed[WP_SABER] <= 0) {//let missionStats know that we actually do have the saber, even if we never use it ent->client->sess.missionStats.weaponUsed[WP_SABER] = 1; } } ent->client->ps.saberAttackChainCount = 0; - if ( ent->client->ps.saberEntityNum <= 0 || ent->client->ps.saberEntityNum >= ENTITYNUM_WORLD ) + if (ent->client->ps.saberEntityNum <= 0 || ent->client->ps.saberEntityNum >= ENTITYNUM_WORLD) {//FIXME: if you do have a saber already, be sure to re-set the model if it's changed (say, via a script). gentity_t *saberent = G_Spawn(); ent->client->ps.saberEntityNum = saberent->s.number; saberent->classname = "lightsaber"; - + saberent->s.eType = ET_GENERAL; saberent->svFlags = SVF_USE_CURRENT_ORIGIN; saberent->s.weapon = WP_SABER; @@ -988,34 +992,34 @@ int WP_SaberInitBladeData( gentity_t *ent ) saberent->clipmask = MASK_SOLID | CONTENTS_LIGHTSABER; saberent->contents = CONTENTS_LIGHTSABER;//|CONTENTS_SHOTCLIP; - VectorSet( saberent->mins, -3.0f, -3.0f, -3.0f ); - VectorSet( saberent->maxs, 3.0f, 3.0f, 3.0f ); + VectorSet(saberent->mins, -3.0f, -3.0f, -3.0f); + VectorSet(saberent->maxs, 3.0f, 3.0f, 3.0f); saberent->mass = 10;//necc? saberent->s.eFlags |= EF_NODRAW; saberent->svFlags |= SVF_NOCLIENT; -/* -Ghoul2 Insert Start -*/ + /* + Ghoul2 Insert Start + */ saberent->playerModel = -1; - WP_SetSaberEntModelSkin( ent, saberent ); + WP_SetSaberEntModelSkin(ent, saberent); // set up a bolt on the end so we can get where the sabre muzzle is - we can assume this is always bolt 0 - gi.G2API_AddBolt( &saberent->ghoul2[0], "*flash" ); + gi.G2API_AddBolt(&saberent->ghoul2[0], "*flash"); //gi.G2API_SetLodBias( &saberent->ghoul2[0], 0 ); - if ( ent->client->ps.dualSabers ) + if (ent->client->ps.dualSabers) { //int saber2 = - G_ModelIndex( ent->client->ps.saber[1].model ); + G_ModelIndex(ent->client->ps.saber[1].model); //gi.G2API_InitGhoul2Model( saberent->ghoul2, ent->client->ps.saber[1].model, saber2 ); // set up a bolt on the end so we can get where the sabre muzzle is - we can assume this is always bolt 0 //gi.G2API_AddBolt( &saberent->ghoul2[0], "*flash" ); //gi.G2API_SetLodBias( &saberent->ghoul2[0], 0 ); } - -/* -Ghoul2 Insert End -*/ + + /* + Ghoul2 Insert End + */ ent->client->ps.saberInFlight = qfalse; ent->client->ps.saberEntityDist = 0; @@ -1027,7 +1031,7 @@ Ghoul2 Insert End } else {//already have one, might just be changing sabers, register the model and skin and use them if different from what we're using now. - WP_SetSaberEntModelSkin( ent, &g_entities[ent->client->ps.saberEntityNum] ); + WP_SetSaberEntModelSkin(ent, &g_entities[ent->client->ps.saberEntityNum]); } } else @@ -1038,40 +1042,40 @@ Ghoul2 Insert End ent->client->ps.saberEntityState = SES_LEAVING; } - if ( ent->client->ps.dualSabers ) + if (ent->client->ps.dualSabers) { return 2; } - + return 1; } -void WP_SaberUpdateOldBladeData( gentity_t *ent ) +void WP_SaberUpdateOldBladeData(gentity_t *ent) { - if ( ent->client ) + if (ent->client) { qboolean didEvent = qfalse; - for ( int saberNum = 0; saberNum < 2; saberNum++ ) + for (int saberNum = 0; saberNum < 2; saberNum++) { - for ( int bladeNum = 0; bladeNum < ent->client->ps.saber[saberNum].numBlades; bladeNum++ ) + for (int bladeNum = 0; bladeNum < ent->client->ps.saber[saberNum].numBlades; bladeNum++) { - VectorCopy( ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePointOld ); - VectorCopy( ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDirOld ); - if ( !didEvent ) + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePointOld); + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDirOld); + if (!didEvent) { - if ( ent->client->ps.saber[saberNum].blade[bladeNum].lengthOld <= 0 && ent->client->ps.saber[saberNum].blade[bladeNum].length > 0 ) + if (ent->client->ps.saber[saberNum].blade[bladeNum].lengthOld <= 0 && ent->client->ps.saber[saberNum].blade[bladeNum].length > 0) {//just turned on //do sound event vec3_t saberOrg; - VectorCopy( g_entities[ent->client->ps.saberEntityNum].currentOrigin, saberOrg ); - if ( (!ent->client->ps.saberInFlight && ent->client->ps.groundEntityNum == ENTITYNUM_WORLD)//holding saber and on ground - || g_entities[ent->client->ps.saberEntityNum].s.pos.trType == TR_STATIONARY )//saber out there somewhere and on ground + VectorCopy(g_entities[ent->client->ps.saberEntityNum].currentOrigin, saberOrg); + if ((!ent->client->ps.saberInFlight && ent->client->ps.groundEntityNum == ENTITYNUM_WORLD)//holding saber and on ground + || g_entities[ent->client->ps.saberEntityNum].s.pos.trType == TR_STATIONARY)//saber out there somewhere and on ground {//a ground alert - AddSoundEvent( ent, saberOrg, 256, AEL_SUSPICIOUS, qfalse, qtrue ); + AddSoundEvent(ent, saberOrg, 256, AEL_SUSPICIOUS, qfalse, qtrue); } else {//an in-air alert - AddSoundEvent( ent, saberOrg, 256, AEL_SUSPICIOUS ); + AddSoundEvent(ent, saberOrg, 256, AEL_SUSPICIOUS); } didEvent = qtrue; } @@ -1079,8 +1083,8 @@ void WP_SaberUpdateOldBladeData( gentity_t *ent ) ent->client->ps.saber[saberNum].blade[bladeNum].lengthOld = ent->client->ps.saber[saberNum].blade[bladeNum].length; } } - VectorCopy( ent->client->renderInfo.muzzlePoint, ent->client->renderInfo.muzzlePointOld ); - VectorCopy( ent->client->renderInfo.muzzleDir, ent->client->renderInfo.muzzleDirOld ); + VectorCopy(ent->client->renderInfo.muzzlePoint, ent->client->renderInfo.muzzlePointOld); + VectorCopy(ent->client->renderInfo.muzzleDir, ent->client->renderInfo.muzzleDirOld); } } @@ -1092,106 +1096,106 @@ void WP_SaberUpdateOldBladeData( gentity_t *ent ) //SABER DAMAGE============================================================================== //SABER DAMAGE============================================================================== //SABER DAMAGE============================================================================== -int WPDEBUG_SaberColor( saber_colors_t saberColor ) +int WPDEBUG_SaberColor(saber_colors_t saberColor) { - switch( (int)(saberColor) ) + switch ((int)(saberColor)) { - case SABER_RED: - return 0x000000ff; - break; - case SABER_ORANGE: - return 0x000088ff; - break; - case SABER_YELLOW: - return 0x0000ffff; - break; - case SABER_GREEN: - return 0x0000ff00; - break; - case SABER_BLUE: - return 0x00ff0000; - break; - case SABER_PURPLE: - return 0x00ff00ff; - break; - default: - return 0x00ffffff;//white - break; + case SABER_RED: + return 0x000000ff; + break; + case SABER_ORANGE: + return 0x000088ff; + break; + case SABER_YELLOW: + return 0x0000ffff; + break; + case SABER_GREEN: + return 0x0000ff00; + break; + case SABER_BLUE: + return 0x00ff0000; + break; + case SABER_PURPLE: + return 0x00ff00ff; + break; + default: + return 0x00ffffff;//white + break; } } -qboolean WP_GetSaberDeflectionAngle( gentity_t *attacker, gentity_t *defender ) +qboolean WP_GetSaberDeflectionAngle(gentity_t *attacker, gentity_t *defender) { vec3_t temp, att_SaberBase, att_StartPos, saberMidNext, att_HitDir, att_HitPos, def_BladeDir; float att_SaberHitLength, hitDot; - if ( !attacker || !attacker->client || attacker->client->ps.saberInFlight || attacker->client->ps.SaberLength() <= 0 ) + if (!attacker || !attacker->client || attacker->client->ps.saberInFlight || attacker->client->ps.SaberLength() <= 0) { return qfalse; } - if ( !defender || !defender->client || defender->client->ps.saberInFlight || defender->client->ps.SaberLength() <= 0 ) + if (!defender || !defender->client || defender->client->ps.saberInFlight || defender->client->ps.SaberLength() <= 0) { return qfalse; } - if ( PM_SuperBreakLoseAnim( attacker->client->ps.torsoAnim ) - || PM_SuperBreakWinAnim( attacker->client->ps.torsoAnim ) ) + if (PM_SuperBreakLoseAnim(attacker->client->ps.torsoAnim) + || PM_SuperBreakWinAnim(attacker->client->ps.torsoAnim)) { return qfalse; } attacker->client->ps.saberBounceMove = LS_NONE; //get the attacker's saber base pos at time of impact - VectorSubtract( attacker->client->renderInfo.muzzlePoint, attacker->client->renderInfo.muzzlePointOld, temp ); - VectorMA( attacker->client->renderInfo.muzzlePointOld, saberHitFraction, temp, att_SaberBase ); + VectorSubtract(attacker->client->renderInfo.muzzlePoint, attacker->client->renderInfo.muzzlePointOld, temp); + VectorMA(attacker->client->renderInfo.muzzlePointOld, saberHitFraction, temp, att_SaberBase); //get the position along the length of the blade where the hit occured - att_SaberHitLength = Distance( saberHitLocation, att_SaberBase )/attacker->client->ps.SaberLength(); + att_SaberHitLength = Distance(saberHitLocation, att_SaberBase) / attacker->client->ps.SaberLength(); //now get the start of that midpoint in the swing and the actual impact point in the swing (shouldn't the latter just be saberHitLocation?) - VectorMA( attacker->client->renderInfo.muzzlePointOld, att_SaberHitLength, attacker->client->renderInfo.muzzleDirOld, att_StartPos ); - VectorMA( attacker->client->renderInfo.muzzlePoint, att_SaberHitLength, attacker->client->renderInfo.muzzleDir, saberMidNext ); - VectorSubtract( saberMidNext, att_StartPos, att_HitDir ); - VectorMA( att_StartPos, saberHitFraction, att_HitDir, att_HitPos ); - VectorNormalize( att_HitDir ); + VectorMA(attacker->client->renderInfo.muzzlePointOld, att_SaberHitLength, attacker->client->renderInfo.muzzleDirOld, att_StartPos); + VectorMA(attacker->client->renderInfo.muzzlePoint, att_SaberHitLength, attacker->client->renderInfo.muzzleDir, saberMidNext); + VectorSubtract(saberMidNext, att_StartPos, att_HitDir); + VectorMA(att_StartPos, saberHitFraction, att_HitDir, att_HitPos); + VectorNormalize(att_HitDir); //get the defender's saber dir at time of impact - VectorSubtract( defender->client->renderInfo.muzzleDirOld, defender->client->renderInfo.muzzleDir, temp ); - VectorMA( defender->client->renderInfo.muzzleDirOld, saberHitFraction, temp, def_BladeDir ); + VectorSubtract(defender->client->renderInfo.muzzleDirOld, defender->client->renderInfo.muzzleDir, temp); + VectorMA(defender->client->renderInfo.muzzleDirOld, saberHitFraction, temp, def_BladeDir); //now compare - hitDot = DotProduct( att_HitDir, def_BladeDir ); - if ( hitDot < 0.25f && hitDot > -0.25f ) + hitDot = DotProduct(att_HitDir, def_BladeDir); + if (hitDot < 0.25f && hitDot > -0.25f) {//hit pretty much perpendicular, pop straight back - attacker->client->ps.saberBounceMove = PM_SaberBounceForAttack( attacker->client->ps.saberMove ); + attacker->client->ps.saberBounceMove = PM_SaberBounceForAttack(attacker->client->ps.saberMove); return qfalse; } - else + else {//a deflection vec3_t att_Right, att_Up, att_DeflectionDir; float swingRDot, swingUDot; //get the direction of the deflection - VectorScale( def_BladeDir, hitDot, att_DeflectionDir ); + VectorScale(def_BladeDir, hitDot, att_DeflectionDir); //get our bounce straight back direction - VectorScale( att_HitDir, -1.0f, temp ); + VectorScale(att_HitDir, -1.0f, temp); //add the bounce back and deflection - VectorAdd( att_DeflectionDir, temp, att_DeflectionDir ); + VectorAdd(att_DeflectionDir, temp, att_DeflectionDir); //normalize the result to determine what direction our saber should bounce back toward - VectorNormalize( att_DeflectionDir ); + VectorNormalize(att_DeflectionDir); //need to know the direction of the deflectoin relative to the attacker's facing - VectorSet( temp, 0, attacker->client->ps.viewangles[YAW], 0 );//presumes no pitch! - AngleVectors( temp, NULL, att_Right, att_Up ); - swingRDot = DotProduct( att_Right, att_DeflectionDir ); - swingUDot = DotProduct( att_Up, att_DeflectionDir ); + VectorSet(temp, 0, attacker->client->ps.viewangles[YAW], 0);//presumes no pitch! + AngleVectors(temp, NULL, att_Right, att_Up); + swingRDot = DotProduct(att_Right, att_DeflectionDir); + swingUDot = DotProduct(att_Up, att_DeflectionDir); - if ( swingRDot > 0.25f ) + if (swingRDot > 0.25f) {//deflect to right - if ( swingUDot > 0.25f ) + if (swingUDot > 0.25f) {//deflect to top attacker->client->ps.saberBounceMove = LS_D1_TR; } - else if ( swingUDot < -0.25f ) + else if (swingUDot < -0.25f) {//deflect to bottom attacker->client->ps.saberBounceMove = LS_D1_BR; } @@ -1200,13 +1204,13 @@ qboolean WP_GetSaberDeflectionAngle( gentity_t *attacker, gentity_t *defender ) attacker->client->ps.saberBounceMove = LS_D1__R; } } - else if ( swingRDot < -0.25f ) + else if (swingRDot < -0.25f) {//deflect to left - if ( swingUDot > 0.25f ) + if (swingUDot > 0.25f) {//deflect to top attacker->client->ps.saberBounceMove = LS_D1_TL; } - else if ( swingUDot < -0.25f ) + else if (swingUDot < -0.25f) {//deflect to bottom attacker->client->ps.saberBounceMove = LS_D1_BL; } @@ -1217,21 +1221,21 @@ qboolean WP_GetSaberDeflectionAngle( gentity_t *attacker, gentity_t *defender ) } else {//deflect in middle - if ( swingUDot > 0.25f ) + if (swingUDot > 0.25f) {//deflect to top attacker->client->ps.saberBounceMove = LS_D1_T_; } - else if ( swingUDot < -0.25f ) + else if (swingUDot < -0.25f) {//deflect to bottom attacker->client->ps.saberBounceMove = LS_D1_B_; } else {//deflect horizontally? Well, no such thing as straight back in my face, so use top - if ( swingRDot > 0 ) + if (swingRDot > 0) { attacker->client->ps.saberBounceMove = LS_D1_TR; } - else if ( swingRDot < 0 ) + else if (swingRDot < 0) { attacker->client->ps.saberBounceMove = LS_D1_TL; } @@ -1242,9 +1246,9 @@ qboolean WP_GetSaberDeflectionAngle( gentity_t *attacker, gentity_t *defender ) } } #ifndef FINAL_BUILD - if ( d_saberCombat->integer ) + if (d_saberCombat->integer) { - gi.Printf( S_COLOR_BLUE"%s deflected from %s to %s\n", attacker->targetname, saberMoveData[attacker->client->ps.saberMove].name, saberMoveData[attacker->client->ps.saberBounceMove].name ); + gi.Printf(S_COLOR_BLUE"%s deflected from %s to %s\n", attacker->targetname, saberMoveData[attacker->client->ps.saberMove].name, saberMoveData[attacker->client->ps.saberBounceMove].name); } #endif return qtrue; @@ -1252,69 +1256,69 @@ qboolean WP_GetSaberDeflectionAngle( gentity_t *attacker, gentity_t *defender ) } -void WP_SaberClearDamageForEntNum( gentity_t *attacker, int entityNum, int saberNum, int bladeNum ) +void WP_SaberClearDamageForEntNum(gentity_t *attacker, int entityNum, int saberNum, int bladeNum) { #ifndef FINAL_BUILD - if ( d_saberCombat->integer ) + if (d_saberCombat->integer) { - if ( entityNum ) + if (entityNum) { - Com_Printf( "clearing damage for entnum %d\n", entityNum ); + Com_Printf("clearing damage for entnum %d\n", entityNum); } } #endif// FINAL_BUILD - if ( g_saberRealisticCombat->integer > 1 ) + if (g_saberRealisticCombat->integer > 1) { return; } //FIXME: if hit their saber in WP_SaberDamageForTrace, need to still do knockback on them... float knockBackScale = 0.0f; - if ( attacker && attacker->client ) + if (attacker && attacker->client) { - if ( !WP_SaberBladeUseSecondBladeStyle( &attacker->client->ps.saber[saberNum], bladeNum ) - && attacker->client->ps.saber[saberNum].knockbackScale > 0.0f ) + if (!WP_SaberBladeUseSecondBladeStyle(&attacker->client->ps.saber[saberNum], bladeNum) + && attacker->client->ps.saber[saberNum].knockbackScale > 0.0f) { knockBackScale = attacker->client->ps.saber[saberNum].knockbackScale; } - else if ( WP_SaberBladeUseSecondBladeStyle( &attacker->client->ps.saber[saberNum], bladeNum ) - && attacker->client->ps.saber[saberNum].knockbackScale2 > 0.0f ) + else if (WP_SaberBladeUseSecondBladeStyle(&attacker->client->ps.saber[saberNum], bladeNum) + && attacker->client->ps.saber[saberNum].knockbackScale2 > 0.0f) { knockBackScale = attacker->client->ps.saber[saberNum].knockbackScale2; } } - for ( int i = 0; i < numVictims; i++ ) + for (int i = 0; i < numVictims; i++) { - if ( victimEntityNum[i] == entityNum ) + if (victimEntityNum[i] == entityNum) { //hold on a sec, let's still do any accumulated knockback - if ( knockBackScale ) + if (knockBackScale) { gentity_t *victim = &g_entities[victimEntityNum[i]]; - if ( victim && victim->client ) + if (victim && victim->client) { vec3_t center, dirToCenter; float knockDownThreshHold, knockback = knockBackScale * totalDmg[i] * 0.5f; - VectorAdd( victim->absmin, victim->absmax, center ); - VectorScale( center, 0.5, center ); - VectorSubtract( victim->currentOrigin, saberHitLocation, dirToCenter ); - VectorNormalize( dirToCenter ); - G_Throw( victim, dirToCenter, knockback ); - if ( victim->client->ps.groundEntityNum != ENTITYNUM_NONE - && dirToCenter[2] <= 0 ) + VectorAdd(victim->absmin, victim->absmax, center); + VectorScale(center, 0.5, center); + VectorSubtract(victim->currentOrigin, saberHitLocation, dirToCenter); + VectorNormalize(dirToCenter); + G_Throw(victim, dirToCenter, knockback); + if (victim->client->ps.groundEntityNum != ENTITYNUM_NONE + && dirToCenter[2] <= 0) {//hit downward on someone who is standing on firm ground, so more likely to knock them down - knockDownThreshHold = Q_irand( 25, 50 ); + knockDownThreshHold = Q_irand(25, 50); } else { - knockDownThreshHold = Q_irand( 75, 125 ); + knockDownThreshHold = Q_irand(75, 125); } - if ( knockback > knockDownThreshHold ) + if (knockback > knockDownThreshHold) { - G_Knockdown( victim, attacker, dirToCenter, 350, qtrue ); + G_Knockdown(victim, attacker, dirToCenter, 350, qtrue); } } } @@ -1330,8 +1334,8 @@ void WP_SaberClearDamageForEntNum( gentity_t *attacker, int entityNum, int saber extern float damageModifier[]; extern float hitLocHealthPercentage[]; -qboolean WP_SaberApplyDamage( gentity_t *ent, float baseDamage, int baseDFlags, - qboolean brokenParry, int saberNum, int bladeNum, qboolean thrownSaber ) +qboolean WP_SaberApplyDamage(gentity_t *ent, float baseDamage, int baseDFlags, + qboolean brokenParry, int saberNum, int bladeNum, qboolean thrownSaber) { qboolean didDamage = qfalse; gentity_t *victim; @@ -1339,105 +1343,105 @@ qboolean WP_SaberApplyDamage( gentity_t *ent, float baseDamage, int baseDFlags, float maxDmg; saberType_t saberType = ent->client->ps.saber[saberNum].type; - if ( !numVictims ) + if (!numVictims) { return qfalse; } - for ( int i = 0; i < numVictims; i++ ) + for (int i = 0; i < numVictims; i++) { - dFlags = baseDFlags|DAMAGE_DEATH_KNOCKBACK|DAMAGE_NO_HIT_LOC; - if ( victimEntityNum[i] != ENTITYNUM_NONE && &g_entities[victimEntityNum[i]] != NULL ) + dFlags = baseDFlags | DAMAGE_DEATH_KNOCKBACK | DAMAGE_NO_HIT_LOC; + if (victimEntityNum[i] != ENTITYNUM_NONE && &g_entities[victimEntityNum[i]] != NULL) { // Don't bother with this damage if the fraction is higher than the saber's fraction - if ( dmgFraction[i] < saberHitFraction || brokenParry ) + if (dmgFraction[i] < saberHitFraction || brokenParry) { victim = &g_entities[victimEntityNum[i]]; - if ( !victim ) + if (!victim) { continue; } - - if ( victim->e_DieFunc == dieF_maglock_die ) + + if (victim->e_DieFunc == dieF_maglock_die) {//*sigh*, special check for maglocks vec3_t testFrom; - if ( ent->client->ps.saberInFlight ) + if (ent->client->ps.saberInFlight) { - VectorCopy( g_entities[ent->client->ps.saberEntityNum].currentOrigin, testFrom ); + VectorCopy(g_entities[ent->client->ps.saberEntityNum].currentOrigin, testFrom); } else { - VectorCopy( ent->currentOrigin, testFrom ); + VectorCopy(ent->currentOrigin, testFrom); } testFrom[2] = victim->currentOrigin[2]; trace_t testTrace; - gi.trace( &testTrace, testFrom, vec3_origin, vec3_origin, victim->currentOrigin, ent->s.number, MASK_SHOT, (EG2_Collision)0, 0 ); - if ( testTrace.entityNum != victim->s.number ) + gi.trace(&testTrace, testFrom, vec3_origin, vec3_origin, victim->currentOrigin, ent->s.number, MASK_SHOT, (EG2_Collision)0, 0); + if (testTrace.entityNum != victim->s.number) {//can only damage maglocks if have a clear trace to the thing's origin continue; } } - if ( totalDmg[i] > 0 ) + if (totalDmg[i] > 0) {//actually want to do *some* damage here - if ( victim->client - && victim->client->NPC_class==CLASS_WAMPA - && victim->activator == ent ) + if (victim->client + && victim->client->NPC_class == CLASS_WAMPA + && victim->activator == ent) { } - else if ( PM_SuperBreakWinAnim( ent->client->ps.torsoAnim ) - || PM_StabDownAnim( ent->client->ps.torsoAnim ) ) + else if (PM_SuperBreakWinAnim(ent->client->ps.torsoAnim) + || PM_StabDownAnim(ent->client->ps.torsoAnim)) {//never cap the superbreak wins } - else + else { - if ( victim->client - && (victim->s.weapon == WP_SABER || (victim->client->NPC_class==CLASS_REBORN) || (victim->client->NPC_class==CLASS_WAMPA)) - && !g_saberRealisticCombat->integer ) + if (victim->client + && (victim->s.weapon == WP_SABER || (victim->client->NPC_class == CLASS_REBORN) || (victim->client->NPC_class == CLASS_WAMPA)) + && !g_saberRealisticCombat->integer) {//dmg vs other saber fighters is modded by hitloc and capped totalDmg[i] *= damageModifier[hitLoc[i]]; - if ( hitLoc[i] == HL_NONE ) + if (hitLoc[i] == HL_NONE) { - maxDmg = 33*baseDamage; + maxDmg = 33 * baseDamage; } else { - maxDmg = 50*hitLocHealthPercentage[hitLoc[i]]*baseDamage;//*victim->client->ps.stats[STAT_MAX_HEALTH]*2.0f; + maxDmg = 50 * hitLocHealthPercentage[hitLoc[i]] * baseDamage;//*victim->client->ps.stats[STAT_MAX_HEALTH]*2.0f; } - if ( maxDmg < totalDmg[i] ) + if (maxDmg < totalDmg[i]) { totalDmg[i] = maxDmg; } //dFlags |= DAMAGE_NO_HIT_LOC; } //clamp the dmg - if ( victim->s.weapon != WP_SABER ) + if (victim->s.weapon != WP_SABER) {//clamp the dmg between 25 and maxhealth /* if ( totalDmg[i] > victim->max_health ) { - totalDmg[i] = victim->max_health; + totalDmg[i] = victim->max_health; } - else */if ( totalDmg[i] < 25 ) + else */if (totalDmg[i] < 25) { totalDmg[i] = 25; } - if ( totalDmg[i] > 100 )//+(50*g_spskill->integer) ) + if (totalDmg[i] > 100)//+(50*g_spskill->integer) ) {//clamp using same adjustment as in NPC_Begin totalDmg[i] = 100;//+(50*g_spskill->integer); } } else {//clamp the dmg between 5 and 100 - if ( !victim->s.number && totalDmg[i] > 50 ) + if (!victim->s.number && totalDmg[i] > 50) {//never do more than half full health damage to player //prevents one-hit kills totalDmg[i] = 50; } - else if ( totalDmg[i] > 100 ) + else if (totalDmg[i] > 100) { totalDmg[i] = 100; } else { - if ( totalDmg[i] < 5 ) + if (totalDmg[i] < 5) { totalDmg[i] = 5; } @@ -1445,54 +1449,54 @@ qboolean WP_SaberApplyDamage( gentity_t *ent, float baseDamage, int baseDFlags, } } - if ( totalDmg[i] > 0 ) + if (totalDmg[i] > 0) { gentity_t *inflictor = ent; didDamage = qtrue; qboolean vicWasDismembered = qtrue; qboolean vicWasAlive = (qboolean)(victim->health>0); - if ( baseDamage <= 0.1f ) + if (baseDamage <= 0.1f) {//just get their attention? dFlags |= DAMAGE_NO_DAMAGE; } - if( victim->client ) + if (victim->client) { - if ( victim->client->ps.pm_time > 0 && victim->client->ps.pm_flags & PMF_TIME_KNOCKBACK && victim->client->ps.velocity[2] > 0 ) + if (victim->client->ps.pm_time > 0 && victim->client->ps.pm_flags & PMF_TIME_KNOCKBACK && victim->client->ps.velocity[2] > 0) {//already being knocked around dFlags |= DAMAGE_NO_KNOCKBACK; } - if ( !WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_DISMEMBERMENT) ) + if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_DISMEMBERMENT)) {//no dismemberment! (blunt/stabbing weapon?) } - else if ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_DISMEMBERMENT2) ) + else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_DISMEMBERMENT2)) {//no dismemberment! (blunt/stabbing weapon?) } - else + else { - if ( debug_subdivision->integer || g_saberRealisticCombat->integer ) + if (debug_subdivision->integer || g_saberRealisticCombat->integer) { dFlags |= DAMAGE_DISMEMBER; - if ( hitDismember[i] ) + if (hitDismember[i]) { victim->client->dismembered = false; } } - else if ( hitDismember[i] ) + else if (hitDismember[i]) { dFlags |= DAMAGE_DISMEMBER; } - if ( !victim->client->dismembered ) + if (!victim->client->dismembered) { vicWasDismembered = qfalse; } } - if ( baseDamage <= 1.0f ) + if (baseDamage <= 1.0f) {//very mild damage - if ( victim->s.number == 0 || victim->client->ps.weapon == WP_SABER || victim->client->NPC_class == CLASS_GALAKMECH ) + if (victim->s.number == 0 || victim->client->ps.weapon == WP_SABER || victim->client->NPC_class == CLASS_GALAKMECH) {//if it's the player or a saber-user, don't kill them with this blow dFlags |= DAMAGE_NO_KILL; } @@ -1500,61 +1504,61 @@ qboolean WP_SaberApplyDamage( gentity_t *ent, float baseDamage, int baseDFlags, } else { - if ( victim->takedamage ) + if (victim->takedamage) {//some other breakable thing //create a flash here - if ( !g_noClashFlare ) + if (!g_noClashFlare) { - g_saberFlashTime = level.time-50; - VectorCopy( dmgSpot[i], g_saberFlashPos ); + g_saberFlashTime = level.time - 50; + VectorCopy(dmgSpot[i], g_saberFlashPos); } } } - if ( !PM_SuperBreakWinAnim( ent->client->ps.torsoAnim ) - && !PM_StabDownAnim( ent->client->ps.torsoAnim ) + if (!PM_SuperBreakWinAnim(ent->client->ps.torsoAnim) + && !PM_StabDownAnim(ent->client->ps.torsoAnim) && !g_saberRealisticCombat->integer - && g_saberDamageCapping->integer ) + && g_saberDamageCapping->integer) {//never cap the superbreak wins - if ( victim->client - && victim->s.number >= MAX_CLIENTS ) + if (victim->client + && victim->s.number >= MAX_CLIENTS) { - if ( victim->client->NPC_class == CLASS_SHADOWTROOPER - || ( victim->NPC && (victim->NPC->aiFlags&NPCAI_BOSS_CHARACTER) ) ) + if (victim->client->NPC_class == CLASS_SHADOWTROOPER + || (victim->NPC && (victim->NPC->aiFlags&NPCAI_BOSS_CHARACTER))) {//hit a boss character - int maxDmg = ((3-g_spskill->integer)*5)+10; - if ( totalDmg[i] > maxDmg ) + int maxDmg = ((3 - g_spskill->integer) * 5) + 10; + if (totalDmg[i] > maxDmg) { totalDmg[i] = maxDmg; - } + } } - else if ( victim->client->ps.weapon == WP_SABER + else if (victim->client->ps.weapon == WP_SABER || victim->client->NPC_class == CLASS_REBORN - || victim->client->NPC_class == CLASS_JEDI ) + || victim->client->NPC_class == CLASS_JEDI) {//hit a non-boss saber-user - int maxDmg = ((3-g_spskill->integer)*15)+30; - if ( totalDmg[i] > maxDmg ) + int maxDmg = ((3 - g_spskill->integer) * 15) + 30; + if (totalDmg[i] > maxDmg) { totalDmg[i] = maxDmg; - } + } } } - if ( victim->s.number < MAX_CLIENTS - && ent->NPC ) + if (victim->s.number < MAX_CLIENTS + && ent->NPC) { - if ( (ent->NPC->aiFlags&NPCAI_BOSS_CHARACTER) + if ((ent->NPC->aiFlags&NPCAI_BOSS_CHARACTER) || (ent->NPC->aiFlags&NPCAI_SUBBOSS_CHARACTER) - || ent->client->NPC_class == CLASS_SHADOWTROOPER ) + || ent->client->NPC_class == CLASS_SHADOWTROOPER) {//player hit by a boss character - int maxDmg = ((g_spskill->integer+1)*4)+3; - if ( totalDmg[i] > maxDmg ) + int maxDmg = ((g_spskill->integer + 1) * 4) + 3; + if (totalDmg[i] > maxDmg) { - totalDmg[i] = maxDmg; + totalDmg[i] = maxDmg; } } - else if ( g_spskill->integer < 3 ) //was < 2 + else if (g_spskill->integer < 3) //was < 2 {//player hit by any enemy //on easy or medium? - int maxDmg = ((g_spskill->integer+1)*10)+20; - if ( totalDmg[i] > maxDmg ) + int maxDmg = ((g_spskill->integer + 1) * 10) + 20; + if (totalDmg[i] > maxDmg) { totalDmg[i] = maxDmg; } @@ -1565,15 +1569,15 @@ qboolean WP_SaberApplyDamage( gentity_t *ent, float baseDamage, int baseDFlags, dFlags |= DAMAGE_NO_KNOCKBACK;//okay, let's try no knockback whatsoever... dFlags &= ~DAMAGE_DEATH_KNOCKBACK; - if ( g_saberRealisticCombat->integer ) + if (g_saberRealisticCombat->integer) { dFlags |= DAMAGE_NO_KNOCKBACK; dFlags &= ~DAMAGE_DEATH_KNOCKBACK; dFlags &= ~DAMAGE_NO_KILL; } - if ( ent->client && !ent->s.number ) + if (ent->client && !ent->s.number) { - switch( hitLoc[i] ) + switch (hitLoc[i]) { case HL_FOOT_RT: case HL_FOOT_LT: @@ -1602,15 +1606,15 @@ qboolean WP_SaberApplyDamage( gentity_t *ent, float baseDamage, int baseDFlags, } } - if ( saberType == SABER_SITH_SWORD ) + if (saberType == SABER_SITH_SWORD) {//do knockback - dFlags &= ~(DAMAGE_NO_KNOCKBACK|DAMAGE_DEATH_KNOCKBACK); + dFlags &= ~(DAMAGE_NO_KNOCKBACK | DAMAGE_DEATH_KNOCKBACK); } - if ( !WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].knockbackScale > 0.0f ) + if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].knockbackScale > 0.0f) { - dFlags &= ~(DAMAGE_NO_KNOCKBACK|DAMAGE_DEATH_KNOCKBACK); - if ( saberNum < 1 ) + dFlags &= ~(DAMAGE_NO_KNOCKBACK | DAMAGE_DEATH_KNOCKBACK); + if (saberNum < 1) { dFlags |= DAMAGE_SABER_KNOCKBACK1; } @@ -1619,11 +1623,11 @@ qboolean WP_SaberApplyDamage( gentity_t *ent, float baseDamage, int baseDFlags, dFlags |= DAMAGE_SABER_KNOCKBACK2; } } - else if ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].knockbackScale2 > 0.0f ) + else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].knockbackScale2 > 0.0f) { - dFlags &= ~(DAMAGE_NO_KNOCKBACK|DAMAGE_DEATH_KNOCKBACK); - if ( saberNum < 1 ) + dFlags &= ~(DAMAGE_NO_KNOCKBACK | DAMAGE_DEATH_KNOCKBACK); + if (saberNum < 1) { dFlags |= DAMAGE_SABER_KNOCKBACK1_B2; } @@ -1632,60 +1636,60 @@ qboolean WP_SaberApplyDamage( gentity_t *ent, float baseDamage, int baseDFlags, dFlags |= DAMAGE_SABER_KNOCKBACK2_B2; } } - if ( thrownSaber ) + if (thrownSaber) { inflictor = &g_entities[ent->client->ps.saberEntityNum]; } int damage = 0; - if ( !WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].damageScale != 1.0f ) + if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].damageScale != 1.0f) { - damage = ceil(totalDmg[i]*ent->client->ps.saber[saberNum].damageScale); + damage = ceil(totalDmg[i] * ent->client->ps.saber[saberNum].damageScale); } - else if ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && ent->client->ps.saber[saberNum].damageScale2 != 1.0f ) + else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].damageScale2 != 1.0f) { - damage = ceil(totalDmg[i]*ent->client->ps.saber[saberNum].damageScale2); + damage = ceil(totalDmg[i] * ent->client->ps.saber[saberNum].damageScale2); } else { damage = ceil(totalDmg[i]); - } - G_Damage( victim, inflictor, ent, dmgDir[i], dmgSpot[i], damage, dFlags, MOD_SABER, hitDismemberLoc[i] ); - if ( damage > 0 && cg.time ) + } + G_Damage(victim, inflictor, ent, dmgDir[i], dmgSpot[i], damage, dFlags, MOD_SABER, hitDismemberLoc[i]); + if (damage > 0 && cg.time) { float sizeTimeScale = 1.0f; - if ( (vicWasAlive - && victim->health <= 0 ) - || (!vicWasDismembered - && victim->client->dismembered - && hitDismemberLoc[i] != HL_NONE - && hitDismember[i]) ) + if ((vicWasAlive + && victim->health <= 0) + || (!vicWasDismembered + && victim->client->dismembered + && hitDismemberLoc[i] != HL_NONE + && hitDismember[i])) { sizeTimeScale = 3.0f; } //FIXME: if not hitting the first model on the enemy, don't do this! - CG_SaberDoWeaponHitMarks( ent->client, - (ent->client->ps.saberInFlight?&g_entities[ent->client->ps.saberEntityNum]:NULL), - victim, - saberNum, - bladeNum, - dmgSpot[i], - dmgDir[i], - dmgBladeVec[i], - dmgNormal[i], - sizeTimeScale ); - } + CG_SaberDoWeaponHitMarks(ent->client, + (ent->client->ps.saberInFlight ? &g_entities[ent->client->ps.saberEntityNum] : NULL), + victim, + saberNum, + bladeNum, + dmgSpot[i], + dmgDir[i], + dmgBladeVec[i], + dmgNormal[i], + sizeTimeScale); + } #ifndef FINAL_BUILD - if ( d_saberCombat->integer ) + if (d_saberCombat->integer) { - if ( (dFlags&DAMAGE_NO_DAMAGE) ) + if ((dFlags&DAMAGE_NO_DAMAGE)) { - gi.Printf( S_COLOR_RED"damage: fake, hitLoc %d\n", hitLoc[i] ); + gi.Printf(S_COLOR_RED"damage: fake, hitLoc %d\n", hitLoc[i]); } else { - gi.Printf( S_COLOR_RED"damage: %4.2f, hitLoc %d\n", totalDmg[i], hitLoc[i] ); + gi.Printf(S_COLOR_RED"damage: %4.2f, hitLoc %d\n", totalDmg[i], hitLoc[i]); } } #endif @@ -1693,14 +1697,14 @@ qboolean WP_SaberApplyDamage( gentity_t *ent, float baseDamage, int baseDFlags, //vec3_t splashBackDir; //VectorScale( dmgNormal[i], -1, splashBackDir ); //G_PlayEffect( G_EffectIndex( "blood_sparks" ), dmgSpot[i], splashBackDir ); - if ( ent->s.number == 0 ) + if (ent->s.number == 0) { - AddSoundEvent( victim->owner, dmgSpot[i], 256, AEL_DISCOVERED ); - AddSightEvent( victim->owner, dmgSpot[i], 512, AEL_DISCOVERED, 50 ); + AddSoundEvent(victim->owner, dmgSpot[i], 256, AEL_DISCOVERED); + AddSightEvent(victim->owner, dmgSpot[i], 512, AEL_DISCOVERED, 50); } - if ( ent->client ) + if (ent->client) { - if ( ent->enemy && ent->enemy == victim ) + if (ent->enemy && ent->enemy == victim) {//just so Jedi knows that he hit his enemy ent->client->ps.saberEventFlags |= SEF_HITENEMY; } @@ -1717,33 +1721,33 @@ qboolean WP_SaberApplyDamage( gentity_t *ent, float baseDamage, int baseDFlags, return didDamage; } -void WP_SaberDamageAdd( float trDmg, int trVictimEntityNum, vec3_t trDmgDir, vec3_t trDmgBladeVec, vec3_t trDmgNormal, vec3_t trDmgSpot, float dmg, float fraction, int trHitLoc, qboolean trDismember, int trDismemberLoc ) +void WP_SaberDamageAdd(float trDmg, int trVictimEntityNum, vec3_t trDmgDir, vec3_t trDmgBladeVec, vec3_t trDmgNormal, vec3_t trDmgSpot, float dmg, float fraction, int trHitLoc, qboolean trDismember, int trDismemberLoc) { int curVictim = 0; int i; - if ( trVictimEntityNum < 0 || trVictimEntityNum >= ENTITYNUM_WORLD ) + if (trVictimEntityNum < 0 || trVictimEntityNum >= ENTITYNUM_WORLD) { return; } - if ( trDmg * dmg < 10.0f ) + if (trDmg * dmg < 10.0f) {//too piddly an amount of damage to really count? //FIXME: but already did the effect, didn't we... sigh... //return; } - if ( trDmg ) + if (trDmg) {//did some damage to something - for ( i = 0; i < numVictims; i++ ) + for (i = 0; i < numVictims; i++) { - if ( victimEntityNum[i] == trVictimEntityNum ) + if (victimEntityNum[i] == trVictimEntityNum) {//already hit this guy before curVictim = i; break; } } - if ( i == numVictims ) + if (i == numVictims) {//haven't hit his guy before - if ( numVictims + 1 >= MAX_SABER_VICTIMS ) + if (numVictims + 1 >= MAX_SABER_VICTIMS) {//can't add another victim at this time return; } @@ -1753,38 +1757,38 @@ void WP_SaberDamageAdd( float trDmg, int trVictimEntityNum, vec3_t trDmgDir, vec } float addDmg = trDmg*dmg; - if ( trHitLoc!=HL_NONE && (hitLoc[curVictim]==HL_NONE||hitLocHealthPercentage[trHitLoc]>hitLocHealthPercentage[hitLoc[curVictim]]) ) + if (trHitLoc != HL_NONE && (hitLoc[curVictim] == HL_NONE || hitLocHealthPercentage[trHitLoc]>hitLocHealthPercentage[hitLoc[curVictim]])) {//this hitLoc is more critical than the previous one this frame hitLoc[curVictim] = trHitLoc; } - + totalDmg[curVictim] += addDmg; - if ( !VectorLengthSquared( dmgDir[curVictim] ) ) + if (!VectorLengthSquared(dmgDir[curVictim])) { - VectorCopy( trDmgDir, dmgDir[curVictim] ); + VectorCopy(trDmgDir, dmgDir[curVictim]); } - if ( !VectorLengthSquared( dmgBladeVec[curVictim] ) ) + if (!VectorLengthSquared(dmgBladeVec[curVictim])) { - VectorCopy( trDmgBladeVec, dmgBladeVec[curVictim] ); + VectorCopy(trDmgBladeVec, dmgBladeVec[curVictim]); } - if ( !VectorLengthSquared( dmgNormal[curVictim] ) ) + if (!VectorLengthSquared(dmgNormal[curVictim])) { - VectorCopy( trDmgNormal, dmgNormal[curVictim] ); + VectorCopy(trDmgNormal, dmgNormal[curVictim]); } - if ( !VectorLengthSquared( dmgSpot[curVictim] ) ) + if (!VectorLengthSquared(dmgSpot[curVictim])) { - VectorCopy( trDmgSpot, dmgSpot[curVictim] ); + VectorCopy(trDmgSpot, dmgSpot[curVictim]); } // Make sure we keep track of the fraction. Why? // Well, if the saber hits something that stops it, the damage isn't done past that point. dmgFraction[curVictim] = fraction; - if ( (trDismemberLoc != HL_NONE && hitDismemberLoc[curVictim] == HL_NONE) - || (!hitDismember[curVictim] && trDismember) ) + if ((trDismemberLoc != HL_NONE && hitDismemberLoc[curVictim] == HL_NONE) + || (!hitDismember[curVictim] && trDismember)) {//either this is the first dismember loc we got or we got a loc before, but it wasn't a dismember loc, so take the new one hitDismemberLoc[curVictim] = trDismemberLoc; } - if ( trDismember ) + if (trDismember) {//we scored a dismemberment hit... hitDismember[curVictim] = trDismember; } @@ -1799,8 +1803,8 @@ Breaks the two saber paths into 2 tris each and tests each tri for the first sab FIXME: subdivide the arc into a consistant increment FIXME: test the intersection to see if the sabers really did intersect (weren't going in the same direction and/or passed through same point at different times)? */ -extern qboolean tri_tri_intersect(vec3_t V0,vec3_t V1,vec3_t V2,vec3_t U0,vec3_t U1,vec3_t U2); -qboolean WP_SabersIntersect( gentity_t *ent1, int ent1SaberNum, int ent1BladeNum, gentity_t *ent2, qboolean checkDir ) +extern qboolean tri_tri_intersect(vec3_t V0, vec3_t V1, vec3_t V2, vec3_t U0, vec3_t U1, vec3_t U2); +qboolean WP_SabersIntersect(gentity_t *ent1, int ent1SaberNum, int ent1BladeNum, gentity_t *ent2, qboolean checkDir) { vec3_t saberBase1, saberTip1, saberBaseNext1, saberTipNext1; vec3_t saberBase2, saberTip2, saberBaseNext2, saberTipNext2; @@ -1808,118 +1812,118 @@ qboolean WP_SabersIntersect( gentity_t *ent1, int ent1SaberNum, int ent1BladeNum vec3_t dir; /* -#ifndef FINAL_BUILD + #ifndef FINAL_BUILD if ( d_saberCombat->integer ) { - gi.Printf( S_COLOR_GREEN"Doing precise saber intersection check\n" ); + gi.Printf( S_COLOR_GREEN"Doing precise saber intersection check\n" ); } -#endif + #endif */ - if ( !ent1 || !ent2 ) + if (!ent1 || !ent2) { return qfalse; } - if ( !ent1->client || !ent2->client ) + if (!ent1->client || !ent2->client) { return qfalse; } - if ( ent1->client->ps.SaberLength() <= 0 || ent2->client->ps.SaberLength() <= 0 ) + if (ent1->client->ps.SaberLength() <= 0 || ent2->client->ps.SaberLength() <= 0) { return qfalse; } - for ( ent2SaberNum = 0; ent2SaberNum < MAX_SABERS; ent2SaberNum++ ) + for (ent2SaberNum = 0; ent2SaberNum < MAX_SABERS; ent2SaberNum++) { - for ( ent2BladeNum = 0; ent2BladeNum < ent2->client->ps.saber[ent2SaberNum].numBlades; ent2BladeNum++ ) + for (ent2BladeNum = 0; ent2BladeNum < ent2->client->ps.saber[ent2SaberNum].numBlades; ent2BladeNum++) { - if ( ent2->client->ps.saber[ent2SaberNum].type != SABER_NONE - && ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].length > 0 ) + if (ent2->client->ps.saber[ent2SaberNum].type != SABER_NONE + && ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].length > 0) {//valid saber and this blade is on //if ( ent1->client->ps.saberInFlight ) { - VectorCopy( ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzlePointOld, saberBase1 ); - VectorCopy( ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzlePoint, saberBaseNext1 ); + VectorCopy(ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzlePointOld, saberBase1); + VectorCopy(ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzlePoint, saberBaseNext1); - VectorSubtract( ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzlePoint, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzlePointOld, dir ); - VectorNormalize( dir ); - VectorMA( saberBaseNext1, SABER_EXTRAPOLATE_DIST, dir, saberBaseNext1 ); + VectorSubtract(ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzlePoint, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzlePointOld, dir); + VectorNormalize(dir); + VectorMA(saberBaseNext1, SABER_EXTRAPOLATE_DIST, dir, saberBaseNext1); - VectorMA( saberBase1, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].length, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzleDirOld, saberTip1 ); - VectorMA( saberBaseNext1, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].length, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzleDir, saberTipNext1 ); + VectorMA(saberBase1, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].length, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzleDirOld, saberTip1); + VectorMA(saberBaseNext1, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].length, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzleDir, saberTipNext1); - VectorSubtract( saberTipNext1, saberTip1, dir ); - VectorNormalize( dir ); - VectorMA( saberTipNext1, SABER_EXTRAPOLATE_DIST, dir, saberTipNext1 ); + VectorSubtract(saberTipNext1, saberTip1, dir); + VectorNormalize(dir); + VectorMA(saberTipNext1, SABER_EXTRAPOLATE_DIST, dir, saberTipNext1); } /* else { - VectorCopy( ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzlePoint, saberBase1 ); - VectorCopy( ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzlePointNext, saberBaseNext1 ); - VectorMA( saberBase1, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].length, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzleDir, saberTip1 ); - VectorMA( saberBaseNext1, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].length, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzleDirNext, saberTipNext1 ); + VectorCopy( ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzlePoint, saberBase1 ); + VectorCopy( ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzlePointNext, saberBaseNext1 ); + VectorMA( saberBase1, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].length, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzleDir, saberTip1 ); + VectorMA( saberBaseNext1, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].length, ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzleDirNext, saberTipNext1 ); } */ //if ( ent2->client->ps.saberInFlight ) { - VectorCopy( ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzlePointOld, saberBase2 ); - VectorCopy( ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzlePoint, saberBaseNext2 ); + VectorCopy(ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzlePointOld, saberBase2); + VectorCopy(ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzlePoint, saberBaseNext2); - VectorSubtract( ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzlePoint, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzlePointOld, dir ); - VectorNormalize( dir ); - VectorMA( saberBaseNext2, SABER_EXTRAPOLATE_DIST, dir, saberBaseNext2 ); + VectorSubtract(ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzlePoint, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzlePointOld, dir); + VectorNormalize(dir); + VectorMA(saberBaseNext2, SABER_EXTRAPOLATE_DIST, dir, saberBaseNext2); - VectorMA( saberBase2, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].length, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzleDirOld, saberTip2 ); - VectorMA( saberBaseNext2, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].length, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzleDir, saberTipNext2 ); + VectorMA(saberBase2, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].length, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzleDirOld, saberTip2); + VectorMA(saberBaseNext2, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].length, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzleDir, saberTipNext2); - VectorSubtract( saberTipNext2, saberTip2, dir ); - VectorNormalize( dir ); - VectorMA( saberTipNext2, SABER_EXTRAPOLATE_DIST, dir, saberTipNext2 ); - } + VectorSubtract(saberTipNext2, saberTip2, dir); + VectorNormalize(dir); + VectorMA(saberTipNext2, SABER_EXTRAPOLATE_DIST, dir, saberTipNext2); + } /* else { - VectorCopy( ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzlePoint, saberBase2 ); - VectorCopy( ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzlePointNext, saberBaseNext2 ); - VectorMA( saberBase2, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].length, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzleDir, saberTip2 ); - VectorMA( saberBaseNext2, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].length, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzleDirNext, saberTipNext2 ); + VectorCopy( ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzlePoint, saberBase2 ); + VectorCopy( ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzlePointNext, saberBaseNext2 ); + VectorMA( saberBase2, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].length, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzleDir, saberTip2 ); + VectorMA( saberBaseNext2, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].length, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzleDirNext, saberTipNext2 ); } */ - if ( checkDir ) + if (checkDir) {//check the direction of the two swings to make sure the sabers are swinging towards each other vec3_t saberDir1, saberDir2; - VectorSubtract( saberTipNext1, saberTip1, saberDir1 ); - VectorSubtract( saberTipNext2, saberTip2, saberDir2 ); - VectorNormalize( saberDir1 ); - VectorNormalize( saberDir2 ); - if ( DotProduct( saberDir1, saberDir2 ) > 0.6f ) + VectorSubtract(saberTipNext1, saberTip1, saberDir1); + VectorSubtract(saberTipNext2, saberTip2, saberDir2); + VectorNormalize(saberDir1); + VectorNormalize(saberDir2); + if (DotProduct(saberDir1, saberDir2) > 0.6f) {//sabers moving in same dir, probably didn't actually hit continue; } //now check orientation of sabers, make sure they're not parallel or close to it - float dot = DotProduct( ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzleDir, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzleDir ); - if ( dot > 0.9f || dot < -0.9f ) + float dot = DotProduct(ent1->client->ps.saber[ent1SaberNum].blade[ent1BladeNum].muzzleDir, ent2->client->ps.saber[ent2SaberNum].blade[ent2BladeNum].muzzleDir); + if (dot > 0.9f || dot < -0.9f) {//too parallel to really block effectively? continue; } } - if ( tri_tri_intersect( saberBase1, saberTip1, saberBaseNext1, saberBase2, saberTip2, saberBaseNext2 ) ) + if (tri_tri_intersect(saberBase1, saberTip1, saberBaseNext1, saberBase2, saberTip2, saberBaseNext2)) { return qtrue; } - if ( tri_tri_intersect( saberBase1, saberTip1, saberBaseNext1, saberBase2, saberTip2, saberTipNext2 ) ) + if (tri_tri_intersect(saberBase1, saberTip1, saberBaseNext1, saberBase2, saberTip2, saberTipNext2)) { return qtrue; } - if ( tri_tri_intersect( saberBase1, saberTip1, saberTipNext1, saberBase2, saberTip2, saberBaseNext2 ) ) + if (tri_tri_intersect(saberBase1, saberTip1, saberTipNext1, saberBase2, saberTip2, saberBaseNext2)) { return qtrue; } - if ( tri_tri_intersect( saberBase1, saberTip1, saberTipNext1, saberBase2, saberTip2, saberTipNext2 ) ) + if (tri_tri_intersect(saberBase1, saberTip1, saberTipNext1, saberBase2, saberTip2, saberTipNext2)) { return qtrue; } @@ -1929,29 +1933,29 @@ qboolean WP_SabersIntersect( gentity_t *ent1, int ent1SaberNum, int ent1BladeNum return qfalse; } -float WP_SabersDistance( gentity_t *ent1, gentity_t *ent2 ) +float WP_SabersDistance(gentity_t *ent1, gentity_t *ent2) { vec3_t saberBaseNext1, saberTipNext1, saberPoint1; vec3_t saberBaseNext2, saberTipNext2, saberPoint2; /* -#ifndef FINAL_BUILD + #ifndef FINAL_BUILD if ( d_saberCombat->integer ) { - gi.Printf( S_COLOR_GREEN"Doing precise saber intersection check\n" ); + gi.Printf( S_COLOR_GREEN"Doing precise saber intersection check\n" ); } -#endif + #endif */ - if ( !ent1 || !ent2 ) + if (!ent1 || !ent2) { return qfalse; } - if ( !ent1->client || !ent2->client ) + if (!ent1->client || !ent2->client) { return qfalse; } - if ( ent1->client->ps.SaberLength() <= 0 || ent2->client->ps.SaberLength() <= 0 ) + if (ent1->client->ps.SaberLength() <= 0 || ent2->client->ps.SaberLength() <= 0) { return qfalse; } @@ -1960,108 +1964,108 @@ float WP_SabersDistance( gentity_t *ent1, gentity_t *ent2 ) //if ( ent1->client->ps.saberInFlight ) { - VectorCopy( ent1->client->ps.saber[0].blade[0].muzzlePoint, saberBaseNext1 ); - VectorMA( saberBaseNext1, ent1->client->ps.saber[0].blade[0].length, ent1->client->ps.saber[0].blade[0].muzzleDir, saberTipNext1 ); + VectorCopy(ent1->client->ps.saber[0].blade[0].muzzlePoint, saberBaseNext1); + VectorMA(saberBaseNext1, ent1->client->ps.saber[0].blade[0].length, ent1->client->ps.saber[0].blade[0].muzzleDir, saberTipNext1); } /* else { - VectorCopy( ent1->client->ps.saber[0].blade[0].muzzlePointNext, saberBaseNext1 ); - VectorMA( saberBaseNext1, ent1->client->ps.saber[0].blade[0].length, ent1->client->ps.saber[0].blade[0].muzzleDirNext, saberTipNext1 ); + VectorCopy( ent1->client->ps.saber[0].blade[0].muzzlePointNext, saberBaseNext1 ); + VectorMA( saberBaseNext1, ent1->client->ps.saber[0].blade[0].length, ent1->client->ps.saber[0].blade[0].muzzleDirNext, saberTipNext1 ); } */ //if ( ent2->client->ps.saberInFlight ) { - VectorCopy( ent2->client->ps.saber[0].blade[0].muzzlePoint, saberBaseNext2 ); - VectorMA( saberBaseNext2, ent2->client->ps.saber[0].blade[0].length, ent2->client->ps.saber[0].blade[0].muzzleDir, saberTipNext2 ); + VectorCopy(ent2->client->ps.saber[0].blade[0].muzzlePoint, saberBaseNext2); + VectorMA(saberBaseNext2, ent2->client->ps.saber[0].blade[0].length, ent2->client->ps.saber[0].blade[0].muzzleDir, saberTipNext2); } /* else { - VectorCopy( ent2->client->ps.saber[0].blade[0].muzzlePointNext, saberBaseNext2 ); - VectorMA( saberBaseNext2, ent2->client->ps.saber[0].blade[0].length, ent2->client->ps.saber[0].blade[0].muzzleDirNext, saberTipNext2 ); + VectorCopy( ent2->client->ps.saber[0].blade[0].muzzlePointNext, saberBaseNext2 ); + VectorMA( saberBaseNext2, ent2->client->ps.saber[0].blade[0].length, ent2->client->ps.saber[0].blade[0].muzzleDirNext, saberTipNext2 ); } */ - float sabersDist = ShortestLineSegBewteen2LineSegs( saberBaseNext1, saberTipNext1, saberBaseNext2, saberTipNext2, saberPoint1, saberPoint2 ); + float sabersDist = ShortestLineSegBewteen2LineSegs(saberBaseNext1, saberTipNext1, saberBaseNext2, saberTipNext2, saberPoint1, saberPoint2); //okay, this is a super hack, but makes saber collisions look better from the player point of view /* if ( sabersDist < 16.0f ) { - vec3_t saberDistDir, saberMidPoint, camLookDir; + vec3_t saberDistDir, saberMidPoint, camLookDir; - VectorSubtract( saberPoint2, saberPoint1, saberDistDir ); - VectorMA( saberPoint1, 0.5f, saberDistDir, saberMidPoint ); - VectorSubtract( saberMidPoint, cg.refdef.vieworg, camLookDir ); - VectorNormalize( saberDistDir ); - VectorNormalize( camLookDir ); - float dot = fabs(DotProduct( camLookDir, saberDistDir )); - sabersDist -= 8.0f*dot; - if ( sabersDist < 0.0f ) - { - sabersDist = 0.0f; - } + VectorSubtract( saberPoint2, saberPoint1, saberDistDir ); + VectorMA( saberPoint1, 0.5f, saberDistDir, saberMidPoint ); + VectorSubtract( saberMidPoint, cg.refdef.vieworg, camLookDir ); + VectorNormalize( saberDistDir ); + VectorNormalize( camLookDir ); + float dot = fabs(DotProduct( camLookDir, saberDistDir )); + sabersDist -= 8.0f*dot; + if ( sabersDist < 0.0f ) + { + sabersDist = 0.0f; + } } */ #ifndef FINAL_BUILD - if ( d_saberCombat->integer > 2 ) + if (d_saberCombat->integer > 2) { - G_DebugLine( saberPoint1, saberPoint2, FRAMETIME, 0x00ffffff, qtrue ); + G_DebugLine(saberPoint1, saberPoint2, FRAMETIME, 0x00ffffff, qtrue); } #endif return sabersDist; } -qboolean WP_SabersIntersection( gentity_t *ent1, gentity_t *ent2, vec3_t intersect ) +qboolean WP_SabersIntersection(gentity_t *ent1, gentity_t *ent2, vec3_t intersect) { vec3_t saberBaseNext1, saberTipNext1, saberPoint1; vec3_t saberBaseNext2, saberTipNext2, saberPoint2; int saberNum1, saberNum2, bladeNum1, bladeNum2; float lineSegLength, bestLineSegLength = Q3_INFINITE; - if ( !ent1 || !ent2 ) + if (!ent1 || !ent2) { return qfalse; } - if ( !ent1->client || !ent2->client ) + if (!ent1->client || !ent2->client) { return qfalse; } - if ( ent1->client->ps.SaberLength() <= 0 || ent2->client->ps.SaberLength() <= 0 ) + if (ent1->client->ps.SaberLength() <= 0 || ent2->client->ps.SaberLength() <= 0) { return qfalse; } //UGH, had to make this work for multiply-bladed sabers - for ( saberNum1 = 0; saberNum1 < MAX_SABERS; saberNum1++ ) + for (saberNum1 = 0; saberNum1 < MAX_SABERS; saberNum1++) { - for ( bladeNum1 = 0; bladeNum1 < ent1->client->ps.saber[saberNum1].numBlades; bladeNum1++ ) + for (bladeNum1 = 0; bladeNum1 < ent1->client->ps.saber[saberNum1].numBlades; bladeNum1++) { - if ( ent1->client->ps.saber[saberNum1].type != SABER_NONE - && ent1->client->ps.saber[saberNum1].blade[bladeNum1].length > 0 ) + if (ent1->client->ps.saber[saberNum1].type != SABER_NONE + && ent1->client->ps.saber[saberNum1].blade[bladeNum1].length > 0) {//valid saber and this blade is on - for ( saberNum2 = 0; saberNum2 < MAX_SABERS; saberNum2++ ) + for (saberNum2 = 0; saberNum2 < MAX_SABERS; saberNum2++) { - for ( bladeNum2 = 0; bladeNum2 < ent2->client->ps.saber[saberNum2].numBlades; bladeNum2++ ) + for (bladeNum2 = 0; bladeNum2 < ent2->client->ps.saber[saberNum2].numBlades; bladeNum2++) { - if ( ent2->client->ps.saber[saberNum2].type != SABER_NONE - && ent2->client->ps.saber[saberNum2].blade[bladeNum2].length > 0 ) + if (ent2->client->ps.saber[saberNum2].type != SABER_NONE + && ent2->client->ps.saber[saberNum2].blade[bladeNum2].length > 0) {//valid saber and this blade is on - VectorCopy( ent1->client->ps.saber[saberNum1].blade[bladeNum1].muzzlePoint, saberBaseNext1 ); - VectorMA( saberBaseNext1, ent1->client->ps.saber[saberNum1].blade[bladeNum1].length, ent1->client->ps.saber[saberNum1].blade[bladeNum1].muzzleDir, saberTipNext1 ); + VectorCopy(ent1->client->ps.saber[saberNum1].blade[bladeNum1].muzzlePoint, saberBaseNext1); + VectorMA(saberBaseNext1, ent1->client->ps.saber[saberNum1].blade[bladeNum1].length, ent1->client->ps.saber[saberNum1].blade[bladeNum1].muzzleDir, saberTipNext1); - VectorCopy( ent2->client->ps.saber[saberNum2].blade[bladeNum2].muzzlePoint, saberBaseNext2 ); - VectorMA( saberBaseNext2, ent2->client->ps.saber[saberNum2].blade[bladeNum2].length, ent2->client->ps.saber[saberNum2].blade[bladeNum2].muzzleDir, saberTipNext2 ); + VectorCopy(ent2->client->ps.saber[saberNum2].blade[bladeNum2].muzzlePoint, saberBaseNext2); + VectorMA(saberBaseNext2, ent2->client->ps.saber[saberNum2].blade[bladeNum2].length, ent2->client->ps.saber[saberNum2].blade[bladeNum2].muzzleDir, saberTipNext2); - lineSegLength = ShortestLineSegBewteen2LineSegs( saberBaseNext1, saberTipNext1, saberBaseNext2, saberTipNext2, saberPoint1, saberPoint2 ); - if ( lineSegLength < bestLineSegLength ) + lineSegLength = ShortestLineSegBewteen2LineSegs(saberBaseNext1, saberTipNext1, saberBaseNext2, saberTipNext2, saberPoint1, saberPoint2); + if (lineSegLength < bestLineSegLength) { bestLineSegLength = lineSegLength; - VectorAdd( saberPoint1, saberPoint2, intersect ); - VectorScale( intersect, 0.5, intersect ); + VectorAdd(saberPoint1, saberPoint2, intersect); + VectorScale(intersect, 0.5, intersect); } } } @@ -2075,75 +2079,75 @@ qboolean WP_SabersIntersection( gentity_t *ent1, gentity_t *ent2, vec3_t interse const char *hit_blood_sparks = "sparks/blood_sparks2"; // could have changed this effect directly, but this is just safer in case anyone anywhere else is using the old one for something? const char *hit_sparks = "saber/saber_cut"; -qboolean WP_SaberDamageEffects( trace_t *tr, const vec3_t start, float length, float dmg, vec3_t dmgDir, vec3_t bladeVec, int enemyTeam, saberType_t saberType, saberInfo_t *saber, int bladeNum ) +qboolean WP_SaberDamageEffects(trace_t *tr, const vec3_t start, float length, float dmg, vec3_t dmgDir, vec3_t bladeVec, int enemyTeam, saberType_t saberType, saberInfo_t *saber, int bladeNum) { int hitEntNum[MAX_G2_COLLISIONS]; - for ( int hen = 0; hen < MAX_G2_COLLISIONS; hen++ ) + for (int hen = 0; hen < MAX_G2_COLLISIONS; hen++) { hitEntNum[hen] = ENTITYNUM_NONE; } //NOTE: = {0} does NOT work on anything but bytes? - float hitEntDmgAdd[MAX_G2_COLLISIONS] = {0}; - float hitEntDmgSub[MAX_G2_COLLISIONS] = {0}; + float hitEntDmgAdd[MAX_G2_COLLISIONS] = { 0 }; + float hitEntDmgSub[MAX_G2_COLLISIONS] = { 0 }; vec3_t hitEntPoint[MAX_G2_COLLISIONS]; vec3_t hitEntNormal[MAX_G2_COLLISIONS]; vec3_t bladeDir; - float hitEntStartFrac[MAX_G2_COLLISIONS] = {0}; - int trHitLoc[MAX_G2_COLLISIONS] = {HL_NONE};//same as 0 - int trDismemberLoc[MAX_G2_COLLISIONS] = {HL_NONE};//same as 0 - qboolean trDismember[MAX_G2_COLLISIONS] = {qfalse};//same as 0 - int i,z; + float hitEntStartFrac[MAX_G2_COLLISIONS] = { 0 }; + int trHitLoc[MAX_G2_COLLISIONS] = { HL_NONE };//same as 0 + int trDismemberLoc[MAX_G2_COLLISIONS] = { HL_NONE };//same as 0 + qboolean trDismember[MAX_G2_COLLISIONS] = { qfalse };//same as 0 + int i, z; int numHitEnts = 0; - float distFromStart,doDmg; + float distFromStart, doDmg; int hitEffect = 0; const char *trSurfName; gentity_t *hitEnt; - - VectorNormalize2( bladeVec, bladeDir ); - for (z=0; z < MAX_G2_COLLISIONS; z++) + VectorNormalize2(bladeVec, bladeDir); + + for (z = 0; z < MAX_G2_COLLISIONS; z++) { - if ( tr->G2CollisionMap[z].mEntityNum == -1 ) + if (tr->G2CollisionMap[z].mEntityNum == -1) {//actually, completely break out of this for loop since nothing after this in the aray should ever be valid either continue;//break;// } - CCollisionRecord &coll = tr->G2CollisionMap[z]; + CCollisionRecord &coll = tr->G2CollisionMap[z]; //distFromStart = Distance( start, coll.mCollisionPosition ); - distFromStart = coll.mDistance; + distFromStart = coll.mDistance; /* //FIXME: (distFromStart/length) is not guaranteed to be from 0 to 1... *sigh*... if ( length && saberHitFraction < 1.0f && (distFromStart/length) < 1.0f && (distFromStart/length) > saberHitFraction ) {//a saber was hit before this point, don't count it -#ifndef FINAL_BUILD - if ( d_saberCombat->integer ) - { - gi.Printf( S_COLOR_MAGENTA"rejecting G2 collision- %4.2f farther than saberHitFraction %4.2f\n", (distFromStart/length), saberHitFraction ); - } -#endif - continue; + #ifndef FINAL_BUILD + if ( d_saberCombat->integer ) + { + gi.Printf( S_COLOR_MAGENTA"rejecting G2 collision- %4.2f farther than saberHitFraction %4.2f\n", (distFromStart/length), saberHitFraction ); + } + #endif + continue; } */ - for ( i = 0; i < numHitEnts; i++ ) + for (i = 0; i < numHitEnts; i++) { - if ( hitEntNum[i] == coll.mEntityNum ) + if (hitEntNum[i] == coll.mEntityNum) {//we hit this ent before //we'll want to add this dist hitEntDmgAdd[i] = distFromStart; break; } } - if ( i == numHitEnts ) + if (i == numHitEnts) {//first time we hit this ent - if ( numHitEnts == MAX_G2_COLLISIONS ) + if (numHitEnts == MAX_G2_COLLISIONS) {//hit too many damn ents! continue; } hitEntNum[numHitEnts] = coll.mEntityNum; - if ( !coll.mFlags ) + if (!coll.mFlags) {//hmm, we came out first, so we must have started inside //we'll want to subtract this dist hitEntDmgAdd[numHitEnts] = distFromStart; @@ -2154,76 +2158,76 @@ qboolean WP_SaberDamageEffects( trace_t *tr, const vec3_t start, float length, f hitEntDmgSub[numHitEnts] = distFromStart; } //keep track of how far in the damage was done - hitEntStartFrac[numHitEnts] = hitEntDmgSub[numHitEnts]/length; + hitEntStartFrac[numHitEnts] = hitEntDmgSub[numHitEnts] / length; //remember the entrance point - VectorCopy( coll.mCollisionPosition, hitEntPoint[numHitEnts] ); + VectorCopy(coll.mCollisionPosition, hitEntPoint[numHitEnts]); //remember the normal of the face we hit - VectorCopy( coll.mCollisionNormal, hitEntNormal[numHitEnts] ); - VectorNormalize( hitEntNormal[numHitEnts] ); - + VectorCopy(coll.mCollisionNormal, hitEntNormal[numHitEnts]); + VectorNormalize(hitEntNormal[numHitEnts]); + //do the effect //FIXME: check material rather than team? hitEnt = &g_entities[hitEntNum[numHitEnts]]; - if ( hitEnt - && hitEnt->client - && coll.mModelIndex > 0 ) + if (hitEnt + && hitEnt->client + && coll.mModelIndex > 0) {//hit a submodel on the enemy, not their actual body! - if ( !WP_SaberBladeUseSecondBladeStyle( saber, bladeNum ) - && saber->hitOtherEffect ) + if (!WP_SaberBladeUseSecondBladeStyle(saber, bladeNum) + && saber->hitOtherEffect) { hitEffect = saber->hitOtherEffect; } - else if ( WP_SaberBladeUseSecondBladeStyle( saber, bladeNum ) - && saber->hitOtherEffect2 ) + else if (WP_SaberBladeUseSecondBladeStyle(saber, bladeNum) + && saber->hitOtherEffect2) { hitEffect = saber->hitOtherEffect2; } else { - hitEffect = G_EffectIndex( hit_sparks ); + hitEffect = G_EffectIndex(hit_sparks); } } else { - if ( !WP_SaberBladeUseSecondBladeStyle( saber, bladeNum ) - && saber->hitPersonEffect ) + if (!WP_SaberBladeUseSecondBladeStyle(saber, bladeNum) + && saber->hitPersonEffect) { hitEffect = saber->hitPersonEffect; } - else if ( WP_SaberBladeUseSecondBladeStyle( saber, bladeNum ) - && saber->hitPersonEffect2 ) + else if (WP_SaberBladeUseSecondBladeStyle(saber, bladeNum) + && saber->hitPersonEffect2) { hitEffect = saber->hitPersonEffect2; } else { - hitEffect = G_EffectIndex( hit_blood_sparks ); + hitEffect = G_EffectIndex(hit_blood_sparks); } } - if ( hitEnt != NULL ) + if (hitEnt != NULL) { - if ( hitEnt->client ) + if (hitEnt->client) { class_t npc_class = hitEnt->client->NPC_class; - if ( npc_class == CLASS_SEEKER || npc_class == CLASS_PROBE || npc_class == CLASS_MOUSE || npc_class == CLASS_REMOTE || - npc_class == CLASS_GONK || npc_class == CLASS_R2D2 || npc_class == CLASS_R5D2 || - npc_class == CLASS_PROTOCOL || npc_class == CLASS_MARK1 || npc_class == CLASS_MARK2 || - npc_class == CLASS_INTERROGATOR || npc_class == CLASS_ATST || npc_class == CLASS_SENTRY ) + if (npc_class == CLASS_SEEKER || npc_class == CLASS_PROBE || npc_class == CLASS_MOUSE || npc_class == CLASS_REMOTE || + npc_class == CLASS_GONK || npc_class == CLASS_R2D2 || npc_class == CLASS_R5D2 || + npc_class == CLASS_PROTOCOL || npc_class == CLASS_MARK1 || npc_class == CLASS_MARK2 || + npc_class == CLASS_INTERROGATOR || npc_class == CLASS_ATST || npc_class == CLASS_SENTRY) { - if ( !WP_SaberBladeUseSecondBladeStyle( saber, bladeNum ) - && saber->hitOtherEffect ) + if (!WP_SaberBladeUseSecondBladeStyle(saber, bladeNum) + && saber->hitOtherEffect) { hitEffect = saber->hitOtherEffect; } - else if ( WP_SaberBladeUseSecondBladeStyle( saber, bladeNum ) - && saber->hitOtherEffect2 ) + else if (WP_SaberBladeUseSecondBladeStyle(saber, bladeNum) + && saber->hitOtherEffect2) { hitEffect = saber->hitOtherEffect2; } else { - hitEffect = G_EffectIndex( hit_sparks ); + hitEffect = G_EffectIndex(hit_sparks); } } } @@ -2231,38 +2235,38 @@ qboolean WP_SaberDamageEffects( trace_t *tr, const vec3_t start, float length, f { // So sue me, this is the easiest way to check to see if this is the turbo laser from t2_wedge, // in which case I don't want the saber effects goin off on it. - if ( (hitEnt->flags&FL_DMG_BY_HEAVY_WEAP_ONLY) + if ((hitEnt->flags&FL_DMG_BY_HEAVY_WEAP_ONLY) && hitEnt->takedamage == qfalse - && Q_stricmp( hitEnt->classname, "misc_turret" ) == 0 ) + && Q_stricmp(hitEnt->classname, "misc_turret") == 0) { continue; } else { - if ( dmg ) + if (dmg) {//only do these effects if actually trying to damage the thing... - if ( (hitEnt->svFlags&SVF_BBRUSH)//a breakable brush - && ( (hitEnt->spawnflags&1)//INVINCIBLE - ||(hitEnt->flags&FL_DMG_BY_HEAVY_WEAP_ONLY) )//HEAVY weapon damage only - ) + if ((hitEnt->svFlags&SVF_BBRUSH)//a breakable brush + && ((hitEnt->spawnflags & 1)//INVINCIBLE + || (hitEnt->flags&FL_DMG_BY_HEAVY_WEAP_ONLY))//HEAVY weapon damage only + ) {//no hit effect (besides regular client-side one) hitEffect = 0; } else { - if ( !WP_SaberBladeUseSecondBladeStyle( saber, bladeNum ) - && saber->hitOtherEffect ) + if (!WP_SaberBladeUseSecondBladeStyle(saber, bladeNum) + && saber->hitOtherEffect) { hitEffect = saber->hitOtherEffect; } - else if ( WP_SaberBladeUseSecondBladeStyle( saber, bladeNum ) - && saber->hitOtherEffect2 ) + else if (WP_SaberBladeUseSecondBladeStyle(saber, bladeNum) + && saber->hitOtherEffect2) { hitEffect = saber->hitOtherEffect2; } else { - hitEffect = G_EffectIndex( hit_sparks ); + hitEffect = G_EffectIndex(hit_sparks); } } } @@ -2271,36 +2275,36 @@ qboolean WP_SaberDamageEffects( trace_t *tr, const vec3_t start, float length, f } //FIXME: play less if damage is less? - if ( !g_saberNoEffects ) - { - if ( hitEffect != 0 ) + if (!g_saberNoEffects) + { + if (hitEffect != 0) { //FIXME: when you have multiple blades hitting someone for many sequential server frames, this can get a bit chuggy! - G_PlayEffect( hitEffect, coll.mCollisionPosition, coll.mCollisionNormal ); + G_PlayEffect(hitEffect, coll.mCollisionPosition, coll.mCollisionNormal); } } //Get the hit location based on surface name - if ( (hitLoc[hitEntNum[numHitEnts]] == HL_NONE && trHitLoc[numHitEnts] == HL_NONE) + if ((hitLoc[hitEntNum[numHitEnts]] == HL_NONE && trHitLoc[numHitEnts] == HL_NONE) || (hitDismemberLoc[hitEntNum[numHitEnts]] == HL_NONE && trDismemberLoc[numHitEnts] == HL_NONE) - || (!hitDismember[hitEntNum[numHitEnts]] && !trDismember[numHitEnts]) ) + || (!hitDismember[hitEntNum[numHitEnts]] && !trDismember[numHitEnts])) {//no hit loc set for this ent this damage cycle yet //FIXME: find closest impact surf *first* (per ent), then call G_GetHitLocFromSurfName? //FIXED: if hit multiple ents in this collision record, these trSurfName, trDismember and trDismemberLoc will get stomped/confused over the multiple ents I hit - trSurfName = gi.G2API_GetSurfaceName( &g_entities[coll.mEntityNum].ghoul2[coll.mModelIndex], coll.mSurfaceIndex ); - trDismember[numHitEnts] = G_GetHitLocFromSurfName( &g_entities[coll.mEntityNum], trSurfName, &trHitLoc[numHitEnts], coll.mCollisionPosition, dmgDir, bladeDir, MOD_SABER, saberType ); - if ( trDismember[numHitEnts] ) + trSurfName = gi.G2API_GetSurfaceName(&g_entities[coll.mEntityNum].ghoul2[coll.mModelIndex], coll.mSurfaceIndex); + trDismember[numHitEnts] = G_GetHitLocFromSurfName(&g_entities[coll.mEntityNum], trSurfName, &trHitLoc[numHitEnts], coll.mCollisionPosition, dmgDir, bladeDir, MOD_SABER, saberType); + if (trDismember[numHitEnts]) { trDismemberLoc[numHitEnts] = trHitLoc[numHitEnts]; } /* if ( trDismember[numHitEnts] ) { - Com_Printf( S_COLOR_RED"Okay to dismember %s on ent %d\n", hitLocName[trDismemberLoc[numHitEnts]], hitEntNum[numHitEnts] ); + Com_Printf( S_COLOR_RED"Okay to dismember %s on ent %d\n", hitLocName[trDismemberLoc[numHitEnts]], hitEntNum[numHitEnts] ); } else { - Com_Printf( "Hit (no dismember) %s on ent %d\n", hitLocName[trHitLoc[numHitEnts]], hitEntNum[numHitEnts] ); + Com_Printf( "Hit (no dismember) %s on ent %d\n", hitLocName[trHitLoc[numHitEnts]], hitEntNum[numHitEnts] ); } */ } @@ -2309,128 +2313,128 @@ qboolean WP_SaberDamageEffects( trace_t *tr, const vec3_t start, float length, f } //now go through all the ents we hit and do the damage - for ( i = 0; i < numHitEnts; i++ ) + for (i = 0; i < numHitEnts; i++) { doDmg = dmg; - if ( hitEntNum[i] != ENTITYNUM_NONE ) + if (hitEntNum[i] != ENTITYNUM_NONE) { - if ( doDmg < 10 ) + if (doDmg < 10) {//base damage is less than 10 - if ( hitEntNum[i] != 0 ) + if (hitEntNum[i] != 0) {//not the player hitEnt = &g_entities[hitEntNum[i]]; - if ( !hitEnt->client || (hitEnt->client->ps.weapon!=WP_SABER&&hitEnt->client->NPC_class!=CLASS_GALAKMECH&&hitEnt->client->playerTeam==enemyTeam) ) + if (!hitEnt->client || (hitEnt->client->ps.weapon != WP_SABER&&hitEnt->client->NPC_class != CLASS_GALAKMECH&&hitEnt->client->playerTeam == enemyTeam)) {//did *not* hit a jedi and did *not* hit the player //make sure the base damage is high against non-jedi, feels better doDmg = 10; } } } - if ( !hitEntDmgAdd[i] && !hitEntDmgSub[i] ) + if (!hitEntDmgAdd[i] && !hitEntDmgSub[i]) {//spent entire time in model //NOTE: will we even get a collision then? doDmg *= length; } - else if ( hitEntDmgAdd[i] && hitEntDmgSub[i] ) + else if (hitEntDmgAdd[i] && hitEntDmgSub[i]) {//we did enter and exit doDmg *= hitEntDmgAdd[i] - hitEntDmgSub[i]; } - else if ( !hitEntDmgAdd[i] ) + else if (!hitEntDmgAdd[i]) {//we didn't exit, just entered doDmg *= length - hitEntDmgSub[i]; } - else if ( !hitEntDmgSub[i] ) + else if (!hitEntDmgSub[i]) {//we didn't enter, only exited doDmg *= hitEntDmgAdd[i]; } - if ( doDmg > 0 ) + if (doDmg > 0) { - WP_SaberDamageAdd( 1.0, hitEntNum[i], dmgDir, bladeVec, hitEntNormal[i], hitEntPoint[i], ceil(doDmg), hitEntStartFrac[i], trHitLoc[i], trDismember[i], trDismemberLoc[i] ); + WP_SaberDamageAdd(1.0, hitEntNum[i], dmgDir, bladeVec, hitEntNormal[i], hitEntPoint[i], ceil(doDmg), hitEntStartFrac[i], trHitLoc[i], trDismember[i], trDismemberLoc[i]); } } } return (numHitEnts>0); } -void WP_SaberBlockEffect( gentity_t *attacker, int saberNum, int bladeNum, vec3_t position, vec3_t normal, qboolean cutNotBlock ) +void WP_SaberBlockEffect(gentity_t *attacker, int saberNum, int bladeNum, vec3_t position, vec3_t normal, qboolean cutNotBlock) { saberInfo_t *saber = NULL; - - if ( attacker && attacker->client ) + + if (attacker && attacker->client) { saber = &attacker->client->ps.saber[saberNum]; } - if ( saber - && !WP_SaberBladeUseSecondBladeStyle( saber, bladeNum ) - && saber->blockEffect ) + if (saber + && !WP_SaberBladeUseSecondBladeStyle(saber, bladeNum) + && saber->blockEffect) { - if ( normal ) + if (normal) { - G_PlayEffect( saber->blockEffect, position, normal ); + G_PlayEffect(saber->blockEffect, position, normal); } else { - G_PlayEffect( saber->blockEffect, position ); + G_PlayEffect(saber->blockEffect, position); } } - else if ( saber - && WP_SaberBladeUseSecondBladeStyle( saber, bladeNum ) - && saber->blockEffect2 ) + else if (saber + && WP_SaberBladeUseSecondBladeStyle(saber, bladeNum) + && saber->blockEffect2) { - if ( normal ) + if (normal) { - G_PlayEffect( saber->blockEffect2, position, normal ); + G_PlayEffect(saber->blockEffect2, position, normal); } else { - G_PlayEffect( saber->blockEffect2, position ); + G_PlayEffect(saber->blockEffect2, position); } } - else if ( cutNotBlock ) + else if (cutNotBlock) { - if ( normal ) + if (normal) { - G_PlayEffect( "saber/saber_cut", position, normal ); + G_PlayEffect("saber/saber_cut", position, normal); } else { - G_PlayEffect( "saber/saber_cut", position ); + G_PlayEffect("saber/saber_cut", position); } } else { - if ( normal ) + if (normal) { - G_PlayEffect( "saber/saber_block", position, normal ); + G_PlayEffect("saber/saber_block", position, normal); } else { - G_PlayEffect( "saber/saber_block", position ); + G_PlayEffect("saber/saber_block", position); } } } -void WP_SaberKnockaway( gentity_t *attacker, trace_t *tr ) +void WP_SaberKnockaway(gentity_t *attacker, trace_t *tr) { - WP_SaberDrop( attacker, &g_entities[attacker->client->ps.saberEntityNum] ); - WP_SaberBlockSound( attacker, NULL, 0, 0 ); + WP_SaberDrop(attacker, &g_entities[attacker->client->ps.saberEntityNum]); + WP_SaberBlockSound(attacker, NULL, 0, 0); //G_Sound( &g_entities[attacker->client->ps.saberEntityNum], G_SoundIndex( va( "sound/weapons/saber/saberblock%d.wav", Q_irand(1, 9) ) ) ); - WP_SaberBlockEffect( attacker, 0, 0, tr->endpos, NULL, qfalse ); + WP_SaberBlockEffect(attacker, 0, 0, tr->endpos, NULL, qfalse); saberHitFraction = tr->fraction; #ifndef FINAL_BUILD - if ( d_saberCombat->integer ) + if (d_saberCombat->integer) { - gi.Printf( S_COLOR_MAGENTA"WP_SaberKnockaway: saberHitFraction %4.2f\n", saberHitFraction ); + gi.Printf(S_COLOR_MAGENTA"WP_SaberKnockaway: saberHitFraction %4.2f\n", saberHitFraction); } #endif - VectorCopy( tr->endpos, saberHitLocation ); + VectorCopy(tr->endpos, saberHitLocation); saberHitEntity = tr->entityNum; - if ( !g_noClashFlare ) + if (!g_noClashFlare) { - g_saberFlashTime = level.time-50; - VectorCopy( saberHitLocation, g_saberFlashPos ); + g_saberFlashTime = level.time - 50; + VectorCopy(saberHitLocation, g_saberFlashPos); } //FIXME: make hitEnt play an attack anim or some other special anim when this happens @@ -2438,11 +2442,11 @@ void WP_SaberKnockaway( gentity_t *attacker, trace_t *tr ) //NPC_SetAnim( hitEnt, SETANIM_BOTH, BOTH_KNOCKSABER, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); } -qboolean G_InCinematicSaberAnim( gentity_t *self ) +qboolean G_InCinematicSaberAnim(gentity_t *self) { - if ( self->NPC - && self->NPC->behaviorState == BS_CINEMATIC - && (self->client->ps.torsoAnim == BOTH_CIN_16 ||self->client->ps.torsoAnim == BOTH_CIN_17) ) + if (self->NPC + && self->NPC->behaviorState == BS_CINEMATIC + && (self->client->ps.torsoAnim == BOTH_CIN_16 || self->client->ps.torsoAnim == BOTH_CIN_17)) { return qtrue; } @@ -2450,144 +2454,144 @@ qboolean G_InCinematicSaberAnim( gentity_t *self ) } #define SABER_COLLISION_DIST 6//was 2//was 4//was 8//was 16 -extern qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f ); -qboolean WP_SaberDamageForTrace( int ignore, vec3_t start, vec3_t end, float dmg, - vec3_t bladeDir, qboolean noGhoul, int attackStrength, - saberType_t saberType, qboolean extrapolate, - int saberNum, int bladeNum ) +extern qboolean InFront(vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f); +qboolean WP_SaberDamageForTrace(int ignore, vec3_t start, vec3_t end, float dmg, + vec3_t bladeDir, qboolean noGhoul, int attackStrength, + saberType_t saberType, qboolean extrapolate, + int saberNum, int bladeNum) { trace_t tr; vec3_t dir; - int mask = (MASK_SHOT|CONTENTS_LIGHTSABER); + int mask = (MASK_SHOT | CONTENTS_LIGHTSABER); gentity_t *attacker = &g_entities[ignore]; vec3_t end2; - VectorCopy( end, end2 ); - if ( extrapolate ) + VectorCopy(end, end2); + if (extrapolate) { //NOTE: since we can no longer use the predicted point, extrapolate the trace some. // this may allow saber hits that aren't actually hits, but it doesn't look too bad vec3_t diff; - VectorSubtract( end, start, diff ); - VectorNormalize( diff ); - VectorMA( end2, SABER_EXTRAPOLATE_DIST, diff, end2 ); + VectorSubtract(end, start, diff); + VectorNormalize(diff); + VectorMA(end2, SABER_EXTRAPOLATE_DIST, diff, end2); } - if ( !noGhoul ) + if (!noGhoul) { float useRadiusForDamage = 0; - - if ( attacker - && attacker->client ) + + if (attacker + && attacker->client) {//see if we're not drawing the blade, if so, do a trace based on radius of blade (because the radius is being used to simulate a larger/smaller piece of a solid weapon)... - if ( !WP_SaberBladeUseSecondBladeStyle( &attacker->client->ps.saber[saberNum], bladeNum ) - && (attacker->client->ps.saber[saberNum].saberFlags2&SFL2_NO_BLADE) ) + if (!WP_SaberBladeUseSecondBladeStyle(&attacker->client->ps.saber[saberNum], bladeNum) + && (attacker->client->ps.saber[saberNum].saberFlags2&SFL2_NO_BLADE)) {//not drawing blade useRadiusForDamage = attacker->client->ps.saber[saberNum].blade[bladeNum].radius; } - else if ( WP_SaberBladeUseSecondBladeStyle( &attacker->client->ps.saber[saberNum], bladeNum ) - && (attacker->client->ps.saber[saberNum].saberFlags2&SFL2_NO_BLADE2) ) + else if (WP_SaberBladeUseSecondBladeStyle(&attacker->client->ps.saber[saberNum], bladeNum) + && (attacker->client->ps.saber[saberNum].saberFlags2&SFL2_NO_BLADE2)) {//not drawing blade useRadiusForDamage = attacker->client->ps.saber[saberNum].blade[bladeNum].radius; } } - if ( !useRadiusForDamage ) + if (!useRadiusForDamage) {//do normal check for larger-size saber traces - if ( !attacker->s.number - || (attacker->client - && (attacker->client->playerTeam==TEAM_PLAYER - || attacker->client->NPC_class==CLASS_SHADOWTROOPER - || attacker->client->NPC_class==CLASS_ALORA - || (attacker->NPC && (attacker->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) - ) - ) + if (!attacker->s.number + || (attacker->client + && (attacker->client->playerTeam == TEAM_PLAYER + || attacker->client->NPC_class == CLASS_SHADOWTROOPER + || attacker->client->NPC_class == CLASS_ALORA + || (attacker->NPC && (attacker->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) + ) + ) )//&&attackStrength==FORCE_LEVEL_3) { useRadiusForDamage = 2; } } - if ( useRadiusForDamage > 0 )//&&attackStrength==FORCE_LEVEL_3) + if (useRadiusForDamage > 0)//&&attackStrength==FORCE_LEVEL_3) {//player,. player allies, shadowtroopers, tavion and desann use larger traces - vec3_t traceMins = {-useRadiusForDamage,-useRadiusForDamage,-useRadiusForDamage}, traceMaxs = {useRadiusForDamage,useRadiusForDamage,useRadiusForDamage}; - gi.trace( &tr, start, traceMins, traceMaxs, end2, ignore, mask, G2_COLLIDE, 10 );//G2_SUPERSIZEDBBOX + vec3_t traceMins = { -useRadiusForDamage, -useRadiusForDamage, -useRadiusForDamage }, traceMaxs = { useRadiusForDamage, useRadiusForDamage, useRadiusForDamage }; + gi.trace(&tr, start, traceMins, traceMaxs, end2, ignore, mask, G2_COLLIDE, 10);//G2_SUPERSIZEDBBOX } /* else if ( !attacker->s.number ) { - vec3_t traceMins = {-1,-1,-1}, traceMaxs = {1,1,1}; - gi.trace( &tr, start, traceMins, traceMaxs, end2, ignore, mask, G2_COLLIDE, 10 );//G2_SUPERSIZEDBBOX + vec3_t traceMins = {-1,-1,-1}, traceMaxs = {1,1,1}; + gi.trace( &tr, start, traceMins, traceMaxs, end2, ignore, mask, G2_COLLIDE, 10 );//G2_SUPERSIZEDBBOX } */ else {//reborn use smaller traces - gi.trace( &tr, start, NULL, NULL, end2, ignore, mask, G2_COLLIDE, 10 );//G2_SUPERSIZEDBBOX + gi.trace(&tr, start, NULL, NULL, end2, ignore, mask, G2_COLLIDE, 10);//G2_SUPERSIZEDBBOX } } else { - gi.trace( &tr, start, NULL, NULL, end2, ignore, mask, G2_NOCOLLIDE, 10 ); + gi.trace(&tr, start, NULL, NULL, end2, ignore, mask, G2_NOCOLLIDE, 10); } #ifndef FINAL_BUILD - if ( d_saberCombat->integer > 1 ) + if (d_saberCombat->integer > 1) { - if ( attacker != NULL && attacker->client != NULL ) + if (attacker != NULL && attacker->client != NULL) { - G_DebugLine(start, end2, FRAMETIME, WPDEBUG_SaberColor( attacker->client->ps.saber[0].blade[0].color ), qtrue); + G_DebugLine(start, end2, FRAMETIME, WPDEBUG_SaberColor(attacker->client->ps.saber[0].blade[0].color), qtrue); } } #endif - if ( tr.entityNum == ENTITYNUM_NONE ) + if (tr.entityNum == ENTITYNUM_NONE) { return qfalse; } - if ( tr.entityNum == ENTITYNUM_WORLD ) + if (tr.entityNum == ENTITYNUM_WORLD) { - if ( attacker && attacker->client && (attacker->client->ps.saber[saberNum].saberFlags&SFL_BOUNCE_ON_WALLS) ) + if (attacker && attacker->client && (attacker->client->ps.saber[saberNum].saberFlags&SFL_BOUNCE_ON_WALLS)) { - VectorCopy( tr.endpos, saberHitLocation ); - VectorCopy( tr.plane.normal, saberHitNormal ); + VectorCopy(tr.endpos, saberHitLocation); + VectorCopy(tr.plane.normal, saberHitNormal); } return qtrue; } - if ( &g_entities[tr.entityNum] ) + if (&g_entities[tr.entityNum]) { gentity_t *hitEnt = &g_entities[tr.entityNum]; gentity_t *owner = g_entities[tr.entityNum].owner; - if ( hitEnt->contents & CONTENTS_LIGHTSABER ) + if (hitEnt->contents & CONTENTS_LIGHTSABER) { - if ( attacker && attacker->client && attacker->client->ps.saberInFlight ) + if (attacker && attacker->client && attacker->client->ps.saberInFlight) {//thrown saber hit something - if ( owner - && owner->s.number - && owner->client - && owner->NPC - && owner->health > 0 ) - { - if ( owner->client->NPC_class == CLASS_ALORA ) - {//alora takes less damage + if (owner + && owner->s.number + && owner->client + && owner->NPC + && owner->health > 0) + { + if (owner->client->NPC_class == CLASS_ALORA) + {//alora takes less damage dmg *= 0.25f; - } - else if ( owner->client->NPC_class == CLASS_TAVION - /*|| (owner->client->NPC_class == CLASS_SHADOWTROOPER && !Q_irand( 0, g_spskill->integer*3 )) - || (Q_irand( -5, owner->NPC->rank ) > RANK_CIVILIAN && !Q_irand( 0, g_spskill->integer*3 ))*/ ) + } + else if (owner->client->NPC_class == CLASS_TAVION + /*|| (owner->client->NPC_class == CLASS_SHADOWTROOPER && !Q_irand( 0, g_spskill->integer*3 )) + || (Q_irand( -5, owner->NPC->rank ) > RANK_CIVILIAN && !Q_irand( 0, g_spskill->integer*3 ))*/) {//Tavion can toss a blocked thrown saber aside - WP_SaberKnockaway( attacker, &tr ); - Jedi_PlayDeflectSound( owner ); + WP_SaberKnockaway(attacker, &tr); + Jedi_PlayDeflectSound(owner); return qfalse; } } } //FIXME: take target FP_SABER_DEFENSE and attacker FP_SABER_OFFENSE into account here somehow? - qboolean sabersIntersect = WP_SabersIntersect( attacker, saberNum, bladeNum, owner, qfalse );//qtrue ); + qboolean sabersIntersect = WP_SabersIntersect(attacker, saberNum, bladeNum, owner, qfalse);//qtrue ); float sabersDist; - if ( attacker && attacker->client && attacker->client->ps.saberInFlight - && owner && owner->s.number == 0 && (g_saberAutoBlocking->integer||attacker->client->ps.saberBlockingTime>level.time) )//NPC flying saber hit player's saber bounding box + if (attacker && attacker->client && attacker->client->ps.saberInFlight + && owner && owner->s.number == 0 && (g_saberAutoBlocking->integer || attacker->client->ps.saberBlockingTime>level.time))//NPC flying saber hit player's saber bounding box {//players have g_saberAutoBlocking, do the more generous check against flying sabers //FIXME: instead of hitting the player's saber bounding box //and picking an anim afterwards, have him use AI similar @@ -2596,110 +2600,110 @@ qboolean WP_SaberDamageForTrace( int ignore, vec3_t start, vec3_t end, float dmg } else {//sabers must actually collide with the attacking saber - sabersDist = WP_SabersDistance( attacker, owner ); - if ( attacker && attacker->client && attacker->client->ps.saberInFlight ) + sabersDist = WP_SabersDistance(attacker, owner); + if (attacker && attacker->client && attacker->client->ps.saberInFlight) { sabersDist /= 2.0f; - if ( sabersDist <= 16.0f ) + if (sabersDist <= 16.0f) { sabersIntersect = qtrue; } } #ifndef FINAL_BUILD - if ( d_saberCombat->integer > 1 ) + if (d_saberCombat->integer > 1) { - gi.Printf( "sabersDist: %4.2f\n", sabersDist ); + gi.Printf("sabersDist: %4.2f\n", sabersDist); } #endif//FINAL_BUILD } - if ( sabersCrossed == -1 || sabersCrossed > sabersDist ) + if (sabersCrossed == -1 || sabersCrossed > sabersDist) { sabersCrossed = sabersDist; } float collisionDist; - if ( g_saberRealisticCombat->integer ) + if (g_saberRealisticCombat->integer) { collisionDist = SABER_COLLISION_DIST; } else { - collisionDist = SABER_COLLISION_DIST+6+g_spskill->integer*4; + collisionDist = SABER_COLLISION_DIST + 6 + g_spskill->integer * 4; } { - if ( G_InCinematicSaberAnim( owner ) - && G_InCinematicSaberAnim( attacker ) ) - { - sabersIntersect = qtrue; - } + if (G_InCinematicSaberAnim(owner) + && G_InCinematicSaberAnim(attacker)) + { + sabersIntersect = qtrue; + } } - if ( owner && owner->client && (attacker != NULL) - && (sabersDist > collisionDist )//|| !InFront( attacker->currentOrigin, owner->currentOrigin, owner->client->ps.viewangles, 0.35f )) - && !sabersIntersect )//was qtrue, but missed too much? + if (owner && owner->client && (attacker != NULL) + && (sabersDist > collisionDist)//|| !InFront( attacker->currentOrigin, owner->currentOrigin, owner->client->ps.viewangles, 0.35f )) + && !sabersIntersect)//was qtrue, but missed too much? {//swing came from behind and/or was not stopped by a lightsaber //re-try the trace without checking for lightsabers - gi.trace ( &tr, start, NULL, NULL, end2, ignore, mask&~CONTENTS_LIGHTSABER, G2_NOCOLLIDE, 10 ); - if ( tr.entityNum == ENTITYNUM_WORLD ) + gi.trace(&tr, start, NULL, NULL, end2, ignore, mask&~CONTENTS_LIGHTSABER, G2_NOCOLLIDE, 10); + if (tr.entityNum == ENTITYNUM_WORLD) { - return qtrue; + return qtrue; } - if ( tr.entityNum == ENTITYNUM_NONE || &g_entities[tr.entityNum] == NULL ) + if (tr.entityNum == ENTITYNUM_NONE || &g_entities[tr.entityNum] == NULL) {//didn't hit the owner /* - if ( attacker - && attacker->client - && (PM_SaberInAttack( attacker->client->ps.saberMove ) || PM_SaberInStart( attacker->client->ps.saberMove )) - && DistanceSquared( tr.endpos, owner->currentOrigin ) < 10000 ) - { - if ( owner->NPC - && !owner->client->ps.saberInFlight - && owner->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN - && !Jedi_SaberBusy( owner ) ) - {//owner parried, just make sure they're saber is in the right spot - only does this if they're not already doing something with saber - if ( g_spskill->integer && (g_spskill->integer > 1 || Q_irand( 0, 1 ))) - {//if on easy, they don't cheat like this, if on medium, they cheat 50% of the time, if on hard, they always cheat - //FIXME: also take into account the owner's FP_DEFENSE? - if ( Q_irand( 0, owner->NPC->rank ) >= RANK_CIVILIAN ) - {//lower-rank Jedi aren't as good blockers - vec3_t attDir; - VectorSubtract( end2, start, attDir ); - VectorNormalize( attDir ); - Jedi_SaberBlockGo( owner, owner->NPC->last_ucmd, start, attDir, NULL ); - } - } - } + if ( attacker + && attacker->client + && (PM_SaberInAttack( attacker->client->ps.saberMove ) || PM_SaberInStart( attacker->client->ps.saberMove )) + && DistanceSquared( tr.endpos, owner->currentOrigin ) < 10000 ) + { + if ( owner->NPC + && !owner->client->ps.saberInFlight + && owner->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN + && !Jedi_SaberBusy( owner ) ) + {//owner parried, just make sure they're saber is in the right spot - only does this if they're not already doing something with saber + if ( g_spskill->integer && (g_spskill->integer > 1 || Q_irand( 0, 1 ))) + {//if on easy, they don't cheat like this, if on medium, they cheat 50% of the time, if on hard, they always cheat + //FIXME: also take into account the owner's FP_DEFENSE? + if ( Q_irand( 0, owner->NPC->rank ) >= RANK_CIVILIAN ) + {//lower-rank Jedi aren't as good blockers + vec3_t attDir; + VectorSubtract( end2, start, attDir ); + VectorNormalize( attDir ); + Jedi_SaberBlockGo( owner, owner->NPC->last_ucmd, start, attDir, NULL ); + } + } + } } */ - return qfalse; // Exit, but we didn't hit the wall. + return qfalse; // Exit, but we didn't hit the wall. } #ifndef FINAL_BUILD - if ( d_saberCombat->integer > 1 ) + if (d_saberCombat->integer > 1) { - if ( !attacker->s.number ) + if (!attacker->s.number) { - gi.Printf( S_COLOR_MAGENTA"%d saber hit owner through saber %4.2f, dist = %4.2f\n", level.time, saberHitFraction, sabersDist ); + gi.Printf(S_COLOR_MAGENTA"%d saber hit owner through saber %4.2f, dist = %4.2f\n", level.time, saberHitFraction, sabersDist); } } #endif//FINAL_BUILD hitEnt = &g_entities[tr.entityNum]; owner = g_entities[tr.entityNum].owner; } - else + else {//hit a lightsaber - if ( (tr.fraction < saberHitFraction || tr.startsolid) - && sabersDist < (8.0f+g_spskill->value)*4.0f// 50.0f//16.0f - && (sabersIntersect || sabersDist < (4.0f+g_spskill->value)*2.0f) )//32.0f) ) + if ((tr.fraction < saberHitFraction || tr.startsolid) + && sabersDist < (8.0f + g_spskill->value)*4.0f// 50.0f//16.0f + && (sabersIntersect || sabersDist < (4.0f + g_spskill->value)*2.0f))//32.0f) ) { // This saber hit closer than the last one. - if ( (tr.allsolid || tr.startsolid) && owner && owner->client ) + if ((tr.allsolid || tr.startsolid) && owner && owner->client) {//tr.fraction will be 0, unreliable... so calculate actual - float dist = Distance( start, end2 ); - if ( dist ) + float dist = Distance(start, end2); + if (dist) { - float hitFrac = WP_SabersDistance( attacker, owner )/dist; - if ( hitFrac > 1.0f ) + float hitFrac = WP_SabersDistance(attacker, owner) / dist; + if (hitFrac > 1.0f) {//umm... minimum distance between sabers was longer than trace...? hitFrac = 1.0f; } - if ( hitFrac < saberHitFraction ) + if (hitFrac < saberHitFraction) { saberHitFraction = hitFrac; } @@ -2709,11 +2713,11 @@ qboolean WP_SaberDamageForTrace( int ignore, vec3_t start, vec3_t end, float dmg saberHitFraction = 0.0f; } #ifndef FINAL_BUILD - if ( d_saberCombat->integer > 1 ) + if (d_saberCombat->integer > 1) { - if ( !attacker->s.number ) + if (!attacker->s.number) { - gi.Printf( S_COLOR_GREEN"%d saber hit saber dist %4.2f allsolid %4.2f\n", level.time, sabersDist, saberHitFraction ); + gi.Printf(S_COLOR_GREEN"%d saber hit saber dist %4.2f allsolid %4.2f\n", level.time, sabersDist, saberHitFraction); } } #endif//FINAL_BUILD @@ -2721,50 +2725,50 @@ qboolean WP_SaberDamageForTrace( int ignore, vec3_t start, vec3_t end, float dmg else { #ifndef FINAL_BUILD - if ( d_saberCombat->integer > 1 ) + if (d_saberCombat->integer > 1) { - if ( !attacker->s.number ) + if (!attacker->s.number) { - gi.Printf( S_COLOR_BLUE"%d saber hit saber dist %4.2f, frac %4.2f\n", level.time, sabersDist, saberHitFraction ); + gi.Printf(S_COLOR_BLUE"%d saber hit saber dist %4.2f, frac %4.2f\n", level.time, sabersDist, saberHitFraction); } saberHitFraction = tr.fraction; } #endif//FINAL_BUILD } #ifndef FINAL_BUILD - if ( d_saberCombat->integer ) + if (d_saberCombat->integer) { - gi.Printf( S_COLOR_MAGENTA"hit saber: saberHitFraction %4.2f, allsolid %d, startsolid %d\n", saberHitFraction, tr.allsolid, tr.startsolid ); + gi.Printf(S_COLOR_MAGENTA"hit saber: saberHitFraction %4.2f, allsolid %d, startsolid %d\n", saberHitFraction, tr.allsolid, tr.startsolid); } #endif//FINAL_BUILD VectorCopy(tr.endpos, saberHitLocation); saberHitEntity = tr.entityNum; } /* - if ( owner - && owner->client - && attacker - && attacker->client - && (PM_SaberInAttack( attacker->client->ps.saberMove ) || PM_SaberInStart( attacker->client->ps.saberMove )) - && DistanceSquared( tr.endpos, owner->currentOrigin ) < 10000 ) + if ( owner + && owner->client + && attacker + && attacker->client + && (PM_SaberInAttack( attacker->client->ps.saberMove ) || PM_SaberInStart( attacker->client->ps.saberMove )) + && DistanceSquared( tr.endpos, owner->currentOrigin ) < 10000 ) { - if ( owner->NPC - && !owner->client->ps.saberInFlight - && owner->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN - && !Jedi_SaberBusy( owner ) ) - {//owner parried, just make sure they're saber is in the right spot - only does this if they're not already doing something with saber - if ( g_spskill->integer && (g_spskill->integer > 1 || Q_irand( 0, 1 ))) - {//if on easy, they don't cheat like this, if on medium, they cheat 50% of the time, if on hard, they always cheat - //FIXME: also take into account the owner's FP_DEFENSE? - if ( Q_irand( 0, owner->NPC->rank ) >= RANK_CIVILIAN ) - {//lower-rank Jedi aren't as good blockers - vec3_t attDir; - VectorSubtract( end2, start, attDir ); - VectorNormalize( attDir ); - Jedi_SaberBlockGo( owner, owner->NPC->last_ucmd, start, attDir, NULL ); - } - } - } + if ( owner->NPC + && !owner->client->ps.saberInFlight + && owner->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN + && !Jedi_SaberBusy( owner ) ) + {//owner parried, just make sure they're saber is in the right spot - only does this if they're not already doing something with saber + if ( g_spskill->integer && (g_spskill->integer > 1 || Q_irand( 0, 1 ))) + {//if on easy, they don't cheat like this, if on medium, they cheat 50% of the time, if on hard, they always cheat + //FIXME: also take into account the owner's FP_DEFENSE? + if ( Q_irand( 0, owner->NPC->rank ) >= RANK_CIVILIAN ) + {//lower-rank Jedi aren't as good blockers + vec3_t attDir; + VectorSubtract( end2, start, attDir ); + VectorNormalize( attDir ); + Jedi_SaberBlockGo( owner, owner->NPC->last_ucmd, start, attDir, NULL ); + } + } + } } */ //FIXME: check to see if we broke the saber @@ -2772,80 +2776,80 @@ qboolean WP_SaberDamageForTrace( int ignore, vec3_t start, vec3_t end, float dmg // PROBLEM: saberEnt doesn't actually have a saber g2 model // and/or isn't in same location as saber model attached // to the client. We'd have to fake it somehow... - return qfalse; // Exit, but we didn't hit the wall. + return qfalse; // Exit, but we didn't hit the wall. } } else { #ifndef FINAL_BUILD - if ( d_saberCombat->integer > 1 ) + if (d_saberCombat->integer > 1) { - if ( !attacker->s.number ) + if (!attacker->s.number) { - gi.Printf( S_COLOR_RED"%d saber hit owner directly %4.2f\n", level.time, saberHitFraction ); + gi.Printf(S_COLOR_RED"%d saber hit owner directly %4.2f\n", level.time, saberHitFraction); } } #endif//FINAL_BUILD } - if ( attacker && attacker->client && attacker->client->ps.saberInFlight ) + if (attacker && attacker->client && attacker->client->ps.saberInFlight) {//thrown saber hit something - if ( ( hitEnt && hitEnt->client && hitEnt->health > 0 && ( hitEnt->client->NPC_class == CLASS_DESANN || !Q_stricmp("Yoda",hitEnt->NPC_type) || hitEnt->client->NPC_class == CLASS_LUKE || hitEnt->client->NPC_class == CLASS_BOBAFETT || (hitEnt->client->ps.powerups[PW_GALAK_SHIELD] > 0) ) ) || - ( owner && owner->client && owner->health > 0 && ( owner->client->NPC_class == CLASS_DESANN || !Q_stricmp("Yoda",owner->NPC_type) || owner->client->NPC_class == CLASS_LUKE || (owner->client->ps.powerups[PW_GALAK_SHIELD] > 0) ) ) ) + if ((hitEnt && hitEnt->client && hitEnt->health > 0 && (hitEnt->client->NPC_class == CLASS_DESANN || !Q_stricmp("Yoda", hitEnt->NPC_type) || hitEnt->client->NPC_class == CLASS_LUKE || hitEnt->client->NPC_class == CLASS_BOBAFETT || (hitEnt->client->ps.powerups[PW_GALAK_SHIELD] > 0))) || + (owner && owner->client && owner->health > 0 && (owner->client->NPC_class == CLASS_DESANN || !Q_stricmp("Yoda", owner->NPC_type) || owner->client->NPC_class == CLASS_LUKE || (owner->client->ps.powerups[PW_GALAK_SHIELD] > 0)))) {//Luke and Desann slap thrown sabers aside //FIXME: control the direction of the thrown saber... if hit Galak's shield, bounce directly away from his origin? - WP_SaberKnockaway( attacker, &tr ); - if ( hitEnt->client ) + WP_SaberKnockaway(attacker, &tr); + if (hitEnt->client) { - Jedi_PlayDeflectSound( hitEnt ); + Jedi_PlayDeflectSound(hitEnt); } else { - Jedi_PlayDeflectSound( owner ); + Jedi_PlayDeflectSound(owner); } - return qfalse; // Exit, but we didn't hit the wall. + return qfalse; // Exit, but we didn't hit the wall. } } - if ( hitEnt->takedamage ) + if (hitEnt->takedamage) { //no team damage: if ( !hitEnt->client || attacker == NULL || !attacker->client || (hitEnt->client->playerTeam != attacker->client->playerTeam) ) { - vec3_t bladeVec={0}; - if ( attacker && attacker->client ) + vec3_t bladeVec = { 0 }; + if (attacker && attacker->client) { - VectorScale( bladeDir, attacker->client->ps.saber[saberNum].blade[bladeNum].length, bladeVec ); + VectorScale(bladeDir, attacker->client->ps.saber[saberNum].blade[bladeNum].length, bladeVec); } //multiply the damage by the total distance of the swipe - VectorSubtract( end2, start, dir ); - float len = VectorNormalize( dir );//VectorLength( dir ); - if ( noGhoul || !hitEnt->ghoul2.size() ) + VectorSubtract(end2, start, dir); + float len = VectorNormalize(dir);//VectorLength( dir ); + if (noGhoul || !hitEnt->ghoul2.size()) {//we weren't doing a ghoul trace int hitEffect = 0; - if ( dmg >= 1.0 && hitEnt->bmodel ) + if (dmg >= 1.0 && hitEnt->bmodel) { dmg = 1.0; } - if ( len > 1 ) + if (len > 1) { dmg *= len; } #ifndef FINAL_BUILD - if ( d_saberCombat->integer > 1 ) + if (d_saberCombat->integer > 1) { - if ( !(hitEnt->contents & CONTENTS_LIGHTSABER) ) + if (!(hitEnt->contents & CONTENTS_LIGHTSABER)) { - gi.Printf( S_COLOR_GREEN"Hit ent, but no ghoul collisions\n" ); + gi.Printf(S_COLOR_GREEN"Hit ent, but no ghoul collisions\n"); } } #endif float trFrac, dmgFrac; - if ( tr.allsolid ) + if (tr.allsolid) {//totally inside them trFrac = 1.0; dmgFrac = 0.0; } - else if ( tr.startsolid ) + else if (tr.startsolid) {//started inside them //we don't know how much was inside, we know it's less than all, so use half? trFrac = 0.5; @@ -2858,87 +2862,87 @@ qboolean WP_SaberDamageForTrace( int ignore, vec3_t start, vec3_t end, float dmg dmgFrac = tr.fraction; } vec3_t backdir; - VectorScale( dir, -1, backdir ); - WP_SaberDamageAdd( trFrac, tr.entityNum, dir, bladeVec, backdir, tr.endpos, dmg, dmgFrac, HL_NONE, qfalse, HL_NONE ); - if ( !tr.allsolid && !tr.startsolid ) + VectorScale(dir, -1, backdir); + WP_SaberDamageAdd(trFrac, tr.entityNum, dir, bladeVec, backdir, tr.endpos, dmg, dmgFrac, HL_NONE, qfalse, HL_NONE); + if (!tr.allsolid && !tr.startsolid) { - VectorScale( dir, -1, dir ); + VectorScale(dir, -1, dir); } - if ( hitEnt != NULL ) + if (hitEnt != NULL) { - if ( hitEnt->client ) + if (hitEnt->client) { //don't do blood sparks on non-living things class_t npc_class = hitEnt->client->NPC_class; - if ( npc_class == CLASS_SEEKER || npc_class == CLASS_PROBE || npc_class == CLASS_MOUSE || - npc_class == CLASS_GONK || npc_class == CLASS_R2D2 || npc_class == CLASS_R5D2 || npc_class == CLASS_REMOTE || - npc_class == CLASS_PROTOCOL || npc_class == CLASS_MARK1 || npc_class == CLASS_MARK2 || - npc_class == CLASS_INTERROGATOR || npc_class == CLASS_ATST || npc_class == CLASS_SENTRY ) + if (npc_class == CLASS_SEEKER || npc_class == CLASS_PROBE || npc_class == CLASS_MOUSE || + npc_class == CLASS_GONK || npc_class == CLASS_R2D2 || npc_class == CLASS_R5D2 || npc_class == CLASS_REMOTE || + npc_class == CLASS_PROTOCOL || npc_class == CLASS_MARK1 || npc_class == CLASS_MARK2 || + npc_class == CLASS_INTERROGATOR || npc_class == CLASS_ATST || npc_class == CLASS_SENTRY) { - if ( !WP_SaberBladeUseSecondBladeStyle( &attacker->client->ps.saber[saberNum], bladeNum ) - && attacker->client->ps.saber[saberNum].hitOtherEffect ) + if (!WP_SaberBladeUseSecondBladeStyle(&attacker->client->ps.saber[saberNum], bladeNum) + && attacker->client->ps.saber[saberNum].hitOtherEffect) { hitEffect = attacker->client->ps.saber[saberNum].hitOtherEffect; } - else if ( WP_SaberBladeUseSecondBladeStyle( &attacker->client->ps.saber[saberNum], bladeNum ) - && attacker->client->ps.saber[saberNum].hitOtherEffect2 ) + else if (WP_SaberBladeUseSecondBladeStyle(&attacker->client->ps.saber[saberNum], bladeNum) + && attacker->client->ps.saber[saberNum].hitOtherEffect2) { hitEffect = attacker->client->ps.saber[saberNum].hitOtherEffect2; } else { - hitEffect = G_EffectIndex( hit_sparks ); + hitEffect = G_EffectIndex(hit_sparks); } } } else { - if ( dmg ) + if (dmg) {//only do these effects if actually trying to damage the thing... - if ( (hitEnt->svFlags&SVF_BBRUSH)//a breakable brush - && ( (hitEnt->spawnflags&1)//INVINCIBLE - ||(hitEnt->flags&FL_DMG_BY_HEAVY_WEAP_ONLY)//HEAVY weapon damage only - ||(hitEnt->NPC_targetname&&attacker&&attacker->targetname&&Q_stricmp(attacker->targetname,hitEnt->NPC_targetname)) ) )//only breakable by an entity who is not the attacker + if ((hitEnt->svFlags&SVF_BBRUSH)//a breakable brush + && ((hitEnt->spawnflags & 1)//INVINCIBLE + || (hitEnt->flags&FL_DMG_BY_HEAVY_WEAP_ONLY)//HEAVY weapon damage only + || (hitEnt->NPC_targetname&&attacker&&attacker->targetname&&Q_stricmp(attacker->targetname, hitEnt->NPC_targetname))))//only breakable by an entity who is not the attacker {//no hit effect (besides regular client-side one) } else { - if ( !WP_SaberBladeUseSecondBladeStyle( &attacker->client->ps.saber[saberNum], bladeNum ) - && attacker->client->ps.saber[saberNum].hitOtherEffect ) + if (!WP_SaberBladeUseSecondBladeStyle(&attacker->client->ps.saber[saberNum], bladeNum) + && attacker->client->ps.saber[saberNum].hitOtherEffect) { hitEffect = attacker->client->ps.saber[saberNum].hitOtherEffect; } - else if ( WP_SaberBladeUseSecondBladeStyle( &attacker->client->ps.saber[saberNum], bladeNum ) - && attacker->client->ps.saber[saberNum].hitOtherEffect2 ) + else if (WP_SaberBladeUseSecondBladeStyle(&attacker->client->ps.saber[saberNum], bladeNum) + && attacker->client->ps.saber[saberNum].hitOtherEffect2) { hitEffect = attacker->client->ps.saber[saberNum].hitOtherEffect2; } else { - hitEffect = G_EffectIndex( hit_sparks ); + hitEffect = G_EffectIndex(hit_sparks); } } } } } - if ( !g_saberNoEffects && hitEffect != 0 ) + if (!g_saberNoEffects && hitEffect != 0) { - G_PlayEffect( hitEffect, tr.endpos, dir );//"saber_cut" + G_PlayEffect(hitEffect, tr.endpos, dir);//"saber_cut" } } else {//we were doing a ghoul trace - if ( !attacker + if (!attacker || !attacker->client - || attacker->client->ps.saberLockTime < level.time ) + || attacker->client->ps.saberLockTime < level.time) { - if ( !WP_SaberDamageEffects( &tr, start, len, dmg, dir, bladeVec, attacker->client->enemyTeam, saberType, &attacker->client->ps.saber[saberNum], bladeNum ) ) + if (!WP_SaberDamageEffects(&tr, start, len, dmg, dir, bladeVec, attacker->client->enemyTeam, saberType, &attacker->client->ps.saber[saberNum], bladeNum)) {//didn't hit a ghoul ent /* if ( && hitEnt->ghoul2.size() ) {//it was a ghoul2 model so we should have hit it - return qfalse; + return qfalse; } */ } @@ -2954,22 +2958,22 @@ qboolean WP_SaberDamageForTrace( int ignore, vec3_t start, vec3_t end, float dmg #define LOCK_IDEAL_DIST_TOP 32.0f #define LOCK_IDEAL_DIST_CIRCLE 48.0f #define LOCK_IDEAL_DIST_JKA 46.0f//all of the new saberlocks are 46.08 from each other because Richard Lico is da MAN -extern void PM_SetAnimFrame( gentity_t *gent, int frame, qboolean torso, qboolean legs ); -extern qboolean ValidAnimFileIndex ( int index ); -int G_SaberLockAnim( int attackerSaberStyle, int defenderSaberStyle, int topOrSide, int lockOrBreakOrSuperBreak, int winOrLose ) +extern void PM_SetAnimFrame(gentity_t *gent, int frame, qboolean torso, qboolean legs); +extern qboolean ValidAnimFileIndex(int index); +int G_SaberLockAnim(int attackerSaberStyle, int defenderSaberStyle, int topOrSide, int lockOrBreakOrSuperBreak, int winOrLose) { int baseAnim = -1; - if ( lockOrBreakOrSuperBreak == SABERLOCK_LOCK ) + if (lockOrBreakOrSuperBreak == SABERLOCK_LOCK) {//special case: if we're using the same style and locking - if ( attackerSaberStyle == defenderSaberStyle - || (attackerSaberStyle>=SS_FAST&&attackerSaberStyle<=SS_TAVION&&defenderSaberStyle>=SS_FAST&&defenderSaberStyle<=SS_TAVION) ) + if (attackerSaberStyle == defenderSaberStyle + || (attackerSaberStyle >= SS_FAST&&attackerSaberStyle <= SS_TAVION&&defenderSaberStyle >= SS_FAST&&defenderSaberStyle <= SS_TAVION)) {//using same style - if ( winOrLose == SABERLOCK_LOSE ) + if (winOrLose == SABERLOCK_LOSE) {//you want the defender's stance... - switch ( defenderSaberStyle ) + switch (defenderSaberStyle) { case SS_DUAL: - if ( topOrSide == SABERLOCK_TOP ) + if (topOrSide == SABERLOCK_TOP) { baseAnim = BOTH_LK_DL_DL_T_L_2; } @@ -2979,7 +2983,7 @@ int G_SaberLockAnim( int attackerSaberStyle, int defenderSaberStyle, int topOrSi } break; case SS_STAFF: - if ( topOrSide == SABERLOCK_TOP ) + if (topOrSide == SABERLOCK_TOP) { baseAnim = BOTH_LK_ST_ST_T_L_2; } @@ -2989,7 +2993,7 @@ int G_SaberLockAnim( int attackerSaberStyle, int defenderSaberStyle, int topOrSi } break; default: - if ( topOrSide == SABERLOCK_TOP ) + if (topOrSide == SABERLOCK_TOP) { baseAnim = BOTH_LK_S_S_T_L_2; } @@ -3002,71 +3006,71 @@ int G_SaberLockAnim( int attackerSaberStyle, int defenderSaberStyle, int topOrSi } } } - if ( baseAnim == -1 ) + if (baseAnim == -1) { - switch ( attackerSaberStyle ) + switch (attackerSaberStyle) { case SS_DUAL: - switch ( defenderSaberStyle ) + switch (defenderSaberStyle) { - case SS_DUAL: - baseAnim = BOTH_LK_DL_DL_S_B_1_L; - break; - case SS_STAFF: - baseAnim = BOTH_LK_DL_ST_S_B_1_L; - break; - default://single - baseAnim = BOTH_LK_DL_S_S_B_1_L; - break; + case SS_DUAL: + baseAnim = BOTH_LK_DL_DL_S_B_1_L; + break; + case SS_STAFF: + baseAnim = BOTH_LK_DL_ST_S_B_1_L; + break; + default://single + baseAnim = BOTH_LK_DL_S_S_B_1_L; + break; } break; case SS_STAFF: - switch ( defenderSaberStyle ) + switch (defenderSaberStyle) { - case SS_DUAL: - baseAnim = BOTH_LK_ST_DL_S_B_1_L; - break; - case SS_STAFF: - baseAnim = BOTH_LK_ST_ST_S_B_1_L; - break; - default://single - baseAnim = BOTH_LK_ST_S_S_B_1_L; - break; + case SS_DUAL: + baseAnim = BOTH_LK_ST_DL_S_B_1_L; + break; + case SS_STAFF: + baseAnim = BOTH_LK_ST_ST_S_B_1_L; + break; + default://single + baseAnim = BOTH_LK_ST_S_S_B_1_L; + break; } break; default://single - switch ( defenderSaberStyle ) + switch (defenderSaberStyle) { - case SS_DUAL: - baseAnim = BOTH_LK_S_DL_S_B_1_L; - break; - case SS_STAFF: - baseAnim = BOTH_LK_S_ST_S_B_1_L; - break; - default://single - baseAnim = BOTH_LK_S_S_S_B_1_L; - break; + case SS_DUAL: + baseAnim = BOTH_LK_S_DL_S_B_1_L; + break; + case SS_STAFF: + baseAnim = BOTH_LK_S_ST_S_B_1_L; + break; + default://single + baseAnim = BOTH_LK_S_S_S_B_1_L; + break; } break; } //side lock or top lock? - if ( topOrSide == SABERLOCK_TOP ) + if (topOrSide == SABERLOCK_TOP) { baseAnim += 5; } //lock, break or superbreak? - if ( lockOrBreakOrSuperBreak == SABERLOCK_LOCK ) + if (lockOrBreakOrSuperBreak == SABERLOCK_LOCK) { baseAnim += 2; } - else + else {//a break or superbreak - if ( lockOrBreakOrSuperBreak == SABERLOCK_SUPERBREAK ) + if (lockOrBreakOrSuperBreak == SABERLOCK_SUPERBREAK) { baseAnim += 3; } //winner or loser? - if ( winOrLose == SABERLOCK_WIN ) + if (winOrLose == SABERLOCK_WIN) { baseAnim += 1; } @@ -3075,14 +3079,14 @@ int G_SaberLockAnim( int attackerSaberStyle, int defenderSaberStyle, int topOrSi return baseAnim; } -qboolean G_CheckIncrementLockAnim( int anim, int winOrLose ) +qboolean G_CheckIncrementLockAnim(int anim, int winOrLose) { qboolean increment = qfalse;//??? //RULE: if you are the first style in the lock anim, you advance from LOSING position to WINNING position // if you are the second style in the lock anim, you advance from WINNING position to LOSING position - switch ( anim ) + switch (anim) { - //increment to win: + //increment to win: case BOTH_LK_DL_DL_S_L_1: //lock if I'm using dual vs. dual and I initiated case BOTH_LK_DL_DL_S_L_2: //lock if I'm using dual vs. dual and other initiated case BOTH_LK_DL_DL_T_L_1: //lock if I'm using dual vs. dual and I initiated @@ -3097,7 +3101,7 @@ qboolean G_CheckIncrementLockAnim( int anim, int winOrLose ) case BOTH_LK_ST_S_T_L_1: //lock if I'm using staff vs. a single case BOTH_LK_ST_ST_T_L_1: //lock if I'm using staff vs. a staff and I initiated case BOTH_LK_ST_ST_T_L_2: //lock if I'm using staff vs. a staff and other initiated - if ( winOrLose == SABERLOCK_WIN ) + if (winOrLose == SABERLOCK_WIN) { increment = qtrue; } @@ -3107,7 +3111,7 @@ qboolean G_CheckIncrementLockAnim( int anim, int winOrLose ) } break; - //decrement to win: + //decrement to win: case BOTH_LK_S_DL_S_L_1: //lock if I'm using single vs. a dual case BOTH_LK_S_DL_T_L_1: //lock if I'm using single vs. a dual case BOTH_LK_S_S_S_L_2: //lock if I'm using single vs. a single and other intitiated @@ -3118,7 +3122,7 @@ qboolean G_CheckIncrementLockAnim( int anim, int winOrLose ) case BOTH_LK_ST_DL_T_L_1: //lock if I'm using staff vs. dual case BOTH_LK_ST_ST_S_L_1: //lock if I'm using staff vs. a staff and I initiated case BOTH_LK_ST_ST_S_L_2: //lock if I'm using staff vs. a staff and other initiated - if ( winOrLose == SABERLOCK_WIN ) + if (winOrLose == SABERLOCK_WIN) { increment = qfalse; } @@ -3129,14 +3133,14 @@ qboolean G_CheckIncrementLockAnim( int anim, int winOrLose ) break; default: #ifndef FINAL_BUILD - Com_Printf( S_COLOR_RED"ERROR: unknown Saber Lock Anim: %s!!!\n", animTable[anim].name ); + Com_Printf(S_COLOR_RED"ERROR: unknown Saber Lock Anim: %s!!!\n", animTable[anim].name); #endif break; } return increment; } -qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLockMode_t lockMode ) +qboolean WP_SabersCheckLock2(gentity_t *attacker, gentity_t *defender, sabersLockMode_t lockMode) { animation_t *anim; int attAnim, defAnim, advance = 0; @@ -3144,15 +3148,15 @@ qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLo float idealDist = 48.0f; //FIXME: this distances need to be modified by the lengths of the sabers involved... //MATCH ANIMS - if ( lockMode == LOCK_KYLE_GRAB1 + if (lockMode == LOCK_KYLE_GRAB1 || lockMode == LOCK_KYLE_GRAB2 - || lockMode == LOCK_KYLE_GRAB3 ) + || lockMode == LOCK_KYLE_GRAB3) { float numSpins = 1.0f; idealDist = 46.0f;//42.0f; attStart = defStart = 0.0f; - switch ( lockMode ) + switch (lockMode) { default: case LOCK_KYLE_GRAB1: @@ -3168,30 +3172,30 @@ qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLo case LOCK_KYLE_GRAB3: attAnim = BOTH_KYLE_PA_2; defAnim = BOTH_PLAYER_PA_2; - defender->forcePushTime = level.time + PM_AnimLength( defender->client->clientInfo.animFileIndex, BOTH_PLAYER_PA_2 ); + defender->forcePushTime = level.time + PM_AnimLength(defender->client->clientInfo.animFileIndex, BOTH_PLAYER_PA_2); numSpins = 3.0f; break; } attacker->client->ps.SaberDeactivate(); defender->client->ps.SaberDeactivate(); - if ( d_slowmodeath->integer > 3 - && ( defender->s.number < MAX_CLIENTS - || attacker->s.number < MAX_CLIENTS ) ) + if (d_slowmodeath->integer > 3 + && (defender->s.number < MAX_CLIENTS + || attacker->s.number < MAX_CLIENTS)) { - if( ValidAnimFileIndex( attacker->client->clientInfo.animFileIndex ) ) + if (ValidAnimFileIndex(attacker->client->clientInfo.animFileIndex)) { - int effectTime = PM_AnimLength( attacker->client->clientInfo.animFileIndex, (animNumber_t)attAnim ); - int spinTime = floor((float)effectTime/numSpins); + int effectTime = PM_AnimLength(attacker->client->clientInfo.animFileIndex, (animNumber_t)attAnim); + int spinTime = floor((float)effectTime / numSpins); int meFlags = (MEF_MULTI_SPIN);//MEF_NO_TIMESCALE|MEF_NO_VERTBOB| - if ( Q_irand( 0, 1 ) ) + if (Q_irand(0, 1)) { meFlags |= MEF_REVERSE_SPIN; } - G_StartMatrixEffect( attacker, meFlags, effectTime, 0.75f, spinTime ); + G_StartMatrixEffect(attacker, meFlags, effectTime, 0.75f, spinTime); } } } - else if ( lockMode == LOCK_FORCE_DRAIN ) + else if (lockMode == LOCK_FORCE_DRAIN) { idealDist = 46.0f;//42.0f; attStart = defStart = 0.0f; @@ -3203,17 +3207,17 @@ qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLo } else { - if ( lockMode == LOCK_RANDOM ) + if (lockMode == LOCK_RANDOM) { - lockMode = (sabersLockMode_t)Q_irand( (int)LOCK_FIRST, (int)(LOCK_RANDOM)-1 ); + lockMode = (sabersLockMode_t)Q_irand((int)LOCK_FIRST, (int)(LOCK_RANDOM)-1); } //FIXME: attStart% and idealDist will change per saber lock anim pairing... do we need a big table like in bg_panimate.cpp? - if ( attacker->client->ps.saberAnimLevel >= SS_FAST + if (attacker->client->ps.saberAnimLevel >= SS_FAST && attacker->client->ps.saberAnimLevel <= SS_TAVION && defender->client->ps.saberAnimLevel >= SS_FAST - && defender->client->ps.saberAnimLevel <= SS_TAVION ) + && defender->client->ps.saberAnimLevel <= SS_TAVION) {//2 single sabers? Just do it the old way... - switch ( lockMode ) + switch (lockMode) { case LOCK_TOP: attAnim = BOTH_BF2LOCK;// - starts in middle @@ -3265,30 +3269,30 @@ qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLo else {//use the new system idealDist = LOCK_IDEAL_DIST_JKA;//all of the new saberlocks are 46.08 from each other because Richard Lico is da MAN - if ( lockMode == LOCK_TOP ) + if (lockMode == LOCK_TOP) {//top lock - attAnim = G_SaberLockAnim( attacker->client->ps.saberAnimLevel, defender->client->ps.saberAnimLevel, SABERLOCK_TOP, SABERLOCK_LOCK, SABERLOCK_WIN ); - defAnim = G_SaberLockAnim( defender->client->ps.saberAnimLevel, attacker->client->ps.saberAnimLevel, SABERLOCK_TOP, SABERLOCK_LOCK, SABERLOCK_LOSE ); + attAnim = G_SaberLockAnim(attacker->client->ps.saberAnimLevel, defender->client->ps.saberAnimLevel, SABERLOCK_TOP, SABERLOCK_LOCK, SABERLOCK_WIN); + defAnim = G_SaberLockAnim(defender->client->ps.saberAnimLevel, attacker->client->ps.saberAnimLevel, SABERLOCK_TOP, SABERLOCK_LOCK, SABERLOCK_LOSE); attStart = defStart = 0.5f; } else {//side lock - switch ( lockMode ) + switch (lockMode) { case LOCK_DIAG_TR: - attAnim = G_SaberLockAnim( attacker->client->ps.saberAnimLevel, defender->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_WIN ); - defAnim = G_SaberLockAnim( defender->client->ps.saberAnimLevel, attacker->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_LOSE ); + attAnim = G_SaberLockAnim(attacker->client->ps.saberAnimLevel, defender->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_WIN); + defAnim = G_SaberLockAnim(defender->client->ps.saberAnimLevel, attacker->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_LOSE); attStart = defStart = 0.5f; break; case LOCK_DIAG_TL: - attAnim = G_SaberLockAnim( attacker->client->ps.saberAnimLevel, defender->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_LOSE ); - defAnim = G_SaberLockAnim( defender->client->ps.saberAnimLevel, attacker->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_WIN ); + attAnim = G_SaberLockAnim(attacker->client->ps.saberAnimLevel, defender->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_LOSE); + defAnim = G_SaberLockAnim(defender->client->ps.saberAnimLevel, attacker->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_WIN); attStart = defStart = 0.5f; break; case LOCK_DIAG_BR: - attAnim = G_SaberLockAnim( attacker->client->ps.saberAnimLevel, defender->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_WIN ); - defAnim = G_SaberLockAnim( defender->client->ps.saberAnimLevel, attacker->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_LOSE ); - if ( G_CheckIncrementLockAnim( attAnim, SABERLOCK_WIN ) ) + attAnim = G_SaberLockAnim(attacker->client->ps.saberAnimLevel, defender->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_WIN); + defAnim = G_SaberLockAnim(defender->client->ps.saberAnimLevel, attacker->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_LOSE); + if (G_CheckIncrementLockAnim(attAnim, SABERLOCK_WIN)) { attStart = 0.85f;//move to end of anim } @@ -3296,7 +3300,7 @@ qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLo { attStart = 0.15f;//start at beginning of anim } - if ( G_CheckIncrementLockAnim( defAnim, SABERLOCK_LOSE ) ) + if (G_CheckIncrementLockAnim(defAnim, SABERLOCK_LOSE)) { defStart = 0.85f;//start at end of anim } @@ -3306,9 +3310,9 @@ qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLo } break; case LOCK_DIAG_BL: - attAnim = G_SaberLockAnim( attacker->client->ps.saberAnimLevel, defender->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_LOSE ); - defAnim = G_SaberLockAnim( defender->client->ps.saberAnimLevel, attacker->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_WIN ); - if ( G_CheckIncrementLockAnim( attAnim, SABERLOCK_WIN ) ) + attAnim = G_SaberLockAnim(attacker->client->ps.saberAnimLevel, defender->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_LOSE); + defAnim = G_SaberLockAnim(defender->client->ps.saberAnimLevel, attacker->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_WIN); + if (G_CheckIncrementLockAnim(attAnim, SABERLOCK_WIN)) { attStart = 0.85f;//move to end of anim } @@ -3316,7 +3320,7 @@ qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLo { attStart = 0.15f;//start at beginning of anim } - if ( G_CheckIncrementLockAnim( defAnim, SABERLOCK_LOSE ) ) + if (G_CheckIncrementLockAnim(defAnim, SABERLOCK_LOSE)) { defStart = 0.85f;//start at end of anim } @@ -3326,9 +3330,9 @@ qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLo } break; case LOCK_R: - attAnim = G_SaberLockAnim( attacker->client->ps.saberAnimLevel, defender->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_LOSE ); - defAnim = G_SaberLockAnim( defender->client->ps.saberAnimLevel, attacker->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_WIN ); - if ( G_CheckIncrementLockAnim( attAnim, SABERLOCK_WIN ) ) + attAnim = G_SaberLockAnim(attacker->client->ps.saberAnimLevel, defender->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_LOSE); + defAnim = G_SaberLockAnim(defender->client->ps.saberAnimLevel, attacker->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_WIN); + if (G_CheckIncrementLockAnim(attAnim, SABERLOCK_WIN)) { attStart = 0.75f;//move to end of anim } @@ -3336,7 +3340,7 @@ qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLo { attStart = 0.25f;//start at beginning of anim } - if ( G_CheckIncrementLockAnim( defAnim, SABERLOCK_LOSE ) ) + if (G_CheckIncrementLockAnim(defAnim, SABERLOCK_LOSE)) { defStart = 0.75f;//start at end of anim } @@ -3346,10 +3350,10 @@ qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLo } break; case LOCK_L: - attAnim = G_SaberLockAnim( attacker->client->ps.saberAnimLevel, defender->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_WIN ); - defAnim = G_SaberLockAnim( defender->client->ps.saberAnimLevel, attacker->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_LOSE ); + attAnim = G_SaberLockAnim(attacker->client->ps.saberAnimLevel, defender->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_WIN); + defAnim = G_SaberLockAnim(defender->client->ps.saberAnimLevel, attacker->client->ps.saberAnimLevel, SABERLOCK_SIDE, SABERLOCK_LOCK, SABERLOCK_LOSE); //attacker starts with advantage - if ( G_CheckIncrementLockAnim( attAnim, SABERLOCK_WIN ) ) + if (G_CheckIncrementLockAnim(attAnim, SABERLOCK_WIN)) { attStart = 0.75f;//move to end of anim } @@ -3357,7 +3361,7 @@ qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLo { attStart = 0.25f;//start at beginning of anim } - if ( G_CheckIncrementLockAnim( defAnim, SABERLOCK_LOSE ) ) + if (G_CheckIncrementLockAnim(defAnim, SABERLOCK_LOSE)) { defStart = 0.75f;//start at end of anim } @@ -3374,62 +3378,62 @@ qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLo } } //set the proper anims - NPC_SetAnim( attacker, SETANIM_BOTH, attAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - NPC_SetAnim( defender, SETANIM_BOTH, defAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); + NPC_SetAnim(attacker, SETANIM_BOTH, attAnim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + NPC_SetAnim(defender, SETANIM_BOTH, defAnim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); //don't let them store a kick for the whole saberlock.... attacker->client->ps.saberMoveNext = defender->client->ps.saberMoveNext = LS_NONE; // - if ( attStart > 0.0f ) + if (attStart > 0.0f) { - if( ValidAnimFileIndex( attacker->client->clientInfo.animFileIndex ) ) + if (ValidAnimFileIndex(attacker->client->clientInfo.animFileIndex)) { anim = &level.knownAnimFileSets[attacker->client->clientInfo.animFileIndex].animations[attAnim]; - advance = floor( anim->numFrames*attStart ); - PM_SetAnimFrame( attacker, anim->firstFrame + advance, qtrue, qtrue ); + advance = floor(anim->numFrames*attStart); + PM_SetAnimFrame(attacker, anim->firstFrame + advance, qtrue, qtrue); #ifndef FINAL_BUILD - if ( d_saberCombat->integer ) + if (d_saberCombat->integer) { - Com_Printf( "%s starting saber lock, anim = %s, %d frames to go!\n", attacker->NPC_type, animTable[attAnim].name, anim->numFrames-advance ); + Com_Printf("%s starting saber lock, anim = %s, %d frames to go!\n", attacker->NPC_type, animTable[attAnim].name, anim->numFrames - advance); } #endif } } - if ( defStart > 0.0f ) + if (defStart > 0.0f) { - if( ValidAnimFileIndex( defender->client->clientInfo.animFileIndex ) ) + if (ValidAnimFileIndex(defender->client->clientInfo.animFileIndex)) { anim = &level.knownAnimFileSets[defender->client->clientInfo.animFileIndex].animations[defAnim]; - advance = ceil( anim->numFrames*defStart ); - PM_SetAnimFrame( defender, anim->firstFrame + advance, qtrue, qtrue );//was anim->firstFrame + anim->numFrames - advance, but that's wrong since they are matched anims + advance = ceil(anim->numFrames*defStart); + PM_SetAnimFrame(defender, anim->firstFrame + advance, qtrue, qtrue);//was anim->firstFrame + anim->numFrames - advance, but that's wrong since they are matched anims #ifndef FINAL_BUILD - if ( d_saberCombat->integer ) + if (d_saberCombat->integer) { - Com_Printf( "%s starting saber lock, anim = %s, %d frames to go!\n", defender->NPC_type, animTable[defAnim].name, advance ); + Com_Printf("%s starting saber lock, anim = %s, %d frames to go!\n", defender->NPC_type, animTable[defAnim].name, advance); } #endif } } - VectorClear( attacker->client->ps.velocity ); - VectorClear( attacker->client->ps.moveDir ); - VectorClear( defender->client->ps.velocity ); - VectorClear( defender->client->ps.moveDir ); - if ( lockMode == LOCK_KYLE_GRAB1 - || lockMode == LOCK_KYLE_GRAB2 + VectorClear(attacker->client->ps.velocity); + VectorClear(attacker->client->ps.moveDir); + VectorClear(defender->client->ps.velocity); + VectorClear(defender->client->ps.moveDir); + if (lockMode == LOCK_KYLE_GRAB1 + || lockMode == LOCK_KYLE_GRAB2 || lockMode == LOCK_KYLE_GRAB3 - || lockMode == LOCK_FORCE_DRAIN ) + || lockMode == LOCK_FORCE_DRAIN) {//not a real lock, just freeze them both in place //can't move or attack attacker->client->ps.pm_time = attacker->client->ps.weaponTime = attacker->client->ps.legsAnimTimer; attacker->client->ps.pm_flags |= PMF_TIME_KNOCKBACK; attacker->painDebounceTime = level.time + attacker->client->ps.pm_time; - if ( lockMode != LOCK_FORCE_DRAIN ) + if (lockMode != LOCK_FORCE_DRAIN) { defender->client->ps.torsoAnimTimer += 200; defender->client->ps.legsAnimTimer += 200; } defender->client->ps.pm_time = defender->client->ps.weaponTime = defender->client->ps.legsAnimTimer; defender->client->ps.pm_flags |= PMF_TIME_KNOCKBACK; - if ( lockMode != LOCK_FORCE_DRAIN ) + if (lockMode != LOCK_FORCE_DRAIN) { attacker->aimDebounceTime = level.time + attacker->client->ps.pm_time; } @@ -3444,130 +3448,130 @@ qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLo } //MATCH ANGLES - if ( lockMode == LOCK_KYLE_GRAB1 + if (lockMode == LOCK_KYLE_GRAB1 || lockMode == LOCK_KYLE_GRAB2 - || lockMode == LOCK_KYLE_GRAB3 ) + || lockMode == LOCK_KYLE_GRAB3) {//not a real lock, just set pitch to 0 attacker->client->ps.viewangles[PITCH] = defender->client->ps.viewangles[PITCH] = 0; } else { //FIXME: if zDiff in elevation, make lower look up and upper look down and move them closer? - float defPitchAdd = 0, zDiff = ((attacker->currentOrigin[2]+attacker->client->standheight)-(defender->currentOrigin[2]+defender->client->standheight)); - if ( zDiff > 24 ) + float defPitchAdd = 0, zDiff = ((attacker->currentOrigin[2] + attacker->client->standheight) - (defender->currentOrigin[2] + defender->client->standheight)); + if (zDiff > 24) { defPitchAdd = -30; } - else if ( zDiff < -24 ) + else if (zDiff < -24) { defPitchAdd = 30; } else { - defPitchAdd = zDiff/24.0f*-30.0f; + defPitchAdd = zDiff / 24.0f*-30.0f; } - if ( attacker->NPC && defender->NPC ) + if (attacker->NPC && defender->NPC) {//if 2 NPCs, just set pitch to 0 attacker->client->ps.viewangles[PITCH] = -defPitchAdd; defender->client->ps.viewangles[PITCH] = defPitchAdd; } else {//if a player is involved, clamp player's pitch and match NPC's to player - if ( !attacker->s.number ) + if (!attacker->s.number) { //clamp to defPitch - if ( attacker->client->ps.viewangles[PITCH] > -defPitchAdd + 10 ) + if (attacker->client->ps.viewangles[PITCH] > -defPitchAdd + 10) { attacker->client->ps.viewangles[PITCH] = -defPitchAdd + 10; } - else if ( attacker->client->ps.viewangles[PITCH] < -defPitchAdd-10 ) + else if (attacker->client->ps.viewangles[PITCH] < -defPitchAdd - 10) { - attacker->client->ps.viewangles[PITCH] = -defPitchAdd-10; + attacker->client->ps.viewangles[PITCH] = -defPitchAdd - 10; } //clamp to sane numbers - if ( attacker->client->ps.viewangles[PITCH] > 50 ) + if (attacker->client->ps.viewangles[PITCH] > 50) { attacker->client->ps.viewangles[PITCH] = 50; } - else if ( attacker->client->ps.viewangles[PITCH] < -50 ) + else if (attacker->client->ps.viewangles[PITCH] < -50) { attacker->client->ps.viewangles[PITCH] = -50; } - defender->client->ps.viewangles[PITCH] = attacker->client->ps.viewangles[PITCH]*-1; + defender->client->ps.viewangles[PITCH] = attacker->client->ps.viewangles[PITCH] * -1; defPitchAdd = defender->client->ps.viewangles[PITCH]; } - else if ( !defender->s.number ) + else if (!defender->s.number) { //clamp to defPitch - if ( defender->client->ps.viewangles[PITCH] > defPitchAdd + 10 ) + if (defender->client->ps.viewangles[PITCH] > defPitchAdd + 10) { defender->client->ps.viewangles[PITCH] = defPitchAdd + 10; } - else if ( defender->client->ps.viewangles[PITCH] < defPitchAdd-10 ) + else if (defender->client->ps.viewangles[PITCH] < defPitchAdd - 10) { - defender->client->ps.viewangles[PITCH] = defPitchAdd-10; + defender->client->ps.viewangles[PITCH] = defPitchAdd - 10; } //clamp to sane numbers - if ( defender->client->ps.viewangles[PITCH] > 50 ) + if (defender->client->ps.viewangles[PITCH] > 50) { defender->client->ps.viewangles[PITCH] = 50; } - else if ( defender->client->ps.viewangles[PITCH] < -50 ) + else if (defender->client->ps.viewangles[PITCH] < -50) { defender->client->ps.viewangles[PITCH] = -50; } defPitchAdd = defender->client->ps.viewangles[PITCH]; - attacker->client->ps.viewangles[PITCH] = defender->client->ps.viewangles[PITCH]*-1; + attacker->client->ps.viewangles[PITCH] = defender->client->ps.viewangles[PITCH] * -1; } } } vec3_t attAngles, defAngles, defDir; - VectorSubtract( defender->currentOrigin, attacker->currentOrigin, defDir ); - VectorCopy( attacker->client->ps.viewangles, attAngles ); - attAngles[YAW] = vectoyaw( defDir ); - SetClientViewAngle( attacker, attAngles ); - defAngles[PITCH] = attAngles[PITCH]*-1; - defAngles[YAW] = AngleNormalize180( attAngles[YAW] + 180); + VectorSubtract(defender->currentOrigin, attacker->currentOrigin, defDir); + VectorCopy(attacker->client->ps.viewangles, attAngles); + attAngles[YAW] = vectoyaw(defDir); + SetClientViewAngle(attacker, attAngles); + defAngles[PITCH] = attAngles[PITCH] * -1; + defAngles[YAW] = AngleNormalize180(attAngles[YAW] + 180); defAngles[ROLL] = 0; - SetClientViewAngle( defender, defAngles ); - + SetClientViewAngle(defender, defAngles); + //MATCH POSITIONS vec3_t newOrg; /* idealDist -= fabs(defPitchAdd)/8.0f; */ - float scale = (attacker->s.modelScale[0]+attacker->s.modelScale[1])*0.5f; - if ( scale && scale != 1.0f ) + float scale = (attacker->s.modelScale[0] + attacker->s.modelScale[1])*0.5f; + if (scale && scale != 1.0f) { - idealDist += 8*(scale-1.0f); + idealDist += 8 * (scale - 1.0f); } - scale = (defender->s.modelScale[0]+defender->s.modelScale[1])*0.5f; - if ( scale && scale != 1.0f ) + scale = (defender->s.modelScale[0] + defender->s.modelScale[1])*0.5f; + if (scale && scale != 1.0f) { - idealDist += 8*(scale-1.0f); + idealDist += 8 * (scale - 1.0f); } - float diff = VectorNormalize( defDir ) - idealDist;//diff will be the total error in dist + float diff = VectorNormalize(defDir) - idealDist;//diff will be the total error in dist //try to move attacker half the diff towards the defender - VectorMA( attacker->currentOrigin, diff*0.5f, defDir, newOrg ); + VectorMA(attacker->currentOrigin, diff*0.5f, defDir, newOrg); trace_t trace; - gi.trace( &trace, attacker->currentOrigin, attacker->mins, attacker->maxs, newOrg, attacker->s.number, attacker->clipmask, (EG2_Collision)0, 0 ); - if ( !trace.startsolid && !trace.allsolid ) + gi.trace(&trace, attacker->currentOrigin, attacker->mins, attacker->maxs, newOrg, attacker->s.number, attacker->clipmask, (EG2_Collision)0, 0); + if (!trace.startsolid && !trace.allsolid) { - G_SetOrigin( attacker, trace.endpos ); - gi.linkentity( attacker ); + G_SetOrigin(attacker, trace.endpos); + gi.linkentity(attacker); } //now get the defender's dist and do it for him too vec3_t attDir; - VectorSubtract( attacker->currentOrigin, defender->currentOrigin, attDir ); - diff = VectorNormalize( attDir ) - idealDist;//diff will be the total error in dist + VectorSubtract(attacker->currentOrigin, defender->currentOrigin, attDir); + diff = VectorNormalize(attDir) - idealDist;//diff will be the total error in dist //try to move defender all of the remaining diff towards the attacker - VectorMA( defender->currentOrigin, diff, attDir, newOrg ); - gi.trace( &trace, defender->currentOrigin, defender->mins, defender->maxs, newOrg, defender->s.number, defender->clipmask, (EG2_Collision)0, 0 ); - if ( !trace.startsolid && !trace.allsolid ) + VectorMA(defender->currentOrigin, diff, attDir, newOrg); + gi.trace(&trace, defender->currentOrigin, defender->mins, defender->maxs, newOrg, defender->s.number, defender->clipmask, (EG2_Collision)0, 0); + if (!trace.startsolid && !trace.allsolid) { - G_SetOrigin( defender, trace.endpos ); - gi.linkentity( defender ); + G_SetOrigin(defender, trace.endpos); + gi.linkentity(defender); } //DONE! @@ -3575,543 +3579,543 @@ qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLo return qtrue; } -qboolean WP_SabersCheckLock( gentity_t *ent1, gentity_t *ent2 ) +qboolean WP_SabersCheckLock(gentity_t *ent1, gentity_t *ent2) { - if ( ent1->client->playerTeam == ent2->client->playerTeam ) + if (ent1->client->playerTeam == ent2->client->playerTeam) { return qfalse; } - if ( ent1->client->NPC_class == CLASS_SABER_DROID - || ent2->client->NPC_class == CLASS_SABER_DROID ) + if (ent1->client->NPC_class == CLASS_SABER_DROID + || ent2->client->NPC_class == CLASS_SABER_DROID) {//they don't have saberlock anims return qfalse; } - if ( ent1->client->ps.groundEntityNum == ENTITYNUM_NONE || - ent2->client->ps.groundEntityNum == ENTITYNUM_NONE ) + if (ent1->client->ps.groundEntityNum == ENTITYNUM_NONE || + ent2->client->ps.groundEntityNum == ENTITYNUM_NONE) { return qfalse; } - if ( (ent1->client->ps.saber[0].saberFlags&SFL_NOT_LOCKABLE) - || (ent2->client->ps.saber[0].saberFlags&SFL_NOT_LOCKABLE) ) + if ((ent1->client->ps.saber[0].saberFlags&SFL_NOT_LOCKABLE) + || (ent2->client->ps.saber[0].saberFlags&SFL_NOT_LOCKABLE)) {//one of these sabers cannot lock (like a lance) return qfalse; } - if ( ent1->client->ps.dualSabers + if (ent1->client->ps.dualSabers && ent1->client->ps.saber[1].Active() - && (ent1->client->ps.saber[1].saberFlags&SFL_NOT_LOCKABLE) ) + && (ent1->client->ps.saber[1].saberFlags&SFL_NOT_LOCKABLE)) {//one of these sabers cannot lock (like a lance) return qfalse; } - if ( ent2->client->ps.dualSabers + if (ent2->client->ps.dualSabers && ent2->client->ps.saber[1].Active() - && (ent2->client->ps.saber[1].saberFlags&SFL_NOT_LOCKABLE) ) + && (ent2->client->ps.saber[1].saberFlags&SFL_NOT_LOCKABLE)) {//one of these sabers cannot lock (like a lance) return qfalse; } - if ( ent1->painDebounceTime > level.time-1000 || ent2->painDebounceTime > level.time-1000 ) + if (ent1->painDebounceTime > level.time - 1000 || ent2->painDebounceTime > level.time - 1000) {//can't saberlock if you're not ready return qfalse; } - if ( fabs( ent1->currentOrigin[2]-ent2->currentOrigin[2]) > 18 ) + if (fabs(ent1->currentOrigin[2] - ent2->currentOrigin[2]) > 18) { return qfalse; } - float dist = DistanceSquared(ent1->currentOrigin,ent2->currentOrigin); - if ( dist < 64 || dist > 6400 )//( dist < 128 || dist > 2304 ) + float dist = DistanceSquared(ent1->currentOrigin, ent2->currentOrigin); + if (dist < 64 || dist > 6400)//( dist < 128 || dist > 2304 ) {//between 8 and 80 from each other//was 16 and 48 return qfalse; } - if ( !InFOV( ent1, ent2, 40, 180 ) || !InFOV( ent2, ent1, 40, 180 ) ) + if (!InFOV(ent1, ent2, 40, 180) || !InFOV(ent2, ent1, 40, 180)) { return qfalse; } //Check for certain anims that *cannot* lock //FIXME: there should probably be a whole *list* of these, but I'll put them in as they come up - if ( ent1->client->ps.torsoAnim == BOTH_A2_STABBACK1 && ent1->client->ps.torsoAnimTimer > 300 ) + if (ent1->client->ps.torsoAnim == BOTH_A2_STABBACK1 && ent1->client->ps.torsoAnimTimer > 300) {//can't lock when saber is behind you return qfalse; } - if ( ent2->client->ps.torsoAnim == BOTH_A2_STABBACK1 && ent2->client->ps.torsoAnimTimer > 300 ) + if (ent2->client->ps.torsoAnim == BOTH_A2_STABBACK1 && ent2->client->ps.torsoAnimTimer > 300) {//can't lock when saber is behind you return qfalse; } - if ( PM_LockedAnim( ent1->client->ps.torsoAnim ) - || PM_LockedAnim( ent2->client->ps.torsoAnim ) ) + if (PM_LockedAnim(ent1->client->ps.torsoAnim) + || PM_LockedAnim(ent2->client->ps.torsoAnim)) {//stuck doing something else return qfalse; } - if ( PM_SaberLockBreakAnim( ent1->client->ps.torsoAnim ) - || PM_SaberLockBreakAnim( ent2->client->ps.torsoAnim ) ) + if (PM_SaberLockBreakAnim(ent1->client->ps.torsoAnim) + || PM_SaberLockBreakAnim(ent2->client->ps.torsoAnim)) {//still finishing the last lock break! return qfalse; } //BR to TL lock - if ( ent1->client->ps.torsoAnim == BOTH_A1_BR_TL || + if (ent1->client->ps.torsoAnim == BOTH_A1_BR_TL || ent1->client->ps.torsoAnim == BOTH_A2_BR_TL || ent1->client->ps.torsoAnim == BOTH_A3_BR_TL || ent1->client->ps.torsoAnim == BOTH_A4_BR_TL || ent1->client->ps.torsoAnim == BOTH_A5_BR_TL || ent1->client->ps.torsoAnim == BOTH_A6_BR_TL || - ent1->client->ps.torsoAnim == BOTH_A7_BR_TL ) + ent1->client->ps.torsoAnim == BOTH_A7_BR_TL) {//ent1 is attacking in the opposite diagonal - return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_BR ); + return WP_SabersCheckLock2(ent1, ent2, LOCK_DIAG_BR); } - if ( ent2->client->ps.torsoAnim == BOTH_A1_BR_TL || + if (ent2->client->ps.torsoAnim == BOTH_A1_BR_TL || ent2->client->ps.torsoAnim == BOTH_A2_BR_TL || ent2->client->ps.torsoAnim == BOTH_A3_BR_TL || ent2->client->ps.torsoAnim == BOTH_A4_BR_TL || ent2->client->ps.torsoAnim == BOTH_A5_BR_TL || ent2->client->ps.torsoAnim == BOTH_A6_BR_TL || - ent2->client->ps.torsoAnim == BOTH_A7_BR_TL ) + ent2->client->ps.torsoAnim == BOTH_A7_BR_TL) {//ent2 is attacking in the opposite diagonal - return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_BR ); + return WP_SabersCheckLock2(ent2, ent1, LOCK_DIAG_BR); } //BL to TR lock - if ( ent1->client->ps.torsoAnim == BOTH_A1_BL_TR || + if (ent1->client->ps.torsoAnim == BOTH_A1_BL_TR || ent1->client->ps.torsoAnim == BOTH_A2_BL_TR || ent1->client->ps.torsoAnim == BOTH_A3_BL_TR || ent1->client->ps.torsoAnim == BOTH_A4_BL_TR || ent1->client->ps.torsoAnim == BOTH_A5_BL_TR || ent1->client->ps.torsoAnim == BOTH_A6_BL_TR || - ent1->client->ps.torsoAnim == BOTH_A7_BL_TR ) + ent1->client->ps.torsoAnim == BOTH_A7_BL_TR) {//ent1 is attacking in the opposite diagonal - return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_BL ); + return WP_SabersCheckLock2(ent1, ent2, LOCK_DIAG_BL); } - if ( ent2->client->ps.torsoAnim == BOTH_A1_BL_TR || + if (ent2->client->ps.torsoAnim == BOTH_A1_BL_TR || ent2->client->ps.torsoAnim == BOTH_A2_BL_TR || ent2->client->ps.torsoAnim == BOTH_A3_BL_TR || ent2->client->ps.torsoAnim == BOTH_A4_BL_TR || ent2->client->ps.torsoAnim == BOTH_A5_BL_TR || ent2->client->ps.torsoAnim == BOTH_A6_BL_TR || - ent2->client->ps.torsoAnim == BOTH_A7_BL_TR ) + ent2->client->ps.torsoAnim == BOTH_A7_BL_TR) {//ent2 is attacking in the opposite diagonal - return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_BL ); + return WP_SabersCheckLock2(ent2, ent1, LOCK_DIAG_BL); } //L to R lock - if ( ent1->client->ps.torsoAnim == BOTH_A1__L__R || + if (ent1->client->ps.torsoAnim == BOTH_A1__L__R || ent1->client->ps.torsoAnim == BOTH_A2__L__R || ent1->client->ps.torsoAnim == BOTH_A3__L__R || ent1->client->ps.torsoAnim == BOTH_A4__L__R || ent1->client->ps.torsoAnim == BOTH_A5__L__R || ent1->client->ps.torsoAnim == BOTH_A6__L__R || - ent1->client->ps.torsoAnim == BOTH_A7__L__R ) + ent1->client->ps.torsoAnim == BOTH_A7__L__R) {//ent1 is attacking l to r - return WP_SabersCheckLock2( ent1, ent2, LOCK_L ); + return WP_SabersCheckLock2(ent1, ent2, LOCK_L); /* if ( ent2BlockingPlayer ) {//player will block this anyway - return WP_SabersCheckLock2( ent1, ent2, LOCK_L ); + return WP_SabersCheckLock2( ent1, ent2, LOCK_L ); } if ( ent2->client->ps.torsoAnim == BOTH_A1_TL_BR || - ent2->client->ps.torsoAnim == BOTH_A2_TL_BR || - ent2->client->ps.torsoAnim == BOTH_A3_TL_BR || - ent2->client->ps.torsoAnim == BOTH_A4_TL_BR || - ent2->client->ps.torsoAnim == BOTH_A5_TL_BR || - ent2->client->ps.torsoAnim == BOTH_A6_TL_BR || - ent2->client->ps.torsoAnim == BOTH_A7_TL_BR || - ent2->client->ps.torsoAnim == BOTH_P1_S1_TR || - ent2->client->ps.torsoAnim == BOTH_P1_S1_BL ) + ent2->client->ps.torsoAnim == BOTH_A2_TL_BR || + ent2->client->ps.torsoAnim == BOTH_A3_TL_BR || + ent2->client->ps.torsoAnim == BOTH_A4_TL_BR || + ent2->client->ps.torsoAnim == BOTH_A5_TL_BR || + ent2->client->ps.torsoAnim == BOTH_A6_TL_BR || + ent2->client->ps.torsoAnim == BOTH_A7_TL_BR || + ent2->client->ps.torsoAnim == BOTH_P1_S1_TR || + ent2->client->ps.torsoAnim == BOTH_P1_S1_BL ) {//ent2 is attacking or blocking on the r - return WP_SabersCheckLock2( ent1, ent2, LOCK_L ); + return WP_SabersCheckLock2( ent1, ent2, LOCK_L ); } if ( ent2Boss && !Q_irand( 0, 3 ) ) { - return WP_SabersCheckLock2( ent1, ent2, LOCK_L ); + return WP_SabersCheckLock2( ent1, ent2, LOCK_L ); } */ } - if ( ent2->client->ps.torsoAnim == BOTH_A1__L__R || + if (ent2->client->ps.torsoAnim == BOTH_A1__L__R || ent2->client->ps.torsoAnim == BOTH_A2__L__R || ent2->client->ps.torsoAnim == BOTH_A3__L__R || ent2->client->ps.torsoAnim == BOTH_A4__L__R || ent2->client->ps.torsoAnim == BOTH_A5__L__R || ent2->client->ps.torsoAnim == BOTH_A6__L__R || - ent2->client->ps.torsoAnim == BOTH_A7__L__R ) + ent2->client->ps.torsoAnim == BOTH_A7__L__R) {//ent2 is attacking l to r - return WP_SabersCheckLock2( ent2, ent1, LOCK_L ); + return WP_SabersCheckLock2(ent2, ent1, LOCK_L); /* if ( ent1BlockingPlayer ) {//player will block this anyway - return WP_SabersCheckLock2( ent2, ent1, LOCK_L ); + return WP_SabersCheckLock2( ent2, ent1, LOCK_L ); } if ( ent1->client->ps.torsoAnim == BOTH_A1_TL_BR || - ent1->client->ps.torsoAnim == BOTH_A2_TL_BR || - ent1->client->ps.torsoAnim == BOTH_A3_TL_BR || - ent1->client->ps.torsoAnim == BOTH_A4_TL_BR || - ent1->client->ps.torsoAnim == BOTH_A5_TL_BR || - ent1->client->ps.torsoAnim == BOTH_A6_TL_BR || - ent1->client->ps.torsoAnim == BOTH_A7_TL_BR || - ent1->client->ps.torsoAnim == BOTH_P1_S1_TR || - ent1->client->ps.torsoAnim == BOTH_P1_S1_BL ) + ent1->client->ps.torsoAnim == BOTH_A2_TL_BR || + ent1->client->ps.torsoAnim == BOTH_A3_TL_BR || + ent1->client->ps.torsoAnim == BOTH_A4_TL_BR || + ent1->client->ps.torsoAnim == BOTH_A5_TL_BR || + ent1->client->ps.torsoAnim == BOTH_A6_TL_BR || + ent1->client->ps.torsoAnim == BOTH_A7_TL_BR || + ent1->client->ps.torsoAnim == BOTH_P1_S1_TR || + ent1->client->ps.torsoAnim == BOTH_P1_S1_BL ) {//ent1 is attacking or blocking on the r - return WP_SabersCheckLock2( ent2, ent1, LOCK_L ); + return WP_SabersCheckLock2( ent2, ent1, LOCK_L ); } if ( ent1Boss && !Q_irand( 0, 3 ) ) { - return WP_SabersCheckLock2( ent2, ent1, LOCK_L ); + return WP_SabersCheckLock2( ent2, ent1, LOCK_L ); } */ } //R to L lock - if ( ent1->client->ps.torsoAnim == BOTH_A1__R__L || + if (ent1->client->ps.torsoAnim == BOTH_A1__R__L || ent1->client->ps.torsoAnim == BOTH_A2__R__L || ent1->client->ps.torsoAnim == BOTH_A3__R__L || ent1->client->ps.torsoAnim == BOTH_A4__R__L || ent1->client->ps.torsoAnim == BOTH_A5__R__L || ent1->client->ps.torsoAnim == BOTH_A6__R__L || - ent1->client->ps.torsoAnim == BOTH_A7__R__L ) + ent1->client->ps.torsoAnim == BOTH_A7__R__L) {//ent1 is attacking r to l - return WP_SabersCheckLock2( ent1, ent2, LOCK_R ); + return WP_SabersCheckLock2(ent1, ent2, LOCK_R); /* if ( ent2BlockingPlayer ) {//player will block this anyway - return WP_SabersCheckLock2( ent1, ent2, LOCK_R ); + return WP_SabersCheckLock2( ent1, ent2, LOCK_R ); } if ( ent2->client->ps.torsoAnim == BOTH_A1_TR_BL || - ent2->client->ps.torsoAnim == BOTH_A2_TR_BL || - ent2->client->ps.torsoAnim == BOTH_A3_TR_BL || - ent2->client->ps.torsoAnim == BOTH_A4_TR_BL || - ent2->client->ps.torsoAnim == BOTH_A5_TR_BL || - ent2->client->ps.torsoAnim == BOTH_A6_TR_BL || - ent2->client->ps.torsoAnim == BOTH_A7_TR_BL || - ent2->client->ps.torsoAnim == BOTH_P1_S1_TL || - ent2->client->ps.torsoAnim == BOTH_P1_S1_BR ) + ent2->client->ps.torsoAnim == BOTH_A2_TR_BL || + ent2->client->ps.torsoAnim == BOTH_A3_TR_BL || + ent2->client->ps.torsoAnim == BOTH_A4_TR_BL || + ent2->client->ps.torsoAnim == BOTH_A5_TR_BL || + ent2->client->ps.torsoAnim == BOTH_A6_TR_BL || + ent2->client->ps.torsoAnim == BOTH_A7_TR_BL || + ent2->client->ps.torsoAnim == BOTH_P1_S1_TL || + ent2->client->ps.torsoAnim == BOTH_P1_S1_BR ) {//ent2 is attacking or blocking on the l - return WP_SabersCheckLock2( ent1, ent2, LOCK_R ); + return WP_SabersCheckLock2( ent1, ent2, LOCK_R ); } if ( ent2Boss && !Q_irand( 0, 3 ) ) { - return WP_SabersCheckLock2( ent1, ent2, LOCK_R ); + return WP_SabersCheckLock2( ent1, ent2, LOCK_R ); } */ } - if ( ent2->client->ps.torsoAnim == BOTH_A1__R__L || + if (ent2->client->ps.torsoAnim == BOTH_A1__R__L || ent2->client->ps.torsoAnim == BOTH_A2__R__L || ent2->client->ps.torsoAnim == BOTH_A3__R__L || ent2->client->ps.torsoAnim == BOTH_A4__R__L || ent2->client->ps.torsoAnim == BOTH_A5__R__L || ent2->client->ps.torsoAnim == BOTH_A6__R__L || - ent2->client->ps.torsoAnim == BOTH_A7__R__L ) + ent2->client->ps.torsoAnim == BOTH_A7__R__L) {//ent2 is attacking r to l - return WP_SabersCheckLock2( ent2, ent1, LOCK_R ); + return WP_SabersCheckLock2(ent2, ent1, LOCK_R); /* if ( ent1BlockingPlayer ) {//player will block this anyway - return WP_SabersCheckLock2( ent2, ent1, LOCK_R ); + return WP_SabersCheckLock2( ent2, ent1, LOCK_R ); } if ( ent1->client->ps.torsoAnim == BOTH_A1_TR_BL || - ent1->client->ps.torsoAnim == BOTH_A2_TR_BL || - ent1->client->ps.torsoAnim == BOTH_A3_TR_BL || - ent1->client->ps.torsoAnim == BOTH_A4_TR_BL || - ent1->client->ps.torsoAnim == BOTH_A5_TR_BL || - ent1->client->ps.torsoAnim == BOTH_A6_TR_BL || - ent1->client->ps.torsoAnim == BOTH_A7_TR_BL || - ent1->client->ps.torsoAnim == BOTH_P1_S1_TL || - ent1->client->ps.torsoAnim == BOTH_P1_S1_BR ) + ent1->client->ps.torsoAnim == BOTH_A2_TR_BL || + ent1->client->ps.torsoAnim == BOTH_A3_TR_BL || + ent1->client->ps.torsoAnim == BOTH_A4_TR_BL || + ent1->client->ps.torsoAnim == BOTH_A5_TR_BL || + ent1->client->ps.torsoAnim == BOTH_A6_TR_BL || + ent1->client->ps.torsoAnim == BOTH_A7_TR_BL || + ent1->client->ps.torsoAnim == BOTH_P1_S1_TL || + ent1->client->ps.torsoAnim == BOTH_P1_S1_BR ) {//ent1 is attacking or blocking on the l - return WP_SabersCheckLock2( ent2, ent1, LOCK_R ); + return WP_SabersCheckLock2( ent2, ent1, LOCK_R ); } if ( ent1Boss && !Q_irand( 0, 3 ) ) { - return WP_SabersCheckLock2( ent2, ent1, LOCK_R ); + return WP_SabersCheckLock2( ent2, ent1, LOCK_R ); } */ } //TR to BL lock - if ( ent1->client->ps.torsoAnim == BOTH_A1_TR_BL || + if (ent1->client->ps.torsoAnim == BOTH_A1_TR_BL || ent1->client->ps.torsoAnim == BOTH_A2_TR_BL || ent1->client->ps.torsoAnim == BOTH_A3_TR_BL || ent1->client->ps.torsoAnim == BOTH_A4_TR_BL || ent1->client->ps.torsoAnim == BOTH_A5_TR_BL || ent1->client->ps.torsoAnim == BOTH_A6_TR_BL || - ent1->client->ps.torsoAnim == BOTH_A7_TR_BL ) + ent1->client->ps.torsoAnim == BOTH_A7_TR_BL) {//ent1 is attacking diagonally - return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_TR ); + return WP_SabersCheckLock2(ent1, ent2, LOCK_DIAG_TR); /* if ( ent2BlockingPlayer ) {//player will block this anyway - return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_TR ); + return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_TR ); } if ( ent2->client->ps.torsoAnim == BOTH_A1_TR_BL || - ent2->client->ps.torsoAnim == BOTH_A2_TR_BL || - ent2->client->ps.torsoAnim == BOTH_A3_TR_BL || - ent2->client->ps.torsoAnim == BOTH_A4_TR_BL || - ent2->client->ps.torsoAnim == BOTH_A5_TR_BL || - ent2->client->ps.torsoAnim == BOTH_A6_TR_BL || - ent2->client->ps.torsoAnim == BOTH_A7_TR_BL || - ent2->client->ps.torsoAnim == BOTH_P1_S1_TL ) + ent2->client->ps.torsoAnim == BOTH_A2_TR_BL || + ent2->client->ps.torsoAnim == BOTH_A3_TR_BL || + ent2->client->ps.torsoAnim == BOTH_A4_TR_BL || + ent2->client->ps.torsoAnim == BOTH_A5_TR_BL || + ent2->client->ps.torsoAnim == BOTH_A6_TR_BL || + ent2->client->ps.torsoAnim == BOTH_A7_TR_BL || + ent2->client->ps.torsoAnim == BOTH_P1_S1_TL ) {//ent2 is attacking in the opposite diagonal - return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_TR ); + return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_TR ); } if ( ent2->client->ps.torsoAnim == BOTH_A1_BR_TL || - ent2->client->ps.torsoAnim == BOTH_A2_BR_TL || - ent2->client->ps.torsoAnim == BOTH_A3_BR_TL || - ent2->client->ps.torsoAnim == BOTH_A4_BR_TL || - ent2->client->ps.torsoAnim == BOTH_A5_BR_TL || - ent2->client->ps.torsoAnim == BOTH_A6_BR_TL || - ent2->client->ps.torsoAnim == BOTH_A7_BR_TL || - ent2->client->ps.torsoAnim == BOTH_P1_S1_BL ) + ent2->client->ps.torsoAnim == BOTH_A2_BR_TL || + ent2->client->ps.torsoAnim == BOTH_A3_BR_TL || + ent2->client->ps.torsoAnim == BOTH_A4_BR_TL || + ent2->client->ps.torsoAnim == BOTH_A5_BR_TL || + ent2->client->ps.torsoAnim == BOTH_A6_BR_TL || + ent2->client->ps.torsoAnim == BOTH_A7_BR_TL || + ent2->client->ps.torsoAnim == BOTH_P1_S1_BL ) {//ent2 is attacking in the opposite diagonal - return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_BL ); + return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_BL ); } if ( ent2Boss && !Q_irand( 0, 3 ) ) { - return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_TR ); + return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_TR ); } */ } - if ( ent2->client->ps.torsoAnim == BOTH_A1_TR_BL || + if (ent2->client->ps.torsoAnim == BOTH_A1_TR_BL || ent2->client->ps.torsoAnim == BOTH_A2_TR_BL || ent2->client->ps.torsoAnim == BOTH_A3_TR_BL || ent2->client->ps.torsoAnim == BOTH_A4_TR_BL || ent2->client->ps.torsoAnim == BOTH_A5_TR_BL || ent2->client->ps.torsoAnim == BOTH_A6_TR_BL || - ent2->client->ps.torsoAnim == BOTH_A7_TR_BL ) + ent2->client->ps.torsoAnim == BOTH_A7_TR_BL) {//ent2 is attacking diagonally - return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_TR ); + return WP_SabersCheckLock2(ent2, ent1, LOCK_DIAG_TR); /* if ( ent1BlockingPlayer ) {//player will block this anyway - return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_TR ); + return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_TR ); } if ( ent1->client->ps.torsoAnim == BOTH_A1_TR_BL || - ent1->client->ps.torsoAnim == BOTH_A2_TR_BL || - ent1->client->ps.torsoAnim == BOTH_A3_TR_BL || - ent1->client->ps.torsoAnim == BOTH_A4_TR_BL || - ent1->client->ps.torsoAnim == BOTH_A5_TR_BL || - ent1->client->ps.torsoAnim == BOTH_A6_TR_BL || - ent1->client->ps.torsoAnim == BOTH_A7_TR_BL || - ent1->client->ps.torsoAnim == BOTH_P1_S1_TL ) + ent1->client->ps.torsoAnim == BOTH_A2_TR_BL || + ent1->client->ps.torsoAnim == BOTH_A3_TR_BL || + ent1->client->ps.torsoAnim == BOTH_A4_TR_BL || + ent1->client->ps.torsoAnim == BOTH_A5_TR_BL || + ent1->client->ps.torsoAnim == BOTH_A6_TR_BL || + ent1->client->ps.torsoAnim == BOTH_A7_TR_BL || + ent1->client->ps.torsoAnim == BOTH_P1_S1_TL ) {//ent1 is attacking in the opposite diagonal - return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_TR ); + return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_TR ); } if ( ent1->client->ps.torsoAnim == BOTH_A1_BR_TL || - ent1->client->ps.torsoAnim == BOTH_A2_BR_TL || - ent1->client->ps.torsoAnim == BOTH_A3_BR_TL || - ent1->client->ps.torsoAnim == BOTH_A4_BR_TL || - ent1->client->ps.torsoAnim == BOTH_A5_BR_TL || - ent1->client->ps.torsoAnim == BOTH_A6_BR_TL || - ent1->client->ps.torsoAnim == BOTH_A7_BR_TL || - ent1->client->ps.torsoAnim == BOTH_P1_S1_BL ) + ent1->client->ps.torsoAnim == BOTH_A2_BR_TL || + ent1->client->ps.torsoAnim == BOTH_A3_BR_TL || + ent1->client->ps.torsoAnim == BOTH_A4_BR_TL || + ent1->client->ps.torsoAnim == BOTH_A5_BR_TL || + ent1->client->ps.torsoAnim == BOTH_A6_BR_TL || + ent1->client->ps.torsoAnim == BOTH_A7_BR_TL || + ent1->client->ps.torsoAnim == BOTH_P1_S1_BL ) {//ent1 is attacking in the opposite diagonal - return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_BL ); + return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_BL ); } if ( ent1Boss && !Q_irand( 0, 3 ) ) { - return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_TR ); + return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_TR ); } */ } //TL to BR lock - if ( ent1->client->ps.torsoAnim == BOTH_A1_TL_BR || + if (ent1->client->ps.torsoAnim == BOTH_A1_TL_BR || ent1->client->ps.torsoAnim == BOTH_A2_TL_BR || ent1->client->ps.torsoAnim == BOTH_A3_TL_BR || ent1->client->ps.torsoAnim == BOTH_A4_TL_BR || ent1->client->ps.torsoAnim == BOTH_A5_TL_BR || ent1->client->ps.torsoAnim == BOTH_A6_TL_BR || - ent1->client->ps.torsoAnim == BOTH_A7_TL_BR ) + ent1->client->ps.torsoAnim == BOTH_A7_TL_BR) {//ent1 is attacking diagonally - return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_TL ); + return WP_SabersCheckLock2(ent1, ent2, LOCK_DIAG_TL); /* if ( ent2BlockingPlayer ) {//player will block this anyway - return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_TL ); + return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_TL ); } if ( ent2->client->ps.torsoAnim == BOTH_A1_TL_BR || - ent2->client->ps.torsoAnim == BOTH_A2_TL_BR || - ent2->client->ps.torsoAnim == BOTH_A3_TL_BR || - ent2->client->ps.torsoAnim == BOTH_A4_TL_BR || - ent2->client->ps.torsoAnim == BOTH_A5_TL_BR || - ent2->client->ps.torsoAnim == BOTH_A6_TL_BR || - ent2->client->ps.torsoAnim == BOTH_A7_TL_BR || - ent2->client->ps.torsoAnim == BOTH_P1_S1_TR ) + ent2->client->ps.torsoAnim == BOTH_A2_TL_BR || + ent2->client->ps.torsoAnim == BOTH_A3_TL_BR || + ent2->client->ps.torsoAnim == BOTH_A4_TL_BR || + ent2->client->ps.torsoAnim == BOTH_A5_TL_BR || + ent2->client->ps.torsoAnim == BOTH_A6_TL_BR || + ent2->client->ps.torsoAnim == BOTH_A7_TL_BR || + ent2->client->ps.torsoAnim == BOTH_P1_S1_TR ) {//ent2 is attacking in the opposite diagonal - return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_TL ); + return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_TL ); } if ( ent2->client->ps.torsoAnim == BOTH_A1_BL_TR || - ent2->client->ps.torsoAnim == BOTH_A2_BL_TR || - ent2->client->ps.torsoAnim == BOTH_A3_BL_TR || - ent2->client->ps.torsoAnim == BOTH_A4_BL_TR || - ent2->client->ps.torsoAnim == BOTH_A5_BL_TR || - ent2->client->ps.torsoAnim == BOTH_A6_BL_TR || - ent2->client->ps.torsoAnim == BOTH_A7_BL_TR || - ent2->client->ps.torsoAnim == BOTH_P1_S1_BR ) + ent2->client->ps.torsoAnim == BOTH_A2_BL_TR || + ent2->client->ps.torsoAnim == BOTH_A3_BL_TR || + ent2->client->ps.torsoAnim == BOTH_A4_BL_TR || + ent2->client->ps.torsoAnim == BOTH_A5_BL_TR || + ent2->client->ps.torsoAnim == BOTH_A6_BL_TR || + ent2->client->ps.torsoAnim == BOTH_A7_BL_TR || + ent2->client->ps.torsoAnim == BOTH_P1_S1_BR ) {//ent2 is attacking in the opposite diagonal - return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_BR ); + return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_BR ); } if ( ent2Boss && !Q_irand( 0, 3 ) ) { - return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_TL ); + return WP_SabersCheckLock2( ent1, ent2, LOCK_DIAG_TL ); } */ } - if ( ent2->client->ps.torsoAnim == BOTH_A1_TL_BR || + if (ent2->client->ps.torsoAnim == BOTH_A1_TL_BR || ent2->client->ps.torsoAnim == BOTH_A2_TL_BR || ent2->client->ps.torsoAnim == BOTH_A3_TL_BR || ent2->client->ps.torsoAnim == BOTH_A4_TL_BR || ent2->client->ps.torsoAnim == BOTH_A5_TL_BR || ent2->client->ps.torsoAnim == BOTH_A6_TL_BR || - ent2->client->ps.torsoAnim == BOTH_A7_TL_BR ) + ent2->client->ps.torsoAnim == BOTH_A7_TL_BR) {//ent2 is attacking diagonally - return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_TL ); + return WP_SabersCheckLock2(ent2, ent1, LOCK_DIAG_TL); /* if ( ent1BlockingPlayer ) {//player will block this anyway - return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_TL ); + return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_TL ); } if ( ent1->client->ps.torsoAnim == BOTH_A1_TL_BR || - ent1->client->ps.torsoAnim == BOTH_A2_TL_BR || - ent1->client->ps.torsoAnim == BOTH_A3_TL_BR || - ent1->client->ps.torsoAnim == BOTH_A4_TL_BR || - ent1->client->ps.torsoAnim == BOTH_A5_TL_BR || - ent1->client->ps.torsoAnim == BOTH_A6_TL_BR || - ent1->client->ps.torsoAnim == BOTH_A7_TL_BR || - ent1->client->ps.torsoAnim == BOTH_P1_S1_TR ) + ent1->client->ps.torsoAnim == BOTH_A2_TL_BR || + ent1->client->ps.torsoAnim == BOTH_A3_TL_BR || + ent1->client->ps.torsoAnim == BOTH_A4_TL_BR || + ent1->client->ps.torsoAnim == BOTH_A5_TL_BR || + ent1->client->ps.torsoAnim == BOTH_A6_TL_BR || + ent1->client->ps.torsoAnim == BOTH_A7_TL_BR || + ent1->client->ps.torsoAnim == BOTH_P1_S1_TR ) {//ent1 is attacking in the opposite diagonal - return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_TL ); + return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_TL ); } if ( ent1->client->ps.torsoAnim == BOTH_A1_BL_TR || - ent1->client->ps.torsoAnim == BOTH_A2_BL_TR || - ent1->client->ps.torsoAnim == BOTH_A3_BL_TR || - ent1->client->ps.torsoAnim == BOTH_A4_BL_TR || - ent1->client->ps.torsoAnim == BOTH_A5_BL_TR || - ent1->client->ps.torsoAnim == BOTH_A6_BL_TR || - ent1->client->ps.torsoAnim == BOTH_A7_BL_TR || - ent1->client->ps.torsoAnim == BOTH_P1_S1_BR ) + ent1->client->ps.torsoAnim == BOTH_A2_BL_TR || + ent1->client->ps.torsoAnim == BOTH_A3_BL_TR || + ent1->client->ps.torsoAnim == BOTH_A4_BL_TR || + ent1->client->ps.torsoAnim == BOTH_A5_BL_TR || + ent1->client->ps.torsoAnim == BOTH_A6_BL_TR || + ent1->client->ps.torsoAnim == BOTH_A7_BL_TR || + ent1->client->ps.torsoAnim == BOTH_P1_S1_BR ) {//ent1 is attacking in the opposite diagonal - return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_BR ); + return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_BR ); } if ( ent1Boss && !Q_irand( 0, 3 ) ) { - return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_TL ); + return WP_SabersCheckLock2( ent2, ent1, LOCK_DIAG_TL ); } */ } //T to B lock - if ( ent1->client->ps.torsoAnim == BOTH_A1_T__B_ || + if (ent1->client->ps.torsoAnim == BOTH_A1_T__B_ || ent1->client->ps.torsoAnim == BOTH_A2_T__B_ || ent1->client->ps.torsoAnim == BOTH_A3_T__B_ || ent1->client->ps.torsoAnim == BOTH_A4_T__B_ || ent1->client->ps.torsoAnim == BOTH_A5_T__B_ || ent1->client->ps.torsoAnim == BOTH_A6_T__B_ || - ent1->client->ps.torsoAnim == BOTH_A7_T__B_ ) + ent1->client->ps.torsoAnim == BOTH_A7_T__B_) {//ent1 is attacking top-down /* if ( ent2->client->ps.torsoAnim == BOTH_P1_S1_T_ || - ent2->client->ps.torsoAnim == BOTH_K1_S1_T_ ) + ent2->client->ps.torsoAnim == BOTH_K1_S1_T_ ) */ {//ent2 is blocking at top - return WP_SabersCheckLock2( ent1, ent2, LOCK_TOP ); + return WP_SabersCheckLock2(ent1, ent2, LOCK_TOP); } } - if ( ent2->client->ps.torsoAnim == BOTH_A1_T__B_ || + if (ent2->client->ps.torsoAnim == BOTH_A1_T__B_ || ent2->client->ps.torsoAnim == BOTH_A2_T__B_ || ent2->client->ps.torsoAnim == BOTH_A3_T__B_ || ent2->client->ps.torsoAnim == BOTH_A4_T__B_ || ent2->client->ps.torsoAnim == BOTH_A5_T__B_ || ent2->client->ps.torsoAnim == BOTH_A6_T__B_ || - ent2->client->ps.torsoAnim == BOTH_A7_T__B_ ) + ent2->client->ps.torsoAnim == BOTH_A7_T__B_) {//ent2 is attacking top-down /* if ( ent1->client->ps.torsoAnim == BOTH_P1_S1_T_ || - ent1->client->ps.torsoAnim == BOTH_K1_S1_T_ ) + ent1->client->ps.torsoAnim == BOTH_K1_S1_T_ ) */ {//ent1 is blocking at top - return WP_SabersCheckLock2( ent2, ent1, LOCK_TOP ); + return WP_SabersCheckLock2(ent2, ent1, LOCK_TOP); } } /* if ( !Q_irand( 0, 10 ) ) { - return WP_SabersCheckLock2( ent1, ent2, LOCK_RANDOM ); + return WP_SabersCheckLock2( ent1, ent2, LOCK_RANDOM ); } */ return qfalse; } -qboolean WP_SaberParry( gentity_t *victim, gentity_t *attacker, int saberNum, int bladeNum ) +qboolean WP_SaberParry(gentity_t *victim, gentity_t *attacker, int saberNum, int bladeNum) { - if ( !victim || !victim->client || !attacker ) + if (!victim || !victim->client || !attacker) { return qfalse; } - if ( Rosh_BeingHealed( victim ) ) + if (Rosh_BeingHealed(victim)) { return qfalse; } - if ( G_InCinematicSaberAnim( victim ) ) + if (G_InCinematicSaberAnim(victim)) { return qfalse; } - if ( PM_SuperBreakLoseAnim( victim->client->ps.torsoAnim ) - || PM_SuperBreakWinAnim( victim->client->ps.torsoAnim ) ) + if (PM_SuperBreakLoseAnim(victim->client->ps.torsoAnim) + || PM_SuperBreakWinAnim(victim->client->ps.torsoAnim)) { return qfalse; } - if ( victim->s.number || g_saberAutoBlocking->integer || victim->client->ps.saberBlockingTime > level.time ) + if (victim->s.number || g_saberAutoBlocking->integer || victim->client->ps.saberBlockingTime > level.time) {//either an NPC or a player who is blocking - if ( !PM_SaberInTransitionAny( victim->client->ps.saberMove ) - && !PM_SaberInBounce( victim->client->ps.saberMove ) - && !PM_SaberInKnockaway( victim->client->ps.saberMove ) ) + if (!PM_SaberInTransitionAny(victim->client->ps.saberMove) + && !PM_SaberInBounce(victim->client->ps.saberMove) + && !PM_SaberInKnockaway(victim->client->ps.saberMove)) {//I'm not attacking, in transition or in a bounce or knockaway, so play a parry - WP_SaberBlockNonRandom( victim, saberHitLocation, qfalse ); + WP_SaberBlockNonRandom(victim, saberHitLocation, qfalse); } victim->client->ps.saberEventFlags |= SEF_PARRIED; //since it was parried, take away any damage done //FIXME: what if the damage was done before the parry? - WP_SaberClearDamageForEntNum( attacker, victim->s.number, saberNum, bladeNum ); + WP_SaberClearDamageForEntNum(attacker, victim->s.number, saberNum, bladeNum); //tell the victim to get mad at me - if ( victim->enemy != attacker && victim->client->playerTeam != attacker->client->playerTeam ) + if (victim->enemy != attacker && victim->client->playerTeam != attacker->client->playerTeam) {//they're not mad at me and they're not on my team - G_ClearEnemy( victim ); - G_SetEnemy( victim, attacker ); + G_ClearEnemy(victim); + G_SetEnemy(victim, attacker); } return qtrue; } return qfalse; } -qboolean WP_BrokenParryKnockDown( gentity_t *victim ) +qboolean WP_BrokenParryKnockDown(gentity_t *victim) { - if ( !victim || !victim->client ) + if (!victim || !victim->client) { return qfalse; } - if ( PM_SuperBreakLoseAnim( victim->client->ps.torsoAnim ) - || PM_SuperBreakWinAnim( victim->client->ps.torsoAnim ) ) + if (PM_SuperBreakLoseAnim(victim->client->ps.torsoAnim) + || PM_SuperBreakWinAnim(victim->client->ps.torsoAnim)) { return qfalse; } - if ( victim->client->ps.saberMove == LS_PARRY_UP + if (victim->client->ps.saberMove == LS_PARRY_UP || victim->client->ps.saberMove == LS_PARRY_UR || victim->client->ps.saberMove == LS_PARRY_UL || victim->client->ps.saberMove == LS_H1_BR || victim->client->ps.saberMove == LS_H1_B_ - || victim->client->ps.saberMove == LS_H1_BL ) + || victim->client->ps.saberMove == LS_H1_BL) {//knock their asses down! int knockAnim = BOTH_KNOCKDOWN1; - if ( PM_CrouchAnim( victim->client->ps.legsAnim ) ) + if (PM_CrouchAnim(victim->client->ps.legsAnim)) { knockAnim = BOTH_KNOCKDOWN4; } - NPC_SetAnim( victim, SETANIM_BOTH, knockAnim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); - G_AddEvent( victim, EV_PAIN, victim->health ); + NPC_SetAnim(victim, SETANIM_BOTH, knockAnim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + G_AddEvent(victim, EV_PAIN, victim->health); return qtrue; } return qfalse; } -qboolean G_TryingKataAttack( gentity_t *self, usercmd_t *cmd ) +qboolean G_TryingKataAttack(gentity_t *self, usercmd_t *cmd) { - if ( g_saberNewControlScheme->integer ) + if (g_saberNewControlScheme->integer) {//use the new control scheme: force focus button - if ( (cmd->buttons&BUTTON_FORCE_FOCUS) ) + if ((cmd->buttons&BUTTON_FORCE_FOCUS)) { return qtrue; } @@ -4122,11 +4126,11 @@ qboolean G_TryingKataAttack( gentity_t *self, usercmd_t *cmd ) } else //if ( self && self->client ) {//use the old control scheme - if ( (cmd->buttons&BUTTON_ALT_ATTACK) ) + if ((cmd->buttons&BUTTON_ALT_ATTACK)) {//pressing alt-attack //if ( !(self->client->ps.pm_flags&PMF_ALT_ATTACK_HELD) ) {//haven't been holding alt-attack - if ( (cmd->buttons&BUTTON_ATTACK) ) + if ((cmd->buttons&BUTTON_ATTACK)) {//pressing attack return qtrue; } @@ -4136,19 +4140,19 @@ qboolean G_TryingKataAttack( gentity_t *self, usercmd_t *cmd ) return qfalse; } -qboolean G_TryingPullAttack( gentity_t *self, usercmd_t *cmd, qboolean amPulling ) +qboolean G_TryingPullAttack(gentity_t *self, usercmd_t *cmd, qboolean amPulling) { - if ( g_saberNewControlScheme->integer ) + if (g_saberNewControlScheme->integer) {//use the new control scheme: force focus button - if ( (cmd->buttons&BUTTON_FORCE_FOCUS) ) + if ((cmd->buttons&BUTTON_FORCE_FOCUS)) { - if ( self && self->client ) + if (self && self->client) { - if ( self->client->ps.forcePowerLevel[FP_PULL] >= FORCE_LEVEL_3 ) + if (self->client->ps.forcePowerLevel[FP_PULL] >= FORCE_LEVEL_3) {//force pull 3 - if ( amPulling - || (self->client->ps.forcePowersActive&(1<client->ps.forcePowerDebounce[FP_PULL] > level.time ) //force-pulling + if (amPulling + || (self->client->ps.forcePowersActive&(1 << FP_PULL)) + || self->client->ps.forcePowerDebounce[FP_PULL] > level.time) //force-pulling {//pulling return qtrue; } @@ -4162,15 +4166,15 @@ qboolean G_TryingPullAttack( gentity_t *self, usercmd_t *cmd, qboolean amPulling } else {//use the old control scheme - if ( (cmd->buttons&BUTTON_ATTACK) ) + if ((cmd->buttons&BUTTON_ATTACK)) {//pressing attack - if ( self && self->client ) + if (self && self->client) { - if ( self->client->ps.forcePowerLevel[FP_PULL] >= FORCE_LEVEL_3 ) + if (self->client->ps.forcePowerLevel[FP_PULL] >= FORCE_LEVEL_3) {//force pull 3 - if ( amPulling - || (self->client->ps.forcePowersActive&(1<client->ps.forcePowerDebounce[FP_PULL] > level.time ) //force-pulling + if (amPulling + || (self->client->ps.forcePowersActive&(1 << FP_PULL)) + || self->client->ps.forcePowerDebounce[FP_PULL] > level.time) //force-pulling {//pulling return qtrue; } @@ -4181,11 +4185,11 @@ qboolean G_TryingPullAttack( gentity_t *self, usercmd_t *cmd, qboolean amPulling return qfalse; } -qboolean G_TryingCartwheel( gentity_t *self, usercmd_t *cmd ) +qboolean G_TryingCartwheel(gentity_t *self, usercmd_t *cmd) { - if ( g_saberNewControlScheme->integer ) + if (g_saberNewControlScheme->integer) {//use the new control scheme: force focus button - if ( (cmd->buttons&BUTTON_FORCE_FOCUS) ) + if ((cmd->buttons&BUTTON_FORCE_FOCUS)) { return qtrue; } @@ -4196,22 +4200,22 @@ qboolean G_TryingCartwheel( gentity_t *self, usercmd_t *cmd ) } else {//use the old control scheme - if ( (cmd->buttons&BUTTON_ATTACK) ) + if ((cmd->buttons&BUTTON_ATTACK)) {//pressing attack - if ( cmd->rightmove ) + if (cmd->rightmove) { - if ( self && self->client ) + if (self && self->client) { - if ( cmd->upmove>0 //) - && self->client->ps.groundEntityNum != ENTITYNUM_NONE ) + if (cmd->upmove>0 //) + && self->client->ps.groundEntityNum != ENTITYNUM_NONE) {//on ground, pressing jump return qtrue; } else {//just jumped? - if ( self->client->ps.groundEntityNum == ENTITYNUM_NONE + if (self->client->ps.groundEntityNum == ENTITYNUM_NONE && level.time - self->client->ps.lastOnGround <= 50//250 - && (self->client->ps.pm_flags&PMF_JUMPING) )//jumping + && (self->client->ps.pm_flags&PMF_JUMPING))//jumping {//just jumped this or last frame return qtrue; } @@ -4223,11 +4227,11 @@ qboolean G_TryingCartwheel( gentity_t *self, usercmd_t *cmd ) return qfalse; } -qboolean G_TryingSpecial( gentity_t *self, usercmd_t *cmd ) +qboolean G_TryingSpecial(gentity_t *self, usercmd_t *cmd) { - if ( g_saberNewControlScheme->integer ) + if (g_saberNewControlScheme->integer) {//use the new control scheme: force focus button - if ( (cmd->buttons&BUTTON_FORCE_FOCUS) ) + if ((cmd->buttons&BUTTON_FORCE_FOCUS)) { return qtrue; } @@ -4242,11 +4246,11 @@ qboolean G_TryingSpecial( gentity_t *self, usercmd_t *cmd ) } } -qboolean G_TryingJumpAttack( gentity_t *self, usercmd_t *cmd ) +qboolean G_TryingJumpAttack(gentity_t *self, usercmd_t *cmd) { - if ( g_saberNewControlScheme->integer ) + if (g_saberNewControlScheme->integer) {//use the new control scheme: force focus button - if ( (cmd->buttons&BUTTON_FORCE_FOCUS) ) + if ((cmd->buttons&BUTTON_FORCE_FOCUS)) { return qtrue; } @@ -4257,17 +4261,17 @@ qboolean G_TryingJumpAttack( gentity_t *self, usercmd_t *cmd ) } else {//use the old control scheme - if ( (cmd->buttons&BUTTON_ATTACK) ) + if ((cmd->buttons&BUTTON_ATTACK)) {//pressing attack - if ( cmd->upmove>0 ) + if (cmd->upmove>0) {//pressing jump return qtrue; } - else if ( self && self->client ) + else if (self && self->client) {//just jumped? - if ( self->client->ps.groundEntityNum == ENTITYNUM_NONE + if (self->client->ps.groundEntityNum == ENTITYNUM_NONE && level.time - self->client->ps.lastOnGround <= 250 - && (self->client->ps.pm_flags&PMF_JUMPING) )//jumping + && (self->client->ps.pm_flags&PMF_JUMPING))//jumping {//jumped within the last quarter second return qtrue; } @@ -4277,11 +4281,11 @@ qboolean G_TryingJumpAttack( gentity_t *self, usercmd_t *cmd ) return qfalse; } -qboolean G_TryingJumpForwardAttack( gentity_t *self, usercmd_t *cmd ) +qboolean G_TryingJumpForwardAttack(gentity_t *self, usercmd_t *cmd) { - if ( g_saberNewControlScheme->integer ) + if (g_saberNewControlScheme->integer) {//use the new control scheme: force focus button - if ( (cmd->buttons&BUTTON_FORCE_FOCUS) ) + if ((cmd->buttons&BUTTON_FORCE_FOCUS)) { return qtrue; } @@ -4292,22 +4296,22 @@ qboolean G_TryingJumpForwardAttack( gentity_t *self, usercmd_t *cmd ) } else {//use the old control scheme - if ( (cmd->buttons&BUTTON_ATTACK) ) + if ((cmd->buttons&BUTTON_ATTACK)) {//pressing attack - if ( cmd->forwardmove > 0 ) + if (cmd->forwardmove > 0) {//moving forward - if ( self && self->client ) + if (self && self->client) { - if ( cmd->upmove>0 - && self->client->ps.groundEntityNum != ENTITYNUM_NONE ) + if (cmd->upmove>0 + && self->client->ps.groundEntityNum != ENTITYNUM_NONE) {//pressing jump return qtrue; } else {//no slop on forward jumps - must be precise! - if ( self->client->ps.groundEntityNum == ENTITYNUM_NONE + if (self->client->ps.groundEntityNum == ENTITYNUM_NONE && level.time - self->client->ps.lastOnGround <= 50 - && (self->client->ps.pm_flags&PMF_JUMPING) )//jumping + && (self->client->ps.pm_flags&PMF_JUMPING))//jumping {//just jumped this or last frame return qtrue; } @@ -4319,11 +4323,11 @@ qboolean G_TryingJumpForwardAttack( gentity_t *self, usercmd_t *cmd ) return qfalse; } -qboolean G_TryingLungeAttack( gentity_t *self, usercmd_t *cmd ) +qboolean G_TryingLungeAttack(gentity_t *self, usercmd_t *cmd) { - if ( g_saberNewControlScheme->integer ) + if (g_saberNewControlScheme->integer) {//use the new control scheme: force focus button - if ( (cmd->buttons&BUTTON_FORCE_FOCUS) ) + if ((cmd->buttons&BUTTON_FORCE_FOCUS)) { return qtrue; } @@ -4334,15 +4338,15 @@ qboolean G_TryingLungeAttack( gentity_t *self, usercmd_t *cmd ) } else {//use the old control scheme - if ( (cmd->buttons&BUTTON_ATTACK) ) + if ((cmd->buttons&BUTTON_ATTACK)) {//pressing attack - if ( cmd->upmove<0 ) + if (cmd->upmove<0) {//pressing crouch return qtrue; } - else if ( self && self->client ) + else if (self && self->client) {//just unducked? - if ( (self->client->ps.pm_flags&PMF_DUCKED) ) + if ((self->client->ps.pm_flags&PMF_DUCKED)) {//just unducking return qtrue; } @@ -4354,11 +4358,11 @@ qboolean G_TryingLungeAttack( gentity_t *self, usercmd_t *cmd ) //FIXME: for these below funcs, maybe in the old control scheme some moves should still cost power... if so, pass in the saberMove and use a switch statement -qboolean G_EnoughPowerForSpecialMove( int forcePower, int cost, qboolean kataMove ) +qboolean G_EnoughPowerForSpecialMove(int forcePower, int cost, qboolean kataMove) { - if ( g_saberNewControlScheme->integer || kataMove ) + if (g_saberNewControlScheme->integer || kataMove) {//special moves cost power - if ( forcePower >= cost ) + if (forcePower >= cost) { return qtrue; } @@ -4374,24 +4378,24 @@ qboolean G_EnoughPowerForSpecialMove( int forcePower, int cost, qboolean kataMov } } -void G_DrainPowerForSpecialMove( gentity_t *self, forcePowers_t fp, int cost, qboolean kataMove ) +void G_DrainPowerForSpecialMove(gentity_t *self, forcePowers_t fp, int cost, qboolean kataMove) { - if ( !self || !self->client || self->s.number >= MAX_CLIENTS ) + if (!self || !self->client || self->s.number >= MAX_CLIENTS) { return; } - if ( g_saberNewControlScheme->integer || kataMove ) + if (g_saberNewControlScheme->integer || kataMove) {//special moves cost power - WP_ForcePowerDrain( self, fp, cost );//drain the required force power + WP_ForcePowerDrain(self, fp, cost);//drain the required force power } else {//old control scheme: uses no power, so just do it } } -int G_CostForSpecialMove( int cost, qboolean kataMove ) +int G_CostForSpecialMove(int cost, qboolean kataMove) { - if ( g_saberNewControlScheme->integer || kataMove ) + if (g_saberNewControlScheme->integer || kataMove) {//special moves cost power return cost; } @@ -4401,14 +4405,14 @@ int G_CostForSpecialMove( int cost, qboolean kataMove ) } } -extern qboolean G_EntIsBreakable( int entityNum, gentity_t *breaker ); -void WP_SaberRadiusDamage( gentity_t *ent, vec3_t point, float radius, int damage, float knockBack ) +extern qboolean G_EntIsBreakable(int entityNum, gentity_t *breaker); +void WP_SaberRadiusDamage(gentity_t *ent, vec3_t point, float radius, int damage, float knockBack) { - if ( !ent || !ent->client ) + if (!ent || !ent->client) { return; } - else if ( radius <= 0.0f || (damage <= 0 && knockBack <= 0) ) + else if (radius <= 0.0f || (damage <= 0 && knockBack <= 0)) { return; } @@ -4420,70 +4424,70 @@ void WP_SaberRadiusDamage( gentity_t *ent, vec3_t point, float radius, int damag float dist; //Setup the bbox to search in - for ( i = 0; i < 3; i++ ) + for (i = 0; i < 3; i++) { mins[i] = point[i] - radius; maxs[i] = point[i] + radius; } //Get the number of entities in a given space - numEnts = gi.EntitiesInBox( mins, maxs, radiusEnts, 128 ); + numEnts = gi.EntitiesInBox(mins, maxs, radiusEnts, 128); - for ( i = 0; i < numEnts; i++ ) + for (i = 0; i < numEnts; i++) { - if ( !radiusEnts[i]->inuse ) + if (!radiusEnts[i]->inuse) { continue; } - - if ( radiusEnts[i] == ent ) + + if (radiusEnts[i] == ent) {//Skip myself continue; } - - if ( radiusEnts[i]->client == NULL ) + + if (radiusEnts[i]->client == NULL) {//must be a client - if ( G_EntIsBreakable( radiusEnts[i]->s.number, ent ) ) + if (G_EntIsBreakable(radiusEnts[i]->s.number, ent)) {//damage breakables within range, but not as much - G_Damage( radiusEnts[i], ent, ent, vec3_origin, radiusEnts[i]->currentOrigin, 10, 0, MOD_EXPLOSIVE_SPLASH ); + G_Damage(radiusEnts[i], ent, ent, vec3_origin, radiusEnts[i]->currentOrigin, 10, 0, MOD_EXPLOSIVE_SPLASH); } continue; } - if ( (radiusEnts[i]->client->ps.eFlags&EF_HELD_BY_RANCOR) - || (radiusEnts[i]->client->ps.eFlags&EF_HELD_BY_WAMPA) ) + if ((radiusEnts[i]->client->ps.eFlags&EF_HELD_BY_RANCOR) + || (radiusEnts[i]->client->ps.eFlags&EF_HELD_BY_WAMPA)) {//can't be one being held continue; } - - VectorSubtract( radiusEnts[i]->currentOrigin, point, entDir ); - dist = VectorNormalize( entDir ); - if ( dist <= radius ) + + VectorSubtract(radiusEnts[i]->currentOrigin, point, entDir); + dist = VectorNormalize(entDir); + if (dist <= radius) {//in range - if ( damage > 0 ) + if (damage > 0) {//do damage - int points = ceil((float)damage*dist/radius); - G_Damage( radiusEnts[i], ent, ent, vec3_origin, radiusEnts[i]->currentOrigin, points, DAMAGE_NO_KNOCKBACK, MOD_EXPLOSIVE_SPLASH ); + int points = ceil((float)damage*dist / radius); + G_Damage(radiusEnts[i], ent, ent, vec3_origin, radiusEnts[i]->currentOrigin, points, DAMAGE_NO_KNOCKBACK, MOD_EXPLOSIVE_SPLASH); } - if ( knockBack > 0 ) + if (knockBack > 0) {//do knockback - if ( radiusEnts[i]->client + if (radiusEnts[i]->client && radiusEnts[i]->client->NPC_class != CLASS_RANCOR && radiusEnts[i]->client->NPC_class != CLASS_ATST - && !(radiusEnts[i]->flags&FL_NO_KNOCKBACK) )//don't throw them back + && !(radiusEnts[i]->flags&FL_NO_KNOCKBACK))//don't throw them back { - float knockbackStr = knockBack*dist/radius; + float knockbackStr = knockBack*dist / radius; entDir[2] += 0.1f; - VectorNormalize( entDir ); - G_Throw( radiusEnts[i], entDir, knockbackStr ); - if ( radiusEnts[i]->health > 0 ) + VectorNormalize(entDir); + G_Throw(radiusEnts[i], entDir, knockbackStr); + if (radiusEnts[i]->health > 0) {//still alive - if ( knockbackStr > 50 ) + if (knockbackStr > 50) {//close enough and knockback high enough to possibly knock down - if ( dist < (radius*0.5f) - || radiusEnts[i]->client->ps.groundEntityNum != ENTITYNUM_NONE ) + if (dist < (radius*0.5f) + || radiusEnts[i]->client->ps.groundEntityNum != ENTITYNUM_NONE) {//within range of my fist or within ground-shaking range and not in the air - G_Knockdown( radiusEnts[i], ent, entDir, 500, qtrue ); + G_Knockdown(radiusEnts[i], ent, entDir, 500, qtrue); } } } @@ -4497,13 +4501,13 @@ void WP_SaberRadiusDamage( gentity_t *ent, vec3_t point, float radius, int damag --------------------------------------------------------- void WP_SaberDamageTrace( gentity_t *ent, int saberNum, int bladeNum ) - Constantly trace from the old blade pos to new, down the saber beam and do damage +Constantly trace from the old blade pos to new, down the saber beam and do damage - FIXME: if the dot product of the old muzzle dir and the new muzzle dir is < 0.75, subdivide it and do multiple traces so we don't flatten out the arc! +FIXME: if the dot product of the old muzzle dir and the new muzzle dir is < 0.75, subdivide it and do multiple traces so we don't flatten out the arc! --------------------------------------------------------- */ #define MAX_SABER_SWING_INC 0.33f -void WP_SaberDamageTrace( gentity_t *ent, int saberNum, int bladeNum ) +void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) { vec3_t mp1, mp2, md1, md2, baseOld, baseNew, baseDiff, endOld, endNew, bladePointOld, bladePointNew; float tipDmgMod = 1.0f; @@ -4512,18 +4516,18 @@ void WP_SaberDamageTrace( gentity_t *ent, int saberNum, int bladeNum ) qboolean hit_wall = qfalse; qboolean brokenParry = qfalse; - for ( int ven = 0; ven < MAX_SABER_VICTIMS; ven++ ) + for (int ven = 0; ven < MAX_SABER_VICTIMS; ven++) { victimEntityNum[ven] = ENTITYNUM_NONE; } - memset( totalDmg, 0, sizeof( totalDmg) ); - memset( dmgDir, 0, sizeof( dmgDir ) ); - memset( dmgNormal, 0, sizeof( dmgNormal ) ); - memset( dmgSpot, 0, sizeof( dmgSpot ) ); - memset( dmgFraction, 0, sizeof( dmgFraction ) ); - memset( hitLoc, HL_NONE, sizeof( hitLoc ) ); - memset( hitDismemberLoc, HL_NONE, sizeof( hitDismemberLoc ) ); - memset( hitDismember, qfalse, sizeof( hitDismember ) ); + memset(totalDmg, 0, sizeof(totalDmg)); + memset(dmgDir, 0, sizeof(dmgDir)); + memset(dmgNormal, 0, sizeof(dmgNormal)); + memset(dmgSpot, 0, sizeof(dmgSpot)); + memset(dmgFraction, 0, sizeof(dmgFraction)); + memset(hitLoc, HL_NONE, sizeof(hitLoc)); + memset(hitDismemberLoc, HL_NONE, sizeof(hitDismemberLoc)); + memset(hitDismember, qfalse, sizeof(hitDismember)); numVictims = 0; VectorClear(saberHitLocation); VectorClear(saberHitNormal); @@ -4531,35 +4535,35 @@ void WP_SaberDamageTrace( gentity_t *ent, int saberNum, int bladeNum ) saberHitEntity = ENTITYNUM_NONE; sabersCrossed = -1; - if ( !ent->client ) + if (!ent->client) { return; } - if ( !ent->s.number ) + if (!ent->s.number) {//player never uses these ent->client->ps.saberEventFlags &= ~SEF_EVENTS; } - if ( ent->client->ps.saber[saberNum].blade[bladeNum].length <= 1 )//cen get down to 1 when in a wall + if (ent->client->ps.saber[saberNum].blade[bladeNum].length <= 1)//cen get down to 1 when in a wall {//saber is not on return; } - if ( VectorCompare( ent->client->renderInfo.muzzlePointOld, vec3_origin ) || VectorCompare( ent->client->renderInfo.muzzleDirOld, vec3_origin ) ) + if (VectorCompare(ent->client->renderInfo.muzzlePointOld, vec3_origin) || VectorCompare(ent->client->renderInfo.muzzleDirOld, vec3_origin)) { //just started up the saber? return; } int saberContents = 0; - if ( !(ent->client->ps.saber[saberNum].saberFlags&SFL_ON_IN_WATER) ) + if (!(ent->client->ps.saber[saberNum].saberFlags&SFL_ON_IN_WATER)) {//saber can't stay on underwater - saberContents = gi.pointcontents( ent->client->renderInfo.muzzlePoint, ent->client->ps.saberEntityNum ); + saberContents = gi.pointcontents(ent->client->renderInfo.muzzlePoint, ent->client->ps.saberEntityNum); } - if ( (saberContents&CONTENTS_WATER)|| - (saberContents&CONTENTS_SLIME)|| - (saberContents&CONTENTS_LAVA) ) + if ((saberContents&CONTENTS_WATER) || + (saberContents&CONTENTS_SLIME) || + (saberContents&CONTENTS_LAVA)) {//um... turn off? Or just set length to 1? //FIXME: short-out effect/sound? ent->client->ps.saber[saberNum].blade[bladeNum].active = qfalse; @@ -4571,8 +4575,8 @@ void WP_SaberDamageTrace( gentity_t *ent, int saberNum, int bladeNum ) if (chanceOfFizz>0 && Q_flrand(0.0f, 1.0f)client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, ent->client->ps.saber[saberNum].blade[bladeNum].length*Q_flrand(0, 1), ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, end ); - G_PlayEffect( "saber/fizz", end ); + VectorMA(ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, ent->client->ps.saber[saberNum].blade[bladeNum].length*Q_flrand(0, 1), ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, end); + G_PlayEffect("saber/fizz", end); } } @@ -4581,127 +4585,127 @@ void WP_SaberDamageTrace( gentity_t *ent, int saberNum, int bladeNum ) int entPowerLevel = 0; -if ( g_saberNewCombat->integer ) //new code start -{ - int stylePowerModifier = 0; - int stylePowerLevel = PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum); //this here should account for special moves now correctly - - /*Power level base numbers instead of being 1,2, and 3 now are doubled. And Saber Offense is the main determinant. - Saber Offense - - 1: entPowerLevel = 2 - 2: entPowerLevel = 4 - 3: entPowerLevel = 6 + if (g_saberNewCombat->integer) //new code start + { + int stylePowerModifier = 0; + int stylePowerLevel = PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum); //this here should account for special moves now correctly - So +2 is like one Offense level higher. +1 is like half of a level. Strong style gives a +2 bonus as can be seen below. + /*Power level base numbers instead of being 1,2, and 3 now are doubled. And Saber Offense is the main determinant. + Saber Offense - + 1: entPowerLevel = 2 + 2: entPowerLevel = 4 + 3: entPowerLevel = 6 - Then the style power modifier based on which saber style is used, enhancement force powers, breakParrybonuses, and whether or not you are in a transition as opposed to a slash, or a special attack should modify the power (not in that order, I have no idea what order haha) - Dusty*/ + So +2 is like one Offense level higher. +1 is like half of a level. Strong style gives a +2 bonus as can be seen below. + Then the style power modifier based on which saber style is used, enhancement force powers, breakParrybonuses, and whether or not you are in a transition as opposed to a slash, or a special attack should modify the power (not in that order, I have no idea what order haha) - Dusty*/ - switch (stylePowerLevel) // check what the saber style is and set power modifier accordingly - { - case 1: - stylePowerModifier = -2; - break; - case 2: - stylePowerModifier = -1; - break; - case 3: - stylePowerModifier = 0; - break; - case 4: - stylePowerModifier = 1; - break; - case 5: //special attacks count as this in bg_panimate - stylePowerModifier = 2; - break; - } - if (PM_SaberInTransitionAny(ent->client->ps.saberMove)) // if in a transition that still counts as attacking for stronger styles, but this is so you're not as strong quite as a regular slash - { - stylePowerLevel -= 2; - } - if (ent->client->NPC_class == CLASS_SABER_DROID) //FIXME D: saber droids do their own thing... they need to be incorporated into this system I suppose? - { - entPowerLevel = SaberDroid_PowerLevelForSaberAnim(ent); - } - else - { - entPowerLevel = (2 * ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE]) + stylePowerModifier; - } - - if (PM_SaberInSpecialAttack(ent->client->ps.saberMove)) //now for special moves - { //special moves get a 2nd boost on top of the one in bg_panimate - entPowerLevel += 2; - } - - //now for modifiers based on any enhancement powers active - if (!ent->s.number && (ent->client->ps.forcePowersActive&(1 << FP_SPEED))) - { //min power bonus is +1, max bonus is +3 - entPowerLevel += 1 * ent->client->ps.forcePowerLevel[FP_SPEED]; - } + switch (stylePowerLevel) // check what the saber style is and set power modifier accordingly + { + case 1: + stylePowerModifier = -2; + break; + case 2: + stylePowerModifier = -1; + break; + case 3: + stylePowerModifier = 0; + break; + case 4: + stylePowerModifier = 1; + break; + case 5: //special attacks count as this in bg_panimate + stylePowerModifier = 2; + break; + } - if (entPowerLevel) //this is saying, if we HAVE a power level, i.e. we are slashing not just idling then... - { - if (ent->client->ps.forceRageRecoveryTime > level.time) + if (PM_SaberInTransitionAny(ent->client->ps.saberMove)) // if in a transition that still counts as attacking for stronger styles, but this is so you're not as strong quite as a regular slash + { + stylePowerLevel -= 2; + } + if (ent->client->NPC_class == CLASS_SABER_DROID) //FIXME D: saber droids do their own thing... they need to be incorporated into this system I suppose? + { + entPowerLevel = SaberDroid_PowerLevelForSaberAnim(ent); + } + else { - entPowerLevel -= 2; + entPowerLevel = (2 * ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE]) + stylePowerModifier; } - else if (ent->client->ps.forcePowersActive & (1 << FP_RAGE)) - { //min power bonus is +2, max is +4, slightly more than Speed 3 - entPowerLevel += ent->client->ps.forcePowerLevel[FP_RAGE] + 1; + if (PM_SaberInSpecialAttack(ent->client->ps.saberMove)) //now for special moves + { //special moves get a 2nd boost on top of the one in bg_panimate + entPowerLevel += 2; + } + //now for modifiers based on any enhancement powers active + if (!ent->s.number && (ent->client->ps.forcePowersActive&(1 << FP_SPEED))) + { //min power bonus is +1, max bonus is +3 + entPowerLevel += 1 * ent->client->ps.forcePowerLevel[FP_SPEED]; } - } -} //new code end -else //Dusty, old code start. -{ - if (ent->client->NPC_class == CLASS_SABER_DROID) - { - entPowerLevel = SaberDroid_PowerLevelForSaberAnim(ent); - } - else if (!ent->s.number && (ent->client->ps.forcePowersActive&(1 << FP_SPEED))) - { - entPowerLevel = FORCE_LEVEL_3; - } - else - { - entPowerLevel = PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum); - } - if (entPowerLevel) + if (entPowerLevel) //this is saying, if we HAVE a power level, i.e. we are slashing not just idling then... + { + if (ent->client->ps.forceRageRecoveryTime > level.time) + { + entPowerLevel -= 2; + } + else if (ent->client->ps.forcePowersActive & (1 << FP_RAGE)) + { //min power bonus is +2, max is +4, slightly more than Speed 3 + + entPowerLevel += ent->client->ps.forcePowerLevel[FP_RAGE] + 1; + + } + } + } //new code end + else //Dusty, old code start. { - if (ent->client->ps.forceRageRecoveryTime > level.time) + if (ent->client->NPC_class == CLASS_SABER_DROID) { - entPowerLevel = FORCE_LEVEL_1; + entPowerLevel = SaberDroid_PowerLevelForSaberAnim(ent); } - else if (ent->client->ps.forcePowersActive & (1 << FP_RAGE)) + else if (!ent->s.number && (ent->client->ps.forcePowersActive&(1 << FP_SPEED))) { - entPowerLevel += ent->client->ps.forcePowerLevel[FP_RAGE]; + entPowerLevel = FORCE_LEVEL_3; + } + else + { + entPowerLevel = PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum); } - } -} //Dusty, old code end. - - if ( ent->client->ps.saberInFlight ) + if (entPowerLevel) + { + if (ent->client->ps.forceRageRecoveryTime > level.time) + { + entPowerLevel = FORCE_LEVEL_1; + } + else if (ent->client->ps.forcePowersActive & (1 << FP_RAGE)) + { + entPowerLevel += ent->client->ps.forcePowerLevel[FP_RAGE]; + } + + } + } //Dusty, old code end. + + if (ent->client->ps.saberInFlight) {//flying sabers are much more deadly //unless you're dead - if ( ent->health <= 0 && g_saberRealisticCombat->integer < 2 ) + if (ent->health <= 0 && g_saberRealisticCombat->integer < 2) {//so enemies don't keep trying to block it //FIXME: still do damage, just not to humanoid clients who should try to avoid it //baseDamage = 0.0f; return; } //or unless returning - else if ( ent->client->ps.saberEntityState == SES_RETURNING - && !(ent->client->ps.saber[0].saberFlags&SFL_RETURN_DAMAGE) )//type != SABER_STAR ) + else if (ent->client->ps.saberEntityState == SES_RETURNING + && !(ent->client->ps.saber[0].saberFlags&SFL_RETURN_DAMAGE))//type != SABER_STAR ) {//special case, since we're returning, chances are if we hit something //it's going to be butt-first. So do less damage. baseDamage = 0.1f; } else { - if ( !ent->s.number ) + if (!ent->s.number) {//cheat for player baseDamage = 10.0f; } @@ -4711,98 +4715,98 @@ else //Dusty, old code start. } } //Use old to current since can't predict it - VectorCopy( ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePointOld, mp1 ); - VectorCopy( ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDirOld, md1 ); - VectorCopy( ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, mp2 ); - VectorCopy( ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, md2 ); + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePointOld, mp1); + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDirOld, md1); + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, mp2); + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, md2); } else { - if ( ent->client->ps.torsoAnim == BOTH_A7_HILT ) + if (ent->client->ps.torsoAnim == BOTH_A7_HILT) {//no effects, no damage return; } - else if ( G_InCinematicSaberAnim( ent ) ) + else if (G_InCinematicSaberAnim(ent)) { baseDFlags = DAMAGE_NO_KILL; baseDamage = 0.1f; } - else if ( ent->client->ps.saberMove == LS_READY - && !PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) ) + else if (ent->client->ps.saberMove == LS_READY + && !PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) {//just do effects - if ( g_saberRealisticCombat->integer < 2 ) + if (g_saberRealisticCombat->integer < 2) {//don't kill with this hit baseDFlags = DAMAGE_NO_KILL; } - if ( (!WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT) ) - || ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT2) ) + if ((!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT)) + || (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT2)) ) {//do nothing at all when idle return; } baseDamage = 0; } - else if ( ent->client->ps.saberLockTime > level.time ) + else if (ent->client->ps.saberLockTime > level.time) {//just do effects - if ( (!WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT) ) - || ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT2) ) + if ((!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT)) + || (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT2)) ) {//do nothing at all when idle return; } baseDamage = 0; } - else if ( !WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) + else if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) && ent->client->ps.saber[saberNum].damageScale <= 0.0f - && ent->client->ps.saber[saberNum].knockbackScale <= 0.0f ) + && ent->client->ps.saber[saberNum].knockbackScale <= 0.0f) {//this blade does no damage and no knockback (only for blocking?) baseDamage = 0; } - else if ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) + else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) && ent->client->ps.saber[saberNum].damageScale2 <= 0.0f - && ent->client->ps.saber[saberNum].knockbackScale2 <= 0.0f ) + && ent->client->ps.saber[saberNum].knockbackScale2 <= 0.0f) {//this blade does no damage and no knockback (only for blocking?) baseDamage = 0; } - else if ( ent->client->ps.saberBlocked > BLOCKED_NONE - || ( !PM_SaberInAttack( ent->client->ps.saberMove ) - && !PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) - && !PM_SaberInTransitionAny( ent->client->ps.saberMove ) - ) - ) + else if (ent->client->ps.saberBlocked > BLOCKED_NONE + || (!PM_SaberInAttack(ent->client->ps.saberMove) + && !PM_SaberInSpecialAttack(ent->client->ps.torsoAnim) + && !PM_SaberInTransitionAny(ent->client->ps.saberMove) + ) + ) {//don't do damage if parrying/reflecting/bouncing/deflecting or not actually attacking or in a transition to/from/between attacks - if ( (!WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT) ) - || ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT2) ) + if ((!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT)) + || (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT2)) ) {//do nothing at all when idle return; } baseDamage = 0; } - else + else {//okay, in a saberMove that does damage //make sure we're in the right anim - if ( !PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) - && !PM_InAnimForSaberMove( ent->client->ps.torsoAnim, ent->client->ps.saberMove ) ) + if (!PM_SaberInSpecialAttack(ent->client->ps.torsoAnim) + && !PM_InAnimForSaberMove(ent->client->ps.torsoAnim, ent->client->ps.saberMove)) {//forced into some other animation somehow, like a pain or death? - if ( (!WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT) ) - || ( WP_SaberBladeUseSecondBladeStyle( &ent->client->ps.saber[saberNum], bladeNum ) - && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT2) ) + if ((!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT)) + || (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT2)) ) {//do nothing at all when idle return; } baseDamage = 0; } - else if ( ent->client->ps.weaponstate == WEAPON_FIRING && ent->client->ps.saberBlocked == BLOCKED_NONE && - ( PM_SaberInAttack(ent->client->ps.saberMove) || PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) || PM_SpinningSaberAnim(ent->client->ps.torsoAnim) || entPowerLevel > FORCE_LEVEL_2 || (WP_SaberBladeDoTransitionDamage( &ent->client->ps.saber[saberNum], bladeNum )&&PM_SaberInTransitionAny(ent->client->ps.saberMove)) ) )// || ent->client->ps.saberAnimLevel == SS_STAFF ) ) + else if (ent->client->ps.weaponstate == WEAPON_FIRING && ent->client->ps.saberBlocked == BLOCKED_NONE && + (PM_SaberInAttack(ent->client->ps.saberMove) || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim) || PM_SpinningSaberAnim(ent->client->ps.torsoAnim) || entPowerLevel > FORCE_LEVEL_2 || (WP_SaberBladeDoTransitionDamage(&ent->client->ps.saber[saberNum], bladeNum) && PM_SaberInTransitionAny(ent->client->ps.saberMove))))// || ent->client->ps.saberAnimLevel == SS_STAFF ) ) {//normal attack swing swinging/spinning (or if using strong set), do normal damage //FIXME: or if using staff? //FIXME: more damage for higher attack power levels? // More damage based on length/color of saber? @@ -4829,10 +4833,10 @@ else //Dusty, old code start. baseDamage = 2.5f; break; } - + baseDamage *= saberDmgMultiplier; } - else + else { if (g_spskill->integer > 0 && ent->s.number < MAX_CLIENTS @@ -4902,16 +4906,16 @@ else //Dusty, old code start. } } } - + } else {//saber is transitioning, defending or idle, don't do as much damage //FIXME: strong attacks and returns should do damage and be unblockable - if ( g_timescale->value < 1.0 ) + if (g_timescale->value < 1.0) {//in slow mo or force speed, we need to do damage during the transitions - if ( g_saberRealisticCombat->integer ) + if (g_saberRealisticCombat->integer) { - switch ( entPowerLevel ) + switch (entPowerLevel) { case FORCE_LEVEL_3: baseDamage = 10.0f; @@ -4937,7 +4941,7 @@ else //Dusty, old code start. /* else { - baseDamage = 0;//was 1.0f;//was 0.25 + baseDamage = 0;//was 1.0f;//was 0.25 } */ } @@ -4953,65 +4957,65 @@ else //Dusty, old code start. //VectorCopy( ent->client->renderInfo.muzzlePointNext, mp2 ); //VectorCopy( ent->client->renderInfo.muzzleDirNext, md2 ); //prediction was causing gaps in swing (G2 problem) so *don't* predict - if ( ent->client->ps.saberDamageDebounceTime > level.time ) + if (ent->client->ps.saberDamageDebounceTime > level.time) {//really only used when a saber attack start anim starts, not actually for stopping damage //we just want to not use the old position to trace the attack from... - VectorCopy( ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePointOld ); - VectorCopy( ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDirOld ); + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePointOld); + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDirOld); } //do the damage trace from the last position... - VectorCopy( ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePointOld, mp1 ); - VectorCopy( ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDirOld, md1 ); + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePointOld, mp1); + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDirOld, md1); //...to the current one. - VectorCopy( ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, mp2 ); - VectorCopy( ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, md2 ); + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, mp2); + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, md2); //NOTE: this is a test, may not be necc, as I can still swing right through someone without hitting them, somehow... //see if anyone is so close that they're within the dist from my origin to the start of the saber - if ( ent->health > 0 && !ent->client->ps.saberLockTime && saberNum == 0 && bladeNum == 0 - && !G_InCinematicSaberAnim( ent ) ) + if (ent->health > 0 && !ent->client->ps.saberLockTime && saberNum == 0 && bladeNum == 0 + && !G_InCinematicSaberAnim(ent)) {//only do once - for first blade trace_t trace; - gi.trace( &trace, ent->currentOrigin, vec3_origin, vec3_origin, mp1, ent->s.number, (MASK_SHOT&~(CONTENTS_CORPSE|CONTENTS_ITEM)), (EG2_Collision)0, 0 ); - if ( trace.entityNum < ENTITYNUM_WORLD && (trace.entityNum > 0||ent->client->NPC_class == CLASS_DESANN) )//NPCs don't push player away, unless it's Desann + gi.trace(&trace, ent->currentOrigin, vec3_origin, vec3_origin, mp1, ent->s.number, (MASK_SHOT&~(CONTENTS_CORPSE | CONTENTS_ITEM)), (EG2_Collision)0, 0); + if (trace.entityNum < ENTITYNUM_WORLD && (trace.entityNum > 0 || ent->client->NPC_class == CLASS_DESANN))//NPCs don't push player away, unless it's Desann {//a valid ent gentity_t *traceEnt = &g_entities[trace.entityNum]; - if ( traceEnt - && traceEnt->client + if (traceEnt + && traceEnt->client && traceEnt->client->NPC_class != CLASS_RANCOR && traceEnt->client->NPC_class != CLASS_ATST && traceEnt->client->NPC_class != CLASS_WAMPA && traceEnt->client->NPC_class != CLASS_SAND_CREATURE - && traceEnt->health > 0 - && traceEnt->client->playerTeam != ent->client->playerTeam - && !PM_SuperBreakLoseAnim( traceEnt->client->ps.legsAnim ) - && !PM_SuperBreakLoseAnim( traceEnt->client->ps.torsoAnim ) - && !PM_SuperBreakWinAnim( traceEnt->client->ps.legsAnim ) - && !PM_SuperBreakWinAnim( traceEnt->client->ps.torsoAnim ) - && !PM_InKnockDown( &traceEnt->client->ps ) - && !PM_LockedAnim( traceEnt->client->ps.legsAnim ) - && !PM_LockedAnim( traceEnt->client->ps.torsoAnim ) - && !G_InCinematicSaberAnim( traceEnt )) + && traceEnt->health > 0 + && traceEnt->client->playerTeam != ent->client->playerTeam + && !PM_SuperBreakLoseAnim(traceEnt->client->ps.legsAnim) + && !PM_SuperBreakLoseAnim(traceEnt->client->ps.torsoAnim) + && !PM_SuperBreakWinAnim(traceEnt->client->ps.legsAnim) + && !PM_SuperBreakWinAnim(traceEnt->client->ps.torsoAnim) + && !PM_InKnockDown(&traceEnt->client->ps) + && !PM_LockedAnim(traceEnt->client->ps.legsAnim) + && !PM_LockedAnim(traceEnt->client->ps.torsoAnim) + && !G_InCinematicSaberAnim(traceEnt)) {//enemy client, push them away - if ( !traceEnt->client->ps.saberLockTime + if (!traceEnt->client->ps.saberLockTime && !traceEnt->message && !(traceEnt->flags&FL_NO_KNOCKBACK) - && (!traceEnt->NPC||traceEnt->NPC->jumpState!=JS_JUMPING) ) + && (!traceEnt->NPC || traceEnt->NPC->jumpState != JS_JUMPING)) {//don't push people in saberlock or with security keys or who are in BS_JUMP vec3_t hitDir; - VectorSubtract( trace.endpos, ent->currentOrigin, hitDir ); - float totalDist = Distance( mp1, ent->currentOrigin ); - float knockback = (totalDist-VectorNormalize( hitDir ))/totalDist * 200.0f; + VectorSubtract(trace.endpos, ent->currentOrigin, hitDir); + float totalDist = Distance(mp1, ent->currentOrigin); + float knockback = (totalDist - VectorNormalize(hitDir)) / totalDist * 200.0f; hitDir[2] = 0; //FIXME: do we need to call G_Throw? Seems unfair to put actual knockback on them, stops the attack //G_Throw( traceEnt, hitDir, knockback ); - VectorMA( traceEnt->client->ps.velocity, knockback, hitDir, traceEnt->client->ps.velocity ); + VectorMA(traceEnt->client->ps.velocity, knockback, hitDir, traceEnt->client->ps.velocity); traceEnt->client->ps.pm_time = 200; traceEnt->client->ps.pm_flags |= PMF_TIME_NOFRICTION; #ifndef FINAL_BUILD - if ( d_saberCombat->integer ) + if (d_saberCombat->integer) { - gi.Printf( "%s pushing away %s at %s\n", ent->NPC_type, traceEnt->NPC_type, vtos( traceEnt->client->ps.velocity ) ); + gi.Printf("%s pushing away %s at %s\n", ent->NPC_type, traceEnt->NPC_type, vtos(traceEnt->client->ps.velocity)); } #endif } @@ -5021,48 +5025,48 @@ else //Dusty, old code start. } //the thicker the blade, the more damage... the thinner, the less damage - baseDamage *= ent->client->ps.saber[saberNum].blade[bladeNum].radius/SABER_RADIUS_STANDARD; + baseDamage *= ent->client->ps.saber[saberNum].blade[bladeNum].radius / SABER_RADIUS_STANDARD; - if ( g_saberRealisticCombat->integer > 1 ) + if (g_saberRealisticCombat->integer > 1) {//always do damage, and lots of it - if ( g_saberRealisticCombat->integer > 2 ) + if (g_saberRealisticCombat->integer > 2) {//always do damage, and lots of it baseDamage = 25.0f; } - else if ( baseDamage > 0.1f ) + else if (baseDamage > 0.1f) {//only do super damage if we would have done damage according to normal rules baseDamage = 25.0f; } } - else if ( ((!ent->s.number&&ent->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1<value < 1.0f ) + else if (((!ent->s.number&&ent->client->ps.forcePowersActive&(1 << FP_SPEED)) || ent->client->ps.forcePowersActive&(1 << FP_RAGE)) + && g_timescale->value < 1.0f) { - baseDamage *= (1.0f-g_timescale->value); + baseDamage *= (1.0f - g_timescale->value); } - if ( baseDamage > 0.1f ) + if (baseDamage > 0.1f) { - if ( (ent->client->ps.forcePowersActive&(1<client->ps.forcePowersActive&(1 << FP_RAGE))) {//add some damage if raged baseDamage += ent->client->ps.forcePowerLevel[FP_RAGE] * 5.0f; } - else if ( ent->client->ps.forceRageRecoveryTime ) + else if (ent->client->ps.forceRageRecoveryTime) {//halve it if recovering baseDamage *= 0.5f; } } // Get the old state of the blade - VectorCopy( mp1, baseOld ); - VectorMA( baseOld, ent->client->ps.saber[saberNum].blade[bladeNum].length, md1, endOld ); + VectorCopy(mp1, baseOld); + VectorMA(baseOld, ent->client->ps.saber[saberNum].blade[bladeNum].length, md1, endOld); // Get the future state of the blade - VectorCopy( mp2, baseNew ); - VectorMA( baseNew, ent->client->ps.saber[saberNum].blade[bladeNum].length, md2, endNew ); + VectorCopy(mp2, baseNew); + VectorMA(baseNew, ent->client->ps.saber[saberNum].blade[bladeNum].length, md2, endNew); sabersCrossed = -1; - if ( VectorCompare2( baseOld, baseNew ) && VectorCompare2( endOld, endNew ) ) + if (VectorCompare2(baseOld, baseNew) && VectorCompare2(endOld, endNew)) { - hit_wall = WP_SaberDamageForTrace( ent->s.number, mp2, endNew, baseDamage*4, md2, + hit_wall = WP_SaberDamageForTrace(ent->s.number, mp2, endNew, baseDamage * 4, md2, qfalse, entPowerLevel, ent->client->ps.saber[saberNum].type, qfalse, - saberNum, bladeNum ); + saberNum, bladeNum); } else { @@ -5070,46 +5074,46 @@ else //Dusty, old code start. vec3_t ma1, ma2, md2ang, curBase1, curBase2; int xx; //do the trace at the base first - hit_wall = WP_SaberDamageForTrace( ent->s.number, baseOld, baseNew, baseDamage, md2, + hit_wall = WP_SaberDamageForTrace(ent->s.number, baseOld, baseNew, baseDamage, md2, qfalse, entPowerLevel, ent->client->ps.saber[saberNum].type, qtrue, - saberNum, bladeNum ); - + saberNum, bladeNum); + //if hit a saber, shorten rest of traces to match - if ( saberHitFraction < 1.0 ) + if (saberHitFraction < 1.0) { //adjust muzzleDir... vec3_t ma1, ma2; - vectoangles( md1, ma1 ); - vectoangles( md2, ma2 ); - for ( xx = 0; xx < 3; xx++ ) + vectoangles(md1, ma1); + vectoangles(md2, ma2); + for (xx = 0; xx < 3; xx++) { - md2ang[xx] = LerpAngle( ma1[xx], ma2[xx], saberHitFraction ); + md2ang[xx] = LerpAngle(ma1[xx], ma2[xx], saberHitFraction); } - AngleVectors( md2ang, md2, NULL, NULL ); + AngleVectors(md2ang, md2, NULL, NULL); //shorten the base pos - VectorSubtract( mp2, mp1, baseDiff ); - VectorMA( mp1, saberHitFraction, baseDiff, baseNew ); - VectorMA( baseNew, ent->client->ps.saber[saberNum].blade[bladeNum].length, md2, endNew ); + VectorSubtract(mp2, mp1, baseDiff); + VectorMA(mp1, saberHitFraction, baseDiff, baseNew); + VectorMA(baseNew, ent->client->ps.saber[saberNum].blade[bladeNum].length, md2, endNew); } //If the angle diff in the blade is high, need to do it in chunks of 33 to avoid flattening of the arc float dirInc, curDirFrac; - if ( PM_SaberInAttack( ent->client->ps.saberMove ) - || PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) - || PM_SpinningSaberAnim( ent->client->ps.torsoAnim ) - || PM_InSpecialJump( ent->client->ps.torsoAnim ) - || (g_timescale->value<1.0f&&PM_SaberInTransitionAny( ent->client->ps.saberMove )) ) + if (PM_SaberInAttack(ent->client->ps.saberMove) + || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim) + || PM_SpinningSaberAnim(ent->client->ps.torsoAnim) + || PM_InSpecialJump(ent->client->ps.torsoAnim) + || (g_timescale->value<1.0f&&PM_SaberInTransitionAny(ent->client->ps.saberMove))) { - curDirFrac = DotProduct( md1, md2 ); + curDirFrac = DotProduct(md1, md2); } else { curDirFrac = 1.0f; } //NOTE: if saber spun at least 180 degrees since last damage trace, this is not reliable...! - if ( fabs(curDirFrac) < 1.0f - MAX_SABER_SWING_INC ) + if (fabs(curDirFrac) < 1.0f - MAX_SABER_SWING_INC) {//the saber blade spun more than 33 degrees since the last damage trace - curDirFrac = dirInc = 1.0f/((1.0f - curDirFrac)/MAX_SABER_SWING_INC); + curDirFrac = dirInc = 1.0f / ((1.0f - curDirFrac) / MAX_SABER_SWING_INC); } else { @@ -5118,62 +5122,62 @@ else //Dusty, old code start. } qboolean hit_saber = qfalse; - vectoangles( md1, ma1 ); - vectoangles( md2, ma2 ); + vectoangles(md1, ma1); + vectoangles(md2, ma2); vec3_t curMD1, curMD2;//, mdDiff, dirDiff; //VectorSubtract( md2, md1, mdDiff ); - VectorCopy( md1, curMD2 ); - VectorCopy( baseOld, curBase2 ); + VectorCopy(md1, curMD2); + VectorCopy(baseOld, curBase2); - while ( 1 ) + while (1) { - VectorCopy( curMD2, curMD1 ); - VectorCopy( curBase2, curBase1 ); - if ( curDirFrac >= 1.0f ) + VectorCopy(curMD2, curMD1); + VectorCopy(curBase2, curBase1); + if (curDirFrac >= 1.0f) { - VectorCopy( md2, curMD2 ); - VectorCopy( baseNew, curBase2 ); + VectorCopy(md2, curMD2); + VectorCopy(baseNew, curBase2); } else { - for ( xx = 0; xx < 3; xx++ ) + for (xx = 0; xx < 3; xx++) { - md2ang[xx] = LerpAngle( ma1[xx], ma2[xx], curDirFrac ); + md2ang[xx] = LerpAngle(ma1[xx], ma2[xx], curDirFrac); } - AngleVectors( md2ang, curMD2, NULL, NULL ); + AngleVectors(md2ang, curMD2, NULL, NULL); //VectorMA( md1, curDirFrac, mdDiff, curMD2 ); - VectorSubtract( baseNew, baseOld, baseDiff ); - VectorMA( baseOld, curDirFrac, baseDiff, curBase2 ); + VectorSubtract(baseNew, baseOld, baseDiff); + VectorMA(baseOld, curDirFrac, baseDiff, curBase2); } // Move up the blade in intervals of stepsize - for ( step = stepsize; step < ent->client->ps.saber[saberNum].blade[bladeNum].length && step < ent->client->ps.saber[saberNum].blade[bladeNum].lengthOld; step+=12 ) + for (step = stepsize; step < ent->client->ps.saber[saberNum].blade[bladeNum].length && step < ent->client->ps.saber[saberNum].blade[bladeNum].lengthOld; step += 12) { - VectorMA( curBase1, step, curMD1, bladePointOld ); - VectorMA( curBase2, step, curMD2, bladePointNew ); - if ( WP_SaberDamageForTrace( ent->s.number, bladePointOld, bladePointNew, baseDamage, curMD2, + VectorMA(curBase1, step, curMD1, bladePointOld); + VectorMA(curBase2, step, curMD2, bladePointNew); + if (WP_SaberDamageForTrace(ent->s.number, bladePointOld, bladePointNew, baseDamage, curMD2, qfalse, entPowerLevel, ent->client->ps.saber[saberNum].type, qtrue, - saberNum, bladeNum ) ) + saberNum, bladeNum)) { hit_wall = qtrue; } //if hit a saber, shorten rest of traces to match - if ( saberHitFraction < 1.0 ) + if (saberHitFraction < 1.0) { //adjust muzzle endpoint - VectorSubtract( mp2, mp1, baseDiff ); - VectorMA( mp1, saberHitFraction, baseDiff, baseNew ); - VectorMA( baseNew, ent->client->ps.saber[saberNum].blade[bladeNum].length, curMD2, endNew ); + VectorSubtract(mp2, mp1, baseDiff); + VectorMA(mp1, saberHitFraction, baseDiff, baseNew); + VectorMA(baseNew, ent->client->ps.saber[saberNum].blade[bladeNum].length, curMD2, endNew); //adjust muzzleDir... vec3_t curMA1, curMA2; - vectoangles( curMD1, curMA1 ); - vectoangles( curMD2, curMA2 ); - for ( xx = 0; xx < 3; xx++ ) + vectoangles(curMD1, curMA1); + vectoangles(curMD2, curMA2); + for (xx = 0; xx < 3; xx++) { - md2ang[xx] = LerpAngle( curMA1[xx], curMA2[xx], saberHitFraction ); + md2ang[xx] = LerpAngle(curMA1[xx], curMA2[xx], saberHitFraction); } - AngleVectors( md2ang, curMD2, NULL, NULL ); + AngleVectors(md2ang, curMD2, NULL, NULL); /* VectorSubtract( curMD2, curMD1, dirDiff ); VectorMA( curMD1, saberHitFraction, dirDiff, curMD2 ); @@ -5185,18 +5189,18 @@ else //Dusty, old code start. break; } } - if ( hit_wall || hit_saber ) + if (hit_wall || hit_saber) { break; } - if ( curDirFrac >= 1.0f ) + if (curDirFrac >= 1.0f) { break; } else { curDirFrac += dirInc; - if ( curDirFrac >= 1.0f ) + if (curDirFrac >= 1.0f) { curDirFrac = 1.0f; } @@ -5205,21 +5209,21 @@ else //Dusty, old code start. //do the trace at the end last //Special check- adjust for length of blade not being a multiple of 12 - aveLength = (ent->client->ps.saber[saberNum].blade[bladeNum].lengthOld + ent->client->ps.saber[saberNum].blade[bladeNum].length)/2; - if ( step > aveLength ) + aveLength = (ent->client->ps.saber[saberNum].blade[bladeNum].lengthOld + ent->client->ps.saber[saberNum].blade[bladeNum].length) / 2; + if (step > aveLength) {//less dmg if the last interval was not stepsize - tipDmgMod = (stepsize-(step-aveLength))/stepsize; + tipDmgMod = (stepsize - (step - aveLength)) / stepsize; } //NOTE: since this is the tip, we do not extrapolate the extra 16 - if ( WP_SaberDamageForTrace( ent->s.number, endOld, endNew, tipDmgMod*baseDamage, md2, + if (WP_SaberDamageForTrace(ent->s.number, endOld, endNew, tipDmgMod*baseDamage, md2, qfalse, entPowerLevel, ent->client->ps.saber[saberNum].type, qfalse, - saberNum, bladeNum ) ) + saberNum, bladeNum)) { hit_wall = qtrue; } } - if ( (saberHitFraction < 1.0f||(sabersCrossed>=0&&sabersCrossed<=32.0f)) && (ent->client->ps.weaponstate == WEAPON_FIRING || ent->client->ps.saberInFlight || G_InCinematicSaberAnim( ent ) ) ) + if ((saberHitFraction < 1.0f || (sabersCrossed >= 0 && sabersCrossed <= 32.0f)) && (ent->client->ps.weaponstate == WEAPON_FIRING || ent->client->ps.saberInFlight || G_InCinematicSaberAnim(ent))) {// The saber (in-hand) hit another saber, mano. qboolean inFlightSaberBlocked = qfalse; qboolean collisionResolved = qfalse; @@ -5229,60 +5233,60 @@ else //Dusty, old code start. gentity_t *hitOwner = NULL; int hitOwnerPowerLevel = FORCE_LEVEL_0; - -if ( g_saberNewCombat->integer ) //Dusty, new code start. -{ - if ( hitEnt ) + + if (g_saberNewCombat->integer) //Dusty, new code start. { - hitOwner = hitEnt->owner; + if (hitEnt) + { + hitOwner = hitEnt->owner; + } + if (hitOwner && hitOwner->client) + { + hitOwnerPowerLevel = 2 * hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; + hitOwner->breakLimit = hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; + } } - if ( hitOwner && hitOwner->client ) + else { - hitOwnerPowerLevel = 2 * hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; - hitOwner->breakLimit = hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; + if (hitEnt) + { + hitOwner = hitEnt->owner; + } + if (hitOwner && hitOwner->client) + { + hitOwnerPowerLevel = PM_PowerLevelForSaberAnim(&hitOwner->client->ps); + } } -} -else -{ - if ( hitEnt ) - { - hitOwner = hitEnt->owner; + //Dusty, code end. + + /* //old crud here + if ( entPowerLevel >= FORCE_LEVEL_3 + && PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) ) + {//a special "unblockable" attack + if ( hitOwner->client->NPC_class == CLASS_ALORA + || hitOwner->client->NPC_class == CLASS_SHADOWTROOPER + || (hitOwner->NPC&&(hitOwner->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) ) + {//these masters can even block unblockables (stops cheap kills) + entPowerLevel = FORCE_LEVEL_2; } - if ( hitOwner && hitOwner->client ) - { - hitOwnerPowerLevel = PM_PowerLevelForSaberAnim( &hitOwner->client->ps ); } -} - //Dusty, code end. + */ - /* //old crud here - if ( entPowerLevel >= FORCE_LEVEL_3 - && PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) ) - {//a special "unblockable" attack - if ( hitOwner->client->NPC_class == CLASS_ALORA - || hitOwner->client->NPC_class == CLASS_SHADOWTROOPER - || (hitOwner->NPC&&(hitOwner->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) ) - {//these masters can even block unblockables (stops cheap kills) - entPowerLevel = FORCE_LEVEL_2; - } - } - */ - //FIXME: check for certain anims, facing, etc, to make them lock into a sabers-locked pose //SEF_LOCKED - if ( ent->client->ps.saberInFlight && saberNum == 0 && - ent->client->ps.saber[saberNum].blade[bladeNum].active && + if (ent->client->ps.saberInFlight && saberNum == 0 && + ent->client->ps.saber[saberNum].blade[bladeNum].active && ent->client->ps.saberEntityNum != ENTITYNUM_NONE && - ent->client->ps.saberEntityState != SES_RETURNING ) + ent->client->ps.saberEntityState != SES_RETURNING) {//saber was blocked, return it inFlightSaberBlocked = qtrue; } - if ( g_saberNewCombat->integer ) + if (g_saberNewCombat->integer) { //new code start - + //hitOwner BreakCounter, BreakLimit, RecoveryInterval, RecoveryTime //how many strong attacks (where saber offense + saber style modifier total power is greater than defender's defense strength) can be deflected before defender gets tired and his defense breaks, saber defense 1 is 1 hit, 2 is 2 hits, etc. @@ -5336,17 +5340,17 @@ else } /*if (ent->client->ps.torsoAnim == BOTH_A1_SPECIAL - || ent->client->ps.torsoAnim == BOTH_A2_SPECIAL - || ent->client->ps.torsoAnim == BOTH_A3_SPECIAL) + || ent->client->ps.torsoAnim == BOTH_A2_SPECIAL + || ent->client->ps.torsoAnim == BOTH_A3_SPECIAL) {//parry/block/break-parry bonus for single-style kata moves - entPowerLevel += 2; + entPowerLevel += 2; }*/ if (entAttacking) //I'm removing all two-handed power bonuses, now it's purely for force power stuff - Dusty {//add twoHanded bonus and breakParryBonus to entPowerLevel here //This makes staff too powerful /*if ((ent->client->ps.saber[saberNum].saberFlags&SFL_TWO_HANDED)) { - entPowerLevel++; + entPowerLevel++; }*/ //FIXME: what if dualSabers && both sabers are hitting at same time? if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum)) @@ -5361,9 +5365,9 @@ else else if (entDefending) {//add twoHanded bonus and dualSaber bonus and parryBonus to entPowerLevel here /*if ((ent->client->ps.saber[saberNum].saberFlags&SFL_TWO_HANDED) - || (ent->client->ps.dualSabers && ent->client->ps.saber[1].Active())) + || (ent->client->ps.dualSabers && ent->client->ps.saber[1].Active())) { - entPowerLevel++; + entPowerLevel++; }*/ //FIXME: what about second saber if dualSabers? entPowerLevel += ent->client->ps.saber[saberNum].parryBonus; @@ -5387,16 +5391,16 @@ else } /*if (hitOwner->client->ps.torsoAnim == BOTH_A1_SPECIAL - || hitOwner->client->ps.torsoAnim == BOTH_A2_SPECIAL - || hitOwner->client->ps.torsoAnim == BOTH_A3_SPECIAL) + || hitOwner->client->ps.torsoAnim == BOTH_A2_SPECIAL + || hitOwner->client->ps.torsoAnim == BOTH_A3_SPECIAL) {//parry/block/break-parry bonus for single-style kata moves - hitOwnerPowerLevel += 2; + hitOwnerPowerLevel += 2; }*/ if (hitOwnerAttacking) {//add twoHanded bonus and breakParryBonus to entPowerLevel here /*if ((hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED)) { - hitOwnerPowerLevel++; + hitOwnerPowerLevel++; }*/ hitOwnerPowerLevel += hitOwner->client->ps.saber[0].breakParryBonus; if (hitOwner->client->ps.dualSabers && Q_irand(0, 1)) @@ -5408,9 +5412,9 @@ else else if (hitOwnerDefending) {//add twoHanded bonus and dualSaber bonus and parryBonus to entPowerLevel here /*if ((hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED) - || (hitOwner->client->ps.dualSabers && hitOwner->client->ps.saber[1].Active())) + || (hitOwner->client->ps.dualSabers && hitOwner->client->ps.saber[1].Active())) { - hitOwnerPowerLevel++; + hitOwnerPowerLevel++; }*/ hitOwnerPowerLevel += hitOwner->client->ps.saber[0].parryBonus; if (hitOwner->client->ps.dualSabers && Q_irand(0, 1)) @@ -5427,13 +5431,13 @@ else {//don't mess with this collisionResolved = qtrue; } - else if ( g_saberLocksEnabled->integer + else if (g_saberLocksEnabled->integer && entAttacking && hitOwnerAttacking && !Q_irand(0, g_saberLockRandomNess->integer) && (g_debugSaberLock->integer || forceLock || entPowerLevel == hitOwnerPowerLevel - || (entPowerLevel > 6 && hitOwnerPowerLevel > 6) + || (entPowerLevel > 6 && hitOwnerPowerLevel > 6) //more chance when both are using SO 3 and strong attacks || (ent->client->ps.saberAnimLevel < 5 && hitOwner->client->ps.saberAnimLevel < 5 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && Q_irand(0, 3)) || (ent->client->ps.saberAnimLevel < 3 && hitOwner->client->ps.saberAnimLevel < 5 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && Q_irand(0, 2)) @@ -5443,7 +5447,7 @@ else { collisionResolved = qtrue; } - else if ( g_saberLocksEnabled->integer + else if (g_saberLocksEnabled->integer && hitOwnerAttacking && entDefending && !Q_irand(0, g_saberLockRandomNess->integer * 3) @@ -5459,7 +5463,7 @@ else else if (entAttacking && hitOwnerDefending) {//I'm attacking hit, they're parrying qboolean activeDefense = (hitOwner->s.number || g_saberAutoBlocking->integer || hitOwner->client->ps.saberBlockingTime > level.time); - if ( g_saberLocksEnabled->integer + if (g_saberLocksEnabled->integer && !Q_irand(0, g_saberLockRandomNess->integer * 3) && activeDefense && (g_debugSaberLock->integer || forceLock || @@ -5533,8 +5537,8 @@ else || (hitOwner->breakCounter > hitOwner->breakLimit //too tired to defend strong attacks && hitOwnerPowerLevel < entPowerLevel) || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim))//they are defending, but their defense strength is lower than my attack... - //or they are doing a special which has slightly - //different rules + //or they are doing a special which has slightly + //different rules /*|| (!deflected && Q_irand(0, PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]PM_PowerLevelForSaberAnim( &hitOwner->client->ps )) > 0))*/ //^um what does that do anyway? Just add randomness? {//broke their parry altogether @@ -5681,7 +5685,7 @@ else if (PM_SaberInAttack(ent->client->ps.saberMove) || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim) || (entPowerLevel > FORCE_LEVEL_2&&!PM_SaberInIdle(ent->client->ps.saberMove) && !PM_SaberInParry(ent->client->ps.saberMove) && !PM_SaberInReflect(ent->client->ps.saberMove))) {//in the middle of attacking - if ((ent->client->ps.saberAnimLevel == SS_STRONG + if ((ent->client->ps.saberAnimLevel == SS_STRONG || ent->client->ps.saberAnimLevel == SS_DESANN) && hitOwner->health > 0) {//don't deflect/bounce in strong attack or when enemy is dead @@ -6237,7 +6241,7 @@ else */ } } //old code end - + if (saberHitFraction < 1.0f || collisionResolved) {//either actually hit or locked @@ -11879,7 +11883,7 @@ void ForceLightning(gentity_t *self) void ForceLightningDamage(gentity_t *self, gentity_t *traceEnt, vec3_t dir, float dist, float dot, vec3_t impactPoint) { - + qboolean blockedWithSaber = qfalse; qboolean blockedWithHand = qfalse; @@ -12053,15 +12057,15 @@ void ForceLightningDamage(gentity_t *self, gentity_t *traceEnt, vec3_t dir, floa traceEnt->client->ps.powerups[PW_SHOCKED] = 0; vec3_t end, fwd, right, up; VectorNegate(dir, fwd); - + //randomise direction a bit MakeNormalVectors(fwd, right, up); VectorMA(fwd, random(), right, fwd); VectorMA(fwd, random(), up, fwd); VectorNormalize(fwd); - - VectorMA( traceEnt->client->ps.saber[0].blade[0].muzzlePoint, traceEnt->client->ps.saber[0].blade[0].length*Q_flrand(0, 1), traceEnt->client->ps.saber[0].blade[0].muzzleDir, end );//FIXME: pick a random blade? - G_PlayEffect( G_EffectIndex("force/lightning"), end, fwd); + + VectorMA(traceEnt->client->ps.saber[0].blade[0].muzzlePoint, traceEnt->client->ps.saber[0].blade[0].length*Q_flrand(0, 1), traceEnt->client->ps.saber[0].blade[0].muzzleDir, end);//FIXME: pick a random blade? + G_PlayEffect(G_EffectIndex("force/lightning"), end, fwd); } else if (blockedWithHand) { @@ -12719,7 +12723,7 @@ qboolean WP_CheckForceDraineeStopMe(gentity_t *self, gentity_t *drainee) && level.time - (self->client->ps.forcePowerDebounce[FP_DRAIN]>self->client->ps.forcePowerLevel[FP_DRAIN] * 500)//at level 1, I always get at least 500ms of drain, at level 3 I get 1500ms && !Q_irand(0, 100 - (drainee->NPC->stats.evasion * 10) - (g_spskill->integer * 12))) {//a jedi who broke free - + ForceThrow(drainee, qfalse); //FIXME: I need to go into some pushed back anim... WP_ForcePowerStop(self, FP_DRAIN); @@ -14511,7 +14515,7 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ && !Q_irand(0, 100 - (gripEnt->NPC->stats.evasion * 8) - (g_spskill->integer * 20))) {//a jedi who broke free FIXME: maybe have some minimum grip length- a reaction time? WP_ForceForceThrow(gripEnt); - + if (gripEnt->NPC->rank >= RANK_COMMANDER //saber reactivation AI here. || (gripEnt->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) { //tough guys reactivate their saber faster after being gripped @@ -14523,9 +14527,9 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ } /*else { - gripEnt->saberReactivateTime = level.time + (2000 + Q_irand(0, 1000)); + gripEnt->saberReactivateTime = level.time + (2000 + Q_irand(0, 1000)); }*/ - + //FIXME: I need to go into some pushed back anim... WP_ForcePowerStop(self, FP_GRIP); return; @@ -14966,7 +14970,7 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ {//a jedi who broke free FIXME: maybe have some minimum grip length- a reaction time? WP_ForceForceThrow(drainEnt); //FIXME: I need to go into some pushed back anim... - + //saber reactivate time - same rules as for Grip if (drainEnt->NPC->rank >= RANK_COMMANDER || (drainEnt->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) @@ -14979,9 +14983,9 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ } /*else { - drainEnt->saberReactivateTime = level.time + (2000 + Q_irand(0, 1000)); + drainEnt->saberReactivateTime = level.time + (2000 + Q_irand(0, 1000)); }*/ - + WP_ForcePowerStop(self, FP_DRAIN); //can't drain again for 2 seconds self->client->ps.forcePowerDebounce[FP_DRAIN] = level.time + 4000; @@ -15388,7 +15392,7 @@ void WP_InitForcePowers(gentity_t *ent) ent->client->ps.forcePowerRegenRate = 100; } ent->client->ps.forcePower = ent->client->ps.forcePowerMax; - ent->client->ps.forcePowerRegenDebounceTime = 0; + ent->client->ps.forcePowerRegenDebounceTime = level.time; ent->client->ps.forceGripEntityNum = ent->client->ps.forceDrainEntityNum = ent->client->ps.pullAttackEntNum = ENTITYNUM_NONE; ent->client->ps.forceRageRecoveryTime = 0; From 2cfd236c5e4414ee489e556247cdbb9cbdd466ea Mon Sep 17 00:00:00 2001 From: dusty22 Date: Wed, 8 Jul 2015 15:35:15 -0400 Subject: [PATCH 011/445] Game version is "Dusty's Patch" instead of "OpenJK" --- code/game/g_local.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/g_local.h b/code/game/g_local.h index 0b6ea6e3f8..11f94d9211 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -37,7 +37,7 @@ along with this program; if not, see . //================================================================== // the "gameversion" client command will print this plus compile date -#define GAMEVERSION "OpenJK" +#define GAMEVERSION "Dusty's Patch" #define BODY_QUEUE_SIZE 8 From 61f46f5558b33588e87aba80680b26f22d54d45e Mon Sep 17 00:00:00 2001 From: Dusty Date: Wed, 5 Aug 2015 12:05:36 -0400 Subject: [PATCH 012/445] Compile-allowing fixes, game version changes - fixed some missing/erroneous code in client.h that was causing compile errors - changed game version and client windows to say DP or Dusty's Patch --- code/client/client.h | 4 ++-- code/qcommon/q_shared.h | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/client/client.h b/code/client/client.h index 5e8ea6628a..5f06ec872b 100644 --- a/code/client/client.h +++ b/code/client/client.h @@ -272,9 +272,8 @@ extern cvar_t *m_filter; extern cvar_t *cl_activeAction; -#ifndef _WIN32 extern cvar_t *cl_consoleKeys; -#endif + //================================================= @@ -400,6 +399,7 @@ void CIN_CloseAllVideos(void); void CL_InitCGame( void ); void CL_ShutdownCGame( void ); qboolean CL_GameCommand( void ); +qboolean CL_InitCGameVM(void *gameLibrary); void CL_CGameRendering( stereoFrame_t stereo ); void CL_SetCGameTime( void ); void CL_FirstSnapshot( void ); diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 455f9e6980..53daa9bc56 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -67,17 +67,17 @@ along with this program; if not, see . #define HOMEPATH_NAME_WIN "OpenJO" #define HOMEPATH_NAME_MACOSX HOMEPATH_NAME_WIN #else -#define PRODUCT_NAME "openjk_sp" +#define PRODUCT_NAME "dp_sp" -#define CLIENT_WINDOW_TITLE "OpenJK (SP)" -#define CLIENT_CONSOLE_TITLE "OpenJK Console (SP)" -#define HOMEPATH_NAME_UNIX "openjk" -#define HOMEPATH_NAME_WIN "OpenJK" +#define CLIENT_WINDOW_TITLE "Dusty's Patch" +#define CLIENT_CONSOLE_TITLE "DP Console" +#define HOMEPATH_NAME_UNIX "dp" +#define HOMEPATH_NAME_WIN "Dusty's Patch" #define HOMEPATH_NAME_MACOSX HOMEPATH_NAME_WIN #endif #define BASEGAME "base" -#define OPENJKGAME "OpenJK" +#define OPENJKGAME "Dusty's Patch" #define Q3CONFIG_NAME PRODUCT_NAME ".cfg" From 4622e700436bc2b9773128b51b2151cf8e9427c5 Mon Sep 17 00:00:00 2001 From: dusty22 Date: Wed, 12 Aug 2015 14:26:39 -0400 Subject: [PATCH 013/445] Cvar fix g_saberDamageScale works now and controls saber damage. To-Do: Fix saber throw/kick use button toggle functionality, fix g_autoRoll --- code/game/wp_saber.cpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index d65a5d5e84..5201da1028 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -1341,6 +1341,7 @@ qboolean WP_SaberApplyDamage(gentity_t *ent, float baseDamage, int baseDFlags, gentity_t *victim; int dFlags = baseDFlags; float maxDmg; + float saberDmgMultiplier = g_saberDamageScale->value; saberType_t saberType = ent->client->ps.saber[saberNum].type; if (!numVictims) @@ -1642,14 +1643,14 @@ qboolean WP_SaberApplyDamage(gentity_t *ent, float baseDamage, int baseDFlags, } int damage = 0; if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) - && ent->client->ps.saber[saberNum].damageScale != 1.0f) + && (ent->client->ps.saber[saberNum].damageScale != 1.0f || saberDmgMultiplier != 1.0f)) { - damage = ceil(totalDmg[i] * ent->client->ps.saber[saberNum].damageScale); + damage = ceil(totalDmg[i] * ent->client->ps.saber[saberNum].damageScale * saberDmgMultiplier); } else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) - && ent->client->ps.saber[saberNum].damageScale2 != 1.0f) + && (ent->client->ps.saber[saberNum].damageScale2 != 1.0f || saberDmgMultiplier != 1.0f)) { - damage = ceil(totalDmg[i] * ent->client->ps.saber[saberNum].damageScale2); + damage = ceil(totalDmg[i] * ent->client->ps.saber[saberNum].damageScale2 * saberDmgMultiplier); } else { @@ -4811,10 +4812,11 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) //FIXME: more damage for higher attack power levels? // More damage based on length/color of saber? //FIXME: Desann does double damage? + + + if (g_saberNewCombat->integer) //new code { - float saberDmgMultiplier = g_saberDamageScale->value; - if (g_saberRealisticCombat->integer) { switch ((ent->client->ps.saberAnimLevel)) @@ -4833,8 +4835,6 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) baseDamage = 2.5f; break; } - - baseDamage *= saberDmgMultiplier; } else { @@ -4845,7 +4845,7 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) || ent->client->ps.torsoAnim == BOTH_SPINATTACK7 || ent->client->ps.torsoAnim == BOTH_LUNGE2_B__T_)) {//*sigh*, these anim do less damage since they're so easy to do - baseDamage = 2.5f * saberDmgMultiplier; + baseDamage = 2.5f; } else { @@ -4865,8 +4865,6 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) baseDamage = 2.5f; break; } - - baseDamage *= saberDmgMultiplier; } } } @@ -8126,7 +8124,7 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) } } - if (self->NPC->rank < RANK_LT) //lower rank melee users can't do this stuff + if (self->NPC->rank > RANK_LT) //lower rank melee users can't do this stuff { if (g_debugMelee->integer && (ucmd->buttons & BUTTON_USE) @@ -13860,7 +13858,7 @@ qboolean WP_ForcePowerUsable(gentity_t *self, forcePowers_t forcePower, int over else { if ((forcePower == FP_SABERTHROW && self->client->ps.saber[0].saberFlags&SFL_NOT_THROWABLE) - || (forcePower == FP_SABERTHROW && self->client->buttons & BUTTON_USE)) + || (forcePower == FP_SABERTHROW && !self->client->buttons & BUTTON_USE)) {//cannot throw this type of saber or player is in kick mode return qfalse; } From 02db2ebf1c940ff568c7479f8cf4ce4d3d6bd5fe Mon Sep 17 00:00:00 2001 From: dusty22 Date: Thu, 13 Aug 2015 10:33:28 -0400 Subject: [PATCH 014/445] Just a slightly cleaned up version of the kick func Still kicks don't work though --- code/game/bg_pmove.cpp | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 8c12396d1a..8a17e5bb82 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -11089,20 +11089,14 @@ qboolean PM_PickAutoMultiKick(qboolean allowSingles) qboolean PM_SaberThrowable(void) { - //player gets to kick if holding use - if ((pm->cmd.buttons&BUTTON_USE)) + //can't throw staff unless we have ST 3 + if (pm->ps->saberAnimLevel == SS_STAFF && pm->ps->forcePowerLevel[FP_SABERTHROW] < 3) { return qfalse; } - //ugh, hard-coding this is bad... - if (pm->ps->saberAnimLevel == SS_STAFF) - { - return qfalse; - } - - if (!(pm->ps->saber[0].saberFlags&SFL_NOT_THROWABLE) && !(pm->cmd.buttons&BUTTON_USE)) - {//yes, this saber is throwable except if the player wants to kick + if (!(pm->ps->saber[0].saberFlags&SFL_NOT_THROWABLE)) + {//yes, this saber is throwable return qtrue; } @@ -11131,18 +11125,16 @@ qboolean PM_SaberThrowable(void) qboolean PM_CheckAltKickAttack(void) { - if (((pm->cmd.buttons&BUTTON_ALT_ATTACK) + if (pm->cmd.buttons&BUTTON_ALT_ATTACK && (!(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD) || PM_SaberInReturn(pm->ps->saberMove)) && (!PM_FlippingAnim(pm->ps->legsAnim) || pm->ps->legsAnimTimer <= 250) - //&& PM_SaberThrowable() - && (!WP_ForcePowerUsable(pm->gent, FP_SABERTHROW, 20)) //make sure saber throw is disabled before trying to kick && pm->ps->SaberActive() && !(pm->ps->saber[0].saberFlags&SFL_NO_KICKS)//okay to do kicks with this saber && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_KICKS))//okay to do kicks with the 2nd saber + && (!pm->cmd.buttons&BUTTON_USE || !PM_SaberThrowable /*kick by default if can't saber throw*/) + //&& !PM_SaberThrowable() + //&& (!WP_ForcePowerUsable(pm->gent, FP_SABERTHROW, 20)) //make sure saber throw is disabled before trying to kick) ) - || ((pm->cmd.buttons&BUTTON_ALT_ATTACK) - && !(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD) - && pm->cmd.buttons&BUTTON_USE)) { return qtrue; } From 6ac386fe9c9e3ee5a0a0f38aed642bbed1afbf71 Mon Sep 17 00:00:00 2001 From: dusty22 Date: Fri, 21 Aug 2015 08:59:00 -0400 Subject: [PATCH 015/445] CMake fixes, updated readme and changelog Some of the CMake files were messed up not allowing you to build a fresh solution file, also I added more information to the readme and changelog files --- CHANGELOG.txt | 31 +++++++++++++++++++++++++++++++ CMakeLists.txt | 28 ---------------------------- CMakeModules/InstallZIP.cmake | 9 --------- README.md | 8 +++++++- 4 files changed, 38 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 32bc8d6a1a..ab619224a2 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,3 +1,34 @@ +(Dusty's Patch changelog) +Only larger/more important changes recorded here: +Gameplay mechanics - +- Force Jump height for all levels increased by 25% +- Allied NPCs receive 150%/125%/100% HP for Padawan/Jedi/Jedi Knight difficulties now instead of 100/125/150 like enemy +npcs + + +NPC AI - +- Improvements to NPC AI pertaining to the use of JA-exclusive abilities; +NPCs only use Force Rage if close to the player, if have > 25% HP, they only kick if close to the player + + +Game additions - +- Save games allow for screenshots now like JK2 +- Visual effect for blocking Force Lightning with your lightsaber +- A modified saber system is available with the g_saberNewCombat command; with slightly rebalanced saber styles and adjustments to how Saber Offense, Defense, and .sab parry and breakparry bonuses affect saber combat +- g_saberDeflectAutoAim (0/1) cvar added, if 0 deflected shots go in the direction of the player's crosshair as opposed to being auto-aimed with the likelihood of the shots being deflected toward the crosshair increasing with Saber Defense level +- g_saberDamageScale cvar added for more precise control over saber damage (fully compatible with g_saberMoreRealistic) + + +Things to do - +- Kick-Saber Throw alternate and Kata switch button +- Saber Offense controlling melee and kicking abilities +- Savegame screenshots working in the loading screen +- handicap cvar going past 100, separate cvar for player HP and Shields +- g_autoRoll cvar, g_charForcePoints cvar, g_charForceRegen cvar +- have r_dynamicglowintensity cvar be archived + +------------------------------------------------------------------------------------------------------------------------- +(OpenJK changelog) This file will generally summarise the Github repo commit history Key: - removed, + added, * modified diff --git a/CMakeLists.txt b/CMakeLists.txt index ed8e0536d0..d106899f61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,12 +17,6 @@ #============================================================================ cmake_minimum_required(VERSION 2.8.8) - -# Set CMake policies -if(POLICY CMP0043) - cmake_policy(SET CMP0043 OLD) # Don't ignore COMPILE_DEFINITION_ -endif() - # For checks in subdirectories set(InOpenJK TRUE) @@ -73,11 +67,7 @@ else() set(MakeApplicationBundles OFF) endif() -<<<<<<< HEAD -if(MSVC) -======= if(WIN32) ->>>>>>> JACoders/master option(UseInternalSDL2 "Whether to use the included SDL2 library instead of a locally installed one" ON) else() set(UseInternalSDL2 OFF) @@ -86,12 +76,9 @@ endif() # Custom CMake Modules needed list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}/CMakeModules") -<<<<<<< HEAD -======= Include(CheckTypeSize) check_type_size("void*" CMAKE_SIZEOF_VOID_P) ->>>>>>> JACoders/master # ${Architecture} must match ARCH_STRING in q_platform.h, # and is used in DLL names (jagamex86.dll, jagamex86.dylib, jagamei386.so). if(WIN32) @@ -168,13 +155,10 @@ if (APPLE) set(SharedDefines "MACOS_X") endif() -<<<<<<< HEAD -======= if (NOT WIN32 AND NOT APPLE) set(SharedDefines "ARCH_STRING=\"${Architecture}\"") endif() ->>>>>>> JACoders/master # Compiler settings if(MSVC) @@ -222,8 +206,6 @@ elseif (("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") OR ("${CMAKE_C_COMPILER_ID}" S set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mstackrealign") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpmath=sse") endif() -<<<<<<< HEAD -======= if(WIN32) # Link libgcc and libstdc++ statically @@ -231,7 +213,6 @@ elseif (("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") OR ("${CMAKE_C_COMPILER_ID}" S set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++") endif() ->>>>>>> JACoders/master elseif("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-comment") @@ -281,15 +262,6 @@ endif() if(UseInternalJPEG) set(SharedDefines ${SharedDefines} "USE_INTERNAL_JPEG") endif() -<<<<<<< HEAD - -if(UseInternalZlib) - set(SharedDefines ${SharedDefines} "USE_INTERNAL_ZLIB") -endif() - -set(OpenJKLibDir "${CMAKE_SOURCE_DIR}/lib") -======= ->>>>>>> JACoders/master if(UseInternalZlib) set(SharedDefines ${SharedDefines} "USE_INTERNAL_ZLIB") diff --git a/CMakeModules/InstallZIP.cmake b/CMakeModules/InstallZIP.cmake index 9676777aa1..090b946d03 100644 --- a/CMakeModules/InstallZIP.cmake +++ b/CMakeModules/InstallZIP.cmake @@ -43,8 +43,6 @@ if(WIN32) endif() if(NOT ZIP_EXECUTABLE) -<<<<<<< HEAD -======= find_program(ZIP_EXECUTABLE wzzip PATHS "$ENV{ProgramW6432}/WinZip") if(ZIP_EXECUTABLE) set(ZIP_COMMAND "${ZIP_EXECUTABLE}" -P "" ) @@ -52,7 +50,6 @@ if(WIN32) endif() if(NOT ZIP_EXECUTABLE) ->>>>>>> JACoders/master find_program(ZIP_EXECUTABLE 7z PATHS "$ENV{ProgramFiles}/7-Zip") if(ZIP_EXECUTABLE) set(ZIP_COMMAND "${ZIP_EXECUTABLE}" a -tzip "" ) @@ -60,8 +57,6 @@ if(WIN32) endif() if(NOT ZIP_EXECUTABLE) -<<<<<<< HEAD -======= find_program(ZIP_EXECUTABLE 7z PATHS "$ENV{ProgramW6432}/7-Zip") if(ZIP_EXECUTABLE) set(ZIP_COMMAND "${ZIP_EXECUTABLE}" a -tzip "" ) @@ -69,14 +64,11 @@ if(WIN32) endif() if(NOT ZIP_EXECUTABLE) ->>>>>>> JACoders/master find_program(ZIP_EXECUTABLE winrar PATHS "$ENV{ProgramFiles}/WinRAR") if(ZIP_EXECUTABLE) set(ZIP_COMMAND "${ZIP_EXECUTABLE}" a "" ) endif() endif() -<<<<<<< HEAD -======= if(NOT ZIP_EXECUTABLE) find_program(ZIP_EXECUTABLE winrar PATHS "$ENV{ProgramW6432}/WinRAR") @@ -84,7 +76,6 @@ if(WIN32) set(ZIP_COMMAND "${ZIP_EXECUTABLE}" a "" ) endif() endif() ->>>>>>> JACoders/master endif() if(NOT ZIP_EXECUTABLE) diff --git a/README.md b/README.md index 4990ce715e..668b248de7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,10 @@ -# OpenJK +# Dusty's Patch Readme + +Dusty's Patch is a single player modification for Jedi Academy based off the coding framework of OpenJK. It attempts to polish/improve certain gameplay mechanics such as combat, NPC AI, and balance in Jedi Academy's single player and to make small, usually optional, additions. + + +------------------------------------------------------------------------------------------------------------------------- +# OpenJK's Readme OpenJK is an effort by the JACoders group to maintain and improve the game engines on which the Jedi Academy (JA) and Jedi Outcast (JO) games run on, while maintaining *full backwards compatibility* with the existing games. *This project does not attempt to rebalance or otherwise modify core gameplay*. From a08d0b4109e509a2c1f3bdce713d13acfa3fbdff Mon Sep 17 00:00:00 2001 From: dusty22 Date: Fri, 9 Oct 2015 16:25:11 -0400 Subject: [PATCH 016/445] Another big batch of changes new cvars: g_autoRoll - been there for a while, now works 100% correctly, if 1 default JA behavior, if 0 you have to be holding USE to roll g_char_forcePowerMax - requires level restart g_char_forceRegen - requires level restart g_char_parryBonus - g_char_breakParryBonus - all these affect the player's stats g_saberForceDrains - if 1 special moves drain the amount of FP from the next cvar, katas not affected g_saberForceDrainAmount - if g_saberForceDrains is 1, special moves drain this amount of FP, katas not affected g_saberLockSuperBreaks - if 1 default JA behavior of saber locks, if 0 no super breaks (1-hit KOs) ever happen after saber locks g_saberLockStyle - dummy cvar. Later maybe make it so superbreaks happen under certain conditions. other changes: - QMax bugs and crashes fixed (wasn't ported properly from OpenJK) - melee force users push back and dodge explosives better now, still don't dodge saber throws yet... --- code/game/bg_panimate.cpp | 18 +++--- code/game/bg_pmove.cpp | 48 ++++++++++----- code/game/g_active.cpp | 53 +++++++++++++--- code/game/g_client.cpp | 6 +- code/game/g_main.cpp | 32 +++++++--- code/game/wp_saber.cpp | 125 +++++++++++++++++++++++++------------- 6 files changed, 198 insertions(+), 84 deletions(-) diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index 11eac24275..aa8c443952 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -49,6 +49,8 @@ extern cvar_t *g_saberAutoAim; extern cvar_t *g_speederControlScheme; extern cvar_t *g_saberNewControlScheme; extern cvar_t *g_saberNewCombat; +extern cvar_t *g_saberForceDrains; +extern cvar_t *g_saberForceDrainAmount; extern qboolean InFront(vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold = 0.0f); extern void WP_ForcePowerDrain(gentity_t *self, forcePowers_t forcePower, int overrideAmt); @@ -3024,7 +3026,7 @@ qboolean PM_InSecondaryStyle(void) saberMoveName_t PM_SaberLungeAttackMove(qboolean fallbackToNormalLunge) { - G_DrainPowerForSpecialMove(pm->gent, FP_SABER_OFFENSE, SABER_ALT_ATTACK_POWER_FB); + G_DrainPowerForSpecialMove(pm->gent, FP_SABER_OFFENSE, g_saberForceDrainAmount->integer); //SABER_ALT_ATTACK_POWER_FB); //see if we have an overridden (or cancelled) lunge move if (pm->ps->saber[0].lungeAtkMove != LS_INVALID) @@ -3179,7 +3181,7 @@ qboolean PM_CheckLungeAttackMove(void) saberMoveName_t PM_SaberJumpForwardAttackMove(void) { - G_DrainPowerForSpecialMove(pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_FB); + G_DrainPowerForSpecialMove(pm->gent, FP_LEVITATION, g_saberForceDrainAmount->integer);//SABER_ALT_ATTACK_POWER_FB); //see if we have an overridden (or cancelled) kata move if (pm->ps->saber[0].jumpAtkFwdMove != LS_INVALID) @@ -3385,6 +3387,8 @@ qboolean PM_CheckJumpForwardAttackMove(void) saberMoveName_t PM_SaberFlipOverAttackMove(void) { + G_DrainPowerForSpecialMove(pm->gent, FP_SABER_OFFENSE, g_saberForceDrainAmount->integer); + //see if we have an overridden (or cancelled) kata move if (pm->ps->saber[0].jumpAtkFwdMove != LS_INVALID) { @@ -3457,7 +3461,7 @@ saberMoveName_t PM_SaberFlipOverAttackMove(void) pm->gent->angle = pm->ps->viewangles[YAW];//so we know what yaw we started this at - G_DrainPowerForSpecialMove(pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_FB); + G_DrainPowerForSpecialMove(pm->gent, FP_LEVITATION, g_saberForceDrainAmount->integer);//SABER_ALT_ATTACK_POWER_FB); if (Q_irand(0, 1)) { @@ -4029,8 +4033,8 @@ saberMoveName_t PM_SaberAttackForMovement(int forwardmove, int rightmove, int cu {//cartwheel right vec3_t right, fwdAngles = { 0, pm->ps->viewangles[YAW], 0 }; if (pm->gent) - { - G_DrainPowerForSpecialMove(pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_LR); + {//seems to drain twice for some reason so 1/2 the drain amount + G_DrainPowerForSpecialMove(pm->gent, FP_LEVITATION, 0.5 * g_saberForceDrainAmount->integer);//SABER_ALT_ATTACK_POWER_LR); } pm->cmd.upmove = 0; if (overrideJumpRightAttackMove != LS_INVALID) @@ -4111,8 +4115,8 @@ saberMoveName_t PM_SaberAttackForMovement(int forwardmove, int rightmove, int cu {//cartwheel left vec3_t right, fwdAngles = { 0, pm->ps->viewangles[YAW], 0 }; if (pm->gent) - { - G_DrainPowerForSpecialMove(pm->gent, FP_LEVITATION, SABER_ALT_ATTACK_POWER_LR); + {//seems to drain twice for some reason so 1/2 the drain amount + G_DrainPowerForSpecialMove(pm->gent, FP_LEVITATION, 0.5 * g_saberForceDrainAmount->integer);//SABER_ALT_ATTACK_POWER_LR); } pm->cmd.upmove = 0; if (overrideJumpRightAttackMove != LS_INVALID) diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 8a17e5bb82..2425c7a72a 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -148,6 +148,8 @@ extern cvar_t *g_saberNewControlScheme; extern cvar_t *g_stepSlideFix; extern cvar_t *g_saberAutoBlocking; extern cvar_t *g_autoRoll; +extern cvar_t *g_saberForceDrainAmount; +extern cvar_t *g_saberLockSuperBreaks; static void PM_SetWaterLevelAtPoint(vec3_t org, int *waterlevel, int *watertype); @@ -10222,7 +10224,12 @@ void PM_SaberLockBreak(gentity_t *gent, gentity_t *genemy, saberLockResult_t res } else { - breakType = SABERLOCK_SUPERBREAK; + if (g_saberLockSuperBreaks->integer) { + breakType = SABERLOCK_SUPERBREAK; + } + else { + breakType = SABERLOCK_BREAK; + } } } else @@ -11037,21 +11044,28 @@ saberMoveName_t G_PickAutoMultiKick(gentity_t *self, qboolean allowSingles, qboo if (self->client->ps.groundEntityNum != ENTITYNUM_NONE) {//can't do the multikicks in air if (enemiesFront && enemiesBack - && (enemiesFront + enemiesBack) - (enemiesRight + enemiesLeft)>1) + && (enemiesFront + enemiesBack) - (enemiesRight + enemiesLeft)>1 + && self->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > 2) {//more enemies in front/back than left/right kickMove = LS_KICK_BF; } - else if (enemiesRight && enemiesLeft + else if ((enemiesRight && enemiesLeft && (enemiesRight + enemiesLeft) - (enemiesFront + enemiesBack)>1) + && self->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > 2) {//more enemies on left & right than front/back kickMove = LS_KICK_RL; } - else if ((enemiesFront || enemiesBack) && (enemiesRight || enemiesLeft)) - {//at least 2 enemies around us, not aligned + else if ((((enemiesFront || enemiesBack) && (enemiesRight || enemiesLeft)) + || pm->cmd.buttons&BUTTON_USE) + && self->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > 2) + {//at least 2 enemies around us, not aligned, or doing a special + G_DrainPowerForSpecialMove(pm->gent, FP_SABER_OFFENSE, g_saberForceDrainAmount->integer); kickMove = LS_KICK_S; } - else if (enemiesSpin > 1) - {//at least 2 enemies around us, not aligned + else if ((enemiesSpin > 1 || pm->cmd.buttons&BUTTON_USE) + && self->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > 2) + {//at least 2 enemies around us, not aligned, or doing a special + G_DrainPowerForSpecialMove(pm->gent, FP_SABER_OFFENSE, g_saberForceDrainAmount->integer); kickMove = LS_KICK_S; } } @@ -11131,7 +11145,7 @@ qboolean PM_CheckAltKickAttack(void) && pm->ps->SaberActive() && !(pm->ps->saber[0].saberFlags&SFL_NO_KICKS)//okay to do kicks with this saber && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_KICKS))//okay to do kicks with the 2nd saber - && (!pm->cmd.buttons&BUTTON_USE || !PM_SaberThrowable /*kick by default if can't saber throw*/) + && !(pm->cmd.buttons&BUTTON_FORCE_FOCUS) //&& !PM_SaberThrowable() //&& (!WP_ForcePowerUsable(pm->gent, FP_SABERTHROW, 20)) //make sure saber throw is disabled before trying to kick) ) @@ -12087,7 +12101,7 @@ void PM_WeaponLightsaber(void) PM_SetSaberMove(LS_ROLL_STAB); if (pm->gent) { - G_DrainPowerForSpecialMove(pm->gent, FP_SABER_OFFENSE, SABER_ALT_ATTACK_POWER_FB); + G_DrainPowerForSpecialMove(pm->gent, FP_SABER_OFFENSE, g_saberForceDrainAmount->integer);//SABER_ALT_ATTACK_POWER_FB); } } } @@ -13689,15 +13703,15 @@ static void PM_Weapon(void) { int anim = -1; if ((pm->ps->clientNum < MAX_CLIENTS || PM_ControlledByPlayer()) - && g_debugMelee->integer) - { + /*&& g_debugMelee->integer*/) + {//saber offense if ((pm->cmd.buttons&BUTTON_ALT_ATTACK)) { - if ((pm->cmd.buttons&BUTTON_ATTACK)) + if ((pm->cmd.buttons&BUTTON_ATTACK) && pm->ps->forcePowerLevel[FP_SABER_OFFENSE] > 1) { PM_TryGrab(); } - else if (!(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD)) + else if (!(pm->ps->pm_flags&PMF_ALT_ATTACK_HELD) && pm->ps->forcePowerLevel[FP_SABER_OFFENSE] > 0) { PM_CheckKick(); } @@ -14454,8 +14468,9 @@ void PM_AdjustAttackStates(pmove_t *pm) if (pm->ps->weapon == WP_SABER && (!cg.zoomMode || pm->ps->clientNum)) {//don't let the alt-attack be interpreted as an actual attack command - if (pm->ps->saberInFlight) - { + if (pm->ps->saberInFlight) + { //no kicks with saber in flight + //FIXME: Can kick/use melee if saber throw is knocked to ground? pm->cmd.buttons &= ~BUTTON_ALT_ATTACK; //FIXME: what about alt-attack modifier button? if ((!pm->ps->dualSabers || !pm->ps->saber[1].Active())) @@ -14464,6 +14479,7 @@ void PM_AdjustAttackStates(pmove_t *pm) } } //saber staff alt-attack does a special attack anim, non-throwable sabers do kicks + /* ack let me kick with single if (pm->ps->saberAnimLevel != SS_STAFF && !(pm->ps->saber[0].saberFlags&SFL_NOT_THROWABLE)) {//using a throwable saber, so remove the saber throw button @@ -14475,7 +14491,7 @@ void PM_AdjustAttackStates(pmove_t *pm) {//new control scheme - alt-attack doesn't have anything to do with katas, safe to clear it here pm->cmd.buttons &= ~BUTTON_ALT_ATTACK; } - } + }*/ } // disruptor alt-fire should toggle the zoom mode, but only bother doing this for the player? diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index aa46ae4985..bf89ab81e6 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -2254,7 +2254,11 @@ qboolean G_GrabClient( gentity_t *ent, usercmd_t *ucmd ) int numEnts; const float radius = 100.0f; const float radiusSquared = (radius*radius); - float bestDistSq = (radiusSquared+1.0f), distSq; + float bestDistSq = (radiusSquared + 1.0f), distSq; + const float radiusP = 50.0f; //player's non-cheat range = 0.5x radius + const float radiusSquaredP = (radiusP*radiusP); + float bestDistSqP = (radiusSquaredP + 1.0f); + int i; vec3_t boltOrg; @@ -2304,21 +2308,54 @@ qboolean G_GrabClient( gentity_t *ent, usercmd_t *ucmd ) continue; } - if ( fabs(radiusEnts[i]->currentOrigin[2]-ent->currentOrigin[2])>8.0f ) - {//have to be close in Z - continue; + if (ent->NPC || (g_debugMelee->integer && ent->s.number < MAX_CLIENTS)) + {//either I'm an kyle_boss (an NPC) or player and using cheats = less precise aim + if (fabs(radiusEnts[i]->currentOrigin[2] - ent->currentOrigin[2]) > 8.0f) + {//have to be close in Z + continue; + } } + else {//more precise aim if not cheating or a boss + if (fabs(radiusEnts[i]->currentOrigin[2] - ent->currentOrigin[2]) > 1.0f) + {//have to be close in Z + continue; + } + } + if ( !PM_HasAnimation( radiusEnts[i], BOTH_PLAYER_PA_1 ) ) {//doesn't have matching anims continue; } + if (((radiusEnts[i]->client->ps.weapon == WP_SABER + && radiusEnts[i]->client->ps.forcePowersKnown&(1 << FP_SABER_OFFENSE) + && radiusEnts[i]->client->ps.forcePowersKnown&(1 << FP_SABER_DEFENSE)) //not on saber-wielders who have skillz + || radiusEnts[i]->client->NPC_class == CLASS_REBORN //melee force users? Should we allow kataing? + || radiusEnts[i]->client->NPC_class == CLASS_BOBAFETT //he's too leet + || radiusEnts[i]->NPC->aiFlags&NPCAI_BOSS_CHARACTER) + || !Q_stricmp("chewie", radiusEnts[i]->NPC_type) + && !(ent->NPC || (g_debugMelee->integer && ent->s.number < MAX_CLIENTS))) + { //FIXME: Some kind of kata resist animation? + continue; + } + distSq = DistanceSquared( radiusEnts[i]->currentOrigin, boltOrg ); - if ( distSq < bestDistSq ) - { - bestDistSq = distSq; - bestEnt = radiusEnts[i]; + if (ent->NPC || (g_debugMelee->integer && ent->s.number < MAX_CLIENTS)) + {//either I'm an kyle_boss (an NPC) or player and using cheats = longer range for grabs + if (distSq < bestDistSq) + { + bestDistSq = distSq; + bestEnt = radiusEnts[i]; + } + } + else { //player without cheats = 0.5x range + if (distSq < (bestDistSq * 0.5)) + { + bestDistSq *= 0.5; + bestDistSq = distSq; + bestEnt = radiusEnts[i]; + } } } diff --git a/code/game/g_client.cpp b/code/game/g_client.cpp index f7bcee613a..37cef8623f 100644 --- a/code/game/g_client.cpp +++ b/code/game/g_client.cpp @@ -472,11 +472,11 @@ void ClientUserinfoChanged( int clientNum ) { ClientCleanName( s, client->pers.netname, sizeof( client->pers.netname ) ); // set max health - maxHealth = 100; - health = Com_Clampi( 1, 100, atoi( Info_ValueForKey( userinfo, "handicap" ) ) ); + maxHealth = 200; + health = Com_Clampi( 1, 200, atoi( Info_ValueForKey( userinfo, "handicap" ) ) ); client->pers.maxHealth = health; if ( client->pers.maxHealth < 1 || client->pers.maxHealth > maxHealth ) - client->pers.maxHealth = 100; + client->pers.maxHealth = 200; client->ps.stats[STAT_MAX_HEALTH] = client->pers.maxHealth; // sounds diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index c1eedda887..0cbd9de0c8 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -203,18 +203,24 @@ cvar_t *g_saber2_color; cvar_t *g_saberDarkSideSaberColor; //new cvars - Dusty +cvar_t *g_autoRoll; cvar_t *g_saberNewCombat; cvar_t *g_saberLocksEnabled; cvar_t *g_saberDamageScale; cvar_t *g_saberWalkAnims; -cvar_t *g_autoRoll; +cvar_t *g_saberForceDrains; +cvar_t *g_saberForceDrainAmount; +cvar_t *g_saberLockSuperBreaks; +cvar_t *g_saberLockStyle; -cvar_t *g_char_forcepoints; -cvar_t *g_char_ParryBonus; -cvar_t *g_char_BreakParryBonus; -cvar_t *g_char_ForceAffinity; -cvar_t *g_char_ForceFocus; -cvar_t *g_char_ForceSensitivity; +//for character stats +cvar_t *g_char_forcePowerMax; //only applies after re-loading level +cvar_t *g_char_forceRegen; //only applies after re-loading level +cvar_t *g_char_parryBonus; //fix this, doesn't apply correctly in all cases +cvar_t *g_char_breakParryBonus; //fix this, doesn't apply correctly in all cases +cvar_t *g_char_forceAffinity; //make into ui_cvars? +cvar_t *g_char_forceFocus; +cvar_t *g_char_forceSensitivity; // kef -- used with DebugTraceForNPC @@ -705,11 +711,19 @@ void G_InitCvars( void ) { gi.cvar( "g_clearstats", "1", CVAR_ROM|CVAR_NORESTART); //new cvars yay - Dusty + g_autoRoll = gi.cvar("g_autoRoll", "1", CVAR_ARCHIVE); g_saberNewCombat = gi.cvar("g_saberNewCombat", "1", CVAR_ARCHIVE | CVAR_CHEAT); g_saberLocksEnabled = gi.cvar("g_saberLocksEnabled", "1", CVAR_ARCHIVE | CVAR_CHEAT); + g_saberLockStyle = gi.cvar("g_saberLockStyle", "1", CVAR_ARCHIVE | CVAR_CHEAT); + g_saberLockSuperBreaks = gi.cvar("g_saberLockSuperBreaks", "1", CVAR_ARCHIVE | CVAR_CHEAT); + g_saberForceDrains = gi.cvar("g_saberForceDrains", "1", CVAR_ARCHIVE | CVAR_CHEAT); + g_saberForceDrainAmount = gi.cvar("g_saberForceDrainAmount", "10", CVAR_ARCHIVE | CVAR_CHEAT); g_saberDamageScale = gi.cvar("g_saberDamageScale", "1", CVAR_SAVEGAME | CVAR_CHEAT); - g_char_forcepoints = gi.cvar("g_char_forcepoints", "100", CVAR_CHEAT | CVAR_SAVEGAME ); - g_autoRoll = gi.cvar("g_autoRoll", "1", CVAR_ARCHIVE ); + g_char_forcePowerMax = gi.cvar("g_char_forcePowerMax", "100", CVAR_CHEAT | CVAR_SAVEGAME ); + g_char_forceRegen = gi.cvar("g_char_forceRegen", "100", CVAR_CHEAT | CVAR_SAVEGAME); + g_char_parryBonus = gi.cvar("g_char_parryBonus", "0", CVAR_CHEAT | CVAR_SAVEGAME); + g_char_breakParryBonus = gi.cvar("g_char_breakParryBonus", "0", CVAR_CHEAT | CVAR_SAVEGAME); + } /* ============ diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 494a2b6bc5..16a35a5945 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -62,6 +62,12 @@ extern cvar_t *g_saberRestrictForce; extern cvar_t *g_saberPickuppableDroppedSabers; extern cvar_t *debug_subdivision; +//new character cvars +extern cvar_t *g_char_forcePowerMax; +extern cvar_t *g_char_forceRegen; +extern cvar_t *g_char_parryBonus; +extern cvar_t *g_char_breakParryBonus; + extern qboolean WP_SaberBladeUseSecondBladeStyle(saberInfo_t *saber, int bladeNum); extern qboolean WP_SaberBladeDoTransitionDamage(saberInfo_t *saber, int bladeNum); @@ -165,6 +171,9 @@ extern cvar_t *g_saberRealisticCombat; extern cvar_t *g_saberDamageCapping; extern cvar_t *g_saberNewControlScheme; extern cvar_t *g_saberNewCombat; +extern cvar_t *g_saberForceDrains; +extern cvar_t *g_saberLockStyle; +extern cvar_t *g_saberLockSuperBreaks; extern cvar_t *g_saberLocksEnabled; extern cvar_t *g_saberDamageScale; extern int g_crosshairEntNum; @@ -174,7 +183,7 @@ qboolean g_noClashFlare = qfalse; int g_saberFlashTime = 0; //new variables - Dusty -const int hitOwnerRecoveryInterval = 1500; //interval at which defense points are recovered, 1.5 seconds +const int HITOWNER_RECOVERY_INTERVAL = 1500; //interval at which defense points are recovered, 1.5 seconds /*extern int hitOwnerBreakLimit; extern int hitOwnerRecoveryTime; //how long left to recover a defense point extern int hitOwnerBreakCounter; //keeping track of how many strong attacks the defender blocks in a //a short time period*/ @@ -4385,7 +4394,7 @@ void G_DrainPowerForSpecialMove(gentity_t *self, forcePowers_t fp, int cost, qbo { return; } - if (g_saberNewControlScheme->integer || kataMove) + if (g_saberNewControlScheme->integer || g_saberForceDrains->integer || kataMove) {//special moves cost power WP_ForcePowerDrain(self, fp, cost);//drain the required force power } @@ -5354,10 +5363,18 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum)) { entPowerLevel += ent->client->ps.saber[saberNum].breakParryBonus; + + if (ent->s.number < MAX_CLIENTS) {//player + entPowerLevel += g_char_breakParryBonus->integer; + } } else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum)) { entPowerLevel += ent->client->ps.saber[saberNum].breakParryBonus2; + + if (ent->s.number < MAX_CLIENTS) {//player + entPowerLevel += g_char_breakParryBonus->integer; + } } } else if (entDefending) @@ -5369,6 +5386,10 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) }*/ //FIXME: what about second saber if dualSabers? entPowerLevel += ent->client->ps.saber[saberNum].parryBonus; + + if (ent->s.number < MAX_CLIENTS) {//player + entPowerLevel += g_char_parryBonus->integer; + } } if (PM_SaberInAttack(hitOwner->client->ps.saberMove) || PM_SaberInSpecialAttack(hitOwner->client->ps.torsoAnim)) @@ -5401,6 +5422,11 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) hitOwnerPowerLevel++; }*/ hitOwnerPowerLevel += hitOwner->client->ps.saber[0].breakParryBonus; + + if (hitOwner->s.number < MAX_CLIENTS) {//player + hitOwnerPowerLevel += g_char_breakParryBonus->integer; + } + if (hitOwner->client->ps.dualSabers && Q_irand(0, 1)) {//FIXME: assumes both sabers are hitting at same time...? //what the heck is this extra 1 for?! - Dusty @@ -5415,6 +5441,11 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) hitOwnerPowerLevel++; }*/ hitOwnerPowerLevel += hitOwner->client->ps.saber[0].parryBonus; + + if (hitOwner->s.number < MAX_CLIENTS) {//player + hitOwnerPowerLevel += g_char_parryBonus->integer; + } + if (hitOwner->client->ps.dualSabers && Q_irand(0, 1)) {//FIXME: assumes both sabers are defending at same time...? //what the heck is this extra 1 for?! - Dusty @@ -5487,7 +5518,7 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) if (!PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) { //special attacks just break, no counters hitOwner->breakCounter += (entPowerLevel - hitOwnerPowerLevel); - hitOwner->breakRecoveryTime = level.time + hitOwnerRecoveryInterval; + hitOwner->breakRecoveryTime = level.time + HITOWNER_RECOVERY_INTERVAL; } } //base parry breaks on animation (saber attack level), not FP_SABER_OFFENSE @@ -5537,7 +5568,7 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim))//they are defending, but their defense strength is lower than my attack... //or they are doing a special which has slightly //different rules - /*|| (!deflected && Q_irand(0, QMax(0, PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]PM_PowerLevelForSaberAnim( &hitOwner->client->ps ))) > 0))*/ + /*|| (!deflected && Q_irand(0, Q_max(0, PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]PM_PowerLevelForSaberAnim( &hitOwner->client->ps ))) > 0))*/ //^um what does that do anyway? Just add randomness? //^Fixed per latest OpenJK update not to divide by zero incase want to uncomment {//broke their parry altogether @@ -5842,10 +5873,20 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum)) { entPowerLevel += ent->client->ps.saber[saberNum].breakParryBonus; + + if (ent->s.number < MAX_CLIENTS) + {//player + entPowerLevel += g_char_breakParryBonus->integer; + } } else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum)) { entPowerLevel += ent->client->ps.saber[saberNum].breakParryBonus2; + + if (ent->s.number < MAX_CLIENTS) + {//player + entPowerLevel += g_char_breakParryBonus->integer; + } } } else if (entDefending) @@ -5857,6 +5898,11 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) } //FIXME: what about second saber if dualSabers? entPowerLevel += ent->client->ps.saber[saberNum].parryBonus; + + if (ent->s.number < MAX_CLIENTS) + {//player + entPowerLevel += g_char_parryBonus->integer; + } } if (PM_SaberInAttack(hitOwner->client->ps.saberMove) || PM_SaberInSpecialAttack(hitOwner->client->ps.torsoAnim)) @@ -5888,7 +5934,14 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) { hitOwnerPowerLevel++; } + hitOwnerPowerLevel += hitOwner->client->ps.saber[0].breakParryBonus; + + if (hitOwner->s.number < MAX_CLIENTS) + {//player + hitOwnerPowerLevel += g_char_breakParryBonus->integer; + } + if (hitOwner->client->ps.dualSabers && Q_irand(0, 1)) {//FIXME: assumes both sabers are hitting at same time...? hitOwnerPowerLevel += 1 + hitOwner->client->ps.saber[1].breakParryBonus; @@ -5901,7 +5954,14 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) { hitOwnerPowerLevel++; } + hitOwnerPowerLevel += hitOwner->client->ps.saber[0].parryBonus; + + if (hitOwner->s.number < MAX_CLIENTS) + {//player + hitOwnerPowerLevel += g_char_parryBonus->integer; + } + if (hitOwner->client->ps.dualSabers && Q_irand(0, 1)) {//FIXME: assumes both sabers are defending at same time...? hitOwnerPowerLevel += 1 + hitOwner->client->ps.saber[1].parryBonus; @@ -6007,9 +6067,9 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) else if (!activeDefense//they're not defending || (entPowerLevel > FORCE_LEVEL_2 //I hit hard && hitOwnerPowerLevel < entPowerLevel)//they are defending, but their defense strength is lower than my attack... - || (!deflected && Q_irand(0, QMax(0, PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE])/*PM_PowerLevelForSaberAnim( &hitOwner->client->ps )*/) > 0)) + || (!deflected && Q_irand(0, Q_max(0, PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE])/*PM_PowerLevelForSaberAnim( &hitOwner->client->ps )*/) > 0)) {//broke their parry altogether - if (entPowerLevel > FORCE_LEVEL_2 || Q_irand(0, QMax(0, ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]))) + if (entPowerLevel > FORCE_LEVEL_2 || Q_irand(0, Q_max(0, ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]))) {//chance of continuing with the attack (not bouncing back) ent->client->ps.saberEventFlags &= ~SEF_BLOCKED; ent->client->ps.saberBounceMove = LS_NONE; @@ -8094,37 +8154,6 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) return; } - if (self->client->NPC_class == CLASS_ROCKETTROOPER) - {//rockettrooper - if (self->client->ps.groundEntityNum != ENTITYNUM_NONE) - {//must be in air - return; - } - if (Q_irand(0, 4 - (g_spskill->integer * 2))) - {//easier level guys do this less - return; - } - if (Q_irand(0, 3)) - {//base level: 25% chance of looking for something to dodge - if (Q_irand(0, 1)) - {//dodge sabers twice as frequently as other projectiles - dodgeOnlySabers = qtrue; - } - else - { - return; - } - } - } - - if (self->client->NPC_class == CLASS_BOBAFETT) - {//Boba doesn't dodge quite as much - if (Q_irand(0, 2 - g_spskill->integer)) - {//easier level guys do this less - return; - } - } - if (self->NPC->rank > RANK_LT) //lower rank melee users can't do this stuff { if (g_debugMelee->integer @@ -13609,7 +13638,7 @@ void WP_BlockPointsRegenerate(gentity_t *self) if (level.time >= self->breakRecoveryTime) { self->breakCounter -= 1; - self->breakRecoveryTime = level.time + hitOwnerRecoveryInterval; + self->breakRecoveryTime = level.time + HITOWNER_RECOVERY_INTERVAL; } } } @@ -13917,7 +13946,7 @@ qboolean WP_ForcePowerUsable(gentity_t *self, forcePowers_t forcePower, int over else { if ((forcePower == FP_SABERTHROW && self->client->ps.saber[0].saberFlags&SFL_NOT_THROWABLE) - || (forcePower == FP_SABERTHROW && !self->client->buttons & BUTTON_USE)) + || (forcePower == FP_SABERTHROW && !(self->client->buttons & BUTTON_FORCE_FOCUS))) {//cannot throw this type of saber or player is in kick mode return qfalse; } @@ -15442,11 +15471,25 @@ void WP_InitForcePowers(gentity_t *ent) if (!ent->client->ps.forcePowerMax) { - ent->client->ps.forcePowerMax = FORCE_POWER_MAX; + if (ent->s.number < MAX_CLIENTS) + {//player + ent->client->ps.forcePowerMax = g_char_forcePowerMax->integer; + } + else + { + ent->client->ps.forcePowerMax = FORCE_POWER_MAX; + } } if (!ent->client->ps.forcePowerRegenRate) { - ent->client->ps.forcePowerRegenRate = 100; + if (ent->s.number < MAX_CLIENTS) + {//player + ent->client->ps.forcePowerRegenRate = g_char_forceRegen->integer; + } + else + { + ent->client->ps.forcePowerRegenRate = 100; + } } ent->client->ps.forcePower = ent->client->ps.forcePowerMax; ent->client->ps.forcePowerRegenDebounceTime = level.time; From a886b58a7c36e38cc8bf80f9499e8f6e9e1fb2ff Mon Sep 17 00:00:00 2001 From: dusty22 Date: Fri, 9 Oct 2015 16:35:53 -0400 Subject: [PATCH 017/445] Quick fix and forgotten changes A quick touch-up and amended changelog... Things I forgot to include in last changelog: Melee changes: - Player gets a weaker version of melee katas now based on saber offense level (1 - punches and kicks, 2 - katas, 3 - spin kicks) - Player melee katas have less range, must be aimed more precisely, and do not work on certain types of enemies unless g_debugmelee is on - Spin kicks and the like are enabled for Saber Offense 3 - Can do spin kicks on demand by holding Use and pressing the kick button, however this costs Force power other changes: - All sabers kick by default for their alternate attack, +forcefocus must be held to use Saber Throw --- code/game/g_active.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index bf89ab81e6..6696e4ff8d 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -2255,10 +2255,7 @@ qboolean G_GrabClient( gentity_t *ent, usercmd_t *ucmd ) const float radius = 100.0f; const float radiusSquared = (radius*radius); float bestDistSq = (radiusSquared + 1.0f), distSq; - const float radiusP = 50.0f; //player's non-cheat range = 0.5x radius - const float radiusSquaredP = (radiusP*radiusP); - float bestDistSqP = (radiusSquaredP + 1.0f); - + int i; vec3_t boltOrg; @@ -2309,13 +2306,13 @@ qboolean G_GrabClient( gentity_t *ent, usercmd_t *ucmd ) } if (ent->NPC || (g_debugMelee->integer && ent->s.number < MAX_CLIENTS)) - {//either I'm an kyle_boss (an NPC) or player and using cheats = less precise aim + {//either I'm an kyle_boss (an NPC) or player and using cheats = less precise aim necessary if (fabs(radiusEnts[i]->currentOrigin[2] - ent->currentOrigin[2]) > 8.0f) {//have to be close in Z continue; } } - else {//more precise aim if not cheating or a boss + else {//more precise aim needed if not cheating or a boss if (fabs(radiusEnts[i]->currentOrigin[2] - ent->currentOrigin[2]) > 1.0f) {//have to be close in Z continue; From c23856ea4528baab4b46e3393596c1dbf187a009 Mon Sep 17 00:00:00 2001 From: 3vincent Date: Sat, 17 Oct 2015 15:45:44 +0200 Subject: [PATCH 018/445] Added OS X related info to get openJK running --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 4990ce715e..ab8dec39fc 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,18 @@ Installing and running OpenJK: 2. Extract the contents of the file into the Jedi Academy `GameData/` folder. For Steam users, this will be in `/steamapps/common/Jedi Academy/GameData`. 3. Run `openjk.x86.exe` (Windows), `openjk.i386` (Linux 32-bit), `openjk.x86_64` (Linux 64-bit) or the `OpenJK` application (OS X), depending on your operating system. + +**OS X Instructions** + +If you have the Mac App Store Version of Jedi Academy, follow these steps to get OpenJK runnning under OS X: + +1. Download the latest SDL2 Framework from [libsdl.org](https://www.libsdl.org/download-2.0.php) +2. Extract the content or open the file and put `SDL2.framework` in `/Library/Frameworks/` or `/Users//Library/Frameworks/` If this directory does not exist, create it. +3. Extract the content of the OpenJK DMG ([Download the latest build](http://builds.openjk.org)) into the game directory `/Applications/Star Wars Jedi Knight: Jedi Academy.app/Contents/` +4. Run `openJK.app` or `openJK SP.app` +5. Savegames, Config Files and Log Files are stored in `/Users//Library/Application Support/OpenJK/` + + ## For Developers ### Building OpenJK From 9d52f313f6335b355918c96b098097356797df91 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Wed, 21 Oct 2015 15:57:40 +0200 Subject: [PATCH 019/445] Enabled C++14 on Clang/GCC --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index abe9930ce8..e060933dde 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -211,6 +211,9 @@ elseif (("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") OR ("${CMAKE_C_COMPILER_ID}" S set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3") + # enable modern C++ + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") + if("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-comment") From bb8fe48f3f8e376ded6ac1b03ca912417de836be Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Wed, 21 Oct 2015 20:53:01 +0200 Subject: [PATCH 020/445] Only require the more widely available C++11, because Dinosaurs. --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e060933dde..d4c30c7d10 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -211,8 +211,8 @@ elseif (("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") OR ("${CMAKE_C_COMPILER_ID}" S set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3") - # enable modern C++ - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") + # enable somewhat modern C++ + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") if("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") From 8f2253fce02033bb36742d6c09464726a04d9ffe Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Mon, 26 Oct 2015 22:48:57 +0100 Subject: [PATCH 021/445] safe FS::ListFiles() --- code/CMakeLists.txt | 7 +++++ codemp/CMakeLists.txt | 7 +++++ shared/qcommon/safe/files.cpp | 49 +++++++++++++++++++++++++++++++ shared/qcommon/safe/files.h | 55 +++++++++++++++++++++++++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 shared/qcommon/safe/files.cpp create mode 100644 shared/qcommon/safe/files.h diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 8c3daf0f84..11b01ba0e0 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -181,6 +181,13 @@ if(BuildSPEngine OR BuildJK2SPEngine) ) source_group("common" FILES ${SPEngineCommonFiles}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineCommonFiles}) + + set(SPEngineSafeCommonFiles + "${SharedDir}/qcommon/safe/files.cpp" + "${SharedDir}/qcommon/safe/files.h" + ) + source_group("common/safe" FILES ${SPEngineCommonSafeFiles}) + set(SPEngineFiles ${SPEngineFiles} ${SPEngineCommonSafeFiles}) # Server files diff --git a/codemp/CMakeLists.txt b/codemp/CMakeLists.txt index 3bcc6fde1f..9647d2db9e 100644 --- a/codemp/CMakeLists.txt +++ b/codemp/CMakeLists.txt @@ -247,6 +247,13 @@ if(BuildMPEngine OR BuildMPDed) endif(WIN32) source_group("common" FILES ${MPEngineAndDedCommonFiles}) set(MPEngineAndDedFiles ${MPEngineAndDedFiles} ${MPEngineAndDedCommonFiles}) + + set(MPEngineAndDedCommonSafeFiles + "${SharedDir}/qcommon/safe/files.cpp" + "${SharedDir}/qcommon/safe/files.h" + ) + source_group("common/safe" FILES ${MPEngineAndDedCommonSafeFiles}) + set(MPEngineAndDedFiles ${MPEngineAndDedFiles} ${MPEngineAndDedCommonSafeFiles}) set(MPEngineAndDedG2Files "${MPDir}/ghoul2/G2.h" diff --git a/shared/qcommon/safe/files.cpp b/shared/qcommon/safe/files.cpp new file mode 100644 index 0000000000..d84e1e3019 --- /dev/null +++ b/shared/qcommon/safe/files.cpp @@ -0,0 +1,49 @@ +#include "files.h" + +#include "qcommon/qcommon.h" + +namespace FS +{ + FileList::~FileList() noexcept + { + if( _begin ) + { + FS_FreeFileList( _begin ); + } + } + + FileList::FileList( char** files, int numFiles ) noexcept + : _begin( files ) + , _end( files + numFiles ) + { + assert( numFiles >= 0 ); + } + + FileList::FileList( FileList&& rhs ) noexcept + : _begin( rhs._begin ) + , _end( rhs._end ) + { + rhs._begin = nullptr; + rhs._end = nullptr; + } + + FileList& FileList::operator=( FileList&& rhs ) noexcept + { + if( _begin != nullptr ) + { + FS_FreeFileList( _begin ); + } + _begin = rhs._begin; + rhs._begin = nullptr; + _end = rhs._end; + rhs._end = nullptr; + return *this; + } + + FileList ListFiles( const char * directory, const char * extension ) + { + int numFiles{}; + auto files = FS_ListFiles( directory, extension, &numFiles ); + return FileList{ files, numFiles }; + } +} diff --git a/shared/qcommon/safe/files.h b/shared/qcommon/safe/files.h new file mode 100644 index 0000000000..eae1adbc39 --- /dev/null +++ b/shared/qcommon/safe/files.h @@ -0,0 +1,55 @@ +#pragma once + +#include +#include + +namespace FS +{ + class FileList + { + friend FileList ListFiles( const char*, const char* ); + public: + FileList() noexcept = default; + ~FileList() noexcept; + // noncopyable + FileList( const FileList& ) = delete; + FileList& operator=( const FileList& ) = delete; + // movable + FileList( FileList&& rhs ) noexcept; + FileList& operator=( FileList&& rhs ) noexcept; + + const char *const *begin() const noexcept + { + return _begin; + } + const char *const *end() const noexcept + { + return _end; + } + std::size_t size() const noexcept + { + return static_cast< std::size_t >( _end - _begin ); + } + + private: + // called by ListFiles(), which is a friend. + FileList( char** files, int numFiles ) noexcept; + + private: + // TODO: this should really be const; it's a matter of making FS_ListFiles' result const. + char** _begin = nullptr; + const char* const* _end = nullptr; + }; + + /** + @brief Returns a list of the files in a directory. + + The returned files will not include any directories or `/`. + + @note ERR_FATAL if called before file system initialization + @todo Which is it? Returns no directories at all, or returns them when looking for extension "/"? + @param directory should not have either a leading or trailing / + @param extension if "/", only subdirectories will be returned + */ + FileList ListFiles( const char* directory, const char* extension ); +} From 7ea7d9e965f5260858f4babc773f1deeb3e2778d Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Mon, 26 Oct 2015 23:03:17 +0100 Subject: [PATCH 022/445] FS::ReadFile(), replacing FS_AutoReadFile --- code/qcommon/qcommon.h | 9 ------ codemp/qcommon/qcommon.h | 9 ------ shared/qcommon/safe/files.cpp | 54 +++++++++++++++++++++++++++++++++-- shared/qcommon/safe/files.h | 47 +++++++++++++++++++++++++++--- 4 files changed, 94 insertions(+), 25 deletions(-) diff --git a/code/qcommon/qcommon.h b/code/qcommon/qcommon.h index 612c387ebb..58b4381f6f 100644 --- a/code/qcommon/qcommon.h +++ b/code/qcommon/qcommon.h @@ -511,15 +511,6 @@ void FS_ForceFlush( fileHandle_t f ); void FS_FreeFile( void *buffer ); // frees the memory returned by FS_ReadFile -class FS_AutoFreeFile { -private: - FS_AutoFreeFile(); - void *buffer; -public: - FS_AutoFreeFile(void *inbuf) : buffer(inbuf) { }; - ~FS_AutoFreeFile() { if (buffer) FS_FreeFile(buffer); }; -}; - void FS_WriteFile( const char *qpath, const void *buffer, int size ); // writes a complete file, creating any subdirectories needed diff --git a/codemp/qcommon/qcommon.h b/codemp/qcommon/qcommon.h index 874b4c71d4..b7d0a9a302 100644 --- a/codemp/qcommon/qcommon.h +++ b/codemp/qcommon/qcommon.h @@ -633,15 +633,6 @@ void FS_ForceFlush( fileHandle_t f ); void FS_FreeFile( void *buffer ); // frees the memory returned by FS_ReadFile -class FS_AutoFreeFile { -private: - FS_AutoFreeFile(); - void *buffer; -public: - FS_AutoFreeFile(void *inbuf) : buffer(inbuf) { }; - ~FS_AutoFreeFile() { if (buffer) FS_FreeFile(buffer); }; -}; - void FS_WriteFile( const char *qpath, const void *buffer, int size ); // writes a complete file, creating any subdirectories needed diff --git a/shared/qcommon/safe/files.cpp b/shared/qcommon/safe/files.cpp index d84e1e3019..badcd7d828 100644 --- a/shared/qcommon/safe/files.cpp +++ b/shared/qcommon/safe/files.cpp @@ -4,14 +4,54 @@ namespace FS { - FileList::~FileList() noexcept + // FileBuffer + + FileBuffer::FileBuffer( void* buffer, const long size ) noexcept + : _buffer( buffer ) + , _size( size ) { - if( _begin ) + assert( buffer != nullptr || size == 0 ); + assert( size >= 0 ); + } + + FileBuffer::~FileBuffer() noexcept + { + if( _buffer ) { - FS_FreeFileList( _begin ); + FS_FreeFile( _buffer ); + } + } + + FileBuffer::FileBuffer( FileBuffer&& rhs ) noexcept + : _buffer( rhs._buffer ) + , _size( rhs._size ) + { + rhs._buffer = nullptr; + rhs._size = 0; + } + + FileBuffer& FileBuffer::operator=( FileBuffer&& rhs ) noexcept + { + if( _buffer ) + { + FS_FreeFile( _buffer ); } + _buffer = rhs._buffer; + rhs._buffer = nullptr; + _size = rhs._size; + rhs._size = 0; + return *this; } + FileBuffer ReadFile( const char* path ) + { + void* buffer; + const long size = FS_ReadFile( path, &buffer ); + return size >= 0 ? FileBuffer{ buffer, size } : FileBuffer{}; + } + + // FileList + FileList::FileList( char** files, int numFiles ) noexcept : _begin( files ) , _end( files + numFiles ) @@ -19,6 +59,14 @@ namespace FS assert( numFiles >= 0 ); } + FileList::~FileList() noexcept + { + if( _begin ) + { + FS_FreeFileList( _begin ); + } + } + FileList::FileList( FileList&& rhs ) noexcept : _begin( rhs._begin ) , _end( rhs._end ) diff --git a/shared/qcommon/safe/files.h b/shared/qcommon/safe/files.h index eae1adbc39..bb48a633d0 100644 --- a/shared/qcommon/safe/files.h +++ b/shared/qcommon/safe/files.h @@ -3,11 +3,54 @@ #include #include +/** +@file RAII C++ bindings for filesystem operations +*/ + namespace FS { + class FileBuffer + { + friend FileBuffer ReadFile( const char* ); + // called by ReadFile() + FileBuffer( void* buffer, const long size ) noexcept; + public: + FileBuffer() noexcept = default; + ~FileBuffer() noexcept; + // noncopyable + FileBuffer( const FileBuffer& ) = delete; + FileBuffer& operator=( const FileBuffer& ) = delete; + // movable + FileBuffer( FileBuffer&& rhs ) noexcept; + FileBuffer& operator=( FileBuffer&& rhs ) noexcept; + + /// nullptr if no such file + const char* begin() const noexcept + { + return static_cast< const char* >( _buffer ); + } + const char* end() const noexcept + { + return static_cast< const char* >( _buffer ) + _size; + } + long size() const noexcept + { + return _size; + } + + private: + // TODO: ought to be const; would have to fix FS_ReadFile though. + void* _buffer = nullptr; + long _size = 0; + }; + + FileBuffer ReadFile( const char* path ); + class FileList { friend FileList ListFiles( const char*, const char* ); + // called by ListFiles() + FileList( char** files, int numFiles ) noexcept; public: FileList() noexcept = default; ~FileList() noexcept; @@ -30,10 +73,6 @@ namespace FS { return static_cast< std::size_t >( _end - _begin ); } - - private: - // called by ListFiles(), which is a friend. - FileList( char** files, int numFiles ) noexcept; private: // TODO: this should really be const; it's a matter of making FS_ListFiles' result const. From b8907436ea8c8c247fd1d14654648daccef60f6a Mon Sep 17 00:00:00 2001 From: Razish Date: Tue, 20 Oct 2015 06:11:25 +1100 Subject: [PATCH 023/445] [SP] Rewrite filesystem initialisation assertion checks and fix an issue with writing the qconsole log when filesystem is not initialised --- code/qcommon/common.cpp | 2 +- code/qcommon/files.cpp | 79 +++++++++++++---------------------------- 2 files changed, 25 insertions(+), 56 deletions(-) diff --git a/code/qcommon/common.cpp b/code/qcommon/common.cpp index 1b62eb3feb..bb649f93da 100644 --- a/code/qcommon/common.cpp +++ b/code/qcommon/common.cpp @@ -162,7 +162,7 @@ void QDECL Com_Printf( const char *fmt, ... ) { // logfile if ( com_logfile && com_logfile->integer ) { - if ( !logfile ) { + if ( !logfile && FS_Initialized() ) { logfile = FS_FOpenFileWrite( "qconsole.log" ); if ( com_logfile->integer > 1 ) { // force it to not buffer so we get valid diff --git a/code/qcommon/files.cpp b/code/qcommon/files.cpp index 15cce4619f..69e3df8cf1 100644 --- a/code/qcommon/files.cpp +++ b/code/qcommon/files.cpp @@ -295,6 +295,12 @@ qboolean FS_Initialized( void ) { return (qboolean)(fs_searchpaths != NULL); } +static void FS_AssertInitialised( void ) { + if ( !fs_searchpaths ) { + Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); + } +} + /* ================ return a hash value for the filename @@ -640,9 +646,7 @@ void FS_DeleteUserGenFile( const char *filename ) { qboolean FS_MoveUserGenFile( const char *filename_src, const char *filename_dst ) { char *from_ospath, *to_ospath; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); // don't let sound stutter S_ClearSoundBuffer(); @@ -774,9 +778,7 @@ fileHandle_t FS_SV_FOpenFileWrite( const char *filename ) { char *ospath; fileHandle_t f; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); ospath = FS_BuildOSPath( fs_homepath->string, filename, "" ); ospath[strlen(ospath)-1] = '\0'; @@ -817,9 +819,7 @@ int FS_SV_FOpenFileRead( const char *filename, fileHandle_t *fp ) { char *ospath; fileHandle_t f = 0; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); f = FS_HandleForFile(); fsh[f].zipFile = qfalse; @@ -900,9 +900,7 @@ FS_SV_Rename void FS_SV_Rename( const char *from, const char *to, qboolean safe ) { char *from_ospath, *to_ospath; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); // don't let sound stutter S_ClearSoundBuffer(); @@ -936,9 +934,7 @@ FS_Rename void FS_Rename( const char *from, const char *to ) { char *from_ospath, *to_ospath; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); // don't let sound stutter S_ClearSoundBuffer(); @@ -979,9 +975,7 @@ There are three cases handled: =========== */ void FS_FCloseFile( fileHandle_t f ) { - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if (fsh[f].zipFile == qtrue) { unzCloseCurrentFile( fsh[f].handleFiles.file.z ); @@ -1009,9 +1003,7 @@ fileHandle_t FS_FOpenFileWrite( const char *filename, qboolean safe ) { char *ospath; fileHandle_t f; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); f = FS_HandleForFile(); fsh[f].zipFile = qfalse; @@ -1054,9 +1046,7 @@ fileHandle_t FS_FOpenFileAppend( const char *filename ) { char *ospath; fileHandle_t f; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); f = FS_HandleForFile(); fsh[f].zipFile = qfalse; @@ -1271,9 +1261,7 @@ long FS_FOpenFileRead( const char *filename, fileHandle_t *file, qboolean unique hash = 0; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if ( file == NULL ) { Com_Error( ERR_FATAL, "FS_FOpenFileRead: NULL 'file' parameter passed\n" ); @@ -1490,9 +1478,7 @@ int FS_Read( void *buffer, int len, fileHandle_t f ) { byte *buf; int tries; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if ( !f ) { return 0; @@ -1544,9 +1530,7 @@ int FS_Write( const void *buffer, int len, fileHandle_t h ) { int tries; FILE *f; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if ( !h ) { return 0; @@ -1605,10 +1589,7 @@ FS_Seek int FS_Seek( fileHandle_t f, long offset, int origin ) { int _origin; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - return -1; - } + FS_AssertInitialised(); if (fsh[f].zipFile == qtrue) { //FIXME: this is really, really crappy @@ -1706,9 +1687,7 @@ int FS_FileIsInPAK(const char *filename ) { fileInPack_t *pakFile; long hash = 0; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if ( !filename ) { Com_Error( ERR_FATAL, "FS_FOpenFileRead: NULL 'filename' parameter passed\n" ); @@ -1765,9 +1744,7 @@ long FS_ReadFile( const char *qpath, void **buffer ) { byte* buf; long len; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if ( !qpath || !qpath[0] ) { Com_Error( ERR_FATAL, "FS_ReadFile with empty name\n" ); @@ -1823,9 +1800,7 @@ FS_FreeFile ============= */ void FS_FreeFile( void *buffer ) { - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if ( !buffer ) { Com_Error( ERR_FATAL, "FS_FreeFile( NULL )" ); } @@ -1843,9 +1818,7 @@ Filename are reletive to the quake search path void FS_WriteFile( const char *qpath, const void *buffer, int size ) { fileHandle_t f; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if ( !qpath || !buffer ) { Com_Error( ERR_FATAL, "FS_WriteFile: NULL parameter" ); @@ -2067,9 +2040,7 @@ char **FS_ListFilteredFiles( const char *path, const char *extension, char *filt fileInPack_t *buildBuffer; char zpath[MAX_ZPATH]; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if ( !path ) { *numfiles = 0; @@ -2187,9 +2158,7 @@ void FS_FreeFileList( char **fileList ) { //rwwRMG - changed to fileList to not conflict with list type int i; - if ( !fs_searchpaths ) { - Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); - } + FS_AssertInitialised(); if ( !fileList ) { return; From e00a7df65aac75b175b8dea40b9fc1f60ecdaf70 Mon Sep 17 00:00:00 2001 From: Razish Date: Tue, 27 Oct 2015 01:26:17 +1100 Subject: [PATCH 024/445] [MP] Add font aspect-ratio correction and expose floating point width calculation to engine/cgame/ui Bumps CGAME_API_VERSION, UI_API_VERSION, REF_API_VERSION --- codemp/cgame/cg_main.c | 2 + codemp/cgame/cg_public.h | 6 ++- codemp/cgame/cg_syscalls.c | 12 +++++- codemp/client/cl_cgameapi.cpp | 2 + codemp/client/cl_uiapi.cpp | 2 + codemp/rd-common/tr_font.cpp | 76 ++++++++++++++++++++--------------- codemp/rd-common/tr_font.h | 3 +- codemp/rd-common/tr_public.h | 9 ++++- codemp/rd-vanilla/tr_init.cpp | 5 +++ codemp/rd-vanilla/tr_local.h | 2 + codemp/ui/ui_main.c | 1 + codemp/ui/ui_public.h | 6 ++- codemp/ui/ui_shared.h | 4 ++ codemp/ui/ui_syscalls.c | 14 ++++++- 14 files changed, 103 insertions(+), 41 deletions(-) diff --git a/codemp/cgame/cg_main.c b/codemp/cgame/cg_main.c index c6703a160c..dab48832d0 100644 --- a/codemp/cgame/cg_main.c +++ b/codemp/cgame/cg_main.c @@ -2372,6 +2372,8 @@ void CG_LoadHudMenu() cgDC.stopCinematic = &CG_StopCinematic; cgDC.drawCinematic = &CG_DrawCinematic; cgDC.runCinematicFrame = &CG_RunCinematicFrame; + cgDC.ext.Font_StrLenPixels = trap->ext.R_Font_StrLenPixels; + Init_Display(&cgDC); diff --git a/codemp/cgame/cg_public.h b/codemp/cgame/cg_public.h index 8b32ca61dd..36a273b05c 100644 --- a/codemp/cgame/cg_public.h +++ b/codemp/cgame/cg_public.h @@ -23,7 +23,7 @@ along with this program; if not, see . #pragma once -#define CGAME_API_VERSION 1 +#define CGAME_API_VERSION 2 #define CMD_BACKUP 64 #define CMD_MASK (CMD_BACKUP - 1) @@ -713,6 +713,10 @@ typedef struct cgameImport_s { void (*G2API_CleanEntAttachments) ( void ); qboolean (*G2API_OverrideServer) ( void *serverInstance ); void (*G2API_GetSurfaceName) ( void *ghoul2, int surfNumber, int modelIndex, char *fillBuf ); + + struct { + float (*R_Font_StrLenPixels) ( const char *text, const int iFontIndex, const float scale ); + } ext; } cgameImport_t; typedef struct cgameExport_s { diff --git a/codemp/cgame/cg_syscalls.c b/codemp/cgame/cg_syscalls.c index 36b1069d83..bb056edcd0 100644 --- a/codemp/cgame/cg_syscalls.c +++ b/codemp/cgame/cg_syscalls.c @@ -219,7 +219,12 @@ qhandle_t trap_R_RegisterShaderNoMip( const char *name ) { qhandle_t trap_R_RegisterFont( const char *fontName ) { return Q_syscall( CG_R_REGISTERFONT, fontName); } -int trap_R_Font_StrLenPixels(const char *text, const int iFontIndex, const float scale) { +int trap_R_Font_StrLenPixels(const char *text, const int iFontIndex, const float scale) { + //HACK! RE_Font_StrLenPixels works better with 1.0f scale + float width = (float)Q_syscall( CG_R_FONT_STRLENPIXELS, text, iFontIndex, PASSFLOAT(1.0f)); + return width * scale; +} +float trap_R_Font_StrLenPixelsFloat(const char *text, const int iFontIndex, const float scale) { //HACK! RE_Font_StrLenPixels works better with 1.0f scale float width = (float)Q_syscall( CG_R_FONT_STRLENPIXELS, text, iFontIndex, PASSFLOAT(1.0f)); return width * scale; @@ -228,7 +233,8 @@ int trap_R_Font_StrLenChars(const char *text) { return Q_syscall( CG_R_FONT_STRLENCHARS, text); } int trap_R_Font_HeightPixels(const int iFontIndex, const float scale) { - return Q_syscall( CG_R_FONT_STRHEIGHTPIXELS, iFontIndex, PASSFLOAT(scale)); + float height = (float)Q_syscall( CG_R_FONT_STRHEIGHTPIXELS, iFontIndex, PASSFLOAT(1.0f) ); + return height * scale; } void trap_R_Font_DrawString(int ox, int oy, const char *text, const float *rgba, const int setIndex, int iCharLimit, const float scale) { Q_syscall( CG_R_FONT_DRAWSTRING, ox, oy, text, rgba, setIndex, iCharLimit, PASSFLOAT(scale)); @@ -936,4 +942,6 @@ static void TranslateSyscalls( void ) { trap->G2API_CleanEntAttachments = trap_G2API_CleanEntAttachments; trap->G2API_OverrideServer = trap_G2API_OverrideServer; trap->G2API_GetSurfaceName = trap_G2API_GetSurfaceName; + + trap->ext.R_Font_StrLenPixels = trap_R_Font_StrLenPixelsFloat; } diff --git a/codemp/client/cl_cgameapi.cpp b/codemp/client/cl_cgameapi.cpp index 48e33debac..4d1d0bbae9 100644 --- a/codemp/client/cl_cgameapi.cpp +++ b/codemp/client/cl_cgameapi.cpp @@ -1858,6 +1858,8 @@ void CL_BindCGame( void ) { cgi.G2API_OverrideServer = CL_G2API_OverrideServer; cgi.G2API_GetSurfaceName = CL_G2API_GetSurfaceName; + cgi.ext.R_Font_StrLenPixels = re->ext.Font_StrLenPixels; + GetCGameAPI = (GetCGameAPI_t)cgvm->GetModuleAPI; ret = GetCGameAPI( CGAME_API_VERSION, &cgi ); if ( !ret ) { diff --git a/codemp/client/cl_uiapi.cpp b/codemp/client/cl_uiapi.cpp index 8921aa610c..70cfab4aad 100644 --- a/codemp/client/cl_uiapi.cpp +++ b/codemp/client/cl_uiapi.cpp @@ -1194,6 +1194,8 @@ void CL_BindUI( void ) { uii.G2API_GetSurfaceName = CL_G2API_GetSurfaceName; uii.G2API_AttachG2Model = CL_G2API_AttachG2Model; + uii.ext.R_Font_StrLenPixels = re->ext.Font_StrLenPixels; + GetUIAPI = (GetUIAPI_t)uivm->GetModuleAPI; ret = GetUIAPI( UI_API_VERSION, &uii ); if ( !ret ) { diff --git a/codemp/rd-common/tr_font.cpp b/codemp/rd-common/tr_font.cpp index 8c33625ed9..029ff208b6 100644 --- a/codemp/rd-common/tr_font.cpp +++ b/codemp/rd-common/tr_font.cpp @@ -1355,17 +1355,10 @@ CFontInfo *GetFont(int index) return pFont; } - -int RE_Font_StrLenPixels(const char *psText, const int iFontHandle, const float fScale) -{ - float fMaxWidth = 0.0f; - float fThisWidth = 0.0f; - CFontInfo *curfont; - - curfont = GetFont(iFontHandle); - if(!curfont) - { - return(0); +float RE_Font_StrLenPixelsNew( const char *psText, const int iFontHandle, const float fScale ) { + CFontInfo *curfont = GetFont(iFontHandle); + if ( !curfont ) { + return 0.0f; } float fScaleAsian = fScale; @@ -1374,42 +1367,52 @@ int RE_Font_StrLenPixels(const char *psText, const int iFontHandle, const float fScaleAsian = fScale * 0.75f; } - while(*psText) - { + float maxLineWidth = 0.0f; + float thisLineWidth = 0.0f; + while ( *psText ) { int iAdvanceCount; unsigned int uiLetter = AnyLanguage_ReadCharFromString( psText, &iAdvanceCount, NULL ); psText += iAdvanceCount; - if (uiLetter == '^' ) - { - if (*psText >= '0' && - *psText <= '9') - { + if ( uiLetter == '^' ) { + if ( *psText >= '0' && *psText <= '9' ) { uiLetter = AnyLanguage_ReadCharFromString( psText, &iAdvanceCount, NULL ); psText += iAdvanceCount; continue; } } - if (uiLetter == 0x0A) - { - fThisWidth = 0.0f; + if ( uiLetter == '\n' ) { + thisLineWidth = 0.0f; } - else - { - int iPixelAdvance = curfont->GetLetterHorizAdvance( uiLetter ); + else { + float iPixelAdvance = (float)curfont->GetLetterHorizAdvance( uiLetter ); float fValue = iPixelAdvance * ((uiLetter > (unsigned)g_iNonScaledCharRange) ? fScaleAsian : fScale); - fThisWidth += curfont->mbRoundCalcs ? Round( fValue ) : fValue; - if (fThisWidth > fMaxWidth) - { - fMaxWidth = fThisWidth; + + if ( r_aspectCorrectFonts->integer == 1 ) { + fValue *= ((float)(SCREEN_WIDTH * glConfig.vidHeight) / (float)(SCREEN_HEIGHT * glConfig.vidWidth)); + } + else if ( r_aspectCorrectFonts->integer == 2 ) { + fValue = ceilf( + fValue * ((float)(SCREEN_WIDTH * glConfig.vidHeight) / (float)(SCREEN_HEIGHT * glConfig.vidWidth)) + ); + } + thisLineWidth += curfont->mbRoundCalcs + ? roundf( fValue ) + : (r_aspectCorrectFonts->integer == 2) + ? ceilf( fValue ) + : fValue; + if ( thisLineWidth > maxLineWidth ) { + maxLineWidth = thisLineWidth; } } } + return maxLineWidth; +} - // using ceil because we need to make sure that all the text is contained within the integer pixel width we're returning - return (int)ceilf(fMaxWidth); +int RE_Font_StrLenPixels( const char *psText, const int iFontHandle, const float fScale ) { + return (int)ceilf( RE_Font_StrLenPixelsNew( psText, iFontHandle, fScale ) ); } // not really a font function, but keeps naming consistant... @@ -1652,8 +1655,17 @@ void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, c //lastcolour.c, hShader // qhandle_t hShader ); - - fx += fAdvancePixels; + if ( r_aspectCorrectFonts->integer == 1 ) { + fx += fAdvancePixels + * ((float)(SCREEN_WIDTH * glConfig.vidHeight) / (float)(SCREEN_HEIGHT * glConfig.vidWidth)); + } + else if ( r_aspectCorrectFonts->integer == 2 ) { + fx += ceilf( fAdvancePixels + * ((float)(SCREEN_WIDTH * glConfig.vidHeight) / (float)(SCREEN_HEIGHT * glConfig.vidWidth)) ); + } + else { + fx += fAdvancePixels; + } } break; } diff --git a/codemp/rd-common/tr_font.h b/codemp/rd-common/tr_font.h index 0017e18395..d8e073d7d8 100644 --- a/codemp/rd-common/tr_font.h +++ b/codemp/rd-common/tr_font.h @@ -33,7 +33,8 @@ along with this program; if not, see . void R_ShutdownFonts(void); void R_InitFonts(void); int RE_RegisterFont(const char *psName); -int RE_Font_StrLenPixels(const char *psText, const int iFontHandle, const float fScale = 1.0f); +float RE_Font_StrLenPixelsNew( const char *psText, const int iFontHandle, const float fScale = 1.0f ); +int RE_Font_StrLenPixels( const char *psText, const int iFontHandle, const float fScale = 1.0f ); int RE_Font_StrLenChars(const char *psText); int RE_Font_HeightPixels(const int iFontHandle, const float fScale = 1.0f); void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, const int iFontHandle, int iMaxPixelWidth, const float fScale = 1.0f); diff --git a/codemp/rd-common/tr_public.h b/codemp/rd-common/tr_public.h index ac62599d31..9da97cad63 100644 --- a/codemp/rd-common/tr_public.h +++ b/codemp/rd-common/tr_public.h @@ -30,7 +30,7 @@ along with this program; if not, see . #include "../qcommon/qcommon.h" #include "../ghoul2/ghoul2_shared.h" -#define REF_API_VERSION 7 +#define REF_API_VERSION 8 // // these are the functions exported by the refresh module @@ -239,7 +239,12 @@ typedef struct refexport_s { int (*G2API_GetNumGoreMarks) ( CGhoul2Info_v& ghoul2, int modelIndex ); void (*G2API_AddSkinGore) ( CGhoul2Info_v &ghoul2, SSkinGoreData &gore ); void (*G2API_ClearSkinGore) ( CGhoul2Info_v &ghoul2 ); - #endif // _SOF2 + #endif // _G2_GORE + + struct { + float (*Font_StrLenPixels) ( const char *text, const int iFontIndex, const float scale ); + } ext; + } refexport_t; // diff --git a/codemp/rd-vanilla/tr_init.cpp b/codemp/rd-vanilla/tr_init.cpp index 22bc59327b..a9aeb5aa54 100644 --- a/codemp/rd-vanilla/tr_init.cpp +++ b/codemp/rd-vanilla/tr_init.cpp @@ -164,6 +164,8 @@ cvar_t *r_debugSort; cvar_t *r_marksOnTriangleMeshes; +cvar_t *r_aspectCorrectFonts; + // the limits apply to the sum of all scenes in a frame -- // the main view, all the 3D icons, etc #define DEFAULT_MAX_POLYS 600 @@ -1646,6 +1648,7 @@ void R_Register( void ) r_shadows = ri->Cvar_Get( "cg_shadows", "1", CVAR_NONE ); r_shadowRange = ri->Cvar_Get( "r_shadowRange", "1000", CVAR_NONE ); r_marksOnTriangleMeshes = ri->Cvar_Get( "r_marksOnTriangleMeshes", "0", CVAR_ARCHIVE ); + r_aspectCorrectFonts = ri->Cvar_Get( "r_aspectCorrectFonts", "0", CVAR_ARCHIVE ); r_maxpolys = ri->Cvar_Get( "r_maxpolys", XSTRING( DEFAULT_MAX_POLYS ), CVAR_NONE ); r_maxpolyverts = ri->Cvar_Get( "r_maxpolyverts", XSTRING( DEFAULT_MAX_POLYVERTS ), CVAR_NONE ); /* @@ -2129,6 +2132,8 @@ Q_EXPORT refexport_t* QDECL GetRefAPI( int apiVersion, refimport_t *rimp ) { // this is set in R_Init //re.G2VertSpaceServer = G2VertSpaceServer; + re.ext.Font_StrLenPixels = RE_Font_StrLenPixelsNew; + return &re; } diff --git a/codemp/rd-vanilla/tr_local.h b/codemp/rd-vanilla/tr_local.h index 6c47877d12..da275d2c77 100644 --- a/codemp/rd-vanilla/tr_local.h +++ b/codemp/rd-vanilla/tr_local.h @@ -1225,6 +1225,8 @@ extern cvar_t *r_debugSort; extern cvar_t *r_marksOnTriangleMeshes; +extern cvar_t *r_aspectCorrectFonts; + /* Ghoul2 Insert Start */ diff --git a/codemp/ui/ui_main.c b/codemp/ui/ui_main.c index 21f28b1cd6..6d9515a96c 100644 --- a/codemp/ui/ui_main.c +++ b/codemp/ui/ui_main.c @@ -9898,6 +9898,7 @@ void UI_Init( qboolean inGameLoad ) { uiInfo.uiDC.stopCinematic = &UI_StopCinematic; uiInfo.uiDC.drawCinematic = &UI_DrawCinematic; uiInfo.uiDC.runCinematicFrame = &UI_RunCinematicFrame; + uiInfo.uiDC.ext.Font_StrLenPixels = trap->ext.R_Font_StrLenPixels; Init_Display(&uiInfo.uiDC); diff --git a/codemp/ui/ui_public.h b/codemp/ui/ui_public.h index d03305167b..4a1f2d747b 100644 --- a/codemp/ui/ui_public.h +++ b/codemp/ui/ui_public.h @@ -23,7 +23,7 @@ along with this program; if not, see . #pragma once -#define UI_API_VERSION 1 +#define UI_API_VERSION 2 #define UI_LEGACY_API_VERSION 7 typedef struct uiClientState_s { @@ -370,6 +370,10 @@ typedef struct uiImport_s { void (*G2API_GetSurfaceName) ( void *ghoul2, int surfNumber, int modelIndex, char *fillBuf ); qboolean (*G2API_SetSkin) ( void *ghoul2, int modelIndex, qhandle_t customSkin, qhandle_t renderSkin ); qboolean (*G2API_AttachG2Model) ( void *ghoul2From, int modelIndexFrom, void *ghoul2To, int toBoltIndex, int toModel ); + + struct { + float (*R_Font_StrLenPixels) ( const char *text, const int iFontIndex, const float scale ); + } ext; } uiImport_t; typedef struct uiExport_s { diff --git a/codemp/ui/ui_shared.h b/codemp/ui/ui_shared.h index 005e56cff8..5e74993890 100644 --- a/codemp/ui/ui_shared.h +++ b/codemp/ui/ui_shared.h @@ -485,6 +485,10 @@ typedef struct displayContextDef_s { qhandle_t gradientImage; qhandle_t cursor; float FPS; + + struct { + float (*Font_StrLenPixels) ( const char *text, const int iFontIndex, const float scale ); + } ext; } displayContextDef_t; diff --git a/codemp/ui/ui_syscalls.c b/codemp/ui/ui_syscalls.c index aac79fff5a..3841266b40 100644 --- a/codemp/ui/ui_syscalls.c +++ b/codemp/ui/ui_syscalls.c @@ -113,13 +113,21 @@ qhandle_t trap_R_RegisterFont( const char *fontName ) { return Q_syscall( UI_R_REGISTERFONT, fontName); } int trap_R_Font_StrLenPixels(const char *text, const int iFontIndex, const float scale) { - return Q_syscall( UI_R_FONT_STRLENPIXELS, text, iFontIndex, PASSFLOAT(scale)); + //HACK! RE_Font_StrLenPixels works better with 1.0f scale + float width = (float)Q_syscall( UI_R_FONT_STRLENPIXELS, text, iFontIndex, PASSFLOAT(1.0f)); + return width * scale; +} +float trap_R_Font_StrLenPixelsFloat(const char *text, const int iFontIndex, const float scale) { + //HACK! RE_Font_StrLenPixels works better with 1.0f scale + float width = (float)Q_syscall( UI_R_FONT_STRLENPIXELS, text, iFontIndex, PASSFLOAT(1.0f)); + return width * scale; } int trap_R_Font_StrLenChars(const char *text) { return Q_syscall( UI_R_FONT_STRLENCHARS, text); } int trap_R_Font_HeightPixels(const int iFontIndex, const float scale) { - return Q_syscall( UI_R_FONT_STRHEIGHTPIXELS, iFontIndex, PASSFLOAT(scale)); + float height = (float)Q_syscall( UI_R_FONT_STRHEIGHTPIXELS, iFontIndex, PASSFLOAT( 1.0f ) ); + return height * scale; } void trap_R_Font_DrawString(int ox, int oy, const char *text, const float *rgba, const int setIndex, int iCharLimit, const float scale) { Q_syscall( UI_R_FONT_DRAWSTRING, ox, oy, text, rgba, setIndex, iCharLimit, PASSFLOAT(scale)); @@ -627,4 +635,6 @@ static void TranslateSyscalls( void ) { trap->G2API_IKMove = trap_G2API_IKMove; trap->G2API_GetSurfaceName = trap_G2API_GetSurfaceName; trap->G2API_AttachG2Model = trap_G2API_AttachG2Model; + + trap->ext.R_Font_StrLenPixels = trap_R_Font_StrLenPixelsFloat; } From 4983e205b4511d5608651c2493e074518a0dfb5a Mon Sep 17 00:00:00 2001 From: dusty22 Date: Wed, 28 Oct 2015 18:58:57 -0400 Subject: [PATCH 025/445] stuff Some messy changes involving sniper shot dodging and AI jedi still evading even after dropping saber throws. --- CHANGELOG.txt | 43 +++++++++++++++++++--- code/game/AI_Jedi.cpp | 83 +++++++++++++++++++++++++++++++++++++----- code/game/g_main.cpp | 2 + code/game/g_shared.h | 3 +- code/game/wp_saber.cpp | 44 +++++++++++++++++++++- code/game/wp_saber.h | 1 + 6 files changed, 159 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index ab619224a2..93107a84b2 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,4 +1,35 @@ (Dusty's Patch changelog) +10/9/15 - +new cvars: +g_autoRoll - been there for a while, now works 100% correctly, if 1 +default JA behavior, if 0 you have to be holding USE to roll +g_char_forcePowerMax - requires level restart +g_char_forceRegen - requires level restart +g_char_parryBonus - +g_char_breakParryBonus - +all these affect the player's stats +g_saberForceDrains - if 1 special moves drain the amount of FP from the +next cvar, katas not affected +g_saberForceDrainAmount - if g_saberForceDrains is 1, special moves +drain this amount of FP, katas not affected +g_saberLockSuperBreaks - if 1 default JA behavior of saber locks, if 0 +no super breaks (1-hit KOs) ever happen after saber locks +g_saberLockStyle - dummy cvar. Later maybe make it so superbreaks happen +under certain conditions. + +Melee changes: +- Player gets a weaker version of melee katas now based on saber offense level (1 - punches and kicks, 2 - katas, 3 - spin kicks) +- Player melee katas have less range, must be aimed more precisely, and do not work on certain types of enemies unless g_debugmelee is on +- Spin kicks and the like are enabled for Saber Offense 3 +- Can do spin kicks on demand by holding Use and pressing the kick button, however this costs Force power + +other changes: +- QMax bugs and crashes fixed (wasn't ported properly from OpenJK) +- melee force users push back and dodge explosives better now, still +don't dodge saber throws yet... +- All sabers kick by default for their alternate attack, +forcefocus must be held to use Saber Throw + +----------------------------------------------------------------------- Only larger/more important changes recorded here: Gameplay mechanics - - Force Jump height for all levels increased by 25% @@ -20,12 +51,14 @@ Game additions - Things to do - -- Kick-Saber Throw alternate and Kata switch button -- Saber Offense controlling melee and kicking abilities +- Kick-Saber Throw alternate and Kata switch button - partial done +- Saber Offense controlling melee and kicking abilities - done - Savegame screenshots working in the loading screen -- handicap cvar going past 100, separate cvar for player HP and Shields -- g_autoRoll cvar, g_charForcePoints cvar, g_charForceRegen cvar -- have r_dynamicglowintensity cvar be archived +- handicap cvar going past 100, separate cvar for player HP and Shields - partial done +- g_autoRoll cvar, g_charForcePoints cvar, g_charForceRegen cvar - done +- have r_dynamicglowintensity cvar be archived - done +- NPCs surrender bettur +- Jedi saber throw evasion ------------------------------------------------------------------------------------------------------------------------- (OpenJK changelog) diff --git a/code/game/AI_Jedi.cpp b/code/game/AI_Jedi.cpp index 50fee7c28d..026b156e60 100644 --- a/code/game/AI_Jedi.cpp +++ b/code/game/AI_Jedi.cpp @@ -96,7 +96,9 @@ extern qboolean G_ClearLineOfSight(const vec3_t point1, const vec3_t point2, int extern cvar_t *g_saberRealisticCombat; extern cvar_t *d_slowmodeath; extern cvar_t *g_saberNewControlScheme; +extern cvar_t *g_forceNewPowers; extern int parryDebounce[]; +//extern int forcePowerNeeded[]; //FIXME doesn't point to anything //Locals static void Jedi_Aggression( gentity_t *self, int change ); @@ -2137,18 +2139,69 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in } else {//the player - if ( !(self->client->ps.forcePowersActive&(1<integer) { + if (self->client->ps.forcePowerLevel[FP_SPEED] < 2) { + return qfalse; + } + if (!(self->client->ps.forcePowersActive&(1 << FP_SPEED) || )) + {//not already in speed + if (!(self->client->ps.forcePower >= FORCE_POWER_MAX - 20)) + {//make sure we have adequate force power + return qfalse; + } + } + if (self->client->ps.forcePowersActive&(1 << FP_SPEED)) + {//in speed so drains are further reduced + if (self->client->ps.forcePowersActive&(1 << FP_SEE)) { + if (!(self->client->ps.forcePowerLevel[FP_SPEED] == 3 + && self->client->ps.forcePowerLevel[FP_SEE] == 3)) { + //we have both Sense 3 and Speed 3 active so no drain + } + } + else if (self->client->ps.forcePowerLevel[FP_SPEED] == 3) { + if (!(self->client->ps.forcePower > forcePowerNeeded[FP_SPEED] * 0.25)) + {//make sure we have it and have enough force power + return qfalse; + } + } + else if (self->client->ps.forcePowerLevel[FP_SPEED] > 1) { + if (!(self->client->ps.forcePower > forcePowerNeeded[FP_SPEED] * 0.5)) + {//make sure we have it and have enough force power + return qfalse; + } + } + } + //check force speed power level to determine if I should be able to dodge it + if (self->client->ps.forcePowersActive&(1 << FP_SPEED) + && self->client->ps.forcePowersActive&(1 << FP_SEE) + && self->client->ps.forcePowerLevel[FP_SPEED] == 3 + && self->client->ps.forcePowerLevel[FP_SEE] == 3) { + //always dodge + } + else if (self->client->ps.forcePowersActive&(1 << FP_SPEED) + && ucmd.buttons&BUTTON_USE) { + //dodge if holding use and in speed + } + else if (Q_irand(1, 10) > self->client->ps.forcePowerLevel[FP_SPEED]) //auto-dodge + {//more likely to fail on lower force speed level return qfalse; } } - //check force speed power level to determine if I should be able to dodge it - if ( Q_irand( 1, 10 ) > self->client->ps.forcePowerLevel[FP_SPEED] ) - {//more likely to fail on lower force speed level - return qfalse; + else { + if (!(self->client->ps.forcePowersActive&(1 << FP_SPEED))) + {//not already in speed + if (!WP_ForcePowerUsable(self, FP_SPEED, 0)) + {//make sure we have it and have enough force power + return qfalse; + } + } + //check force speed power level to determine if I should be able to dodge it + if (Q_irand(1, 10) > self->client->ps.forcePowerLevel[FP_SPEED]) + {//more likely to fail on lower force speed level + return qfalse; + } } + } if ( hitLoc == HL_NONE ) @@ -2299,7 +2352,7 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in } else {//player - ForceSpeed( self, 500 ); + ForceSpeed(self, 500); } WP_ForcePowerStop( self, FP_GRIP ); @@ -6719,6 +6772,18 @@ static void Jedi_Attack( void ) return; } } + else { + if (NPC->enemy && NPC->enemy->health > 0) + { + if (NPC->enemy->s.weapon == WP_SABER) + {//be sure to continue evasion even if can't pull back saber yet + vec3_t enemy_dir, enemy_movedir, enemy_dest; + float enemy_dist, enemy_movespeed; + Jedi_SetEnemyInfo(enemy_dest, enemy_dir, &enemy_dist, enemy_movedir, &enemy_movespeed, 300); + Jedi_EvasionSaber(enemy_movedir, enemy_dist, enemy_dir); + } + } + } } } } diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 0cbd9de0c8..07bf52bbca 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -212,6 +212,7 @@ cvar_t *g_saberForceDrains; cvar_t *g_saberForceDrainAmount; cvar_t *g_saberLockSuperBreaks; cvar_t *g_saberLockStyle; +cvar_t *g_forceNewPowers; //for character stats cvar_t *g_char_forcePowerMax; //only applies after re-loading level @@ -719,6 +720,7 @@ void G_InitCvars( void ) { g_saberForceDrains = gi.cvar("g_saberForceDrains", "1", CVAR_ARCHIVE | CVAR_CHEAT); g_saberForceDrainAmount = gi.cvar("g_saberForceDrainAmount", "10", CVAR_ARCHIVE | CVAR_CHEAT); g_saberDamageScale = gi.cvar("g_saberDamageScale", "1", CVAR_SAVEGAME | CVAR_CHEAT); + g_forceNewPowers = gi.cvar("g_forceNewPowers", "1", CVAR_ARCHIVE | CVAR_CHEAT); g_char_forcePowerMax = gi.cvar("g_char_forcePowerMax", "100", CVAR_CHEAT | CVAR_SAVEGAME ); g_char_forceRegen = gi.cvar("g_char_forceRegen", "100", CVAR_CHEAT | CVAR_SAVEGAME); g_char_parryBonus = gi.cvar("g_char_parryBonus", "0", CVAR_CHEAT | CVAR_SAVEGAME); diff --git a/code/game/g_shared.h b/code/game/g_shared.h index ac41f899d8..9e360d3cfb 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -685,7 +685,8 @@ Ghoul2 Insert End int saberReactivateTime; //time after something deactivates a saber for AI to turn it back on int breakLimit; int breakRecoveryTime; //how long left to recover a defense point - int breakCounter; //keeping track of how many strong attacks the defender blocks in a //a short time period + int breakCounter; //keeping track of how many strong attacks the defender blocks in a short time period + qboolean saberDropped; //did we drop our saber throw? //Unions for miscellaneous fields used under very specific circumstances union diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 16a35a5945..2bf3a73253 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -62,6 +62,8 @@ extern cvar_t *g_saberRestrictForce; extern cvar_t *g_saberPickuppableDroppedSabers; extern cvar_t *debug_subdivision; +extern cvar_t *g_forceNewPowers; + //new character cvars extern cvar_t *g_char_forcePowerMax; extern cvar_t *g_char_forceRegen; @@ -176,6 +178,8 @@ extern cvar_t *g_saberLockStyle; extern cvar_t *g_saberLockSuperBreaks; extern cvar_t *g_saberLocksEnabled; extern cvar_t *g_saberDamageScale; +extern cvar_t *g_forceNewPowers; +extern qboolean PM_DodgeAnim(int anim); extern int g_crosshairEntNum; qboolean g_saberNoEffects = qfalse; @@ -9616,7 +9620,16 @@ void WP_ForceKnockdown(gentity_t *self, gentity_t *pusher, qboolean pull, qboole } else { - addTime = Q_irand(-300, 300); + if (g_spskill->integer > 1 && self->NPC->rank > RANK_ENSIGN + && (self->client->NPC_class == CLASS_REBORN || self->client->NPC_class == CLASS_JEDI)) { + addTime = Q_irand(-400, 100); + } + else if (g_spskill->integer > 1 && self->NPC->aiFlags&NPCAI_BOSS_CHARACTER) { + addTime = Q_irand(-700, 0); + } + else { + addTime = Q_irand(-300, 300); + } } self->client->ps.legsAnimTimer += addTime; self->client->ps.torsoAnimTimer += addTime; @@ -13689,7 +13702,34 @@ void WP_ForcePowerDrain(gentity_t *self, forcePowers_t forcePower, int overrideA int drain = overrideAmt; if (!drain) { - drain = forcePowerNeeded[forcePower]; + if (g_forceNewPowers->integer) { + if (self->s.number < MAX_CLIENTS) { //player + if (PM_DodgeAnim(self->client->ps.torsoAnim)) { //we're doing a force speed dodge + if (self->client->ps.forcePowersActive&(1 << FP_SPEED)) { + if (self->client->ps.forcePowersActive&(1 << FP_SEE) + && self->client->ps.forcePowerLevel[FP_SPEED] == 3 + && self->client->ps.forcePowerLevel[FP_SEE] == 3) + drain = 0; //no drain if using Speed 3 + Sense 3 + } + else { + if (self->client->ps.forcePowerLevel[FP_SPEED] == 3) { + drain = forcePowerNeeded[forcePower] * 0.5; + } + else { //force speed 2 + drain = forcePowerNeeded[forcePower]; + } + } + } + } + else { + drain = forcePowerNeeded[forcePower]; + } + } + else { + drain = forcePowerNeeded[forcePower]; + } + + } if (!drain) { diff --git a/code/game/wp_saber.h b/code/game/wp_saber.h index 7b263c2b9d..6ce475f316 100644 --- a/code/game/wp_saber.h +++ b/code/game/wp_saber.h @@ -161,6 +161,7 @@ extern float forceJumpHeight[]; extern float forceJumpHeightMax[]; extern float forcePushPullRadius[]; +extern int forcePowerNeeded[]; //new extern void ForceSpeed( gentity_t *self, int duration = 0 ); extern float forceSpeedValue[]; From d455743cd7b3584b4a131f79fb758250f206c444 Mon Sep 17 00:00:00 2001 From: Razish Date: Sat, 31 Oct 2015 10:45:25 +1100 Subject: [PATCH 026/445] Rename sv_blockJumpSelect to sv_legacyFixForceSelect and fix out of bounds access. Properly fixes #467 for non OpenJK-based jampgame (e.g. base, ja+) --- codemp/qcommon/msg.cpp | 2 -- codemp/server/server.h | 2 +- codemp/server/sv_client.cpp | 4 ++++ codemp/server/sv_init.cpp | 2 +- codemp/server/sv_main.cpp | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/codemp/qcommon/msg.cpp b/codemp/qcommon/msg.cpp index bd235afc4b..ac178d342f 100644 --- a/codemp/qcommon/msg.cpp +++ b/codemp/qcommon/msg.cpp @@ -754,8 +754,6 @@ void MSG_ReadDeltaUsercmdKey( msg_t *msg, int key, usercmd_t *from, usercmd_t *t to->weapon = MSG_ReadDeltaKey( msg, key, from->weapon, 8); to->forcesel = MSG_ReadDeltaKey( msg, key, from->forcesel, 8); - if( sv_blockJumpSelect->integer && to->forcesel == 1 ) // FP_LEVIATHAN - to->forcesel = 0xFF; // (byte)-1 to->invensel = MSG_ReadDeltaKey( msg, key, from->invensel, 8); to->generic_cmd = MSG_ReadDeltaKey( msg, key, from->generic_cmd, 8); diff --git a/codemp/server/server.h b/codemp/server/server.h index 0b478e5c80..85177f4ab4 100644 --- a/codemp/server/server.h +++ b/codemp/server/server.h @@ -289,7 +289,7 @@ extern cvar_t *sv_filterCommands; extern cvar_t *sv_autoDemo; extern cvar_t *sv_autoDemoBots; extern cvar_t *sv_autoDemoMaxMaps; -extern cvar_t *sv_blockJumpSelect; +extern cvar_t *sv_legacyFixForceSelect; extern cvar_t *sv_banFile; extern serverBan_t serverBans[SERVER_MAXBANS]; diff --git a/codemp/server/sv_client.cpp b/codemp/server/sv_client.cpp index 80ff3cb167..59491f33e7 100644 --- a/codemp/server/sv_client.cpp +++ b/codemp/server/sv_client.cpp @@ -1503,6 +1503,10 @@ static void SV_UserMove( client_t *cl, msg_t *msg, qboolean delta ) { for ( i = 0 ; i < cmdCount ; i++ ) { cmd = &cmds[i]; MSG_ReadDeltaUsercmdKey( msg, key, oldcmd, cmd ); + if ( sv_legacyFixForceSelect->integer && (cmd->forcesel == FP_LEVITATION || cmd->forcesel >= NUM_FORCE_POWERS) ) + { + cmd->forcesel = 0xFFu; + } oldcmd = cmd; } diff --git a/codemp/server/sv_init.cpp b/codemp/server/sv_init.cpp index aed2b42452..d59b32e0a6 100644 --- a/codemp/server/sv_init.cpp +++ b/codemp/server/sv_init.cpp @@ -994,7 +994,7 @@ void SV_Init (void) { sv_autoDemoBots = Cvar_Get( "sv_autoDemoBots", "0", CVAR_ARCHIVE ); sv_autoDemoMaxMaps = Cvar_Get( "sv_autoDemoMaxMaps", "0", CVAR_ARCHIVE ); - sv_blockJumpSelect = Cvar_Get( "sv_blockJumpSelect", "1", CVAR_ARCHIVE ); + sv_legacyFixForceSelect = Cvar_Get( "sv_legacyFixForceSelect", "1", CVAR_ARCHIVE ); sv_banFile = Cvar_Get( "sv_banFile", "serverbans.dat", CVAR_ARCHIVE ); diff --git a/codemp/server/sv_main.cpp b/codemp/server/sv_main.cpp index 6542b39e51..a04c3791d7 100644 --- a/codemp/server/sv_main.cpp +++ b/codemp/server/sv_main.cpp @@ -62,7 +62,7 @@ cvar_t *sv_filterCommands; // strict filtering on commands (replace: \r \n ;) cvar_t *sv_autoDemo; cvar_t *sv_autoDemoBots; cvar_t *sv_autoDemoMaxMaps; -cvar_t *sv_blockJumpSelect; +cvar_t *sv_legacyFixForceSelect; cvar_t *sv_banFile; serverBan_t serverBans[SERVER_MAXBANS]; From 6d569e9d8fe2a3d4ec0d6af17e92fb9642139942 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 31 Oct 2015 09:17:48 +0100 Subject: [PATCH 027/445] const mismatch fix --- shared/qcommon/safe/files.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/qcommon/safe/files.h b/shared/qcommon/safe/files.h index bb48a633d0..9f8f3109a7 100644 --- a/shared/qcommon/safe/files.h +++ b/shared/qcommon/safe/files.h @@ -71,7 +71,7 @@ namespace FS } std::size_t size() const noexcept { - return static_cast< std::size_t >( _end - _begin ); + return static_cast< std::size_t >( _end - begin() ); } private: From 9a1f2247bf716300c9575dc6808020675b1f9565 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 31 Oct 2015 13:44:33 +0100 Subject: [PATCH 028/445] Fixed incorrect SP Engine safe file project file --- code/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 11b01ba0e0..5a061409f5 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -182,7 +182,7 @@ if(BuildSPEngine OR BuildJK2SPEngine) source_group("common" FILES ${SPEngineCommonFiles}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineCommonFiles}) - set(SPEngineSafeCommonFiles + set(SPEngineCommonSafeFiles "${SharedDir}/qcommon/safe/files.cpp" "${SharedDir}/qcommon/safe/files.h" ) From 7f6847fe5a00b83a8e7dcfa899be86ce115d0c61 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 31 Oct 2015 13:47:10 +0100 Subject: [PATCH 029/445] SP C++ Zone Allocation wrappers --- code/CMakeLists.txt | 1 + code/game/CMakeLists.txt | 6 +++ shared/qcommon/safe/memory.h | 85 ++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 shared/qcommon/safe/memory.h diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 5a061409f5..487025cc81 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -185,6 +185,7 @@ if(BuildSPEngine OR BuildJK2SPEngine) set(SPEngineCommonSafeFiles "${SharedDir}/qcommon/safe/files.cpp" "${SharedDir}/qcommon/safe/files.h" + "${SPDir}/qcommon/safe/memory.h" ) source_group("common/safe" FILES ${SPEngineCommonSafeFiles}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineCommonSafeFiles}) diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 8f9f835f90..ae188dc0ee 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -264,6 +264,12 @@ set(SPGameCommonFiles source_group("common" FILES ${SPGameCommonFiles}) set(SPGameFiles ${SPGameFiles} ${SPGameCommonFiles}) +set(SPGameCommonSafeFiles + "${SPDir}/qcommon/safe/memory.h" + ) +source_group("common/safe" FILES ${SPGameCommonSafeFiles}) +set(SPGameFiles ${SPGameFiles} ${SPGameCommonSafeFiles}) + set(SPGameIcarusFiles "${SPDir}/icarus/BlockStream.cpp" "${SPDir}/icarus/IcarusImplementation.cpp" diff --git a/shared/qcommon/safe/memory.h b/shared/qcommon/safe/memory.h new file mode 100644 index 0000000000..a34298ec80 --- /dev/null +++ b/shared/qcommon/safe/memory.h @@ -0,0 +1,85 @@ +#pragma once + +#ifdef _JK2EXE +# include "qcommon/qcommon.h" +#else +# include "qcommon/q_shared.h" +#endif + +#include +#include + +namespace Zone +{ + namespace detail + { + inline void* Malloc( int iSize, memtag_t eTag, bool bZeroit = false ) + { +#ifdef _JK2EXE + return Z_Malloc( iSize, eTag, bZeroit ); +#else + return gi.Malloc( iSize, eTag, bZeroit ); +#endif + } + inline int Free( void* pvAddress ) + { +#ifdef _JK2EXE + return Z_Free( pvAddress ); +#else + return gi.Free( pvAddress ); +#endif + } + } + /** + Zone Deleter - for use with smart pointers. + */ + struct Deleter + { + void operator()( void* memory ) const noexcept + { + detail::Free( memory ); + } + }; + + /** + Zone Allocator - for use with the STL + */ + template< typename T, memtag_t tag > + struct Allocator + { + using value_type = T; + using is_always_equal = std::true_type; + T* allocate( std::size_t n ) const + { + void* mem = detail::Malloc( n * sizeof( T ), tag ); + return static_cast< T* >( mem ); + } + void deallocate( T* mem, std::size_t n ) const noexcept + { + ZoneDeleter{}( mem ); + } + template< typename T2, memtag_t tag2 > + bool operator==( const Allocator< T2, tag2 >& ) const noexcept + { + return true; // free works regardless of size and tag + } + template< typename T2, memtag_t tag2 > + bool operator==( const Allocator< T2, tag2 >& ) const noexcept + { + return false; + } + }; + + /** + make_unique using Zone Allocations (with appropriate deleter) + */ + template< typename T, memtag_t tag, typename... Args > + inline std::unique_ptr< T, Deleter > make_unique( Args&&... args ) + { + std::unique_ptr< void, Deleter > memory( Allocator< T, tag >{}.allocate( 1 ) ); + // placement new. may throw, in which case the unique_ptr will take care of freeing the memory. + T* obj = new( memory )T( std::forward< Args >( args )... ); + memory.release(); + return std::unique_ptr< T, Deleter >( obj ); + } +} From b9d8664df8e596ed602d010c0e3158c5e4d90abb Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 31 Oct 2015 13:59:40 +0100 Subject: [PATCH 030/445] Fixed safe/memory.h being in wrong folder --- {shared => code}/qcommon/safe/memory.h | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {shared => code}/qcommon/safe/memory.h (100%) diff --git a/shared/qcommon/safe/memory.h b/code/qcommon/safe/memory.h similarity index 100% rename from shared/qcommon/safe/memory.h rename to code/qcommon/safe/memory.h From 45d3f5ae6a9f1a6281d5eb15b99ae9afebab3fe7 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 31 Oct 2015 14:59:41 +0100 Subject: [PATCH 031/445] Zone::Allocator: Fixed incorrect Deleter name --- code/qcommon/safe/memory.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/qcommon/safe/memory.h b/code/qcommon/safe/memory.h index a34298ec80..2c36111193 100644 --- a/code/qcommon/safe/memory.h +++ b/code/qcommon/safe/memory.h @@ -56,7 +56,7 @@ namespace Zone } void deallocate( T* mem, std::size_t n ) const noexcept { - ZoneDeleter{}( mem ); + Deleter{}( mem ); } template< typename T2, memtag_t tag2 > bool operator==( const Allocator< T2, tag2 >& ) const noexcept From ad3211882e7ce9383eedad1b8330498279df1ce3 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 31 Oct 2015 15:00:07 +0100 Subject: [PATCH 032/445] Zone::Allocator: Fixed operator!= being called operator== --- code/qcommon/safe/memory.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/qcommon/safe/memory.h b/code/qcommon/safe/memory.h index 2c36111193..30bee58165 100644 --- a/code/qcommon/safe/memory.h +++ b/code/qcommon/safe/memory.h @@ -64,7 +64,7 @@ namespace Zone return true; // free works regardless of size and tag } template< typename T2, memtag_t tag2 > - bool operator==( const Allocator< T2, tag2 >& ) const noexcept + bool operator!=( const Allocator< T2, tag2 >& ) const noexcept { return false; } From 7816af0400b02e3d4dda72ec1315f99be049b15b Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 31 Oct 2015 15:00:25 +0100 Subject: [PATCH 033/445] Zone::Allocator: Fixed MSVC choking on rebind --- code/qcommon/safe/memory.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/qcommon/safe/memory.h b/code/qcommon/safe/memory.h index 30bee58165..175cb971f7 100644 --- a/code/qcommon/safe/memory.h +++ b/code/qcommon/safe/memory.h @@ -68,6 +68,12 @@ namespace Zone { return false; } + // I think the standard guarantees automatic generation of this, but MSVC can't handle it. + template< typename U > + struct rebind + { + using other = Allocator< U, tag >; + }; }; /** From ea4ba47d66cf43fd42f182c5c6d721a58ae4b1d3 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 31 Oct 2015 13:57:05 +0100 Subject: [PATCH 034/445] Added GSL This is a fairly backwards-compatible implementation, so unlike Microsoft's version this still works on GCC 4.8. The GSL is the Guideline Support Library, which is encouraged to be used by modern C++ code to avoid bugs. It aids with static code analysis of the C++ Core Guidelines, which will hopefully eventually be adhered to throughout OpenJK. --- code/CMakeLists.txt | 3 +- code/game/CMakeLists.txt | 1 + lib/gsl-lite/LICENSE | 23 + lib/gsl-lite/include/gsl/gsl-lite.h | 881 ++++++++++++++++++++++++++++ lib/gsl-lite/readme.txt | 3 + 5 files changed, 910 insertions(+), 1 deletion(-) create mode 100644 lib/gsl-lite/LICENSE create mode 100644 lib/gsl-lite/include/gsl/gsl-lite.h create mode 100644 lib/gsl-lite/readme.txt diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 487025cc81..de5a5bde5f 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -41,7 +41,8 @@ if(BuildSPEngine OR BuildJK2SPEngine) set(SPEngineIncludeDirectories ${SPEngineIncludeDirectories} ${SharedDir} - ${SPDir}) + ${SPDir} + "${OpenJKLibDir}/gsl-lite/include") # Dependencies # OpenAL (is optionally included for Windows) diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index ae188dc0ee..8bd11c8072 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -26,6 +26,7 @@ set(SPGameIncludeDirectories ${SharedDir} ${SPDir} "${SPDir}/game" + "${OpenJKLibDir}/gsl-lite/include" ) if(WIN32) diff --git a/lib/gsl-lite/LICENSE b/lib/gsl-lite/LICENSE new file mode 100644 index 0000000000..7e4dcd588c --- /dev/null +++ b/lib/gsl-lite/LICENSE @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) 2015 Martin Moene +Copyright (c) 2015 Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/lib/gsl-lite/include/gsl/gsl-lite.h b/lib/gsl-lite/include/gsl/gsl-lite.h new file mode 100644 index 0000000000..0a99083e38 --- /dev/null +++ b/lib/gsl-lite/include/gsl/gsl-lite.h @@ -0,0 +1,881 @@ +// +// gsl-lite is based on GSL: Guidelines Support Library, +// https://github.com/microsoft/gsl +// +// Copyright (c) 2015 Martin Moene +// Copyright (c) 2015 Microsoft Corporation. All rights reserved. +// +// This code is licensed under the MIT License (MIT). +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#pragma once + +#ifndef GSL_GSL_LITE_H_INCLUDED +#define GSL_GSL_LITE_H_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include + +#define gsl_lite_VERSION "0.0.0" + +// Configuration: + +#ifndef gsl_FEATURE_HAVE_IMPLICIT_MACRO +# define gsl_FEATURE_HAVE_IMPLICIT_MACRO 1 +#endif + +#ifndef gsl_FEATURE_HAVE_OWNER_MACRO +# define gsl_FEATURE_HAVE_OWNER_MACRO 1 +#endif + +#ifndef gsl_CONFIG_THROWS_FOR_TESTING +# define gsl_CONFIG_THROWS_FOR_TESTING 0 +#endif + +#ifndef gsl_CONFIG_CONFIRMS_COMPILATION_ERRORS +# define gsl_CONFIG_CONFIRMS_COMPILATION_ERRORS 0 +#endif + +// Compiler detection: + +#if defined(_MSC_VER) +# define gsl_COMPILER_MSVC_VERSION (_MSC_VER / 100 - 5 - (_MSC_VER < 1900)) +#else +# define gsl_COMPILER_MSVC_VERSION 0 +# define gsl_COMPILER_NON_MSVC 1 +#endif + +#if ( __cplusplus >= 201103L ) +# define gsl_CPP11_OR_GREATER 1 +#endif + +#if ( __cplusplus >= 201402L ) +# define gsl_CPP14_OR_GREATER 1 +#endif + +// half-open range [lo..hi): +#define gsl_BETWEEN( v, lo, hi ) ( lo <= v && v < hi ) + +// Presence of C++ language features: + +#if gsl_CPP11_OR_GREATER +# define gsl_HAVE_ALIAS_TEMPLATE 1 +#endif + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 10 +# define gsl_HAVE_AUTO 1 +#endif + +#if gsl_CPP11_OR_GREATER +# define gsl_HAVE_CONSTEXPR_11 1 +#endif + +#if gsl_CPP14_OR_GREATER +# define gsl_HAVE_CONSTEXPR_14 1 +#endif + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 14 +# define gsl_HAVE_ENUM_CLASS 1 +#endif + +#if gsl_CPP11_OR_GREATER +# define gsl_HAVE_IS_DEFAULT_CTOR 1 +#endif + +#if gsl_CPP11_OR_GREATER +# define gsl_HAVE_EXPLICIT_CONVERSION 1 +#endif + +#if gsl_CPP11_OR_GREATER +# define gsl_HAVE_INITIALIZER_LIST 1 +#endif + +#if gsl_CPP11_OR_GREATER +# define gsl_HAVE_NOEXCEPT 1 +#endif + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 10 +# define gsl_HAVE_NULLPTR 1 +#endif + +// Presence of C++ library features: + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 11 +# define gsl_HAVE_ARRAY 1 +#endif + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 9 +# define gsl_HAVE_CONTAINER_DATA_METHOD 1 +#endif + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 14 +# define gsl_HAVE_SIZED_TYPES 1 +#endif + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 10 +# define gsl_HAVE_SHARED_PTR 1 +# define gsl_HAVE_UNIQUE_PTR 1 +#endif + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 11 +# define gsl_HAVE_TYPE_TRAITS 1 +#endif + +// For the rest, consider VC12, VC14 as C++11 for GSL Lite: + +#if gsl_COMPILER_MSVC_VERSION >= 12 +# undef gsl_CPP11_OR_GREATER +# define gsl_CPP11_OR_GREATER 1 +#endif + +// C++ feature usage: + +#if gsl_HAVE_CONSTEXPR_11 +# define gsl_constexpr constexpr +#else +# define gsl_constexpr /*nothing*/ +#endif + +#if gsl_HAVE_CONSTEXPR_14 +# define gsl_constexpr14 constexpr +#else +# define gsl_constexpr14 /*nothing*/ +#endif + +#if gsl_HAVE_EXPLICIT_CONVERSION +# define gsl_explicit explicit +#else +# define gsl_explicit /*nothing*/ +#endif + +#if gsl_FEATURE_HAVE_IMPLICIT_MACRO +# define implicit +#endif + +#if !gsl_HAVE_NOEXCEPT || gsl_CONFIG_THROWS_FOR_TESTING +# define gsl_noexcept /*nothing*/ +#else +# define gsl_noexcept noexcept +#endif + +#define gsl_DIMENSION_OF( a ) ( sizeof(a) / sizeof(0[a]) ) + +#if gsl_HAVE_ARRAY +# include +#endif + +#if gsl_HAVE_TYPE_TRAITS +# include +#endif + +namespace gsl { + +// +// GSL.owner: ownership pointers +// +#if gsl_HAVE_SHARED_PTR + using std::unique_ptr; + using std::shared_ptr; +#endif + +#if gsl_HAVE_ALIAS_TEMPLATE + template< class T > using owner = T; +#else + template< class T > struct owner { typedef T type; }; +#endif + +#define gsl_HAVE_OWNER_TEMPLATE gsl_HAVE_ALIAS_TEMPLATE + +#if gsl_FEATURE_HAVE_OWNER_MACRO +# if gsl_HAVE_OWNER_TEMPLATE +# define Owner(t) ::gsl::owner +# else +# define Owner(t) ::gsl::owner::type +# endif +#endif + +// +// GSL.assert: assertions +// +#define Expects(x) ::gsl::fail_fast_assert((x)) +#define Ensures(x) ::gsl::fail_fast_assert((x)) + +#if gsl_CONFIG_THROWS_FOR_TESTING + +struct fail_fast : public std::runtime_error +{ + fail_fast() + : std::runtime_error( "GSL assertion" ) {} + + explicit fail_fast( char const * const message ) + : std::runtime_error( message ) {} +}; + +inline void fail_fast_assert( bool cond ) +{ + if ( !cond ) + throw fail_fast(); +} + +inline void fail_fast_assert( bool cond, char const * const message ) +{ + if ( !cond ) + throw fail_fast( message ); +} + +#else // gsl_CONFIG_THROWS_FOR_TESTING + +inline void fail_fast_assert( bool cond ) +{ + if ( !cond ) + std::terminate(); +} + +inline void fail_fast_assert( bool cond, char const * const ) +{ + if ( !cond ) + std::terminate(); +} + +#endif // gsl_CONFIG_THROWS_FOR_TESTING + +// +// GSL.util: utilities +// + +#if gsl_CPP11_OR_GREATER + +template< class Fn > +class Final_act +{ +public: + explicit Final_act( Fn action ) gsl_noexcept + : action_( std::move( action ) ) {} + + ~Final_act() gsl_noexcept { action_(); } + +private: + Fn action_; +}; + +template< class Fn > +Final_act finally( Fn const & action ) gsl_noexcept +{ + return Final_act( action ); +} + +template< class Fn > +Final_act finally( Fn && action ) gsl_noexcept +{ + return Final_act( std::forward( action ) ); +} + +#else // gsl_CPP11_OR_GREATER + +class Final_act +{ +public: + typedef void (*Action)(); + + Final_act( Action action ) + : action_( action ) {} + + ~Final_act() + { + action_(); + } + +private: + Action action_; +}; + +template< class Fn > +Final_act finally( Fn const & f ) +{ + return Final_act(( f )); +} + +#endif // gsl_CPP11_OR_GREATER + +template< class T, class U > +T narrow_cast( U u ) gsl_noexcept +{ + return static_cast( u ); +} + +struct narrowing_error : public std::exception {}; + +template< class T, class U > +T narrow( U u ) +{ + T t = narrow_cast( u ); + + if ( static_cast( t ) != u ) + { + throw narrowing_error(); + } + return t; +} + +// +// GSL.views: views +// + +// +// at() - Bounds-checked way of accessing static arrays, std::array, std::vector. +// + +template< class T, size_t N > +T & at( T(&arr)[N], size_t index ) +{ + Expects( index < N ); + return arr[index]; +} + +#if gsl_HAVE_ARRAY + +template< class T, size_t N > +T & at( std::array & arr, size_t index ) +{ + Expects( index < N ); + return arr[index]; +} +#endif + +template< class Cont > +typename Cont::value_type & at( Cont & cont, size_t index ) +{ + Expects( index < cont.size() ); + return cont[index]; +} + +// +// not_null<> - Wrap any indirection and enforce non-null. +// +template +class not_null +{ +public: + not_null( T t ) : ptr_ ( t ){ Expects( ptr_ != NULL ); } + not_null & operator=( T const & t ) { ptr_ = t ; Expects( ptr_ != NULL ); return *this; } + + not_null( not_null const & other ) : ptr_ ( other.ptr_ ) {} + not_null & operator=( not_null const & other ) { ptr_ = other.ptr_; } + +#if gsl_HAVE_DEFAULT_FUNCTION_TEMPLATE_ARG + + template< typename U, typename Dummy = + typename std::enable_if::value, void>::type > + not_null( not_null const & other ) : ptr_( other.get() ) {} + + template< typename U, typename Dummy = + typename std::enable_if::value, void>::type > + not_null & operator=( not_null const & other ) + { + ptr_ = other.get(); + return *this; + } + +#else + + template< typename U > + not_null( not_null const & other ) : ptr_( other.get() ) {} + + template< typename U > + not_null & operator=( not_null const & other ) + { + ptr_ = other.get(); + return *this; + } +#endif + +private: + // Prevent compilation when initialized with a nullptr or literal 0: +#if gsl_HAVE_NULLPTR + not_null( std::nullptr_t ); + not_null & operator=( std::nullptr_t ); +#endif + not_null( int ); + not_null & operator=( int ); + +public: + T get() const + { +#if gsl_HAVE_NULLPTR && gsl_COMPILER_MSVC_VERSION > 0 + // The assume() should help the optimizer: + __assume( ptr_ != nullptr ); +#endif + return ptr_; + } + + operator T() const { return get(); } + T operator->() const { return get(); } + + bool operator==(T const & rhs) const { return ptr_ == rhs; } + bool operator!=(T const & rhs) const { return !(*this == rhs); } + +private: + T ptr_; + + not_null & operator++(); + not_null & operator--(); + not_null operator++( int ); + not_null operator--( int ); + not_null & operator+ ( size_t ); + not_null & operator+=( size_t ); + not_null & operator- ( size_t ); + not_null & operator-=( size_t ); +}; + +// +// Byte-specific type. +// +#if gsl_HAVE_ENUM_CLASS +# include + enum class byte : std::uint8_t {}; +#elif gsl_HAVE_SIZED_TYPES +# include + typedef std::uint8_t byte; +#else + typedef unsigned char byte; +#endif + +// +// array_view<> - A 1D view of contiguous T's, replace (*,len). +// +template< class T > +class array_view +{ + template< class U > friend class array_view; + +public: + typedef size_t size_type; + + typedef T value_type; + typedef T & reference; + typedef T * pointer; + typedef T const * const_pointer; + + typedef pointer iterator; + typedef const_pointer const_iterator; + +#if gsl_BETWEEN( gsl_COMPILER_MSVC_VERSION, 6, 7 ) + typedef std::reverse_iterator< iterator, T > reverse_iterator; + typedef std::reverse_iterator< const_iterator, const T > const_reverse_iterator; +#else + typedef std::reverse_iterator< iterator > reverse_iterator; + typedef std::reverse_iterator< const_iterator > const_reverse_iterator; +#endif + + typedef typename std::iterator_traits< iterator >::difference_type difference_type; + + gsl_constexpr14 array_view() + : begin_( NULL ) + , end_ ( NULL ) + { + Expects( size() == 0 ); + } + +#if gsl_HAVE_NULLPTR + gsl_constexpr14 array_view( std::nullptr_t, size_type size ) + : begin_( nullptr ) + , end_ ( nullptr ) + { + Expects( size == 0 ); + } +#endif + + gsl_constexpr14 array_view( pointer begin, pointer end ) + : begin_( begin ) + , end_ ( end ) + { + Expects( begin <= end ); + } + + gsl_constexpr14 array_view( pointer & data, size_type size ) + : begin_( data ) + , end_ ( data + size ) + { + Expects( size == 0 || ( size > 0 && data != NULL ) ); + } + + template< class U, size_t N > + gsl_constexpr14 array_view( U (&arr)[N] ) + : begin_( arr ) + , end_ ( arr + N ) + {} + + template< class U, size_t N > + gsl_constexpr14 array_view( U (&arr)[N], size_type size ) + : begin_( arr ) + , end_ ( arr + size ) + { + Expects( size <= N ); + } + +#if gsl_HAVE_ARRAY + template< class U, size_t N > + gsl_constexpr14 array_view( std::array< U, N > & arr ) + : begin_( arr.data() ) + , end_ ( arr.data() + N ) + {} +#endif + + template< class Cont > + gsl_constexpr14 array_view( Cont & cont ) +#if gsl_HAVE_CONTAINER_DATA_METHOD + : begin_( cont.data() ) + , end_ ( cont.data() + cont.size() ) +#else + : begin_( &cont[0] ) + , end_ ( &cont[0] + cont.size() ) +#endif + {} + +#if gsl_HAVE_IS_DEFAULT_CTOR + gsl_constexpr14 array_view( array_view const & ) = default; +#else + gsl_constexpr14 array_view( array_view const & other ) + : begin_( other.begin() ) + , end_ ( other.end() ) + {} +#endif + + template< typename U > + gsl_constexpr14 array_view( array_view const & other ) + : begin_( other.begin() ) + , end_ ( other.end() ) + {} + + array_view & operator=( array_view other ) + { + other.swap( *this ); + return *this; + } + +#if 0 + // Converting from other array_view ? + template< typename U > operator=(); +#endif + + gsl_constexpr14 iterator begin() const + { + return iterator( begin_ ); + } + + gsl_constexpr14 iterator end() const + { + return iterator( end_ ); + } + + gsl_constexpr14 const_iterator cbegin() const + { + return const_iterator( begin() ); + } + + gsl_constexpr14 const_iterator cend() const + { + return const_iterator( end() ); + } + + gsl_constexpr14 reverse_iterator rbegin() const + { + return reverse_iterator( end() ); + } + + gsl_constexpr14 reverse_iterator rend() const + { + return reverse_iterator( begin() ); + } + + gsl_constexpr14 const_reverse_iterator crbegin() const + { + return const_reverse_iterator( cend() ); + } + + gsl_constexpr14 const_reverse_iterator crend() const + { + return const_reverse_iterator( cbegin() ); + } + + gsl_constexpr14 operator bool () const gsl_noexcept + { + return begin_ != NULL; + } + + gsl_constexpr14 reference operator[]( size_type index ) + { + return at( index ); + } + + gsl_constexpr14 bool operator==( array_view const & other ) const gsl_noexcept + { + return size() == other.size() + && (begin_ == other.begin_ || std::equal( this->begin(), this->end(), other.begin() ) ); + } + + gsl_constexpr14 bool operator!=( array_view const & other ) const gsl_noexcept + { + return !( *this == other ); + } + + gsl_constexpr14 bool operator< ( array_view const & other ) const gsl_noexcept + { + return std::lexicographical_compare( this->begin(), this->end(), other.begin(), other.end() ); + } + + gsl_constexpr14 bool operator<=( array_view const & other ) const gsl_noexcept + { + return !( other < *this ); + } + + gsl_constexpr14 bool operator> ( array_view const & other ) const gsl_noexcept + { + return ( other < *this ); + } + + gsl_constexpr14 bool operator>=( array_view const & other ) const gsl_noexcept + { + return !( *this < other ); + } + + gsl_constexpr14 reference at( size_type index ) + { + Expects( index >= 0 && index < size()); + return begin_[ index ]; + } + + gsl_constexpr14 pointer data() const gsl_noexcept + { + return begin_; + } + + gsl_constexpr14 bool empty() const gsl_noexcept + { + return size() == 0; + } + + gsl_constexpr14 size_type size() const gsl_noexcept + { + return std::distance( begin_, end_ ); + } + + gsl_constexpr14 size_type length() const gsl_noexcept + { + return size(); + } + + gsl_constexpr14 size_type used_length() const gsl_noexcept + { + return length(); + } + + gsl_constexpr14 size_type bytes() const gsl_noexcept + { + return sizeof( value_type ) * size(); + } + + gsl_constexpr14 size_type used_bytes() const gsl_noexcept + { + return bytes(); + } + + void swap( array_view & other ) gsl_noexcept + { + using std::swap; + swap( begin_, other.begin_ ); + swap( end_ , other.end_ ); + } + + array_view< const byte > as_bytes() const gsl_noexcept + { + return array_view< const byte >( reinterpret_cast( data() ), bytes() ); + } + + array_view< byte > as_writeable_bytes() const gsl_noexcept + { + return array_view< byte >( reinterpret_cast( data() ), bytes() ); + } + + template< typename U > + array_view< U > as_array_view() const gsl_noexcept + { + Expects( ( this->bytes() % sizeof(U) ) == 0 ); + return array_view< U >( reinterpret_cast( this->data() ), this->bytes() / sizeof( U ) ); + } + +private: + // helpers for member as_array_view() + template< typename U > + gsl_constexpr14 array_view( U * & data, size_type size ) + : begin_( data ) + , end_ ( data + size ) + { + Expects( size == 0 || ( size > 0 && data != NULL ) ); + } + + template< typename U > + gsl_constexpr14 array_view( U * const & data, size_type size ) + : begin_( data ) + , end_ ( data + size ) + { + Expects( size == 0 || ( size > 0 && data != NULL ) ); + } + +private: + pointer begin_; + pointer end_; +}; + +// array_view creator functions (see ctors) + +template< typename T > +gsl_constexpr14 array_view as_array_view( T * begin, T * end ) +{ + return array_view( begin, end ); +} + +template< typename T > +gsl_constexpr14 array_view as_array_view( T * begin, size_t size ) +{ + return array_view( begin, size ); +} + +template< typename T, size_t N > +gsl_constexpr14 array_view as_array_view( T (&arr)[N] ) +{ + return array_view( arr, N ); +} + +#if gsl_HAVE_ARRAY +template< typename T, size_t N > +gsl_constexpr14 array_view as_array_view( std::array & arr ) +{ + return array_view( arr ); +} +#endif + +#if gsl_HAVE_AUTO +template< class Cont > +gsl_constexpr14 auto as_array_view( Cont & cont ) -> array_view< typename Cont::value_type > +{ + return array_view< typename Cont::value_type >( cont ); +} +#else +template< class T > +array_view as_array_view( std::vector & cont ) +{ + return array_view( cont ); +} +#endif + +// +// String types: +// + +typedef char * zstring; +typedef wchar_t * zwstring; +typedef const char * czstring; +typedef const wchar_t * cwzstring; + +typedef array_view< char > string_view; +typedef array_view< wchar_t > wstring_view; +typedef array_view< const char > cstring_view; +typedef array_view< const wchar_t > cwstring_view; + +// to_string() allow (explicit) conversions from string_view to string + +inline std::string to_string( string_view const & view ) +{ + return std::string( view.data(), view.length() ); +} + +inline std::string to_string( cstring_view const & view ) +{ + return std::string( view.data(), view.length() ); +} + +inline std::wstring to_string( wstring_view const & view ) +{ + return std::wstring( view.data(), view.length() ); +} + +inline std::wstring to_string( cwstring_view const & view ) +{ + return std::wstring( view.data(), view.length() ); +} + +// +// ensure_sentinel() +// +// Provides a way to obtain an array_view from a contiguous sequence +// that ends with a (non-inclusive) sentinel value. +// +// Will fail-fast if sentinel cannot be found before max elements are examined. +// +namespace detail { + +template +static array_view ensure_sentinel( T * seq, SizeType max = std::numeric_limits::max() ) +{ + typedef T * pointer; + typedef typename std::iterator_traits::difference_type difference_type; + + pointer cur = seq; + + while ( std::distance( seq, cur ) < static_cast( max ) && *cur != Sentinel ) + ++cur; + + Expects( *cur == Sentinel ); + + return array_view( seq, cur - seq ); +} +} // namespace detail + +// +// ensure_z - creates a string_view for a czstring or cwzstring. +// Will fail fast if a null-terminator cannot be found before +// the limit of size_type. +// + +template< class T > +inline array_view ensure_z( T * const & sz, size_t max = std::numeric_limits::max() ) +{ + return detail::ensure_sentinel( sz, max ); +// return detail::ensure::sentinel( sz, max ); +} + +template< class T, size_t N > +array_view ensure_z( T (&sz)[N] ) +{ + return ensure_z( &sz[0], N ); +} + +# if gsl_HAVE_TYPE_TRAITS + +template< class Cont > +array_view< typename std::remove_pointer::type > +ensure_z( Cont& cont ) +{ + return ensure_z( cont.data(), cont.length() ); +} +# endif + +} // namespace gsl + +#endif // GSL_GSL_LITE_H_INCLUDED + +// end of file diff --git a/lib/gsl-lite/readme.txt b/lib/gsl-lite/readme.txt new file mode 100644 index 0000000000..bdfb549ece --- /dev/null +++ b/lib/gsl-lite/readme.txt @@ -0,0 +1,3 @@ +GSL Lite: Implementation of the Guideline Support Library with support for older compilers + +From https://github.com/martinmoene/gsl-lite From f5b77b239c23cbc4f225b3991fbf1b848b605a78 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 31 Oct 2015 21:59:59 +0100 Subject: [PATCH 035/445] Added GSL to projects --- code/CMakeLists.txt | 1 + code/game/CMakeLists.txt | 1 + code/rd-vanilla/CMakeLists.txt | 8 ++++++++ codeJK2/game/CMakeLists.txt | 13 ++++++++++++- codemp/CMakeLists.txt | 13 ++++++++++++- codemp/cgame/CMakeLists.txt | 12 +++++++++++- codemp/game/CMakeLists.txt | 12 +++++++++++- codemp/rd-vanilla/CMakeLists.txt | 7 +++++++ codemp/ui/CMakeLists.txt | 12 +++++++++++- 9 files changed, 74 insertions(+), 5 deletions(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index de5a5bde5f..22f76d344e 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -186,6 +186,7 @@ if(BuildSPEngine OR BuildJK2SPEngine) set(SPEngineCommonSafeFiles "${SharedDir}/qcommon/safe/files.cpp" "${SharedDir}/qcommon/safe/files.h" + "${SharedDir}/qcommon/safe/gsl.h" "${SPDir}/qcommon/safe/memory.h" ) source_group("common/safe" FILES ${SPEngineCommonSafeFiles}) diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 8bd11c8072..dc73143c31 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -266,6 +266,7 @@ source_group("common" FILES ${SPGameCommonFiles}) set(SPGameFiles ${SPGameFiles} ${SPGameCommonFiles}) set(SPGameCommonSafeFiles + "${SharedDir}/qcommon/safe/gsl.h" "${SPDir}/qcommon/safe/memory.h" ) source_group("common/safe" FILES ${SPGameCommonSafeFiles}) diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index 9b5f320d2d..578b32f06d 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -28,6 +28,7 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) ${SharedDir} ${SPRDVanillaRendererIncludeDirectories} "${SPDir}/rd-vanilla" + "${OpenJKLibDir}/gsl-lite/include" ) # Modular Renderer crap (let's hope this works..) @@ -82,6 +83,13 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) source_group("common" FILES ${SPRDVanillaCommonFiles}) set(SPRDVanillaFiles ${SPRDVanillaFiles} ${SPRDVanillaCommonFiles}) + # Misc files + set(SPRDVanillaCommonSafeFiles + "${SharedDir}/qcommon/safe/gsl.h" + ) + source_group("common/safe" FILES ${SPRDVanillaCommonSafeFiles}) + set(SPRDVanillaFiles ${SPRDVanillaFiles} ${SPRDVanillaCommonSafeFiles}) + # main files set(SPRDVanillaMainFiles "${SPDir}/rd-vanilla/glext.h" diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index bd9c2bada8..aea9126a1b 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -23,7 +23,11 @@ endif(NOT InOpenJK) set(JK2SPGameDefines ${SharedDefines} "JK2_MODE") -set(JK2SPGameIncludeDirectories "${JK2SPDir}/game") +set(JK2SPGameIncludeDirectories + "${JK2SPDir}/game" + "${SharedDir}" + "${OpenJKLibDir}/gsl-lite/include" + ) if(WIN32) set(JK2SPGameLibraries "winmm") endif(WIN32) @@ -233,6 +237,13 @@ set(JK2SPGameCommonFiles source_group("common" FILES ${JK2SPGameCommonFiles}) set(JK2SPGameFiles ${JK2SPGameFiles} ${JK2SPGameCommonFiles}) +set(JK2SPGameCommonSafeFiles + #We only have JKA qcommon files now. + "${SharedDir}/qcommon/safe/gsl.h" + ) +source_group("common/safe" FILES ${JK2SPGameCommonSafeFiles}) +set(JK2SPGameFiles ${JK2SPGameFiles} ${JK2SPGameCommonSafeFiles}) + set(JK2SPGameIcarusFiles "${JK2SPDir}/icarus/BlockStream.cpp" "${JK2SPDir}/icarus/Sequence.cpp" diff --git a/codemp/CMakeLists.txt b/codemp/CMakeLists.txt index 9647d2db9e..60cfabdb4e 100644 --- a/codemp/CMakeLists.txt +++ b/codemp/CMakeLists.txt @@ -49,7 +49,11 @@ if(BuildMPEngine OR BuildMPDed) # Botlib # the files could arguably just be put into the engine and dedicated projects without having a library for it. set(MPBotlibDefines ${SharedDefines} "BOTLIB") - set(MPBotlibIncludeDirectories ${SharedDir} ${MPDir}) + set(MPBotlibIncludeDirectories + ${SharedDir} + ${MPDir} + "${OpenJKLibDir}/gsl-lite/include" + ) set(MPBotlibBotlibFiles "${MPDir}/botlib/aasfile.h" "${MPDir}/botlib/be_aas.h" @@ -136,6 +140,12 @@ if(BuildMPEngine OR BuildMPDed) source_group("common" FILES ${MPBotlibCommonFiles}) set(MPBotlibFiles ${MPBotlibFiles} ${MPBotlibCommonFiles}) + set(MPBotlibCommonSafeFiles + "${SharedDir}/qcommon/safe/gsl.h" + ) + source_group("common/safe" FILES ${MPBotlibCommonSafeFiles}) + set(MPBotlibFiles ${MPBotlibFiles} ${MPBotlibCommonSafeFiles}) + set(MPBotlibServerFiles "${MPDir}/server/server.h" ) @@ -251,6 +261,7 @@ if(BuildMPEngine OR BuildMPDed) set(MPEngineAndDedCommonSafeFiles "${SharedDir}/qcommon/safe/files.cpp" "${SharedDir}/qcommon/safe/files.h" + "${SharedDir}/qcommon/safe/gsl.h" ) source_group("common/safe" FILES ${MPEngineAndDedCommonSafeFiles}) set(MPEngineAndDedFiles ${MPEngineAndDedFiles} ${MPEngineAndDedCommonSafeFiles}) diff --git a/codemp/cgame/CMakeLists.txt b/codemp/cgame/CMakeLists.txt index 69d199e5a9..0479cc2d61 100644 --- a/codemp/cgame/CMakeLists.txt +++ b/codemp/cgame/CMakeLists.txt @@ -21,7 +21,11 @@ if(NOT InOpenJK) message(FATAL_ERROR "Use the top-level cmake script!") endif(NOT InOpenJK) -set(MPCGameIncludeDirectories "${MPDir}") +set(MPCGameIncludeDirectories + "${MPDir}" + "${SharedDir}" + "${OpenJKLibDir}/gsl-lite/include" + ) if(WIN32) set(MPCGameLibraries "odbc32" "odbccp32") # what are these even? endif(WIN32) @@ -108,6 +112,12 @@ set(MPCGameCommonFiles source_group("common" FILES ${MPCGameCommonFiles}) set(MPCGameFiles ${MPCGameFiles} ${MPCGameCommonFiles}) +set(MPCGameCommonSafeFiles + "${SharedDir}/qcommon/safe/gsl.h" + ) +source_group("common/safe" FILES ${MPCGameCommonSafeFiles}) +set(MPCGameFiles ${MPCGameFiles} ${MPCGameCommonSafeFiles}) + set(MPCGameUiFiles "${MPDir}/ui/ui_shared.c" "${MPDir}/ui/keycodes.h" diff --git a/codemp/game/CMakeLists.txt b/codemp/game/CMakeLists.txt index f391a64714..73019f1f02 100644 --- a/codemp/game/CMakeLists.txt +++ b/codemp/game/CMakeLists.txt @@ -21,7 +21,11 @@ if(NOT InOpenJK) message(FATAL_ERROR "Use the top-level cmake script!") endif(NOT InOpenJK) -set(MPGameIncludeDirectories "${MPDir}") +set(MPGameIncludeDirectories + "${MPDir}" + "${SharedDir}" + "${OpenJKLibDir}/gsl-lite/include" + ) if(WIN32) set(MPGameLibraries "winmm") endif(WIN32) @@ -151,6 +155,12 @@ set(MPGameCommonFiles source_group("common" FILES ${MPGameCommonFiles}) set(MPGameFiles ${MPGameFiles} ${MPGameCommonFiles}) +set(MPGameCommonSafeFiles + "${SharedDir}/qcommon/safe/gsl.h" + ) +source_group("common/safe" FILES ${MPGameCommonSafeFiles}) +set(MPGameFiles ${MPGameFiles} ${MPGameCommonSafeFiles}) + set(MPGameCgameFiles "${MPDir}/cgame/animtable.h" "${MPDir}/cgame/cg_public.h" diff --git a/codemp/rd-vanilla/CMakeLists.txt b/codemp/rd-vanilla/CMakeLists.txt index b80bd3933f..acfc247001 100644 --- a/codemp/rd-vanilla/CMakeLists.txt +++ b/codemp/rd-vanilla/CMakeLists.txt @@ -29,6 +29,7 @@ set(MPVanillaRendererIncludeDirectories ${SharedDir} ${MPDir} "${MPDir}/rd-vanilla" + "${OpenJKLibDir}/gsl-lite/include" ) set(MPVanillaRendererFiles @@ -102,6 +103,12 @@ set(MPVanillaRendererCommonFiles source_group("common" FILES ${MPVanillaRendererCommonFiles}) set(MPVanillaRendererFiles ${MPVanillaRendererFiles} ${MPVanillaRendererCommonFiles}) +set(MPVanillaRendererCommonSafeFiles + "${SharedDir}/qcommon/safe/gsl.h" + ) +source_group("common/safe" FILES ${MPVanillaRendererCommonSafeFiles}) +set(MPVanillaRendererFiles ${MPVanillaRendererFiles} ${MPVanillaRendererCommonSafeFiles}) + # Transparently use either bundled or system libjpeg. list(APPEND MPVanillaRendererIncludeDirectories ${JPEG_INCLUDE_DIR}) list(APPEND MPVanillaRendererLibraries ${JPEG_LIBRARIES}) diff --git a/codemp/ui/CMakeLists.txt b/codemp/ui/CMakeLists.txt index b85a97a584..1573685165 100644 --- a/codemp/ui/CMakeLists.txt +++ b/codemp/ui/CMakeLists.txt @@ -21,7 +21,11 @@ if(NOT InOpenJK) message(FATAL_ERROR "Use the top-level cmake script!") endif(NOT InOpenJK) -set(MPUIIncludeDirectories "${MPDir}") +set(MPUIIncludeDirectories + "${MPDir}" + "${SharedDir}" + "${OpenJKLibDir}/gsl-lite/include" + ) if(WIN32) set(MPUILibraries "odbc32" "odbccp32") # what are these even? endif(WIN32) @@ -56,6 +60,12 @@ set(MPUICommonFiles source_group("common" FILES ${MPUICommonFiles}) set(MPUIFiles ${MPUIFiles} ${MPUICommonFiles}) +set(MPUICommonSafeFiles + "${SharedDir}/qcommon/safe/gsl.h" + ) +source_group("common/safe" FILES ${MPUICommonSafeFiles}) +set(MPUIFiles ${MPUIFiles} ${MPUICommonSafeFiles}) + set(MPUIUIFiles "${MPDir}/ui/ui_atoms.c" "${MPDir}/ui/ui_cvar.c" From b60be593cda2f40c31bfec0e248dbbe66ac52a27 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 31 Oct 2015 22:01:20 +0100 Subject: [PATCH 036/445] central GSL path project variable --- CMakeLists.txt | 1 + code/CMakeLists.txt | 2 +- code/game/CMakeLists.txt | 2 +- code/rd-vanilla/CMakeLists.txt | 2 +- codeJK2/game/CMakeLists.txt | 2 +- codemp/CMakeLists.txt | 2 +- codemp/cgame/CMakeLists.txt | 2 +- codemp/game/CMakeLists.txt | 2 +- codemp/rd-vanilla/CMakeLists.txt | 2 +- codemp/ui/CMakeLists.txt | 2 +- 10 files changed, 10 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d4c30c7d10..26458079b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -151,6 +151,7 @@ set(MPDir "${CMAKE_SOURCE_DIR}/codemp") set(JK2SPDir "${CMAKE_SOURCE_DIR}/codeJK2") set(SharedDir ${CMAKE_SOURCE_DIR}/shared) set(OpenJKLibDir "${CMAKE_SOURCE_DIR}/lib") +set(GSLIncludeDirectory "${OpenJKLibDir}/gsl-lite/include") include(InstallConfig) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 22f76d344e..94da8e883a 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -42,7 +42,7 @@ if(BuildSPEngine OR BuildJK2SPEngine) ${SPEngineIncludeDirectories} ${SharedDir} ${SPDir} - "${OpenJKLibDir}/gsl-lite/include") + "${GSLIncludeDirectory}") # Dependencies # OpenAL (is optionally included for Windows) diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index dc73143c31..6203fd25d6 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -26,7 +26,7 @@ set(SPGameIncludeDirectories ${SharedDir} ${SPDir} "${SPDir}/game" - "${OpenJKLibDir}/gsl-lite/include" + "${GSLIncludeDirectory}" ) if(WIN32) diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index 578b32f06d..a9402733a4 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -28,7 +28,7 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) ${SharedDir} ${SPRDVanillaRendererIncludeDirectories} "${SPDir}/rd-vanilla" - "${OpenJKLibDir}/gsl-lite/include" + "${GSLIncludeDirectory}" ) # Modular Renderer crap (let's hope this works..) diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index aea9126a1b..a9129e8817 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -26,7 +26,7 @@ set(JK2SPGameDefines ${SharedDefines} "JK2_MODE") set(JK2SPGameIncludeDirectories "${JK2SPDir}/game" "${SharedDir}" - "${OpenJKLibDir}/gsl-lite/include" + "${GSLIncludeDirectory}" ) if(WIN32) set(JK2SPGameLibraries "winmm") diff --git a/codemp/CMakeLists.txt b/codemp/CMakeLists.txt index 60cfabdb4e..7f8daeeac5 100644 --- a/codemp/CMakeLists.txt +++ b/codemp/CMakeLists.txt @@ -52,7 +52,7 @@ if(BuildMPEngine OR BuildMPDed) set(MPBotlibIncludeDirectories ${SharedDir} ${MPDir} - "${OpenJKLibDir}/gsl-lite/include" + "${GSLIncludeDirectory}" ) set(MPBotlibBotlibFiles "${MPDir}/botlib/aasfile.h" diff --git a/codemp/cgame/CMakeLists.txt b/codemp/cgame/CMakeLists.txt index 0479cc2d61..f0d164599c 100644 --- a/codemp/cgame/CMakeLists.txt +++ b/codemp/cgame/CMakeLists.txt @@ -24,7 +24,7 @@ endif(NOT InOpenJK) set(MPCGameIncludeDirectories "${MPDir}" "${SharedDir}" - "${OpenJKLibDir}/gsl-lite/include" + "${GSLIncludeDirectory}" ) if(WIN32) set(MPCGameLibraries "odbc32" "odbccp32") # what are these even? diff --git a/codemp/game/CMakeLists.txt b/codemp/game/CMakeLists.txt index 73019f1f02..4a897d80a8 100644 --- a/codemp/game/CMakeLists.txt +++ b/codemp/game/CMakeLists.txt @@ -24,7 +24,7 @@ endif(NOT InOpenJK) set(MPGameIncludeDirectories "${MPDir}" "${SharedDir}" - "${OpenJKLibDir}/gsl-lite/include" + "${GSLIncludeDirectory}" ) if(WIN32) set(MPGameLibraries "winmm") diff --git a/codemp/rd-vanilla/CMakeLists.txt b/codemp/rd-vanilla/CMakeLists.txt index acfc247001..d2bcbce417 100644 --- a/codemp/rd-vanilla/CMakeLists.txt +++ b/codemp/rd-vanilla/CMakeLists.txt @@ -29,7 +29,7 @@ set(MPVanillaRendererIncludeDirectories ${SharedDir} ${MPDir} "${MPDir}/rd-vanilla" - "${OpenJKLibDir}/gsl-lite/include" + "${GSLIncludeDirectory}" ) set(MPVanillaRendererFiles diff --git a/codemp/ui/CMakeLists.txt b/codemp/ui/CMakeLists.txt index 1573685165..dac9492a1b 100644 --- a/codemp/ui/CMakeLists.txt +++ b/codemp/ui/CMakeLists.txt @@ -24,7 +24,7 @@ endif(NOT InOpenJK) set(MPUIIncludeDirectories "${MPDir}" "${SharedDir}" - "${OpenJKLibDir}/gsl-lite/include" + "${GSLIncludeDirectory}" ) if(WIN32) set(MPUILibraries "odbc32" "odbccp32") # what are these even? From e15aea307b8f4e43c065916471e3c0b9cf7eaa43 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 31 Oct 2015 22:55:48 +0100 Subject: [PATCH 037/445] Added forgotten qcommon/safe/gsl.h --- shared/qcommon/safe/gsl.h | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 shared/qcommon/safe/gsl.h diff --git a/shared/qcommon/safe/gsl.h b/shared/qcommon/safe/gsl.h new file mode 100644 index 0000000000..479ab00766 --- /dev/null +++ b/shared/qcommon/safe/gsl.h @@ -0,0 +1,4 @@ +#pragma once + +// central point of include to simplify possible future swap for Microsoft's implementation +#include From 42a8e8943117307d4913fd3d5813cdd1bf3b1249 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 1 Nov 2015 23:41:48 +0100 Subject: [PATCH 038/445] Added missing constructors to Zone Allocator --- code/qcommon/safe/memory.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/qcommon/safe/memory.h b/code/qcommon/safe/memory.h index 175cb971f7..5279bc5278 100644 --- a/code/qcommon/safe/memory.h +++ b/code/qcommon/safe/memory.h @@ -47,6 +47,11 @@ namespace Zone template< typename T, memtag_t tag > struct Allocator { + Allocator() = default; + template< typename U > + Allocator( const Allocator< U, tag >& ) + { + }; using value_type = T; using is_always_equal = std::true_type; T* allocate( std::size_t n ) const From c2db08ae8a3aa3968981e356b6bc8539a05f3412 Mon Sep 17 00:00:00 2001 From: deepy Date: Mon, 2 Nov 2015 13:09:03 +0100 Subject: [PATCH 039/445] Update README.md Added buildbot notes. --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index ab8dec39fc..eac878ab87 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,11 @@ If you have the Mac App Store Version of Jedi Academy, follow these steps to get * Change the GAMEVERSION define in codemp/game/g_local.h from "OpenJK" to your project name * If you make a nice change, please consider back-porting to upstream via pull request as described above. This is so everyone benefits without having to reinvent the wheel for every project. +### Deciphering buildbot's output +* Pick the build from the operating system builder you're interested in at the [builders](https://jk.xd.cm/builders) page. +* Click on stdio for the Steps to see the command executed and the result. +* The command is at the very top, the output starts below. + ## Maintainers (in alphabetical order) * Ensiform From 9e310f552da9f52d7e5961888a3fe3892264398b Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Mon, 2 Nov 2015 19:10:41 +0100 Subject: [PATCH 040/445] Added 32 bit cross-compile option for 64 bit linux cmake --- CMakeLists.txt | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 26458079b3..7189c92817 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,9 +85,24 @@ list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}/CMakeModules") Include(CheckTypeSize) check_type_size("void*" CMAKE_SIZEOF_VOID_P) +if((NOT WIN32) AND (NOT APPLE)) + option(Build32Bit "If set, produce 32 bit binaries instead of 64 bit." OFF) + if(Build32Bit) + set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-m32") + set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-m32") + endif() +endif() + # ${Architecture} must match ARCH_STRING in q_platform.h, # and is used in DLL names (jagamex86.dll, jagamex86.dylib, jagamei386.so). -if(WIN32) +if(Build32Bit) + set(X86 ON) + if(APPLE) + set(Architecture "x86") + else() + set(Architecture "i386") + endif() +elseif(WIN32) set(X86 ON) if(CMAKE_SIZEOF_VOID_P MATCHES "8") set(Architecture "x86_64") From 950a7d20e502b795e85c5e1ff04859e48e80735d Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Mon, 2 Nov 2015 19:14:54 +0100 Subject: [PATCH 041/445] Revert "Added 32 bit cross-compile option for 64 bit linux cmake" This reverts commit 9e310f552da9f52d7e5961888a3fe3892264398b. --- CMakeLists.txt | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7189c92817..26458079b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,24 +85,9 @@ list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}/CMakeModules") Include(CheckTypeSize) check_type_size("void*" CMAKE_SIZEOF_VOID_P) -if((NOT WIN32) AND (NOT APPLE)) - option(Build32Bit "If set, produce 32 bit binaries instead of 64 bit." OFF) - if(Build32Bit) - set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-m32") - set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-m32") - endif() -endif() - # ${Architecture} must match ARCH_STRING in q_platform.h, # and is used in DLL names (jagamex86.dll, jagamex86.dylib, jagamei386.so). -if(Build32Bit) - set(X86 ON) - if(APPLE) - set(Architecture "x86") - else() - set(Architecture "i386") - endif() -elseif(WIN32) +if(WIN32) set(X86 ON) if(CMAKE_SIZEOF_VOID_P MATCHES "8") set(Architecture "x86_64") From 96b88692c66ffc4c26892518361444df17a2960b Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Mon, 2 Nov 2015 19:40:08 +0100 Subject: [PATCH 042/445] Fixed incorrect SP SaberColor validation. It actually broke the build on Mac, which is nice, because it was genuinely incorrect. --- code/game/g_svcmds.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index 2368a6dc1d..6384a83ede 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -260,12 +260,14 @@ static void Svcmd_SaberColor_f() const char *color[MAX_BLADES]; int bladeNum; + bool validColors = true; for ( bladeNum = 0; bladeNum < MAX_BLADES; bladeNum++ ) { color[bladeNum] = gi.argv(2+bladeNum); + validColors = validColors && VALIDSTRING( color[ bladeNum ] ); } - if ( !VALIDSTRING( color ) || saberNum < 1 || saberNum > 2 ) + if ( !validColors || saberNum < 1 || saberNum > 2 ) { gi.Printf( "Usage: saberColor ... \n" ); gi.Printf( "valid saberNums: 1 or 2\n" ); From 973e9c286fb13b4c7fa11a7ef03d68ae0047a473 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Mon, 2 Nov 2015 19:42:59 +0100 Subject: [PATCH 043/445] Fixed incorrect SP Icarus GetString() Animname validation --- code/game/Q3_Interface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 5d92156e8c..de00024ef5 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -10514,7 +10514,7 @@ int CQuake3GameInterface::GetString( int entID, const char *name, char **value case SET_ANIM_BOTH: *value = (char *) Q3_GetAnimBoth( ent ); - if ( VALIDSTRING( value ) == false ) + if ( VALIDSTRING( *value ) == false ) return false; break; From 3c3ec2da063244889c32ac88c9394bffe62596ba Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 2 Nov 2015 20:49:54 -0600 Subject: [PATCH 044/445] [SP] Fixed incorrect cgame syscall argument handling for Menu_Paint. --- code/client/cl_cgame.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/client/cl_cgame.cpp b/code/client/cl_cgame.cpp index ca7e9c68b9..35f8eb293d 100644 --- a/code/client/cl_cgame.cpp +++ b/code/client/cl_cgame.cpp @@ -1190,7 +1190,7 @@ Ghoul2 Insert End return 0; case CG_OPENJK_MENU_PAINT: - Menu_Paint( (menuDef_t *)VMA(1), (intptr_t)VMA(2) ); + Menu_Paint( (menuDef_t *)VMA(1), args[2] ); return 0; case CG_OPENJK_GETMENU_BYNAME: From 56c5d429d49fee12d64b05d3ff262a8fddc10d10 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Tue, 3 Nov 2015 10:33:29 +0100 Subject: [PATCH 045/445] Added cstring_view literal _v i.e. "foo"_v creates a cstring_view of length 3 containing "foo" --- shared/qcommon/safe/gsl.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/shared/qcommon/safe/gsl.h b/shared/qcommon/safe/gsl.h index 479ab00766..c813a4597f 100644 --- a/shared/qcommon/safe/gsl.h +++ b/shared/qcommon/safe/gsl.h @@ -2,3 +2,9 @@ // central point of include to simplify possible future swap for Microsoft's implementation #include + +/** gsl::cstring_view from string literal (without null-termination) */ +inline gsl::cstring_view operator"" _v( const char* str, std::size_t length ) +{ + return{ str, str + length }; +} From 78e3b835aed1b87e90260dfe55113f1b6e0fc8eb Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Tue, 3 Nov 2015 10:35:08 +0100 Subject: [PATCH 046/445] Added string_view-based typesafe Q::sscanf; limited type support so far. --- code/CMakeLists.txt | 1 + code/game/CMakeLists.txt | 1 + code/rd-vanilla/CMakeLists.txt | 1 + codeJK2/game/CMakeLists.txt | 1 + codemp/CMakeLists.txt | 1 + codemp/cgame/CMakeLists.txt | 1 + codemp/game/CMakeLists.txt | 1 + codemp/rd-vanilla/CMakeLists.txt | 1 + codemp/ui/CMakeLists.txt | 1 + shared/qcommon/safe/sscanf.h | 136 +++++++++++++++++++++++++++++++ 10 files changed, 145 insertions(+) create mode 100644 shared/qcommon/safe/sscanf.h diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 94da8e883a..9256bd25c9 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -187,6 +187,7 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SharedDir}/qcommon/safe/files.cpp" "${SharedDir}/qcommon/safe/files.h" "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/sscanf.h" "${SPDir}/qcommon/safe/memory.h" ) source_group("common/safe" FILES ${SPEngineCommonSafeFiles}) diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 6203fd25d6..fad6496626 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -267,6 +267,7 @@ set(SPGameFiles ${SPGameFiles} ${SPGameCommonFiles}) set(SPGameCommonSafeFiles "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/sscanf.h" "${SPDir}/qcommon/safe/memory.h" ) source_group("common/safe" FILES ${SPGameCommonSafeFiles}) diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index a9402733a4..19b159d87b 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -86,6 +86,7 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) # Misc files set(SPRDVanillaCommonSafeFiles "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/sscanf.h" ) source_group("common/safe" FILES ${SPRDVanillaCommonSafeFiles}) set(SPRDVanillaFiles ${SPRDVanillaFiles} ${SPRDVanillaCommonSafeFiles}) diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index a9129e8817..43e0e825f3 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -240,6 +240,7 @@ set(JK2SPGameFiles ${JK2SPGameFiles} ${JK2SPGameCommonFiles}) set(JK2SPGameCommonSafeFiles #We only have JKA qcommon files now. "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/sscanf.h" ) source_group("common/safe" FILES ${JK2SPGameCommonSafeFiles}) set(JK2SPGameFiles ${JK2SPGameFiles} ${JK2SPGameCommonSafeFiles}) diff --git a/codemp/CMakeLists.txt b/codemp/CMakeLists.txt index 7f8daeeac5..6a844bed66 100644 --- a/codemp/CMakeLists.txt +++ b/codemp/CMakeLists.txt @@ -142,6 +142,7 @@ if(BuildMPEngine OR BuildMPDed) set(MPBotlibCommonSafeFiles "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/sscanf.h" ) source_group("common/safe" FILES ${MPBotlibCommonSafeFiles}) set(MPBotlibFiles ${MPBotlibFiles} ${MPBotlibCommonSafeFiles}) diff --git a/codemp/cgame/CMakeLists.txt b/codemp/cgame/CMakeLists.txt index f0d164599c..1491f2fdf9 100644 --- a/codemp/cgame/CMakeLists.txt +++ b/codemp/cgame/CMakeLists.txt @@ -114,6 +114,7 @@ set(MPCGameFiles ${MPCGameFiles} ${MPCGameCommonFiles}) set(MPCGameCommonSafeFiles "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/sscanf.h" ) source_group("common/safe" FILES ${MPCGameCommonSafeFiles}) set(MPCGameFiles ${MPCGameFiles} ${MPCGameCommonSafeFiles}) diff --git a/codemp/game/CMakeLists.txt b/codemp/game/CMakeLists.txt index 4a897d80a8..4eb5c47e18 100644 --- a/codemp/game/CMakeLists.txt +++ b/codemp/game/CMakeLists.txt @@ -157,6 +157,7 @@ set(MPGameFiles ${MPGameFiles} ${MPGameCommonFiles}) set(MPGameCommonSafeFiles "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/sscanf.h" ) source_group("common/safe" FILES ${MPGameCommonSafeFiles}) set(MPGameFiles ${MPGameFiles} ${MPGameCommonSafeFiles}) diff --git a/codemp/rd-vanilla/CMakeLists.txt b/codemp/rd-vanilla/CMakeLists.txt index d2bcbce417..78ad787bb2 100644 --- a/codemp/rd-vanilla/CMakeLists.txt +++ b/codemp/rd-vanilla/CMakeLists.txt @@ -105,6 +105,7 @@ set(MPVanillaRendererFiles ${MPVanillaRendererFiles} ${MPVanillaRendererCommonFi set(MPVanillaRendererCommonSafeFiles "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/sscanf.h" ) source_group("common/safe" FILES ${MPVanillaRendererCommonSafeFiles}) set(MPVanillaRendererFiles ${MPVanillaRendererFiles} ${MPVanillaRendererCommonSafeFiles}) diff --git a/codemp/ui/CMakeLists.txt b/codemp/ui/CMakeLists.txt index dac9492a1b..4c17b1ee1d 100644 --- a/codemp/ui/CMakeLists.txt +++ b/codemp/ui/CMakeLists.txt @@ -62,6 +62,7 @@ set(MPUIFiles ${MPUIFiles} ${MPUICommonFiles}) set(MPUICommonSafeFiles "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/sscanf.h" ) source_group("common/safe" FILES ${MPUICommonSafeFiles}) set(MPUIFiles ${MPUIFiles} ${MPUICommonSafeFiles}) diff --git a/shared/qcommon/safe/sscanf.h b/shared/qcommon/safe/sscanf.h new file mode 100644 index 0000000000..58cb5a6174 --- /dev/null +++ b/shared/qcommon/safe/sscanf.h @@ -0,0 +1,136 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include "gsl.h" + +namespace Q +{ + namespace detail + { + std::size_t sscanf_impl( const gsl::cstring_view& input, const std::size_t accumulator ) + { + // Scan successful, all format arguments satisfied + return accumulator; + } + + // Verbatim string + // Try to consume the given string; whitespace means consume all available consecutive whitespace. (So format `" "_v` also accepts input `""_v` and vice-versa.) + template< typename... Tail > + std::size_t sscanf_impl( const gsl::cstring_view& input, const std::size_t accumulator, const gsl::cstring_view& expected, Tail&&... tail ) + { + auto inputIt = input.begin(); + auto expectedIt = expected.begin(); + while( true ) + { + if( expectedIt == expected.end() ) + { + // success + return sscanf_impl( { inputIt, input.end() }, accumulator, std::forward< Tail >( tail )... ); + } + else if( std::isspace( *expectedIt ) ) + { + // whitespace -> skip all input whitespace + // this check is done before the end-of-input check because that's valid here. + inputIt = std::find_if_not< gsl::cstring_view::const_iterator, int( *)(int) >( + inputIt, input.end(), + std::isspace + ); + // might as well skip expected whitespace; we already consumed all input whitespace. + ++expectedIt; + expectedIt = std::find_if_not< gsl::cstring_view::const_iterator, int( *)( int ) >( + expectedIt, expected.end(), + std::isspace + ); + } + else if( inputIt == input.end() ) + { + // input ended too early + return accumulator; + } + else if( *inputIt != *expectedIt ) + { + // no match + return accumulator; + } + else + { + ++inputIt; + ++expectedIt; + } + } + } + + /** + A non-owning stream buffer; for adapting a gsl::cstring_view to std::istream + */ + template< typename CharT > + class ArrayViewStreambuf : public std::basic_streambuf< CharT > + { + public: + ArrayViewStreambuf( const gsl::array_view< const CharT >& view ) + { + // it is not written to, but the basic_streambuf interface still wants a non-const CharT. + char* data = const_cast< CharT* >( view.data() ); + setg( data, data, data + view.size() ); + } + }; + + /// For deducing ArrayViewStreambuf's template type + template< typename CharT > + inline ArrayViewStreambuf< CharT > MakeStreambuf( const gsl::array_view< const CharT >& view ) + { + return{ view }; + } + + /** + Conversion using std::istream's operator>> + */ + template< bool skipws = true, typename T, typename... Tail > + std::size_t sscanf_impl_stream( const gsl::cstring_view& input, const std::size_t accumulator, T& value, Tail&&... tail ) + { + auto buf = MakeStreambuf( input ); + std::istream stream( &buf ); + if( !skipws ) + { + stream >> std::noskipws; + } + stream >> value; + if( stream ) + { + return sscanf_impl( { input.begin() + stream.gcount(), input.end() }, accumulator + 1, std::forward< Tail >( tail )... ); + } + else + { + return accumulator; + } + } + + // Float + template< typename... Tail > + std::size_t sscanf_impl( const gsl::cstring_view& input, const std::size_t accumulator, float& f, Tail&&... tail ) + { + return sscanf_impl_stream( input, accumulator, f, std::forward< Tail >( tail )... ); + } + } + + /** + Parses a given input string according to the parameters. + + Works very much like std::sscanf; but the input is a string_view instead of a null-terminated string, and the format is implicit in the arguments. + + To describe an expected string literal, pass it as a const reference to gsl::cstring_view, e.g. `"foo bar"_v`; just as with sscanf a single whitespace is taken to mean "all available whitespace". + + Returns the number of successful assignments made. + */ + template< typename... Format > + std::size_t sscanf( const gsl::cstring_view& input, Format&&... format ) + { + return detail::sscanf_impl( input, 0, std::forward< Format >( format )... ); + } +} From ff6133237a9cd68c0765c8a92938dd52ca094711 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Tue, 3 Nov 2015 11:17:11 +0100 Subject: [PATCH 047/445] Q::sscanf refactoring --- shared/qcommon/safe/sscanf.h | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/shared/qcommon/safe/sscanf.h b/shared/qcommon/safe/sscanf.h index 58cb5a6174..f1b1a7d0e6 100644 --- a/shared/qcommon/safe/sscanf.h +++ b/shared/qcommon/safe/sscanf.h @@ -19,6 +19,14 @@ namespace Q return accumulator; } + inline gsl::cstring_view::const_iterator skipWhitespace( gsl::cstring_view::const_iterator begin, gsl::cstring_view::const_iterator end ) + { + return std::find_if_not< gsl::cstring_view::const_iterator, int( *)( int ) >( + begin, end, + std::isspace + ); + } + // Verbatim string // Try to consume the given string; whitespace means consume all available consecutive whitespace. (So format `" "_v` also accepts input `""_v` and vice-versa.) template< typename... Tail > @@ -37,16 +45,10 @@ namespace Q { // whitespace -> skip all input whitespace // this check is done before the end-of-input check because that's valid here. - inputIt = std::find_if_not< gsl::cstring_view::const_iterator, int( *)(int) >( - inputIt, input.end(), - std::isspace - ); + inputIt = skipWhitespace( inputIt, input.end() ); // might as well skip expected whitespace; we already consumed all input whitespace. ++expectedIt; - expectedIt = std::find_if_not< gsl::cstring_view::const_iterator, int( *)( int ) >( - expectedIt, expected.end(), - std::isspace - ); + expectedIt = skipWhitespace( expectedIt, expected.end() ); } else if( inputIt == input.end() ) { From fe8ad9530ad38275c02b7d9aa65134f71adfb470 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Tue, 3 Nov 2015 11:17:56 +0100 Subject: [PATCH 048/445] Fixed Q::sscanf() not advancing input after istream read --- shared/qcommon/safe/sscanf.h | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/shared/qcommon/safe/sscanf.h b/shared/qcommon/safe/sscanf.h index f1b1a7d0e6..fc7872ab57 100644 --- a/shared/qcommon/safe/sscanf.h +++ b/shared/qcommon/safe/sscanf.h @@ -81,6 +81,31 @@ namespace Q char* data = const_cast< CharT* >( view.data() ); setg( data, data, data + view.size() ); } + + protected: + /// @note required by istream.tellg() + virtual pos_type seekoff( off_type off, std::ios_base::seekdir dir, std::ios_base::openmode which ) + { + const pos_type errVal{ -1 }; + if( which != std::ios_base::in ) + { + // only input pointer can be moved + return errVal; + } + char* newPos = ( which == std::ios_base::beg ) ? eback() + : ( which == std::ios_base::cur ) ? gptr() + : egptr(); + newPos += off; + if( eback() <= newPos && newPos < egptr() ) + { + setg( eback(), newPos, egptr() ); + return newPos - eback(); + } + else + { + return errVal; + } + } }; /// For deducing ArrayViewStreambuf's template type @@ -105,7 +130,9 @@ namespace Q stream >> value; if( stream ) { - return sscanf_impl( { input.begin() + stream.gcount(), input.end() }, accumulator + 1, std::forward< Tail >( tail )... ); + auto pos = stream.tellg(); + gsl::cstring_view::const_iterator end = input.begin() + static_cast< int >( pos ); + return sscanf_impl( { end, input.end() }, accumulator + 1, std::forward< Tail >( tail )... ); } else { From 34dc437f92b83f35950a91fa7dc4e1429ce87451 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Tue, 3 Nov 2015 11:18:14 +0100 Subject: [PATCH 049/445] Added Q::sscanf string reading (like %s) --- shared/qcommon/safe/sscanf.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/shared/qcommon/safe/sscanf.h b/shared/qcommon/safe/sscanf.h index fc7872ab57..13325b3f39 100644 --- a/shared/qcommon/safe/sscanf.h +++ b/shared/qcommon/safe/sscanf.h @@ -68,6 +68,26 @@ namespace Q } } + // Whitespace-terminated string + template< typename... Tail > + std::size_t sscanf_impl( const gsl::cstring_view& input, const std::size_t accumulator, gsl::cstring_view& string, Tail&&... tail ) + { + // skip leading whitespace + auto begin = skipWhitespace( input.begin(), input.end() ); + // string is whitespace-terminated + auto end = std::find_if< gsl::cstring_view::const_iterator, int( *)( int ) >( + begin, input.end(), + std::isspace + ); + if( begin == end ) + { + // empty string is not accepted + return accumulator; + } + string = { begin, end }; + return sscanf_impl( { end, input.end() }, accumulator + 1, std::forward< Tail >( tail )... ); + } + /** A non-owning stream buffer; for adapting a gsl::cstring_view to std::istream */ From eb9e983013531e3af429da3408067e612beac543 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 2 Nov 2015 20:51:58 -0600 Subject: [PATCH 050/445] [SP] Port .ent file override support from MP. --- code/qcommon/cm_load.cpp | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/code/qcommon/cm_load.cpp b/code/qcommon/cm_load.cpp index 60b1728862..6083306c00 100644 --- a/code/qcommon/cm_load.cpp +++ b/code/qcommon/cm_load.cpp @@ -461,7 +461,28 @@ void CMod_LoadBrushSides (lump_t *l, clipMap_t &cm) CMod_LoadEntityString ================= */ -void CMod_LoadEntityString( lump_t *l, clipMap_t &cm ) { +void CMod_LoadEntityString( lump_t *l, clipMap_t &cm, const char* name ) { + fileHandle_t h; + char entName[MAX_QPATH]; + + // Attempt to load entities from an external .ent file if available + Q_strncpyz(entName, name, sizeof(entName)); + const size_t entNameLen = strlen(entName); + entName[entNameLen - 3] = 'e'; + entName[entNameLen - 2] = 'n'; + entName[entNameLen - 1] = 't'; + const int iEntityFileLen = FS_FOpenFileRead(entName, &h, qfalse); + if (h) + { + cm.entityString = (char *) Z_Malloc( iEntityFileLen + 1, TAG_BSP, qfalse ); + cm.numEntityChars = iEntityFileLen + 1; + FS_Read(cm.entityString, iEntityFileLen, h); + FS_FCloseFile(h); + cm.entityString[iEntityFileLen] = '\0'; + Com_Printf("Loaded entities from %s\n", entName); + return; + } + cm.entityString = (char *) Z_Malloc( l->filelen, TAG_BSP, qfalse); cm.numEntityChars = l->filelen; memcpy (cm.entityString, cmod_base + l->fileofs, l->filelen); @@ -759,7 +780,7 @@ static void CM_LoadMap_Actual( const char *name, qboolean clientload, int *check CMod_LoadBrushes (&header.lumps[LUMP_BRUSHES], cm); CMod_LoadSubmodels (&header.lumps[LUMP_MODELS], cm); CMod_LoadNodes (&header.lumps[LUMP_NODES], cm); - CMod_LoadEntityString (&header.lumps[LUMP_ENTITIES], cm); + CMod_LoadEntityString (&header.lumps[LUMP_ENTITIES], cm, name ); CMod_LoadVisibility( &header.lumps[LUMP_VISIBILITY], cm ); CMod_LoadPatches( &header.lumps[LUMP_SURFACES], &header.lumps[LUMP_DRAWVERTS], cm ); From 199af8f00980dac98e83980baf7d42aedea022da Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 2 Nov 2015 20:52:51 -0600 Subject: [PATCH 051/445] [SP] Don't use cgi cvar interface for setting cvars in ICARUS. --- code/game/Q3_Interface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index de00024ef5..12cd40da13 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -8165,7 +8165,7 @@ void CQuake3GameInterface::Set( int taskID, int entID, const char *type_name, co if(!Q_stricmpn(type_name, "cvar_", 5) && strlen(type_name) > 5) { - cgi_Cvar_Set(type_name+5, data); + gi.cvar_set(type_name+5, data); return; } From ccfc040c7d988f830e253399895abdd2546162d5 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Tue, 3 Nov 2015 21:52:49 +0100 Subject: [PATCH 052/445] Moved q_platform.h to shared --- code/CMakeLists.txt | 2 +- code/game/CMakeLists.txt | 2 +- code/rd-vanilla/CMakeLists.txt | 2 +- codeJK2/game/CMakeLists.txt | 2 +- codemp/CMakeLists.txt | 4 +- codemp/cgame/CMakeLists.txt | 2 +- codemp/game/CMakeLists.txt | 2 +- codemp/qcommon/q_platform.h | 242 -------------------------- codemp/ui/CMakeLists.txt | 2 +- {code => shared}/qcommon/q_platform.h | 0 10 files changed, 9 insertions(+), 251 deletions(-) delete mode 100644 codemp/qcommon/q_platform.h rename {code => shared}/qcommon/q_platform.h (100%) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 9256bd25c9..e40a82eeaa 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -162,7 +162,7 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" - "${SPDir}/qcommon/q_platform.h" + "${SharedDir}/qcommon/q_platform.h" "${SPDir}/qcommon/sstring.h" "${SPDir}/qcommon/stringed_ingame.cpp" diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index fad6496626..88148f77c7 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -260,7 +260,7 @@ set(SPGameCommonFiles "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" - "${SPDir}/qcommon/q_platform.h" + "${SharedDir}/qcommon/q_platform.h" ) source_group("common" FILES ${SPGameCommonFiles}) set(SPGameFiles ${SPGameFiles} ${SPGameCommonFiles}) diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index 19b159d87b..a2792e8f35 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -78,7 +78,7 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" - "${SPDir}/qcommon/q_platform.h" + "${SharedDir}/qcommon/q_platform.h" ) source_group("common" FILES ${SPRDVanillaCommonFiles}) set(SPRDVanillaFiles ${SPRDVanillaFiles} ${SPRDVanillaCommonFiles}) diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index 43e0e825f3..11e4761372 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -231,7 +231,7 @@ set(JK2SPGameCommonFiles "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" - "${SPDir}/qcommon/q_platform.h" + "${SharedDir}/qcommon/q_platform.h" "${SPDir}/qcommon/strippublic.h" ) source_group("common" FILES ${JK2SPGameCommonFiles}) diff --git a/codemp/CMakeLists.txt b/codemp/CMakeLists.txt index 6a844bed66..2f83dfb75e 100644 --- a/codemp/CMakeLists.txt +++ b/codemp/CMakeLists.txt @@ -132,7 +132,7 @@ if(BuildMPEngine OR BuildMPDed) "${MPDir}/qcommon/cm_public.h" "${MPDir}/qcommon/disablewarnings.h" "${MPDir}/qcommon/q_shared.h" - "${MPDir}/qcommon/q_platform.h" + "${SharedDir}/qcommon/q_platform.h" "${MPDir}/qcommon/qcommon.h" "${MPDir}/qcommon/qfiles.h" "${MPDir}/qcommon/tags.h" @@ -209,7 +209,7 @@ if(BuildMPEngine OR BuildMPDed) set(MPEngineAndDedCommonFiles "${MPDir}/qcommon/q_shared.h" - "${MPDir}/qcommon/q_platform.h" + "${SharedDir}/qcommon/q_platform.h" "${MPDir}/qcommon/cm_load.cpp" "${MPDir}/qcommon/cm_local.h" "${MPDir}/qcommon/cm_patch.cpp" diff --git a/codemp/cgame/CMakeLists.txt b/codemp/cgame/CMakeLists.txt index 1491f2fdf9..deae2d7c62 100644 --- a/codemp/cgame/CMakeLists.txt +++ b/codemp/cgame/CMakeLists.txt @@ -105,7 +105,7 @@ set(MPCGameCommonFiles "${MPDir}/qcommon/q_shared.c" "${MPDir}/qcommon/disablewarnings.h" "${MPDir}/qcommon/q_shared.h" - "${MPDir}/qcommon/q_platform.h" + "${SharedDir}/qcommon/q_platform.h" "${MPDir}/qcommon/qfiles.h" "${MPDir}/qcommon/tags.h" ) diff --git a/codemp/game/CMakeLists.txt b/codemp/game/CMakeLists.txt index 4eb5c47e18..c8112caabe 100644 --- a/codemp/game/CMakeLists.txt +++ b/codemp/game/CMakeLists.txt @@ -149,7 +149,7 @@ set(MPGameCommonFiles "${MPDir}/qcommon/q_shared.c" "${MPDir}/qcommon/disablewarnings.h" "${MPDir}/qcommon/q_shared.h" - "${MPDir}/qcommon/q_platform.h" + "${SharedDir}/qcommon/q_platform.h" "${MPDir}/qcommon/tags.h" ) source_group("common" FILES ${MPGameCommonFiles}) diff --git a/codemp/qcommon/q_platform.h b/codemp/qcommon/q_platform.h deleted file mode 100644 index 93632340be..0000000000 --- a/codemp/qcommon/q_platform.h +++ /dev/null @@ -1,242 +0,0 @@ -/* -=========================================================================== -Copyright (C) 1999 - 2005, Id Software, Inc. -Copyright (C) 2000 - 2013, Raven Software, Inc. -Copyright (C) 2001 - 2013, Activision, Inc. -Copyright (C) 2005 - 2015, ioquake3 contributors -Copyright (C) 2013 - 2015, OpenJK contributors - -This file is part of the OpenJK source code. - -OpenJK is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License version 2 as -published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, see . -=========================================================================== -*/ - -#pragma once - -// for windows fastcall option -#define QDECL -#define QCALL - -// Win64 -#if defined(WIN64) || defined(_WIN64) || defined(__WIN64__) - - #define idx64 - - #undef QDECL - #define QDECL __cdecl - - #undef QCALL - #define QCALL __stdcall - - #if defined(_MSC_VER) - #define OS_STRING "win_msvc" - #elif defined(__MINGW64__) - #define OS_STRING "win_mingw" - #endif - - #define QINLINE __inline - #define PATH_SEP '\\' - - #if defined(_M_ALPHA) - #define ARCH_STRING "AXP" - #else - #define ARCH_STRING "x86_64" - #endif - - #define Q3_LITTLE_ENDIAN - - #define DLL_EXT ".dll" - -// Win32 -#elif defined(_WIN32) || defined(__WIN32__) - - #undef QDECL - #define QDECL __cdecl - - #undef QCALL - #define QCALL __stdcall - - #if defined(_MSC_VER) - #define OS_STRING "win_msvc" - #elif defined(__MINGW32__) - #define OS_STRING "win_mingw" - #endif - - #define QINLINE __inline - #define PATH_SEP '\\' - - #if defined(_M_IX86) || defined(__i386__) - #define ARCH_STRING "x86" - #elif defined _M_ALPHA - #define ARCH_STRING "AXP" - #endif - - #define Q3_LITTLE_ENDIAN - - #define DLL_EXT ".dll" - -// MAC OS X -#elif defined(MACOS_X) || defined(__APPLE_CC__) - - // make sure this is defined, just for sanity's sake... - #ifndef MACOS_X - #define MACOS_X - #endif - - #define OS_STRING "macosx" - #define QINLINE /*inline*/ - #define PATH_SEP '/' - - #if defined(__ppc__) - #define ARCH_STRING "ppc" - #define Q3_BIG_ENDIAN - #elif defined(__i386__) - #define ARCH_STRING "x86" - #define Q3_LITTLE_ENDIAN - #elif defined(__x86_64__) - #define idx64 - #define ARCH_STRING "x86_64" - #define Q3_LITTLE_ENDIAN - #endif - - #define DLL_EXT ".dylib" - -// Linux -#elif defined(__linux__) || defined(__FreeBSD_kernel__) - - #include - - #if defined(__linux__) - #define OS_STRING "linux" - #else - #define OS_STRING "kFreeBSD" - #endif - - #ifdef __clang__ - #define QINLINE static inline - #else - #define QINLINE inline - #endif - - #define PATH_SEP '/' - - #if !defined(ARCH_STRING) - #error ARCH_STRING should be defined by the build system - #endif - - #if defined(__x86_64__) - #define idx64 - #endif - - #if __FLOAT_WORD_ORDER == __BIG_ENDIAN - #define Q3_BIG_ENDIAN - #else - #define Q3_LITTLE_ENDIAN - #endif - - #define DLL_EXT ".so" - -// BSD -#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) - - #include - #include - - #ifndef __BSD__ - #define __BSD__ - #endif - - #if defined(__FreeBSD__) - #define OS_STRING "freebsd" - #elif defined(__OpenBSD__) - #define OS_STRING "openbsd" - #elif defined(__NetBSD__) - #define OS_STRING "netbsd" - #endif - - #define QINLINE inline - #define PATH_SEP '/' - - #if !defined(ARCH_STRING) - #error ARCH_STRING should be defined by the build system - #endif - - #if defined(__amd64__) - #define idx64 - #endif - - #if BYTE_ORDER == BIG_ENDIAN - #define Q3_BIG_ENDIAN - #else - #define Q3_LITTLE_ENDIAN - #endif - - #define DLL_EXT ".so" -#endif - -// catch missing defines in above blocks -#if !defined(OS_STRING) - #error "Operating system not supported" -#endif -#if !defined(ARCH_STRING) - #error "Architecture not supported" -#endif -#if !defined(DLL_EXT) - #error "DLL_EXT not defined" -#endif -#if !defined(QINLINE) - #error "QINLINE not defined" -#endif -#if !defined(PATH_SEP) - #error "PATH_SEP not defined" -#endif - -// endianness -void CopyShortSwap( void *dest, void *src ); -void CopyLongSwap( void *dest, void *src ); -short ShortSwap( short l ); -int LongSwap( int l ); -float FloatSwap( const float *f ); - -#if defined(Q3_BIG_ENDIAN) && defined(Q3_LITTLE_ENDIAN) - #error "Endianness defined as both big and little" -#elif defined(Q3_BIG_ENDIAN) - #define CopyLittleShort( dest, src ) CopyShortSwap( dest, src ) - #define CopyLittleLong( dest, src ) CopyLongSwap( dest, src ) - #define LittleShort( x ) ShortSwap( x ) - #define LittleLong( x ) LongSwap( x ) - #define LittleFloat( x ) FloatSwap( &x ) - #define BigShort - #define BigLong - #define BigFloat -#elif defined( Q3_LITTLE_ENDIAN ) - #define CopyLittleShort( dest, src ) Com_Memcpy(dest, src, 2) - #define CopyLittleLong( dest, src ) Com_Memcpy(dest, src, 4) - #define LittleShort - #define LittleLong - #define LittleFloat - #define BigShort( x ) ShortSwap( x ) - #define BigLong( x ) LongSwap( x ) - #define BigFloat( x ) FloatSwap( &x ) -#else - #error "Endianness not defined" -#endif - - -// platform string -#if defined(NDEBUG) - #define PLATFORM_STRING OS_STRING "-" ARCH_STRING -#else - #define PLATFORM_STRING OS_STRING "-" ARCH_STRING "-debug" -#endif diff --git a/codemp/ui/CMakeLists.txt b/codemp/ui/CMakeLists.txt index 4c17b1ee1d..6d5783ad3d 100644 --- a/codemp/ui/CMakeLists.txt +++ b/codemp/ui/CMakeLists.txt @@ -53,7 +53,7 @@ set(MPUICommonFiles "${MPDir}/qcommon/disablewarnings.h" "${MPDir}/qcommon/game_version.h" "${MPDir}/qcommon/q_shared.h" - "${MPDir}/qcommon/q_platform.h" + "${SharedDir}/qcommon/q_platform.h" "${MPDir}/qcommon/qfiles.h" "${MPDir}/qcommon/tags.h" ) diff --git a/code/qcommon/q_platform.h b/shared/qcommon/q_platform.h similarity index 100% rename from code/qcommon/q_platform.h rename to shared/qcommon/q_platform.h From 436f997d5793cacecc2ad9706d849c5713d049a4 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Tue, 3 Nov 2015 21:54:49 +0100 Subject: [PATCH 053/445] Not using noexcept on on VS <2015 --- code/qcommon/q_shared.h | 2 +- code/qcommon/safe/memory.h | 8 ++++---- shared/qcommon/q_platform.h | 12 ++++++++++++ shared/qcommon/safe/files.cpp | 16 ++++++++-------- shared/qcommon/safe/files.h | 34 ++++++++++++++++++---------------- 5 files changed, 43 insertions(+), 29 deletions(-) diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 7bb23f09b8..d09da44891 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -154,7 +154,7 @@ int LongSwap( int l ); float FloatSwap( const float *f ); -#include "../qcommon/q_platform.h" +#include "qcommon/q_platform.h" // ================================================================ // TYPE DEFINITIONS diff --git a/code/qcommon/safe/memory.h b/code/qcommon/safe/memory.h index 5279bc5278..d45b388c25 100644 --- a/code/qcommon/safe/memory.h +++ b/code/qcommon/safe/memory.h @@ -35,7 +35,7 @@ namespace Zone */ struct Deleter { - void operator()( void* memory ) const noexcept + void operator()( void* memory ) const NOEXCEPT { detail::Free( memory ); } @@ -59,17 +59,17 @@ namespace Zone void* mem = detail::Malloc( n * sizeof( T ), tag ); return static_cast< T* >( mem ); } - void deallocate( T* mem, std::size_t n ) const noexcept + void deallocate( T* mem, std::size_t n ) const NOEXCEPT { Deleter{}( mem ); } template< typename T2, memtag_t tag2 > - bool operator==( const Allocator< T2, tag2 >& ) const noexcept + bool operator==( const Allocator< T2, tag2 >& ) const NOEXCEPT { return true; // free works regardless of size and tag } template< typename T2, memtag_t tag2 > - bool operator!=( const Allocator< T2, tag2 >& ) const noexcept + bool operator!=( const Allocator< T2, tag2 >& ) const NOEXCEPT { return false; } diff --git a/shared/qcommon/q_platform.h b/shared/qcommon/q_platform.h index 93632340be..f638b66354 100644 --- a/shared/qcommon/q_platform.h +++ b/shared/qcommon/q_platform.h @@ -185,6 +185,18 @@ along with this program; if not, see . #define DLL_EXT ".so" #endif +#if defined( _MSC_VER ) && (_MSC_VER < 1900) +// VS2013, which for some reason we still support, does not support noexcept +#define NOEXCEPT +#define NOEXCEPT_IF(x) +#define IS_NOEXCEPT(x) false +#else +#define NOEXCEPT noexcept +#define NOEXCEPT_IF(x) noexcept(x) +#define IS_NOEXCEPT(x) noexcept(x) +#endif + + // catch missing defines in above blocks #if !defined(OS_STRING) #error "Operating system not supported" diff --git a/shared/qcommon/safe/files.cpp b/shared/qcommon/safe/files.cpp index badcd7d828..b8e3a53b96 100644 --- a/shared/qcommon/safe/files.cpp +++ b/shared/qcommon/safe/files.cpp @@ -6,7 +6,7 @@ namespace FS { // FileBuffer - FileBuffer::FileBuffer( void* buffer, const long size ) noexcept + FileBuffer::FileBuffer( void* buffer, const long size ) NOEXCEPT : _buffer( buffer ) , _size( size ) { @@ -14,7 +14,7 @@ namespace FS assert( size >= 0 ); } - FileBuffer::~FileBuffer() noexcept + FileBuffer::~FileBuffer() NOEXCEPT { if( _buffer ) { @@ -22,7 +22,7 @@ namespace FS } } - FileBuffer::FileBuffer( FileBuffer&& rhs ) noexcept + FileBuffer::FileBuffer( FileBuffer&& rhs ) NOEXCEPT : _buffer( rhs._buffer ) , _size( rhs._size ) { @@ -30,7 +30,7 @@ namespace FS rhs._size = 0; } - FileBuffer& FileBuffer::operator=( FileBuffer&& rhs ) noexcept + FileBuffer& FileBuffer::operator=( FileBuffer&& rhs ) NOEXCEPT { if( _buffer ) { @@ -52,14 +52,14 @@ namespace FS // FileList - FileList::FileList( char** files, int numFiles ) noexcept + FileList::FileList( char** files, int numFiles ) NOEXCEPT : _begin( files ) , _end( files + numFiles ) { assert( numFiles >= 0 ); } - FileList::~FileList() noexcept + FileList::~FileList() NOEXCEPT { if( _begin ) { @@ -67,7 +67,7 @@ namespace FS } } - FileList::FileList( FileList&& rhs ) noexcept + FileList::FileList( FileList&& rhs ) NOEXCEPT : _begin( rhs._begin ) , _end( rhs._end ) { @@ -75,7 +75,7 @@ namespace FS rhs._end = nullptr; } - FileList& FileList::operator=( FileList&& rhs ) noexcept + FileList& FileList::operator=( FileList&& rhs ) NOEXCEPT { if( _begin != nullptr ) { diff --git a/shared/qcommon/safe/files.h b/shared/qcommon/safe/files.h index 9f8f3109a7..7626b50b2f 100644 --- a/shared/qcommon/safe/files.h +++ b/shared/qcommon/safe/files.h @@ -3,6 +3,8 @@ #include #include +#include "qcommon/q_platform.h" + /** @file RAII C++ bindings for filesystem operations */ @@ -13,27 +15,27 @@ namespace FS { friend FileBuffer ReadFile( const char* ); // called by ReadFile() - FileBuffer( void* buffer, const long size ) noexcept; + FileBuffer( void* buffer, const long size ) NOEXCEPT; public: - FileBuffer() noexcept = default; - ~FileBuffer() noexcept; + FileBuffer() NOEXCEPT = default; + ~FileBuffer() NOEXCEPT; // noncopyable FileBuffer( const FileBuffer& ) = delete; FileBuffer& operator=( const FileBuffer& ) = delete; // movable - FileBuffer( FileBuffer&& rhs ) noexcept; - FileBuffer& operator=( FileBuffer&& rhs ) noexcept; + FileBuffer( FileBuffer&& rhs ) NOEXCEPT; + FileBuffer& operator=( FileBuffer&& rhs ) NOEXCEPT; /// nullptr if no such file - const char* begin() const noexcept + const char* begin() const NOEXCEPT { return static_cast< const char* >( _buffer ); } - const char* end() const noexcept + const char* end() const NOEXCEPT { return static_cast< const char* >( _buffer ) + _size; } - long size() const noexcept + long size() const NOEXCEPT { return _size; } @@ -50,26 +52,26 @@ namespace FS { friend FileList ListFiles( const char*, const char* ); // called by ListFiles() - FileList( char** files, int numFiles ) noexcept; + FileList( char** files, int numFiles ) NOEXCEPT; public: - FileList() noexcept = default; - ~FileList() noexcept; + FileList() NOEXCEPT = default; + ~FileList() NOEXCEPT; // noncopyable FileList( const FileList& ) = delete; FileList& operator=( const FileList& ) = delete; // movable - FileList( FileList&& rhs ) noexcept; - FileList& operator=( FileList&& rhs ) noexcept; + FileList( FileList&& rhs ) NOEXCEPT; + FileList& operator=( FileList&& rhs ) NOEXCEPT; - const char *const *begin() const noexcept + const char *const *begin() const NOEXCEPT { return _begin; } - const char *const *end() const noexcept + const char *const *end() const NOEXCEPT { return _end; } - std::size_t size() const noexcept + std::size_t size() const NOEXCEPT { return static_cast< std::size_t >( _end - begin() ); } From 923d6d43a409bff8d0c82637c6e90f8be6b53043 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Wed, 4 Nov 2015 20:32:14 +0100 Subject: [PATCH 054/445] Making FS::ReadFile & FS::FileBuffer available in SP Library. --- code/game/CMakeLists.txt | 4 +++- shared/qcommon/safe/files.cpp | 31 +++++++++++++++++++++++++------ shared/qcommon/safe/files.h | 4 ++++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 88148f77c7..f7ef71b793 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -21,7 +21,7 @@ if(NOT InOpenJK) message(FATAL_ERROR "Use the top-level cmake script!") endif(NOT InOpenJK) -set(SPGameDefines ${SharedDefines}) +set(SPGameDefines ${SharedDefines} "SP_GAME") set(SPGameIncludeDirectories ${SharedDir} ${SPDir} @@ -268,6 +268,8 @@ set(SPGameFiles ${SPGameFiles} ${SPGameCommonFiles}) set(SPGameCommonSafeFiles "${SharedDir}/qcommon/safe/gsl.h" "${SharedDir}/qcommon/safe/sscanf.h" + "${SharedDir}/qcommon/safe/files.h" + "${SharedDir}/qcommon/safe/files.cpp" "${SPDir}/qcommon/safe/memory.h" ) source_group("common/safe" FILES ${SPGameCommonSafeFiles}) diff --git a/shared/qcommon/safe/files.cpp b/shared/qcommon/safe/files.cpp index b8e3a53b96..14d4af6efa 100644 --- a/shared/qcommon/safe/files.cpp +++ b/shared/qcommon/safe/files.cpp @@ -1,11 +1,27 @@ #include "files.h" -#include "qcommon/qcommon.h" +#if defined( SP_GAME ) +# include "game/g_shared.h" // gi +#else +# include "qcommon/qcommon.h" +#endif namespace FS { // FileBuffer + static void freeFileBuffer( void* buffer ) + { + if( buffer ) + { +#if defined( SP_GAME ) + gi.FS_FreeFile( buffer ); +#else + FS_FreeFile( buffer ); +#endif + } + } + FileBuffer::FileBuffer( void* buffer, const long size ) NOEXCEPT : _buffer( buffer ) , _size( size ) @@ -16,10 +32,7 @@ namespace FS FileBuffer::~FileBuffer() NOEXCEPT { - if( _buffer ) - { - FS_FreeFile( _buffer ); - } + freeFileBuffer( _buffer ); } FileBuffer::FileBuffer( FileBuffer&& rhs ) NOEXCEPT @@ -34,7 +47,7 @@ namespace FS { if( _buffer ) { - FS_FreeFile( _buffer ); + freeFileBuffer( _buffer ); } _buffer = rhs._buffer; rhs._buffer = nullptr; @@ -46,10 +59,15 @@ namespace FS FileBuffer ReadFile( const char* path ) { void* buffer; +#if defined( SP_GAME ) + const long size = gi.FS_ReadFile( path, &buffer ); +#else const long size = FS_ReadFile( path, &buffer ); +#endif return size >= 0 ? FileBuffer{ buffer, size } : FileBuffer{}; } +#if !defined( SP_GAME ) // FileList FileList::FileList( char** files, int numFiles ) NOEXCEPT @@ -94,4 +112,5 @@ namespace FS auto files = FS_ListFiles( directory, extension, &numFiles ); return FileList{ files, numFiles }; } +#endif } diff --git a/shared/qcommon/safe/files.h b/shared/qcommon/safe/files.h index 7626b50b2f..29efbc85dc 100644 --- a/shared/qcommon/safe/files.h +++ b/shared/qcommon/safe/files.h @@ -48,6 +48,9 @@ namespace FS FileBuffer ReadFile( const char* path ); + // FileList only available in Client; Library exclusively uses FS_GetFileList(), which by supplying a buffer avoids dynamic allocations. + // TODO: investigate making FS_ListFiles available in Library Code? +#if !defined( SP_GAME ) class FileList { friend FileList ListFiles( const char*, const char* ); @@ -93,4 +96,5 @@ namespace FS @param extension if "/", only subdirectories will be returned */ FileList ListFiles( const char* directory, const char* extension ); +#endif } From 08bda13578866137400ecccb95c7161eb6367943 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Wed, 4 Nov 2015 20:46:02 +0100 Subject: [PATCH 055/445] Method to get string view into an FS::FileBuffer --- shared/qcommon/safe/files.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/shared/qcommon/safe/files.h b/shared/qcommon/safe/files.h index 29efbc85dc..c9966a771c 100644 --- a/shared/qcommon/safe/files.h +++ b/shared/qcommon/safe/files.h @@ -4,6 +4,7 @@ #include #include "qcommon/q_platform.h" +#include "qcommon/safe/gsl.h" /** @file RAII C++ bindings for filesystem operations @@ -39,6 +40,10 @@ namespace FS { return _size; } + gsl::cstring_view view() const NOEXCEPT + { + return{ begin(), end() }; + } private: // TODO: ought to be const; would have to fix FS_ReadFile though. From 93d17cc3bb12d3cded38a92c2111947818720cf0 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Wed, 4 Nov 2015 20:46:29 +0100 Subject: [PATCH 056/445] FS::FileBuffer ability to check for failure to read file. --- shared/qcommon/safe/files.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/shared/qcommon/safe/files.h b/shared/qcommon/safe/files.h index c9966a771c..69580cdf47 100644 --- a/shared/qcommon/safe/files.h +++ b/shared/qcommon/safe/files.h @@ -40,6 +40,10 @@ namespace FS { return _size; } + bool valid() const NOEXCEPT + { + return _buffer != nullptr; + } gsl::cstring_view view() const NOEXCEPT { return{ begin(), end() }; From 652c5dd2c7b3878fdc535be7fa6912dca33ce51e Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Wed, 4 Nov 2015 21:00:03 +0100 Subject: [PATCH 057/445] Added missing codemp include directory --- codemp/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codemp/CMakeLists.txt b/codemp/CMakeLists.txt index 2f83dfb75e..b9620e5a04 100644 --- a/codemp/CMakeLists.txt +++ b/codemp/CMakeLists.txt @@ -172,7 +172,7 @@ if(BuildMPEngine OR BuildMPDed) endif(WIN32) # Include directories - set(MPEngineAndDedIncludeDirectories ${MPDir} ${SharedDir}) # codemp folder, since includes are not always relative in the files + set(MPEngineAndDedIncludeDirectories ${MPDir} ${SharedDir} ${GSLIncludeDirectory}) # codemp folder, since includes are not always relative in the files # Transparently use our bundled minizip. list(APPEND MPEngineAndDedIncludeDirectories ${MINIZIP_INCLUDE_DIRS}) From 2e413e00ae0dcf0b1435b4a6fb987be0db4a6cfa Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Tue, 3 Nov 2015 22:00:27 +0100 Subject: [PATCH 058/445] [WIP] Fixed incorrect include in safe/memory.h --- code/qcommon/safe/memory.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/qcommon/safe/memory.h b/code/qcommon/safe/memory.h index d45b388c25..6df9afe0f3 100644 --- a/code/qcommon/safe/memory.h +++ b/code/qcommon/safe/memory.h @@ -3,7 +3,7 @@ #ifdef _JK2EXE # include "qcommon/qcommon.h" #else -# include "qcommon/q_shared.h" +# include "game/g_shared.h" #endif #include From 5682f58d558a361e7ca80d7792ad1efea1f99268 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Wed, 4 Nov 2015 21:15:30 +0100 Subject: [PATCH 059/445] fixed missing centity_t define in jagame safe/file.cpp --- shared/qcommon/safe/files.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/shared/qcommon/safe/files.cpp b/shared/qcommon/safe/files.cpp index 14d4af6efa..f699736450 100644 --- a/shared/qcommon/safe/files.cpp +++ b/shared/qcommon/safe/files.cpp @@ -1,6 +1,7 @@ #include "files.h" #if defined( SP_GAME ) +# define GAME_INCLUDE // so centity_t is defined in g_shared.h (alternatively include g_public.h?) # include "game/g_shared.h" // gi #else # include "qcommon/qcommon.h" From 7627a8db3215fae40eb40dbb3667c95938a6c800 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Wed, 4 Nov 2015 21:27:30 +0100 Subject: [PATCH 060/445] workaround for VS2013's super annoying lack of user-defined literals --- shared/qcommon/safe/gsl.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/shared/qcommon/safe/gsl.h b/shared/qcommon/safe/gsl.h index c813a4597f..3ebe6d81cc 100644 --- a/shared/qcommon/safe/gsl.h +++ b/shared/qcommon/safe/gsl.h @@ -3,8 +3,22 @@ // central point of include to simplify possible future swap for Microsoft's implementation #include +#if defined( _MSC_VER ) && _MSC_VER < 1900 +// VS2013 needs a workaround for its lack of user-defined literals. Fuck VS2013. +// TODO: eradicate VS2013 +// The workaround is using CSTRING_VIEW("literal") instead of "literal"_v (for the time being). +# define CSTRING_VIEW(x) vs2013hack_cstring_view_literal(x) +template< int length > +inline gsl::cstring_view vs2013hack_cstring_view_literal( const char (&str)[length] ) +{ + static_assert( length > 0, "CSTRING_VIEW expects a string literal argument." ); + return{ str, str + length - 1 }; +} +#else +# define CSTRING_VIEW(x) x ## _v /** gsl::cstring_view from string literal (without null-termination) */ inline gsl::cstring_view operator"" _v( const char* str, std::size_t length ) { return{ str, str + length }; } +#endif From 2a88c01fdb0a4aa8a2dbdb435167c0abd4ea08c2 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Thu, 5 Nov 2015 23:29:38 +0100 Subject: [PATCH 061/445] Fixed Q::scanff header implementation function not being inline --- shared/qcommon/safe/sscanf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/qcommon/safe/sscanf.h b/shared/qcommon/safe/sscanf.h index 13325b3f39..3b95b0fcb4 100644 --- a/shared/qcommon/safe/sscanf.h +++ b/shared/qcommon/safe/sscanf.h @@ -13,7 +13,7 @@ namespace Q { namespace detail { - std::size_t sscanf_impl( const gsl::cstring_view& input, const std::size_t accumulator ) + inline std::size_t sscanf_impl( const gsl::cstring_view& input, const std::size_t accumulator ) { // Scan successful, all format arguments satisfied return accumulator; From c175cdc949d0472c00eab7514fb07570a62368de Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Thu, 5 Nov 2015 23:33:27 +0100 Subject: [PATCH 062/445] Fixed Q::sscanf()'s stream implementation failing on EOF. --- shared/qcommon/safe/sscanf.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/shared/qcommon/safe/sscanf.h b/shared/qcommon/safe/sscanf.h index 3b95b0fcb4..b8f2d0b4c1 100644 --- a/shared/qcommon/safe/sscanf.h +++ b/shared/qcommon/safe/sscanf.h @@ -6,6 +6,7 @@ #include #include #include +#include #include "gsl.h" @@ -116,7 +117,7 @@ namespace Q : ( which == std::ios_base::cur ) ? gptr() : egptr(); newPos += off; - if( eback() <= newPos && newPos < egptr() ) + if( eback() <= newPos && newPos <= egptr() ) { setg( eback(), newPos, egptr() ); return newPos - eback(); @@ -148,9 +149,16 @@ namespace Q stream >> std::noskipws; } stream >> value; - if( stream ) + if( !stream.fail() ) { auto pos = stream.tellg(); + // tellg() fails on eof, returning -1 + if( pos == std::istream::pos_type{ -1 } ) + { + assert( stream.eof() ); + pos = input.size(); + } + assert( pos != std::istream::pos_type{ -1 } ); gsl::cstring_view::const_iterator end = input.begin() + static_cast< int >( pos ); return sscanf_impl( { end, input.end() }, accumulator + 1, std::forward< Tail >( tail )... ); } From 9e51cc110d6b474360bc52049d0f481ef6197922 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Thu, 5 Nov 2015 23:35:21 +0100 Subject: [PATCH 063/445] Added string view based Q::stricmp and Q::svtoi (string view to int). --- code/CMakeLists.txt | 2 + code/game/CMakeLists.txt | 2 + code/rd-vanilla/CMakeLists.txt | 2 + codeJK2/game/CMakeLists.txt | 2 + codemp/CMakeLists.txt | 2 + codemp/cgame/CMakeLists.txt | 2 + codemp/game/CMakeLists.txt | 2 + codemp/rd-vanilla/CMakeLists.txt | 2 + codemp/ui/CMakeLists.txt | 2 + shared/qcommon/safe/string.cpp | 82 ++++++++++++++++++++++++++++++++ shared/qcommon/safe/string.h | 49 +++++++++++++++++++ 11 files changed, 149 insertions(+) create mode 100644 shared/qcommon/safe/string.cpp create mode 100644 shared/qcommon/safe/string.h diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index e40a82eeaa..e5adbfcee9 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -187,6 +187,8 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SharedDir}/qcommon/safe/files.cpp" "${SharedDir}/qcommon/safe/files.h" "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/string.cpp" + "${SharedDir}/qcommon/safe/string.h" "${SharedDir}/qcommon/safe/sscanf.h" "${SPDir}/qcommon/safe/memory.h" ) diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index f7ef71b793..3bdc2b9b89 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -267,6 +267,8 @@ set(SPGameFiles ${SPGameFiles} ${SPGameCommonFiles}) set(SPGameCommonSafeFiles "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/string.cpp" + "${SharedDir}/qcommon/safe/string.h" "${SharedDir}/qcommon/safe/sscanf.h" "${SharedDir}/qcommon/safe/files.h" "${SharedDir}/qcommon/safe/files.cpp" diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index a2792e8f35..0862ba58b2 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -86,6 +86,8 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) # Misc files set(SPRDVanillaCommonSafeFiles "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/string.cpp" + "${SharedDir}/qcommon/safe/string.h" "${SharedDir}/qcommon/safe/sscanf.h" ) source_group("common/safe" FILES ${SPRDVanillaCommonSafeFiles}) diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index 11e4761372..befe1d6689 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -240,6 +240,8 @@ set(JK2SPGameFiles ${JK2SPGameFiles} ${JK2SPGameCommonFiles}) set(JK2SPGameCommonSafeFiles #We only have JKA qcommon files now. "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/string.cpp" + "${SharedDir}/qcommon/safe/string.h" "${SharedDir}/qcommon/safe/sscanf.h" ) source_group("common/safe" FILES ${JK2SPGameCommonSafeFiles}) diff --git a/codemp/CMakeLists.txt b/codemp/CMakeLists.txt index b9620e5a04..a5580b1bba 100644 --- a/codemp/CMakeLists.txt +++ b/codemp/CMakeLists.txt @@ -142,6 +142,8 @@ if(BuildMPEngine OR BuildMPDed) set(MPBotlibCommonSafeFiles "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/string.cpp" + "${SharedDir}/qcommon/safe/string.h" "${SharedDir}/qcommon/safe/sscanf.h" ) source_group("common/safe" FILES ${MPBotlibCommonSafeFiles}) diff --git a/codemp/cgame/CMakeLists.txt b/codemp/cgame/CMakeLists.txt index deae2d7c62..3b238c45d4 100644 --- a/codemp/cgame/CMakeLists.txt +++ b/codemp/cgame/CMakeLists.txt @@ -114,6 +114,8 @@ set(MPCGameFiles ${MPCGameFiles} ${MPCGameCommonFiles}) set(MPCGameCommonSafeFiles "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/string.cpp" + "${SharedDir}/qcommon/safe/string.h" "${SharedDir}/qcommon/safe/sscanf.h" ) source_group("common/safe" FILES ${MPCGameCommonSafeFiles}) diff --git a/codemp/game/CMakeLists.txt b/codemp/game/CMakeLists.txt index c8112caabe..e2a4ca24fc 100644 --- a/codemp/game/CMakeLists.txt +++ b/codemp/game/CMakeLists.txt @@ -157,6 +157,8 @@ set(MPGameFiles ${MPGameFiles} ${MPGameCommonFiles}) set(MPGameCommonSafeFiles "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/string.cpp" + "${SharedDir}/qcommon/safe/string.h" "${SharedDir}/qcommon/safe/sscanf.h" ) source_group("common/safe" FILES ${MPGameCommonSafeFiles}) diff --git a/codemp/rd-vanilla/CMakeLists.txt b/codemp/rd-vanilla/CMakeLists.txt index 78ad787bb2..3ae132a4ee 100644 --- a/codemp/rd-vanilla/CMakeLists.txt +++ b/codemp/rd-vanilla/CMakeLists.txt @@ -105,6 +105,8 @@ set(MPVanillaRendererFiles ${MPVanillaRendererFiles} ${MPVanillaRendererCommonFi set(MPVanillaRendererCommonSafeFiles "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/string.cpp" + "${SharedDir}/qcommon/safe/string.h" "${SharedDir}/qcommon/safe/sscanf.h" ) source_group("common/safe" FILES ${MPVanillaRendererCommonSafeFiles}) diff --git a/codemp/ui/CMakeLists.txt b/codemp/ui/CMakeLists.txt index 6d5783ad3d..a4256d83ff 100644 --- a/codemp/ui/CMakeLists.txt +++ b/codemp/ui/CMakeLists.txt @@ -62,6 +62,8 @@ set(MPUIFiles ${MPUIFiles} ${MPUICommonFiles}) set(MPUICommonSafeFiles "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/string.cpp" + "${SharedDir}/qcommon/safe/string.h" "${SharedDir}/qcommon/safe/sscanf.h" ) source_group("common/safe" FILES ${MPUICommonSafeFiles}) diff --git a/shared/qcommon/safe/string.cpp b/shared/qcommon/safe/string.cpp new file mode 100644 index 0000000000..cb31d42734 --- /dev/null +++ b/shared/qcommon/safe/string.cpp @@ -0,0 +1,82 @@ +#include "string.h" + +#include +#include + +namespace Q +{ + Ordering stricmp( const gsl::cstring_view& lhs, const gsl::cstring_view& rhs ) + { + auto lIt = lhs.begin(); + auto rIt = rhs.begin(); + auto lEnd = lhs.end(); + auto rEnd = rhs.end(); + while( lIt != lEnd ) + { + if( rIt == rEnd ) + { + // rhs is prefix of lhs + return Ordering::GT; + } + if( std::tolower( *lIt ) < std::tolower( *rIt ) ) + { + return Ordering::LT; + } + if( std::tolower( *lIt ) > std::tolower( *rIt ) ) + { + return Ordering::GT; + } + ++lIt; + ++rIt; + } + if( rIt == rEnd ) + { + // lhs == rhs + return Ordering::EQ; + } + // lhs is a prefix or rhs + return Ordering::LT; + } + + int svtoi( const gsl::cstring_view& view ) + { + auto end = view.end(); + // skip whitespace + auto it = std::find_if_not( view.begin(), end, std::isspace ); + if( it == end ) + { + return 0; + } + bool negate = false; + if( *it == '+' ) + { + ++it; + } + else if( *it == '-' ) + { + negate = true; + ++it; + } + int result = 0; + while( it != end ) + { + if( *it < '0' || *it > '9' ) + { + break; + } + const int digit = *it - '0'; + result *= 10; + // not negating after the fact so we don't lose MIN_INT + if( negate ) + { + result -= digit; + } + else + { + result += digit; + } + ++it; + } + return result; + } +} diff --git a/shared/qcommon/safe/string.h b/shared/qcommon/safe/string.h new file mode 100644 index 0000000000..10333939b3 --- /dev/null +++ b/shared/qcommon/safe/string.h @@ -0,0 +1,49 @@ +#pragma once + +#include "sscanf.h" +#include "gsl.h" +#include "qcommon/q_platform.h" + +#include +#include + +namespace Q +{ + enum class Ordering : int + { + LT = -1, + EQ = 0, + GT = 1 + }; + Ordering stricmp( const gsl::cstring_view& lhs, const gsl::cstring_view& rhs ); + /// Case-insensitive less comparator for cstring_view + struct CCStringViewILess + { + bool operator()( const gsl::cstring_view& lhs, const gsl::cstring_view& rhs ) const NOEXCEPT + { + return stricmp( lhs, rhs ) == Ordering::LT; + } + }; + + int svtoi( const gsl::cstring_view& view ); +} + +// operator<< overloads +namespace std +{ + inline std::ostream& operator<<( std::ostream& stream, Q::Ordering ordering ) + { + switch( ordering ) + { + case Q::Ordering::EQ: + return stream << "EQ"; + case Q::Ordering::LT: + return stream << "LT"; + case Q::Ordering::GT: + return stream << "GT"; + default: + assert( false ); + return stream; + } + } +} From c9097f03cf21cffdc32bd39b3b5a7d1cc6cfa739 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Thu, 5 Nov 2015 23:35:48 +0100 Subject: [PATCH 064/445] doc comment --- shared/qcommon/safe/gsl.h | 1 + 1 file changed, 1 insertion(+) diff --git a/shared/qcommon/safe/gsl.h b/shared/qcommon/safe/gsl.h index 3ebe6d81cc..62ee5e494a 100644 --- a/shared/qcommon/safe/gsl.h +++ b/shared/qcommon/safe/gsl.h @@ -3,6 +3,7 @@ // central point of include to simplify possible future swap for Microsoft's implementation #include +// the default cstring_view constructor from string literals includes the terminating null; this one does not. #if defined( _MSC_VER ) && _MSC_VER < 1900 // VS2013 needs a workaround for its lack of user-defined literals. Fuck VS2013. // TODO: eradicate VS2013 From b087a453f0127361b88f3dd50427662d44fd5971 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Thu, 5 Nov 2015 23:37:02 +0100 Subject: [PATCH 065/445] Optional Boost.Test unit tests (default off). These already paid off, the previously fixed sscanf issues were found this way. Also includes natvis file for VS Debugger pretty printing --- CMakeLists.txt | 5 ++++ shared/openjk.natvis | 13 ++++++++ tests/CMakeLists.txt | 57 +++++++++++++++++++++++++++++++++++ tests/main.cpp | 3 ++ tests/safe/string.cpp | 69 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 147 insertions(+) create mode 100644 shared/openjk.natvis create mode 100644 tests/CMakeLists.txt create mode 100644 tests/main.cpp create mode 100644 tests/safe/string.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 26458079b3..9a5f346052 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,6 +44,8 @@ option(BuildJK2SPEngine "Whether to create projects for the jk2 SP engine (openj option(BuildJK2SPGame "Whether to create projects for the jk2 sp gamecode mod (jk2gamex86.dll)" OFF) option(BuildJK2SPRdVanilla "Whether to create projects for the jk2 sp renderer (rdjosp-vanilla_x86.dll)" OFF) +option(BuildTests "Whether to build automatic unit tests (requires Boost)" OFF) + # Configure the use of bundled libraries. By default, we assume the user is on # a platform that does not require any bundling. # @@ -309,3 +311,6 @@ add_subdirectory(${MPDir}) if(WIN32 AND MSVC) add_subdirectory("tools/WinSymbol") endif() +if(BuildTests) + add_subdirectory("tests") +endif() diff --git a/shared/openjk.natvis b/shared/openjk.natvis new file mode 100644 index 0000000000..4ac8335dbb --- /dev/null +++ b/shared/openjk.natvis @@ -0,0 +1,13 @@ + + + + + {{ {begin_,[end_ - begin_]} }} + + + end_ - begin_ + begin_ + + + + \ No newline at end of file diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000000..a72ca69876 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,57 @@ +#============================================================================ +# Copyright (C) 2013 - 2015, OpenJK contributors +# +# This file is part of the OpenJK source code. +# +# OpenJK is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +#============================================================================ + +# Make sure the user is not executing this script directly +if(NOT InOpenJK) + message(FATAL_ERROR "Use the top-level cmake script!") +endif(NOT InOpenJK) + +set(TestFiles + "main.cpp" + "safe/string.cpp" + "${SharedDir}/qcommon/safe/string.cpp" + ) +if(MSVC) + set(TestFiles + ${TestFiles} + "${SharedDir}/openjk.natvis" + ) +endif() +source_group( "tests" REGULAR_EXPRESSION ".*") +source_group( "tests\\safe" REGULAR_EXPRESSION "safe/.*" ) +source_group( "qcommon\\safe" REGULAR_EXPRESSION "${SharedDir}/qcommon/safe/.*" ) + +set( Boost_USE_STATIC_LIBS ON ) +find_package( Boost COMPONENTS unit_test_framework REQUIRED ) + +set(TestTarget "UnitTests") +set(TestLibraries "${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}") +set(TestIncludeDirectories + "${Boost_INCLUDE_DIRS}" + "${SharedDir}" + "${GSLIncludeDirectory}" + ) +set(TestDefines "${SharedDefines}") + + +add_executable(${TestTarget} ${TestFiles}) +set_target_properties(${TestTarget} PROPERTIES COMPILE_DEFINITIONS "${TestDefines}") +set_target_properties(${TestTarget} PROPERTIES INCLUDE_DIRECTORIES "${TestIncludeDirectories}") +set_target_properties(${TestTarget} PROPERTIES PROJECT_LABEL "Unit Tests") +target_link_libraries(${TestTarget} ${TestLibraries}) +install(TARGETS ${TestTarget} DESTINATION ".") diff --git a/tests/main.cpp b/tests/main.cpp new file mode 100644 index 0000000000..315593f0d7 --- /dev/null +++ b/tests/main.cpp @@ -0,0 +1,3 @@ +// create default module initialization +#define BOOST_TEST_MODULE OpenJK +#include diff --git a/tests/safe/string.cpp b/tests/safe/string.cpp new file mode 100644 index 0000000000..18f4cf36cf --- /dev/null +++ b/tests/safe/string.cpp @@ -0,0 +1,69 @@ +#include "qcommon/safe/string.h" + +#include + +// verifying that the compiler implements the standard correctly + +BOOST_AUTO_TEST_SUITE( safe ) + +BOOST_AUTO_TEST_SUITE( string ) + +BOOST_AUTO_TEST_CASE( literals ) +{ + auto test = CSTRING_VIEW( "test" ); + auto foo = CSTRING_VIEW( "foo" ); + + BOOST_CHECK_EQUAL( test, CSTRING_VIEW( "test" ) ); + BOOST_CHECK_EQUAL( test.size(), 4 ); + + BOOST_CHECK_EQUAL( foo, CSTRING_VIEW( "foo" ) ); + BOOST_CHECK_EQUAL( foo.size(), 3 ); + BOOST_CHECK_NE( test, foo ); +} + +BOOST_AUTO_TEST_CASE( stricmp ) +{ + BOOST_CHECK_EQUAL( Q::stricmp( CSTRING_VIEW( "hello" ), CSTRING_VIEW( "HELLO" ) ), Q::Ordering::EQ ); + BOOST_CHECK_EQUAL( Q::stricmp( CSTRING_VIEW( "aaa" ), CSTRING_VIEW( "aab" ) ), Q::Ordering::LT ); + BOOST_CHECK_EQUAL( Q::stricmp( CSTRING_VIEW( "aab" ), CSTRING_VIEW( "aaa" ) ), Q::Ordering::GT ); + BOOST_CHECK_EQUAL( Q::stricmp( CSTRING_VIEW( "AAA" ), CSTRING_VIEW( "aab" ) ), Q::Ordering::LT ); + BOOST_CHECK_EQUAL( Q::stricmp( CSTRING_VIEW( "AAA" ), CSTRING_VIEW( "aab" ) ), Q::Ordering::LT ); + // prefix is smaller + BOOST_CHECK_EQUAL( Q::stricmp( CSTRING_VIEW( "hello" ), CSTRING_VIEW( "hello world" ) ), Q::Ordering::LT ); + BOOST_CHECK_EQUAL( Q::stricmp( CSTRING_VIEW( "hello world" ), CSTRING_VIEW( "hello" ) ), Q::Ordering::GT ); + // edge case: empty strings + BOOST_CHECK_EQUAL( Q::stricmp( CSTRING_VIEW( "" ), CSTRING_VIEW( "" ) ), Q::Ordering::EQ ); + BOOST_CHECK_EQUAL( Q::stricmp( CSTRING_VIEW( "" ), CSTRING_VIEW( "a" ) ), Q::Ordering::LT ); + BOOST_CHECK_EQUAL( Q::stricmp( CSTRING_VIEW( "a" ), CSTRING_VIEW( "" ) ), Q::Ordering::GT ); +} + +BOOST_AUTO_TEST_CASE( svtoi ) +{ + BOOST_CHECK_EQUAL( Q::svtoi( CSTRING_VIEW( "" ) ), 0 ); + BOOST_CHECK_EQUAL( Q::svtoi( CSTRING_VIEW( "asdf" ) ), 0 ); + BOOST_CHECK_EQUAL( Q::svtoi( CSTRING_VIEW( "0" ) ), 0 ); + BOOST_CHECK_EQUAL( Q::svtoi( CSTRING_VIEW( "1" ) ), 1 ); + BOOST_CHECK_EQUAL( Q::svtoi( CSTRING_VIEW( "+1" ) ), 1 ); + BOOST_CHECK_EQUAL( Q::svtoi( CSTRING_VIEW( "-1" ) ), -1 ); + BOOST_CHECK_EQUAL( Q::svtoi( CSTRING_VIEW( "13foo" ) ), 13 ); + BOOST_CHECK_EQUAL( Q::svtoi( CSTRING_VIEW( " 13" ) ), 13 ); + BOOST_CHECK_EQUAL( Q::svtoi( CSTRING_VIEW( "13 27" ) ), 13 ); + BOOST_CHECK_EQUAL( Q::svtoi( CSTRING_VIEW( "12345" ) ), 12345 ); + BOOST_CHECK_EQUAL( Q::svtoi( CSTRING_VIEW( "-12345" ) ), -12345 ); +} + +BOOST_AUTO_TEST_CASE( sscanf ) +{ + { + float x = -1, y = -1, z = -1; + BOOST_CHECK_EQUAL( Q::sscanf( CSTRING_VIEW( " 42 13.37" ), x, y, z ), 2 ); + BOOST_CHECK_EQUAL( x, 42.f ); + BOOST_CHECK_CLOSE_FRACTION( y, 13.37f, 0.1f ); // within 0.1% of each other + BOOST_CHECK_EQUAL( z, -1 ); + } + // TODO String tests +} + +BOOST_AUTO_TEST_SUITE_END() // string + +BOOST_AUTO_TEST_SUITE_END() // safe From 387844841c5b02c69cc5cd2927d6f65c85c1de87 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Thu, 5 Nov 2015 23:48:19 +0100 Subject: [PATCH 066/445] Maybe fix build? --- shared/qcommon/safe/sscanf.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shared/qcommon/safe/sscanf.h b/shared/qcommon/safe/sscanf.h index b8f2d0b4c1..8c9f8a727a 100644 --- a/shared/qcommon/safe/sscanf.h +++ b/shared/qcommon/safe/sscanf.h @@ -7,6 +7,7 @@ #include #include #include +#include #include "gsl.h" @@ -131,7 +132,7 @@ namespace Q /// For deducing ArrayViewStreambuf's template type template< typename CharT > - inline ArrayViewStreambuf< CharT > MakeStreambuf( const gsl::array_view< const CharT >& view ) + inline ArrayViewStreambuf< typename std::remove_cv< CharT >::type > MakeStreambuf( const gsl::array_view< const CharT >& view ) { return{ view }; } From 93c729f010a7a41517a90c2a2a0e774fa1685287 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Thu, 5 Nov 2015 23:52:44 +0100 Subject: [PATCH 067/445] Evidently not. --- shared/qcommon/safe/sscanf.h | 2 +- shared/qcommon/safe/string.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/shared/qcommon/safe/sscanf.h b/shared/qcommon/safe/sscanf.h index 8c9f8a727a..e607437b25 100644 --- a/shared/qcommon/safe/sscanf.h +++ b/shared/qcommon/safe/sscanf.h @@ -106,7 +106,7 @@ namespace Q protected: /// @note required by istream.tellg() - virtual pos_type seekoff( off_type off, std::ios_base::seekdir dir, std::ios_base::openmode which ) + virtual typename std::basic_streambuf::pos_type seekoff( typename std::basic_streambuf::pos_type off, std::ios_base::seekdir dir, std::ios_base::openmode which ) { const pos_type errVal{ -1 }; if( which != std::ios_base::in ) diff --git a/shared/qcommon/safe/string.cpp b/shared/qcommon/safe/string.cpp index cb31d42734..1d2d712cb5 100644 --- a/shared/qcommon/safe/string.cpp +++ b/shared/qcommon/safe/string.cpp @@ -40,9 +40,9 @@ namespace Q int svtoi( const gsl::cstring_view& view ) { - auto end = view.end(); + gsl::cstring_view::iterator end = view.end(); // skip whitespace - auto it = std::find_if_not( view.begin(), end, std::isspace ); + gsl::cstring_view::iterator it = std::find_if_not( view.begin(), end, std::isspace ); if( it == end ) { return 0; From 6a60c0b4834d12153bfeab100e8f00e03be000c8 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Thu, 5 Nov 2015 23:59:46 +0100 Subject: [PATCH 068/445] Yet more small fixes, plz build. --- shared/qcommon/safe/sscanf.h | 19 ++++++++++--------- shared/qcommon/safe/string.cpp | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/shared/qcommon/safe/sscanf.h b/shared/qcommon/safe/sscanf.h index e607437b25..a28f97cb5d 100644 --- a/shared/qcommon/safe/sscanf.h +++ b/shared/qcommon/safe/sscanf.h @@ -96,6 +96,8 @@ namespace Q template< typename CharT > class ArrayViewStreambuf : public std::basic_streambuf< CharT > { + using Base = std::basic_streambuf< CharT >; + using pos_type = typename Base::pos_type; public: ArrayViewStreambuf( const gsl::array_view< const CharT >& view ) { @@ -106,7 +108,7 @@ namespace Q protected: /// @note required by istream.tellg() - virtual typename std::basic_streambuf::pos_type seekoff( typename std::basic_streambuf::pos_type off, std::ios_base::seekdir dir, std::ios_base::openmode which ) + virtual pos_type seekoff( pos_type off, std::ios_base::seekdir dir, std::ios_base::openmode which ) { const pos_type errVal{ -1 }; if( which != std::ios_base::in ) @@ -114,14 +116,14 @@ namespace Q // only input pointer can be moved return errVal; } - char* newPos = ( which == std::ios_base::beg ) ? eback() - : ( which == std::ios_base::cur ) ? gptr() - : egptr(); - newPos += off; - if( eback() <= newPos && newPos <= egptr() ) + char* newPos = ( dir == std::ios_base::beg ) ? Base::eback() + : ( dir == std::ios_base::cur ) ? Base::gptr() + : Base::egptr(); + newPos += static_cast< int >( off ); + if( Base::eback() <= newPos && newPos <= Base::egptr() ) { - setg( eback(), newPos, egptr() ); - return newPos - eback(); + setg( Base::eback(), newPos, Base::egptr() ); + return newPos - Base::eback(); } else { @@ -159,7 +161,6 @@ namespace Q assert( stream.eof() ); pos = input.size(); } - assert( pos != std::istream::pos_type{ -1 } ); gsl::cstring_view::const_iterator end = input.begin() + static_cast< int >( pos ); return sscanf_impl( { end, input.end() }, accumulator + 1, std::forward< Tail >( tail )... ); } diff --git a/shared/qcommon/safe/string.cpp b/shared/qcommon/safe/string.cpp index 1d2d712cb5..40e97a9457 100644 --- a/shared/qcommon/safe/string.cpp +++ b/shared/qcommon/safe/string.cpp @@ -42,7 +42,7 @@ namespace Q { gsl::cstring_view::iterator end = view.end(); // skip whitespace - gsl::cstring_view::iterator it = std::find_if_not( view.begin(), end, std::isspace ); + gsl::cstring_view::iterator it = std::find_if_not( view.begin(), end, std::isspace ); if( it == end ) { return 0; From 40023bf9d81c67d44efb4dea69a84ddf5d2c0e5b Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Fri, 6 Nov 2015 00:06:23 +0100 Subject: [PATCH 069/445] renamed _UI define to UI_BUILD Identifiers starting with _ and an uppercase letter are prohibited; in particular this clashes with the Mac STL --- codemp/game/bg_misc.c | 8 ++++---- codemp/game/bg_panimate.c | 2 +- codemp/game/bg_pmove.c | 2 +- codemp/game/bg_saberLoad.c | 8 ++++---- codemp/game/bg_saga.c | 6 +++--- codemp/game/bg_slidemove.c | 2 +- codemp/game/bg_vehicleLoad.c | 12 ++++++------ codemp/qcommon/q_shared.h | 2 +- codemp/ui/CMakeLists.txt | 2 +- codemp/ui/ui_shared.c | 18 +++++++++--------- 10 files changed, 31 insertions(+), 31 deletions(-) diff --git a/codemp/game/bg_misc.c b/codemp/game/bg_misc.c index 0ecc3a9ddc..3ad8529181 100644 --- a/codemp/game/bg_misc.c +++ b/codemp/game/bg_misc.c @@ -30,7 +30,7 @@ along with this program; if not, see . #include "g_local.h" #elif defined(_CGAME) #include "cgame/cg_local.h" -#elif defined(_UI) +#elif defined(UI_BUILD) #include "ui/ui_local.h" #endif @@ -331,7 +331,7 @@ qboolean BG_FileExists(const char *fileName) trap->FS_Open(fileName, &fh, FS_READ); #elif _CGAME trap->FS_Open(fileName, &fh, FS_READ); - #elif _UI + #elif UI_BUILD trap->FS_Open(fileName, &fh, FS_READ); #endif if (fh > 0) @@ -340,7 +340,7 @@ qboolean BG_FileExists(const char *fileName) trap->FS_Close(fh); #elif _CGAME trap->FS_Close(fh); - #elif _UI + #elif UI_BUILD trap->FS_Close(fh); #endif return qtrue; @@ -3092,7 +3092,7 @@ int BG_ModelCache(const char *modelName, const char *skinName) #define MAX_POOL_SIZE 3000000 //1024000 #elif defined(_CGAME) //don't need as much for cgame stuff. 2mb will be fine. #define MAX_POOL_SIZE 2048000 -#elif defined(_UI) //And for the ui the only thing we'll be using this for anyway is allocating anim data for g2 menu models +#elif defined(UI_BUILD) //And for the ui the only thing we'll be using this for anyway is allocating anim data for g2 menu models #define MAX_POOL_SIZE 512000 #endif diff --git a/codemp/game/bg_panimate.c b/codemp/game/bg_panimate.c index 014ade5d6b..48602c3c33 100644 --- a/codemp/game/bg_panimate.c +++ b/codemp/game/bg_panimate.c @@ -33,7 +33,7 @@ along with this program; if not, see . #include "g_local.h" #elif _CGAME #include "cgame/cg_local.h" -#elif _UI +#elif UI_BUILD #include "ui/ui_local.h" #endif diff --git a/codemp/game/bg_pmove.c b/codemp/game/bg_pmove.c index c4180d8e28..9b0b9ee2f9 100644 --- a/codemp/game/bg_pmove.c +++ b/codemp/game/bg_pmove.c @@ -33,7 +33,7 @@ along with this program; if not, see . #include "g_local.h" #elif _CGAME #include "cgame/cg_local.h" -#elif _UI +#elif UI_BUILD #include "ui/ui_local.h" #endif diff --git a/codemp/game/bg_saberLoad.c b/codemp/game/bg_saberLoad.c index 7cde29479d..75abd36c9a 100644 --- a/codemp/game/bg_saberLoad.c +++ b/codemp/game/bg_saberLoad.c @@ -32,7 +32,7 @@ along with this program; if not, see . #include "g_local.h" #elif _CGAME #include "cgame/cg_local.h" -#elif _UI +#elif UI_BUILD #include "ui/ui_local.h" #endif @@ -41,7 +41,7 @@ extern stringID_table_t animTable[MAX_ANIMATIONS+1]; int BG_SoundIndex( const char *sound ) { #ifdef _GAME return G_SoundIndex( sound ); -#elif defined(_CGAME) || defined(_UI) +#elif defined(_CGAME) || defined(UI_BUILD) return trap->S_RegisterSound( sound ); #endif } @@ -2287,7 +2287,7 @@ void WP_SaberLoadParms( void ) } if ( (totallen + len+1) >= MAX_SABER_DATA_SIZE ) { -#ifdef _UI +#ifdef UI_BUILD Com_Error( ERR_FATAL, "WP_SaberLoadParms: Saber extensions (*.sab) are too large!\nRan out of space before reading %s", holdChar ); #else Com_Error( ERR_DROP, "WP_SaberLoadParms: Saber extensions (*.sab) are too large!\nRan out of space before reading %s", holdChar ); @@ -2312,7 +2312,7 @@ void WP_SaberLoadParms( void ) } } -#ifdef _UI +#ifdef UI_BUILD qboolean WP_IsSaberTwoHanded( const char *saberName ) { int twoHanded; diff --git a/codemp/game/bg_saga.c b/codemp/game/bg_saga.c index 7fab3b14d5..deaded4478 100644 --- a/codemp/game/bg_saga.c +++ b/codemp/game/bg_saga.c @@ -38,7 +38,7 @@ along with this program; if not, see . #include "g_local.h" #elif _CGAME #include "cgame/cg_local.h" -#elif _UI +#elif UI_BUILD #include "ui/ui_local.h" #endif @@ -997,7 +997,7 @@ void BG_SiegeParseClassFile(const char *filename, siegeClassDesc_t *descBuffer) #elif defined(_CGAME) bgSiegeClasses[bgNumSiegeClasses].uiPortraitShader = 0; memset(bgSiegeClasses[bgNumSiegeClasses].uiPortrait,0,sizeof(bgSiegeClasses[bgNumSiegeClasses].uiPortrait)); - #elif defined(_UI) //ui + #elif defined(UI_BUILD) //ui bgSiegeClasses[bgNumSiegeClasses].uiPortraitShader = trap->R_RegisterShaderNoMip(parseBuf); memcpy(bgSiegeClasses[bgNumSiegeClasses].uiPortrait,parseBuf,sizeof(bgSiegeClasses[bgNumSiegeClasses].uiPortrait)); #endif @@ -1015,7 +1015,7 @@ void BG_SiegeParseClassFile(const char *filename, siegeClassDesc_t *descBuffer) #else //cgame, ui #if defined(_CGAME) bgSiegeClasses[bgNumSiegeClasses].classShader = trap->R_RegisterShaderNoMip(parseBuf); - #elif defined(_UI) + #elif defined(UI_BUILD) bgSiegeClasses[bgNumSiegeClasses].classShader = trap->R_RegisterShaderNoMip(parseBuf); #endif assert( bgSiegeClasses[bgNumSiegeClasses].classShader ); diff --git a/codemp/game/bg_slidemove.c b/codemp/game/bg_slidemove.c index 0016e0d738..1b8b884f4f 100644 --- a/codemp/game/bg_slidemove.c +++ b/codemp/game/bg_slidemove.c @@ -32,7 +32,7 @@ along with this program; if not, see . #include "g_local.h" #elif _CGAME #include "cgame/cg_local.h" -#elif _UI +#elif UI_BUILD #include "ui/ui_local.h" #endif diff --git a/codemp/game/bg_vehicleLoad.c b/codemp/game/bg_vehicleLoad.c index 9aad97145c..74a5e104f5 100644 --- a/codemp/game/bg_vehicleLoad.c +++ b/codemp/game/bg_vehicleLoad.c @@ -31,7 +31,7 @@ along with this program; if not, see . #include "g_local.h" #elif _CGAME #include "cgame/cg_local.h" -#elif _UI +#elif UI_BUILD #include "ui/ui_local.h" #endif @@ -227,14 +227,14 @@ static qboolean BG_ParseVehWeaponParm( vehWeaponInfo_t *vehWeapon, const char *p #endif break; case VF_SHADER: // (cgame only) take the string, call trap_R_RegisterShader -#ifdef _UI +#ifdef UI_BUILD *(int *)(b+vehWeaponField->ofs) = trap->R_RegisterShaderNoMip( value ); #elif CGAME *(int *)(b+vehWeaponField->ofs) = trap->R_RegisterShader( value ); #endif break; case VF_SHADER_NOMIP:// (cgame only) take the string, call trap_R_RegisterShaderNoMip -#if defined(_CGAME) || defined(_UI) +#if defined(_CGAME) || defined(UI_BUILD) *(int *)(b+vehWeaponField->ofs) = trap->R_RegisterShaderNoMip( value ); #endif break; @@ -874,14 +874,14 @@ static qboolean BG_ParseVehicleParm( vehicleInfo_t *vehicle, const char *parmNam #endif break; case VF_SHADER: // (cgame only) take the string, call trap_R_RegisterShader -#ifdef _UI +#ifdef UI_BUILD *(int *)(b+vehField->ofs) = trap->R_RegisterShaderNoMip( value ); #elif _CGAME *(int *)(b+vehField->ofs) = trap->R_RegisterShader( value ); #endif break; case VF_SHADER_NOMIP:// (cgame only) take the string, call trap_R_RegisterShaderNoMip -#if defined(_CGAME) || defined(_UI) +#if defined(_CGAME) || defined(UI_BUILD) *(int *)(b+vehField->ofs) = trap->R_RegisterShaderNoMip( value ); #endif break; @@ -1189,7 +1189,7 @@ int VEH_LoadVehicle( const char *vehicleName ) #endif } - #if defined(_CGAME) || defined(_UI) + #if defined(_CGAME) || defined(UI_BUILD) if ( VALIDSTRING( vehicle->skin ) ) trap->R_RegisterSkin( va( "models/players/%s/model_%s.skin", vehicle->model, vehicle->skin) ); #endif diff --git a/codemp/qcommon/q_shared.h b/codemp/qcommon/q_shared.h index 2bf37ac557..00cf7823e3 100644 --- a/codemp/qcommon/q_shared.h +++ b/codemp/qcommon/q_shared.h @@ -1157,7 +1157,7 @@ qboolean Info_Validate( const char *s ); qboolean Info_NextPair( const char **s, char *key, char *value ); // this is only here so the functions in q_shared.c and bg_*.c can link -#if defined( _GAME ) || defined( _CGAME ) || defined( _UI ) +#if defined( _GAME ) || defined( _CGAME ) || defined( UI_BUILD ) void (*Com_Error)( int level, const char *error, ... ); void (*Com_Printf)( const char *msg, ... ); #else diff --git a/codemp/ui/CMakeLists.txt b/codemp/ui/CMakeLists.txt index a4256d83ff..0fb50de5e1 100644 --- a/codemp/ui/CMakeLists.txt +++ b/codemp/ui/CMakeLists.txt @@ -29,7 +29,7 @@ set(MPUIIncludeDirectories if(WIN32) set(MPUILibraries "odbc32" "odbccp32") # what are these even? endif(WIN32) -set(MPUIDefines ${MPSharedDefines} "_UI") +set(MPUIDefines ${MPSharedDefines} "UI_BUILD") set(MPUIGameFiles "${MPDir}/game/bg_misc.c" diff --git a/codemp/ui/ui_shared.c b/codemp/ui/ui_shared.c index 8d8269ba2b..3c7679bcdb 100644 --- a/codemp/ui/ui_shared.c +++ b/codemp/ui/ui_shared.c @@ -27,7 +27,7 @@ along with this program; if not, see . #ifdef _CGAME #include "cgame/cg_local.h" -#elif _UI +#elif UI_BUILD #include "ui/ui_local.h" #endif @@ -75,7 +75,7 @@ typedef struct scrollInfo_s { qboolean scrollDir; } scrollInfo_t; -#ifdef _UI // Defined in ui_main.c, not in the namespace +#ifdef UI_BUILD // Defined in ui_main.c, not in the namespace // Some extern functions hoisted from the middle of this file to get all the non-cgame, // non-namespace stuff together extern void UI_SaberDrawBlades( itemDef_t *item, vec3_t origin, vec3_t angles ); @@ -3448,7 +3448,7 @@ void Leaving_EditField(itemDef_t *item) } } -#ifdef _UI +#ifdef UI_BUILD qboolean Item_TextField_HandleKey( itemDef_t *item, int key ); void Item_TextField_Paste( itemDef_t *item ) { int pasteLen, i; @@ -3485,7 +3485,7 @@ qboolean Item_TextField_HandleKey(itemDef_t *item, int key) { if ( key & K_CHAR_FLAG ) { key &= ~K_CHAR_FLAG; -#ifdef _UI +#ifdef UI_BUILD if ( key == 'v' - 'a' + 1 ) { // ctrl-v is paste Item_TextField_Paste( item ); return qtrue; @@ -5264,7 +5264,7 @@ void Item_Model_Paint(itemDef_t *item) } // a moves datapad anim is playing -#ifdef _UI +#ifdef UI_BUILD if (uiInfo.moveAnimTime && (uiInfo.moveAnimTime < uiInfo.uiDC.realTime)) { if (modelPtr) @@ -7084,7 +7084,7 @@ ItemParse_asset_model */ qboolean ItemParse_asset_model_go( itemDef_t *item, const char *name,int *runTimeLength ) { -#ifdef _UI +#ifdef UI_BUILD int g2Model; modelDef_t *modelPtr; Item_ValidateTypeData(item); @@ -7184,7 +7184,7 @@ qboolean ItemParse_asset_model( itemDef_t *item, int handle ) { return qfalse; } -#ifdef _UI +#ifdef UI_BUILD if (!Q_stricmp(token.string,"ui_char_model") ) { char modelPath[MAX_QPATH] = {0}; @@ -8066,7 +8066,7 @@ qboolean ItemParse_cvarFloat( itemDef_t *item, int handle ) { return qfalse; } -#ifdef _UI +#ifdef UI_BUILD char currLanguage[32][128]; static const char languageString[32] = "@MENUS_MYLANGUAGE"; #endif @@ -8104,7 +8104,7 @@ qboolean ItemParse_cvarStrList( itemDef_t *item, int handle ) { // languages if (!Q_stricmp(token.string,"feeder") && item->special == FEEDER_LANGUAGES) { -#ifdef _UI +#ifdef UI_BUILD for (; multiPtr->count < uiInfo.languageCount; multiPtr->count++) { // The displayed text From 7e3fd494f279443479e9cf6673a89d1b341a5fb0 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 7 Nov 2015 12:36:44 +0100 Subject: [PATCH 070/445] Fixes broken Q::sscanf() for floats. Due to an incorrect type ArrayViewStreambuf did not override seekoff, it merely defined an overload. --- shared/qcommon/safe/sscanf.h | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/shared/qcommon/safe/sscanf.h b/shared/qcommon/safe/sscanf.h index a28f97cb5d..1a2ab12180 100644 --- a/shared/qcommon/safe/sscanf.h +++ b/shared/qcommon/safe/sscanf.h @@ -96,8 +96,6 @@ namespace Q template< typename CharT > class ArrayViewStreambuf : public std::basic_streambuf< CharT > { - using Base = std::basic_streambuf< CharT >; - using pos_type = typename Base::pos_type; public: ArrayViewStreambuf( const gsl::array_view< const CharT >& view ) { @@ -108,7 +106,11 @@ namespace Q protected: /// @note required by istream.tellg() - virtual pos_type seekoff( pos_type off, std::ios_base::seekdir dir, std::ios_base::openmode which ) + virtual typename std::basic_streambuf< CharT >::pos_type seekoff( + typename std::basic_streambuf< CharT >::off_type off, + std::ios_base::seekdir dir, + std::ios_base::openmode which + ) override { const pos_type errVal{ -1 }; if( which != std::ios_base::in ) @@ -116,14 +118,14 @@ namespace Q // only input pointer can be moved return errVal; } - char* newPos = ( dir == std::ios_base::beg ) ? Base::eback() - : ( dir == std::ios_base::cur ) ? Base::gptr() - : Base::egptr(); + char* newPos = ( dir == std::ios_base::beg ) ? this->eback() + : ( dir == std::ios_base::cur ) ? this->gptr() + : this->egptr(); newPos += static_cast< int >( off ); - if( Base::eback() <= newPos && newPos <= Base::egptr() ) + if( this->eback() <= newPos && newPos <= this->egptr() ) { - setg( Base::eback(), newPos, Base::egptr() ); - return newPos - Base::eback(); + setg( this->eback(), newPos, this->egptr() ); + return newPos - this->eback(); } else { From 2c4e7a7095f409c009f0967f8d366a49a0f1a6b3 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 7 Nov 2015 12:39:33 +0100 Subject: [PATCH 071/445] Fixes broken Q::scanff() build on non-MSC Again with the base-class typedefs. --- shared/qcommon/safe/sscanf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/qcommon/safe/sscanf.h b/shared/qcommon/safe/sscanf.h index 1a2ab12180..d13f163332 100644 --- a/shared/qcommon/safe/sscanf.h +++ b/shared/qcommon/safe/sscanf.h @@ -112,7 +112,7 @@ namespace Q std::ios_base::openmode which ) override { - const pos_type errVal{ -1 }; + const typename std::basic_streambuf< CharT >::pos_type errVal{ -1 }; if( which != std::ios_base::in ) { // only input pointer can be moved From cb5ef48c652478d3a5777bcf7f6fe452a114e2c5 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 7 Nov 2015 13:11:25 +0100 Subject: [PATCH 072/445] Safe strings: more noexcept, rename --- shared/qcommon/safe/string.cpp | 2 +- shared/qcommon/safe/string.h | 4 ++-- tests/safe/string.cpp | 2 -- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/shared/qcommon/safe/string.cpp b/shared/qcommon/safe/string.cpp index 40e97a9457..6d8702f996 100644 --- a/shared/qcommon/safe/string.cpp +++ b/shared/qcommon/safe/string.cpp @@ -5,7 +5,7 @@ namespace Q { - Ordering stricmp( const gsl::cstring_view& lhs, const gsl::cstring_view& rhs ) + Ordering stricmp( const gsl::cstring_view& lhs, const gsl::cstring_view& rhs ) NOEXCEPT { auto lIt = lhs.begin(); auto rIt = rhs.begin(); diff --git a/shared/qcommon/safe/string.h b/shared/qcommon/safe/string.h index 10333939b3..43bf5b4604 100644 --- a/shared/qcommon/safe/string.h +++ b/shared/qcommon/safe/string.h @@ -15,9 +15,9 @@ namespace Q EQ = 0, GT = 1 }; - Ordering stricmp( const gsl::cstring_view& lhs, const gsl::cstring_view& rhs ); + Ordering stricmp( const gsl::cstring_view& lhs, const gsl::cstring_view& rhs ) NOEXCEPT; /// Case-insensitive less comparator for cstring_view - struct CCStringViewILess + struct CStringViewILess { bool operator()( const gsl::cstring_view& lhs, const gsl::cstring_view& rhs ) const NOEXCEPT { diff --git a/tests/safe/string.cpp b/tests/safe/string.cpp index 18f4cf36cf..b5f4eb6118 100644 --- a/tests/safe/string.cpp +++ b/tests/safe/string.cpp @@ -2,8 +2,6 @@ #include -// verifying that the compiler implements the standard correctly - BOOST_AUTO_TEST_SUITE( safe ) BOOST_AUTO_TEST_SUITE( string ) From 3788a54a9ee9af75d5f74273c107dada3717e053 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 7 Nov 2015 13:13:27 +0100 Subject: [PATCH 073/445] CMake: variable for shared files' names --- CMakeLists.txt | 35 ++++++++++++++++++++++++++++++++ code/game/CMakeLists.txt | 8 +++----- code/rd-vanilla/CMakeLists.txt | 8 +++----- codeJK2/game/CMakeLists.txt | 9 +++----- codemp/CMakeLists.txt | 3 ++- codemp/cgame/CMakeLists.txt | 8 +++----- codemp/game/CMakeLists.txt | 8 +++----- codemp/rd-vanilla/CMakeLists.txt | 9 ++++---- codemp/ui/CMakeLists.txt | 8 +++----- 9 files changed, 59 insertions(+), 37 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a5f346052..e785a4190a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,12 +21,16 @@ cmake_minimum_required(VERSION 2.8.9) # For checks in subdirectories set(InOpenJK TRUE) + + # Project name set(ProjectName "OpenJK" CACHE STRING "Project Name") project(${ProjectName}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + + # Customizable options option(BuildPortableVersion "Build portable version (does not read or write files from your user/home directory" OFF) @@ -81,12 +85,16 @@ if(APPLE) option(MakeApplicationBundles "Whether to build .app application bundles for engines built" ON) endif() + + # Custom CMake Modules needed list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}/CMakeModules") Include(CheckTypeSize) check_type_size("void*" CMAKE_SIZEOF_VOID_P) + + # ${Architecture} must match ARCH_STRING in q_platform.h, # and is used in DLL names (jagamex86.dll, jagamex86.dylib, jagamei386.so). if(WIN32) @@ -124,11 +132,15 @@ endif() message("Architecture is ${Architecture}") + + # Current Git SHA1 hash include(GetGitRevisionDescription) get_git_head_revision(GIT_REFSPEC GIT_SHA1) message("Git revision is ${GIT_SHA1}") + + # Binary names set(SPEngine "openjk_sp.${Architecture}") set(SPGame "jagame${Architecture}") @@ -147,6 +159,8 @@ set(AssetsPk3 "openjk-${Architecture}.pk3") set(MPBotLib "botlib") set(SharedLib "shared") + + # Paths set(SPDir "${CMAKE_SOURCE_DIR}/code") set(MPDir "${CMAKE_SOURCE_DIR}/codemp") @@ -157,6 +171,8 @@ set(GSLIncludeDirectory "${OpenJKLibDir}/gsl-lite/include") include(InstallConfig) + + # Operating settings if(WIN64) set(SharedDefines ${SharedDefines} "WIN64") @@ -170,6 +186,8 @@ if (NOT WIN32 AND NOT APPLE) set(SharedDefines "ARCH_STRING=\"${Architecture}\"") endif() + + # Compiler settings if(MSVC) @@ -275,11 +293,28 @@ else() set(SharedDefines ${SharedDefines} "FINAL_BUILD") endif() + + # Settings if(BuildPortableVersion) set(SharedDefines ${SharedDefines} "_PORTABLE_VERSION") endif() + + + +# Files shared across all projects +set(SharedCommonFiles + "${SharedDir}/qcommon/q_platform.h" + ) +set(SharedCommonSafeFiles + "${SharedDir}/qcommon/safe/gsl.h" + "${SharedDir}/qcommon/safe/string.cpp" + "${SharedDir}/qcommon/safe/string.h" + "${SharedDir}/qcommon/safe/sscanf.h" + ) + + if(UseInternalJPEG) add_subdirectory(lib/jpeg-9a) else() diff --git a/code/game/CMakeLists.txt b/code/game/CMakeLists.txt index 3bdc2b9b89..4a7193a1d8 100644 --- a/code/game/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -260,16 +260,14 @@ set(SPGameCommonFiles "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" - "${SharedDir}/qcommon/q_platform.h" + + ${SharedCommonFiles} ) source_group("common" FILES ${SPGameCommonFiles}) set(SPGameFiles ${SPGameFiles} ${SPGameCommonFiles}) set(SPGameCommonSafeFiles - "${SharedDir}/qcommon/safe/gsl.h" - "${SharedDir}/qcommon/safe/string.cpp" - "${SharedDir}/qcommon/safe/string.h" - "${SharedDir}/qcommon/safe/sscanf.h" + ${SharedCommonSafeFiles} "${SharedDir}/qcommon/safe/files.h" "${SharedDir}/qcommon/safe/files.cpp" "${SPDir}/qcommon/safe/memory.h" diff --git a/code/rd-vanilla/CMakeLists.txt b/code/rd-vanilla/CMakeLists.txt index 0862ba58b2..72ee342398 100644 --- a/code/rd-vanilla/CMakeLists.txt +++ b/code/rd-vanilla/CMakeLists.txt @@ -78,17 +78,15 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla) "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" - "${SharedDir}/qcommon/q_platform.h" + + ${SharedCommonFiles} ) source_group("common" FILES ${SPRDVanillaCommonFiles}) set(SPRDVanillaFiles ${SPRDVanillaFiles} ${SPRDVanillaCommonFiles}) # Misc files set(SPRDVanillaCommonSafeFiles - "${SharedDir}/qcommon/safe/gsl.h" - "${SharedDir}/qcommon/safe/string.cpp" - "${SharedDir}/qcommon/safe/string.h" - "${SharedDir}/qcommon/safe/sscanf.h" + ${SharedCommonSafeFiles} ) source_group("common/safe" FILES ${SPRDVanillaCommonSafeFiles}) set(SPRDVanillaFiles ${SPRDVanillaFiles} ${SPRDVanillaCommonSafeFiles}) diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index befe1d6689..5179568b36 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -231,18 +231,15 @@ set(JK2SPGameCommonFiles "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" - "${SharedDir}/qcommon/q_platform.h" "${SPDir}/qcommon/strippublic.h" + + ${SharedCommonFiles} ) source_group("common" FILES ${JK2SPGameCommonFiles}) set(JK2SPGameFiles ${JK2SPGameFiles} ${JK2SPGameCommonFiles}) set(JK2SPGameCommonSafeFiles - #We only have JKA qcommon files now. - "${SharedDir}/qcommon/safe/gsl.h" - "${SharedDir}/qcommon/safe/string.cpp" - "${SharedDir}/qcommon/safe/string.h" - "${SharedDir}/qcommon/safe/sscanf.h" + ${SharedCommonSafeFiles} ) source_group("common/safe" FILES ${JK2SPGameCommonSafeFiles}) set(JK2SPGameFiles ${JK2SPGameFiles} ${JK2SPGameCommonSafeFiles}) diff --git a/codemp/CMakeLists.txt b/codemp/CMakeLists.txt index a5580b1bba..8231ec757f 100644 --- a/codemp/CMakeLists.txt +++ b/codemp/CMakeLists.txt @@ -132,10 +132,11 @@ if(BuildMPEngine OR BuildMPDed) "${MPDir}/qcommon/cm_public.h" "${MPDir}/qcommon/disablewarnings.h" "${MPDir}/qcommon/q_shared.h" - "${SharedDir}/qcommon/q_platform.h" "${MPDir}/qcommon/qcommon.h" "${MPDir}/qcommon/qfiles.h" "${MPDir}/qcommon/tags.h" + + ${SharedCommonFiles} ) source_group("common" FILES ${MPBotlibCommonFiles}) set(MPBotlibFiles ${MPBotlibFiles} ${MPBotlibCommonFiles}) diff --git a/codemp/cgame/CMakeLists.txt b/codemp/cgame/CMakeLists.txt index 3b238c45d4..432381126b 100644 --- a/codemp/cgame/CMakeLists.txt +++ b/codemp/cgame/CMakeLists.txt @@ -105,18 +105,16 @@ set(MPCGameCommonFiles "${MPDir}/qcommon/q_shared.c" "${MPDir}/qcommon/disablewarnings.h" "${MPDir}/qcommon/q_shared.h" - "${SharedDir}/qcommon/q_platform.h" "${MPDir}/qcommon/qfiles.h" "${MPDir}/qcommon/tags.h" + + ${SharedCommonFiles} ) source_group("common" FILES ${MPCGameCommonFiles}) set(MPCGameFiles ${MPCGameFiles} ${MPCGameCommonFiles}) set(MPCGameCommonSafeFiles - "${SharedDir}/qcommon/safe/gsl.h" - "${SharedDir}/qcommon/safe/string.cpp" - "${SharedDir}/qcommon/safe/string.h" - "${SharedDir}/qcommon/safe/sscanf.h" + ${SharedCommonSafeFiles} ) source_group("common/safe" FILES ${MPCGameCommonSafeFiles}) set(MPCGameFiles ${MPCGameFiles} ${MPCGameCommonSafeFiles}) diff --git a/codemp/game/CMakeLists.txt b/codemp/game/CMakeLists.txt index e2a4ca24fc..b79f06c798 100644 --- a/codemp/game/CMakeLists.txt +++ b/codemp/game/CMakeLists.txt @@ -149,17 +149,15 @@ set(MPGameCommonFiles "${MPDir}/qcommon/q_shared.c" "${MPDir}/qcommon/disablewarnings.h" "${MPDir}/qcommon/q_shared.h" - "${SharedDir}/qcommon/q_platform.h" "${MPDir}/qcommon/tags.h" + + ${SharedCommonFiles} ) source_group("common" FILES ${MPGameCommonFiles}) set(MPGameFiles ${MPGameFiles} ${MPGameCommonFiles}) set(MPGameCommonSafeFiles - "${SharedDir}/qcommon/safe/gsl.h" - "${SharedDir}/qcommon/safe/string.cpp" - "${SharedDir}/qcommon/safe/string.h" - "${SharedDir}/qcommon/safe/sscanf.h" + ${SharedCommonSafeFiles} ) source_group("common/safe" FILES ${MPGameCommonSafeFiles}) set(MPGameFiles ${MPGameFiles} ${MPGameCommonSafeFiles}) diff --git a/codemp/rd-vanilla/CMakeLists.txt b/codemp/rd-vanilla/CMakeLists.txt index 3ae132a4ee..66ab988ef2 100644 --- a/codemp/rd-vanilla/CMakeLists.txt +++ b/codemp/rd-vanilla/CMakeLists.txt @@ -99,15 +99,14 @@ set(MPVanillaRendererFiles ${MPVanillaRendererFiles} ${MPVanillaRendererRdCommon set(MPVanillaRendererCommonFiles "${MPDir}/qcommon/matcomp.cpp" "${MPDir}/qcommon/q_math.cpp" - "${MPDir}/qcommon/q_shared.cpp") + "${MPDir}/qcommon/q_shared.cpp" + + ${SharedCommonFiles}) source_group("common" FILES ${MPVanillaRendererCommonFiles}) set(MPVanillaRendererFiles ${MPVanillaRendererFiles} ${MPVanillaRendererCommonFiles}) set(MPVanillaRendererCommonSafeFiles - "${SharedDir}/qcommon/safe/gsl.h" - "${SharedDir}/qcommon/safe/string.cpp" - "${SharedDir}/qcommon/safe/string.h" - "${SharedDir}/qcommon/safe/sscanf.h" + ${SharedCommonSafeFiles} ) source_group("common/safe" FILES ${MPVanillaRendererCommonSafeFiles}) set(MPVanillaRendererFiles ${MPVanillaRendererFiles} ${MPVanillaRendererCommonSafeFiles}) diff --git a/codemp/ui/CMakeLists.txt b/codemp/ui/CMakeLists.txt index 0fb50de5e1..f6db993439 100644 --- a/codemp/ui/CMakeLists.txt +++ b/codemp/ui/CMakeLists.txt @@ -53,18 +53,16 @@ set(MPUICommonFiles "${MPDir}/qcommon/disablewarnings.h" "${MPDir}/qcommon/game_version.h" "${MPDir}/qcommon/q_shared.h" - "${SharedDir}/qcommon/q_platform.h" "${MPDir}/qcommon/qfiles.h" "${MPDir}/qcommon/tags.h" + + ${SharedCommonFiles} ) source_group("common" FILES ${MPUICommonFiles}) set(MPUIFiles ${MPUIFiles} ${MPUICommonFiles}) set(MPUICommonSafeFiles - "${SharedDir}/qcommon/safe/gsl.h" - "${SharedDir}/qcommon/safe/string.cpp" - "${SharedDir}/qcommon/safe/string.h" - "${SharedDir}/qcommon/safe/sscanf.h" + ${SharedCommonSafeFiles} ) source_group("common/safe" FILES ${MPUICommonSafeFiles}) set(MPUIFiles ${MPUIFiles} ${MPUICommonSafeFiles}) From 270021753b3b7b64260fb62168176858f2b43ac6 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 7 Nov 2015 13:13:48 +0100 Subject: [PATCH 074/445] TODO note about future refactor/cleanup --- code/game/g_savegame.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/g_savegame.cpp b/code/game/g_savegame.cpp index 9a0e603257..cbb44498a9 100644 --- a/code/game/g_savegame.cpp +++ b/code/game/g_savegame.cpp @@ -155,6 +155,7 @@ static const save_field_t savefields_gClient[] = {NULL, 0, F_IGNORE} }; +// TODO FIXME mrwonko: this has no business being a global variable. WTF Raven? std::list *strList = NULL; From bc6f790590cc09df57a989751218a85935b94c2f Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 7 Nov 2015 13:17:17 +0100 Subject: [PATCH 075/445] Q::LimitedVector class. Meant to (gradually) replace the static arrays in a reusable way. --- CMakeLists.txt | 1 + shared/qcommon/safe/limited_vector.h | 207 +++++++++++++++++++++++++++ tests/CMakeLists.txt | 1 + tests/safe/limited_vector.cpp | 148 +++++++++++++++++++ 4 files changed, 357 insertions(+) create mode 100644 shared/qcommon/safe/limited_vector.h create mode 100644 tests/safe/limited_vector.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index e785a4190a..975edb0bec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -312,6 +312,7 @@ set(SharedCommonSafeFiles "${SharedDir}/qcommon/safe/string.cpp" "${SharedDir}/qcommon/safe/string.h" "${SharedDir}/qcommon/safe/sscanf.h" + "${SharedDir}/qcommon/safe/limited_vector.h" ) diff --git a/shared/qcommon/safe/limited_vector.h b/shared/qcommon/safe/limited_vector.h new file mode 100644 index 0000000000..56e9a79dfe --- /dev/null +++ b/shared/qcommon/safe/limited_vector.h @@ -0,0 +1,207 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include "qcommon/q_platform.h" + +namespace Q +{ + /** + Like an std::vector with a fixed upper limit + */ + template< typename T, std::size_t maximum > + class LimitedVector + { + private: + using Memory = std::array< char, sizeof( T ) * maximum >; + public: + using value_type = T; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + using pointer = T*; + using const_pointer = const T*; + using reference = T&; + using const_reference = const T&; + using iterator = T*; + using const_iterator = const T*; + public: + LimitedVector() NOEXCEPT = default; + ~LimitedVector() NOEXCEPT + { + clear(); + } + LimitedVector( const LimitedVector& rhs ) NOEXCEPT_IF( IS_NOEXCEPT( + T{ static_cast< const T& >( std::declval< T >() ) } + ) ) + { + *this = rhs; + } + LimitedVector& operator=( const LimitedVector& rhs ) NOEXCEPT_IF( IS_NOEXCEPT( + T{ static_cast< const T& >( std::declval< T >() ) } + ) ) + { + clear(); + std::copy( rhs.begin(), rhs.end(), std::back_inserter( *this ) ); + return *this; + } + LimitedVector( LimitedVector&& rhs ) NOEXCEPT_IF( IS_NOEXCEPT( + T{ std::move( std::declval< T >() ) } + ) ) + { + *this = std::move( rhs ); + } + LimitedVector& operator=( LimitedVector&& rhs ) NOEXCEPT_IF( IS_NOEXCEPT( + T{ std::move( std::declval< T >() ) } + ) ) + { + clear(); + std::move( rhs.begin(), rhs.end(), std::back_inserter( *this ) ); + rhs.clear(); + return *this; + } + + void swap( LimitedVector& rhs ) + { + LimitedVector temp = std::move( rhs ); + rhs = std::move( *this ); + *this = std::move( temp ); + } + + size_type size() const NOEXCEPT + { + return _size; + } + + bool empty() const NOEXCEPT + { + return size() == 0; + } + + size_type max_size() const NOEXCEPT + { + return maximum; + } + + bool push_back( const T& value ) NOEXCEPT_IF( IS_NOEXCEPT( + emplace_back( static_cast< const T& >( std::declval< T >() ) ) + ) ) + { + return emplace_back( value ); + } + + bool push_back( T&& value ) NOEXCEPT_IF( IS_NOEXCEPT( + emplace_back( std::move( std::declval< T >() ) ) + ) ) + { + return emplace_back( std::move( value ) ); + } + + template< typename... Args > + bool emplace_back( Args&&... args ) NOEXCEPT_IF( IS_NOEXCEPT( + T{ std::forward< Args >( std::declval< Args >() )... } + ) ) + { + if( size() == max_size() ) + { + return false; + } + T* memory = &data()[ size() ]; + // construct in-place (placement new) + new( memory ) T( std::forward< Args >( args )... ); + ++_size; + return true; + } + + void pop_back() NOEXCEPT + { + if( size() == 0 ) + { + return; + } + ( &( *this )[ size() - 1 ] )->~T(); + --_size; + } + + void clear() NOEXCEPT + { + while( !empty() ) + { + pop_back(); + } + } + + const_pointer data() const NOEXCEPT + { + return reinterpret_cast< const T* >( _memory.data() ); + } + + pointer data() NOEXCEPT + { + return reinterpret_cast< T* >( _memory.data() ); + } + + const T& operator[]( size_type index ) const NOEXCEPT + { + assert( index < _size ); + return data()[ index ]; + } + + T& operator[]( size_type index ) NOEXCEPT + { + assert( index < _size ); + return data()[ index ]; + } + + iterator begin() NOEXCEPT + { + return{ data() }; + } + + const_iterator begin() const NOEXCEPT + { + return{ data() }; + } + + const_iterator cbegin() const NOEXCEPT + { + return begin(); + } + + iterator end() NOEXCEPT + { + return{ data() + size() }; + } + + const_iterator end() const NOEXCEPT + { + return{ data() + size() }; + } + + const_iterator cend() const NOEXCEPT + { + return end(); + } + + bool operator==( const LimitedVector& rhs ) const NOEXCEPT_IF( IS_NOEXCEPT( + std::declval< T >() == std::declval< T >() + ) ) + { + return size() == rhs.size() && std::equal( begin(), end(), rhs.begin() ); + } + + bool operator!=( const LimitedVector& rhs ) const NOEXCEPT_IF( IS_NOEXCEPT( + std::declval< T >() == std::declval< T >() + ) ) + { + return !( *this == rhs ); + } + + private: + Memory _memory; + size_type _size = 0; + }; +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index a72ca69876..fcf2be990e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -24,6 +24,7 @@ endif(NOT InOpenJK) set(TestFiles "main.cpp" "safe/string.cpp" + "safe/limited_vector.cpp" "${SharedDir}/qcommon/safe/string.cpp" ) if(MSVC) diff --git a/tests/safe/limited_vector.cpp b/tests/safe/limited_vector.cpp new file mode 100644 index 0000000000..6e8dbb2628 --- /dev/null +++ b/tests/safe/limited_vector.cpp @@ -0,0 +1,148 @@ +#include "qcommon/safe/limited_vector.h" + +#include +#include +#include + +#include + +using namespace std::string_literals; + +using IntVector = Q::LimitedVector< int, 10 >; +using StringVector = Q::LimitedVector< std::string, 10 >; +using IntPtrVector = Q::LimitedVector< std::unique_ptr< int >, 10 >; +using SharedPtrVector = Q::LimitedVector< std::shared_ptr< int >, 10 >; + +BOOST_AUTO_TEST_SUITE( safe ) + +BOOST_AUTO_TEST_SUITE( limited_vector ) + +BOOST_AUTO_TEST_CASE( default_construct ) +{ + IntVector intVec; + BOOST_CHECK_EQUAL( intVec.size(), 0 ); + BOOST_CHECK( intVec.begin() == intVec.end() ); + BOOST_CHECK( intVec.empty() ); +} + +BOOST_AUTO_TEST_CASE( fill_and_copy ) +{ + StringVector stringVec; + BOOST_CHECK_EQUAL( stringVec.size(), 0 ); + BOOST_CHECK( stringVec.begin() == stringVec.end() ); + BOOST_CHECK( stringVec.empty() ); + + BOOST_CHECK( stringVec.push_back( "hello world" ) ); + BOOST_CHECK( stringVec.emplace_back( "emplaced" ) ); + + BOOST_CHECK_EQUAL( stringVec.size(), 2 ); + BOOST_CHECK( !stringVec.empty() ); + BOOST_CHECK_EQUAL( std::distance( stringVec.begin(), stringVec.end() ), 2 ); + + auto it = stringVec.begin(); + auto cit = stringVec.cbegin(); + + BOOST_CHECK( it != stringVec.end() ); + BOOST_CHECK( cit != stringVec.end() ); + BOOST_CHECK_EQUAL( *it, "hello world"s ); + BOOST_CHECK_EQUAL( *cit, "hello world"s ); + BOOST_CHECK_EQUAL( stringVec[ 0 ], "hello world"s ); + + ++it; + ++cit; + + BOOST_CHECK( it != stringVec.end() ); + BOOST_CHECK( cit != stringVec.end() ); + BOOST_CHECK_EQUAL( *it, "emplaced"s ); + BOOST_CHECK_EQUAL( *cit, "emplaced"s ); + BOOST_CHECK_EQUAL( stringVec[ 1 ], "emplaced"s ); + + ++it; + ++cit; + + BOOST_CHECK( it == stringVec.end() ); + BOOST_CHECK( cit == stringVec.end() ); + + StringVector stringVecCopy = stringVec; + + BOOST_CHECK( stringVec == stringVecCopy ); + BOOST_CHECK( !( stringVec != stringVecCopy ) ); + BOOST_CHECK_EQUAL( stringVec.size(), 2 ); + BOOST_CHECK_EQUAL( stringVec.size(), stringVecCopy.size() ); + BOOST_CHECK_EQUAL( stringVec[ 0 ], stringVecCopy[ 0 ] ); + BOOST_CHECK_EQUAL( stringVec[ 1 ], stringVecCopy[ 1 ] ); + + stringVec.clear(); + + BOOST_CHECK( stringVec.empty() ); + BOOST_CHECK_EQUAL( stringVec.size(), 0 ); + BOOST_CHECK( stringVec != stringVecCopy ); + BOOST_CHECK( !( stringVec == stringVecCopy ) ); + + stringVec = stringVecCopy; + + BOOST_CHECK( stringVec == stringVecCopy ); + BOOST_CHECK( !( stringVec != stringVecCopy ) ); + BOOST_CHECK_EQUAL( stringVec.size(), 2 ); + BOOST_CHECK_EQUAL( stringVec.size(), stringVecCopy.size() ); + BOOST_CHECK_EQUAL( stringVec[ 0 ], stringVecCopy[ 0 ] ); + BOOST_CHECK_EQUAL( stringVec[ 1 ], stringVecCopy[ 1 ] ); +} + +BOOST_AUTO_TEST_CASE( fill_and_move ) +{ + IntPtrVector vec1, vec2; + BOOST_CHECK( vec1.push_back( std::make_unique< int >( 42 ) ) ); + BOOST_CHECK( vec1.push_back( std::make_unique< int >( 1337 ) ) ); + BOOST_CHECK( vec2.push_back( std::make_unique< int >( 0 ) ) ); + BOOST_CHECK( vec2.emplace_back() ); // nullptr3 + + BOOST_CHECK_EQUAL( vec1.size(), 2 ); + BOOST_CHECK_EQUAL( vec2.size(), 2 ); + BOOST_CHECK_EQUAL( *vec1[ 0 ], 42 ); + BOOST_CHECK_EQUAL( *vec1[ 1 ], 1337 ); + BOOST_CHECK_EQUAL( *vec2[ 0 ], 0 ); + BOOST_CHECK( !vec2[ 1 ] ); + + vec1.swap( vec2 ); + + BOOST_CHECK_EQUAL( vec1.size(), 2 ); + BOOST_CHECK_EQUAL( vec2.size(), 2 ); + BOOST_CHECK_EQUAL( *vec2[ 0 ], 42 ); + BOOST_CHECK_EQUAL( *vec2[ 1 ], 1337 ); + BOOST_CHECK_EQUAL( *vec1[ 0 ], 0 ); + BOOST_CHECK( !vec1[ 1 ] ); + + vec1 = std::move( vec2 ); + + BOOST_CHECK_EQUAL( vec1.size(), 2 ); + BOOST_CHECK_EQUAL( vec2.size(), 0 ); + BOOST_CHECK_EQUAL( *vec1[ 0 ], 42 ); + BOOST_CHECK_EQUAL( *vec1[ 1 ], 1337 ); +} + +BOOST_AUTO_TEST_CASE( member_destruction ) +{ + // check for proper destruction of members + std::shared_ptr< int > counter = std::make_shared< int >( 42 ); + { + BOOST_CHECK_EQUAL( counter.use_count(), 1 ); + SharedPtrVector vec; + BOOST_CHECK( vec.push_back( counter ) ); + BOOST_CHECK( vec.push_back( counter ) ); + BOOST_CHECK( vec.push_back( counter ) ); + BOOST_CHECK_EQUAL( counter.use_count(), 4 ); + vec.pop_back(); + BOOST_CHECK_EQUAL( counter.use_count(), 3 ); + SharedPtrVector vec2 = vec; + BOOST_CHECK_EQUAL( counter.use_count(), 5 ); + vec = std::move( vec2 ); + BOOST_CHECK_EQUAL( counter.use_count(), 3 ); + } + BOOST_CHECK_EQUAL( counter.use_count(), 1 ); +} + +BOOST_AUTO_TEST_SUITE_END() // limited_vector + +BOOST_AUTO_TEST_SUITE_END() // safe + From 3b26abb7c9551118710af4892da6320ba078a660 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 7 Nov 2015 22:48:11 +0100 Subject: [PATCH 076/445] SP CMake file: use Shared File variables --- code/CMakeLists.txt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index e5adbfcee9..9005aa53ff 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -162,7 +162,6 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SPDir}/qcommon/q_math.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" - "${SharedDir}/qcommon/q_platform.h" "${SPDir}/qcommon/sstring.h" "${SPDir}/qcommon/stringed_ingame.cpp" @@ -179,6 +178,8 @@ if(BuildSPEngine OR BuildJK2SPEngine) "${SPDir}/qcommon/stv_version.h" "${SPDir}/qcommon/timing.h" "${SPDir}/qcommon/MiniHeap.h" + + ${SharedCommonFiles} ) source_group("common" FILES ${SPEngineCommonFiles}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineCommonFiles}) @@ -186,10 +187,7 @@ if(BuildSPEngine OR BuildJK2SPEngine) set(SPEngineCommonSafeFiles "${SharedDir}/qcommon/safe/files.cpp" "${SharedDir}/qcommon/safe/files.h" - "${SharedDir}/qcommon/safe/gsl.h" - "${SharedDir}/qcommon/safe/string.cpp" - "${SharedDir}/qcommon/safe/string.h" - "${SharedDir}/qcommon/safe/sscanf.h" + ${SharedCommonSafeFiles} "${SPDir}/qcommon/safe/memory.h" ) source_group("common/safe" FILES ${SPEngineCommonSafeFiles}) From 7a2962a1c1570acf03b580aea70bd5a3095ab6ab Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Thu, 29 Oct 2015 20:52:43 +0100 Subject: [PATCH 077/445] removed unused writeable GP2 setting --- code/game/genericparser2.cpp | 16 +++++----------- code/game/genericparser2.h | 12 ++++-------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/code/game/genericparser2.cpp b/code/game/genericparser2.cpp index 4ed4b39ea8..1f92ddc49f 100644 --- a/code/game/genericparser2.cpp +++ b/code/game/genericparser2.cpp @@ -482,8 +482,7 @@ CGPGroup::CGPGroup(const char *initName, CGPGroup *initParent) : mSubGroups(0), mInOrderSubGroups(0), mCurrentSubGroup(0), - mParent(initParent), - mWriteable(false) + mParent(initParent) { } @@ -543,7 +542,6 @@ void CGPGroup::Clean(void) mPairs = mInOrderPairs = mCurrentPair = 0; mSubGroups = mInOrderSubGroups = mCurrentSubGroup = 0; mParent = 0; - mWriteable = false; } CGPGroup *CGPGroup::Duplicate(CTextPool **textPool, CGPGroup *initParent) @@ -727,7 +725,6 @@ bool CGPGroup::Parse(char **dataPtr, CTextPool **textPool) if (Q_stricmp(token, "{") == 0) { // new sub group newSubGroup = AddGroup(lastToken, textPool); - newSubGroup->SetWriteable(mWriteable); if (!newSubGroup->Parse(dataPtr, textPool)) { return false; @@ -840,8 +837,7 @@ const char *CGPGroup::FindPairValue(const char *key, const char *defaultVal) CGenericParser2::CGenericParser2(void) : - mTextPool(0), - mWriteable(false) + mTextPool(0) { } @@ -850,7 +846,7 @@ CGenericParser2::~CGenericParser2(void) Clean(); } -bool CGenericParser2::Parse(char **dataPtr, bool cleanFirst, bool writeable) +bool CGenericParser2::Parse(char **dataPtr, bool cleanFirst) { CTextPool *topPool; @@ -864,8 +860,6 @@ bool CGenericParser2::Parse(char **dataPtr, bool cleanFirst, bool writeable) mTextPool = new CTextPool; } - SetWriteable(writeable); - mTopLevel.SetWriteable(writeable); topPool = mTextPool; bool ret = mTopLevel.Parse(dataPtr, &topPool); return ret; @@ -896,12 +890,12 @@ bool CGenericParser2::Write(CTextPool *textPool) // C++ users should just use the objects as normally and not call these routines below // // CGenericParser2 (void *) routines -TGenericParser2 GP_Parse(char **dataPtr, bool cleanFirst, bool writeable) +TGenericParser2 GP_Parse(char **dataPtr, bool cleanFirst) { CGenericParser2 *parse; parse = new CGenericParser2; - if (parse->Parse(dataPtr, cleanFirst, writeable)) + if (parse->Parse(dataPtr, cleanFirst)) { return parse; } diff --git a/code/game/genericparser2.h b/code/game/genericparser2.h index a8b70ede04..df7573a004 100644 --- a/code/game/genericparser2.h +++ b/code/game/genericparser2.h @@ -124,7 +124,6 @@ class CGPGroup : public CGPObject CGPGroup *mSubGroups, *mInOrderSubGroups; CGPGroup *mCurrentSubGroup; CGPGroup *mParent; - bool mWriteable; void SortObject(CGPObject *object, CGPObject **unsortedList, CGPObject **sortedList, CGPObject **lastObject); @@ -141,7 +140,6 @@ class CGPGroup : public CGPObject void Clean(void); CGPGroup *Duplicate(CTextPool **textPool = 0, CGPGroup *initParent = 0); - void SetWriteable(const bool writeable) { mWriteable = writeable; } CGPValue *GetPairs(void) { return mPairs; } CGPValue *GetInOrderPairs(void) { return mInOrderPairs; } CGPGroup *GetSubGroups(void) { return mSubGroups; } @@ -164,19 +162,17 @@ class CGenericParser2 private: CGPGroup mTopLevel; CTextPool *mTextPool; - bool mWriteable; public: CGenericParser2(void); ~CGenericParser2(void); - void SetWriteable(const bool writeable) { mWriteable = writeable; } CGPGroup *GetBaseParseGroup(void) { return &mTopLevel; } - bool Parse(char **dataPtr, bool cleanFirst = true, bool writeable = false); - bool Parse(char *dataPtr, bool cleanFirst = true, bool writeable = false) + bool Parse(char **dataPtr, bool cleanFirst = true); + bool Parse(char *dataPtr, bool cleanFirst = true) { - return Parse(&dataPtr, cleanFirst, writeable); + return Parse(&dataPtr, cleanFirst); } void Clean(void); @@ -194,7 +190,7 @@ typedef void *TGPGroup; typedef void *TGPValue; // CGenericParser2 (void *) routines -TGenericParser2 GP_Parse(char **dataPtr, bool cleanFirst, bool writeable); +TGenericParser2 GP_Parse(char **dataPtr, bool cleanFirst); void GP_Clean(TGenericParser2 GP2); void GP_Delete(TGenericParser2 *GP2); TGPGroup GP_GetBaseParseGroup(TGenericParser2 GP2); From bdb0d101667c3b2efe3ea91c27a5b393c38d36dd Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Thu, 29 Oct 2015 20:57:05 +0100 Subject: [PATCH 078/445] Added const to GP2 Parse()'s text, since it is not modified --- code/cgame/FxScheduler.cpp | 2 +- code/client/snd_music.cpp | 2 +- code/game/genericparser2.cpp | 12 ++++++------ code/game/genericparser2.h | 8 ++++---- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/code/cgame/FxScheduler.cpp b/code/cgame/FxScheduler.cpp index adc071b086..866a59b1f8 100644 --- a/code/cgame/FxScheduler.cpp +++ b/code/cgame/FxScheduler.cpp @@ -443,7 +443,7 @@ int CFxScheduler::RegisterEffect( const char *file, bool bHasCorrectPath /*= fal char *data; char temp[MAX_QPATH]; const char *pfile; - char *bufParse = 0; + const char *bufParse = 0; if (bHasCorrectPath) { diff --git a/code/client/snd_music.cpp b/code/client/snd_music.cpp index 5e982ad1d8..b2d21511ea 100644 --- a/code/client/snd_music.cpp +++ b/code/client/snd_music.cpp @@ -442,7 +442,7 @@ static qboolean Music_ParseLeveldata(const char *psLevelName) { char *psStrippedText = StripTrailingWhiteSpaceOnEveryLine(pText); CGenericParser2 Parser; - char *psDataPtr = psStrippedText; // because ptr gets advanced, so we supply a clone that GP can alter + const char *psDataPtr = psStrippedText; // because ptr gets advanced, so we supply a clone that GP can alter if (Parser.Parse(&psDataPtr, true)) { CGPGroup *pFileGroup = Parser.GetBaseParseGroup(); diff --git a/code/game/genericparser2.cpp b/code/game/genericparser2.cpp index 1f92ddc49f..d8a305d741 100644 --- a/code/game/genericparser2.cpp +++ b/code/game/genericparser2.cpp @@ -31,9 +31,9 @@ along with this program; if not, see . #define MAX_TOKEN_SIZE 1024 static char token[MAX_TOKEN_SIZE]; -static char *GetToken(char **text, bool allowLineBreaks, bool readUntilEOL = false) +static char *GetToken(const char **text, bool allowLineBreaks, bool readUntilEOL = false) { - char *pointer = *text; + const char *pointer = *text; int length = 0; int c = 0; bool foundLineBreak; @@ -378,7 +378,7 @@ void CGPValue::AddValue(const char *newValue, CTextPool **textPool) } } -bool CGPValue::Parse(char **dataPtr, CTextPool **textPool) +bool CGPValue::Parse(const char **dataPtr, CTextPool **textPool) { char *token; char *value; @@ -691,7 +691,7 @@ CGPGroup *CGPGroup::FindSubGroup(const char *name) return(NULL); } -bool CGPGroup::Parse(char **dataPtr, CTextPool **textPool) +bool CGPGroup::Parse(const char **dataPtr, CTextPool **textPool) { char *token; char lastToken[MAX_TOKEN_SIZE]; @@ -846,7 +846,7 @@ CGenericParser2::~CGenericParser2(void) Clean(); } -bool CGenericParser2::Parse(char **dataPtr, bool cleanFirst) +bool CGenericParser2::Parse(const char **dataPtr, bool cleanFirst) { CTextPool *topPool; @@ -890,7 +890,7 @@ bool CGenericParser2::Write(CTextPool *textPool) // C++ users should just use the objects as normally and not call these routines below // // CGenericParser2 (void *) routines -TGenericParser2 GP_Parse(char **dataPtr, bool cleanFirst) +TGenericParser2 GP_Parse(const char **dataPtr, bool cleanFirst) { CGenericParser2 *parse; diff --git a/code/game/genericparser2.h b/code/game/genericparser2.h index df7573a004..d2e208e653 100644 --- a/code/game/genericparser2.h +++ b/code/game/genericparser2.h @@ -150,7 +150,7 @@ class CGPGroup : public CGPObject CGPGroup *AddGroup(const char *name, CTextPool **textPool = 0); void AddGroup(CGPGroup *NewGroup); CGPGroup *FindSubGroup(const char *name); - bool Parse(char **dataPtr, CTextPool **textPool); + bool Parse(const char **dataPtr, CTextPool **textPool); bool Write(CTextPool **textPool, int depth); CGPValue *FindPair(const char *key); @@ -169,8 +169,8 @@ class CGenericParser2 CGPGroup *GetBaseParseGroup(void) { return &mTopLevel; } - bool Parse(char **dataPtr, bool cleanFirst = true); - bool Parse(char *dataPtr, bool cleanFirst = true) + bool Parse(const char **dataPtr, bool cleanFirst = true); + bool Parse(const char *dataPtr, bool cleanFirst = true) { return Parse(&dataPtr, cleanFirst); } @@ -190,7 +190,7 @@ typedef void *TGPGroup; typedef void *TGPValue; // CGenericParser2 (void *) routines -TGenericParser2 GP_Parse(char **dataPtr, bool cleanFirst); +TGenericParser2 GP_Parse(const char **dataPtr, bool cleanFirst); void GP_Clean(TGenericParser2 GP2); void GP_Delete(TGenericParser2 *GP2); TGPGroup GP_GetBaseParseGroup(TGenericParser2 GP2); From e7149191f67d65b2a1590250b337e27a32fb79c4 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Thu, 29 Oct 2015 20:58:29 +0100 Subject: [PATCH 079/445] Clarity of CGPGroup::Parse() --- code/game/genericparser2.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/code/game/genericparser2.cpp b/code/game/genericparser2.cpp index d8a305d741..7ed46357da 100644 --- a/code/game/genericparser2.cpp +++ b/code/game/genericparser2.cpp @@ -703,19 +703,22 @@ bool CGPGroup::Parse(const char **dataPtr, CTextPool **textPool) token = GetToken(dataPtr, true); if (!token[0]) - { // end of data - error! + { if (mParent) { + // end of data - error! return false; } else { - break; + // top level parse; there was no opening "{", so there should be no closing one either. + return true; } } else if (Q_stricmp(token, "}") == 0) - { // ending brace for this group - break; + { + // ending brace for this group + return true; } strcpy(lastToken, token); @@ -743,8 +746,6 @@ bool CGPGroup::Parse(const char **dataPtr, CTextPool **textPool) AddPair(lastToken, token, textPool); } } - - return true; } bool CGPGroup::Write(CTextPool **textPool, int depth) From ee009e302e58b468d9bac6bcf2e9d24956958ac9 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Thu, 29 Oct 2015 21:01:11 +0100 Subject: [PATCH 080/445] Fixed GP2 accepting an extra trailing "}" --- code/game/genericparser2.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/code/game/genericparser2.cpp b/code/game/genericparser2.cpp index 7ed46357da..907f551f7a 100644 --- a/code/game/genericparser2.cpp +++ b/code/game/genericparser2.cpp @@ -717,8 +717,16 @@ bool CGPGroup::Parse(const char **dataPtr, CTextPool **textPool) } else if (Q_stricmp(token, "}") == 0) { - // ending brace for this group - return true; + if( mParent ) + { + // ending brace for this group + return true; + } + else + { + // top-level group; there was no opening "{" so there should be no closing one, either. + return false; + } } strcpy(lastToken, token); From b11d6dde1fe37c644c4d2bf9a4cffc1b6cb55373 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Thu, 29 Oct 2015 21:02:27 +0100 Subject: [PATCH 081/445] Complete GenericParser2 overhaul; partial FX Parser modernization. No more TextPool, instead works with String Views into the file contents. Still some runtime problems to fix though, need to review changes. --- code/cgame/FxScheduler.cpp | 156 ++-- code/cgame/FxScheduler.h | 136 ++-- code/cgame/FxSystem.cpp | 14 +- code/cgame/FxSystem.h | 8 +- code/cgame/FxTemplate.cpp | 1349 ++++++++++---------------------- code/client/snd_music.cpp | 622 ++++++--------- code/game/genericparser2.cpp | 1129 ++++---------------------- code/game/genericparser2.h | 272 +++---- code/qcommon/q_shared.h | 3 - shared/qcommon/safe/sscanf.h | 7 + shared/qcommon/safe/string.cpp | 45 +- shared/qcommon/safe/string.h | 3 +- 12 files changed, 1102 insertions(+), 2642 deletions(-) diff --git a/code/cgame/FxScheduler.cpp b/code/cgame/FxScheduler.cpp index 866a59b1f8..3f3d77f3e2 100644 --- a/code/cgame/FxScheduler.cpp +++ b/code/cgame/FxScheduler.cpp @@ -39,6 +39,7 @@ along with this program; if not, see . #include "../qcommon/q_shared.h" #endif +#include "qcommon/safe/string.h" #include @@ -395,7 +396,7 @@ void CFxScheduler::Clean(bool bRemoveTemplates /*= true*/, int idToPreserve /*= // Return: // int handle to the effect //------------------------------------------------------ -int CFxScheduler::RegisterEffect( const char *file, bool bHasCorrectPath /*= false*/ ) +int CFxScheduler::RegisterEffect( const char *path, bool bHasCorrectPath /*= false*/ ) { // Dealing with file names: // File names can come from two places - the editor, in which case we should use the given @@ -403,93 +404,69 @@ int CFxScheduler::RegisterEffect( const char *file, bool bHasCorrectPath /*= fal // In either case we create a stripped file name to use for naming effects. // - char sfile[MAX_QPATH]; + // FIXME: this could maybe be a cstring_view, if mEffectIDs were to use a transparent comparator, but those were only added in C++14, which we don't support yet (sigh) + char filenameNoExt[MAX_QPATH]; // Get an extension stripped version of the file if (bHasCorrectPath) { - const char *last = file, *p = file; - + // FIXME: this is basically COM_SkipPath, except it also accepts '\\' instead of '/' + const char *last = path, *p = path; while (*p != '\0') { if ((*p == '/') || (*p == '\\')) { last = p + 1; } - p++; } - COM_StripExtension( last, sfile, sizeof(sfile) ); + COM_StripExtension( last, filenameNoExt, sizeof( filenameNoExt ) ); } else { - COM_StripExtension( file, sfile, sizeof(sfile) ); + COM_StripExtension( path, filenameNoExt, sizeof( filenameNoExt ) ); } // see if the specified file is already registered. If it is, just return the id of that file TEffectID::iterator itr; - itr = mEffectIDs.find( sfile ); + itr = mEffectIDs.find( filenameNoExt ); if ( itr != mEffectIDs.end() ) { return (*itr).second; } - CGenericParser2 parser; - int len = 0; - fileHandle_t fh; - char *data; - char temp[MAX_QPATH]; + char correctFilenameBuffer[MAX_QPATH]; const char *pfile; - const char *bufParse = 0; - if (bHasCorrectPath) { - pfile = file; + pfile = path; } else { // Add on our extension and prepend the file with the default path - Com_sprintf( temp, sizeof(temp), "%s/%s.efx", FX_FILE_PATH, sfile ); - pfile = temp; - } - - len = theFxHelper.OpenFile( pfile, &fh, FS_READ ); - - if ( len < 0 ) - { - theFxHelper.Print( "RegisterEffect: failed to load: %s\n", pfile ); - return 0; + Com_sprintf( correctFilenameBuffer, sizeof( correctFilenameBuffer ), "%s/%s.efx", FX_FILE_PATH, filenameNoExt ); + pfile = correctFilenameBuffer; } - if (len == 0) + // Let the generic parser process the whole file + CGenericParser2 parser; + if( !parser.Parse( pfile ) ) { - theFxHelper.Print( "RegisterEffect: INVALID file: %s\n", pfile ); - theFxHelper.CloseFile( fh ); - return 0; + if( !parser.ValidFile() ) + { + theFxHelper.Print( "RegisterEffect: INVALID file: %s\n", pfile ); + } + return false; + if( parser.ValidFile() ) + { + return false; + } } - - // Allocate enough space to hold the file - // This should be flagged temp, but it seems ok as is. - data = new char[len+1]; - - // Get the goods and ensure Null termination - theFxHelper.ReadFile( data, len, fh ); - data[len] = '\0'; - bufParse = data; - - // Let the generic parser process the whole file - parser.Parse( &bufParse ); - - theFxHelper.CloseFile( fh ); - - // Delete our temp copy of the file - delete [] data; - // Lets convert the effect file into something that we can work with - return ParseEffect( sfile, parser.GetBaseParseGroup() ); + return ParseEffect( filenameNoExt, parser.GetBaseParseGroup() ); } @@ -507,34 +484,10 @@ int CFxScheduler::RegisterEffect( const char *file, bool bHasCorrectPath /*= fal // int handle of the effect //------------------------------------------------------ -struct primitiveType_s { const char *name; EPrimType type; } primitiveTypes[] = { - { "particle", Particle }, - { "line", Line }, - { "tail", Tail }, - { "sound", Sound }, - { "cylinder", Cylinder }, - { "electricity", Electricity }, - { "emitter", Emitter }, - { "decal", Decal }, - { "orientedparticle", OrientedParticle }, - { "fxrunner", FxRunner }, - { "light", Light }, - { "cameraShake", CameraShake }, - { "flash", ScreenFlash }, -}; -static const size_t numPrimitiveTypes = ARRAY_LEN( primitiveTypes ); - -int CFxScheduler::ParseEffect( const char *file, CGPGroup *base ) +int CFxScheduler::ParseEffect( const char *file, const CGPGroup& base ) { - CGPGroup *primitiveGroup; - CPrimitiveTemplate *prim; - const char *grpName; - SEffectTemplate *effect = 0; - EPrimType type; - int handle; - CGPValue *pair; - - effect = GetNewEffectTemplate( &handle, file ); + int handle; + SEffectTemplate* effect = GetNewEffectTemplate( &handle, file ); if ( !handle || !effect ) { @@ -542,45 +495,42 @@ int CFxScheduler::ParseEffect( const char *file, CGPGroup *base ) return 0; } - if ((pair = base->GetPairs())!=0) + for( auto& property : base.GetProperties() ) { - grpName = pair->GetName(); - if ( !Q_stricmp( grpName, "repeatDelay" )) + if( Q::stricmp( property.GetName(), CSTRING_VIEW( "repeatDelay" ) ) == Q::Ordering::EQ ) { - effect->mRepeatDelay = atoi(pair->GetTopValue()); - } - else - {//unknown - + effect->mRepeatDelay = Q::svtoi( property.GetTopValue() ); } } - primitiveGroup = base->GetSubGroups(); - - while ( primitiveGroup ) + for( const auto& primitiveGroup : base.GetSubGroups() ) { - grpName = primitiveGroup->GetName(); - - type = None; - for ( size_t i=0; i primitiveTypes{ + { CSTRING_VIEW( "particle" ), Particle }, + { CSTRING_VIEW( "line" ), Line }, + { CSTRING_VIEW( "tail" ), Tail }, + { CSTRING_VIEW( "sound" ), Sound }, + { CSTRING_VIEW( "cylinder" ), Cylinder }, + { CSTRING_VIEW( "electricity" ), Electricity }, + { CSTRING_VIEW( "emitter" ), Emitter }, + { CSTRING_VIEW( "decal" ), Decal }, + { CSTRING_VIEW( "orientedparticle" ), OrientedParticle }, + { CSTRING_VIEW( "fxrunner" ), FxRunner }, + { CSTRING_VIEW( "light" ), Light }, + { CSTRING_VIEW( "cameraShake" ), CameraShake }, + { CSTRING_VIEW( "flash" ), ScreenFlash } + }; + auto pos = primitiveTypes.find( primitiveGroup.GetName() ); + if( pos != primitiveTypes.end() ) { - prim = new CPrimitiveTemplate; + CPrimitiveTemplate *prim = new CPrimitiveTemplate; - prim->mType = type; + prim->mType = pos->second; prim->ParsePrimitive( primitiveGroup ); // Add our primitive template to the effect list AddPrimitiveToEffect( effect, prim ); } - - primitiveGroup = (CGPGroup *)primitiveGroup->GetNext(); } return handle; @@ -654,7 +604,7 @@ SEffectTemplate *CFxScheduler::GetNewEffectTemplate( int *id, const char *file ) theFxHelper.Print( "FxScheduler: Error--reached max effects\n" ); *id = 0; - return 0; + return nullptr; } //------------------------------------------------------ diff --git a/code/cgame/FxScheduler.h b/code/cgame/FxScheduler.h index 3ecb386938..5c3ff91d96 100644 --- a/code/cgame/FxScheduler.h +++ b/code/cgame/FxScheduler.h @@ -28,6 +28,9 @@ along with this program; if not, see . #include "../qcommon/sstring.h" typedef sstring_t fxString_t; +#include "../game/genericparser2.h" +#include "qcommon/safe/string.h" + #ifndef FX_SCHEDULER_H_INC #define FX_SCHEDULER_H_INC @@ -270,88 +273,95 @@ class CPrimitiveTemplate CFxRange mElasticity; +private: // Lower level parsing utilities - bool ParseVector( const char *val, vec3_t min, vec3_t max ); - bool ParseFloat( const char *val, float *min, float *max ); - bool ParseGroupFlags( const char *val, int *flags ); + bool ParseVector( const gsl::cstring_view& val, vec3_t min, vec3_t max ); + bool ParseFloat( const gsl::cstring_view& val, float& min, float& max ); + bool ParseGroupFlags( const gsl::cstring_view& val, int& flags ); // Base key processing // Note that these all have their own parse functions in case it becomes important to do certain kinds // of validation specific to that type. - bool ParseMin( const char *val ); - bool ParseMax( const char *val ); - bool ParseDelay( const char *val ); - bool ParseCount( const char *val ); - bool ParseLife( const char *val ); - bool ParseElasticity( const char *val ); - bool ParseFlags( const char *val ); - bool ParseSpawnFlags( const char *val ); - - bool ParseOrigin1( const char *val ); - bool ParseOrigin2( const char *val ); - bool ParseRadius( const char *val ); - bool ParseHeight( const char *val ); - bool ParseWindModifier( const char *val ); - bool ParseRotation( const char *val ); - bool ParseRotationDelta( const char *val ); - bool ParseAngle( const char *val ); - bool ParseAngleDelta( const char *val ); - bool ParseVelocity( const char *val ); - bool ParseAcceleration( const char *val ); - bool ParseGravity( const char *val ); - bool ParseDensity( const char *val ); - bool ParseVariance( const char *val ); - + bool ParseMin( const gsl::cstring_view& val ); + bool ParseMax( const gsl::cstring_view& val ); + bool ParseDelay( const gsl::cstring_view& val ); + bool ParseCount( const gsl::cstring_view& val ); + bool ParseLife( const gsl::cstring_view& val ); + bool ParseElasticity( const gsl::cstring_view& val ); + bool ParseFlags( const gsl::cstring_view& val ); + bool ParseSpawnFlags( const gsl::cstring_view& val ); + + bool ParseOrigin1( const gsl::cstring_view& val ); + bool ParseOrigin2( const gsl::cstring_view& val ); + bool ParseRadius( const gsl::cstring_view& val ); + bool ParseHeight( const gsl::cstring_view& val ); + bool ParseWindModifier( const gsl::cstring_view& val ); + bool ParseRotation( const gsl::cstring_view& val ); + bool ParseRotationDelta( const gsl::cstring_view& val ); + bool ParseAngle( const gsl::cstring_view& val ); + bool ParseAngleDelta( const gsl::cstring_view& val ); + bool ParseVelocity( const gsl::cstring_view& val ); + bool ParseAcceleration( const gsl::cstring_view& val ); + bool ParseGravity( const gsl::cstring_view& val ); + bool ParseDensity( const gsl::cstring_view& val ); + bool ParseVariance( const gsl::cstring_view& val ); + + /// Case insensitive map from cstring_view to Value + template< typename Value > + using StringViewIMap = std::map< gsl::cstring_view, Value, Q::CStringViewILess >; + using ParseMethod = bool ( CPrimitiveTemplate::* )( const gsl::cstring_view& ); // Group type processing - bool ParseRGB( CGPGroup *grp ); - bool ParseAlpha( CGPGroup *grp ); - bool ParseSize( CGPGroup *grp ); - bool ParseSize2( CGPGroup *grp ); - bool ParseLength( CGPGroup *grp ); - - bool ParseModels( CGPValue *grp ); - bool ParseShaders( CGPValue *grp ); - bool ParseSounds( CGPValue *grp ); - - bool ParseImpactFxStrings( CGPValue *grp ); - bool ParseDeathFxStrings( CGPValue *grp ); - bool ParseEmitterFxStrings( CGPValue *grp ); - bool ParsePlayFxStrings( CGPValue *grp ); + bool ParseGroup( const CGPGroup& grp, const StringViewIMap< ParseMethod >& parseMethods, gsl::czstring name ); + bool ParseRGB( const CGPGroup& grp ); + bool ParseAlpha( const CGPGroup& grp ); + bool ParseSize( const CGPGroup& grp ); + bool ParseSize2( const CGPGroup& grp ); + bool ParseLength( const CGPGroup& grp ); + + bool ParseModels( const CGPProperty& grp ); + bool ParseShaders( const CGPProperty& grp ); + bool ParseSounds( const CGPProperty& grp ); + + bool ParseImpactFxStrings( const CGPProperty& grp ); + bool ParseDeathFxStrings( const CGPProperty& grp ); + bool ParseEmitterFxStrings( const CGPProperty& grp ); + bool ParsePlayFxStrings( const CGPProperty& grp ); // Group keys - bool ParseRGBStart( const char *val ); - bool ParseRGBEnd( const char *val ); - bool ParseRGBParm( const char *val ); - bool ParseRGBFlags( const char *val ); + bool ParseRGBStart( const gsl::cstring_view& val ); + bool ParseRGBEnd( const gsl::cstring_view& val ); + bool ParseRGBParm( const gsl::cstring_view& val ); + bool ParseRGBFlags( const gsl::cstring_view& val ); - bool ParseAlphaStart( const char *val ); - bool ParseAlphaEnd( const char *val ); - bool ParseAlphaParm( const char *val ); - bool ParseAlphaFlags( const char *val ); + bool ParseAlphaStart( const gsl::cstring_view& val ); + bool ParseAlphaEnd( const gsl::cstring_view& val ); + bool ParseAlphaParm( const gsl::cstring_view& val ); + bool ParseAlphaFlags( const gsl::cstring_view& val ); - bool ParseSizeStart( const char *val ); - bool ParseSizeEnd( const char *val ); - bool ParseSizeParm( const char *val ); - bool ParseSizeFlags( const char *val ); + bool ParseSizeStart( const gsl::cstring_view& val ); + bool ParseSizeEnd( const gsl::cstring_view& val ); + bool ParseSizeParm( const gsl::cstring_view& val ); + bool ParseSizeFlags( const gsl::cstring_view& val ); - bool ParseSize2Start( const char *val ); - bool ParseSize2End( const char *val ); - bool ParseSize2Parm( const char *val ); - bool ParseSize2Flags( const char *val ); + bool ParseSize2Start( const gsl::cstring_view& val ); + bool ParseSize2End( const gsl::cstring_view& val ); + bool ParseSize2Parm( const gsl::cstring_view& val ); + bool ParseSize2Flags( const gsl::cstring_view& val ); - bool ParseLengthStart( const char *val ); - bool ParseLengthEnd( const char *val ); - bool ParseLengthParm( const char *val ); - bool ParseLengthFlags( const char *val ); + bool ParseLengthStart( const gsl::cstring_view& val ); + bool ParseLengthEnd( const gsl::cstring_view& val ); + bool ParseLengthParm( const gsl::cstring_view& val ); + bool ParseLengthFlags( const gsl::cstring_view& val ); public: CPrimitiveTemplate(); + CPrimitiveTemplate( const CPrimitiveTemplate& rhs ); ~CPrimitiveTemplate() {}; - bool ParsePrimitive( CGPGroup *grp ); + bool ParsePrimitive( const CGPGroup& grp ); void operator=(const CPrimitiveTemplate &that); }; @@ -452,7 +462,7 @@ class CFxScheduler SEffectTemplate *GetNewEffectTemplate( int *id, const char *file ); void AddPrimitiveToEffect( SEffectTemplate *fx, CPrimitiveTemplate *prim ); - int ParseEffect( const char *file, CGPGroup *base ); + int ParseEffect( const char *file, const CGPGroup& base ); void CreateEffect( CPrimitiveTemplate *fx, const vec3_t origin, vec3_t axis[3], int lateTime, int clientID = -1, int modelNum = -1, int boltNum = -1 ); void CreateEffect( CPrimitiveTemplate *fx, int clientID, int lateTime ); diff --git a/code/cgame/FxSystem.cpp b/code/cgame/FxSystem.cpp index 8a8bf4e90f..6e47129b4a 100644 --- a/code/cgame/FxSystem.cpp +++ b/code/cgame/FxSystem.cpp @@ -136,21 +136,23 @@ void SFxHelper::AddFxToScene( refEntity_t *ent ) } //------------------------------------------------------ -int SFxHelper::RegisterShader( const char *shader ) +int SFxHelper::RegisterShader( const gsl::cstring_view& shader ) { - return cgi_R_RegisterShader( shader ); + // TODO: it would be nice to change the ABI here to allow for passing of string views + return cgi_R_RegisterShader( std::string( shader.begin(), shader.end() ).c_str() ); } //------------------------------------------------------ -int SFxHelper::RegisterSound( const char *sound ) +int SFxHelper::RegisterSound( const gsl::cstring_view& sound ) { - return cgi_S_RegisterSound( sound ); + // TODO: it would be nice to change the ABI here to allow for passing of string views + return cgi_S_RegisterSound( std::string( sound.begin(), sound.end() ).c_str() ); } //------------------------------------------------------ -int SFxHelper::RegisterModel( const char *model ) +int SFxHelper::RegisterModel( const gsl::cstring_view& model ) { - return cgi_R_RegisterModel( model ); + return cgi_R_RegisterModel( std::string( model.begin(), model.end() ).c_str() ); } //------------------------------------------------------ diff --git a/code/cgame/FxSystem.h b/code/cgame/FxSystem.h index c7cd1c5399..0b65d7205d 100644 --- a/code/cgame/FxSystem.h +++ b/code/cgame/FxSystem.h @@ -27,6 +27,8 @@ along with this program; if not, see . #ifndef FX_SYSTEM_H_INC #define FX_SYSTEM_H_INC +#include "qcommon/safe/gsl.h" + #define irand Q_irand #define flrand Q_flrand @@ -76,7 +78,7 @@ struct SFxHelper // Sound void PlaySound( const vec3_t origin, int entityNum, int entchannel, sfxHandle_t sfx ); void PlayLocalSound( sfxHandle_t sfx, int channelNum ); - int RegisterSound( const char *sound ); + int RegisterSound( const gsl::cstring_view& sound ); //G2 int GetOriginAxisFromBolt(const centity_t ¢, int modelNum, int boltNum, vec3_t /*out*/origin, vec3_t /*out*/*axis); @@ -88,8 +90,8 @@ struct SFxHelper void AddFxToScene( refEntity_t *ent ); void AddLightToScene( vec3_t org, float radius, float red, float green, float blue ); - int RegisterShader( const char *shader ); - int RegisterModel( const char *model ); + int RegisterShader( const gsl::cstring_view& shader ); + int RegisterModel( const gsl::cstring_view& model ); void AddPolyToScene( int shader, int count, polyVert_t *verts ); diff --git a/code/cgame/FxTemplate.cpp b/code/cgame/FxTemplate.cpp index 8103da1251..10fe138d73 100644 --- a/code/cgame/FxTemplate.cpp +++ b/code/cgame/FxTemplate.cpp @@ -26,6 +26,11 @@ along with this program; if not, see . #include "FxScheduler.h" #endif +#include "../game/genericparser2.h" +#include "qcommon/safe/string.h" + +#include + //------------------------------------------------------ // CPrimitiveTemplate // Set up our minimal default values @@ -188,16 +193,10 @@ void CPrimitiveTemplate::operator=(const CPrimitiveTemplate &that) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseFloat( const char *val, float *min, float *max ) +bool CPrimitiveTemplate::ParseFloat( const gsl::cstring_view& val, float& min, float& max ) { - // We don't allow passing in a null for either of the fields - if ( min == 0 || max == 0 ) - { // failue - return false; - } - // attempt to read out the values - int v = sscanf( val, "%f %f", min, max ); + int v = Q::sscanf( val, min, max ); if ( v == 0 ) { // nothing was there, failure @@ -205,7 +204,7 @@ bool CPrimitiveTemplate::ParseFloat( const char *val, float *min, float *max ) } else if ( v == 1 ) { // only one field entered, this is ok, but we should copy min into max - *max = *min; + max = min; } return true; @@ -225,16 +224,16 @@ bool CPrimitiveTemplate::ParseFloat( const char *val, float *min, float *max ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseVector( const char *val, vec3_t min, vec3_t max ) +bool CPrimitiveTemplate::ParseVector( const gsl::cstring_view& val, vec3_t min, vec3_t max ) { // we don't allow passing in a null - if ( min == 0 || max == 0 ) + if ( min == nullptr || max == nullptr ) { return false; } // attempt to read out our values - int v = sscanf( val, "%f %f %f %f %f %f", &min[0], &min[1], &min[2], &max[0], &max[1], &max[2] ); + int v = Q::sscanf( val, min[0], min[1], min[2], max[0], max[1], max[2] ); // Check for completeness if ( v < 3 || v == 4 || v == 5 ) @@ -249,6 +248,38 @@ bool CPrimitiveTemplate::ParseVector( const char *val, vec3_t min, vec3_t max ) return true; } +namespace detail +{ + // calls Q::sscanf with the elements of the given array as arguments + + template< std::size_t remaining > + struct ScanStrings + { + template< std::size_t count, typename... Args > + static int call( const gsl::cstring_view& val, std::array< gsl::cstring_view, count >& arr, Args... args ) + { + return ScanStrings< remaining - 1 >::call( val, arr, arr[ remaining - 1 ], args... ); + } + }; + + template<> + struct ScanStrings< 0 > + { + template< std::size_t count, typename... Args > + static int call( const gsl::cstring_view& val, std::array< gsl::cstring_view, count >& arr, Args... args ) + { + return Q::sscanf( val, args... ); + } + }; +} + +template< std::size_t count > +static gsl::array_view< gsl::cstring_view > scanStrings( const gsl::cstring_view& val, std::array< gsl::cstring_view, count >& arr ) +{ + int numParsed = detail::ScanStrings< count >::call( val, arr ); + return{ arr.data(), arr.data() + numParsed }; +} + //------------------------------------------------------ // ParseGroupFlags // Group flags are generic in nature, so we can easily @@ -262,53 +293,35 @@ bool CPrimitiveTemplate::ParseVector( const char *val, vec3_t min, vec3_t max ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseGroupFlags( const char *val, int *flags ) +bool CPrimitiveTemplate::ParseGroupFlags( const gsl::cstring_view& val, int& flags ) { - // Must pass in a non-null pointer - if ( flags == 0 ) - { - return false; - } - - char flag[][32] = {"\0","\0","\0","0"}; - bool ok = true; - // For a sub group, really you probably only have one or two flags set - int v = sscanf( val, "%s %s %s %s", flag[0], flag[1], flag[2], flag[3] ); + std::array< gsl::cstring_view, 4 > flag; + + const auto availableFlag = scanStrings( val, flag ); // Clear out the flags field, then convert the flag string to an actual value ( use generic flags ) - *flags = 0; + flags = 0; - for ( int i = 0; i < 4; i++ ) + bool ok = true; + for( auto& cur : availableFlag ) { - if ( i + 1 > v ) - { - return true; - } + static StringViewIMap< int > flagNames{ + { CSTRING_VIEW( "linear" ), FX_LINEAR }, + { CSTRING_VIEW( "nonlinear" ), FX_NONLINEAR }, + { CSTRING_VIEW( "wave" ), FX_WAVE }, + { CSTRING_VIEW( "random" ), FX_RAND }, + { CSTRING_VIEW( "clamp" ), FX_CLAMP }, + }; - if ( !Q_stricmp( flag[i], "linear" )) - { - *flags |= FX_LINEAR; - } - else if ( !Q_stricmp( flag[i], "nonlinear" )) - { - *flags |= FX_NONLINEAR; - } - else if ( !Q_stricmp( flag[i], "wave" )) - { - *flags |= FX_WAVE; - } - else if ( !Q_stricmp( flag[i], "random" )) + auto pos = flagNames.find( cur ); + if( pos == flagNames.end() ) { - *flags |= FX_RAND; - } - else if ( !Q_stricmp( flag[i], "clamp" )) - { - *flags |= FX_CLAMP; + ok = false; } else - { // we have badness going on, but continue on in case there are any valid fields in here - ok = false; + { + flags |= pos->second; } } @@ -325,7 +338,7 @@ bool CPrimitiveTemplate::ParseGroupFlags( const char *val, int *flags ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseMin( const char *val ) +bool CPrimitiveTemplate::ParseMin( const gsl::cstring_view& val ) { vec3_t min; @@ -351,7 +364,7 @@ bool CPrimitiveTemplate::ParseMin( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseMax( const char *val ) +bool CPrimitiveTemplate::ParseMax( const gsl::cstring_view& val ) { vec3_t max; @@ -377,11 +390,11 @@ bool CPrimitiveTemplate::ParseMax( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseLife( const char *val ) +bool CPrimitiveTemplate::ParseLife( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mLife.SetRange( min, max ); return true; @@ -400,11 +413,11 @@ bool CPrimitiveTemplate::ParseLife( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseDelay( const char *val ) +bool CPrimitiveTemplate::ParseDelay( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mSpawnDelay.SetRange( min, max ); return true; @@ -423,11 +436,11 @@ bool CPrimitiveTemplate::ParseDelay( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseCount( const char *val ) +bool CPrimitiveTemplate::ParseCount( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mSpawnCount.SetRange( min, max ); return true; @@ -446,11 +459,11 @@ bool CPrimitiveTemplate::ParseCount( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseElasticity( const char *val ) +bool CPrimitiveTemplate::ParseElasticity( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mElasticity.SetRange( min, max ); @@ -473,7 +486,7 @@ bool CPrimitiveTemplate::ParseElasticity( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseOrigin1( const char *val ) +bool CPrimitiveTemplate::ParseOrigin1( const gsl::cstring_view& val ) { vec3_t min, max; @@ -498,7 +511,7 @@ bool CPrimitiveTemplate::ParseOrigin1( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseOrigin2( const char *val ) +bool CPrimitiveTemplate::ParseOrigin2( const gsl::cstring_view& val ) { vec3_t min, max; @@ -523,11 +536,11 @@ bool CPrimitiveTemplate::ParseOrigin2( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseRadius( const char *val ) +bool CPrimitiveTemplate::ParseRadius( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mRadius.SetRange( min, max ); return true; @@ -546,11 +559,11 @@ bool CPrimitiveTemplate::ParseRadius( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseHeight( const char *val ) +bool CPrimitiveTemplate::ParseHeight( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mHeight.SetRange( min, max ); return true; @@ -569,11 +582,11 @@ bool CPrimitiveTemplate::ParseHeight( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseWindModifier( const char *val ) +bool CPrimitiveTemplate::ParseWindModifier( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mWindModifier.SetRange( min, max ); return true; @@ -592,11 +605,11 @@ bool CPrimitiveTemplate::ParseWindModifier( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseRotation( const char *val ) +bool CPrimitiveTemplate::ParseRotation( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == qtrue ) + if ( ParseFloat( val, min, max ) == qtrue ) { mRotation.SetRange( min, max ); return true; @@ -615,11 +628,11 @@ bool CPrimitiveTemplate::ParseRotation( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseRotationDelta( const char *val ) +bool CPrimitiveTemplate::ParseRotationDelta( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == qtrue ) + if ( ParseFloat( val, min, max ) == qtrue ) { mRotationDelta.SetRange( min, max ); return true; @@ -638,7 +651,7 @@ bool CPrimitiveTemplate::ParseRotationDelta( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseAngle( const char *val ) +bool CPrimitiveTemplate::ParseAngle( const gsl::cstring_view& val ) { vec3_t min, max; @@ -663,7 +676,7 @@ bool CPrimitiveTemplate::ParseAngle( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseAngleDelta( const char *val ) +bool CPrimitiveTemplate::ParseAngleDelta( const gsl::cstring_view& val ) { vec3_t min, max; @@ -688,7 +701,7 @@ bool CPrimitiveTemplate::ParseAngleDelta( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseVelocity( const char *val ) +bool CPrimitiveTemplate::ParseVelocity( const gsl::cstring_view& val ) { vec3_t min, max; @@ -714,79 +727,43 @@ bool CPrimitiveTemplate::ParseVelocity( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseFlags( const char *val ) +bool CPrimitiveTemplate::ParseFlags( const gsl::cstring_view& val ) { - char flag[][32] = {"\0","\0","\0","\0","\0","\0","\0"}; - bool ok = true; - // For a primitive, really you probably only have two or less flags set - int v = sscanf( val, "%s %s %s %s %s %s %s", flag[0], flag[1], flag[2], flag[3], flag[4], flag[5], flag[6] ); + std::array< gsl::cstring_view, 7 > flag; - for ( int i = 0; i < 7; i++ ) - { - if ( i + 1 > v ) - { - return true; - } + const auto availableFlag = scanStrings( val, flag ); - if ( !Q_stricmp( flag[i], "useModel" )) - { - mFlags |= FX_ATTACHED_MODEL; - } - else if ( !Q_stricmp( flag[i], "useBBox" )) - { - mFlags |= FX_USE_BBOX; - } - else if ( !Q_stricmp( flag[i], "usePhysics" )) - { - mFlags |= FX_APPLY_PHYSICS; - } - else if ( !Q_stricmp( flag[i], "expensivePhysics" )) - { - mFlags |= FX_EXPENSIVE_PHYSICS; - } - //rww - begin g2 stuff - else if ( !Q_stricmp( flag[i], "ghoul2Collision" )) - { - mFlags |= (FX_GHOUL2_TRACE|FX_APPLY_PHYSICS|FX_EXPENSIVE_PHYSICS); - } - else if ( !Q_stricmp( flag[i], "ghoul2Decals" )) - { - mFlags |= FX_GHOUL2_DECALS; - } - //rww - end - else if ( !Q_stricmp( flag[i], "impactKills" )) - { - mFlags |= FX_KILL_ON_IMPACT; - } - else if ( !Q_stricmp( flag[i], "impactFx" )) - { - mFlags |= FX_IMPACT_RUNS_FX; - } - else if ( !Q_stricmp( flag[i], "deathFx" )) - { - mFlags |= FX_DEATH_RUNS_FX; - } - else if ( !Q_stricmp( flag[i], "useAlpha" )) - { - mFlags |= FX_USE_ALPHA; - } - else if ( !Q_stricmp( flag[i], "emitFx" )) - { - mFlags |= FX_EMIT_FX; - } - else if ( !Q_stricmp( flag[i], "depthHack" )) - { - mFlags |= FX_DEPTH_HACK; - } - else if ( !Q_stricmp( flag[i], "setShaderTime" )) - { - mFlags |= FX_SET_SHADER_TIME; - } - else + bool ok = true; + for( auto& cur : availableFlag ) + { + static StringViewIMap< int > flagNames{ + { CSTRING_VIEW( "useModel" ), FX_ATTACHED_MODEL }, + { CSTRING_VIEW( "useBBox" ), FX_USE_BBOX }, + { CSTRING_VIEW( "usePhysics" ), FX_APPLY_PHYSICS }, + { CSTRING_VIEW( "expensivePhysics" ), FX_EXPENSIVE_PHYSICS }, + //rww - begin g2 stuff + { CSTRING_VIEW( "ghoul2Collision" ), ( FX_GHOUL2_TRACE | FX_APPLY_PHYSICS | FX_EXPENSIVE_PHYSICS ) }, + { CSTRING_VIEW( "ghoul2Decals" ), FX_GHOUL2_DECALS }, + //rww - end + { CSTRING_VIEW( "impactKills" ), FX_KILL_ON_IMPACT }, + { CSTRING_VIEW( "impactFx" ), FX_IMPACT_RUNS_FX }, + { CSTRING_VIEW( "deathFx" ), FX_DEATH_RUNS_FX }, + { CSTRING_VIEW( "useAlpha" ), FX_CLAMP }, + { CSTRING_VIEW( "emitFx" ), FX_EMIT_FX }, + { CSTRING_VIEW( "depthHack" ), FX_DEPTH_HACK }, + { CSTRING_VIEW( "setShaderTime" ), FX_SET_SHADER_TIME }, + }; + + auto pos = flagNames.find( cur ); + if( pos == flagNames.end() ) { // we have badness going on, but continue on in case there are any valid fields in here ok = false; } + else + { + mFlags |= pos->second; + } } return ok; @@ -803,80 +780,40 @@ bool CPrimitiveTemplate::ParseFlags( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSpawnFlags( const char *val ) +bool CPrimitiveTemplate::ParseSpawnFlags( const gsl::cstring_view& val ) { - char flag[][32] = {"\0","\0","\0","\0","\0","\0","\0"}; - bool ok = true; + std::array< gsl::cstring_view, 7 > flag; // For a primitive, really you probably only have two or less flags set - int v = sscanf( val, "%s %s %s %s %s %s %s", flag[0], flag[1], flag[2], flag[3], flag[4], flag[5], flag[6] ); - - for ( int i = 0; i < 7; i++ ) - { - if ( i + 1 > v ) - { - return true; - } - - if ( !Q_stricmp( flag[i], "org2fromTrace" )) - { - mSpawnFlags |= FX_ORG2_FROM_TRACE; - } - else if ( !Q_stricmp( flag[i], "traceImpactFx" )) - { - mSpawnFlags |= FX_TRACE_IMPACT_FX; - } - else if ( !Q_stricmp( flag[i], "org2isOffset" )) - { - mSpawnFlags |= FX_ORG2_IS_OFFSET; - } - else if ( !Q_stricmp( flag[i], "cheapOrgCalc" )) - { - mSpawnFlags |= FX_CHEAP_ORG_CALC; - } - else if ( !Q_stricmp( flag[i], "cheapOrg2Calc" )) - { - mSpawnFlags |= FX_CHEAP_ORG2_CALC; - } - else if ( !Q_stricmp( flag[i], "absoluteVel" )) - { - mSpawnFlags |= FX_VEL_IS_ABSOLUTE; - } - else if ( !Q_stricmp( flag[i], "absoluteAccel" )) - { - mSpawnFlags |= FX_ACCEL_IS_ABSOLUTE; - } - else if ( !Q_stricmp( flag[i], "orgOnSphere" )) // sphere/ellipsoid - { - mSpawnFlags |= FX_ORG_ON_SPHERE; - } - else if ( !Q_stricmp( flag[i], "orgOnCylinder" )) // cylinder/disk - { - mSpawnFlags |= FX_ORG_ON_CYLINDER; - } - else if ( !Q_stricmp( flag[i], "axisFromSphere" )) - { - mSpawnFlags |= FX_AXIS_FROM_SPHERE; - } - else if ( !Q_stricmp( flag[i], "randrotaroundfwd" )) - { - mSpawnFlags |= FX_RAND_ROT_AROUND_FWD; - } - else if ( !Q_stricmp( flag[i], "evenDistribution" )) - { - mSpawnFlags |= FX_EVEN_DISTRIBUTION; - } - else if ( !Q_stricmp( flag[i], "rgbComponentInterpolation" )) - { - mSpawnFlags |= FX_RGB_COMPONENT_INTERP; - } - else if ( !Q_stricmp( flag[i], "lessAttenuation" )) + const auto availableFlag = scanStrings( val, flag ); + + bool ok = true; + for( auto& cur : availableFlag ) + { + static StringViewIMap< int > flagNames{ + { CSTRING_VIEW( "org2fromTrace" ), FX_ORG2_FROM_TRACE }, + { CSTRING_VIEW( "traceImpactFx" ), FX_TRACE_IMPACT_FX }, + { CSTRING_VIEW( "org2isOffset" ), FX_ORG2_IS_OFFSET }, + { CSTRING_VIEW( "cheapOrgCalc" ), FX_CHEAP_ORG_CALC }, + { CSTRING_VIEW( "cheapOrg2Calc" ), FX_CHEAP_ORG2_CALC }, + { CSTRING_VIEW( "absoluteVel" ), FX_VEL_IS_ABSOLUTE }, + { CSTRING_VIEW( "absoluteAccel" ), FX_ACCEL_IS_ABSOLUTE }, + { CSTRING_VIEW( "orgOnSphere" ), FX_ORG_ON_SPHERE }, + { CSTRING_VIEW( "orgOnCylinder" ), FX_ORG_ON_CYLINDER }, + { CSTRING_VIEW( "axisFromSphere" ), FX_AXIS_FROM_SPHERE }, + { CSTRING_VIEW( "randrotaroundfwd" ), FX_RAND_ROT_AROUND_FWD }, + { CSTRING_VIEW( "evenDistribution" ), FX_EVEN_DISTRIBUTION }, + { CSTRING_VIEW( "rgbComponentInterpolation" ), FX_RGB_COMPONENT_INTERP }, + { CSTRING_VIEW( "lessAttenuation" ), FX_SND_LESS_ATTENUATION }, + }; + auto pos = flagNames.find( cur ); + if( pos == flagNames.end() ) { - mSpawnFlags |= FX_SND_LESS_ATTENUATION; + ok = false; } else - { // we have badness going on, but continue on in case there are any valid fields in here - ok = false; + { + mSpawnFlags |= pos->second; } } @@ -893,7 +830,7 @@ bool CPrimitiveTemplate::ParseSpawnFlags( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseAcceleration( const char *val ) +bool CPrimitiveTemplate::ParseAcceleration( const gsl::cstring_view& val ) { vec3_t min, max; @@ -918,11 +855,11 @@ bool CPrimitiveTemplate::ParseAcceleration( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseGravity( const char *val ) +bool CPrimitiveTemplate::ParseGravity( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mGravity.SetRange( min, max ); return true; @@ -943,11 +880,11 @@ bool CPrimitiveTemplate::ParseGravity( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseDensity( const char *val ) +bool CPrimitiveTemplate::ParseDensity( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mDensity.SetRange( min, max ); return true; @@ -969,11 +906,11 @@ bool CPrimitiveTemplate::ParseDensity( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseVariance( const char *val ) +bool CPrimitiveTemplate::ParseVariance( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mVariance.SetRange( min, max ); return true; @@ -992,7 +929,7 @@ bool CPrimitiveTemplate::ParseVariance( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseRGBStart( const char *val ) +bool CPrimitiveTemplate::ParseRGBStart( const gsl::cstring_view& val ) { vec3_t min, max; @@ -1017,7 +954,7 @@ bool CPrimitiveTemplate::ParseRGBStart( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseRGBEnd( const char *val ) +bool CPrimitiveTemplate::ParseRGBEnd( const gsl::cstring_view& val ) { vec3_t min, max; @@ -1042,11 +979,11 @@ bool CPrimitiveTemplate::ParseRGBEnd( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseRGBParm( const char *val ) +bool CPrimitiveTemplate::ParseRGBParm( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mRGBParm.SetRange( min, max ); return true; @@ -1065,11 +1002,11 @@ bool CPrimitiveTemplate::ParseRGBParm( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseRGBFlags( const char *val ) +bool CPrimitiveTemplate::ParseRGBFlags( const gsl::cstring_view& val ) { int flags; - if ( ParseGroupFlags( val, &flags ) == true ) + if ( ParseGroupFlags( val, flags ) == true ) { // Convert our generic flag values into type specific ones mFlags |= ( flags << FX_RGB_SHIFT ); @@ -1089,11 +1026,11 @@ bool CPrimitiveTemplate::ParseRGBFlags( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseAlphaStart( const char *val ) +bool CPrimitiveTemplate::ParseAlphaStart( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mAlphaStart.SetRange( min, max ); return true; @@ -1112,11 +1049,11 @@ bool CPrimitiveTemplate::ParseAlphaStart( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseAlphaEnd( const char *val ) +bool CPrimitiveTemplate::ParseAlphaEnd( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mAlphaEnd.SetRange( min, max ); return true; @@ -1135,11 +1072,11 @@ bool CPrimitiveTemplate::ParseAlphaEnd( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseAlphaParm( const char *val ) +bool CPrimitiveTemplate::ParseAlphaParm( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mAlphaParm.SetRange( min, max ); return true; @@ -1158,11 +1095,11 @@ bool CPrimitiveTemplate::ParseAlphaParm( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseAlphaFlags( const char *val ) +bool CPrimitiveTemplate::ParseAlphaFlags( const gsl::cstring_view& val ) { int flags; - if ( ParseGroupFlags( val, &flags ) == true ) + if ( ParseGroupFlags( val, flags ) == true ) { // Convert our generic flag values into type specific ones mFlags |= ( flags << FX_ALPHA_SHIFT ); @@ -1182,11 +1119,11 @@ bool CPrimitiveTemplate::ParseAlphaFlags( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSizeStart( const char *val ) +bool CPrimitiveTemplate::ParseSizeStart( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mSizeStart.SetRange( min, max ); return true; @@ -1205,11 +1142,11 @@ bool CPrimitiveTemplate::ParseSizeStart( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSizeEnd( const char *val ) +bool CPrimitiveTemplate::ParseSizeEnd( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mSizeEnd.SetRange( min, max ); return true; @@ -1228,11 +1165,11 @@ bool CPrimitiveTemplate::ParseSizeEnd( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSizeParm( const char *val ) +bool CPrimitiveTemplate::ParseSizeParm( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mSizeParm.SetRange( min, max ); return true; @@ -1251,11 +1188,11 @@ bool CPrimitiveTemplate::ParseSizeParm( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSizeFlags( const char *val ) +bool CPrimitiveTemplate::ParseSizeFlags( const gsl::cstring_view& val ) { int flags; - if ( ParseGroupFlags( val, &flags ) == true ) + if ( ParseGroupFlags( val, flags ) == true ) { // Convert our generic flag values into type specific ones mFlags |= ( flags << FX_SIZE_SHIFT ); @@ -1275,11 +1212,11 @@ bool CPrimitiveTemplate::ParseSizeFlags( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSize2Start( const char *val ) +bool CPrimitiveTemplate::ParseSize2Start( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mSize2Start.SetRange( min, max ); return true; @@ -1298,11 +1235,11 @@ bool CPrimitiveTemplate::ParseSize2Start( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSize2End( const char *val ) +bool CPrimitiveTemplate::ParseSize2End( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mSize2End.SetRange( min, max ); return true; @@ -1321,11 +1258,11 @@ bool CPrimitiveTemplate::ParseSize2End( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSize2Parm( const char *val ) +bool CPrimitiveTemplate::ParseSize2Parm( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mSize2Parm.SetRange( min, max ); return true; @@ -1344,11 +1281,11 @@ bool CPrimitiveTemplate::ParseSize2Parm( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSize2Flags( const char *val ) +bool CPrimitiveTemplate::ParseSize2Flags( const gsl::cstring_view& val ) { int flags; - if ( ParseGroupFlags( val, &flags ) == true ) + if ( ParseGroupFlags( val, flags ) == true ) { // Convert our generic flag values into type specific ones mFlags |= ( flags << FX_SIZE2_SHIFT ); @@ -1368,11 +1305,11 @@ bool CPrimitiveTemplate::ParseSize2Flags( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseLengthStart( const char *val ) +bool CPrimitiveTemplate::ParseLengthStart( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mLengthStart.SetRange( min, max ); return true; @@ -1391,11 +1328,11 @@ bool CPrimitiveTemplate::ParseLengthStart( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseLengthEnd( const char *val ) +bool CPrimitiveTemplate::ParseLengthEnd( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mLengthEnd.SetRange( min, max ); return true; @@ -1414,11 +1351,11 @@ bool CPrimitiveTemplate::ParseLengthEnd( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseLengthParm( const char *val ) +bool CPrimitiveTemplate::ParseLengthParm( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mLengthParm.SetRange( min, max ); return true; @@ -1437,11 +1374,11 @@ bool CPrimitiveTemplate::ParseLengthParm( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseLengthFlags( const char *val ) +bool CPrimitiveTemplate::ParseLengthFlags( const gsl::cstring_view& val ) { int flags; - if ( ParseGroupFlags( val, &flags ) == true ) + if ( ParseGroupFlags( val, flags ) == true ) { // Convert our generic flag values into type specific ones mFlags |= ( flags << FX_LENGTH_SHIFT ); @@ -1461,45 +1398,24 @@ bool CPrimitiveTemplate::ParseLengthFlags( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseShaders( CGPValue *grp ) +bool CPrimitiveTemplate::ParseShaders( const CGPProperty& grp ) { - const char *val; - int handle; - - if ( grp->IsList() ) + bool any = false; + for( auto& value : grp.GetValues() ) { - // If we are a list we have to do separate processing - CGPObject *list = grp->GetList(); - - while ( list ) + if( !value.empty() ) { - // name is actually the value contained in the list - val = list->GetName(); - - handle = theFxHelper.RegisterShader( val ); + any = true; + int handle = theFxHelper.RegisterShader( value ); mMediaHandles.AddHandle( handle ); - - list = (CGPValue *)list->GetNext(); } } - else + if( !any ) { - // Let's get a value - val = grp->GetTopValue(); - - if ( val ) - { - handle = theFxHelper.RegisterShader( val ); - mMediaHandles.AddHandle( handle ); - } - else - { - // empty "list" - theFxHelper.Print( "CPrimitiveTemplate::ParseShaders called with an empty list!\n" ); - return false; - } + // empty "list" + theFxHelper.Print( "CPrimitiveTemplate::ParseShaders called with an empty list!\n" ); + return false; } - return true; } @@ -1513,45 +1429,24 @@ bool CPrimitiveTemplate::ParseShaders( CGPValue *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSounds( CGPValue *grp ) +bool CPrimitiveTemplate::ParseSounds( const CGPProperty& grp ) { - const char *val; - int handle; - - if ( grp->IsList() ) + bool any = false; + for( auto& value : grp.GetValues() ) { - // If we are a list we have to do separate processing - CGPObject *list = grp->GetList(); - - while ( list ) + if( !value.empty() ) { - // name is actually the value contained in the list - val = list->GetName(); - - handle = theFxHelper.RegisterSound( val ); + any = true; + int handle = theFxHelper.RegisterSound( value ); mMediaHandles.AddHandle( handle ); - - list = (CGPValue *)list->GetNext(); } } - else + if( !any ) { - // Let's get a value - val = grp->GetTopValue(); - - if ( val ) - { - handle = theFxHelper.RegisterSound( val ); - mMediaHandles.AddHandle( handle ); - } - else - { - // empty "list" - theFxHelper.Print( "CPrimitiveTemplate::ParseSounds called with an empty list!\n" ); - return false; - } + // empty "list" + theFxHelper.Print( "CPrimitiveTemplate::ParseSounds called with an empty list!\n" ); + return false; } - return true; } @@ -1565,119 +1460,75 @@ bool CPrimitiveTemplate::ParseSounds( CGPValue *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseModels( CGPValue *grp ) +bool CPrimitiveTemplate::ParseModels( const CGPProperty& grp ) { - const char *val; - int handle; - - if ( grp->IsList() ) + bool any = false; + for( auto& value : grp.GetValues() ) { - // If we are a list we have to do separate processing - CGPObject *list = grp->GetList(); - - while ( list ) + if( !value.empty() ) { - // name is actually the value contained in the list - val = list->GetName(); - - handle = theFxHelper.RegisterModel( val ); + any = true; + int handle = theFxHelper.RegisterModel( value ); mMediaHandles.AddHandle( handle ); - - list = (CGPValue *)list->GetNext(); } } - else + if( !any ) { - // Let's get a value - val = grp->GetTopValue(); - - if ( val ) - { - handle = theFxHelper.RegisterModel( val ); - mMediaHandles.AddHandle( handle ); - } - else - { - // empty "list" - theFxHelper.Print( "CPrimitiveTemplate::ParseModels called with an empty list!\n" ); - return false; - } + // empty "list" + theFxHelper.Print( "CPrimitiveTemplate::ParseModels called with an empty list!\n" ); + return false; } - mFlags |= FX_ATTACHED_MODEL; - return true; } -//------------------------------------------------------ -// ParseImpactFxStrings -// Reads in a group of fx file names and registers them -// -// input: -// Parse group that contains the list of fx to parse -// -// return: -// success of parse operation. -//------------------------------------------------------ -bool CPrimitiveTemplate::ParseImpactFxStrings( CGPValue *grp ) +static bool ParseFX( const CGPProperty& grp, CFxScheduler& scheduler, CMediaHandles& handles, SFxHelper& helper, int& flags, int successFlags, gsl::czstring loadError, gsl::czstring emptyError ) { - const char *val; - int handle; - - if ( grp->IsList() ) + bool any = false; + for( auto& value : grp.GetValues() ) { - // If we are a list we have to do separate processing - CGPObject *list = grp->GetList(); - - while ( list ) + if( !value.empty() ) { - // name is actually the value contained in the list - val = list->GetName(); - handle = theFxScheduler.RegisterEffect( val ); - - if ( handle ) + any = true; + // TODO: string_view parameter + int handle = scheduler.RegisterEffect( std::string( value.begin(), value.end() ).c_str() ); + if( handle ) { - mImpactFxHandles.AddHandle( handle ); + handles.AddHandle( handle ); + flags |= successFlags; } else { - theFxHelper.Print( "FxTemplate: Impact effect file not found.\n" ); - return false; + helper.Print( "%s", loadError ); } - - list = (CGPValue *)list->GetNext(); } } - else + if( !any ) { - // Let's get a value - val = grp->GetTopValue(); - - if ( val ) - { - handle = theFxScheduler.RegisterEffect( val ); - - if ( handle ) - { - mImpactFxHandles.AddHandle( handle ); - } - else - { - theFxHelper.Print( "FxTemplate: Impact effect file not found.\n" ); - return false; - } - } - else - { - // empty "list" - theFxHelper.Print( "CPrimitiveTemplate::ParseImpactFxStrings called with an empty list!\n" ); - return false; - } + helper.Print( "%s", emptyError ); } + return any; +} - mFlags |= FX_IMPACT_RUNS_FX | FX_APPLY_PHYSICS; - - return true; +//------------------------------------------------------ +// ParseImpactFxStrings +// Reads in a group of fx file names and registers them +// +// input: +// Parse group that contains the list of fx to parse +// +// return: +// success of parse operation. +//------------------------------------------------------ +bool CPrimitiveTemplate::ParseImpactFxStrings( const CGPProperty& grp ) +{ + return ParseFX( + grp, + theFxScheduler, mImpactFxHandles, theFxHelper, + mFlags, FX_IMPACT_RUNS_FX | FX_APPLY_PHYSICS, + "FxTemplate: Impact effect file not found.\n", + "CPrimitiveTemplate::ParseImpactFxStrings called with an empty list!\n" + ); } //------------------------------------------------------ @@ -1690,65 +1541,15 @@ bool CPrimitiveTemplate::ParseImpactFxStrings( CGPValue *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseDeathFxStrings( CGPValue *grp ) +bool CPrimitiveTemplate::ParseDeathFxStrings( const CGPProperty& grp ) { - const char *val; - int handle; - - if ( grp->IsList() ) - { - // If we are a list we have to do separate processing - CGPObject *list = grp->GetList(); - - while ( list ) - { - // name is actually the value contained in the list - val = list->GetName(); - handle = theFxScheduler.RegisterEffect( val ); - - if ( handle ) - { - mDeathFxHandles.AddHandle( handle ); - } - else - { - theFxHelper.Print( "FxTemplate: Death effect file not found.\n" ); - return false; - } - - list = (CGPValue *)list->GetNext(); - } - } - else - { - // Let's get a value - val = grp->GetTopValue(); - - if ( val ) - { - handle = theFxScheduler.RegisterEffect( val ); - - if ( handle ) - { - mDeathFxHandles.AddHandle( handle ); - } - else - { - theFxHelper.Print( "FxTemplate: Death effect file not found.\n" ); - return false; - } - } - else - { - // empty "list" - theFxHelper.Print( "CPrimitiveTemplate::ParseDeathFxStrings called with an empty list!\n" ); - return false; - } - } - - mFlags |= FX_DEATH_RUNS_FX; - - return true; + return ParseFX( + grp, + theFxScheduler, mDeathFxHandles, theFxHelper, + mFlags, FX_DEATH_RUNS_FX, + "FxTemplate: Death effect file not found.\n", + "CPrimitiveTemplate::ParseDeathFxStrings called with an empty list!\n" + ); } //------------------------------------------------------ @@ -1761,65 +1562,15 @@ bool CPrimitiveTemplate::ParseDeathFxStrings( CGPValue *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseEmitterFxStrings( CGPValue *grp ) +bool CPrimitiveTemplate::ParseEmitterFxStrings( const CGPProperty& grp ) { - const char *val; - int handle; - - if ( grp->IsList() ) - { - // If we are a list we have to do separate processing - CGPObject *list = grp->GetList(); - - while ( list ) - { - // name is actually the value contained in the list - val = list->GetName(); - handle = theFxScheduler.RegisterEffect( val ); - - if ( handle ) - { - mEmitterFxHandles.AddHandle( handle ); - } - else - { - theFxHelper.Print( "FxTemplate: Emitter effect file not found.\n" ); - return false; - } - - list = (CGPValue *)list->GetNext(); - } - } - else - { - // Let's get a value - val = grp->GetTopValue(); - - if ( val ) - { - handle = theFxScheduler.RegisterEffect( val ); - - if ( handle ) - { - mEmitterFxHandles.AddHandle( handle ); - } - else - { - theFxHelper.Print( "FxTemplate: Emitter effect file not found.\n" ); - return false; - } - } - else - { - // empty "list" - theFxHelper.Print( "CPrimitiveTemplate::ParseEmitterFxStrings called with an empty list!\n" ); - return false; - } - } - - mFlags |= FX_EMIT_FX; - - return true; + return ParseFX( + grp, + theFxScheduler, mEmitterFxHandles, theFxHelper, + mFlags, FX_EMIT_FX, + "FxTemplate: Emitter effect file not found.\n", + "CPrimitiveTemplate::ParseEmitterFxStrings called with an empty list!\n" + ); } //------------------------------------------------------ @@ -1832,62 +1583,32 @@ bool CPrimitiveTemplate::ParseEmitterFxStrings( CGPValue *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParsePlayFxStrings( CGPValue *grp ) +bool CPrimitiveTemplate::ParsePlayFxStrings( const CGPProperty& grp ) { - const char *val; - int handle; - - if ( grp->IsList() ) - { - // If we are a list we have to do separate processing - CGPObject *list = grp->GetList(); - - while ( list ) - { - // name is actually the value contained in the list - val = list->GetName(); - handle = theFxScheduler.RegisterEffect( val ); - - if ( handle ) - { - mPlayFxHandles.AddHandle( handle ); - } - else - { - theFxHelper.Print( "FxTemplate: Effect file not found.\n" ); - return false; - } + return ParseFX( + grp, + theFxScheduler, mPlayFxHandles, theFxHelper, + mFlags, 0, + "FxTemplate: Effect file not found.\n", + "CPrimitiveTemplate::ParsePlayFxStrings called with an empty list!\n" + ); +} - list = (CGPValue *)list->GetNext(); - } - } - else +bool CPrimitiveTemplate::ParseGroup( const CGPGroup& grp, const StringViewIMap< ParseMethod >& parseMethods, gsl::czstring name ) +{ + for( auto& cur : grp.GetProperties() ) { - // Let's get a value - val = grp->GetTopValue(); - - if ( val ) + auto pos = parseMethods.find( cur.GetName() ); + if( pos == parseMethods.end() ) { - handle = theFxScheduler.RegisterEffect( val ); - - if ( handle ) - { - mPlayFxHandles.AddHandle( handle ); - } - else - { - theFxHelper.Print( "FxTemplate: Effect file not found.\n" ); - return false; - } + theFxHelper.Print( "Unknown key parsing %s group!", name ); } else { - // empty "list" - theFxHelper.Print( "CPrimitiveTemplate::ParsePlayFxStrings called with an empty list!\n" ); - return false; + ParseMethod method = pos->second; + ( this->*method )( cur.GetTopValue() ); } } - return true; } @@ -1902,47 +1623,20 @@ bool CPrimitiveTemplate::ParsePlayFxStrings( CGPValue *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseRGB( CGPGroup *grp ) +bool CPrimitiveTemplate::ParseRGB( const CGPGroup& grp ) { - CGPValue *pairs; - const char *key; - const char *val; + static StringViewIMap< ParseMethod > parseMethods{ + { CSTRING_VIEW( "start" ), &CPrimitiveTemplate::ParseRGBStart }, - // Inside of the group, we should have a series of pairs - pairs = grp->GetPairs(); + { CSTRING_VIEW( "end" ), &CPrimitiveTemplate::ParseRGBEnd }, - while( pairs ) - { - // Let's get the key field - key = pairs->GetName(); - val = pairs->GetTopValue(); + { CSTRING_VIEW( "parm" ), &CPrimitiveTemplate::ParseRGBParm }, + { CSTRING_VIEW( "parms" ), &CPrimitiveTemplate::ParseRGBParm }, - // Huge stricmp lists suxor - if ( !Q_stricmp( key, "start" )) - { - ParseRGBStart( val ); - } - else if ( !Q_stricmp( key, "end" )) - { - ParseRGBEnd( val ); - } - else if ( !Q_stricmp( key, "parm" ) || !Q_stricmp( key, "parms" )) - { - ParseRGBParm( val ); - } - else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) - { - ParseRGBFlags( val ); - } - else - { - theFxHelper.Print( "Unknown key parsing an RGB group: %s\n", key ); - } - - pairs = (CGPValue *)pairs->GetNext(); - } - - return true; + { CSTRING_VIEW( "flag" ), &CPrimitiveTemplate::ParseRGBFlags }, + { CSTRING_VIEW( "flags" ), &CPrimitiveTemplate::ParseRGBFlags }, + }; + return ParseGroup( grp, parseMethods, "RGB" ); } //------------------------------------------------------ @@ -1956,47 +1650,20 @@ bool CPrimitiveTemplate::ParseRGB( CGPGroup *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseAlpha( CGPGroup *grp ) +bool CPrimitiveTemplate::ParseAlpha( const CGPGroup& grp ) { - CGPValue *pairs; - const char *key; - const char *val; - - // Inside of the group, we should have a series of pairs - pairs = grp->GetPairs(); + static StringViewIMap< ParseMethod > parseMethods{ + { CSTRING_VIEW( "start" ), &CPrimitiveTemplate::ParseAlphaStart }, - while( pairs ) - { - // Let's get the key field - key = pairs->GetName(); - val = pairs->GetTopValue(); - - // Huge stricmp lists suxor - if ( !Q_stricmp( key, "start" )) - { - ParseAlphaStart( val ); - } - else if ( !Q_stricmp( key, "end" )) - { - ParseAlphaEnd( val ); - } - else if ( !Q_stricmp( key, "parm" ) || !Q_stricmp( key, "parms" )) - { - ParseAlphaParm( val ); - } - else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) - { - ParseAlphaFlags( val ); - } - else - { - theFxHelper.Print( "Unknown key parsing an Alpha group: %s\n", key ); - } + { CSTRING_VIEW( "end" ), &CPrimitiveTemplate::ParseAlphaEnd }, - pairs = (CGPValue *)pairs->GetNext(); - } + { CSTRING_VIEW( "parm" ), &CPrimitiveTemplate::ParseAlphaParm }, + { CSTRING_VIEW( "parms" ), &CPrimitiveTemplate::ParseAlphaParm }, - return true; + { CSTRING_VIEW( "flag" ), &CPrimitiveTemplate::ParseAlphaFlags }, + { CSTRING_VIEW( "flags" ), &CPrimitiveTemplate::ParseAlphaFlags }, + }; + return ParseGroup( grp, parseMethods, "Alpha" ); } //------------------------------------------------------ @@ -2010,47 +1677,20 @@ bool CPrimitiveTemplate::ParseAlpha( CGPGroup *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSize( CGPGroup *grp ) +bool CPrimitiveTemplate::ParseSize( const CGPGroup& grp ) { - CGPValue *pairs; - const char *key; - const char *val; + static StringViewIMap< ParseMethod > parseMethods{ + { CSTRING_VIEW( "start" ), &CPrimitiveTemplate::ParseSizeStart }, - // Inside of the group, we should have a series of pairs - pairs = grp->GetPairs(); + { CSTRING_VIEW( "end" ), &CPrimitiveTemplate::ParseSizeEnd }, - while( pairs ) - { - // Let's get the key field - key = pairs->GetName(); - val = pairs->GetTopValue(); + { CSTRING_VIEW( "parm" ), &CPrimitiveTemplate::ParseSizeParm }, + { CSTRING_VIEW( "parms" ), &CPrimitiveTemplate::ParseSizeParm }, - // Huge stricmp lists suxor - if ( !Q_stricmp( key, "start" )) - { - ParseSizeStart( val ); - } - else if ( !Q_stricmp( key, "end" )) - { - ParseSizeEnd( val ); - } - else if ( !Q_stricmp( key, "parm" ) || !Q_stricmp( key, "parms" )) - { - ParseSizeParm( val ); - } - else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) - { - ParseSizeFlags( val ); - } - else - { - theFxHelper.Print( "Unknown key parsing a Size group: %s\n", key ); - } - - pairs = (CGPValue *)pairs->GetNext(); - } - - return true; + { CSTRING_VIEW( "flag" ), &CPrimitiveTemplate::ParseSizeFlags }, + { CSTRING_VIEW( "flags" ), &CPrimitiveTemplate::ParseSizeFlags }, + }; + return ParseGroup( grp, parseMethods, "Size" ); } //------------------------------------------------------ @@ -2064,47 +1704,20 @@ bool CPrimitiveTemplate::ParseSize( CGPGroup *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSize2( CGPGroup *grp ) +bool CPrimitiveTemplate::ParseSize2( const CGPGroup& grp ) { - CGPValue *pairs; - const char *key; - const char *val; + static StringViewIMap< ParseMethod > parseMethods{ + { CSTRING_VIEW( "start" ), &CPrimitiveTemplate::ParseSize2Start }, - // Inside of the group, we should have a series of pairs - pairs = grp->GetPairs(); + { CSTRING_VIEW( "end" ), &CPrimitiveTemplate::ParseSize2End }, - while( pairs ) - { - // Let's get the key field - key = pairs->GetName(); - val = pairs->GetTopValue(); + { CSTRING_VIEW( "parm" ), &CPrimitiveTemplate::ParseSize2Parm }, + { CSTRING_VIEW( "parms" ), &CPrimitiveTemplate::ParseSize2Parm }, - // Huge stricmp lists suxor - if ( !Q_stricmp( key, "start" )) - { - ParseSize2Start( val ); - } - else if ( !Q_stricmp( key, "end" )) - { - ParseSize2End( val ); - } - else if ( !Q_stricmp( key, "parm" ) || !Q_stricmp( key, "parms" )) - { - ParseSize2Parm( val ); - } - else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) - { - ParseSize2Flags( val ); - } - else - { - theFxHelper.Print( "Unknown key parsing a Size2 group: %s\n", key ); - } - - pairs = (CGPValue *)pairs->GetNext(); - } - - return true; + { CSTRING_VIEW( "flag" ), &CPrimitiveTemplate::ParseSize2Flags }, + { CSTRING_VIEW( "flags" ), &CPrimitiveTemplate::ParseSize2Flags }, + }; + return ParseGroup( grp, parseMethods, "Size2" ); } //------------------------------------------------------ @@ -2118,241 +1731,145 @@ bool CPrimitiveTemplate::ParseSize2( CGPGroup *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseLength( CGPGroup *grp ) +bool CPrimitiveTemplate::ParseLength( const CGPGroup& grp ) { - CGPValue *pairs; - const char *key; - const char *val; + static StringViewIMap< ParseMethod > parseMethods{ + { CSTRING_VIEW( "start" ), &CPrimitiveTemplate::ParseLengthStart }, - // Inside of the group, we should have a series of pairs - pairs = grp->GetPairs(); - - while( pairs ) - { - // Let's get the key field - key = pairs->GetName(); - val = pairs->GetTopValue(); - - // Huge stricmp lists suxor - if ( !Q_stricmp( key, "start" )) - { - ParseLengthStart( val ); - } - else if ( !Q_stricmp( key, "end" )) - { - ParseLengthEnd( val ); - } - else if ( !Q_stricmp( key, "parm" ) || !Q_stricmp( key, "parms" )) - { - ParseLengthParm( val ); - } - else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) - { - ParseLengthFlags( val ); - } - else - { - theFxHelper.Print( "Unknown key parsing a Length group: %s\n", key ); - } + { CSTRING_VIEW( "end" ), &CPrimitiveTemplate::ParseLengthEnd }, - pairs = (CGPValue *)pairs->GetNext(); - } + { CSTRING_VIEW( "parm" ), &CPrimitiveTemplate::ParseLengthParm }, + { CSTRING_VIEW( "parms" ), &CPrimitiveTemplate::ParseLengthParm }, - return true; + { CSTRING_VIEW( "flag" ), &CPrimitiveTemplate::ParseLengthFlags }, + { CSTRING_VIEW( "flags" ), &CPrimitiveTemplate::ParseLengthFlags }, + }; + return ParseGroup( grp, parseMethods, "Length" ); } // Parse a primitive, apply defaults first, grab any base level // key pairs, then process any sub groups we may contain. //------------------------------------------------------ -bool CPrimitiveTemplate::ParsePrimitive( CGPGroup *grp ) +bool CPrimitiveTemplate::ParsePrimitive( const CGPGroup& grp ) { - CGPGroup *subGrp; - CGPValue *pairs; - const char *key; - const char *val; - - // Lets work with the pairs first - pairs = grp->GetPairs(); - - while( pairs ) - { - // the fields - key = pairs->GetName(); - val = pairs->GetTopValue(); - - // Huge stricmp lists suxor - if ( !Q_stricmp( key, "count" )) - { - ParseCount( val ); - } - else if ( !Q_stricmp( key, "shaders" ) || !Q_stricmp( key, "shader" )) - { - ParseShaders( pairs ); - } - else if ( !Q_stricmp( key, "models" ) || !Q_stricmp( key, "model" )) - { - ParseModels( pairs ); - } - else if ( !Q_stricmp( key, "sounds" ) || !Q_stricmp( key, "sound" )) - { - ParseSounds( pairs ); - } - else if ( !Q_stricmp( key, "impactfx" )) - { - ParseImpactFxStrings( pairs ); - } - else if ( !Q_stricmp( key, "deathfx" )) - { - ParseDeathFxStrings( pairs ); - } - else if ( !Q_stricmp( key, "emitfx" )) - { - ParseEmitterFxStrings( pairs ); - } - else if ( !Q_stricmp( key, "playfx" )) - { - ParsePlayFxStrings( pairs ); + // Property + for( auto& prop : grp.GetProperties() ) + { + // Single Value Parsing + { + static StringViewIMap< ParseMethod > parseMethods{ + { CSTRING_VIEW( "count" ), &CPrimitiveTemplate::ParseCount }, + { CSTRING_VIEW( "life" ), &CPrimitiveTemplate::ParseLife }, + { CSTRING_VIEW( "delay" ), &CPrimitiveTemplate::ParseDelay }, + { CSTRING_VIEW( "bounce" ), &CPrimitiveTemplate::ParseElasticity }, + { CSTRING_VIEW( "intensity" ), &CPrimitiveTemplate::ParseElasticity }, + { CSTRING_VIEW( "min" ), &CPrimitiveTemplate::ParseMin }, + { CSTRING_VIEW( "max" ), &CPrimitiveTemplate::ParseMax }, + { CSTRING_VIEW( "angle" ), &CPrimitiveTemplate::ParseAngle }, + { CSTRING_VIEW( "angles" ), &CPrimitiveTemplate::ParseAngle }, + { CSTRING_VIEW( "angleDelta" ), &CPrimitiveTemplate::ParseAngleDelta }, + { CSTRING_VIEW( "velocity" ), &CPrimitiveTemplate::ParseVelocity }, + { CSTRING_VIEW( "vel" ), &CPrimitiveTemplate::ParseVelocity }, + { CSTRING_VIEW( "acceleration" ), &CPrimitiveTemplate::ParseAcceleration }, + { CSTRING_VIEW( "accel" ), &CPrimitiveTemplate::ParseAcceleration }, + { CSTRING_VIEW( "gravity" ), &CPrimitiveTemplate::ParseGravity }, + { CSTRING_VIEW( "density" ), &CPrimitiveTemplate::ParseDensity }, + { CSTRING_VIEW( "variance" ), &CPrimitiveTemplate::ParseVariance }, + { CSTRING_VIEW( "origin" ), &CPrimitiveTemplate::ParseOrigin1 }, + { CSTRING_VIEW( "origin2" ), &CPrimitiveTemplate::ParseOrigin2 }, + { CSTRING_VIEW( "radius" ), &CPrimitiveTemplate::ParseRadius }, + { CSTRING_VIEW( "height" ), &CPrimitiveTemplate::ParseHeight }, + { CSTRING_VIEW( "wind" ), &CPrimitiveTemplate::ParseWindModifier }, + { CSTRING_VIEW( "rotation" ), &CPrimitiveTemplate::ParseRotation }, + { CSTRING_VIEW( "rotationDelta" ), &CPrimitiveTemplate::ParseRotationDelta }, + { CSTRING_VIEW( "flags" ), &CPrimitiveTemplate::ParseFlags }, + { CSTRING_VIEW( "flag" ), &CPrimitiveTemplate::ParseFlags }, + { CSTRING_VIEW( "spawnFlags" ), &CPrimitiveTemplate::ParseSpawnFlags }, + { CSTRING_VIEW( "spawnFlag" ), &CPrimitiveTemplate::ParseSpawnFlags }, + }; + auto pos = parseMethods.find( prop.GetName() ); + if( pos != parseMethods.end() ) + { + ParseMethod method = pos->second; + ( this->*method )( prop.GetTopValue() ); + continue; + } } - else if ( !Q_stricmp( key, "life" )) - { - ParseLife( val ); + // Property Parsing + { + using PropertyParseMethod = bool( CPrimitiveTemplate::* )( const CGPProperty& ); + static StringViewIMap< PropertyParseMethod > parseMethods{ + { CSTRING_VIEW( "shaders" ), &CPrimitiveTemplate::ParseShaders }, + { CSTRING_VIEW( "shader" ), &CPrimitiveTemplate::ParseShaders }, + { CSTRING_VIEW( "models" ), &CPrimitiveTemplate::ParseModels }, + { CSTRING_VIEW( "model" ), &CPrimitiveTemplate::ParseModels }, + { CSTRING_VIEW( "sounds" ), &CPrimitiveTemplate::ParseSounds }, + { CSTRING_VIEW( "sound" ), &CPrimitiveTemplate::ParseSounds }, + { CSTRING_VIEW( "impactfx" ), &CPrimitiveTemplate::ParseImpactFxStrings }, + { CSTRING_VIEW( "deathfx" ), &CPrimitiveTemplate::ParseDeathFxStrings }, + { CSTRING_VIEW( "emitfx" ), &CPrimitiveTemplate::ParseEmitterFxStrings }, + { CSTRING_VIEW( "playfx" ), &CPrimitiveTemplate::ParsePlayFxStrings }, + }; + auto pos = parseMethods.find( prop.GetName() ); + if( pos != parseMethods.end() ) + { + PropertyParseMethod method = pos->second; + ( this->*method )( prop ); + continue; + } } - else if ( !Q_stricmp( key, "cullrange" )) + // Special Cases + if( Q::stricmp( prop.GetName(), CSTRING_VIEW( "cullrange" ) ) == Q::Ordering::EQ ) { - mCullRange = atoi( val ); + mCullRange = Q::svtoi( prop.GetTopValue() ); mCullRange *= mCullRange; // Square } - else if ( !Q_stricmp( key, "delay" )) + else if( Q::stricmp( prop.GetName(), CSTRING_VIEW( "name" ) ) == Q::Ordering::EQ ) { - ParseDelay( val ); - } - else if ( !Q_stricmp( key, "bounce" ) || !Q_stricmp( key, "intensity" )) // me==bad for reusing this...but it shouldn't hurt anything) - { - ParseElasticity( val ); - } - else if ( !Q_stricmp( key, "min" )) - { - ParseMin( val ); - } - else if ( !Q_stricmp( key, "max" )) - { - ParseMax( val ); - } - else if ( !Q_stricmp( key, "angle" ) || !Q_stricmp( key, "angles" )) - { - ParseAngle( val ); - } - else if ( !Q_stricmp( key, "angleDelta" )) - { - ParseAngleDelta( val ); - } - else if ( !Q_stricmp( key, "velocity" ) || !Q_stricmp( key, "vel" )) - { - ParseVelocity( val ); - } - else if ( !Q_stricmp( key, "acceleration" ) || !Q_stricmp( key, "accel" )) - { - ParseAcceleration( val ); - } - else if ( !Q_stricmp( key, "gravity" )) - { - ParseGravity( val ); - } - else if ( !Q_stricmp( key, "density" )) - { - ParseDensity( val ); - } - else if ( !Q_stricmp( key, "variance" )) - { - ParseVariance( val ); - } - else if ( !Q_stricmp( key, "origin" )) - { - ParseOrigin1( val ); - } - else if ( !Q_stricmp( key, "origin2" )) - { - ParseOrigin2( val ); - } - else if ( !Q_stricmp( key, "radius" )) // part of ellipse/cylinder calcs. - { - ParseRadius( val ); - } - else if ( !Q_stricmp( key, "height" )) // part of ellipse/cylinder calcs. - { - ParseHeight( val ); - } - else if ( !Q_stricmp( key, "wind" )) - { - ParseWindModifier( val ); - } - else if ( !Q_stricmp( key, "rotation" )) - { - ParseRotation( val ); - } - else if ( !Q_stricmp( key, "rotationDelta" )) - { - ParseRotationDelta( val ); - } - else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) - { // these need to get passed on to the primitive - ParseFlags( val ); - } - else if ( !Q_stricmp( key, "spawnFlags" ) || !Q_stricmp( key, "spawnFlag" )) - { // these are used to spawn things in cool ways, but don't ever get passed on to prims. - ParseSpawnFlags( val ); - } - else if ( !Q_stricmp( key, "name" )) - { - if ( val ) + if( !prop.GetTopValue().empty() ) { // just stash the descriptive name of the primitive - strcpy( mName, val ); + std::size_t len = std::min< std::size_t >( prop.GetTopValue().size(), FX_MAX_PRIM_NAME - 1 ); + auto begin = prop.GetTopValue().begin(); + std::copy( begin, begin + len, &mName[ 0 ] ); + mName[ len ] = '\0'; } } + // Error else { - theFxHelper.Print( "Unknown key parsing an effect primitive: %s\n", key ); + theFxHelper.Print( "Unknown key parsing an effect primitive!\n" ); } - - pairs = (CGPValue *)pairs->GetNext(); } - subGrp = grp->GetSubGroups(); - - // Lets chomp on the groups now - while ( subGrp ) + for( auto& subGrp : grp.GetSubGroups() ) { - key = subGrp->GetName(); + using GroupParseMethod = bool ( CPrimitiveTemplate::* )( const CGPGroup& ); + static StringViewIMap< GroupParseMethod > parseMethods{ + { CSTRING_VIEW( "rgb" ), &CPrimitiveTemplate::ParseRGB }, - if ( !Q_stricmp( key, "rgb" )) - { - ParseRGB( subGrp ); - } - else if ( !Q_stricmp( key, "alpha" )) - { - ParseAlpha( subGrp ); - } - else if ( !Q_stricmp( key, "size" ) || !Q_stricmp( key, "width" )) - { - ParseSize( subGrp ); - } - else if ( !Q_stricmp( key, "size2" ) || !Q_stricmp( key, "width2" )) - { - ParseSize2( subGrp ); - } - else if ( !Q_stricmp( key, "length" ) || !Q_stricmp( key, "height" )) + { CSTRING_VIEW( "alpha" ), &CPrimitiveTemplate::ParseAlpha }, + + { CSTRING_VIEW( "size" ), &CPrimitiveTemplate::ParseSize }, + { CSTRING_VIEW( "width" ), &CPrimitiveTemplate::ParseSize }, + + { CSTRING_VIEW( "size2" ), &CPrimitiveTemplate::ParseSize2 }, + { CSTRING_VIEW( "width2" ), &CPrimitiveTemplate::ParseSize2 }, + + { CSTRING_VIEW( "length" ), &CPrimitiveTemplate::ParseLength }, + { CSTRING_VIEW( "height" ), &CPrimitiveTemplate::ParseLength }, + }; + auto pos = parseMethods.find( subGrp.GetName() ); + if( pos == parseMethods.end() ) { - ParseLength( subGrp ); + theFxHelper.Print( "Unknown group key parsing a particle!\n" ); } else { - theFxHelper.Print( "Unknown group key parsing a particle: %s\n", key ); + GroupParseMethod method = pos->second; + ( this->*method )( subGrp ); } - - subGrp = (CGPGroup *)subGrp->GetNext(); } - return true; } \ No newline at end of file diff --git a/code/client/snd_music.cpp b/code/client/snd_music.cpp index b2d21511ea..f1e0648417 100644 --- a/code/client/snd_music.cpp +++ b/code/client/snd_music.cpp @@ -30,6 +30,7 @@ along with this program; if not, see . #include "../qcommon/sstring.h" #include #include +#include #include "snd_local.h" #include "cl_mp3.h" @@ -41,29 +42,25 @@ along with this program; if not, see . extern qboolean S_FileExists( const char *psFilename ); -#define sKEY_MUSICFILES "musicfiles" -#define sKEY_ENTRY "entry" -#define sKEY_EXIT "exit" -#define sKEY_MARKER "marker" -#define sKEY_TIME "time" -#define sKEY_NEXTFILE "nextfile" -#define sKEY_NEXTMARK "nextmark" -#define sKEY_LEVELMUSIC "levelmusic" -#define sKEY_EXPLORE "explore" -#define sKEY_ACTION "action" -#define sKEY_BOSS "boss" -#define sKEY_DEATH "death" -#define sKEY_USES "uses" -#define sKEY_USEBOSS "useboss" +#define sKEY_MUSICFILES CSTRING_VIEW( "musicfiles" ) +#define sKEY_ENTRY CSTRING_VIEW( "entry" ) +#define sKEY_EXIT CSTRING_VIEW( "exit" ) +#define sKEY_MARKER CSTRING_VIEW( "marker" ) +#define sKEY_TIME CSTRING_VIEW( "time" ) +#define sKEY_NEXTFILE CSTRING_VIEW( "nextfile" ) +#define sKEY_NEXTMARK CSTRING_VIEW( "nextmark" ) +#define sKEY_LEVELMUSIC CSTRING_VIEW( "levelmusic" ) +#define sKEY_EXPLORE CSTRING_VIEW( "explore" ) +#define sKEY_ACTION CSTRING_VIEW( "action" ) +#define sKEY_BOSS CSTRING_VIEW( "boss" ) +#define sKEY_DEATH CSTRING_VIEW( "death" ) +#define sKEY_USES CSTRING_VIEW( "uses" ) +#define sKEY_USEBOSS CSTRING_VIEW( "useboss" ) #define sKEY_PLACEHOLDER "placeholder" // ignore these #define sFILENAME_DMS "ext_data/dms.dat" - -#define MUSIC_PARSE_ERROR(_string) Music_Parse_Error(_string) // only use during parse, not run-time use, and bear in mid that data is zapped after error message, so exit any loops immediately -#define MUSIC_PARSE_WARNING(_string) Music_Parse_Warning(_string) - typedef struct { sstring_t sNextFile; @@ -113,22 +110,49 @@ void Music_Free(void) MusicData = NULL; } +namespace detail +{ + static void build_string( std::ostream& stream ) + { + } + + template< typename T, typename... Tail > + static void build_string( std::ostream& stream, const T& head, Tail... tail ) + { + stream << head; + build_string( stream, tail... ); + } +} + +template< typename... Tail > +static std::string build_string( Tail... tail ) +{ + std::ostringstream os; + detail::build_string( os, tail... ); + return os.str(); +} + // some sort of error in the music data... +// only use during parse, not run-time use, and bear in mid that data is zapped after error message, so exit any loops immediately // -static void Music_Parse_Error(const char *psError) +static void Music_Parse_Error( gsl::czstring filename, const std::string& error ) { - Com_Printf(S_COLOR_RED "Error parsing music data ( in \"%s\" ):\n%s\n",sFILENAME_DMS,psError); + std::string message = build_string( + S_COLOR_RED "Error parsing music data (in \"", filename, "\"):\n", + error , "\n" + ); + Com_Printf( "%s", message.c_str() ); MusicData->clear(); } // something to just mention if interested... // -static void Music_Parse_Warning(const char *psError) +static void Music_Parse_Warning( const std::string& error ) { extern cvar_t *s_debugdynamic; - if (s_debugdynamic && s_debugdynamic->integer) + if( s_debugdynamic && s_debugdynamic->integer ) { - Com_Printf(S_COLOR_YELLOW "%s", psError); + Com_Printf( S_COLOR_YELLOW "%s", error.c_str() ); } } @@ -180,225 +204,163 @@ const char *Music_BaseStateToString( MusicState_e eMusicState, qboolean bDebugPr return NULL; } -static qboolean Music_ParseMusic(CGenericParser2 &Parser, MusicData_t *MusicData, CGPGroup *pgMusicFiles, const char *psMusicName, const char *psMusicNameKey, MusicState_e eMusicState) +static sstring_t StringViewToSString( const gsl::cstring_view& view ) { - qboolean bReturn = qfalse; + std::size_t len = std::min< std::size_t >( view.size(), MAX_QPATH - 1 ); + return sstring_t( std::string( view.begin(), view.begin() + len ).c_str() ); +} + +static bool Music_ParseMusic( gsl::czstring filename, const CGenericParser2& Parser, MusicData_t* MusicData, const CGPGroup& pgMusicFiles, const gsl::cstring_view& psMusicName, const gsl::cstring_view& psMusicNameKey, MusicState_e eMusicState ) +{ + bool bReturn = false; MusicFile_t MusicFile; - CGPGroup *pgMusicFile = pgMusicFiles->FindSubGroup(psMusicName); - if (pgMusicFile) + const CGPGroup* pgMusicFile = pgMusicFiles.FindSubGroup( psMusicName ); + if( pgMusicFile ) { // read subgroups... // - qboolean bEntryFound = qfalse; - qboolean bExitFound = qfalse; + bool bEntryFound = false; + bool bExitFound = false; // // (read entry points first, so I can check exit points aren't too close in time) // - CGPGroup *pEntryGroup = pgMusicFile->FindSubGroup(sKEY_ENTRY); - if (pEntryGroup) + const CGPGroup* pEntryGroup = pgMusicFile->FindSubGroup( sKEY_ENTRY ); + if( pEntryGroup ) { // read entry points... // - for (CGPValue *pValue = pEntryGroup->GetPairs(); pValue; pValue = pValue->GetNext()) + for( auto& prop : pEntryGroup->GetProperties() ) { - const char *psKey = pValue->GetName(); - const char *psValue = pValue->GetTopValue(); - //if (!strncmp(psKey,sKEY_MARKER,strlen(sKEY_MARKER))) // for now, assume anything is a marker - { - MusicFile.MusicEntryTimes[psKey] = atof(psValue); - bEntryFound = qtrue; // harmless to keep setting - } + MusicFile.MusicEntryTimes[ StringViewToSString( prop.GetName() ) ] = Q::svtoi( prop.GetTopValue() ); + bEntryFound = true; } } - for (CGPGroup *pGroup = pgMusicFile->GetSubGroups(); pGroup; pGroup = pGroup->GetNext()) + for( auto& group : pgMusicFile->GetSubGroups() ) { - const char *psGroupName = pGroup->GetName(); + auto& groupName = group.GetName(); - if (!strcmp(psGroupName,sKEY_ENTRY)) + if( groupName == sKEY_ENTRY ) { // skip entry points, I've already read them in above // } - else - if (!strcmp(psGroupName,sKEY_EXIT)) + else if( groupName == sKEY_EXIT ) { int iThisExitPointIndex = MusicFile.MusicExitPoints.size(); // must eval this first, so unaffected by push_back etc // // read this set of exit points... // MusicExitPoint_t MusicExitPoint; - for (CGPValue *pValue = pGroup->GetPairs(); pValue; pValue = pValue->GetNext()) + for( auto& prop : group.GetProperties() ) { - const char *psKey = pValue->GetName(); - const char *psValue = pValue->GetTopValue(); + auto& key = prop.GetName(); + auto& value = prop.GetTopValue(); - if (!strcmp(psKey,sKEY_NEXTFILE)) + if( key == sKEY_NEXTFILE ) { - MusicExitPoint.sNextFile = psValue; - bExitFound = qtrue; // harmless to keep setting + MusicExitPoint.sNextFile = StringViewToSString( value ); + bExitFound = true; // harmless to keep setting } - else - if (!strcmp(psKey,sKEY_NEXTMARK)) + else if( key == sKEY_NEXTMARK ) { - MusicExitPoint.sNextMark = psValue; + MusicExitPoint.sNextMark = StringViewToSString( value ); } - else - if (!strncmp(psKey,sKEY_TIME,strlen(sKEY_TIME))) + else if( key == sKEY_TIME ) { MusicExitTime_t MusicExitTime; - MusicExitTime.fTime = atof(psValue); - MusicExitTime.iExitPoint= iThisExitPointIndex; + MusicExitTime.fTime = Q::svtof( value ); + MusicExitTime.iExitPoint = iThisExitPointIndex; // new check, don't keep this this exit point if it's within 1.5 seconds either way of an entry point... // - qboolean bTooCloseToEntryPoint = qfalse; - for (MusicEntryTimes_t::iterator itEntryTimes = MusicFile.MusicEntryTimes.begin(); itEntryTimes != MusicFile.MusicEntryTimes.end(); ++itEntryTimes) + bool bTooCloseToEntryPoint = false; + for( auto& item : MusicFile.MusicEntryTimes ) { - float fThisEntryTime = (*itEntryTimes).second; + float fThisEntryTime = item.second; - if (Q_fabs(fThisEntryTime - MusicExitTime.fTime) < 1.5f) + if( Q_fabs( fThisEntryTime - MusicExitTime.fTime ) < 1.5f ) { -// bTooCloseToEntryPoint = qtrue; // not sure about this, ignore for now + // bTooCloseToEntryPoint = true; // not sure about this, ignore for now break; } } - if (!bTooCloseToEntryPoint) + if( !bTooCloseToEntryPoint ) { - MusicFile.MusicExitTimes.push_back(MusicExitTime); + MusicFile.MusicExitTimes.push_back( MusicExitTime ); } } } - MusicFile.MusicExitPoints.push_back(MusicExitPoint); + MusicFile.MusicExitPoints.push_back( MusicExitPoint ); int iNumExitPoints = MusicFile.MusicExitPoints.size(); // error checking... // - switch (eMusicState) + switch( eMusicState ) { - case eBGRNDTRACK_EXPLORE: - if (iNumExitPoints > iMAX_EXPLORE_TRANSITIONS) - { - MUSIC_PARSE_ERROR( va("\"%s\" has > %d %s transitions defined!\n",psMusicName,iMAX_EXPLORE_TRANSITIONS,psMusicNameKey) ); - return qfalse; - } - break; + case eBGRNDTRACK_EXPLORE: + if( iNumExitPoints > iMAX_EXPLORE_TRANSITIONS ) + { + Music_Parse_Error( filename, build_string( "\"", psMusicName, "\" has > ", iMAX_EXPLORE_TRANSITIONS, " ", psMusicNameKey, " transitions defined!\n" ) ); + return false; + } + break; - case eBGRNDTRACK_ACTION: - if (iNumExitPoints > iMAX_ACTION_TRANSITIONS) - { - MUSIC_PARSE_ERROR( va("\"%s\" has > %d %s transitions defined!\n",psMusicName,iMAX_ACTION_TRANSITIONS,psMusicNameKey) ); - return qfalse; - } - break; + case eBGRNDTRACK_ACTION: + if( iNumExitPoints > iMAX_ACTION_TRANSITIONS ) + { + Music_Parse_Error( filename, build_string( "\"", psMusicName, "\" has > ", iMAX_ACTION_TRANSITIONS, " ", psMusicNameKey, " transitions defined!\n" ) ); + return false; + } + break; - case eBGRNDTRACK_BOSS: - case eBGRNDTRACK_DEATH: + case eBGRNDTRACK_BOSS: + case eBGRNDTRACK_DEATH: - MUSIC_PARSE_ERROR( va("\"%s\" has %s transitions defined, this is not allowed!\n",psMusicName,psMusicNameKey) ); - break; - default: - break; + Music_Parse_Error( filename, build_string( "\"", psMusicName, "\" has ", psMusicNameKey, " transitions defined, this is not allowed!\n" ) ); + return false; + default: + break; } } } // for now, assume everything was ok unless some obvious things are missing... // - bReturn = qtrue; + bReturn = true; - if (eMusicState != eBGRNDTRACK_BOSS && eMusicState != eBGRNDTRACK_DEATH) // boss & death pieces can omit entry/exit stuff + // boss & death pieces can omit entry/exit stuff + if( eMusicState != eBGRNDTRACK_BOSS && eMusicState != eBGRNDTRACK_DEATH ) { - if (!bEntryFound) + if( !bEntryFound ) { - MUSIC_PARSE_ERROR(va("Unable to find subgroup \"%s\" in group \"%s\"\n",sKEY_ENTRY,psMusicName)); - bReturn = qfalse; + Music_Parse_Error( filename, build_string( "Unable to find subgroup \"", sKEY_ENTRY, "\" in group \"", psMusicName, "\"\n" ) ); + bReturn = false; } - if (!bExitFound) + if( !bExitFound ) { - MUSIC_PARSE_ERROR(va("Unable to find subgroup \"%s\" in group \"%s\"\n",sKEY_EXIT,psMusicName)); - bReturn = qfalse; + Music_Parse_Error( filename, build_string( "Unable to find subgroup \"", sKEY_EXIT, "\" in group \"", psMusicName, "\"\n" ) ); + bReturn = false; } } } else { - MUSIC_PARSE_ERROR(va("Unable to find musicfiles entry \"%s\"\n",psMusicName)); + Music_Parse_Error( filename, build_string( "Unable to find musicfiles entry \"", psMusicName, "\"\n" ) ); } - if (bReturn) + if( bReturn ) { - MusicFile.sFileNameBase = psMusicName; - (*MusicData)[ psMusicNameKey ] = MusicFile; + MusicFile.sFileNameBase = StringViewToSString( psMusicName ); + ( *MusicData )[ StringViewToSString( psMusicNameKey ) ] = MusicFile; } return bReturn; } - - - -// I only need this because GP2 can't cope with trailing whitespace (for !@#$%^'s sake!!!!)... -// -// (output buffer will always be just '\n' seperated, regardless of possible "\r\n" pairs) -// -// (remember to Z_Free() the returned char * when done with it!!!) -// -static char *StripTrailingWhiteSpaceOnEveryLine(char *pText) -{ - std::string strNewText; - - while (*pText) - { - char sOneLine[1024]; // BTO: was 16k - - // find end of line... - // - size_t pos = 0; - while (pText[pos] != '\0' && pText[pos] != '\r' && (pos < sizeof(sOneLine)-1)) - { - pos++; - } - - strncpy(sOneLine, pText, pos); - sOneLine[pos]='\0'; - pText += pos; - while (*pText == '\n' || *pText == '\r') pText++; - - // trim trailing... - // - qboolean bTrimmed = qfalse; - do - { - bTrimmed = qfalse; - int iStrLen = strlen(sOneLine); - - if (iStrLen) - { - if (sOneLine[iStrLen-1] == '\t' || sOneLine[iStrLen-1] == ' ') - { - sOneLine[iStrLen-1] = '\0'; - bTrimmed = qtrue; - } - } - } - while (bTrimmed); - - strNewText += sOneLine; - strNewText += "\n"; - } - - char *pNewText = (char *) Z_Malloc( strlen(strNewText.c_str())+1, - TAG_TEMP_WORKSPACE, - qfalse); - strcpy(pNewText, strNewText.c_str()); - return pNewText; -} - - // called from SV_SpawnServer, but before map load and music start etc. // // This just initialises the Lucas music structs so the background music player can interrogate them... @@ -409,7 +371,7 @@ void Music_SetLevelName(const char *psLevelName) gsLevelNameFromServer = psLevelName; } -static qboolean Music_ParseLeveldata(const char *psLevelName) +static qboolean Music_ParseLeveldata( gsl::czstring psLevelName ) { qboolean bReturn = qfalse; @@ -436,192 +398,161 @@ static qboolean Music_ParseLeveldata(const char *psLevelName) gsLevelNameForCompare = sLevelName; // harmless to init here even if we fail to parse dms.dat file gsLevelNameForBossLoad = sLevelName; // harmless to init here even if we fail to parse dms.dat file - char *pText = NULL; - /*int iTotalBytesLoaded = */FS_ReadFile(sFILENAME_DMS, (void **)&pText ); - if (pText) + gsl::czstring filename = sFILENAME_DMS; + CGenericParser2 Parser; + if( !Parser.Parse( filename ) ) + { + Music_Parse_Error( filename, "Error using GP to parse file\n" ); + } + else { - char *psStrippedText = StripTrailingWhiteSpaceOnEveryLine(pText); - CGenericParser2 Parser; - const char *psDataPtr = psStrippedText; // because ptr gets advanced, so we supply a clone that GP can alter - if (Parser.Parse(&psDataPtr, true)) + const CGPGroup& pFileGroup = Parser.GetBaseParseGroup(); + const CGPGroup* pgMusicFiles = pFileGroup.FindSubGroup( sKEY_MUSICFILES ); + if( pgMusicFiles ) { - CGPGroup *pFileGroup = Parser.GetBaseParseGroup(); - if (pFileGroup) + const CGPGroup* pgLevelMusic = pFileGroup.FindSubGroup( sKEY_LEVELMUSIC ); + + if( !pgLevelMusic ) { - CGPGroup *pgMusicFiles = pFileGroup->FindSubGroup(sKEY_MUSICFILES); - if (pgMusicFiles) + Music_Parse_Error( filename, build_string( "Unable to find subgroup \"", sKEY_MUSICFILES, "\"\n" ) ); + } + else + { + const CGPGroup *pgThisLevelMusic = nullptr; + // + // check for new USE keyword... + // + int iSanityLimit = 0; + gsl::cstring_view searchName{ &sLevelName[ 0 ], &sLevelName[ strlen( &sLevelName[ 0 ] ) ] }; + + while( !searchName.empty() && iSanityLimit < 10 ) { - CGPGroup *pgLevelMusic = pFileGroup->FindSubGroup(sKEY_LEVELMUSIC); + gsLevelNameForLoad = StringViewToSString( searchName ); + gsLevelNameForBossLoad = gsLevelNameForLoad; + pgThisLevelMusic = pgLevelMusic->FindSubGroup( searchName ); - if (pgLevelMusic) + if( pgThisLevelMusic ) { - CGPGroup *pgThisLevelMusic = NULL; - // - // check for new USE keyword... - // - int iSanityLimit = 0; - sstring_t sSearchName(sLevelName); - - while (sSearchName.c_str()[0] && iSanityLimit < 10) + const CGPProperty* pValue = pgThisLevelMusic->FindProperty( sKEY_USES ); + if( pValue ) { - gsLevelNameForLoad = sSearchName; - gsLevelNameForBossLoad = sSearchName; - pgThisLevelMusic = pgLevelMusic->FindSubGroup(sSearchName.c_str()); - - if (pgThisLevelMusic) - { - CGPValue *pValue = pgThisLevelMusic->FindPair(sKEY_USES); - if (pValue) - { - // re-search using the USE param... - // - sSearchName = pValue->GetTopValue(); - iSanityLimit++; -// Com_DPrintf("Using \"%s\"\n",sSearchName.c_str()); - } - else - { - // no new USE keyword found... - // - sSearchName = ""; - } - } - else - { - // level entry not found... - // - break; - } + // re-search using the USE param... + // + searchName = pValue->GetTopValue(); + iSanityLimit++; + // Com_DPrintf("Using \"%s\"\n",sSearchName.c_str()); } - - // now go ahead and use the final music set we've decided on... - // - if (pgThisLevelMusic && iSanityLimit < 10) + else { - // these are optional fields, so see which ones we find... + // no new USE keyword found... // - const char *psName_Explore = NULL; - const char *psName_Action = NULL; - const char *psName_Boss = NULL; - //const char *psName_Death = NULL; - // - const char *psName_UseBoss = NULL; + searchName = {}; + } + } + else + { + // level entry not found... + // + break; + } + } - for (CGPValue *pValue = pgThisLevelMusic->GetPairs(); pValue; pValue = pValue->GetNext()) - { - const char *psKey = pValue->GetName(); - const char *psValue = pValue->GetTopValue(); + // now go ahead and use the final music set we've decided on... + // + if( pgThisLevelMusic && iSanityLimit < 10 ) + { + Music_Parse_Warning( build_string( "Unable to find entry for \"", sLevelName, "\" in \"", filename, "\"\n" ) ); + } + else + { + // these are optional fields, so see which ones we find... + // + gsl::cstring_view psName_Explore; + gsl::cstring_view psName_Action; + gsl::cstring_view psName_Boss; + gsl::cstring_view psName_UseBoss; - if (Q_stricmp(psValue,sKEY_PLACEHOLDER)) // ignore "placeholder" items - { - if (!Q_stricmp(psKey,sKEY_EXPLORE)) - { - psName_Explore = psValue; - } - else - if (!Q_stricmp(psKey,sKEY_ACTION)) - { - psName_Action = psValue; - } - else - if (!Q_stricmp(psKey,sKEY_USEBOSS)) - { - psName_UseBoss = psValue; - } - else - if (!Q_stricmp(psKey,sKEY_BOSS)) - { - psName_Boss = psValue; - } - /*else - if (!Q_stricmp(psKey,sKEY_DEATH)) - { - psName_Death = psValue; - }*/ - } - } + for( auto& prop : pgThisLevelMusic->GetProperties() ) + { + auto& key = prop.GetName(); + auto& value = prop.GetTopValue(); - bReturn = qtrue; // defualt to ON now, so I can turn it off if "useboss" fails + if( Q::stricmp( value, sKEY_PLACEHOLDER ) == Q::Ordering::EQ ) + { + // ignore "placeholder" items + continue; + } - if (psName_UseBoss) - { - CGPGroup *pgLevelMusicOfBoss = pgLevelMusic->FindSubGroup(psName_UseBoss); - if (pgLevelMusicOfBoss) - { - CGPValue *pValueBoss = pgLevelMusicOfBoss->FindPair(sKEY_BOSS); - if (pValueBoss) - { - psName_Boss = pValueBoss->GetTopValue(); - gsLevelNameForBossLoad = psName_UseBoss; - } - else - { - MUSIC_PARSE_ERROR(va("'useboss' \"%s\" has no \"boss\" entry!\n",psName_UseBoss)); - bReturn = qfalse; - } - } - else - { - MUSIC_PARSE_ERROR(va("Unable to find 'useboss' entry \"%s\"\n",psName_UseBoss)); - bReturn = qfalse; - } - } + if( Q::stricmp( key, sKEY_EXPLORE ) == Q::Ordering::EQ ) + { + psName_Explore = value; + } + else if( Q::stricmp( key, sKEY_ACTION ) == Q::Ordering::EQ ) + { + psName_Action = value; + } + else if( Q::stricmp( key, sKEY_USEBOSS ) == Q::Ordering::EQ ) + { + psName_UseBoss = value; + } + else if( Q::stricmp( key, sKEY_BOSS ) == Q::Ordering::EQ ) + { + psName_Boss = value; + } + } + bReturn = qtrue; // defualt to ON now, so I can turn it off if "useboss" fails - // done this way in case I want to conditionally pass any bools depending on music type... - // - if (bReturn && psName_Explore) - { - bReturn = Music_ParseMusic(Parser, MusicData, pgMusicFiles, psName_Explore, sKEY_EXPLORE, eBGRNDTRACK_EXPLORE); - } - if (bReturn && psName_Action) + if( !psName_UseBoss.empty() ) + { + const CGPGroup *pgLevelMusicOfBoss = pgLevelMusic->FindSubGroup( psName_UseBoss ); + if( !pgLevelMusicOfBoss ) + { + Music_Parse_Error( filename, build_string( "Unable to find 'useboss' entry \"", psName_UseBoss, "\"\n", psName_UseBoss ) ); + bReturn = qfalse; + } + else + { + const CGPProperty *pValueBoss = pgLevelMusicOfBoss->FindProperty( sKEY_BOSS ); + if( pValueBoss ) { - bReturn = Music_ParseMusic(Parser, MusicData, pgMusicFiles, psName_Action, sKEY_ACTION, eBGRNDTRACK_ACTION); + Music_Parse_Error( filename, build_string( "'useboss' \"", psName_UseBoss, "\" has no \"boss\" entry!\n" ) ); + bReturn = qfalse; } - if (bReturn && psName_Boss) + else { - bReturn = Music_ParseMusic(Parser, MusicData, pgMusicFiles, psName_Boss, sKEY_BOSS, eBGRNDTRACK_BOSS); + psName_Boss = pValueBoss->GetTopValue(); + gsLevelNameForBossLoad = StringViewToSString( psName_UseBoss ); } - if (bReturn /*&& psName_Death*/) // LAST MINUTE HACK!!, always force in some death music!!!! - { - //bReturn = Music_ParseMusic(Parser, MusicData, pgMusicFiles, psName_Death, sKEY_DEATH, eBGRNDTRACK_DEATH); - - MusicFile_t m; - m.sFileNameBase = "death_music"; - (*MusicData)[ sKEY_DEATH ] = m; - } - } - else - { - MUSIC_PARSE_WARNING(va("Unable to find entry for \"%s\" in \"%s\"\n",sLevelName,sFILENAME_DMS)); } } - else + + + // done this way in case I want to conditionally pass any bools depending on music type... + // + if( bReturn && psName_Explore ) { - MUSIC_PARSE_ERROR(va("Unable to find subgroup \"%s\"\n",sKEY_LEVELMUSIC)); + bReturn = Music_ParseMusic( filename, Parser, MusicData, *pgMusicFiles, psName_Explore, sKEY_EXPLORE, eBGRNDTRACK_EXPLORE ); + } + if( bReturn && psName_Action ) + { + bReturn = Music_ParseMusic( filename, Parser, MusicData, *pgMusicFiles, psName_Action, sKEY_ACTION, eBGRNDTRACK_ACTION ); + } + if( bReturn && psName_Boss ) + { + bReturn = Music_ParseMusic( filename, Parser, MusicData, *pgMusicFiles, psName_Boss, sKEY_BOSS, eBGRNDTRACK_BOSS ); + } + if( bReturn /*&& psName_Death*/ ) // LAST MINUTE HACK!!, always force in some death music!!!! + { + //bReturn = Music_ParseMusic(Parser, MusicData, pgMusicFiles, psName_Death, sKEY_DEATH, eBGRNDTRACK_DEATH); + + MusicFile_t m; + m.sFileNameBase = "death_music"; + ( *MusicData )[ "death" ] = m; } } - else - { - MUSIC_PARSE_ERROR(va("Unable to find subgroup \"%s\"\n",sKEY_MUSICFILES)); - } - } - else - { - MUSIC_PARSE_ERROR( "Error calling GP2.GetBaseParseGroup()\n" ); } } - else - { - MUSIC_PARSE_ERROR( "Error using GP to parse file\n" ); - } - - Z_Free(psStrippedText); - FS_FreeFile( pText ); - } - else - { - MUSIC_PARSE_ERROR( "Unable to even read main file\n" ); // file name specified in error message } if (bReturn) @@ -647,7 +578,7 @@ static qboolean Music_ParseLeveldata(const char *psLevelName) const char *psMusicFileName = Music_BuildFileName( MusicFile.sFileNameBase.c_str(), eMusicState ); if (!S_FileExists( psMusicFileName )) { - MUSIC_PARSE_ERROR(va("Music file \"%s\" not found!\n",psMusicFileName)); + Music_Parse_Error( filename, build_string( "Music file \"", psMusicFileName, "\" not found!\n" ) ); return qfalse; // have to return, because music data destroyed now } @@ -660,7 +591,7 @@ static qboolean Music_ParseLeveldata(const char *psLevelName) const char *psTransitionFileName = Music_BuildFileName( MusicExitPoint.sNextFile.c_str(), eMusicState ); if (!S_FileExists( psTransitionFileName )) { - MUSIC_PARSE_ERROR(va("Transition file \"%s\" (entry \"%s\" ) not found!\n",psTransitionFileName, MusicExitPoint.sNextFile.c_str())); + Music_Parse_Error( filename, build_string( "Transition file \"", psTransitionFileName, "\" (entry \"", MusicExitPoint.sNextFile.c_str(), "\" ) not found!\n" ) ); return qfalse; // have to return, because music data destroyed now } @@ -680,13 +611,13 @@ static qboolean Music_ParseLeveldata(const char *psLevelName) if (!MusicFile_Explore.MusicEntryTimes.count(psNextMark)) { - MUSIC_PARSE_ERROR( va("Unable to find entry point \"%s\" in description for \"%s\"\n",psNextMark,MusicFile_Explore.sFileNameBase.c_str()) ); + Music_Parse_Error( filename, build_string( "Unable to find entry point \"", psNextMark, "\" in description for \"", MusicFile_Explore.sFileNameBase.c_str(), "\"\n" ) ); return qfalse; // have to return, because music data destroyed now } } else { - MUSIC_PARSE_ERROR( va("Unable to find %s piece to match \"%s\"\n", Music_BaseStateToString(eBGRNDTRACK_EXPLORE), MusicFile.sFileNameBase.c_str() ) ); + Music_Parse_Error( filename, build_string( "Unable to find ", Music_BaseStateToString( eBGRNDTRACK_EXPLORE ), " piece to match \"", MusicFile.sFileNameBase.c_str(), "\"\n" ) ); return qfalse; // have to return, because music data destroyed now } } @@ -694,51 +625,6 @@ static qboolean Music_ParseLeveldata(const char *psLevelName) } } -#ifdef _DEBUG -/* - // dump the whole thing out to prove it was read in ok... - // - if (bReturn) - { - for (MusicData_t::iterator itMusicData = MusicData->begin(); itMusicData != MusicData->end(); ++itMusicData) - { - const char *psMusicState = (*itMusicData).first.c_str(); - MusicFile_t &MusicFile = (*itMusicData).second; - - OutputDebugString(va("Music State: \"%s\", File: \"%s\"\n",psMusicState, MusicFile.sFileNameBase.c_str())); - - // entry times... - // - for (MusicEntryTimes_t::iterator itEntryTimes = MusicFile.MusicEntryTimes.begin(); itEntryTimes != MusicFile.MusicEntryTimes.end(); ++itEntryTimes) - { - const char *psMarkerName = (*itEntryTimes).first.c_str(); - float fEntryTime = (*itEntryTimes).second; - - OutputDebugString(va("Entry time for \"%s\": %f\n", psMarkerName, fEntryTime)); - } - - // exit points... - // - for (int i=0; i. // Filename:- genericparser2.cpp #include "common_headers.h" +#include "genericparser2.h" #ifdef _JK2EXE #include "../qcommon/qcommon.h" #endif -#define MAX_TOKEN_SIZE 1024 -static char token[MAX_TOKEN_SIZE]; +#include +#include -static char *GetToken(const char **text, bool allowLineBreaks, bool readUntilEOL = false) -{ - const char *pointer = *text; - int length = 0; - int c = 0; - bool foundLineBreak; - token[0] = 0; - if (!pointer) +static void skipWhitespace( gsl::cstring_view& text, const bool allowLineBreaks ) +{ + gsl::cstring_view::iterator whitespaceEnd = text.begin(); + while( whitespaceEnd != text.end() // No EOF + && std::isspace( *whitespaceEnd ) // No End of Whitespace + && ( allowLineBreaks || *whitespaceEnd != '\n' ) ) // No unwanted newline { - return token; + ++whitespaceEnd; } + text = { whitespaceEnd, text.end() }; +} - while(1) +static void skipWhitespaceAndComments( gsl::cstring_view& text, const bool allowLineBreaks ) +{ + skipWhitespace( text, allowLineBreaks ); + // skip single line comment + if( text.size() >= 2 && text[ 0 ] == '/' && text[ 1 ] == '/' ) { - foundLineBreak = false; - while(1) - { - c = *pointer; - if (c > ' ') - { - break; - } - if (!c) - { - *text = 0; - return token; - } - if (c == '\n') - { - foundLineBreak = true; - } - pointer++; - } - if (foundLineBreak && !allowLineBreaks) - { - *text = pointer; - return token; - } - - c = *pointer; - - // skip single line comment - if (c == '/' && pointer[1] == '/') - { - pointer += 2; - while (*pointer && *pointer != '\n') - { - pointer++; - } - } - // skip multi line comments - else if (c == '/' && pointer[1] == '*') + auto commentEnd = std::find( text.begin() + 2, text.end(), '\n' ); + if( commentEnd == text.end() ) { - pointer += 2; - while (*pointer && (*pointer != '*' || pointer[1] != '/')) - { - pointer++; - } - if (*pointer) - { - pointer += 2; - } + text = { text.end(), text.end() }; + return; } else - { // found the start of a token - break; - } - } - - if (c == '\"') - { // handle a string - pointer++; - while (1) { - c = *pointer++; - if (c == '\"') - { -// token[length++] = c; - break; - } - else if (!c) - { - break; - } - else if (length < MAX_TOKEN_SIZE) - { - token[length++] = c; - } + text = { commentEnd, text.end() }; + skipWhitespaceAndComments( text, allowLineBreaks ); + return; } } - else if (readUntilEOL) - { - // absorb all characters until EOL - while(c != '\n' && c != '\r') - { - if (c == '/' && ((*(pointer+1)) == '/' || (*(pointer+1)) == '*')) - { - break; - } - if (length < MAX_TOKEN_SIZE) - { - token[length++] = c; - } - pointer++; - c = *pointer; - } - // remove trailing white space - while(length && token[length-1] < ' ') - { - length--; - } - } - else + // skip multi line comments + if( text.size() >= 2 && text[ 0 ] == '/' && text[ 1 ] == '*' ) { - while(c > ' ') + static const std::array< char, 2 > endStr{ '*', '/' }; + auto commentEnd = std::search( text.begin(), text.end(), endStr.begin(), endStr.end() ); + if( commentEnd == text.end() ) { - if (length < MAX_TOKEN_SIZE) - { - token[length++] = c; - } - pointer++; - c = *pointer; + text = { text.end(), text.end() }; + return; } - } - - if (token[0] == '\"') - { // remove start quote - length--; - memmove(token, token+1, length); - - if (length && token[length-1] == '\"') - { // remove end quote - length--; - } - } - - if (length >= MAX_TOKEN_SIZE) - { - length = 0; - } - token[length] = 0; - *text = (char *)pointer; - - return token; -} - - - - -CTextPool::CTextPool(int initSize) : - mNext(0), - mSize(initSize), - mUsed(0) -{ -#ifdef _EXE -// mPool = (char *)Z_Malloc(mSize, TAG_GP2); - mPool = (char *)Z_Malloc(mSize, TAG_TEXTPOOL, qtrue); -#else - mPool = (char *)trap_Z_Malloc(mSize, TAG_GP2); -#endif -} - -CTextPool::~CTextPool(void) -{ -#ifdef _EXE - Z_Free(mPool); -#else - trap_Z_Free(mPool); -#endif -} - -char *CTextPool::AllocText(const char *text, bool addNULL, CTextPool **poolPtr) -{ - int length = strlen(text) + (addNULL ? 1 : 0); - - if (mUsed + length + 1> mSize) - { // extra 1 to put a null on the end - if (poolPtr) + else { - (*poolPtr)->SetNext(new CTextPool(mSize)); - *poolPtr = (*poolPtr)->GetNext(); - - return (*poolPtr)->AllocText(text, addNULL); + text = { commentEnd + endStr.size(), text.end() }; + skipWhitespace( text, allowLineBreaks ); + return; } - - return 0; - } - - strcpy(mPool + mUsed, text); - mUsed += length; - mPool[mUsed] = 0; - - return mPool + mUsed - length; -} - -void CleanTextPool(CTextPool *pool) -{ - CTextPool *next; - - while(pool) - { - next = pool->GetNext(); - delete pool; - pool = next; } -} - - - - - - -CGPObject::CGPObject(const char *initName) : - mName(initName), - mNext(0), - mInOrderNext(0), - mInOrderPrevious(0) -{ + // found start of token + return; } -bool CGPObject::WriteText(CTextPool **textPool, const char *text) +static gsl::cstring_view removeTrailingWhitespace( const gsl::cstring_view& text ) { - if (strchr(text, ' ') || !text[0]) - { - (*textPool)->AllocText("\"", false, textPool); - (*textPool)->AllocText((char *)text, false, textPool); - (*textPool)->AllocText("\"", false, textPool); - } - else - { - (*textPool)->AllocText((char *)text, false, textPool); - } - - return true; + return{ + text.begin(), + std::find_if_not( + std::reverse_iterator< const char *>( text.end() ), std::reverse_iterator< const char* >( text.begin() ), + std::isspace + ).base() + }; } - - - - - - - - - - - - - -CGPValue::CGPValue(const char *initName, const char *initValue) : - CGPObject(initName), - mList(0) -{ - if (initValue) - { - AddValue(initValue); - } -} - -CGPValue::~CGPValue(void) -{ - CGPObject *next; - - while(mList) - { - next = mList->GetNext(); - delete mList; - mList = next; - } -} - -CGPValue *CGPValue::Duplicate(CTextPool **textPool) +/** +Skips whitespace (including lineBreaks, if desired) & comments, then reads one token. +A token can be: +- a string ("" delimited; ignores readToEOL) +- whitespace-delimited (if readToEOL == false) +- EOL- or comment-delimited (if readToEOL == true); i.e. reads to end of line or the first // or /* +@param text adjusted to start beyond the read token +*/ +static gsl::cstring_view GetToken( gsl::cstring_view& text, bool allowLineBreaks, bool readToEOL = false ) { - CGPValue *newValue; - CGPObject *iterator; - char *name; - - if (textPool) + skipWhitespaceAndComments( text, allowLineBreaks ); + // EOF + if( text.empty() ) { - name = (*textPool)->AllocText((char *)mName, true, textPool); + return{}; } - else + // string. ignores readToEOL. + if( text[ 0 ] == '"' ) { - name = (char *)mName; - } - - newValue = new CGPValue(name); - iterator = mList; - while(iterator) - { - if (textPool) + // there are no escapes, string just ends at the next " + auto tokenEnd = std::find( text.begin() + 1, text.end(), '"' ); + if( tokenEnd == text.end() ) { - name = (*textPool)->AllocText((char *)iterator->GetName(), true, textPool); + gsl::cstring_view token = { text.begin() + 1, text.end() }; + text = { text.end(), text.end() }; + return token; } else { - name = (char *)iterator->GetName(); + gsl::cstring_view token = { text.begin() + 1, tokenEnd }; + text = { tokenEnd + 1, text.end() }; + return token; } - newValue->AddValue(name); - iterator = iterator->GetNext(); } - - return newValue; -} - -bool CGPValue::IsList(void) -{ - if (!mList || !mList->GetNext()) - { - return false; - } - - return true; -} - -const char *CGPValue::GetTopValue(void) -{ - if (mList) - { - return mList->GetName(); - } - - return 0; -} - -void CGPValue::AddValue(const char *newValue, CTextPool **textPool) -{ - if (textPool) - { - newValue = (*textPool)->AllocText((char *)newValue, true, textPool); - } - - if (mList == 0) + else if( readToEOL ) { - mList = new CGPObject(newValue); - mList->SetInOrderNext(mList); + // find the first of '\n', "//" or "/*"; that's end of token + auto tokenEnd = std::find( text.begin(), text.end(), '\n' ); + static const std::array< char, 2 > commentPatterns[]{ + { '/', '*' }, + { '/', '/' } + }; + for( auto& pattern : commentPatterns ) + { + tokenEnd = std::min( + tokenEnd, + std::search( + text.begin(), tokenEnd, + pattern.begin(), pattern.end() + ) + ); + } + gsl::cstring_view token{ text.begin(), tokenEnd }; + text = { tokenEnd, text.end() }; + return removeTrailingWhitespace( token ); } else { - mList->GetInOrderNext()->SetNext(new CGPObject(newValue)); - mList->SetInOrderNext(mList->GetInOrderNext()->GetNext()); + // consume until first whitespace (if allowLineBreaks == false, that may be text.begin(); in that case token is empty.) + auto tokenEnd = std::find_if( text.begin(), text.end(), std::isspace ); + gsl::cstring_view token{ text.begin(), tokenEnd }; + text = { tokenEnd, text.end() }; + return token; } } -bool CGPValue::Parse(const char **dataPtr, CTextPool **textPool) -{ - char *token; - char *value; - - while(1) - { - token = GetToken(dataPtr, true, true); - if (!token[0]) - { // end of data - error! - return false; - } - else if (Q_stricmp(token, "]") == 0) - { // ending brace for this list - break; - } - value = (*textPool)->AllocText(token, true, textPool); - AddValue(value); - } - return true; -} -bool CGPValue::Write(CTextPool **textPool, int depth) +CGPProperty::CGPProperty( gsl::cstring_view initKey, gsl::cstring_view initValue ) + : mKey( initKey ) { - int i; - CGPObject *next; - - if (!mList) + if( !initValue.empty() ) { - return true; + mValues.push_back( initValue ); } - - for(i=0;iAllocText("\t", false, textPool); - } - - WriteText(textPool, mName); - - if (!mList->GetNext()) - { - (*textPool)->AllocText("\t\t", false, textPool); - mList->WriteText(textPool, mList->GetName()); - (*textPool)->AllocText("\r\n", false, textPool); - } - else - { - (*textPool)->AllocText("\r\n", false, textPool); - - for(i=0;iAllocText("\t", false, textPool); - } - (*textPool)->AllocText("[\r\n", false, textPool); - - next = mList; - while(next) - { - for(i=0;iAllocText("\t", false, textPool); - } - mList->WriteText(textPool, next->GetName()); - (*textPool)->AllocText("\r\n", false, textPool); - - next = next->GetNext(); - } - - for(i=0;iAllocText("\t", false, textPool); - } - (*textPool)->AllocText("]\r\n", false, textPool); - } - - return true; } - - - - - - - - - - - - - - - -CGPGroup::CGPGroup(const char *initName, CGPGroup *initParent) : - CGPObject(initName), - mPairs(0), - mInOrderPairs(0), - mCurrentPair(0), - mSubGroups(0), - mInOrderSubGroups(0), - mCurrentSubGroup(0), - mParent(initParent) +void CGPProperty::AddValue( gsl::cstring_view newValue ) { + mValues.push_back( newValue ); } -CGPGroup::~CGPGroup(void) -{ - Clean(); -} -int CGPGroup::GetNumSubGroups(void) -{ - int count; - CGPGroup *group; - count = 0; - group = mSubGroups; - while(group) - { - count++; - group = (CGPGroup *)group->GetNext(); - } - return(count); -} -int CGPGroup::GetNumPairs(void) -{ - int count; - CGPValue *pair; - count = 0; - pair = mPairs; - while(pair) - { - count++; - pair = (CGPValue *)pair->GetNext(); - } - return(count); -} -void CGPGroup::Clean(void) -{ - while(mPairs) - { - mCurrentPair = (CGPValue *)mPairs->GetNext(); - delete mPairs; - mPairs = mCurrentPair; - } - while(mSubGroups) - { - mCurrentSubGroup = (CGPGroup *)mSubGroups->GetNext(); - delete mSubGroups; - mSubGroups = mCurrentSubGroup; - } - mPairs = mInOrderPairs = mCurrentPair = 0; - mSubGroups = mInOrderSubGroups = mCurrentSubGroup = 0; - mParent = 0; -} -CGPGroup *CGPGroup::Duplicate(CTextPool **textPool, CGPGroup *initParent) -{ - CGPGroup *newGroup, *subSub, *newSub; - CGPValue *newPair, *subPair; - char *name; - if (textPool) - { - name = (*textPool)->AllocText((char *)mName, true, textPool); - } - else - { - name = (char *)mName; - } - - newGroup = new CGPGroup(name); - - subSub = mSubGroups; - while(subSub) - { - newSub = subSub->Duplicate(textPool, newGroup); - newGroup->AddGroup(newSub); - subSub = (CGPGroup *)subSub->GetNext(); - } - - subPair = mPairs; - while(subPair) - { - newPair = subPair->Duplicate(textPool); - newGroup->AddPair(newPair); - subPair = (CGPValue *)subPair->GetNext(); - } - return newGroup; -} -void CGPGroup::SortObject(CGPObject *object, CGPObject **unsortedList, CGPObject **sortedList, - CGPObject **lastObject) +CGPGroup::CGPGroup( const gsl::cstring_view& initName ) + : mName( initName ) { - CGPObject *test, *last; - - if (!*unsortedList) - { - *unsortedList = *sortedList = object; - } - else - { - (*lastObject)->SetNext(object); - - test = *sortedList; - last = 0; - while(test) - { - if (Q_stricmp(object->GetName(), test->GetName()) < 0) - { - break; - } - - last = test; - test = test->GetInOrderNext(); - } - - if (test) - { - test->SetInOrderPrevious(object); - object->SetInOrderNext(test); - } - if (last) - { - last->SetInOrderNext(object); - object->SetInOrderPrevious(last); - } - else - { - *sortedList = object; - } - } - - *lastObject = object; } -CGPValue *CGPGroup::AddPair(const char *name, const char *value, CTextPool **textPool) +bool CGPGroup::Parse( gsl::cstring_view& data, const bool topLevel ) { - CGPValue *newPair; - - if (textPool) + while( true ) { - name = (*textPool)->AllocText((char *)name, true, textPool); - if (value) - { - value = (*textPool)->AllocText((char *)value, true, textPool); - } - } - - newPair = new CGPValue(name, value); - - AddPair(newPair); - - return newPair; -} + gsl::cstring_view token = GetToken( data, true ); -void CGPGroup::AddPair(CGPValue *NewPair) -{ - SortObject(NewPair, (CGPObject **)&mPairs, (CGPObject **)&mInOrderPairs, - (CGPObject **)&mCurrentPair); -} - -CGPGroup *CGPGroup::AddGroup(const char *name, CTextPool **textPool) -{ - CGPGroup *newGroup; - - if (textPool) - { - name = (*textPool)->AllocText((char *)name, true, textPool); - } - - newGroup = new CGPGroup(name); - - AddGroup(newGroup); - - return newGroup; -} - -void CGPGroup::AddGroup(CGPGroup *NewGroup) -{ - SortObject(NewGroup, (CGPObject **)&mSubGroups, (CGPObject **)&mInOrderSubGroups, - (CGPObject **)&mCurrentSubGroup); -} - -CGPGroup *CGPGroup::FindSubGroup(const char *name) -{ - CGPGroup *group; - - group = mSubGroups; - while(group) - { - if(!Q_stricmp(name, group->GetName())) - { - return(group); - } - group = (CGPGroup *)group->GetNext(); - } - return(NULL); -} - -bool CGPGroup::Parse(const char **dataPtr, CTextPool **textPool) -{ - char *token; - char lastToken[MAX_TOKEN_SIZE]; - CGPGroup *newSubGroup; - CGPValue *newPair; - - while(1) - { - token = GetToken(dataPtr, true); - - if (!token[0]) + if( token.empty() ) { - if (mParent) + if ( topLevel ) { - // end of data - error! - return false; + // top level parse; there was no opening "{", so there should be no closing one either. + return true; } else { - // top level parse; there was no opening "{", so there should be no closing one either. - return true; + // end of data - error! + return false; } } - else if (Q_stricmp(token, "}") == 0) + else if( token == CSTRING_VIEW( "}" ) ) { - if( mParent ) + if( topLevel ) { - // ending brace for this group - return true; + // top-level group; there was no opening "{" so there should be no closing one, either. + return false; } else { - // top-level group; there was no opening "{" so there should be no closing one, either. - return false; + // ending brace for this group + return true; } } - - strcpy(lastToken, token); + gsl::cstring_view lastToken = token; // read ahead to see what we are doing - token = GetToken(dataPtr, true, true); - if (Q_stricmp(token, "{") == 0) - { // new sub group - newSubGroup = AddGroup(lastToken, textPool); - if (!newSubGroup->Parse(dataPtr, textPool)) + token = GetToken( data, true, true ); + if( token == CSTRING_VIEW( "{" ) ) + { + // new sub group + mSubGroups.emplace_back( lastToken ); + if( !mSubGroups.back().Parse( data, false ) ) { return false; } } - else if (Q_stricmp(token, "[") == 0) - { // new pair list - newPair = AddPair(lastToken, 0, textPool); - if (!newPair->Parse(dataPtr, textPool)) + else if( token == CSTRING_VIEW( "[" ) ) + { + // new list + mProperties.emplace_back( lastToken ); + CGPProperty& list = mProperties.back(); + while( true ) { - return false; + token = GetToken( data, true, true ); + if( token.empty() ) + { + return false; + } + if( token == CSTRING_VIEW( "]" ) ) + { + break; + } + list.AddValue( token ); } } else - { // new pair - AddPair(lastToken, token, textPool); - } - } -} - -bool CGPGroup::Write(CTextPool **textPool, int depth) -{ - int i; - CGPValue *mPair = mPairs; - CGPGroup *mSubGroup = mSubGroups; - - if (depth >= 0) - { - for(i=0;iAllocText("\t", false, textPool); + // new value + mProperties.emplace_back( lastToken, token ); } - WriteText(textPool, mName); - (*textPool)->AllocText("\r\n", false, textPool); - - for(i=0;iAllocText("\t", false, textPool); - } - (*textPool)->AllocText("{\r\n", false, textPool); - } - - while(mPair) - { - mPair->Write(textPool, depth+1); - mPair = (CGPValue *)mPair->GetNext(); - } - - while(mSubGroup) - { - mSubGroup->Write(textPool, depth+1); - mSubGroup = (CGPGroup *)mSubGroup->GetNext(); - } - - if (depth >= 0) - { - for(i=0;iAllocText("\t", false, textPool); - } - (*textPool)->AllocText("}\r\n", false, textPool); - } - - return true; -} - -CGPValue *CGPGroup::FindPair(const char *key) -{ - CGPValue *pair = mPairs; - - while(pair) - { - if (Q_stricmp(pair->GetName(), key) == 0) - { - return pair; - } - - pair = pair->GetNext(); - } - - return 0; -} - -const char *CGPGroup::FindPairValue(const char *key, const char *defaultVal) -{ - CGPValue *pair = FindPair(key); - - if (pair) - { - return pair->GetTopValue(); - } - - return defaultVal; -} - - - - - - - - - - - - - - - -CGenericParser2::CGenericParser2(void) : - mTextPool(0) -{ -} - -CGenericParser2::~CGenericParser2(void) -{ - Clean(); -} - -bool CGenericParser2::Parse(const char **dataPtr, bool cleanFirst) -{ - CTextPool *topPool; - - if (cleanFirst) - { - Clean(); - } - - if (!mTextPool) - { - mTextPool = new CTextPool; - } - - topPool = mTextPool; - bool ret = mTopLevel.Parse(dataPtr, &topPool); - return ret; -} - -void CGenericParser2::Clean(void) -{ - mTopLevel.Clean(); - - CleanTextPool(mTextPool); - mTextPool = 0; -} - -bool CGenericParser2::Write(CTextPool *textPool) -{ - return mTopLevel.Write(&textPool, -1); -} - - - - - - - - - -// The following groups of routines are used for a C interface into GP2. -// C++ users should just use the objects as normally and not call these routines below -// -// CGenericParser2 (void *) routines -TGenericParser2 GP_Parse(const char **dataPtr, bool cleanFirst) -{ - CGenericParser2 *parse; - - parse = new CGenericParser2; - if (parse->Parse(dataPtr, cleanFirst)) - { - return parse; } - - delete parse; - return 0; } -void GP_Clean(TGenericParser2 GP2) -{ - if (!GP2) - { - return; - } - ((CGenericParser2 *)GP2)->Clean(); -} -void GP_Delete(TGenericParser2 *GP2) -{ - if (!GP2 || !(*GP2)) - { - return; - } - delete ((CGenericParser2 *)(*GP2)); - (*GP2) = 0; -} -TGPGroup GP_GetBaseParseGroup(TGenericParser2 GP2) -{ - if (!GP2) - { - return 0; - } - return ((CGenericParser2 *)GP2)->GetBaseParseGroup(); -} -// CGPGroup (void *) routines -const char *GPG_GetName(TGPGroup GPG) -{ - if (!GPG) - { - return ""; - } - return ((CGPGroup *)GPG)->GetName(); -} -TGPGroup GPG_GetNext(TGPGroup GPG) -{ - if (!GPG) - { - return 0; - } - return ((CGPGroup *)GPG)->GetNext(); -} - -TGPGroup GPG_GetInOrderNext(TGPGroup GPG) -{ - if (!GPG) - { - return 0; - } - - return ((CGPGroup *)GPG)->GetInOrderNext(); -} - -TGPGroup GPG_GetInOrderPrevious(TGPGroup GPG) -{ - if (!GPG) - { - return 0; - } - - return ((CGPGroup *)GPG)->GetInOrderPrevious(); -} - -TGPGroup GPG_GetPairs(TGPGroup GPG) -{ - if (!GPG) - { - return 0; - } - - return ((CGPGroup *)GPG)->GetPairs(); -} - -TGPGroup GPG_GetInOrderPairs(TGPGroup GPG) -{ - if (!GPG) - { - return 0; - } - - return ((CGPGroup *)GPG)->GetInOrderPairs(); -} - -TGPGroup GPG_GetSubGroups(TGPGroup GPG) -{ - if (!GPG) - { - return 0; - } - - return ((CGPGroup *)GPG)->GetSubGroups(); -} -TGPGroup GPG_GetInOrderSubGroups(TGPGroup GPG) +bool CGenericParser2::Parse( gsl::czstring filename ) { - if (!GPG) + Clear(); + mFileContent = FS::ReadFile( filename ); + if( !mFileContent.valid() ) { - return 0; - } - - return ((CGPGroup *)GPG)->GetInOrderSubGroups(); -} - -TGPGroup GPG_FindSubGroup(TGPGroup GPG, const char *name) -{ - if (!GPG) - { - return 0; - } - - return ((CGPGroup *)GPG)->FindSubGroup(name); -} - -TGPValue GPG_FindPair(TGPGroup GPG, const char *key) -{ - if (!GPG) - { - return 0; - } - - return ((CGPGroup *)GPG)->FindPair(key); -} - -const char *GPG_FindPairValue(TGPGroup GPG, const char *key, const char *defaultVal) -{ - if (!GPG) - { - return defaultVal; - } - - return ((CGPGroup *)GPG)->FindPairValue(key, defaultVal); -} - - - - -// CGPValue (void *) routines -const char *GPV_GetName(TGPValue GPV) -{ - if (!GPV) - { - return ""; - } - - return ((CGPValue *)GPV)->GetName(); -} - -TGPValue GPV_GetNext(TGPValue GPV) -{ - if (!GPV) - { - return 0; - } - - return ((CGPValue *)GPV)->GetNext(); -} - -TGPValue GPV_GetInOrderNext(TGPValue GPV) -{ - if (!GPV) - { - return 0; - } - - return ((CGPValue *)GPV)->GetInOrderNext(); -} - -TGPValue GPV_GetInOrderPrevious(TGPValue GPV) -{ - if (!GPV) - { - return 0; - } - - return ((CGPValue *)GPV)->GetInOrderPrevious(); -} - -bool GPV_IsList(TGPValue GPV) -{ - if (!GPV) - { - return 0; - } - - return ((CGPValue *)GPV)->IsList(); -} - -const char *GPV_GetTopValue(TGPValue GPV) -{ - if (!GPV) - { - return ""; + return false; } - - return ((CGPValue *)GPV)->GetTopValue(); + return mTopLevel.Parse( mFileContent.view() ); } -TGPValue GPV_GetList(TGPValue GPV) +void CGenericParser2::Clear() NOEXCEPT { - if (!GPV) - { - return 0; - } - - return ((CGPValue *)GPV)->GetList(); + mTopLevel.Clear(); } diff --git a/code/game/genericparser2.h b/code/game/genericparser2.h index d2e208e653..1ebbb3238f 100644 --- a/code/game/genericparser2.h +++ b/code/game/genericparser2.h @@ -22,202 +22,146 @@ along with this program; if not, see . // Filename:- genericparser2.h -#ifndef GENERICPARSER2_H -#define GENERICPARSER2_H - -// conditional expression is constant -// conversion from int to char, possible loss of data -// unreferenced inline funciton has been removed -#ifdef _MSC_VER -#ifdef DEBUG_LINKING - #pragma message("...including GenericParser2.h") -#endif -#endif - -#ifdef _JK2EXE -#define trap_Z_Malloc(x, y) Z_Malloc(x,y,qtrue) -#define trap_Z_Free(x) Z_Free(x) -#else -#define trap_Z_Malloc(x, y) gi.Malloc(x,y,qtrue) -#define trap_Z_Free(x) gi.Free(x) -#endif +#include +#include +#include +#include +#include "qcommon/safe/gsl.h" +#include "qcommon/safe/memory.h" +#include "qcommon/safe/files.h" +#include "qcommon/safe/string.h" -class CTextPool; -class CGPObject; +#ifndef GENERICPARSER2_H +#define GENERICPARSER2_H -class CTextPool +namespace GP2 { -private: - char *mPool; - CTextPool *mNext; - int mSize, mUsed; + template< typename T > + using Vector = std::vector< T, Zone::Allocator< T, TAG_GP2 > >; +} -public: - CTextPool(int initSize = 10240); - ~CTextPool(void); - - CTextPool *GetNext(void) { return mNext; } - void SetNext(CTextPool *which) { mNext = which; } - char *GetPool(void) { return mPool; } - int GetUsed(void) { return mUsed; } - - char *AllocText(const char *text, bool addNULL = true, CTextPool **poolPtr = 0); -}; - -void CleanTextPool(CTextPool *pool); - -class CGPObject +class CGPProperty { -protected: - const char *mName; - CGPObject *mNext, *mInOrderNext, *mInOrderPrevious; - public: - CGPObject(const char *initName); - virtual ~CGPObject() {} - - const char *GetName(void) { return mName; } - - CGPObject *GetNext(void) { return mNext; } - void SetNext(CGPObject *which) { mNext = which; } - CGPObject *GetInOrderNext(void) { return mInOrderNext; } - void SetInOrderNext(CGPObject *which) { mInOrderNext = which; } - CGPObject *GetInOrderPrevious(void) { return mInOrderPrevious; } - void SetInOrderPrevious(CGPObject *which) { mInOrderPrevious = which; } - - bool WriteText(CTextPool **textPool, const char *text); -}; - - - -class CGPValue : public CGPObject -{ + using Values = GP2::Vector< gsl::cstring_view >; private: - CGPObject *mList; - -public: - CGPValue(const char *initName, const char *initValue = 0); - ~CGPValue(void); - - CGPValue *GetNext(void) { return (CGPValue *)mNext; } + gsl::cstring_view mKey; + Values mValues; - CGPValue *Duplicate(CTextPool **textPool = 0); - bool IsList(void); - const char *GetTopValue(void); - CGPObject *GetList(void) { return mList; } - void AddValue(const char *newValue, CTextPool **textPool = 0); +public: - bool Parse(char **dataPtr, CTextPool **textPool); + CGPProperty( gsl::cstring_view initKey, gsl::cstring_view initValue = {} ); - bool Write(CTextPool **textPool, int depth); + gsl::cstring_view GetName() const { return mKey; } + bool IsList() const NOEXCEPT + { + return mValues.size() > 1; + } + gsl::cstring_view GetTopValue() const NOEXCEPT + { + return mValues.empty() ? gsl::cstring_view{} : mValues.front(); + } + const Values& GetValues() const NOEXCEPT + { + return mValues; + } + // Copies the value into the textPool and adds a pointer to that copy to the end of the list. + void AddValue( gsl::cstring_view newValue ); }; -class CGPGroup : public CGPObject +class CGPGroup { +public: + /// Key-Value-Pairs + using Properties = GP2::Vector< CGPProperty >; + using SubGroups = GP2::Vector< CGPGroup >; private: - CGPValue *mPairs, *mInOrderPairs; - CGPValue *mCurrentPair; - CGPGroup *mSubGroups, *mInOrderSubGroups; - CGPGroup *mCurrentSubGroup; - CGPGroup *mParent; - - void SortObject(CGPObject *object, CGPObject **unsortedList, CGPObject **sortedList, - CGPObject **lastObject); - + Properties mProperties; + gsl::cstring_view mName = CSTRING_VIEW( "Top Level" ); + SubGroups mSubGroups; public: - CGPGroup(const char *initName = "Top Level", CGPGroup *initParent = 0); - ~CGPGroup(void); - - CGPGroup *GetParent(void) { return mParent; } - CGPGroup *GetNext(void) { return (CGPGroup *)mNext; } - int GetNumSubGroups(void); - int GetNumPairs(void); - - void Clean(void); - CGPGroup *Duplicate(CTextPool **textPool = 0, CGPGroup *initParent = 0); - - CGPValue *GetPairs(void) { return mPairs; } - CGPValue *GetInOrderPairs(void) { return mInOrderPairs; } - CGPGroup *GetSubGroups(void) { return mSubGroups; } - CGPGroup *GetInOrderSubGroups(void) { return mInOrderSubGroups; } - - CGPValue *AddPair(const char *name, const char *value, CTextPool **textPool = 0); - void AddPair(CGPValue *NewPair); - CGPGroup *AddGroup(const char *name, CTextPool **textPool = 0); - void AddGroup(CGPGroup *NewGroup); - CGPGroup *FindSubGroup(const char *name); - bool Parse(const char **dataPtr, CTextPool **textPool); - bool Write(CTextPool **textPool, int depth); - - CGPValue *FindPair(const char *key); - const char *FindPairValue(const char *key, const char *defaultVal = 0); + CGPGroup() = default; + CGPGroup( const gsl::cstring_view& initName ); + // non-copyable; but just for performance reasons, since it would incur a deep copy. + CGPGroup( const CGPGroup& ) = delete; + CGPGroup& operator=( const CGPGroup& ) = delete; + // movable + CGPGroup( CGPGroup&& ) = default; + CGPGroup& operator=( CGPGroup&& ) = default; + + const Properties& GetProperties() const NOEXCEPT + { + return mProperties; + } + const SubGroups& GetSubGroups() const NOEXCEPT + { + return mSubGroups; + } + const CGPGroup* FindSubGroup( const gsl::cstring_view& name ) const NOEXCEPT + { + for( auto& sub : GetSubGroups() ) + { + if( Q::stricmp( name, sub.GetName() ) == Q::Ordering::EQ ) + { + return ⊂ + } + } + return nullptr; + } + const CGPProperty* FindProperty( const gsl::cstring_view& name ) const NOEXCEPT + { + for( auto& prop : GetProperties() ) + { + if( Q::stricmp( name, prop.GetName() ) == Q::Ordering::EQ ) + { + return ∝ + } + } + return nullptr; + } + const gsl::cstring_view& GetName() const NOEXCEPT + { + return mName; + } + void Clear() NOEXCEPT + { + // name is retained + mProperties.clear(); + mSubGroups.clear(); + } + bool Parse( gsl::cstring_view& data, const bool topLevel = true ); }; +/** +Generic Text Parser. + +Used to parse effect files and the dynamic music system files. Parses blocks of the form `name { \n ... \n }`; blocks can contain other blocks or properties of the form `key value`. Value can also be a list; in that case the format is `key [\n value1 \n value2\n]`. Mind the separating newlines, values are actually newline-delimited. +*/ class CGenericParser2 { private: - CGPGroup mTopLevel; - CTextPool *mTextPool; + CGPGroup mTopLevel; + FS::FileBuffer mFileContent; public: - CGenericParser2(void); - ~CGenericParser2(void); - CGPGroup *GetBaseParseGroup(void) { return &mTopLevel; } - - bool Parse(const char **dataPtr, bool cleanFirst = true); - bool Parse(const char *dataPtr, bool cleanFirst = true) + const CGPGroup& GetBaseParseGroup() { - return Parse(&dataPtr, cleanFirst); + return mTopLevel; } - void Clean(void); - bool Write(CTextPool *textPool); + bool Parse( gsl::czstring filename ); + void Clear() NOEXCEPT; + bool ValidFile() const NOEXCEPT + { + return mFileContent.valid(); + } }; - - -// The following groups of routines are used for a C interface into GP2. -// C++ users should just use the objects as normally and not call these routines below -// - -typedef void *TGenericParser2; -typedef void *TGPGroup; -typedef void *TGPValue; - -// CGenericParser2 (void *) routines -TGenericParser2 GP_Parse(const char **dataPtr, bool cleanFirst); -void GP_Clean(TGenericParser2 GP2); -void GP_Delete(TGenericParser2 *GP2); -TGPGroup GP_GetBaseParseGroup(TGenericParser2 GP2); - -// CGPGroup (void *) routines -const char *GPG_GetName(TGPGroup GPG); -TGPGroup GPG_GetNext(TGPGroup GPG); -TGPGroup GPG_GetInOrderNext(TGPGroup GPG); -TGPGroup GPG_GetInOrderPrevious(TGPGroup GPG); -TGPGroup GPG_GetPairs(TGPGroup GPG); -TGPGroup GPG_GetInOrderPairs(TGPGroup GPG); -TGPGroup GPG_GetSubGroups(TGPGroup GPG); -TGPGroup GPG_GetInOrderSubGroups(TGPGroup GPG); -TGPGroup GPG_FindSubGroup(TGPGroup GPG, const char *name); -TGPValue GPG_FindPair(TGPGroup GPG, const char *key); -const char *GPG_FindPairValue(TGPGroup GPG, const char *key, const char *defaultVal); - -// CGPValue (void *) routines -const char *GPV_GetName(TGPValue GPV); -TGPValue GPV_GetNext(TGPValue GPV); -TGPValue GPV_GetInOrderNext(TGPValue GPV); -TGPValue GPV_GetInOrderPrevious(TGPValue GPV); -bool GPV_IsList(TGPValue GPV); -const char *GPV_GetTopValue(TGPValue GPV); -TGPValue GPV_GetList(TGPValue GPV); - - #endif // #ifndef GENERICPARSER2_H diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index d09da44891..63e4c2424c 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -2576,7 +2576,4 @@ typedef enum } ForceReload_e; - -#include "../game/genericparser2.h" - #endif // __Q_SHARED_H diff --git a/shared/qcommon/safe/sscanf.h b/shared/qcommon/safe/sscanf.h index d13f163332..44350e710d 100644 --- a/shared/qcommon/safe/sscanf.h +++ b/shared/qcommon/safe/sscanf.h @@ -178,6 +178,13 @@ namespace Q { return sscanf_impl_stream( input, accumulator, f, std::forward< Tail >( tail )... ); } + + // Int + template< typename... Tail > + std::size_t sscanf_impl( const gsl::cstring_view& input, const std::size_t accumulator, int& i, Tail&&... tail ) + { + return sscanf_impl_stream( input, accumulator, i, std::forward< Tail >( tail )... ); + } } /** diff --git a/shared/qcommon/safe/string.cpp b/shared/qcommon/safe/string.cpp index 6d8702f996..737f3b83a5 100644 --- a/shared/qcommon/safe/string.cpp +++ b/shared/qcommon/safe/string.cpp @@ -1,4 +1,5 @@ #include "string.h" +#include "sscanf.h" #include #include @@ -40,43 +41,15 @@ namespace Q int svtoi( const gsl::cstring_view& view ) { - gsl::cstring_view::iterator end = view.end(); - // skip whitespace - gsl::cstring_view::iterator it = std::find_if_not( view.begin(), end, std::isspace ); - if( it == end ) - { - return 0; - } - bool negate = false; - if( *it == '+' ) - { - ++it; - } - else if( *it == '-' ) - { - negate = true; - ++it; - } int result = 0; - while( it != end ) - { - if( *it < '0' || *it > '9' ) - { - break; - } - const int digit = *it - '0'; - result *= 10; - // not negating after the fact so we don't lose MIN_INT - if( negate ) - { - result -= digit; - } - else - { - result += digit; - } - ++it; - } + Q::sscanf( view, result ); + return result; + } + + float svtof( const gsl::cstring_view& view ) + { + float result = 0.f; + Q::sscanf( view, result ); return result; } } diff --git a/shared/qcommon/safe/string.h b/shared/qcommon/safe/string.h index 43bf5b4604..20f81b9fd9 100644 --- a/shared/qcommon/safe/string.h +++ b/shared/qcommon/safe/string.h @@ -16,7 +16,7 @@ namespace Q GT = 1 }; Ordering stricmp( const gsl::cstring_view& lhs, const gsl::cstring_view& rhs ) NOEXCEPT; - /// Case-insensitive less comparator for cstring_view + /// Case-insensitive less comparator for cstring_view; e.g. for case insensitive std::map struct CStringViewILess { bool operator()( const gsl::cstring_view& lhs, const gsl::cstring_view& rhs ) const NOEXCEPT @@ -26,6 +26,7 @@ namespace Q }; int svtoi( const gsl::cstring_view& view ); + float svtof( const gsl::cstring_view& view ); } // operator<< overloads From 4dbe72f30c0fe8d5fa022431c4dc355d40724d61 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 8 Nov 2015 10:46:03 +0100 Subject: [PATCH 082/445] Fixed broken DMS (no music) --- code/client/snd_music.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/code/client/snd_music.cpp b/code/client/snd_music.cpp index f1e0648417..12632644d2 100644 --- a/code/client/snd_music.cpp +++ b/code/client/snd_music.cpp @@ -408,7 +408,11 @@ static qboolean Music_ParseLeveldata( gsl::czstring psLevelName ) { const CGPGroup& pFileGroup = Parser.GetBaseParseGroup(); const CGPGroup* pgMusicFiles = pFileGroup.FindSubGroup( sKEY_MUSICFILES ); - if( pgMusicFiles ) + if( !pgMusicFiles ) + { + Music_Parse_Error(filename, build_string( "Unable to find subgroup \"", sKEY_MUSICFILES ,"\"\n" ) ); + } + else { const CGPGroup* pgLevelMusic = pFileGroup.FindSubGroup( sKEY_LEVELMUSIC ); @@ -422,10 +426,11 @@ static qboolean Music_ParseLeveldata( gsl::czstring psLevelName ) // // check for new USE keyword... // - int iSanityLimit = 0; + int steps = 0; gsl::cstring_view searchName{ &sLevelName[ 0 ], &sLevelName[ strlen( &sLevelName[ 0 ] ) ] }; - while( !searchName.empty() && iSanityLimit < 10 ) + constexpr int sanityLimit = 10; + while( !searchName.empty() && steps < sanityLimit ) { gsLevelNameForLoad = StringViewToSString( searchName ); gsLevelNameForBossLoad = gsLevelNameForLoad; @@ -439,7 +444,7 @@ static qboolean Music_ParseLeveldata( gsl::czstring psLevelName ) // re-search using the USE param... // searchName = pValue->GetTopValue(); - iSanityLimit++; + steps++; // Com_DPrintf("Using \"%s\"\n",sSearchName.c_str()); } else @@ -459,7 +464,7 @@ static qboolean Music_ParseLeveldata( gsl::czstring psLevelName ) // now go ahead and use the final music set we've decided on... // - if( pgThisLevelMusic && iSanityLimit < 10 ) + if( !pgThisLevelMusic || steps >= sanityLimit ) { Music_Parse_Warning( build_string( "Unable to find entry for \"", sLevelName, "\" in \"", filename, "\"\n" ) ); } From bd37fafaf883b8c01baf5b2977b0759bd923b7fa Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 8 Nov 2015 11:14:19 +0100 Subject: [PATCH 083/445] Fixed broken FX parsing (flags) --- code/cgame/FxTemplate.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/cgame/FxTemplate.cpp b/code/cgame/FxTemplate.cpp index 10fe138d73..9ed47a7b20 100644 --- a/code/cgame/FxTemplate.cpp +++ b/code/cgame/FxTemplate.cpp @@ -256,7 +256,7 @@ namespace detail struct ScanStrings { template< std::size_t count, typename... Args > - static int call( const gsl::cstring_view& val, std::array< gsl::cstring_view, count >& arr, Args... args ) + static int call( const gsl::cstring_view& val, std::array< gsl::cstring_view, count >& arr, Args&... args ) { return ScanStrings< remaining - 1 >::call( val, arr, arr[ remaining - 1 ], args... ); } @@ -266,7 +266,7 @@ namespace detail struct ScanStrings< 0 > { template< std::size_t count, typename... Args > - static int call( const gsl::cstring_view& val, std::array< gsl::cstring_view, count >& arr, Args... args ) + static int call( const gsl::cstring_view& val, std::array< gsl::cstring_view, count >& arr, Args&... args ) { return Q::sscanf( val, args... ); } From 142f34554b63cf4263818670a924e6b13dffd7d7 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 8 Nov 2015 11:14:53 +0100 Subject: [PATCH 084/445] VS Debugger Visualization for Parser --- shared/openjk.natvis | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/shared/openjk.natvis b/shared/openjk.natvis index 4ac8335dbb..afca14a5cf 100644 --- a/shared/openjk.natvis +++ b/shared/openjk.natvis @@ -1,8 +1,9 @@ + - {{ {begin_,[end_ - begin_]} }} + {begin_,[end_ - begin_]s} end_ - begin_ @@ -10,4 +11,32 @@ + + + {{ Empty File Buffer }} + {{ {_size} Byte File Buffer }} + + + + + + Generic Parser + + mFileContent + mTopLevel + + + + {{ GP Group {mName}, {mProperties._Mypair._Myval2._Mylast - mProperties._Mypair._Myval2._Myfirst} Properties, {mSubGroups._Mypair._Myval2._Mylast - mSubGroups._Mypair._Myval2._Myfirst} Sub-Groups }} + + mProperties + mSubGroups + + + + + {{ {mKey} = {mValues[0]} }} + {{ {mKey} = {mValues} }} + + \ No newline at end of file From d03f17d5b079ca2afd0c1aabe3fb563eac2b0f40 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Mon, 9 Nov 2015 22:28:57 +0100 Subject: [PATCH 085/445] SP: Added Zone::UniquePtr typedef Saves having to write `std::unique_ptr< X, Zone::Deleter >` instead of `Zone::UniquePtr< X >` --- code/qcommon/safe/memory.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/code/qcommon/safe/memory.h b/code/qcommon/safe/memory.h index 6df9afe0f3..1f21985234 100644 --- a/code/qcommon/safe/memory.h +++ b/code/qcommon/safe/memory.h @@ -80,17 +80,20 @@ namespace Zone using other = Allocator< U, tag >; }; }; + + template< typename T > + using UniquePtr = std::unique_ptr< T, Deleter >; /** make_unique using Zone Allocations (with appropriate deleter) */ template< typename T, memtag_t tag, typename... Args > - inline std::unique_ptr< T, Deleter > make_unique( Args&&... args ) + inline UniquePtr< T > make_unique( Args&&... args ) { - std::unique_ptr< void, Deleter > memory( Allocator< T, tag >{}.allocate( 1 ) ); + UniquePtr< void > memory( Allocator< T, tag >{}.allocate( 1 ) ); // placement new. may throw, in which case the unique_ptr will take care of freeing the memory. T* obj = new( memory )T( std::forward< Args >( args )... ); memory.release(); - return std::unique_ptr< T, Deleter >( obj ); + return UniquePtr< T >( obj ); } } From 7d915f1065e537f0845320ed64249d0325239f8f Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Mon, 9 Nov 2015 16:16:49 +0100 Subject: [PATCH 086/445] Add the selftests to CTest --- CMakeLists.txt | 3 +-- tests/CMakeLists.txt | 7 +++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 975edb0bec..2e4e11b45f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,8 +85,6 @@ if(APPLE) option(MakeApplicationBundles "Whether to build .app application bundles for engines built" ON) endif() - - # Custom CMake Modules needed list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}/CMakeModules") @@ -348,5 +346,6 @@ if(WIN32 AND MSVC) add_subdirectory("tools/WinSymbol") endif() if(BuildTests) + enable_testing() add_subdirectory("tests") endif() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index fcf2be990e..228dff70da 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -37,7 +37,9 @@ source_group( "tests" REGULAR_EXPRESSION ".*") source_group( "tests\\safe" REGULAR_EXPRESSION "safe/.*" ) source_group( "qcommon\\safe" REGULAR_EXPRESSION "${SharedDir}/qcommon/safe/.*" ) -set( Boost_USE_STATIC_LIBS ON ) +if(MSVC) + set( Boost_USE_STATIC_LIBS ON ) +endif() find_package( Boost COMPONENTS unit_test_framework REQUIRED ) set(TestTarget "UnitTests") @@ -49,10 +51,11 @@ set(TestIncludeDirectories ) set(TestDefines "${SharedDefines}") - add_executable(${TestTarget} ${TestFiles}) set_target_properties(${TestTarget} PROPERTIES COMPILE_DEFINITIONS "${TestDefines}") set_target_properties(${TestTarget} PROPERTIES INCLUDE_DIRECTORIES "${TestIncludeDirectories}") set_target_properties(${TestTarget} PROPERTIES PROJECT_LABEL "Unit Tests") target_link_libraries(${TestTarget} ${TestLibraries}) install(TARGETS ${TestTarget} DESTINATION ".") + +add_test(NAME unittests COMMAND ${TestTarget}) From d6b8302698926813dd483fc1b17302d83f506bf1 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Mon, 9 Nov 2015 16:32:18 +0100 Subject: [PATCH 087/445] Make self tests compile (and succeed) on linux llvm (c++11) --- shared/qcommon/safe/limited_vector.h | 28 ++++++++++++++-------------- shared/qcommon/safe/sscanf.h | 26 ++++++++++++++++---------- tests/CMakeLists.txt | 5 +++++ tests/main.cpp | 4 ++++ tests/safe/limited_vector.cpp | 20 +++++++++----------- 5 files changed, 48 insertions(+), 35 deletions(-) diff --git a/shared/qcommon/safe/limited_vector.h b/shared/qcommon/safe/limited_vector.h index 56e9a79dfe..dee2606580 100644 --- a/shared/qcommon/safe/limited_vector.h +++ b/shared/qcommon/safe/limited_vector.h @@ -86,20 +86,6 @@ namespace Q return maximum; } - bool push_back( const T& value ) NOEXCEPT_IF( IS_NOEXCEPT( - emplace_back( static_cast< const T& >( std::declval< T >() ) ) - ) ) - { - return emplace_back( value ); - } - - bool push_back( T&& value ) NOEXCEPT_IF( IS_NOEXCEPT( - emplace_back( std::move( std::declval< T >() ) ) - ) ) - { - return emplace_back( std::move( value ) ); - } - template< typename... Args > bool emplace_back( Args&&... args ) NOEXCEPT_IF( IS_NOEXCEPT( T{ std::forward< Args >( std::declval< Args >() )... } @@ -116,6 +102,20 @@ namespace Q return true; } + bool push_back( const T& value ) NOEXCEPT_IF( IS_NOEXCEPT( + emplace_back( static_cast< const T& >( std::declval< T >() ) ) + ) ) + { + return emplace_back( value ); + } + + bool push_back( T&& value ) NOEXCEPT_IF( IS_NOEXCEPT( + emplace_back( std::move( std::declval< T >() ) ) + ) ) + { + return emplace_back( std::move( value ) ); + } + void pop_back() NOEXCEPT { if( size() == 0 ) diff --git a/shared/qcommon/safe/sscanf.h b/shared/qcommon/safe/sscanf.h index d13f163332..0e6f29f368 100644 --- a/shared/qcommon/safe/sscanf.h +++ b/shared/qcommon/safe/sscanf.h @@ -101,7 +101,7 @@ namespace Q { // it is not written to, but the basic_streambuf interface still wants a non-const CharT. char* data = const_cast< CharT* >( view.data() ); - setg( data, data, data + view.size() ); + this->setg( data, data, data + view.size() ); } protected: @@ -124,7 +124,7 @@ namespace Q newPos += static_cast< int >( off ); if( this->eback() <= newPos && newPos <= this->egptr() ) { - setg( this->eback(), newPos, this->egptr() ); + this->setg( this->eback(), newPos, this->egptr() ); return newPos - this->eback(); } else @@ -142,9 +142,22 @@ namespace Q } /** - Conversion using std::istream's operator>> + Forward declaration. */ template< bool skipws = true, typename T, typename... Tail > + std::size_t sscanf_impl_stream( const gsl::cstring_view& input, const std::size_t accumulator, T& value, Tail&&... tail ); + + // Float + template< typename... Tail > + std::size_t sscanf_impl( const gsl::cstring_view& input, const std::size_t accumulator, float& f, Tail&&... tail ) + { + return sscanf_impl_stream( input, accumulator, f, std::forward< Tail >( tail )... ); + } + + /** + Conversion using std::istream's operator>> + */ + template< bool skipws, typename T, typename... Tail > std::size_t sscanf_impl_stream( const gsl::cstring_view& input, const std::size_t accumulator, T& value, Tail&&... tail ) { auto buf = MakeStreambuf( input ); @@ -171,13 +184,6 @@ namespace Q return accumulator; } } - - // Float - template< typename... Tail > - std::size_t sscanf_impl( const gsl::cstring_view& input, const std::size_t accumulator, float& f, Tail&&... tail ) - { - return sscanf_impl_stream( input, accumulator, f, std::forward< Tail >( tail )... ); - } } /** diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 228dff70da..1e5d1adfa8 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -58,4 +58,9 @@ set_target_properties(${TestTarget} PROPERTIES PROJECT_LABEL "Unit Tests") target_link_libraries(${TestTarget} ${TestLibraries}) install(TARGETS ${TestTarget} DESTINATION ".") +if(NOT MSVC) + #Generate a main function + target_compile_definitions(${TestTarget} PRIVATE BOOST_TEST_DYN_LINK) +endif() + add_test(NAME unittests COMMAND ${TestTarget}) diff --git a/tests/main.cpp b/tests/main.cpp index 315593f0d7..43ab223e45 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -1,3 +1,7 @@ // create default module initialization #define BOOST_TEST_MODULE OpenJK + +// let the boost unit test framework create a main function +#define BOOST_TEST_MAIN + #include diff --git a/tests/safe/limited_vector.cpp b/tests/safe/limited_vector.cpp index 6e8dbb2628..add9c05ac7 100644 --- a/tests/safe/limited_vector.cpp +++ b/tests/safe/limited_vector.cpp @@ -6,8 +6,6 @@ #include -using namespace std::string_literals; - using IntVector = Q::LimitedVector< int, 10 >; using StringVector = Q::LimitedVector< std::string, 10 >; using IntPtrVector = Q::LimitedVector< std::unique_ptr< int >, 10 >; @@ -44,18 +42,18 @@ BOOST_AUTO_TEST_CASE( fill_and_copy ) BOOST_CHECK( it != stringVec.end() ); BOOST_CHECK( cit != stringVec.end() ); - BOOST_CHECK_EQUAL( *it, "hello world"s ); - BOOST_CHECK_EQUAL( *cit, "hello world"s ); - BOOST_CHECK_EQUAL( stringVec[ 0 ], "hello world"s ); + BOOST_CHECK_EQUAL( *it, "hello world" ); + BOOST_CHECK_EQUAL( *cit, "hello world" ); + BOOST_CHECK_EQUAL( stringVec[ 0 ], "hello world" ); ++it; ++cit; BOOST_CHECK( it != stringVec.end() ); BOOST_CHECK( cit != stringVec.end() ); - BOOST_CHECK_EQUAL( *it, "emplaced"s ); - BOOST_CHECK_EQUAL( *cit, "emplaced"s ); - BOOST_CHECK_EQUAL( stringVec[ 1 ], "emplaced"s ); + BOOST_CHECK_EQUAL( *it, "emplaced" ); + BOOST_CHECK_EQUAL( *cit, "emplaced" ); + BOOST_CHECK_EQUAL( stringVec[ 1 ], "emplaced" ); ++it; ++cit; @@ -92,9 +90,9 @@ BOOST_AUTO_TEST_CASE( fill_and_copy ) BOOST_AUTO_TEST_CASE( fill_and_move ) { IntPtrVector vec1, vec2; - BOOST_CHECK( vec1.push_back( std::make_unique< int >( 42 ) ) ); - BOOST_CHECK( vec1.push_back( std::make_unique< int >( 1337 ) ) ); - BOOST_CHECK( vec2.push_back( std::make_unique< int >( 0 ) ) ); + BOOST_CHECK( vec1.push_back( std::unique_ptr< int >( new int(42) ) ) ); + BOOST_CHECK( vec1.push_back( std::unique_ptr< int >( new int(1337) ) ) ); + BOOST_CHECK( vec2.push_back( std::unique_ptr< int >( new int(0) ) ) ); BOOST_CHECK( vec2.emplace_back() ); // nullptr3 BOOST_CHECK_EQUAL( vec1.size(), 2 ); From f1acf507acd87103dbe92cb6bd4c48ab16f988a9 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Mon, 9 Nov 2015 16:46:54 +0100 Subject: [PATCH 088/445] Make the self tests compile and run on linux GNU C (c++11) --- shared/qcommon/q_platform.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shared/qcommon/q_platform.h b/shared/qcommon/q_platform.h index f638b66354..767ad1d696 100644 --- a/shared/qcommon/q_platform.h +++ b/shared/qcommon/q_platform.h @@ -185,8 +185,9 @@ along with this program; if not, see . #define DLL_EXT ".so" #endif -#if defined( _MSC_VER ) && (_MSC_VER < 1900) +#if (defined( _MSC_VER ) && (_MSC_VER < 1900)) || (defined(__GNUC__)) // VS2013, which for some reason we still support, does not support noexcept +// GCC GNU has the same problem: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52869 #define NOEXCEPT #define NOEXCEPT_IF(x) #define IS_NOEXCEPT(x) false From c9914a214bc31c6bd8590672825c016e46fd18ed Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Thu, 12 Nov 2015 22:53:11 +0100 Subject: [PATCH 089/445] Modern Cross-Platform CMake C++11 requirement This requires CMake 3.1, but it's nicer than settings -std=c++11. --- CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2e4e11b45f..5d595e9b6a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,7 @@ # along with this program; if not, see . #============================================================================ -cmake_minimum_required(VERSION 2.8.9) +cmake_minimum_required(VERSION 3.1.0) # For checks in subdirectories set(InOpenJK TRUE) @@ -231,7 +231,8 @@ elseif (("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") OR ("${CMAKE_C_COMPILER_ID}" S set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3") # enable somewhat modern C++ - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + set(CMAKE_CXX_STANDARD 11) + set(CMAKE_CXX_STANDARD_REQUIRED ON) if("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") From 44215293300c9a2fa778a6b9c8ef877c316627bf Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Thu, 12 Nov 2015 22:57:38 +0100 Subject: [PATCH 090/445] Revert "Modern Cross-Platform CMake C++11 requirement" This reverts commit c9914a214bc31c6bd8590672825c016e46fd18ed. This is why we can't have nice things. --- CMakeLists.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d595e9b6a..2e4e11b45f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,7 @@ # along with this program; if not, see . #============================================================================ -cmake_minimum_required(VERSION 3.1.0) +cmake_minimum_required(VERSION 2.8.9) # For checks in subdirectories set(InOpenJK TRUE) @@ -231,8 +231,7 @@ elseif (("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") OR ("${CMAKE_C_COMPILER_ID}" S set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3") # enable somewhat modern C++ - set(CMAKE_CXX_STANDARD 11) - set(CMAKE_CXX_STANDARD_REQUIRED ON) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") if("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") From 3de2a3fe1c7d0d3c1b9c56d90cf22d8eda528ca4 Mon Sep 17 00:00:00 2001 From: Dion Williams Date: Sat, 5 Sep 2015 23:10:16 +0100 Subject: [PATCH 091/445] Offer opt-out for user tracking functionality (ja_guid) --- codemp/client/cl_main.cpp | 87 ++++++++++++++++++++++++--------------- codemp/qcommon/qcommon.h | 2 + 2 files changed, 56 insertions(+), 33 deletions(-) diff --git a/codemp/client/cl_main.cpp b/codemp/client/cl_main.cpp index 26a09c7f78..cc304f6d8f 100644 --- a/codemp/client/cl_main.cpp +++ b/codemp/client/cl_main.cpp @@ -91,6 +91,9 @@ cvar_t *cl_inGameVideo; cvar_t *cl_serverStatusResendTime; cvar_t *cl_framerate; +// cvar to enable sending a "ja_guid" player identifier in userinfo to servers +// ja_guid is a persistent "cookie" that allows servers to track players across game sessions +cvar_t *cl_enableGuid; cvar_t *cl_guidServerUniq; cvar_t *cl_autolodscale; @@ -724,17 +727,32 @@ update cl_guid using QKEY_FILE and optional prefix */ static void CL_UpdateGUID( const char *prefix, int prefix_len ) { - fileHandle_t f; - int len; + if (cl_enableGuid->integer) { + fileHandle_t f; + int len; - len = FS_SV_FOpenFileRead( QKEY_FILE, &f ); - FS_FCloseFile( f ); + len = FS_SV_FOpenFileRead( QKEY_FILE, &f ); + FS_FCloseFile( f ); - if( len != QKEY_SIZE ) - Cvar_Set( "ja_guid", "" ); - else - Cvar_Set( "ja_guid", Com_MD5File( QKEY_FILE, QKEY_SIZE, - prefix, prefix_len ) ); + // initialize the cvar here in case it's unset or was user-created + // while tracking was disabled (removes CVAR_USER_CREATED) + Cvar_Get( "ja_guid", "", CVAR_USERINFO | CVAR_ROM ); + + if( len != QKEY_SIZE ) { + Cvar_Set( "ja_guid", "" ); + } else { + Cvar_Set( "ja_guid", Com_MD5File( QKEY_FILE, QKEY_SIZE, + prefix, prefix_len ) ); + } + } else { + // Remove the cvar entirely if tracking is disabled + uint32_t flags = Cvar_Flags("ja_guid"); + // keep the cvar if it's user-created, but destroy it otherwise + if (flags != CVAR_NONEXISTENT && !(flags & CVAR_USER_CREATED)) { + cvar_t *ja_guid = Cvar_Get("ja_guid", "", 0); + Cvar_Unset(ja_guid); + } + } } /* @@ -2607,34 +2625,36 @@ it by filling it with 2048 bytes of random data. static void CL_GenerateQKey(void) { - int len = 0; - unsigned char buff[ QKEY_SIZE ]; - fileHandle_t f; + if (cl_enableGuid->integer) { + int len = 0; + unsigned char buff[ QKEY_SIZE ]; + fileHandle_t f; - len = FS_SV_FOpenFileRead( QKEY_FILE, &f ); - FS_FCloseFile( f ); - if( len == QKEY_SIZE ) { - Com_Printf( "QKEY found.\n" ); - return; - } - else { - if( len > 0 ) { - Com_Printf( "QKEY file size != %d, regenerating\n", - QKEY_SIZE ); + len = FS_SV_FOpenFileRead( QKEY_FILE, &f ); + FS_FCloseFile( f ); + if( len == QKEY_SIZE ) { + Com_Printf( "QKEY found.\n" ); + return; } + else { + if( len > 0 ) { + Com_Printf( "QKEY file size != %d, regenerating\n", + QKEY_SIZE ); + } - Com_Printf( "QKEY building random string\n" ); - Com_RandomBytes( buff, sizeof(buff) ); + Com_Printf( "QKEY building random string\n" ); + Com_RandomBytes( buff, sizeof(buff) ); - f = FS_SV_FOpenFileWrite( QKEY_FILE ); - if( !f ) { - Com_Printf( "QKEY could not open %s for write\n", - QKEY_FILE ); - return; + f = FS_SV_FOpenFileWrite( QKEY_FILE ); + if( !f ) { + Com_Printf( "QKEY could not open %s for write\n", + QKEY_FILE ); + return; + } + FS_Write( buff, sizeof(buff), f ); + FS_FCloseFile( f ); + Com_Printf( "QKEY generated\n" ); } - FS_Write( buff, sizeof(buff), f ); - FS_FCloseFile( f ); - Com_Printf( "QKEY generated\n" ); } } @@ -2737,6 +2757,8 @@ void CL_Init( void ) { cl_lanForcePackets = Cvar_Get ("cl_lanForcePackets", "1", CVAR_ARCHIVE); + // enable the ja_guid player identifier in userinfo by default in OpenJK + cl_enableGuid = Cvar_Get("cl_enableGuid", "1", CVAR_ARCHIVE); cl_guidServerUniq = Cvar_Get ("cl_guidServerUniq", "1", CVAR_ARCHIVE); // ~ and `, as keys and characters @@ -2811,7 +2833,6 @@ void CL_Init( void ) { G2VertSpaceClient = new CMiniHeap (G2_VERT_SPACE_CLIENT_SIZE * 1024); CL_GenerateQKey(); - Cvar_Get( "ja_guid", "", CVAR_USERINFO | CVAR_ROM ); CL_UpdateGUID( NULL, 0 ); // Com_Printf( "----- Client Initialization Complete -----\n" ); diff --git a/codemp/qcommon/qcommon.h b/codemp/qcommon/qcommon.h index 6262b9f72e..1355d249de 100644 --- a/codemp/qcommon/qcommon.h +++ b/codemp/qcommon/qcommon.h @@ -513,6 +513,8 @@ void Cvar_WriteVariables( fileHandle_t f ); // writes lines containing "set variable value" for all variables // with the archive flag set to true. +cvar_t *Cvar_Unset(cvar_t *cv); + void Cvar_Init( void ); char *Cvar_InfoString( int bit ); From a8a00a0a44cb78f2ceaaa7b16fcfaa01df93a22a Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 21 Nov 2015 16:22:54 +0100 Subject: [PATCH 092/445] non-windows build fixes --- code/game/genericparser2.cpp | 7 ++++--- code/game/genericparser2.h | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/code/game/genericparser2.cpp b/code/game/genericparser2.cpp index 3834866636..983a27854d 100644 --- a/code/game/genericparser2.cpp +++ b/code/game/genericparser2.cpp @@ -93,7 +93,7 @@ static gsl::cstring_view removeTrailingWhitespace( const gsl::cstring_view& text text.begin(), std::find_if_not( std::reverse_iterator< const char *>( text.end() ), std::reverse_iterator< const char* >( text.begin() ), - std::isspace + static_cast< int( *)( int ) >( std::isspace ) ).base() }; } @@ -157,7 +157,7 @@ static gsl::cstring_view GetToken( gsl::cstring_view& text, bool allowLineBreaks else { // consume until first whitespace (if allowLineBreaks == false, that may be text.begin(); in that case token is empty.) - auto tokenEnd = std::find_if( text.begin(), text.end(), std::isspace ); + auto tokenEnd = std::find_if( text.begin(), text.end(), static_cast< int( *)( int ) >( std::isspace ) ); gsl::cstring_view token{ text.begin(), tokenEnd }; text = { tokenEnd, text.end() }; return token; @@ -295,7 +295,8 @@ bool CGenericParser2::Parse( gsl::czstring filename ) { return false; } - return mTopLevel.Parse( mFileContent.view() ); + auto view = mFileContent.view(); + return mTopLevel.Parse( view ); } void CGenericParser2::Clear() NOEXCEPT diff --git a/code/game/genericparser2.h b/code/game/genericparser2.h index 1ebbb3238f..2479ea1558 100644 --- a/code/game/genericparser2.h +++ b/code/game/genericparser2.h @@ -54,12 +54,12 @@ class CGPProperty CGPProperty( gsl::cstring_view initKey, gsl::cstring_view initValue = {} ); - gsl::cstring_view GetName() const { return mKey; } + const gsl::cstring_view& GetName() const { return mKey; } bool IsList() const NOEXCEPT { return mValues.size() > 1; } - gsl::cstring_view GetTopValue() const NOEXCEPT + const gsl::cstring_view& GetTopValue() const NOEXCEPT { return mValues.empty() ? gsl::cstring_view{} : mValues.front(); } From 54d16f9cc4c8237913b81a5a3405d7d949aa5e38 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 22 Nov 2015 01:28:07 +0100 Subject: [PATCH 093/445] Q::sscanf VS2013 fix VS2013 doesn't support default move constructors. Shame. --- shared/qcommon/safe/sscanf.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/shared/qcommon/safe/sscanf.h b/shared/qcommon/safe/sscanf.h index f942e6c24f..5b1777abbe 100644 --- a/shared/qcommon/safe/sscanf.h +++ b/shared/qcommon/safe/sscanf.h @@ -103,6 +103,20 @@ namespace Q char* data = const_cast< CharT* >( view.data() ); this->setg( data, data, data + view.size() ); } + // alas no default move constructors on VS2013. + // TODO DELETEME once we drop VS2013 (because fuck that). +#if defined( _MSC_VER ) && _MSC_VER < 1900 + ArrayViewStreambuf( ArrayViewStreambuf&& rhs ) + : std::basic_streambuf< CharT >( std::move( rhs ) ) + { + } + ArrayViewStreambuf& operator=( ArrayViewStreambuf&& rhs ) + { + std::basic_streambuf< CharT >& self = *this; + self = std::move( rhs ); + return self; + } +#endif protected: /// @note required by istream.tellg() From 1f741defee0dd6561da58c4a86cd93ba1b3c590b Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 22 Nov 2015 01:33:31 +0100 Subject: [PATCH 094/445] GenericParser2: Not returning reference to temporary --- code/game/genericparser2.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/genericparser2.h b/code/game/genericparser2.h index 2479ea1558..73b08575e5 100644 --- a/code/game/genericparser2.h +++ b/code/game/genericparser2.h @@ -61,7 +61,8 @@ class CGPProperty } const gsl::cstring_view& GetTopValue() const NOEXCEPT { - return mValues.empty() ? gsl::cstring_view{} : mValues.front(); + static gsl::cstring_view empty{}; + return mValues.empty() ? empty : mValues.front(); } const Values& GetValues() const NOEXCEPT { From ea3315e54bd7226b2fa89d9713dc58e30f67fc9a Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 22 Nov 2015 01:33:46 +0100 Subject: [PATCH 095/445] GenericParser2: manual move constructor on VS2013 --- code/game/genericparser2.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/code/game/genericparser2.h b/code/game/genericparser2.h index 73b08575e5..c2ddc3b289 100644 --- a/code/game/genericparser2.h +++ b/code/game/genericparser2.h @@ -91,8 +91,26 @@ class CGPGroup CGPGroup( const CGPGroup& ) = delete; CGPGroup& operator=( const CGPGroup& ) = delete; // movable +#if defined( _MSC_VER ) && _MSC_VER < 1900 + // alas no default move constructors on VS2013. + // TODO DELETEME once we drop VS2013 (because fuck that). + CGPGroup( CGPGroup&& rhs ) + : mProperties( std::move( rhs.mProperties ) ) + , mName( std::move( rhs.mName ) ) + , mSubGroups( std::move( rhs.mSubGroups ) ) + { + } + CGPGroup& operator=( CGPGroup&& rhs ) + { + mProperties = std::move( rhs.mProperties ); + mName = std::move( rhs.mName ); + mSubGroups = std::move( rhs.mSubGroups ); + return *this; + } +#else CGPGroup( CGPGroup&& ) = default; CGPGroup& operator=( CGPGroup&& ) = default; +#endif const Properties& GetProperties() const NOEXCEPT { From b98d1332e2e194567af86dcc3ae5061436dedc7a Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 22 Nov 2015 01:38:20 +0100 Subject: [PATCH 096/445] No constexpr because VS2013, again. Sigh. --- code/client/snd_music.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/client/snd_music.cpp b/code/client/snd_music.cpp index 12632644d2..90c45782ad 100644 --- a/code/client/snd_music.cpp +++ b/code/client/snd_music.cpp @@ -429,7 +429,7 @@ static qboolean Music_ParseLeveldata( gsl::czstring psLevelName ) int steps = 0; gsl::cstring_view searchName{ &sLevelName[ 0 ], &sLevelName[ strlen( &sLevelName[ 0 ] ) ] }; - constexpr int sanityLimit = 10; + const int sanityLimit = 10; while( !searchName.empty() && steps < sanityLimit ) { gsLevelNameForLoad = StringViewToSString( searchName ); From f4be5d2d77a7866fb54d7c6e0318ae4dce33e34d Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 22 Nov 2015 01:49:47 +0100 Subject: [PATCH 097/445] possible gcc move workaround --- shared/qcommon/safe/sscanf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/qcommon/safe/sscanf.h b/shared/qcommon/safe/sscanf.h index 5b1777abbe..d820a30858 100644 --- a/shared/qcommon/safe/sscanf.h +++ b/shared/qcommon/safe/sscanf.h @@ -152,7 +152,7 @@ namespace Q template< typename CharT > inline ArrayViewStreambuf< typename std::remove_cv< CharT >::type > MakeStreambuf( const gsl::array_view< const CharT >& view ) { - return{ view }; + return std::move( ArrayViewStreambuf< typename std::remove_cv< CharT >::type >( view ) ); } /** From 9242bfd5e82a3c6021be2e37bc6b9a7a28c3c55e Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 22 Nov 2015 01:59:19 +0100 Subject: [PATCH 098/445] std::basic_streambuf is immovable (why?) --- shared/qcommon/safe/sscanf.h | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/shared/qcommon/safe/sscanf.h b/shared/qcommon/safe/sscanf.h index d820a30858..ddeea10db7 100644 --- a/shared/qcommon/safe/sscanf.h +++ b/shared/qcommon/safe/sscanf.h @@ -103,20 +103,6 @@ namespace Q char* data = const_cast< CharT* >( view.data() ); this->setg( data, data, data + view.size() ); } - // alas no default move constructors on VS2013. - // TODO DELETEME once we drop VS2013 (because fuck that). -#if defined( _MSC_VER ) && _MSC_VER < 1900 - ArrayViewStreambuf( ArrayViewStreambuf&& rhs ) - : std::basic_streambuf< CharT >( std::move( rhs ) ) - { - } - ArrayViewStreambuf& operator=( ArrayViewStreambuf&& rhs ) - { - std::basic_streambuf< CharT >& self = *this; - self = std::move( rhs ); - return self; - } -#endif protected: /// @note required by istream.tellg() @@ -148,13 +134,6 @@ namespace Q } }; - /// For deducing ArrayViewStreambuf's template type - template< typename CharT > - inline ArrayViewStreambuf< typename std::remove_cv< CharT >::type > MakeStreambuf( const gsl::array_view< const CharT >& view ) - { - return std::move( ArrayViewStreambuf< typename std::remove_cv< CharT >::type >( view ) ); - } - /** Forward declaration. */ @@ -181,7 +160,7 @@ namespace Q template< bool skipws, typename T, typename... Tail > std::size_t sscanf_impl_stream( const gsl::cstring_view& input, const std::size_t accumulator, T& value, Tail&&... tail ) { - auto buf = MakeStreambuf( input ); + ArrayViewStreambuf< char > buf{ input }; std::istream stream( &buf ); if( !skipws ) { From d56be4fdd7dd0a50d4396524fac345c835ac3de4 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 22 Nov 2015 02:19:58 +0100 Subject: [PATCH 099/445] C++11-style std::array initialization because we live in the stone age and can't yet use C++14. --- code/game/genericparser2.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/genericparser2.cpp b/code/game/genericparser2.cpp index 983a27854d..4988c7dd2e 100644 --- a/code/game/genericparser2.cpp +++ b/code/game/genericparser2.cpp @@ -137,8 +137,8 @@ static gsl::cstring_view GetToken( gsl::cstring_view& text, bool allowLineBreaks // find the first of '\n', "//" or "/*"; that's end of token auto tokenEnd = std::find( text.begin(), text.end(), '\n' ); static const std::array< char, 2 > commentPatterns[]{ - { '/', '*' }, - { '/', '/' } + { { '/', '*' } }, + { { '/', '/' } } }; for( auto& pattern : commentPatterns ) { From c8c64c4b011ef38f7c113c79ea8299207052447f Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Fri, 27 Nov 2015 12:24:23 +0100 Subject: [PATCH 100/445] docu note about renderer save game data --- documentation/developer/save games.md | 1 + 1 file changed, 1 insertion(+) diff --git a/documentation/developer/save games.md b/documentation/developer/save games.md index e8f447dd40..a2f4b63ef7 100644 --- a/documentation/developer/save games.md +++ b/documentation/developer/save games.md @@ -28,6 +28,7 @@ Save games are handled in `code/server/sv_savegame.cpp`. A save game consists of 9. Effects ("FXLE", 32 \* "FXFN") 10. Entities: `ReadGEntities()` 1. All the entities (count = "NMED", count * "EDNM", "GENT", "GNPC", "GCLI", "PARM", "VHIC", "GHL2") + * "GHL2" is handled by renderer, which has the G2 code. 2. Timers 3. Icarus `CIcarus::Load()` 1. Version ("ICAR", must match `CIcarus::ICARUS_VERSION`) From 883109ef40022ba93363bd33e1ebe61665361e49 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sun, 6 Dec 2015 09:57:38 +0100 Subject: [PATCH 101/445] Fixed broken ugly waterfall in yavin2 (SP) --- code/cgame/FxTemplate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/cgame/FxTemplate.cpp b/code/cgame/FxTemplate.cpp index 9ed47a7b20..dc8efc6dbc 100644 --- a/code/cgame/FxTemplate.cpp +++ b/code/cgame/FxTemplate.cpp @@ -749,7 +749,7 @@ bool CPrimitiveTemplate::ParseFlags( const gsl::cstring_view& val ) { CSTRING_VIEW( "impactKills" ), FX_KILL_ON_IMPACT }, { CSTRING_VIEW( "impactFx" ), FX_IMPACT_RUNS_FX }, { CSTRING_VIEW( "deathFx" ), FX_DEATH_RUNS_FX }, - { CSTRING_VIEW( "useAlpha" ), FX_CLAMP }, + { CSTRING_VIEW( "useAlpha" ), FX_USE_ALPHA }, { CSTRING_VIEW( "emitFx" ), FX_EMIT_FX }, { CSTRING_VIEW( "depthHack" ), FX_DEPTH_HACK }, { CSTRING_VIEW( "setShaderTime" ), FX_SET_SHADER_TIME }, From b505ab49490384b6b58c44dd335d05cf7d527458 Mon Sep 17 00:00:00 2001 From: Razish Date: Wed, 16 Dec 2015 00:02:54 +1100 Subject: [PATCH 102/445] [MP] Fix 64 bit crash regarding collision map --- codemp/qcommon/cm_local.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/codemp/qcommon/cm_local.h b/codemp/qcommon/cm_local.h index 30f725ee50..8094a97e86 100644 --- a/codemp/qcommon/cm_local.h +++ b/codemp/qcommon/cm_local.h @@ -45,10 +45,10 @@ typedef struct cLeaf_s { int cluster; int area; - int firstLeafBrush; + intptr_t firstLeafBrush; int numLeafBrushes; - int firstLeafSurface; + intptr_t firstLeafSurface; int numLeafSurfaces; } cLeaf_t; From 860b556775bc8bc7fa1a52c5080707e54415e5bd Mon Sep 17 00:00:00 2001 From: Razish Date: Wed, 16 Dec 2015 00:03:05 +1100 Subject: [PATCH 103/445] [SP] Fix 64 bit crash regarding collision map --- code/qcommon/cm_local.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/qcommon/cm_local.h b/code/qcommon/cm_local.h index 83d98425d1..62e3e4fdfd 100644 --- a/code/qcommon/cm_local.h +++ b/code/qcommon/cm_local.h @@ -44,10 +44,10 @@ typedef struct { int cluster; int area; - int firstLeafBrush; + intptr_t firstLeafBrush; int numLeafBrushes; - int firstLeafSurface; + intptr_t firstLeafSurface; int numLeafSurfaces; } cLeaf_t; From 8a8ea4f1ec53025e02ac6214b7064c2151aafecc Mon Sep 17 00:00:00 2001 From: Razish Date: Wed, 16 Dec 2015 08:18:45 +1100 Subject: [PATCH 104/445] [SP] Don't strcpy when src==dest in DMA sound code --- code/client/snd_dma.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/client/snd_dma.cpp b/code/client/snd_dma.cpp index 12dac7087c..754a50922c 100644 --- a/code/client/snd_dma.cpp +++ b/code/client/snd_dma.cpp @@ -4527,8 +4527,12 @@ void S_StartBackgroundTrack( const char *intro, const char *loop, qboolean bCall loop = intro; } - Q_strncpyz(gsIntroMusic,intro, sizeof(gsIntroMusic)); - Q_strncpyz(gsLoopMusic, loop, sizeof(gsLoopMusic)); + if ( intro != gsIntroMusic ) { + Q_strncpyz( gsIntroMusic, intro, sizeof(gsIntroMusic) ); + } + if ( loop != gsLoopMusic ) { + Q_strncpyz( gsLoopMusic, loop, sizeof(gsLoopMusic) ); + } char sNameIntro[MAX_QPATH]; char sNameLoop [MAX_QPATH]; From 24ea77b176864c3fe40b0fdfb316cc63203b0f2a Mon Sep 17 00:00:00 2001 From: Razish Date: Wed, 16 Dec 2015 08:18:59 +1100 Subject: [PATCH 105/445] [MP] Don't strcpy when src==dest in DMA sound code --- codemp/client/snd_dma.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/codemp/client/snd_dma.cpp b/codemp/client/snd_dma.cpp index 74e129909a..344a620be5 100644 --- a/codemp/client/snd_dma.cpp +++ b/codemp/client/snd_dma.cpp @@ -4539,8 +4539,12 @@ void S_StartBackgroundTrack( const char *intro, const char *loop, qboolean bCall loop = intro; } - Q_strncpyz(gsIntroMusic,intro, sizeof(gsIntroMusic)); - Q_strncpyz(gsLoopMusic, loop, sizeof(gsLoopMusic)); + if ( intro != gsIntroMusic ) { + Q_strncpyz( gsIntroMusic, intro, sizeof(gsIntroMusic) ); + } + if ( loop != gsLoopMusic ) { + Q_strncpyz( gsLoopMusic, loop, sizeof(gsLoopMusic) ); + } char sNameIntro[MAX_QPATH]; char sNameLoop [MAX_QPATH]; From a40ca7cf3d3f6b035b4f6b346a7bf15a2cd79ac9 Mon Sep 17 00:00:00 2001 From: Razish Date: Wed, 16 Dec 2015 09:16:48 +1100 Subject: [PATCH 106/445] [SP] Added cg_scaleVehicleSensitivity --- code/cgame/cg_local.h | 2 ++ code/cgame/cg_main.cpp | 4 ++++ code/cgame/cg_view.cpp | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index b9d02eac83..19b8f11dda 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -655,6 +655,8 @@ extern vmCvar_t cg_speedTrail; extern vmCvar_t cg_fovViewmodel; extern vmCvar_t cg_fovViewmodelAdjust; +extern vmCvar_t cg_scaleVehicleSensitivity; + void CG_NewClientinfo( int clientNum ); // // cg_main.c diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index ddd9efc126..92e9169536 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -337,6 +337,8 @@ vmCvar_t cg_speedTrail; vmCvar_t cg_fovViewmodel; vmCvar_t cg_fovViewmodelAdjust; +vmCvar_t cg_scaleVehicleSensitivity; + typedef struct { vmCvar_t *vmCvar; const char *cvarName; @@ -453,6 +455,8 @@ static cvarTable_t cvarTable[] = { { &cg_speedTrail, "cg_speedTrail", "1", CVAR_ARCHIVE }, { &cg_fovViewmodel, "cg_fovViewmodel", "0", CVAR_ARCHIVE }, { &cg_fovViewmodelAdjust, "cg_fovViewmodelAdjust", "1", CVAR_ARCHIVE }, + + { &cg_scaleVehicleSensitivity, "cg_scaleVehicleSensitivity", "1", CVAR_ARCHIVE }, }; static const size_t cvarTableSize = ARRAY_LEN( cvarTable ); diff --git a/code/cgame/cg_view.cpp b/code/cgame/cg_view.cpp index 7119bb82e2..e1960789c9 100644 --- a/code/cgame/cg_view.cpp +++ b/code/cgame/cg_view.cpp @@ -2053,7 +2053,7 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView ) { float mPitchOverride = 0.0f; float mYawOverride = 0.0f; - if ( cg.snap->ps.clientNum == 0 ) + if ( cg.snap->ps.clientNum == 0 && cg_scaleVehicleSensitivity.integer ) {//pointless check, but.. if ( cg_entities[0].gent->s.eFlags & EF_LOCKED_TO_WEAPON ) { From cad890ea812d1697d4aa68df5bff35d1497a6ec9 Mon Sep 17 00:00:00 2001 From: Razish Date: Wed, 16 Dec 2015 10:00:57 +1100 Subject: [PATCH 107/445] [SP] Added g_allowBunnyhopping to match JK2 --- code/game/bg_pmove.cpp | 89 ++++++++++++++++++++++++++---------------- code/game/g_local.h | 1 + code/game/g_main.cpp | 4 ++ 3 files changed, 61 insertions(+), 33 deletions(-) diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index f0856a5a6e..748181f874 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -3597,9 +3597,11 @@ int PM_GetLandingAnim( void ) } else if ( anim == BOTH_FLIP_LAND ) { - //stick landings some - pm->ps->velocity[0] *= 0.5f; - pm->ps->velocity[1] *= 0.5f; + if ( !g_allowBunnyhopping->integer ) { + //stick landings some + pm->ps->velocity[0] *= 0.5f; + pm->ps->velocity[1] *= 0.5f; + } return BOTH_LAND1; } else if ( PM_InAirKickingAnim( anim ) ) @@ -3630,58 +3632,75 @@ int PM_GetLandingAnim( void ) case BOTH_FORCEJUMPLEFT1: case BOTH_FORCEINAIRLEFT1: anim = BOTH_FORCELANDLEFT1; - //stick landings some - pm->ps->velocity[0] *= 0.5f; - pm->ps->velocity[1] *= 0.5f; + if ( !g_allowBunnyhopping->integer ) { + //stick landings some + pm->ps->velocity[0] *= 0.5f; + pm->ps->velocity[1] *= 0.5f; + } break; case BOTH_FORCEJUMPRIGHT1: case BOTH_FORCEINAIRRIGHT1: anim = BOTH_FORCELANDRIGHT1; - //stick landings some - pm->ps->velocity[0] *= 0.5f; - pm->ps->velocity[1] *= 0.5f; + if ( !g_allowBunnyhopping->integer ) { + //stick landings some + pm->ps->velocity[0] *= 0.5f; + pm->ps->velocity[1] *= 0.5f; + } break; case BOTH_FORCEJUMP1: case BOTH_FORCEINAIR1: - //stick landings some - pm->ps->velocity[0] *= 0.5f; - pm->ps->velocity[1] *= 0.5f; + if ( !g_allowBunnyhopping->integer ) { + //stick landings some + pm->ps->velocity[0] *= 0.5f; + pm->ps->velocity[1] *= 0.5f; + } anim = BOTH_FORCELAND1; break; case BOTH_FORCEJUMPBACK1: case BOTH_FORCEINAIRBACK1: - //stick landings some - pm->ps->velocity[0] *= 0.5f; - pm->ps->velocity[1] *= 0.5f; + if ( !g_allowBunnyhopping->integer ) { + //stick landings some + pm->ps->velocity[0] *= 0.5f; + pm->ps->velocity[1] *= 0.5f; + } anim = BOTH_FORCELANDBACK1; break; case BOTH_JUMPLEFT1: case BOTH_INAIRLEFT1: anim = BOTH_LANDLEFT1; - //stick landings some - pm->ps->velocity[0] *= 0.5f; - pm->ps->velocity[1] *= 0.5f; + if ( !g_allowBunnyhopping->integer ) { + //stick landings some + pm->ps->velocity[0] *= 0.5f; + pm->ps->velocity[1] *= 0.5f; + } break; case BOTH_JUMPRIGHT1: case BOTH_INAIRRIGHT1: anim = BOTH_LANDRIGHT1; - //stick landings some - pm->ps->velocity[0] *= 0.5f; - pm->ps->velocity[1] *= 0.5f; + if ( !g_allowBunnyhopping->integer ) { + //stick landings some + pm->ps->velocity[0] *= 0.5f; + pm->ps->velocity[1] *= 0.5f; + } break; case BOTH_JUMP1: case BOTH_INAIR1: anim = BOTH_LAND1; - //stick landings some - pm->ps->velocity[0] *= 0.5f; - pm->ps->velocity[1] *= 0.5f; + if ( !g_allowBunnyhopping->integer ) { + //stick landings some + pm->ps->velocity[0] *= 0.5f; + pm->ps->velocity[1] *= 0.5f; + Com_Printf( "sticking landing\n" ); + } break; case BOTH_JUMPBACK1: case BOTH_INAIRBACK1: anim = BOTH_LANDBACK1; - //stick landings some - pm->ps->velocity[0] *= 0.5f; - pm->ps->velocity[1] *= 0.5f; + if ( !g_allowBunnyhopping->integer ) { + //stick landings some + pm->ps->velocity[0] *= 0.5f; + pm->ps->velocity[1] *= 0.5f; + } break; case BOTH_BUTTERFLY_LEFT: case BOTH_BUTTERFLY_RIGHT: @@ -3743,9 +3762,11 @@ int PM_GetLandingAnim( void ) { anim = BOTH_LAND1; } - //stick landings some - pm->ps->velocity[0] *= 0.5f; - pm->ps->velocity[1] *= 0.5f; + if ( !g_allowBunnyhopping->integer ) { + //stick landings some + pm->ps->velocity[0] *= 0.5f; + pm->ps->velocity[1] *= 0.5f; + } break; } return anim; @@ -4082,9 +4103,11 @@ static void PM_CrashLand( void ) PM_SetAnim( pm, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD, 100 ); // Only blend over 100ms pm->ps->saberMove = LS_READY; pm->ps->weaponTime = 0; - //stick landings some - pm->ps->velocity[0] *= 0.5f; - pm->ps->velocity[1] *= 0.5f; + if ( !g_allowBunnyhopping->integer ) { + //stick landings some + pm->ps->velocity[0] *= 0.5f; + pm->ps->velocity[1] *= 0.5f; + } } } else if ( pm->gent diff --git a/code/game/g_local.h b/code/game/g_local.h index 58100532b3..851dfe5711 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -259,6 +259,7 @@ extern cvar_t *g_ICARUSDebug; extern cvar_t *g_npcdebug; +extern cvar_t *g_allowBunnyhopping; extern gentity_t *player; // // g_spawn.c diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index aeeea5bdb1..7e106804a0 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -210,6 +210,8 @@ cvar_t *g_navSafetyChecks; cvar_t *g_broadsword; +cvar_t *g_allowBunnyhopping; + qboolean stop_icarus = qfalse; extern char *G_GetLocationForEnt( gentity_t *ent ); @@ -682,6 +684,8 @@ void G_InitCvars( void ) { g_broadsword = gi.cvar( "broadsword", "1", 0); + g_allowBunnyhopping = gi.cvar( "g_allowBunnyhopping", "0", 0 ); + gi.cvar( "tier_storyinfo", "0", CVAR_ROM|CVAR_SAVEGAME|CVAR_NORESTART); gi.cvar( "tiers_complete", "", CVAR_ROM|CVAR_SAVEGAME|CVAR_NORESTART); From a89faf871b90e08f209c08a7a6f4173ad41ba3c8 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Tue, 15 Dec 2015 18:46:44 -0600 Subject: [PATCH 108/445] [MP] Implement generic C Q_LinearSearch algorithm. Removes bsearch usage from array searching commands, fields, spawns. No longer requires said arrays to be sorted alphabetically or lowercase. (Though still preferred for readability) Refs #760 (For MP) --- codemp/cgame/cg_consolecmds.c | 7 +++--- codemp/cgame/cg_servercmds.c | 3 +-- codemp/cgame/cg_spawn.c | 4 +-- codemp/game/bg_vehicleLoad.c | 25 +++---------------- codemp/game/g_cmds.c | 3 +-- codemp/game/g_spawn.c | 46 ++--------------------------------- codemp/game/g_svcmds.c | 8 +----- codemp/qcommon/q_shared.c | 11 +++++++++ codemp/qcommon/q_shared.h | 5 ++++ codemp/ui/ui_atoms.c | 3 +-- 10 files changed, 30 insertions(+), 85 deletions(-) diff --git a/codemp/cgame/cg_consolecmds.c b/codemp/cgame/cg_consolecmds.c index 70b240aa17..98576adeb7 100644 --- a/codemp/cgame/cg_consolecmds.c +++ b/codemp/cgame/cg_consolecmds.c @@ -280,7 +280,6 @@ int cmdcmp( const void *a, const void *b ) { return Q_stricmp( (const char *)a, ((consoleCommand_t*)b)->cmd ); } -/* This array MUST be sorted correctly by alphabetical name field */ static consoleCommand_t commands[] = { { "+scores", CG_ScoresDown_f }, { "-scores", CG_ScoresUp_f }, @@ -325,9 +324,9 @@ Cmd_Argc() / Cmd_Argv() qboolean CG_ConsoleCommand( void ) { consoleCommand_t *command = NULL; - command = (consoleCommand_t *)bsearch( CG_Argv( 0 ), commands, numCommands, sizeof( commands[0] ), cmdcmp ); + command = (consoleCommand_t *)Q_LinearSearch( CG_Argv( 0 ), commands, numCommands, sizeof( commands[0] ), cmdcmp ); - if ( !command ) + if ( !command || !command->func ) return qfalse; command->func(); @@ -379,7 +378,7 @@ so it can perform tab completion void CG_InitConsoleCommands( void ) { size_t i; - for ( i = 0 ; i < numCommands ; i++ ) + for ( i = 0; i < numCommands; i++ ) trap->AddCommand( commands[i].cmd ); // diff --git a/codemp/cgame/cg_servercmds.c b/codemp/cgame/cg_servercmds.c index c37c062220..036a2c839e 100644 --- a/codemp/cgame/cg_servercmds.c +++ b/codemp/cgame/cg_servercmds.c @@ -1593,7 +1593,6 @@ int svcmdcmp( const void *a, const void *b ) { return Q_stricmp( (const char *)a, ((serverCommand_t*)b)->cmd ); } -/* This array MUST be sorted correctly by alphabetical name field */ static serverCommand_t commands[] = { { "chat", CG_Chat_f }, { "clientLevelShot", CG_ClientLevelShot_f }, @@ -1640,7 +1639,7 @@ static void CG_ServerCommand( void ) { return; } - command = (serverCommand_t *)bsearch( cmd, commands, numCommands, sizeof( commands[0] ), svcmdcmp ); + command = (serverCommand_t *)Q_LinearSearch( cmd, commands, numCommands, sizeof( commands[0] ), svcmdcmp ); if ( command ) { command->func(); diff --git a/codemp/cgame/cg_spawn.c b/codemp/cgame/cg_spawn.c index dd8dbed545..a3c8ae7fd9 100644 --- a/codemp/cgame/cg_spawn.c +++ b/codemp/cgame/cg_spawn.c @@ -274,8 +274,6 @@ typedef struct spawn_s { void (*spawn)( void ); } spawn_t; -/* This array MUST be sorted correctly by alphabetical name field */ -/* for conformity, use lower-case names too */ spawn_t spawns [] = { { "misc_model_static", SP_misc_model_static }, { "misc_skyportal", SP_misc_skyportal }, @@ -336,7 +334,7 @@ void CG_ParseEntityFromSpawnVars( void ) { } if( CG_SpawnString( "classname", "", &classname ) ) { - s = (spawn_t *)bsearch( classname, spawns, ARRAY_LEN( spawns ), sizeof( spawn_t ), spawncmp ); + s = (spawn_t *)Q_LinearSearch( classname, spawns, ARRAY_LEN( spawns ), sizeof( spawn_t ), spawncmp ); if ( s ) s->spawn(); } diff --git a/codemp/game/bg_vehicleLoad.c b/codemp/game/bg_vehicleLoad.c index 74a5e104f5..a14fb28be6 100644 --- a/codemp/game/bg_vehicleLoad.c +++ b/codemp/game/bg_vehicleLoad.c @@ -125,15 +125,9 @@ vehField_t vehWeaponFields[] = static const size_t numVehWeaponFields = ARRAY_LEN( vehWeaponFields ); -static vehField_t *FindVehWeaponParm( const char *parmName ) +int vfieldcmp( const void *a, const void *b ) { - size_t i; - for ( i = 0; iname ); } static qboolean BG_ParseVehWeaponParm( vehWeaponInfo_t *vehWeapon, const char *parmName, char *pValue ) @@ -148,7 +142,7 @@ static qboolean BG_ParseVehWeaponParm( vehWeaponInfo_t *vehWeapon, const char *p Q_strncpyz( value, pValue, sizeof(value) ); // Loop through possible parameters - vehWeaponField = FindVehWeaponParm( parmName ); + vehWeaponField = (vehField_t *)Q_LinearSearch( parmName, vehWeaponFields, numVehWeaponFields, sizeof( vehWeaponFields[0] ), vfieldcmp ); if ( !vehWeaponField ) return qfalse; @@ -770,17 +764,6 @@ void BG_VehicleClampData( vehicleInfo_t *vehicle ) } } -static vehField_t *FindVehicleParm( const char *parmName ) -{ - size_t i; - for ( i = 0; iname ); } -/* This array MUST be sorted correctly by alphabetical name field */ command_t commands[] = { { "addbot", Cmd_AddBot_f, 0 }, { "callteamvote", Cmd_CallTeamVote_f, CMD_NOINTERMISSION }, @@ -3426,7 +3425,7 @@ void ClientCommand( int clientNum ) { return; //end rww - command = (command_t *)bsearch( cmd, commands, numCommands, sizeof( commands[0] ), cmdcmp ); + command = (command_t *)Q_LinearSearch( cmd, commands, numCommands, sizeof( commands[0] ), cmdcmp ); if ( !command ) { trap->SendServerCommand( clientNum, va( "print \"Unknown command %s\n\"", cmd ) ); diff --git a/codemp/game/g_spawn.c b/codemp/game/g_spawn.c index e71d1e873a..52218e2cf8 100644 --- a/codemp/game/g_spawn.c +++ b/codemp/game/g_spawn.c @@ -122,8 +122,6 @@ typedef struct field_s { fieldtype_t type; } field_t; -/* This array MUST be sorted correctly by alphabetical name field */ -/* for conformity, use lower-case names too */ field_t fields[] = { { "alliedteam", FOFS( alliedTeam ), F_INT },//for misc_turrets { "angerscript", FOFS( behaviorSet[BSET_ANGER] ), F_STRING },//name of script to run @@ -211,25 +209,6 @@ field_t fields[] = { { "wait", FOFS( wait ), F_FLOAT }, }; -static int sortfield( const void *a, const void *b ) { - return Q_stricmp( ((field_t*)a)->name, ((field_t*)b)->name ); -} - -void G_CheckFields( void ) { - field_t sorted[ARRAY_LEN(fields)]; - int i; - - for ( i = 0 ; i < ARRAY_LEN(fields) ; i++ ) { - sorted[i] = fields[i]; - } - - qsort( sorted, ARRAY_LEN(sorted), sizeof( sorted[0] ), sortfield ); - - for ( i = 0; i < ARRAY_LEN(fields) ; i++ ) { - trap->Print("%s%s %s\n", Q_stricmp(fields[i].name, sorted[i].name) != 0 ? "*" : "", fields[i].name, sorted[i].name); - } -} - typedef struct spawn_s { const char *name; void (*spawn)(gentity_t *ent); @@ -514,8 +493,6 @@ void SP_gametype_item ( gentity_t* ent ) void SP_emplaced_gun( gentity_t *ent ); -/* This array MUST be sorted correctly by alphabetical name field */ -/* for conformity, use lower-case names too */ spawn_t spawns[] = { { "emplaced_gun", SP_emplaced_gun }, { "func_bobbing", SP_func_bobbing }, @@ -708,25 +685,6 @@ spawn_t spawns[] = { { "waypoint_small", SP_waypoint_small }, }; -static int sortspawn( const void *a, const void *b ) { - return Q_stricmp( ((spawn_t*)a)->name, ((spawn_t*)b)->name ); -} - -void G_CheckSpawns( void ) { - spawn_t sorted[ARRAY_LEN(spawns)]; - int i; - - for ( i = 0 ; i < ARRAY_LEN(spawns) ; i++ ) { - sorted[i] = spawns[i]; - } - - qsort( sorted, ARRAY_LEN(sorted), sizeof( sorted[0] ), sortspawn ); - - for ( i = 0; i < ARRAY_LEN(spawns) ; i++ ) { - trap->Print("%s%s %s\n", Q_stricmp(spawns[i].name, sorted[i].name) != 0 ? "*" : "", sorted[i].name, spawns[i].name, sorted[i].name); - } -} - /* =============== G_CallSpawn @@ -758,7 +716,7 @@ qboolean G_CallSpawn( gentity_t *ent ) { } // check normal spawn functions - s = (spawn_t *)bsearch( ent->classname, spawns, ARRAY_LEN( spawns ), sizeof( spawn_t ), spawncmp ); + s = (spawn_t *)Q_LinearSearch( ent->classname, spawns, ARRAY_LEN( spawns ), sizeof( spawn_t ), spawncmp ); if ( s ) {// found it if ( VALIDSTRING( ent->healingsound ) ) @@ -858,7 +816,7 @@ void G_ParseField( const char *key, const char *value, gentity_t *ent ) float v; vec3_t vec; - f = (field_t *)bsearch( key, fields, ARRAY_LEN( fields ), sizeof( field_t ), fieldcmp ); + f = (field_t *)Q_LinearSearch( key, fields, ARRAY_LEN( fields ), sizeof( field_t ), fieldcmp ); if ( f ) {// found it b = (byte *)ent; diff --git a/codemp/game/g_svcmds.c b/codemp/game/g_svcmds.c index d037d5b55d..c1471595e6 100644 --- a/codemp/game/g_svcmds.c +++ b/codemp/game/g_svcmds.c @@ -478,16 +478,10 @@ int svcmdcmp( const void *a, const void *b ) { return Q_stricmp( (const char *)a, ((svcmd_t*)b)->name ); } -void G_CheckFields( void ); -void G_CheckSpawns( void ); - -/* This array MUST be sorted correctly by alphabetical name field */ svcmd_t svcmds[] = { { "addbot", Svcmd_AddBot_f, qfalse }, { "addip", Svcmd_AddIP_f, qfalse }, { "botlist", Svcmd_BotList_f, qfalse }, - { "checkfields", G_CheckFields, qfalse }, - { "checkspawns", G_CheckSpawns, qfalse }, { "entitylist", Svcmd_EntityList_f, qfalse }, { "forceteam", Svcmd_ForceTeam_f, qfalse }, { "game_memory", Svcmd_GameMem_f, qfalse }, @@ -511,7 +505,7 @@ qboolean ConsoleCommand( void ) { trap->Argv( 0, cmd, sizeof( cmd ) ); - command = (svcmd_t *)bsearch( cmd, svcmds, numsvcmds, sizeof( svcmds[0] ), svcmdcmp ); + command = (svcmd_t *)Q_LinearSearch( cmd, svcmds, numsvcmds, sizeof( svcmds[0] ), svcmdcmp ); if ( !command ) return qfalse; diff --git a/codemp/qcommon/q_shared.c b/codemp/qcommon/q_shared.c index a80c4a05f9..d4001bc883 100644 --- a/codemp/qcommon/q_shared.c +++ b/codemp/qcommon/q_shared.c @@ -1753,3 +1753,14 @@ void Q_AddToBitflags( uint32_t *bits, int index, uint32_t bitsPerByte ) { void Q_RemoveFromBitflags( uint32_t *bits, int index, uint32_t bitsPerByte ) { bits[index / bitsPerByte] &= ~(1 << (index % bitsPerByte)); } + +void *Q_LinearSearch( const void *key, const void *ptr, size_t count, + size_t size, cmpFunc_t cmp ) +{ + for ( size_t i = 0; i < count; i++ ) + { + if ( cmp( key, ptr ) == 0 ) return (void *)ptr; + ptr = (const char *)ptr + size; + } + return NULL; +} diff --git a/codemp/qcommon/q_shared.h b/codemp/qcommon/q_shared.h index 00cf7823e3..4b6e1da82e 100644 --- a/codemp/qcommon/q_shared.h +++ b/codemp/qcommon/q_shared.h @@ -2402,3 +2402,8 @@ void NET_AddrToString( char *out, size_t size, void *addr ); qboolean Q_InBitflags( const uint32_t *bits, int index, uint32_t bitsPerByte ); void Q_AddToBitflags( uint32_t *bits, int index, uint32_t bitsPerByte ); void Q_RemoveFromBitflags( uint32_t *bits, int index, uint32_t bitsPerByte ); + +typedef int( *cmpFunc_t )(const void *a, const void *b); + +void *Q_LinearSearch( const void *key, const void *ptr, size_t count, + size_t size, cmpFunc_t cmp ); diff --git a/codemp/ui/ui_atoms.c b/codemp/ui/ui_atoms.c index 2aff0fbedc..b9703a73aa 100644 --- a/codemp/ui/ui_atoms.c +++ b/codemp/ui/ui_atoms.c @@ -83,7 +83,6 @@ int cmdcmp( const void *a, const void *b ) { return Q_stricmp( (const char *)a, ((consoleCommand_t*)b)->cmd ); } -/* This array MUST be sorted correctly by alphabetical name field */ static consoleCommand_t commands[] = { { "ui_cache", UI_Cache_f }, { "ui_load", UI_Load }, @@ -108,7 +107,7 @@ qboolean UI_ConsoleCommand( int realTime ) { uiInfo.uiDC.frameTime = realTime - uiInfo.uiDC.realTime; uiInfo.uiDC.realTime = realTime; - command = (consoleCommand_t *)bsearch( UI_Argv( 0 ), commands, numCommands, sizeof( commands[0] ), cmdcmp ); + command = (consoleCommand_t *)Q_LinearSearch( UI_Argv( 0 ), commands, numCommands, sizeof( commands[0] ), cmdcmp ); if ( !command ) return qfalse; From 39bfa78897ea392b4591b969e7a6b5e1f05bebfd Mon Sep 17 00:00:00 2001 From: Ensiform Date: Tue, 15 Dec 2015 19:47:14 -0600 Subject: [PATCH 109/445] [MP] Remove unused VM_Call function pointer from the ref interface. --- codemp/rd-common/tr_public.h | 1 - 1 file changed, 1 deletion(-) diff --git a/codemp/rd-common/tr_public.h b/codemp/rd-common/tr_public.h index 9da97cad63..91339ab694 100644 --- a/codemp/rd-common/tr_public.h +++ b/codemp/rd-common/tr_public.h @@ -305,7 +305,6 @@ typedef struct refimport_s { int (*CM_LeafCluster) ( int leafnum ); int (*CM_PointLeafnum) ( const vec3_t p ); int (*CM_PointContents) ( const vec3_t p, clipHandle_t model ); - intptr_t (QDECL *VM_Call) ( vm_t *vm, int callnum, ... ); qboolean (*Com_TheHunkMarkHasBeenMade) ( void ); void (*S_RestartMusic) ( void ); qboolean (*SND_RegisterAudio_LevelLoadEnd) ( qboolean bDeleteEverythingNotUsedThisLevel ); From 894dba22ad403ee508660d066587b8857d8e5629 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Tue, 15 Dec 2015 19:50:46 -0600 Subject: [PATCH 110/445] Generic: Avoid warnings in DbgHelp.h with VS2015 --- tools/WinSymbol/get_exe_dir.cpp | 4 +++- tools/WinSymbol/get_pdb_dir.cpp | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/WinSymbol/get_exe_dir.cpp b/tools/WinSymbol/get_exe_dir.cpp index 74e804b6f5..50d0d34440 100644 --- a/tools/WinSymbol/get_exe_dir.cpp +++ b/tools/WinSymbol/get_exe_dir.cpp @@ -1,7 +1,9 @@ #define WIN32_LEAN_AND_MEAN #include +#pragma warning(push) +#pragma warning(disable:4091) #include - +#pragma warning(pop) #include #include #include diff --git a/tools/WinSymbol/get_pdb_dir.cpp b/tools/WinSymbol/get_pdb_dir.cpp index 8f466b15f9..d2c1a2fac2 100644 --- a/tools/WinSymbol/get_pdb_dir.cpp +++ b/tools/WinSymbol/get_pdb_dir.cpp @@ -1,6 +1,9 @@ #define WIN32_LEAN_AND_MEAN #include +#pragma warning(push) +#pragma warning(disable:4091) #include +#pragma warning(pop) #include #include From ff5736371d564ff3057008ec520efa88db746ee4 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Tue, 15 Dec 2015 19:52:01 -0600 Subject: [PATCH 111/445] zLib CMake: Turn off remaining deprecated warnings. --- lib/zlib/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/zlib/CMakeLists.txt b/lib/zlib/CMakeLists.txt index 28f27a2f0d..10ebf3a97c 100644 --- a/lib/zlib/CMakeLists.txt +++ b/lib/zlib/CMakeLists.txt @@ -13,6 +13,7 @@ include_directories(include/) if(MSVC) add_definitions(-D_CRT_SECURE_NO_WARNINGS) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4996") endif(MSVC) add_library(bundled_zlib STATIC adler32.c From 5676231ab95c893ab2e6ef41aa734a9373e325bb Mon Sep 17 00:00:00 2001 From: Ensiform Date: Wed, 16 Dec 2015 09:46:11 -0600 Subject: [PATCH 112/445] Shared: Stop Sys_QueEvent from spamming messages in release builds. --- shared/sys/sys_event.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/shared/sys/sys_event.cpp b/shared/sys/sys_event.cpp index 2f03bd2fea..e372375d77 100644 --- a/shared/sys/sys_event.cpp +++ b/shared/sys/sys_event.cpp @@ -110,17 +110,34 @@ be freed by the game later. */ void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptrLength, void *ptr ) { sysEvent_t *ev; +#ifndef _DEBUG + static bool printedWarning = false; +#endif ev = &eventQue[ eventHead & MASK_QUED_EVENTS ]; if ( eventHead - eventTail >= MAX_QUED_EVENTS ) { - Com_Printf("Sys_QueEvent: overflow (event type %i)\n", type); + // Spam less often from Com_PushEvent +#ifndef _DEBUG + if ( !printedWarning ) { + Com_Printf( "Sys_QueEvent: overflow (event type %i) (value: %i) (value2: %i)\n", type, value, value2 ); + printedWarning = true; + } +#else + Com_Printf( "Sys_QueEvent: overflow (event type %i) (value: %i) (value2: %i)\n", type, value, value2 ); +#endif // we are discarding an event, but don't leak memory if ( ev->evPtr ) { Z_Free( ev->evPtr ); } eventTail++; } +#ifndef _DEBUG + else + { + printedWarning = false; + } +#endif eventHead++; From 3949341e207f5ec2115cfc608875ebc9709adc96 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Wed, 16 Dec 2015 09:51:11 -0600 Subject: [PATCH 113/445] [MP] Remove warning message when server sets fs_game explicitly to Base --- codemp/client/cl_parse.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/codemp/client/cl_parse.cpp b/codemp/client/cl_parse.cpp index 53d47f66e2..379c458ee1 100644 --- a/codemp/client/cl_parse.cpp +++ b/codemp/client/cl_parse.cpp @@ -479,7 +479,6 @@ void CL_SystemInfoChanged( void ) { if(!FS_FilenameCompare(value, BASEGAME)) { - Com_Printf(S_COLOR_YELLOW "WARNING: Server sent \"%s\" fs_game value, clearing.\n", value); Q_strncpyz(value, "", sizeof(value)); } From dd727155f6fd20f0a2accd7f4900fc6f31953626 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Thu, 17 Dec 2015 12:59:09 -0600 Subject: [PATCH 114/445] [MP] Fix usage of C99 in Q_LinearSearch. Current GCC builders and older MSVC versions don't allow C99 presently. --- codemp/qcommon/q_shared.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/codemp/qcommon/q_shared.c b/codemp/qcommon/q_shared.c index d4001bc883..fcee0bdc2a 100644 --- a/codemp/qcommon/q_shared.c +++ b/codemp/qcommon/q_shared.c @@ -1757,7 +1757,8 @@ void Q_RemoveFromBitflags( uint32_t *bits, int index, uint32_t bitsPerByte ) { void *Q_LinearSearch( const void *key, const void *ptr, size_t count, size_t size, cmpFunc_t cmp ) { - for ( size_t i = 0; i < count; i++ ) + size_t i; + for ( i = 0; i < count; i++ ) { if ( cmp( key, ptr ) == 0 ) return (void *)ptr; ptr = (const char *)ptr + size; From 8fcb2908d43be5bc9c4439b64335666d4271bce8 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sun, 20 Dec 2015 20:17:36 -0600 Subject: [PATCH 115/445] Added simple docu for string files Added basic developer documentation structure for string files. --- documentation/developer/language strings.md | 35 +++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 documentation/developer/language strings.md diff --git a/documentation/developer/language strings.md b/documentation/developer/language strings.md new file mode 100644 index 0000000000..8a342edf7b --- /dev/null +++ b/documentation/developer/language strings.md @@ -0,0 +1,35 @@ +# Language String Files + +These are handled in code[mp]/qcommon/stringed_ingame.cpp and stringed_interface.cpp + +Recursive folder parsing + +Header (only version is required, but legacy files from Raven editor include) + +``` +VERSION "1" +CONFIG "W:\bin\stringed.cfg" +FILENOTES "In-game text for various events" +``` + +each reference string is denoted by REFERENCE. Quotes not required. NOTES line can exist anywhere +if English there will only be LANG_ENGLISH. If the language's string is the same as the english variant it should be "#same" + +``` +REFERENCE PICKUPLINE +NOTES "Printed before item name when pick is obtained" +LANG_ENGLISH "Obtained" +LANG_GERMAN "Aufgenommen:" +``` + +Optional token during reference parsing (quotes accepted): + +``` +FLAGS FLAG_CAPTION FLAG_TYPEMATIC +``` + +file ends with + +``` +ENDMARKER +``` From 1eae99142f229cb998d572b6161f0d483417e4c3 Mon Sep 17 00:00:00 2001 From: dusty22 Date: Sat, 26 Dec 2015 08:47:42 -0500 Subject: [PATCH 116/445] Lots of half-finished things... - new version of Force Speed dodging, Speed punching with g_forceNewPowers - g_weaponVelocity cvar coded, needs testing - Saber Defense 0 has shots pass through lightsaber now, blocking arc for player with a sword with no autoblocking should have a smaller block radius now (test) - melee punch damage tweaked slightly - saber throw reactions should work for melee cultists now - saberists who drop a saber throw should try to dodge saber attacks while they are defenseless now (test) - getup times for jedi/sith classes decreased (test to see if they are good) - player gets a break from rebound animations when deflecting blaster fire in Medium and Strong styles (should also happen for saber parries) - some code written for more fields in weapons.dat, unfinished --- code/game/AI_Jedi.cpp | 68 +++++++-- code/game/bg_pmove.cpp | 7 + code/game/g_main.cpp | 2 + code/game/g_missile.cpp | 4 +- code/game/g_weaponLoad.cpp | 106 ++++++++++++- code/game/w_local.h | 1 + code/game/weapons.h | 15 ++ code/game/wp_blaster_pistol.cpp | 3 +- code/game/wp_blaster_rifle.cpp | 4 +- code/game/wp_bowcaster.cpp | 4 +- code/game/wp_concussion.cpp | 3 +- code/game/wp_demp2.cpp | 4 +- code/game/wp_melee.cpp | 5 +- code/game/wp_saber.cpp | 254 ++++++++++++++++++++++++++------ code/game/wp_saber.h | 7 + 15 files changed, 415 insertions(+), 72 deletions(-) diff --git a/code/game/AI_Jedi.cpp b/code/game/AI_Jedi.cpp index 026b156e60..313461881e 100644 --- a/code/game/AI_Jedi.cpp +++ b/code/game/AI_Jedi.cpp @@ -2100,6 +2100,7 @@ FIXME: possibly let player do this too? qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, int hitLoc ) { int dodgeAnim = -1; + qboolean playerNoDrain = false; if ( !self || !self->client || self->health <= 0 ) { @@ -2139,13 +2140,20 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in } else {//the player - if (g_forceNewPowers->integer) { + if (g_forceNewPowers->integer) + { if (self->client->ps.forcePowerLevel[FP_SPEED] < 2) { return qfalse; } - if (!(self->client->ps.forcePowersActive&(1 << FP_SPEED) || )) + if (!(self->client->ps.forcePowersActive&(1 << FP_SPEED))) {//not already in speed - if (!(self->client->ps.forcePower >= FORCE_POWER_MAX - 20)) + if (self->client->ps.forcePowerLevel[FP_SPEED] == 2 + && !(self->client->ps.forcePower >= S2_AUTODODGE_FP)) + {//make sure we have adequate force power + return qfalse; + } + else if (self->client->ps.forcePowerLevel[FP_SPEED] == 3 + && !(self->client->ps.forcePower >= S3_AUTODODGE_FP)) {//make sure we have adequate force power return qfalse; } @@ -2156,17 +2164,18 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in if (!(self->client->ps.forcePowerLevel[FP_SPEED] == 3 && self->client->ps.forcePowerLevel[FP_SEE] == 3)) { //we have both Sense 3 and Speed 3 active so no drain + playerNoDrain = qtrue; } } else if (self->client->ps.forcePowerLevel[FP_SPEED] == 3) { - if (!(self->client->ps.forcePower > forcePowerNeeded[FP_SPEED] * 0.25)) - {//make sure we have it and have enough force power + if (!(self->client->ps.forcePower > S3_DODGE_FP)) + {//make sure we have it and have enough force power (5 fp) return qfalse; } } - else if (self->client->ps.forcePowerLevel[FP_SPEED] > 1) { - if (!(self->client->ps.forcePower > forcePowerNeeded[FP_SPEED] * 0.5)) - {//make sure we have it and have enough force power + else if (self->client->ps.forcePowerLevel[FP_SPEED] == 2) { + if (!(self->client->ps.forcePower > S2_DODGE_FP)) + {//make sure we have it and have enough force power (10 fp) return qfalse; } } @@ -2175,11 +2184,13 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in if (self->client->ps.forcePowersActive&(1 << FP_SPEED) && self->client->ps.forcePowersActive&(1 << FP_SEE) && self->client->ps.forcePowerLevel[FP_SPEED] == 3 - && self->client->ps.forcePowerLevel[FP_SEE] == 3) { + && self->client->ps.forcePowerLevel[FP_SEE] == 3) + { //always dodge } else if (self->client->ps.forcePowersActive&(1 << FP_SPEED) - && ucmd.buttons&BUTTON_USE) { + && ucmd.buttons&BUTTON_USE) + { //dodge if holding use and in speed } else if (Q_irand(1, 10) > self->client->ps.forcePowerLevel[FP_SPEED]) //auto-dodge @@ -2187,7 +2198,7 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in return qfalse; } } - else { + else { //old force power version if (!(self->client->ps.forcePowersActive&(1 << FP_SPEED))) {//not already in speed if (!WP_ForcePowerUsable(self, FP_SPEED, 0)) @@ -2352,7 +2363,40 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in } else {//player - ForceSpeed(self, 500); + if (g_forceNewPowers->integer) + {//this version is more complex, player may or may not be in Force Speed at this point + if (!(self->client->ps.forcePowersActive&(1 << FP_SPEED))) + {//not in speed + if (self->client->ps.forcePowerLevel[FP_SPEED] == 3) + { + ForceSpeed(self, 500, S3_AUTODODGE_FP); + } + else + { + ForceSpeed(self, 500 /*, S2_AUTODODGE_FP*/); + } + } + else + {//player is in Speed, see if we should still drain some force power + if (playerNoDrain) //Speed 3, Sense 3, and both are active + { + ForceSpeed_dodge(self, 0); + } + else if (self->client->ps.forcePowerLevel[FP_SPEED] == 3) + { //causes Force Speed to end early since player already using Speed + ForceSpeed(self, 500, S3_DODGE_FP); + } + else //Speed 2 + { + ForceSpeed(self, 500, S2_DODGE_FP); + } + } + } + else + {//base JA version much simpler + ForceSpeed(self, 500); + } + } WP_ForcePowerStop( self, FP_GRIP ); diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 2425c7a72a..0dd1ffd620 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -11723,6 +11723,7 @@ qboolean PM_SaberBlocking(void) } else {//player + //forces the player to have a cooldown between deflections if (saberMoveData[pm->ps->saberMove].startQuad == Q_T) { nextMove = LS_R_BL2TR; @@ -14033,6 +14034,12 @@ static void PM_Weapon(void) } } break; + case WP_MELEE: + //addTime *= ((trueCount < 3) ? 0.35f : 1.0f);//slightly faster if high offense level, speed punching + if (pm->ps->forcePowerLevel[FP_SABER_OFFENSE] <= 1) addTime *= 1.2; + else if (pm->ps->forcePowerLevel[FP_SABER_OFFENSE] == 3) addTime *= 0.85; + if (pm->ps->forcePowersActive&(1 << FP_SPEED) && pm->ps->forcePowerLevel[FP_SPEED] > 1) addTime *= 0.5; //speed punching bonus + break; } } diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 07bf52bbca..44c05ac33d 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -213,6 +213,7 @@ cvar_t *g_saberForceDrainAmount; cvar_t *g_saberLockSuperBreaks; cvar_t *g_saberLockStyle; cvar_t *g_forceNewPowers; +cvar_t *g_weaponVelocity; //for character stats cvar_t *g_char_forcePowerMax; //only applies after re-loading level @@ -725,6 +726,7 @@ void G_InitCvars( void ) { g_char_forceRegen = gi.cvar("g_char_forceRegen", "100", CVAR_CHEAT | CVAR_SAVEGAME); g_char_parryBonus = gi.cvar("g_char_parryBonus", "0", CVAR_CHEAT | CVAR_SAVEGAME); g_char_breakParryBonus = gi.cvar("g_char_breakParryBonus", "0", CVAR_CHEAT | CVAR_SAVEGAME); + g_weaponVelocity = gi.cvar("g_weaponVelocity", "1", CVAR_ARCHIVE | CVAR_CHEAT); } /* diff --git a/code/game/g_missile.cpp b/code/game/g_missile.cpp index 0a17727a77..2370763653 100644 --- a/code/game/g_missile.cpp +++ b/code/game/g_missile.cpp @@ -315,7 +315,7 @@ void G_ReflectMissile( gentity_t *ent, gentity_t *missile, vec3_t forward, force } } else if ( owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] <= FORCE_LEVEL_1 ) - {// at level 1 + {// at level 1 or below for ( i = 0; i < 3; i++ ) { bounce_dir[i] += Q_flrand( -0.4f, 0.4f ); @@ -1451,7 +1451,7 @@ void G_RunMissile( gentity_t *ent ) if ( other->owner && other->owner->client && !other->owner->client->ps.saberInFlight - && ( Q_irand( 0, (other->owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]*other->owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) ) == 0 + && ((Q_irand(0, (other->owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] * other->owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE])) == 0 && other->owner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] != 0) || !InFront( ent->currentOrigin, other->owner->currentOrigin, other->owner->client->ps.viewangles, SABER_REFLECT_MISSILE_CONE ) ) )//other->owner->s.number == 0 && {//Jedi cannot block shots from behind! //re-trace from here, ignoring the lightsaber diff --git a/code/game/g_weaponLoad.cpp b/code/game/g_weaponLoad.cpp index 4e88f83e0e..e0089abd93 100644 --- a/code/game/g_weaponLoad.cpp +++ b/code/game/g_weaponLoad.cpp @@ -161,6 +161,8 @@ void WPN_SplashDamage(const char **holdBuf); void WPN_SplashRadius(const char **holdBuf); void WPN_AltSplashDamage(const char **holdBuf); void WPN_AltSplashRadius(const char **holdBuf); +void WPN_Velocity(const char **holdBuf); +void WPN_AltVelocity(const char **holdBuf); // Legacy weapons.dat force fields void WPN_FuncSkip(const char **holdBuf); @@ -188,7 +190,7 @@ const int defaultDamage[] = { FLECHETTE_MINE_DAMAGE, // WP_DET_PACK // HACK, this is what the code sez. CONC_DAMAGE, // WP_CONCUSSION - 0, // WP_MELEE // handled by the melee attack function + 0, // WP_MELEE //right punch damage ATST_MAIN_DAMAGE, // WP_ATST_MAIN ATST_SIDE_MAIN_DAMAGE, // WP_ATST_SIDE @@ -394,6 +396,73 @@ const float defaultAltSplashRadius[] = { 0.0f, // WP_NOGHRI_STICK }; +const int velocity[WP_NUM_WEAPONS] = +{ + 0,//WP_NONE, + 0,//WP_SABER, // NOTE: lots of code assumes this is the first weapon (... which is crap) so be careful -Ste. + BRYAR_PISTOL_VEL,//WP_BLASTER_PISTOL, + BLASTER_VELOCITY,//WP_BLASTER, + Q3_INFINITE,//WP_DISRUPTOR, + BOWCASTER_VELOCITY,//WP_BOWCASTER, + REPEATER_VELOCITY,//WP_REPEATER, + DEMP2_VELOCITY,WP_DEMP2, + FLECHETTE_VEL,//WP_FLECHETTE, + ROCKET_VELOCITY,//WP_ROCKET_LAUNCHER, + TD_VELOCITY,//WP_THERMAL, + 0,//WP_TRIP_MINE, + 0,//WP_DET_PACK, + CONC_VELOCITY,//WP_CONCUSSION, + 0,//WP_MELEE, // Any ol' melee attack + 0,//WP_STUN_BATON, + BRYAR_PISTOL_VEL,//WP_BRYAR_PISTOL, + EMPLACED_VEL,//WP_EMPLACED_GUN, + BRYAR_PISTOL_VEL,//WP_BOT_LASER, // Probe droid - Laser blast + 0,//WP_TURRET, // turret guns + ATST_MAIN_VEL,//WP_ATST_MAIN, + ATST_SIDE_MAIN_VELOCITY,//WP_ATST_SIDE, + EMPLACED_VEL,//WP_TIE_FIGHTER, + EMPLACED_VEL,//WP_RAPID_FIRE_CONC, + 0,//WP_JAWA, + TUSKEN_RIFLE_VEL,//WP_TUSKEN_RIFLE, + 0,//WP_TUSKEN_STAFF, + 0,//WP_SCEPTER, + 0,//WP_NOGHRI_STICK, +}; + +const int defaultAltVelocity[WP_NUM_WEAPONS] = +{ + 0,//WP_NONE, + 0,//WP_SABER, // NOTE: lots of code assumes this is the first weapon (... which is crap) so be careful -Ste. + BRYAR_PISTOL_VEL,//WP_BLASTER_PISTOL, + BLASTER_VELOCITY,//WP_BLASTER, + Q3_INFINITE,//WP_DISRUPTOR, + BOWCASTER_VELOCITY,//WP_BOWCASTER, + REPEATER_ALT_VELOCITY,//WP_REPEATER, + DEMP2_ALT_RANGE,//WP_DEMP2, + FLECHETTE_MINE_VEL,//WP_FLECHETTE, + ROCKET_ALT_VELOCITY,//WP_ROCKET_LAUNCHER, + TD_ALT_VELOCITY,//WP_THERMAL, + 0,//WP_TRIP_MINE, + 0,//WP_DET_PACK, + Q3_INFINITE,//WP_CONCUSSION, + 0,//WP_MELEE, // Any ol' melee attack + 0,//WP_STUN_BATON, + BRYAR_PISTOL_VEL,//WP_BRYAR_PISTOL, + EMPLACED_VEL,//WP_EMPLACED_GUN, + BRYAR_PISTOL_VEL,//WP_BOT_LASER, // Probe droid - Laser blast + 0,//WP_TURRET, // turret guns + ATST_MAIN_VEL,//WP_ATST_MAIN, + ATST_SIDE_ALT_NPC_VELOCITY,//WP_ATST_SIDE, + EMPLACED_VEL,//WP_TIE_FIGHTER, + REPEATER_ALT_VELOCITY,//WP_RAPID_FIRE_CONC, + 0,//WP_JAWA, + TUSKEN_RIFLE_VEL,//WP_TUSKEN_RIFLE, + 0,//WP_TUSKEN_STAFF, + 0,//WP_SCEPTER, + 0,//WP_NOGHRI_STICK, +}; + + wpnParms_t WpnParms[] = { { "ammo", WPN_Ammo }, //ammo @@ -441,6 +510,9 @@ wpnParms_t WpnParms[] = { "splashRadius", WPN_SplashRadius }, { "altSplashDamage", WPN_AltSplashDamage }, { "altSplashRadius", WPN_AltSplashRadius }, + { "velocity", WPN_Velocity }, + { "altVelocity", WPN_AltVelocity }, + // Old legacy files contain these, so we skip them to shut up warnings { "firingforce", WPN_FuncSkip }, @@ -1434,6 +1506,36 @@ void WPN_AltSplashRadius(const char **holdBuf) weaponData[wpnParms.weaponNum].altSplashRadius = tokenFlt; } +//-------------------------------------------- + +void WPN_Velocity(const char **holdBuf) +{ + float tokenFlt; + + if (COM_ParseFloat(holdBuf, &tokenFlt)) + { + SkipRestOfLine(holdBuf); + return; + } + + weaponData[wpnParms.weaponNum].velocity = tokenFlt; +} + +//-------------------------------------------- + +void WPN_AltVelocity(const char **holdBuf) +{ + float tokenFlt; + + if (COM_ParseFloat(holdBuf, &tokenFlt)) + { + SkipRestOfLine(holdBuf); + return; + } + + weaponData[wpnParms.weaponNum].altVelocity = tokenFlt; +} + //-------------------------------------------- static void WP_ParseParms(const char *buffer) { @@ -1483,6 +1585,8 @@ void WP_LoadWeaponParms (void) weaponData[i].altSplashDamage = defaultAltSplashDamage[i]; weaponData[i].splashRadius = defaultSplashRadius[i]; weaponData[i].altSplashRadius = defaultAltSplashRadius[i]; + weaponData[i].velocity = defaultVelocity[i]; + weaponData[i].altVelocity = defaultAltVelocity[i]; } WP_ParseParms(buffer); diff --git a/code/game/w_local.h b/code/game/w_local.h index b5b3ed09ee..ec4a16e436 100644 --- a/code/game/w_local.h +++ b/code/game/w_local.h @@ -38,6 +38,7 @@ extern qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t extern qboolean PM_DroidMelee( int npc_class ); extern void G_Knockdown( gentity_t *self, gentity_t *attacker, const vec3_t pushDir, float strength, qboolean breakSaberLock ); extern qboolean G_HasKnockdownAnims( gentity_t *ent ); +extern float WP_SpeedOfMissileForWeapon(int wp, qboolean alt_fire); extern gentity_t *ent_list[MAX_GENTITIES]; diff --git a/code/game/weapons.h b/code/game/weapons.h index 3db596d301..78ff506b4b 100644 --- a/code/game/weapons.h +++ b/code/game/weapons.h @@ -156,6 +156,8 @@ typedef struct weaponData_s int altSplashDamage; float splashRadius; float altSplashRadius; + int velocity; + int altVelocity; } weaponData_t; @@ -166,6 +168,19 @@ typedef struct ammoData_s int max; // Max amount player can hold of ammo } ammoData_t; +// Melee +//-------- +#define RIGHT_PUNCH_DAMAGE 6 +#define LEFT_PUNCH_DAMAGE 3 +#define KICK_DAMAGE 14 +#define HEAVY_RIGHT_DAMAGE 24 + +// Lightsaber +//-------- +#define IGNITION_TIME 1800 +#define BRYAR_PISTOL_DAMAGE 14 +#define BRYAR_CHARGE_UNIT 200.0f // bryar charging gives us one more unit every 200ms--if you change this, you'll have to do the same in bg_pmove + // Bryar Pistol //-------- #define BRYAR_PISTOL_VEL 1800 diff --git a/code/game/wp_blaster_pistol.cpp b/code/game/wp_blaster_pistol.cpp index 9c9db70e15..658de4a26e 100644 --- a/code/game/wp_blaster_pistol.cpp +++ b/code/game/wp_blaster_pistol.cpp @@ -36,6 +36,7 @@ void WP_FireBryarPistol( gentity_t *ent, qboolean alt_fire ) { vec3_t start; int damage = !alt_fire ? weaponData[WP_BRYAR_PISTOL].damage : weaponData[WP_BRYAR_PISTOL].altDamage; + int velocity = !alt_fire ? weaponData[WP_BRYAR_PISTOL].velocity : weaponData[WP_BRYAR_PISTOL].altVelocity; VectorCopy( muzzle, start ); WP_TraceSetStart( ent, start, vec3_origin, vec3_origin );//make sure our start point isn't on the other side of a wall @@ -67,7 +68,7 @@ void WP_FireBryarPistol( gentity_t *ent, qboolean alt_fire ) WP_MissileTargetHint(ent, start, forwardVec); - gentity_t *missile = CreateMissile( start, forwardVec, BRYAR_PISTOL_VEL, 10000, ent, alt_fire ); + gentity_t *missile = CreateMissile( start, forwardVec, velocity, 10000, ent, alt_fire ); missile->classname = "bryar_proj"; if ( ent->s.weapon == WP_BLASTER_PISTOL diff --git a/code/game/wp_blaster_rifle.cpp b/code/game/wp_blaster_rifle.cpp index b33bf091d1..1659cf1c5e 100644 --- a/code/game/wp_blaster_rifle.cpp +++ b/code/game/wp_blaster_rifle.cpp @@ -35,8 +35,8 @@ along with this program; if not, see . void WP_FireBlasterMissile( gentity_t *ent, vec3_t start, vec3_t dir, qboolean altFire ) //--------------------------------------------------------- { - int velocity = BLASTER_VELOCITY; - int damage = altFire ? weaponData[WP_BLASTER].altDamage : weaponData[WP_BLASTER].damage; + int damage = altFire ? weaponData[WP_BLASTER].altDamage : weaponData[WP_BLASTER].damage; + int velocity = altFire ? weaponData[WP_BLASTER].altVelocity : weaponData[WP_BLASTER].velocity; if ( ent && ent->client && ent->client->NPC_class == CLASS_VEHICLE ) { diff --git a/code/game/wp_bowcaster.cpp b/code/game/wp_bowcaster.cpp index 29b3e8e8c6..68e9b824f6 100644 --- a/code/game/wp_bowcaster.cpp +++ b/code/game/wp_bowcaster.cpp @@ -86,7 +86,7 @@ static void WP_BowcasterMainFire( gentity_t *ent ) for ( int i = 0; i < count; i++ ) { // create a range of different velocities - vel = BOWCASTER_VELOCITY * ( crandom() * BOWCASTER_VEL_RANGE + 1.0f ); + vel = weaponData[WP_BOWCASTER].velocity * ( crandom() * BOWCASTER_VEL_RANGE + 1.0f ); vectoangles( forwardVec, angs ); @@ -144,7 +144,7 @@ static void WP_BowcasterAltFire( gentity_t *ent ) WP_MissileTargetHint(ent, start, forwardVec); - gentity_t *missile = CreateMissile( start, forwardVec, BOWCASTER_VELOCITY, 10000, ent, qtrue ); + gentity_t *missile = CreateMissile( start, forwardVec, WP_SpeedOfMissileForWeapon(WP_BOWCASTER, 1), 10000, ent, qtrue ); missile->classname = "bowcaster_alt_proj"; missile->s.weapon = WP_BOWCASTER; diff --git a/code/game/wp_concussion.cpp b/code/game/wp_concussion.cpp index 44a67cdacc..1750e02d4a 100644 --- a/code/game/wp_concussion.cpp +++ b/code/game/wp_concussion.cpp @@ -30,6 +30,7 @@ along with this program; if not, see . static void WP_FireConcussionAlt( gentity_t *ent ) {//a rail-gun-like beam int damage = weaponData[WP_CONCUSSION].altDamage, skip, traces = DISRUPTOR_ALT_TRACES; + //int velocity = weaponData[WP_CONCUSSION].altVelocity; qboolean render_impact = qtrue; vec3_t start, end; vec3_t muzzle2, spot, dir; @@ -254,7 +255,7 @@ static void WP_FireConcussion( gentity_t *ent ) {//a fast rocket-like projectile vec3_t start; int damage = weaponData[WP_CONCUSSION].damage; - float vel = CONC_VELOCITY; + float vel = weaponData[WP_CONCUSSION].velocity; if (ent->s.number >= MAX_CLIENTS) { diff --git a/code/game/wp_demp2.cpp b/code/game/wp_demp2.cpp index 5f776b476a..a766af6ca7 100644 --- a/code/game/wp_demp2.cpp +++ b/code/game/wp_demp2.cpp @@ -36,13 +36,14 @@ static void WP_DEMP2_MainFire( gentity_t *ent ) { vec3_t start; int damage = weaponData[WP_DEMP2].damage; + float velocity = weaponData[WP_DEMP2].velocity; VectorCopy( muzzle, start ); WP_TraceSetStart( ent, start, vec3_origin, vec3_origin );//make sure our start point isn't on the other side of a wall WP_MissileTargetHint(ent, start, forwardVec); - gentity_t *missile = CreateMissile( start, forwardVec, DEMP2_VELOCITY, 10000, ent ); + gentity_t *missile = CreateMissile( start, forwardVec, velocity, 10000, ent ); missile->classname = "demp2_proj"; missile->s.weapon = WP_DEMP2; @@ -198,6 +199,7 @@ static void WP_DEMP2_AltFire( gentity_t *ent ) //--------------------------------------------------------- { int damage = weaponData[WP_REPEATER].altDamage; + float velocity = weaponData[WP_DEMP2].velocity; int count; vec3_t start; trace_t tr; diff --git a/code/game/wp_melee.cpp b/code/game/wp_melee.cpp index cca1ebcc74..955b663b49 100644 --- a/code/game/wp_melee.cpp +++ b/code/game/wp_melee.cpp @@ -32,7 +32,7 @@ void WP_Melee( gentity_t *ent ) gentity_t *tr_ent; trace_t tr; vec3_t mins, maxs, end; - int damage = ent->s.number ? 5 : 5; + int damage = 5; float range = ent->s.number ? 64 : 32; VectorMA( muzzle, range, forwardVec, end ); @@ -65,7 +65,8 @@ void WP_Melee( gentity_t *ent ) //G_Sound( tr_ent, G_SoundIndex( va("sound/weapons/melee/punch%d", Q_irand(1, 4)) ) ); if ( ent->NPC && (ent->NPC->aiFlags&NPCAI_HEAVY_MELEE) ) { //4x damage for heavy melee class - damage *= 4; + damage = 5; + damage *= 4 + Q_irand(-3, 3); dflags &= ~DAMAGE_NO_KNOCKBACK; dflags |= DAMAGE_DISMEMBER; } diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 2bf3a73253..87e716e45e 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -141,6 +141,7 @@ extern qboolean Boba_Flying(gentity_t *self); extern void JET_FlyStart(gentity_t *self); extern void Boba_DoFlameThrower(gentity_t *self); extern void Boba_StopFlameThrower(gentity_t *self); +extern void NPC_EvasionSaber(); extern Vehicle_t *G_IsRidingVehicle(gentity_t *ent); extern int SaberDroid_PowerLevelForSaberAnim(gentity_t *self); @@ -4407,6 +4408,16 @@ void G_DrainPowerForSpecialMove(gentity_t *self, forcePowers_t fp, int cost, qbo } } +void G_DrainPowerForDodge(gentity_t *self, int cost) +{//hack for draining some force power for a sniper shot dodge while Speed is active + if (!self || !self->client || self->s.number >= MAX_CLIENTS) + { + return; + } + + WP_ForcePowerDrain(self, FP_SPEED, cost);//drain the required force power +} + int G_CostForSpecialMove(int cost, qboolean kataMove) { if (g_saberNewControlScheme->integer || kataMove) @@ -8143,13 +8154,7 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) } if (PM_InKnockDown(&self->client->ps)) - {//can't block when knocked down - return; - } - - if (PM_SuperBreakLoseAnim(self->client->ps.torsoAnim) - || PM_SuperBreakWinAnim(self->client->ps.torsoAnim)) - {//can't block while in break anim + {//can't dodge when knocked down return; } @@ -8374,6 +8379,74 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) } } } + + //Reactions to Thrown Sabers + if (ent->s.weapon != WP_SABER) + {//only block shots coming from behind + if ((dot1 = DotProduct(dir, forward)) < SABER_REFLECT_MISSILE_CONE) + continue; + } + else if (!self->s.number) + {//player never auto-blocks thrown sabers + continue; + }//NPCs always try to block sabers coming from behind! + + //see if they're heading towards me + VectorCopy(ent->s.pos.trDelta, missile_dir); + VectorNormalize(missile_dir); + if ((dot2 = DotProduct(dir, missile_dir)) > 0) + continue; + + //FIXME: must have a clear trace to me, too... + if (dist < closestDist) + { + VectorCopy(self->currentOrigin, traceTo); + traceTo[2] = self->absmax[2] - 4; + gi.trace(&trace, ent->currentOrigin, ent->mins, ent->maxs, traceTo, ent->s.number, ent->clipmask, (EG2_Collision)0, 0); + if (trace.allsolid || trace.startsolid || (trace.fraction < 1.0f && trace.entityNum != self->s.number && trace.entityNum != self->client->ps.saberEntityNum)) + {//okay, try one more check + VectorNormalize2(ent->s.pos.trDelta, entDir); + VectorMA(ent->currentOrigin, radius, entDir, traceTo); + gi.trace(&trace, ent->currentOrigin, ent->mins, ent->maxs, traceTo, ent->s.number, ent->clipmask, (EG2_Collision)0, 0); + if (trace.allsolid || trace.startsolid || (trace.fraction < 1.0f && trace.entityNum != self->s.number && trace.entityNum != self->client->ps.saberEntityNum)) + {//can't hit me, ignore it + continue; + } + } + if (self->s.number != 0) + {//An NPC + if (self->NPC && !self->enemy && ent->owner) + { + if (ent->owner->health >= 0 && (!ent->owner->client || ent->owner->client->playerTeam != self->client->playerTeam)) + { + G_SetEnemy(self, ent->owner); + } + } + } + //FIXME: if NPC, predict the intersection between my current velocity/path and the missile's, see if it intersects my bounding box (+/-saberLength?), don't try to deflect unless it does? + closestDist = dist; + incoming = ent; + } + + + if (incoming) + { + if (self->NPC && !G_ControlledByPlayer(self)) + { + if (Jedi_WaitingAmbush(self)) + { + Jedi_Ambush(self); + } + } + + if (incoming->owner && incoming->owner->client && (!self->enemy || self->enemy->s.weapon != WP_SABER))//keep enemy jedi over shooters + { + self->enemy = incoming->owner; + NPC_SetLookTarget(self, incoming->owner->s.number, level.time + 1000); + + NPC_EvasionSaber(); //Get out of the way! + } + } } } } @@ -8487,20 +8560,57 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) } if ((self->client->ps.saber[0].saberFlags&SFL_NOT_ACTIVE_BLOCKING)) - {//can't actively block with this saber type + {//can't actively block with this saber type... return; } } - if (!self->s.number) - {//don't do this if already attacking! + if (!self->s.number) //player + { + int totalReboundTime = 0; + int baseReboundTime = 0; + if (ucmd->buttons & BUTTON_ATTACK || PM_SaberInAttack(self->client->ps.saberMove) - || PM_SaberInSpecialAttack(self->client->ps.torsoAnim) - || PM_SaberInTransitionAny(self->client->ps.saberMove)) - { + || PM_SaberInSpecialAttack(self->client->ps.torsoAnim)) + {//can't block if already attacking! + return; + } + else if (PM_SaberInTransitionAny(self->client->ps.saberMove) + && !PM_SaberInReturn(self->client->ps.saberMove)) + {//can't block if transitioning between saber moves return; } + else if (PM_SaberInReturn(self->client->ps.saberMove)) + {//we're in a return, probably triggered after a previous deflection + //FIXME: Make sure it's a return from a deflection, not a slash? + if (self->client->ps.saberAnimLevel = 1 || self->client->ps.saberAnimLevel > 3) + { //only Medium and Strong get a break because their return anims take so long + return; + } + + totalReboundTime = parryDebounce[self->client->ps.forcePowerLevel[FP_SABER_DEFENSE]] * 2 * g_spskill->integer; + baseReboundTime = totalReboundTime; + + switch (self->client->ps.saberAnimLevel) + { + case SS_FAST: + case SS_TAVION: + case SS_MEDIUM: + case SS_STAFF: + case SS_DUAL: + case SS_DESANN: + break; + case SS_STRONG: + totalReboundTime += 2 * baseReboundTime * g_spskill->integer; + break; + } + + if (totalReboundTime > self->client->ps.torsoAnimTimer) + {//we haven't been in the cooldown (return) animation long enough + return; + } + } } if (self->client->ps.forcePowerLevel[FP_SABER_DEFENSE] < FORCE_LEVEL_1) @@ -8720,7 +8830,7 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) } } } - + if (ent->s.weapon != WP_SABER) {//only block shots coming from behind if ((dot1 = DotProduct(dir, forward)) < SABER_REFLECT_MISSILE_CONE) @@ -8964,6 +9074,21 @@ void WP_SaberUpdate(gentity_t *self, usercmd_t *ucmd) self->client->ps.saberBlocking = BLK_TIGHT; } } + + if (self->s.number == 0 + && (!(self->client->ps.saber[0].saberFlags&SFL_NOT_ACTIVE_BLOCKING) || self->client->ps.forcePowerLevel[FP_SABER_DEFENSE] == 0)) + { + if (self->client->ps.saber[0].saberFlags&SFL_NOT_ACTIVE_BLOCKING) + {//so player can't take advantage of wide block angle + self->client->ps.saberBlocking = BLK_TIGHT; + } + if (self->client->ps.forcePowerLevel[FP_SABER_DEFENSE] == 0) + {//sloppy fix for SD 0 blocking everything instead of nothing + noBlocking = qtrue; + } + } + + if (noBlocking) { //VectorClear(saberent->mins); @@ -8991,7 +9116,8 @@ void WP_SaberUpdate(gentity_t *self, usercmd_t *ucmd) saberent->contents = CONTENTS_LIGHTSABER; - G_SetOrigin(saberent, saberOrg); + G_SetOrigin(saberent, saberOrg); + } else { @@ -9620,12 +9746,21 @@ void WP_ForceKnockdown(gentity_t *self, gentity_t *pusher, qboolean pull, qboole } else { - if (g_spskill->integer > 1 && self->NPC->rank > RANK_ENSIGN - && (self->client->NPC_class == CLASS_REBORN || self->client->NPC_class == CLASS_JEDI)) { - addTime = Q_irand(-400, 100); + if (g_spskill->integer > 1 + && self->NPC->rank >= RANK_ENSIGN + && (self->client->NPC_class == CLASS_REBORN || self->client->NPC_class == CLASS_JEDI)) + {//you must have Jedi reflexes... + if (self->NPC->rank >= RANK_ENSIGN && self->NPC->rank < RANK_LT_COMM) + { + addTime = Q_irand(-400, 200); + } + if (self->NPC->rank >= RANK_LT_COMM) + { + addTime = Q_irand(-600, 0); + } } else if (g_spskill->integer > 1 && self->NPC->aiFlags&NPCAI_BOSS_CHARACTER) { - addTime = Q_irand(-700, 0); + addTime = Q_irand(-600, 0); } else { addTime = Q_irand(-300, 300); @@ -11077,6 +11212,56 @@ void ForceSpeed(gentity_t *self, int duration) G_Sound(self, G_SoundIndex("sound/weapons/force/speed.wav")); } +void ForceSpeed(gentity_t *self, int duration, int drain) +{ + if (self->health <= 0) + { + return; + } + if (self->client->ps.forceAllowDeactivateTime < level.time && + (self->client->ps.forcePowersActive & (1 << FP_SPEED))) + {//stop using it + WP_ForcePowerStop(self, FP_SPEED); + return; + } + if (!WP_ForcePowerUsable(self, FP_SPEED, 0)) + { + return; + } + if (self->client->ps.saberLockTime > level.time) + {//FIXME: can this be a way to break out? + return; + } + + WP_DebounceForceDeactivateTime(self); + + WP_ForcePowerStart(self, FP_SPEED, drain); + if (duration) + { + self->client->ps.forcePowerDuration[FP_SPEED] = level.time + duration; + } + G_Sound(self, G_SoundIndex("sound/weapons/force/speed.wav")); +} + +void ForceSpeed_dodge(gentity_t *self, int drain) +{//player is dodging mid-Force Speed + if (self->health <= 0) + { + return; + } + if (!WP_ForcePowerUsable(self, FP_SPEED, drain)) + { + return; + } + if (self->client->ps.saberLockTime > level.time) + {//FIXME: can this be a way to break out? + return; + } + + G_DrainPowerForDodge(self, drain); + G_Sound(self, G_SoundIndex("sound/weapons/force/speed.wav")); +} + void WP_StartForceHealEffects(gentity_t *self) { if (self->ghoul2.size()) @@ -13701,35 +13886,8 @@ void WP_ForcePowerDrain(gentity_t *self, forcePowers_t forcePower, int overrideA //take away the power int drain = overrideAmt; if (!drain) - { - if (g_forceNewPowers->integer) { - if (self->s.number < MAX_CLIENTS) { //player - if (PM_DodgeAnim(self->client->ps.torsoAnim)) { //we're doing a force speed dodge - if (self->client->ps.forcePowersActive&(1 << FP_SPEED)) { - if (self->client->ps.forcePowersActive&(1 << FP_SEE) - && self->client->ps.forcePowerLevel[FP_SPEED] == 3 - && self->client->ps.forcePowerLevel[FP_SEE] == 3) - drain = 0; //no drain if using Speed 3 + Sense 3 - } - else { - if (self->client->ps.forcePowerLevel[FP_SPEED] == 3) { - drain = forcePowerNeeded[forcePower] * 0.5; - } - else { //force speed 2 - drain = forcePowerNeeded[forcePower]; - } - } - } - } - else { - drain = forcePowerNeeded[forcePower]; - } - } - else { - drain = forcePowerNeeded[forcePower]; - } - - + { + drain = forcePowerNeeded[forcePower]; } if (!drain) { diff --git a/code/game/wp_saber.h b/code/game/wp_saber.h index 6ce475f316..46cbd1ef90 100644 --- a/code/game/wp_saber.h +++ b/code/game/wp_saber.h @@ -25,6 +25,11 @@ along with this program; if not, see . #include "b_public.h" +#define S2_AUTODODGE_FP 50 +#define S3_AUTODODGE_FP 25 +#define S2_DODGE_FP 10 +#define S3_DODGE_FP 5 + #define ARMOR_EFFECT_TIME 500 #define JSF_AMBUSH 16 //ambusher Jedi @@ -164,6 +169,8 @@ extern float forcePushPullRadius[]; extern int forcePowerNeeded[]; //new extern void ForceSpeed( gentity_t *self, int duration = 0 ); +extern void ForceSpeed( gentity_t *self, int duration, int drain); +extern void ForceSpeed_dodge(gentity_t *self, int drain); extern float forceSpeedValue[]; extern float forceSpeedRangeMod[]; extern float forceSpeedFOVMod[]; From c969c8dc83860ad363d22e03bfb9b7484a384da2 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 28 Dec 2015 20:25:27 -0600 Subject: [PATCH 117/445] Create sound-code-declutter.md Developer docu/ideas/plan/discussion of sound code ideas and what needs to be worked on in this area. Comments on commit or edits to file okay. --- .../developer/sound-code-declutter.md | 764 ++++++++++++++++++ 1 file changed, 764 insertions(+) create mode 100644 documentation/developer/sound-code-declutter.md diff --git a/documentation/developer/sound-code-declutter.md b/documentation/developer/sound-code-declutter.md new file mode 100644 index 0000000000..85a4f8228d --- /dev/null +++ b/documentation/developer/sound-code-declutter.md @@ -0,0 +1,764 @@ +As some may have noticed the Raven advancements to the entire soundcode are absolutely all over the place and is a huge mess. + +I would like to start by seeing if we can get a rough similar port of the ioq3 sound code into jka and then start to re-add the JKA features. (I know, I know don't need ioquake3 for everything) But similar idea anyway. Something more C++ would be ideal eventually however we still have to maintain the API so we can't get too crazy. + +As a comparison take a look at some of the way things are handled here: + +Interface: +- https://github.com/ioquake/ioq3/blob/master/code/client/snd_main.c + +Codec Handler similar to tr_image and tr_model +- https://github.com/ioquake/ioq3/blob/master/code/client/snd_codec.c + +Codecs: +- https://github.com/ioquake/ioq3/blob/master/code/client/snd_codec_wav.c +- https://github.com/ioquake/ioq3/blob/master/code/client/snd_codec_ogg.c +- https://github.com/ioquake/ioq3/blob/master/code/client/snd_codec_opus.c +(MP3 should be handled differently IMO but we need to make sure it still supports things the same?) There's a libmad implementation available: +See below for the ioEF snd_codec_mp3 which can be worked with? + +OpenAL Interface split off into its own interface file: +- There is a lot of rethinking to do because Raven actually seems to maybe have semi-real channel support and Q3 does not. +- The ioq3 implementation also does some things differently that do not mix very well with Raven's mashup codebase. +- Add EFX support to replace EAX. Though we can't really do much about the EAL files can we? Currently "OpenAL" at all is only supported on Win32 anyway since it depends on the proprietary version with EAX. +- There is also a serious issue with allowing OJK on windows to be installed on the same directory as JO/JA. Both regular versions of the games ship with an OpenAL32.dll which crashes since its some ancient dll from Creative when using OJK with alsoft lib/headers and vice versa. +- https://github.com/ioquake/ioq3/blob/master/code/client/snd_openal.c + +"Q3" sound interface by itself: +- https://github.com/ioquake/ioq3/blob/master/code/client/snd_openal.c + +Other stuff: +- The ambient sound code could be rewritten and spun off probably with some of wonko's new file and string parsing code (it does not use the genericparser class though) +- Dynamic Music code could be adapted entirely so that its independent of the interface code and the interface can make calls to the dynamic music code. +- Dynamic Music also still needs the parser rewrite from SP in MP I think? + +==== + +This was from the ioEF port and could be adapted to support MP3 better but it at least uses libmad instead of mp3code: + +``` +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. +Copyright (C) 2005 Stuart Dalton (badcdev@gmail.com) +Copyright (C) 2005-2006 Joerg Dietrich +Copyright (C) 2006 Thilo Schulz + +This file is part of Quake III Arena source code. + +Quake III Arena source code is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Quake III Arena source code is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Quake III Arena source code; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +// includes for the Q3 sound system +#include "client.h" +#include "snd_codec.h" + +// includes for the MP3 codec +#include + +#define MP3_SAMPLE_WIDTH 2 +#define MP3_PCMSAMPLES_PERSLICE 32 + +// buffer size used when reading through the mp3 +#define MP3_DATA_BUFSIZ 128*1024 + +// undefine this if you don't want any dithering. +#define MP3_DITHERING + +// Q3 MP3 codec +snd_codec_t mp3_codec = +{ + "mp3", + S_MP3_CodecLoad, + S_MP3_CodecOpenStream, + S_MP3_CodecReadStream, + S_MP3_CodecCloseStream, + NULL +}; + +// structure used for info purposes +struct snd_codec_mp3_info +{ + byte encbuf[MP3_DATA_BUFSIZ]; // left over bytes not consumed + // by the decoder. + struct mad_stream madstream; // uses encbuf as buffer. + struct mad_frame madframe; // control structures for libmad. + struct mad_synth madsynth; + + byte *pcmbuf; // buffer for not-used samples. + int buflen; // length of buffer data. + int pcmbufsize; // amount of allocated memory for + // pcmbuf. This should have at least + // the size of a decoded mp3 frame. + + byte *dest; // copy decoded data here. + int destlen; // amount of already copied data. + int destsize; // amount of bytes we must decode. +}; + +/*************** MP3 utility functions ***************/ + +/* +================= +S_MP3_ReadData +================= +*/ + +// feed libmad with data +int S_MP3_ReadData(snd_stream_t *stream, struct mad_stream *madstream, byte *encbuf, int encbufsize) +{ + int retval; + int leftover; + + if(!stream) + return -1; + + leftover = madstream->bufend - madstream->next_frame; + if(leftover > 0) + memmove(encbuf, madstream->this_frame, leftover); + + // Fill the buffer right to the end + + retval = FS_Read(&encbuf[leftover], encbufsize - leftover, stream->file); + + if(retval <= 0) + { + // EOF reached, that's ok. + return 0; + } + + mad_stream_buffer(madstream, encbuf, retval + leftover); + + return retval; +} + +/* +================= +S_MP3_Scanfile + +to determine the samplecount, we apparently must get *all* headers :( +I basically used the xmms-mad plugin source to see how this stuff works. + +returns a value < 0 on error. +================= +*/ + +int S_MP3_Scanfile(snd_stream_t *stream) +{ + struct mad_stream madstream; + struct mad_header madheader; + int retval; + int samplecount; + byte encbuf[MP3_DATA_BUFSIZ]; + + // error out on invalid input. + if(!stream) + return -1; + + mad_stream_init(&madstream); + mad_header_init(&madheader); + + while(1) + { + retval = S_MP3_ReadData(stream, &madstream, encbuf, sizeof(encbuf)); + if(retval < 0) + return -1; + else if(retval == 0) + break; + + // Start decoding the headers. + while(1) + { + if((retval = mad_header_decode(&madheader, &madstream)) < 0) + { + if(madstream.error == MAD_ERROR_BUFLEN) + { + // We need to read more data + break; + } + + if(!MAD_RECOVERABLE (madstream.error)) + { + // unrecoverable error... we must bail out. + return retval; + } + + mad_stream_skip(&madstream, madstream.skiplen); + continue; + } + + // we got a valid header. + + if(madheader.layer != MAD_LAYER_III) + { + // we don't support non-mp3s + return -1; + } + + if(!stream->info.samples) + { + // This here is the very first frame. Set initial values now, + // that we expect to stay constant throughout the whole mp3. + + stream->info.rate = madheader.samplerate; + stream->info.width = MP3_SAMPLE_WIDTH; + stream->info.channels = MAD_NCHANNELS(&madheader); + stream->info.samples = 0; + stream->info.size = 0; // same here. + stream->info.dataofs = 0; + } + else + { + // Check whether something changed that shouldn't. + + if(stream->info.rate != madheader.samplerate || + stream->info.channels != MAD_NCHANNELS(&madheader)) + return -1; + } + + // Update the counters + samplecount = MAD_NSBSAMPLES(&madheader) * MP3_PCMSAMPLES_PERSLICE; + stream->info.samples += samplecount; + stream->info.size += samplecount * stream->info.channels * stream->info.width; + } + } + + // Reset the file pointer so we can do the real decoding. + FS_Seek(stream->file, 0, FS_SEEK_SET); + + return 0; +} + +/************************ dithering functions ***************************/ + +#ifdef MP3_DITHERING + +// All dithering done here is taken from the GPL'ed xmms-mad plugin. + +/* Copyright (C) 1997 Makoto Matsumoto and Takuji Nishimura. */ +/* Any feedback is very welcome. For any question, comments, */ +/* see http://www.math.keio.ac.jp/matumoto/emt.html or email */ +/* matumoto@math.keio.ac.jp */ + +/* Period parameters */ +#define MP3_DITH_N 624 +#define MP3_DITH_M 397 +#define MATRIX_A 0x9908b0df /* constant vector a */ +#define UPPER_MASK 0x80000000 /* most significant w-r bits */ +#define LOWER_MASK 0x7fffffff /* least significant r bits */ + +/* Tempering parameters */ +#define TEMPERING_MASK_B 0x9d2c5680 +#define TEMPERING_MASK_C 0xefc60000 +#define TEMPERING_SHIFT_U(y) (y >> 11) +#define TEMPERING_SHIFT_S(y) (y << 7) +#define TEMPERING_SHIFT_T(y) (y << 15) +#define TEMPERING_SHIFT_L(y) (y >> 18) + +static unsigned long mt[MP3_DITH_N]; /* the array for the state vector */ +static int mti=MP3_DITH_N+1; /* mti==MP3_DITH_N+1 means mt[MP3_DITH_N] is not initialized */ + +/* initializing the array with a NONZERO seed */ +void sgenrand(unsigned long seed) +{ + /* setting initial seeds to mt[MP3_DITH_N] using */ + /* the generator Line 25 of Table 1 in */ + /* [KNUTH 1981, The Art of Computer Programming */ + /* Vol. 2 (2nd Ed.), pp102] */ + mt[0]= seed & 0xffffffff; + for (mti=1; mti= MP3_DITH_N) { /* generate MP3_DITH_N words at one time */ + int kk; + + if (mti == MP3_DITH_N+1) /* if sgenrand() has not been called, */ + sgenrand(4357); /* a default initial seed is used */ + + for (kk=0;kk> 1) ^ mag01[y & 0x1]; + } + for (;kk> 1) ^ mag01[y & 0x1]; + } + y = (mt[MP3_DITH_N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK); + mt[MP3_DITH_N-1] = mt[MP3_DITH_M-1] ^ (y >> 1) ^ mag01[y & 0x1]; + + mti = 0; + } + + y = mt[mti++]; + y ^= TEMPERING_SHIFT_U(y); + y ^= TEMPERING_SHIFT_S(y) & TEMPERING_MASK_B; + y ^= TEMPERING_SHIFT_T(y) & TEMPERING_MASK_C; + y ^= TEMPERING_SHIFT_L(y); + + return y; +} + +long triangular_dither_noise(int nbits) { + // parameter nbits : the peak-to-peak amplitude desired (in bits) + // use with nbits set to 2 + nber of bits to be trimmed. + // (because triangular is made from two uniformly distributed processes, + // it starts at 2 bits peak-to-peak amplitude) + // see The Theory of Dithered Quantization by Robert Alexander Wannamaker + // for complete proof of why that's optimal + + long v = (genrand()/2 - genrand()/2); // in ]-2^31, 2^31[ + //int signe = (v>0) ? 1 : -1; + long P = 1 << (32 - nbits); // the power of 2 + v /= P; + // now v in ]-2^(nbits-1), 2^(nbits-1) [ + + return v; +} + +#endif // MP3_DITHERING + +/************************ decoder functions ***************************/ + +/* +================= +S_MP3_Scale + +Converts the signal to 16 bit LE-PCM data and does dithering. + +- borrowed from xmms-mad plugin source. +================= +*/ + +/* + * xmms-mad - mp3 plugin for xmms + * Copyright (C) 2001-2002 Sam Clegg + */ + +signed int S_MP3_Scale(mad_fixed_t sample) +{ + int n_bits_to_loose = MAD_F_FRACBITS + 1 - 16; +#ifdef MP3_DITHERING + int dither; +#endif + + // round + sample += (1L << (n_bits_to_loose - 1)); + +#ifdef MP3_DITHERING + dither = triangular_dither_noise(n_bits_to_loose + 1); + sample += dither; +#endif + + /* clip */ + if (sample >= MAD_F_ONE) + sample = MAD_F_ONE - 1; + else if (sample < -MAD_F_ONE) + sample = -MAD_F_ONE; + + /* quantize */ + return sample >> n_bits_to_loose; +} + +/* +================= +S_MP3_PCMCopy + +Copy and convert pcm data until bytecount bytes have been written. +return the position in pcm->samples. +indicate the amount of actually written bytes in wrotecnt. +================= +*/ + +int S_MP3_PCMCopy(byte *buf, struct mad_pcm *pcm, int bufofs, + int sampleofs, int bytecount, int *wrotecnt) +{ + int written = 0; + signed int sample; + int framesize = pcm->channels * MP3_SAMPLE_WIDTH; + + // add new pcm data. + while(written < bytecount && sampleofs < pcm->length) + { + sample = S_MP3_Scale(pcm->samples[0][sampleofs]); + +#ifdef Q3_BIG_ENDIAN + // output to 16 bit big endian PCM + buf[bufofs++] = (sample >> 8) & 0xff; + buf[bufofs++] = sample & 0xff; +#else + // output to 16 bit little endian PCM + buf[bufofs++] = sample & 0xff; + buf[bufofs++] = (sample >> 8) & 0xff; +#endif + + if(pcm->channels == 2) + { + sample = S_MP3_Scale(pcm->samples[1][sampleofs]); + +#ifdef Q3_BIG_ENDIAN + buf[bufofs++] = (sample >> 8) & 0xff; + buf[bufofs++] = sample & 0xff; +#else + buf[bufofs++] = sample & 0xff; + buf[bufofs++] = (sample >> 8) & 0xff; +#endif + } + + sampleofs++; + written += framesize; + } + + if(wrotecnt) + *wrotecnt = written; + + return sampleofs; +} + +/* +================= +S_MP3_Decode +================= +*/ + +// gets executed for every decoded frame. +int S_MP3_Decode(snd_stream_t *stream) +{ + struct snd_codec_mp3_info *mp3info; + struct mad_stream *madstream; + struct mad_frame *madframe; + struct mad_synth *madsynth; + struct mad_pcm *pcm; + int cursize; + int samplecount; + int needcount; + int wrote; + int retval; + + if(!stream) + return -1; + + mp3info = (struct snd_codec_mp3_info *)stream->ptr; + madstream = &mp3info->madstream; + madframe = &mp3info->madframe; + + if(mad_frame_decode(madframe, madstream)) + { + if(madstream->error == MAD_ERROR_BUFLEN) + { + // we need more data. Read another chunk. + retval = S_MP3_ReadData(stream, madstream, mp3info->encbuf, sizeof(mp3info->encbuf)); + + // call myself again now that buffer is full. + if(retval > 0) + retval = S_MP3_Decode(stream); + } + else if(MAD_RECOVERABLE(madstream->error)) + { + mad_stream_skip(madstream, madstream->skiplen); + return S_MP3_Decode(stream); + } + else + retval = -1; + + return retval; + } + + // check whether this really is an mp3 + if(madframe->header.layer != MAD_LAYER_III) + return -1; + + // generate pcm data + madsynth = &mp3info->madsynth; + mad_synth_frame(madsynth, madframe); + + pcm = &madsynth->pcm; + + // perform a few checks to see whether something changed that shouldn't. + + if(stream->info.rate != pcm->samplerate || + stream->info.channels != pcm->channels) + { + return -1; + } + // see whether we have got enough data now. + cursize = pcm->length * pcm->channels * stream->info.width; + needcount = mp3info->destsize - mp3info->destlen; + + // Copy exactly as many samples as required. + samplecount = S_MP3_PCMCopy(mp3info->dest, pcm, + mp3info->destlen, 0, needcount, &wrote); + mp3info->destlen += wrote; + + if(samplecount < pcm->length) + { + // Not all samples got copied. Copy the rest into the pcm buffer. + samplecount = S_MP3_PCMCopy(mp3info->pcmbuf, pcm, + mp3info->buflen, + samplecount, + mp3info->pcmbufsize - mp3info->buflen, + &wrote); + mp3info->buflen += wrote; + + + if(samplecount < pcm->length) + { + // The pcm buffer was not large enough. Make it bigger. + byte *newbuf = (byte *)Z_Malloc(cursize); + + if(mp3info->pcmbuf) + { + Com_Memcpy(newbuf, mp3info->pcmbuf, mp3info->buflen); + Z_Free(mp3info->pcmbuf); + } + + mp3info->pcmbuf = newbuf; + mp3info->pcmbufsize = cursize; + + samplecount = S_MP3_PCMCopy(mp3info->pcmbuf, pcm, + mp3info->buflen, + samplecount, + mp3info->pcmbufsize - mp3info->buflen, + &wrote); + mp3info->buflen += wrote; + } + + // we're definitely done. + retval = 0; + } + else if(mp3info->destlen >= mp3info->destsize) + retval = 0; + else + retval = 1; + + return retval; +} + +/*************** Callback functions for quake3 ***************/ + +/* +================= +S_MP3_CodecOpenStream +================= +*/ + +snd_stream_t *S_MP3_CodecOpenStream(const char *filename) +{ + snd_stream_t *stream; + struct snd_codec_mp3_info *mp3info; + + // Open the stream + stream = S_CodecUtilOpen(filename, &mp3_codec); + if(!stream || stream->length <= 0) + return NULL; + + // We have to scan through the MP3 to determine the important mp3 info. + if(S_MP3_Scanfile(stream) < 0) + { + // scanning didn't work out... + S_CodecUtilClose(&stream); + return NULL; + } + + // Initialize the mp3 info structure we need for streaming + mp3info = (struct snd_codec_mp3_info *)Z_Malloc(sizeof(*mp3info)); + if(!mp3info) + { + S_CodecUtilClose(&stream); + return NULL; + } + + stream->ptr = mp3info; + + // initialize the libmad control structures. + mad_stream_init(&mp3info->madstream); + mad_frame_init(&mp3info->madframe); + mad_synth_init(&mp3info->madsynth); + + if(S_MP3_ReadData(stream, &mp3info->madstream, mp3info->encbuf, sizeof(mp3info->encbuf)) <= 0) + { + // we didnt read anything, that's bad. + S_MP3_CodecCloseStream(stream); + return NULL; + } + + return stream; +} + +/* +================= +S_MP3_CodecCloseStream +================= +*/ + +// free all memory we allocated. +void S_MP3_CodecCloseStream(snd_stream_t *stream) +{ + struct snd_codec_mp3_info *mp3info; + + if(!stream) + return; + + // free all data in our mp3info tree + + if(stream->ptr) + { + mp3info = (struct snd_codec_mp3_info *)stream->ptr; + + if(mp3info->pcmbuf) + Z_Free(mp3info->pcmbuf); + + mad_synth_finish(&mp3info->madsynth); + mad_frame_finish(&mp3info->madframe); + mad_stream_finish(&mp3info->madstream); + + Z_Free(stream->ptr); + } + + S_CodecUtilClose(&stream); +} + +/* +================= +S_MP3_CodecReadStream +================= +*/ +int S_MP3_CodecReadStream(snd_stream_t *stream, int bytes, void *buffer) +{ + struct snd_codec_mp3_info *mp3info; + int retval; + + if(!stream) + return -1; + + mp3info = (struct snd_codec_mp3_info *)stream->ptr; + + // Make sure we get complete frames all the way through. + bytes -= bytes % (stream->info.channels * stream->info.width); + + if(mp3info->buflen) + { + if(bytes < mp3info->buflen) + { + // we still have enough bytes in our decoded pcm buffer + Com_Memcpy(buffer, mp3info->pcmbuf, bytes); + + // remove the portion from our buffer. + mp3info->buflen -= bytes; + memmove(mp3info->pcmbuf, &mp3info->pcmbuf[bytes], mp3info->buflen); + return bytes; + } + else + { + // copy over the samples we already have. + Com_Memcpy(buffer, mp3info->pcmbuf, mp3info->buflen); + mp3info->destlen = mp3info->buflen; + mp3info->buflen = 0; + } + } + else + mp3info->destlen = 0; + + mp3info->dest = (byte *)buffer; + mp3info->destsize = bytes; + + do + { + retval = S_MP3_Decode(stream); + } while(retval > 0); + + // if there was an error return nothing. + if(retval < 0) + return 0; + + return mp3info->destlen; +} + +/* +===================================================================== +S_MP3_CodecLoad + +We handle S_MP3_CodecLoad as a special case of the streaming functions +where we read the whole stream at once. ++====================================================================== +*/ +void *S_MP3_CodecLoad(const char *filename, snd_info_t *info) +{ + snd_stream_t *stream; + byte *pcmbuffer; + + // check if input is valid + if(!filename) + return NULL; + + stream = S_MP3_CodecOpenStream(filename); + + if(!stream) + return NULL; + + // copy over the info + info->rate = stream->info.rate; + info->width = stream->info.width; + info->channels = stream->info.channels; + info->samples = stream->info.samples; + info->dataofs = stream->info.dataofs; + + // allocate enough buffer for all pcm data + pcmbuffer = (byte *)Hunk_AllocateTempMemory( stream->info.size ); + if(!pcmbuffer) + { + S_MP3_CodecCloseStream(stream); + return NULL; + } + + info->size = S_MP3_CodecReadStream(stream, stream->info.size, pcmbuffer); + + if(info->size <= 0) + { + // we didn't read anything at all. darn. + Hunk_FreeTempMemory( pcmbuffer ); + pcmbuffer = NULL; + } + + S_MP3_CodecCloseStream(stream); + + return pcmbuffer; +} +``` + + + + + + + + + + + + + + + + + + From bdb1caec3f3ed5c2c9a78ed0a13aca080216a694 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Mon, 28 Dec 2015 20:26:21 -0600 Subject: [PATCH 118/445] Update sound-code-declutter.md Whoops, this link was supposed to be snd_dma. --- documentation/developer/sound-code-declutter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/developer/sound-code-declutter.md b/documentation/developer/sound-code-declutter.md index 85a4f8228d..7dbc82987a 100644 --- a/documentation/developer/sound-code-declutter.md +++ b/documentation/developer/sound-code-declutter.md @@ -25,7 +25,7 @@ OpenAL Interface split off into its own interface file: - https://github.com/ioquake/ioq3/blob/master/code/client/snd_openal.c "Q3" sound interface by itself: -- https://github.com/ioquake/ioq3/blob/master/code/client/snd_openal.c +- https://github.com/ioquake/ioq3/blob/master/code/client/snd_dma.c Other stuff: - The ambient sound code could be rewritten and spun off probably with some of wonko's new file and string parsing code (it does not use the genericparser class though) From 2975d38f5c4a0c78df182fef2afaa54555fb59ce Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sun, 3 Jan 2016 21:29:41 -0600 Subject: [PATCH 119/445] Shared: Allow console key usage for text input with alt key. Fixes issue on German layouts where ^ is the console key which prevented using color codes. --- shared/sdl/sdl_input.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/sdl/sdl_input.cpp b/shared/sdl/sdl_input.cpp index 87b3cd24e8..02097f515e 100644 --- a/shared/sdl/sdl_input.cpp +++ b/shared/sdl/sdl_input.cpp @@ -372,7 +372,7 @@ static fakeAscii_t IN_TranslateSDLToJKKey( SDL_Keysym *keysym, qboolean down ) { if( in_keyboardDebug->integer ) IN_PrintKey( keysym, key, down ); - if( IN_IsConsoleKey( key, 0 ) ) + if( IN_IsConsoleKey( key, 0 ) && !kg.keys[A_ALT].down ) { // Console keys can't be bound or generate characters key = A_CONSOLE; From 37dd18aa953330883c9c396984eb3d9bc90458f8 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sun, 3 Jan 2016 21:31:57 -0600 Subject: [PATCH 120/445] Shared: Fix Windows file list extension check Windows' Sys_ListFiles would add files that contain the extension anywhere, not only at the end of the file name. Example: "word.pk3omghacks" use to be loaded as a pk3 file. Merged from ioquake/ioq3@993b838f2766c49d176793b15d9464a4e51fc9c8 --- shared/sys/sys_win32.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/shared/sys/sys_win32.cpp b/shared/sys/sys_win32.cpp index f93658e5d1..23b79c729e 100644 --- a/shared/sys/sys_win32.cpp +++ b/shared/sys/sys_win32.cpp @@ -379,6 +379,7 @@ char **Sys_ListFiles( const char *directory, const char *extension, char *filter intptr_t findhandle; int flag; int i; + int extLen; if (filter) { @@ -412,6 +413,8 @@ char **Sys_ListFiles( const char *directory, const char *extension, char *filter flag = _A_SUBDIR; } + extLen = strlen( extension ); + Com_sprintf( search, sizeof(search), "%s\\*%s", directory, extension ); // search @@ -425,6 +428,14 @@ char **Sys_ListFiles( const char *directory, const char *extension, char *filter do { if ( (!wantsubs && flag ^ ( findinfo.attrib & _A_SUBDIR )) || (wantsubs && findinfo.attrib & _A_SUBDIR) ) { + if (*extension) { + if ( strlen( findinfo.name ) < extLen || + Q_stricmp( + findinfo.name + strlen( findinfo.name ) - extLen, + extension ) ) { + continue; // didn't match + } + } if ( nfiles == MAX_FOUND_FILES - 1 ) { break; } From 2fb8a4e757203f7f8f545e5c6eecc8789678269a Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sun, 3 Jan 2016 21:36:25 -0600 Subject: [PATCH 121/445] SP: Use prefix increment on STL iterators --- code/game/NPC_combat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/NPC_combat.cpp b/code/game/NPC_combat.cpp index 6fc04ec7c1..d2e2f811aa 100644 --- a/code/game/NPC_combat.cpp +++ b/code/game/NPC_combat.cpp @@ -2794,7 +2794,7 @@ int NPC_FindCombatPoint( const vec3_t position, const vec3_t avoidPosition, vec3 } NPC_CollectCombatPoints( destPosition, collRad, points, flags );//position - for ( cpi = points.begin(); cpi != points.end(); cpi++ ) + for ( cpi = points.begin(); cpi != points.end(); ++cpi ) { const int i = (*cpi).second; From db94c70b13df7ca22072f846ea324ff451b0ceb4 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sun, 3 Jan 2016 21:40:22 -0600 Subject: [PATCH 122/445] SP: Fix saberColor cheat. After the previous attempt to fix improper validation in 96b88692c66ffc4c26892518361444df17a2960b it became unusable because it required all 8 colors to be there. --- code/game/g_svcmds.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/game/g_svcmds.cpp b/code/game/g_svcmds.cpp index 6384a83ede..985d477c43 100644 --- a/code/game/g_svcmds.cpp +++ b/code/game/g_svcmds.cpp @@ -260,16 +260,14 @@ static void Svcmd_SaberColor_f() const char *color[MAX_BLADES]; int bladeNum; - bool validColors = true; for ( bladeNum = 0; bladeNum < MAX_BLADES; bladeNum++ ) { color[bladeNum] = gi.argv(2+bladeNum); - validColors = validColors && VALIDSTRING( color[ bladeNum ] ); } - if ( !validColors || saberNum < 1 || saberNum > 2 ) + if ( saberNum < 1 || saberNum > 2 || gi.argc() < 3 ) { - gi.Printf( "Usage: saberColor ... \n" ); + gi.Printf( "Usage: saberColor ... \n" ); gi.Printf( "valid saberNums: 1 or 2\n" ); gi.Printf( "valid colors: red, orange, yellow, green, blue, and purple\n" ); From 016304a537e578d2bc5c179c62f442887ba269b3 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Tue, 5 Jan 2016 16:11:12 -0600 Subject: [PATCH 123/445] JK2: Fix FX code causing failure to build post genericparser changes in JKA SP codebase. --- codeJK2/cgame/FxScheduler.cpp | 146 ++-- codeJK2/cgame/FxScheduler.h | 148 ++-- codeJK2/cgame/FxSystem.cpp | 14 +- codeJK2/cgame/FxSystem.h | 8 +- codeJK2/cgame/FxTemplate.cpp | 1332 ++++++++++--------------------- codeJK2/game/CMakeLists.txt | 6 +- codeJK2/game/genericparser2.cpp | 1141 ++++---------------------- codeJK2/game/genericparser2.h | 296 +++---- codeJK2/qcommon/safe/memory.h | 99 +++ 9 files changed, 963 insertions(+), 2227 deletions(-) create mode 100644 codeJK2/qcommon/safe/memory.h diff --git a/codeJK2/cgame/FxScheduler.cpp b/codeJK2/cgame/FxScheduler.cpp index 3ca3ae6831..ff28306d47 100644 --- a/codeJK2/cgame/FxScheduler.cpp +++ b/codeJK2/cgame/FxScheduler.cpp @@ -38,6 +38,7 @@ along with this program; if not, see . #include "cg_media.h" +#include "qcommon/safe/string.h" #include @@ -168,7 +169,7 @@ void CFxScheduler::Clean(bool bRemoveTemplates /*= true*/, int idToPreserve /*= // Return: // int handle to the effect //------------------------------------------------------ -int CFxScheduler::RegisterEffect( const char *file, bool bHasCorrectPath /*= false*/ ) +int CFxScheduler::RegisterEffect( const char *path, bool bHasCorrectPath /*= false*/ ) { // Dealing with file names: // File names can come from two places - the editor, in which case we should use the given @@ -176,93 +177,69 @@ int CFxScheduler::RegisterEffect( const char *file, bool bHasCorrectPath /*= fal // In either case we create a stripped file name to use for naming effects. // - char sfile[MAX_QPATH]; + // FIXME: this could maybe be a cstring_view, if mEffectIDs were to use a transparent comparator, but those were only added in C++14, which we don't support yet (sigh) + char filenameNoExt[MAX_QPATH]; // Get an extension stripped version of the file if (bHasCorrectPath) { - const char *last = file, *p = file; - + // FIXME: this is basically COM_SkipPath, except it also accepts '\\' instead of '/' + const char *last = path, *p = path; while (*p != '\0') { if ((*p == '/') || (*p == '\\')) { last = p + 1; } - p++; } - COM_StripExtension( last, sfile, sizeof(sfile) ); + COM_StripExtension( last, filenameNoExt, sizeof( filenameNoExt ) ); } else { - COM_StripExtension( file, sfile, sizeof(sfile) ); + COM_StripExtension( path, filenameNoExt, sizeof( filenameNoExt ) ); } // see if the specified file is already registered. If it is, just return the id of that file TEffectID::iterator itr; - itr = mEffectIDs.find( sfile ); + itr = mEffectIDs.find( filenameNoExt ); if ( itr != mEffectIDs.end() ) { return (*itr).second; } - CGenericParser2 parser; - int len = 0; - fileHandle_t fh; - char data[65536]; - char temp[MAX_QPATH]; + char correctFilenameBuffer[MAX_QPATH]; const char *pfile; - char *bufParse = 0; - if (bHasCorrectPath) { - pfile = file; + pfile = path; } else { // Add on our extension and prepend the file with the default path - sprintf( temp, "%s/%s.efx", FX_FILE_PATH, sfile ); - pfile = temp; - } - - len = theFxHelper.OpenFile( pfile, &fh, FS_READ ); - - if ( len < 0 ) - { - theFxHelper.Print( "Effect file load failed: %s\n", pfile ); - return 0; + Com_sprintf( correctFilenameBuffer, sizeof( correctFilenameBuffer ), "%s/%s.efx", FX_FILE_PATH, filenameNoExt ); + pfile = correctFilenameBuffer; } - if (len == 0) - { - theFxHelper.Print( "INVALID Effect file: %s\n", pfile ); - theFxHelper.CloseFile( fh ); - return 0; - } - - // If we'll overflow our buffer, bail out--not a particularly elegant solution - if (len >= (int)sizeof(data) - 1 ) + // Let the generic parser process the whole file + CGenericParser2 parser; + if( !parser.Parse( pfile ) ) { - theFxHelper.CloseFile( fh ); - return 0; + if( !parser.ValidFile() ) + { + theFxHelper.Print( "RegisterEffect: INVALID file: %s\n", pfile ); + } + return false; + if( parser.ValidFile() ) + { + return false; + } } - - // Get the goods and ensure Null termination - theFxHelper.ReadFile( data, len, fh ); - data[len] = '\0'; - bufParse = data; - - // Let the generic parser process the whole file - parser.Parse( &bufParse ); - - theFxHelper.CloseFile( fh ); - // Lets convert the effect file into something that we can work with - return ParseEffect( sfile, parser.GetBaseParseGroup() ); + return ParseEffect( filenameNoExt, parser.GetBaseParseGroup() ); } @@ -280,33 +257,10 @@ int CFxScheduler::RegisterEffect( const char *file, bool bHasCorrectPath /*= fal // int handle of the effect //------------------------------------------------------ -struct primitiveType_s { const char *name; EPrimType type; } primitiveTypes[] = { - { "particle", Particle }, - { "line", Line }, - { "tail", Tail }, - { "sound", Sound }, - { "cylinder", Cylinder }, - { "electricity", Electricity }, - { "emitter", Emitter }, - { "decal", Decal }, - { "orientedparticle", OrientedParticle }, - { "fxrunner", FxRunner }, - { "light", Light }, - { "cameraShake", CameraShake }, - { "flash", ScreenFlash }, -}; -static const size_t numPrimitiveTypes = ARRAY_LEN( primitiveTypes ); - -int CFxScheduler::ParseEffect( const char *file, CGPGroup *base ) +int CFxScheduler::ParseEffect( const char *file, const CGPGroup& base ) { - CGPGroup *primitiveGroup; - CPrimitiveTemplate *prim; - const char *grpName; - SEffectTemplate *effect = 0; - EPrimType type; - int handle; - - effect = GetNewEffectTemplate( &handle, file ); + int handle; + SEffectTemplate* effect = GetNewEffectTemplate( &handle, file ); if ( !handle || !effect ) { @@ -314,32 +268,34 @@ int CFxScheduler::ParseEffect( const char *file, CGPGroup *base ) return 0; } - primitiveGroup = base->GetSubGroups(); - - while ( primitiveGroup ) + for( const auto& primitiveGroup : base.GetSubGroups() ) { - grpName = primitiveGroup->GetName(); - - type = None; - for ( size_t i=0; i primitiveTypes{ + { CSTRING_VIEW( "particle" ), Particle }, + { CSTRING_VIEW( "line" ), Line }, + { CSTRING_VIEW( "tail" ), Tail }, + { CSTRING_VIEW( "sound" ), Sound }, + { CSTRING_VIEW( "cylinder" ), Cylinder }, + { CSTRING_VIEW( "electricity" ), Electricity }, + { CSTRING_VIEW( "emitter" ), Emitter }, + { CSTRING_VIEW( "decal" ), Decal }, + { CSTRING_VIEW( "orientedparticle" ), OrientedParticle }, + { CSTRING_VIEW( "fxrunner" ), FxRunner }, + { CSTRING_VIEW( "light" ), Light }, + { CSTRING_VIEW( "cameraShake" ), CameraShake }, + { CSTRING_VIEW( "flash" ), ScreenFlash } + }; + auto pos = primitiveTypes.find( primitiveGroup.GetName() ); + if( pos != primitiveTypes.end() ) { - prim = new CPrimitiveTemplate; + CPrimitiveTemplate *prim = new CPrimitiveTemplate; - prim->mType = type; + prim->mType = pos->second; prim->ParsePrimitive( primitiveGroup ); // Add our primitive template to the effect list AddPrimitiveToEffect( effect, prim ); } - - primitiveGroup = (CGPGroup *)primitiveGroup->GetNext(); } return handle; @@ -412,7 +368,7 @@ SEffectTemplate *CFxScheduler::GetNewEffectTemplate( int *id, const char *file ) theFxHelper.Print( "FxScheduler: Error--reached max effects\n" ); *id = 0; - return 0; + return nullptr; } //------------------------------------------------------ @@ -1219,7 +1175,7 @@ void CFxScheduler::AddScheduledEffects( void ) // Return: // none //------------------------------------------------------ -void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t axis[3], int lateTime ) +void CFxScheduler::CreateEffect( CPrimitiveTemplate *fx, const vec3_t origin, vec3_t axis[3], int lateTime ) { vec3_t org, org2, temp, vel, accel, diff --git a/codeJK2/cgame/FxScheduler.h b/codeJK2/cgame/FxScheduler.h index 26bed86d9b..5e6eb36263 100644 --- a/codeJK2/cgame/FxScheduler.h +++ b/codeJK2/cgame/FxScheduler.h @@ -28,13 +28,16 @@ along with this program; if not, see . #include "../../code/qcommon/sstring.h" typedef sstring_t fxString_t; +#include "../game/genericparser2.h" +#include "qcommon/safe/string.h" + #ifndef FX_SCHEDULER_H_INC #define FX_SCHEDULER_H_INC #define FX_FILE_PATH "effects" #define FX_MAX_TRACE_DIST WORLD_SIZE -#define FX_MAX_EFFECTS 128 // how many effects the system can store +#define FX_MAX_EFFECTS 150 // how many effects the system can store #define FX_MAX_EFFECT_COMPONENTS 24 // how many primitives an effect can hold, this should be plenty #define FX_MAX_PRIM_NAME 32 @@ -79,7 +82,7 @@ class CMediaHandles { private: - vector mMediaList; + std::vector mMediaList; public: @@ -268,87 +271,94 @@ class CPrimitiveTemplate CFxRange mElasticity; +private: // Lower level parsing utilities - bool ParseVector( const char *val, vec3_t min, vec3_t max ); - bool ParseFloat( const char *val, float *min, float *max ); - bool ParseGroupFlags( const char *val, int *flags ); + bool ParseVector( const gsl::cstring_view& val, vec3_t min, vec3_t max ); + bool ParseFloat( const gsl::cstring_view& val, float& min, float& max ); + bool ParseGroupFlags( const gsl::cstring_view& val, int& flags ); // Base key processing // Note that these all have their own parse functions in case it becomes important to do certain kinds // of validation specific to that type. - bool ParseMin( const char *val ); - bool ParseMax( const char *val ); - bool ParseDelay( const char *val ); - bool ParseCount( const char *val ); - bool ParseLife( const char *val ); - bool ParseElasticity( const char *val ); - bool ParseFlags( const char *val ); - bool ParseSpawnFlags( const char *val ); - - bool ParseOrigin1( const char *val ); - bool ParseOrigin2( const char *val ); - bool ParseRadius( const char *val ); - bool ParseHeight( const char *val ); - bool ParseRotation( const char *val ); - bool ParseRotationDelta( const char *val ); - bool ParseAngle( const char *val ); - bool ParseAngleDelta( const char *val ); - bool ParseVelocity( const char *val ); - bool ParseAcceleration( const char *val ); - bool ParseGravity( const char *val ); - bool ParseDensity( const char *val ); - bool ParseVariance( const char *val ); - + bool ParseMin( const gsl::cstring_view& val ); + bool ParseMax( const gsl::cstring_view& val ); + bool ParseDelay( const gsl::cstring_view& val ); + bool ParseCount( const gsl::cstring_view& val ); + bool ParseLife( const gsl::cstring_view& val ); + bool ParseElasticity( const gsl::cstring_view& val ); + bool ParseFlags( const gsl::cstring_view& val ); + bool ParseSpawnFlags( const gsl::cstring_view& val ); + + bool ParseOrigin1( const gsl::cstring_view& val ); + bool ParseOrigin2( const gsl::cstring_view& val ); + bool ParseRadius( const gsl::cstring_view& val ); + bool ParseHeight( const gsl::cstring_view& val ); + bool ParseRotation( const gsl::cstring_view& val ); + bool ParseRotationDelta( const gsl::cstring_view& val ); + bool ParseAngle( const gsl::cstring_view& val ); + bool ParseAngleDelta( const gsl::cstring_view& val ); + bool ParseVelocity( const gsl::cstring_view& val ); + bool ParseAcceleration( const gsl::cstring_view& val ); + bool ParseGravity( const gsl::cstring_view& val ); + bool ParseDensity( const gsl::cstring_view& val ); + bool ParseVariance( const gsl::cstring_view& val ); + + /// Case insensitive map from cstring_view to Value + template< typename Value > + using StringViewIMap = std::map< gsl::cstring_view, Value, Q::CStringViewILess >; + using ParseMethod = bool ( CPrimitiveTemplate::* )( const gsl::cstring_view& ); // Group type processing - bool ParseRGB( CGPGroup *grp ); - bool ParseAlpha( CGPGroup *grp ); - bool ParseSize( CGPGroup *grp ); - bool ParseSize2( CGPGroup *grp ); - bool ParseLength( CGPGroup *grp ); - - bool ParseModels( CGPValue *grp ); - bool ParseShaders( CGPValue *grp ); - bool ParseSounds( CGPValue *grp ); - - bool ParseImpactFxStrings( CGPValue *grp ); - bool ParseDeathFxStrings( CGPValue *grp ); - bool ParseEmitterFxStrings( CGPValue *grp ); - bool ParsePlayFxStrings( CGPValue *grp ); + bool ParseGroup( const CGPGroup& grp, const StringViewIMap< ParseMethod >& parseMethods, gsl::czstring name ); + bool ParseRGB( const CGPGroup& grp ); + bool ParseAlpha( const CGPGroup& grp ); + bool ParseSize( const CGPGroup& grp ); + bool ParseSize2( const CGPGroup& grp ); + bool ParseLength( const CGPGroup& grp ); + + bool ParseModels( const CGPProperty& grp ); + bool ParseShaders( const CGPProperty& grp ); + bool ParseSounds( const CGPProperty& grp ); + + bool ParseImpactFxStrings( const CGPProperty& grp ); + bool ParseDeathFxStrings( const CGPProperty& grp ); + bool ParseEmitterFxStrings( const CGPProperty& grp ); + bool ParsePlayFxStrings( const CGPProperty& grp ); // Group keys - bool ParseRGBStart( const char *val ); - bool ParseRGBEnd( const char *val ); - bool ParseRGBParm( const char *val ); - bool ParseRGBFlags( const char *val ); + bool ParseRGBStart( const gsl::cstring_view& val ); + bool ParseRGBEnd( const gsl::cstring_view& val ); + bool ParseRGBParm( const gsl::cstring_view& val ); + bool ParseRGBFlags( const gsl::cstring_view& val ); - bool ParseAlphaStart( const char *val ); - bool ParseAlphaEnd( const char *val ); - bool ParseAlphaParm( const char *val ); - bool ParseAlphaFlags( const char *val ); + bool ParseAlphaStart( const gsl::cstring_view& val ); + bool ParseAlphaEnd( const gsl::cstring_view& val ); + bool ParseAlphaParm( const gsl::cstring_view& val ); + bool ParseAlphaFlags( const gsl::cstring_view& val ); - bool ParseSizeStart( const char *val ); - bool ParseSizeEnd( const char *val ); - bool ParseSizeParm( const char *val ); - bool ParseSizeFlags( const char *val ); + bool ParseSizeStart( const gsl::cstring_view& val ); + bool ParseSizeEnd( const gsl::cstring_view& val ); + bool ParseSizeParm( const gsl::cstring_view& val ); + bool ParseSizeFlags( const gsl::cstring_view& val ); - bool ParseSize2Start( const char *val ); - bool ParseSize2End( const char *val ); - bool ParseSize2Parm( const char *val ); - bool ParseSize2Flags( const char *val ); + bool ParseSize2Start( const gsl::cstring_view& val ); + bool ParseSize2End( const gsl::cstring_view& val ); + bool ParseSize2Parm( const gsl::cstring_view& val ); + bool ParseSize2Flags( const gsl::cstring_view& val ); - bool ParseLengthStart( const char *val ); - bool ParseLengthEnd( const char *val ); - bool ParseLengthParm( const char *val ); - bool ParseLengthFlags( const char *val ); + bool ParseLengthStart( const gsl::cstring_view& val ); + bool ParseLengthEnd( const gsl::cstring_view& val ); + bool ParseLengthParm( const gsl::cstring_view& val ); + bool ParseLengthFlags( const gsl::cstring_view& val ); public: CPrimitiveTemplate(); + CPrimitiveTemplate( const CPrimitiveTemplate& rhs ); ~CPrimitiveTemplate() {}; - bool ParsePrimitive( CGPGroup *grp ); + bool ParsePrimitive( const CGPGroup& grp ); void operator=(const CPrimitiveTemplate &that); }; @@ -363,9 +373,9 @@ struct SEffectTemplate bool mCopy; char mEffectName[MAX_QPATH]; // is this extraneous?? int mPrimitiveCount; - CPrimitiveTemplate *mPrimitives[FX_MAX_EFFECT_COMPONENTS]; + CPrimitiveTemplate *mPrimitives[FX_MAX_EFFECT_COMPONENTS]; - bool operator == (const char * name) const + bool operator == (const char * name) const { return !Q_stricmp( mEffectName, name ); } @@ -406,9 +416,9 @@ class CFxScheduler }; // this makes looking up the index based on the string name much easier - typedef map TEffectID; + typedef std::map TEffectID; - typedef list TScheduledEffect; + typedef std::list TScheduledEffect; // Effects SEffectTemplate mEffectTemplates[FX_MAX_EFFECTS]; @@ -422,9 +432,9 @@ class CFxScheduler SEffectTemplate *GetNewEffectTemplate( int *id, const char *file ); void AddPrimitiveToEffect( SEffectTemplate *fx, CPrimitiveTemplate *prim ); - int ParseEffect( const char *file, CGPGroup *base ); + int ParseEffect( const char *file, const CGPGroup& base ); - void CreateEffect( CPrimitiveTemplate *fx, vec3_t origin, vec3_t axis[3], int lateTime ); + void CreateEffect( CPrimitiveTemplate *fx, const vec3_t origin, vec3_t axis[3], int lateTime ); void CreateEffect( CPrimitiveTemplate *fx, int clientID, int lateTime ); public: diff --git a/codeJK2/cgame/FxSystem.cpp b/codeJK2/cgame/FxSystem.cpp index e9443b33ee..96b4e56cee 100644 --- a/codeJK2/cgame/FxSystem.cpp +++ b/codeJK2/cgame/FxSystem.cpp @@ -121,21 +121,23 @@ void SFxHelper::AddFxToScene( refEntity_t *ent ) } //------------------------------------------------------ -int SFxHelper::RegisterShader( const char *shader ) +int SFxHelper::RegisterShader( const gsl::cstring_view& shader ) { - return cgi_R_RegisterShader( shader ); + // TODO: it would be nice to change the ABI here to allow for passing of string views + return cgi_R_RegisterShader( std::string( shader.begin(), shader.end() ).c_str() ); } //------------------------------------------------------ -int SFxHelper::RegisterSound( const char *sound ) +int SFxHelper::RegisterSound( const gsl::cstring_view& sound ) { - return cgi_S_RegisterSound( sound ); + // TODO: it would be nice to change the ABI here to allow for passing of string views + return cgi_S_RegisterSound( std::string( sound.begin(), sound.end() ).c_str() ); } //------------------------------------------------------ -int SFxHelper::RegisterModel( const char *model ) +int SFxHelper::RegisterModel( const gsl::cstring_view& model ) { - return cgi_R_RegisterModel( model ); + return cgi_R_RegisterModel( std::string( model.begin(), model.end() ).c_str() ); } //------------------------------------------------------ diff --git a/codeJK2/cgame/FxSystem.h b/codeJK2/cgame/FxSystem.h index e5f35e6598..e1bd1df724 100644 --- a/codeJK2/cgame/FxSystem.h +++ b/codeJK2/cgame/FxSystem.h @@ -27,6 +27,8 @@ along with this program; if not, see . #ifndef FX_SYSTEM_H_INC #define FX_SYSTEM_H_INC +#include "qcommon/safe/gsl.h" + #define irand Q_irand #define flrand Q_flrand @@ -77,7 +79,7 @@ struct SFxHelper // Sound void PlaySound( vec3_t origin, int entityNum, int entchannel, sfxHandle_t sfx ); - int RegisterSound( const char *sound ); + int RegisterSound( const gsl::cstring_view& sound ); // Physics/collision void Trace( trace_t *tr, vec3_t start, vec3_t min, vec3_t max, vec3_t end, int skipEntNum, int flags ); @@ -85,8 +87,8 @@ struct SFxHelper void AddFxToScene( refEntity_t *ent ); void AddLightToScene( vec3_t org, float radius, float red, float green, float blue ); - int RegisterShader( const char *shader ); - int RegisterModel( const char *model ); + int RegisterShader( const gsl::cstring_view& shader ); + int RegisterModel( const gsl::cstring_view& model ); void AddPolyToScene( int shader, int count, polyVert_t *verts ); diff --git a/codeJK2/cgame/FxTemplate.cpp b/codeJK2/cgame/FxTemplate.cpp index 4c7ad59622..b95ee11ab8 100644 --- a/codeJK2/cgame/FxTemplate.cpp +++ b/codeJK2/cgame/FxTemplate.cpp @@ -24,6 +24,11 @@ along with this program; if not, see . #include "FxScheduler.h" #endif +#include "../game/genericparser2.h" +#include "qcommon/safe/string.h" + +#include + //------------------------------------------------------ // CPrimitiveTemplate // Set up our minimal default values @@ -35,7 +40,7 @@ along with this program; if not, see . // none //------------------------------------------------------ CPrimitiveTemplate::CPrimitiveTemplate() -{ +{ // We never start out as a copy or with a name mCopy = false; mName[0] = 0; @@ -174,7 +179,7 @@ void CPrimitiveTemplate::operator=(const CPrimitiveTemplate &that) //------------------------------------------------------ // ParseFloat // Removes up to two values from a passed in string and -// sets these values into the passed in min and max +// sets these values into the passed in min and max // fields. if no max is present, min is copied into it. // // input: @@ -184,16 +189,10 @@ void CPrimitiveTemplate::operator=(const CPrimitiveTemplate &that) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseFloat( const char *val, float *min, float *max ) +bool CPrimitiveTemplate::ParseFloat( const gsl::cstring_view& val, float& min, float& max ) { - // We don't allow passing in a null for either of the fields - if ( min == 0 || max == 0 ) - { // failue - return false; - } - // attempt to read out the values - int v = sscanf( val, "%f %f", min, max ); + int v = Q::sscanf( val, min, max ); if ( v == 0 ) { // nothing was there, failure @@ -201,7 +200,7 @@ bool CPrimitiveTemplate::ParseFloat( const char *val, float *min, float *max ) } else if ( v == 1 ) { // only one field entered, this is ok, but we should copy min into max - *max = *min; + max = min; } return true; @@ -221,16 +220,16 @@ bool CPrimitiveTemplate::ParseFloat( const char *val, float *min, float *max ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseVector( const char *val, vec3_t min, vec3_t max ) +bool CPrimitiveTemplate::ParseVector( const gsl::cstring_view& val, vec3_t min, vec3_t max ) { // we don't allow passing in a null - if ( min == 0 || max == 0 ) + if ( min == nullptr || max == nullptr ) { return false; } // attempt to read out our values - int v = sscanf( val, "%f %f %f %f %f %f", &min[0], &min[1], &min[2], &max[0], &max[1], &max[2] ); + int v = Q::sscanf( val, min[0], min[1], min[2], max[0], max[1], max[2] ); // Check for completeness if ( v < 3 || v == 4 || v == 5 ) @@ -245,6 +244,38 @@ bool CPrimitiveTemplate::ParseVector( const char *val, vec3_t min, vec3_t max ) return true; } +namespace detail +{ + // calls Q::sscanf with the elements of the given array as arguments + + template< std::size_t remaining > + struct ScanStrings + { + template< std::size_t count, typename... Args > + static int call( const gsl::cstring_view& val, std::array< gsl::cstring_view, count >& arr, Args&... args ) + { + return ScanStrings< remaining - 1 >::call( val, arr, arr[ remaining - 1 ], args... ); + } + }; + + template<> + struct ScanStrings< 0 > + { + template< std::size_t count, typename... Args > + static int call( const gsl::cstring_view& val, std::array< gsl::cstring_view, count >& arr, Args&... args ) + { + return Q::sscanf( val, args... ); + } + }; +} + +template< std::size_t count > +static gsl::array_view< gsl::cstring_view > scanStrings( const gsl::cstring_view& val, std::array< gsl::cstring_view, count >& arr ) +{ + int numParsed = detail::ScanStrings< count >::call( val, arr ); + return{ arr.data(), arr.data() + numParsed }; +} + //------------------------------------------------------ // ParseGroupFlags // Group flags are generic in nature, so we can easily @@ -258,53 +289,35 @@ bool CPrimitiveTemplate::ParseVector( const char *val, vec3_t min, vec3_t max ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseGroupFlags( const char *val, int *flags ) +bool CPrimitiveTemplate::ParseGroupFlags( const gsl::cstring_view& val, int& flags ) { - // Must pass in a non-null pointer - if ( flags == 0 ) - { - return false; - } - - char flag[][32] = {"\0","\0","\0","0"}; - bool ok = true; - // For a sub group, really you probably only have one or two flags set - int v = sscanf( val, "%s %s %s %s", flag[0], flag[1], flag[2], flag[3] ); + std::array< gsl::cstring_view, 4 > flag; + + const auto availableFlag = scanStrings( val, flag ); // Clear out the flags field, then convert the flag string to an actual value ( use generic flags ) - *flags = 0; + flags = 0; - for ( int i = 0; i < 4; i++ ) + bool ok = true; + for( auto& cur : availableFlag ) { - if ( i + 1 > v ) - { - return true; - } + static StringViewIMap< int > flagNames{ + { CSTRING_VIEW( "linear" ), FX_LINEAR }, + { CSTRING_VIEW( "nonlinear" ), FX_NONLINEAR }, + { CSTRING_VIEW( "wave" ), FX_WAVE }, + { CSTRING_VIEW( "random" ), FX_RAND }, + { CSTRING_VIEW( "clamp" ), FX_CLAMP }, + }; - if ( !Q_stricmp( flag[i], "linear" )) - { - *flags |= FX_LINEAR; - } - else if ( !Q_stricmp( flag[i], "nonlinear" )) + auto pos = flagNames.find( cur ); + if( pos == flagNames.end() ) { - *flags |= FX_NONLINEAR; - } - else if ( !Q_stricmp( flag[i], "wave" )) - { - *flags |= FX_WAVE; - } - else if ( !Q_stricmp( flag[i], "random" )) - { - *flags |= FX_RAND; - } - else if ( !Q_stricmp( flag[i], "clamp" )) - { - *flags |= FX_CLAMP; + ok = false; } else - { // we have badness going on, but continue on in case there are any valid fields in here - ok = false; + { + flags |= pos->second; } } @@ -321,7 +334,7 @@ bool CPrimitiveTemplate::ParseGroupFlags( const char *val, int *flags ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseMin( const char *val ) +bool CPrimitiveTemplate::ParseMin( const gsl::cstring_view& val ) { vec3_t min; @@ -347,7 +360,7 @@ bool CPrimitiveTemplate::ParseMin( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseMax( const char *val ) +bool CPrimitiveTemplate::ParseMax( const gsl::cstring_view& val ) { vec3_t max; @@ -373,11 +386,11 @@ bool CPrimitiveTemplate::ParseMax( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseLife( const char *val ) +bool CPrimitiveTemplate::ParseLife( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mLife.SetRange( min, max ); return true; @@ -396,11 +409,11 @@ bool CPrimitiveTemplate::ParseLife( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseDelay( const char *val ) +bool CPrimitiveTemplate::ParseDelay( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mSpawnDelay.SetRange( min, max ); return true; @@ -419,11 +432,11 @@ bool CPrimitiveTemplate::ParseDelay( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseCount( const char *val ) +bool CPrimitiveTemplate::ParseCount( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mSpawnCount.SetRange( min, max ); return true; @@ -442,11 +455,11 @@ bool CPrimitiveTemplate::ParseCount( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseElasticity( const char *val ) +bool CPrimitiveTemplate::ParseElasticity( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mElasticity.SetRange( min, max ); @@ -469,7 +482,7 @@ bool CPrimitiveTemplate::ParseElasticity( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseOrigin1( const char *val ) +bool CPrimitiveTemplate::ParseOrigin1( const gsl::cstring_view& val ) { vec3_t min, max; @@ -494,7 +507,7 @@ bool CPrimitiveTemplate::ParseOrigin1( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseOrigin2( const char *val ) +bool CPrimitiveTemplate::ParseOrigin2( const gsl::cstring_view& val ) { vec3_t min, max; @@ -519,11 +532,11 @@ bool CPrimitiveTemplate::ParseOrigin2( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseRadius( const char *val ) +bool CPrimitiveTemplate::ParseRadius( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mRadius.SetRange( min, max ); return true; @@ -542,11 +555,11 @@ bool CPrimitiveTemplate::ParseRadius( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseHeight( const char *val ) +bool CPrimitiveTemplate::ParseHeight( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mHeight.SetRange( min, max ); return true; @@ -565,11 +578,11 @@ bool CPrimitiveTemplate::ParseHeight( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseRotation( const char *val ) +bool CPrimitiveTemplate::ParseRotation( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == qtrue ) + if ( ParseFloat( val, min, max ) == qtrue ) { mRotation.SetRange( min, max ); return true; @@ -588,11 +601,11 @@ bool CPrimitiveTemplate::ParseRotation( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseRotationDelta( const char *val ) +bool CPrimitiveTemplate::ParseRotationDelta( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == qtrue ) + if ( ParseFloat( val, min, max ) == qtrue ) { mRotationDelta.SetRange( min, max ); return true; @@ -611,7 +624,7 @@ bool CPrimitiveTemplate::ParseRotationDelta( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseAngle( const char *val ) +bool CPrimitiveTemplate::ParseAngle( const gsl::cstring_view& val ) { vec3_t min, max; @@ -636,7 +649,7 @@ bool CPrimitiveTemplate::ParseAngle( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseAngleDelta( const char *val ) +bool CPrimitiveTemplate::ParseAngleDelta( const gsl::cstring_view& val ) { vec3_t min, max; @@ -661,7 +674,7 @@ bool CPrimitiveTemplate::ParseAngleDelta( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseVelocity( const char *val ) +bool CPrimitiveTemplate::ParseVelocity( const gsl::cstring_view& val ) { vec3_t min, max; @@ -678,7 +691,7 @@ bool CPrimitiveTemplate::ParseVelocity( const char *val ) //------------------------------------------------------ // ParseFlags -// These are flags that are not specific to a group, +// These are flags that are not specific to a group, // rather, they are specific to the whole primitive. // // input: @@ -687,69 +700,39 @@ bool CPrimitiveTemplate::ParseVelocity( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseFlags( const char *val ) +bool CPrimitiveTemplate::ParseFlags( const gsl::cstring_view& val ) { - char flag[][32] = {"\0","\0","\0","\0","\0","\0","\0"}; - bool ok = true; - // For a primitive, really you probably only have two or less flags set - int v = sscanf( val, "%s %s %s %s %s %s %s", flag[0], flag[1], flag[2], flag[3], flag[4], flag[5], flag[6] ); + std::array< gsl::cstring_view, 7 > flag; - for ( int i = 0; i < 7; i++ ) - { - if ( i + 1 > v ) - { - return true; - } + const auto availableFlag = scanStrings( val, flag ); - if ( !Q_stricmp( flag[i], "useModel" )) - { - mFlags |= FX_ATTACHED_MODEL; - } - else if ( !Q_stricmp( flag[i], "useBBox" )) - { - mFlags |= FX_USE_BBOX; - } - else if ( !Q_stricmp( flag[i], "usePhysics" )) - { - mFlags |= FX_APPLY_PHYSICS; - } - else if ( !Q_stricmp( flag[i], "expensivePhysics" )) - { - mFlags |= FX_EXPENSIVE_PHYSICS; - } - else if ( !Q_stricmp( flag[i], "impactKills" )) - { - mFlags |= FX_KILL_ON_IMPACT; - } - else if ( !Q_stricmp( flag[i], "impactFx" )) - { - mFlags |= FX_IMPACT_RUNS_FX; - } - else if ( !Q_stricmp( flag[i], "deathFx" )) - { - mFlags |= FX_DEATH_RUNS_FX; - } - else if ( !Q_stricmp( flag[i], "useAlpha" )) - { - mFlags |= FX_USE_ALPHA; - } - else if ( !Q_stricmp( flag[i], "emitFx" )) - { - mFlags |= FX_EMIT_FX; - } - else if ( !Q_stricmp( flag[i], "depthHack" )) - { - mFlags |= FX_DEPTH_HACK; - } - else if ( !Q_stricmp( flag[i], "setShaderTime" )) - { - mFlags |= FX_SET_SHADER_TIME; - } - else + bool ok = true; + for( auto& cur : availableFlag ) + { + static StringViewIMap< int > flagNames{ + { CSTRING_VIEW( "useModel" ), FX_ATTACHED_MODEL }, + { CSTRING_VIEW( "useBBox" ), FX_USE_BBOX }, + { CSTRING_VIEW( "usePhysics" ), FX_APPLY_PHYSICS }, + { CSTRING_VIEW( "expensivePhysics" ), FX_EXPENSIVE_PHYSICS }, + { CSTRING_VIEW( "impactKills" ), FX_KILL_ON_IMPACT }, + { CSTRING_VIEW( "impactFx" ), FX_IMPACT_RUNS_FX }, + { CSTRING_VIEW( "deathFx" ), FX_DEATH_RUNS_FX }, + { CSTRING_VIEW( "useAlpha" ), FX_USE_ALPHA }, + { CSTRING_VIEW( "emitFx" ), FX_EMIT_FX }, + { CSTRING_VIEW( "depthHack" ), FX_DEPTH_HACK }, + { CSTRING_VIEW( "setShaderTime" ), FX_SET_SHADER_TIME }, + }; + + auto pos = flagNames.find( cur ); + if( pos == flagNames.end() ) { // we have badness going on, but continue on in case there are any valid fields in here ok = false; } + else + { + mFlags |= pos->second; + } } return ok; @@ -757,7 +740,7 @@ bool CPrimitiveTemplate::ParseFlags( const char *val ) //------------------------------------------------------ // ParseSpawnFlags -// These kinds of flags control how things spawn. They +// These kinds of flags control how things spawn. They // never get passed on to a primitive. // // input: @@ -766,80 +749,40 @@ bool CPrimitiveTemplate::ParseFlags( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSpawnFlags( const char *val ) +bool CPrimitiveTemplate::ParseSpawnFlags( const gsl::cstring_view& val ) { - char flag[][32] = {"\0","\0","\0","\0","\0","\0","\0"}; - bool ok = true; - + std::array< gsl::cstring_view, 7 > flag; + // For a primitive, really you probably only have two or less flags set - int v = sscanf( val, "%s %s %s %s %s %s %s", flag[0], flag[1], flag[2], flag[3], flag[4], flag[5], flag[6] ); + const auto availableFlag = scanStrings( val, flag ); - for ( int i = 0; i < 7; i++ ) + bool ok = true; + for( auto& cur : availableFlag ) { - if ( i + 1 > v ) - { - return true; - } - - if ( !Q_stricmp( flag[i], "org2fromTrace" )) - { - mSpawnFlags |= FX_ORG2_FROM_TRACE; - } - else if ( !Q_stricmp( flag[i], "traceImpactFx" )) - { - mSpawnFlags |= FX_TRACE_IMPACT_FX; - } - else if ( !Q_stricmp( flag[i], "org2isOffset" )) - { - mSpawnFlags |= FX_ORG2_IS_OFFSET; - } - else if ( !Q_stricmp( flag[i], "cheapOrgCalc" )) - { - mSpawnFlags |= FX_CHEAP_ORG_CALC; - } - else if ( !Q_stricmp( flag[i], "cheapOrg2Calc" )) - { - mSpawnFlags |= FX_CHEAP_ORG2_CALC; - } - else if ( !Q_stricmp( flag[i], "absoluteVel" )) - { - mSpawnFlags |= FX_VEL_IS_ABSOLUTE; - } - else if ( !Q_stricmp( flag[i], "absoluteAccel" )) - { - mSpawnFlags |= FX_ACCEL_IS_ABSOLUTE; - } - else if ( !Q_stricmp( flag[i], "orgOnSphere" )) // sphere/ellipsoid + static StringViewIMap< int > flagNames{ + { CSTRING_VIEW( "org2fromTrace" ), FX_ORG2_FROM_TRACE }, + { CSTRING_VIEW( "traceImpactFx" ), FX_TRACE_IMPACT_FX }, + { CSTRING_VIEW( "org2isOffset" ), FX_ORG2_IS_OFFSET }, + { CSTRING_VIEW( "cheapOrgCalc" ), FX_CHEAP_ORG_CALC }, + { CSTRING_VIEW( "cheapOrg2Calc" ), FX_CHEAP_ORG2_CALC }, + { CSTRING_VIEW( "absoluteVel" ), FX_VEL_IS_ABSOLUTE }, + { CSTRING_VIEW( "absoluteAccel" ), FX_ACCEL_IS_ABSOLUTE }, + { CSTRING_VIEW( "orgOnSphere" ), FX_ORG_ON_SPHERE }, + { CSTRING_VIEW( "orgOnCylinder" ), FX_ORG_ON_CYLINDER }, + { CSTRING_VIEW( "axisFromSphere" ), FX_AXIS_FROM_SPHERE }, + { CSTRING_VIEW( "randrotaroundfwd" ), FX_RAND_ROT_AROUND_FWD }, + { CSTRING_VIEW( "evenDistribution" ), FX_EVEN_DISTRIBUTION }, + { CSTRING_VIEW( "rgbComponentInterpolation" ), FX_RGB_COMPONENT_INTERP }, + { CSTRING_VIEW( "lessAttenuation" ), FX_SND_LESS_ATTENUATION }, + }; + auto pos = flagNames.find( cur ); + if( pos == flagNames.end() ) { - mSpawnFlags |= FX_ORG_ON_SPHERE; - } - else if ( !Q_stricmp( flag[i], "orgOnCylinder" )) // cylinder/disk - { - mSpawnFlags |= FX_ORG_ON_CYLINDER; - } - else if ( !Q_stricmp( flag[i], "axisFromSphere" )) - { - mSpawnFlags |= FX_AXIS_FROM_SPHERE; - } - else if ( !Q_stricmp( flag[i], "randrotaroundfwd" )) - { - mSpawnFlags |= FX_RAND_ROT_AROUND_FWD; - } - else if ( !Q_stricmp( flag[i], "evenDistribution" )) - { - mSpawnFlags |= FX_EVEN_DISTRIBUTION; - } - else if ( !Q_stricmp( flag[i], "rgbComponentInterpolation" )) - { - mSpawnFlags |= FX_RGB_COMPONENT_INTERP; - } - else if ( !Q_stricmp( flag[i], "lessAttenuation" )) - { - mSpawnFlags |= FX_SND_LESS_ATTENUATION; + ok = false; } else - { // we have badness going on, but continue on in case there are any valid fields in here - ok = false; + { + mSpawnFlags |= pos->second; } } @@ -856,7 +799,7 @@ bool CPrimitiveTemplate::ParseSpawnFlags( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseAcceleration( const char *val ) +bool CPrimitiveTemplate::ParseAcceleration( const gsl::cstring_view& val ) { vec3_t min, max; @@ -881,11 +824,11 @@ bool CPrimitiveTemplate::ParseAcceleration( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseGravity( const char *val ) +bool CPrimitiveTemplate::ParseGravity( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mGravity.SetRange( min, max ); return true; @@ -906,11 +849,11 @@ bool CPrimitiveTemplate::ParseGravity( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseDensity( const char *val ) +bool CPrimitiveTemplate::ParseDensity( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mDensity.SetRange( min, max ); return true; @@ -921,7 +864,7 @@ bool CPrimitiveTemplate::ParseDensity( const char *val ) //------------------------------------------------------ // ParseVariance -// Reads in a ranged variance value. Variance is only +// Reads in a ranged variance value. Variance is only // valid for emitters that are calling effects... // it basically determines the amount of slop in the // density calculations @@ -932,11 +875,11 @@ bool CPrimitiveTemplate::ParseDensity( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseVariance( const char *val ) +bool CPrimitiveTemplate::ParseVariance( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mVariance.SetRange( min, max ); return true; @@ -955,7 +898,7 @@ bool CPrimitiveTemplate::ParseVariance( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseRGBStart( const char *val ) +bool CPrimitiveTemplate::ParseRGBStart( const gsl::cstring_view& val ) { vec3_t min, max; @@ -980,7 +923,7 @@ bool CPrimitiveTemplate::ParseRGBStart( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseRGBEnd( const char *val ) +bool CPrimitiveTemplate::ParseRGBEnd( const gsl::cstring_view& val ) { vec3_t min, max; @@ -1005,11 +948,11 @@ bool CPrimitiveTemplate::ParseRGBEnd( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseRGBParm( const char *val ) +bool CPrimitiveTemplate::ParseRGBParm( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mRGBParm.SetRange( min, max ); return true; @@ -1028,11 +971,11 @@ bool CPrimitiveTemplate::ParseRGBParm( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseRGBFlags( const char *val ) +bool CPrimitiveTemplate::ParseRGBFlags( const gsl::cstring_view& val ) { int flags; - if ( ParseGroupFlags( val, &flags ) == true ) + if ( ParseGroupFlags( val, flags ) == true ) { // Convert our generic flag values into type specific ones mFlags |= ( flags << FX_RGB_SHIFT ); @@ -1052,11 +995,11 @@ bool CPrimitiveTemplate::ParseRGBFlags( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseAlphaStart( const char *val ) +bool CPrimitiveTemplate::ParseAlphaStart( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mAlphaStart.SetRange( min, max ); return true; @@ -1075,11 +1018,11 @@ bool CPrimitiveTemplate::ParseAlphaStart( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseAlphaEnd( const char *val ) +bool CPrimitiveTemplate::ParseAlphaEnd( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mAlphaEnd.SetRange( min, max ); return true; @@ -1098,11 +1041,11 @@ bool CPrimitiveTemplate::ParseAlphaEnd( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseAlphaParm( const char *val ) +bool CPrimitiveTemplate::ParseAlphaParm( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mAlphaParm.SetRange( min, max ); return true; @@ -1121,11 +1064,11 @@ bool CPrimitiveTemplate::ParseAlphaParm( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseAlphaFlags( const char *val ) +bool CPrimitiveTemplate::ParseAlphaFlags( const gsl::cstring_view& val ) { int flags; - if ( ParseGroupFlags( val, &flags ) == true ) + if ( ParseGroupFlags( val, flags ) == true ) { // Convert our generic flag values into type specific ones mFlags |= ( flags << FX_ALPHA_SHIFT ); @@ -1145,11 +1088,11 @@ bool CPrimitiveTemplate::ParseAlphaFlags( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSizeStart( const char *val ) +bool CPrimitiveTemplate::ParseSizeStart( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mSizeStart.SetRange( min, max ); return true; @@ -1168,11 +1111,11 @@ bool CPrimitiveTemplate::ParseSizeStart( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSizeEnd( const char *val ) +bool CPrimitiveTemplate::ParseSizeEnd( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mSizeEnd.SetRange( min, max ); return true; @@ -1191,11 +1134,11 @@ bool CPrimitiveTemplate::ParseSizeEnd( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSizeParm( const char *val ) +bool CPrimitiveTemplate::ParseSizeParm( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mSizeParm.SetRange( min, max ); return true; @@ -1214,11 +1157,11 @@ bool CPrimitiveTemplate::ParseSizeParm( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSizeFlags( const char *val ) +bool CPrimitiveTemplate::ParseSizeFlags( const gsl::cstring_view& val ) { int flags; - if ( ParseGroupFlags( val, &flags ) == true ) + if ( ParseGroupFlags( val, flags ) == true ) { // Convert our generic flag values into type specific ones mFlags |= ( flags << FX_SIZE_SHIFT ); @@ -1238,11 +1181,11 @@ bool CPrimitiveTemplate::ParseSizeFlags( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSize2Start( const char *val ) +bool CPrimitiveTemplate::ParseSize2Start( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mSize2Start.SetRange( min, max ); return true; @@ -1261,11 +1204,11 @@ bool CPrimitiveTemplate::ParseSize2Start( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSize2End( const char *val ) +bool CPrimitiveTemplate::ParseSize2End( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mSize2End.SetRange( min, max ); return true; @@ -1284,11 +1227,11 @@ bool CPrimitiveTemplate::ParseSize2End( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSize2Parm( const char *val ) +bool CPrimitiveTemplate::ParseSize2Parm( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mSize2Parm.SetRange( min, max ); return true; @@ -1307,11 +1250,11 @@ bool CPrimitiveTemplate::ParseSize2Parm( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSize2Flags( const char *val ) +bool CPrimitiveTemplate::ParseSize2Flags( const gsl::cstring_view& val ) { int flags; - if ( ParseGroupFlags( val, &flags ) == true ) + if ( ParseGroupFlags( val, flags ) == true ) { // Convert our generic flag values into type specific ones mFlags |= ( flags << FX_SIZE2_SHIFT ); @@ -1331,11 +1274,11 @@ bool CPrimitiveTemplate::ParseSize2Flags( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseLengthStart( const char *val ) +bool CPrimitiveTemplate::ParseLengthStart( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mLengthStart.SetRange( min, max ); return true; @@ -1354,11 +1297,11 @@ bool CPrimitiveTemplate::ParseLengthStart( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseLengthEnd( const char *val ) +bool CPrimitiveTemplate::ParseLengthEnd( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mLengthEnd.SetRange( min, max ); return true; @@ -1377,11 +1320,11 @@ bool CPrimitiveTemplate::ParseLengthEnd( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseLengthParm( const char *val ) +bool CPrimitiveTemplate::ParseLengthParm( const gsl::cstring_view& val ) { float min, max; - if ( ParseFloat( val, &min, &max ) == true ) + if ( ParseFloat( val, min, max ) == true ) { mLengthParm.SetRange( min, max ); return true; @@ -1400,11 +1343,11 @@ bool CPrimitiveTemplate::ParseLengthParm( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseLengthFlags( const char *val ) +bool CPrimitiveTemplate::ParseLengthFlags( const gsl::cstring_view& val ) { int flags; - if ( ParseGroupFlags( val, &flags ) == true ) + if ( ParseGroupFlags( val, flags ) == true ) { // Convert our generic flag values into type specific ones mFlags |= ( flags << FX_LENGTH_SHIFT ); @@ -1424,45 +1367,24 @@ bool CPrimitiveTemplate::ParseLengthFlags( const char *val ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseShaders( CGPValue *grp ) +bool CPrimitiveTemplate::ParseShaders( const CGPProperty& grp ) { - const char *val; - int handle; - - if ( grp->IsList() ) + bool any = false; + for( auto& value : grp.GetValues() ) { - // If we are a list we have to do separate processing - CGPObject *list = grp->GetList(); - - while ( list ) + if( !value.empty() ) { - // name is actually the value contained in the list - val = list->GetName(); - - handle = theFxHelper.RegisterShader( val ); + any = true; + int handle = theFxHelper.RegisterShader( value ); mMediaHandles.AddHandle( handle ); - - list = (CGPValue *)list->GetNext(); } } - else + if( !any ) { - // Let's get a value - val = grp->GetTopValue(); - - if ( val ) - { - handle = theFxHelper.RegisterShader( val ); - mMediaHandles.AddHandle( handle ); - } - else - { - // empty "list" - theFxHelper.Print( "CPrimitiveTemplate::ParseShaders called with an empty list!\n" ); - return false; - } + // empty "list" + theFxHelper.Print( "CPrimitiveTemplate::ParseShaders called with an empty list!\n" ); + return false; } - return true; } @@ -1476,45 +1398,24 @@ bool CPrimitiveTemplate::ParseShaders( CGPValue *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSounds( CGPValue *grp ) +bool CPrimitiveTemplate::ParseSounds( const CGPProperty& grp ) { - const char *val; - int handle; - - if ( grp->IsList() ) + bool any = false; + for( auto& value : grp.GetValues() ) { - // If we are a list we have to do separate processing - CGPObject *list = grp->GetList(); - - while ( list ) + if( !value.empty() ) { - // name is actually the value contained in the list - val = list->GetName(); - - handle = theFxHelper.RegisterSound( val ); + any = true; + int handle = theFxHelper.RegisterSound( value ); mMediaHandles.AddHandle( handle ); - - list = (CGPValue *)list->GetNext(); } } - else + if( !any ) { - // Let's get a value - val = grp->GetTopValue(); - - if ( val ) - { - handle = theFxHelper.RegisterSound( val ); - mMediaHandles.AddHandle( handle ); - } - else - { - // empty "list" - theFxHelper.Print( "CPrimitiveTemplate::ParseSounds called with an empty list!\n" ); - return false; - } + // empty "list" + theFxHelper.Print( "CPrimitiveTemplate::ParseSounds called with an empty list!\n" ); + return false; } - return true; } @@ -1528,119 +1429,75 @@ bool CPrimitiveTemplate::ParseSounds( CGPValue *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseModels( CGPValue *grp ) +bool CPrimitiveTemplate::ParseModels( const CGPProperty& grp ) { - const char *val; - int handle; - - if ( grp->IsList() ) + bool any = false; + for( auto& value : grp.GetValues() ) { - // If we are a list we have to do separate processing - CGPObject *list = grp->GetList(); - - while ( list ) + if( !value.empty() ) { - // name is actually the value contained in the list - val = list->GetName(); - - handle = theFxHelper.RegisterModel( val ); + any = true; + int handle = theFxHelper.RegisterModel( value ); mMediaHandles.AddHandle( handle ); - - list = (CGPValue *)list->GetNext(); } } - else + if( !any ) { - // Let's get a value - val = grp->GetTopValue(); - - if ( val ) - { - handle = theFxHelper.RegisterModel( val ); - mMediaHandles.AddHandle( handle ); - } - else - { - // empty "list" - theFxHelper.Print( "CPrimitiveTemplate::ParseModels called with an empty list!\n" ); - return false; - } + // empty "list" + theFxHelper.Print( "CPrimitiveTemplate::ParseModels called with an empty list!\n" ); + return false; } - mFlags |= FX_ATTACHED_MODEL; - return true; } -//------------------------------------------------------ -// ParseImpactFxStrings -// Reads in a group of fx file names and registers them -// -// input: -// Parse group that contains the list of fx to parse -// -// return: -// success of parse operation. -//------------------------------------------------------ -bool CPrimitiveTemplate::ParseImpactFxStrings( CGPValue *grp ) +static bool ParseFX( const CGPProperty& grp, CFxScheduler& scheduler, CMediaHandles& handles, SFxHelper& helper, int& flags, int successFlags, gsl::czstring loadError, gsl::czstring emptyError ) { - const char *val; - int handle; - - if ( grp->IsList() ) + bool any = false; + for( auto& value : grp.GetValues() ) { - // If we are a list we have to do separate processing - CGPObject *list = grp->GetList(); - - while ( list ) + if( !value.empty() ) { - // name is actually the value contained in the list - val = list->GetName(); - handle = theFxScheduler.RegisterEffect( val ); - - if ( handle ) + any = true; + // TODO: string_view parameter + int handle = scheduler.RegisterEffect( std::string( value.begin(), value.end() ).c_str() ); + if( handle ) { - mImpactFxHandles.AddHandle( handle ); + handles.AddHandle( handle ); + flags |= successFlags; } else { - theFxHelper.Print( "FxTemplate: Impact effect file not found.\n" ); - return false; + helper.Print( "%s", loadError ); } - - list = (CGPValue *)list->GetNext(); } } - else + if( !any ) { - // Let's get a value - val = grp->GetTopValue(); - - if ( val ) - { - handle = theFxScheduler.RegisterEffect( val ); - - if ( handle ) - { - mImpactFxHandles.AddHandle( handle ); - } - else - { - theFxHelper.Print( "FxTemplate: Impact effect file not found.\n" ); - return false; - } - } - else - { - // empty "list" - theFxHelper.Print( "CPrimitiveTemplate::ParseImpactFxStrings called with an empty list!\n" ); - return false; - } + helper.Print( "%s", emptyError ); } + return any; +} - mFlags |= FX_IMPACT_RUNS_FX | FX_APPLY_PHYSICS; - - return true; +//------------------------------------------------------ +// ParseImpactFxStrings +// Reads in a group of fx file names and registers them +// +// input: +// Parse group that contains the list of fx to parse +// +// return: +// success of parse operation. +//------------------------------------------------------ +bool CPrimitiveTemplate::ParseImpactFxStrings( const CGPProperty& grp ) +{ + return ParseFX( + grp, + theFxScheduler, mImpactFxHandles, theFxHelper, + mFlags, FX_IMPACT_RUNS_FX | FX_APPLY_PHYSICS, + "FxTemplate: Impact effect file not found.\n", + "CPrimitiveTemplate::ParseImpactFxStrings called with an empty list!\n" + ); } //------------------------------------------------------ @@ -1653,65 +1510,15 @@ bool CPrimitiveTemplate::ParseImpactFxStrings( CGPValue *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseDeathFxStrings( CGPValue *grp ) +bool CPrimitiveTemplate::ParseDeathFxStrings( const CGPProperty& grp ) { - const char *val; - int handle; - - if ( grp->IsList() ) - { - // If we are a list we have to do separate processing - CGPObject *list = grp->GetList(); - - while ( list ) - { - // name is actually the value contained in the list - val = list->GetName(); - handle = theFxScheduler.RegisterEffect( val ); - - if ( handle ) - { - mDeathFxHandles.AddHandle( handle ); - } - else - { - theFxHelper.Print( "FxTemplate: Death effect file not found.\n" ); - return false; - } - - list = (CGPValue *)list->GetNext(); - } - } - else - { - // Let's get a value - val = grp->GetTopValue(); - - if ( val ) - { - handle = theFxScheduler.RegisterEffect( val ); - - if ( handle ) - { - mDeathFxHandles.AddHandle( handle ); - } - else - { - theFxHelper.Print( "FxTemplate: Death effect file not found.\n" ); - return false; - } - } - else - { - // empty "list" - theFxHelper.Print( "CPrimitiveTemplate::ParseDeathFxStrings called with an empty list!\n" ); - return false; - } - } - - mFlags |= FX_DEATH_RUNS_FX; - - return true; + return ParseFX( + grp, + theFxScheduler, mDeathFxHandles, theFxHelper, + mFlags, FX_DEATH_RUNS_FX, + "FxTemplate: Death effect file not found.\n", + "CPrimitiveTemplate::ParseDeathFxStrings called with an empty list!\n" + ); } //------------------------------------------------------ @@ -1724,65 +1531,15 @@ bool CPrimitiveTemplate::ParseDeathFxStrings( CGPValue *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseEmitterFxStrings( CGPValue *grp ) +bool CPrimitiveTemplate::ParseEmitterFxStrings( const CGPProperty& grp ) { - const char *val; - int handle; - - if ( grp->IsList() ) - { - // If we are a list we have to do separate processing - CGPObject *list = grp->GetList(); - - while ( list ) - { - // name is actually the value contained in the list - val = list->GetName(); - handle = theFxScheduler.RegisterEffect( val ); - - if ( handle ) - { - mEmitterFxHandles.AddHandle( handle ); - } - else - { - theFxHelper.Print( "FxTemplate: Emitter effect file not found.\n" ); - return false; - } - - list = (CGPValue *)list->GetNext(); - } - } - else - { - // Let's get a value - val = grp->GetTopValue(); - - if ( val ) - { - handle = theFxScheduler.RegisterEffect( val ); - - if ( handle ) - { - mEmitterFxHandles.AddHandle( handle ); - } - else - { - theFxHelper.Print( "FxTemplate: Emitter effect file not found.\n" ); - return false; - } - } - else - { - // empty "list" - theFxHelper.Print( "CPrimitiveTemplate::ParseEmitterFxStrings called with an empty list!\n" ); - return false; - } - } - - mFlags |= FX_EMIT_FX; - - return true; + return ParseFX( + grp, + theFxScheduler, mEmitterFxHandles, theFxHelper, + mFlags, FX_EMIT_FX, + "FxTemplate: Emitter effect file not found.\n", + "CPrimitiveTemplate::ParseEmitterFxStrings called with an empty list!\n" + ); } //------------------------------------------------------ @@ -1795,62 +1552,32 @@ bool CPrimitiveTemplate::ParseEmitterFxStrings( CGPValue *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParsePlayFxStrings( CGPValue *grp ) +bool CPrimitiveTemplate::ParsePlayFxStrings( const CGPProperty& grp ) { - const char *val; - int handle; - - if ( grp->IsList() ) - { - // If we are a list we have to do separate processing - CGPObject *list = grp->GetList(); - - while ( list ) - { - // name is actually the value contained in the list - val = list->GetName(); - handle = theFxScheduler.RegisterEffect( val ); - - if ( handle ) - { - mPlayFxHandles.AddHandle( handle ); - } - else - { - theFxHelper.Print( "FxTemplate: Effect file not found.\n" ); - return false; - } + return ParseFX( + grp, + theFxScheduler, mPlayFxHandles, theFxHelper, + mFlags, 0, + "FxTemplate: Effect file not found.\n", + "CPrimitiveTemplate::ParsePlayFxStrings called with an empty list!\n" + ); +} - list = (CGPValue *)list->GetNext(); - } - } - else +bool CPrimitiveTemplate::ParseGroup( const CGPGroup& grp, const StringViewIMap< ParseMethod >& parseMethods, gsl::czstring name ) +{ + for( auto& cur : grp.GetProperties() ) { - // Let's get a value - val = grp->GetTopValue(); - - if ( val ) + auto pos = parseMethods.find( cur.GetName() ); + if( pos == parseMethods.end() ) { - handle = theFxScheduler.RegisterEffect( val ); - - if ( handle ) - { - mPlayFxHandles.AddHandle( handle ); - } - else - { - theFxHelper.Print( "FxTemplate: Effect file not found.\n" ); - return false; - } + theFxHelper.Print( "Unknown key parsing %s group!", name ); } else { - // empty "list" - theFxHelper.Print( "CPrimitiveTemplate::ParsePlayFxStrings called with an empty list!\n" ); - return false; + ParseMethod method = pos->second; + ( this->*method )( cur.GetTopValue() ); } } - return true; } @@ -1865,47 +1592,20 @@ bool CPrimitiveTemplate::ParsePlayFxStrings( CGPValue *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseRGB( CGPGroup *grp ) +bool CPrimitiveTemplate::ParseRGB( const CGPGroup& grp ) { - CGPValue *pairs; - const char *key; - const char *val; + static StringViewIMap< ParseMethod > parseMethods{ + { CSTRING_VIEW( "start" ), &CPrimitiveTemplate::ParseRGBStart }, - // Inside of the group, we should have a series of pairs - pairs = grp->GetPairs(); - - while( pairs ) - { - // Let's get the key field - key = pairs->GetName(); - val = pairs->GetTopValue(); - - // Huge stricmp lists suxor - if ( !Q_stricmp( key, "start" )) - { - ParseRGBStart( val ); - } - else if ( !Q_stricmp( key, "end" )) - { - ParseRGBEnd( val ); - } - else if ( !Q_stricmp( key, "parm" ) || !Q_stricmp( key, "parms" )) - { - ParseRGBParm( val ); - } - else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) - { - ParseRGBFlags( val ); - } - else - { - theFxHelper.Print( "Unknown key parsing an RGB group: %s\n", key ); - } + { CSTRING_VIEW( "end" ), &CPrimitiveTemplate::ParseRGBEnd }, - pairs = (CGPValue *)pairs->GetNext(); - } + { CSTRING_VIEW( "parm" ), &CPrimitiveTemplate::ParseRGBParm }, + { CSTRING_VIEW( "parms" ), &CPrimitiveTemplate::ParseRGBParm }, - return true; + { CSTRING_VIEW( "flag" ), &CPrimitiveTemplate::ParseRGBFlags }, + { CSTRING_VIEW( "flags" ), &CPrimitiveTemplate::ParseRGBFlags }, + }; + return ParseGroup( grp, parseMethods, "RGB" ); } //------------------------------------------------------ @@ -1919,47 +1619,20 @@ bool CPrimitiveTemplate::ParseRGB( CGPGroup *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseAlpha( CGPGroup *grp ) +bool CPrimitiveTemplate::ParseAlpha( const CGPGroup& grp ) { - CGPValue *pairs; - const char *key; - const char *val; - - // Inside of the group, we should have a series of pairs - pairs = grp->GetPairs(); + static StringViewIMap< ParseMethod > parseMethods{ + { CSTRING_VIEW( "start" ), &CPrimitiveTemplate::ParseAlphaStart }, - while( pairs ) - { - // Let's get the key field - key = pairs->GetName(); - val = pairs->GetTopValue(); - - // Huge stricmp lists suxor - if ( !Q_stricmp( key, "start" )) - { - ParseAlphaStart( val ); - } - else if ( !Q_stricmp( key, "end" )) - { - ParseAlphaEnd( val ); - } - else if ( !Q_stricmp( key, "parm" ) || !Q_stricmp( key, "parms" )) - { - ParseAlphaParm( val ); - } - else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) - { - ParseAlphaFlags( val ); - } - else - { - theFxHelper.Print( "Unknown key parsing an Alpha group: %s\n", key ); - } + { CSTRING_VIEW( "end" ), &CPrimitiveTemplate::ParseAlphaEnd }, - pairs = (CGPValue *)pairs->GetNext(); - } + { CSTRING_VIEW( "parm" ), &CPrimitiveTemplate::ParseAlphaParm }, + { CSTRING_VIEW( "parms" ), &CPrimitiveTemplate::ParseAlphaParm }, - return true; + { CSTRING_VIEW( "flag" ), &CPrimitiveTemplate::ParseAlphaFlags }, + { CSTRING_VIEW( "flags" ), &CPrimitiveTemplate::ParseAlphaFlags }, + }; + return ParseGroup( grp, parseMethods, "Alpha" ); } //------------------------------------------------------ @@ -1973,47 +1646,20 @@ bool CPrimitiveTemplate::ParseAlpha( CGPGroup *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSize( CGPGroup *grp ) +bool CPrimitiveTemplate::ParseSize( const CGPGroup& grp ) { - CGPValue *pairs; - const char *key; - const char *val; - - // Inside of the group, we should have a series of pairs - pairs = grp->GetPairs(); - - while( pairs ) - { - // Let's get the key field - key = pairs->GetName(); - val = pairs->GetTopValue(); + static StringViewIMap< ParseMethod > parseMethods{ + { CSTRING_VIEW( "start" ), &CPrimitiveTemplate::ParseSizeStart }, - // Huge Q_stricmp lists suxor - if ( !Q_stricmp( key, "start" )) - { - ParseSizeStart( val ); - } - else if ( !Q_stricmp( key, "end" )) - { - ParseSizeEnd( val ); - } - else if ( !Q_stricmp( key, "parm" ) || !Q_stricmp( key, "parms" )) - { - ParseSizeParm( val ); - } - else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) - { - ParseSizeFlags( val ); - } - else - { - theFxHelper.Print( "Unknown key parsing a Size group: %s\n", key ); - } + { CSTRING_VIEW( "end" ), &CPrimitiveTemplate::ParseSizeEnd }, - pairs = (CGPValue *)pairs->GetNext(); - } + { CSTRING_VIEW( "parm" ), &CPrimitiveTemplate::ParseSizeParm }, + { CSTRING_VIEW( "parms" ), &CPrimitiveTemplate::ParseSizeParm }, - return true; + { CSTRING_VIEW( "flag" ), &CPrimitiveTemplate::ParseSizeFlags }, + { CSTRING_VIEW( "flags" ), &CPrimitiveTemplate::ParseSizeFlags }, + }; + return ParseGroup( grp, parseMethods, "Size" ); } //------------------------------------------------------ @@ -2027,47 +1673,20 @@ bool CPrimitiveTemplate::ParseSize( CGPGroup *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseSize2( CGPGroup *grp ) +bool CPrimitiveTemplate::ParseSize2( const CGPGroup& grp ) { - CGPValue *pairs; - const char *key; - const char *val; + static StringViewIMap< ParseMethod > parseMethods{ + { CSTRING_VIEW( "start" ), &CPrimitiveTemplate::ParseSize2Start }, - // Inside of the group, we should have a series of pairs - pairs = grp->GetPairs(); + { CSTRING_VIEW( "end" ), &CPrimitiveTemplate::ParseSize2End }, - while( pairs ) - { - // Let's get the key field - key = pairs->GetName(); - val = pairs->GetTopValue(); + { CSTRING_VIEW( "parm" ), &CPrimitiveTemplate::ParseSize2Parm }, + { CSTRING_VIEW( "parms" ), &CPrimitiveTemplate::ParseSize2Parm }, - // Huge Q_stricmp lists suxor - if ( !Q_stricmp( key, "start" )) - { - ParseSize2Start( val ); - } - else if ( !Q_stricmp( key, "end" )) - { - ParseSize2End( val ); - } - else if ( !Q_stricmp( key, "parm" ) || !Q_stricmp( key, "parms" )) - { - ParseSize2Parm( val ); - } - else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) - { - ParseSize2Flags( val ); - } - else - { - theFxHelper.Print( "Unknown key parsing a Size2 group: %s\n", key ); - } - - pairs = (CGPValue *)pairs->GetNext(); - } - - return true; + { CSTRING_VIEW( "flag" ), &CPrimitiveTemplate::ParseSize2Flags }, + { CSTRING_VIEW( "flags" ), &CPrimitiveTemplate::ParseSize2Flags }, + }; + return ParseGroup( grp, parseMethods, "Size2" ); } //------------------------------------------------------ @@ -2081,237 +1700,144 @@ bool CPrimitiveTemplate::ParseSize2( CGPGroup *grp ) // return: // success of parse operation. //------------------------------------------------------ -bool CPrimitiveTemplate::ParseLength( CGPGroup *grp ) +bool CPrimitiveTemplate::ParseLength( const CGPGroup& grp ) { - CGPValue *pairs; - const char *key; - const char *val; - - // Inside of the group, we should have a series of pairs - pairs = grp->GetPairs(); - - while( pairs ) - { - // Let's get the key field - key = pairs->GetName(); - val = pairs->GetTopValue(); + static StringViewIMap< ParseMethod > parseMethods{ + { CSTRING_VIEW( "start" ), &CPrimitiveTemplate::ParseLengthStart }, - // Huge Q_stricmp lists suxor - if ( !Q_stricmp( key, "start" )) - { - ParseLengthStart( val ); - } - else if ( !Q_stricmp( key, "end" )) - { - ParseLengthEnd( val ); - } - else if ( !Q_stricmp( key, "parm" ) || !Q_stricmp( key, "parms" )) - { - ParseLengthParm( val ); - } - else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) - { - ParseLengthFlags( val ); - } - else - { - theFxHelper.Print( "Unknown key parsing a Length group: %s\n", key ); - } + { CSTRING_VIEW( "end" ), &CPrimitiveTemplate::ParseLengthEnd }, - pairs = (CGPValue *)pairs->GetNext(); - } + { CSTRING_VIEW( "parm" ), &CPrimitiveTemplate::ParseLengthParm }, + { CSTRING_VIEW( "parms" ), &CPrimitiveTemplate::ParseLengthParm }, - return true; + { CSTRING_VIEW( "flag" ), &CPrimitiveTemplate::ParseLengthFlags }, + { CSTRING_VIEW( "flags" ), &CPrimitiveTemplate::ParseLengthFlags }, + }; + return ParseGroup( grp, parseMethods, "Length" ); } // Parse a primitive, apply defaults first, grab any base level // key pairs, then process any sub groups we may contain. //------------------------------------------------------ -bool CPrimitiveTemplate::ParsePrimitive( CGPGroup *grp ) +bool CPrimitiveTemplate::ParsePrimitive( const CGPGroup& grp ) { - CGPGroup *subGrp; - CGPValue *pairs; - const char *key; - const char *val; - - // Lets work with the pairs first - pairs = grp->GetPairs(); - - while( pairs ) + // Property + for( auto& prop : grp.GetProperties() ) { - // the fields - key = pairs->GetName(); - val = pairs->GetTopValue(); - - // Huge Q_stricmp lists suxor - if ( !Q_stricmp( key, "count" )) - { - ParseCount( val ); - } - else if ( !Q_stricmp( key, "shaders" ) || !Q_stricmp( key, "shader" )) - { - ParseShaders( pairs ); - } - else if ( !Q_stricmp( key, "models" ) || !Q_stricmp( key, "model" )) - { - ParseModels( pairs ); - } - else if ( !Q_stricmp( key, "sounds" ) || !Q_stricmp( key, "sound" )) - { - ParseSounds( pairs ); - } - else if ( !Q_stricmp( key, "impactfx" )) - { - ParseImpactFxStrings( pairs ); - } - else if ( !Q_stricmp( key, "deathfx" )) - { - ParseDeathFxStrings( pairs ); - } - else if ( !Q_stricmp( key, "emitfx" )) - { - ParseEmitterFxStrings( pairs ); - } - else if ( !Q_stricmp( key, "playfx" )) - { - ParsePlayFxStrings( pairs ); + // Single Value Parsing + { + static StringViewIMap< ParseMethod > parseMethods{ + { CSTRING_VIEW( "count" ), &CPrimitiveTemplate::ParseCount }, + { CSTRING_VIEW( "life" ), &CPrimitiveTemplate::ParseLife }, + { CSTRING_VIEW( "delay" ), &CPrimitiveTemplate::ParseDelay }, + { CSTRING_VIEW( "bounce" ), &CPrimitiveTemplate::ParseElasticity }, + { CSTRING_VIEW( "intensity" ), &CPrimitiveTemplate::ParseElasticity }, + { CSTRING_VIEW( "min" ), &CPrimitiveTemplate::ParseMin }, + { CSTRING_VIEW( "max" ), &CPrimitiveTemplate::ParseMax }, + { CSTRING_VIEW( "angle" ), &CPrimitiveTemplate::ParseAngle }, + { CSTRING_VIEW( "angles" ), &CPrimitiveTemplate::ParseAngle }, + { CSTRING_VIEW( "angleDelta" ), &CPrimitiveTemplate::ParseAngleDelta }, + { CSTRING_VIEW( "velocity" ), &CPrimitiveTemplate::ParseVelocity }, + { CSTRING_VIEW( "vel" ), &CPrimitiveTemplate::ParseVelocity }, + { CSTRING_VIEW( "acceleration" ), &CPrimitiveTemplate::ParseAcceleration }, + { CSTRING_VIEW( "accel" ), &CPrimitiveTemplate::ParseAcceleration }, + { CSTRING_VIEW( "gravity" ), &CPrimitiveTemplate::ParseGravity }, + { CSTRING_VIEW( "density" ), &CPrimitiveTemplate::ParseDensity }, + { CSTRING_VIEW( "variance" ), &CPrimitiveTemplate::ParseVariance }, + { CSTRING_VIEW( "origin" ), &CPrimitiveTemplate::ParseOrigin1 }, + { CSTRING_VIEW( "origin2" ), &CPrimitiveTemplate::ParseOrigin2 }, + { CSTRING_VIEW( "radius" ), &CPrimitiveTemplate::ParseRadius }, + { CSTRING_VIEW( "height" ), &CPrimitiveTemplate::ParseHeight }, + { CSTRING_VIEW( "rotation" ), &CPrimitiveTemplate::ParseRotation }, + { CSTRING_VIEW( "rotationDelta" ), &CPrimitiveTemplate::ParseRotationDelta }, + { CSTRING_VIEW( "flags" ), &CPrimitiveTemplate::ParseFlags }, + { CSTRING_VIEW( "flag" ), &CPrimitiveTemplate::ParseFlags }, + { CSTRING_VIEW( "spawnFlags" ), &CPrimitiveTemplate::ParseSpawnFlags }, + { CSTRING_VIEW( "spawnFlag" ), &CPrimitiveTemplate::ParseSpawnFlags }, + }; + auto pos = parseMethods.find( prop.GetName() ); + if( pos != parseMethods.end() ) + { + ParseMethod method = pos->second; + ( this->*method )( prop.GetTopValue() ); + continue; + } } - else if ( !Q_stricmp( key, "life" )) - { - ParseLife( val ); + // Property Parsing + { + using PropertyParseMethod = bool( CPrimitiveTemplate::* )( const CGPProperty& ); + static StringViewIMap< PropertyParseMethod > parseMethods{ + { CSTRING_VIEW( "shaders" ), &CPrimitiveTemplate::ParseShaders }, + { CSTRING_VIEW( "shader" ), &CPrimitiveTemplate::ParseShaders }, + { CSTRING_VIEW( "models" ), &CPrimitiveTemplate::ParseModels }, + { CSTRING_VIEW( "model" ), &CPrimitiveTemplate::ParseModels }, + { CSTRING_VIEW( "sounds" ), &CPrimitiveTemplate::ParseSounds }, + { CSTRING_VIEW( "sound" ), &CPrimitiveTemplate::ParseSounds }, + { CSTRING_VIEW( "impactfx" ), &CPrimitiveTemplate::ParseImpactFxStrings }, + { CSTRING_VIEW( "deathfx" ), &CPrimitiveTemplate::ParseDeathFxStrings }, + { CSTRING_VIEW( "emitfx" ), &CPrimitiveTemplate::ParseEmitterFxStrings }, + { CSTRING_VIEW( "playfx" ), &CPrimitiveTemplate::ParsePlayFxStrings }, + }; + auto pos = parseMethods.find( prop.GetName() ); + if( pos != parseMethods.end() ) + { + PropertyParseMethod method = pos->second; + ( this->*method )( prop ); + continue; + } } - else if ( !Q_stricmp( key, "cullrange" )) + // Special Cases + if( Q::stricmp( prop.GetName(), CSTRING_VIEW( "cullrange" ) ) == Q::Ordering::EQ ) { - mCullRange = atoi( val ); + mCullRange = Q::svtoi( prop.GetTopValue() ); mCullRange *= mCullRange; // Square } - else if ( !Q_stricmp( key, "delay" )) - { - ParseDelay( val ); - } - else if ( !Q_stricmp( key, "bounce" ) || !Q_stricmp( key, "intensity" )) // me==bad for reusing this...but it shouldn't hurt anything) - { - ParseElasticity( val ); - } - else if ( !Q_stricmp( key, "min" )) - { - ParseMin( val ); - } - else if ( !Q_stricmp( key, "max" )) - { - ParseMax( val ); - } - else if ( !Q_stricmp( key, "angle" ) || !Q_stricmp( key, "angles" )) - { - ParseAngle( val ); - } - else if ( !Q_stricmp( key, "angleDelta" )) - { - ParseAngleDelta( val ); - } - else if ( !Q_stricmp( key, "velocity" ) || !Q_stricmp( key, "vel" )) - { - ParseVelocity( val ); - } - else if ( !Q_stricmp( key, "acceleration" ) || !Q_stricmp( key, "accel" )) - { - ParseAcceleration( val ); - } - else if ( !Q_stricmp( key, "gravity" )) - { - ParseGravity( val ); - } - else if ( !Q_stricmp( key, "density" )) - { - ParseDensity( val ); - } - else if ( !Q_stricmp( key, "variance" )) - { - ParseVariance( val ); - } - else if ( !Q_stricmp( key, "origin" )) - { - ParseOrigin1( val ); - } - else if ( !Q_stricmp( key, "origin2" )) - { - ParseOrigin2( val ); - } - else if ( !Q_stricmp( key, "radius" )) // part of ellipse/cylinder calcs. - { - ParseRadius( val ); - } - else if ( !Q_stricmp( key, "height" )) // part of ellipse/cylinder calcs. - { - ParseHeight( val ); - } - else if ( !Q_stricmp( key, "rotation" )) - { - ParseRotation( val ); - } - else if ( !Q_stricmp( key, "rotationDelta" )) + else if( Q::stricmp( prop.GetName(), CSTRING_VIEW( "name" ) ) == Q::Ordering::EQ ) { - ParseRotationDelta( val ); - } - else if ( !Q_stricmp( key, "flags" ) || !Q_stricmp( key, "flag" )) - { // these need to get passed on to the primitive - ParseFlags( val ); - } - else if ( !Q_stricmp( key, "spawnFlags" ) || !Q_stricmp( key, "spawnFlag" )) - { // these are used to spawn things in cool ways, but don't ever get passed on to prims. - ParseSpawnFlags( val ); - } - else if ( !Q_stricmp( key, "name" )) - { - if ( val ) + if( !prop.GetTopValue().empty() ) { // just stash the descriptive name of the primitive - Q_strncpyz( mName, val, sizeof(mName) ); + std::size_t len = std::min< std::size_t >( prop.GetTopValue().size(), FX_MAX_PRIM_NAME - 1 ); + auto begin = prop.GetTopValue().begin(); + std::copy( begin, begin + len, &mName[ 0 ] ); + mName[ len ] = '\0'; } } + // Error else { - theFxHelper.Print( "Unknown key parsing an effect primitive: %s\n", key ); + theFxHelper.Print( "Unknown key parsing an effect primitive!\n" ); } - - pairs = (CGPValue *)pairs->GetNext(); } - subGrp = grp->GetSubGroups(); - - // Lets chomp on the groups now - while ( subGrp ) + for( auto& subGrp : grp.GetSubGroups() ) { - key = subGrp->GetName(); + using GroupParseMethod = bool ( CPrimitiveTemplate::* )( const CGPGroup& ); + static StringViewIMap< GroupParseMethod > parseMethods{ + { CSTRING_VIEW( "rgb" ), &CPrimitiveTemplate::ParseRGB }, - if ( !Q_stricmp( key, "rgb" )) - { - ParseRGB( subGrp ); - } - else if ( !Q_stricmp( key, "alpha" )) - { - ParseAlpha( subGrp ); - } - else if ( !Q_stricmp( key, "size" ) || !Q_stricmp( key, "width" )) - { - ParseSize( subGrp ); - } - else if ( !Q_stricmp( key, "size2" ) || !Q_stricmp( key, "width2" )) - { - ParseSize2( subGrp ); - } - else if ( !Q_stricmp( key, "length" ) || !Q_stricmp( key, "height" )) + { CSTRING_VIEW( "alpha" ), &CPrimitiveTemplate::ParseAlpha }, + + { CSTRING_VIEW( "size" ), &CPrimitiveTemplate::ParseSize }, + { CSTRING_VIEW( "width" ), &CPrimitiveTemplate::ParseSize }, + + { CSTRING_VIEW( "size2" ), &CPrimitiveTemplate::ParseSize2 }, + { CSTRING_VIEW( "width2" ), &CPrimitiveTemplate::ParseSize2 }, + + { CSTRING_VIEW( "length" ), &CPrimitiveTemplate::ParseLength }, + { CSTRING_VIEW( "height" ), &CPrimitiveTemplate::ParseLength }, + }; + auto pos = parseMethods.find( subGrp.GetName() ); + if( pos == parseMethods.end() ) { - ParseLength( subGrp ); + theFxHelper.Print( "Unknown group key parsing a particle!\n" ); } else { - theFxHelper.Print( "Unknown group key parsing a particle: %s\n", key ); + GroupParseMethod method = pos->second; + ( this->*method )( subGrp ); } - - subGrp = (CGPGroup *)subGrp->GetNext(); } - return true; } diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index 5179568b36..9876f31cbe 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -21,9 +21,10 @@ if(NOT InOpenJK) message(FATAL_ERROR "Use the top-level cmake script!") endif(NOT InOpenJK) -set(JK2SPGameDefines ${SharedDefines} "JK2_MODE") +set(JK2SPGameDefines ${SharedDefines} "JK2_MODE" "SP_GAME") set(JK2SPGameIncludeDirectories + "${JK2SPDir}" "${JK2SPDir}/game" "${SharedDir}" "${GSLIncludeDirectory}" @@ -240,6 +241,9 @@ set(JK2SPGameFiles ${JK2SPGameFiles} ${JK2SPGameCommonFiles}) set(JK2SPGameCommonSafeFiles ${SharedCommonSafeFiles} + "${SharedDir}/qcommon/safe/files.h" + "${SharedDir}/qcommon/safe/files.cpp" + "${JK2SPDir}/qcommon/safe/memory.h" ) source_group("common/safe" FILES ${JK2SPGameCommonSafeFiles}) set(JK2SPGameFiles ${JK2SPGameFiles} ${JK2SPGameCommonSafeFiles}) diff --git a/codeJK2/game/genericparser2.cpp b/codeJK2/game/genericparser2.cpp index 50bba889dd..196ec7b8f2 100644 --- a/codeJK2/game/genericparser2.cpp +++ b/codeJK2/game/genericparser2.cpp @@ -20,868 +20,263 @@ along with this program; if not, see . =========================================================================== */ +// Filename:- genericparser2.cpp + +#include "g_headers.h" +#include "genericparser2.h" + #ifdef _JK2EXE #include "../qcommon/qcommon.h" -#else -#include "g_headers.h" #endif -#define MAX_TOKEN_SIZE 1024 -static char token[MAX_TOKEN_SIZE]; +#include +#include -static char *GetToken(char **text, bool allowLineBreaks, bool readUntilEOL = false) -{ - char *pointer = *text; - int length = 0; - int c = 0; - bool foundLineBreak; - token[0] = 0; - if (!pointer) +static void skipWhitespace( gsl::cstring_view& text, const bool allowLineBreaks ) +{ + gsl::cstring_view::iterator whitespaceEnd = text.begin(); + while ( whitespaceEnd != text.end() // No EOF + && std::isspace( *whitespaceEnd ) // No End of Whitespace + && (allowLineBreaks || *whitespaceEnd != '\n') ) // No unwanted newline { - return token; + ++whitespaceEnd; } + text = { whitespaceEnd, text.end() }; +} - while(1) +static void skipWhitespaceAndComments( gsl::cstring_view& text, const bool allowLineBreaks ) +{ + skipWhitespace( text, allowLineBreaks ); + // skip single line comment + if ( text.size() >= 2 && text[0] == '/' && text[1] == '/' ) { - foundLineBreak = false; - while(1) + auto commentEnd = std::find( text.begin() + 2, text.end(), '\n' ); + if ( commentEnd == text.end() ) { - c = *pointer; - if (c > ' ') - { - break; - } - if (!c) - { - *text = 0; - return token; - } - if (c == '\n') - { - foundLineBreak = true; - } - pointer++; - } - if (foundLineBreak && !allowLineBreaks) - { - *text = pointer; - return token; - } - - c = *pointer; - - // skip single line comment - if (c == '/' && pointer[1] == '/') - { - pointer += 2; - while (*pointer && *pointer != '\n') - { - pointer++; - } - } - // skip multi line comments - else if (c == '/' && pointer[1] == '*') - { - pointer += 2; - while (*pointer && (*pointer != '*' || pointer[1] != '/')) - { - pointer++; - } - if (*pointer) - { - pointer += 2; - } + text = { text.end(), text.end() }; + return; } else - { // found the start of a token - break; - } - } - - if (c == '\"') - { // handle a string - pointer++; - while (1) { - c = *pointer++; - if (c == '\"') - { -// token[length++] = c; - break; - } - else if (!c) - { - break; - } - else if (length < MAX_TOKEN_SIZE) - { - token[length++] = c; - } + text = { commentEnd, text.end() }; + skipWhitespaceAndComments( text, allowLineBreaks ); + return; } } - else if (readUntilEOL) - { - // absorb all characters until EOL - while(c != '\n' && c != '\r') - { - if (c == '/' && ((*(pointer+1)) == '/' || (*(pointer+1)) == '*')) - { - break; - } - if (length < MAX_TOKEN_SIZE) - { - token[length++] = c; - } - pointer++; - c = *pointer; - } - // remove trailing white space - while(length && token[length-1] < ' ') - { - length--; - } - } - else + // skip multi line comments + if ( text.size() >= 2 && text[0] == '/' && text[1] == '*' ) { - while(c > ' ') + static const std::array< char, 2 > endStr{ '*', '/' }; + auto commentEnd = std::search( text.begin(), text.end(), endStr.begin(), endStr.end() ); + if ( commentEnd == text.end() ) { - if (length < MAX_TOKEN_SIZE) - { - token[length++] = c; - } - pointer++; - c = *pointer; + text = { text.end(), text.end() }; + return; } - } - - if (token[0] == '\"') - { // remove start quote - length--; - memmove(token, token+1, length); - - if (length && token[length-1] == '\"') - { // remove end quote - length--; - } - } - - if (length >= MAX_TOKEN_SIZE) - { - length = 0; - } - token[length] = 0; - *text = (char *)pointer; - - return token; -} - - - - -CTextPool::CTextPool(int initSize) : - mNext(0), - mSize(initSize), - mUsed(0) -{ -#ifdef _EXE -// mPool = (char *)Z_Malloc(mSize, TAG_GP2); - mPool = (char *)Z_Malloc(mSize, TAG_TEXTPOOL, qtrue); -#else - mPool = (char *)trap_Z_Malloc(mSize, TAG_GP2); -#endif -} - -CTextPool::~CTextPool(void) -{ -#ifdef _EXE - Z_Free(mPool); -#else - trap_Z_Free(mPool); -#endif -} - -char *CTextPool::AllocText(const char *text, bool addNULL, CTextPool **poolPtr) -{ - int length = strlen(text) + (addNULL ? 1 : 0); - - if (mUsed + length + 1> mSize) - { // extra 1 to put a null on the end - if (poolPtr) + else { - (*poolPtr)->SetNext(new CTextPool(mSize)); - *poolPtr = (*poolPtr)->GetNext(); - - return (*poolPtr)->AllocText(text, addNULL); + text = { commentEnd + endStr.size(), text.end() }; + skipWhitespace( text, allowLineBreaks ); + return; } - - return 0; } - strcpy(mPool + mUsed, text); - mUsed += length; - mPool[mUsed] = 0; - - return mPool + mUsed - length; -} - -void CleanTextPool(CTextPool *pool) -{ - CTextPool *next; - - while(pool) - { - next = pool->GetNext(); - delete pool; - pool = next; - } -} - - - - - - - -CGPObject::CGPObject(const char *initName) : - mName(initName), - mNext(0), - mInOrderNext(0), - mInOrderPrevious(0) -{ -} - -bool CGPObject::WriteText(CTextPool **textPool, const char *text) -{ - if (strchr(text, ' ') || !text[0]) - { - (*textPool)->AllocText("\"", false, textPool); - (*textPool)->AllocText((char *)text, false, textPool); - (*textPool)->AllocText("\"", false, textPool); - } - else - { - (*textPool)->AllocText((char *)text, false, textPool); - } - - return true; -} - - - - - - - - - - - - - - -CGPValue::CGPValue(const char *initName, const char *initValue) : - CGPObject(initName), - mList(0) -{ - if (initValue) - { - AddValue(initValue); - } + // found start of token + return; } -CGPValue::~CGPValue(void) +static gsl::cstring_view removeTrailingWhitespace( const gsl::cstring_view& text ) { - CGPObject *next; - - while(mList) - { - next = mList->GetNext(); - delete mList; - mList = next; - } + return{ + text.begin(), + std::find_if_not( + std::reverse_iterator< const char *>( text.end() ), std::reverse_iterator< const char* >( text.begin() ), + static_cast< int( *)(int) >(std::isspace) + ).base() + }; } -CGPValue *CGPValue::Duplicate(CTextPool **textPool) +/** +Skips whitespace (including lineBreaks, if desired) & comments, then reads one token. +A token can be: +- a string ("" delimited; ignores readToEOL) +- whitespace-delimited (if readToEOL == false) +- EOL- or comment-delimited (if readToEOL == true); i.e. reads to end of line or the first // or /* +@param text adjusted to start beyond the read token +*/ +static gsl::cstring_view GetToken( gsl::cstring_view& text, bool allowLineBreaks, bool readToEOL = false ) { - CGPValue *newValue; - CGPObject *iterator; - char *name; - - if (textPool) + skipWhitespaceAndComments( text, allowLineBreaks ); + // EOF + if ( text.empty() ) { - name = (*textPool)->AllocText((char *)mName, true, textPool); + return{}; } - else - { - name = (char *)mName; - } - - newValue = new CGPValue(name); - iterator = mList; - while(iterator) + // string. ignores readToEOL. + if ( text[0] == '"' ) { - if (textPool) + // there are no escapes, string just ends at the next " + auto tokenEnd = std::find( text.begin() + 1, text.end(), '"' ); + if ( tokenEnd == text.end() ) { - name = (*textPool)->AllocText((char *)iterator->GetName(), true, textPool); + gsl::cstring_view token = { text.begin() + 1, text.end() }; + text = { text.end(), text.end() }; + return token; } else { - name = (char *)iterator->GetName(); + gsl::cstring_view token = { text.begin() + 1, tokenEnd }; + text = { tokenEnd + 1, text.end() }; + return token; } - newValue->AddValue(name); - iterator = iterator->GetNext(); - } - - return newValue; -} - -bool CGPValue::IsList(void) -{ - if (!mList || !mList->GetNext()) - { - return false; - } - - return true; -} - -const char *CGPValue::GetTopValue(void) -{ - if (mList) - { - return mList->GetName(); - } - - return 0; -} - -void CGPValue::AddValue(const char *newValue, CTextPool **textPool) -{ - if (textPool) - { - newValue = (*textPool)->AllocText((char *)newValue, true, textPool); } - - if (mList == 0) + else if ( readToEOL ) { - mList = new CGPObject(newValue); - mList->SetInOrderNext(mList); + // find the first of '\n', "//" or "/*"; that's end of token + auto tokenEnd = std::find( text.begin(), text.end(), '\n' ); + static const std::array< char, 2 > commentPatterns[]{ + { { '/', '*' } }, + { { '/', '/' } } + }; + for ( auto& pattern : commentPatterns ) + { + tokenEnd = std::min( + tokenEnd, + std::search( + text.begin(), tokenEnd, + pattern.begin(), pattern.end() + ) + ); + } + gsl::cstring_view token{ text.begin(), tokenEnd }; + text = { tokenEnd, text.end() }; + return removeTrailingWhitespace( token ); } else { - mList->GetInOrderNext()->SetNext(new CGPObject(newValue)); - mList->SetInOrderNext(mList->GetInOrderNext()->GetNext()); + // consume until first whitespace (if allowLineBreaks == false, that may be text.begin(); in that case token is empty.) + auto tokenEnd = std::find_if( text.begin(), text.end(), static_cast< int( *)(int) >(std::isspace) ); + gsl::cstring_view token{ text.begin(), tokenEnd }; + text = { tokenEnd, text.end() }; + return token; } } -bool CGPValue::Parse(char **dataPtr, CTextPool **textPool) -{ - char *token; - char *value; - while(1) - { - token = GetToken(dataPtr, true, true); - if (!token[0]) - { // end of data - error! - return false; - } - else if (Q_stricmp(token, "]") == 0) - { // ending brace for this list - break; - } - value = (*textPool)->AllocText(token, true, textPool); - AddValue(value); - } - - return true; -} -bool CGPValue::Write(CTextPool **textPool, int depth) +CGPProperty::CGPProperty( gsl::cstring_view initKey, gsl::cstring_view initValue ) + : mKey( initKey ) { - int i; - CGPObject *next; - - if (!mList) - { - return true; - } - - for(i=0;iAllocText("\t", false, textPool); - } - - WriteText(textPool, mName); - - if (!mList->GetNext()) + if ( !initValue.empty() ) { - (*textPool)->AllocText("\t\t", false, textPool); - mList->WriteText(textPool, mList->GetName()); - (*textPool)->AllocText("\r\n", false, textPool); - } - else - { - (*textPool)->AllocText("\r\n", false, textPool); - - for(i=0;iAllocText("\t", false, textPool); - } - (*textPool)->AllocText("[\r\n", false, textPool); - - next = mList; - while(next) - { - for(i=0;iAllocText("\t", false, textPool); - } - mList->WriteText(textPool, next->GetName()); - (*textPool)->AllocText("\r\n", false, textPool); - - next = next->GetNext(); - } - - for(i=0;iAllocText("\t", false, textPool); - } - (*textPool)->AllocText("]\r\n", false, textPool); + mValues.push_back( initValue ); } - - return true; -} - - - - - - - - - - - - - - - - -CGPGroup::CGPGroup(const char *initName, CGPGroup *initParent) : - CGPObject(initName), - mPairs(0), - mInOrderPairs(0), - mCurrentPair(0), - mSubGroups(0), - mInOrderSubGroups(0), - mCurrentSubGroup(0), - mParent(initParent), - mWriteable(false) -{ } -CGPGroup::~CGPGroup(void) +void CGPProperty::AddValue( gsl::cstring_view newValue ) { - Clean(); + mValues.push_back( newValue ); } -int CGPGroup::GetNumSubGroups(void) -{ - int count; - CGPGroup *group; - - count = 0; - group = mSubGroups; - do - { - count++; - group = (CGPGroup *)group->GetNext(); - } - while(group); - return(count); -} -int CGPGroup::GetNumPairs(void) -{ - int count; - CGPValue *pair; - count = 0; - pair = mPairs; - do - { - count++; - pair = (CGPValue *)pair->GetNext(); - } - while(pair); - return(count); -} -void CGPGroup::Clean(void) -{ - while(mPairs) - { - mCurrentPair = (CGPValue *)mPairs->GetNext(); - delete mPairs; - mPairs = mCurrentPair; - } - while(mSubGroups) - { - mCurrentSubGroup = (CGPGroup *)mSubGroups->GetNext(); - delete mSubGroups; - mSubGroups = mCurrentSubGroup; - } - mPairs = mInOrderPairs = mCurrentPair = 0; - mSubGroups = mInOrderSubGroups = mCurrentSubGroup = 0; - mParent = 0; - mWriteable = false; -} -CGPGroup *CGPGroup::Duplicate(CTextPool **textPool, CGPGroup *initParent) -{ - CGPGroup *newGroup, *subSub, *newSub; - CGPValue *newPair, *subPair; - char *name; - if (textPool) - { - name = (*textPool)->AllocText((char *)mName, true, textPool); - } - else - { - name = (char *)mName; - } - newGroup = new CGPGroup(name); - subSub = mSubGroups; - while(subSub) - { - newSub = subSub->Duplicate(textPool, newGroup); - newGroup->AddGroup(newSub); - subSub = (CGPGroup *)subSub->GetNext(); - } - subPair = mPairs; - while(subPair) - { - newPair = subPair->Duplicate(textPool); - newGroup->AddPair(newPair); - subPair = (CGPValue *)subPair->GetNext(); - } - return newGroup; -} +CGPGroup::CGPGroup( const gsl::cstring_view& initName ) + : mName( initName ) +{} -void CGPGroup::SortObject(CGPObject *object, CGPObject **unsortedList, CGPObject **sortedList, - CGPObject **lastObject) +bool CGPGroup::Parse( gsl::cstring_view& data, const bool topLevel ) { - CGPObject *test, *last; - - if (!*unsortedList) - { - *unsortedList = *sortedList = object; - } - else + while ( true ) { - (*lastObject)->SetNext(object); + gsl::cstring_view token = GetToken( data, true ); - test = *sortedList; - last = 0; - while(test) + if ( token.empty() ) { - if (Q_stricmp(object->GetName(), test->GetName()) < 0) + if ( topLevel ) { - break; + // top level parse; there was no opening "{", so there should be no closing one either. + return true; + } + else + { + // end of data - error! + return false; } - - last = test; - test = test->GetInOrderNext(); - } - - if (test) - { - test->SetInOrderPrevious(object); - object->SetInOrderNext(test); - } - if (last) - { - last->SetInOrderNext(object); - object->SetInOrderPrevious(last); - } - else - { - *sortedList = object; - } - } - - *lastObject = object; -} - -CGPValue *CGPGroup::AddPair(const char *name, const char *value, CTextPool **textPool) -{ - CGPValue *newPair; - - if (textPool) - { - name = (*textPool)->AllocText((char *)name, true, textPool); - if (value) - { - value = (*textPool)->AllocText((char *)value, true, textPool); } - } - - newPair = new CGPValue(name, value); - - AddPair(newPair); - - return newPair; -} - -void CGPGroup::AddPair(CGPValue *NewPair) -{ - SortObject(NewPair, (CGPObject **)&mPairs, (CGPObject **)&mInOrderPairs, - (CGPObject **)&mCurrentPair); -} - -CGPGroup *CGPGroup::AddGroup(const char *name, CTextPool **textPool) -{ - CGPGroup *newGroup; - - if (textPool) - { - name = (*textPool)->AllocText((char *)name, true, textPool); - } - - newGroup = new CGPGroup(name); - - AddGroup(newGroup); - - return newGroup; -} - -void CGPGroup::AddGroup(CGPGroup *NewGroup) -{ - SortObject(NewGroup, (CGPObject **)&mSubGroups, (CGPObject **)&mInOrderSubGroups, - (CGPObject **)&mCurrentSubGroup); -} - -CGPGroup *CGPGroup::FindSubGroup(const char *name) -{ - CGPGroup *group; - - group = mSubGroups; - while(group) - { - if(!Q_stricmp(name, group->GetName())) + else if ( token == CSTRING_VIEW( "}" ) ) { - return(group); - } - group = (CGPGroup *)group->GetNext(); - } - return(NULL); -} - -bool CGPGroup::Parse(char **dataPtr, CTextPool **textPool) -{ - char *token; - char lastToken[MAX_TOKEN_SIZE]; - CGPGroup *newSubGroup; - CGPValue *newPair; - - while(1) - { - token = GetToken(dataPtr, true); - - if (!token[0]) - { // end of data - error! - if (mParent) + if ( topLevel ) { + // top-level group; there was no opening "{" so there should be no closing one, either. return false; } else { - break; + // ending brace for this group + return true; } } - else if (Q_stricmp(token, "}") == 0) - { // ending brace for this group - break; - } - - Q_strncpyz(lastToken, token, sizeof(lastToken)); + gsl::cstring_view lastToken = token; // read ahead to see what we are doing - token = GetToken(dataPtr, true, true); - if (Q_stricmp(token, "{") == 0) - { // new sub group - newSubGroup = AddGroup(lastToken, textPool); - newSubGroup->SetWriteable(mWriteable); - if (!newSubGroup->Parse(dataPtr, textPool)) + token = GetToken( data, true, true ); + if ( token == CSTRING_VIEW( "{" ) ) + { + // new sub group + mSubGroups.emplace_back( lastToken ); + if ( !mSubGroups.back().Parse( data, false ) ) { return false; } } - else if (Q_stricmp(token, "[") == 0) - { // new pair list - newPair = AddPair(lastToken, 0, textPool); - if (!newPair->Parse(dataPtr, textPool)) + else if ( token == CSTRING_VIEW( "[" ) ) + { + // new list + mProperties.emplace_back( lastToken ); + CGPProperty& list = mProperties.back(); + while ( true ) { - return false; + token = GetToken( data, true, true ); + if ( token.empty() ) + { + return false; + } + if ( token == CSTRING_VIEW( "]" ) ) + { + break; + } + list.AddValue( token ); } } else - { // new pair - AddPair(lastToken, token, textPool); - } - } - - return true; -} - -bool CGPGroup::Write(CTextPool **textPool, int depth) -{ - int i; - CGPValue *mPair = mPairs; - CGPGroup *mSubGroup = mSubGroups; - - if (depth >= 0) - { - for(i=0;iAllocText("\t", false, textPool); - } - WriteText(textPool, mName); - (*textPool)->AllocText("\r\n", false, textPool); - - for(i=0;iAllocText("\t", false, textPool); + // new value + mProperties.emplace_back( lastToken, token ); } - (*textPool)->AllocText("{\r\n", false, textPool); - } - - while(mPair) - { - mPair->Write(textPool, depth+1); - mPair = (CGPValue *)mPair->GetNext(); } - - while(mSubGroup) - { - mSubGroup->Write(textPool, depth+1); - mSubGroup = (CGPGroup *)mSubGroup->GetNext(); - } - - if (depth >= 0) - { - for(i=0;iAllocText("\t", false, textPool); - } - (*textPool)->AllocText("}\r\n", false, textPool); - } - - return true; } -CGPValue *CGPGroup::FindPair(const char *key) -{ - CGPValue *pair = mPairs; - - while(pair) - { - if (Q_stricmp(pair->GetName(), key) == 0) - { - return pair; - } - - pair = pair->GetNext(); - } - - return 0; -} - -const char *CGPGroup::FindPairValue(const char *key, const char *defaultVal) -{ - CGPValue *pair = FindPair(key); - - if (pair) - { - return pair->GetTopValue(); - } - - return defaultVal; -} - - - - - - - - - - - - - - -CGenericParser2::CGenericParser2(void) : - mTextPool(0), - mWriteable(false) -{ -} - -CGenericParser2::~CGenericParser2(void) -{ - Clean(); -} - -bool CGenericParser2::Parse(char **dataPtr, bool cleanFirst, bool writeable) -{ - CTextPool *topPool; - - if (cleanFirst) - { - Clean(); - } - - if (!mTextPool) - { - mTextPool = new CTextPool; - } - - SetWriteable(writeable); - mTopLevel.SetWriteable(writeable); - topPool = mTextPool; - return mTopLevel.Parse(dataPtr, &topPool); -} -void CGenericParser2::Clean(void) -{ - mTopLevel.Clean(); - CleanTextPool(mTextPool); - mTextPool = 0; -} -bool CGenericParser2::Write(CTextPool *textPool) -{ - return mTopLevel.Write(&textPool, -1); -} @@ -891,241 +286,21 @@ bool CGenericParser2::Write(CTextPool *textPool) -// The following groups of routines are used for a C interface into GP2. -// C++ users should just use the objects as normally and not call these routines below -// -// CGenericParser2 (void *) routines -TGenericParser2 GP_Parse(char **dataPtr, bool cleanFirst, bool writeable) +bool CGenericParser2::Parse( gsl::czstring filename ) { - CGenericParser2 *parse; - - parse = new CGenericParser2; - if (parse->Parse(dataPtr, cleanFirst, writeable)) + Clear(); + mFileContent = FS::ReadFile( filename ); + if ( !mFileContent.valid() ) { - return parse; - } - - delete parse; - return 0; -} - -void GP_Clean(TGenericParser2 GP2) -{ - if (!GP2) - { - return; - } - - ((CGenericParser2 *)GP2)->Clean(); -} - -void GP_Delete(TGenericParser2 *GP2) -{ - if (!GP2 || !(*GP2)) - { - return; - } - - delete ((CGenericParser2 *)(*GP2)); - (*GP2) = 0; -} - -TGPGroup GP_GetBaseParseGroup(TGenericParser2 GP2) -{ - if (!GP2) - { - return 0; - } - - return ((CGenericParser2 *)GP2)->GetBaseParseGroup(); -} - - - - -// CGPGroup (void *) routines -const char *GPG_GetName(TGPGroup GPG) -{ - if (!GPG) - { - return ""; - } - - return ((CGPGroup *)GPG)->GetName(); -} - -TGPGroup GPG_GetNext(TGPGroup GPG) -{ - if (!GPG) - { - return 0; - } - - return ((CGPGroup *)GPG)->GetNext(); -} - -TGPGroup GPG_GetInOrderNext(TGPGroup GPG) -{ - if (!GPG) - { - return 0; - } - - return ((CGPGroup *)GPG)->GetInOrderNext(); -} - -TGPGroup GPG_GetInOrderPrevious(TGPGroup GPG) -{ - if (!GPG) - { - return 0; - } - - return ((CGPGroup *)GPG)->GetInOrderPrevious(); -} - -TGPGroup GPG_GetPairs(TGPGroup GPG) -{ - if (!GPG) - { - return 0; - } - - return ((CGPGroup *)GPG)->GetPairs(); -} - -TGPGroup GPG_GetInOrderPairs(TGPGroup GPG) -{ - if (!GPG) - { - return 0; - } - - return ((CGPGroup *)GPG)->GetInOrderPairs(); -} - -TGPGroup GPG_GetSubGroups(TGPGroup GPG) -{ - if (!GPG) - { - return 0; - } - - return ((CGPGroup *)GPG)->GetSubGroups(); -} - -TGPGroup GPG_GetInOrderSubGroups(TGPGroup GPG) -{ - if (!GPG) - { - return 0; - } - - return ((CGPGroup *)GPG)->GetInOrderSubGroups(); -} - -TGPGroup GPG_FindSubGroup(TGPGroup GPG, const char *name) -{ - if (!GPG) - { - return 0; - } - - return ((CGPGroup *)GPG)->FindSubGroup(name); -} - -TGPValue GPG_FindPair(TGPGroup GPG, const char *key) -{ - if (!GPG) - { - return 0; - } - - return ((CGPGroup *)GPG)->FindPair(key); -} - -const char *GPG_FindPairValue(TGPGroup GPG, const char *key, const char *defaultVal) -{ - if (!GPG) - { - return defaultVal; - } - - return ((CGPGroup *)GPG)->FindPairValue(key, defaultVal); -} - - - - -// CGPValue (void *) routines -const char *GPV_GetName(TGPValue GPV) -{ - if (!GPV) - { - return ""; - } - - return ((CGPValue *)GPV)->GetName(); -} - -TGPValue GPV_GetNext(TGPValue GPV) -{ - if (!GPV) - { - return 0; - } - - return ((CGPValue *)GPV)->GetNext(); -} - -TGPValue GPV_GetInOrderNext(TGPValue GPV) -{ - if (!GPV) - { - return 0; - } - - return ((CGPValue *)GPV)->GetInOrderNext(); -} - -TGPValue GPV_GetInOrderPrevious(TGPValue GPV) -{ - if (!GPV) - { - return 0; - } - - return ((CGPValue *)GPV)->GetInOrderPrevious(); -} - -bool GPV_IsList(TGPValue GPV) -{ - if (!GPV) - { - return 0; - } - - return ((CGPValue *)GPV)->IsList(); -} - -const char *GPV_GetTopValue(TGPValue GPV) -{ - if (!GPV) - { - return ""; + return false; } - - return ((CGPValue *)GPV)->GetTopValue(); + auto view = mFileContent.view(); + return mTopLevel.Parse( view ); } -TGPValue GPV_GetList(TGPValue GPV) +void CGenericParser2::Clear() NOEXCEPT { - if (!GPV) - { - return 0; - } - - return ((CGPValue *)GPV)->GetList(); + mTopLevel.Clear(); } diff --git a/codeJK2/game/genericparser2.h b/codeJK2/game/genericparser2.h index c3d0988673..815d96ff6b 100644 --- a/codeJK2/game/genericparser2.h +++ b/codeJK2/game/genericparser2.h @@ -20,207 +20,169 @@ along with this program; if not, see . =========================================================================== */ -#ifndef GENERICPARSER2_H -#define GENERICPARSER2_H - -// conditional expression is constant -// conversion from int to char, possible loss of data -// unreferenced inline funciton has been removed -#pragma warning( disable : 4127 4244 4514 ) +// Filename:- genericparser2.h +#include +#include +#include +#include -#ifdef DEBUG_LINKING - #pragma message("...including GenericParser2.h") -#endif - -//#include "disablewarnings.h" - -#ifdef _JK2EXE -#define trap_Z_Malloc(x, y) Z_Malloc(x,y,qtrue) -#define trap_Z_Free(x) Z_Free(x) -#else -#define trap_Z_Malloc(x, y) gi.Malloc(x,y,qtrue) -#define trap_Z_Free(x) gi.Free(x) -#endif - +#include "qcommon/safe/gsl.h" +#include "qcommon/safe/memory.h" +#include "qcommon/safe/files.h" +#include "qcommon/safe/string.h" -class CTextPool; -class CGPObject; +#ifndef GENERICPARSER2_H +#define GENERICPARSER2_H -class CTextPool +namespace GP2 { -private: - char *mPool; - CTextPool *mNext; - int mSize, mUsed; + template< typename T > + using Vector = std::vector< T, Zone::Allocator< T, TAG_GP2 > >; +} +class CGPProperty +{ public: - CTextPool(int initSize = 10240); - ~CTextPool(void); - - CTextPool *GetNext(void) { return mNext; } - void SetNext(CTextPool *which) { mNext = which; } - char *GetPool(void) { return mPool; } - int GetUsed(void) { return mUsed; } - - char *AllocText(char *text, bool addNULL = true, CTextPool **poolPtr = 0); -}; - -void CleanTextPool(CTextPool *pool); + using Values = GP2::Vector< gsl::cstring_view >; +private: + gsl::cstring_view mKey; + Values mValues; -class CGPObject -{ -protected: - const char *mName; - CGPObject *mNext, *mInOrderNext, *mInOrderPrevious; public: - CGPObject(const char *initName); - const char *GetName(void) { return mName; } + CGPProperty( gsl::cstring_view initKey, gsl::cstring_view initValue = {} ); - CGPObject *GetNext(void) { return mNext; } - void SetNext(CGPObject *which) { mNext = which; } - CGPObject *GetInOrderNext(void) { return mInOrderNext; } - void SetInOrderNext(CGPObject *which) { mInOrderNext = which; } - CGPObject *GetInOrderPrevious(void) { return mInOrderPrevious; } - void SetInOrderPrevious(CGPObject *which) { mInOrderPrevious = which; } - - bool WriteText(CTextPool **textPool, const char *text); + const gsl::cstring_view& GetName() const + { + return mKey; + } + bool IsList() const NOEXCEPT + { + return mValues.size() > 1; + } + const gsl::cstring_view& GetTopValue() const NOEXCEPT + { + static gsl::cstring_view empty{}; + return mValues.empty() ? empty : mValues.front(); + } + const Values& GetValues() const NOEXCEPT + { + return mValues; + } + // Copies the value into the textPool and adds a pointer to that copy to the end of the list. + void AddValue( gsl::cstring_view newValue ); }; -class CGPValue : public CGPObject +class CGPGroup { +public: + /// Key-Value-Pairs + using Properties = GP2::Vector< CGPProperty >; + using SubGroups = GP2::Vector< CGPGroup >; private: - CGPObject *mList; - + Properties mProperties; + gsl::cstring_view mName = CSTRING_VIEW( "Top Level" ); + SubGroups mSubGroups; public: - CGPValue(const char *initName, const char *initValue = 0); - ~CGPValue(void); - - CGPValue *GetNext(void) { return (CGPValue *)mNext; } - - CGPValue *Duplicate(CTextPool **textPool = 0); - - bool IsList(void); - const char *GetTopValue(void); - CGPObject *GetList(void) { return mList; } - void AddValue(const char *newValue, CTextPool **textPool = 0); - - bool Parse(char **dataPtr, CTextPool **textPool); + CGPGroup() = default; + CGPGroup( const gsl::cstring_view& initName ); + // non-copyable; but just for performance reasons, since it would incur a deep copy. + CGPGroup( const CGPGroup& ) = delete; + CGPGroup& operator=( const CGPGroup& ) = delete; + // movable +#if defined( _MSC_VER ) && _MSC_VER < 1900 + // alas no default move constructors on VS2013. + // TODO DELETEME once we drop VS2013 (because fuck that). + CGPGroup( CGPGroup&& rhs ) + : mProperties( std::move( rhs.mProperties ) ) + , mName( std::move( rhs.mName ) ) + , mSubGroups( std::move( rhs.mSubGroups ) ) + {} + CGPGroup& operator=( CGPGroup&& rhs ) + { + mProperties = std::move( rhs.mProperties ); + mName = std::move( rhs.mName ); + mSubGroups = std::move( rhs.mSubGroups ); + return *this; + } +#else + CGPGroup( CGPGroup&& ) = default; + CGPGroup& operator=( CGPGroup&& ) = default; +#endif - bool Write(CTextPool **textPool, int depth); + const Properties& GetProperties() const NOEXCEPT + { + return mProperties; + } + const SubGroups& GetSubGroups() const NOEXCEPT + { + return mSubGroups; + } + const CGPGroup* FindSubGroup( const gsl::cstring_view& name ) const NOEXCEPT + { + for ( auto& sub : GetSubGroups() ) + { + if ( Q::stricmp( name, sub.GetName() ) == Q::Ordering::EQ ) + { + return ⊂ + } + } + return nullptr; + } + const CGPProperty* FindProperty( const gsl::cstring_view& name ) const NOEXCEPT + { + for ( auto& prop : GetProperties() ) + { + if ( Q::stricmp( name, prop.GetName() ) == Q::Ordering::EQ ) + { + return ∝ + } + } + return nullptr; + } + const gsl::cstring_view& GetName() const NOEXCEPT + { + return mName; + } + void Clear() NOEXCEPT + { + // name is retained + mProperties.clear(); + mSubGroups.clear(); + } + bool Parse( gsl::cstring_view& data, const bool topLevel = true ); }; +/** +Generic Text Parser. - -class CGPGroup : public CGPObject -{ -private: - CGPValue *mPairs, *mInOrderPairs; - CGPValue *mCurrentPair; - CGPGroup *mSubGroups, *mInOrderSubGroups; - CGPGroup *mCurrentSubGroup; - CGPGroup *mParent; - bool mWriteable; - - void SortObject(CGPObject *object, CGPObject **unsortedList, CGPObject **sortedList, - CGPObject **lastObject); - -public: - CGPGroup(const char *initName = "Top Level", CGPGroup *initParent = 0); - ~CGPGroup(void); - - CGPGroup *GetNext(void) { return (CGPGroup *)mNext; } - int GetNumSubGroups(void); - int GetNumPairs(void); - - void Clean(void); - CGPGroup *Duplicate(CTextPool **textPool = 0, CGPGroup *initParent = 0); - - void SetWriteable(const bool writeable) { mWriteable = writeable; } - CGPValue *GetPairs(void) { return mPairs; } - CGPValue *GetInOrderPairs(void) { return mInOrderPairs; } - CGPGroup *GetSubGroups(void) { return mSubGroups; } - CGPGroup *GetInOrderSubGroups(void) { return mInOrderSubGroups; } - - CGPValue *AddPair(const char *name, const char *value, CTextPool **textPool = 0); - void AddPair(CGPValue *NewPair); - CGPGroup *AddGroup(const char *name, CTextPool **textPool = 0); - void AddGroup(CGPGroup *NewGroup); - CGPGroup *FindSubGroup(const char *name); - bool Parse(char **dataPtr, CTextPool **textPool); - bool Write(CTextPool **textPool, int depth); - - CGPValue *FindPair(const char *key); - const char *FindPairValue(const char *key, const char *defaultVal = 0); -}; - +Used to parse effect files and the dynamic music system files. Parses blocks of the form `name { \n ... \n }`; blocks can contain other blocks or properties of the form `key value`. Value can also be a list; in that case the format is `key [\n value1 \n value2\n]`. Mind the separating newlines, values are actually newline-delimited. +*/ class CGenericParser2 { private: - CGPGroup mTopLevel; - CTextPool *mTextPool; - bool mWriteable; + CGPGroup mTopLevel; + FS::FileBuffer mFileContent; public: - CGenericParser2(void); - ~CGenericParser2(void); - - void SetWriteable(const bool writeable) { mWriteable = writeable; } - CGPGroup *GetBaseParseGroup(void) { return &mTopLevel; } - bool Parse(char **dataPtr, bool cleanFirst = true, bool writeable = false); - bool Parse(char *dataPtr, bool cleanFirst = true, bool writeable = false) + const CGPGroup& GetBaseParseGroup() { - return Parse(&dataPtr, cleanFirst, writeable); + return mTopLevel; } - void Clean(void); - bool Write(CTextPool *textPool); + bool Parse( gsl::czstring filename ); + void Clear() NOEXCEPT; + bool ValidFile() const NOEXCEPT + { + return mFileContent.valid(); + } }; - - -// The following groups of routines are used for a C interface into GP2. -// C++ users should just use the objects as normally and not call these routines below -// - -typedef void *TGenericParser2; -typedef void *TGPGroup; -typedef void *TGPValue; - -// CGenericParser2 (void *) routines -TGenericParser2 GP_Parse(char **dataPtr, bool cleanFirst, bool writeable); -void GP_Clean(TGenericParser2 GP2); -void GP_Delete(TGenericParser2 *GP2); -TGPGroup GP_GetBaseParseGroup(TGenericParser2 GP2); - -// CGPGroup (void *) routines -const char *GPG_GetName(TGPGroup GPG); -TGPGroup GPG_GetNext(TGPGroup GPG); -TGPGroup GPG_GetInOrderNext(TGPGroup GPG); -TGPGroup GPG_GetInOrderPrevious(TGPGroup GPG); -TGPGroup GPG_GetPairs(TGPGroup GPG); -TGPGroup GPG_GetInOrderPairs(TGPGroup GPG); -TGPGroup GPG_GetSubGroups(TGPGroup GPG); -TGPGroup GPG_GetInOrderSubGroups(TGPGroup GPG); -TGPGroup GPG_FindSubGroup(TGPGroup GPG, const char *name); -TGPValue GPG_FindPair(TGPGroup GPG, const char *key); -const char *GPG_FindPairValue(TGPGroup GPG, const char *key, const char *defaultVal); - -// CGPValue (void *) routines -const char *GPV_GetName(TGPValue GPV); -TGPValue GPV_GetNext(TGPValue GPV); -TGPValue GPV_GetInOrderNext(TGPValue GPV); -TGPValue GPV_GetInOrderPrevious(TGPValue GPV); -bool GPV_IsList(TGPValue GPV); -const char *GPV_GetTopValue(TGPValue GPV); -TGPValue GPV_GetList(TGPValue GPV); - - #endif // #ifndef GENERICPARSER2_H diff --git a/codeJK2/qcommon/safe/memory.h b/codeJK2/qcommon/safe/memory.h new file mode 100644 index 0000000000..1f21985234 --- /dev/null +++ b/codeJK2/qcommon/safe/memory.h @@ -0,0 +1,99 @@ +#pragma once + +#ifdef _JK2EXE +# include "qcommon/qcommon.h" +#else +# include "game/g_shared.h" +#endif + +#include +#include + +namespace Zone +{ + namespace detail + { + inline void* Malloc( int iSize, memtag_t eTag, bool bZeroit = false ) + { +#ifdef _JK2EXE + return Z_Malloc( iSize, eTag, bZeroit ); +#else + return gi.Malloc( iSize, eTag, bZeroit ); +#endif + } + inline int Free( void* pvAddress ) + { +#ifdef _JK2EXE + return Z_Free( pvAddress ); +#else + return gi.Free( pvAddress ); +#endif + } + } + /** + Zone Deleter - for use with smart pointers. + */ + struct Deleter + { + void operator()( void* memory ) const NOEXCEPT + { + detail::Free( memory ); + } + }; + + /** + Zone Allocator - for use with the STL + */ + template< typename T, memtag_t tag > + struct Allocator + { + Allocator() = default; + template< typename U > + Allocator( const Allocator< U, tag >& ) + { + }; + using value_type = T; + using is_always_equal = std::true_type; + T* allocate( std::size_t n ) const + { + void* mem = detail::Malloc( n * sizeof( T ), tag ); + return static_cast< T* >( mem ); + } + void deallocate( T* mem, std::size_t n ) const NOEXCEPT + { + Deleter{}( mem ); + } + template< typename T2, memtag_t tag2 > + bool operator==( const Allocator< T2, tag2 >& ) const NOEXCEPT + { + return true; // free works regardless of size and tag + } + template< typename T2, memtag_t tag2 > + bool operator!=( const Allocator< T2, tag2 >& ) const NOEXCEPT + { + return false; + } + // I think the standard guarantees automatic generation of this, but MSVC can't handle it. + template< typename U > + struct rebind + { + using other = Allocator< U, tag >; + }; + }; + + template< typename T > + using UniquePtr = std::unique_ptr< T, Deleter >; + + /** + make_unique using Zone Allocations (with appropriate deleter) + */ + template< typename T, memtag_t tag, typename... Args > + inline UniquePtr< T > make_unique( Args&&... args ) + { + UniquePtr< void > memory( Allocator< T, tag >{}.allocate( 1 ) ); + // placement new. may throw, in which case the unique_ptr will take care of freeing the memory. + T* obj = new( memory )T( std::forward< Args >( args )... ); + memory.release(); + return UniquePtr< T >( obj ); + } +} From ee3bf1cd4c125ef194b131efe2c5f1f00e8d0767 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Wed, 6 Jan 2016 12:41:44 -0600 Subject: [PATCH 124/445] Generic: Removed leftover unused console hotswap input code. --- code/client/cl_input_hotswap.cpp | 246 ------------------------------- code/client/cl_input_hotswap.h | 64 -------- code/client/client.h | 3 - codemp/client/client.h | 5 - 4 files changed, 318 deletions(-) delete mode 100644 code/client/cl_input_hotswap.cpp delete mode 100644 code/client/cl_input_hotswap.h diff --git a/code/client/cl_input_hotswap.cpp b/code/client/cl_input_hotswap.cpp deleted file mode 100644 index e2384103f3..0000000000 --- a/code/client/cl_input_hotswap.cpp +++ /dev/null @@ -1,246 +0,0 @@ -/* - TODO: finalize item support - - 1) Make ItemSelectUp() work. - 2) Change cg.itemSelect to whatever var is used to store selected item. - 3) Make sure commands in itemCommands work in both multi & single player. -*/ - -#ifdef _JK2MP -#include "../../codemp/client/client.h" -#include "../../codemp/cgame/cg_local.h" -#else -#include "client.h" -#include "../cgame/cg_local.h" -#endif - -#include "cl_input_hotswap.h" - - -#ifdef _JK2MP -#define FORCESELECTTIME forceSelectTime -#define FORCESELECT forceSelect -#define INVSELECTTIME invenSelectTime -#define INVSELECT itemSelect -#define REGISTERSOUND S_RegisterSound -#define STARTSOUND S_StartLocalSound -#define WEAPONBINDSTR "weaponclean" -#else -#define FORCESELECTTIME forcepowerSelectTime -#define FORCESELECT forcepowerSelect -#define INVSELECTTIME inventorySelectTime -#define INVSELECT inventorySelect -#define REGISTERSOUND cgi_S_RegisterSound -#define STARTSOUND cgi_S_StartLocalSound -#define WEAPONBINDSTR "weapon" -#endif - -#define BIND_TIME 3000 //number of milliseconds button is held before binding -#define EXEC_TIME 500 //max ms button can be held to execute in bind mode - - -#ifdef _JK2MP -const char *itemCommands[HI_NUM_HOLDABLE] = { - NULL, //HI_NONE - "use_seeker\n", - "use_field\n", - "use_bacta\n", - "use_bactabig\n", - "use_electrobinoculars\n", - "use_sentry\n", - "use_jetpack\n", - NULL, //ammo dispenser - NULL, //health dispenser - "use_eweb\n", - "use_cloak\n", -}; -#else -const char *itemCommands[INV_MAX] = { - "use_electrobinoculars\n", - "use_bacta\n", - "use_seeker\n", - "use_goggles\n", - "use_sentry\n", - NULL, //goodie key - NULL, //security key -}; -#endif - - - -HotSwapManager::HotSwapManager(int uniqueID) : - uniqueID(uniqueID), - forceBound(false) -{ - Reset(); -} - - -char *HotSwapManager::GetBinding(void) -{ - char buf[64]; - - sprintf(buf, "hotswap%d", uniqueID); - cvar_t *cvar = Cvar_Get(buf, "", CVAR_ARCHIVE); - - if(cvar && cvar->string[0] != 0) { - return cvar->string; - } else { - return NULL; - } -} - - -void HotSwapManager::Bind(void) -{ - forceBound = false; - - if(WeaponSelectUp()) { - HotSwapBind(uniqueID, HOTSWAP_CAT_WEAPON, cg.weaponSelect); - } else if(ForceSelectUp()) { - forceBound = true; - HotSwapBind(uniqueID, HOTSWAP_CAT_FORCE, -#ifdef _JK2MP - cg.FORCESELECT -#else - showPowers[cg.FORCESELECT] -#endif - ); - } else if(ItemSelectUp()) { - HotSwapBind(uniqueID, HOTSWAP_CAT_ITEM, cg.INVSELECT); - } else{ - assert(0); - } - - noExec = true; - noBind = true; - STARTSOUND(REGISTERSOUND("sound/interface/update"), 0); -} - - -bool HotSwapManager::ForceSelectUp(void) -{ - return cg.FORCESELECTTIME != 0 && - (cg.FORCESELECTTIME + WEAPON_SELECT_TIME >= cg.time); -} - - -bool HotSwapManager::WeaponSelectUp(void) -{ - return cg.weaponSelectTime != 0 && - (cg.weaponSelectTime + WEAPON_SELECT_TIME >= cg.time); -} - - -bool HotSwapManager::ItemSelectUp(void) -{ - return cg.INVSELECTTIME != 0 && - (cg.INVSELECTTIME + WEAPON_SELECT_TIME >= cg.time); -} - - -bool HotSwapManager::HUDInBindState(void) -{ - return ForceSelectUp() || WeaponSelectUp() || ItemSelectUp(); -} - - -void HotSwapManager::Update(void) -{ - if(down) { - //Increment bindTime only if HUD is in select mode. - if(HUDInBindState()) { - bindTime += cls.frametime; - } else { - - //Clear bind time. - bindTime = 0; - - //If a force power is bound, want to execute whenever the button - //is down to handle powers which can be held. - if(forceBound) { - Execute(); - } - } - downTime += cls.frametime; - } - - //Down long enough, bind button. - if(!noBind && bindTime >= BIND_TIME) { - Bind(); - } -} - - -void HotSwapManager::Execute(void) -{ - char *binding = GetBinding(); - if(binding && !noExec) { - if(!forceBound) { - noExec = true; - } - Cbuf_ExecuteText(EXEC_APPEND, binding); - } -} - - -void HotSwapManager::SetDown(void) -{ - //Set the down flag. - down = true; - - //Execute the bind if the HUD isn't up. - if(!HUDInBindState()) { - Execute(); - } -} - - -void HotSwapManager::SetUp(void) -{ - //Execute the bind if the button was held down for long enough. - if(downTime <= EXEC_TIME) { - Execute(); - } - - Reset(); -} - - -void HotSwapManager::Reset(void) -{ - down = false; - downTime = 0; - bindTime = 0; - noExec = false; - noBind = false; -} - - -static void HotSwapBind(const char *uniqueID, const char *value) -{ - Cvar_Set(uniqueID, value); -} - - -void HotSwapBind(int buttonID, int category, int value) -{ - char uniqueID[64]; - sprintf(uniqueID, "hotswap%d", buttonID); - - switch(category) { - case HOTSWAP_CAT_WEAPON: - HotSwapBind(uniqueID, va("%s %d\n", WEAPONBINDSTR, value)); - break; - case HOTSWAP_CAT_ITEM: - assert(itemCommands[value]); - HotSwapBind(uniqueID, itemCommands[value]); - break; - case HOTSWAP_CAT_FORCE: - HotSwapBind(uniqueID, va("useGivenForce %d\n", value)); - break; - default: - assert(0); - } -} - diff --git a/code/client/cl_input_hotswap.h b/code/client/cl_input_hotswap.h deleted file mode 100644 index 174456e7bb..0000000000 --- a/code/client/cl_input_hotswap.h +++ /dev/null @@ -1,64 +0,0 @@ -#ifndef __CL_INPUT_HOTSWAP_H -#define __CL_INPUT_HOTSWAP_H - - -#define HOTSWAP_ID_WHITE 0 -#define HOTSWAP_ID_BLACK 1 - -#define HOTSWAP_CAT_WEAPON 0 -#define HOTSWAP_CAT_ITEM 1 -#define HOTSWAP_CAT_FORCE 2 - - -class HotSwapManager -{ -private: - bool down; //Is the button down? - bool noExec; //Don't execute the button's bind. - bool noBind; //Don't bind the button. - bool forceBound;//Is a force power currently bound? - int downTime; //How long the button has been held down. - int bindTime; //How long the button has been down with the selection up. - int uniqueID; //Unique ID for this button. - - //Return the binding for the button, or NULL if none. - char *GetBinding(void); - - //Returns true if the weapon/force/item select screen is up. - bool HUDInBindState(void); - - //Returns true if the weapon/force/item select screen is up. - bool ForceSelectUp(void); - bool WeaponSelectUp(void); - bool ItemSelectUp(void); - - //Binds the button based on the current HUD selection. - void Bind(void); - - //Execute the current bind, if there is one. - void Execute(void); - - //Reset the object to the default state. - void Reset(void); - -public: - HotSwapManager(int uniqueID); - - //Call every frame. Uses cg.frametime to increment timers. - void Update(void); - - //Set the button down or up. - void SetDown(void); - void SetUp(void); - - //Returns true if the button is currently down. - bool ButtonDown(void) { return down; } -}; - - -//External bind function for sharing with UI. -extern void HotSwapBind(int buttonID, int category, int value); - - - -#endif diff --git a/code/client/client.h b/code/client/client.h index 9eefc002a6..3e57d5c4d9 100644 --- a/code/client/client.h +++ b/code/client/client.h @@ -313,9 +313,6 @@ extern kbutton_t in_speed; void CL_InitInput (void); void CL_SendCmd (void); void CL_ClearState (void); -void CL_ReadPackets (void); -void CL_UpdateHotSwap(void); -bool CL_ExtendSelectTime(void); void CL_WritePacket( void ); void IN_CenterView (void); diff --git a/codemp/client/client.h b/codemp/client/client.h index 641e804073..58b5b2e48a 100644 --- a/codemp/client/client.h +++ b/codemp/client/client.h @@ -472,13 +472,10 @@ void CL_InitInput (void); void CL_ShutdownInput(void); void CL_SendCmd (void); void CL_ClearState (void); -void CL_ReadPackets (void); void CL_WritePacket( void ); void IN_CenterView (void); -void CL_VerifyCode( void ); - float CL_KeyState (kbutton_t *key); const char *Key_KeynumToString( int keynum/*, qboolean bTranslate */ ); //note: translate is only called for menu display not configs @@ -559,8 +556,6 @@ void CIN_SetLooping (int handle, qboolean loop); void CIN_UploadCinematic(int handle); void CIN_CloseAllVideos(void); -void CL_UpdateHotSwap(void); - // // cl_cgame.c // From f8cbe64dd8aa3928adc271291ae14d9b02c60406 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sun, 10 Jan 2016 12:22:39 -0600 Subject: [PATCH 125/445] JK2: Fix seg fault in Jedi AI with portable turrets. --- codeJK2/game/AI_Jedi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codeJK2/game/AI_Jedi.cpp b/codeJK2/game/AI_Jedi.cpp index f942e67c5a..ef5d3b592c 100644 --- a/codeJK2/game/AI_Jedi.cpp +++ b/codeJK2/game/AI_Jedi.cpp @@ -3309,7 +3309,7 @@ static void Jedi_CombatTimersUpdate( int enemy_dist ) NPC->client->ps.forcePowerDebounce[FP_SABER_DEFENSE] = level.time + 500; } */ - if ( NPC->enemy && PM_SaberInKnockaway( NPC->enemy->client->ps.saberMove ) ) + if ( NPC->enemy && (!NPC->enemy->client||PM_SaberInKnockaway( NPC->enemy->client->ps.saberMove )) ) {//advance! Jedi_Aggression( NPC, 1 );//get closer Jedi_AdjustSaberAnimLevel( NPC, (NPC->client->ps.saberAnimLevel-1) );//use a faster attack From f1a9568790f58a79ce6fda302aee468b88bc3867 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sun, 10 Jan 2016 13:04:52 -0600 Subject: [PATCH 126/445] Shared Unix: SIGABRT is in ANSI and POSIX.1, and SIGIOT isn't. From ioquake/ioq3@9c52d6c2bfe95a29268f9ca9009e4947f2d9f15b Credits to Pan7 --- shared/sys/sys_unix.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/sys/sys_unix.cpp b/shared/sys/sys_unix.cpp index 7422c782b4..d5c6c4a27e 100644 --- a/shared/sys/sys_unix.cpp +++ b/shared/sys/sys_unix.cpp @@ -50,7 +50,7 @@ void Sys_PlatformInit( void ) signal( SIGHUP, Sys_SigHandler ); signal( SIGQUIT, Sys_SigHandler ); signal( SIGTRAP, Sys_SigHandler ); - signal( SIGIOT, Sys_SigHandler ); + signal( SIGABRT, Sys_SigHandler ); signal( SIGBUS, Sys_SigHandler ); if (isatty( STDIN_FILENO ) && !( term && ( !strcmp( term, "raw" ) || !strcmp( term, "dumb" ) ) )) From a210e3f592afc9691caf00450bde72382f239a1e Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sun, 10 Jan 2016 13:06:26 -0600 Subject: [PATCH 127/445] SDL: Few issues adjusted in SDL window mode function: Display warning if no display index found. Move r_availableModes initialization above being set so it doesn't clear value. Developer warn if gamma ramp set failed. --- shared/sdl/sdl_window.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/shared/sdl/sdl_window.cpp b/shared/sdl/sdl_window.cpp index 9ac5bccc86..574a174453 100644 --- a/shared/sdl/sdl_window.cpp +++ b/shared/sdl/sdl_window.cpp @@ -230,11 +230,17 @@ static bool GLimp_DetectAvailableModes(void) int numModes = 0; int display = SDL_GetWindowDisplayIndex( screen ); + if ( display < 0 ) + { + Com_Printf( S_COLOR_YELLOW "WARNING: Couldn't get window display index, no resolutions detected: %s\n", SDL_GetError() ); + return; + } + SDL_DisplayMode windowMode; if( SDL_GetWindowDisplayMode( screen, &windowMode ) < 0 ) { - Com_Printf( "Couldn't get window display mode, no resolutions detected (%s).\n", SDL_GetError() ); + Com_Printf( S_COLOR_YELLOW "WARNING: Couldn't get window display mode, no resolutions detected (%s).\n", SDL_GetError() ); return false; } @@ -736,6 +742,7 @@ window_t WIN_Init( const windowDesc_t *windowDesc, glconfig_t *glConfig ) r_colorbits = Cvar_Get( "r_colorbits", "0", CVAR_ARCHIVE|CVAR_LATCH ); r_ignorehwgamma = Cvar_Get( "r_ignorehwgamma", "0", CVAR_ARCHIVE|CVAR_LATCH ); r_ext_multisample = Cvar_Get( "r_ext_multisample", "0", CVAR_ARCHIVE|CVAR_LATCH ); + Cvar_Get( "r_availableModes", "", CVAR_ROM ); // Create the window and set up the context if(!GLimp_StartDriverAndSetMode( glConfig, windowDesc, r_mode->integer, @@ -756,8 +763,6 @@ window_t WIN_Init( const windowDesc_t *windowDesc, glconfig_t *glConfig ) glConfig->deviceSupportsGamma = (qboolean)(!r_ignorehwgamma->integer && SDL_SetWindowBrightness( screen, 1.0f ) >= 0); - Cvar_Get( "r_availableModes", "", CVAR_ROM ); - // This depends on SDL_INIT_VIDEO, hence having it here IN_Init( screen ); @@ -858,7 +863,10 @@ void WIN_SetGamma( glconfig_t *glConfig, byte red[256], byte green[256], byte bl } } - SDL_SetWindowGammaRamp(screen, table[0], table[1], table[2]); + if ( SDL_SetWindowGammaRamp( screen, table[0], table[1], table[2] ) < 0 ) + { + Com_DPrintf( "SDL_SetWindowGammaRamp() failed: %s\n", SDL_GetError() ); + } } void *WIN_GL_GetProcAddress( const char *proc ) From 4ad9ed4a406790668df86b492dca37426b210c95 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sun, 10 Jan 2016 13:07:59 -0600 Subject: [PATCH 128/445] SDL: Fix last commit failure. --- shared/sdl/sdl_window.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/sdl/sdl_window.cpp b/shared/sdl/sdl_window.cpp index 574a174453..d617583577 100644 --- a/shared/sdl/sdl_window.cpp +++ b/shared/sdl/sdl_window.cpp @@ -233,7 +233,7 @@ static bool GLimp_DetectAvailableModes(void) if ( display < 0 ) { Com_Printf( S_COLOR_YELLOW "WARNING: Couldn't get window display index, no resolutions detected: %s\n", SDL_GetError() ); - return; + return false; } SDL_DisplayMode windowMode; From 0226f2456dc1810ee196d385a5330f7aa97db6f1 Mon Sep 17 00:00:00 2001 From: Dusty Date: Mon, 11 Jan 2016 14:16:05 -0500 Subject: [PATCH 129/445] work in progress --- code/game/AI_Jedi.cpp | 184 +-- code/game/NPC.cpp | 8 + code/game/NPC_behavior.cpp | 10 +- code/game/bg_pangles.cpp | 18 +- code/game/bg_pmove.cpp | 3 +- code/game/g_local.h | 6 +- code/game/g_main.cpp | 4 +- code/game/g_weapon.cpp | 5 + code/game/g_weaponLoad.cpp | 8 +- code/game/wp_saber.cpp | 3100 +++++++++++++++++++++++------------- code/game/wp_saber.h | 5 +- 11 files changed, 2117 insertions(+), 1234 deletions(-) diff --git a/code/game/AI_Jedi.cpp b/code/game/AI_Jedi.cpp index 313461881e..5b8205971a 100644 --- a/code/game/AI_Jedi.cpp +++ b/code/game/AI_Jedi.cpp @@ -106,7 +106,11 @@ qboolean Jedi_WaitingAmbush( gentity_t *self ); void Tavion_SithSwordRecharge( void ); qboolean Rosh_BeingHealed( gentity_t *self ); -static qboolean enemy_in_striking_range = qfalse; +//for approximating the distance of an enemy Jedi +static qboolean enemy_in_range = qfalse; +static qboolean enemy_near = qfalse; +static qboolean enemy_approaching = qfalse; + static int jediSpeechDebounceTime[TEAM_NUM_TEAMS];//used to stop several jedi from speaking all at once void NPC_CultistDestroyer_Precache( void ) @@ -1249,10 +1253,10 @@ static void Jedi_CheckDecreaseSaberAnimLevel( void ) } } -static qboolean Jedi_DecideKick( void ) +static qboolean Jedi_DecideKick( int enemy_dist ) { - if ( !enemy_in_striking_range ) - { //more distance checks before calls too, this is just some redundancy + if ( enemy_dist > 0 ) + { return qfalse; } if ( PM_InKnockDown( &NPC->client->ps ) ) @@ -1557,7 +1561,7 @@ static void Jedi_CombatDistance( int enemy_dist ) } else { - if ( Jedi_DecideKick() && enemy_dist <= 16 ) + if ( Jedi_DecideKick(enemy_dist) ) {//let's try a kick if ( G_PickAutoMultiKick( NPC, qfalse, qtrue ) != LS_NONE || (G_CanKickEntity(NPC, NPC->enemy ) && G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE ) ) @@ -1597,7 +1601,7 @@ static void Jedi_CombatDistance( int enemy_dist ) Tavion_StartScepterSlam(); return; } - if ( Jedi_DecideKick() ) + if ( Jedi_DecideKick(enemy_dist) ) {//let's try a kick if ( G_PickAutoMultiKick( NPC, qfalse, qtrue ) != LS_NONE || (G_CanKickEntity(NPC, NPC->enemy ) && G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE ) ) @@ -1625,7 +1629,7 @@ static void Jedi_CombatDistance( int enemy_dist ) Tavion_StartScepterSlam(); return; } - if ( Jedi_DecideKick() ) + if ( Jedi_DecideKick(enemy_dist) ) {//let's try a kick if ( G_PickAutoMultiKick( NPC, qfalse, qtrue ) != LS_NONE || (G_CanKickEntity(NPC, NPC->enemy ) && G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE ) ) @@ -1958,8 +1962,8 @@ static void Jedi_CombatDistance( int enemy_dist ) } if ( NPCInfo->stats.aggression < 4 ) {//back off and defend - if ( Jedi_DecideKick() ) - {//let's try a kick, only if enemy is at least in striking range by now + if ( Jedi_DecideKick(enemy_dist) ) + {//let's try a kick if ( G_PickAutoMultiKick( NPC, qfalse, qtrue ) != LS_NONE || (G_CanKickEntity(NPC, NPC->enemy ) && G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE ) ) {//kicked! @@ -2101,6 +2105,7 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in { int dodgeAnim = -1; qboolean playerNoDrain = false; + qboolean playerPerfectDodge = false; if ( !self || !self->client || self->health <= 0 ) { @@ -2145,58 +2150,35 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in if (self->client->ps.forcePowerLevel[FP_SPEED] < 2) { return qfalse; } - if (!(self->client->ps.forcePowersActive&(1 << FP_SPEED))) - {//not already in speed - if (self->client->ps.forcePowerLevel[FP_SPEED] == 2 - && !(self->client->ps.forcePower >= S2_AUTODODGE_FP)) - {//make sure we have adequate force power - return qfalse; - } - else if (self->client->ps.forcePowerLevel[FP_SPEED] == 3 - && !(self->client->ps.forcePower >= S3_AUTODODGE_FP)) - {//make sure we have adequate force power - return qfalse; - } + if (self->client->ps.forcePowersActive&(1 << FP_SPEED)) { + return qfalse; //you're already moving so fast, player should just dodge manually } - if (self->client->ps.forcePowersActive&(1 << FP_SPEED)) - {//in speed so drains are further reduced - if (self->client->ps.forcePowersActive&(1 << FP_SEE)) { - if (!(self->client->ps.forcePowerLevel[FP_SPEED] == 3 - && self->client->ps.forcePowerLevel[FP_SEE] == 3)) { - //we have both Sense 3 and Speed 3 active so no drain - playerNoDrain = qtrue; - } - } - else if (self->client->ps.forcePowerLevel[FP_SPEED] == 3) { - if (!(self->client->ps.forcePower > S3_DODGE_FP)) - {//make sure we have it and have enough force power (5 fp) - return qfalse; - } - } - else if (self->client->ps.forcePowerLevel[FP_SPEED] == 2) { - if (!(self->client->ps.forcePower > S2_DODGE_FP)) - {//make sure we have it and have enough force power (10 fp) - return qfalse; - } - } + + if (self->client->ps.forcePowerLevel[FP_SPEED] == 2 + && !(self->client->ps.forcePower >= S2_AUTODODGE_FP)) + {//make sure we have adequate force power + return qfalse; } - //check force speed power level to determine if I should be able to dodge it - if (self->client->ps.forcePowersActive&(1 << FP_SPEED) - && self->client->ps.forcePowersActive&(1 << FP_SEE) - && self->client->ps.forcePowerLevel[FP_SPEED] == 3 - && self->client->ps.forcePowerLevel[FP_SEE] == 3) - { - //always dodge + else if (self->client->ps.forcePowerLevel[FP_SPEED] == 3 + && !(self->client->ps.forcePower >= S3_AUTODODGE_FP)) + {//make sure we have adequate force power + return qfalse; } - else if (self->client->ps.forcePowersActive&(1 << FP_SPEED) - && ucmd.buttons&BUTTON_USE) - { - //dodge if holding use and in speed + + if (self->client->ps.forcePowersActive&(1 << FP_SEE)) { + if (!(self->client->ps.forcePowerLevel[FP_SPEED] == 3 + && self->client->ps.forcePowerLevel[FP_SEE] == 3)) { + //we have both Sense 3 and Speed 3 so no drain + playerNoDrain = qtrue; + playerPerfectDodge = qtrue; + } } - else if (Q_irand(1, 10) > self->client->ps.forcePowerLevel[FP_SPEED]) //auto-dodge + + if (!playerPerfectDodge && Q_irand(1, 10) > self->client->ps.forcePowerLevel[FP_SPEED]) //auto-dodge {//more likely to fail on lower force speed level return qfalse; } + } else { //old force power version if (!(self->client->ps.forcePowersActive&(1 << FP_SPEED))) @@ -2364,10 +2346,13 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in else {//player if (g_forceNewPowers->integer) - {//this version is more complex, player may or may not be in Force Speed at this point + {//this version is more complex if (!(self->client->ps.forcePowersActive&(1 << FP_SPEED))) {//not in speed - if (self->client->ps.forcePowerLevel[FP_SPEED] == 3) + if (playerNoDrain) { + ForceSpeed(self, 500, 0); + } + else if (self->client->ps.forcePowerLevel[FP_SPEED] == 3) { ForceSpeed(self, 500, S3_AUTODODGE_FP); } @@ -2376,21 +2361,6 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in ForceSpeed(self, 500 /*, S2_AUTODODGE_FP*/); } } - else - {//player is in Speed, see if we should still drain some force power - if (playerNoDrain) //Speed 3, Sense 3, and both are active - { - ForceSpeed_dodge(self, 0); - } - else if (self->client->ps.forcePowerLevel[FP_SPEED] == 3) - { //causes Force Speed to end early since player already using Speed - ForceSpeed(self, 500, S3_DODGE_FP); - } - else //Speed 2 - { - ForceSpeed(self, 500, S2_DODGE_FP); - } - } } else {//base JA version much simpler @@ -4436,12 +4406,9 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en case 3: //use jedi force push? or kick? //FIXME: try to do this if health low or enemy back to a cliff? - if ( Jedi_DecideKick()//let's try a kick + if ( Jedi_DecideKick(enemy_dist)//let's try a kick && ( G_PickAutoMultiKick( NPC, qfalse, qtrue ) != LS_NONE - || (G_CanKickEntity(NPC, NPC->enemy )&&G_PickAutoKick( NPC, NPC->enemy, qtrue )!=LS_NONE - && enemy_dist <= 16 ) // lets be close if we're kicking - ) - ) + || (G_CanKickEntity(NPC, NPC->enemy )&&G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE))) {//kicked TIMER_Set( NPC, "kickDebounce", Q_irand( 3000, 10000 ) ); } @@ -4469,7 +4436,7 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en if ( !Q_irand( 0, 5 ) || !Jedi_Strafe( 300, 1000, 0, 1000, qfalse ) ) {//certain chance they will pick an alternative evasion //if couldn't strafe, try a different kind of evasion... - if ( Jedi_DecideKick() && G_CanKickEntity(NPC, NPC->enemy ) && G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE ) + if ( Jedi_DecideKick(enemy_dist) && G_CanKickEntity(NPC, NPC->enemy ) && G_PickAutoKick( NPC, NPC->enemy, qtrue ) != LS_NONE ) {//kicked! TIMER_Set( NPC, "kickDebounce", Q_irand( 3000, 10000 ) ); } @@ -4685,23 +4652,26 @@ static void Jedi_SetEnemyInfo( vec3_t enemy_dest, vec3_t enemy_dir, float *enemy // two enemies, use lightning spread when fighting multiple enemies, etc. // Also, when kill one, check rest of group instead of walking up to victim. } + //init this to false - enemy_in_striking_range = qfalse; + enemy_in_range = qfalse; + enemy_near = qfalse; + enemy_approaching = qfalse; + if ( *enemy_dist <= 0.0f ) { - enemy_in_striking_range = qtrue; + enemy_in_range = qtrue; } else {//if he's too far away, see if he's at least facing us or coming towards us if ( *enemy_dist <= 32.0f ) - {//has to be facing us - vec3_t eAngles = {0,NPC->currentAngles[YAW],0}; - if ( InFOV( NPC->currentOrigin, NPC->enemy->currentOrigin, eAngles, 30, 90 ) ) - {//in striking range - enemy_in_striking_range = qtrue; - } + { + enemy_in_range = qtrue; } - if ( *enemy_dist >= 64.0f ) + if (*enemy_dist < 64.0f) { + enemy_near = qtrue; + } + else if ( *enemy_dist >= 64.0f || enemy_near ) {//we have to be approaching each other float vDot = 1.0f; if ( !VectorCompare( NPC->client->ps.velocity, vec3_origin ) ) @@ -4722,9 +4692,10 @@ static void Jedi_SetEnemyInfo( vec3_t enemy_dest, vec3_t enemy_dir, float *enemy {//neither of us is moving, below check will fail, so just return return; } + if ( vDot >= *enemy_dist ) {//moving towards each other - enemy_in_striking_range = qtrue; + enemy_approaching = qtrue; } } } @@ -5448,7 +5419,7 @@ static qboolean Jedi_AttackDecide( int enemy_dist ) } //try to hit them if we can - if ( !enemy_in_striking_range ) + if ( !enemy_in_range ) { return qfalse; } @@ -6663,20 +6634,20 @@ qboolean Jedi_CheckKataAttack( void ) if ( Q_irand( 0, g_spskill->integer+1 ) //50% chance on easy, 66% on medium, 75% on hard && !Q_irand( 0, 9 ) )//10% chance overall {//base on skill level - if ( enemy_in_striking_range ) //need to actually be close to the enemy - { - ucmd.upmove = 0; - VectorClear( NPC->client->ps.moveDir ); - if ( g_saberNewControlScheme->integer ) + if ( enemy_in_range || (enemy_near && enemy_approaching) ) //need to actually be close to the enemy { - ucmd.buttons |= BUTTON_FORCE_FOCUS; - } - else - { - ucmd.buttons |= BUTTON_ALT_ATTACK; + ucmd.upmove = 0; + VectorClear( NPC->client->ps.moveDir ); + if ( g_saberNewControlScheme->integer ) + { + ucmd.buttons |= BUTTON_FORCE_FOCUS; + } + else + { + ucmd.buttons |= BUTTON_ALT_ATTACK; + } + return qtrue; } - return qtrue; - } } } } @@ -6829,7 +6800,18 @@ static void Jedi_Attack( void ) } } } - } + + if (NPC->enemy && NPC->enemy->health > 0) + { + if (NPC->enemy->s.weapon == WP_SABER) + {//be sure to continue evasion even if can't pull back saber yet + vec3_t enemy_dir, enemy_movedir, enemy_dest; + float enemy_dist, enemy_movespeed; + Jedi_SetEnemyInfo(enemy_dest, enemy_dir, &enemy_dist, enemy_movedir, &enemy_movespeed, 300); + Jedi_EvasionSaber(enemy_movedir, enemy_dist, enemy_dir); + } + } + } } //see if our enemy was killed by us, gloat and turn off saber after cool down. //FIXME: don't do this if we have other enemies to fight...? diff --git a/code/game/NPC.cpp b/code/game/NPC.cpp index ed69d69fb9..43a7c1f504 100644 --- a/code/game/NPC.cpp +++ b/code/game/NPC.cpp @@ -2116,6 +2116,14 @@ void NPC_RunBehavior( int team, int bState ) } else { + /*if (level.time - NPCInfo->surrenderTime < 10000) + { //I was just surrendering a short time ago and the enemy is nearby + NPC_CheckSurrender(); + } + else { + NPC_BSFlee(); //I haven't been surrendering for a while, see if I can escape before surrendering + }*/ + NPC_BSFlee(); } return; diff --git a/code/game/NPC_behavior.cpp b/code/game/NPC_behavior.cpp index 9f51936ccd..a7ee224964 100644 --- a/code/game/NPC_behavior.cpp +++ b/code/game/NPC_behavior.cpp @@ -1562,8 +1562,9 @@ void NPC_Surrender( void ) //---------------------------------------------------------- else { - NPC_SetAnim( NPC, SETANIM_TORSO, TORSO_SURRENDER_START, SETANIM_FLAG_HOLD|SETANIM_FLAG_OVERRIDE ); - NPC->client->ps.torsoAnimTimer = Q_irand(3000, 8000); // Pretend the anim lasts longer + NPC_SetAnim(NPC, SETANIM_TORSO, TORSO_SURRENDER_START, SETANIM_FLAG_HOLD | SETANIM_FLAG_OVERRIDE); + NPC->client->ps.torsoAnimTimer = 1000; + NPCInfo->surrenderTime = level.time + 1000; } } NPCInfo->surrenderTime = level.time + NPC->client->ps.torsoAnimTimer + 1000; @@ -1631,6 +1632,7 @@ qboolean NPC_CheckSurrender( void ) {//player is the guy I'm running from if ( g_crosshairEntNum == NPC->s.number ) {//give up if player is aiming at me + NPC_FaceEnemy(); NPC_Surrender(); NPC_UpdateAngles( qtrue, qtrue ); return qtrue; @@ -1643,6 +1645,7 @@ qboolean NPC_CheckSurrender( void ) {//they're close if ( gi.inPVS( NPC->currentOrigin, player->currentOrigin ) ) {//they're in the same room + NPC_FaceEnemy(); NPC_Surrender(); NPC_UpdateAngles( qtrue, qtrue ); return qtrue; @@ -1663,6 +1666,7 @@ qboolean NPC_CheckSurrender( void ) if ( gi.inPVS( NPC->currentOrigin, NPC->enemy->currentOrigin ) ) {//they're in the same room //FIXME: should player-team NPCs not fire on surrendered NPCs? + NPC_FaceEnemy(); NPC_Surrender(); NPC_UpdateAngles( qtrue, qtrue ); return qtrue; @@ -1855,7 +1859,7 @@ qboolean NPC_BSFlee( void ) { //done panicking, time to realize we're dogmeat, if we haven't been able to flee for a few seconds if ((level.time-NPC->lastMoveTime)>3000 - && (level.time-NPCInfo->surrenderTime) > 3000 )//and haven't just finished surrendering + && (level.time-NPCInfo->surrenderTime) > 1000 )//and haven't just finished surrendering { NPC_FaceEnemy(); NPC_Surrender(); diff --git a/code/game/bg_pangles.cpp b/code/game/bg_pangles.cpp index 052dc31cf0..92a59ef96e 100644 --- a/code/game/bg_pangles.cpp +++ b/code/game/bg_pangles.cpp @@ -729,6 +729,9 @@ qboolean PM_AdjustAnglesForSaberLock( gentity_t *ent, usercmd_t *ucmd ) return qfalse; } +extern qboolean NPC_JediClass(gentity_t *self); +extern qboolean NPC_JediClassBoss(gentity_t *self); +extern qboolean NPC_JediClassNonBoss(gentity_t *self); int G_MinGetUpTime( gentity_t *ent ) { if ( ent @@ -763,7 +766,20 @@ int G_MinGetUpTime( gentity_t *ent ) return getUpTime; } } - return 200; + else if (ent->NPC && NPC_JediClass(ent)) + {//you must have Jedi reflexes... + int getUpTime = 250; + if (ent->NPC->rank > RANK_ENSIGN) + { + getUpTime *= 2; + } + if (g_spskill->integer >= 2) { + getUpTime *= 2; + } //max 1000 + + return getUpTime; + } + return 200; //200 } qboolean PM_AdjustAnglesForKnockdown( gentity_t *ent, usercmd_t *ucmd, qboolean angleClampOnly ) diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 0dd1ffd620..517f985e34 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -11145,7 +11145,8 @@ qboolean PM_CheckAltKickAttack(void) && pm->ps->SaberActive() && !(pm->ps->saber[0].saberFlags&SFL_NO_KICKS)//okay to do kicks with this saber && (!pm->ps->dualSabers || !(pm->ps->saber[1].saberFlags&SFL_NO_KICKS))//okay to do kicks with the 2nd saber - && !(pm->cmd.buttons&BUTTON_FORCE_FOCUS) + && ((!(pm->cmd.buttons&BUTTON_FORCE_FOCUS) && pm->ps->clientNum < MAX_CLIENTS) || pm->ps->clientNum >= MAX_CLIENTS) + //if we are the player we have to press Force Focus to saber throw //&& !PM_SaberThrowable() //&& (!WP_ForcePowerUsable(pm->gent, FP_SABERTHROW, 20)) //make sure saber throw is disabled before trying to kick) ) diff --git a/code/game/g_local.h b/code/game/g_local.h index 11f94d9211..7375884030 100644 --- a/code/game/g_local.h +++ b/code/game/g_local.h @@ -254,10 +254,10 @@ extern cvar_t *g_inactivity; extern cvar_t *g_debugMove; extern cvar_t *g_subtitles; extern cvar_t *g_removeDoors; - extern cvar_t *g_ICARUSDebug; - -extern cvar_t *g_npcdebug; +extern cvar_t *g_npcdebug; +extern cvar_t *g_weaponVelocity; +extern cvar_t *g_weaponAltVelocity; extern gentity_t *player; // diff --git a/code/game/g_main.cpp b/code/game/g_main.cpp index 44c05ac33d..4a651a32ba 100644 --- a/code/game/g_main.cpp +++ b/code/game/g_main.cpp @@ -214,6 +214,7 @@ cvar_t *g_saberLockSuperBreaks; cvar_t *g_saberLockStyle; cvar_t *g_forceNewPowers; cvar_t *g_weaponVelocity; +cvar_t *g_weaponAltVelocity; //for character stats cvar_t *g_char_forcePowerMax; //only applies after re-loading level @@ -726,7 +727,8 @@ void G_InitCvars( void ) { g_char_forceRegen = gi.cvar("g_char_forceRegen", "100", CVAR_CHEAT | CVAR_SAVEGAME); g_char_parryBonus = gi.cvar("g_char_parryBonus", "0", CVAR_CHEAT | CVAR_SAVEGAME); g_char_breakParryBonus = gi.cvar("g_char_breakParryBonus", "0", CVAR_CHEAT | CVAR_SAVEGAME); - g_weaponVelocity = gi.cvar("g_weaponVelocity", "1", CVAR_ARCHIVE | CVAR_CHEAT); + g_weaponVelocity = gi.cvar("g_weaponVelocity", "1.0", CVAR_ARCHIVE | CVAR_CHEAT); + g_weaponAltVelocity = gi.cvar("g_weaponAltVelocity", "1.0", CVAR_ARCHIVE | CVAR_CHEAT); } /* diff --git a/code/game/g_weapon.cpp b/code/game/g_weapon.cpp index 7d85a287c1..c7ac2c036b 100644 --- a/code/game/g_weapon.cpp +++ b/code/game/g_weapon.cpp @@ -38,6 +38,8 @@ vec3_t muzzle; gentity_t *ent_list[MAX_GENTITIES]; extern cvar_t *g_debugMelee; +extern cvar_t *g_weaponVelocity; +extern cvar_t *g_weaponAltVelocity; // some naughty little things that are used cg side int g_rocketLockEntNum = ENTITYNUM_NONE; @@ -139,6 +141,9 @@ gentity_t *CreateMissile( vec3_t org, vec3_t dir, float vel, int life, gentity_t missile->alt_fire = altFire; + if (altFire) vel *= g_weaponAltVelocity->value; + else vel *= g_weaponVelocity->value; + missile->s.pos.trType = TR_LINEAR; missile->s.pos.trTime = level.time;// - 10; // move a bit on the very first frame VectorCopy( org, missile->s.pos.trBase ); diff --git a/code/game/g_weaponLoad.cpp b/code/game/g_weaponLoad.cpp index e0089abd93..7f86d57012 100644 --- a/code/game/g_weaponLoad.cpp +++ b/code/game/g_weaponLoad.cpp @@ -25,6 +25,8 @@ along with this program; if not, see . // this is excluded from PCH usage 'cos it looks kinda scary to me, being game and ui.... -Ste #include "g_local.h" +//extern cvar_t *g_weaponVelocity; +//extern cvar_t *g_weaponAltVelocity; typedef struct { const char *name; @@ -396,7 +398,7 @@ const float defaultAltSplashRadius[] = { 0.0f, // WP_NOGHRI_STICK }; -const int velocity[WP_NUM_WEAPONS] = +const int defaultVelocity[WP_NUM_WEAPONS] = { 0,//WP_NONE, 0,//WP_SABER, // NOTE: lots of code assumes this is the first weapon (... which is crap) so be careful -Ste. @@ -405,7 +407,7 @@ const int velocity[WP_NUM_WEAPONS] = Q3_INFINITE,//WP_DISRUPTOR, BOWCASTER_VELOCITY,//WP_BOWCASTER, REPEATER_VELOCITY,//WP_REPEATER, - DEMP2_VELOCITY,WP_DEMP2, + DEMP2_VELOCITY, //WP_DEMP2, FLECHETTE_VEL,//WP_FLECHETTE, ROCKET_VELOCITY,//WP_ROCKET_LAUNCHER, TD_VELOCITY,//WP_THERMAL, @@ -1589,7 +1591,7 @@ void WP_LoadWeaponParms (void) weaponData[i].altVelocity = defaultAltVelocity[i]; } - WP_ParseParms(buffer); + WP_ParseParms(buffer); gi.FS_FreeFile( buffer ); //let go of the buffer } diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 87e716e45e..0cb1f774b5 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -189,10 +189,54 @@ int g_saberFlashTime = 0; //new variables - Dusty const int HITOWNER_RECOVERY_INTERVAL = 1500; //interval at which defense points are recovered, 1.5 seconds +const float BLOCK_SPEED = 4.5; //affects player's blocking speed +const float SLOW_BLOCK_FACTOR = 1.5; +const float RUN_BLOCK_FACTOR = 1.5; /*extern int hitOwnerBreakLimit; extern int hitOwnerRecoveryTime; //how long left to recover a defense point extern int hitOwnerBreakCounter; //keeping track of how many strong attacks the defender blocks in a //a short time period*/ +qboolean NPC_JediClass(gentity_t *self) { + switch (self->client->NPC_class) { + case CLASS_JEDI: + case CLASS_REBORN: + case CLASS_SHADOWTROOPER: + case CLASS_ALORA: + case CLASS_DESANN: + case CLASS_LUKE: + case CLASS_KYLE: + case CLASS_TAVION: + case CLASS_MORGANKATARN: + return qtrue; + default: + return qfalse; + } +} + +qboolean NPC_JediClassNonBoss(gentity_t *self) { + switch (self->client->NPC_class) { + case CLASS_JEDI: + case CLASS_REBORN: + case CLASS_SHADOWTROOPER: //semi-boss + return qtrue; + default: + return qfalse; + } +} + +qboolean NPC_JediClassBoss(gentity_t *self) { + switch (self->client->NPC_class) { + case CLASS_ALORA: //semi-boss + case CLASS_DESANN: + case CLASS_LUKE: + case CLASS_KYLE: + case CLASS_TAVION: + case CLASS_MORGANKATARN: + default: + return qfalse; + } +} + vec3_t g_saberFlashPos = { 0, 0, 0 }; int forcePowerDarkLight[NUM_FORCE_POWERS] = //0 == neutral @@ -248,6 +292,14 @@ float forceJumpStrength[NUM_FORCE_POWER_LEVELS] = }; float forceJumpHeight[NUM_FORCE_POWER_LEVELS] = +{ + 32,//normal jump (+stepheight+crouchdiff = 66) + 96,//(+stepheight+crouchdiff = 130) + 192,//(+stepheight+crouchdiff = 226) + 384//(+stepheight+crouchdiff = 418) //384 +}; + +float forceJumpHeightNew[NUM_FORCE_POWER_LEVELS] = { 32,//normal jump (+stepheight+crouchdiff = 66) 96 * 1.25,//(+stepheight+crouchdiff = 130) @@ -287,6 +339,14 @@ float forcePullCone[NUM_FORCE_POWER_LEVELS] = 0.8f }; +float forcePullConeNew[NUM_FORCE_POWER_LEVELS] = +{ + 1.0f,//none + 1.0f, + 1.0f, + 0.8f +}; + float forceSpeedValue[NUM_FORCE_POWER_LEVELS] = { 1.0f,//none @@ -4054,6 +4114,8 @@ qboolean WP_SabersCheckLock(gentity_t *ent1, gentity_t *ent2) qboolean WP_SaberParry(gentity_t *victim, gentity_t *attacker, int saberNum, int bladeNum) { + return qfalse; + if (!victim || !victim->client || !attacker) { return qfalse; @@ -4073,12 +4135,62 @@ qboolean WP_SaberParry(gentity_t *victim, gentity_t *attacker, int saberNum, int } if (victim->s.number || g_saberAutoBlocking->integer || victim->client->ps.saberBlockingTime > level.time) {//either an NPC or a player who is blocking - if (!PM_SaberInTransitionAny(victim->client->ps.saberMove) - && !PM_SaberInBounce(victim->client->ps.saberMove) - && !PM_SaberInKnockaway(victim->client->ps.saberMove)) - {//I'm not attacking, in transition or in a bounce or knockaway, so play a parry - WP_SaberBlockNonRandom(victim, saberHitLocation, qfalse); + if (g_saberNewCombat->integer) + { + if (!PM_SaberInBounce(victim->client->ps.saberMove) + && !PM_SaberInKnockaway(victim->client->ps.saberMove)) + { + if (!PM_SaberInTransitionAny(victim->client->ps.saberMove)) + {//Not attacking, in transition or in a bounce or knockaway, so play a parry + WP_SaberBlockNonRandom(victim, saberHitLocation, qfalse); + } + else if (!victim->s.number && (PM_SaberInReturn(victim->client->ps.saberMove))) + {//Player potentially gets an extra break because he always does return anims + int totalReboundTime = parryDebounce[victim->client->ps.forcePowerLevel[FP_SABER_DEFENSE]] * BLOCK_SPEED; + int baseReboundTime = totalReboundTime; + + switch (victim->client->ps.saberAnimLevel) + { + case SS_DESANN: + case SS_STRONG: + totalReboundTime *= SLOW_BLOCK_FACTOR; + break; + } + + if (totalReboundTime < victim->client->ps.torsoAnimTimer) + {//we have been in the cooldown (return) animation long enough + WP_SaberBlockNonRandom(victim, saberHitLocation, qfalse); + } + } + + } + else if ((!PM_SaberInTransitionAny(victim->client->ps.saberMove) || PM_SaberInReturn(victim->client->ps.saberMove)) + && !PM_SaberInBounce(victim->client->ps.saberMove) + && !PM_SaberInKnockaway(victim->client->ps.saberMove) + && !victim->s.number) + {//Player that's not attacking, in transition or in a bounce or knockaway, so play a parry + if (PM_SaberInReturn(victim->client->ps.saberMove) + && victim->client->ps.saberAnimLevel != SS_FAST + && victim->client->ps.saberAnimLevel != SS_TAVION) + {//if we're in a return see how long we've been in it + + } + else + { + WP_SaberBlockNonRandom(victim, saberHitLocation, qfalse); + } + } + } + else + { + if (!PM_SaberInTransitionAny(victim->client->ps.saberMove) + && !PM_SaberInBounce(victim->client->ps.saberMove) + && !PM_SaberInKnockaway(victim->client->ps.saberMove)) + {//I'm not attacking, in transition or in a bounce or knockaway, so play a parry + WP_SaberBlockNonRandom(victim, saberHitLocation, qfalse); + } } + victim->client->ps.saberEventFlags |= SEF_PARRIED; //since it was parried, take away any damage done @@ -4609,108 +4721,30 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) // we animate so much faster that the arc is pretty much flat... int entPowerLevel = 0; - - if (g_saberNewCombat->integer) //new code start + if (ent->client->NPC_class == CLASS_SABER_DROID) { - int stylePowerModifier = 0; - int stylePowerLevel = PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum); //this here should account for special moves now correctly - - /*Power level base numbers instead of being 1,2, and 3 now are doubled. And Saber Offense is the main determinant. - Saber Offense - - 1: entPowerLevel = 2 - 2: entPowerLevel = 4 - 3: entPowerLevel = 6 - - So +2 is like one Offense level higher. +1 is like half of a level. Strong style gives a +2 bonus as can be seen below. - - Then the style power modifier based on which saber style is used, enhancement force powers, breakParrybonuses, and whether or not you are in a transition as opposed to a slash, or a special attack should modify the power (not in that order, I have no idea what order haha) - Dusty*/ - - - switch (stylePowerLevel) // check what the saber style is and set power modifier accordingly - { - case 1: - stylePowerModifier = -2; - break; - case 2: - stylePowerModifier = -1; - break; - case 3: - stylePowerModifier = 0; - break; - case 4: - stylePowerModifier = 1; - break; - case 5: //special attacks count as this in bg_panimate - stylePowerModifier = 2; - break; - } - - if (PM_SaberInTransitionAny(ent->client->ps.saberMove)) // if in a transition that still counts as attacking for stronger styles, but this is so you're not as strong quite as a regular slash - { - stylePowerLevel -= 2; - } - if (ent->client->NPC_class == CLASS_SABER_DROID) //FIXME D: saber droids do their own thing... they need to be incorporated into this system I suppose? - { - entPowerLevel = SaberDroid_PowerLevelForSaberAnim(ent); - } - else - { - entPowerLevel = (2 * ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE]) + stylePowerModifier; - } - - if (PM_SaberInSpecialAttack(ent->client->ps.saberMove)) //now for special moves - { //special moves get a 2nd boost on top of the one in bg_panimate - entPowerLevel += 2; - } - - //now for modifiers based on any enhancement powers active - if (!ent->s.number && (ent->client->ps.forcePowersActive&(1 << FP_SPEED))) - { //min power bonus is +1, max bonus is +3 - entPowerLevel += 1 * ent->client->ps.forcePowerLevel[FP_SPEED]; - } - - if (entPowerLevel) //this is saying, if we HAVE a power level, i.e. we are slashing not just idling then... - { - if (ent->client->ps.forceRageRecoveryTime > level.time) - { - entPowerLevel -= 2; - } - else if (ent->client->ps.forcePowersActive & (1 << FP_RAGE)) - { //min power bonus is +2, max is +4, slightly more than Speed 3 - - entPowerLevel += ent->client->ps.forcePowerLevel[FP_RAGE] + 1; + entPowerLevel = SaberDroid_PowerLevelForSaberAnim(ent); + } + else if (!ent->s.number && (ent->client->ps.forcePowersActive&(1 << FP_SPEED))) + { + entPowerLevel = FORCE_LEVEL_3; + } + else + { + entPowerLevel = PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum); + } - } - } - } //new code end - else //Dusty, old code start. + if (entPowerLevel) { - if (ent->client->NPC_class == CLASS_SABER_DROID) - { - entPowerLevel = SaberDroid_PowerLevelForSaberAnim(ent); - } - else if (!ent->s.number && (ent->client->ps.forcePowersActive&(1 << FP_SPEED))) + if (ent->client->ps.forceRageRecoveryTime > level.time) { - entPowerLevel = FORCE_LEVEL_3; + entPowerLevel = FORCE_LEVEL_1; } - else - { - entPowerLevel = PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum); - } - - if (entPowerLevel) + else if (ent->client->ps.forcePowersActive & (1 << FP_RAGE)) { - if (ent->client->ps.forceRageRecoveryTime > level.time) - { - entPowerLevel = FORCE_LEVEL_1; - } - else if (ent->client->ps.forcePowersActive & (1 << FP_RAGE)) - { - entPowerLevel += ent->client->ps.forcePowerLevel[FP_RAGE]; - } - + entPowerLevel += ent->client->ps.forcePowerLevel[FP_RAGE]; } - } //Dusty, old code end. + } if (ent->client->ps.saberInFlight) {//flying sabers are much more deadly @@ -4836,99 +4870,39 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) //FIXME: more damage for higher attack power levels? // More damage based on length/color of saber? //FIXME: Desann does double damage? - - - - if (g_saberNewCombat->integer) //new code + if (g_saberRealisticCombat->integer) { - if (g_saberRealisticCombat->integer) - { - switch ((ent->client->ps.saberAnimLevel)) - { - default: - case FORCE_LEVEL_5: - baseDamage = 10.0f; - break; - case FORCE_LEVEL_4: //Staff, medium, duals all do same damage - case FORCE_LEVEL_3: - case FORCE_LEVEL_2: - baseDamage = 5.0f; - break; - case FORCE_LEVEL_0: - case FORCE_LEVEL_1: //FIXME: Fast damage is so low... - baseDamage = 2.5f; - break; - } - } - else + switch (entPowerLevel) { - if (g_spskill->integer > 0 - && ent->s.number < MAX_CLIENTS - && (ent->client->ps.torsoAnim == BOTH_ROLL_STAB - || ent->client->ps.torsoAnim == BOTH_SPINATTACK6 - || ent->client->ps.torsoAnim == BOTH_SPINATTACK7 - || ent->client->ps.torsoAnim == BOTH_LUNGE2_B__T_)) - {//*sigh*, these anim do less damage since they're so easy to do - baseDamage = 2.5f; - } - else - { - switch ((ent->client->ps.saberAnimLevel)) - { - default: - case FORCE_LEVEL_5: - baseDamage = 7.5f; - break; - case FORCE_LEVEL_4: //Staff, medium, duals all do same damage - case FORCE_LEVEL_3: - case FORCE_LEVEL_2: - baseDamage = 5.0f; - break; - case FORCE_LEVEL_0: - case FORCE_LEVEL_1: //FIXME: Fast damage is so low... - baseDamage = 2.5f; - break; - } - } + default: + case FORCE_LEVEL_3: + baseDamage = 10.0f; + break; + case FORCE_LEVEL_2: + baseDamage = 5.0f; + break; + case FORCE_LEVEL_0: + case FORCE_LEVEL_1: + baseDamage = 2.5f; + break; } } - else //old code + else { - if (g_saberRealisticCombat->integer) - { - switch (entPowerLevel) - { - default: - case FORCE_LEVEL_3: - baseDamage = 10.0f; - break; - case FORCE_LEVEL_2: - baseDamage = 5.0f; - break; - case FORCE_LEVEL_0: - case FORCE_LEVEL_1: - baseDamage = 2.5f; - break; - } + if (g_spskill->integer > 0 + && ent->s.number < MAX_CLIENTS + && (ent->client->ps.torsoAnim == BOTH_ROLL_STAB + || ent->client->ps.torsoAnim == BOTH_SPINATTACK6 + || ent->client->ps.torsoAnim == BOTH_SPINATTACK7 + || ent->client->ps.torsoAnim == BOTH_LUNGE2_B__T_)) + {//*sigh*, these anim do less damage since they're so easy to do + baseDamage = 2.5f; } else { - if (g_spskill->integer > 0 - && ent->s.number < MAX_CLIENTS - && (ent->client->ps.torsoAnim == BOTH_ROLL_STAB - || ent->client->ps.torsoAnim == BOTH_SPINATTACK6 - || ent->client->ps.torsoAnim == BOTH_SPINATTACK7 - || ent->client->ps.torsoAnim == BOTH_LUNGE2_B__T_)) - {//*sigh*, these anim do less damage since they're so easy to do - baseDamage = 2.5f; - } - else - { - baseDamage = 2.5f * (float)entPowerLevel; - } + baseDamage = 2.5f * (float)entPowerLevel; } } - } else {//saber is transitioning, defending or idle, don't do as much damage @@ -5035,9 +5009,9 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) traceEnt->client->ps.pm_time = 200; traceEnt->client->ps.pm_flags |= PMF_TIME_NOFRICTION; #ifndef FINAL_BUILD - if (d_saberCombat->integer) + if ( d_saberCombat->integer ) { - gi.Printf("%s pushing away %s at %s\n", ent->NPC_type, traceEnt->NPC_type, vtos(traceEnt->client->ps.velocity)); + gi.Printf( "%s pushing away %s at %s\n", ent->NPC_type, traceEnt->NPC_type, vtos( traceEnt->client->ps.velocity ) ); } #endif } @@ -5253,47 +5227,28 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) gentity_t *hitEnt = &g_entities[saberHitEntity]; gentity_t *hitOwner = NULL; - int hitOwnerPowerLevel = FORCE_LEVEL_0; - if (g_saberNewCombat->integer) //Dusty, new code start. + if (hitEnt) { - if (hitEnt) - { - hitOwner = hitEnt->owner; - } - if (hitOwner && hitOwner->client) - { - hitOwnerPowerLevel = 2 * hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; - hitOwner->breakLimit = hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; - } + hitOwner = hitEnt->owner; } - else + if (hitOwner && hitOwner->client) { - if (hitEnt) - { - hitOwner = hitEnt->owner; + hitOwnerPowerLevel = PM_PowerLevelForSaberAnim(&hitOwner->client->ps); + /* + if ( entPowerLevel >= FORCE_LEVEL_3 + && PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) ) + {//a special "unblockable" attack + if ( hitOwner->client->NPC_class == CLASS_ALORA + || hitOwner->client->NPC_class == CLASS_SHADOWTROOPER + || (hitOwner->NPC&&(hitOwner->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) ) + {//these masters can even block unblockables (stops cheap kills) + entPowerLevel = FORCE_LEVEL_2; } - if (hitOwner && hitOwner->client) - { - hitOwnerPowerLevel = PM_PowerLevelForSaberAnim(&hitOwner->client->ps); } + */ } - //Dusty, code end. - - /* //old crud here - if ( entPowerLevel >= FORCE_LEVEL_3 - && PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) ) - {//a special "unblockable" attack - if ( hitOwner->client->NPC_class == CLASS_ALORA - || hitOwner->client->NPC_class == CLASS_SHADOWTROOPER - || (hitOwner->NPC&&(hitOwner->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) ) - {//these masters can even block unblockables (stops cheap kills) - entPowerLevel = FORCE_LEVEL_2; - } - } - */ - //FIXME: check for certain anims, facing, etc, to make them lock into a sabers-locked pose //SEF_LOCKED @@ -5306,522 +5261,1365 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) inFlightSaberBlocked = qtrue; } - if (g_saberNewCombat->integer) - { //new code start - - //hitOwner BreakCounter, BreakLimit, RecoveryInterval, RecoveryTime - //how many strong attacks (where saber offense + saber style modifier total power is greater than defender's defense strength) can be deflected before defender gets tired and his defense breaks, saber defense 1 is 1 hit, 2 is 2 hits, etc. + //FIXME: based on strength, position and angle of attack & defense, decide if: + // defender and attacker lock sabers + // *defender's parry should hold and attack bounces (or deflects, based on angle of sabers) + // *defender's parry is somewhat broken and both bounce (or deflect) + // *defender's parry is broken and they bounce while attacker's attack deflects or carries through (especially if they're dead) + // defender is knocked down and attack goes through + + //Check deflections and broken parries + if (hitOwner && hitOwner->health > 0 && ent->health > 0 //both are alive + && !inFlightSaberBlocked && hitOwner->client && !hitOwner->client->ps.saberInFlight && !ent->client->ps.saberInFlight//both have sabers in-hand + && ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN + && ent->client->ps.saberLockTime < level.time + && hitOwner->client->ps.saberLockTime < level.time) + {//2 in-hand sabers hit + //FIXME: defender should not parry or block at all if not in a saber anim... like, if in a roll or knockdown... + if (baseDamage) + {//there is damage involved, not just effects + qboolean entAttacking = qfalse; + qboolean hitOwnerAttacking = qfalse; + qboolean entDefending = qfalse; + qboolean hitOwnerDefending = qfalse; + qboolean forceLock = qfalse; + + if ((ent->client->NPC_class == CLASS_KYLE && (ent->spawnflags & 1) && hitOwner->s.number < MAX_CLIENTS) + || (hitOwner->client->NPC_class == CLASS_KYLE && (hitOwner->spawnflags & 1) && ent->s.number < MAX_CLIENTS)) + {//Player vs. Kyle Boss == lots of saberlocks + if (!Q_irand(0, 2)) + { + forceLock = qtrue; + } + } - //FIXME: based on strength, position and angle of attack & defense, decide if: - // defender and attacker lock sabers - // *defender's parry should hold and attack bounces (or deflects, based on angle of sabers) - // *defender's parry is somewhat broken and both bounce (or deflect) - // *defender's parry is broken and they bounce while attacker's attack deflects or carries through (especially if they're dead) - // defender is knocked down and attack goes through + if (PM_SaberInAttack(ent->client->ps.saberMove) || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) + { + entAttacking = qtrue; + } + else if (entPowerLevel > FORCE_LEVEL_2) + {//stronger styles count as attacking even if in a transition + if (PM_SaberInTransitionAny(ent->client->ps.saberMove)) + { + entAttacking = qtrue; + } + } + if (PM_SaberInParry(ent->client->ps.saberMove) + || ent->client->ps.saberMove == LS_READY) + { + entDefending = qtrue; + } - //Check deflections and broken parries - if (hitOwner && hitOwner->health > 0 && ent->health > 0 //both are alive - && !inFlightSaberBlocked && hitOwner->client && !hitOwner->client->ps.saberInFlight && !ent->client->ps.saberInFlight//both have sabers in-hand - && ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN - && ent->client->ps.saberLockTime < level.time - && hitOwner->client->ps.saberLockTime < level.time) - {//2 in-hand sabers hit - //FIXME: defender should not parry or block at all if not in a saber anim... like, if in a roll or knockdown... - if (baseDamage) - {//there is damage involved, not just effects - qboolean entAttacking = qfalse; - qboolean hitOwnerAttacking = qfalse; - qboolean entDefending = qfalse; - qboolean hitOwnerDefending = qfalse; - qboolean forceLock = qfalse; - - if ((ent->client->NPC_class == CLASS_KYLE && (ent->spawnflags & 1) && hitOwner->s.number < MAX_CLIENTS) - || (hitOwner->client->NPC_class == CLASS_KYLE && (hitOwner->spawnflags & 1) && ent->s.number < MAX_CLIENTS)) - {//Player vs. Kyle Boss == lots of saberlocks - if (!Q_irand(0, 2)) - { - forceLock = qtrue; - } - } - - if (PM_SaberInAttack(ent->client->ps.saberMove) || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) + if (ent->client->ps.torsoAnim == BOTH_A1_SPECIAL + || ent->client->ps.torsoAnim == BOTH_A2_SPECIAL + || ent->client->ps.torsoAnim == BOTH_A3_SPECIAL) + {//parry/block/break-parry bonus for single-style kata moves + entPowerLevel++; + } + if (entAttacking) + {//add twoHanded bonus and breakParryBonus to entPowerLevel here + //This makes staff too powerful + if ((ent->client->ps.saber[saberNum].saberFlags&SFL_TWO_HANDED)) { - entAttacking = qtrue; - } - else if (PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) > FORCE_LEVEL_3) - {//now it checks specifically for style, and only strong, staff, and desann styles get this, before it only looked at ent's strength - if (PM_SaberInTransitionAny(ent->client->ps.saberMove)) - { - entAttacking = qtrue; - } + entPowerLevel++; } - if (PM_SaberInParry(ent->client->ps.saberMove) - || ent->client->ps.saberMove == LS_READY) + //FIXME: what if dualSabers && both sabers are hitting at same time? + if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum)) { - entDefending = qtrue; + entPowerLevel += ent->client->ps.saber[saberNum].breakParryBonus; } - - /*if (ent->client->ps.torsoAnim == BOTH_A1_SPECIAL - || ent->client->ps.torsoAnim == BOTH_A2_SPECIAL - || ent->client->ps.torsoAnim == BOTH_A3_SPECIAL) - {//parry/block/break-parry bonus for single-style kata moves - entPowerLevel += 2; - }*/ - if (entAttacking) //I'm removing all two-handed power bonuses, now it's purely for force power stuff - Dusty - {//add twoHanded bonus and breakParryBonus to entPowerLevel here - //This makes staff too powerful - /*if ((ent->client->ps.saber[saberNum].saberFlags&SFL_TWO_HANDED)) - { - entPowerLevel++; - }*/ - //FIXME: what if dualSabers && both sabers are hitting at same time? - if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum)) - { - entPowerLevel += ent->client->ps.saber[saberNum].breakParryBonus; - - if (ent->s.number < MAX_CLIENTS) {//player - entPowerLevel += g_char_breakParryBonus->integer; - } - } - else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum)) - { - entPowerLevel += ent->client->ps.saber[saberNum].breakParryBonus2; - - if (ent->s.number < MAX_CLIENTS) {//player - entPowerLevel += g_char_breakParryBonus->integer; - } - } + else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum)) + { + entPowerLevel += ent->client->ps.saber[saberNum].breakParryBonus2; } - else if (entDefending) - {//add twoHanded bonus and dualSaber bonus and parryBonus to entPowerLevel here - /*if ((ent->client->ps.saber[saberNum].saberFlags&SFL_TWO_HANDED) + } + else if (entDefending) + {//add twoHanded bonus and dualSaber bonus and parryBonus to entPowerLevel here + if ((ent->client->ps.saber[saberNum].saberFlags&SFL_TWO_HANDED) || (ent->client->ps.dualSabers && ent->client->ps.saber[1].Active())) - { + { entPowerLevel++; - }*/ - //FIXME: what about second saber if dualSabers? - entPowerLevel += ent->client->ps.saber[saberNum].parryBonus; - - if (ent->s.number < MAX_CLIENTS) {//player - entPowerLevel += g_char_parryBonus->integer; - } } + //FIXME: what about second saber if dualSabers? + entPowerLevel += ent->client->ps.saber[saberNum].parryBonus; + } - if (PM_SaberInAttack(hitOwner->client->ps.saberMove) || PM_SaberInSpecialAttack(hitOwner->client->ps.torsoAnim)) + if (PM_SaberInAttack(hitOwner->client->ps.saberMove) || PM_SaberInSpecialAttack(hitOwner->client->ps.torsoAnim)) + { + hitOwnerAttacking = qtrue; + } + else if (hitOwnerPowerLevel > FORCE_LEVEL_2) + {//stronger styles count as attacking even if in a transition + if (PM_SaberInTransitionAny(hitOwner->client->ps.saberMove)) { hitOwnerAttacking = qtrue; } - else if (hitOwnerPowerLevel > FORCE_LEVEL_2) - {//stronger styles count as attacking even if in a transition - if (PM_SaberInTransitionAny(hitOwner->client->ps.saberMove)) - { - hitOwnerAttacking = qtrue; - } - } - if (PM_SaberInParry(hitOwner->client->ps.saberMove) - || hitOwner->client->ps.saberMove == LS_READY) - { - hitOwnerDefending = qtrue; - } + } + if (PM_SaberInParry(hitOwner->client->ps.saberMove) + || hitOwner->client->ps.saberMove == LS_READY) + { + hitOwnerDefending = qtrue; + } - /*if (hitOwner->client->ps.torsoAnim == BOTH_A1_SPECIAL + if (hitOwner->client->ps.torsoAnim == BOTH_A1_SPECIAL || hitOwner->client->ps.torsoAnim == BOTH_A2_SPECIAL || hitOwner->client->ps.torsoAnim == BOTH_A3_SPECIAL) - {//parry/block/break-parry bonus for single-style kata moves - hitOwnerPowerLevel += 2; - }*/ - if (hitOwnerAttacking) - {//add twoHanded bonus and breakParryBonus to entPowerLevel here - /*if ((hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED)) - { + {//parry/block/break-parry bonus for single-style kata moves + hitOwnerPowerLevel++; + } + if (hitOwnerAttacking) + {//add twoHanded bonus and breakParryBonus to entPowerLevel here + if ((hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED)) + { hitOwnerPowerLevel++; - }*/ - hitOwnerPowerLevel += hitOwner->client->ps.saber[0].breakParryBonus; - - if (hitOwner->s.number < MAX_CLIENTS) {//player - hitOwnerPowerLevel += g_char_breakParryBonus->integer; - } - - if (hitOwner->client->ps.dualSabers && Q_irand(0, 1)) - {//FIXME: assumes both sabers are hitting at same time...? - //what the heck is this extra 1 for?! - Dusty - hitOwnerPowerLevel += 1 + hitOwner->client->ps.saber[1].breakParryBonus; - } } - else if (hitOwnerDefending) - {//add twoHanded bonus and dualSaber bonus and parryBonus to entPowerLevel here - /*if ((hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED) + hitOwnerPowerLevel += hitOwner->client->ps.saber[0].breakParryBonus; + if (hitOwner->client->ps.dualSabers && Q_irand(0, 1)) + {//FIXME: assumes both sabers are hitting at same time...? + hitOwnerPowerLevel += 1 + hitOwner->client->ps.saber[1].breakParryBonus; + } + } + else if (hitOwnerDefending) + {//add twoHanded bonus and dualSaber bonus and parryBonus to entPowerLevel here + if ((hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED) || (hitOwner->client->ps.dualSabers && hitOwner->client->ps.saber[1].Active())) - { + { hitOwnerPowerLevel++; - }*/ - hitOwnerPowerLevel += hitOwner->client->ps.saber[0].parryBonus; - - if (hitOwner->s.number < MAX_CLIENTS) {//player - hitOwnerPowerLevel += g_char_parryBonus->integer; - } - - if (hitOwner->client->ps.dualSabers && Q_irand(0, 1)) - {//FIXME: assumes both sabers are defending at same time...? - //what the heck is this extra 1 for?! - Dusty - hitOwnerPowerLevel += 1 + hitOwner->client->ps.saber[1].parryBonus; - } - } - - if (PM_SuperBreakLoseAnim(ent->client->ps.torsoAnim) - || PM_SuperBreakWinAnim(ent->client->ps.torsoAnim) - || PM_SuperBreakLoseAnim(hitOwner->client->ps.torsoAnim) - || PM_SuperBreakWinAnim(hitOwner->client->ps.torsoAnim)) - {//don't mess with this - collisionResolved = qtrue; } - else if (g_saberLocksEnabled->integer - && entAttacking - && hitOwnerAttacking - && !Q_irand(0, g_saberLockRandomNess->integer) - && (g_debugSaberLock->integer || forceLock - || entPowerLevel == hitOwnerPowerLevel - || (entPowerLevel > 6 && hitOwnerPowerLevel > 6) - //more chance when both are using SO 3 and strong attacks - || (ent->client->ps.saberAnimLevel < 5 && hitOwner->client->ps.saberAnimLevel < 5 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && Q_irand(0, 3)) - || (ent->client->ps.saberAnimLevel < 3 && hitOwner->client->ps.saberAnimLevel < 5 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && Q_irand(0, 2)) - || (hitOwner->client->ps.saberAnimLevel < 5 && ent->client->ps.saberAnimLevel < 5 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && !Q_irand(0, 1)) - || (hitOwner->client->ps.saberAnimLevel < 5 && hitOwner->client->ps.saberAnimLevel < 3 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && !Q_irand(0, 1))) - && WP_SabersCheckLock(ent, hitOwner)) - { - collisionResolved = qtrue; + hitOwnerPowerLevel += hitOwner->client->ps.saber[0].parryBonus; + if (hitOwner->client->ps.dualSabers && Q_irand(0, 1)) + {//FIXME: assumes both sabers are defending at same time...? + hitOwnerPowerLevel += 1 + hitOwner->client->ps.saber[1].parryBonus; } - else if (g_saberLocksEnabled->integer - && hitOwnerAttacking - && entDefending - && !Q_irand(0, g_saberLockRandomNess->integer * 3) + } + + if (PM_SuperBreakLoseAnim(ent->client->ps.torsoAnim) + || PM_SuperBreakWinAnim(ent->client->ps.torsoAnim) + || PM_SuperBreakLoseAnim(hitOwner->client->ps.torsoAnim) + || PM_SuperBreakWinAnim(hitOwner->client->ps.torsoAnim)) + {//don't mess with this + collisionResolved = qtrue; + } + else if (entAttacking + && hitOwnerAttacking + && !Q_irand(0, g_saberLockRandomNess->integer) + && (g_debugSaberLock->integer || forceLock + || entPowerLevel == hitOwnerPowerLevel + || (entPowerLevel > FORCE_LEVEL_2 && hitOwnerPowerLevel > FORCE_LEVEL_2) + || (entPowerLevel < FORCE_LEVEL_3 && hitOwnerPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && Q_irand(0, 3)) + || (entPowerLevel < FORCE_LEVEL_2 && hitOwnerPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && Q_irand(0, 2)) + || (hitOwnerPowerLevel < FORCE_LEVEL_3 && entPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && !Q_irand(0, 1)) + || (hitOwnerPowerLevel < FORCE_LEVEL_2 && entPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && !Q_irand(0, 1))) + && WP_SabersCheckLock(ent, hitOwner)) + { + collisionResolved = qtrue; + } + else if (hitOwnerAttacking + && entDefending + && !Q_irand(0, g_saberLockRandomNess->integer * 3) + && (g_debugSaberLock->integer || forceLock || + ((ent->client->ps.saberMove != LS_READY || (hitOwnerPowerLevel - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand(-6, 0)) + && ((hitOwnerPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) || + (hitOwnerPowerLevel < FORCE_LEVEL_2 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) || + (hitOwnerPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (hitOwnerPowerLevel - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) + && WP_SabersCheckLock(hitOwner, ent)) + { + collisionResolved = qtrue; + } + else if (entAttacking && hitOwnerDefending) + {//I'm attacking hit, they're parrying + qboolean activeDefense = (hitOwner->s.number || g_saberAutoBlocking->integer || hitOwner->client->ps.saberBlockingTime > level.time); + if (!Q_irand(0, g_saberLockRandomNess->integer * 3) + && activeDefense && (g_debugSaberLock->integer || forceLock || - ((ent->client->ps.saberMove != LS_READY || (hitOwnerPowerLevel - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand(-6, 0)) - && ((hitOwner->client->ps.saberAnimLevel < 5 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) || - (hitOwner->client->ps.saberAnimLevel < 3 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) || - (hitOwner->client->ps.saberAnimLevel < 5 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (hitOwnerPowerLevel - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) - && WP_SabersCheckLock(hitOwner, ent)) + ((hitOwner->client->ps.saberMove != LS_READY || (entPowerLevel - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand(-6, 0)) + && ((entPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) + || (entPowerLevel < FORCE_LEVEL_2 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) + || (entPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (entPowerLevel - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) + && WP_SabersCheckLock(ent, hitOwner)) { collisionResolved = qtrue; } - else if (entAttacking && hitOwnerDefending) - {//I'm attacking hit, they're parrying - qboolean activeDefense = (hitOwner->s.number || g_saberAutoBlocking->integer || hitOwner->client->ps.saberBlockingTime > level.time); - if (g_saberLocksEnabled->integer - && !Q_irand(0, g_saberLockRandomNess->integer * 3) + else if (saberHitFraction < 1.0f) + {//an actual collision + if (entPowerLevel < FORCE_LEVEL_3 && activeDefense) + {//strong attacks cannot be deflected + //based on angle of attack & angle of defensive saber, see if I should deflect off in another dir rather than bounce back + deflected = WP_GetSaberDeflectionAngle(ent, hitOwner); + //just so Jedi knows that he was blocked + ent->client->ps.saberEventFlags |= SEF_BLOCKED; + } + //base parry breaks on animation (saber attack level), not FP_SABER_OFFENSE + if (entPowerLevel < FORCE_LEVEL_3 + //&& ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] < FORCE_LEVEL_3//if you have high saber offense, you cannot have your attack knocked away, regardless of what style you're using? + //&& hitOwner->client->ps.saberAnimLevel != FORCE_LEVEL_5 && activeDefense - && (g_debugSaberLock->integer || forceLock || - ((hitOwner->client->ps.saberMove != LS_READY || (entPowerLevel - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand(-6, 0)) - && (ent->client->ps.saberAnimLevel < 5 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) - || (ent->client->ps.saberAnimLevel < 3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) - || (hitOwner->client->ps.saberAnimLevel < 5 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (entPowerLevel - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2)))) - && WP_SabersCheckLock(ent, hitOwner)) - { - collisionResolved = qtrue; + && (hitOwnerPowerLevel > FORCE_LEVEL_2 || (hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]>FORCE_LEVEL_2&&Q_irand(0, hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE])))) + {//knockaways can make fast-attacker go into a broken parry anim if the ent is using fast or med (but not Tavion) + //make me parry + WP_SaberParry(hitOwner, ent, saberNum, bladeNum); + //turn the parry into a knockaway + hitOwner->client->ps.saberBounceMove = PM_KnockawayForParry(hitOwner->client->ps.saberBlocked); + //make them go into a broken parry + ent->client->ps.saberBounceMove = PM_BrokenParryForAttack(ent->client->ps.saberMove); + ent->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; + if (saberNum == 0) + {//FIXME: can only lose right-hand saber for now + if (!(ent->client->ps.saber[saberNum].saberFlags&SFL_NOT_DISARMABLE) + && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] < FORCE_LEVEL_2 + //&& (ent->s.number||g_saberRealisticCombat->integer) + && Q_irand(0, hitOwner->client->ps.SaberDisarmBonus(0)) > 0 + && (hitOwner->s.number || g_saberAutoBlocking->integer || !Q_irand(0, 2)))//if player defending and autoblocking is on, this is less likely to happen, so don't do the random check + {//knocked the saber right out of his hand! (never happens to player) + //Get a good velocity to send the saber in based on my parry move + vec3_t throwDir; + if (!PM_VelocityForBlockedMove(&hitOwner->client->ps, throwDir)) + { + PM_VelocityForSaberMove(&ent->client->ps, throwDir); + } + WP_SaberLose(ent, throwDir); + } + } + //just so Jedi knows that he was blocked + ent->client->ps.saberEventFlags |= SEF_BLOCKED; +#ifndef FINAL_BUILD + if ( d_saberCombat->integer ) + { + gi.Printf( S_COLOR_RED"%s knockaway %s's attack, new move = %s, anim = %s\n", hitOwner->NPC_type, ent->NPC_type, saberMoveData[ent->client->ps.saberBounceMove].name, animTable[saberMoveData[ent->client->ps.saberBounceMove].animToUse].name ); + } +#endif } - else if (saberHitFraction < 1.0f) - {//an actual collision - if ((hitOwner->breakCounter <= hitOwner->breakLimit) && activeDefense) - {//tired defenders cannot deflect - //based on angle of attack & angle of defensive saber, see if I should deflect off in another dir rather than bounce back - deflected = WP_GetSaberDeflectionAngle(ent, hitOwner); - //just so Jedi knows that he was blocked - ent->client->ps.saberEventFlags |= SEF_BLOCKED; + else if (!activeDefense//they're not defending + || (entPowerLevel > FORCE_LEVEL_2 //I hit hard + && hitOwnerPowerLevel < entPowerLevel)//they are defending, but their defense strength is lower than my attack... + || (!deflected && Q_irand(0, Q_max(0, PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE])/*PM_PowerLevelForSaberAnim( &hitOwner->client->ps )*/) > 0)) + {//broke their parry altogether + if (entPowerLevel > FORCE_LEVEL_2 || Q_irand(0, Q_max(0, ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]))) + {//chance of continuing with the attack (not bouncing back) + ent->client->ps.saberEventFlags &= ~SEF_BLOCKED; + ent->client->ps.saberBounceMove = LS_NONE; + brokenParry = qtrue; } - if (entPowerLevel > hitOwnerPowerLevel) - { //if the attack was strong add to the stagger/break counter here - if (!PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) - { //special attacks just break, no counters - hitOwner->breakCounter += (entPowerLevel - hitOwnerPowerLevel); - hitOwner->breakRecoveryTime = level.time + HITOWNER_RECOVERY_INTERVAL; + //do some time-consuming saber-knocked-aside broken parry anim + hitOwner->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; + hitOwner->client->ps.saberBounceMove = LS_NONE; + //FIXME: for now, you always disarm the right-hand saber + if (!(hitOwner->client->ps.saber[0].saberFlags&SFL_NOT_DISARMABLE) + && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] < FORCE_LEVEL_2 + //&& (ent->s.number||g_saberRealisticCombat->integer) + && Q_irand(0, 2 - ent->client->ps.SaberDisarmBonus(bladeNum)) <= 0) + {//knocked the saber right out of his hand! + //get the right velocity for my attack direction + vec3_t throwDir; + PM_VelocityForSaberMove(&ent->client->ps, throwDir); + WP_SaberLose(hitOwner, throwDir); + if ((ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0, 3)) + || (ent->client->ps.saberAnimLevel == SS_DESANN&&!Q_irand(0, 1))) + {// a strong attack + if (WP_BrokenParryKnockDown(hitOwner)) + { + hitOwner->client->ps.saberBlocked = BLOCKED_NONE; + hitOwner->client->ps.saberBounceMove = LS_NONE; + } } } - //base parry breaks on animation (saber attack level), not FP_SABER_OFFENSE - if (entPowerLevel < hitOwnerPowerLevel - //&& ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] < FORCE_LEVEL_3//if you have high saber offense, you cannot have your attack knocked away, regardless of what style you're using? - //&& hitOwner->client->ps.saberAnimLevel != FORCE_LEVEL_5 - && activeDefense - && (hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] >= FORCE_LEVEL_3 || (hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]>FORCE_LEVEL_1&&Q_irand(0, 1)))) // 50% chance for knockaway with saber defense 2 - {//knockaways can make fast-attacker go into a broken parry anim if the ent is using fast or med (but not Tavion) - //make me parry - WP_SaberParry(hitOwner, ent, saberNum, bladeNum); - //turn the parry into a knockaway - hitOwner->client->ps.saberBounceMove = PM_KnockawayForParry(hitOwner->client->ps.saberBlocked); - //make them go into a broken parry - ent->client->ps.saberBounceMove = PM_BrokenParryForAttack(ent->client->ps.saberMove); - ent->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; - if (saberNum == 0) - {//FIXME: can only lose right-hand saber for now - if (!(ent->client->ps.saber[saberNum].saberFlags&SFL_NOT_DISARMABLE) - && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] < FORCE_LEVEL_2 - //^changed DEFENSE to OFFENSE - //&& (ent->s.number||g_saberRealisticCombat->integer) - && Q_irand(0, hitOwner->client->ps.SaberDisarmBonus(0)) > 0 - && (hitOwner->s.number || g_saberAutoBlocking->integer || !Q_irand(0, 2)))//if player defending and autoblocking is on, this is less likely to happen, so don't do the random check - {//knocked the saber right out of his hand! (never happens to player) - //Get a good velocity to send the saber in based on my parry move - vec3_t throwDir; - if (!PM_VelocityForBlockedMove(&hitOwner->client->ps, throwDir)) - { - PM_VelocityForSaberMove(&ent->client->ps, throwDir); - } - WP_SaberLose(ent, throwDir); + else + { + if ((ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0, 5)) + || (ent->client->ps.saberAnimLevel == SS_DESANN&&!Q_irand(0, 3))) + {// a strong attack + if (WP_BrokenParryKnockDown(hitOwner)) + { + hitOwner->client->ps.saberBlocked = BLOCKED_NONE; + hitOwner->client->ps.saberBounceMove = LS_NONE; } } - //just so Jedi knows that he was blocked - ent->client->ps.saberEventFlags |= SEF_BLOCKED; + } #ifndef FINAL_BUILD - if (d_saberCombat->integer) + if ( d_saberCombat->integer ) + { + if ( ent->client->ps.saberEventFlags&SEF_BLOCKED ) { - gi.Printf(S_COLOR_RED"%s knockaway %s's attack, new move = %s, anim = %s\n", hitOwner->NPC_type, ent->NPC_type, saberMoveData[ent->client->ps.saberBounceMove].name, animTable[saberMoveData[ent->client->ps.saberBounceMove].animToUse].name); + gi.Printf( S_COLOR_RED"%s parry broken (bounce/deflect)!\n", hitOwner->targetname ); + } + else + { + gi.Printf( S_COLOR_RED"%s parry broken (follow-through)!\n", hitOwner->targetname ); } -#endif } - else if (!activeDefense//they're not defending i.e. not holding +block with auto-blocking turned off? - || (hitOwner->breakCounter > hitOwner->breakLimit //too tired to defend strong attacks - && hitOwnerPowerLevel < entPowerLevel) - || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim))//they are defending, but their defense strength is lower than my attack... - //or they are doing a special which has slightly - //different rules - /*|| (!deflected && Q_irand(0, Q_max(0, PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]PM_PowerLevelForSaberAnim( &hitOwner->client->ps ))) > 0))*/ - //^um what does that do anyway? Just add randomness? - //^Fixed per latest OpenJK update not to divide by zero incase want to uncomment - {//broke their parry altogether - if (ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] >= 3 || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) - {//saber offense 3 (and up?) gets to continue completely uninterrupted after breaking their guard - ent->client->ps.saberEventFlags &= ~SEF_BLOCKED; - ent->client->ps.saberBounceMove = LS_NONE; - brokenParry = qtrue; - } - //do some time-consuming saber-knocked-aside broken parry anim - hitOwner->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; - hitOwner->client->ps.saberBounceMove = LS_NONE; - //FIXME: for now, you always disarm the right-hand saber - if (!(hitOwner->client->ps.saber[0].saberFlags&SFL_NOT_DISARMABLE) - && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] < FORCE_LEVEL_2 - //&& (ent->s.number||g_saberRealisticCombat->integer) - && Q_irand(0, 2 - ent->client->ps.SaberDisarmBonus(bladeNum)) <= 0) - {//knocked the saber right out of his hand! - //get the right velocity for my attack direction - vec3_t throwDir; - PM_VelocityForSaberMove(&ent->client->ps, throwDir); - WP_SaberLose(hitOwner, throwDir); - if ((ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0, 3)) - || (ent->client->ps.saberAnimLevel == SS_DESANN&&!Q_irand(0, 1))) - {// a strong attack - if (WP_BrokenParryKnockDown(hitOwner)) - { - hitOwner->client->ps.saberBlocked = BLOCKED_NONE; - hitOwner->client->ps.saberBounceMove = LS_NONE; - } - } - } - else - { - if ((ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0, 5)) - || (ent->client->ps.saberAnimLevel == SS_DESANN&&!Q_irand(0, 3))) - {// a strong attack - if (WP_BrokenParryKnockDown(hitOwner)) - { - hitOwner->client->ps.saberBlocked = BLOCKED_NONE; - hitOwner->client->ps.saberBounceMove = LS_NONE; - } - } - } -#ifndef FINAL_BUILD - if (d_saberCombat->integer) - { - if (ent->client->ps.saberEventFlags&SEF_BLOCKED) - { - gi.Printf(S_COLOR_RED"%s parry broken (bounce/deflect)!\n", hitOwner->targetname); - } - else - { - gi.Printf(S_COLOR_RED"%s parry broken (follow-through)!\n", hitOwner->targetname); - } - } #endif + } + else + {//just a parry, possibly the hitOwner can knockaway the ent + WP_SaberParry(hitOwner, ent, saberNum, bladeNum); + if (PM_SaberInBounce(ent->client->ps.saberMove) //FIXME: saberMove not set until pmove! + && activeDefense + && hitOwner->client->ps.saberAnimLevel != SS_FAST //&& hitOwner->client->ps.saberAnimLevel != FORCE_LEVEL_5 + && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) + {//attacker bounced off, and defender has ability to do knockaways, so do one unless we're using fast attacks + //turn the parry into a knockaway + hitOwner->client->ps.saberBounceMove = PM_KnockawayForParry(hitOwner->client->ps.saberBlocked); } - else - {//just a parry, possibly the hitOwner can knockaway the ent - WP_SaberParry(hitOwner, ent, saberNum, bladeNum); - if (PM_SaberInBounce(ent->client->ps.saberMove) //FIXME: saberMove not set until pmove! - && activeDefense - && hitOwner->client->ps.saberAnimLevel != SS_FAST //&& hitOwner->client->ps.saberAnimLevel != FORCE_LEVEL_5 - && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) - {//attacker bounced off, and defender has ability to do knockaways, so do one unless we're using fast attacks - //turn the parry into a knockaway - hitOwner->client->ps.saberBounceMove = PM_KnockawayForParry(hitOwner->client->ps.saberBlocked); - } - else if ((ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0, 6)) - || (ent->client->ps.saberAnimLevel == SS_DESANN && !Q_irand(0, 3))) - {// a strong attack can sometimes do a knockdown - //HMM... maybe only if they're moving backwards? - if (WP_BrokenParryKnockDown(hitOwner)) - { - hitOwner->client->ps.saberBlocked = BLOCKED_NONE; - hitOwner->client->ps.saberBounceMove = LS_NONE; - } + else if ((ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0, 6)) + || (ent->client->ps.saberAnimLevel == SS_DESANN && !Q_irand(0, 3))) + {// a strong attack can sometimes do a knockdown + //HMM... maybe only if they're moving backwards? + if (WP_BrokenParryKnockDown(hitOwner)) + { + hitOwner->client->ps.saberBlocked = BLOCKED_NONE; + hitOwner->client->ps.saberBounceMove = LS_NONE; } } - collisionResolved = qtrue; } - } - /* - else if ( entDefending && hitOwnerAttacking ) - {//I'm parrying, they're attacking - if ( hitOwnerPowerLevel < FORCE_LEVEL_3 ) - {//strong attacks cannot be deflected - //based on angle of attack & angle of defensive saber, see if I should deflect off in another dir rather than bounce back - deflected = WP_GetSaberDeflectionAngle( hitOwner, ent ); - //just so Jedi knows that he was blocked - hitOwner->client->ps.saberEventFlags |= SEF_BLOCKED; - } - //FIXME: base parry breaks on animation (saber attack level), not FP_SABER_OFFENSE - if ( hitOwnerPowerLevel > FORCE_LEVEL_2 || (!deflected && Q_irand( 0, PM_PowerLevelForSaberAnim( &hitOwner->client->ps ) - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] ) > 0 ) ) - {//broke my parry altogether - if ( hitOwnerPowerLevel > FORCE_LEVEL_2 || Q_irand( 0, hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] ) ) - {//chance of continuing with the attack (not bouncing back) - hitOwner->client->ps.saberEventFlags &= ~SEF_BLOCKED; - hitOwner->client->ps.saberBounceMove = LS_NONE; - } - //do some time-consuming saber-knocked-aside broken parry anim - ent->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; - #ifndef FINAL_BUILD - if ( d_saberCombat->integer ) - { - if ( hitOwner->client->ps.saberEventFlags&SEF_BLOCKED ) - { - gi.Printf( S_COLOR_RED"%s parry broken (bounce/deflect)!\n", ent->targetname ); - } - else - { - gi.Printf( S_COLOR_RED"%s parry broken (follow-through)!\n", ent->targetname ); - } - } - #endif - } - else - { - WP_SaberParry( ent, hitOwner, saberNum, bladeNum ); - } - collisionResolved = qtrue; - } - */ - else - {//some other kind of in-hand saber collision + collisionResolved = qtrue; } } + /* + else if ( entDefending && hitOwnerAttacking ) + {//I'm parrying, they're attacking + if ( hitOwnerPowerLevel < FORCE_LEVEL_3 ) + {//strong attacks cannot be deflected + //based on angle of attack & angle of defensive saber, see if I should deflect off in another dir rather than bounce back + deflected = WP_GetSaberDeflectionAngle( hitOwner, ent ); + //just so Jedi knows that he was blocked + hitOwner->client->ps.saberEventFlags |= SEF_BLOCKED; + } + //FIXME: base parry breaks on animation (saber attack level), not FP_SABER_OFFENSE + if ( hitOwnerPowerLevel > FORCE_LEVEL_2 || (!deflected && Q_irand( 0, PM_PowerLevelForSaberAnim( &hitOwner->client->ps ) - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] ) > 0 ) ) + {//broke my parry altogether + if ( hitOwnerPowerLevel > FORCE_LEVEL_2 || Q_irand( 0, hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] ) ) + {//chance of continuing with the attack (not bouncing back) + hitOwner->client->ps.saberEventFlags &= ~SEF_BLOCKED; + hitOwner->client->ps.saberBounceMove = LS_NONE; + } + //do some time-consuming saber-knocked-aside broken parry anim + ent->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; + #ifndef FINAL_BUILD + if ( d_saberCombat->integer ) + { + if ( hitOwner->client->ps.saberEventFlags&SEF_BLOCKED ) + { + gi.Printf( S_COLOR_RED"%s parry broken (bounce/deflect)!\n", ent->targetname ); + } + else + { + gi.Printf( S_COLOR_RED"%s parry broken (follow-through)!\n", ent->targetname ); + } + } + #endif + } + else + { + WP_SaberParry( ent, hitOwner, saberNum, bladeNum ); + } + collisionResolved = qtrue; + } + */ + else + {//some other kind of in-hand saber collision + } } - else - {//some kind of in-flight collision - } + } + else + {//some kind of in-flight collision + } - if (saberHitFraction < 1.0f) - { - if (!collisionResolved && baseDamage) - {//some other kind of in-hand saber collision - //handle my reaction - if (!ent->client->ps.saberInFlight - && ent->client->ps.saberLockTime < level.time) - {//my saber is in hand - if (ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN) - { - if (PM_SaberInAttack(ent->client->ps.saberMove) || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim) || - (entPowerLevel > FORCE_LEVEL_2&&!PM_SaberInIdle(ent->client->ps.saberMove) && !PM_SaberInParry(ent->client->ps.saberMove) && !PM_SaberInReflect(ent->client->ps.saberMove))) - {//in the middle of attacking - if ((ent->client->ps.saberAnimLevel == SS_STRONG - || ent->client->ps.saberAnimLevel == SS_DESANN) - && hitOwner->health > 0) - {//don't deflect/bounce in strong attack or when enemy is dead - WP_GetSaberDeflectionAngle(ent, hitOwner); - ent->client->ps.saberEventFlags |= SEF_BLOCKED; - //since it was blocked/deflected, take away any damage done - //FIXME: what if the damage was done before the parry? - WP_SaberClearDamageForEntNum(ent, hitOwner->s.number, saberNum, bladeNum); - } - } - else - {//saber collided when not attacking, parry it + if (saberHitFraction < 1.0f) + { + if (!collisionResolved && baseDamage) + {//some other kind of in-hand saber collision + //handle my reaction + if (!ent->client->ps.saberInFlight + && ent->client->ps.saberLockTime < level.time) + {//my saber is in hand + if (ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN) + { + if (PM_SaberInAttack(ent->client->ps.saberMove) || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim) || + (entPowerLevel > FORCE_LEVEL_2&&!PM_SaberInIdle(ent->client->ps.saberMove) && !PM_SaberInParry(ent->client->ps.saberMove) && !PM_SaberInReflect(ent->client->ps.saberMove))) + {//in the middle of attacking + if (entPowerLevel < FORCE_LEVEL_3 && hitOwner->health > 0) + {//don't deflect/bounce in strong attack or when enemy is dead + WP_GetSaberDeflectionAngle(ent, hitOwner); + ent->client->ps.saberEventFlags |= SEF_BLOCKED; //since it was blocked/deflected, take away any damage done //FIXME: what if the damage was done before the parry? WP_SaberClearDamageForEntNum(ent, hitOwner->s.number, saberNum, bladeNum); - /* - if ( ent->s.number || g_saberAutoBlocking->integer || ent->client->ps.saberBlockingTime > level.time ) - {//either an NPC or a player who has blocking - if ( !PM_SaberInTransitionAny( ent->client->ps.saberMove ) && !PM_SaberInBounce( ent->client->ps.saberMove ) ) - {//I'm not attacking, in transition or in a bounce, so play a parry - //just so Jedi knows that he parried something - WP_SaberBlockNonRandom( ent, saberHitLocation, qfalse ); - } - ent->client->ps.saberEventFlags |= SEF_PARRIED; - } - */ } } else - { + {//saber collided when not attacking, parry it //since it was blocked/deflected, take away any damage done //FIXME: what if the damage was done before the parry? WP_SaberClearDamageForEntNum(ent, hitOwner->s.number, saberNum, bladeNum); - } - } - else - {//nothing happens to *me* when my inFlight saber hits something - } - //handle their reaction - if (hitOwner - && hitOwner->health > 0 - && hitOwner->client - && !hitOwner->client->ps.saberInFlight - && hitOwner->client->ps.saberLockTime < level.time) - {//their saber is in hand - if (PM_SaberInAttack(hitOwner->client->ps.saberMove) || PM_SaberInSpecialAttack(hitOwner->client->ps.torsoAnim) || - (hitOwner->client->ps.saberAnimLevel > SS_MEDIUM&&!PM_SaberInIdle(hitOwner->client->ps.saberMove) && !PM_SaberInParry(hitOwner->client->ps.saberMove) && !PM_SaberInReflect(hitOwner->client->ps.saberMove))) - {//in the middle of attacking /* - if ( hitOwner->client->ps.saberAnimLevel < SS_STRONG ) - {//don't deflect/bounce in strong attack - WP_GetSaberDeflectionAngle( hitOwner, ent ); - hitOwner->client->ps.saberEventFlags |= SEF_BLOCKED; + if ( ent->s.number || g_saberAutoBlocking->integer || ent->client->ps.saberBlockingTime > level.time ) + {//either an NPC or a player who has blocking + if ( !PM_SaberInTransitionAny( ent->client->ps.saberMove ) && !PM_SaberInBounce( ent->client->ps.saberMove ) ) + {//I'm not attacking, in transition or in a bounce, so play a parry + //just so Jedi knows that he parried something + WP_SaberBlockNonRandom( ent, saberHitLocation, qfalse ); + } + ent->client->ps.saberEventFlags |= SEF_PARRIED; } */ } - else - {//saber collided when not attacking, parry it - if (!PM_SaberInBrokenParry(hitOwner->client->ps.saberMove)) - {//not currently in a broken parry - if (!WP_SaberParry(hitOwner, ent, saberNum, bladeNum)) - {//FIXME: hitOwner can't parry, do some time-consuming saber-knocked-aside broken parry anim? - //hitOwner->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; - } - } + } + else + { + //since it was blocked/deflected, take away any damage done + //FIXME: what if the damage was done before the parry? + WP_SaberClearDamageForEntNum(ent, hitOwner->s.number, saberNum, bladeNum); + } + } + else + {//nothing happens to *me* when my inFlight saber hits something + } + //handle their reaction + if (hitOwner + && hitOwner->health > 0 + && hitOwner->client + && !hitOwner->client->ps.saberInFlight + && hitOwner->client->ps.saberLockTime < level.time) + {//their saber is in hand + if (PM_SaberInAttack(hitOwner->client->ps.saberMove) || PM_SaberInSpecialAttack(hitOwner->client->ps.torsoAnim) || + (hitOwner->client->ps.saberAnimLevel > SS_MEDIUM&&!PM_SaberInIdle(hitOwner->client->ps.saberMove) && !PM_SaberInParry(hitOwner->client->ps.saberMove) && !PM_SaberInReflect(hitOwner->client->ps.saberMove))) + {//in the middle of attacking + /* + if ( hitOwner->client->ps.saberAnimLevel < SS_STRONG ) + {//don't deflect/bounce in strong attack + WP_GetSaberDeflectionAngle( hitOwner, ent ); + hitOwner->client->ps.saberEventFlags |= SEF_BLOCKED; } + */ } else - {//nothing happens to *hitOwner* when their inFlight saber hits something + {//saber collided when not attacking, parry it + if (!PM_SaberInBrokenParry(hitOwner->client->ps.saberMove)) + {//not currently in a broken parry + if (!WP_SaberParry(hitOwner, ent, saberNum, bladeNum)) + {//FIXME: hitOwner can't parry, do some time-consuming saber-knocked-aside broken parry anim? + //hitOwner->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; + } + } } } + else + {//nothing happens to *hitOwner* when their inFlight saber hits something + } + } + + //collision must have been handled by now + //Set the blocked attack bounce value in saberBlocked so we actually play our saberBounceMove anim + if (ent->client->ps.saberEventFlags & SEF_BLOCKED) + { + if (ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN) + { + ent->client->ps.saberBlocked = BLOCKED_ATK_BOUNCE; + } + } + /* + if ( hitOwner && hitOwner->client->ps.saberEventFlags & SEF_BLOCKED ) + { + hitOwner->client->ps.saberBlocked = BLOCKED_ATK_BOUNCE; + } + */ + } + + if (saberHitFraction < 1.0f || collisionResolved) + {//either actually hit or locked + if (ent->client->ps.saberLockTime < level.time) + { + if (inFlightSaberBlocked) + {//FIXME: never hear this sound + WP_SaberBounceSound(ent, hitOwner, &g_entities[ent->client->ps.saberEntityNum], 0, 0, qfalse); + } + else + { + if (deflected) + { + WP_SaberBounceSound(ent, hitOwner, NULL, saberNum, bladeNum, qtrue); + } + else + { + WP_SaberBlockSound(ent, hitOwner, saberNum, bladeNum); + } + } + if (!g_saberNoEffects) + { + WP_SaberBlockEffect(ent, saberNum, bladeNum, saberHitLocation, saberHitNormal, qfalse); + } + } + // Set the little screen flash - only when an attack is blocked + if (!g_noClashFlare) + { + g_saberFlashTime = level.time - 50; + VectorCopy(saberHitLocation, g_saberFlashPos); + } + } + + if (saberHitFraction < 1.0f) + { + if (inFlightSaberBlocked) + {//we threw a saber and it was blocked, do any effects, etc. + int knockAway = 5; + if (hitEnt + && hitOwner + && hitOwner->client + && (PM_SaberInAttack(hitOwner->client->ps.saberMove) || PM_SaberInSpecialAttack(hitOwner->client->ps.torsoAnim) || PM_SpinningSaberAnim(hitOwner->client->ps.torsoAnim))) + {//if hit someone who was in an attack or spin anim, more likely to have in-flight saber knocked away + if (hitOwnerPowerLevel > FORCE_LEVEL_2) + {//strong attacks almost always knock it aside! + knockAway = 1; + } + else + {//33% chance + knockAway = 2; + } + knockAway -= hitOwner->client->ps.SaberDisarmBonus(0); + } + if (Q_irand(0, knockAway) <= 0 || //random + (hitOwner + && hitOwner->client + && hitOwner->NPC + && (hitOwner->NPC->aiFlags&NPCAI_BOSS_CHARACTER) + ) //or if blocked by a Boss character FIXME: or base on defense level? + )//FIXME: player should not auto-block a flying saber, let him override the parry with an attack to knock the saber from the air, rather than this random chance + {//knock it aside and turn it off + if (!g_saberNoEffects) + { + if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].hitOtherEffect) + { + G_PlayEffect(ent->client->ps.saber[saberNum].hitOtherEffect, saberHitLocation, saberHitNormal); + } + else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].hitOtherEffect2) + { + G_PlayEffect(ent->client->ps.saber[saberNum].hitOtherEffect2, saberHitLocation, saberHitNormal); + } + else + { + G_PlayEffect("saber/saber_cut", saberHitLocation, saberHitNormal); + } + } + if (hitEnt) + { + vec3_t newDir; + + VectorSubtract(g_entities[ent->client->ps.saberEntityNum].currentOrigin, hitEnt->currentOrigin, newDir); + VectorNormalize(newDir); + G_ReflectMissile(ent, &g_entities[ent->client->ps.saberEntityNum], newDir, FP_SABER_DEFENSE); + } + Jedi_PlayDeflectSound(hitOwner); + WP_SaberDrop(ent, &g_entities[ent->client->ps.saberEntityNum]); + } + else + { + if (!Q_irand(0, 2) && hitEnt) + { + vec3_t newDir; + VectorSubtract(g_entities[ent->client->ps.saberEntityNum].currentOrigin, hitEnt->currentOrigin, newDir); + VectorNormalize(newDir); + G_ReflectMissile(ent, &g_entities[ent->client->ps.saberEntityNum], newDir, FP_SABER_DEFENSE); + } + WP_SaberReturn(ent, &g_entities[ent->client->ps.saberEntityNum]); + } + } + } + } + + if (ent->client->ps.saberLockTime > level.time) + { + if (ent->s.number < ent->client->ps.saberLockEnemy + && !Q_irand(0, 3)) + {//need to make some kind of effect + vec3_t hitNorm = { 0, 0, 1 }; + if (WP_SabersIntersection(ent, &g_entities[ent->client->ps.saberLockEnemy], g_saberFlashPos)) + { + if (Q_irand(0, 10)) + { + if (!g_saberNoEffects) + { + WP_SaberBlockEffect(ent, saberNum, bladeNum, g_saberFlashPos, hitNorm, qfalse); + } + } + else + { + if (!g_noClashFlare) + { + g_saberFlashTime = level.time - 50; + } + if (!g_saberNoEffects) + { + WP_SaberBlockEffect(ent, saberNum, bladeNum, g_saberFlashPos, hitNorm, qtrue); + } + } + WP_SaberBlockSound(ent, &g_entities[ent->client->ps.saberLockEnemy], 0, 0); + } + } + } + else + { + if (hit_wall + && (ent->client->ps.saber[saberNum].saberFlags&SFL_BOUNCE_ON_WALLS) + && (PM_SaberInAttackPure(ent->client->ps.saberMove) //only in a normal attack anim + || ent->client->ps.saberMove == LS_A_JUMP_T__B_) //or in the strong jump-fwd-attack "death from above" move + ) + {//bounce off walls + //do anim + ent->client->ps.saberBlocked = BLOCKED_ATK_BOUNCE; + ent->client->ps.saberBounceMove = LS_D1_BR + (saberMoveData[ent->client->ps.saberMove].startQuad - Q_BR); + //do bounce sound & force feedback + WP_SaberBounceOnWallSound(ent, saberNum, bladeNum); + //do hit effect + if (!g_saberNoEffects) + { + if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].hitOtherEffect) + { + G_PlayEffect(ent->client->ps.saber[saberNum].hitOtherEffect, saberHitLocation, saberHitNormal); + } + else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].hitOtherEffect2) + { + G_PlayEffect(ent->client->ps.saber[saberNum].hitOtherEffect2, saberHitLocation, saberHitNormal); + } + else + { + G_PlayEffect("saber/saber_cut", saberHitLocation, saberHitNormal); + } + } + //do radius damage/knockback, if any + if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum)) + { + WP_SaberRadiusDamage(ent, saberHitLocation, ent->client->ps.saber[saberNum].splashRadius, ent->client->ps.saber[saberNum].splashDamage, ent->client->ps.saber[saberNum].splashKnockback); + } + else + { + WP_SaberRadiusDamage(ent, saberHitLocation, ent->client->ps.saber[saberNum].splashRadius2, ent->client->ps.saber[saberNum].splashDamage2, ent->client->ps.saber[saberNum].splashKnockback2); + } + } + } + + if (WP_SaberApplyDamage(ent, baseDamage, baseDFlags, brokenParry, saberNum, bladeNum, (qboolean)(saberNum == 0 && ent->client->ps.saberInFlight))) + {//actually did damage to something +#ifndef FINAL_BUILD + if ( d_saberCombat->integer ) + { + gi.Printf( "base damage was %4.2f\n", baseDamage ); + } +#endif + WP_SaberHitSound(ent, saberNum, bladeNum); + } + + if (hit_wall) + { + //just so Jedi knows that he hit a wall + ent->client->ps.saberEventFlags |= SEF_HITWALL; + if (ent->s.number == 0) + { + AddSoundEvent(ent, ent->currentOrigin, 128, AEL_DISCOVERED, qfalse, qtrue);//FIXME: is this impact on ground or not? + AddSightEvent(ent, ent->currentOrigin, 256, AEL_DISCOVERED, 50); + } + } +} + +void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) +{ + vec3_t mp1, mp2, md1, md2, baseOld, baseNew, baseDiff, endOld, endNew, bladePointOld, bladePointNew; + float tipDmgMod = 1.0f; + float baseDamage; + int baseDFlags = 0; + qboolean hit_wall = qfalse; + qboolean brokenParry = qfalse; + + for (int ven = 0; ven < MAX_SABER_VICTIMS; ven++) + { + victimEntityNum[ven] = ENTITYNUM_NONE; + } + memset(totalDmg, 0, sizeof(totalDmg)); + memset(dmgDir, 0, sizeof(dmgDir)); + memset(dmgNormal, 0, sizeof(dmgNormal)); + memset(dmgSpot, 0, sizeof(dmgSpot)); + memset(dmgFraction, 0, sizeof(dmgFraction)); + memset(hitLoc, HL_NONE, sizeof(hitLoc)); + memset(hitDismemberLoc, HL_NONE, sizeof(hitDismemberLoc)); + memset(hitDismember, qfalse, sizeof(hitDismember)); + numVictims = 0; + VectorClear(saberHitLocation); + VectorClear(saberHitNormal); + saberHitFraction = 1.0; // Closest saber hit. The saber can do no damage past this point. + saberHitEntity = ENTITYNUM_NONE; + sabersCrossed = -1; + + if (!ent->client) + { + return; + } + + if (!ent->s.number) + {//player never uses these + ent->client->ps.saberEventFlags &= ~SEF_EVENTS; + } + + if (ent->client->ps.saber[saberNum].blade[bladeNum].length <= 1)//cen get down to 1 when in a wall + {//saber is not on + return; + } + + if (VectorCompare(ent->client->renderInfo.muzzlePointOld, vec3_origin) || VectorCompare(ent->client->renderInfo.muzzleDirOld, vec3_origin)) + { + //just started up the saber? + return; + } + + int saberContents = 0; + if (!(ent->client->ps.saber[saberNum].saberFlags&SFL_ON_IN_WATER)) + {//saber can't stay on underwater + saberContents = gi.pointcontents(ent->client->renderInfo.muzzlePoint, ent->client->ps.saberEntityNum); + } + if ((saberContents&CONTENTS_WATER) || + (saberContents&CONTENTS_SLIME) || + (saberContents&CONTENTS_LAVA)) + {//um... turn off? Or just set length to 1? + //FIXME: short-out effect/sound? + ent->client->ps.saber[saberNum].blade[bladeNum].active = qfalse; + return; + } + else if (!g_saberNoEffects && gi.WE_IsOutside(ent->client->renderInfo.muzzlePoint)) + { + float chanceOfFizz = gi.WE_GetChanceOfSaberFizz(); + if (chanceOfFizz>0 && Q_flrand(0.0f, 1.0f)client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, ent->client->ps.saber[saberNum].blade[bladeNum].length*Q_flrand(0, 1), ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, end); + G_PlayEffect("saber/fizz", end); + } + } + + //FIXMEFIXMEFIXME: When in force speed (esp. lvl 3), need to interpolate this because + // we animate so much faster that the arc is pretty much flat... + + int entPowerLevel = 0; + int stylePowerModifier = 0; + int stylePowerLevel = PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum); //this here should account for special moves now correctly + + /*Power level base numbers instead of being 1,2, and 3 now are doubled. And Saber Offense is the main determinant. + Saber Offense - + 1: entPowerLevel = 2 + 2: entPowerLevel = 4 + 3: entPowerLevel = 6 + + So +2 is like one Offense level higher. +1 is like half of a level. Strong style gives a +2 bonus as can be seen below. + + Then the style power modifier based on which saber style is used, enhancement force powers, breakParrybonuses, and whether or not you are in a transition as opposed to a slash, or a special attack should modify the power (not in that order, I have no idea what order haha) - Dusty*/ + + + switch (stylePowerLevel) // check what the saber style is and set power modifier accordingly + { + case 1: + stylePowerModifier = -2; + break; + case 2: + stylePowerModifier = -1; + break; + case 3: + stylePowerModifier = 0; + break; + case 4: + stylePowerModifier = 1; + break; + case 5: //special attacks count as this in bg_panimate + stylePowerModifier = 2; + break; + } + + if (PM_SaberInTransitionAny(ent->client->ps.saberMove)) // if in a transition that still counts as attacking for stronger styles, but this is so you're not as strong quite as a regular slash + { + stylePowerLevel -= 2; + } + if (ent->client->NPC_class == CLASS_SABER_DROID) //FIXME D: saber droids do their own thing... they need to be incorporated into this system I suppose? + { + entPowerLevel = SaberDroid_PowerLevelForSaberAnim(ent); + } + else + { + entPowerLevel = (2 * ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE]) + stylePowerModifier; + } + + if (PM_SaberInSpecialAttack(ent->client->ps.saberMove)) //now for special moves + { //special moves get a 2nd boost on top of the one in bg_panimate + entPowerLevel += 2; + } + + //now for modifiers based on any enhancement powers active + if (!ent->s.number && (ent->client->ps.forcePowersActive&(1 << FP_SPEED))) + { //min power bonus is +1, max bonus is +3 + entPowerLevel += 1 * ent->client->ps.forcePowerLevel[FP_SPEED]; + } + + if (entPowerLevel) //this is saying, if we HAVE a power level, i.e. we are slashing not just idling then... + { + if (ent->client->ps.forceRageRecoveryTime > level.time) + { + entPowerLevel -= 2; + } + else if (ent->client->ps.forcePowersActive & (1 << FP_RAGE)) + { //min power bonus is +2, max is +4, slightly more than Speed 3 + + entPowerLevel += ent->client->ps.forcePowerLevel[FP_RAGE] + 1; + + } + } + + if (ent->client->ps.saberInFlight) + {//flying sabers are much more deadly + //unless you're dead + if (ent->health <= 0 && g_saberRealisticCombat->integer < 2) + {//so enemies don't keep trying to block it + //FIXME: still do damage, just not to humanoid clients who should try to avoid it + //baseDamage = 0.0f; + return; + } + //or unless returning + else if (ent->client->ps.saberEntityState == SES_RETURNING + && !(ent->client->ps.saber[0].saberFlags&SFL_RETURN_DAMAGE))//type != SABER_STAR ) + {//special case, since we're returning, chances are if we hit something + //it's going to be butt-first. So do less damage. + baseDamage = 0.1f; + } + else + { + if (!ent->s.number) + {//cheat for player + baseDamage = 10.0f; + } + else + { + baseDamage = 2.5f; + } + } + //Use old to current since can't predict it + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePointOld, mp1); + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDirOld, md1); + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, mp2); + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, md2); + } + else + { + if (ent->client->ps.torsoAnim == BOTH_A7_HILT) + {//no effects, no damage + return; + } + else if (G_InCinematicSaberAnim(ent)) + { + baseDFlags = DAMAGE_NO_KILL; + baseDamage = 0.1f; + } + else if (ent->client->ps.saberMove == LS_READY + && !PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) + {//just do effects + if (g_saberRealisticCombat->integer < 2) + {//don't kill with this hit + baseDFlags = DAMAGE_NO_KILL; + } + if ((!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT)) + || (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT2)) + ) + {//do nothing at all when idle + return; + } + baseDamage = 0; + } + else if (ent->client->ps.saberLockTime > level.time) + {//just do effects + if ((!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT)) + || (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT2)) + ) + {//do nothing at all when idle + return; + } + baseDamage = 0; + } + else if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].damageScale <= 0.0f + && ent->client->ps.saber[saberNum].knockbackScale <= 0.0f) + {//this blade does no damage and no knockback (only for blocking?) + baseDamage = 0; + } + else if (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && ent->client->ps.saber[saberNum].damageScale2 <= 0.0f + && ent->client->ps.saber[saberNum].knockbackScale2 <= 0.0f) + {//this blade does no damage and no knockback (only for blocking?) + baseDamage = 0; + } + else if (ent->client->ps.saberBlocked > BLOCKED_NONE + || (!PM_SaberInAttack(ent->client->ps.saberMove) + && !PM_SaberInSpecialAttack(ent->client->ps.torsoAnim) + && !PM_SaberInTransitionAny(ent->client->ps.saberMove) + ) + ) + {//don't do damage if parrying/reflecting/bouncing/deflecting or not actually attacking or in a transition to/from/between attacks + if ((!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT)) + || (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT2)) + ) + {//do nothing at all when idle + return; + } + baseDamage = 0; + } + else + {//okay, in a saberMove that does damage + //make sure we're in the right anim + if (!PM_SaberInSpecialAttack(ent->client->ps.torsoAnim) + && !PM_InAnimForSaberMove(ent->client->ps.torsoAnim, ent->client->ps.saberMove)) + {//forced into some other animation somehow, like a pain or death? + if ((!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT)) + || (WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum) + && (ent->client->ps.saber[saberNum].saberFlags2&SFL2_NO_IDLE_EFFECT2)) + ) + {//do nothing at all when idle + return; + } + baseDamage = 0; + } + else if (ent->client->ps.weaponstate == WEAPON_FIRING && ent->client->ps.saberBlocked == BLOCKED_NONE && + (PM_SaberInAttack(ent->client->ps.saberMove) || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim) || PM_SpinningSaberAnim(ent->client->ps.torsoAnim) || entPowerLevel > FORCE_LEVEL_2 || (WP_SaberBladeDoTransitionDamage(&ent->client->ps.saber[saberNum], bladeNum) && PM_SaberInTransitionAny(ent->client->ps.saberMove))))// || ent->client->ps.saberAnimLevel == SS_STAFF ) ) + {//normal attack swing swinging/spinning (or if using strong set), do normal damage //FIXME: or if using staff? + //FIXME: more damage for higher attack power levels? + // More damage based on length/color of saber? + //FIXME: Desann does double damage? + + + + if (g_saberNewCombat->integer) //new code + { + if (g_saberRealisticCombat->integer) + { + switch ((ent->client->ps.saberAnimLevel)) + { + default: + case FORCE_LEVEL_5: + baseDamage = 10.0f; + break; + case FORCE_LEVEL_4: //Staff, medium, duals all do same damage + case FORCE_LEVEL_3: + case FORCE_LEVEL_2: + baseDamage = 5.0f; + break; + case FORCE_LEVEL_0: + case FORCE_LEVEL_1: //FIXME: Fast damage is so low... + baseDamage = 2.5f; + break; + } + } + else + { + if (g_spskill->integer > 0 + && ent->s.number < MAX_CLIENTS + && (ent->client->ps.torsoAnim == BOTH_ROLL_STAB + || ent->client->ps.torsoAnim == BOTH_SPINATTACK6 + || ent->client->ps.torsoAnim == BOTH_SPINATTACK7 + || ent->client->ps.torsoAnim == BOTH_LUNGE2_B__T_)) + {//*sigh*, these anim do less damage since they're so easy to do + baseDamage = 2.5f; + } + else + { + switch ((ent->client->ps.saberAnimLevel)) + { + default: + case FORCE_LEVEL_5: + baseDamage = 7.5f; + break; + case FORCE_LEVEL_4: //Staff, medium, duals all do same damage + case FORCE_LEVEL_3: + case FORCE_LEVEL_2: + baseDamage = 5.0f; + break; + case FORCE_LEVEL_0: + case FORCE_LEVEL_1: //FIXME: Fast damage is so low... + baseDamage = 2.5f; + break; + } + } + } + } + } + else + {//saber is transitioning, defending or idle, don't do as much damage + //FIXME: strong attacks and returns should do damage and be unblockable + if (g_timescale->value < 1.0) + {//in slow mo or force speed, we need to do damage during the transitions + if (g_saberRealisticCombat->integer) + { + switch (entPowerLevel) + { + case FORCE_LEVEL_3: + baseDamage = 10.0f; + break; + case FORCE_LEVEL_2: + baseDamage = 5.0f; + break; + default: + case FORCE_LEVEL_1: + baseDamage = 2.5f; + break; + } + } + else + { + baseDamage = 2.5f * (float)entPowerLevel; + } + } + else// if ( !ent->s.number ) + {//I have to do *some* damage in transitions or else you feel like a total gimp + baseDamage = 0.1f; + } + /* + else + { + baseDamage = 0;//was 1.0f;//was 0.25 + } + */ + } + } + + //Use current to next since can predict it + //FIXME: if they're closer than the saber blade start, we don't want the + // arm to pass through them without any damage... so check the radius + // and push them away (do pain & knockback) + //FIXME: if going into/coming from a parry/reflection or going into a deflection, don't use old mp & dir? Otherwise, deflections will cut through? + //VectorCopy( ent->client->renderInfo.muzzlePoint, mp1 ); + //VectorCopy( ent->client->renderInfo.muzzleDir, md1 ); + //VectorCopy( ent->client->renderInfo.muzzlePointNext, mp2 ); + //VectorCopy( ent->client->renderInfo.muzzleDirNext, md2 ); + //prediction was causing gaps in swing (G2 problem) so *don't* predict + if (ent->client->ps.saberDamageDebounceTime > level.time) + {//really only used when a saber attack start anim starts, not actually for stopping damage + //we just want to not use the old position to trace the attack from... + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePointOld); + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDirOld); + } + //do the damage trace from the last position... + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePointOld, mp1); + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDirOld, md1); + //...to the current one. + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint, mp2); + VectorCopy(ent->client->ps.saber[saberNum].blade[bladeNum].muzzleDir, md2); + + //NOTE: this is a test, may not be necc, as I can still swing right through someone without hitting them, somehow... + //see if anyone is so close that they're within the dist from my origin to the start of the saber + if (ent->health > 0 && !ent->client->ps.saberLockTime && saberNum == 0 && bladeNum == 0 + && !G_InCinematicSaberAnim(ent)) + {//only do once - for first blade + trace_t trace; + gi.trace(&trace, ent->currentOrigin, vec3_origin, vec3_origin, mp1, ent->s.number, (MASK_SHOT&~(CONTENTS_CORPSE | CONTENTS_ITEM)), (EG2_Collision)0, 0); + if (trace.entityNum < ENTITYNUM_WORLD && (trace.entityNum > 0 || ent->client->NPC_class == CLASS_DESANN))//NPCs don't push player away, unless it's Desann + {//a valid ent + gentity_t *traceEnt = &g_entities[trace.entityNum]; + if (traceEnt + && traceEnt->client + && traceEnt->client->NPC_class != CLASS_RANCOR + && traceEnt->client->NPC_class != CLASS_ATST + && traceEnt->client->NPC_class != CLASS_WAMPA + && traceEnt->client->NPC_class != CLASS_SAND_CREATURE + && traceEnt->health > 0 + && traceEnt->client->playerTeam != ent->client->playerTeam + && !PM_SuperBreakLoseAnim(traceEnt->client->ps.legsAnim) + && !PM_SuperBreakLoseAnim(traceEnt->client->ps.torsoAnim) + && !PM_SuperBreakWinAnim(traceEnt->client->ps.legsAnim) + && !PM_SuperBreakWinAnim(traceEnt->client->ps.torsoAnim) + && !PM_InKnockDown(&traceEnt->client->ps) + && !PM_LockedAnim(traceEnt->client->ps.legsAnim) + && !PM_LockedAnim(traceEnt->client->ps.torsoAnim) + && !G_InCinematicSaberAnim(traceEnt)) + {//enemy client, push them away + if (!traceEnt->client->ps.saberLockTime + && !traceEnt->message + && !(traceEnt->flags&FL_NO_KNOCKBACK) + && (!traceEnt->NPC || traceEnt->NPC->jumpState != JS_JUMPING)) + {//don't push people in saberlock or with security keys or who are in BS_JUMP + vec3_t hitDir; + VectorSubtract(trace.endpos, ent->currentOrigin, hitDir); + float totalDist = Distance(mp1, ent->currentOrigin); + float knockback = (totalDist - VectorNormalize(hitDir)) / totalDist * 200.0f; + hitDir[2] = 0; + //FIXME: do we need to call G_Throw? Seems unfair to put actual knockback on them, stops the attack + //G_Throw( traceEnt, hitDir, knockback ); + VectorMA(traceEnt->client->ps.velocity, knockback, hitDir, traceEnt->client->ps.velocity); + traceEnt->client->ps.pm_time = 200; + traceEnt->client->ps.pm_flags |= PMF_TIME_NOFRICTION; +#ifndef FINAL_BUILD + if (d_saberCombat->integer) + { + gi.Printf("%s pushing away %s at %s\n", ent->NPC_type, traceEnt->NPC_type, vtos(traceEnt->client->ps.velocity)); + } +#endif + } + } + } + } + } + + //the thicker the blade, the more damage... the thinner, the less damage + baseDamage *= ent->client->ps.saber[saberNum].blade[bladeNum].radius / SABER_RADIUS_STANDARD; + + if (g_saberRealisticCombat->integer > 1) + {//always do damage, and lots of it + if (g_saberRealisticCombat->integer > 2) + {//always do damage, and lots of it + baseDamage = 25.0f; + } + else if (baseDamage > 0.1f) + {//only do super damage if we would have done damage according to normal rules + baseDamage = 25.0f; + } + } + else if (((!ent->s.number&&ent->client->ps.forcePowersActive&(1 << FP_SPEED)) || ent->client->ps.forcePowersActive&(1 << FP_RAGE)) + && g_timescale->value < 1.0f) + { + baseDamage *= (1.0f - g_timescale->value); + } + if (baseDamage > 0.1f) + { + if ((ent->client->ps.forcePowersActive&(1 << FP_RAGE))) + {//add some damage if raged + baseDamage += ent->client->ps.forcePowerLevel[FP_RAGE] * 5.0f; + } + else if (ent->client->ps.forceRageRecoveryTime) + {//halve it if recovering + baseDamage *= 0.5f; + } + } + // Get the old state of the blade + VectorCopy(mp1, baseOld); + VectorMA(baseOld, ent->client->ps.saber[saberNum].blade[bladeNum].length, md1, endOld); + // Get the future state of the blade + VectorCopy(mp2, baseNew); + VectorMA(baseNew, ent->client->ps.saber[saberNum].blade[bladeNum].length, md2, endNew); + + sabersCrossed = -1; + if (VectorCompare2(baseOld, baseNew) && VectorCompare2(endOld, endNew)) + { + hit_wall = WP_SaberDamageForTrace(ent->s.number, mp2, endNew, baseDamage * 4, md2, + qfalse, entPowerLevel, ent->client->ps.saber[saberNum].type, qfalse, + saberNum, bladeNum); + } + else + { + float aveLength, step = 8, stepsize = 8; + vec3_t ma1, ma2, md2ang, curBase1, curBase2; + int xx; + //do the trace at the base first + hit_wall = WP_SaberDamageForTrace(ent->s.number, baseOld, baseNew, baseDamage, md2, + qfalse, entPowerLevel, ent->client->ps.saber[saberNum].type, qtrue, + saberNum, bladeNum); + + //if hit a saber, shorten rest of traces to match + if (saberHitFraction < 1.0) + { + //adjust muzzleDir... + vec3_t ma1, ma2; + vectoangles(md1, ma1); + vectoangles(md2, ma2); + for (xx = 0; xx < 3; xx++) + { + md2ang[xx] = LerpAngle(ma1[xx], ma2[xx], saberHitFraction); + } + AngleVectors(md2ang, md2, NULL, NULL); + //shorten the base pos + VectorSubtract(mp2, mp1, baseDiff); + VectorMA(mp1, saberHitFraction, baseDiff, baseNew); + VectorMA(baseNew, ent->client->ps.saber[saberNum].blade[bladeNum].length, md2, endNew); + } + + //If the angle diff in the blade is high, need to do it in chunks of 33 to avoid flattening of the arc + float dirInc, curDirFrac; + if (PM_SaberInAttack(ent->client->ps.saberMove) + || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim) + || PM_SpinningSaberAnim(ent->client->ps.torsoAnim) + || PM_InSpecialJump(ent->client->ps.torsoAnim) + || (g_timescale->value<1.0f&&PM_SaberInTransitionAny(ent->client->ps.saberMove))) + { + curDirFrac = DotProduct(md1, md2); + } + else + { + curDirFrac = 1.0f; + } + //NOTE: if saber spun at least 180 degrees since last damage trace, this is not reliable...! + if (fabs(curDirFrac) < 1.0f - MAX_SABER_SWING_INC) + {//the saber blade spun more than 33 degrees since the last damage trace + curDirFrac = dirInc = 1.0f / ((1.0f - curDirFrac) / MAX_SABER_SWING_INC); + } + else + { + curDirFrac = 1.0f; + dirInc = 0.0f; + } + qboolean hit_saber = qfalse; + + vectoangles(md1, ma1); + vectoangles(md2, ma2); + + vec3_t curMD1, curMD2;//, mdDiff, dirDiff; + //VectorSubtract( md2, md1, mdDiff ); + VectorCopy(md1, curMD2); + VectorCopy(baseOld, curBase2); + + while (1) + { + VectorCopy(curMD2, curMD1); + VectorCopy(curBase2, curBase1); + if (curDirFrac >= 1.0f) + { + VectorCopy(md2, curMD2); + VectorCopy(baseNew, curBase2); + } + else + { + for (xx = 0; xx < 3; xx++) + { + md2ang[xx] = LerpAngle(ma1[xx], ma2[xx], curDirFrac); + } + AngleVectors(md2ang, curMD2, NULL, NULL); + //VectorMA( md1, curDirFrac, mdDiff, curMD2 ); + VectorSubtract(baseNew, baseOld, baseDiff); + VectorMA(baseOld, curDirFrac, baseDiff, curBase2); + } + // Move up the blade in intervals of stepsize + for (step = stepsize; step < ent->client->ps.saber[saberNum].blade[bladeNum].length && step < ent->client->ps.saber[saberNum].blade[bladeNum].lengthOld; step += 12) + { + VectorMA(curBase1, step, curMD1, bladePointOld); + VectorMA(curBase2, step, curMD2, bladePointNew); + if (WP_SaberDamageForTrace(ent->s.number, bladePointOld, bladePointNew, baseDamage, curMD2, + qfalse, entPowerLevel, ent->client->ps.saber[saberNum].type, qtrue, + saberNum, bladeNum)) + { + hit_wall = qtrue; + } - //collision must have been handled by now - //Set the blocked attack bounce value in saberBlocked so we actually play our saberBounceMove anim - if (ent->client->ps.saberEventFlags & SEF_BLOCKED) + //if hit a saber, shorten rest of traces to match + if (saberHitFraction < 1.0) { - if (ent->client->ps.saberBlocked != BLOCKED_PARRY_BROKEN) + //adjust muzzle endpoint + VectorSubtract(mp2, mp1, baseDiff); + VectorMA(mp1, saberHitFraction, baseDiff, baseNew); + VectorMA(baseNew, ent->client->ps.saber[saberNum].blade[bladeNum].length, curMD2, endNew); + //adjust muzzleDir... + vec3_t curMA1, curMA2; + vectoangles(curMD1, curMA1); + vectoangles(curMD2, curMA2); + for (xx = 0; xx < 3; xx++) { - ent->client->ps.saberBlocked = BLOCKED_ATK_BOUNCE; + md2ang[xx] = LerpAngle(curMA1[xx], curMA2[xx], saberHitFraction); } + AngleVectors(md2ang, curMD2, NULL, NULL); + /* + VectorSubtract( curMD2, curMD1, dirDiff ); + VectorMA( curMD1, saberHitFraction, dirDiff, curMD2 ); + */ + hit_saber = qtrue; } - /* - if ( hitOwner && hitOwner->client->ps.saberEventFlags & SEF_BLOCKED ) + if (hit_wall) { - hitOwner->client->ps.saberBlocked = BLOCKED_ATK_BOUNCE; + break; } - */ } - } //new code end - else - { //old code start + if (hit_wall || hit_saber) + { + break; + } + if (curDirFrac >= 1.0f) + { + break; + } + else + { + curDirFrac += dirInc; + if (curDirFrac >= 1.0f) + { + curDirFrac = 1.0f; + } + } + } + + //do the trace at the end last + //Special check- adjust for length of blade not being a multiple of 12 + aveLength = (ent->client->ps.saber[saberNum].blade[bladeNum].lengthOld + ent->client->ps.saber[saberNum].blade[bladeNum].length) / 2; + if (step > aveLength) + {//less dmg if the last interval was not stepsize + tipDmgMod = (stepsize - (step - aveLength)) / stepsize; + } + //NOTE: since this is the tip, we do not extrapolate the extra 16 + if (WP_SaberDamageForTrace(ent->s.number, endOld, endNew, tipDmgMod*baseDamage, md2, + qfalse, entPowerLevel, ent->client->ps.saber[saberNum].type, qfalse, + saberNum, bladeNum)) + { + hit_wall = qtrue; + } + } + + if ((saberHitFraction < 1.0f || (sabersCrossed >= 0 && sabersCrossed <= 32.0f)) && (ent->client->ps.weaponstate == WEAPON_FIRING || ent->client->ps.saberInFlight || G_InCinematicSaberAnim(ent))) + {// The saber (in-hand) hit another saber, mano. + qboolean inFlightSaberBlocked = qfalse; + qboolean collisionResolved = qfalse; + qboolean deflected = qfalse; + + gentity_t *hitEnt = &g_entities[saberHitEntity]; + gentity_t *hitOwner = NULL; + + int hitOwnerPowerLevel = FORCE_LEVEL_0; + + if (g_saberNewCombat->integer) //Dusty, new code start. + { + if (hitEnt) + { + hitOwner = hitEnt->owner; + } + if (hitOwner && hitOwner->client) + { + hitOwnerPowerLevel = 2 * hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; + hitOwner->breakLimit = hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; + } + } + + /* //old crud here + if ( entPowerLevel >= FORCE_LEVEL_3 + && PM_SaberInSpecialAttack( ent->client->ps.torsoAnim ) ) + {//a special "unblockable" attack + if ( hitOwner->client->NPC_class == CLASS_ALORA + || hitOwner->client->NPC_class == CLASS_SHADOWTROOPER + || (hitOwner->NPC&&(hitOwner->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) ) + {//these masters can even block unblockables (stops cheap kills) + entPowerLevel = FORCE_LEVEL_2; + } + } + */ + + + //FIXME: check for certain anims, facing, etc, to make them lock into a sabers-locked pose + //SEF_LOCKED + + if (ent->client->ps.saberInFlight && saberNum == 0 && + ent->client->ps.saber[saberNum].blade[bladeNum].active && + ent->client->ps.saberEntityNum != ENTITYNUM_NONE && + ent->client->ps.saberEntityState != SES_RETURNING) + {//saber was blocked, return it + inFlightSaberBlocked = qtrue; + } + + //hitOwner BreakCounter, BreakLimit, RecoveryInterval, RecoveryTime + //how many strong attacks (where saber offense + saber style modifier total power is greater than defender's defense strength) can be deflected before defender gets tired and his defense breaks, saber defense 1 is 1 hit, 2 is 2 hits, etc. + //FIXME: based on strength, position and angle of attack & defense, decide if: // defender and attacker lock sabers // *defender's parry should hold and attack bounces (or deflects, based on angle of sabers) @@ -5858,8 +6656,8 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) { entAttacking = qtrue; } - else if (entPowerLevel > FORCE_LEVEL_2) - {//stronger styles count as attacking even if in a transition + else if (PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) > FORCE_LEVEL_3) + {//now it checks specifically for style, and only strong, staff, and desann styles get this, before it only looked at ent's strength if (PM_SaberInTransitionAny(ent->client->ps.saberMove)) { entAttacking = qtrue; @@ -5871,26 +6669,25 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) entDefending = qtrue; } - if (ent->client->ps.torsoAnim == BOTH_A1_SPECIAL - || ent->client->ps.torsoAnim == BOTH_A2_SPECIAL - || ent->client->ps.torsoAnim == BOTH_A3_SPECIAL) + /*if (ent->client->ps.torsoAnim == BOTH_A1_SPECIAL + || ent->client->ps.torsoAnim == BOTH_A2_SPECIAL + || ent->client->ps.torsoAnim == BOTH_A3_SPECIAL) {//parry/block/break-parry bonus for single-style kata moves - entPowerLevel++; - } - if (entAttacking) + entPowerLevel += 2; + }*/ + if (entAttacking) //I'm removing all two-handed power bonuses, now it's purely for force power stuff - Dusty {//add twoHanded bonus and breakParryBonus to entPowerLevel here //This makes staff too powerful - if ((ent->client->ps.saber[saberNum].saberFlags&SFL_TWO_HANDED)) + /*if ((ent->client->ps.saber[saberNum].saberFlags&SFL_TWO_HANDED)) { - entPowerLevel++; - } + entPowerLevel++; + }*/ //FIXME: what if dualSabers && both sabers are hitting at same time? if (!WP_SaberBladeUseSecondBladeStyle(&ent->client->ps.saber[saberNum], bladeNum)) { entPowerLevel += ent->client->ps.saber[saberNum].breakParryBonus; - if (ent->s.number < MAX_CLIENTS) - {//player + if (ent->s.number < MAX_CLIENTS) {//player entPowerLevel += g_char_breakParryBonus->integer; } } @@ -5898,24 +6695,22 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) { entPowerLevel += ent->client->ps.saber[saberNum].breakParryBonus2; - if (ent->s.number < MAX_CLIENTS) - {//player + if (ent->s.number < MAX_CLIENTS) {//player entPowerLevel += g_char_breakParryBonus->integer; } } } else if (entDefending) {//add twoHanded bonus and dualSaber bonus and parryBonus to entPowerLevel here - if ((ent->client->ps.saber[saberNum].saberFlags&SFL_TWO_HANDED) - || (ent->client->ps.dualSabers && ent->client->ps.saber[1].Active())) + /*if ((ent->client->ps.saber[saberNum].saberFlags&SFL_TWO_HANDED) + || (ent->client->ps.dualSabers && ent->client->ps.saber[1].Active())) { - entPowerLevel++; - } + entPowerLevel++; + }*/ //FIXME: what about second saber if dualSabers? entPowerLevel += ent->client->ps.saber[saberNum].parryBonus; - if (ent->s.number < MAX_CLIENTS) - {//player + if (ent->s.number < MAX_CLIENTS) {//player entPowerLevel += g_char_parryBonus->integer; } } @@ -5937,52 +6732,54 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) hitOwnerDefending = qtrue; } - if (hitOwner->client->ps.torsoAnim == BOTH_A1_SPECIAL - || hitOwner->client->ps.torsoAnim == BOTH_A2_SPECIAL - || hitOwner->client->ps.torsoAnim == BOTH_A3_SPECIAL) + /*if (hitOwner->client->ps.torsoAnim == BOTH_A1_SPECIAL + || hitOwner->client->ps.torsoAnim == BOTH_A2_SPECIAL + || hitOwner->client->ps.torsoAnim == BOTH_A3_SPECIAL) {//parry/block/break-parry bonus for single-style kata moves - hitOwnerPowerLevel++; - } + hitOwnerPowerLevel += 2; + }*/ if (hitOwnerAttacking) {//add twoHanded bonus and breakParryBonus to entPowerLevel here - if ((hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED)) + /*if ((hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED)) { - hitOwnerPowerLevel++; - } - + hitOwnerPowerLevel++; + }*/ hitOwnerPowerLevel += hitOwner->client->ps.saber[0].breakParryBonus; - - if (hitOwner->s.number < MAX_CLIENTS) - {//player + + if (hitOwner->s.number < MAX_CLIENTS) {//player hitOwnerPowerLevel += g_char_breakParryBonus->integer; } if (hitOwner->client->ps.dualSabers && Q_irand(0, 1)) {//FIXME: assumes both sabers are hitting at same time...? + //what the heck is this extra 1 for?! - Dusty hitOwnerPowerLevel += 1 + hitOwner->client->ps.saber[1].breakParryBonus; } } else if (hitOwnerDefending) {//add twoHanded bonus and dualSaber bonus and parryBonus to entPowerLevel here - if ((hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED) - || (hitOwner->client->ps.dualSabers && hitOwner->client->ps.saber[1].Active())) + /*if ((hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED) + || (hitOwner->client->ps.dualSabers && hitOwner->client->ps.saber[1].Active())) { - hitOwnerPowerLevel++; - } - + hitOwnerPowerLevel++; + }*/ hitOwnerPowerLevel += hitOwner->client->ps.saber[0].parryBonus; - if (hitOwner->s.number < MAX_CLIENTS) - {//player + if (hitOwner->s.number < MAX_CLIENTS) {//player hitOwnerPowerLevel += g_char_parryBonus->integer; } if (hitOwner->client->ps.dualSabers && Q_irand(0, 1)) {//FIXME: assumes both sabers are defending at same time...? + //what the heck is this extra 1 for?! - Dusty hitOwnerPowerLevel += 1 + hitOwner->client->ps.saber[1].parryBonus; } } + int entAnimLevel = PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum); + int hitOwnerAnimLevel = PM_PowerLevelForSaberAnim(&hitOwner->client->ps, saberNum); + + //Saber Locks if (PM_SuperBreakLoseAnim(ent->client->ps.torsoAnim) || PM_SuperBreakWinAnim(ent->client->ps.torsoAnim) || PM_SuperBreakLoseAnim(hitOwner->client->ps.torsoAnim) @@ -5995,11 +6792,11 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) && !Q_irand(0, g_saberLockRandomNess->integer) && (g_debugSaberLock->integer || forceLock || entPowerLevel == hitOwnerPowerLevel - || (entPowerLevel > FORCE_LEVEL_2 && hitOwnerPowerLevel > FORCE_LEVEL_2) - || (entPowerLevel < FORCE_LEVEL_3 && hitOwnerPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && Q_irand(0, 3)) - || (entPowerLevel < FORCE_LEVEL_2 && hitOwnerPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && Q_irand(0, 2)) - || (hitOwnerPowerLevel < FORCE_LEVEL_3 && entPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && !Q_irand(0, 1)) - || (hitOwnerPowerLevel < FORCE_LEVEL_2 && entPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && !Q_irand(0, 1))) + || (entAnimLevel > FORCE_LEVEL_4 && hitOwnerAnimLevel > FORCE_LEVEL_4 && abs(entPowerLevel - hitOwnerPowerLevel) < 2) + || (entAnimLevel < FORCE_LEVEL_5 && hitOwnerAnimLevel < FORCE_LEVEL_5 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && Q_irand(0, 3)) + || (entAnimLevel < FORCE_LEVEL_3 && hitOwnerAnimLevel < FORCE_LEVEL_5 && hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && Q_irand(0, 2)) + || (hitOwnerAnimLevel < FORCE_LEVEL_5 && entAnimLevel < FORCE_LEVEL_5 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_2 && !Q_irand(0, 1)) + || (hitOwnerAnimLevel < FORCE_LEVEL_3 && entAnimLevel < FORCE_LEVEL_5 && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] > FORCE_LEVEL_1 && !Q_irand(0, 1))) && WP_SabersCheckLock(ent, hitOwner)) { collisionResolved = qtrue; @@ -6008,10 +6805,10 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) && entDefending && !Q_irand(0, g_saberLockRandomNess->integer * 3) && (g_debugSaberLock->integer || forceLock || - ((ent->client->ps.saberMove != LS_READY || (hitOwnerPowerLevel - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand(-6, 0)) - && ((hitOwnerPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) || - (hitOwnerPowerLevel < FORCE_LEVEL_2 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) || - (hitOwnerPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (hitOwnerPowerLevel - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) + ((ent->client->ps.saberMove != LS_READY || ((hitOwnerPowerLevel / 2) - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand(-6, 0)) + && ((hitOwnerAnimLevel < FORCE_LEVEL_5 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) || + (hitOwnerPowerLevel < FORCE_LEVEL_3 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) || + (hitOwnerPowerLevel < FORCE_LEVEL_5 && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, ((hitOwnerPowerLevel / 2) - ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) && WP_SabersCheckLock(hitOwner, ent)) { collisionResolved = qtrue; @@ -6022,29 +6819,38 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) if (!Q_irand(0, g_saberLockRandomNess->integer * 3) && activeDefense && (g_debugSaberLock->integer || forceLock || - ((hitOwner->client->ps.saberMove != LS_READY || (entPowerLevel - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand(-6, 0)) - && ((entPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) - || (entPowerLevel < FORCE_LEVEL_2 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) - || (entPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, (entPowerLevel - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) + ((hitOwner->client->ps.saberMove != LS_READY || ((entPowerLevel / 2) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) < Q_irand(-6, 0)) + && ((entAnimLevel < FORCE_LEVEL_5 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_2) + || (entPowerLevel < FORCE_LEVEL_3 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_1) + || (entPowerLevel < FORCE_LEVEL_5 && hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] > FORCE_LEVEL_0 && !Q_irand(0, ((entPowerLevel / 2) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] + 1) * 2))))) && WP_SabersCheckLock(ent, hitOwner)) { collisionResolved = qtrue; } + //Ended up not Saber Locking else if (saberHitFraction < 1.0f) {//an actual collision - if (entPowerLevel < FORCE_LEVEL_3 && activeDefense) - {//strong attacks cannot be deflected + if ((hitOwner->breakCounter <= hitOwner->breakLimit) && activeDefense) + {//tired defenders cannot deflect //based on angle of attack & angle of defensive saber, see if I should deflect off in another dir rather than bounce back deflected = WP_GetSaberDeflectionAngle(ent, hitOwner); //just so Jedi knows that he was blocked ent->client->ps.saberEventFlags |= SEF_BLOCKED; } + if (entPowerLevel > hitOwnerPowerLevel) + { //if the attack was strong add to the stagger/break counter here + if (!PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) + { //special attacks just break, no counters + hitOwner->breakCounter += (entPowerLevel - hitOwnerPowerLevel); + hitOwner->breakRecoveryTime = level.time + HITOWNER_RECOVERY_INTERVAL; + } + } //base parry breaks on animation (saber attack level), not FP_SABER_OFFENSE - if (entPowerLevel < FORCE_LEVEL_3 + if (entPowerLevel < hitOwnerPowerLevel //&& ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] < FORCE_LEVEL_3//if you have high saber offense, you cannot have your attack knocked away, regardless of what style you're using? //&& hitOwner->client->ps.saberAnimLevel != FORCE_LEVEL_5 && activeDefense - && (hitOwnerPowerLevel > FORCE_LEVEL_2 || (hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]>FORCE_LEVEL_2&&Q_irand(0, hitOwner->client->ps.forcePowerLevel[FP_SABER_OFFENSE])))) + && (hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] >= FORCE_LEVEL_3 || (hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]>FORCE_LEVEL_1&&Q_irand(0, 1)))) // 50% chance for knockaway with saber defense 2 {//knockaways can make fast-attacker go into a broken parry anim if the ent is using fast or med (but not Tavion) //make me parry WP_SaberParry(hitOwner, ent, saberNum, bladeNum); @@ -6056,7 +6862,8 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) if (saberNum == 0) {//FIXME: can only lose right-hand saber for now if (!(ent->client->ps.saber[saberNum].saberFlags&SFL_NOT_DISARMABLE) - && ent->client->ps.forcePowerLevel[FP_SABER_DEFENSE] < FORCE_LEVEL_2 + && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] < FORCE_LEVEL_2 + //^changed DEFENSE to OFFENSE //&& (ent->s.number||g_saberRealisticCombat->integer) && Q_irand(0, hitOwner->client->ps.SaberDisarmBonus(0)) > 0 && (hitOwner->s.number || g_saberAutoBlocking->integer || !Q_irand(0, 2)))//if player defending and autoblocking is on, this is less likely to happen, so don't do the random check @@ -6079,13 +6886,18 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) } #endif } - else if (!activeDefense//they're not defending - || (entPowerLevel > FORCE_LEVEL_2 //I hit hard - && hitOwnerPowerLevel < entPowerLevel)//they are defending, but their defense strength is lower than my attack... - || (!deflected && Q_irand(0, Q_max(0, PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE])/*PM_PowerLevelForSaberAnim( &hitOwner->client->ps )*/) > 0)) + else if (!activeDefense//they're not defending i.e. not holding +block with auto-blocking turned off? + || (hitOwner->breakCounter > hitOwner->breakLimit //too tired to defend strong attacks + && hitOwnerPowerLevel < entPowerLevel) + || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim))//they are defending, but their defense strength is lower than my attack... + //or they are doing a special which has slightly + //different rules + /*|| (!deflected && Q_irand(0, Q_max(0, PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]PM_PowerLevelForSaberAnim( &hitOwner->client->ps ))) > 0))*/ + //^um what does that do anyway? Just add randomness? + //^Fixed per latest OpenJK update not to divide by zero incase want to uncomment {//broke their parry altogether - if (entPowerLevel > FORCE_LEVEL_2 || Q_irand(0, Q_max(0, ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]))) - {//chance of continuing with the attack (not bouncing back) + if (ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] >= 3 || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) + {//saber offense 3 (and up?) gets to continue completely uninterrupted after breaking their guard ent->client->ps.saberEventFlags &= ~SEF_BLOCKED; ent->client->ps.saberBounceMove = LS_NONE; brokenParry = qtrue; @@ -6103,8 +6915,9 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) vec3_t throwDir; PM_VelocityForSaberMove(&ent->client->ps, throwDir); WP_SaberLose(hitOwner, throwDir); - if ((ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0, 3)) - || (ent->client->ps.saberAnimLevel == SS_DESANN&&!Q_irand(0, 1))) + if ((ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0, 5)) + //|| (ent->client->ps.saberAnimLevel == SS_DESANN && !Q_irand(0, 6) + || (ent->client->ps.saberAnimLevel == SS_DESANN && ent->client->NPC_class == CLASS_DESANN && !Q_irand(0, 3))) {// a strong attack if (WP_BrokenParryKnockDown(hitOwner)) { @@ -6116,7 +6929,7 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) else { if ((ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0, 5)) - || (ent->client->ps.saberAnimLevel == SS_DESANN&&!Q_irand(0, 3))) + || (ent->client->ps.saberAnimLevel == SS_DESANN && ent->client->NPC_class == CLASS_DESANN && !Q_irand(0, 3))) {// a strong attack if (WP_BrokenParryKnockDown(hitOwner)) { @@ -6150,16 +6963,19 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) //turn the parry into a knockaway hitOwner->client->ps.saberBounceMove = PM_KnockawayForParry(hitOwner->client->ps.saberBlocked); } - else if ((ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0, 6)) - || (ent->client->ps.saberAnimLevel == SS_DESANN && !Q_irand(0, 3))) - {// a strong attack can sometimes do a knockdown - //HMM... maybe only if they're moving backwards? - if (WP_BrokenParryKnockDown(hitOwner)) - { - hitOwner->client->ps.saberBlocked = BLOCKED_NONE; - hitOwner->client->ps.saberBounceMove = LS_NONE; + else + { + if ((ent->client->ps.saberAnimLevel == SS_STRONG && !Q_irand(0, 6)) + || (ent->client->ps.saberAnimLevel == SS_DESANN && ent->client->NPC_class == CLASS_DESANN && !Q_irand(0, 3))) + {// a strong attack can sometimes do a knockdown + //HMM... maybe only if they're moving backwards? + if (WP_BrokenParryKnockDown(hitOwner)) + { + hitOwner->client->ps.saberBlocked = BLOCKED_NONE; + hitOwner->client->ps.saberBounceMove = LS_NONE; + } } - } + } } collisionResolved = qtrue; } @@ -6227,7 +7043,9 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) if (PM_SaberInAttack(ent->client->ps.saberMove) || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim) || (entPowerLevel > FORCE_LEVEL_2&&!PM_SaberInIdle(ent->client->ps.saberMove) && !PM_SaberInParry(ent->client->ps.saberMove) && !PM_SaberInReflect(ent->client->ps.saberMove))) {//in the middle of attacking - if (entPowerLevel < FORCE_LEVEL_3 && hitOwner->health > 0) + if ((ent->client->ps.saberAnimLevel == SS_STRONG + || ent->client->ps.saberAnimLevel == SS_DESANN) + && hitOwner->health > 0) {//don't deflect/bounce in strong attack or when enemy is dead WP_GetSaberDeflectionAngle(ent, hitOwner); ent->client->ps.saberEventFlags |= SEF_BLOCKED; @@ -6314,7 +7132,6 @@ void WP_SaberDamageTrace(gentity_t *ent, int saberNum, int bladeNum) } */ } - } //old code end if (saberHitFraction < 1.0f || collisionResolved) @@ -6549,7 +7366,15 @@ void WP_SabersDamageTrace(gentity_t *ent, qboolean noEffects) { g_noClashFlare = qtrue; } - WP_SaberDamageTrace(ent, 0, i); + + if (g_saberNewCombat->integer) + { + WP_SaberDamageTraceNew(ent, 0, i); + } + else + { + WP_SaberDamageTrace(ent, 0, i); + } } // Saber 2. g_saberNoEffects = noEffects; @@ -6576,7 +7401,15 @@ void WP_SabersDamageTrace(gentity_t *ent, qboolean noEffects) { g_noClashFlare = qtrue; } - WP_SaberDamageTrace(ent, 1, i); + + if (g_saberNewCombat->integer) + { + WP_SaberDamageTraceNew(ent, 1, i); + } + else + { + WP_SaberDamageTrace(ent, 1, i); + } } } g_saberNoEffects = qfalse; @@ -7410,13 +8243,13 @@ qboolean WP_SaberLaunch(gentity_t *self, gentity_t *saber, qboolean thrown, qboo {//FIXME: make a table? default: case FORCE_LEVEL_1: - saber->s.apos.trDelta[1] = 600; + saber->s.apos.trDelta[1] = 800; //600 break; case FORCE_LEVEL_2: - saber->s.apos.trDelta[1] = 800; + saber->s.apos.trDelta[1] = 900; //800 break; case FORCE_LEVEL_3: - saber->s.apos.trDelta[1] = 1200; + saber->s.apos.trDelta[1] = 1200; //1200 break; } @@ -7771,7 +8604,8 @@ void WP_SaberThrow(gentity_t *self, usercmd_t *ucmd) {//don't even have it out return; } - else if ((ucmd->buttons&BUTTON_ALT_ATTACK) && !(self->client->ps.pm_flags&PMF_ALT_ATTACK_HELD)) + else if ((ucmd->buttons&BUTTON_ALT_ATTACK) && !(self->client->ps.pm_flags&PMF_ALT_ATTACK_HELD) + && (self->s.number || ucmd->buttons&BUTTON_FORCE_FOCUS)) {//still holding it, not still holding attack from a previous throw, so throw it. if (!(self->client->ps.saberEventFlags&SEF_INWATER) && WP_SaberLaunch(self, saberent, qtrue)) { @@ -8584,25 +9418,21 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) else if (PM_SaberInReturn(self->client->ps.saberMove)) {//we're in a return, probably triggered after a previous deflection //FIXME: Make sure it's a return from a deflection, not a slash? - if (self->client->ps.saberAnimLevel = 1 || self->client->ps.saberAnimLevel > 3) - { //only Medium and Strong get a break because their return anims take so long + if (self->client->ps.saberAnimLevel == SS_FAST || self->client->ps.saberAnimLevel == SS_TAVION + //|| self->client->ps.saberAnimLevel == SS_DUAL + ) + { //only non-fast deflecting styles get a break return; } - totalReboundTime = parryDebounce[self->client->ps.forcePowerLevel[FP_SABER_DEFENSE]] * 2 * g_spskill->integer; + totalReboundTime = parryDebounce[self->client->ps.forcePowerLevel[FP_SABER_DEFENSE]] * BLOCK_SPEED; baseReboundTime = totalReboundTime; switch (self->client->ps.saberAnimLevel) - { - case SS_FAST: - case SS_TAVION: - case SS_MEDIUM: - case SS_STAFF: - case SS_DUAL: + { case SS_DESANN: - break; case SS_STRONG: - totalReboundTime += 2 * baseReboundTime * g_spskill->integer; + totalReboundTime *= SLOW_BLOCK_FACTOR; break; } @@ -9746,25 +10576,7 @@ void WP_ForceKnockdown(gentity_t *self, gentity_t *pusher, qboolean pull, qboole } else { - if (g_spskill->integer > 1 - && self->NPC->rank >= RANK_ENSIGN - && (self->client->NPC_class == CLASS_REBORN || self->client->NPC_class == CLASS_JEDI)) - {//you must have Jedi reflexes... - if (self->NPC->rank >= RANK_ENSIGN && self->NPC->rank < RANK_LT_COMM) - { - addTime = Q_irand(-400, 200); - } - if (self->NPC->rank >= RANK_LT_COMM) - { - addTime = Q_irand(-600, 0); - } - } - else if (g_spskill->integer > 1 && self->NPC->aiFlags&NPCAI_BOSS_CHARACTER) { - addTime = Q_irand(-600, 0); - } - else { - addTime = Q_irand(-300, 300); - } + addTime = Q_irand(-300, 300); } self->client->ps.legsAnimTimer += addTime; self->client->ps.torsoAnimTimer += addTime; @@ -10097,7 +10909,16 @@ void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) if (self->health <= 0) { return; + }/* + if (!WP_ForcePowerUsable(self, FP_PUSH, 0) && !pull) + {//don't know this power + return; + } + if (!WP_ForcePowerUsable(self, FP_PULL, 0) && pull) + {//don't know this power + return; } + */ if (self->client->ps.leanofs) {//can't force-throw while leaning return; @@ -13827,13 +14648,15 @@ int WP_AbsorbConversion(gentity_t *attacked, int atdAbsLevel, gentity_t *attacke return getLevel; } +extern qboolean PM_WalkingAnim(int anim); +extern qboolean PM_SaberStanceAnim(int anim); void WP_BlockPointsRegenerate(gentity_t *self) { - if (g_saberNewCombat->integer) //FIXME: you must be regening FP to regen block points? + if (g_saberNewCombat->integer) { if (self->breakCounter) //must have block points that need to be regained { - if (level.time >= self->breakRecoveryTime) + if (level.time >= self->breakRecoveryTime /*&& PM_WalkingAnim*/) { self->breakCounter -= 1; self->breakRecoveryTime = level.time + HITOWNER_RECOVERY_INTERVAL; @@ -14143,9 +14966,8 @@ qboolean WP_ForcePowerUsable(gentity_t *self, forcePowers_t forcePower, int over } else { - if ((forcePower == FP_SABERTHROW && self->client->ps.saber[0].saberFlags&SFL_NOT_THROWABLE) - || (forcePower == FP_SABERTHROW && !(self->client->buttons & BUTTON_FORCE_FOCUS))) - {//cannot throw this type of saber or player is in kick mode + if ((forcePower == FP_SABERTHROW && self->client->ps.saber[0].saberFlags&SFL_NOT_THROWABLE)) + {//cannot throw this type of saber return qfalse; } @@ -14554,6 +15376,10 @@ void WP_ForceForceThrow(gentity_t *thrower) { return; } + if (!NPC_JediClass(thrower)) + { + return; + } qboolean removePush = qfalse; qboolean relock = qfalse; if (!(thrower->client->ps.forcePowersKnown&(1 << FP_PUSH))) @@ -14640,36 +15466,69 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ } else if (self->client->ps.forcePowerDebounce[FP_HEAL] < level.time) {//time to heal again - if (WP_ForcePowerAvailable(self, forcePower, 4)) - {//have available power - int healInterval = FP_ForceHealInterval(self); - int healAmount = 1;//hard, normal healing rate - if (self->s.number < MAX_CLIENTS) - { - if (g_spskill->integer == 1) - {//medium, heal twice as fast - healAmount *= 2; + if (g_forceNewPowers) { + if ((WP_ForcePowerAvailable(self, forcePower, 4) && self->client->ps.forcePowerLevel[FP_HEAL] < 2) + || (WP_ForcePowerAvailable(self, forcePower, 3) && self->client->ps.forcePowerLevel[FP_HEAL] >= 2 + && forcePower)) + {//have available power + int healInterval = FP_ForceHealInterval(self); + int healAmount = 1;//hard, normal healing rate + if (self->s.number < MAX_CLIENTS) + { + if (g_spskill->integer == 1) + {//medium, heal twice as fast + healAmount *= 2; + } + else if (g_spskill->integer == 0) + {//easy, heal 3 times as fast... + healAmount *= 3; + } } - else if (g_spskill->integer == 0) - {//easy, heal 3 times as fast... - healAmount *= 3; + if (self->health + healAmount > self->client->ps.stats[STAT_MAX_HEALTH]) + { + healAmount = self->client->ps.stats[STAT_MAX_HEALTH] - self->health; } + self->health += healAmount; + self->client->ps.forceHealCount += healAmount; + self->client->ps.forcePowerDebounce[FP_HEAL] = level.time + healInterval; + WP_ForcePowerDrain(self, forcePower, 4); } - if (self->health + healAmount > self->client->ps.stats[STAT_MAX_HEALTH]) - { - healAmount = self->client->ps.stats[STAT_MAX_HEALTH] - self->health; + else + {//stop + WP_ForcePowerStop(self, forcePower); } - self->health += healAmount; - self->client->ps.forceHealCount += healAmount; - self->client->ps.forcePowerDebounce[FP_HEAL] = level.time + healInterval; - WP_ForcePowerDrain(self, forcePower, 4); } - else - {//stop - WP_ForcePowerStop(self, forcePower); + else { //old heal + if (WP_ForcePowerAvailable(self, forcePower, 4)) + {//have available power + int healInterval = FP_ForceHealInterval(self); + int healAmount = 1;//hard, normal healing rate + if (self->s.number < MAX_CLIENTS) + { + if (g_spskill->integer == 1) + {//medium, heal twice as fast + healAmount *= 2; + } + else if (g_spskill->integer == 0) + {//easy, heal 3 times as fast... + healAmount *= 3; + } + } + if (self->health + healAmount > self->client->ps.stats[STAT_MAX_HEALTH]) + { + healAmount = self->client->ps.stats[STAT_MAX_HEALTH] - self->health; + } + self->health += healAmount; + self->client->ps.forceHealCount += healAmount; + self->client->ps.forcePowerDebounce[FP_HEAL] = level.time + healInterval; + WP_ForcePowerDrain(self, forcePower, 4); + } + else + {//stop + WP_ForcePowerStop(self, forcePower); + } } - } - break; + break; case FP_LEVITATION: if (self->client->ps.groundEntityNum != ENTITYNUM_NONE && !self->client->ps.forceJumpZStart) {//done with jump @@ -14735,7 +15594,7 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ break; case FP_GRIP: if (!WP_ForcePowerAvailable(self, FP_GRIP, 0) - || (self->client->ps.forcePowerLevel[FP_GRIP]>FORCE_LEVEL_1&&!self->s.number&&!(cmd->buttons&BUTTON_FORCEGRIP))) + || (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1&&!self->s.number&&!(cmd->buttons&BUTTON_FORCEGRIP))) { WP_ForcePowerStop(self, FP_GRIP); return; @@ -14753,357 +15612,357 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ //rww - RAGDOLL_BEGIN #ifndef JK2_RAGDOLL_GRIPNOHEALTH //rww - RAGDOLL_END - if (gripEnt->health <= 0 && gripEnt->takedamage)//FIXME: what about things that never had health or lose takedamage when they die? - {//either invalid ent, or dead ent - WP_ForcePowerStop(self, FP_GRIP); - return; - } - else - //rww - RAGDOLL_BEGIN -#endif - //rww - RAGDOLL_END - if (self->client->ps.forcePowerLevel[FP_GRIP] == FORCE_LEVEL_1 - && gripEnt->client - && gripEnt->client->ps.groundEntityNum == ENTITYNUM_NONE - && gripEnt->client->moveType != MT_FLYSWIM) - { - WP_ForcePowerStop(self, FP_GRIP); - return; - } - else if (gripEnt->client && gripEnt->client->moveType == MT_FLYSWIM && VectorLengthSquared(gripEnt->client->ps.velocity) > (300 * 300)) - {//flying creature broke free - WP_ForcePowerStop(self, FP_GRIP); - return; - } - else if (gripEnt->client - && gripEnt->health>0 //dead dudes don't fly - && (gripEnt->client->NPC_class == CLASS_BOBAFETT || gripEnt->client->NPC_class == CLASS_ROCKETTROOPER) - && self->client->ps.forcePowerDebounce[FP_GRIP] < level.time - && !Q_irand(0, 3) - ) - {//boba fett - fly away! - gripEnt->client->ps.forceJumpCharge = 0;//so we don't play the force flip anim - gripEnt->client->ps.velocity[2] = 250; - gripEnt->client->ps.forceJumpZStart = gripEnt->currentOrigin[2];//so we don't take damage if we land at same height - gripEnt->client->ps.pm_flags |= PMF_JUMPING; - G_AddEvent(gripEnt, EV_JUMP, 0); - JET_FlyStart(gripEnt); - WP_ForcePowerStop(self, FP_GRIP); - return; - } - else if (gripEnt->NPC - && gripEnt->client - && gripEnt->client->ps.forcePowersKnown - && (gripEnt->client->NPC_class == CLASS_REBORN || gripEnt->client->ps.weapon == WP_SABER) - && !Jedi_CultistDestroyer(gripEnt) - && !Q_irand(0, 100 - (gripEnt->NPC->stats.evasion * 8) - (g_spskill->integer * 20))) - {//a jedi who broke free FIXME: maybe have some minimum grip length- a reaction time? - WP_ForceForceThrow(gripEnt); - - if (gripEnt->NPC->rank >= RANK_COMMANDER //saber reactivation AI here. - || (gripEnt->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) - { //tough guys reactivate their saber faster after being gripped - gripEnt->saberReactivateTime = 0; - } - else //if (gripEnt->NPC->rank >= RANK_LT_COMM) - { //weaker/less skilled guys are stunned after a grip for longer - gripEnt->saberReactivateTime = level.time + 1000; - } - /*else - { - gripEnt->saberReactivateTime = level.time + (2000 + Q_irand(0, 1000)); - }*/ - - //FIXME: I need to go into some pushed back anim... - WP_ForcePowerStop(self, FP_GRIP); - return; - } - else if (PM_SaberInAttack(self->client->ps.saberMove) - || PM_SaberInStart(self->client->ps.saberMove)) - {//started an attack - WP_ForcePowerStop(self, FP_GRIP); - return; - } - else - { - int gripLevel = self->client->ps.forcePowerLevel[FP_GRIP]; - if (gripEnt->client) - { - gripLevel = WP_AbsorbConversion(gripEnt, gripEnt->client->ps.forcePowerLevel[FP_ABSORB], self, FP_GRIP, self->client->ps.forcePowerLevel[FP_GRIP], forcePowerNeeded[gripLevel]); - } - if (!gripLevel) - { - WP_ForcePowerStop(self, forcePower); - return; - } - - if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) - {//holding it - NPC_SetAnim(self, SETANIM_TORSO, BOTH_FORCEGRIP_HOLD, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); - if (self->client->ps.torsoAnimTimer < 100){//we were already playing this anim, we didn't want to restart it, but we want to hold it for at least 100ms, sooo.... - - self->client->ps.torsoAnimTimer = 100; - } - } - //get their org - VectorCopy(self->client->ps.viewangles, angles); - angles[0] -= 10; - AngleVectors(angles, dir, NULL, NULL); - if (gripEnt->client) - {//move - VectorCopy(gripEnt->client->renderInfo.headPoint, gripEntOrg); - } - else - { - VectorCopy(gripEnt->currentOrigin, gripEntOrg); - } - - //how far are they - dist = Distance(self->client->renderInfo.handLPoint, gripEntOrg); - if (self->client->ps.forcePowerLevel[FP_GRIP] == FORCE_LEVEL_2 && - (!InFront(gripEntOrg, self->client->renderInfo.handLPoint, self->client->ps.viewangles, 0.3f) || - DistanceSquared(gripEntOrg, self->client->renderInfo.handLPoint) > FORCE_GRIP_DIST_SQUARED)) - {//must face them + if (gripEnt->health <= 0 && gripEnt->takedamage)//FIXME: what about things that never had health or lose takedamage when they die? + {//either invalid ent, or dead ent WP_ForcePowerStop(self, FP_GRIP); return; } - - //check for lift or carry - if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2 - && (!gripEnt->client || (!gripEnt->message&&!(gripEnt->flags&FL_NO_KNOCKBACK)))) - {//carry - //cap dist - if (dist > FORCE_GRIP_3_MAX_DIST) + else + //rww - RAGDOLL_BEGIN +#endif + //rww - RAGDOLL_END + if (self->client->ps.forcePowerLevel[FP_GRIP] == FORCE_LEVEL_1 + && gripEnt->client + && gripEnt->client->ps.groundEntityNum == ENTITYNUM_NONE + && gripEnt->client->moveType != MT_FLYSWIM) { - dist = FORCE_GRIP_3_MAX_DIST; + WP_ForcePowerStop(self, FP_GRIP); + return; } - else if (dist < FORCE_GRIP_3_MIN_DIST) - { - dist = FORCE_GRIP_3_MIN_DIST; + else if (gripEnt->client && gripEnt->client->moveType == MT_FLYSWIM && VectorLengthSquared(gripEnt->client->ps.velocity) > (300 * 300)) + {//flying creature broke free + WP_ForcePowerStop(self, FP_GRIP); + return; } - VectorMA(self->client->renderInfo.handLPoint, dist, dir, gripOrg); - } - else if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) - {//just lift - VectorCopy(self->client->ps.forceGripOrg, gripOrg); - } - else - { - VectorCopy(gripEnt->currentOrigin, gripOrg); - } - if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) - {//if holding him, make sure there's a clear LOS between my hand and him - trace_t gripTrace; - gi.trace(&gripTrace, self->client->renderInfo.handLPoint, NULL, NULL, gripEntOrg, ENTITYNUM_NONE, MASK_FORCE_PUSH, (EG2_Collision)0, 0); - if (gripTrace.startsolid - || gripTrace.allsolid - || gripTrace.fraction < 1.0f) - {//no clear trace, drop them + else if (gripEnt->client + && gripEnt->health > 0 //dead dudes don't fly + && (gripEnt->client->NPC_class == CLASS_BOBAFETT || gripEnt->client->NPC_class == CLASS_ROCKETTROOPER) + && self->client->ps.forcePowerDebounce[FP_GRIP] < level.time + && !Q_irand(0, 3) + ) + {//boba fett - fly away! + gripEnt->client->ps.forceJumpCharge = 0;//so we don't play the force flip anim + gripEnt->client->ps.velocity[2] = 250; + gripEnt->client->ps.forceJumpZStart = gripEnt->currentOrigin[2];//so we don't take damage if we land at same height + gripEnt->client->ps.pm_flags |= PMF_JUMPING; + G_AddEvent(gripEnt, EV_JUMP, 0); + JET_FlyStart(gripEnt); WP_ForcePowerStop(self, FP_GRIP); return; } - } - //now move them - if (gripEnt->client) - { - if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) - {//level 1 just holds them - VectorSubtract(gripOrg, gripEntOrg, gripEnt->client->ps.velocity); + else if (gripEnt->NPC + && gripEnt->client + && gripEnt->client->ps.forcePowersKnown + && (gripEnt->client->NPC_class == CLASS_REBORN || gripEnt->client->ps.weapon == WP_SABER) + && !Jedi_CultistDestroyer(gripEnt) + && !Q_irand(0, 100 - (gripEnt->NPC->stats.evasion * 8) - (g_spskill->integer * 20))) + {//a jedi who broke free FIXME: maybe have some minimum grip length- a reaction time? + WP_ForceForceThrow(gripEnt); + + if (gripEnt->NPC->rank >= RANK_COMMANDER //saber reactivation AI here. + || (gripEnt->NPC->aiFlags&NPCAI_BOSS_CHARACTER)) + { //tough guys reactivate their saber faster after being gripped + gripEnt->saberReactivateTime = level.time; + } + else //if (gripEnt->NPC->rank >= RANK_LT_COMM) + { //weaker/less skilled guys are stunned after a grip for longer + gripEnt->saberReactivateTime = level.time + 500; + } + /*else + { + gripEnt->saberReactivateTime = level.time + (2000 + Q_irand(0, 1000)); + }*/ + + //FIXME: I need to go into some pushed back anim... + WP_ForcePowerStop(self, FP_GRIP); + return; + } + else if (PM_SaberInAttack(self->client->ps.saberMove) + || PM_SaberInStart(self->client->ps.saberMove)) + {//started an attack + WP_ForcePowerStop(self, FP_GRIP); + return; + } + else + { + int gripLevel = self->client->ps.forcePowerLevel[FP_GRIP]; + if (gripEnt->client) + { + gripLevel = WP_AbsorbConversion(gripEnt, gripEnt->client->ps.forcePowerLevel[FP_ABSORB], self, FP_GRIP, self->client->ps.forcePowerLevel[FP_GRIP], forcePowerNeeded[gripLevel]); + } + if (!gripLevel) + { + WP_ForcePowerStop(self, forcePower); + return; + } + + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) + {//holding it + NPC_SetAnim(self, SETANIM_TORSO, BOTH_FORCEGRIP_HOLD, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + if (self->client->ps.torsoAnimTimer < 100){//we were already playing this anim, we didn't want to restart it, but we want to hold it for at least 100ms, sooo.... + + self->client->ps.torsoAnimTimer = 100; + } + } + //get their org + VectorCopy(self->client->ps.viewangles, angles); + angles[0] -= 10; + AngleVectors(angles, dir, NULL, NULL); + if (gripEnt->client) + {//move + VectorCopy(gripEnt->client->renderInfo.headPoint, gripEntOrg); + } + else + { + VectorCopy(gripEnt->currentOrigin, gripEntOrg); + } + + //how far are they + dist = Distance(self->client->renderInfo.handLPoint, gripEntOrg); + if (self->client->ps.forcePowerLevel[FP_GRIP] == FORCE_LEVEL_2 && + (!InFront(gripEntOrg, self->client->renderInfo.handLPoint, self->client->ps.viewangles, 0.3f) || + DistanceSquared(gripEntOrg, self->client->renderInfo.handLPoint) > FORCE_GRIP_DIST_SQUARED)) + {//must face them + WP_ForcePowerStop(self, FP_GRIP); + return; + } + + //check for lift or carry if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2 && (!gripEnt->client || (!gripEnt->message&&!(gripEnt->flags&FL_NO_KNOCKBACK)))) - {//level 2 just lifts them - float gripDist = VectorNormalize(gripEnt->client->ps.velocity) / 3.0f; - if (gripDist < 20.0f) + {//carry + //cap dist + if (dist > FORCE_GRIP_3_MAX_DIST) { - if (gripDist<2.0f) - { - VectorClear(gripEnt->client->ps.velocity); - } - else - { - VectorScale(gripEnt->client->ps.velocity, (gripDist*gripDist), gripEnt->client->ps.velocity); - } + dist = FORCE_GRIP_3_MAX_DIST; } - else + else if (dist < FORCE_GRIP_3_MIN_DIST) { - VectorScale(gripEnt->client->ps.velocity, (gripDist*gripDist), gripEnt->client->ps.velocity); + dist = FORCE_GRIP_3_MIN_DIST; } + VectorMA(self->client->renderInfo.handLPoint, dist, dir, gripOrg); } - } - //stop them from thinking - gripEnt->client->ps.pm_time = 2000; - gripEnt->client->ps.pm_flags |= PMF_TIME_KNOCKBACK; - if (gripEnt->NPC) - { - if (!(gripEnt->NPC->aiFlags&NPCAI_DIE_ON_IMPACT)) - {//not falling to their death - gripEnt->NPC->nextBStateThink = level.time + 2000; + else if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) + {//just lift + VectorCopy(self->client->ps.forceGripOrg, gripOrg); + } + else + { + VectorCopy(gripEnt->currentOrigin, gripOrg); } if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) - {//level 1 just holds them - vectoangles(dir, angles); - gripEnt->NPC->desiredYaw = AngleNormalize180(angles[YAW] + 180); - gripEnt->NPC->desiredPitch = -angles[PITCH]; - SaveNPCGlobals(); - SetNPCGlobals(gripEnt); - NPC_UpdateAngles(qtrue, qtrue); - gripEnt->NPC->last_ucmd.angles[0] = ucmd.angles[0]; - gripEnt->NPC->last_ucmd.angles[1] = ucmd.angles[1]; - gripEnt->NPC->last_ucmd.angles[2] = ucmd.angles[2]; - RestoreNPCGlobals(); - //FIXME: why does he turn back to his original angles once he dies or is let go? + {//if holding him, make sure there's a clear LOS between my hand and him + trace_t gripTrace; + gi.trace(&gripTrace, self->client->renderInfo.handLPoint, NULL, NULL, gripEntOrg, ENTITYNUM_NONE, MASK_FORCE_PUSH, (EG2_Collision)0, 0); + if (gripTrace.startsolid + || gripTrace.allsolid + || gripTrace.fraction < 1.0f) + {//no clear trace, drop them + WP_ForcePowerStop(self, FP_GRIP); + return; + } } - } - else if (!gripEnt->s.number) - { - //vectoangles( dir, angles ); - //gripEnt->client->ps.viewangles[0] = -angles[0]; - //gripEnt->client->ps.viewangles[1] = AngleNormalize180(angles[YAW]+180); - gripEnt->enemy = self; - NPC_SetLookTarget(gripEnt, self->s.number, level.time + 1000); - } + //now move them + if (gripEnt->client) + { + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) + {//level 1 just holds them + VectorSubtract(gripOrg, gripEntOrg, gripEnt->client->ps.velocity); + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2 + && (!gripEnt->client || (!gripEnt->message&&!(gripEnt->flags&FL_NO_KNOCKBACK)))) + {//level 2 just lifts them + float gripDist = VectorNormalize(gripEnt->client->ps.velocity) / 3.0f; + if (gripDist < 20.0f) + { + if (gripDist < 2.0f) + { + VectorClear(gripEnt->client->ps.velocity); + } + else + { + VectorScale(gripEnt->client->ps.velocity, (gripDist*gripDist), gripEnt->client->ps.velocity); + } + } + else + { + VectorScale(gripEnt->client->ps.velocity, (gripDist*gripDist), gripEnt->client->ps.velocity); + } + } + } + //stop them from thinking + gripEnt->client->ps.pm_time = 2000; + gripEnt->client->ps.pm_flags |= PMF_TIME_KNOCKBACK; + if (gripEnt->NPC) + { + if (!(gripEnt->NPC->aiFlags&NPCAI_DIE_ON_IMPACT)) + {//not falling to their death + gripEnt->NPC->nextBStateThink = level.time + 2000; + } + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) + {//level 1 just holds them + vectoangles(dir, angles); + gripEnt->NPC->desiredYaw = AngleNormalize180(angles[YAW] + 180); + gripEnt->NPC->desiredPitch = -angles[PITCH]; + SaveNPCGlobals(); + SetNPCGlobals(gripEnt); + NPC_UpdateAngles(qtrue, qtrue); + gripEnt->NPC->last_ucmd.angles[0] = ucmd.angles[0]; + gripEnt->NPC->last_ucmd.angles[1] = ucmd.angles[1]; + gripEnt->NPC->last_ucmd.angles[2] = ucmd.angles[2]; + RestoreNPCGlobals(); + //FIXME: why does he turn back to his original angles once he dies or is let go? + } + } + else if (!gripEnt->s.number) + { + //vectoangles( dir, angles ); + //gripEnt->client->ps.viewangles[0] = -angles[0]; + //gripEnt->client->ps.viewangles[1] = AngleNormalize180(angles[YAW]+180); + gripEnt->enemy = self; + NPC_SetLookTarget(gripEnt, self->s.number, level.time + 1000); + } - gripEnt->client->ps.eFlags |= EF_FORCE_GRIPPED; - //dammit! Make sure that saber stays off! - WP_DeactivateSaber(gripEnt); - } - else - {//move - if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) - {//level 1 just holds them - VectorCopy(gripEnt->currentOrigin, gripEnt->s.pos.trBase); - VectorSubtract(gripOrg, gripEntOrg, gripEnt->s.pos.trDelta); - if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2 - && (!gripEnt->client || (!gripEnt->message&&!(gripEnt->flags&FL_NO_KNOCKBACK)))) - {//level 2 just lifts them - VectorScale(gripEnt->s.pos.trDelta, 10, gripEnt->s.pos.trDelta); + gripEnt->client->ps.eFlags |= EF_FORCE_GRIPPED; + //dammit! Make sure that saber stays off! + WP_DeactivateSaber(gripEnt); } - gripEnt->s.pos.trType = TR_LINEAR; - gripEnt->s.pos.trTime = level.time; - } + else + {//move + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1) + {//level 1 just holds them + VectorCopy(gripEnt->currentOrigin, gripEnt->s.pos.trBase); + VectorSubtract(gripOrg, gripEntOrg, gripEnt->s.pos.trDelta); + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2 + && (!gripEnt->client || (!gripEnt->message&&!(gripEnt->flags&FL_NO_KNOCKBACK)))) + {//level 2 just lifts them + VectorScale(gripEnt->s.pos.trDelta, 10, gripEnt->s.pos.trDelta); + } + gripEnt->s.pos.trType = TR_LINEAR; + gripEnt->s.pos.trTime = level.time; + } - gripEnt->s.eFlags |= EF_FORCE_GRIPPED; - } + gripEnt->s.eFlags |= EF_FORCE_GRIPPED; + } - //Shouldn't this be discovered? - //AddSightEvent( self, gripOrg, 128, AEL_DANGER, 20 ); - AddSightEvent(self, gripOrg, 128, AEL_DISCOVERED, 20); + //Shouldn't this be discovered? + //AddSightEvent( self, gripOrg, 128, AEL_DANGER, 20 ); + AddSightEvent(self, gripOrg, 128, AEL_DISCOVERED, 20); - if (self->client->ps.forcePowerDebounce[FP_GRIP] < level.time) - { - //GEntity_PainFunc( gripEnt, self, self, gripOrg, 0, MOD_CRUSH ); - if (!gripEnt->client - || gripEnt->client->NPC_class != CLASS_VEHICLE - || (gripEnt->m_pVehicle - && gripEnt->m_pVehicle->m_pVehicleInfo - && gripEnt->m_pVehicle->m_pVehicleInfo->type == VH_ANIMAL)) - {//we don't damage the empty vehicle - gripEnt->painDebounceTime = 0; - int gripDmg = forceGripDamage[self->client->ps.forcePowerLevel[FP_GRIP]]; - if (gripLevel != -1) + if (self->client->ps.forcePowerDebounce[FP_GRIP] < level.time) { - if (gripLevel == 1) - { - gripDmg = floor((float)gripDmg / 3.0f); + //GEntity_PainFunc( gripEnt, self, self, gripOrg, 0, MOD_CRUSH ); + if (!gripEnt->client + || gripEnt->client->NPC_class != CLASS_VEHICLE + || (gripEnt->m_pVehicle + && gripEnt->m_pVehicle->m_pVehicleInfo + && gripEnt->m_pVehicle->m_pVehicleInfo->type == VH_ANIMAL)) + {//we don't damage the empty vehicle + gripEnt->painDebounceTime = 0; + int gripDmg = forceGripDamage[self->client->ps.forcePowerLevel[FP_GRIP]]; + if (gripLevel != -1) + { + if (gripLevel == 1) + { + gripDmg = floor((float)gripDmg / 3.0f); + } + else //if ( gripLevel == 2 ) + { + gripDmg = floor((float)gripDmg / 1.5f); + } + } + G_Damage(gripEnt, self, self, dir, gripOrg, gripDmg, DAMAGE_NO_ARMOR, MOD_CRUSH);//MOD_??? } - else //if ( gripLevel == 2 ) + if (gripEnt->s.number) { - gripDmg = floor((float)gripDmg / 1.5f); + if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2) + {//do damage faster at level 3 + self->client->ps.forcePowerDebounce[FP_GRIP] = level.time + Q_irand(150, 750); + } + else + { + self->client->ps.forcePowerDebounce[FP_GRIP] = level.time + Q_irand(250, 1000); + } + } + else + {//player takes damage faster + self->client->ps.forcePowerDebounce[FP_GRIP] = level.time + Q_irand(100, 600); + } + if (forceGripDamage[self->client->ps.forcePowerLevel[FP_GRIP]] > 0) + {//no damage at level 1 + WP_ForcePowerDrain(self, FP_GRIP, 3); + } + if (self->client->NPC_class == CLASS_KYLE + && (self->spawnflags & 1)) + {//"Boss" Kyle + if (gripEnt->client) + { + if (!Q_irand(0, 2)) + {//toss him aside! + vec3_t vRt; + AngleVectors(self->currentAngles, NULL, vRt, NULL); + //stop gripping + TIMER_Set(self, "gripping", -level.time); + WP_ForcePowerStop(self, FP_GRIP); + //now toss him + if (Q_irand(0, 1)) + {//throw him to my left + NPC_SetAnim(self, SETANIM_BOTH, BOTH_TOSS1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + VectorScale(vRt, -1500.0f, gripEnt->client->ps.velocity); + G_Knockdown(gripEnt, self, vRt, 500, qfalse); + } + else + {//throw him to my right + NPC_SetAnim(self, SETANIM_BOTH, BOTH_TOSS2, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + VectorScale(vRt, 1500.0f, gripEnt->client->ps.velocity); + G_Knockdown(gripEnt, self, vRt, 500, qfalse); + } + //don't do anything for a couple seconds + self->client->ps.weaponTime = self->client->ps.torsoAnimTimer + 2000; + self->painDebounceTime = level.time + self->client->ps.weaponTime; + //stop moving + VectorClear(self->client->ps.velocity); + VectorClear(self->client->ps.moveDir); + return; + } + } } - } - G_Damage(gripEnt, self, self, dir, gripOrg, gripDmg, DAMAGE_NO_ARMOR, MOD_CRUSH);//MOD_??? - } - if (gripEnt->s.number) - { - if (self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2) - {//do damage faster at level 3 - self->client->ps.forcePowerDebounce[FP_GRIP] = level.time + Q_irand(150, 750); } else { - self->client->ps.forcePowerDebounce[FP_GRIP] = level.time + Q_irand(250, 1000); - } - } - else - {//player takes damage faster - self->client->ps.forcePowerDebounce[FP_GRIP] = level.time + Q_irand(100, 600); - } - if (forceGripDamage[self->client->ps.forcePowerLevel[FP_GRIP]] > 0) - {//no damage at level 1 - WP_ForcePowerDrain(self, FP_GRIP, 3); - } - if (self->client->NPC_class == CLASS_KYLE - && (self->spawnflags & 1)) - {//"Boss" Kyle - if (gripEnt->client) - { - if (!Q_irand(0, 2)) - {//toss him aside! - vec3_t vRt; - AngleVectors(self->currentAngles, NULL, vRt, NULL); - //stop gripping - TIMER_Set(self, "gripping", -level.time); - WP_ForcePowerStop(self, FP_GRIP); - //now toss him - if (Q_irand(0, 1)) - {//throw him to my left - NPC_SetAnim(self, SETANIM_BOTH, BOTH_TOSS1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); - VectorScale(vRt, -1500.0f, gripEnt->client->ps.velocity); - G_Knockdown(gripEnt, self, vRt, 500, qfalse); + //WP_ForcePowerDrain( self, FP_GRIP, 0 ); + if (!gripEnt->enemy) + { + if (gripEnt->client + && gripEnt->client->playerTeam == TEAM_PLAYER + && self->s.number < MAX_CLIENTS + && self->client + && self->client->playerTeam == TEAM_PLAYER) + {//this shouldn't make allies instantly turn on you, let the damage->pain routine determine how allies should react to this } else - {//throw him to my right - NPC_SetAnim(self, SETANIM_BOTH, BOTH_TOSS2, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); - VectorScale(vRt, 1500.0f, gripEnt->client->ps.velocity); - G_Knockdown(gripEnt, self, vRt, 500, qfalse); + { + G_SetEnemy(gripEnt, self); } - //don't do anything for a couple seconds - self->client->ps.weaponTime = self->client->ps.torsoAnimTimer + 2000; - self->painDebounceTime = level.time + self->client->ps.weaponTime; - //stop moving - VectorClear(self->client->ps.velocity); - VectorClear(self->client->ps.moveDir); - return; } } - } - } - else - { - //WP_ForcePowerDrain( self, FP_GRIP, 0 ); - if (!gripEnt->enemy) - { - if (gripEnt->client - && gripEnt->client->playerTeam == TEAM_PLAYER - && self->s.number < MAX_CLIENTS - && self->client - && self->client->playerTeam == TEAM_PLAYER) - {//this shouldn't make allies instantly turn on you, let the damage->pain routine determine how allies should react to this - } - else + if (gripEnt->client && gripEnt->health > 0) { - G_SetEnemy(gripEnt, self); + int anim = BOTH_CHOKE3; //left-handed choke + if (gripEnt->client->ps.weapon == WP_NONE || gripEnt->client->ps.weapon == WP_MELEE) + { + anim = BOTH_CHOKE1; //two-handed choke + } + if (self->client->ps.forcePowerLevel[FP_GRIP] < FORCE_LEVEL_2) + {//still on ground, only set anim on torso + NPC_SetAnim(gripEnt, SETANIM_TORSO, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + } + else + {//in air, set on whole body + NPC_SetAnim(gripEnt, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); + } + gripEnt->painDebounceTime = level.time + 2000; } } - } - if (gripEnt->client && gripEnt->health > 0) - { - int anim = BOTH_CHOKE3; //left-handed choke - if (gripEnt->client->ps.weapon == WP_NONE || gripEnt->client->ps.weapon == WP_MELEE) - { - anim = BOTH_CHOKE1; //two-handed choke - } - if (self->client->ps.forcePowerLevel[FP_GRIP] < FORCE_LEVEL_2) - {//still on ground, only set anim on torso - NPC_SetAnim(gripEnt, SETANIM_TORSO, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); - } - else - {//in air, set on whole body - NPC_SetAnim(gripEnt, SETANIM_BOTH, anim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD); - } - gripEnt->painDebounceTime = level.time + 2000; - } - } } break; case FP_LIGHTNING: @@ -15202,10 +16061,10 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ else if (self->client->ps.forceDrainEntityNum >= 0 && self->client->ps.forceDrainEntityNum < ENTITYNUM_WORLD) {//holding someone if (!WP_ForcePowerAvailable(self, FP_DRAIN, 0) - || (self->client->ps.forcePowerLevel[FP_DRAIN]>FORCE_LEVEL_1 + || (self->client->ps.forcePowerLevel[FP_DRAIN] > FORCE_LEVEL_1 && !self->s.number && !(cmd->buttons&BUTTON_FORCE_DRAIN) - && self->client->ps.forcePowerDuration[FP_DRAIN]client->ps.forcePowerDuration[FP_DRAIN] < level.time)) { WP_ForcePowerStop(self, FP_DRAIN); return; @@ -15230,7 +16089,7 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ return; } else if (drainEnt->client - && drainEnt->health>0 //dead dudes don't fly + && drainEnt->health > 0 //dead dudes don't fly && (drainEnt->client->NPC_class == CLASS_BOBAFETT || drainEnt->client->NPC_class == CLASS_ROCKETTROOPER) && self->client->ps.forcePowerDebounce[FP_DRAIN] < level.time && !Q_irand(0, 10)) @@ -15431,6 +16290,7 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ break; default: break; + } } } diff --git a/code/game/wp_saber.h b/code/game/wp_saber.h index 46cbd1ef90..a563f5b544 100644 --- a/code/game/wp_saber.h +++ b/code/game/wp_saber.h @@ -26,7 +26,7 @@ along with this program; if not, see . #include "b_public.h" #define S2_AUTODODGE_FP 50 -#define S3_AUTODODGE_FP 25 +#define S3_AUTODODGE_FP 40 #define S2_DODGE_FP 10 #define S3_DODGE_FP 5 @@ -219,6 +219,9 @@ extern qboolean G_EnoughPowerForSpecialMove( int forcePower, int cost, qboolean extern void G_DrainPowerForSpecialMove( gentity_t *self, forcePowers_t fp, int cost, qboolean kataMove = qfalse ); extern int G_CostForSpecialMove( int cost, qboolean kataMove = qfalse ); extern gentity_t *G_DropSaberItem( const char *saberType, saber_colors_t saberColor, vec3_t saberPos, vec3_t saberVel, vec3_t saberAngles, gentity_t *copySaber = NULL ); +extern qboolean NPC_JediClass(gentity_t *self); +extern qboolean NPC_JediClassNonBoss(gentity_t *self); +extern qboolean NPC_JediClassBoss(gentity_t *self); typedef enum { From f8eeb44943446cb08d1008842c617cd7c6ee0f2b Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Wed, 13 Jan 2016 00:30:39 +0100 Subject: [PATCH 130/445] Fix Q_irand assertion in debug mode Q_irand asserts when min > max --- code/game/AI_Interrogator.cpp | 6 +++--- codeJK2/game/AI_Interrogator.cpp | 6 +++--- codemp/game/NPC_AI_Interrogator.c | 4 ++-- codemp/game/NPC_AI_Jedi.c | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/game/AI_Interrogator.cpp b/code/game/AI_Interrogator.cpp index 6ad508dbc8..0929fdc062 100644 --- a/code/game/AI_Interrogator.cpp +++ b/code/game/AI_Interrogator.cpp @@ -67,8 +67,8 @@ void Interrogator_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacke */ { self->client->moveType = MT_WALK; - self->client->ps.velocity[0] = Q_irand( -10, -20 ); - self->client->ps.velocity[1] = Q_irand( -10, -20 ); + self->client->ps.velocity[0] = Q_irand( -20, -10 ); + self->client->ps.velocity[1] = Q_irand( -20, -10 ); self->client->ps.velocity[2] = -100; } //self->takedamage = qfalse; @@ -471,4 +471,4 @@ void NPC_BSInterrogator_Default( void ) Interrogator_Idle(); } -} \ No newline at end of file +} diff --git a/codeJK2/game/AI_Interrogator.cpp b/codeJK2/game/AI_Interrogator.cpp index a3e311533b..2e1d635cdb 100644 --- a/codeJK2/game/AI_Interrogator.cpp +++ b/codeJK2/game/AI_Interrogator.cpp @@ -69,8 +69,8 @@ void Interrogator_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacke */ { self->NPC->stats.moveType = MT_WALK; - self->client->ps.velocity[0] = Q_irand( -10, -20 ); - self->client->ps.velocity[1] = Q_irand( -10, -20 ); + self->client->ps.velocity[0] = Q_irand( -20, -10 ); + self->client->ps.velocity[1] = Q_irand( -20, -10 ); self->client->ps.velocity[2] = -100; } //self->takedamage = qfalse; @@ -473,4 +473,4 @@ void NPC_BSInterrogator_Default( void ) Interrogator_Idle(); } -} \ No newline at end of file +} diff --git a/codemp/game/NPC_AI_Interrogator.c b/codemp/game/NPC_AI_Interrogator.c index 70eafef463..74040a60dd 100644 --- a/codemp/game/NPC_AI_Interrogator.c +++ b/codemp/game/NPC_AI_Interrogator.c @@ -68,8 +68,8 @@ void Interrogator_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacke */ { self->client->ps.eFlags2 &= ~EF2_FLYING;//moveType = MT_WALK; - self->client->ps.velocity[0] = Q_irand( -10, -20 ); - self->client->ps.velocity[1] = Q_irand( -10, -20 ); + self->client->ps.velocity[0] = Q_irand( -20, -10 ); + self->client->ps.velocity[1] = Q_irand( -20, -10 ); self->client->ps.velocity[2] = -100; } //self->takedamage = qfalse; diff --git a/codemp/game/NPC_AI_Jedi.c b/codemp/game/NPC_AI_Jedi.c index 97a4772100..1fa89d91ca 100644 --- a/codemp/game/NPC_AI_Jedi.c +++ b/codemp/game/NPC_AI_Jedi.c @@ -4026,7 +4026,7 @@ static void Jedi_CombatTimersUpdate( int enemy_dist ) } else if ( NPCS.NPC->client->ps.fd.forceRageRecoveryTime > level.time ) {//recovering - Jedi_Aggression( NPCS.NPC, Q_irand( 0, -2 ) ); + Jedi_Aggression( NPCS.NPC, Q_irand( -2, 0 ) ); } if ( NPCS.NPC->enemy && NPCS.NPC->enemy->client ) { From 23775d67c7a87f8808ae12b5103da2bb3e5d0533 Mon Sep 17 00:00:00 2001 From: dusty22 Date: Tue, 12 Jan 2016 21:24:17 -0500 Subject: [PATCH 131/445] work in progress --- code/game/bg_panimate.cpp | 111 ++++++++++++++-- code/game/bg_pmove.cpp | 8 +- code/game/g_active.cpp | 7 +- code/game/wp_saber.cpp | 266 ++++++++++++++++++++++++-------------- 4 files changed, 281 insertions(+), 111 deletions(-) diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index aa8c443952..9f478e0063 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -2582,18 +2582,110 @@ qboolean PM_SaberKataDone(int curmove = LS_NONE, int newmove = LS_NONE) } } } - else if (g_saberNewCombat->integer) //new code + else {//FIXME: have chainAngle influence fast and medium chains as well? - if ((pm->ps->saberAnimLevel == FORCE_LEVEL_3 || pm->ps->saberAnimLevel == SS_DUAL) + if ((pm->ps->saberAnimLevel == FORCE_LEVEL_2 || pm->ps->saberAnimLevel == SS_DUAL) && pm->ps->saberAttackChainCount > Q_irand(2, 5)) { return qtrue; } } - else //old code + return qfalse; +} + +qboolean PM_SaberKataDoneNew(int curmove = LS_NONE, int newmove = LS_NONE) +{ + if (pm->ps->forceRageRecoveryTime > level.time) + {//rage recovery, only 1 swing at a time (tired) + if (pm->ps->saberAttackChainCount > 0) + {//swung once + return qtrue; + } + else + {//allow one attack + return qfalse; + } + } + else if ((pm->ps->forcePowersActive&(1 << FP_RAGE))) + {//infinite chaining when raged + return qfalse; + } + else if (pm->ps->saber[0].maxChain == -1) + { + return qfalse; + } + else if (pm->ps->saber[0].maxChain != 0) + { + if (pm->ps->saberAttackChainCount >= pm->ps->saber[0].maxChain) + { + return qtrue; + } + else + { + return qfalse; + } + } + + if (pm->ps->saberAnimLevel == SS_DESANN && pm->ps->saberAttackChainCount > Q_irand(2, 4)) + { + return qtrue; + } + + if (pm->ps->saberAnimLevel == SS_TAVION && pm->ps->saberAttackChainCount > Q_irand(2, 5)) + {//desann and tavion can link up as many attacks as they want + return qtrue; + } + //FIXME: instead of random, apply some sort of logical conditions to whether or + // not you can chain? Like if you were completely missed, you can't chain as much, or...? + // And/Or based on FP_SABER_OFFENSE level? So number of attacks you can chain + // increases with your FP_SABER_OFFENSE skill? + if (pm->ps->saberAnimLevel == SS_STAFF && pm->ps->saberAttackChainCount > Q_irand(2, 5)) + { + return qtrue; + } + else if (pm->ps->saberAnimLevel == SS_DUAL && pm->ps->saberAttackChainCount > Q_irand(2, 5)) + { + return qtrue; + } + else if (pm->ps->saberAnimLevel == SS_STRONG) + { + if (curmove == LS_NONE || newmove == LS_NONE) + { + if (pm->ps->saberAnimLevel >= SS_STRONG && pm->ps->saberAttackChainCount > Q_irand(0, 1)) + { + return qtrue; + } + } + else if (pm->ps->saberAttackChainCount > Q_irand(2, 3)) + { + return qtrue; + } + else if (pm->ps->saberAttackChainCount > 0) + { + int chainAngle = PM_SaberAttackChainAngle(curmove, newmove); + if (chainAngle < 135 || chainAngle > 215) + {//if trying to chain to a move that doesn't continue the momentum + return qtrue; + } + else if (chainAngle == 180) + {//continues the momentum perfectly, allow it to chain 66% of the time + if (pm->ps->saberAttackChainCount > 1) + { + return qtrue; + } + } + else + {//would continue the movement somewhat, 50% chance of continuing + if (pm->ps->saberAttackChainCount > 2) + { + return qtrue; + } + } + } + } + else {//FIXME: have chainAngle influence fast and medium chains as well? - if ((pm->ps->saberAnimLevel == FORCE_LEVEL_2 || pm->ps->saberAnimLevel == SS_DUAL) - && pm->ps->saberAttackChainCount > Q_irand(2, 5)) + if (pm->ps->saberAnimLevel == SS_MEDIUM && pm->ps->saberAttackChainCount > Q_irand(2, 5)) { return qtrue; } @@ -4437,7 +4529,8 @@ saberMoveName_t PM_SaberAttackForMovement(int forwardmove, int rightmove, int cu {//player uses chain-attack newmove = saberMoveData[curmove].chain_attack; } - if (PM_SaberKataDone(curmove, newmove)) + if ((!g_saberNewCombat->integer && PM_SaberKataDone(curmove, newmove)) + || (g_saberNewCombat->integer && PM_SaberKataDoneNew(curmove, newmove))) { return saberMoveData[curmove].chain_idle; } @@ -4472,7 +4565,8 @@ saberMoveName_t PM_SaberAttackForMovement(int forwardmove, int rightmove, int cu newmove = saberMoveData[curmove].chain_attack; } } - if (PM_SaberKataDone(curmove, newmove)) + if ((!g_saberNewCombat->integer && PM_SaberKataDone(curmove, newmove)) + || (g_saberNewCombat->integer && PM_SaberKataDoneNew(curmove, newmove))) { return saberMoveData[curmove].chain_idle; } @@ -4597,7 +4691,8 @@ saberMoveName_t PM_SaberAnimTransitionMove(saberMoveName_t curmove, saberMoveNam //going into another attack... //allow endless chaining in level 1 attacks, several in level 2 and only one or a few in level 3 //FIXME: don't let strong attacks chain to an attack in the opposite direction ( > 45 degrees?) - if (PM_SaberKataDone(curmove, newmove)) + if ((!g_saberNewCombat->integer && PM_SaberKataDone(curmove, newmove)) + || (g_saberNewCombat->integer && PM_SaberKataDoneNew(curmove, curmove))) {//done with this kata, must return to ready before attack again retmove = LS_R_TL2BR + (newmove - LS_A_TL2BR); } diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 517f985e34..99ca7eee77 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -75,6 +75,7 @@ extern qboolean PM_SaberInIdle(int move); extern qboolean PM_SaberInStart(int move); extern qboolean PM_SaberInReturn(int move); extern qboolean PM_SaberKataDone(int curmove, int newmove); +extern qboolean PM_SaberKataDoneNew(int curmove, int newmove); extern qboolean PM_SaberInSpecial(int move); extern qboolean PM_InDeathAnim(void); extern qboolean PM_StandingAnim(int anim); @@ -150,6 +151,7 @@ extern cvar_t *g_saberAutoBlocking; extern cvar_t *g_autoRoll; extern cvar_t *g_saberForceDrainAmount; extern cvar_t *g_saberLockSuperBreaks; +extern cvar_t *g_saberNewCombat; static void PM_SetWaterLevelAtPoint(vec3_t org, int *waterlevel, int *watertype); @@ -12540,7 +12542,8 @@ void PM_WeaponLightsaber(void) {//NPCs must play sequential attack //going into another attack... //allow endless chaining in level 1 attacks, several in level 2 and only one or a few in level 3 - if (PM_SaberKataDone(LS_NONE, LS_NONE)) + if ((!g_saberNewCombat->integer && PM_SaberKataDone(LS_NONE, LS_NONE)) + || (g_saberNewCombat->integer && PM_SaberKataDoneNew(LS_NONE, LS_NONE))) {//done with this kata, must return to ready before attack again newmove = saberMoveData[curmove].chain_idle; } @@ -12680,7 +12683,8 @@ void PM_WeaponLightsaber(void) newmove = saberMoveData[curmove].chain_attack; } } - if (PM_SaberKataDone(curmove, newmove)) + if ((!g_saberNewCombat->integer && PM_SaberKataDone(curmove, newmove)) + || (g_saberNewCombat->integer && PM_SaberKataDoneNew(curmove, newmove))) {//cannot chain this time newmove = saberMoveData[curmove].chain_idle; } diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index 6696e4ff8d..2ba07761ee 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -48,7 +48,7 @@ extern void WP_SaberReflectCheck( gentity_t *self, usercmd_t *ucmd ); extern void WP_SaberUpdate( gentity_t *self, usercmd_t *ucmd ); extern void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ); extern void WP_ForcePowersUpdate( gentity_t *self, usercmd_t *ucmd ); -extern void WP_BlockPointsRegenerate( gentity_t *self ); +extern void WP_SaberBlockPointsRegenerate(gentity_t * self); extern void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd); extern gentity_t *SeekerAcquiresTarget ( gentity_t *ent, vec3_t pos ); @@ -124,6 +124,7 @@ extern cvar_t *d_slowmodeath; extern cvar_t *g_debugMelee; extern vmCvar_t cg_thirdPersonAlpha; extern vmCvar_t cg_thirdPersonAutoAlpha; +extern cvar_t *g_saberNewCombat; void ClientEndPowerUps( gentity_t *ent ); @@ -5317,9 +5318,7 @@ extern cvar_t *g_skippingcin; G_CheckClampUcmd( ent, ucmd ); - WP_ForcePowersUpdate( ent, ucmd ); - - WP_BlockPointsRegenerate( ent ); + WP_ForcePowersUpdate( ent, ucmd ); //if we have the saber in hand, check for starting a block to reflect shots if ((ent->s.number < MAX_CLIENTS//player diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 0cb1f774b5..da835abc5f 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -125,6 +125,11 @@ extern qboolean PM_InOnGroundAnim(playerState_t *ps); extern qboolean PM_KnockDownAnim(int anim); extern qboolean PM_SaberInKata(saberMoveName_t saberMove); extern qboolean PM_StabDownAnim(int anim); +extern qboolean PM_StandingAnim(int anim); +extern qboolean PM_CrouchingAnim(int anim); +extern qboolean PM_WalkingAnim(int anim); +extern qboolean PM_RunningAnim(int anim); +extern qboolean PM_RollingAnim(int anim); extern int PM_PowerLevelForSaberAnim(playerState_t *ps, int saberNum = 0); extern void PM_VelocityForSaberMove(playerState_t *ps, vec3_t throwDir); extern qboolean PM_VelocityForBlockedMove(playerState_t *ps, vec3_t throwDir); @@ -237,6 +242,52 @@ qboolean NPC_JediClassBoss(gentity_t *self) { } } +qboolean PM_WalkingOrIdle(gentity_t *self) +{ //mainly for checking if we can guard well or regen block points + if ((PM_WalkingAnim(self->client->ps.legsAnim) + || PM_StandingAnim(self->client->ps.legsAnim) + || PM_CrouchingAnim(self->client->ps.legsAnim) + || self->client->ps.torsoAnim == BOTH_MEDITATE) + && (self->client->ps.saberMove == LS_NONE || self->client->ps.saberMove == LS_READY)) + { + return qtrue; + } + + return qfalse; +} + +qboolean WP_SaberBlockCooldownDone(gentity_t *self) +{ + if (PM_SaberInReturn(self->client->ps.saberMove)) + {//we're in a return, probably triggered after a previous deflection + //FIXME: Make sure it's a return from a deflection, not a slash? + if (self->client->ps.saberAnimLevel == SS_FAST || self->client->ps.saberAnimLevel == SS_TAVION + //|| self->client->ps.saberAnimLevel == SS_DUAL + ) + { //only non-fast deflecting styles get a break + return qfalse; + } + + int totalReboundTime = parryDebounce[self->client->ps.forcePowerLevel[FP_SABER_DEFENSE]] * BLOCK_SPEED; + int baseReboundTime = totalReboundTime; + + switch (self->client->ps.saberAnimLevel) + { + case SS_DESANN: + case SS_STRONG: + totalReboundTime *= SLOW_BLOCK_FACTOR; + break; + } + + if (totalReboundTime > self->client->ps.torsoAnimTimer) + {//we haven't been in the cooldown (return) animation long enough + return qfalse; + } + + return qtrue; + } +} + vec3_t g_saberFlashPos = { 0, 0, 0 }; int forcePowerDarkLight[NUM_FORCE_POWERS] = //0 == neutral @@ -6046,11 +6097,12 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) { entPowerLevel = (2 * ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE]) + stylePowerModifier; } - + /* if (PM_SaberInSpecialAttack(ent->client->ps.saberMove)) //now for special moves { //special moves get a 2nd boost on top of the one in bg_panimate entPowerLevel += 2; } + */ //now for modifiers based on any enhancement powers active if (!ent->s.number && (ent->client->ps.forcePowersActive&(1 << FP_SPEED))) @@ -6197,17 +6249,43 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) // More damage based on length/color of saber? //FIXME: Desann does double damage? - - - if (g_saberNewCombat->integer) //new code + if (g_saberRealisticCombat->integer) { - if (g_saberRealisticCombat->integer) + switch ((ent->client->ps.saberAnimLevel)) + { + default: + case FORCE_LEVEL_5: + baseDamage = 10.0f; + break; + case FORCE_LEVEL_4: //Staff, medium, duals all do same damage + case FORCE_LEVEL_3: + case FORCE_LEVEL_2: + baseDamage = 5.0f; + break; + case FORCE_LEVEL_0: + case FORCE_LEVEL_1: //FIXME: Fast damage is so low... + baseDamage = 2.5f; + break; + } + } + else + { + if (g_spskill->integer > 0 + && ent->s.number < MAX_CLIENTS + && (ent->client->ps.torsoAnim == BOTH_ROLL_STAB + || ent->client->ps.torsoAnim == BOTH_SPINATTACK6 + || ent->client->ps.torsoAnim == BOTH_SPINATTACK7 + || ent->client->ps.torsoAnim == BOTH_LUNGE2_B__T_)) + {//*sigh*, these anim do less damage since they're so easy to do + baseDamage = 2.5f; + } + else { switch ((ent->client->ps.saberAnimLevel)) { default: case FORCE_LEVEL_5: - baseDamage = 10.0f; + baseDamage = 7.5f; break; case FORCE_LEVEL_4: //Staff, medium, duals all do same damage case FORCE_LEVEL_3: @@ -6220,38 +6298,7 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) break; } } - else - { - if (g_spskill->integer > 0 - && ent->s.number < MAX_CLIENTS - && (ent->client->ps.torsoAnim == BOTH_ROLL_STAB - || ent->client->ps.torsoAnim == BOTH_SPINATTACK6 - || ent->client->ps.torsoAnim == BOTH_SPINATTACK7 - || ent->client->ps.torsoAnim == BOTH_LUNGE2_B__T_)) - {//*sigh*, these anim do less damage since they're so easy to do - baseDamage = 2.5f; - } - else - { - switch ((ent->client->ps.saberAnimLevel)) - { - default: - case FORCE_LEVEL_5: - baseDamage = 7.5f; - break; - case FORCE_LEVEL_4: //Staff, medium, duals all do same damage - case FORCE_LEVEL_3: - case FORCE_LEVEL_2: - baseDamage = 5.0f; - break; - case FORCE_LEVEL_0: - case FORCE_LEVEL_1: //FIXME: Fast damage is so low... - baseDamage = 2.5f; - break; - } - } - } - } + } } else {//saber is transitioning, defending or idle, don't do as much damage @@ -6577,20 +6624,21 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) gentity_t *hitEnt = &g_entities[saberHitEntity]; gentity_t *hitOwner = NULL; + //the "power" level of the anims + int entAnimLevel = PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum); + int hitOwnerAnimLevel = PM_PowerLevelForSaberAnim(&hitOwner->client->ps, saberNum); + int hitOwnerPowerLevel = FORCE_LEVEL_0; - if (g_saberNewCombat->integer) //Dusty, new code start. + if (hitEnt) { - if (hitEnt) - { - hitOwner = hitEnt->owner; - } - if (hitOwner && hitOwner->client) - { - hitOwnerPowerLevel = 2 * hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; - hitOwner->breakLimit = hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; - } + hitOwner = hitEnt->owner; } + if (hitOwner && hitOwner->client) + { + hitOwnerPowerLevel = 2 * hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; + hitOwner->breakLimit = hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; + } /* //old crud here if ( entPowerLevel >= FORCE_LEVEL_3 @@ -6656,8 +6704,8 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) { entAttacking = qtrue; } - else if (PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) > FORCE_LEVEL_3) - {//now it checks specifically for style, and only strong, staff, and desann styles get this, before it only looked at ent's strength + else if (entAnimLevel > FORCE_LEVEL_3) + {//stronger styles count as attacking even if in a transition if (PM_SaberInTransitionAny(ent->client->ps.saberMove)) { entAttacking = qtrue; @@ -6669,12 +6717,14 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) entDefending = qtrue; } - /*if (ent->client->ps.torsoAnim == BOTH_A1_SPECIAL + if (ent->client->ps.torsoAnim == BOTH_A1_SPECIAL || ent->client->ps.torsoAnim == BOTH_A2_SPECIAL - || ent->client->ps.torsoAnim == BOTH_A3_SPECIAL) - {//parry/block/break-parry bonus for single-style kata moves - entPowerLevel += 2; - }*/ + || ent->client->ps.torsoAnim == BOTH_A3_SPECIAL + || ent->client->ps.torsoAnim == BOTH_A7_SOULCAL + || ent->client->ps.torsoAnim == BOTH_A6_SABERPROTECT) + {//parry/block/break-parry bonus for katas + entPowerLevel++; + } if (entAttacking) //I'm removing all two-handed power bonuses, now it's purely for force power stuff - Dusty {//add twoHanded bonus and breakParryBonus to entPowerLevel here //This makes staff too powerful @@ -6719,7 +6769,7 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) { hitOwnerAttacking = qtrue; } - else if (hitOwnerPowerLevel > FORCE_LEVEL_2) + else if (hitOwnerAnimLevel > FORCE_LEVEL_3) {//stronger styles count as attacking even if in a transition if (PM_SaberInTransitionAny(hitOwner->client->ps.saberMove)) { @@ -6731,13 +6781,20 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) { hitOwnerDefending = qtrue; } + if (!hitOwner->s.number && WP_SaberBlockCooldownDone(hitOwner) && PM_WalkingOrIdle(hitOwner)) + {//player gets a special break + hitOwner->client->ps.saberMove = LS_READY; //kind of hacky + hitOwnerDefending = qtrue; + } - /*if (hitOwner->client->ps.torsoAnim == BOTH_A1_SPECIAL + if (hitOwner->client->ps.torsoAnim == BOTH_A1_SPECIAL || hitOwner->client->ps.torsoAnim == BOTH_A2_SPECIAL - || hitOwner->client->ps.torsoAnim == BOTH_A3_SPECIAL) - {//parry/block/break-parry bonus for single-style kata moves - hitOwnerPowerLevel += 2; - }*/ + || hitOwner->client->ps.torsoAnim == BOTH_A3_SPECIAL + || hitOwner->client->ps.torsoAnim == BOTH_A7_SOULCAL + || hitOwner->client->ps.torsoAnim == BOTH_A6_SABERPROTECT) + {//parry/block/break-parry bonus for katas + hitOwnerPowerLevel++; + } if (hitOwnerAttacking) {//add twoHanded bonus and breakParryBonus to entPowerLevel here /*if ((hitOwner->client->ps.saber[0].saberFlags&SFL_TWO_HANDED)) @@ -6776,9 +6833,6 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) } } - int entAnimLevel = PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum); - int hitOwnerAnimLevel = PM_PowerLevelForSaberAnim(&hitOwner->client->ps, saberNum); - //Saber Locks if (PM_SuperBreakLoseAnim(ent->client->ps.torsoAnim) || PM_SuperBreakWinAnim(ent->client->ps.torsoAnim) @@ -6842,6 +6896,10 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) if (!PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) { //special attacks just break, no counters hitOwner->breakCounter += (entPowerLevel - hitOwnerPowerLevel); + if (hitOwner->breakCounter > -2) + { + hitOwner->breakCounter = -2; + } hitOwner->breakRecoveryTime = level.time + HITOWNER_RECOVERY_INTERVAL; } } @@ -6854,31 +6912,34 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) {//knockaways can make fast-attacker go into a broken parry anim if the ent is using fast or med (but not Tavion) //make me parry WP_SaberParry(hitOwner, ent, saberNum, bladeNum); - //turn the parry into a knockaway - hitOwner->client->ps.saberBounceMove = PM_KnockawayForParry(hitOwner->client->ps.saberBlocked); - //make them go into a broken parry - ent->client->ps.saberBounceMove = PM_BrokenParryForAttack(ent->client->ps.saberMove); - ent->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; - if (saberNum == 0) - {//FIXME: can only lose right-hand saber for now - if (!(ent->client->ps.saber[saberNum].saberFlags&SFL_NOT_DISARMABLE) - && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] < FORCE_LEVEL_2 - //^changed DEFENSE to OFFENSE - //&& (ent->s.number||g_saberRealisticCombat->integer) - && Q_irand(0, hitOwner->client->ps.SaberDisarmBonus(0)) > 0 - && (hitOwner->s.number || g_saberAutoBlocking->integer || !Q_irand(0, 2)))//if player defending and autoblocking is on, this is less likely to happen, so don't do the random check - {//knocked the saber right out of his hand! (never happens to player) - //Get a good velocity to send the saber in based on my parry move - vec3_t throwDir; - if (!PM_VelocityForBlockedMove(&hitOwner->client->ps, throwDir)) - { - PM_VelocityForSaberMove(&ent->client->ps, throwDir); + if (!PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) + {//special attacks can't be interrupted... just semi-blocked... + //turn the parry into a knockaway + hitOwner->client->ps.saberBounceMove = PM_KnockawayForParry(hitOwner->client->ps.saberBlocked); + //make them go into a broken parry + ent->client->ps.saberBounceMove = PM_BrokenParryForAttack(ent->client->ps.saberMove); + ent->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; + if (saberNum == 0) + {//FIXME: can only lose right-hand saber for now + if (!(ent->client->ps.saber[saberNum].saberFlags&SFL_NOT_DISARMABLE) + && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] < FORCE_LEVEL_2 + //^changed DEFENSE to OFFENSE + //&& (ent->s.number||g_saberRealisticCombat->integer) + && Q_irand(0, hitOwner->client->ps.SaberDisarmBonus(0)) > 0 + && (hitOwner->s.number || g_saberAutoBlocking->integer || !Q_irand(0, 2)))//if player defending and autoblocking is on, this is less likely to happen, so don't do the random check + {//knocked the saber right out of his hand! (never happens to player) + //Get a good velocity to send the saber in based on my parry move + vec3_t throwDir; + if (!PM_VelocityForBlockedMove(&hitOwner->client->ps, throwDir)) + { + PM_VelocityForSaberMove(&ent->client->ps, throwDir); + } + WP_SaberLose(ent, throwDir); } - WP_SaberLose(ent, throwDir); } - } - //just so Jedi knows that he was blocked - ent->client->ps.saberEventFlags |= SEF_BLOCKED; + //just so Jedi knows that he was blocked + ent->client->ps.saberEventFlags |= SEF_BLOCKED; + } #ifndef FINAL_BUILD if (d_saberCombat->integer) { @@ -14648,19 +14709,25 @@ int WP_AbsorbConversion(gentity_t *attacked, int atdAbsLevel, gentity_t *attacke return getLevel; } -extern qboolean PM_WalkingAnim(int anim); -extern qboolean PM_SaberStanceAnim(int anim); -void WP_BlockPointsRegenerate(gentity_t *self) +void WP_SaberBlockPointsRegenerate(gentity_t *self) { - if (g_saberNewCombat->integer) + qboolean canRegen = qfalse; + if (PM_WalkingOrIdle(self)) + { + canRegen = qtrue; + } + if (!canRegen) { - if (self->breakCounter) //must have block points that need to be regained + self->breakRecoveryTime = level.time + HITOWNER_RECOVERY_INTERVAL; + return; + } + + if (self->breakCounter) //must have block points that need to be regained + { + if (level.time >= self->breakRecoveryTime) { - if (level.time >= self->breakRecoveryTime /*&& PM_WalkingAnim*/) - { - self->breakCounter -= 1; - self->breakRecoveryTime = level.time + HITOWNER_RECOVERY_INTERVAL; - } + self->breakCounter -= 1; + self->breakRecoveryTime = level.time + HITOWNER_RECOVERY_INTERVAL; } } @@ -14698,6 +14765,11 @@ void WP_ForcePowerRegenerate(gentity_t *self, int overrideAmt) self->client->ps.forcePower = self->client->ps.forcePowerMax; } } + + if (g_saberNewCombat->integer) + { + WP_SaberBlockPointsRegenerate(self); + } } void WP_ForcePowerDrain(gentity_t *self, forcePowers_t forcePower, int overrideAmt) From e2c1e90158e04c7882d4f987312d49850861aa55 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Wed, 13 Jan 2016 03:41:50 +0100 Subject: [PATCH 132/445] Fix Q_rsqrt NaN assert at start of JK2 artus_topside in debug mode Fixes https://github.com/JACoders/OpenJK/issues/448 --- code/cgame/FxPrimitives.cpp | 7 +++++-- codeJK2/cgame/FxPrimitives.cpp | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/code/cgame/FxPrimitives.cpp b/code/cgame/FxPrimitives.cpp index 9ef7d90721..24cdc6568c 100644 --- a/code/cgame/FxPrimitives.cpp +++ b/code/cgame/FxPrimitives.cpp @@ -307,9 +307,12 @@ bool CParticle::UpdateOrigin() } } - // Hit something - if ( trace.fraction < 1.0f )//|| trace.startsolid || trace.allsolid ) + if ( trace.startsolid || trace.allsolid || trace.fraction == 1.0) { + } + else + { + // Hit something if ( mFlags & FX_IMPACT_RUNS_FX && !(trace.surfaceFlags & SURF_NOIMPACT )) { theFxScheduler.PlayEffect( mImpactFxID, trace.endpos, trace.plane.normal ); diff --git a/codeJK2/cgame/FxPrimitives.cpp b/codeJK2/cgame/FxPrimitives.cpp index 4b275ce636..b838717bed 100644 --- a/codeJK2/cgame/FxPrimitives.cpp +++ b/codeJK2/cgame/FxPrimitives.cpp @@ -277,9 +277,12 @@ bool CParticle::UpdateOrigin() theFxHelper.Trace( &trace, mOrigin1, NULL, NULL, new_origin, -1, ( MASK_SHOT | CONTENTS_WATER ) ); } - // Hit something - if ( trace.fraction < 1.0f )//|| trace.startsolid || trace.allsolid ) + if ( trace.startsolid || trace.allsolid || trace.fraction == 1.0) { + } + else + { + // Hit something if ( mFlags & FX_IMPACT_RUNS_FX && !(trace.surfaceFlags & SURF_NOIMPACT )) { theFxScheduler.PlayEffect( mImpactFxID, trace.endpos, trace.plane.normal ); From 71f7da7534de8dab36ca5b49fa4398c7c88af949 Mon Sep 17 00:00:00 2001 From: Dusty Date: Fri, 15 Jan 2016 17:29:07 -0500 Subject: [PATCH 133/445] work in progress --- code/game/NPC_behavior.cpp | 5 +- code/game/bg_panimate.cpp | 22 +++- code/game/wp_saber.cpp | 262 ++++++++++++++++++------------------- 3 files changed, 143 insertions(+), 146 deletions(-) diff --git a/code/game/NPC_behavior.cpp b/code/game/NPC_behavior.cpp index a7ee224964..45baddc868 100644 --- a/code/game/NPC_behavior.cpp +++ b/code/game/NPC_behavior.cpp @@ -1563,8 +1563,7 @@ void NPC_Surrender( void ) else { NPC_SetAnim(NPC, SETANIM_TORSO, TORSO_SURRENDER_START, SETANIM_FLAG_HOLD | SETANIM_FLAG_OVERRIDE); - NPC->client->ps.torsoAnimTimer = 1000; - NPCInfo->surrenderTime = level.time + 1000; + NPC->client->ps.torsoAnimTimer = Q_irand(4000, 7000); } } NPCInfo->surrenderTime = level.time + NPC->client->ps.torsoAnimTimer + 1000; @@ -1859,7 +1858,7 @@ qboolean NPC_BSFlee( void ) { //done panicking, time to realize we're dogmeat, if we haven't been able to flee for a few seconds if ((level.time-NPC->lastMoveTime)>3000 - && (level.time-NPCInfo->surrenderTime) > 1000 )//and haven't just finished surrendering + && (level.time-NPCInfo->surrenderTime) > 2000 )//and haven't just finished surrendering { NPC_FaceEnemy(); NPC_Surrender(); diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index 9f478e0063..d613e3a666 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -2606,6 +2606,17 @@ qboolean PM_SaberKataDoneNew(int curmove = LS_NONE, int newmove = LS_NONE) return qfalse; } } + else if (PM_RunningAnim(pm->ps->legsAnim)) + {//can only chain two attacks if running + if (pm->ps->saberAttackChainCount > 1) + { + return qtrue; + } + else + { + return qfalse; + } + } else if ((pm->ps->forcePowersActive&(1 << FP_RAGE))) {//infinite chaining when raged return qfalse; @@ -2626,12 +2637,12 @@ qboolean PM_SaberKataDoneNew(int curmove = LS_NONE, int newmove = LS_NONE) } } - if (pm->ps->saberAnimLevel == SS_DESANN && pm->ps->saberAttackChainCount > Q_irand(2, 4)) + if (pm->ps->saberAnimLevel == SS_DESANN && pm->ps->saberAttackChainCount > Q_irand(2, 3)) { return qtrue; } - if (pm->ps->saberAnimLevel == SS_TAVION && pm->ps->saberAttackChainCount > Q_irand(2, 5)) + if (pm->ps->saberAnimLevel == SS_TAVION && pm->ps->saberAttackChainCount > Q_irand(4, 5)) {//desann and tavion can link up as many attacks as they want return qtrue; } @@ -2639,11 +2650,11 @@ qboolean PM_SaberKataDoneNew(int curmove = LS_NONE, int newmove = LS_NONE) // not you can chain? Like if you were completely missed, you can't chain as much, or...? // And/Or based on FP_SABER_OFFENSE level? So number of attacks you can chain // increases with your FP_SABER_OFFENSE skill? - if (pm->ps->saberAnimLevel == SS_STAFF && pm->ps->saberAttackChainCount > Q_irand(2, 5)) + if (pm->ps->saberAnimLevel == SS_STAFF && pm->ps->saberAttackChainCount > Q_irand(4, 5)) { return qtrue; } - else if (pm->ps->saberAnimLevel == SS_DUAL && pm->ps->saberAttackChainCount > Q_irand(2, 5)) + else if (pm->ps->saberAnimLevel == SS_DUAL && pm->ps->saberAttackChainCount > Q_irand(4, 5)) { return qtrue; } @@ -2685,11 +2696,12 @@ qboolean PM_SaberKataDoneNew(int curmove = LS_NONE, int newmove = LS_NONE) } else {//FIXME: have chainAngle influence fast and medium chains as well? - if (pm->ps->saberAnimLevel == SS_MEDIUM && pm->ps->saberAttackChainCount > Q_irand(2, 5)) + if (pm->ps->saberAnimLevel == SS_MEDIUM && pm->ps->saberAttackChainCount > Q_irand(4, 5)) { return qtrue; } } + return qfalse; } diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index da835abc5f..4bea793f53 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -126,7 +126,7 @@ extern qboolean PM_KnockDownAnim(int anim); extern qboolean PM_SaberInKata(saberMoveName_t saberMove); extern qboolean PM_StabDownAnim(int anim); extern qboolean PM_StandingAnim(int anim); -extern qboolean PM_CrouchingAnim(int anim); +extern qboolean PM_CrouchAnim(int anim); extern qboolean PM_WalkingAnim(int anim); extern qboolean PM_RunningAnim(int anim); extern qboolean PM_RollingAnim(int anim); @@ -173,6 +173,7 @@ qboolean WP_ForcePowerAvailable(gentity_t *self, forcePowers_t forcePower, int o void WP_ForcePowerDrain(gentity_t *self, forcePowers_t forcePower, int overrideAmt); void WP_DeactivateSaber(gentity_t *self, qboolean clearLength = qfalse); qboolean FP_ForceDrainGrippableEnt(gentity_t *victim); +qboolean WP_SaberBlockCooldownDone(gentity_t *self); extern cvar_t *g_saberAutoBlocking; extern cvar_t *g_saberRealisticCombat; @@ -193,9 +194,9 @@ qboolean g_noClashFlare = qfalse; int g_saberFlashTime = 0; //new variables - Dusty -const int HITOWNER_RECOVERY_INTERVAL = 1500; //interval at which defense points are recovered, 1.5 seconds -const float BLOCK_SPEED = 4.5; //affects player's blocking speed -const float SLOW_BLOCK_FACTOR = 1.5; +const int HITOWNER_RECOVERY_INTERVAL = 1000; //interval at which defense points are recovered, 1.5 seconds +const float BLOCK_SPEED = 5; //affects player's blocking speed +const float SLOW_BLOCK_FACTOR = 1.75; const float RUN_BLOCK_FACTOR = 1.5; /*extern int hitOwnerBreakLimit; extern int hitOwnerRecoveryTime; //how long left to recover a defense point @@ -222,21 +223,30 @@ qboolean NPC_JediClassNonBoss(gentity_t *self) { switch (self->client->NPC_class) { case CLASS_JEDI: case CLASS_REBORN: - case CLASS_SHADOWTROOPER: //semi-boss return qtrue; default: return qfalse; } } +qboolean NPC_JediClassSemiBoss(gentity_t *self) { + switch (self->client->NPC_class) { + case CLASS_ALORA: + case CLASS_SHADOWTROOPER: + return qtrue; + } + + return qfalse; +} + qboolean NPC_JediClassBoss(gentity_t *self) { switch (self->client->NPC_class) { - case CLASS_ALORA: //semi-boss case CLASS_DESANN: case CLASS_LUKE: case CLASS_KYLE: case CLASS_TAVION: case CLASS_MORGANKATARN: + return qtrue; default: return qfalse; } @@ -246,7 +256,7 @@ qboolean PM_WalkingOrIdle(gentity_t *self) { //mainly for checking if we can guard well or regen block points if ((PM_WalkingAnim(self->client->ps.legsAnim) || PM_StandingAnim(self->client->ps.legsAnim) - || PM_CrouchingAnim(self->client->ps.legsAnim) + || PM_CrouchAnim(self->client->ps.legsAnim) || self->client->ps.torsoAnim == BOTH_MEDITATE) && (self->client->ps.saberMove == LS_NONE || self->client->ps.saberMove == LS_READY)) { @@ -256,37 +266,7 @@ qboolean PM_WalkingOrIdle(gentity_t *self) return qfalse; } -qboolean WP_SaberBlockCooldownDone(gentity_t *self) -{ - if (PM_SaberInReturn(self->client->ps.saberMove)) - {//we're in a return, probably triggered after a previous deflection - //FIXME: Make sure it's a return from a deflection, not a slash? - if (self->client->ps.saberAnimLevel == SS_FAST || self->client->ps.saberAnimLevel == SS_TAVION - //|| self->client->ps.saberAnimLevel == SS_DUAL - ) - { //only non-fast deflecting styles get a break - return qfalse; - } - - int totalReboundTime = parryDebounce[self->client->ps.forcePowerLevel[FP_SABER_DEFENSE]] * BLOCK_SPEED; - int baseReboundTime = totalReboundTime; - switch (self->client->ps.saberAnimLevel) - { - case SS_DESANN: - case SS_STRONG: - totalReboundTime *= SLOW_BLOCK_FACTOR; - break; - } - - if (totalReboundTime > self->client->ps.torsoAnimTimer) - {//we haven't been in the cooldown (return) animation long enough - return qfalse; - } - - return qtrue; - } -} vec3_t g_saberFlashPos = { 0, 0, 0 }; @@ -4185,63 +4165,61 @@ qboolean WP_SaberParry(gentity_t *victim, gentity_t *attacker, int saberNum, int return qfalse; } if (victim->s.number || g_saberAutoBlocking->integer || victim->client->ps.saberBlockingTime > level.time) - {//either an NPC or a player who is blocking - if (g_saberNewCombat->integer) - { - if (!PM_SaberInBounce(victim->client->ps.saberMove) - && !PM_SaberInKnockaway(victim->client->ps.saberMove)) - { - if (!PM_SaberInTransitionAny(victim->client->ps.saberMove)) - {//Not attacking, in transition or in a bounce or knockaway, so play a parry - WP_SaberBlockNonRandom(victim, saberHitLocation, qfalse); - } - else if (!victim->s.number && (PM_SaberInReturn(victim->client->ps.saberMove))) - {//Player potentially gets an extra break because he always does return anims - int totalReboundTime = parryDebounce[victim->client->ps.forcePowerLevel[FP_SABER_DEFENSE]] * BLOCK_SPEED; - int baseReboundTime = totalReboundTime; - - switch (victim->client->ps.saberAnimLevel) - { - case SS_DESANN: - case SS_STRONG: - totalReboundTime *= SLOW_BLOCK_FACTOR; - break; - } + {//either an NPC or a player who is blocking + if (!PM_SaberInTransitionAny(victim->client->ps.saberMove) + && !PM_SaberInBounce(victim->client->ps.saberMove) + && !PM_SaberInKnockaway(victim->client->ps.saberMove)) + {//I'm not attacking, in transition or in a bounce or knockaway, so play a parry + WP_SaberBlockNonRandom(victim, saberHitLocation, qfalse); + } + + victim->client->ps.saberEventFlags |= SEF_PARRIED; - if (totalReboundTime < victim->client->ps.torsoAnimTimer) - {//we have been in the cooldown (return) animation long enough - WP_SaberBlockNonRandom(victim, saberHitLocation, qfalse); - } - } + //since it was parried, take away any damage done + //FIXME: what if the damage was done before the parry? + WP_SaberClearDamageForEntNum(attacker, victim->s.number, saberNum, bladeNum); - } - else if ((!PM_SaberInTransitionAny(victim->client->ps.saberMove) || PM_SaberInReturn(victim->client->ps.saberMove)) - && !PM_SaberInBounce(victim->client->ps.saberMove) - && !PM_SaberInKnockaway(victim->client->ps.saberMove) - && !victim->s.number) - {//Player that's not attacking, in transition or in a bounce or knockaway, so play a parry - if (PM_SaberInReturn(victim->client->ps.saberMove) - && victim->client->ps.saberAnimLevel != SS_FAST - && victim->client->ps.saberAnimLevel != SS_TAVION) - {//if we're in a return see how long we've been in it - - } - else - { - WP_SaberBlockNonRandom(victim, saberHitLocation, qfalse); - } - } + //tell the victim to get mad at me + if (victim->enemy != attacker && victim->client->playerTeam != attacker->client->playerTeam) + {//they're not mad at me and they're not on my team + G_ClearEnemy(victim); + G_SetEnemy(victim, attacker); } - else - { - if (!PM_SaberInTransitionAny(victim->client->ps.saberMove) - && !PM_SaberInBounce(victim->client->ps.saberMove) - && !PM_SaberInKnockaway(victim->client->ps.saberMove)) - {//I'm not attacking, in transition or in a bounce or knockaway, so play a parry - WP_SaberBlockNonRandom(victim, saberHitLocation, qfalse); - } + return qtrue; + } + return qfalse; +} + +qboolean WP_SaberParryNew(gentity_t *victim, gentity_t *attacker, int saberNum, int bladeNum) +{ + return qfalse; + + if (!victim || !victim->client || !attacker) + { + return qfalse; + } + if (Rosh_BeingHealed(victim)) + { + return qfalse; + } + if (G_InCinematicSaberAnim(victim)) + { + return qfalse; + } + if (PM_SuperBreakLoseAnim(victim->client->ps.torsoAnim) + || PM_SuperBreakWinAnim(victim->client->ps.torsoAnim)) + { + return qfalse; + } + if (victim->s.number || g_saberAutoBlocking->integer || victim->client->ps.saberBlockingTime > level.time) + {//either an NPC or a player who is blocking + if ((!PM_SaberInTransitionAny(victim->client->ps.saberMove) || (!victim->s.number && WP_SaberBlockCooldownDone(victim))) + && !PM_SaberInBounce(victim->client->ps.saberMove) + && !PM_SaberInKnockaway(victim->client->ps.saberMove)) + {//I'm not attacking, in transition or in a bounce or knockaway, so play a parry + WP_SaberBlockNonRandom(victim, saberHitLocation, qfalse); } - + victim->client->ps.saberEventFlags |= SEF_PARRIED; //since it was parried, take away any damage done @@ -6622,13 +6600,13 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) qboolean deflected = qfalse; gentity_t *hitEnt = &g_entities[saberHitEntity]; - gentity_t *hitOwner = NULL; + gentity_t *hitOwner = NULL; + int hitOwnerPowerLevel = FORCE_LEVEL_0; + //the "power" level of the anims int entAnimLevel = PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum); - int hitOwnerAnimLevel = PM_PowerLevelForSaberAnim(&hitOwner->client->ps, saberNum); - - int hitOwnerPowerLevel = FORCE_LEVEL_0; + int hitOwnerAnimLevel = FORCE_LEVEL_0; if (hitEnt) { @@ -6637,7 +6615,8 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) if (hitOwner && hitOwner->client) { hitOwnerPowerLevel = 2 * hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; - hitOwner->breakLimit = hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; + hitOwner->breakLimit = 1 + hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]; + hitOwnerAnimLevel = PM_PowerLevelForSaberAnim(&hitOwner->client->ps, saberNum); } /* //old crud here @@ -6716,6 +6695,11 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) { entDefending = qtrue; } + /*else if (!ent->s.number && WP_SaberBlockCooldownDone(ent) && PM_WalkingOrIdle(ent)) + {//player can cheat on the return animation a bit + //hitOwner->client->ps.saberMove = LS_READY; //kind of hacky + entDefending = qtrue; + }*/ if (ent->client->ps.torsoAnim == BOTH_A1_SPECIAL || ent->client->ps.torsoAnim == BOTH_A2_SPECIAL @@ -6781,11 +6765,11 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) { hitOwnerDefending = qtrue; } - if (!hitOwner->s.number && WP_SaberBlockCooldownDone(hitOwner) && PM_WalkingOrIdle(hitOwner)) - {//player gets a special break - hitOwner->client->ps.saberMove = LS_READY; //kind of hacky + /*else if (!hitOwner->s.number && WP_SaberBlockCooldownDone(hitOwner) && PM_WalkingOrIdle(hitOwner)) + {//player can cheat on the return animation a bit + //hitOwner->client->ps.saberMove = LS_READY; //kind of hacky hitOwnerDefending = qtrue; - } + }*/ if (hitOwner->client->ps.torsoAnim == BOTH_A1_SPECIAL || hitOwner->client->ps.torsoAnim == BOTH_A2_SPECIAL @@ -6912,7 +6896,7 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) {//knockaways can make fast-attacker go into a broken parry anim if the ent is using fast or med (but not Tavion) //make me parry WP_SaberParry(hitOwner, ent, saberNum, bladeNum); - if (!PM_SaberInSpecialAttack(ent->client->ps.torsoAnim)) + if (!PM_SaberInSpecialAttack(ent->client->ps.saberMove)) {//special attacks can't be interrupted... just semi-blocked... //turn the parry into a knockaway hitOwner->client->ps.saberBounceMove = PM_KnockawayForParry(hitOwner->client->ps.saberBlocked); @@ -6950,7 +6934,7 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) else if (!activeDefense//they're not defending i.e. not holding +block with auto-blocking turned off? || (hitOwner->breakCounter > hitOwner->breakLimit //too tired to defend strong attacks && hitOwnerPowerLevel < entPowerLevel) - || PM_SaberInSpecialAttack(ent->client->ps.torsoAnim))//they are defending, but their defense strength is lower than my attack... + || PM_SaberInSpecialAttack(ent->client->ps.saberMove))//they are defending, but their defense strength is lower than my attack... //or they are doing a special which has slightly //different rules /*|| (!deflected && Q_irand(0, Q_max(0, PM_PowerLevelForSaberAnim(&ent->client->ps, saberNum) - hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]PM_PowerLevelForSaberAnim( &hitOwner->client->ps ))) > 0))*/ @@ -9461,44 +9445,11 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) } if (!self->s.number) //player - { - int totalReboundTime = 0; - int baseReboundTime = 0; - - if (ucmd->buttons & BUTTON_ATTACK - || PM_SaberInAttack(self->client->ps.saberMove) - || PM_SaberInSpecialAttack(self->client->ps.torsoAnim)) - {//can't block if already attacking! - return; - } - else if (PM_SaberInTransitionAny(self->client->ps.saberMove) - && !PM_SaberInReturn(self->client->ps.saberMove)) - {//can't block if transitioning between saber moves - return; - } - else if (PM_SaberInReturn(self->client->ps.saberMove)) - {//we're in a return, probably triggered after a previous deflection - //FIXME: Make sure it's a return from a deflection, not a slash? - if (self->client->ps.saberAnimLevel == SS_FAST || self->client->ps.saberAnimLevel == SS_TAVION - //|| self->client->ps.saberAnimLevel == SS_DUAL - ) - { //only non-fast deflecting styles get a break - return; - } - - totalReboundTime = parryDebounce[self->client->ps.forcePowerLevel[FP_SABER_DEFENSE]] * BLOCK_SPEED; - baseReboundTime = totalReboundTime; - - switch (self->client->ps.saberAnimLevel) + { + if (PM_SaberInTransitionAny(self->client->ps.saberMove)) + { + if (!WP_SaberBlockCooldownDone(self) || !PM_WalkingOrIdle(self)) { - case SS_DESANN: - case SS_STRONG: - totalReboundTime *= SLOW_BLOCK_FACTOR; - break; - } - - if (totalReboundTime > self->client->ps.torsoAnimTimer) - {//we haven't been in the cooldown (return) animation long enough return; } } @@ -14743,6 +14694,41 @@ void WP_SaberBlockPointsRegenerate(gentity_t *self) } } +qboolean WP_SaberBlockCooldownDone(gentity_t *self) +{//lets you cheat on the return animations for better defense + if (PM_SaberInReturn(self->client->ps.saberMove)) + {//we're in a return, probably triggered after a previous deflection + //FIXME: Make sure it's a return from a deflection, not a slash? + /*if (self->client->ps.saberAnimLevel == SS_FAST || self->client->ps.saberAnimLevel == SS_TAVION + //|| self->client->ps.saberAnimLevel == SS_DUAL + ) + { //only non-fast deflecting styles get a break + return qfalse; + } + */ + + int totalReboundTime = parryDebounce[self->client->ps.forcePowerLevel[FP_SABER_DEFENSE]] * BLOCK_SPEED; + int baseReboundTime = totalReboundTime; + + switch (self->client->ps.saberAnimLevel) + { + case SS_DESANN: + case SS_STRONG: + totalReboundTime *= SLOW_BLOCK_FACTOR; + break; + } + + if (totalReboundTime > self->client->ps.torsoAnimTimer) + {//we haven't been in the cooldown (return) animation long enough + return qfalse; + } + + return qtrue; + } + + return qfalse; +} + void WP_ForcePowerRegenerate(gentity_t *self, int overrideAmt) { if (!self->client) From 531177d1dc83b65c22e81f3398223c12924ba8c9 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Sun, 17 Jan 2016 17:52:25 +0000 Subject: [PATCH 134/445] [MP] Fix crashes when NULL ghoul2 is used Despite there being checks for null ghoul2 pointers in the renderer, these checks can be optimized out because some G2 API functions accept references. Well-formed C++ applications (i.e. those which don't invoke undefined behaviour) cannot contain references to null values so some compilers will optimize these checks out. By checking for null pointers in the client, it is guaranteed that these pointers will not be optimized out. This problem was noticed under OS X with release builds only. It seems that clang will optimize the checks in the renderer. --- codemp/client/cl_cgameapi.cpp | 61 ++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 5 deletions(-) diff --git a/codemp/client/cl_cgameapi.cpp b/codemp/client/cl_cgameapi.cpp index 4d1d0bbae9..9e1c1c56eb 100644 --- a/codemp/client/cl_cgameapi.cpp +++ b/codemp/client/cl_cgameapi.cpp @@ -441,6 +441,8 @@ static int CL_PrecisionTimerEnd( void *p ) { static void CL_RMG_Init( int /* terrainID */, const char * /* terrainInfo */ ) { } static qboolean CGFX_PlayBoltedEffectID( int id, vec3_t org, void *ghoul2, const int boltNum, const int entNum, const int modelNum, int iLooptime, qboolean isRelative ) { + if ( !ghoul2 ) return qfalse; + CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2); int boltInfo=0; if ( re->G2API_AttachEnt( &boltInfo, g2, modelNum, boltNum, entNum, modelNum ) ) @@ -476,23 +478,28 @@ static void CL_G2API_ListModelBones( void *ghlInfo, int frame ) { } static void CL_G2API_SetGhoul2ModelIndexes( void *ghoul2, qhandle_t *modelList, qhandle_t *skinList ) { + if ( !ghoul2 ) return; re->G2API_SetGhoul2ModelIndexes( *((CGhoul2Info_v *)ghoul2), modelList, skinList ); } static qboolean CL_G2API_HaveWeGhoul2Models( void *ghoul2) { + if ( !ghoul2 ) return qfalse; return re->G2API_HaveWeGhoul2Models( *((CGhoul2Info_v *)ghoul2) ); } static qboolean CL_G2API_GetBoltMatrix( void *ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix, const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale ) { + if ( !ghoul2 ) return qfalse; return re->G2API_GetBoltMatrix( *((CGhoul2Info_v *)ghoul2), modelIndex, boltIndex, matrix, angles, position, frameNum, modelList, scale ); } static qboolean CL_G2API_GetBoltMatrix_NoReconstruct( void *ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix, const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale ) { + if ( !ghoul2 ) return qfalse; re->G2API_BoltMatrixReconstruction( qfalse ); return re->G2API_GetBoltMatrix( *((CGhoul2Info_v *)ghoul2), modelIndex, boltIndex, matrix, angles, position, frameNum, modelList, scale ); } static qboolean CL_G2API_GetBoltMatrix_NoRecNoRot( void *ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix, const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale ) { + if ( !ghoul2 ) return qfalse; re->G2API_BoltMatrixSPMethod( qtrue ); return re->G2API_GetBoltMatrix( *((CGhoul2Info_v *)ghoul2), modelIndex, boltIndex, matrix, angles, position, frameNum, modelList, scale ); } @@ -505,15 +512,18 @@ static int CL_G2API_InitGhoul2Model( void **ghoul2Ptr, const char *fileName, int } static qboolean CL_G2API_SetSkin( void *ghoul2, int modelIndex, qhandle_t customSkin, qhandle_t renderSkin ) { + if ( !ghoul2 ) return qfalse; CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2); return re->G2API_SetSkin( g2, modelIndex, customSkin, renderSkin ); } static void CL_G2API_CollisionDetect( CollisionRecord_t *collRecMap, void* ghoul2, const vec3_t angles, const vec3_t position, int frameNumber, int entNum, vec3_t rayStart, vec3_t rayEnd, vec3_t scale, int traceFlags, int useLod, float fRadius ) { + if ( !ghoul2 ) return; re->G2API_CollisionDetect( collRecMap, *((CGhoul2Info_v *)ghoul2), angles, position, frameNumber, entNum, rayStart, rayEnd, scale, G2VertSpaceClient, traceFlags, useLod, fRadius ); } static void CL_G2API_CollisionDetectCache( CollisionRecord_t *collRecMap, void* ghoul2, const vec3_t angles, const vec3_t position, int frameNumber, int entNum, vec3_t rayStart, vec3_t rayEnd, vec3_t scale, int traceFlags, int useLod, float fRadius ) { + if ( !ghoul2 ) return; re->G2API_CollisionDetectCache( collRecMap, *((CGhoul2Info_v *)ghoul2), angles, position, frameNumber, entNum, rayStart, rayEnd, scale, G2VertSpaceClient, traceFlags, useLod, fRadius ); } @@ -525,19 +535,23 @@ static void CL_G2API_CleanGhoul2Models( void **ghoul2Ptr ) { } static qboolean CL_G2API_SetBoneAngles( void *ghoul2, int modelIndex, const char *boneName, const vec3_t angles, const int flags, const int up, const int right, const int forward, qhandle_t *modelList, int blendTime , int currentTime ) { + if ( !ghoul2 ) return qfalse; return re->G2API_SetBoneAngles( *((CGhoul2Info_v *)ghoul2), modelIndex, boneName, angles, flags, (const Eorientations)up, (const Eorientations)right, (const Eorientations)forward, modelList, blendTime , currentTime ); } static qboolean CL_G2API_SetBoneAnim( void *ghoul2, const int modelIndex, const char *boneName, const int startFrame, const int endFrame, const int flags, const float animSpeed, const int currentTime, const float setFrame, const int blendTime ) { + if ( !ghoul2 ) return qfalse; return re->G2API_SetBoneAnim( *((CGhoul2Info_v *)ghoul2), modelIndex, boneName, startFrame, endFrame, flags, animSpeed, currentTime, setFrame, blendTime ); } static qboolean CL_G2API_GetBoneAnim( void *ghoul2, const char *boneName, const int currentTime, float *currentFrame, int *startFrame, int *endFrame, int *flags, float *animSpeed, int *modelList, const int modelIndex ) { + if ( !ghoul2 ) return qfalse; CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2); return re->G2API_GetBoneAnim( g2, modelIndex, boneName, currentTime, currentFrame, startFrame, endFrame, flags, animSpeed, modelList ); } static qboolean CL_G2API_GetBoneFrame( void *ghoul2, const char *boneName, const int currentTime, float *currentFrame, int *modelList, const int modelIndex ) { + if ( !ghoul2 ) return qfalse; CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2); int iDontCare1 = 0, iDontCare2 = 0, iDontCare3 = 0; float fDontCare1 = 0; @@ -546,6 +560,12 @@ static qboolean CL_G2API_GetBoneFrame( void *ghoul2, const char *boneName, const } static void CL_G2API_GetGLAName( void *ghoul2, int modelIndex, char *fillBuf ) { + if ( !ghoul2 ) + { + fillBuf[0] = '\0'; + return; + } + char *tmp = re->G2API_GetGLAName( *((CGhoul2Info_v *)ghoul2), modelIndex ); if ( tmp ) strcpy( fillBuf, tmp ); @@ -554,10 +574,13 @@ static void CL_G2API_GetGLAName( void *ghoul2, int modelIndex, char *fillBuf ) { } static int CL_G2API_CopyGhoul2Instance( void *g2From, void *g2To, int modelIndex ) { + if ( !g2From || !g2To ) return 0; + return re->G2API_CopyGhoul2Instance( *((CGhoul2Info_v *)g2From), *((CGhoul2Info_v *)g2To), modelIndex ); } static void CL_G2API_CopySpecificGhoul2Model( void *g2From, int modelFrom, void *g2To, int modelTo ) { + if ( !g2From || !g2To) return; re->G2API_CopySpecificG2Model( *((CGhoul2Info_v *)g2From), modelFrom, *((CGhoul2Info_v *)g2To), modelTo ); } @@ -565,6 +588,7 @@ static void CL_G2API_DuplicateGhoul2Instance( void *g2From, void **g2To ) { #ifdef _FULL_G2_LEAK_CHECKING g_G2AllocServer = 0; #endif + if ( !g2From || !g2To ) return; re->G2API_DuplicateGhoul2Instance( *((CGhoul2Info_v *)g2From), (CGhoul2Info_v **)g2To ); } @@ -580,12 +604,15 @@ static qboolean CL_G2API_RemoveGhoul2Model( void *ghlInfo, int modelIndex ) { } static qboolean CL_G2API_SkinlessModel( void *ghlInfo, int modelIndex ) { + if ( !ghlInfo ) return qfalse; + CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghlInfo); return re->G2API_SkinlessModel( g2, modelIndex ); } static int CL_G2API_GetNumGoreMarks( void *ghlInfo, int modelIndex ) { #ifdef _G2_GORE + if ( !ghlInfo ) return 0; CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghlInfo); return re->G2API_GetNumGoreMarks( g2, modelIndex ); #else @@ -595,51 +622,62 @@ static int CL_G2API_GetNumGoreMarks( void *ghlInfo, int modelIndex ) { static void CL_G2API_AddSkinGore( void *ghlInfo, SSkinGoreData *gore ) { #ifdef _G2_GORE + if ( !ghlInfo ) return; re->G2API_AddSkinGore( *((CGhoul2Info_v *)ghlInfo), *(SSkinGoreData *)gore ); #endif } static void CL_G2API_ClearSkinGore( void *ghlInfo ) { #ifdef _G2_GORE + if ( !ghlInfo ) return; re->G2API_ClearSkinGore( *((CGhoul2Info_v *)ghlInfo) ); #endif } static int CL_G2API_Ghoul2Size( void *ghlInfo ) { + if ( !ghlInfo ) return 0; return re->G2API_Ghoul2Size( *((CGhoul2Info_v *)ghlInfo) ); } static int CL_G2API_AddBolt( void *ghoul2, int modelIndex, const char *boneName ) { + if ( !ghoul2 ) return 0; return re->G2API_AddBolt( *((CGhoul2Info_v *)ghoul2), modelIndex, boneName ); } static qboolean CL_G2API_AttachEnt( int *boltInfo, void *ghlInfoTo, int toBoltIndex, int entNum, int toModelNum ) { + if ( !ghlInfoTo ) return qfalse; CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghlInfoTo); return re->G2API_AttachEnt( boltInfo, g2, 0, toBoltIndex, entNum, toModelNum ); } static void CL_G2API_SetBoltInfo( void *ghoul2, int modelIndex, int boltInfo ) { + if ( !ghoul2 ) return; re->G2API_SetBoltInfo( *((CGhoul2Info_v *)ghoul2), modelIndex, boltInfo ); } static qboolean CL_G2API_SetRootSurface( void *ghoul2, const int modelIndex, const char *surfaceName ) { + if ( !ghoul2 ) return qfalse; return re->G2API_SetRootSurface( *((CGhoul2Info_v *)ghoul2), modelIndex, surfaceName ); } static qboolean CL_G2API_SetSurfaceOnOff( void *ghoul2, const char *surfaceName, const int flags ) { + if ( !ghoul2 ) return qfalse; return re->G2API_SetSurfaceOnOff( *((CGhoul2Info_v *)ghoul2), surfaceName, flags ); } static qboolean CL_G2API_SetNewOrigin( void *ghoul2, const int boltIndex ) { + if ( !ghoul2 ) return qfalse; return re->G2API_SetNewOrigin( *((CGhoul2Info_v *)ghoul2), boltIndex ); } static qboolean CL_G2API_DoesBoneExist( void *ghoul2, int modelIndex, const char *boneName ) { + if ( !ghoul2 ) return qfalse; CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2); return re->G2API_DoesBoneExist( g2, modelIndex, boneName ); } static int CL_G2API_GetSurfaceRenderStatus( void *ghoul2, const int modelIndex, const char *surfaceName ) { + if ( !ghoul2 ) return -1; CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2); return re->G2API_GetSurfaceRenderStatus( g2, modelIndex, surfaceName ); } @@ -653,13 +691,15 @@ static void CL_G2API_SetTime( int time, int clock ) { } static void CL_G2API_AbsurdSmoothing( void *ghoul2, qboolean status ) { + if ( !ghoul2 ) return; CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2); re->G2API_AbsurdSmoothing( g2, status ); } static void CL_G2API_SetRagDoll( void *ghoul2, sharedRagDollParams_t *params ) { - CRagDollParams rdParams; + if ( !ghoul2 ) return; + CRagDollParams rdParams; if ( !params ) { re->G2API_ResetRagDoll( *((CGhoul2Info_v *)ghoul2) ); return; @@ -688,11 +728,10 @@ static void CL_G2API_SetRagDoll( void *ghoul2, sharedRagDollParams_t *params ) { } static void CL_G2API_AnimateG2Models( void *ghoul2, int time, sharedRagDollUpdateParams_t *params ) { - CRagDollUpdateParams rduParams; - - if ( !params ) - return; + if ( !ghoul2 ) return; + if ( !params ) return; + CRagDollUpdateParams rduParams; VectorCopy( params->angles, rduParams.angles ); VectorCopy( params->position, rduParams.position ); VectorCopy( params->scale, rduParams.scale ); @@ -705,43 +744,53 @@ static void CL_G2API_AnimateG2Models( void *ghoul2, int time, sharedRagDollUpdat } static qboolean CL_G2API_RagPCJConstraint( void *ghoul2, const char *boneName, vec3_t min, vec3_t max ) { + if ( !ghoul2 ) return qfalse; return re->G2API_RagPCJConstraint( *((CGhoul2Info_v *)ghoul2), boneName, min, max ); } static qboolean CL_G2API_RagPCJGradientSpeed( void *ghoul2, const char *boneName, const float speed ) { + if ( !ghoul2 ) return qfalse; return re->G2API_RagPCJGradientSpeed( *((CGhoul2Info_v *)ghoul2), boneName, speed ); } static qboolean CL_G2API_RagEffectorGoal( void *ghoul2, const char *boneName, vec3_t pos ) { + if ( !ghoul2 ) return qfalse; return re->G2API_RagEffectorGoal( *((CGhoul2Info_v *)ghoul2), boneName, pos ); } static qboolean CL_G2API_GetRagBonePos( void *ghoul2, const char *boneName, vec3_t pos, vec3_t entAngles, vec3_t entPos, vec3_t entScale ) { + if ( !ghoul2 ) return qfalse; return re->G2API_GetRagBonePos( *((CGhoul2Info_v *)ghoul2), boneName, pos, entAngles, entPos, entScale ); } static qboolean CL_G2API_RagEffectorKick( void *ghoul2, const char *boneName, vec3_t velocity ) { + if ( !ghoul2 ) return qfalse; return re->G2API_RagEffectorKick( *((CGhoul2Info_v *)ghoul2), boneName, velocity ); } static qboolean CL_G2API_RagForceSolve( void *ghoul2, qboolean force ) { + if ( !ghoul2 ) return qfalse; return re->G2API_RagForceSolve( *((CGhoul2Info_v *)ghoul2), force ); } static qboolean CL_G2API_SetBoneIKState( void *ghoul2, int time, const char *boneName, int ikState, sharedSetBoneIKStateParams_t *params ) { + if ( !ghoul2 ) return qfalse; return re->G2API_SetBoneIKState( *((CGhoul2Info_v *)ghoul2), time, boneName, ikState, params ); } static qboolean CL_G2API_IKMove( void *ghoul2, int time, sharedIKMoveParams_t *params ) { + if ( !ghoul2 ) return qfalse; return re->G2API_IKMove( *((CGhoul2Info_v *)ghoul2), time, params ); } static qboolean CL_G2API_RemoveBone( void *ghoul2, const char *boneName, int modelIndex ) { + if ( !ghoul2 ) return qfalse; CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2); return re->G2API_RemoveBone( g2, modelIndex, boneName ); } static void CL_G2API_AttachInstanceToEntNum( void *ghoul2, int entityNum, qboolean server ) { + if ( !ghoul2 ) return; re->G2API_AttachInstanceToEntNum( *((CGhoul2Info_v *)ghoul2), entityNum, server ); } @@ -754,11 +803,13 @@ static void CL_G2API_CleanEntAttachments( void ) { } static qboolean CL_G2API_OverrideServer( void *serverInstance ) { + if ( !serverInstance ) return qfalse; CGhoul2Info_v &g2 = *((CGhoul2Info_v *)serverInstance); return re->G2API_OverrideServerWithClientData( g2, 0 ); } static void CL_G2API_GetSurfaceName( void *ghoul2, int surfNumber, int modelIndex, char *fillBuf ) { + if ( !ghoul2 ) return; CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2); char *tmp = re->G2API_GetSurfaceName( g2, modelIndex, surfNumber ); strcpy( fillBuf, tmp ); From bb6dc3cff26273eb612517bba04b180552cecf54 Mon Sep 17 00:00:00 2001 From: David Jones Date: Mon, 18 Jan 2016 22:38:59 +0000 Subject: [PATCH 135/445] Remove unused characters.h files --- code/game/characters.h | 52 ------------------------ codeJK2/cgame/cg_main.cpp | 1 - codeJK2/game/CMakeLists.txt | 1 - codeJK2/game/NPC_reactions.cpp | 1 - codeJK2/game/characters.h | 74 ---------------------------------- 5 files changed, 129 deletions(-) delete mode 100644 code/game/characters.h delete mode 100644 codeJK2/game/characters.h diff --git a/code/game/characters.h b/code/game/characters.h deleted file mode 100644 index 53ff022550..0000000000 --- a/code/game/characters.h +++ /dev/null @@ -1,52 +0,0 @@ -typedef enum //# characters_e -{ - //HazTeam Alpha - //CHARACTER_MUNRO = 0, - CHARACTER_FOSTER = 0, - CHARACTER_TELSIA, - CHARACTER_BIESSMAN, - CHARACTER_CHANG, - CHARACTER_CHELL, - CHARACTER_JUROT, - //HazTeam Beta - CHARACTER_LAIRD, - CHARACTER_KENN, - CHARACTER_OVIEDO, - CHARACTER_ODELL, - CHARACTER_NELSON, - CHARACTER_JAWORSKI, - CHARACTER_CSATLOS, - //Senior Crew - CHARACTER_JANEWAY, - CHARACTER_CHAKOTAY, - CHARACTER_TUVOK, - CHARACTER_TUVOKHAZ, - CHARACTER_TORRES, - CHARACTER_PARIS, - CHARACTER_KIM, - CHARACTER_DOCTOR, - CHARACTER_SEVEN, - CHARACTER_SEVENHAZ, - CHARACTER_NEELIX, - //Other Crew - CHARACTER_PELLETIER, - //Generic Crew - CHARACTER_CREWMAN, - //CHARACTER_ENSIGN, - CHARACTER_LT, - CHARACTER_COMM, - CHARACTER_CAPT, - CHARACTER_GENERIC1, - CHARACTER_GENERIC2, - CHARACTER_GENERIC3, - CHARACTER_GENERIC4, - //# #eol - CHARACTER_NUM_CHARS -} characters_t; - -typedef struct -{ - char *name; - char *sound; - sfxHandle_t soundIndex; -} characterName_t; diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index d8cc65eee2..c2c91b4f56 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -26,7 +26,6 @@ along with this program; if not, see . #include "FxScheduler.h" #include "../../code/client/vmachine.h" -#include "../game/characters.h" #include "../../code/qcommon/sstring.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h diff --git a/codeJK2/game/CMakeLists.txt b/codeJK2/game/CMakeLists.txt index 9876f31cbe..669e2c1d90 100644 --- a/codeJK2/game/CMakeLists.txt +++ b/codeJK2/game/CMakeLists.txt @@ -137,7 +137,6 @@ set(JK2SPGameGameFiles "${JK2SPDir}/game/bset.h" "${JK2SPDir}/game/bstate.h" "${JK2SPDir}/game/channels.h" - "${JK2SPDir}/game/characters.h" "${JK2SPDir}/game/dmstates.h" "${JK2SPDir}/game/events.h" "${JK2SPDir}/game/fields.h" diff --git a/codeJK2/game/NPC_reactions.cpp b/codeJK2/game/NPC_reactions.cpp index f6dd0fa29c..f45acce47e 100644 --- a/codeJK2/game/NPC_reactions.cpp +++ b/codeJK2/game/NPC_reactions.cpp @@ -28,7 +28,6 @@ along with this program; if not, see . #include "b_local.h" #include "anims.h" #include "g_functions.h" -#include "characters.h" #include "wp_saber.h" extern qboolean G_CheckForStrongAttackMomentum( gentity_t *self ); diff --git a/codeJK2/game/characters.h b/codeJK2/game/characters.h deleted file mode 100644 index cae5961b26..0000000000 --- a/codeJK2/game/characters.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -=========================================================================== -Copyright (C) 2000 - 2013, Raven Software, Inc. -Copyright (C) 2001 - 2013, Activision, Inc. -Copyright (C) 2013 - 2015, OpenJK contributors - -This file is part of the OpenJK source code. - -OpenJK is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License version 2 as -published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, see . -=========================================================================== -*/ - -typedef enum //# characters_e -{ - //HazTeam Alpha - //CHARACTER_MUNRO = 0, - CHARACTER_FOSTER = 0, - CHARACTER_TELSIA, - CHARACTER_BIESSMAN, - CHARACTER_CHANG, - CHARACTER_CHELL, - CHARACTER_JUROT, - //HazTeam Beta - CHARACTER_LAIRD, - CHARACTER_KENN, - CHARACTER_OVIEDO, - CHARACTER_ODELL, - CHARACTER_NELSON, - CHARACTER_JAWORSKI, - CHARACTER_CSATLOS, - //Senior Crew - CHARACTER_JANEWAY, - CHARACTER_CHAKOTAY, - CHARACTER_TUVOK, - CHARACTER_TUVOKHAZ, - CHARACTER_TORRES, - CHARACTER_PARIS, - CHARACTER_KIM, - CHARACTER_DOCTOR, - CHARACTER_SEVEN, - CHARACTER_SEVENHAZ, - CHARACTER_NEELIX, - //Other Crew - CHARACTER_PELLETIER, - //Generic Crew - CHARACTER_CREWMAN, - //CHARACTER_ENSIGN, - CHARACTER_LT, - CHARACTER_COMM, - CHARACTER_CAPT, - CHARACTER_GENERIC1, - CHARACTER_GENERIC2, - CHARACTER_GENERIC3, - CHARACTER_GENERIC4, - //# #eol - CHARACTER_NUM_CHARS -} characters_t; - -typedef struct -{ - char *name; - char *sound; - sfxHandle_t soundIndex; -} characterName_t; From c20992719a625e4635dad8056fbb09b8f74570d1 Mon Sep 17 00:00:00 2001 From: David Jones Date: Mon, 18 Jan 2016 22:42:50 +0000 Subject: [PATCH 136/445] Removed some using namespace std --- code/qcommon/hstring.h | 2 -- codeJK2/cgame/cg_credits.cpp | 16 ++++++++-------- codeJK2/cgame/cg_main.cpp | 2 +- codeJK2/game/NPC_combat.cpp | 2 +- codeJK2/game/Q3_Registers.h | 4 ++-- codeJK2/game/g_local.h | 4 ++-- codeJK2/game/g_navigator.cpp | 16 ++++++++-------- codeJK2/game/g_navigator.h | 14 +++++++------- codeJK2/game/g_ref.cpp | 6 +++--- codeJK2/game/g_savegame.cpp | 6 +++--- codeJK2/game/g_spawn.cpp | 2 +- codeJK2/icarus/Sequencer.cpp | 2 +- codeJK2/icarus/blockstream.h | 2 +- codeJK2/icarus/instance.h | 6 +++--- codeJK2/icarus/interpreter.h | 8 ++++---- codeJK2/icarus/sequence.h | 6 +++--- codeJK2/icarus/sequencer.h | 8 ++++---- codeJK2/icarus/taskmanager.h | 12 ++++++------ codeJK2/icarus/tokenizer.h | 4 +--- 19 files changed, 59 insertions(+), 63 deletions(-) diff --git a/code/qcommon/hstring.h b/code/qcommon/hstring.h index d25fec1a14..ff5ebd6853 100644 --- a/code/qcommon/hstring.h +++ b/code/qcommon/hstring.h @@ -8,8 +8,6 @@ #include #pragma warning (pop) -using namespace std; - class hstring { int mId; diff --git a/codeJK2/cgame/cg_credits.cpp b/codeJK2/cgame/cg_credits.cpp index 03c3c67096..da046afa57 100644 --- a/codeJK2/cgame/cg_credits.cpp +++ b/codeJK2/cgame/cg_credits.cpp @@ -42,7 +42,7 @@ vec4_t gv4Color = {0}; struct StringAndSize_t { int iStrLenPixels; - string str; + std::string str; StringAndSize_t() { @@ -86,7 +86,7 @@ struct CreditCard_t { int iTime; StringAndSize_t strTitle; - vector vstrText; + std::vector vstrText; CreditCard_t() { @@ -98,12 +98,12 @@ struct CreditLine_t { int iLine; StringAndSize_t strText; - vector vstrText; + std::vector vstrText; bool bDotted; }; -typedef list CreditLines_t; -typedef list CreditCards_t; +typedef std::list CreditLines_t; +typedef std::list CreditCards_t; struct CreditData_t { @@ -182,7 +182,7 @@ static const char *UpperCaseFirstLettersOnly( const char *psTest ) return sTemp; } -static const char *GetSubString(string &strResult) +static const char *GetSubString(std::string &strResult) { static char sTemp[MAX_LINE_BYTES]; @@ -406,7 +406,7 @@ void CG_Credits_Init( const char *psStripReference, vec4_t *pv4Color ) CreditLine.iLine = iLineNumber; CreditLine.bDotted = true; - string strResult(sLine); + std::string strResult(sLine); const char *p; while ((p=GetSubString(strResult)) != NULL) { @@ -449,7 +449,7 @@ void CG_Credits_Init( const char *psStripReference, vec4_t *pv4Color ) { CreditCard_t CreditCard; - string strResult(sLine); + std::string strResult(sLine); const char *p; while ((p=GetSubString(strResult)) != NULL) { diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index c2c91b4f56..c365fd9369 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -29,7 +29,7 @@ along with this program; if not, see . #include "../../code/qcommon/sstring.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h -typedef map< sstring_t, unsigned char, less, allocator< unsigned char > > namePrecache_m; +typedef std::map< sstring_t, unsigned char, std::less, std::allocator< unsigned char > > namePrecache_m; extern namePrecache_m *as_preCacheMap; extern void CG_RegisterNPCCustomSounds( clientInfo_t *ci ); extern qboolean G_AddSexToMunroString ( char *string, qboolean qDoBoth ); diff --git a/codeJK2/game/NPC_combat.cpp b/codeJK2/game/NPC_combat.cpp index 003a755e08..3997cd541c 100644 --- a/codeJK2/game/NPC_combat.cpp +++ b/codeJK2/game/NPC_combat.cpp @@ -2440,7 +2440,7 @@ NPC_CollectCombatPoints ------------------------- */ -typedef map< float, int > combatPoint_m; +typedef std::map< float, int > combatPoint_m; static int NPC_CollectCombatPoints( const vec3_t origin, const float radius, combatPoint_m &points, const int flags ) { diff --git a/codeJK2/game/Q3_Registers.h b/codeJK2/game/Q3_Registers.h index dc264fc9cd..f321bf3934 100644 --- a/codeJK2/game/Q3_Registers.h +++ b/codeJK2/game/Q3_Registers.h @@ -25,8 +25,8 @@ along with this program; if not, see . #define MAX_VARIABLES 32 -typedef map < string, string > varString_m; -typedef map < string, float > varFloat_m; +typedef std::map < std::string, std::string > varString_m; +typedef std::map < std::string, float > varFloat_m; extern varString_m varStrings; extern varFloat_m varFloats; diff --git a/codeJK2/game/g_local.h b/codeJK2/game/g_local.h index 4a2dedb3c0..1f09fa5dd0 100644 --- a/codeJK2/game/g_local.h +++ b/codeJK2/game/g_local.h @@ -558,8 +558,8 @@ typedef struct pscript_s long length; } pscript_t; -typedef map < string, int, less, allocator > entlist_t; -typedef map < string, pscript_t*, less, allocator > bufferlist_t; +typedef std::map < std::string, int, std::less, std::allocator > entlist_t; +typedef std::map < std::string, pscript_t*, std::less, std::allocator > bufferlist_t; extern char *G_NewString( const char *string ); diff --git a/codeJK2/game/g_navigator.cpp b/codeJK2/game/g_navigator.cpp index b7f9273fad..237202aeb6 100644 --- a/codeJK2/game/g_navigator.cpp +++ b/codeJK2/game/g_navigator.cpp @@ -612,7 +612,7 @@ bool CNavigator::Load( const char *filename, int checksum ) gi.FS_Read( &failedEdges, sizeof( failedEdges ), file ); for ( int j = 0; j < MAX_FAILED_EDGES; j++ ) { - m_edgeLookupMap.insert(pair(failedEdges[j].startID, j)); + m_edgeLookupMap.insert(std::pair(failedEdges[j].startID, j)); } @@ -931,7 +931,7 @@ ShowEdges ------------------------- */ -typedef map < int, bool > drawMap_m; +typedef std::map < int, bool > drawMap_m; void CNavigator::ShowEdges( void ) { @@ -1653,7 +1653,7 @@ void CNavigator::ShowPath( int start, int end ) } } -static map CheckedNodes; +static std::map CheckedNodes; void CNavigator::ClearCheckedNodes( void ) { CheckedNodes.clear(); @@ -1663,7 +1663,7 @@ byte CNavigator::CheckedNode(int wayPoint,int ent) { assert(wayPoint>=0&&wayPoint=0&&ent::iterator f=CheckedNodes.find(wayPoint*MAX_GENTITIES+ent); + std::map::iterator f=CheckedNodes.find(wayPoint*MAX_GENTITIES+ent); if (f!=CheckedNodes.end()) { return (*f).second; @@ -1838,7 +1838,7 @@ int CNavigator::EdgeFailed( int startID, int endID ) { //OPTIMIZED WAY (bjg 01/02) //find in lookup map - pair findValue; + std::pair findValue; findValue = m_edgeLookupMap.equal_range(startID); while ( findValue.first != findValue.second ) { @@ -1947,7 +1947,7 @@ void CNavigator::AddFailedEdge( int entID, int startID, int endID ) //Check one second from now to see if it's clear failedEdges[j].checkTime = level.time + CHECK_FAILED_EDGE_INTERVAL + Q_irand( 0, 1000 ); - m_edgeLookupMap.insert(pair(startID, j)); + m_edgeLookupMap.insert(std::pair(startID, j)); /* //DISABLED this for now, makes people stand around too long when @@ -2667,7 +2667,7 @@ CPriorityQueue::~CPriorityQueue() ////////////////////////////////////////////////////////////////// CEdge* CPriorityQueue::Find(int npNum) { - for(vector::iterator HeapIter=mHeap.begin(); HeapIter!=mHeap.end(); HeapIter++) + for(std::vector::iterator HeapIter=mHeap.begin(); HeapIter!=mHeap.end(); HeapIter++) { if ((*HeapIter)->m_first == npNum) { @@ -2714,7 +2714,7 @@ void CPriorityQueue::Push(CEdge* theEdge ) ////////////////////////////////////////////////////////////////// void CPriorityQueue::Update( CEdge* edge ) { - for(vector::iterator i=mHeap.begin(); i!=mHeap.end(); i++) + for(std::vector::iterator i=mHeap.begin(); i!=mHeap.end(); i++) { if( (*i)->m_first == edge->m_first ) { //Found node - resort from this position in the mHeap diff --git a/codeJK2/game/g_navigator.h b/codeJK2/game/g_navigator.h index a4b91662aa..109f59c97d 100644 --- a/codeJK2/game/g_navigator.h +++ b/codeJK2/game/g_navigator.h @@ -43,8 +43,8 @@ along with this program; if not, see . #define NAV_HEADER_ID INT_ID('J','N','V','5') #define NODE_HEADER_ID INT_ID('N','O','D','E') -typedef multimap EdgeMultimap; -typedef multimap::iterator EdgeMultimapIt; +typedef std::multimap EdgeMultimap; +typedef std::multimap::iterator EdgeMultimapIt; /* @@ -82,7 +82,7 @@ class CNode unsigned char flags; } edge_t; - typedef vector< edge_t > edge_v; + typedef std::vector< edge_t > edge_v; public: @@ -147,8 +147,8 @@ typedef struct failedEdge_e class CNavigator { - typedef vector < CNode * > node_v; - typedef list < CEdge > edge_l; + typedef std::vector < CNode * > node_v; + typedef std::list < CEdge > edge_l; #if __NEWCOLLECT @@ -158,7 +158,7 @@ class CNavigator unsigned int distance; }; - typedef list < nodeList_t > nodeChain_l; + typedef std::list < nodeList_t > nodeChain_l; #endif //__NEWCOLLECT @@ -283,7 +283,7 @@ class CPriorityQueue // DATA //-------------------------------------------------------------- private: - vector mHeap; + std::vector mHeap; }; #endif //__G_NAVIGATOR__ diff --git a/codeJK2/game/g_ref.cpp b/codeJK2/game/g_ref.cpp index 53f54189f6..16c071e74b 100644 --- a/codeJK2/game/g_ref.cpp +++ b/codeJK2/game/g_ref.cpp @@ -29,8 +29,8 @@ along with this program; if not, see . #define TAG_GENERIC_NAME "__WORLD__" //If a designer chooses this name, cut a finger off as an example to the others -typedef vector < reference_tag_t * > refTag_v; -typedef map < string, reference_tag_t * > refTag_m; +typedef std::vector < reference_tag_t * > refTag_v; +typedef std::map < std::string, reference_tag_t * > refTag_m; typedef struct tagOwner_s { @@ -38,7 +38,7 @@ typedef struct tagOwner_s refTag_m tagMap; } tagOwner_t; -typedef map < string, tagOwner_t * > refTagOwner_m; +typedef std::map < std::string, tagOwner_t * > refTagOwner_m; refTagOwner_m refTagOwnerMap; diff --git a/codeJK2/game/g_savegame.cpp b/codeJK2/game/g_savegame.cpp index 22030ea9c8..02b578e497 100644 --- a/codeJK2/game/g_savegame.cpp +++ b/codeJK2/game/g_savegame.cpp @@ -152,7 +152,7 @@ static const field_t savefields_gClient[] = }; -static list* strList = NULL; +static std::list* strList = NULL; /////////// char * ///////////// @@ -443,7 +443,7 @@ void EnumerateField(const field_t *pField, byte *pbBase) static void EnumerateFields(const field_t *pFields, byte *pbData, unsigned int ulChid, size_t iLen) { - strList = new list; + strList = new std::list; // enumerate all the fields... // @@ -462,7 +462,7 @@ static void EnumerateFields(const field_t *pFields, byte *pbData, unsigned int u // save out any associated strings.. // - for (list::iterator it = strList->begin(); it != strList->end(); ++it) + for (std::list::iterator it = strList->begin(); it != strList->end(); ++it) { gi.AppendToSaveGame(INT_ID('S','T','R','G'), (void*)it->c_str(), it->length()+1); } diff --git a/codeJK2/game/g_spawn.cpp b/codeJK2/game/g_spawn.cpp index 04dad050f2..927dbcab66 100644 --- a/codeJK2/game/g_spawn.cpp +++ b/codeJK2/game/g_spawn.cpp @@ -39,7 +39,7 @@ char spawnVarChars[MAX_SPAWN_VARS_CHARS]; #include "../../code/qcommon/sstring.h" //NOTENOTE: Be sure to change the mirrored code in cgmain.cpp -typedef map< sstring_t, unsigned char, less, allocator< unsigned char > > namePrecache_m; +typedef std::map< sstring_t, unsigned char, std::less, std::allocator< unsigned char > > namePrecache_m; namePrecache_m *as_preCacheMap; qboolean G_SpawnString( const char *key, const char *defaultString, char **out ) { diff --git a/codeJK2/icarus/Sequencer.cpp b/codeJK2/icarus/Sequencer.cpp index 3fcfa75d38..44126a1a74 100644 --- a/codeJK2/icarus/Sequencer.cpp +++ b/codeJK2/icarus/Sequencer.cpp @@ -190,7 +190,7 @@ Deletes parsing stream */ void CSequencer::DeleteStream( bstream_t *bstream ) { - vector::iterator finder = std::find(m_streamsCreated.begin(), m_streamsCreated.end(), bstream); + std::vector::iterator finder = std::find(m_streamsCreated.begin(), m_streamsCreated.end(), bstream); if(finder != m_streamsCreated.end()) { m_streamsCreated.erase(finder); diff --git a/codeJK2/icarus/blockstream.h b/codeJK2/icarus/blockstream.h index ac376bea75..1e5643dece 100644 --- a/codeJK2/icarus/blockstream.h +++ b/codeJK2/icarus/blockstream.h @@ -115,7 +115,7 @@ class CBlockMember class CBlock { - typedef vector< CBlockMember * > blockMember_v; + typedef std::vector< CBlockMember * > blockMember_v; public: diff --git a/codeJK2/icarus/instance.h b/codeJK2/icarus/instance.h index 409cfa2e64..9d5667694c 100644 --- a/codeJK2/icarus/instance.h +++ b/codeJK2/icarus/instance.h @@ -35,9 +35,9 @@ class ICARUS_Instance { public: - typedef list< CSequence * > sequence_l; - typedef list< CSequencer * > sequencer_l; - typedef map < string, unsigned char > signal_m; + typedef std::list< CSequence * > sequence_l; + typedef std::list< CSequencer * > sequencer_l; + typedef std::map < std::string, unsigned char > signal_m; ICARUS_Instance( void ); virtual ~ICARUS_Instance( void ); diff --git a/codeJK2/icarus/interpreter.h b/codeJK2/icarus/interpreter.h index 89e1517969..e5e9ec0e61 100644 --- a/codeJK2/icarus/interpreter.h +++ b/codeJK2/icarus/interpreter.h @@ -139,8 +139,8 @@ typedef struct variable_s void *data; } variable_t; -typedef map< string, variable_t * > variable_m; -typedef vector < variable_t * > variable_v; +typedef std::map< std::string, variable_t * > variable_m; +typedef std::vector < variable_t * > variable_v; //CInterpreter @@ -229,8 +229,8 @@ class CInterpreter variable_v m_vars; variable_m m_varMap; - string m_sCurrentLine; // used in IBIze error reporting for more clarity - string m_sCurrentFile; // full-pathed name of .TXT file (needed because of above, which affects parsestreams) + std::string m_sCurrentLine; // used in IBIze error reporting for more clarity + std::string m_sCurrentFile; // full-pathed name of .TXT file (needed because of above, which affects parsestreams) int m_iCurrentLine; // also needed now because of 'm_sCurrentLine' int m_iBadCBlockNumber; // used for final app return code (NZ = err) diff --git a/codeJK2/icarus/sequence.h b/codeJK2/icarus/sequence.h index f776e55c73..98a1ff8e69 100644 --- a/codeJK2/icarus/sequence.h +++ b/codeJK2/icarus/sequence.h @@ -34,9 +34,9 @@ class ICARUS_Instance; class CSequence { - typedef list < CSequence * > sequence_l; - typedef map < int, CSequence *> sequenceID_m; - typedef list < CBlock * > block_l; + typedef std::list < CSequence * > sequence_l; + typedef std::map < int, CSequence *> sequenceID_m; + typedef std::list < CBlock * > block_l; public: diff --git a/codeJK2/icarus/sequencer.h b/codeJK2/icarus/sequencer.h index 28dc0c7ae4..ec52d3f772 100644 --- a/codeJK2/icarus/sequencer.h +++ b/codeJK2/icarus/sequencer.h @@ -82,9 +82,9 @@ class ICARUS_Instance; class CSequencer { - typedef map < int, CSequence * > sequenceID_m; - typedef list < CSequence * > sequence_l; - typedef map < CTaskGroup *, CSequence * > taskSequence_m; + typedef std::map < int, CSequence * > sequenceID_m; + typedef std::list < CSequence * > sequence_l; + typedef std::map < CTaskGroup *, CSequence * > taskSequence_m; public: @@ -185,7 +185,7 @@ class CSequencer int m_elseValid; CBlock *m_elseOwner; - vector m_streamsCreated; + std::vector m_streamsCreated; }; #endif //__SEQUENCER__ diff --git a/codeJK2/icarus/taskmanager.h b/codeJK2/icarus/taskmanager.h index 177e9a2b0c..db9e24431d 100644 --- a/codeJK2/icarus/taskmanager.h +++ b/codeJK2/icarus/taskmanager.h @@ -83,7 +83,7 @@ class CTaskGroup { public: - typedef map < int, bool > taskCallback_m; + typedef std::map < int, bool > taskCallback_m; CTaskGroup( void ); ~CTaskGroup( void ); @@ -117,11 +117,11 @@ class CTaskGroup class CTaskManager { - typedef map < int, CTask * > taskID_m; - typedef map < string, CTaskGroup * > taskGroupName_m; - typedef map < int, CTaskGroup * > taskGroupID_m; - typedef vector < CTaskGroup * > taskGroup_v; - typedef list < CTask *> tasks_l; + typedef std::map < int, CTask * > taskID_m; + typedef std::map < std::string, CTaskGroup * > taskGroupName_m; + typedef std::map < int, CTaskGroup * > taskGroupID_m; + typedef std::vector < CTaskGroup * > taskGroup_v; + typedef std::list < CTask *> tasks_l; public: diff --git a/codeJK2/icarus/tokenizer.h b/codeJK2/icarus/tokenizer.h index 2556e08202..f792da3097 100644 --- a/codeJK2/icarus/tokenizer.h +++ b/codeJK2/icarus/tokenizer.h @@ -30,8 +30,6 @@ along with this program; if not, see . #include #include -using namespace std; - typedef unsigned char byte; typedef unsigned short word; @@ -283,7 +281,7 @@ class CSymbol char* m_symbolName; }; -typedef map symbolmap_t; +typedef std::map symbolmap_t; class CDirectiveSymbol : public CSymbol { From 9e30bb70663938fde63792660502b11225706173 Mon Sep 17 00:00:00 2001 From: David Jones Date: Mon, 18 Jan 2016 22:58:57 +0000 Subject: [PATCH 137/445] Fixed wierd formatting --- codeJK2/cgame/cg_main.cpp | 2 +- codeJK2/game/NPC_combat.cpp | 2 +- codeJK2/game/g_local.h | 2 +- codeJK2/game/g_navigator.cpp | 2 +- codeJK2/game/g_spawn.cpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/codeJK2/cgame/cg_main.cpp b/codeJK2/cgame/cg_main.cpp index c365fd9369..4023f36ac8 100644 --- a/codeJK2/cgame/cg_main.cpp +++ b/codeJK2/cgame/cg_main.cpp @@ -29,7 +29,7 @@ along with this program; if not, see . #include "../../code/qcommon/sstring.h" //NOTENOTE: Be sure to change the mirrored code in g_shared.h -typedef std::map< sstring_t, unsigned char, std::less, std::allocator< unsigned char > > namePrecache_m; +typedef std::map< sstring_t, unsigned char, std::less, std::allocator< unsigned char > > namePrecache_m; extern namePrecache_m *as_preCacheMap; extern void CG_RegisterNPCCustomSounds( clientInfo_t *ci ); extern qboolean G_AddSexToMunroString ( char *string, qboolean qDoBoth ); diff --git a/codeJK2/game/NPC_combat.cpp b/codeJK2/game/NPC_combat.cpp index 3997cd541c..8a9a4ff5ea 100644 --- a/codeJK2/game/NPC_combat.cpp +++ b/codeJK2/game/NPC_combat.cpp @@ -2440,7 +2440,7 @@ NPC_CollectCombatPoints ------------------------- */ -typedef std::map< float, int > combatPoint_m; +typedef std::map< float, int > combatPoint_m; static int NPC_CollectCombatPoints( const vec3_t origin, const float radius, combatPoint_m &points, const int flags ) { diff --git a/codeJK2/game/g_local.h b/codeJK2/game/g_local.h index 1f09fa5dd0..15a9b1bf08 100644 --- a/codeJK2/game/g_local.h +++ b/codeJK2/game/g_local.h @@ -558,7 +558,7 @@ typedef struct pscript_s long length; } pscript_t; -typedef std::map < std::string, int, std::less, std::allocator > entlist_t; +typedef std::map < std::string, int, std::less, std::allocator > entlist_t; typedef std::map < std::string, pscript_t*, std::less, std::allocator > bufferlist_t; diff --git a/codeJK2/game/g_navigator.cpp b/codeJK2/game/g_navigator.cpp index 237202aeb6..024b3fad47 100644 --- a/codeJK2/game/g_navigator.cpp +++ b/codeJK2/game/g_navigator.cpp @@ -931,7 +931,7 @@ ShowEdges ------------------------- */ -typedef std::map < int, bool > drawMap_m; +typedef std::map < int, bool > drawMap_m; void CNavigator::ShowEdges( void ) { diff --git a/codeJK2/game/g_spawn.cpp b/codeJK2/game/g_spawn.cpp index 927dbcab66..cf401ff5a2 100644 --- a/codeJK2/game/g_spawn.cpp +++ b/codeJK2/game/g_spawn.cpp @@ -39,7 +39,7 @@ char spawnVarChars[MAX_SPAWN_VARS_CHARS]; #include "../../code/qcommon/sstring.h" //NOTENOTE: Be sure to change the mirrored code in cgmain.cpp -typedef std::map< sstring_t, unsigned char, std::less, std::allocator< unsigned char > > namePrecache_m; +typedef std::map< sstring_t, unsigned char, std::less, std::allocator< unsigned char > > namePrecache_m; namePrecache_m *as_preCacheMap; qboolean G_SpawnString( const char *key, const char *defaultString, char **out ) { From 05020b0c917ee9c64e5b8239336251a53f5fd18c Mon Sep 17 00:00:00 2001 From: David Jones Date: Wed, 20 Jan 2016 00:50:32 +0000 Subject: [PATCH 138/445] Stripped a load of unused trek code --- code/cgame/cg_event.cpp | 9 ---- code/cgame/cg_players.cpp | 21 ---------- code/game/AI_Default.cpp | 7 ---- code/game/NPC.cpp | 64 ----------------------------- code/game/NPC_combat.cpp | 21 ---------- code/game/NPC_reactions.cpp | 12 ++---- code/game/NPC_spawn.cpp | 16 -------- code/game/NPC_utils.cpp | 10 ----- code/game/Q3_Interface.cpp | 13 ------ code/game/b_local.h | 7 ---- code/game/bg_pmove.cpp | 19 +-------- code/game/g_active.cpp | 27 ------------ code/game/g_combat.cpp | 48 ---------------------- code/game/g_itemLoad.cpp | 2 - code/game/g_shared.h | 25 +----------- codeJK2/cgame/cg_event.cpp | 9 ---- codeJK2/cgame/cg_players.cpp | 21 ---------- codeJK2/game/AI_Default.cpp | 7 ---- codeJK2/game/NPC.cpp | 73 ++------------------------------- codeJK2/game/NPC_combat.cpp | 21 ---------- codeJK2/game/NPC_reactions.cpp | 12 ++---- codeJK2/game/NPC_spawn.cpp | 17 -------- codeJK2/game/NPC_stats.cpp | 25 ------------ codeJK2/game/NPC_utils.cpp | 10 ----- codeJK2/game/Q3_Interface.cpp | 13 ------ codeJK2/game/b_local.h | 7 ---- codeJK2/game/bg_pmove.cpp | 9 +--- codeJK2/game/g_active.cpp | 27 ------------ codeJK2/game/g_combat.cpp | 48 ---------------------- codeJK2/game/g_shared.h | 26 +----------- codeJK2/game/g_weapon.cpp | 4 -- codeJK2/game/teams.h | 13 ------ codemp/game/NPC.c | 75 ++-------------------------------- codemp/game/NPC_AI_Default.c | 7 ---- codemp/game/NPC_combat.c | 72 +------------------------------- codemp/game/NPC_reactions.c | 18 ++++---- codemp/game/NPC_spawn.c | 16 -------- codemp/game/NPC_stats.c | 24 ----------- codemp/game/NPC_utils.c | 11 ----- codemp/game/b_local.h | 7 ---- codemp/game/g_active.c | 27 ------------ codemp/game/g_log.c | 59 +------------------------- 42 files changed, 31 insertions(+), 928 deletions(-) diff --git a/code/cgame/cg_event.cpp b/code/cgame/cg_event.cpp index 41e0ea51f4..635dfe14d9 100644 --- a/code/cgame/cg_event.cpp +++ b/code/cgame/cg_event.cpp @@ -644,15 +644,6 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { { if ( disintSound1 && disintSound2 ) {//play an extra sound - /* - if ( cent->gent->owner->client->playerTeam == TEAM_STARFLEET || - cent->gent->owner->client->playerTeam == TEAM_SCAVENGERS || - cent->gent->owner->client->playerTeam == TEAM_MALON || - cent->gent->owner->client->playerTeam == TEAM_IMPERIAL || - cent->gent->owner->client->playerTeam == TEAM_HIROGEN || - cent->gent->owner->client->playerTeam == TEAM_DISGUISE || - cent->gent->owner->client->playerTeam == TEAM_KLINGON ) - */ // listed all the non-humanoids, because there's a lot more humanoids class_t npc_class = cent->gent->owner->client->NPC_class; if( npc_class != CLASS_ATST && npc_class != CLASS_GONK && diff --git a/code/cgame/cg_players.cpp b/code/cgame/cg_players.cpp index 1b13065a87..d0514748e9 100644 --- a/code/cgame/cg_players.cpp +++ b/code/cgame/cg_players.cpp @@ -940,27 +940,6 @@ static void CG_PlayerAnimation( centity_t *cent, int *legsOld, int *legs, float } } - //HACKHACKHACK - /* - if ( cent->gent->client->playerTeam == TEAM_BORG && - cent->gent->client->ps.weapon == WP_BORG_ASSIMILATOR ) - { - if ( cent->gent->NPC->attackHoldTime > cg.time ) - { - if ( cent->pe.torso.frame >= 468 && cent->pe.torso.frame < 478 ) - {//Do not animate - *torsoOld = *torso = cent->pe.torso.frame = 468; - *torsoBackLerp = 0; - if ( ValidAnimFileIndex( ci->animFileIndex ) ) - { - CG_PlayerAnimSounds(ci->animFileIndex, qtrue, cent->pe.torso.frame, cent->pe.torso.frame, cent->currentState.number ); - } - return; - } - } - } - */ - newTorsoFrame = CG_RunLerpFrame( ci, ¢->pe.torso, cent->gent->client->ps.torsoAnim, cent->gent->client->renderInfo.torsoFpsMod, cent->gent->s.number ); *torsoOld = cent->pe.torso.oldFrame; diff --git a/code/game/AI_Default.cpp b/code/game/AI_Default.cpp index 58e4a013d1..14db201fc5 100644 --- a/code/game/AI_Default.cpp +++ b/code/game/AI_Default.cpp @@ -127,12 +127,6 @@ qboolean NPC_StandTrackAndShoot (gentity_t *NPC, qboolean canDuck) // if ( NPC->svFlags&SVF_HEALING ) // {//Medic is on the way, get down! // duck_ok = qtrue; -// } - // no more borg -/// if ( NPC->client->playerTeam!= TEAM_BORG ) -// {//Borg don't care if they're about to die - //attack_scale will be a max of .66 -// attack_scale = NPC->health/60; // } } } @@ -544,7 +538,6 @@ void NPC_BSPointShoot (qboolean shoot) switch( NPC->client->ps.weapon ) { case WP_NONE: -// case WP_TRICORDER: case WP_MELEE: case WP_TUSKEN_STAFF: case WP_SABER: diff --git a/code/game/NPC.cpp b/code/game/NPC.cpp index e224f62b71..328d9a2dbe 100644 --- a/code/game/NPC.cpp +++ b/code/game/NPC.cpp @@ -319,51 +319,7 @@ int BodyRemovalPadTime( gentity_t *ent ) if ( !ent || !ent->client ) return 0; -/* - switch ( ent->client->playerTeam ) - { - case TEAM_KLINGON: // no effect, we just remove them when the player isn't looking - case TEAM_SCAVENGERS: - case TEAM_HIROGEN: - case TEAM_MALON: - case TEAM_IMPERIAL: - case TEAM_STARFLEET: - time = 10000; // 15 secs. - break; - - case TEAM_BORG: - time = 2000; - break; - - case TEAM_STASIS: - return qtrue; - break; - case TEAM_FORGE: - time = 1000; - break; - - case TEAM_BOTS: -// if (!Q_stricmp( ent->NPC_type, "mouse" )) -// { - time = 0; -// } -// else -// { -// time = 10000; -// } - break; - - case TEAM_8472: - time = 2000; - break; - - default: - // never go away - time = Q3_INFINITE; - break; - } -*/ // team no longer indicates species/race, so in this case we'd use NPC_class, but switch( ent->client->NPC_class ) { @@ -415,26 +371,6 @@ static void NPC_RemoveBodyEffect(void) if ( !NPC || !NPC->client || (NPC->s.eFlags & EF_NODRAW) ) return; -/* - switch(NPC->client->playerTeam) - { - case TEAM_STARFLEET: - //FIXME: Starfleet beam out - break; - - case TEAM_BOTS: -// VectorCopy( NPC->currentOrigin, org ); -// org[2] -= 16; -// tent = G_TempEntity( org, EV_BOT_EXPLODE ); -// tent->owner = NPC; - - break; - - default: - break; - } -*/ - // team no longer indicates species/race, so in this case we'd use NPC_class, but diff --git a/code/game/NPC_combat.cpp b/code/game/NPC_combat.cpp index d2e2f811aa..2d932a22e2 100644 --- a/code/game/NPC_combat.cpp +++ b/code/game/NPC_combat.cpp @@ -900,13 +900,6 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) ent->NPC->burstSpacing = 2000;//2 seconds ent->NPC->attackHold = 1000;//Hold attack button for a 1-second burst break; - - case WP_TRICORDER: - ent->NPC->aiFlags |= NPCAI_BURST_WEAPON; - ent->NPC->burstMin = 5; - ent->NPC->burstMax = 30; - ent->NPC->burstSpacing = 1000; - break; */ case WP_BLASTER: @@ -1444,11 +1437,6 @@ int NPC_AttackDebounceForWeapon (void) case WP_SABER: return 100; break; - - - case WP_TRICORDER: - return 0;//tricorder - break; */ case WP_SABER: if ( NPC->client->NPC_class == CLASS_KYLE @@ -1516,11 +1504,6 @@ float NPC_MaxDistSquaredForWeapon (void) case WP_SABER: return 1024 * 1024; break; - - - case WP_TRICORDER: - return 0;//tricorder - break; */ case WP_SABER: if ( NPC->client && NPC->client->ps.SaberLength() ) @@ -2585,10 +2568,6 @@ float IdealDistance ( gentity_t *self ) ideal += 50; break; -/* case WP_TRICORDER: - ideal = 0; - break; -*/ case WP_SABER: case WP_BRYAR_PISTOL: case WP_BLASTER_PISTOL: diff --git a/code/game/NPC_reactions.cpp b/code/game/NPC_reactions.cpp index 22320d9b23..ba796bbd6e 100644 --- a/code/game/NPC_reactions.cpp +++ b/code/game/NPC_reactions.cpp @@ -158,14 +158,10 @@ void NPC_SetPainEvent( gentity_t *self ) { if ( !self->NPC || !(self->NPC->aiFlags&NPCAI_DIE_ON_IMPACT) ) { - // no more borg - // if( self->client->playerTeam != TEAM_BORG ) - // { - if ( !Q3_TaskIDPending( self, TID_CHAN_VOICE ) ) - { - G_AddEvent( self, EV_PAIN, floor((float)self->health/self->max_health*100.0f) ); - } - // } + if ( !Q3_TaskIDPending( self, TID_CHAN_VOICE ) ) + { + G_AddEvent( self, EV_PAIN, floor((float)self->health/self->max_health*100.0f) ); + } } } diff --git a/code/game/NPC_spawn.cpp b/code/game/NPC_spawn.cpp index f515756ffa..9dd0ce7930 100644 --- a/code/game/NPC_spawn.cpp +++ b/code/game/NPC_spawn.cpp @@ -699,17 +699,6 @@ int NPC_WeaponsForTeam( team_t team, int spawnflags, const char *NPC_type ) switch(team) { // no longer exists -// case TEAM_BORG: -// break; - -// case TEAM_HIROGEN: -// if( Q_stricmp( "hirogenalpha", NPC_type ) == 0 ) -// return ( 1 << WP_BLASTER); - //Falls through - -// case TEAM_KLINGON: - - //NOTENOTE: Falls through // case TEAM_IMPERIAL: case TEAM_ENEMY: @@ -721,8 +710,6 @@ int NPC_WeaponsForTeam( team_t team, int spawnflags, const char *NPC_type ) // return ( 1 << WP_IMPERIAL_BLADE); //NOTENOTE: Falls through if not a knife user -// case TEAM_SCAVENGERS: -// case TEAM_MALON: //FIXME: default weapon in npc config? if ( Q_stricmpn( "stofficer", NPC_type, 9 ) == 0 ) { @@ -848,9 +835,6 @@ int NPC_WeaponsForTeam( team_t team, int spawnflags, const char *NPC_type ) case TEAM_PLAYER: -// if(spawnflags & SFB_TRICORDER) -// return ( 1 << WP_TRICORDER); - if(spawnflags & SFB_RIFLEMAN) return ( 1 << WP_REPEATER); diff --git a/code/game/NPC_utils.cpp b/code/game/NPC_utils.cpp index fc507f4275..d92cdd167d 100644 --- a/code/game/NPC_utils.cpp +++ b/code/game/NPC_utils.cpp @@ -1166,16 +1166,6 @@ NPC_PickEnemyExt gentity_t *NPC_PickEnemyExt( qboolean checkAlerts = qfalse ) { - //Check for Hazard Team status and remove this check - /* - if ( NPC->client->playerTeam != TEAM_STARFLEET ) - { - //If we've found the player, return it - if ( NPC_FindPlayer() ) - return &g_entities[0]; - } - */ - //If we've asked for the closest enemy int entID = NPC_FindNearestEnemy( NPC ); diff --git a/code/game/Q3_Interface.cpp b/code/game/Q3_Interface.cpp index 12cd40da13..461a5e3b05 100644 --- a/code/game/Q3_Interface.cpp +++ b/code/game/Q3_Interface.cpp @@ -2191,19 +2191,6 @@ static void Q3_SetLeader( int entID, const char *name ) stringID_table_t teamTable [] = { ENUM2STRING(TEAM_FREE), -// ENUM2STRING(TEAM_STARFLEET), -// ENUM2STRING(TEAM_BORG), -// ENUM2STRING(TEAM_PARASITE), -// ENUM2STRING(TEAM_SCAVENGERS), -// ENUM2STRING(TEAM_KLINGON), -// ENUM2STRING(TEAM_MALON), -// ENUM2STRING(TEAM_HIROGEN), -// ENUM2STRING(TEAM_IMPERIAL), -// ENUM2STRING(TEAM_STASIS), -// ENUM2STRING(TEAM_8472), -// ENUM2STRING(TEAM_BOTS), -// ENUM2STRING(TEAM_FORGE), -// ENUM2STRING(TEAM_DISGUISE), ENUM2STRING(TEAM_PLAYER), ENUM2STRING(TEAM_ENEMY), ENUM2STRING(TEAM_NEUTRAL), diff --git a/code/game/b_local.h b/code/game/b_local.h index aee10a6478..8093b64b0c 100644 --- a/code/game/b_local.h +++ b/code/game/b_local.h @@ -152,15 +152,8 @@ extern void NPC_DeleteFromFormation (gentity_t *self); #define NUM_POSITIONS 30 //NPC spawnflags -#define SFB_SMALLHULL 1 - #define SFB_RIFLEMAN 2 -#define SFB_OLDBORG 2//Borg #define SFB_PHASER 4 -#define SFB_GUN 4//Borg -#define SFB_TRICORDER 8 -#define SFB_TASER 8//Borg -#define SFB_DRILL 16//Borg #define SFB_CINEMATIC 32 #define SFB_NOTSOLID 64 diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 748181f874..3362a07d2a 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -8274,7 +8274,7 @@ static void PM_Footsteps( void ) PM_SetAnim(pm,SETANIM_LEGS,legsAnim,SETANIM_FLAG_NORMAL); } } - else if( (validNPC && pm->ps->weapon > WP_SABER && pm->ps->weapon < WP_DET_PACK ))// && pm->gent->client->race != RACE_BORG))//Being careful or carrying a 2-handed weapon + else if( (validNPC && pm->ps->weapon > WP_SABER && pm->ps->weapon < WP_DET_PACK ))//Being careful or carrying a 2-handed weapon {//Squadmates use BOTH_STAND3 oldAnim = pm->ps->legsAnim; if(oldAnim != BOTH_GUARD_LOOKAROUND1 && oldAnim != BOTH_GUARD_IDLE1 @@ -13413,12 +13413,7 @@ static void PM_Weapon( void ) { if ( pm->gent && pm->gent->client ) { - // borg no longer exist, use NPC_class to check for any npc's that don't drop their weapons (if there are any) - // Sigh..borg shouldn't drop their weapon attachments when they die. Also, never drop a lightsaber! - // if ( pm->gent->client->playerTeam != TEAM_BORG) - { - pm->ps->weapon = WP_NONE; - } + pm->ps->weapon = WP_NONE; } if ( pm->gent ) @@ -14105,16 +14100,6 @@ static void PM_VehicleWeapon( void ) // check for dead player if ( pm->ps->stats[STAT_HEALTH] <= 0 ) { - if ( pm->gent && pm->gent->client ) - { - // borg no longer exist, use NPC_class to check for any npc's that don't drop their weapons (if there are any) - // Sigh..borg shouldn't drop their weapon attachments when they die. Also, never drop a lightsaber! - // if ( pm->gent->client->playerTeam != TEAM_BORG) - { - // pm->ps->weapon = WP_NONE; - } - } - if ( pm->gent ) { pm->gent->s.loopSound = 0; diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index 63fc0e77e2..c40de5e202 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -4182,33 +4182,7 @@ static int NPC_GetRunSpeed( gentity_t *ent ) if ( ( ent->client == NULL ) || ( ent->NPC == NULL ) ) return 0; -/* - switch ( ent->client->playerTeam ) - { - case TEAM_BORG: - runSpeed = ent->NPC->stats.runSpeed; - runSpeed += BORG_RUN_INCR * (g_spskill->integer%3); - break; - case TEAM_8472: - runSpeed = ent->NPC->stats.runSpeed; - runSpeed += SPECIES_RUN_INCR * (g_spskill->integer%3); - break; - - case TEAM_STASIS: - runSpeed = ent->NPC->stats.runSpeed; - runSpeed += STASIS_RUN_INCR * (g_spskill->integer%3); - break; - - case TEAM_BOTS: - runSpeed = ent->NPC->stats.runSpeed; - break; - - default: - runSpeed = ent->NPC->stats.runSpeed; - break; - } -*/ // team no longer indicates species/race. Use NPC_class to adjust speed for specific npc types switch( ent->client->NPC_class) { @@ -4476,7 +4450,6 @@ void ClientAlterSpeed(gentity_t *ent, usercmd_t *ucmd, qboolean controlledByPlay if ( ent->NPC->currentSpeed >= 80 && !controlledByPlayer ) {//At higher speeds, need to slow down close to stuff //Slow down as you approach your goal - // if ( ent->NPC->distToGoal < SLOWDOWN_DIST && client->race != RACE_BORG && !(ent->NPC->aiFlags&NPCAI_NO_SLOWDOWN) )//128 if ( ent->NPC->distToGoal < SLOWDOWN_DIST && !(ent->NPC->aiFlags&NPCAI_NO_SLOWDOWN) )//128 { if ( ent->NPC->desiredSpeed > MIN_NPC_SPEED ) diff --git a/code/game/g_combat.cpp b/code/game/g_combat.cpp index 73fefa2ddc..42370d71a0 100644 --- a/code/game/g_combat.cpp +++ b/code/game/g_combat.cpp @@ -747,11 +747,6 @@ void G_SetMissionStatusText( gentity_t *attacker, int mod ) {//crushed statusTextIndex = STAT_JUDGEMENTMUCHDESIRED; } - // borg no longer exist -// else if ( attacker && attacker->client && attacker->client->playerTeam == TEAM_BORG ) -// {//assimilated -// statusTextIndex = Q_irand( IGT_RESISTANCEISFUTILE, IGT_NAMEIS8OF12 ); -// } else if ( attacker && Q_stricmp( "trigger_hurt", attacker->classname ) == 0 ) {//Killed by something that should have been clearly dangerous // statusTextIndex = Q_irand( IGT_JUDGEMENTDESIRED, IGT_JUDGEMENTMUCHDESIRED ); @@ -761,49 +756,6 @@ void G_SetMissionStatusText( gentity_t *attacker, int mod ) {//killed by a teammate statusTextIndex = STAT_INSUBORDINATION; } - /* - else if () - {//killed a teammate- note: handled above - if ( Q_irand( 0, 1 ) ) - { - statusTextIndex = IGT_YOUCAUSEDDEATHOFTEAMMATE; - } - else - { - statusTextIndex = IGT_KILLEDANINNOCENTCREWMAN; - } - } - else - { - //This next block is not contiguous - IGT_INADEQUATE, - IGT_RESPONSETIME, - IGT_SHOOTINRANGE, - IGT_TRYAGAIN, - IGT_TRAINONHOLODECK, - IGT_WHATCOLORSHIRT, - IGT_NOTIMPRESS7OF9, - IGT_NEELIXFAREDBETTER, - IGT_THATMUSTHURT, - IGT_TUVOKDISAPPOINTED, - IGT_STARFLEETNOTIFYFAMILY, - IGT_TEAMMATESWILLMISSYOU, - IGT_LESSTHANEXEMPLARY, - IGT_SACRIFICEDFORTHEWHOLE, - IGT_NOTLIVELONGANDPROSPER, - IGT_BETTERUSEOFSIMULATIONS, - } - */ - - /* - //These can be set by designers - IGT_INSUBORDINATION, - IGT_YOUCAUSEDDEATHOFTEAMMATE, - IGT_DIDNTPROTECTTECH, - IGT_DIDNTPROTECT7OF9, - IGT_NOTSTEALTHYENOUGH, - IGT_STEALTHTACTICSNECESSARY, - */ } void G_MakeTeamVulnerable( void ) diff --git a/code/game/g_itemLoad.cpp b/code/game/g_itemLoad.cpp index d8e10d7cff..d0cca821d5 100644 --- a/code/game/g_itemLoad.cpp +++ b/code/game/g_itemLoad.cpp @@ -346,8 +346,6 @@ static void IT_Tag(const char **holdBuf) tag = WP_TRIP_MINE; else if (!Q_stricmp(tokenStr,"WP_DET_PACK")) tag = WP_DET_PACK; -// else if (!Q_stricmp(tokenStr,"WP_TRICORDER")) -// tag = WP_TRICORDER; else if (!Q_stricmp(tokenStr,"WP_BOT_LASER")) tag = WP_BOT_LASER; else if (!Q_stricmp(tokenStr,"WP_EMPLACED_GUN")) diff --git a/code/game/g_shared.h b/code/game/g_shared.h index 853c3ac4ec..0ea27be490 100644 --- a/code/game/g_shared.h +++ b/code/game/g_shared.h @@ -265,30 +265,7 @@ typedef enum { TEAM_BEGIN, // Beginning a team game, spawn at base TEAM_ACTIVE // Now actively playing } playerTeamStateState_t; -/* -typedef enum //# race_e -{ - RACE_NONE = 0, - RACE_HUMAN, - RACE_BORG, - RACE_KLINGON, - RACE_HIROGEN, - RACE_MALON, - RACE_STASIS, - RACE_8472, - RACE_BOT, - RACE_HARVESTER, - RACE_REAVER, - RACE_AVATAR, - RACE_PARASITE, - RACE_VULCAN, - RACE_BETAZOID, - RACE_BOLIAN, - RACE_TALAXIAN, - RACE_BAJORAN, - RACE_HOLOGRAM -} race_t; -*/ + // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! typedef struct { playerTeamStateState_t state; diff --git a/codeJK2/cgame/cg_event.cpp b/codeJK2/cgame/cg_event.cpp index a10f11cee5..cf050a3cc0 100644 --- a/codeJK2/cgame/cg_event.cpp +++ b/codeJK2/cgame/cg_event.cpp @@ -621,15 +621,6 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { { if ( disintSound1 && disintSound2 ) {//play an extra sound - /* - if ( cent->gent->owner->client->playerTeam == TEAM_STARFLEET || - cent->gent->owner->client->playerTeam == TEAM_SCAVENGERS || - cent->gent->owner->client->playerTeam == TEAM_MALON || - cent->gent->owner->client->playerTeam == TEAM_IMPERIAL || - cent->gent->owner->client->playerTeam == TEAM_HIROGEN || - cent->gent->owner->client->playerTeam == TEAM_DISGUISE || - cent->gent->owner->client->playerTeam == TEAM_KLINGON ) - */ // listed all the non-humanoids, because there's a lot more humanoids class_t npc_class = cent->gent->owner->client->NPC_class; if( npc_class != CLASS_ATST && npc_class != CLASS_GONK && diff --git a/codeJK2/cgame/cg_players.cpp b/codeJK2/cgame/cg_players.cpp index d6084f7fd2..6417b0cd8c 100644 --- a/codeJK2/cgame/cg_players.cpp +++ b/codeJK2/cgame/cg_players.cpp @@ -1070,27 +1070,6 @@ void CG_PlayerAnimation( centity_t *cent, int *legsOld, int *legs, float *legsBa } } - //HACKHACKHACK - /* - if ( cent->gent->client->playerTeam == TEAM_BORG && - cent->gent->client->ps.weapon == WP_BORG_ASSIMILATOR ) - { - if ( cent->gent->NPC->attackHoldTime > cg.time ) - { - if ( cent->pe.torso.frame >= 468 && cent->pe.torso.frame < 478 ) - {//Do not animate - *torsoOld = *torso = cent->pe.torso.frame = 468; - *torsoBackLerp = 0; - if ( ValidAnimFileIndex( ci->animFileIndex ) ) - { - CG_PlayerAnimSounds(ci->animFileIndex, qtrue, cent->pe.torso.frame, cent->pe.torso.frame, cent->currentState.number ); - } - return; - } - } - } - */ - newTorsoFrame = CG_RunLerpFrame( ci, ¢->pe.torso, cent->gent->client->ps.torsoAnim, cent->gent->client->renderInfo.torsoFpsMod, cent->gent->s.number ); *torsoOld = cent->pe.torso.oldFrame; diff --git a/codeJK2/game/AI_Default.cpp b/codeJK2/game/AI_Default.cpp index 2c0caca5a6..c845b3417b 100644 --- a/codeJK2/game/AI_Default.cpp +++ b/codeJK2/game/AI_Default.cpp @@ -131,12 +131,6 @@ qboolean NPC_StandTrackAndShoot (gentity_t *NPC, qboolean canDuck) // if ( NPC->svFlags&SVF_HEALING ) // {//Medic is on the way, get down! // duck_ok = qtrue; -// } - // no more borg -/// if ( NPC->client->playerTeam!= TEAM_BORG ) -// {//Borg don't care if they're about to die - //attack_scale will be a max of .66 -// attack_scale = NPC->health/60; // } } } @@ -549,7 +543,6 @@ void NPC_BSPointShoot (qboolean shoot) switch( NPC->client->ps.weapon ) { case WP_NONE: -// case WP_TRICORDER: case WP_MELEE: case WP_SABER: //don't do any pitch change if not holding a firing weapon diff --git a/codeJK2/game/NPC.cpp b/codeJK2/game/NPC.cpp index 65288a3656..30cbcece69 100644 --- a/codeJK2/game/NPC.cpp +++ b/codeJK2/game/NPC.cpp @@ -264,51 +264,7 @@ int BodyRemovalPadTime( gentity_t *ent ) if ( !ent || !ent->client ) return 0; -/* - switch ( ent->client->playerTeam ) - { - case TEAM_KLINGON: // no effect, we just remove them when the player isn't looking - case TEAM_SCAVENGERS: - case TEAM_HIROGEN: - case TEAM_MALON: - case TEAM_IMPERIAL: - case TEAM_STARFLEET: - time = 10000; // 15 secs. - break; - - case TEAM_BORG: - time = 2000; - break; - - case TEAM_STASIS: - return qtrue; - break; - - case TEAM_FORGE: - time = 1000; - break; - case TEAM_BOTS: -// if (!Q_stricmp( ent->NPC_type, "mouse" )) -// { - time = 0; -// } -// else -// { -// time = 10000; -// } - break; - - case TEAM_8472: - time = 2000; - break; - - default: - // never go away - time = Q3_INFINITE; - break; - } -*/ // team no longer indicates species/race, so in this case we'd use NPC_class, but switch( ent->client->NPC_class ) { @@ -355,26 +311,6 @@ static void NPC_RemoveBodyEffect(void) if ( !NPC || !NPC->client || (NPC->s.eFlags & EF_NODRAW) ) return; -/* - switch(NPC->client->playerTeam) - { - case TEAM_STARFLEET: - //FIXME: Starfleet beam out - break; - - case TEAM_BOTS: -// VectorCopy( NPC->currentOrigin, org ); -// org[2] -= 16; -// tent = G_TempEntity( org, EV_BOT_EXPLODE ); -// tent->owner = NPC; - - break; - - default: - break; - } -*/ - // team no longer indicates species/race, so in this case we'd use NPC_class, but @@ -1957,12 +1893,9 @@ void NPC_ExecuteBState ( gentity_t *self)//, int msec ) } else if ( !NPC->enemy )//HACK! { -// if(client->ps.weapon != WP_TRICORDER) - { - if( NPC->s.torsoAnim == TORSO_WEAPONREADY1 || NPC->s.torsoAnim == TORSO_WEAPONREADY3 ) - {//we look ready for action, using one of the first 2 weapon, let's rest our weapon on our shoulder - NPC_SetAnim(NPC,SETANIM_TORSO,TORSO_WEAPONIDLE1,SETANIM_FLAG_NORMAL); - } + if( NPC->s.torsoAnim == TORSO_WEAPONREADY1 || NPC->s.torsoAnim == TORSO_WEAPONREADY3 ) + {//we look ready for action, using one of the first 2 weapon, let's rest our weapon on our shoulder + NPC_SetAnim(NPC,SETANIM_TORSO,TORSO_WEAPONIDLE1,SETANIM_FLAG_NORMAL); } } diff --git a/codeJK2/game/NPC_combat.cpp b/codeJK2/game/NPC_combat.cpp index 8a9a4ff5ea..e0a0282f96 100644 --- a/codeJK2/game/NPC_combat.cpp +++ b/codeJK2/game/NPC_combat.cpp @@ -709,13 +709,6 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) ent->NPC->burstSpacing = 2000;//2 seconds ent->NPC->attackHold = 1000;//Hold attack button for a 1-second burst break; - - case WP_TRICORDER: - ent->NPC->aiFlags |= NPCAI_BURST_WEAPON; - ent->NPC->burstMin = 5; - ent->NPC->burstMax = 30; - ent->NPC->burstSpacing = 1000; - break; */ case WP_BLASTER: @@ -1216,11 +1209,6 @@ int NPC_AttackDebounceForWeapon (void) case WP_SABER: return 100; break; - - - case WP_TRICORDER: - return 0;//tricorder - break; */ case WP_SABER: return 0; @@ -1279,11 +1267,6 @@ float NPC_MaxDistSquaredForWeapon (void) case WP_SABER: return 1024 * 1024; break; - - - case WP_TRICORDER: - return 0;//tricorder - break; */ case WP_SABER: if ( NPC->client && NPC->client->ps.saberLength ) @@ -2361,10 +2344,6 @@ float IdealDistance ( gentity_t *self ) ideal += 50; break; -/* case WP_TRICORDER: - ideal = 0; - break; -*/ case WP_SABER: case WP_BRYAR_PISTOL: case WP_BLASTER_PISTOL: diff --git a/codeJK2/game/NPC_reactions.cpp b/codeJK2/game/NPC_reactions.cpp index f45acce47e..61ef1528f7 100644 --- a/codeJK2/game/NPC_reactions.cpp +++ b/codeJK2/game/NPC_reactions.cpp @@ -160,14 +160,10 @@ void NPC_SetPainEvent( gentity_t *self ) { if ( !self->NPC || !(self->NPC->aiFlags&NPCAI_DIE_ON_IMPACT) ) { - // no more borg - // if( self->client->playerTeam != TEAM_BORG ) - // { - if ( !Q3_TaskIDPending( self, TID_CHAN_VOICE ) ) - { - G_AddEvent( self, EV_PAIN, floor((float)self->health/self->max_health*100.0f) ); - } - // } + if ( !Q3_TaskIDPending( self, TID_CHAN_VOICE ) ) + { + G_AddEvent( self, EV_PAIN, floor((float)self->health/self->max_health*100.0f) ); + } } } diff --git a/codeJK2/game/NPC_spawn.cpp b/codeJK2/game/NPC_spawn.cpp index e020294efc..e1599aabf2 100644 --- a/codeJK2/game/NPC_spawn.cpp +++ b/codeJK2/game/NPC_spawn.cpp @@ -403,18 +403,6 @@ int NPC_WeaponsForTeam( team_t team, int spawnflags, const char *NPC_type ) //*** not sure how to handle this, should I pass in class instead of team and go from there? - dmv switch(team) { - // no longer exists -// case TEAM_BORG: -// break; - -// case TEAM_HIROGEN: -// if( Q_stricmp( "hirogenalpha", NPC_type ) == 0 ) -// return ( 1 << WP_BLASTER); - //Falls through - -// case TEAM_KLINGON: - - //NOTENOTE: Falls through // case TEAM_IMPERIAL: case TEAM_ENEMY: @@ -426,8 +414,6 @@ int NPC_WeaponsForTeam( team_t team, int spawnflags, const char *NPC_type ) // return ( 1 << WP_IMPERIAL_BLADE); //NOTENOTE: Falls through if not a knife user -// case TEAM_SCAVENGERS: -// case TEAM_MALON: //FIXME: default weapon in npc config? if ( Q_strncmp( "stofficer", NPC_type, 9 ) == 0 ) { @@ -553,9 +539,6 @@ int NPC_WeaponsForTeam( team_t team, int spawnflags, const char *NPC_type ) case TEAM_PLAYER: -// if(spawnflags & SFB_TRICORDER) -// return ( 1 << WP_TRICORDER); - if(spawnflags & SFB_RIFLEMAN) return ( 1 << WP_REPEATER); diff --git a/codeJK2/game/NPC_stats.cpp b/codeJK2/game/NPC_stats.cpp index 2cac6ae189..4aa7aabba3 100644 --- a/codeJK2/game/NPC_stats.cpp +++ b/codeJK2/game/NPC_stats.cpp @@ -35,20 +35,6 @@ extern vec3_t playerMaxs; char *TeamNames[TEAM_NUM_TEAMS] = { "", -// "starfleet", -// "borg", -// "parasite", -// "scavengers", -// "klingon", -// "malon", -// "hirogen", -// "imperial", -// "stasis", -// "species8472", -// "dreadnought", -// "forge", -// "disguise", -// "player (not valid)" "player", "enemy", "neutral" @@ -177,16 +163,6 @@ class_t TranslateClassName( const char *name ) return CLASS_NONE; // I hope this never happens, maybe print a warning } -/* -static race_t TranslateRaceName( const char *name ) -{ - if ( !Q_stricmp( name, "human" ) ) - { - return RACE_HUMAN; - } - return RACE_NONE; -} -*/ /* static rank_t TranslateRankName( const char *name ) @@ -1076,7 +1052,6 @@ void NPC_BuildRandom( gentity_t *NPC ) } NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = Q_irand(87, 102)/100.0f; -// NPC->client->race = RACE_HUMAN; NPC->NPC->rank = RANK_CREWMAN; NPC->client->playerTeam = TEAM_PLAYER; NPC->client->clientInfo.customBasicSoundDir = "kyle"; diff --git a/codeJK2/game/NPC_utils.cpp b/codeJK2/game/NPC_utils.cpp index 633518ec45..b885de820c 100644 --- a/codeJK2/game/NPC_utils.cpp +++ b/codeJK2/game/NPC_utils.cpp @@ -1094,16 +1094,6 @@ NPC_PickEnemyExt gentity_t *NPC_PickEnemyExt( qboolean checkAlerts = qfalse ) { - //Check for Hazard Team status and remove this check - /* - if ( NPC->client->playerTeam != TEAM_STARFLEET ) - { - //If we've found the player, return it - if ( NPC_FindPlayer() ) - return &g_entities[0]; - } - */ - //If we've asked for the closest enemy int entID = NPC_FindNearestEnemy( NPC ); diff --git a/codeJK2/game/Q3_Interface.cpp b/codeJK2/game/Q3_Interface.cpp index 0c7eaf5ab2..1809f24880 100644 --- a/codeJK2/game/Q3_Interface.cpp +++ b/codeJK2/game/Q3_Interface.cpp @@ -2300,19 +2300,6 @@ static void Q3_SetLeader( int entID, const char *name ) stringID_table_t teamTable [] = { ENUM2STRING(TEAM_FREE), -// ENUM2STRING(TEAM_STARFLEET), -// ENUM2STRING(TEAM_BORG), -// ENUM2STRING(TEAM_PARASITE), -// ENUM2STRING(TEAM_SCAVENGERS), -// ENUM2STRING(TEAM_KLINGON), -// ENUM2STRING(TEAM_MALON), -// ENUM2STRING(TEAM_HIROGEN), -// ENUM2STRING(TEAM_IMPERIAL), -// ENUM2STRING(TEAM_STASIS), -// ENUM2STRING(TEAM_8472), -// ENUM2STRING(TEAM_BOTS), -// ENUM2STRING(TEAM_FORGE), -// ENUM2STRING(TEAM_DISGUISE), ENUM2STRING(TEAM_PLAYER), ENUM2STRING(TEAM_ENEMY), ENUM2STRING(TEAM_NEUTRAL), diff --git a/codeJK2/game/b_local.h b/codeJK2/game/b_local.h index 381a288f9b..4b9ed50062 100644 --- a/codeJK2/game/b_local.h +++ b/codeJK2/game/b_local.h @@ -155,15 +155,8 @@ extern void NPC_DeleteFromFormation (gentity_t *self); #define NUM_POSITIONS 30 //NPC spawnflags -#define SFB_SMALLHULL 1 - #define SFB_RIFLEMAN 2 -#define SFB_OLDBORG 2//Borg #define SFB_PHASER 4 -#define SFB_GUN 4//Borg -#define SFB_TRICORDER 8 -#define SFB_TASER 8//Borg -#define SFB_DRILL 16//Borg #define SFB_CINEMATIC 32 #define SFB_NOTSOLID 64 diff --git a/codeJK2/game/bg_pmove.cpp b/codeJK2/game/bg_pmove.cpp index 63a7548e29..0fb672ea5b 100644 --- a/codeJK2/game/bg_pmove.cpp +++ b/codeJK2/game/bg_pmove.cpp @@ -5110,7 +5110,7 @@ static void PM_Footsteps( void ) PM_SetAnim(pm,SETANIM_LEGS,legsAnim,SETANIM_FLAG_NORMAL); } } - else if( (validNPC && pm->ps->weapon > WP_SABER && pm->ps->weapon < WP_DET_PACK ))// && pm->gent->client->race != RACE_BORG))//Being careful or carrying a 2-handed weapon + else if( (validNPC && pm->ps->weapon > WP_SABER && pm->ps->weapon < WP_DET_PACK ))//Being careful or carrying a 2-handed weapon {//Squadmates use BOTH_STAND3 oldAnim = pm->ps->legsAnim; if(oldAnim != BOTH_GUARD_LOOKAROUND1 && oldAnim != BOTH_GUARD_IDLE1 && @@ -8021,12 +8021,7 @@ static void PM_Weapon( void ) { if ( pm->gent && pm->gent->client ) { - // borg no longer exist, use NPC_class to check for any npc's that don't drop their weapons (if there are any) - // Sigh..borg shouldn't drop their weapon attachments when they die. Also, never drop a lightsaber! - // if ( pm->gent->client->playerTeam != TEAM_BORG) - { - pm->ps->weapon = WP_NONE; - } + pm->ps->weapon = WP_NONE; } if ( pm->gent ) diff --git a/codeJK2/game/g_active.cpp b/codeJK2/game/g_active.cpp index b37357a011..77dc3847fe 100644 --- a/codeJK2/game/g_active.cpp +++ b/codeJK2/game/g_active.cpp @@ -1630,33 +1630,7 @@ static int NPC_GetRunSpeed( gentity_t *ent ) if ( ( ent->client == NULL ) || ( ent->NPC == NULL ) ) return 0; -/* - switch ( ent->client->playerTeam ) - { - case TEAM_BORG: - runSpeed = ent->NPC->stats.runSpeed; - runSpeed += BORG_RUN_INCR * (g_spskill->integer%3); - break; - case TEAM_8472: - runSpeed = ent->NPC->stats.runSpeed; - runSpeed += SPECIES_RUN_INCR * (g_spskill->integer%3); - break; - - case TEAM_STASIS: - runSpeed = ent->NPC->stats.runSpeed; - runSpeed += STASIS_RUN_INCR * (g_spskill->integer%3); - break; - - case TEAM_BOTS: - runSpeed = ent->NPC->stats.runSpeed; - break; - - default: - runSpeed = ent->NPC->stats.runSpeed; - break; - } -*/ // team no longer indicates species/race. Use NPC_class to adjust speed for specific npc types switch( ent->client->NPC_class) { @@ -2412,7 +2386,6 @@ extern cvar_t *g_skippingcin; if ( ent->NPC->currentSpeed >= 80 && !controlledByPlayer ) {//At higher speeds, need to slow down close to stuff //Slow down as you approach your goal - // if ( ent->NPC->distToGoal < SLOWDOWN_DIST && client->race != RACE_BORG && !(ent->NPC->aiFlags&NPCAI_NO_SLOWDOWN) )//128 if ( ent->NPC->distToGoal < SLOWDOWN_DIST && !(ent->NPC->aiFlags&NPCAI_NO_SLOWDOWN) )//128 { if ( ent->NPC->desiredSpeed > MIN_NPC_SPEED ) diff --git a/codeJK2/game/g_combat.cpp b/codeJK2/game/g_combat.cpp index 19066a013d..efdee55b72 100644 --- a/codeJK2/game/g_combat.cpp +++ b/codeJK2/game/g_combat.cpp @@ -681,11 +681,6 @@ void G_SetMissionStatusText( gentity_t *attacker, int mod ) {//crushed statusTextIndex = STAT_JUDGEMENTMUCHDESIRED; } - // borg no longer exist -// else if ( attacker && attacker->client && attacker->client->playerTeam == TEAM_BORG ) -// {//assimilated -// statusTextIndex = Q_irand( IGT_RESISTANCEISFUTILE, IGT_NAMEIS8OF12 ); -// } else if ( attacker && Q_stricmp( "trigger_hurt", attacker->classname ) == 0 ) {//Killed by something that should have been clearly dangerous // statusTextIndex = Q_irand( IGT_JUDGEMENTDESIRED, IGT_JUDGEMENTMUCHDESIRED ); @@ -695,49 +690,6 @@ void G_SetMissionStatusText( gentity_t *attacker, int mod ) {//killed by a teammate statusTextIndex = STAT_INSUBORDINATION; } - /* - else if () - {//killed a teammate- note: handled above - if ( Q_irand( 0, 1 ) ) - { - statusTextIndex = IGT_YOUCAUSEDDEATHOFTEAMMATE; - } - else - { - statusTextIndex = IGT_KILLEDANINNOCENTCREWMAN; - } - } - else - { - //This next block is not contiguous - IGT_INADEQUATE, - IGT_RESPONSETIME, - IGT_SHOOTINRANGE, - IGT_TRYAGAIN, - IGT_TRAINONHOLODECK, - IGT_WHATCOLORSHIRT, - IGT_NOTIMPRESS7OF9, - IGT_NEELIXFAREDBETTER, - IGT_THATMUSTHURT, - IGT_TUVOKDISAPPOINTED, - IGT_STARFLEETNOTIFYFAMILY, - IGT_TEAMMATESWILLMISSYOU, - IGT_LESSTHANEXEMPLARY, - IGT_SACRIFICEDFORTHEWHOLE, - IGT_NOTLIVELONGANDPROSPER, - IGT_BETTERUSEOFSIMULATIONS, - } - */ - - /* - //These can be set by designers - IGT_INSUBORDINATION, - IGT_YOUCAUSEDDEATHOFTEAMMATE, - IGT_DIDNTPROTECTTECH, - IGT_DIDNTPROTECT7OF9, - IGT_NOTSTEALTHYENOUGH, - IGT_STEALTHTACTICSNECESSARY, - */ } void G_MakeTeamVulnerable( void ) diff --git a/codeJK2/game/g_shared.h b/codeJK2/game/g_shared.h index a017126cda..babf5c23db 100644 --- a/codeJK2/game/g_shared.h +++ b/codeJK2/game/g_shared.h @@ -292,30 +292,7 @@ typedef enum { TEAM_BEGIN, // Beginning a team game, spawn at base TEAM_ACTIVE // Now actively playing } playerTeamStateState_t; -/* -typedef enum //# race_e -{ - RACE_NONE = 0, - RACE_HUMAN, - RACE_BORG, - RACE_KLINGON, - RACE_HIROGEN, - RACE_MALON, - RACE_STASIS, - RACE_8472, - RACE_BOT, - RACE_HARVESTER, - RACE_REAVER, - RACE_AVATAR, - RACE_PARASITE, - RACE_VULCAN, - RACE_BETAZOID, - RACE_BOLIAN, - RACE_TALAXIAN, - RACE_BAJORAN, - RACE_HOLOGRAM -} race_t; -*/ + // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! typedef struct { playerTeamStateState_t state; @@ -474,7 +451,6 @@ struct gclient_s { //Used to be in gentity_t, now here.. mostly formation stuff team_t playerTeam; team_t enemyTeam; -// race_t race; char *squadname; gentity_t *team_leader; gentity_t *leader; diff --git a/codeJK2/game/g_weapon.cpp b/codeJK2/game/g_weapon.cpp index 37c2c6c292..538eeaead4 100644 --- a/codeJK2/game/g_weapon.cpp +++ b/codeJK2/game/g_weapon.cpp @@ -689,10 +689,6 @@ void FireWeapon( gentity_t *ent, qboolean alt_fire ) WP_FireBryarPistol( ent, qfalse ); // never an alt-fire? break; -// case WP_TRICORDER: -// WP_TricorderScan( ent, alt_fire ); -// break; - default: return; break; diff --git a/codeJK2/game/teams.h b/codeJK2/game/teams.h index 29197f6825..a7981c60b6 100644 --- a/codeJK2/game/teams.h +++ b/codeJK2/game/teams.h @@ -27,19 +27,6 @@ along with this program; if not, see . typedef enum //# team_e { TEAM_FREE, // caution, some code checks a team_t via "if (!team_t_varname)" so I guess this should stay as entry 0, great or what? -slc -// TEAM_STARFLEET, -// TEAM_BORG, -// TEAM_PARASITE, -// TEAM_SCAVENGERS, -// TEAM_KLINGON, -// TEAM_MALON, -// TEAM_HIROGEN, -// TEAM_IMPERIAL, -// TEAM_STASIS, -// TEAM_8472, -// TEAM_BOTS, -// TEAM_FORGE, -// TEAM_DISGUISE, TEAM_PLAYER, TEAM_ENEMY, TEAM_NEUTRAL, // most droids are team_neutral, there are some exceptions like Probe,Seeker,Interrogator diff --git a/codemp/game/NPC.c b/codemp/game/NPC.c index dd30299a35..48ebec785c 100644 --- a/codemp/game/NPC.c +++ b/codemp/game/NPC.c @@ -250,51 +250,7 @@ int BodyRemovalPadTime( gentity_t *ent ) if ( !ent || !ent->client ) return 0; -/* - switch ( ent->client->playerTeam ) - { - case NPCTEAM_KLINGON: // no effect, we just remove them when the player isn't looking - case NPCTEAM_SCAVENGERS: - case NPCTEAM_HIROGEN: - case NPCTEAM_MALON: - case NPCTEAM_IMPERIAL: - case NPCTEAM_STARFLEET: - time = 10000; // 15 secs. - break; - - case NPCTEAM_BORG: - time = 2000; - break; - - case NPCTEAM_STASIS: - return qtrue; - break; - - case NPCTEAM_FORGE: - time = 1000; - break; - case NPCTEAM_BOTS: -// if (!Q_stricmp( ent->NPC_type, "mouse" )) -// { - time = 0; -// } -// else -// { -// time = 10000; -// } - break; - - case NPCTEAM_8472: - time = 2000; - break; - - default: - // never go away - time = Q3_INFINITE; - break; - } -*/ // team no longer indicates species/race, so in this case we'd use NPC_class, but switch( ent->client->NPC_class ) { @@ -341,26 +297,6 @@ static void NPC_RemoveBodyEffect(void) if ( !NPCS.NPC || !NPCS.NPC->client || (NPCS.NPC->s.eFlags & EF_NODRAW) ) return; -/* - switch(NPC->client->playerTeam) - { - case NPCTEAM_STARFLEET: - //FIXME: Starfleet beam out - break; - - case NPCTEAM_BOTS: -// VectorCopy( NPC->r.currentOrigin, org ); -// org[2] -= 16; -// tent = G_TempEntity( org, EV_BOT_EXPLODE ); -// tent->owner = NPC; - - break; - - default: - break; - } -*/ - // team no longer indicates species/race, so in this case we'd use NPC_class, but @@ -1699,13 +1635,10 @@ void NPC_ExecuteBState ( gentity_t *self)//, int msec ) } else if ( !NPCS.NPC->enemy )//HACK! { -// if(client->ps.weapon != WP_TRICORDER) - { - if( NPCS.NPC->s.torsoAnim == TORSO_WEAPONREADY1 || NPCS.NPC->s.torsoAnim == TORSO_WEAPONREADY3 ) - {//we look ready for action, using one of the first 2 weapon, let's rest our weapon on our shoulder - NPC_SetAnim(NPCS.NPC,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); - } - } + if( NPCS.NPC->s.torsoAnim == TORSO_WEAPONREADY1 || NPCS.NPC->s.torsoAnim == TORSO_WEAPONREADY3 ) + {//we look ready for action, using one of the first 2 weapon, let's rest our weapon on our shoulder + NPC_SetAnim(NPCS.NPC,SETANIM_TORSO,TORSO_WEAPONIDLE3,SETANIM_FLAG_NORMAL); + } } NPC_CheckAttackHold(); diff --git a/codemp/game/NPC_AI_Default.c b/codemp/game/NPC_AI_Default.c index 6a67700e32..debb988269 100644 --- a/codemp/game/NPC_AI_Default.c +++ b/codemp/game/NPC_AI_Default.c @@ -126,12 +126,6 @@ qboolean NPC_StandTrackAndShoot (gentity_t *NPC, qboolean canDuck) // if ( NPC->svFlags&SVF_HEALING ) // {//Medic is on the way, get down! // duck_ok = qtrue; -// } - // no more borg -/// if ( NPC->client->playerTeam!= TEAM_BORG ) -// {//Borg don't care if they're about to die - //attack_scale will be a max of .66 -// attack_scale = NPC->health/60; // } } } @@ -542,7 +536,6 @@ void NPC_BSPointShoot (qboolean shoot) switch( NPCS.NPC->client->ps.weapon ) { case WP_NONE: -// case WP_TRICORDER: case WP_STUN_BATON: case WP_SABER: //don't do any pitch change if not holding a firing weapon diff --git a/codemp/game/NPC_combat.c b/codemp/game/NPC_combat.c index 2565fe20ae..f5155b85ea 100644 --- a/codemp/game/NPC_combat.c +++ b/codemp/game/NPC_combat.c @@ -747,14 +747,6 @@ void ChangeWeapon( gentity_t *ent, int newWeapon ) ent->NPC->burstSpacing = 2000;//2 seconds ent->NPC->attackHold = 1000;//Hold attack button for a 1-second burst break; - - case WP_TRICORDER: - ent->NPC->aiFlags |= NPCAI_BURST_WEAPON; - ent->NPC->burstMin = 5; - ent->NPC->burstMean = 10; - ent->NPC->burstMax = 30; - ent->NPC->burstSpacing = 1000; - break; */ case WP_BLASTER: @@ -1075,54 +1067,6 @@ void WeaponThink( qboolean inCombat ) Add_Ammo (NPCS.NPC, NPCS.client->ps.weapon, 100); } - /*if ( NPC->playerTeam == TEAM_BORG ) - {//HACK!!! - if(!(NPC->client->ps.stats[STAT_WEAPONS] & ( 1 << WP_BORG_WEAPON ))) - NPC->client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_BORG_WEAPON ); - - if ( client->ps.weapon != WP_BORG_WEAPON ) - { - NPC_ChangeWeapon( WP_BORG_WEAPON ); - Add_Ammo (NPC, client->ps.weapon, 10); - NPCInfo->currentAmmo = client->ps.ammo[client->ps.weapon]; - } - } - else */ - - /*if ( NPC->client->playerTeam == TEAM_SCAVENGERS ) - {//HACK!!! - if(!(NPC->client->ps.stats[STAT_WEAPONS] & ( 1 << WP_BLASTER ))) - NPC->client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_BLASTER ); - - if ( client->ps.weapon != WP_BLASTER ) - - { - NPC_ChangeWeapon( WP_BLASTER ); - Add_Ammo (NPC, client->ps.weapon, 10); -// NPCInfo->currentAmmo = client->ps.ammo[client->ps.weapon]; - NPCInfo->currentAmmo = client->ps.ammo[weaponData[client->ps.weapon].ammoIndex]; // checkme - } - } - else*/ -//MCG - End - { - // if the gun in our hands is out of ammo, we need to change - /*if ( client->ps.ammo[client->ps.weapon] == 0 ) - { - NPCInfo->aiFlags |= NPCAI_CHECK_WEAPON; - } - - if ( NPCInfo->aiFlags & NPCAI_CHECK_WEAPON ) - { - NPCInfo->aiFlags &= ~NPCAI_CHECK_WEAPON; - bestWeapon = ChooseBestWeapon(); - if ( bestWeapon != client->ps.weapon ) - { - NPC_ChangeWeapon( bestWeapon ); - } - }*/ - } - NPCS.ucmd.weapon = NPCS.client->ps.weapon; ShootThink(); } @@ -1327,11 +1271,6 @@ int NPC_AttackDebounceForWeapon (void) case WP_SABER: return 100; break; - - - case WP_TRICORDER: - return 0;//tricorder - break; */ case WP_SABER: return 0; @@ -1394,11 +1333,6 @@ float NPC_MaxDistSquaredForWeapon (void) case WP_SABER: return 1024 * 1024; break; - - - case WP_TRICORDER: - return 0;//tricorder - break; */ case WP_SABER: if ( NPCS.NPC->client && NPCS.NPC->client->saber[0].blade[0].lengthMax ) @@ -2518,11 +2452,7 @@ float IdealDistance ( gentity_t *self ) case WP_THERMAL: ideal += 50; break; - -/* case WP_TRICORDER: - ideal = 0; - break; -*/ + case WP_SABER: case WP_BRYAR_PISTOL: // case WP_BLASTER_PISTOL: diff --git a/codemp/game/NPC_reactions.c b/codemp/game/NPC_reactions.c index 17e50a32ab..65163380c2 100644 --- a/codemp/game/NPC_reactions.c +++ b/codemp/game/NPC_reactions.c @@ -152,17 +152,13 @@ void NPC_SetPainEvent( gentity_t *self ) { if ( !self->NPC || !(self->NPC->aiFlags&NPCAI_DIE_ON_IMPACT) ) { - // no more borg - // if( self->client->playerTeam != TEAM_BORG ) - // { - //if ( !Q3_TaskIDPending( self, TID_CHAN_VOICE ) ) - if (!trap->ICARUS_TaskIDPending((sharedEntity_t *)self, TID_CHAN_VOICE) && self->client) - { - //G_AddEvent( self, EV_PAIN, floor((float)self->health/self->max_health*100.0f) ); - G_AddEvent( self, EV_PAIN, floor((float)self->health/self->client->ps.stats[STAT_MAX_HEALTH]*100.0f) ); - //rwwFIXMEFIXME: Do this properly? - } - // } + //if ( !Q3_TaskIDPending( self, TID_CHAN_VOICE ) ) + if (!trap->ICARUS_TaskIDPending((sharedEntity_t *)self, TID_CHAN_VOICE) && self->client) + { + //G_AddEvent( self, EV_PAIN, floor((float)self->health/self->max_health*100.0f) ); + G_AddEvent( self, EV_PAIN, floor((float)self->health/self->client->ps.stats[STAT_MAX_HEALTH]*100.0f) ); + //rwwFIXMEFIXME: Do this properly? + } } } diff --git a/codemp/game/NPC_spawn.c b/codemp/game/NPC_spawn.c index 883550d1b6..a9761a9be4 100644 --- a/codemp/game/NPC_spawn.c +++ b/codemp/game/NPC_spawn.c @@ -527,19 +527,6 @@ int NPC_WeaponsForTeam( team_t team, int spawnflags, const char *NPC_type ) //*** not sure how to handle this, should I pass in class instead of team and go from there? - dmv switch(team) { - // no longer exists -// case TEAM_BORG: -// break; - -// case TEAM_HIROGEN: -// if( Q_stricmp( "hirogenalpha", NPC_type ) == 0 ) -// return ( 1 << WP_BLASTER); - //Falls through - -// case TEAM_KLINGON: - - //NOTENOTE: Falls through - // case TEAM_IMPERIAL: case NPCTEAM_ENEMY: if ( Q_stricmp( "tavion", NPC_type ) == 0 || @@ -685,9 +672,6 @@ int NPC_WeaponsForTeam( team_t team, int spawnflags, const char *NPC_type ) case NPCTEAM_PLAYER: -// if(spawnflags & SFB_TRICORDER) -// return ( 1 << WP_TRICORDER); - if(spawnflags & SFB_RIFLEMAN) return ( 1 << WP_REPEATER); diff --git a/codemp/game/NPC_stats.c b/codemp/game/NPC_stats.c index 75d71a0699..0478405df7 100644 --- a/codemp/game/NPC_stats.c +++ b/codemp/game/NPC_stats.c @@ -151,20 +151,6 @@ extern stringID_table_t FPTable[]; char *TeamNames[TEAM_NUM_TEAMS] = { "", -// "starfleet", -// "borg", -// "parasite", -// "scavengers", -// "klingon", -// "malon", -// "hirogen", -// "imperial", -// "stasis", -// "species8472", -// "dreadnought", -// "forge", -// "disguise", -// "player (not valid)" "player", "enemy", "neutral" @@ -284,16 +270,6 @@ class_t TranslateClassName( const char *name ) } */ -/* -static race_t TranslateRaceName( const char *name ) -{ - if ( !Q_stricmp( name, "human" ) ) - { - return RACE_HUMAN; - } - return RACE_NONE; -} -*/ /* static rank_t TranslateRankName( const char *name ) diff --git a/codemp/game/NPC_utils.c b/codemp/game/NPC_utils.c index c6e48bac98..39985104d8 100644 --- a/codemp/game/NPC_utils.c +++ b/codemp/game/NPC_utils.c @@ -1324,17 +1324,6 @@ NPC_PickEnemyExt gentity_t *NPC_PickEnemyExt( qboolean checkAlerts ) { - - //Check for Hazard Team status and remove this check - /* - if ( NPC->client->playerTeam != TEAM_STARFLEET ) - { - //If we've found the player, return it - if ( NPC_FindPlayer() ) - return &g_entities[0]; - } - */ - //If we've asked for the closest enemy int entID = NPC_FindNearestEnemy( NPCS.NPC ); diff --git a/codemp/game/b_local.h b/codemp/game/b_local.h index 233ea8ef66..6a2682acd0 100644 --- a/codemp/game/b_local.h +++ b/codemp/game/b_local.h @@ -152,15 +152,8 @@ extern void NPC_DeleteFromFormation (gentity_t *self); #define NUM_POSITIONS 30 //NPC spawnflags -#define SFB_SMALLHULL 1 - #define SFB_RIFLEMAN 2 -#define SFB_OLDBORG 2//Borg #define SFB_PHASER 4 -#define SFB_GUN 4//Borg -#define SFB_TRICORDER 8 -#define SFB_TASER 8//Borg -#define SFB_DRILL 16//Borg #define SFB_CINEMATIC 32 #define SFB_NOTSOLID 64 diff --git a/codemp/game/g_active.c b/codemp/game/g_active.c index 12db0e7dad..0675362b58 100644 --- a/codemp/game/g_active.c +++ b/codemp/game/g_active.c @@ -1488,33 +1488,7 @@ static int NPC_GetRunSpeed( gentity_t *ent ) if ( ( ent->client == NULL ) || ( ent->NPC == NULL ) ) return 0; -/* - switch ( ent->client->playerTeam ) - { - case TEAM_BORG: - runSpeed = ent->NPC->stats.runSpeed; - runSpeed += BORG_RUN_INCR * (g_npcspskill->integer%3); - break; - case TEAM_8472: - runSpeed = ent->NPC->stats.runSpeed; - runSpeed += SPECIES_RUN_INCR * (g_npcspskill->integer%3); - break; - - case TEAM_STASIS: - runSpeed = ent->NPC->stats.runSpeed; - runSpeed += STASIS_RUN_INCR * (g_npcspskill->integer%3); - break; - - case TEAM_BOTS: - runSpeed = ent->NPC->stats.runSpeed; - break; - - default: - runSpeed = ent->NPC->stats.runSpeed; - break; - } -*/ // team no longer indicates species/race. Use NPC_class to adjust speed for specific npc types switch( ent->client->NPC_class) { @@ -2249,7 +2223,6 @@ void ClientThink_real( gentity_t *ent ) { if ( ent->NPC->currentSpeed >= 80 && !controlledByPlayer ) {//At higher speeds, need to slow down close to stuff //Slow down as you approach your goal - // if ( ent->NPC->distToGoal < SLOWDOWN_DIST && client->race != RACE_BORG && !(ent->NPC->aiFlags&NPCAI_NO_SLOWDOWN) )//128 if ( ent->NPC->distToGoal < SLOWDOWN_DIST && !(ent->NPC->aiFlags&NPCAI_NO_SLOWDOWN) )//128 { if ( ent->NPC->desiredSpeed > MIN_NPC_SPEED ) diff --git a/codemp/game/g_log.c b/codemp/game/g_log.c index a513f1ddef..e789b363c5 100644 --- a/codemp/game/g_log.c +++ b/codemp/game/g_log.c @@ -931,7 +931,7 @@ qboolean CalculateUntouchable(gentity_t *ent) playTime = (level.time - ent->client->pers.enterTime)/60000; if ( level.gametype == GT_JEDIMASTER && ent->client->ps.isJediMaster ) - {//Jedi Master (was Borg queen) can only be killed once anyway + {//Jedi Master can only be killed once anyway return qfalse; } //------------------------------------------------------ MUST HAVE ACHIEVED 2 KILLS PER MINUTE @@ -1021,7 +1021,7 @@ qboolean CalculateTactician(gentity_t *ent, int *kills) return qfalse; } if ( level.gametype == GT_JEDIMASTER && ent->client->ps.isJediMaster ) - {//Jedi Master (was Borg queen) has only 1 weapon + {//Jedi Master has only 1 weapon return qfalse; } //------------------------------------------------------ MUST HAVE ACHIEVED 2 KILLS PER MINUTE @@ -1208,61 +1208,6 @@ qboolean CalculateTeamMVP(gentity_t *ent) return qfalse; } -#if 0 -// Unused -qboolean CalculateTeamMVPByRank(gentity_t *ent) -{ - int i = 0, nBestPlayer = -1, nScore = 0, nHighestScore = 0, - team = ent->client->ps.persistant[PERS_RANK]+1; - qboolean bTied = (team == 3); - gentity_t *player = NULL; - - /* - if ( team == ent->client->ps.persistant[PERS_TEAM] && ent->client->ps.persistant[PERS_CLASS] == PC_BORG ) - {//only the queen can be the MVP - if ( borgQueenClientNum == ent->s.number ) - { - return qtrue; - } - else - { - return qfalse; - } - } - */ - - for (i = 0; i < sv_maxclients.integer; i++) - { - nScore = 0; - player = g_entities + i; - if (!player->inuse) - continue; - if (!bTied) - { - if (player->client->ps.persistant[PERS_TEAM] != team) - { - continue; - } - } - nScore = player->client->ps.persistant[PERS_SCORE]; - if (nScore > nHighestScore) - { - nHighestScore = nScore; - nBestPlayer = i; - } - } - if (-1 == nBestPlayer) - { - return qfalse; - } - if (nBestPlayer == ent->s.number) - { - return qtrue; - } - return qfalse; -} -#endif - qboolean CalculateTeamDefender(gentity_t *ent) { int i = 0, nBestPlayer = -1, nScore = 0, nHighestScore = 0, From dcb332d5a94f0723436dfd55e9ab99eb139af298 Mon Sep 17 00:00:00 2001 From: David Jones Date: Wed, 20 Jan 2016 11:38:23 +0000 Subject: [PATCH 139/445] Use ++ prefix for non-primitives --- code/Ragl/graph_region.h | 2 +- code/Ratl/map_vs.h | 2 +- code/cgame/FxScheduler.cpp | 4 ++-- code/client/snd_ambient.cpp | 2 +- code/game/AI_HazardTrooper.cpp | 6 +++--- code/game/Q3_Interface.cpp | 2 +- code/game/g_navigator.cpp | 2 +- code/game/g_ref.cpp | 4 ++-- code/icarus/BlockStream.cpp | 2 +- code/icarus/Sequence.cpp | 6 +++--- code/icarus/Sequencer.cpp | 4 ++-- code/icarus/TaskManager.cpp | 6 +++--- code/qcommon/strip.cpp | 8 ++++---- code/rd-vanilla/G2_API.cpp | 4 ++-- code/rd-vanilla/G2_misc.cpp | 2 +- code/rd-vanilla/tr_ghoul2.cpp | 2 +- codeJK2/cgame/FxScheduler.cpp | 4 ++-- codeJK2/game/g_ICARUS.cpp | 2 +- codeJK2/game/g_ref.cpp | 4 ++-- codeJK2/icarus/BlockStream.cpp | 2 +- codeJK2/icarus/Interpreter.cpp | 2 +- codeJK2/icarus/Sequence.cpp | 8 ++++---- codeJK2/icarus/Sequencer.cpp | 4 ++-- codeJK2/icarus/TaskManager.cpp | 6 +++--- codeJK2/icarus/Tokenizer.cpp | 2 +- codemp/icarus/Interpreter.cpp | 2 +- codemp/icarus/Tokenizer.cpp | 2 +- 27 files changed, 48 insertions(+), 48 deletions(-) diff --git a/code/Ragl/graph_region.h b/code/Ragl/graph_region.h index 5879424c65..42d899c021 100644 --- a/code/Ragl/graph_region.h +++ b/code/Ragl/graph_region.h @@ -421,7 +421,7 @@ class graph_region : public ratl::ratl_base if (mRegionCount) { int RegionEdges = 0; - for (typename TEdges::iterator it=mEdges.begin(); it!=mEdges.end(); it++) + for (typename TEdges::iterator it=mEdges.begin(); it!=mEdges.end(); ++it) { RegionEdges += (*it).size(); } diff --git a/code/Ratl/map_vs.h b/code/Ratl/map_vs.h index 7f525d2e46..0d9b11f9a3 100644 --- a/code/Ratl/map_vs.h +++ b/code/Ratl/map_vs.h @@ -1160,7 +1160,7 @@ class set_base : public tree_base { // fixme, this don't work iterator ubound(this, find_index(key)); - ubound++; + ++ubound; return ubound; } diff --git a/code/cgame/FxScheduler.cpp b/code/cgame/FxScheduler.cpp index 3f3d77f3e2..e09df30d68 100644 --- a/code/cgame/FxScheduler.cpp +++ b/code/cgame/FxScheduler.cpp @@ -328,7 +328,7 @@ void CFxScheduler::Clean(bool bRemoveTemplates /*= true*/, int idToPreserve /*= while ( itr != mFxSchedule.end() ) { next = itr; - next++; + ++next; delete *itr; mFxSchedule.erase(itr); @@ -1345,7 +1345,7 @@ void CFxScheduler::AddScheduledEffects( bool portal ) while ( itr != mFxSchedule.end() ) { next = itr; - next++; + ++next; if (portal == (*itr)->mPortalEffect) { diff --git a/code/client/snd_ambient.cpp b/code/client/snd_ambient.cpp index 4c56abbfae..66143fbe75 100644 --- a/code/client/snd_ambient.cpp +++ b/code/client/snd_ambient.cpp @@ -112,7 +112,7 @@ void CSetGroup::Free( void ) { std::vector::iterator ai; - for ( ai = m_ambientSets->begin(); ai != m_ambientSets->end(); ai++ ) + for ( ai = m_ambientSets->begin(); ai != m_ambientSets->end(); ++ai ) { Z_Free ( (*ai) ); } diff --git a/code/game/AI_HazardTrooper.cpp b/code/game/AI_HazardTrooper.cpp index 14845c4f4c..fd4e6beeae 100644 --- a/code/game/AI_HazardTrooper.cpp +++ b/code/game/AI_HazardTrooper.cpp @@ -1120,7 +1120,7 @@ void Troop_Initialize() //////////////////////////////////////////////////////////////////////////////////////// void Troop_Update() { - for (TTroopPool::iterator i=mTroops.begin(); i!=mTroops.end(); i++) + for (TTroopPool::iterator i=mTroops.begin(); i!=mTroops.end(); ++i) { i->Update(); } @@ -1141,7 +1141,7 @@ void Trooper_UpdateTroop(gentity_t* actor) TTroopPool::iterator closestTroop = mTroops.end(); trace_t trace; - for (TTroopPool::iterator iTroop=mTroops.begin(); iTroop!=mTroops.end(); iTroop++) + for (TTroopPool::iterator iTroop=mTroops.begin(); iTroop!=mTroops.end(); ++iTroop) { if (iTroop->Team()==actor->client->playerTeam) { @@ -1196,7 +1196,7 @@ void Trooper_UpdateTroop(gentity_t* actor) float closestDist = 0; TTroopPool::iterator closestTroop = mTroops.end(); - for (TTroopPool::iterator iTroop=mTroops.begin(); iTroop!=mTroops.end(); iTroop++) + for (TTroopPool::iterator iTroop=mTroops.begin(); iTroop!=mTroops.end(); ++iTroop) { curDist = iTroop->DistanceSq(actor); if ((curDistbuffer ); delete (*iterScript).second; diff --git a/code/game/g_navigator.cpp b/code/game/g_navigator.cpp index 6da921793e..297286dea0 100644 --- a/code/game/g_navigator.cpp +++ b/code/game/g_navigator.cpp @@ -5529,7 +5529,7 @@ bool STEER::Reached(gentity_t* actor, const vec3_t& target, float targetRadius, void ClearAllNavStructures(void) { TEntEdgeMap::iterator i = mEntEdgeMap.begin(); - for ( ; i != mEntEdgeMap.end(); i++) + for ( ; i != mEntEdgeMap.end(); ++i) { i->clear(); } diff --git a/code/game/g_ref.cpp b/code/game/g_ref.cpp index 25c1b2b55f..9e40bce481 100644 --- a/code/game/g_ref.cpp +++ b/code/game/g_ref.cpp @@ -77,7 +77,7 @@ void TAG_Init( void ) refTagOwner_m::iterator rtoi; //Delete all owners - for ( rtoi = refTagOwnerMap.begin(); rtoi != refTagOwnerMap.end(); rtoi++ ) + for ( rtoi = refTagOwnerMap.begin(); rtoi != refTagOwnerMap.end(); ++rtoi ) { if ( (*rtoi).second == NULL ) { @@ -88,7 +88,7 @@ void TAG_Init( void ) refTag_v::iterator rti; //Delete all tags within the owner's scope - for ( rti = ((*rtoi).second)->tags.begin(); rti != ((*rtoi).second)->tags.end(); rti++ ) + for ( rti = ((*rtoi).second)->tags.begin(); rti != ((*rtoi).second)->tags.end(); ++rti ) { if ( (*rti) == NULL ) { diff --git a/code/icarus/BlockStream.cpp b/code/icarus/BlockStream.cpp index cf4aa8f0b1..3e94244c4e 100644 --- a/code/icarus/BlockStream.cpp +++ b/code/icarus/BlockStream.cpp @@ -388,7 +388,7 @@ CBlock *CBlock::Duplicate( CIcarus* icarus ) newblock->Create( m_id ); //Duplicate entire block and return the cc - for ( mi = m_members.begin(); mi != m_members.end(); mi++ ) + for ( mi = m_members.begin(); mi != m_members.end(); ++mi ) { newblock->AddMember( (*mi)->Duplicate(icarus) ); } diff --git a/code/icarus/Sequence.cpp b/code/icarus/Sequence.cpp index f17170c27f..bdfa249dc8 100644 --- a/code/icarus/Sequence.cpp +++ b/code/icarus/Sequence.cpp @@ -97,7 +97,7 @@ void CSequence::Delete( CIcarus* icarus ) (*iterSeq).second->SetParent( NULL ); }*/ - for ( si = m_children.begin(); si != m_children.end(); si++ ) + for ( si = m_children.begin(); si != m_children.end(); ++si ) { (*si)->SetParent( NULL ); } @@ -106,7 +106,7 @@ void CSequence::Delete( CIcarus* icarus ) //m_childrenMap.clear(); //Clear all held commands - for ( bi = m_commands.begin(); bi != m_commands.end(); bi++ ) + for ( bi = m_commands.begin(); bi != m_commands.end(); ++bi ) { (*bi)->Free(icarus); delete (*bi); //Free() handled internally -- not any more!! @@ -317,7 +317,7 @@ void CSequence::RemoveFlag( int flag, bool children ) }*/ sequence_l::iterator si; - for ( si = m_children.begin(); si != m_children.end(); si++ ) + for ( si = m_children.begin(); si != m_children.end(); ++si ) { (*si)->RemoveFlag( flag, true ); } diff --git a/code/icarus/Sequencer.cpp b/code/icarus/Sequencer.cpp index 70e9dfb733..d5067ba810 100644 --- a/code/icarus/Sequencer.cpp +++ b/code/icarus/Sequencer.cpp @@ -118,7 +118,7 @@ void CSequencer::Free( CIcarus* icarus ) // OLD STUFF! sequence_l::iterator sli; - for ( sli = m_sequences.begin(); sli != m_sequences.end(); sli++ ) + for ( sli = m_sequences.begin(); sli != m_sequences.end(); ++sli ) { icarus->DeleteSequence( (*sli) ); } @@ -181,7 +181,7 @@ int CSequencer::Flush( CSequence *owner, CIcarus* icarus ) { if ( ( (*sli) == owner ) || ( owner->HasChild( (*sli) ) ) || ( (*sli)->HasFlag( CSequence::SQ_PENDING ) ) || ( (*sli)->HasFlag( CSequence::SQ_TASK ) ) ) { - sli++; + ++sli; continue; } diff --git a/code/icarus/TaskManager.cpp b/code/icarus/TaskManager.cpp index 16471ef48d..63579f493c 100644 --- a/code/icarus/TaskManager.cpp +++ b/code/icarus/TaskManager.cpp @@ -222,7 +222,7 @@ int CTaskManager::Free( void ) assert(!m_resident); //don't free me, i'm currently running! //Clear out all pending tasks - for ( ti = m_tasks.begin(); ti != m_tasks.end(); ti++ ) + for ( ti = m_tasks.begin(); ti != m_tasks.end(); ++ti ) { (*ti)->Free(); } @@ -230,7 +230,7 @@ int CTaskManager::Free( void ) m_tasks.clear(); //Clear out all taskGroups - for ( gi = m_taskGroups.begin(); gi != m_taskGroups.end(); gi++ ) + for ( gi = m_taskGroups.begin(); gi != m_taskGroups.end(); ++gi ) { delete (*gi); } @@ -930,7 +930,7 @@ int CTaskManager::Completed( int id ) taskGroup_v::iterator tgi; //Mark the task as completed - for ( tgi = m_taskGroups.begin(); tgi != m_taskGroups.end(); tgi++ ) + for ( tgi = m_taskGroups.begin(); tgi != m_taskGroups.end(); ++tgi ) { //If this returns true, then the task was marked properly if ( (*tgi)->MarkTaskComplete( id ) ) diff --git a/code/qcommon/strip.cpp b/code/qcommon/strip.cpp index fdb4eb4a65..e9bbd77086 100644 --- a/code/qcommon/strip.cpp +++ b/code/qcommon/strip.cpp @@ -1057,7 +1057,7 @@ void JK2SP_Unload(unsigned char Registration) for(i = JK2SP_ListByName.begin(); i != JK2SP_ListByName.end(); i = next) { next = i; - next++; + ++next; if ((*i).second->UnRegister(Registration)) { @@ -1082,7 +1082,7 @@ int JK2SP_GetStringID(const char *inReference) Q_strncpyz(Reference, inReference, MAX_QPATH); Q_strupr(Reference); - for(i = JK2SP_ListByID.begin(); i != JK2SP_ListByID.end(); i++) + for(i = JK2SP_ListByID.begin(); i != JK2SP_ListByID.end(); ++i) { ID = (*i).second->FindStringID(Reference); if (ID >= 0) @@ -1212,7 +1212,7 @@ static void JK2SP_UpdateLanguage(void) std::list::iterator spit; // Grab all SP ids - for(it = JK2SP_ListByID.begin(); it != JK2SP_ListByID.end(); it++) + for(it = JK2SP_ListByID.begin(); it != JK2SP_ListByID.end(); ++it) { sps.push_back(cStringPackageID((*it).second->GetName(), (*it).second->GetRegistration())); } @@ -1220,7 +1220,7 @@ static void JK2SP_UpdateLanguage(void) JK2SP_Unload(SP_REGISTER_CLIENT | SP_REGISTER_SERVER | SP_REGISTER_MENU | SP_REGISTER_REQUIRED); // Reinitialise with new language - for(spit = sps.begin(); spit != sps.end(); spit++) + for(spit = sps.begin(); spit != sps.end(); ++spit) { JK2SP_Register((*spit).GetName(), (*spit).GetReg()); } diff --git a/code/rd-vanilla/G2_API.cpp b/code/rd-vanilla/G2_API.cpp index 45dedbe90c..2129aabe24 100644 --- a/code/rd-vanilla/G2_API.cpp +++ b/code/rd-vanilla/G2_API.cpp @@ -83,7 +83,7 @@ class ErrorReporter Com_DPrintf(mess); std::map::iterator i; - for (i=mErrors.begin();i!=mErrors.end();i++) + for (i=mErrors.begin();i!=mErrors.end();++i) { total+=(*i).second; sprintf(mess,"%s (hits %d)\n",(*i).first.c_str(),(*i).second); @@ -571,7 +571,7 @@ class Ghoul2InfoArray : public IGhoul2InfoArray for (i=0;i::iterator j; - for (j=mFreeIndecies.begin();j!=mFreeIndecies.end();j++) + for (j=mFreeIndecies.begin();j!=mFreeIndecies.end();++j) { if (*j==i) break; diff --git a/code/rd-vanilla/G2_misc.cpp b/code/rd-vanilla/G2_misc.cpp index eea2791119..46c35289d9 100644 --- a/code/rd-vanilla/G2_misc.cpp +++ b/code/rd-vanilla/G2_misc.cpp @@ -188,7 +188,7 @@ void DeleteGoreSet(int goreSetTag) CGoreSet::~CGoreSet() { std::multimap::iterator i; - for (i=mGoreRecords.begin();i!=mGoreRecords.end();i++) + for (i=mGoreRecords.begin();i!=mGoreRecords.end();++i) { DeleteGoreRecord((*i).second.mGoreTag); } diff --git a/code/rd-vanilla/tr_ghoul2.cpp b/code/rd-vanilla/tr_ghoul2.cpp index 5ad4c448b7..d81e7fc7e9 100644 --- a/code/rd-vanilla/tr_ghoul2.cpp +++ b/code/rd-vanilla/tr_ghoul2.cpp @@ -2342,7 +2342,7 @@ void RenderSurfaces(CRenderSurface &RS) for (k=range.first;k!=range.second;) { kcur=k; - k++; + ++k; GoreTextureCoordinates *tex=FindGoreRecord((*kcur).second.mGoreTag); if (!tex || // it is gone, lets get rid of it (kcur->second.mDeleteTime && curTime>=kcur->second.mDeleteTime)) // out of time diff --git a/codeJK2/cgame/FxScheduler.cpp b/codeJK2/cgame/FxScheduler.cpp index ff28306d47..d6a69c0a00 100644 --- a/codeJK2/cgame/FxScheduler.cpp +++ b/codeJK2/cgame/FxScheduler.cpp @@ -101,7 +101,7 @@ void CFxScheduler::Clean(bool bRemoveTemplates /*= true*/, int idToPreserve /*= while ( itr != mFxSchedule.end() ) { next = itr; - next++; + ++next; delete *itr; mFxSchedule.erase(itr); @@ -1073,7 +1073,7 @@ void CFxScheduler::AddScheduledEffects( void ) while ( itr != mFxSchedule.end() ) { next = itr; - next++; + ++next; if ( *(*itr) <= theFxHelper.mTime ) { diff --git a/codeJK2/game/g_ICARUS.cpp b/codeJK2/game/g_ICARUS.cpp index 4344d2896c..77c4c3136f 100644 --- a/codeJK2/game/g_ICARUS.cpp +++ b/codeJK2/game/g_ICARUS.cpp @@ -161,7 +161,7 @@ void ICARUS_Shutdown( void ) } //Clear out all precached scripts - for ( ei = ICARUS_BufferList.begin(); ei != ICARUS_BufferList.end(); ei++ ) + for ( ei = ICARUS_BufferList.begin(); ei != ICARUS_BufferList.end(); ++ei ) { gi.Free( (*ei).second->buffer ); delete (*ei).second; diff --git a/codeJK2/game/g_ref.cpp b/codeJK2/game/g_ref.cpp index 16c071e74b..f54a2c9d2b 100644 --- a/codeJK2/game/g_ref.cpp +++ b/codeJK2/game/g_ref.cpp @@ -77,7 +77,7 @@ void TAG_Init( void ) refTagOwner_m::iterator rtoi; //Delete all owners - for ( rtoi = refTagOwnerMap.begin(); rtoi != refTagOwnerMap.end(); rtoi++ ) + for ( rtoi = refTagOwnerMap.begin(); rtoi != refTagOwnerMap.end(); ++rtoi ) { if ( (*rtoi).second == NULL ) { @@ -88,7 +88,7 @@ void TAG_Init( void ) refTag_v::iterator rti; //Delete all tags within the owner's scope - for ( rti = ((*rtoi).second)->tags.begin(); rti != ((*rtoi).second)->tags.end(); rti++ ) + for ( rti = ((*rtoi).second)->tags.begin(); rti != ((*rtoi).second)->tags.end(); ++rti ) { if ( (*rti) == NULL ) { diff --git a/codeJK2/icarus/BlockStream.cpp b/codeJK2/icarus/BlockStream.cpp index bcaa8c5477..af8976518d 100644 --- a/codeJK2/icarus/BlockStream.cpp +++ b/codeJK2/icarus/BlockStream.cpp @@ -390,7 +390,7 @@ CBlock *CBlock::Duplicate( void ) newblock->Create( m_id ); //Duplicate entire block and return the cc - for ( mi = m_members.begin(); mi != m_members.end(); mi++ ) + for ( mi = m_members.begin(); mi != m_members.end(); ++mi ) { newblock->AddMember( (*mi)->Duplicate() ); } diff --git a/codeJK2/icarus/Interpreter.cpp b/codeJK2/icarus/Interpreter.cpp index 397a431a4f..2fe1f01c78 100644 --- a/codeJK2/icarus/Interpreter.cpp +++ b/codeJK2/icarus/Interpreter.cpp @@ -242,7 +242,7 @@ void CInterpreter::FreeVars( void ) { variable_v::iterator vi; - for ( vi = m_vars.begin(); vi != m_vars.end(); vi++ ) + for ( vi = m_vars.begin(); vi != m_vars.end(); ++vi ) { delete (*vi); } diff --git a/codeJK2/icarus/Sequence.cpp b/codeJK2/icarus/Sequence.cpp index d39f91f09b..13ea05469d 100644 --- a/codeJK2/icarus/Sequence.cpp +++ b/codeJK2/icarus/Sequence.cpp @@ -85,14 +85,14 @@ void CSequence::Delete( void ) //Clear all children if ( m_numChildren > 0 ) { - for ( si = m_children.begin(); si != m_children.end(); si++ ) + for ( si = m_children.begin(); si != m_children.end(); ++si ) { (*si)->SetParent( NULL ); } } //Clear all held commands - for ( bi = m_commands.begin(); bi != m_commands.end(); bi++ ) + for ( bi = m_commands.begin(); bi != m_commands.end(); ++bi ) { delete (*bi); //Free() handled internally } @@ -146,7 +146,7 @@ bool CSequence::HasChild( CSequence *sequence ) { sequence_l::iterator ci; - for ( ci = m_children.begin(); ci != m_children.end(); ci++ ) + for ( ci = m_children.begin(); ci != m_children.end(); ++ci ) { if ( (*ci) == sequence ) return true; @@ -280,7 +280,7 @@ void CSequence::RemoveFlag( int flag, bool children ) { sequence_l::iterator si; - for ( si = m_children.begin(); si != m_children.end(); si++ ) + for ( si = m_children.begin(); si != m_children.end(); ++si ) { (*si)->RemoveFlag( flag, true ); } diff --git a/codeJK2/icarus/Sequencer.cpp b/codeJK2/icarus/Sequencer.cpp index 44126a1a74..24fb057482 100644 --- a/codeJK2/icarus/Sequencer.cpp +++ b/codeJK2/icarus/Sequencer.cpp @@ -95,7 +95,7 @@ int CSequencer::Free( void ) sequence_l::iterator sli; //Flush the sequences - for ( sli = m_sequences.begin(); sli != m_sequences.end(); sli++ ) + for ( sli = m_sequences.begin(); sli != m_sequences.end(); ++sli ) { m_owner->DeleteSequence( (*sli) ); } @@ -138,7 +138,7 @@ int CSequencer::Flush( CSequence *owner ) { if ( ( (*sli) == owner ) || ( owner->HasChild( (*sli) ) ) || ( (*sli)->HasFlag( SQ_PENDING ) ) || ( (*sli)->HasFlag( SQ_TASK ) ) ) { - sli++; + ++sli; continue; } diff --git a/codeJK2/icarus/TaskManager.cpp b/codeJK2/icarus/TaskManager.cpp index f0cecc1d6d..28c498855e 100644 --- a/codeJK2/icarus/TaskManager.cpp +++ b/codeJK2/icarus/TaskManager.cpp @@ -216,7 +216,7 @@ int CTaskManager::Free( void ) tasks_l::iterator ti; //Clear out all pending tasks - for ( ti = m_tasks.begin(); ti != m_tasks.end(); ti++ ) + for ( ti = m_tasks.begin(); ti != m_tasks.end(); ++ti ) { (*ti)->Free(); } @@ -224,7 +224,7 @@ int CTaskManager::Free( void ) m_tasks.clear(); //Clear out all taskGroups - for ( gi = m_taskGroups.begin(); gi != m_taskGroups.end(); gi++ ) + for ( gi = m_taskGroups.begin(); gi != m_taskGroups.end(); ++gi ) { delete (*gi); } @@ -930,7 +930,7 @@ int CTaskManager::Completed( int id ) taskGroup_v::iterator tgi; //Mark the task as completed - for ( tgi = m_taskGroups.begin(); tgi != m_taskGroups.end(); tgi++ ) + for ( tgi = m_taskGroups.begin(); tgi != m_taskGroups.end(); ++tgi ) { //If this returns true, then the task was marked properly if ( (*tgi)->MarkTaskComplete( id ) ) diff --git a/codeJK2/icarus/Tokenizer.cpp b/codeJK2/icarus/Tokenizer.cpp index a4594ba949..3324355931 100644 --- a/codeJK2/icarus/Tokenizer.cpp +++ b/codeJK2/icarus/Tokenizer.cpp @@ -210,7 +210,7 @@ void CSymbolTable::Init() void CSymbolTable::DiscardSymbols() { - for (symbolmap_t::iterator isymbol = m_symbols.begin(); isymbol != m_symbols.end(); isymbol++) + for (symbolmap_t::iterator isymbol = m_symbols.begin(); isymbol != m_symbols.end(); ++isymbol) { (*isymbol).second->Delete(); } diff --git a/codemp/icarus/Interpreter.cpp b/codemp/icarus/Interpreter.cpp index f0b3d914cd..53a29dc0ff 100644 --- a/codemp/icarus/Interpreter.cpp +++ b/codemp/icarus/Interpreter.cpp @@ -243,7 +243,7 @@ void CInterpreter::FreeVars( void ) { variable_v::iterator vi; - for ( vi = m_vars.begin(); vi != m_vars.end(); vi++ ) + for ( vi = m_vars.begin(); vi != m_vars.end(); ++vi ) { delete (*vi); } diff --git a/codemp/icarus/Tokenizer.cpp b/codemp/icarus/Tokenizer.cpp index 184a2842e6..83248b7b41 100644 --- a/codemp/icarus/Tokenizer.cpp +++ b/codemp/icarus/Tokenizer.cpp @@ -215,7 +215,7 @@ void CSymbolTable::Init() void CSymbolTable::DiscardSymbols() { - for (symbolmap_t::iterator isymbol = m_symbols.begin(); isymbol != m_symbols.end(); isymbol++) + for (symbolmap_t::iterator isymbol = m_symbols.begin(); isymbol != m_symbols.end(); ++isymbol) { (*isymbol).second->Delete(); } From 09d7e9194d097894c070312ee28f540011356b1b Mon Sep 17 00:00:00 2001 From: Baris Sencan Date: Sun, 24 Jan 2016 19:22:18 -0800 Subject: [PATCH 140/445] [README] Fix OS X instructions Latest builds of OpenJK seem to search for SDL in homebrew installation locations. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index eac878ab87..e2f84f70df 100644 --- a/README.md +++ b/README.md @@ -43,9 +43,9 @@ Installing and running OpenJK: If you have the Mac App Store Version of Jedi Academy, follow these steps to get OpenJK runnning under OS X: -1. Download the latest SDL2 Framework from [libsdl.org](https://www.libsdl.org/download-2.0.php) -2. Extract the content or open the file and put `SDL2.framework` in `/Library/Frameworks/` or `/Users//Library/Frameworks/` If this directory does not exist, create it. -3. Extract the content of the OpenJK DMG ([Download the latest build](http://builds.openjk.org)) into the game directory `/Applications/Star Wars Jedi Knight: Jedi Academy.app/Contents/` +1. Install [Homebrew](http://brew.sh/) if you don't have it. +2. Open the Terminal app, and enter the command `brew install sdl2`. +3. Extract the contents of the OpenJK DMG ([Download the latest build](http://builds.openjk.org)) into the game directory `/Applications/Star Wars Jedi Knight: Jedi Academy.app/Contents/` 4. Run `openJK.app` or `openJK SP.app` 5. Savegames, Config Files and Log Files are stored in `/Users//Library/Application Support/OpenJK/` From 2fc184b98741d215e139e8fabcee797b57057151 Mon Sep 17 00:00:00 2001 From: Dusty Date: Tue, 9 Feb 2016 10:57:38 -0500 Subject: [PATCH 141/445] in progress --- code/game/AI_Jedi.cpp | 36 +++++-- code/game/NPC.cpp | 21 ++-- code/game/NPC_behavior.cpp | 16 ++- code/game/NPC_combat.cpp | 26 +++++ code/game/bg_panimate.cpp | 4 +- code/game/bg_pmove.cpp | 15 ++- code/game/g_active.cpp | 30 ++++-- code/game/g_combat.cpp | 56 +++++++++++ code/game/g_weaponLoad.cpp | 1 + code/game/wp_saber.cpp | 198 +++++++++++++++++++++++++++++-------- 10 files changed, 333 insertions(+), 70 deletions(-) diff --git a/code/game/AI_Jedi.cpp b/code/game/AI_Jedi.cpp index 5b8205971a..fb6cef3440 100644 --- a/code/game/AI_Jedi.cpp +++ b/code/game/AI_Jedi.cpp @@ -2056,8 +2056,8 @@ static qboolean Jedi_Strafe( int strafeTimeMin, int strafeTimeMax, int nextStraf if ( strafed ) { TIMER_Set( NPC, "noStrafe", strafeTime + Q_irand( nextStrafeTimeMin, nextStrafeTimeMax ) ); - if ( walking ) - {//should be a slow strafe + if ( walking && NPC->s.weapon == WP_SABER ) + {//should be a slow strafe if we are a saber-wielder TIMER_Set( NPC, "walking", strafeTime ); } return qtrue; @@ -2147,10 +2147,13 @@ qboolean Jedi_DodgeEvasion( gentity_t *self, gentity_t *shooter, trace_t *tr, in {//the player if (g_forceNewPowers->integer) { - if (self->client->ps.forcePowerLevel[FP_SPEED] < 2) { + if (self->client->ps.forcePowerLevel[FP_SPEED] < 2) + { return qfalse; } - if (self->client->ps.forcePowersActive&(1 << FP_SPEED)) { + + if (self->client->ps.forcePowersActive&(1 << FP_SPEED)) + { return qfalse; //you're already moving so fast, player should just dodge manually } @@ -3931,6 +3934,11 @@ static qboolean Jedi_SaberBlock( void ) } */ + if (NPC->s.weapon != WP_SABER) + {//we are not a saber wielder + return qfalse; + } + if ( !TIMER_Done( NPC, "parryReCalcTime" ) ) {//can't do our own re-think of which parry to use yet return qfalse; @@ -4266,9 +4274,13 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en if ( NPC->enemy->client->ps.saberInFlight && NPC->enemy->client->ps.saberEntityNum != ENTITYNUM_NONE && NPC->enemy->client->ps.saberEntityState != SES_RETURNING ) - {//enemy is shooting lightning + {//enemy is saber throwing enemy_attacking = qtrue; throwing_saber = qtrue; + if (NPC->s.weapon == WP_MELEE) + {//melee users are more aware they need to evade + evasionChance += 5; + } } //FIXME: this needs to take skill and rank(reborn type) into account much more @@ -4392,7 +4404,7 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en if ( whichDefense >= 4 && whichDefense <= 12 ) {//would try to block - if ( NPC->client->ps.saberInFlight ) + if ( NPC->client->ps.saberInFlight || NPC->s.weapon != WP_SABER ) {//can't, saber in not in hand, so fall back to strafe/jump whichDefense = 100; } @@ -4482,7 +4494,17 @@ static void Jedi_EvasionSaber( vec3_t enemy_movedir, float enemy_dist, vec3_t en } else if ( enemy_attacking ) { - Jedi_SaberBlock(); + if (NPC->s.weapon == WP_MELEE) + {//melee users try to kick as a last resort + if (Jedi_DecideKick(enemy_dist) && G_CanKickEntity(NPC, NPC->enemy) && G_PickAutoKick(NPC, NPC->enemy, qtrue) != LS_NONE) + {//kicked! + TIMER_Set(NPC, "kickDebounce", Q_irand(3000, 10000)); + } + } + else + { + Jedi_SaberBlock(); + } } } } diff --git a/code/game/NPC.cpp b/code/game/NPC.cpp index 43a7c1f504..a575c756c2 100644 --- a/code/game/NPC.cpp +++ b/code/game/NPC.cpp @@ -56,6 +56,7 @@ extern bool Boba_Flee(); extern bool Boba_Tactics(); extern void BubbleShield_Update(); extern qboolean PM_LockedAnim( int anim ); +extern qboolean NPC_JediClassGood(gentity_t *self); extern cvar_t *g_dismemberment; extern cvar_t *g_saberRealisticCombat; @@ -2116,15 +2117,8 @@ void NPC_RunBehavior( int team, int bState ) } else { - /*if (level.time - NPCInfo->surrenderTime < 10000) - { //I was just surrendering a short time ago and the enemy is nearby - NPC_CheckSurrender(); - } - else { - NPC_BSFlee(); //I haven't been surrendering for a while, see if I can escape before surrendering - }*/ - NPC_BSFlee(); + } return; } @@ -2305,10 +2299,17 @@ void NPC_ExecuteBState ( gentity_t *self)//, int msec ) else if ( NPC->client->playerTeam != TEAM_ENEMY //not an enemy && (NPC->client->playerTeam != TEAM_FREE || (NPC->client->NPC_class == CLASS_TUSKEN && Q_irand( 0, 4 )))//not a rampaging creature or I'm a tusken and I feel generous (temporarily) && NPC->enemy->NPC - && (NPC->enemy->NPC->surrenderTime > level.time || (NPC->enemy->NPC->scriptFlags&SCF_FORCED_MARCH)) ) - {//don't shoot someone who's surrendering if you're a good guy + && (NPC->enemy->NPC->surrenderTime > level.time || (NPC->enemy->NPC->scriptFlags&SCF_FORCED_MARCH) + || (NPC_JediClassGood(NPC) && (NPC->enemy->s.weapon == WP_NONE || (NPC->enemy->s.weapon == WP_MELEE && !NPC->enemy)))) + ) + {//don't shoot someone who's surrendering if you're a good guy, especially if you're a Jedi ucmd.buttons &= ~BUTTON_ATTACK; ucmd.buttons &= ~BUTTON_ALT_ATTACK; + + if (NPC_JediClassGood(NPC)) + { + NPC_CheckEnemy(qtrue, qfalse); + } } if(client->ps.weaponstate == WEAPON_IDLE) diff --git a/code/game/NPC_behavior.cpp b/code/game/NPC_behavior.cpp index 45baddc868..a02fc4c223 100644 --- a/code/game/NPC_behavior.cpp +++ b/code/game/NPC_behavior.cpp @@ -1538,6 +1538,13 @@ void NPC_Surrender( void ) NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_COWER1_STOP, SETANIM_FLAG_HOLD|SETANIM_FLAG_OVERRIDE ); NPCInfo->surrenderTime = level.time + NPC->client->ps.torsoAnimTimer; } + else + { + NPC_SetAnim(NPC, SETANIM_TORSO, TORSO_SURRENDER_START, SETANIM_FLAG_HOLD | SETANIM_FLAG_OVERRIDE); + NPC->client->ps.torsoAnimTimer = 1000; + NPCInfo->surrenderTime = level.time + 1000;//stay surrendered for at least 1 second + //FIXME: while surrendering, make a big sight/sound alert? Or G_AlertTeam? + } } // New To The Surrender, So Start The Animation @@ -1563,7 +1570,7 @@ void NPC_Surrender( void ) else { NPC_SetAnim(NPC, SETANIM_TORSO, TORSO_SURRENDER_START, SETANIM_FLAG_HOLD | SETANIM_FLAG_OVERRIDE); - NPC->client->ps.torsoAnimTimer = Q_irand(4000, 7000); + NPC->client->ps.torsoAnimTimer = 1000; } } NPCInfo->surrenderTime = level.time + NPC->client->ps.torsoAnimTimer + 1000; @@ -1706,7 +1713,10 @@ qboolean NPC_BSFlee( void ) bool moveSuccess = false; bool inSurrender = (level.timesurrenderTime); - + if (NPC_CheckSurrender()) + { + return qfalse; + } // Check For Enemies And Alert Events //------------------------------------ @@ -1858,7 +1868,7 @@ qboolean NPC_BSFlee( void ) { //done panicking, time to realize we're dogmeat, if we haven't been able to flee for a few seconds if ((level.time-NPC->lastMoveTime)>3000 - && (level.time-NPCInfo->surrenderTime) > 2000 )//and haven't just finished surrendering + /*&& (level.time-NPCInfo->surrenderTime) > 2000*/)//and haven't just finished surrendering { NPC_FaceEnemy(); NPC_Surrender(); diff --git a/code/game/NPC_combat.cpp b/code/game/NPC_combat.cpp index 8cb1cdf17c..77d71cd605 100644 --- a/code/game/NPC_combat.cpp +++ b/code/game/NPC_combat.cpp @@ -36,6 +36,7 @@ extern void NPC_Jedi_RateNewEnemy( gentity_t *self, gentity_t *enemy ); extern qboolean PM_DroidMelee( int npc_class ); extern int delayedShutDown; extern qboolean G_ValidEnemy( gentity_t *self, gentity_t *enemy ); +extern qboolean NPC_JediClassGood(gentity_t *self); void ChangeWeapon( gentity_t *ent, int newWeapon ); @@ -1982,6 +1983,18 @@ gentity_t *NPC_PickAlly ( qboolean facingEachOther, float range, qboolean ignore return closestAlly; } +qboolean NPC_JediClassGoodGuy(class_t npc_class) { + switch (npc_class) { + case CLASS_JEDI: + case CLASS_LUKE: + case CLASS_KYLE: + case CLASS_MORGANKATARN: + return qtrue; + default: + return qfalse; + } +} + gentity_t *NPC_CheckEnemy( qboolean findNew, qboolean tooFarOk, qboolean setEnemy ) { qboolean forcefindNew = qfalse; @@ -2018,6 +2031,19 @@ gentity_t *NPC_CheckEnemy( qboolean findNew, qboolean tooFarOk, qboolean setEnem return NULL; } + if (NPC->enemy + && NPC->enemy->NPC + && (NPC->enemy->NPC->surrenderTime > level.time || NPC->enemy->s.weapon == WP_NONE + || (NPC->enemy->s.weapon == WP_MELEE && !NPC->enemy)) + && NPC->client->playerTeam == TEAM_PLAYER + && NPC_JediClassGoodGuy(NPC->client->NPC_class)) + {//enemy is surrendering or not attacking and I'm a good guy Jedi + if (setEnemy) + { + G_ClearEnemy(NPC); + } + } + // Kyle does not get new enemies if not close to his leader if (NPC->client->NPC_class==CLASS_KYLE && NPC->client->leader && diff --git a/code/game/bg_panimate.cpp b/code/game/bg_panimate.cpp index d613e3a666..94bfe3dc8a 100644 --- a/code/game/bg_panimate.cpp +++ b/code/game/bg_panimate.cpp @@ -877,7 +877,7 @@ int PM_PowerLevelForSaberAnim(playerState_t *ps, int saberNum) {//end of anim return FORCE_LEVEL_0; } - return FORCE_LEVEL_5; + return FORCE_LEVEL_3; break; case BOTH_PULL_IMPALE_SWING: if (ps->torsoAnimTimer < 500)//750 ) @@ -888,7 +888,7 @@ int PM_PowerLevelForSaberAnim(playerState_t *ps, int saberNum) {//beginning of anim return FORCE_LEVEL_0; } - return FORCE_LEVEL_5; + return FORCE_LEVEL_3; break; case BOTH_ALORA_SPIN_SLASH: if (ps->torsoAnimTimer < 900) diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 99ca7eee77..f8bbac7a00 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -12230,7 +12230,7 @@ void PM_WeaponLightsaber(void) if (PM_SaberBlocking()) {//busy blocking, don't do attacks return; - } + } // check for weapon change // can't change if weapon is firing, but can change again if lowering or raising @@ -12527,6 +12527,11 @@ void PM_WeaponLightsaber(void) if (curmove >= LS_S_TL2BR && curmove <= LS_S_T2B) {//started a swing, must continue from here newmove = LS_A_TL2BR + (curmove - LS_S_TL2BR); + + if (!(pm->ps->clientNum)) + { + pm->ps->saberEventFlags &= ~SEF_EVENTS; + } } else if (curmove >= LS_A_TL2BR && curmove <= LS_A_T2B) {//finished an attack, must continue from here @@ -12706,6 +12711,14 @@ void PM_WeaponLightsaber(void) { anim = saberMoveData[newmove].animToUse; } + + if (!(pm->ps->clientNum)) + { + if (PM_SaberInAttack(curmove)) + {//clear parry status from player here + pm->ps->saberEventFlags &= ~SEF_EVENTS; + } + } } } } diff --git a/code/game/g_active.cpp b/code/game/g_active.cpp index 2ba07761ee..f89fcf5ab1 100644 --- a/code/game/g_active.cpp +++ b/code/game/g_active.cpp @@ -50,6 +50,7 @@ extern void WP_SaberStartMissileBlockCheck( gentity_t *self, usercmd_t *ucmd ); extern void WP_ForcePowersUpdate( gentity_t *self, usercmd_t *ucmd ); extern void WP_SaberBlockPointsRegenerate(gentity_t * self); extern void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd); +extern void WP_CheckPlayerSaberEvents(gentity_t *self); extern gentity_t *SeekerAcquiresTarget ( gentity_t *ent, vec3_t pos ); extern void FireSeeker( gentity_t *owner, gentity_t *target, vec3_t origin, vec3_t dir ); @@ -2121,11 +2122,13 @@ gentity_t *G_KickTrace( gentity_t *ent, vec3_t kickDir, float kickDist, vec3_t k { G_Throw( hitEnt, kickDir, kickPush ); } - if ( kickPush >= 150.0f/*75.0f*/ && !Q_irand( 0, 2 ) ) - { + if ( kickPush >= 150.0f/*75.0f*/ + && !Q_irand( 0, 2 ) + && ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] >= hitEnt->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) + { G_Knockdown( hitEnt, ent, kickDir, 300, qtrue ); } - else + else if (ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE] >= hitEnt->client->ps.forcePowerLevel[FP_SABER_DEFENSE]) { G_Knockdown( hitEnt, ent, kickDir, kickPush, qtrue ); } @@ -3221,8 +3224,23 @@ qboolean G_CheckClampUcmd( gentity_t *ent, usercmd_t *ucmd ) float remainingTime = (animLength-elapsedTime); float kickDist = (ent->maxs[0]*1.5f)+STAFF_KICK_RANGE+8.0f;//fudge factor of 8 float kickDist2 = kickDist; - int kickDamage = Q_irand( 3, 8 ); - int kickDamage2 = Q_irand( 3, 8 ); + int kickDamage; //= Q_irand( 3, 8 ); + int kickDamage2; //= Q_irand( 3, 8 ); + + switch (ent->client->ps.forcePowerLevel[FP_SABER_OFFENSE]) + { + case FORCE_LEVEL_0: + case FORCE_LEVEL_1: + kickDamage = Q_irand(3, 6); + kickDamage2 = Q_irand(3, 6); + case FORCE_LEVEL_2: + kickDamage = Q_irand(4, 7); + kickDamage2 = Q_irand(4, 7); + case FORCE_LEVEL_3: + kickDamage = Q_irand(5, 9); + kickDamage2 = Q_irand(5, 9); + } + int kickPush = Q_flrand( 100.0f, 200.0f );//Q_flrand( 50.0f, 100.0f ); int kickPush2 = Q_flrand( 100.0f, 200.0f );//Q_flrand( 50.0f, 100.0f ); qboolean doKick = qfalse; @@ -5318,7 +5336,7 @@ extern cvar_t *g_skippingcin; G_CheckClampUcmd( ent, ucmd ); - WP_ForcePowersUpdate( ent, ucmd ); + WP_ForcePowersUpdate( ent, ucmd ); //if we have the saber in hand, check for starting a block to reflect shots if ((ent->s.number < MAX_CLIENTS//player diff --git a/code/game/g_combat.cpp b/code/game/g_combat.cpp index 44fc974f7a..bd665815ce 100644 --- a/code/game/g_combat.cpp +++ b/code/game/g_combat.cpp @@ -50,6 +50,7 @@ extern cvar_t *d_slowmodeath; extern gentity_t *player; extern cvar_t *debug_subdivision; extern cvar_t *g_dismemberProbabilities; +extern cvar_t *g_forceNewPowers; gentity_t *g_lastClientDamaged; @@ -5931,6 +5932,61 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, const case MOD_EXPLOSIVE: case MOD_EXPLOSIVE_SPLASH: case MOD_SABER: + if (g_forceNewPowers->integer) + { + doSound = (Q_irand(0, 4) == 0); + switch (targ->client->ps.forcePowerLevel[FP_PROTECT]) + { + case FORCE_LEVEL_4: + //je suis invincible!!! + if (targ->client + && attacker->client + && targ->client->playerTeam == attacker->client->playerTeam + && (!targ->NPC || !targ->NPC->charmedTime)) + {//complain, but don't turn on them + G_FriendlyFireReaction(targ, attacker, dflags); + } + return; + break; + case FORCE_LEVEL_3: + //one-half damage + if (damage <= 1) + { + damage = 0; + } + else + { + damage = ceil((float)damage*0.5f);//was 0.1f); + } + break; + case FORCE_LEVEL_2: + //three-quarters damage + if (damage <= 1) + { + damage = 0; + } + else + { + damage = ceil((float)damage*0.75f); + } + break; + case FORCE_LEVEL_1: + //a little bit of protection + if (damage <= 1) + { + damage = 0; + } + else + { + damage = ceil((float)damage*0.9f); + } + break; + } + break; + } + else + {//overflow to normal behavior + } case MOD_DISRUPTOR: case MOD_SNIPER: case MOD_CONC_ALT: diff --git a/code/game/g_weaponLoad.cpp b/code/game/g_weaponLoad.cpp index 7f86d57012..9ebb7fac15 100644 --- a/code/game/g_weaponLoad.cpp +++ b/code/game/g_weaponLoad.cpp @@ -25,6 +25,7 @@ along with this program; if not, see . // this is excluded from PCH usage 'cos it looks kinda scary to me, being game and ui.... -Ste #include "g_local.h" +//extern float forceJumpHeight[]; //extern cvar_t *g_weaponVelocity; //extern cvar_t *g_weaponAltVelocity; diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 4bea793f53..edaf4dfd84 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -219,6 +219,18 @@ qboolean NPC_JediClass(gentity_t *self) { } } +qboolean NPC_JediClassGood(gentity_t *self) { + switch (self->client->NPC_class) { + case CLASS_JEDI: + case CLASS_LUKE: + case CLASS_KYLE: + case CLASS_MORGANKATARN: + return qtrue; + default: + return qfalse; + } +} + qboolean NPC_JediClassNonBoss(gentity_t *self) { switch (self->client->NPC_class) { case CLASS_JEDI: @@ -266,6 +278,24 @@ qboolean PM_WalkingOrIdle(gentity_t *self) return qfalse; } +void WP_CheckPlayerSaberEvents(gentity_t *self) +{//the player needs this because his saberEventFlags aren't cleared by the code in AI_Jedi.cpp like for NPCs + if (self->s.number) + { + return; + } + + if (PM_SaberInAttack(self->client->ps.saberMove)) + {//make sure code knows player is attacking and not doing any kind of block + self->client->ps.saberEventFlags &= ~SEF_EVENTS; + } + else if (PM_SaberInIdle(self->client->ps.saberMove) && self->client->ps.torsoAnimTimer > 100) + { + self->client->ps.saberEventFlags &= ~SEF_EVENTS; + } +} + + vec3_t g_saberFlashPos = { 0, 0, 0 }; @@ -375,7 +405,7 @@ float forcePullConeNew[NUM_FORCE_POWER_LEVELS] = 1.0f,//none 1.0f, 1.0f, - 0.8f + 0.9f }; float forceSpeedValue[NUM_FORCE_POWER_LEVELS] = @@ -4145,8 +4175,6 @@ qboolean WP_SabersCheckLock(gentity_t *ent1, gentity_t *ent2) qboolean WP_SaberParry(gentity_t *victim, gentity_t *attacker, int saberNum, int bladeNum) { - return qfalse; - if (!victim || !victim->client || !attacker) { return qfalse; @@ -4192,8 +4220,6 @@ qboolean WP_SaberParry(gentity_t *victim, gentity_t *attacker, int saberNum, int qboolean WP_SaberParryNew(gentity_t *victim, gentity_t *attacker, int saberNum, int bladeNum) { - return qfalse; - if (!victim || !victim->client || !attacker) { return qfalse; @@ -5985,10 +6011,14 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) { return; } - + if (!ent->s.number) - {//player never uses these - ent->client->ps.saberEventFlags &= ~SEF_EVENTS; + {//player only uses saberEventFlags in WP_SaberBlockCooldownDone + if (PM_SaberInAttack(ent->client->ps.saberMove)) + {//make sure code knows player is attacking and not doing any kind of block + ent->client->ps.saberEventFlags &= ~SEF_PARRIED; + ent->client->ps.saberEventFlags &= ~SEF_DEFLECTED; + } } if (ent->client->ps.saber[saberNum].blade[bladeNum].length <= 1)//cen get down to 1 when in a wall @@ -6695,11 +6725,11 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) { entDefending = qtrue; } - /*else if (!ent->s.number && WP_SaberBlockCooldownDone(ent) && PM_WalkingOrIdle(ent)) + else if (!(ent->s.number) && WP_SaberBlockCooldownDone(ent)) {//player can cheat on the return animation a bit //hitOwner->client->ps.saberMove = LS_READY; //kind of hacky entDefending = qtrue; - }*/ + } if (ent->client->ps.torsoAnim == BOTH_A1_SPECIAL || ent->client->ps.torsoAnim == BOTH_A2_SPECIAL @@ -6765,11 +6795,11 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) { hitOwnerDefending = qtrue; } - /*else if (!hitOwner->s.number && WP_SaberBlockCooldownDone(hitOwner) && PM_WalkingOrIdle(hitOwner)) + else if (!(hitOwner->s.number) && WP_SaberBlockCooldownDone(hitOwner)) {//player can cheat on the return animation a bit //hitOwner->client->ps.saberMove = LS_READY; //kind of hacky hitOwnerDefending = qtrue; - }*/ + } if (hitOwner->client->ps.torsoAnim == BOTH_A1_SPECIAL || hitOwner->client->ps.torsoAnim == BOTH_A2_SPECIAL @@ -6895,7 +6925,7 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) && (hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE] >= FORCE_LEVEL_3 || (hitOwner->client->ps.forcePowerLevel[FP_SABER_DEFENSE]>FORCE_LEVEL_1&&Q_irand(0, 1)))) // 50% chance for knockaway with saber defense 2 {//knockaways can make fast-attacker go into a broken parry anim if the ent is using fast or med (but not Tavion) //make me parry - WP_SaberParry(hitOwner, ent, saberNum, bladeNum); + WP_SaberParryNew(hitOwner, ent, saberNum, bladeNum); if (!PM_SaberInSpecialAttack(ent->client->ps.saberMove)) {//special attacks can't be interrupted... just semi-blocked... //turn the parry into a knockaway @@ -6999,7 +7029,7 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) } else {//just a parry, possibly the hitOwner can knockaway the ent - WP_SaberParry(hitOwner, ent, saberNum, bladeNum); + WP_SaberParryNew(hitOwner, ent, saberNum, bladeNum); if (PM_SaberInBounce(ent->client->ps.saberMove) //FIXME: saberMove not set until pmove! && activeDefense && hitOwner->client->ps.saberAnimLevel != SS_FAST //&& hitOwner->client->ps.saberAnimLevel != FORCE_LEVEL_5 @@ -7149,7 +7179,7 @@ void WP_SaberDamageTraceNew(gentity_t *ent, int saberNum, int bladeNum) {//saber collided when not attacking, parry it if (!PM_SaberInBrokenParry(hitOwner->client->ps.saberMove)) {//not currently in a broken parry - if (!WP_SaberParry(hitOwner, ent, saberNum, bladeNum)) + if (!WP_SaberParryNew(hitOwner, ent, saberNum, bladeNum)) {//FIXME: hitOwner can't parry, do some time-consuming saber-knocked-aside broken parry anim? //hitOwner->client->ps.saberBlocked = BLOCKED_PARRY_BROKEN; } @@ -9044,6 +9074,7 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) if (self->NPC->rank > RANK_LT) //lower rank melee users can't do this stuff { + /* if (g_debugMelee->integer && (ucmd->buttons & BUTTON_USE) && cg.renderingThirdPerson @@ -9053,7 +9084,7 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) } else { - + if (self->client->ps.forcePowersActive&(1 << FP_LIGHTNING)) {//can't block while zapping return; @@ -9073,7 +9104,9 @@ void Jedi_MeleeEvasionDefense(gentity_t *self, usercmd_t *ucmd) {//can't block while gripping (FIXME: or should it break the grip? Pain should break the grip, I think...) return; } + } + */ fwdangles[1] = self->client->ps.viewangles[1]; AngleVectors(fwdangles, forward, NULL, NULL); @@ -9446,12 +9479,19 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) if (!self->s.number) //player { + if (ucmd->buttons & BUTTON_ATTACK + || PM_SaberInAttack(self->client->ps.saberMove) + || PM_SaberInSpecialAttack(self->client->ps.torsoAnim)) + { + return; + } + if (PM_SaberInTransitionAny(self->client->ps.saberMove)) { - if (!WP_SaberBlockCooldownDone(self) || !PM_WalkingOrIdle(self)) + if (!WP_SaberBlockCooldownDone(self)) { return; - } + } } } @@ -9760,7 +9800,7 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) { WP_SaberBlockNonRandom(self, incoming->currentOrigin, qtrue); } - else + /*else { vec3_t diff, start, end; float dist; @@ -9773,7 +9813,7 @@ void WP_SaberStartMissileBlockCheck(gentity_t *self, usercmd_t *ucmd) gi.trace(&trace, start, incoming->mins, incoming->maxs, end, incoming->s.number, MASK_SHOT, G2_COLLIDE, 10); Jedi_DodgeEvasion(self, incoming->owner, &trace, HL_NONE); - } + }*/ if (incoming->owner && incoming->owner->client && (!self->enemy || self->enemy->s.weapon != WP_SABER))//keep enemy jedi over shooters { self->enemy = incoming->owner; @@ -9917,10 +9957,9 @@ void WP_SaberUpdate(gentity_t *self, usercmd_t *ucmd) } } - if (self->s.number == 0 - && (!(self->client->ps.saber[0].saberFlags&SFL_NOT_ACTIVE_BLOCKING) || self->client->ps.forcePowerLevel[FP_SABER_DEFENSE] == 0)) + if (self->s.number == 0) { - if (self->client->ps.saber[0].saberFlags&SFL_NOT_ACTIVE_BLOCKING) + if (self->client->ps.saber[0].saberFlags&SFL_NOT_ACTIVE_BLOCKING || ucmd->buttons & BUTTON_USE) {//so player can't take advantage of wide block angle self->client->ps.saberBlocking = BLK_TIGHT; } @@ -10001,10 +10040,23 @@ void WP_SaberUpdate(gentity_t *self, usercmd_t *ucmd) saberent->mins[i] = saberTip[i] - saberOrg[i] - 8;//self->client->ps.saber[saberNum].blade[bladeNum].muzzlePoint[i]; } */ + float newSizeTip = (saberTip[i] - saberOrg[i]); - newSizeTip += (newSizeTip >= 0) ? 8 : -8; - float newSizeBase = (saberBase[i] - saberOrg[i]); - newSizeBase += (newSizeBase >= 0) ? 8 : -8; + float newSizeBase = (saberBase[i] - saberOrg[i]); + + if (self->s.number == 0 + && (self->client->ps.saber[0].saberFlags&SFL_NOT_ACTIVE_BLOCKING && PM_SaberInIdle(self->client->ps.saberMove) + || ucmd->buttons & BUTTON_USE)) + {//player with non-blocking saber doesn't get such a generous fudge factor for easy blocking animations + newSizeTip += (newSizeTip >= 0) ? -64 : 64; + newSizeBase += (newSizeBase >= 0) ? -64 : 64; + } + else + { + newSizeTip += (newSizeTip >= 0) ? 8 : -8; + newSizeBase += (newSizeBase >= 0) ? 8 : -8; + } + if (newSizeTip > saberent->maxs[i]) { saberent->maxs[i] = newSizeTip; @@ -10529,7 +10581,7 @@ void WP_ForceKnockdown(gentity_t *self, gentity_t *pusher, qboolean pull, qboole } if (!self->s.number && !strongKnockdown - && ((!pull && (self->client->ps.forcePowerLevel[FP_PUSH]>FORCE_LEVEL_1 || !g_spskill->integer)) || (pull && (self->client->ps.forcePowerLevel[FP_PULL]>FORCE_LEVEL_1 || !g_spskill->integer)))) + && ((!pull && (self->client->ps.forcePowerLevel[FP_PUSH]>FORCE_LEVEL_1 || !g_spskill->integer)) || (pull && (self->client->ps.forcePowerLevel[FP_PULL]>FORCE_LEVEL_1 || !g_spskill->integer || (pusher->client->ps.forcePowerLevel[FP_PULL]integer))))) {//player only knocked down if pushed *hard* if (self->s.weapon == WP_SABER) {//temp HACK: these are the only 2 pain anims that look good when holding a saber @@ -10540,6 +10592,19 @@ void WP_ForceKnockdown(gentity_t *self, gentity_t *pusher, qboolean pull, qboole knockAnim = PM_PickAnim(self, BOTH_PAIN1, BOTH_PAIN18); } } + else if (g_forceNewPowers->integer + && self->s.number + && pull && (pusher->client->ps.forcePowerLevel[FP_PULL]==FORCE_LEVEL_1)) + {//pull 1 only staggers if new powers + if (self->s.weapon == WP_SABER) + {//temp HACK: these are the only 2 pain anims that look good when holding a saber + knockAnim = PM_PickAnim(self, BOTH_PAIN2, BOTH_PAIN3); + } + else + { + knockAnim = PM_PickAnim(self, BOTH_PAIN1, BOTH_PAIN18); + } + } else if (PM_CrouchAnim(self->client->ps.legsAnim)) {//crouched knockdown knockAnim = BOTH_KNOCKDOWN4; @@ -11052,15 +11117,31 @@ void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) AngleVectors(fwdangles, forward, right, NULL); VectorCopy(self->currentOrigin, center); - if (pull) + if (g_forceNewPowers->integer) { - cone = forcePullCone[self->client->ps.forcePowerLevel[FP_PULL]]; + if (pull) + { + cone = forcePullConeNew[self->client->ps.forcePowerLevel[FP_PULL]]; + } + else + { + cone = forcePushCone[self->client->ps.forcePowerLevel[FP_PUSH]]; + } } else { - cone = forcePushCone[self->client->ps.forcePowerLevel[FP_PUSH]]; + if (pull) + { + cone = forcePullCone[self->client->ps.forcePowerLevel[FP_PULL]]; + } + else + { + cone = forcePushCone[self->client->ps.forcePowerLevel[FP_PUSH]]; + } } + + // if ( cone >= 1.0f ) {//must be pointing right at them VectorMA(self->client->renderInfo.eyePoint, radius, forward, end); @@ -11437,7 +11518,7 @@ void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) && (push_list[x]->NPC->scriptFlags&SCF_DONT_FLEE)) {//*SIGH*... if an NPC can't flee, they can't run after and pick up their weapon, do don't drop it } - else if (self->client->ps.forcePowerLevel[FP_PULL] > FORCE_LEVEL_1 + else if ((self->client->ps.forcePowerLevel[FP_PULL] > FORCE_LEVEL_1 || g_forceNewPowers->integer) && push_list[x]->client->NPC_class != CLASS_ROCKETTROOPER//rockettroopers never drop their weapon && push_list[x]->client->NPC_class != CLASS_VEHICLE && push_list[x]->client->NPC_class != CLASS_BOBAFETT @@ -11461,10 +11542,25 @@ void ForceThrow(gentity_t *self, qboolean pull, qboolean fake) { knockback = 200; } - if (self->client->ps.forcePowerLevel[FP_PULL] < FORCE_LEVEL_3) - {//maybe just knock them down - knockback /= 3; + if (g_forceNewPowers->integer) + { + if (self->client->ps.forcePowerLevel[FP_PULL] == FORCE_LEVEL_1) + {//just barely move them + knockback /= 4; + } + else if (self->client->ps.forcePowerLevel[FP_PULL] == FORCE_LEVEL_2) + {//maybe just knock them down + knockback /= 3; + } } + else + { + if (self->client->ps.forcePowerLevel[FP_PULL] < FORCE_LEVEL_3) + {//maybe just knock them down + knockback /= 3; + } + } + } else { @@ -12189,7 +12285,8 @@ int FP_MaxForceHeal(gentity_t *self) { if (self->s.number >= MAX_CLIENTS) { - return MAX_FORCE_HEAL_HARD; + if (g_forceNewPowers->integer) return MAX_FORCE_HEAL_MEDIUM; //because NPCS have so much HP + else return MAX_FORCE_HEAL_HARD; } switch (g_spskill->integer) { @@ -14696,6 +14793,17 @@ void WP_SaberBlockPointsRegenerate(gentity_t *self) qboolean WP_SaberBlockCooldownDone(gentity_t *self) {//lets you cheat on the return animations for better defense + if (!PM_WalkingOrIdle(self)) + { + return qfalse; + } + + if (!(self->client->ps.saberEventFlags&SEF_PARRIED) + && !(self->client->ps.saberEventFlags&SEF_DEFLECTED)) + {//we weren't transitioning from a block + return qfalse; + } + if (PM_SaberInReturn(self->client->ps.saberMove)) {//we're in a return, probably triggered after a previous deflection //FIXME: Make sure it's a return from a deflection, not a slash? @@ -15524,10 +15632,9 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ } else if (self->client->ps.forcePowerDebounce[FP_HEAL] < level.time) {//time to heal again - if (g_forceNewPowers) { - if ((WP_ForcePowerAvailable(self, forcePower, 4) && self->client->ps.forcePowerLevel[FP_HEAL] < 2) - || (WP_ForcePowerAvailable(self, forcePower, 3) && self->client->ps.forcePowerLevel[FP_HEAL] >= 2 - && forcePower)) + if (g_forceNewPowers) + { + if (WP_ForcePowerAvailable(self, forcePower, 4)) {//have available power int healInterval = FP_ForceHealInterval(self); int healAmount = 1;//hard, normal healing rate @@ -15549,14 +15656,23 @@ static void WP_ForcePowerRun(gentity_t *self, forcePowers_t forcePower, usercmd_ self->health += healAmount; self->client->ps.forceHealCount += healAmount; self->client->ps.forcePowerDebounce[FP_HEAL] = level.time + healInterval; - WP_ForcePowerDrain(self, forcePower, 4); + + if (self->client->ps.forceHealCount > 20 && self->client->ps.forcePowerLevel[FP_HEAL] == 3) + { + WP_ForcePowerDrain(self, forcePower, 2); + } + else + { + WP_ForcePowerDrain(self, forcePower, 4); + } } else {//stop WP_ForcePowerStop(self, forcePower); } } - else { //old heal + else + { //old heal if (WP_ForcePowerAvailable(self, forcePower, 4)) {//have available power int healInterval = FP_ForceHealInterval(self); From cc63eca9b8280317ded7bba408d0e8c712f5eda0 Mon Sep 17 00:00:00 2001 From: Razish Date: Thu, 18 Feb 2016 10:40:09 +1100 Subject: [PATCH 142/445] [SP] Remove leftover debug message from bunny-hopping code --- code/game/bg_pmove.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 3362a07d2a..29223cf01b 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -3690,7 +3690,6 @@ int PM_GetLandingAnim( void ) //stick landings some pm->ps->velocity[0] *= 0.5f; pm->ps->velocity[1] *= 0.5f; - Com_Printf( "sticking landing\n" ); } break; case BOTH_JUMPBACK1: From 2c5ca884b5c597b938b4f9272fb5364133830a6e Mon Sep 17 00:00:00 2001 From: Alexandre Detiste Date: Sun, 6 Mar 2016 09:17:26 +0100 Subject: [PATCH 143/445] General: Typos --- code/qcommon/cm_trace.cpp | 2 +- code/qcommon/common.cpp | 2 +- codemp/botlib/aasfile.h | 4 ++-- codemp/botlib/be_aas_cluster.cpp | 2 +- codemp/game/g_saga.c | 2 +- codemp/qcommon/cm_trace.cpp | 2 +- codemp/qcommon/common.cpp | 2 +- lib/minizip/unzip.c | 8 ++++---- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/code/qcommon/cm_trace.cpp b/code/qcommon/cm_trace.cpp index 0146f83dd3..7f60532462 100644 --- a/code/qcommon/cm_trace.cpp +++ b/code/qcommon/cm_trace.cpp @@ -620,7 +620,7 @@ void CM_TraceThroughTree( traceWork_t *tw, clipMap_t *local, int num, float p1f, } // - // find the point distances to the seperating plane + // find the point distances to the separating plane // and the offset for the size of the box // node = local->nodes + num; diff --git a/code/qcommon/common.cpp b/code/qcommon/common.cpp index bb649f93da..8475a0a4cd 100644 --- a/code/qcommon/common.cpp +++ b/code/qcommon/common.cpp @@ -363,7 +363,7 @@ void Com_ParseCommandLine( char *commandLine ) { if (*commandLine == '"') { inq = !inq; } - // look for a + seperating character + // look for a + separating character // if commandLine came from a file, we might have real line seperators if ( (*commandLine == '+' && !inq) || *commandLine == '\n' || *commandLine == '\r' ) { if ( com_numConsoleLines == MAX_CONSOLE_LINES ) { diff --git a/codemp/botlib/aasfile.h b/codemp/botlib/aasfile.h index f9447bbbf9..d20e2fb14a 100644 --- a/codemp/botlib/aasfile.h +++ b/codemp/botlib/aasfile.h @@ -67,8 +67,8 @@ along with this program; if not, see . #define FACE_LADDER 2 //ladder #define FACE_GROUND 4 //standing on ground when in this face #define FACE_GAP 8 //gap in the ground -#define FACE_LIQUID 16 //face seperating two areas with liquid -#define FACE_LIQUIDSURFACE 32 //face seperating liquid and air +#define FACE_LIQUID 16 //face separating two areas with liquid +#define FACE_LIQUIDSURFACE 32 //face separating liquid and air #define FACE_BRIDGE 64 //can walk over this face if bridge is closed //area contents diff --git a/codemp/botlib/be_aas_cluster.cpp b/codemp/botlib/be_aas_cluster.cpp index 0a42799fe7..c4b3152f4c 100644 --- a/codemp/botlib/be_aas_cluster.cpp +++ b/codemp/botlib/be_aas_cluster.cpp @@ -156,7 +156,7 @@ int AAS_UpdatePortal(int areanum, int clusternum) { //remove the cluster portal flag contents aasworld.areasettings[areanum].contents &= ~AREACONTENTS_CLUSTERPORTAL; - Log_Write("portal area %d is seperating more than two clusters\r\n", areanum); + Log_Write("portal area %d is separating more than two clusters\r\n", areanum); return qfalse; } //end else if (aasworld.portalindexsize >= AAS_MAX_PORTALINDEXSIZE) diff --git a/codemp/game/g_saga.c b/codemp/game/g_saga.c index 70424152fb..fcb8769a3b 100644 --- a/codemp/game/g_saga.c +++ b/codemp/game/g_saga.c @@ -1949,7 +1949,7 @@ void G_SiegeClientExData(gentity_t *msgTarg) trap->InPVS(msgTarg->client->ps.origin, ent->client->ps.origin)) { //another client in the same pvs, send his jive if (count) - { //append a seperating space if we are not the first in the list + { //append a separating space if we are not the first in the list Q_strcat(str, sizeof(str), " "); } else diff --git a/codemp/qcommon/cm_trace.cpp b/codemp/qcommon/cm_trace.cpp index 2aa6bf432a..36fd04a361 100644 --- a/codemp/qcommon/cm_trace.cpp +++ b/codemp/qcommon/cm_trace.cpp @@ -1093,7 +1093,7 @@ void CM_TraceThroughTree( traceWork_t *tw, trace_t &trace, clipMap_t *local, int } // - // find the point distances to the seperating plane + // find the point distances to the separating plane // and the offset for the size of the box // node = local->nodes + num; diff --git a/codemp/qcommon/common.cpp b/codemp/qcommon/common.cpp index f866324769..f4388e3eb3 100644 --- a/codemp/qcommon/common.cpp +++ b/codemp/qcommon/common.cpp @@ -327,7 +327,7 @@ void Com_Quit_f( void ) { COMMAND LINE FUNCTIONS -+ characters seperate the commandLine string into multiple console ++ characters separate the commandLine string into multiple console command lines. All of these are valid: diff --git a/lib/minizip/unzip.c b/lib/minizip/unzip.c index d4cfbeef35..e93e46c810 100644 --- a/lib/minizip/unzip.c +++ b/lib/minizip/unzip.c @@ -53,7 +53,7 @@ Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G should only read the compressed/uncompressed size from the Zip64 format if the size from normal header was 0xFFFFFFFF - Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant + Oct-2009 - Mathias Svensson - Applied some bug fixes from paches received from Gilles Vollant Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required) Patch created by Daniel Borca @@ -207,7 +207,7 @@ typedef struct /* =========================================================================== Read a byte from a gz_stream; update next_in and avail_in. Return EOF for end of file. - IN assertion: the stream s has been sucessfully opened for reading. + IN assertion: the stream s has been successfully opened for reading. */ @@ -387,8 +387,8 @@ local int strcmpcasenosensitive_internal (const char* fileName1, const char* fil /* Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + If iCaseSenisivity = 1, comparison is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparison is not case sensitivity (like strcmpi or strcasecmp) If iCaseSenisivity = 0, case sensitivity is defaut of your operating system (like 1 on Unix, 2 on Windows) From d73b1cdbb763f6d7f2adec95b32a23ed1cc80ce7 Mon Sep 17 00:00:00 2001 From: Xycaleth Date: Mon, 24 Mar 2014 15:45:27 +0000 Subject: [PATCH 144/445] [MP] Fix negative index offset on x64 systems --- codemp/qcommon/cm_load.cpp | 27 +++++++++++---------------- codemp/qcommon/cm_local.h | 4 ++-- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/codemp/qcommon/cm_load.cpp b/codemp/qcommon/cm_load.cpp index 4a4f91874c..4a722e617e 100644 --- a/codemp/qcommon/cm_load.cpp +++ b/codemp/qcommon/cm_load.cpp @@ -1085,27 +1085,22 @@ int CM_ModelContents_Actual( clipHandle_t model, clipMap_t *cm ) cmod = CM_ClipHandleToModel( model, &cm ); //MCG ADDED - return the contents, too - if( cmod->leaf.numLeafBrushes ) // check for brush + + for ( i = 0; i < cmod->leaf.numLeafBrushes; i++ ) { - int brushNum; - for ( i = cmod->leaf.firstLeafBrush; i < cmod->leaf.firstLeafBrush+cmod->leaf.numLeafBrushes; i++ ) - { - brushNum = cm->leafbrushes[i]; - contents |= cm->brushes[brushNum].contents; - } + int brushNum = cm->leafbrushes[cmod->leaf.firstLeafBrush + i]; + contents |= cm->brushes[brushNum].contents; } - if( cmod->leaf.numLeafSurfaces ) // if not brush, check for patch + + for ( i = 0; i < cmod->leaf.numLeafSurfaces; i++ ) { - int surfaceNum; - for ( i = cmod->leaf.firstLeafSurface; i < cmod->leaf.firstLeafSurface+cmod->leaf.numLeafSurfaces; i++ ) - { - surfaceNum = cm->leafsurfaces[i]; - if ( cm->surfaces[surfaceNum] != NULL ) - {//HERNH? How could we have a null surf within our cmod->leaf.numLeafSurfaces? - contents |= cm->surfaces[surfaceNum]->contents; - } + int surfaceNum = cm->leafsurfaces[cmod->leaf.firstLeafSurface + i]; + if ( cm->surfaces[surfaceNum] != NULL ) + {//HERNH? How could we have a null surf within our cmod->leaf.numLeafSurfaces? + contents |= cm->surfaces[surfaceNum]->contents; } } + return contents; } diff --git a/codemp/qcommon/cm_local.h b/codemp/qcommon/cm_local.h index 8094a97e86..235fecec96 100644 --- a/codemp/qcommon/cm_local.h +++ b/codemp/qcommon/cm_local.h @@ -45,10 +45,10 @@ typedef struct cLeaf_s { int cluster; int area; - intptr_t firstLeafBrush; + ptrdiff_t firstLeafBrush; int numLeafBrushes; - intptr_t firstLeafSurface; + ptrdiff_t firstLeafSurface; int numLeafSurfaces; } cLeaf_t; From 0991ef4fdd06dd7b1c796b14bd328572ee2e1e38 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Tue, 27 Oct 2015 07:50:06 +0000 Subject: [PATCH 145/445] travis: use the new Ubuntu 14.04 environment Previously we were upgrading from 12.04 to a 12.04/14.04 hybrid, which was time-consuming and a bit of a hack. travis-ci.org now offers a pure 14.04 build environment, so use that instead. Re-enable x86 Linux builds: these aren't too slow now that we're on 14.04. --- .travis.yml | 5 +++-- tools/travis-build.sh | 1 - tools/travis-install.sh | 20 ++++++++++++++------ 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5d442cd50d..56aa2752c6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ language: cpp -sudo: true +sudo: required +dist: trusty install: - ./tools/travis-install.sh "${host:-native}" "${flavour:-Release}" $opts @@ -11,7 +12,7 @@ compiler: gcc env: - "" - flavour=Debug - #- host=i686-linux-gnu + - host=i686-linux-gnu - host=i686-w64-mingw32 - host=x86_64-w64-mingw32 diff --git a/tools/travis-build.sh b/tools/travis-build.sh index 185a08580e..b7e6d33e10 100755 --- a/tools/travis-build.sh +++ b/tools/travis-build.sh @@ -42,7 +42,6 @@ set -- -D CMAKE_BUILD_TYPE="$flavour" "$@" -D BuildJK2SPGame=ON \ -D BuildJK2SPRdVanilla=ON \ -D CMAKE_INSTALL_PREFIX=/prefix \ - -D CMAKE_VERBOSE_MAKEFILE=ON \ "$@" .. ) make -C build make -C build install DESTDIR=$(pwd)/build/DESTDIR diff --git a/tools/travis-install.sh b/tools/travis-install.sh index fe50f3c680..d969eea271 100755 --- a/tools/travis-install.sh +++ b/tools/travis-install.sh @@ -7,11 +7,18 @@ host="$1" flavour="$2" shift 2 -# We need cmake from Ubuntu 14.04 (trusty), the version in 12.04 is too old. -# We also need SDL2, which is broken in 14.04 but OK in trusty-updates; -# and dpkg from 14.04 fixes installation of libglib2.0-dev:i386. -echo "deb http://archive.ubuntu.com/ubuntu trusty main universe" | sudo tee -a /etc/apt/sources.list -echo "deb http://archive.ubuntu.com/ubuntu trusty-updates main universe" | sudo tee -a /etc/apt/sources.list +# travis-ci's Ubuntu 14.04 image provides an apt source for Chrome, +# which breaks i386 multiarch. Disable it: we don't need it for any of +# these builds anyway. +: | sudo tee /etc/apt/sources.list.d/google-chrome.list + +# do this before apt-get update +case "${host}" in + (i?86-linux-gnu) + sudo dpkg --add-architecture i386 + ;; +esac + sudo apt-get update -qq sudo apt-get -q -y install cmake dpkg @@ -39,6 +46,7 @@ case "${host}" in libgl1-mesa-dev:i386 libpulse-dev:i386 libglu1-mesa-dev:i386 \ libsdl2-dev:i386 libjpeg-turbo8-dev:i386 zlib1g-dev:i386 libc6-dev:i386 \ libpng12-dev:i386 \ - g++-multilib g++ gcc cpp g++-4.8 gcc-4.8 g++-4.8-multilib + g++-multilib g++-4.8-multilib gcc-4.8-multilib \ + g++ g++-4.8 gcc gcc-4.8 cpp cpp-4.8 ;; esac From a453c326dd03d442cb65b32f133ef0e49c4cc627 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 12 Mar 2016 19:53:15 +0000 Subject: [PATCH 146/445] JK2: Fix incorrect Icarus Q3_GetString() animation name validation This breaks the build in clang (llvm). Equivalent to commit 973e9c2 in JASP. Signed-off-by: Simon McVittie --- codeJK2/game/Q3_Interface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codeJK2/game/Q3_Interface.cpp b/codeJK2/game/Q3_Interface.cpp index 1809f24880..95415eed94 100644 --- a/codeJK2/game/Q3_Interface.cpp +++ b/codeJK2/game/Q3_Interface.cpp @@ -8613,7 +8613,7 @@ static int Q3_GetString( int entID, int type, const char *name, char **value ) case SET_ANIM_BOTH: *value = (char *) Q3_GetAnimBoth( ent ); - if ( VALIDSTRING( value ) == false ) + if ( VALIDSTRING( *value ) == false ) return false; break; From a1f835ad895f1bec0800cbc96de61be1d1f5d593 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Tue, 27 Oct 2015 21:00:25 +0000 Subject: [PATCH 147/445] Use ISO C++ or ISO C isnan() on mingw _isnan() isn't part of a strictly conforming ISO C math.h, so mingw-w64's math.h doesn't declare it when compiling with gcc -std=c++11, which defines __STRICT_ANSI__. --- code/qcommon/q_shared.h | 8 +++++++- codemp/qcommon/q_math.c | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 63e4c2424c..e01f657b9e 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -109,6 +109,10 @@ along with this program; if not, see . #include #include +#ifdef __cplusplus +#include +#endif + //Ignore __attribute__ on non-gcc platforms #if !defined(__GNUC__) && !defined(__attribute__) #define __attribute__(x) @@ -777,8 +781,10 @@ inline vec_t VectorNormalize2( const vec3_t v, vec3_t out) { int Q_log2(int val); inline qboolean Q_isnan ( float f ) { -#ifdef _WIN32 +#ifdef _MSC_VER return _isnan (f); +#elif defined(__cplusplus) + return std::isnan (f); #else return isnan (f); #endif diff --git a/codemp/qcommon/q_math.c b/codemp/qcommon/q_math.c index db30e622ab..1a3461c7f7 100644 --- a/codemp/qcommon/q_math.c +++ b/codemp/qcommon/q_math.c @@ -1168,7 +1168,7 @@ float Q_powf ( float x, int y ) qboolean Q_isnan (float f) { -#ifdef _WIN32 +#ifdef _MSC_VER return (qboolean)(_isnan (f) != 0); #else return (qboolean)(isnan (f) != 0); From b219bb2e660d91adcdbecf0719bf969b224d1875 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 12 Mar 2016 19:05:26 +0000 Subject: [PATCH 148/445] Remove some unused files These are not mentioned in any of the CMakefiles, so they can't be compiled by any supported configuration. --- code/win32/win_main.cpp | 1079 --------------------------------- codemp/null/null_glimp.cpp | 79 --- codemp/null/null_net.c | 43 -- codemp/win32/win_main.cpp | 271 --------- codemp/win32/win_main_ded.cpp | 24 - 5 files changed, 1496 deletions(-) delete mode 100644 code/win32/win_main.cpp delete mode 100644 codemp/null/null_glimp.cpp delete mode 100644 codemp/null/null_net.c delete mode 100644 codemp/win32/win_main.cpp delete mode 100644 codemp/win32/win_main_ded.cpp diff --git a/code/win32/win_main.cpp b/code/win32/win_main.cpp deleted file mode 100644 index ea77b1012f..0000000000 --- a/code/win32/win_main.cpp +++ /dev/null @@ -1,1079 +0,0 @@ -/* -This file is part of Jedi Academy. - - Jedi Academy is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 2 - as published by the Free Software Foundation. - - Jedi Academy is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Jedi Academy. If not, see . -*/ -// Copyright 2001-2013 Raven Software - -// win_main.h - -// leave this as first line for PCH reasons... -// -#include "../server/exe_headers.h" - - - -#include "../client/client.h" -#include "win_local.h" -#include "resource.h" -#include -#include -#include -#include -#include -#include -#include -#include - -// The following macros set and clear, respectively, given bits -// of the C runtime library debug flag, as specified by a bitmask. - -#ifdef _DEBUG -#define SET_CRT_DEBUG_FIELD(a) \ - _CrtSetDbgFlag((a) | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)) -#define CLEAR_CRT_DEBUG_FIELD(a) \ - _CrtSetDbgFlag(~(a) & _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)) -#else -#define SET_CRT_DEBUG_FIELD(a) ((void) 0) -#define CLEAR_CRT_DEBUG_FIELD(a) ((void) 0) -#endif - -#define MEM_THRESHOLD 128*1024*1024 - -void Sys_SetBinaryPath(const char *path); -char *Sys_BinaryPath(void); - -/* -================== -Sys_LowPhysicalMemory -================== -*/ -qboolean Sys_LowPhysicalMemory() -{ - static MEMORYSTATUSEX stat; - static qboolean bAsked = qfalse; - static cvar_t* sys_lowmem = Cvar_Get( "sys_lowmem", "0", 0 ); - - if (!bAsked) // just in case it takes a little time for GlobalMemoryStatus() to gather stats on - { // stuff we don't care about such as virtual mem etc. - bAsked = qtrue; - - stat.dwLength = sizeof (stat); - GlobalMemoryStatusEx (&stat); - } - if (sys_lowmem->integer) - { - return qtrue; - } - return (stat.ullTotalPhys <= MEM_THRESHOLD) ? qtrue : qfalse; -} - -/* -============= -Sys_Error - -Show the early console as an error dialog -============= -*/ -void QDECL Sys_Error( const char *error, ... ) { - va_list argptr; - char text[4096]; - MSG msg; - - va_start (argptr, error); - Q_vsnprintf (text, sizeof(text), error, argptr); - va_end (argptr); - - Conbuf_AppendText( text ); - Conbuf_AppendText( "\n" ); - - Sys_SetErrorText( text ); - Sys_ShowConsole( 1, qtrue ); - - timeEndPeriod( 1 ); - - IN_Shutdown(); - - // wait for the user to quit - while ( 1 ) { - if (!GetMessage (&msg, NULL, 0, 0)) - Com_Quit_f (); - TranslateMessage (&msg); - DispatchMessage (&msg); - } - - Sys_DestroyConsole(); - Com_ShutdownZoneMemory(); - Com_ShutdownHunkMemory(); - - exit (1); -} - -/* -============== -Sys_Quit -============== -*/ -void Sys_Quit( void ) { - timeEndPeriod( 1 ); - IN_Shutdown(); - Sys_DestroyConsole(); - Com_ShutdownZoneMemory(); - Com_ShutdownHunkMemory(); - - exit (0); -} - -/* -============== -Sys_Print -============== -*/ -void Sys_Print( const char *msg ) { - Conbuf_AppendText( msg ); -} - - -/* -============== -Sys_Mkdir -============== -*/ -qboolean Sys_Mkdir( const char *path ) { - if( !CreateDirectory( path, NULL ) ) - { - if( GetLastError( ) != ERROR_ALREADY_EXISTS ) - return qfalse; - } - return qtrue; -} - -/* -============== -Sys_Cwd -============== -*/ -char *Sys_Cwd( void ) { - static char cwd[MAX_OSPATH]; - - _getcwd( cwd, sizeof( cwd ) - 1 ); - cwd[MAX_OSPATH-1] = 0; - - return cwd; -} - -/* -============================================================== - -DIRECTORY SCANNING - -============================================================== -*/ - -#define MAX_FOUND_FILES 0x1000 - -void Sys_ListFilteredFiles( const char *basedir, char *subdirs, char *filter, char **psList, int *numfiles ) { - char search[MAX_OSPATH], newsubdirs[MAX_OSPATH]; - char filename[MAX_OSPATH]; - intptr_t findhandle; - struct _finddata_t findinfo; - - if ( *numfiles >= MAX_FOUND_FILES - 1 ) { - return; - } - - if (strlen(subdirs)) { - Com_sprintf( search, sizeof(search), "%s\\%s\\*", basedir, subdirs ); - } - else { - Com_sprintf( search, sizeof(search), "%s\\*", basedir ); - } - - findhandle = _findfirst (search, &findinfo); - if (findhandle == -1) { - return; - } - - do { - if (findinfo.attrib & _A_SUBDIR) { - if (Q_stricmp(findinfo.name, ".") && Q_stricmp(findinfo.name, "..")) { - if (strlen(subdirs)) { - Com_sprintf( newsubdirs, sizeof(newsubdirs), "%s\\%s", subdirs, findinfo.name); - } - else { - Com_sprintf( newsubdirs, sizeof(newsubdirs), "%s", findinfo.name); - } - Sys_ListFilteredFiles( basedir, newsubdirs, filter, psList, numfiles ); - } - } - if ( *numfiles >= MAX_FOUND_FILES - 1 ) { - break; - } - Com_sprintf( filename, sizeof(filename), "%s\\%s", subdirs, findinfo.name ); - if (!Com_FilterPath( filter, filename, qfalse )) - continue; - psList[ *numfiles ] = CopyString( filename ); - (*numfiles)++; - } while ( _findnext (findhandle, &findinfo) != -1 ); - - _findclose (findhandle); -} - -static qboolean strgtr(const char *s0, const char *s1) { - int l0, l1, i; - - l0 = strlen(s0); - l1 = strlen(s1); - - if (l1 s0[i]) { - return qtrue; - } - if (s1[i] < s0[i]) { - return qfalse; - } - } - return qfalse; -} - -char **Sys_ListFiles( const char *directory, const char *extension, char *filter, int *numfiles, qboolean wantsubs ) { - char search[MAX_OSPATH]; - int nfiles; - char **listCopy; - char *list[MAX_FOUND_FILES]; - struct _finddata_t findinfo; - intptr_t findhandle; - int flag; - int i; - - if (filter) { - - nfiles = 0; - Sys_ListFilteredFiles( directory, "", filter, list, &nfiles ); - - list[ nfiles ] = 0; - *numfiles = nfiles; - - if (!nfiles) - return NULL; - - listCopy = (char **)Z_Malloc( ( nfiles + 1 ) * sizeof( *listCopy ), TAG_LISTFILES, qfalse ); - for ( i = 0 ; i < nfiles ; i++ ) { - listCopy[i] = list[i]; - } - listCopy[i] = NULL; - - return listCopy; - } - - if ( !extension) { - extension = ""; - } - - // passing a slash as extension will find directories - if ( extension[0] == '/' && extension[1] == 0 ) { - extension = ""; - flag = 0; - } else { - flag = _A_SUBDIR; - } - - Com_sprintf( search, sizeof(search), "%s\\*%s", directory, extension ); - - // search - nfiles = 0; - - findhandle = _findfirst (search, &findinfo); - if (findhandle == -1) { - *numfiles = 0; - return NULL; - } - - do { - if ( (!wantsubs && flag ^ ( findinfo.attrib & _A_SUBDIR )) || (wantsubs && findinfo.attrib & _A_SUBDIR) ) { - if ( nfiles == MAX_FOUND_FILES - 1 ) { - break; - } - list[ nfiles ] = CopyString( findinfo.name ); - nfiles++; - } - } while ( _findnext (findhandle, &findinfo) != -1 ); - - list[ nfiles ] = 0; - - _findclose (findhandle); - - // return a copy of the list - *numfiles = nfiles; - - if ( !nfiles ) { - return NULL; - } - - listCopy = (char **) Z_Malloc( ( nfiles + 1 ) * sizeof( *listCopy ), TAG_LISTFILES, qfalse); - for ( i = 0 ; i < nfiles ; i++ ) { - listCopy[i] = list[i]; - } - listCopy[i] = NULL; - - do { - flag = 0; - for(i=1; i= MAX_QUED_EVENTS ) { - Com_Printf("Sys_QueEvent: overflow\n"); - // we are discarding an event, but don't leak memory - if ( ev->evPtr ) { - Z_Free( ev->evPtr ); - } - eventTail++; - } - - eventHead++; - - if ( time == 0 ) { - time = Sys_Milliseconds(); - } - - ev->evTime = time; - ev->evType = type; - ev->evValue = value; - ev->evValue2 = value2; - ev->evPtrLength = ptrLength; - ev->evPtr = ptr; -} - -/* -================ -Sys_GetEvent - -================ -*/ -sysEvent_t Sys_GetEvent( void ) { - MSG msg; - sysEvent_t ev; - char *s; - msg_t netmsg; - - // return if we have data - if ( eventHead > eventTail ) { - eventTail++; - return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ]; - } - - // pump the message loop - while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) { - if ( !GetMessage (&msg, NULL, 0, 0) ) { - Com_Quit_f(); - } - - // save the msg time, because wndprocs don't have access to the timestamp - g_wv.sysMsgTime = msg.time; - - TranslateMessage (&msg); - DispatchMessage (&msg); - } - - // check for console commands - s = Sys_ConsoleInput(); - if ( s ) { - char *b; - int len; - - len = strlen( s ) + 1; - b = (char *) Z_Malloc( len, TAG_EVENT, qfalse); - Q_strncpyz( b, s, len ); - Sys_QueEvent( 0, SE_CONSOLE, 0, 0, len, b ); - } - - // check for network packets - MSG_Init( &netmsg, sys_packetReceived, sizeof( sys_packetReceived ) ); - - // return if we have data - if ( eventHead > eventTail ) { - eventTail++; - return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ]; - } - - // create an empty event to return - - memset( &ev, 0, sizeof( ev ) ); - ev.evTime = timeGetTime(); - - return ev; -} - -//================================================================ - -/* -================= -Sys_In_Restart_f - -Restart the input subsystem -================= -*/ -void Sys_In_Restart_f( void ) { - IN_Shutdown(); - IN_Init(); -} - -/* -================ -Sys_Init - -Called after the common systems (cvars, files, etc) -are initialized -================ -*/ -#define OSR2_BUILD_NUMBER 1111 -#define WIN98_BUILD_NUMBER 1998 - -void Sys_Init( void ) { - // make sure the timer is high precision, otherwise - // NT gets 18ms resolution - timeBeginPeriod( 1 ); - - Cmd_AddCommand ("in_restart", Sys_In_Restart_f); - - g_wv.osversion.dwOSVersionInfoSize = sizeof( g_wv.osversion ); - - if (!GetVersionEx (&g_wv.osversion)) - Sys_Error ("Couldn't get OS info"); - - if (g_wv.osversion.dwMajorVersion < 4) - Sys_Error ("This game requires Windows version 4 or greater"); - if (g_wv.osversion.dwPlatformId == VER_PLATFORM_WIN32s) - Sys_Error ("This game doesn't run on Win32s"); - - Cvar_Set( "arch", OS_STRING " " ARCH_STRING ); - - // save out a couple things in rom cvars for the renderer to access - Cvar_Get( "win_hinstance", va("%p", g_wv.hInstance), CVAR_ROM ); - Cvar_Get( "win_wndproc", va("%p", MainWndProc), CVAR_ROM ); - - Cvar_Set( "username", Sys_GetCurrentUser() ); - - IN_Init(); // FIXME: not in dedicated? -} - - - -// do a quick mem test to check for any potential future mem problems... -// -static void QuickMemTest(void) -{ -// if (!Sys_LowPhysicalMemory()) - { - const int iMemTestMegs = 128; // useful search label - // special test, - void *pvData = malloc(iMemTestMegs * 1024 * 1024); - if (pvData) - { - free(pvData); - } - else - { - // err... - // - LPCSTR psContinue = re.Language_IsAsian() ? - "Your machine failed to allocate %dMB in a memory test, which may mean you'll have problems running this game all the way through.\n\nContinue anyway?" - : - SE_GetString("CON_TEXT_FAILED_MEMTEST"); - // ( since it's too much hassle doing MBCS code pages and decodings etc for MessageBox command ) - - #define GetYesNo(psQuery) (!!(MessageBox(NULL,psQuery,"Query",MB_YESNO|MB_ICONWARNING|MB_TASKMODAL)==IDYES)) - if (!GetYesNo(va(psContinue,iMemTestMegs))) - { - LPCSTR psNoMem = re.Language_IsAsian() ? - "Insufficient memory to run this game!\n" - : - SE_GetString("CON_TEXT_INSUFFICIENT_MEMORY"); - // ( since it's too much hassle doing MBCS code pages and decodings etc for MessageBox command ) - - Com_Error( ERR_FATAL, psNoMem ); - } - } - } -} - -/* Begin Sam Lantinga Public Domain 4/13/98 */ - -static void UnEscapeQuotes(char *arg) -{ - char *last = NULL; - - while (*arg) { - if (*arg == '"' && (last != NULL && *last == '\\')) { - char *c_curr = arg; - char *c_last = last; - - while (*c_curr) { - *c_last = *c_curr; - c_last = c_curr; - c_curr++; - } - *c_last = '\0'; - } - last = arg; - arg++; - } -} - -/* Parse a command line buffer into arguments */ -static int ParseCommandLine(char *cmdline, char **argv) -{ - char *bufp; - char *lastp = NULL; - int argc, last_argc; - - argc = last_argc = 0; - for (bufp = cmdline; *bufp;) { - /* Skip leading whitespace */ - while (isspace(*bufp)) { - ++bufp; - } - /* Skip over argument */ - if (*bufp == '"') { - ++bufp; - if (*bufp) { - if (argv) { - argv[argc] = bufp; - } - ++argc; - } - /* Skip over word */ - lastp = bufp; - while (*bufp && (*bufp != '"' || *lastp == '\\')) { - lastp = bufp; - ++bufp; - } - } else { - if (*bufp) { - if (argv) { - argv[argc] = bufp; - } - ++argc; - } - /* Skip over word */ - while (*bufp && !isspace(*bufp)) { - ++bufp; - } - } - if (*bufp) { - if (argv) { - *bufp = '\0'; - } - ++bufp; - } - - /* Strip out \ from \" sequences */ - if (argv && last_argc != argc) { - UnEscapeQuotes(argv[last_argc]); - } - last_argc = argc; - } - if (argv) { - argv[argc] = NULL; - } - return (argc); -} - -/* End Sam Lantinga Public Domain 4/13/98 */ - -//======================================================================= -//int totalMsec, countMsec; - -#ifndef DEFAULT_BASEDIR -# define DEFAULT_BASEDIR Sys_BinaryPath() -#endif - -int main ( int argc, char **argv ) -{ - char commandLine[ MAX_STRING_CHARS ] = { 0 }; -// int startTime, endTime; - - SET_CRT_DEBUG_FIELD( _CRTDBG_LEAK_CHECK_DF ); -// _CrtSetBreakAlloc(34804); - - Sys_CreateConsole(); - - // no abort/retry/fail errors - SetErrorMode( SEM_FAILCRITICALERRORS ); - - // get the initial time base - Sys_Milliseconds(); - - Sys_SetBinaryPath( Sys_Dirname( argv[ 0 ] ) ); - Sys_SetDefaultInstallPath( DEFAULT_BASEDIR ); - - // Concatenate the command line for passing to Com_Init - for( int i = 1; i < argc; i++ ) - { - const bool containsSpaces = (strchr(argv[i], ' ') != NULL); - if (containsSpaces) - Q_strcat( commandLine, sizeof( commandLine ), "\"" ); - - Q_strcat( commandLine, sizeof( commandLine ), argv[ i ] ); - - if (containsSpaces) - Q_strcat( commandLine, sizeof( commandLine ), "\"" ); - - Q_strcat( commandLine, sizeof( commandLine ), " " ); - } - - Com_Init( commandLine ); - - QuickMemTest(); - - // hide the early console since we've reached the point where we - // have a working graphics subsystems - if ( !com_viewlog->integer ) { - Sys_ShowConsole( 0, qfalse ); - } - - // main game loop - while( 1 ) { - // if not running as a game client, sleep a bit - if ( g_wv.isMinimized ) { - Sleep( 5 ); - } - -#ifdef _DEBUG - if (!g_wv.activeApp) - { - Sleep(50); - } -#endif // _DEBUG - - // make sure mouse and joystick are only called once a frame - IN_Frame(); - - // run the game - Com_Frame(); - } -} - -/* -================== -WinMain - -================== -*/ -int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { - // should never get a previous instance in Win32 - if ( hPrevInstance ) { - return 0; - } - - /* Begin Sam Lantinga Public Domain 4/13/98 */ - - TCHAR *text = GetCommandLine(); - char *cmdline = _strdup(text); - if ( cmdline == NULL ) { - MessageBox(NULL, "Out of memory - aborting", "Fatal Error", MB_ICONEXCLAMATION | MB_OK); - return 0; - } - - int argc = ParseCommandLine(cmdline, NULL); - char **argv = (char **)alloca(sizeof(char *) * argc + 1); - if ( argv == NULL ) { - MessageBox(NULL, "Out of memory - aborting", "Fatal Error", MB_ICONEXCLAMATION | MB_OK); - return 0; - } - ParseCommandLine(cmdline, argv); - - /* End Sam Lantinga Public Domain 4/13/98 */ - - g_wv.hInstance = hInstance; - - /* Begin Sam Lantinga Public Domain 4/13/98 */ - - main(argc, argv); - - free(cmdline); - - /* End Sam Lantinga Public Domain 4/13/98 */ - - // never gets here - return 0; -} diff --git a/codemp/null/null_glimp.cpp b/codemp/null/null_glimp.cpp deleted file mode 100644 index ea5718b603..0000000000 --- a/codemp/null/null_glimp.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include "qcommon/q_shared.h" -#include "rd-common/tr_local.h" -#if defined __linux__ || defined MACOS_X -typedef unsigned int GLenum; -#endif - -#ifdef _WIN32 - #define WIN32_LEAN_AND_MEAN - #define NOSCROLL -#include -BOOL (WINAPI * qwglSwapIntervalEXT)( int interval ); -//void (APIENTRY * qglMultiTexCoord2fARB )( GLenum texture, float s, float t ); -//void (APIENTRY * qglActiveTextureARB )( GLenum texture ); -//void (APIENTRY * qglClientActiveTextureARB )( GLenum texture ); - - -void (APIENTRY * qglLockArraysEXT)( int, int); -void (APIENTRY * qglUnlockArraysEXT) ( void ); - - -void GLimp_EndFrame( void ) { -} - -void GLimp_Init( void ) -{ -} - -void GLimp_Shutdown( void ) { -} - -void GLimp_Minimize( void ) { -} - -void GLimp_EnableLogging( qboolean enable ) { -} - -void GLimp_LogComment( char *comment ) { -} - -qboolean QGL_Init( const char *dllname ) { - return qtrue; -} - -void QGL_Shutdown( void ) { -} -#else -qboolean ( * qwglSwapIntervalEXT)( int interval ); -void ( * qglMultiTexCoord2fARB )( GLenum texture, float s, float t ); -void ( * qglActiveTextureARB )( GLenum texture ); -void ( * qglClientActiveTextureARB )( GLenum texture ); - - -void ( * qglLockArraysEXT)( int, int); -void ( * qglUnlockArraysEXT) ( void ); - - -void GLimp_EndFrame( void ) { -} - -void GLimp_Init( void ) -{ -} - -void GLimp_Shutdown( void ) { -} - -void GLimp_EnableLogging( qboolean enable ) { -} - -void GLimp_LogComment( char *comment ) { -} - -qboolean QGL_Init( const char *dllname ) { - return qtrue; -} - -void QGL_Shutdown( void ) { -} -#endif // !WIN32 diff --git a/codemp/null/null_net.c b/codemp/null/null_net.c deleted file mode 100644 index c8abf18c49..0000000000 --- a/codemp/null/null_net.c +++ /dev/null @@ -1,43 +0,0 @@ - -#include "../qcommon/qcommon.h" - -/* -============= -NET_StringToAdr - -localhost -idnewt -idnewt:28000 -192.246.40.70 -192.246.40.70:28000 -============= -*/ -qboolean NET_StringToAdr (char *s, netadr_t *a) -{ - if (!strcmp (s, "localhost")) { - memset (a, 0, sizeof(*a)); - a->type = NA_LOOPBACK; - return true; - } - - return false; -} - -/* -================== -Sys_SendPacket -================== -*/ -void Sys_SendPacket( int length, void *data, netadr_t to ) { -} - -/* -================== -Sys_GetPacket - -Never called by the game logic, just the system event queing -================== -*/ -qboolean Sys_GetPacket ( netadr_t *net_from, msg_t *net_message ) { - return false; -} diff --git a/codemp/win32/win_main.cpp b/codemp/win32/win_main.cpp deleted file mode 100644 index 349bc65628..0000000000 --- a/codemp/win32/win_main.cpp +++ /dev/null @@ -1,271 +0,0 @@ -// win_main.c - -#include "client/client.h" -#include "win_local.h" -#include "resource.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include "../sys/sys_loadlib.h" -#include "../sys/sys_local.h" -#include "qcommon/stringed_ingame.h" - -//WinVars_t g_wv; - - - - - -//================================================================ - - -// do a quick mem test to check for any potential future mem problems... -// -void QuickMemTest(void) -{ -// if (!Sys_LowPhysicalMemory()) - { - const int iMemTestMegs = 128; // useful search label - // special test, - void *pvData = malloc(iMemTestMegs * 1024 * 1024); - if (pvData) - { - free(pvData); - } - else - { - // err... - // - LPCSTR psContinue = re->Language_IsAsian() ? - "Your machine failed to allocate %dMB in a memory test, which may mean you'll have problems running this game all the way through.\n\nContinue anyway?" - : - SE_GetString("CON_TEXT_FAILED_MEMTEST"); - // ( since it's too much hassle doing MBCS code pages and decodings etc for MessageBox command ) - - #define GetYesNo(psQuery) (!!(MessageBox(NULL,psQuery,"Query",MB_YESNO|MB_ICONWARNING|MB_TASKMODAL)==IDYES)) - if (!GetYesNo(va(psContinue,iMemTestMegs))) - { - LPCSTR psNoMem = re->Language_IsAsian() ? - "Insufficient memory to run this game!\n" - : - SE_GetString("CON_TEXT_INSUFFICIENT_MEMORY"); - // ( since it's too much hassle doing MBCS code pages and decodings etc for MessageBox command ) - - Com_Error( ERR_FATAL, psNoMem ); - } - } - } -} - -/* Begin Sam Lantinga Public Domain 4/13/98 */ - -static void UnEscapeQuotes(char *arg) -{ - char *last = NULL; - - while (*arg) { - if (*arg == '"' && (last != NULL && *last == '\\')) { - char *c_curr = arg; - char *c_last = last; - - while (*c_curr) { - *c_last = *c_curr; - c_last = c_curr; - c_curr++; - } - *c_last = '\0'; - } - last = arg; - arg++; - } -} - -/* Parse a command line buffer into arguments */ -static int ParseCommandLine(char *cmdline, char **argv) -{ - char *bufp; - char *lastp = NULL; - int argc, last_argc; - - argc = last_argc = 0; - for (bufp = cmdline; *bufp;) { - /* Skip leading whitespace */ - while (isspace(*bufp)) { - ++bufp; - } - /* Skip over argument */ - if (*bufp == '"') { - ++bufp; - if (*bufp) { - if (argv) { - argv[argc] = bufp; - } - ++argc; - } - /* Skip over word */ - lastp = bufp; - while (*bufp && (*bufp != '"' || *lastp == '\\')) { - lastp = bufp; - ++bufp; - } - } else { - if (*bufp) { - if (argv) { - argv[argc] = bufp; - } - ++argc; - } - /* Skip over word */ - while (*bufp && !isspace(*bufp)) { - ++bufp; - } - } - if (*bufp) { - if (argv) { - *bufp = '\0'; - } - ++bufp; - } - - /* Strip out \ from \" sequences */ - if (argv && last_argc != argc) { - UnEscapeQuotes(argv[last_argc]); - } - last_argc = argc; - } - if (argv) { - argv[argc] = NULL; - } - return (argc); -} - -/* End Sam Lantinga Public Domain 4/13/98 */ - -//======================================================================= -//int totalMsec, countMsec; - -#ifndef DEFAULT_BASEDIR -# define DEFAULT_BASEDIR Sys_BinaryPath() -#endif - -#if 0 -int main( int argc, char **argv ) -{ - int i; - char commandLine[ MAX_STRING_CHARS ] = { 0 }; - - Sys_CreateConsole(); - - // no abort/retry/fail errors - SetErrorMode( SEM_FAILCRITICALERRORS ); - - // Set the initial time base - Sys_Milliseconds(); - - Sys_SetBinaryPath( Sys_Dirname( argv[ 0 ] ) ); - Sys_SetDefaultInstallPath( DEFAULT_BASEDIR ); - - // Concatenate the command line for passing to Com_Init - for( i = 1; i < argc; i++ ) - { - const bool containsSpaces = (strchr(argv[i], ' ') != NULL); - if (containsSpaces) - Q_strcat( commandLine, sizeof( commandLine ), "\"" ); - - Q_strcat( commandLine, sizeof( commandLine ), argv[ i ] ); - - if (containsSpaces) - Q_strcat( commandLine, sizeof( commandLine ), "\"" ); - - Q_strcat( commandLine, sizeof( commandLine ), " " ); - } - - Com_Init( commandLine ); - -#if !defined(DEDICATED) - QuickMemTest(); -#endif - - NET_Init(); - - // hide the early console since we've reached the point where we - // have a working graphics subsystems - if ( !com_dedicated->integer && !com_viewlog->integer ) { - Sys_ShowConsole( 0, qfalse ); - } - - // main game loop - while( 1 ) { - // if not running as a game client, sleep a bit - if ( g_wv.isMinimized || ( com_dedicated && com_dedicated->integer ) ) { - Sleep( 5 ); - } - -#ifdef _DEBUG - if (!g_wv.activeApp) - { - Sleep(50); - } -#endif // _DEBUG - - // make sure mouse and joystick are only called once a frame - IN_Frame(); - - // run the game - Com_Frame(); - } -} -#endif - -/* -================== -WinMain - -================== -*/ - -#if 0 -int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { - // should never get a previous instance in Win32 - if ( hPrevInstance ) { - return 0; - } - - /* Begin Sam Lantinga Public Domain 4/13/98 */ - - TCHAR *text = GetCommandLine(); - char *cmdline = _strdup(text); - if ( cmdline == NULL ) { - MessageBox(NULL, "Out of memory - aborting", "Fatal Error", MB_ICONEXCLAMATION | MB_OK); - return 0; - } - - int argc = ParseCommandLine(cmdline, NULL); - char **argv = (char **)alloca(sizeof(char *) * argc + 1); - if ( argv == NULL ) { - MessageBox(NULL, "Out of memory - aborting", "Fatal Error", MB_ICONEXCLAMATION | MB_OK); - return 0; - } - ParseCommandLine(cmdline, argv); - - /* End Sam Lantinga Public Domain 4/13/98 */ - - g_wv.hInstance = hInstance; - - /* Begin Sam Lantinga Public Domain 4/13/98 */ - - main(argc, argv); - - free(cmdline); - - /* End Sam Lantinga Public Domain 4/13/98 */ - - // never gets here - return 0; -} -#endif \ No newline at end of file diff --git a/codemp/win32/win_main_ded.cpp b/codemp/win32/win_main_ded.cpp deleted file mode 100644 index 2ba7864f00..0000000000 --- a/codemp/win32/win_main_ded.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// win_main.c - -#include "client/client.h" -#include "qcommon/qcommon.h" -#include "win32/win_local.h" -#include "win32/resource.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include "../sys/sys_loadlib.h" -#include "../sys/sys_local.h" -#include "qcommon/stringed_ingame.h" - -void *Sys_GetBotAIAPI (void *parms ) { - return NULL; -} - -//qboolean stdin_active = qtrue; - From 7b1256ba0a46789986383567f76fa9717b39cfb4 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 12 Mar 2016 19:40:39 +0000 Subject: [PATCH 149/445] Use NET_Sleep() (or Sys_Sleep() in SP) to avoid busy-waiting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backported and simplified from an assortment of ioquake3 commits, mostly by Thilo Schulz, with contributions from Zack Middleton and Özkan Sezer. The single-player engines don't have any netcode, and in particular no NET_Sleep(); if they had a straightforward port of NET_Sleep(), it would be roughly equivalent to Sys_Sleep() anyway, since they don't have anything to receive from the network. As a result, I've used Sys_Sleep() instead of NET_Sleep() there. This makes the hard-coded 5ms Sys_Sleep() calls in main() (and the 50ms equivalents in a couple of unused Windows equivalents) unnecessary, so I've made them conditional on this logic being disabled (com_busyWait 1). The practical effect of those 5ms Sys_Sleep() calls in terms of framerate-limiting varied according to the framerate your computer would be capable of without the limit, and because of the way this framerate limit works, it's best if the limit is an integer divisor of 1000. I've arbitrarily chosen com_maxfpsMinimized to be 50fps, which is what would have happened on a PC capable of slightly less than 60fps in the old implementation. Fixes #507. Signed-off-by: Simon McVittie --- code/qcommon/common.cpp | 90 +++++++++++++++++------------ code/qcommon/qcommon.h | 3 +- codemp/qcommon/common.cpp | 115 +++++++++++++++++++++----------------- codemp/qcommon/net_ip.cpp | 85 +++++++++++++++++++++++----- codemp/qcommon/qcommon.h | 4 +- codemp/server/sv_main.cpp | 32 ++++++++--- shared/sys/sys_event.cpp | 23 -------- shared/sys/sys_main.cpp | 40 +++++++------ shared/sys/sys_public.h | 8 +-- 9 files changed, 244 insertions(+), 156 deletions(-) diff --git a/code/qcommon/common.cpp b/code/qcommon/common.cpp index 8475a0a4cd..6c15818c69 100644 --- a/code/qcommon/common.cpp +++ b/code/qcommon/common.cpp @@ -48,7 +48,6 @@ cvar_t *com_speeds; cvar_t *com_developer; cvar_t *com_timescale; cvar_t *com_fixedtime; -cvar_t *com_maxfps; cvar_t *com_sv_running; cvar_t *com_cl_running; cvar_t *com_logfile; // 1 = buffer log, 2 = flush after each print @@ -64,6 +63,7 @@ cvar_t *com_homepath; #ifndef _WIN32 cvar_t *com_ansiColor = NULL; #endif +cvar_t *com_busyWait; #ifdef G2_PERFORMANCE_ANALYSIS cvar_t *com_G2Report; @@ -81,7 +81,6 @@ int timeInPVSCheck; int numTraces; int com_frameTime; -int com_frameMsec; int com_frameNumber = 0; qboolean com_errorEntered = qfalse; @@ -881,25 +880,6 @@ int Com_EventLoop( void ) { Cbuf_AddText( (char *)ev.evPtr ); Cbuf_AddText( "\n" ); break; - case SE_PACKET: - evFrom = *(netadr_t *)ev.evPtr; - buf.cursize = ev.evPtrLength - sizeof( evFrom ); - - // we must copy the contents of the message out, because - // the event buffers are only large enough to hold the - // exact payload, but channel messages need to be large - // enough to hold fragment reassembly - if ( (unsigned)buf.cursize > (unsigned)buf.maxsize ) { - Com_Printf("Com_EventLoop: oversize packet\n"); - continue; - } - memcpy( buf.data, (byte *)((netadr_t *)ev.evPtr + 1), buf.cursize ); - if ( com_sv_running->integer ) { - Com_RunAndTimeServerPacket( &evFrom, &buf ); - } else { - CL_PacketEvent( evFrom, &buf ); - } - break; } // free any block data @@ -1114,8 +1094,6 @@ void Com_Init( char *commandLine ) { Cmd_AddCommand ("quit", Com_Quit_f); Cmd_AddCommand ("writeconfig", Com_WriteConfig_f ); - com_maxfps = Cvar_Get ("com_maxfps", "125", CVAR_ARCHIVE); - com_developer = Cvar_Get ("developer", "0", CVAR_TEMP ); com_logfile = Cvar_Get ("logfile", "0", CVAR_TEMP ); com_speedslog = Cvar_Get ("speedslog", "0", CVAR_TEMP ); @@ -1137,6 +1115,7 @@ void Com_Init( char *commandLine ) { com_buildScript = Cvar_Get( "com_buildScript", "0", 0 ); com_affinity = Cvar_Get( "com_affinity", "0", CVAR_ARCHIVE ); + com_busyWait = Cvar_Get( "com_busyWait", "0", CVAR_ARCHIVE ); com_bootlogo = Cvar_Get( "com_bootlogo", "1", CVAR_ARCHIVE ); @@ -1323,6 +1302,26 @@ int Com_ModifyMsec( int msec, float &fraction ) return msec; } +/* +================= +Com_TimeVal +================= +*/ + +int Com_TimeVal(int minMsec) +{ + int timeVal; + + timeVal = Sys_Milliseconds() - com_frameTime; + + if(timeVal >= minMsec) + timeVal = 0; + else + timeVal = minMsec - timeVal; + + return timeVal; +} + /* ================= Com_Frame @@ -1347,7 +1346,8 @@ void Com_Frame( void ) { { int timeBeforeFirstEvents = 0, timeBeforeServer = 0, timeBeforeEvents = 0, timeBeforeClient = 0, timeAfter = 0; int msec, minMsec; - static int lastTime = 0; + int timeVal; + static int lastTime = 0, bias = 0; // write config file if anything changed Com_WriteConfiguration(); @@ -1359,25 +1359,43 @@ void Com_Frame( void ) { timeBeforeFirstEvents = Sys_Milliseconds (); } - // we may want to spin here if things are going too fast - if ( com_maxfps->integer > 0 ) { + // Figure out how much time we have + if(com_minimized->integer && com_maxfpsMinimized->integer > 0) + minMsec = 1000 / com_maxfpsMinimized->integer; + else if(com_unfocused->integer && com_maxfpsUnfocused->integer > 0) + minMsec = 1000 / com_maxfpsUnfocused->integer; + else if(com_maxfps->integer > 0) minMsec = 1000 / com_maxfps->integer; - } else { + else minMsec = 1; - } + + timeVal = com_frameTime - lastTime; + bias += timeVal - minMsec; + + if (bias > minMsec) + bias = minMsec; + + // Adjust minMsec if previous frame took too long to render so + // that framerate is stable at the requested value. + minMsec -= bias; + + timeVal = Com_TimeVal(minMsec); do { - com_frameTime = Com_EventLoop(); - if ( lastTime > com_frameTime ) { - lastTime = com_frameTime; // possible on first frame - } - msec = com_frameTime - lastTime; - } while ( msec < minMsec ); - Cbuf_Execute (); + // Busy sleep the last millisecond for better timeout precision + if(com_busyWait->integer || timeVal < 1) + Sys_Sleep(0); + else + Sys_Sleep(timeVal - 1); + } while( (timeVal = Com_TimeVal(minMsec)) != 0 ); lastTime = com_frameTime; + com_frameTime = Com_EventLoop(); + + msec = com_frameTime - lastTime; + + Cbuf_Execute (); // mess with msec if needed - com_frameMsec = msec; float fractionMsec=0.0f; msec = Com_ModifyMsec( msec, fractionMsec); diff --git a/code/qcommon/qcommon.h b/code/qcommon/qcommon.h index 58b4381f6f..30e83125cc 100644 --- a/code/qcommon/qcommon.h +++ b/code/qcommon/qcommon.h @@ -598,6 +598,7 @@ unsigned Com_BlockChecksum( const void *buffer, int length ); int Com_Filter(const char *filter, const char *name, int casesensitive); int Com_FilterPath(const char *filter, const char *name, int casesensitive); qboolean Com_SafeMode( void ); +void Com_RunAndTimeServerPacket(netadr_t *evFrom, msg_t *buf); void Com_StartupVariable( const char *match ); // checks for and removes command line "+set var arg" constructs @@ -617,6 +618,7 @@ extern cvar_t *com_ansiColor; #endif extern cvar_t *com_affinity; +extern cvar_t *com_busyWait; // both client and server must agree to pause extern cvar_t *cl_paused; @@ -632,7 +634,6 @@ extern int timeInPVSCheck; extern int numTraces; extern int com_frameTime; -extern int com_frameMsec; extern qboolean com_errorEntered; diff --git a/codemp/qcommon/common.cpp b/codemp/qcommon/common.cpp index f4388e3eb3..92b1b46f80 100644 --- a/codemp/qcommon/common.cpp +++ b/codemp/qcommon/common.cpp @@ -43,9 +43,7 @@ cvar_t *com_developer; cvar_t *com_dedicated; cvar_t *com_timescale; cvar_t *com_fixedtime; -cvar_t *com_dropsim; // 0.0 to 1.0, simulated packet drops cvar_t *com_journal; -cvar_t *com_maxfps; cvar_t *com_timedemo; cvar_t *com_sv_running; cvar_t *com_cl_running; @@ -68,6 +66,7 @@ cvar_t *com_homepath; #ifndef _WIN32 cvar_t *com_ansiColor = NULL; #endif +cvar_t *com_busyWait; cvar_t *com_affinity; @@ -77,7 +76,6 @@ int time_frontend; // renderer frontend time int time_backend; // renderer backend time int com_frameTime; -int com_frameMsec; int com_frameNumber; qboolean com_errorEntered = qfalse; @@ -923,36 +921,6 @@ int Com_EventLoop( void ) { } Cbuf_AddText( "\n" ); break; - case SE_PACKET: - // this cvar allows simulation of connections that - // drop a lot of packets. Note that loopback connections - // don't go through here at all. - if ( com_dropsim->value > 0 ) { - static int seed; - - if ( Q_random( &seed ) < com_dropsim->value ) { - break; // drop this packet - } - } - - evFrom = *(netadr_t *)ev.evPtr; - buf.cursize = ev.evPtrLength - sizeof( evFrom ); - - // we must copy the contents of the message out, because - // the event buffers are only large enough to hold the - // exact payload, but channel messages need to be large - // enough to hold fragment reassembly - if ( (unsigned)buf.cursize > (unsigned)buf.maxsize ) { - Com_Printf("Com_EventLoop: oversize packet\n"); - continue; - } - Com_Memcpy( buf.data, (byte *)((netadr_t *)ev.evPtr + 1), buf.cursize ); - if ( com_sv_running->integer ) { - Com_RunAndTimeServerPacket( &evFrom, &buf ); - } else { - CL_PacketEvent( evFrom, &buf ); - } - break; } // free any block data @@ -1242,15 +1210,12 @@ void Com_Init( char *commandLine ) { // // init commands and vars // - com_maxfps = Cvar_Get ("com_maxfps", "125", CVAR_ARCHIVE); - com_logfile = Cvar_Get ("logfile", "0", CVAR_TEMP ); com_timescale = Cvar_Get ("timescale", "1", CVAR_CHEAT | CVAR_SYSTEMINFO ); com_fixedtime = Cvar_Get ("fixedtime", "0", CVAR_CHEAT); com_showtrace = Cvar_Get ("com_showtrace", "0", CVAR_CHEAT); - com_dropsim = Cvar_Get ("com_dropsim", "0", CVAR_CHEAT); com_speeds = Cvar_Get ("com_speeds", "0", 0); com_timedemo = Cvar_Get ("timedemo", "0", 0); com_cameraMode = Cvar_Get ("com_cameraMode", "0", CVAR_CHEAT); @@ -1271,6 +1236,7 @@ void Com_Init( char *commandLine ) { #endif com_affinity = Cvar_Get( "com_affinity", "0", CVAR_ARCHIVE ); + com_busyWait = Cvar_Get( "com_busyWait", "0", CVAR_ARCHIVE ); com_bootlogo = Cvar_Get( "com_bootlogo", "1", CVAR_ARCHIVE); @@ -1460,6 +1426,26 @@ extern timing_c G2PerformanceTimer_PreciseFrame; extern int G2Time_PreciseFrame; #endif +/* +================= +Com_TimeVal +================= +*/ + +int Com_TimeVal(int minMsec) +{ + int timeVal; + + timeVal = Sys_Milliseconds() - com_frameTime; + + if(timeVal >= minMsec) + timeVal = 0; + else + timeVal = minMsec - timeVal; + + return timeVal; +} + /* ================= Com_Frame @@ -1473,7 +1459,8 @@ void Com_Frame( void ) { G2PerformanceTimer_PreciseFrame.Start(); #endif int msec, minMsec; - static int lastTime = 0; + int timeVal; + static int lastTime = 0, bias = 0; int timeBeforeFirstEvents = 0; int timeBeforeServer = 0; @@ -1491,25 +1478,53 @@ void Com_Frame( void ) { timeBeforeFirstEvents = Sys_Milliseconds (); } - // we may want to spin here if things are going too fast - if ( !com_dedicated->integer && com_maxfps->integer > 0 && !com_timedemo->integer ) { - minMsec = 1000 / com_maxfps->integer; - } else { - minMsec = 1; + // Figure out how much time we have + if(!com_timedemo->integer) + { + if(com_dedicated->integer) + minMsec = SV_FrameMsec(); + else + { + if(com_minimized->integer && com_maxfpsMinimized->integer > 0) + minMsec = 1000 / com_maxfpsMinimized->integer; + else if(com_unfocused->integer && com_maxfpsUnfocused->integer > 0) + minMsec = 1000 / com_maxfpsUnfocused->integer; + else if(com_maxfps->integer > 0) + minMsec = 1000 / com_maxfps->integer; + else + minMsec = 1; + + timeVal = com_frameTime - lastTime; + bias += timeVal - minMsec; + + if (bias > minMsec) + bias = minMsec; + + // Adjust minMsec if previous frame took too long to render so + // that framerate is stable at the requested value. + minMsec -= bias; + } } + else + minMsec = 1; + + timeVal = Com_TimeVal(minMsec); do { - com_frameTime = Com_EventLoop(); - if ( lastTime > com_frameTime ) { - lastTime = com_frameTime; // possible on first frame - } - msec = com_frameTime - lastTime; - } while ( msec < minMsec ); - Cbuf_Execute (); + // Busy sleep the last millisecond for better timeout precision + if(com_busyWait->integer || timeVal < 1) + NET_Sleep(0); + else + NET_Sleep(timeVal - 1); + } while( (timeVal = Com_TimeVal(minMsec)) != 0 ); lastTime = com_frameTime; + com_frameTime = Com_EventLoop(); + + msec = com_frameTime - lastTime; + + Cbuf_Execute (); // mess with msec if needed - com_frameMsec = msec; msec = Com_ModifyMsec( msec ); // diff --git a/codemp/qcommon/net_ip.cpp b/codemp/qcommon/net_ip.cpp index 3105df117d..30f7be5023 100644 --- a/codemp/qcommon/net_ip.cpp +++ b/codemp/qcommon/net_ip.cpp @@ -95,6 +95,8 @@ static cvar_t *net_socksPassword; static cvar_t *net_ip; static cvar_t *net_port; +static cvar_t *net_dropsim; + static struct sockaddr socksRelayAddr; static SOCKET ip_socket = INVALID_SOCKET; @@ -237,21 +239,21 @@ qboolean Sys_StringToAdr( const char *s, netadr_t *a ) { /* ================== -Sys_GetPacket +NET_GetPacket -Never called by the game logic, just the system event queing +Receive one packet ================== */ #ifdef _DEBUG int recvfromCount; #endif -qboolean Sys_GetPacket( netadr_t *net_from, msg_t *net_message ) { +qboolean NET_GetPacket( netadr_t *net_from, msg_t *net_message, fd_set *fdr ) { int ret, err; socklen_t fromlen; struct sockaddr from; - if ( ip_socket == INVALID_SOCKET ) { + if ( ip_socket == INVALID_SOCKET || !FD_ISSET(ip_socket, fdr) ) { return qfalse; } @@ -889,6 +891,8 @@ static qboolean NET_GetCvars( void ) { modified += net_socksPassword->modified; net_socksPassword->modified = qfalse; + net_dropsim = Cvar_Get( "net_dropsim", "", CVAR_TEMP); + return modified ? qtrue : qfalse; } @@ -991,6 +995,43 @@ void NET_Shutdown( void ) { #endif } +/* +==================== +NET_Event + +Called from NET_Sleep which uses select() to determine which sockets have seen action. +==================== +*/ + +void NET_Event(fd_set *fdr) +{ + byte bufData[MAX_MSGLEN + 1]; + netadr_t from; + msg_t netmsg; + + while(1) + { + MSG_Init(&netmsg, bufData, sizeof(bufData)); + + if(NET_GetPacket(&from, &netmsg, fdr)) + { + if(net_dropsim->value > 0.0f && net_dropsim->value <= 100.0f) + { + // com_dropsim->value percent of incoming packets get dropped. + if(rand() < (int) (((double) RAND_MAX) / 100.0 * (double) net_dropsim->value)) + continue; // drop this packet + } + + if(com_sv_running->integer) + Com_RunAndTimeServerPacket(&from, &netmsg); + else + CL_PacketEvent(from, &netmsg); + } + else + break; + } +} + /* ==================== NET_Sleep @@ -999,25 +1040,39 @@ sleeps msec or until net socket is ready ==================== */ void NET_Sleep( int msec ) { -#ifndef _WIN32 struct timeval timeout; fd_set fdset; - extern qboolean stdin_active; + int retval; + SOCKET highestfd = INVALID_SOCKET; + + if (msec < 0) + msec = 0; - if ( !com_dedicated->integer ) - return; // we're not a server, just run full speed + FD_ZERO(&fdset); + if (ip_socket != INVALID_SOCKET) { + FD_SET(ip_socket, &fdset); // network socket + highestfd = ip_socket; + } - if ( ip_socket == INVALID_SOCKET ) +#ifdef _WIN32 + if(highestfd == INVALID_SOCKET) + { + // windows ain't happy when select is called without valid FDs + + SleepEx(msec, 0); return; + } +#endif - FD_ZERO(&fdset); - if (stdin_active) - FD_SET(0, &fdset); // stdin is processed too - FD_SET(ip_socket, &fdset); // network socket timeout.tv_sec = msec/1000; timeout.tv_usec = (msec%1000)*1000; - select(ip_socket+1, &fdset, NULL, NULL, &timeout); -#endif + + retval = select(highestfd + 1, &fdset, NULL, NULL, &timeout); + + if(retval == SOCKET_ERROR) + Com_Printf("Warning: select() syscall failed: %s\n", NET_ErrorString()); + else if(retval > 0) + NET_Event(&fdset); } /* diff --git a/codemp/qcommon/qcommon.h b/codemp/qcommon/qcommon.h index 4a535f8a53..4748781599 100644 --- a/codemp/qcommon/qcommon.h +++ b/codemp/qcommon/qcommon.h @@ -751,6 +751,7 @@ int Com_Filter(char *filter, char *name, int casesensitive); int Com_FilterPath(char *filter, char *name, int casesensitive); int Com_RealTime(qtime_t *qtime); qboolean Com_SafeMode( void ); +void Com_RunAndTimeServerPacket(netadr_t *evFrom, msg_t *buf); void Com_StartupVariable( const char *match ); // checks for and removes command line "+set var arg" constructs @@ -780,6 +781,7 @@ extern cvar_t *com_G2Report; #endif extern cvar_t *com_affinity; +extern cvar_t *com_busyWait; // both client and server must agree to pause extern cvar_t *cl_paused; @@ -791,7 +793,6 @@ extern int time_frontend; extern int time_backend; // renderer backend time extern int com_frameTime; -extern int com_frameMsec; extern qboolean com_errorEntered; @@ -971,6 +972,7 @@ void SV_Init( void ); void SV_Shutdown( char *finalmsg ); void SV_Frame( int msec ); void SV_PacketEvent( netadr_t from, msg_t *msg ); +int SV_FrameMsec( void ); qboolean SV_GameCommand( void ); diff --git a/codemp/server/sv_main.cpp b/codemp/server/sv_main.cpp index a04c3791d7..6d3c1d4ece 100644 --- a/codemp/server/sv_main.cpp +++ b/codemp/server/sv_main.cpp @@ -32,7 +32,7 @@ server_t sv; // local server cvar_t *sv_snapsMin; // minimum snapshots/sec a client can request, also limited by sv_snapsMax cvar_t *sv_snapsMax; // maximum snapshots/sec a client can request, also limited by sv_fps -cvar_t *sv_fps; // time rate for running non-clients +cvar_t *sv_fps = NULL; // time rate for running non-clients cvar_t *sv_timeout; // seconds without any message cvar_t *sv_zombietime; // seconds to sink messages after disconnect cvar_t *sv_rconPassword; // password for remote server commands @@ -1019,6 +1019,29 @@ void SV_CheckCvars( void ) { } } +/* +================== +SV_FrameMsec +Return time in millseconds until processing of the next server frame. +================== +*/ +int SV_FrameMsec() +{ + if(sv_fps) + { + int frameMsec; + + frameMsec = 1000.0f / sv_fps->value; + + if(frameMsec < sv.timeResidual) + return 0; + else + return frameMsec - sv.timeResidual; + } + else + return 1; +} + /* ================== SV_Frame @@ -1063,13 +1086,6 @@ void SV_Frame( int msec ) { if (!com_dedicated->integer) SV_BotFrame( sv.time + sv.timeResidual ); - if ( com_dedicated->integer && sv.timeResidual < frameMsec && (!com_timescale || com_timescale->value >= 1) ) { - // NET_Sleep will give the OS time slices until either get a packet - // or time enough for a server frame has gone by - NET_Sleep(frameMsec - sv.timeResidual); - return; - } - // if time is about to hit the 32nd bit, kick all clients // and clear sv.time, rather // than checking for negative time wraparound everywhere. diff --git a/shared/sys/sys_event.cpp b/shared/sys/sys_event.cpp index e372375d77..39dc5c5a1b 100644 --- a/shared/sys/sys_event.cpp +++ b/shared/sys/sys_event.cpp @@ -39,17 +39,10 @@ EVENT LOOP static sysEvent_t eventQue[MAX_QUED_EVENTS] = {}; static int eventHead = 0, eventTail = 0; -#if !defined(_JK2EXE) -static byte sys_packetReceived[MAX_MSGLEN] = {}; -#endif sysEvent_t Sys_GetEvent( void ) { sysEvent_t ev; char *s; -#if !defined(_JK2EXE) - netadr_t adr; - msg_t netmsg; -#endif // return if we have data if ( eventHead > eventTail ) { @@ -69,22 +62,6 @@ sysEvent_t Sys_GetEvent( void ) { Sys_QueEvent( 0, SE_CONSOLE, 0, 0, len, b ); } -#if !defined(_JK2EXE) - // check for network packets - MSG_Init( &netmsg, sys_packetReceived, sizeof( sys_packetReceived ) ); - if ( Sys_GetPacket ( &adr, &netmsg ) ) { - netadr_t *buf; - int len; - - // copy out to a seperate buffer for qeueing - len = sizeof( netadr_t ) + netmsg.cursize; - buf = (netadr_t *)Z_Malloc( len,TAG_EVENT,qfalse ); - *buf = adr; - memcpy( buf+1, netmsg.data, netmsg.cursize ); - Sys_QueEvent( 0, SE_PACKET, 0, 0, len, buf ); - } -#endif - // return if we have data if ( eventHead > eventTail ) { eventTail++; diff --git a/shared/sys/sys_main.cpp b/shared/sys/sys_main.cpp index 7c6e1ce115..27280f30ae 100644 --- a/shared/sys/sys_main.cpp +++ b/shared/sys/sys_main.cpp @@ -35,10 +35,11 @@ along with this program; if not, see . static char binaryPath[ MAX_OSPATH ] = { 0 }; static char installPath[ MAX_OSPATH ] = { 0 }; -#ifndef DEDICATED cvar_t *com_minimized; cvar_t *com_unfocused; -#endif +cvar_t *com_maxfps; +cvar_t *com_maxfpsMinimized; +cvar_t *com_maxfpsUnfocused; /* ================= @@ -153,10 +154,12 @@ void Sys_Init( void ) { Cmd_AddCommand ("in_restart", IN_Restart); Cvar_Get( "arch", OS_STRING " " ARCH_STRING, CVAR_ROM ); Cvar_Get( "username", Sys_GetCurrentUser(), CVAR_ROM ); -#ifndef DEDICATED + com_unfocused = Cvar_Get( "com_unfocused", "0", CVAR_ROM ); com_minimized = Cvar_Get( "com_minimized", "0", CVAR_ROM ); -#endif + com_maxfps = Cvar_Get ("com_maxfps", "125", CVAR_ARCHIVE); + com_maxfpsUnfocused = Cvar_Get( "com_maxfpsUnfocused", "0", CVAR_ARCHIVE ); + com_maxfpsMinimized = Cvar_Get( "com_maxfpsMinimized", "50", CVAR_ARCHIVE ); } static void NORETURN Sys_Exit( int ex ) { @@ -761,25 +764,26 @@ int main ( int argc, char* argv[] ) // main game loop while (1) { - bool shouldSleep = false; + if ( com_busyWait->integer ) + { + bool shouldSleep = false; #if !defined(_JK2EXE) - if ( com_dedicated->integer ) - { - shouldSleep = true; - } + if ( com_dedicated->integer ) + { + shouldSleep = true; + } #endif -#if !defined(DEDICATED) - if ( com_minimized->integer ) - { - shouldSleep = true; - } -#endif + if ( com_minimized->integer ) + { + shouldSleep = true; + } - if ( shouldSleep ) - { - Sys_Sleep( 5 ); + if ( shouldSleep ) + { + Sys_Sleep( 5 ); + } } // make sure mouse and joystick are only called once a frame diff --git a/shared/sys/sys_public.h b/shared/sys/sys_public.h index 8d9ad5caa0..837fe2fc96 100644 --- a/shared/sys/sys_public.h +++ b/shared/sys/sys_public.h @@ -67,8 +67,7 @@ typedef enum { SE_CHAR, // evValue is an ascii char SE_MOUSE, // evValue and evValue2 are reletive signed x / y moves SE_JOYSTICK_AXIS, // evValue is an axis number and evValue2 is the current state (-127 to 127) - SE_CONSOLE, // evPtr is a char* - SE_PACKET // evPtr is a netadr_t followed by data bytes to evPtrLength + SE_CONSOLE // evPtr is a char* } sysEventType_t; typedef struct sysEvent_s { @@ -79,10 +78,11 @@ typedef struct sysEvent_s { void *evPtr; // this must be manually freed if not NULL } sysEvent_t; -#ifndef DEDICATED extern cvar_t *com_minimized; extern cvar_t *com_unfocused; -#endif +extern cvar_t *com_maxfps; +extern cvar_t *com_maxfpsMinimized; +extern cvar_t *com_maxfpsUnfocused; sysEvent_t Sys_GetEvent( void ); From fe0ba4038d1fddc0a59a3b76ee0389c34b0533c1 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 12 Mar 2016 19:41:56 +0000 Subject: [PATCH 150/445] stdin_active: remove, unused This was only used in the old NET_Sleep() implementation, which I've just removed. Signed-off-by: Simon McVittie --- shared/sys/sys_unix.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/shared/sys/sys_unix.cpp b/shared/sys/sys_unix.cpp index d5c6c4a27e..96f5b7aab3 100644 --- a/shared/sys/sys_unix.cpp +++ b/shared/sys/sys_unix.cpp @@ -37,7 +37,6 @@ along with this program; if not, see . #include "qcommon/q_shared.h" #include "sys_local.h" -qboolean stdin_active = qtrue; qboolean stdinIsATTY = qfalse; // Used to determine where to store user-specific files From fba826f58409537061f239b5a9406bebfa3ab5fc Mon Sep 17 00:00:00 2001 From: Alessandro Date: Mon, 14 Mar 2016 07:53:58 -0700 Subject: [PATCH 151/445] Update README.md --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index eac878ab87..e49fb4b612 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,17 @@ Installing and running OpenJK: 1. [Download the latest build](http://builds.openjk.org) for your operating system. 2. Extract the contents of the file into the Jedi Academy `GameData/` folder. For Steam users, this will be in `/steamapps/common/Jedi Academy/GameData`. 3. Run `openjk.x86.exe` (Windows), `openjk.i386` (Linux 32-bit), `openjk.x86_64` (Linux 64-bit) or the `OpenJK` application (OS X), depending on your operating system. + +**Linux Instructions** + +If you do not have a windows partition and need to download the game base. + +1. Download and Install SteamCMD [SteamCMD](https://developer.valvesoftware.com/wiki/SteamCMD#Linux) . +2. Set the download path using steamCMD, force_install_dir . +3. Using SteamCMD Set the platform to windows to download any windows game on steam. @sSteamCmdForcePlatformType "windows" +4. Using SteamCMD download the game, app_update 6020. +5. [Download the latest build](http://builds.openjk.org) for your operating system. +6. Extract the contents of the file into the Jedi Academy `GameData/` folder. For Steam users, this will be in `/steamapps/common/Jedi Academy/GameData`. **OS X Instructions** From c80b6020a58fb6ec61dd72b96e9f59e90494056c Mon Sep 17 00:00:00 2001 From: Alex Nordlund Date: Sat, 19 Mar 2016 13:18:11 +0100 Subject: [PATCH 152/445] Moves buildbot's windows files to repo. --- tools/builds/all.bat | 4 ++++ tools/builds/build.bat | 1 + tools/builds/compress.bat | 1 + tools/builds/install.bat | 1 + tools/builds/make.bat | 1 + 5 files changed, 8 insertions(+) create mode 100644 tools/builds/all.bat create mode 100644 tools/builds/build.bat create mode 100644 tools/builds/compress.bat create mode 100644 tools/builds/install.bat create mode 100644 tools/builds/make.bat diff --git a/tools/builds/all.bat b/tools/builds/all.bat new file mode 100644 index 0000000000..be49a8d268 --- /dev/null +++ b/tools/builds/all.bat @@ -0,0 +1,4 @@ +call %~dp0\make.bat +call %~dp0\build.bat +call %~dp0\install.bat +call %~dp0\compress.bat openjk-git-windows.zip \ No newline at end of file diff --git a/tools/builds/build.bat b/tools/builds/build.bat new file mode 100644 index 0000000000..311447ff65 --- /dev/null +++ b/tools/builds/build.bat @@ -0,0 +1 @@ +echo msbuild ALL_BUILD.vcxproj /p:Configuration=Release \ No newline at end of file diff --git a/tools/builds/compress.bat b/tools/builds/compress.bat new file mode 100644 index 0000000000..6f753dfe10 --- /dev/null +++ b/tools/builds/compress.bat @@ -0,0 +1 @@ +echo 7za a %~1 -xr!cgamex86.dll -xr!jampgamex86.dll -xr!uix86.dll ./install/JediAcademy/* \ No newline at end of file diff --git a/tools/builds/install.bat b/tools/builds/install.bat new file mode 100644 index 0000000000..9cdf1c1872 --- /dev/null +++ b/tools/builds/install.bat @@ -0,0 +1 @@ +echo msbuild INSTALL.vcxproj /p:Configuration=Release \ No newline at end of file diff --git a/tools/builds/make.bat b/tools/builds/make.bat new file mode 100644 index 0000000000..0deba53524 --- /dev/null +++ b/tools/builds/make.bat @@ -0,0 +1 @@ +echo cmake -G "Visual Studio 12" -D CMAKE_INSTALL_PREFIX=install -D CMAKE_BUILD_TYPE=Release "--build build" . \ No newline at end of file From 7ec17fb021e1624f59237e02c3b24d2b6d2fc72c Mon Sep 17 00:00:00 2001 From: Alex Nordlund Date: Sat, 19 Mar 2016 13:53:32 +0100 Subject: [PATCH 153/445] Removing echo statements. --- tools/builds/build.bat | 2 +- tools/builds/compress.bat | 2 +- tools/builds/install.bat | 2 +- tools/builds/make.bat | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/builds/build.bat b/tools/builds/build.bat index 311447ff65..451f1b5e33 100644 --- a/tools/builds/build.bat +++ b/tools/builds/build.bat @@ -1 +1 @@ -echo msbuild ALL_BUILD.vcxproj /p:Configuration=Release \ No newline at end of file +msbuild ALL_BUILD.vcxproj /p:Configuration=Release diff --git a/tools/builds/compress.bat b/tools/builds/compress.bat index 6f753dfe10..eb735aa8aa 100644 --- a/tools/builds/compress.bat +++ b/tools/builds/compress.bat @@ -1 +1 @@ -echo 7za a %~1 -xr!cgamex86.dll -xr!jampgamex86.dll -xr!uix86.dll ./install/JediAcademy/* \ No newline at end of file +7za a %~1 -xr!cgamex86.dll -xr!jampgamex86.dll -xr!uix86.dll ./install/JediAcademy/* diff --git a/tools/builds/install.bat b/tools/builds/install.bat index 9cdf1c1872..b6015d709d 100644 --- a/tools/builds/install.bat +++ b/tools/builds/install.bat @@ -1 +1 @@ -echo msbuild INSTALL.vcxproj /p:Configuration=Release \ No newline at end of file +msbuild INSTALL.vcxproj /p:Configuration=Release diff --git a/tools/builds/make.bat b/tools/builds/make.bat index 0deba53524..2e551b81ec 100644 --- a/tools/builds/make.bat +++ b/tools/builds/make.bat @@ -1 +1 @@ -echo cmake -G "Visual Studio 12" -D CMAKE_INSTALL_PREFIX=install -D CMAKE_BUILD_TYPE=Release "--build build" . \ No newline at end of file +cmake -G "Visual Studio 12" -D CMAKE_INSTALL_PREFIX=install -D CMAKE_BUILD_TYPE=Release "--build build" . From 1e60c421adb71a7a206cf7f30687c2cfbab68934 Mon Sep 17 00:00:00 2001 From: Willi Schinmeyer Date: Sat, 19 Mar 2016 19:49:00 +0100 Subject: [PATCH 154/445] Upgrade to SDL 2.0.4 SDL now no longer uses the C runtime, so apparently a single .lib works across different MSVC Versions and toolsets. --- code/CMakeLists.txt | 17 +- codemp/CMakeLists.txt | 17 +- lib/SDL2/bin/x64_2015/SDL2.dll | Bin 942592 -> 0 bytes lib/SDL2/bin/x86_2015/SDL2.dll | Bin 740864 -> 0 bytes lib/SDL2/include/SDL.h | 47 +- lib/SDL2/include/SDL_assert.h | 45 +- lib/SDL2/include/SDL_atomic.h | 12 +- lib/SDL2/include/SDL_audio.h | 109 +- lib/SDL2/include/SDL_bits.h | 2 +- lib/SDL2/include/SDL_blendmode.h | 4 +- lib/SDL2/include/SDL_clipboard.h | 2 +- lib/SDL2/include/SDL_config.h | 13 +- lib/SDL2/include/SDL_cpuinfo.h | 7 +- lib/SDL2/include/SDL_egl.h | 1673 +++ lib/SDL2/include/SDL_endian.h | 6 +- lib/SDL2/include/SDL_error.h | 4 +- lib/SDL2/include/SDL_events.h | 43 +- lib/SDL2/include/SDL_filesystem.h | 4 +- lib/SDL2/include/SDL_gamecontroller.h | 17 +- lib/SDL2/include/SDL_gesture.h | 2 +- lib/SDL2/include/SDL_haptic.h | 34 +- lib/SDL2/include/SDL_hints.h | 232 +- lib/SDL2/include/SDL_joystick.h | 30 +- lib/SDL2/include/SDL_keyboard.h | 2 +- lib/SDL2/include/SDL_keycode.h | 2 +- lib/SDL2/include/SDL_loadso.h | 2 +- lib/SDL2/include/SDL_log.h | 18 +- lib/SDL2/include/SDL_main.h | 20 +- lib/SDL2/include/SDL_messagebox.h | 2 +- lib/SDL2/include/SDL_mouse.h | 78 +- lib/SDL2/include/SDL_mutex.h | 2 +- lib/SDL2/include/SDL_name.h | 2 +- lib/SDL2/include/SDL_opengl.h | 12526 +++-------------- lib/SDL2/include/SDL_opengl_glext.h | 11177 +++++++++++++++ lib/SDL2/include/SDL_opengles.h | 2 +- lib/SDL2/include/SDL_opengles2.h | 2756 +--- lib/SDL2/include/SDL_opengles2_gl2.h | 621 + lib/SDL2/include/SDL_opengles2_gl2ext.h | 2050 +++ lib/SDL2/include/SDL_opengles2_gl2platform.h | 30 + lib/SDL2/include/SDL_opengles2_khrplatform.h | 282 + lib/SDL2/include/SDL_pixels.h | 33 +- lib/SDL2/include/SDL_platform.h | 27 +- lib/SDL2/include/SDL_power.h | 2 +- lib/SDL2/include/SDL_quit.h | 2 +- lib/SDL2/include/SDL_rect.h | 12 +- lib/SDL2/include/SDL_render.h | 26 +- lib/SDL2/include/SDL_revision.h | 4 +- lib/SDL2/include/SDL_rwops.h | 5 +- lib/SDL2/include/SDL_scancode.h | 2 +- lib/SDL2/include/SDL_shape.h | 2 +- lib/SDL2/include/SDL_stdinc.h | 156 +- lib/SDL2/include/SDL_surface.h | 2 +- lib/SDL2/include/SDL_system.h | 55 +- lib/SDL2/include/SDL_syswm.h | 47 +- lib/SDL2/include/SDL_test.h | 4 +- lib/SDL2/include/SDL_test_assert.h | 10 +- lib/SDL2/include/SDL_test_common.h | 2 +- lib/SDL2/include/SDL_test_compare.h | 6 +- lib/SDL2/include/SDL_test_crc32.h | 26 +- lib/SDL2/include/SDL_test_font.h | 2 +- lib/SDL2/include/SDL_test_fuzzer.h | 6 +- lib/SDL2/include/SDL_test_harness.h | 2 +- lib/SDL2/include/SDL_test_images.h | 2 +- lib/SDL2/include/SDL_test_log.h | 6 +- lib/SDL2/include/SDL_test_md5.h | 20 +- lib/SDL2/include/SDL_test_random.h | 2 +- lib/SDL2/include/SDL_thread.h | 6 +- lib/SDL2/include/SDL_timer.h | 4 +- lib/SDL2/include/SDL_touch.h | 2 +- lib/SDL2/include/SDL_types.h | 2 +- lib/SDL2/include/SDL_version.h | 4 +- lib/SDL2/include/SDL_video.h | 168 +- lib/SDL2/include/begin_code.h | 12 +- lib/SDL2/include/close_code.h | 2 +- lib/SDL2/lib/x64/SDL2.lib | Bin 113700 -> 117610 bytes lib/SDL2/lib/x64/SDL2main.lib | Bin 42824 -> 39358 bytes lib/SDL2/lib/x64/SDL2test.lib | Bin 842536 -> 831240 bytes lib/SDL2/lib/x64_2015/SDL2.lib | Bin 113700 -> 0 bytes lib/SDL2/lib/x64_2015/SDL2main.lib | Bin 47376 -> 0 bytes lib/SDL2/lib/x86/SDL2.lib | Bin 116400 -> 120400 bytes lib/SDL2/lib/x86/SDL2main.lib | Bin 40536 -> 37594 bytes lib/SDL2/lib/x86/SDL2test.lib | Bin 821670 -> 820224 bytes lib/SDL2/lib/x86_2015/SDL2.lib | Bin 116400 -> 0 bytes lib/SDL2/lib/x86_2015/SDL2main.lib | Bin 44258 -> 0 bytes 84 files changed, 18740 insertions(+), 13815 deletions(-) delete mode 100644 lib/SDL2/bin/x64_2015/SDL2.dll delete mode 100644 lib/SDL2/bin/x86_2015/SDL2.dll create mode 100644 lib/SDL2/include/SDL_egl.h create mode 100644 lib/SDL2/include/SDL_opengl_glext.h create mode 100644 lib/SDL2/include/SDL_opengles2_gl2.h create mode 100644 lib/SDL2/include/SDL_opengles2_gl2ext.h create mode 100644 lib/SDL2/include/SDL_opengles2_gl2platform.h create mode 100644 lib/SDL2/include/SDL_opengles2_khrplatform.h delete mode 100644 lib/SDL2/lib/x64_2015/SDL2.lib delete mode 100644 lib/SDL2/lib/x64_2015/SDL2main.lib delete mode 100644 lib/SDL2/lib/x86_2015/SDL2.lib delete mode 100644 lib/SDL2/lib/x86_2015/SDL2main.lib diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 9005aa53ff..923b7003f3 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -70,22 +70,17 @@ if(BuildSPEngine OR BuildJK2SPEngine) endif() if(UseInternalSDL2) - if(MSVC14) - set(MSVC_SUFFIX "_2015") - else() - set(MSVC_SUFFIX "") - endif() if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(SPEngineLibraries ${SPEngineLibraries} - ${OpenJKLibDir}/SDL2/lib/x86${MSVC_SUFFIX}/SDL2main.lib - ${OpenJKLibDir}/SDL2/lib/x86${MSVC_SUFFIX}/SDL2.lib + ${OpenJKLibDir}/SDL2/lib/x86/SDL2main.lib + ${OpenJKLibDir}/SDL2/lib/x86/SDL2.lib ) else() set(SPEngineLibraries ${SPEngineLibraries} - ${OpenJKLibDir}/SDL2/lib/x64${MSVC_SUFFIX}/SDL2main.lib - ${OpenJKLibDir}/SDL2/lib/x64${MSVC_SUFFIX}/SDL2.lib + ${OpenJKLibDir}/SDL2/lib/x64/SDL2main.lib + ${OpenJKLibDir}/SDL2/lib/x64/SDL2.lib ) endif() @@ -380,11 +375,11 @@ if(BuildSPEngine OR BuildJK2SPEngine) if(UseInternalSDL2) if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(SPEngineExtraInstallFiles - ${OpenJKLibDir}/SDL2/bin/x86${MSVC_SUFFIX}/SDL2.dll + ${OpenJKLibDir}/SDL2/bin/x86/SDL2.dll ) else() set(SPEngineExtraInstallFiles - ${OpenJKLibDir}/SDL2/bin/x64${MSVC_SUFFIX}/SDL2.dll + ${OpenJKLibDir}/SDL2/bin/x64/SDL2.dll ) endif() endif() diff --git a/codemp/CMakeLists.txt b/codemp/CMakeLists.txt index 8231ec757f..7597f21c9d 100644 --- a/codemp/CMakeLists.txt +++ b/codemp/CMakeLists.txt @@ -374,22 +374,17 @@ if(BuildMPEngine) endif() if(UseInternalSDL2) - if(MSVC14) - set(MSVC_SUFFIX "_2015") - else() - set(MSVC_SUFFIX "") - endif() if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(MPEngineLibraries ${MPEngineLibraries} - ${OpenJKLibDir}/SDL2/lib/x86${MSVC_SUFFIX}/SDL2main.lib - ${OpenJKLibDir}/SDL2/lib/x86${MSVC_SUFFIX}/SDL2.lib + ${OpenJKLibDir}/SDL2/lib/x86/SDL2main.lib + ${OpenJKLibDir}/SDL2/lib/x86/SDL2.lib ) else() set(MPEngineLibraries ${MPEngineLibraries} - ${OpenJKLibDir}/SDL2/lib/x64${MSVC_SUFFIX}/SDL2main.lib - ${OpenJKLibDir}/SDL2/lib/x64${MSVC_SUFFIX}/SDL2.lib + ${OpenJKLibDir}/SDL2/lib/x64/SDL2main.lib + ${OpenJKLibDir}/SDL2/lib/x64/SDL2.lib ) endif() @@ -562,11 +557,11 @@ if(BuildMPEngine) if(UseInternalSDL2) if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(MPEngineExtraInstallFiles - ${OpenJKLibDir}/SDL2/bin/x86${MSVC_SUFFIX}/SDL2.dll + ${OpenJKLibDir}/SDL2/bin/x86/SDL2.dll ) else() set(MPEngineExtraInstallFiles - ${OpenJKLibDir}/SDL2/bin/x64${MSVC_SUFFIX}/SDL2.dll + ${OpenJKLibDir}/SDL2/bin/x64/SDL2.dll ) endif() endif() diff --git a/lib/SDL2/bin/x64_2015/SDL2.dll b/lib/SDL2/bin/x64_2015/SDL2.dll deleted file mode 100644 index 7a5ff8a665bbadb5a7466cd83387d5532c7e66c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 942592 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 z�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

  • -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